- Interactable.dropzone([options])⚓➭ + Interactable.dropzone([options])⚓➭ @@ -433,7 +433,7 @@ Parameters - interact.dynamicDrop([newValue])⚓➭ + interact.dynamicDrop([newValue])⚓➭ @@ -497,7 +497,7 @@ Parameters - Interactable.resizable([options])⚓➭ + Interactable.resizable([options])⚓➭ @@ -638,7 +638,7 @@ Parameters - Interactable.gesturable([options])⚓➭ + Interactable.gesturable([options])⚓➭ @@ -758,7 +758,7 @@ Parameters - Interactable⚓➭ + Interactable⚓➭ @@ -783,7 +783,7 @@ Interactable - Interactable.getRect([element])⚓➭ + Interactable.getRect([element])⚓➭ @@ -888,7 +888,7 @@ Parameters - Interactable.rectChecker([checker])⚓➭ + Interactable.rectChecker([checker])⚓➭ @@ -951,7 +951,7 @@ Parameters - Interactable.origin(…)⚓➭ + Interactable.origin(…)⚓➭ @@ -1041,7 +1041,7 @@ Parameters - Interactable.deltaSource([newValue])⚓➭ + Interactable.deltaSource([newValue])⚓➭ @@ -1104,7 +1104,7 @@ Parameters - Interactable.context()⚓➭ + Interactable.context()⚓➭ @@ -1146,7 +1146,7 @@ Interactable.context() - Interactable.fire(iEvent)⚓➭ + Interactable.fire(iEvent)⚓➭ @@ -1207,7 +1207,7 @@ Parameters - Interactable.on(eventType, listener, [options])⚓➭ + Interactable.on(eventType, listener, [options])⚓➭ @@ -1273,7 +1273,7 @@ Parameters - Interactable.off(eventType, listener, [options])⚓➭ + Interactable.off(eventType, listener, [options])⚓➭ @@ -1339,7 +1339,7 @@ Parameters - Interactable.set(options)⚓➭ + Interactable.set(options)⚓➭ @@ -1399,7 +1399,7 @@ Parameters - Interactable.unset()⚓➭ + Interactable.unset()⚓➭ @@ -1442,7 +1442,7 @@ Interactable.unset() - Interactable.actionChecker([checker])⚓➭ + Interactable.actionChecker([checker])⚓➭ @@ -1542,7 +1542,7 @@ Parameters - Interactable.styleCursor([newValue])⚓➭ + Interactable.styleCursor([newValue])⚓➭ @@ -1605,7 +1605,7 @@ Parameters - interact.maxInteractions([newValue])⚓➭ + interact.maxInteractions([newValue])⚓➭ @@ -1652,7 +1652,7 @@ Parameters - Interactable.preventDefault([newValue])⚓➭ + Interactable.preventDefault([newValue])⚓➭ @@ -1718,7 +1718,7 @@ Parameters - interact(element)⚓➭ + interact(element)⚓➭ @@ -1821,7 +1821,7 @@ Usage - interact.isSet(element)⚓➭ + interact.isSet(element)⚓➭ @@ -1881,7 +1881,7 @@ Parameters - interact.on(type, listener, [options])⚓➭ + interact.on(type, listener, [options])⚓➭ @@ -1948,7 +1948,7 @@ Parameters - interact.off(type, listener, [options])⚓➭ + interact.off(type, listener, [options])⚓➭ @@ -2014,7 +2014,7 @@ Parameters - interact.debug()⚓➭ + interact.debug()⚓➭ @@ -2056,7 +2056,7 @@ interact.debug() - interact.supportsTouch()⚓➭ + interact.supportsTouch()⚓➭ @@ -2097,7 +2097,7 @@ interact.supportsTouch() - interact.supportsPointerEvent()⚓➭ + interact.supportsPointerEvent()⚓➭ @@ -2138,7 +2138,7 @@ interact.supportsPointerEvent() - interact.stop(event)⚓➭ + interact.stop(event)⚓➭ @@ -2198,7 +2198,7 @@ Parameters - interact.pointerMoveTolerance([newValue])⚓➭ + interact.pointerMoveTolerance([newValue])⚓➭ @@ -2261,7 +2261,7 @@ Parameters - Interaction.start(action, target, element)⚓➭ + Interaction.start(action, target, element)⚓➭ @@ -2356,7 +2356,7 @@ Parameters - Interaction.doMove()⚓➭ + Interaction.doMove()⚓➭ @@ -2403,7 +2403,7 @@ Interaction.doMove() - Interaction.end([event])⚓➭ + Interaction.end([event])⚓➭ diff --git a/dist/interact.js b/dist/interact.js index e8ae35c3b..c78a3c751 100644 --- a/dist/interact.js +++ b/dist/interact.js @@ -1,5 +1,5 @@ /** - * interact.js v1.3.0-alpha.3+sha.9595c40 + * interact.js v1.3.0-alpha.4+sha.7970416-dirty * * Copyright (c) 2012-2017 Taye Adeyemi * Open source under the MIT License. @@ -816,6 +816,7 @@ var scope = require('./scope'); var utils = require('./utils'); var events = require('./utils/events'); var browser = require('./utils/browser'); +var domObjects = require('./utils/domObjects'); var finder = require('./utils/interactionFinder'); var signals = require('./utils/Signals').new(); @@ -829,7 +830,9 @@ var prevTouchTime = 0; scope.interactions = []; var Interaction = function () { - function Interaction() { + function Interaction(_ref) { + var pointerType = _ref.pointerType; + _classCallCheck(this, Interaction); this.target = null; // current interactable being interacted with @@ -886,7 +889,7 @@ var Interaction = function () { this.pointerWasMoved = false; this._interacting = false; - this.mouse = false; + this.pointerType = pointerType; signals.fire('new', this); @@ -1130,6 +1133,11 @@ var Interaction = function () { }; Interaction.prototype.getPointerIndex = function getPointerIndex(pointer) { + // mouse and pen interactions may have only one pointer + if (this.pointerType === 'mouse' || this.pointerType === 'pen') { + return 0; + } + return utils.indexOf(this.pointerIds, utils.getPointerId(pointer)); }; @@ -1161,8 +1169,7 @@ var Interaction = function () { }; Interaction.prototype.removePointer = function removePointer(pointer, event) { - var id = utils.getPointerId(pointer); - var index = this.mouse ? 0 : utils.indexOf(this.pointerIds, id); + var index = this.getPointerIndex(pointer); if (index === -1) { return; @@ -1197,6 +1204,8 @@ for (var i = 0, len = methodNames.length; i < len; i++) { function doOnInteractions(method) { return function (event) { + var pointerType = utils.getPointerType(event); + var _utils$getEventTarget = utils.getEventTargets(event), eventTarget = _utils$getEventTarget[0], curEventTarget = _utils$getEventTarget[1]; @@ -1210,7 +1219,7 @@ function doOnInteractions(method) { var pointer = event.changedTouches[_i]; var interaction = finder.search(pointer, event.type, eventTarget); - matches.push([pointer, interaction || new Interaction()]); + matches.push([pointer, interaction || new Interaction({ pointerType: pointerType })]); } } else { var invalidPointer = false; @@ -1218,7 +1227,7 @@ function doOnInteractions(method) { if (!browser.supportsPointerEvent && /mouse/.test(event.type)) { // ignore mouse events while touch interactions are active for (var _i2 = 0; _i2 < scope.interactions.length && !invalidPointer; _i2++) { - invalidPointer = !scope.interactions[_i2].mouse && scope.interactions[_i2].pointerIsDown; + invalidPointer = scope.interactions[_i2].pointerType !== 'mouse' && scope.interactions[_i2].pointerIsDown; } // try to ignore mouse events that are simulated by the browser @@ -1232,11 +1241,7 @@ function doOnInteractions(method) { var _interaction = finder.search(event, event.type, eventTarget); if (!_interaction) { - - _interaction = new Interaction(); - _interaction.mouse = /mouse/i.test(event.pointerType || event.type) - // MSPointerEvent.MSPOINTER_TYPE_MOUSE - || event.pointerType === 4 || !event.pointerType; + _interaction = new Interaction({ pointerType: pointerType }); } matches.push([event, _interaction]); @@ -1244,20 +1249,20 @@ function doOnInteractions(method) { } for (var _iterator = matches, _isArray = Array.isArray(_iterator), _i3 = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { - var _ref; + var _ref2; if (_isArray) { if (_i3 >= _iterator.length) break; - _ref = _iterator[_i3++]; + _ref2 = _iterator[_i3++]; } else { _i3 = _iterator.next(); if (_i3.done) break; - _ref = _i3.value; + _ref2 = _i3.value; } - var _ref2 = _ref, - _pointer = _ref2[0], - _interaction2 = _ref2[1]; + var _ref3 = _ref2, + _pointer = _ref3[0], + _interaction2 = _ref3[1]; _interaction2._updateEventTargets(eventTarget, curEventTarget); _interaction2[method](_pointer, event, eventTarget, curEventTarget); @@ -1277,7 +1282,7 @@ function endAll(event) { var docEvents = {/* 'eventType': listenerFunc */}; var pEventTypes = browser.pEventTypes; -if (scope.PointerEvent) { +if (domObjects.PointerEvent) { docEvents[pEventTypes.down] = listeners.pointerDown; docEvents[pEventTypes.move] = listeners.pointerMove; docEvents[pEventTypes.up] = listeners.pointerUp; @@ -1295,8 +1300,8 @@ if (scope.PointerEvent) { docEvents.blur = endAll; -function onDocSignal(_ref3, signalName) { - var doc = _ref3.doc; +function onDocSignal(_ref4, signalName) { + var doc = _ref4.doc; var eventMethod = signalName.indexOf('add') === 0 ? events.add : events.remove; @@ -1311,14 +1316,14 @@ function onDocSignal(_ref3, signalName) { } } -signals.on('update-pointer-down', function (_ref4) { - var interaction = _ref4.interaction, - pointer = _ref4.pointer, - pointerId = _ref4.pointerId, - pointerIndex = _ref4.pointerIndex, - event = _ref4.event, - eventTarget = _ref4.eventTarget, - down = _ref4.down; +signals.on('update-pointer-down', function (_ref5) { + var interaction = _ref5.interaction, + pointer = _ref5.pointer, + pointerId = _ref5.pointerId, + pointerIndex = _ref5.pointerIndex, + event = _ref5.event, + eventTarget = _ref5.eventTarget, + down = _ref5.down; interaction.pointerIds[pointerIndex] = pointerId; interaction.pointers[pointerIndex] = pointer; @@ -1355,7 +1360,7 @@ scope.endAllInteractions = endAll; module.exports = Interaction; -},{"./scope":34,"./utils":44,"./utils/Signals":35,"./utils/browser":37,"./utils/events":40,"./utils/interactionFinder":45}],6:[function(require,module,exports){ +},{"./scope":34,"./utils":44,"./utils/Signals":35,"./utils/browser":37,"./utils/domObjects":38,"./utils/events":40,"./utils/interactionFinder":45}],6:[function(require,module,exports){ 'use strict'; var Interaction = require('../Interaction'); @@ -5460,7 +5465,7 @@ module.exports = function () { this.originalEvent = event; this.type = type; this.pointerId = pointerUtils.getPointerId(pointer); - this.pointerType = pointerUtils.getPointerType(pointer, interaction); + this.pointerType = pointerUtils.getPointerType(pointer); this.target = eventTarget; this.currentTarget = null; @@ -5758,8 +5763,10 @@ Interaction.signals.on('down', function (_ref6) { timer.duration = minDuration; timer.timeout = setTimeout(function () { fire({ - interaction: interaction, eventCopy: eventCopy, eventTarget: eventTarget, + interaction: interaction, + eventTarget: eventTarget, pointer: browser.isIE8 ? eventCopy : pointer, + event: eventCopy, type: 'hold' }); }, minDuration); @@ -6946,17 +6953,14 @@ module.exports = utils; var scope = require('../scope'); var utils = require('./index'); -var browser = require('./browser'); var finder = { - methodOrder: ['simulationResume', 'mouse', 'hasPointer', 'idle'], + methodOrder: ['simulationResume', 'mouseOrPen', 'hasPointer', 'idle'], search: function search(pointer, eventType, eventTarget) { - var mouseEvent = /mouse/i.test(pointer.pointerType || eventType) - // MSPointerEvent.MSPOINTER_TYPE_MOUSE - || pointer.pointerType === 4; + var pointerType = utils.getPointerType(pointer); var pointerId = utils.getPointerId(pointer); - var details = { pointer: pointer, pointerId: pointerId, mouseEvent: mouseEvent, eventType: eventType, eventTarget: eventTarget }; + var details = { pointer: pointer, pointerId: pointerId, pointerType: pointerType, eventType: eventType, eventTarget: eventTarget }; for (var _iterator = finder.methodOrder, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { var _ref; @@ -6982,7 +6986,7 @@ var finder = { // try to resume simulation with a new pointer simulationResume: function simulationResume(_ref2) { - var mouseEvent = _ref2.mouseEvent, + var pointerType = _ref2.pointerType, eventType = _ref2.eventType, eventTarget = _ref2.eventTarget; @@ -7006,7 +7010,7 @@ var finder = { var element = eventTarget; - if (interaction.simulation && interaction.simulation.allowResume && interaction.mouse === mouseEvent) { + if (interaction.simulation && interaction.simulation.allowResume && interaction.pointerType === pointerType) { while (element) { // if the element is the interaction element if (element === interaction.element) { @@ -7020,13 +7024,13 @@ var finder = { return null; }, - // if it's a mouse interaction - mouse: function mouse(_ref4) { + // if it's a mouse or pen interaction + mouseOrPen: function mouseOrPen(_ref4) { var pointerId = _ref4.pointerId, - mouseEvent = _ref4.mouseEvent, + pointerType = _ref4.pointerType, eventType = _ref4.eventType; - if (!mouseEvent && (browser.supportsTouch || browser.supportsPointerEvent)) { + if (pointerType !== 'mouse' && pointerType !== 'pen') { return null; } @@ -7046,7 +7050,7 @@ var finder = { var interaction = _ref5; - if (interaction.mouse) { + if (interaction.pointerType === pointerType) { // if it's a down event, skip interactions with running simulations if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; @@ -7069,8 +7073,8 @@ var finder = { return firstNonActive; } - // Find any interaction specifically for mouse. - // ignore the interaction if the eventType is a mousedown, and a simulation + // find any mouse or pen interaction. + // ignore the interaction if the eventType is a *down, and a simulation // is active for (var _iterator4 = scope.interactions, _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) { var _ref6; @@ -7086,7 +7090,7 @@ var finder = { var _interaction = _ref6; - if (_interaction.mouse && !(/down/.test(eventType) && _interaction.simulation)) { + if (_interaction.pointerType === pointerType && !(/down/i.test(eventType) && _interaction.simulation)) { return _interaction; } } @@ -7118,9 +7122,9 @@ var finder = { } }, - // get first idle interaction + // get first idle interaction with a matching pointerType idle: function idle(_ref9) { - var mouseEvent = _ref9.mouseEvent; + var pointerType = _ref9.pointerType; for (var _iterator6 = scope.interactions, _isArray6 = Array.isArray(_iterator6), _i6 = 0, _iterator6 = _isArray6 ? _iterator6 : _iterator6[Symbol.iterator]();;) { var _ref10; @@ -7150,7 +7154,7 @@ var finder = { continue; } - if (!interaction.interacting() && mouseEvent === interaction.mouse) { + if (!interaction.interacting() && pointerType === interaction.pointerType) { return interaction; } } @@ -7161,7 +7165,7 @@ var finder = { module.exports = finder; -},{"../scope":34,"./browser":37,"./index":44}],46:[function(require,module,exports){ +},{"../scope":34,"./index":44}],46:[function(require,module,exports){ 'use strict'; var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; @@ -7262,6 +7266,7 @@ var hypot = require('./hypot'); var browser = require('./browser'); var dom = require('./domObjects'); var domUtils = require('./domUtils'); +var domObjects = require('./domObjects'); var is = require('./is'); var pointerExtend = require('./pointerExtend'); @@ -7468,17 +7473,11 @@ var pointerUtils = { return angle; }, - getPointerType: function getPointerType(pointer, interaction) { - // if the PointerEvent API isn't available, then the pointer must be ither - // a MouseEvent or TouchEvent - if (interaction.mouse) { - return 'mouse'; - } - if (!browser.supportsPointerEvent) { - return 'touch'; - } - - return is.string(pointer.pointerType) ? pointer.pointerType : [undefined, undefined, 'touch', 'pen', 'mouse'][pointer.pointerType]; + getPointerType: function getPointerType(pointer) { + return is.string(pointer.pointerType) ? pointer.pointerType : is.number(pointer.pointerType) ? [undefined, undefined, 'touch', 'pen', 'mouse'][pointer.pointerType] + // if the PointerEvent API isn't available, then the "pointer" must + // be either a MouseEvent, TouchEvent, or Touch object + : /touch/.test(pointer.type) || pointer instanceof domObjects.Touch ? 'touch' : 'mouse'; }, // [ event.target, event.currentTarget ] diff --git a/dist/interact.js.map b/dist/interact.js.map index 60832b766..4f3a62ba8 100644 --- a/dist/interact.js.map +++ b/dist/interact.js.map @@ -1 +1 @@ -{"version":3,"sources":["src/header.js","node_modules/browser-pack/_prelude.js","index.js","src/Eventable.js","src/InteractEvent.js","src/Interactable.js","src/Interaction.js","src/actions/base.js","src/actions/drag.js","src/actions/drop.js","src/actions/gesture.js","src/actions/resize.js","src/autoScroll.js","src/autoStart/InteractableMethods.js","src/autoStart/base.js","src/autoStart/delay.js","src/autoStart/drag.js","src/autoStart/gesture.js","src/autoStart/resize.js","src/defaultOptions.js","src/index.js","src/inertia.js","src/interact.js","src/interactablePreventDefault.js","src/legacyBrowsers.js","src/modifiers/index.js","src/modifiers/restrict.js","src/modifiers/restrictEdges.js","src/modifiers/restrictSize.js","src/modifiers/snap.js","src/modifiers/snapSize.js","src/pointerEvents/PointerEvent.js","src/pointerEvents/base.js","src/pointerEvents/holdRepeat.js","src/pointerEvents/interactableTargets.js","src/scope.js","src/utils/Signals.js","src/utils/arr.js","src/utils/browser.js","src/utils/domObjects.js","src/utils/domUtils.js","src/utils/events.js","src/utils/extend.js","src/utils/getOriginXY.js","src/utils/hypot.js","src/utils/index.js","src/utils/interactionFinder.js","src/utils/is.js","src/utils/isWindow.js","src/utils/pointerExtend.js","src/utils/pointerUtils.js","src/utils/raf.js","src/utils/rect.js","src/utils/window.js"],"names":[],"mappings":"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","file":"interact.js","sourceRoot":"","sourcesContent":["/**\n * interact.js v1.3.0-alpha.3+sha.9595c40\n *\n * Copyright (c) 2012-2017 Taye Adeyemi \n * Open source under the MIT License.\n * https://raw.github.com/taye/interact.js/master/LICENSE\n */\n","(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o 150) {\n return null;\n }\n\n let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI;\n const overlap = 22.5;\n\n if (angle < 0) {\n angle += 360;\n }\n\n const left = 135 - overlap <= angle && angle < 225 + overlap;\n const up = 225 - overlap <= angle && angle < 315 + overlap;\n\n const right = !left && (315 - overlap <= angle || angle < 45 + overlap);\n const down = !up && 45 - overlap <= angle && angle < 135 + overlap;\n\n return {\n up,\n down,\n left,\n right,\n angle,\n speed: interaction.prevEvent.speed,\n velocity: {\n x: interaction.prevEvent.velocityX,\n y: interaction.prevEvent.velocityY,\n },\n };\n }\n\n preventDefault () {}\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n}\n\nsignals.on('set-delta', function ({ iEvent, interaction, starting, deltaSource }) {\n const prevEvent = starting? iEvent : interaction.prevEvent;\n\n if (deltaSource === 'client') {\n iEvent.dx = iEvent.clientX - prevEvent.clientX;\n iEvent.dy = iEvent.clientY - prevEvent.clientY;\n }\n else {\n iEvent.dx = iEvent.pageX - prevEvent.pageX;\n iEvent.dy = iEvent.pageY - prevEvent.pageY;\n }\n});\n\nInteractEvent.signals = signals;\n\nmodule.exports = InteractEvent;\n","const is = require('./utils/is');\nconst events = require('./utils/events');\nconst extend = require('./utils/extend');\nconst actions = require('./actions/base');\nconst scope = require('./scope');\nconst Eventable = require('./Eventable');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nconst {\n getElementRect,\n nodeContains,\n trySelector,\n} = require('./utils/domUtils');\nconst { getWindow } = require('./utils/window');\nconst { indexOf, contains } = require('./utils/arr');\nconst { wheelEvent } = require('./utils/browser');\n\n// all set interactables\nscope.interactables = [];\n\n/*\\\n * Interactable\n [ property ]\n **\n * Object type returned by @interact\n\\*/\nclass Interactable {\n constructor (target, options) {\n options = options || {};\n\n this.target = target;\n this.events = new Eventable();\n this._context = options.context || scope.document;\n this._win = getWindow(trySelector(target)? this._context : target);\n this._doc = this._win.document;\n\n signals.fire('new', {\n target,\n options,\n interactable: this,\n win: this._win,\n });\n\n scope.addDocument( this._doc, this._win );\n\n scope.interactables.push(this);\n\n this.set(options);\n }\n\n setOnEvents (action, phases) {\n const onAction = 'on' + action;\n\n if (is.function(phases.onstart) ) { this.events[onAction + 'start' ] = phases.onstart ; }\n if (is.function(phases.onmove) ) { this.events[onAction + 'move' ] = phases.onmove ; }\n if (is.function(phases.onend) ) { this.events[onAction + 'end' ] = phases.onend ; }\n if (is.function(phases.oninertiastart)) { this.events[onAction + 'inertiastart' ] = phases.oninertiastart ; }\n\n return this;\n }\n\n setPerAction (action, options) {\n // for all the default per-action options\n for (const option in options) {\n // if this option exists for this action\n if (option in defaults[action]) {\n // if the option in the options arg is an object value\n if (is.object(options[option])) {\n // duplicate the object\n this.options[action][option] = extend(this.options[action][option] || {}, options[option]);\n\n if (is.object(defaults.perAction[option]) && 'enabled' in defaults.perAction[option]) {\n this.options[action][option].enabled = options[option].enabled === false? false : true;\n }\n }\n else if (is.bool(options[option]) && is.object(defaults.perAction[option])) {\n this.options[action][option].enabled = options[option];\n }\n else if (options[option] !== undefined) {\n // or if it's not undefined, do a plain assignment\n this.options[action][option] = options[option];\n }\n }\n }\n }\n\n /*\\\n * Interactable.getRect\n [ method ]\n *\n * The default function to get an Interactables bounding rect. Can be\n * overridden using @Interactable.rectChecker.\n *\n - element (Element) #optional The element to measure.\n = (object) The object's bounding rectangle.\n o {\n o top : 0,\n o left : 0,\n o bottom: 0,\n o right : 0,\n o width : 0,\n o height: 0\n o }\n \\*/\n getRect (element) {\n element = element || this.target;\n\n if (is.string(this.target) && !(is.element(element))) {\n element = this._context.querySelector(this.target);\n }\n\n return getElementRect(element);\n }\n\n /*\\\n * Interactable.rectChecker\n [ method ]\n *\n * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n - checker (function) #optional A function which returns this Interactable's bounding rectangle. See @Interactable.getRect\n = (function | object) The checker function or this Interactable\n \\*/\n rectChecker (checker) {\n if (is.function(checker)) {\n this.getRect = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.getRect;\n\n return this;\n }\n\n return this.getRect;\n }\n\n _backCompatOption (optionName, newValue) {\n if (trySelector(newValue) || is.object(newValue)) {\n this.options[optionName] = newValue;\n\n for (const action of actions.names) {\n this.options[action][optionName] = newValue;\n }\n\n return this;\n }\n\n return this.options[optionName];\n }\n\n /*\\\n * Interactable.origin\n [ method ]\n *\n * Gets or sets the origin of the Interactable's element. The x and y\n * of the origin will be subtracted from action event coordinates.\n *\n - origin (object | string) #optional An object eg. { x: 0, y: 0 } or string 'parent', 'self' or any CSS selector\n * OR\n - origin (Element) #optional An HTML or SVG Element whose rect will be used\n **\n = (object) The current origin or this Interactable\n \\*/\n origin (newValue) {\n return this._backCompatOption('origin', newValue);\n }\n\n /*\\\n * Interactable.deltaSource\n [ method ]\n *\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n - newValue (string) #optional Use 'client' if you will be scrolling while interacting; Use 'page' if you want autoScroll to work\n = (string | object) The current deltaSource or this Interactable\n \\*/\n deltaSource (newValue) {\n if (newValue === 'page' || newValue === 'client') {\n this.options.deltaSource = newValue;\n\n return this;\n }\n\n return this.options.deltaSource;\n }\n\n /*\\\n * Interactable.context\n [ method ]\n *\n * Gets the selector context Node of the Interactable. The default is `window.document`.\n *\n = (Node) The context Node of this Interactable\n **\n \\*/\n context () {\n return this._context;\n }\n\n inContext (element) {\n return (this._context === element.ownerDocument\n || nodeContains(this._context, element));\n }\n\n /*\\\n * Interactable.fire\n [ method ]\n *\n * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n - iEvent (InteractEvent) The InteractEvent object to be fired on this Interactable\n = (Interactable) this Interactable\n \\*/\n fire (iEvent) {\n this.events.fire(iEvent);\n\n return this;\n }\n\n _onOffMultiple (method, eventType, listener, options) {\n if (is.string(eventType) && eventType.search(' ') !== -1) {\n eventType = eventType.trim().split(/ +/);\n }\n\n if (is.array(eventType)) {\n for (let i = 0; i < eventType.length; i++) {\n this[method](eventType[i], listener, options);\n }\n\n return true;\n }\n\n if (is.object(eventType)) {\n for (const prop in eventType) {\n this[method](prop, eventType[prop], listener);\n }\n\n return true;\n }\n }\n\n /*\\\n * Interactable.on\n [ method ]\n *\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n - eventType (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) This Interactable\n \\*/\n on (eventType, listener, options) {\n if (this._onOffMultiple('on', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.on(eventType, listener);\n }\n // delegated event for selector\n else if (is.string(this.target)) {\n events.addDelegate(this.target, this._context, eventType, listener, options);\n }\n else {\n events.add(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.off\n [ method ]\n *\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n - eventType (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) This Interactable\n \\*/\n off (eventType, listener, options) {\n if (this._onOffMultiple('off', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n // if it is an action event type\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.off(eventType, listener);\n }\n // delegated event\n else if (is.string(this.target)) {\n events.removeDelegate(this.target, this._context, eventType, listener, options);\n }\n // remove listener from this Interatable's element\n else {\n events.remove(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.set\n [ method ]\n *\n * Reset the options of this Interactable\n - options (object) The new settings to apply\n = (object) This Interactable\n \\*/\n set (options) {\n if (!is.object(options)) {\n options = {};\n }\n\n this.options = extend({}, defaults.base);\n\n const perActions = extend({}, defaults.perAction);\n\n for (const actionName in actions.methodDict) {\n const methodName = actions.methodDict[actionName];\n\n this.options[actionName] = extend({}, defaults[actionName]);\n\n this.setPerAction(actionName, perActions);\n\n this[methodName](options[actionName]);\n }\n\n for (const setting of Interactable.settingsMethods) {\n this.options[setting] = defaults.base[setting];\n\n if (setting in options) {\n this[setting](options[setting]);\n }\n }\n\n signals.fire('set', {\n options,\n interactable: this,\n });\n\n return this;\n }\n\n /*\\\n * Interactable.unset\n [ method ]\n *\n * Remove this interactable from the list of interactables and remove\n * it's action capabilities and event listeners\n *\n = (object) @interact\n \\*/\n unset () {\n events.remove(this.target, 'all');\n\n if (is.string(this.target)) {\n // remove delegated events\n for (const type in events.delegatedEvents) {\n const delegated = events.delegatedEvents[type];\n\n if (delegated.selectors[0] === this.target\n && delegated.contexts[0] === this._context) {\n\n delegated.selectors.splice(0, 1);\n delegated.contexts .splice(0, 1);\n delegated.listeners.splice(0, 1);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegated[type] = null;\n }\n }\n\n events.remove(this._context, type, events.delegateListener);\n events.remove(this._context, type, events.delegateUseCapture, true);\n }\n }\n else {\n events.remove(this, 'all');\n }\n\n signals.fire('unset', { interactable: this });\n\n scope.interactables.splice(indexOf(scope.interactables, this), 1);\n\n // Stop related interactions when an Interactable is unset\n for (const interaction of scope.interactions || []) {\n if (interaction.target === this && interaction.interacting()) {\n interaction.stop();\n }\n }\n\n return scope.interact;\n }\n}\n\nscope.interactables.indexOfElement = function indexOfElement (target, context) {\n context = context || scope.document;\n\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n if (interactable.target === target && interactable._context === context) {\n return i;\n }\n }\n return -1;\n};\n\nscope.interactables.get = function interactableGet (element, options, dontCheckInContext) {\n const ret = this[this.indexOfElement(element, options && options.context)];\n\n return ret && (is.string(element) || dontCheckInContext || ret.inContext(element))? ret : null;\n};\n\nscope.interactables.forEachSelector = function (callback, element) {\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n // skip non CSS selector targets and out of context elements\n if (!is.string(interactable.target)\n || (element && !interactable.inContext(element))) {\n continue;\n }\n\n const ret = callback(interactable, interactable.target, interactable._context, i, this);\n\n if (ret !== undefined) {\n return ret;\n }\n }\n};\n\n// all interact.js eventTypes\nInteractable.eventTypes = scope.eventTypes = [];\n\nInteractable.signals = signals;\n\nInteractable.settingsMethods = [ 'deltaSource', 'origin', 'preventDefault', 'rectChecker' ];\n\nmodule.exports = Interactable;\n","const scope = require('./scope');\nconst utils = require('./utils');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst finder = require('./utils/interactionFinder');\nconst signals = require('./utils/Signals').new();\n\nconst listeners = {};\nconst methodNames = [\n 'pointerDown', 'pointerMove', 'pointerUp',\n 'updatePointer', 'removePointer',\n];\n\n// for ignoring browser's simulated mouse events\nlet prevTouchTime = 0;\n\n// all active and idle interactions\nscope.interactions = [];\n\nclass Interaction {\n constructor () {\n this.target = null; // current interactable being interacted with\n this.element = null; // the target element of the interactable\n\n this.prepared = { // action that's ready to be fired on next move event\n name : null,\n axis : null,\n edges: null,\n };\n\n // keep track of added pointers\n this.pointers = [];\n this.pointerIds = [];\n this.downTargets = [];\n this.downTimes = [];\n\n // Previous native pointer move event coordinates\n this.prevCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n // current native pointer move event coordinates\n this.curCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Starting InteractEvent pointer coordinates\n this.startCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Change in coordinates and time of the pointer\n this.pointerDelta = {\n page : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n client : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n timeStamp: 0,\n };\n\n this.downEvent = null; // pointerdown/mousedown/touchstart event\n this.downPointer = {};\n\n this._eventTarget = null;\n this._curEventTarget = null;\n\n this.prevEvent = null; // previous action event\n\n this.pointerIsDown = false;\n this.pointerWasMoved = false;\n this._interacting = false;\n\n this.mouse = false;\n\n signals.fire('new', this);\n\n scope.interactions.push(this);\n }\n\n pointerDown (pointer, event, eventTarget) {\n const pointerIndex = this.updatePointer(pointer, event, true);\n\n signals.fire('down', {\n pointer,\n event,\n eventTarget,\n pointerIndex,\n interaction: this,\n });\n }\n\n /*\\\n * Interaction.start\n [ method ]\n *\n * Start an action with the given Interactable and Element as tartgets. The\n * action must be enabled for the target Interactable and an appropriate number\n * of pointers must be held down - 1 for drag/resize, 2 for gesture.\n *\n * Use it with `interactable.able({ manualStart: false })` to always\n * [start actions manually](https://github.com/taye/interact.js/issues/114)\n *\n - action (object) The action to be performed - drag, resize, etc.\n - target (Interactable) The Interactable to target\n - element (Element) The DOM Element to target\n = (object) interact\n **\n | interact(target)\n | .draggable({\n | // disable the default drag start by down->move\n | manualStart: true\n | })\n | // start dragging after the user holds the pointer down\n | .on('hold', function (event) {\n | var interaction = event.interaction;\n |\n | if (!interaction.interacting()) {\n | interaction.start({ name: 'drag' },\n | event.interactable,\n | event.currentTarget);\n | }\n | });\n \\*/\n start (action, target, element) {\n if (this.interacting()\n || !this.pointerIsDown\n || this.pointerIds.length < (action.name === 'gesture'? 2 : 1)) {\n return;\n }\n\n // if this interaction had been removed after stopping\n // add it back\n if (utils.indexOf(scope.interactions, this) === -1) {\n scope.interactions.push(this);\n }\n\n utils.copyAction(this.prepared, action);\n this.target = target;\n this.element = element;\n\n signals.fire('action-start', {\n interaction: this,\n event: this.downEvent,\n });\n }\n\n pointerMove (pointer, event, eventTarget) {\n if (!this.simulation) {\n this.updatePointer(pointer);\n utils.setCoords(this.curCoords, this.pointers);\n }\n\n const duplicateMove = (this.curCoords.page.x === this.prevCoords.page.x\n && this.curCoords.page.y === this.prevCoords.page.y\n && this.curCoords.client.x === this.prevCoords.client.x\n && this.curCoords.client.y === this.prevCoords.client.y);\n\n let dx;\n let dy;\n\n // register movement greater than pointerMoveTolerance\n if (this.pointerIsDown && !this.pointerWasMoved) {\n dx = this.curCoords.client.x - this.startCoords.client.x;\n dy = this.curCoords.client.y - this.startCoords.client.y;\n\n this.pointerWasMoved = utils.hypot(dx, dy) > Interaction.pointerMoveTolerance;\n }\n\n const signalArg = {\n pointer,\n pointerIndex: this.getPointerIndex(pointer),\n event,\n eventTarget,\n dx,\n dy,\n duplicate: duplicateMove,\n interaction: this,\n interactingBeforeMove: this.interacting(),\n };\n\n if (!duplicateMove) {\n // set pointer coordinate, time changes and speeds\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n }\n\n signals.fire('move', signalArg);\n\n if (!duplicateMove) {\n // if interacting, fire an 'action-move' signal etc\n if (this.interacting()) {\n this.doMove(signalArg);\n }\n\n if (this.pointerWasMoved) {\n utils.copyCoords(this.prevCoords, this.curCoords);\n }\n }\n }\n\n /*\\\n * Interaction.doMove\n [ method ]\n *\n * Force a move of the current action at the same coordinates. Useful if\n * snap/restrict has been changed and you want a movement with the new\n * settings.\n *\n **\n | interact(target)\n | .draggable(true)\n | .on('dragmove', function (event) {\n | if (someCondition) {\n | // change the snap settings\n | event.interactable.draggable({ snap: { targets: [] }});\n | // fire another move event with re-calculated snap\n | event.interaction.doMove();\n | }\n | });\n \\*/\n doMove (signalArg) {\n signalArg = utils.extend({\n pointer: this.pointers[0],\n event: this.prevEvent,\n eventTarget: this._eventTarget,\n interaction: this,\n }, signalArg || {});\n\n signals.fire('before-action-move', signalArg);\n\n if (!this._dontFireMove) {\n signals.fire('action-move', signalArg);\n }\n\n this._dontFireMove = false;\n }\n\n // End interact move events and stop auto-scroll unless simulation is running\n pointerUp (pointer, event, eventTarget, curEventTarget) {\n const pointerIndex = this.getPointerIndex(pointer);\n\n signals.fire(/cancel$/i.test(event.type)? 'cancel' : 'up', {\n pointer,\n pointerIndex,\n event,\n eventTarget,\n curEventTarget,\n interaction: this,\n });\n\n if (!this.simulation) {\n this.end(event);\n }\n\n this.pointerIsDown = false;\n this.removePointer(pointer, event);\n }\n\n /*\\\n * Interaction.end\n [ method ]\n *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n - event (PointerEvent) #optional\n **\n | interact(target)\n | .draggable(true)\n | .on('move', function (event) {\n | if (event.pageX > 1000) {\n | // end the current action\n | event.interaction.end();\n | // stop all further listeners from being called\n | event.stopImmediatePropagation();\n | }\n | });\n \\*/\n end (event) {\n event = event || this.prevEvent;\n\n if (this.interacting()) {\n signals.fire('action-end', {\n event,\n interaction: this,\n });\n }\n\n this.stop();\n }\n\n currentAction () {\n return this._interacting? this.prepared.name: null;\n }\n\n interacting () {\n return this._interacting;\n }\n\n stop () {\n signals.fire('stop', { interaction: this });\n\n if (this._interacting) {\n signals.fire('stop-active', { interaction: this });\n signals.fire('stop-' + this.prepared.name, { interaction: this });\n }\n\n this.target = this.element = null;\n\n this._interacting = false;\n this.prepared.name = this.prevEvent = null;\n }\n\n getPointerIndex (pointer) {\n return utils.indexOf(this.pointerIds, utils.getPointerId(pointer));\n }\n\n updatePointer (pointer, event, down = event && /(down|start)$/i.test(event.type)) {\n const id = utils.getPointerId(pointer);\n let index = this.getPointerIndex(pointer);\n\n if (index === -1) {\n index = this.pointerIds.length;\n this.pointerIds[index] = id;\n }\n\n if (down) {\n signals.fire('update-pointer-down', {\n pointer,\n event,\n down,\n pointerId: id,\n pointerIndex: index,\n interaction: this,\n });\n }\n\n this.pointers[index] = pointer;\n\n return index;\n }\n\n removePointer (pointer, event) {\n const id = utils.getPointerId(pointer);\n const index = this.mouse? 0 : utils.indexOf(this.pointerIds, id);\n\n if (index === -1) { return; }\n\n signals.fire('remove-pointer', {\n pointer,\n event,\n pointerIndex: index,\n interaction: this,\n });\n\n this.pointers .splice(index, 1);\n this.pointerIds .splice(index, 1);\n this.downTargets.splice(index, 1);\n this.downTimes .splice(index, 1);\n }\n\n _updateEventTargets (target, currentTarget) {\n this._eventTarget = target;\n this._curEventTarget = currentTarget;\n }\n}\n\nfor (let i = 0, len = methodNames.length; i < len; i++) {\n const method = methodNames[i];\n\n listeners[method] = doOnInteractions(method);\n}\n\nfunction doOnInteractions (method) {\n return (function (event) {\n const [eventTarget, curEventTarget] = utils.getEventTargets(event);\n const matches = []; // [ [pointer, interaction], ...]\n\n if (browser.supportsTouch && /touch/.test(event.type)) {\n prevTouchTime = new Date().getTime();\n\n for (let i = 0; i < event.changedTouches.length; i++) {\n const pointer = event.changedTouches[i];\n const interaction = finder.search(pointer, event.type, eventTarget);\n\n matches.push([pointer, interaction || new Interaction()]);\n }\n }\n else {\n let invalidPointer = false;\n\n if (!browser.supportsPointerEvent && /mouse/.test(event.type)) {\n // ignore mouse events while touch interactions are active\n for (let i = 0; i < scope.interactions.length && !invalidPointer; i++) {\n invalidPointer = !scope.interactions[i].mouse && scope.interactions[i].pointerIsDown;\n }\n\n // try to ignore mouse events that are simulated by the browser\n // after a touch event\n invalidPointer = invalidPointer\n || (new Date().getTime() - prevTouchTime < 500)\n // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated\n || event.timeStamp === 0;\n }\n\n if (!invalidPointer) {\n let interaction = finder.search(event, event.type, eventTarget);\n\n if (!interaction) {\n\n interaction = new Interaction();\n interaction.mouse = (/mouse/i.test(event.pointerType || event.type)\n // MSPointerEvent.MSPOINTER_TYPE_MOUSE\n || event.pointerType === 4\n || !event.pointerType);\n }\n\n matches.push([event, interaction]);\n }\n }\n\n for (const [pointer, interaction] of matches) {\n interaction._updateEventTargets(eventTarget, curEventTarget);\n interaction[method](pointer, event, eventTarget, curEventTarget);\n }\n });\n}\n\nfunction endAll (event) {\n for (let i = 0; i < scope.interactions.length; i++) {\n const interaction = scope.interactions[i];\n\n interaction.end(event);\n signals.fire('endall', { event, interaction });\n }\n}\n\nconst docEvents = { /* 'eventType': listenerFunc */ };\nconst pEventTypes = browser.pEventTypes;\n\nif (scope.PointerEvent) {\n docEvents[pEventTypes.down ] = listeners.pointerDown;\n docEvents[pEventTypes.move ] = listeners.pointerMove;\n docEvents[pEventTypes.up ] = listeners.pointerUp;\n docEvents[pEventTypes.cancel] = listeners.pointerUp;\n}\nelse {\n docEvents.mousedown = listeners.pointerDown;\n docEvents.mousemove = listeners.pointerMove;\n docEvents.mouseup = listeners.pointerUp;\n\n docEvents.touchstart = listeners.pointerDown;\n docEvents.touchmove = listeners.pointerMove;\n docEvents.touchend = listeners.pointerUp;\n docEvents.touchcancel = listeners.pointerUp;\n}\n\ndocEvents.blur = endAll;\n\nfunction onDocSignal ({ doc }, signalName) {\n const eventMethod = signalName.indexOf('add') === 0\n ? events.add : events.remove;\n\n // delegate event listener\n for (const eventType in scope.delegatedEvents) {\n eventMethod(doc, eventType, events.delegateListener);\n eventMethod(doc, eventType, events.delegateUseCapture, true);\n }\n\n for (const eventType in docEvents) {\n eventMethod(doc, eventType, docEvents[eventType]);\n }\n}\n\nsignals.on('update-pointer-down', ({ interaction, pointer, pointerId, pointerIndex, event, eventTarget, down }) => {\n interaction.pointerIds[pointerIndex] = pointerId;\n interaction.pointers[pointerIndex] = pointer;\n\n if (down) {\n interaction.pointerIsDown = true;\n }\n\n if (!interaction.interacting()) {\n utils.setCoords(interaction.startCoords, interaction.pointers);\n\n utils.copyCoords(interaction.curCoords , interaction.startCoords);\n utils.copyCoords(interaction.prevCoords, interaction.startCoords);\n\n interaction.downEvent = event;\n interaction.downTimes[pointerIndex] = interaction.curCoords.timeStamp;\n interaction.downTargets[pointerIndex] = eventTarget || event && utils.getEventTargets(event)[0];\n interaction.pointerWasMoved = false;\n\n utils.pointerExtend(interaction.downPointer, pointer);\n }\n});\n\nscope.signals.on('add-document' , onDocSignal);\nscope.signals.on('remove-document', onDocSignal);\n\nInteraction.pointerMoveTolerance = 1;\nInteraction.doOnInteractions = doOnInteractions;\nInteraction.endAll = endAll;\nInteraction.signals = signals;\nInteraction.docEvents = docEvents;\n\nscope.endAllInteractions = endAll;\n\nmodule.exports = Interaction;\n","const Interaction = require('../Interaction');\nconst InteractEvent = require('../InteractEvent');\n\nconst actions = {\n firePrepared,\n names: [],\n methodDict: {},\n};\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n interaction._interacting = true;\n firePrepared(interaction, event, 'start');\n});\n\nInteraction.signals.on('action-move', function ({ interaction, event, preEnd }) {\n firePrepared(interaction, event, 'move', preEnd);\n\n // if the action was ended in a listener\n if (!interaction.interacting()) { return false; }\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n firePrepared(interaction, event, 'end');\n});\n\nfunction firePrepared (interaction, event, phase, preEnd) {\n const actionName = interaction.prepared.name;\n\n const newEvent = new InteractEvent(interaction, event, actionName, phase, interaction.element, null, preEnd);\n\n interaction.target.fire(newEvent);\n interaction.prevEvent = newEvent;\n}\n\nmodule.exports = actions;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drag = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n startAxis : 'xy',\n lockAxis : 'xy',\n },\n\n checker: function (pointer, event, interactable) {\n const dragOptions = interactable.options.drag;\n\n return dragOptions.enabled\n ? { name: 'drag', axis: (dragOptions.lockAxis === 'start'\n ? dragOptions.startAxis\n : dragOptions.lockAxis)}\n : null;\n },\n\n getCursor: function () {\n return 'move';\n },\n};\n\nInteraction.signals.on('before-action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n interaction.curCoords.page.y = interaction.startCoords.page.y;\n interaction.curCoords.client.y = interaction.startCoords.client.y;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vx);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vx);\n interaction.pointerDelta.client.vy = 0;\n interaction.pointerDelta.page.vy = 0;\n }\n else if (axis === 'y') {\n interaction.curCoords.page.x = interaction.startCoords.page.x;\n interaction.curCoords.client.x = interaction.startCoords.client.x;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vy);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vy);\n interaction.pointerDelta.client.vx = 0;\n interaction.pointerDelta.page.vx = 0;\n }\n});\n\n// dragmove\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'dragmove') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n iEvent.pageY = interaction.startCoords.page.y;\n iEvent.clientY = interaction.startCoords.client.y;\n iEvent.dy = 0;\n }\n else if (axis === 'y') {\n iEvent.pageX = interaction.startCoords.page.x;\n iEvent.clientX = interaction.startCoords.client.x;\n iEvent.dx = 0;\n }\n});\n\n/*\\\n * Interactable.draggable\n [ method ]\n *\n * Gets or sets whether drag actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of drag events\n | var isDraggable = interact('ul li').draggable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on drag events (object makes the Interactable draggable)\n = (object) This Interactable\n | interact(element).draggable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // the axis in which the first movement must be\n | // for the drag sequence to start\n | // 'xy' by default - any direction\n | startAxis: 'x' || 'y' || 'xy',\n |\n | // 'xy' by default - don't restrict to one axis (move in any direction)\n | // 'x' or 'y' to restrict movement to either axis\n | // 'start' to restrict movement to the axis the drag started in\n | lockAxis: 'x' || 'y' || 'xy' || 'start',\n |\n | // max number of drags that can happen concurrently\n | // with elements of this Interactable. Infinity by default\n | max: Infinity,\n |\n | // max number of drags that can target the same element+Interactable\n | // 1 by default\n | maxPerElement: 2\n | });\n\\*/\nInteractable.prototype.draggable = function (options) {\n if (utils.is.object(options)) {\n this.options.drag.enabled = options.enabled === false? false: true;\n this.setPerAction('drag', options);\n this.setOnEvents('drag', options);\n\n if (/^(xy|x|y|start)$/.test(options.lockAxis)) {\n this.options.drag.lockAxis = options.lockAxis;\n }\n if (/^(xy|x|y)$/.test(options.startAxis)) {\n this.options.drag.startAxis = options.startAxis;\n }\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drag.enabled = options;\n\n if (!options) {\n this.ondragstart = this.ondragstart = this.ondragend = null;\n }\n\n return this;\n }\n\n return this.options.drag;\n};\n\nactions.drag = drag;\nactions.names.push('drag');\nutils.merge(Interactable.eventTypes, [\n 'dragstart',\n 'dragmove',\n 'draginertiastart',\n 'draginertiaresume',\n 'dragend',\n]);\nactions.methodDict.drag = 'draggable';\n\ndefaultOptions.drag = drag.defaults;\n\nmodule.exports = drag;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst scope = require('../scope');\nconst interact = require('../interact');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drop = {\n defaults: {\n enabled: false,\n accept : null,\n overlap: 'pointer',\n },\n};\n\nlet dynamicDrop = false;\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // reset active dropzones\n interaction.activeDrops.dropzones = [];\n interaction.activeDrops.elements = [];\n interaction.activeDrops.rects = [];\n\n interaction.dropEvents = null;\n\n if (!interaction.dynamicDrop) {\n setActiveDrops(interaction, interaction.element);\n }\n\n const dragEvent = interaction.prevEvent;\n const dropEvents = getDropEvents(interaction, event, dragEvent);\n\n if (dropEvents.activate) {\n fireActiveDrops(interaction, dropEvents.activate);\n }\n});\n\nInteractEvent.signals.on('new', function ({ interaction, iEvent, event }) {\n if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { return; }\n\n const draggableElement = interaction.element;\n const dragEvent = iEvent;\n const dropResult = getDrop(dragEvent, event, draggableElement);\n\n interaction.dropTarget = dropResult.dropzone;\n interaction.dropElement = dropResult.element;\n\n interaction.dropEvents = getDropEvents(interaction, event, dragEvent);\n});\n\nInteraction.signals.on('action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n fireDropEvents(interaction, interaction.dropEvents);\n});\n\nInteraction.signals.on('action-end', function ({ interaction }) {\n if (interaction.prepared.name === 'drag') {\n fireDropEvents(interaction, interaction.dropEvents);\n }\n});\n\nInteraction.signals.on('stop-drag', function ({ interaction }) {\n interaction.activeDrops.dropzones =\n interaction.activeDrops.elements =\n interaction.activeDrops.rects =\n interaction.dropEvents = null;\n});\n\nfunction collectDrops (interaction, element) {\n const drops = [];\n const elements = [];\n\n element = element || interaction.element;\n\n // collect all dropzones and their elements which qualify for a drop\n for (const current of scope.interactables) {\n if (!current.options.drop.enabled) { continue; }\n\n const accept = current.options.drop.accept;\n\n // test the draggable element against the dropzone's accept setting\n if ((utils.is.element(accept) && accept !== element)\n || (utils.is.string(accept)\n && !utils.matchesSelector(element, accept))) {\n\n continue;\n }\n\n // query for new elements if necessary\n const dropElements = utils.is.string(current.target)\n ? current._context.querySelectorAll(current.target)\n : [current.target];\n\n for (let i = 0; i < dropElements.length; i++) {\n const currentElement = dropElements[i];\n\n if (currentElement !== element) {\n drops.push(current);\n elements.push(currentElement);\n }\n }\n }\n\n return {\n elements,\n dropzones: drops,\n };\n}\n\nfunction fireActiveDrops (interaction, event) {\n let prevElement;\n\n // loop through all active dropzones and trigger event\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n const current = interaction.activeDrops.dropzones[i];\n const currentElement = interaction.activeDrops.elements [i];\n\n // prevent trigger of duplicate events on same element\n if (currentElement !== prevElement) {\n // set current element as event target\n event.target = currentElement;\n current.fire(event);\n }\n prevElement = currentElement;\n }\n}\n\n// Collect a new set of possible drops and save them in activeDrops.\n// setActiveDrops should always be called when a drag has just started or a\n// drag event happens while dynamicDrop is true\nfunction setActiveDrops (interaction, dragElement) {\n // get dropzones and their elements that could receive the draggable\n const possibleDrops = collectDrops(interaction, dragElement, true);\n\n interaction.activeDrops.dropzones = possibleDrops.dropzones;\n interaction.activeDrops.elements = possibleDrops.elements;\n interaction.activeDrops.rects = [];\n\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n interaction.activeDrops.rects[i] =\n interaction.activeDrops.dropzones[i].getRect(interaction.activeDrops.elements[i]);\n }\n}\n\nfunction getDrop (dragEvent, event, dragElement) {\n const interaction = dragEvent.interaction;\n const validDrops = [];\n\n if (dynamicDrop) {\n setActiveDrops(interaction, dragElement);\n }\n\n // collect all dropzones and their elements which qualify for a drop\n for (let j = 0; j < interaction.activeDrops.dropzones.length; j++) {\n const current = interaction.activeDrops.dropzones[j];\n const currentElement = interaction.activeDrops.elements [j];\n const rect = interaction.activeDrops.rects [j];\n\n validDrops.push(current.dropCheck(dragEvent, event, interaction.target, dragElement, currentElement, rect)\n ? currentElement\n : null);\n }\n\n // get the most appropriate dropzone based on DOM depth and order\n const dropIndex = utils.indexOfDeepestElement(validDrops);\n\n return {\n dropzone: interaction.activeDrops.dropzones[dropIndex] || null,\n element : interaction.activeDrops.elements [dropIndex] || null,\n };\n}\n\nfunction getDropEvents (interaction, pointerEvent, dragEvent) {\n const dropEvents = {\n enter : null,\n leave : null,\n activate : null,\n deactivate: null,\n move : null,\n drop : null,\n };\n\n const tmpl = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n };\n\n if (interaction.dropElement !== interaction.prevDropElement) {\n // if there was a prevDropTarget, create a dragleave event\n if (interaction.prevDropTarget) {\n dropEvents.leave = utils.extend({ type: 'dragleave' }, tmpl);\n\n dragEvent.dragLeave = dropEvents.leave.target = interaction.prevDropElement;\n dragEvent.prevDropzone = dropEvents.leave.dropzone = interaction.prevDropTarget;\n }\n // if the dropTarget is not null, create a dragenter event\n if (interaction.dropTarget) {\n dropEvents.enter = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n type : 'dragenter',\n };\n\n dragEvent.dragEnter = interaction.dropElement;\n dragEvent.dropzone = interaction.dropTarget;\n }\n }\n\n if (dragEvent.type === 'dragend' && interaction.dropTarget) {\n dropEvents.drop = utils.extend({ type: 'drop' }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n dragEvent.relatedTarget = interaction.dropElement;\n }\n if (dragEvent.type === 'dragstart') {\n dropEvents.activate = utils.extend({ type: 'dropactivate' }, tmpl);\n\n dropEvents.activate.target = null;\n dropEvents.activate.dropzone = null;\n }\n if (dragEvent.type === 'dragend') {\n dropEvents.deactivate = utils.extend({ type: 'dropdeactivate' }, tmpl);\n\n dropEvents.deactivate.target = null;\n dropEvents.deactivate.dropzone = null;\n }\n if (dragEvent.type === 'dragmove' && interaction.dropTarget) {\n dropEvents.move = utils.extend({\n dragmove : dragEvent,\n type : 'dropmove',\n }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n }\n\n return dropEvents;\n}\n\nfunction fireDropEvents (interaction, dropEvents) {\n if (dropEvents.leave) { interaction.prevDropTarget.fire(dropEvents.leave); }\n if (dropEvents.move ) { interaction.dropTarget.fire(dropEvents.move ); }\n if (dropEvents.enter) { interaction.dropTarget.fire(dropEvents.enter); }\n if (dropEvents.drop ) { interaction.dropTarget.fire(dropEvents.drop ); }\n if (dropEvents.deactivate) {\n fireActiveDrops(interaction, dropEvents.deactivate);\n }\n\n interaction.prevDropTarget = interaction.dropTarget;\n interaction.prevDropElement = interaction.dropElement;\n}\n\n/*\\\n * Interactable.dropzone\n [ method ]\n *\n * Returns or sets whether elements can be dropped onto this\n * Interactable to trigger drop events\n *\n * Dropzones can receive the following events:\n * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends\n * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone\n * - `dragmove` when a draggable that has entered the dropzone is moved\n * - `drop` when a draggable is dropped into this dropzone\n *\n * Use the `accept` option to allow only elements that match the given CSS\n * selector or element. The value can be:\n *\n * - **an Element** - only that element can be dropped into this dropzone.\n * - **a string**, - the element being dragged must match it as a CSS selector.\n * - **`null`** - accept options is cleared - it accepts any element.\n *\n * Use the `overlap` option to set how drops are checked for. The allowed\n * values are:\n *\n * - `'pointer'`, the pointer must be over the dropzone (default)\n * - `'center'`, the draggable element's center must be over the dropzone\n * - a number from 0-1 which is the `(intersection area) / (draggable area)`.\n * e.g. `0.5` for drop to happen when half of the area of the draggable is\n * over the dropzone\n *\n * Use the `checker` option to specify a function to check if a dragged\n * element is over this Interactable.\n *\n | interact(target)\n | .dropChecker(function(dragEvent, // related dragmove or dragend event\n | event, // TouchEvent/PointerEvent/MouseEvent\n | dropped, // bool result of the default checker\n | dropzone, // dropzone Interactable\n | dropElement, // dropzone elemnt\n | draggable, // draggable Interactable\n | draggableElement) {// draggable element\n |\n | return dropped && event.target.hasAttribute('allow-drop');\n | }\n *\n *\n - options (boolean | object | null) #optional The new value to be set.\n | interact('.drop').dropzone({\n | accept: '.can-drop' || document.getElementById('single-drop'),\n | overlap: 'pointer' || 'center' || zeroToOne\n | }\n = (boolean | object) The current setting or this Interactable\n\\*/\nInteractable.prototype.dropzone = function (options) {\n if (utils.is.object(options)) {\n this.options.drop.enabled = options.enabled === false? false: true;\n\n if (utils.is.function(options.ondrop) ) { this.events.ondrop = options.ondrop ; }\n if (utils.is.function(options.ondropactivate) ) { this.events.ondropactivate = options.ondropactivate ; }\n if (utils.is.function(options.ondropdeactivate)) { this.events.ondropdeactivate = options.ondropdeactivate; }\n if (utils.is.function(options.ondragenter) ) { this.events.ondragenter = options.ondragenter ; }\n if (utils.is.function(options.ondragleave) ) { this.events.ondragleave = options.ondragleave ; }\n if (utils.is.function(options.ondropmove) ) { this.events.ondropmove = options.ondropmove ; }\n\n if (/^(pointer|center)$/.test(options.overlap)) {\n this.options.drop.overlap = options.overlap;\n }\n else if (utils.is.number(options.overlap)) {\n this.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0);\n }\n if ('accept' in options) {\n this.options.drop.accept = options.accept;\n }\n if ('checker' in options) {\n this.options.drop.checker = options.checker;\n }\n\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drop.enabled = options;\n\n if (!options) {\n this.ondragenter = this.ondragleave = this.ondrop\n = this.ondropactivate = this.ondropdeactivate = null;\n }\n\n return this;\n }\n\n return this.options.drop;\n};\n\nInteractable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) {\n let dropped = false;\n\n // if the dropzone has no rect (eg. display: none)\n // call the custom dropChecker or just return false\n if (!(rect = rect || this.getRect(dropElement))) {\n return (this.options.drop.checker\n ? this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement)\n : false);\n }\n\n const dropOverlap = this.options.drop.overlap;\n\n if (dropOverlap === 'pointer') {\n const origin = utils.getOriginXY(draggable, draggableElement, 'drag');\n const page = utils.getPageXY(dragEvent);\n\n page.x += origin.x;\n page.y += origin.y;\n\n const horizontal = (page.x > rect.left) && (page.x < rect.right);\n const vertical = (page.y > rect.top ) && (page.y < rect.bottom);\n\n dropped = horizontal && vertical;\n }\n\n const dragRect = draggable.getRect(draggableElement);\n\n if (dragRect && dropOverlap === 'center') {\n const cx = dragRect.left + dragRect.width / 2;\n const cy = dragRect.top + dragRect.height / 2;\n\n dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom;\n }\n\n if (dragRect && utils.is.number(dropOverlap)) {\n const overlapArea = (Math.max(0, Math.min(rect.right , dragRect.right ) - Math.max(rect.left, dragRect.left))\n * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top , dragRect.top )));\n\n const overlapRatio = overlapArea / (dragRect.width * dragRect.height);\n\n dropped = overlapRatio >= dropOverlap;\n }\n\n if (this.options.drop.checker) {\n dropped = this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement);\n }\n\n return dropped;\n};\n\nInteractable.signals.on('unset', function ({ interactable }) {\n interactable.dropzone(false);\n});\n\nInteractable.settingsMethods.push('dropChecker');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.dropTarget = null; // the dropzone a drag target might be dropped into\n interaction.dropElement = null; // the element at the time of checking\n interaction.prevDropTarget = null; // the dropzone that was recently dragged away from\n interaction.prevDropElement = null; // the element at the time of checking\n interaction.dropEvents = null; // the dropEvents related to the current drag event\n\n interaction.activeDrops = {\n dropzones: [], // the dropzones that are mentioned below\n elements : [], // elements of dropzones that accept the target draggable\n rects : [], // the rects of the elements mentioned above\n };\n\n});\n\nInteraction.signals.on('stop', function ({ interaction }) {\n interaction.dropTarget = interaction.dropElement =\n interaction.prevDropTarget = interaction.prevDropElement = null;\n});\n\n/*\\\n * interact.dynamicDrop\n [ method ]\n *\n * Returns or sets whether the dimensions of dropzone elements are\n * calculated on every dragmove or only on dragstart for the default\n * dropChecker\n *\n - newValue (boolean) #optional True to check on each move. False to check only before start\n = (boolean | interact) The current setting or interact\n\\*/\ninteract.dynamicDrop = function (newValue) {\n if (utils.is.bool(newValue)) {\n //if (dragging && dynamicDrop !== newValue && !newValue) {\n //calcRects(dropzones);\n //}\n\n dynamicDrop = newValue;\n\n return interact;\n }\n return dynamicDrop;\n};\n\nutils.merge(Interactable.eventTypes, [\n 'dragenter',\n 'dragleave',\n 'dropactivate',\n 'dropdeactivate',\n 'dropmove',\n 'drop',\n]);\nactions.methodDict.drop = 'dropzone';\n\ndefaultOptions.drop = drop.defaults;\n\nmodule.exports = drop;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst gesture = {\n defaults: {\n enabled : false,\n origin : null,\n restrict: null,\n },\n\n checker: function (pointer, event, interactable, element, interaction) {\n if (interaction.pointerIds.length >= 2) {\n return { name: 'gesture' };\n }\n\n return null;\n },\n\n getCursor: function () {\n return '';\n },\n};\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturestart') { return; }\n iEvent.ds = 0;\n\n interaction.gesture.startDistance = interaction.gesture.prevDistance = iEvent.distance;\n interaction.gesture.startAngle = interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.scale = 1;\n});\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturemove') { return; }\n\n iEvent.ds = iEvent.scale - interaction.gesture.scale;\n\n interaction.target.fire(iEvent);\n\n interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.prevDistance = iEvent.distance;\n\n if (iEvent.scale !== Infinity\n && iEvent.scale !== null\n && iEvent.scale !== undefined\n && !isNaN(iEvent.scale)) {\n\n interaction.gesture.scale = iEvent.scale;\n }\n});\n\n/*\\\n * Interactable.gesturable\n [ method ]\n *\n * Gets or sets whether multitouch gestures can be performed on the\n * Interactable's element\n *\n = (boolean) Indicates if this can be the target of gesture events\n | var isGestureable = interact(element).gesturable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on gesture events (makes the Interactable gesturable)\n = (object) this Interactable\n | interact(element).gesturable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // limit multiple gestures.\n | // See the explanation in @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n\\*/\nInteractable.prototype.gesturable = function (options) {\n if (utils.is.object(options)) {\n this.options.gesture.enabled = options.enabled === false? false: true;\n this.setPerAction('gesture', options);\n this.setOnEvents('gesture', options);\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.gesture.enabled = options;\n\n if (!options) {\n this.ongesturestart = this.ongesturestart = this.ongestureend = null;\n }\n\n return this;\n }\n\n return this.options.gesture;\n};\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action, event, starting, ending, deltaSource }) {\n if (action !== 'gesture') { return; }\n\n const pointers = interaction.pointers;\n\n iEvent.touches = [pointers[0], pointers[1]];\n\n if (starting) {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = 1;\n iEvent.ds = 0;\n iEvent.angle = utils.touchAngle(pointers, undefined, deltaSource);\n iEvent.da = 0;\n }\n else if (ending || event instanceof InteractEvent) {\n iEvent.distance = interaction.prevEvent.distance;\n iEvent.box = interaction.prevEvent.box;\n iEvent.scale = interaction.prevEvent.scale;\n iEvent.ds = iEvent.scale - 1;\n iEvent.angle = interaction.prevEvent.angle;\n iEvent.da = iEvent.angle - interaction.gesture.startAngle;\n }\n else {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = iEvent.distance / interaction.gesture.startDistance;\n iEvent.angle = utils.touchAngle(pointers, interaction.gesture.prevAngle, deltaSource);\n\n iEvent.ds = iEvent.scale - interaction.gesture.prevScale;\n iEvent.da = iEvent.angle - interaction.gesture.prevAngle;\n }\n});\n\nInteraction.signals.on('new', function (interaction) {\n interaction.gesture = {\n start: { x: 0, y: 0 },\n\n startDistance: 0, // distance between two touches of touchStart\n prevDistance : 0,\n distance : 0,\n\n scale: 1, // gesture.distance / gesture.startDistance\n\n startAngle: 0, // angle of line joining two touches\n prevAngle : 0, // angle of the previous gesture event\n };\n});\n\nactions.gesture = gesture;\nactions.names.push('gesture');\nutils.merge(Interactable.eventTypes, [\n 'gesturestart',\n 'gesturemove',\n 'gestureend',\n]);\nactions.methodDict.gesture = 'gesturable';\n\ndefaultOptions.gesture = gesture.defaults;\n\nmodule.exports = gesture;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\n// Less Precision with touch input\nconst defaultMargin = browser.supportsTouch || browser.supportsPointerEvent? 20: 10;\n\nconst resize = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n square: false,\n preserveAspectRatio: false,\n axis: 'xy',\n\n // use default margin\n margin: NaN,\n\n // object with props left, right, top, bottom which are\n // true/false values to resize when the pointer is over that edge,\n // CSS selectors to match the handles for each direction\n // or the Elements for each handle\n edges: null,\n\n // a value of 'none' will limit the resize rect to a minimum of 0x0\n // 'negate' will alow the rect to have negative width/height\n // 'reposition' will keep the width/height positive by swapping\n // the top and bottom edges and/or swapping the left and right edges\n invert: 'none',\n },\n\n checker: function (pointer, event, interactable, element, interaction, rect) {\n if (!rect) { return null; }\n\n const page = utils.extend({}, interaction.curCoords.page);\n const options = interactable.options;\n\n if (options.resize.enabled) {\n const resizeOptions = options.resize;\n const resizeEdges = { left: false, right: false, top: false, bottom: false };\n\n // if using resize.edges\n if (utils.is.object(resizeOptions.edges)) {\n for (const edge in resizeEdges) {\n resizeEdges[edge] = checkResizeEdge(edge,\n resizeOptions.edges[edge],\n page,\n interaction._eventTarget,\n element,\n rect,\n resizeOptions.margin || defaultMargin);\n }\n\n resizeEdges.left = resizeEdges.left && !resizeEdges.right;\n resizeEdges.top = resizeEdges.top && !resizeEdges.bottom;\n\n if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) {\n return {\n name: 'resize',\n edges: resizeEdges,\n };\n }\n }\n else {\n const right = options.resize.axis !== 'y' && page.x > (rect.right - defaultMargin);\n const bottom = options.resize.axis !== 'x' && page.y > (rect.bottom - defaultMargin);\n\n if (right || bottom) {\n return {\n name: 'resize',\n axes: (right? 'x' : '') + (bottom? 'y' : ''),\n };\n }\n }\n }\n\n return null;\n },\n\n cursors: (browser.isIe9OrOlder ? {\n x : 'e-resize',\n y : 's-resize',\n xy: 'se-resize',\n\n top : 'n-resize',\n left : 'w-resize',\n bottom : 's-resize',\n right : 'e-resize',\n topleft : 'se-resize',\n bottomright: 'se-resize',\n topright : 'ne-resize',\n bottomleft : 'ne-resize',\n } : {\n x : 'ew-resize',\n y : 'ns-resize',\n xy: 'nwse-resize',\n\n top : 'ns-resize',\n left : 'ew-resize',\n bottom : 'ns-resize',\n right : 'ew-resize',\n topleft : 'nwse-resize',\n bottomright: 'nwse-resize',\n topright : 'nesw-resize',\n bottomleft : 'nesw-resize',\n }),\n\n getCursor: function (action) {\n if (action.axis) {\n return resize.cursors[action.name + action.axis];\n }\n else if (action.edges) {\n let cursorKey = '';\n const edgeNames = ['top', 'bottom', 'left', 'right'];\n\n for (let i = 0; i < 4; i++) {\n if (action.edges[edgeNames[i]]) {\n cursorKey += edgeNames[i];\n }\n }\n\n return resize.cursors[cursorKey];\n }\n },\n};\n\n// resizestart\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'resizestart' || !interaction.prepared.edges) {\n return;\n }\n\n const startRect = interaction.target.getRect(interaction.element);\n const resizeOptions = interaction.target.options.resize;\n\n /*\n * When using the `resizable.square` or `resizable.preserveAspectRatio` options, resizing from one edge\n * will affect another. E.g. with `resizable.square`, resizing to make the right edge larger will make\n * the bottom edge larger by the same amount. We call these 'linked' edges. Any linked edges will depend\n * on the active edges and the edge being interacted with.\n */\n if (resizeOptions.square || resizeOptions.preserveAspectRatio) {\n const linkedEdges = utils.extend({}, interaction.prepared.edges);\n\n linkedEdges.top = linkedEdges.top || (linkedEdges.left && !linkedEdges.bottom);\n linkedEdges.left = linkedEdges.left || (linkedEdges.top && !linkedEdges.right );\n linkedEdges.bottom = linkedEdges.bottom || (linkedEdges.right && !linkedEdges.top );\n linkedEdges.right = linkedEdges.right || (linkedEdges.bottom && !linkedEdges.left );\n\n interaction.prepared._linkedEdges = linkedEdges;\n }\n else {\n interaction.prepared._linkedEdges = null;\n }\n\n // if using `resizable.preserveAspectRatio` option, record aspect ratio at the start of the resize\n if (resizeOptions.preserveAspectRatio) {\n interaction.resizeStartAspectRatio = startRect.width / startRect.height;\n }\n\n interaction.resizeRects = {\n start : startRect,\n current : utils.extend({}, startRect),\n inverted : utils.extend({}, startRect),\n previous : utils.extend({}, startRect),\n delta : {\n left: 0, right : 0, width : 0,\n top : 0, bottom: 0, height: 0,\n },\n };\n\n iEvent.rect = interaction.resizeRects.inverted;\n iEvent.deltaRect = interaction.resizeRects.delta;\n});\n\n// resizemove\nInteractEvent.signals.on('new', function ({ iEvent, phase, interaction }) {\n if (phase !== 'move' || !interaction.prepared.edges) { return; }\n\n const resizeOptions = interaction.target.options.resize;\n const invert = resizeOptions.invert;\n const invertible = invert === 'reposition' || invert === 'negate';\n\n let edges = interaction.prepared.edges;\n\n const start = interaction.resizeRects.start;\n const current = interaction.resizeRects.current;\n const inverted = interaction.resizeRects.inverted;\n const delta = interaction.resizeRects.delta;\n const previous = utils.extend(interaction.resizeRects.previous, inverted);\n const originalEdges = edges;\n\n let dx = iEvent.dx;\n let dy = iEvent.dy;\n\n if (resizeOptions.preserveAspectRatio || resizeOptions.square) {\n // `resize.preserveAspectRatio` takes precedence over `resize.square`\n const startAspectRatio = resizeOptions.preserveAspectRatio\n ? interaction.resizeStartAspectRatio\n : 1;\n\n edges = interaction.prepared._linkedEdges;\n\n if ((originalEdges.left && originalEdges.bottom)\n || (originalEdges.right && originalEdges.top)) {\n dy = -dx / startAspectRatio;\n }\n else if (originalEdges.left || originalEdges.right ) { dy = dx / startAspectRatio; }\n else if (originalEdges.top || originalEdges.bottom) { dx = dy * startAspectRatio; }\n }\n\n // update the 'current' rect without modifications\n if (edges.top ) { current.top += dy; }\n if (edges.bottom) { current.bottom += dy; }\n if (edges.left ) { current.left += dx; }\n if (edges.right ) { current.right += dx; }\n\n if (invertible) {\n // if invertible, copy the current rect\n utils.extend(inverted, current);\n\n if (invert === 'reposition') {\n // swap edge values if necessary to keep width/height positive\n let swap;\n\n if (inverted.top > inverted.bottom) {\n swap = inverted.top;\n\n inverted.top = inverted.bottom;\n inverted.bottom = swap;\n }\n if (inverted.left > inverted.right) {\n swap = inverted.left;\n\n inverted.left = inverted.right;\n inverted.right = swap;\n }\n }\n }\n else {\n // if not invertible, restrict to minimum of 0x0 rect\n inverted.top = Math.min(current.top, start.bottom);\n inverted.bottom = Math.max(current.bottom, start.top);\n inverted.left = Math.min(current.left, start.right);\n inverted.right = Math.max(current.right, start.left);\n }\n\n inverted.width = inverted.right - inverted.left;\n inverted.height = inverted.bottom - inverted.top ;\n\n for (const edge in inverted) {\n delta[edge] = inverted[edge] - previous[edge];\n }\n\n iEvent.edges = interaction.prepared.edges;\n iEvent.rect = inverted;\n iEvent.deltaRect = delta;\n});\n\n/*\\\n * Interactable.resizable\n [ method ]\n *\n * Gets or sets whether resize actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of resize elements\n | var isResizeable = interact('input[type=text]').resizable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on resize events (object makes the Interactable resizable)\n = (object) This Interactable\n | interact(element).resizable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | edges: {\n | top : true, // Use pointer coords to check for resize.\n | left : false, // Disable resizing from left edge.\n | bottom: '.resize-s',// Resize if pointer target matches selector\n | right : handleEl // Resize if pointer target is the given Element\n | },\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height are adjusted at a 1:1 ratio.\n | square: false,\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height maintain the aspect ratio they had when resizing started.\n | preserveAspectRatio: false,\n |\n | // a value of 'none' will limit the resize rect to a minimum of 0x0\n | // 'negate' will allow the rect to have negative width/height\n | // 'reposition' will keep the width/height positive by swapping\n | // the top and bottom edges and/or swapping the left and right edges\n | invert: 'none' || 'negate' || 'reposition'\n |\n | // limit multiple resizes.\n | // See the explanation in the @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n \\*/\nInteractable.prototype.resizable = function (options) {\n if (utils.is.object(options)) {\n this.options.resize.enabled = options.enabled === false? false: true;\n this.setPerAction('resize', options);\n this.setOnEvents('resize', options);\n\n if (/^x$|^y$|^xy$/.test(options.axis)) {\n this.options.resize.axis = options.axis;\n }\n else if (options.axis === null) {\n this.options.resize.axis = defaultOptions.resize.axis;\n }\n\n if (utils.is.bool(options.preserveAspectRatio)) {\n this.options.resize.preserveAspectRatio = options.preserveAspectRatio;\n }\n else if (utils.is.bool(options.square)) {\n this.options.resize.square = options.square;\n }\n\n return this;\n }\n if (utils.is.bool(options)) {\n this.options.resize.enabled = options;\n\n if (!options) {\n this.onresizestart = this.onresizestart = this.onresizeend = null;\n }\n\n return this;\n }\n return this.options.resize;\n};\n\nfunction checkResizeEdge (name, value, page, element, interactableElement, rect, margin) {\n // false, '', undefined, null\n if (!value) { return false; }\n\n // true value, use pointer coords and element rect\n if (value === true) {\n // if dimensions are negative, \"switch\" edges\n const width = utils.is.number(rect.width )? rect.width : rect.right - rect.left;\n const height = utils.is.number(rect.height)? rect.height : rect.bottom - rect.top ;\n\n if (width < 0) {\n if (name === 'left' ) { name = 'right'; }\n else if (name === 'right') { name = 'left' ; }\n }\n if (height < 0) {\n if (name === 'top' ) { name = 'bottom'; }\n else if (name === 'bottom') { name = 'top' ; }\n }\n\n if (name === 'left' ) { return page.x < ((width >= 0? rect.left: rect.right ) + margin); }\n if (name === 'top' ) { return page.y < ((height >= 0? rect.top : rect.bottom) + margin); }\n\n if (name === 'right' ) { return page.x > ((width >= 0? rect.right : rect.left) - margin); }\n if (name === 'bottom') { return page.y > ((height >= 0? rect.bottom: rect.top ) - margin); }\n }\n\n // the remaining checks require an element\n if (!utils.is.element(element)) { return false; }\n\n return utils.is.element(value)\n // the value is an element to use as a resize handle\n ? value === element\n // otherwise check if element matches value as selector\n : utils.matchesUpTo(element, value, interactableElement);\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.resizeAxes = 'xy';\n});\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action }) {\n if (action !== 'resize' || !interaction.resizeAxes) { return; }\n\n const options = interaction.target.options;\n\n if (options.resize.square) {\n if (interaction.resizeAxes === 'y') {\n iEvent.dx = iEvent.dy;\n }\n else {\n iEvent.dy = iEvent.dx;\n }\n iEvent.axes = 'xy';\n }\n else {\n iEvent.axes = interaction.resizeAxes;\n\n if (interaction.resizeAxes === 'x') {\n iEvent.dy = 0;\n }\n else if (interaction.resizeAxes === 'y') {\n iEvent.dx = 0;\n }\n }\n});\n\nactions.resize = resize;\nactions.names.push('resize');\nutils.merge(Interactable.eventTypes, [\n 'resizestart',\n 'resizemove',\n 'resizeinertiastart',\n 'resizeinertiaresume',\n 'resizeend',\n]);\nactions.methodDict.resize = 'resizable';\n\ndefaultOptions.resize = resize.defaults;\n\nmodule.exports = resize;\n","const raf = require('./utils/raf');\nconst getWindow = require('./utils/window').getWindow;\nconst is = require('./utils/is');\nconst domUtils = require('./utils/domUtils');\nconst Interaction = require('./Interaction');\nconst defaultOptions = require('./defaultOptions');\n\nconst autoScroll = {\n defaults: {\n enabled : false,\n container: null, // the item that is scrolled (Window or HTMLElement)\n margin : 60,\n speed : 300, // the scroll speed in pixels per second\n },\n\n interaction: null,\n i: null, // the handle returned by window.setInterval\n x: 0, y: 0, // Direction each pulse is to scroll in\n\n isScrolling: false,\n prevTime: 0,\n\n start: function (interaction) {\n autoScroll.isScrolling = true;\n raf.cancel(autoScroll.i);\n\n autoScroll.interaction = interaction;\n autoScroll.prevTime = new Date().getTime();\n autoScroll.i = raf.request(autoScroll.scroll);\n },\n\n stop: function () {\n autoScroll.isScrolling = false;\n raf.cancel(autoScroll.i);\n },\n\n // scroll the window by the values in scroll.x/y\n scroll: function () {\n const options = autoScroll.interaction.target.options[autoScroll.interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(autoScroll.interaction.element);\n const now = new Date().getTime();\n // change in time in seconds\n const dt = (now - autoScroll.prevTime) / 1000;\n // displacement\n const s = options.speed * dt;\n\n if (s >= 1) {\n if (is.window(container)) {\n container.scrollBy(autoScroll.x * s, autoScroll.y * s);\n }\n else if (container) {\n container.scrollLeft += autoScroll.x * s;\n container.scrollTop += autoScroll.y * s;\n }\n\n autoScroll.prevTime = now;\n }\n\n if (autoScroll.isScrolling) {\n raf.cancel(autoScroll.i);\n autoScroll.i = raf.request(autoScroll.scroll);\n }\n },\n check: function (interactable, actionName) {\n const options = interactable.options;\n\n return options[actionName].autoScroll && options[actionName].autoScroll.enabled;\n },\n onInteractionMove: function ({ interaction, pointer }) {\n if (!(interaction.interacting()\n && autoScroll.check(interaction.target, interaction.prepared.name))) {\n return;\n }\n\n if (interaction.simulation) {\n autoScroll.x = autoScroll.y = 0;\n return;\n }\n\n let top;\n let right;\n let bottom;\n let left;\n\n const options = interaction.target.options[interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(interaction.element);\n\n if (is.window(container)) {\n left = pointer.clientX < autoScroll.margin;\n top = pointer.clientY < autoScroll.margin;\n right = pointer.clientX > container.innerWidth - autoScroll.margin;\n bottom = pointer.clientY > container.innerHeight - autoScroll.margin;\n }\n else {\n const rect = domUtils.getElementClientRect(container);\n\n left = pointer.clientX < rect.left + autoScroll.margin;\n top = pointer.clientY < rect.top + autoScroll.margin;\n right = pointer.clientX > rect.right - autoScroll.margin;\n bottom = pointer.clientY > rect.bottom - autoScroll.margin;\n }\n\n autoScroll.x = (right ? 1: left? -1: 0);\n autoScroll.y = (bottom? 1: top? -1: 0);\n\n if (!autoScroll.isScrolling) {\n // set the autoScroll properties to those of the target\n autoScroll.margin = options.margin;\n autoScroll.speed = options.speed;\n\n autoScroll.start(interaction);\n }\n },\n};\n\nInteraction.signals.on('stop-active', function () {\n autoScroll.stop();\n});\n\nInteraction.signals.on('action-move', autoScroll.onInteractionMove);\n\ndefaultOptions.perAction.autoScroll = autoScroll.defaults;\n\nmodule.exports = autoScroll;\n","const Interactable = require('../Interactable');\nconst actions = require('../actions/base');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.ignoreFrom\n [ method ]\n *\n * If the target of the `mousedown`, `pointerdown` or `touchstart`\n * event or any of it's parents match the given CSS selector or\n * Element, no drag/resize/gesture is started.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to not ignore any elements\n = (string | Element | object) The current ignoreFrom value or this Interactable\n **\n | interact(element, { ignoreFrom: document.getElementById('no-action') });\n | // or\n | interact(element).ignoreFrom('input, textarea, a');\n\\*/\nInteractable.prototype.ignoreFrom = function (newValue) {\n return this._backCompatOption('ignoreFrom', newValue);\n};\n\n/*\\\n * Interactable.allowFrom\n [ method ]\n *\n * A drag/resize/gesture is started only If the target of the\n * `mousedown`, `pointerdown` or `touchstart` event or any of it's\n * parents match the given CSS selector or Element.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to allow from any element\n = (string | Element | object) The current allowFrom value or this Interactable\n **\n | interact(element, { allowFrom: document.getElementById('drag-handle') });\n | // or\n | interact(element).allowFrom('.handle');\n\\*/\nInteractable.prototype.allowFrom = function (newValue) {\n return this._backCompatOption('allowFrom', newValue);\n};\n\nInteractable.prototype.testIgnore = function (ignoreFrom, interactableElement, element) {\n if (!ignoreFrom || !is.element(element)) { return false; }\n\n if (is.string(ignoreFrom)) {\n return domUtils.matchesUpTo(element, ignoreFrom, interactableElement);\n }\n else if (is.element(ignoreFrom)) {\n return domUtils.nodeContains(ignoreFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testAllow = function (allowFrom, interactableElement, element) {\n if (!allowFrom) { return true; }\n\n if (!is.element(element)) { return false; }\n\n if (is.string(allowFrom)) {\n return domUtils.matchesUpTo(element, allowFrom, interactableElement);\n }\n else if (is.element(allowFrom)) {\n return domUtils.nodeContains(allowFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testIgnoreAllow = function (options, interactableElement, eventTarget) {\n return (!this.testIgnore(options.ignoreFrom, interactableElement, eventTarget)\n && this.testAllow(options.allowFrom, interactableElement, eventTarget));\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (event.buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\n","const interact = require('../interact');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst actions = require('../actions/base');\nconst defaultOptions = require('../defaultOptions');\nconst browser = require('../utils/browser');\nconst scope = require('../scope');\nconst utils = require('../utils');\nconst signals = require('../utils/Signals').new();\n\nrequire('./InteractableMethods');\n\nconst autoStart = {\n signals,\n withinInteractionLimit,\n // Allow this many interactions to happen simultaneously\n maxInteractions: Infinity,\n defaults: {\n perAction: {\n manualStart: false,\n max: Infinity,\n maxPerElement: 1,\n allowFrom: null,\n ignoreFrom: null,\n },\n },\n setActionDefaults: function (action) {\n utils.extend(action.defaults, autoStart.defaults.perAction);\n },\n};\n\n// set cursor style on mousedown\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget }) {\n if (interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\n// set cursor style on mousemove\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget }) {\n if (!interaction.mouse\n || interaction.pointerIsDown\n || interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\nInteraction.signals.on('move', function (arg) {\n const { interaction, event } = arg;\n\n if (!interaction.pointerIsDown\n || interaction.interacting()\n || !interaction.pointerWasMoved\n || !interaction.prepared.name) {\n return;\n }\n\n signals.fire('before-start', arg);\n\n const target = interaction.target;\n\n if (interaction.prepared.name && target) {\n // check manualStart and interaction limit\n if (target.options[interaction.prepared.name].manualStart\n || !withinInteractionLimit(target, interaction.element, interaction.prepared)) {\n interaction.stop(event);\n }\n else {\n interaction.start(interaction.prepared, target, interaction.element);\n }\n }\n});\n\n// Check if the current target supports the action.\n// If so, return the validated action. Otherwise, return null\nfunction validateAction (action, interactable, element, eventTarget) {\n if (utils.is.object(action)\n && interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget)\n && interactable.options[action.name].enabled\n && withinInteractionLimit(interactable, element, action)) {\n return action;\n }\n\n return null;\n}\n\nfunction validateSelector (interaction, pointer, event, matches, matchElements, eventTarget) {\n for (let i = 0, len = matches.length; i < len; i++) {\n const match = matches[i];\n const matchElement = matchElements[i];\n const action = validateAction(match.getAction(pointer, event, interaction, matchElement),\n match,\n matchElement,\n eventTarget);\n\n if (action) {\n return {\n action,\n target: match,\n element: matchElement,\n };\n }\n }\n\n return {};\n}\n\nfunction getActionInfo (interaction, pointer, event, eventTarget) {\n let matches = [];\n let matchElements = [];\n\n let element = eventTarget;\n let action = null;\n\n function pushMatches (interactable, selector, context) {\n const elements = (browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined);\n\n if (utils.matchesSelector(element, selector, elements)) {\n\n matches.push(interactable);\n matchElements.push(element);\n }\n }\n\n while (utils.is.element(element)) {\n matches = [];\n matchElements = [];\n\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && (action = validateAction(elementInteractable.getAction(pointer, event, interaction, element, eventTarget),\n elementInteractable,\n element,\n eventTarget))\n && !elementInteractable.options[action.name].manualStart) {\n return {\n element,\n action,\n target: elementInteractable,\n };\n }\n else {\n scope.interactables.forEachSelector(pushMatches, element);\n\n const actionInfo = validateSelector(interaction, pointer, event, matches, matchElements, eventTarget);\n\n if (actionInfo.action\n && !actionInfo.target.options[actionInfo.action.name].manualStart) {\n return actionInfo;\n }\n }\n\n element = utils.parentNode(element);\n }\n\n return {};\n}\n\nfunction prepare (interaction, { action, target, element }) {\n action = action || {};\n\n if (interaction.target && interaction.target.options.styleCursor) {\n interaction.target._doc.documentElement.style.cursor = '';\n }\n\n interaction.target = target;\n interaction.element = element;\n utils.copyAction(interaction.prepared, action);\n\n if (target && target.options.styleCursor) {\n const cursor = action? actions[action.name].getCursor(action) : '';\n interaction.target._doc.documentElement.style.cursor = cursor;\n }\n\n signals.fire('prepared', { interaction: interaction });\n}\n\nInteraction.signals.on('stop', function ({ interaction }) {\n const target = interaction.target;\n\n if (target && target.options.styleCursor) {\n target._doc.documentElement.style.cursor = '';\n }\n});\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (utils.is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (utils.is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n const buttons = event.buttons || ({\n 0: 1,\n 1: 4,\n 3: 8,\n 4: 16,\n })[event.button];\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\nfunction withinInteractionLimit (interactable, element, action) {\n const options = interactable.options;\n const maxActions = options[action.name].max;\n const maxPerElement = options[action.name].maxPerElement;\n let activeInteractions = 0;\n let targetCount = 0;\n let targetElementCount = 0;\n\n // no actions if any of these values == 0\n if (!(maxActions && maxPerElement && autoStart.maxInteractions)) { return; }\n\n for (let i = 0, len = scope.interactions.length; i < len; i++) {\n const interaction = scope.interactions[i];\n const otherAction = interaction.prepared.name;\n\n if (!interaction.interacting()) { continue; }\n\n activeInteractions++;\n\n if (activeInteractions >= autoStart.maxInteractions) {\n return false;\n }\n\n if (interaction.target !== interactable) { continue; }\n\n targetCount += (otherAction === action.name)|0;\n\n if (targetCount >= maxActions) {\n return false;\n }\n\n if (interaction.element === element) {\n targetElementCount++;\n\n if (otherAction !== action.name || targetElementCount >= maxPerElement) {\n return false;\n }\n }\n }\n\n return autoStart.maxInteractions > 0;\n}\n\n/*\\\n * interact.maxInteractions\n [ method ]\n **\n * Returns or sets the maximum number of concurrent interactions allowed.\n * By default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables\n * and elements, you need to enable it in the draggable, resizable and\n * gesturable `'max'` and `'maxPerElement'` options.\n **\n - newValue (number) #optional Any number. newValue <= 0 means no interactions.\n\\*/\ninteract.maxInteractions = function (newValue) {\n if (utils.is.number(newValue)) {\n autoStart.maxInteractions = newValue;\n\n return this;\n }\n\n return autoStart.maxInteractions;\n};\n\nInteractable.settingsMethods.push('styleCursor');\nInteractable.settingsMethods.push('actionChecker');\nInteractable.settingsMethods.push('ignoreFrom');\nInteractable.settingsMethods.push('allowFrom');\n\ndefaultOptions.base.actionChecker = null;\ndefaultOptions.base.styleCursor = true;\n\nutils.extend(defaultOptions.perAction, autoStart.defaults.perAction);\n\nmodule.exports = autoStart;\n","const autoStart = require('./base');\nconst Interaction = require('../Interaction');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.delayTimer = null;\n});\n\nautoStart.signals.on('prepared', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.delayTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.target, interaction.element);\n }, delay);\n }\n});\n\nInteraction.signals.on('move', function ({ interaction, duplicate }) {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.delayTimer);\n }\n});\n\n// prevent regular down->move autoStart\nautoStart.signals.on('before-start', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.prepared.name = null;\n }\n});\n","const autoStart = require('./base');\nconst scope = require('../scope');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\n\nconst { matchesSelector, parentNode } = require('../utils/domUtils');\n\nautoStart.setActionDefaults(require('../actions/drag'));\n\nautoStart.signals.on('before-start', function ({ interaction, eventTarget, dx, dy }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // check if a drag is in the correct axis\n const absX = Math.abs(dx);\n const absY = Math.abs(dy);\n const options = interaction.target.options.drag;\n const startAxis = options.startAxis;\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy');\n\n interaction.prepared.axis = options.lockAxis === 'start'\n ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n : options.lockAxis;\n\n // if the movement isn't in the startAxis of the interactable\n if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) {\n // cancel the prepared action\n interaction.prepared.name = null;\n\n // then try to get a drag from another ineractable\n\n if (!interaction.prepared.name) {\n\n let element = eventTarget;\n\n const getDraggable = function (interactable, selector, context) {\n const elements = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n if (interactable === interaction.target) { return; }\n\n if (!options.manualStart\n && !interactable.testIgnoreAllow(options, element, eventTarget)\n && matchesSelector(element, selector, elements)) {\n\n const action = interactable.getAction(interaction.downPointer,\n interaction.downEvent,\n interaction,\n element);\n\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, interactable)\n && autoStart.validateAction(action, interactable, element, eventTarget)) {\n\n return interactable;\n }\n }\n };\n\n let action = null;\n\n // check all interactables\n while (is.element(element)) {\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && elementInteractable !== interaction.target\n && !elementInteractable.options.drag.manualStart) {\n\n action = elementInteractable.getAction(interaction.downPointer, interaction.downEvent, interaction, element);\n }\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, elementInteractable)) {\n\n interaction.prepared.name = 'drag';\n interaction.target = elementInteractable;\n interaction.element = element;\n break;\n }\n\n const selectorInteractable = scope.interactables.forEachSelector(getDraggable, element);\n\n if (selectorInteractable) {\n interaction.prepared.name = 'drag';\n interaction.target = selectorInteractable;\n interaction.element = element;\n break;\n }\n\n element = parentNode(element);\n }\n }\n }\n});\n\nfunction checkStartAxis (startAxis, interactable) {\n if (!interactable) { return false; }\n\n const thisAxis = interactable.options.drag.startAxis;\n\n return (startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis);\n}\n","require('./base').setActionDefaults(require('../actions/gesture'));\n","require('./base').setActionDefaults(require('../actions/resize'));\n","module.exports = {\n base: {\n accept : null,\n preventDefault: 'auto',\n deltaSource : 'page',\n },\n\n perAction: {\n origin: { x: 0, y: 0 },\n\n // only allow left button by default\n // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n mouseButtons: 1,\n\n inertia: {\n enabled : false,\n resistance : 10, // the lambda in exponential decay\n minSpeed : 100, // target speed must be above this for inertia to start\n endSpeed : 10, // the speed at which inertia is slow enough to stop\n allowResume : true, // allow resuming an action in inertia phase\n smoothEndDuration: 300, // animate to snap/restrict endOnly if there's no inertia\n },\n },\n};\n","/* browser entry point */\n\n// Legacy browser support\nrequire('./legacyBrowsers');\n\n// inertia\nrequire('./inertia');\n\n// modifiers\nrequire('./modifiers/snap');\nrequire('./modifiers/restrict');\n\n// pointerEvents\nrequire('./pointerEvents/base');\nrequire('./pointerEvents/holdRepeat');\nrequire('./pointerEvents/interactableTargets');\n\n// delay\nrequire('./autoStart/delay');\n\n// actions\nrequire('./actions/gesture');\nrequire('./actions/resize');\nrequire('./actions/drag');\nrequire('./actions/drop');\n\n// load these modifiers after resize is loaded\nrequire('./modifiers/snapSize');\nrequire('./modifiers/restrictEdges');\nrequire('./modifiers/restrictSize');\n\n// autoStart actions\nrequire('./autoStart/gesture');\nrequire('./autoStart/resize');\nrequire('./autoStart/drag');\n\n// Interactable preventDefault setting\nrequire('./interactablePreventDefault.js');\n\n// autoScroll\nrequire('./autoScroll');\n\n// export interact\nmodule.exports = require('./interact');\n","const InteractEvent = require('./InteractEvent');\nconst Interaction = require('./Interaction');\nconst modifiers = require('./modifiers');\nconst utils = require('./utils');\nconst animationFrame = require('./utils/raf');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.inertiaStatus = {\n active : false,\n smoothEnd : false,\n allowResume: false,\n\n startEvent: null,\n upCoords : {},\n\n xe: 0, ye: 0,\n sx: 0, sy: 0,\n\n t0: 0,\n vx0: 0, vys: 0,\n duration: 0,\n\n lambda_v0: 0,\n one_ve_v0: 0,\n i : null,\n };\n\n interaction.boundInertiaFrame = () => inertiaFrame .apply(interaction);\n interaction.boundSmoothEndFrame = () => smoothEndFrame.apply(interaction);\n});\n\nInteraction.signals.on('down', function ({ interaction, event, pointer, eventTarget }) {\n const status = interaction.inertiaStatus;\n\n // Check if the down event hits the current inertia target\n if (status.active) {\n let element = eventTarget;\n\n // climb up the DOM tree from the event target\n while (utils.is.element(element)) {\n\n // if interaction element is the current inertia target element\n if (element === interaction.element) {\n // stop inertia\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n\n // update pointers to the down event's coordinates\n interaction.updatePointer(pointer);\n utils.setCoords(interaction.curCoords, interaction.pointers);\n\n // fire appropriate signals\n const signalArg = { interaction };\n Interaction.signals.fire('before-action-move', signalArg);\n Interaction.signals.fire('action-resume' , signalArg);\n\n // fire a reume event\n const resumeEvent = new InteractEvent(interaction,\n event,\n interaction.prepared.name,\n 'inertiaresume',\n interaction.element);\n\n interaction.target.fire(resumeEvent);\n interaction.prevEvent = resumeEvent;\n modifiers.resetStatuses(interaction.modifierStatuses);\n\n utils.copyCoords(interaction.prevCoords, interaction.curCoords);\n break;\n }\n\n element = utils.parentNode(element);\n }\n }\n});\n\nInteraction.signals.on('up', function ({ interaction, event }) {\n const status = interaction.inertiaStatus;\n\n if (!interaction.interacting() || status.active) { return; }\n\n const target = interaction.target;\n const options = target && target.options;\n const inertiaOptions = options && interaction.prepared.name && options[interaction.prepared.name].inertia;\n\n const now = new Date().getTime();\n const statuses = {};\n const page = utils.extend({}, interaction.curCoords.page);\n const pointerSpeed = interaction.pointerDelta.client.speed;\n\n let smoothEnd = false;\n let modifierResult;\n\n // check if inertia should be started\n const inertiaPossible = (inertiaOptions && inertiaOptions.enabled\n && interaction.prepared.name !== 'gesture'\n && event !== status.startEvent);\n\n const inertia = (inertiaPossible\n && (now - interaction.curCoords.timeStamp) < 50\n && pointerSpeed > inertiaOptions.minSpeed\n && pointerSpeed > inertiaOptions.endSpeed);\n\n const modifierArg = {\n interaction,\n pageCoords: page,\n statuses,\n preEnd: true,\n requireEndOnly: true,\n };\n\n // smoothEnd\n if (inertiaPossible && !inertia) {\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n if (modifierResult.shouldMove && modifierResult.locked) {\n smoothEnd = true;\n }\n }\n\n if (!(inertia || smoothEnd)) { return; }\n\n utils.copyCoords(status.upCoords, interaction.curCoords);\n\n interaction.pointers[0] = status.startEvent =\n new InteractEvent(interaction, event, interaction.prepared.name, 'inertiastart', interaction.element);\n\n status.t0 = now;\n\n status.active = true;\n status.allowResume = inertiaOptions.allowResume;\n interaction.simulation = status;\n\n target.fire(status.startEvent);\n\n if (inertia) {\n status.vx0 = interaction.pointerDelta.client.vx;\n status.vy0 = interaction.pointerDelta.client.vy;\n status.v0 = pointerSpeed;\n\n calcInertia(interaction, status);\n\n utils.extend(page, interaction.curCoords.page);\n\n page.x += status.xe;\n page.y += status.ye;\n\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n status.modifiedXe += modifierResult.dx;\n status.modifiedYe += modifierResult.dy;\n\n status.i = animationFrame.request(interaction.boundInertiaFrame);\n }\n else {\n status.smoothEnd = true;\n status.xe = modifierResult.dx;\n status.ye = modifierResult.dy;\n\n status.sx = status.sy = 0;\n\n status.i = animationFrame.request(interaction.boundSmoothEndFrame);\n }\n});\n\nInteraction.signals.on('stop-active', function ({ interaction }) {\n const status = interaction.inertiaStatus;\n\n if (status.active) {\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n }\n});\n\nfunction calcInertia (interaction, status) {\n const inertiaOptions = interaction.target.options[interaction.prepared.name].inertia;\n const lambda = inertiaOptions.resistance;\n const inertiaDur = -Math.log(inertiaOptions.endSpeed / status.v0) / lambda;\n\n status.x0 = interaction.prevEvent.pageX;\n status.y0 = interaction.prevEvent.pageY;\n status.t0 = status.startEvent.timeStamp / 1000;\n status.sx = status.sy = 0;\n\n status.modifiedXe = status.xe = (status.vx0 - inertiaDur) / lambda;\n status.modifiedYe = status.ye = (status.vy0 - inertiaDur) / lambda;\n status.te = inertiaDur;\n\n status.lambda_v0 = lambda / status.v0;\n status.one_ve_v0 = 1 - inertiaOptions.endSpeed / status.v0;\n}\n\nfunction inertiaFrame () {\n updateInertiaCoords(this);\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n\n const status = this.inertiaStatus;\n const options = this.target.options[this.prepared.name].inertia;\n const lambda = options.resistance;\n const t = new Date().getTime() / 1000 - status.t0;\n\n if (t < status.te) {\n\n const progress = 1 - (Math.exp(-lambda * t) - status.lambda_v0) / status.one_ve_v0;\n\n if (status.modifiedXe === status.xe && status.modifiedYe === status.ye) {\n status.sx = status.xe * progress;\n status.sy = status.ye * progress;\n }\n else {\n const quadPoint = utils.getQuadraticCurvePoint(0, 0,\n status.xe,\n status.ye,\n status.modifiedXe,\n status.modifiedYe,\n progress);\n\n status.sx = quadPoint.x;\n status.sy = quadPoint.y;\n }\n\n this.doMove();\n\n status.i = animationFrame.request(this.boundInertiaFrame);\n }\n else {\n status.sx = status.modifiedXe;\n status.sy = status.modifiedYe;\n\n this.doMove();\n this.end(status.startEvent);\n status.active = false;\n this.simulation = null;\n }\n\n utils.copyCoords(this.prevCoords, this.curCoords);\n}\n\nfunction smoothEndFrame () {\n updateInertiaCoords(this);\n\n const status = this.inertiaStatus;\n const t = new Date().getTime() - status.t0;\n const duration = this.target.options[this.prepared.name].inertia.smoothEndDuration;\n\n if (t < duration) {\n status.sx = utils.easeOutQuad(t, 0, status.xe, duration);\n status.sy = utils.easeOutQuad(t, 0, status.ye, duration);\n\n this.pointerMove(status.startEvent, status.startEvent);\n\n status.i = animationFrame.request(this.boundSmoothEndFrame);\n }\n else {\n status.sx = status.xe;\n status.sy = status.ye;\n\n this.pointerMove(status.startEvent, status.startEvent);\n this.end(status.startEvent);\n\n status.smoothEnd =\n status.active = false;\n this.simulation = null;\n }\n}\n\nfunction updateInertiaCoords (interaction) {\n const status = interaction.inertiaStatus;\n\n // return if inertia isn't running\n if (!status.active) { return; }\n\n const pageUp = status.upCoords.page;\n const clientUp = status.upCoords.client;\n\n utils.setCoords(interaction.curCoords, [ {\n pageX : pageUp.x + status.sx,\n pageY : pageUp.y + status.sy,\n clientX: clientUp.x + status.sx,\n clientY: clientUp.y + status.sy,\n } ]);\n}\n","const browser = require('./utils/browser');\nconst events = require('./utils/events');\nconst utils = require('./utils');\nconst scope = require('./scope');\nconst Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\n\nconst globalEvents = {};\n\n/*\\\n * interact\n [ method ]\n *\n * The methods of this variable can be used to set elements as\n * interactables and also to change various default settings.\n *\n * Calling it as a function and passing an element or a valid CSS selector\n * string returns an Interactable object which has various methods to\n * configure it.\n *\n - element (Element | string) The HTML or SVG Element to interact with or CSS selector\n = (object) An @Interactable\n *\n > Usage\n | interact('#draggable').draggable(true);\n |\n | var rectables = interact('rect');\n | rectables\n | .gesturable(true)\n | .on('gesturemove', function (event) {\n | // ...\n | });\n\\*/\nfunction interact (element, options) {\n let interactable = scope.interactables.get(element, options);\n\n if (!interactable) {\n interactable = new Interactable(element, options);\n interactable.events.global = globalEvents;\n }\n\n return interactable;\n}\n\n/*\\\n * interact.isSet\n [ method ]\n *\n * Check if an element has been set\n - element (Element) The Element being searched for\n = (boolean) Indicates if the element or CSS selector was previously passed to interact\n\\*/\ninteract.isSet = function (element, options) {\n return scope.interactables.indexOfElement(element, options && options.context) !== -1;\n};\n\n/*\\\n * interact.on\n [ method ]\n *\n * Adds a global listener for an InteractEvent or adds a DOM event to\n * `document`\n *\n - type (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) interact\n\\*/\ninteract.on = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.on(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.on(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n // if it is an InteractEvent type, add listener to globalEvents\n if (utils.contains(Interactable.eventTypes, type)) {\n // if this type of event was never bound\n if (!globalEvents[type]) {\n globalEvents[type] = [listener];\n }\n else {\n globalEvents[type].push(listener);\n }\n }\n // If non InteractEvent type, addEventListener to document\n else {\n events.add(scope.document, type, listener, { options });\n }\n\n return interact;\n};\n\n/*\\\n * interact.off\n [ method ]\n *\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n - type (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) interact\n \\*/\ninteract.off = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.off(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.off(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n if (!utils.contains(Interactable.eventTypes, type)) {\n events.remove(scope.document, type, listener, options);\n }\n else {\n let index;\n\n if (type in globalEvents\n && (index = utils.indexOf(globalEvents[type], listener)) !== -1) {\n globalEvents[type].splice(index, 1);\n }\n }\n\n return interact;\n};\n\n/*\\\n * interact.debug\n [ method ]\n *\n * Returns an object which exposes internal data\n = (object) An object with properties that outline the current state and expose internal functions and variables\n\\*/\ninteract.debug = function () {\n return scope;\n};\n\n// expose the functions used to calculate multi-touch properties\ninteract.getPointerAverage = utils.pointerAverage;\ninteract.getTouchBBox = utils.touchBBox;\ninteract.getTouchDistance = utils.touchDistance;\ninteract.getTouchAngle = utils.touchAngle;\n\ninteract.getElementRect = utils.getElementRect;\ninteract.getElementClientRect = utils.getElementClientRect;\ninteract.matchesSelector = utils.matchesSelector;\ninteract.closest = utils.closest;\n\n/*\\\n * interact.supportsTouch\n [ method ]\n *\n = (boolean) Whether or not the browser supports touch input\n\\*/\ninteract.supportsTouch = function () {\n return browser.supportsTouch;\n};\n\n/*\\\n * interact.supportsPointerEvent\n [ method ]\n *\n = (boolean) Whether or not the browser supports PointerEvents\n\\*/\ninteract.supportsPointerEvent = function () {\n return browser.supportsPointerEvent;\n};\n\n/*\\\n * interact.stop\n [ method ]\n *\n * Cancels all interactions (end events are not fired)\n *\n - event (Event) An event on which to call preventDefault()\n = (object) interact\n\\*/\ninteract.stop = function (event) {\n for (let i = scope.interactions.length - 1; i >= 0; i--) {\n scope.interactions[i].stop(event);\n }\n\n return interact;\n};\n\n/*\\\n * interact.pointerMoveTolerance\n [ method ]\n * Returns or sets the distance the pointer must be moved before an action\n * sequence occurs. This also affects tolerance for tap events.\n *\n - newValue (number) #optional The movement from the start position must be greater than this value\n = (number | Interactable) The current setting or interact\n\\*/\ninteract.pointerMoveTolerance = function (newValue) {\n if (utils.is.number(newValue)) {\n Interaction.pointerMoveTolerance = newValue;\n\n return this;\n }\n\n return Interaction.pointerMoveTolerance;\n};\n\ninteract.addDocument = scope.addDocument;\ninteract.removeDocument = scope.removeDocument;\n\nscope.interact = interact;\n\nmodule.exports = interact;\n","const Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\nconst scope = require('./scope');\nconst is = require('./utils/is');\nconst events = require('./utils/events');\n\nconst { nodeContains, matchesSelector } = require('./utils/domUtils');\n\n/*\\\n * Interactable.preventDefault\n [ method ]\n *\n * Returns or sets whether to prevent the browser's default behaviour\n * in response to pointer events. Can be set to:\n * - `'always'` to always prevent\n * - `'never'` to never prevent\n * - `'auto'` to let interact.js try to determine what would be best\n *\n - newValue (string) #optional `true`, `false` or `'auto'`\n = (string | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.preventDefault = function (newValue) {\n if (/^(always|never|auto)$/.test(newValue)) {\n this.options.preventDefault = newValue;\n return this;\n }\n\n if (is.bool(newValue)) {\n this.options.preventDefault = newValue? 'always' : 'never';\n return this;\n }\n\n return this.options.preventDefault;\n};\n\nInteractable.prototype.checkAndPreventDefault = function (event) {\n const setting = this.options.preventDefault;\n\n if (setting === 'never') { return; }\n\n if (setting === 'always') {\n event.preventDefault();\n return;\n }\n\n // setting === 'auto'\n\n // don't preventDefault if the browser supports passiveEvents\n // CSS touch-action and user-selecct should be used instead\n if (events.supportsOptions) {\n return;\n }\n\n // don't preventDefault of pointerdown events\n if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) {\n return;\n }\n\n // don't preventDefault on editable elements\n if (is.element(event.target)\n && matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) {\n return;\n }\n\n event.preventDefault();\n};\n\nfunction onInteractionEvent ({ interaction, event }) {\n if (interaction.target) {\n interaction.target.checkAndPreventDefault(event);\n }\n}\n\nfor (const eventSignal of ['down', 'move', 'up', 'cancel']) {\n Interaction.signals.on(eventSignal, onInteractionEvent);\n}\n\n// prevent native HTML5 drag on interact.js target elements\nInteraction.docEvents.dragstart = function preventNativeDrag (event) {\n for (const interaction of scope.interactions) {\n\n if (interaction.element\n && (interaction.element === event.target\n || nodeContains(interaction.element, event.target))) {\n\n interaction.target.checkAndPreventDefault(event);\n return;\n }\n }\n};\n","const scope = require('./scope');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst iFinder = require('./utils/interactionFinder');\nconst pointerEvents = require('./pointerEvents/base');\n\nconst { window } = require('./utils/window');\n\nconst toString = Object.prototype.toString;\n\nif (!window.Array.isArray) {\n window.Array.isArray = function (obj) {\n return toString.call(obj) === '[object Array]';\n };\n}\n\nif (!String.prototype.trim) {\n String.prototype.trim = function () {\n return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n };\n}\n\n// http://www.quirksmode.org/dom/events/click.html\n// >Events leading to dblclick\n//\n// IE8 doesn't fire down event before dblclick.\n// This workaround tries to fire a tap and doubletap after dblclick\nfunction onIE8Dblclick (event) {\n const eventTarget = event.target;\n const interaction = iFinder.search(event, event.type, eventTarget);\n\n if (!interaction) { return; }\n\n if (interaction.prevTap\n && event.clientX === interaction.prevTap.clientX\n && event.clientY === interaction.prevTap.clientY\n && eventTarget === interaction.prevTap.target) {\n\n interaction.downTargets[0] = eventTarget;\n interaction.downTimes [0] = new Date().getTime();\n\n pointerEvents.fire({\n interaction,\n event,\n eventTarget,\n pointer: event,\n type: 'tap',\n });\n }\n}\n\nif (browser.isIE8) {\n const selectFix = function (event) {\n for (const interaction of scope.interactions) {\n if (interaction.interacting()) {\n interaction.target.checkAndPreventDefault(event);\n }\n }\n };\n\n const onDocIE8 = function onDocIE8 ({ doc, win }, signalName) {\n const eventMethod = signalName.indexOf('listen') === 0\n ? events.add : events.remove;\n\n // For IE's lack of Event#preventDefault\n eventMethod(doc, 'selectstart', selectFix);\n\n if (pointerEvents) {\n eventMethod(doc, 'dblclick', onIE8Dblclick);\n }\n };\n\n scope.signals.on('add-document' , onDocIE8);\n scope.signals.on('remove-document', onDocIE8);\n}\n\nmodule.exports = null;\n","const InteractEvent = require('../InteractEvent');\nconst Interaction = require('../Interaction');\nconst extend = require('../utils/extend');\n\nconst modifiers = {\n names: [],\n\n setOffsets: function (arg) {\n const { interaction, pageCoords: page } = arg;\n const { target, element, startOffset } = interaction;\n const rect = target.getRect(element);\n\n if (rect) {\n startOffset.left = page.x - rect.left;\n startOffset.top = page.y - rect.top;\n\n startOffset.right = rect.right - page.x;\n startOffset.bottom = rect.bottom - page.y;\n\n if (!('width' in rect)) { rect.width = rect.right - rect.left; }\n if (!('height' in rect)) { rect.height = rect.bottom - rect.top ; }\n }\n else {\n startOffset.left = startOffset.top = startOffset.right = startOffset.bottom = 0;\n }\n\n arg.rect = rect;\n arg.interactable = target;\n arg.element = element;\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n\n arg.options = target.options[interaction.prepared.name][modifierName];\n\n if (!arg.options) {\n continue;\n }\n\n interaction.modifierOffsets[modifierName] = modifiers[modifierName].setOffset(arg);\n }\n },\n\n setAll: function (arg) {\n const { interaction, statuses, preEnd, requireEndOnly } = arg;\n const coords = extend({}, arg.pageCoords);\n const result = {\n dx: 0,\n dy: 0,\n changed: false,\n locked: false,\n shouldMove: true,\n };\n\n for (const modifierName of modifiers.names) {\n const modifier = modifiers[modifierName];\n const options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!shouldDo(options, preEnd, requireEndOnly)) { continue; }\n\n arg.status = arg.status = statuses[modifierName];\n arg.options = options;\n arg.offset = arg.interaction.modifierOffsets[modifierName];\n\n modifier.set(arg);\n\n if (arg.status.locked) {\n coords.x += arg.status.dx;\n coords.y += arg.status.dy;\n\n result.dx += arg.status.dx;\n result.dy += arg.status.dy;\n\n result.locked = true;\n }\n }\n\n // a move should be fired if:\n // - there are no modifiers enabled,\n // - no modifiers are \"locked\" i.e. have changed the pointer's coordinates, or\n // - the locked coords have changed since the last pointer move\n result.shouldMove = !arg.status || !result.locked || arg.status.changed;\n\n return result;\n },\n\n resetStatuses: function (statuses) {\n for (const modifierName of modifiers.names) {\n const status = statuses[modifierName] || {};\n\n status.dx = status.dy = 0;\n status.modifiedX = status.modifiedY = NaN;\n status.locked = false;\n status.changed = true;\n\n statuses[modifierName] = status;\n }\n\n return statuses;\n },\n\n start: function ({ interaction }, signalName) {\n const arg = {\n interaction,\n pageCoords: (signalName === 'action-resume' ?\n interaction.curCoords : interaction.startCoords).page,\n startOffset: interaction.startOffset,\n statuses: interaction.modifierStatuses,\n preEnd: false,\n requireEndOnly: false,\n };\n\n modifiers.setOffsets(arg);\n modifiers.resetStatuses(arg.statuses);\n\n arg.pageCoords = extend({}, interaction.startCoords.page);\n interaction.modifierResult = modifiers.setAll(arg);\n },\n};\n\nInteraction.signals.on('new', function (interaction) {\n interaction.startOffset = { left: 0, right: 0, top: 0, bottom: 0 };\n interaction.modifierOffsets = {};\n interaction.modifierStatuses = modifiers.resetStatuses({});\n interaction.modifierResult = null;\n});\n\nInteraction.signals.on('action-start' , modifiers.start);\nInteraction.signals.on('action-resume', modifiers.start);\n\nInteraction.signals.on('before-action-move', function ({ interaction, preEnd, interactingBeforeMove }) {\n const modifierResult = modifiers.setAll({\n interaction,\n preEnd,\n pageCoords: interaction.curCoords.page,\n statuses: interaction.modifierStatuses,\n requireEndOnly: false,\n });\n\n // don't fire an action move if a modifier would keep the event in the same\n // cordinates as before\n if (!modifierResult.shouldMove && interactingBeforeMove) {\n interaction._dontFireMove = true;\n }\n\n interaction.modifierResult = modifierResult;\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n for (let i = 0; i < modifiers.names.length; i++) {\n const options = interaction.target.options[interaction.prepared.name][modifiers.names[i]];\n\n // if the endOnly option is true for any modifier\n if (shouldDo(options, true, true)) {\n // fire a move event at the modified coordinates\n interaction.doMove({ event, preEnd: true });\n break;\n }\n }\n});\n\nInteractEvent.signals.on('set-xy', function (arg) {\n const { iEvent, interaction } = arg;\n const modifierArg = extend({}, arg);\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n modifierArg.options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!modifierArg.options) {\n continue;\n }\n\n const modifier = modifiers[modifierName];\n\n modifierArg.status = interaction.modifierStatuses[modifierName];\n\n iEvent[modifierName] = modifier.modifyCoords(modifierArg);\n }\n});\n\nfunction shouldDo (options, preEnd, requireEndOnly) {\n return (options && options.enabled\n && (preEnd || !options.endOnly)\n && (!requireEndOnly || options.endOnly));\n}\n\nmodule.exports = modifiers;\n","const modifiers = require('./index');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst restrict = {\n defaults: {\n enabled : false,\n endOnly : false,\n restriction: null,\n elementRect: null,\n },\n\n setOffset: function ({ rect, startOffset, options }) {\n const elementRect = options && options.elementRect;\n const offset = {};\n\n if (rect && elementRect) {\n offset.left = startOffset.left - (rect.width * elementRect.left);\n offset.top = startOffset.top - (rect.height * elementRect.top);\n\n offset.right = startOffset.right - (rect.width * (1 - elementRect.right));\n offset.bottom = startOffset.bottom - (rect.height * (1 - elementRect.bottom));\n }\n else {\n offset.left = offset.top = offset.right = offset.bottom = 0;\n }\n\n return offset;\n },\n\n set: function ({ pageCoords, interaction, status, options }) {\n if (!options) { return status; }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n\n const restriction = getRestrictionRect(options.restriction, interaction, page);\n\n if (!restriction) { return status; }\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n const rect = restriction;\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n const offset = interaction.modifierOffsets.restrict;\n\n // object is assumed to have\n // x, y, width, height or\n // left, top, right, bottom\n if ('x' in restriction && 'y' in restriction) {\n modifiedX = Math.max(Math.min(rect.x + rect.width - offset.right , page.x), rect.x + offset.left);\n modifiedY = Math.max(Math.min(rect.y + rect.height - offset.bottom, page.y), rect.y + offset.top );\n }\n else {\n modifiedX = Math.max(Math.min(rect.right - offset.right , page.x), rect.left + offset.left);\n modifiedY = Math.max(Math.min(rect.bottom - offset.bottom, page.y), rect.top + offset.top );\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const elementRect = options && options.elementRect;\n\n if (options && options.enabled\n && !(phase === 'start' && elementRect && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n getRestrictionRect,\n};\n\nfunction getRestrictionRect (value, interaction, page) {\n if (utils.is.function(value)) {\n return utils.resolveRectLike(value, interaction.target, interaction.element, [page.x, page.y, interaction]);\n } else {\n return utils.resolveRectLike(value, interaction.target, interaction.element);\n }\n}\n\nmodifiers.restrict = restrict;\nmodifiers.names.push('restrict');\n\ndefaultOptions.perAction.restrict = restrict.defaults;\n\nmodule.exports = restrict;\n","// This module adds the options.resize.restrictEdges setting which sets min and\n// max for the top, left, bottom and right edges of the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictEdges: {\n// inner: { top: 200, left: 200, right: 400, bottom: 400 },\n// outer: { top: 0, left: 0, right: 600, bottom: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst { getRestrictionRect } = require('./restrict');\n\nconst noInner = { top: +Infinity, left: +Infinity, bottom: -Infinity, right: -Infinity };\nconst noOuter = { top: -Infinity, left: -Infinity, bottom: +Infinity, right: +Infinity };\n\nconst restrictEdges = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n offset: null,\n },\n\n setOffset: function ({ interaction, startOffset, options }) {\n if (!options) {\n return utils.extend({}, startOffset);\n }\n\n const offset = getRestrictionRect(options.offset, interaction, interaction.startCoords.page);\n\n if (offset) {\n return {\n top: startOffset.top + offset.y,\n left: startOffset.left + offset.x,\n bottom: startOffset.bottom + offset.y,\n right: startOffset.right + offset.x,\n };\n }\n\n return startOffset;\n },\n\n set: function ({ pageCoords, interaction, status, offset, options }) {\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n const inner = rectUtils.xywhToTlbr(getRestrictionRect(options.inner, interaction, page)) || noInner;\n const outer = rectUtils.xywhToTlbr(getRestrictionRect(options.outer, interaction, page)) || noOuter;\n\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n if (edges.top) {\n modifiedY = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top);\n }\n else if (edges.bottom) {\n modifiedY = Math.max(Math.min(outer.bottom - offset.bottom, page.y), inner.bottom - offset.bottom);\n }\n if (edges.left) {\n modifiedX = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left);\n }\n else if (edges.right) {\n modifiedX = Math.max(Math.min(outer.right - offset.right, page.x), inner.right - offset.right);\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n if (options && options.enabled\n && !(phase === 'start' && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n noInner,\n noOuter,\n getRestrictionRect,\n};\n\nmodifiers.restrictEdges = restrictEdges;\nmodifiers.names.push('restrictEdges');\n\ndefaultOptions.perAction.restrictEdges = restrictEdges.defaults;\nresize.defaults.restrictEdges = restrictEdges.defaults;\n\nmodule.exports = restrictEdges;\n","// This module adds the options.resize.restrictSize setting which sets min and\n// max width and height for the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictSize: {\n// min: { width: -600, height: -600 },\n// max: { width: 600, height: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst restrictEdges = require('./restrictEdges');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst noMin = { width: -Infinity, height: -Infinity };\nconst noMax = { width: +Infinity, height: +Infinity };\n\nconst restrictSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n },\n\n setOffset: function ({ interaction }) {\n return interaction.startOffset;\n },\n\n set: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const rect = rectUtils.xywhToTlbr(interaction.resizeRects.inverted);\n\n const minSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.min, interaction)) || noMin;\n const maxSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.max, interaction)) || noMax;\n\n arg.options = {\n enabled: options.enabled,\n endOnly: options.endOnly,\n inner: utils.extend({}, restrictEdges.noInner),\n outer: utils.extend({}, restrictEdges.noOuter),\n };\n\n if (edges.top) {\n arg.options.inner.top = rect.bottom - minSize.height;\n arg.options.outer.top = rect.bottom - maxSize.height;\n }\n else if (edges.bottom) {\n arg.options.inner.bottom = rect.top + minSize.height;\n arg.options.outer.bottom = rect.top + maxSize.height;\n }\n if (edges.left) {\n arg.options.inner.left = rect.right - minSize.width;\n arg.options.outer.left = rect.right - maxSize.width;\n }\n else if (edges.right) {\n arg.options.inner.right = rect.left + minSize.width;\n arg.options.outer.right = rect.left + maxSize.width;\n }\n\n restrictEdges.set(arg);\n },\n\n modifyCoords: restrictEdges.modifyCoords,\n};\n\nmodifiers.restrictSize = restrictSize;\nmodifiers.names.push('restrictSize');\n\ndefaultOptions.perAction.restrictSize = restrictSize.defaults;\nresize.defaults.restrictSize = restrictSize.defaults;\n\nmodule.exports = restrictSize;\n","const modifiers = require('./index');\nconst interact = require('../interact');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst snap = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n\n relativePoints: null,\n },\n\n setOffset: function ({ interaction, interactable, element, rect, startOffset, options }) {\n const offsets = [];\n const optionsOrigin = utils.rectToXY(utils.resolveRectLike(options.origin));\n const origin = optionsOrigin || utils.getOriginXY(interactable, element, interaction.prepared.name);\n options = options || interactable.options[interaction.prepared.name].snap || {};\n\n let snapOffset;\n\n if (options.offset === 'startCoords') {\n snapOffset = {\n x: interaction.startCoords.page.x - origin.x,\n y: interaction.startCoords.page.y - origin.y,\n };\n }\n else {\n const offsetRect = utils.resolveRectLike(options.offset, interactable, element, [interaction]);\n\n snapOffset = utils.rectToXY(offsetRect) || { x: 0, y: 0 };\n }\n\n if (rect && options.relativePoints && options.relativePoints.length) {\n for (const { x: relativeX, y: relativeY } of options.relativePoints) {\n offsets.push({\n x: startOffset.left - (rect.width * relativeX) + snapOffset.x,\n y: startOffset.top - (rect.height * relativeY) + snapOffset.y,\n });\n }\n }\n else {\n offsets.push(snapOffset);\n }\n\n return offsets;\n },\n\n set: function ({ interaction, pageCoords, status, options, offset: offsets }) {\n const targets = [];\n let target;\n let page;\n let i;\n\n if (status.useStatusXY) {\n page = { x: status.x, y: status.y };\n }\n else {\n const origin = utils.getOriginXY(interaction.target, interaction.element, interaction.prepared.name);\n\n page = utils.extend({}, pageCoords);\n\n page.x -= origin.x;\n page.y -= origin.y;\n }\n\n status.realX = page.x;\n status.realY = page.y;\n\n let len = options.targets? options.targets.length : 0;\n\n for (const { x: offsetX, y: offsetY } of offsets) {\n const relativeX = page.x - offsetX;\n const relativeY = page.y - offsetY;\n\n for (const snapTarget of options.targets) {\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n targets.push({\n x: utils.is.number(target.x) ? (target.x + offsetX) : relativeX,\n y: utils.is.number(target.y) ? (target.y + offsetY) : relativeY,\n\n range: utils.is.number(target.range)? target.range: options.range,\n });\n }\n }\n\n const closest = {\n target: null,\n inRange: false,\n distance: 0,\n range: 0,\n dx: 0,\n dy: 0,\n };\n\n for (i = 0, len = targets.length; i < len; i++) {\n target = targets[i];\n\n const range = target.range;\n const dx = target.x - page.x;\n const dy = target.y - page.y;\n const distance = utils.hypot(dx, dy);\n let inRange = distance <= range;\n\n // Infinite targets count as being out of range\n // compared to non infinite ones that are in range\n if (range === Infinity && closest.inRange && closest.range !== Infinity) {\n inRange = false;\n }\n\n if (!closest.target || (inRange\n // is the closest target in range?\n ? (closest.inRange && range !== Infinity\n // the pointer is relatively deeper in this target\n ? distance / range < closest.distance / closest.range\n // this target has Infinite range and the closest doesn't\n : (range === Infinity && closest.range !== Infinity)\n // OR this target is closer that the previous closest\n || distance < closest.distance)\n // The other is not in range and the pointer is closer to this target\n : (!closest.inRange && distance < closest.distance))) {\n\n closest.target = target;\n closest.distance = distance;\n closest.range = range;\n closest.inRange = inRange;\n closest.dx = dx;\n closest.dy = dy;\n\n status.range = range;\n }\n }\n\n let snapChanged;\n\n if (closest.target) {\n snapChanged = (status.modifiedX !== closest.target.x || status.modifiedY !== closest.target.y);\n\n status.modifiedX = closest.target.x;\n status.modifiedY = closest.target.y;\n }\n else {\n snapChanged = true;\n\n status.modifiedX = NaN;\n status.modifiedY = NaN;\n }\n\n status.dx = closest.dx;\n status.dy = closest.dy;\n\n status.changed = (snapChanged || (closest.inRange && !status.locked));\n status.locked = closest.inRange;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const relativePoints = options && options.relativePoints;\n\n if (options && options.enabled\n && !(phase === 'start' && relativePoints && relativePoints.length)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n }\n\n return {\n range : status.range,\n locked : status.locked,\n x : status.modifiedX,\n y : status.modifiedY,\n realX : status.realX,\n realY : status.realY,\n dx : status.dx,\n dy : status.dy,\n };\n }\n },\n};\n\ninteract.createSnapGrid = function (grid) {\n return function (x, y) {\n const limits = grid.limits || {\n left : -Infinity,\n right : Infinity,\n top : -Infinity,\n bottom: Infinity,\n };\n let offsetX = 0;\n let offsetY = 0;\n\n if (utils.is.object(grid.offset)) {\n offsetX = grid.offset.x;\n offsetY = grid.offset.y;\n }\n\n const gridx = Math.round((x - offsetX) / grid.x);\n const gridy = Math.round((y - offsetY) / grid.y);\n\n const newX = Math.max(limits.left, Math.min(limits.right , gridx * grid.x + offsetX));\n const newY = Math.max(limits.top , Math.min(limits.bottom, gridy * grid.y + offsetY));\n\n return {\n x: newX,\n y: newY,\n range: grid.range,\n };\n };\n};\n\nmodifiers.snap = snap;\nmodifiers.names.push('snap');\n\ndefaultOptions.perAction.snap = snap.defaults;\n\nmodule.exports = snap;\n","// This module allows snapping of the size of targets during resize\n// interactions.\n\nconst modifiers = require('./index');\nconst snap = require('./snap');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\nconst utils = require('../utils/');\n\nconst snapSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n },\n\n setOffset: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.edges;\n\n if (!edges) { return; }\n\n arg.options = {\n relativePoints: [{\n x: edges.left? 0 : 1,\n y: edges.top ? 0 : 1,\n }],\n origin: { x: 0, y: 0 },\n offset: 'self',\n range: options.range,\n };\n\n const offsets = snap.setOffset(arg);\n arg.options = options;\n\n return offsets;\n },\n\n set: function (arg) {\n const { interaction, options, offset, pageCoords } = arg;\n const page = utils.extend({}, pageCoords);\n const relativeX = page.x - offset[0].x;\n const relativeY = page.y - offset[0].y;\n\n arg.options = utils.extend({}, options);\n arg.options.targets = [];\n\n for (const snapTarget of options.targets) {\n let target;\n\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n if ('width' in target && 'height' in target) {\n target.x = target.width;\n target.y = target.height;\n }\n\n arg.options.targets.push(target);\n }\n\n snap.set(arg);\n },\n\n modifyCoords: function (arg) {\n const { options } = arg;\n\n arg.options = utils.extend({}, options);\n arg.options.enabled = options.enabled;\n arg.options.relativePoints = [null];\n\n snap.modifyCoords(arg);\n },\n};\n\nmodifiers.snapSize = snapSize;\nmodifiers.names.push('snapSize');\n\ndefaultOptions.perAction.snapSize = snapSize.defaults;\nresize.defaults.snapSize = snapSize.defaults;\n\nmodule.exports = snapSize;\n","const pointerUtils = require('../utils/pointerUtils');\n\nmodule.exports = class PointerEvent {\n constructor (type, pointer, event, eventTarget, interaction) {\n pointerUtils.pointerExtend(this, event);\n\n if (event !== pointer) {\n pointerUtils.pointerExtend(this, pointer);\n }\n\n this.interaction = interaction;\n\n this.timeStamp = new Date().getTime();\n this.originalEvent = event;\n this.type = type;\n this.pointerId = pointerUtils.getPointerId(pointer);\n this.pointerType = pointerUtils.getPointerType(pointer, interaction);\n this.target = eventTarget;\n this.currentTarget = null;\n\n if (type === 'tap') {\n const pointerIndex = interaction.getPointerIndex(pointer);\n this.dt = this.timeStamp - interaction.downTimes[pointerIndex];\n\n const interval = this.timeStamp - interaction.tapTime;\n\n this.double = !!(interaction.prevTap\n && interaction.prevTap.type !== 'doubletap'\n && interaction.prevTap.target === this.target\n && interval < 500);\n }\n else if (type === 'doubletap') {\n this.dt = pointer.timeStamp - interaction.tapTime;\n }\n }\n\n subtractOrigin ({ x: originX, y: originY }) {\n this.pageX -= originX;\n this.pageY -= originY;\n this.clientX -= originX;\n this.clientY -= originY;\n\n return this;\n }\n\n addOrigin ({ x: originX, y: originY }) {\n this.pageX += originX;\n this.pageY += originY;\n this.clientX += originX;\n this.clientY += originY;\n\n return this;\n }\n\n preventDefault () {\n this.originalEvent.preventDefault();\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n};\n","const PointerEvent = require('./PointerEvent');\nconst Interaction = require('../Interaction');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst defaults = require('../defaultOptions');\nconst signals = require('../utils/Signals').new();\nconst { filter } = require('../utils/arr');\n\nconst simpleSignals = [ 'down', 'up', 'cancel' ];\nconst simpleEvents = [ 'down', 'up', 'cancel' ];\n\nconst pointerEvents = {\n PointerEvent,\n fire,\n collectEventTargets,\n signals,\n defaults: {\n holdDuration: 600,\n ignoreFrom : null,\n allowFrom : null,\n origin : { x: 0, y: 0 },\n },\n types: [\n 'down',\n 'move',\n 'up',\n 'cancel',\n 'tap',\n 'doubletap',\n 'hold',\n ],\n};\n\nfunction fire (arg) {\n const {\n interaction, pointer, event, eventTarget,\n type = arg.pointerEvent.type,\n targets = collectEventTargets(arg),\n pointerEvent = new PointerEvent(type, pointer, event, eventTarget, interaction),\n } = arg;\n\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n targets,\n type,\n pointerEvent,\n };\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n\n for (const prop in target.props || {}) {\n pointerEvent[prop] = target.props[prop];\n }\n\n const origin = utils.getOriginXY(target.eventable, target.element);\n\n pointerEvent.subtractOrigin(origin);\n pointerEvent.eventable = target.eventable;\n pointerEvent.currentTarget = target.element;\n\n target.eventable.fire(pointerEvent);\n\n pointerEvent.addOrigin(origin);\n\n if (pointerEvent.immediatePropagationStopped\n || (pointerEvent.propagationStopped\n && (i + 1) < targets.length && targets[i + 1].element !== pointerEvent.currentTarget)) {\n break;\n }\n }\n\n signals.fire('fired', signalArg);\n\n if (type === 'tap') {\n // if pointerEvent should make a double tap, create and fire a doubletap\n // PointerEvent and use that as the prevTap\n const prevTap = pointerEvent.double\n ? fire({\n interaction, pointer, event, eventTarget,\n type: 'doubletap',\n })\n : pointerEvent;\n\n interaction.prevTap = prevTap;\n interaction.tapTime = prevTap.timeStamp;\n }\n\n return pointerEvent;\n}\n\nfunction collectEventTargets ({ interaction, pointer, event, eventTarget, type }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n // do not fire a tap event if the pointer was moved before being lifted\n if (type === 'tap' && (interaction.pointerWasMoved\n // or if the pointerup target is different to the pointerdown target\n || !(interaction.downTargets[pointerIndex] && interaction.downTargets[pointerIndex] === eventTarget))) {\n return [];\n }\n\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n path,\n targets: [],\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (type === 'hold') {\n signalArg.targets = filter(signalArg.targets, target =>\n target.eventable.options.holdDuration === interaction.holdTimers[pointerIndex].duration);\n }\n\n return signalArg.targets;\n}\n\nInteraction.signals.on('update-pointer-down', function ({ interaction, pointerIndex }) {\n interaction.holdTimers[pointerIndex] = { duration: Infinity, timeout: null };\n});\n\nInteraction.signals.on('remove-pointer', function ({ interaction, pointerIndex }) {\n interaction.holdTimers.splice(pointerIndex, 1);\n});\n\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget, duplicateMove }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n if (!duplicateMove && (!interaction.pointerIsDown || interaction.pointerWasMoved)) {\n if (interaction.pointerIsDown) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n\n fire({\n interaction, pointer, event, eventTarget,\n type: 'move',\n });\n }\n});\n\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget, pointerIndex }) {\n // copy event to be used in timeout for IE8\n const eventCopy = browser.isIE8? utils.extend({}, event) : event;\n\n const timer = interaction.holdTimers[pointerIndex];\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'hold',\n targets: [],\n path,\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (!signalArg.targets.length) { return; }\n\n let minDuration = Infinity;\n\n for (let i = 0; i < signalArg.targets.length; i++) {\n const target = signalArg.targets[i];\n const holdDuration = target.eventable.options.holdDuration;\n\n if (holdDuration < minDuration) {\n minDuration = holdDuration;\n }\n }\n\n timer.duration = minDuration;\n timer.timeout = setTimeout(function () {\n fire({\n interaction, eventCopy, eventTarget,\n pointer: browser.isIE8? eventCopy : pointer,\n type: 'hold',\n });\n }, minDuration);\n});\n\nInteraction.signals.on('up', ({ interaction, pointer, event, eventTarget }) => {\n if (!interaction.pointerWasMoved) {\n fire({ interaction, eventTarget, pointer, event, type: 'tap' });\n }\n});\n\n['up', 'cancel'].forEach(function (signalName) {\n Interaction.signals.on(signalName, function ({ interaction, pointerIndex }) {\n if (interaction.holdTimers[pointerIndex]) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n });\n});\n\nfunction createSignalListener (type) {\n return function ({ interaction, pointer, event, eventTarget }) {\n fire({ interaction, eventTarget, pointer, event, type });\n };\n}\n\nfor (let i = 0; i < simpleSignals.length; i++) {\n Interaction.signals.on(simpleSignals[i], createSignalListener(simpleEvents[i]));\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.prevTap = null; // the most recent tap event on this interaction\n interaction.tapTime = 0; // time of the most recent tap event\n interaction.holdTimers = []; // [{ duration, timeout }]\n});\n\ndefaults.pointerEvents = pointerEvents.defaults;\nmodule.exports = pointerEvents;\n","const pointerEvents = require('./base');\nconst Interaction = require('../Interaction');\n\npointerEvents.signals.on('new', onNew);\npointerEvents.signals.on('fired', onFired);\n\nfor (const signal of ['move', 'up', 'cancel', 'endall']) {\n Interaction.signals.on(signal, endHoldRepeat);\n}\n\nfunction onNew ({ pointerEvent }) {\n if (pointerEvent.type !== 'hold') { return; }\n\n pointerEvent.count = (pointerEvent.count || 0) + 1;\n}\n\nfunction onFired ({ interaction, pointerEvent, eventTarget, targets }) {\n if (pointerEvent.type !== 'hold' || !targets.length) { return; }\n\n // get the repeat interval from the first eventable\n const interval = targets[0].eventable.options.holdRepeatInterval;\n\n // don't repeat if the interval is 0 or less\n if (interval <= 0) { return; }\n\n // set a timeout to fire the holdrepeat event\n interaction.holdIntervalHandle = setTimeout(function () {\n pointerEvents.fire({\n interaction,\n eventTarget,\n type: 'hold',\n pointer: pointerEvent,\n event: pointerEvent,\n });\n }, interval);\n}\n\nfunction endHoldRepeat ({ interaction }) {\n // set the interaction's holdStopTime property\n // to stop further holdRepeat events\n if (interaction.holdIntervalHandle) {\n clearInterval(interaction.holdIntervalHandle);\n interaction.holdIntervalHandle = null;\n }\n}\n\n// don't repeat by default\npointerEvents.defaults.holdRepeatInterval = 0;\npointerEvents.types.push('holdrepeat');\n\nmodule.exports = {\n onNew,\n onFired,\n endHoldRepeat,\n};\n","const pointerEvents = require('./base');\nconst Interactable = require('../Interactable');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\nconst scope = require('../scope');\nconst extend = require('../utils/extend');\nconst { merge } = require('../utils/arr');\n\npointerEvents.signals.on('collect-targets', function ({ targets, element, type, eventTarget }) {\n function collectSelectors (interactable, selector, context) {\n const els = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && is.element(element)\n && domUtils.matchesSelector(element, selector, els)\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n const interactable = scope.interactables.get(element);\n\n if (interactable) {\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n scope.interactables.forEachSelector(collectSelectors, element);\n});\n\nInteractable.signals.on('new', function ({ interactable }) {\n interactable.events.getRect = function (element) {\n return interactable.getRect(element);\n };\n});\n\nInteractable.signals.on('set', function ({ interactable, options }) {\n extend(interactable.events.options, pointerEvents.defaults);\n extend(interactable.events.options, options);\n});\n\nmerge(Interactable.eventTypes, pointerEvents.types);\n\nInteractable.prototype.pointerEvents = function (options) {\n extend(this.events.options, options);\n\n return this;\n};\n\nconst __backCompatOption = Interactable.prototype._backCompatOption;\n\nInteractable.prototype._backCompatOption = function (optionName, newValue) {\n const ret = __backCompatOption.call(this, optionName, newValue);\n\n if (ret === this) {\n this.events.options[optionName] = newValue;\n }\n\n return ret;\n};\n\nInteractable.settingsMethods.push('pointerEvents');\n","const utils = require('./utils');\nconst events = require('./utils/events');\nconst signals = require('./utils/Signals').new();\n\nconst scope = {\n signals,\n events,\n utils,\n\n // main document\n document: require('./utils/domObjects').document,\n // all documents being listened to\n documents: [],\n\n addDocument: function (doc, win) {\n // do nothing if document is already known\n if (utils.contains(scope.documents, doc)) { return false; }\n\n win = win || scope.getWindow(doc);\n\n scope.documents.push(doc);\n events.documents.push(doc);\n\n // don't add an unload event for the main document\n // so that the page may be cached in browser history\n if (doc !== scope.document) {\n events.add(win, 'unload', scope.onWindowUnload);\n }\n\n signals.fire('add-document', { doc, win });\n },\n\n removeDocument: function (doc, win) {\n const index = utils.indexOf(scope.documents, doc);\n\n win = win || scope.getWindow(doc);\n\n events.remove(win, 'unload', scope.onWindowUnload);\n\n scope.documents.splice(index, 1);\n events.documents.splice(index, 1);\n\n signals.fire('remove-document', { win, doc });\n },\n\n onWindowUnload: function () {\n scope.removeDocument(this.document, this);\n },\n};\n\nmodule.exports = scope;\n","const { indexOf } = require('./arr');\n\nclass Signals {\n constructor () {\n this.listeners = {\n // signalName: [listeners],\n };\n }\n\n on (name, listener) {\n if (!this.listeners[name]) {\n this.listeners[name] = [listener];\n return;\n }\n\n this.listeners[name].push(listener);\n }\n\n off (name, listener) {\n if (!this.listeners[name]) { return; }\n\n const index = indexOf(this.listeners[name], listener);\n\n if (index !== -1) {\n this.listeners[name].splice(index, 1);\n }\n }\n\n fire (name, arg) {\n const targetListeners = this.listeners[name];\n\n if (!targetListeners) { return; }\n\n for (let i = 0; i < targetListeners.length; i++) {\n if (targetListeners[i](arg, name) === false) {\n return;\n }\n }\n }\n}\n\nSignals.new = function () {\n return new Signals();\n};\n\nmodule.exports = Signals;\n","function indexOf (array, target) {\n for (let i = 0, len = array.length; i < len; i++) {\n if (array[i] === target) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction contains (array, target) {\n return indexOf(array, target) !== -1;\n}\n\nfunction merge (target, source) {\n for (let i = 0; i < source.length; i++) {\n target.push(source[i]);\n }\n\n return target;\n}\n\nfunction filter (array, test) {\n const result = [];\n\n for (let i = 0; i < array.length; i++) {\n if (test(array[i])) {\n result.push(array[i]);\n }\n }\n\n return result;\n}\n\nmodule.exports = {\n indexOf,\n contains,\n merge,\n filter,\n};\n","const { window } = require('./window');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst Element = domObjects.Element;\nconst navigator = window.navigator;\n\nconst browser = {\n // Does the browser support touch input?\n supportsTouch: !!(('ontouchstart' in window) || is.function(window.DocumentTouch)\n && domObjects.document instanceof window.DocumentTouch),\n\n // Does the browser support PointerEvents\n supportsPointerEvent: !!domObjects.PointerEvent,\n\n isIE8: ('attachEvent' in window) && !('addEventListener' in window),\n\n // Opera Mobile must be handled differently\n isOperaMobile: (navigator.appName === 'Opera'\n && browser.supportsTouch\n && navigator.userAgent.match('Presto')),\n\n // scrolling doesn't change the result of getClientRects on iOS 7\n isIOS7: (/iP(hone|od|ad)/.test(navigator.platform)\n && /OS 7[^\\d]/.test(navigator.appVersion)),\n\n isIe9OrOlder: /MSIE (8|9)/.test(navigator.userAgent),\n\n // prefix matchesSelector\n prefixedMatchesSelector: 'matches' in Element.prototype\n ? 'matches': 'webkitMatchesSelector' in Element.prototype\n ? 'webkitMatchesSelector': 'mozMatchesSelector' in Element.prototype\n ? 'mozMatchesSelector': 'oMatchesSelector' in Element.prototype\n ? 'oMatchesSelector': 'msMatchesSelector',\n\n useMatchesSelectorPolyfill: false,\n\n pEventTypes: (domObjects.PointerEvent\n ? (domObjects.PointerEvent === window.MSPointerEvent\n ? {\n up: 'MSPointerUp',\n down: 'MSPointerDown',\n over: 'mouseover',\n out: 'mouseout',\n move: 'MSPointerMove',\n cancel: 'MSPointerCancel',\n }\n : {\n up: 'pointerup',\n down: 'pointerdown',\n over: 'pointerover',\n out: 'pointerout',\n move: 'pointermove',\n cancel: 'pointercancel',\n })\n : null),\n\n // because Webkit and Opera still use 'mousewheel' event type\n wheelEvent: 'onmousewheel' in domObjects.document? 'mousewheel': 'wheel',\n\n};\n\nbrowser.useMatchesSelectorPolyfill = !is.function(Element.prototype[browser.prefixedMatchesSelector]);\n\nmodule.exports = browser;\n","const domObjects = {};\nconst win = require('./window').window;\n\nfunction blank () {}\n\ndomObjects.document = win.document;\ndomObjects.DocumentFragment = win.DocumentFragment || blank;\ndomObjects.SVGElement = win.SVGElement || blank;\ndomObjects.SVGSVGElement = win.SVGSVGElement || blank;\ndomObjects.SVGElementInstance = win.SVGElementInstance || blank;\ndomObjects.Element = win.Element || blank;\ndomObjects.HTMLElement = win.HTMLElement || domObjects.Element;\n\ndomObjects.Event = win.Event;\ndomObjects.Touch = win.Touch || blank;\ndomObjects.PointerEvent = (win.PointerEvent || win.MSPointerEvent);\n\nmodule.exports = domObjects;\n","const win = require('./window');\nconst browser = require('./browser');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst domUtils = {\n nodeContains: function (parent, child) {\n while (child) {\n if (child === parent) {\n return true;\n }\n\n child = child.parentNode;\n }\n\n return false;\n },\n\n closest: function (element, selector) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) { return element; }\n\n element = domUtils.parentNode(element);\n }\n\n return null;\n },\n\n parentNode: function (node) {\n let parent = node.parentNode;\n\n if (is.docFrag(parent)) {\n // skip past #shado-root fragments\n while ((parent = parent.host) && is.docFrag(parent)) {\n continue;\n }\n\n return parent;\n }\n\n return parent;\n },\n\n // taken from http://tanalin.com/en/blog/2012/12/matches-selector-ie8/ and modified\n matchesSelectorPolyfill: browser.useMatchesSelectorPolyfill\n ? function (element, selector, elems) {\n elems = elems || element.parentNode.querySelectorAll(selector);\n\n for (let i = 0, len = elems.length; i < len; i++) {\n if (elems[i] === element) {\n return true;\n }\n }\n\n return false;\n }\n : null,\n\n matchesSelector: function (element, selector, nodeList) {\n if (browser.useMatchesSelectorPolyfill) {\n return domUtils.matchesSelectorPolyfill(element, selector, nodeList);\n }\n\n // remove /deep/ from selectors if shadowDOM polyfill is used\n if (win.window !== win.realWindow) {\n selector = selector.replace(/\\/deep\\//g, ' ');\n }\n\n return element[browser.prefixedMatchesSelector](selector);\n },\n\n // Test for the element that's \"above\" all other qualifiers\n indexOfDeepestElement: function (elements) {\n let deepestZoneParents = [];\n let dropzoneParents = [];\n let dropzone;\n let deepestZone = elements[0];\n let index = deepestZone? 0: -1;\n let parent;\n let child;\n let i;\n let n;\n\n for (i = 1; i < elements.length; i++) {\n dropzone = elements[i];\n\n // an element might belong to multiple selector dropzones\n if (!dropzone || dropzone === deepestZone) {\n continue;\n }\n\n if (!deepestZone) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n // check if the deepest or current are document.documentElement or document.rootElement\n // - if the current dropzone is, do nothing and continue\n if (dropzone.parentNode === dropzone.ownerDocument) {\n continue;\n }\n // - if deepest is, update with the current dropzone and continue to next\n else if (deepestZone.parentNode === dropzone.ownerDocument) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n if (!deepestZoneParents.length) {\n parent = deepestZone;\n while (parent.parentNode && parent.parentNode !== parent.ownerDocument) {\n deepestZoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n }\n\n // if this element is an svg element and the current deepest is\n // an HTMLElement\n if (deepestZone instanceof domObjects.HTMLElement\n && dropzone instanceof domObjects.SVGElement\n && !(dropzone instanceof domObjects.SVGSVGElement)) {\n\n if (dropzone === deepestZone.parentNode) {\n continue;\n }\n\n parent = dropzone.ownerSVGElement;\n }\n else {\n parent = dropzone;\n }\n\n dropzoneParents = [];\n\n while (parent.parentNode !== parent.ownerDocument) {\n dropzoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n\n n = 0;\n\n // get (position of last common ancestor) + 1\n while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) {\n n++;\n }\n\n const parents = [\n dropzoneParents[n - 1],\n dropzoneParents[n],\n deepestZoneParents[n],\n ];\n\n child = parents[0].lastChild;\n\n while (child) {\n if (child === parents[1]) {\n deepestZone = dropzone;\n index = i;\n deepestZoneParents = [];\n\n break;\n }\n else if (child === parents[2]) {\n break;\n }\n\n child = child.previousSibling;\n }\n }\n\n return index;\n },\n\n matchesUpTo: function (element, selector, limit) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) {\n return true;\n }\n\n element = domUtils.parentNode(element);\n\n if (element === limit) {\n return domUtils.matchesSelector(element, selector);\n }\n }\n\n return false;\n },\n\n getActualElement: function (element) {\n return (element instanceof domObjects.SVGElementInstance\n ? element.correspondingUseElement\n : element);\n },\n\n getScrollXY: function (relevantWindow) {\n relevantWindow = relevantWindow || win.window;\n return {\n x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft,\n y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop,\n };\n },\n\n getElementClientRect: function (element) {\n const clientRect = (element instanceof domObjects.SVGElement\n ? element.getBoundingClientRect()\n : element.getClientRects()[0]);\n\n return clientRect && {\n left : clientRect.left,\n right : clientRect.right,\n top : clientRect.top,\n bottom: clientRect.bottom,\n width : clientRect.width || clientRect.right - clientRect.left,\n height: clientRect.height || clientRect.bottom - clientRect.top,\n };\n },\n\n getElementRect: function (element) {\n const clientRect = domUtils.getElementClientRect(element);\n\n if (!browser.isIOS7 && clientRect) {\n const scroll = domUtils.getScrollXY(win.getWindow(element));\n\n clientRect.left += scroll.x;\n clientRect.right += scroll.x;\n clientRect.top += scroll.y;\n clientRect.bottom += scroll.y;\n }\n\n return clientRect;\n },\n\n getPath: function (element) {\n const path = [];\n\n while (element) {\n path.push(element);\n element = domUtils.parentNode(element);\n }\n\n return path;\n },\n\n trySelector: value => {\n if (!is.string(value)) { return false; }\n\n // an exception will be raised if it is invalid\n domObjects.document.querySelector(value);\n return true;\n },\n};\n\nmodule.exports = domUtils;\n","const is = require('./is');\nconst domUtils = require('./domUtils');\nconst pExtend = require('./pointerExtend');\n\nconst { window, getWindow } = require('./window');\nconst { indexOf, contains } = require('./arr');\n\nconst useAttachEvent = ('attachEvent' in window) && !('addEventListener' in window);\nconst addEvent = useAttachEvent? 'attachEvent': 'addEventListener';\nconst removeEvent = useAttachEvent? 'detachEvent': 'removeEventListener';\nconst on = useAttachEvent? 'on': '';\n\nconst elements = [];\nconst targets = [];\nconst attachedListeners = [];\n\n// {\n// type: {\n// selectors: ['selector', ...],\n// contexts : [document, ...],\n// listeners: [[listener, capture, passive], ...]\n// }\n// }\nconst delegatedEvents = {};\n\nconst documents = [];\n\nconst supportsOptions = !useAttachEvent && (() => {\n let supported = false;\n\n window.document.createElement('div').addEventListener('test', null, {\n get capture () { supported = true; },\n });\n\n return supported;\n})();\n\nfunction add (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n let elementIndex = indexOf(elements, element);\n let target = targets[elementIndex];\n\n if (!target) {\n target = {\n events: {},\n typeCount: 0,\n };\n\n elementIndex = elements.push(element) - 1;\n targets.push(target);\n\n attachedListeners.push(useAttachEvent\n ? {\n supplied: [],\n wrapped : [],\n useCount: [],\n }\n : null);\n }\n\n if (!target.events[type]) {\n target.events[type] = [];\n target.typeCount++;\n }\n\n if (!contains(target.events[type], listener)) {\n let ret;\n\n if (useAttachEvent) {\n const { supplied, wrapped, useCount } = attachedListeners[elementIndex];\n const listenerIndex = indexOf(supplied, listener);\n\n const wrappedListener = wrapped[listenerIndex] || function (event) {\n if (!event.immediatePropagationStopped) {\n event.target = event.srcElement;\n event.currentTarget = element;\n\n event.preventDefault = event.preventDefault || preventDef;\n event.stopPropagation = event.stopPropagation || stopProp;\n event.stopImmediatePropagation = event.stopImmediatePropagation || stopImmProp;\n\n if (/mouse|click/.test(event.type)) {\n event.pageX = event.clientX + getWindow(element).document.documentElement.scrollLeft;\n event.pageY = event.clientY + getWindow(element).document.documentElement.scrollTop;\n }\n\n listener(event);\n }\n };\n\n ret = element[addEvent](on + type, wrappedListener, !!options.capture);\n\n if (listenerIndex === -1) {\n supplied.push(listener);\n wrapped.push(wrappedListener);\n useCount.push(1);\n }\n else {\n useCount[listenerIndex]++;\n }\n }\n else {\n ret = element[addEvent](type, listener, supportsOptions? options : !!options.capture);\n }\n target.events[type].push(listener);\n\n return ret;\n }\n}\n\nfunction remove (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const elementIndex = indexOf(elements, element);\n const target = targets[elementIndex];\n\n if (!target || !target.events) {\n return;\n }\n\n let wrappedListener = listener;\n let listeners;\n let listenerIndex;\n\n if (useAttachEvent) {\n listeners = attachedListeners[elementIndex];\n listenerIndex = indexOf(listeners.supplied, listener);\n wrappedListener = listeners.wrapped[listenerIndex];\n }\n\n if (type === 'all') {\n for (type in target.events) {\n if (target.events.hasOwnProperty(type)) {\n remove(element, type, 'all');\n }\n }\n return;\n }\n\n if (target.events[type]) {\n const len = target.events[type].length;\n\n if (listener === 'all') {\n for (let i = 0; i < len; i++) {\n remove(element, type, target.events[type][i], options);\n }\n return;\n }\n else {\n for (let i = 0; i < len; i++) {\n if (target.events[type][i] === listener) {\n element[removeEvent](on + type, wrappedListener, supportsOptions? options : !!options.capture);\n target.events[type].splice(i, 1);\n\n if (useAttachEvent && listeners) {\n listeners.useCount[listenerIndex]--;\n if (listeners.useCount[listenerIndex] === 0) {\n listeners.supplied.splice(listenerIndex, 1);\n listeners.wrapped.splice(listenerIndex, 1);\n listeners.useCount.splice(listenerIndex, 1);\n }\n }\n\n break;\n }\n }\n }\n\n if (target.events[type] && target.events[type].length === 0) {\n target.events[type] = null;\n target.typeCount--;\n }\n }\n\n if (!target.typeCount) {\n targets.splice(elementIndex, 1);\n elements.splice(elementIndex, 1);\n attachedListeners.splice(elementIndex, 1);\n }\n}\n\nfunction addDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n if (!delegatedEvents[type]) {\n delegatedEvents[type] = {\n selectors: [],\n contexts : [],\n listeners: [],\n };\n\n // add delegate listener functions\n for (let i = 0; i < documents.length; i++) {\n add(documents[i], type, delegateListener);\n add(documents[i], type, delegateUseCapture, true);\n }\n }\n\n const delegated = delegatedEvents[type];\n let index;\n\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n break;\n }\n }\n\n if (index === -1) {\n index = delegated.selectors.length;\n\n delegated.selectors.push(selector);\n delegated.contexts .push(context);\n delegated.listeners.push([]);\n }\n\n // keep listener and capture and passive flags\n delegated.listeners[index].push([listener, !!options.capture, options.passive]);\n}\n\nfunction removeDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const delegated = delegatedEvents[type];\n let matchFound = false;\n let index;\n\n if (!delegated) { return; }\n\n // count from last index of delegated to 0\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n // look for matching selector and context Node\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n\n const listeners = delegated.listeners[index];\n\n // each item of the listeners array is an array: [function, capture, passive]\n for (let i = listeners.length - 1; i >= 0; i--) {\n const [fn, capture, passive] = listeners[i];\n\n // check if the listener functions and capture and passive flags match\n if (fn === listener && capture === !!options.capture && passive === options.passive) {\n // remove the listener from the array of listeners\n listeners.splice(i, 1);\n\n // if all listeners for this interactable have been removed\n // remove the interactable from the delegated arrays\n if (!listeners.length) {\n delegated.selectors.splice(index, 1);\n delegated.contexts .splice(index, 1);\n delegated.listeners.splice(index, 1);\n\n // remove delegate function from context\n remove(context, type, delegateListener);\n remove(context, type, delegateUseCapture, true);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegatedEvents[type] = null;\n }\n }\n\n // only remove one listener\n matchFound = true;\n break;\n }\n }\n\n if (matchFound) { break; }\n }\n }\n}\n\n// bound to the interactable context when a DOM event\n// listener is added to a selector interactable\nfunction delegateListener (event, optionalArg) {\n const options = getOptions(optionalArg);\n const fakeEvent = {};\n const delegated = delegatedEvents[event.type];\n const eventTarget = (domUtils.getActualElement(event.path\n ? event.path[0]\n : event.target));\n let element = eventTarget;\n\n // duplicate the event so that currentTarget can be changed\n pExtend(fakeEvent, event);\n\n fakeEvent.originalEvent = event;\n fakeEvent.preventDefault = preventOriginalDefault;\n\n // climb up document tree looking for selector matches\n while (is.element(element)) {\n for (let i = 0; i < delegated.selectors.length; i++) {\n const selector = delegated.selectors[i];\n const context = delegated.contexts[i];\n\n if (domUtils.matchesSelector(element, selector)\n && domUtils.nodeContains(context, eventTarget)\n && domUtils.nodeContains(context, element)) {\n\n const listeners = delegated.listeners[i];\n\n fakeEvent.currentTarget = element;\n\n for (let j = 0; j < listeners.length; j++) {\n const [fn, capture, passive] = listeners[j];\n\n if (capture === !!options.capture && passive === options.passive) {\n fn(fakeEvent);\n }\n }\n }\n }\n\n element = domUtils.parentNode(element);\n }\n}\n\nfunction delegateUseCapture (event) {\n return delegateListener.call(this, event, true);\n}\n\nfunction preventDef () {\n this.returnValue = false;\n}\n\nfunction preventOriginalDefault () {\n this.originalEvent.preventDefault();\n}\n\nfunction stopProp () {\n this.cancelBubble = true;\n}\n\nfunction stopImmProp () {\n this.cancelBubble = true;\n this.immediatePropagationStopped = true;\n}\n\nfunction getOptions (param) {\n return is.object(param)? param : { capture: param };\n}\n\nmodule.exports = {\n add,\n remove,\n\n addDelegate,\n removeDelegate,\n\n delegateListener,\n delegateUseCapture,\n delegatedEvents,\n documents,\n\n useAttachEvent,\n supportsOptions,\n\n _elements: elements,\n _targets: targets,\n _attachedListeners: attachedListeners,\n};\n","module.exports = function extend (dest, source) {\n for (const prop in source) {\n dest[prop] = source[prop];\n }\n return dest;\n};\n","const {\n resolveRectLike,\n rectToXY,\n} = require('./rect');\n\nmodule.exports = function (target, element, action) {\n const actionOptions = target.options[action];\n const actionOrigin = actionOptions && actionOptions.origin;\n const origin = actionOrigin || target.options.origin;\n\n const originRect = resolveRectLike(origin, target, element, [target && element]);\n\n return rectToXY(originRect) || { x: 0, y: 0 };\n};\n","module.exports = (x, y) => Math.sqrt(x * x + y * y);\n","const extend = require('./extend');\nconst win = require('./window');\n\nconst utils = {\n warnOnce: function (method, message) {\n let warned = false;\n\n return function () {\n if (!warned) {\n win.window.console.warn(message);\n warned = true;\n }\n\n return method.apply(this, arguments);\n };\n },\n\n // http://stackoverflow.com/a/5634528/2280888\n _getQBezierValue: function (t, p1, p2, p3) {\n const iT = 1 - t;\n return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3;\n },\n\n getQuadraticCurvePoint: function (startX, startY, cpX, cpY, endX, endY, position) {\n return {\n x: utils._getQBezierValue(position, startX, cpX, endX),\n y: utils._getQBezierValue(position, startY, cpY, endY),\n };\n },\n\n // http://gizma.com/easing/\n easeOutQuad: function (t, b, c, d) {\n t /= d;\n return -c * t*(t-2) + b;\n },\n\n copyAction: function (dest, src) {\n dest.name = src.name;\n dest.axis = src.axis;\n dest.edges = src.edges;\n\n return dest;\n },\n\n is : require('./is'),\n extend : extend,\n hypot : require('./hypot'),\n getOriginXY: require('./getOriginXY'),\n};\n\nextend(utils, require('./arr'));\nextend(utils, require('./domUtils'));\nextend(utils, require('./pointerUtils'));\nextend(utils, require('./rect'));\n\nmodule.exports = utils;\n","const scope = require('../scope');\nconst utils = require('./index');\nconst browser = require('./browser');\n\nconst finder = {\n methodOrder: [ 'simulationResume', 'mouse', 'hasPointer', 'idle' ],\n\n search: function (pointer, eventType, eventTarget) {\n const mouseEvent = (/mouse/i.test(pointer.pointerType || eventType)\n // MSPointerEvent.MSPOINTER_TYPE_MOUSE\n || pointer.pointerType === 4);\n const pointerId = utils.getPointerId(pointer);\n const details = { pointer, pointerId, mouseEvent, eventType, eventTarget };\n\n for (const method of finder.methodOrder) {\n const interaction = finder[method](details);\n\n if (interaction) {\n return interaction;\n }\n }\n },\n\n // try to resume simulation with a new pointer\n simulationResume: function ({ mouseEvent, eventType, eventTarget }) {\n if (!/down|start/i.test(eventType)) {\n return null;\n }\n\n for (const interaction of scope.interactions) {\n let element = eventTarget;\n\n if (interaction.simulation && interaction.simulation.allowResume\n && (interaction.mouse === mouseEvent)) {\n while (element) {\n // if the element is the interaction element\n if (element === interaction.element) {\n return interaction;\n }\n element = utils.parentNode(element);\n }\n }\n }\n\n return null;\n },\n\n // if it's a mouse interaction\n mouse: function ({ pointerId, mouseEvent, eventType }) {\n if (!mouseEvent && (browser.supportsTouch || browser.supportsPointerEvent)) {\n return null;\n }\n\n let firstNonActive;\n\n for (const interaction of scope.interactions) {\n if (interaction.mouse) {\n // if it's a down event, skip interactions with running simulations\n if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; }\n\n // if the interaction is active, return it immediately\n if (interaction.interacting()) {\n return interaction;\n }\n // otherwise save it and look for another active interaction\n else if (!firstNonActive) {\n firstNonActive = interaction;\n }\n }\n }\n\n // if no active mouse interaction was found use the first inactive mouse\n // interaction\n if (firstNonActive) {\n return firstNonActive;\n }\n\n // Find any interaction specifically for mouse.\n // ignore the interaction if the eventType is a mousedown, and a simulation\n // is active\n for (const interaction of scope.interactions) {\n if (interaction.mouse && !(/down/.test(eventType) && interaction.simulation)) {\n return interaction;\n }\n }\n\n return null;\n },\n\n // get interaction that has this pointer\n hasPointer: function ({ pointerId }) {\n for (const interaction of scope.interactions) {\n if (utils.contains(interaction.pointerIds, pointerId)) {\n return interaction;\n }\n }\n },\n\n // get first idle interaction\n idle: function ({ mouseEvent }) {\n for (const interaction of scope.interactions) {\n // if there's already a pointer held down\n if (interaction.pointerIds.length === 1) {\n const target = interaction.target;\n // don't add this pointer if there is a target interactable and it\n // isn't gesturable\n if (target && !target.options.gesture.enabled) {\n continue;\n }\n }\n // maximum of 2 pointers per interaction\n else if (interaction.pointerIds.length >= 2) {\n continue;\n }\n\n if (!interaction.interacting() && (mouseEvent === interaction.mouse)) {\n return interaction;\n }\n }\n\n return null;\n },\n};\n\nmodule.exports = finder;\n","const win = require('./window');\nconst isWindow = require('./isWindow');\n\nconst is = {\n array : () => {},\n\n window : thing => thing === win.window || isWindow(thing),\n\n docFrag : thing => is.object(thing) && thing.nodeType === 11,\n\n object : thing => !!thing && (typeof thing === 'object'),\n\n function: thing => typeof thing === 'function',\n\n number : thing => typeof thing === 'number' ,\n\n bool : thing => typeof thing === 'boolean' ,\n\n string : thing => typeof thing === 'string' ,\n\n element: thing => {\n if (!thing || (typeof thing !== 'object')) { return false; }\n\n const _window = win.getWindow(thing) || win.window;\n\n return (/object|function/.test(typeof _window.Element)\n ? thing instanceof _window.Element //DOM2\n : thing.nodeType === 1 && typeof thing.nodeName === 'string');\n },\n};\n\nis.array = thing => (is.object(thing)\n && (typeof thing.length !== 'undefined')\n && is.function(thing.splice));\n\nmodule.exports = is;\n","module.exports = (thing) => !!(thing && thing.Window) && (thing instanceof thing.Window);\n","function pointerExtend (dest, source) {\n for (const prop in source) {\n const prefixedPropREs = module.exports.prefixedPropREs;\n let deprecated = false;\n\n // skip deprecated prefixed properties\n for (const vendor in prefixedPropREs) {\n if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) {\n deprecated = true;\n break;\n }\n }\n\n if (!deprecated && typeof source[prop] !== 'function') {\n dest[prop] = source[prop];\n }\n }\n return dest;\n}\n\npointerExtend.prefixedPropREs = {\n webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/,\n};\n\nmodule.exports = pointerExtend;\n","const hypot = require('./hypot');\nconst browser = require('./browser');\nconst dom = require('./domObjects');\nconst domUtils = require('./domUtils');\nconst is = require('./is');\nconst pointerExtend = require('./pointerExtend');\n\nconst pointerUtils = {\n copyCoords: function (dest, src) {\n dest.page = dest.page || {};\n dest.page.x = src.page.x;\n dest.page.y = src.page.y;\n\n dest.client = dest.client || {};\n dest.client.x = src.client.x;\n dest.client.y = src.client.y;\n\n dest.timeStamp = src.timeStamp;\n },\n\n setCoordDeltas: function (targetObj, prev, cur) {\n targetObj.page.x = cur.page.x - prev.page.x;\n targetObj.page.y = cur.page.y - prev.page.y;\n targetObj.client.x = cur.client.x - prev.client.x;\n targetObj.client.y = cur.client.y - prev.client.y;\n targetObj.timeStamp = cur.timeStamp - prev.timeStamp;\n\n // set pointer velocity\n const dt = Math.max(targetObj.timeStamp / 1000, 0.001);\n\n targetObj.page.speed = hypot(targetObj.page.x, targetObj.page.y) / dt;\n targetObj.page.vx = targetObj.page.x / dt;\n targetObj.page.vy = targetObj.page.y / dt;\n\n targetObj.client.speed = hypot(targetObj.client.x, targetObj.page.y) / dt;\n targetObj.client.vx = targetObj.client.x / dt;\n targetObj.client.vy = targetObj.client.y / dt;\n },\n\n isNativePointer: function (pointer) {\n return (pointer instanceof dom.Event || pointer instanceof dom.Touch);\n },\n\n // Get specified X/Y coords for mouse or event.touches[0]\n getXY: function (type, pointer, xy) {\n xy = xy || {};\n type = type || 'page';\n\n xy.x = pointer[type + 'X'];\n xy.y = pointer[type + 'Y'];\n\n return xy;\n },\n\n getPageXY: function (pointer, page) {\n page = page || {};\n\n // Opera Mobile handles the viewport and scrolling oddly\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n pointerUtils.getXY('screen', pointer, page);\n\n page.x += window.scrollX;\n page.y += window.scrollY;\n }\n else {\n pointerUtils.getXY('page', pointer, page);\n }\n\n return page;\n },\n\n getClientXY: function (pointer, client) {\n client = client || {};\n\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n // Opera Mobile handles the viewport and scrolling oddly\n pointerUtils.getXY('screen', pointer, client);\n }\n else {\n pointerUtils.getXY('client', pointer, client);\n }\n\n return client;\n },\n\n getPointerId: function (pointer) {\n return is.number(pointer.pointerId)? pointer.pointerId : pointer.identifier;\n },\n\n setCoords: function (targetObj, pointers, timeStamp) {\n const pointer = (pointers.length > 1\n ? pointerUtils.pointerAverage(pointers)\n : pointers[0]);\n\n const tmpXY = {};\n\n pointerUtils.getPageXY(pointer, tmpXY);\n targetObj.page.x = tmpXY.x;\n targetObj.page.y = tmpXY.y;\n\n pointerUtils.getClientXY(pointer, tmpXY);\n targetObj.client.x = tmpXY.x;\n targetObj.client.y = tmpXY.y;\n\n targetObj.timeStamp = is.number(timeStamp) ? timeStamp :new Date().getTime();\n },\n\n pointerExtend: pointerExtend,\n\n getTouchPair: function (event) {\n const touches = [];\n\n // array of touches is supplied\n if (is.array(event)) {\n touches[0] = event[0];\n touches[1] = event[1];\n }\n // an event\n else {\n if (event.type === 'touchend') {\n if (event.touches.length === 1) {\n touches[0] = event.touches[0];\n touches[1] = event.changedTouches[0];\n }\n else if (event.touches.length === 0) {\n touches[0] = event.changedTouches[0];\n touches[1] = event.changedTouches[1];\n }\n }\n else {\n touches[0] = event.touches[0];\n touches[1] = event.touches[1];\n }\n }\n\n return touches;\n },\n\n pointerAverage: function (pointers) {\n const average = {\n pageX : 0,\n pageY : 0,\n clientX: 0,\n clientY: 0,\n screenX: 0,\n screenY: 0,\n };\n\n for (const pointer of pointers) {\n for (const prop in average) {\n average[prop] += pointer[prop];\n }\n }\n for (const prop in average) {\n average[prop] /= pointers.length;\n }\n\n return average;\n },\n\n touchBBox: function (event) {\n if (!event.length && !(event.touches && event.touches.length > 1)) {\n return;\n }\n\n const touches = pointerUtils.getTouchPair(event);\n const minX = Math.min(touches[0].pageX, touches[1].pageX);\n const minY = Math.min(touches[0].pageY, touches[1].pageY);\n const maxX = Math.max(touches[0].pageX, touches[1].pageX);\n const maxY = Math.max(touches[0].pageY, touches[1].pageY);\n\n return {\n x: minX,\n y: minY,\n left: minX,\n top: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n },\n\n touchDistance: function (event, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n\n\n const dx = touches[0][sourceX] - touches[1][sourceX];\n const dy = touches[0][sourceY] - touches[1][sourceY];\n\n return hypot(dx, dy);\n },\n\n touchAngle: function (event, prevAngle, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n const dx = touches[1][sourceX] - touches[0][sourceX];\n const dy = touches[1][sourceY] - touches[0][sourceY];\n const angle = 180 * Math.atan2(dy , dx) / Math.PI;\n\n return angle;\n },\n\n getPointerType: function (pointer, interaction) {\n // if the PointerEvent API isn't available, then the pointer must be ither\n // a MouseEvent or TouchEvent\n if (interaction.mouse) { return 'mouse'; }\n if (!browser.supportsPointerEvent) { return 'touch'; }\n\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : [undefined, undefined,'touch', 'pen', 'mouse'][pointer.pointerType];\n },\n\n // [ event.target, event.currentTarget ]\n getEventTargets: function (event) {\n return [\n domUtils.getActualElement(event.path ? event.path[0] : event.target),\n domUtils.getActualElement(event.currentTarget),\n ];\n },\n};\n\nmodule.exports = pointerUtils;\n","const { window } = require('./window');\n\nconst vendors = ['ms', 'moz', 'webkit', 'o'];\nlet lastTime = 0;\nlet request;\nlet cancel;\n\nfor (let x = 0; x < vendors.length && !window.requestAnimationFrame; x++) {\n request = window[vendors[x] + 'RequestAnimationFrame'];\n cancel = window[vendors[x] +'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n}\n\nif (!request) {\n request = function (callback) {\n const currTime = new Date().getTime();\n const timeToCall = Math.max(0, 16 - (currTime - lastTime));\n const id = setTimeout(function () { callback(currTime + timeToCall); },\n timeToCall);\n\n lastTime = currTime + timeToCall;\n return id;\n };\n}\n\nif (!cancel) {\n cancel = function (id) {\n clearTimeout(id);\n };\n}\n\nmodule.exports = {\n request,\n cancel,\n};\n","const extend = require('./extend');\nconst is = require('./is');\nconst {\n closest,\n parentNode,\n getElementRect,\n} = require('./domUtils');\n\nconst rectUtils = {\n getStringOptionResult: function (value, interactable, element) {\n if (!is.string(value)) {\n return null;\n }\n\n if (value === 'parent') {\n value = parentNode(element);\n }\n else if (value === 'self') {\n value = interactable.getRect(element);\n }\n else {\n value = closest(element, value);\n }\n\n return value;\n },\n\n resolveRectLike: function (value, interactable, element, functionArgs) {\n value = rectUtils.getStringOptionResult(value, interactable, element) || value;\n\n if (is.function(value)) {\n value = value.apply(null, functionArgs);\n }\n\n if (is.element(value)) {\n value = getElementRect(value);\n }\n\n return value;\n },\n\n rectToXY: function (rect) {\n return rect && {\n x: 'x' in rect ? rect.x : rect.left,\n y: 'y' in rect ? rect.y : rect.top,\n };\n },\n\n xywhToTlbr: function (rect) {\n if (rect && !('left' in rect && 'top' in rect)) {\n rect = extend({}, rect);\n\n rect.left = rect.x || 0;\n rect.top = rect.y || 0;\n rect.right = rect.right || (rect.left + rect.width);\n rect.bottom = rect.bottom || (rect.top + rect.height);\n }\n\n return rect;\n },\n\n tlbrToXywh: function (rect) {\n if (rect && !('x' in rect && 'y' in rect)) {\n rect = extend({}, rect);\n\n rect.x = rect.left || 0;\n rect.top = rect.top || 0;\n rect.width = rect.width || (rect.right - rect.x);\n rect.height = rect.height || (rect.bottom - rect.y);\n }\n\n return rect;\n },\n};\n\nmodule.exports = rectUtils;\n","const win = module.exports;\nconst isWindow = require('./isWindow');\n\nfunction init (window) {\n // get wrapped window if using Shadow DOM polyfill\n\n win.realWindow = window;\n\n // create a TextNode\n const el = window.document.createTextNode('');\n\n // check if it's wrapped by a polyfill\n if (el.ownerDocument !== window.document\n && typeof window.wrap === 'function'\n && window.wrap(el) === el) {\n // use wrapped window\n window = window.wrap(window);\n }\n\n win.window = window;\n}\n\nif (typeof window === 'undefined') {\n win.window = undefined;\n win.realWindow = undefined;\n}\nelse {\n init(window);\n}\n\nwin.getWindow = function getWindow (node) {\n if (isWindow(node)) {\n return node;\n }\n\n const rootNode = (node.ownerDocument || node);\n\n return rootNode.defaultView || rootNode.parentWindow || win.window;\n};\n\nwin.init = init;\n"]} \ No newline at end of file +{"version":3,"sources":["src/header.js","node_modules/browser-pack/_prelude.js","index.js","src/Eventable.js","src/InteractEvent.js","src/Interactable.js","src/Interaction.js","src/actions/base.js","src/actions/drag.js","src/actions/drop.js","src/actions/gesture.js","src/actions/resize.js","src/autoScroll.js","src/autoStart/InteractableMethods.js","src/autoStart/base.js","src/autoStart/delay.js","src/autoStart/drag.js","src/autoStart/gesture.js","src/autoStart/resize.js","src/defaultOptions.js","src/index.js","src/inertia.js","src/interact.js","src/interactablePreventDefault.js","src/legacyBrowsers.js","src/modifiers/index.js","src/modifiers/restrict.js","src/modifiers/restrictEdges.js","src/modifiers/restrictSize.js","src/modifiers/snap.js","src/modifiers/snapSize.js","src/pointerEvents/PointerEvent.js","src/pointerEvents/base.js","src/pointerEvents/holdRepeat.js","src/pointerEvents/interactableTargets.js","src/scope.js","src/utils/Signals.js","src/utils/arr.js","src/utils/browser.js","src/utils/domObjects.js","src/utils/domUtils.js","src/utils/events.js","src/utils/extend.js","src/utils/getOriginXY.js","src/utils/hypot.js","src/utils/index.js","src/utils/interactionFinder.js","src/utils/is.js","src/utils/isWindow.js","src/utils/pointerExtend.js","src/utils/pointerUtils.js","src/utils/raf.js","src/utils/rect.js","src/utils/window.js"],"names":[],"mappings":";AAAA;AACA;AACA;AACA;AACA;AACA;ACLA,ADMA;AACA;;AEPA;;;;;;;;AAQA,IAAI,OAAO,MAAP,KAAkB,WAAtB,EAAmC;AACjC,SAAO,OAAP,GAAiB,UAAU,MAAV,EAAkB;AACjC,YAAQ,oBAAR,EAA8B,IAA9B,CAAmC,MAAnC;;AAEA,WAAO,QAAQ,aAAR,CAAP;AACD,GAJD;AAKD,CAND,MAOK;AACH,SAAO,OAAP,GAAiB,QAAQ,aAAR,CAAjB;AACD;;;;;;;eCjBmB,QAAQ,aAAR,C;IAAZ,O,YAAA,O;;AACR,IAAM,SAAS,QAAQ,mBAAR,CAAf;;AAEA,SAAS,yBAAT,CAAoC,KAApC,EAA2C,SAA3C,EAAsD;AACpD,OAAK,IAAI,IAAI,CAAR,EAAW,MAAM,UAAU,MAAhC,EAAwC,IAAI,GAAJ,IAAW,CAAC,MAAM,2BAA1D,EAAuF,GAAvF,EAA4F;AAC1F,cAAU,CAAV,EAAa,KAAb;AACD;AACF;;IAEK,S;AAEJ,qBAAa,OAAb,EAAsB;AAAA;;AACpB,SAAK,OAAL,GAAe,OAAO,EAAP,EAAW,WAAW,EAAtB,CAAf;AACD;;sBAED,I,iBAAM,K,EAAO;AACX,QAAI,kBAAJ;AACA,QAAM,UAAU,OAAO,MAAM,IAA7B;AACA,QAAM,SAAS,KAAK,MAApB;;AAEA;AACA,QAAK,YAAY,KAAK,MAAM,IAAX,CAAjB,EAAoC;AAClC,gCAA0B,KAA1B,EAAiC,SAAjC;AACD;;AAED;AACA,QAAI,KAAK,OAAL,CAAJ,EAAmB;AACjB,WAAK,OAAL,EAAc,KAAd;AACD;;AAED;AACA,QAAI,CAAC,MAAM,kBAAP,IAA6B,MAA7B,KAAwC,YAAY,OAAO,MAAM,IAAb,CAApD,CAAJ,EAA8E;AAC5E,gCAA0B,KAA1B,EAAiC,SAAjC;AACD;AACF,G;;sBAED,E,eAAI,S,EAAW,Q,EAAU;AACvB;AACA,QAAI,KAAK,SAAL,CAAJ,EAAqB;AACnB,WAAK,SAAL,EAAgB,IAAhB,CAAqB,QAArB;AACD,KAFD,MAGK;AACH,WAAK,SAAL,IAAkB,CAAC,QAAD,CAAlB;AACD;AACF,G;;sBAED,G,gBAAK,S,EAAW,Q,EAAU;AACxB;AACA,QAAM,YAAY,KAAK,SAAL,CAAlB;AACA,QAAM,QAAY,YAAW,QAAQ,SAAR,EAAmB,QAAnB,CAAX,GAA0C,CAAC,CAA7D;;AAEA,QAAI,UAAU,CAAC,CAAf,EAAkB;AAChB,gBAAU,MAAV,CAAiB,KAAjB,EAAwB,CAAxB;AACD;;AAED,QAAI,aAAa,UAAU,MAAV,KAAqB,CAAlC,IAAuC,CAAC,QAA5C,EAAsD;AACpD,WAAK,SAAL,IAAkB,QAAlB;AACD;AACF,G;;;;;AAGH,OAAO,OAAP,GAAiB,SAAjB;;;;;;;AC7DA,IAAM,SAAc,QAAQ,gBAAR,CAApB;AACA,IAAM,cAAc,QAAQ,qBAAR,CAApB;AACA,IAAM,WAAc,QAAQ,kBAAR,CAApB;AACA,IAAM,UAAc,QAAQ,iBAAR,EAA2B,GAA3B,EAApB;;IAEM,a;AACJ,yBAAa,WAAb,EAA0B,KAA1B,EAAiC,MAAjC,EAAyC,KAAzC,EAAgD,OAAhD,EAAyD,OAAzD,EAAkF;AAAA,QAAhB,MAAgB,uEAAP,KAAO;;AAAA;;AAChF,QAAM,SAAc,YAAY,MAAhC;AACA,QAAM,cAAc,CAAC,UAAU,OAAO,OAAjB,IAA4B,QAA7B,EAAuC,WAA3D;AACA,QAAM,SAAc,YAAY,MAAZ,EAAoB,OAApB,EAA6B,MAA7B,CAApB;AACA,QAAM,WAAc,UAAU,OAA9B;AACA,QAAM,SAAc,UAAU,KAA9B;AACA,QAAM,SAAc,WAAU,YAAY,WAAtB,GAAoC,YAAY,SAApE;AACA,QAAM,YAAc,YAAY,SAAhC;;AAEA,cAAU,WAAW,YAAY,OAAjC;;AAEA,QAAM,OAAS,OAAO,EAAP,EAAW,OAAO,IAAlB,CAAf;AACA,QAAM,SAAS,OAAO,EAAP,EAAW,OAAO,MAAlB,CAAf;;AAEA,SAAK,CAAL,IAAU,OAAO,CAAjB;AACA,SAAK,CAAL,IAAU,OAAO,CAAjB;;AAEA,WAAO,CAAP,IAAY,OAAO,CAAnB;AACA,WAAO,CAAP,IAAY,OAAO,CAAnB;;AAEA,SAAK,OAAL,GAAqB,MAAM,OAA3B;AACA,SAAK,MAAL,GAAqB,MAAM,MAA3B;AACA,SAAK,QAAL,GAAqB,MAAM,QAA3B;AACA,SAAK,OAAL,GAAqB,MAAM,OAA3B;AACA,SAAK,MAAL,GAAqB,MAAM,MAA3B;AACA,SAAK,OAAL,GAAqB,MAAM,OAA3B;AACA,SAAK,MAAL,GAAqB,OAArB;AACA,SAAK,aAAL,GAAqB,OAArB;AACA,SAAK,aAAL,GAAqB,WAAW,IAAhC;AACA,SAAK,MAAL,GAAqB,MAArB;AACA,SAAK,IAAL,GAAqB,UAAU,SAAS,EAAnB,CAArB;AACA,SAAK,WAAL,GAAqB,WAArB;AACA,SAAK,YAAL,GAAqB,MAArB;;AAEA,SAAK,EAAL,GAAU,WAAW,YAAY,SAAZ,CAAsB,YAAY,SAAZ,CAAsB,MAAtB,GAA+B,CAArD,CAAX,GACW,UAAU,EAD/B;;AAGA,QAAM,YAAY;AAChB,8BADgB;AAEhB,kBAFgB;AAGhB,oBAHgB;AAIhB,kBAJgB;AAKhB,sBALgB;AAMhB,sBANgB;AAOhB,gBAPgB;AAQhB,oBARgB;AAShB,oBATgB;AAUhB,wBAVgB;AAWhB,oBAXgB;AAYhB,8BAZgB;AAahB,cAAQ;AAbQ,KAAlB;;AAgBA,YAAQ,IAAR,CAAa,QAAb,EAAuB,SAAvB;;AAEA,QAAI,MAAJ,EAAY;AACV;AACA,WAAK,KAAL,GAAa,UAAU,KAAvB;AACA,WAAK,KAAL,GAAa,UAAU,KAAvB;AACA,WAAK,OAAL,GAAe,UAAU,OAAzB;AACA,WAAK,OAAL,GAAe,UAAU,OAAzB;AACD,KAND,MAOK;AACH,WAAK,KAAL,GAAiB,KAAK,CAAtB;AACA,WAAK,KAAL,GAAiB,KAAK,CAAtB;AACA,WAAK,OAAL,GAAiB,OAAO,CAAxB;AACA,WAAK,OAAL,GAAiB,OAAO,CAAxB;AACD;;AAED,SAAK,EAAL,GAAiB,YAAY,WAAZ,CAAwB,IAAxB,CAA6B,CAA7B,GAAiC,OAAO,CAAzD;AACA,SAAK,EAAL,GAAiB,YAAY,WAAZ,CAAwB,IAAxB,CAA6B,CAA7B,GAAiC,OAAO,CAAzD;AACA,SAAK,QAAL,GAAiB,YAAY,WAAZ,CAAwB,MAAxB,CAA+B,CAA/B,GAAmC,OAAO,CAA3D;AACA,SAAK,QAAL,GAAiB,YAAY,WAAZ,CAAwB,MAAxB,CAA+B,CAA/B,GAAmC,OAAO,CAA3D;;AAEA,YAAQ,IAAR,CAAa,WAAb,EAA0B,SAA1B;;AAEA,SAAK,SAAL,GAAiB,OAAO,SAAxB;AACA,SAAK,EAAL,GAAiB,YAAY,YAAZ,CAAyB,SAA1C;AACA,SAAK,QAAL,GAAiB,KAAK,SAAL,GAAiB,KAAK,EAAvC;;AAEA;AACA,SAAK,KAAL,GAAa,YAAY,YAAZ,CAAyB,WAAzB,EAAsC,KAAnD;AACA,SAAK,SAAL,GAAiB,YAAY,YAAZ,CAAyB,WAAzB,EAAsC,EAAvD;AACA,SAAK,SAAL,GAAiB,YAAY,YAAZ,CAAyB,WAAzB,EAAsC,EAAvD;;AAEA,SAAK,KAAL,GAAc,UAAU,UAAU,cAArB,GAAsC,KAAK,QAAL,EAAtC,GAAwD,IAArE;;AAEA,YAAQ,IAAR,CAAa,KAAb,EAAoB,SAApB;AACD;;0BAED,Q,uBAAY;AACV,QAAM,cAAc,KAAK,WAAzB;;AAEA,QAAI,YAAY,SAAZ,CAAsB,KAAtB,GAA8B,GAA9B,IACG,KAAK,SAAL,GAAiB,YAAY,SAAZ,CAAsB,SAAvC,GAAmD,GAD1D,EAC+D;AAC7D,aAAO,IAAP;AACD;;AAED,QAAI,QAAQ,MAAM,KAAK,KAAL,CAAW,YAAY,SAAZ,CAAsB,SAAjC,EAA4C,YAAY,SAAZ,CAAsB,SAAlE,CAAN,GAAqF,KAAK,EAAtG;AACA,QAAM,UAAU,IAAhB;;AAEA,QAAI,QAAQ,CAAZ,EAAe;AACb,eAAS,GAAT;AACD;;AAED,QAAM,OAAO,MAAM,OAAN,IAAiB,KAAjB,IAA0B,QAAQ,MAAM,OAArD;AACA,QAAM,KAAO,MAAM,OAAN,IAAiB,KAAjB,IAA0B,QAAQ,MAAM,OAArD;;AAEA,QAAM,QAAQ,CAAC,IAAD,KAAU,MAAM,OAAN,IAAiB,KAAjB,IAA0B,QAAS,KAAK,OAAlD,CAAd;AACA,QAAM,OAAQ,CAAC,EAAD,IAAW,KAAK,OAAL,IAAgB,KAA3B,IAAoC,QAAQ,MAAM,OAAhE;;AAEA,WAAO;AACL,YADK;AAEL,gBAFK;AAGL,gBAHK;AAIL,kBAJK;AAKL,kBALK;AAML,aAAO,YAAY,SAAZ,CAAsB,KANxB;AAOL,gBAAU;AACR,WAAG,YAAY,SAAZ,CAAsB,SADjB;AAER,WAAG,YAAY,SAAZ,CAAsB;AAFjB;AAPL,KAAP;AAYD,G;;0BAED,c,6BAAkB,CAAE,C;;0BAEpB,wB,uCAA4B;AAC1B,SAAK,2BAAL,GAAmC,KAAK,kBAAL,GAA0B,IAA7D;AACD,G;;0BAED,e,8BAAmB;AACjB,SAAK,kBAAL,GAA0B,IAA1B;AACD,G;;;;;AAGH,QAAQ,EAAR,CAAW,WAAX,EAAwB,gBAA0D;AAAA,MAA9C,MAA8C,QAA9C,MAA8C;AAAA,MAAtC,WAAsC,QAAtC,WAAsC;AAAA,MAAzB,QAAyB,QAAzB,QAAyB;AAAA,MAAf,WAAe,QAAf,WAAe;;AAChF,MAAM,YAAY,WAAU,MAAV,GAAmB,YAAY,SAAjD;;AAEA,MAAI,gBAAgB,QAApB,EAA8B;AAC5B,WAAO,EAAP,GAAY,OAAO,OAAP,GAAiB,UAAU,OAAvC;AACA,WAAO,EAAP,GAAY,OAAO,OAAP,GAAiB,UAAU,OAAvC;AACD,GAHD,MAIK;AACH,WAAO,EAAP,GAAY,OAAO,KAAP,GAAe,UAAU,KAArC;AACA,WAAO,EAAP,GAAY,OAAO,KAAP,GAAe,UAAU,KAArC;AACD;AACF,CAXD;;AAaA,cAAc,OAAd,GAAwB,OAAxB;;AAEA,OAAO,OAAP,GAAiB,aAAjB;;;;;;;AC7JA,IAAM,KAAY,QAAQ,YAAR,CAAlB;AACA,IAAM,SAAY,QAAQ,gBAAR,CAAlB;AACA,IAAM,SAAY,QAAQ,gBAAR,CAAlB;AACA,IAAM,UAAY,QAAQ,gBAAR,CAAlB;AACA,IAAM,QAAY,QAAQ,SAAR,CAAlB;AACA,IAAM,YAAY,QAAQ,aAAR,CAAlB;AACA,IAAM,WAAY,QAAQ,kBAAR,CAAlB;AACA,IAAM,UAAY,QAAQ,iBAAR,EAA2B,GAA3B,EAAlB;;eAM8B,QAAQ,kBAAR,C;IAH5B,c,YAAA,c;IACA,Y,YAAA,Y;IACA,W,YAAA,W;;gBAE4B,QAAQ,gBAAR,C;IAAtB,S,aAAA,S;;gBACsB,QAAQ,aAAR,C;IAAtB,O,aAAA,O;IAAS,Q,aAAA,Q;;gBACa,QAAQ,iBAAR,C;IAAtB,U,aAAA,U;;AAER;;;AACA,MAAM,aAAN,GAAsB,EAAtB;;AAEA;;;;;;;IAMM,Y;AACJ,wBAAa,MAAb,EAAqB,OAArB,EAA8B;AAAA;;AAC5B,cAAU,WAAW,EAArB;;AAEA,SAAK,MAAL,GAAgB,MAAhB;AACA,SAAK,MAAL,GAAgB,IAAI,SAAJ,EAAhB;AACA,SAAK,QAAL,GAAgB,QAAQ,OAAR,IAAmB,MAAM,QAAzC;AACA,SAAK,IAAL,GAAgB,UAAU,YAAY,MAAZ,IAAqB,KAAK,QAA1B,GAAqC,MAA/C,CAAhB;AACA,SAAK,IAAL,GAAgB,KAAK,IAAL,CAAU,QAA1B;;AAEA,YAAQ,IAAR,CAAa,KAAb,EAAoB;AAClB,oBADkB;AAElB,sBAFkB;AAGlB,oBAAc,IAHI;AAIlB,WAAK,KAAK;AAJQ,KAApB;;AAOA,UAAM,WAAN,CAAmB,KAAK,IAAxB,EAA8B,KAAK,IAAnC;;AAEA,UAAM,aAAN,CAAoB,IAApB,CAAyB,IAAzB;;AAEA,SAAK,GAAL,CAAS,OAAT;AACD;;yBAED,W,wBAAa,M,EAAQ,M,EAAQ;AAC3B,QAAM,WAAW,OAAO,MAAxB;;AAEA,QAAI,GAAG,QAAH,CAAY,OAAO,OAAnB,CAAJ,EAAwC;AAAE,WAAK,MAAL,CAAY,WAAW,OAAvB,IAA0C,OAAO,OAAjD;AAAoE;AAC9G,QAAI,GAAG,QAAH,CAAY,OAAO,MAAnB,CAAJ,EAAwC;AAAE,WAAK,MAAL,CAAY,WAAW,MAAvB,IAA0C,OAAO,MAAjD;AAAoE;AAC9G,QAAI,GAAG,QAAH,CAAY,OAAO,KAAnB,CAAJ,EAAwC;AAAE,WAAK,MAAL,CAAY,WAAW,KAAvB,IAA0C,OAAO,KAAjD;AAAoE;AAC9G,QAAI,GAAG,QAAH,CAAY,OAAO,cAAnB,CAAJ,EAAwC;AAAE,WAAK,MAAL,CAAY,WAAW,cAAvB,IAA0C,OAAO,cAAjD;AAAoE;;AAE9G,WAAO,IAAP;AACD,G;;yBAED,Y,yBAAc,M,EAAQ,O,EAAS;AAC7B;AACA,SAAK,IAAM,MAAX,IAAqB,OAArB,EAA8B;AAC5B;AACA,UAAI,UAAU,SAAS,MAAT,CAAd,EAAgC;AAC9B;AACA,YAAI,GAAG,MAAH,CAAU,QAAQ,MAAR,CAAV,CAAJ,EAAgC;AAC9B;AACA,eAAK,OAAL,CAAa,MAAb,EAAqB,MAArB,IAA+B,OAAO,KAAK,OAAL,CAAa,MAAb,EAAqB,MAArB,KAAgC,EAAvC,EAA2C,QAAQ,MAAR,CAA3C,CAA/B;;AAEA,cAAI,GAAG,MAAH,CAAU,SAAS,SAAT,CAAmB,MAAnB,CAAV,KAAyC,aAAa,SAAS,SAAT,CAAmB,MAAnB,CAA1D,EAAsF;AACpF,iBAAK,OAAL,CAAa,MAAb,EAAqB,MAArB,EAA6B,OAA7B,GAAuC,QAAQ,MAAR,EAAgB,OAAhB,KAA4B,KAA5B,GAAmC,KAAnC,GAA2C,IAAlF;AACD;AACF,SAPD,MAQK,IAAI,GAAG,IAAH,CAAQ,QAAQ,MAAR,CAAR,KAA4B,GAAG,MAAH,CAAU,SAAS,SAAT,CAAmB,MAAnB,CAAV,CAAhC,EAAuE;AAC1E,eAAK,OAAL,CAAa,MAAb,EAAqB,MAArB,EAA6B,OAA7B,GAAuC,QAAQ,MAAR,CAAvC;AACD,SAFI,MAGA,IAAI,QAAQ,MAAR,MAAoB,SAAxB,EAAmC;AACtC;AACA,eAAK,OAAL,CAAa,MAAb,EAAqB,MAArB,IAA+B,QAAQ,MAAR,CAA/B;AACD;AACF;AACF;AACF,G;;AAED;;;;;;;;;;;;;;;;;;;;yBAkBA,O,oBAAS,O,EAAS;AAChB,cAAU,WAAW,KAAK,MAA1B;;AAEA,QAAI,GAAG,MAAH,CAAU,KAAK,MAAf,KAA0B,CAAE,GAAG,OAAH,CAAW,OAAX,CAAhC,EAAsD;AACpD,gBAAU,KAAK,QAAL,CAAc,aAAd,CAA4B,KAAK,MAAjC,CAAV;AACD;;AAED,WAAO,eAAe,OAAf,CAAP;AACD,G;;AAED;;;;;;;;;;;;yBAUA,W,wBAAa,O,EAAS;AACpB,QAAI,GAAG,QAAH,CAAY,OAAZ,CAAJ,EAA0B;AACxB,WAAK,OAAL,GAAe,OAAf;;AAEA,aAAO,IAAP;AACD;;AAED,QAAI,YAAY,IAAhB,EAAsB;AACpB,aAAO,KAAK,OAAL,CAAa,OAApB;;AAEA,aAAO,IAAP;AACD;;AAED,WAAO,KAAK,OAAZ;AACD,G;;yBAED,iB,8BAAmB,U,EAAY,Q,EAAU;AACvC,QAAI,YAAY,QAAZ,KAAyB,GAAG,MAAH,CAAU,QAAV,CAA7B,EAAkD;AAChD,WAAK,OAAL,CAAa,UAAb,IAA2B,QAA3B;;AAEA,2BAAqB,QAAQ,KAA7B,kHAAoC;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,YAAzB,MAAyB;;AAClC,aAAK,OAAL,CAAa,MAAb,EAAqB,UAArB,IAAmC,QAAnC;AACD;;AAED,aAAO,IAAP;AACD;;AAED,WAAO,KAAK,OAAL,CAAa,UAAb,CAAP;AACD,G;;AAED;;;;;;;;;;;;;;;yBAaA,M,mBAAQ,Q,EAAU;AAChB,WAAO,KAAK,iBAAL,CAAuB,QAAvB,EAAiC,QAAjC,CAAP;AACD,G;;AAED;;;;;;;;;;;;yBAUA,W,wBAAa,Q,EAAU;AACrB,QAAI,aAAa,MAAb,IAAuB,aAAa,QAAxC,EAAkD;AAChD,WAAK,OAAL,CAAa,WAAb,GAA2B,QAA3B;;AAEA,aAAO,IAAP;AACD;;AAED,WAAO,KAAK,OAAL,CAAa,WAApB;AACD,G;;AAED;;;;;;;;;;;yBASA,O,sBAAW;AACT,WAAO,KAAK,QAAZ;AACD,G;;yBAED,S,sBAAW,O,EAAS;AAClB,WAAQ,KAAK,QAAL,KAAkB,QAAQ,aAA1B,IACG,aAAa,KAAK,QAAlB,EAA4B,OAA5B,CADX;AAED,G;;AAED;;;;;;;;;;;;yBAUA,I,iBAAM,M,EAAQ;AACZ,SAAK,MAAL,CAAY,IAAZ,CAAiB,MAAjB;;AAEA,WAAO,IAAP;AACD,G;;yBAED,c,2BAAgB,M,EAAQ,S,EAAW,Q,EAAU,O,EAAS;AACpD,QAAI,GAAG,MAAH,CAAU,SAAV,KAAwB,UAAU,MAAV,CAAiB,GAAjB,MAA0B,CAAC,CAAvD,EAA0D;AACxD,kBAAY,UAAU,IAAV,GAAiB,KAAjB,CAAuB,IAAvB,CAAZ;AACD;;AAED,QAAI,GAAG,KAAH,CAAS,SAAT,CAAJ,EAAyB;AACvB,WAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,UAAU,MAA9B,EAAsC,GAAtC,EAA2C;AACzC,aAAK,MAAL,EAAa,UAAU,CAAV,CAAb,EAA2B,QAA3B,EAAqC,OAArC;AACD;;AAED,aAAO,IAAP;AACD;;AAED,QAAI,GAAG,MAAH,CAAU,SAAV,CAAJ,EAA0B;AACxB,WAAK,IAAM,IAAX,IAAmB,SAAnB,EAA8B;AAC5B,aAAK,MAAL,EAAa,IAAb,EAAmB,UAAU,IAAV,CAAnB,EAAoC,QAApC;AACD;;AAED,aAAO,IAAP;AACD;AACF,G;;AAED;;;;;;;;;;;;;yBAWA,E,eAAI,S,EAAW,Q,EAAU,O,EAAS;AAChC,QAAI,KAAK,cAAL,CAAoB,IAApB,EAA0B,SAA1B,EAAqC,QAArC,EAA+C,OAA/C,CAAJ,EAA6D;AAC3D,aAAO,IAAP;AACD;;AAED,QAAI,cAAc,OAAlB,EAA2B;AAAE,kBAAY,UAAZ;AAAyB;;AAEtD,QAAI,SAAS,aAAa,UAAtB,EAAkC,SAAlC,CAAJ,EAAkD;AAChD,WAAK,MAAL,CAAY,EAAZ,CAAe,SAAf,EAA0B,QAA1B;AACD;AACD;AAHA,SAIK,IAAI,GAAG,MAAH,CAAU,KAAK,MAAf,CAAJ,EAA4B;AAC/B,eAAO,WAAP,CAAmB,KAAK,MAAxB,EAAgC,KAAK,QAArC,EAA+C,SAA/C,EAA0D,QAA1D,EAAoE,OAApE;AACD,OAFI,MAGA;AACH,eAAO,GAAP,CAAW,KAAK,MAAhB,EAAwB,SAAxB,EAAmC,QAAnC,EAA6C,OAA7C;AACD;;AAED,WAAO,IAAP;AACD,G;;AAED;;;;;;;;;;;;;yBAWA,G,gBAAK,S,EAAW,Q,EAAU,O,EAAS;AACjC,QAAI,KAAK,cAAL,CAAoB,KAApB,EAA2B,SAA3B,EAAsC,QAAtC,EAAgD,OAAhD,CAAJ,EAA8D;AAC5D,aAAO,IAAP;AACD;;AAED,QAAI,cAAc,OAAlB,EAA2B;AAAE,kBAAY,UAAZ;AAAyB;;AAEtD;AACA,QAAI,SAAS,aAAa,UAAtB,EAAkC,SAAlC,CAAJ,EAAkD;AAChD,WAAK,MAAL,CAAY,GAAZ,CAAgB,SAAhB,EAA2B,QAA3B;AACD;AACD;AAHA,SAIK,IAAI,GAAG,MAAH,CAAU,KAAK,MAAf,CAAJ,EAA4B;AAC/B,eAAO,cAAP,CAAsB,KAAK,MAA3B,EAAmC,KAAK,QAAxC,EAAkD,SAAlD,EAA6D,QAA7D,EAAuE,OAAvE;AACD;AACD;AAHK,WAIA;AACH,iBAAO,MAAP,CAAc,KAAK,MAAnB,EAA2B,SAA3B,EAAsC,QAAtC,EAAgD,OAAhD;AACD;;AAED,WAAO,IAAP;AACD,G;;AAED;;;;;;;;;;yBAQA,G,gBAAK,O,EAAS;AACZ,QAAI,CAAC,GAAG,MAAH,CAAU,OAAV,CAAL,EAAyB;AACvB,gBAAU,EAAV;AACD;;AAED,SAAK,OAAL,GAAe,OAAO,EAAP,EAAW,SAAS,IAApB,CAAf;;AAEA,QAAM,aAAa,OAAO,EAAP,EAAW,SAAS,SAApB,CAAnB;;AAEA,SAAK,IAAM,UAAX,IAAyB,QAAQ,UAAjC,EAA6C;AAC3C,UAAM,aAAa,QAAQ,UAAR,CAAmB,UAAnB,CAAnB;;AAEA,WAAK,OAAL,CAAa,UAAb,IAA2B,OAAO,EAAP,EAAW,SAAS,UAAT,CAAX,CAA3B;;AAEA,WAAK,YAAL,CAAkB,UAAlB,EAA8B,UAA9B;;AAEA,WAAK,UAAL,EAAiB,QAAQ,UAAR,CAAjB;AACD;;AAED,0BAAsB,aAAa,eAAnC,yHAAoD;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAAzC,OAAyC;;AAClD,WAAK,OAAL,CAAa,OAAb,IAAwB,SAAS,IAAT,CAAc,OAAd,CAAxB;;AAEA,UAAI,WAAW,OAAf,EAAwB;AACtB,aAAK,OAAL,EAAc,QAAQ,OAAR,CAAd;AACD;AACF;;AAED,YAAQ,IAAR,CAAa,KAAb,EAAoB;AAClB,sBADkB;AAElB,oBAAc;AAFI,KAApB;;AAKA,WAAO,IAAP;AACD,G;;AAED;;;;;;;;;;;yBASA,K,oBAAS;AACP,WAAO,MAAP,CAAc,KAAK,MAAnB,EAA2B,KAA3B;;AAEA,QAAI,GAAG,MAAH,CAAU,KAAK,MAAf,CAAJ,EAA4B;AAC1B;AACA,WAAK,IAAM,IAAX,IAAmB,OAAO,eAA1B,EAA2C;AACzC,YAAM,YAAY,OAAO,eAAP,CAAuB,IAAvB,CAAlB;;AAEA,YAAI,UAAU,SAAV,CAAoB,CAApB,MAA2B,KAAK,MAAhC,IACG,UAAU,QAAV,CAAmB,CAAnB,MAA0B,KAAK,QADtC,EACgD;;AAE9C,oBAAU,SAAV,CAAoB,MAApB,CAA2B,CAA3B,EAA8B,CAA9B;AACA,oBAAU,QAAV,CAAoB,MAApB,CAA2B,CAA3B,EAA8B,CAA9B;AACA,oBAAU,SAAV,CAAoB,MAApB,CAA2B,CAA3B,EAA8B,CAA9B;;AAEA;AACA,cAAI,CAAC,UAAU,SAAV,CAAoB,MAAzB,EAAiC;AAC/B,sBAAU,IAAV,IAAkB,IAAlB;AACD;AACF;;AAED,eAAO,MAAP,CAAc,KAAK,QAAnB,EAA6B,IAA7B,EAAmC,OAAO,gBAA1C;AACA,eAAO,MAAP,CAAc,KAAK,QAAnB,EAA6B,IAA7B,EAAmC,OAAO,kBAA1C,EAA8D,IAA9D;AACD;AACF,KArBD,MAsBK;AACH,aAAO,MAAP,CAAc,IAAd,EAAoB,KAApB;AACD;;AAED,YAAQ,IAAR,CAAa,OAAb,EAAsB,EAAE,cAAc,IAAhB,EAAtB;;AAEA,UAAM,aAAN,CAAoB,MAApB,CAA2B,QAAQ,MAAM,aAAd,EAA6B,IAA7B,CAA3B,EAA+D,CAA/D;;AAEA;AACA,0BAA0B,MAAM,YAAN,IAAsB,EAAhD,yHAAoD;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAAzC,WAAyC;;AAClD,UAAI,YAAY,MAAZ,KAAuB,IAAvB,IAA+B,YAAY,WAAZ,EAAnC,EAA8D;AAC5D,oBAAY,IAAZ;AACD;AACF;;AAED,WAAO,MAAM,QAAb;AACD,G;;;;;AAGH,MAAM,aAAN,CAAoB,cAApB,GAAqC,SAAS,cAAT,CAAyB,MAAzB,EAAiC,OAAjC,EAA0C;AAC7E,YAAU,WAAW,MAAM,QAA3B;;AAEA,OAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,KAAK,MAAzB,EAAiC,GAAjC,EAAsC;AACpC,QAAM,eAAe,KAAK,CAAL,CAArB;;AAEA,QAAI,aAAa,MAAb,KAAwB,MAAxB,IAAkC,aAAa,QAAb,KAA0B,OAAhE,EAAyE;AACvE,aAAO,CAAP;AACD;AACF;AACD,SAAO,CAAC,CAAR;AACD,CAXD;;AAaA,MAAM,aAAN,CAAoB,GAApB,GAA0B,SAAS,eAAT,CAA0B,OAA1B,EAAmC,OAAnC,EAA4C,kBAA5C,EAAgE;AACxF,MAAM,MAAM,KAAK,KAAK,cAAL,CAAoB,OAApB,EAA6B,WAAW,QAAQ,OAAhD,CAAL,CAAZ;;AAEA,SAAO,QAAQ,GAAG,MAAH,CAAU,OAAV,KAAsB,kBAAtB,IAA4C,IAAI,SAAJ,CAAc,OAAd,CAApD,IAA6E,GAA7E,GAAmF,IAA1F;AACD,CAJD;;AAMA,MAAM,aAAN,CAAoB,eAApB,GAAsC,UAAU,QAAV,EAAoB,OAApB,EAA6B;AACjE,OAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,KAAK,MAAzB,EAAiC,GAAjC,EAAsC;AACpC,QAAM,eAAe,KAAK,CAAL,CAArB;;AAEA;AACA,QAAI,CAAC,GAAG,MAAH,CAAU,aAAa,MAAvB,CAAD,IACI,WAAW,CAAC,aAAa,SAAb,CAAuB,OAAvB,CADpB,EACsD;AACpD;AACD;;AAED,QAAM,MAAM,SAAS,YAAT,EAAuB,aAAa,MAApC,EAA4C,aAAa,QAAzD,EAAmE,CAAnE,EAAsE,IAAtE,CAAZ;;AAEA,QAAI,QAAQ,SAAZ,EAAuB;AACrB,aAAO,GAAP;AACD;AACF;AACF,CAhBD;;AAkBA;AACA,aAAa,UAAb,GAA0B,MAAM,UAAN,GAAmB,EAA7C;;AAEA,aAAa,OAAb,GAAuB,OAAvB;;AAEA,aAAa,eAAb,GAA+B,CAAE,aAAF,EAAiB,QAAjB,EAA2B,gBAA3B,EAA6C,aAA7C,CAA/B;;AAEA,OAAO,OAAP,GAAiB,YAAjB;;;;;;;ACtcA,IAAM,QAAa,QAAQ,SAAR,CAAnB;AACA,IAAM,QAAa,QAAQ,SAAR,CAAnB;AACA,IAAM,SAAa,QAAQ,gBAAR,CAAnB;AACA,IAAM,UAAa,QAAQ,iBAAR,CAAnB;AACA,IAAM,aAAa,QAAQ,oBAAR,CAAnB;AACA,IAAM,SAAa,QAAQ,2BAAR,CAAnB;AACA,IAAM,UAAa,QAAQ,iBAAR,EAA2B,GAA3B,EAAnB;;AAEA,IAAM,YAAc,EAApB;AACA,IAAM,cAAc,CAClB,aADkB,EACH,aADG,EACY,WADZ,EAElB,eAFkB,EAED,eAFC,CAApB;;AAKA;AACA,IAAI,gBAAgB,CAApB;;AAEA;AACA,MAAM,YAAN,GAAqB,EAArB;;IAEM,W;AACJ,6BAA8B;AAAA,QAAf,WAAe,QAAf,WAAe;;AAAA;;AAC5B,SAAK,MAAL,GAAqB,IAArB,CAD4B,CACD;AAC3B,SAAK,OAAL,GAAqB,IAArB,CAF4B,CAED;;AAE3B,SAAK,QAAL,GAAqB,EAAM;AACzB,YAAO,IADY;AAEnB,YAAO,IAFY;AAGnB,aAAO;AAHY,KAArB;;AAMA;AACA,SAAK,QAAL,GAAmB,EAAnB;AACA,SAAK,UAAL,GAAmB,EAAnB;AACA,SAAK,WAAL,GAAmB,EAAnB;AACA,SAAK,SAAL,GAAmB,EAAnB;;AAEA;AACA,SAAK,UAAL,GAAkB;AAChB,YAAW,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EADK;AAEhB,cAAW,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EAFK;AAGhB,iBAAW;AAHK,KAAlB;AAKA;AACA,SAAK,SAAL,GAAiB;AACf,YAAW,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EADI;AAEf,cAAW,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EAFI;AAGf,iBAAW;AAHI,KAAjB;;AAMA;AACA,SAAK,WAAL,GAAmB;AACjB,YAAW,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EADM;AAEjB,cAAW,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EAFM;AAGjB,iBAAW;AAHM,KAAnB;;AAMA;AACA,SAAK,YAAL,GAAoB;AAClB,YAAW,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EAAc,IAAI,CAAlB,EAAqB,IAAI,CAAzB,EAA4B,OAAO,CAAnC,EADO;AAElB,cAAW,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EAAc,IAAI,CAAlB,EAAqB,IAAI,CAAzB,EAA4B,OAAO,CAAnC,EAFO;AAGlB,iBAAW;AAHO,KAApB;;AAMA,SAAK,SAAL,GAAmB,IAAnB,CA3C4B,CA2CA;AAC5B,SAAK,WAAL,GAAmB,EAAnB;;AAEA,SAAK,YAAL,GAAuB,IAAvB;AACA,SAAK,eAAL,GAAuB,IAAvB;;AAEA,SAAK,SAAL,GAAiB,IAAjB,CAjD4B,CAiDA;;AAE5B,SAAK,aAAL,GAAuB,KAAvB;AACA,SAAK,eAAL,GAAuB,KAAvB;AACA,SAAK,YAAL,GAAuB,KAAvB;;AAEA,SAAK,WAAL,GAAmB,WAAnB;;AAEA,YAAQ,IAAR,CAAa,KAAb,EAAoB,IAApB;;AAEA,UAAM,YAAN,CAAmB,IAAnB,CAAwB,IAAxB;AACD;;wBAED,W,wBAAa,O,EAAS,K,EAAO,W,EAAa;AACxC,QAAM,eAAe,KAAK,aAAL,CAAmB,OAAnB,EAA4B,KAA5B,EAAmC,IAAnC,CAArB;;AAEA,YAAQ,IAAR,CAAa,MAAb,EAAqB;AACnB,sBADmB;AAEnB,kBAFmB;AAGnB,8BAHmB;AAInB,gCAJmB;AAKnB,mBAAa;AALM,KAArB;AAOD,G;;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wBAgCA,K,kBAAO,M,EAAQ,M,EAAQ,O,EAAS;AAC9B,QAAI,KAAK,WAAL,MACG,CAAC,KAAK,aADT,IAEG,KAAK,UAAL,CAAgB,MAAhB,IAA0B,OAAO,IAAP,KAAgB,SAAhB,GAA2B,CAA3B,GAA+B,CAAzD,CAFP,EAEoE;AAClE;AACD;;AAED;AACA;AACA,QAAI,MAAM,OAAN,CAAc,MAAM,YAApB,EAAkC,IAAlC,MAA4C,CAAC,CAAjD,EAAoD;AAClD,YAAM,YAAN,CAAmB,IAAnB,CAAwB,IAAxB;AACD;;AAED,UAAM,UAAN,CAAiB,KAAK,QAAtB,EAAgC,MAAhC;AACA,SAAK,MAAL,GAAsB,MAAtB;AACA,SAAK,OAAL,GAAsB,OAAtB;;AAEA,YAAQ,IAAR,CAAa,cAAb,EAA6B;AAC3B,mBAAa,IADc;AAE3B,aAAO,KAAK;AAFe,KAA7B;AAID,G;;wBAED,W,wBAAa,O,EAAS,K,EAAO,W,EAAa;AACxC,QAAI,CAAC,KAAK,UAAV,EAAsB;AACpB,WAAK,aAAL,CAAmB,OAAnB;AACA,YAAM,SAAN,CAAgB,KAAK,SAArB,EAAgC,KAAK,QAArC;AACD;;AAED,QAAM,gBAAiB,KAAK,SAAL,CAAe,IAAf,CAAoB,CAApB,KAA0B,KAAK,UAAL,CAAgB,IAAhB,CAAqB,CAA/C,IACG,KAAK,SAAL,CAAe,IAAf,CAAoB,CAApB,KAA0B,KAAK,UAAL,CAAgB,IAAhB,CAAqB,CADlD,IAEG,KAAK,SAAL,CAAe,MAAf,CAAsB,CAAtB,KAA4B,KAAK,UAAL,CAAgB,MAAhB,CAAuB,CAFtD,IAGG,KAAK,SAAL,CAAe,MAAf,CAAsB,CAAtB,KAA4B,KAAK,UAAL,CAAgB,MAAhB,CAAuB,CAH7E;;AAKA,QAAI,WAAJ;AACA,QAAI,WAAJ;;AAEA;AACA,QAAI,KAAK,aAAL,IAAsB,CAAC,KAAK,eAAhC,EAAiD;AAC/C,WAAK,KAAK,SAAL,CAAe,MAAf,CAAsB,CAAtB,GAA0B,KAAK,WAAL,CAAiB,MAAjB,CAAwB,CAAvD;AACA,WAAK,KAAK,SAAL,CAAe,MAAf,CAAsB,CAAtB,GAA0B,KAAK,WAAL,CAAiB,MAAjB,CAAwB,CAAvD;;AAEA,WAAK,eAAL,GAAuB,MAAM,KAAN,CAAY,EAAZ,EAAgB,EAAhB,IAAsB,YAAY,oBAAzD;AACD;;AAED,QAAM,YAAY;AAChB,sBADgB;AAEhB,oBAAc,KAAK,eAAL,CAAqB,OAArB,CAFE;AAGhB,kBAHgB;AAIhB,8BAJgB;AAKhB,YALgB;AAMhB,YANgB;AAOhB,iBAAW,aAPK;AAQhB,mBAAa,IARG;AAShB,6BAAuB,KAAK,WAAL;AATP,KAAlB;;AAYA,QAAI,CAAC,aAAL,EAAoB;AAClB;AACA,YAAM,cAAN,CAAqB,KAAK,YAA1B,EAAwC,KAAK,UAA7C,EAAyD,KAAK,SAA9D;AACD;;AAED,YAAQ,IAAR,CAAa,MAAb,EAAqB,SAArB;;AAEA,QAAI,CAAC,aAAL,EAAoB;AAClB;AACA,UAAI,KAAK,WAAL,EAAJ,EAAwB;AACtB,aAAK,MAAL,CAAY,SAAZ;AACD;;AAED,UAAI,KAAK,eAAT,EAA0B;AACxB,cAAM,UAAN,CAAiB,KAAK,UAAtB,EAAkC,KAAK,SAAvC;AACD;AACF;AACF,G;;AAED;;;;;;;;;;;;;;;;;;;;;;wBAoBA,M,mBAAQ,S,EAAW;AACjB,gBAAY,MAAM,MAAN,CAAa;AACvB,eAAS,KAAK,QAAL,CAAc,CAAd,CADc;AAEvB,aAAO,KAAK,SAFW;AAGvB,mBAAa,KAAK,YAHK;AAIvB,mBAAa;AAJU,KAAb,EAKT,aAAa,EALJ,CAAZ;;AAOA,YAAQ,IAAR,CAAa,oBAAb,EAAmC,SAAnC;;AAEA,QAAI,CAAC,KAAK,aAAV,EAAyB;AACvB,cAAQ,IAAR,CAAa,aAAb,EAA4B,SAA5B;AACD;;AAED,SAAK,aAAL,GAAqB,KAArB;AACD,G;;AAED;;;wBACA,S,sBAAW,O,EAAS,K,EAAO,W,EAAa,c,EAAgB;AACtD,QAAM,eAAe,KAAK,eAAL,CAAqB,OAArB,CAArB;;AAEA,YAAQ,IAAR,CAAa,WAAW,IAAX,CAAgB,MAAM,IAAtB,IAA6B,QAA7B,GAAwC,IAArD,EAA2D;AACzD,sBADyD;AAEzD,gCAFyD;AAGzD,kBAHyD;AAIzD,8BAJyD;AAKzD,oCALyD;AAMzD,mBAAa;AAN4C,KAA3D;;AASA,QAAI,CAAC,KAAK,UAAV,EAAsB;AACpB,WAAK,GAAL,CAAS,KAAT;AACD;;AAED,SAAK,aAAL,GAAqB,KAArB;AACA,SAAK,aAAL,CAAmB,OAAnB,EAA4B,KAA5B;AACD,G;;AAED;;;;;;;;;;;;;;;;;;;;;;wBAoBA,G,gBAAK,K,EAAO;AACV,YAAQ,SAAS,KAAK,SAAtB;;AAEA,QAAI,KAAK,WAAL,EAAJ,EAAwB;AACtB,cAAQ,IAAR,CAAa,YAAb,EAA2B;AACzB,oBADyB;AAEzB,qBAAa;AAFY,OAA3B;AAID;;AAED,SAAK,IAAL;AACD,G;;wBAED,a,4BAAiB;AACf,WAAO,KAAK,YAAL,GAAmB,KAAK,QAAL,CAAc,IAAjC,GAAuC,IAA9C;AACD,G;;wBAED,W,0BAAe;AACb,WAAO,KAAK,YAAZ;AACD,G;;wBAED,I,mBAAQ;AACN,YAAQ,IAAR,CAAa,MAAb,EAAqB,EAAE,aAAa,IAAf,EAArB;;AAEA,QAAI,KAAK,YAAT,EAAuB;AACrB,cAAQ,IAAR,CAAa,aAAb,EAA4B,EAAE,aAAa,IAAf,EAA5B;AACA,cAAQ,IAAR,CAAa,UAAU,KAAK,QAAL,CAAc,IAArC,EAA2C,EAAE,aAAa,IAAf,EAA3C;AACD;;AAED,SAAK,MAAL,GAAc,KAAK,OAAL,GAAe,IAA7B;;AAEA,SAAK,YAAL,GAAoB,KAApB;AACA,SAAK,QAAL,CAAc,IAAd,GAAqB,KAAK,SAAL,GAAiB,IAAtC;AACD,G;;wBAED,e,4BAAiB,O,EAAS;AACxB;AACA,QAAI,KAAK,WAAL,KAAqB,OAArB,IAAgC,KAAK,WAAL,KAAqB,KAAzD,EAAgE;AAC9D,aAAO,CAAP;AACD;;AAED,WAAO,MAAM,OAAN,CAAc,KAAK,UAAnB,EAA+B,MAAM,YAAN,CAAmB,OAAnB,CAA/B,CAAP;AACD,G;;wBAED,a,0BAAe,O,EAAS,K,EAA0D;AAAA,QAAnD,IAAmD,uEAA5C,SAAS,iBAAiB,IAAjB,CAAsB,MAAM,IAA5B,CAAmC;;AAChF,QAAM,KAAK,MAAM,YAAN,CAAmB,OAAnB,CAAX;AACA,QAAI,QAAQ,KAAK,eAAL,CAAqB,OAArB,CAAZ;;AAEA,QAAI,UAAU,CAAC,CAAf,EAAkB;AAChB,cAAQ,KAAK,UAAL,CAAgB,MAAxB;AACA,WAAK,UAAL,CAAgB,KAAhB,IAAyB,EAAzB;AACD;;AAED,QAAI,IAAJ,EAAU;AACR,cAAQ,IAAR,CAAa,qBAAb,EAAoC;AAClC,wBADkC;AAElC,oBAFkC;AAGlC,kBAHkC;AAIlC,mBAAW,EAJuB;AAKlC,sBAAc,KALoB;AAMlC,qBAAa;AANqB,OAApC;AAQD;;AAED,SAAK,QAAL,CAAc,KAAd,IAAuB,OAAvB;;AAEA,WAAO,KAAP;AACD,G;;wBAED,a,0BAAe,O,EAAS,K,EAAO;AAC7B,QAAM,QAAQ,KAAK,eAAL,CAAqB,OAArB,CAAd;;AAEA,QAAI,UAAU,CAAC,CAAf,EAAkB;AAAE;AAAS;;AAE7B,YAAQ,IAAR,CAAa,gBAAb,EAA+B;AAC7B,sBAD6B;AAE7B,kBAF6B;AAG7B,oBAAc,KAHe;AAI7B,mBAAa;AAJgB,KAA/B;;AAOA,SAAK,QAAL,CAAiB,MAAjB,CAAwB,KAAxB,EAA+B,CAA/B;AACA,SAAK,UAAL,CAAiB,MAAjB,CAAwB,KAAxB,EAA+B,CAA/B;AACA,SAAK,WAAL,CAAiB,MAAjB,CAAwB,KAAxB,EAA+B,CAA/B;AACA,SAAK,SAAL,CAAiB,MAAjB,CAAwB,KAAxB,EAA+B,CAA/B;AACD,G;;wBAED,mB,gCAAqB,M,EAAQ,a,EAAe;AAC1C,SAAK,YAAL,GAAuB,MAAvB;AACA,SAAK,eAAL,GAAuB,aAAvB;AACD,G;;;;;AAGH,KAAK,IAAI,IAAI,CAAR,EAAW,MAAM,YAAY,MAAlC,EAA0C,IAAI,GAA9C,EAAmD,GAAnD,EAAwD;AACtD,MAAM,SAAS,YAAY,CAAZ,CAAf;;AAEA,YAAU,MAAV,IAAoB,iBAAiB,MAAjB,CAApB;AACD;;AAED,SAAS,gBAAT,CAA2B,MAA3B,EAAmC;AACjC,SAAQ,UAAU,KAAV,EAAiB;AACvB,QAAM,cAAc,MAAM,cAAN,CAAqB,KAArB,CAApB;;AADuB,gCAEe,MAAM,eAAN,CAAsB,KAAtB,CAFf;AAAA,QAEhB,WAFgB;AAAA,QAEH,cAFG;;AAGvB,QAAM,UAAU,EAAhB,CAHuB,CAGH;;AAEpB,QAAI,QAAQ,aAAR,IAAyB,QAAQ,IAAR,CAAa,MAAM,IAAnB,CAA7B,EAAuD;AACrD,sBAAgB,IAAI,IAAJ,GAAW,OAAX,EAAhB;;AAEA,WAAK,IAAI,KAAI,CAAb,EAAgB,KAAI,MAAM,cAAN,CAAqB,MAAzC,EAAiD,IAAjD,EAAsD;AACpD,YAAM,UAAU,MAAM,cAAN,CAAqB,EAArB,CAAhB;AACA,YAAM,cAAc,OAAO,MAAP,CAAc,OAAd,EAAuB,MAAM,IAA7B,EAAmC,WAAnC,CAApB;;AAEA,gBAAQ,IAAR,CAAa,CAAC,OAAD,EAAU,eAAe,IAAI,WAAJ,CAAgB,EAAE,wBAAF,EAAhB,CAAzB,CAAb;AACD;AACF,KATD,MAUK;AACH,UAAI,iBAAiB,KAArB;;AAEA,UAAI,CAAC,QAAQ,oBAAT,IAAiC,QAAQ,IAAR,CAAa,MAAM,IAAnB,CAArC,EAA+D;AAC7D;AACA,aAAK,IAAI,MAAI,CAAb,EAAgB,MAAI,MAAM,YAAN,CAAmB,MAAvB,IAAiC,CAAC,cAAlD,EAAkE,KAAlE,EAAuE;AACrE,2BAAiB,MAAM,YAAN,CAAmB,GAAnB,EAAsB,WAAtB,KAAsC,OAAtC,IAAiD,MAAM,YAAN,CAAmB,GAAnB,EAAsB,aAAxF;AACD;;AAED;AACA;AACA,yBAAiB,kBACX,IAAI,IAAJ,GAAW,OAAX,KAAuB,aAAvB,GAAuC;AAC3C;AAFe,WAGZ,MAAM,SAAN,KAAoB,CAHzB;AAID;;AAED,UAAI,CAAC,cAAL,EAAqB;AACnB,YAAI,eAAc,OAAO,MAAP,CAAc,KAAd,EAAqB,MAAM,IAA3B,EAAiC,WAAjC,CAAlB;;AAEA,YAAI,CAAC,YAAL,EAAkB;AAChB,yBAAc,IAAI,WAAJ,CAAgB,EAAE,wBAAF,EAAhB,CAAd;AACD;;AAED,gBAAQ,IAAR,CAAa,CAAC,KAAD,EAAQ,YAAR,CAAb;AACD;AACF;;AAED,yBAAqC,OAArC,mHAA8C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,UAAlC,QAAkC;AAAA,UAAzB,aAAyB;;AAC5C,oBAAY,mBAAZ,CAAgC,WAAhC,EAA6C,cAA7C;AACA,oBAAY,MAAZ,EAAoB,QAApB,EAA6B,KAA7B,EAAoC,WAApC,EAAiD,cAAjD;AACD;AACF,GA/CD;AAgDD;;AAED,SAAS,MAAT,CAAiB,KAAjB,EAAwB;AACtB,OAAK,IAAI,MAAI,CAAb,EAAgB,MAAI,MAAM,YAAN,CAAmB,MAAvC,EAA+C,KAA/C,EAAoD;AAClD,QAAM,cAAc,MAAM,YAAN,CAAmB,GAAnB,CAApB;;AAEA,gBAAY,GAAZ,CAAgB,KAAhB;AACA,YAAQ,IAAR,CAAa,QAAb,EAAuB,EAAE,YAAF,EAAS,wBAAT,EAAvB;AACD;AACF;;AAED,IAAM,YAAY,CAAE,+BAAF,CAAlB;AACA,IAAM,cAAc,QAAQ,WAA5B;;AAEA,IAAI,WAAW,YAAf,EAA6B;AAC3B,YAAU,YAAY,IAAtB,IAAgC,UAAU,WAA1C;AACA,YAAU,YAAY,IAAtB,IAAgC,UAAU,WAA1C;AACA,YAAU,YAAY,EAAtB,IAAgC,UAAU,SAA1C;AACA,YAAU,YAAY,MAAtB,IAAgC,UAAU,SAA1C;AACD,CALD,MAMK;AACH,YAAU,SAAV,GAAwB,UAAU,WAAlC;AACA,YAAU,SAAV,GAAwB,UAAU,WAAlC;AACA,YAAU,OAAV,GAAwB,UAAU,SAAlC;;AAEA,YAAU,UAAV,GAAwB,UAAU,WAAlC;AACA,YAAU,SAAV,GAAwB,UAAU,WAAlC;AACA,YAAU,QAAV,GAAwB,UAAU,SAAlC;AACA,YAAU,WAAV,GAAwB,UAAU,SAAlC;AACD;;AAED,UAAU,IAAV,GAAiB,MAAjB;;AAEA,SAAS,WAAT,QAA+B,UAA/B,EAA2C;AAAA,MAAnB,GAAmB,SAAnB,GAAmB;;AACzC,MAAM,cAAc,WAAW,OAAX,CAAmB,KAAnB,MAA8B,CAA9B,GAChB,OAAO,GADS,GACH,OAAO,MADxB;;AAGA;AACA,OAAK,IAAM,SAAX,IAAwB,MAAM,eAA9B,EAA+C;AAC7C,gBAAY,GAAZ,EAAiB,SAAjB,EAA4B,OAAO,gBAAnC;AACA,gBAAY,GAAZ,EAAiB,SAAjB,EAA4B,OAAO,kBAAnC,EAAuD,IAAvD;AACD;;AAED,OAAK,IAAM,UAAX,IAAwB,SAAxB,EAAmC;AACjC,gBAAY,GAAZ,EAAiB,UAAjB,EAA4B,UAAU,UAAV,CAA5B;AACD;AACF;;AAED,QAAQ,EAAR,CAAW,qBAAX,EAAkC,iBAAiF;AAAA,MAA9E,WAA8E,SAA9E,WAA8E;AAAA,MAAjE,OAAiE,SAAjE,OAAiE;AAAA,MAAxD,SAAwD,SAAxD,SAAwD;AAAA,MAA7C,YAA6C,SAA7C,YAA6C;AAAA,MAA/B,KAA+B,SAA/B,KAA+B;AAAA,MAAxB,WAAwB,SAAxB,WAAwB;AAAA,MAAX,IAAW,SAAX,IAAW;;AACjH,cAAY,UAAZ,CAAuB,YAAvB,IAAuC,SAAvC;AACA,cAAY,QAAZ,CAAqB,YAArB,IAAqC,OAArC;;AAEA,MAAI,IAAJ,EAAU;AACR,gBAAY,aAAZ,GAA4B,IAA5B;AACD;;AAED,MAAI,CAAC,YAAY,WAAZ,EAAL,EAAgC;AAC9B,UAAM,SAAN,CAAgB,YAAY,WAA5B,EAAyC,YAAY,QAArD;;AAEA,UAAM,UAAN,CAAiB,YAAY,SAA7B,EAAyC,YAAY,WAArD;AACA,UAAM,UAAN,CAAiB,YAAY,UAA7B,EAAyC,YAAY,WAArD;;AAEA,gBAAY,SAAZ,GAAwC,KAAxC;AACA,gBAAY,SAAZ,CAAsB,YAAtB,IAAwC,YAAY,SAAZ,CAAsB,SAA9D;AACA,gBAAY,WAAZ,CAAwB,YAAxB,IAAwC,eAAe,SAAS,MAAM,eAAN,CAAsB,KAAtB,EAA6B,CAA7B,CAAhE;AACA,gBAAY,eAAZ,GAAwC,KAAxC;;AAEA,UAAM,aAAN,CAAoB,YAAY,WAAhC,EAA6C,OAA7C;AACD;AACF,CArBD;;AAuBA,MAAM,OAAN,CAAc,EAAd,CAAiB,cAAjB,EAAoC,WAApC;AACA,MAAM,OAAN,CAAc,EAAd,CAAiB,iBAAjB,EAAoC,WAApC;;AAEA,YAAY,oBAAZ,GAAmC,CAAnC;AACA,YAAY,gBAAZ,GAA+B,gBAA/B;AACA,YAAY,MAAZ,GAAqB,MAArB;AACA,YAAY,OAAZ,GAAsB,OAAtB;AACA,YAAY,SAAZ,GAAwB,SAAxB;;AAEA,MAAM,kBAAN,GAA2B,MAA3B;;AAEA,OAAO,OAAP,GAAiB,WAAjB;;;;;AC/fA,IAAM,cAAgB,QAAQ,gBAAR,CAAtB;AACA,IAAM,gBAAgB,QAAQ,kBAAR,CAAtB;;AAEA,IAAM,UAAU;AACd,4BADc;AAEd,SAAO,EAFO;AAGd,cAAY;AAHE,CAAhB;;AAMA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,cAAvB,EAAuC,gBAAkC;AAAA,MAAtB,WAAsB,QAAtB,WAAsB;AAAA,MAAT,KAAS,QAAT,KAAS;;AACvE,cAAY,YAAZ,GAA2B,IAA3B;AACA,eAAa,WAAb,EAA0B,KAA1B,EAAiC,OAAjC;AACD,CAHD;;AAKA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,aAAvB,EAAsC,iBAA0C;AAAA,MAA9B,WAA8B,SAA9B,WAA8B;AAAA,MAAjB,KAAiB,SAAjB,KAAiB;AAAA,MAAV,MAAU,SAAV,MAAU;;AAC9E,eAAa,WAAb,EAA0B,KAA1B,EAAiC,MAAjC,EAAyC,MAAzC;;AAEA;AACA,MAAI,CAAC,YAAY,WAAZ,EAAL,EAAgC;AAAE,WAAO,KAAP;AAAe;AAClD,CALD;;AAOA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,YAAvB,EAAqC,iBAAkC;AAAA,MAAtB,WAAsB,SAAtB,WAAsB;AAAA,MAAT,KAAS,SAAT,KAAS;;AACrE,eAAa,WAAb,EAA0B,KAA1B,EAAiC,KAAjC;AACD,CAFD;;AAIA,SAAS,YAAT,CAAuB,WAAvB,EAAoC,KAApC,EAA2C,KAA3C,EAAkD,MAAlD,EAA0D;AACxD,MAAM,aAAa,YAAY,QAAZ,CAAqB,IAAxC;;AAEA,MAAM,WAAW,IAAI,aAAJ,CAAkB,WAAlB,EAA+B,KAA/B,EAAsC,UAAtC,EAAkD,KAAlD,EAAyD,YAAY,OAArE,EAA8E,IAA9E,EAAoF,MAApF,CAAjB;;AAEA,cAAY,MAAZ,CAAmB,IAAnB,CAAwB,QAAxB;AACA,cAAY,SAAZ,GAAwB,QAAxB;AACD;;AAED,OAAO,OAAP,GAAiB,OAAjB;;;;;AClCA,IAAM,UAAiB,QAAQ,QAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,UAAR,CAAvB;AACA,IAAM,gBAAiB,QAAQ,kBAAR,CAAvB;AACA,IAAM,eAAiB,QAAQ,iBAAR,CAAvB;AACA,IAAM,cAAiB,QAAQ,gBAAR,CAAvB;AACA,IAAM,iBAAiB,QAAQ,mBAAR,CAAvB;;AAEA,IAAM,OAAO;AACX,YAAU;AACR,aAAc,KADN;AAER,kBAAc,IAFN;;AAIR,YAAY,IAJJ;AAKR,UAAY,IALJ;AAMR,cAAY,IANJ;AAOR,aAAY,IAPJ;AAQR,gBAAY,IARJ;;AAUR,eAAY,IAVJ;AAWR,cAAY;AAXJ,GADC;;AAeX,WAAS,iBAAU,OAAV,EAAmB,KAAnB,EAA0B,YAA1B,EAAwC;AAC/C,QAAM,cAAc,aAAa,OAAb,CAAqB,IAAzC;;AAEA,WAAO,YAAY,OAAZ,GACH,EAAE,MAAM,MAAR,EAAgB,MAAO,YAAY,QAAZ,KAAyB,OAAzB,GACE,YAAY,SADd,GAEE,YAAY,QAFrC,EADG,GAIH,IAJJ;AAKD,GAvBU;;AAyBX,aAAW,qBAAY;AACrB,WAAO,MAAP;AACD;AA3BU,CAAb;;AA8BA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,oBAAvB,EAA6C,gBAA2B;AAAA,MAAf,WAAe,QAAf,WAAe;;AACtE,MAAI,YAAY,QAAZ,CAAqB,IAArB,KAA8B,MAAlC,EAA0C;AAAE;AAAS;;AAErD,MAAM,OAAO,YAAY,QAAZ,CAAqB,IAAlC;;AAEA,MAAI,SAAS,GAAb,EAAkB;AAChB,gBAAY,SAAZ,CAAsB,IAAtB,CAA2B,CAA3B,GAAiC,YAAY,WAAZ,CAAwB,IAAxB,CAA6B,CAA9D;AACA,gBAAY,SAAZ,CAAsB,MAAtB,CAA6B,CAA7B,GAAiC,YAAY,WAAZ,CAAwB,MAAxB,CAA+B,CAAhE;;AAEA,gBAAY,YAAZ,CAAyB,IAAzB,CAA8B,KAA9B,GAAwC,KAAK,GAAL,CAAS,YAAY,YAAZ,CAAyB,IAAzB,CAA8B,EAAvC,CAAxC;AACA,gBAAY,YAAZ,CAAyB,MAAzB,CAAgC,KAAhC,GAAwC,KAAK,GAAL,CAAS,YAAY,YAAZ,CAAyB,MAAzB,CAAgC,EAAzC,CAAxC;AACA,gBAAY,YAAZ,CAAyB,MAAzB,CAAgC,EAAhC,GAAqC,CAArC;AACA,gBAAY,YAAZ,CAAyB,IAAzB,CAA8B,EAA9B,GAAqC,CAArC;AACD,GARD,MASK,IAAI,SAAS,GAAb,EAAkB;AACrB,gBAAY,SAAZ,CAAsB,IAAtB,CAA2B,CAA3B,GAAiC,YAAY,WAAZ,CAAwB,IAAxB,CAA6B,CAA9D;AACA,gBAAY,SAAZ,CAAsB,MAAtB,CAA6B,CAA7B,GAAiC,YAAY,WAAZ,CAAwB,MAAxB,CAA+B,CAAhE;;AAEA,gBAAY,YAAZ,CAAyB,IAAzB,CAA8B,KAA9B,GAAwC,KAAK,GAAL,CAAS,YAAY,YAAZ,CAAyB,IAAzB,CAA8B,EAAvC,CAAxC;AACA,gBAAY,YAAZ,CAAyB,MAAzB,CAAgC,KAAhC,GAAwC,KAAK,GAAL,CAAS,YAAY,YAAZ,CAAyB,MAAzB,CAAgC,EAAzC,CAAxC;AACA,gBAAY,YAAZ,CAAyB,MAAzB,CAAgC,EAAhC,GAAqC,CAArC;AACA,gBAAY,YAAZ,CAAyB,IAAzB,CAA8B,EAA9B,GAAqC,CAArC;AACD;AACF,CAvBD;;AAyBA;AACA,cAAc,OAAd,CAAsB,EAAtB,CAAyB,KAAzB,EAAgC,iBAAmC;AAAA,MAAvB,MAAuB,SAAvB,MAAuB;AAAA,MAAf,WAAe,SAAf,WAAe;;AACjE,MAAI,OAAO,IAAP,KAAgB,UAApB,EAAgC;AAAE;AAAS;;AAE3C,MAAM,OAAO,YAAY,QAAZ,CAAqB,IAAlC;;AAEA,MAAI,SAAS,GAAb,EAAkB;AAChB,WAAO,KAAP,GAAiB,YAAY,WAAZ,CAAwB,IAAxB,CAA6B,CAA9C;AACA,WAAO,OAAP,GAAiB,YAAY,WAAZ,CAAwB,MAAxB,CAA+B,CAAhD;AACA,WAAO,EAAP,GAAY,CAAZ;AACD,GAJD,MAKK,IAAI,SAAS,GAAb,EAAkB;AACrB,WAAO,KAAP,GAAiB,YAAY,WAAZ,CAAwB,IAAxB,CAA6B,CAA9C;AACA,WAAO,OAAP,GAAiB,YAAY,WAAZ,CAAwB,MAAxB,CAA+B,CAAhD;AACA,WAAO,EAAP,GAAY,CAAZ;AACD;AACF,CAfD;;AAiBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoCA,aAAa,SAAb,CAAuB,SAAvB,GAAmC,UAAU,OAAV,EAAmB;AACpD,MAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,OAAhB,CAAJ,EAA8B;AAC5B,SAAK,OAAL,CAAa,IAAb,CAAkB,OAAlB,GAA4B,QAAQ,OAAR,KAAoB,KAApB,GAA2B,KAA3B,GAAkC,IAA9D;AACA,SAAK,YAAL,CAAkB,MAAlB,EAA0B,OAA1B;AACA,SAAK,WAAL,CAAiB,MAAjB,EAAyB,OAAzB;;AAEA,QAAI,mBAAmB,IAAnB,CAAwB,QAAQ,QAAhC,CAAJ,EAA+C;AAC7C,WAAK,OAAL,CAAa,IAAb,CAAkB,QAAlB,GAA6B,QAAQ,QAArC;AACD;AACD,QAAI,aAAa,IAAb,CAAkB,QAAQ,SAA1B,CAAJ,EAA0C;AACxC,WAAK,OAAL,CAAa,IAAb,CAAkB,SAAlB,GAA8B,QAAQ,SAAtC;AACD;;AAED,WAAO,IAAP;AACD;;AAED,MAAI,MAAM,EAAN,CAAS,IAAT,CAAc,OAAd,CAAJ,EAA4B;AAC1B,SAAK,OAAL,CAAa,IAAb,CAAkB,OAAlB,GAA4B,OAA5B;;AAEA,QAAI,CAAC,OAAL,EAAc;AACZ,WAAK,WAAL,GAAmB,KAAK,WAAL,GAAmB,KAAK,SAAL,GAAiB,IAAvD;AACD;;AAED,WAAO,IAAP;AACD;;AAED,SAAO,KAAK,OAAL,CAAa,IAApB;AACD,CA3BD;;AA6BA,QAAQ,IAAR,GAAe,IAAf;AACA,QAAQ,KAAR,CAAc,IAAd,CAAmB,MAAnB;AACA,MAAM,KAAN,CAAY,aAAa,UAAzB,EAAqC,CACnC,WADmC,EAEnC,UAFmC,EAGnC,kBAHmC,EAInC,mBAJmC,EAKnC,SALmC,CAArC;AAOA,QAAQ,UAAR,CAAmB,IAAnB,GAA0B,WAA1B;;AAEA,eAAe,IAAf,GAAsB,KAAK,QAA3B;;AAEA,OAAO,OAAP,GAAiB,IAAjB;;;;;AC9JA,IAAM,UAAiB,QAAQ,QAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,UAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,UAAR,CAAvB;AACA,IAAM,WAAiB,QAAQ,aAAR,CAAvB;AACA,IAAM,gBAAiB,QAAQ,kBAAR,CAAvB;AACA,IAAM,eAAiB,QAAQ,iBAAR,CAAvB;AACA,IAAM,cAAiB,QAAQ,gBAAR,CAAvB;AACA,IAAM,iBAAiB,QAAQ,mBAAR,CAAvB;;AAEA,IAAM,OAAO;AACX,YAAU;AACR,aAAS,KADD;AAER,YAAS,IAFD;AAGR,aAAS;AAHD;AADC,CAAb;;AAQA,IAAI,cAAc,KAAlB;;AAEA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,cAAvB,EAAuC,gBAAkC;AAAA,MAAtB,WAAsB,QAAtB,WAAsB;AAAA,MAAT,KAAS,QAAT,KAAS;;AACvE,MAAI,YAAY,QAAZ,CAAqB,IAArB,KAA8B,MAAlC,EAA0C;AAAE;AAAS;;AAErD;AACA,cAAY,WAAZ,CAAwB,SAAxB,GAAoC,EAApC;AACA,cAAY,WAAZ,CAAwB,QAAxB,GAAoC,EAApC;AACA,cAAY,WAAZ,CAAwB,KAAxB,GAAoC,EAApC;;AAEA,cAAY,UAAZ,GAAyB,IAAzB;;AAEA,MAAI,CAAC,YAAY,WAAjB,EAA8B;AAC5B,mBAAe,WAAf,EAA4B,YAAY,OAAxC;AACD;;AAED,MAAM,YAAY,YAAY,SAA9B;AACA,MAAM,aAAa,cAAc,WAAd,EAA2B,KAA3B,EAAkC,SAAlC,CAAnB;;AAEA,MAAI,WAAW,QAAf,EAAyB;AACvB,oBAAgB,WAAhB,EAA6B,WAAW,QAAxC;AACD;AACF,CApBD;;AAsBA,cAAc,OAAd,CAAsB,EAAtB,CAAyB,KAAzB,EAAgC,iBAA0C;AAAA,MAA9B,WAA8B,SAA9B,WAA8B;AAAA,MAAjB,MAAiB,SAAjB,MAAiB;AAAA,MAAT,KAAS,SAAT,KAAS;;AACxE,MAAI,OAAO,IAAP,KAAgB,UAAhB,IAA8B,OAAO,IAAP,KAAgB,SAAlD,EAA6D;AAAE;AAAS;;AAExE,MAAM,mBAAmB,YAAY,OAArC;AACA,MAAM,YAAY,MAAlB;AACA,MAAM,aAAa,QAAQ,SAAR,EAAmB,KAAnB,EAA0B,gBAA1B,CAAnB;;AAEA,cAAY,UAAZ,GAA0B,WAAW,QAArC;AACA,cAAY,WAAZ,GAA0B,WAAW,OAArC;;AAEA,cAAY,UAAZ,GAAyB,cAAc,WAAd,EAA2B,KAA3B,EAAkC,SAAlC,CAAzB;AACD,CAXD;;AAaA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,aAAvB,EAAsC,iBAA2B;AAAA,MAAf,WAAe,SAAf,WAAe;;AAC/D,MAAI,YAAY,QAAZ,CAAqB,IAArB,KAA8B,MAAlC,EAA0C;AAAE;AAAS;;AAErD,iBAAe,WAAf,EAA4B,YAAY,UAAxC;AACD,CAJD;;AAMA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,YAAvB,EAAqC,iBAA2B;AAAA,MAAf,WAAe,SAAf,WAAe;;AAC9D,MAAI,YAAY,QAAZ,CAAqB,IAArB,KAA8B,MAAlC,EAA0C;AACxC,mBAAe,WAAf,EAA4B,YAAY,UAAxC;AACD;AACF,CAJD;;AAMA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,WAAvB,EAAoC,iBAA2B;AAAA,MAAf,WAAe,SAAf,WAAe;;AAC7D,cAAY,WAAZ,CAAwB,SAAxB,GACE,YAAY,WAAZ,CAAwB,QAAxB,GACA,YAAY,WAAZ,CAAwB,KAAxB,GACA,YAAY,UAAZ,GAAyB,IAH3B;AAID,CALD;;AAOA,SAAS,YAAT,CAAuB,WAAvB,EAAoC,OAApC,EAA6C;AAC3C,MAAM,QAAQ,EAAd;AACA,MAAM,WAAW,EAAjB;;AAEA,YAAU,WAAW,YAAY,OAAjC;;AAEA;AACA,uBAAsB,MAAM,aAA5B,kHAA2C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,QAAhC,OAAgC;;AACzC,QAAI,CAAC,QAAQ,OAAR,CAAgB,IAAhB,CAAqB,OAA1B,EAAmC;AAAE;AAAW;;AAEhD,QAAM,SAAS,QAAQ,OAAR,CAAgB,IAAhB,CAAqB,MAApC;;AAEA;AACA,QAAK,MAAM,EAAN,CAAS,OAAT,CAAiB,MAAjB,KAA4B,WAAW,OAAxC,IACI,MAAM,EAAN,CAAS,MAAT,CAAgB,MAAhB,KACD,CAAC,MAAM,eAAN,CAAsB,OAAtB,EAA+B,MAA/B,CAFR,EAEiD;;AAE/C;AACD;;AAED;AACA,QAAM,eAAe,MAAM,EAAN,CAAS,MAAT,CAAgB,QAAQ,MAAxB,IACjB,QAAQ,QAAR,CAAiB,gBAAjB,CAAkC,QAAQ,MAA1C,CADiB,GAEjB,CAAC,QAAQ,MAAT,CAFJ;;AAIA,SAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,aAAa,MAAjC,EAAyC,GAAzC,EAA8C;AAC5C,UAAM,iBAAiB,aAAa,CAAb,CAAvB;;AAEA,UAAI,mBAAmB,OAAvB,EAAgC;AAC9B,cAAM,IAAN,CAAW,OAAX;AACA,iBAAS,IAAT,CAAc,cAAd;AACD;AACF;AACF;;AAED,SAAO;AACL,sBADK;AAEL,eAAW;AAFN,GAAP;AAID;;AAED,SAAS,eAAT,CAA0B,WAA1B,EAAuC,KAAvC,EAA8C;AAC5C,MAAI,oBAAJ;;AAEA;AACA,OAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,YAAY,WAAZ,CAAwB,SAAxB,CAAkC,MAAtD,EAA8D,GAA9D,EAAmE;AACjE,QAAM,UAAU,YAAY,WAAZ,CAAwB,SAAxB,CAAkC,CAAlC,CAAhB;AACA,QAAM,iBAAiB,YAAY,WAAZ,CAAwB,QAAxB,CAAkC,CAAlC,CAAvB;;AAEA;AACA,QAAI,mBAAmB,WAAvB,EAAoC;AAClC;AACA,YAAM,MAAN,GAAe,cAAf;AACA,cAAQ,IAAR,CAAa,KAAb;AACD;AACD,kBAAc,cAAd;AACD;AACF;;AAED;AACA;AACA;AACA,SAAS,cAAT,CAAyB,WAAzB,EAAsC,WAAtC,EAAmD;AACjD;AACA,MAAM,gBAAgB,aAAa,WAAb,EAA0B,WAA1B,EAAuC,IAAvC,CAAtB;;AAEA,cAAY,WAAZ,CAAwB,SAAxB,GAAoC,cAAc,SAAlD;AACA,cAAY,WAAZ,CAAwB,QAAxB,GAAoC,cAAc,QAAlD;AACA,cAAY,WAAZ,CAAwB,KAAxB,GAAoC,EAApC;;AAEA,OAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,YAAY,WAAZ,CAAwB,SAAxB,CAAkC,MAAtD,EAA8D,GAA9D,EAAmE;AACjE,gBAAY,WAAZ,CAAwB,KAAxB,CAA8B,CAA9B,IACE,YAAY,WAAZ,CAAwB,SAAxB,CAAkC,CAAlC,EAAqC,OAArC,CAA6C,YAAY,WAAZ,CAAwB,QAAxB,CAAiC,CAAjC,CAA7C,CADF;AAED;AACF;;AAED,SAAS,OAAT,CAAkB,SAAlB,EAA6B,KAA7B,EAAoC,WAApC,EAAiD;AAC/C,MAAM,cAAc,UAAU,WAA9B;AACA,MAAM,aAAa,EAAnB;;AAEA,MAAI,WAAJ,EAAiB;AACf,mBAAe,WAAf,EAA4B,WAA5B;AACD;;AAED;AACA,OAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,YAAY,WAAZ,CAAwB,SAAxB,CAAkC,MAAtD,EAA8D,GAA9D,EAAmE;AACjE,QAAM,UAAiB,YAAY,WAAZ,CAAwB,SAAxB,CAAkC,CAAlC,CAAvB;AACA,QAAM,iBAAiB,YAAY,WAAZ,CAAwB,QAAxB,CAAkC,CAAlC,CAAvB;AACA,QAAM,OAAiB,YAAY,WAAZ,CAAwB,KAAxB,CAAkC,CAAlC,CAAvB;;AAEA,eAAW,IAAX,CAAgB,QAAQ,SAAR,CAAkB,SAAlB,EAA6B,KAA7B,EAAoC,YAAY,MAAhD,EAAwD,WAAxD,EAAqE,cAArE,EAAqF,IAArF,IACZ,cADY,GAEZ,IAFJ;AAGD;;AAED;AACA,MAAM,YAAY,MAAM,qBAAN,CAA4B,UAA5B,CAAlB;;AAEA,SAAO;AACL,cAAU,YAAY,WAAZ,CAAwB,SAAxB,CAAkC,SAAlC,KAAgD,IADrD;AAEL,aAAU,YAAY,WAAZ,CAAwB,QAAxB,CAAkC,SAAlC,KAAgD;AAFrD,GAAP;AAID;;AAED,SAAS,aAAT,CAAwB,WAAxB,EAAqC,YAArC,EAAmD,SAAnD,EAA8D;AAC5D,MAAM,aAAa;AACjB,WAAY,IADK;AAEjB,WAAY,IAFK;AAGjB,cAAY,IAHK;AAIjB,gBAAY,IAJK;AAKjB,UAAY,IALK;AAMjB,UAAY;AANK,GAAnB;;AASA,MAAM,OAAO;AACX,wBADW;AAEX,4BAFW;AAGX,YAAe,YAAY,WAHhB;AAIX,cAAe,YAAY,UAJhB;AAKX,mBAAe,UAAU,MALd;AAMX,eAAe,UAAU,YANd;AAOX,eAAe,UAAU;AAPd,GAAb;;AAUA,MAAI,YAAY,WAAZ,KAA4B,YAAY,eAA5C,EAA6D;AAC3D;AACA,QAAI,YAAY,cAAhB,EAAgC;AAC9B,iBAAW,KAAX,GAAmB,MAAM,MAAN,CAAa,EAAE,MAAM,WAAR,EAAb,EAAoC,IAApC,CAAnB;;AAEA,gBAAU,SAAV,GAAyB,WAAW,KAAX,CAAiB,MAAjB,GAA4B,YAAY,eAAjE;AACA,gBAAU,YAAV,GAAyB,WAAW,KAAX,CAAiB,QAAjB,GAA4B,YAAY,cAAjE;AACD;AACD;AACA,QAAI,YAAY,UAAhB,EAA4B;AAC1B,iBAAW,KAAX,GAAmB;AACjB,4BADiB;AAEjB,gCAFiB;AAGjB,gBAAe,YAAY,WAHV;AAIjB,kBAAe,YAAY,UAJV;AAKjB,uBAAe,UAAU,MALR;AAMjB,mBAAe,UAAU,YANR;AAOjB,mBAAe,UAAU,SAPR;AAQjB,cAAe;AARE,OAAnB;;AAWA,gBAAU,SAAV,GAAsB,YAAY,WAAlC;AACA,gBAAU,QAAV,GAAqB,YAAY,UAAjC;AACD;AACF;;AAED,MAAI,UAAU,IAAV,KAAmB,SAAnB,IAAgC,YAAY,UAAhD,EAA4D;AAC1D,eAAW,IAAX,GAAkB,MAAM,MAAN,CAAa,EAAE,MAAM,MAAR,EAAb,EAA+B,IAA/B,CAAlB;;AAEA,cAAU,QAAV,GAAqB,YAAY,UAAjC;AACA,cAAU,aAAV,GAA0B,YAAY,WAAtC;AACD;AACD,MAAI,UAAU,IAAV,KAAmB,WAAvB,EAAoC;AAClC,eAAW,QAAX,GAAsB,MAAM,MAAN,CAAa,EAAE,MAAM,cAAR,EAAb,EAAuC,IAAvC,CAAtB;;AAEA,eAAW,QAAX,CAAoB,MAApB,GAA+B,IAA/B;AACA,eAAW,QAAX,CAAoB,QAApB,GAA+B,IAA/B;AACD;AACD,MAAI,UAAU,IAAV,KAAmB,SAAvB,EAAkC;AAChC,eAAW,UAAX,GAAwB,MAAM,MAAN,CAAa,EAAE,MAAM,gBAAR,EAAb,EAAyC,IAAzC,CAAxB;;AAEA,eAAW,UAAX,CAAsB,MAAtB,GAAiC,IAAjC;AACA,eAAW,UAAX,CAAsB,QAAtB,GAAiC,IAAjC;AACD;AACD,MAAI,UAAU,IAAV,KAAmB,UAAnB,IAAiC,YAAY,UAAjD,EAA6D;AAC3D,eAAW,IAAX,GAAkB,MAAM,MAAN,CAAa;AAC7B,gBAAe,SADc;AAE7B,YAAe;AAFc,KAAb,EAGf,IAHe,CAAlB;;AAKA,cAAU,QAAV,GAAqB,YAAY,UAAjC;AACD;;AAED,SAAO,UAAP;AACD;;AAED,SAAS,cAAT,CAAyB,WAAzB,EAAsC,UAAtC,EAAkD;AAChD,MAAI,WAAW,KAAf,EAAsB;AAAE,gBAAY,cAAZ,CAA2B,IAA3B,CAAgC,WAAW,KAA3C;AAAoD;AAC5E,MAAI,WAAW,IAAf,EAAsB;AAAM,gBAAY,UAAZ,CAAuB,IAAvB,CAA4B,WAAW,IAAvC;AAAgD;AAC5E,MAAI,WAAW,KAAf,EAAsB;AAAM,gBAAY,UAAZ,CAAuB,IAAvB,CAA4B,WAAW,KAAvC;AAAgD;AAC5E,MAAI,WAAW,IAAf,EAAsB;AAAM,gBAAY,UAAZ,CAAuB,IAAvB,CAA4B,WAAW,IAAvC;AAAgD;AAC5E,MAAI,WAAW,UAAf,EAA2B;AACzB,oBAAgB,WAAhB,EAA6B,WAAW,UAAxC;AACD;;AAED,cAAY,cAAZ,GAA8B,YAAY,UAA1C;AACA,cAAY,eAAZ,GAA8B,YAAY,WAA1C;AACD;;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoDA,aAAa,SAAb,CAAuB,QAAvB,GAAkC,UAAU,OAAV,EAAmB;AACnD,MAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,OAAhB,CAAJ,EAA8B;AAC5B,SAAK,OAAL,CAAa,IAAb,CAAkB,OAAlB,GAA4B,QAAQ,OAAR,KAAoB,KAApB,GAA2B,KAA3B,GAAkC,IAA9D;;AAEA,QAAI,MAAM,EAAN,CAAS,QAAT,CAAkB,QAAQ,MAA1B,CAAJ,EAAiD;AAAE,WAAK,MAAL,CAAY,MAAZ,GAA+B,QAAQ,MAAvC;AAA0D;AAC7G,QAAI,MAAM,EAAN,CAAS,QAAT,CAAkB,QAAQ,cAA1B,CAAJ,EAAiD;AAAE,WAAK,MAAL,CAAY,cAAZ,GAA+B,QAAQ,cAAvC;AAA0D;AAC7G,QAAI,MAAM,EAAN,CAAS,QAAT,CAAkB,QAAQ,gBAA1B,CAAJ,EAAiD;AAAE,WAAK,MAAL,CAAY,gBAAZ,GAA+B,QAAQ,gBAAvC;AAA0D;AAC7G,QAAI,MAAM,EAAN,CAAS,QAAT,CAAkB,QAAQ,WAA1B,CAAJ,EAAiD;AAAE,WAAK,MAAL,CAAY,WAAZ,GAA+B,QAAQ,WAAvC;AAA0D;AAC7G,QAAI,MAAM,EAAN,CAAS,QAAT,CAAkB,QAAQ,WAA1B,CAAJ,EAAiD;AAAE,WAAK,MAAL,CAAY,WAAZ,GAA+B,QAAQ,WAAvC;AAA0D;AAC7G,QAAI,MAAM,EAAN,CAAS,QAAT,CAAkB,QAAQ,UAA1B,CAAJ,EAAiD;AAAE,WAAK,MAAL,CAAY,UAAZ,GAA+B,QAAQ,UAAvC;AAA0D;;AAE7G,QAAI,qBAAqB,IAArB,CAA0B,QAAQ,OAAlC,CAAJ,EAAgD;AAC9C,WAAK,OAAL,CAAa,IAAb,CAAkB,OAAlB,GAA4B,QAAQ,OAApC;AACD,KAFD,MAGK,IAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,QAAQ,OAAxB,CAAJ,EAAsC;AACzC,WAAK,OAAL,CAAa,IAAb,CAAkB,OAAlB,GAA4B,KAAK,GAAL,CAAS,KAAK,GAAL,CAAS,CAAT,EAAY,QAAQ,OAApB,CAAT,EAAuC,CAAvC,CAA5B;AACD;AACD,QAAI,YAAY,OAAhB,EAAyB;AACvB,WAAK,OAAL,CAAa,IAAb,CAAkB,MAAlB,GAA2B,QAAQ,MAAnC;AACD;AACD,QAAI,aAAa,OAAjB,EAA0B;AACxB,WAAK,OAAL,CAAa,IAAb,CAAkB,OAAlB,GAA4B,QAAQ,OAApC;AACD;;AAGD,WAAO,IAAP;AACD;;AAED,MAAI,MAAM,EAAN,CAAS,IAAT,CAAc,OAAd,CAAJ,EAA4B;AAC1B,SAAK,OAAL,CAAa,IAAb,CAAkB,OAAlB,GAA4B,OAA5B;;AAEA,QAAI,CAAC,OAAL,EAAc;AACZ,WAAK,WAAL,GAAmB,KAAK,WAAL,GAAmB,KAAK,MAAL,GAClC,KAAK,cAAL,GAAsB,KAAK,gBAAL,GAAwB,IADlD;AAED;;AAED,WAAO,IAAP;AACD;;AAED,SAAO,KAAK,OAAL,CAAa,IAApB;AACD,CAxCD;;AA0CA,aAAa,SAAb,CAAuB,SAAvB,GAAmC,UAAU,SAAV,EAAqB,KAArB,EAA4B,SAA5B,EAAuC,gBAAvC,EAAyD,WAAzD,EAAsE,IAAtE,EAA4E;AAC7G,MAAI,UAAU,KAAd;;AAEA;AACA;AACA,MAAI,EAAE,OAAO,QAAQ,KAAK,OAAL,CAAa,WAAb,CAAjB,CAAJ,EAAiD;AAC/C,WAAQ,KAAK,OAAL,CAAa,IAAb,CAAkB,OAAlB,GACJ,KAAK,OAAL,CAAa,IAAb,CAAkB,OAAlB,CAA0B,SAA1B,EAAqC,KAArC,EAA4C,OAA5C,EAAqD,IAArD,EAA2D,WAA3D,EAAwE,SAAxE,EAAmF,gBAAnF,CADI,GAEJ,KAFJ;AAGD;;AAED,MAAM,cAAc,KAAK,OAAL,CAAa,IAAb,CAAkB,OAAtC;;AAEA,MAAI,gBAAgB,SAApB,EAA+B;AAC7B,QAAM,SAAS,MAAM,WAAN,CAAkB,SAAlB,EAA6B,gBAA7B,EAA+C,MAA/C,CAAf;AACA,QAAM,OAAO,MAAM,SAAN,CAAgB,SAAhB,CAAb;;AAEA,SAAK,CAAL,IAAU,OAAO,CAAjB;AACA,SAAK,CAAL,IAAU,OAAO,CAAjB;;AAEA,QAAM,aAAc,KAAK,CAAL,GAAS,KAAK,IAAf,IAAyB,KAAK,CAAL,GAAS,KAAK,KAA1D;AACA,QAAM,WAAc,KAAK,CAAL,GAAS,KAAK,GAAf,IAAyB,KAAK,CAAL,GAAS,KAAK,MAA1D;;AAEA,cAAU,cAAc,QAAxB;AACD;;AAED,MAAM,WAAW,UAAU,OAAV,CAAkB,gBAAlB,CAAjB;;AAEA,MAAI,YAAY,gBAAgB,QAAhC,EAA0C;AACxC,QAAM,KAAK,SAAS,IAAT,GAAgB,SAAS,KAAT,GAAkB,CAA7C;AACA,QAAM,KAAK,SAAS,GAAT,GAAgB,SAAS,MAAT,GAAkB,CAA7C;;AAEA,cAAU,MAAM,KAAK,IAAX,IAAmB,MAAM,KAAK,KAA9B,IAAuC,MAAM,KAAK,GAAlD,IAAyD,MAAM,KAAK,MAA9E;AACD;;AAED,MAAI,YAAY,MAAM,EAAN,CAAS,MAAT,CAAgB,WAAhB,CAAhB,EAA8C;AAC5C,QAAM,cAAgB,KAAK,GAAL,CAAS,CAAT,EAAY,KAAK,GAAL,CAAS,KAAK,KAAd,EAAsB,SAAS,KAA/B,IAAyC,KAAK,GAAL,CAAS,KAAK,IAAd,EAAoB,SAAS,IAA7B,CAArD,IACE,KAAK,GAAL,CAAS,CAAT,EAAY,KAAK,GAAL,CAAS,KAAK,MAAd,EAAsB,SAAS,MAA/B,IAAyC,KAAK,GAAL,CAAS,KAAK,GAAd,EAAoB,SAAS,GAA7B,CAArD,CADxB;;AAGA,QAAM,eAAe,eAAe,SAAS,KAAT,GAAiB,SAAS,MAAzC,CAArB;;AAEA,cAAU,gBAAgB,WAA1B;AACD;;AAED,MAAI,KAAK,OAAL,CAAa,IAAb,CAAkB,OAAtB,EAA+B;AAC7B,cAAU,KAAK,OAAL,CAAa,IAAb,CAAkB,OAAlB,CAA0B,SAA1B,EAAqC,KAArC,EAA4C,OAA5C,EAAqD,IAArD,EAA2D,WAA3D,EAAwE,SAAxE,EAAmF,gBAAnF,CAAV;AACD;;AAED,SAAO,OAAP;AACD,CAjDD;;AAmDA,aAAa,OAAb,CAAqB,EAArB,CAAwB,OAAxB,EAAiC,iBAA4B;AAAA,MAAhB,YAAgB,SAAhB,YAAgB;;AAC3D,eAAa,QAAb,CAAsB,KAAtB;AACD,CAFD;;AAIA,aAAa,eAAb,CAA6B,IAA7B,CAAkC,aAAlC;;AAEA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,KAAvB,EAA8B,UAAU,WAAV,EAAuB;AACnD,cAAY,UAAZ,GAA8B,IAA9B,CADmD,CACf;AACpC,cAAY,WAAZ,GAA8B,IAA9B,CAFmD,CAEf;AACpC,cAAY,cAAZ,GAA8B,IAA9B,CAHmD,CAGf;AACpC,cAAY,eAAZ,GAA8B,IAA9B,CAJmD,CAIf;AACpC,cAAY,UAAZ,GAA8B,IAA9B,CALmD,CAKf;;AAEpC,cAAY,WAAZ,GAA0B;AACxB,eAAW,EADa,EACJ;AACpB,cAAW,EAFa,EAEJ;AACpB,WAAW,EAHa,CAGJ;AAHI,GAA1B;AAMD,CAbD;;AAeA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,MAAvB,EAA+B,iBAA2B;AAAA,MAAf,WAAe,SAAf,WAAe;;AACxD,cAAY,UAAZ,GAAyB,YAAY,WAAZ,GACvB,YAAY,cAAZ,GAA6B,YAAY,eAAZ,GAA8B,IAD7D;AAED,CAHD;;AAKA;;;;;;;;;;;AAWA,SAAS,WAAT,GAAuB,UAAU,QAAV,EAAoB;AACzC,MAAI,MAAM,EAAN,CAAS,IAAT,CAAc,QAAd,CAAJ,EAA6B;AAC3B;AACE;AACF;;AAEA,kBAAc,QAAd;;AAEA,WAAO,QAAP;AACD;AACD,SAAO,WAAP;AACD,CAXD;;AAaA,MAAM,KAAN,CAAY,aAAa,UAAzB,EAAqC,CACnC,WADmC,EAEnC,WAFmC,EAGnC,cAHmC,EAInC,gBAJmC,EAKnC,UALmC,EAMnC,MANmC,CAArC;AAQA,QAAQ,UAAR,CAAmB,IAAnB,GAA0B,UAA1B;;AAEA,eAAe,IAAf,GAAsB,KAAK,QAA3B;;AAEA,OAAO,OAAP,GAAiB,IAAjB;;;;;ACzdA,IAAM,UAAiB,QAAQ,QAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,UAAR,CAAvB;AACA,IAAM,gBAAiB,QAAQ,kBAAR,CAAvB;AACA,IAAM,eAAiB,QAAQ,iBAAR,CAAvB;AACA,IAAM,cAAiB,QAAQ,gBAAR,CAAvB;AACA,IAAM,iBAAiB,QAAQ,mBAAR,CAAvB;;AAEA,IAAM,UAAU;AACd,YAAU;AACR,aAAU,KADF;AAER,YAAU,IAFF;AAGR,cAAU;AAHF,GADI;;AAOd,WAAS,iBAAU,OAAV,EAAmB,KAAnB,EAA0B,YAA1B,EAAwC,OAAxC,EAAiD,WAAjD,EAA8D;AACrE,QAAI,YAAY,UAAZ,CAAuB,MAAvB,IAAiC,CAArC,EAAwC;AACtC,aAAO,EAAE,MAAM,SAAR,EAAP;AACD;;AAED,WAAO,IAAP;AACD,GAba;;AAed,aAAW,qBAAY;AACrB,WAAO,EAAP;AACD;AAjBa,CAAhB;;AAoBA,cAAc,OAAd,CAAsB,EAAtB,CAAyB,KAAzB,EAAgC,gBAAmC;AAAA,MAAvB,MAAuB,QAAvB,MAAuB;AAAA,MAAf,WAAe,QAAf,WAAe;;AACjE,MAAI,OAAO,IAAP,KAAgB,cAApB,EAAoC;AAAE;AAAS;AAC/C,SAAO,EAAP,GAAY,CAAZ;;AAEA,cAAY,OAAZ,CAAoB,aAApB,GAAoC,YAAY,OAAZ,CAAoB,YAApB,GAAmC,OAAO,QAA9E;AACA,cAAY,OAAZ,CAAoB,UAApB,GAAiC,YAAY,OAAZ,CAAoB,SAApB,GAAgC,OAAO,KAAxE;AACA,cAAY,OAAZ,CAAoB,KAApB,GAA4B,CAA5B;AACD,CAPD;;AASA,cAAc,OAAd,CAAsB,EAAtB,CAAyB,KAAzB,EAAgC,iBAAmC;AAAA,MAAvB,MAAuB,SAAvB,MAAuB;AAAA,MAAf,WAAe,SAAf,WAAe;;AACjE,MAAI,OAAO,IAAP,KAAgB,aAApB,EAAmC;AAAE;AAAS;;AAE9C,SAAO,EAAP,GAAY,OAAO,KAAP,GAAe,YAAY,OAAZ,CAAoB,KAA/C;;AAEA,cAAY,MAAZ,CAAmB,IAAnB,CAAwB,MAAxB;;AAEA,cAAY,OAAZ,CAAoB,SAApB,GAAgC,OAAO,KAAvC;AACA,cAAY,OAAZ,CAAoB,YAApB,GAAmC,OAAO,QAA1C;;AAEA,MAAI,OAAO,KAAP,KAAiB,QAAjB,IACG,OAAO,KAAP,KAAiB,IADpB,IAEG,OAAO,KAAP,KAAiB,SAFpB,IAGG,CAAC,MAAM,OAAO,KAAb,CAHR,EAG6B;;AAE3B,gBAAY,OAAZ,CAAoB,KAApB,GAA4B,OAAO,KAAnC;AACD;AACF,CAjBD;;AAmBA;;;;;;;;;;;;;;;;;;;;;;;AAuBA,aAAa,SAAb,CAAuB,UAAvB,GAAoC,UAAU,OAAV,EAAmB;AACrD,MAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,OAAhB,CAAJ,EAA8B;AAC5B,SAAK,OAAL,CAAa,OAAb,CAAqB,OAArB,GAA+B,QAAQ,OAAR,KAAoB,KAApB,GAA2B,KAA3B,GAAkC,IAAjE;AACA,SAAK,YAAL,CAAkB,SAAlB,EAA6B,OAA7B;AACA,SAAK,WAAL,CAAiB,SAAjB,EAA4B,OAA5B;;AAEA,WAAO,IAAP;AACD;;AAED,MAAI,MAAM,EAAN,CAAS,IAAT,CAAc,OAAd,CAAJ,EAA4B;AAC1B,SAAK,OAAL,CAAa,OAAb,CAAqB,OAArB,GAA+B,OAA/B;;AAEA,QAAI,CAAC,OAAL,EAAc;AACZ,WAAK,cAAL,GAAsB,KAAK,cAAL,GAAsB,KAAK,YAAL,GAAoB,IAAhE;AACD;;AAED,WAAO,IAAP;AACD;;AAED,SAAO,KAAK,OAAL,CAAa,OAApB;AACD,CApBD;;AAsBA,cAAc,OAAd,CAAsB,EAAtB,CAAyB,WAAzB,EAAsC,iBAAiF;AAAA,MAArE,WAAqE,SAArE,WAAqE;AAAA,MAAxD,MAAwD,SAAxD,MAAwD;AAAA,MAAhD,MAAgD,SAAhD,MAAgD;AAAA,MAAxC,KAAwC,SAAxC,KAAwC;AAAA,MAAjC,QAAiC,SAAjC,QAAiC;AAAA,MAAvB,MAAuB,SAAvB,MAAuB;AAAA,MAAf,WAAe,SAAf,WAAe;;AACrH,MAAI,WAAW,SAAf,EAA0B;AAAE;AAAS;;AAErC,MAAM,WAAW,YAAY,QAA7B;;AAEA,SAAO,OAAP,GAAiB,CAAC,SAAS,CAAT,CAAD,EAAc,SAAS,CAAT,CAAd,CAAjB;;AAEA,MAAI,QAAJ,EAAc;AACZ,WAAO,QAAP,GAAkB,MAAM,aAAN,CAAoB,QAApB,EAA8B,WAA9B,CAAlB;AACA,WAAO,GAAP,GAAkB,MAAM,SAAN,CAAgB,QAAhB,CAAlB;AACA,WAAO,KAAP,GAAkB,CAAlB;AACA,WAAO,EAAP,GAAkB,CAAlB;AACA,WAAO,KAAP,GAAkB,MAAM,UAAN,CAAiB,QAAjB,EAA2B,SAA3B,EAAsC,WAAtC,CAAlB;AACA,WAAO,EAAP,GAAkB,CAAlB;AACD,GAPD,MAQK,IAAI,UAAU,iBAAiB,aAA/B,EAA8C;AACjD,WAAO,QAAP,GAAkB,YAAY,SAAZ,CAAsB,QAAxC;AACA,WAAO,GAAP,GAAkB,YAAY,SAAZ,CAAsB,GAAxC;AACA,WAAO,KAAP,GAAkB,YAAY,SAAZ,CAAsB,KAAxC;AACA,WAAO,EAAP,GAAkB,OAAO,KAAP,GAAe,CAAjC;AACA,WAAO,KAAP,GAAkB,YAAY,SAAZ,CAAsB,KAAxC;AACA,WAAO,EAAP,GAAkB,OAAO,KAAP,GAAe,YAAY,OAAZ,CAAoB,UAArD;AACD,GAPI,MAQA;AACH,WAAO,QAAP,GAAkB,MAAM,aAAN,CAAoB,QAApB,EAA8B,WAA9B,CAAlB;AACA,WAAO,GAAP,GAAkB,MAAM,SAAN,CAAgB,QAAhB,CAAlB;AACA,WAAO,KAAP,GAAkB,OAAO,QAAP,GAAkB,YAAY,OAAZ,CAAoB,aAAxD;AACA,WAAO,KAAP,GAAkB,MAAM,UAAN,CAAiB,QAAjB,EAA2B,YAAY,OAAZ,CAAoB,SAA/C,EAA0D,WAA1D,CAAlB;;AAEA,WAAO,EAAP,GAAY,OAAO,KAAP,GAAe,YAAY,OAAZ,CAAoB,SAA/C;AACA,WAAO,EAAP,GAAY,OAAO,KAAP,GAAe,YAAY,OAAZ,CAAoB,SAA/C;AACD;AACF,CAhCD;;AAkCA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,KAAvB,EAA8B,UAAU,WAAV,EAAuB;AACnD,cAAY,OAAZ,GAAsB;AACpB,WAAO,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EADa;;AAGpB,mBAAe,CAHK,EAGA;AACpB,kBAAe,CAJK;AAKpB,cAAe,CALK;;AAOpB,WAAO,CAPa,EAOA;;AAEpB,gBAAY,CATQ,EASA;AACpB,eAAY,CAVQ,CAUA;AAVA,GAAtB;AAYD,CAbD;;AAeA,QAAQ,OAAR,GAAkB,OAAlB;AACA,QAAQ,KAAR,CAAc,IAAd,CAAmB,SAAnB;AACA,MAAM,KAAN,CAAY,aAAa,UAAzB,EAAqC,CACnC,cADmC,EAEnC,aAFmC,EAGnC,YAHmC,CAArC;AAKA,QAAQ,UAAR,CAAmB,OAAnB,GAA6B,YAA7B;;AAEA,eAAe,OAAf,GAAyB,QAAQ,QAAjC;;AAEA,OAAO,OAAP,GAAiB,OAAjB;;;;;AChKA,IAAM,UAAiB,QAAQ,QAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,UAAR,CAAvB;AACA,IAAM,UAAiB,QAAQ,kBAAR,CAAvB;AACA,IAAM,gBAAiB,QAAQ,kBAAR,CAAvB;AACA,IAAM,eAAiB,QAAQ,iBAAR,CAAvB;AACA,IAAM,cAAiB,QAAQ,gBAAR,CAAvB;AACA,IAAM,iBAAiB,QAAQ,mBAAR,CAAvB;;AAEA;AACA,IAAM,gBAAgB,QAAQ,aAAR,IAAyB,QAAQ,oBAAjC,GAAuD,EAAvD,GAA2D,EAAjF;;AAEA,IAAM,SAAS;AACb,YAAU;AACR,aAAc,KADN;AAER,kBAAc,IAFN;;AAIR,YAAY,IAJJ;AAKR,UAAY,IALJ;AAMR,cAAY,IANJ;AAOR,aAAY,IAPJ;AAQR,gBAAY,IARJ;;AAUR,YAAQ,KAVA;AAWR,yBAAqB,KAXb;AAYR,UAAM,IAZE;;AAcR;AACA,YAAQ,GAfA;;AAiBR;AACA;AACA;AACA;AACA,WAAO,IArBC;;AAuBR;AACA;AACA;AACA;AACA,YAAQ;AA3BA,GADG;;AA+Bb,WAAS,iBAAU,OAAV,EAAmB,KAAnB,EAA0B,YAA1B,EAAwC,OAAxC,EAAiD,WAAjD,EAA8D,IAA9D,EAAoE;AAC3E,QAAI,CAAC,IAAL,EAAW;AAAE,aAAO,IAAP;AAAc;;AAE3B,QAAM,OAAO,MAAM,MAAN,CAAa,EAAb,EAAiB,YAAY,SAAZ,CAAsB,IAAvC,CAAb;AACA,QAAM,UAAU,aAAa,OAA7B;;AAEA,QAAI,QAAQ,MAAR,CAAe,OAAnB,EAA4B;AAC1B,UAAM,gBAAgB,QAAQ,MAA9B;AACA,UAAM,cAAc,EAAE,MAAM,KAAR,EAAe,OAAO,KAAtB,EAA6B,KAAK,KAAlC,EAAyC,QAAQ,KAAjD,EAApB;;AAEA;AACA,UAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,cAAc,KAA9B,CAAJ,EAA0C;AACxC,aAAK,IAAM,IAAX,IAAmB,WAAnB,EAAgC;AAC9B,sBAAY,IAAZ,IAAoB,gBAAgB,IAAhB,EACgB,cAAc,KAAd,CAAoB,IAApB,CADhB,EAEgB,IAFhB,EAGgB,YAAY,YAH5B,EAIgB,OAJhB,EAKgB,IALhB,EAMgB,cAAc,MAAd,IAAwB,aANxC,CAApB;AAOD;;AAED,oBAAY,IAAZ,GAAmB,YAAY,IAAZ,IAAoB,CAAC,YAAY,KAApD;AACA,oBAAY,GAAZ,GAAmB,YAAY,GAAZ,IAAoB,CAAC,YAAY,MAApD;;AAEA,YAAI,YAAY,IAAZ,IAAoB,YAAY,KAAhC,IAAyC,YAAY,GAArD,IAA4D,YAAY,MAA5E,EAAoF;AAClF,iBAAO;AACL,kBAAM,QADD;AAEL,mBAAO;AAFF,WAAP;AAID;AACF,OApBD,MAqBK;AACH,YAAM,QAAS,QAAQ,MAAR,CAAe,IAAf,KAAwB,GAAxB,IAA+B,KAAK,CAAL,GAAU,KAAK,KAAL,GAAc,aAAtE;AACA,YAAM,SAAS,QAAQ,MAAR,CAAe,IAAf,KAAwB,GAAxB,IAA+B,KAAK,CAAL,GAAU,KAAK,MAAL,GAAc,aAAtE;;AAEA,YAAI,SAAS,MAAb,EAAqB;AACnB,iBAAO;AACL,kBAAM,QADD;AAEL,kBAAM,CAAC,QAAO,GAAP,GAAa,EAAd,KAAqB,SAAQ,GAAR,GAAc,EAAnC;AAFD,WAAP;AAID;AACF;AACF;;AAED,WAAO,IAAP;AACD,GA7EY;;AA+Eb,WAAU,QAAQ,YAAR,GAAuB;AAC/B,OAAI,UAD2B;AAE/B,OAAI,UAF2B;AAG/B,QAAI,WAH2B;;AAK/B,SAAa,UALkB;AAM/B,UAAa,UANkB;AAO/B,YAAa,UAPkB;AAQ/B,WAAa,UARkB;AAS/B,aAAa,WATkB;AAU/B,iBAAa,WAVkB;AAW/B,cAAa,WAXkB;AAY/B,gBAAa;AAZkB,GAAvB,GAaN;AACF,OAAI,WADF;AAEF,OAAI,WAFF;AAGF,QAAI,aAHF;;AAKF,SAAa,WALX;AAMF,UAAa,WANX;AAOF,YAAa,WAPX;AAQF,WAAa,WARX;AASF,aAAa,aATX;AAUF,iBAAa,aAVX;AAWF,cAAa,aAXX;AAYF,gBAAa;AAZX,GA5FS;;AA2Gb,aAAW,mBAAU,MAAV,EAAkB;AAC3B,QAAI,OAAO,IAAX,EAAiB;AACf,aAAO,OAAO,OAAP,CAAe,OAAO,IAAP,GAAc,OAAO,IAApC,CAAP;AACD,KAFD,MAGK,IAAI,OAAO,KAAX,EAAkB;AACrB,UAAI,YAAY,EAAhB;AACA,UAAM,YAAY,CAAC,KAAD,EAAQ,QAAR,EAAkB,MAAlB,EAA0B,OAA1B,CAAlB;;AAEA,WAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,CAApB,EAAuB,GAAvB,EAA4B;AAC1B,YAAI,OAAO,KAAP,CAAa,UAAU,CAAV,CAAb,CAAJ,EAAgC;AAC9B,uBAAa,UAAU,CAAV,CAAb;AACD;AACF;;AAED,aAAO,OAAO,OAAP,CAAe,SAAf,CAAP;AACD;AACF;AA3HY,CAAf;;AA8HA;AACA,cAAc,OAAd,CAAsB,EAAtB,CAAyB,KAAzB,EAAgC,gBAAmC;AAAA,MAAvB,MAAuB,QAAvB,MAAuB;AAAA,MAAf,WAAe,QAAf,WAAe;;AACjE,MAAI,OAAO,IAAP,KAAgB,aAAhB,IAAiC,CAAC,YAAY,QAAZ,CAAqB,KAA3D,EAAkE;AAChE;AACD;;AAED,MAAM,YAAY,YAAY,MAAZ,CAAmB,OAAnB,CAA2B,YAAY,OAAvC,CAAlB;AACA,MAAM,gBAAgB,YAAY,MAAZ,CAAmB,OAAnB,CAA2B,MAAjD;;AAEA;;;;;;AAMA,MAAI,cAAc,MAAd,IAAwB,cAAc,mBAA1C,EAA+D;AAC7D,QAAM,cAAc,MAAM,MAAN,CAAa,EAAb,EAAiB,YAAY,QAAZ,CAAqB,KAAtC,CAApB;;AAEA,gBAAY,GAAZ,GAAqB,YAAY,GAAZ,IAAuB,YAAY,IAAZ,IAAsB,CAAC,YAAY,MAA/E;AACA,gBAAY,IAAZ,GAAqB,YAAY,IAAZ,IAAuB,YAAY,GAAZ,IAAsB,CAAC,YAAY,KAA/E;AACA,gBAAY,MAAZ,GAAqB,YAAY,MAAZ,IAAuB,YAAY,KAAZ,IAAsB,CAAC,YAAY,GAA/E;AACA,gBAAY,KAAZ,GAAqB,YAAY,KAAZ,IAAuB,YAAY,MAAZ,IAAsB,CAAC,YAAY,IAA/E;;AAEA,gBAAY,QAAZ,CAAqB,YAArB,GAAoC,WAApC;AACD,GATD,MAUK;AACH,gBAAY,QAAZ,CAAqB,YAArB,GAAoC,IAApC;AACD;;AAED;AACA,MAAI,cAAc,mBAAlB,EAAuC;AACrC,gBAAY,sBAAZ,GAAqC,UAAU,KAAV,GAAkB,UAAU,MAAjE;AACD;;AAED,cAAY,WAAZ,GAA0B;AACxB,WAAY,SADY;AAExB,aAAY,MAAM,MAAN,CAAa,EAAb,EAAiB,SAAjB,CAFY;AAGxB,cAAY,MAAM,MAAN,CAAa,EAAb,EAAiB,SAAjB,CAHY;AAIxB,cAAY,MAAM,MAAN,CAAa,EAAb,EAAiB,SAAjB,CAJY;AAKxB,WAAY;AACV,YAAM,CADI,EACD,OAAQ,CADP,EACU,OAAQ,CADlB;AAEV,WAAM,CAFI,EAED,QAAQ,CAFP,EAEU,QAAQ;AAFlB;AALY,GAA1B;;AAWA,SAAO,IAAP,GAAc,YAAY,WAAZ,CAAwB,QAAtC;AACA,SAAO,SAAP,GAAmB,YAAY,WAAZ,CAAwB,KAA3C;AACD,CA9CD;;AAgDA;AACA,cAAc,OAAd,CAAsB,EAAtB,CAAyB,KAAzB,EAAgC,iBAA0C;AAAA,MAA9B,MAA8B,SAA9B,MAA8B;AAAA,MAAtB,KAAsB,SAAtB,KAAsB;AAAA,MAAf,WAAe,SAAf,WAAe;;AACxE,MAAI,UAAU,MAAV,IAAoB,CAAC,YAAY,QAAZ,CAAqB,KAA9C,EAAqD;AAAE;AAAS;;AAEhE,MAAM,gBAAgB,YAAY,MAAZ,CAAmB,OAAnB,CAA2B,MAAjD;AACA,MAAM,SAAS,cAAc,MAA7B;AACA,MAAM,aAAa,WAAW,YAAX,IAA2B,WAAW,QAAzD;;AAEA,MAAI,QAAQ,YAAY,QAAZ,CAAqB,KAAjC;;AAEA,MAAM,QAAa,YAAY,WAAZ,CAAwB,KAA3C;AACA,MAAM,UAAa,YAAY,WAAZ,CAAwB,OAA3C;AACA,MAAM,WAAa,YAAY,WAAZ,CAAwB,QAA3C;AACA,MAAM,QAAa,YAAY,WAAZ,CAAwB,KAA3C;AACA,MAAM,WAAa,MAAM,MAAN,CAAa,YAAY,WAAZ,CAAwB,QAArC,EAA+C,QAA/C,CAAnB;AACA,MAAM,gBAAgB,KAAtB;;AAEA,MAAI,KAAK,OAAO,EAAhB;AACA,MAAI,KAAK,OAAO,EAAhB;;AAEA,MAAI,cAAc,mBAAd,IAAqC,cAAc,MAAvD,EAA+D;AAC7D;AACA,QAAM,mBAAmB,cAAc,mBAAd,GACrB,YAAY,sBADS,GAErB,CAFJ;;AAIA,YAAQ,YAAY,QAAZ,CAAqB,YAA7B;;AAEA,QAAK,cAAc,IAAd,IAAsB,cAAc,MAArC,IACI,cAAc,KAAd,IAAuB,cAAc,GAD7C,EACmD;AACjD,WAAK,CAAC,EAAD,GAAM,gBAAX;AACD,KAHD,MAIK,IAAI,cAAc,IAAd,IAAsB,cAAc,KAAxC,EAAgD;AAAE,WAAK,KAAK,gBAAV;AAA6B,KAA/E,MACA,IAAI,cAAc,GAAd,IAAsB,cAAc,MAAxC,EAAgD;AAAE,WAAK,KAAK,gBAAV;AAA6B;AACrF;;AAED;AACA,MAAI,MAAM,GAAV,EAAkB;AAAE,YAAQ,GAAR,IAAkB,EAAlB;AAAuB;AAC3C,MAAI,MAAM,MAAV,EAAkB;AAAE,YAAQ,MAAR,IAAkB,EAAlB;AAAuB;AAC3C,MAAI,MAAM,IAAV,EAAkB;AAAE,YAAQ,IAAR,IAAkB,EAAlB;AAAuB;AAC3C,MAAI,MAAM,KAAV,EAAkB;AAAE,YAAQ,KAAR,IAAkB,EAAlB;AAAuB;;AAE3C,MAAI,UAAJ,EAAgB;AACd;AACA,UAAM,MAAN,CAAa,QAAb,EAAuB,OAAvB;;AAEA,QAAI,WAAW,YAAf,EAA6B;AAC3B;AACA,UAAI,aAAJ;;AAEA,UAAI,SAAS,GAAT,GAAe,SAAS,MAA5B,EAAoC;AAClC,eAAO,SAAS,GAAhB;;AAEA,iBAAS,GAAT,GAAe,SAAS,MAAxB;AACA,iBAAS,MAAT,GAAkB,IAAlB;AACD;AACD,UAAI,SAAS,IAAT,GAAgB,SAAS,KAA7B,EAAoC;AAClC,eAAO,SAAS,IAAhB;;AAEA,iBAAS,IAAT,GAAgB,SAAS,KAAzB;AACA,iBAAS,KAAT,GAAiB,IAAjB;AACD;AACF;AACF,GArBD,MAsBK;AACH;AACA,aAAS,GAAT,GAAkB,KAAK,GAAL,CAAS,QAAQ,GAAjB,EAAsB,MAAM,MAA5B,CAAlB;AACA,aAAS,MAAT,GAAkB,KAAK,GAAL,CAAS,QAAQ,MAAjB,EAAyB,MAAM,GAA/B,CAAlB;AACA,aAAS,IAAT,GAAkB,KAAK,GAAL,CAAS,QAAQ,IAAjB,EAAuB,MAAM,KAA7B,CAAlB;AACA,aAAS,KAAT,GAAkB,KAAK,GAAL,CAAS,QAAQ,KAAjB,EAAwB,MAAM,IAA9B,CAAlB;AACD;;AAED,WAAS,KAAT,GAAkB,SAAS,KAAT,GAAkB,SAAS,IAA7C;AACA,WAAS,MAAT,GAAkB,SAAS,MAAT,GAAkB,SAAS,GAA7C;;AAEA,OAAK,IAAM,IAAX,IAAmB,QAAnB,EAA6B;AAC3B,UAAM,IAAN,IAAc,SAAS,IAAT,IAAiB,SAAS,IAAT,CAA/B;AACD;;AAED,SAAO,KAAP,GAAe,YAAY,QAAZ,CAAqB,KAApC;AACA,SAAO,IAAP,GAAc,QAAd;AACA,SAAO,SAAP,GAAmB,KAAnB;AACD,CAjFD;;AAmFA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4CA,aAAa,SAAb,CAAuB,SAAvB,GAAmC,UAAU,OAAV,EAAmB;AACpD,MAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,OAAhB,CAAJ,EAA8B;AAC5B,SAAK,OAAL,CAAa,MAAb,CAAoB,OAApB,GAA8B,QAAQ,OAAR,KAAoB,KAApB,GAA2B,KAA3B,GAAkC,IAAhE;AACA,SAAK,YAAL,CAAkB,QAAlB,EAA4B,OAA5B;AACA,SAAK,WAAL,CAAiB,QAAjB,EAA2B,OAA3B;;AAEA,QAAI,eAAe,IAAf,CAAoB,QAAQ,IAA5B,CAAJ,EAAuC;AACrC,WAAK,OAAL,CAAa,MAAb,CAAoB,IAApB,GAA2B,QAAQ,IAAnC;AACD,KAFD,MAGK,IAAI,QAAQ,IAAR,KAAiB,IAArB,EAA2B;AAC9B,WAAK,OAAL,CAAa,MAAb,CAAoB,IAApB,GAA2B,eAAe,MAAf,CAAsB,IAAjD;AACD;;AAED,QAAI,MAAM,EAAN,CAAS,IAAT,CAAc,QAAQ,mBAAtB,CAAJ,EAAgD;AAC9C,WAAK,OAAL,CAAa,MAAb,CAAoB,mBAApB,GAA0C,QAAQ,mBAAlD;AACD,KAFD,MAGK,IAAI,MAAM,EAAN,CAAS,IAAT,CAAc,QAAQ,MAAtB,CAAJ,EAAmC;AACtC,WAAK,OAAL,CAAa,MAAb,CAAoB,MAApB,GAA6B,QAAQ,MAArC;AACD;;AAED,WAAO,IAAP;AACD;AACD,MAAI,MAAM,EAAN,CAAS,IAAT,CAAc,OAAd,CAAJ,EAA4B;AAC1B,SAAK,OAAL,CAAa,MAAb,CAAoB,OAApB,GAA8B,OAA9B;;AAEA,QAAI,CAAC,OAAL,EAAc;AACZ,WAAK,aAAL,GAAqB,KAAK,aAAL,GAAqB,KAAK,WAAL,GAAmB,IAA7D;AACD;;AAED,WAAO,IAAP;AACD;AACD,SAAO,KAAK,OAAL,CAAa,MAApB;AACD,CAhCD;;AAkCA,SAAS,eAAT,CAA0B,IAA1B,EAAgC,KAAhC,EAAuC,IAAvC,EAA6C,OAA7C,EAAsD,mBAAtD,EAA2E,IAA3E,EAAiF,MAAjF,EAAyF;AACvF;AACA,MAAI,CAAC,KAAL,EAAY;AAAE,WAAO,KAAP;AAAe;;AAE7B;AACA,MAAI,UAAU,IAAd,EAAoB;AAClB;AACA,QAAM,QAAS,MAAM,EAAN,CAAS,MAAT,CAAgB,KAAK,KAArB,IAA8B,KAAK,KAAnC,GAA4C,KAAK,KAAL,GAAc,KAAK,IAA9E;AACA,QAAM,SAAS,MAAM,EAAN,CAAS,MAAT,CAAgB,KAAK,MAArB,IAA8B,KAAK,MAAnC,GAA4C,KAAK,MAAL,GAAc,KAAK,GAA9E;;AAEA,QAAI,QAAQ,CAAZ,EAAe;AACb,UAAS,SAAS,MAAlB,EAA2B;AAAE,eAAO,OAAP;AAAiB,OAA9C,MACK,IAAI,SAAS,OAAb,EAAsB;AAAE,eAAO,MAAP;AAAiB;AAC/C;AACD,QAAI,SAAS,CAAb,EAAgB;AACd,UAAS,SAAS,KAAlB,EAA4B;AAAE,eAAO,QAAP;AAAkB,OAAhD,MACK,IAAI,SAAS,QAAb,EAAuB;AAAE,eAAO,KAAP;AAAkB;AACjD;;AAED,QAAI,SAAS,MAAb,EAAuB;AAAE,aAAO,KAAK,CAAL,GAAU,CAAC,SAAU,CAAV,GAAa,KAAK,IAAlB,GAAwB,KAAK,KAA9B,IAAwC,MAAzD;AAAmE;AAC5F,QAAI,SAAS,KAAb,EAAuB;AAAE,aAAO,KAAK,CAAL,GAAU,CAAC,UAAU,CAAV,GAAa,KAAK,GAAlB,GAAwB,KAAK,MAA9B,IAAwC,MAAzD;AAAmE;;AAE5F,QAAI,SAAS,OAAb,EAAuB;AAAE,aAAO,KAAK,CAAL,GAAU,CAAC,SAAU,CAAV,GAAa,KAAK,KAAlB,GAA0B,KAAK,IAAhC,IAAwC,MAAzD;AAAmE;AAC5F,QAAI,SAAS,QAAb,EAAuB;AAAE,aAAO,KAAK,CAAL,GAAU,CAAC,UAAU,CAAV,GAAa,KAAK,MAAlB,GAA0B,KAAK,GAAhC,IAAwC,MAAzD;AAAmE;AAC7F;;AAED;AACA,MAAI,CAAC,MAAM,EAAN,CAAS,OAAT,CAAiB,OAAjB,CAAL,EAAgC;AAAE,WAAO,KAAP;AAAe;;AAEjD,SAAO,MAAM,EAAN,CAAS,OAAT,CAAiB,KAAjB;AACP;AADO,IAEH,UAAU;AACZ;AAHK,IAIH,MAAM,WAAN,CAAkB,OAAlB,EAA2B,KAA3B,EAAkC,mBAAlC,CAJJ;AAKD;;AAED,YAAY,OAAZ,CAAoB,EAApB,CAAuB,KAAvB,EAA8B,UAAU,WAAV,EAAuB;AACnD,cAAY,UAAZ,GAAyB,IAAzB;AACD,CAFD;;AAIA,cAAc,OAAd,CAAsB,EAAtB,CAAyB,WAAzB,EAAsC,iBAA2C;AAAA,MAA/B,WAA+B,SAA/B,WAA+B;AAAA,MAAlB,MAAkB,SAAlB,MAAkB;AAAA,MAAV,MAAU,SAAV,MAAU;;AAC/E,MAAI,WAAW,QAAX,IAAuB,CAAC,YAAY,UAAxC,EAAoD;AAAE;AAAS;;AAE/D,MAAM,UAAU,YAAY,MAAZ,CAAmB,OAAnC;;AAEA,MAAI,QAAQ,MAAR,CAAe,MAAnB,EAA2B;AACzB,QAAI,YAAY,UAAZ,KAA2B,GAA/B,EAAoC;AAClC,aAAO,EAAP,GAAY,OAAO,EAAnB;AACD,KAFD,MAGK;AACH,aAAO,EAAP,GAAY,OAAO,EAAnB;AACD;AACD,WAAO,IAAP,GAAc,IAAd;AACD,GARD,MASK;AACH,WAAO,IAAP,GAAc,YAAY,UAA1B;;AAEA,QAAI,YAAY,UAAZ,KAA2B,GAA/B,EAAoC;AAClC,aAAO,EAAP,GAAY,CAAZ;AACD,KAFD,MAGK,IAAI,YAAY,UAAZ,KAA2B,GAA/B,EAAoC;AACvC,aAAO,EAAP,GAAY,CAAZ;AACD;AACF;AACF,CAxBD;;AA0BA,QAAQ,MAAR,GAAiB,MAAjB;AACA,QAAQ,KAAR,CAAc,IAAd,CAAmB,QAAnB;AACA,MAAM,KAAN,CAAY,aAAa,UAAzB,EAAqC,CACnC,aADmC,EAEnC,YAFmC,EAGnC,oBAHmC,EAInC,qBAJmC,EAKnC,WALmC,CAArC;AAOA,QAAQ,UAAR,CAAmB,MAAnB,GAA4B,WAA5B;;AAEA,eAAe,MAAf,GAAwB,OAAO,QAA/B;;AAEA,OAAO,OAAP,GAAiB,MAAjB;;;;;AC3aA,IAAM,MAAiB,QAAQ,aAAR,CAAvB;AACA,IAAM,YAAiB,QAAQ,gBAAR,EAA0B,SAAjD;AACA,IAAM,KAAiB,QAAQ,YAAR,CAAvB;AACA,IAAM,WAAiB,QAAQ,kBAAR,CAAvB;AACA,IAAM,cAAiB,QAAQ,eAAR,CAAvB;AACA,IAAM,iBAAiB,QAAQ,kBAAR,CAAvB;;AAEA,IAAM,aAAa;AACjB,YAAU;AACR,aAAW,KADH;AAER,eAAW,IAFH,EAEa;AACrB,YAAW,EAHH;AAIR,WAAW,GAJH,CAIa;AAJb,GADO;;AAQjB,eAAa,IARI;AASjB,KAAG,IATc,EASL;AACZ,KAAG,CAVc,EAUX,GAAG,CAVQ,EAUL;;AAEZ,eAAa,KAZI;AAajB,YAAU,CAbO;;AAejB,SAAO,eAAU,WAAV,EAAuB;AAC5B,eAAW,WAAX,GAAyB,IAAzB;AACA,QAAI,MAAJ,CAAW,WAAW,CAAtB;;AAEA,eAAW,WAAX,GAAyB,WAAzB;AACA,eAAW,QAAX,GAAsB,IAAI,IAAJ,GAAW,OAAX,EAAtB;AACA,eAAW,CAAX,GAAe,IAAI,OAAJ,CAAY,WAAW,MAAvB,CAAf;AACD,GAtBgB;;AAwBjB,QAAM,gBAAY;AAChB,eAAW,WAAX,GAAyB,KAAzB;AACA,QAAI,MAAJ,CAAW,WAAW,CAAtB;AACD,GA3BgB;;AA6BjB;AACA,UAAQ,kBAAY;AAClB,QAAM,UAAU,WAAW,WAAX,CAAuB,MAAvB,CAA8B,OAA9B,CAAsC,WAAW,WAAX,CAAuB,QAAvB,CAAgC,IAAtE,EAA4E,UAA5F;AACA,QAAM,YAAY,QAAQ,SAAR,IAAqB,UAAU,WAAW,WAAX,CAAuB,OAAjC,CAAvC;AACA,QAAM,MAAM,IAAI,IAAJ,GAAW,OAAX,EAAZ;AACA;AACA,QAAM,KAAK,CAAC,MAAM,WAAW,QAAlB,IAA8B,IAAzC;AACA;AACA,QAAM,IAAI,QAAQ,KAAR,GAAgB,EAA1B;;AAEA,QAAI,KAAK,CAAT,EAAY;AACV,UAAI,GAAG,MAAH,CAAU,SAAV,CAAJ,EAA0B;AACxB,kBAAU,QAAV,CAAmB,WAAW,CAAX,GAAe,CAAlC,EAAqC,WAAW,CAAX,GAAe,CAApD;AACD,OAFD,MAGK,IAAI,SAAJ,EAAe;AAClB,kBAAU,UAAV,IAAwB,WAAW,CAAX,GAAe,CAAvC;AACA,kBAAU,SAAV,IAAwB,WAAW,CAAX,GAAe,CAAvC;AACD;;AAED,iBAAW,QAAX,GAAsB,GAAtB;AACD;;AAED,QAAI,WAAW,WAAf,EAA4B;AAC1B,UAAI,MAAJ,CAAW,WAAW,CAAtB;AACA,iBAAW,CAAX,GAAe,IAAI,OAAJ,CAAY,WAAW,MAAvB,CAAf;AACD;AACF,GAvDgB;AAwDjB,SAAO,eAAU,YAAV,EAAwB,UAAxB,EAAoC;AACzC,QAAM,UAAU,aAAa,OAA7B;;AAEA,WAAO,QAAQ,UAAR,EAAoB,UAApB,IAAkC,QAAQ,UAAR,EAAoB,UAApB,CAA+B,OAAxE;AACD,GA5DgB;AA6DjB,qBAAmB,iCAAoC;AAAA,QAAxB,WAAwB,QAAxB,WAAwB;AAAA,QAAX,OAAW,QAAX,OAAW;;AACrD,QAAI,EAAE,YAAY,WAAZ,MACG,WAAW,KAAX,CAAiB,YAAY,MAA7B,EAAqC,YAAY,QAAZ,CAAqB,IAA1D,CADL,CAAJ,EAC2E;AACzE;AACD;;AAED,QAAI,YAAY,UAAhB,EAA4B;AAC1B,iBAAW,CAAX,GAAe,WAAW,CAAX,GAAe,CAA9B;AACA;AACD;;AAED,QAAI,YAAJ;AACA,QAAI,cAAJ;AACA,QAAI,eAAJ;AACA,QAAI,aAAJ;;AAEA,QAAM,UAAU,YAAY,MAAZ,CAAmB,OAAnB,CAA2B,YAAY,QAAZ,CAAqB,IAAhD,EAAsD,UAAtE;AACA,QAAM,YAAY,QAAQ,SAAR,IAAqB,UAAU,YAAY,OAAtB,CAAvC;;AAEA,QAAI,GAAG,MAAH,CAAU,SAAV,CAAJ,EAA0B;AACxB,aAAS,QAAQ,OAAR,GAAkB,WAAW,MAAtC;AACA,YAAS,QAAQ,OAAR,GAAkB,WAAW,MAAtC;AACA,cAAS,QAAQ,OAAR,GAAkB,UAAU,UAAV,GAAwB,WAAW,MAA9D;AACA,eAAS,QAAQ,OAAR,GAAkB,UAAU,WAAV,GAAwB,WAAW,MAA9D;AACD,KALD,MAMK;AACH,UAAM,OAAO,SAAS,oBAAT,CAA8B,SAA9B,CAAb;;AAEA,aAAS,QAAQ,OAAR,GAAkB,KAAK,IAAL,GAAc,WAAW,MAApD;AACA,YAAS,QAAQ,OAAR,GAAkB,KAAK,GAAL,GAAc,WAAW,MAApD;AACA,cAAS,QAAQ,OAAR,GAAkB,KAAK,KAAL,GAAc,WAAW,MAApD;AACA,eAAS,QAAQ,OAAR,GAAkB,KAAK,MAAL,GAAc,WAAW,MAApD;AACD;;AAED,eAAW,CAAX,GAAgB,QAAQ,CAAR,GAAW,OAAM,CAAC,CAAP,GAAU,CAArC;AACA,eAAW,CAAX,GAAgB,SAAQ,CAAR,GAAY,MAAK,CAAC,CAAN,GAAS,CAArC;;AAEA,QAAI,CAAC,WAAW,WAAhB,EAA6B;AAC3B;AACA,iBAAW,MAAX,GAAoB,QAAQ,MAA5B;AACA,iBAAW,KAAX,GAAoB,QAAQ,KAA5B;;AAEA,iBAAW,KAAX,CAAiB,WAAjB;AACD;AACF;AAzGgB,CAAnB;;AA4GA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,aAAvB,EAAsC,YAAY;AAChD,aAAW,IAAX;AACD,CAFD;;AAIA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,aAAvB,EAAsC,WAAW,iBAAjD;;AAEA,eAAe,SAAf,CAAyB,UAAzB,GAAsC,WAAW,QAAjD;;AAEA,OAAO,OAAP,GAAiB,UAAjB;;;;;AC3HA,IAAM,eAAe,QAAQ,iBAAR,CAArB;AACA,IAAM,UAAe,QAAQ,iBAAR,CAArB;AACA,IAAM,KAAe,QAAQ,aAAR,CAArB;AACA,IAAM,WAAe,QAAQ,mBAAR,CAArB;;AAEA,aAAa,SAAb,CAAuB,SAAvB,GAAmC,UAAU,OAAV,EAAmB,KAAnB,EAA0B,WAA1B,EAAuC,OAAvC,EAAgD;AACjF,MAAM,SAAS,KAAK,oBAAL,CAA0B,OAA1B,EAAmC,KAAnC,EAA0C,WAA1C,EAAuD,OAAvD,CAAf;;AAEA,MAAI,KAAK,OAAL,CAAa,aAAjB,EAAgC;AAC9B,WAAO,KAAK,OAAL,CAAa,aAAb,CAA2B,OAA3B,EAAoC,KAApC,EAA2C,MAA3C,EAAmD,IAAnD,EAAyD,OAAzD,EAAkE,WAAlE,CAAP;AACD;;AAED,SAAO,MAAP;AACD,CARD;;AAUA;;;;;;;;;;;;;;;AAeA,aAAa,SAAb,CAAuB,UAAvB,GAAoC,UAAU,QAAV,EAAoB;AACtD,SAAO,KAAK,iBAAL,CAAuB,YAAvB,EAAqC,QAArC,CAAP;AACD,CAFD;;AAIA;;;;;;;;;;;;;;;AAeA,aAAa,SAAb,CAAuB,SAAvB,GAAmC,UAAU,QAAV,EAAoB;AACrD,SAAO,KAAK,iBAAL,CAAuB,WAAvB,EAAoC,QAApC,CAAP;AACD,CAFD;;AAIA,aAAa,SAAb,CAAuB,UAAvB,GAAoC,UAAU,UAAV,EAAsB,mBAAtB,EAA2C,OAA3C,EAAoD;AACtF,MAAI,CAAC,UAAD,IAAe,CAAC,GAAG,OAAH,CAAW,OAAX,CAApB,EAAyC;AAAE,WAAO,KAAP;AAAe;;AAE1D,MAAI,GAAG,MAAH,CAAU,UAAV,CAAJ,EAA2B;AACzB,WAAO,SAAS,WAAT,CAAqB,OAArB,EAA8B,UAA9B,EAA0C,mBAA1C,CAAP;AACD,GAFD,MAGK,IAAI,GAAG,OAAH,CAAW,UAAX,CAAJ,EAA4B;AAC/B,WAAO,SAAS,YAAT,CAAsB,UAAtB,EAAkC,OAAlC,CAAP;AACD;;AAED,SAAO,KAAP;AACD,CAXD;;AAaA,aAAa,SAAb,CAAuB,SAAvB,GAAmC,UAAU,SAAV,EAAqB,mBAArB,EAA0C,OAA1C,EAAmD;AACpF,MAAI,CAAC,SAAL,EAAgB;AAAE,WAAO,IAAP;AAAc;;AAEhC,MAAI,CAAC,GAAG,OAAH,CAAW,OAAX,CAAL,EAA0B;AAAE,WAAO,KAAP;AAAe;;AAE3C,MAAI,GAAG,MAAH,CAAU,SAAV,CAAJ,EAA0B;AACxB,WAAO,SAAS,WAAT,CAAqB,OAArB,EAA8B,SAA9B,EAAyC,mBAAzC,CAAP;AACD,GAFD,MAGK,IAAI,GAAG,OAAH,CAAW,SAAX,CAAJ,EAA2B;AAC9B,WAAO,SAAS,YAAT,CAAsB,SAAtB,EAAiC,OAAjC,CAAP;AACD;;AAED,SAAO,KAAP;AACD,CAbD;;AAeA,aAAa,SAAb,CAAuB,eAAvB,GAAyC,UAAU,OAAV,EAAmB,mBAAnB,EAAwC,WAAxC,EAAqD;AAC5F,SAAQ,CAAC,KAAK,UAAL,CAAgB,QAAQ,UAAxB,EAAoC,mBAApC,EAAyD,WAAzD,CAAD,IACH,KAAK,SAAL,CAAe,QAAQ,SAAvB,EAAkC,mBAAlC,EAAuD,WAAvD,CADL;AAED,CAHD;;AAKA;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4BA,aAAa,SAAb,CAAuB,aAAvB,GAAuC,UAAU,OAAV,EAAmB;AACxD,MAAI,GAAG,QAAH,CAAY,OAAZ,CAAJ,EAA0B;AACxB,SAAK,OAAL,CAAa,aAAb,GAA6B,OAA7B;;AAEA,WAAO,IAAP;AACD;;AAED,MAAI,YAAY,IAAhB,EAAsB;AACpB,WAAO,KAAK,OAAL,CAAa,aAApB;;AAEA,WAAO,IAAP;AACD;;AAED,SAAO,KAAK,OAAL,CAAa,aAApB;AACD,CAdD;;AAgBA;;;;;;;;;;AAUA,aAAa,SAAb,CAAuB,WAAvB,GAAqC,UAAU,QAAV,EAAoB;AACvD,MAAI,GAAG,IAAH,CAAQ,QAAR,CAAJ,EAAuB;AACrB,SAAK,OAAL,CAAa,WAAb,GAA2B,QAA3B;;AAEA,WAAO,IAAP;AACD;;AAED,MAAI,aAAa,IAAjB,EAAuB;AACrB,WAAO,KAAK,OAAL,CAAa,WAApB;;AAEA,WAAO,IAAP;AACD;;AAED,SAAO,KAAK,OAAL,CAAa,WAApB;AACD,CAdD;;AAgBA,aAAa,SAAb,CAAuB,oBAAvB,GAA8C,UAAU,OAAV,EAAmB,KAAnB,EAA0B,WAA1B,EAAuC,OAAvC,EAAgD;AAC5F,MAAM,OAAO,KAAK,OAAL,CAAa,OAAb,CAAb;AACA,MAAI,SAAS,IAAb;;AAEA,uBAAyB,QAAQ,KAAjC,kHAAwC;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,QAA7B,UAA6B;;AACtC;AACA,QAAI,YAAY,aAAZ,IACG,YAAY,KADf,IAEG,CAAC,MAAM,OAAN,GAAgB,KAAK,OAAL,CAAa,UAAb,EAAyB,YAA1C,MAA4D,CAFnE,EAEsE;AACpE;AACD;;AAED,aAAS,QAAQ,UAAR,EAAoB,OAApB,CAA4B,OAA5B,EAAqC,KAArC,EAA4C,IAA5C,EAAkD,OAAlD,EAA2D,WAA3D,EAAwE,IAAxE,CAAT;;AAEA,QAAI,MAAJ,EAAY;AACV,aAAO,MAAP;AACD;AACF;AACF,CAlBD;;;;;AC5JA,IAAM,WAAiB,QAAQ,aAAR,CAAvB;AACA,IAAM,eAAiB,QAAQ,iBAAR,CAAvB;AACA,IAAM,cAAiB,QAAQ,gBAAR,CAAvB;AACA,IAAM,UAAiB,QAAQ,iBAAR,CAAvB;AACA,IAAM,iBAAiB,QAAQ,mBAAR,CAAvB;AACA,IAAM,UAAiB,QAAQ,kBAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,UAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,UAAR,CAAvB;AACA,IAAM,UAAiB,QAAQ,kBAAR,EAA4B,GAA5B,EAAvB;;AAEA,QAAQ,uBAAR;;AAEA,IAAM,YAAY;AAChB,kBADgB;AAEhB,gDAFgB;AAGhB;AACA,mBAAiB,QAJD;AAKhB,YAAU;AACR,eAAW;AACT,mBAAa,KADJ;AAET,WAAK,QAFI;AAGT,qBAAe,CAHN;AAIT,iBAAY,IAJH;AAKT,kBAAY;AALH;AADH,GALM;AAchB,qBAAmB,2BAAU,MAAV,EAAkB;AACnC,UAAM,MAAN,CAAa,OAAO,QAApB,EAA8B,UAAU,QAAV,CAAmB,SAAjD;AACD;AAhBe,CAAlB;;AAmBA;AACA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,MAAvB,EAA+B,gBAAwD;AAAA,MAA5C,WAA4C,QAA5C,WAA4C;AAAA,MAA/B,OAA+B,QAA/B,OAA+B;AAAA,MAAtB,KAAsB,QAAtB,KAAsB;AAAA,MAAf,WAAe,QAAf,WAAe;;AACrF,MAAI,YAAY,WAAZ,EAAJ,EAA+B;AAAE;AAAS;;AAE1C,MAAM,aAAa,cAAc,WAAd,EAA2B,OAA3B,EAAoC,KAApC,EAA2C,WAA3C,CAAnB;AACA,UAAQ,WAAR,EAAqB,UAArB;AACD,CALD;;AAOA;AACA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,MAAvB,EAA+B,iBAAwD;AAAA,MAA5C,WAA4C,SAA5C,WAA4C;AAAA,MAA/B,OAA+B,SAA/B,OAA+B;AAAA,MAAtB,KAAsB,SAAtB,KAAsB;AAAA,MAAf,WAAe,SAAf,WAAe;;AACrF,MAAI,CAAC,YAAY,KAAb,IACG,YAAY,aADf,IAEG,YAAY,WAAZ,EAFP,EAEkC;AAAE;AAAS;;AAE7C,MAAM,aAAa,cAAc,WAAd,EAA2B,OAA3B,EAAoC,KAApC,EAA2C,WAA3C,CAAnB;AACA,UAAQ,WAAR,EAAqB,UAArB;AACD,CAPD;;AASA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,MAAvB,EAA+B,UAAU,GAAV,EAAe;AAAA,MACpC,WADoC,GACb,GADa,CACpC,WADoC;AAAA,MACvB,KADuB,GACb,GADa,CACvB,KADuB;;;AAG5C,MAAI,CAAC,YAAY,aAAb,IACG,YAAY,WAAZ,EADH,IAEG,CAAC,YAAY,eAFhB,IAGG,CAAC,YAAY,QAAZ,CAAqB,IAH7B,EAGmC;AACjC;AACD;;AAED,UAAQ,IAAR,CAAa,cAAb,EAA6B,GAA7B;;AAEA,MAAM,SAAS,YAAY,MAA3B;;AAEA,MAAI,YAAY,QAAZ,CAAqB,IAArB,IAA6B,MAAjC,EAAyC;AACvC;AACA,QAAI,OAAO,OAAP,CAAe,YAAY,QAAZ,CAAqB,IAApC,EAA0C,WAA1C,IACG,CAAC,uBAAuB,MAAvB,EAA+B,YAAY,OAA3C,EAAoD,YAAY,QAAhE,CADR,EACmF;AACjF,kBAAY,IAAZ,CAAiB,KAAjB;AACD,KAHD,MAIK;AACH,kBAAY,KAAZ,CAAkB,YAAY,QAA9B,EAAwC,MAAxC,EAAgD,YAAY,OAA5D;AACD;AACF;AACF,CAxBD;;AA0BA;AACA;AACA,SAAS,cAAT,CAAyB,MAAzB,EAAiC,YAAjC,EAA+C,OAA/C,EAAwD,WAAxD,EAAqE;AACnE,MAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,MAAhB,KACG,aAAa,eAAb,CAA6B,aAAa,OAAb,CAAqB,OAAO,IAA5B,CAA7B,EAAgE,OAAhE,EAAyE,WAAzE,CADH,IAEG,aAAa,OAAb,CAAqB,OAAO,IAA5B,EAAkC,OAFrC,IAGG,uBAAuB,YAAvB,EAAqC,OAArC,EAA8C,MAA9C,CAHP,EAG8D;AAC5D,WAAO,MAAP;AACD;;AAED,SAAO,IAAP;AACD;;AAED,SAAS,gBAAT,CAA2B,WAA3B,EAAwC,OAAxC,EAAiD,KAAjD,EAAwD,OAAxD,EAAiE,aAAjE,EAAgF,WAAhF,EAA6F;AAC3F,OAAK,IAAI,IAAI,CAAR,EAAW,MAAM,QAAQ,MAA9B,EAAsC,IAAI,GAA1C,EAA+C,GAA/C,EAAoD;AAClD,QAAM,QAAQ,QAAQ,CAAR,CAAd;AACA,QAAM,eAAe,cAAc,CAAd,CAArB;AACA,QAAM,SAAS,eAAe,MAAM,SAAN,CAAgB,OAAhB,EAAyB,KAAzB,EAAgC,WAAhC,EAA6C,YAA7C,CAAf,EACe,KADf,EAEe,YAFf,EAGe,WAHf,CAAf;;AAKA,QAAI,MAAJ,EAAY;AACV,aAAO;AACL,sBADK;AAEL,gBAAQ,KAFH;AAGL,iBAAS;AAHJ,OAAP;AAKD;AACF;;AAED,SAAO,EAAP;AACD;;AAED,SAAS,aAAT,CAAwB,WAAxB,EAAqC,OAArC,EAA8C,KAA9C,EAAqD,WAArD,EAAkE;AAChE,MAAI,UAAU,EAAd;AACA,MAAI,gBAAgB,EAApB;;AAEA,MAAI,UAAU,WAAd;AACA,MAAI,SAAS,IAAb;;AAEA,WAAS,WAAT,CAAsB,YAAtB,EAAoC,QAApC,EAA8C,OAA9C,EAAuD;AACrD,QAAM,WAAY,QAAQ,0BAAR,GACd,QAAQ,gBAAR,CAAyB,QAAzB,CADc,GAEd,SAFJ;;AAIA,QAAI,MAAM,eAAN,CAAsB,OAAtB,EAA+B,QAA/B,EAAyC,QAAzC,CAAJ,EAAwD;;AAEtD,cAAQ,IAAR,CAAa,YAAb;AACA,oBAAc,IAAd,CAAmB,OAAnB;AACD;AACF;;AAED,SAAO,MAAM,EAAN,CAAS,OAAT,CAAiB,OAAjB,CAAP,EAAkC;AAChC,cAAU,EAAV;AACA,oBAAgB,EAAhB;;AAEA,QAAM,sBAAsB,MAAM,aAAN,CAAoB,GAApB,CAAwB,OAAxB,CAA5B;;AAEA,QAAI,wBACI,SAAS,eAAe,oBAAoB,SAApB,CAA8B,OAA9B,EAAuC,KAAvC,EAA8C,WAA9C,EAA2D,OAA3D,EAAoE,WAApE,CAAf,EACe,mBADf,EAEe,OAFf,EAGe,WAHf,CADb,KAKG,CAAC,oBAAoB,OAApB,CAA4B,OAAO,IAAnC,EAAyC,WALjD,EAK8D;AAC5D,aAAO;AACL,wBADK;AAEL,sBAFK;AAGL,gBAAQ;AAHH,OAAP;AAKD,KAXD,MAYK;AACH,YAAM,aAAN,CAAoB,eAApB,CAAoC,WAApC,EAAiD,OAAjD;;AAEA,UAAM,aAAa,iBAAiB,WAAjB,EAA8B,OAA9B,EAAuC,KAAvC,EAA8C,OAA9C,EAAuD,aAAvD,EAAsE,WAAtE,CAAnB;;AAEA,UAAI,WAAW,MAAX,IACG,CAAC,WAAW,MAAX,CAAkB,OAAlB,CAA0B,WAAW,MAAX,CAAkB,IAA5C,EAAkD,WAD1D,EACuE;AACrE,eAAO,UAAP;AACD;AACF;;AAED,cAAU,MAAM,UAAN,CAAiB,OAAjB,CAAV;AACD;;AAED,SAAO,EAAP;AACD;;AAED,SAAS,OAAT,CAAkB,WAAlB,SAA4D;AAAA,MAA3B,MAA2B,SAA3B,MAA2B;AAAA,MAAnB,MAAmB,SAAnB,MAAmB;AAAA,MAAX,OAAW,SAAX,OAAW;;AAC1D,WAAS,UAAU,EAAnB;;AAEA,MAAI,YAAY,MAAZ,IAAsB,YAAY,MAAZ,CAAmB,OAAnB,CAA2B,WAArD,EAAkE;AAChE,gBAAY,MAAZ,CAAmB,IAAnB,CAAwB,eAAxB,CAAwC,KAAxC,CAA8C,MAA9C,GAAuD,EAAvD;AACD;;AAED,cAAY,MAAZ,GAAqB,MAArB;AACA,cAAY,OAAZ,GAAsB,OAAtB;AACA,QAAM,UAAN,CAAiB,YAAY,QAA7B,EAAuC,MAAvC;;AAEA,MAAI,UAAU,OAAO,OAAP,CAAe,WAA7B,EAA0C;AACxC,QAAM,SAAS,SAAQ,QAAQ,OAAO,IAAf,EAAqB,SAArB,CAA+B,MAA/B,CAAR,GAAiD,EAAhE;AACA,gBAAY,MAAZ,CAAmB,IAAnB,CAAwB,eAAxB,CAAwC,KAAxC,CAA8C,MAA9C,GAAuD,MAAvD;AACD;;AAED,UAAQ,IAAR,CAAa,UAAb,EAAyB,EAAE,aAAa,WAAf,EAAzB;AACD;;AAED,YAAY,OAAZ,CAAoB,EAApB,CAAuB,MAAvB,EAA+B,iBAA2B;AAAA,MAAf,WAAe,SAAf,WAAe;;AACxD,MAAM,SAAS,YAAY,MAA3B;;AAEA,MAAI,UAAU,OAAO,OAAP,CAAe,WAA7B,EAA0C;AACxC,WAAO,IAAP,CAAY,eAAZ,CAA4B,KAA5B,CAAkC,MAAlC,GAA2C,EAA3C;AACD;AACF,CAND;;AAQA,aAAa,SAAb,CAAuB,SAAvB,GAAmC,UAAU,OAAV,EAAmB,KAAnB,EAA0B,WAA1B,EAAuC,OAAvC,EAAgD;AACjF,MAAM,SAAS,KAAK,oBAAL,CAA0B,OAA1B,EAAmC,KAAnC,EAA0C,WAA1C,EAAuD,OAAvD,CAAf;;AAEA,MAAI,KAAK,OAAL,CAAa,aAAjB,EAAgC;AAC9B,WAAO,KAAK,OAAL,CAAa,aAAb,CAA2B,OAA3B,EAAoC,KAApC,EAA2C,MAA3C,EAAmD,IAAnD,EAAyD,OAAzD,EAAkE,WAAlE,CAAP;AACD;;AAED,SAAO,MAAP;AACD,CARD;;AAUA;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4BA,aAAa,SAAb,CAAuB,aAAvB,GAAuC,UAAU,OAAV,EAAmB;AACxD,MAAI,MAAM,EAAN,CAAS,QAAT,CAAkB,OAAlB,CAAJ,EAAgC;AAC9B,SAAK,OAAL,CAAa,aAAb,GAA6B,OAA7B;;AAEA,WAAO,IAAP;AACD;;AAED,MAAI,YAAY,IAAhB,EAAsB;AACpB,WAAO,KAAK,OAAL,CAAa,aAApB;;AAEA,WAAO,IAAP;AACD;;AAED,SAAO,KAAK,OAAL,CAAa,aAApB;AACD,CAdD;;AAgBA;;;;;;;;;;AAUA,aAAa,SAAb,CAAuB,WAAvB,GAAqC,UAAU,QAAV,EAAoB;AACvD,MAAI,MAAM,EAAN,CAAS,IAAT,CAAc,QAAd,CAAJ,EAA6B;AAC3B,SAAK,OAAL,CAAa,WAAb,GAA2B,QAA3B;;AAEA,WAAO,IAAP;AACD;;AAED,MAAI,aAAa,IAAjB,EAAuB;AACrB,WAAO,KAAK,OAAL,CAAa,WAApB;;AAEA,WAAO,IAAP;AACD;;AAED,SAAO,KAAK,OAAL,CAAa,WAApB;AACD,CAdD;;AAgBA,aAAa,SAAb,CAAuB,oBAAvB,GAA8C,UAAU,OAAV,EAAmB,KAAnB,EAA0B,WAA1B,EAAuC,OAAvC,EAAgD;AAC5F,MAAM,OAAO,KAAK,OAAL,CAAa,OAAb,CAAb;AACA,MAAM,UAAU,MAAM,OAAN,IAAkB;AAChC,OAAG,CAD6B;AAEhC,OAAG,CAF6B;AAGhC,OAAG,CAH6B;AAIhC,OAAG;AAJ6B,GAAD,CAK9B,MAAM,MALwB,CAAjC;AAMA,MAAI,SAAS,IAAb;;AAEA,uBAAyB,QAAQ,KAAjC,kHAAwC;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,QAA7B,UAA6B;;AACtC;AACA,QAAI,YAAY,aAAZ,IACG,YAAY,KADf,IAEG,CAAC,UAAU,KAAK,OAAL,CAAa,UAAb,EAAyB,YAApC,MAAsD,CAF7D,EAEgE;AAC9D;AACD;;AAED,aAAS,QAAQ,UAAR,EAAoB,OAApB,CAA4B,OAA5B,EAAqC,KAArC,EAA4C,IAA5C,EAAkD,OAAlD,EAA2D,WAA3D,EAAwE,IAAxE,CAAT;;AAEA,QAAI,MAAJ,EAAY;AACV,aAAO,MAAP;AACD;AACF;AACF,CAxBD;;AA0BA,SAAS,sBAAT,CAAiC,YAAjC,EAA+C,OAA/C,EAAwD,MAAxD,EAAgE;AAC9D,MAAM,UAAU,aAAa,OAA7B;AACA,MAAM,aAAa,QAAQ,OAAO,IAAf,EAAqB,GAAxC;AACA,MAAM,gBAAgB,QAAQ,OAAO,IAAf,EAAqB,aAA3C;AACA,MAAI,qBAAqB,CAAzB;AACA,MAAI,cAAc,CAAlB;AACA,MAAI,qBAAqB,CAAzB;;AAEA;AACA,MAAI,EAAE,cAAc,aAAd,IAA+B,UAAU,eAA3C,CAAJ,EAAiE;AAAE;AAAS;;AAE5E,OAAK,IAAI,IAAI,CAAR,EAAW,MAAM,MAAM,YAAN,CAAmB,MAAzC,EAAiD,IAAI,GAArD,EAA0D,GAA1D,EAA+D;AAC7D,QAAM,cAAc,MAAM,YAAN,CAAmB,CAAnB,CAApB;AACA,QAAM,cAAc,YAAY,QAAZ,CAAqB,IAAzC;;AAEA,QAAI,CAAC,YAAY,WAAZ,EAAL,EAAgC;AAAE;AAAW;;AAE7C;;AAEA,QAAI,sBAAsB,UAAU,eAApC,EAAqD;AACnD,aAAO,KAAP;AACD;;AAED,QAAI,YAAY,MAAZ,KAAuB,YAA3B,EAAyC;AAAE;AAAW;;AAEtD,mBAAgB,gBAAgB,OAAO,IAAxB,GAA8B,CAA7C;;AAEA,QAAI,eAAe,UAAnB,EAA+B;AAC7B,aAAO,KAAP;AACD;;AAED,QAAI,YAAY,OAAZ,KAAwB,OAA5B,EAAqC;AACnC;;AAEA,UAAI,gBAAgB,OAAO,IAAvB,IAA+B,sBAAsB,aAAzD,EAAwE;AACtE,eAAO,KAAP;AACD;AACF;AACF;;AAED,SAAO,UAAU,eAAV,GAA4B,CAAnC;AACD;;AAED;;;;;;;;;;;;AAYA,SAAS,eAAT,GAA2B,UAAU,QAAV,EAAoB;AAC7C,MAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,QAAhB,CAAJ,EAA+B;AAC7B,cAAU,eAAV,GAA4B,QAA5B;;AAEA,WAAO,IAAP;AACD;;AAED,SAAO,UAAU,eAAjB;AACD,CARD;;AAUA,aAAa,eAAb,CAA6B,IAA7B,CAAkC,aAAlC;AACA,aAAa,eAAb,CAA6B,IAA7B,CAAkC,eAAlC;AACA,aAAa,eAAb,CAA6B,IAA7B,CAAkC,YAAlC;AACA,aAAa,eAAb,CAA6B,IAA7B,CAAkC,WAAlC;;AAEA,eAAe,IAAf,CAAoB,aAApB,GAAoC,IAApC;AACA,eAAe,IAAf,CAAoB,WAApB,GAAkC,IAAlC;;AAEA,MAAM,MAAN,CAAa,eAAe,SAA5B,EAAuC,UAAU,QAAV,CAAmB,SAA1D;;AAEA,OAAO,OAAP,GAAiB,SAAjB;;;;;ACnXA,IAAM,YAAc,QAAQ,QAAR,CAApB;AACA,IAAM,cAAc,QAAQ,gBAAR,CAApB;;AAEA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,KAAvB,EAA8B,UAAU,WAAV,EAAuB;AACnD,cAAY,UAAZ,GAAyB,IAAzB;AACD,CAFD;;AAIA,UAAU,OAAV,CAAkB,EAAlB,CAAqB,UAArB,EAAiC,gBAA2B;AAAA,MAAf,WAAe,QAAf,WAAe;;AAC1D,MAAM,aAAa,YAAY,QAAZ,CAAqB,IAAxC;;AAEA,MAAI,CAAC,UAAL,EAAiB;AAAE;AAAS;;AAE5B,MAAM,QAAQ,YAAY,MAAZ,CAAmB,OAAnB,CAA2B,UAA3B,EAAuC,KAArD;;AAEA,MAAI,QAAQ,CAAZ,EAAe;AACb,gBAAY,UAAZ,GAAyB,WAAW,YAAM;AACxC,kBAAY,KAAZ,CAAkB,YAAY,QAA9B,EAAwC,YAAY,MAApD,EAA4D,YAAY,OAAxE;AACD,KAFwB,EAEtB,KAFsB,CAAzB;AAGD;AACF,CAZD;;AAcA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,MAAvB,EAA+B,iBAAsC;AAAA,MAA1B,WAA0B,SAA1B,WAA0B;AAAA,MAAb,SAAa,SAAb,SAAa;;AACnE,MAAI,YAAY,eAAZ,IAA+B,CAAC,SAApC,EAA+C;AAC7C,iBAAa,YAAY,UAAzB;AACD;AACF,CAJD;;AAMA;AACA,UAAU,OAAV,CAAkB,EAAlB,CAAqB,cAArB,EAAqC,iBAA2B;AAAA,MAAf,WAAe,SAAf,WAAe;;AAC9D,MAAM,aAAa,YAAY,QAAZ,CAAqB,IAAxC;;AAEA,MAAI,CAAC,UAAL,EAAiB;AAAE;AAAS;;AAE5B,MAAM,QAAQ,YAAY,MAAZ,CAAmB,OAAnB,CAA2B,UAA3B,EAAuC,KAArD;;AAEA,MAAI,QAAQ,CAAZ,EAAe;AACb,gBAAY,QAAZ,CAAqB,IAArB,GAA4B,IAA5B;AACD;AACF,CAVD;;;;;AC5BA,IAAM,YAAY,QAAQ,QAAR,CAAlB;AACA,IAAM,QAAY,QAAQ,UAAR,CAAlB;AACA,IAAM,UAAY,QAAQ,kBAAR,CAAlB;AACA,IAAM,KAAY,QAAQ,aAAR,CAAlB;;eAEwC,QAAQ,mBAAR,C;IAAhC,e,YAAA,e;IAAiB,U,YAAA,U;;AAEzB,UAAU,iBAAV,CAA4B,QAAQ,iBAAR,CAA5B;;AAEA,UAAU,OAAV,CAAkB,EAAlB,CAAqB,cAArB,EAAsC,gBAAgD;AAAA,MAApC,WAAoC,QAApC,WAAoC;AAAA,MAAvB,WAAuB,QAAvB,WAAuB;AAAA,MAAV,EAAU,QAAV,EAAU;AAAA,MAAN,EAAM,QAAN,EAAM;;AACpF,MAAI,YAAY,QAAZ,CAAqB,IAArB,KAA8B,MAAlC,EAA0C;AAAE;AAAS;;AAErD;AACA,MAAM,OAAO,KAAK,GAAL,CAAS,EAAT,CAAb;AACA,MAAM,OAAO,KAAK,GAAL,CAAS,EAAT,CAAb;AACA,MAAM,UAAU,YAAY,MAAZ,CAAmB,OAAnB,CAA2B,IAA3C;AACA,MAAM,YAAY,QAAQ,SAA1B;AACA,MAAM,cAAe,OAAO,IAAP,GAAc,GAAd,GAAoB,OAAO,IAAP,GAAc,GAAd,GAAoB,IAA7D;;AAEA,cAAY,QAAZ,CAAqB,IAArB,GAA4B,QAAQ,QAAR,KAAqB,OAArB,GACxB,YAAY,CAAZ,CADwB,CACT;AADS,IAExB,QAAQ,QAFZ;;AAIA;AACA,MAAI,gBAAgB,IAAhB,IAAwB,cAAc,IAAtC,IAA8C,cAAc,WAAhE,EAA6E;AAC3E;AACA,gBAAY,QAAZ,CAAqB,IAArB,GAA4B,IAA5B;;AAEA;;AAEA,QAAI,CAAC,YAAY,QAAZ,CAAqB,IAA1B,EAAgC;;AAE9B,UAAI,UAAU,WAAd;;AAEA,UAAM,eAAe,SAAf,YAAe,CAAU,YAAV,EAAwB,QAAxB,EAAkC,OAAlC,EAA2C;AAC9D,YAAM,WAAW,QAAQ,0BAAR,GACX,QAAQ,gBAAR,CAAyB,QAAzB,CADW,GAEX,SAFN;;AAIA,YAAI,iBAAiB,YAAY,MAAjC,EAAyC;AAAE;AAAS;;AAEpD,YAAI,CAAC,QAAQ,WAAT,IACG,CAAC,aAAa,eAAb,CAA6B,OAA7B,EAAsC,OAAtC,EAA+C,WAA/C,CADJ,IAEG,gBAAgB,OAAhB,EAAyB,QAAzB,EAAmC,QAAnC,CAFP,EAEqD;;AAEnD,cAAM,UAAS,aAAa,SAAb,CAAuB,YAAY,WAAnC,EACuB,YAAY,SADnC,EAEuB,WAFvB,EAGuB,OAHvB,CAAf;;AAKA,cAAI,WACG,QAAO,IAAP,KAAgB,MADnB,IAEG,eAAe,WAAf,EAA4B,YAA5B,CAFH,IAGG,UAAU,cAAV,CAAyB,OAAzB,EAAiC,YAAjC,EAA+C,OAA/C,EAAwD,WAAxD,CAHP,EAG6E;;AAE3E,mBAAO,YAAP;AACD;AACF;AACF,OAxBD;;AA0BA,UAAI,SAAS,IAAb;;AAEA;AACA,aAAO,GAAG,OAAH,CAAW,OAAX,CAAP,EAA4B;AAC1B,YAAM,sBAAsB,MAAM,aAAN,CAAoB,GAApB,CAAwB,OAAxB,CAA5B;;AAEA,YAAI,uBACG,wBAAwB,YAAY,MADvC,IAEG,CAAC,oBAAoB,OAApB,CAA4B,IAA5B,CAAiC,WAFzC,EAEsD;;AAEpD,mBAAS,oBAAoB,SAApB,CAA8B,YAAY,WAA1C,EAAuD,YAAY,SAAnE,EAA8E,WAA9E,EAA2F,OAA3F,CAAT;AACD;AACD,YAAI,UACG,OAAO,IAAP,KAAgB,MADnB,IAEG,eAAe,WAAf,EAA4B,mBAA5B,CAFP,EAEyD;;AAEvD,sBAAY,QAAZ,CAAqB,IAArB,GAA4B,MAA5B;AACA,sBAAY,MAAZ,GAAqB,mBAArB;AACA,sBAAY,OAAZ,GAAsB,OAAtB;AACA;AACD;;AAED,YAAM,uBAAuB,MAAM,aAAN,CAAoB,eAApB,CAAoC,YAApC,EAAkD,OAAlD,CAA7B;;AAEA,YAAI,oBAAJ,EAA0B;AACxB,sBAAY,QAAZ,CAAqB,IAArB,GAA4B,MAA5B;AACA,sBAAY,MAAZ,GAAqB,oBAArB;AACA,sBAAY,OAAZ,GAAsB,OAAtB;AACA;AACD;;AAED,kBAAU,WAAW,OAAX,CAAV;AACD;AACF;AACF;AACF,CAtFD;;AAwFA,SAAS,cAAT,CAAyB,SAAzB,EAAoC,YAApC,EAAkD;AAChD,MAAI,CAAC,YAAL,EAAmB;AAAE,WAAO,KAAP;AAAe;;AAEpC,MAAM,WAAW,aAAa,OAAb,CAAqB,IAArB,CAA0B,SAA3C;;AAEA,SAAQ,cAAc,IAAd,IAAsB,aAAa,IAAnC,IAA2C,aAAa,SAAhE;AACD;;;;;ACvGD,QAAQ,QAAR,EAAkB,iBAAlB,CAAoC,QAAQ,oBAAR,CAApC;;;;;ACAA,QAAQ,QAAR,EAAkB,iBAAlB,CAAoC,QAAQ,mBAAR,CAApC;;;;;ACAA,OAAO,OAAP,GAAiB;AACf,QAAM;AACJ,YAAgB,IADZ;AAEJ,oBAAgB,MAFZ;AAGJ,iBAAgB;AAHZ,GADS;;AAOf,aAAW;AACT,YAAQ,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EADC;;AAGT;AACA;AACA,kBAAc,CALL;;AAOT,aAAS;AACP,eAAmB,KADZ;AAEP,kBAAmB,EAFZ,EAEmB;AAC1B,gBAAmB,GAHZ,EAGmB;AAC1B,gBAAmB,EAJZ,EAImB;AAC1B,mBAAmB,IALZ,EAKmB;AAC1B,yBAAmB,GANZ,CAMmB;AANnB;AAPA;AAPI,CAAjB;;;;;ACAA;;AAEA;AACA,QAAQ,kBAAR;;AAEA;AACA,QAAQ,WAAR;;AAEA;AACA,QAAQ,kBAAR;AACA,QAAQ,sBAAR;;AAEA;AACA,QAAQ,sBAAR;AACA,QAAQ,4BAAR;AACA,QAAQ,qCAAR;;AAEA;AACA,QAAQ,mBAAR;;AAEA;AACA,QAAQ,mBAAR;AACA,QAAQ,kBAAR;AACA,QAAQ,gBAAR;AACA,QAAQ,gBAAR;;AAEA;AACA,QAAQ,sBAAR;AACA,QAAQ,2BAAR;AACA,QAAQ,0BAAR;;AAEA;AACA,QAAQ,qBAAR;AACA,QAAQ,oBAAR;AACA,QAAQ,kBAAR;;AAEA;AACA,QAAQ,iCAAR;;AAEA;AACA,QAAQ,cAAR;;AAEA;AACA,OAAO,OAAP,GAAiB,QAAQ,YAAR,CAAjB;;;;;AC3CA,IAAM,gBAAiB,QAAQ,iBAAR,CAAvB;AACA,IAAM,cAAiB,QAAQ,eAAR,CAAvB;AACA,IAAM,YAAiB,QAAQ,aAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,SAAR,CAAvB;AACA,IAAM,iBAAiB,QAAQ,aAAR,CAAvB;;AAEA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,KAAvB,EAA8B,UAAU,WAAV,EAAuB;AACnD,cAAY,aAAZ,GAA4B;AAC1B,YAAa,KADa;AAE1B,eAAa,KAFa;AAG1B,iBAAa,KAHa;;AAK1B,gBAAY,IALc;AAM1B,cAAY,EANc;;AAQ1B,QAAI,CARsB,EAQnB,IAAI,CARe;AAS1B,QAAI,CATsB,EASnB,IAAI,CATe;;AAW1B,QAAI,CAXsB;AAY1B,SAAK,CAZqB,EAYlB,KAAK,CAZa;AAa1B,cAAU,CAbgB;;AAe1B,eAAW,CAfe;AAgB1B,eAAW,CAhBe;AAiB1B,OAAK;AAjBqB,GAA5B;;AAoBA,cAAY,iBAAZ,GAAkC;AAAA,WAAM,aAAe,KAAf,CAAqB,WAArB,CAAN;AAAA,GAAlC;AACA,cAAY,mBAAZ,GAAkC;AAAA,WAAM,eAAe,KAAf,CAAqB,WAArB,CAAN;AAAA,GAAlC;AACD,CAvBD;;AAyBA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,MAAvB,EAA+B,gBAAwD;AAAA,MAA5C,WAA4C,QAA5C,WAA4C;AAAA,MAA/B,KAA+B,QAA/B,KAA+B;AAAA,MAAxB,OAAwB,QAAxB,OAAwB;AAAA,MAAf,WAAe,QAAf,WAAe;;AACrF,MAAM,SAAS,YAAY,aAA3B;;AAEA;AACA,MAAI,OAAO,MAAX,EAAmB;AACjB,QAAI,UAAU,WAAd;;AAEA;AACA,WAAO,MAAM,EAAN,CAAS,OAAT,CAAiB,OAAjB,CAAP,EAAkC;;AAEhC;AACA,UAAI,YAAY,YAAY,OAA5B,EAAqC;AACnC;AACA,uBAAe,MAAf,CAAsB,OAAO,CAA7B;AACA,eAAO,MAAP,GAAgB,KAAhB;AACA,oBAAY,UAAZ,GAAyB,IAAzB;;AAEA;AACA,oBAAY,aAAZ,CAA0B,OAA1B;AACA,cAAM,SAAN,CAAgB,YAAY,SAA5B,EAAuC,YAAY,QAAnD;;AAEA;AACA,YAAM,YAAY,EAAE,wBAAF,EAAlB;AACA,oBAAY,OAAZ,CAAoB,IAApB,CAAyB,oBAAzB,EAA+C,SAA/C;AACA,oBAAY,OAAZ,CAAoB,IAApB,CAAyB,eAAzB,EAA+C,SAA/C;;AAEA;AACA,YAAM,cAAc,IAAI,aAAJ,CAAkB,WAAlB,EACkB,KADlB,EAEkB,YAAY,QAAZ,CAAqB,IAFvC,EAGkB,eAHlB,EAIkB,YAAY,OAJ9B,CAApB;;AAMA,oBAAY,MAAZ,CAAmB,IAAnB,CAAwB,WAAxB;AACA,oBAAY,SAAZ,GAAwB,WAAxB;AACA,kBAAU,aAAV,CAAwB,YAAY,gBAApC;;AAEA,cAAM,UAAN,CAAiB,YAAY,UAA7B,EAAyC,YAAY,SAArD;AACA;AACD;;AAED,gBAAU,MAAM,UAAN,CAAiB,OAAjB,CAAV;AACD;AACF;AACF,CA5CD;;AA8CA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,IAAvB,EAA6B,iBAAkC;AAAA,MAAtB,WAAsB,SAAtB,WAAsB;AAAA,MAAT,KAAS,SAAT,KAAS;;AAC7D,MAAM,SAAS,YAAY,aAA3B;;AAEA,MAAI,CAAC,YAAY,WAAZ,EAAD,IAA8B,OAAO,MAAzC,EAAiD;AAAE;AAAS;;AAE5D,MAAM,SAAS,YAAY,MAA3B;AACA,MAAM,UAAU,UAAU,OAAO,OAAjC;AACA,MAAM,iBAAiB,WAAW,YAAY,QAAZ,CAAqB,IAAhC,IAAwC,QAAQ,YAAY,QAAZ,CAAqB,IAA7B,EAAmC,OAAlG;;AAEA,MAAM,MAAM,IAAI,IAAJ,GAAW,OAAX,EAAZ;AACA,MAAM,WAAW,EAAjB;AACA,MAAM,OAAO,MAAM,MAAN,CAAa,EAAb,EAAiB,YAAY,SAAZ,CAAsB,IAAvC,CAAb;AACA,MAAM,eAAe,YAAY,YAAZ,CAAyB,MAAzB,CAAgC,KAArD;;AAEA,MAAI,YAAY,KAAhB;AACA,MAAI,uBAAJ;;AAEA;AACA,MAAM,kBAAmB,kBAAkB,eAAe,OAAjC,IACH,YAAY,QAAZ,CAAqB,IAArB,KAA8B,SAD3B,IAEH,UAAU,OAAO,UAFvC;;AAIA,MAAM,UAAW,mBACX,MAAM,YAAY,SAAZ,CAAsB,SAA7B,GAA0C,EAD9B,IAEZ,eAAe,eAAe,QAFlB,IAGZ,eAAe,eAAe,QAHnC;;AAKA,MAAM,cAAc;AAClB,4BADkB;AAElB,gBAAY,IAFM;AAGlB,sBAHkB;AAIlB,YAAQ,IAJU;AAKlB,oBAAgB;AALE,GAApB;;AAQA;AACA,MAAI,mBAAmB,CAAC,OAAxB,EAAiC;AAC/B,cAAU,aAAV,CAAwB,QAAxB;;AAEA,qBAAiB,UAAU,MAAV,CAAiB,WAAjB,CAAjB;;AAEA,QAAI,eAAe,UAAf,IAA6B,eAAe,MAAhD,EAAwD;AACtD,kBAAY,IAAZ;AACD;AACF;;AAED,MAAI,EAAE,WAAW,SAAb,CAAJ,EAA6B;AAAE;AAAS;;AAExC,QAAM,UAAN,CAAiB,OAAO,QAAxB,EAAkC,YAAY,SAA9C;;AAEA,cAAY,QAAZ,CAAqB,CAArB,IAA0B,OAAO,UAAP,GACxB,IAAI,aAAJ,CAAkB,WAAlB,EAA+B,KAA/B,EAAsC,YAAY,QAAZ,CAAqB,IAA3D,EAAiE,cAAjE,EAAiF,YAAY,OAA7F,CADF;;AAGA,SAAO,EAAP,GAAY,GAAZ;;AAEA,SAAO,MAAP,GAAgB,IAAhB;AACA,SAAO,WAAP,GAAqB,eAAe,WAApC;AACA,cAAY,UAAZ,GAAyB,MAAzB;;AAEA,SAAO,IAAP,CAAY,OAAO,UAAnB;;AAEA,MAAI,OAAJ,EAAa;AACX,WAAO,GAAP,GAAa,YAAY,YAAZ,CAAyB,MAAzB,CAAgC,EAA7C;AACA,WAAO,GAAP,GAAa,YAAY,YAAZ,CAAyB,MAAzB,CAAgC,EAA7C;AACA,WAAO,EAAP,GAAY,YAAZ;;AAEA,gBAAY,WAAZ,EAAyB,MAAzB;;AAEA,UAAM,MAAN,CAAa,IAAb,EAAmB,YAAY,SAAZ,CAAsB,IAAzC;;AAEA,SAAK,CAAL,IAAU,OAAO,EAAjB;AACA,SAAK,CAAL,IAAU,OAAO,EAAjB;;AAEA,cAAU,aAAV,CAAwB,QAAxB;;AAEA,qBAAiB,UAAU,MAAV,CAAiB,WAAjB,CAAjB;;AAEA,WAAO,UAAP,IAAqB,eAAe,EAApC;AACA,WAAO,UAAP,IAAqB,eAAe,EAApC;;AAEA,WAAO,CAAP,GAAW,eAAe,OAAf,CAAuB,YAAY,iBAAnC,CAAX;AACD,GApBD,MAqBK;AACH,WAAO,SAAP,GAAmB,IAAnB;AACA,WAAO,EAAP,GAAY,eAAe,EAA3B;AACA,WAAO,EAAP,GAAY,eAAe,EAA3B;;AAEA,WAAO,EAAP,GAAY,OAAO,EAAP,GAAY,CAAxB;;AAEA,WAAO,CAAP,GAAW,eAAe,OAAf,CAAuB,YAAY,mBAAnC,CAAX;AACD;AACF,CA3FD;;AA6FA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,aAAvB,EAAsC,iBAA2B;AAAA,MAAf,WAAe,SAAf,WAAe;;AAC/D,MAAM,SAAS,YAAY,aAA3B;;AAEA,MAAI,OAAO,MAAX,EAAmB;AACjB,mBAAe,MAAf,CAAsB,OAAO,CAA7B;AACA,WAAO,MAAP,GAAgB,KAAhB;AACA,gBAAY,UAAZ,GAAyB,IAAzB;AACD;AACF,CARD;;AAUA,SAAS,WAAT,CAAsB,WAAtB,EAAmC,MAAnC,EAA2C;AACzC,MAAM,iBAAiB,YAAY,MAAZ,CAAmB,OAAnB,CAA2B,YAAY,QAAZ,CAAqB,IAAhD,EAAsD,OAA7E;AACA,MAAM,SAAS,eAAe,UAA9B;AACA,MAAM,aAAa,CAAC,KAAK,GAAL,CAAS,eAAe,QAAf,GAA0B,OAAO,EAA1C,CAAD,GAAiD,MAApE;;AAEA,SAAO,EAAP,GAAY,YAAY,SAAZ,CAAsB,KAAlC;AACA,SAAO,EAAP,GAAY,YAAY,SAAZ,CAAsB,KAAlC;AACA,SAAO,EAAP,GAAY,OAAO,UAAP,CAAkB,SAAlB,GAA8B,IAA1C;AACA,SAAO,EAAP,GAAY,OAAO,EAAP,GAAY,CAAxB;;AAEA,SAAO,UAAP,GAAoB,OAAO,EAAP,GAAY,CAAC,OAAO,GAAP,GAAa,UAAd,IAA4B,MAA5D;AACA,SAAO,UAAP,GAAoB,OAAO,EAAP,GAAY,CAAC,OAAO,GAAP,GAAa,UAAd,IAA4B,MAA5D;AACA,SAAO,EAAP,GAAY,UAAZ;;AAEA,SAAO,SAAP,GAAmB,SAAS,OAAO,EAAnC;AACA,SAAO,SAAP,GAAmB,IAAI,eAAe,QAAf,GAA0B,OAAO,EAAxD;AACD;;AAED,SAAS,YAAT,GAAyB;AACvB,sBAAoB,IAApB;AACA,QAAM,cAAN,CAAqB,KAAK,YAA1B,EAAwC,KAAK,UAA7C,EAAyD,KAAK,SAA9D;;AAEA,MAAM,SAAS,KAAK,aAApB;AACA,MAAM,UAAU,KAAK,MAAL,CAAY,OAAZ,CAAoB,KAAK,QAAL,CAAc,IAAlC,EAAwC,OAAxD;AACA,MAAM,SAAS,QAAQ,UAAvB;AACA,MAAM,IAAI,IAAI,IAAJ,GAAW,OAAX,KAAuB,IAAvB,GAA8B,OAAO,EAA/C;;AAEA,MAAI,IAAI,OAAO,EAAf,EAAmB;;AAEjB,QAAM,WAAY,IAAI,CAAC,KAAK,GAAL,CAAS,CAAC,MAAD,GAAU,CAAnB,IAAwB,OAAO,SAAhC,IAA6C,OAAO,SAA1E;;AAEA,QAAI,OAAO,UAAP,KAAsB,OAAO,EAA7B,IAAmC,OAAO,UAAP,KAAsB,OAAO,EAApE,EAAwE;AACtE,aAAO,EAAP,GAAY,OAAO,EAAP,GAAY,QAAxB;AACA,aAAO,EAAP,GAAY,OAAO,EAAP,GAAY,QAAxB;AACD,KAHD,MAIK;AACH,UAAM,YAAY,MAAM,sBAAN,CAA6B,CAA7B,EAAgC,CAAhC,EAC6B,OAAO,EADpC,EAE6B,OAAO,EAFpC,EAG6B,OAAO,UAHpC,EAI6B,OAAO,UAJpC,EAK6B,QAL7B,CAAlB;;AAOA,aAAO,EAAP,GAAY,UAAU,CAAtB;AACA,aAAO,EAAP,GAAY,UAAU,CAAtB;AACD;;AAED,SAAK,MAAL;;AAEA,WAAO,CAAP,GAAW,eAAe,OAAf,CAAuB,KAAK,iBAA5B,CAAX;AACD,GAvBD,MAwBK;AACH,WAAO,EAAP,GAAY,OAAO,UAAnB;AACA,WAAO,EAAP,GAAY,OAAO,UAAnB;;AAEA,SAAK,MAAL;AACA,SAAK,GAAL,CAAS,OAAO,UAAhB;AACA,WAAO,MAAP,GAAgB,KAAhB;AACA,SAAK,UAAL,GAAkB,IAAlB;AACD;;AAED,QAAM,UAAN,CAAiB,KAAK,UAAtB,EAAkC,KAAK,SAAvC;AACD;;AAED,SAAS,cAAT,GAA2B;AACzB,sBAAoB,IAApB;;AAEA,MAAM,SAAS,KAAK,aAApB;AACA,MAAM,IAAI,IAAI,IAAJ,GAAW,OAAX,KAAuB,OAAO,EAAxC;AACA,MAAM,WAAW,KAAK,MAAL,CAAY,OAAZ,CAAoB,KAAK,QAAL,CAAc,IAAlC,EAAwC,OAAxC,CAAgD,iBAAjE;;AAEA,MAAI,IAAI,QAAR,EAAkB;AAChB,WAAO,EAAP,GAAY,MAAM,WAAN,CAAkB,CAAlB,EAAqB,CAArB,EAAwB,OAAO,EAA/B,EAAmC,QAAnC,CAAZ;AACA,WAAO,EAAP,GAAY,MAAM,WAAN,CAAkB,CAAlB,EAAqB,CAArB,EAAwB,OAAO,EAA/B,EAAmC,QAAnC,CAAZ;;AAEA,SAAK,WAAL,CAAiB,OAAO,UAAxB,EAAoC,OAAO,UAA3C;;AAEA,WAAO,CAAP,GAAW,eAAe,OAAf,CAAuB,KAAK,mBAA5B,CAAX;AACD,GAPD,MAQK;AACH,WAAO,EAAP,GAAY,OAAO,EAAnB;AACA,WAAO,EAAP,GAAY,OAAO,EAAnB;;AAEA,SAAK,WAAL,CAAiB,OAAO,UAAxB,EAAoC,OAAO,UAA3C;AACA,SAAK,GAAL,CAAS,OAAO,UAAhB;;AAEA,WAAO,SAAP,GACE,OAAO,MAAP,GAAgB,KADlB;AAEA,SAAK,UAAL,GAAkB,IAAlB;AACD;AACF;;AAED,SAAS,mBAAT,CAA8B,WAA9B,EAA2C;AACzC,MAAM,SAAS,YAAY,aAA3B;;AAEA;AACA,MAAI,CAAC,OAAO,MAAZ,EAAoB;AAAE;AAAS;;AAE/B,MAAM,SAAW,OAAO,QAAP,CAAgB,IAAjC;AACA,MAAM,WAAW,OAAO,QAAP,CAAgB,MAAjC;;AAEA,QAAM,SAAN,CAAgB,YAAY,SAA5B,EAAuC,CAAE;AACvC,WAAS,OAAO,CAAP,GAAa,OAAO,EADU;AAEvC,WAAS,OAAO,CAAP,GAAa,OAAO,EAFU;AAGvC,aAAS,SAAS,CAAT,GAAa,OAAO,EAHU;AAIvC,aAAS,SAAS,CAAT,GAAa,OAAO;AAJU,GAAF,CAAvC;AAMD;;;;;AC/RD,IAAM,UAAe,QAAQ,iBAAR,CAArB;AACA,IAAM,SAAe,QAAQ,gBAAR,CAArB;AACA,IAAM,QAAe,QAAQ,SAAR,CAArB;AACA,IAAM,QAAe,QAAQ,SAAR,CAArB;AACA,IAAM,eAAe,QAAQ,gBAAR,CAArB;AACA,IAAM,cAAe,QAAQ,eAAR,CAArB;;AAEA,IAAM,eAAe,EAArB;;AAEA;;;;;;;;;;;;;;;;;;;;;;;;AAwBA,SAAS,QAAT,CAAmB,OAAnB,EAA4B,OAA5B,EAAqC;AACnC,MAAI,eAAe,MAAM,aAAN,CAAoB,GAApB,CAAwB,OAAxB,EAAiC,OAAjC,CAAnB;;AAEA,MAAI,CAAC,YAAL,EAAmB;AACjB,mBAAe,IAAI,YAAJ,CAAiB,OAAjB,EAA0B,OAA1B,CAAf;AACA,iBAAa,MAAb,CAAoB,MAApB,GAA6B,YAA7B;AACD;;AAED,SAAO,YAAP;AACD;;AAED;;;;;;;;AAQA,SAAS,KAAT,GAAiB,UAAU,OAAV,EAAmB,OAAnB,EAA4B;AAC3C,SAAO,MAAM,aAAN,CAAoB,cAApB,CAAmC,OAAnC,EAA4C,WAAW,QAAQ,OAA/D,MAA4E,CAAC,CAApF;AACD,CAFD;;AAIA;;;;;;;;;;;;AAYA,SAAS,EAAT,GAAc,UAAU,IAAV,EAAgB,QAAhB,EAA0B,OAA1B,EAAmC;AAC/C,MAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,IAAhB,KAAyB,KAAK,MAAL,CAAY,GAAZ,MAAqB,CAAC,CAAnD,EAAsD;AACpD,WAAO,KAAK,IAAL,GAAY,KAAZ,CAAkB,IAAlB,CAAP;AACD;;AAED,MAAI,MAAM,EAAN,CAAS,KAAT,CAAe,IAAf,CAAJ,EAA0B;AACxB,yBAAwB,IAAxB,kHAA8B;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAAnB,SAAmB;;AAC5B,eAAS,EAAT,CAAY,SAAZ,EAAuB,QAAvB,EAAiC,OAAjC;AACD;;AAED,WAAO,QAAP;AACD;;AAED,MAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,IAAhB,CAAJ,EAA2B;AACzB,SAAK,IAAM,IAAX,IAAmB,IAAnB,EAAyB;AACvB,eAAS,EAAT,CAAY,IAAZ,EAAkB,KAAK,IAAL,CAAlB,EAA8B,QAA9B;AACD;;AAED,WAAO,QAAP;AACD;;AAED;AACA,MAAI,MAAM,QAAN,CAAe,aAAa,UAA5B,EAAwC,IAAxC,CAAJ,EAAmD;AACjD;AACA,QAAI,CAAC,aAAa,IAAb,CAAL,EAAyB;AACvB,mBAAa,IAAb,IAAqB,CAAC,QAAD,CAArB;AACD,KAFD,MAGK;AACH,mBAAa,IAAb,EAAmB,IAAnB,CAAwB,QAAxB;AACD;AACF;AACD;AATA,OAUK;AACH,aAAO,GAAP,CAAW,MAAM,QAAjB,EAA2B,IAA3B,EAAiC,QAAjC,EAA2C,EAAE,gBAAF,EAA3C;AACD;;AAED,SAAO,QAAP;AACD,CArCD;;AAuCA;;;;;;;;;;;AAWA,SAAS,GAAT,GAAe,UAAU,IAAV,EAAgB,QAAhB,EAA0B,OAA1B,EAAmC;AAChD,MAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,IAAhB,KAAyB,KAAK,MAAL,CAAY,GAAZ,MAAqB,CAAC,CAAnD,EAAsD;AACpD,WAAO,KAAK,IAAL,GAAY,KAAZ,CAAkB,IAAlB,CAAP;AACD;;AAED,MAAI,MAAM,EAAN,CAAS,KAAT,CAAe,IAAf,CAAJ,EAA0B;AACxB,0BAAwB,IAAxB,yHAA8B;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAAnB,SAAmB;;AAC5B,eAAS,GAAT,CAAa,SAAb,EAAwB,QAAxB,EAAkC,OAAlC;AACD;;AAED,WAAO,QAAP;AACD;;AAED,MAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,IAAhB,CAAJ,EAA2B;AACzB,SAAK,IAAM,IAAX,IAAmB,IAAnB,EAAyB;AACvB,eAAS,GAAT,CAAa,IAAb,EAAmB,KAAK,IAAL,CAAnB,EAA+B,QAA/B;AACD;;AAED,WAAO,QAAP;AACD;;AAED,MAAI,CAAC,MAAM,QAAN,CAAe,aAAa,UAA5B,EAAwC,IAAxC,CAAL,EAAoD;AAClD,WAAO,MAAP,CAAc,MAAM,QAApB,EAA8B,IAA9B,EAAoC,QAApC,EAA8C,OAA9C;AACD,GAFD,MAGK;AACH,QAAI,cAAJ;;AAEA,QAAI,QAAQ,YAAR,IACG,CAAC,QAAQ,MAAM,OAAN,CAAc,aAAa,IAAb,CAAd,EAAkC,QAAlC,CAAT,MAA0D,CAAC,CADlE,EACqE;AACnE,mBAAa,IAAb,EAAmB,MAAnB,CAA0B,KAA1B,EAAiC,CAAjC;AACD;AACF;;AAED,SAAO,QAAP;AACD,CAlCD;;AAoCA;;;;;;;AAOA,SAAS,KAAT,GAAiB,YAAY;AAC3B,SAAO,KAAP;AACD,CAFD;;AAIA;AACA,SAAS,iBAAT,GAA8B,MAAM,cAApC;AACA,SAAS,YAAT,GAA8B,MAAM,SAApC;AACA,SAAS,gBAAT,GAA8B,MAAM,aAApC;AACA,SAAS,aAAT,GAA8B,MAAM,UAApC;;AAEA,SAAS,cAAT,GAAgC,MAAM,cAAtC;AACA,SAAS,oBAAT,GAAgC,MAAM,oBAAtC;AACA,SAAS,eAAT,GAAgC,MAAM,eAAtC;AACA,SAAS,OAAT,GAAgC,MAAM,OAAtC;;AAEA;;;;;;AAMA,SAAS,aAAT,GAAyB,YAAY;AACnC,SAAO,QAAQ,aAAf;AACD,CAFD;;AAIA;;;;;;AAMA,SAAS,oBAAT,GAAgC,YAAY;AAC1C,SAAO,QAAQ,oBAAf;AACD,CAFD;;AAIA;;;;;;;;;AASA,SAAS,IAAT,GAAgB,UAAU,KAAV,EAAiB;AAC/B,OAAK,IAAI,IAAI,MAAM,YAAN,CAAmB,MAAnB,GAA4B,CAAzC,EAA4C,KAAK,CAAjD,EAAoD,GAApD,EAAyD;AACvD,UAAM,YAAN,CAAmB,CAAnB,EAAsB,IAAtB,CAA2B,KAA3B;AACD;;AAED,SAAO,QAAP;AACD,CAND;;AAQA;;;;;;;;;AASA,SAAS,oBAAT,GAAgC,UAAU,QAAV,EAAoB;AAClD,MAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,QAAhB,CAAJ,EAA+B;AAC7B,gBAAY,oBAAZ,GAAmC,QAAnC;;AAEA,WAAO,IAAP;AACD;;AAED,SAAO,YAAY,oBAAnB;AACD,CARD;;AAUA,SAAS,WAAT,GAA0B,MAAM,WAAhC;AACA,SAAS,cAAT,GAA0B,MAAM,cAAhC;;AAEA,MAAM,QAAN,GAAiB,QAAjB;;AAEA,OAAO,OAAP,GAAiB,QAAjB;;;;;AC7OA,IAAM,eAAe,QAAQ,gBAAR,CAArB;AACA,IAAM,cAAe,QAAQ,eAAR,CAArB;AACA,IAAM,QAAe,QAAQ,SAAR,CAArB;AACA,IAAM,KAAe,QAAQ,YAAR,CAArB;AACA,IAAM,SAAe,QAAQ,gBAAR,CAArB;;eAE0C,QAAQ,kBAAR,C;IAAlC,Y,YAAA,Y;IAAc,e,YAAA,e;;AAEtB;;;;;;;;;;;;;;;AAaA,aAAa,SAAb,CAAuB,cAAvB,GAAwC,UAAU,QAAV,EAAoB;AAC1D,MAAI,wBAAwB,IAAxB,CAA6B,QAA7B,CAAJ,EAA4C;AAC1C,SAAK,OAAL,CAAa,cAAb,GAA8B,QAA9B;AACA,WAAO,IAAP;AACD;;AAED,MAAI,GAAG,IAAH,CAAQ,QAAR,CAAJ,EAAuB;AACrB,SAAK,OAAL,CAAa,cAAb,GAA8B,WAAU,QAAV,GAAqB,OAAnD;AACA,WAAO,IAAP;AACD;;AAED,SAAO,KAAK,OAAL,CAAa,cAApB;AACD,CAZD;;AAcA,aAAa,SAAb,CAAuB,sBAAvB,GAAgD,UAAU,KAAV,EAAiB;AAC/D,MAAM,UAAU,KAAK,OAAL,CAAa,cAA7B;;AAEA,MAAI,YAAY,OAAhB,EAAyB;AAAE;AAAS;;AAEpC,MAAI,YAAY,QAAhB,EAA0B;AACxB,UAAM,cAAN;AACA;AACD;;AAED;;AAEA;AACA;AACA,MAAI,OAAO,eAAX,EAA4B;AAC1B;AACD;;AAED;AACA,MAAI,uCAAuC,IAAvC,CAA4C,MAAM,IAAlD,CAAJ,EAA6D;AAC3D;AACD;;AAED;AACA,MAAI,GAAG,OAAH,CAAW,MAAM,MAAjB,KACG,gBAAgB,MAAM,MAAtB,EAA8B,uEAA9B,CADP,EAC+G;AAC7G;AACD;;AAED,QAAM,cAAN;AACD,CA9BD;;AAgCA,SAAS,kBAAT,OAAqD;AAAA,MAAtB,WAAsB,QAAtB,WAAsB;AAAA,MAAT,KAAS,QAAT,KAAS;;AACnD,MAAI,YAAY,MAAhB,EAAwB;AACtB,gBAAY,MAAZ,CAAmB,sBAAnB,CAA0C,KAA1C;AACD;AACF;;WAEyB,CAAC,MAAD,EAAS,MAAT,EAAiB,IAAjB,EAAuB,QAAvB,C;AAA1B,yCAA4D;AAAvD,MAAM,sBAAN;AACH,cAAY,OAAZ,CAAoB,EAApB,CAAuB,WAAvB,EAAoC,kBAApC;AACD;;AAED;AACA,YAAY,SAAZ,CAAsB,SAAtB,GAAkC,SAAS,iBAAT,CAA4B,KAA5B,EAAmC;AACnE,uBAA0B,MAAM,YAAhC,mHAA8C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,QAAnC,WAAmC;;;AAE5C,QAAI,YAAY,OAAZ,KACI,YAAY,OAAZ,KAAwB,MAAM,MAA9B,IACG,aAAa,YAAY,OAAzB,EAAkC,MAAM,MAAxC,CAFP,CAAJ,EAE6D;;AAE3D,kBAAY,MAAZ,CAAmB,sBAAnB,CAA0C,KAA1C;AACA;AACD;AACF;AACF,CAXD;;;;;AC9EA,IAAM,QAAgB,QAAQ,SAAR,CAAtB;AACA,IAAM,SAAgB,QAAQ,gBAAR,CAAtB;AACA,IAAM,UAAgB,QAAQ,iBAAR,CAAtB;AACA,IAAM,UAAgB,QAAQ,2BAAR,CAAtB;AACA,IAAM,gBAAgB,QAAQ,sBAAR,CAAtB;;eAEmB,QAAQ,gBAAR,C;IAAX,M,YAAA,M;;AAER,IAAM,WAAW,OAAO,SAAP,CAAiB,QAAlC;;AAEA,IAAI,CAAC,OAAO,KAAP,CAAa,OAAlB,EAA2B;AACzB,SAAO,KAAP,CAAa,OAAb,GAAuB,UAAU,GAAV,EAAe;AACpC,WAAO,SAAS,IAAT,CAAc,GAAd,MAAuB,gBAA9B;AACD,GAFD;AAGD;;AAED,IAAI,CAAC,OAAO,SAAP,CAAiB,IAAtB,EAA4B;AAC1B,SAAO,SAAP,CAAiB,IAAjB,GAAwB,YAAY;AAClC,WAAO,KAAK,OAAL,CAAa,oCAAb,EAAmD,EAAnD,CAAP;AACD,GAFD;AAGD;;AAED;AACA;AACA;AACA;AACA;AACA,SAAS,aAAT,CAAwB,KAAxB,EAA+B;AAC7B,MAAM,cAAc,MAAM,MAA1B;AACA,MAAM,cAAc,QAAQ,MAAR,CAAe,KAAf,EAAsB,MAAM,IAA5B,EAAkC,WAAlC,CAApB;;AAEA,MAAI,CAAC,WAAL,EAAkB;AAAE;AAAS;;AAE7B,MAAI,YAAY,OAAZ,IACG,MAAM,OAAN,KAAkB,YAAY,OAAZ,CAAoB,OADzC,IAEG,MAAM,OAAN,KAAkB,YAAY,OAAZ,CAAoB,OAFzC,IAGG,gBAAkB,YAAY,OAAZ,CAAoB,MAH7C,EAGqD;;AAEnD,gBAAY,WAAZ,CAAwB,CAAxB,IAA6B,WAA7B;AACA,gBAAY,SAAZ,CAAwB,CAAxB,IAA6B,IAAI,IAAJ,GAAW,OAAX,EAA7B;;AAEA,kBAAc,IAAd,CAAmB;AACjB,8BADiB;AAEjB,kBAFiB;AAGjB,8BAHiB;AAIjB,eAAS,KAJQ;AAKjB,YAAM;AALW,KAAnB;AAOD;AACF;;AAED,IAAI,QAAQ,KAAZ,EAAmB;AACjB,MAAM,YAAY,SAAZ,SAAY,CAAU,KAAV,EAAiB;AACjC,yBAA0B,MAAM,YAAhC,kHAA8C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAAnC,WAAmC;;AAC5C,UAAI,YAAY,WAAZ,EAAJ,EAA+B;AAC7B,oBAAY,MAAZ,CAAmB,sBAAnB,CAA0C,KAA1C;AACD;AACF;AACF,GAND;;AAQA,MAAM,WAAW,SAAS,QAAT,QAAiC,UAAjC,EAA6C;AAAA,QAAxB,GAAwB,SAAxB,GAAwB;AAAA,QAAnB,GAAmB,SAAnB,GAAmB;;AAC5D,QAAM,cAAc,WAAW,OAAX,CAAmB,QAAnB,MAAiC,CAAjC,GAChB,OAAO,GADS,GACH,OAAO,MADxB;;AAGA;AACA,gBAAY,GAAZ,EAAiB,aAAjB,EAAgC,SAAhC;;AAEA,QAAI,aAAJ,EAAmB;AACjB,kBAAY,GAAZ,EAAiB,UAAjB,EAA6B,aAA7B;AACD;AACF,GAVD;;AAYA,QAAM,OAAN,CAAc,EAAd,CAAiB,cAAjB,EAAoC,QAApC;AACA,QAAM,OAAN,CAAc,EAAd,CAAiB,iBAAjB,EAAoC,QAApC;AACD;;AAED,OAAO,OAAP,GAAiB,IAAjB;;;;;AC5EA,IAAM,gBAAgB,QAAQ,kBAAR,CAAtB;AACA,IAAM,cAAgB,QAAQ,gBAAR,CAAtB;AACA,IAAM,SAAgB,QAAQ,iBAAR,CAAtB;;AAEA,IAAM,YAAY;AAChB,SAAO,EADS;;AAGhB,cAAY,oBAAU,GAAV,EAAe;AAAA,QACjB,WADiB,GACiB,GADjB,CACjB,WADiB;AAAA,QACQ,IADR,GACiB,GADjB,CACJ,UADI;AAAA,QAEjB,MAFiB,GAEgB,WAFhB,CAEjB,MAFiB;AAAA,QAET,OAFS,GAEgB,WAFhB,CAET,OAFS;AAAA,QAEA,WAFA,GAEgB,WAFhB,CAEA,WAFA;;AAGzB,QAAM,OAAO,OAAO,OAAP,CAAe,OAAf,CAAb;;AAEA,QAAI,IAAJ,EAAU;AACR,kBAAY,IAAZ,GAAmB,KAAK,CAAL,GAAS,KAAK,IAAjC;AACA,kBAAY,GAAZ,GAAmB,KAAK,CAAL,GAAS,KAAK,GAAjC;;AAEA,kBAAY,KAAZ,GAAqB,KAAK,KAAL,GAAc,KAAK,CAAxC;AACA,kBAAY,MAAZ,GAAqB,KAAK,MAAL,GAAc,KAAK,CAAxC;;AAEA,UAAI,EAAE,WAAY,IAAd,CAAJ,EAAyB;AAAE,aAAK,KAAL,GAAc,KAAK,KAAL,GAAc,KAAK,IAAjC;AAAwC;AACnE,UAAI,EAAE,YAAY,IAAd,CAAJ,EAAyB;AAAE,aAAK,MAAL,GAAc,KAAK,MAAL,GAAc,KAAK,GAAjC;AAAwC;AACpE,KATD,MAUK;AACH,kBAAY,IAAZ,GAAmB,YAAY,GAAZ,GAAkB,YAAY,KAAZ,GAAoB,YAAY,MAAZ,GAAqB,CAA9E;AACD;;AAED,QAAI,IAAJ,GAAW,IAAX;AACA,QAAI,YAAJ,GAAmB,MAAnB;AACA,QAAI,OAAJ,GAAc,OAAd;;AAEA,SAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,UAAU,KAAV,CAAgB,MAApC,EAA4C,GAA5C,EAAiD;AAC/C,UAAM,eAAe,UAAU,KAAV,CAAgB,CAAhB,CAArB;;AAEA,UAAI,OAAJ,GAAc,OAAO,OAAP,CAAe,YAAY,QAAZ,CAAqB,IAApC,EAA0C,YAA1C,CAAd;;AAEA,UAAI,CAAC,IAAI,OAAT,EAAkB;AAChB;AACD;;AAED,kBAAY,eAAZ,CAA4B,YAA5B,IAA4C,UAAU,YAAV,EAAwB,SAAxB,CAAkC,GAAlC,CAA5C;AACD;AACF,GArCe;;AAuChB,UAAQ,gBAAU,GAAV,EAAe;AAAA,QACb,WADa,GACqC,GADrC,CACb,WADa;AAAA,QACA,QADA,GACqC,GADrC,CACA,QADA;AAAA,QACU,MADV,GACqC,GADrC,CACU,MADV;AAAA,QACkB,cADlB,GACqC,GADrC,CACkB,cADlB;;AAErB,QAAM,SAAS,OAAO,EAAP,EAAW,IAAI,UAAf,CAAf;AACA,QAAM,SAAS;AACb,UAAI,CADS;AAEb,UAAI,CAFS;AAGb,eAAS,KAHI;AAIb,cAAQ,KAJK;AAKb,kBAAY;AALC,KAAf;;AAQA,yBAA2B,UAAU,KAArC,kHAA4C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAAjC,YAAiC;;AAC1C,UAAM,WAAW,UAAU,YAAV,CAAjB;AACA,UAAM,UAAU,YAAY,MAAZ,CAAmB,OAAnB,CAA2B,YAAY,QAAZ,CAAqB,IAAhD,EAAsD,YAAtD,CAAhB;;AAEA,UAAI,CAAC,SAAS,OAAT,EAAkB,MAAlB,EAA0B,cAA1B,CAAL,EAAgD;AAAE;AAAW;;AAE7D,UAAI,MAAJ,GAAa,IAAI,MAAJ,GAAa,SAAS,YAAT,CAA1B;AACA,UAAI,OAAJ,GAAc,OAAd;AACA,UAAI,MAAJ,GAAa,IAAI,WAAJ,CAAgB,eAAhB,CAAgC,YAAhC,CAAb;;AAEA,eAAS,GAAT,CAAa,GAAb;;AAEA,UAAI,IAAI,MAAJ,CAAW,MAAf,EAAuB;AACrB,eAAO,CAAP,IAAY,IAAI,MAAJ,CAAW,EAAvB;AACA,eAAO,CAAP,IAAY,IAAI,MAAJ,CAAW,EAAvB;;AAEA,eAAO,EAAP,IAAa,IAAI,MAAJ,CAAW,EAAxB;AACA,eAAO,EAAP,IAAa,IAAI,MAAJ,CAAW,EAAxB;;AAEA,eAAO,MAAP,GAAgB,IAAhB;AACD;AACF;;AAED;AACA;AACA;AACA;AACA,WAAO,UAAP,GAAoB,CAAC,IAAI,MAAL,IAAe,CAAC,OAAO,MAAvB,IAAiC,IAAI,MAAJ,CAAW,OAAhE;;AAEA,WAAO,MAAP;AACD,GAhFe;;AAkFhB,iBAAe,uBAAU,QAAV,EAAoB;AACjC,0BAA2B,UAAU,KAArC,yHAA4C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAAjC,YAAiC;;AAC1C,UAAM,SAAS,SAAS,YAAT,KAA0B,EAAzC;;AAEA,aAAO,EAAP,GAAY,OAAO,EAAP,GAAY,CAAxB;AACA,aAAO,SAAP,GAAmB,OAAO,SAAP,GAAmB,GAAtC;AACA,aAAO,MAAP,GAAgB,KAAhB;AACA,aAAO,OAAP,GAAiB,IAAjB;;AAEA,eAAS,YAAT,IAAyB,MAAzB;AACD;;AAED,WAAO,QAAP;AACD,GA/Fe;;AAiGhB,SAAO,sBAA2B,UAA3B,EAAuC;AAAA,QAA3B,WAA2B,SAA3B,WAA2B;;AAC5C,QAAM,MAAM;AACV,8BADU;AAEV,kBAAY,CAAC,eAAe,eAAf,GACA,YAAY,SADZ,GACwB,YAAY,WADrC,EACkD,IAHpD;AAIV,mBAAa,YAAY,WAJf;AAKV,gBAAU,YAAY,gBALZ;AAMV,cAAQ,KANE;AAOV,sBAAgB;AAPN,KAAZ;;AAUA,cAAU,UAAV,CAAqB,GAArB;AACA,cAAU,aAAV,CAAwB,IAAI,QAA5B;;AAEA,QAAI,UAAJ,GAAiB,OAAO,EAAP,EAAW,YAAY,WAAZ,CAAwB,IAAnC,CAAjB;AACA,gBAAY,cAAZ,GAA6B,UAAU,MAAV,CAAiB,GAAjB,CAA7B;AACD;AAjHe,CAAlB;;AAoHA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,KAAvB,EAA8B,UAAU,WAAV,EAAuB;AACnD,cAAY,WAAZ,GAA+B,EAAE,MAAM,CAAR,EAAW,OAAO,CAAlB,EAAqB,KAAK,CAA1B,EAA6B,QAAQ,CAArC,EAA/B;AACA,cAAY,eAAZ,GAA+B,EAA/B;AACA,cAAY,gBAAZ,GAA+B,UAAU,aAAV,CAAwB,EAAxB,CAA/B;AACA,cAAY,cAAZ,GAA+B,IAA/B;AACD,CALD;;AAOA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,cAAvB,EAAwC,UAAU,KAAlD;AACA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,eAAvB,EAAwC,UAAU,KAAlD;;AAEA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,oBAAvB,EAA6C,iBAA0D;AAAA,MAA9C,WAA8C,SAA9C,WAA8C;AAAA,MAAjC,MAAiC,SAAjC,MAAiC;AAAA,MAAzB,qBAAyB,SAAzB,qBAAyB;;AACrG,MAAM,iBAAiB,UAAU,MAAV,CAAiB;AACtC,4BADsC;AAEtC,kBAFsC;AAGtC,gBAAY,YAAY,SAAZ,CAAsB,IAHI;AAItC,cAAU,YAAY,gBAJgB;AAKtC,oBAAgB;AALsB,GAAjB,CAAvB;;AAQA;AACA;AACA,MAAI,CAAC,eAAe,UAAhB,IAA8B,qBAAlC,EAAyD;AACvD,gBAAY,aAAZ,GAA4B,IAA5B;AACD;;AAED,cAAY,cAAZ,GAA6B,cAA7B;AACD,CAhBD;;AAkBA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,YAAvB,EAAqC,iBAAkC;AAAA,MAAtB,WAAsB,SAAtB,WAAsB;AAAA,MAAT,KAAS,SAAT,KAAS;;AACrE,OAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,UAAU,KAAV,CAAgB,MAApC,EAA4C,GAA5C,EAAiD;AAC/C,QAAM,UAAU,YAAY,MAAZ,CAAmB,OAAnB,CAA2B,YAAY,QAAZ,CAAqB,IAAhD,EAAsD,UAAU,KAAV,CAAgB,CAAhB,CAAtD,CAAhB;;AAEA;AACA,QAAI,SAAS,OAAT,EAAkB,IAAlB,EAAwB,IAAxB,CAAJ,EAAmC;AACjC;AACA,kBAAY,MAAZ,CAAmB,EAAE,YAAF,EAAS,QAAQ,IAAjB,EAAnB;AACA;AACD;AACF;AACF,CAXD;;AAaA,cAAc,OAAd,CAAsB,EAAtB,CAAyB,QAAzB,EAAmC,UAAU,GAAV,EAAe;AAAA,MACxC,MADwC,GAChB,GADgB,CACxC,MADwC;AAAA,MAChC,WADgC,GAChB,GADgB,CAChC,WADgC;;AAEhD,MAAM,cAAc,OAAO,EAAP,EAAW,GAAX,CAApB;;AAEA,OAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,UAAU,KAAV,CAAgB,MAApC,EAA4C,GAA5C,EAAiD;AAC/C,QAAM,eAAe,UAAU,KAAV,CAAgB,CAAhB,CAArB;AACA,gBAAY,OAAZ,GAAsB,YAAY,MAAZ,CAAmB,OAAnB,CAA2B,YAAY,QAAZ,CAAqB,IAAhD,EAAsD,YAAtD,CAAtB;;AAEA,QAAI,CAAC,YAAY,OAAjB,EAA0B;AACxB;AACD;;AAED,QAAM,WAAW,UAAU,YAAV,CAAjB;;AAEA,gBAAY,MAAZ,GAAqB,YAAY,gBAAZ,CAA6B,YAA7B,CAArB;;AAEA,WAAO,YAAP,IAAuB,SAAS,YAAT,CAAsB,WAAtB,CAAvB;AACD;AACF,CAlBD;;AAoBA,SAAS,QAAT,CAAmB,OAAnB,EAA4B,MAA5B,EAAoC,cAApC,EAAoD;AAClD,SAAQ,WAAW,QAAQ,OAAnB,KACI,UAAU,CAAC,QAAQ,OADvB,MAEI,CAAC,cAAD,IAAmB,QAAQ,OAF/B,CAAR;AAGD;;AAED,OAAO,OAAP,GAAiB,SAAjB;;;;;AC3LA,IAAM,YAAiB,QAAQ,SAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,UAAR,CAAvB;AACA,IAAM,iBAAiB,QAAQ,mBAAR,CAAvB;;AAEA,IAAM,WAAW;AACf,YAAU;AACR,aAAa,KADL;AAER,aAAa,KAFL;AAGR,iBAAa,IAHL;AAIR,iBAAa;AAJL,GADK;;AAQf,aAAW,yBAA0C;AAAA,QAA9B,IAA8B,QAA9B,IAA8B;AAAA,QAAxB,WAAwB,QAAxB,WAAwB;AAAA,QAAX,OAAW,QAAX,OAAW;;AACnD,QAAM,cAAc,WAAW,QAAQ,WAAvC;AACA,QAAM,SAAS,EAAf;;AAEA,QAAI,QAAQ,WAAZ,EAAyB;AACvB,aAAO,IAAP,GAAc,YAAY,IAAZ,GAAoB,KAAK,KAAL,GAAc,YAAY,IAA5D;AACA,aAAO,GAAP,GAAc,YAAY,GAAZ,GAAoB,KAAK,MAAL,GAAc,YAAY,GAA5D;;AAEA,aAAO,KAAP,GAAgB,YAAY,KAAZ,GAAsB,KAAK,KAAL,IAAe,IAAI,YAAY,KAA/B,CAAtC;AACA,aAAO,MAAP,GAAgB,YAAY,MAAZ,GAAsB,KAAK,MAAL,IAAe,IAAI,YAAY,MAA/B,CAAtC;AACD,KAND,MAOK;AACH,aAAO,IAAP,GAAc,OAAO,GAAP,GAAa,OAAO,KAAP,GAAe,OAAO,MAAP,GAAgB,CAA1D;AACD;;AAED,WAAO,MAAP;AACD,GAxBc;;AA0Bf,OAAK,oBAAwD;AAAA,QAA5C,UAA4C,SAA5C,UAA4C;AAAA,QAAhC,WAAgC,SAAhC,WAAgC;AAAA,QAAnB,MAAmB,SAAnB,MAAmB;AAAA,QAAX,OAAW,SAAX,OAAW;;AAC3D,QAAI,CAAC,OAAL,EAAc;AAAE,aAAO,MAAP;AAAgB;;AAEhC,QAAM,OAAO,OAAO,WAAP,GACT,EAAE,GAAG,OAAO,CAAZ,EAAe,GAAG,OAAO,CAAzB,EADS,GAET,MAAM,MAAN,CAAa,EAAb,EAAiB,UAAjB,CAFJ;;AAIA,QAAM,cAAc,mBAAmB,QAAQ,WAA3B,EAAwC,WAAxC,EAAqD,IAArD,CAApB;;AAEA,QAAI,CAAC,WAAL,EAAkB;AAAE,aAAO,MAAP;AAAgB;;AAEpC,WAAO,EAAP,GAAY,CAAZ;AACA,WAAO,EAAP,GAAY,CAAZ;AACA,WAAO,MAAP,GAAgB,KAAhB;;AAEA,QAAM,OAAO,WAAb;AACA,QAAI,YAAY,KAAK,CAArB;AACA,QAAI,YAAY,KAAK,CAArB;;AAEA,QAAM,SAAS,YAAY,eAAZ,CAA4B,QAA3C;;AAEA;AACA;AACA;AACA,QAAI,OAAO,WAAP,IAAsB,OAAO,WAAjC,EAA8C;AAC5C,kBAAY,KAAK,GAAL,CAAS,KAAK,GAAL,CAAS,KAAK,CAAL,GAAS,KAAK,KAAd,GAAuB,OAAO,KAAvC,EAA+C,KAAK,CAApD,CAAT,EAAiE,KAAK,CAAL,GAAS,OAAO,IAAjF,CAAZ;AACA,kBAAY,KAAK,GAAL,CAAS,KAAK,GAAL,CAAS,KAAK,CAAL,GAAS,KAAK,MAAd,GAAuB,OAAO,MAAvC,EAA+C,KAAK,CAApD,CAAT,EAAiE,KAAK,CAAL,GAAS,OAAO,GAAjF,CAAZ;AACD,KAHD,MAIK;AACH,kBAAY,KAAK,GAAL,CAAS,KAAK,GAAL,CAAS,KAAK,KAAL,GAAc,OAAO,KAA9B,EAAsC,KAAK,CAA3C,CAAT,EAAwD,KAAK,IAAL,GAAY,OAAO,IAA3E,CAAZ;AACA,kBAAY,KAAK,GAAL,CAAS,KAAK,GAAL,CAAS,KAAK,MAAL,GAAc,OAAO,MAA9B,EAAsC,KAAK,CAA3C,CAAT,EAAwD,KAAK,GAAL,GAAY,OAAO,GAA3E,CAAZ;AACD;;AAED,WAAO,EAAP,GAAY,YAAY,KAAK,CAA7B;AACA,WAAO,EAAP,GAAY,YAAY,KAAK,CAA7B;;AAEA,WAAO,OAAP,GAAiB,OAAO,SAAP,KAAqB,SAArB,IAAkC,OAAO,SAAP,KAAqB,SAAxE;AACA,WAAO,MAAP,GAAgB,CAAC,EAAE,OAAO,EAAP,IAAa,OAAO,EAAtB,CAAjB;;AAEA,WAAO,SAAP,GAAmB,SAAnB;AACA,WAAO,SAAP,GAAmB,SAAnB;AACD,GAnEc;;AAqEf,gBAAc,6BAAoD;AAAA,QAAxC,IAAwC,SAAxC,IAAwC;AAAA,QAAlC,MAAkC,SAAlC,MAAkC;AAAA,QAA1B,MAA0B,SAA1B,MAA0B;AAAA,QAAlB,KAAkB,SAAlB,KAAkB;AAAA,QAAX,OAAW,SAAX,OAAW;;AAChE,QAAM,cAAc,WAAW,QAAQ,WAAvC;;AAEA,QAAI,WAAW,QAAQ,OAAnB,IACG,EAAE,UAAU,OAAV,IAAqB,WAArB,IAAoC,OAAO,MAA7C,CADP,EAC6D;;AAE3D,UAAI,OAAO,MAAX,EAAmB;AACjB,aAAK,CAAL,IAAU,OAAO,EAAjB;AACA,aAAK,CAAL,IAAU,OAAO,EAAjB;AACA,eAAO,CAAP,IAAY,OAAO,EAAnB;AACA,eAAO,CAAP,IAAY,OAAO,EAAnB;;AAEA,eAAO;AACL,cAAI,OAAO,EADN;AAEL,cAAI,OAAO;AAFN,SAAP;AAID;AACF;AACF,GAvFc;;AAyFf;AAzFe,CAAjB;;AA4FA,SAAS,kBAAT,CAA6B,KAA7B,EAAoC,WAApC,EAAiD,IAAjD,EAAuD;AACrD,MAAI,MAAM,EAAN,CAAS,QAAT,CAAkB,KAAlB,CAAJ,EAA8B;AAC5B,WAAO,MAAM,eAAN,CAAsB,KAAtB,EAA6B,YAAY,MAAzC,EAAiD,YAAY,OAA7D,EAAsE,CAAC,KAAK,CAAN,EAAS,KAAK,CAAd,EAAiB,WAAjB,CAAtE,CAAP;AACD,GAFD,MAEO;AACL,WAAO,MAAM,eAAN,CAAsB,KAAtB,EAA6B,YAAY,MAAzC,EAAiD,YAAY,OAA7D,CAAP;AACD;AACF;;AAED,UAAU,QAAV,GAAqB,QAArB;AACA,UAAU,KAAV,CAAgB,IAAhB,CAAqB,UAArB;;AAEA,eAAe,SAAf,CAAyB,QAAzB,GAAoC,SAAS,QAA7C;;AAEA,OAAO,OAAP,GAAiB,QAAjB;;;;;AC7GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,IAAM,YAAiB,QAAQ,SAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,UAAR,CAAvB;AACA,IAAM,YAAiB,QAAQ,eAAR,CAAvB;AACA,IAAM,iBAAiB,QAAQ,mBAAR,CAAvB;AACA,IAAM,SAAiB,QAAQ,mBAAR,CAAvB;;eAE+B,QAAQ,YAAR,C;IAAvB,kB,YAAA,kB;;AAER,IAAM,UAAU,EAAE,KAAK,CAAC,QAAR,EAAkB,MAAM,CAAC,QAAzB,EAAmC,QAAQ,CAAC,QAA5C,EAAsD,OAAO,CAAC,QAA9D,EAAhB;AACA,IAAM,UAAU,EAAE,KAAK,CAAC,QAAR,EAAkB,MAAM,CAAC,QAAzB,EAAmC,QAAQ,CAAC,QAA5C,EAAsD,OAAO,CAAC,QAA9D,EAAhB;;AAEA,IAAM,gBAAgB;AACpB,YAAU;AACR,aAAS,KADD;AAER,aAAS,KAFD;AAGR,SAAK,IAHG;AAIR,SAAK,IAJG;AAKR,YAAQ;AALA,GADU;;AASpB,aAAW,yBAAiD;AAAA,QAArC,WAAqC,QAArC,WAAqC;AAAA,QAAxB,WAAwB,QAAxB,WAAwB;AAAA,QAAX,OAAW,QAAX,OAAW;;AAC1D,QAAI,CAAC,OAAL,EAAc;AACZ,aAAO,MAAM,MAAN,CAAa,EAAb,EAAiB,WAAjB,CAAP;AACD;;AAED,QAAM,SAAS,mBAAmB,QAAQ,MAA3B,EAAmC,WAAnC,EAAgD,YAAY,WAAZ,CAAwB,IAAxE,CAAf;;AAEA,QAAI,MAAJ,EAAY;AACV,aAAO;AACL,aAAQ,YAAY,GAAZ,GAAqB,OAAO,CAD/B;AAEL,cAAQ,YAAY,IAAZ,GAAqB,OAAO,CAF/B;AAGL,gBAAQ,YAAY,MAAZ,GAAqB,OAAO,CAH/B;AAIL,eAAQ,YAAY,KAAZ,GAAqB,OAAO;AAJ/B,OAAP;AAMD;;AAED,WAAO,WAAP;AACD,GA1BmB;;AA4BpB,OAAK,oBAAgE;AAAA,QAApD,UAAoD,SAApD,UAAoD;AAAA,QAAxC,WAAwC,SAAxC,WAAwC;AAAA,QAA3B,MAA2B,SAA3B,MAA2B;AAAA,QAAnB,MAAmB,SAAnB,MAAmB;AAAA,QAAX,OAAW,SAAX,OAAW;;AACnE,QAAM,QAAQ,YAAY,QAAZ,CAAqB,WAArB,IAAoC,YAAY,QAAZ,CAAqB,KAAvE;;AAEA,QAAI,CAAC,YAAY,WAAZ,EAAD,IAA8B,CAAC,KAAnC,EAA0C;AACxC;AACD;;AAED,QAAM,OAAO,OAAO,WAAP,GACT,EAAE,GAAG,OAAO,CAAZ,EAAe,GAAG,OAAO,CAAzB,EADS,GAET,MAAM,MAAN,CAAa,EAAb,EAAiB,UAAjB,CAFJ;AAGA,QAAM,QAAQ,UAAU,UAAV,CAAqB,mBAAmB,QAAQ,KAA3B,EAAkC,WAAlC,EAA+C,IAA/C,CAArB,KAA8E,OAA5F;AACA,QAAM,QAAQ,UAAU,UAAV,CAAqB,mBAAmB,QAAQ,KAA3B,EAAkC,WAAlC,EAA+C,IAA/C,CAArB,KAA8E,OAA5F;;AAEA,QAAI,YAAY,KAAK,CAArB;AACA,QAAI,YAAY,KAAK,CAArB;;AAEA,WAAO,EAAP,GAAY,CAAZ;AACA,WAAO,EAAP,GAAY,CAAZ;AACA,WAAO,MAAP,GAAgB,KAAhB;;AAEA,QAAI,MAAM,GAAV,EAAe;AACb,kBAAY,KAAK,GAAL,CAAS,KAAK,GAAL,CAAS,MAAM,GAAN,GAAe,OAAO,GAA/B,EAAuC,KAAK,CAA5C,CAAT,EAAyD,MAAM,GAAN,GAAe,OAAO,GAA/E,CAAZ;AACD,KAFD,MAGK,IAAI,MAAM,MAAV,EAAkB;AACrB,kBAAY,KAAK,GAAL,CAAS,KAAK,GAAL,CAAS,MAAM,MAAN,GAAe,OAAO,MAA/B,EAAuC,KAAK,CAA5C,CAAT,EAAyD,MAAM,MAAN,GAAe,OAAO,MAA/E,CAAZ;AACD;AACD,QAAI,MAAM,IAAV,EAAgB;AACd,kBAAY,KAAK,GAAL,CAAS,KAAK,GAAL,CAAS,MAAM,IAAN,GAAe,OAAO,IAA/B,EAAuC,KAAK,CAA5C,CAAT,EAAyD,MAAM,IAAN,GAAe,OAAO,IAA/E,CAAZ;AACD,KAFD,MAGK,IAAI,MAAM,KAAV,EAAiB;AACpB,kBAAY,KAAK,GAAL,CAAS,KAAK,GAAL,CAAS,MAAM,KAAN,GAAe,OAAO,KAA/B,EAAuC,KAAK,CAA5C,CAAT,EAAyD,MAAM,KAAN,GAAe,OAAO,KAA/E,CAAZ;AACD;;AAED,WAAO,EAAP,GAAY,YAAY,KAAK,CAA7B;AACA,WAAO,EAAP,GAAY,YAAY,KAAK,CAA7B;;AAEA,WAAO,OAAP,GAAiB,OAAO,SAAP,KAAqB,SAArB,IAAkC,OAAO,SAAP,KAAqB,SAAxE;AACA,WAAO,MAAP,GAAgB,CAAC,EAAE,OAAO,EAAP,IAAa,OAAO,EAAtB,CAAjB;;AAEA,WAAO,SAAP,GAAmB,SAAnB;AACA,WAAO,SAAP,GAAmB,SAAnB;AACD,GArEmB;;AAuEpB,gBAAc,6BAAoD;AAAA,QAAxC,IAAwC,SAAxC,IAAwC;AAAA,QAAlC,MAAkC,SAAlC,MAAkC;AAAA,QAA1B,MAA0B,SAA1B,MAA0B;AAAA,QAAlB,KAAkB,SAAlB,KAAkB;AAAA,QAAX,OAAW,SAAX,OAAW;;AAChE,QAAI,WAAW,QAAQ,OAAnB,IACG,EAAE,UAAU,OAAV,IAAqB,OAAO,MAA9B,CADP,EAC8C;;AAE5C,UAAI,OAAO,MAAX,EAAmB;AACjB,aAAK,CAAL,IAAU,OAAO,EAAjB;AACA,aAAK,CAAL,IAAU,OAAO,EAAjB;AACA,eAAO,CAAP,IAAY,OAAO,EAAnB;AACA,eAAO,CAAP,IAAY,OAAO,EAAnB;;AAEA,eAAO;AACL,cAAI,OAAO,EADN;AAEL,cAAI,OAAO;AAFN,SAAP;AAID;AACF;AACF,GAvFmB;;AAyFpB,kBAzFoB;AA0FpB,kBA1FoB;AA2FpB;AA3FoB,CAAtB;;AA8FA,UAAU,aAAV,GAA0B,aAA1B;AACA,UAAU,KAAV,CAAgB,IAAhB,CAAqB,eAArB;;AAEA,eAAe,SAAf,CAAyB,aAAzB,GAAyC,cAAc,QAAvD;AACA,OAAO,QAAP,CAAgB,aAAhB,GAAyC,cAAc,QAAvD;;AAEA,OAAO,OAAP,GAAiB,aAAjB;;;;;AC1HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,IAAM,YAAiB,QAAQ,SAAR,CAAvB;AACA,IAAM,gBAAiB,QAAQ,iBAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,UAAR,CAAvB;AACA,IAAM,YAAiB,QAAQ,eAAR,CAAvB;AACA,IAAM,iBAAiB,QAAQ,mBAAR,CAAvB;AACA,IAAM,SAAiB,QAAQ,mBAAR,CAAvB;;AAEA,IAAM,QAAQ,EAAE,OAAO,CAAC,QAAV,EAAoB,QAAQ,CAAC,QAA7B,EAAd;AACA,IAAM,QAAQ,EAAE,OAAO,CAAC,QAAV,EAAoB,QAAQ,CAAC,QAA7B,EAAd;;AAEA,IAAM,eAAe;AACnB,YAAU;AACR,aAAS,KADD;AAER,aAAS,KAFD;AAGR,SAAK,IAHG;AAIR,SAAK;AAJG,GADS;;AAQnB,aAAW,yBAA2B;AAAA,QAAf,WAAe,QAAf,WAAe;;AACpC,WAAO,YAAY,WAAnB;AACD,GAVkB;;AAYnB,OAAK,aAAU,GAAV,EAAe;AAAA,QACV,WADU,GACe,GADf,CACV,WADU;AAAA,QACG,OADH,GACe,GADf,CACG,OADH;;AAElB,QAAM,QAAQ,YAAY,QAAZ,CAAqB,WAArB,IAAoC,YAAY,QAAZ,CAAqB,KAAvE;;AAEA,QAAI,CAAC,YAAY,WAAZ,EAAD,IAA8B,CAAC,KAAnC,EAA0C;AACxC;AACD;;AAED,QAAM,OAAO,UAAU,UAAV,CAAqB,YAAY,WAAZ,CAAwB,QAA7C,CAAb;;AAEA,QAAM,UAAU,UAAU,UAAV,CAAqB,cAAc,kBAAd,CAAiC,QAAQ,GAAzC,EAA8C,WAA9C,CAArB,KAAoF,KAApG;AACA,QAAM,UAAU,UAAU,UAAV,CAAqB,cAAc,kBAAd,CAAiC,QAAQ,GAAzC,EAA8C,WAA9C,CAArB,KAAoF,KAApG;;AAEA,QAAI,OAAJ,GAAc;AACZ,eAAS,QAAQ,OADL;AAEZ,eAAS,QAAQ,OAFL;AAGZ,aAAO,MAAM,MAAN,CAAa,EAAb,EAAiB,cAAc,OAA/B,CAHK;AAIZ,aAAO,MAAM,MAAN,CAAa,EAAb,EAAiB,cAAc,OAA/B;AAJK,KAAd;;AAOA,QAAI,MAAM,GAAV,EAAe;AACb,UAAI,OAAJ,CAAY,KAAZ,CAAkB,GAAlB,GAAwB,KAAK,MAAL,GAAc,QAAQ,MAA9C;AACA,UAAI,OAAJ,CAAY,KAAZ,CAAkB,GAAlB,GAAwB,KAAK,MAAL,GAAc,QAAQ,MAA9C;AACD,KAHD,MAIK,IAAI,MAAM,MAAV,EAAkB;AACrB,UAAI,OAAJ,CAAY,KAAZ,CAAkB,MAAlB,GAA2B,KAAK,GAAL,GAAW,QAAQ,MAA9C;AACA,UAAI,OAAJ,CAAY,KAAZ,CAAkB,MAAlB,GAA2B,KAAK,GAAL,GAAW,QAAQ,MAA9C;AACD;AACD,QAAI,MAAM,IAAV,EAAgB;AACd,UAAI,OAAJ,CAAY,KAAZ,CAAkB,IAAlB,GAAyB,KAAK,KAAL,GAAa,QAAQ,KAA9C;AACA,UAAI,OAAJ,CAAY,KAAZ,CAAkB,IAAlB,GAAyB,KAAK,KAAL,GAAa,QAAQ,KAA9C;AACD,KAHD,MAIK,IAAI,MAAM,KAAV,EAAiB;AACpB,UAAI,OAAJ,CAAY,KAAZ,CAAkB,KAAlB,GAA0B,KAAK,IAAL,GAAY,QAAQ,KAA9C;AACA,UAAI,OAAJ,CAAY,KAAZ,CAAkB,KAAlB,GAA0B,KAAK,IAAL,GAAY,QAAQ,KAA9C;AACD;;AAED,kBAAc,GAAd,CAAkB,GAAlB;AACD,GAlDkB;;AAoDnB,gBAAc,cAAc;AApDT,CAArB;;AAuDA,UAAU,YAAV,GAAyB,YAAzB;AACA,UAAU,KAAV,CAAgB,IAAhB,CAAqB,cAArB;;AAEA,eAAe,SAAf,CAAyB,YAAzB,GAAwC,aAAa,QAArD;AACA,OAAO,QAAP,CAAgB,YAAhB,GAAwC,aAAa,QAArD;;AAEA,OAAO,OAAP,GAAiB,YAAjB;;;;;AClFA,IAAM,YAAiB,QAAQ,SAAR,CAAvB;AACA,IAAM,WAAiB,QAAQ,aAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,UAAR,CAAvB;AACA,IAAM,iBAAiB,QAAQ,mBAAR,CAAvB;;AAEA,IAAM,OAAO;AACX,YAAU;AACR,aAAS,KADD;AAER,aAAS,KAFD;AAGR,WAAS,QAHD;AAIR,aAAS,IAJD;AAKR,aAAS,IALD;;AAOR,oBAAgB;AAPR,GADC;;AAWX,aAAW,yBAA8E;AAAA,QAAlE,WAAkE,QAAlE,WAAkE;AAAA,QAArD,YAAqD,QAArD,YAAqD;AAAA,QAAvC,OAAuC,QAAvC,OAAuC;AAAA,QAA9B,IAA8B,QAA9B,IAA8B;AAAA,QAAxB,WAAwB,QAAxB,WAAwB;AAAA,QAAX,OAAW,QAAX,OAAW;;AACvF,QAAM,UAAU,EAAhB;AACA,QAAM,gBAAgB,MAAM,QAAN,CAAe,MAAM,eAAN,CAAsB,QAAQ,MAA9B,CAAf,CAAtB;AACA,QAAM,SAAS,iBAAiB,MAAM,WAAN,CAAkB,YAAlB,EAAgC,OAAhC,EAAyC,YAAY,QAAZ,CAAqB,IAA9D,CAAhC;AACA,cAAU,WAAW,aAAa,OAAb,CAAqB,YAAY,QAAZ,CAAqB,IAA1C,EAAgD,IAA3D,IAAmE,EAA7E;;AAEA,QAAI,mBAAJ;;AAEA,QAAI,QAAQ,MAAR,KAAmB,aAAvB,EAAsC;AACpC,mBAAa;AACX,WAAG,YAAY,WAAZ,CAAwB,IAAxB,CAA6B,CAA7B,GAAiC,OAAO,CADhC;AAEX,WAAG,YAAY,WAAZ,CAAwB,IAAxB,CAA6B,CAA7B,GAAiC,OAAO;AAFhC,OAAb;AAID,KALD,MAMM;AACJ,UAAM,aAAa,MAAM,eAAN,CAAsB,QAAQ,MAA9B,EAAsC,YAAtC,EAAoD,OAApD,EAA6D,CAAC,WAAD,CAA7D,CAAnB;;AAEA,mBAAa,MAAM,QAAN,CAAe,UAAf,KAA8B,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EAA3C;AACD;;AAED,QAAI,QAAQ,QAAQ,cAAhB,IAAkC,QAAQ,cAAR,CAAuB,MAA7D,EAAqE;AACnE,2BAA6C,QAAQ,cAArD,kHAAqE;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,YAArD,SAAqD,SAAxD,CAAwD;AAAA,YAAvC,SAAuC,SAA1C,CAA0C;;AACnE,gBAAQ,IAAR,CAAa;AACX,aAAG,YAAY,IAAZ,GAAoB,KAAK,KAAL,GAAc,SAAlC,GAA+C,WAAW,CADlD;AAEX,aAAG,YAAY,GAAZ,GAAoB,KAAK,MAAL,GAAc,SAAlC,GAA+C,WAAW;AAFlD,SAAb;AAID;AACF,KAPD,MAQK;AACH,cAAQ,IAAR,CAAa,UAAb;AACD;;AAED,WAAO,OAAP;AACD,GA5CU;;AA8CX,OAAK,oBAAyE;AAAA,QAA7D,WAA6D,SAA7D,WAA6D;AAAA,QAAhD,UAAgD,SAAhD,UAAgD;AAAA,QAApC,MAAoC,SAApC,MAAoC;AAAA,QAA5B,OAA4B,SAA5B,OAA4B;AAAA,QAAX,OAAW,SAAnB,MAAmB;;AAC5E,QAAM,UAAU,EAAhB;AACA,QAAI,eAAJ;AACA,QAAI,aAAJ;AACA,QAAI,UAAJ;;AAEA,QAAI,OAAO,WAAX,EAAwB;AACtB,aAAO,EAAE,GAAG,OAAO,CAAZ,EAAe,GAAG,OAAO,CAAzB,EAAP;AACD,KAFD,MAGK;AACH,UAAM,SAAS,MAAM,WAAN,CAAkB,YAAY,MAA9B,EAAsC,YAAY,OAAlD,EAA2D,YAAY,QAAZ,CAAqB,IAAhF,CAAf;;AAEA,aAAO,MAAM,MAAN,CAAa,EAAb,EAAiB,UAAjB,CAAP;;AAEA,WAAK,CAAL,IAAU,OAAO,CAAjB;AACA,WAAK,CAAL,IAAU,OAAO,CAAjB;AACD;;AAED,WAAO,KAAP,GAAe,KAAK,CAApB;AACA,WAAO,KAAP,GAAe,KAAK,CAApB;;AAEA,QAAI,MAAM,QAAQ,OAAR,GAAiB,QAAQ,OAAR,CAAgB,MAAjC,GAA0C,CAApD;;AAEA,0BAAyC,OAAzC,yHAAkD;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,UAAlC,OAAkC,SAArC,CAAqC;AAAA,UAAtB,OAAsB,SAAzB,CAAyB;;AAChD,UAAM,YAAY,KAAK,CAAL,GAAS,OAA3B;AACA,UAAM,YAAY,KAAK,CAAL,GAAS,OAA3B;;AAEA,4BAAyB,QAAQ,OAAjC,yHAA0C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,YAA/B,UAA+B;;AACxC,YAAI,MAAM,EAAN,CAAS,QAAT,CAAkB,UAAlB,CAAJ,EAAmC;AACjC,mBAAS,WAAW,SAAX,EAAsB,SAAtB,EAAiC,WAAjC,CAAT;AACD,SAFD,MAGK;AACH,mBAAS,UAAT;AACD;;AAED,YAAI,CAAC,MAAL,EAAa;AAAE;AAAW;;AAE1B,gBAAQ,IAAR,CAAa;AACX,aAAG,MAAM,EAAN,CAAS,MAAT,CAAgB,OAAO,CAAvB,IAA6B,OAAO,CAAP,GAAW,OAAxC,GAAmD,SAD3C;AAEX,aAAG,MAAM,EAAN,CAAS,MAAT,CAAgB,OAAO,CAAvB,IAA6B,OAAO,CAAP,GAAW,OAAxC,GAAmD,SAF3C;;AAIX,iBAAO,MAAM,EAAN,CAAS,MAAT,CAAgB,OAAO,KAAvB,IAA+B,OAAO,KAAtC,GAA6C,QAAQ;AAJjD,SAAb;AAMD;AACF;;AAED,QAAM,UAAU;AACd,cAAQ,IADM;AAEd,eAAS,KAFK;AAGd,gBAAU,CAHI;AAId,aAAO,CAJO;AAKd,UAAI,CALU;AAMd,UAAI;AANU,KAAhB;;AASA,SAAK,IAAI,CAAJ,EAAO,MAAM,QAAQ,MAA1B,EAAkC,IAAI,GAAtC,EAA2C,GAA3C,EAAgD;AAC9C,eAAS,QAAQ,CAAR,CAAT;;AAEA,UAAM,QAAQ,OAAO,KAArB;AACA,UAAM,KAAK,OAAO,CAAP,GAAW,KAAK,CAA3B;AACA,UAAM,KAAK,OAAO,CAAP,GAAW,KAAK,CAA3B;AACA,UAAM,WAAW,MAAM,KAAN,CAAY,EAAZ,EAAgB,EAAhB,CAAjB;AACA,UAAI,UAAU,YAAY,KAA1B;;AAEA;AACA;AACA,UAAI,UAAU,QAAV,IAAsB,QAAQ,OAA9B,IAAyC,QAAQ,KAAR,KAAkB,QAA/D,EAAyE;AACvE,kBAAU,KAAV;AACD;;AAED,UAAI,CAAC,QAAQ,MAAT,KAAoB;AACpB;AADoB,QAEjB,QAAQ,OAAR,IAAmB,UAAU;AAChC;AADG,QAED,WAAW,KAAX,GAAmB,QAAQ,QAAR,GAAmB,QAAQ;AAChD;AAHG,QAIA,UAAU,QAAV,IAAsB,QAAQ,KAAR,KAAkB,QAAzC;AACF;AACC,iBAAW,QAAQ,QARA;AASpB;AACG,OAAC,QAAQ,OAAT,IAAoB,WAAW,QAAQ,QAV1C,CAAJ,EAU0D;;AAExD,gBAAQ,MAAR,GAAiB,MAAjB;AACA,gBAAQ,QAAR,GAAmB,QAAnB;AACA,gBAAQ,KAAR,GAAgB,KAAhB;AACA,gBAAQ,OAAR,GAAkB,OAAlB;AACA,gBAAQ,EAAR,GAAa,EAAb;AACA,gBAAQ,EAAR,GAAa,EAAb;;AAEA,eAAO,KAAP,GAAe,KAAf;AACD;AACF;;AAED,QAAI,oBAAJ;;AAEA,QAAI,QAAQ,MAAZ,EAAoB;AAClB,oBAAe,OAAO,SAAP,KAAqB,QAAQ,MAAR,CAAe,CAApC,IAAyC,OAAO,SAAP,KAAqB,QAAQ,MAAR,CAAe,CAA5F;;AAEA,aAAO,SAAP,GAAmB,QAAQ,MAAR,CAAe,CAAlC;AACA,aAAO,SAAP,GAAmB,QAAQ,MAAR,CAAe,CAAlC;AACD,KALD,MAMK;AACH,oBAAc,IAAd;;AAEA,aAAO,SAAP,GAAmB,GAAnB;AACA,aAAO,SAAP,GAAmB,GAAnB;AACD;;AAED,WAAO,EAAP,GAAY,QAAQ,EAApB;AACA,WAAO,EAAP,GAAY,QAAQ,EAApB;;AAEA,WAAO,OAAP,GAAkB,eAAgB,QAAQ,OAAR,IAAmB,CAAC,OAAO,MAA7D;AACA,WAAO,MAAP,GAAgB,QAAQ,OAAxB;AACD,GA/JU;;AAiKX,gBAAc,6BAAoD;AAAA,QAAxC,IAAwC,SAAxC,IAAwC;AAAA,QAAlC,MAAkC,SAAlC,MAAkC;AAAA,QAA1B,MAA0B,SAA1B,MAA0B;AAAA,QAAlB,KAAkB,SAAlB,KAAkB;AAAA,QAAX,OAAW,SAAX,OAAW;;AAChE,QAAM,iBAAiB,WAAW,QAAQ,cAA1C;;AAEA,QAAI,WAAW,QAAQ,OAAnB,IACG,EAAE,UAAU,OAAV,IAAqB,cAArB,IAAuC,eAAe,MAAxD,CADP,EACwE;;AAEtE,UAAI,OAAO,MAAX,EAAmB;AACjB,aAAK,CAAL,IAAU,OAAO,EAAjB;AACA,aAAK,CAAL,IAAU,OAAO,EAAjB;AACA,eAAO,CAAP,IAAY,OAAO,EAAnB;AACA,eAAO,CAAP,IAAY,OAAO,EAAnB;AACD;;AAED,aAAO;AACL,eAAS,OAAO,KADX;AAEL,gBAAS,OAAO,MAFX;AAGL,WAAS,OAAO,SAHX;AAIL,WAAS,OAAO,SAJX;AAKL,eAAS,OAAO,KALX;AAML,eAAS,OAAO,KANX;AAOL,YAAS,OAAO,EAPX;AAQL,YAAS,OAAO;AARX,OAAP;AAUD;AACF;AAzLU,CAAb;;AA4LA,SAAS,cAAT,GAA0B,UAAU,IAAV,EAAgB;AACxC,SAAO,UAAU,CAAV,EAAa,CAAb,EAAgB;AACrB,QAAM,SAAS,KAAK,MAAL,IAAe;AAC5B,YAAQ,CAAC,QADmB;AAE5B,aAAS,QAFmB;AAG5B,WAAQ,CAAC,QAHmB;AAI5B,cAAS;AAJmB,KAA9B;AAMA,QAAI,UAAU,CAAd;AACA,QAAI,UAAU,CAAd;;AAEA,QAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,KAAK,MAArB,CAAJ,EAAkC;AAChC,gBAAU,KAAK,MAAL,CAAY,CAAtB;AACA,gBAAU,KAAK,MAAL,CAAY,CAAtB;AACD;;AAED,QAAM,QAAQ,KAAK,KAAL,CAAW,CAAC,IAAI,OAAL,IAAgB,KAAK,CAAhC,CAAd;AACA,QAAM,QAAQ,KAAK,KAAL,CAAW,CAAC,IAAI,OAAL,IAAgB,KAAK,CAAhC,CAAd;;AAEA,QAAM,OAAO,KAAK,GAAL,CAAS,OAAO,IAAhB,EAAsB,KAAK,GAAL,CAAS,OAAO,KAAhB,EAAwB,QAAQ,KAAK,CAAb,GAAiB,OAAzC,CAAtB,CAAb;AACA,QAAM,OAAO,KAAK,GAAL,CAAS,OAAO,GAAhB,EAAsB,KAAK,GAAL,CAAS,OAAO,MAAhB,EAAwB,QAAQ,KAAK,CAAb,GAAiB,OAAzC,CAAtB,CAAb;;AAEA,WAAO;AACL,SAAG,IADE;AAEL,SAAG,IAFE;AAGL,aAAO,KAAK;AAHP,KAAP;AAKD,GA1BD;AA2BD,CA5BD;;AA8BA,UAAU,IAAV,GAAiB,IAAjB;AACA,UAAU,KAAV,CAAgB,IAAhB,CAAqB,MAArB;;AAEA,eAAe,SAAf,CAAyB,IAAzB,GAAgC,KAAK,QAArC;;AAEA,OAAO,OAAP,GAAiB,IAAjB;;;;;ACpOA;AACA;;AAEA,IAAM,YAAiB,QAAQ,SAAR,CAAvB;AACA,IAAM,OAAiB,QAAQ,QAAR,CAAvB;AACA,IAAM,iBAAiB,QAAQ,mBAAR,CAAvB;AACA,IAAM,SAAiB,QAAQ,mBAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,WAAR,CAAvB;;AAEA,IAAM,WAAW;AACf,YAAU;AACR,aAAS,KADD;AAER,aAAS,KAFD;AAGR,WAAS,QAHD;AAIR,aAAS,IAJD;AAKR,aAAS;AALD,GADK;;AASf,aAAW,mBAAU,GAAV,EAAe;AAAA,QAChB,WADgB,GACS,GADT,CAChB,WADgB;AAAA,QACH,OADG,GACS,GADT,CACH,OADG;;AAExB,QAAM,QAAQ,YAAY,QAAZ,CAAqB,KAAnC;;AAEA,QAAI,CAAC,KAAL,EAAY;AAAE;AAAS;;AAEvB,QAAI,OAAJ,GAAc;AACZ,sBAAgB,CAAC;AACf,WAAG,MAAM,IAAN,GAAY,CAAZ,GAAgB,CADJ;AAEf,WAAG,MAAM,GAAN,GAAY,CAAZ,GAAgB;AAFJ,OAAD,CADJ;AAKZ,cAAQ,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EALI;AAMZ,cAAQ,MANI;AAOZ,aAAO,QAAQ;AAPH,KAAd;;AAUA,QAAM,UAAU,KAAK,SAAL,CAAe,GAAf,CAAhB;AACA,QAAI,OAAJ,GAAc,OAAd;;AAEA,WAAO,OAAP;AACD,GA7Bc;;AA+Bf,OAAK,aAAU,GAAV,EAAe;AAAA,QACV,WADU,GACmC,GADnC,CACV,WADU;AAAA,QACG,OADH,GACmC,GADnC,CACG,OADH;AAAA,QACY,MADZ,GACmC,GADnC,CACY,MADZ;AAAA,QACoB,UADpB,GACmC,GADnC,CACoB,UADpB;;AAElB,QAAM,OAAO,MAAM,MAAN,CAAa,EAAb,EAAiB,UAAjB,CAAb;AACA,QAAM,YAAY,KAAK,CAAL,GAAS,OAAO,CAAP,EAAU,CAArC;AACA,QAAM,YAAY,KAAK,CAAL,GAAS,OAAO,CAAP,EAAU,CAArC;;AAEA,QAAI,OAAJ,GAAc,MAAM,MAAN,CAAa,EAAb,EAAiB,OAAjB,CAAd;AACA,QAAI,OAAJ,CAAY,OAAZ,GAAsB,EAAtB;;AAEA,yBAAyB,QAAQ,OAAjC,kHAA0C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAA/B,UAA+B;;AACxC,UAAI,eAAJ;;AAEA,UAAI,MAAM,EAAN,CAAS,QAAT,CAAkB,UAAlB,CAAJ,EAAmC;AACjC,iBAAS,WAAW,SAAX,EAAsB,SAAtB,EAAiC,WAAjC,CAAT;AACD,OAFD,MAGK;AACH,iBAAS,UAAT;AACD;;AAED,UAAI,CAAC,MAAL,EAAa;AAAE;AAAW;;AAE1B,UAAI,WAAW,MAAX,IAAqB,YAAY,MAArC,EAA6C;AAC3C,eAAO,CAAP,GAAW,OAAO,KAAlB;AACA,eAAO,CAAP,GAAW,OAAO,MAAlB;AACD;;AAED,UAAI,OAAJ,CAAY,OAAZ,CAAoB,IAApB,CAAyB,MAAzB;AACD;;AAED,SAAK,GAAL,CAAS,GAAT;AACD,GA7Dc;;AA+Df,gBAAc,sBAAU,GAAV,EAAe;AAAA,QACnB,OADmB,GACP,GADO,CACnB,OADmB;;;AAG3B,QAAI,OAAJ,GAAc,MAAM,MAAN,CAAa,EAAb,EAAiB,OAAjB,CAAd;AACA,QAAI,OAAJ,CAAY,OAAZ,GAAsB,QAAQ,OAA9B;AACA,QAAI,OAAJ,CAAY,cAAZ,GAA6B,CAAC,IAAD,CAA7B;;AAEA,SAAK,YAAL,CAAkB,GAAlB;AACD;AAvEc,CAAjB;;AA0EA,UAAU,QAAV,GAAqB,QAArB;AACA,UAAU,KAAV,CAAgB,IAAhB,CAAqB,UAArB;;AAEA,eAAe,SAAf,CAAyB,QAAzB,GAAoC,SAAS,QAA7C;AACA,OAAO,QAAP,CAAgB,QAAhB,GAAoC,SAAS,QAA7C;;AAEA,OAAO,OAAP,GAAiB,QAAjB;;;;;;;ACzFA,IAAM,eAAe,QAAQ,uBAAR,CAArB;;AAEA,OAAO,OAAP;AACE,wBAAa,IAAb,EAAmB,OAAnB,EAA4B,KAA5B,EAAmC,WAAnC,EAAgD,WAAhD,EAA6D;AAAA;;AAC3D,iBAAa,aAAb,CAA2B,IAA3B,EAAiC,KAAjC;;AAEA,QAAI,UAAU,OAAd,EAAuB;AACrB,mBAAa,aAAb,CAA2B,IAA3B,EAAiC,OAAjC;AACD;;AAED,SAAK,WAAL,GAAmB,WAAnB;;AAEA,SAAK,SAAL,GAAqB,IAAI,IAAJ,GAAW,OAAX,EAArB;AACA,SAAK,aAAL,GAAqB,KAArB;AACA,SAAK,IAAL,GAAqB,IAArB;AACA,SAAK,SAAL,GAAqB,aAAa,YAAb,CAA0B,OAA1B,CAArB;AACA,SAAK,WAAL,GAAqB,aAAa,cAAb,CAA4B,OAA5B,CAArB;AACA,SAAK,MAAL,GAAqB,WAArB;AACA,SAAK,aAAL,GAAqB,IAArB;;AAEA,QAAI,SAAS,KAAb,EAAoB;AAClB,UAAM,eAAe,YAAY,eAAZ,CAA4B,OAA5B,CAArB;AACA,WAAK,EAAL,GAAU,KAAK,SAAL,GAAiB,YAAY,SAAZ,CAAsB,YAAtB,CAA3B;;AAEA,UAAM,WAAW,KAAK,SAAL,GAAiB,YAAY,OAA9C;;AAEA,WAAK,MAAL,GAAc,CAAC,EAAE,YAAY,OAAZ,IACZ,YAAY,OAAZ,CAAoB,IAApB,KAA6B,WADjB,IAEZ,YAAY,OAAZ,CAAoB,MAApB,KAA+B,KAAK,MAFxB,IAGZ,WAAW,GAHD,CAAf;AAID,KAVD,MAWK,IAAI,SAAS,WAAb,EAA0B;AAC7B,WAAK,EAAL,GAAU,QAAQ,SAAR,GAAoB,YAAY,OAA1C;AACD;AACF;;AAhCH,yBAkCE,cAlCF,iCAkC8C;AAAA,QAAvB,OAAuB,QAA1B,CAA0B;AAAA,QAAX,OAAW,QAAd,CAAc;;AAC1C,SAAK,KAAL,IAAgB,OAAhB;AACA,SAAK,KAAL,IAAgB,OAAhB;AACA,SAAK,OAAL,IAAgB,OAAhB;AACA,SAAK,OAAL,IAAgB,OAAhB;;AAEA,WAAO,IAAP;AACD,GAzCH;;AAAA,yBA2CE,SA3CF,6BA2CyC;AAAA,QAAvB,OAAuB,SAA1B,CAA0B;AAAA,QAAX,OAAW,SAAd,CAAc;;AACrC,SAAK,KAAL,IAAgB,OAAhB;AACA,SAAK,KAAL,IAAgB,OAAhB;AACA,SAAK,OAAL,IAAgB,OAAhB;AACA,SAAK,OAAL,IAAgB,OAAhB;;AAEA,WAAO,IAAP;AACD,GAlDH;;AAAA,yBAoDE,cApDF,6BAoDoB;AAChB,SAAK,aAAL,CAAmB,cAAnB;AACD,GAtDH;;AAAA,yBAwDE,eAxDF,8BAwDqB;AACjB,SAAK,kBAAL,GAA0B,IAA1B;AACD,GA1DH;;AAAA,yBA4DE,wBA5DF,uCA4D8B;AAC1B,SAAK,2BAAL,GAAmC,KAAK,kBAAL,GAA0B,IAA7D;AACD,GA9DH;;AAAA;AAAA;;;;;ACFA,IAAM,eAAe,QAAQ,gBAAR,CAArB;AACA,IAAM,cAAe,QAAQ,gBAAR,CAArB;AACA,IAAM,QAAe,QAAQ,UAAR,CAArB;AACA,IAAM,UAAe,QAAQ,kBAAR,CAArB;AACA,IAAM,WAAe,QAAQ,mBAAR,CAArB;AACA,IAAM,UAAe,QAAQ,kBAAR,EAA4B,GAA5B,EAArB;;eACqB,QAAQ,cAAR,C;IAAb,M,YAAA,M;;AAER,IAAM,gBAAgB,CAAE,MAAF,EAAU,IAAV,EAAgB,QAAhB,CAAtB;AACA,IAAM,eAAgB,CAAE,MAAF,EAAU,IAAV,EAAgB,QAAhB,CAAtB;;AAEA,IAAM,gBAAgB;AACpB,4BADoB;AAEpB,YAFoB;AAGpB,0CAHoB;AAIpB,kBAJoB;AAKpB,YAAU;AACR,kBAAc,GADN;AAER,gBAAc,IAFN;AAGR,eAAc,IAHN;AAIR,YAAc,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX;AAJN,GALU;AAWpB,SAAO,CACL,MADK,EAEL,MAFK,EAGL,IAHK,EAIL,QAJK,EAKL,KALK,EAML,WANK,EAOL,MAPK;AAXa,CAAtB;;AAsBA,SAAS,IAAT,CAAe,GAAf,EAAoB;AAAA,MAEhB,WAFgB,GAMd,GANc,CAEhB,WAFgB;AAAA,MAEH,OAFG,GAMd,GANc,CAEH,OAFG;AAAA,MAEM,KAFN,GAMd,GANc,CAEM,KAFN;AAAA,MAEa,WAFb,GAMd,GANc,CAEa,WAFb;AAAA,kBAMd,GANc,CAGhB,IAHgB;AAAA,MAGhB,IAHgB,6BAGT,IAAI,YAAJ,CAAiB,IAHR;AAAA,qBAMd,GANc,CAIhB,OAJgB;AAAA,MAIhB,OAJgB,gCAIN,oBAAoB,GAApB,CAJM;AAAA,0BAMd,GANc,CAKhB,YALgB;AAAA,MAKhB,YALgB,qCAKD,IAAI,YAAJ,CAAiB,IAAjB,EAAuB,OAAvB,EAAgC,KAAhC,EAAuC,WAAvC,EAAoD,WAApD,CALC;;;AAQlB,MAAM,YAAY;AAChB,4BADgB;AAEhB,oBAFgB;AAGhB,gBAHgB;AAIhB,4BAJgB;AAKhB,oBALgB;AAMhB,cANgB;AAOhB;AAPgB,GAAlB;;AAUA,OAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,QAAQ,MAA5B,EAAoC,GAApC,EAAyC;AACvC,QAAM,SAAS,QAAQ,CAAR,CAAf;;AAEA,SAAK,IAAM,IAAX,IAAmB,OAAO,KAAP,IAAgB,EAAnC,EAAuC;AACrC,mBAAa,IAAb,IAAqB,OAAO,KAAP,CAAa,IAAb,CAArB;AACD;;AAED,QAAM,SAAS,MAAM,WAAN,CAAkB,OAAO,SAAzB,EAAoC,OAAO,OAA3C,CAAf;;AAEA,iBAAa,cAAb,CAA4B,MAA5B;AACA,iBAAa,SAAb,GAAyB,OAAO,SAAhC;AACA,iBAAa,aAAb,GAA6B,OAAO,OAApC;;AAEA,WAAO,SAAP,CAAiB,IAAjB,CAAsB,YAAtB;;AAEA,iBAAa,SAAb,CAAuB,MAAvB;;AAEA,QAAI,aAAa,2BAAb,IACI,aAAa,kBAAb,IACI,IAAI,CAAL,GAAU,QAAQ,MADrB,IAC+B,QAAQ,IAAI,CAAZ,EAAe,OAAf,KAA2B,aAAa,aAF/E,EAE+F;AAC7F;AACD;AACF;;AAED,UAAQ,IAAR,CAAa,OAAb,EAAsB,SAAtB;;AAEA,MAAI,SAAS,KAAb,EAAoB;AAClB;AACA;AACA,QAAM,UAAU,aAAa,MAAb,GACZ,KAAK;AACL,8BADK,EACQ,gBADR,EACiB,YADjB,EACwB,wBADxB;AAEL,YAAM;AAFD,KAAL,CADY,GAKZ,YALJ;;AAOA,gBAAY,OAAZ,GAAsB,OAAtB;AACA,gBAAY,OAAZ,GAAsB,QAAQ,SAA9B;AACD;;AAED,SAAO,YAAP;AACD;;AAED,SAAS,mBAAT,OAAkF;AAAA,MAAlD,WAAkD,QAAlD,WAAkD;AAAA,MAArC,OAAqC,QAArC,OAAqC;AAAA,MAA5B,KAA4B,QAA5B,KAA4B;AAAA,MAArB,WAAqB,QAArB,WAAqB;AAAA,MAAR,IAAQ,QAAR,IAAQ;;AAChF,MAAM,eAAe,YAAY,eAAZ,CAA4B,OAA5B,CAArB;;AAEA;AACA,MAAI,SAAS,KAAT,KAAmB,YAAY;AAC/B;AADmB,KAEhB,EAAE,YAAY,WAAZ,CAAwB,YAAxB,KAAyC,YAAY,WAAZ,CAAwB,YAAxB,MAA0C,WAArF,CAFH,CAAJ,EAE2G;AACzG,WAAO,EAAP;AACD;;AAED,MAAM,OAAO,MAAM,OAAN,CAAc,WAAd,CAAb;AACA,MAAM,YAAY;AAChB,4BADgB;AAEhB,oBAFgB;AAGhB,gBAHgB;AAIhB,4BAJgB;AAKhB,cALgB;AAMhB,cANgB;AAOhB,aAAS,EAPO;AAQhB,aAAS;AARO,GAAlB;;AAWA,uBAAsB,IAAtB,kHAA4B;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,QAAjB,OAAiB;;AAC1B,cAAU,OAAV,GAAoB,OAApB;;AAEA,YAAQ,IAAR,CAAa,iBAAb,EAAgC,SAAhC;AACD;;AAED,MAAI,SAAS,MAAb,EAAqB;AACnB,cAAU,OAAV,GAAoB,OAAO,UAAU,OAAjB,EAA0B;AAAA,aAC5C,OAAO,SAAP,CAAiB,OAAjB,CAAyB,YAAzB,KAA0C,YAAY,UAAZ,CAAuB,YAAvB,EAAqC,QADnC;AAAA,KAA1B,CAApB;AAED;;AAED,SAAO,UAAU,OAAjB;AACD;;AAED,YAAY,OAAZ,CAAoB,EAApB,CAAuB,qBAAvB,EAA8C,iBAAyC;AAAA,MAA7B,WAA6B,SAA7B,WAA6B;AAAA,MAAhB,YAAgB,SAAhB,YAAgB;;AACrF,cAAY,UAAZ,CAAuB,YAAvB,IAAuC,EAAE,UAAU,QAAZ,EAAsB,SAAS,IAA/B,EAAvC;AACD,CAFD;;AAIA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,gBAAvB,EAAyC,iBAAyC;AAAA,MAA7B,WAA6B,SAA7B,WAA6B;AAAA,MAAhB,YAAgB,SAAhB,YAAgB;;AAChF,cAAY,UAAZ,CAAuB,MAAvB,CAA8B,YAA9B,EAA4C,CAA5C;AACD,CAFD;;AAIA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,MAAvB,EAA+B,iBAAuE;AAAA,MAA3D,WAA2D,SAA3D,WAA2D;AAAA,MAA9C,OAA8C,SAA9C,OAA8C;AAAA,MAArC,KAAqC,SAArC,KAAqC;AAAA,MAA9B,WAA8B,SAA9B,WAA8B;AAAA,MAAjB,aAAiB,SAAjB,aAAiB;;AACpG,MAAM,eAAe,YAAY,eAAZ,CAA4B,OAA5B,CAArB;;AAEA,MAAI,CAAC,aAAD,KAAmB,CAAC,YAAY,aAAb,IAA8B,YAAY,eAA7D,CAAJ,EAAmF;AACjF,QAAI,YAAY,aAAhB,EAA+B;AAC7B,mBAAa,YAAY,UAAZ,CAAuB,YAAvB,EAAqC,OAAlD;AACD;;AAED,SAAK;AACH,8BADG,EACU,gBADV,EACmB,YADnB,EAC0B,wBAD1B;AAEH,YAAM;AAFH,KAAL;AAID;AACF,CAbD;;AAeA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,MAAvB,EAA+B,iBAAsE;AAAA,MAA1D,WAA0D,SAA1D,WAA0D;AAAA,MAA7C,OAA6C,SAA7C,OAA6C;AAAA,MAApC,KAAoC,SAApC,KAAoC;AAAA,MAA7B,WAA6B,SAA7B,WAA6B;AAAA,MAAhB,YAAgB,SAAhB,YAAgB;;AACnG;AACA,MAAM,YAAY,QAAQ,KAAR,GAAe,MAAM,MAAN,CAAa,EAAb,EAAiB,KAAjB,CAAf,GAAyC,KAA3D;;AAEA,MAAM,QAAQ,YAAY,UAAZ,CAAuB,YAAvB,CAAd;AACA,MAAM,OAAO,MAAM,OAAN,CAAc,WAAd,CAAb;AACA,MAAM,YAAY;AAChB,4BADgB;AAEhB,oBAFgB;AAGhB,gBAHgB;AAIhB,4BAJgB;AAKhB,UAAM,MALU;AAMhB,aAAS,EANO;AAOhB,cAPgB;AAQhB,aAAS;AARO,GAAlB;;AAWA,wBAAsB,IAAtB,yHAA4B;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,QAAjB,OAAiB;;AAC1B,cAAU,OAAV,GAAoB,OAApB;;AAEA,YAAQ,IAAR,CAAa,iBAAb,EAAgC,SAAhC;AACD;;AAED,MAAI,CAAC,UAAU,OAAV,CAAkB,MAAvB,EAA+B;AAAE;AAAS;;AAE1C,MAAI,cAAc,QAAlB;;AAEA,OAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,UAAU,OAAV,CAAkB,MAAtC,EAA8C,GAA9C,EAAmD;AACjD,QAAM,SAAS,UAAU,OAAV,CAAkB,CAAlB,CAAf;AACA,QAAM,eAAe,OAAO,SAAP,CAAiB,OAAjB,CAAyB,YAA9C;;AAEA,QAAI,eAAe,WAAnB,EAAgC;AAC9B,oBAAc,YAAd;AACD;AACF;;AAED,QAAM,QAAN,GAAiB,WAAjB;AACA,QAAM,OAAN,GAAgB,WAAW,YAAY;AACrC,SAAK;AACH,8BADG;AAEH,8BAFG;AAGH,eAAS,QAAQ,KAAR,GAAe,SAAf,GAA2B,OAHjC;AAIH,aAAO,SAJJ;AAKH,YAAM;AALH,KAAL;AAOD,GARe,EAQb,WARa,CAAhB;AASD,CA9CD;;AAgDA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,IAAvB,EAA6B,iBAAkD;AAAA,MAA/C,WAA+C,SAA/C,WAA+C;AAAA,MAAlC,OAAkC,SAAlC,OAAkC;AAAA,MAAzB,KAAyB,SAAzB,KAAyB;AAAA,MAAlB,WAAkB,SAAlB,WAAkB;;AAC7E,MAAI,CAAC,YAAY,eAAjB,EAAkC;AAChC,SAAK,EAAE,wBAAF,EAAe,wBAAf,EAA4B,gBAA5B,EAAqC,YAArC,EAA4C,MAAM,KAAlD,EAAL;AACD;AACF,CAJD;;AAMA,CAAC,IAAD,EAAO,QAAP,EAAiB,OAAjB,CAAyB,UAAU,UAAV,EAAsB;AAC7C,cAAY,OAAZ,CAAoB,EAApB,CAAuB,UAAvB,EAAmC,iBAAyC;AAAA,QAA7B,WAA6B,SAA7B,WAA6B;AAAA,QAAhB,YAAgB,SAAhB,YAAgB;;AAC1E,QAAI,YAAY,UAAZ,CAAuB,YAAvB,CAAJ,EAA0C;AACxC,mBAAa,YAAY,UAAZ,CAAuB,YAAvB,EAAqC,OAAlD;AACD;AACF,GAJD;AAKD,CAND;;AAQA,SAAS,oBAAT,CAA+B,IAA/B,EAAqC;AACnC,SAAO,kBAAwD;AAAA,QAA5C,WAA4C,UAA5C,WAA4C;AAAA,QAA/B,OAA+B,UAA/B,OAA+B;AAAA,QAAtB,KAAsB,UAAtB,KAAsB;AAAA,QAAf,WAAe,UAAf,WAAe;;AAC7D,SAAK,EAAE,wBAAF,EAAe,wBAAf,EAA4B,gBAA5B,EAAqC,YAArC,EAA4C,UAA5C,EAAL;AACD,GAFD;AAGD;;AAED,KAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,cAAc,MAAlC,EAA0C,GAA1C,EAA+C;AAC7C,cAAY,OAAZ,CAAoB,EAApB,CAAuB,cAAc,CAAd,CAAvB,EAAyC,qBAAqB,aAAa,CAAb,CAArB,CAAzC;AACD;;AAED,YAAY,OAAZ,CAAoB,EAApB,CAAuB,KAAvB,EAA8B,UAAU,WAAV,EAAuB;AACnD,cAAY,OAAZ,GAAyB,IAAzB,CADmD,CACnB;AAChC,cAAY,OAAZ,GAAyB,CAAzB,CAFmD,CAEnB;AAChC,cAAY,UAAZ,GAAyB,EAAzB,CAHmD,CAGnB;AACjC,CAJD;;AAMA,SAAS,aAAT,GAAyB,cAAc,QAAvC;AACA,OAAO,OAAP,GAAiB,aAAjB;;;;;ACxOA,IAAM,gBAAgB,QAAQ,QAAR,CAAtB;AACA,IAAM,cAAgB,QAAQ,gBAAR,CAAtB;;AAEA,cAAc,OAAd,CAAsB,EAAtB,CAAyB,KAAzB,EAAgC,KAAhC;AACA,cAAc,OAAd,CAAsB,EAAtB,CAAyB,OAAzB,EAAkC,OAAlC;;WAEqB,CAAC,MAAD,EAAS,IAAT,EAAe,QAAf,EAAyB,QAAzB,C;AAArB,yCAAyD;AAApD,MAAM,iBAAN;AACH,cAAY,OAAZ,CAAoB,EAApB,CAAuB,MAAvB,EAA+B,aAA/B;AACD;;AAED,SAAS,KAAT,OAAkC;AAAA,MAAhB,YAAgB,QAAhB,YAAgB;;AAChC,MAAI,aAAa,IAAb,KAAsB,MAA1B,EAAkC;AAAE;AAAS;;AAE7C,eAAa,KAAb,GAAqB,CAAC,aAAa,KAAb,IAAsB,CAAvB,IAA4B,CAAjD;AACD;;AAED,SAAS,OAAT,QAAuE;AAAA,MAAnD,WAAmD,SAAnD,WAAmD;AAAA,MAAtC,YAAsC,SAAtC,YAAsC;AAAA,MAAxB,WAAwB,SAAxB,WAAwB;AAAA,MAAX,OAAW,SAAX,OAAW;;AACrE,MAAI,aAAa,IAAb,KAAsB,MAAtB,IAAgC,CAAC,QAAQ,MAA7C,EAAqD;AAAE;AAAS;;AAEhE;AACA,MAAM,WAAW,QAAQ,CAAR,EAAW,SAAX,CAAqB,OAArB,CAA6B,kBAA9C;;AAEA;AACA,MAAI,YAAY,CAAhB,EAAmB;AAAE;AAAS;;AAE9B;AACA,cAAY,kBAAZ,GAAiC,WAAW,YAAY;AACtD,kBAAc,IAAd,CAAmB;AACjB,8BADiB;AAEjB,8BAFiB;AAGjB,YAAM,MAHW;AAIjB,eAAS,YAJQ;AAKjB,aAAO;AALU,KAAnB;AAOD,GARgC,EAQ9B,QAR8B,CAAjC;AASD;;AAED,SAAS,aAAT,QAAyC;AAAA,MAAf,WAAe,SAAf,WAAe;;AACvC;AACA;AACA,MAAI,YAAY,kBAAhB,EAAoC;AAClC,kBAAc,YAAY,kBAA1B;AACA,gBAAY,kBAAZ,GAAiC,IAAjC;AACD;AACF;;AAED;AACA,cAAc,QAAd,CAAuB,kBAAvB,GAA4C,CAA5C;AACA,cAAc,KAAd,CAAoB,IAApB,CAAyB,YAAzB;;AAEA,OAAO,OAAP,GAAiB;AACf,cADe;AAEf,kBAFe;AAGf;AAHe,CAAjB;;;;;AClDA,IAAM,gBAAgB,QAAQ,QAAR,CAAtB;AACA,IAAM,eAAgB,QAAQ,iBAAR,CAAtB;AACA,IAAM,UAAgB,QAAQ,kBAAR,CAAtB;AACA,IAAM,KAAgB,QAAQ,aAAR,CAAtB;AACA,IAAM,WAAgB,QAAQ,mBAAR,CAAtB;AACA,IAAM,QAAgB,QAAQ,UAAR,CAAtB;AACA,IAAM,SAAgB,QAAQ,iBAAR,CAAtB;;eACsB,QAAQ,cAAR,C;IAAd,K,YAAA,K;;AAER,cAAc,OAAd,CAAsB,EAAtB,CAAyB,iBAAzB,EAA4C,gBAAmD;AAAA,MAAvC,OAAuC,QAAvC,OAAuC;AAAA,MAA9B,OAA8B,QAA9B,OAA8B;AAAA,MAArB,IAAqB,QAArB,IAAqB;AAAA,MAAf,WAAe,QAAf,WAAe;;AAC7F,WAAS,gBAAT,CAA2B,YAA3B,EAAyC,QAAzC,EAAmD,OAAnD,EAA4D;AAC1D,QAAM,MAAM,QAAQ,0BAAR,GACN,QAAQ,gBAAR,CAAyB,QAAzB,CADM,GAEN,SAFN;;AAIA,QAAM,YAAY,aAAa,MAA/B;AACA,QAAM,UAAU,UAAU,OAA1B;;AAEA,QAAI,UAAU,IAAV,KACG,GAAG,OAAH,CAAW,OAAX,CADH,IAEG,SAAS,eAAT,CAAyB,OAAzB,EAAkC,QAAlC,EAA4C,GAA5C,CAFH,IAGG,aAAa,eAAb,CAA6B,OAA7B,EAAsC,OAAtC,EAA+C,WAA/C,CAHP,EAGoE;;AAElE,cAAQ,IAAR,CAAa;AACX,wBADW;AAEX,4BAFW;AAGX,eAAO,EAAE,0BAAF;AAHI,OAAb;AAKD;AACF;;AAED,MAAM,eAAe,MAAM,aAAN,CAAoB,GAApB,CAAwB,OAAxB,CAArB;;AAEA,MAAI,YAAJ,EAAkB;AAChB,QAAM,YAAY,aAAa,MAA/B;AACA,QAAM,UAAU,UAAU,OAA1B;;AAEA,QAAI,UAAU,IAAV,KACG,aAAa,eAAb,CAA6B,OAA7B,EAAsC,OAAtC,EAA+C,WAA/C,CADP,EACoE;AAClE,cAAQ,IAAR,CAAa;AACX,wBADW;AAEX,4BAFW;AAGX,eAAO,EAAE,0BAAF;AAHI,OAAb;AAKD;AACF;;AAED,QAAM,aAAN,CAAoB,eAApB,CAAoC,gBAApC,EAAsD,OAAtD;AACD,CAvCD;;AAyCA,aAAa,OAAb,CAAqB,EAArB,CAAwB,KAAxB,EAA+B,iBAA4B;AAAA,MAAhB,YAAgB,SAAhB,YAAgB;;AACzD,eAAa,MAAb,CAAoB,OAApB,GAA8B,UAAU,OAAV,EAAmB;AAC/C,WAAO,aAAa,OAAb,CAAqB,OAArB,CAAP;AACD,GAFD;AAGD,CAJD;;AAMA,aAAa,OAAb,CAAqB,EAArB,CAAwB,KAAxB,EAA+B,iBAAqC;AAAA,MAAzB,YAAyB,SAAzB,YAAyB;AAAA,MAAX,OAAW,SAAX,OAAW;;AAClE,SAAO,aAAa,MAAb,CAAoB,OAA3B,EAAoC,cAAc,QAAlD;AACA,SAAO,aAAa,MAAb,CAAoB,OAA3B,EAAoC,OAApC;AACD,CAHD;;AAKA,MAAM,aAAa,UAAnB,EAA+B,cAAc,KAA7C;;AAEA,aAAa,SAAb,CAAuB,aAAvB,GAAuC,UAAU,OAAV,EAAmB;AACxD,SAAO,KAAK,MAAL,CAAY,OAAnB,EAA4B,OAA5B;;AAEA,SAAO,IAAP;AACD,CAJD;;AAMA,IAAM,qBAAqB,aAAa,SAAb,CAAuB,iBAAlD;;AAEA,aAAa,SAAb,CAAuB,iBAAvB,GAA2C,UAAU,UAAV,EAAsB,QAAtB,EAAgC;AACzE,MAAM,MAAM,mBAAmB,IAAnB,CAAwB,IAAxB,EAA8B,UAA9B,EAA0C,QAA1C,CAAZ;;AAEA,MAAI,QAAQ,IAAZ,EAAkB;AAChB,SAAK,MAAL,CAAY,OAAZ,CAAoB,UAApB,IAAkC,QAAlC;AACD;;AAED,SAAO,GAAP;AACD,CARD;;AAUA,aAAa,eAAb,CAA6B,IAA7B,CAAkC,eAAlC;;;;;ACjFA,IAAM,QAAU,QAAQ,SAAR,CAAhB;AACA,IAAM,SAAU,QAAQ,gBAAR,CAAhB;AACA,IAAM,UAAU,QAAQ,iBAAR,EAA2B,GAA3B,EAAhB;;AAEA,IAAM,QAAQ;AACZ,kBADY;AAEZ,gBAFY;AAGZ,cAHY;;AAKZ;AACA,YAAU,QAAQ,oBAAR,EAA8B,QAN5B;AAOZ;AACA,aAAW,EARC;;AAUZ,eAAa,qBAAU,GAAV,EAAe,GAAf,EAAoB;AAC/B;AACA,QAAI,MAAM,QAAN,CAAe,MAAM,SAArB,EAAgC,GAAhC,CAAJ,EAA0C;AAAE,aAAO,KAAP;AAAe;;AAE3D,UAAM,OAAO,MAAM,SAAN,CAAgB,GAAhB,CAAb;;AAEA,UAAM,SAAN,CAAgB,IAAhB,CAAqB,GAArB;AACA,WAAO,SAAP,CAAiB,IAAjB,CAAsB,GAAtB;;AAEA;AACA;AACA,QAAI,QAAQ,MAAM,QAAlB,EAA4B;AAC1B,aAAO,GAAP,CAAW,GAAX,EAAgB,QAAhB,EAA0B,MAAM,cAAhC;AACD;;AAED,YAAQ,IAAR,CAAa,cAAb,EAA6B,EAAE,QAAF,EAAO,QAAP,EAA7B;AACD,GA1BW;;AA4BZ,kBAAgB,wBAAU,GAAV,EAAe,GAAf,EAAoB;AAClC,QAAM,QAAQ,MAAM,OAAN,CAAc,MAAM,SAApB,EAA+B,GAA/B,CAAd;;AAEA,UAAM,OAAO,MAAM,SAAN,CAAgB,GAAhB,CAAb;;AAEA,WAAO,MAAP,CAAc,GAAd,EAAmB,QAAnB,EAA6B,MAAM,cAAnC;;AAEA,UAAM,SAAN,CAAgB,MAAhB,CAAuB,KAAvB,EAA8B,CAA9B;AACA,WAAO,SAAP,CAAiB,MAAjB,CAAwB,KAAxB,EAA+B,CAA/B;;AAEA,YAAQ,IAAR,CAAa,iBAAb,EAAgC,EAAE,QAAF,EAAO,QAAP,EAAhC;AACD,GAvCW;;AAyCZ,kBAAgB,0BAAY;AAC1B,UAAM,cAAN,CAAqB,KAAK,QAA1B,EAAoC,IAApC;AACD;AA3CW,CAAd;;AA8CA,OAAO,OAAP,GAAiB,KAAjB;;;;;;;eClDoB,QAAQ,OAAR,C;IAAZ,O,YAAA,O;;IAEF,O;AACJ,qBAAe;AAAA;;AACb,SAAK,SAAL,GAAiB;AACf;AADe,KAAjB;AAGD;;oBAED,E,eAAI,I,EAAM,Q,EAAU;AAClB,QAAI,CAAC,KAAK,SAAL,CAAe,IAAf,CAAL,EAA2B;AACzB,WAAK,SAAL,CAAe,IAAf,IAAuB,CAAC,QAAD,CAAvB;AACA;AACD;;AAED,SAAK,SAAL,CAAe,IAAf,EAAqB,IAArB,CAA0B,QAA1B;AACD,G;;oBAED,G,gBAAK,I,EAAM,Q,EAAU;AACnB,QAAI,CAAC,KAAK,SAAL,CAAe,IAAf,CAAL,EAA2B;AAAE;AAAS;;AAEtC,QAAM,QAAQ,QAAQ,KAAK,SAAL,CAAe,IAAf,CAAR,EAA8B,QAA9B,CAAd;;AAEA,QAAI,UAAU,CAAC,CAAf,EAAkB;AAChB,WAAK,SAAL,CAAe,IAAf,EAAqB,MAArB,CAA4B,KAA5B,EAAmC,CAAnC;AACD;AACF,G;;oBAED,I,iBAAM,I,EAAM,G,EAAK;AACf,QAAM,kBAAkB,KAAK,SAAL,CAAe,IAAf,CAAxB;;AAEA,QAAI,CAAC,eAAL,EAAsB;AAAE;AAAS;;AAEjC,SAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,gBAAgB,MAApC,EAA4C,GAA5C,EAAiD;AAC/C,UAAI,gBAAgB,CAAhB,EAAmB,GAAnB,EAAwB,IAAxB,MAAkC,KAAtC,EAA6C;AAC3C;AACD;AACF;AACF,G;;;;;AAGH,QAAQ,GAAR,GAAc,YAAY;AACxB,SAAO,IAAI,OAAJ,EAAP;AACD,CAFD;;AAIA,OAAO,OAAP,GAAiB,OAAjB;;;;;AC7CA,SAAS,OAAT,CAAkB,KAAlB,EAAyB,MAAzB,EAAiC;AAC/B,OAAK,IAAI,IAAI,CAAR,EAAW,MAAM,MAAM,MAA5B,EAAoC,IAAI,GAAxC,EAA6C,GAA7C,EAAkD;AAChD,QAAI,MAAM,CAAN,MAAa,MAAjB,EAAyB;AACvB,aAAO,CAAP;AACD;AACF;;AAED,SAAO,CAAC,CAAR;AACD;;AAED,SAAS,QAAT,CAAmB,KAAnB,EAA0B,MAA1B,EAAkC;AAChC,SAAO,QAAQ,KAAR,EAAe,MAAf,MAA2B,CAAC,CAAnC;AACD;;AAED,SAAS,KAAT,CAAgB,MAAhB,EAAwB,MAAxB,EAAgC;AAC9B,OAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,OAAO,MAA3B,EAAmC,GAAnC,EAAwC;AACtC,WAAO,IAAP,CAAY,OAAO,CAAP,CAAZ;AACD;;AAED,SAAO,MAAP;AACD;;AAED,SAAS,MAAT,CAAiB,KAAjB,EAAwB,IAAxB,EAA8B;AAC5B,MAAM,SAAS,EAAf;;AAEA,OAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,MAAM,MAA1B,EAAkC,GAAlC,EAAuC;AACrC,QAAI,KAAK,MAAM,CAAN,CAAL,CAAJ,EAAoB;AAClB,aAAO,IAAP,CAAY,MAAM,CAAN,CAAZ;AACD;AACF;;AAED,SAAO,MAAP;AACD;;AAED,OAAO,OAAP,GAAiB;AACf,kBADe;AAEf,oBAFe;AAGf,cAHe;AAIf;AAJe,CAAjB;;;;;eClCmB,QAAQ,UAAR,C;IAAX,M,YAAA,M;;AACR,IAAM,KAAS,QAAQ,MAAR,CAAf;AACA,IAAM,aAAa,QAAQ,cAAR,CAAnB;;AAEA,IAAM,UAAU,WAAW,OAA3B;AACA,IAAM,YAAa,OAAO,SAA1B;;AAEA,IAAM,UAAU;AACd;AACA,iBAAe,CAAC,EAAG,kBAAkB,MAAnB,IAA8B,GAAG,QAAH,CAAY,OAAO,aAAnB,KAC1B,WAAW,QAAX,YAA+B,OAAO,aAD5C,CAFF;;AAKd;AACA,wBAAsB,CAAC,CAAC,WAAW,YANrB;;AAQd,SAAQ,iBAAiB,MAAlB,IAA6B,EAAE,sBAAsB,MAAxB,CARtB;;AAUd;AACA,iBAAgB,UAAU,OAAV,KAAsB,OAAtB,IACT,QAAQ,aADC,IAET,UAAU,SAAV,CAAoB,KAApB,CAA0B,QAA1B,CAbO;;AAed;AACA,UAAS,iBAAiB,IAAjB,CAAsB,UAAU,QAAhC,KACG,YAAY,IAAZ,CAAiB,UAAU,UAA3B,CAjBE;;AAmBd,gBAAc,aAAa,IAAb,CAAkB,UAAU,SAA5B,CAnBA;;AAqBd;AACA,2BAAyB,aAAa,QAAQ,SAArB,GACrB,SADqB,GACV,2BAA2B,QAAQ,SAAnC,GACX,uBADW,GACc,wBAAwB,QAAQ,SAAhC,GACzB,oBADyB,GACH,sBAAsB,QAAQ,SAA9B,GACtB,kBADsB,GACF,mBA1BV;;AA4Bd,8BAA4B,KA5Bd;;AA8Bd,eAAc,WAAW,YAAX,GACT,WAAW,YAAX,KAA4B,OAAO,cAAnC,GACC;AACA,QAAQ,aADR;AAEA,UAAQ,eAFR;AAGA,UAAQ,WAHR;AAIA,SAAQ,UAJR;AAKA,UAAQ,eALR;AAMA,YAAQ;AANR,GADD,GASC;AACA,QAAQ,WADR;AAEA,UAAQ,aAFR;AAGA,UAAQ,aAHR;AAIA,SAAQ,YAJR;AAKA,UAAQ,aALR;AAMA,YAAQ;AANR,GAVQ,GAkBV,IAhDU;;AAkDd;AACA,cAAY,kBAAkB,WAAW,QAA7B,GAAuC,YAAvC,GAAqD;;AAnDnD,CAAhB;;AAuDA,QAAQ,0BAAR,GAAqC,CAAC,GAAG,QAAH,CAAY,QAAQ,SAAR,CAAkB,QAAQ,uBAA1B,CAAZ,CAAtC;;AAEA,OAAO,OAAP,GAAiB,OAAjB;;;;;AChEA,IAAM,aAAa,EAAnB;AACA,IAAM,MAAM,QAAQ,UAAR,EAAoB,MAAhC;;AAEA,SAAS,KAAT,GAAkB,CAAE;;AAEpB,WAAW,QAAX,GAAgC,IAAI,QAApC;AACA,WAAW,gBAAX,GAAgC,IAAI,gBAAJ,IAA0B,KAA1D;AACA,WAAW,UAAX,GAAgC,IAAI,UAAJ,IAA0B,KAA1D;AACA,WAAW,aAAX,GAAgC,IAAI,aAAJ,IAA0B,KAA1D;AACA,WAAW,kBAAX,GAAgC,IAAI,kBAAJ,IAA0B,KAA1D;AACA,WAAW,OAAX,GAAgC,IAAI,OAAJ,IAA0B,KAA1D;AACA,WAAW,WAAX,GAAgC,IAAI,WAAJ,IAA0B,WAAW,OAArE;;AAEA,WAAW,KAAX,GAA0B,IAAI,KAA9B;AACA,WAAW,KAAX,GAA0B,IAAI,KAAJ,IAAa,KAAvC;AACA,WAAW,YAAX,GAA2B,IAAI,YAAJ,IAAoB,IAAI,cAAnD;;AAEA,OAAO,OAAP,GAAiB,UAAjB;;;;;ACjBA,IAAM,MAAa,QAAQ,UAAR,CAAnB;AACA,IAAM,UAAa,QAAQ,WAAR,CAAnB;AACA,IAAM,KAAa,QAAQ,MAAR,CAAnB;AACA,IAAM,aAAa,QAAQ,cAAR,CAAnB;;AAEA,IAAM,WAAW;AACf,gBAAc,sBAAU,MAAV,EAAkB,KAAlB,EAAyB;AACrC,WAAO,KAAP,EAAc;AACZ,UAAI,UAAU,MAAd,EAAsB;AACpB,eAAO,IAAP;AACD;;AAED,cAAQ,MAAM,UAAd;AACD;;AAED,WAAO,KAAP;AACD,GAXc;;AAaf,WAAS,iBAAU,OAAV,EAAmB,QAAnB,EAA6B;AACpC,WAAO,GAAG,OAAH,CAAW,OAAX,CAAP,EAA4B;AAC1B,UAAI,SAAS,eAAT,CAAyB,OAAzB,EAAkC,QAAlC,CAAJ,EAAiD;AAAE,eAAO,OAAP;AAAiB;;AAEpE,gBAAU,SAAS,UAAT,CAAoB,OAApB,CAAV;AACD;;AAED,WAAO,IAAP;AACD,GArBc;;AAuBf,cAAY,oBAAU,IAAV,EAAgB;AAC1B,QAAI,SAAS,KAAK,UAAlB;;AAEA,QAAI,GAAG,OAAH,CAAW,MAAX,CAAJ,EAAwB;AACtB;AACA,aAAO,CAAC,SAAS,OAAO,IAAjB,KAA0B,GAAG,OAAH,CAAW,MAAX,CAAjC,EAAqD;AACnD;AACD;;AAED,aAAO,MAAP;AACD;;AAED,WAAO,MAAP;AACD,GApCc;;AAsCf;AACA,2BAAyB,QAAQ,0BAAR,GACrB,UAAU,OAAV,EAAmB,QAAnB,EAA6B,KAA7B,EAAoC;AACpC,YAAQ,SAAS,QAAQ,UAAR,CAAmB,gBAAnB,CAAoC,QAApC,CAAjB;;AAEA,SAAK,IAAI,IAAI,CAAR,EAAW,MAAM,MAAM,MAA5B,EAAoC,IAAI,GAAxC,EAA6C,GAA7C,EAAkD;AAChD,UAAI,MAAM,CAAN,MAAa,OAAjB,EAA0B;AACxB,eAAO,IAAP;AACD;AACF;;AAED,WAAO,KAAP;AACD,GAXsB,GAYrB,IAnDW;;AAqDf,mBAAiB,yBAAU,OAAV,EAAmB,QAAnB,EAA6B,QAA7B,EAAuC;AACtD,QAAI,QAAQ,0BAAZ,EAAwC;AACtC,aAAO,SAAS,uBAAT,CAAiC,OAAjC,EAA0C,QAA1C,EAAoD,QAApD,CAAP;AACD;;AAED;AACA,QAAI,IAAI,MAAJ,KAAe,IAAI,UAAvB,EAAmC;AACjC,iBAAW,SAAS,OAAT,CAAiB,WAAjB,EAA8B,GAA9B,CAAX;AACD;;AAED,WAAO,QAAQ,QAAQ,uBAAhB,EAAyC,QAAzC,CAAP;AACD,GAhEc;;AAkEf;AACA,yBAAuB,+BAAU,QAAV,EAAoB;AACzC,QAAI,qBAAqB,EAAzB;AACA,QAAI,kBAAkB,EAAtB;AACA,QAAI,iBAAJ;AACA,QAAI,cAAc,SAAS,CAAT,CAAlB;AACA,QAAI,QAAQ,cAAa,CAAb,GAAgB,CAAC,CAA7B;AACA,QAAI,eAAJ;AACA,QAAI,cAAJ;AACA,QAAI,UAAJ;AACA,QAAI,UAAJ;;AAEA,SAAK,IAAI,CAAT,EAAY,IAAI,SAAS,MAAzB,EAAiC,GAAjC,EAAsC;AACpC,iBAAW,SAAS,CAAT,CAAX;;AAEA;AACA,UAAI,CAAC,QAAD,IAAa,aAAa,WAA9B,EAA2C;AACzC;AACD;;AAED,UAAI,CAAC,WAAL,EAAkB;AAChB,sBAAc,QAAd;AACA,gBAAQ,CAAR;AACA;AACD;;AAED;AACA;AACA,UAAI,SAAS,UAAT,KAAwB,SAAS,aAArC,EAAoD;AAClD;AACD;AACD;AAHA,WAIK,IAAI,YAAY,UAAZ,KAA2B,SAAS,aAAxC,EAAuD;AAC1D,wBAAc,QAAd;AACA,kBAAQ,CAAR;AACA;AACD;;AAED,UAAI,CAAC,mBAAmB,MAAxB,EAAgC;AAC9B,iBAAS,WAAT;AACA,eAAO,OAAO,UAAP,IAAqB,OAAO,UAAP,KAAsB,OAAO,aAAzD,EAAwE;AACtE,6BAAmB,OAAnB,CAA2B,MAA3B;AACA,mBAAS,OAAO,UAAhB;AACD;AACF;;AAED;AACA;AACA,UAAI,uBAAuB,WAAW,WAAlC,IACG,oBAAoB,WAAW,UADlC,IAEG,EAAE,oBAAoB,WAAW,aAAjC,CAFP,EAEwD;;AAEtD,YAAI,aAAa,YAAY,UAA7B,EAAyC;AACvC;AACD;;AAED,iBAAS,SAAS,eAAlB;AACD,OATD,MAUK;AACH,iBAAS,QAAT;AACD;;AAED,wBAAkB,EAAlB;;AAEA,aAAO,OAAO,UAAP,KAAsB,OAAO,aAApC,EAAmD;AACjD,wBAAgB,OAAhB,CAAwB,MAAxB;AACA,iBAAS,OAAO,UAAhB;AACD;;AAED,UAAI,CAAJ;;AAEA;AACA,aAAO,gBAAgB,CAAhB,KAAsB,gBAAgB,CAAhB,MAAuB,mBAAmB,CAAnB,CAApD,EAA2E;AACzE;AACD;;AAED,UAAM,UAAU,CACd,gBAAgB,IAAI,CAApB,CADc,EAEd,gBAAgB,CAAhB,CAFc,EAGd,mBAAmB,CAAnB,CAHc,CAAhB;;AAMA,cAAQ,QAAQ,CAAR,EAAW,SAAnB;;AAEA,aAAO,KAAP,EAAc;AACZ,YAAI,UAAU,QAAQ,CAAR,CAAd,EAA0B;AACxB,wBAAc,QAAd;AACA,kBAAQ,CAAR;AACA,+BAAqB,EAArB;;AAEA;AACD,SAND,MAOK,IAAI,UAAU,QAAQ,CAAR,CAAd,EAA0B;AAC7B;AACD;;AAED,gBAAQ,MAAM,eAAd;AACD;AACF;;AAED,WAAO,KAAP;AACD,GAvKc;;AAyKf,eAAa,qBAAU,OAAV,EAAmB,QAAnB,EAA6B,KAA7B,EAAoC;AAC/C,WAAO,GAAG,OAAH,CAAW,OAAX,CAAP,EAA4B;AAC1B,UAAI,SAAS,eAAT,CAAyB,OAAzB,EAAkC,QAAlC,CAAJ,EAAiD;AAC/C,eAAO,IAAP;AACD;;AAED,gBAAU,SAAS,UAAT,CAAoB,OAApB,CAAV;;AAEA,UAAI,YAAY,KAAhB,EAAuB;AACrB,eAAO,SAAS,eAAT,CAAyB,OAAzB,EAAkC,QAAlC,CAAP;AACD;AACF;;AAED,WAAO,KAAP;AACD,GAvLc;;AAyLf,oBAAkB,0BAAU,OAAV,EAAmB;AACnC,WAAQ,mBAAmB,WAAW,kBAA9B,GACJ,QAAQ,uBADJ,GAEJ,OAFJ;AAGD,GA7Lc;;AA+Lf,eAAa,qBAAU,cAAV,EAA0B;AACrC,qBAAiB,kBAAkB,IAAI,MAAvC;AACA,WAAO;AACL,SAAG,eAAe,OAAf,IAA0B,eAAe,QAAf,CAAwB,eAAxB,CAAwC,UADhE;AAEL,SAAG,eAAe,OAAf,IAA0B,eAAe,QAAf,CAAwB,eAAxB,CAAwC;AAFhE,KAAP;AAID,GArMc;;AAuMf,wBAAsB,8BAAU,OAAV,EAAmB;AACvC,QAAM,aAAc,mBAAmB,WAAW,UAA9B,GAChB,QAAQ,qBAAR,EADgB,GAEhB,QAAQ,cAAR,GAAyB,CAAzB,CAFJ;;AAIA,WAAO,cAAc;AACnB,YAAQ,WAAW,IADA;AAEnB,aAAQ,WAAW,KAFA;AAGnB,WAAQ,WAAW,GAHA;AAInB,cAAQ,WAAW,MAJA;AAKnB,aAAQ,WAAW,KAAX,IAAqB,WAAW,KAAX,GAAoB,WAAW,IALzC;AAMnB,cAAQ,WAAW,MAAX,IAAqB,WAAW,MAAX,GAAoB,WAAW;AANzC,KAArB;AAQD,GApNc;;AAsNf,kBAAgB,wBAAU,OAAV,EAAmB;AACjC,QAAM,aAAa,SAAS,oBAAT,CAA8B,OAA9B,CAAnB;;AAEA,QAAI,CAAC,QAAQ,MAAT,IAAmB,UAAvB,EAAmC;AACjC,UAAM,SAAS,SAAS,WAAT,CAAqB,IAAI,SAAJ,CAAc,OAAd,CAArB,CAAf;;AAEA,iBAAW,IAAX,IAAqB,OAAO,CAA5B;AACA,iBAAW,KAAX,IAAqB,OAAO,CAA5B;AACA,iBAAW,GAAX,IAAqB,OAAO,CAA5B;AACA,iBAAW,MAAX,IAAqB,OAAO,CAA5B;AACD;;AAED,WAAO,UAAP;AACD,GAnOc;;AAqOf,WAAS,iBAAU,OAAV,EAAmB;AAC1B,QAAM,OAAO,EAAb;;AAEA,WAAO,OAAP,EAAgB;AACd,WAAK,IAAL,CAAU,OAAV;AACA,gBAAU,SAAS,UAAT,CAAoB,OAApB,CAAV;AACD;;AAED,WAAO,IAAP;AACD,GA9Oc;;AAgPf,eAAa,4BAAS;AACpB,QAAI,CAAC,GAAG,MAAH,CAAU,KAAV,CAAL,EAAuB;AAAE,aAAO,KAAP;AAAe;;AAExC;AACA,eAAW,QAAX,CAAoB,aAApB,CAAkC,KAAlC;AACA,WAAO,IAAP;AACD;AAtPc,CAAjB;;AAyPA,OAAO,OAAP,GAAiB,QAAjB;;;;;AC9PA,IAAM,KAAO,QAAQ,MAAR,CAAb;AACA,IAAM,WAAW,QAAQ,YAAR,CAAjB;AACA,IAAM,UAAW,QAAQ,iBAAR,CAAjB;;eAE+B,QAAQ,UAAR,C;IAAvB,M,YAAA,M;IAAQ,S,YAAA,S;;gBACc,QAAQ,OAAR,C;IAAtB,O,aAAA,O;IAAS,Q,aAAA,Q;;AAEjB,IAAM,iBAAkB,iBAAiB,MAAlB,IAA6B,EAAE,sBAAsB,MAAxB,CAApD;AACA,IAAM,WAAiB,iBAAiB,aAAjB,GAAgC,kBAAvD;AACA,IAAM,cAAiB,iBAAiB,aAAjB,GAAgC,qBAAvD;AACA,IAAM,KAAiB,iBAAgB,IAAhB,GAAsB,EAA7C;;AAEA,IAAM,WAAoB,EAA1B;AACA,IAAM,UAAoB,EAA1B;AACA,IAAM,oBAAoB,EAA1B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAM,kBAAkB,EAAxB;;AAEA,IAAM,YAAY,EAAlB;;AAEA,IAAM,kBAAkB,CAAC,cAAD,IAAoB,YAAM;AAChD,MAAI,YAAY,KAAhB;;AAEA,SAAO,QAAP,CAAgB,aAAhB,CAA8B,KAA9B,EAAqC,gBAArC,CAAsD,MAAtD,EAA8D,IAA9D,EAAoE;AAClE,QAAI,OAAJ,GAAe;AAAE,kBAAY,IAAZ;AAAmB;AAD8B,GAApE;;AAIA,SAAO,SAAP;AACD,CAR0C,EAA3C;;AAUA,SAAS,GAAT,CAAc,OAAd,EAAuB,IAAvB,EAA6B,QAA7B,EAAuC,WAAvC,EAAoD;AAClD,MAAM,UAAU,WAAW,WAAX,CAAhB;AACA,MAAI,eAAe,QAAQ,QAAR,EAAkB,OAAlB,CAAnB;AACA,MAAI,SAAS,QAAQ,YAAR,CAAb;;AAEA,MAAI,CAAC,MAAL,EAAa;AACX,aAAS;AACP,cAAQ,EADD;AAEP,iBAAW;AAFJ,KAAT;;AAKA,mBAAe,SAAS,IAAT,CAAc,OAAd,IAAyB,CAAxC;AACA,YAAQ,IAAR,CAAa,MAAb;;AAEA,sBAAkB,IAAlB,CAAuB,iBACnB;AACA,gBAAU,EADV;AAEA,eAAU,EAFV;AAGA,gBAAU;AAHV,KADmB,GAMnB,IANJ;AAOD;;AAED,MAAI,CAAC,OAAO,MAAP,CAAc,IAAd,CAAL,EAA0B;AACxB,WAAO,MAAP,CAAc,IAAd,IAAsB,EAAtB;AACA,WAAO,SAAP;AACD;;AAED,MAAI,CAAC,SAAS,OAAO,MAAP,CAAc,IAAd,CAAT,EAA8B,QAA9B,CAAL,EAA8C;AAC5C,QAAI,YAAJ;;AAEA,QAAI,cAAJ,EAAoB;AAAA,kCACsB,kBAAkB,YAAlB,CADtB;AAAA,UACV,QADU,yBACV,QADU;AAAA,UACA,OADA,yBACA,OADA;AAAA,UACS,QADT,yBACS,QADT;;AAElB,UAAM,gBAAgB,QAAQ,QAAR,EAAkB,QAAlB,CAAtB;;AAEA,UAAM,kBAAkB,QAAQ,aAAR,KAA0B,UAAU,KAAV,EAAiB;AACjE,YAAI,CAAC,MAAM,2BAAX,EAAwC;AACtC,gBAAM,MAAN,GAAe,MAAM,UAArB;AACA,gBAAM,aAAN,GAAsB,OAAtB;;AAEA,gBAAM,cAAN,GAAiC,MAAM,cAAN,IAAkC,UAAnE;AACA,gBAAM,eAAN,GAAiC,MAAM,eAAN,IAAkC,QAAnE;AACA,gBAAM,wBAAN,GAAiC,MAAM,wBAAN,IAAkC,WAAnE;;AAEA,cAAI,cAAc,IAAd,CAAmB,MAAM,IAAzB,CAAJ,EAAoC;AAClC,kBAAM,KAAN,GAAc,MAAM,OAAN,GAAgB,UAAU,OAAV,EAAmB,QAAnB,CAA4B,eAA5B,CAA4C,UAA1E;AACA,kBAAM,KAAN,GAAc,MAAM,OAAN,GAAgB,UAAU,OAAV,EAAmB,QAAnB,CAA4B,eAA5B,CAA4C,SAA1E;AACD;;AAED,mBAAS,KAAT;AACD;AACF,OAhBD;;AAkBA,YAAM,QAAQ,QAAR,EAAkB,KAAK,IAAvB,EAA6B,eAA7B,EAA8C,CAAC,CAAC,QAAQ,OAAxD,CAAN;;AAEA,UAAI,kBAAkB,CAAC,CAAvB,EAA0B;AACxB,iBAAS,IAAT,CAAc,QAAd;AACA,gBAAQ,IAAR,CAAa,eAAb;AACA,iBAAS,IAAT,CAAc,CAAd;AACD,OAJD,MAKK;AACH,iBAAS,aAAT;AACD;AACF,KAhCD,MAiCK;AACH,YAAM,QAAQ,QAAR,EAAkB,IAAlB,EAAwB,QAAxB,EAAkC,kBAAiB,OAAjB,GAA2B,CAAC,CAAC,QAAQ,OAAvE,CAAN;AACD;AACD,WAAO,MAAP,CAAc,IAAd,EAAoB,IAApB,CAAyB,QAAzB;;AAEA,WAAO,GAAP;AACD;AACF;;AAED,SAAS,MAAT,CAAiB,OAAjB,EAA0B,IAA1B,EAAgC,QAAhC,EAA0C,WAA1C,EAAuD;AACrD,MAAM,UAAU,WAAW,WAAX,CAAhB;AACA,MAAM,eAAe,QAAQ,QAAR,EAAkB,OAAlB,CAArB;AACA,MAAM,SAAS,QAAQ,YAAR,CAAf;;AAEA,MAAI,CAAC,MAAD,IAAW,CAAC,OAAO,MAAvB,EAA+B;AAC7B;AACD;;AAED,MAAI,kBAAkB,QAAtB;AACA,MAAI,kBAAJ;AACA,MAAI,sBAAJ;;AAEA,MAAI,cAAJ,EAAoB;AAClB,gBAAY,kBAAkB,YAAlB,CAAZ;AACA,oBAAgB,QAAQ,UAAU,QAAlB,EAA4B,QAA5B,CAAhB;AACA,sBAAkB,UAAU,OAAV,CAAkB,aAAlB,CAAlB;AACD;;AAED,MAAI,SAAS,KAAb,EAAoB;AAClB,SAAK,IAAL,IAAa,OAAO,MAApB,EAA4B;AAC1B,UAAI,OAAO,MAAP,CAAc,cAAd,CAA6B,IAA7B,CAAJ,EAAwC;AACtC,eAAO,OAAP,EAAgB,IAAhB,EAAsB,KAAtB;AACD;AACF;AACD;AACD;;AAED,MAAI,OAAO,MAAP,CAAc,IAAd,CAAJ,EAAyB;AACvB,QAAM,MAAM,OAAO,MAAP,CAAc,IAAd,EAAoB,MAAhC;;AAEA,QAAI,aAAa,KAAjB,EAAwB;AACtB,WAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,GAApB,EAAyB,GAAzB,EAA8B;AAC5B,eAAO,OAAP,EAAgB,IAAhB,EAAsB,OAAO,MAAP,CAAc,IAAd,EAAoB,CAApB,CAAtB,EAA8C,OAA9C;AACD;AACD;AACD,KALD,MAMK;AACH,WAAK,IAAI,KAAI,CAAb,EAAgB,KAAI,GAApB,EAAyB,IAAzB,EAA8B;AAC5B,YAAI,OAAO,MAAP,CAAc,IAAd,EAAoB,EAApB,MAA2B,QAA/B,EAAyC;AACvC,kBAAQ,WAAR,EAAqB,KAAK,IAA1B,EAAgC,eAAhC,EAAiD,kBAAiB,OAAjB,GAA2B,CAAC,CAAC,QAAQ,OAAtF;AACA,iBAAO,MAAP,CAAc,IAAd,EAAoB,MAApB,CAA2B,EAA3B,EAA8B,CAA9B;;AAEA,cAAI,kBAAkB,SAAtB,EAAiC;AAC/B,sBAAU,QAAV,CAAmB,aAAnB;AACA,gBAAI,UAAU,QAAV,CAAmB,aAAnB,MAAsC,CAA1C,EAA6C;AAC3C,wBAAU,QAAV,CAAmB,MAAnB,CAA0B,aAA1B,EAAyC,CAAzC;AACA,wBAAU,OAAV,CAAkB,MAAlB,CAAyB,aAAzB,EAAwC,CAAxC;AACA,wBAAU,QAAV,CAAmB,MAAnB,CAA0B,aAA1B,EAAyC,CAAzC;AACD;AACF;;AAED;AACD;AACF;AACF;;AAED,QAAI,OAAO,MAAP,CAAc,IAAd,KAAuB,OAAO,MAAP,CAAc,IAAd,EAAoB,MAApB,KAA+B,CAA1D,EAA6D;AAC3D,aAAO,MAAP,CAAc,IAAd,IAAsB,IAAtB;AACA,aAAO,SAAP;AACD;AACF;;AAED,MAAI,CAAC,OAAO,SAAZ,EAAuB;AACrB,YAAQ,MAAR,CAAe,YAAf,EAA6B,CAA7B;AACA,aAAS,MAAT,CAAgB,YAAhB,EAA8B,CAA9B;AACA,sBAAkB,MAAlB,CAAyB,YAAzB,EAAuC,CAAvC;AACD;AACF;;AAED,SAAS,WAAT,CAAsB,QAAtB,EAAgC,OAAhC,EAAyC,IAAzC,EAA+C,QAA/C,EAAyD,WAAzD,EAAsE;AACpE,MAAM,UAAU,WAAW,WAAX,CAAhB;AACA,MAAI,CAAC,gBAAgB,IAAhB,CAAL,EAA4B;AAC1B,oBAAgB,IAAhB,IAAwB;AACtB,iBAAW,EADW;AAEtB,gBAAW,EAFW;AAGtB,iBAAW;AAHW,KAAxB;;AAMA;AACA,SAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,UAAU,MAA9B,EAAsC,GAAtC,EAA2C;AACzC,UAAI,UAAU,CAAV,CAAJ,EAAkB,IAAlB,EAAwB,gBAAxB;AACA,UAAI,UAAU,CAAV,CAAJ,EAAkB,IAAlB,EAAwB,kBAAxB,EAA4C,IAA5C;AACD;AACF;;AAED,MAAM,YAAY,gBAAgB,IAAhB,CAAlB;AACA,MAAI,cAAJ;;AAEA,OAAK,QAAQ,UAAU,SAAV,CAAoB,MAApB,GAA6B,CAA1C,EAA6C,SAAS,CAAtD,EAAyD,OAAzD,EAAkE;AAChE,QAAI,UAAU,SAAV,CAAoB,KAApB,MAA+B,QAA/B,IACG,UAAU,QAAV,CAAmB,KAAnB,MAA8B,OADrC,EAC8C;AAC5C;AACD;AACF;;AAED,MAAI,UAAU,CAAC,CAAf,EAAkB;AAChB,YAAQ,UAAU,SAAV,CAAoB,MAA5B;;AAEA,cAAU,SAAV,CAAoB,IAApB,CAAyB,QAAzB;AACA,cAAU,QAAV,CAAoB,IAApB,CAAyB,OAAzB;AACA,cAAU,SAAV,CAAoB,IAApB,CAAyB,EAAzB;AACD;;AAED;AACA,YAAU,SAAV,CAAoB,KAApB,EAA2B,IAA3B,CAAgC,CAAC,QAAD,EAAW,CAAC,CAAC,QAAQ,OAArB,EAA8B,QAAQ,OAAtC,CAAhC;AACD;;AAED,SAAS,cAAT,CAAyB,QAAzB,EAAmC,OAAnC,EAA4C,IAA5C,EAAkD,QAAlD,EAA4D,WAA5D,EAAyE;AACvE,MAAM,UAAU,WAAW,WAAX,CAAhB;AACA,MAAM,YAAY,gBAAgB,IAAhB,CAAlB;AACA,MAAI,aAAa,KAAjB;AACA,MAAI,cAAJ;;AAEA,MAAI,CAAC,SAAL,EAAgB;AAAE;AAAS;;AAE3B;AACA,OAAK,QAAQ,UAAU,SAAV,CAAoB,MAApB,GAA6B,CAA1C,EAA6C,SAAS,CAAtD,EAAyD,OAAzD,EAAkE;AAChE;AACA,QAAI,UAAU,SAAV,CAAoB,KAApB,MAA+B,QAA/B,IACG,UAAU,QAAV,CAAmB,KAAnB,MAA8B,OADrC,EAC8C;;AAE5C,UAAM,YAAY,UAAU,SAAV,CAAoB,KAApB,CAAlB;;AAEA;AACA,WAAK,IAAI,IAAI,UAAU,MAAV,GAAmB,CAAhC,EAAmC,KAAK,CAAxC,EAA2C,GAA3C,EAAgD;AAAA,2BACf,UAAU,CAAV,CADe;AAAA,YACvC,EADuC;AAAA,YACnC,OADmC;AAAA,YAC1B,OAD0B;;AAG9C;;AACA,YAAI,OAAO,QAAP,IAAmB,YAAY,CAAC,CAAC,QAAQ,OAAzC,IAAoD,YAAY,QAAQ,OAA5E,EAAqF;AACnF;AACA,oBAAU,MAAV,CAAiB,CAAjB,EAAoB,CAApB;;AAEA;AACA;AACA,cAAI,CAAC,UAAU,MAAf,EAAuB;AACrB,sBAAU,SAAV,CAAoB,MAApB,CAA2B,KAA3B,EAAkC,CAAlC;AACA,sBAAU,QAAV,CAAoB,MAApB,CAA2B,KAA3B,EAAkC,CAAlC;AACA,sBAAU,SAAV,CAAoB,MAApB,CAA2B,KAA3B,EAAkC,CAAlC;;AAEA;AACA,mBAAO,OAAP,EAAgB,IAAhB,EAAsB,gBAAtB;AACA,mBAAO,OAAP,EAAgB,IAAhB,EAAsB,kBAAtB,EAA0C,IAA1C;;AAEA;AACA,gBAAI,CAAC,UAAU,SAAV,CAAoB,MAAzB,EAAiC;AAC/B,8BAAgB,IAAhB,IAAwB,IAAxB;AACD;AACF;;AAED;AACA,uBAAa,IAAb;AACA;AACD;AACF;;AAED,UAAI,UAAJ,EAAgB;AAAE;AAAQ;AAC3B;AACF;AACF;;AAED;AACA;AACA,SAAS,gBAAT,CAA2B,KAA3B,EAAkC,WAAlC,EAA+C;AAC7C,MAAM,UAAU,WAAW,WAAX,CAAhB;AACA,MAAM,YAAY,EAAlB;AACA,MAAM,YAAY,gBAAgB,MAAM,IAAtB,CAAlB;AACA,MAAM,cAAe,SAAS,gBAAT,CAA0B,MAAM,IAAN,GAC3C,MAAM,IAAN,CAAW,CAAX,CAD2C,GAE3C,MAAM,MAFW,CAArB;AAGA,MAAI,UAAU,WAAd;;AAEA;AACA,UAAQ,SAAR,EAAmB,KAAnB;;AAEA,YAAU,aAAV,GAA0B,KAA1B;AACA,YAAU,cAAV,GAA2B,sBAA3B;;AAEA;AACA,SAAO,GAAG,OAAH,CAAW,OAAX,CAAP,EAA4B;AAC1B,SAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,UAAU,SAAV,CAAoB,MAAxC,EAAgD,GAAhD,EAAqD;AACnD,UAAM,WAAW,UAAU,SAAV,CAAoB,CAApB,CAAjB;AACA,UAAM,UAAU,UAAU,QAAV,CAAmB,CAAnB,CAAhB;;AAEA,UAAI,SAAS,eAAT,CAAyB,OAAzB,EAAkC,QAAlC,KACG,SAAS,YAAT,CAAsB,OAAtB,EAA+B,WAA/B,CADH,IAEG,SAAS,YAAT,CAAsB,OAAtB,EAA+B,OAA/B,CAFP,EAEgD;;AAE9C,YAAM,YAAY,UAAU,SAAV,CAAoB,CAApB,CAAlB;;AAEA,kBAAU,aAAV,GAA0B,OAA1B;;AAEA,aAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,UAAU,MAA9B,EAAsC,GAAtC,EAA2C;AAAA,6BACV,UAAU,CAAV,CADU;AAAA,cAClC,EADkC;AAAA,cAC9B,OAD8B;AAAA,cACrB,OADqB;;;AAGzC,cAAI,YAAY,CAAC,CAAC,QAAQ,OAAtB,IAAiC,YAAY,QAAQ,OAAzD,EAAkE;AAChE,eAAG,SAAH;AACD;AACF;AACF;AACF;;AAED,cAAU,SAAS,UAAT,CAAoB,OAApB,CAAV;AACD;AACF;;AAED,SAAS,kBAAT,CAA6B,KAA7B,EAAoC;AAClC,SAAO,iBAAiB,IAAjB,CAAsB,IAAtB,EAA4B,KAA5B,EAAmC,IAAnC,CAAP;AACD;;AAED,SAAS,UAAT,GAAuB;AACrB,OAAK,WAAL,GAAmB,KAAnB;AACD;;AAED,SAAS,sBAAT,GAAmC;AACjC,OAAK,aAAL,CAAmB,cAAnB;AACD;;AAED,SAAS,QAAT,GAAqB;AACnB,OAAK,YAAL,GAAoB,IAApB;AACD;;AAED,SAAS,WAAT,GAAwB;AACtB,OAAK,YAAL,GAAoB,IAApB;AACA,OAAK,2BAAL,GAAmC,IAAnC;AACD;;AAED,SAAS,UAAT,CAAqB,KAArB,EAA4B;AAC1B,SAAO,GAAG,MAAH,CAAU,KAAV,IAAkB,KAAlB,GAA0B,EAAE,SAAS,KAAX,EAAjC;AACD;;AAED,OAAO,OAAP,GAAiB;AACf,UADe;AAEf,gBAFe;;AAIf,0BAJe;AAKf,gCALe;;AAOf,oCAPe;AAQf,wCARe;AASf,kCATe;AAUf,sBAVe;;AAYf,gCAZe;AAaf,kCAbe;;AAef,aAAW,QAfI;AAgBf,YAAU,OAhBK;AAiBf,sBAAoB;AAjBL,CAAjB;;;;;ACrVA,OAAO,OAAP,GAAiB,SAAS,MAAT,CAAiB,IAAjB,EAAuB,MAAvB,EAA+B;AAC9C,OAAK,IAAM,IAAX,IAAmB,MAAnB,EAA2B;AACzB,SAAK,IAAL,IAAa,OAAO,IAAP,CAAb;AACD;AACD,SAAO,IAAP;AACD,CALD;;;;;eCGI,QAAQ,QAAR,C;IAFF,e,YAAA,e;IACA,Q,YAAA,Q;;AAGF,OAAO,OAAP,GAAiB,UAAU,MAAV,EAAkB,OAAlB,EAA2B,MAA3B,EAAmC;AAClD,MAAM,gBAAgB,OAAO,OAAP,CAAe,MAAf,CAAtB;AACA,MAAM,eAAe,iBAAiB,cAAc,MAApD;AACA,MAAM,SAAS,gBAAgB,OAAO,OAAP,CAAe,MAA9C;;AAEA,MAAM,aAAa,gBAAgB,MAAhB,EAAwB,MAAxB,EAAgC,OAAhC,EAAyC,CAAC,UAAU,OAAX,CAAzC,CAAnB;;AAEA,SAAO,SAAS,UAAT,KAAwB,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EAA/B;AACD,CARD;;;;;ACLA,OAAO,OAAP,GAAiB,UAAC,CAAD,EAAI,CAAJ;AAAA,SAAW,KAAK,IAAL,CAAU,IAAI,CAAJ,GAAQ,IAAI,CAAtB,CAAX;AAAA,CAAjB;;;;;ACAA,IAAM,SAAS,QAAQ,UAAR,CAAf;AACA,IAAM,MAAS,QAAQ,UAAR,CAAf;;AAEA,IAAM,QAAQ;AACZ,YAAU,kBAAU,MAAV,EAAkB,OAAlB,EAA2B;AACnC,QAAI,SAAS,KAAb;;AAEA,WAAO,YAAY;AACjB,UAAI,CAAC,MAAL,EAAa;AACX,YAAI,MAAJ,CAAW,OAAX,CAAmB,IAAnB,CAAwB,OAAxB;AACA,iBAAS,IAAT;AACD;;AAED,aAAO,OAAO,KAAP,CAAa,IAAb,EAAmB,SAAnB,CAAP;AACD,KAPD;AAQD,GAZW;;AAcZ;AACA,oBAAkB,0BAAU,CAAV,EAAa,EAAb,EAAiB,EAAjB,EAAqB,EAArB,EAAyB;AACzC,QAAM,KAAK,IAAI,CAAf;AACA,WAAO,KAAK,EAAL,GAAU,EAAV,GAAe,IAAI,EAAJ,GAAS,CAAT,GAAa,EAA5B,GAAiC,IAAI,CAAJ,GAAQ,EAAhD;AACD,GAlBW;;AAoBZ,0BAAwB,gCAAU,MAAV,EAAkB,MAAlB,EAA0B,GAA1B,EAA+B,GAA/B,EAAoC,IAApC,EAA0C,IAA1C,EAAgD,QAAhD,EAA0D;AAChF,WAAO;AACL,SAAI,MAAM,gBAAN,CAAuB,QAAvB,EAAiC,MAAjC,EAAyC,GAAzC,EAA8C,IAA9C,CADC;AAEL,SAAI,MAAM,gBAAN,CAAuB,QAAvB,EAAiC,MAAjC,EAAyC,GAAzC,EAA8C,IAA9C;AAFC,KAAP;AAID,GAzBW;;AA2BZ;AACA,eAAa,qBAAU,CAAV,EAAa,CAAb,EAAgB,CAAhB,EAAmB,CAAnB,EAAsB;AACjC,SAAK,CAAL;AACA,WAAO,CAAC,CAAD,GAAK,CAAL,IAAQ,IAAE,CAAV,IAAe,CAAtB;AACD,GA/BW;;AAiCZ,cAAY,oBAAU,IAAV,EAAgB,GAAhB,EAAqB;AAC/B,SAAK,IAAL,GAAa,IAAI,IAAjB;AACA,SAAK,IAAL,GAAa,IAAI,IAAjB;AACA,SAAK,KAAL,GAAa,IAAI,KAAjB;;AAEA,WAAO,IAAP;AACD,GAvCW;;AAyCZ,MAAa,QAAQ,MAAR,CAzCD;AA0CZ,UAAa,MA1CD;AA2CZ,SAAa,QAAQ,SAAR,CA3CD;AA4CZ,eAAa,QAAQ,eAAR;AA5CD,CAAd;;AA+CA,OAAO,KAAP,EAAc,QAAQ,OAAR,CAAd;AACA,OAAO,KAAP,EAAc,QAAQ,YAAR,CAAd;AACA,OAAO,KAAP,EAAc,QAAQ,gBAAR,CAAd;AACA,OAAO,KAAP,EAAc,QAAQ,QAAR,CAAd;;AAEA,OAAO,OAAP,GAAiB,KAAjB;;;;;ACvDA,IAAM,QAAU,QAAQ,UAAR,CAAhB;AACA,IAAM,QAAU,QAAQ,SAAR,CAAhB;;AAEA,IAAM,SAAS;AACb,eAAa,CAAE,kBAAF,EAAsB,YAAtB,EAAoC,YAApC,EAAkD,MAAlD,CADA;;AAGb,UAAQ,gBAAU,OAAV,EAAmB,SAAnB,EAA8B,WAA9B,EAA2C;AACjD,QAAM,cAAc,MAAM,cAAN,CAAqB,OAArB,CAApB;AACA,QAAM,YAAY,MAAM,YAAN,CAAmB,OAAnB,CAAlB;AACA,QAAM,UAAU,EAAE,gBAAF,EAAW,oBAAX,EAAsB,wBAAtB,EAAmC,oBAAnC,EAA8C,wBAA9C,EAAhB;;AAEA,yBAAqB,OAAO,WAA5B,kHAAyC;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAA9B,MAA8B;;AACvC,UAAM,cAAc,OAAO,MAAP,EAAe,OAAf,CAApB;;AAEA,UAAI,WAAJ,EAAiB;AACf,eAAO,WAAP;AACD;AACF;AACF,GAfY;;AAiBb;AACA,oBAAkB,iCAAmD;AAAA,QAAvC,WAAuC,SAAvC,WAAuC;AAAA,QAA1B,SAA0B,SAA1B,SAA0B;AAAA,QAAf,WAAe,SAAf,WAAe;;AACnE,QAAI,CAAC,cAAc,IAAd,CAAmB,SAAnB,CAAL,EAAoC;AAClC,aAAO,IAAP;AACD;;AAED,0BAA0B,MAAM,YAAhC,yHAA8C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAAnC,WAAmC;;AAC5C,UAAI,UAAU,WAAd;;AAEA,UAAI,YAAY,UAAZ,IAA0B,YAAY,UAAZ,CAAuB,WAAjD,IACI,YAAY,WAAZ,KAA4B,WADpC,EACkD;AAChD,eAAO,OAAP,EAAgB;AACd;AACA,cAAI,YAAY,YAAY,OAA5B,EAAqC;AACnC,mBAAO,WAAP;AACD;AACD,oBAAU,MAAM,UAAN,CAAiB,OAAjB,CAAV;AACD;AACF;AACF;;AAED,WAAO,IAAP;AACD,GAvCY;;AAyCb;AACA,cAAY,2BAAiD;AAAA,QAArC,SAAqC,SAArC,SAAqC;AAAA,QAA1B,WAA0B,SAA1B,WAA0B;AAAA,QAAb,SAAa,SAAb,SAAa;;AAC3D,QAAI,gBAAgB,OAAhB,IAA2B,gBAAgB,KAA/C,EAAsD;AACpD,aAAO,IAAP;AACD;;AAED,QAAI,uBAAJ;;AAEA,0BAA0B,MAAM,YAAhC,yHAA8C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAAnC,WAAmC;;AAC5C,UAAI,YAAY,WAAZ,KAA4B,WAAhC,EAA6C;AAC3C;AACA,YAAI,YAAY,UAAZ,IAA0B,CAAC,MAAM,QAAN,CAAe,YAAY,UAA3B,EAAuC,SAAvC,CAA/B,EAAkF;AAAE;AAAW;;AAE/F;AACA,YAAI,YAAY,WAAZ,EAAJ,EAA+B;AAC7B,iBAAO,WAAP;AACD;AACD;AAHA,aAIK,IAAI,CAAC,cAAL,EAAqB;AACxB,6BAAiB,WAAjB;AACD;AACF;AACF;;AAED;AACA;AACA,QAAI,cAAJ,EAAoB;AAClB,aAAO,cAAP;AACD;;AAED;AACA;AACA;AACA,0BAA0B,MAAM,YAAhC,yHAA8C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAAnC,YAAmC;;AAC5C,UAAI,aAAY,WAAZ,KAA4B,WAA5B,IAA2C,EAAE,QAAQ,IAAR,CAAa,SAAb,KAA2B,aAAY,UAAzC,CAA/C,EAAqG;AACnG,eAAO,YAAP;AACD;AACF;;AAED,WAAO,IAAP;AACD,GAjFY;;AAmFb;AACA,cAAY,2BAAyB;AAAA,QAAb,SAAa,SAAb,SAAa;;AACnC,0BAA0B,MAAM,YAAhC,yHAA8C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAAnC,WAAmC;;AAC5C,UAAI,MAAM,QAAN,CAAe,YAAY,UAA3B,EAAuC,SAAvC,CAAJ,EAAuD;AACrD,eAAO,WAAP;AACD;AACF;AACF,GA1FY;;AA4Fb;AACA,QAAM,qBAA2B;AAAA,QAAf,WAAe,SAAf,WAAe;;AAC/B,0BAA0B,MAAM,YAAhC,yHAA8C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAAnC,WAAmC;;AAC5C;AACA,UAAI,YAAY,UAAZ,CAAuB,MAAvB,KAAkC,CAAtC,EAAyC;AACvC,YAAM,SAAS,YAAY,MAA3B;AACA;AACA;AACA,YAAI,UAAU,CAAC,OAAO,OAAP,CAAe,OAAf,CAAuB,OAAtC,EAA+C;AAC7C;AACD;AACF;AACD;AARA,WASK,IAAI,YAAY,UAAZ,CAAuB,MAAvB,IAAiC,CAArC,EAAwC;AAC3C;AACD;;AAED,UAAI,CAAC,YAAY,WAAZ,EAAD,IAA+B,gBAAgB,YAAY,WAA/D,EAA6E;AAC3E,eAAO,WAAP;AACD;AACF;;AAED,WAAO,IAAP;AACD;AAnHY,CAAf;;AAsHA,OAAO,OAAP,GAAiB,MAAjB;;;;;;;ACzHA,IAAM,MAAa,QAAQ,UAAR,CAAnB;AACA,IAAM,WAAa,QAAQ,YAAR,CAAnB;;AAEA,IAAM,KAAK;AACT,SAAU,iBAAM,CAAE,CADT;;AAGT,UAAU;AAAA,WAAS,UAAU,IAAI,MAAd,IAAwB,SAAS,KAAT,CAAjC;AAAA,GAHD;;AAKT,WAAU;AAAA,WAAS,GAAG,MAAH,CAAU,KAAV,KAAoB,MAAM,QAAN,KAAmB,EAAhD;AAAA,GALD;;AAOT,UAAU;AAAA,WAAS,CAAC,CAAC,KAAF,IAAY,QAAO,KAAP,yCAAO,KAAP,OAAiB,QAAtC;AAAA,GAPD;;AAST,YAAU;AAAA,WAAS,OAAO,KAAP,KAAiB,UAA1B;AAAA,GATD;;AAWT,UAAU;AAAA,WAAS,OAAO,KAAP,KAAiB,QAA1B;AAAA,GAXD;;AAaT,QAAU;AAAA,WAAS,OAAO,KAAP,KAAiB,SAA1B;AAAA,GAbD;;AAeT,UAAU;AAAA,WAAS,OAAO,KAAP,KAAiB,QAA1B;AAAA,GAfD;;AAiBT,WAAS,wBAAS;AAChB,QAAI,CAAC,KAAD,IAAW,QAAO,KAAP,yCAAO,KAAP,OAAiB,QAAhC,EAA2C;AAAE,aAAO,KAAP;AAAe;;AAE5D,QAAM,UAAU,IAAI,SAAJ,CAAc,KAAd,KAAwB,IAAI,MAA5C;;AAEA,WAAQ,mBAAkB,IAAlB,SAA8B,QAAQ,OAAtC,KACJ,iBAAiB,QAAQ,OADrB,CAC6B;AAD7B,QAEJ,MAAM,QAAN,KAAmB,CAAnB,IAAwB,OAAO,MAAM,QAAb,KAA0B;AAFtD;AAGD;AAzBQ,CAAX;;AA4BA,GAAG,KAAH,GAAW;AAAA,SAAU,GAAG,MAAH,CAAU,KAAV,KACf,OAAO,MAAM,MAAb,KAAwB,WADT,IAEhB,GAAG,QAAH,CAAY,MAAM,MAAlB,CAFM;AAAA,CAAX;;AAIA,OAAO,OAAP,GAAiB,EAAjB;;;;;ACnCA,OAAO,OAAP,GAAiB,UAAC,KAAD;AAAA,SAAW,CAAC,EAAE,SAAS,MAAM,MAAjB,CAAD,IAA8B,iBAAiB,MAAM,MAAhE;AAAA,CAAjB;;;;;ACAA,SAAS,aAAT,CAAwB,IAAxB,EAA8B,MAA9B,EAAsC;AACpC,OAAK,IAAM,IAAX,IAAmB,MAAnB,EAA2B;AACzB,QAAM,kBAAkB,OAAO,OAAP,CAAe,eAAvC;AACA,QAAI,aAAa,KAAjB;;AAEA;AACA,SAAK,IAAM,MAAX,IAAqB,eAArB,EAAsC;AACpC,UAAI,KAAK,OAAL,CAAa,MAAb,MAAyB,CAAzB,IAA8B,gBAAgB,MAAhB,EAAwB,IAAxB,CAA6B,IAA7B,CAAlC,EAAsE;AACpE,qBAAa,IAAb;AACA;AACD;AACF;;AAED,QAAI,CAAC,UAAD,IAAe,OAAO,OAAO,IAAP,CAAP,KAAwB,UAA3C,EAAuD;AACrD,WAAK,IAAL,IAAa,OAAO,IAAP,CAAb;AACD;AACF;AACD,SAAO,IAAP;AACD;;AAED,cAAc,eAAd,GAAgC;AAC9B,UAAQ;AADsB,CAAhC;;AAIA,OAAO,OAAP,GAAiB,aAAjB;;;;;ACxBA,IAAM,QAAgB,QAAQ,SAAR,CAAtB;AACA,IAAM,UAAgB,QAAQ,WAAR,CAAtB;AACA,IAAM,MAAgB,QAAQ,cAAR,CAAtB;AACA,IAAM,WAAgB,QAAQ,YAAR,CAAtB;AACA,IAAM,aAAgB,QAAQ,cAAR,CAAtB;AACA,IAAM,KAAgB,QAAQ,MAAR,CAAtB;AACA,IAAM,gBAAgB,QAAQ,iBAAR,CAAtB;;AAEA,IAAM,eAAe;AACnB,cAAY,oBAAU,IAAV,EAAgB,GAAhB,EAAqB;AAC/B,SAAK,IAAL,GAAY,KAAK,IAAL,IAAa,EAAzB;AACA,SAAK,IAAL,CAAU,CAAV,GAAc,IAAI,IAAJ,CAAS,CAAvB;AACA,SAAK,IAAL,CAAU,CAAV,GAAc,IAAI,IAAJ,CAAS,CAAvB;;AAEA,SAAK,MAAL,GAAc,KAAK,MAAL,IAAe,EAA7B;AACA,SAAK,MAAL,CAAY,CAAZ,GAAgB,IAAI,MAAJ,CAAW,CAA3B;AACA,SAAK,MAAL,CAAY,CAAZ,GAAgB,IAAI,MAAJ,CAAW,CAA3B;;AAEA,SAAK,SAAL,GAAiB,IAAI,SAArB;AACD,GAXkB;;AAanB,kBAAgB,wBAAU,SAAV,EAAqB,IAArB,EAA2B,GAA3B,EAAgC;AAC9C,cAAU,IAAV,CAAe,CAAf,GAAsB,IAAI,IAAJ,CAAS,CAAT,GAAgB,KAAK,IAAL,CAAU,CAAhD;AACA,cAAU,IAAV,CAAe,CAAf,GAAsB,IAAI,IAAJ,CAAS,CAAT,GAAgB,KAAK,IAAL,CAAU,CAAhD;AACA,cAAU,MAAV,CAAiB,CAAjB,GAAsB,IAAI,MAAJ,CAAW,CAAX,GAAgB,KAAK,MAAL,CAAY,CAAlD;AACA,cAAU,MAAV,CAAiB,CAAjB,GAAsB,IAAI,MAAJ,CAAW,CAAX,GAAgB,KAAK,MAAL,CAAY,CAAlD;AACA,cAAU,SAAV,GAAsB,IAAI,SAAJ,GAAgB,KAAK,SAA3C;;AAEA;AACA,QAAM,KAAK,KAAK,GAAL,CAAS,UAAU,SAAV,GAAsB,IAA/B,EAAqC,KAArC,CAAX;;AAEA,cAAU,IAAV,CAAe,KAAf,GAAyB,MAAM,UAAU,IAAV,CAAe,CAArB,EAAwB,UAAU,IAAV,CAAe,CAAvC,IAA4C,EAArE;AACA,cAAU,IAAV,CAAe,EAAf,GAAyB,UAAU,IAAV,CAAe,CAAf,GAAmB,EAA5C;AACA,cAAU,IAAV,CAAe,EAAf,GAAyB,UAAU,IAAV,CAAe,CAAf,GAAmB,EAA5C;;AAEA,cAAU,MAAV,CAAiB,KAAjB,GAAyB,MAAM,UAAU,MAAV,CAAiB,CAAvB,EAA0B,UAAU,IAAV,CAAe,CAAzC,IAA8C,EAAvE;AACA,cAAU,MAAV,CAAiB,EAAjB,GAAyB,UAAU,MAAV,CAAiB,CAAjB,GAAqB,EAA9C;AACA,cAAU,MAAV,CAAiB,EAAjB,GAAyB,UAAU,MAAV,CAAiB,CAAjB,GAAqB,EAA9C;AACD,GA9BkB;;AAgCnB,mBAAiB,yBAAW,OAAX,EAAoB;AACnC,WAAQ,mBAAmB,IAAI,KAAvB,IAAgC,mBAAmB,IAAI,KAA/D;AACD,GAlCkB;;AAoCnB;AACA,SAAO,eAAU,IAAV,EAAgB,OAAhB,EAAyB,EAAzB,EAA6B;AAClC,SAAK,MAAM,EAAX;AACA,WAAO,QAAQ,MAAf;;AAEA,OAAG,CAAH,GAAO,QAAQ,OAAO,GAAf,CAAP;AACA,OAAG,CAAH,GAAO,QAAQ,OAAO,GAAf,CAAP;;AAEA,WAAO,EAAP;AACD,GA7CkB;;AA+CnB,aAAW,mBAAU,OAAV,EAAmB,IAAnB,EAAyB;AAClC,WAAO,QAAQ,EAAf;;AAEA;AACA,QAAI,QAAQ,aAAR,IAAyB,aAAa,eAAb,CAA6B,OAA7B,CAA7B,EAAoE;AAClE,mBAAa,KAAb,CAAmB,QAAnB,EAA6B,OAA7B,EAAsC,IAAtC;;AAEA,WAAK,CAAL,IAAU,OAAO,OAAjB;AACA,WAAK,CAAL,IAAU,OAAO,OAAjB;AACD,KALD,MAMK;AACH,mBAAa,KAAb,CAAmB,MAAnB,EAA2B,OAA3B,EAAoC,IAApC;AACD;;AAED,WAAO,IAAP;AACD,GA9DkB;;AAgEnB,eAAa,qBAAU,OAAV,EAAmB,MAAnB,EAA2B;AACtC,aAAS,UAAU,EAAnB;;AAEA,QAAI,QAAQ,aAAR,IAAyB,aAAa,eAAb,CAA6B,OAA7B,CAA7B,EAAoE;AAClE;AACA,mBAAa,KAAb,CAAmB,QAAnB,EAA6B,OAA7B,EAAsC,MAAtC;AACD,KAHD,MAIK;AACH,mBAAa,KAAb,CAAmB,QAAnB,EAA6B,OAA7B,EAAsC,MAAtC;AACD;;AAED,WAAO,MAAP;AACD,GA5EkB;;AA8EnB,gBAAc,sBAAU,OAAV,EAAmB;AAC/B,WAAO,GAAG,MAAH,CAAU,QAAQ,SAAlB,IAA8B,QAAQ,SAAtC,GAAkD,QAAQ,UAAjE;AACD,GAhFkB;;AAkFnB,aAAW,mBAAU,SAAV,EAAqB,QAArB,EAA+B,SAA/B,EAA0C;AACnD,QAAM,UAAW,SAAS,MAAT,GAAkB,CAAlB,GACE,aAAa,cAAb,CAA4B,QAA5B,CADF,GAEE,SAAS,CAAT,CAFnB;;AAIA,QAAM,QAAQ,EAAd;;AAEA,iBAAa,SAAb,CAAuB,OAAvB,EAAgC,KAAhC;AACA,cAAU,IAAV,CAAe,CAAf,GAAmB,MAAM,CAAzB;AACA,cAAU,IAAV,CAAe,CAAf,GAAmB,MAAM,CAAzB;;AAEA,iBAAa,WAAb,CAAyB,OAAzB,EAAkC,KAAlC;AACA,cAAU,MAAV,CAAiB,CAAjB,GAAqB,MAAM,CAA3B;AACA,cAAU,MAAV,CAAiB,CAAjB,GAAqB,MAAM,CAA3B;;AAEA,cAAU,SAAV,GAAsB,GAAG,MAAH,CAAU,SAAV,IAAuB,SAAvB,GAAkC,IAAI,IAAJ,GAAW,OAAX,EAAxD;AACD,GAlGkB;;AAoGnB,iBAAe,aApGI;;AAsGnB,gBAAc,sBAAU,KAAV,EAAiB;AAC7B,QAAM,UAAU,EAAhB;;AAEA;AACA,QAAI,GAAG,KAAH,CAAS,KAAT,CAAJ,EAAqB;AACnB,cAAQ,CAAR,IAAa,MAAM,CAAN,CAAb;AACA,cAAQ,CAAR,IAAa,MAAM,CAAN,CAAb;AACD;AACD;AAJA,SAKK;AACH,YAAI,MAAM,IAAN,KAAe,UAAnB,EAA+B;AAC7B,cAAI,MAAM,OAAN,CAAc,MAAd,KAAyB,CAA7B,EAAgC;AAC9B,oBAAQ,CAAR,IAAa,MAAM,OAAN,CAAc,CAAd,CAAb;AACA,oBAAQ,CAAR,IAAa,MAAM,cAAN,CAAqB,CAArB,CAAb;AACD,WAHD,MAIK,IAAI,MAAM,OAAN,CAAc,MAAd,KAAyB,CAA7B,EAAgC;AACnC,oBAAQ,CAAR,IAAa,MAAM,cAAN,CAAqB,CAArB,CAAb;AACA,oBAAQ,CAAR,IAAa,MAAM,cAAN,CAAqB,CAArB,CAAb;AACD;AACF,SATD,MAUK;AACH,kBAAQ,CAAR,IAAa,MAAM,OAAN,CAAc,CAAd,CAAb;AACA,kBAAQ,CAAR,IAAa,MAAM,OAAN,CAAc,CAAd,CAAb;AACD;AACF;;AAED,WAAO,OAAP;AACD,GAjIkB;;AAmInB,kBAAgB,wBAAU,QAAV,EAAoB;AAClC,QAAM,UAAU;AACd,aAAS,CADK;AAEd,aAAS,CAFK;AAGd,eAAS,CAHK;AAId,eAAS,CAJK;AAKd,eAAS,CALK;AAMd,eAAS;AANK,KAAhB;;AASA,yBAAsB,QAAtB,kHAAgC;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAArB,OAAqB;;AAC9B,WAAK,IAAM,KAAX,IAAmB,OAAnB,EAA4B;AAC1B,gBAAQ,KAAR,KAAiB,QAAQ,KAAR,CAAjB;AACD;AACF;AACD,SAAK,IAAM,IAAX,IAAmB,OAAnB,EAA4B;AAC1B,cAAQ,IAAR,KAAiB,SAAS,MAA1B;AACD;;AAED,WAAO,OAAP;AACD,GAvJkB;;AAyJnB,aAAW,mBAAU,KAAV,EAAiB;AAC1B,QAAI,CAAC,MAAM,MAAP,IAAiB,EAAE,MAAM,OAAN,IAAiB,MAAM,OAAN,CAAc,MAAd,GAAuB,CAA1C,CAArB,EAAmE;AACjE;AACD;;AAED,QAAM,UAAU,aAAa,YAAb,CAA0B,KAA1B,CAAhB;AACA,QAAM,OAAO,KAAK,GAAL,CAAS,QAAQ,CAAR,EAAW,KAApB,EAA2B,QAAQ,CAAR,EAAW,KAAtC,CAAb;AACA,QAAM,OAAO,KAAK,GAAL,CAAS,QAAQ,CAAR,EAAW,KAApB,EAA2B,QAAQ,CAAR,EAAW,KAAtC,CAAb;AACA,QAAM,OAAO,KAAK,GAAL,CAAS,QAAQ,CAAR,EAAW,KAApB,EAA2B,QAAQ,CAAR,EAAW,KAAtC,CAAb;AACA,QAAM,OAAO,KAAK,GAAL,CAAS,QAAQ,CAAR,EAAW,KAApB,EAA2B,QAAQ,CAAR,EAAW,KAAtC,CAAb;;AAEA,WAAO;AACL,SAAG,IADE;AAEL,SAAG,IAFE;AAGL,YAAM,IAHD;AAIL,WAAK,IAJA;AAKL,aAAO,OAAO,IALT;AAML,cAAQ,OAAO;AANV,KAAP;AAQD,GA5KkB;;AA8KnB,iBAAe,uBAAU,KAAV,EAAiB,WAAjB,EAA8B;AAC3C,QAAM,UAAU,cAAc,GAA9B;AACA,QAAM,UAAU,cAAc,GAA9B;AACA,QAAM,UAAU,aAAa,YAAb,CAA0B,KAA1B,CAAhB;;AAGA,QAAM,KAAK,QAAQ,CAAR,EAAW,OAAX,IAAsB,QAAQ,CAAR,EAAW,OAAX,CAAjC;AACA,QAAM,KAAK,QAAQ,CAAR,EAAW,OAAX,IAAsB,QAAQ,CAAR,EAAW,OAAX,CAAjC;;AAEA,WAAO,MAAM,EAAN,EAAU,EAAV,CAAP;AACD,GAxLkB;;AA0LnB,cAAY,oBAAU,KAAV,EAAiB,SAAjB,EAA4B,WAA5B,EAAyC;AACnD,QAAM,UAAU,cAAc,GAA9B;AACA,QAAM,UAAU,cAAc,GAA9B;AACA,QAAM,UAAU,aAAa,YAAb,CAA0B,KAA1B,CAAhB;AACA,QAAM,KAAK,QAAQ,CAAR,EAAW,OAAX,IAAsB,QAAQ,CAAR,EAAW,OAAX,CAAjC;AACA,QAAM,KAAK,QAAQ,CAAR,EAAW,OAAX,IAAsB,QAAQ,CAAR,EAAW,OAAX,CAAjC;AACA,QAAM,QAAQ,MAAM,KAAK,KAAL,CAAW,EAAX,EAAgB,EAAhB,CAAN,GAA4B,KAAK,EAA/C;;AAEA,WAAQ,KAAR;AACD,GAnMkB;;AAqMnB,kBAAgB,wBAAU,OAAV,EAAmB;AACjC,WAAO,GAAG,MAAH,CAAU,QAAQ,WAAlB,IACH,QAAQ,WADL,GAEH,GAAG,MAAH,CAAU,QAAQ,WAAlB,IACE,CAAC,SAAD,EAAY,SAAZ,EAAsB,OAAtB,EAA+B,KAA/B,EAAsC,OAAtC,EAA+C,QAAQ,WAAvD;AACA;AACA;AAHF,MAII,QAAQ,IAAR,CAAa,QAAQ,IAArB,KAA8B,mBAAmB,WAAW,KAA5D,GACE,OADF,GAEE,OARV;AASD,GA/MkB;;AAiNnB;AACA,mBAAiB,yBAAU,KAAV,EAAiB;AAChC,WAAO,CACL,SAAS,gBAAT,CAA0B,MAAM,IAAN,GAAa,MAAM,IAAN,CAAW,CAAX,CAAb,GAA6B,MAAM,MAA7D,CADK,EAEL,SAAS,gBAAT,CAA0B,MAAM,aAAhC,CAFK,CAAP;AAID;AAvNkB,CAArB;;AA0NA,OAAO,OAAP,GAAiB,YAAjB;;;;;eClOmB,QAAQ,UAAR,C;IAAX,M,YAAA,M;;AAER,IAAM,UAAU,CAAC,IAAD,EAAO,KAAP,EAAc,QAAd,EAAwB,GAAxB,CAAhB;AACA,IAAI,WAAW,CAAf;AACA,IAAI,gBAAJ;AACA,IAAI,eAAJ;;AAEA,KAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,QAAQ,MAAZ,IAAsB,CAAC,OAAO,qBAA9C,EAAqE,GAArE,EAA0E;AACxE,YAAU,OAAO,QAAQ,CAAR,IAAa,uBAApB,CAAV;AACA,WAAS,OAAO,QAAQ,CAAR,IAAY,sBAAnB,KAA8C,OAAO,QAAQ,CAAR,IAAa,6BAApB,CAAvD;AACD;;AAED,IAAI,CAAC,OAAL,EAAc;AACZ,YAAU,iBAAU,QAAV,EAAoB;AAC5B,QAAM,WAAW,IAAI,IAAJ,GAAW,OAAX,EAAjB;AACA,QAAM,aAAa,KAAK,GAAL,CAAS,CAAT,EAAY,MAAM,WAAW,QAAjB,CAAZ,CAAnB;AACA,QAAM,KAAK,WAAW,YAAY;AAAE,eAAS,WAAW,UAApB;AAAkC,KAA3D,EACW,UADX,CAAX;;AAGA,eAAW,WAAW,UAAtB;AACA,WAAO,EAAP;AACD,GARD;AASD;;AAED,IAAI,CAAC,MAAL,EAAa;AACX,WAAS,gBAAU,EAAV,EAAc;AACrB,iBAAa,EAAb;AACD,GAFD;AAGD;;AAED,OAAO,OAAP,GAAiB;AACf,kBADe;AAEf;AAFe,CAAjB;;;;;AC9BA,IAAM,SAAS,QAAQ,UAAR,CAAf;AACA,IAAM,KAAK,QAAQ,MAAR,CAAX;;eAKI,QAAQ,YAAR,C;IAHF,O,YAAA,O;IACA,U,YAAA,U;IACA,c,YAAA,c;;AAGF,IAAM,YAAY;AAChB,yBAAuB,+BAAU,KAAV,EAAiB,YAAjB,EAA+B,OAA/B,EAAwC;AAC7D,QAAI,CAAC,GAAG,MAAH,CAAU,KAAV,CAAL,EAAuB;AACrB,aAAO,IAAP;AACD;;AAED,QAAI,UAAU,QAAd,EAAwB;AACtB,cAAQ,WAAW,OAAX,CAAR;AACD,KAFD,MAGK,IAAI,UAAU,MAAd,EAAsB;AACzB,cAAQ,aAAa,OAAb,CAAqB,OAArB,CAAR;AACD,KAFI,MAGA;AACH,cAAQ,QAAQ,OAAR,EAAiB,KAAjB,CAAR;AACD;;AAED,WAAO,KAAP;AACD,GAjBe;;AAmBhB,mBAAiB,yBAAU,KAAV,EAAiB,YAAjB,EAA+B,OAA/B,EAAwC,YAAxC,EAAsD;AACrE,YAAQ,UAAU,qBAAV,CAAgC,KAAhC,EAAuC,YAAvC,EAAqD,OAArD,KAAiE,KAAzE;;AAEA,QAAI,GAAG,QAAH,CAAY,KAAZ,CAAJ,EAAwB;AACtB,cAAQ,MAAM,KAAN,CAAY,IAAZ,EAAkB,YAAlB,CAAR;AACD;;AAED,QAAI,GAAG,OAAH,CAAW,KAAX,CAAJ,EAAuB;AACrB,cAAQ,eAAe,KAAf,CAAR;AACD;;AAED,WAAO,KAAP;AACD,GA/Be;;AAiChB,YAAU,kBAAU,IAAV,EAAgB;AACxB,WAAQ,QAAQ;AACd,SAAG,OAAO,IAAP,GAAc,KAAK,CAAnB,GAAuB,KAAK,IADjB;AAEd,SAAG,OAAO,IAAP,GAAc,KAAK,CAAnB,GAAuB,KAAK;AAFjB,KAAhB;AAID,GAtCe;;AAwChB,cAAY,oBAAU,IAAV,EAAgB;AAC1B,QAAI,QAAQ,EAAE,UAAU,IAAV,IAAkB,SAAS,IAA7B,CAAZ,EAAgD;AAC9C,aAAO,OAAO,EAAP,EAAW,IAAX,CAAP;;AAEA,WAAK,IAAL,GAAc,KAAK,CAAL,IAAU,CAAxB;AACA,WAAK,GAAL,GAAc,KAAK,CAAL,IAAU,CAAxB;AACA,WAAK,KAAL,GAAc,KAAK,KAAL,IAAiB,KAAK,IAAL,GAAY,KAAK,KAAhD;AACA,WAAK,MAAL,GAAc,KAAK,MAAL,IAAiB,KAAK,GAAL,GAAW,KAAK,MAA/C;AACD;;AAED,WAAO,IAAP;AACD,GAnDe;;AAqDhB,cAAY,oBAAU,IAAV,EAAgB;AAC1B,QAAI,QAAQ,EAAE,OAAO,IAAP,IAAe,OAAO,IAAxB,CAAZ,EAA2C;AACzC,aAAO,OAAO,EAAP,EAAW,IAAX,CAAP;;AAEA,WAAK,CAAL,GAAc,KAAK,IAAL,IAAa,CAA3B;AACA,WAAK,GAAL,GAAc,KAAK,GAAL,IAAa,CAA3B;AACA,WAAK,KAAL,GAAc,KAAK,KAAL,IAAgB,KAAK,KAAL,GAAc,KAAK,CAAjD;AACA,WAAK,MAAL,GAAc,KAAK,MAAL,IAAgB,KAAK,MAAL,GAAc,KAAK,CAAjD;AACD;;AAED,WAAO,IAAP;AACD;AAhEe,CAAlB;;AAmEA,OAAO,OAAP,GAAiB,SAAjB;;;;;AC3EA,IAAM,MAAM,OAAO,OAAnB;AACA,IAAM,WAAW,QAAQ,YAAR,CAAjB;;AAEA,SAAS,IAAT,CAAe,MAAf,EAAuB;AACrB;;AAEA,MAAI,UAAJ,GAAiB,MAAjB;;AAEA;AACA,MAAM,KAAK,OAAO,QAAP,CAAgB,cAAhB,CAA+B,EAA/B,CAAX;;AAEA;AACA,MAAI,GAAG,aAAH,KAAqB,OAAO,QAA5B,IACG,OAAO,OAAO,IAAd,KAAuB,UAD1B,IAEC,OAAO,IAAP,CAAY,EAAZ,MAAoB,EAFzB,EAE6B;AAC3B;AACA,aAAS,OAAO,IAAP,CAAY,MAAZ,CAAT;AACD;;AAED,MAAI,MAAJ,GAAa,MAAb;AACD;;AAED,IAAI,OAAO,MAAP,KAAkB,WAAtB,EAAmC;AACjC,MAAI,MAAJ,GAAiB,SAAjB;AACA,MAAI,UAAJ,GAAiB,SAAjB;AACD,CAHD,MAIK;AACH,OAAK,MAAL;AACD;;AAED,IAAI,SAAJ,GAAgB,SAAS,SAAT,CAAoB,IAApB,EAA0B;AACxC,MAAI,SAAS,IAAT,CAAJ,EAAoB;AAClB,WAAO,IAAP;AACD;;AAED,MAAM,WAAY,KAAK,aAAL,IAAsB,IAAxC;;AAEA,SAAO,SAAS,WAAT,IAAwB,SAAS,YAAjC,IAAiD,IAAI,MAA5D;AACD,CARD;;AAUA,IAAI,IAAJ,GAAW,IAAX","file":"interact.js","sourceRoot":"","sourcesContent":["/**\n * interact.js v1.3.0-alpha.4+sha.7970416-dirty\n *\n * Copyright (c) 2012-2017 Taye Adeyemi \n * Open source under the MIT License.\n * https://raw.github.com/taye/interact.js/master/LICENSE\n */\n","(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o 150) {\n return null;\n }\n\n let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI;\n const overlap = 22.5;\n\n if (angle < 0) {\n angle += 360;\n }\n\n const left = 135 - overlap <= angle && angle < 225 + overlap;\n const up = 225 - overlap <= angle && angle < 315 + overlap;\n\n const right = !left && (315 - overlap <= angle || angle < 45 + overlap);\n const down = !up && 45 - overlap <= angle && angle < 135 + overlap;\n\n return {\n up,\n down,\n left,\n right,\n angle,\n speed: interaction.prevEvent.speed,\n velocity: {\n x: interaction.prevEvent.velocityX,\n y: interaction.prevEvent.velocityY,\n },\n };\n }\n\n preventDefault () {}\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n}\n\nsignals.on('set-delta', function ({ iEvent, interaction, starting, deltaSource }) {\n const prevEvent = starting? iEvent : interaction.prevEvent;\n\n if (deltaSource === 'client') {\n iEvent.dx = iEvent.clientX - prevEvent.clientX;\n iEvent.dy = iEvent.clientY - prevEvent.clientY;\n }\n else {\n iEvent.dx = iEvent.pageX - prevEvent.pageX;\n iEvent.dy = iEvent.pageY - prevEvent.pageY;\n }\n});\n\nInteractEvent.signals = signals;\n\nmodule.exports = InteractEvent;\n","const is = require('./utils/is');\nconst events = require('./utils/events');\nconst extend = require('./utils/extend');\nconst actions = require('./actions/base');\nconst scope = require('./scope');\nconst Eventable = require('./Eventable');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nconst {\n getElementRect,\n nodeContains,\n trySelector,\n} = require('./utils/domUtils');\nconst { getWindow } = require('./utils/window');\nconst { indexOf, contains } = require('./utils/arr');\nconst { wheelEvent } = require('./utils/browser');\n\n// all set interactables\nscope.interactables = [];\n\n/*\\\n * Interactable\n [ property ]\n **\n * Object type returned by @interact\n\\*/\nclass Interactable {\n constructor (target, options) {\n options = options || {};\n\n this.target = target;\n this.events = new Eventable();\n this._context = options.context || scope.document;\n this._win = getWindow(trySelector(target)? this._context : target);\n this._doc = this._win.document;\n\n signals.fire('new', {\n target,\n options,\n interactable: this,\n win: this._win,\n });\n\n scope.addDocument( this._doc, this._win );\n\n scope.interactables.push(this);\n\n this.set(options);\n }\n\n setOnEvents (action, phases) {\n const onAction = 'on' + action;\n\n if (is.function(phases.onstart) ) { this.events[onAction + 'start' ] = phases.onstart ; }\n if (is.function(phases.onmove) ) { this.events[onAction + 'move' ] = phases.onmove ; }\n if (is.function(phases.onend) ) { this.events[onAction + 'end' ] = phases.onend ; }\n if (is.function(phases.oninertiastart)) { this.events[onAction + 'inertiastart' ] = phases.oninertiastart ; }\n\n return this;\n }\n\n setPerAction (action, options) {\n // for all the default per-action options\n for (const option in options) {\n // if this option exists for this action\n if (option in defaults[action]) {\n // if the option in the options arg is an object value\n if (is.object(options[option])) {\n // duplicate the object\n this.options[action][option] = extend(this.options[action][option] || {}, options[option]);\n\n if (is.object(defaults.perAction[option]) && 'enabled' in defaults.perAction[option]) {\n this.options[action][option].enabled = options[option].enabled === false? false : true;\n }\n }\n else if (is.bool(options[option]) && is.object(defaults.perAction[option])) {\n this.options[action][option].enabled = options[option];\n }\n else if (options[option] !== undefined) {\n // or if it's not undefined, do a plain assignment\n this.options[action][option] = options[option];\n }\n }\n }\n }\n\n /*\\\n * Interactable.getRect\n [ method ]\n *\n * The default function to get an Interactables bounding rect. Can be\n * overridden using @Interactable.rectChecker.\n *\n - element (Element) #optional The element to measure.\n = (object) The object's bounding rectangle.\n o {\n o top : 0,\n o left : 0,\n o bottom: 0,\n o right : 0,\n o width : 0,\n o height: 0\n o }\n \\*/\n getRect (element) {\n element = element || this.target;\n\n if (is.string(this.target) && !(is.element(element))) {\n element = this._context.querySelector(this.target);\n }\n\n return getElementRect(element);\n }\n\n /*\\\n * Interactable.rectChecker\n [ method ]\n *\n * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n - checker (function) #optional A function which returns this Interactable's bounding rectangle. See @Interactable.getRect\n = (function | object) The checker function or this Interactable\n \\*/\n rectChecker (checker) {\n if (is.function(checker)) {\n this.getRect = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.getRect;\n\n return this;\n }\n\n return this.getRect;\n }\n\n _backCompatOption (optionName, newValue) {\n if (trySelector(newValue) || is.object(newValue)) {\n this.options[optionName] = newValue;\n\n for (const action of actions.names) {\n this.options[action][optionName] = newValue;\n }\n\n return this;\n }\n\n return this.options[optionName];\n }\n\n /*\\\n * Interactable.origin\n [ method ]\n *\n * Gets or sets the origin of the Interactable's element. The x and y\n * of the origin will be subtracted from action event coordinates.\n *\n - origin (object | string) #optional An object eg. { x: 0, y: 0 } or string 'parent', 'self' or any CSS selector\n * OR\n - origin (Element) #optional An HTML or SVG Element whose rect will be used\n **\n = (object) The current origin or this Interactable\n \\*/\n origin (newValue) {\n return this._backCompatOption('origin', newValue);\n }\n\n /*\\\n * Interactable.deltaSource\n [ method ]\n *\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n - newValue (string) #optional Use 'client' if you will be scrolling while interacting; Use 'page' if you want autoScroll to work\n = (string | object) The current deltaSource or this Interactable\n \\*/\n deltaSource (newValue) {\n if (newValue === 'page' || newValue === 'client') {\n this.options.deltaSource = newValue;\n\n return this;\n }\n\n return this.options.deltaSource;\n }\n\n /*\\\n * Interactable.context\n [ method ]\n *\n * Gets the selector context Node of the Interactable. The default is `window.document`.\n *\n = (Node) The context Node of this Interactable\n **\n \\*/\n context () {\n return this._context;\n }\n\n inContext (element) {\n return (this._context === element.ownerDocument\n || nodeContains(this._context, element));\n }\n\n /*\\\n * Interactable.fire\n [ method ]\n *\n * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n - iEvent (InteractEvent) The InteractEvent object to be fired on this Interactable\n = (Interactable) this Interactable\n \\*/\n fire (iEvent) {\n this.events.fire(iEvent);\n\n return this;\n }\n\n _onOffMultiple (method, eventType, listener, options) {\n if (is.string(eventType) && eventType.search(' ') !== -1) {\n eventType = eventType.trim().split(/ +/);\n }\n\n if (is.array(eventType)) {\n for (let i = 0; i < eventType.length; i++) {\n this[method](eventType[i], listener, options);\n }\n\n return true;\n }\n\n if (is.object(eventType)) {\n for (const prop in eventType) {\n this[method](prop, eventType[prop], listener);\n }\n\n return true;\n }\n }\n\n /*\\\n * Interactable.on\n [ method ]\n *\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n - eventType (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) This Interactable\n \\*/\n on (eventType, listener, options) {\n if (this._onOffMultiple('on', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.on(eventType, listener);\n }\n // delegated event for selector\n else if (is.string(this.target)) {\n events.addDelegate(this.target, this._context, eventType, listener, options);\n }\n else {\n events.add(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.off\n [ method ]\n *\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n - eventType (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) This Interactable\n \\*/\n off (eventType, listener, options) {\n if (this._onOffMultiple('off', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n // if it is an action event type\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.off(eventType, listener);\n }\n // delegated event\n else if (is.string(this.target)) {\n events.removeDelegate(this.target, this._context, eventType, listener, options);\n }\n // remove listener from this Interatable's element\n else {\n events.remove(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.set\n [ method ]\n *\n * Reset the options of this Interactable\n - options (object) The new settings to apply\n = (object) This Interactable\n \\*/\n set (options) {\n if (!is.object(options)) {\n options = {};\n }\n\n this.options = extend({}, defaults.base);\n\n const perActions = extend({}, defaults.perAction);\n\n for (const actionName in actions.methodDict) {\n const methodName = actions.methodDict[actionName];\n\n this.options[actionName] = extend({}, defaults[actionName]);\n\n this.setPerAction(actionName, perActions);\n\n this[methodName](options[actionName]);\n }\n\n for (const setting of Interactable.settingsMethods) {\n this.options[setting] = defaults.base[setting];\n\n if (setting in options) {\n this[setting](options[setting]);\n }\n }\n\n signals.fire('set', {\n options,\n interactable: this,\n });\n\n return this;\n }\n\n /*\\\n * Interactable.unset\n [ method ]\n *\n * Remove this interactable from the list of interactables and remove\n * it's action capabilities and event listeners\n *\n = (object) @interact\n \\*/\n unset () {\n events.remove(this.target, 'all');\n\n if (is.string(this.target)) {\n // remove delegated events\n for (const type in events.delegatedEvents) {\n const delegated = events.delegatedEvents[type];\n\n if (delegated.selectors[0] === this.target\n && delegated.contexts[0] === this._context) {\n\n delegated.selectors.splice(0, 1);\n delegated.contexts .splice(0, 1);\n delegated.listeners.splice(0, 1);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegated[type] = null;\n }\n }\n\n events.remove(this._context, type, events.delegateListener);\n events.remove(this._context, type, events.delegateUseCapture, true);\n }\n }\n else {\n events.remove(this, 'all');\n }\n\n signals.fire('unset', { interactable: this });\n\n scope.interactables.splice(indexOf(scope.interactables, this), 1);\n\n // Stop related interactions when an Interactable is unset\n for (const interaction of scope.interactions || []) {\n if (interaction.target === this && interaction.interacting()) {\n interaction.stop();\n }\n }\n\n return scope.interact;\n }\n}\n\nscope.interactables.indexOfElement = function indexOfElement (target, context) {\n context = context || scope.document;\n\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n if (interactable.target === target && interactable._context === context) {\n return i;\n }\n }\n return -1;\n};\n\nscope.interactables.get = function interactableGet (element, options, dontCheckInContext) {\n const ret = this[this.indexOfElement(element, options && options.context)];\n\n return ret && (is.string(element) || dontCheckInContext || ret.inContext(element))? ret : null;\n};\n\nscope.interactables.forEachSelector = function (callback, element) {\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n // skip non CSS selector targets and out of context elements\n if (!is.string(interactable.target)\n || (element && !interactable.inContext(element))) {\n continue;\n }\n\n const ret = callback(interactable, interactable.target, interactable._context, i, this);\n\n if (ret !== undefined) {\n return ret;\n }\n }\n};\n\n// all interact.js eventTypes\nInteractable.eventTypes = scope.eventTypes = [];\n\nInteractable.signals = signals;\n\nInteractable.settingsMethods = [ 'deltaSource', 'origin', 'preventDefault', 'rectChecker' ];\n\nmodule.exports = Interactable;\n","const scope = require('./scope');\nconst utils = require('./utils');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst domObjects = require('./utils/domObjects');\nconst finder = require('./utils/interactionFinder');\nconst signals = require('./utils/Signals').new();\n\nconst listeners = {};\nconst methodNames = [\n 'pointerDown', 'pointerMove', 'pointerUp',\n 'updatePointer', 'removePointer',\n];\n\n// for ignoring browser's simulated mouse events\nlet prevTouchTime = 0;\n\n// all active and idle interactions\nscope.interactions = [];\n\nclass Interaction {\n constructor ({ pointerType }) {\n this.target = null; // current interactable being interacted with\n this.element = null; // the target element of the interactable\n\n this.prepared = { // action that's ready to be fired on next move event\n name : null,\n axis : null,\n edges: null,\n };\n\n // keep track of added pointers\n this.pointers = [];\n this.pointerIds = [];\n this.downTargets = [];\n this.downTimes = [];\n\n // Previous native pointer move event coordinates\n this.prevCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n // current native pointer move event coordinates\n this.curCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Starting InteractEvent pointer coordinates\n this.startCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Change in coordinates and time of the pointer\n this.pointerDelta = {\n page : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n client : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n timeStamp: 0,\n };\n\n this.downEvent = null; // pointerdown/mousedown/touchstart event\n this.downPointer = {};\n\n this._eventTarget = null;\n this._curEventTarget = null;\n\n this.prevEvent = null; // previous action event\n\n this.pointerIsDown = false;\n this.pointerWasMoved = false;\n this._interacting = false;\n\n this.pointerType = pointerType;\n\n signals.fire('new', this);\n\n scope.interactions.push(this);\n }\n\n pointerDown (pointer, event, eventTarget) {\n const pointerIndex = this.updatePointer(pointer, event, true);\n\n signals.fire('down', {\n pointer,\n event,\n eventTarget,\n pointerIndex,\n interaction: this,\n });\n }\n\n /*\\\n * Interaction.start\n [ method ]\n *\n * Start an action with the given Interactable and Element as tartgets. The\n * action must be enabled for the target Interactable and an appropriate number\n * of pointers must be held down - 1 for drag/resize, 2 for gesture.\n *\n * Use it with `interactable.able({ manualStart: false })` to always\n * [start actions manually](https://github.com/taye/interact.js/issues/114)\n *\n - action (object) The action to be performed - drag, resize, etc.\n - target (Interactable) The Interactable to target\n - element (Element) The DOM Element to target\n = (object) interact\n **\n | interact(target)\n | .draggable({\n | // disable the default drag start by down->move\n | manualStart: true\n | })\n | // start dragging after the user holds the pointer down\n | .on('hold', function (event) {\n | var interaction = event.interaction;\n |\n | if (!interaction.interacting()) {\n | interaction.start({ name: 'drag' },\n | event.interactable,\n | event.currentTarget);\n | }\n | });\n \\*/\n start (action, target, element) {\n if (this.interacting()\n || !this.pointerIsDown\n || this.pointerIds.length < (action.name === 'gesture'? 2 : 1)) {\n return;\n }\n\n // if this interaction had been removed after stopping\n // add it back\n if (utils.indexOf(scope.interactions, this) === -1) {\n scope.interactions.push(this);\n }\n\n utils.copyAction(this.prepared, action);\n this.target = target;\n this.element = element;\n\n signals.fire('action-start', {\n interaction: this,\n event: this.downEvent,\n });\n }\n\n pointerMove (pointer, event, eventTarget) {\n if (!this.simulation) {\n this.updatePointer(pointer);\n utils.setCoords(this.curCoords, this.pointers);\n }\n\n const duplicateMove = (this.curCoords.page.x === this.prevCoords.page.x\n && this.curCoords.page.y === this.prevCoords.page.y\n && this.curCoords.client.x === this.prevCoords.client.x\n && this.curCoords.client.y === this.prevCoords.client.y);\n\n let dx;\n let dy;\n\n // register movement greater than pointerMoveTolerance\n if (this.pointerIsDown && !this.pointerWasMoved) {\n dx = this.curCoords.client.x - this.startCoords.client.x;\n dy = this.curCoords.client.y - this.startCoords.client.y;\n\n this.pointerWasMoved = utils.hypot(dx, dy) > Interaction.pointerMoveTolerance;\n }\n\n const signalArg = {\n pointer,\n pointerIndex: this.getPointerIndex(pointer),\n event,\n eventTarget,\n dx,\n dy,\n duplicate: duplicateMove,\n interaction: this,\n interactingBeforeMove: this.interacting(),\n };\n\n if (!duplicateMove) {\n // set pointer coordinate, time changes and speeds\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n }\n\n signals.fire('move', signalArg);\n\n if (!duplicateMove) {\n // if interacting, fire an 'action-move' signal etc\n if (this.interacting()) {\n this.doMove(signalArg);\n }\n\n if (this.pointerWasMoved) {\n utils.copyCoords(this.prevCoords, this.curCoords);\n }\n }\n }\n\n /*\\\n * Interaction.doMove\n [ method ]\n *\n * Force a move of the current action at the same coordinates. Useful if\n * snap/restrict has been changed and you want a movement with the new\n * settings.\n *\n **\n | interact(target)\n | .draggable(true)\n | .on('dragmove', function (event) {\n | if (someCondition) {\n | // change the snap settings\n | event.interactable.draggable({ snap: { targets: [] }});\n | // fire another move event with re-calculated snap\n | event.interaction.doMove();\n | }\n | });\n \\*/\n doMove (signalArg) {\n signalArg = utils.extend({\n pointer: this.pointers[0],\n event: this.prevEvent,\n eventTarget: this._eventTarget,\n interaction: this,\n }, signalArg || {});\n\n signals.fire('before-action-move', signalArg);\n\n if (!this._dontFireMove) {\n signals.fire('action-move', signalArg);\n }\n\n this._dontFireMove = false;\n }\n\n // End interact move events and stop auto-scroll unless simulation is running\n pointerUp (pointer, event, eventTarget, curEventTarget) {\n const pointerIndex = this.getPointerIndex(pointer);\n\n signals.fire(/cancel$/i.test(event.type)? 'cancel' : 'up', {\n pointer,\n pointerIndex,\n event,\n eventTarget,\n curEventTarget,\n interaction: this,\n });\n\n if (!this.simulation) {\n this.end(event);\n }\n\n this.pointerIsDown = false;\n this.removePointer(pointer, event);\n }\n\n /*\\\n * Interaction.end\n [ method ]\n *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n - event (PointerEvent) #optional\n **\n | interact(target)\n | .draggable(true)\n | .on('move', function (event) {\n | if (event.pageX > 1000) {\n | // end the current action\n | event.interaction.end();\n | // stop all further listeners from being called\n | event.stopImmediatePropagation();\n | }\n | });\n \\*/\n end (event) {\n event = event || this.prevEvent;\n\n if (this.interacting()) {\n signals.fire('action-end', {\n event,\n interaction: this,\n });\n }\n\n this.stop();\n }\n\n currentAction () {\n return this._interacting? this.prepared.name: null;\n }\n\n interacting () {\n return this._interacting;\n }\n\n stop () {\n signals.fire('stop', { interaction: this });\n\n if (this._interacting) {\n signals.fire('stop-active', { interaction: this });\n signals.fire('stop-' + this.prepared.name, { interaction: this });\n }\n\n this.target = this.element = null;\n\n this._interacting = false;\n this.prepared.name = this.prevEvent = null;\n }\n\n getPointerIndex (pointer) {\n // mouse and pen interactions may have only one pointer\n if (this.pointerType === 'mouse' || this.pointerType === 'pen') {\n return 0;\n }\n\n return utils.indexOf(this.pointerIds, utils.getPointerId(pointer));\n }\n\n updatePointer (pointer, event, down = event && /(down|start)$/i.test(event.type)) {\n const id = utils.getPointerId(pointer);\n let index = this.getPointerIndex(pointer);\n\n if (index === -1) {\n index = this.pointerIds.length;\n this.pointerIds[index] = id;\n }\n\n if (down) {\n signals.fire('update-pointer-down', {\n pointer,\n event,\n down,\n pointerId: id,\n pointerIndex: index,\n interaction: this,\n });\n }\n\n this.pointers[index] = pointer;\n\n return index;\n }\n\n removePointer (pointer, event) {\n const index = this.getPointerIndex(pointer);\n\n if (index === -1) { return; }\n\n signals.fire('remove-pointer', {\n pointer,\n event,\n pointerIndex: index,\n interaction: this,\n });\n\n this.pointers .splice(index, 1);\n this.pointerIds .splice(index, 1);\n this.downTargets.splice(index, 1);\n this.downTimes .splice(index, 1);\n }\n\n _updateEventTargets (target, currentTarget) {\n this._eventTarget = target;\n this._curEventTarget = currentTarget;\n }\n}\n\nfor (let i = 0, len = methodNames.length; i < len; i++) {\n const method = methodNames[i];\n\n listeners[method] = doOnInteractions(method);\n}\n\nfunction doOnInteractions (method) {\n return (function (event) {\n const pointerType = utils.getPointerType(event);\n const [eventTarget, curEventTarget] = utils.getEventTargets(event);\n const matches = []; // [ [pointer, interaction], ...]\n\n if (browser.supportsTouch && /touch/.test(event.type)) {\n prevTouchTime = new Date().getTime();\n\n for (let i = 0; i < event.changedTouches.length; i++) {\n const pointer = event.changedTouches[i];\n const interaction = finder.search(pointer, event.type, eventTarget);\n\n matches.push([pointer, interaction || new Interaction({ pointerType })]);\n }\n }\n else {\n let invalidPointer = false;\n\n if (!browser.supportsPointerEvent && /mouse/.test(event.type)) {\n // ignore mouse events while touch interactions are active\n for (let i = 0; i < scope.interactions.length && !invalidPointer; i++) {\n invalidPointer = scope.interactions[i].pointerType !== 'mouse' && scope.interactions[i].pointerIsDown;\n }\n\n // try to ignore mouse events that are simulated by the browser\n // after a touch event\n invalidPointer = invalidPointer\n || (new Date().getTime() - prevTouchTime < 500)\n // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated\n || event.timeStamp === 0;\n }\n\n if (!invalidPointer) {\n let interaction = finder.search(event, event.type, eventTarget);\n\n if (!interaction) {\n interaction = new Interaction({ pointerType });\n }\n\n matches.push([event, interaction]);\n }\n }\n\n for (const [pointer, interaction] of matches) {\n interaction._updateEventTargets(eventTarget, curEventTarget);\n interaction[method](pointer, event, eventTarget, curEventTarget);\n }\n });\n}\n\nfunction endAll (event) {\n for (let i = 0; i < scope.interactions.length; i++) {\n const interaction = scope.interactions[i];\n\n interaction.end(event);\n signals.fire('endall', { event, interaction });\n }\n}\n\nconst docEvents = { /* 'eventType': listenerFunc */ };\nconst pEventTypes = browser.pEventTypes;\n\nif (domObjects.PointerEvent) {\n docEvents[pEventTypes.down ] = listeners.pointerDown;\n docEvents[pEventTypes.move ] = listeners.pointerMove;\n docEvents[pEventTypes.up ] = listeners.pointerUp;\n docEvents[pEventTypes.cancel] = listeners.pointerUp;\n}\nelse {\n docEvents.mousedown = listeners.pointerDown;\n docEvents.mousemove = listeners.pointerMove;\n docEvents.mouseup = listeners.pointerUp;\n\n docEvents.touchstart = listeners.pointerDown;\n docEvents.touchmove = listeners.pointerMove;\n docEvents.touchend = listeners.pointerUp;\n docEvents.touchcancel = listeners.pointerUp;\n}\n\ndocEvents.blur = endAll;\n\nfunction onDocSignal ({ doc }, signalName) {\n const eventMethod = signalName.indexOf('add') === 0\n ? events.add : events.remove;\n\n // delegate event listener\n for (const eventType in scope.delegatedEvents) {\n eventMethod(doc, eventType, events.delegateListener);\n eventMethod(doc, eventType, events.delegateUseCapture, true);\n }\n\n for (const eventType in docEvents) {\n eventMethod(doc, eventType, docEvents[eventType]);\n }\n}\n\nsignals.on('update-pointer-down', ({ interaction, pointer, pointerId, pointerIndex, event, eventTarget, down }) => {\n interaction.pointerIds[pointerIndex] = pointerId;\n interaction.pointers[pointerIndex] = pointer;\n\n if (down) {\n interaction.pointerIsDown = true;\n }\n\n if (!interaction.interacting()) {\n utils.setCoords(interaction.startCoords, interaction.pointers);\n\n utils.copyCoords(interaction.curCoords , interaction.startCoords);\n utils.copyCoords(interaction.prevCoords, interaction.startCoords);\n\n interaction.downEvent = event;\n interaction.downTimes[pointerIndex] = interaction.curCoords.timeStamp;\n interaction.downTargets[pointerIndex] = eventTarget || event && utils.getEventTargets(event)[0];\n interaction.pointerWasMoved = false;\n\n utils.pointerExtend(interaction.downPointer, pointer);\n }\n});\n\nscope.signals.on('add-document' , onDocSignal);\nscope.signals.on('remove-document', onDocSignal);\n\nInteraction.pointerMoveTolerance = 1;\nInteraction.doOnInteractions = doOnInteractions;\nInteraction.endAll = endAll;\nInteraction.signals = signals;\nInteraction.docEvents = docEvents;\n\nscope.endAllInteractions = endAll;\n\nmodule.exports = Interaction;\n","const Interaction = require('../Interaction');\nconst InteractEvent = require('../InteractEvent');\n\nconst actions = {\n firePrepared,\n names: [],\n methodDict: {},\n};\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n interaction._interacting = true;\n firePrepared(interaction, event, 'start');\n});\n\nInteraction.signals.on('action-move', function ({ interaction, event, preEnd }) {\n firePrepared(interaction, event, 'move', preEnd);\n\n // if the action was ended in a listener\n if (!interaction.interacting()) { return false; }\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n firePrepared(interaction, event, 'end');\n});\n\nfunction firePrepared (interaction, event, phase, preEnd) {\n const actionName = interaction.prepared.name;\n\n const newEvent = new InteractEvent(interaction, event, actionName, phase, interaction.element, null, preEnd);\n\n interaction.target.fire(newEvent);\n interaction.prevEvent = newEvent;\n}\n\nmodule.exports = actions;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drag = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n startAxis : 'xy',\n lockAxis : 'xy',\n },\n\n checker: function (pointer, event, interactable) {\n const dragOptions = interactable.options.drag;\n\n return dragOptions.enabled\n ? { name: 'drag', axis: (dragOptions.lockAxis === 'start'\n ? dragOptions.startAxis\n : dragOptions.lockAxis)}\n : null;\n },\n\n getCursor: function () {\n return 'move';\n },\n};\n\nInteraction.signals.on('before-action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n interaction.curCoords.page.y = interaction.startCoords.page.y;\n interaction.curCoords.client.y = interaction.startCoords.client.y;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vx);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vx);\n interaction.pointerDelta.client.vy = 0;\n interaction.pointerDelta.page.vy = 0;\n }\n else if (axis === 'y') {\n interaction.curCoords.page.x = interaction.startCoords.page.x;\n interaction.curCoords.client.x = interaction.startCoords.client.x;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vy);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vy);\n interaction.pointerDelta.client.vx = 0;\n interaction.pointerDelta.page.vx = 0;\n }\n});\n\n// dragmove\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'dragmove') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n iEvent.pageY = interaction.startCoords.page.y;\n iEvent.clientY = interaction.startCoords.client.y;\n iEvent.dy = 0;\n }\n else if (axis === 'y') {\n iEvent.pageX = interaction.startCoords.page.x;\n iEvent.clientX = interaction.startCoords.client.x;\n iEvent.dx = 0;\n }\n});\n\n/*\\\n * Interactable.draggable\n [ method ]\n *\n * Gets or sets whether drag actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of drag events\n | var isDraggable = interact('ul li').draggable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on drag events (object makes the Interactable draggable)\n = (object) This Interactable\n | interact(element).draggable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // the axis in which the first movement must be\n | // for the drag sequence to start\n | // 'xy' by default - any direction\n | startAxis: 'x' || 'y' || 'xy',\n |\n | // 'xy' by default - don't restrict to one axis (move in any direction)\n | // 'x' or 'y' to restrict movement to either axis\n | // 'start' to restrict movement to the axis the drag started in\n | lockAxis: 'x' || 'y' || 'xy' || 'start',\n |\n | // max number of drags that can happen concurrently\n | // with elements of this Interactable. Infinity by default\n | max: Infinity,\n |\n | // max number of drags that can target the same element+Interactable\n | // 1 by default\n | maxPerElement: 2\n | });\n\\*/\nInteractable.prototype.draggable = function (options) {\n if (utils.is.object(options)) {\n this.options.drag.enabled = options.enabled === false? false: true;\n this.setPerAction('drag', options);\n this.setOnEvents('drag', options);\n\n if (/^(xy|x|y|start)$/.test(options.lockAxis)) {\n this.options.drag.lockAxis = options.lockAxis;\n }\n if (/^(xy|x|y)$/.test(options.startAxis)) {\n this.options.drag.startAxis = options.startAxis;\n }\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drag.enabled = options;\n\n if (!options) {\n this.ondragstart = this.ondragstart = this.ondragend = null;\n }\n\n return this;\n }\n\n return this.options.drag;\n};\n\nactions.drag = drag;\nactions.names.push('drag');\nutils.merge(Interactable.eventTypes, [\n 'dragstart',\n 'dragmove',\n 'draginertiastart',\n 'draginertiaresume',\n 'dragend',\n]);\nactions.methodDict.drag = 'draggable';\n\ndefaultOptions.drag = drag.defaults;\n\nmodule.exports = drag;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst scope = require('../scope');\nconst interact = require('../interact');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drop = {\n defaults: {\n enabled: false,\n accept : null,\n overlap: 'pointer',\n },\n};\n\nlet dynamicDrop = false;\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // reset active dropzones\n interaction.activeDrops.dropzones = [];\n interaction.activeDrops.elements = [];\n interaction.activeDrops.rects = [];\n\n interaction.dropEvents = null;\n\n if (!interaction.dynamicDrop) {\n setActiveDrops(interaction, interaction.element);\n }\n\n const dragEvent = interaction.prevEvent;\n const dropEvents = getDropEvents(interaction, event, dragEvent);\n\n if (dropEvents.activate) {\n fireActiveDrops(interaction, dropEvents.activate);\n }\n});\n\nInteractEvent.signals.on('new', function ({ interaction, iEvent, event }) {\n if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { return; }\n\n const draggableElement = interaction.element;\n const dragEvent = iEvent;\n const dropResult = getDrop(dragEvent, event, draggableElement);\n\n interaction.dropTarget = dropResult.dropzone;\n interaction.dropElement = dropResult.element;\n\n interaction.dropEvents = getDropEvents(interaction, event, dragEvent);\n});\n\nInteraction.signals.on('action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n fireDropEvents(interaction, interaction.dropEvents);\n});\n\nInteraction.signals.on('action-end', function ({ interaction }) {\n if (interaction.prepared.name === 'drag') {\n fireDropEvents(interaction, interaction.dropEvents);\n }\n});\n\nInteraction.signals.on('stop-drag', function ({ interaction }) {\n interaction.activeDrops.dropzones =\n interaction.activeDrops.elements =\n interaction.activeDrops.rects =\n interaction.dropEvents = null;\n});\n\nfunction collectDrops (interaction, element) {\n const drops = [];\n const elements = [];\n\n element = element || interaction.element;\n\n // collect all dropzones and their elements which qualify for a drop\n for (const current of scope.interactables) {\n if (!current.options.drop.enabled) { continue; }\n\n const accept = current.options.drop.accept;\n\n // test the draggable element against the dropzone's accept setting\n if ((utils.is.element(accept) && accept !== element)\n || (utils.is.string(accept)\n && !utils.matchesSelector(element, accept))) {\n\n continue;\n }\n\n // query for new elements if necessary\n const dropElements = utils.is.string(current.target)\n ? current._context.querySelectorAll(current.target)\n : [current.target];\n\n for (let i = 0; i < dropElements.length; i++) {\n const currentElement = dropElements[i];\n\n if (currentElement !== element) {\n drops.push(current);\n elements.push(currentElement);\n }\n }\n }\n\n return {\n elements,\n dropzones: drops,\n };\n}\n\nfunction fireActiveDrops (interaction, event) {\n let prevElement;\n\n // loop through all active dropzones and trigger event\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n const current = interaction.activeDrops.dropzones[i];\n const currentElement = interaction.activeDrops.elements [i];\n\n // prevent trigger of duplicate events on same element\n if (currentElement !== prevElement) {\n // set current element as event target\n event.target = currentElement;\n current.fire(event);\n }\n prevElement = currentElement;\n }\n}\n\n// Collect a new set of possible drops and save them in activeDrops.\n// setActiveDrops should always be called when a drag has just started or a\n// drag event happens while dynamicDrop is true\nfunction setActiveDrops (interaction, dragElement) {\n // get dropzones and their elements that could receive the draggable\n const possibleDrops = collectDrops(interaction, dragElement, true);\n\n interaction.activeDrops.dropzones = possibleDrops.dropzones;\n interaction.activeDrops.elements = possibleDrops.elements;\n interaction.activeDrops.rects = [];\n\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n interaction.activeDrops.rects[i] =\n interaction.activeDrops.dropzones[i].getRect(interaction.activeDrops.elements[i]);\n }\n}\n\nfunction getDrop (dragEvent, event, dragElement) {\n const interaction = dragEvent.interaction;\n const validDrops = [];\n\n if (dynamicDrop) {\n setActiveDrops(interaction, dragElement);\n }\n\n // collect all dropzones and their elements which qualify for a drop\n for (let j = 0; j < interaction.activeDrops.dropzones.length; j++) {\n const current = interaction.activeDrops.dropzones[j];\n const currentElement = interaction.activeDrops.elements [j];\n const rect = interaction.activeDrops.rects [j];\n\n validDrops.push(current.dropCheck(dragEvent, event, interaction.target, dragElement, currentElement, rect)\n ? currentElement\n : null);\n }\n\n // get the most appropriate dropzone based on DOM depth and order\n const dropIndex = utils.indexOfDeepestElement(validDrops);\n\n return {\n dropzone: interaction.activeDrops.dropzones[dropIndex] || null,\n element : interaction.activeDrops.elements [dropIndex] || null,\n };\n}\n\nfunction getDropEvents (interaction, pointerEvent, dragEvent) {\n const dropEvents = {\n enter : null,\n leave : null,\n activate : null,\n deactivate: null,\n move : null,\n drop : null,\n };\n\n const tmpl = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n };\n\n if (interaction.dropElement !== interaction.prevDropElement) {\n // if there was a prevDropTarget, create a dragleave event\n if (interaction.prevDropTarget) {\n dropEvents.leave = utils.extend({ type: 'dragleave' }, tmpl);\n\n dragEvent.dragLeave = dropEvents.leave.target = interaction.prevDropElement;\n dragEvent.prevDropzone = dropEvents.leave.dropzone = interaction.prevDropTarget;\n }\n // if the dropTarget is not null, create a dragenter event\n if (interaction.dropTarget) {\n dropEvents.enter = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n type : 'dragenter',\n };\n\n dragEvent.dragEnter = interaction.dropElement;\n dragEvent.dropzone = interaction.dropTarget;\n }\n }\n\n if (dragEvent.type === 'dragend' && interaction.dropTarget) {\n dropEvents.drop = utils.extend({ type: 'drop' }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n dragEvent.relatedTarget = interaction.dropElement;\n }\n if (dragEvent.type === 'dragstart') {\n dropEvents.activate = utils.extend({ type: 'dropactivate' }, tmpl);\n\n dropEvents.activate.target = null;\n dropEvents.activate.dropzone = null;\n }\n if (dragEvent.type === 'dragend') {\n dropEvents.deactivate = utils.extend({ type: 'dropdeactivate' }, tmpl);\n\n dropEvents.deactivate.target = null;\n dropEvents.deactivate.dropzone = null;\n }\n if (dragEvent.type === 'dragmove' && interaction.dropTarget) {\n dropEvents.move = utils.extend({\n dragmove : dragEvent,\n type : 'dropmove',\n }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n }\n\n return dropEvents;\n}\n\nfunction fireDropEvents (interaction, dropEvents) {\n if (dropEvents.leave) { interaction.prevDropTarget.fire(dropEvents.leave); }\n if (dropEvents.move ) { interaction.dropTarget.fire(dropEvents.move ); }\n if (dropEvents.enter) { interaction.dropTarget.fire(dropEvents.enter); }\n if (dropEvents.drop ) { interaction.dropTarget.fire(dropEvents.drop ); }\n if (dropEvents.deactivate) {\n fireActiveDrops(interaction, dropEvents.deactivate);\n }\n\n interaction.prevDropTarget = interaction.dropTarget;\n interaction.prevDropElement = interaction.dropElement;\n}\n\n/*\\\n * Interactable.dropzone\n [ method ]\n *\n * Returns or sets whether elements can be dropped onto this\n * Interactable to trigger drop events\n *\n * Dropzones can receive the following events:\n * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends\n * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone\n * - `dragmove` when a draggable that has entered the dropzone is moved\n * - `drop` when a draggable is dropped into this dropzone\n *\n * Use the `accept` option to allow only elements that match the given CSS\n * selector or element. The value can be:\n *\n * - **an Element** - only that element can be dropped into this dropzone.\n * - **a string**, - the element being dragged must match it as a CSS selector.\n * - **`null`** - accept options is cleared - it accepts any element.\n *\n * Use the `overlap` option to set how drops are checked for. The allowed\n * values are:\n *\n * - `'pointer'`, the pointer must be over the dropzone (default)\n * - `'center'`, the draggable element's center must be over the dropzone\n * - a number from 0-1 which is the `(intersection area) / (draggable area)`.\n * e.g. `0.5` for drop to happen when half of the area of the draggable is\n * over the dropzone\n *\n * Use the `checker` option to specify a function to check if a dragged\n * element is over this Interactable.\n *\n | interact(target)\n | .dropChecker(function(dragEvent, // related dragmove or dragend event\n | event, // TouchEvent/PointerEvent/MouseEvent\n | dropped, // bool result of the default checker\n | dropzone, // dropzone Interactable\n | dropElement, // dropzone elemnt\n | draggable, // draggable Interactable\n | draggableElement) {// draggable element\n |\n | return dropped && event.target.hasAttribute('allow-drop');\n | }\n *\n *\n - options (boolean | object | null) #optional The new value to be set.\n | interact('.drop').dropzone({\n | accept: '.can-drop' || document.getElementById('single-drop'),\n | overlap: 'pointer' || 'center' || zeroToOne\n | }\n = (boolean | object) The current setting or this Interactable\n\\*/\nInteractable.prototype.dropzone = function (options) {\n if (utils.is.object(options)) {\n this.options.drop.enabled = options.enabled === false? false: true;\n\n if (utils.is.function(options.ondrop) ) { this.events.ondrop = options.ondrop ; }\n if (utils.is.function(options.ondropactivate) ) { this.events.ondropactivate = options.ondropactivate ; }\n if (utils.is.function(options.ondropdeactivate)) { this.events.ondropdeactivate = options.ondropdeactivate; }\n if (utils.is.function(options.ondragenter) ) { this.events.ondragenter = options.ondragenter ; }\n if (utils.is.function(options.ondragleave) ) { this.events.ondragleave = options.ondragleave ; }\n if (utils.is.function(options.ondropmove) ) { this.events.ondropmove = options.ondropmove ; }\n\n if (/^(pointer|center)$/.test(options.overlap)) {\n this.options.drop.overlap = options.overlap;\n }\n else if (utils.is.number(options.overlap)) {\n this.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0);\n }\n if ('accept' in options) {\n this.options.drop.accept = options.accept;\n }\n if ('checker' in options) {\n this.options.drop.checker = options.checker;\n }\n\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drop.enabled = options;\n\n if (!options) {\n this.ondragenter = this.ondragleave = this.ondrop\n = this.ondropactivate = this.ondropdeactivate = null;\n }\n\n return this;\n }\n\n return this.options.drop;\n};\n\nInteractable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) {\n let dropped = false;\n\n // if the dropzone has no rect (eg. display: none)\n // call the custom dropChecker or just return false\n if (!(rect = rect || this.getRect(dropElement))) {\n return (this.options.drop.checker\n ? this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement)\n : false);\n }\n\n const dropOverlap = this.options.drop.overlap;\n\n if (dropOverlap === 'pointer') {\n const origin = utils.getOriginXY(draggable, draggableElement, 'drag');\n const page = utils.getPageXY(dragEvent);\n\n page.x += origin.x;\n page.y += origin.y;\n\n const horizontal = (page.x > rect.left) && (page.x < rect.right);\n const vertical = (page.y > rect.top ) && (page.y < rect.bottom);\n\n dropped = horizontal && vertical;\n }\n\n const dragRect = draggable.getRect(draggableElement);\n\n if (dragRect && dropOverlap === 'center') {\n const cx = dragRect.left + dragRect.width / 2;\n const cy = dragRect.top + dragRect.height / 2;\n\n dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom;\n }\n\n if (dragRect && utils.is.number(dropOverlap)) {\n const overlapArea = (Math.max(0, Math.min(rect.right , dragRect.right ) - Math.max(rect.left, dragRect.left))\n * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top , dragRect.top )));\n\n const overlapRatio = overlapArea / (dragRect.width * dragRect.height);\n\n dropped = overlapRatio >= dropOverlap;\n }\n\n if (this.options.drop.checker) {\n dropped = this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement);\n }\n\n return dropped;\n};\n\nInteractable.signals.on('unset', function ({ interactable }) {\n interactable.dropzone(false);\n});\n\nInteractable.settingsMethods.push('dropChecker');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.dropTarget = null; // the dropzone a drag target might be dropped into\n interaction.dropElement = null; // the element at the time of checking\n interaction.prevDropTarget = null; // the dropzone that was recently dragged away from\n interaction.prevDropElement = null; // the element at the time of checking\n interaction.dropEvents = null; // the dropEvents related to the current drag event\n\n interaction.activeDrops = {\n dropzones: [], // the dropzones that are mentioned below\n elements : [], // elements of dropzones that accept the target draggable\n rects : [], // the rects of the elements mentioned above\n };\n\n});\n\nInteraction.signals.on('stop', function ({ interaction }) {\n interaction.dropTarget = interaction.dropElement =\n interaction.prevDropTarget = interaction.prevDropElement = null;\n});\n\n/*\\\n * interact.dynamicDrop\n [ method ]\n *\n * Returns or sets whether the dimensions of dropzone elements are\n * calculated on every dragmove or only on dragstart for the default\n * dropChecker\n *\n - newValue (boolean) #optional True to check on each move. False to check only before start\n = (boolean | interact) The current setting or interact\n\\*/\ninteract.dynamicDrop = function (newValue) {\n if (utils.is.bool(newValue)) {\n //if (dragging && dynamicDrop !== newValue && !newValue) {\n //calcRects(dropzones);\n //}\n\n dynamicDrop = newValue;\n\n return interact;\n }\n return dynamicDrop;\n};\n\nutils.merge(Interactable.eventTypes, [\n 'dragenter',\n 'dragleave',\n 'dropactivate',\n 'dropdeactivate',\n 'dropmove',\n 'drop',\n]);\nactions.methodDict.drop = 'dropzone';\n\ndefaultOptions.drop = drop.defaults;\n\nmodule.exports = drop;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst gesture = {\n defaults: {\n enabled : false,\n origin : null,\n restrict: null,\n },\n\n checker: function (pointer, event, interactable, element, interaction) {\n if (interaction.pointerIds.length >= 2) {\n return { name: 'gesture' };\n }\n\n return null;\n },\n\n getCursor: function () {\n return '';\n },\n};\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturestart') { return; }\n iEvent.ds = 0;\n\n interaction.gesture.startDistance = interaction.gesture.prevDistance = iEvent.distance;\n interaction.gesture.startAngle = interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.scale = 1;\n});\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturemove') { return; }\n\n iEvent.ds = iEvent.scale - interaction.gesture.scale;\n\n interaction.target.fire(iEvent);\n\n interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.prevDistance = iEvent.distance;\n\n if (iEvent.scale !== Infinity\n && iEvent.scale !== null\n && iEvent.scale !== undefined\n && !isNaN(iEvent.scale)) {\n\n interaction.gesture.scale = iEvent.scale;\n }\n});\n\n/*\\\n * Interactable.gesturable\n [ method ]\n *\n * Gets or sets whether multitouch gestures can be performed on the\n * Interactable's element\n *\n = (boolean) Indicates if this can be the target of gesture events\n | var isGestureable = interact(element).gesturable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on gesture events (makes the Interactable gesturable)\n = (object) this Interactable\n | interact(element).gesturable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // limit multiple gestures.\n | // See the explanation in @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n\\*/\nInteractable.prototype.gesturable = function (options) {\n if (utils.is.object(options)) {\n this.options.gesture.enabled = options.enabled === false? false: true;\n this.setPerAction('gesture', options);\n this.setOnEvents('gesture', options);\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.gesture.enabled = options;\n\n if (!options) {\n this.ongesturestart = this.ongesturestart = this.ongestureend = null;\n }\n\n return this;\n }\n\n return this.options.gesture;\n};\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action, event, starting, ending, deltaSource }) {\n if (action !== 'gesture') { return; }\n\n const pointers = interaction.pointers;\n\n iEvent.touches = [pointers[0], pointers[1]];\n\n if (starting) {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = 1;\n iEvent.ds = 0;\n iEvent.angle = utils.touchAngle(pointers, undefined, deltaSource);\n iEvent.da = 0;\n }\n else if (ending || event instanceof InteractEvent) {\n iEvent.distance = interaction.prevEvent.distance;\n iEvent.box = interaction.prevEvent.box;\n iEvent.scale = interaction.prevEvent.scale;\n iEvent.ds = iEvent.scale - 1;\n iEvent.angle = interaction.prevEvent.angle;\n iEvent.da = iEvent.angle - interaction.gesture.startAngle;\n }\n else {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = iEvent.distance / interaction.gesture.startDistance;\n iEvent.angle = utils.touchAngle(pointers, interaction.gesture.prevAngle, deltaSource);\n\n iEvent.ds = iEvent.scale - interaction.gesture.prevScale;\n iEvent.da = iEvent.angle - interaction.gesture.prevAngle;\n }\n});\n\nInteraction.signals.on('new', function (interaction) {\n interaction.gesture = {\n start: { x: 0, y: 0 },\n\n startDistance: 0, // distance between two touches of touchStart\n prevDistance : 0,\n distance : 0,\n\n scale: 1, // gesture.distance / gesture.startDistance\n\n startAngle: 0, // angle of line joining two touches\n prevAngle : 0, // angle of the previous gesture event\n };\n});\n\nactions.gesture = gesture;\nactions.names.push('gesture');\nutils.merge(Interactable.eventTypes, [\n 'gesturestart',\n 'gesturemove',\n 'gestureend',\n]);\nactions.methodDict.gesture = 'gesturable';\n\ndefaultOptions.gesture = gesture.defaults;\n\nmodule.exports = gesture;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\n// Less Precision with touch input\nconst defaultMargin = browser.supportsTouch || browser.supportsPointerEvent? 20: 10;\n\nconst resize = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n square: false,\n preserveAspectRatio: false,\n axis: 'xy',\n\n // use default margin\n margin: NaN,\n\n // object with props left, right, top, bottom which are\n // true/false values to resize when the pointer is over that edge,\n // CSS selectors to match the handles for each direction\n // or the Elements for each handle\n edges: null,\n\n // a value of 'none' will limit the resize rect to a minimum of 0x0\n // 'negate' will alow the rect to have negative width/height\n // 'reposition' will keep the width/height positive by swapping\n // the top and bottom edges and/or swapping the left and right edges\n invert: 'none',\n },\n\n checker: function (pointer, event, interactable, element, interaction, rect) {\n if (!rect) { return null; }\n\n const page = utils.extend({}, interaction.curCoords.page);\n const options = interactable.options;\n\n if (options.resize.enabled) {\n const resizeOptions = options.resize;\n const resizeEdges = { left: false, right: false, top: false, bottom: false };\n\n // if using resize.edges\n if (utils.is.object(resizeOptions.edges)) {\n for (const edge in resizeEdges) {\n resizeEdges[edge] = checkResizeEdge(edge,\n resizeOptions.edges[edge],\n page,\n interaction._eventTarget,\n element,\n rect,\n resizeOptions.margin || defaultMargin);\n }\n\n resizeEdges.left = resizeEdges.left && !resizeEdges.right;\n resizeEdges.top = resizeEdges.top && !resizeEdges.bottom;\n\n if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) {\n return {\n name: 'resize',\n edges: resizeEdges,\n };\n }\n }\n else {\n const right = options.resize.axis !== 'y' && page.x > (rect.right - defaultMargin);\n const bottom = options.resize.axis !== 'x' && page.y > (rect.bottom - defaultMargin);\n\n if (right || bottom) {\n return {\n name: 'resize',\n axes: (right? 'x' : '') + (bottom? 'y' : ''),\n };\n }\n }\n }\n\n return null;\n },\n\n cursors: (browser.isIe9OrOlder ? {\n x : 'e-resize',\n y : 's-resize',\n xy: 'se-resize',\n\n top : 'n-resize',\n left : 'w-resize',\n bottom : 's-resize',\n right : 'e-resize',\n topleft : 'se-resize',\n bottomright: 'se-resize',\n topright : 'ne-resize',\n bottomleft : 'ne-resize',\n } : {\n x : 'ew-resize',\n y : 'ns-resize',\n xy: 'nwse-resize',\n\n top : 'ns-resize',\n left : 'ew-resize',\n bottom : 'ns-resize',\n right : 'ew-resize',\n topleft : 'nwse-resize',\n bottomright: 'nwse-resize',\n topright : 'nesw-resize',\n bottomleft : 'nesw-resize',\n }),\n\n getCursor: function (action) {\n if (action.axis) {\n return resize.cursors[action.name + action.axis];\n }\n else if (action.edges) {\n let cursorKey = '';\n const edgeNames = ['top', 'bottom', 'left', 'right'];\n\n for (let i = 0; i < 4; i++) {\n if (action.edges[edgeNames[i]]) {\n cursorKey += edgeNames[i];\n }\n }\n\n return resize.cursors[cursorKey];\n }\n },\n};\n\n// resizestart\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'resizestart' || !interaction.prepared.edges) {\n return;\n }\n\n const startRect = interaction.target.getRect(interaction.element);\n const resizeOptions = interaction.target.options.resize;\n\n /*\n * When using the `resizable.square` or `resizable.preserveAspectRatio` options, resizing from one edge\n * will affect another. E.g. with `resizable.square`, resizing to make the right edge larger will make\n * the bottom edge larger by the same amount. We call these 'linked' edges. Any linked edges will depend\n * on the active edges and the edge being interacted with.\n */\n if (resizeOptions.square || resizeOptions.preserveAspectRatio) {\n const linkedEdges = utils.extend({}, interaction.prepared.edges);\n\n linkedEdges.top = linkedEdges.top || (linkedEdges.left && !linkedEdges.bottom);\n linkedEdges.left = linkedEdges.left || (linkedEdges.top && !linkedEdges.right );\n linkedEdges.bottom = linkedEdges.bottom || (linkedEdges.right && !linkedEdges.top );\n linkedEdges.right = linkedEdges.right || (linkedEdges.bottom && !linkedEdges.left );\n\n interaction.prepared._linkedEdges = linkedEdges;\n }\n else {\n interaction.prepared._linkedEdges = null;\n }\n\n // if using `resizable.preserveAspectRatio` option, record aspect ratio at the start of the resize\n if (resizeOptions.preserveAspectRatio) {\n interaction.resizeStartAspectRatio = startRect.width / startRect.height;\n }\n\n interaction.resizeRects = {\n start : startRect,\n current : utils.extend({}, startRect),\n inverted : utils.extend({}, startRect),\n previous : utils.extend({}, startRect),\n delta : {\n left: 0, right : 0, width : 0,\n top : 0, bottom: 0, height: 0,\n },\n };\n\n iEvent.rect = interaction.resizeRects.inverted;\n iEvent.deltaRect = interaction.resizeRects.delta;\n});\n\n// resizemove\nInteractEvent.signals.on('new', function ({ iEvent, phase, interaction }) {\n if (phase !== 'move' || !interaction.prepared.edges) { return; }\n\n const resizeOptions = interaction.target.options.resize;\n const invert = resizeOptions.invert;\n const invertible = invert === 'reposition' || invert === 'negate';\n\n let edges = interaction.prepared.edges;\n\n const start = interaction.resizeRects.start;\n const current = interaction.resizeRects.current;\n const inverted = interaction.resizeRects.inverted;\n const delta = interaction.resizeRects.delta;\n const previous = utils.extend(interaction.resizeRects.previous, inverted);\n const originalEdges = edges;\n\n let dx = iEvent.dx;\n let dy = iEvent.dy;\n\n if (resizeOptions.preserveAspectRatio || resizeOptions.square) {\n // `resize.preserveAspectRatio` takes precedence over `resize.square`\n const startAspectRatio = resizeOptions.preserveAspectRatio\n ? interaction.resizeStartAspectRatio\n : 1;\n\n edges = interaction.prepared._linkedEdges;\n\n if ((originalEdges.left && originalEdges.bottom)\n || (originalEdges.right && originalEdges.top)) {\n dy = -dx / startAspectRatio;\n }\n else if (originalEdges.left || originalEdges.right ) { dy = dx / startAspectRatio; }\n else if (originalEdges.top || originalEdges.bottom) { dx = dy * startAspectRatio; }\n }\n\n // update the 'current' rect without modifications\n if (edges.top ) { current.top += dy; }\n if (edges.bottom) { current.bottom += dy; }\n if (edges.left ) { current.left += dx; }\n if (edges.right ) { current.right += dx; }\n\n if (invertible) {\n // if invertible, copy the current rect\n utils.extend(inverted, current);\n\n if (invert === 'reposition') {\n // swap edge values if necessary to keep width/height positive\n let swap;\n\n if (inverted.top > inverted.bottom) {\n swap = inverted.top;\n\n inverted.top = inverted.bottom;\n inverted.bottom = swap;\n }\n if (inverted.left > inverted.right) {\n swap = inverted.left;\n\n inverted.left = inverted.right;\n inverted.right = swap;\n }\n }\n }\n else {\n // if not invertible, restrict to minimum of 0x0 rect\n inverted.top = Math.min(current.top, start.bottom);\n inverted.bottom = Math.max(current.bottom, start.top);\n inverted.left = Math.min(current.left, start.right);\n inverted.right = Math.max(current.right, start.left);\n }\n\n inverted.width = inverted.right - inverted.left;\n inverted.height = inverted.bottom - inverted.top ;\n\n for (const edge in inverted) {\n delta[edge] = inverted[edge] - previous[edge];\n }\n\n iEvent.edges = interaction.prepared.edges;\n iEvent.rect = inverted;\n iEvent.deltaRect = delta;\n});\n\n/*\\\n * Interactable.resizable\n [ method ]\n *\n * Gets or sets whether resize actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of resize elements\n | var isResizeable = interact('input[type=text]').resizable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on resize events (object makes the Interactable resizable)\n = (object) This Interactable\n | interact(element).resizable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | edges: {\n | top : true, // Use pointer coords to check for resize.\n | left : false, // Disable resizing from left edge.\n | bottom: '.resize-s',// Resize if pointer target matches selector\n | right : handleEl // Resize if pointer target is the given Element\n | },\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height are adjusted at a 1:1 ratio.\n | square: false,\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height maintain the aspect ratio they had when resizing started.\n | preserveAspectRatio: false,\n |\n | // a value of 'none' will limit the resize rect to a minimum of 0x0\n | // 'negate' will allow the rect to have negative width/height\n | // 'reposition' will keep the width/height positive by swapping\n | // the top and bottom edges and/or swapping the left and right edges\n | invert: 'none' || 'negate' || 'reposition'\n |\n | // limit multiple resizes.\n | // See the explanation in the @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n \\*/\nInteractable.prototype.resizable = function (options) {\n if (utils.is.object(options)) {\n this.options.resize.enabled = options.enabled === false? false: true;\n this.setPerAction('resize', options);\n this.setOnEvents('resize', options);\n\n if (/^x$|^y$|^xy$/.test(options.axis)) {\n this.options.resize.axis = options.axis;\n }\n else if (options.axis === null) {\n this.options.resize.axis = defaultOptions.resize.axis;\n }\n\n if (utils.is.bool(options.preserveAspectRatio)) {\n this.options.resize.preserveAspectRatio = options.preserveAspectRatio;\n }\n else if (utils.is.bool(options.square)) {\n this.options.resize.square = options.square;\n }\n\n return this;\n }\n if (utils.is.bool(options)) {\n this.options.resize.enabled = options;\n\n if (!options) {\n this.onresizestart = this.onresizestart = this.onresizeend = null;\n }\n\n return this;\n }\n return this.options.resize;\n};\n\nfunction checkResizeEdge (name, value, page, element, interactableElement, rect, margin) {\n // false, '', undefined, null\n if (!value) { return false; }\n\n // true value, use pointer coords and element rect\n if (value === true) {\n // if dimensions are negative, \"switch\" edges\n const width = utils.is.number(rect.width )? rect.width : rect.right - rect.left;\n const height = utils.is.number(rect.height)? rect.height : rect.bottom - rect.top ;\n\n if (width < 0) {\n if (name === 'left' ) { name = 'right'; }\n else if (name === 'right') { name = 'left' ; }\n }\n if (height < 0) {\n if (name === 'top' ) { name = 'bottom'; }\n else if (name === 'bottom') { name = 'top' ; }\n }\n\n if (name === 'left' ) { return page.x < ((width >= 0? rect.left: rect.right ) + margin); }\n if (name === 'top' ) { return page.y < ((height >= 0? rect.top : rect.bottom) + margin); }\n\n if (name === 'right' ) { return page.x > ((width >= 0? rect.right : rect.left) - margin); }\n if (name === 'bottom') { return page.y > ((height >= 0? rect.bottom: rect.top ) - margin); }\n }\n\n // the remaining checks require an element\n if (!utils.is.element(element)) { return false; }\n\n return utils.is.element(value)\n // the value is an element to use as a resize handle\n ? value === element\n // otherwise check if element matches value as selector\n : utils.matchesUpTo(element, value, interactableElement);\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.resizeAxes = 'xy';\n});\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action }) {\n if (action !== 'resize' || !interaction.resizeAxes) { return; }\n\n const options = interaction.target.options;\n\n if (options.resize.square) {\n if (interaction.resizeAxes === 'y') {\n iEvent.dx = iEvent.dy;\n }\n else {\n iEvent.dy = iEvent.dx;\n }\n iEvent.axes = 'xy';\n }\n else {\n iEvent.axes = interaction.resizeAxes;\n\n if (interaction.resizeAxes === 'x') {\n iEvent.dy = 0;\n }\n else if (interaction.resizeAxes === 'y') {\n iEvent.dx = 0;\n }\n }\n});\n\nactions.resize = resize;\nactions.names.push('resize');\nutils.merge(Interactable.eventTypes, [\n 'resizestart',\n 'resizemove',\n 'resizeinertiastart',\n 'resizeinertiaresume',\n 'resizeend',\n]);\nactions.methodDict.resize = 'resizable';\n\ndefaultOptions.resize = resize.defaults;\n\nmodule.exports = resize;\n","const raf = require('./utils/raf');\nconst getWindow = require('./utils/window').getWindow;\nconst is = require('./utils/is');\nconst domUtils = require('./utils/domUtils');\nconst Interaction = require('./Interaction');\nconst defaultOptions = require('./defaultOptions');\n\nconst autoScroll = {\n defaults: {\n enabled : false,\n container: null, // the item that is scrolled (Window or HTMLElement)\n margin : 60,\n speed : 300, // the scroll speed in pixels per second\n },\n\n interaction: null,\n i: null, // the handle returned by window.setInterval\n x: 0, y: 0, // Direction each pulse is to scroll in\n\n isScrolling: false,\n prevTime: 0,\n\n start: function (interaction) {\n autoScroll.isScrolling = true;\n raf.cancel(autoScroll.i);\n\n autoScroll.interaction = interaction;\n autoScroll.prevTime = new Date().getTime();\n autoScroll.i = raf.request(autoScroll.scroll);\n },\n\n stop: function () {\n autoScroll.isScrolling = false;\n raf.cancel(autoScroll.i);\n },\n\n // scroll the window by the values in scroll.x/y\n scroll: function () {\n const options = autoScroll.interaction.target.options[autoScroll.interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(autoScroll.interaction.element);\n const now = new Date().getTime();\n // change in time in seconds\n const dt = (now - autoScroll.prevTime) / 1000;\n // displacement\n const s = options.speed * dt;\n\n if (s >= 1) {\n if (is.window(container)) {\n container.scrollBy(autoScroll.x * s, autoScroll.y * s);\n }\n else if (container) {\n container.scrollLeft += autoScroll.x * s;\n container.scrollTop += autoScroll.y * s;\n }\n\n autoScroll.prevTime = now;\n }\n\n if (autoScroll.isScrolling) {\n raf.cancel(autoScroll.i);\n autoScroll.i = raf.request(autoScroll.scroll);\n }\n },\n check: function (interactable, actionName) {\n const options = interactable.options;\n\n return options[actionName].autoScroll && options[actionName].autoScroll.enabled;\n },\n onInteractionMove: function ({ interaction, pointer }) {\n if (!(interaction.interacting()\n && autoScroll.check(interaction.target, interaction.prepared.name))) {\n return;\n }\n\n if (interaction.simulation) {\n autoScroll.x = autoScroll.y = 0;\n return;\n }\n\n let top;\n let right;\n let bottom;\n let left;\n\n const options = interaction.target.options[interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(interaction.element);\n\n if (is.window(container)) {\n left = pointer.clientX < autoScroll.margin;\n top = pointer.clientY < autoScroll.margin;\n right = pointer.clientX > container.innerWidth - autoScroll.margin;\n bottom = pointer.clientY > container.innerHeight - autoScroll.margin;\n }\n else {\n const rect = domUtils.getElementClientRect(container);\n\n left = pointer.clientX < rect.left + autoScroll.margin;\n top = pointer.clientY < rect.top + autoScroll.margin;\n right = pointer.clientX > rect.right - autoScroll.margin;\n bottom = pointer.clientY > rect.bottom - autoScroll.margin;\n }\n\n autoScroll.x = (right ? 1: left? -1: 0);\n autoScroll.y = (bottom? 1: top? -1: 0);\n\n if (!autoScroll.isScrolling) {\n // set the autoScroll properties to those of the target\n autoScroll.margin = options.margin;\n autoScroll.speed = options.speed;\n\n autoScroll.start(interaction);\n }\n },\n};\n\nInteraction.signals.on('stop-active', function () {\n autoScroll.stop();\n});\n\nInteraction.signals.on('action-move', autoScroll.onInteractionMove);\n\ndefaultOptions.perAction.autoScroll = autoScroll.defaults;\n\nmodule.exports = autoScroll;\n","const Interactable = require('../Interactable');\nconst actions = require('../actions/base');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.ignoreFrom\n [ method ]\n *\n * If the target of the `mousedown`, `pointerdown` or `touchstart`\n * event or any of it's parents match the given CSS selector or\n * Element, no drag/resize/gesture is started.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to not ignore any elements\n = (string | Element | object) The current ignoreFrom value or this Interactable\n **\n | interact(element, { ignoreFrom: document.getElementById('no-action') });\n | // or\n | interact(element).ignoreFrom('input, textarea, a');\n\\*/\nInteractable.prototype.ignoreFrom = function (newValue) {\n return this._backCompatOption('ignoreFrom', newValue);\n};\n\n/*\\\n * Interactable.allowFrom\n [ method ]\n *\n * A drag/resize/gesture is started only If the target of the\n * `mousedown`, `pointerdown` or `touchstart` event or any of it's\n * parents match the given CSS selector or Element.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to allow from any element\n = (string | Element | object) The current allowFrom value or this Interactable\n **\n | interact(element, { allowFrom: document.getElementById('drag-handle') });\n | // or\n | interact(element).allowFrom('.handle');\n\\*/\nInteractable.prototype.allowFrom = function (newValue) {\n return this._backCompatOption('allowFrom', newValue);\n};\n\nInteractable.prototype.testIgnore = function (ignoreFrom, interactableElement, element) {\n if (!ignoreFrom || !is.element(element)) { return false; }\n\n if (is.string(ignoreFrom)) {\n return domUtils.matchesUpTo(element, ignoreFrom, interactableElement);\n }\n else if (is.element(ignoreFrom)) {\n return domUtils.nodeContains(ignoreFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testAllow = function (allowFrom, interactableElement, element) {\n if (!allowFrom) { return true; }\n\n if (!is.element(element)) { return false; }\n\n if (is.string(allowFrom)) {\n return domUtils.matchesUpTo(element, allowFrom, interactableElement);\n }\n else if (is.element(allowFrom)) {\n return domUtils.nodeContains(allowFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testIgnoreAllow = function (options, interactableElement, eventTarget) {\n return (!this.testIgnore(options.ignoreFrom, interactableElement, eventTarget)\n && this.testAllow(options.allowFrom, interactableElement, eventTarget));\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (event.buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\n","const interact = require('../interact');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst actions = require('../actions/base');\nconst defaultOptions = require('../defaultOptions');\nconst browser = require('../utils/browser');\nconst scope = require('../scope');\nconst utils = require('../utils');\nconst signals = require('../utils/Signals').new();\n\nrequire('./InteractableMethods');\n\nconst autoStart = {\n signals,\n withinInteractionLimit,\n // Allow this many interactions to happen simultaneously\n maxInteractions: Infinity,\n defaults: {\n perAction: {\n manualStart: false,\n max: Infinity,\n maxPerElement: 1,\n allowFrom: null,\n ignoreFrom: null,\n },\n },\n setActionDefaults: function (action) {\n utils.extend(action.defaults, autoStart.defaults.perAction);\n },\n};\n\n// set cursor style on mousedown\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget }) {\n if (interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\n// set cursor style on mousemove\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget }) {\n if (!interaction.mouse\n || interaction.pointerIsDown\n || interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\nInteraction.signals.on('move', function (arg) {\n const { interaction, event } = arg;\n\n if (!interaction.pointerIsDown\n || interaction.interacting()\n || !interaction.pointerWasMoved\n || !interaction.prepared.name) {\n return;\n }\n\n signals.fire('before-start', arg);\n\n const target = interaction.target;\n\n if (interaction.prepared.name && target) {\n // check manualStart and interaction limit\n if (target.options[interaction.prepared.name].manualStart\n || !withinInteractionLimit(target, interaction.element, interaction.prepared)) {\n interaction.stop(event);\n }\n else {\n interaction.start(interaction.prepared, target, interaction.element);\n }\n }\n});\n\n// Check if the current target supports the action.\n// If so, return the validated action. Otherwise, return null\nfunction validateAction (action, interactable, element, eventTarget) {\n if (utils.is.object(action)\n && interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget)\n && interactable.options[action.name].enabled\n && withinInteractionLimit(interactable, element, action)) {\n return action;\n }\n\n return null;\n}\n\nfunction validateSelector (interaction, pointer, event, matches, matchElements, eventTarget) {\n for (let i = 0, len = matches.length; i < len; i++) {\n const match = matches[i];\n const matchElement = matchElements[i];\n const action = validateAction(match.getAction(pointer, event, interaction, matchElement),\n match,\n matchElement,\n eventTarget);\n\n if (action) {\n return {\n action,\n target: match,\n element: matchElement,\n };\n }\n }\n\n return {};\n}\n\nfunction getActionInfo (interaction, pointer, event, eventTarget) {\n let matches = [];\n let matchElements = [];\n\n let element = eventTarget;\n let action = null;\n\n function pushMatches (interactable, selector, context) {\n const elements = (browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined);\n\n if (utils.matchesSelector(element, selector, elements)) {\n\n matches.push(interactable);\n matchElements.push(element);\n }\n }\n\n while (utils.is.element(element)) {\n matches = [];\n matchElements = [];\n\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && (action = validateAction(elementInteractable.getAction(pointer, event, interaction, element, eventTarget),\n elementInteractable,\n element,\n eventTarget))\n && !elementInteractable.options[action.name].manualStart) {\n return {\n element,\n action,\n target: elementInteractable,\n };\n }\n else {\n scope.interactables.forEachSelector(pushMatches, element);\n\n const actionInfo = validateSelector(interaction, pointer, event, matches, matchElements, eventTarget);\n\n if (actionInfo.action\n && !actionInfo.target.options[actionInfo.action.name].manualStart) {\n return actionInfo;\n }\n }\n\n element = utils.parentNode(element);\n }\n\n return {};\n}\n\nfunction prepare (interaction, { action, target, element }) {\n action = action || {};\n\n if (interaction.target && interaction.target.options.styleCursor) {\n interaction.target._doc.documentElement.style.cursor = '';\n }\n\n interaction.target = target;\n interaction.element = element;\n utils.copyAction(interaction.prepared, action);\n\n if (target && target.options.styleCursor) {\n const cursor = action? actions[action.name].getCursor(action) : '';\n interaction.target._doc.documentElement.style.cursor = cursor;\n }\n\n signals.fire('prepared', { interaction: interaction });\n}\n\nInteraction.signals.on('stop', function ({ interaction }) {\n const target = interaction.target;\n\n if (target && target.options.styleCursor) {\n target._doc.documentElement.style.cursor = '';\n }\n});\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (utils.is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (utils.is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n const buttons = event.buttons || ({\n 0: 1,\n 1: 4,\n 3: 8,\n 4: 16,\n })[event.button];\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\nfunction withinInteractionLimit (interactable, element, action) {\n const options = interactable.options;\n const maxActions = options[action.name].max;\n const maxPerElement = options[action.name].maxPerElement;\n let activeInteractions = 0;\n let targetCount = 0;\n let targetElementCount = 0;\n\n // no actions if any of these values == 0\n if (!(maxActions && maxPerElement && autoStart.maxInteractions)) { return; }\n\n for (let i = 0, len = scope.interactions.length; i < len; i++) {\n const interaction = scope.interactions[i];\n const otherAction = interaction.prepared.name;\n\n if (!interaction.interacting()) { continue; }\n\n activeInteractions++;\n\n if (activeInteractions >= autoStart.maxInteractions) {\n return false;\n }\n\n if (interaction.target !== interactable) { continue; }\n\n targetCount += (otherAction === action.name)|0;\n\n if (targetCount >= maxActions) {\n return false;\n }\n\n if (interaction.element === element) {\n targetElementCount++;\n\n if (otherAction !== action.name || targetElementCount >= maxPerElement) {\n return false;\n }\n }\n }\n\n return autoStart.maxInteractions > 0;\n}\n\n/*\\\n * interact.maxInteractions\n [ method ]\n **\n * Returns or sets the maximum number of concurrent interactions allowed.\n * By default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables\n * and elements, you need to enable it in the draggable, resizable and\n * gesturable `'max'` and `'maxPerElement'` options.\n **\n - newValue (number) #optional Any number. newValue <= 0 means no interactions.\n\\*/\ninteract.maxInteractions = function (newValue) {\n if (utils.is.number(newValue)) {\n autoStart.maxInteractions = newValue;\n\n return this;\n }\n\n return autoStart.maxInteractions;\n};\n\nInteractable.settingsMethods.push('styleCursor');\nInteractable.settingsMethods.push('actionChecker');\nInteractable.settingsMethods.push('ignoreFrom');\nInteractable.settingsMethods.push('allowFrom');\n\ndefaultOptions.base.actionChecker = null;\ndefaultOptions.base.styleCursor = true;\n\nutils.extend(defaultOptions.perAction, autoStart.defaults.perAction);\n\nmodule.exports = autoStart;\n","const autoStart = require('./base');\nconst Interaction = require('../Interaction');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.delayTimer = null;\n});\n\nautoStart.signals.on('prepared', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.delayTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.target, interaction.element);\n }, delay);\n }\n});\n\nInteraction.signals.on('move', function ({ interaction, duplicate }) {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.delayTimer);\n }\n});\n\n// prevent regular down->move autoStart\nautoStart.signals.on('before-start', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.prepared.name = null;\n }\n});\n","const autoStart = require('./base');\nconst scope = require('../scope');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\n\nconst { matchesSelector, parentNode } = require('../utils/domUtils');\n\nautoStart.setActionDefaults(require('../actions/drag'));\n\nautoStart.signals.on('before-start', function ({ interaction, eventTarget, dx, dy }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // check if a drag is in the correct axis\n const absX = Math.abs(dx);\n const absY = Math.abs(dy);\n const options = interaction.target.options.drag;\n const startAxis = options.startAxis;\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy');\n\n interaction.prepared.axis = options.lockAxis === 'start'\n ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n : options.lockAxis;\n\n // if the movement isn't in the startAxis of the interactable\n if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) {\n // cancel the prepared action\n interaction.prepared.name = null;\n\n // then try to get a drag from another ineractable\n\n if (!interaction.prepared.name) {\n\n let element = eventTarget;\n\n const getDraggable = function (interactable, selector, context) {\n const elements = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n if (interactable === interaction.target) { return; }\n\n if (!options.manualStart\n && !interactable.testIgnoreAllow(options, element, eventTarget)\n && matchesSelector(element, selector, elements)) {\n\n const action = interactable.getAction(interaction.downPointer,\n interaction.downEvent,\n interaction,\n element);\n\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, interactable)\n && autoStart.validateAction(action, interactable, element, eventTarget)) {\n\n return interactable;\n }\n }\n };\n\n let action = null;\n\n // check all interactables\n while (is.element(element)) {\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && elementInteractable !== interaction.target\n && !elementInteractable.options.drag.manualStart) {\n\n action = elementInteractable.getAction(interaction.downPointer, interaction.downEvent, interaction, element);\n }\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, elementInteractable)) {\n\n interaction.prepared.name = 'drag';\n interaction.target = elementInteractable;\n interaction.element = element;\n break;\n }\n\n const selectorInteractable = scope.interactables.forEachSelector(getDraggable, element);\n\n if (selectorInteractable) {\n interaction.prepared.name = 'drag';\n interaction.target = selectorInteractable;\n interaction.element = element;\n break;\n }\n\n element = parentNode(element);\n }\n }\n }\n});\n\nfunction checkStartAxis (startAxis, interactable) {\n if (!interactable) { return false; }\n\n const thisAxis = interactable.options.drag.startAxis;\n\n return (startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis);\n}\n","require('./base').setActionDefaults(require('../actions/gesture'));\n","require('./base').setActionDefaults(require('../actions/resize'));\n","module.exports = {\n base: {\n accept : null,\n preventDefault: 'auto',\n deltaSource : 'page',\n },\n\n perAction: {\n origin: { x: 0, y: 0 },\n\n // only allow left button by default\n // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n mouseButtons: 1,\n\n inertia: {\n enabled : false,\n resistance : 10, // the lambda in exponential decay\n minSpeed : 100, // target speed must be above this for inertia to start\n endSpeed : 10, // the speed at which inertia is slow enough to stop\n allowResume : true, // allow resuming an action in inertia phase\n smoothEndDuration: 300, // animate to snap/restrict endOnly if there's no inertia\n },\n },\n};\n","/* browser entry point */\n\n// Legacy browser support\nrequire('./legacyBrowsers');\n\n// inertia\nrequire('./inertia');\n\n// modifiers\nrequire('./modifiers/snap');\nrequire('./modifiers/restrict');\n\n// pointerEvents\nrequire('./pointerEvents/base');\nrequire('./pointerEvents/holdRepeat');\nrequire('./pointerEvents/interactableTargets');\n\n// delay\nrequire('./autoStart/delay');\n\n// actions\nrequire('./actions/gesture');\nrequire('./actions/resize');\nrequire('./actions/drag');\nrequire('./actions/drop');\n\n// load these modifiers after resize is loaded\nrequire('./modifiers/snapSize');\nrequire('./modifiers/restrictEdges');\nrequire('./modifiers/restrictSize');\n\n// autoStart actions\nrequire('./autoStart/gesture');\nrequire('./autoStart/resize');\nrequire('./autoStart/drag');\n\n// Interactable preventDefault setting\nrequire('./interactablePreventDefault.js');\n\n// autoScroll\nrequire('./autoScroll');\n\n// export interact\nmodule.exports = require('./interact');\n","const InteractEvent = require('./InteractEvent');\nconst Interaction = require('./Interaction');\nconst modifiers = require('./modifiers');\nconst utils = require('./utils');\nconst animationFrame = require('./utils/raf');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.inertiaStatus = {\n active : false,\n smoothEnd : false,\n allowResume: false,\n\n startEvent: null,\n upCoords : {},\n\n xe: 0, ye: 0,\n sx: 0, sy: 0,\n\n t0: 0,\n vx0: 0, vys: 0,\n duration: 0,\n\n lambda_v0: 0,\n one_ve_v0: 0,\n i : null,\n };\n\n interaction.boundInertiaFrame = () => inertiaFrame .apply(interaction);\n interaction.boundSmoothEndFrame = () => smoothEndFrame.apply(interaction);\n});\n\nInteraction.signals.on('down', function ({ interaction, event, pointer, eventTarget }) {\n const status = interaction.inertiaStatus;\n\n // Check if the down event hits the current inertia target\n if (status.active) {\n let element = eventTarget;\n\n // climb up the DOM tree from the event target\n while (utils.is.element(element)) {\n\n // if interaction element is the current inertia target element\n if (element === interaction.element) {\n // stop inertia\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n\n // update pointers to the down event's coordinates\n interaction.updatePointer(pointer);\n utils.setCoords(interaction.curCoords, interaction.pointers);\n\n // fire appropriate signals\n const signalArg = { interaction };\n Interaction.signals.fire('before-action-move', signalArg);\n Interaction.signals.fire('action-resume' , signalArg);\n\n // fire a reume event\n const resumeEvent = new InteractEvent(interaction,\n event,\n interaction.prepared.name,\n 'inertiaresume',\n interaction.element);\n\n interaction.target.fire(resumeEvent);\n interaction.prevEvent = resumeEvent;\n modifiers.resetStatuses(interaction.modifierStatuses);\n\n utils.copyCoords(interaction.prevCoords, interaction.curCoords);\n break;\n }\n\n element = utils.parentNode(element);\n }\n }\n});\n\nInteraction.signals.on('up', function ({ interaction, event }) {\n const status = interaction.inertiaStatus;\n\n if (!interaction.interacting() || status.active) { return; }\n\n const target = interaction.target;\n const options = target && target.options;\n const inertiaOptions = options && interaction.prepared.name && options[interaction.prepared.name].inertia;\n\n const now = new Date().getTime();\n const statuses = {};\n const page = utils.extend({}, interaction.curCoords.page);\n const pointerSpeed = interaction.pointerDelta.client.speed;\n\n let smoothEnd = false;\n let modifierResult;\n\n // check if inertia should be started\n const inertiaPossible = (inertiaOptions && inertiaOptions.enabled\n && interaction.prepared.name !== 'gesture'\n && event !== status.startEvent);\n\n const inertia = (inertiaPossible\n && (now - interaction.curCoords.timeStamp) < 50\n && pointerSpeed > inertiaOptions.minSpeed\n && pointerSpeed > inertiaOptions.endSpeed);\n\n const modifierArg = {\n interaction,\n pageCoords: page,\n statuses,\n preEnd: true,\n requireEndOnly: true,\n };\n\n // smoothEnd\n if (inertiaPossible && !inertia) {\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n if (modifierResult.shouldMove && modifierResult.locked) {\n smoothEnd = true;\n }\n }\n\n if (!(inertia || smoothEnd)) { return; }\n\n utils.copyCoords(status.upCoords, interaction.curCoords);\n\n interaction.pointers[0] = status.startEvent =\n new InteractEvent(interaction, event, interaction.prepared.name, 'inertiastart', interaction.element);\n\n status.t0 = now;\n\n status.active = true;\n status.allowResume = inertiaOptions.allowResume;\n interaction.simulation = status;\n\n target.fire(status.startEvent);\n\n if (inertia) {\n status.vx0 = interaction.pointerDelta.client.vx;\n status.vy0 = interaction.pointerDelta.client.vy;\n status.v0 = pointerSpeed;\n\n calcInertia(interaction, status);\n\n utils.extend(page, interaction.curCoords.page);\n\n page.x += status.xe;\n page.y += status.ye;\n\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n status.modifiedXe += modifierResult.dx;\n status.modifiedYe += modifierResult.dy;\n\n status.i = animationFrame.request(interaction.boundInertiaFrame);\n }\n else {\n status.smoothEnd = true;\n status.xe = modifierResult.dx;\n status.ye = modifierResult.dy;\n\n status.sx = status.sy = 0;\n\n status.i = animationFrame.request(interaction.boundSmoothEndFrame);\n }\n});\n\nInteraction.signals.on('stop-active', function ({ interaction }) {\n const status = interaction.inertiaStatus;\n\n if (status.active) {\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n }\n});\n\nfunction calcInertia (interaction, status) {\n const inertiaOptions = interaction.target.options[interaction.prepared.name].inertia;\n const lambda = inertiaOptions.resistance;\n const inertiaDur = -Math.log(inertiaOptions.endSpeed / status.v0) / lambda;\n\n status.x0 = interaction.prevEvent.pageX;\n status.y0 = interaction.prevEvent.pageY;\n status.t0 = status.startEvent.timeStamp / 1000;\n status.sx = status.sy = 0;\n\n status.modifiedXe = status.xe = (status.vx0 - inertiaDur) / lambda;\n status.modifiedYe = status.ye = (status.vy0 - inertiaDur) / lambda;\n status.te = inertiaDur;\n\n status.lambda_v0 = lambda / status.v0;\n status.one_ve_v0 = 1 - inertiaOptions.endSpeed / status.v0;\n}\n\nfunction inertiaFrame () {\n updateInertiaCoords(this);\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n\n const status = this.inertiaStatus;\n const options = this.target.options[this.prepared.name].inertia;\n const lambda = options.resistance;\n const t = new Date().getTime() / 1000 - status.t0;\n\n if (t < status.te) {\n\n const progress = 1 - (Math.exp(-lambda * t) - status.lambda_v0) / status.one_ve_v0;\n\n if (status.modifiedXe === status.xe && status.modifiedYe === status.ye) {\n status.sx = status.xe * progress;\n status.sy = status.ye * progress;\n }\n else {\n const quadPoint = utils.getQuadraticCurvePoint(0, 0,\n status.xe,\n status.ye,\n status.modifiedXe,\n status.modifiedYe,\n progress);\n\n status.sx = quadPoint.x;\n status.sy = quadPoint.y;\n }\n\n this.doMove();\n\n status.i = animationFrame.request(this.boundInertiaFrame);\n }\n else {\n status.sx = status.modifiedXe;\n status.sy = status.modifiedYe;\n\n this.doMove();\n this.end(status.startEvent);\n status.active = false;\n this.simulation = null;\n }\n\n utils.copyCoords(this.prevCoords, this.curCoords);\n}\n\nfunction smoothEndFrame () {\n updateInertiaCoords(this);\n\n const status = this.inertiaStatus;\n const t = new Date().getTime() - status.t0;\n const duration = this.target.options[this.prepared.name].inertia.smoothEndDuration;\n\n if (t < duration) {\n status.sx = utils.easeOutQuad(t, 0, status.xe, duration);\n status.sy = utils.easeOutQuad(t, 0, status.ye, duration);\n\n this.pointerMove(status.startEvent, status.startEvent);\n\n status.i = animationFrame.request(this.boundSmoothEndFrame);\n }\n else {\n status.sx = status.xe;\n status.sy = status.ye;\n\n this.pointerMove(status.startEvent, status.startEvent);\n this.end(status.startEvent);\n\n status.smoothEnd =\n status.active = false;\n this.simulation = null;\n }\n}\n\nfunction updateInertiaCoords (interaction) {\n const status = interaction.inertiaStatus;\n\n // return if inertia isn't running\n if (!status.active) { return; }\n\n const pageUp = status.upCoords.page;\n const clientUp = status.upCoords.client;\n\n utils.setCoords(interaction.curCoords, [ {\n pageX : pageUp.x + status.sx,\n pageY : pageUp.y + status.sy,\n clientX: clientUp.x + status.sx,\n clientY: clientUp.y + status.sy,\n } ]);\n}\n","const browser = require('./utils/browser');\nconst events = require('./utils/events');\nconst utils = require('./utils');\nconst scope = require('./scope');\nconst Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\n\nconst globalEvents = {};\n\n/*\\\n * interact\n [ method ]\n *\n * The methods of this variable can be used to set elements as\n * interactables and also to change various default settings.\n *\n * Calling it as a function and passing an element or a valid CSS selector\n * string returns an Interactable object which has various methods to\n * configure it.\n *\n - element (Element | string) The HTML or SVG Element to interact with or CSS selector\n = (object) An @Interactable\n *\n > Usage\n | interact('#draggable').draggable(true);\n |\n | var rectables = interact('rect');\n | rectables\n | .gesturable(true)\n | .on('gesturemove', function (event) {\n | // ...\n | });\n\\*/\nfunction interact (element, options) {\n let interactable = scope.interactables.get(element, options);\n\n if (!interactable) {\n interactable = new Interactable(element, options);\n interactable.events.global = globalEvents;\n }\n\n return interactable;\n}\n\n/*\\\n * interact.isSet\n [ method ]\n *\n * Check if an element has been set\n - element (Element) The Element being searched for\n = (boolean) Indicates if the element or CSS selector was previously passed to interact\n\\*/\ninteract.isSet = function (element, options) {\n return scope.interactables.indexOfElement(element, options && options.context) !== -1;\n};\n\n/*\\\n * interact.on\n [ method ]\n *\n * Adds a global listener for an InteractEvent or adds a DOM event to\n * `document`\n *\n - type (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) interact\n\\*/\ninteract.on = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.on(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.on(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n // if it is an InteractEvent type, add listener to globalEvents\n if (utils.contains(Interactable.eventTypes, type)) {\n // if this type of event was never bound\n if (!globalEvents[type]) {\n globalEvents[type] = [listener];\n }\n else {\n globalEvents[type].push(listener);\n }\n }\n // If non InteractEvent type, addEventListener to document\n else {\n events.add(scope.document, type, listener, { options });\n }\n\n return interact;\n};\n\n/*\\\n * interact.off\n [ method ]\n *\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n - type (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) interact\n \\*/\ninteract.off = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.off(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.off(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n if (!utils.contains(Interactable.eventTypes, type)) {\n events.remove(scope.document, type, listener, options);\n }\n else {\n let index;\n\n if (type in globalEvents\n && (index = utils.indexOf(globalEvents[type], listener)) !== -1) {\n globalEvents[type].splice(index, 1);\n }\n }\n\n return interact;\n};\n\n/*\\\n * interact.debug\n [ method ]\n *\n * Returns an object which exposes internal data\n = (object) An object with properties that outline the current state and expose internal functions and variables\n\\*/\ninteract.debug = function () {\n return scope;\n};\n\n// expose the functions used to calculate multi-touch properties\ninteract.getPointerAverage = utils.pointerAverage;\ninteract.getTouchBBox = utils.touchBBox;\ninteract.getTouchDistance = utils.touchDistance;\ninteract.getTouchAngle = utils.touchAngle;\n\ninteract.getElementRect = utils.getElementRect;\ninteract.getElementClientRect = utils.getElementClientRect;\ninteract.matchesSelector = utils.matchesSelector;\ninteract.closest = utils.closest;\n\n/*\\\n * interact.supportsTouch\n [ method ]\n *\n = (boolean) Whether or not the browser supports touch input\n\\*/\ninteract.supportsTouch = function () {\n return browser.supportsTouch;\n};\n\n/*\\\n * interact.supportsPointerEvent\n [ method ]\n *\n = (boolean) Whether or not the browser supports PointerEvents\n\\*/\ninteract.supportsPointerEvent = function () {\n return browser.supportsPointerEvent;\n};\n\n/*\\\n * interact.stop\n [ method ]\n *\n * Cancels all interactions (end events are not fired)\n *\n - event (Event) An event on which to call preventDefault()\n = (object) interact\n\\*/\ninteract.stop = function (event) {\n for (let i = scope.interactions.length - 1; i >= 0; i--) {\n scope.interactions[i].stop(event);\n }\n\n return interact;\n};\n\n/*\\\n * interact.pointerMoveTolerance\n [ method ]\n * Returns or sets the distance the pointer must be moved before an action\n * sequence occurs. This also affects tolerance for tap events.\n *\n - newValue (number) #optional The movement from the start position must be greater than this value\n = (number | Interactable) The current setting or interact\n\\*/\ninteract.pointerMoveTolerance = function (newValue) {\n if (utils.is.number(newValue)) {\n Interaction.pointerMoveTolerance = newValue;\n\n return this;\n }\n\n return Interaction.pointerMoveTolerance;\n};\n\ninteract.addDocument = scope.addDocument;\ninteract.removeDocument = scope.removeDocument;\n\nscope.interact = interact;\n\nmodule.exports = interact;\n","const Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\nconst scope = require('./scope');\nconst is = require('./utils/is');\nconst events = require('./utils/events');\n\nconst { nodeContains, matchesSelector } = require('./utils/domUtils');\n\n/*\\\n * Interactable.preventDefault\n [ method ]\n *\n * Returns or sets whether to prevent the browser's default behaviour\n * in response to pointer events. Can be set to:\n * - `'always'` to always prevent\n * - `'never'` to never prevent\n * - `'auto'` to let interact.js try to determine what would be best\n *\n - newValue (string) #optional `true`, `false` or `'auto'`\n = (string | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.preventDefault = function (newValue) {\n if (/^(always|never|auto)$/.test(newValue)) {\n this.options.preventDefault = newValue;\n return this;\n }\n\n if (is.bool(newValue)) {\n this.options.preventDefault = newValue? 'always' : 'never';\n return this;\n }\n\n return this.options.preventDefault;\n};\n\nInteractable.prototype.checkAndPreventDefault = function (event) {\n const setting = this.options.preventDefault;\n\n if (setting === 'never') { return; }\n\n if (setting === 'always') {\n event.preventDefault();\n return;\n }\n\n // setting === 'auto'\n\n // don't preventDefault if the browser supports passiveEvents\n // CSS touch-action and user-selecct should be used instead\n if (events.supportsOptions) {\n return;\n }\n\n // don't preventDefault of pointerdown events\n if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) {\n return;\n }\n\n // don't preventDefault on editable elements\n if (is.element(event.target)\n && matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) {\n return;\n }\n\n event.preventDefault();\n};\n\nfunction onInteractionEvent ({ interaction, event }) {\n if (interaction.target) {\n interaction.target.checkAndPreventDefault(event);\n }\n}\n\nfor (const eventSignal of ['down', 'move', 'up', 'cancel']) {\n Interaction.signals.on(eventSignal, onInteractionEvent);\n}\n\n// prevent native HTML5 drag on interact.js target elements\nInteraction.docEvents.dragstart = function preventNativeDrag (event) {\n for (const interaction of scope.interactions) {\n\n if (interaction.element\n && (interaction.element === event.target\n || nodeContains(interaction.element, event.target))) {\n\n interaction.target.checkAndPreventDefault(event);\n return;\n }\n }\n};\n","const scope = require('./scope');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst iFinder = require('./utils/interactionFinder');\nconst pointerEvents = require('./pointerEvents/base');\n\nconst { window } = require('./utils/window');\n\nconst toString = Object.prototype.toString;\n\nif (!window.Array.isArray) {\n window.Array.isArray = function (obj) {\n return toString.call(obj) === '[object Array]';\n };\n}\n\nif (!String.prototype.trim) {\n String.prototype.trim = function () {\n return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n };\n}\n\n// http://www.quirksmode.org/dom/events/click.html\n// >Events leading to dblclick\n//\n// IE8 doesn't fire down event before dblclick.\n// This workaround tries to fire a tap and doubletap after dblclick\nfunction onIE8Dblclick (event) {\n const eventTarget = event.target;\n const interaction = iFinder.search(event, event.type, eventTarget);\n\n if (!interaction) { return; }\n\n if (interaction.prevTap\n && event.clientX === interaction.prevTap.clientX\n && event.clientY === interaction.prevTap.clientY\n && eventTarget === interaction.prevTap.target) {\n\n interaction.downTargets[0] = eventTarget;\n interaction.downTimes [0] = new Date().getTime();\n\n pointerEvents.fire({\n interaction,\n event,\n eventTarget,\n pointer: event,\n type: 'tap',\n });\n }\n}\n\nif (browser.isIE8) {\n const selectFix = function (event) {\n for (const interaction of scope.interactions) {\n if (interaction.interacting()) {\n interaction.target.checkAndPreventDefault(event);\n }\n }\n };\n\n const onDocIE8 = function onDocIE8 ({ doc, win }, signalName) {\n const eventMethod = signalName.indexOf('listen') === 0\n ? events.add : events.remove;\n\n // For IE's lack of Event#preventDefault\n eventMethod(doc, 'selectstart', selectFix);\n\n if (pointerEvents) {\n eventMethod(doc, 'dblclick', onIE8Dblclick);\n }\n };\n\n scope.signals.on('add-document' , onDocIE8);\n scope.signals.on('remove-document', onDocIE8);\n}\n\nmodule.exports = null;\n","const InteractEvent = require('../InteractEvent');\nconst Interaction = require('../Interaction');\nconst extend = require('../utils/extend');\n\nconst modifiers = {\n names: [],\n\n setOffsets: function (arg) {\n const { interaction, pageCoords: page } = arg;\n const { target, element, startOffset } = interaction;\n const rect = target.getRect(element);\n\n if (rect) {\n startOffset.left = page.x - rect.left;\n startOffset.top = page.y - rect.top;\n\n startOffset.right = rect.right - page.x;\n startOffset.bottom = rect.bottom - page.y;\n\n if (!('width' in rect)) { rect.width = rect.right - rect.left; }\n if (!('height' in rect)) { rect.height = rect.bottom - rect.top ; }\n }\n else {\n startOffset.left = startOffset.top = startOffset.right = startOffset.bottom = 0;\n }\n\n arg.rect = rect;\n arg.interactable = target;\n arg.element = element;\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n\n arg.options = target.options[interaction.prepared.name][modifierName];\n\n if (!arg.options) {\n continue;\n }\n\n interaction.modifierOffsets[modifierName] = modifiers[modifierName].setOffset(arg);\n }\n },\n\n setAll: function (arg) {\n const { interaction, statuses, preEnd, requireEndOnly } = arg;\n const coords = extend({}, arg.pageCoords);\n const result = {\n dx: 0,\n dy: 0,\n changed: false,\n locked: false,\n shouldMove: true,\n };\n\n for (const modifierName of modifiers.names) {\n const modifier = modifiers[modifierName];\n const options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!shouldDo(options, preEnd, requireEndOnly)) { continue; }\n\n arg.status = arg.status = statuses[modifierName];\n arg.options = options;\n arg.offset = arg.interaction.modifierOffsets[modifierName];\n\n modifier.set(arg);\n\n if (arg.status.locked) {\n coords.x += arg.status.dx;\n coords.y += arg.status.dy;\n\n result.dx += arg.status.dx;\n result.dy += arg.status.dy;\n\n result.locked = true;\n }\n }\n\n // a move should be fired if:\n // - there are no modifiers enabled,\n // - no modifiers are \"locked\" i.e. have changed the pointer's coordinates, or\n // - the locked coords have changed since the last pointer move\n result.shouldMove = !arg.status || !result.locked || arg.status.changed;\n\n return result;\n },\n\n resetStatuses: function (statuses) {\n for (const modifierName of modifiers.names) {\n const status = statuses[modifierName] || {};\n\n status.dx = status.dy = 0;\n status.modifiedX = status.modifiedY = NaN;\n status.locked = false;\n status.changed = true;\n\n statuses[modifierName] = status;\n }\n\n return statuses;\n },\n\n start: function ({ interaction }, signalName) {\n const arg = {\n interaction,\n pageCoords: (signalName === 'action-resume' ?\n interaction.curCoords : interaction.startCoords).page,\n startOffset: interaction.startOffset,\n statuses: interaction.modifierStatuses,\n preEnd: false,\n requireEndOnly: false,\n };\n\n modifiers.setOffsets(arg);\n modifiers.resetStatuses(arg.statuses);\n\n arg.pageCoords = extend({}, interaction.startCoords.page);\n interaction.modifierResult = modifiers.setAll(arg);\n },\n};\n\nInteraction.signals.on('new', function (interaction) {\n interaction.startOffset = { left: 0, right: 0, top: 0, bottom: 0 };\n interaction.modifierOffsets = {};\n interaction.modifierStatuses = modifiers.resetStatuses({});\n interaction.modifierResult = null;\n});\n\nInteraction.signals.on('action-start' , modifiers.start);\nInteraction.signals.on('action-resume', modifiers.start);\n\nInteraction.signals.on('before-action-move', function ({ interaction, preEnd, interactingBeforeMove }) {\n const modifierResult = modifiers.setAll({\n interaction,\n preEnd,\n pageCoords: interaction.curCoords.page,\n statuses: interaction.modifierStatuses,\n requireEndOnly: false,\n });\n\n // don't fire an action move if a modifier would keep the event in the same\n // cordinates as before\n if (!modifierResult.shouldMove && interactingBeforeMove) {\n interaction._dontFireMove = true;\n }\n\n interaction.modifierResult = modifierResult;\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n for (let i = 0; i < modifiers.names.length; i++) {\n const options = interaction.target.options[interaction.prepared.name][modifiers.names[i]];\n\n // if the endOnly option is true for any modifier\n if (shouldDo(options, true, true)) {\n // fire a move event at the modified coordinates\n interaction.doMove({ event, preEnd: true });\n break;\n }\n }\n});\n\nInteractEvent.signals.on('set-xy', function (arg) {\n const { iEvent, interaction } = arg;\n const modifierArg = extend({}, arg);\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n modifierArg.options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!modifierArg.options) {\n continue;\n }\n\n const modifier = modifiers[modifierName];\n\n modifierArg.status = interaction.modifierStatuses[modifierName];\n\n iEvent[modifierName] = modifier.modifyCoords(modifierArg);\n }\n});\n\nfunction shouldDo (options, preEnd, requireEndOnly) {\n return (options && options.enabled\n && (preEnd || !options.endOnly)\n && (!requireEndOnly || options.endOnly));\n}\n\nmodule.exports = modifiers;\n","const modifiers = require('./index');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst restrict = {\n defaults: {\n enabled : false,\n endOnly : false,\n restriction: null,\n elementRect: null,\n },\n\n setOffset: function ({ rect, startOffset, options }) {\n const elementRect = options && options.elementRect;\n const offset = {};\n\n if (rect && elementRect) {\n offset.left = startOffset.left - (rect.width * elementRect.left);\n offset.top = startOffset.top - (rect.height * elementRect.top);\n\n offset.right = startOffset.right - (rect.width * (1 - elementRect.right));\n offset.bottom = startOffset.bottom - (rect.height * (1 - elementRect.bottom));\n }\n else {\n offset.left = offset.top = offset.right = offset.bottom = 0;\n }\n\n return offset;\n },\n\n set: function ({ pageCoords, interaction, status, options }) {\n if (!options) { return status; }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n\n const restriction = getRestrictionRect(options.restriction, interaction, page);\n\n if (!restriction) { return status; }\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n const rect = restriction;\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n const offset = interaction.modifierOffsets.restrict;\n\n // object is assumed to have\n // x, y, width, height or\n // left, top, right, bottom\n if ('x' in restriction && 'y' in restriction) {\n modifiedX = Math.max(Math.min(rect.x + rect.width - offset.right , page.x), rect.x + offset.left);\n modifiedY = Math.max(Math.min(rect.y + rect.height - offset.bottom, page.y), rect.y + offset.top );\n }\n else {\n modifiedX = Math.max(Math.min(rect.right - offset.right , page.x), rect.left + offset.left);\n modifiedY = Math.max(Math.min(rect.bottom - offset.bottom, page.y), rect.top + offset.top );\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const elementRect = options && options.elementRect;\n\n if (options && options.enabled\n && !(phase === 'start' && elementRect && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n getRestrictionRect,\n};\n\nfunction getRestrictionRect (value, interaction, page) {\n if (utils.is.function(value)) {\n return utils.resolveRectLike(value, interaction.target, interaction.element, [page.x, page.y, interaction]);\n } else {\n return utils.resolveRectLike(value, interaction.target, interaction.element);\n }\n}\n\nmodifiers.restrict = restrict;\nmodifiers.names.push('restrict');\n\ndefaultOptions.perAction.restrict = restrict.defaults;\n\nmodule.exports = restrict;\n","// This module adds the options.resize.restrictEdges setting which sets min and\n// max for the top, left, bottom and right edges of the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictEdges: {\n// inner: { top: 200, left: 200, right: 400, bottom: 400 },\n// outer: { top: 0, left: 0, right: 600, bottom: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst { getRestrictionRect } = require('./restrict');\n\nconst noInner = { top: +Infinity, left: +Infinity, bottom: -Infinity, right: -Infinity };\nconst noOuter = { top: -Infinity, left: -Infinity, bottom: +Infinity, right: +Infinity };\n\nconst restrictEdges = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n offset: null,\n },\n\n setOffset: function ({ interaction, startOffset, options }) {\n if (!options) {\n return utils.extend({}, startOffset);\n }\n\n const offset = getRestrictionRect(options.offset, interaction, interaction.startCoords.page);\n\n if (offset) {\n return {\n top: startOffset.top + offset.y,\n left: startOffset.left + offset.x,\n bottom: startOffset.bottom + offset.y,\n right: startOffset.right + offset.x,\n };\n }\n\n return startOffset;\n },\n\n set: function ({ pageCoords, interaction, status, offset, options }) {\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n const inner = rectUtils.xywhToTlbr(getRestrictionRect(options.inner, interaction, page)) || noInner;\n const outer = rectUtils.xywhToTlbr(getRestrictionRect(options.outer, interaction, page)) || noOuter;\n\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n if (edges.top) {\n modifiedY = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top);\n }\n else if (edges.bottom) {\n modifiedY = Math.max(Math.min(outer.bottom - offset.bottom, page.y), inner.bottom - offset.bottom);\n }\n if (edges.left) {\n modifiedX = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left);\n }\n else if (edges.right) {\n modifiedX = Math.max(Math.min(outer.right - offset.right, page.x), inner.right - offset.right);\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n if (options && options.enabled\n && !(phase === 'start' && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n noInner,\n noOuter,\n getRestrictionRect,\n};\n\nmodifiers.restrictEdges = restrictEdges;\nmodifiers.names.push('restrictEdges');\n\ndefaultOptions.perAction.restrictEdges = restrictEdges.defaults;\nresize.defaults.restrictEdges = restrictEdges.defaults;\n\nmodule.exports = restrictEdges;\n","// This module adds the options.resize.restrictSize setting which sets min and\n// max width and height for the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictSize: {\n// min: { width: -600, height: -600 },\n// max: { width: 600, height: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst restrictEdges = require('./restrictEdges');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst noMin = { width: -Infinity, height: -Infinity };\nconst noMax = { width: +Infinity, height: +Infinity };\n\nconst restrictSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n },\n\n setOffset: function ({ interaction }) {\n return interaction.startOffset;\n },\n\n set: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const rect = rectUtils.xywhToTlbr(interaction.resizeRects.inverted);\n\n const minSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.min, interaction)) || noMin;\n const maxSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.max, interaction)) || noMax;\n\n arg.options = {\n enabled: options.enabled,\n endOnly: options.endOnly,\n inner: utils.extend({}, restrictEdges.noInner),\n outer: utils.extend({}, restrictEdges.noOuter),\n };\n\n if (edges.top) {\n arg.options.inner.top = rect.bottom - minSize.height;\n arg.options.outer.top = rect.bottom - maxSize.height;\n }\n else if (edges.bottom) {\n arg.options.inner.bottom = rect.top + minSize.height;\n arg.options.outer.bottom = rect.top + maxSize.height;\n }\n if (edges.left) {\n arg.options.inner.left = rect.right - minSize.width;\n arg.options.outer.left = rect.right - maxSize.width;\n }\n else if (edges.right) {\n arg.options.inner.right = rect.left + minSize.width;\n arg.options.outer.right = rect.left + maxSize.width;\n }\n\n restrictEdges.set(arg);\n },\n\n modifyCoords: restrictEdges.modifyCoords,\n};\n\nmodifiers.restrictSize = restrictSize;\nmodifiers.names.push('restrictSize');\n\ndefaultOptions.perAction.restrictSize = restrictSize.defaults;\nresize.defaults.restrictSize = restrictSize.defaults;\n\nmodule.exports = restrictSize;\n","const modifiers = require('./index');\nconst interact = require('../interact');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst snap = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n\n relativePoints: null,\n },\n\n setOffset: function ({ interaction, interactable, element, rect, startOffset, options }) {\n const offsets = [];\n const optionsOrigin = utils.rectToXY(utils.resolveRectLike(options.origin));\n const origin = optionsOrigin || utils.getOriginXY(interactable, element, interaction.prepared.name);\n options = options || interactable.options[interaction.prepared.name].snap || {};\n\n let snapOffset;\n\n if (options.offset === 'startCoords') {\n snapOffset = {\n x: interaction.startCoords.page.x - origin.x,\n y: interaction.startCoords.page.y - origin.y,\n };\n }\n else {\n const offsetRect = utils.resolveRectLike(options.offset, interactable, element, [interaction]);\n\n snapOffset = utils.rectToXY(offsetRect) || { x: 0, y: 0 };\n }\n\n if (rect && options.relativePoints && options.relativePoints.length) {\n for (const { x: relativeX, y: relativeY } of options.relativePoints) {\n offsets.push({\n x: startOffset.left - (rect.width * relativeX) + snapOffset.x,\n y: startOffset.top - (rect.height * relativeY) + snapOffset.y,\n });\n }\n }\n else {\n offsets.push(snapOffset);\n }\n\n return offsets;\n },\n\n set: function ({ interaction, pageCoords, status, options, offset: offsets }) {\n const targets = [];\n let target;\n let page;\n let i;\n\n if (status.useStatusXY) {\n page = { x: status.x, y: status.y };\n }\n else {\n const origin = utils.getOriginXY(interaction.target, interaction.element, interaction.prepared.name);\n\n page = utils.extend({}, pageCoords);\n\n page.x -= origin.x;\n page.y -= origin.y;\n }\n\n status.realX = page.x;\n status.realY = page.y;\n\n let len = options.targets? options.targets.length : 0;\n\n for (const { x: offsetX, y: offsetY } of offsets) {\n const relativeX = page.x - offsetX;\n const relativeY = page.y - offsetY;\n\n for (const snapTarget of options.targets) {\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n targets.push({\n x: utils.is.number(target.x) ? (target.x + offsetX) : relativeX,\n y: utils.is.number(target.y) ? (target.y + offsetY) : relativeY,\n\n range: utils.is.number(target.range)? target.range: options.range,\n });\n }\n }\n\n const closest = {\n target: null,\n inRange: false,\n distance: 0,\n range: 0,\n dx: 0,\n dy: 0,\n };\n\n for (i = 0, len = targets.length; i < len; i++) {\n target = targets[i];\n\n const range = target.range;\n const dx = target.x - page.x;\n const dy = target.y - page.y;\n const distance = utils.hypot(dx, dy);\n let inRange = distance <= range;\n\n // Infinite targets count as being out of range\n // compared to non infinite ones that are in range\n if (range === Infinity && closest.inRange && closest.range !== Infinity) {\n inRange = false;\n }\n\n if (!closest.target || (inRange\n // is the closest target in range?\n ? (closest.inRange && range !== Infinity\n // the pointer is relatively deeper in this target\n ? distance / range < closest.distance / closest.range\n // this target has Infinite range and the closest doesn't\n : (range === Infinity && closest.range !== Infinity)\n // OR this target is closer that the previous closest\n || distance < closest.distance)\n // The other is not in range and the pointer is closer to this target\n : (!closest.inRange && distance < closest.distance))) {\n\n closest.target = target;\n closest.distance = distance;\n closest.range = range;\n closest.inRange = inRange;\n closest.dx = dx;\n closest.dy = dy;\n\n status.range = range;\n }\n }\n\n let snapChanged;\n\n if (closest.target) {\n snapChanged = (status.modifiedX !== closest.target.x || status.modifiedY !== closest.target.y);\n\n status.modifiedX = closest.target.x;\n status.modifiedY = closest.target.y;\n }\n else {\n snapChanged = true;\n\n status.modifiedX = NaN;\n status.modifiedY = NaN;\n }\n\n status.dx = closest.dx;\n status.dy = closest.dy;\n\n status.changed = (snapChanged || (closest.inRange && !status.locked));\n status.locked = closest.inRange;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const relativePoints = options && options.relativePoints;\n\n if (options && options.enabled\n && !(phase === 'start' && relativePoints && relativePoints.length)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n }\n\n return {\n range : status.range,\n locked : status.locked,\n x : status.modifiedX,\n y : status.modifiedY,\n realX : status.realX,\n realY : status.realY,\n dx : status.dx,\n dy : status.dy,\n };\n }\n },\n};\n\ninteract.createSnapGrid = function (grid) {\n return function (x, y) {\n const limits = grid.limits || {\n left : -Infinity,\n right : Infinity,\n top : -Infinity,\n bottom: Infinity,\n };\n let offsetX = 0;\n let offsetY = 0;\n\n if (utils.is.object(grid.offset)) {\n offsetX = grid.offset.x;\n offsetY = grid.offset.y;\n }\n\n const gridx = Math.round((x - offsetX) / grid.x);\n const gridy = Math.round((y - offsetY) / grid.y);\n\n const newX = Math.max(limits.left, Math.min(limits.right , gridx * grid.x + offsetX));\n const newY = Math.max(limits.top , Math.min(limits.bottom, gridy * grid.y + offsetY));\n\n return {\n x: newX,\n y: newY,\n range: grid.range,\n };\n };\n};\n\nmodifiers.snap = snap;\nmodifiers.names.push('snap');\n\ndefaultOptions.perAction.snap = snap.defaults;\n\nmodule.exports = snap;\n","// This module allows snapping of the size of targets during resize\n// interactions.\n\nconst modifiers = require('./index');\nconst snap = require('./snap');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\nconst utils = require('../utils/');\n\nconst snapSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n },\n\n setOffset: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.edges;\n\n if (!edges) { return; }\n\n arg.options = {\n relativePoints: [{\n x: edges.left? 0 : 1,\n y: edges.top ? 0 : 1,\n }],\n origin: { x: 0, y: 0 },\n offset: 'self',\n range: options.range,\n };\n\n const offsets = snap.setOffset(arg);\n arg.options = options;\n\n return offsets;\n },\n\n set: function (arg) {\n const { interaction, options, offset, pageCoords } = arg;\n const page = utils.extend({}, pageCoords);\n const relativeX = page.x - offset[0].x;\n const relativeY = page.y - offset[0].y;\n\n arg.options = utils.extend({}, options);\n arg.options.targets = [];\n\n for (const snapTarget of options.targets) {\n let target;\n\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n if ('width' in target && 'height' in target) {\n target.x = target.width;\n target.y = target.height;\n }\n\n arg.options.targets.push(target);\n }\n\n snap.set(arg);\n },\n\n modifyCoords: function (arg) {\n const { options } = arg;\n\n arg.options = utils.extend({}, options);\n arg.options.enabled = options.enabled;\n arg.options.relativePoints = [null];\n\n snap.modifyCoords(arg);\n },\n};\n\nmodifiers.snapSize = snapSize;\nmodifiers.names.push('snapSize');\n\ndefaultOptions.perAction.snapSize = snapSize.defaults;\nresize.defaults.snapSize = snapSize.defaults;\n\nmodule.exports = snapSize;\n","const pointerUtils = require('../utils/pointerUtils');\n\nmodule.exports = class PointerEvent {\n constructor (type, pointer, event, eventTarget, interaction) {\n pointerUtils.pointerExtend(this, event);\n\n if (event !== pointer) {\n pointerUtils.pointerExtend(this, pointer);\n }\n\n this.interaction = interaction;\n\n this.timeStamp = new Date().getTime();\n this.originalEvent = event;\n this.type = type;\n this.pointerId = pointerUtils.getPointerId(pointer);\n this.pointerType = pointerUtils.getPointerType(pointer);\n this.target = eventTarget;\n this.currentTarget = null;\n\n if (type === 'tap') {\n const pointerIndex = interaction.getPointerIndex(pointer);\n this.dt = this.timeStamp - interaction.downTimes[pointerIndex];\n\n const interval = this.timeStamp - interaction.tapTime;\n\n this.double = !!(interaction.prevTap\n && interaction.prevTap.type !== 'doubletap'\n && interaction.prevTap.target === this.target\n && interval < 500);\n }\n else if (type === 'doubletap') {\n this.dt = pointer.timeStamp - interaction.tapTime;\n }\n }\n\n subtractOrigin ({ x: originX, y: originY }) {\n this.pageX -= originX;\n this.pageY -= originY;\n this.clientX -= originX;\n this.clientY -= originY;\n\n return this;\n }\n\n addOrigin ({ x: originX, y: originY }) {\n this.pageX += originX;\n this.pageY += originY;\n this.clientX += originX;\n this.clientY += originY;\n\n return this;\n }\n\n preventDefault () {\n this.originalEvent.preventDefault();\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n};\n","const PointerEvent = require('./PointerEvent');\nconst Interaction = require('../Interaction');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst defaults = require('../defaultOptions');\nconst signals = require('../utils/Signals').new();\nconst { filter } = require('../utils/arr');\n\nconst simpleSignals = [ 'down', 'up', 'cancel' ];\nconst simpleEvents = [ 'down', 'up', 'cancel' ];\n\nconst pointerEvents = {\n PointerEvent,\n fire,\n collectEventTargets,\n signals,\n defaults: {\n holdDuration: 600,\n ignoreFrom : null,\n allowFrom : null,\n origin : { x: 0, y: 0 },\n },\n types: [\n 'down',\n 'move',\n 'up',\n 'cancel',\n 'tap',\n 'doubletap',\n 'hold',\n ],\n};\n\nfunction fire (arg) {\n const {\n interaction, pointer, event, eventTarget,\n type = arg.pointerEvent.type,\n targets = collectEventTargets(arg),\n pointerEvent = new PointerEvent(type, pointer, event, eventTarget, interaction),\n } = arg;\n\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n targets,\n type,\n pointerEvent,\n };\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n\n for (const prop in target.props || {}) {\n pointerEvent[prop] = target.props[prop];\n }\n\n const origin = utils.getOriginXY(target.eventable, target.element);\n\n pointerEvent.subtractOrigin(origin);\n pointerEvent.eventable = target.eventable;\n pointerEvent.currentTarget = target.element;\n\n target.eventable.fire(pointerEvent);\n\n pointerEvent.addOrigin(origin);\n\n if (pointerEvent.immediatePropagationStopped\n || (pointerEvent.propagationStopped\n && (i + 1) < targets.length && targets[i + 1].element !== pointerEvent.currentTarget)) {\n break;\n }\n }\n\n signals.fire('fired', signalArg);\n\n if (type === 'tap') {\n // if pointerEvent should make a double tap, create and fire a doubletap\n // PointerEvent and use that as the prevTap\n const prevTap = pointerEvent.double\n ? fire({\n interaction, pointer, event, eventTarget,\n type: 'doubletap',\n })\n : pointerEvent;\n\n interaction.prevTap = prevTap;\n interaction.tapTime = prevTap.timeStamp;\n }\n\n return pointerEvent;\n}\n\nfunction collectEventTargets ({ interaction, pointer, event, eventTarget, type }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n // do not fire a tap event if the pointer was moved before being lifted\n if (type === 'tap' && (interaction.pointerWasMoved\n // or if the pointerup target is different to the pointerdown target\n || !(interaction.downTargets[pointerIndex] && interaction.downTargets[pointerIndex] === eventTarget))) {\n return [];\n }\n\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n path,\n targets: [],\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (type === 'hold') {\n signalArg.targets = filter(signalArg.targets, target =>\n target.eventable.options.holdDuration === interaction.holdTimers[pointerIndex].duration);\n }\n\n return signalArg.targets;\n}\n\nInteraction.signals.on('update-pointer-down', function ({ interaction, pointerIndex }) {\n interaction.holdTimers[pointerIndex] = { duration: Infinity, timeout: null };\n});\n\nInteraction.signals.on('remove-pointer', function ({ interaction, pointerIndex }) {\n interaction.holdTimers.splice(pointerIndex, 1);\n});\n\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget, duplicateMove }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n if (!duplicateMove && (!interaction.pointerIsDown || interaction.pointerWasMoved)) {\n if (interaction.pointerIsDown) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n\n fire({\n interaction, pointer, event, eventTarget,\n type: 'move',\n });\n }\n});\n\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget, pointerIndex }) {\n // copy event to be used in timeout for IE8\n const eventCopy = browser.isIE8? utils.extend({}, event) : event;\n\n const timer = interaction.holdTimers[pointerIndex];\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'hold',\n targets: [],\n path,\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (!signalArg.targets.length) { return; }\n\n let minDuration = Infinity;\n\n for (let i = 0; i < signalArg.targets.length; i++) {\n const target = signalArg.targets[i];\n const holdDuration = target.eventable.options.holdDuration;\n\n if (holdDuration < minDuration) {\n minDuration = holdDuration;\n }\n }\n\n timer.duration = minDuration;\n timer.timeout = setTimeout(function () {\n fire({\n interaction,\n eventTarget,\n pointer: browser.isIE8? eventCopy : pointer,\n event: eventCopy,\n type: 'hold',\n });\n }, minDuration);\n});\n\nInteraction.signals.on('up', ({ interaction, pointer, event, eventTarget }) => {\n if (!interaction.pointerWasMoved) {\n fire({ interaction, eventTarget, pointer, event, type: 'tap' });\n }\n});\n\n['up', 'cancel'].forEach(function (signalName) {\n Interaction.signals.on(signalName, function ({ interaction, pointerIndex }) {\n if (interaction.holdTimers[pointerIndex]) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n });\n});\n\nfunction createSignalListener (type) {\n return function ({ interaction, pointer, event, eventTarget }) {\n fire({ interaction, eventTarget, pointer, event, type });\n };\n}\n\nfor (let i = 0; i < simpleSignals.length; i++) {\n Interaction.signals.on(simpleSignals[i], createSignalListener(simpleEvents[i]));\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.prevTap = null; // the most recent tap event on this interaction\n interaction.tapTime = 0; // time of the most recent tap event\n interaction.holdTimers = []; // [{ duration, timeout }]\n});\n\ndefaults.pointerEvents = pointerEvents.defaults;\nmodule.exports = pointerEvents;\n","const pointerEvents = require('./base');\nconst Interaction = require('../Interaction');\n\npointerEvents.signals.on('new', onNew);\npointerEvents.signals.on('fired', onFired);\n\nfor (const signal of ['move', 'up', 'cancel', 'endall']) {\n Interaction.signals.on(signal, endHoldRepeat);\n}\n\nfunction onNew ({ pointerEvent }) {\n if (pointerEvent.type !== 'hold') { return; }\n\n pointerEvent.count = (pointerEvent.count || 0) + 1;\n}\n\nfunction onFired ({ interaction, pointerEvent, eventTarget, targets }) {\n if (pointerEvent.type !== 'hold' || !targets.length) { return; }\n\n // get the repeat interval from the first eventable\n const interval = targets[0].eventable.options.holdRepeatInterval;\n\n // don't repeat if the interval is 0 or less\n if (interval <= 0) { return; }\n\n // set a timeout to fire the holdrepeat event\n interaction.holdIntervalHandle = setTimeout(function () {\n pointerEvents.fire({\n interaction,\n eventTarget,\n type: 'hold',\n pointer: pointerEvent,\n event: pointerEvent,\n });\n }, interval);\n}\n\nfunction endHoldRepeat ({ interaction }) {\n // set the interaction's holdStopTime property\n // to stop further holdRepeat events\n if (interaction.holdIntervalHandle) {\n clearInterval(interaction.holdIntervalHandle);\n interaction.holdIntervalHandle = null;\n }\n}\n\n// don't repeat by default\npointerEvents.defaults.holdRepeatInterval = 0;\npointerEvents.types.push('holdrepeat');\n\nmodule.exports = {\n onNew,\n onFired,\n endHoldRepeat,\n};\n","const pointerEvents = require('./base');\nconst Interactable = require('../Interactable');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\nconst scope = require('../scope');\nconst extend = require('../utils/extend');\nconst { merge } = require('../utils/arr');\n\npointerEvents.signals.on('collect-targets', function ({ targets, element, type, eventTarget }) {\n function collectSelectors (interactable, selector, context) {\n const els = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && is.element(element)\n && domUtils.matchesSelector(element, selector, els)\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n const interactable = scope.interactables.get(element);\n\n if (interactable) {\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n scope.interactables.forEachSelector(collectSelectors, element);\n});\n\nInteractable.signals.on('new', function ({ interactable }) {\n interactable.events.getRect = function (element) {\n return interactable.getRect(element);\n };\n});\n\nInteractable.signals.on('set', function ({ interactable, options }) {\n extend(interactable.events.options, pointerEvents.defaults);\n extend(interactable.events.options, options);\n});\n\nmerge(Interactable.eventTypes, pointerEvents.types);\n\nInteractable.prototype.pointerEvents = function (options) {\n extend(this.events.options, options);\n\n return this;\n};\n\nconst __backCompatOption = Interactable.prototype._backCompatOption;\n\nInteractable.prototype._backCompatOption = function (optionName, newValue) {\n const ret = __backCompatOption.call(this, optionName, newValue);\n\n if (ret === this) {\n this.events.options[optionName] = newValue;\n }\n\n return ret;\n};\n\nInteractable.settingsMethods.push('pointerEvents');\n","const utils = require('./utils');\nconst events = require('./utils/events');\nconst signals = require('./utils/Signals').new();\n\nconst scope = {\n signals,\n events,\n utils,\n\n // main document\n document: require('./utils/domObjects').document,\n // all documents being listened to\n documents: [],\n\n addDocument: function (doc, win) {\n // do nothing if document is already known\n if (utils.contains(scope.documents, doc)) { return false; }\n\n win = win || scope.getWindow(doc);\n\n scope.documents.push(doc);\n events.documents.push(doc);\n\n // don't add an unload event for the main document\n // so that the page may be cached in browser history\n if (doc !== scope.document) {\n events.add(win, 'unload', scope.onWindowUnload);\n }\n\n signals.fire('add-document', { doc, win });\n },\n\n removeDocument: function (doc, win) {\n const index = utils.indexOf(scope.documents, doc);\n\n win = win || scope.getWindow(doc);\n\n events.remove(win, 'unload', scope.onWindowUnload);\n\n scope.documents.splice(index, 1);\n events.documents.splice(index, 1);\n\n signals.fire('remove-document', { win, doc });\n },\n\n onWindowUnload: function () {\n scope.removeDocument(this.document, this);\n },\n};\n\nmodule.exports = scope;\n","const { indexOf } = require('./arr');\n\nclass Signals {\n constructor () {\n this.listeners = {\n // signalName: [listeners],\n };\n }\n\n on (name, listener) {\n if (!this.listeners[name]) {\n this.listeners[name] = [listener];\n return;\n }\n\n this.listeners[name].push(listener);\n }\n\n off (name, listener) {\n if (!this.listeners[name]) { return; }\n\n const index = indexOf(this.listeners[name], listener);\n\n if (index !== -1) {\n this.listeners[name].splice(index, 1);\n }\n }\n\n fire (name, arg) {\n const targetListeners = this.listeners[name];\n\n if (!targetListeners) { return; }\n\n for (let i = 0; i < targetListeners.length; i++) {\n if (targetListeners[i](arg, name) === false) {\n return;\n }\n }\n }\n}\n\nSignals.new = function () {\n return new Signals();\n};\n\nmodule.exports = Signals;\n","function indexOf (array, target) {\n for (let i = 0, len = array.length; i < len; i++) {\n if (array[i] === target) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction contains (array, target) {\n return indexOf(array, target) !== -1;\n}\n\nfunction merge (target, source) {\n for (let i = 0; i < source.length; i++) {\n target.push(source[i]);\n }\n\n return target;\n}\n\nfunction filter (array, test) {\n const result = [];\n\n for (let i = 0; i < array.length; i++) {\n if (test(array[i])) {\n result.push(array[i]);\n }\n }\n\n return result;\n}\n\nmodule.exports = {\n indexOf,\n contains,\n merge,\n filter,\n};\n","const { window } = require('./window');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst Element = domObjects.Element;\nconst navigator = window.navigator;\n\nconst browser = {\n // Does the browser support touch input?\n supportsTouch: !!(('ontouchstart' in window) || is.function(window.DocumentTouch)\n && domObjects.document instanceof window.DocumentTouch),\n\n // Does the browser support PointerEvents\n supportsPointerEvent: !!domObjects.PointerEvent,\n\n isIE8: ('attachEvent' in window) && !('addEventListener' in window),\n\n // Opera Mobile must be handled differently\n isOperaMobile: (navigator.appName === 'Opera'\n && browser.supportsTouch\n && navigator.userAgent.match('Presto')),\n\n // scrolling doesn't change the result of getClientRects on iOS 7\n isIOS7: (/iP(hone|od|ad)/.test(navigator.platform)\n && /OS 7[^\\d]/.test(navigator.appVersion)),\n\n isIe9OrOlder: /MSIE (8|9)/.test(navigator.userAgent),\n\n // prefix matchesSelector\n prefixedMatchesSelector: 'matches' in Element.prototype\n ? 'matches': 'webkitMatchesSelector' in Element.prototype\n ? 'webkitMatchesSelector': 'mozMatchesSelector' in Element.prototype\n ? 'mozMatchesSelector': 'oMatchesSelector' in Element.prototype\n ? 'oMatchesSelector': 'msMatchesSelector',\n\n useMatchesSelectorPolyfill: false,\n\n pEventTypes: (domObjects.PointerEvent\n ? (domObjects.PointerEvent === window.MSPointerEvent\n ? {\n up: 'MSPointerUp',\n down: 'MSPointerDown',\n over: 'mouseover',\n out: 'mouseout',\n move: 'MSPointerMove',\n cancel: 'MSPointerCancel',\n }\n : {\n up: 'pointerup',\n down: 'pointerdown',\n over: 'pointerover',\n out: 'pointerout',\n move: 'pointermove',\n cancel: 'pointercancel',\n })\n : null),\n\n // because Webkit and Opera still use 'mousewheel' event type\n wheelEvent: 'onmousewheel' in domObjects.document? 'mousewheel': 'wheel',\n\n};\n\nbrowser.useMatchesSelectorPolyfill = !is.function(Element.prototype[browser.prefixedMatchesSelector]);\n\nmodule.exports = browser;\n","const domObjects = {};\nconst win = require('./window').window;\n\nfunction blank () {}\n\ndomObjects.document = win.document;\ndomObjects.DocumentFragment = win.DocumentFragment || blank;\ndomObjects.SVGElement = win.SVGElement || blank;\ndomObjects.SVGSVGElement = win.SVGSVGElement || blank;\ndomObjects.SVGElementInstance = win.SVGElementInstance || blank;\ndomObjects.Element = win.Element || blank;\ndomObjects.HTMLElement = win.HTMLElement || domObjects.Element;\n\ndomObjects.Event = win.Event;\ndomObjects.Touch = win.Touch || blank;\ndomObjects.PointerEvent = (win.PointerEvent || win.MSPointerEvent);\n\nmodule.exports = domObjects;\n","const win = require('./window');\nconst browser = require('./browser');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst domUtils = {\n nodeContains: function (parent, child) {\n while (child) {\n if (child === parent) {\n return true;\n }\n\n child = child.parentNode;\n }\n\n return false;\n },\n\n closest: function (element, selector) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) { return element; }\n\n element = domUtils.parentNode(element);\n }\n\n return null;\n },\n\n parentNode: function (node) {\n let parent = node.parentNode;\n\n if (is.docFrag(parent)) {\n // skip past #shado-root fragments\n while ((parent = parent.host) && is.docFrag(parent)) {\n continue;\n }\n\n return parent;\n }\n\n return parent;\n },\n\n // taken from http://tanalin.com/en/blog/2012/12/matches-selector-ie8/ and modified\n matchesSelectorPolyfill: browser.useMatchesSelectorPolyfill\n ? function (element, selector, elems) {\n elems = elems || element.parentNode.querySelectorAll(selector);\n\n for (let i = 0, len = elems.length; i < len; i++) {\n if (elems[i] === element) {\n return true;\n }\n }\n\n return false;\n }\n : null,\n\n matchesSelector: function (element, selector, nodeList) {\n if (browser.useMatchesSelectorPolyfill) {\n return domUtils.matchesSelectorPolyfill(element, selector, nodeList);\n }\n\n // remove /deep/ from selectors if shadowDOM polyfill is used\n if (win.window !== win.realWindow) {\n selector = selector.replace(/\\/deep\\//g, ' ');\n }\n\n return element[browser.prefixedMatchesSelector](selector);\n },\n\n // Test for the element that's \"above\" all other qualifiers\n indexOfDeepestElement: function (elements) {\n let deepestZoneParents = [];\n let dropzoneParents = [];\n let dropzone;\n let deepestZone = elements[0];\n let index = deepestZone? 0: -1;\n let parent;\n let child;\n let i;\n let n;\n\n for (i = 1; i < elements.length; i++) {\n dropzone = elements[i];\n\n // an element might belong to multiple selector dropzones\n if (!dropzone || dropzone === deepestZone) {\n continue;\n }\n\n if (!deepestZone) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n // check if the deepest or current are document.documentElement or document.rootElement\n // - if the current dropzone is, do nothing and continue\n if (dropzone.parentNode === dropzone.ownerDocument) {\n continue;\n }\n // - if deepest is, update with the current dropzone and continue to next\n else if (deepestZone.parentNode === dropzone.ownerDocument) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n if (!deepestZoneParents.length) {\n parent = deepestZone;\n while (parent.parentNode && parent.parentNode !== parent.ownerDocument) {\n deepestZoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n }\n\n // if this element is an svg element and the current deepest is\n // an HTMLElement\n if (deepestZone instanceof domObjects.HTMLElement\n && dropzone instanceof domObjects.SVGElement\n && !(dropzone instanceof domObjects.SVGSVGElement)) {\n\n if (dropzone === deepestZone.parentNode) {\n continue;\n }\n\n parent = dropzone.ownerSVGElement;\n }\n else {\n parent = dropzone;\n }\n\n dropzoneParents = [];\n\n while (parent.parentNode !== parent.ownerDocument) {\n dropzoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n\n n = 0;\n\n // get (position of last common ancestor) + 1\n while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) {\n n++;\n }\n\n const parents = [\n dropzoneParents[n - 1],\n dropzoneParents[n],\n deepestZoneParents[n],\n ];\n\n child = parents[0].lastChild;\n\n while (child) {\n if (child === parents[1]) {\n deepestZone = dropzone;\n index = i;\n deepestZoneParents = [];\n\n break;\n }\n else if (child === parents[2]) {\n break;\n }\n\n child = child.previousSibling;\n }\n }\n\n return index;\n },\n\n matchesUpTo: function (element, selector, limit) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) {\n return true;\n }\n\n element = domUtils.parentNode(element);\n\n if (element === limit) {\n return domUtils.matchesSelector(element, selector);\n }\n }\n\n return false;\n },\n\n getActualElement: function (element) {\n return (element instanceof domObjects.SVGElementInstance\n ? element.correspondingUseElement\n : element);\n },\n\n getScrollXY: function (relevantWindow) {\n relevantWindow = relevantWindow || win.window;\n return {\n x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft,\n y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop,\n };\n },\n\n getElementClientRect: function (element) {\n const clientRect = (element instanceof domObjects.SVGElement\n ? element.getBoundingClientRect()\n : element.getClientRects()[0]);\n\n return clientRect && {\n left : clientRect.left,\n right : clientRect.right,\n top : clientRect.top,\n bottom: clientRect.bottom,\n width : clientRect.width || clientRect.right - clientRect.left,\n height: clientRect.height || clientRect.bottom - clientRect.top,\n };\n },\n\n getElementRect: function (element) {\n const clientRect = domUtils.getElementClientRect(element);\n\n if (!browser.isIOS7 && clientRect) {\n const scroll = domUtils.getScrollXY(win.getWindow(element));\n\n clientRect.left += scroll.x;\n clientRect.right += scroll.x;\n clientRect.top += scroll.y;\n clientRect.bottom += scroll.y;\n }\n\n return clientRect;\n },\n\n getPath: function (element) {\n const path = [];\n\n while (element) {\n path.push(element);\n element = domUtils.parentNode(element);\n }\n\n return path;\n },\n\n trySelector: value => {\n if (!is.string(value)) { return false; }\n\n // an exception will be raised if it is invalid\n domObjects.document.querySelector(value);\n return true;\n },\n};\n\nmodule.exports = domUtils;\n","const is = require('./is');\nconst domUtils = require('./domUtils');\nconst pExtend = require('./pointerExtend');\n\nconst { window, getWindow } = require('./window');\nconst { indexOf, contains } = require('./arr');\n\nconst useAttachEvent = ('attachEvent' in window) && !('addEventListener' in window);\nconst addEvent = useAttachEvent? 'attachEvent': 'addEventListener';\nconst removeEvent = useAttachEvent? 'detachEvent': 'removeEventListener';\nconst on = useAttachEvent? 'on': '';\n\nconst elements = [];\nconst targets = [];\nconst attachedListeners = [];\n\n// {\n// type: {\n// selectors: ['selector', ...],\n// contexts : [document, ...],\n// listeners: [[listener, capture, passive], ...]\n// }\n// }\nconst delegatedEvents = {};\n\nconst documents = [];\n\nconst supportsOptions = !useAttachEvent && (() => {\n let supported = false;\n\n window.document.createElement('div').addEventListener('test', null, {\n get capture () { supported = true; },\n });\n\n return supported;\n})();\n\nfunction add (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n let elementIndex = indexOf(elements, element);\n let target = targets[elementIndex];\n\n if (!target) {\n target = {\n events: {},\n typeCount: 0,\n };\n\n elementIndex = elements.push(element) - 1;\n targets.push(target);\n\n attachedListeners.push(useAttachEvent\n ? {\n supplied: [],\n wrapped : [],\n useCount: [],\n }\n : null);\n }\n\n if (!target.events[type]) {\n target.events[type] = [];\n target.typeCount++;\n }\n\n if (!contains(target.events[type], listener)) {\n let ret;\n\n if (useAttachEvent) {\n const { supplied, wrapped, useCount } = attachedListeners[elementIndex];\n const listenerIndex = indexOf(supplied, listener);\n\n const wrappedListener = wrapped[listenerIndex] || function (event) {\n if (!event.immediatePropagationStopped) {\n event.target = event.srcElement;\n event.currentTarget = element;\n\n event.preventDefault = event.preventDefault || preventDef;\n event.stopPropagation = event.stopPropagation || stopProp;\n event.stopImmediatePropagation = event.stopImmediatePropagation || stopImmProp;\n\n if (/mouse|click/.test(event.type)) {\n event.pageX = event.clientX + getWindow(element).document.documentElement.scrollLeft;\n event.pageY = event.clientY + getWindow(element).document.documentElement.scrollTop;\n }\n\n listener(event);\n }\n };\n\n ret = element[addEvent](on + type, wrappedListener, !!options.capture);\n\n if (listenerIndex === -1) {\n supplied.push(listener);\n wrapped.push(wrappedListener);\n useCount.push(1);\n }\n else {\n useCount[listenerIndex]++;\n }\n }\n else {\n ret = element[addEvent](type, listener, supportsOptions? options : !!options.capture);\n }\n target.events[type].push(listener);\n\n return ret;\n }\n}\n\nfunction remove (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const elementIndex = indexOf(elements, element);\n const target = targets[elementIndex];\n\n if (!target || !target.events) {\n return;\n }\n\n let wrappedListener = listener;\n let listeners;\n let listenerIndex;\n\n if (useAttachEvent) {\n listeners = attachedListeners[elementIndex];\n listenerIndex = indexOf(listeners.supplied, listener);\n wrappedListener = listeners.wrapped[listenerIndex];\n }\n\n if (type === 'all') {\n for (type in target.events) {\n if (target.events.hasOwnProperty(type)) {\n remove(element, type, 'all');\n }\n }\n return;\n }\n\n if (target.events[type]) {\n const len = target.events[type].length;\n\n if (listener === 'all') {\n for (let i = 0; i < len; i++) {\n remove(element, type, target.events[type][i], options);\n }\n return;\n }\n else {\n for (let i = 0; i < len; i++) {\n if (target.events[type][i] === listener) {\n element[removeEvent](on + type, wrappedListener, supportsOptions? options : !!options.capture);\n target.events[type].splice(i, 1);\n\n if (useAttachEvent && listeners) {\n listeners.useCount[listenerIndex]--;\n if (listeners.useCount[listenerIndex] === 0) {\n listeners.supplied.splice(listenerIndex, 1);\n listeners.wrapped.splice(listenerIndex, 1);\n listeners.useCount.splice(listenerIndex, 1);\n }\n }\n\n break;\n }\n }\n }\n\n if (target.events[type] && target.events[type].length === 0) {\n target.events[type] = null;\n target.typeCount--;\n }\n }\n\n if (!target.typeCount) {\n targets.splice(elementIndex, 1);\n elements.splice(elementIndex, 1);\n attachedListeners.splice(elementIndex, 1);\n }\n}\n\nfunction addDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n if (!delegatedEvents[type]) {\n delegatedEvents[type] = {\n selectors: [],\n contexts : [],\n listeners: [],\n };\n\n // add delegate listener functions\n for (let i = 0; i < documents.length; i++) {\n add(documents[i], type, delegateListener);\n add(documents[i], type, delegateUseCapture, true);\n }\n }\n\n const delegated = delegatedEvents[type];\n let index;\n\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n break;\n }\n }\n\n if (index === -1) {\n index = delegated.selectors.length;\n\n delegated.selectors.push(selector);\n delegated.contexts .push(context);\n delegated.listeners.push([]);\n }\n\n // keep listener and capture and passive flags\n delegated.listeners[index].push([listener, !!options.capture, options.passive]);\n}\n\nfunction removeDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const delegated = delegatedEvents[type];\n let matchFound = false;\n let index;\n\n if (!delegated) { return; }\n\n // count from last index of delegated to 0\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n // look for matching selector and context Node\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n\n const listeners = delegated.listeners[index];\n\n // each item of the listeners array is an array: [function, capture, passive]\n for (let i = listeners.length - 1; i >= 0; i--) {\n const [fn, capture, passive] = listeners[i];\n\n // check if the listener functions and capture and passive flags match\n if (fn === listener && capture === !!options.capture && passive === options.passive) {\n // remove the listener from the array of listeners\n listeners.splice(i, 1);\n\n // if all listeners for this interactable have been removed\n // remove the interactable from the delegated arrays\n if (!listeners.length) {\n delegated.selectors.splice(index, 1);\n delegated.contexts .splice(index, 1);\n delegated.listeners.splice(index, 1);\n\n // remove delegate function from context\n remove(context, type, delegateListener);\n remove(context, type, delegateUseCapture, true);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegatedEvents[type] = null;\n }\n }\n\n // only remove one listener\n matchFound = true;\n break;\n }\n }\n\n if (matchFound) { break; }\n }\n }\n}\n\n// bound to the interactable context when a DOM event\n// listener is added to a selector interactable\nfunction delegateListener (event, optionalArg) {\n const options = getOptions(optionalArg);\n const fakeEvent = {};\n const delegated = delegatedEvents[event.type];\n const eventTarget = (domUtils.getActualElement(event.path\n ? event.path[0]\n : event.target));\n let element = eventTarget;\n\n // duplicate the event so that currentTarget can be changed\n pExtend(fakeEvent, event);\n\n fakeEvent.originalEvent = event;\n fakeEvent.preventDefault = preventOriginalDefault;\n\n // climb up document tree looking for selector matches\n while (is.element(element)) {\n for (let i = 0; i < delegated.selectors.length; i++) {\n const selector = delegated.selectors[i];\n const context = delegated.contexts[i];\n\n if (domUtils.matchesSelector(element, selector)\n && domUtils.nodeContains(context, eventTarget)\n && domUtils.nodeContains(context, element)) {\n\n const listeners = delegated.listeners[i];\n\n fakeEvent.currentTarget = element;\n\n for (let j = 0; j < listeners.length; j++) {\n const [fn, capture, passive] = listeners[j];\n\n if (capture === !!options.capture && passive === options.passive) {\n fn(fakeEvent);\n }\n }\n }\n }\n\n element = domUtils.parentNode(element);\n }\n}\n\nfunction delegateUseCapture (event) {\n return delegateListener.call(this, event, true);\n}\n\nfunction preventDef () {\n this.returnValue = false;\n}\n\nfunction preventOriginalDefault () {\n this.originalEvent.preventDefault();\n}\n\nfunction stopProp () {\n this.cancelBubble = true;\n}\n\nfunction stopImmProp () {\n this.cancelBubble = true;\n this.immediatePropagationStopped = true;\n}\n\nfunction getOptions (param) {\n return is.object(param)? param : { capture: param };\n}\n\nmodule.exports = {\n add,\n remove,\n\n addDelegate,\n removeDelegate,\n\n delegateListener,\n delegateUseCapture,\n delegatedEvents,\n documents,\n\n useAttachEvent,\n supportsOptions,\n\n _elements: elements,\n _targets: targets,\n _attachedListeners: attachedListeners,\n};\n","module.exports = function extend (dest, source) {\n for (const prop in source) {\n dest[prop] = source[prop];\n }\n return dest;\n};\n","const {\n resolveRectLike,\n rectToXY,\n} = require('./rect');\n\nmodule.exports = function (target, element, action) {\n const actionOptions = target.options[action];\n const actionOrigin = actionOptions && actionOptions.origin;\n const origin = actionOrigin || target.options.origin;\n\n const originRect = resolveRectLike(origin, target, element, [target && element]);\n\n return rectToXY(originRect) || { x: 0, y: 0 };\n};\n","module.exports = (x, y) => Math.sqrt(x * x + y * y);\n","const extend = require('./extend');\nconst win = require('./window');\n\nconst utils = {\n warnOnce: function (method, message) {\n let warned = false;\n\n return function () {\n if (!warned) {\n win.window.console.warn(message);\n warned = true;\n }\n\n return method.apply(this, arguments);\n };\n },\n\n // http://stackoverflow.com/a/5634528/2280888\n _getQBezierValue: function (t, p1, p2, p3) {\n const iT = 1 - t;\n return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3;\n },\n\n getQuadraticCurvePoint: function (startX, startY, cpX, cpY, endX, endY, position) {\n return {\n x: utils._getQBezierValue(position, startX, cpX, endX),\n y: utils._getQBezierValue(position, startY, cpY, endY),\n };\n },\n\n // http://gizma.com/easing/\n easeOutQuad: function (t, b, c, d) {\n t /= d;\n return -c * t*(t-2) + b;\n },\n\n copyAction: function (dest, src) {\n dest.name = src.name;\n dest.axis = src.axis;\n dest.edges = src.edges;\n\n return dest;\n },\n\n is : require('./is'),\n extend : extend,\n hypot : require('./hypot'),\n getOriginXY: require('./getOriginXY'),\n};\n\nextend(utils, require('./arr'));\nextend(utils, require('./domUtils'));\nextend(utils, require('./pointerUtils'));\nextend(utils, require('./rect'));\n\nmodule.exports = utils;\n","const scope = require('../scope');\nconst utils = require('./index');\n\nconst finder = {\n methodOrder: [ 'simulationResume', 'mouseOrPen', 'hasPointer', 'idle' ],\n\n search: function (pointer, eventType, eventTarget) {\n const pointerType = utils.getPointerType(pointer);\n const pointerId = utils.getPointerId(pointer);\n const details = { pointer, pointerId, pointerType, eventType, eventTarget };\n\n for (const method of finder.methodOrder) {\n const interaction = finder[method](details);\n\n if (interaction) {\n return interaction;\n }\n }\n },\n\n // try to resume simulation with a new pointer\n simulationResume: function ({ pointerType, eventType, eventTarget }) {\n if (!/down|start/i.test(eventType)) {\n return null;\n }\n\n for (const interaction of scope.interactions) {\n let element = eventTarget;\n\n if (interaction.simulation && interaction.simulation.allowResume\n && (interaction.pointerType === pointerType)) {\n while (element) {\n // if the element is the interaction element\n if (element === interaction.element) {\n return interaction;\n }\n element = utils.parentNode(element);\n }\n }\n }\n\n return null;\n },\n\n // if it's a mouse or pen interaction\n mouseOrPen: function ({ pointerId, pointerType, eventType }) {\n if (pointerType !== 'mouse' && pointerType !== 'pen') {\n return null;\n }\n\n let firstNonActive;\n\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType) {\n // if it's a down event, skip interactions with running simulations\n if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; }\n\n // if the interaction is active, return it immediately\n if (interaction.interacting()) {\n return interaction;\n }\n // otherwise save it and look for another active interaction\n else if (!firstNonActive) {\n firstNonActive = interaction;\n }\n }\n }\n\n // if no active mouse interaction was found use the first inactive mouse\n // interaction\n if (firstNonActive) {\n return firstNonActive;\n }\n\n // find any mouse or pen interaction.\n // ignore the interaction if the eventType is a *down, and a simulation\n // is active\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType && !(/down/i.test(eventType) && interaction.simulation)) {\n return interaction;\n }\n }\n\n return null;\n },\n\n // get interaction that has this pointer\n hasPointer: function ({ pointerId }) {\n for (const interaction of scope.interactions) {\n if (utils.contains(interaction.pointerIds, pointerId)) {\n return interaction;\n }\n }\n },\n\n // get first idle interaction with a matching pointerType\n idle: function ({ pointerType }) {\n for (const interaction of scope.interactions) {\n // if there's already a pointer held down\n if (interaction.pointerIds.length === 1) {\n const target = interaction.target;\n // don't add this pointer if there is a target interactable and it\n // isn't gesturable\n if (target && !target.options.gesture.enabled) {\n continue;\n }\n }\n // maximum of 2 pointers per interaction\n else if (interaction.pointerIds.length >= 2) {\n continue;\n }\n\n if (!interaction.interacting() && (pointerType === interaction.pointerType)) {\n return interaction;\n }\n }\n\n return null;\n },\n};\n\nmodule.exports = finder;\n","const win = require('./window');\nconst isWindow = require('./isWindow');\n\nconst is = {\n array : () => {},\n\n window : thing => thing === win.window || isWindow(thing),\n\n docFrag : thing => is.object(thing) && thing.nodeType === 11,\n\n object : thing => !!thing && (typeof thing === 'object'),\n\n function: thing => typeof thing === 'function',\n\n number : thing => typeof thing === 'number' ,\n\n bool : thing => typeof thing === 'boolean' ,\n\n string : thing => typeof thing === 'string' ,\n\n element: thing => {\n if (!thing || (typeof thing !== 'object')) { return false; }\n\n const _window = win.getWindow(thing) || win.window;\n\n return (/object|function/.test(typeof _window.Element)\n ? thing instanceof _window.Element //DOM2\n : thing.nodeType === 1 && typeof thing.nodeName === 'string');\n },\n};\n\nis.array = thing => (is.object(thing)\n && (typeof thing.length !== 'undefined')\n && is.function(thing.splice));\n\nmodule.exports = is;\n","module.exports = (thing) => !!(thing && thing.Window) && (thing instanceof thing.Window);\n","function pointerExtend (dest, source) {\n for (const prop in source) {\n const prefixedPropREs = module.exports.prefixedPropREs;\n let deprecated = false;\n\n // skip deprecated prefixed properties\n for (const vendor in prefixedPropREs) {\n if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) {\n deprecated = true;\n break;\n }\n }\n\n if (!deprecated && typeof source[prop] !== 'function') {\n dest[prop] = source[prop];\n }\n }\n return dest;\n}\n\npointerExtend.prefixedPropREs = {\n webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/,\n};\n\nmodule.exports = pointerExtend;\n","const hypot = require('./hypot');\nconst browser = require('./browser');\nconst dom = require('./domObjects');\nconst domUtils = require('./domUtils');\nconst domObjects = require('./domObjects');\nconst is = require('./is');\nconst pointerExtend = require('./pointerExtend');\n\nconst pointerUtils = {\n copyCoords: function (dest, src) {\n dest.page = dest.page || {};\n dest.page.x = src.page.x;\n dest.page.y = src.page.y;\n\n dest.client = dest.client || {};\n dest.client.x = src.client.x;\n dest.client.y = src.client.y;\n\n dest.timeStamp = src.timeStamp;\n },\n\n setCoordDeltas: function (targetObj, prev, cur) {\n targetObj.page.x = cur.page.x - prev.page.x;\n targetObj.page.y = cur.page.y - prev.page.y;\n targetObj.client.x = cur.client.x - prev.client.x;\n targetObj.client.y = cur.client.y - prev.client.y;\n targetObj.timeStamp = cur.timeStamp - prev.timeStamp;\n\n // set pointer velocity\n const dt = Math.max(targetObj.timeStamp / 1000, 0.001);\n\n targetObj.page.speed = hypot(targetObj.page.x, targetObj.page.y) / dt;\n targetObj.page.vx = targetObj.page.x / dt;\n targetObj.page.vy = targetObj.page.y / dt;\n\n targetObj.client.speed = hypot(targetObj.client.x, targetObj.page.y) / dt;\n targetObj.client.vx = targetObj.client.x / dt;\n targetObj.client.vy = targetObj.client.y / dt;\n },\n\n isNativePointer: function (pointer) {\n return (pointer instanceof dom.Event || pointer instanceof dom.Touch);\n },\n\n // Get specified X/Y coords for mouse or event.touches[0]\n getXY: function (type, pointer, xy) {\n xy = xy || {};\n type = type || 'page';\n\n xy.x = pointer[type + 'X'];\n xy.y = pointer[type + 'Y'];\n\n return xy;\n },\n\n getPageXY: function (pointer, page) {\n page = page || {};\n\n // Opera Mobile handles the viewport and scrolling oddly\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n pointerUtils.getXY('screen', pointer, page);\n\n page.x += window.scrollX;\n page.y += window.scrollY;\n }\n else {\n pointerUtils.getXY('page', pointer, page);\n }\n\n return page;\n },\n\n getClientXY: function (pointer, client) {\n client = client || {};\n\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n // Opera Mobile handles the viewport and scrolling oddly\n pointerUtils.getXY('screen', pointer, client);\n }\n else {\n pointerUtils.getXY('client', pointer, client);\n }\n\n return client;\n },\n\n getPointerId: function (pointer) {\n return is.number(pointer.pointerId)? pointer.pointerId : pointer.identifier;\n },\n\n setCoords: function (targetObj, pointers, timeStamp) {\n const pointer = (pointers.length > 1\n ? pointerUtils.pointerAverage(pointers)\n : pointers[0]);\n\n const tmpXY = {};\n\n pointerUtils.getPageXY(pointer, tmpXY);\n targetObj.page.x = tmpXY.x;\n targetObj.page.y = tmpXY.y;\n\n pointerUtils.getClientXY(pointer, tmpXY);\n targetObj.client.x = tmpXY.x;\n targetObj.client.y = tmpXY.y;\n\n targetObj.timeStamp = is.number(timeStamp) ? timeStamp :new Date().getTime();\n },\n\n pointerExtend: pointerExtend,\n\n getTouchPair: function (event) {\n const touches = [];\n\n // array of touches is supplied\n if (is.array(event)) {\n touches[0] = event[0];\n touches[1] = event[1];\n }\n // an event\n else {\n if (event.type === 'touchend') {\n if (event.touches.length === 1) {\n touches[0] = event.touches[0];\n touches[1] = event.changedTouches[0];\n }\n else if (event.touches.length === 0) {\n touches[0] = event.changedTouches[0];\n touches[1] = event.changedTouches[1];\n }\n }\n else {\n touches[0] = event.touches[0];\n touches[1] = event.touches[1];\n }\n }\n\n return touches;\n },\n\n pointerAverage: function (pointers) {\n const average = {\n pageX : 0,\n pageY : 0,\n clientX: 0,\n clientY: 0,\n screenX: 0,\n screenY: 0,\n };\n\n for (const pointer of pointers) {\n for (const prop in average) {\n average[prop] += pointer[prop];\n }\n }\n for (const prop in average) {\n average[prop] /= pointers.length;\n }\n\n return average;\n },\n\n touchBBox: function (event) {\n if (!event.length && !(event.touches && event.touches.length > 1)) {\n return;\n }\n\n const touches = pointerUtils.getTouchPair(event);\n const minX = Math.min(touches[0].pageX, touches[1].pageX);\n const minY = Math.min(touches[0].pageY, touches[1].pageY);\n const maxX = Math.max(touches[0].pageX, touches[1].pageX);\n const maxY = Math.max(touches[0].pageY, touches[1].pageY);\n\n return {\n x: minX,\n y: minY,\n left: minX,\n top: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n },\n\n touchDistance: function (event, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n\n\n const dx = touches[0][sourceX] - touches[1][sourceX];\n const dy = touches[0][sourceY] - touches[1][sourceY];\n\n return hypot(dx, dy);\n },\n\n touchAngle: function (event, prevAngle, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n const dx = touches[1][sourceX] - touches[0][sourceX];\n const dy = touches[1][sourceY] - touches[0][sourceY];\n const angle = 180 * Math.atan2(dy , dx) / Math.PI;\n\n return angle;\n },\n\n getPointerType: function (pointer) {\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : is.number(pointer.pointerType)\n ? [undefined, undefined,'touch', 'pen', 'mouse'][pointer.pointerType]\n // if the PointerEvent API isn't available, then the \"pointer\" must\n // be either a MouseEvent, TouchEvent, or Touch object\n : /touch/.test(pointer.type) || pointer instanceof domObjects.Touch\n ? 'touch'\n : 'mouse';\n },\n\n // [ event.target, event.currentTarget ]\n getEventTargets: function (event) {\n return [\n domUtils.getActualElement(event.path ? event.path[0] : event.target),\n domUtils.getActualElement(event.currentTarget),\n ];\n },\n};\n\nmodule.exports = pointerUtils;\n","const { window } = require('./window');\n\nconst vendors = ['ms', 'moz', 'webkit', 'o'];\nlet lastTime = 0;\nlet request;\nlet cancel;\n\nfor (let x = 0; x < vendors.length && !window.requestAnimationFrame; x++) {\n request = window[vendors[x] + 'RequestAnimationFrame'];\n cancel = window[vendors[x] +'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n}\n\nif (!request) {\n request = function (callback) {\n const currTime = new Date().getTime();\n const timeToCall = Math.max(0, 16 - (currTime - lastTime));\n const id = setTimeout(function () { callback(currTime + timeToCall); },\n timeToCall);\n\n lastTime = currTime + timeToCall;\n return id;\n };\n}\n\nif (!cancel) {\n cancel = function (id) {\n clearTimeout(id);\n };\n}\n\nmodule.exports = {\n request,\n cancel,\n};\n","const extend = require('./extend');\nconst is = require('./is');\nconst {\n closest,\n parentNode,\n getElementRect,\n} = require('./domUtils');\n\nconst rectUtils = {\n getStringOptionResult: function (value, interactable, element) {\n if (!is.string(value)) {\n return null;\n }\n\n if (value === 'parent') {\n value = parentNode(element);\n }\n else if (value === 'self') {\n value = interactable.getRect(element);\n }\n else {\n value = closest(element, value);\n }\n\n return value;\n },\n\n resolveRectLike: function (value, interactable, element, functionArgs) {\n value = rectUtils.getStringOptionResult(value, interactable, element) || value;\n\n if (is.function(value)) {\n value = value.apply(null, functionArgs);\n }\n\n if (is.element(value)) {\n value = getElementRect(value);\n }\n\n return value;\n },\n\n rectToXY: function (rect) {\n return rect && {\n x: 'x' in rect ? rect.x : rect.left,\n y: 'y' in rect ? rect.y : rect.top,\n };\n },\n\n xywhToTlbr: function (rect) {\n if (rect && !('left' in rect && 'top' in rect)) {\n rect = extend({}, rect);\n\n rect.left = rect.x || 0;\n rect.top = rect.y || 0;\n rect.right = rect.right || (rect.left + rect.width);\n rect.bottom = rect.bottom || (rect.top + rect.height);\n }\n\n return rect;\n },\n\n tlbrToXywh: function (rect) {\n if (rect && !('x' in rect && 'y' in rect)) {\n rect = extend({}, rect);\n\n rect.x = rect.left || 0;\n rect.top = rect.top || 0;\n rect.width = rect.width || (rect.right - rect.x);\n rect.height = rect.height || (rect.bottom - rect.y);\n }\n\n return rect;\n },\n};\n\nmodule.exports = rectUtils;\n","const win = module.exports;\nconst isWindow = require('./isWindow');\n\nfunction init (window) {\n // get wrapped window if using Shadow DOM polyfill\n\n win.realWindow = window;\n\n // create a TextNode\n const el = window.document.createTextNode('');\n\n // check if it's wrapped by a polyfill\n if (el.ownerDocument !== window.document\n && typeof window.wrap === 'function'\n && window.wrap(el) === el) {\n // use wrapped window\n window = window.wrap(window);\n }\n\n win.window = window;\n}\n\nif (typeof window === 'undefined') {\n win.window = undefined;\n win.realWindow = undefined;\n}\nelse {\n init(window);\n}\n\nwin.getWindow = function getWindow (node) {\n if (isWindow(node)) {\n return node;\n }\n\n const rootNode = (node.ownerDocument || node);\n\n return rootNode.defaultView || rootNode.parentWindow || win.window;\n};\n\nwin.init = init;\n"]} \ No newline at end of file diff --git a/dist/interact.min.js b/dist/interact.min.js index c0bb2476c..2d1f0fb62 100644 --- a/dist/interact.min.js +++ b/dist/interact.min.js @@ -1,6 +1,6 @@ -/* interact.js v1.3.0-alpha.3+sha.9595c40 | https://raw.github.com/taye/interact.js/master/LICENSE */ -!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var t;t="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,t.interact=e()}}(function(){return function e(t,n,r){function i(s,a){if(!n[s]){if(!t[s]){var l="function"==typeof require&&require;if(!a&&l)return l(s,!0);if(o)return o(s,!0);var c=new Error("Cannot find module '"+s+"'");throw c.code="MODULE_NOT_FOUND",c}var p=n[s]={exports:{}};t[s][0].call(p.exports,function(e){var n=t[s][1][e];return i(n||e)},p,p.exports,e,t,n,r)}return n[s].exports}for(var o="function"==typeof require&&require,s=0;s6&&void 0!==arguments[6]&&arguments[6];r(this,e);var f=t.target,v=(f&&f.options||s).deltaSource,g=o(f,p,l),h="start"===c,m="end"===c,y=h?t.startCoords:t.curCoords,x=t.prevEvent;p=p||t.element;var b=i({},y.page),w=i({},y.client);b.x-=g.x,b.y-=g.y,w.x-=g.x,w.y-=g.y,this.ctrlKey=n.ctrlKey,this.altKey=n.altKey,this.shiftKey=n.shiftKey,this.metaKey=n.metaKey,this.button=n.button,this.buttons=n.buttons,this.target=p,this.currentTarget=p,this.relatedTarget=u||null,this.preEnd=d,this.type=l+(c||""),this.interaction=t,this.interactable=f,this.t0=h?t.downTimes[t.downTimes.length-1]:x.t0;var E={interaction:t,event:n,action:l,phase:c,element:p,related:u,page:b,client:w,coords:y,starting:h,ending:m,deltaSource:v,iEvent:this};a.fire("set-xy",E),m?(this.pageX=x.pageX,this.pageY=x.pageY,this.clientX=x.clientX,this.clientY=x.clientY):(this.pageX=b.x,this.pageY=b.y,this.clientX=w.x,this.clientY=w.y),this.x0=t.startCoords.page.x-g.x,this.y0=t.startCoords.page.y-g.y,this.clientX0=t.startCoords.client.x-g.x,this.clientY0=t.startCoords.client.y-g.y,a.fire("set-delta",E),this.timeStamp=y.timeStamp,this.dt=t.pointerDelta.timeStamp,this.duration=this.timeStamp-this.t0,this.speed=t.pointerDelta[v].speed,this.velocityX=t.pointerDelta[v].vx,this.velocityY=t.pointerDelta[v].vy,this.swipe=m||"inertiastart"===c?this.getSwipe():null,a.fire("new",E)}return e.prototype.getSwipe=function(){var e=this.interaction;if(e.prevEvent.speed<600||this.timeStamp-e.prevEvent.timeStamp>150)return null;var t=180*Math.atan2(e.prevEvent.velocityY,e.prevEvent.velocityX)/Math.PI;t<0&&(t+=360);var n=112.5<=t&&t<247.5,r=202.5<=t&&t<337.5,i=!n&&(292.5<=t||t<67.5);return{up:r,down:!r&&22.5<=t&&t<157.5,left:n,right:i,angle:t,speed:e.prevEvent.speed,velocity:{x:e.prevEvent.velocityX,y:e.prevEvent.velocityY}}},e.prototype.preventDefault=function(){},e.prototype.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},e.prototype.stopPropagation=function(){this.propagationStopped=!0},e}();a.on("set-delta",function(e){var t=e.iEvent,n=e.interaction,r=e.starting,i=e.deltaSource,o=r?t:n.prevEvent;"client"===i?(t.dx=t.clientX-o.clientX,t.dy=t.clientY-o.clientY):(t.dx=t.pageX-o.pageX,t.dy=t.pageY-o.pageY)}),l.signals=a,t.exports=l},{"./defaultOptions":18,"./utils/Signals":35,"./utils/extend":41,"./utils/getOriginXY":42}],4:[function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=e("./utils/is"),o=e("./utils/events"),s=e("./utils/extend"),a=e("./actions/base"),l=e("./scope"),c=e("./Eventable"),p=e("./defaultOptions"),u=e("./utils/Signals").new(),d=e("./utils/domUtils"),f=d.getElementRect,v=d.nodeContains,g=d.trySelector,h=e("./utils/window"),m=h.getWindow,y=e("./utils/arr"),x=y.indexOf,b=y.contains,w=e("./utils/browser"),E=w.wheelEvent;l.interactables=[];var S=function(){function e(t,n){r(this,e),n=n||{},this.target=t,this.events=new c,this._context=n.context||l.document,this._win=m(g(t)?this._context:t),this._doc=this._win.document,u.fire("new",{target:t,options:n,interactable:this,win:this._win}),l.addDocument(this._doc,this._win),l.interactables.push(this),this.set(n)}return e.prototype.setOnEvents=function(e,t){var n="on"+e;return i.function(t.onstart)&&(this.events[n+"start"]=t.onstart),i.function(t.onmove)&&(this.events[n+"move"]=t.onmove),i.function(t.onend)&&(this.events[n+"end"]=t.onend),i.function(t.oninertiastart)&&(this.events[n+"inertiastart"]=t.oninertiastart),this},e.prototype.setPerAction=function(e,t){for(var n in t)n in p[e]&&(i.object(t[n])?(this.options[e][n]=s(this.options[e][n]||{},t[n]),i.object(p.perAction[n])&&"enabled"in p.perAction[n]&&(this.options[e][n].enabled=!1!==t[n].enabled)):i.bool(t[n])&&i.object(p.perAction[n])?this.options[e][n].enabled=t[n]:void 0!==t[n]&&(this.options[e][n]=t[n]))},e.prototype.getRect=function(e){return e=e||this.target,i.string(this.target)&&!i.element(e)&&(e=this._context.querySelector(this.target)),f(e)},e.prototype.rectChecker=function(e){return i.function(e)?(this.getRect=e,this):null===e?(delete this.options.getRect,this):this.getRect},e.prototype._backCompatOption=function(e,t){if(g(t)||i.object(t)){this.options[e]=t;for(var n=a.names,r=Array.isArray(n),o=0,n=r?n:n[Symbol.iterator]();;){var s;if(r){if(o>=n.length)break;s=n[o++]}else{if(o=n.next(),o.done)break;s=o.value}var l=s;this.options[l][e]=t}return this}return this.options[e]},e.prototype.origin=function(e){return this._backCompatOption("origin",e)},e.prototype.deltaSource=function(e){return"page"===e||"client"===e?(this.options.deltaSource=e,this):this.options.deltaSource},e.prototype.context=function(){return this._context},e.prototype.inContext=function(e){return this._context===e.ownerDocument||v(this._context,e)},e.prototype.fire=function(e){return this.events.fire(e),this},e.prototype._onOffMultiple=function(e,t,n,r){if(i.string(t)&&-1!==t.search(" ")&&(t=t.trim().split(/ +/)),i.array(t)){for(var o=0;o=l.length)break;f=l[d++]}else{if(d=l.next(),d.done)break;f=d.value}var v=f;this.options[v]=p.base[v],v in t&&this[v](t[v])}return u.fire("set",{options:t,interactable:this}),this},e.prototype.unset=function(){if(o.remove(this.target,"all"),i.string(this.target))for(var e in o.delegatedEvents){var t=o.delegatedEvents[e];t.selectors[0]===this.target&&t.contexts[0]===this._context&&(t.selectors.splice(0,1),t.contexts.splice(0,1),t.listeners.splice(0,1),t.selectors.length||(t[e]=null)),o.remove(this._context,e,o.delegateListener),o.remove(this._context,e,o.delegateUseCapture,!0)}else o.remove(this,"all");u.fire("unset",{interactable:this}),l.interactables.splice(x(l.interactables,this),1);for(var n=l.interactions||[],r=Array.isArray(n),s=0,n=r?n:n[Symbol.iterator]();;){var a;if(r){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var c=a;c.target===this&&c.interacting()&&c.stop()}return l.interact},e}();l.interactables.indexOfElement=function(e,t){t=t||l.document;for(var n=0;n=y.length)break;w=y[b++]}else{if(b=y.next(),b.done)break;w=b.value}var E=w,S=E[0],T=E[1];T._updateEventTargets(r,i),T[e](S,t,r,i)}}}function o(e){for(var t=0;te.pointerMoveTolerance);var a={pointer:t,pointerIndex:this.getPointerIndex(t),event:n,eventTarget:r,dx:o,dy:s,duplicate:i,interaction:this,interactingBeforeMove:this.interacting()};i||l.setCoordDeltas(this.pointerDelta,this.prevCoords,this.curCoords),d.fire("move",a),i||(this.interacting()&&this.doMove(a),this.pointerWasMoved&&l.copyCoords(this.prevCoords,this.curCoords))},e.prototype.doMove=function(e){e=l.extend({pointer:this.pointers[0],event:this.prevEvent,eventTarget:this._eventTarget,interaction:this},e||{}),d.fire("before-action-move",e),this._dontFireMove||d.fire("action-move",e),this._dontFireMove=!1},e.prototype.pointerUp=function(e,t,n,r){var i=this.getPointerIndex(e);d.fire(/cancel$/i.test(t.type)?"cancel":"up",{pointer:e,pointerIndex:i,event:t,eventTarget:n,curEventTarget:r,interaction:this}),this.simulation||this.end(t),this.pointerIsDown=!1,this.removePointer(e,t)},e.prototype.end=function(e){e=e||this.prevEvent,this.interacting()&&d.fire("action-end",{event:e,interaction:this}),this.stop()},e.prototype.currentAction=function(){return this._interacting?this.prepared.name:null},e.prototype.interacting=function(){return this._interacting},e.prototype.stop=function(){d.fire("stop",{interaction:this}),this._interacting&&(d.fire("stop-active",{interaction:this}),d.fire("stop-"+this.prepared.name,{interaction:this})),this.target=this.element=null,this._interacting=!1,this.prepared.name=this.prevEvent=null},e.prototype.getPointerIndex=function(e){return l.indexOf(this.pointerIds,l.getPointerId(e))},e.prototype.updatePointer=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:t&&/(down|start)$/i.test(t.type),r=l.getPointerId(e),i=this.getPointerIndex(e);return-1===i&&(i=this.pointerIds.length,this.pointerIds[i]=r),n&&d.fire("update-pointer-down",{pointer:e,event:t,down:n,pointerId:r,pointerIndex:i,interaction:this}),this.pointers[i]=e,i},e.prototype.removePointer=function(e,t){var n=l.getPointerId(e),r=this.mouse?0:l.indexOf(this.pointerIds,n);-1!==r&&(d.fire("remove-pointer",{pointer:e,event:t,pointerIndex:r,interaction:this}),this.pointers.splice(r,1),this.pointerIds.splice(r,1),this.downTargets.splice(r,1),this.downTimes.splice(r,1))},e.prototype._updateEventTargets=function(e,t){this._eventTarget=e,this._curEventTarget=t},e}(),m=0,y=v.length;m=i.length)break;a=i[s++]}else{if(s=i.next(),s.done)break;a=s.value}var l=a;if(l.options.drop.enabled){var c=l.options.drop.accept;if(!(p.is.element(c)&&c!==t||p.is.string(c)&&!p.matchesSelector(t,c)))for(var d=p.is.string(l.target)?l._context.querySelectorAll(l.target):[l.target],f=0;fo.left&&c.xo.top&&c.y=o.left&&v<=o.right&&g>=o.top&&g<=o.bottom}if(f&&p.is.number(a)){s=Math.max(0,Math.min(o.right,f.right)-Math.max(o.left,f.left))*Math.max(0,Math.min(o.bottom,f.bottom)-Math.max(o.top,f.top))/(f.width*f.height)>=a}return this.options.drop.checker&&(s=this.options.drop.checker(e,t,s,this,i,n,r)),s},v.signals.on("unset",function(e){e.interactable.dropzone(!1)}),v.settingsMethods.push("dropChecker"),g.signals.on("new",function(e){e.dropTarget=null,e.dropElement=null,e.prevDropTarget=null,e.prevDropElement=null,e.dropEvents=null,e.activeDrops={dropzones:[],elements:[],rects:[]}}),g.signals.on("stop",function(e){var t=e.interaction;t.dropTarget=t.dropElement=t.prevDropTarget=t.prevDropElement=null}),d.dynamicDrop=function(e){return p.is.bool(e)?(y=e,d):y},p.merge(v.eventTypes,["dragenter","dragleave","dropactivate","dropdeactivate","dropmove","drop"]),c.methodDict.drop="dropzone",h.drop=m.defaults,t.exports=m},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../interact":21,"../scope":34,"../utils":44,"./base":6}],9:[function(e,t,n){"use strict";var r=e("./base"),i=e("../utils"),o=e("../InteractEvent"),s=e("../Interactable"),a=e("../Interaction"),l=e("../defaultOptions"),c={defaults:{enabled:!1,origin:null,restrict:null},checker:function(e,t,n,r,i){return i.pointerIds.length>=2?{name:"gesture"}:null},getCursor:function(){return""}};o.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;"gesturestart"===t.type&&(t.ds=0,n.gesture.startDistance=n.gesture.prevDistance=t.distance,n.gesture.startAngle=n.gesture.prevAngle=t.angle,n.gesture.scale=1)}),o.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;"gesturemove"===t.type&&(t.ds=t.scale-n.gesture.scale,n.target.fire(t),n.gesture.prevAngle=t.angle,n.gesture.prevDistance=t.distance,t.scale===1/0||null===t.scale||void 0===t.scale||isNaN(t.scale)||(n.gesture.scale=t.scale))}),s.prototype.gesturable=function(e){return i.is.object(e)?(this.options.gesture.enabled=!1!==e.enabled,this.setPerAction("gesture",e),this.setOnEvents("gesture",e),this):i.is.bool(e)?(this.options.gesture.enabled=e,e||(this.ongesturestart=this.ongesturestart=this.ongestureend=null),this):this.options.gesture},o.signals.on("set-delta",function(e){var t=e.interaction,n=e.iEvent,r=e.action,s=e.event,a=e.starting,l=e.ending,c=e.deltaSource;if("gesture"===r){var p=t.pointers;n.touches=[p[0],p[1]],a?(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=1,n.ds=0,n.angle=i.touchAngle(p,void 0,c),n.da=0):l||s instanceof o?(n.distance=t.prevEvent.distance,n.box=t.prevEvent.box,n.scale=t.prevEvent.scale,n.ds=n.scale-1,n.angle=t.prevEvent.angle,n.da=n.angle-t.gesture.startAngle):(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=n.distance/t.gesture.startDistance,n.angle=i.touchAngle(p,t.gesture.prevAngle,c),n.ds=n.scale-t.gesture.prevScale,n.da=n.angle-t.gesture.prevAngle)}}),a.signals.on("new",function(e){e.gesture={start:{x:0,y:0},startDistance:0,prevDistance:0,distance:0,scale:1,startAngle:0,prevAngle:0}}),r.gesture=c,r.names.push("gesture"),i.merge(s.eventTypes,["gesturestart","gesturemove","gestureend"]),r.methodDict.gesture="gesturable",l.gesture=c.defaults,t.exports=c},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"./base":6}],10:[function(e,t,n){"use strict";function r(e,t,n,r,i,s,a){if(!t)return!1;if(!0===t){var l=o.is.number(s.width)?s.width:s.right-s.left,c=o.is.number(s.height)?s.height:s.bottom-s.top;if(l<0&&("left"===e?e="right":"right"===e&&(e="left")),c<0&&("top"===e?e="bottom":"bottom"===e&&(e="top")),"left"===e)return n.x<(l>=0?s.left:s.right)+a;if("top"===e)return n.y<(c>=0?s.top:s.bottom)+a;if("right"===e)return n.x>(l>=0?s.right:s.left)-a;if("bottom"===e)return n.y>(c>=0?s.bottom:s.top)-a}return!!o.is.element(r)&&(o.is.element(t)?t===r:o.matchesUpTo(r,t,i))}var i=e("./base"),o=e("../utils"),s=e("../utils/browser"),a=e("../InteractEvent"),l=e("../Interactable"),c=e("../Interaction"),p=e("../defaultOptions"),u=s.supportsTouch||s.supportsPointerEvent?20:10,d={defaults:{enabled:!1,mouseButtons:null,origin:null,snap:null,restrict:null,inertia:null,autoScroll:null,square:!1,preserveAspectRatio:!1,axis:"xy",margin:NaN,edges:null,invert:"none"},checker:function(e,t,n,i,s,a){if(!a)return null;var l=o.extend({},s.curCoords.page),c=n.options;if(c.resize.enabled){var p=c.resize,d={left:!1,right:!1,top:!1,bottom:!1};if(o.is.object(p.edges)){for(var f in d)d[f]=r(f,p.edges[f],l,s._eventTarget,i,a,p.margin||u);if(d.left=d.left&&!d.right,d.top=d.top&&!d.bottom,d.left||d.right||d.top||d.bottom)return{name:"resize",edges:d}}else{var v="y"!==c.resize.axis&&l.x>a.right-u,g="x"!==c.resize.axis&&l.y>a.bottom-u;if(v||g)return{name:"resize",axes:(v?"x":"")+(g?"y":"")}}}return null},cursors:s.isIe9OrOlder?{x:"e-resize",y:"s-resize",xy:"se-resize",top:"n-resize",left:"w-resize",bottom:"s-resize",right:"e-resize",topleft:"se-resize",bottomright:"se-resize",topright:"ne-resize",bottomleft:"ne-resize"}:{x:"ew-resize",y:"ns-resize",xy:"nwse-resize",top:"ns-resize",left:"ew-resize",bottom:"ns-resize",right:"ew-resize",topleft:"nwse-resize",bottomright:"nwse-resize",topright:"nesw-resize",bottomleft:"nesw-resize"},getCursor:function(e){if(e.axis)return d.cursors[e.name+e.axis];if(e.edges){for(var t="",n=["top","bottom","left","right"],r=0;r<4;r++)e.edges[n[r]]&&(t+=n[r]);return d.cursors[t]}}};a.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;if("resizestart"===t.type&&n.prepared.edges){var r=n.target.getRect(n.element),i=n.target.options.resize;if(i.square||i.preserveAspectRatio){var s=o.extend({},n.prepared.edges);s.top=s.top||s.left&&!s.bottom,s.left=s.left||s.top&&!s.right,s.bottom=s.bottom||s.right&&!s.top,s.right=s.right||s.bottom&&!s.left,n.prepared._linkedEdges=s}else n.prepared._linkedEdges=null;i.preserveAspectRatio&&(n.resizeStartAspectRatio=r.width/r.height),n.resizeRects={start:r,current:o.extend({},r),inverted:o.extend({},r),previous:o.extend({},r),delta:{left:0,right:0,width:0,top:0,bottom:0,height:0}},t.rect=n.resizeRects.inverted,t.deltaRect=n.resizeRects.delta}}),a.signals.on("new",function(e){var t=e.iEvent,n=e.phase,r=e.interaction;if("move"===n&&r.prepared.edges){var i=r.target.options.resize,s=i.invert,a="reposition"===s||"negate"===s,l=r.prepared.edges,c=r.resizeRects.start,p=r.resizeRects.current,u=r.resizeRects.inverted,d=r.resizeRects.delta,f=o.extend(r.resizeRects.previous,u),v=l,g=t.dx,h=t.dy;if(i.preserveAspectRatio||i.square){var m=i.preserveAspectRatio?r.resizeStartAspectRatio:1;l=r.prepared._linkedEdges,v.left&&v.bottom||v.right&&v.top?h=-g/m:v.left||v.right?h=g/m:(v.top||v.bottom)&&(g=h*m)}if(l.top&&(p.top+=h),l.bottom&&(p.bottom+=h),l.left&&(p.left+=g),l.right&&(p.right+=g),a){if(o.extend(u,p),"reposition"===s){var y=void 0;u.top>u.bottom&&(y=u.top,u.top=u.bottom,u.bottom=y),u.left>u.right&&(y=u.left,u.left=u.right,u.right=y)}}else u.top=Math.min(p.top,c.bottom),u.bottom=Math.max(p.bottom,c.top),u.left=Math.min(p.left,c.right),u.right=Math.max(p.right,c.left);u.width=u.right-u.left,u.height=u.bottom-u.top;for(var x in u)d[x]=u[x]-f[x];t.edges=r.prepared.edges,t.rect=u,t.deltaRect=d}}),l.prototype.resizable=function(e){return o.is.object(e)?(this.options.resize.enabled=!1!==e.enabled,this.setPerAction("resize",e),this.setOnEvents("resize",e),/^x$|^y$|^xy$/.test(e.axis)?this.options.resize.axis=e.axis:null===e.axis&&(this.options.resize.axis=p.resize.axis),o.is.bool(e.preserveAspectRatio)?this.options.resize.preserveAspectRatio=e.preserveAspectRatio:o.is.bool(e.square)&&(this.options.resize.square=e.square),this):o.is.bool(e)?(this.options.resize.enabled=e,e||(this.onresizestart=this.onresizestart=this.onresizeend=null),this):this.options.resize},c.signals.on("new",function(e){ -e.resizeAxes="xy"}),a.signals.on("set-delta",function(e){var t=e.interaction,n=e.iEvent;"resize"===e.action&&t.resizeAxes&&(t.target.options.resize.square?("y"===t.resizeAxes?n.dx=n.dy:n.dy=n.dx,n.axes="xy"):(n.axes=t.resizeAxes,"x"===t.resizeAxes?n.dy=0:"y"===t.resizeAxes&&(n.dx=0)))}),i.resize=d,i.names.push("resize"),o.merge(l.eventTypes,["resizestart","resizemove","resizeinertiastart","resizeinertiaresume","resizeend"]),i.methodDict.resize="resizable",p.resize=d.defaults,t.exports=d},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"../utils/browser":37,"./base":6}],11:[function(e,t,n){"use strict";var r=e("./utils/raf"),i=e("./utils/window").getWindow,o=e("./utils/is"),s=e("./utils/domUtils"),a=e("./Interaction"),l=e("./defaultOptions"),c={defaults:{enabled:!1,container:null,margin:60,speed:300},interaction:null,i:null,x:0,y:0,isScrolling:!1,prevTime:0,start:function(e){c.isScrolling=!0,r.cancel(c.i),c.interaction=e,c.prevTime=(new Date).getTime(),c.i=r.request(c.scroll)},stop:function(){c.isScrolling=!1,r.cancel(c.i)},scroll:function(){var e=c.interaction.target.options[c.interaction.prepared.name].autoScroll,t=e.container||i(c.interaction.element),n=(new Date).getTime(),s=(n-c.prevTime)/1e3,a=e.speed*s;a>=1&&(o.window(t)?t.scrollBy(c.x*a,c.y*a):t&&(t.scrollLeft+=c.x*a,t.scrollTop+=c.y*a),c.prevTime=n),c.isScrolling&&(r.cancel(c.i),c.i=r.request(c.scroll))},check:function(e,t){var n=e.options;return n[t].autoScroll&&n[t].autoScroll.enabled},onInteractionMove:function(e){var t=e.interaction,n=e.pointer;if(t.interacting()&&c.check(t.target,t.prepared.name)){if(t.simulation)return void(c.x=c.y=0);var r=void 0,a=void 0,l=void 0,p=void 0,u=t.target.options[t.prepared.name].autoScroll,d=u.container||i(t.element);if(o.window(d))p=n.clientXd.innerWidth-c.margin,l=n.clientY>d.innerHeight-c.margin;else{var f=s.getElementClientRect(d);p=n.clientXf.right-c.margin,l=n.clientY>f.bottom-c.margin}c.x=a?1:p?-1:0,c.y=l?1:r?-1:0,c.isScrolling||(c.margin=u.margin,c.speed=u.speed,c.start(t))}}};a.signals.on("stop-active",function(){c.stop()}),a.signals.on("action-move",c.onInteractionMove),l.perAction.autoScroll=c.defaults,t.exports=c},{"./Interaction":5,"./defaultOptions":18,"./utils/domUtils":39,"./utils/is":46,"./utils/raf":50,"./utils/window":52}],12:[function(e,t,n){"use strict";var r=e("../Interactable"),i=e("../actions/base"),o=e("../utils/is"),s=e("../utils/domUtils");r.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},r.prototype.ignoreFrom=function(e){return this._backCompatOption("ignoreFrom",e)},r.prototype.allowFrom=function(e){return this._backCompatOption("allowFrom",e)},r.prototype.testIgnore=function(e,t,n){return!(!e||!o.element(n))&&(o.string(e)?s.matchesUpTo(n,e,t):!!o.element(e)&&s.nodeContains(e,n))},r.prototype.testAllow=function(e,t,n){return!e||!!o.element(n)&&(o.string(e)?s.matchesUpTo(n,e,t):!!o.element(e)&&s.nodeContains(e,n))},r.prototype.testIgnoreAllow=function(e,t,n){return!this.testIgnore(e.ignoreFrom,t,n)&&this.testAllow(e.allowFrom,t,n)},r.prototype.actionChecker=function(e){return o.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},r.prototype.styleCursor=function(e){return o.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},r.prototype.defaultActionChecker=function(e,t,n,r){for(var o=this.getRect(r),s=null,a=i.names,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var u=p;if((!n.pointerIsDown||!n.mouse||0!=(t.buttons&this.options[u].mouseButtons))&&(s=i[u].checker(e,t,this,r,n,o)))return s}}},{"../Interactable":4,"../actions/base":6,"../utils/domUtils":39,"../utils/is":46}],13:[function(e,t,n){"use strict";function r(e,t,n,r){return g.is.object(e)&&t.testIgnoreAllow(t.options[e.name],n,r)&&t.options[e.name].enabled&&a(t,n,e)?e:null}function i(e,t,n,i,o,s){for(var a=0,l=i.length;a=m.maxInteractions)return!1;if(u.target===e){if((a+=d===n.name|0)>=i)return!1;if(u.element===t&&(l++,d!==n.name||l>=o))return!1}}}return m.maxInteractions>0}}var l=e("../interact"),c=e("../Interactable"),p=e("../Interaction"),u=e("../actions/base"),d=e("../defaultOptions"),f=e("../utils/browser"),v=e("../scope"),g=e("../utils"),h=e("../utils/Signals").new();e("./InteractableMethods");var m={signals:h,withinInteractionLimit:a,maxInteractions:1/0,defaults:{perAction:{manualStart:!1,max:1/0,maxPerElement:1,allowFrom:null,ignoreFrom:null}},setActionDefaults:function(e){g.extend(e.defaults,m.defaults.perAction)}};p.signals.on("down",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;if(!t.interacting()){s(t,o(t,n,r,i))}}),p.signals.on("move",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;if(t.mouse&&!t.pointerIsDown&&!t.interacting()){s(t,o(t,n,r,i))}}),p.signals.on("move",function(e){var t=e.interaction,n=e.event;if(t.pointerIsDown&&!t.interacting()&&t.pointerWasMoved&&t.prepared.name){h.fire("before-start",e);var r=t.target;t.prepared.name&&r&&(r.options[t.prepared.name].manualStart||!a(r,t.element,t.prepared)?t.stop(n):t.start(t.prepared,r,t.element))}}),p.signals.on("stop",function(e){var t=e.interaction,n=t.target;n&&n.options.styleCursor&&(n._doc.documentElement.style.cursor="")}),c.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},c.prototype.actionChecker=function(e){return g.is.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},c.prototype.styleCursor=function(e){return g.is.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},c.prototype.defaultActionChecker=function(e,t,n,r){for(var i=this.getRect(r),o=t.buttons||{0:1,1:4,3:8,4:16}[t.button],s=null,a=u.names,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var d=p;if((!n.pointerIsDown||!n.mouse||0!=(o&this.options[d].mouseButtons))&&(s=u[d].checker(e,t,this,r,n,i)))return s}},l.maxInteractions=function(e){return g.is.number(e)?(m.maxInteractions=e,this):m.maxInteractions},c.settingsMethods.push("styleCursor"),c.settingsMethods.push("actionChecker"),c.settingsMethods.push("ignoreFrom"),c.settingsMethods.push("allowFrom"),d.base.actionChecker=null,d.base.styleCursor=!0,g.extend(d.perAction,m.defaults.perAction),t.exports=m},{"../Interactable":4,"../Interaction":5,"../actions/base":6,"../defaultOptions":18,"../interact":21,"../scope":34,"../utils":44,"../utils/Signals":35,"../utils/browser":37,"./InteractableMethods":12}],14:[function(e,t,n){"use strict";var r=e("./base"),i=e("../Interaction");i.signals.on("new",function(e){e.delayTimer=null}),r.signals.on("prepared",function(e){var t=e.interaction,n=t.prepared.name;if(n){var r=t.target.options[n].delay;r>0&&(t.delayTimer=setTimeout(function(){t.start(t.prepared,t.target,t.element)},r))}}),i.signals.on("move",function(e){var t=e.interaction,n=e.duplicate;t.pointerWasMoved&&!n&&clearTimeout(t.delayTimer)}),r.signals.on("before-start",function(e){var t=e.interaction,n=t.prepared.name;if(n){t.target.options[n].delay>0&&(t.prepared.name=null)}})},{"../Interaction":5,"./base":13}],15:[function(e,t,n){"use strict";function r(e,t){if(!t)return!1;var n=t.options.drag.startAxis;return"xy"===e||"xy"===n||n===e}var i=e("./base"),o=e("../scope"),s=e("../utils/browser"),a=e("../utils/is"),l=e("../utils/domUtils"),c=l.matchesSelector,p=l.parentNode;i.setActionDefaults(e("../actions/drag")),i.signals.on("before-start",function(e){var t=e.interaction,n=e.eventTarget,l=e.dx,u=e.dy;if("drag"===t.prepared.name){var d=Math.abs(l),f=Math.abs(u),v=t.target.options.drag,g=v.startAxis,h=d>f?"x":dl.minSpeed&&g>l.endSpeed,b={interaction:t,pageCoords:v,statuses:f,preEnd:!0,requireEndOnly:!0};y&&!x&&(c.resetStatuses(f),m=c.setAll(b),m.shouldMove&&m.locked&&(h=!0)),(x||h)&&(p.copyCoords(i.upCoords,t.curCoords),t.pointers[0]=i.startEvent=new a(t,n,t.prepared.name,"inertiastart",t.element),i.t0=d,i.active=!0,i.allowResume=l.allowResume,t.simulation=i,o.fire(i.startEvent),x?(i.vx0=t.pointerDelta.client.vx,i.vy0=t.pointerDelta.client.vy,i.v0=g,r(t,i),p.extend(v,t.curCoords.page),v.x+=i.xe,v.y+=i.ye,c.resetStatuses(f),m=c.setAll(b),i.modifiedXe+=m.dx,i.modifiedYe+=m.dy,i.i=u.request(t.boundInertiaFrame)):(i.smoothEnd=!0,i.xe=m.dx,i.ye=m.dy,i.sx=i.sy=0,i.i=u.request(t.boundSmoothEndFrame)))}}),l.signals.on("stop-active",function(e){var t=e.interaction,n=t.inertiaStatus;n.active&&(u.cancel(n.i),n.active=!1,t.simulation=null)})},{"./InteractEvent":3,"./Interaction":5,"./modifiers":24,"./utils":44,"./utils/raf":50}],21:[function(e,t,n){"use strict";function r(e,t){var n=a.interactables.get(e,t);return n||(n=new l(e,t),n.events.global=p),n}var i=e("./utils/browser"),o=e("./utils/events"),s=e("./utils"),a=e("./scope"),l=e("./Interactable"),c=e("./Interaction"),p={};r.isSet=function(e,t){return-1!==a.interactables.indexOfElement(e,t&&t.context)},r.on=function(e,t,n){if(s.is.string(e)&&-1!==e.search(" ")&&(e=e.trim().split(/ +/)),s.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.on(f,t,n)}return r}if(s.is.object(e)){for(var v in e)r.on(v,e[v],t);return r}return s.contains(l.eventTypes,e)?p[e]?p[e].push(t):p[e]=[t]:o.add(a.document,e,t,{options:n}),r},r.off=function(e,t,n){if(s.is.string(e)&&-1!==e.search(" ")&&(e=e.trim().split(/ +/)),s.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.off(f,t,n)}return r}if(s.is.object(e)){for(var v in e)r.off(v,e[v],t);return r}if(s.contains(l.eventTypes,e)){var g=void 0;e in p&&-1!==(g=s.indexOf(p[e],t))&&p[e].splice(g,1)}else o.remove(a.document,e,t,n);return r},r.debug=function(){return a},r.getPointerAverage=s.pointerAverage,r.getTouchBBox=s.touchBBox,r.getTouchDistance=s.touchDistance,r.getTouchAngle=s.touchAngle,r.getElementRect=s.getElementRect,r.getElementClientRect=s.getElementClientRect,r.matchesSelector=s.matchesSelector,r.closest=s.closest,r.supportsTouch=function(){return i.supportsTouch},r.supportsPointerEvent=function(){return i.supportsPointerEvent},r.stop=function(e){for(var t=a.interactions.length-1;t>=0;t--)a.interactions[t].stop(e);return r},r.pointerMoveTolerance=function(e){return s.is.number(e)?(c.pointerMoveTolerance=e,this):c.pointerMoveTolerance},r.addDocument=a.addDocument,r.removeDocument=a.removeDocument,a.interact=r,t.exports=r},{"./Interactable":4,"./Interaction":5,"./scope":34,"./utils":44,"./utils/browser":37,"./utils/events":40}],22:[function(e,t,n){"use strict";function r(e){var t=e.interaction,n=e.event;t.target&&t.target.checkAndPreventDefault(n)}var i=e("./Interactable"),o=e("./Interaction"),s=e("./scope"),a=e("./utils/is"),l=e("./utils/events"),c=e("./utils/domUtils"),p=c.nodeContains,u=c.matchesSelector;i.prototype.preventDefault=function(e){return/^(always|never|auto)$/.test(e)?(this.options.preventDefault=e,this):a.bool(e)?(this.options.preventDefault=e?"always":"never",this):this.options.preventDefault},i.prototype.checkAndPreventDefault=function(e){var t=this.options.preventDefault;if("never"!==t)return"always"===t?void e.preventDefault():void(l.supportsOptions||/^(mouse|pointer|touch)*(down|start)/i.test(e.type)||a.element(e.target)&&u(e.target,"input,select,textarea,[contenteditable=true],[contenteditable=true] *")||e.preventDefault())};for(var d=["down","move","up","cancel"],f=0;f=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i;if(o.element&&(o.element===e.target||p(o.element,e.target)))return void o.target.checkAndPreventDefault(e)}}},{"./Interactable":4,"./Interaction":5,"./scope":34,"./utils/domUtils":39,"./utils/events":40,"./utils/is":46}],23:[function(e,t,n){"use strict";function r(e){var t=e.target,n=a.search(e,e.type,t);n&&n.prevTap&&e.clientX===n.prevTap.clientX&&e.clientY===n.prevTap.clientY&&t===n.prevTap.target&&(n.downTargets[0]=t,n.downTimes[0]=(new Date).getTime(),l.fire({interaction:n,event:e,eventTarget:t,pointer:e,type:"tap"}))}var i=e("./scope"),o=e("./utils/events"),s=e("./utils/browser"),a=e("./utils/interactionFinder"),l=e("./pointerEvents/base"),c=e("./utils/window"),p=c.window,u=Object.prototype.toString;if(p.Array.isArray||(p.Array.isArray=function(e){return"[object Array]"===u.call(e)}),String.prototype.trim||(String.prototype.trim=function(){return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")}),s.isIE8){var d=function(e){for(var t=i.interactions,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var o;if(n){if(r>=t.length)break;o=t[r++]}else{if(r=t.next(),r.done)break;o=r.value}var s=o;s.interacting()&&s.target.checkAndPreventDefault(e)}},f=function(e,t){var n=e.doc,i=(e.win,0===t.indexOf("listen")?o.add:o.remove);i(n,"selectstart",d),l&&i(n,"dblclick",r)};i.signals.on("add-document",f),i.signals.on("remove-document",f)}t.exports=null},{"./pointerEvents/base":31,"./scope":34,"./utils/browser":37,"./utils/events":40,"./utils/interactionFinder":45,"./utils/window":52}],24:[function(e,t,n){"use strict";function r(e,t,n){return e&&e.enabled&&(t||!e.endOnly)&&(!n||e.endOnly)}var i=e("../InteractEvent"),o=e("../Interaction"),s=e("../utils/extend"),a={names:[],setOffsets:function(e){var t=e.interaction,n=e.pageCoords,r=t.target,i=t.element,o=t.startOffset,s=r.getRect(i);s?(o.left=n.x-s.left,o.top=n.y-s.top,o.right=s.right-n.x,o.bottom=s.bottom-n.y,"width"in s||(s.width=s.right-s.left),"height"in s||(s.height=s.bottom-s.top)):o.left=o.top=o.right=o.bottom=0,e.rect=s,e.interactable=r,e.element=i;for(var l=0;l=p.length)break;f=p[d++]}else{if(d=p.next(),d.done)break;f=d.value}var v=f,g=a[v],h=t.target.options[t.prepared.name][v];r(h,i,o)&&(e.status=e.status=n[v],e.options=h,e.offset=e.interaction.modifierOffsets[v],g.set(e),e.status.locked&&(l.x+=e.status.dx,l.y+=e.status.dy,c.dx+=e.status.dx,c.dy+=e.status.dy,c.locked=!0))}return c.shouldMove=!e.status||!c.locked||e.status.changed,c},resetStatuses:function(e){for(var t=a.names,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var i;if(n){if(r>=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i,s=e[o]||{};s.dx=s.dy=0,s.modifiedX=s.modifiedY=NaN,s.locked=!1,s.changed=!0,e[o]=s}return e},start:function(e,t){var n=e.interaction,r={interaction:n,pageCoords:("action-resume"===t?n.curCoords:n.startCoords).page,startOffset:n.startOffset,statuses:n.modifierStatuses,preEnd:!1,requireEndOnly:!1};a.setOffsets(r),a.resetStatuses(r.statuses),r.pageCoords=s({},n.startCoords.page),n.modifierResult=a.setAll(r)}};o.signals.on("new",function(e){e.startOffset={left:0,right:0,top:0,bottom:0},e.modifierOffsets={},e.modifierStatuses=a.resetStatuses({}),e.modifierResult=null}),o.signals.on("action-start",a.start),o.signals.on("action-resume",a.start),o.signals.on("before-action-move",function(e){var t=e.interaction,n=e.preEnd,r=e.interactingBeforeMove,i=a.setAll({interaction:t,preEnd:n,pageCoords:t.curCoords.page,statuses:t.modifierStatuses,requireEndOnly:!1});!i.shouldMove&&r&&(t._dontFireMove=!0),t.modifierResult=i}),o.signals.on("action-end",function(e){for(var t=e.interaction,n=e.event,i=0;i=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}var m=h,y=m.x,x=m.y;l.push({x:s.left-i.width*y+u.x,y:s.top-i.height*x+u.y})}else l.push(u);return l},set:function(e){var t=e.interaction,n=e.pageCoords,r=e.status,i=e.options,s=e.offset,a=[],l=void 0,c=void 0,p=void 0;if(r.useStatusXY)c={x:r.x,y:r.y};else{var u=o.getOriginXY(t.target,t.element,t.prepared.name);c=o.extend({},n),c.x-=u.x,c.y-=u.y}r.realX=c.x,r.realY=c.y;for(var d=i.targets?i.targets.length:0,f=s,v=Array.isArray(f),g=0,f=v?f:f[Symbol.iterator]();;){var h;if(v){if(g>=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}for(var m=h,y=m.x,x=m.y,b=c.x-y,w=c.y-x,E=i.targets,S=Array.isArray(E),T=0,E=S?E:E[Symbol.iterator]();;){var C;if(S){if(T>=E.length)break;C=E[T++]}else{if(T=E.next(),T.done)break;C=T.value}var A=C;l=o.is.function(A)?A(b,w,t):A,l&&a.push({x:o.is.number(l.x)?l.x+y:b,y:o.is.number(l.y)?l.y+x:w,range:o.is.number(l.range)?l.range:i.range})}}var D={target:null,inRange:!1,distance:0,range:0,dx:0,dy:0};for(p=0,d=a.length;p=p.length)break;f=p[d++]}else{if(d=p.next(),d.done)break;f=d.value}var v=f,g=void 0;g=a.is.function(v)?v(l,c,t):v,g&&("width"in g&&"height"in g&&(g.x=g.width,g.y=g.height),e.options.targets.push(g))}i.set(e)},modifyCoords:function(e){var t=e.options;e.options=a.extend({},t), -e.options.enabled=t.enabled,e.options.relativePoints=[null],i.modifyCoords(e)}};r.snapSize=l,r.names.push("snapSize"),o.perAction.snapSize=l.defaults,s.defaults.snapSize=l.defaults,t.exports=l},{"../actions/resize":10,"../defaultOptions":18,"../utils/":44,"./index":24,"./snap":28}],30:[function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=e("../utils/pointerUtils");t.exports=function(){function e(t,n,o,s,a){if(r(this,e),i.pointerExtend(this,o),o!==n&&i.pointerExtend(this,n),this.interaction=a,this.timeStamp=(new Date).getTime(),this.originalEvent=o,this.type=t,this.pointerId=i.getPointerId(n),this.pointerType=i.getPointerType(n,a),this.target=s,this.currentTarget=null,"tap"===t){var l=a.getPointerIndex(n);this.dt=this.timeStamp-a.downTimes[l];var c=this.timeStamp-a.tapTime;this.double=!!(a.prevTap&&"doubletap"!==a.prevTap.type&&a.prevTap.target===this.target&&c<500)}else"doubletap"===t&&(this.dt=n.timeStamp-a.tapTime)}return e.prototype.subtractOrigin=function(e){var t=e.x,n=e.y;return this.pageX-=t,this.pageY-=n,this.clientX-=t,this.clientY-=n,this},e.prototype.addOrigin=function(e){var t=e.x,n=e.y;return this.pageX+=t,this.pageY+=n,this.clientX+=t,this.clientY+=n,this},e.prototype.preventDefault=function(){this.originalEvent.preventDefault()},e.prototype.stopPropagation=function(){this.propagationStopped=!0},e.prototype.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},e}()},{"../utils/pointerUtils":49}],31:[function(e,t,n){"use strict";function r(e){for(var t=e.interaction,n=e.pointer,s=e.event,l=e.eventTarget,c=e.type,u=void 0===c?e.pointerEvent.type:c,d=e.targets,f=void 0===d?i(e):d,v=e.pointerEvent,g=void 0===v?new o(u,n,s,l,t):v,h={interaction:t,pointer:n,event:s,eventTarget:l,targets:f,type:u,pointerEvent:g},m=0;m=u.length)break;g=u[v++]}else{if(v=u.next(),v.done)break;g=v.value}var h=g;c.element=h,p.fire("collect-targets",c)}return"hold"===o&&(c.targets=d(c.targets,function(e){return e.eventable.options.holdDuration===t.holdTimers[s].duration})),c.targets}var o=e("./PointerEvent"),s=e("../Interaction"),a=e("../utils"),l=e("../utils/browser"),c=e("../defaultOptions"),p=e("../utils/Signals").new(),u=e("../utils/arr"),d=u.filter,f=["down","up","cancel"],v=["down","up","cancel"],g={PointerEvent:o,fire:r,collectEventTargets:i,signals:p,defaults:{holdDuration:600,ignoreFrom:null,allowFrom:null,origin:{x:0,y:0}},types:["down","move","up","cancel","tap","doubletap","hold"]};s.signals.on("update-pointer-down",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers[n]={duration:1/0,timeout:null}}),s.signals.on("remove-pointer",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers.splice(n,1)}),s.signals.on("move",function(e){var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,s=e.duplicateMove,a=t.getPointerIndex(n);s||t.pointerIsDown&&!t.pointerWasMoved||(t.pointerIsDown&&clearTimeout(t.holdTimers[a].timeout),r({interaction:t,pointer:n,event:i,eventTarget:o,type:"move"}))}),s.signals.on("down",function(e){for(var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,s=e.pointerIndex,c=l.isIE8?a.extend({},i):i,u=t.holdTimers[s],d=a.getPath(o),f={interaction:t,pointer:n,event:i,eventTarget:o,type:"hold",targets:[],path:d,element:null},v=d,g=Array.isArray(v),h=0,v=g?v:v[Symbol.iterator]();;){var m;if(g){if(h>=v.length)break;m=v[h++]}else{if(h=v.next(),h.done)break;m=h.value}var y=m;f.element=y,p.fire("collect-targets",f)}if(f.targets.length){for(var x=1/0,b=0;b=0&&(p.selectors[u]!==e||p.contexts[u]!==t);u--);-1===u&&(u=p.selectors.length,p.selectors.push(e),p.contexts.push(t),p.listeners.push([])),p.listeners[u].push([i,!!s.capture,s.passive])}function s(e,t,n,r,o){var s=f(o),c=O[n],p=!1,u=void 0;if(c)for(u=c.selectors.length-1;u>=0;u--)if(c.selectors[u]===e&&c.contexts[u]===t){for(var d=c.listeners[u],v=d.length-1;v>=0;v--){var g=d[v],h=g[0],m=g[1],y=g[2];if(h===r&&m===!!s.capture&&y===s.passive){d.splice(v,1),d.length||(c.selectors.splice(u,1),c.contexts.splice(u,1),c.listeners.splice(u,1),i(t,n,a),i(t,n,l,!0),c.selectors.length||(O[n]=null)),p=!0;break}}if(p)break}}function a(e,t){var n=f(t),r={},i=O[e.type],o=g.getActualElement(e.path?e.path[0]:e.target),s=o;for(h(r,e),r.originalEvent=e,r.preventDefault=p;v.element(s);){for(var a=0;a=l.length)break;u=l[p++]}else{if(p=l.next(),p.done)break;u=p.value}var d=u,f=s[d](a);if(f)return f}},simulationResume:function(e){var t=e.mouseEvent,n=e.eventType,o=e.eventTarget;if(!/down|start/i.test(n))return null;for(var s=r.interactions,a=Array.isArray(s),l=0,s=a?s:s[Symbol.iterator]();;){var c;if(a){if(l>=s.length)break;c=s[l++]}else{if(l=s.next(),l.done)break;c=l.value}var p=c,u=o;if(p.simulation&&p.simulation.allowResume&&p.mouse===t)for(;u;){if(u===p.element)return p;u=i.parentNode(u)}}return null},mouse:function(e){var t=e.pointerId,n=e.mouseEvent,s=e.eventType;if(!n&&(o.supportsTouch||o.supportsPointerEvent))return null;for(var a=void 0,l=r.interactions,c=Array.isArray(l),p=0,l=c?l:l[Symbol.iterator]();;){var u;if(c){if(p>=l.length)break;u=l[p++]}else{if(p=l.next(),p.done)break;u=p.value}var d=u;if(d.mouse){if(d.simulation&&!i.contains(d.pointerIds,t))continue;if(d.interacting())return d;a||(a=d)}}if(a)return a;for(var f=r.interactions,v=Array.isArray(f),g=0,f=v?f:f[Symbol.iterator]();;){var h;if(v){if(g>=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}var m=h;if(m.mouse&&(!/down/.test(s)||!m.simulation))return m}return null},hasPointer:function(e){for(var t=e.pointerId,n=r.interactions,o=Array.isArray(n),s=0,n=o?n:n[Symbol.iterator]();;){var a;if(o){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var l=a;if(i.contains(l.pointerIds,t))return l}},idle:function(e){for(var t=e.mouseEvent,n=r.interactions,i=Array.isArray(n),o=0,n=i?n:n[Symbol.iterator]();;){var s;if(i){if(o>=n.length)break;s=n[o++]}else{if(o=n.next(),o.done)break;s=o.value}var a=s;if(1===a.pointerIds.length){var l=a.target;if(l&&!l.options.gesture.enabled)continue}else if(a.pointerIds.length>=2)continue;if(!a.interacting()&&t===a.mouse)return a}return null}};t.exports=s},{"../scope":34,"./browser":37,"./index":44}],46:[function(e,t,n){"use strict";var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},i=e("./window"),o=e("./isWindow"),s={array:function(){},window:function(e){return e===i.window||o(e)},docFrag:function(e){return s.object(e)&&11===e.nodeType},object:function(e){return!!e&&"object"===(void 0===e?"undefined":r(e))},function:function(e){return"function"==typeof e},number:function(e){return"number"==typeof e},bool:function(e){return"boolean"==typeof e},string:function(e){return"string"==typeof e},element:function(e){if(!e||"object"!==(void 0===e?"undefined":r(e)))return!1;var t=i.getWindow(e)||i.window;return/object|function/.test(r(t.Element))?e instanceof t.Element:1===e.nodeType&&"string"==typeof e.nodeName}};s.array=function(e){return s.object(e)&&void 0!==e.length&&s.function(e.splice)},t.exports=s},{"./isWindow":47,"./window":52}],47:[function(e,t,n){"use strict";t.exports=function(e){return!(!e||!e.Window)&&e instanceof e.Window}},{}],48:[function(e,t,n){"use strict";function r(e,n){for(var r in n){var i=t.exports.prefixedPropREs,o=!1;for(var s in i)if(0===r.indexOf(s)&&i[s].test(r)){o=!0;break}o||"function"==typeof n[r]||(e[r]=n[r])}return e}r.prefixedPropREs={webkit:/(Movement[XY]|Radius[XY]|RotationAngle|Force)$/},t.exports=r},{}],49:[function(e,t,n){"use strict";var r=e("./hypot"),i=e("./browser"),o=e("./domObjects"),s=e("./domUtils"),a=e("./is"),l=e("./pointerExtend"),c={copyCoords:function(e,t){e.page=e.page||{},e.page.x=t.page.x,e.page.y=t.page.y,e.client=e.client||{},e.client.x=t.client.x,e.client.y=t.client.y,e.timeStamp=t.timeStamp},setCoordDeltas:function(e,t,n){e.page.x=n.page.x-t.page.x,e.page.y=n.page.y-t.page.y,e.client.x=n.client.x-t.client.x,e.client.y=n.client.y-t.client.y,e.timeStamp=n.timeStamp-t.timeStamp;var i=Math.max(e.timeStamp/1e3,.001);e.page.speed=r(e.page.x,e.page.y)/i,e.page.vx=e.page.x/i,e.page.vy=e.page.y/i,e.client.speed=r(e.client.x,e.page.y)/i,e.client.vx=e.client.x/i,e.client.vy=e.client.y/i},isNativePointer:function(e){return e instanceof o.Event||e instanceof o.Touch},getXY:function(e,t,n){return n=n||{},e=e||"page",n.x=t[e+"X"],n.y=t[e+"Y"],n},getPageXY:function(e,t){return t=t||{},i.isOperaMobile&&c.isNativePointer(e)?(c.getXY("screen",e,t),t.x+=window.scrollX,t.y+=window.scrollY):c.getXY("page",e,t),t},getClientXY:function(e,t){return t=t||{},i.isOperaMobile&&c.isNativePointer(e)?c.getXY("screen",e,t):c.getXY("client",e,t),t},getPointerId:function(e){return a.number(e.pointerId)?e.pointerId:e.identifier},setCoords:function(e,t,n){var r=t.length>1?c.pointerAverage(t):t[0],i={};c.getPageXY(r,i),e.page.x=i.x,e.page.y=i.y,c.getClientXY(r,i),e.client.x=i.x,e.client.y=i.y,e.timeStamp=a.number(n)?n:(new Date).getTime()},pointerExtend:l,getTouchPair:function(e){var t=[];return a.array(e)?(t[0]=e[0],t[1]=e[1]):"touchend"===e.type?1===e.touches.length?(t[0]=e.touches[0],t[1]=e.changedTouches[0]):0===e.touches.length&&(t[0]=e.changedTouches[0],t[1]=e.changedTouches[1]):(t[0]=e.touches[0],t[1]=e.touches[1]),t},pointerAverage:function(e){for(var t={pageX:0,pageY:0,clientX:0,clientY:0,screenX:0,screenY:0},n=e,r=Array.isArray(n),i=0,n=r?n:n[Symbol.iterator]();;){var o;if(r){if(i>=n.length)break;o=n[i++]}else{if(i=n.next(),i.done)break;o=i.value}var s=o;for(var a in t)t[a]+=s[a]}for(var l in t)t[l]/=e.length;return t},touchBBox:function(e){if(e.length||e.touches&&e.touches.length>1){var t=c.getTouchPair(e),n=Math.min(t[0].pageX,t[1].pageX),r=Math.min(t[0].pageY,t[1].pageY);return{x:n,y:r,left:n,top:r,width:Math.max(t[0].pageX,t[1].pageX)-n,height:Math.max(t[0].pageY,t[1].pageY)-r}}},touchDistance:function(e,t){var n=t+"X",i=t+"Y",o=c.getTouchPair(e),s=o[0][n]-o[1][n],a=o[0][i]-o[1][i];return r(s,a)},touchAngle:function(e,t,n){var r=n+"X",i=n+"Y",o=c.getTouchPair(e),s=o[1][r]-o[0][r],a=o[1][i]-o[0][i];return 180*Math.atan2(a,s)/Math.PI},getPointerType:function(e,t){return t.mouse?"mouse":i.supportsPointerEvent?a.string(e.pointerType)?e.pointerType:[void 0,void 0,"touch","pen","mouse"][e.pointerType]:"touch"},getEventTargets:function(e){return[s.getActualElement(e.path?e.path[0]:e.target),s.getActualElement(e.currentTarget)]}};t.exports=c},{"./browser":37,"./domObjects":38,"./domUtils":39,"./hypot":43,"./is":46,"./pointerExtend":48}],50:[function(e,t,n){"use strict";for(var r=e("./window"),i=r.window,o=["ms","moz","webkit","o"],s=0,a=void 0,l=void 0,c=0;c6&&void 0!==arguments[6]&&arguments[6];r(this,e);var f=t.target,v=(f&&f.options||s).deltaSource,g=o(f,p,l),h="start"===c,m="end"===c,y=h?t.startCoords:t.curCoords,x=t.prevEvent;p=p||t.element;var b=i({},y.page),w=i({},y.client);b.x-=g.x,b.y-=g.y,w.x-=g.x,w.y-=g.y,this.ctrlKey=n.ctrlKey,this.altKey=n.altKey,this.shiftKey=n.shiftKey,this.metaKey=n.metaKey,this.button=n.button,this.buttons=n.buttons,this.target=p,this.currentTarget=p,this.relatedTarget=u||null,this.preEnd=d,this.type=l+(c||""),this.interaction=t,this.interactable=f,this.t0=h?t.downTimes[t.downTimes.length-1]:x.t0;var E={interaction:t,event:n,action:l,phase:c,element:p,related:u,page:b,client:w,coords:y,starting:h,ending:m,deltaSource:v,iEvent:this};a.fire("set-xy",E),m?(this.pageX=x.pageX,this.pageY=x.pageY,this.clientX=x.clientX,this.clientY=x.clientY):(this.pageX=b.x,this.pageY=b.y,this.clientX=w.x,this.clientY=w.y),this.x0=t.startCoords.page.x-g.x,this.y0=t.startCoords.page.y-g.y,this.clientX0=t.startCoords.client.x-g.x,this.clientY0=t.startCoords.client.y-g.y,a.fire("set-delta",E),this.timeStamp=y.timeStamp,this.dt=t.pointerDelta.timeStamp,this.duration=this.timeStamp-this.t0,this.speed=t.pointerDelta[v].speed,this.velocityX=t.pointerDelta[v].vx,this.velocityY=t.pointerDelta[v].vy,this.swipe=m||"inertiastart"===c?this.getSwipe():null,a.fire("new",E)}return e.prototype.getSwipe=function(){var e=this.interaction;if(e.prevEvent.speed<600||this.timeStamp-e.prevEvent.timeStamp>150)return null;var t=180*Math.atan2(e.prevEvent.velocityY,e.prevEvent.velocityX)/Math.PI;t<0&&(t+=360);var n=112.5<=t&&t<247.5,r=202.5<=t&&t<337.5,i=!n&&(292.5<=t||t<67.5);return{up:r,down:!r&&22.5<=t&&t<157.5,left:n,right:i,angle:t,speed:e.prevEvent.speed,velocity:{x:e.prevEvent.velocityX,y:e.prevEvent.velocityY}}},e.prototype.preventDefault=function(){},e.prototype.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},e.prototype.stopPropagation=function(){this.propagationStopped=!0},e}();a.on("set-delta",function(e){var t=e.iEvent,n=e.interaction,r=e.starting,i=e.deltaSource,o=r?t:n.prevEvent;"client"===i?(t.dx=t.clientX-o.clientX,t.dy=t.clientY-o.clientY):(t.dx=t.pageX-o.pageX,t.dy=t.pageY-o.pageY)}),l.signals=a,t.exports=l},{"./defaultOptions":18,"./utils/Signals":35,"./utils/extend":41,"./utils/getOriginXY":42}],4:[function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=e("./utils/is"),o=e("./utils/events"),s=e("./utils/extend"),a=e("./actions/base"),l=e("./scope"),c=e("./Eventable"),p=e("./defaultOptions"),u=e("./utils/Signals").new(),d=e("./utils/domUtils"),f=d.getElementRect,v=d.nodeContains,g=d.trySelector,h=e("./utils/window"),m=h.getWindow,y=e("./utils/arr"),x=y.indexOf,b=y.contains,w=e("./utils/browser"),E=w.wheelEvent;l.interactables=[];var S=function(){function e(t,n){r(this,e),n=n||{},this.target=t,this.events=new c,this._context=n.context||l.document,this._win=m(g(t)?this._context:t),this._doc=this._win.document,u.fire("new",{target:t,options:n,interactable:this,win:this._win}),l.addDocument(this._doc,this._win),l.interactables.push(this),this.set(n)}return e.prototype.setOnEvents=function(e,t){var n="on"+e;return i.function(t.onstart)&&(this.events[n+"start"]=t.onstart),i.function(t.onmove)&&(this.events[n+"move"]=t.onmove),i.function(t.onend)&&(this.events[n+"end"]=t.onend),i.function(t.oninertiastart)&&(this.events[n+"inertiastart"]=t.oninertiastart),this},e.prototype.setPerAction=function(e,t){for(var n in t)n in p[e]&&(i.object(t[n])?(this.options[e][n]=s(this.options[e][n]||{},t[n]),i.object(p.perAction[n])&&"enabled"in p.perAction[n]&&(this.options[e][n].enabled=!1!==t[n].enabled)):i.bool(t[n])&&i.object(p.perAction[n])?this.options[e][n].enabled=t[n]:void 0!==t[n]&&(this.options[e][n]=t[n]))},e.prototype.getRect=function(e){return e=e||this.target,i.string(this.target)&&!i.element(e)&&(e=this._context.querySelector(this.target)),f(e)},e.prototype.rectChecker=function(e){return i.function(e)?(this.getRect=e,this):null===e?(delete this.options.getRect,this):this.getRect},e.prototype._backCompatOption=function(e,t){if(g(t)||i.object(t)){this.options[e]=t;for(var n=a.names,r=Array.isArray(n),o=0,n=r?n:n[Symbol.iterator]();;){var s;if(r){if(o>=n.length)break;s=n[o++]}else{if(o=n.next(),o.done)break;s=o.value}var l=s;this.options[l][e]=t}return this}return this.options[e]},e.prototype.origin=function(e){return this._backCompatOption("origin",e)},e.prototype.deltaSource=function(e){return"page"===e||"client"===e?(this.options.deltaSource=e,this):this.options.deltaSource},e.prototype.context=function(){return this._context},e.prototype.inContext=function(e){return this._context===e.ownerDocument||v(this._context,e)},e.prototype.fire=function(e){return this.events.fire(e),this},e.prototype._onOffMultiple=function(e,t,n,r){if(i.string(t)&&-1!==t.search(" ")&&(t=t.trim().split(/ +/)),i.array(t)){for(var o=0;o=l.length)break;f=l[d++]}else{if(d=l.next(),d.done)break;f=d.value}var v=f;this.options[v]=p.base[v],v in t&&this[v](t[v])}return u.fire("set",{options:t,interactable:this}),this},e.prototype.unset=function(){if(o.remove(this.target,"all"),i.string(this.target))for(var e in o.delegatedEvents){var t=o.delegatedEvents[e];t.selectors[0]===this.target&&t.contexts[0]===this._context&&(t.selectors.splice(0,1),t.contexts.splice(0,1),t.listeners.splice(0,1),t.selectors.length||(t[e]=null)),o.remove(this._context,e,o.delegateListener),o.remove(this._context,e,o.delegateUseCapture,!0)}else o.remove(this,"all");u.fire("unset",{interactable:this}),l.interactables.splice(x(l.interactables,this),1);for(var n=l.interactions||[],r=Array.isArray(n),s=0,n=r?n:n[Symbol.iterator]();;){var a;if(r){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var c=a;c.target===this&&c.interacting()&&c.stop()}return l.interact},e}();l.interactables.indexOfElement=function(e,t){t=t||l.document;for(var n=0;n=x.length)break;E=x[w++]}else{if(w=x.next(),w.done)break;E=w.value}var S=E,T=S[0],C=S[1];C._updateEventTargets(i,o),C[e](T,t,i,o)}}}function o(e){for(var t=0;te.pointerMoveTolerance);var a={pointer:t,pointerIndex:this.getPointerIndex(t),event:n,eventTarget:r,dx:o,dy:s,duplicate:i,interaction:this,interactingBeforeMove:this.interacting()};i||l.setCoordDeltas(this.pointerDelta,this.prevCoords,this.curCoords),f.fire("move",a),i||(this.interacting()&&this.doMove(a),this.pointerWasMoved&&l.copyCoords(this.prevCoords,this.curCoords))},e.prototype.doMove=function(e){e=l.extend({pointer:this.pointers[0],event:this.prevEvent,eventTarget:this._eventTarget,interaction:this},e||{}),f.fire("before-action-move",e),this._dontFireMove||f.fire("action-move",e),this._dontFireMove=!1},e.prototype.pointerUp=function(e,t,n,r){var i=this.getPointerIndex(e);f.fire(/cancel$/i.test(t.type)?"cancel":"up",{pointer:e,pointerIndex:i,event:t,eventTarget:n,curEventTarget:r,interaction:this}),this.simulation||this.end(t),this.pointerIsDown=!1,this.removePointer(e,t)},e.prototype.end=function(e){e=e||this.prevEvent,this.interacting()&&f.fire("action-end",{event:e,interaction:this}),this.stop()},e.prototype.currentAction=function(){return this._interacting?this.prepared.name:null},e.prototype.interacting=function(){return this._interacting},e.prototype.stop=function(){f.fire("stop",{interaction:this}),this._interacting&&(f.fire("stop-active",{interaction:this}),f.fire("stop-"+this.prepared.name,{interaction:this})),this.target=this.element=null,this._interacting=!1,this.prepared.name=this.prevEvent=null},e.prototype.getPointerIndex=function(e){return"mouse"===this.pointerType||"pen"===this.pointerType?0:l.indexOf(this.pointerIds,l.getPointerId(e))},e.prototype.updatePointer=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:t&&/(down|start)$/i.test(t.type),r=l.getPointerId(e),i=this.getPointerIndex(e);return-1===i&&(i=this.pointerIds.length,this.pointerIds[i]=r),n&&f.fire("update-pointer-down",{pointer:e,event:t,down:n,pointerId:r,pointerIndex:i,interaction:this}),this.pointers[i]=e,i},e.prototype.removePointer=function(e,t){var n=this.getPointerIndex(e);-1!==n&&(f.fire("remove-pointer",{pointer:e,event:t,pointerIndex:n,interaction:this}),this.pointers.splice(n,1),this.pointerIds.splice(n,1),this.downTargets.splice(n,1),this.downTimes.splice(n,1))},e.prototype._updateEventTargets=function(e,t){this._eventTarget=e,this._curEventTarget=t},e}(),y=0,x=g.length;y=i.length)break;a=i[s++]}else{if(s=i.next(),s.done)break;a=s.value}var l=a;if(l.options.drop.enabled){var c=l.options.drop.accept;if(!(p.is.element(c)&&c!==t||p.is.string(c)&&!p.matchesSelector(t,c)))for(var d=p.is.string(l.target)?l._context.querySelectorAll(l.target):[l.target],f=0;fo.left&&c.xo.top&&c.y=o.left&&v<=o.right&&g>=o.top&&g<=o.bottom}if(f&&p.is.number(a)){s=Math.max(0,Math.min(o.right,f.right)-Math.max(o.left,f.left))*Math.max(0,Math.min(o.bottom,f.bottom)-Math.max(o.top,f.top))/(f.width*f.height)>=a}return this.options.drop.checker&&(s=this.options.drop.checker(e,t,s,this,i,n,r)),s},v.signals.on("unset",function(e){e.interactable.dropzone(!1)}),v.settingsMethods.push("dropChecker"),g.signals.on("new",function(e){e.dropTarget=null,e.dropElement=null,e.prevDropTarget=null,e.prevDropElement=null,e.dropEvents=null,e.activeDrops={dropzones:[],elements:[],rects:[]}}),g.signals.on("stop",function(e){var t=e.interaction;t.dropTarget=t.dropElement=t.prevDropTarget=t.prevDropElement=null}),d.dynamicDrop=function(e){return p.is.bool(e)?(y=e,d):y},p.merge(v.eventTypes,["dragenter","dragleave","dropactivate","dropdeactivate","dropmove","drop"]),c.methodDict.drop="dropzone",h.drop=m.defaults,t.exports=m},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../interact":21,"../scope":34,"../utils":44,"./base":6}],9:[function(e,t,n){"use strict";var r=e("./base"),i=e("../utils"),o=e("../InteractEvent"),s=e("../Interactable"),a=e("../Interaction"),l=e("../defaultOptions"),c={defaults:{enabled:!1,origin:null,restrict:null},checker:function(e,t,n,r,i){return i.pointerIds.length>=2?{name:"gesture"}:null},getCursor:function(){return""}};o.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;"gesturestart"===t.type&&(t.ds=0,n.gesture.startDistance=n.gesture.prevDistance=t.distance,n.gesture.startAngle=n.gesture.prevAngle=t.angle,n.gesture.scale=1)}),o.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;"gesturemove"===t.type&&(t.ds=t.scale-n.gesture.scale,n.target.fire(t),n.gesture.prevAngle=t.angle,n.gesture.prevDistance=t.distance,t.scale===1/0||null===t.scale||void 0===t.scale||isNaN(t.scale)||(n.gesture.scale=t.scale))}),s.prototype.gesturable=function(e){return i.is.object(e)?(this.options.gesture.enabled=!1!==e.enabled,this.setPerAction("gesture",e),this.setOnEvents("gesture",e),this):i.is.bool(e)?(this.options.gesture.enabled=e,e||(this.ongesturestart=this.ongesturestart=this.ongestureend=null),this):this.options.gesture},o.signals.on("set-delta",function(e){var t=e.interaction,n=e.iEvent,r=e.action,s=e.event,a=e.starting,l=e.ending,c=e.deltaSource;if("gesture"===r){var p=t.pointers;n.touches=[p[0],p[1]],a?(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=1,n.ds=0,n.angle=i.touchAngle(p,void 0,c),n.da=0):l||s instanceof o?(n.distance=t.prevEvent.distance,n.box=t.prevEvent.box,n.scale=t.prevEvent.scale,n.ds=n.scale-1,n.angle=t.prevEvent.angle,n.da=n.angle-t.gesture.startAngle):(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=n.distance/t.gesture.startDistance,n.angle=i.touchAngle(p,t.gesture.prevAngle,c),n.ds=n.scale-t.gesture.prevScale,n.da=n.angle-t.gesture.prevAngle)}}),a.signals.on("new",function(e){e.gesture={start:{x:0,y:0},startDistance:0,prevDistance:0,distance:0,scale:1,startAngle:0,prevAngle:0}}),r.gesture=c,r.names.push("gesture"),i.merge(s.eventTypes,["gesturestart","gesturemove","gestureend"]),r.methodDict.gesture="gesturable",l.gesture=c.defaults,t.exports=c},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"./base":6}],10:[function(e,t,n){"use strict";function r(e,t,n,r,i,s,a){if(!t)return!1;if(!0===t){var l=o.is.number(s.width)?s.width:s.right-s.left,c=o.is.number(s.height)?s.height:s.bottom-s.top;if(l<0&&("left"===e?e="right":"right"===e&&(e="left")),c<0&&("top"===e?e="bottom":"bottom"===e&&(e="top")),"left"===e)return n.x<(l>=0?s.left:s.right)+a;if("top"===e)return n.y<(c>=0?s.top:s.bottom)+a;if("right"===e)return n.x>(l>=0?s.right:s.left)-a;if("bottom"===e)return n.y>(c>=0?s.bottom:s.top)-a}return!!o.is.element(r)&&(o.is.element(t)?t===r:o.matchesUpTo(r,t,i))}var i=e("./base"),o=e("../utils"),s=e("../utils/browser"),a=e("../InteractEvent"),l=e("../Interactable"),c=e("../Interaction"),p=e("../defaultOptions"),u=s.supportsTouch||s.supportsPointerEvent?20:10,d={defaults:{enabled:!1,mouseButtons:null,origin:null,snap:null,restrict:null,inertia:null,autoScroll:null,square:!1,preserveAspectRatio:!1,axis:"xy",margin:NaN,edges:null,invert:"none"},checker:function(e,t,n,i,s,a){if(!a)return null;var l=o.extend({},s.curCoords.page),c=n.options;if(c.resize.enabled){var p=c.resize,d={left:!1,right:!1,top:!1,bottom:!1};if(o.is.object(p.edges)){for(var f in d)d[f]=r(f,p.edges[f],l,s._eventTarget,i,a,p.margin||u);if(d.left=d.left&&!d.right,d.top=d.top&&!d.bottom,d.left||d.right||d.top||d.bottom)return{name:"resize",edges:d}}else{var v="y"!==c.resize.axis&&l.x>a.right-u,g="x"!==c.resize.axis&&l.y>a.bottom-u;if(v||g)return{name:"resize",axes:(v?"x":"")+(g?"y":"")}}}return null},cursors:s.isIe9OrOlder?{x:"e-resize",y:"s-resize",xy:"se-resize",top:"n-resize",left:"w-resize",bottom:"s-resize",right:"e-resize",topleft:"se-resize",bottomright:"se-resize",topright:"ne-resize",bottomleft:"ne-resize"}:{x:"ew-resize",y:"ns-resize",xy:"nwse-resize",top:"ns-resize",left:"ew-resize",bottom:"ns-resize",right:"ew-resize",topleft:"nwse-resize",bottomright:"nwse-resize",topright:"nesw-resize",bottomleft:"nesw-resize"},getCursor:function(e){if(e.axis)return d.cursors[e.name+e.axis];if(e.edges){for(var t="",n=["top","bottom","left","right"],r=0;r<4;r++)e.edges[n[r]]&&(t+=n[r]);return d.cursors[t]}}};a.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;if("resizestart"===t.type&&n.prepared.edges){var r=n.target.getRect(n.element),i=n.target.options.resize;if(i.square||i.preserveAspectRatio){var s=o.extend({},n.prepared.edges);s.top=s.top||s.left&&!s.bottom,s.left=s.left||s.top&&!s.right,s.bottom=s.bottom||s.right&&!s.top,s.right=s.right||s.bottom&&!s.left,n.prepared._linkedEdges=s}else n.prepared._linkedEdges=null;i.preserveAspectRatio&&(n.resizeStartAspectRatio=r.width/r.height),n.resizeRects={start:r,current:o.extend({},r),inverted:o.extend({},r),previous:o.extend({},r),delta:{left:0,right:0,width:0,top:0,bottom:0,height:0}},t.rect=n.resizeRects.inverted,t.deltaRect=n.resizeRects.delta}}),a.signals.on("new",function(e){var t=e.iEvent,n=e.phase,r=e.interaction;if("move"===n&&r.prepared.edges){var i=r.target.options.resize,s=i.invert,a="reposition"===s||"negate"===s,l=r.prepared.edges,c=r.resizeRects.start,p=r.resizeRects.current,u=r.resizeRects.inverted,d=r.resizeRects.delta,f=o.extend(r.resizeRects.previous,u),v=l,g=t.dx,h=t.dy;if(i.preserveAspectRatio||i.square){var m=i.preserveAspectRatio?r.resizeStartAspectRatio:1;l=r.prepared._linkedEdges,v.left&&v.bottom||v.right&&v.top?h=-g/m:v.left||v.right?h=g/m:(v.top||v.bottom)&&(g=h*m)}if(l.top&&(p.top+=h),l.bottom&&(p.bottom+=h),l.left&&(p.left+=g),l.right&&(p.right+=g),a){if(o.extend(u,p),"reposition"===s){var y=void 0;u.top>u.bottom&&(y=u.top,u.top=u.bottom,u.bottom=y),u.left>u.right&&(y=u.left,u.left=u.right,u.right=y)}}else u.top=Math.min(p.top,c.bottom),u.bottom=Math.max(p.bottom,c.top),u.left=Math.min(p.left,c.right),u.right=Math.max(p.right,c.left);u.width=u.right-u.left,u.height=u.bottom-u.top;for(var x in u)d[x]=u[x]-f[x];t.edges=r.prepared.edges,t.rect=u,t.deltaRect=d}}),l.prototype.resizable=function(e){return o.is.object(e)?(this.options.resize.enabled=!1!==e.enabled,this.setPerAction("resize",e),this.setOnEvents("resize",e),/^x$|^y$|^xy$/.test(e.axis)?this.options.resize.axis=e.axis:null===e.axis&&(this.options.resize.axis=p.resize.axis),o.is.bool(e.preserveAspectRatio)?this.options.resize.preserveAspectRatio=e.preserveAspectRatio:o.is.bool(e.square)&&(this.options.resize.square=e.square),this):o.is.bool(e)?(this.options.resize.enabled=e, +e||(this.onresizestart=this.onresizestart=this.onresizeend=null),this):this.options.resize},c.signals.on("new",function(e){e.resizeAxes="xy"}),a.signals.on("set-delta",function(e){var t=e.interaction,n=e.iEvent;"resize"===e.action&&t.resizeAxes&&(t.target.options.resize.square?("y"===t.resizeAxes?n.dx=n.dy:n.dy=n.dx,n.axes="xy"):(n.axes=t.resizeAxes,"x"===t.resizeAxes?n.dy=0:"y"===t.resizeAxes&&(n.dx=0)))}),i.resize=d,i.names.push("resize"),o.merge(l.eventTypes,["resizestart","resizemove","resizeinertiastart","resizeinertiaresume","resizeend"]),i.methodDict.resize="resizable",p.resize=d.defaults,t.exports=d},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"../utils/browser":37,"./base":6}],11:[function(e,t,n){"use strict";var r=e("./utils/raf"),i=e("./utils/window").getWindow,o=e("./utils/is"),s=e("./utils/domUtils"),a=e("./Interaction"),l=e("./defaultOptions"),c={defaults:{enabled:!1,container:null,margin:60,speed:300},interaction:null,i:null,x:0,y:0,isScrolling:!1,prevTime:0,start:function(e){c.isScrolling=!0,r.cancel(c.i),c.interaction=e,c.prevTime=(new Date).getTime(),c.i=r.request(c.scroll)},stop:function(){c.isScrolling=!1,r.cancel(c.i)},scroll:function(){var e=c.interaction.target.options[c.interaction.prepared.name].autoScroll,t=e.container||i(c.interaction.element),n=(new Date).getTime(),s=(n-c.prevTime)/1e3,a=e.speed*s;a>=1&&(o.window(t)?t.scrollBy(c.x*a,c.y*a):t&&(t.scrollLeft+=c.x*a,t.scrollTop+=c.y*a),c.prevTime=n),c.isScrolling&&(r.cancel(c.i),c.i=r.request(c.scroll))},check:function(e,t){var n=e.options;return n[t].autoScroll&&n[t].autoScroll.enabled},onInteractionMove:function(e){var t=e.interaction,n=e.pointer;if(t.interacting()&&c.check(t.target,t.prepared.name)){if(t.simulation)return void(c.x=c.y=0);var r=void 0,a=void 0,l=void 0,p=void 0,u=t.target.options[t.prepared.name].autoScroll,d=u.container||i(t.element);if(o.window(d))p=n.clientXd.innerWidth-c.margin,l=n.clientY>d.innerHeight-c.margin;else{var f=s.getElementClientRect(d);p=n.clientXf.right-c.margin,l=n.clientY>f.bottom-c.margin}c.x=a?1:p?-1:0,c.y=l?1:r?-1:0,c.isScrolling||(c.margin=u.margin,c.speed=u.speed,c.start(t))}}};a.signals.on("stop-active",function(){c.stop()}),a.signals.on("action-move",c.onInteractionMove),l.perAction.autoScroll=c.defaults,t.exports=c},{"./Interaction":5,"./defaultOptions":18,"./utils/domUtils":39,"./utils/is":46,"./utils/raf":50,"./utils/window":52}],12:[function(e,t,n){"use strict";var r=e("../Interactable"),i=e("../actions/base"),o=e("../utils/is"),s=e("../utils/domUtils");r.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},r.prototype.ignoreFrom=function(e){return this._backCompatOption("ignoreFrom",e)},r.prototype.allowFrom=function(e){return this._backCompatOption("allowFrom",e)},r.prototype.testIgnore=function(e,t,n){return!(!e||!o.element(n))&&(o.string(e)?s.matchesUpTo(n,e,t):!!o.element(e)&&s.nodeContains(e,n))},r.prototype.testAllow=function(e,t,n){return!e||!!o.element(n)&&(o.string(e)?s.matchesUpTo(n,e,t):!!o.element(e)&&s.nodeContains(e,n))},r.prototype.testIgnoreAllow=function(e,t,n){return!this.testIgnore(e.ignoreFrom,t,n)&&this.testAllow(e.allowFrom,t,n)},r.prototype.actionChecker=function(e){return o.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},r.prototype.styleCursor=function(e){return o.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},r.prototype.defaultActionChecker=function(e,t,n,r){for(var o=this.getRect(r),s=null,a=i.names,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var u=p;if((!n.pointerIsDown||!n.mouse||0!=(t.buttons&this.options[u].mouseButtons))&&(s=i[u].checker(e,t,this,r,n,o)))return s}}},{"../Interactable":4,"../actions/base":6,"../utils/domUtils":39,"../utils/is":46}],13:[function(e,t,n){"use strict";function r(e,t,n,r){return g.is.object(e)&&t.testIgnoreAllow(t.options[e.name],n,r)&&t.options[e.name].enabled&&a(t,n,e)?e:null}function i(e,t,n,i,o,s){for(var a=0,l=i.length;a=m.maxInteractions)return!1;if(u.target===e){if((a+=d===n.name|0)>=i)return!1;if(u.element===t&&(l++,d!==n.name||l>=o))return!1}}}return m.maxInteractions>0}}var l=e("../interact"),c=e("../Interactable"),p=e("../Interaction"),u=e("../actions/base"),d=e("../defaultOptions"),f=e("../utils/browser"),v=e("../scope"),g=e("../utils"),h=e("../utils/Signals").new();e("./InteractableMethods");var m={signals:h,withinInteractionLimit:a,maxInteractions:1/0,defaults:{perAction:{manualStart:!1,max:1/0,maxPerElement:1,allowFrom:null,ignoreFrom:null}},setActionDefaults:function(e){g.extend(e.defaults,m.defaults.perAction)}};p.signals.on("down",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;if(!t.interacting()){s(t,o(t,n,r,i))}}),p.signals.on("move",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;if(t.mouse&&!t.pointerIsDown&&!t.interacting()){s(t,o(t,n,r,i))}}),p.signals.on("move",function(e){var t=e.interaction,n=e.event;if(t.pointerIsDown&&!t.interacting()&&t.pointerWasMoved&&t.prepared.name){h.fire("before-start",e);var r=t.target;t.prepared.name&&r&&(r.options[t.prepared.name].manualStart||!a(r,t.element,t.prepared)?t.stop(n):t.start(t.prepared,r,t.element))}}),p.signals.on("stop",function(e){var t=e.interaction,n=t.target;n&&n.options.styleCursor&&(n._doc.documentElement.style.cursor="")}),c.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},c.prototype.actionChecker=function(e){return g.is.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},c.prototype.styleCursor=function(e){return g.is.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},c.prototype.defaultActionChecker=function(e,t,n,r){for(var i=this.getRect(r),o=t.buttons||{0:1,1:4,3:8,4:16}[t.button],s=null,a=u.names,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var d=p;if((!n.pointerIsDown||!n.mouse||0!=(o&this.options[d].mouseButtons))&&(s=u[d].checker(e,t,this,r,n,i)))return s}},l.maxInteractions=function(e){return g.is.number(e)?(m.maxInteractions=e,this):m.maxInteractions},c.settingsMethods.push("styleCursor"),c.settingsMethods.push("actionChecker"),c.settingsMethods.push("ignoreFrom"),c.settingsMethods.push("allowFrom"),d.base.actionChecker=null,d.base.styleCursor=!0,g.extend(d.perAction,m.defaults.perAction),t.exports=m},{"../Interactable":4,"../Interaction":5,"../actions/base":6,"../defaultOptions":18,"../interact":21,"../scope":34,"../utils":44,"../utils/Signals":35,"../utils/browser":37,"./InteractableMethods":12}],14:[function(e,t,n){"use strict";var r=e("./base"),i=e("../Interaction");i.signals.on("new",function(e){e.delayTimer=null}),r.signals.on("prepared",function(e){var t=e.interaction,n=t.prepared.name;if(n){var r=t.target.options[n].delay;r>0&&(t.delayTimer=setTimeout(function(){t.start(t.prepared,t.target,t.element)},r))}}),i.signals.on("move",function(e){var t=e.interaction,n=e.duplicate;t.pointerWasMoved&&!n&&clearTimeout(t.delayTimer)}),r.signals.on("before-start",function(e){var t=e.interaction,n=t.prepared.name;if(n){t.target.options[n].delay>0&&(t.prepared.name=null)}})},{"../Interaction":5,"./base":13}],15:[function(e,t,n){"use strict";function r(e,t){if(!t)return!1;var n=t.options.drag.startAxis;return"xy"===e||"xy"===n||n===e}var i=e("./base"),o=e("../scope"),s=e("../utils/browser"),a=e("../utils/is"),l=e("../utils/domUtils"),c=l.matchesSelector,p=l.parentNode;i.setActionDefaults(e("../actions/drag")),i.signals.on("before-start",function(e){var t=e.interaction,n=e.eventTarget,l=e.dx,u=e.dy;if("drag"===t.prepared.name){var d=Math.abs(l),f=Math.abs(u),v=t.target.options.drag,g=v.startAxis,h=d>f?"x":dl.minSpeed&&g>l.endSpeed,b={interaction:t,pageCoords:v,statuses:f,preEnd:!0,requireEndOnly:!0};y&&!x&&(c.resetStatuses(f),m=c.setAll(b),m.shouldMove&&m.locked&&(h=!0)),(x||h)&&(p.copyCoords(i.upCoords,t.curCoords),t.pointers[0]=i.startEvent=new a(t,n,t.prepared.name,"inertiastart",t.element),i.t0=d,i.active=!0,i.allowResume=l.allowResume,t.simulation=i,o.fire(i.startEvent),x?(i.vx0=t.pointerDelta.client.vx,i.vy0=t.pointerDelta.client.vy,i.v0=g,r(t,i),p.extend(v,t.curCoords.page),v.x+=i.xe,v.y+=i.ye,c.resetStatuses(f),m=c.setAll(b),i.modifiedXe+=m.dx,i.modifiedYe+=m.dy,i.i=u.request(t.boundInertiaFrame)):(i.smoothEnd=!0,i.xe=m.dx,i.ye=m.dy,i.sx=i.sy=0,i.i=u.request(t.boundSmoothEndFrame)))}}),l.signals.on("stop-active",function(e){var t=e.interaction,n=t.inertiaStatus;n.active&&(u.cancel(n.i),n.active=!1,t.simulation=null)})},{"./InteractEvent":3,"./Interaction":5,"./modifiers":24,"./utils":44,"./utils/raf":50}],21:[function(e,t,n){"use strict";function r(e,t){var n=a.interactables.get(e,t);return n||(n=new l(e,t),n.events.global=p),n}var i=e("./utils/browser"),o=e("./utils/events"),s=e("./utils"),a=e("./scope"),l=e("./Interactable"),c=e("./Interaction"),p={};r.isSet=function(e,t){return-1!==a.interactables.indexOfElement(e,t&&t.context)},r.on=function(e,t,n){if(s.is.string(e)&&-1!==e.search(" ")&&(e=e.trim().split(/ +/)),s.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.on(f,t,n)}return r}if(s.is.object(e)){for(var v in e)r.on(v,e[v],t);return r}return s.contains(l.eventTypes,e)?p[e]?p[e].push(t):p[e]=[t]:o.add(a.document,e,t,{options:n}),r},r.off=function(e,t,n){if(s.is.string(e)&&-1!==e.search(" ")&&(e=e.trim().split(/ +/)),s.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.off(f,t,n)}return r}if(s.is.object(e)){for(var v in e)r.off(v,e[v],t);return r}if(s.contains(l.eventTypes,e)){var g=void 0;e in p&&-1!==(g=s.indexOf(p[e],t))&&p[e].splice(g,1)}else o.remove(a.document,e,t,n);return r},r.debug=function(){return a},r.getPointerAverage=s.pointerAverage,r.getTouchBBox=s.touchBBox,r.getTouchDistance=s.touchDistance,r.getTouchAngle=s.touchAngle,r.getElementRect=s.getElementRect,r.getElementClientRect=s.getElementClientRect,r.matchesSelector=s.matchesSelector,r.closest=s.closest,r.supportsTouch=function(){return i.supportsTouch},r.supportsPointerEvent=function(){return i.supportsPointerEvent},r.stop=function(e){for(var t=a.interactions.length-1;t>=0;t--)a.interactions[t].stop(e);return r},r.pointerMoveTolerance=function(e){return s.is.number(e)?(c.pointerMoveTolerance=e,this):c.pointerMoveTolerance},r.addDocument=a.addDocument,r.removeDocument=a.removeDocument,a.interact=r,t.exports=r},{"./Interactable":4,"./Interaction":5,"./scope":34,"./utils":44,"./utils/browser":37,"./utils/events":40}],22:[function(e,t,n){"use strict";function r(e){var t=e.interaction,n=e.event;t.target&&t.target.checkAndPreventDefault(n)}var i=e("./Interactable"),o=e("./Interaction"),s=e("./scope"),a=e("./utils/is"),l=e("./utils/events"),c=e("./utils/domUtils"),p=c.nodeContains,u=c.matchesSelector;i.prototype.preventDefault=function(e){return/^(always|never|auto)$/.test(e)?(this.options.preventDefault=e,this):a.bool(e)?(this.options.preventDefault=e?"always":"never",this):this.options.preventDefault},i.prototype.checkAndPreventDefault=function(e){var t=this.options.preventDefault;if("never"!==t)return"always"===t?void e.preventDefault():void(l.supportsOptions||/^(mouse|pointer|touch)*(down|start)/i.test(e.type)||a.element(e.target)&&u(e.target,"input,select,textarea,[contenteditable=true],[contenteditable=true] *")||e.preventDefault())};for(var d=["down","move","up","cancel"],f=0;f=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i;if(o.element&&(o.element===e.target||p(o.element,e.target)))return void o.target.checkAndPreventDefault(e)}}},{"./Interactable":4,"./Interaction":5,"./scope":34,"./utils/domUtils":39,"./utils/events":40,"./utils/is":46}],23:[function(e,t,n){"use strict";function r(e){var t=e.target,n=a.search(e,e.type,t);n&&n.prevTap&&e.clientX===n.prevTap.clientX&&e.clientY===n.prevTap.clientY&&t===n.prevTap.target&&(n.downTargets[0]=t,n.downTimes[0]=(new Date).getTime(),l.fire({interaction:n,event:e,eventTarget:t,pointer:e,type:"tap"}))}var i=e("./scope"),o=e("./utils/events"),s=e("./utils/browser"),a=e("./utils/interactionFinder"),l=e("./pointerEvents/base"),c=e("./utils/window"),p=c.window,u=Object.prototype.toString;if(p.Array.isArray||(p.Array.isArray=function(e){return"[object Array]"===u.call(e)}),String.prototype.trim||(String.prototype.trim=function(){return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")}),s.isIE8){var d=function(e){for(var t=i.interactions,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var o;if(n){if(r>=t.length)break;o=t[r++]}else{if(r=t.next(),r.done)break;o=r.value}var s=o;s.interacting()&&s.target.checkAndPreventDefault(e)}},f=function(e,t){var n=e.doc,i=(e.win,0===t.indexOf("listen")?o.add:o.remove);i(n,"selectstart",d),l&&i(n,"dblclick",r)};i.signals.on("add-document",f),i.signals.on("remove-document",f)}t.exports=null},{"./pointerEvents/base":31,"./scope":34,"./utils/browser":37,"./utils/events":40,"./utils/interactionFinder":45,"./utils/window":52}],24:[function(e,t,n){"use strict";function r(e,t,n){return e&&e.enabled&&(t||!e.endOnly)&&(!n||e.endOnly)}var i=e("../InteractEvent"),o=e("../Interaction"),s=e("../utils/extend"),a={names:[],setOffsets:function(e){var t=e.interaction,n=e.pageCoords,r=t.target,i=t.element,o=t.startOffset,s=r.getRect(i);s?(o.left=n.x-s.left,o.top=n.y-s.top,o.right=s.right-n.x,o.bottom=s.bottom-n.y,"width"in s||(s.width=s.right-s.left),"height"in s||(s.height=s.bottom-s.top)):o.left=o.top=o.right=o.bottom=0,e.rect=s,e.interactable=r,e.element=i;for(var l=0;l=p.length)break;f=p[d++]}else{if(d=p.next(),d.done)break;f=d.value}var v=f,g=a[v],h=t.target.options[t.prepared.name][v];r(h,i,o)&&(e.status=e.status=n[v],e.options=h,e.offset=e.interaction.modifierOffsets[v],g.set(e),e.status.locked&&(l.x+=e.status.dx,l.y+=e.status.dy,c.dx+=e.status.dx,c.dy+=e.status.dy,c.locked=!0))}return c.shouldMove=!e.status||!c.locked||e.status.changed,c},resetStatuses:function(e){for(var t=a.names,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var i;if(n){if(r>=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i,s=e[o]||{};s.dx=s.dy=0,s.modifiedX=s.modifiedY=NaN,s.locked=!1,s.changed=!0,e[o]=s}return e},start:function(e,t){var n=e.interaction,r={interaction:n,pageCoords:("action-resume"===t?n.curCoords:n.startCoords).page,startOffset:n.startOffset,statuses:n.modifierStatuses,preEnd:!1,requireEndOnly:!1};a.setOffsets(r),a.resetStatuses(r.statuses),r.pageCoords=s({},n.startCoords.page),n.modifierResult=a.setAll(r)}};o.signals.on("new",function(e){e.startOffset={left:0,right:0,top:0,bottom:0},e.modifierOffsets={},e.modifierStatuses=a.resetStatuses({}),e.modifierResult=null}),o.signals.on("action-start",a.start),o.signals.on("action-resume",a.start),o.signals.on("before-action-move",function(e){var t=e.interaction,n=e.preEnd,r=e.interactingBeforeMove,i=a.setAll({interaction:t,preEnd:n,pageCoords:t.curCoords.page,statuses:t.modifierStatuses,requireEndOnly:!1});!i.shouldMove&&r&&(t._dontFireMove=!0),t.modifierResult=i}),o.signals.on("action-end",function(e){for(var t=e.interaction,n=e.event,i=0;i=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}var m=h,y=m.x,x=m.y;l.push({x:s.left-i.width*y+u.x,y:s.top-i.height*x+u.y})}else l.push(u);return l},set:function(e){var t=e.interaction,n=e.pageCoords,r=e.status,i=e.options,s=e.offset,a=[],l=void 0,c=void 0,p=void 0;if(r.useStatusXY)c={x:r.x,y:r.y};else{var u=o.getOriginXY(t.target,t.element,t.prepared.name);c=o.extend({},n),c.x-=u.x,c.y-=u.y}r.realX=c.x,r.realY=c.y;for(var d=i.targets?i.targets.length:0,f=s,v=Array.isArray(f),g=0,f=v?f:f[Symbol.iterator]();;){var h;if(v){if(g>=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}for(var m=h,y=m.x,x=m.y,b=c.x-y,w=c.y-x,E=i.targets,S=Array.isArray(E),T=0,E=S?E:E[Symbol.iterator]();;){var C;if(S){if(T>=E.length)break;C=E[T++]}else{if(T=E.next(),T.done)break;C=T.value}var A=C;l=o.is.function(A)?A(b,w,t):A,l&&a.push({x:o.is.number(l.x)?l.x+y:b,y:o.is.number(l.y)?l.y+x:w,range:o.is.number(l.range)?l.range:i.range})}}var D={target:null,inRange:!1,distance:0,range:0,dx:0,dy:0};for(p=0,d=a.length;p=p.length)break;f=p[d++]}else{if(d=p.next(),d.done)break;f=d.value}var v=f,g=void 0;g=a.is.function(v)?v(l,c,t):v,g&&("width"in g&&"height"in g&&(g.x=g.width, +g.y=g.height),e.options.targets.push(g))}i.set(e)},modifyCoords:function(e){var t=e.options;e.options=a.extend({},t),e.options.enabled=t.enabled,e.options.relativePoints=[null],i.modifyCoords(e)}};r.snapSize=l,r.names.push("snapSize"),o.perAction.snapSize=l.defaults,s.defaults.snapSize=l.defaults,t.exports=l},{"../actions/resize":10,"../defaultOptions":18,"../utils/":44,"./index":24,"./snap":28}],30:[function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=e("../utils/pointerUtils");t.exports=function(){function e(t,n,o,s,a){if(r(this,e),i.pointerExtend(this,o),o!==n&&i.pointerExtend(this,n),this.interaction=a,this.timeStamp=(new Date).getTime(),this.originalEvent=o,this.type=t,this.pointerId=i.getPointerId(n),this.pointerType=i.getPointerType(n),this.target=s,this.currentTarget=null,"tap"===t){var l=a.getPointerIndex(n);this.dt=this.timeStamp-a.downTimes[l];var c=this.timeStamp-a.tapTime;this.double=!!(a.prevTap&&"doubletap"!==a.prevTap.type&&a.prevTap.target===this.target&&c<500)}else"doubletap"===t&&(this.dt=n.timeStamp-a.tapTime)}return e.prototype.subtractOrigin=function(e){var t=e.x,n=e.y;return this.pageX-=t,this.pageY-=n,this.clientX-=t,this.clientY-=n,this},e.prototype.addOrigin=function(e){var t=e.x,n=e.y;return this.pageX+=t,this.pageY+=n,this.clientX+=t,this.clientY+=n,this},e.prototype.preventDefault=function(){this.originalEvent.preventDefault()},e.prototype.stopPropagation=function(){this.propagationStopped=!0},e.prototype.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},e}()},{"../utils/pointerUtils":49}],31:[function(e,t,n){"use strict";function r(e){for(var t=e.interaction,n=e.pointer,s=e.event,l=e.eventTarget,c=e.type,u=void 0===c?e.pointerEvent.type:c,d=e.targets,f=void 0===d?i(e):d,v=e.pointerEvent,g=void 0===v?new o(u,n,s,l,t):v,h={interaction:t,pointer:n,event:s,eventTarget:l,targets:f,type:u,pointerEvent:g},m=0;m=u.length)break;g=u[v++]}else{if(v=u.next(),v.done)break;g=v.value}var h=g;c.element=h,p.fire("collect-targets",c)}return"hold"===o&&(c.targets=d(c.targets,function(e){return e.eventable.options.holdDuration===t.holdTimers[s].duration})),c.targets}var o=e("./PointerEvent"),s=e("../Interaction"),a=e("../utils"),l=e("../utils/browser"),c=e("../defaultOptions"),p=e("../utils/Signals").new(),u=e("../utils/arr"),d=u.filter,f=["down","up","cancel"],v=["down","up","cancel"],g={PointerEvent:o,fire:r,collectEventTargets:i,signals:p,defaults:{holdDuration:600,ignoreFrom:null,allowFrom:null,origin:{x:0,y:0}},types:["down","move","up","cancel","tap","doubletap","hold"]};s.signals.on("update-pointer-down",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers[n]={duration:1/0,timeout:null}}),s.signals.on("remove-pointer",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers.splice(n,1)}),s.signals.on("move",function(e){var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,s=e.duplicateMove,a=t.getPointerIndex(n);s||t.pointerIsDown&&!t.pointerWasMoved||(t.pointerIsDown&&clearTimeout(t.holdTimers[a].timeout),r({interaction:t,pointer:n,event:i,eventTarget:o,type:"move"}))}),s.signals.on("down",function(e){for(var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,s=e.pointerIndex,c=l.isIE8?a.extend({},i):i,u=t.holdTimers[s],d=a.getPath(o),f={interaction:t,pointer:n,event:i,eventTarget:o,type:"hold",targets:[],path:d,element:null},v=d,g=Array.isArray(v),h=0,v=g?v:v[Symbol.iterator]();;){var m;if(g){if(h>=v.length)break;m=v[h++]}else{if(h=v.next(),h.done)break;m=h.value}var y=m;f.element=y,p.fire("collect-targets",f)}if(f.targets.length){for(var x=1/0,b=0;b=0&&(p.selectors[u]!==e||p.contexts[u]!==t);u--);-1===u&&(u=p.selectors.length,p.selectors.push(e),p.contexts.push(t),p.listeners.push([])),p.listeners[u].push([i,!!s.capture,s.passive])}function s(e,t,n,r,o){var s=f(o),c=O[n],p=!1,u=void 0;if(c)for(u=c.selectors.length-1;u>=0;u--)if(c.selectors[u]===e&&c.contexts[u]===t){for(var d=c.listeners[u],v=d.length-1;v>=0;v--){var g=d[v],h=g[0],m=g[1],y=g[2];if(h===r&&m===!!s.capture&&y===s.passive){d.splice(v,1),d.length||(c.selectors.splice(u,1),c.contexts.splice(u,1),c.listeners.splice(u,1),i(t,n,a),i(t,n,l,!0),c.selectors.length||(O[n]=null)),p=!0;break}}if(p)break}}function a(e,t){var n=f(t),r={},i=O[e.type],o=g.getActualElement(e.path?e.path[0]:e.target),s=o;for(h(r,e),r.originalEvent=e,r.preventDefault=p;v.element(s);){for(var a=0;a=l.length)break;u=l[p++]}else{if(p=l.next(),p.done)break;u=p.value}var d=u,f=o[d](a);if(f)return f}},simulationResume:function(e){var t=e.pointerType,n=e.eventType,o=e.eventTarget;if(!/down|start/i.test(n))return null;for(var s=r.interactions,a=Array.isArray(s),l=0,s=a?s:s[Symbol.iterator]();;){var c;if(a){if(l>=s.length)break;c=s[l++]}else{if(l=s.next(),l.done)break;c=l.value}var p=c,u=o;if(p.simulation&&p.simulation.allowResume&&p.pointerType===t)for(;u;){if(u===p.element)return p;u=i.parentNode(u)}}return null},mouseOrPen:function(e){var t=e.pointerId,n=e.pointerType,o=e.eventType;if("mouse"!==n&&"pen"!==n)return null;for(var s=void 0,a=r.interactions,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var u=p;if(u.pointerType===n){if(u.simulation&&!i.contains(u.pointerIds,t))continue;if(u.interacting())return u;s||(s=u)}}if(s)return s;for(var d=r.interactions,f=Array.isArray(d),v=0,d=f?d:d[Symbol.iterator]();;){var g;if(f){if(v>=d.length)break;g=d[v++]}else{if(v=d.next(),v.done)break;g=v.value}var h=g;if(!(h.pointerType!==n||/down/i.test(o)&&h.simulation))return h}return null},hasPointer:function(e){for(var t=e.pointerId,n=r.interactions,o=Array.isArray(n),s=0,n=o?n:n[Symbol.iterator]();;){var a;if(o){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var l=a;if(i.contains(l.pointerIds,t))return l}},idle:function(e){for(var t=e.pointerType,n=r.interactions,i=Array.isArray(n),o=0,n=i?n:n[Symbol.iterator]();;){var s;if(i){if(o>=n.length)break;s=n[o++]}else{if(o=n.next(),o.done)break;s=o.value}var a=s;if(1===a.pointerIds.length){var l=a.target;if(l&&!l.options.gesture.enabled)continue}else if(a.pointerIds.length>=2)continue;if(!a.interacting()&&t===a.pointerType)return a}return null}};t.exports=o},{"../scope":34,"./index":44}],46:[function(e,t,n){"use strict";var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},i=e("./window"),o=e("./isWindow"),s={array:function(){},window:function(e){return e===i.window||o(e)},docFrag:function(e){return s.object(e)&&11===e.nodeType},object:function(e){return!!e&&"object"===(void 0===e?"undefined":r(e))},function:function(e){return"function"==typeof e},number:function(e){return"number"==typeof e},bool:function(e){return"boolean"==typeof e},string:function(e){return"string"==typeof e},element:function(e){if(!e||"object"!==(void 0===e?"undefined":r(e)))return!1;var t=i.getWindow(e)||i.window;return/object|function/.test(r(t.Element))?e instanceof t.Element:1===e.nodeType&&"string"==typeof e.nodeName}};s.array=function(e){return s.object(e)&&void 0!==e.length&&s.function(e.splice)},t.exports=s},{"./isWindow":47,"./window":52}],47:[function(e,t,n){"use strict";t.exports=function(e){return!(!e||!e.Window)&&e instanceof e.Window}},{}],48:[function(e,t,n){"use strict";function r(e,n){for(var r in n){var i=t.exports.prefixedPropREs,o=!1;for(var s in i)if(0===r.indexOf(s)&&i[s].test(r)){o=!0;break}o||"function"==typeof n[r]||(e[r]=n[r])}return e}r.prefixedPropREs={webkit:/(Movement[XY]|Radius[XY]|RotationAngle|Force)$/},t.exports=r},{}],49:[function(e,t,n){"use strict";var r=e("./hypot"),i=e("./browser"),o=e("./domObjects"),s=e("./domUtils"),a=e("./domObjects"),l=e("./is"),c=e("./pointerExtend"),p={copyCoords:function(e,t){e.page=e.page||{},e.page.x=t.page.x,e.page.y=t.page.y,e.client=e.client||{},e.client.x=t.client.x,e.client.y=t.client.y,e.timeStamp=t.timeStamp},setCoordDeltas:function(e,t,n){e.page.x=n.page.x-t.page.x,e.page.y=n.page.y-t.page.y,e.client.x=n.client.x-t.client.x,e.client.y=n.client.y-t.client.y,e.timeStamp=n.timeStamp-t.timeStamp;var i=Math.max(e.timeStamp/1e3,.001);e.page.speed=r(e.page.x,e.page.y)/i,e.page.vx=e.page.x/i,e.page.vy=e.page.y/i,e.client.speed=r(e.client.x,e.page.y)/i,e.client.vx=e.client.x/i,e.client.vy=e.client.y/i},isNativePointer:function(e){return e instanceof o.Event||e instanceof o.Touch},getXY:function(e,t,n){return n=n||{},e=e||"page",n.x=t[e+"X"],n.y=t[e+"Y"],n},getPageXY:function(e,t){return t=t||{},i.isOperaMobile&&p.isNativePointer(e)?(p.getXY("screen",e,t),t.x+=window.scrollX,t.y+=window.scrollY):p.getXY("page",e,t),t},getClientXY:function(e,t){return t=t||{},i.isOperaMobile&&p.isNativePointer(e)?p.getXY("screen",e,t):p.getXY("client",e,t),t},getPointerId:function(e){return l.number(e.pointerId)?e.pointerId:e.identifier},setCoords:function(e,t,n){var r=t.length>1?p.pointerAverage(t):t[0],i={};p.getPageXY(r,i),e.page.x=i.x,e.page.y=i.y,p.getClientXY(r,i),e.client.x=i.x,e.client.y=i.y,e.timeStamp=l.number(n)?n:(new Date).getTime()},pointerExtend:c,getTouchPair:function(e){var t=[];return l.array(e)?(t[0]=e[0],t[1]=e[1]):"touchend"===e.type?1===e.touches.length?(t[0]=e.touches[0],t[1]=e.changedTouches[0]):0===e.touches.length&&(t[0]=e.changedTouches[0],t[1]=e.changedTouches[1]):(t[0]=e.touches[0],t[1]=e.touches[1]),t},pointerAverage:function(e){for(var t={pageX:0,pageY:0,clientX:0,clientY:0,screenX:0,screenY:0},n=e,r=Array.isArray(n),i=0,n=r?n:n[Symbol.iterator]();;){var o;if(r){if(i>=n.length)break;o=n[i++]}else{if(i=n.next(),i.done)break;o=i.value}var s=o;for(var a in t)t[a]+=s[a]}for(var l in t)t[l]/=e.length;return t},touchBBox:function(e){if(e.length||e.touches&&e.touches.length>1){var t=p.getTouchPair(e),n=Math.min(t[0].pageX,t[1].pageX),r=Math.min(t[0].pageY,t[1].pageY);return{x:n,y:r,left:n,top:r,width:Math.max(t[0].pageX,t[1].pageX)-n,height:Math.max(t[0].pageY,t[1].pageY)-r}}},touchDistance:function(e,t){var n=t+"X",i=t+"Y",o=p.getTouchPair(e),s=o[0][n]-o[1][n],a=o[0][i]-o[1][i];return r(s,a)},touchAngle:function(e,t,n){var r=n+"X",i=n+"Y",o=p.getTouchPair(e),s=o[1][r]-o[0][r],a=o[1][i]-o[0][i];return 180*Math.atan2(a,s)/Math.PI},getPointerType:function(e){return l.string(e.pointerType)?e.pointerType:l.number(e.pointerType)?[void 0,void 0,"touch","pen","mouse"][e.pointerType]:/touch/.test(e.type)||e instanceof a.Touch?"touch":"mouse"},getEventTargets:function(e){return[s.getActualElement(e.path?e.path[0]:e.target),s.getActualElement(e.currentTarget)]}};t.exports=p},{"./browser":37,"./domObjects":38,"./domUtils":39,"./hypot":43,"./is":46,"./pointerExtend":48}],50:[function(e,t,n){"use strict";for(var r=e("./window"),i=r.window,o=["ms","moz","webkit","o"],s=0,a=void 0,l=void 0,c=0;c\n * Open source under the MIT License.\n * https://raw.github.com/taye/interact.js/master/LICENSE\n */\n","/*\n * In a (windowless) server environment this file exports a factory function\n * that takes the window to use.\n *\n * var interact = require('interact.js')(windowObject);\n *\n * See https://github.com/taye/interact.js/issues/187\n */\nif (typeof window === 'undefined') {\n module.exports = function (window) {\n require('./src/utils/window').init(window);\n\n return require('./src/index');\n };\n}\nelse {\n module.exports = require('./src/index');\n}\n","const { indexOf } = require('./utils/arr');\nconst extend = require('./utils/extend.js');\n\nfunction fireUntilImmediateStopped (event, listeners) {\n for (let i = 0, len = listeners.length; i < len && !event.immediatePropagationStopped; i++) {\n listeners[i](event);\n }\n}\n\nclass Eventable {\n\n constructor (options) {\n this.options = extend({}, options || {});\n }\n\n fire (event) {\n let listeners;\n const onEvent = 'on' + event.type;\n const global = this.global;\n\n // Interactable#on() listeners\n if ((listeners = this[event.type])) {\n fireUntilImmediateStopped(event, listeners);\n }\n\n // interactable.onevent listener\n if (this[onEvent]) {\n this[onEvent](event);\n }\n\n // interact.on() listeners\n if (!event.propagationStopped && global && (listeners = global[event.type])) {\n fireUntilImmediateStopped(event, listeners);\n }\n }\n\n on (eventType, listener) {\n // if this type of event was never bound\n if (this[eventType]) {\n this[eventType].push(listener);\n }\n else {\n this[eventType] = [listener];\n }\n }\n\n off (eventType, listener) {\n // if it is an action event type\n const eventList = this[eventType];\n const index = eventList? indexOf(eventList, listener) : -1;\n\n if (index !== -1) {\n eventList.splice(index, 1);\n }\n\n if (eventList && eventList.length === 0 || !listener) {\n this[eventType] = listener;\n }\n }\n}\n\nmodule.exports = Eventable;\n","const extend = require('./utils/extend');\nconst getOriginXY = require('./utils/getOriginXY');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nclass InteractEvent {\n constructor (interaction, event, action, phase, element, related, preEnd = false) {\n const target = interaction.target;\n const deltaSource = (target && target.options || defaults).deltaSource;\n const origin = getOriginXY(target, element, action);\n const starting = phase === 'start';\n const ending = phase === 'end';\n const coords = starting? interaction.startCoords : interaction.curCoords;\n const prevEvent = interaction.prevEvent;\n\n element = element || interaction.element;\n\n const page = extend({}, coords.page);\n const client = extend({}, coords.client);\n\n page.x -= origin.x;\n page.y -= origin.y;\n\n client.x -= origin.x;\n client.y -= origin.y;\n\n this.ctrlKey = event.ctrlKey;\n this.altKey = event.altKey;\n this.shiftKey = event.shiftKey;\n this.metaKey = event.metaKey;\n this.button = event.button;\n this.buttons = event.buttons;\n this.target = element;\n this.currentTarget = element;\n this.relatedTarget = related || null;\n this.preEnd = preEnd;\n this.type = action + (phase || '');\n this.interaction = interaction;\n this.interactable = target;\n\n this.t0 = starting ? interaction.downTimes[interaction.downTimes.length - 1]\n : prevEvent.t0;\n\n const signalArg = {\n interaction,\n event,\n action,\n phase,\n element,\n related,\n page,\n client,\n coords,\n starting,\n ending,\n deltaSource,\n iEvent: this,\n };\n\n signals.fire('set-xy', signalArg);\n\n if (ending) {\n // use previous coords when ending\n this.pageX = prevEvent.pageX;\n this.pageY = prevEvent.pageY;\n this.clientX = prevEvent.clientX;\n this.clientY = prevEvent.clientY;\n }\n else {\n this.pageX = page.x;\n this.pageY = page.y;\n this.clientX = client.x;\n this.clientY = client.y;\n }\n\n this.x0 = interaction.startCoords.page.x - origin.x;\n this.y0 = interaction.startCoords.page.y - origin.y;\n this.clientX0 = interaction.startCoords.client.x - origin.x;\n this.clientY0 = interaction.startCoords.client.y - origin.y;\n\n signals.fire('set-delta', signalArg);\n\n this.timeStamp = coords.timeStamp;\n this.dt = interaction.pointerDelta.timeStamp;\n this.duration = this.timeStamp - this.t0;\n\n // speed and velocity in pixels per second\n this.speed = interaction.pointerDelta[deltaSource].speed;\n this.velocityX = interaction.pointerDelta[deltaSource].vx;\n this.velocityY = interaction.pointerDelta[deltaSource].vy;\n\n this.swipe = (ending || phase === 'inertiastart')? this.getSwipe() : null;\n\n signals.fire('new', signalArg);\n }\n\n getSwipe () {\n const interaction = this.interaction;\n\n if (interaction.prevEvent.speed < 600\n || this.timeStamp - interaction.prevEvent.timeStamp > 150) {\n return null;\n }\n\n let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI;\n const overlap = 22.5;\n\n if (angle < 0) {\n angle += 360;\n }\n\n const left = 135 - overlap <= angle && angle < 225 + overlap;\n const up = 225 - overlap <= angle && angle < 315 + overlap;\n\n const right = !left && (315 - overlap <= angle || angle < 45 + overlap);\n const down = !up && 45 - overlap <= angle && angle < 135 + overlap;\n\n return {\n up,\n down,\n left,\n right,\n angle,\n speed: interaction.prevEvent.speed,\n velocity: {\n x: interaction.prevEvent.velocityX,\n y: interaction.prevEvent.velocityY,\n },\n };\n }\n\n preventDefault () {}\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n}\n\nsignals.on('set-delta', function ({ iEvent, interaction, starting, deltaSource }) {\n const prevEvent = starting? iEvent : interaction.prevEvent;\n\n if (deltaSource === 'client') {\n iEvent.dx = iEvent.clientX - prevEvent.clientX;\n iEvent.dy = iEvent.clientY - prevEvent.clientY;\n }\n else {\n iEvent.dx = iEvent.pageX - prevEvent.pageX;\n iEvent.dy = iEvent.pageY - prevEvent.pageY;\n }\n});\n\nInteractEvent.signals = signals;\n\nmodule.exports = InteractEvent;\n","const is = require('./utils/is');\nconst events = require('./utils/events');\nconst extend = require('./utils/extend');\nconst actions = require('./actions/base');\nconst scope = require('./scope');\nconst Eventable = require('./Eventable');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nconst {\n getElementRect,\n nodeContains,\n trySelector,\n} = require('./utils/domUtils');\nconst { getWindow } = require('./utils/window');\nconst { indexOf, contains } = require('./utils/arr');\nconst { wheelEvent } = require('./utils/browser');\n\n// all set interactables\nscope.interactables = [];\n\n/*\\\n * Interactable\n [ property ]\n **\n * Object type returned by @interact\n\\*/\nclass Interactable {\n constructor (target, options) {\n options = options || {};\n\n this.target = target;\n this.events = new Eventable();\n this._context = options.context || scope.document;\n this._win = getWindow(trySelector(target)? this._context : target);\n this._doc = this._win.document;\n\n signals.fire('new', {\n target,\n options,\n interactable: this,\n win: this._win,\n });\n\n scope.addDocument( this._doc, this._win );\n\n scope.interactables.push(this);\n\n this.set(options);\n }\n\n setOnEvents (action, phases) {\n const onAction = 'on' + action;\n\n if (is.function(phases.onstart) ) { this.events[onAction + 'start' ] = phases.onstart ; }\n if (is.function(phases.onmove) ) { this.events[onAction + 'move' ] = phases.onmove ; }\n if (is.function(phases.onend) ) { this.events[onAction + 'end' ] = phases.onend ; }\n if (is.function(phases.oninertiastart)) { this.events[onAction + 'inertiastart' ] = phases.oninertiastart ; }\n\n return this;\n }\n\n setPerAction (action, options) {\n // for all the default per-action options\n for (const option in options) {\n // if this option exists for this action\n if (option in defaults[action]) {\n // if the option in the options arg is an object value\n if (is.object(options[option])) {\n // duplicate the object\n this.options[action][option] = extend(this.options[action][option] || {}, options[option]);\n\n if (is.object(defaults.perAction[option]) && 'enabled' in defaults.perAction[option]) {\n this.options[action][option].enabled = options[option].enabled === false? false : true;\n }\n }\n else if (is.bool(options[option]) && is.object(defaults.perAction[option])) {\n this.options[action][option].enabled = options[option];\n }\n else if (options[option] !== undefined) {\n // or if it's not undefined, do a plain assignment\n this.options[action][option] = options[option];\n }\n }\n }\n }\n\n /*\\\n * Interactable.getRect\n [ method ]\n *\n * The default function to get an Interactables bounding rect. Can be\n * overridden using @Interactable.rectChecker.\n *\n - element (Element) #optional The element to measure.\n = (object) The object's bounding rectangle.\n o {\n o top : 0,\n o left : 0,\n o bottom: 0,\n o right : 0,\n o width : 0,\n o height: 0\n o }\n \\*/\n getRect (element) {\n element = element || this.target;\n\n if (is.string(this.target) && !(is.element(element))) {\n element = this._context.querySelector(this.target);\n }\n\n return getElementRect(element);\n }\n\n /*\\\n * Interactable.rectChecker\n [ method ]\n *\n * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n - checker (function) #optional A function which returns this Interactable's bounding rectangle. See @Interactable.getRect\n = (function | object) The checker function or this Interactable\n \\*/\n rectChecker (checker) {\n if (is.function(checker)) {\n this.getRect = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.getRect;\n\n return this;\n }\n\n return this.getRect;\n }\n\n _backCompatOption (optionName, newValue) {\n if (trySelector(newValue) || is.object(newValue)) {\n this.options[optionName] = newValue;\n\n for (const action of actions.names) {\n this.options[action][optionName] = newValue;\n }\n\n return this;\n }\n\n return this.options[optionName];\n }\n\n /*\\\n * Interactable.origin\n [ method ]\n *\n * Gets or sets the origin of the Interactable's element. The x and y\n * of the origin will be subtracted from action event coordinates.\n *\n - origin (object | string) #optional An object eg. { x: 0, y: 0 } or string 'parent', 'self' or any CSS selector\n * OR\n - origin (Element) #optional An HTML or SVG Element whose rect will be used\n **\n = (object) The current origin or this Interactable\n \\*/\n origin (newValue) {\n return this._backCompatOption('origin', newValue);\n }\n\n /*\\\n * Interactable.deltaSource\n [ method ]\n *\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n - newValue (string) #optional Use 'client' if you will be scrolling while interacting; Use 'page' if you want autoScroll to work\n = (string | object) The current deltaSource or this Interactable\n \\*/\n deltaSource (newValue) {\n if (newValue === 'page' || newValue === 'client') {\n this.options.deltaSource = newValue;\n\n return this;\n }\n\n return this.options.deltaSource;\n }\n\n /*\\\n * Interactable.context\n [ method ]\n *\n * Gets the selector context Node of the Interactable. The default is `window.document`.\n *\n = (Node) The context Node of this Interactable\n **\n \\*/\n context () {\n return this._context;\n }\n\n inContext (element) {\n return (this._context === element.ownerDocument\n || nodeContains(this._context, element));\n }\n\n /*\\\n * Interactable.fire\n [ method ]\n *\n * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n - iEvent (InteractEvent) The InteractEvent object to be fired on this Interactable\n = (Interactable) this Interactable\n \\*/\n fire (iEvent) {\n this.events.fire(iEvent);\n\n return this;\n }\n\n _onOffMultiple (method, eventType, listener, options) {\n if (is.string(eventType) && eventType.search(' ') !== -1) {\n eventType = eventType.trim().split(/ +/);\n }\n\n if (is.array(eventType)) {\n for (let i = 0; i < eventType.length; i++) {\n this[method](eventType[i], listener, options);\n }\n\n return true;\n }\n\n if (is.object(eventType)) {\n for (const prop in eventType) {\n this[method](prop, eventType[prop], listener);\n }\n\n return true;\n }\n }\n\n /*\\\n * Interactable.on\n [ method ]\n *\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n - eventType (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) This Interactable\n \\*/\n on (eventType, listener, options) {\n if (this._onOffMultiple('on', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.on(eventType, listener);\n }\n // delegated event for selector\n else if (is.string(this.target)) {\n events.addDelegate(this.target, this._context, eventType, listener, options);\n }\n else {\n events.add(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.off\n [ method ]\n *\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n - eventType (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) This Interactable\n \\*/\n off (eventType, listener, options) {\n if (this._onOffMultiple('off', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n // if it is an action event type\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.off(eventType, listener);\n }\n // delegated event\n else if (is.string(this.target)) {\n events.removeDelegate(this.target, this._context, eventType, listener, options);\n }\n // remove listener from this Interatable's element\n else {\n events.remove(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.set\n [ method ]\n *\n * Reset the options of this Interactable\n - options (object) The new settings to apply\n = (object) This Interactable\n \\*/\n set (options) {\n if (!is.object(options)) {\n options = {};\n }\n\n this.options = extend({}, defaults.base);\n\n const perActions = extend({}, defaults.perAction);\n\n for (const actionName in actions.methodDict) {\n const methodName = actions.methodDict[actionName];\n\n this.options[actionName] = extend({}, defaults[actionName]);\n\n this.setPerAction(actionName, perActions);\n\n this[methodName](options[actionName]);\n }\n\n for (const setting of Interactable.settingsMethods) {\n this.options[setting] = defaults.base[setting];\n\n if (setting in options) {\n this[setting](options[setting]);\n }\n }\n\n signals.fire('set', {\n options,\n interactable: this,\n });\n\n return this;\n }\n\n /*\\\n * Interactable.unset\n [ method ]\n *\n * Remove this interactable from the list of interactables and remove\n * it's action capabilities and event listeners\n *\n = (object) @interact\n \\*/\n unset () {\n events.remove(this.target, 'all');\n\n if (is.string(this.target)) {\n // remove delegated events\n for (const type in events.delegatedEvents) {\n const delegated = events.delegatedEvents[type];\n\n if (delegated.selectors[0] === this.target\n && delegated.contexts[0] === this._context) {\n\n delegated.selectors.splice(0, 1);\n delegated.contexts .splice(0, 1);\n delegated.listeners.splice(0, 1);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegated[type] = null;\n }\n }\n\n events.remove(this._context, type, events.delegateListener);\n events.remove(this._context, type, events.delegateUseCapture, true);\n }\n }\n else {\n events.remove(this, 'all');\n }\n\n signals.fire('unset', { interactable: this });\n\n scope.interactables.splice(indexOf(scope.interactables, this), 1);\n\n // Stop related interactions when an Interactable is unset\n for (const interaction of scope.interactions || []) {\n if (interaction.target === this && interaction.interacting()) {\n interaction.stop();\n }\n }\n\n return scope.interact;\n }\n}\n\nscope.interactables.indexOfElement = function indexOfElement (target, context) {\n context = context || scope.document;\n\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n if (interactable.target === target && interactable._context === context) {\n return i;\n }\n }\n return -1;\n};\n\nscope.interactables.get = function interactableGet (element, options, dontCheckInContext) {\n const ret = this[this.indexOfElement(element, options && options.context)];\n\n return ret && (is.string(element) || dontCheckInContext || ret.inContext(element))? ret : null;\n};\n\nscope.interactables.forEachSelector = function (callback, element) {\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n // skip non CSS selector targets and out of context elements\n if (!is.string(interactable.target)\n || (element && !interactable.inContext(element))) {\n continue;\n }\n\n const ret = callback(interactable, interactable.target, interactable._context, i, this);\n\n if (ret !== undefined) {\n return ret;\n }\n }\n};\n\n// all interact.js eventTypes\nInteractable.eventTypes = scope.eventTypes = [];\n\nInteractable.signals = signals;\n\nInteractable.settingsMethods = [ 'deltaSource', 'origin', 'preventDefault', 'rectChecker' ];\n\nmodule.exports = Interactable;\n","const scope = require('./scope');\nconst utils = require('./utils');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst finder = require('./utils/interactionFinder');\nconst signals = require('./utils/Signals').new();\n\nconst listeners = {};\nconst methodNames = [\n 'pointerDown', 'pointerMove', 'pointerUp',\n 'updatePointer', 'removePointer',\n];\n\n// for ignoring browser's simulated mouse events\nlet prevTouchTime = 0;\n\n// all active and idle interactions\nscope.interactions = [];\n\nclass Interaction {\n constructor () {\n this.target = null; // current interactable being interacted with\n this.element = null; // the target element of the interactable\n\n this.prepared = { // action that's ready to be fired on next move event\n name : null,\n axis : null,\n edges: null,\n };\n\n // keep track of added pointers\n this.pointers = [];\n this.pointerIds = [];\n this.downTargets = [];\n this.downTimes = [];\n\n // Previous native pointer move event coordinates\n this.prevCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n // current native pointer move event coordinates\n this.curCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Starting InteractEvent pointer coordinates\n this.startCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Change in coordinates and time of the pointer\n this.pointerDelta = {\n page : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n client : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n timeStamp: 0,\n };\n\n this.downEvent = null; // pointerdown/mousedown/touchstart event\n this.downPointer = {};\n\n this._eventTarget = null;\n this._curEventTarget = null;\n\n this.prevEvent = null; // previous action event\n\n this.pointerIsDown = false;\n this.pointerWasMoved = false;\n this._interacting = false;\n\n this.mouse = false;\n\n signals.fire('new', this);\n\n scope.interactions.push(this);\n }\n\n pointerDown (pointer, event, eventTarget) {\n const pointerIndex = this.updatePointer(pointer, event, true);\n\n signals.fire('down', {\n pointer,\n event,\n eventTarget,\n pointerIndex,\n interaction: this,\n });\n }\n\n /*\\\n * Interaction.start\n [ method ]\n *\n * Start an action with the given Interactable and Element as tartgets. The\n * action must be enabled for the target Interactable and an appropriate number\n * of pointers must be held down - 1 for drag/resize, 2 for gesture.\n *\n * Use it with `interactable.able({ manualStart: false })` to always\n * [start actions manually](https://github.com/taye/interact.js/issues/114)\n *\n - action (object) The action to be performed - drag, resize, etc.\n - target (Interactable) The Interactable to target\n - element (Element) The DOM Element to target\n = (object) interact\n **\n | interact(target)\n | .draggable({\n | // disable the default drag start by down->move\n | manualStart: true\n | })\n | // start dragging after the user holds the pointer down\n | .on('hold', function (event) {\n | var interaction = event.interaction;\n |\n | if (!interaction.interacting()) {\n | interaction.start({ name: 'drag' },\n | event.interactable,\n | event.currentTarget);\n | }\n | });\n \\*/\n start (action, target, element) {\n if (this.interacting()\n || !this.pointerIsDown\n || this.pointerIds.length < (action.name === 'gesture'? 2 : 1)) {\n return;\n }\n\n // if this interaction had been removed after stopping\n // add it back\n if (utils.indexOf(scope.interactions, this) === -1) {\n scope.interactions.push(this);\n }\n\n utils.copyAction(this.prepared, action);\n this.target = target;\n this.element = element;\n\n signals.fire('action-start', {\n interaction: this,\n event: this.downEvent,\n });\n }\n\n pointerMove (pointer, event, eventTarget) {\n if (!this.simulation) {\n this.updatePointer(pointer);\n utils.setCoords(this.curCoords, this.pointers);\n }\n\n const duplicateMove = (this.curCoords.page.x === this.prevCoords.page.x\n && this.curCoords.page.y === this.prevCoords.page.y\n && this.curCoords.client.x === this.prevCoords.client.x\n && this.curCoords.client.y === this.prevCoords.client.y);\n\n let dx;\n let dy;\n\n // register movement greater than pointerMoveTolerance\n if (this.pointerIsDown && !this.pointerWasMoved) {\n dx = this.curCoords.client.x - this.startCoords.client.x;\n dy = this.curCoords.client.y - this.startCoords.client.y;\n\n this.pointerWasMoved = utils.hypot(dx, dy) > Interaction.pointerMoveTolerance;\n }\n\n const signalArg = {\n pointer,\n pointerIndex: this.getPointerIndex(pointer),\n event,\n eventTarget,\n dx,\n dy,\n duplicate: duplicateMove,\n interaction: this,\n interactingBeforeMove: this.interacting(),\n };\n\n if (!duplicateMove) {\n // set pointer coordinate, time changes and speeds\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n }\n\n signals.fire('move', signalArg);\n\n if (!duplicateMove) {\n // if interacting, fire an 'action-move' signal etc\n if (this.interacting()) {\n this.doMove(signalArg);\n }\n\n if (this.pointerWasMoved) {\n utils.copyCoords(this.prevCoords, this.curCoords);\n }\n }\n }\n\n /*\\\n * Interaction.doMove\n [ method ]\n *\n * Force a move of the current action at the same coordinates. Useful if\n * snap/restrict has been changed and you want a movement with the new\n * settings.\n *\n **\n | interact(target)\n | .draggable(true)\n | .on('dragmove', function (event) {\n | if (someCondition) {\n | // change the snap settings\n | event.interactable.draggable({ snap: { targets: [] }});\n | // fire another move event with re-calculated snap\n | event.interaction.doMove();\n | }\n | });\n \\*/\n doMove (signalArg) {\n signalArg = utils.extend({\n pointer: this.pointers[0],\n event: this.prevEvent,\n eventTarget: this._eventTarget,\n interaction: this,\n }, signalArg || {});\n\n signals.fire('before-action-move', signalArg);\n\n if (!this._dontFireMove) {\n signals.fire('action-move', signalArg);\n }\n\n this._dontFireMove = false;\n }\n\n // End interact move events and stop auto-scroll unless simulation is running\n pointerUp (pointer, event, eventTarget, curEventTarget) {\n const pointerIndex = this.getPointerIndex(pointer);\n\n signals.fire(/cancel$/i.test(event.type)? 'cancel' : 'up', {\n pointer,\n pointerIndex,\n event,\n eventTarget,\n curEventTarget,\n interaction: this,\n });\n\n if (!this.simulation) {\n this.end(event);\n }\n\n this.pointerIsDown = false;\n this.removePointer(pointer, event);\n }\n\n /*\\\n * Interaction.end\n [ method ]\n *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n - event (PointerEvent) #optional\n **\n | interact(target)\n | .draggable(true)\n | .on('move', function (event) {\n | if (event.pageX > 1000) {\n | // end the current action\n | event.interaction.end();\n | // stop all further listeners from being called\n | event.stopImmediatePropagation();\n | }\n | });\n \\*/\n end (event) {\n event = event || this.prevEvent;\n\n if (this.interacting()) {\n signals.fire('action-end', {\n event,\n interaction: this,\n });\n }\n\n this.stop();\n }\n\n currentAction () {\n return this._interacting? this.prepared.name: null;\n }\n\n interacting () {\n return this._interacting;\n }\n\n stop () {\n signals.fire('stop', { interaction: this });\n\n if (this._interacting) {\n signals.fire('stop-active', { interaction: this });\n signals.fire('stop-' + this.prepared.name, { interaction: this });\n }\n\n this.target = this.element = null;\n\n this._interacting = false;\n this.prepared.name = this.prevEvent = null;\n }\n\n getPointerIndex (pointer) {\n return utils.indexOf(this.pointerIds, utils.getPointerId(pointer));\n }\n\n updatePointer (pointer, event, down = event && /(down|start)$/i.test(event.type)) {\n const id = utils.getPointerId(pointer);\n let index = this.getPointerIndex(pointer);\n\n if (index === -1) {\n index = this.pointerIds.length;\n this.pointerIds[index] = id;\n }\n\n if (down) {\n signals.fire('update-pointer-down', {\n pointer,\n event,\n down,\n pointerId: id,\n pointerIndex: index,\n interaction: this,\n });\n }\n\n this.pointers[index] = pointer;\n\n return index;\n }\n\n removePointer (pointer, event) {\n const id = utils.getPointerId(pointer);\n const index = this.mouse? 0 : utils.indexOf(this.pointerIds, id);\n\n if (index === -1) { return; }\n\n signals.fire('remove-pointer', {\n pointer,\n event,\n pointerIndex: index,\n interaction: this,\n });\n\n this.pointers .splice(index, 1);\n this.pointerIds .splice(index, 1);\n this.downTargets.splice(index, 1);\n this.downTimes .splice(index, 1);\n }\n\n _updateEventTargets (target, currentTarget) {\n this._eventTarget = target;\n this._curEventTarget = currentTarget;\n }\n}\n\nfor (let i = 0, len = methodNames.length; i < len; i++) {\n const method = methodNames[i];\n\n listeners[method] = doOnInteractions(method);\n}\n\nfunction doOnInteractions (method) {\n return (function (event) {\n const [eventTarget, curEventTarget] = utils.getEventTargets(event);\n const matches = []; // [ [pointer, interaction], ...]\n\n if (browser.supportsTouch && /touch/.test(event.type)) {\n prevTouchTime = new Date().getTime();\n\n for (let i = 0; i < event.changedTouches.length; i++) {\n const pointer = event.changedTouches[i];\n const interaction = finder.search(pointer, event.type, eventTarget);\n\n matches.push([pointer, interaction || new Interaction()]);\n }\n }\n else {\n let invalidPointer = false;\n\n if (!browser.supportsPointerEvent && /mouse/.test(event.type)) {\n // ignore mouse events while touch interactions are active\n for (let i = 0; i < scope.interactions.length && !invalidPointer; i++) {\n invalidPointer = !scope.interactions[i].mouse && scope.interactions[i].pointerIsDown;\n }\n\n // try to ignore mouse events that are simulated by the browser\n // after a touch event\n invalidPointer = invalidPointer\n || (new Date().getTime() - prevTouchTime < 500)\n // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated\n || event.timeStamp === 0;\n }\n\n if (!invalidPointer) {\n let interaction = finder.search(event, event.type, eventTarget);\n\n if (!interaction) {\n\n interaction = new Interaction();\n interaction.mouse = (/mouse/i.test(event.pointerType || event.type)\n // MSPointerEvent.MSPOINTER_TYPE_MOUSE\n || event.pointerType === 4\n || !event.pointerType);\n }\n\n matches.push([event, interaction]);\n }\n }\n\n for (const [pointer, interaction] of matches) {\n interaction._updateEventTargets(eventTarget, curEventTarget);\n interaction[method](pointer, event, eventTarget, curEventTarget);\n }\n });\n}\n\nfunction endAll (event) {\n for (let i = 0; i < scope.interactions.length; i++) {\n const interaction = scope.interactions[i];\n\n interaction.end(event);\n signals.fire('endall', { event, interaction });\n }\n}\n\nconst docEvents = { /* 'eventType': listenerFunc */ };\nconst pEventTypes = browser.pEventTypes;\n\nif (scope.PointerEvent) {\n docEvents[pEventTypes.down ] = listeners.pointerDown;\n docEvents[pEventTypes.move ] = listeners.pointerMove;\n docEvents[pEventTypes.up ] = listeners.pointerUp;\n docEvents[pEventTypes.cancel] = listeners.pointerUp;\n}\nelse {\n docEvents.mousedown = listeners.pointerDown;\n docEvents.mousemove = listeners.pointerMove;\n docEvents.mouseup = listeners.pointerUp;\n\n docEvents.touchstart = listeners.pointerDown;\n docEvents.touchmove = listeners.pointerMove;\n docEvents.touchend = listeners.pointerUp;\n docEvents.touchcancel = listeners.pointerUp;\n}\n\ndocEvents.blur = endAll;\n\nfunction onDocSignal ({ doc }, signalName) {\n const eventMethod = signalName.indexOf('add') === 0\n ? events.add : events.remove;\n\n // delegate event listener\n for (const eventType in scope.delegatedEvents) {\n eventMethod(doc, eventType, events.delegateListener);\n eventMethod(doc, eventType, events.delegateUseCapture, true);\n }\n\n for (const eventType in docEvents) {\n eventMethod(doc, eventType, docEvents[eventType]);\n }\n}\n\nsignals.on('update-pointer-down', ({ interaction, pointer, pointerId, pointerIndex, event, eventTarget, down }) => {\n interaction.pointerIds[pointerIndex] = pointerId;\n interaction.pointers[pointerIndex] = pointer;\n\n if (down) {\n interaction.pointerIsDown = true;\n }\n\n if (!interaction.interacting()) {\n utils.setCoords(interaction.startCoords, interaction.pointers);\n\n utils.copyCoords(interaction.curCoords , interaction.startCoords);\n utils.copyCoords(interaction.prevCoords, interaction.startCoords);\n\n interaction.downEvent = event;\n interaction.downTimes[pointerIndex] = interaction.curCoords.timeStamp;\n interaction.downTargets[pointerIndex] = eventTarget || event && utils.getEventTargets(event)[0];\n interaction.pointerWasMoved = false;\n\n utils.pointerExtend(interaction.downPointer, pointer);\n }\n});\n\nscope.signals.on('add-document' , onDocSignal);\nscope.signals.on('remove-document', onDocSignal);\n\nInteraction.pointerMoveTolerance = 1;\nInteraction.doOnInteractions = doOnInteractions;\nInteraction.endAll = endAll;\nInteraction.signals = signals;\nInteraction.docEvents = docEvents;\n\nscope.endAllInteractions = endAll;\n\nmodule.exports = Interaction;\n","const Interaction = require('../Interaction');\nconst InteractEvent = require('../InteractEvent');\n\nconst actions = {\n firePrepared,\n names: [],\n methodDict: {},\n};\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n interaction._interacting = true;\n firePrepared(interaction, event, 'start');\n});\n\nInteraction.signals.on('action-move', function ({ interaction, event, preEnd }) {\n firePrepared(interaction, event, 'move', preEnd);\n\n // if the action was ended in a listener\n if (!interaction.interacting()) { return false; }\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n firePrepared(interaction, event, 'end');\n});\n\nfunction firePrepared (interaction, event, phase, preEnd) {\n const actionName = interaction.prepared.name;\n\n const newEvent = new InteractEvent(interaction, event, actionName, phase, interaction.element, null, preEnd);\n\n interaction.target.fire(newEvent);\n interaction.prevEvent = newEvent;\n}\n\nmodule.exports = actions;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drag = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n startAxis : 'xy',\n lockAxis : 'xy',\n },\n\n checker: function (pointer, event, interactable) {\n const dragOptions = interactable.options.drag;\n\n return dragOptions.enabled\n ? { name: 'drag', axis: (dragOptions.lockAxis === 'start'\n ? dragOptions.startAxis\n : dragOptions.lockAxis)}\n : null;\n },\n\n getCursor: function () {\n return 'move';\n },\n};\n\nInteraction.signals.on('before-action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n interaction.curCoords.page.y = interaction.startCoords.page.y;\n interaction.curCoords.client.y = interaction.startCoords.client.y;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vx);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vx);\n interaction.pointerDelta.client.vy = 0;\n interaction.pointerDelta.page.vy = 0;\n }\n else if (axis === 'y') {\n interaction.curCoords.page.x = interaction.startCoords.page.x;\n interaction.curCoords.client.x = interaction.startCoords.client.x;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vy);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vy);\n interaction.pointerDelta.client.vx = 0;\n interaction.pointerDelta.page.vx = 0;\n }\n});\n\n// dragmove\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'dragmove') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n iEvent.pageY = interaction.startCoords.page.y;\n iEvent.clientY = interaction.startCoords.client.y;\n iEvent.dy = 0;\n }\n else if (axis === 'y') {\n iEvent.pageX = interaction.startCoords.page.x;\n iEvent.clientX = interaction.startCoords.client.x;\n iEvent.dx = 0;\n }\n});\n\n/*\\\n * Interactable.draggable\n [ method ]\n *\n * Gets or sets whether drag actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of drag events\n | var isDraggable = interact('ul li').draggable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on drag events (object makes the Interactable draggable)\n = (object) This Interactable\n | interact(element).draggable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // the axis in which the first movement must be\n | // for the drag sequence to start\n | // 'xy' by default - any direction\n | startAxis: 'x' || 'y' || 'xy',\n |\n | // 'xy' by default - don't restrict to one axis (move in any direction)\n | // 'x' or 'y' to restrict movement to either axis\n | // 'start' to restrict movement to the axis the drag started in\n | lockAxis: 'x' || 'y' || 'xy' || 'start',\n |\n | // max number of drags that can happen concurrently\n | // with elements of this Interactable. Infinity by default\n | max: Infinity,\n |\n | // max number of drags that can target the same element+Interactable\n | // 1 by default\n | maxPerElement: 2\n | });\n\\*/\nInteractable.prototype.draggable = function (options) {\n if (utils.is.object(options)) {\n this.options.drag.enabled = options.enabled === false? false: true;\n this.setPerAction('drag', options);\n this.setOnEvents('drag', options);\n\n if (/^(xy|x|y|start)$/.test(options.lockAxis)) {\n this.options.drag.lockAxis = options.lockAxis;\n }\n if (/^(xy|x|y)$/.test(options.startAxis)) {\n this.options.drag.startAxis = options.startAxis;\n }\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drag.enabled = options;\n\n if (!options) {\n this.ondragstart = this.ondragstart = this.ondragend = null;\n }\n\n return this;\n }\n\n return this.options.drag;\n};\n\nactions.drag = drag;\nactions.names.push('drag');\nutils.merge(Interactable.eventTypes, [\n 'dragstart',\n 'dragmove',\n 'draginertiastart',\n 'draginertiaresume',\n 'dragend',\n]);\nactions.methodDict.drag = 'draggable';\n\ndefaultOptions.drag = drag.defaults;\n\nmodule.exports = drag;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst scope = require('../scope');\nconst interact = require('../interact');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drop = {\n defaults: {\n enabled: false,\n accept : null,\n overlap: 'pointer',\n },\n};\n\nlet dynamicDrop = false;\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // reset active dropzones\n interaction.activeDrops.dropzones = [];\n interaction.activeDrops.elements = [];\n interaction.activeDrops.rects = [];\n\n interaction.dropEvents = null;\n\n if (!interaction.dynamicDrop) {\n setActiveDrops(interaction, interaction.element);\n }\n\n const dragEvent = interaction.prevEvent;\n const dropEvents = getDropEvents(interaction, event, dragEvent);\n\n if (dropEvents.activate) {\n fireActiveDrops(interaction, dropEvents.activate);\n }\n});\n\nInteractEvent.signals.on('new', function ({ interaction, iEvent, event }) {\n if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { return; }\n\n const draggableElement = interaction.element;\n const dragEvent = iEvent;\n const dropResult = getDrop(dragEvent, event, draggableElement);\n\n interaction.dropTarget = dropResult.dropzone;\n interaction.dropElement = dropResult.element;\n\n interaction.dropEvents = getDropEvents(interaction, event, dragEvent);\n});\n\nInteraction.signals.on('action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n fireDropEvents(interaction, interaction.dropEvents);\n});\n\nInteraction.signals.on('action-end', function ({ interaction }) {\n if (interaction.prepared.name === 'drag') {\n fireDropEvents(interaction, interaction.dropEvents);\n }\n});\n\nInteraction.signals.on('stop-drag', function ({ interaction }) {\n interaction.activeDrops.dropzones =\n interaction.activeDrops.elements =\n interaction.activeDrops.rects =\n interaction.dropEvents = null;\n});\n\nfunction collectDrops (interaction, element) {\n const drops = [];\n const elements = [];\n\n element = element || interaction.element;\n\n // collect all dropzones and their elements which qualify for a drop\n for (const current of scope.interactables) {\n if (!current.options.drop.enabled) { continue; }\n\n const accept = current.options.drop.accept;\n\n // test the draggable element against the dropzone's accept setting\n if ((utils.is.element(accept) && accept !== element)\n || (utils.is.string(accept)\n && !utils.matchesSelector(element, accept))) {\n\n continue;\n }\n\n // query for new elements if necessary\n const dropElements = utils.is.string(current.target)\n ? current._context.querySelectorAll(current.target)\n : [current.target];\n\n for (let i = 0; i < dropElements.length; i++) {\n const currentElement = dropElements[i];\n\n if (currentElement !== element) {\n drops.push(current);\n elements.push(currentElement);\n }\n }\n }\n\n return {\n elements,\n dropzones: drops,\n };\n}\n\nfunction fireActiveDrops (interaction, event) {\n let prevElement;\n\n // loop through all active dropzones and trigger event\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n const current = interaction.activeDrops.dropzones[i];\n const currentElement = interaction.activeDrops.elements [i];\n\n // prevent trigger of duplicate events on same element\n if (currentElement !== prevElement) {\n // set current element as event target\n event.target = currentElement;\n current.fire(event);\n }\n prevElement = currentElement;\n }\n}\n\n// Collect a new set of possible drops and save them in activeDrops.\n// setActiveDrops should always be called when a drag has just started or a\n// drag event happens while dynamicDrop is true\nfunction setActiveDrops (interaction, dragElement) {\n // get dropzones and their elements that could receive the draggable\n const possibleDrops = collectDrops(interaction, dragElement, true);\n\n interaction.activeDrops.dropzones = possibleDrops.dropzones;\n interaction.activeDrops.elements = possibleDrops.elements;\n interaction.activeDrops.rects = [];\n\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n interaction.activeDrops.rects[i] =\n interaction.activeDrops.dropzones[i].getRect(interaction.activeDrops.elements[i]);\n }\n}\n\nfunction getDrop (dragEvent, event, dragElement) {\n const interaction = dragEvent.interaction;\n const validDrops = [];\n\n if (dynamicDrop) {\n setActiveDrops(interaction, dragElement);\n }\n\n // collect all dropzones and their elements which qualify for a drop\n for (let j = 0; j < interaction.activeDrops.dropzones.length; j++) {\n const current = interaction.activeDrops.dropzones[j];\n const currentElement = interaction.activeDrops.elements [j];\n const rect = interaction.activeDrops.rects [j];\n\n validDrops.push(current.dropCheck(dragEvent, event, interaction.target, dragElement, currentElement, rect)\n ? currentElement\n : null);\n }\n\n // get the most appropriate dropzone based on DOM depth and order\n const dropIndex = utils.indexOfDeepestElement(validDrops);\n\n return {\n dropzone: interaction.activeDrops.dropzones[dropIndex] || null,\n element : interaction.activeDrops.elements [dropIndex] || null,\n };\n}\n\nfunction getDropEvents (interaction, pointerEvent, dragEvent) {\n const dropEvents = {\n enter : null,\n leave : null,\n activate : null,\n deactivate: null,\n move : null,\n drop : null,\n };\n\n const tmpl = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n };\n\n if (interaction.dropElement !== interaction.prevDropElement) {\n // if there was a prevDropTarget, create a dragleave event\n if (interaction.prevDropTarget) {\n dropEvents.leave = utils.extend({ type: 'dragleave' }, tmpl);\n\n dragEvent.dragLeave = dropEvents.leave.target = interaction.prevDropElement;\n dragEvent.prevDropzone = dropEvents.leave.dropzone = interaction.prevDropTarget;\n }\n // if the dropTarget is not null, create a dragenter event\n if (interaction.dropTarget) {\n dropEvents.enter = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n type : 'dragenter',\n };\n\n dragEvent.dragEnter = interaction.dropElement;\n dragEvent.dropzone = interaction.dropTarget;\n }\n }\n\n if (dragEvent.type === 'dragend' && interaction.dropTarget) {\n dropEvents.drop = utils.extend({ type: 'drop' }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n dragEvent.relatedTarget = interaction.dropElement;\n }\n if (dragEvent.type === 'dragstart') {\n dropEvents.activate = utils.extend({ type: 'dropactivate' }, tmpl);\n\n dropEvents.activate.target = null;\n dropEvents.activate.dropzone = null;\n }\n if (dragEvent.type === 'dragend') {\n dropEvents.deactivate = utils.extend({ type: 'dropdeactivate' }, tmpl);\n\n dropEvents.deactivate.target = null;\n dropEvents.deactivate.dropzone = null;\n }\n if (dragEvent.type === 'dragmove' && interaction.dropTarget) {\n dropEvents.move = utils.extend({\n dragmove : dragEvent,\n type : 'dropmove',\n }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n }\n\n return dropEvents;\n}\n\nfunction fireDropEvents (interaction, dropEvents) {\n if (dropEvents.leave) { interaction.prevDropTarget.fire(dropEvents.leave); }\n if (dropEvents.move ) { interaction.dropTarget.fire(dropEvents.move ); }\n if (dropEvents.enter) { interaction.dropTarget.fire(dropEvents.enter); }\n if (dropEvents.drop ) { interaction.dropTarget.fire(dropEvents.drop ); }\n if (dropEvents.deactivate) {\n fireActiveDrops(interaction, dropEvents.deactivate);\n }\n\n interaction.prevDropTarget = interaction.dropTarget;\n interaction.prevDropElement = interaction.dropElement;\n}\n\n/*\\\n * Interactable.dropzone\n [ method ]\n *\n * Returns or sets whether elements can be dropped onto this\n * Interactable to trigger drop events\n *\n * Dropzones can receive the following events:\n * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends\n * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone\n * - `dragmove` when a draggable that has entered the dropzone is moved\n * - `drop` when a draggable is dropped into this dropzone\n *\n * Use the `accept` option to allow only elements that match the given CSS\n * selector or element. The value can be:\n *\n * - **an Element** - only that element can be dropped into this dropzone.\n * - **a string**, - the element being dragged must match it as a CSS selector.\n * - **`null`** - accept options is cleared - it accepts any element.\n *\n * Use the `overlap` option to set how drops are checked for. The allowed\n * values are:\n *\n * - `'pointer'`, the pointer must be over the dropzone (default)\n * - `'center'`, the draggable element's center must be over the dropzone\n * - a number from 0-1 which is the `(intersection area) / (draggable area)`.\n * e.g. `0.5` for drop to happen when half of the area of the draggable is\n * over the dropzone\n *\n * Use the `checker` option to specify a function to check if a dragged\n * element is over this Interactable.\n *\n | interact(target)\n | .dropChecker(function(dragEvent, // related dragmove or dragend event\n | event, // TouchEvent/PointerEvent/MouseEvent\n | dropped, // bool result of the default checker\n | dropzone, // dropzone Interactable\n | dropElement, // dropzone elemnt\n | draggable, // draggable Interactable\n | draggableElement) {// draggable element\n |\n | return dropped && event.target.hasAttribute('allow-drop');\n | }\n *\n *\n - options (boolean | object | null) #optional The new value to be set.\n | interact('.drop').dropzone({\n | accept: '.can-drop' || document.getElementById('single-drop'),\n | overlap: 'pointer' || 'center' || zeroToOne\n | }\n = (boolean | object) The current setting or this Interactable\n\\*/\nInteractable.prototype.dropzone = function (options) {\n if (utils.is.object(options)) {\n this.options.drop.enabled = options.enabled === false? false: true;\n\n if (utils.is.function(options.ondrop) ) { this.events.ondrop = options.ondrop ; }\n if (utils.is.function(options.ondropactivate) ) { this.events.ondropactivate = options.ondropactivate ; }\n if (utils.is.function(options.ondropdeactivate)) { this.events.ondropdeactivate = options.ondropdeactivate; }\n if (utils.is.function(options.ondragenter) ) { this.events.ondragenter = options.ondragenter ; }\n if (utils.is.function(options.ondragleave) ) { this.events.ondragleave = options.ondragleave ; }\n if (utils.is.function(options.ondropmove) ) { this.events.ondropmove = options.ondropmove ; }\n\n if (/^(pointer|center)$/.test(options.overlap)) {\n this.options.drop.overlap = options.overlap;\n }\n else if (utils.is.number(options.overlap)) {\n this.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0);\n }\n if ('accept' in options) {\n this.options.drop.accept = options.accept;\n }\n if ('checker' in options) {\n this.options.drop.checker = options.checker;\n }\n\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drop.enabled = options;\n\n if (!options) {\n this.ondragenter = this.ondragleave = this.ondrop\n = this.ondropactivate = this.ondropdeactivate = null;\n }\n\n return this;\n }\n\n return this.options.drop;\n};\n\nInteractable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) {\n let dropped = false;\n\n // if the dropzone has no rect (eg. display: none)\n // call the custom dropChecker or just return false\n if (!(rect = rect || this.getRect(dropElement))) {\n return (this.options.drop.checker\n ? this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement)\n : false);\n }\n\n const dropOverlap = this.options.drop.overlap;\n\n if (dropOverlap === 'pointer') {\n const origin = utils.getOriginXY(draggable, draggableElement, 'drag');\n const page = utils.getPageXY(dragEvent);\n\n page.x += origin.x;\n page.y += origin.y;\n\n const horizontal = (page.x > rect.left) && (page.x < rect.right);\n const vertical = (page.y > rect.top ) && (page.y < rect.bottom);\n\n dropped = horizontal && vertical;\n }\n\n const dragRect = draggable.getRect(draggableElement);\n\n if (dragRect && dropOverlap === 'center') {\n const cx = dragRect.left + dragRect.width / 2;\n const cy = dragRect.top + dragRect.height / 2;\n\n dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom;\n }\n\n if (dragRect && utils.is.number(dropOverlap)) {\n const overlapArea = (Math.max(0, Math.min(rect.right , dragRect.right ) - Math.max(rect.left, dragRect.left))\n * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top , dragRect.top )));\n\n const overlapRatio = overlapArea / (dragRect.width * dragRect.height);\n\n dropped = overlapRatio >= dropOverlap;\n }\n\n if (this.options.drop.checker) {\n dropped = this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement);\n }\n\n return dropped;\n};\n\nInteractable.signals.on('unset', function ({ interactable }) {\n interactable.dropzone(false);\n});\n\nInteractable.settingsMethods.push('dropChecker');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.dropTarget = null; // the dropzone a drag target might be dropped into\n interaction.dropElement = null; // the element at the time of checking\n interaction.prevDropTarget = null; // the dropzone that was recently dragged away from\n interaction.prevDropElement = null; // the element at the time of checking\n interaction.dropEvents = null; // the dropEvents related to the current drag event\n\n interaction.activeDrops = {\n dropzones: [], // the dropzones that are mentioned below\n elements : [], // elements of dropzones that accept the target draggable\n rects : [], // the rects of the elements mentioned above\n };\n\n});\n\nInteraction.signals.on('stop', function ({ interaction }) {\n interaction.dropTarget = interaction.dropElement =\n interaction.prevDropTarget = interaction.prevDropElement = null;\n});\n\n/*\\\n * interact.dynamicDrop\n [ method ]\n *\n * Returns or sets whether the dimensions of dropzone elements are\n * calculated on every dragmove or only on dragstart for the default\n * dropChecker\n *\n - newValue (boolean) #optional True to check on each move. False to check only before start\n = (boolean | interact) The current setting or interact\n\\*/\ninteract.dynamicDrop = function (newValue) {\n if (utils.is.bool(newValue)) {\n //if (dragging && dynamicDrop !== newValue && !newValue) {\n //calcRects(dropzones);\n //}\n\n dynamicDrop = newValue;\n\n return interact;\n }\n return dynamicDrop;\n};\n\nutils.merge(Interactable.eventTypes, [\n 'dragenter',\n 'dragleave',\n 'dropactivate',\n 'dropdeactivate',\n 'dropmove',\n 'drop',\n]);\nactions.methodDict.drop = 'dropzone';\n\ndefaultOptions.drop = drop.defaults;\n\nmodule.exports = drop;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst gesture = {\n defaults: {\n enabled : false,\n origin : null,\n restrict: null,\n },\n\n checker: function (pointer, event, interactable, element, interaction) {\n if (interaction.pointerIds.length >= 2) {\n return { name: 'gesture' };\n }\n\n return null;\n },\n\n getCursor: function () {\n return '';\n },\n};\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturestart') { return; }\n iEvent.ds = 0;\n\n interaction.gesture.startDistance = interaction.gesture.prevDistance = iEvent.distance;\n interaction.gesture.startAngle = interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.scale = 1;\n});\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturemove') { return; }\n\n iEvent.ds = iEvent.scale - interaction.gesture.scale;\n\n interaction.target.fire(iEvent);\n\n interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.prevDistance = iEvent.distance;\n\n if (iEvent.scale !== Infinity\n && iEvent.scale !== null\n && iEvent.scale !== undefined\n && !isNaN(iEvent.scale)) {\n\n interaction.gesture.scale = iEvent.scale;\n }\n});\n\n/*\\\n * Interactable.gesturable\n [ method ]\n *\n * Gets or sets whether multitouch gestures can be performed on the\n * Interactable's element\n *\n = (boolean) Indicates if this can be the target of gesture events\n | var isGestureable = interact(element).gesturable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on gesture events (makes the Interactable gesturable)\n = (object) this Interactable\n | interact(element).gesturable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // limit multiple gestures.\n | // See the explanation in @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n\\*/\nInteractable.prototype.gesturable = function (options) {\n if (utils.is.object(options)) {\n this.options.gesture.enabled = options.enabled === false? false: true;\n this.setPerAction('gesture', options);\n this.setOnEvents('gesture', options);\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.gesture.enabled = options;\n\n if (!options) {\n this.ongesturestart = this.ongesturestart = this.ongestureend = null;\n }\n\n return this;\n }\n\n return this.options.gesture;\n};\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action, event, starting, ending, deltaSource }) {\n if (action !== 'gesture') { return; }\n\n const pointers = interaction.pointers;\n\n iEvent.touches = [pointers[0], pointers[1]];\n\n if (starting) {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = 1;\n iEvent.ds = 0;\n iEvent.angle = utils.touchAngle(pointers, undefined, deltaSource);\n iEvent.da = 0;\n }\n else if (ending || event instanceof InteractEvent) {\n iEvent.distance = interaction.prevEvent.distance;\n iEvent.box = interaction.prevEvent.box;\n iEvent.scale = interaction.prevEvent.scale;\n iEvent.ds = iEvent.scale - 1;\n iEvent.angle = interaction.prevEvent.angle;\n iEvent.da = iEvent.angle - interaction.gesture.startAngle;\n }\n else {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = iEvent.distance / interaction.gesture.startDistance;\n iEvent.angle = utils.touchAngle(pointers, interaction.gesture.prevAngle, deltaSource);\n\n iEvent.ds = iEvent.scale - interaction.gesture.prevScale;\n iEvent.da = iEvent.angle - interaction.gesture.prevAngle;\n }\n});\n\nInteraction.signals.on('new', function (interaction) {\n interaction.gesture = {\n start: { x: 0, y: 0 },\n\n startDistance: 0, // distance between two touches of touchStart\n prevDistance : 0,\n distance : 0,\n\n scale: 1, // gesture.distance / gesture.startDistance\n\n startAngle: 0, // angle of line joining two touches\n prevAngle : 0, // angle of the previous gesture event\n };\n});\n\nactions.gesture = gesture;\nactions.names.push('gesture');\nutils.merge(Interactable.eventTypes, [\n 'gesturestart',\n 'gesturemove',\n 'gestureend',\n]);\nactions.methodDict.gesture = 'gesturable';\n\ndefaultOptions.gesture = gesture.defaults;\n\nmodule.exports = gesture;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\n// Less Precision with touch input\nconst defaultMargin = browser.supportsTouch || browser.supportsPointerEvent? 20: 10;\n\nconst resize = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n square: false,\n preserveAspectRatio: false,\n axis: 'xy',\n\n // use default margin\n margin: NaN,\n\n // object with props left, right, top, bottom which are\n // true/false values to resize when the pointer is over that edge,\n // CSS selectors to match the handles for each direction\n // or the Elements for each handle\n edges: null,\n\n // a value of 'none' will limit the resize rect to a minimum of 0x0\n // 'negate' will alow the rect to have negative width/height\n // 'reposition' will keep the width/height positive by swapping\n // the top and bottom edges and/or swapping the left and right edges\n invert: 'none',\n },\n\n checker: function (pointer, event, interactable, element, interaction, rect) {\n if (!rect) { return null; }\n\n const page = utils.extend({}, interaction.curCoords.page);\n const options = interactable.options;\n\n if (options.resize.enabled) {\n const resizeOptions = options.resize;\n const resizeEdges = { left: false, right: false, top: false, bottom: false };\n\n // if using resize.edges\n if (utils.is.object(resizeOptions.edges)) {\n for (const edge in resizeEdges) {\n resizeEdges[edge] = checkResizeEdge(edge,\n resizeOptions.edges[edge],\n page,\n interaction._eventTarget,\n element,\n rect,\n resizeOptions.margin || defaultMargin);\n }\n\n resizeEdges.left = resizeEdges.left && !resizeEdges.right;\n resizeEdges.top = resizeEdges.top && !resizeEdges.bottom;\n\n if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) {\n return {\n name: 'resize',\n edges: resizeEdges,\n };\n }\n }\n else {\n const right = options.resize.axis !== 'y' && page.x > (rect.right - defaultMargin);\n const bottom = options.resize.axis !== 'x' && page.y > (rect.bottom - defaultMargin);\n\n if (right || bottom) {\n return {\n name: 'resize',\n axes: (right? 'x' : '') + (bottom? 'y' : ''),\n };\n }\n }\n }\n\n return null;\n },\n\n cursors: (browser.isIe9OrOlder ? {\n x : 'e-resize',\n y : 's-resize',\n xy: 'se-resize',\n\n top : 'n-resize',\n left : 'w-resize',\n bottom : 's-resize',\n right : 'e-resize',\n topleft : 'se-resize',\n bottomright: 'se-resize',\n topright : 'ne-resize',\n bottomleft : 'ne-resize',\n } : {\n x : 'ew-resize',\n y : 'ns-resize',\n xy: 'nwse-resize',\n\n top : 'ns-resize',\n left : 'ew-resize',\n bottom : 'ns-resize',\n right : 'ew-resize',\n topleft : 'nwse-resize',\n bottomright: 'nwse-resize',\n topright : 'nesw-resize',\n bottomleft : 'nesw-resize',\n }),\n\n getCursor: function (action) {\n if (action.axis) {\n return resize.cursors[action.name + action.axis];\n }\n else if (action.edges) {\n let cursorKey = '';\n const edgeNames = ['top', 'bottom', 'left', 'right'];\n\n for (let i = 0; i < 4; i++) {\n if (action.edges[edgeNames[i]]) {\n cursorKey += edgeNames[i];\n }\n }\n\n return resize.cursors[cursorKey];\n }\n },\n};\n\n// resizestart\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'resizestart' || !interaction.prepared.edges) {\n return;\n }\n\n const startRect = interaction.target.getRect(interaction.element);\n const resizeOptions = interaction.target.options.resize;\n\n /*\n * When using the `resizable.square` or `resizable.preserveAspectRatio` options, resizing from one edge\n * will affect another. E.g. with `resizable.square`, resizing to make the right edge larger will make\n * the bottom edge larger by the same amount. We call these 'linked' edges. Any linked edges will depend\n * on the active edges and the edge being interacted with.\n */\n if (resizeOptions.square || resizeOptions.preserveAspectRatio) {\n const linkedEdges = utils.extend({}, interaction.prepared.edges);\n\n linkedEdges.top = linkedEdges.top || (linkedEdges.left && !linkedEdges.bottom);\n linkedEdges.left = linkedEdges.left || (linkedEdges.top && !linkedEdges.right );\n linkedEdges.bottom = linkedEdges.bottom || (linkedEdges.right && !linkedEdges.top );\n linkedEdges.right = linkedEdges.right || (linkedEdges.bottom && !linkedEdges.left );\n\n interaction.prepared._linkedEdges = linkedEdges;\n }\n else {\n interaction.prepared._linkedEdges = null;\n }\n\n // if using `resizable.preserveAspectRatio` option, record aspect ratio at the start of the resize\n if (resizeOptions.preserveAspectRatio) {\n interaction.resizeStartAspectRatio = startRect.width / startRect.height;\n }\n\n interaction.resizeRects = {\n start : startRect,\n current : utils.extend({}, startRect),\n inverted : utils.extend({}, startRect),\n previous : utils.extend({}, startRect),\n delta : {\n left: 0, right : 0, width : 0,\n top : 0, bottom: 0, height: 0,\n },\n };\n\n iEvent.rect = interaction.resizeRects.inverted;\n iEvent.deltaRect = interaction.resizeRects.delta;\n});\n\n// resizemove\nInteractEvent.signals.on('new', function ({ iEvent, phase, interaction }) {\n if (phase !== 'move' || !interaction.prepared.edges) { return; }\n\n const resizeOptions = interaction.target.options.resize;\n const invert = resizeOptions.invert;\n const invertible = invert === 'reposition' || invert === 'negate';\n\n let edges = interaction.prepared.edges;\n\n const start = interaction.resizeRects.start;\n const current = interaction.resizeRects.current;\n const inverted = interaction.resizeRects.inverted;\n const delta = interaction.resizeRects.delta;\n const previous = utils.extend(interaction.resizeRects.previous, inverted);\n const originalEdges = edges;\n\n let dx = iEvent.dx;\n let dy = iEvent.dy;\n\n if (resizeOptions.preserveAspectRatio || resizeOptions.square) {\n // `resize.preserveAspectRatio` takes precedence over `resize.square`\n const startAspectRatio = resizeOptions.preserveAspectRatio\n ? interaction.resizeStartAspectRatio\n : 1;\n\n edges = interaction.prepared._linkedEdges;\n\n if ((originalEdges.left && originalEdges.bottom)\n || (originalEdges.right && originalEdges.top)) {\n dy = -dx / startAspectRatio;\n }\n else if (originalEdges.left || originalEdges.right ) { dy = dx / startAspectRatio; }\n else if (originalEdges.top || originalEdges.bottom) { dx = dy * startAspectRatio; }\n }\n\n // update the 'current' rect without modifications\n if (edges.top ) { current.top += dy; }\n if (edges.bottom) { current.bottom += dy; }\n if (edges.left ) { current.left += dx; }\n if (edges.right ) { current.right += dx; }\n\n if (invertible) {\n // if invertible, copy the current rect\n utils.extend(inverted, current);\n\n if (invert === 'reposition') {\n // swap edge values if necessary to keep width/height positive\n let swap;\n\n if (inverted.top > inverted.bottom) {\n swap = inverted.top;\n\n inverted.top = inverted.bottom;\n inverted.bottom = swap;\n }\n if (inverted.left > inverted.right) {\n swap = inverted.left;\n\n inverted.left = inverted.right;\n inverted.right = swap;\n }\n }\n }\n else {\n // if not invertible, restrict to minimum of 0x0 rect\n inverted.top = Math.min(current.top, start.bottom);\n inverted.bottom = Math.max(current.bottom, start.top);\n inverted.left = Math.min(current.left, start.right);\n inverted.right = Math.max(current.right, start.left);\n }\n\n inverted.width = inverted.right - inverted.left;\n inverted.height = inverted.bottom - inverted.top ;\n\n for (const edge in inverted) {\n delta[edge] = inverted[edge] - previous[edge];\n }\n\n iEvent.edges = interaction.prepared.edges;\n iEvent.rect = inverted;\n iEvent.deltaRect = delta;\n});\n\n/*\\\n * Interactable.resizable\n [ method ]\n *\n * Gets or sets whether resize actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of resize elements\n | var isResizeable = interact('input[type=text]').resizable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on resize events (object makes the Interactable resizable)\n = (object) This Interactable\n | interact(element).resizable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | edges: {\n | top : true, // Use pointer coords to check for resize.\n | left : false, // Disable resizing from left edge.\n | bottom: '.resize-s',// Resize if pointer target matches selector\n | right : handleEl // Resize if pointer target is the given Element\n | },\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height are adjusted at a 1:1 ratio.\n | square: false,\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height maintain the aspect ratio they had when resizing started.\n | preserveAspectRatio: false,\n |\n | // a value of 'none' will limit the resize rect to a minimum of 0x0\n | // 'negate' will allow the rect to have negative width/height\n | // 'reposition' will keep the width/height positive by swapping\n | // the top and bottom edges and/or swapping the left and right edges\n | invert: 'none' || 'negate' || 'reposition'\n |\n | // limit multiple resizes.\n | // See the explanation in the @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n \\*/\nInteractable.prototype.resizable = function (options) {\n if (utils.is.object(options)) {\n this.options.resize.enabled = options.enabled === false? false: true;\n this.setPerAction('resize', options);\n this.setOnEvents('resize', options);\n\n if (/^x$|^y$|^xy$/.test(options.axis)) {\n this.options.resize.axis = options.axis;\n }\n else if (options.axis === null) {\n this.options.resize.axis = defaultOptions.resize.axis;\n }\n\n if (utils.is.bool(options.preserveAspectRatio)) {\n this.options.resize.preserveAspectRatio = options.preserveAspectRatio;\n }\n else if (utils.is.bool(options.square)) {\n this.options.resize.square = options.square;\n }\n\n return this;\n }\n if (utils.is.bool(options)) {\n this.options.resize.enabled = options;\n\n if (!options) {\n this.onresizestart = this.onresizestart = this.onresizeend = null;\n }\n\n return this;\n }\n return this.options.resize;\n};\n\nfunction checkResizeEdge (name, value, page, element, interactableElement, rect, margin) {\n // false, '', undefined, null\n if (!value) { return false; }\n\n // true value, use pointer coords and element rect\n if (value === true) {\n // if dimensions are negative, \"switch\" edges\n const width = utils.is.number(rect.width )? rect.width : rect.right - rect.left;\n const height = utils.is.number(rect.height)? rect.height : rect.bottom - rect.top ;\n\n if (width < 0) {\n if (name === 'left' ) { name = 'right'; }\n else if (name === 'right') { name = 'left' ; }\n }\n if (height < 0) {\n if (name === 'top' ) { name = 'bottom'; }\n else if (name === 'bottom') { name = 'top' ; }\n }\n\n if (name === 'left' ) { return page.x < ((width >= 0? rect.left: rect.right ) + margin); }\n if (name === 'top' ) { return page.y < ((height >= 0? rect.top : rect.bottom) + margin); }\n\n if (name === 'right' ) { return page.x > ((width >= 0? rect.right : rect.left) - margin); }\n if (name === 'bottom') { return page.y > ((height >= 0? rect.bottom: rect.top ) - margin); }\n }\n\n // the remaining checks require an element\n if (!utils.is.element(element)) { return false; }\n\n return utils.is.element(value)\n // the value is an element to use as a resize handle\n ? value === element\n // otherwise check if element matches value as selector\n : utils.matchesUpTo(element, value, interactableElement);\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.resizeAxes = 'xy';\n});\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action }) {\n if (action !== 'resize' || !interaction.resizeAxes) { return; }\n\n const options = interaction.target.options;\n\n if (options.resize.square) {\n if (interaction.resizeAxes === 'y') {\n iEvent.dx = iEvent.dy;\n }\n else {\n iEvent.dy = iEvent.dx;\n }\n iEvent.axes = 'xy';\n }\n else {\n iEvent.axes = interaction.resizeAxes;\n\n if (interaction.resizeAxes === 'x') {\n iEvent.dy = 0;\n }\n else if (interaction.resizeAxes === 'y') {\n iEvent.dx = 0;\n }\n }\n});\n\nactions.resize = resize;\nactions.names.push('resize');\nutils.merge(Interactable.eventTypes, [\n 'resizestart',\n 'resizemove',\n 'resizeinertiastart',\n 'resizeinertiaresume',\n 'resizeend',\n]);\nactions.methodDict.resize = 'resizable';\n\ndefaultOptions.resize = resize.defaults;\n\nmodule.exports = resize;\n","const raf = require('./utils/raf');\nconst getWindow = require('./utils/window').getWindow;\nconst is = require('./utils/is');\nconst domUtils = require('./utils/domUtils');\nconst Interaction = require('./Interaction');\nconst defaultOptions = require('./defaultOptions');\n\nconst autoScroll = {\n defaults: {\n enabled : false,\n container: null, // the item that is scrolled (Window or HTMLElement)\n margin : 60,\n speed : 300, // the scroll speed in pixels per second\n },\n\n interaction: null,\n i: null, // the handle returned by window.setInterval\n x: 0, y: 0, // Direction each pulse is to scroll in\n\n isScrolling: false,\n prevTime: 0,\n\n start: function (interaction) {\n autoScroll.isScrolling = true;\n raf.cancel(autoScroll.i);\n\n autoScroll.interaction = interaction;\n autoScroll.prevTime = new Date().getTime();\n autoScroll.i = raf.request(autoScroll.scroll);\n },\n\n stop: function () {\n autoScroll.isScrolling = false;\n raf.cancel(autoScroll.i);\n },\n\n // scroll the window by the values in scroll.x/y\n scroll: function () {\n const options = autoScroll.interaction.target.options[autoScroll.interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(autoScroll.interaction.element);\n const now = new Date().getTime();\n // change in time in seconds\n const dt = (now - autoScroll.prevTime) / 1000;\n // displacement\n const s = options.speed * dt;\n\n if (s >= 1) {\n if (is.window(container)) {\n container.scrollBy(autoScroll.x * s, autoScroll.y * s);\n }\n else if (container) {\n container.scrollLeft += autoScroll.x * s;\n container.scrollTop += autoScroll.y * s;\n }\n\n autoScroll.prevTime = now;\n }\n\n if (autoScroll.isScrolling) {\n raf.cancel(autoScroll.i);\n autoScroll.i = raf.request(autoScroll.scroll);\n }\n },\n check: function (interactable, actionName) {\n const options = interactable.options;\n\n return options[actionName].autoScroll && options[actionName].autoScroll.enabled;\n },\n onInteractionMove: function ({ interaction, pointer }) {\n if (!(interaction.interacting()\n && autoScroll.check(interaction.target, interaction.prepared.name))) {\n return;\n }\n\n if (interaction.simulation) {\n autoScroll.x = autoScroll.y = 0;\n return;\n }\n\n let top;\n let right;\n let bottom;\n let left;\n\n const options = interaction.target.options[interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(interaction.element);\n\n if (is.window(container)) {\n left = pointer.clientX < autoScroll.margin;\n top = pointer.clientY < autoScroll.margin;\n right = pointer.clientX > container.innerWidth - autoScroll.margin;\n bottom = pointer.clientY > container.innerHeight - autoScroll.margin;\n }\n else {\n const rect = domUtils.getElementClientRect(container);\n\n left = pointer.clientX < rect.left + autoScroll.margin;\n top = pointer.clientY < rect.top + autoScroll.margin;\n right = pointer.clientX > rect.right - autoScroll.margin;\n bottom = pointer.clientY > rect.bottom - autoScroll.margin;\n }\n\n autoScroll.x = (right ? 1: left? -1: 0);\n autoScroll.y = (bottom? 1: top? -1: 0);\n\n if (!autoScroll.isScrolling) {\n // set the autoScroll properties to those of the target\n autoScroll.margin = options.margin;\n autoScroll.speed = options.speed;\n\n autoScroll.start(interaction);\n }\n },\n};\n\nInteraction.signals.on('stop-active', function () {\n autoScroll.stop();\n});\n\nInteraction.signals.on('action-move', autoScroll.onInteractionMove);\n\ndefaultOptions.perAction.autoScroll = autoScroll.defaults;\n\nmodule.exports = autoScroll;\n","const Interactable = require('../Interactable');\nconst actions = require('../actions/base');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.ignoreFrom\n [ method ]\n *\n * If the target of the `mousedown`, `pointerdown` or `touchstart`\n * event or any of it's parents match the given CSS selector or\n * Element, no drag/resize/gesture is started.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to not ignore any elements\n = (string | Element | object) The current ignoreFrom value or this Interactable\n **\n | interact(element, { ignoreFrom: document.getElementById('no-action') });\n | // or\n | interact(element).ignoreFrom('input, textarea, a');\n\\*/\nInteractable.prototype.ignoreFrom = function (newValue) {\n return this._backCompatOption('ignoreFrom', newValue);\n};\n\n/*\\\n * Interactable.allowFrom\n [ method ]\n *\n * A drag/resize/gesture is started only If the target of the\n * `mousedown`, `pointerdown` or `touchstart` event or any of it's\n * parents match the given CSS selector or Element.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to allow from any element\n = (string | Element | object) The current allowFrom value or this Interactable\n **\n | interact(element, { allowFrom: document.getElementById('drag-handle') });\n | // or\n | interact(element).allowFrom('.handle');\n\\*/\nInteractable.prototype.allowFrom = function (newValue) {\n return this._backCompatOption('allowFrom', newValue);\n};\n\nInteractable.prototype.testIgnore = function (ignoreFrom, interactableElement, element) {\n if (!ignoreFrom || !is.element(element)) { return false; }\n\n if (is.string(ignoreFrom)) {\n return domUtils.matchesUpTo(element, ignoreFrom, interactableElement);\n }\n else if (is.element(ignoreFrom)) {\n return domUtils.nodeContains(ignoreFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testAllow = function (allowFrom, interactableElement, element) {\n if (!allowFrom) { return true; }\n\n if (!is.element(element)) { return false; }\n\n if (is.string(allowFrom)) {\n return domUtils.matchesUpTo(element, allowFrom, interactableElement);\n }\n else if (is.element(allowFrom)) {\n return domUtils.nodeContains(allowFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testIgnoreAllow = function (options, interactableElement, eventTarget) {\n return (!this.testIgnore(options.ignoreFrom, interactableElement, eventTarget)\n && this.testAllow(options.allowFrom, interactableElement, eventTarget));\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (event.buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\n","const interact = require('../interact');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst actions = require('../actions/base');\nconst defaultOptions = require('../defaultOptions');\nconst browser = require('../utils/browser');\nconst scope = require('../scope');\nconst utils = require('../utils');\nconst signals = require('../utils/Signals').new();\n\nrequire('./InteractableMethods');\n\nconst autoStart = {\n signals,\n withinInteractionLimit,\n // Allow this many interactions to happen simultaneously\n maxInteractions: Infinity,\n defaults: {\n perAction: {\n manualStart: false,\n max: Infinity,\n maxPerElement: 1,\n allowFrom: null,\n ignoreFrom: null,\n },\n },\n setActionDefaults: function (action) {\n utils.extend(action.defaults, autoStart.defaults.perAction);\n },\n};\n\n// set cursor style on mousedown\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget }) {\n if (interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\n// set cursor style on mousemove\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget }) {\n if (!interaction.mouse\n || interaction.pointerIsDown\n || interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\nInteraction.signals.on('move', function (arg) {\n const { interaction, event } = arg;\n\n if (!interaction.pointerIsDown\n || interaction.interacting()\n || !interaction.pointerWasMoved\n || !interaction.prepared.name) {\n return;\n }\n\n signals.fire('before-start', arg);\n\n const target = interaction.target;\n\n if (interaction.prepared.name && target) {\n // check manualStart and interaction limit\n if (target.options[interaction.prepared.name].manualStart\n || !withinInteractionLimit(target, interaction.element, interaction.prepared)) {\n interaction.stop(event);\n }\n else {\n interaction.start(interaction.prepared, target, interaction.element);\n }\n }\n});\n\n// Check if the current target supports the action.\n// If so, return the validated action. Otherwise, return null\nfunction validateAction (action, interactable, element, eventTarget) {\n if (utils.is.object(action)\n && interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget)\n && interactable.options[action.name].enabled\n && withinInteractionLimit(interactable, element, action)) {\n return action;\n }\n\n return null;\n}\n\nfunction validateSelector (interaction, pointer, event, matches, matchElements, eventTarget) {\n for (let i = 0, len = matches.length; i < len; i++) {\n const match = matches[i];\n const matchElement = matchElements[i];\n const action = validateAction(match.getAction(pointer, event, interaction, matchElement),\n match,\n matchElement,\n eventTarget);\n\n if (action) {\n return {\n action,\n target: match,\n element: matchElement,\n };\n }\n }\n\n return {};\n}\n\nfunction getActionInfo (interaction, pointer, event, eventTarget) {\n let matches = [];\n let matchElements = [];\n\n let element = eventTarget;\n let action = null;\n\n function pushMatches (interactable, selector, context) {\n const elements = (browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined);\n\n if (utils.matchesSelector(element, selector, elements)) {\n\n matches.push(interactable);\n matchElements.push(element);\n }\n }\n\n while (utils.is.element(element)) {\n matches = [];\n matchElements = [];\n\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && (action = validateAction(elementInteractable.getAction(pointer, event, interaction, element, eventTarget),\n elementInteractable,\n element,\n eventTarget))\n && !elementInteractable.options[action.name].manualStart) {\n return {\n element,\n action,\n target: elementInteractable,\n };\n }\n else {\n scope.interactables.forEachSelector(pushMatches, element);\n\n const actionInfo = validateSelector(interaction, pointer, event, matches, matchElements, eventTarget);\n\n if (actionInfo.action\n && !actionInfo.target.options[actionInfo.action.name].manualStart) {\n return actionInfo;\n }\n }\n\n element = utils.parentNode(element);\n }\n\n return {};\n}\n\nfunction prepare (interaction, { action, target, element }) {\n action = action || {};\n\n if (interaction.target && interaction.target.options.styleCursor) {\n interaction.target._doc.documentElement.style.cursor = '';\n }\n\n interaction.target = target;\n interaction.element = element;\n utils.copyAction(interaction.prepared, action);\n\n if (target && target.options.styleCursor) {\n const cursor = action? actions[action.name].getCursor(action) : '';\n interaction.target._doc.documentElement.style.cursor = cursor;\n }\n\n signals.fire('prepared', { interaction: interaction });\n}\n\nInteraction.signals.on('stop', function ({ interaction }) {\n const target = interaction.target;\n\n if (target && target.options.styleCursor) {\n target._doc.documentElement.style.cursor = '';\n }\n});\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (utils.is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (utils.is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n const buttons = event.buttons || ({\n 0: 1,\n 1: 4,\n 3: 8,\n 4: 16,\n })[event.button];\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\nfunction withinInteractionLimit (interactable, element, action) {\n const options = interactable.options;\n const maxActions = options[action.name].max;\n const maxPerElement = options[action.name].maxPerElement;\n let activeInteractions = 0;\n let targetCount = 0;\n let targetElementCount = 0;\n\n // no actions if any of these values == 0\n if (!(maxActions && maxPerElement && autoStart.maxInteractions)) { return; }\n\n for (let i = 0, len = scope.interactions.length; i < len; i++) {\n const interaction = scope.interactions[i];\n const otherAction = interaction.prepared.name;\n\n if (!interaction.interacting()) { continue; }\n\n activeInteractions++;\n\n if (activeInteractions >= autoStart.maxInteractions) {\n return false;\n }\n\n if (interaction.target !== interactable) { continue; }\n\n targetCount += (otherAction === action.name)|0;\n\n if (targetCount >= maxActions) {\n return false;\n }\n\n if (interaction.element === element) {\n targetElementCount++;\n\n if (otherAction !== action.name || targetElementCount >= maxPerElement) {\n return false;\n }\n }\n }\n\n return autoStart.maxInteractions > 0;\n}\n\n/*\\\n * interact.maxInteractions\n [ method ]\n **\n * Returns or sets the maximum number of concurrent interactions allowed.\n * By default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables\n * and elements, you need to enable it in the draggable, resizable and\n * gesturable `'max'` and `'maxPerElement'` options.\n **\n - newValue (number) #optional Any number. newValue <= 0 means no interactions.\n\\*/\ninteract.maxInteractions = function (newValue) {\n if (utils.is.number(newValue)) {\n autoStart.maxInteractions = newValue;\n\n return this;\n }\n\n return autoStart.maxInteractions;\n};\n\nInteractable.settingsMethods.push('styleCursor');\nInteractable.settingsMethods.push('actionChecker');\nInteractable.settingsMethods.push('ignoreFrom');\nInteractable.settingsMethods.push('allowFrom');\n\ndefaultOptions.base.actionChecker = null;\ndefaultOptions.base.styleCursor = true;\n\nutils.extend(defaultOptions.perAction, autoStart.defaults.perAction);\n\nmodule.exports = autoStart;\n","const autoStart = require('./base');\nconst Interaction = require('../Interaction');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.delayTimer = null;\n});\n\nautoStart.signals.on('prepared', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.delayTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.target, interaction.element);\n }, delay);\n }\n});\n\nInteraction.signals.on('move', function ({ interaction, duplicate }) {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.delayTimer);\n }\n});\n\n// prevent regular down->move autoStart\nautoStart.signals.on('before-start', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.prepared.name = null;\n }\n});\n","const autoStart = require('./base');\nconst scope = require('../scope');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\n\nconst { matchesSelector, parentNode } = require('../utils/domUtils');\n\nautoStart.setActionDefaults(require('../actions/drag'));\n\nautoStart.signals.on('before-start', function ({ interaction, eventTarget, dx, dy }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // check if a drag is in the correct axis\n const absX = Math.abs(dx);\n const absY = Math.abs(dy);\n const options = interaction.target.options.drag;\n const startAxis = options.startAxis;\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy');\n\n interaction.prepared.axis = options.lockAxis === 'start'\n ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n : options.lockAxis;\n\n // if the movement isn't in the startAxis of the interactable\n if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) {\n // cancel the prepared action\n interaction.prepared.name = null;\n\n // then try to get a drag from another ineractable\n\n if (!interaction.prepared.name) {\n\n let element = eventTarget;\n\n const getDraggable = function (interactable, selector, context) {\n const elements = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n if (interactable === interaction.target) { return; }\n\n if (!options.manualStart\n && !interactable.testIgnoreAllow(options, element, eventTarget)\n && matchesSelector(element, selector, elements)) {\n\n const action = interactable.getAction(interaction.downPointer,\n interaction.downEvent,\n interaction,\n element);\n\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, interactable)\n && autoStart.validateAction(action, interactable, element, eventTarget)) {\n\n return interactable;\n }\n }\n };\n\n let action = null;\n\n // check all interactables\n while (is.element(element)) {\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && elementInteractable !== interaction.target\n && !elementInteractable.options.drag.manualStart) {\n\n action = elementInteractable.getAction(interaction.downPointer, interaction.downEvent, interaction, element);\n }\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, elementInteractable)) {\n\n interaction.prepared.name = 'drag';\n interaction.target = elementInteractable;\n interaction.element = element;\n break;\n }\n\n const selectorInteractable = scope.interactables.forEachSelector(getDraggable, element);\n\n if (selectorInteractable) {\n interaction.prepared.name = 'drag';\n interaction.target = selectorInteractable;\n interaction.element = element;\n break;\n }\n\n element = parentNode(element);\n }\n }\n }\n});\n\nfunction checkStartAxis (startAxis, interactable) {\n if (!interactable) { return false; }\n\n const thisAxis = interactable.options.drag.startAxis;\n\n return (startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis);\n}\n","require('./base').setActionDefaults(require('../actions/gesture'));\n","require('./base').setActionDefaults(require('../actions/resize'));\n","module.exports = {\n base: {\n accept : null,\n preventDefault: 'auto',\n deltaSource : 'page',\n },\n\n perAction: {\n origin: { x: 0, y: 0 },\n\n // only allow left button by default\n // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n mouseButtons: 1,\n\n inertia: {\n enabled : false,\n resistance : 10, // the lambda in exponential decay\n minSpeed : 100, // target speed must be above this for inertia to start\n endSpeed : 10, // the speed at which inertia is slow enough to stop\n allowResume : true, // allow resuming an action in inertia phase\n smoothEndDuration: 300, // animate to snap/restrict endOnly if there's no inertia\n },\n },\n};\n","/* browser entry point */\n\n// Legacy browser support\nrequire('./legacyBrowsers');\n\n// inertia\nrequire('./inertia');\n\n// modifiers\nrequire('./modifiers/snap');\nrequire('./modifiers/restrict');\n\n// pointerEvents\nrequire('./pointerEvents/base');\nrequire('./pointerEvents/holdRepeat');\nrequire('./pointerEvents/interactableTargets');\n\n// delay\nrequire('./autoStart/delay');\n\n// actions\nrequire('./actions/gesture');\nrequire('./actions/resize');\nrequire('./actions/drag');\nrequire('./actions/drop');\n\n// load these modifiers after resize is loaded\nrequire('./modifiers/snapSize');\nrequire('./modifiers/restrictEdges');\nrequire('./modifiers/restrictSize');\n\n// autoStart actions\nrequire('./autoStart/gesture');\nrequire('./autoStart/resize');\nrequire('./autoStart/drag');\n\n// Interactable preventDefault setting\nrequire('./interactablePreventDefault.js');\n\n// autoScroll\nrequire('./autoScroll');\n\n// export interact\nmodule.exports = require('./interact');\n","const InteractEvent = require('./InteractEvent');\nconst Interaction = require('./Interaction');\nconst modifiers = require('./modifiers');\nconst utils = require('./utils');\nconst animationFrame = require('./utils/raf');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.inertiaStatus = {\n active : false,\n smoothEnd : false,\n allowResume: false,\n\n startEvent: null,\n upCoords : {},\n\n xe: 0, ye: 0,\n sx: 0, sy: 0,\n\n t0: 0,\n vx0: 0, vys: 0,\n duration: 0,\n\n lambda_v0: 0,\n one_ve_v0: 0,\n i : null,\n };\n\n interaction.boundInertiaFrame = () => inertiaFrame .apply(interaction);\n interaction.boundSmoothEndFrame = () => smoothEndFrame.apply(interaction);\n});\n\nInteraction.signals.on('down', function ({ interaction, event, pointer, eventTarget }) {\n const status = interaction.inertiaStatus;\n\n // Check if the down event hits the current inertia target\n if (status.active) {\n let element = eventTarget;\n\n // climb up the DOM tree from the event target\n while (utils.is.element(element)) {\n\n // if interaction element is the current inertia target element\n if (element === interaction.element) {\n // stop inertia\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n\n // update pointers to the down event's coordinates\n interaction.updatePointer(pointer);\n utils.setCoords(interaction.curCoords, interaction.pointers);\n\n // fire appropriate signals\n const signalArg = { interaction };\n Interaction.signals.fire('before-action-move', signalArg);\n Interaction.signals.fire('action-resume' , signalArg);\n\n // fire a reume event\n const resumeEvent = new InteractEvent(interaction,\n event,\n interaction.prepared.name,\n 'inertiaresume',\n interaction.element);\n\n interaction.target.fire(resumeEvent);\n interaction.prevEvent = resumeEvent;\n modifiers.resetStatuses(interaction.modifierStatuses);\n\n utils.copyCoords(interaction.prevCoords, interaction.curCoords);\n break;\n }\n\n element = utils.parentNode(element);\n }\n }\n});\n\nInteraction.signals.on('up', function ({ interaction, event }) {\n const status = interaction.inertiaStatus;\n\n if (!interaction.interacting() || status.active) { return; }\n\n const target = interaction.target;\n const options = target && target.options;\n const inertiaOptions = options && interaction.prepared.name && options[interaction.prepared.name].inertia;\n\n const now = new Date().getTime();\n const statuses = {};\n const page = utils.extend({}, interaction.curCoords.page);\n const pointerSpeed = interaction.pointerDelta.client.speed;\n\n let smoothEnd = false;\n let modifierResult;\n\n // check if inertia should be started\n const inertiaPossible = (inertiaOptions && inertiaOptions.enabled\n && interaction.prepared.name !== 'gesture'\n && event !== status.startEvent);\n\n const inertia = (inertiaPossible\n && (now - interaction.curCoords.timeStamp) < 50\n && pointerSpeed > inertiaOptions.minSpeed\n && pointerSpeed > inertiaOptions.endSpeed);\n\n const modifierArg = {\n interaction,\n pageCoords: page,\n statuses,\n preEnd: true,\n requireEndOnly: true,\n };\n\n // smoothEnd\n if (inertiaPossible && !inertia) {\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n if (modifierResult.shouldMove && modifierResult.locked) {\n smoothEnd = true;\n }\n }\n\n if (!(inertia || smoothEnd)) { return; }\n\n utils.copyCoords(status.upCoords, interaction.curCoords);\n\n interaction.pointers[0] = status.startEvent =\n new InteractEvent(interaction, event, interaction.prepared.name, 'inertiastart', interaction.element);\n\n status.t0 = now;\n\n status.active = true;\n status.allowResume = inertiaOptions.allowResume;\n interaction.simulation = status;\n\n target.fire(status.startEvent);\n\n if (inertia) {\n status.vx0 = interaction.pointerDelta.client.vx;\n status.vy0 = interaction.pointerDelta.client.vy;\n status.v0 = pointerSpeed;\n\n calcInertia(interaction, status);\n\n utils.extend(page, interaction.curCoords.page);\n\n page.x += status.xe;\n page.y += status.ye;\n\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n status.modifiedXe += modifierResult.dx;\n status.modifiedYe += modifierResult.dy;\n\n status.i = animationFrame.request(interaction.boundInertiaFrame);\n }\n else {\n status.smoothEnd = true;\n status.xe = modifierResult.dx;\n status.ye = modifierResult.dy;\n\n status.sx = status.sy = 0;\n\n status.i = animationFrame.request(interaction.boundSmoothEndFrame);\n }\n});\n\nInteraction.signals.on('stop-active', function ({ interaction }) {\n const status = interaction.inertiaStatus;\n\n if (status.active) {\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n }\n});\n\nfunction calcInertia (interaction, status) {\n const inertiaOptions = interaction.target.options[interaction.prepared.name].inertia;\n const lambda = inertiaOptions.resistance;\n const inertiaDur = -Math.log(inertiaOptions.endSpeed / status.v0) / lambda;\n\n status.x0 = interaction.prevEvent.pageX;\n status.y0 = interaction.prevEvent.pageY;\n status.t0 = status.startEvent.timeStamp / 1000;\n status.sx = status.sy = 0;\n\n status.modifiedXe = status.xe = (status.vx0 - inertiaDur) / lambda;\n status.modifiedYe = status.ye = (status.vy0 - inertiaDur) / lambda;\n status.te = inertiaDur;\n\n status.lambda_v0 = lambda / status.v0;\n status.one_ve_v0 = 1 - inertiaOptions.endSpeed / status.v0;\n}\n\nfunction inertiaFrame () {\n updateInertiaCoords(this);\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n\n const status = this.inertiaStatus;\n const options = this.target.options[this.prepared.name].inertia;\n const lambda = options.resistance;\n const t = new Date().getTime() / 1000 - status.t0;\n\n if (t < status.te) {\n\n const progress = 1 - (Math.exp(-lambda * t) - status.lambda_v0) / status.one_ve_v0;\n\n if (status.modifiedXe === status.xe && status.modifiedYe === status.ye) {\n status.sx = status.xe * progress;\n status.sy = status.ye * progress;\n }\n else {\n const quadPoint = utils.getQuadraticCurvePoint(0, 0,\n status.xe,\n status.ye,\n status.modifiedXe,\n status.modifiedYe,\n progress);\n\n status.sx = quadPoint.x;\n status.sy = quadPoint.y;\n }\n\n this.doMove();\n\n status.i = animationFrame.request(this.boundInertiaFrame);\n }\n else {\n status.sx = status.modifiedXe;\n status.sy = status.modifiedYe;\n\n this.doMove();\n this.end(status.startEvent);\n status.active = false;\n this.simulation = null;\n }\n\n utils.copyCoords(this.prevCoords, this.curCoords);\n}\n\nfunction smoothEndFrame () {\n updateInertiaCoords(this);\n\n const status = this.inertiaStatus;\n const t = new Date().getTime() - status.t0;\n const duration = this.target.options[this.prepared.name].inertia.smoothEndDuration;\n\n if (t < duration) {\n status.sx = utils.easeOutQuad(t, 0, status.xe, duration);\n status.sy = utils.easeOutQuad(t, 0, status.ye, duration);\n\n this.pointerMove(status.startEvent, status.startEvent);\n\n status.i = animationFrame.request(this.boundSmoothEndFrame);\n }\n else {\n status.sx = status.xe;\n status.sy = status.ye;\n\n this.pointerMove(status.startEvent, status.startEvent);\n this.end(status.startEvent);\n\n status.smoothEnd =\n status.active = false;\n this.simulation = null;\n }\n}\n\nfunction updateInertiaCoords (interaction) {\n const status = interaction.inertiaStatus;\n\n // return if inertia isn't running\n if (!status.active) { return; }\n\n const pageUp = status.upCoords.page;\n const clientUp = status.upCoords.client;\n\n utils.setCoords(interaction.curCoords, [ {\n pageX : pageUp.x + status.sx,\n pageY : pageUp.y + status.sy,\n clientX: clientUp.x + status.sx,\n clientY: clientUp.y + status.sy,\n } ]);\n}\n","const browser = require('./utils/browser');\nconst events = require('./utils/events');\nconst utils = require('./utils');\nconst scope = require('./scope');\nconst Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\n\nconst globalEvents = {};\n\n/*\\\n * interact\n [ method ]\n *\n * The methods of this variable can be used to set elements as\n * interactables and also to change various default settings.\n *\n * Calling it as a function and passing an element or a valid CSS selector\n * string returns an Interactable object which has various methods to\n * configure it.\n *\n - element (Element | string) The HTML or SVG Element to interact with or CSS selector\n = (object) An @Interactable\n *\n > Usage\n | interact('#draggable').draggable(true);\n |\n | var rectables = interact('rect');\n | rectables\n | .gesturable(true)\n | .on('gesturemove', function (event) {\n | // ...\n | });\n\\*/\nfunction interact (element, options) {\n let interactable = scope.interactables.get(element, options);\n\n if (!interactable) {\n interactable = new Interactable(element, options);\n interactable.events.global = globalEvents;\n }\n\n return interactable;\n}\n\n/*\\\n * interact.isSet\n [ method ]\n *\n * Check if an element has been set\n - element (Element) The Element being searched for\n = (boolean) Indicates if the element or CSS selector was previously passed to interact\n\\*/\ninteract.isSet = function (element, options) {\n return scope.interactables.indexOfElement(element, options && options.context) !== -1;\n};\n\n/*\\\n * interact.on\n [ method ]\n *\n * Adds a global listener for an InteractEvent or adds a DOM event to\n * `document`\n *\n - type (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) interact\n\\*/\ninteract.on = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.on(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.on(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n // if it is an InteractEvent type, add listener to globalEvents\n if (utils.contains(Interactable.eventTypes, type)) {\n // if this type of event was never bound\n if (!globalEvents[type]) {\n globalEvents[type] = [listener];\n }\n else {\n globalEvents[type].push(listener);\n }\n }\n // If non InteractEvent type, addEventListener to document\n else {\n events.add(scope.document, type, listener, { options });\n }\n\n return interact;\n};\n\n/*\\\n * interact.off\n [ method ]\n *\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n - type (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) interact\n \\*/\ninteract.off = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.off(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.off(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n if (!utils.contains(Interactable.eventTypes, type)) {\n events.remove(scope.document, type, listener, options);\n }\n else {\n let index;\n\n if (type in globalEvents\n && (index = utils.indexOf(globalEvents[type], listener)) !== -1) {\n globalEvents[type].splice(index, 1);\n }\n }\n\n return interact;\n};\n\n/*\\\n * interact.debug\n [ method ]\n *\n * Returns an object which exposes internal data\n = (object) An object with properties that outline the current state and expose internal functions and variables\n\\*/\ninteract.debug = function () {\n return scope;\n};\n\n// expose the functions used to calculate multi-touch properties\ninteract.getPointerAverage = utils.pointerAverage;\ninteract.getTouchBBox = utils.touchBBox;\ninteract.getTouchDistance = utils.touchDistance;\ninteract.getTouchAngle = utils.touchAngle;\n\ninteract.getElementRect = utils.getElementRect;\ninteract.getElementClientRect = utils.getElementClientRect;\ninteract.matchesSelector = utils.matchesSelector;\ninteract.closest = utils.closest;\n\n/*\\\n * interact.supportsTouch\n [ method ]\n *\n = (boolean) Whether or not the browser supports touch input\n\\*/\ninteract.supportsTouch = function () {\n return browser.supportsTouch;\n};\n\n/*\\\n * interact.supportsPointerEvent\n [ method ]\n *\n = (boolean) Whether or not the browser supports PointerEvents\n\\*/\ninteract.supportsPointerEvent = function () {\n return browser.supportsPointerEvent;\n};\n\n/*\\\n * interact.stop\n [ method ]\n *\n * Cancels all interactions (end events are not fired)\n *\n - event (Event) An event on which to call preventDefault()\n = (object) interact\n\\*/\ninteract.stop = function (event) {\n for (let i = scope.interactions.length - 1; i >= 0; i--) {\n scope.interactions[i].stop(event);\n }\n\n return interact;\n};\n\n/*\\\n * interact.pointerMoveTolerance\n [ method ]\n * Returns or sets the distance the pointer must be moved before an action\n * sequence occurs. This also affects tolerance for tap events.\n *\n - newValue (number) #optional The movement from the start position must be greater than this value\n = (number | Interactable) The current setting or interact\n\\*/\ninteract.pointerMoveTolerance = function (newValue) {\n if (utils.is.number(newValue)) {\n Interaction.pointerMoveTolerance = newValue;\n\n return this;\n }\n\n return Interaction.pointerMoveTolerance;\n};\n\ninteract.addDocument = scope.addDocument;\ninteract.removeDocument = scope.removeDocument;\n\nscope.interact = interact;\n\nmodule.exports = interact;\n","const Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\nconst scope = require('./scope');\nconst is = require('./utils/is');\nconst events = require('./utils/events');\n\nconst { nodeContains, matchesSelector } = require('./utils/domUtils');\n\n/*\\\n * Interactable.preventDefault\n [ method ]\n *\n * Returns or sets whether to prevent the browser's default behaviour\n * in response to pointer events. Can be set to:\n * - `'always'` to always prevent\n * - `'never'` to never prevent\n * - `'auto'` to let interact.js try to determine what would be best\n *\n - newValue (string) #optional `true`, `false` or `'auto'`\n = (string | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.preventDefault = function (newValue) {\n if (/^(always|never|auto)$/.test(newValue)) {\n this.options.preventDefault = newValue;\n return this;\n }\n\n if (is.bool(newValue)) {\n this.options.preventDefault = newValue? 'always' : 'never';\n return this;\n }\n\n return this.options.preventDefault;\n};\n\nInteractable.prototype.checkAndPreventDefault = function (event) {\n const setting = this.options.preventDefault;\n\n if (setting === 'never') { return; }\n\n if (setting === 'always') {\n event.preventDefault();\n return;\n }\n\n // setting === 'auto'\n\n // don't preventDefault if the browser supports passiveEvents\n // CSS touch-action and user-selecct should be used instead\n if (events.supportsOptions) {\n return;\n }\n\n // don't preventDefault of pointerdown events\n if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) {\n return;\n }\n\n // don't preventDefault on editable elements\n if (is.element(event.target)\n && matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) {\n return;\n }\n\n event.preventDefault();\n};\n\nfunction onInteractionEvent ({ interaction, event }) {\n if (interaction.target) {\n interaction.target.checkAndPreventDefault(event);\n }\n}\n\nfor (const eventSignal of ['down', 'move', 'up', 'cancel']) {\n Interaction.signals.on(eventSignal, onInteractionEvent);\n}\n\n// prevent native HTML5 drag on interact.js target elements\nInteraction.docEvents.dragstart = function preventNativeDrag (event) {\n for (const interaction of scope.interactions) {\n\n if (interaction.element\n && (interaction.element === event.target\n || nodeContains(interaction.element, event.target))) {\n\n interaction.target.checkAndPreventDefault(event);\n return;\n }\n }\n};\n","const scope = require('./scope');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst iFinder = require('./utils/interactionFinder');\nconst pointerEvents = require('./pointerEvents/base');\n\nconst { window } = require('./utils/window');\n\nconst toString = Object.prototype.toString;\n\nif (!window.Array.isArray) {\n window.Array.isArray = function (obj) {\n return toString.call(obj) === '[object Array]';\n };\n}\n\nif (!String.prototype.trim) {\n String.prototype.trim = function () {\n return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n };\n}\n\n// http://www.quirksmode.org/dom/events/click.html\n// >Events leading to dblclick\n//\n// IE8 doesn't fire down event before dblclick.\n// This workaround tries to fire a tap and doubletap after dblclick\nfunction onIE8Dblclick (event) {\n const eventTarget = event.target;\n const interaction = iFinder.search(event, event.type, eventTarget);\n\n if (!interaction) { return; }\n\n if (interaction.prevTap\n && event.clientX === interaction.prevTap.clientX\n && event.clientY === interaction.prevTap.clientY\n && eventTarget === interaction.prevTap.target) {\n\n interaction.downTargets[0] = eventTarget;\n interaction.downTimes [0] = new Date().getTime();\n\n pointerEvents.fire({\n interaction,\n event,\n eventTarget,\n pointer: event,\n type: 'tap',\n });\n }\n}\n\nif (browser.isIE8) {\n const selectFix = function (event) {\n for (const interaction of scope.interactions) {\n if (interaction.interacting()) {\n interaction.target.checkAndPreventDefault(event);\n }\n }\n };\n\n const onDocIE8 = function onDocIE8 ({ doc, win }, signalName) {\n const eventMethod = signalName.indexOf('listen') === 0\n ? events.add : events.remove;\n\n // For IE's lack of Event#preventDefault\n eventMethod(doc, 'selectstart', selectFix);\n\n if (pointerEvents) {\n eventMethod(doc, 'dblclick', onIE8Dblclick);\n }\n };\n\n scope.signals.on('add-document' , onDocIE8);\n scope.signals.on('remove-document', onDocIE8);\n}\n\nmodule.exports = null;\n","const InteractEvent = require('../InteractEvent');\nconst Interaction = require('../Interaction');\nconst extend = require('../utils/extend');\n\nconst modifiers = {\n names: [],\n\n setOffsets: function (arg) {\n const { interaction, pageCoords: page } = arg;\n const { target, element, startOffset } = interaction;\n const rect = target.getRect(element);\n\n if (rect) {\n startOffset.left = page.x - rect.left;\n startOffset.top = page.y - rect.top;\n\n startOffset.right = rect.right - page.x;\n startOffset.bottom = rect.bottom - page.y;\n\n if (!('width' in rect)) { rect.width = rect.right - rect.left; }\n if (!('height' in rect)) { rect.height = rect.bottom - rect.top ; }\n }\n else {\n startOffset.left = startOffset.top = startOffset.right = startOffset.bottom = 0;\n }\n\n arg.rect = rect;\n arg.interactable = target;\n arg.element = element;\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n\n arg.options = target.options[interaction.prepared.name][modifierName];\n\n if (!arg.options) {\n continue;\n }\n\n interaction.modifierOffsets[modifierName] = modifiers[modifierName].setOffset(arg);\n }\n },\n\n setAll: function (arg) {\n const { interaction, statuses, preEnd, requireEndOnly } = arg;\n const coords = extend({}, arg.pageCoords);\n const result = {\n dx: 0,\n dy: 0,\n changed: false,\n locked: false,\n shouldMove: true,\n };\n\n for (const modifierName of modifiers.names) {\n const modifier = modifiers[modifierName];\n const options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!shouldDo(options, preEnd, requireEndOnly)) { continue; }\n\n arg.status = arg.status = statuses[modifierName];\n arg.options = options;\n arg.offset = arg.interaction.modifierOffsets[modifierName];\n\n modifier.set(arg);\n\n if (arg.status.locked) {\n coords.x += arg.status.dx;\n coords.y += arg.status.dy;\n\n result.dx += arg.status.dx;\n result.dy += arg.status.dy;\n\n result.locked = true;\n }\n }\n\n // a move should be fired if:\n // - there are no modifiers enabled,\n // - no modifiers are \"locked\" i.e. have changed the pointer's coordinates, or\n // - the locked coords have changed since the last pointer move\n result.shouldMove = !arg.status || !result.locked || arg.status.changed;\n\n return result;\n },\n\n resetStatuses: function (statuses) {\n for (const modifierName of modifiers.names) {\n const status = statuses[modifierName] || {};\n\n status.dx = status.dy = 0;\n status.modifiedX = status.modifiedY = NaN;\n status.locked = false;\n status.changed = true;\n\n statuses[modifierName] = status;\n }\n\n return statuses;\n },\n\n start: function ({ interaction }, signalName) {\n const arg = {\n interaction,\n pageCoords: (signalName === 'action-resume' ?\n interaction.curCoords : interaction.startCoords).page,\n startOffset: interaction.startOffset,\n statuses: interaction.modifierStatuses,\n preEnd: false,\n requireEndOnly: false,\n };\n\n modifiers.setOffsets(arg);\n modifiers.resetStatuses(arg.statuses);\n\n arg.pageCoords = extend({}, interaction.startCoords.page);\n interaction.modifierResult = modifiers.setAll(arg);\n },\n};\n\nInteraction.signals.on('new', function (interaction) {\n interaction.startOffset = { left: 0, right: 0, top: 0, bottom: 0 };\n interaction.modifierOffsets = {};\n interaction.modifierStatuses = modifiers.resetStatuses({});\n interaction.modifierResult = null;\n});\n\nInteraction.signals.on('action-start' , modifiers.start);\nInteraction.signals.on('action-resume', modifiers.start);\n\nInteraction.signals.on('before-action-move', function ({ interaction, preEnd, interactingBeforeMove }) {\n const modifierResult = modifiers.setAll({\n interaction,\n preEnd,\n pageCoords: interaction.curCoords.page,\n statuses: interaction.modifierStatuses,\n requireEndOnly: false,\n });\n\n // don't fire an action move if a modifier would keep the event in the same\n // cordinates as before\n if (!modifierResult.shouldMove && interactingBeforeMove) {\n interaction._dontFireMove = true;\n }\n\n interaction.modifierResult = modifierResult;\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n for (let i = 0; i < modifiers.names.length; i++) {\n const options = interaction.target.options[interaction.prepared.name][modifiers.names[i]];\n\n // if the endOnly option is true for any modifier\n if (shouldDo(options, true, true)) {\n // fire a move event at the modified coordinates\n interaction.doMove({ event, preEnd: true });\n break;\n }\n }\n});\n\nInteractEvent.signals.on('set-xy', function (arg) {\n const { iEvent, interaction } = arg;\n const modifierArg = extend({}, arg);\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n modifierArg.options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!modifierArg.options) {\n continue;\n }\n\n const modifier = modifiers[modifierName];\n\n modifierArg.status = interaction.modifierStatuses[modifierName];\n\n iEvent[modifierName] = modifier.modifyCoords(modifierArg);\n }\n});\n\nfunction shouldDo (options, preEnd, requireEndOnly) {\n return (options && options.enabled\n && (preEnd || !options.endOnly)\n && (!requireEndOnly || options.endOnly));\n}\n\nmodule.exports = modifiers;\n","const modifiers = require('./index');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst restrict = {\n defaults: {\n enabled : false,\n endOnly : false,\n restriction: null,\n elementRect: null,\n },\n\n setOffset: function ({ rect, startOffset, options }) {\n const elementRect = options && options.elementRect;\n const offset = {};\n\n if (rect && elementRect) {\n offset.left = startOffset.left - (rect.width * elementRect.left);\n offset.top = startOffset.top - (rect.height * elementRect.top);\n\n offset.right = startOffset.right - (rect.width * (1 - elementRect.right));\n offset.bottom = startOffset.bottom - (rect.height * (1 - elementRect.bottom));\n }\n else {\n offset.left = offset.top = offset.right = offset.bottom = 0;\n }\n\n return offset;\n },\n\n set: function ({ pageCoords, interaction, status, options }) {\n if (!options) { return status; }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n\n const restriction = getRestrictionRect(options.restriction, interaction, page);\n\n if (!restriction) { return status; }\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n const rect = restriction;\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n const offset = interaction.modifierOffsets.restrict;\n\n // object is assumed to have\n // x, y, width, height or\n // left, top, right, bottom\n if ('x' in restriction && 'y' in restriction) {\n modifiedX = Math.max(Math.min(rect.x + rect.width - offset.right , page.x), rect.x + offset.left);\n modifiedY = Math.max(Math.min(rect.y + rect.height - offset.bottom, page.y), rect.y + offset.top );\n }\n else {\n modifiedX = Math.max(Math.min(rect.right - offset.right , page.x), rect.left + offset.left);\n modifiedY = Math.max(Math.min(rect.bottom - offset.bottom, page.y), rect.top + offset.top );\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const elementRect = options && options.elementRect;\n\n if (options && options.enabled\n && !(phase === 'start' && elementRect && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n getRestrictionRect,\n};\n\nfunction getRestrictionRect (value, interaction, page) {\n if (utils.is.function(value)) {\n return utils.resolveRectLike(value, interaction.target, interaction.element, [page.x, page.y, interaction]);\n } else {\n return utils.resolveRectLike(value, interaction.target, interaction.element);\n }\n}\n\nmodifiers.restrict = restrict;\nmodifiers.names.push('restrict');\n\ndefaultOptions.perAction.restrict = restrict.defaults;\n\nmodule.exports = restrict;\n","// This module adds the options.resize.restrictEdges setting which sets min and\n// max for the top, left, bottom and right edges of the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictEdges: {\n// inner: { top: 200, left: 200, right: 400, bottom: 400 },\n// outer: { top: 0, left: 0, right: 600, bottom: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst { getRestrictionRect } = require('./restrict');\n\nconst noInner = { top: +Infinity, left: +Infinity, bottom: -Infinity, right: -Infinity };\nconst noOuter = { top: -Infinity, left: -Infinity, bottom: +Infinity, right: +Infinity };\n\nconst restrictEdges = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n offset: null,\n },\n\n setOffset: function ({ interaction, startOffset, options }) {\n if (!options) {\n return utils.extend({}, startOffset);\n }\n\n const offset = getRestrictionRect(options.offset, interaction, interaction.startCoords.page);\n\n if (offset) {\n return {\n top: startOffset.top + offset.y,\n left: startOffset.left + offset.x,\n bottom: startOffset.bottom + offset.y,\n right: startOffset.right + offset.x,\n };\n }\n\n return startOffset;\n },\n\n set: function ({ pageCoords, interaction, status, offset, options }) {\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n const inner = rectUtils.xywhToTlbr(getRestrictionRect(options.inner, interaction, page)) || noInner;\n const outer = rectUtils.xywhToTlbr(getRestrictionRect(options.outer, interaction, page)) || noOuter;\n\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n if (edges.top) {\n modifiedY = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top);\n }\n else if (edges.bottom) {\n modifiedY = Math.max(Math.min(outer.bottom - offset.bottom, page.y), inner.bottom - offset.bottom);\n }\n if (edges.left) {\n modifiedX = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left);\n }\n else if (edges.right) {\n modifiedX = Math.max(Math.min(outer.right - offset.right, page.x), inner.right - offset.right);\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n if (options && options.enabled\n && !(phase === 'start' && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n noInner,\n noOuter,\n getRestrictionRect,\n};\n\nmodifiers.restrictEdges = restrictEdges;\nmodifiers.names.push('restrictEdges');\n\ndefaultOptions.perAction.restrictEdges = restrictEdges.defaults;\nresize.defaults.restrictEdges = restrictEdges.defaults;\n\nmodule.exports = restrictEdges;\n","// This module adds the options.resize.restrictSize setting which sets min and\n// max width and height for the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictSize: {\n// min: { width: -600, height: -600 },\n// max: { width: 600, height: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst restrictEdges = require('./restrictEdges');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst noMin = { width: -Infinity, height: -Infinity };\nconst noMax = { width: +Infinity, height: +Infinity };\n\nconst restrictSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n },\n\n setOffset: function ({ interaction }) {\n return interaction.startOffset;\n },\n\n set: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const rect = rectUtils.xywhToTlbr(interaction.resizeRects.inverted);\n\n const minSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.min, interaction)) || noMin;\n const maxSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.max, interaction)) || noMax;\n\n arg.options = {\n enabled: options.enabled,\n endOnly: options.endOnly,\n inner: utils.extend({}, restrictEdges.noInner),\n outer: utils.extend({}, restrictEdges.noOuter),\n };\n\n if (edges.top) {\n arg.options.inner.top = rect.bottom - minSize.height;\n arg.options.outer.top = rect.bottom - maxSize.height;\n }\n else if (edges.bottom) {\n arg.options.inner.bottom = rect.top + minSize.height;\n arg.options.outer.bottom = rect.top + maxSize.height;\n }\n if (edges.left) {\n arg.options.inner.left = rect.right - minSize.width;\n arg.options.outer.left = rect.right - maxSize.width;\n }\n else if (edges.right) {\n arg.options.inner.right = rect.left + minSize.width;\n arg.options.outer.right = rect.left + maxSize.width;\n }\n\n restrictEdges.set(arg);\n },\n\n modifyCoords: restrictEdges.modifyCoords,\n};\n\nmodifiers.restrictSize = restrictSize;\nmodifiers.names.push('restrictSize');\n\ndefaultOptions.perAction.restrictSize = restrictSize.defaults;\nresize.defaults.restrictSize = restrictSize.defaults;\n\nmodule.exports = restrictSize;\n","const modifiers = require('./index');\nconst interact = require('../interact');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst snap = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n\n relativePoints: null,\n },\n\n setOffset: function ({ interaction, interactable, element, rect, startOffset, options }) {\n const offsets = [];\n const optionsOrigin = utils.rectToXY(utils.resolveRectLike(options.origin));\n const origin = optionsOrigin || utils.getOriginXY(interactable, element, interaction.prepared.name);\n options = options || interactable.options[interaction.prepared.name].snap || {};\n\n let snapOffset;\n\n if (options.offset === 'startCoords') {\n snapOffset = {\n x: interaction.startCoords.page.x - origin.x,\n y: interaction.startCoords.page.y - origin.y,\n };\n }\n else {\n const offsetRect = utils.resolveRectLike(options.offset, interactable, element, [interaction]);\n\n snapOffset = utils.rectToXY(offsetRect) || { x: 0, y: 0 };\n }\n\n if (rect && options.relativePoints && options.relativePoints.length) {\n for (const { x: relativeX, y: relativeY } of options.relativePoints) {\n offsets.push({\n x: startOffset.left - (rect.width * relativeX) + snapOffset.x,\n y: startOffset.top - (rect.height * relativeY) + snapOffset.y,\n });\n }\n }\n else {\n offsets.push(snapOffset);\n }\n\n return offsets;\n },\n\n set: function ({ interaction, pageCoords, status, options, offset: offsets }) {\n const targets = [];\n let target;\n let page;\n let i;\n\n if (status.useStatusXY) {\n page = { x: status.x, y: status.y };\n }\n else {\n const origin = utils.getOriginXY(interaction.target, interaction.element, interaction.prepared.name);\n\n page = utils.extend({}, pageCoords);\n\n page.x -= origin.x;\n page.y -= origin.y;\n }\n\n status.realX = page.x;\n status.realY = page.y;\n\n let len = options.targets? options.targets.length : 0;\n\n for (const { x: offsetX, y: offsetY } of offsets) {\n const relativeX = page.x - offsetX;\n const relativeY = page.y - offsetY;\n\n for (const snapTarget of options.targets) {\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n targets.push({\n x: utils.is.number(target.x) ? (target.x + offsetX) : relativeX,\n y: utils.is.number(target.y) ? (target.y + offsetY) : relativeY,\n\n range: utils.is.number(target.range)? target.range: options.range,\n });\n }\n }\n\n const closest = {\n target: null,\n inRange: false,\n distance: 0,\n range: 0,\n dx: 0,\n dy: 0,\n };\n\n for (i = 0, len = targets.length; i < len; i++) {\n target = targets[i];\n\n const range = target.range;\n const dx = target.x - page.x;\n const dy = target.y - page.y;\n const distance = utils.hypot(dx, dy);\n let inRange = distance <= range;\n\n // Infinite targets count as being out of range\n // compared to non infinite ones that are in range\n if (range === Infinity && closest.inRange && closest.range !== Infinity) {\n inRange = false;\n }\n\n if (!closest.target || (inRange\n // is the closest target in range?\n ? (closest.inRange && range !== Infinity\n // the pointer is relatively deeper in this target\n ? distance / range < closest.distance / closest.range\n // this target has Infinite range and the closest doesn't\n : (range === Infinity && closest.range !== Infinity)\n // OR this target is closer that the previous closest\n || distance < closest.distance)\n // The other is not in range and the pointer is closer to this target\n : (!closest.inRange && distance < closest.distance))) {\n\n closest.target = target;\n closest.distance = distance;\n closest.range = range;\n closest.inRange = inRange;\n closest.dx = dx;\n closest.dy = dy;\n\n status.range = range;\n }\n }\n\n let snapChanged;\n\n if (closest.target) {\n snapChanged = (status.modifiedX !== closest.target.x || status.modifiedY !== closest.target.y);\n\n status.modifiedX = closest.target.x;\n status.modifiedY = closest.target.y;\n }\n else {\n snapChanged = true;\n\n status.modifiedX = NaN;\n status.modifiedY = NaN;\n }\n\n status.dx = closest.dx;\n status.dy = closest.dy;\n\n status.changed = (snapChanged || (closest.inRange && !status.locked));\n status.locked = closest.inRange;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const relativePoints = options && options.relativePoints;\n\n if (options && options.enabled\n && !(phase === 'start' && relativePoints && relativePoints.length)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n }\n\n return {\n range : status.range,\n locked : status.locked,\n x : status.modifiedX,\n y : status.modifiedY,\n realX : status.realX,\n realY : status.realY,\n dx : status.dx,\n dy : status.dy,\n };\n }\n },\n};\n\ninteract.createSnapGrid = function (grid) {\n return function (x, y) {\n const limits = grid.limits || {\n left : -Infinity,\n right : Infinity,\n top : -Infinity,\n bottom: Infinity,\n };\n let offsetX = 0;\n let offsetY = 0;\n\n if (utils.is.object(grid.offset)) {\n offsetX = grid.offset.x;\n offsetY = grid.offset.y;\n }\n\n const gridx = Math.round((x - offsetX) / grid.x);\n const gridy = Math.round((y - offsetY) / grid.y);\n\n const newX = Math.max(limits.left, Math.min(limits.right , gridx * grid.x + offsetX));\n const newY = Math.max(limits.top , Math.min(limits.bottom, gridy * grid.y + offsetY));\n\n return {\n x: newX,\n y: newY,\n range: grid.range,\n };\n };\n};\n\nmodifiers.snap = snap;\nmodifiers.names.push('snap');\n\ndefaultOptions.perAction.snap = snap.defaults;\n\nmodule.exports = snap;\n","// This module allows snapping of the size of targets during resize\n// interactions.\n\nconst modifiers = require('./index');\nconst snap = require('./snap');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\nconst utils = require('../utils/');\n\nconst snapSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n },\n\n setOffset: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.edges;\n\n if (!edges) { return; }\n\n arg.options = {\n relativePoints: [{\n x: edges.left? 0 : 1,\n y: edges.top ? 0 : 1,\n }],\n origin: { x: 0, y: 0 },\n offset: 'self',\n range: options.range,\n };\n\n const offsets = snap.setOffset(arg);\n arg.options = options;\n\n return offsets;\n },\n\n set: function (arg) {\n const { interaction, options, offset, pageCoords } = arg;\n const page = utils.extend({}, pageCoords);\n const relativeX = page.x - offset[0].x;\n const relativeY = page.y - offset[0].y;\n\n arg.options = utils.extend({}, options);\n arg.options.targets = [];\n\n for (const snapTarget of options.targets) {\n let target;\n\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n if ('width' in target && 'height' in target) {\n target.x = target.width;\n target.y = target.height;\n }\n\n arg.options.targets.push(target);\n }\n\n snap.set(arg);\n },\n\n modifyCoords: function (arg) {\n const { options } = arg;\n\n arg.options = utils.extend({}, options);\n arg.options.enabled = options.enabled;\n arg.options.relativePoints = [null];\n\n snap.modifyCoords(arg);\n },\n};\n\nmodifiers.snapSize = snapSize;\nmodifiers.names.push('snapSize');\n\ndefaultOptions.perAction.snapSize = snapSize.defaults;\nresize.defaults.snapSize = snapSize.defaults;\n\nmodule.exports = snapSize;\n","const pointerUtils = require('../utils/pointerUtils');\n\nmodule.exports = class PointerEvent {\n constructor (type, pointer, event, eventTarget, interaction) {\n pointerUtils.pointerExtend(this, event);\n\n if (event !== pointer) {\n pointerUtils.pointerExtend(this, pointer);\n }\n\n this.interaction = interaction;\n\n this.timeStamp = new Date().getTime();\n this.originalEvent = event;\n this.type = type;\n this.pointerId = pointerUtils.getPointerId(pointer);\n this.pointerType = pointerUtils.getPointerType(pointer, interaction);\n this.target = eventTarget;\n this.currentTarget = null;\n\n if (type === 'tap') {\n const pointerIndex = interaction.getPointerIndex(pointer);\n this.dt = this.timeStamp - interaction.downTimes[pointerIndex];\n\n const interval = this.timeStamp - interaction.tapTime;\n\n this.double = !!(interaction.prevTap\n && interaction.prevTap.type !== 'doubletap'\n && interaction.prevTap.target === this.target\n && interval < 500);\n }\n else if (type === 'doubletap') {\n this.dt = pointer.timeStamp - interaction.tapTime;\n }\n }\n\n subtractOrigin ({ x: originX, y: originY }) {\n this.pageX -= originX;\n this.pageY -= originY;\n this.clientX -= originX;\n this.clientY -= originY;\n\n return this;\n }\n\n addOrigin ({ x: originX, y: originY }) {\n this.pageX += originX;\n this.pageY += originY;\n this.clientX += originX;\n this.clientY += originY;\n\n return this;\n }\n\n preventDefault () {\n this.originalEvent.preventDefault();\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n};\n","const PointerEvent = require('./PointerEvent');\nconst Interaction = require('../Interaction');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst defaults = require('../defaultOptions');\nconst signals = require('../utils/Signals').new();\nconst { filter } = require('../utils/arr');\n\nconst simpleSignals = [ 'down', 'up', 'cancel' ];\nconst simpleEvents = [ 'down', 'up', 'cancel' ];\n\nconst pointerEvents = {\n PointerEvent,\n fire,\n collectEventTargets,\n signals,\n defaults: {\n holdDuration: 600,\n ignoreFrom : null,\n allowFrom : null,\n origin : { x: 0, y: 0 },\n },\n types: [\n 'down',\n 'move',\n 'up',\n 'cancel',\n 'tap',\n 'doubletap',\n 'hold',\n ],\n};\n\nfunction fire (arg) {\n const {\n interaction, pointer, event, eventTarget,\n type = arg.pointerEvent.type,\n targets = collectEventTargets(arg),\n pointerEvent = new PointerEvent(type, pointer, event, eventTarget, interaction),\n } = arg;\n\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n targets,\n type,\n pointerEvent,\n };\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n\n for (const prop in target.props || {}) {\n pointerEvent[prop] = target.props[prop];\n }\n\n const origin = utils.getOriginXY(target.eventable, target.element);\n\n pointerEvent.subtractOrigin(origin);\n pointerEvent.eventable = target.eventable;\n pointerEvent.currentTarget = target.element;\n\n target.eventable.fire(pointerEvent);\n\n pointerEvent.addOrigin(origin);\n\n if (pointerEvent.immediatePropagationStopped\n || (pointerEvent.propagationStopped\n && (i + 1) < targets.length && targets[i + 1].element !== pointerEvent.currentTarget)) {\n break;\n }\n }\n\n signals.fire('fired', signalArg);\n\n if (type === 'tap') {\n // if pointerEvent should make a double tap, create and fire a doubletap\n // PointerEvent and use that as the prevTap\n const prevTap = pointerEvent.double\n ? fire({\n interaction, pointer, event, eventTarget,\n type: 'doubletap',\n })\n : pointerEvent;\n\n interaction.prevTap = prevTap;\n interaction.tapTime = prevTap.timeStamp;\n }\n\n return pointerEvent;\n}\n\nfunction collectEventTargets ({ interaction, pointer, event, eventTarget, type }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n // do not fire a tap event if the pointer was moved before being lifted\n if (type === 'tap' && (interaction.pointerWasMoved\n // or if the pointerup target is different to the pointerdown target\n || !(interaction.downTargets[pointerIndex] && interaction.downTargets[pointerIndex] === eventTarget))) {\n return [];\n }\n\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n path,\n targets: [],\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (type === 'hold') {\n signalArg.targets = filter(signalArg.targets, target =>\n target.eventable.options.holdDuration === interaction.holdTimers[pointerIndex].duration);\n }\n\n return signalArg.targets;\n}\n\nInteraction.signals.on('update-pointer-down', function ({ interaction, pointerIndex }) {\n interaction.holdTimers[pointerIndex] = { duration: Infinity, timeout: null };\n});\n\nInteraction.signals.on('remove-pointer', function ({ interaction, pointerIndex }) {\n interaction.holdTimers.splice(pointerIndex, 1);\n});\n\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget, duplicateMove }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n if (!duplicateMove && (!interaction.pointerIsDown || interaction.pointerWasMoved)) {\n if (interaction.pointerIsDown) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n\n fire({\n interaction, pointer, event, eventTarget,\n type: 'move',\n });\n }\n});\n\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget, pointerIndex }) {\n // copy event to be used in timeout for IE8\n const eventCopy = browser.isIE8? utils.extend({}, event) : event;\n\n const timer = interaction.holdTimers[pointerIndex];\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'hold',\n targets: [],\n path,\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (!signalArg.targets.length) { return; }\n\n let minDuration = Infinity;\n\n for (let i = 0; i < signalArg.targets.length; i++) {\n const target = signalArg.targets[i];\n const holdDuration = target.eventable.options.holdDuration;\n\n if (holdDuration < minDuration) {\n minDuration = holdDuration;\n }\n }\n\n timer.duration = minDuration;\n timer.timeout = setTimeout(function () {\n fire({\n interaction, eventCopy, eventTarget,\n pointer: browser.isIE8? eventCopy : pointer,\n type: 'hold',\n });\n }, minDuration);\n});\n\nInteraction.signals.on('up', ({ interaction, pointer, event, eventTarget }) => {\n if (!interaction.pointerWasMoved) {\n fire({ interaction, eventTarget, pointer, event, type: 'tap' });\n }\n});\n\n['up', 'cancel'].forEach(function (signalName) {\n Interaction.signals.on(signalName, function ({ interaction, pointerIndex }) {\n if (interaction.holdTimers[pointerIndex]) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n });\n});\n\nfunction createSignalListener (type) {\n return function ({ interaction, pointer, event, eventTarget }) {\n fire({ interaction, eventTarget, pointer, event, type });\n };\n}\n\nfor (let i = 0; i < simpleSignals.length; i++) {\n Interaction.signals.on(simpleSignals[i], createSignalListener(simpleEvents[i]));\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.prevTap = null; // the most recent tap event on this interaction\n interaction.tapTime = 0; // time of the most recent tap event\n interaction.holdTimers = []; // [{ duration, timeout }]\n});\n\ndefaults.pointerEvents = pointerEvents.defaults;\nmodule.exports = pointerEvents;\n","const pointerEvents = require('./base');\nconst Interaction = require('../Interaction');\n\npointerEvents.signals.on('new', onNew);\npointerEvents.signals.on('fired', onFired);\n\nfor (const signal of ['move', 'up', 'cancel', 'endall']) {\n Interaction.signals.on(signal, endHoldRepeat);\n}\n\nfunction onNew ({ pointerEvent }) {\n if (pointerEvent.type !== 'hold') { return; }\n\n pointerEvent.count = (pointerEvent.count || 0) + 1;\n}\n\nfunction onFired ({ interaction, pointerEvent, eventTarget, targets }) {\n if (pointerEvent.type !== 'hold' || !targets.length) { return; }\n\n // get the repeat interval from the first eventable\n const interval = targets[0].eventable.options.holdRepeatInterval;\n\n // don't repeat if the interval is 0 or less\n if (interval <= 0) { return; }\n\n // set a timeout to fire the holdrepeat event\n interaction.holdIntervalHandle = setTimeout(function () {\n pointerEvents.fire({\n interaction,\n eventTarget,\n type: 'hold',\n pointer: pointerEvent,\n event: pointerEvent,\n });\n }, interval);\n}\n\nfunction endHoldRepeat ({ interaction }) {\n // set the interaction's holdStopTime property\n // to stop further holdRepeat events\n if (interaction.holdIntervalHandle) {\n clearInterval(interaction.holdIntervalHandle);\n interaction.holdIntervalHandle = null;\n }\n}\n\n// don't repeat by default\npointerEvents.defaults.holdRepeatInterval = 0;\npointerEvents.types.push('holdrepeat');\n\nmodule.exports = {\n onNew,\n onFired,\n endHoldRepeat,\n};\n","const pointerEvents = require('./base');\nconst Interactable = require('../Interactable');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\nconst scope = require('../scope');\nconst extend = require('../utils/extend');\nconst { merge } = require('../utils/arr');\n\npointerEvents.signals.on('collect-targets', function ({ targets, element, type, eventTarget }) {\n function collectSelectors (interactable, selector, context) {\n const els = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && is.element(element)\n && domUtils.matchesSelector(element, selector, els)\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n const interactable = scope.interactables.get(element);\n\n if (interactable) {\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n scope.interactables.forEachSelector(collectSelectors, element);\n});\n\nInteractable.signals.on('new', function ({ interactable }) {\n interactable.events.getRect = function (element) {\n return interactable.getRect(element);\n };\n});\n\nInteractable.signals.on('set', function ({ interactable, options }) {\n extend(interactable.events.options, pointerEvents.defaults);\n extend(interactable.events.options, options);\n});\n\nmerge(Interactable.eventTypes, pointerEvents.types);\n\nInteractable.prototype.pointerEvents = function (options) {\n extend(this.events.options, options);\n\n return this;\n};\n\nconst __backCompatOption = Interactable.prototype._backCompatOption;\n\nInteractable.prototype._backCompatOption = function (optionName, newValue) {\n const ret = __backCompatOption.call(this, optionName, newValue);\n\n if (ret === this) {\n this.events.options[optionName] = newValue;\n }\n\n return ret;\n};\n\nInteractable.settingsMethods.push('pointerEvents');\n","const utils = require('./utils');\nconst events = require('./utils/events');\nconst signals = require('./utils/Signals').new();\n\nconst scope = {\n signals,\n events,\n utils,\n\n // main document\n document: require('./utils/domObjects').document,\n // all documents being listened to\n documents: [],\n\n addDocument: function (doc, win) {\n // do nothing if document is already known\n if (utils.contains(scope.documents, doc)) { return false; }\n\n win = win || scope.getWindow(doc);\n\n scope.documents.push(doc);\n events.documents.push(doc);\n\n // don't add an unload event for the main document\n // so that the page may be cached in browser history\n if (doc !== scope.document) {\n events.add(win, 'unload', scope.onWindowUnload);\n }\n\n signals.fire('add-document', { doc, win });\n },\n\n removeDocument: function (doc, win) {\n const index = utils.indexOf(scope.documents, doc);\n\n win = win || scope.getWindow(doc);\n\n events.remove(win, 'unload', scope.onWindowUnload);\n\n scope.documents.splice(index, 1);\n events.documents.splice(index, 1);\n\n signals.fire('remove-document', { win, doc });\n },\n\n onWindowUnload: function () {\n scope.removeDocument(this.document, this);\n },\n};\n\nmodule.exports = scope;\n","const { indexOf } = require('./arr');\n\nclass Signals {\n constructor () {\n this.listeners = {\n // signalName: [listeners],\n };\n }\n\n on (name, listener) {\n if (!this.listeners[name]) {\n this.listeners[name] = [listener];\n return;\n }\n\n this.listeners[name].push(listener);\n }\n\n off (name, listener) {\n if (!this.listeners[name]) { return; }\n\n const index = indexOf(this.listeners[name], listener);\n\n if (index !== -1) {\n this.listeners[name].splice(index, 1);\n }\n }\n\n fire (name, arg) {\n const targetListeners = this.listeners[name];\n\n if (!targetListeners) { return; }\n\n for (let i = 0; i < targetListeners.length; i++) {\n if (targetListeners[i](arg, name) === false) {\n return;\n }\n }\n }\n}\n\nSignals.new = function () {\n return new Signals();\n};\n\nmodule.exports = Signals;\n","function indexOf (array, target) {\n for (let i = 0, len = array.length; i < len; i++) {\n if (array[i] === target) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction contains (array, target) {\n return indexOf(array, target) !== -1;\n}\n\nfunction merge (target, source) {\n for (let i = 0; i < source.length; i++) {\n target.push(source[i]);\n }\n\n return target;\n}\n\nfunction filter (array, test) {\n const result = [];\n\n for (let i = 0; i < array.length; i++) {\n if (test(array[i])) {\n result.push(array[i]);\n }\n }\n\n return result;\n}\n\nmodule.exports = {\n indexOf,\n contains,\n merge,\n filter,\n};\n","const { window } = require('./window');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst Element = domObjects.Element;\nconst navigator = window.navigator;\n\nconst browser = {\n // Does the browser support touch input?\n supportsTouch: !!(('ontouchstart' in window) || is.function(window.DocumentTouch)\n && domObjects.document instanceof window.DocumentTouch),\n\n // Does the browser support PointerEvents\n supportsPointerEvent: !!domObjects.PointerEvent,\n\n isIE8: ('attachEvent' in window) && !('addEventListener' in window),\n\n // Opera Mobile must be handled differently\n isOperaMobile: (navigator.appName === 'Opera'\n && browser.supportsTouch\n && navigator.userAgent.match('Presto')),\n\n // scrolling doesn't change the result of getClientRects on iOS 7\n isIOS7: (/iP(hone|od|ad)/.test(navigator.platform)\n && /OS 7[^\\d]/.test(navigator.appVersion)),\n\n isIe9OrOlder: /MSIE (8|9)/.test(navigator.userAgent),\n\n // prefix matchesSelector\n prefixedMatchesSelector: 'matches' in Element.prototype\n ? 'matches': 'webkitMatchesSelector' in Element.prototype\n ? 'webkitMatchesSelector': 'mozMatchesSelector' in Element.prototype\n ? 'mozMatchesSelector': 'oMatchesSelector' in Element.prototype\n ? 'oMatchesSelector': 'msMatchesSelector',\n\n useMatchesSelectorPolyfill: false,\n\n pEventTypes: (domObjects.PointerEvent\n ? (domObjects.PointerEvent === window.MSPointerEvent\n ? {\n up: 'MSPointerUp',\n down: 'MSPointerDown',\n over: 'mouseover',\n out: 'mouseout',\n move: 'MSPointerMove',\n cancel: 'MSPointerCancel',\n }\n : {\n up: 'pointerup',\n down: 'pointerdown',\n over: 'pointerover',\n out: 'pointerout',\n move: 'pointermove',\n cancel: 'pointercancel',\n })\n : null),\n\n // because Webkit and Opera still use 'mousewheel' event type\n wheelEvent: 'onmousewheel' in domObjects.document? 'mousewheel': 'wheel',\n\n};\n\nbrowser.useMatchesSelectorPolyfill = !is.function(Element.prototype[browser.prefixedMatchesSelector]);\n\nmodule.exports = browser;\n","const domObjects = {};\nconst win = require('./window').window;\n\nfunction blank () {}\n\ndomObjects.document = win.document;\ndomObjects.DocumentFragment = win.DocumentFragment || blank;\ndomObjects.SVGElement = win.SVGElement || blank;\ndomObjects.SVGSVGElement = win.SVGSVGElement || blank;\ndomObjects.SVGElementInstance = win.SVGElementInstance || blank;\ndomObjects.Element = win.Element || blank;\ndomObjects.HTMLElement = win.HTMLElement || domObjects.Element;\n\ndomObjects.Event = win.Event;\ndomObjects.Touch = win.Touch || blank;\ndomObjects.PointerEvent = (win.PointerEvent || win.MSPointerEvent);\n\nmodule.exports = domObjects;\n","const win = require('./window');\nconst browser = require('./browser');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst domUtils = {\n nodeContains: function (parent, child) {\n while (child) {\n if (child === parent) {\n return true;\n }\n\n child = child.parentNode;\n }\n\n return false;\n },\n\n closest: function (element, selector) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) { return element; }\n\n element = domUtils.parentNode(element);\n }\n\n return null;\n },\n\n parentNode: function (node) {\n let parent = node.parentNode;\n\n if (is.docFrag(parent)) {\n // skip past #shado-root fragments\n while ((parent = parent.host) && is.docFrag(parent)) {\n continue;\n }\n\n return parent;\n }\n\n return parent;\n },\n\n // taken from http://tanalin.com/en/blog/2012/12/matches-selector-ie8/ and modified\n matchesSelectorPolyfill: browser.useMatchesSelectorPolyfill\n ? function (element, selector, elems) {\n elems = elems || element.parentNode.querySelectorAll(selector);\n\n for (let i = 0, len = elems.length; i < len; i++) {\n if (elems[i] === element) {\n return true;\n }\n }\n\n return false;\n }\n : null,\n\n matchesSelector: function (element, selector, nodeList) {\n if (browser.useMatchesSelectorPolyfill) {\n return domUtils.matchesSelectorPolyfill(element, selector, nodeList);\n }\n\n // remove /deep/ from selectors if shadowDOM polyfill is used\n if (win.window !== win.realWindow) {\n selector = selector.replace(/\\/deep\\//g, ' ');\n }\n\n return element[browser.prefixedMatchesSelector](selector);\n },\n\n // Test for the element that's \"above\" all other qualifiers\n indexOfDeepestElement: function (elements) {\n let deepestZoneParents = [];\n let dropzoneParents = [];\n let dropzone;\n let deepestZone = elements[0];\n let index = deepestZone? 0: -1;\n let parent;\n let child;\n let i;\n let n;\n\n for (i = 1; i < elements.length; i++) {\n dropzone = elements[i];\n\n // an element might belong to multiple selector dropzones\n if (!dropzone || dropzone === deepestZone) {\n continue;\n }\n\n if (!deepestZone) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n // check if the deepest or current are document.documentElement or document.rootElement\n // - if the current dropzone is, do nothing and continue\n if (dropzone.parentNode === dropzone.ownerDocument) {\n continue;\n }\n // - if deepest is, update with the current dropzone and continue to next\n else if (deepestZone.parentNode === dropzone.ownerDocument) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n if (!deepestZoneParents.length) {\n parent = deepestZone;\n while (parent.parentNode && parent.parentNode !== parent.ownerDocument) {\n deepestZoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n }\n\n // if this element is an svg element and the current deepest is\n // an HTMLElement\n if (deepestZone instanceof domObjects.HTMLElement\n && dropzone instanceof domObjects.SVGElement\n && !(dropzone instanceof domObjects.SVGSVGElement)) {\n\n if (dropzone === deepestZone.parentNode) {\n continue;\n }\n\n parent = dropzone.ownerSVGElement;\n }\n else {\n parent = dropzone;\n }\n\n dropzoneParents = [];\n\n while (parent.parentNode !== parent.ownerDocument) {\n dropzoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n\n n = 0;\n\n // get (position of last common ancestor) + 1\n while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) {\n n++;\n }\n\n const parents = [\n dropzoneParents[n - 1],\n dropzoneParents[n],\n deepestZoneParents[n],\n ];\n\n child = parents[0].lastChild;\n\n while (child) {\n if (child === parents[1]) {\n deepestZone = dropzone;\n index = i;\n deepestZoneParents = [];\n\n break;\n }\n else if (child === parents[2]) {\n break;\n }\n\n child = child.previousSibling;\n }\n }\n\n return index;\n },\n\n matchesUpTo: function (element, selector, limit) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) {\n return true;\n }\n\n element = domUtils.parentNode(element);\n\n if (element === limit) {\n return domUtils.matchesSelector(element, selector);\n }\n }\n\n return false;\n },\n\n getActualElement: function (element) {\n return (element instanceof domObjects.SVGElementInstance\n ? element.correspondingUseElement\n : element);\n },\n\n getScrollXY: function (relevantWindow) {\n relevantWindow = relevantWindow || win.window;\n return {\n x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft,\n y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop,\n };\n },\n\n getElementClientRect: function (element) {\n const clientRect = (element instanceof domObjects.SVGElement\n ? element.getBoundingClientRect()\n : element.getClientRects()[0]);\n\n return clientRect && {\n left : clientRect.left,\n right : clientRect.right,\n top : clientRect.top,\n bottom: clientRect.bottom,\n width : clientRect.width || clientRect.right - clientRect.left,\n height: clientRect.height || clientRect.bottom - clientRect.top,\n };\n },\n\n getElementRect: function (element) {\n const clientRect = domUtils.getElementClientRect(element);\n\n if (!browser.isIOS7 && clientRect) {\n const scroll = domUtils.getScrollXY(win.getWindow(element));\n\n clientRect.left += scroll.x;\n clientRect.right += scroll.x;\n clientRect.top += scroll.y;\n clientRect.bottom += scroll.y;\n }\n\n return clientRect;\n },\n\n getPath: function (element) {\n const path = [];\n\n while (element) {\n path.push(element);\n element = domUtils.parentNode(element);\n }\n\n return path;\n },\n\n trySelector: value => {\n if (!is.string(value)) { return false; }\n\n // an exception will be raised if it is invalid\n domObjects.document.querySelector(value);\n return true;\n },\n};\n\nmodule.exports = domUtils;\n","const is = require('./is');\nconst domUtils = require('./domUtils');\nconst pExtend = require('./pointerExtend');\n\nconst { window, getWindow } = require('./window');\nconst { indexOf, contains } = require('./arr');\n\nconst useAttachEvent = ('attachEvent' in window) && !('addEventListener' in window);\nconst addEvent = useAttachEvent? 'attachEvent': 'addEventListener';\nconst removeEvent = useAttachEvent? 'detachEvent': 'removeEventListener';\nconst on = useAttachEvent? 'on': '';\n\nconst elements = [];\nconst targets = [];\nconst attachedListeners = [];\n\n// {\n// type: {\n// selectors: ['selector', ...],\n// contexts : [document, ...],\n// listeners: [[listener, capture, passive], ...]\n// }\n// }\nconst delegatedEvents = {};\n\nconst documents = [];\n\nconst supportsOptions = !useAttachEvent && (() => {\n let supported = false;\n\n window.document.createElement('div').addEventListener('test', null, {\n get capture () { supported = true; },\n });\n\n return supported;\n})();\n\nfunction add (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n let elementIndex = indexOf(elements, element);\n let target = targets[elementIndex];\n\n if (!target) {\n target = {\n events: {},\n typeCount: 0,\n };\n\n elementIndex = elements.push(element) - 1;\n targets.push(target);\n\n attachedListeners.push(useAttachEvent\n ? {\n supplied: [],\n wrapped : [],\n useCount: [],\n }\n : null);\n }\n\n if (!target.events[type]) {\n target.events[type] = [];\n target.typeCount++;\n }\n\n if (!contains(target.events[type], listener)) {\n let ret;\n\n if (useAttachEvent) {\n const { supplied, wrapped, useCount } = attachedListeners[elementIndex];\n const listenerIndex = indexOf(supplied, listener);\n\n const wrappedListener = wrapped[listenerIndex] || function (event) {\n if (!event.immediatePropagationStopped) {\n event.target = event.srcElement;\n event.currentTarget = element;\n\n event.preventDefault = event.preventDefault || preventDef;\n event.stopPropagation = event.stopPropagation || stopProp;\n event.stopImmediatePropagation = event.stopImmediatePropagation || stopImmProp;\n\n if (/mouse|click/.test(event.type)) {\n event.pageX = event.clientX + getWindow(element).document.documentElement.scrollLeft;\n event.pageY = event.clientY + getWindow(element).document.documentElement.scrollTop;\n }\n\n listener(event);\n }\n };\n\n ret = element[addEvent](on + type, wrappedListener, !!options.capture);\n\n if (listenerIndex === -1) {\n supplied.push(listener);\n wrapped.push(wrappedListener);\n useCount.push(1);\n }\n else {\n useCount[listenerIndex]++;\n }\n }\n else {\n ret = element[addEvent](type, listener, supportsOptions? options : !!options.capture);\n }\n target.events[type].push(listener);\n\n return ret;\n }\n}\n\nfunction remove (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const elementIndex = indexOf(elements, element);\n const target = targets[elementIndex];\n\n if (!target || !target.events) {\n return;\n }\n\n let wrappedListener = listener;\n let listeners;\n let listenerIndex;\n\n if (useAttachEvent) {\n listeners = attachedListeners[elementIndex];\n listenerIndex = indexOf(listeners.supplied, listener);\n wrappedListener = listeners.wrapped[listenerIndex];\n }\n\n if (type === 'all') {\n for (type in target.events) {\n if (target.events.hasOwnProperty(type)) {\n remove(element, type, 'all');\n }\n }\n return;\n }\n\n if (target.events[type]) {\n const len = target.events[type].length;\n\n if (listener === 'all') {\n for (let i = 0; i < len; i++) {\n remove(element, type, target.events[type][i], options);\n }\n return;\n }\n else {\n for (let i = 0; i < len; i++) {\n if (target.events[type][i] === listener) {\n element[removeEvent](on + type, wrappedListener, supportsOptions? options : !!options.capture);\n target.events[type].splice(i, 1);\n\n if (useAttachEvent && listeners) {\n listeners.useCount[listenerIndex]--;\n if (listeners.useCount[listenerIndex] === 0) {\n listeners.supplied.splice(listenerIndex, 1);\n listeners.wrapped.splice(listenerIndex, 1);\n listeners.useCount.splice(listenerIndex, 1);\n }\n }\n\n break;\n }\n }\n }\n\n if (target.events[type] && target.events[type].length === 0) {\n target.events[type] = null;\n target.typeCount--;\n }\n }\n\n if (!target.typeCount) {\n targets.splice(elementIndex, 1);\n elements.splice(elementIndex, 1);\n attachedListeners.splice(elementIndex, 1);\n }\n}\n\nfunction addDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n if (!delegatedEvents[type]) {\n delegatedEvents[type] = {\n selectors: [],\n contexts : [],\n listeners: [],\n };\n\n // add delegate listener functions\n for (let i = 0; i < documents.length; i++) {\n add(documents[i], type, delegateListener);\n add(documents[i], type, delegateUseCapture, true);\n }\n }\n\n const delegated = delegatedEvents[type];\n let index;\n\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n break;\n }\n }\n\n if (index === -1) {\n index = delegated.selectors.length;\n\n delegated.selectors.push(selector);\n delegated.contexts .push(context);\n delegated.listeners.push([]);\n }\n\n // keep listener and capture and passive flags\n delegated.listeners[index].push([listener, !!options.capture, options.passive]);\n}\n\nfunction removeDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const delegated = delegatedEvents[type];\n let matchFound = false;\n let index;\n\n if (!delegated) { return; }\n\n // count from last index of delegated to 0\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n // look for matching selector and context Node\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n\n const listeners = delegated.listeners[index];\n\n // each item of the listeners array is an array: [function, capture, passive]\n for (let i = listeners.length - 1; i >= 0; i--) {\n const [fn, capture, passive] = listeners[i];\n\n // check if the listener functions and capture and passive flags match\n if (fn === listener && capture === !!options.capture && passive === options.passive) {\n // remove the listener from the array of listeners\n listeners.splice(i, 1);\n\n // if all listeners for this interactable have been removed\n // remove the interactable from the delegated arrays\n if (!listeners.length) {\n delegated.selectors.splice(index, 1);\n delegated.contexts .splice(index, 1);\n delegated.listeners.splice(index, 1);\n\n // remove delegate function from context\n remove(context, type, delegateListener);\n remove(context, type, delegateUseCapture, true);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegatedEvents[type] = null;\n }\n }\n\n // only remove one listener\n matchFound = true;\n break;\n }\n }\n\n if (matchFound) { break; }\n }\n }\n}\n\n// bound to the interactable context when a DOM event\n// listener is added to a selector interactable\nfunction delegateListener (event, optionalArg) {\n const options = getOptions(optionalArg);\n const fakeEvent = {};\n const delegated = delegatedEvents[event.type];\n const eventTarget = (domUtils.getActualElement(event.path\n ? event.path[0]\n : event.target));\n let element = eventTarget;\n\n // duplicate the event so that currentTarget can be changed\n pExtend(fakeEvent, event);\n\n fakeEvent.originalEvent = event;\n fakeEvent.preventDefault = preventOriginalDefault;\n\n // climb up document tree looking for selector matches\n while (is.element(element)) {\n for (let i = 0; i < delegated.selectors.length; i++) {\n const selector = delegated.selectors[i];\n const context = delegated.contexts[i];\n\n if (domUtils.matchesSelector(element, selector)\n && domUtils.nodeContains(context, eventTarget)\n && domUtils.nodeContains(context, element)) {\n\n const listeners = delegated.listeners[i];\n\n fakeEvent.currentTarget = element;\n\n for (let j = 0; j < listeners.length; j++) {\n const [fn, capture, passive] = listeners[j];\n\n if (capture === !!options.capture && passive === options.passive) {\n fn(fakeEvent);\n }\n }\n }\n }\n\n element = domUtils.parentNode(element);\n }\n}\n\nfunction delegateUseCapture (event) {\n return delegateListener.call(this, event, true);\n}\n\nfunction preventDef () {\n this.returnValue = false;\n}\n\nfunction preventOriginalDefault () {\n this.originalEvent.preventDefault();\n}\n\nfunction stopProp () {\n this.cancelBubble = true;\n}\n\nfunction stopImmProp () {\n this.cancelBubble = true;\n this.immediatePropagationStopped = true;\n}\n\nfunction getOptions (param) {\n return is.object(param)? param : { capture: param };\n}\n\nmodule.exports = {\n add,\n remove,\n\n addDelegate,\n removeDelegate,\n\n delegateListener,\n delegateUseCapture,\n delegatedEvents,\n documents,\n\n useAttachEvent,\n supportsOptions,\n\n _elements: elements,\n _targets: targets,\n _attachedListeners: attachedListeners,\n};\n","module.exports = function extend (dest, source) {\n for (const prop in source) {\n dest[prop] = source[prop];\n }\n return dest;\n};\n","const {\n resolveRectLike,\n rectToXY,\n} = require('./rect');\n\nmodule.exports = function (target, element, action) {\n const actionOptions = target.options[action];\n const actionOrigin = actionOptions && actionOptions.origin;\n const origin = actionOrigin || target.options.origin;\n\n const originRect = resolveRectLike(origin, target, element, [target && element]);\n\n return rectToXY(originRect) || { x: 0, y: 0 };\n};\n","module.exports = (x, y) => Math.sqrt(x * x + y * y);\n","const extend = require('./extend');\nconst win = require('./window');\n\nconst utils = {\n warnOnce: function (method, message) {\n let warned = false;\n\n return function () {\n if (!warned) {\n win.window.console.warn(message);\n warned = true;\n }\n\n return method.apply(this, arguments);\n };\n },\n\n // http://stackoverflow.com/a/5634528/2280888\n _getQBezierValue: function (t, p1, p2, p3) {\n const iT = 1 - t;\n return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3;\n },\n\n getQuadraticCurvePoint: function (startX, startY, cpX, cpY, endX, endY, position) {\n return {\n x: utils._getQBezierValue(position, startX, cpX, endX),\n y: utils._getQBezierValue(position, startY, cpY, endY),\n };\n },\n\n // http://gizma.com/easing/\n easeOutQuad: function (t, b, c, d) {\n t /= d;\n return -c * t*(t-2) + b;\n },\n\n copyAction: function (dest, src) {\n dest.name = src.name;\n dest.axis = src.axis;\n dest.edges = src.edges;\n\n return dest;\n },\n\n is : require('./is'),\n extend : extend,\n hypot : require('./hypot'),\n getOriginXY: require('./getOriginXY'),\n};\n\nextend(utils, require('./arr'));\nextend(utils, require('./domUtils'));\nextend(utils, require('./pointerUtils'));\nextend(utils, require('./rect'));\n\nmodule.exports = utils;\n","const scope = require('../scope');\nconst utils = require('./index');\nconst browser = require('./browser');\n\nconst finder = {\n methodOrder: [ 'simulationResume', 'mouse', 'hasPointer', 'idle' ],\n\n search: function (pointer, eventType, eventTarget) {\n const mouseEvent = (/mouse/i.test(pointer.pointerType || eventType)\n // MSPointerEvent.MSPOINTER_TYPE_MOUSE\n || pointer.pointerType === 4);\n const pointerId = utils.getPointerId(pointer);\n const details = { pointer, pointerId, mouseEvent, eventType, eventTarget };\n\n for (const method of finder.methodOrder) {\n const interaction = finder[method](details);\n\n if (interaction) {\n return interaction;\n }\n }\n },\n\n // try to resume simulation with a new pointer\n simulationResume: function ({ mouseEvent, eventType, eventTarget }) {\n if (!/down|start/i.test(eventType)) {\n return null;\n }\n\n for (const interaction of scope.interactions) {\n let element = eventTarget;\n\n if (interaction.simulation && interaction.simulation.allowResume\n && (interaction.mouse === mouseEvent)) {\n while (element) {\n // if the element is the interaction element\n if (element === interaction.element) {\n return interaction;\n }\n element = utils.parentNode(element);\n }\n }\n }\n\n return null;\n },\n\n // if it's a mouse interaction\n mouse: function ({ pointerId, mouseEvent, eventType }) {\n if (!mouseEvent && (browser.supportsTouch || browser.supportsPointerEvent)) {\n return null;\n }\n\n let firstNonActive;\n\n for (const interaction of scope.interactions) {\n if (interaction.mouse) {\n // if it's a down event, skip interactions with running simulations\n if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; }\n\n // if the interaction is active, return it immediately\n if (interaction.interacting()) {\n return interaction;\n }\n // otherwise save it and look for another active interaction\n else if (!firstNonActive) {\n firstNonActive = interaction;\n }\n }\n }\n\n // if no active mouse interaction was found use the first inactive mouse\n // interaction\n if (firstNonActive) {\n return firstNonActive;\n }\n\n // Find any interaction specifically for mouse.\n // ignore the interaction if the eventType is a mousedown, and a simulation\n // is active\n for (const interaction of scope.interactions) {\n if (interaction.mouse && !(/down/.test(eventType) && interaction.simulation)) {\n return interaction;\n }\n }\n\n return null;\n },\n\n // get interaction that has this pointer\n hasPointer: function ({ pointerId }) {\n for (const interaction of scope.interactions) {\n if (utils.contains(interaction.pointerIds, pointerId)) {\n return interaction;\n }\n }\n },\n\n // get first idle interaction\n idle: function ({ mouseEvent }) {\n for (const interaction of scope.interactions) {\n // if there's already a pointer held down\n if (interaction.pointerIds.length === 1) {\n const target = interaction.target;\n // don't add this pointer if there is a target interactable and it\n // isn't gesturable\n if (target && !target.options.gesture.enabled) {\n continue;\n }\n }\n // maximum of 2 pointers per interaction\n else if (interaction.pointerIds.length >= 2) {\n continue;\n }\n\n if (!interaction.interacting() && (mouseEvent === interaction.mouse)) {\n return interaction;\n }\n }\n\n return null;\n },\n};\n\nmodule.exports = finder;\n","const win = require('./window');\nconst isWindow = require('./isWindow');\n\nconst is = {\n array : () => {},\n\n window : thing => thing === win.window || isWindow(thing),\n\n docFrag : thing => is.object(thing) && thing.nodeType === 11,\n\n object : thing => !!thing && (typeof thing === 'object'),\n\n function: thing => typeof thing === 'function',\n\n number : thing => typeof thing === 'number' ,\n\n bool : thing => typeof thing === 'boolean' ,\n\n string : thing => typeof thing === 'string' ,\n\n element: thing => {\n if (!thing || (typeof thing !== 'object')) { return false; }\n\n const _window = win.getWindow(thing) || win.window;\n\n return (/object|function/.test(typeof _window.Element)\n ? thing instanceof _window.Element //DOM2\n : thing.nodeType === 1 && typeof thing.nodeName === 'string');\n },\n};\n\nis.array = thing => (is.object(thing)\n && (typeof thing.length !== 'undefined')\n && is.function(thing.splice));\n\nmodule.exports = is;\n","module.exports = (thing) => !!(thing && thing.Window) && (thing instanceof thing.Window);\n","function pointerExtend (dest, source) {\n for (const prop in source) {\n const prefixedPropREs = module.exports.prefixedPropREs;\n let deprecated = false;\n\n // skip deprecated prefixed properties\n for (const vendor in prefixedPropREs) {\n if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) {\n deprecated = true;\n break;\n }\n }\n\n if (!deprecated && typeof source[prop] !== 'function') {\n dest[prop] = source[prop];\n }\n }\n return dest;\n}\n\npointerExtend.prefixedPropREs = {\n webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/,\n};\n\nmodule.exports = pointerExtend;\n","const hypot = require('./hypot');\nconst browser = require('./browser');\nconst dom = require('./domObjects');\nconst domUtils = require('./domUtils');\nconst is = require('./is');\nconst pointerExtend = require('./pointerExtend');\n\nconst pointerUtils = {\n copyCoords: function (dest, src) {\n dest.page = dest.page || {};\n dest.page.x = src.page.x;\n dest.page.y = src.page.y;\n\n dest.client = dest.client || {};\n dest.client.x = src.client.x;\n dest.client.y = src.client.y;\n\n dest.timeStamp = src.timeStamp;\n },\n\n setCoordDeltas: function (targetObj, prev, cur) {\n targetObj.page.x = cur.page.x - prev.page.x;\n targetObj.page.y = cur.page.y - prev.page.y;\n targetObj.client.x = cur.client.x - prev.client.x;\n targetObj.client.y = cur.client.y - prev.client.y;\n targetObj.timeStamp = cur.timeStamp - prev.timeStamp;\n\n // set pointer velocity\n const dt = Math.max(targetObj.timeStamp / 1000, 0.001);\n\n targetObj.page.speed = hypot(targetObj.page.x, targetObj.page.y) / dt;\n targetObj.page.vx = targetObj.page.x / dt;\n targetObj.page.vy = targetObj.page.y / dt;\n\n targetObj.client.speed = hypot(targetObj.client.x, targetObj.page.y) / dt;\n targetObj.client.vx = targetObj.client.x / dt;\n targetObj.client.vy = targetObj.client.y / dt;\n },\n\n isNativePointer: function (pointer) {\n return (pointer instanceof dom.Event || pointer instanceof dom.Touch);\n },\n\n // Get specified X/Y coords for mouse or event.touches[0]\n getXY: function (type, pointer, xy) {\n xy = xy || {};\n type = type || 'page';\n\n xy.x = pointer[type + 'X'];\n xy.y = pointer[type + 'Y'];\n\n return xy;\n },\n\n getPageXY: function (pointer, page) {\n page = page || {};\n\n // Opera Mobile handles the viewport and scrolling oddly\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n pointerUtils.getXY('screen', pointer, page);\n\n page.x += window.scrollX;\n page.y += window.scrollY;\n }\n else {\n pointerUtils.getXY('page', pointer, page);\n }\n\n return page;\n },\n\n getClientXY: function (pointer, client) {\n client = client || {};\n\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n // Opera Mobile handles the viewport and scrolling oddly\n pointerUtils.getXY('screen', pointer, client);\n }\n else {\n pointerUtils.getXY('client', pointer, client);\n }\n\n return client;\n },\n\n getPointerId: function (pointer) {\n return is.number(pointer.pointerId)? pointer.pointerId : pointer.identifier;\n },\n\n setCoords: function (targetObj, pointers, timeStamp) {\n const pointer = (pointers.length > 1\n ? pointerUtils.pointerAverage(pointers)\n : pointers[0]);\n\n const tmpXY = {};\n\n pointerUtils.getPageXY(pointer, tmpXY);\n targetObj.page.x = tmpXY.x;\n targetObj.page.y = tmpXY.y;\n\n pointerUtils.getClientXY(pointer, tmpXY);\n targetObj.client.x = tmpXY.x;\n targetObj.client.y = tmpXY.y;\n\n targetObj.timeStamp = is.number(timeStamp) ? timeStamp :new Date().getTime();\n },\n\n pointerExtend: pointerExtend,\n\n getTouchPair: function (event) {\n const touches = [];\n\n // array of touches is supplied\n if (is.array(event)) {\n touches[0] = event[0];\n touches[1] = event[1];\n }\n // an event\n else {\n if (event.type === 'touchend') {\n if (event.touches.length === 1) {\n touches[0] = event.touches[0];\n touches[1] = event.changedTouches[0];\n }\n else if (event.touches.length === 0) {\n touches[0] = event.changedTouches[0];\n touches[1] = event.changedTouches[1];\n }\n }\n else {\n touches[0] = event.touches[0];\n touches[1] = event.touches[1];\n }\n }\n\n return touches;\n },\n\n pointerAverage: function (pointers) {\n const average = {\n pageX : 0,\n pageY : 0,\n clientX: 0,\n clientY: 0,\n screenX: 0,\n screenY: 0,\n };\n\n for (const pointer of pointers) {\n for (const prop in average) {\n average[prop] += pointer[prop];\n }\n }\n for (const prop in average) {\n average[prop] /= pointers.length;\n }\n\n return average;\n },\n\n touchBBox: function (event) {\n if (!event.length && !(event.touches && event.touches.length > 1)) {\n return;\n }\n\n const touches = pointerUtils.getTouchPair(event);\n const minX = Math.min(touches[0].pageX, touches[1].pageX);\n const minY = Math.min(touches[0].pageY, touches[1].pageY);\n const maxX = Math.max(touches[0].pageX, touches[1].pageX);\n const maxY = Math.max(touches[0].pageY, touches[1].pageY);\n\n return {\n x: minX,\n y: minY,\n left: minX,\n top: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n },\n\n touchDistance: function (event, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n\n\n const dx = touches[0][sourceX] - touches[1][sourceX];\n const dy = touches[0][sourceY] - touches[1][sourceY];\n\n return hypot(dx, dy);\n },\n\n touchAngle: function (event, prevAngle, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n const dx = touches[1][sourceX] - touches[0][sourceX];\n const dy = touches[1][sourceY] - touches[0][sourceY];\n const angle = 180 * Math.atan2(dy , dx) / Math.PI;\n\n return angle;\n },\n\n getPointerType: function (pointer, interaction) {\n // if the PointerEvent API isn't available, then the pointer must be ither\n // a MouseEvent or TouchEvent\n if (interaction.mouse) { return 'mouse'; }\n if (!browser.supportsPointerEvent) { return 'touch'; }\n\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : [undefined, undefined,'touch', 'pen', 'mouse'][pointer.pointerType];\n },\n\n // [ event.target, event.currentTarget ]\n getEventTargets: function (event) {\n return [\n domUtils.getActualElement(event.path ? event.path[0] : event.target),\n domUtils.getActualElement(event.currentTarget),\n ];\n },\n};\n\nmodule.exports = pointerUtils;\n","const { window } = require('./window');\n\nconst vendors = ['ms', 'moz', 'webkit', 'o'];\nlet lastTime = 0;\nlet request;\nlet cancel;\n\nfor (let x = 0; x < vendors.length && !window.requestAnimationFrame; x++) {\n request = window[vendors[x] + 'RequestAnimationFrame'];\n cancel = window[vendors[x] +'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n}\n\nif (!request) {\n request = function (callback) {\n const currTime = new Date().getTime();\n const timeToCall = Math.max(0, 16 - (currTime - lastTime));\n const id = setTimeout(function () { callback(currTime + timeToCall); },\n timeToCall);\n\n lastTime = currTime + timeToCall;\n return id;\n };\n}\n\nif (!cancel) {\n cancel = function (id) {\n clearTimeout(id);\n };\n}\n\nmodule.exports = {\n request,\n cancel,\n};\n","const extend = require('./extend');\nconst is = require('./is');\nconst {\n closest,\n parentNode,\n getElementRect,\n} = require('./domUtils');\n\nconst rectUtils = {\n getStringOptionResult: function (value, interactable, element) {\n if (!is.string(value)) {\n return null;\n }\n\n if (value === 'parent') {\n value = parentNode(element);\n }\n else if (value === 'self') {\n value = interactable.getRect(element);\n }\n else {\n value = closest(element, value);\n }\n\n return value;\n },\n\n resolveRectLike: function (value, interactable, element, functionArgs) {\n value = rectUtils.getStringOptionResult(value, interactable, element) || value;\n\n if (is.function(value)) {\n value = value.apply(null, functionArgs);\n }\n\n if (is.element(value)) {\n value = getElementRect(value);\n }\n\n return value;\n },\n\n rectToXY: function (rect) {\n return rect && {\n x: 'x' in rect ? rect.x : rect.left,\n y: 'y' in rect ? rect.y : rect.top,\n };\n },\n\n xywhToTlbr: function (rect) {\n if (rect && !('left' in rect && 'top' in rect)) {\n rect = extend({}, rect);\n\n rect.left = rect.x || 0;\n rect.top = rect.y || 0;\n rect.right = rect.right || (rect.left + rect.width);\n rect.bottom = rect.bottom || (rect.top + rect.height);\n }\n\n return rect;\n },\n\n tlbrToXywh: function (rect) {\n if (rect && !('x' in rect && 'y' in rect)) {\n rect = extend({}, rect);\n\n rect.x = rect.left || 0;\n rect.top = rect.top || 0;\n rect.width = rect.width || (rect.right - rect.x);\n rect.height = rect.height || (rect.bottom - rect.y);\n }\n\n return rect;\n },\n};\n\nmodule.exports = rectUtils;\n","const win = module.exports;\nconst isWindow = require('./isWindow');\n\nfunction init (window) {\n // get wrapped window if using Shadow DOM polyfill\n\n win.realWindow = window;\n\n // create a TextNode\n const el = window.document.createTextNode('');\n\n // check if it's wrapped by a polyfill\n if (el.ownerDocument !== window.document\n && typeof window.wrap === 'function'\n && window.wrap(el) === el) {\n // use wrapped window\n window = window.wrap(window);\n }\n\n win.window = window;\n}\n\nif (typeof window === 'undefined') {\n win.window = undefined;\n win.realWindow = undefined;\n}\nelse {\n init(window);\n}\n\nwin.getWindow = function getWindow (node) {\n if (isWindow(node)) {\n return node;\n }\n\n const rootNode = (node.ownerDocument || node);\n\n return rootNode.defaultView || rootNode.parentWindow || win.window;\n};\n\nwin.init = init;\n"]} \ No newline at end of file +{"version":3,"sources":["src/minHeader.js","src/header.js","index.js","src/Eventable.js","src/InteractEvent.js","src/Interactable.js","src/Interaction.js","src/actions/base.js","src/actions/drag.js","src/actions/drop.js","src/actions/gesture.js","src/actions/resize.js","src/autoScroll.js","src/autoStart/InteractableMethods.js","src/autoStart/base.js","src/autoStart/delay.js","src/autoStart/drag.js","src/autoStart/gesture.js","src/autoStart/resize.js","src/defaultOptions.js","src/index.js","src/inertia.js","src/interact.js","src/interactablePreventDefault.js","src/legacyBrowsers.js","src/modifiers/index.js","src/modifiers/restrict.js","src/modifiers/restrictEdges.js","src/modifiers/restrictSize.js","src/modifiers/snap.js","src/modifiers/snapSize.js","src/pointerEvents/PointerEvent.js","src/pointerEvents/base.js","src/pointerEvents/holdRepeat.js","src/pointerEvents/interactableTargets.js","src/scope.js","src/utils/Signals.js","src/utils/arr.js","src/utils/browser.js","src/utils/domObjects.js","src/utils/domUtils.js","src/utils/events.js","src/utils/extend.js","src/utils/getOriginXY.js","src/utils/hypot.js","src/utils/index.js","src/utils/interactionFinder.js","src/utils/is.js","src/utils/isWindow.js","src/utils/pointerExtend.js","src/utils/pointerUtils.js","src/utils/raf.js","src/utils/rect.js","src/utils/window.js"],"names":[],"mappings":"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","file":"interact.min.js","sourceRoot":"","sourcesContent":["/* interact.js v1.3.0-alpha.4+sha.7970416-dirty | https://raw.github.com/taye/interact.js/master/LICENSE */\n","/**\n * interact.js v1.3.0-alpha.4+sha.7970416-dirty\n *\n * Copyright (c) 2012-2017 Taye Adeyemi \n * Open source under the MIT License.\n * https://raw.github.com/taye/interact.js/master/LICENSE\n */\n","/*\n * In a (windowless) server environment this file exports a factory function\n * that takes the window to use.\n *\n * var interact = require('interact.js')(windowObject);\n *\n * See https://github.com/taye/interact.js/issues/187\n */\nif (typeof window === 'undefined') {\n module.exports = function (window) {\n require('./src/utils/window').init(window);\n\n return require('./src/index');\n };\n}\nelse {\n module.exports = require('./src/index');\n}\n","const { indexOf } = require('./utils/arr');\nconst extend = require('./utils/extend.js');\n\nfunction fireUntilImmediateStopped (event, listeners) {\n for (let i = 0, len = listeners.length; i < len && !event.immediatePropagationStopped; i++) {\n listeners[i](event);\n }\n}\n\nclass Eventable {\n\n constructor (options) {\n this.options = extend({}, options || {});\n }\n\n fire (event) {\n let listeners;\n const onEvent = 'on' + event.type;\n const global = this.global;\n\n // Interactable#on() listeners\n if ((listeners = this[event.type])) {\n fireUntilImmediateStopped(event, listeners);\n }\n\n // interactable.onevent listener\n if (this[onEvent]) {\n this[onEvent](event);\n }\n\n // interact.on() listeners\n if (!event.propagationStopped && global && (listeners = global[event.type])) {\n fireUntilImmediateStopped(event, listeners);\n }\n }\n\n on (eventType, listener) {\n // if this type of event was never bound\n if (this[eventType]) {\n this[eventType].push(listener);\n }\n else {\n this[eventType] = [listener];\n }\n }\n\n off (eventType, listener) {\n // if it is an action event type\n const eventList = this[eventType];\n const index = eventList? indexOf(eventList, listener) : -1;\n\n if (index !== -1) {\n eventList.splice(index, 1);\n }\n\n if (eventList && eventList.length === 0 || !listener) {\n this[eventType] = listener;\n }\n }\n}\n\nmodule.exports = Eventable;\n","const extend = require('./utils/extend');\nconst getOriginXY = require('./utils/getOriginXY');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nclass InteractEvent {\n constructor (interaction, event, action, phase, element, related, preEnd = false) {\n const target = interaction.target;\n const deltaSource = (target && target.options || defaults).deltaSource;\n const origin = getOriginXY(target, element, action);\n const starting = phase === 'start';\n const ending = phase === 'end';\n const coords = starting? interaction.startCoords : interaction.curCoords;\n const prevEvent = interaction.prevEvent;\n\n element = element || interaction.element;\n\n const page = extend({}, coords.page);\n const client = extend({}, coords.client);\n\n page.x -= origin.x;\n page.y -= origin.y;\n\n client.x -= origin.x;\n client.y -= origin.y;\n\n this.ctrlKey = event.ctrlKey;\n this.altKey = event.altKey;\n this.shiftKey = event.shiftKey;\n this.metaKey = event.metaKey;\n this.button = event.button;\n this.buttons = event.buttons;\n this.target = element;\n this.currentTarget = element;\n this.relatedTarget = related || null;\n this.preEnd = preEnd;\n this.type = action + (phase || '');\n this.interaction = interaction;\n this.interactable = target;\n\n this.t0 = starting ? interaction.downTimes[interaction.downTimes.length - 1]\n : prevEvent.t0;\n\n const signalArg = {\n interaction,\n event,\n action,\n phase,\n element,\n related,\n page,\n client,\n coords,\n starting,\n ending,\n deltaSource,\n iEvent: this,\n };\n\n signals.fire('set-xy', signalArg);\n\n if (ending) {\n // use previous coords when ending\n this.pageX = prevEvent.pageX;\n this.pageY = prevEvent.pageY;\n this.clientX = prevEvent.clientX;\n this.clientY = prevEvent.clientY;\n }\n else {\n this.pageX = page.x;\n this.pageY = page.y;\n this.clientX = client.x;\n this.clientY = client.y;\n }\n\n this.x0 = interaction.startCoords.page.x - origin.x;\n this.y0 = interaction.startCoords.page.y - origin.y;\n this.clientX0 = interaction.startCoords.client.x - origin.x;\n this.clientY0 = interaction.startCoords.client.y - origin.y;\n\n signals.fire('set-delta', signalArg);\n\n this.timeStamp = coords.timeStamp;\n this.dt = interaction.pointerDelta.timeStamp;\n this.duration = this.timeStamp - this.t0;\n\n // speed and velocity in pixels per second\n this.speed = interaction.pointerDelta[deltaSource].speed;\n this.velocityX = interaction.pointerDelta[deltaSource].vx;\n this.velocityY = interaction.pointerDelta[deltaSource].vy;\n\n this.swipe = (ending || phase === 'inertiastart')? this.getSwipe() : null;\n\n signals.fire('new', signalArg);\n }\n\n getSwipe () {\n const interaction = this.interaction;\n\n if (interaction.prevEvent.speed < 600\n || this.timeStamp - interaction.prevEvent.timeStamp > 150) {\n return null;\n }\n\n let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI;\n const overlap = 22.5;\n\n if (angle < 0) {\n angle += 360;\n }\n\n const left = 135 - overlap <= angle && angle < 225 + overlap;\n const up = 225 - overlap <= angle && angle < 315 + overlap;\n\n const right = !left && (315 - overlap <= angle || angle < 45 + overlap);\n const down = !up && 45 - overlap <= angle && angle < 135 + overlap;\n\n return {\n up,\n down,\n left,\n right,\n angle,\n speed: interaction.prevEvent.speed,\n velocity: {\n x: interaction.prevEvent.velocityX,\n y: interaction.prevEvent.velocityY,\n },\n };\n }\n\n preventDefault () {}\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n}\n\nsignals.on('set-delta', function ({ iEvent, interaction, starting, deltaSource }) {\n const prevEvent = starting? iEvent : interaction.prevEvent;\n\n if (deltaSource === 'client') {\n iEvent.dx = iEvent.clientX - prevEvent.clientX;\n iEvent.dy = iEvent.clientY - prevEvent.clientY;\n }\n else {\n iEvent.dx = iEvent.pageX - prevEvent.pageX;\n iEvent.dy = iEvent.pageY - prevEvent.pageY;\n }\n});\n\nInteractEvent.signals = signals;\n\nmodule.exports = InteractEvent;\n","const is = require('./utils/is');\nconst events = require('./utils/events');\nconst extend = require('./utils/extend');\nconst actions = require('./actions/base');\nconst scope = require('./scope');\nconst Eventable = require('./Eventable');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nconst {\n getElementRect,\n nodeContains,\n trySelector,\n} = require('./utils/domUtils');\nconst { getWindow } = require('./utils/window');\nconst { indexOf, contains } = require('./utils/arr');\nconst { wheelEvent } = require('./utils/browser');\n\n// all set interactables\nscope.interactables = [];\n\n/*\\\n * Interactable\n [ property ]\n **\n * Object type returned by @interact\n\\*/\nclass Interactable {\n constructor (target, options) {\n options = options || {};\n\n this.target = target;\n this.events = new Eventable();\n this._context = options.context || scope.document;\n this._win = getWindow(trySelector(target)? this._context : target);\n this._doc = this._win.document;\n\n signals.fire('new', {\n target,\n options,\n interactable: this,\n win: this._win,\n });\n\n scope.addDocument( this._doc, this._win );\n\n scope.interactables.push(this);\n\n this.set(options);\n }\n\n setOnEvents (action, phases) {\n const onAction = 'on' + action;\n\n if (is.function(phases.onstart) ) { this.events[onAction + 'start' ] = phases.onstart ; }\n if (is.function(phases.onmove) ) { this.events[onAction + 'move' ] = phases.onmove ; }\n if (is.function(phases.onend) ) { this.events[onAction + 'end' ] = phases.onend ; }\n if (is.function(phases.oninertiastart)) { this.events[onAction + 'inertiastart' ] = phases.oninertiastart ; }\n\n return this;\n }\n\n setPerAction (action, options) {\n // for all the default per-action options\n for (const option in options) {\n // if this option exists for this action\n if (option in defaults[action]) {\n // if the option in the options arg is an object value\n if (is.object(options[option])) {\n // duplicate the object\n this.options[action][option] = extend(this.options[action][option] || {}, options[option]);\n\n if (is.object(defaults.perAction[option]) && 'enabled' in defaults.perAction[option]) {\n this.options[action][option].enabled = options[option].enabled === false? false : true;\n }\n }\n else if (is.bool(options[option]) && is.object(defaults.perAction[option])) {\n this.options[action][option].enabled = options[option];\n }\n else if (options[option] !== undefined) {\n // or if it's not undefined, do a plain assignment\n this.options[action][option] = options[option];\n }\n }\n }\n }\n\n /*\\\n * Interactable.getRect\n [ method ]\n *\n * The default function to get an Interactables bounding rect. Can be\n * overridden using @Interactable.rectChecker.\n *\n - element (Element) #optional The element to measure.\n = (object) The object's bounding rectangle.\n o {\n o top : 0,\n o left : 0,\n o bottom: 0,\n o right : 0,\n o width : 0,\n o height: 0\n o }\n \\*/\n getRect (element) {\n element = element || this.target;\n\n if (is.string(this.target) && !(is.element(element))) {\n element = this._context.querySelector(this.target);\n }\n\n return getElementRect(element);\n }\n\n /*\\\n * Interactable.rectChecker\n [ method ]\n *\n * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n - checker (function) #optional A function which returns this Interactable's bounding rectangle. See @Interactable.getRect\n = (function | object) The checker function or this Interactable\n \\*/\n rectChecker (checker) {\n if (is.function(checker)) {\n this.getRect = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.getRect;\n\n return this;\n }\n\n return this.getRect;\n }\n\n _backCompatOption (optionName, newValue) {\n if (trySelector(newValue) || is.object(newValue)) {\n this.options[optionName] = newValue;\n\n for (const action of actions.names) {\n this.options[action][optionName] = newValue;\n }\n\n return this;\n }\n\n return this.options[optionName];\n }\n\n /*\\\n * Interactable.origin\n [ method ]\n *\n * Gets or sets the origin of the Interactable's element. The x and y\n * of the origin will be subtracted from action event coordinates.\n *\n - origin (object | string) #optional An object eg. { x: 0, y: 0 } or string 'parent', 'self' or any CSS selector\n * OR\n - origin (Element) #optional An HTML or SVG Element whose rect will be used\n **\n = (object) The current origin or this Interactable\n \\*/\n origin (newValue) {\n return this._backCompatOption('origin', newValue);\n }\n\n /*\\\n * Interactable.deltaSource\n [ method ]\n *\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n - newValue (string) #optional Use 'client' if you will be scrolling while interacting; Use 'page' if you want autoScroll to work\n = (string | object) The current deltaSource or this Interactable\n \\*/\n deltaSource (newValue) {\n if (newValue === 'page' || newValue === 'client') {\n this.options.deltaSource = newValue;\n\n return this;\n }\n\n return this.options.deltaSource;\n }\n\n /*\\\n * Interactable.context\n [ method ]\n *\n * Gets the selector context Node of the Interactable. The default is `window.document`.\n *\n = (Node) The context Node of this Interactable\n **\n \\*/\n context () {\n return this._context;\n }\n\n inContext (element) {\n return (this._context === element.ownerDocument\n || nodeContains(this._context, element));\n }\n\n /*\\\n * Interactable.fire\n [ method ]\n *\n * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n - iEvent (InteractEvent) The InteractEvent object to be fired on this Interactable\n = (Interactable) this Interactable\n \\*/\n fire (iEvent) {\n this.events.fire(iEvent);\n\n return this;\n }\n\n _onOffMultiple (method, eventType, listener, options) {\n if (is.string(eventType) && eventType.search(' ') !== -1) {\n eventType = eventType.trim().split(/ +/);\n }\n\n if (is.array(eventType)) {\n for (let i = 0; i < eventType.length; i++) {\n this[method](eventType[i], listener, options);\n }\n\n return true;\n }\n\n if (is.object(eventType)) {\n for (const prop in eventType) {\n this[method](prop, eventType[prop], listener);\n }\n\n return true;\n }\n }\n\n /*\\\n * Interactable.on\n [ method ]\n *\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n - eventType (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) This Interactable\n \\*/\n on (eventType, listener, options) {\n if (this._onOffMultiple('on', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.on(eventType, listener);\n }\n // delegated event for selector\n else if (is.string(this.target)) {\n events.addDelegate(this.target, this._context, eventType, listener, options);\n }\n else {\n events.add(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.off\n [ method ]\n *\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n - eventType (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) This Interactable\n \\*/\n off (eventType, listener, options) {\n if (this._onOffMultiple('off', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n // if it is an action event type\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.off(eventType, listener);\n }\n // delegated event\n else if (is.string(this.target)) {\n events.removeDelegate(this.target, this._context, eventType, listener, options);\n }\n // remove listener from this Interatable's element\n else {\n events.remove(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.set\n [ method ]\n *\n * Reset the options of this Interactable\n - options (object) The new settings to apply\n = (object) This Interactable\n \\*/\n set (options) {\n if (!is.object(options)) {\n options = {};\n }\n\n this.options = extend({}, defaults.base);\n\n const perActions = extend({}, defaults.perAction);\n\n for (const actionName in actions.methodDict) {\n const methodName = actions.methodDict[actionName];\n\n this.options[actionName] = extend({}, defaults[actionName]);\n\n this.setPerAction(actionName, perActions);\n\n this[methodName](options[actionName]);\n }\n\n for (const setting of Interactable.settingsMethods) {\n this.options[setting] = defaults.base[setting];\n\n if (setting in options) {\n this[setting](options[setting]);\n }\n }\n\n signals.fire('set', {\n options,\n interactable: this,\n });\n\n return this;\n }\n\n /*\\\n * Interactable.unset\n [ method ]\n *\n * Remove this interactable from the list of interactables and remove\n * it's action capabilities and event listeners\n *\n = (object) @interact\n \\*/\n unset () {\n events.remove(this.target, 'all');\n\n if (is.string(this.target)) {\n // remove delegated events\n for (const type in events.delegatedEvents) {\n const delegated = events.delegatedEvents[type];\n\n if (delegated.selectors[0] === this.target\n && delegated.contexts[0] === this._context) {\n\n delegated.selectors.splice(0, 1);\n delegated.contexts .splice(0, 1);\n delegated.listeners.splice(0, 1);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegated[type] = null;\n }\n }\n\n events.remove(this._context, type, events.delegateListener);\n events.remove(this._context, type, events.delegateUseCapture, true);\n }\n }\n else {\n events.remove(this, 'all');\n }\n\n signals.fire('unset', { interactable: this });\n\n scope.interactables.splice(indexOf(scope.interactables, this), 1);\n\n // Stop related interactions when an Interactable is unset\n for (const interaction of scope.interactions || []) {\n if (interaction.target === this && interaction.interacting()) {\n interaction.stop();\n }\n }\n\n return scope.interact;\n }\n}\n\nscope.interactables.indexOfElement = function indexOfElement (target, context) {\n context = context || scope.document;\n\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n if (interactable.target === target && interactable._context === context) {\n return i;\n }\n }\n return -1;\n};\n\nscope.interactables.get = function interactableGet (element, options, dontCheckInContext) {\n const ret = this[this.indexOfElement(element, options && options.context)];\n\n return ret && (is.string(element) || dontCheckInContext || ret.inContext(element))? ret : null;\n};\n\nscope.interactables.forEachSelector = function (callback, element) {\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n // skip non CSS selector targets and out of context elements\n if (!is.string(interactable.target)\n || (element && !interactable.inContext(element))) {\n continue;\n }\n\n const ret = callback(interactable, interactable.target, interactable._context, i, this);\n\n if (ret !== undefined) {\n return ret;\n }\n }\n};\n\n// all interact.js eventTypes\nInteractable.eventTypes = scope.eventTypes = [];\n\nInteractable.signals = signals;\n\nInteractable.settingsMethods = [ 'deltaSource', 'origin', 'preventDefault', 'rectChecker' ];\n\nmodule.exports = Interactable;\n","const scope = require('./scope');\nconst utils = require('./utils');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst domObjects = require('./utils/domObjects');\nconst finder = require('./utils/interactionFinder');\nconst signals = require('./utils/Signals').new();\n\nconst listeners = {};\nconst methodNames = [\n 'pointerDown', 'pointerMove', 'pointerUp',\n 'updatePointer', 'removePointer',\n];\n\n// for ignoring browser's simulated mouse events\nlet prevTouchTime = 0;\n\n// all active and idle interactions\nscope.interactions = [];\n\nclass Interaction {\n constructor ({ pointerType }) {\n this.target = null; // current interactable being interacted with\n this.element = null; // the target element of the interactable\n\n this.prepared = { // action that's ready to be fired on next move event\n name : null,\n axis : null,\n edges: null,\n };\n\n // keep track of added pointers\n this.pointers = [];\n this.pointerIds = [];\n this.downTargets = [];\n this.downTimes = [];\n\n // Previous native pointer move event coordinates\n this.prevCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n // current native pointer move event coordinates\n this.curCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Starting InteractEvent pointer coordinates\n this.startCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Change in coordinates and time of the pointer\n this.pointerDelta = {\n page : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n client : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n timeStamp: 0,\n };\n\n this.downEvent = null; // pointerdown/mousedown/touchstart event\n this.downPointer = {};\n\n this._eventTarget = null;\n this._curEventTarget = null;\n\n this.prevEvent = null; // previous action event\n\n this.pointerIsDown = false;\n this.pointerWasMoved = false;\n this._interacting = false;\n\n this.pointerType = pointerType;\n\n signals.fire('new', this);\n\n scope.interactions.push(this);\n }\n\n pointerDown (pointer, event, eventTarget) {\n const pointerIndex = this.updatePointer(pointer, event, true);\n\n signals.fire('down', {\n pointer,\n event,\n eventTarget,\n pointerIndex,\n interaction: this,\n });\n }\n\n /*\\\n * Interaction.start\n [ method ]\n *\n * Start an action with the given Interactable and Element as tartgets. The\n * action must be enabled for the target Interactable and an appropriate number\n * of pointers must be held down - 1 for drag/resize, 2 for gesture.\n *\n * Use it with `interactable.able({ manualStart: false })` to always\n * [start actions manually](https://github.com/taye/interact.js/issues/114)\n *\n - action (object) The action to be performed - drag, resize, etc.\n - target (Interactable) The Interactable to target\n - element (Element) The DOM Element to target\n = (object) interact\n **\n | interact(target)\n | .draggable({\n | // disable the default drag start by down->move\n | manualStart: true\n | })\n | // start dragging after the user holds the pointer down\n | .on('hold', function (event) {\n | var interaction = event.interaction;\n |\n | if (!interaction.interacting()) {\n | interaction.start({ name: 'drag' },\n | event.interactable,\n | event.currentTarget);\n | }\n | });\n \\*/\n start (action, target, element) {\n if (this.interacting()\n || !this.pointerIsDown\n || this.pointerIds.length < (action.name === 'gesture'? 2 : 1)) {\n return;\n }\n\n // if this interaction had been removed after stopping\n // add it back\n if (utils.indexOf(scope.interactions, this) === -1) {\n scope.interactions.push(this);\n }\n\n utils.copyAction(this.prepared, action);\n this.target = target;\n this.element = element;\n\n signals.fire('action-start', {\n interaction: this,\n event: this.downEvent,\n });\n }\n\n pointerMove (pointer, event, eventTarget) {\n if (!this.simulation) {\n this.updatePointer(pointer);\n utils.setCoords(this.curCoords, this.pointers);\n }\n\n const duplicateMove = (this.curCoords.page.x === this.prevCoords.page.x\n && this.curCoords.page.y === this.prevCoords.page.y\n && this.curCoords.client.x === this.prevCoords.client.x\n && this.curCoords.client.y === this.prevCoords.client.y);\n\n let dx;\n let dy;\n\n // register movement greater than pointerMoveTolerance\n if (this.pointerIsDown && !this.pointerWasMoved) {\n dx = this.curCoords.client.x - this.startCoords.client.x;\n dy = this.curCoords.client.y - this.startCoords.client.y;\n\n this.pointerWasMoved = utils.hypot(dx, dy) > Interaction.pointerMoveTolerance;\n }\n\n const signalArg = {\n pointer,\n pointerIndex: this.getPointerIndex(pointer),\n event,\n eventTarget,\n dx,\n dy,\n duplicate: duplicateMove,\n interaction: this,\n interactingBeforeMove: this.interacting(),\n };\n\n if (!duplicateMove) {\n // set pointer coordinate, time changes and speeds\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n }\n\n signals.fire('move', signalArg);\n\n if (!duplicateMove) {\n // if interacting, fire an 'action-move' signal etc\n if (this.interacting()) {\n this.doMove(signalArg);\n }\n\n if (this.pointerWasMoved) {\n utils.copyCoords(this.prevCoords, this.curCoords);\n }\n }\n }\n\n /*\\\n * Interaction.doMove\n [ method ]\n *\n * Force a move of the current action at the same coordinates. Useful if\n * snap/restrict has been changed and you want a movement with the new\n * settings.\n *\n **\n | interact(target)\n | .draggable(true)\n | .on('dragmove', function (event) {\n | if (someCondition) {\n | // change the snap settings\n | event.interactable.draggable({ snap: { targets: [] }});\n | // fire another move event with re-calculated snap\n | event.interaction.doMove();\n | }\n | });\n \\*/\n doMove (signalArg) {\n signalArg = utils.extend({\n pointer: this.pointers[0],\n event: this.prevEvent,\n eventTarget: this._eventTarget,\n interaction: this,\n }, signalArg || {});\n\n signals.fire('before-action-move', signalArg);\n\n if (!this._dontFireMove) {\n signals.fire('action-move', signalArg);\n }\n\n this._dontFireMove = false;\n }\n\n // End interact move events and stop auto-scroll unless simulation is running\n pointerUp (pointer, event, eventTarget, curEventTarget) {\n const pointerIndex = this.getPointerIndex(pointer);\n\n signals.fire(/cancel$/i.test(event.type)? 'cancel' : 'up', {\n pointer,\n pointerIndex,\n event,\n eventTarget,\n curEventTarget,\n interaction: this,\n });\n\n if (!this.simulation) {\n this.end(event);\n }\n\n this.pointerIsDown = false;\n this.removePointer(pointer, event);\n }\n\n /*\\\n * Interaction.end\n [ method ]\n *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n - event (PointerEvent) #optional\n **\n | interact(target)\n | .draggable(true)\n | .on('move', function (event) {\n | if (event.pageX > 1000) {\n | // end the current action\n | event.interaction.end();\n | // stop all further listeners from being called\n | event.stopImmediatePropagation();\n | }\n | });\n \\*/\n end (event) {\n event = event || this.prevEvent;\n\n if (this.interacting()) {\n signals.fire('action-end', {\n event,\n interaction: this,\n });\n }\n\n this.stop();\n }\n\n currentAction () {\n return this._interacting? this.prepared.name: null;\n }\n\n interacting () {\n return this._interacting;\n }\n\n stop () {\n signals.fire('stop', { interaction: this });\n\n if (this._interacting) {\n signals.fire('stop-active', { interaction: this });\n signals.fire('stop-' + this.prepared.name, { interaction: this });\n }\n\n this.target = this.element = null;\n\n this._interacting = false;\n this.prepared.name = this.prevEvent = null;\n }\n\n getPointerIndex (pointer) {\n // mouse and pen interactions may have only one pointer\n if (this.pointerType === 'mouse' || this.pointerType === 'pen') {\n return 0;\n }\n\n return utils.indexOf(this.pointerIds, utils.getPointerId(pointer));\n }\n\n updatePointer (pointer, event, down = event && /(down|start)$/i.test(event.type)) {\n const id = utils.getPointerId(pointer);\n let index = this.getPointerIndex(pointer);\n\n if (index === -1) {\n index = this.pointerIds.length;\n this.pointerIds[index] = id;\n }\n\n if (down) {\n signals.fire('update-pointer-down', {\n pointer,\n event,\n down,\n pointerId: id,\n pointerIndex: index,\n interaction: this,\n });\n }\n\n this.pointers[index] = pointer;\n\n return index;\n }\n\n removePointer (pointer, event) {\n const index = this.getPointerIndex(pointer);\n\n if (index === -1) { return; }\n\n signals.fire('remove-pointer', {\n pointer,\n event,\n pointerIndex: index,\n interaction: this,\n });\n\n this.pointers .splice(index, 1);\n this.pointerIds .splice(index, 1);\n this.downTargets.splice(index, 1);\n this.downTimes .splice(index, 1);\n }\n\n _updateEventTargets (target, currentTarget) {\n this._eventTarget = target;\n this._curEventTarget = currentTarget;\n }\n}\n\nfor (let i = 0, len = methodNames.length; i < len; i++) {\n const method = methodNames[i];\n\n listeners[method] = doOnInteractions(method);\n}\n\nfunction doOnInteractions (method) {\n return (function (event) {\n const pointerType = utils.getPointerType(event);\n const [eventTarget, curEventTarget] = utils.getEventTargets(event);\n const matches = []; // [ [pointer, interaction], ...]\n\n if (browser.supportsTouch && /touch/.test(event.type)) {\n prevTouchTime = new Date().getTime();\n\n for (let i = 0; i < event.changedTouches.length; i++) {\n const pointer = event.changedTouches[i];\n const interaction = finder.search(pointer, event.type, eventTarget);\n\n matches.push([pointer, interaction || new Interaction({ pointerType })]);\n }\n }\n else {\n let invalidPointer = false;\n\n if (!browser.supportsPointerEvent && /mouse/.test(event.type)) {\n // ignore mouse events while touch interactions are active\n for (let i = 0; i < scope.interactions.length && !invalidPointer; i++) {\n invalidPointer = scope.interactions[i].pointerType !== 'mouse' && scope.interactions[i].pointerIsDown;\n }\n\n // try to ignore mouse events that are simulated by the browser\n // after a touch event\n invalidPointer = invalidPointer\n || (new Date().getTime() - prevTouchTime < 500)\n // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated\n || event.timeStamp === 0;\n }\n\n if (!invalidPointer) {\n let interaction = finder.search(event, event.type, eventTarget);\n\n if (!interaction) {\n interaction = new Interaction({ pointerType });\n }\n\n matches.push([event, interaction]);\n }\n }\n\n for (const [pointer, interaction] of matches) {\n interaction._updateEventTargets(eventTarget, curEventTarget);\n interaction[method](pointer, event, eventTarget, curEventTarget);\n }\n });\n}\n\nfunction endAll (event) {\n for (let i = 0; i < scope.interactions.length; i++) {\n const interaction = scope.interactions[i];\n\n interaction.end(event);\n signals.fire('endall', { event, interaction });\n }\n}\n\nconst docEvents = { /* 'eventType': listenerFunc */ };\nconst pEventTypes = browser.pEventTypes;\n\nif (domObjects.PointerEvent) {\n docEvents[pEventTypes.down ] = listeners.pointerDown;\n docEvents[pEventTypes.move ] = listeners.pointerMove;\n docEvents[pEventTypes.up ] = listeners.pointerUp;\n docEvents[pEventTypes.cancel] = listeners.pointerUp;\n}\nelse {\n docEvents.mousedown = listeners.pointerDown;\n docEvents.mousemove = listeners.pointerMove;\n docEvents.mouseup = listeners.pointerUp;\n\n docEvents.touchstart = listeners.pointerDown;\n docEvents.touchmove = listeners.pointerMove;\n docEvents.touchend = listeners.pointerUp;\n docEvents.touchcancel = listeners.pointerUp;\n}\n\ndocEvents.blur = endAll;\n\nfunction onDocSignal ({ doc }, signalName) {\n const eventMethod = signalName.indexOf('add') === 0\n ? events.add : events.remove;\n\n // delegate event listener\n for (const eventType in scope.delegatedEvents) {\n eventMethod(doc, eventType, events.delegateListener);\n eventMethod(doc, eventType, events.delegateUseCapture, true);\n }\n\n for (const eventType in docEvents) {\n eventMethod(doc, eventType, docEvents[eventType]);\n }\n}\n\nsignals.on('update-pointer-down', ({ interaction, pointer, pointerId, pointerIndex, event, eventTarget, down }) => {\n interaction.pointerIds[pointerIndex] = pointerId;\n interaction.pointers[pointerIndex] = pointer;\n\n if (down) {\n interaction.pointerIsDown = true;\n }\n\n if (!interaction.interacting()) {\n utils.setCoords(interaction.startCoords, interaction.pointers);\n\n utils.copyCoords(interaction.curCoords , interaction.startCoords);\n utils.copyCoords(interaction.prevCoords, interaction.startCoords);\n\n interaction.downEvent = event;\n interaction.downTimes[pointerIndex] = interaction.curCoords.timeStamp;\n interaction.downTargets[pointerIndex] = eventTarget || event && utils.getEventTargets(event)[0];\n interaction.pointerWasMoved = false;\n\n utils.pointerExtend(interaction.downPointer, pointer);\n }\n});\n\nscope.signals.on('add-document' , onDocSignal);\nscope.signals.on('remove-document', onDocSignal);\n\nInteraction.pointerMoveTolerance = 1;\nInteraction.doOnInteractions = doOnInteractions;\nInteraction.endAll = endAll;\nInteraction.signals = signals;\nInteraction.docEvents = docEvents;\n\nscope.endAllInteractions = endAll;\n\nmodule.exports = Interaction;\n","const Interaction = require('../Interaction');\nconst InteractEvent = require('../InteractEvent');\n\nconst actions = {\n firePrepared,\n names: [],\n methodDict: {},\n};\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n interaction._interacting = true;\n firePrepared(interaction, event, 'start');\n});\n\nInteraction.signals.on('action-move', function ({ interaction, event, preEnd }) {\n firePrepared(interaction, event, 'move', preEnd);\n\n // if the action was ended in a listener\n if (!interaction.interacting()) { return false; }\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n firePrepared(interaction, event, 'end');\n});\n\nfunction firePrepared (interaction, event, phase, preEnd) {\n const actionName = interaction.prepared.name;\n\n const newEvent = new InteractEvent(interaction, event, actionName, phase, interaction.element, null, preEnd);\n\n interaction.target.fire(newEvent);\n interaction.prevEvent = newEvent;\n}\n\nmodule.exports = actions;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drag = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n startAxis : 'xy',\n lockAxis : 'xy',\n },\n\n checker: function (pointer, event, interactable) {\n const dragOptions = interactable.options.drag;\n\n return dragOptions.enabled\n ? { name: 'drag', axis: (dragOptions.lockAxis === 'start'\n ? dragOptions.startAxis\n : dragOptions.lockAxis)}\n : null;\n },\n\n getCursor: function () {\n return 'move';\n },\n};\n\nInteraction.signals.on('before-action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n interaction.curCoords.page.y = interaction.startCoords.page.y;\n interaction.curCoords.client.y = interaction.startCoords.client.y;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vx);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vx);\n interaction.pointerDelta.client.vy = 0;\n interaction.pointerDelta.page.vy = 0;\n }\n else if (axis === 'y') {\n interaction.curCoords.page.x = interaction.startCoords.page.x;\n interaction.curCoords.client.x = interaction.startCoords.client.x;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vy);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vy);\n interaction.pointerDelta.client.vx = 0;\n interaction.pointerDelta.page.vx = 0;\n }\n});\n\n// dragmove\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'dragmove') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n iEvent.pageY = interaction.startCoords.page.y;\n iEvent.clientY = interaction.startCoords.client.y;\n iEvent.dy = 0;\n }\n else if (axis === 'y') {\n iEvent.pageX = interaction.startCoords.page.x;\n iEvent.clientX = interaction.startCoords.client.x;\n iEvent.dx = 0;\n }\n});\n\n/*\\\n * Interactable.draggable\n [ method ]\n *\n * Gets or sets whether drag actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of drag events\n | var isDraggable = interact('ul li').draggable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on drag events (object makes the Interactable draggable)\n = (object) This Interactable\n | interact(element).draggable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // the axis in which the first movement must be\n | // for the drag sequence to start\n | // 'xy' by default - any direction\n | startAxis: 'x' || 'y' || 'xy',\n |\n | // 'xy' by default - don't restrict to one axis (move in any direction)\n | // 'x' or 'y' to restrict movement to either axis\n | // 'start' to restrict movement to the axis the drag started in\n | lockAxis: 'x' || 'y' || 'xy' || 'start',\n |\n | // max number of drags that can happen concurrently\n | // with elements of this Interactable. Infinity by default\n | max: Infinity,\n |\n | // max number of drags that can target the same element+Interactable\n | // 1 by default\n | maxPerElement: 2\n | });\n\\*/\nInteractable.prototype.draggable = function (options) {\n if (utils.is.object(options)) {\n this.options.drag.enabled = options.enabled === false? false: true;\n this.setPerAction('drag', options);\n this.setOnEvents('drag', options);\n\n if (/^(xy|x|y|start)$/.test(options.lockAxis)) {\n this.options.drag.lockAxis = options.lockAxis;\n }\n if (/^(xy|x|y)$/.test(options.startAxis)) {\n this.options.drag.startAxis = options.startAxis;\n }\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drag.enabled = options;\n\n if (!options) {\n this.ondragstart = this.ondragstart = this.ondragend = null;\n }\n\n return this;\n }\n\n return this.options.drag;\n};\n\nactions.drag = drag;\nactions.names.push('drag');\nutils.merge(Interactable.eventTypes, [\n 'dragstart',\n 'dragmove',\n 'draginertiastart',\n 'draginertiaresume',\n 'dragend',\n]);\nactions.methodDict.drag = 'draggable';\n\ndefaultOptions.drag = drag.defaults;\n\nmodule.exports = drag;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst scope = require('../scope');\nconst interact = require('../interact');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drop = {\n defaults: {\n enabled: false,\n accept : null,\n overlap: 'pointer',\n },\n};\n\nlet dynamicDrop = false;\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // reset active dropzones\n interaction.activeDrops.dropzones = [];\n interaction.activeDrops.elements = [];\n interaction.activeDrops.rects = [];\n\n interaction.dropEvents = null;\n\n if (!interaction.dynamicDrop) {\n setActiveDrops(interaction, interaction.element);\n }\n\n const dragEvent = interaction.prevEvent;\n const dropEvents = getDropEvents(interaction, event, dragEvent);\n\n if (dropEvents.activate) {\n fireActiveDrops(interaction, dropEvents.activate);\n }\n});\n\nInteractEvent.signals.on('new', function ({ interaction, iEvent, event }) {\n if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { return; }\n\n const draggableElement = interaction.element;\n const dragEvent = iEvent;\n const dropResult = getDrop(dragEvent, event, draggableElement);\n\n interaction.dropTarget = dropResult.dropzone;\n interaction.dropElement = dropResult.element;\n\n interaction.dropEvents = getDropEvents(interaction, event, dragEvent);\n});\n\nInteraction.signals.on('action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n fireDropEvents(interaction, interaction.dropEvents);\n});\n\nInteraction.signals.on('action-end', function ({ interaction }) {\n if (interaction.prepared.name === 'drag') {\n fireDropEvents(interaction, interaction.dropEvents);\n }\n});\n\nInteraction.signals.on('stop-drag', function ({ interaction }) {\n interaction.activeDrops.dropzones =\n interaction.activeDrops.elements =\n interaction.activeDrops.rects =\n interaction.dropEvents = null;\n});\n\nfunction collectDrops (interaction, element) {\n const drops = [];\n const elements = [];\n\n element = element || interaction.element;\n\n // collect all dropzones and their elements which qualify for a drop\n for (const current of scope.interactables) {\n if (!current.options.drop.enabled) { continue; }\n\n const accept = current.options.drop.accept;\n\n // test the draggable element against the dropzone's accept setting\n if ((utils.is.element(accept) && accept !== element)\n || (utils.is.string(accept)\n && !utils.matchesSelector(element, accept))) {\n\n continue;\n }\n\n // query for new elements if necessary\n const dropElements = utils.is.string(current.target)\n ? current._context.querySelectorAll(current.target)\n : [current.target];\n\n for (let i = 0; i < dropElements.length; i++) {\n const currentElement = dropElements[i];\n\n if (currentElement !== element) {\n drops.push(current);\n elements.push(currentElement);\n }\n }\n }\n\n return {\n elements,\n dropzones: drops,\n };\n}\n\nfunction fireActiveDrops (interaction, event) {\n let prevElement;\n\n // loop through all active dropzones and trigger event\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n const current = interaction.activeDrops.dropzones[i];\n const currentElement = interaction.activeDrops.elements [i];\n\n // prevent trigger of duplicate events on same element\n if (currentElement !== prevElement) {\n // set current element as event target\n event.target = currentElement;\n current.fire(event);\n }\n prevElement = currentElement;\n }\n}\n\n// Collect a new set of possible drops and save them in activeDrops.\n// setActiveDrops should always be called when a drag has just started or a\n// drag event happens while dynamicDrop is true\nfunction setActiveDrops (interaction, dragElement) {\n // get dropzones and their elements that could receive the draggable\n const possibleDrops = collectDrops(interaction, dragElement, true);\n\n interaction.activeDrops.dropzones = possibleDrops.dropzones;\n interaction.activeDrops.elements = possibleDrops.elements;\n interaction.activeDrops.rects = [];\n\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n interaction.activeDrops.rects[i] =\n interaction.activeDrops.dropzones[i].getRect(interaction.activeDrops.elements[i]);\n }\n}\n\nfunction getDrop (dragEvent, event, dragElement) {\n const interaction = dragEvent.interaction;\n const validDrops = [];\n\n if (dynamicDrop) {\n setActiveDrops(interaction, dragElement);\n }\n\n // collect all dropzones and their elements which qualify for a drop\n for (let j = 0; j < interaction.activeDrops.dropzones.length; j++) {\n const current = interaction.activeDrops.dropzones[j];\n const currentElement = interaction.activeDrops.elements [j];\n const rect = interaction.activeDrops.rects [j];\n\n validDrops.push(current.dropCheck(dragEvent, event, interaction.target, dragElement, currentElement, rect)\n ? currentElement\n : null);\n }\n\n // get the most appropriate dropzone based on DOM depth and order\n const dropIndex = utils.indexOfDeepestElement(validDrops);\n\n return {\n dropzone: interaction.activeDrops.dropzones[dropIndex] || null,\n element : interaction.activeDrops.elements [dropIndex] || null,\n };\n}\n\nfunction getDropEvents (interaction, pointerEvent, dragEvent) {\n const dropEvents = {\n enter : null,\n leave : null,\n activate : null,\n deactivate: null,\n move : null,\n drop : null,\n };\n\n const tmpl = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n };\n\n if (interaction.dropElement !== interaction.prevDropElement) {\n // if there was a prevDropTarget, create a dragleave event\n if (interaction.prevDropTarget) {\n dropEvents.leave = utils.extend({ type: 'dragleave' }, tmpl);\n\n dragEvent.dragLeave = dropEvents.leave.target = interaction.prevDropElement;\n dragEvent.prevDropzone = dropEvents.leave.dropzone = interaction.prevDropTarget;\n }\n // if the dropTarget is not null, create a dragenter event\n if (interaction.dropTarget) {\n dropEvents.enter = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n type : 'dragenter',\n };\n\n dragEvent.dragEnter = interaction.dropElement;\n dragEvent.dropzone = interaction.dropTarget;\n }\n }\n\n if (dragEvent.type === 'dragend' && interaction.dropTarget) {\n dropEvents.drop = utils.extend({ type: 'drop' }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n dragEvent.relatedTarget = interaction.dropElement;\n }\n if (dragEvent.type === 'dragstart') {\n dropEvents.activate = utils.extend({ type: 'dropactivate' }, tmpl);\n\n dropEvents.activate.target = null;\n dropEvents.activate.dropzone = null;\n }\n if (dragEvent.type === 'dragend') {\n dropEvents.deactivate = utils.extend({ type: 'dropdeactivate' }, tmpl);\n\n dropEvents.deactivate.target = null;\n dropEvents.deactivate.dropzone = null;\n }\n if (dragEvent.type === 'dragmove' && interaction.dropTarget) {\n dropEvents.move = utils.extend({\n dragmove : dragEvent,\n type : 'dropmove',\n }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n }\n\n return dropEvents;\n}\n\nfunction fireDropEvents (interaction, dropEvents) {\n if (dropEvents.leave) { interaction.prevDropTarget.fire(dropEvents.leave); }\n if (dropEvents.move ) { interaction.dropTarget.fire(dropEvents.move ); }\n if (dropEvents.enter) { interaction.dropTarget.fire(dropEvents.enter); }\n if (dropEvents.drop ) { interaction.dropTarget.fire(dropEvents.drop ); }\n if (dropEvents.deactivate) {\n fireActiveDrops(interaction, dropEvents.deactivate);\n }\n\n interaction.prevDropTarget = interaction.dropTarget;\n interaction.prevDropElement = interaction.dropElement;\n}\n\n/*\\\n * Interactable.dropzone\n [ method ]\n *\n * Returns or sets whether elements can be dropped onto this\n * Interactable to trigger drop events\n *\n * Dropzones can receive the following events:\n * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends\n * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone\n * - `dragmove` when a draggable that has entered the dropzone is moved\n * - `drop` when a draggable is dropped into this dropzone\n *\n * Use the `accept` option to allow only elements that match the given CSS\n * selector or element. The value can be:\n *\n * - **an Element** - only that element can be dropped into this dropzone.\n * - **a string**, - the element being dragged must match it as a CSS selector.\n * - **`null`** - accept options is cleared - it accepts any element.\n *\n * Use the `overlap` option to set how drops are checked for. The allowed\n * values are:\n *\n * - `'pointer'`, the pointer must be over the dropzone (default)\n * - `'center'`, the draggable element's center must be over the dropzone\n * - a number from 0-1 which is the `(intersection area) / (draggable area)`.\n * e.g. `0.5` for drop to happen when half of the area of the draggable is\n * over the dropzone\n *\n * Use the `checker` option to specify a function to check if a dragged\n * element is over this Interactable.\n *\n | interact(target)\n | .dropChecker(function(dragEvent, // related dragmove or dragend event\n | event, // TouchEvent/PointerEvent/MouseEvent\n | dropped, // bool result of the default checker\n | dropzone, // dropzone Interactable\n | dropElement, // dropzone elemnt\n | draggable, // draggable Interactable\n | draggableElement) {// draggable element\n |\n | return dropped && event.target.hasAttribute('allow-drop');\n | }\n *\n *\n - options (boolean | object | null) #optional The new value to be set.\n | interact('.drop').dropzone({\n | accept: '.can-drop' || document.getElementById('single-drop'),\n | overlap: 'pointer' || 'center' || zeroToOne\n | }\n = (boolean | object) The current setting or this Interactable\n\\*/\nInteractable.prototype.dropzone = function (options) {\n if (utils.is.object(options)) {\n this.options.drop.enabled = options.enabled === false? false: true;\n\n if (utils.is.function(options.ondrop) ) { this.events.ondrop = options.ondrop ; }\n if (utils.is.function(options.ondropactivate) ) { this.events.ondropactivate = options.ondropactivate ; }\n if (utils.is.function(options.ondropdeactivate)) { this.events.ondropdeactivate = options.ondropdeactivate; }\n if (utils.is.function(options.ondragenter) ) { this.events.ondragenter = options.ondragenter ; }\n if (utils.is.function(options.ondragleave) ) { this.events.ondragleave = options.ondragleave ; }\n if (utils.is.function(options.ondropmove) ) { this.events.ondropmove = options.ondropmove ; }\n\n if (/^(pointer|center)$/.test(options.overlap)) {\n this.options.drop.overlap = options.overlap;\n }\n else if (utils.is.number(options.overlap)) {\n this.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0);\n }\n if ('accept' in options) {\n this.options.drop.accept = options.accept;\n }\n if ('checker' in options) {\n this.options.drop.checker = options.checker;\n }\n\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drop.enabled = options;\n\n if (!options) {\n this.ondragenter = this.ondragleave = this.ondrop\n = this.ondropactivate = this.ondropdeactivate = null;\n }\n\n return this;\n }\n\n return this.options.drop;\n};\n\nInteractable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) {\n let dropped = false;\n\n // if the dropzone has no rect (eg. display: none)\n // call the custom dropChecker or just return false\n if (!(rect = rect || this.getRect(dropElement))) {\n return (this.options.drop.checker\n ? this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement)\n : false);\n }\n\n const dropOverlap = this.options.drop.overlap;\n\n if (dropOverlap === 'pointer') {\n const origin = utils.getOriginXY(draggable, draggableElement, 'drag');\n const page = utils.getPageXY(dragEvent);\n\n page.x += origin.x;\n page.y += origin.y;\n\n const horizontal = (page.x > rect.left) && (page.x < rect.right);\n const vertical = (page.y > rect.top ) && (page.y < rect.bottom);\n\n dropped = horizontal && vertical;\n }\n\n const dragRect = draggable.getRect(draggableElement);\n\n if (dragRect && dropOverlap === 'center') {\n const cx = dragRect.left + dragRect.width / 2;\n const cy = dragRect.top + dragRect.height / 2;\n\n dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom;\n }\n\n if (dragRect && utils.is.number(dropOverlap)) {\n const overlapArea = (Math.max(0, Math.min(rect.right , dragRect.right ) - Math.max(rect.left, dragRect.left))\n * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top , dragRect.top )));\n\n const overlapRatio = overlapArea / (dragRect.width * dragRect.height);\n\n dropped = overlapRatio >= dropOverlap;\n }\n\n if (this.options.drop.checker) {\n dropped = this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement);\n }\n\n return dropped;\n};\n\nInteractable.signals.on('unset', function ({ interactable }) {\n interactable.dropzone(false);\n});\n\nInteractable.settingsMethods.push('dropChecker');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.dropTarget = null; // the dropzone a drag target might be dropped into\n interaction.dropElement = null; // the element at the time of checking\n interaction.prevDropTarget = null; // the dropzone that was recently dragged away from\n interaction.prevDropElement = null; // the element at the time of checking\n interaction.dropEvents = null; // the dropEvents related to the current drag event\n\n interaction.activeDrops = {\n dropzones: [], // the dropzones that are mentioned below\n elements : [], // elements of dropzones that accept the target draggable\n rects : [], // the rects of the elements mentioned above\n };\n\n});\n\nInteraction.signals.on('stop', function ({ interaction }) {\n interaction.dropTarget = interaction.dropElement =\n interaction.prevDropTarget = interaction.prevDropElement = null;\n});\n\n/*\\\n * interact.dynamicDrop\n [ method ]\n *\n * Returns or sets whether the dimensions of dropzone elements are\n * calculated on every dragmove or only on dragstart for the default\n * dropChecker\n *\n - newValue (boolean) #optional True to check on each move. False to check only before start\n = (boolean | interact) The current setting or interact\n\\*/\ninteract.dynamicDrop = function (newValue) {\n if (utils.is.bool(newValue)) {\n //if (dragging && dynamicDrop !== newValue && !newValue) {\n //calcRects(dropzones);\n //}\n\n dynamicDrop = newValue;\n\n return interact;\n }\n return dynamicDrop;\n};\n\nutils.merge(Interactable.eventTypes, [\n 'dragenter',\n 'dragleave',\n 'dropactivate',\n 'dropdeactivate',\n 'dropmove',\n 'drop',\n]);\nactions.methodDict.drop = 'dropzone';\n\ndefaultOptions.drop = drop.defaults;\n\nmodule.exports = drop;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst gesture = {\n defaults: {\n enabled : false,\n origin : null,\n restrict: null,\n },\n\n checker: function (pointer, event, interactable, element, interaction) {\n if (interaction.pointerIds.length >= 2) {\n return { name: 'gesture' };\n }\n\n return null;\n },\n\n getCursor: function () {\n return '';\n },\n};\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturestart') { return; }\n iEvent.ds = 0;\n\n interaction.gesture.startDistance = interaction.gesture.prevDistance = iEvent.distance;\n interaction.gesture.startAngle = interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.scale = 1;\n});\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturemove') { return; }\n\n iEvent.ds = iEvent.scale - interaction.gesture.scale;\n\n interaction.target.fire(iEvent);\n\n interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.prevDistance = iEvent.distance;\n\n if (iEvent.scale !== Infinity\n && iEvent.scale !== null\n && iEvent.scale !== undefined\n && !isNaN(iEvent.scale)) {\n\n interaction.gesture.scale = iEvent.scale;\n }\n});\n\n/*\\\n * Interactable.gesturable\n [ method ]\n *\n * Gets or sets whether multitouch gestures can be performed on the\n * Interactable's element\n *\n = (boolean) Indicates if this can be the target of gesture events\n | var isGestureable = interact(element).gesturable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on gesture events (makes the Interactable gesturable)\n = (object) this Interactable\n | interact(element).gesturable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // limit multiple gestures.\n | // See the explanation in @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n\\*/\nInteractable.prototype.gesturable = function (options) {\n if (utils.is.object(options)) {\n this.options.gesture.enabled = options.enabled === false? false: true;\n this.setPerAction('gesture', options);\n this.setOnEvents('gesture', options);\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.gesture.enabled = options;\n\n if (!options) {\n this.ongesturestart = this.ongesturestart = this.ongestureend = null;\n }\n\n return this;\n }\n\n return this.options.gesture;\n};\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action, event, starting, ending, deltaSource }) {\n if (action !== 'gesture') { return; }\n\n const pointers = interaction.pointers;\n\n iEvent.touches = [pointers[0], pointers[1]];\n\n if (starting) {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = 1;\n iEvent.ds = 0;\n iEvent.angle = utils.touchAngle(pointers, undefined, deltaSource);\n iEvent.da = 0;\n }\n else if (ending || event instanceof InteractEvent) {\n iEvent.distance = interaction.prevEvent.distance;\n iEvent.box = interaction.prevEvent.box;\n iEvent.scale = interaction.prevEvent.scale;\n iEvent.ds = iEvent.scale - 1;\n iEvent.angle = interaction.prevEvent.angle;\n iEvent.da = iEvent.angle - interaction.gesture.startAngle;\n }\n else {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = iEvent.distance / interaction.gesture.startDistance;\n iEvent.angle = utils.touchAngle(pointers, interaction.gesture.prevAngle, deltaSource);\n\n iEvent.ds = iEvent.scale - interaction.gesture.prevScale;\n iEvent.da = iEvent.angle - interaction.gesture.prevAngle;\n }\n});\n\nInteraction.signals.on('new', function (interaction) {\n interaction.gesture = {\n start: { x: 0, y: 0 },\n\n startDistance: 0, // distance between two touches of touchStart\n prevDistance : 0,\n distance : 0,\n\n scale: 1, // gesture.distance / gesture.startDistance\n\n startAngle: 0, // angle of line joining two touches\n prevAngle : 0, // angle of the previous gesture event\n };\n});\n\nactions.gesture = gesture;\nactions.names.push('gesture');\nutils.merge(Interactable.eventTypes, [\n 'gesturestart',\n 'gesturemove',\n 'gestureend',\n]);\nactions.methodDict.gesture = 'gesturable';\n\ndefaultOptions.gesture = gesture.defaults;\n\nmodule.exports = gesture;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\n// Less Precision with touch input\nconst defaultMargin = browser.supportsTouch || browser.supportsPointerEvent? 20: 10;\n\nconst resize = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n square: false,\n preserveAspectRatio: false,\n axis: 'xy',\n\n // use default margin\n margin: NaN,\n\n // object with props left, right, top, bottom which are\n // true/false values to resize when the pointer is over that edge,\n // CSS selectors to match the handles for each direction\n // or the Elements for each handle\n edges: null,\n\n // a value of 'none' will limit the resize rect to a minimum of 0x0\n // 'negate' will alow the rect to have negative width/height\n // 'reposition' will keep the width/height positive by swapping\n // the top and bottom edges and/or swapping the left and right edges\n invert: 'none',\n },\n\n checker: function (pointer, event, interactable, element, interaction, rect) {\n if (!rect) { return null; }\n\n const page = utils.extend({}, interaction.curCoords.page);\n const options = interactable.options;\n\n if (options.resize.enabled) {\n const resizeOptions = options.resize;\n const resizeEdges = { left: false, right: false, top: false, bottom: false };\n\n // if using resize.edges\n if (utils.is.object(resizeOptions.edges)) {\n for (const edge in resizeEdges) {\n resizeEdges[edge] = checkResizeEdge(edge,\n resizeOptions.edges[edge],\n page,\n interaction._eventTarget,\n element,\n rect,\n resizeOptions.margin || defaultMargin);\n }\n\n resizeEdges.left = resizeEdges.left && !resizeEdges.right;\n resizeEdges.top = resizeEdges.top && !resizeEdges.bottom;\n\n if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) {\n return {\n name: 'resize',\n edges: resizeEdges,\n };\n }\n }\n else {\n const right = options.resize.axis !== 'y' && page.x > (rect.right - defaultMargin);\n const bottom = options.resize.axis !== 'x' && page.y > (rect.bottom - defaultMargin);\n\n if (right || bottom) {\n return {\n name: 'resize',\n axes: (right? 'x' : '') + (bottom? 'y' : ''),\n };\n }\n }\n }\n\n return null;\n },\n\n cursors: (browser.isIe9OrOlder ? {\n x : 'e-resize',\n y : 's-resize',\n xy: 'se-resize',\n\n top : 'n-resize',\n left : 'w-resize',\n bottom : 's-resize',\n right : 'e-resize',\n topleft : 'se-resize',\n bottomright: 'se-resize',\n topright : 'ne-resize',\n bottomleft : 'ne-resize',\n } : {\n x : 'ew-resize',\n y : 'ns-resize',\n xy: 'nwse-resize',\n\n top : 'ns-resize',\n left : 'ew-resize',\n bottom : 'ns-resize',\n right : 'ew-resize',\n topleft : 'nwse-resize',\n bottomright: 'nwse-resize',\n topright : 'nesw-resize',\n bottomleft : 'nesw-resize',\n }),\n\n getCursor: function (action) {\n if (action.axis) {\n return resize.cursors[action.name + action.axis];\n }\n else if (action.edges) {\n let cursorKey = '';\n const edgeNames = ['top', 'bottom', 'left', 'right'];\n\n for (let i = 0; i < 4; i++) {\n if (action.edges[edgeNames[i]]) {\n cursorKey += edgeNames[i];\n }\n }\n\n return resize.cursors[cursorKey];\n }\n },\n};\n\n// resizestart\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'resizestart' || !interaction.prepared.edges) {\n return;\n }\n\n const startRect = interaction.target.getRect(interaction.element);\n const resizeOptions = interaction.target.options.resize;\n\n /*\n * When using the `resizable.square` or `resizable.preserveAspectRatio` options, resizing from one edge\n * will affect another. E.g. with `resizable.square`, resizing to make the right edge larger will make\n * the bottom edge larger by the same amount. We call these 'linked' edges. Any linked edges will depend\n * on the active edges and the edge being interacted with.\n */\n if (resizeOptions.square || resizeOptions.preserveAspectRatio) {\n const linkedEdges = utils.extend({}, interaction.prepared.edges);\n\n linkedEdges.top = linkedEdges.top || (linkedEdges.left && !linkedEdges.bottom);\n linkedEdges.left = linkedEdges.left || (linkedEdges.top && !linkedEdges.right );\n linkedEdges.bottom = linkedEdges.bottom || (linkedEdges.right && !linkedEdges.top );\n linkedEdges.right = linkedEdges.right || (linkedEdges.bottom && !linkedEdges.left );\n\n interaction.prepared._linkedEdges = linkedEdges;\n }\n else {\n interaction.prepared._linkedEdges = null;\n }\n\n // if using `resizable.preserveAspectRatio` option, record aspect ratio at the start of the resize\n if (resizeOptions.preserveAspectRatio) {\n interaction.resizeStartAspectRatio = startRect.width / startRect.height;\n }\n\n interaction.resizeRects = {\n start : startRect,\n current : utils.extend({}, startRect),\n inverted : utils.extend({}, startRect),\n previous : utils.extend({}, startRect),\n delta : {\n left: 0, right : 0, width : 0,\n top : 0, bottom: 0, height: 0,\n },\n };\n\n iEvent.rect = interaction.resizeRects.inverted;\n iEvent.deltaRect = interaction.resizeRects.delta;\n});\n\n// resizemove\nInteractEvent.signals.on('new', function ({ iEvent, phase, interaction }) {\n if (phase !== 'move' || !interaction.prepared.edges) { return; }\n\n const resizeOptions = interaction.target.options.resize;\n const invert = resizeOptions.invert;\n const invertible = invert === 'reposition' || invert === 'negate';\n\n let edges = interaction.prepared.edges;\n\n const start = interaction.resizeRects.start;\n const current = interaction.resizeRects.current;\n const inverted = interaction.resizeRects.inverted;\n const delta = interaction.resizeRects.delta;\n const previous = utils.extend(interaction.resizeRects.previous, inverted);\n const originalEdges = edges;\n\n let dx = iEvent.dx;\n let dy = iEvent.dy;\n\n if (resizeOptions.preserveAspectRatio || resizeOptions.square) {\n // `resize.preserveAspectRatio` takes precedence over `resize.square`\n const startAspectRatio = resizeOptions.preserveAspectRatio\n ? interaction.resizeStartAspectRatio\n : 1;\n\n edges = interaction.prepared._linkedEdges;\n\n if ((originalEdges.left && originalEdges.bottom)\n || (originalEdges.right && originalEdges.top)) {\n dy = -dx / startAspectRatio;\n }\n else if (originalEdges.left || originalEdges.right ) { dy = dx / startAspectRatio; }\n else if (originalEdges.top || originalEdges.bottom) { dx = dy * startAspectRatio; }\n }\n\n // update the 'current' rect without modifications\n if (edges.top ) { current.top += dy; }\n if (edges.bottom) { current.bottom += dy; }\n if (edges.left ) { current.left += dx; }\n if (edges.right ) { current.right += dx; }\n\n if (invertible) {\n // if invertible, copy the current rect\n utils.extend(inverted, current);\n\n if (invert === 'reposition') {\n // swap edge values if necessary to keep width/height positive\n let swap;\n\n if (inverted.top > inverted.bottom) {\n swap = inverted.top;\n\n inverted.top = inverted.bottom;\n inverted.bottom = swap;\n }\n if (inverted.left > inverted.right) {\n swap = inverted.left;\n\n inverted.left = inverted.right;\n inverted.right = swap;\n }\n }\n }\n else {\n // if not invertible, restrict to minimum of 0x0 rect\n inverted.top = Math.min(current.top, start.bottom);\n inverted.bottom = Math.max(current.bottom, start.top);\n inverted.left = Math.min(current.left, start.right);\n inverted.right = Math.max(current.right, start.left);\n }\n\n inverted.width = inverted.right - inverted.left;\n inverted.height = inverted.bottom - inverted.top ;\n\n for (const edge in inverted) {\n delta[edge] = inverted[edge] - previous[edge];\n }\n\n iEvent.edges = interaction.prepared.edges;\n iEvent.rect = inverted;\n iEvent.deltaRect = delta;\n});\n\n/*\\\n * Interactable.resizable\n [ method ]\n *\n * Gets or sets whether resize actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of resize elements\n | var isResizeable = interact('input[type=text]').resizable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on resize events (object makes the Interactable resizable)\n = (object) This Interactable\n | interact(element).resizable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | edges: {\n | top : true, // Use pointer coords to check for resize.\n | left : false, // Disable resizing from left edge.\n | bottom: '.resize-s',// Resize if pointer target matches selector\n | right : handleEl // Resize if pointer target is the given Element\n | },\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height are adjusted at a 1:1 ratio.\n | square: false,\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height maintain the aspect ratio they had when resizing started.\n | preserveAspectRatio: false,\n |\n | // a value of 'none' will limit the resize rect to a minimum of 0x0\n | // 'negate' will allow the rect to have negative width/height\n | // 'reposition' will keep the width/height positive by swapping\n | // the top and bottom edges and/or swapping the left and right edges\n | invert: 'none' || 'negate' || 'reposition'\n |\n | // limit multiple resizes.\n | // See the explanation in the @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n \\*/\nInteractable.prototype.resizable = function (options) {\n if (utils.is.object(options)) {\n this.options.resize.enabled = options.enabled === false? false: true;\n this.setPerAction('resize', options);\n this.setOnEvents('resize', options);\n\n if (/^x$|^y$|^xy$/.test(options.axis)) {\n this.options.resize.axis = options.axis;\n }\n else if (options.axis === null) {\n this.options.resize.axis = defaultOptions.resize.axis;\n }\n\n if (utils.is.bool(options.preserveAspectRatio)) {\n this.options.resize.preserveAspectRatio = options.preserveAspectRatio;\n }\n else if (utils.is.bool(options.square)) {\n this.options.resize.square = options.square;\n }\n\n return this;\n }\n if (utils.is.bool(options)) {\n this.options.resize.enabled = options;\n\n if (!options) {\n this.onresizestart = this.onresizestart = this.onresizeend = null;\n }\n\n return this;\n }\n return this.options.resize;\n};\n\nfunction checkResizeEdge (name, value, page, element, interactableElement, rect, margin) {\n // false, '', undefined, null\n if (!value) { return false; }\n\n // true value, use pointer coords and element rect\n if (value === true) {\n // if dimensions are negative, \"switch\" edges\n const width = utils.is.number(rect.width )? rect.width : rect.right - rect.left;\n const height = utils.is.number(rect.height)? rect.height : rect.bottom - rect.top ;\n\n if (width < 0) {\n if (name === 'left' ) { name = 'right'; }\n else if (name === 'right') { name = 'left' ; }\n }\n if (height < 0) {\n if (name === 'top' ) { name = 'bottom'; }\n else if (name === 'bottom') { name = 'top' ; }\n }\n\n if (name === 'left' ) { return page.x < ((width >= 0? rect.left: rect.right ) + margin); }\n if (name === 'top' ) { return page.y < ((height >= 0? rect.top : rect.bottom) + margin); }\n\n if (name === 'right' ) { return page.x > ((width >= 0? rect.right : rect.left) - margin); }\n if (name === 'bottom') { return page.y > ((height >= 0? rect.bottom: rect.top ) - margin); }\n }\n\n // the remaining checks require an element\n if (!utils.is.element(element)) { return false; }\n\n return utils.is.element(value)\n // the value is an element to use as a resize handle\n ? value === element\n // otherwise check if element matches value as selector\n : utils.matchesUpTo(element, value, interactableElement);\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.resizeAxes = 'xy';\n});\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action }) {\n if (action !== 'resize' || !interaction.resizeAxes) { return; }\n\n const options = interaction.target.options;\n\n if (options.resize.square) {\n if (interaction.resizeAxes === 'y') {\n iEvent.dx = iEvent.dy;\n }\n else {\n iEvent.dy = iEvent.dx;\n }\n iEvent.axes = 'xy';\n }\n else {\n iEvent.axes = interaction.resizeAxes;\n\n if (interaction.resizeAxes === 'x') {\n iEvent.dy = 0;\n }\n else if (interaction.resizeAxes === 'y') {\n iEvent.dx = 0;\n }\n }\n});\n\nactions.resize = resize;\nactions.names.push('resize');\nutils.merge(Interactable.eventTypes, [\n 'resizestart',\n 'resizemove',\n 'resizeinertiastart',\n 'resizeinertiaresume',\n 'resizeend',\n]);\nactions.methodDict.resize = 'resizable';\n\ndefaultOptions.resize = resize.defaults;\n\nmodule.exports = resize;\n","const raf = require('./utils/raf');\nconst getWindow = require('./utils/window').getWindow;\nconst is = require('./utils/is');\nconst domUtils = require('./utils/domUtils');\nconst Interaction = require('./Interaction');\nconst defaultOptions = require('./defaultOptions');\n\nconst autoScroll = {\n defaults: {\n enabled : false,\n container: null, // the item that is scrolled (Window or HTMLElement)\n margin : 60,\n speed : 300, // the scroll speed in pixels per second\n },\n\n interaction: null,\n i: null, // the handle returned by window.setInterval\n x: 0, y: 0, // Direction each pulse is to scroll in\n\n isScrolling: false,\n prevTime: 0,\n\n start: function (interaction) {\n autoScroll.isScrolling = true;\n raf.cancel(autoScroll.i);\n\n autoScroll.interaction = interaction;\n autoScroll.prevTime = new Date().getTime();\n autoScroll.i = raf.request(autoScroll.scroll);\n },\n\n stop: function () {\n autoScroll.isScrolling = false;\n raf.cancel(autoScroll.i);\n },\n\n // scroll the window by the values in scroll.x/y\n scroll: function () {\n const options = autoScroll.interaction.target.options[autoScroll.interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(autoScroll.interaction.element);\n const now = new Date().getTime();\n // change in time in seconds\n const dt = (now - autoScroll.prevTime) / 1000;\n // displacement\n const s = options.speed * dt;\n\n if (s >= 1) {\n if (is.window(container)) {\n container.scrollBy(autoScroll.x * s, autoScroll.y * s);\n }\n else if (container) {\n container.scrollLeft += autoScroll.x * s;\n container.scrollTop += autoScroll.y * s;\n }\n\n autoScroll.prevTime = now;\n }\n\n if (autoScroll.isScrolling) {\n raf.cancel(autoScroll.i);\n autoScroll.i = raf.request(autoScroll.scroll);\n }\n },\n check: function (interactable, actionName) {\n const options = interactable.options;\n\n return options[actionName].autoScroll && options[actionName].autoScroll.enabled;\n },\n onInteractionMove: function ({ interaction, pointer }) {\n if (!(interaction.interacting()\n && autoScroll.check(interaction.target, interaction.prepared.name))) {\n return;\n }\n\n if (interaction.simulation) {\n autoScroll.x = autoScroll.y = 0;\n return;\n }\n\n let top;\n let right;\n let bottom;\n let left;\n\n const options = interaction.target.options[interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(interaction.element);\n\n if (is.window(container)) {\n left = pointer.clientX < autoScroll.margin;\n top = pointer.clientY < autoScroll.margin;\n right = pointer.clientX > container.innerWidth - autoScroll.margin;\n bottom = pointer.clientY > container.innerHeight - autoScroll.margin;\n }\n else {\n const rect = domUtils.getElementClientRect(container);\n\n left = pointer.clientX < rect.left + autoScroll.margin;\n top = pointer.clientY < rect.top + autoScroll.margin;\n right = pointer.clientX > rect.right - autoScroll.margin;\n bottom = pointer.clientY > rect.bottom - autoScroll.margin;\n }\n\n autoScroll.x = (right ? 1: left? -1: 0);\n autoScroll.y = (bottom? 1: top? -1: 0);\n\n if (!autoScroll.isScrolling) {\n // set the autoScroll properties to those of the target\n autoScroll.margin = options.margin;\n autoScroll.speed = options.speed;\n\n autoScroll.start(interaction);\n }\n },\n};\n\nInteraction.signals.on('stop-active', function () {\n autoScroll.stop();\n});\n\nInteraction.signals.on('action-move', autoScroll.onInteractionMove);\n\ndefaultOptions.perAction.autoScroll = autoScroll.defaults;\n\nmodule.exports = autoScroll;\n","const Interactable = require('../Interactable');\nconst actions = require('../actions/base');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.ignoreFrom\n [ method ]\n *\n * If the target of the `mousedown`, `pointerdown` or `touchstart`\n * event or any of it's parents match the given CSS selector or\n * Element, no drag/resize/gesture is started.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to not ignore any elements\n = (string | Element | object) The current ignoreFrom value or this Interactable\n **\n | interact(element, { ignoreFrom: document.getElementById('no-action') });\n | // or\n | interact(element).ignoreFrom('input, textarea, a');\n\\*/\nInteractable.prototype.ignoreFrom = function (newValue) {\n return this._backCompatOption('ignoreFrom', newValue);\n};\n\n/*\\\n * Interactable.allowFrom\n [ method ]\n *\n * A drag/resize/gesture is started only If the target of the\n * `mousedown`, `pointerdown` or `touchstart` event or any of it's\n * parents match the given CSS selector or Element.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to allow from any element\n = (string | Element | object) The current allowFrom value or this Interactable\n **\n | interact(element, { allowFrom: document.getElementById('drag-handle') });\n | // or\n | interact(element).allowFrom('.handle');\n\\*/\nInteractable.prototype.allowFrom = function (newValue) {\n return this._backCompatOption('allowFrom', newValue);\n};\n\nInteractable.prototype.testIgnore = function (ignoreFrom, interactableElement, element) {\n if (!ignoreFrom || !is.element(element)) { return false; }\n\n if (is.string(ignoreFrom)) {\n return domUtils.matchesUpTo(element, ignoreFrom, interactableElement);\n }\n else if (is.element(ignoreFrom)) {\n return domUtils.nodeContains(ignoreFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testAllow = function (allowFrom, interactableElement, element) {\n if (!allowFrom) { return true; }\n\n if (!is.element(element)) { return false; }\n\n if (is.string(allowFrom)) {\n return domUtils.matchesUpTo(element, allowFrom, interactableElement);\n }\n else if (is.element(allowFrom)) {\n return domUtils.nodeContains(allowFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testIgnoreAllow = function (options, interactableElement, eventTarget) {\n return (!this.testIgnore(options.ignoreFrom, interactableElement, eventTarget)\n && this.testAllow(options.allowFrom, interactableElement, eventTarget));\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (event.buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\n","const interact = require('../interact');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst actions = require('../actions/base');\nconst defaultOptions = require('../defaultOptions');\nconst browser = require('../utils/browser');\nconst scope = require('../scope');\nconst utils = require('../utils');\nconst signals = require('../utils/Signals').new();\n\nrequire('./InteractableMethods');\n\nconst autoStart = {\n signals,\n withinInteractionLimit,\n // Allow this many interactions to happen simultaneously\n maxInteractions: Infinity,\n defaults: {\n perAction: {\n manualStart: false,\n max: Infinity,\n maxPerElement: 1,\n allowFrom: null,\n ignoreFrom: null,\n },\n },\n setActionDefaults: function (action) {\n utils.extend(action.defaults, autoStart.defaults.perAction);\n },\n};\n\n// set cursor style on mousedown\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget }) {\n if (interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\n// set cursor style on mousemove\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget }) {\n if (!interaction.mouse\n || interaction.pointerIsDown\n || interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\nInteraction.signals.on('move', function (arg) {\n const { interaction, event } = arg;\n\n if (!interaction.pointerIsDown\n || interaction.interacting()\n || !interaction.pointerWasMoved\n || !interaction.prepared.name) {\n return;\n }\n\n signals.fire('before-start', arg);\n\n const target = interaction.target;\n\n if (interaction.prepared.name && target) {\n // check manualStart and interaction limit\n if (target.options[interaction.prepared.name].manualStart\n || !withinInteractionLimit(target, interaction.element, interaction.prepared)) {\n interaction.stop(event);\n }\n else {\n interaction.start(interaction.prepared, target, interaction.element);\n }\n }\n});\n\n// Check if the current target supports the action.\n// If so, return the validated action. Otherwise, return null\nfunction validateAction (action, interactable, element, eventTarget) {\n if (utils.is.object(action)\n && interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget)\n && interactable.options[action.name].enabled\n && withinInteractionLimit(interactable, element, action)) {\n return action;\n }\n\n return null;\n}\n\nfunction validateSelector (interaction, pointer, event, matches, matchElements, eventTarget) {\n for (let i = 0, len = matches.length; i < len; i++) {\n const match = matches[i];\n const matchElement = matchElements[i];\n const action = validateAction(match.getAction(pointer, event, interaction, matchElement),\n match,\n matchElement,\n eventTarget);\n\n if (action) {\n return {\n action,\n target: match,\n element: matchElement,\n };\n }\n }\n\n return {};\n}\n\nfunction getActionInfo (interaction, pointer, event, eventTarget) {\n let matches = [];\n let matchElements = [];\n\n let element = eventTarget;\n let action = null;\n\n function pushMatches (interactable, selector, context) {\n const elements = (browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined);\n\n if (utils.matchesSelector(element, selector, elements)) {\n\n matches.push(interactable);\n matchElements.push(element);\n }\n }\n\n while (utils.is.element(element)) {\n matches = [];\n matchElements = [];\n\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && (action = validateAction(elementInteractable.getAction(pointer, event, interaction, element, eventTarget),\n elementInteractable,\n element,\n eventTarget))\n && !elementInteractable.options[action.name].manualStart) {\n return {\n element,\n action,\n target: elementInteractable,\n };\n }\n else {\n scope.interactables.forEachSelector(pushMatches, element);\n\n const actionInfo = validateSelector(interaction, pointer, event, matches, matchElements, eventTarget);\n\n if (actionInfo.action\n && !actionInfo.target.options[actionInfo.action.name].manualStart) {\n return actionInfo;\n }\n }\n\n element = utils.parentNode(element);\n }\n\n return {};\n}\n\nfunction prepare (interaction, { action, target, element }) {\n action = action || {};\n\n if (interaction.target && interaction.target.options.styleCursor) {\n interaction.target._doc.documentElement.style.cursor = '';\n }\n\n interaction.target = target;\n interaction.element = element;\n utils.copyAction(interaction.prepared, action);\n\n if (target && target.options.styleCursor) {\n const cursor = action? actions[action.name].getCursor(action) : '';\n interaction.target._doc.documentElement.style.cursor = cursor;\n }\n\n signals.fire('prepared', { interaction: interaction });\n}\n\nInteraction.signals.on('stop', function ({ interaction }) {\n const target = interaction.target;\n\n if (target && target.options.styleCursor) {\n target._doc.documentElement.style.cursor = '';\n }\n});\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (utils.is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (utils.is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n const buttons = event.buttons || ({\n 0: 1,\n 1: 4,\n 3: 8,\n 4: 16,\n })[event.button];\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\nfunction withinInteractionLimit (interactable, element, action) {\n const options = interactable.options;\n const maxActions = options[action.name].max;\n const maxPerElement = options[action.name].maxPerElement;\n let activeInteractions = 0;\n let targetCount = 0;\n let targetElementCount = 0;\n\n // no actions if any of these values == 0\n if (!(maxActions && maxPerElement && autoStart.maxInteractions)) { return; }\n\n for (let i = 0, len = scope.interactions.length; i < len; i++) {\n const interaction = scope.interactions[i];\n const otherAction = interaction.prepared.name;\n\n if (!interaction.interacting()) { continue; }\n\n activeInteractions++;\n\n if (activeInteractions >= autoStart.maxInteractions) {\n return false;\n }\n\n if (interaction.target !== interactable) { continue; }\n\n targetCount += (otherAction === action.name)|0;\n\n if (targetCount >= maxActions) {\n return false;\n }\n\n if (interaction.element === element) {\n targetElementCount++;\n\n if (otherAction !== action.name || targetElementCount >= maxPerElement) {\n return false;\n }\n }\n }\n\n return autoStart.maxInteractions > 0;\n}\n\n/*\\\n * interact.maxInteractions\n [ method ]\n **\n * Returns or sets the maximum number of concurrent interactions allowed.\n * By default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables\n * and elements, you need to enable it in the draggable, resizable and\n * gesturable `'max'` and `'maxPerElement'` options.\n **\n - newValue (number) #optional Any number. newValue <= 0 means no interactions.\n\\*/\ninteract.maxInteractions = function (newValue) {\n if (utils.is.number(newValue)) {\n autoStart.maxInteractions = newValue;\n\n return this;\n }\n\n return autoStart.maxInteractions;\n};\n\nInteractable.settingsMethods.push('styleCursor');\nInteractable.settingsMethods.push('actionChecker');\nInteractable.settingsMethods.push('ignoreFrom');\nInteractable.settingsMethods.push('allowFrom');\n\ndefaultOptions.base.actionChecker = null;\ndefaultOptions.base.styleCursor = true;\n\nutils.extend(defaultOptions.perAction, autoStart.defaults.perAction);\n\nmodule.exports = autoStart;\n","const autoStart = require('./base');\nconst Interaction = require('../Interaction');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.delayTimer = null;\n});\n\nautoStart.signals.on('prepared', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.delayTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.target, interaction.element);\n }, delay);\n }\n});\n\nInteraction.signals.on('move', function ({ interaction, duplicate }) {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.delayTimer);\n }\n});\n\n// prevent regular down->move autoStart\nautoStart.signals.on('before-start', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.prepared.name = null;\n }\n});\n","const autoStart = require('./base');\nconst scope = require('../scope');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\n\nconst { matchesSelector, parentNode } = require('../utils/domUtils');\n\nautoStart.setActionDefaults(require('../actions/drag'));\n\nautoStart.signals.on('before-start', function ({ interaction, eventTarget, dx, dy }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // check if a drag is in the correct axis\n const absX = Math.abs(dx);\n const absY = Math.abs(dy);\n const options = interaction.target.options.drag;\n const startAxis = options.startAxis;\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy');\n\n interaction.prepared.axis = options.lockAxis === 'start'\n ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n : options.lockAxis;\n\n // if the movement isn't in the startAxis of the interactable\n if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) {\n // cancel the prepared action\n interaction.prepared.name = null;\n\n // then try to get a drag from another ineractable\n\n if (!interaction.prepared.name) {\n\n let element = eventTarget;\n\n const getDraggable = function (interactable, selector, context) {\n const elements = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n if (interactable === interaction.target) { return; }\n\n if (!options.manualStart\n && !interactable.testIgnoreAllow(options, element, eventTarget)\n && matchesSelector(element, selector, elements)) {\n\n const action = interactable.getAction(interaction.downPointer,\n interaction.downEvent,\n interaction,\n element);\n\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, interactable)\n && autoStart.validateAction(action, interactable, element, eventTarget)) {\n\n return interactable;\n }\n }\n };\n\n let action = null;\n\n // check all interactables\n while (is.element(element)) {\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && elementInteractable !== interaction.target\n && !elementInteractable.options.drag.manualStart) {\n\n action = elementInteractable.getAction(interaction.downPointer, interaction.downEvent, interaction, element);\n }\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, elementInteractable)) {\n\n interaction.prepared.name = 'drag';\n interaction.target = elementInteractable;\n interaction.element = element;\n break;\n }\n\n const selectorInteractable = scope.interactables.forEachSelector(getDraggable, element);\n\n if (selectorInteractable) {\n interaction.prepared.name = 'drag';\n interaction.target = selectorInteractable;\n interaction.element = element;\n break;\n }\n\n element = parentNode(element);\n }\n }\n }\n});\n\nfunction checkStartAxis (startAxis, interactable) {\n if (!interactable) { return false; }\n\n const thisAxis = interactable.options.drag.startAxis;\n\n return (startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis);\n}\n","require('./base').setActionDefaults(require('../actions/gesture'));\n","require('./base').setActionDefaults(require('../actions/resize'));\n","module.exports = {\n base: {\n accept : null,\n preventDefault: 'auto',\n deltaSource : 'page',\n },\n\n perAction: {\n origin: { x: 0, y: 0 },\n\n // only allow left button by default\n // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n mouseButtons: 1,\n\n inertia: {\n enabled : false,\n resistance : 10, // the lambda in exponential decay\n minSpeed : 100, // target speed must be above this for inertia to start\n endSpeed : 10, // the speed at which inertia is slow enough to stop\n allowResume : true, // allow resuming an action in inertia phase\n smoothEndDuration: 300, // animate to snap/restrict endOnly if there's no inertia\n },\n },\n};\n","/* browser entry point */\n\n// Legacy browser support\nrequire('./legacyBrowsers');\n\n// inertia\nrequire('./inertia');\n\n// modifiers\nrequire('./modifiers/snap');\nrequire('./modifiers/restrict');\n\n// pointerEvents\nrequire('./pointerEvents/base');\nrequire('./pointerEvents/holdRepeat');\nrequire('./pointerEvents/interactableTargets');\n\n// delay\nrequire('./autoStart/delay');\n\n// actions\nrequire('./actions/gesture');\nrequire('./actions/resize');\nrequire('./actions/drag');\nrequire('./actions/drop');\n\n// load these modifiers after resize is loaded\nrequire('./modifiers/snapSize');\nrequire('./modifiers/restrictEdges');\nrequire('./modifiers/restrictSize');\n\n// autoStart actions\nrequire('./autoStart/gesture');\nrequire('./autoStart/resize');\nrequire('./autoStart/drag');\n\n// Interactable preventDefault setting\nrequire('./interactablePreventDefault.js');\n\n// autoScroll\nrequire('./autoScroll');\n\n// export interact\nmodule.exports = require('./interact');\n","const InteractEvent = require('./InteractEvent');\nconst Interaction = require('./Interaction');\nconst modifiers = require('./modifiers');\nconst utils = require('./utils');\nconst animationFrame = require('./utils/raf');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.inertiaStatus = {\n active : false,\n smoothEnd : false,\n allowResume: false,\n\n startEvent: null,\n upCoords : {},\n\n xe: 0, ye: 0,\n sx: 0, sy: 0,\n\n t0: 0,\n vx0: 0, vys: 0,\n duration: 0,\n\n lambda_v0: 0,\n one_ve_v0: 0,\n i : null,\n };\n\n interaction.boundInertiaFrame = () => inertiaFrame .apply(interaction);\n interaction.boundSmoothEndFrame = () => smoothEndFrame.apply(interaction);\n});\n\nInteraction.signals.on('down', function ({ interaction, event, pointer, eventTarget }) {\n const status = interaction.inertiaStatus;\n\n // Check if the down event hits the current inertia target\n if (status.active) {\n let element = eventTarget;\n\n // climb up the DOM tree from the event target\n while (utils.is.element(element)) {\n\n // if interaction element is the current inertia target element\n if (element === interaction.element) {\n // stop inertia\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n\n // update pointers to the down event's coordinates\n interaction.updatePointer(pointer);\n utils.setCoords(interaction.curCoords, interaction.pointers);\n\n // fire appropriate signals\n const signalArg = { interaction };\n Interaction.signals.fire('before-action-move', signalArg);\n Interaction.signals.fire('action-resume' , signalArg);\n\n // fire a reume event\n const resumeEvent = new InteractEvent(interaction,\n event,\n interaction.prepared.name,\n 'inertiaresume',\n interaction.element);\n\n interaction.target.fire(resumeEvent);\n interaction.prevEvent = resumeEvent;\n modifiers.resetStatuses(interaction.modifierStatuses);\n\n utils.copyCoords(interaction.prevCoords, interaction.curCoords);\n break;\n }\n\n element = utils.parentNode(element);\n }\n }\n});\n\nInteraction.signals.on('up', function ({ interaction, event }) {\n const status = interaction.inertiaStatus;\n\n if (!interaction.interacting() || status.active) { return; }\n\n const target = interaction.target;\n const options = target && target.options;\n const inertiaOptions = options && interaction.prepared.name && options[interaction.prepared.name].inertia;\n\n const now = new Date().getTime();\n const statuses = {};\n const page = utils.extend({}, interaction.curCoords.page);\n const pointerSpeed = interaction.pointerDelta.client.speed;\n\n let smoothEnd = false;\n let modifierResult;\n\n // check if inertia should be started\n const inertiaPossible = (inertiaOptions && inertiaOptions.enabled\n && interaction.prepared.name !== 'gesture'\n && event !== status.startEvent);\n\n const inertia = (inertiaPossible\n && (now - interaction.curCoords.timeStamp) < 50\n && pointerSpeed > inertiaOptions.minSpeed\n && pointerSpeed > inertiaOptions.endSpeed);\n\n const modifierArg = {\n interaction,\n pageCoords: page,\n statuses,\n preEnd: true,\n requireEndOnly: true,\n };\n\n // smoothEnd\n if (inertiaPossible && !inertia) {\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n if (modifierResult.shouldMove && modifierResult.locked) {\n smoothEnd = true;\n }\n }\n\n if (!(inertia || smoothEnd)) { return; }\n\n utils.copyCoords(status.upCoords, interaction.curCoords);\n\n interaction.pointers[0] = status.startEvent =\n new InteractEvent(interaction, event, interaction.prepared.name, 'inertiastart', interaction.element);\n\n status.t0 = now;\n\n status.active = true;\n status.allowResume = inertiaOptions.allowResume;\n interaction.simulation = status;\n\n target.fire(status.startEvent);\n\n if (inertia) {\n status.vx0 = interaction.pointerDelta.client.vx;\n status.vy0 = interaction.pointerDelta.client.vy;\n status.v0 = pointerSpeed;\n\n calcInertia(interaction, status);\n\n utils.extend(page, interaction.curCoords.page);\n\n page.x += status.xe;\n page.y += status.ye;\n\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n status.modifiedXe += modifierResult.dx;\n status.modifiedYe += modifierResult.dy;\n\n status.i = animationFrame.request(interaction.boundInertiaFrame);\n }\n else {\n status.smoothEnd = true;\n status.xe = modifierResult.dx;\n status.ye = modifierResult.dy;\n\n status.sx = status.sy = 0;\n\n status.i = animationFrame.request(interaction.boundSmoothEndFrame);\n }\n});\n\nInteraction.signals.on('stop-active', function ({ interaction }) {\n const status = interaction.inertiaStatus;\n\n if (status.active) {\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n }\n});\n\nfunction calcInertia (interaction, status) {\n const inertiaOptions = interaction.target.options[interaction.prepared.name].inertia;\n const lambda = inertiaOptions.resistance;\n const inertiaDur = -Math.log(inertiaOptions.endSpeed / status.v0) / lambda;\n\n status.x0 = interaction.prevEvent.pageX;\n status.y0 = interaction.prevEvent.pageY;\n status.t0 = status.startEvent.timeStamp / 1000;\n status.sx = status.sy = 0;\n\n status.modifiedXe = status.xe = (status.vx0 - inertiaDur) / lambda;\n status.modifiedYe = status.ye = (status.vy0 - inertiaDur) / lambda;\n status.te = inertiaDur;\n\n status.lambda_v0 = lambda / status.v0;\n status.one_ve_v0 = 1 - inertiaOptions.endSpeed / status.v0;\n}\n\nfunction inertiaFrame () {\n updateInertiaCoords(this);\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n\n const status = this.inertiaStatus;\n const options = this.target.options[this.prepared.name].inertia;\n const lambda = options.resistance;\n const t = new Date().getTime() / 1000 - status.t0;\n\n if (t < status.te) {\n\n const progress = 1 - (Math.exp(-lambda * t) - status.lambda_v0) / status.one_ve_v0;\n\n if (status.modifiedXe === status.xe && status.modifiedYe === status.ye) {\n status.sx = status.xe * progress;\n status.sy = status.ye * progress;\n }\n else {\n const quadPoint = utils.getQuadraticCurvePoint(0, 0,\n status.xe,\n status.ye,\n status.modifiedXe,\n status.modifiedYe,\n progress);\n\n status.sx = quadPoint.x;\n status.sy = quadPoint.y;\n }\n\n this.doMove();\n\n status.i = animationFrame.request(this.boundInertiaFrame);\n }\n else {\n status.sx = status.modifiedXe;\n status.sy = status.modifiedYe;\n\n this.doMove();\n this.end(status.startEvent);\n status.active = false;\n this.simulation = null;\n }\n\n utils.copyCoords(this.prevCoords, this.curCoords);\n}\n\nfunction smoothEndFrame () {\n updateInertiaCoords(this);\n\n const status = this.inertiaStatus;\n const t = new Date().getTime() - status.t0;\n const duration = this.target.options[this.prepared.name].inertia.smoothEndDuration;\n\n if (t < duration) {\n status.sx = utils.easeOutQuad(t, 0, status.xe, duration);\n status.sy = utils.easeOutQuad(t, 0, status.ye, duration);\n\n this.pointerMove(status.startEvent, status.startEvent);\n\n status.i = animationFrame.request(this.boundSmoothEndFrame);\n }\n else {\n status.sx = status.xe;\n status.sy = status.ye;\n\n this.pointerMove(status.startEvent, status.startEvent);\n this.end(status.startEvent);\n\n status.smoothEnd =\n status.active = false;\n this.simulation = null;\n }\n}\n\nfunction updateInertiaCoords (interaction) {\n const status = interaction.inertiaStatus;\n\n // return if inertia isn't running\n if (!status.active) { return; }\n\n const pageUp = status.upCoords.page;\n const clientUp = status.upCoords.client;\n\n utils.setCoords(interaction.curCoords, [ {\n pageX : pageUp.x + status.sx,\n pageY : pageUp.y + status.sy,\n clientX: clientUp.x + status.sx,\n clientY: clientUp.y + status.sy,\n } ]);\n}\n","const browser = require('./utils/browser');\nconst events = require('./utils/events');\nconst utils = require('./utils');\nconst scope = require('./scope');\nconst Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\n\nconst globalEvents = {};\n\n/*\\\n * interact\n [ method ]\n *\n * The methods of this variable can be used to set elements as\n * interactables and also to change various default settings.\n *\n * Calling it as a function and passing an element or a valid CSS selector\n * string returns an Interactable object which has various methods to\n * configure it.\n *\n - element (Element | string) The HTML or SVG Element to interact with or CSS selector\n = (object) An @Interactable\n *\n > Usage\n | interact('#draggable').draggable(true);\n |\n | var rectables = interact('rect');\n | rectables\n | .gesturable(true)\n | .on('gesturemove', function (event) {\n | // ...\n | });\n\\*/\nfunction interact (element, options) {\n let interactable = scope.interactables.get(element, options);\n\n if (!interactable) {\n interactable = new Interactable(element, options);\n interactable.events.global = globalEvents;\n }\n\n return interactable;\n}\n\n/*\\\n * interact.isSet\n [ method ]\n *\n * Check if an element has been set\n - element (Element) The Element being searched for\n = (boolean) Indicates if the element or CSS selector was previously passed to interact\n\\*/\ninteract.isSet = function (element, options) {\n return scope.interactables.indexOfElement(element, options && options.context) !== -1;\n};\n\n/*\\\n * interact.on\n [ method ]\n *\n * Adds a global listener for an InteractEvent or adds a DOM event to\n * `document`\n *\n - type (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) interact\n\\*/\ninteract.on = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.on(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.on(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n // if it is an InteractEvent type, add listener to globalEvents\n if (utils.contains(Interactable.eventTypes, type)) {\n // if this type of event was never bound\n if (!globalEvents[type]) {\n globalEvents[type] = [listener];\n }\n else {\n globalEvents[type].push(listener);\n }\n }\n // If non InteractEvent type, addEventListener to document\n else {\n events.add(scope.document, type, listener, { options });\n }\n\n return interact;\n};\n\n/*\\\n * interact.off\n [ method ]\n *\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n - type (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) interact\n \\*/\ninteract.off = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.off(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.off(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n if (!utils.contains(Interactable.eventTypes, type)) {\n events.remove(scope.document, type, listener, options);\n }\n else {\n let index;\n\n if (type in globalEvents\n && (index = utils.indexOf(globalEvents[type], listener)) !== -1) {\n globalEvents[type].splice(index, 1);\n }\n }\n\n return interact;\n};\n\n/*\\\n * interact.debug\n [ method ]\n *\n * Returns an object which exposes internal data\n = (object) An object with properties that outline the current state and expose internal functions and variables\n\\*/\ninteract.debug = function () {\n return scope;\n};\n\n// expose the functions used to calculate multi-touch properties\ninteract.getPointerAverage = utils.pointerAverage;\ninteract.getTouchBBox = utils.touchBBox;\ninteract.getTouchDistance = utils.touchDistance;\ninteract.getTouchAngle = utils.touchAngle;\n\ninteract.getElementRect = utils.getElementRect;\ninteract.getElementClientRect = utils.getElementClientRect;\ninteract.matchesSelector = utils.matchesSelector;\ninteract.closest = utils.closest;\n\n/*\\\n * interact.supportsTouch\n [ method ]\n *\n = (boolean) Whether or not the browser supports touch input\n\\*/\ninteract.supportsTouch = function () {\n return browser.supportsTouch;\n};\n\n/*\\\n * interact.supportsPointerEvent\n [ method ]\n *\n = (boolean) Whether or not the browser supports PointerEvents\n\\*/\ninteract.supportsPointerEvent = function () {\n return browser.supportsPointerEvent;\n};\n\n/*\\\n * interact.stop\n [ method ]\n *\n * Cancels all interactions (end events are not fired)\n *\n - event (Event) An event on which to call preventDefault()\n = (object) interact\n\\*/\ninteract.stop = function (event) {\n for (let i = scope.interactions.length - 1; i >= 0; i--) {\n scope.interactions[i].stop(event);\n }\n\n return interact;\n};\n\n/*\\\n * interact.pointerMoveTolerance\n [ method ]\n * Returns or sets the distance the pointer must be moved before an action\n * sequence occurs. This also affects tolerance for tap events.\n *\n - newValue (number) #optional The movement from the start position must be greater than this value\n = (number | Interactable) The current setting or interact\n\\*/\ninteract.pointerMoveTolerance = function (newValue) {\n if (utils.is.number(newValue)) {\n Interaction.pointerMoveTolerance = newValue;\n\n return this;\n }\n\n return Interaction.pointerMoveTolerance;\n};\n\ninteract.addDocument = scope.addDocument;\ninteract.removeDocument = scope.removeDocument;\n\nscope.interact = interact;\n\nmodule.exports = interact;\n","const Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\nconst scope = require('./scope');\nconst is = require('./utils/is');\nconst events = require('./utils/events');\n\nconst { nodeContains, matchesSelector } = require('./utils/domUtils');\n\n/*\\\n * Interactable.preventDefault\n [ method ]\n *\n * Returns or sets whether to prevent the browser's default behaviour\n * in response to pointer events. Can be set to:\n * - `'always'` to always prevent\n * - `'never'` to never prevent\n * - `'auto'` to let interact.js try to determine what would be best\n *\n - newValue (string) #optional `true`, `false` or `'auto'`\n = (string | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.preventDefault = function (newValue) {\n if (/^(always|never|auto)$/.test(newValue)) {\n this.options.preventDefault = newValue;\n return this;\n }\n\n if (is.bool(newValue)) {\n this.options.preventDefault = newValue? 'always' : 'never';\n return this;\n }\n\n return this.options.preventDefault;\n};\n\nInteractable.prototype.checkAndPreventDefault = function (event) {\n const setting = this.options.preventDefault;\n\n if (setting === 'never') { return; }\n\n if (setting === 'always') {\n event.preventDefault();\n return;\n }\n\n // setting === 'auto'\n\n // don't preventDefault if the browser supports passiveEvents\n // CSS touch-action and user-selecct should be used instead\n if (events.supportsOptions) {\n return;\n }\n\n // don't preventDefault of pointerdown events\n if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) {\n return;\n }\n\n // don't preventDefault on editable elements\n if (is.element(event.target)\n && matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) {\n return;\n }\n\n event.preventDefault();\n};\n\nfunction onInteractionEvent ({ interaction, event }) {\n if (interaction.target) {\n interaction.target.checkAndPreventDefault(event);\n }\n}\n\nfor (const eventSignal of ['down', 'move', 'up', 'cancel']) {\n Interaction.signals.on(eventSignal, onInteractionEvent);\n}\n\n// prevent native HTML5 drag on interact.js target elements\nInteraction.docEvents.dragstart = function preventNativeDrag (event) {\n for (const interaction of scope.interactions) {\n\n if (interaction.element\n && (interaction.element === event.target\n || nodeContains(interaction.element, event.target))) {\n\n interaction.target.checkAndPreventDefault(event);\n return;\n }\n }\n};\n","const scope = require('./scope');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst iFinder = require('./utils/interactionFinder');\nconst pointerEvents = require('./pointerEvents/base');\n\nconst { window } = require('./utils/window');\n\nconst toString = Object.prototype.toString;\n\nif (!window.Array.isArray) {\n window.Array.isArray = function (obj) {\n return toString.call(obj) === '[object Array]';\n };\n}\n\nif (!String.prototype.trim) {\n String.prototype.trim = function () {\n return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n };\n}\n\n// http://www.quirksmode.org/dom/events/click.html\n// >Events leading to dblclick\n//\n// IE8 doesn't fire down event before dblclick.\n// This workaround tries to fire a tap and doubletap after dblclick\nfunction onIE8Dblclick (event) {\n const eventTarget = event.target;\n const interaction = iFinder.search(event, event.type, eventTarget);\n\n if (!interaction) { return; }\n\n if (interaction.prevTap\n && event.clientX === interaction.prevTap.clientX\n && event.clientY === interaction.prevTap.clientY\n && eventTarget === interaction.prevTap.target) {\n\n interaction.downTargets[0] = eventTarget;\n interaction.downTimes [0] = new Date().getTime();\n\n pointerEvents.fire({\n interaction,\n event,\n eventTarget,\n pointer: event,\n type: 'tap',\n });\n }\n}\n\nif (browser.isIE8) {\n const selectFix = function (event) {\n for (const interaction of scope.interactions) {\n if (interaction.interacting()) {\n interaction.target.checkAndPreventDefault(event);\n }\n }\n };\n\n const onDocIE8 = function onDocIE8 ({ doc, win }, signalName) {\n const eventMethod = signalName.indexOf('listen') === 0\n ? events.add : events.remove;\n\n // For IE's lack of Event#preventDefault\n eventMethod(doc, 'selectstart', selectFix);\n\n if (pointerEvents) {\n eventMethod(doc, 'dblclick', onIE8Dblclick);\n }\n };\n\n scope.signals.on('add-document' , onDocIE8);\n scope.signals.on('remove-document', onDocIE8);\n}\n\nmodule.exports = null;\n","const InteractEvent = require('../InteractEvent');\nconst Interaction = require('../Interaction');\nconst extend = require('../utils/extend');\n\nconst modifiers = {\n names: [],\n\n setOffsets: function (arg) {\n const { interaction, pageCoords: page } = arg;\n const { target, element, startOffset } = interaction;\n const rect = target.getRect(element);\n\n if (rect) {\n startOffset.left = page.x - rect.left;\n startOffset.top = page.y - rect.top;\n\n startOffset.right = rect.right - page.x;\n startOffset.bottom = rect.bottom - page.y;\n\n if (!('width' in rect)) { rect.width = rect.right - rect.left; }\n if (!('height' in rect)) { rect.height = rect.bottom - rect.top ; }\n }\n else {\n startOffset.left = startOffset.top = startOffset.right = startOffset.bottom = 0;\n }\n\n arg.rect = rect;\n arg.interactable = target;\n arg.element = element;\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n\n arg.options = target.options[interaction.prepared.name][modifierName];\n\n if (!arg.options) {\n continue;\n }\n\n interaction.modifierOffsets[modifierName] = modifiers[modifierName].setOffset(arg);\n }\n },\n\n setAll: function (arg) {\n const { interaction, statuses, preEnd, requireEndOnly } = arg;\n const coords = extend({}, arg.pageCoords);\n const result = {\n dx: 0,\n dy: 0,\n changed: false,\n locked: false,\n shouldMove: true,\n };\n\n for (const modifierName of modifiers.names) {\n const modifier = modifiers[modifierName];\n const options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!shouldDo(options, preEnd, requireEndOnly)) { continue; }\n\n arg.status = arg.status = statuses[modifierName];\n arg.options = options;\n arg.offset = arg.interaction.modifierOffsets[modifierName];\n\n modifier.set(arg);\n\n if (arg.status.locked) {\n coords.x += arg.status.dx;\n coords.y += arg.status.dy;\n\n result.dx += arg.status.dx;\n result.dy += arg.status.dy;\n\n result.locked = true;\n }\n }\n\n // a move should be fired if:\n // - there are no modifiers enabled,\n // - no modifiers are \"locked\" i.e. have changed the pointer's coordinates, or\n // - the locked coords have changed since the last pointer move\n result.shouldMove = !arg.status || !result.locked || arg.status.changed;\n\n return result;\n },\n\n resetStatuses: function (statuses) {\n for (const modifierName of modifiers.names) {\n const status = statuses[modifierName] || {};\n\n status.dx = status.dy = 0;\n status.modifiedX = status.modifiedY = NaN;\n status.locked = false;\n status.changed = true;\n\n statuses[modifierName] = status;\n }\n\n return statuses;\n },\n\n start: function ({ interaction }, signalName) {\n const arg = {\n interaction,\n pageCoords: (signalName === 'action-resume' ?\n interaction.curCoords : interaction.startCoords).page,\n startOffset: interaction.startOffset,\n statuses: interaction.modifierStatuses,\n preEnd: false,\n requireEndOnly: false,\n };\n\n modifiers.setOffsets(arg);\n modifiers.resetStatuses(arg.statuses);\n\n arg.pageCoords = extend({}, interaction.startCoords.page);\n interaction.modifierResult = modifiers.setAll(arg);\n },\n};\n\nInteraction.signals.on('new', function (interaction) {\n interaction.startOffset = { left: 0, right: 0, top: 0, bottom: 0 };\n interaction.modifierOffsets = {};\n interaction.modifierStatuses = modifiers.resetStatuses({});\n interaction.modifierResult = null;\n});\n\nInteraction.signals.on('action-start' , modifiers.start);\nInteraction.signals.on('action-resume', modifiers.start);\n\nInteraction.signals.on('before-action-move', function ({ interaction, preEnd, interactingBeforeMove }) {\n const modifierResult = modifiers.setAll({\n interaction,\n preEnd,\n pageCoords: interaction.curCoords.page,\n statuses: interaction.modifierStatuses,\n requireEndOnly: false,\n });\n\n // don't fire an action move if a modifier would keep the event in the same\n // cordinates as before\n if (!modifierResult.shouldMove && interactingBeforeMove) {\n interaction._dontFireMove = true;\n }\n\n interaction.modifierResult = modifierResult;\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n for (let i = 0; i < modifiers.names.length; i++) {\n const options = interaction.target.options[interaction.prepared.name][modifiers.names[i]];\n\n // if the endOnly option is true for any modifier\n if (shouldDo(options, true, true)) {\n // fire a move event at the modified coordinates\n interaction.doMove({ event, preEnd: true });\n break;\n }\n }\n});\n\nInteractEvent.signals.on('set-xy', function (arg) {\n const { iEvent, interaction } = arg;\n const modifierArg = extend({}, arg);\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n modifierArg.options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!modifierArg.options) {\n continue;\n }\n\n const modifier = modifiers[modifierName];\n\n modifierArg.status = interaction.modifierStatuses[modifierName];\n\n iEvent[modifierName] = modifier.modifyCoords(modifierArg);\n }\n});\n\nfunction shouldDo (options, preEnd, requireEndOnly) {\n return (options && options.enabled\n && (preEnd || !options.endOnly)\n && (!requireEndOnly || options.endOnly));\n}\n\nmodule.exports = modifiers;\n","const modifiers = require('./index');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst restrict = {\n defaults: {\n enabled : false,\n endOnly : false,\n restriction: null,\n elementRect: null,\n },\n\n setOffset: function ({ rect, startOffset, options }) {\n const elementRect = options && options.elementRect;\n const offset = {};\n\n if (rect && elementRect) {\n offset.left = startOffset.left - (rect.width * elementRect.left);\n offset.top = startOffset.top - (rect.height * elementRect.top);\n\n offset.right = startOffset.right - (rect.width * (1 - elementRect.right));\n offset.bottom = startOffset.bottom - (rect.height * (1 - elementRect.bottom));\n }\n else {\n offset.left = offset.top = offset.right = offset.bottom = 0;\n }\n\n return offset;\n },\n\n set: function ({ pageCoords, interaction, status, options }) {\n if (!options) { return status; }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n\n const restriction = getRestrictionRect(options.restriction, interaction, page);\n\n if (!restriction) { return status; }\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n const rect = restriction;\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n const offset = interaction.modifierOffsets.restrict;\n\n // object is assumed to have\n // x, y, width, height or\n // left, top, right, bottom\n if ('x' in restriction && 'y' in restriction) {\n modifiedX = Math.max(Math.min(rect.x + rect.width - offset.right , page.x), rect.x + offset.left);\n modifiedY = Math.max(Math.min(rect.y + rect.height - offset.bottom, page.y), rect.y + offset.top );\n }\n else {\n modifiedX = Math.max(Math.min(rect.right - offset.right , page.x), rect.left + offset.left);\n modifiedY = Math.max(Math.min(rect.bottom - offset.bottom, page.y), rect.top + offset.top );\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const elementRect = options && options.elementRect;\n\n if (options && options.enabled\n && !(phase === 'start' && elementRect && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n getRestrictionRect,\n};\n\nfunction getRestrictionRect (value, interaction, page) {\n if (utils.is.function(value)) {\n return utils.resolveRectLike(value, interaction.target, interaction.element, [page.x, page.y, interaction]);\n } else {\n return utils.resolveRectLike(value, interaction.target, interaction.element);\n }\n}\n\nmodifiers.restrict = restrict;\nmodifiers.names.push('restrict');\n\ndefaultOptions.perAction.restrict = restrict.defaults;\n\nmodule.exports = restrict;\n","// This module adds the options.resize.restrictEdges setting which sets min and\n// max for the top, left, bottom and right edges of the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictEdges: {\n// inner: { top: 200, left: 200, right: 400, bottom: 400 },\n// outer: { top: 0, left: 0, right: 600, bottom: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst { getRestrictionRect } = require('./restrict');\n\nconst noInner = { top: +Infinity, left: +Infinity, bottom: -Infinity, right: -Infinity };\nconst noOuter = { top: -Infinity, left: -Infinity, bottom: +Infinity, right: +Infinity };\n\nconst restrictEdges = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n offset: null,\n },\n\n setOffset: function ({ interaction, startOffset, options }) {\n if (!options) {\n return utils.extend({}, startOffset);\n }\n\n const offset = getRestrictionRect(options.offset, interaction, interaction.startCoords.page);\n\n if (offset) {\n return {\n top: startOffset.top + offset.y,\n left: startOffset.left + offset.x,\n bottom: startOffset.bottom + offset.y,\n right: startOffset.right + offset.x,\n };\n }\n\n return startOffset;\n },\n\n set: function ({ pageCoords, interaction, status, offset, options }) {\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n const inner = rectUtils.xywhToTlbr(getRestrictionRect(options.inner, interaction, page)) || noInner;\n const outer = rectUtils.xywhToTlbr(getRestrictionRect(options.outer, interaction, page)) || noOuter;\n\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n if (edges.top) {\n modifiedY = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top);\n }\n else if (edges.bottom) {\n modifiedY = Math.max(Math.min(outer.bottom - offset.bottom, page.y), inner.bottom - offset.bottom);\n }\n if (edges.left) {\n modifiedX = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left);\n }\n else if (edges.right) {\n modifiedX = Math.max(Math.min(outer.right - offset.right, page.x), inner.right - offset.right);\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n if (options && options.enabled\n && !(phase === 'start' && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n noInner,\n noOuter,\n getRestrictionRect,\n};\n\nmodifiers.restrictEdges = restrictEdges;\nmodifiers.names.push('restrictEdges');\n\ndefaultOptions.perAction.restrictEdges = restrictEdges.defaults;\nresize.defaults.restrictEdges = restrictEdges.defaults;\n\nmodule.exports = restrictEdges;\n","// This module adds the options.resize.restrictSize setting which sets min and\n// max width and height for the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictSize: {\n// min: { width: -600, height: -600 },\n// max: { width: 600, height: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst restrictEdges = require('./restrictEdges');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst noMin = { width: -Infinity, height: -Infinity };\nconst noMax = { width: +Infinity, height: +Infinity };\n\nconst restrictSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n },\n\n setOffset: function ({ interaction }) {\n return interaction.startOffset;\n },\n\n set: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const rect = rectUtils.xywhToTlbr(interaction.resizeRects.inverted);\n\n const minSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.min, interaction)) || noMin;\n const maxSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.max, interaction)) || noMax;\n\n arg.options = {\n enabled: options.enabled,\n endOnly: options.endOnly,\n inner: utils.extend({}, restrictEdges.noInner),\n outer: utils.extend({}, restrictEdges.noOuter),\n };\n\n if (edges.top) {\n arg.options.inner.top = rect.bottom - minSize.height;\n arg.options.outer.top = rect.bottom - maxSize.height;\n }\n else if (edges.bottom) {\n arg.options.inner.bottom = rect.top + minSize.height;\n arg.options.outer.bottom = rect.top + maxSize.height;\n }\n if (edges.left) {\n arg.options.inner.left = rect.right - minSize.width;\n arg.options.outer.left = rect.right - maxSize.width;\n }\n else if (edges.right) {\n arg.options.inner.right = rect.left + minSize.width;\n arg.options.outer.right = rect.left + maxSize.width;\n }\n\n restrictEdges.set(arg);\n },\n\n modifyCoords: restrictEdges.modifyCoords,\n};\n\nmodifiers.restrictSize = restrictSize;\nmodifiers.names.push('restrictSize');\n\ndefaultOptions.perAction.restrictSize = restrictSize.defaults;\nresize.defaults.restrictSize = restrictSize.defaults;\n\nmodule.exports = restrictSize;\n","const modifiers = require('./index');\nconst interact = require('../interact');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst snap = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n\n relativePoints: null,\n },\n\n setOffset: function ({ interaction, interactable, element, rect, startOffset, options }) {\n const offsets = [];\n const optionsOrigin = utils.rectToXY(utils.resolveRectLike(options.origin));\n const origin = optionsOrigin || utils.getOriginXY(interactable, element, interaction.prepared.name);\n options = options || interactable.options[interaction.prepared.name].snap || {};\n\n let snapOffset;\n\n if (options.offset === 'startCoords') {\n snapOffset = {\n x: interaction.startCoords.page.x - origin.x,\n y: interaction.startCoords.page.y - origin.y,\n };\n }\n else {\n const offsetRect = utils.resolveRectLike(options.offset, interactable, element, [interaction]);\n\n snapOffset = utils.rectToXY(offsetRect) || { x: 0, y: 0 };\n }\n\n if (rect && options.relativePoints && options.relativePoints.length) {\n for (const { x: relativeX, y: relativeY } of options.relativePoints) {\n offsets.push({\n x: startOffset.left - (rect.width * relativeX) + snapOffset.x,\n y: startOffset.top - (rect.height * relativeY) + snapOffset.y,\n });\n }\n }\n else {\n offsets.push(snapOffset);\n }\n\n return offsets;\n },\n\n set: function ({ interaction, pageCoords, status, options, offset: offsets }) {\n const targets = [];\n let target;\n let page;\n let i;\n\n if (status.useStatusXY) {\n page = { x: status.x, y: status.y };\n }\n else {\n const origin = utils.getOriginXY(interaction.target, interaction.element, interaction.prepared.name);\n\n page = utils.extend({}, pageCoords);\n\n page.x -= origin.x;\n page.y -= origin.y;\n }\n\n status.realX = page.x;\n status.realY = page.y;\n\n let len = options.targets? options.targets.length : 0;\n\n for (const { x: offsetX, y: offsetY } of offsets) {\n const relativeX = page.x - offsetX;\n const relativeY = page.y - offsetY;\n\n for (const snapTarget of options.targets) {\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n targets.push({\n x: utils.is.number(target.x) ? (target.x + offsetX) : relativeX,\n y: utils.is.number(target.y) ? (target.y + offsetY) : relativeY,\n\n range: utils.is.number(target.range)? target.range: options.range,\n });\n }\n }\n\n const closest = {\n target: null,\n inRange: false,\n distance: 0,\n range: 0,\n dx: 0,\n dy: 0,\n };\n\n for (i = 0, len = targets.length; i < len; i++) {\n target = targets[i];\n\n const range = target.range;\n const dx = target.x - page.x;\n const dy = target.y - page.y;\n const distance = utils.hypot(dx, dy);\n let inRange = distance <= range;\n\n // Infinite targets count as being out of range\n // compared to non infinite ones that are in range\n if (range === Infinity && closest.inRange && closest.range !== Infinity) {\n inRange = false;\n }\n\n if (!closest.target || (inRange\n // is the closest target in range?\n ? (closest.inRange && range !== Infinity\n // the pointer is relatively deeper in this target\n ? distance / range < closest.distance / closest.range\n // this target has Infinite range and the closest doesn't\n : (range === Infinity && closest.range !== Infinity)\n // OR this target is closer that the previous closest\n || distance < closest.distance)\n // The other is not in range and the pointer is closer to this target\n : (!closest.inRange && distance < closest.distance))) {\n\n closest.target = target;\n closest.distance = distance;\n closest.range = range;\n closest.inRange = inRange;\n closest.dx = dx;\n closest.dy = dy;\n\n status.range = range;\n }\n }\n\n let snapChanged;\n\n if (closest.target) {\n snapChanged = (status.modifiedX !== closest.target.x || status.modifiedY !== closest.target.y);\n\n status.modifiedX = closest.target.x;\n status.modifiedY = closest.target.y;\n }\n else {\n snapChanged = true;\n\n status.modifiedX = NaN;\n status.modifiedY = NaN;\n }\n\n status.dx = closest.dx;\n status.dy = closest.dy;\n\n status.changed = (snapChanged || (closest.inRange && !status.locked));\n status.locked = closest.inRange;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const relativePoints = options && options.relativePoints;\n\n if (options && options.enabled\n && !(phase === 'start' && relativePoints && relativePoints.length)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n }\n\n return {\n range : status.range,\n locked : status.locked,\n x : status.modifiedX,\n y : status.modifiedY,\n realX : status.realX,\n realY : status.realY,\n dx : status.dx,\n dy : status.dy,\n };\n }\n },\n};\n\ninteract.createSnapGrid = function (grid) {\n return function (x, y) {\n const limits = grid.limits || {\n left : -Infinity,\n right : Infinity,\n top : -Infinity,\n bottom: Infinity,\n };\n let offsetX = 0;\n let offsetY = 0;\n\n if (utils.is.object(grid.offset)) {\n offsetX = grid.offset.x;\n offsetY = grid.offset.y;\n }\n\n const gridx = Math.round((x - offsetX) / grid.x);\n const gridy = Math.round((y - offsetY) / grid.y);\n\n const newX = Math.max(limits.left, Math.min(limits.right , gridx * grid.x + offsetX));\n const newY = Math.max(limits.top , Math.min(limits.bottom, gridy * grid.y + offsetY));\n\n return {\n x: newX,\n y: newY,\n range: grid.range,\n };\n };\n};\n\nmodifiers.snap = snap;\nmodifiers.names.push('snap');\n\ndefaultOptions.perAction.snap = snap.defaults;\n\nmodule.exports = snap;\n","// This module allows snapping of the size of targets during resize\n// interactions.\n\nconst modifiers = require('./index');\nconst snap = require('./snap');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\nconst utils = require('../utils/');\n\nconst snapSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n },\n\n setOffset: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.edges;\n\n if (!edges) { return; }\n\n arg.options = {\n relativePoints: [{\n x: edges.left? 0 : 1,\n y: edges.top ? 0 : 1,\n }],\n origin: { x: 0, y: 0 },\n offset: 'self',\n range: options.range,\n };\n\n const offsets = snap.setOffset(arg);\n arg.options = options;\n\n return offsets;\n },\n\n set: function (arg) {\n const { interaction, options, offset, pageCoords } = arg;\n const page = utils.extend({}, pageCoords);\n const relativeX = page.x - offset[0].x;\n const relativeY = page.y - offset[0].y;\n\n arg.options = utils.extend({}, options);\n arg.options.targets = [];\n\n for (const snapTarget of options.targets) {\n let target;\n\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n if ('width' in target && 'height' in target) {\n target.x = target.width;\n target.y = target.height;\n }\n\n arg.options.targets.push(target);\n }\n\n snap.set(arg);\n },\n\n modifyCoords: function (arg) {\n const { options } = arg;\n\n arg.options = utils.extend({}, options);\n arg.options.enabled = options.enabled;\n arg.options.relativePoints = [null];\n\n snap.modifyCoords(arg);\n },\n};\n\nmodifiers.snapSize = snapSize;\nmodifiers.names.push('snapSize');\n\ndefaultOptions.perAction.snapSize = snapSize.defaults;\nresize.defaults.snapSize = snapSize.defaults;\n\nmodule.exports = snapSize;\n","const pointerUtils = require('../utils/pointerUtils');\n\nmodule.exports = class PointerEvent {\n constructor (type, pointer, event, eventTarget, interaction) {\n pointerUtils.pointerExtend(this, event);\n\n if (event !== pointer) {\n pointerUtils.pointerExtend(this, pointer);\n }\n\n this.interaction = interaction;\n\n this.timeStamp = new Date().getTime();\n this.originalEvent = event;\n this.type = type;\n this.pointerId = pointerUtils.getPointerId(pointer);\n this.pointerType = pointerUtils.getPointerType(pointer);\n this.target = eventTarget;\n this.currentTarget = null;\n\n if (type === 'tap') {\n const pointerIndex = interaction.getPointerIndex(pointer);\n this.dt = this.timeStamp - interaction.downTimes[pointerIndex];\n\n const interval = this.timeStamp - interaction.tapTime;\n\n this.double = !!(interaction.prevTap\n && interaction.prevTap.type !== 'doubletap'\n && interaction.prevTap.target === this.target\n && interval < 500);\n }\n else if (type === 'doubletap') {\n this.dt = pointer.timeStamp - interaction.tapTime;\n }\n }\n\n subtractOrigin ({ x: originX, y: originY }) {\n this.pageX -= originX;\n this.pageY -= originY;\n this.clientX -= originX;\n this.clientY -= originY;\n\n return this;\n }\n\n addOrigin ({ x: originX, y: originY }) {\n this.pageX += originX;\n this.pageY += originY;\n this.clientX += originX;\n this.clientY += originY;\n\n return this;\n }\n\n preventDefault () {\n this.originalEvent.preventDefault();\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n};\n","const PointerEvent = require('./PointerEvent');\nconst Interaction = require('../Interaction');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst defaults = require('../defaultOptions');\nconst signals = require('../utils/Signals').new();\nconst { filter } = require('../utils/arr');\n\nconst simpleSignals = [ 'down', 'up', 'cancel' ];\nconst simpleEvents = [ 'down', 'up', 'cancel' ];\n\nconst pointerEvents = {\n PointerEvent,\n fire,\n collectEventTargets,\n signals,\n defaults: {\n holdDuration: 600,\n ignoreFrom : null,\n allowFrom : null,\n origin : { x: 0, y: 0 },\n },\n types: [\n 'down',\n 'move',\n 'up',\n 'cancel',\n 'tap',\n 'doubletap',\n 'hold',\n ],\n};\n\nfunction fire (arg) {\n const {\n interaction, pointer, event, eventTarget,\n type = arg.pointerEvent.type,\n targets = collectEventTargets(arg),\n pointerEvent = new PointerEvent(type, pointer, event, eventTarget, interaction),\n } = arg;\n\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n targets,\n type,\n pointerEvent,\n };\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n\n for (const prop in target.props || {}) {\n pointerEvent[prop] = target.props[prop];\n }\n\n const origin = utils.getOriginXY(target.eventable, target.element);\n\n pointerEvent.subtractOrigin(origin);\n pointerEvent.eventable = target.eventable;\n pointerEvent.currentTarget = target.element;\n\n target.eventable.fire(pointerEvent);\n\n pointerEvent.addOrigin(origin);\n\n if (pointerEvent.immediatePropagationStopped\n || (pointerEvent.propagationStopped\n && (i + 1) < targets.length && targets[i + 1].element !== pointerEvent.currentTarget)) {\n break;\n }\n }\n\n signals.fire('fired', signalArg);\n\n if (type === 'tap') {\n // if pointerEvent should make a double tap, create and fire a doubletap\n // PointerEvent and use that as the prevTap\n const prevTap = pointerEvent.double\n ? fire({\n interaction, pointer, event, eventTarget,\n type: 'doubletap',\n })\n : pointerEvent;\n\n interaction.prevTap = prevTap;\n interaction.tapTime = prevTap.timeStamp;\n }\n\n return pointerEvent;\n}\n\nfunction collectEventTargets ({ interaction, pointer, event, eventTarget, type }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n // do not fire a tap event if the pointer was moved before being lifted\n if (type === 'tap' && (interaction.pointerWasMoved\n // or if the pointerup target is different to the pointerdown target\n || !(interaction.downTargets[pointerIndex] && interaction.downTargets[pointerIndex] === eventTarget))) {\n return [];\n }\n\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n path,\n targets: [],\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (type === 'hold') {\n signalArg.targets = filter(signalArg.targets, target =>\n target.eventable.options.holdDuration === interaction.holdTimers[pointerIndex].duration);\n }\n\n return signalArg.targets;\n}\n\nInteraction.signals.on('update-pointer-down', function ({ interaction, pointerIndex }) {\n interaction.holdTimers[pointerIndex] = { duration: Infinity, timeout: null };\n});\n\nInteraction.signals.on('remove-pointer', function ({ interaction, pointerIndex }) {\n interaction.holdTimers.splice(pointerIndex, 1);\n});\n\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget, duplicateMove }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n if (!duplicateMove && (!interaction.pointerIsDown || interaction.pointerWasMoved)) {\n if (interaction.pointerIsDown) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n\n fire({\n interaction, pointer, event, eventTarget,\n type: 'move',\n });\n }\n});\n\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget, pointerIndex }) {\n // copy event to be used in timeout for IE8\n const eventCopy = browser.isIE8? utils.extend({}, event) : event;\n\n const timer = interaction.holdTimers[pointerIndex];\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'hold',\n targets: [],\n path,\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (!signalArg.targets.length) { return; }\n\n let minDuration = Infinity;\n\n for (let i = 0; i < signalArg.targets.length; i++) {\n const target = signalArg.targets[i];\n const holdDuration = target.eventable.options.holdDuration;\n\n if (holdDuration < minDuration) {\n minDuration = holdDuration;\n }\n }\n\n timer.duration = minDuration;\n timer.timeout = setTimeout(function () {\n fire({\n interaction,\n eventTarget,\n pointer: browser.isIE8? eventCopy : pointer,\n event: eventCopy,\n type: 'hold',\n });\n }, minDuration);\n});\n\nInteraction.signals.on('up', ({ interaction, pointer, event, eventTarget }) => {\n if (!interaction.pointerWasMoved) {\n fire({ interaction, eventTarget, pointer, event, type: 'tap' });\n }\n});\n\n['up', 'cancel'].forEach(function (signalName) {\n Interaction.signals.on(signalName, function ({ interaction, pointerIndex }) {\n if (interaction.holdTimers[pointerIndex]) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n });\n});\n\nfunction createSignalListener (type) {\n return function ({ interaction, pointer, event, eventTarget }) {\n fire({ interaction, eventTarget, pointer, event, type });\n };\n}\n\nfor (let i = 0; i < simpleSignals.length; i++) {\n Interaction.signals.on(simpleSignals[i], createSignalListener(simpleEvents[i]));\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.prevTap = null; // the most recent tap event on this interaction\n interaction.tapTime = 0; // time of the most recent tap event\n interaction.holdTimers = []; // [{ duration, timeout }]\n});\n\ndefaults.pointerEvents = pointerEvents.defaults;\nmodule.exports = pointerEvents;\n","const pointerEvents = require('./base');\nconst Interaction = require('../Interaction');\n\npointerEvents.signals.on('new', onNew);\npointerEvents.signals.on('fired', onFired);\n\nfor (const signal of ['move', 'up', 'cancel', 'endall']) {\n Interaction.signals.on(signal, endHoldRepeat);\n}\n\nfunction onNew ({ pointerEvent }) {\n if (pointerEvent.type !== 'hold') { return; }\n\n pointerEvent.count = (pointerEvent.count || 0) + 1;\n}\n\nfunction onFired ({ interaction, pointerEvent, eventTarget, targets }) {\n if (pointerEvent.type !== 'hold' || !targets.length) { return; }\n\n // get the repeat interval from the first eventable\n const interval = targets[0].eventable.options.holdRepeatInterval;\n\n // don't repeat if the interval is 0 or less\n if (interval <= 0) { return; }\n\n // set a timeout to fire the holdrepeat event\n interaction.holdIntervalHandle = setTimeout(function () {\n pointerEvents.fire({\n interaction,\n eventTarget,\n type: 'hold',\n pointer: pointerEvent,\n event: pointerEvent,\n });\n }, interval);\n}\n\nfunction endHoldRepeat ({ interaction }) {\n // set the interaction's holdStopTime property\n // to stop further holdRepeat events\n if (interaction.holdIntervalHandle) {\n clearInterval(interaction.holdIntervalHandle);\n interaction.holdIntervalHandle = null;\n }\n}\n\n// don't repeat by default\npointerEvents.defaults.holdRepeatInterval = 0;\npointerEvents.types.push('holdrepeat');\n\nmodule.exports = {\n onNew,\n onFired,\n endHoldRepeat,\n};\n","const pointerEvents = require('./base');\nconst Interactable = require('../Interactable');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\nconst scope = require('../scope');\nconst extend = require('../utils/extend');\nconst { merge } = require('../utils/arr');\n\npointerEvents.signals.on('collect-targets', function ({ targets, element, type, eventTarget }) {\n function collectSelectors (interactable, selector, context) {\n const els = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && is.element(element)\n && domUtils.matchesSelector(element, selector, els)\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n const interactable = scope.interactables.get(element);\n\n if (interactable) {\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n scope.interactables.forEachSelector(collectSelectors, element);\n});\n\nInteractable.signals.on('new', function ({ interactable }) {\n interactable.events.getRect = function (element) {\n return interactable.getRect(element);\n };\n});\n\nInteractable.signals.on('set', function ({ interactable, options }) {\n extend(interactable.events.options, pointerEvents.defaults);\n extend(interactable.events.options, options);\n});\n\nmerge(Interactable.eventTypes, pointerEvents.types);\n\nInteractable.prototype.pointerEvents = function (options) {\n extend(this.events.options, options);\n\n return this;\n};\n\nconst __backCompatOption = Interactable.prototype._backCompatOption;\n\nInteractable.prototype._backCompatOption = function (optionName, newValue) {\n const ret = __backCompatOption.call(this, optionName, newValue);\n\n if (ret === this) {\n this.events.options[optionName] = newValue;\n }\n\n return ret;\n};\n\nInteractable.settingsMethods.push('pointerEvents');\n","const utils = require('./utils');\nconst events = require('./utils/events');\nconst signals = require('./utils/Signals').new();\n\nconst scope = {\n signals,\n events,\n utils,\n\n // main document\n document: require('./utils/domObjects').document,\n // all documents being listened to\n documents: [],\n\n addDocument: function (doc, win) {\n // do nothing if document is already known\n if (utils.contains(scope.documents, doc)) { return false; }\n\n win = win || scope.getWindow(doc);\n\n scope.documents.push(doc);\n events.documents.push(doc);\n\n // don't add an unload event for the main document\n // so that the page may be cached in browser history\n if (doc !== scope.document) {\n events.add(win, 'unload', scope.onWindowUnload);\n }\n\n signals.fire('add-document', { doc, win });\n },\n\n removeDocument: function (doc, win) {\n const index = utils.indexOf(scope.documents, doc);\n\n win = win || scope.getWindow(doc);\n\n events.remove(win, 'unload', scope.onWindowUnload);\n\n scope.documents.splice(index, 1);\n events.documents.splice(index, 1);\n\n signals.fire('remove-document', { win, doc });\n },\n\n onWindowUnload: function () {\n scope.removeDocument(this.document, this);\n },\n};\n\nmodule.exports = scope;\n","const { indexOf } = require('./arr');\n\nclass Signals {\n constructor () {\n this.listeners = {\n // signalName: [listeners],\n };\n }\n\n on (name, listener) {\n if (!this.listeners[name]) {\n this.listeners[name] = [listener];\n return;\n }\n\n this.listeners[name].push(listener);\n }\n\n off (name, listener) {\n if (!this.listeners[name]) { return; }\n\n const index = indexOf(this.listeners[name], listener);\n\n if (index !== -1) {\n this.listeners[name].splice(index, 1);\n }\n }\n\n fire (name, arg) {\n const targetListeners = this.listeners[name];\n\n if (!targetListeners) { return; }\n\n for (let i = 0; i < targetListeners.length; i++) {\n if (targetListeners[i](arg, name) === false) {\n return;\n }\n }\n }\n}\n\nSignals.new = function () {\n return new Signals();\n};\n\nmodule.exports = Signals;\n","function indexOf (array, target) {\n for (let i = 0, len = array.length; i < len; i++) {\n if (array[i] === target) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction contains (array, target) {\n return indexOf(array, target) !== -1;\n}\n\nfunction merge (target, source) {\n for (let i = 0; i < source.length; i++) {\n target.push(source[i]);\n }\n\n return target;\n}\n\nfunction filter (array, test) {\n const result = [];\n\n for (let i = 0; i < array.length; i++) {\n if (test(array[i])) {\n result.push(array[i]);\n }\n }\n\n return result;\n}\n\nmodule.exports = {\n indexOf,\n contains,\n merge,\n filter,\n};\n","const { window } = require('./window');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst Element = domObjects.Element;\nconst navigator = window.navigator;\n\nconst browser = {\n // Does the browser support touch input?\n supportsTouch: !!(('ontouchstart' in window) || is.function(window.DocumentTouch)\n && domObjects.document instanceof window.DocumentTouch),\n\n // Does the browser support PointerEvents\n supportsPointerEvent: !!domObjects.PointerEvent,\n\n isIE8: ('attachEvent' in window) && !('addEventListener' in window),\n\n // Opera Mobile must be handled differently\n isOperaMobile: (navigator.appName === 'Opera'\n && browser.supportsTouch\n && navigator.userAgent.match('Presto')),\n\n // scrolling doesn't change the result of getClientRects on iOS 7\n isIOS7: (/iP(hone|od|ad)/.test(navigator.platform)\n && /OS 7[^\\d]/.test(navigator.appVersion)),\n\n isIe9OrOlder: /MSIE (8|9)/.test(navigator.userAgent),\n\n // prefix matchesSelector\n prefixedMatchesSelector: 'matches' in Element.prototype\n ? 'matches': 'webkitMatchesSelector' in Element.prototype\n ? 'webkitMatchesSelector': 'mozMatchesSelector' in Element.prototype\n ? 'mozMatchesSelector': 'oMatchesSelector' in Element.prototype\n ? 'oMatchesSelector': 'msMatchesSelector',\n\n useMatchesSelectorPolyfill: false,\n\n pEventTypes: (domObjects.PointerEvent\n ? (domObjects.PointerEvent === window.MSPointerEvent\n ? {\n up: 'MSPointerUp',\n down: 'MSPointerDown',\n over: 'mouseover',\n out: 'mouseout',\n move: 'MSPointerMove',\n cancel: 'MSPointerCancel',\n }\n : {\n up: 'pointerup',\n down: 'pointerdown',\n over: 'pointerover',\n out: 'pointerout',\n move: 'pointermove',\n cancel: 'pointercancel',\n })\n : null),\n\n // because Webkit and Opera still use 'mousewheel' event type\n wheelEvent: 'onmousewheel' in domObjects.document? 'mousewheel': 'wheel',\n\n};\n\nbrowser.useMatchesSelectorPolyfill = !is.function(Element.prototype[browser.prefixedMatchesSelector]);\n\nmodule.exports = browser;\n","const domObjects = {};\nconst win = require('./window').window;\n\nfunction blank () {}\n\ndomObjects.document = win.document;\ndomObjects.DocumentFragment = win.DocumentFragment || blank;\ndomObjects.SVGElement = win.SVGElement || blank;\ndomObjects.SVGSVGElement = win.SVGSVGElement || blank;\ndomObjects.SVGElementInstance = win.SVGElementInstance || blank;\ndomObjects.Element = win.Element || blank;\ndomObjects.HTMLElement = win.HTMLElement || domObjects.Element;\n\ndomObjects.Event = win.Event;\ndomObjects.Touch = win.Touch || blank;\ndomObjects.PointerEvent = (win.PointerEvent || win.MSPointerEvent);\n\nmodule.exports = domObjects;\n","const win = require('./window');\nconst browser = require('./browser');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst domUtils = {\n nodeContains: function (parent, child) {\n while (child) {\n if (child === parent) {\n return true;\n }\n\n child = child.parentNode;\n }\n\n return false;\n },\n\n closest: function (element, selector) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) { return element; }\n\n element = domUtils.parentNode(element);\n }\n\n return null;\n },\n\n parentNode: function (node) {\n let parent = node.parentNode;\n\n if (is.docFrag(parent)) {\n // skip past #shado-root fragments\n while ((parent = parent.host) && is.docFrag(parent)) {\n continue;\n }\n\n return parent;\n }\n\n return parent;\n },\n\n // taken from http://tanalin.com/en/blog/2012/12/matches-selector-ie8/ and modified\n matchesSelectorPolyfill: browser.useMatchesSelectorPolyfill\n ? function (element, selector, elems) {\n elems = elems || element.parentNode.querySelectorAll(selector);\n\n for (let i = 0, len = elems.length; i < len; i++) {\n if (elems[i] === element) {\n return true;\n }\n }\n\n return false;\n }\n : null,\n\n matchesSelector: function (element, selector, nodeList) {\n if (browser.useMatchesSelectorPolyfill) {\n return domUtils.matchesSelectorPolyfill(element, selector, nodeList);\n }\n\n // remove /deep/ from selectors if shadowDOM polyfill is used\n if (win.window !== win.realWindow) {\n selector = selector.replace(/\\/deep\\//g, ' ');\n }\n\n return element[browser.prefixedMatchesSelector](selector);\n },\n\n // Test for the element that's \"above\" all other qualifiers\n indexOfDeepestElement: function (elements) {\n let deepestZoneParents = [];\n let dropzoneParents = [];\n let dropzone;\n let deepestZone = elements[0];\n let index = deepestZone? 0: -1;\n let parent;\n let child;\n let i;\n let n;\n\n for (i = 1; i < elements.length; i++) {\n dropzone = elements[i];\n\n // an element might belong to multiple selector dropzones\n if (!dropzone || dropzone === deepestZone) {\n continue;\n }\n\n if (!deepestZone) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n // check if the deepest or current are document.documentElement or document.rootElement\n // - if the current dropzone is, do nothing and continue\n if (dropzone.parentNode === dropzone.ownerDocument) {\n continue;\n }\n // - if deepest is, update with the current dropzone and continue to next\n else if (deepestZone.parentNode === dropzone.ownerDocument) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n if (!deepestZoneParents.length) {\n parent = deepestZone;\n while (parent.parentNode && parent.parentNode !== parent.ownerDocument) {\n deepestZoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n }\n\n // if this element is an svg element and the current deepest is\n // an HTMLElement\n if (deepestZone instanceof domObjects.HTMLElement\n && dropzone instanceof domObjects.SVGElement\n && !(dropzone instanceof domObjects.SVGSVGElement)) {\n\n if (dropzone === deepestZone.parentNode) {\n continue;\n }\n\n parent = dropzone.ownerSVGElement;\n }\n else {\n parent = dropzone;\n }\n\n dropzoneParents = [];\n\n while (parent.parentNode !== parent.ownerDocument) {\n dropzoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n\n n = 0;\n\n // get (position of last common ancestor) + 1\n while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) {\n n++;\n }\n\n const parents = [\n dropzoneParents[n - 1],\n dropzoneParents[n],\n deepestZoneParents[n],\n ];\n\n child = parents[0].lastChild;\n\n while (child) {\n if (child === parents[1]) {\n deepestZone = dropzone;\n index = i;\n deepestZoneParents = [];\n\n break;\n }\n else if (child === parents[2]) {\n break;\n }\n\n child = child.previousSibling;\n }\n }\n\n return index;\n },\n\n matchesUpTo: function (element, selector, limit) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) {\n return true;\n }\n\n element = domUtils.parentNode(element);\n\n if (element === limit) {\n return domUtils.matchesSelector(element, selector);\n }\n }\n\n return false;\n },\n\n getActualElement: function (element) {\n return (element instanceof domObjects.SVGElementInstance\n ? element.correspondingUseElement\n : element);\n },\n\n getScrollXY: function (relevantWindow) {\n relevantWindow = relevantWindow || win.window;\n return {\n x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft,\n y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop,\n };\n },\n\n getElementClientRect: function (element) {\n const clientRect = (element instanceof domObjects.SVGElement\n ? element.getBoundingClientRect()\n : element.getClientRects()[0]);\n\n return clientRect && {\n left : clientRect.left,\n right : clientRect.right,\n top : clientRect.top,\n bottom: clientRect.bottom,\n width : clientRect.width || clientRect.right - clientRect.left,\n height: clientRect.height || clientRect.bottom - clientRect.top,\n };\n },\n\n getElementRect: function (element) {\n const clientRect = domUtils.getElementClientRect(element);\n\n if (!browser.isIOS7 && clientRect) {\n const scroll = domUtils.getScrollXY(win.getWindow(element));\n\n clientRect.left += scroll.x;\n clientRect.right += scroll.x;\n clientRect.top += scroll.y;\n clientRect.bottom += scroll.y;\n }\n\n return clientRect;\n },\n\n getPath: function (element) {\n const path = [];\n\n while (element) {\n path.push(element);\n element = domUtils.parentNode(element);\n }\n\n return path;\n },\n\n trySelector: value => {\n if (!is.string(value)) { return false; }\n\n // an exception will be raised if it is invalid\n domObjects.document.querySelector(value);\n return true;\n },\n};\n\nmodule.exports = domUtils;\n","const is = require('./is');\nconst domUtils = require('./domUtils');\nconst pExtend = require('./pointerExtend');\n\nconst { window, getWindow } = require('./window');\nconst { indexOf, contains } = require('./arr');\n\nconst useAttachEvent = ('attachEvent' in window) && !('addEventListener' in window);\nconst addEvent = useAttachEvent? 'attachEvent': 'addEventListener';\nconst removeEvent = useAttachEvent? 'detachEvent': 'removeEventListener';\nconst on = useAttachEvent? 'on': '';\n\nconst elements = [];\nconst targets = [];\nconst attachedListeners = [];\n\n// {\n// type: {\n// selectors: ['selector', ...],\n// contexts : [document, ...],\n// listeners: [[listener, capture, passive], ...]\n// }\n// }\nconst delegatedEvents = {};\n\nconst documents = [];\n\nconst supportsOptions = !useAttachEvent && (() => {\n let supported = false;\n\n window.document.createElement('div').addEventListener('test', null, {\n get capture () { supported = true; },\n });\n\n return supported;\n})();\n\nfunction add (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n let elementIndex = indexOf(elements, element);\n let target = targets[elementIndex];\n\n if (!target) {\n target = {\n events: {},\n typeCount: 0,\n };\n\n elementIndex = elements.push(element) - 1;\n targets.push(target);\n\n attachedListeners.push(useAttachEvent\n ? {\n supplied: [],\n wrapped : [],\n useCount: [],\n }\n : null);\n }\n\n if (!target.events[type]) {\n target.events[type] = [];\n target.typeCount++;\n }\n\n if (!contains(target.events[type], listener)) {\n let ret;\n\n if (useAttachEvent) {\n const { supplied, wrapped, useCount } = attachedListeners[elementIndex];\n const listenerIndex = indexOf(supplied, listener);\n\n const wrappedListener = wrapped[listenerIndex] || function (event) {\n if (!event.immediatePropagationStopped) {\n event.target = event.srcElement;\n event.currentTarget = element;\n\n event.preventDefault = event.preventDefault || preventDef;\n event.stopPropagation = event.stopPropagation || stopProp;\n event.stopImmediatePropagation = event.stopImmediatePropagation || stopImmProp;\n\n if (/mouse|click/.test(event.type)) {\n event.pageX = event.clientX + getWindow(element).document.documentElement.scrollLeft;\n event.pageY = event.clientY + getWindow(element).document.documentElement.scrollTop;\n }\n\n listener(event);\n }\n };\n\n ret = element[addEvent](on + type, wrappedListener, !!options.capture);\n\n if (listenerIndex === -1) {\n supplied.push(listener);\n wrapped.push(wrappedListener);\n useCount.push(1);\n }\n else {\n useCount[listenerIndex]++;\n }\n }\n else {\n ret = element[addEvent](type, listener, supportsOptions? options : !!options.capture);\n }\n target.events[type].push(listener);\n\n return ret;\n }\n}\n\nfunction remove (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const elementIndex = indexOf(elements, element);\n const target = targets[elementIndex];\n\n if (!target || !target.events) {\n return;\n }\n\n let wrappedListener = listener;\n let listeners;\n let listenerIndex;\n\n if (useAttachEvent) {\n listeners = attachedListeners[elementIndex];\n listenerIndex = indexOf(listeners.supplied, listener);\n wrappedListener = listeners.wrapped[listenerIndex];\n }\n\n if (type === 'all') {\n for (type in target.events) {\n if (target.events.hasOwnProperty(type)) {\n remove(element, type, 'all');\n }\n }\n return;\n }\n\n if (target.events[type]) {\n const len = target.events[type].length;\n\n if (listener === 'all') {\n for (let i = 0; i < len; i++) {\n remove(element, type, target.events[type][i], options);\n }\n return;\n }\n else {\n for (let i = 0; i < len; i++) {\n if (target.events[type][i] === listener) {\n element[removeEvent](on + type, wrappedListener, supportsOptions? options : !!options.capture);\n target.events[type].splice(i, 1);\n\n if (useAttachEvent && listeners) {\n listeners.useCount[listenerIndex]--;\n if (listeners.useCount[listenerIndex] === 0) {\n listeners.supplied.splice(listenerIndex, 1);\n listeners.wrapped.splice(listenerIndex, 1);\n listeners.useCount.splice(listenerIndex, 1);\n }\n }\n\n break;\n }\n }\n }\n\n if (target.events[type] && target.events[type].length === 0) {\n target.events[type] = null;\n target.typeCount--;\n }\n }\n\n if (!target.typeCount) {\n targets.splice(elementIndex, 1);\n elements.splice(elementIndex, 1);\n attachedListeners.splice(elementIndex, 1);\n }\n}\n\nfunction addDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n if (!delegatedEvents[type]) {\n delegatedEvents[type] = {\n selectors: [],\n contexts : [],\n listeners: [],\n };\n\n // add delegate listener functions\n for (let i = 0; i < documents.length; i++) {\n add(documents[i], type, delegateListener);\n add(documents[i], type, delegateUseCapture, true);\n }\n }\n\n const delegated = delegatedEvents[type];\n let index;\n\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n break;\n }\n }\n\n if (index === -1) {\n index = delegated.selectors.length;\n\n delegated.selectors.push(selector);\n delegated.contexts .push(context);\n delegated.listeners.push([]);\n }\n\n // keep listener and capture and passive flags\n delegated.listeners[index].push([listener, !!options.capture, options.passive]);\n}\n\nfunction removeDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const delegated = delegatedEvents[type];\n let matchFound = false;\n let index;\n\n if (!delegated) { return; }\n\n // count from last index of delegated to 0\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n // look for matching selector and context Node\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n\n const listeners = delegated.listeners[index];\n\n // each item of the listeners array is an array: [function, capture, passive]\n for (let i = listeners.length - 1; i >= 0; i--) {\n const [fn, capture, passive] = listeners[i];\n\n // check if the listener functions and capture and passive flags match\n if (fn === listener && capture === !!options.capture && passive === options.passive) {\n // remove the listener from the array of listeners\n listeners.splice(i, 1);\n\n // if all listeners for this interactable have been removed\n // remove the interactable from the delegated arrays\n if (!listeners.length) {\n delegated.selectors.splice(index, 1);\n delegated.contexts .splice(index, 1);\n delegated.listeners.splice(index, 1);\n\n // remove delegate function from context\n remove(context, type, delegateListener);\n remove(context, type, delegateUseCapture, true);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegatedEvents[type] = null;\n }\n }\n\n // only remove one listener\n matchFound = true;\n break;\n }\n }\n\n if (matchFound) { break; }\n }\n }\n}\n\n// bound to the interactable context when a DOM event\n// listener is added to a selector interactable\nfunction delegateListener (event, optionalArg) {\n const options = getOptions(optionalArg);\n const fakeEvent = {};\n const delegated = delegatedEvents[event.type];\n const eventTarget = (domUtils.getActualElement(event.path\n ? event.path[0]\n : event.target));\n let element = eventTarget;\n\n // duplicate the event so that currentTarget can be changed\n pExtend(fakeEvent, event);\n\n fakeEvent.originalEvent = event;\n fakeEvent.preventDefault = preventOriginalDefault;\n\n // climb up document tree looking for selector matches\n while (is.element(element)) {\n for (let i = 0; i < delegated.selectors.length; i++) {\n const selector = delegated.selectors[i];\n const context = delegated.contexts[i];\n\n if (domUtils.matchesSelector(element, selector)\n && domUtils.nodeContains(context, eventTarget)\n && domUtils.nodeContains(context, element)) {\n\n const listeners = delegated.listeners[i];\n\n fakeEvent.currentTarget = element;\n\n for (let j = 0; j < listeners.length; j++) {\n const [fn, capture, passive] = listeners[j];\n\n if (capture === !!options.capture && passive === options.passive) {\n fn(fakeEvent);\n }\n }\n }\n }\n\n element = domUtils.parentNode(element);\n }\n}\n\nfunction delegateUseCapture (event) {\n return delegateListener.call(this, event, true);\n}\n\nfunction preventDef () {\n this.returnValue = false;\n}\n\nfunction preventOriginalDefault () {\n this.originalEvent.preventDefault();\n}\n\nfunction stopProp () {\n this.cancelBubble = true;\n}\n\nfunction stopImmProp () {\n this.cancelBubble = true;\n this.immediatePropagationStopped = true;\n}\n\nfunction getOptions (param) {\n return is.object(param)? param : { capture: param };\n}\n\nmodule.exports = {\n add,\n remove,\n\n addDelegate,\n removeDelegate,\n\n delegateListener,\n delegateUseCapture,\n delegatedEvents,\n documents,\n\n useAttachEvent,\n supportsOptions,\n\n _elements: elements,\n _targets: targets,\n _attachedListeners: attachedListeners,\n};\n","module.exports = function extend (dest, source) {\n for (const prop in source) {\n dest[prop] = source[prop];\n }\n return dest;\n};\n","const {\n resolveRectLike,\n rectToXY,\n} = require('./rect');\n\nmodule.exports = function (target, element, action) {\n const actionOptions = target.options[action];\n const actionOrigin = actionOptions && actionOptions.origin;\n const origin = actionOrigin || target.options.origin;\n\n const originRect = resolveRectLike(origin, target, element, [target && element]);\n\n return rectToXY(originRect) || { x: 0, y: 0 };\n};\n","module.exports = (x, y) => Math.sqrt(x * x + y * y);\n","const extend = require('./extend');\nconst win = require('./window');\n\nconst utils = {\n warnOnce: function (method, message) {\n let warned = false;\n\n return function () {\n if (!warned) {\n win.window.console.warn(message);\n warned = true;\n }\n\n return method.apply(this, arguments);\n };\n },\n\n // http://stackoverflow.com/a/5634528/2280888\n _getQBezierValue: function (t, p1, p2, p3) {\n const iT = 1 - t;\n return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3;\n },\n\n getQuadraticCurvePoint: function (startX, startY, cpX, cpY, endX, endY, position) {\n return {\n x: utils._getQBezierValue(position, startX, cpX, endX),\n y: utils._getQBezierValue(position, startY, cpY, endY),\n };\n },\n\n // http://gizma.com/easing/\n easeOutQuad: function (t, b, c, d) {\n t /= d;\n return -c * t*(t-2) + b;\n },\n\n copyAction: function (dest, src) {\n dest.name = src.name;\n dest.axis = src.axis;\n dest.edges = src.edges;\n\n return dest;\n },\n\n is : require('./is'),\n extend : extend,\n hypot : require('./hypot'),\n getOriginXY: require('./getOriginXY'),\n};\n\nextend(utils, require('./arr'));\nextend(utils, require('./domUtils'));\nextend(utils, require('./pointerUtils'));\nextend(utils, require('./rect'));\n\nmodule.exports = utils;\n","const scope = require('../scope');\nconst utils = require('./index');\n\nconst finder = {\n methodOrder: [ 'simulationResume', 'mouseOrPen', 'hasPointer', 'idle' ],\n\n search: function (pointer, eventType, eventTarget) {\n const pointerType = utils.getPointerType(pointer);\n const pointerId = utils.getPointerId(pointer);\n const details = { pointer, pointerId, pointerType, eventType, eventTarget };\n\n for (const method of finder.methodOrder) {\n const interaction = finder[method](details);\n\n if (interaction) {\n return interaction;\n }\n }\n },\n\n // try to resume simulation with a new pointer\n simulationResume: function ({ pointerType, eventType, eventTarget }) {\n if (!/down|start/i.test(eventType)) {\n return null;\n }\n\n for (const interaction of scope.interactions) {\n let element = eventTarget;\n\n if (interaction.simulation && interaction.simulation.allowResume\n && (interaction.pointerType === pointerType)) {\n while (element) {\n // if the element is the interaction element\n if (element === interaction.element) {\n return interaction;\n }\n element = utils.parentNode(element);\n }\n }\n }\n\n return null;\n },\n\n // if it's a mouse or pen interaction\n mouseOrPen: function ({ pointerId, pointerType, eventType }) {\n if (pointerType !== 'mouse' && pointerType !== 'pen') {\n return null;\n }\n\n let firstNonActive;\n\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType) {\n // if it's a down event, skip interactions with running simulations\n if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; }\n\n // if the interaction is active, return it immediately\n if (interaction.interacting()) {\n return interaction;\n }\n // otherwise save it and look for another active interaction\n else if (!firstNonActive) {\n firstNonActive = interaction;\n }\n }\n }\n\n // if no active mouse interaction was found use the first inactive mouse\n // interaction\n if (firstNonActive) {\n return firstNonActive;\n }\n\n // find any mouse or pen interaction.\n // ignore the interaction if the eventType is a *down, and a simulation\n // is active\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType && !(/down/i.test(eventType) && interaction.simulation)) {\n return interaction;\n }\n }\n\n return null;\n },\n\n // get interaction that has this pointer\n hasPointer: function ({ pointerId }) {\n for (const interaction of scope.interactions) {\n if (utils.contains(interaction.pointerIds, pointerId)) {\n return interaction;\n }\n }\n },\n\n // get first idle interaction with a matching pointerType\n idle: function ({ pointerType }) {\n for (const interaction of scope.interactions) {\n // if there's already a pointer held down\n if (interaction.pointerIds.length === 1) {\n const target = interaction.target;\n // don't add this pointer if there is a target interactable and it\n // isn't gesturable\n if (target && !target.options.gesture.enabled) {\n continue;\n }\n }\n // maximum of 2 pointers per interaction\n else if (interaction.pointerIds.length >= 2) {\n continue;\n }\n\n if (!interaction.interacting() && (pointerType === interaction.pointerType)) {\n return interaction;\n }\n }\n\n return null;\n },\n};\n\nmodule.exports = finder;\n","const win = require('./window');\nconst isWindow = require('./isWindow');\n\nconst is = {\n array : () => {},\n\n window : thing => thing === win.window || isWindow(thing),\n\n docFrag : thing => is.object(thing) && thing.nodeType === 11,\n\n object : thing => !!thing && (typeof thing === 'object'),\n\n function: thing => typeof thing === 'function',\n\n number : thing => typeof thing === 'number' ,\n\n bool : thing => typeof thing === 'boolean' ,\n\n string : thing => typeof thing === 'string' ,\n\n element: thing => {\n if (!thing || (typeof thing !== 'object')) { return false; }\n\n const _window = win.getWindow(thing) || win.window;\n\n return (/object|function/.test(typeof _window.Element)\n ? thing instanceof _window.Element //DOM2\n : thing.nodeType === 1 && typeof thing.nodeName === 'string');\n },\n};\n\nis.array = thing => (is.object(thing)\n && (typeof thing.length !== 'undefined')\n && is.function(thing.splice));\n\nmodule.exports = is;\n","module.exports = (thing) => !!(thing && thing.Window) && (thing instanceof thing.Window);\n","function pointerExtend (dest, source) {\n for (const prop in source) {\n const prefixedPropREs = module.exports.prefixedPropREs;\n let deprecated = false;\n\n // skip deprecated prefixed properties\n for (const vendor in prefixedPropREs) {\n if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) {\n deprecated = true;\n break;\n }\n }\n\n if (!deprecated && typeof source[prop] !== 'function') {\n dest[prop] = source[prop];\n }\n }\n return dest;\n}\n\npointerExtend.prefixedPropREs = {\n webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/,\n};\n\nmodule.exports = pointerExtend;\n","const hypot = require('./hypot');\nconst browser = require('./browser');\nconst dom = require('./domObjects');\nconst domUtils = require('./domUtils');\nconst domObjects = require('./domObjects');\nconst is = require('./is');\nconst pointerExtend = require('./pointerExtend');\n\nconst pointerUtils = {\n copyCoords: function (dest, src) {\n dest.page = dest.page || {};\n dest.page.x = src.page.x;\n dest.page.y = src.page.y;\n\n dest.client = dest.client || {};\n dest.client.x = src.client.x;\n dest.client.y = src.client.y;\n\n dest.timeStamp = src.timeStamp;\n },\n\n setCoordDeltas: function (targetObj, prev, cur) {\n targetObj.page.x = cur.page.x - prev.page.x;\n targetObj.page.y = cur.page.y - prev.page.y;\n targetObj.client.x = cur.client.x - prev.client.x;\n targetObj.client.y = cur.client.y - prev.client.y;\n targetObj.timeStamp = cur.timeStamp - prev.timeStamp;\n\n // set pointer velocity\n const dt = Math.max(targetObj.timeStamp / 1000, 0.001);\n\n targetObj.page.speed = hypot(targetObj.page.x, targetObj.page.y) / dt;\n targetObj.page.vx = targetObj.page.x / dt;\n targetObj.page.vy = targetObj.page.y / dt;\n\n targetObj.client.speed = hypot(targetObj.client.x, targetObj.page.y) / dt;\n targetObj.client.vx = targetObj.client.x / dt;\n targetObj.client.vy = targetObj.client.y / dt;\n },\n\n isNativePointer: function (pointer) {\n return (pointer instanceof dom.Event || pointer instanceof dom.Touch);\n },\n\n // Get specified X/Y coords for mouse or event.touches[0]\n getXY: function (type, pointer, xy) {\n xy = xy || {};\n type = type || 'page';\n\n xy.x = pointer[type + 'X'];\n xy.y = pointer[type + 'Y'];\n\n return xy;\n },\n\n getPageXY: function (pointer, page) {\n page = page || {};\n\n // Opera Mobile handles the viewport and scrolling oddly\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n pointerUtils.getXY('screen', pointer, page);\n\n page.x += window.scrollX;\n page.y += window.scrollY;\n }\n else {\n pointerUtils.getXY('page', pointer, page);\n }\n\n return page;\n },\n\n getClientXY: function (pointer, client) {\n client = client || {};\n\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n // Opera Mobile handles the viewport and scrolling oddly\n pointerUtils.getXY('screen', pointer, client);\n }\n else {\n pointerUtils.getXY('client', pointer, client);\n }\n\n return client;\n },\n\n getPointerId: function (pointer) {\n return is.number(pointer.pointerId)? pointer.pointerId : pointer.identifier;\n },\n\n setCoords: function (targetObj, pointers, timeStamp) {\n const pointer = (pointers.length > 1\n ? pointerUtils.pointerAverage(pointers)\n : pointers[0]);\n\n const tmpXY = {};\n\n pointerUtils.getPageXY(pointer, tmpXY);\n targetObj.page.x = tmpXY.x;\n targetObj.page.y = tmpXY.y;\n\n pointerUtils.getClientXY(pointer, tmpXY);\n targetObj.client.x = tmpXY.x;\n targetObj.client.y = tmpXY.y;\n\n targetObj.timeStamp = is.number(timeStamp) ? timeStamp :new Date().getTime();\n },\n\n pointerExtend: pointerExtend,\n\n getTouchPair: function (event) {\n const touches = [];\n\n // array of touches is supplied\n if (is.array(event)) {\n touches[0] = event[0];\n touches[1] = event[1];\n }\n // an event\n else {\n if (event.type === 'touchend') {\n if (event.touches.length === 1) {\n touches[0] = event.touches[0];\n touches[1] = event.changedTouches[0];\n }\n else if (event.touches.length === 0) {\n touches[0] = event.changedTouches[0];\n touches[1] = event.changedTouches[1];\n }\n }\n else {\n touches[0] = event.touches[0];\n touches[1] = event.touches[1];\n }\n }\n\n return touches;\n },\n\n pointerAverage: function (pointers) {\n const average = {\n pageX : 0,\n pageY : 0,\n clientX: 0,\n clientY: 0,\n screenX: 0,\n screenY: 0,\n };\n\n for (const pointer of pointers) {\n for (const prop in average) {\n average[prop] += pointer[prop];\n }\n }\n for (const prop in average) {\n average[prop] /= pointers.length;\n }\n\n return average;\n },\n\n touchBBox: function (event) {\n if (!event.length && !(event.touches && event.touches.length > 1)) {\n return;\n }\n\n const touches = pointerUtils.getTouchPair(event);\n const minX = Math.min(touches[0].pageX, touches[1].pageX);\n const minY = Math.min(touches[0].pageY, touches[1].pageY);\n const maxX = Math.max(touches[0].pageX, touches[1].pageX);\n const maxY = Math.max(touches[0].pageY, touches[1].pageY);\n\n return {\n x: minX,\n y: minY,\n left: minX,\n top: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n },\n\n touchDistance: function (event, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n\n\n const dx = touches[0][sourceX] - touches[1][sourceX];\n const dy = touches[0][sourceY] - touches[1][sourceY];\n\n return hypot(dx, dy);\n },\n\n touchAngle: function (event, prevAngle, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n const dx = touches[1][sourceX] - touches[0][sourceX];\n const dy = touches[1][sourceY] - touches[0][sourceY];\n const angle = 180 * Math.atan2(dy , dx) / Math.PI;\n\n return angle;\n },\n\n getPointerType: function (pointer) {\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : is.number(pointer.pointerType)\n ? [undefined, undefined,'touch', 'pen', 'mouse'][pointer.pointerType]\n // if the PointerEvent API isn't available, then the \"pointer\" must\n // be either a MouseEvent, TouchEvent, or Touch object\n : /touch/.test(pointer.type) || pointer instanceof domObjects.Touch\n ? 'touch'\n : 'mouse';\n },\n\n // [ event.target, event.currentTarget ]\n getEventTargets: function (event) {\n return [\n domUtils.getActualElement(event.path ? event.path[0] : event.target),\n domUtils.getActualElement(event.currentTarget),\n ];\n },\n};\n\nmodule.exports = pointerUtils;\n","const { window } = require('./window');\n\nconst vendors = ['ms', 'moz', 'webkit', 'o'];\nlet lastTime = 0;\nlet request;\nlet cancel;\n\nfor (let x = 0; x < vendors.length && !window.requestAnimationFrame; x++) {\n request = window[vendors[x] + 'RequestAnimationFrame'];\n cancel = window[vendors[x] +'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n}\n\nif (!request) {\n request = function (callback) {\n const currTime = new Date().getTime();\n const timeToCall = Math.max(0, 16 - (currTime - lastTime));\n const id = setTimeout(function () { callback(currTime + timeToCall); },\n timeToCall);\n\n lastTime = currTime + timeToCall;\n return id;\n };\n}\n\nif (!cancel) {\n cancel = function (id) {\n clearTimeout(id);\n };\n}\n\nmodule.exports = {\n request,\n cancel,\n};\n","const extend = require('./extend');\nconst is = require('./is');\nconst {\n closest,\n parentNode,\n getElementRect,\n} = require('./domUtils');\n\nconst rectUtils = {\n getStringOptionResult: function (value, interactable, element) {\n if (!is.string(value)) {\n return null;\n }\n\n if (value === 'parent') {\n value = parentNode(element);\n }\n else if (value === 'self') {\n value = interactable.getRect(element);\n }\n else {\n value = closest(element, value);\n }\n\n return value;\n },\n\n resolveRectLike: function (value, interactable, element, functionArgs) {\n value = rectUtils.getStringOptionResult(value, interactable, element) || value;\n\n if (is.function(value)) {\n value = value.apply(null, functionArgs);\n }\n\n if (is.element(value)) {\n value = getElementRect(value);\n }\n\n return value;\n },\n\n rectToXY: function (rect) {\n return rect && {\n x: 'x' in rect ? rect.x : rect.left,\n y: 'y' in rect ? rect.y : rect.top,\n };\n },\n\n xywhToTlbr: function (rect) {\n if (rect && !('left' in rect && 'top' in rect)) {\n rect = extend({}, rect);\n\n rect.left = rect.x || 0;\n rect.top = rect.y || 0;\n rect.right = rect.right || (rect.left + rect.width);\n rect.bottom = rect.bottom || (rect.top + rect.height);\n }\n\n return rect;\n },\n\n tlbrToXywh: function (rect) {\n if (rect && !('x' in rect && 'y' in rect)) {\n rect = extend({}, rect);\n\n rect.x = rect.left || 0;\n rect.top = rect.top || 0;\n rect.width = rect.width || (rect.right - rect.x);\n rect.height = rect.height || (rect.bottom - rect.y);\n }\n\n return rect;\n },\n};\n\nmodule.exports = rectUtils;\n","const win = module.exports;\nconst isWindow = require('./isWindow');\n\nfunction init (window) {\n // get wrapped window if using Shadow DOM polyfill\n\n win.realWindow = window;\n\n // create a TextNode\n const el = window.document.createTextNode('');\n\n // check if it's wrapped by a polyfill\n if (el.ownerDocument !== window.document\n && typeof window.wrap === 'function'\n && window.wrap(el) === el) {\n // use wrapped window\n window = window.wrap(window);\n }\n\n win.window = window;\n}\n\nif (typeof window === 'undefined') {\n win.window = undefined;\n win.realWindow = undefined;\n}\nelse {\n init(window);\n}\n\nwin.getWindow = function getWindow (node) {\n if (isWindow(node)) {\n return node;\n }\n\n const rootNode = (node.ownerDocument || node);\n\n return rootNode.defaultView || rootNode.parentWindow || win.window;\n};\n\nwin.init = init;\n"]} \ No newline at end of file diff --git a/package.json b/package.json index 76f3e9969..f39704e99 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "interactjs", - "version": "1.3.0-alpha.3+sha.9595c40", + "version": "1.3.0-alpha.4+sha.7970416", "repository": { "type": "git", "url": "https://github.com/taye/interact.js.git"
- interact.dynamicDrop([newValue])⚓➭ + interact.dynamicDrop([newValue])⚓➭ @@ -497,7 +497,7 @@ Parameters - Interactable.resizable([options])⚓➭ + Interactable.resizable([options])⚓➭ @@ -638,7 +638,7 @@ Parameters - Interactable.gesturable([options])⚓➭ + Interactable.gesturable([options])⚓➭ @@ -758,7 +758,7 @@ Parameters - Interactable⚓➭ + Interactable⚓➭ @@ -783,7 +783,7 @@ Interactable - Interactable.getRect([element])⚓➭ + Interactable.getRect([element])⚓➭ @@ -888,7 +888,7 @@ Parameters - Interactable.rectChecker([checker])⚓➭ + Interactable.rectChecker([checker])⚓➭ @@ -951,7 +951,7 @@ Parameters - Interactable.origin(…)⚓➭ + Interactable.origin(…)⚓➭ @@ -1041,7 +1041,7 @@ Parameters - Interactable.deltaSource([newValue])⚓➭ + Interactable.deltaSource([newValue])⚓➭ @@ -1104,7 +1104,7 @@ Parameters - Interactable.context()⚓➭ + Interactable.context()⚓➭ @@ -1146,7 +1146,7 @@ Interactable.context() - Interactable.fire(iEvent)⚓➭ + Interactable.fire(iEvent)⚓➭ @@ -1207,7 +1207,7 @@ Parameters - Interactable.on(eventType, listener, [options])⚓➭ + Interactable.on(eventType, listener, [options])⚓➭ @@ -1273,7 +1273,7 @@ Parameters - Interactable.off(eventType, listener, [options])⚓➭ + Interactable.off(eventType, listener, [options])⚓➭ @@ -1339,7 +1339,7 @@ Parameters - Interactable.set(options)⚓➭ + Interactable.set(options)⚓➭ @@ -1399,7 +1399,7 @@ Parameters - Interactable.unset()⚓➭ + Interactable.unset()⚓➭ @@ -1442,7 +1442,7 @@ Interactable.unset() - Interactable.actionChecker([checker])⚓➭ + Interactable.actionChecker([checker])⚓➭ @@ -1542,7 +1542,7 @@ Parameters - Interactable.styleCursor([newValue])⚓➭ + Interactable.styleCursor([newValue])⚓➭ @@ -1605,7 +1605,7 @@ Parameters - interact.maxInteractions([newValue])⚓➭ + interact.maxInteractions([newValue])⚓➭ @@ -1652,7 +1652,7 @@ Parameters - Interactable.preventDefault([newValue])⚓➭ + Interactable.preventDefault([newValue])⚓➭ @@ -1718,7 +1718,7 @@ Parameters - interact(element)⚓➭ + interact(element)⚓➭ @@ -1821,7 +1821,7 @@ Usage - interact.isSet(element)⚓➭ + interact.isSet(element)⚓➭ @@ -1881,7 +1881,7 @@ Parameters - interact.on(type, listener, [options])⚓➭ + interact.on(type, listener, [options])⚓➭ @@ -1948,7 +1948,7 @@ Parameters - interact.off(type, listener, [options])⚓➭ + interact.off(type, listener, [options])⚓➭ @@ -2014,7 +2014,7 @@ Parameters - interact.debug()⚓➭ + interact.debug()⚓➭ @@ -2056,7 +2056,7 @@ interact.debug() - interact.supportsTouch()⚓➭ + interact.supportsTouch()⚓➭ @@ -2097,7 +2097,7 @@ interact.supportsTouch() - interact.supportsPointerEvent()⚓➭ + interact.supportsPointerEvent()⚓➭ @@ -2138,7 +2138,7 @@ interact.supportsPointerEvent() - interact.stop(event)⚓➭ + interact.stop(event)⚓➭ @@ -2198,7 +2198,7 @@ Parameters - interact.pointerMoveTolerance([newValue])⚓➭ + interact.pointerMoveTolerance([newValue])⚓➭ @@ -2261,7 +2261,7 @@ Parameters - Interaction.start(action, target, element)⚓➭ + Interaction.start(action, target, element)⚓➭ @@ -2356,7 +2356,7 @@ Parameters - Interaction.doMove()⚓➭ + Interaction.doMove()⚓➭ @@ -2403,7 +2403,7 @@ Interaction.doMove() - Interaction.end([event])⚓➭ + Interaction.end([event])⚓➭ diff --git a/dist/interact.js b/dist/interact.js index e8ae35c3b..c78a3c751 100644 --- a/dist/interact.js +++ b/dist/interact.js @@ -1,5 +1,5 @@ /** - * interact.js v1.3.0-alpha.3+sha.9595c40 + * interact.js v1.3.0-alpha.4+sha.7970416-dirty * * Copyright (c) 2012-2017 Taye Adeyemi * Open source under the MIT License. @@ -816,6 +816,7 @@ var scope = require('./scope'); var utils = require('./utils'); var events = require('./utils/events'); var browser = require('./utils/browser'); +var domObjects = require('./utils/domObjects'); var finder = require('./utils/interactionFinder'); var signals = require('./utils/Signals').new(); @@ -829,7 +830,9 @@ var prevTouchTime = 0; scope.interactions = []; var Interaction = function () { - function Interaction() { + function Interaction(_ref) { + var pointerType = _ref.pointerType; + _classCallCheck(this, Interaction); this.target = null; // current interactable being interacted with @@ -886,7 +889,7 @@ var Interaction = function () { this.pointerWasMoved = false; this._interacting = false; - this.mouse = false; + this.pointerType = pointerType; signals.fire('new', this); @@ -1130,6 +1133,11 @@ var Interaction = function () { }; Interaction.prototype.getPointerIndex = function getPointerIndex(pointer) { + // mouse and pen interactions may have only one pointer + if (this.pointerType === 'mouse' || this.pointerType === 'pen') { + return 0; + } + return utils.indexOf(this.pointerIds, utils.getPointerId(pointer)); }; @@ -1161,8 +1169,7 @@ var Interaction = function () { }; Interaction.prototype.removePointer = function removePointer(pointer, event) { - var id = utils.getPointerId(pointer); - var index = this.mouse ? 0 : utils.indexOf(this.pointerIds, id); + var index = this.getPointerIndex(pointer); if (index === -1) { return; @@ -1197,6 +1204,8 @@ for (var i = 0, len = methodNames.length; i < len; i++) { function doOnInteractions(method) { return function (event) { + var pointerType = utils.getPointerType(event); + var _utils$getEventTarget = utils.getEventTargets(event), eventTarget = _utils$getEventTarget[0], curEventTarget = _utils$getEventTarget[1]; @@ -1210,7 +1219,7 @@ function doOnInteractions(method) { var pointer = event.changedTouches[_i]; var interaction = finder.search(pointer, event.type, eventTarget); - matches.push([pointer, interaction || new Interaction()]); + matches.push([pointer, interaction || new Interaction({ pointerType: pointerType })]); } } else { var invalidPointer = false; @@ -1218,7 +1227,7 @@ function doOnInteractions(method) { if (!browser.supportsPointerEvent && /mouse/.test(event.type)) { // ignore mouse events while touch interactions are active for (var _i2 = 0; _i2 < scope.interactions.length && !invalidPointer; _i2++) { - invalidPointer = !scope.interactions[_i2].mouse && scope.interactions[_i2].pointerIsDown; + invalidPointer = scope.interactions[_i2].pointerType !== 'mouse' && scope.interactions[_i2].pointerIsDown; } // try to ignore mouse events that are simulated by the browser @@ -1232,11 +1241,7 @@ function doOnInteractions(method) { var _interaction = finder.search(event, event.type, eventTarget); if (!_interaction) { - - _interaction = new Interaction(); - _interaction.mouse = /mouse/i.test(event.pointerType || event.type) - // MSPointerEvent.MSPOINTER_TYPE_MOUSE - || event.pointerType === 4 || !event.pointerType; + _interaction = new Interaction({ pointerType: pointerType }); } matches.push([event, _interaction]); @@ -1244,20 +1249,20 @@ function doOnInteractions(method) { } for (var _iterator = matches, _isArray = Array.isArray(_iterator), _i3 = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { - var _ref; + var _ref2; if (_isArray) { if (_i3 >= _iterator.length) break; - _ref = _iterator[_i3++]; + _ref2 = _iterator[_i3++]; } else { _i3 = _iterator.next(); if (_i3.done) break; - _ref = _i3.value; + _ref2 = _i3.value; } - var _ref2 = _ref, - _pointer = _ref2[0], - _interaction2 = _ref2[1]; + var _ref3 = _ref2, + _pointer = _ref3[0], + _interaction2 = _ref3[1]; _interaction2._updateEventTargets(eventTarget, curEventTarget); _interaction2[method](_pointer, event, eventTarget, curEventTarget); @@ -1277,7 +1282,7 @@ function endAll(event) { var docEvents = {/* 'eventType': listenerFunc */}; var pEventTypes = browser.pEventTypes; -if (scope.PointerEvent) { +if (domObjects.PointerEvent) { docEvents[pEventTypes.down] = listeners.pointerDown; docEvents[pEventTypes.move] = listeners.pointerMove; docEvents[pEventTypes.up] = listeners.pointerUp; @@ -1295,8 +1300,8 @@ if (scope.PointerEvent) { docEvents.blur = endAll; -function onDocSignal(_ref3, signalName) { - var doc = _ref3.doc; +function onDocSignal(_ref4, signalName) { + var doc = _ref4.doc; var eventMethod = signalName.indexOf('add') === 0 ? events.add : events.remove; @@ -1311,14 +1316,14 @@ function onDocSignal(_ref3, signalName) { } } -signals.on('update-pointer-down', function (_ref4) { - var interaction = _ref4.interaction, - pointer = _ref4.pointer, - pointerId = _ref4.pointerId, - pointerIndex = _ref4.pointerIndex, - event = _ref4.event, - eventTarget = _ref4.eventTarget, - down = _ref4.down; +signals.on('update-pointer-down', function (_ref5) { + var interaction = _ref5.interaction, + pointer = _ref5.pointer, + pointerId = _ref5.pointerId, + pointerIndex = _ref5.pointerIndex, + event = _ref5.event, + eventTarget = _ref5.eventTarget, + down = _ref5.down; interaction.pointerIds[pointerIndex] = pointerId; interaction.pointers[pointerIndex] = pointer; @@ -1355,7 +1360,7 @@ scope.endAllInteractions = endAll; module.exports = Interaction; -},{"./scope":34,"./utils":44,"./utils/Signals":35,"./utils/browser":37,"./utils/events":40,"./utils/interactionFinder":45}],6:[function(require,module,exports){ +},{"./scope":34,"./utils":44,"./utils/Signals":35,"./utils/browser":37,"./utils/domObjects":38,"./utils/events":40,"./utils/interactionFinder":45}],6:[function(require,module,exports){ 'use strict'; var Interaction = require('../Interaction'); @@ -5460,7 +5465,7 @@ module.exports = function () { this.originalEvent = event; this.type = type; this.pointerId = pointerUtils.getPointerId(pointer); - this.pointerType = pointerUtils.getPointerType(pointer, interaction); + this.pointerType = pointerUtils.getPointerType(pointer); this.target = eventTarget; this.currentTarget = null; @@ -5758,8 +5763,10 @@ Interaction.signals.on('down', function (_ref6) { timer.duration = minDuration; timer.timeout = setTimeout(function () { fire({ - interaction: interaction, eventCopy: eventCopy, eventTarget: eventTarget, + interaction: interaction, + eventTarget: eventTarget, pointer: browser.isIE8 ? eventCopy : pointer, + event: eventCopy, type: 'hold' }); }, minDuration); @@ -6946,17 +6953,14 @@ module.exports = utils; var scope = require('../scope'); var utils = require('./index'); -var browser = require('./browser'); var finder = { - methodOrder: ['simulationResume', 'mouse', 'hasPointer', 'idle'], + methodOrder: ['simulationResume', 'mouseOrPen', 'hasPointer', 'idle'], search: function search(pointer, eventType, eventTarget) { - var mouseEvent = /mouse/i.test(pointer.pointerType || eventType) - // MSPointerEvent.MSPOINTER_TYPE_MOUSE - || pointer.pointerType === 4; + var pointerType = utils.getPointerType(pointer); var pointerId = utils.getPointerId(pointer); - var details = { pointer: pointer, pointerId: pointerId, mouseEvent: mouseEvent, eventType: eventType, eventTarget: eventTarget }; + var details = { pointer: pointer, pointerId: pointerId, pointerType: pointerType, eventType: eventType, eventTarget: eventTarget }; for (var _iterator = finder.methodOrder, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { var _ref; @@ -6982,7 +6986,7 @@ var finder = { // try to resume simulation with a new pointer simulationResume: function simulationResume(_ref2) { - var mouseEvent = _ref2.mouseEvent, + var pointerType = _ref2.pointerType, eventType = _ref2.eventType, eventTarget = _ref2.eventTarget; @@ -7006,7 +7010,7 @@ var finder = { var element = eventTarget; - if (interaction.simulation && interaction.simulation.allowResume && interaction.mouse === mouseEvent) { + if (interaction.simulation && interaction.simulation.allowResume && interaction.pointerType === pointerType) { while (element) { // if the element is the interaction element if (element === interaction.element) { @@ -7020,13 +7024,13 @@ var finder = { return null; }, - // if it's a mouse interaction - mouse: function mouse(_ref4) { + // if it's a mouse or pen interaction + mouseOrPen: function mouseOrPen(_ref4) { var pointerId = _ref4.pointerId, - mouseEvent = _ref4.mouseEvent, + pointerType = _ref4.pointerType, eventType = _ref4.eventType; - if (!mouseEvent && (browser.supportsTouch || browser.supportsPointerEvent)) { + if (pointerType !== 'mouse' && pointerType !== 'pen') { return null; } @@ -7046,7 +7050,7 @@ var finder = { var interaction = _ref5; - if (interaction.mouse) { + if (interaction.pointerType === pointerType) { // if it's a down event, skip interactions with running simulations if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; @@ -7069,8 +7073,8 @@ var finder = { return firstNonActive; } - // Find any interaction specifically for mouse. - // ignore the interaction if the eventType is a mousedown, and a simulation + // find any mouse or pen interaction. + // ignore the interaction if the eventType is a *down, and a simulation // is active for (var _iterator4 = scope.interactions, _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) { var _ref6; @@ -7086,7 +7090,7 @@ var finder = { var _interaction = _ref6; - if (_interaction.mouse && !(/down/.test(eventType) && _interaction.simulation)) { + if (_interaction.pointerType === pointerType && !(/down/i.test(eventType) && _interaction.simulation)) { return _interaction; } } @@ -7118,9 +7122,9 @@ var finder = { } }, - // get first idle interaction + // get first idle interaction with a matching pointerType idle: function idle(_ref9) { - var mouseEvent = _ref9.mouseEvent; + var pointerType = _ref9.pointerType; for (var _iterator6 = scope.interactions, _isArray6 = Array.isArray(_iterator6), _i6 = 0, _iterator6 = _isArray6 ? _iterator6 : _iterator6[Symbol.iterator]();;) { var _ref10; @@ -7150,7 +7154,7 @@ var finder = { continue; } - if (!interaction.interacting() && mouseEvent === interaction.mouse) { + if (!interaction.interacting() && pointerType === interaction.pointerType) { return interaction; } } @@ -7161,7 +7165,7 @@ var finder = { module.exports = finder; -},{"../scope":34,"./browser":37,"./index":44}],46:[function(require,module,exports){ +},{"../scope":34,"./index":44}],46:[function(require,module,exports){ 'use strict'; var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; @@ -7262,6 +7266,7 @@ var hypot = require('./hypot'); var browser = require('./browser'); var dom = require('./domObjects'); var domUtils = require('./domUtils'); +var domObjects = require('./domObjects'); var is = require('./is'); var pointerExtend = require('./pointerExtend'); @@ -7468,17 +7473,11 @@ var pointerUtils = { return angle; }, - getPointerType: function getPointerType(pointer, interaction) { - // if the PointerEvent API isn't available, then the pointer must be ither - // a MouseEvent or TouchEvent - if (interaction.mouse) { - return 'mouse'; - } - if (!browser.supportsPointerEvent) { - return 'touch'; - } - - return is.string(pointer.pointerType) ? pointer.pointerType : [undefined, undefined, 'touch', 'pen', 'mouse'][pointer.pointerType]; + getPointerType: function getPointerType(pointer) { + return is.string(pointer.pointerType) ? pointer.pointerType : is.number(pointer.pointerType) ? [undefined, undefined, 'touch', 'pen', 'mouse'][pointer.pointerType] + // if the PointerEvent API isn't available, then the "pointer" must + // be either a MouseEvent, TouchEvent, or Touch object + : /touch/.test(pointer.type) || pointer instanceof domObjects.Touch ? 'touch' : 'mouse'; }, // [ event.target, event.currentTarget ] diff --git a/dist/interact.js.map b/dist/interact.js.map index 60832b766..4f3a62ba8 100644 --- a/dist/interact.js.map +++ b/dist/interact.js.map @@ -1 +1 @@ -{"version":3,"sources":["src/header.js","node_modules/browser-pack/_prelude.js","index.js","src/Eventable.js","src/InteractEvent.js","src/Interactable.js","src/Interaction.js","src/actions/base.js","src/actions/drag.js","src/actions/drop.js","src/actions/gesture.js","src/actions/resize.js","src/autoScroll.js","src/autoStart/InteractableMethods.js","src/autoStart/base.js","src/autoStart/delay.js","src/autoStart/drag.js","src/autoStart/gesture.js","src/autoStart/resize.js","src/defaultOptions.js","src/index.js","src/inertia.js","src/interact.js","src/interactablePreventDefault.js","src/legacyBrowsers.js","src/modifiers/index.js","src/modifiers/restrict.js","src/modifiers/restrictEdges.js","src/modifiers/restrictSize.js","src/modifiers/snap.js","src/modifiers/snapSize.js","src/pointerEvents/PointerEvent.js","src/pointerEvents/base.js","src/pointerEvents/holdRepeat.js","src/pointerEvents/interactableTargets.js","src/scope.js","src/utils/Signals.js","src/utils/arr.js","src/utils/browser.js","src/utils/domObjects.js","src/utils/domUtils.js","src/utils/events.js","src/utils/extend.js","src/utils/getOriginXY.js","src/utils/hypot.js","src/utils/index.js","src/utils/interactionFinder.js","src/utils/is.js","src/utils/isWindow.js","src/utils/pointerExtend.js","src/utils/pointerUtils.js","src/utils/raf.js","src/utils/rect.js","src/utils/window.js"],"names":[],"mappings":"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","file":"interact.js","sourceRoot":"","sourcesContent":["/**\n * interact.js v1.3.0-alpha.3+sha.9595c40\n *\n * Copyright (c) 2012-2017 Taye Adeyemi \n * Open source under the MIT License.\n * https://raw.github.com/taye/interact.js/master/LICENSE\n */\n","(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o 150) {\n return null;\n }\n\n let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI;\n const overlap = 22.5;\n\n if (angle < 0) {\n angle += 360;\n }\n\n const left = 135 - overlap <= angle && angle < 225 + overlap;\n const up = 225 - overlap <= angle && angle < 315 + overlap;\n\n const right = !left && (315 - overlap <= angle || angle < 45 + overlap);\n const down = !up && 45 - overlap <= angle && angle < 135 + overlap;\n\n return {\n up,\n down,\n left,\n right,\n angle,\n speed: interaction.prevEvent.speed,\n velocity: {\n x: interaction.prevEvent.velocityX,\n y: interaction.prevEvent.velocityY,\n },\n };\n }\n\n preventDefault () {}\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n}\n\nsignals.on('set-delta', function ({ iEvent, interaction, starting, deltaSource }) {\n const prevEvent = starting? iEvent : interaction.prevEvent;\n\n if (deltaSource === 'client') {\n iEvent.dx = iEvent.clientX - prevEvent.clientX;\n iEvent.dy = iEvent.clientY - prevEvent.clientY;\n }\n else {\n iEvent.dx = iEvent.pageX - prevEvent.pageX;\n iEvent.dy = iEvent.pageY - prevEvent.pageY;\n }\n});\n\nInteractEvent.signals = signals;\n\nmodule.exports = InteractEvent;\n","const is = require('./utils/is');\nconst events = require('./utils/events');\nconst extend = require('./utils/extend');\nconst actions = require('./actions/base');\nconst scope = require('./scope');\nconst Eventable = require('./Eventable');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nconst {\n getElementRect,\n nodeContains,\n trySelector,\n} = require('./utils/domUtils');\nconst { getWindow } = require('./utils/window');\nconst { indexOf, contains } = require('./utils/arr');\nconst { wheelEvent } = require('./utils/browser');\n\n// all set interactables\nscope.interactables = [];\n\n/*\\\n * Interactable\n [ property ]\n **\n * Object type returned by @interact\n\\*/\nclass Interactable {\n constructor (target, options) {\n options = options || {};\n\n this.target = target;\n this.events = new Eventable();\n this._context = options.context || scope.document;\n this._win = getWindow(trySelector(target)? this._context : target);\n this._doc = this._win.document;\n\n signals.fire('new', {\n target,\n options,\n interactable: this,\n win: this._win,\n });\n\n scope.addDocument( this._doc, this._win );\n\n scope.interactables.push(this);\n\n this.set(options);\n }\n\n setOnEvents (action, phases) {\n const onAction = 'on' + action;\n\n if (is.function(phases.onstart) ) { this.events[onAction + 'start' ] = phases.onstart ; }\n if (is.function(phases.onmove) ) { this.events[onAction + 'move' ] = phases.onmove ; }\n if (is.function(phases.onend) ) { this.events[onAction + 'end' ] = phases.onend ; }\n if (is.function(phases.oninertiastart)) { this.events[onAction + 'inertiastart' ] = phases.oninertiastart ; }\n\n return this;\n }\n\n setPerAction (action, options) {\n // for all the default per-action options\n for (const option in options) {\n // if this option exists for this action\n if (option in defaults[action]) {\n // if the option in the options arg is an object value\n if (is.object(options[option])) {\n // duplicate the object\n this.options[action][option] = extend(this.options[action][option] || {}, options[option]);\n\n if (is.object(defaults.perAction[option]) && 'enabled' in defaults.perAction[option]) {\n this.options[action][option].enabled = options[option].enabled === false? false : true;\n }\n }\n else if (is.bool(options[option]) && is.object(defaults.perAction[option])) {\n this.options[action][option].enabled = options[option];\n }\n else if (options[option] !== undefined) {\n // or if it's not undefined, do a plain assignment\n this.options[action][option] = options[option];\n }\n }\n }\n }\n\n /*\\\n * Interactable.getRect\n [ method ]\n *\n * The default function to get an Interactables bounding rect. Can be\n * overridden using @Interactable.rectChecker.\n *\n - element (Element) #optional The element to measure.\n = (object) The object's bounding rectangle.\n o {\n o top : 0,\n o left : 0,\n o bottom: 0,\n o right : 0,\n o width : 0,\n o height: 0\n o }\n \\*/\n getRect (element) {\n element = element || this.target;\n\n if (is.string(this.target) && !(is.element(element))) {\n element = this._context.querySelector(this.target);\n }\n\n return getElementRect(element);\n }\n\n /*\\\n * Interactable.rectChecker\n [ method ]\n *\n * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n - checker (function) #optional A function which returns this Interactable's bounding rectangle. See @Interactable.getRect\n = (function | object) The checker function or this Interactable\n \\*/\n rectChecker (checker) {\n if (is.function(checker)) {\n this.getRect = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.getRect;\n\n return this;\n }\n\n return this.getRect;\n }\n\n _backCompatOption (optionName, newValue) {\n if (trySelector(newValue) || is.object(newValue)) {\n this.options[optionName] = newValue;\n\n for (const action of actions.names) {\n this.options[action][optionName] = newValue;\n }\n\n return this;\n }\n\n return this.options[optionName];\n }\n\n /*\\\n * Interactable.origin\n [ method ]\n *\n * Gets or sets the origin of the Interactable's element. The x and y\n * of the origin will be subtracted from action event coordinates.\n *\n - origin (object | string) #optional An object eg. { x: 0, y: 0 } or string 'parent', 'self' or any CSS selector\n * OR\n - origin (Element) #optional An HTML or SVG Element whose rect will be used\n **\n = (object) The current origin or this Interactable\n \\*/\n origin (newValue) {\n return this._backCompatOption('origin', newValue);\n }\n\n /*\\\n * Interactable.deltaSource\n [ method ]\n *\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n - newValue (string) #optional Use 'client' if you will be scrolling while interacting; Use 'page' if you want autoScroll to work\n = (string | object) The current deltaSource or this Interactable\n \\*/\n deltaSource (newValue) {\n if (newValue === 'page' || newValue === 'client') {\n this.options.deltaSource = newValue;\n\n return this;\n }\n\n return this.options.deltaSource;\n }\n\n /*\\\n * Interactable.context\n [ method ]\n *\n * Gets the selector context Node of the Interactable. The default is `window.document`.\n *\n = (Node) The context Node of this Interactable\n **\n \\*/\n context () {\n return this._context;\n }\n\n inContext (element) {\n return (this._context === element.ownerDocument\n || nodeContains(this._context, element));\n }\n\n /*\\\n * Interactable.fire\n [ method ]\n *\n * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n - iEvent (InteractEvent) The InteractEvent object to be fired on this Interactable\n = (Interactable) this Interactable\n \\*/\n fire (iEvent) {\n this.events.fire(iEvent);\n\n return this;\n }\n\n _onOffMultiple (method, eventType, listener, options) {\n if (is.string(eventType) && eventType.search(' ') !== -1) {\n eventType = eventType.trim().split(/ +/);\n }\n\n if (is.array(eventType)) {\n for (let i = 0; i < eventType.length; i++) {\n this[method](eventType[i], listener, options);\n }\n\n return true;\n }\n\n if (is.object(eventType)) {\n for (const prop in eventType) {\n this[method](prop, eventType[prop], listener);\n }\n\n return true;\n }\n }\n\n /*\\\n * Interactable.on\n [ method ]\n *\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n - eventType (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) This Interactable\n \\*/\n on (eventType, listener, options) {\n if (this._onOffMultiple('on', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.on(eventType, listener);\n }\n // delegated event for selector\n else if (is.string(this.target)) {\n events.addDelegate(this.target, this._context, eventType, listener, options);\n }\n else {\n events.add(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.off\n [ method ]\n *\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n - eventType (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) This Interactable\n \\*/\n off (eventType, listener, options) {\n if (this._onOffMultiple('off', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n // if it is an action event type\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.off(eventType, listener);\n }\n // delegated event\n else if (is.string(this.target)) {\n events.removeDelegate(this.target, this._context, eventType, listener, options);\n }\n // remove listener from this Interatable's element\n else {\n events.remove(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.set\n [ method ]\n *\n * Reset the options of this Interactable\n - options (object) The new settings to apply\n = (object) This Interactable\n \\*/\n set (options) {\n if (!is.object(options)) {\n options = {};\n }\n\n this.options = extend({}, defaults.base);\n\n const perActions = extend({}, defaults.perAction);\n\n for (const actionName in actions.methodDict) {\n const methodName = actions.methodDict[actionName];\n\n this.options[actionName] = extend({}, defaults[actionName]);\n\n this.setPerAction(actionName, perActions);\n\n this[methodName](options[actionName]);\n }\n\n for (const setting of Interactable.settingsMethods) {\n this.options[setting] = defaults.base[setting];\n\n if (setting in options) {\n this[setting](options[setting]);\n }\n }\n\n signals.fire('set', {\n options,\n interactable: this,\n });\n\n return this;\n }\n\n /*\\\n * Interactable.unset\n [ method ]\n *\n * Remove this interactable from the list of interactables and remove\n * it's action capabilities and event listeners\n *\n = (object) @interact\n \\*/\n unset () {\n events.remove(this.target, 'all');\n\n if (is.string(this.target)) {\n // remove delegated events\n for (const type in events.delegatedEvents) {\n const delegated = events.delegatedEvents[type];\n\n if (delegated.selectors[0] === this.target\n && delegated.contexts[0] === this._context) {\n\n delegated.selectors.splice(0, 1);\n delegated.contexts .splice(0, 1);\n delegated.listeners.splice(0, 1);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegated[type] = null;\n }\n }\n\n events.remove(this._context, type, events.delegateListener);\n events.remove(this._context, type, events.delegateUseCapture, true);\n }\n }\n else {\n events.remove(this, 'all');\n }\n\n signals.fire('unset', { interactable: this });\n\n scope.interactables.splice(indexOf(scope.interactables, this), 1);\n\n // Stop related interactions when an Interactable is unset\n for (const interaction of scope.interactions || []) {\n if (interaction.target === this && interaction.interacting()) {\n interaction.stop();\n }\n }\n\n return scope.interact;\n }\n}\n\nscope.interactables.indexOfElement = function indexOfElement (target, context) {\n context = context || scope.document;\n\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n if (interactable.target === target && interactable._context === context) {\n return i;\n }\n }\n return -1;\n};\n\nscope.interactables.get = function interactableGet (element, options, dontCheckInContext) {\n const ret = this[this.indexOfElement(element, options && options.context)];\n\n return ret && (is.string(element) || dontCheckInContext || ret.inContext(element))? ret : null;\n};\n\nscope.interactables.forEachSelector = function (callback, element) {\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n // skip non CSS selector targets and out of context elements\n if (!is.string(interactable.target)\n || (element && !interactable.inContext(element))) {\n continue;\n }\n\n const ret = callback(interactable, interactable.target, interactable._context, i, this);\n\n if (ret !== undefined) {\n return ret;\n }\n }\n};\n\n// all interact.js eventTypes\nInteractable.eventTypes = scope.eventTypes = [];\n\nInteractable.signals = signals;\n\nInteractable.settingsMethods = [ 'deltaSource', 'origin', 'preventDefault', 'rectChecker' ];\n\nmodule.exports = Interactable;\n","const scope = require('./scope');\nconst utils = require('./utils');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst finder = require('./utils/interactionFinder');\nconst signals = require('./utils/Signals').new();\n\nconst listeners = {};\nconst methodNames = [\n 'pointerDown', 'pointerMove', 'pointerUp',\n 'updatePointer', 'removePointer',\n];\n\n// for ignoring browser's simulated mouse events\nlet prevTouchTime = 0;\n\n// all active and idle interactions\nscope.interactions = [];\n\nclass Interaction {\n constructor () {\n this.target = null; // current interactable being interacted with\n this.element = null; // the target element of the interactable\n\n this.prepared = { // action that's ready to be fired on next move event\n name : null,\n axis : null,\n edges: null,\n };\n\n // keep track of added pointers\n this.pointers = [];\n this.pointerIds = [];\n this.downTargets = [];\n this.downTimes = [];\n\n // Previous native pointer move event coordinates\n this.prevCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n // current native pointer move event coordinates\n this.curCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Starting InteractEvent pointer coordinates\n this.startCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Change in coordinates and time of the pointer\n this.pointerDelta = {\n page : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n client : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n timeStamp: 0,\n };\n\n this.downEvent = null; // pointerdown/mousedown/touchstart event\n this.downPointer = {};\n\n this._eventTarget = null;\n this._curEventTarget = null;\n\n this.prevEvent = null; // previous action event\n\n this.pointerIsDown = false;\n this.pointerWasMoved = false;\n this._interacting = false;\n\n this.mouse = false;\n\n signals.fire('new', this);\n\n scope.interactions.push(this);\n }\n\n pointerDown (pointer, event, eventTarget) {\n const pointerIndex = this.updatePointer(pointer, event, true);\n\n signals.fire('down', {\n pointer,\n event,\n eventTarget,\n pointerIndex,\n interaction: this,\n });\n }\n\n /*\\\n * Interaction.start\n [ method ]\n *\n * Start an action with the given Interactable and Element as tartgets. The\n * action must be enabled for the target Interactable and an appropriate number\n * of pointers must be held down - 1 for drag/resize, 2 for gesture.\n *\n * Use it with `interactable.able({ manualStart: false })` to always\n * [start actions manually](https://github.com/taye/interact.js/issues/114)\n *\n - action (object) The action to be performed - drag, resize, etc.\n - target (Interactable) The Interactable to target\n - element (Element) The DOM Element to target\n = (object) interact\n **\n | interact(target)\n | .draggable({\n | // disable the default drag start by down->move\n | manualStart: true\n | })\n | // start dragging after the user holds the pointer down\n | .on('hold', function (event) {\n | var interaction = event.interaction;\n |\n | if (!interaction.interacting()) {\n | interaction.start({ name: 'drag' },\n | event.interactable,\n | event.currentTarget);\n | }\n | });\n \\*/\n start (action, target, element) {\n if (this.interacting()\n || !this.pointerIsDown\n || this.pointerIds.length < (action.name === 'gesture'? 2 : 1)) {\n return;\n }\n\n // if this interaction had been removed after stopping\n // add it back\n if (utils.indexOf(scope.interactions, this) === -1) {\n scope.interactions.push(this);\n }\n\n utils.copyAction(this.prepared, action);\n this.target = target;\n this.element = element;\n\n signals.fire('action-start', {\n interaction: this,\n event: this.downEvent,\n });\n }\n\n pointerMove (pointer, event, eventTarget) {\n if (!this.simulation) {\n this.updatePointer(pointer);\n utils.setCoords(this.curCoords, this.pointers);\n }\n\n const duplicateMove = (this.curCoords.page.x === this.prevCoords.page.x\n && this.curCoords.page.y === this.prevCoords.page.y\n && this.curCoords.client.x === this.prevCoords.client.x\n && this.curCoords.client.y === this.prevCoords.client.y);\n\n let dx;\n let dy;\n\n // register movement greater than pointerMoveTolerance\n if (this.pointerIsDown && !this.pointerWasMoved) {\n dx = this.curCoords.client.x - this.startCoords.client.x;\n dy = this.curCoords.client.y - this.startCoords.client.y;\n\n this.pointerWasMoved = utils.hypot(dx, dy) > Interaction.pointerMoveTolerance;\n }\n\n const signalArg = {\n pointer,\n pointerIndex: this.getPointerIndex(pointer),\n event,\n eventTarget,\n dx,\n dy,\n duplicate: duplicateMove,\n interaction: this,\n interactingBeforeMove: this.interacting(),\n };\n\n if (!duplicateMove) {\n // set pointer coordinate, time changes and speeds\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n }\n\n signals.fire('move', signalArg);\n\n if (!duplicateMove) {\n // if interacting, fire an 'action-move' signal etc\n if (this.interacting()) {\n this.doMove(signalArg);\n }\n\n if (this.pointerWasMoved) {\n utils.copyCoords(this.prevCoords, this.curCoords);\n }\n }\n }\n\n /*\\\n * Interaction.doMove\n [ method ]\n *\n * Force a move of the current action at the same coordinates. Useful if\n * snap/restrict has been changed and you want a movement with the new\n * settings.\n *\n **\n | interact(target)\n | .draggable(true)\n | .on('dragmove', function (event) {\n | if (someCondition) {\n | // change the snap settings\n | event.interactable.draggable({ snap: { targets: [] }});\n | // fire another move event with re-calculated snap\n | event.interaction.doMove();\n | }\n | });\n \\*/\n doMove (signalArg) {\n signalArg = utils.extend({\n pointer: this.pointers[0],\n event: this.prevEvent,\n eventTarget: this._eventTarget,\n interaction: this,\n }, signalArg || {});\n\n signals.fire('before-action-move', signalArg);\n\n if (!this._dontFireMove) {\n signals.fire('action-move', signalArg);\n }\n\n this._dontFireMove = false;\n }\n\n // End interact move events and stop auto-scroll unless simulation is running\n pointerUp (pointer, event, eventTarget, curEventTarget) {\n const pointerIndex = this.getPointerIndex(pointer);\n\n signals.fire(/cancel$/i.test(event.type)? 'cancel' : 'up', {\n pointer,\n pointerIndex,\n event,\n eventTarget,\n curEventTarget,\n interaction: this,\n });\n\n if (!this.simulation) {\n this.end(event);\n }\n\n this.pointerIsDown = false;\n this.removePointer(pointer, event);\n }\n\n /*\\\n * Interaction.end\n [ method ]\n *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n - event (PointerEvent) #optional\n **\n | interact(target)\n | .draggable(true)\n | .on('move', function (event) {\n | if (event.pageX > 1000) {\n | // end the current action\n | event.interaction.end();\n | // stop all further listeners from being called\n | event.stopImmediatePropagation();\n | }\n | });\n \\*/\n end (event) {\n event = event || this.prevEvent;\n\n if (this.interacting()) {\n signals.fire('action-end', {\n event,\n interaction: this,\n });\n }\n\n this.stop();\n }\n\n currentAction () {\n return this._interacting? this.prepared.name: null;\n }\n\n interacting () {\n return this._interacting;\n }\n\n stop () {\n signals.fire('stop', { interaction: this });\n\n if (this._interacting) {\n signals.fire('stop-active', { interaction: this });\n signals.fire('stop-' + this.prepared.name, { interaction: this });\n }\n\n this.target = this.element = null;\n\n this._interacting = false;\n this.prepared.name = this.prevEvent = null;\n }\n\n getPointerIndex (pointer) {\n return utils.indexOf(this.pointerIds, utils.getPointerId(pointer));\n }\n\n updatePointer (pointer, event, down = event && /(down|start)$/i.test(event.type)) {\n const id = utils.getPointerId(pointer);\n let index = this.getPointerIndex(pointer);\n\n if (index === -1) {\n index = this.pointerIds.length;\n this.pointerIds[index] = id;\n }\n\n if (down) {\n signals.fire('update-pointer-down', {\n pointer,\n event,\n down,\n pointerId: id,\n pointerIndex: index,\n interaction: this,\n });\n }\n\n this.pointers[index] = pointer;\n\n return index;\n }\n\n removePointer (pointer, event) {\n const id = utils.getPointerId(pointer);\n const index = this.mouse? 0 : utils.indexOf(this.pointerIds, id);\n\n if (index === -1) { return; }\n\n signals.fire('remove-pointer', {\n pointer,\n event,\n pointerIndex: index,\n interaction: this,\n });\n\n this.pointers .splice(index, 1);\n this.pointerIds .splice(index, 1);\n this.downTargets.splice(index, 1);\n this.downTimes .splice(index, 1);\n }\n\n _updateEventTargets (target, currentTarget) {\n this._eventTarget = target;\n this._curEventTarget = currentTarget;\n }\n}\n\nfor (let i = 0, len = methodNames.length; i < len; i++) {\n const method = methodNames[i];\n\n listeners[method] = doOnInteractions(method);\n}\n\nfunction doOnInteractions (method) {\n return (function (event) {\n const [eventTarget, curEventTarget] = utils.getEventTargets(event);\n const matches = []; // [ [pointer, interaction], ...]\n\n if (browser.supportsTouch && /touch/.test(event.type)) {\n prevTouchTime = new Date().getTime();\n\n for (let i = 0; i < event.changedTouches.length; i++) {\n const pointer = event.changedTouches[i];\n const interaction = finder.search(pointer, event.type, eventTarget);\n\n matches.push([pointer, interaction || new Interaction()]);\n }\n }\n else {\n let invalidPointer = false;\n\n if (!browser.supportsPointerEvent && /mouse/.test(event.type)) {\n // ignore mouse events while touch interactions are active\n for (let i = 0; i < scope.interactions.length && !invalidPointer; i++) {\n invalidPointer = !scope.interactions[i].mouse && scope.interactions[i].pointerIsDown;\n }\n\n // try to ignore mouse events that are simulated by the browser\n // after a touch event\n invalidPointer = invalidPointer\n || (new Date().getTime() - prevTouchTime < 500)\n // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated\n || event.timeStamp === 0;\n }\n\n if (!invalidPointer) {\n let interaction = finder.search(event, event.type, eventTarget);\n\n if (!interaction) {\n\n interaction = new Interaction();\n interaction.mouse = (/mouse/i.test(event.pointerType || event.type)\n // MSPointerEvent.MSPOINTER_TYPE_MOUSE\n || event.pointerType === 4\n || !event.pointerType);\n }\n\n matches.push([event, interaction]);\n }\n }\n\n for (const [pointer, interaction] of matches) {\n interaction._updateEventTargets(eventTarget, curEventTarget);\n interaction[method](pointer, event, eventTarget, curEventTarget);\n }\n });\n}\n\nfunction endAll (event) {\n for (let i = 0; i < scope.interactions.length; i++) {\n const interaction = scope.interactions[i];\n\n interaction.end(event);\n signals.fire('endall', { event, interaction });\n }\n}\n\nconst docEvents = { /* 'eventType': listenerFunc */ };\nconst pEventTypes = browser.pEventTypes;\n\nif (scope.PointerEvent) {\n docEvents[pEventTypes.down ] = listeners.pointerDown;\n docEvents[pEventTypes.move ] = listeners.pointerMove;\n docEvents[pEventTypes.up ] = listeners.pointerUp;\n docEvents[pEventTypes.cancel] = listeners.pointerUp;\n}\nelse {\n docEvents.mousedown = listeners.pointerDown;\n docEvents.mousemove = listeners.pointerMove;\n docEvents.mouseup = listeners.pointerUp;\n\n docEvents.touchstart = listeners.pointerDown;\n docEvents.touchmove = listeners.pointerMove;\n docEvents.touchend = listeners.pointerUp;\n docEvents.touchcancel = listeners.pointerUp;\n}\n\ndocEvents.blur = endAll;\n\nfunction onDocSignal ({ doc }, signalName) {\n const eventMethod = signalName.indexOf('add') === 0\n ? events.add : events.remove;\n\n // delegate event listener\n for (const eventType in scope.delegatedEvents) {\n eventMethod(doc, eventType, events.delegateListener);\n eventMethod(doc, eventType, events.delegateUseCapture, true);\n }\n\n for (const eventType in docEvents) {\n eventMethod(doc, eventType, docEvents[eventType]);\n }\n}\n\nsignals.on('update-pointer-down', ({ interaction, pointer, pointerId, pointerIndex, event, eventTarget, down }) => {\n interaction.pointerIds[pointerIndex] = pointerId;\n interaction.pointers[pointerIndex] = pointer;\n\n if (down) {\n interaction.pointerIsDown = true;\n }\n\n if (!interaction.interacting()) {\n utils.setCoords(interaction.startCoords, interaction.pointers);\n\n utils.copyCoords(interaction.curCoords , interaction.startCoords);\n utils.copyCoords(interaction.prevCoords, interaction.startCoords);\n\n interaction.downEvent = event;\n interaction.downTimes[pointerIndex] = interaction.curCoords.timeStamp;\n interaction.downTargets[pointerIndex] = eventTarget || event && utils.getEventTargets(event)[0];\n interaction.pointerWasMoved = false;\n\n utils.pointerExtend(interaction.downPointer, pointer);\n }\n});\n\nscope.signals.on('add-document' , onDocSignal);\nscope.signals.on('remove-document', onDocSignal);\n\nInteraction.pointerMoveTolerance = 1;\nInteraction.doOnInteractions = doOnInteractions;\nInteraction.endAll = endAll;\nInteraction.signals = signals;\nInteraction.docEvents = docEvents;\n\nscope.endAllInteractions = endAll;\n\nmodule.exports = Interaction;\n","const Interaction = require('../Interaction');\nconst InteractEvent = require('../InteractEvent');\n\nconst actions = {\n firePrepared,\n names: [],\n methodDict: {},\n};\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n interaction._interacting = true;\n firePrepared(interaction, event, 'start');\n});\n\nInteraction.signals.on('action-move', function ({ interaction, event, preEnd }) {\n firePrepared(interaction, event, 'move', preEnd);\n\n // if the action was ended in a listener\n if (!interaction.interacting()) { return false; }\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n firePrepared(interaction, event, 'end');\n});\n\nfunction firePrepared (interaction, event, phase, preEnd) {\n const actionName = interaction.prepared.name;\n\n const newEvent = new InteractEvent(interaction, event, actionName, phase, interaction.element, null, preEnd);\n\n interaction.target.fire(newEvent);\n interaction.prevEvent = newEvent;\n}\n\nmodule.exports = actions;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drag = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n startAxis : 'xy',\n lockAxis : 'xy',\n },\n\n checker: function (pointer, event, interactable) {\n const dragOptions = interactable.options.drag;\n\n return dragOptions.enabled\n ? { name: 'drag', axis: (dragOptions.lockAxis === 'start'\n ? dragOptions.startAxis\n : dragOptions.lockAxis)}\n : null;\n },\n\n getCursor: function () {\n return 'move';\n },\n};\n\nInteraction.signals.on('before-action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n interaction.curCoords.page.y = interaction.startCoords.page.y;\n interaction.curCoords.client.y = interaction.startCoords.client.y;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vx);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vx);\n interaction.pointerDelta.client.vy = 0;\n interaction.pointerDelta.page.vy = 0;\n }\n else if (axis === 'y') {\n interaction.curCoords.page.x = interaction.startCoords.page.x;\n interaction.curCoords.client.x = interaction.startCoords.client.x;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vy);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vy);\n interaction.pointerDelta.client.vx = 0;\n interaction.pointerDelta.page.vx = 0;\n }\n});\n\n// dragmove\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'dragmove') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n iEvent.pageY = interaction.startCoords.page.y;\n iEvent.clientY = interaction.startCoords.client.y;\n iEvent.dy = 0;\n }\n else if (axis === 'y') {\n iEvent.pageX = interaction.startCoords.page.x;\n iEvent.clientX = interaction.startCoords.client.x;\n iEvent.dx = 0;\n }\n});\n\n/*\\\n * Interactable.draggable\n [ method ]\n *\n * Gets or sets whether drag actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of drag events\n | var isDraggable = interact('ul li').draggable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on drag events (object makes the Interactable draggable)\n = (object) This Interactable\n | interact(element).draggable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // the axis in which the first movement must be\n | // for the drag sequence to start\n | // 'xy' by default - any direction\n | startAxis: 'x' || 'y' || 'xy',\n |\n | // 'xy' by default - don't restrict to one axis (move in any direction)\n | // 'x' or 'y' to restrict movement to either axis\n | // 'start' to restrict movement to the axis the drag started in\n | lockAxis: 'x' || 'y' || 'xy' || 'start',\n |\n | // max number of drags that can happen concurrently\n | // with elements of this Interactable. Infinity by default\n | max: Infinity,\n |\n | // max number of drags that can target the same element+Interactable\n | // 1 by default\n | maxPerElement: 2\n | });\n\\*/\nInteractable.prototype.draggable = function (options) {\n if (utils.is.object(options)) {\n this.options.drag.enabled = options.enabled === false? false: true;\n this.setPerAction('drag', options);\n this.setOnEvents('drag', options);\n\n if (/^(xy|x|y|start)$/.test(options.lockAxis)) {\n this.options.drag.lockAxis = options.lockAxis;\n }\n if (/^(xy|x|y)$/.test(options.startAxis)) {\n this.options.drag.startAxis = options.startAxis;\n }\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drag.enabled = options;\n\n if (!options) {\n this.ondragstart = this.ondragstart = this.ondragend = null;\n }\n\n return this;\n }\n\n return this.options.drag;\n};\n\nactions.drag = drag;\nactions.names.push('drag');\nutils.merge(Interactable.eventTypes, [\n 'dragstart',\n 'dragmove',\n 'draginertiastart',\n 'draginertiaresume',\n 'dragend',\n]);\nactions.methodDict.drag = 'draggable';\n\ndefaultOptions.drag = drag.defaults;\n\nmodule.exports = drag;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst scope = require('../scope');\nconst interact = require('../interact');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drop = {\n defaults: {\n enabled: false,\n accept : null,\n overlap: 'pointer',\n },\n};\n\nlet dynamicDrop = false;\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // reset active dropzones\n interaction.activeDrops.dropzones = [];\n interaction.activeDrops.elements = [];\n interaction.activeDrops.rects = [];\n\n interaction.dropEvents = null;\n\n if (!interaction.dynamicDrop) {\n setActiveDrops(interaction, interaction.element);\n }\n\n const dragEvent = interaction.prevEvent;\n const dropEvents = getDropEvents(interaction, event, dragEvent);\n\n if (dropEvents.activate) {\n fireActiveDrops(interaction, dropEvents.activate);\n }\n});\n\nInteractEvent.signals.on('new', function ({ interaction, iEvent, event }) {\n if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { return; }\n\n const draggableElement = interaction.element;\n const dragEvent = iEvent;\n const dropResult = getDrop(dragEvent, event, draggableElement);\n\n interaction.dropTarget = dropResult.dropzone;\n interaction.dropElement = dropResult.element;\n\n interaction.dropEvents = getDropEvents(interaction, event, dragEvent);\n});\n\nInteraction.signals.on('action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n fireDropEvents(interaction, interaction.dropEvents);\n});\n\nInteraction.signals.on('action-end', function ({ interaction }) {\n if (interaction.prepared.name === 'drag') {\n fireDropEvents(interaction, interaction.dropEvents);\n }\n});\n\nInteraction.signals.on('stop-drag', function ({ interaction }) {\n interaction.activeDrops.dropzones =\n interaction.activeDrops.elements =\n interaction.activeDrops.rects =\n interaction.dropEvents = null;\n});\n\nfunction collectDrops (interaction, element) {\n const drops = [];\n const elements = [];\n\n element = element || interaction.element;\n\n // collect all dropzones and their elements which qualify for a drop\n for (const current of scope.interactables) {\n if (!current.options.drop.enabled) { continue; }\n\n const accept = current.options.drop.accept;\n\n // test the draggable element against the dropzone's accept setting\n if ((utils.is.element(accept) && accept !== element)\n || (utils.is.string(accept)\n && !utils.matchesSelector(element, accept))) {\n\n continue;\n }\n\n // query for new elements if necessary\n const dropElements = utils.is.string(current.target)\n ? current._context.querySelectorAll(current.target)\n : [current.target];\n\n for (let i = 0; i < dropElements.length; i++) {\n const currentElement = dropElements[i];\n\n if (currentElement !== element) {\n drops.push(current);\n elements.push(currentElement);\n }\n }\n }\n\n return {\n elements,\n dropzones: drops,\n };\n}\n\nfunction fireActiveDrops (interaction, event) {\n let prevElement;\n\n // loop through all active dropzones and trigger event\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n const current = interaction.activeDrops.dropzones[i];\n const currentElement = interaction.activeDrops.elements [i];\n\n // prevent trigger of duplicate events on same element\n if (currentElement !== prevElement) {\n // set current element as event target\n event.target = currentElement;\n current.fire(event);\n }\n prevElement = currentElement;\n }\n}\n\n// Collect a new set of possible drops and save them in activeDrops.\n// setActiveDrops should always be called when a drag has just started or a\n// drag event happens while dynamicDrop is true\nfunction setActiveDrops (interaction, dragElement) {\n // get dropzones and their elements that could receive the draggable\n const possibleDrops = collectDrops(interaction, dragElement, true);\n\n interaction.activeDrops.dropzones = possibleDrops.dropzones;\n interaction.activeDrops.elements = possibleDrops.elements;\n interaction.activeDrops.rects = [];\n\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n interaction.activeDrops.rects[i] =\n interaction.activeDrops.dropzones[i].getRect(interaction.activeDrops.elements[i]);\n }\n}\n\nfunction getDrop (dragEvent, event, dragElement) {\n const interaction = dragEvent.interaction;\n const validDrops = [];\n\n if (dynamicDrop) {\n setActiveDrops(interaction, dragElement);\n }\n\n // collect all dropzones and their elements which qualify for a drop\n for (let j = 0; j < interaction.activeDrops.dropzones.length; j++) {\n const current = interaction.activeDrops.dropzones[j];\n const currentElement = interaction.activeDrops.elements [j];\n const rect = interaction.activeDrops.rects [j];\n\n validDrops.push(current.dropCheck(dragEvent, event, interaction.target, dragElement, currentElement, rect)\n ? currentElement\n : null);\n }\n\n // get the most appropriate dropzone based on DOM depth and order\n const dropIndex = utils.indexOfDeepestElement(validDrops);\n\n return {\n dropzone: interaction.activeDrops.dropzones[dropIndex] || null,\n element : interaction.activeDrops.elements [dropIndex] || null,\n };\n}\n\nfunction getDropEvents (interaction, pointerEvent, dragEvent) {\n const dropEvents = {\n enter : null,\n leave : null,\n activate : null,\n deactivate: null,\n move : null,\n drop : null,\n };\n\n const tmpl = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n };\n\n if (interaction.dropElement !== interaction.prevDropElement) {\n // if there was a prevDropTarget, create a dragleave event\n if (interaction.prevDropTarget) {\n dropEvents.leave = utils.extend({ type: 'dragleave' }, tmpl);\n\n dragEvent.dragLeave = dropEvents.leave.target = interaction.prevDropElement;\n dragEvent.prevDropzone = dropEvents.leave.dropzone = interaction.prevDropTarget;\n }\n // if the dropTarget is not null, create a dragenter event\n if (interaction.dropTarget) {\n dropEvents.enter = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n type : 'dragenter',\n };\n\n dragEvent.dragEnter = interaction.dropElement;\n dragEvent.dropzone = interaction.dropTarget;\n }\n }\n\n if (dragEvent.type === 'dragend' && interaction.dropTarget) {\n dropEvents.drop = utils.extend({ type: 'drop' }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n dragEvent.relatedTarget = interaction.dropElement;\n }\n if (dragEvent.type === 'dragstart') {\n dropEvents.activate = utils.extend({ type: 'dropactivate' }, tmpl);\n\n dropEvents.activate.target = null;\n dropEvents.activate.dropzone = null;\n }\n if (dragEvent.type === 'dragend') {\n dropEvents.deactivate = utils.extend({ type: 'dropdeactivate' }, tmpl);\n\n dropEvents.deactivate.target = null;\n dropEvents.deactivate.dropzone = null;\n }\n if (dragEvent.type === 'dragmove' && interaction.dropTarget) {\n dropEvents.move = utils.extend({\n dragmove : dragEvent,\n type : 'dropmove',\n }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n }\n\n return dropEvents;\n}\n\nfunction fireDropEvents (interaction, dropEvents) {\n if (dropEvents.leave) { interaction.prevDropTarget.fire(dropEvents.leave); }\n if (dropEvents.move ) { interaction.dropTarget.fire(dropEvents.move ); }\n if (dropEvents.enter) { interaction.dropTarget.fire(dropEvents.enter); }\n if (dropEvents.drop ) { interaction.dropTarget.fire(dropEvents.drop ); }\n if (dropEvents.deactivate) {\n fireActiveDrops(interaction, dropEvents.deactivate);\n }\n\n interaction.prevDropTarget = interaction.dropTarget;\n interaction.prevDropElement = interaction.dropElement;\n}\n\n/*\\\n * Interactable.dropzone\n [ method ]\n *\n * Returns or sets whether elements can be dropped onto this\n * Interactable to trigger drop events\n *\n * Dropzones can receive the following events:\n * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends\n * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone\n * - `dragmove` when a draggable that has entered the dropzone is moved\n * - `drop` when a draggable is dropped into this dropzone\n *\n * Use the `accept` option to allow only elements that match the given CSS\n * selector or element. The value can be:\n *\n * - **an Element** - only that element can be dropped into this dropzone.\n * - **a string**, - the element being dragged must match it as a CSS selector.\n * - **`null`** - accept options is cleared - it accepts any element.\n *\n * Use the `overlap` option to set how drops are checked for. The allowed\n * values are:\n *\n * - `'pointer'`, the pointer must be over the dropzone (default)\n * - `'center'`, the draggable element's center must be over the dropzone\n * - a number from 0-1 which is the `(intersection area) / (draggable area)`.\n * e.g. `0.5` for drop to happen when half of the area of the draggable is\n * over the dropzone\n *\n * Use the `checker` option to specify a function to check if a dragged\n * element is over this Interactable.\n *\n | interact(target)\n | .dropChecker(function(dragEvent, // related dragmove or dragend event\n | event, // TouchEvent/PointerEvent/MouseEvent\n | dropped, // bool result of the default checker\n | dropzone, // dropzone Interactable\n | dropElement, // dropzone elemnt\n | draggable, // draggable Interactable\n | draggableElement) {// draggable element\n |\n | return dropped && event.target.hasAttribute('allow-drop');\n | }\n *\n *\n - options (boolean | object | null) #optional The new value to be set.\n | interact('.drop').dropzone({\n | accept: '.can-drop' || document.getElementById('single-drop'),\n | overlap: 'pointer' || 'center' || zeroToOne\n | }\n = (boolean | object) The current setting or this Interactable\n\\*/\nInteractable.prototype.dropzone = function (options) {\n if (utils.is.object(options)) {\n this.options.drop.enabled = options.enabled === false? false: true;\n\n if (utils.is.function(options.ondrop) ) { this.events.ondrop = options.ondrop ; }\n if (utils.is.function(options.ondropactivate) ) { this.events.ondropactivate = options.ondropactivate ; }\n if (utils.is.function(options.ondropdeactivate)) { this.events.ondropdeactivate = options.ondropdeactivate; }\n if (utils.is.function(options.ondragenter) ) { this.events.ondragenter = options.ondragenter ; }\n if (utils.is.function(options.ondragleave) ) { this.events.ondragleave = options.ondragleave ; }\n if (utils.is.function(options.ondropmove) ) { this.events.ondropmove = options.ondropmove ; }\n\n if (/^(pointer|center)$/.test(options.overlap)) {\n this.options.drop.overlap = options.overlap;\n }\n else if (utils.is.number(options.overlap)) {\n this.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0);\n }\n if ('accept' in options) {\n this.options.drop.accept = options.accept;\n }\n if ('checker' in options) {\n this.options.drop.checker = options.checker;\n }\n\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drop.enabled = options;\n\n if (!options) {\n this.ondragenter = this.ondragleave = this.ondrop\n = this.ondropactivate = this.ondropdeactivate = null;\n }\n\n return this;\n }\n\n return this.options.drop;\n};\n\nInteractable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) {\n let dropped = false;\n\n // if the dropzone has no rect (eg. display: none)\n // call the custom dropChecker or just return false\n if (!(rect = rect || this.getRect(dropElement))) {\n return (this.options.drop.checker\n ? this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement)\n : false);\n }\n\n const dropOverlap = this.options.drop.overlap;\n\n if (dropOverlap === 'pointer') {\n const origin = utils.getOriginXY(draggable, draggableElement, 'drag');\n const page = utils.getPageXY(dragEvent);\n\n page.x += origin.x;\n page.y += origin.y;\n\n const horizontal = (page.x > rect.left) && (page.x < rect.right);\n const vertical = (page.y > rect.top ) && (page.y < rect.bottom);\n\n dropped = horizontal && vertical;\n }\n\n const dragRect = draggable.getRect(draggableElement);\n\n if (dragRect && dropOverlap === 'center') {\n const cx = dragRect.left + dragRect.width / 2;\n const cy = dragRect.top + dragRect.height / 2;\n\n dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom;\n }\n\n if (dragRect && utils.is.number(dropOverlap)) {\n const overlapArea = (Math.max(0, Math.min(rect.right , dragRect.right ) - Math.max(rect.left, dragRect.left))\n * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top , dragRect.top )));\n\n const overlapRatio = overlapArea / (dragRect.width * dragRect.height);\n\n dropped = overlapRatio >= dropOverlap;\n }\n\n if (this.options.drop.checker) {\n dropped = this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement);\n }\n\n return dropped;\n};\n\nInteractable.signals.on('unset', function ({ interactable }) {\n interactable.dropzone(false);\n});\n\nInteractable.settingsMethods.push('dropChecker');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.dropTarget = null; // the dropzone a drag target might be dropped into\n interaction.dropElement = null; // the element at the time of checking\n interaction.prevDropTarget = null; // the dropzone that was recently dragged away from\n interaction.prevDropElement = null; // the element at the time of checking\n interaction.dropEvents = null; // the dropEvents related to the current drag event\n\n interaction.activeDrops = {\n dropzones: [], // the dropzones that are mentioned below\n elements : [], // elements of dropzones that accept the target draggable\n rects : [], // the rects of the elements mentioned above\n };\n\n});\n\nInteraction.signals.on('stop', function ({ interaction }) {\n interaction.dropTarget = interaction.dropElement =\n interaction.prevDropTarget = interaction.prevDropElement = null;\n});\n\n/*\\\n * interact.dynamicDrop\n [ method ]\n *\n * Returns or sets whether the dimensions of dropzone elements are\n * calculated on every dragmove or only on dragstart for the default\n * dropChecker\n *\n - newValue (boolean) #optional True to check on each move. False to check only before start\n = (boolean | interact) The current setting or interact\n\\*/\ninteract.dynamicDrop = function (newValue) {\n if (utils.is.bool(newValue)) {\n //if (dragging && dynamicDrop !== newValue && !newValue) {\n //calcRects(dropzones);\n //}\n\n dynamicDrop = newValue;\n\n return interact;\n }\n return dynamicDrop;\n};\n\nutils.merge(Interactable.eventTypes, [\n 'dragenter',\n 'dragleave',\n 'dropactivate',\n 'dropdeactivate',\n 'dropmove',\n 'drop',\n]);\nactions.methodDict.drop = 'dropzone';\n\ndefaultOptions.drop = drop.defaults;\n\nmodule.exports = drop;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst gesture = {\n defaults: {\n enabled : false,\n origin : null,\n restrict: null,\n },\n\n checker: function (pointer, event, interactable, element, interaction) {\n if (interaction.pointerIds.length >= 2) {\n return { name: 'gesture' };\n }\n\n return null;\n },\n\n getCursor: function () {\n return '';\n },\n};\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturestart') { return; }\n iEvent.ds = 0;\n\n interaction.gesture.startDistance = interaction.gesture.prevDistance = iEvent.distance;\n interaction.gesture.startAngle = interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.scale = 1;\n});\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturemove') { return; }\n\n iEvent.ds = iEvent.scale - interaction.gesture.scale;\n\n interaction.target.fire(iEvent);\n\n interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.prevDistance = iEvent.distance;\n\n if (iEvent.scale !== Infinity\n && iEvent.scale !== null\n && iEvent.scale !== undefined\n && !isNaN(iEvent.scale)) {\n\n interaction.gesture.scale = iEvent.scale;\n }\n});\n\n/*\\\n * Interactable.gesturable\n [ method ]\n *\n * Gets or sets whether multitouch gestures can be performed on the\n * Interactable's element\n *\n = (boolean) Indicates if this can be the target of gesture events\n | var isGestureable = interact(element).gesturable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on gesture events (makes the Interactable gesturable)\n = (object) this Interactable\n | interact(element).gesturable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // limit multiple gestures.\n | // See the explanation in @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n\\*/\nInteractable.prototype.gesturable = function (options) {\n if (utils.is.object(options)) {\n this.options.gesture.enabled = options.enabled === false? false: true;\n this.setPerAction('gesture', options);\n this.setOnEvents('gesture', options);\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.gesture.enabled = options;\n\n if (!options) {\n this.ongesturestart = this.ongesturestart = this.ongestureend = null;\n }\n\n return this;\n }\n\n return this.options.gesture;\n};\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action, event, starting, ending, deltaSource }) {\n if (action !== 'gesture') { return; }\n\n const pointers = interaction.pointers;\n\n iEvent.touches = [pointers[0], pointers[1]];\n\n if (starting) {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = 1;\n iEvent.ds = 0;\n iEvent.angle = utils.touchAngle(pointers, undefined, deltaSource);\n iEvent.da = 0;\n }\n else if (ending || event instanceof InteractEvent) {\n iEvent.distance = interaction.prevEvent.distance;\n iEvent.box = interaction.prevEvent.box;\n iEvent.scale = interaction.prevEvent.scale;\n iEvent.ds = iEvent.scale - 1;\n iEvent.angle = interaction.prevEvent.angle;\n iEvent.da = iEvent.angle - interaction.gesture.startAngle;\n }\n else {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = iEvent.distance / interaction.gesture.startDistance;\n iEvent.angle = utils.touchAngle(pointers, interaction.gesture.prevAngle, deltaSource);\n\n iEvent.ds = iEvent.scale - interaction.gesture.prevScale;\n iEvent.da = iEvent.angle - interaction.gesture.prevAngle;\n }\n});\n\nInteraction.signals.on('new', function (interaction) {\n interaction.gesture = {\n start: { x: 0, y: 0 },\n\n startDistance: 0, // distance between two touches of touchStart\n prevDistance : 0,\n distance : 0,\n\n scale: 1, // gesture.distance / gesture.startDistance\n\n startAngle: 0, // angle of line joining two touches\n prevAngle : 0, // angle of the previous gesture event\n };\n});\n\nactions.gesture = gesture;\nactions.names.push('gesture');\nutils.merge(Interactable.eventTypes, [\n 'gesturestart',\n 'gesturemove',\n 'gestureend',\n]);\nactions.methodDict.gesture = 'gesturable';\n\ndefaultOptions.gesture = gesture.defaults;\n\nmodule.exports = gesture;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\n// Less Precision with touch input\nconst defaultMargin = browser.supportsTouch || browser.supportsPointerEvent? 20: 10;\n\nconst resize = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n square: false,\n preserveAspectRatio: false,\n axis: 'xy',\n\n // use default margin\n margin: NaN,\n\n // object with props left, right, top, bottom which are\n // true/false values to resize when the pointer is over that edge,\n // CSS selectors to match the handles for each direction\n // or the Elements for each handle\n edges: null,\n\n // a value of 'none' will limit the resize rect to a minimum of 0x0\n // 'negate' will alow the rect to have negative width/height\n // 'reposition' will keep the width/height positive by swapping\n // the top and bottom edges and/or swapping the left and right edges\n invert: 'none',\n },\n\n checker: function (pointer, event, interactable, element, interaction, rect) {\n if (!rect) { return null; }\n\n const page = utils.extend({}, interaction.curCoords.page);\n const options = interactable.options;\n\n if (options.resize.enabled) {\n const resizeOptions = options.resize;\n const resizeEdges = { left: false, right: false, top: false, bottom: false };\n\n // if using resize.edges\n if (utils.is.object(resizeOptions.edges)) {\n for (const edge in resizeEdges) {\n resizeEdges[edge] = checkResizeEdge(edge,\n resizeOptions.edges[edge],\n page,\n interaction._eventTarget,\n element,\n rect,\n resizeOptions.margin || defaultMargin);\n }\n\n resizeEdges.left = resizeEdges.left && !resizeEdges.right;\n resizeEdges.top = resizeEdges.top && !resizeEdges.bottom;\n\n if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) {\n return {\n name: 'resize',\n edges: resizeEdges,\n };\n }\n }\n else {\n const right = options.resize.axis !== 'y' && page.x > (rect.right - defaultMargin);\n const bottom = options.resize.axis !== 'x' && page.y > (rect.bottom - defaultMargin);\n\n if (right || bottom) {\n return {\n name: 'resize',\n axes: (right? 'x' : '') + (bottom? 'y' : ''),\n };\n }\n }\n }\n\n return null;\n },\n\n cursors: (browser.isIe9OrOlder ? {\n x : 'e-resize',\n y : 's-resize',\n xy: 'se-resize',\n\n top : 'n-resize',\n left : 'w-resize',\n bottom : 's-resize',\n right : 'e-resize',\n topleft : 'se-resize',\n bottomright: 'se-resize',\n topright : 'ne-resize',\n bottomleft : 'ne-resize',\n } : {\n x : 'ew-resize',\n y : 'ns-resize',\n xy: 'nwse-resize',\n\n top : 'ns-resize',\n left : 'ew-resize',\n bottom : 'ns-resize',\n right : 'ew-resize',\n topleft : 'nwse-resize',\n bottomright: 'nwse-resize',\n topright : 'nesw-resize',\n bottomleft : 'nesw-resize',\n }),\n\n getCursor: function (action) {\n if (action.axis) {\n return resize.cursors[action.name + action.axis];\n }\n else if (action.edges) {\n let cursorKey = '';\n const edgeNames = ['top', 'bottom', 'left', 'right'];\n\n for (let i = 0; i < 4; i++) {\n if (action.edges[edgeNames[i]]) {\n cursorKey += edgeNames[i];\n }\n }\n\n return resize.cursors[cursorKey];\n }\n },\n};\n\n// resizestart\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'resizestart' || !interaction.prepared.edges) {\n return;\n }\n\n const startRect = interaction.target.getRect(interaction.element);\n const resizeOptions = interaction.target.options.resize;\n\n /*\n * When using the `resizable.square` or `resizable.preserveAspectRatio` options, resizing from one edge\n * will affect another. E.g. with `resizable.square`, resizing to make the right edge larger will make\n * the bottom edge larger by the same amount. We call these 'linked' edges. Any linked edges will depend\n * on the active edges and the edge being interacted with.\n */\n if (resizeOptions.square || resizeOptions.preserveAspectRatio) {\n const linkedEdges = utils.extend({}, interaction.prepared.edges);\n\n linkedEdges.top = linkedEdges.top || (linkedEdges.left && !linkedEdges.bottom);\n linkedEdges.left = linkedEdges.left || (linkedEdges.top && !linkedEdges.right );\n linkedEdges.bottom = linkedEdges.bottom || (linkedEdges.right && !linkedEdges.top );\n linkedEdges.right = linkedEdges.right || (linkedEdges.bottom && !linkedEdges.left );\n\n interaction.prepared._linkedEdges = linkedEdges;\n }\n else {\n interaction.prepared._linkedEdges = null;\n }\n\n // if using `resizable.preserveAspectRatio` option, record aspect ratio at the start of the resize\n if (resizeOptions.preserveAspectRatio) {\n interaction.resizeStartAspectRatio = startRect.width / startRect.height;\n }\n\n interaction.resizeRects = {\n start : startRect,\n current : utils.extend({}, startRect),\n inverted : utils.extend({}, startRect),\n previous : utils.extend({}, startRect),\n delta : {\n left: 0, right : 0, width : 0,\n top : 0, bottom: 0, height: 0,\n },\n };\n\n iEvent.rect = interaction.resizeRects.inverted;\n iEvent.deltaRect = interaction.resizeRects.delta;\n});\n\n// resizemove\nInteractEvent.signals.on('new', function ({ iEvent, phase, interaction }) {\n if (phase !== 'move' || !interaction.prepared.edges) { return; }\n\n const resizeOptions = interaction.target.options.resize;\n const invert = resizeOptions.invert;\n const invertible = invert === 'reposition' || invert === 'negate';\n\n let edges = interaction.prepared.edges;\n\n const start = interaction.resizeRects.start;\n const current = interaction.resizeRects.current;\n const inverted = interaction.resizeRects.inverted;\n const delta = interaction.resizeRects.delta;\n const previous = utils.extend(interaction.resizeRects.previous, inverted);\n const originalEdges = edges;\n\n let dx = iEvent.dx;\n let dy = iEvent.dy;\n\n if (resizeOptions.preserveAspectRatio || resizeOptions.square) {\n // `resize.preserveAspectRatio` takes precedence over `resize.square`\n const startAspectRatio = resizeOptions.preserveAspectRatio\n ? interaction.resizeStartAspectRatio\n : 1;\n\n edges = interaction.prepared._linkedEdges;\n\n if ((originalEdges.left && originalEdges.bottom)\n || (originalEdges.right && originalEdges.top)) {\n dy = -dx / startAspectRatio;\n }\n else if (originalEdges.left || originalEdges.right ) { dy = dx / startAspectRatio; }\n else if (originalEdges.top || originalEdges.bottom) { dx = dy * startAspectRatio; }\n }\n\n // update the 'current' rect without modifications\n if (edges.top ) { current.top += dy; }\n if (edges.bottom) { current.bottom += dy; }\n if (edges.left ) { current.left += dx; }\n if (edges.right ) { current.right += dx; }\n\n if (invertible) {\n // if invertible, copy the current rect\n utils.extend(inverted, current);\n\n if (invert === 'reposition') {\n // swap edge values if necessary to keep width/height positive\n let swap;\n\n if (inverted.top > inverted.bottom) {\n swap = inverted.top;\n\n inverted.top = inverted.bottom;\n inverted.bottom = swap;\n }\n if (inverted.left > inverted.right) {\n swap = inverted.left;\n\n inverted.left = inverted.right;\n inverted.right = swap;\n }\n }\n }\n else {\n // if not invertible, restrict to minimum of 0x0 rect\n inverted.top = Math.min(current.top, start.bottom);\n inverted.bottom = Math.max(current.bottom, start.top);\n inverted.left = Math.min(current.left, start.right);\n inverted.right = Math.max(current.right, start.left);\n }\n\n inverted.width = inverted.right - inverted.left;\n inverted.height = inverted.bottom - inverted.top ;\n\n for (const edge in inverted) {\n delta[edge] = inverted[edge] - previous[edge];\n }\n\n iEvent.edges = interaction.prepared.edges;\n iEvent.rect = inverted;\n iEvent.deltaRect = delta;\n});\n\n/*\\\n * Interactable.resizable\n [ method ]\n *\n * Gets or sets whether resize actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of resize elements\n | var isResizeable = interact('input[type=text]').resizable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on resize events (object makes the Interactable resizable)\n = (object) This Interactable\n | interact(element).resizable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | edges: {\n | top : true, // Use pointer coords to check for resize.\n | left : false, // Disable resizing from left edge.\n | bottom: '.resize-s',// Resize if pointer target matches selector\n | right : handleEl // Resize if pointer target is the given Element\n | },\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height are adjusted at a 1:1 ratio.\n | square: false,\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height maintain the aspect ratio they had when resizing started.\n | preserveAspectRatio: false,\n |\n | // a value of 'none' will limit the resize rect to a minimum of 0x0\n | // 'negate' will allow the rect to have negative width/height\n | // 'reposition' will keep the width/height positive by swapping\n | // the top and bottom edges and/or swapping the left and right edges\n | invert: 'none' || 'negate' || 'reposition'\n |\n | // limit multiple resizes.\n | // See the explanation in the @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n \\*/\nInteractable.prototype.resizable = function (options) {\n if (utils.is.object(options)) {\n this.options.resize.enabled = options.enabled === false? false: true;\n this.setPerAction('resize', options);\n this.setOnEvents('resize', options);\n\n if (/^x$|^y$|^xy$/.test(options.axis)) {\n this.options.resize.axis = options.axis;\n }\n else if (options.axis === null) {\n this.options.resize.axis = defaultOptions.resize.axis;\n }\n\n if (utils.is.bool(options.preserveAspectRatio)) {\n this.options.resize.preserveAspectRatio = options.preserveAspectRatio;\n }\n else if (utils.is.bool(options.square)) {\n this.options.resize.square = options.square;\n }\n\n return this;\n }\n if (utils.is.bool(options)) {\n this.options.resize.enabled = options;\n\n if (!options) {\n this.onresizestart = this.onresizestart = this.onresizeend = null;\n }\n\n return this;\n }\n return this.options.resize;\n};\n\nfunction checkResizeEdge (name, value, page, element, interactableElement, rect, margin) {\n // false, '', undefined, null\n if (!value) { return false; }\n\n // true value, use pointer coords and element rect\n if (value === true) {\n // if dimensions are negative, \"switch\" edges\n const width = utils.is.number(rect.width )? rect.width : rect.right - rect.left;\n const height = utils.is.number(rect.height)? rect.height : rect.bottom - rect.top ;\n\n if (width < 0) {\n if (name === 'left' ) { name = 'right'; }\n else if (name === 'right') { name = 'left' ; }\n }\n if (height < 0) {\n if (name === 'top' ) { name = 'bottom'; }\n else if (name === 'bottom') { name = 'top' ; }\n }\n\n if (name === 'left' ) { return page.x < ((width >= 0? rect.left: rect.right ) + margin); }\n if (name === 'top' ) { return page.y < ((height >= 0? rect.top : rect.bottom) + margin); }\n\n if (name === 'right' ) { return page.x > ((width >= 0? rect.right : rect.left) - margin); }\n if (name === 'bottom') { return page.y > ((height >= 0? rect.bottom: rect.top ) - margin); }\n }\n\n // the remaining checks require an element\n if (!utils.is.element(element)) { return false; }\n\n return utils.is.element(value)\n // the value is an element to use as a resize handle\n ? value === element\n // otherwise check if element matches value as selector\n : utils.matchesUpTo(element, value, interactableElement);\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.resizeAxes = 'xy';\n});\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action }) {\n if (action !== 'resize' || !interaction.resizeAxes) { return; }\n\n const options = interaction.target.options;\n\n if (options.resize.square) {\n if (interaction.resizeAxes === 'y') {\n iEvent.dx = iEvent.dy;\n }\n else {\n iEvent.dy = iEvent.dx;\n }\n iEvent.axes = 'xy';\n }\n else {\n iEvent.axes = interaction.resizeAxes;\n\n if (interaction.resizeAxes === 'x') {\n iEvent.dy = 0;\n }\n else if (interaction.resizeAxes === 'y') {\n iEvent.dx = 0;\n }\n }\n});\n\nactions.resize = resize;\nactions.names.push('resize');\nutils.merge(Interactable.eventTypes, [\n 'resizestart',\n 'resizemove',\n 'resizeinertiastart',\n 'resizeinertiaresume',\n 'resizeend',\n]);\nactions.methodDict.resize = 'resizable';\n\ndefaultOptions.resize = resize.defaults;\n\nmodule.exports = resize;\n","const raf = require('./utils/raf');\nconst getWindow = require('./utils/window').getWindow;\nconst is = require('./utils/is');\nconst domUtils = require('./utils/domUtils');\nconst Interaction = require('./Interaction');\nconst defaultOptions = require('./defaultOptions');\n\nconst autoScroll = {\n defaults: {\n enabled : false,\n container: null, // the item that is scrolled (Window or HTMLElement)\n margin : 60,\n speed : 300, // the scroll speed in pixels per second\n },\n\n interaction: null,\n i: null, // the handle returned by window.setInterval\n x: 0, y: 0, // Direction each pulse is to scroll in\n\n isScrolling: false,\n prevTime: 0,\n\n start: function (interaction) {\n autoScroll.isScrolling = true;\n raf.cancel(autoScroll.i);\n\n autoScroll.interaction = interaction;\n autoScroll.prevTime = new Date().getTime();\n autoScroll.i = raf.request(autoScroll.scroll);\n },\n\n stop: function () {\n autoScroll.isScrolling = false;\n raf.cancel(autoScroll.i);\n },\n\n // scroll the window by the values in scroll.x/y\n scroll: function () {\n const options = autoScroll.interaction.target.options[autoScroll.interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(autoScroll.interaction.element);\n const now = new Date().getTime();\n // change in time in seconds\n const dt = (now - autoScroll.prevTime) / 1000;\n // displacement\n const s = options.speed * dt;\n\n if (s >= 1) {\n if (is.window(container)) {\n container.scrollBy(autoScroll.x * s, autoScroll.y * s);\n }\n else if (container) {\n container.scrollLeft += autoScroll.x * s;\n container.scrollTop += autoScroll.y * s;\n }\n\n autoScroll.prevTime = now;\n }\n\n if (autoScroll.isScrolling) {\n raf.cancel(autoScroll.i);\n autoScroll.i = raf.request(autoScroll.scroll);\n }\n },\n check: function (interactable, actionName) {\n const options = interactable.options;\n\n return options[actionName].autoScroll && options[actionName].autoScroll.enabled;\n },\n onInteractionMove: function ({ interaction, pointer }) {\n if (!(interaction.interacting()\n && autoScroll.check(interaction.target, interaction.prepared.name))) {\n return;\n }\n\n if (interaction.simulation) {\n autoScroll.x = autoScroll.y = 0;\n return;\n }\n\n let top;\n let right;\n let bottom;\n let left;\n\n const options = interaction.target.options[interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(interaction.element);\n\n if (is.window(container)) {\n left = pointer.clientX < autoScroll.margin;\n top = pointer.clientY < autoScroll.margin;\n right = pointer.clientX > container.innerWidth - autoScroll.margin;\n bottom = pointer.clientY > container.innerHeight - autoScroll.margin;\n }\n else {\n const rect = domUtils.getElementClientRect(container);\n\n left = pointer.clientX < rect.left + autoScroll.margin;\n top = pointer.clientY < rect.top + autoScroll.margin;\n right = pointer.clientX > rect.right - autoScroll.margin;\n bottom = pointer.clientY > rect.bottom - autoScroll.margin;\n }\n\n autoScroll.x = (right ? 1: left? -1: 0);\n autoScroll.y = (bottom? 1: top? -1: 0);\n\n if (!autoScroll.isScrolling) {\n // set the autoScroll properties to those of the target\n autoScroll.margin = options.margin;\n autoScroll.speed = options.speed;\n\n autoScroll.start(interaction);\n }\n },\n};\n\nInteraction.signals.on('stop-active', function () {\n autoScroll.stop();\n});\n\nInteraction.signals.on('action-move', autoScroll.onInteractionMove);\n\ndefaultOptions.perAction.autoScroll = autoScroll.defaults;\n\nmodule.exports = autoScroll;\n","const Interactable = require('../Interactable');\nconst actions = require('../actions/base');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.ignoreFrom\n [ method ]\n *\n * If the target of the `mousedown`, `pointerdown` or `touchstart`\n * event or any of it's parents match the given CSS selector or\n * Element, no drag/resize/gesture is started.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to not ignore any elements\n = (string | Element | object) The current ignoreFrom value or this Interactable\n **\n | interact(element, { ignoreFrom: document.getElementById('no-action') });\n | // or\n | interact(element).ignoreFrom('input, textarea, a');\n\\*/\nInteractable.prototype.ignoreFrom = function (newValue) {\n return this._backCompatOption('ignoreFrom', newValue);\n};\n\n/*\\\n * Interactable.allowFrom\n [ method ]\n *\n * A drag/resize/gesture is started only If the target of the\n * `mousedown`, `pointerdown` or `touchstart` event or any of it's\n * parents match the given CSS selector or Element.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to allow from any element\n = (string | Element | object) The current allowFrom value or this Interactable\n **\n | interact(element, { allowFrom: document.getElementById('drag-handle') });\n | // or\n | interact(element).allowFrom('.handle');\n\\*/\nInteractable.prototype.allowFrom = function (newValue) {\n return this._backCompatOption('allowFrom', newValue);\n};\n\nInteractable.prototype.testIgnore = function (ignoreFrom, interactableElement, element) {\n if (!ignoreFrom || !is.element(element)) { return false; }\n\n if (is.string(ignoreFrom)) {\n return domUtils.matchesUpTo(element, ignoreFrom, interactableElement);\n }\n else if (is.element(ignoreFrom)) {\n return domUtils.nodeContains(ignoreFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testAllow = function (allowFrom, interactableElement, element) {\n if (!allowFrom) { return true; }\n\n if (!is.element(element)) { return false; }\n\n if (is.string(allowFrom)) {\n return domUtils.matchesUpTo(element, allowFrom, interactableElement);\n }\n else if (is.element(allowFrom)) {\n return domUtils.nodeContains(allowFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testIgnoreAllow = function (options, interactableElement, eventTarget) {\n return (!this.testIgnore(options.ignoreFrom, interactableElement, eventTarget)\n && this.testAllow(options.allowFrom, interactableElement, eventTarget));\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (event.buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\n","const interact = require('../interact');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst actions = require('../actions/base');\nconst defaultOptions = require('../defaultOptions');\nconst browser = require('../utils/browser');\nconst scope = require('../scope');\nconst utils = require('../utils');\nconst signals = require('../utils/Signals').new();\n\nrequire('./InteractableMethods');\n\nconst autoStart = {\n signals,\n withinInteractionLimit,\n // Allow this many interactions to happen simultaneously\n maxInteractions: Infinity,\n defaults: {\n perAction: {\n manualStart: false,\n max: Infinity,\n maxPerElement: 1,\n allowFrom: null,\n ignoreFrom: null,\n },\n },\n setActionDefaults: function (action) {\n utils.extend(action.defaults, autoStart.defaults.perAction);\n },\n};\n\n// set cursor style on mousedown\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget }) {\n if (interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\n// set cursor style on mousemove\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget }) {\n if (!interaction.mouse\n || interaction.pointerIsDown\n || interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\nInteraction.signals.on('move', function (arg) {\n const { interaction, event } = arg;\n\n if (!interaction.pointerIsDown\n || interaction.interacting()\n || !interaction.pointerWasMoved\n || !interaction.prepared.name) {\n return;\n }\n\n signals.fire('before-start', arg);\n\n const target = interaction.target;\n\n if (interaction.prepared.name && target) {\n // check manualStart and interaction limit\n if (target.options[interaction.prepared.name].manualStart\n || !withinInteractionLimit(target, interaction.element, interaction.prepared)) {\n interaction.stop(event);\n }\n else {\n interaction.start(interaction.prepared, target, interaction.element);\n }\n }\n});\n\n// Check if the current target supports the action.\n// If so, return the validated action. Otherwise, return null\nfunction validateAction (action, interactable, element, eventTarget) {\n if (utils.is.object(action)\n && interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget)\n && interactable.options[action.name].enabled\n && withinInteractionLimit(interactable, element, action)) {\n return action;\n }\n\n return null;\n}\n\nfunction validateSelector (interaction, pointer, event, matches, matchElements, eventTarget) {\n for (let i = 0, len = matches.length; i < len; i++) {\n const match = matches[i];\n const matchElement = matchElements[i];\n const action = validateAction(match.getAction(pointer, event, interaction, matchElement),\n match,\n matchElement,\n eventTarget);\n\n if (action) {\n return {\n action,\n target: match,\n element: matchElement,\n };\n }\n }\n\n return {};\n}\n\nfunction getActionInfo (interaction, pointer, event, eventTarget) {\n let matches = [];\n let matchElements = [];\n\n let element = eventTarget;\n let action = null;\n\n function pushMatches (interactable, selector, context) {\n const elements = (browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined);\n\n if (utils.matchesSelector(element, selector, elements)) {\n\n matches.push(interactable);\n matchElements.push(element);\n }\n }\n\n while (utils.is.element(element)) {\n matches = [];\n matchElements = [];\n\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && (action = validateAction(elementInteractable.getAction(pointer, event, interaction, element, eventTarget),\n elementInteractable,\n element,\n eventTarget))\n && !elementInteractable.options[action.name].manualStart) {\n return {\n element,\n action,\n target: elementInteractable,\n };\n }\n else {\n scope.interactables.forEachSelector(pushMatches, element);\n\n const actionInfo = validateSelector(interaction, pointer, event, matches, matchElements, eventTarget);\n\n if (actionInfo.action\n && !actionInfo.target.options[actionInfo.action.name].manualStart) {\n return actionInfo;\n }\n }\n\n element = utils.parentNode(element);\n }\n\n return {};\n}\n\nfunction prepare (interaction, { action, target, element }) {\n action = action || {};\n\n if (interaction.target && interaction.target.options.styleCursor) {\n interaction.target._doc.documentElement.style.cursor = '';\n }\n\n interaction.target = target;\n interaction.element = element;\n utils.copyAction(interaction.prepared, action);\n\n if (target && target.options.styleCursor) {\n const cursor = action? actions[action.name].getCursor(action) : '';\n interaction.target._doc.documentElement.style.cursor = cursor;\n }\n\n signals.fire('prepared', { interaction: interaction });\n}\n\nInteraction.signals.on('stop', function ({ interaction }) {\n const target = interaction.target;\n\n if (target && target.options.styleCursor) {\n target._doc.documentElement.style.cursor = '';\n }\n});\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (utils.is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (utils.is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n const buttons = event.buttons || ({\n 0: 1,\n 1: 4,\n 3: 8,\n 4: 16,\n })[event.button];\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\nfunction withinInteractionLimit (interactable, element, action) {\n const options = interactable.options;\n const maxActions = options[action.name].max;\n const maxPerElement = options[action.name].maxPerElement;\n let activeInteractions = 0;\n let targetCount = 0;\n let targetElementCount = 0;\n\n // no actions if any of these values == 0\n if (!(maxActions && maxPerElement && autoStart.maxInteractions)) { return; }\n\n for (let i = 0, len = scope.interactions.length; i < len; i++) {\n const interaction = scope.interactions[i];\n const otherAction = interaction.prepared.name;\n\n if (!interaction.interacting()) { continue; }\n\n activeInteractions++;\n\n if (activeInteractions >= autoStart.maxInteractions) {\n return false;\n }\n\n if (interaction.target !== interactable) { continue; }\n\n targetCount += (otherAction === action.name)|0;\n\n if (targetCount >= maxActions) {\n return false;\n }\n\n if (interaction.element === element) {\n targetElementCount++;\n\n if (otherAction !== action.name || targetElementCount >= maxPerElement) {\n return false;\n }\n }\n }\n\n return autoStart.maxInteractions > 0;\n}\n\n/*\\\n * interact.maxInteractions\n [ method ]\n **\n * Returns or sets the maximum number of concurrent interactions allowed.\n * By default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables\n * and elements, you need to enable it in the draggable, resizable and\n * gesturable `'max'` and `'maxPerElement'` options.\n **\n - newValue (number) #optional Any number. newValue <= 0 means no interactions.\n\\*/\ninteract.maxInteractions = function (newValue) {\n if (utils.is.number(newValue)) {\n autoStart.maxInteractions = newValue;\n\n return this;\n }\n\n return autoStart.maxInteractions;\n};\n\nInteractable.settingsMethods.push('styleCursor');\nInteractable.settingsMethods.push('actionChecker');\nInteractable.settingsMethods.push('ignoreFrom');\nInteractable.settingsMethods.push('allowFrom');\n\ndefaultOptions.base.actionChecker = null;\ndefaultOptions.base.styleCursor = true;\n\nutils.extend(defaultOptions.perAction, autoStart.defaults.perAction);\n\nmodule.exports = autoStart;\n","const autoStart = require('./base');\nconst Interaction = require('../Interaction');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.delayTimer = null;\n});\n\nautoStart.signals.on('prepared', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.delayTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.target, interaction.element);\n }, delay);\n }\n});\n\nInteraction.signals.on('move', function ({ interaction, duplicate }) {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.delayTimer);\n }\n});\n\n// prevent regular down->move autoStart\nautoStart.signals.on('before-start', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.prepared.name = null;\n }\n});\n","const autoStart = require('./base');\nconst scope = require('../scope');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\n\nconst { matchesSelector, parentNode } = require('../utils/domUtils');\n\nautoStart.setActionDefaults(require('../actions/drag'));\n\nautoStart.signals.on('before-start', function ({ interaction, eventTarget, dx, dy }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // check if a drag is in the correct axis\n const absX = Math.abs(dx);\n const absY = Math.abs(dy);\n const options = interaction.target.options.drag;\n const startAxis = options.startAxis;\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy');\n\n interaction.prepared.axis = options.lockAxis === 'start'\n ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n : options.lockAxis;\n\n // if the movement isn't in the startAxis of the interactable\n if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) {\n // cancel the prepared action\n interaction.prepared.name = null;\n\n // then try to get a drag from another ineractable\n\n if (!interaction.prepared.name) {\n\n let element = eventTarget;\n\n const getDraggable = function (interactable, selector, context) {\n const elements = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n if (interactable === interaction.target) { return; }\n\n if (!options.manualStart\n && !interactable.testIgnoreAllow(options, element, eventTarget)\n && matchesSelector(element, selector, elements)) {\n\n const action = interactable.getAction(interaction.downPointer,\n interaction.downEvent,\n interaction,\n element);\n\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, interactable)\n && autoStart.validateAction(action, interactable, element, eventTarget)) {\n\n return interactable;\n }\n }\n };\n\n let action = null;\n\n // check all interactables\n while (is.element(element)) {\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && elementInteractable !== interaction.target\n && !elementInteractable.options.drag.manualStart) {\n\n action = elementInteractable.getAction(interaction.downPointer, interaction.downEvent, interaction, element);\n }\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, elementInteractable)) {\n\n interaction.prepared.name = 'drag';\n interaction.target = elementInteractable;\n interaction.element = element;\n break;\n }\n\n const selectorInteractable = scope.interactables.forEachSelector(getDraggable, element);\n\n if (selectorInteractable) {\n interaction.prepared.name = 'drag';\n interaction.target = selectorInteractable;\n interaction.element = element;\n break;\n }\n\n element = parentNode(element);\n }\n }\n }\n});\n\nfunction checkStartAxis (startAxis, interactable) {\n if (!interactable) { return false; }\n\n const thisAxis = interactable.options.drag.startAxis;\n\n return (startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis);\n}\n","require('./base').setActionDefaults(require('../actions/gesture'));\n","require('./base').setActionDefaults(require('../actions/resize'));\n","module.exports = {\n base: {\n accept : null,\n preventDefault: 'auto',\n deltaSource : 'page',\n },\n\n perAction: {\n origin: { x: 0, y: 0 },\n\n // only allow left button by default\n // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n mouseButtons: 1,\n\n inertia: {\n enabled : false,\n resistance : 10, // the lambda in exponential decay\n minSpeed : 100, // target speed must be above this for inertia to start\n endSpeed : 10, // the speed at which inertia is slow enough to stop\n allowResume : true, // allow resuming an action in inertia phase\n smoothEndDuration: 300, // animate to snap/restrict endOnly if there's no inertia\n },\n },\n};\n","/* browser entry point */\n\n// Legacy browser support\nrequire('./legacyBrowsers');\n\n// inertia\nrequire('./inertia');\n\n// modifiers\nrequire('./modifiers/snap');\nrequire('./modifiers/restrict');\n\n// pointerEvents\nrequire('./pointerEvents/base');\nrequire('./pointerEvents/holdRepeat');\nrequire('./pointerEvents/interactableTargets');\n\n// delay\nrequire('./autoStart/delay');\n\n// actions\nrequire('./actions/gesture');\nrequire('./actions/resize');\nrequire('./actions/drag');\nrequire('./actions/drop');\n\n// load these modifiers after resize is loaded\nrequire('./modifiers/snapSize');\nrequire('./modifiers/restrictEdges');\nrequire('./modifiers/restrictSize');\n\n// autoStart actions\nrequire('./autoStart/gesture');\nrequire('./autoStart/resize');\nrequire('./autoStart/drag');\n\n// Interactable preventDefault setting\nrequire('./interactablePreventDefault.js');\n\n// autoScroll\nrequire('./autoScroll');\n\n// export interact\nmodule.exports = require('./interact');\n","const InteractEvent = require('./InteractEvent');\nconst Interaction = require('./Interaction');\nconst modifiers = require('./modifiers');\nconst utils = require('./utils');\nconst animationFrame = require('./utils/raf');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.inertiaStatus = {\n active : false,\n smoothEnd : false,\n allowResume: false,\n\n startEvent: null,\n upCoords : {},\n\n xe: 0, ye: 0,\n sx: 0, sy: 0,\n\n t0: 0,\n vx0: 0, vys: 0,\n duration: 0,\n\n lambda_v0: 0,\n one_ve_v0: 0,\n i : null,\n };\n\n interaction.boundInertiaFrame = () => inertiaFrame .apply(interaction);\n interaction.boundSmoothEndFrame = () => smoothEndFrame.apply(interaction);\n});\n\nInteraction.signals.on('down', function ({ interaction, event, pointer, eventTarget }) {\n const status = interaction.inertiaStatus;\n\n // Check if the down event hits the current inertia target\n if (status.active) {\n let element = eventTarget;\n\n // climb up the DOM tree from the event target\n while (utils.is.element(element)) {\n\n // if interaction element is the current inertia target element\n if (element === interaction.element) {\n // stop inertia\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n\n // update pointers to the down event's coordinates\n interaction.updatePointer(pointer);\n utils.setCoords(interaction.curCoords, interaction.pointers);\n\n // fire appropriate signals\n const signalArg = { interaction };\n Interaction.signals.fire('before-action-move', signalArg);\n Interaction.signals.fire('action-resume' , signalArg);\n\n // fire a reume event\n const resumeEvent = new InteractEvent(interaction,\n event,\n interaction.prepared.name,\n 'inertiaresume',\n interaction.element);\n\n interaction.target.fire(resumeEvent);\n interaction.prevEvent = resumeEvent;\n modifiers.resetStatuses(interaction.modifierStatuses);\n\n utils.copyCoords(interaction.prevCoords, interaction.curCoords);\n break;\n }\n\n element = utils.parentNode(element);\n }\n }\n});\n\nInteraction.signals.on('up', function ({ interaction, event }) {\n const status = interaction.inertiaStatus;\n\n if (!interaction.interacting() || status.active) { return; }\n\n const target = interaction.target;\n const options = target && target.options;\n const inertiaOptions = options && interaction.prepared.name && options[interaction.prepared.name].inertia;\n\n const now = new Date().getTime();\n const statuses = {};\n const page = utils.extend({}, interaction.curCoords.page);\n const pointerSpeed = interaction.pointerDelta.client.speed;\n\n let smoothEnd = false;\n let modifierResult;\n\n // check if inertia should be started\n const inertiaPossible = (inertiaOptions && inertiaOptions.enabled\n && interaction.prepared.name !== 'gesture'\n && event !== status.startEvent);\n\n const inertia = (inertiaPossible\n && (now - interaction.curCoords.timeStamp) < 50\n && pointerSpeed > inertiaOptions.minSpeed\n && pointerSpeed > inertiaOptions.endSpeed);\n\n const modifierArg = {\n interaction,\n pageCoords: page,\n statuses,\n preEnd: true,\n requireEndOnly: true,\n };\n\n // smoothEnd\n if (inertiaPossible && !inertia) {\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n if (modifierResult.shouldMove && modifierResult.locked) {\n smoothEnd = true;\n }\n }\n\n if (!(inertia || smoothEnd)) { return; }\n\n utils.copyCoords(status.upCoords, interaction.curCoords);\n\n interaction.pointers[0] = status.startEvent =\n new InteractEvent(interaction, event, interaction.prepared.name, 'inertiastart', interaction.element);\n\n status.t0 = now;\n\n status.active = true;\n status.allowResume = inertiaOptions.allowResume;\n interaction.simulation = status;\n\n target.fire(status.startEvent);\n\n if (inertia) {\n status.vx0 = interaction.pointerDelta.client.vx;\n status.vy0 = interaction.pointerDelta.client.vy;\n status.v0 = pointerSpeed;\n\n calcInertia(interaction, status);\n\n utils.extend(page, interaction.curCoords.page);\n\n page.x += status.xe;\n page.y += status.ye;\n\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n status.modifiedXe += modifierResult.dx;\n status.modifiedYe += modifierResult.dy;\n\n status.i = animationFrame.request(interaction.boundInertiaFrame);\n }\n else {\n status.smoothEnd = true;\n status.xe = modifierResult.dx;\n status.ye = modifierResult.dy;\n\n status.sx = status.sy = 0;\n\n status.i = animationFrame.request(interaction.boundSmoothEndFrame);\n }\n});\n\nInteraction.signals.on('stop-active', function ({ interaction }) {\n const status = interaction.inertiaStatus;\n\n if (status.active) {\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n }\n});\n\nfunction calcInertia (interaction, status) {\n const inertiaOptions = interaction.target.options[interaction.prepared.name].inertia;\n const lambda = inertiaOptions.resistance;\n const inertiaDur = -Math.log(inertiaOptions.endSpeed / status.v0) / lambda;\n\n status.x0 = interaction.prevEvent.pageX;\n status.y0 = interaction.prevEvent.pageY;\n status.t0 = status.startEvent.timeStamp / 1000;\n status.sx = status.sy = 0;\n\n status.modifiedXe = status.xe = (status.vx0 - inertiaDur) / lambda;\n status.modifiedYe = status.ye = (status.vy0 - inertiaDur) / lambda;\n status.te = inertiaDur;\n\n status.lambda_v0 = lambda / status.v0;\n status.one_ve_v0 = 1 - inertiaOptions.endSpeed / status.v0;\n}\n\nfunction inertiaFrame () {\n updateInertiaCoords(this);\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n\n const status = this.inertiaStatus;\n const options = this.target.options[this.prepared.name].inertia;\n const lambda = options.resistance;\n const t = new Date().getTime() / 1000 - status.t0;\n\n if (t < status.te) {\n\n const progress = 1 - (Math.exp(-lambda * t) - status.lambda_v0) / status.one_ve_v0;\n\n if (status.modifiedXe === status.xe && status.modifiedYe === status.ye) {\n status.sx = status.xe * progress;\n status.sy = status.ye * progress;\n }\n else {\n const quadPoint = utils.getQuadraticCurvePoint(0, 0,\n status.xe,\n status.ye,\n status.modifiedXe,\n status.modifiedYe,\n progress);\n\n status.sx = quadPoint.x;\n status.sy = quadPoint.y;\n }\n\n this.doMove();\n\n status.i = animationFrame.request(this.boundInertiaFrame);\n }\n else {\n status.sx = status.modifiedXe;\n status.sy = status.modifiedYe;\n\n this.doMove();\n this.end(status.startEvent);\n status.active = false;\n this.simulation = null;\n }\n\n utils.copyCoords(this.prevCoords, this.curCoords);\n}\n\nfunction smoothEndFrame () {\n updateInertiaCoords(this);\n\n const status = this.inertiaStatus;\n const t = new Date().getTime() - status.t0;\n const duration = this.target.options[this.prepared.name].inertia.smoothEndDuration;\n\n if (t < duration) {\n status.sx = utils.easeOutQuad(t, 0, status.xe, duration);\n status.sy = utils.easeOutQuad(t, 0, status.ye, duration);\n\n this.pointerMove(status.startEvent, status.startEvent);\n\n status.i = animationFrame.request(this.boundSmoothEndFrame);\n }\n else {\n status.sx = status.xe;\n status.sy = status.ye;\n\n this.pointerMove(status.startEvent, status.startEvent);\n this.end(status.startEvent);\n\n status.smoothEnd =\n status.active = false;\n this.simulation = null;\n }\n}\n\nfunction updateInertiaCoords (interaction) {\n const status = interaction.inertiaStatus;\n\n // return if inertia isn't running\n if (!status.active) { return; }\n\n const pageUp = status.upCoords.page;\n const clientUp = status.upCoords.client;\n\n utils.setCoords(interaction.curCoords, [ {\n pageX : pageUp.x + status.sx,\n pageY : pageUp.y + status.sy,\n clientX: clientUp.x + status.sx,\n clientY: clientUp.y + status.sy,\n } ]);\n}\n","const browser = require('./utils/browser');\nconst events = require('./utils/events');\nconst utils = require('./utils');\nconst scope = require('./scope');\nconst Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\n\nconst globalEvents = {};\n\n/*\\\n * interact\n [ method ]\n *\n * The methods of this variable can be used to set elements as\n * interactables and also to change various default settings.\n *\n * Calling it as a function and passing an element or a valid CSS selector\n * string returns an Interactable object which has various methods to\n * configure it.\n *\n - element (Element | string) The HTML or SVG Element to interact with or CSS selector\n = (object) An @Interactable\n *\n > Usage\n | interact('#draggable').draggable(true);\n |\n | var rectables = interact('rect');\n | rectables\n | .gesturable(true)\n | .on('gesturemove', function (event) {\n | // ...\n | });\n\\*/\nfunction interact (element, options) {\n let interactable = scope.interactables.get(element, options);\n\n if (!interactable) {\n interactable = new Interactable(element, options);\n interactable.events.global = globalEvents;\n }\n\n return interactable;\n}\n\n/*\\\n * interact.isSet\n [ method ]\n *\n * Check if an element has been set\n - element (Element) The Element being searched for\n = (boolean) Indicates if the element or CSS selector was previously passed to interact\n\\*/\ninteract.isSet = function (element, options) {\n return scope.interactables.indexOfElement(element, options && options.context) !== -1;\n};\n\n/*\\\n * interact.on\n [ method ]\n *\n * Adds a global listener for an InteractEvent or adds a DOM event to\n * `document`\n *\n - type (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) interact\n\\*/\ninteract.on = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.on(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.on(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n // if it is an InteractEvent type, add listener to globalEvents\n if (utils.contains(Interactable.eventTypes, type)) {\n // if this type of event was never bound\n if (!globalEvents[type]) {\n globalEvents[type] = [listener];\n }\n else {\n globalEvents[type].push(listener);\n }\n }\n // If non InteractEvent type, addEventListener to document\n else {\n events.add(scope.document, type, listener, { options });\n }\n\n return interact;\n};\n\n/*\\\n * interact.off\n [ method ]\n *\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n - type (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) interact\n \\*/\ninteract.off = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.off(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.off(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n if (!utils.contains(Interactable.eventTypes, type)) {\n events.remove(scope.document, type, listener, options);\n }\n else {\n let index;\n\n if (type in globalEvents\n && (index = utils.indexOf(globalEvents[type], listener)) !== -1) {\n globalEvents[type].splice(index, 1);\n }\n }\n\n return interact;\n};\n\n/*\\\n * interact.debug\n [ method ]\n *\n * Returns an object which exposes internal data\n = (object) An object with properties that outline the current state and expose internal functions and variables\n\\*/\ninteract.debug = function () {\n return scope;\n};\n\n// expose the functions used to calculate multi-touch properties\ninteract.getPointerAverage = utils.pointerAverage;\ninteract.getTouchBBox = utils.touchBBox;\ninteract.getTouchDistance = utils.touchDistance;\ninteract.getTouchAngle = utils.touchAngle;\n\ninteract.getElementRect = utils.getElementRect;\ninteract.getElementClientRect = utils.getElementClientRect;\ninteract.matchesSelector = utils.matchesSelector;\ninteract.closest = utils.closest;\n\n/*\\\n * interact.supportsTouch\n [ method ]\n *\n = (boolean) Whether or not the browser supports touch input\n\\*/\ninteract.supportsTouch = function () {\n return browser.supportsTouch;\n};\n\n/*\\\n * interact.supportsPointerEvent\n [ method ]\n *\n = (boolean) Whether or not the browser supports PointerEvents\n\\*/\ninteract.supportsPointerEvent = function () {\n return browser.supportsPointerEvent;\n};\n\n/*\\\n * interact.stop\n [ method ]\n *\n * Cancels all interactions (end events are not fired)\n *\n - event (Event) An event on which to call preventDefault()\n = (object) interact\n\\*/\ninteract.stop = function (event) {\n for (let i = scope.interactions.length - 1; i >= 0; i--) {\n scope.interactions[i].stop(event);\n }\n\n return interact;\n};\n\n/*\\\n * interact.pointerMoveTolerance\n [ method ]\n * Returns or sets the distance the pointer must be moved before an action\n * sequence occurs. This also affects tolerance for tap events.\n *\n - newValue (number) #optional The movement from the start position must be greater than this value\n = (number | Interactable) The current setting or interact\n\\*/\ninteract.pointerMoveTolerance = function (newValue) {\n if (utils.is.number(newValue)) {\n Interaction.pointerMoveTolerance = newValue;\n\n return this;\n }\n\n return Interaction.pointerMoveTolerance;\n};\n\ninteract.addDocument = scope.addDocument;\ninteract.removeDocument = scope.removeDocument;\n\nscope.interact = interact;\n\nmodule.exports = interact;\n","const Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\nconst scope = require('./scope');\nconst is = require('./utils/is');\nconst events = require('./utils/events');\n\nconst { nodeContains, matchesSelector } = require('./utils/domUtils');\n\n/*\\\n * Interactable.preventDefault\n [ method ]\n *\n * Returns or sets whether to prevent the browser's default behaviour\n * in response to pointer events. Can be set to:\n * - `'always'` to always prevent\n * - `'never'` to never prevent\n * - `'auto'` to let interact.js try to determine what would be best\n *\n - newValue (string) #optional `true`, `false` or `'auto'`\n = (string | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.preventDefault = function (newValue) {\n if (/^(always|never|auto)$/.test(newValue)) {\n this.options.preventDefault = newValue;\n return this;\n }\n\n if (is.bool(newValue)) {\n this.options.preventDefault = newValue? 'always' : 'never';\n return this;\n }\n\n return this.options.preventDefault;\n};\n\nInteractable.prototype.checkAndPreventDefault = function (event) {\n const setting = this.options.preventDefault;\n\n if (setting === 'never') { return; }\n\n if (setting === 'always') {\n event.preventDefault();\n return;\n }\n\n // setting === 'auto'\n\n // don't preventDefault if the browser supports passiveEvents\n // CSS touch-action and user-selecct should be used instead\n if (events.supportsOptions) {\n return;\n }\n\n // don't preventDefault of pointerdown events\n if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) {\n return;\n }\n\n // don't preventDefault on editable elements\n if (is.element(event.target)\n && matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) {\n return;\n }\n\n event.preventDefault();\n};\n\nfunction onInteractionEvent ({ interaction, event }) {\n if (interaction.target) {\n interaction.target.checkAndPreventDefault(event);\n }\n}\n\nfor (const eventSignal of ['down', 'move', 'up', 'cancel']) {\n Interaction.signals.on(eventSignal, onInteractionEvent);\n}\n\n// prevent native HTML5 drag on interact.js target elements\nInteraction.docEvents.dragstart = function preventNativeDrag (event) {\n for (const interaction of scope.interactions) {\n\n if (interaction.element\n && (interaction.element === event.target\n || nodeContains(interaction.element, event.target))) {\n\n interaction.target.checkAndPreventDefault(event);\n return;\n }\n }\n};\n","const scope = require('./scope');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst iFinder = require('./utils/interactionFinder');\nconst pointerEvents = require('./pointerEvents/base');\n\nconst { window } = require('./utils/window');\n\nconst toString = Object.prototype.toString;\n\nif (!window.Array.isArray) {\n window.Array.isArray = function (obj) {\n return toString.call(obj) === '[object Array]';\n };\n}\n\nif (!String.prototype.trim) {\n String.prototype.trim = function () {\n return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n };\n}\n\n// http://www.quirksmode.org/dom/events/click.html\n// >Events leading to dblclick\n//\n// IE8 doesn't fire down event before dblclick.\n// This workaround tries to fire a tap and doubletap after dblclick\nfunction onIE8Dblclick (event) {\n const eventTarget = event.target;\n const interaction = iFinder.search(event, event.type, eventTarget);\n\n if (!interaction) { return; }\n\n if (interaction.prevTap\n && event.clientX === interaction.prevTap.clientX\n && event.clientY === interaction.prevTap.clientY\n && eventTarget === interaction.prevTap.target) {\n\n interaction.downTargets[0] = eventTarget;\n interaction.downTimes [0] = new Date().getTime();\n\n pointerEvents.fire({\n interaction,\n event,\n eventTarget,\n pointer: event,\n type: 'tap',\n });\n }\n}\n\nif (browser.isIE8) {\n const selectFix = function (event) {\n for (const interaction of scope.interactions) {\n if (interaction.interacting()) {\n interaction.target.checkAndPreventDefault(event);\n }\n }\n };\n\n const onDocIE8 = function onDocIE8 ({ doc, win }, signalName) {\n const eventMethod = signalName.indexOf('listen') === 0\n ? events.add : events.remove;\n\n // For IE's lack of Event#preventDefault\n eventMethod(doc, 'selectstart', selectFix);\n\n if (pointerEvents) {\n eventMethod(doc, 'dblclick', onIE8Dblclick);\n }\n };\n\n scope.signals.on('add-document' , onDocIE8);\n scope.signals.on('remove-document', onDocIE8);\n}\n\nmodule.exports = null;\n","const InteractEvent = require('../InteractEvent');\nconst Interaction = require('../Interaction');\nconst extend = require('../utils/extend');\n\nconst modifiers = {\n names: [],\n\n setOffsets: function (arg) {\n const { interaction, pageCoords: page } = arg;\n const { target, element, startOffset } = interaction;\n const rect = target.getRect(element);\n\n if (rect) {\n startOffset.left = page.x - rect.left;\n startOffset.top = page.y - rect.top;\n\n startOffset.right = rect.right - page.x;\n startOffset.bottom = rect.bottom - page.y;\n\n if (!('width' in rect)) { rect.width = rect.right - rect.left; }\n if (!('height' in rect)) { rect.height = rect.bottom - rect.top ; }\n }\n else {\n startOffset.left = startOffset.top = startOffset.right = startOffset.bottom = 0;\n }\n\n arg.rect = rect;\n arg.interactable = target;\n arg.element = element;\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n\n arg.options = target.options[interaction.prepared.name][modifierName];\n\n if (!arg.options) {\n continue;\n }\n\n interaction.modifierOffsets[modifierName] = modifiers[modifierName].setOffset(arg);\n }\n },\n\n setAll: function (arg) {\n const { interaction, statuses, preEnd, requireEndOnly } = arg;\n const coords = extend({}, arg.pageCoords);\n const result = {\n dx: 0,\n dy: 0,\n changed: false,\n locked: false,\n shouldMove: true,\n };\n\n for (const modifierName of modifiers.names) {\n const modifier = modifiers[modifierName];\n const options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!shouldDo(options, preEnd, requireEndOnly)) { continue; }\n\n arg.status = arg.status = statuses[modifierName];\n arg.options = options;\n arg.offset = arg.interaction.modifierOffsets[modifierName];\n\n modifier.set(arg);\n\n if (arg.status.locked) {\n coords.x += arg.status.dx;\n coords.y += arg.status.dy;\n\n result.dx += arg.status.dx;\n result.dy += arg.status.dy;\n\n result.locked = true;\n }\n }\n\n // a move should be fired if:\n // - there are no modifiers enabled,\n // - no modifiers are \"locked\" i.e. have changed the pointer's coordinates, or\n // - the locked coords have changed since the last pointer move\n result.shouldMove = !arg.status || !result.locked || arg.status.changed;\n\n return result;\n },\n\n resetStatuses: function (statuses) {\n for (const modifierName of modifiers.names) {\n const status = statuses[modifierName] || {};\n\n status.dx = status.dy = 0;\n status.modifiedX = status.modifiedY = NaN;\n status.locked = false;\n status.changed = true;\n\n statuses[modifierName] = status;\n }\n\n return statuses;\n },\n\n start: function ({ interaction }, signalName) {\n const arg = {\n interaction,\n pageCoords: (signalName === 'action-resume' ?\n interaction.curCoords : interaction.startCoords).page,\n startOffset: interaction.startOffset,\n statuses: interaction.modifierStatuses,\n preEnd: false,\n requireEndOnly: false,\n };\n\n modifiers.setOffsets(arg);\n modifiers.resetStatuses(arg.statuses);\n\n arg.pageCoords = extend({}, interaction.startCoords.page);\n interaction.modifierResult = modifiers.setAll(arg);\n },\n};\n\nInteraction.signals.on('new', function (interaction) {\n interaction.startOffset = { left: 0, right: 0, top: 0, bottom: 0 };\n interaction.modifierOffsets = {};\n interaction.modifierStatuses = modifiers.resetStatuses({});\n interaction.modifierResult = null;\n});\n\nInteraction.signals.on('action-start' , modifiers.start);\nInteraction.signals.on('action-resume', modifiers.start);\n\nInteraction.signals.on('before-action-move', function ({ interaction, preEnd, interactingBeforeMove }) {\n const modifierResult = modifiers.setAll({\n interaction,\n preEnd,\n pageCoords: interaction.curCoords.page,\n statuses: interaction.modifierStatuses,\n requireEndOnly: false,\n });\n\n // don't fire an action move if a modifier would keep the event in the same\n // cordinates as before\n if (!modifierResult.shouldMove && interactingBeforeMove) {\n interaction._dontFireMove = true;\n }\n\n interaction.modifierResult = modifierResult;\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n for (let i = 0; i < modifiers.names.length; i++) {\n const options = interaction.target.options[interaction.prepared.name][modifiers.names[i]];\n\n // if the endOnly option is true for any modifier\n if (shouldDo(options, true, true)) {\n // fire a move event at the modified coordinates\n interaction.doMove({ event, preEnd: true });\n break;\n }\n }\n});\n\nInteractEvent.signals.on('set-xy', function (arg) {\n const { iEvent, interaction } = arg;\n const modifierArg = extend({}, arg);\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n modifierArg.options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!modifierArg.options) {\n continue;\n }\n\n const modifier = modifiers[modifierName];\n\n modifierArg.status = interaction.modifierStatuses[modifierName];\n\n iEvent[modifierName] = modifier.modifyCoords(modifierArg);\n }\n});\n\nfunction shouldDo (options, preEnd, requireEndOnly) {\n return (options && options.enabled\n && (preEnd || !options.endOnly)\n && (!requireEndOnly || options.endOnly));\n}\n\nmodule.exports = modifiers;\n","const modifiers = require('./index');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst restrict = {\n defaults: {\n enabled : false,\n endOnly : false,\n restriction: null,\n elementRect: null,\n },\n\n setOffset: function ({ rect, startOffset, options }) {\n const elementRect = options && options.elementRect;\n const offset = {};\n\n if (rect && elementRect) {\n offset.left = startOffset.left - (rect.width * elementRect.left);\n offset.top = startOffset.top - (rect.height * elementRect.top);\n\n offset.right = startOffset.right - (rect.width * (1 - elementRect.right));\n offset.bottom = startOffset.bottom - (rect.height * (1 - elementRect.bottom));\n }\n else {\n offset.left = offset.top = offset.right = offset.bottom = 0;\n }\n\n return offset;\n },\n\n set: function ({ pageCoords, interaction, status, options }) {\n if (!options) { return status; }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n\n const restriction = getRestrictionRect(options.restriction, interaction, page);\n\n if (!restriction) { return status; }\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n const rect = restriction;\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n const offset = interaction.modifierOffsets.restrict;\n\n // object is assumed to have\n // x, y, width, height or\n // left, top, right, bottom\n if ('x' in restriction && 'y' in restriction) {\n modifiedX = Math.max(Math.min(rect.x + rect.width - offset.right , page.x), rect.x + offset.left);\n modifiedY = Math.max(Math.min(rect.y + rect.height - offset.bottom, page.y), rect.y + offset.top );\n }\n else {\n modifiedX = Math.max(Math.min(rect.right - offset.right , page.x), rect.left + offset.left);\n modifiedY = Math.max(Math.min(rect.bottom - offset.bottom, page.y), rect.top + offset.top );\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const elementRect = options && options.elementRect;\n\n if (options && options.enabled\n && !(phase === 'start' && elementRect && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n getRestrictionRect,\n};\n\nfunction getRestrictionRect (value, interaction, page) {\n if (utils.is.function(value)) {\n return utils.resolveRectLike(value, interaction.target, interaction.element, [page.x, page.y, interaction]);\n } else {\n return utils.resolveRectLike(value, interaction.target, interaction.element);\n }\n}\n\nmodifiers.restrict = restrict;\nmodifiers.names.push('restrict');\n\ndefaultOptions.perAction.restrict = restrict.defaults;\n\nmodule.exports = restrict;\n","// This module adds the options.resize.restrictEdges setting which sets min and\n// max for the top, left, bottom and right edges of the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictEdges: {\n// inner: { top: 200, left: 200, right: 400, bottom: 400 },\n// outer: { top: 0, left: 0, right: 600, bottom: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst { getRestrictionRect } = require('./restrict');\n\nconst noInner = { top: +Infinity, left: +Infinity, bottom: -Infinity, right: -Infinity };\nconst noOuter = { top: -Infinity, left: -Infinity, bottom: +Infinity, right: +Infinity };\n\nconst restrictEdges = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n offset: null,\n },\n\n setOffset: function ({ interaction, startOffset, options }) {\n if (!options) {\n return utils.extend({}, startOffset);\n }\n\n const offset = getRestrictionRect(options.offset, interaction, interaction.startCoords.page);\n\n if (offset) {\n return {\n top: startOffset.top + offset.y,\n left: startOffset.left + offset.x,\n bottom: startOffset.bottom + offset.y,\n right: startOffset.right + offset.x,\n };\n }\n\n return startOffset;\n },\n\n set: function ({ pageCoords, interaction, status, offset, options }) {\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n const inner = rectUtils.xywhToTlbr(getRestrictionRect(options.inner, interaction, page)) || noInner;\n const outer = rectUtils.xywhToTlbr(getRestrictionRect(options.outer, interaction, page)) || noOuter;\n\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n if (edges.top) {\n modifiedY = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top);\n }\n else if (edges.bottom) {\n modifiedY = Math.max(Math.min(outer.bottom - offset.bottom, page.y), inner.bottom - offset.bottom);\n }\n if (edges.left) {\n modifiedX = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left);\n }\n else if (edges.right) {\n modifiedX = Math.max(Math.min(outer.right - offset.right, page.x), inner.right - offset.right);\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n if (options && options.enabled\n && !(phase === 'start' && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n noInner,\n noOuter,\n getRestrictionRect,\n};\n\nmodifiers.restrictEdges = restrictEdges;\nmodifiers.names.push('restrictEdges');\n\ndefaultOptions.perAction.restrictEdges = restrictEdges.defaults;\nresize.defaults.restrictEdges = restrictEdges.defaults;\n\nmodule.exports = restrictEdges;\n","// This module adds the options.resize.restrictSize setting which sets min and\n// max width and height for the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictSize: {\n// min: { width: -600, height: -600 },\n// max: { width: 600, height: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst restrictEdges = require('./restrictEdges');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst noMin = { width: -Infinity, height: -Infinity };\nconst noMax = { width: +Infinity, height: +Infinity };\n\nconst restrictSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n },\n\n setOffset: function ({ interaction }) {\n return interaction.startOffset;\n },\n\n set: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const rect = rectUtils.xywhToTlbr(interaction.resizeRects.inverted);\n\n const minSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.min, interaction)) || noMin;\n const maxSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.max, interaction)) || noMax;\n\n arg.options = {\n enabled: options.enabled,\n endOnly: options.endOnly,\n inner: utils.extend({}, restrictEdges.noInner),\n outer: utils.extend({}, restrictEdges.noOuter),\n };\n\n if (edges.top) {\n arg.options.inner.top = rect.bottom - minSize.height;\n arg.options.outer.top = rect.bottom - maxSize.height;\n }\n else if (edges.bottom) {\n arg.options.inner.bottom = rect.top + minSize.height;\n arg.options.outer.bottom = rect.top + maxSize.height;\n }\n if (edges.left) {\n arg.options.inner.left = rect.right - minSize.width;\n arg.options.outer.left = rect.right - maxSize.width;\n }\n else if (edges.right) {\n arg.options.inner.right = rect.left + minSize.width;\n arg.options.outer.right = rect.left + maxSize.width;\n }\n\n restrictEdges.set(arg);\n },\n\n modifyCoords: restrictEdges.modifyCoords,\n};\n\nmodifiers.restrictSize = restrictSize;\nmodifiers.names.push('restrictSize');\n\ndefaultOptions.perAction.restrictSize = restrictSize.defaults;\nresize.defaults.restrictSize = restrictSize.defaults;\n\nmodule.exports = restrictSize;\n","const modifiers = require('./index');\nconst interact = require('../interact');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst snap = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n\n relativePoints: null,\n },\n\n setOffset: function ({ interaction, interactable, element, rect, startOffset, options }) {\n const offsets = [];\n const optionsOrigin = utils.rectToXY(utils.resolveRectLike(options.origin));\n const origin = optionsOrigin || utils.getOriginXY(interactable, element, interaction.prepared.name);\n options = options || interactable.options[interaction.prepared.name].snap || {};\n\n let snapOffset;\n\n if (options.offset === 'startCoords') {\n snapOffset = {\n x: interaction.startCoords.page.x - origin.x,\n y: interaction.startCoords.page.y - origin.y,\n };\n }\n else {\n const offsetRect = utils.resolveRectLike(options.offset, interactable, element, [interaction]);\n\n snapOffset = utils.rectToXY(offsetRect) || { x: 0, y: 0 };\n }\n\n if (rect && options.relativePoints && options.relativePoints.length) {\n for (const { x: relativeX, y: relativeY } of options.relativePoints) {\n offsets.push({\n x: startOffset.left - (rect.width * relativeX) + snapOffset.x,\n y: startOffset.top - (rect.height * relativeY) + snapOffset.y,\n });\n }\n }\n else {\n offsets.push(snapOffset);\n }\n\n return offsets;\n },\n\n set: function ({ interaction, pageCoords, status, options, offset: offsets }) {\n const targets = [];\n let target;\n let page;\n let i;\n\n if (status.useStatusXY) {\n page = { x: status.x, y: status.y };\n }\n else {\n const origin = utils.getOriginXY(interaction.target, interaction.element, interaction.prepared.name);\n\n page = utils.extend({}, pageCoords);\n\n page.x -= origin.x;\n page.y -= origin.y;\n }\n\n status.realX = page.x;\n status.realY = page.y;\n\n let len = options.targets? options.targets.length : 0;\n\n for (const { x: offsetX, y: offsetY } of offsets) {\n const relativeX = page.x - offsetX;\n const relativeY = page.y - offsetY;\n\n for (const snapTarget of options.targets) {\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n targets.push({\n x: utils.is.number(target.x) ? (target.x + offsetX) : relativeX,\n y: utils.is.number(target.y) ? (target.y + offsetY) : relativeY,\n\n range: utils.is.number(target.range)? target.range: options.range,\n });\n }\n }\n\n const closest = {\n target: null,\n inRange: false,\n distance: 0,\n range: 0,\n dx: 0,\n dy: 0,\n };\n\n for (i = 0, len = targets.length; i < len; i++) {\n target = targets[i];\n\n const range = target.range;\n const dx = target.x - page.x;\n const dy = target.y - page.y;\n const distance = utils.hypot(dx, dy);\n let inRange = distance <= range;\n\n // Infinite targets count as being out of range\n // compared to non infinite ones that are in range\n if (range === Infinity && closest.inRange && closest.range !== Infinity) {\n inRange = false;\n }\n\n if (!closest.target || (inRange\n // is the closest target in range?\n ? (closest.inRange && range !== Infinity\n // the pointer is relatively deeper in this target\n ? distance / range < closest.distance / closest.range\n // this target has Infinite range and the closest doesn't\n : (range === Infinity && closest.range !== Infinity)\n // OR this target is closer that the previous closest\n || distance < closest.distance)\n // The other is not in range and the pointer is closer to this target\n : (!closest.inRange && distance < closest.distance))) {\n\n closest.target = target;\n closest.distance = distance;\n closest.range = range;\n closest.inRange = inRange;\n closest.dx = dx;\n closest.dy = dy;\n\n status.range = range;\n }\n }\n\n let snapChanged;\n\n if (closest.target) {\n snapChanged = (status.modifiedX !== closest.target.x || status.modifiedY !== closest.target.y);\n\n status.modifiedX = closest.target.x;\n status.modifiedY = closest.target.y;\n }\n else {\n snapChanged = true;\n\n status.modifiedX = NaN;\n status.modifiedY = NaN;\n }\n\n status.dx = closest.dx;\n status.dy = closest.dy;\n\n status.changed = (snapChanged || (closest.inRange && !status.locked));\n status.locked = closest.inRange;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const relativePoints = options && options.relativePoints;\n\n if (options && options.enabled\n && !(phase === 'start' && relativePoints && relativePoints.length)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n }\n\n return {\n range : status.range,\n locked : status.locked,\n x : status.modifiedX,\n y : status.modifiedY,\n realX : status.realX,\n realY : status.realY,\n dx : status.dx,\n dy : status.dy,\n };\n }\n },\n};\n\ninteract.createSnapGrid = function (grid) {\n return function (x, y) {\n const limits = grid.limits || {\n left : -Infinity,\n right : Infinity,\n top : -Infinity,\n bottom: Infinity,\n };\n let offsetX = 0;\n let offsetY = 0;\n\n if (utils.is.object(grid.offset)) {\n offsetX = grid.offset.x;\n offsetY = grid.offset.y;\n }\n\n const gridx = Math.round((x - offsetX) / grid.x);\n const gridy = Math.round((y - offsetY) / grid.y);\n\n const newX = Math.max(limits.left, Math.min(limits.right , gridx * grid.x + offsetX));\n const newY = Math.max(limits.top , Math.min(limits.bottom, gridy * grid.y + offsetY));\n\n return {\n x: newX,\n y: newY,\n range: grid.range,\n };\n };\n};\n\nmodifiers.snap = snap;\nmodifiers.names.push('snap');\n\ndefaultOptions.perAction.snap = snap.defaults;\n\nmodule.exports = snap;\n","// This module allows snapping of the size of targets during resize\n// interactions.\n\nconst modifiers = require('./index');\nconst snap = require('./snap');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\nconst utils = require('../utils/');\n\nconst snapSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n },\n\n setOffset: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.edges;\n\n if (!edges) { return; }\n\n arg.options = {\n relativePoints: [{\n x: edges.left? 0 : 1,\n y: edges.top ? 0 : 1,\n }],\n origin: { x: 0, y: 0 },\n offset: 'self',\n range: options.range,\n };\n\n const offsets = snap.setOffset(arg);\n arg.options = options;\n\n return offsets;\n },\n\n set: function (arg) {\n const { interaction, options, offset, pageCoords } = arg;\n const page = utils.extend({}, pageCoords);\n const relativeX = page.x - offset[0].x;\n const relativeY = page.y - offset[0].y;\n\n arg.options = utils.extend({}, options);\n arg.options.targets = [];\n\n for (const snapTarget of options.targets) {\n let target;\n\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n if ('width' in target && 'height' in target) {\n target.x = target.width;\n target.y = target.height;\n }\n\n arg.options.targets.push(target);\n }\n\n snap.set(arg);\n },\n\n modifyCoords: function (arg) {\n const { options } = arg;\n\n arg.options = utils.extend({}, options);\n arg.options.enabled = options.enabled;\n arg.options.relativePoints = [null];\n\n snap.modifyCoords(arg);\n },\n};\n\nmodifiers.snapSize = snapSize;\nmodifiers.names.push('snapSize');\n\ndefaultOptions.perAction.snapSize = snapSize.defaults;\nresize.defaults.snapSize = snapSize.defaults;\n\nmodule.exports = snapSize;\n","const pointerUtils = require('../utils/pointerUtils');\n\nmodule.exports = class PointerEvent {\n constructor (type, pointer, event, eventTarget, interaction) {\n pointerUtils.pointerExtend(this, event);\n\n if (event !== pointer) {\n pointerUtils.pointerExtend(this, pointer);\n }\n\n this.interaction = interaction;\n\n this.timeStamp = new Date().getTime();\n this.originalEvent = event;\n this.type = type;\n this.pointerId = pointerUtils.getPointerId(pointer);\n this.pointerType = pointerUtils.getPointerType(pointer, interaction);\n this.target = eventTarget;\n this.currentTarget = null;\n\n if (type === 'tap') {\n const pointerIndex = interaction.getPointerIndex(pointer);\n this.dt = this.timeStamp - interaction.downTimes[pointerIndex];\n\n const interval = this.timeStamp - interaction.tapTime;\n\n this.double = !!(interaction.prevTap\n && interaction.prevTap.type !== 'doubletap'\n && interaction.prevTap.target === this.target\n && interval < 500);\n }\n else if (type === 'doubletap') {\n this.dt = pointer.timeStamp - interaction.tapTime;\n }\n }\n\n subtractOrigin ({ x: originX, y: originY }) {\n this.pageX -= originX;\n this.pageY -= originY;\n this.clientX -= originX;\n this.clientY -= originY;\n\n return this;\n }\n\n addOrigin ({ x: originX, y: originY }) {\n this.pageX += originX;\n this.pageY += originY;\n this.clientX += originX;\n this.clientY += originY;\n\n return this;\n }\n\n preventDefault () {\n this.originalEvent.preventDefault();\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n};\n","const PointerEvent = require('./PointerEvent');\nconst Interaction = require('../Interaction');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst defaults = require('../defaultOptions');\nconst signals = require('../utils/Signals').new();\nconst { filter } = require('../utils/arr');\n\nconst simpleSignals = [ 'down', 'up', 'cancel' ];\nconst simpleEvents = [ 'down', 'up', 'cancel' ];\n\nconst pointerEvents = {\n PointerEvent,\n fire,\n collectEventTargets,\n signals,\n defaults: {\n holdDuration: 600,\n ignoreFrom : null,\n allowFrom : null,\n origin : { x: 0, y: 0 },\n },\n types: [\n 'down',\n 'move',\n 'up',\n 'cancel',\n 'tap',\n 'doubletap',\n 'hold',\n ],\n};\n\nfunction fire (arg) {\n const {\n interaction, pointer, event, eventTarget,\n type = arg.pointerEvent.type,\n targets = collectEventTargets(arg),\n pointerEvent = new PointerEvent(type, pointer, event, eventTarget, interaction),\n } = arg;\n\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n targets,\n type,\n pointerEvent,\n };\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n\n for (const prop in target.props || {}) {\n pointerEvent[prop] = target.props[prop];\n }\n\n const origin = utils.getOriginXY(target.eventable, target.element);\n\n pointerEvent.subtractOrigin(origin);\n pointerEvent.eventable = target.eventable;\n pointerEvent.currentTarget = target.element;\n\n target.eventable.fire(pointerEvent);\n\n pointerEvent.addOrigin(origin);\n\n if (pointerEvent.immediatePropagationStopped\n || (pointerEvent.propagationStopped\n && (i + 1) < targets.length && targets[i + 1].element !== pointerEvent.currentTarget)) {\n break;\n }\n }\n\n signals.fire('fired', signalArg);\n\n if (type === 'tap') {\n // if pointerEvent should make a double tap, create and fire a doubletap\n // PointerEvent and use that as the prevTap\n const prevTap = pointerEvent.double\n ? fire({\n interaction, pointer, event, eventTarget,\n type: 'doubletap',\n })\n : pointerEvent;\n\n interaction.prevTap = prevTap;\n interaction.tapTime = prevTap.timeStamp;\n }\n\n return pointerEvent;\n}\n\nfunction collectEventTargets ({ interaction, pointer, event, eventTarget, type }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n // do not fire a tap event if the pointer was moved before being lifted\n if (type === 'tap' && (interaction.pointerWasMoved\n // or if the pointerup target is different to the pointerdown target\n || !(interaction.downTargets[pointerIndex] && interaction.downTargets[pointerIndex] === eventTarget))) {\n return [];\n }\n\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n path,\n targets: [],\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (type === 'hold') {\n signalArg.targets = filter(signalArg.targets, target =>\n target.eventable.options.holdDuration === interaction.holdTimers[pointerIndex].duration);\n }\n\n return signalArg.targets;\n}\n\nInteraction.signals.on('update-pointer-down', function ({ interaction, pointerIndex }) {\n interaction.holdTimers[pointerIndex] = { duration: Infinity, timeout: null };\n});\n\nInteraction.signals.on('remove-pointer', function ({ interaction, pointerIndex }) {\n interaction.holdTimers.splice(pointerIndex, 1);\n});\n\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget, duplicateMove }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n if (!duplicateMove && (!interaction.pointerIsDown || interaction.pointerWasMoved)) {\n if (interaction.pointerIsDown) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n\n fire({\n interaction, pointer, event, eventTarget,\n type: 'move',\n });\n }\n});\n\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget, pointerIndex }) {\n // copy event to be used in timeout for IE8\n const eventCopy = browser.isIE8? utils.extend({}, event) : event;\n\n const timer = interaction.holdTimers[pointerIndex];\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'hold',\n targets: [],\n path,\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (!signalArg.targets.length) { return; }\n\n let minDuration = Infinity;\n\n for (let i = 0; i < signalArg.targets.length; i++) {\n const target = signalArg.targets[i];\n const holdDuration = target.eventable.options.holdDuration;\n\n if (holdDuration < minDuration) {\n minDuration = holdDuration;\n }\n }\n\n timer.duration = minDuration;\n timer.timeout = setTimeout(function () {\n fire({\n interaction, eventCopy, eventTarget,\n pointer: browser.isIE8? eventCopy : pointer,\n type: 'hold',\n });\n }, minDuration);\n});\n\nInteraction.signals.on('up', ({ interaction, pointer, event, eventTarget }) => {\n if (!interaction.pointerWasMoved) {\n fire({ interaction, eventTarget, pointer, event, type: 'tap' });\n }\n});\n\n['up', 'cancel'].forEach(function (signalName) {\n Interaction.signals.on(signalName, function ({ interaction, pointerIndex }) {\n if (interaction.holdTimers[pointerIndex]) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n });\n});\n\nfunction createSignalListener (type) {\n return function ({ interaction, pointer, event, eventTarget }) {\n fire({ interaction, eventTarget, pointer, event, type });\n };\n}\n\nfor (let i = 0; i < simpleSignals.length; i++) {\n Interaction.signals.on(simpleSignals[i], createSignalListener(simpleEvents[i]));\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.prevTap = null; // the most recent tap event on this interaction\n interaction.tapTime = 0; // time of the most recent tap event\n interaction.holdTimers = []; // [{ duration, timeout }]\n});\n\ndefaults.pointerEvents = pointerEvents.defaults;\nmodule.exports = pointerEvents;\n","const pointerEvents = require('./base');\nconst Interaction = require('../Interaction');\n\npointerEvents.signals.on('new', onNew);\npointerEvents.signals.on('fired', onFired);\n\nfor (const signal of ['move', 'up', 'cancel', 'endall']) {\n Interaction.signals.on(signal, endHoldRepeat);\n}\n\nfunction onNew ({ pointerEvent }) {\n if (pointerEvent.type !== 'hold') { return; }\n\n pointerEvent.count = (pointerEvent.count || 0) + 1;\n}\n\nfunction onFired ({ interaction, pointerEvent, eventTarget, targets }) {\n if (pointerEvent.type !== 'hold' || !targets.length) { return; }\n\n // get the repeat interval from the first eventable\n const interval = targets[0].eventable.options.holdRepeatInterval;\n\n // don't repeat if the interval is 0 or less\n if (interval <= 0) { return; }\n\n // set a timeout to fire the holdrepeat event\n interaction.holdIntervalHandle = setTimeout(function () {\n pointerEvents.fire({\n interaction,\n eventTarget,\n type: 'hold',\n pointer: pointerEvent,\n event: pointerEvent,\n });\n }, interval);\n}\n\nfunction endHoldRepeat ({ interaction }) {\n // set the interaction's holdStopTime property\n // to stop further holdRepeat events\n if (interaction.holdIntervalHandle) {\n clearInterval(interaction.holdIntervalHandle);\n interaction.holdIntervalHandle = null;\n }\n}\n\n// don't repeat by default\npointerEvents.defaults.holdRepeatInterval = 0;\npointerEvents.types.push('holdrepeat');\n\nmodule.exports = {\n onNew,\n onFired,\n endHoldRepeat,\n};\n","const pointerEvents = require('./base');\nconst Interactable = require('../Interactable');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\nconst scope = require('../scope');\nconst extend = require('../utils/extend');\nconst { merge } = require('../utils/arr');\n\npointerEvents.signals.on('collect-targets', function ({ targets, element, type, eventTarget }) {\n function collectSelectors (interactable, selector, context) {\n const els = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && is.element(element)\n && domUtils.matchesSelector(element, selector, els)\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n const interactable = scope.interactables.get(element);\n\n if (interactable) {\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n scope.interactables.forEachSelector(collectSelectors, element);\n});\n\nInteractable.signals.on('new', function ({ interactable }) {\n interactable.events.getRect = function (element) {\n return interactable.getRect(element);\n };\n});\n\nInteractable.signals.on('set', function ({ interactable, options }) {\n extend(interactable.events.options, pointerEvents.defaults);\n extend(interactable.events.options, options);\n});\n\nmerge(Interactable.eventTypes, pointerEvents.types);\n\nInteractable.prototype.pointerEvents = function (options) {\n extend(this.events.options, options);\n\n return this;\n};\n\nconst __backCompatOption = Interactable.prototype._backCompatOption;\n\nInteractable.prototype._backCompatOption = function (optionName, newValue) {\n const ret = __backCompatOption.call(this, optionName, newValue);\n\n if (ret === this) {\n this.events.options[optionName] = newValue;\n }\n\n return ret;\n};\n\nInteractable.settingsMethods.push('pointerEvents');\n","const utils = require('./utils');\nconst events = require('./utils/events');\nconst signals = require('./utils/Signals').new();\n\nconst scope = {\n signals,\n events,\n utils,\n\n // main document\n document: require('./utils/domObjects').document,\n // all documents being listened to\n documents: [],\n\n addDocument: function (doc, win) {\n // do nothing if document is already known\n if (utils.contains(scope.documents, doc)) { return false; }\n\n win = win || scope.getWindow(doc);\n\n scope.documents.push(doc);\n events.documents.push(doc);\n\n // don't add an unload event for the main document\n // so that the page may be cached in browser history\n if (doc !== scope.document) {\n events.add(win, 'unload', scope.onWindowUnload);\n }\n\n signals.fire('add-document', { doc, win });\n },\n\n removeDocument: function (doc, win) {\n const index = utils.indexOf(scope.documents, doc);\n\n win = win || scope.getWindow(doc);\n\n events.remove(win, 'unload', scope.onWindowUnload);\n\n scope.documents.splice(index, 1);\n events.documents.splice(index, 1);\n\n signals.fire('remove-document', { win, doc });\n },\n\n onWindowUnload: function () {\n scope.removeDocument(this.document, this);\n },\n};\n\nmodule.exports = scope;\n","const { indexOf } = require('./arr');\n\nclass Signals {\n constructor () {\n this.listeners = {\n // signalName: [listeners],\n };\n }\n\n on (name, listener) {\n if (!this.listeners[name]) {\n this.listeners[name] = [listener];\n return;\n }\n\n this.listeners[name].push(listener);\n }\n\n off (name, listener) {\n if (!this.listeners[name]) { return; }\n\n const index = indexOf(this.listeners[name], listener);\n\n if (index !== -1) {\n this.listeners[name].splice(index, 1);\n }\n }\n\n fire (name, arg) {\n const targetListeners = this.listeners[name];\n\n if (!targetListeners) { return; }\n\n for (let i = 0; i < targetListeners.length; i++) {\n if (targetListeners[i](arg, name) === false) {\n return;\n }\n }\n }\n}\n\nSignals.new = function () {\n return new Signals();\n};\n\nmodule.exports = Signals;\n","function indexOf (array, target) {\n for (let i = 0, len = array.length; i < len; i++) {\n if (array[i] === target) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction contains (array, target) {\n return indexOf(array, target) !== -1;\n}\n\nfunction merge (target, source) {\n for (let i = 0; i < source.length; i++) {\n target.push(source[i]);\n }\n\n return target;\n}\n\nfunction filter (array, test) {\n const result = [];\n\n for (let i = 0; i < array.length; i++) {\n if (test(array[i])) {\n result.push(array[i]);\n }\n }\n\n return result;\n}\n\nmodule.exports = {\n indexOf,\n contains,\n merge,\n filter,\n};\n","const { window } = require('./window');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst Element = domObjects.Element;\nconst navigator = window.navigator;\n\nconst browser = {\n // Does the browser support touch input?\n supportsTouch: !!(('ontouchstart' in window) || is.function(window.DocumentTouch)\n && domObjects.document instanceof window.DocumentTouch),\n\n // Does the browser support PointerEvents\n supportsPointerEvent: !!domObjects.PointerEvent,\n\n isIE8: ('attachEvent' in window) && !('addEventListener' in window),\n\n // Opera Mobile must be handled differently\n isOperaMobile: (navigator.appName === 'Opera'\n && browser.supportsTouch\n && navigator.userAgent.match('Presto')),\n\n // scrolling doesn't change the result of getClientRects on iOS 7\n isIOS7: (/iP(hone|od|ad)/.test(navigator.platform)\n && /OS 7[^\\d]/.test(navigator.appVersion)),\n\n isIe9OrOlder: /MSIE (8|9)/.test(navigator.userAgent),\n\n // prefix matchesSelector\n prefixedMatchesSelector: 'matches' in Element.prototype\n ? 'matches': 'webkitMatchesSelector' in Element.prototype\n ? 'webkitMatchesSelector': 'mozMatchesSelector' in Element.prototype\n ? 'mozMatchesSelector': 'oMatchesSelector' in Element.prototype\n ? 'oMatchesSelector': 'msMatchesSelector',\n\n useMatchesSelectorPolyfill: false,\n\n pEventTypes: (domObjects.PointerEvent\n ? (domObjects.PointerEvent === window.MSPointerEvent\n ? {\n up: 'MSPointerUp',\n down: 'MSPointerDown',\n over: 'mouseover',\n out: 'mouseout',\n move: 'MSPointerMove',\n cancel: 'MSPointerCancel',\n }\n : {\n up: 'pointerup',\n down: 'pointerdown',\n over: 'pointerover',\n out: 'pointerout',\n move: 'pointermove',\n cancel: 'pointercancel',\n })\n : null),\n\n // because Webkit and Opera still use 'mousewheel' event type\n wheelEvent: 'onmousewheel' in domObjects.document? 'mousewheel': 'wheel',\n\n};\n\nbrowser.useMatchesSelectorPolyfill = !is.function(Element.prototype[browser.prefixedMatchesSelector]);\n\nmodule.exports = browser;\n","const domObjects = {};\nconst win = require('./window').window;\n\nfunction blank () {}\n\ndomObjects.document = win.document;\ndomObjects.DocumentFragment = win.DocumentFragment || blank;\ndomObjects.SVGElement = win.SVGElement || blank;\ndomObjects.SVGSVGElement = win.SVGSVGElement || blank;\ndomObjects.SVGElementInstance = win.SVGElementInstance || blank;\ndomObjects.Element = win.Element || blank;\ndomObjects.HTMLElement = win.HTMLElement || domObjects.Element;\n\ndomObjects.Event = win.Event;\ndomObjects.Touch = win.Touch || blank;\ndomObjects.PointerEvent = (win.PointerEvent || win.MSPointerEvent);\n\nmodule.exports = domObjects;\n","const win = require('./window');\nconst browser = require('./browser');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst domUtils = {\n nodeContains: function (parent, child) {\n while (child) {\n if (child === parent) {\n return true;\n }\n\n child = child.parentNode;\n }\n\n return false;\n },\n\n closest: function (element, selector) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) { return element; }\n\n element = domUtils.parentNode(element);\n }\n\n return null;\n },\n\n parentNode: function (node) {\n let parent = node.parentNode;\n\n if (is.docFrag(parent)) {\n // skip past #shado-root fragments\n while ((parent = parent.host) && is.docFrag(parent)) {\n continue;\n }\n\n return parent;\n }\n\n return parent;\n },\n\n // taken from http://tanalin.com/en/blog/2012/12/matches-selector-ie8/ and modified\n matchesSelectorPolyfill: browser.useMatchesSelectorPolyfill\n ? function (element, selector, elems) {\n elems = elems || element.parentNode.querySelectorAll(selector);\n\n for (let i = 0, len = elems.length; i < len; i++) {\n if (elems[i] === element) {\n return true;\n }\n }\n\n return false;\n }\n : null,\n\n matchesSelector: function (element, selector, nodeList) {\n if (browser.useMatchesSelectorPolyfill) {\n return domUtils.matchesSelectorPolyfill(element, selector, nodeList);\n }\n\n // remove /deep/ from selectors if shadowDOM polyfill is used\n if (win.window !== win.realWindow) {\n selector = selector.replace(/\\/deep\\//g, ' ');\n }\n\n return element[browser.prefixedMatchesSelector](selector);\n },\n\n // Test for the element that's \"above\" all other qualifiers\n indexOfDeepestElement: function (elements) {\n let deepestZoneParents = [];\n let dropzoneParents = [];\n let dropzone;\n let deepestZone = elements[0];\n let index = deepestZone? 0: -1;\n let parent;\n let child;\n let i;\n let n;\n\n for (i = 1; i < elements.length; i++) {\n dropzone = elements[i];\n\n // an element might belong to multiple selector dropzones\n if (!dropzone || dropzone === deepestZone) {\n continue;\n }\n\n if (!deepestZone) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n // check if the deepest or current are document.documentElement or document.rootElement\n // - if the current dropzone is, do nothing and continue\n if (dropzone.parentNode === dropzone.ownerDocument) {\n continue;\n }\n // - if deepest is, update with the current dropzone and continue to next\n else if (deepestZone.parentNode === dropzone.ownerDocument) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n if (!deepestZoneParents.length) {\n parent = deepestZone;\n while (parent.parentNode && parent.parentNode !== parent.ownerDocument) {\n deepestZoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n }\n\n // if this element is an svg element and the current deepest is\n // an HTMLElement\n if (deepestZone instanceof domObjects.HTMLElement\n && dropzone instanceof domObjects.SVGElement\n && !(dropzone instanceof domObjects.SVGSVGElement)) {\n\n if (dropzone === deepestZone.parentNode) {\n continue;\n }\n\n parent = dropzone.ownerSVGElement;\n }\n else {\n parent = dropzone;\n }\n\n dropzoneParents = [];\n\n while (parent.parentNode !== parent.ownerDocument) {\n dropzoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n\n n = 0;\n\n // get (position of last common ancestor) + 1\n while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) {\n n++;\n }\n\n const parents = [\n dropzoneParents[n - 1],\n dropzoneParents[n],\n deepestZoneParents[n],\n ];\n\n child = parents[0].lastChild;\n\n while (child) {\n if (child === parents[1]) {\n deepestZone = dropzone;\n index = i;\n deepestZoneParents = [];\n\n break;\n }\n else if (child === parents[2]) {\n break;\n }\n\n child = child.previousSibling;\n }\n }\n\n return index;\n },\n\n matchesUpTo: function (element, selector, limit) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) {\n return true;\n }\n\n element = domUtils.parentNode(element);\n\n if (element === limit) {\n return domUtils.matchesSelector(element, selector);\n }\n }\n\n return false;\n },\n\n getActualElement: function (element) {\n return (element instanceof domObjects.SVGElementInstance\n ? element.correspondingUseElement\n : element);\n },\n\n getScrollXY: function (relevantWindow) {\n relevantWindow = relevantWindow || win.window;\n return {\n x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft,\n y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop,\n };\n },\n\n getElementClientRect: function (element) {\n const clientRect = (element instanceof domObjects.SVGElement\n ? element.getBoundingClientRect()\n : element.getClientRects()[0]);\n\n return clientRect && {\n left : clientRect.left,\n right : clientRect.right,\n top : clientRect.top,\n bottom: clientRect.bottom,\n width : clientRect.width || clientRect.right - clientRect.left,\n height: clientRect.height || clientRect.bottom - clientRect.top,\n };\n },\n\n getElementRect: function (element) {\n const clientRect = domUtils.getElementClientRect(element);\n\n if (!browser.isIOS7 && clientRect) {\n const scroll = domUtils.getScrollXY(win.getWindow(element));\n\n clientRect.left += scroll.x;\n clientRect.right += scroll.x;\n clientRect.top += scroll.y;\n clientRect.bottom += scroll.y;\n }\n\n return clientRect;\n },\n\n getPath: function (element) {\n const path = [];\n\n while (element) {\n path.push(element);\n element = domUtils.parentNode(element);\n }\n\n return path;\n },\n\n trySelector: value => {\n if (!is.string(value)) { return false; }\n\n // an exception will be raised if it is invalid\n domObjects.document.querySelector(value);\n return true;\n },\n};\n\nmodule.exports = domUtils;\n","const is = require('./is');\nconst domUtils = require('./domUtils');\nconst pExtend = require('./pointerExtend');\n\nconst { window, getWindow } = require('./window');\nconst { indexOf, contains } = require('./arr');\n\nconst useAttachEvent = ('attachEvent' in window) && !('addEventListener' in window);\nconst addEvent = useAttachEvent? 'attachEvent': 'addEventListener';\nconst removeEvent = useAttachEvent? 'detachEvent': 'removeEventListener';\nconst on = useAttachEvent? 'on': '';\n\nconst elements = [];\nconst targets = [];\nconst attachedListeners = [];\n\n// {\n// type: {\n// selectors: ['selector', ...],\n// contexts : [document, ...],\n// listeners: [[listener, capture, passive], ...]\n// }\n// }\nconst delegatedEvents = {};\n\nconst documents = [];\n\nconst supportsOptions = !useAttachEvent && (() => {\n let supported = false;\n\n window.document.createElement('div').addEventListener('test', null, {\n get capture () { supported = true; },\n });\n\n return supported;\n})();\n\nfunction add (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n let elementIndex = indexOf(elements, element);\n let target = targets[elementIndex];\n\n if (!target) {\n target = {\n events: {},\n typeCount: 0,\n };\n\n elementIndex = elements.push(element) - 1;\n targets.push(target);\n\n attachedListeners.push(useAttachEvent\n ? {\n supplied: [],\n wrapped : [],\n useCount: [],\n }\n : null);\n }\n\n if (!target.events[type]) {\n target.events[type] = [];\n target.typeCount++;\n }\n\n if (!contains(target.events[type], listener)) {\n let ret;\n\n if (useAttachEvent) {\n const { supplied, wrapped, useCount } = attachedListeners[elementIndex];\n const listenerIndex = indexOf(supplied, listener);\n\n const wrappedListener = wrapped[listenerIndex] || function (event) {\n if (!event.immediatePropagationStopped) {\n event.target = event.srcElement;\n event.currentTarget = element;\n\n event.preventDefault = event.preventDefault || preventDef;\n event.stopPropagation = event.stopPropagation || stopProp;\n event.stopImmediatePropagation = event.stopImmediatePropagation || stopImmProp;\n\n if (/mouse|click/.test(event.type)) {\n event.pageX = event.clientX + getWindow(element).document.documentElement.scrollLeft;\n event.pageY = event.clientY + getWindow(element).document.documentElement.scrollTop;\n }\n\n listener(event);\n }\n };\n\n ret = element[addEvent](on + type, wrappedListener, !!options.capture);\n\n if (listenerIndex === -1) {\n supplied.push(listener);\n wrapped.push(wrappedListener);\n useCount.push(1);\n }\n else {\n useCount[listenerIndex]++;\n }\n }\n else {\n ret = element[addEvent](type, listener, supportsOptions? options : !!options.capture);\n }\n target.events[type].push(listener);\n\n return ret;\n }\n}\n\nfunction remove (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const elementIndex = indexOf(elements, element);\n const target = targets[elementIndex];\n\n if (!target || !target.events) {\n return;\n }\n\n let wrappedListener = listener;\n let listeners;\n let listenerIndex;\n\n if (useAttachEvent) {\n listeners = attachedListeners[elementIndex];\n listenerIndex = indexOf(listeners.supplied, listener);\n wrappedListener = listeners.wrapped[listenerIndex];\n }\n\n if (type === 'all') {\n for (type in target.events) {\n if (target.events.hasOwnProperty(type)) {\n remove(element, type, 'all');\n }\n }\n return;\n }\n\n if (target.events[type]) {\n const len = target.events[type].length;\n\n if (listener === 'all') {\n for (let i = 0; i < len; i++) {\n remove(element, type, target.events[type][i], options);\n }\n return;\n }\n else {\n for (let i = 0; i < len; i++) {\n if (target.events[type][i] === listener) {\n element[removeEvent](on + type, wrappedListener, supportsOptions? options : !!options.capture);\n target.events[type].splice(i, 1);\n\n if (useAttachEvent && listeners) {\n listeners.useCount[listenerIndex]--;\n if (listeners.useCount[listenerIndex] === 0) {\n listeners.supplied.splice(listenerIndex, 1);\n listeners.wrapped.splice(listenerIndex, 1);\n listeners.useCount.splice(listenerIndex, 1);\n }\n }\n\n break;\n }\n }\n }\n\n if (target.events[type] && target.events[type].length === 0) {\n target.events[type] = null;\n target.typeCount--;\n }\n }\n\n if (!target.typeCount) {\n targets.splice(elementIndex, 1);\n elements.splice(elementIndex, 1);\n attachedListeners.splice(elementIndex, 1);\n }\n}\n\nfunction addDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n if (!delegatedEvents[type]) {\n delegatedEvents[type] = {\n selectors: [],\n contexts : [],\n listeners: [],\n };\n\n // add delegate listener functions\n for (let i = 0; i < documents.length; i++) {\n add(documents[i], type, delegateListener);\n add(documents[i], type, delegateUseCapture, true);\n }\n }\n\n const delegated = delegatedEvents[type];\n let index;\n\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n break;\n }\n }\n\n if (index === -1) {\n index = delegated.selectors.length;\n\n delegated.selectors.push(selector);\n delegated.contexts .push(context);\n delegated.listeners.push([]);\n }\n\n // keep listener and capture and passive flags\n delegated.listeners[index].push([listener, !!options.capture, options.passive]);\n}\n\nfunction removeDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const delegated = delegatedEvents[type];\n let matchFound = false;\n let index;\n\n if (!delegated) { return; }\n\n // count from last index of delegated to 0\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n // look for matching selector and context Node\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n\n const listeners = delegated.listeners[index];\n\n // each item of the listeners array is an array: [function, capture, passive]\n for (let i = listeners.length - 1; i >= 0; i--) {\n const [fn, capture, passive] = listeners[i];\n\n // check if the listener functions and capture and passive flags match\n if (fn === listener && capture === !!options.capture && passive === options.passive) {\n // remove the listener from the array of listeners\n listeners.splice(i, 1);\n\n // if all listeners for this interactable have been removed\n // remove the interactable from the delegated arrays\n if (!listeners.length) {\n delegated.selectors.splice(index, 1);\n delegated.contexts .splice(index, 1);\n delegated.listeners.splice(index, 1);\n\n // remove delegate function from context\n remove(context, type, delegateListener);\n remove(context, type, delegateUseCapture, true);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegatedEvents[type] = null;\n }\n }\n\n // only remove one listener\n matchFound = true;\n break;\n }\n }\n\n if (matchFound) { break; }\n }\n }\n}\n\n// bound to the interactable context when a DOM event\n// listener is added to a selector interactable\nfunction delegateListener (event, optionalArg) {\n const options = getOptions(optionalArg);\n const fakeEvent = {};\n const delegated = delegatedEvents[event.type];\n const eventTarget = (domUtils.getActualElement(event.path\n ? event.path[0]\n : event.target));\n let element = eventTarget;\n\n // duplicate the event so that currentTarget can be changed\n pExtend(fakeEvent, event);\n\n fakeEvent.originalEvent = event;\n fakeEvent.preventDefault = preventOriginalDefault;\n\n // climb up document tree looking for selector matches\n while (is.element(element)) {\n for (let i = 0; i < delegated.selectors.length; i++) {\n const selector = delegated.selectors[i];\n const context = delegated.contexts[i];\n\n if (domUtils.matchesSelector(element, selector)\n && domUtils.nodeContains(context, eventTarget)\n && domUtils.nodeContains(context, element)) {\n\n const listeners = delegated.listeners[i];\n\n fakeEvent.currentTarget = element;\n\n for (let j = 0; j < listeners.length; j++) {\n const [fn, capture, passive] = listeners[j];\n\n if (capture === !!options.capture && passive === options.passive) {\n fn(fakeEvent);\n }\n }\n }\n }\n\n element = domUtils.parentNode(element);\n }\n}\n\nfunction delegateUseCapture (event) {\n return delegateListener.call(this, event, true);\n}\n\nfunction preventDef () {\n this.returnValue = false;\n}\n\nfunction preventOriginalDefault () {\n this.originalEvent.preventDefault();\n}\n\nfunction stopProp () {\n this.cancelBubble = true;\n}\n\nfunction stopImmProp () {\n this.cancelBubble = true;\n this.immediatePropagationStopped = true;\n}\n\nfunction getOptions (param) {\n return is.object(param)? param : { capture: param };\n}\n\nmodule.exports = {\n add,\n remove,\n\n addDelegate,\n removeDelegate,\n\n delegateListener,\n delegateUseCapture,\n delegatedEvents,\n documents,\n\n useAttachEvent,\n supportsOptions,\n\n _elements: elements,\n _targets: targets,\n _attachedListeners: attachedListeners,\n};\n","module.exports = function extend (dest, source) {\n for (const prop in source) {\n dest[prop] = source[prop];\n }\n return dest;\n};\n","const {\n resolveRectLike,\n rectToXY,\n} = require('./rect');\n\nmodule.exports = function (target, element, action) {\n const actionOptions = target.options[action];\n const actionOrigin = actionOptions && actionOptions.origin;\n const origin = actionOrigin || target.options.origin;\n\n const originRect = resolveRectLike(origin, target, element, [target && element]);\n\n return rectToXY(originRect) || { x: 0, y: 0 };\n};\n","module.exports = (x, y) => Math.sqrt(x * x + y * y);\n","const extend = require('./extend');\nconst win = require('./window');\n\nconst utils = {\n warnOnce: function (method, message) {\n let warned = false;\n\n return function () {\n if (!warned) {\n win.window.console.warn(message);\n warned = true;\n }\n\n return method.apply(this, arguments);\n };\n },\n\n // http://stackoverflow.com/a/5634528/2280888\n _getQBezierValue: function (t, p1, p2, p3) {\n const iT = 1 - t;\n return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3;\n },\n\n getQuadraticCurvePoint: function (startX, startY, cpX, cpY, endX, endY, position) {\n return {\n x: utils._getQBezierValue(position, startX, cpX, endX),\n y: utils._getQBezierValue(position, startY, cpY, endY),\n };\n },\n\n // http://gizma.com/easing/\n easeOutQuad: function (t, b, c, d) {\n t /= d;\n return -c * t*(t-2) + b;\n },\n\n copyAction: function (dest, src) {\n dest.name = src.name;\n dest.axis = src.axis;\n dest.edges = src.edges;\n\n return dest;\n },\n\n is : require('./is'),\n extend : extend,\n hypot : require('./hypot'),\n getOriginXY: require('./getOriginXY'),\n};\n\nextend(utils, require('./arr'));\nextend(utils, require('./domUtils'));\nextend(utils, require('./pointerUtils'));\nextend(utils, require('./rect'));\n\nmodule.exports = utils;\n","const scope = require('../scope');\nconst utils = require('./index');\nconst browser = require('./browser');\n\nconst finder = {\n methodOrder: [ 'simulationResume', 'mouse', 'hasPointer', 'idle' ],\n\n search: function (pointer, eventType, eventTarget) {\n const mouseEvent = (/mouse/i.test(pointer.pointerType || eventType)\n // MSPointerEvent.MSPOINTER_TYPE_MOUSE\n || pointer.pointerType === 4);\n const pointerId = utils.getPointerId(pointer);\n const details = { pointer, pointerId, mouseEvent, eventType, eventTarget };\n\n for (const method of finder.methodOrder) {\n const interaction = finder[method](details);\n\n if (interaction) {\n return interaction;\n }\n }\n },\n\n // try to resume simulation with a new pointer\n simulationResume: function ({ mouseEvent, eventType, eventTarget }) {\n if (!/down|start/i.test(eventType)) {\n return null;\n }\n\n for (const interaction of scope.interactions) {\n let element = eventTarget;\n\n if (interaction.simulation && interaction.simulation.allowResume\n && (interaction.mouse === mouseEvent)) {\n while (element) {\n // if the element is the interaction element\n if (element === interaction.element) {\n return interaction;\n }\n element = utils.parentNode(element);\n }\n }\n }\n\n return null;\n },\n\n // if it's a mouse interaction\n mouse: function ({ pointerId, mouseEvent, eventType }) {\n if (!mouseEvent && (browser.supportsTouch || browser.supportsPointerEvent)) {\n return null;\n }\n\n let firstNonActive;\n\n for (const interaction of scope.interactions) {\n if (interaction.mouse) {\n // if it's a down event, skip interactions with running simulations\n if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; }\n\n // if the interaction is active, return it immediately\n if (interaction.interacting()) {\n return interaction;\n }\n // otherwise save it and look for another active interaction\n else if (!firstNonActive) {\n firstNonActive = interaction;\n }\n }\n }\n\n // if no active mouse interaction was found use the first inactive mouse\n // interaction\n if (firstNonActive) {\n return firstNonActive;\n }\n\n // Find any interaction specifically for mouse.\n // ignore the interaction if the eventType is a mousedown, and a simulation\n // is active\n for (const interaction of scope.interactions) {\n if (interaction.mouse && !(/down/.test(eventType) && interaction.simulation)) {\n return interaction;\n }\n }\n\n return null;\n },\n\n // get interaction that has this pointer\n hasPointer: function ({ pointerId }) {\n for (const interaction of scope.interactions) {\n if (utils.contains(interaction.pointerIds, pointerId)) {\n return interaction;\n }\n }\n },\n\n // get first idle interaction\n idle: function ({ mouseEvent }) {\n for (const interaction of scope.interactions) {\n // if there's already a pointer held down\n if (interaction.pointerIds.length === 1) {\n const target = interaction.target;\n // don't add this pointer if there is a target interactable and it\n // isn't gesturable\n if (target && !target.options.gesture.enabled) {\n continue;\n }\n }\n // maximum of 2 pointers per interaction\n else if (interaction.pointerIds.length >= 2) {\n continue;\n }\n\n if (!interaction.interacting() && (mouseEvent === interaction.mouse)) {\n return interaction;\n }\n }\n\n return null;\n },\n};\n\nmodule.exports = finder;\n","const win = require('./window');\nconst isWindow = require('./isWindow');\n\nconst is = {\n array : () => {},\n\n window : thing => thing === win.window || isWindow(thing),\n\n docFrag : thing => is.object(thing) && thing.nodeType === 11,\n\n object : thing => !!thing && (typeof thing === 'object'),\n\n function: thing => typeof thing === 'function',\n\n number : thing => typeof thing === 'number' ,\n\n bool : thing => typeof thing === 'boolean' ,\n\n string : thing => typeof thing === 'string' ,\n\n element: thing => {\n if (!thing || (typeof thing !== 'object')) { return false; }\n\n const _window = win.getWindow(thing) || win.window;\n\n return (/object|function/.test(typeof _window.Element)\n ? thing instanceof _window.Element //DOM2\n : thing.nodeType === 1 && typeof thing.nodeName === 'string');\n },\n};\n\nis.array = thing => (is.object(thing)\n && (typeof thing.length !== 'undefined')\n && is.function(thing.splice));\n\nmodule.exports = is;\n","module.exports = (thing) => !!(thing && thing.Window) && (thing instanceof thing.Window);\n","function pointerExtend (dest, source) {\n for (const prop in source) {\n const prefixedPropREs = module.exports.prefixedPropREs;\n let deprecated = false;\n\n // skip deprecated prefixed properties\n for (const vendor in prefixedPropREs) {\n if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) {\n deprecated = true;\n break;\n }\n }\n\n if (!deprecated && typeof source[prop] !== 'function') {\n dest[prop] = source[prop];\n }\n }\n return dest;\n}\n\npointerExtend.prefixedPropREs = {\n webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/,\n};\n\nmodule.exports = pointerExtend;\n","const hypot = require('./hypot');\nconst browser = require('./browser');\nconst dom = require('./domObjects');\nconst domUtils = require('./domUtils');\nconst is = require('./is');\nconst pointerExtend = require('./pointerExtend');\n\nconst pointerUtils = {\n copyCoords: function (dest, src) {\n dest.page = dest.page || {};\n dest.page.x = src.page.x;\n dest.page.y = src.page.y;\n\n dest.client = dest.client || {};\n dest.client.x = src.client.x;\n dest.client.y = src.client.y;\n\n dest.timeStamp = src.timeStamp;\n },\n\n setCoordDeltas: function (targetObj, prev, cur) {\n targetObj.page.x = cur.page.x - prev.page.x;\n targetObj.page.y = cur.page.y - prev.page.y;\n targetObj.client.x = cur.client.x - prev.client.x;\n targetObj.client.y = cur.client.y - prev.client.y;\n targetObj.timeStamp = cur.timeStamp - prev.timeStamp;\n\n // set pointer velocity\n const dt = Math.max(targetObj.timeStamp / 1000, 0.001);\n\n targetObj.page.speed = hypot(targetObj.page.x, targetObj.page.y) / dt;\n targetObj.page.vx = targetObj.page.x / dt;\n targetObj.page.vy = targetObj.page.y / dt;\n\n targetObj.client.speed = hypot(targetObj.client.x, targetObj.page.y) / dt;\n targetObj.client.vx = targetObj.client.x / dt;\n targetObj.client.vy = targetObj.client.y / dt;\n },\n\n isNativePointer: function (pointer) {\n return (pointer instanceof dom.Event || pointer instanceof dom.Touch);\n },\n\n // Get specified X/Y coords for mouse or event.touches[0]\n getXY: function (type, pointer, xy) {\n xy = xy || {};\n type = type || 'page';\n\n xy.x = pointer[type + 'X'];\n xy.y = pointer[type + 'Y'];\n\n return xy;\n },\n\n getPageXY: function (pointer, page) {\n page = page || {};\n\n // Opera Mobile handles the viewport and scrolling oddly\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n pointerUtils.getXY('screen', pointer, page);\n\n page.x += window.scrollX;\n page.y += window.scrollY;\n }\n else {\n pointerUtils.getXY('page', pointer, page);\n }\n\n return page;\n },\n\n getClientXY: function (pointer, client) {\n client = client || {};\n\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n // Opera Mobile handles the viewport and scrolling oddly\n pointerUtils.getXY('screen', pointer, client);\n }\n else {\n pointerUtils.getXY('client', pointer, client);\n }\n\n return client;\n },\n\n getPointerId: function (pointer) {\n return is.number(pointer.pointerId)? pointer.pointerId : pointer.identifier;\n },\n\n setCoords: function (targetObj, pointers, timeStamp) {\n const pointer = (pointers.length > 1\n ? pointerUtils.pointerAverage(pointers)\n : pointers[0]);\n\n const tmpXY = {};\n\n pointerUtils.getPageXY(pointer, tmpXY);\n targetObj.page.x = tmpXY.x;\n targetObj.page.y = tmpXY.y;\n\n pointerUtils.getClientXY(pointer, tmpXY);\n targetObj.client.x = tmpXY.x;\n targetObj.client.y = tmpXY.y;\n\n targetObj.timeStamp = is.number(timeStamp) ? timeStamp :new Date().getTime();\n },\n\n pointerExtend: pointerExtend,\n\n getTouchPair: function (event) {\n const touches = [];\n\n // array of touches is supplied\n if (is.array(event)) {\n touches[0] = event[0];\n touches[1] = event[1];\n }\n // an event\n else {\n if (event.type === 'touchend') {\n if (event.touches.length === 1) {\n touches[0] = event.touches[0];\n touches[1] = event.changedTouches[0];\n }\n else if (event.touches.length === 0) {\n touches[0] = event.changedTouches[0];\n touches[1] = event.changedTouches[1];\n }\n }\n else {\n touches[0] = event.touches[0];\n touches[1] = event.touches[1];\n }\n }\n\n return touches;\n },\n\n pointerAverage: function (pointers) {\n const average = {\n pageX : 0,\n pageY : 0,\n clientX: 0,\n clientY: 0,\n screenX: 0,\n screenY: 0,\n };\n\n for (const pointer of pointers) {\n for (const prop in average) {\n average[prop] += pointer[prop];\n }\n }\n for (const prop in average) {\n average[prop] /= pointers.length;\n }\n\n return average;\n },\n\n touchBBox: function (event) {\n if (!event.length && !(event.touches && event.touches.length > 1)) {\n return;\n }\n\n const touches = pointerUtils.getTouchPair(event);\n const minX = Math.min(touches[0].pageX, touches[1].pageX);\n const minY = Math.min(touches[0].pageY, touches[1].pageY);\n const maxX = Math.max(touches[0].pageX, touches[1].pageX);\n const maxY = Math.max(touches[0].pageY, touches[1].pageY);\n\n return {\n x: minX,\n y: minY,\n left: minX,\n top: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n },\n\n touchDistance: function (event, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n\n\n const dx = touches[0][sourceX] - touches[1][sourceX];\n const dy = touches[0][sourceY] - touches[1][sourceY];\n\n return hypot(dx, dy);\n },\n\n touchAngle: function (event, prevAngle, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n const dx = touches[1][sourceX] - touches[0][sourceX];\n const dy = touches[1][sourceY] - touches[0][sourceY];\n const angle = 180 * Math.atan2(dy , dx) / Math.PI;\n\n return angle;\n },\n\n getPointerType: function (pointer, interaction) {\n // if the PointerEvent API isn't available, then the pointer must be ither\n // a MouseEvent or TouchEvent\n if (interaction.mouse) { return 'mouse'; }\n if (!browser.supportsPointerEvent) { return 'touch'; }\n\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : [undefined, undefined,'touch', 'pen', 'mouse'][pointer.pointerType];\n },\n\n // [ event.target, event.currentTarget ]\n getEventTargets: function (event) {\n return [\n domUtils.getActualElement(event.path ? event.path[0] : event.target),\n domUtils.getActualElement(event.currentTarget),\n ];\n },\n};\n\nmodule.exports = pointerUtils;\n","const { window } = require('./window');\n\nconst vendors = ['ms', 'moz', 'webkit', 'o'];\nlet lastTime = 0;\nlet request;\nlet cancel;\n\nfor (let x = 0; x < vendors.length && !window.requestAnimationFrame; x++) {\n request = window[vendors[x] + 'RequestAnimationFrame'];\n cancel = window[vendors[x] +'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n}\n\nif (!request) {\n request = function (callback) {\n const currTime = new Date().getTime();\n const timeToCall = Math.max(0, 16 - (currTime - lastTime));\n const id = setTimeout(function () { callback(currTime + timeToCall); },\n timeToCall);\n\n lastTime = currTime + timeToCall;\n return id;\n };\n}\n\nif (!cancel) {\n cancel = function (id) {\n clearTimeout(id);\n };\n}\n\nmodule.exports = {\n request,\n cancel,\n};\n","const extend = require('./extend');\nconst is = require('./is');\nconst {\n closest,\n parentNode,\n getElementRect,\n} = require('./domUtils');\n\nconst rectUtils = {\n getStringOptionResult: function (value, interactable, element) {\n if (!is.string(value)) {\n return null;\n }\n\n if (value === 'parent') {\n value = parentNode(element);\n }\n else if (value === 'self') {\n value = interactable.getRect(element);\n }\n else {\n value = closest(element, value);\n }\n\n return value;\n },\n\n resolveRectLike: function (value, interactable, element, functionArgs) {\n value = rectUtils.getStringOptionResult(value, interactable, element) || value;\n\n if (is.function(value)) {\n value = value.apply(null, functionArgs);\n }\n\n if (is.element(value)) {\n value = getElementRect(value);\n }\n\n return value;\n },\n\n rectToXY: function (rect) {\n return rect && {\n x: 'x' in rect ? rect.x : rect.left,\n y: 'y' in rect ? rect.y : rect.top,\n };\n },\n\n xywhToTlbr: function (rect) {\n if (rect && !('left' in rect && 'top' in rect)) {\n rect = extend({}, rect);\n\n rect.left = rect.x || 0;\n rect.top = rect.y || 0;\n rect.right = rect.right || (rect.left + rect.width);\n rect.bottom = rect.bottom || (rect.top + rect.height);\n }\n\n return rect;\n },\n\n tlbrToXywh: function (rect) {\n if (rect && !('x' in rect && 'y' in rect)) {\n rect = extend({}, rect);\n\n rect.x = rect.left || 0;\n rect.top = rect.top || 0;\n rect.width = rect.width || (rect.right - rect.x);\n rect.height = rect.height || (rect.bottom - rect.y);\n }\n\n return rect;\n },\n};\n\nmodule.exports = rectUtils;\n","const win = module.exports;\nconst isWindow = require('./isWindow');\n\nfunction init (window) {\n // get wrapped window if using Shadow DOM polyfill\n\n win.realWindow = window;\n\n // create a TextNode\n const el = window.document.createTextNode('');\n\n // check if it's wrapped by a polyfill\n if (el.ownerDocument !== window.document\n && typeof window.wrap === 'function'\n && window.wrap(el) === el) {\n // use wrapped window\n window = window.wrap(window);\n }\n\n win.window = window;\n}\n\nif (typeof window === 'undefined') {\n win.window = undefined;\n win.realWindow = undefined;\n}\nelse {\n init(window);\n}\n\nwin.getWindow = function getWindow (node) {\n if (isWindow(node)) {\n return node;\n }\n\n const rootNode = (node.ownerDocument || node);\n\n return rootNode.defaultView || rootNode.parentWindow || win.window;\n};\n\nwin.init = init;\n"]} \ No newline at end of file +{"version":3,"sources":["src/header.js","node_modules/browser-pack/_prelude.js","index.js","src/Eventable.js","src/InteractEvent.js","src/Interactable.js","src/Interaction.js","src/actions/base.js","src/actions/drag.js","src/actions/drop.js","src/actions/gesture.js","src/actions/resize.js","src/autoScroll.js","src/autoStart/InteractableMethods.js","src/autoStart/base.js","src/autoStart/delay.js","src/autoStart/drag.js","src/autoStart/gesture.js","src/autoStart/resize.js","src/defaultOptions.js","src/index.js","src/inertia.js","src/interact.js","src/interactablePreventDefault.js","src/legacyBrowsers.js","src/modifiers/index.js","src/modifiers/restrict.js","src/modifiers/restrictEdges.js","src/modifiers/restrictSize.js","src/modifiers/snap.js","src/modifiers/snapSize.js","src/pointerEvents/PointerEvent.js","src/pointerEvents/base.js","src/pointerEvents/holdRepeat.js","src/pointerEvents/interactableTargets.js","src/scope.js","src/utils/Signals.js","src/utils/arr.js","src/utils/browser.js","src/utils/domObjects.js","src/utils/domUtils.js","src/utils/events.js","src/utils/extend.js","src/utils/getOriginXY.js","src/utils/hypot.js","src/utils/index.js","src/utils/interactionFinder.js","src/utils/is.js","src/utils/isWindow.js","src/utils/pointerExtend.js","src/utils/pointerUtils.js","src/utils/raf.js","src/utils/rect.js","src/utils/window.js"],"names":[],"mappings":"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","file":"interact.js","sourceRoot":"","sourcesContent":["/**\n * interact.js v1.3.0-alpha.4+sha.7970416-dirty\n *\n * Copyright (c) 2012-2017 Taye Adeyemi \n * Open source under the MIT License.\n * https://raw.github.com/taye/interact.js/master/LICENSE\n */\n","(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o 150) {\n return null;\n }\n\n let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI;\n const overlap = 22.5;\n\n if (angle < 0) {\n angle += 360;\n }\n\n const left = 135 - overlap <= angle && angle < 225 + overlap;\n const up = 225 - overlap <= angle && angle < 315 + overlap;\n\n const right = !left && (315 - overlap <= angle || angle < 45 + overlap);\n const down = !up && 45 - overlap <= angle && angle < 135 + overlap;\n\n return {\n up,\n down,\n left,\n right,\n angle,\n speed: interaction.prevEvent.speed,\n velocity: {\n x: interaction.prevEvent.velocityX,\n y: interaction.prevEvent.velocityY,\n },\n };\n }\n\n preventDefault () {}\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n}\n\nsignals.on('set-delta', function ({ iEvent, interaction, starting, deltaSource }) {\n const prevEvent = starting? iEvent : interaction.prevEvent;\n\n if (deltaSource === 'client') {\n iEvent.dx = iEvent.clientX - prevEvent.clientX;\n iEvent.dy = iEvent.clientY - prevEvent.clientY;\n }\n else {\n iEvent.dx = iEvent.pageX - prevEvent.pageX;\n iEvent.dy = iEvent.pageY - prevEvent.pageY;\n }\n});\n\nInteractEvent.signals = signals;\n\nmodule.exports = InteractEvent;\n","const is = require('./utils/is');\nconst events = require('./utils/events');\nconst extend = require('./utils/extend');\nconst actions = require('./actions/base');\nconst scope = require('./scope');\nconst Eventable = require('./Eventable');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nconst {\n getElementRect,\n nodeContains,\n trySelector,\n} = require('./utils/domUtils');\nconst { getWindow } = require('./utils/window');\nconst { indexOf, contains } = require('./utils/arr');\nconst { wheelEvent } = require('./utils/browser');\n\n// all set interactables\nscope.interactables = [];\n\n/*\\\n * Interactable\n [ property ]\n **\n * Object type returned by @interact\n\\*/\nclass Interactable {\n constructor (target, options) {\n options = options || {};\n\n this.target = target;\n this.events = new Eventable();\n this._context = options.context || scope.document;\n this._win = getWindow(trySelector(target)? this._context : target);\n this._doc = this._win.document;\n\n signals.fire('new', {\n target,\n options,\n interactable: this,\n win: this._win,\n });\n\n scope.addDocument( this._doc, this._win );\n\n scope.interactables.push(this);\n\n this.set(options);\n }\n\n setOnEvents (action, phases) {\n const onAction = 'on' + action;\n\n if (is.function(phases.onstart) ) { this.events[onAction + 'start' ] = phases.onstart ; }\n if (is.function(phases.onmove) ) { this.events[onAction + 'move' ] = phases.onmove ; }\n if (is.function(phases.onend) ) { this.events[onAction + 'end' ] = phases.onend ; }\n if (is.function(phases.oninertiastart)) { this.events[onAction + 'inertiastart' ] = phases.oninertiastart ; }\n\n return this;\n }\n\n setPerAction (action, options) {\n // for all the default per-action options\n for (const option in options) {\n // if this option exists for this action\n if (option in defaults[action]) {\n // if the option in the options arg is an object value\n if (is.object(options[option])) {\n // duplicate the object\n this.options[action][option] = extend(this.options[action][option] || {}, options[option]);\n\n if (is.object(defaults.perAction[option]) && 'enabled' in defaults.perAction[option]) {\n this.options[action][option].enabled = options[option].enabled === false? false : true;\n }\n }\n else if (is.bool(options[option]) && is.object(defaults.perAction[option])) {\n this.options[action][option].enabled = options[option];\n }\n else if (options[option] !== undefined) {\n // or if it's not undefined, do a plain assignment\n this.options[action][option] = options[option];\n }\n }\n }\n }\n\n /*\\\n * Interactable.getRect\n [ method ]\n *\n * The default function to get an Interactables bounding rect. Can be\n * overridden using @Interactable.rectChecker.\n *\n - element (Element) #optional The element to measure.\n = (object) The object's bounding rectangle.\n o {\n o top : 0,\n o left : 0,\n o bottom: 0,\n o right : 0,\n o width : 0,\n o height: 0\n o }\n \\*/\n getRect (element) {\n element = element || this.target;\n\n if (is.string(this.target) && !(is.element(element))) {\n element = this._context.querySelector(this.target);\n }\n\n return getElementRect(element);\n }\n\n /*\\\n * Interactable.rectChecker\n [ method ]\n *\n * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n - checker (function) #optional A function which returns this Interactable's bounding rectangle. See @Interactable.getRect\n = (function | object) The checker function or this Interactable\n \\*/\n rectChecker (checker) {\n if (is.function(checker)) {\n this.getRect = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.getRect;\n\n return this;\n }\n\n return this.getRect;\n }\n\n _backCompatOption (optionName, newValue) {\n if (trySelector(newValue) || is.object(newValue)) {\n this.options[optionName] = newValue;\n\n for (const action of actions.names) {\n this.options[action][optionName] = newValue;\n }\n\n return this;\n }\n\n return this.options[optionName];\n }\n\n /*\\\n * Interactable.origin\n [ method ]\n *\n * Gets or sets the origin of the Interactable's element. The x and y\n * of the origin will be subtracted from action event coordinates.\n *\n - origin (object | string) #optional An object eg. { x: 0, y: 0 } or string 'parent', 'self' or any CSS selector\n * OR\n - origin (Element) #optional An HTML or SVG Element whose rect will be used\n **\n = (object) The current origin or this Interactable\n \\*/\n origin (newValue) {\n return this._backCompatOption('origin', newValue);\n }\n\n /*\\\n * Interactable.deltaSource\n [ method ]\n *\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n - newValue (string) #optional Use 'client' if you will be scrolling while interacting; Use 'page' if you want autoScroll to work\n = (string | object) The current deltaSource or this Interactable\n \\*/\n deltaSource (newValue) {\n if (newValue === 'page' || newValue === 'client') {\n this.options.deltaSource = newValue;\n\n return this;\n }\n\n return this.options.deltaSource;\n }\n\n /*\\\n * Interactable.context\n [ method ]\n *\n * Gets the selector context Node of the Interactable. The default is `window.document`.\n *\n = (Node) The context Node of this Interactable\n **\n \\*/\n context () {\n return this._context;\n }\n\n inContext (element) {\n return (this._context === element.ownerDocument\n || nodeContains(this._context, element));\n }\n\n /*\\\n * Interactable.fire\n [ method ]\n *\n * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n - iEvent (InteractEvent) The InteractEvent object to be fired on this Interactable\n = (Interactable) this Interactable\n \\*/\n fire (iEvent) {\n this.events.fire(iEvent);\n\n return this;\n }\n\n _onOffMultiple (method, eventType, listener, options) {\n if (is.string(eventType) && eventType.search(' ') !== -1) {\n eventType = eventType.trim().split(/ +/);\n }\n\n if (is.array(eventType)) {\n for (let i = 0; i < eventType.length; i++) {\n this[method](eventType[i], listener, options);\n }\n\n return true;\n }\n\n if (is.object(eventType)) {\n for (const prop in eventType) {\n this[method](prop, eventType[prop], listener);\n }\n\n return true;\n }\n }\n\n /*\\\n * Interactable.on\n [ method ]\n *\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n - eventType (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) This Interactable\n \\*/\n on (eventType, listener, options) {\n if (this._onOffMultiple('on', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.on(eventType, listener);\n }\n // delegated event for selector\n else if (is.string(this.target)) {\n events.addDelegate(this.target, this._context, eventType, listener, options);\n }\n else {\n events.add(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.off\n [ method ]\n *\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n - eventType (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) This Interactable\n \\*/\n off (eventType, listener, options) {\n if (this._onOffMultiple('off', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n // if it is an action event type\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.off(eventType, listener);\n }\n // delegated event\n else if (is.string(this.target)) {\n events.removeDelegate(this.target, this._context, eventType, listener, options);\n }\n // remove listener from this Interatable's element\n else {\n events.remove(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.set\n [ method ]\n *\n * Reset the options of this Interactable\n - options (object) The new settings to apply\n = (object) This Interactable\n \\*/\n set (options) {\n if (!is.object(options)) {\n options = {};\n }\n\n this.options = extend({}, defaults.base);\n\n const perActions = extend({}, defaults.perAction);\n\n for (const actionName in actions.methodDict) {\n const methodName = actions.methodDict[actionName];\n\n this.options[actionName] = extend({}, defaults[actionName]);\n\n this.setPerAction(actionName, perActions);\n\n this[methodName](options[actionName]);\n }\n\n for (const setting of Interactable.settingsMethods) {\n this.options[setting] = defaults.base[setting];\n\n if (setting in options) {\n this[setting](options[setting]);\n }\n }\n\n signals.fire('set', {\n options,\n interactable: this,\n });\n\n return this;\n }\n\n /*\\\n * Interactable.unset\n [ method ]\n *\n * Remove this interactable from the list of interactables and remove\n * it's action capabilities and event listeners\n *\n = (object) @interact\n \\*/\n unset () {\n events.remove(this.target, 'all');\n\n if (is.string(this.target)) {\n // remove delegated events\n for (const type in events.delegatedEvents) {\n const delegated = events.delegatedEvents[type];\n\n if (delegated.selectors[0] === this.target\n && delegated.contexts[0] === this._context) {\n\n delegated.selectors.splice(0, 1);\n delegated.contexts .splice(0, 1);\n delegated.listeners.splice(0, 1);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegated[type] = null;\n }\n }\n\n events.remove(this._context, type, events.delegateListener);\n events.remove(this._context, type, events.delegateUseCapture, true);\n }\n }\n else {\n events.remove(this, 'all');\n }\n\n signals.fire('unset', { interactable: this });\n\n scope.interactables.splice(indexOf(scope.interactables, this), 1);\n\n // Stop related interactions when an Interactable is unset\n for (const interaction of scope.interactions || []) {\n if (interaction.target === this && interaction.interacting()) {\n interaction.stop();\n }\n }\n\n return scope.interact;\n }\n}\n\nscope.interactables.indexOfElement = function indexOfElement (target, context) {\n context = context || scope.document;\n\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n if (interactable.target === target && interactable._context === context) {\n return i;\n }\n }\n return -1;\n};\n\nscope.interactables.get = function interactableGet (element, options, dontCheckInContext) {\n const ret = this[this.indexOfElement(element, options && options.context)];\n\n return ret && (is.string(element) || dontCheckInContext || ret.inContext(element))? ret : null;\n};\n\nscope.interactables.forEachSelector = function (callback, element) {\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n // skip non CSS selector targets and out of context elements\n if (!is.string(interactable.target)\n || (element && !interactable.inContext(element))) {\n continue;\n }\n\n const ret = callback(interactable, interactable.target, interactable._context, i, this);\n\n if (ret !== undefined) {\n return ret;\n }\n }\n};\n\n// all interact.js eventTypes\nInteractable.eventTypes = scope.eventTypes = [];\n\nInteractable.signals = signals;\n\nInteractable.settingsMethods = [ 'deltaSource', 'origin', 'preventDefault', 'rectChecker' ];\n\nmodule.exports = Interactable;\n","const scope = require('./scope');\nconst utils = require('./utils');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst domObjects = require('./utils/domObjects');\nconst finder = require('./utils/interactionFinder');\nconst signals = require('./utils/Signals').new();\n\nconst listeners = {};\nconst methodNames = [\n 'pointerDown', 'pointerMove', 'pointerUp',\n 'updatePointer', 'removePointer',\n];\n\n// for ignoring browser's simulated mouse events\nlet prevTouchTime = 0;\n\n// all active and idle interactions\nscope.interactions = [];\n\nclass Interaction {\n constructor ({ pointerType }) {\n this.target = null; // current interactable being interacted with\n this.element = null; // the target element of the interactable\n\n this.prepared = { // action that's ready to be fired on next move event\n name : null,\n axis : null,\n edges: null,\n };\n\n // keep track of added pointers\n this.pointers = [];\n this.pointerIds = [];\n this.downTargets = [];\n this.downTimes = [];\n\n // Previous native pointer move event coordinates\n this.prevCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n // current native pointer move event coordinates\n this.curCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Starting InteractEvent pointer coordinates\n this.startCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Change in coordinates and time of the pointer\n this.pointerDelta = {\n page : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n client : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n timeStamp: 0,\n };\n\n this.downEvent = null; // pointerdown/mousedown/touchstart event\n this.downPointer = {};\n\n this._eventTarget = null;\n this._curEventTarget = null;\n\n this.prevEvent = null; // previous action event\n\n this.pointerIsDown = false;\n this.pointerWasMoved = false;\n this._interacting = false;\n\n this.pointerType = pointerType;\n\n signals.fire('new', this);\n\n scope.interactions.push(this);\n }\n\n pointerDown (pointer, event, eventTarget) {\n const pointerIndex = this.updatePointer(pointer, event, true);\n\n signals.fire('down', {\n pointer,\n event,\n eventTarget,\n pointerIndex,\n interaction: this,\n });\n }\n\n /*\\\n * Interaction.start\n [ method ]\n *\n * Start an action with the given Interactable and Element as tartgets. The\n * action must be enabled for the target Interactable and an appropriate number\n * of pointers must be held down - 1 for drag/resize, 2 for gesture.\n *\n * Use it with `interactable.able({ manualStart: false })` to always\n * [start actions manually](https://github.com/taye/interact.js/issues/114)\n *\n - action (object) The action to be performed - drag, resize, etc.\n - target (Interactable) The Interactable to target\n - element (Element) The DOM Element to target\n = (object) interact\n **\n | interact(target)\n | .draggable({\n | // disable the default drag start by down->move\n | manualStart: true\n | })\n | // start dragging after the user holds the pointer down\n | .on('hold', function (event) {\n | var interaction = event.interaction;\n |\n | if (!interaction.interacting()) {\n | interaction.start({ name: 'drag' },\n | event.interactable,\n | event.currentTarget);\n | }\n | });\n \\*/\n start (action, target, element) {\n if (this.interacting()\n || !this.pointerIsDown\n || this.pointerIds.length < (action.name === 'gesture'? 2 : 1)) {\n return;\n }\n\n // if this interaction had been removed after stopping\n // add it back\n if (utils.indexOf(scope.interactions, this) === -1) {\n scope.interactions.push(this);\n }\n\n utils.copyAction(this.prepared, action);\n this.target = target;\n this.element = element;\n\n signals.fire('action-start', {\n interaction: this,\n event: this.downEvent,\n });\n }\n\n pointerMove (pointer, event, eventTarget) {\n if (!this.simulation) {\n this.updatePointer(pointer);\n utils.setCoords(this.curCoords, this.pointers);\n }\n\n const duplicateMove = (this.curCoords.page.x === this.prevCoords.page.x\n && this.curCoords.page.y === this.prevCoords.page.y\n && this.curCoords.client.x === this.prevCoords.client.x\n && this.curCoords.client.y === this.prevCoords.client.y);\n\n let dx;\n let dy;\n\n // register movement greater than pointerMoveTolerance\n if (this.pointerIsDown && !this.pointerWasMoved) {\n dx = this.curCoords.client.x - this.startCoords.client.x;\n dy = this.curCoords.client.y - this.startCoords.client.y;\n\n this.pointerWasMoved = utils.hypot(dx, dy) > Interaction.pointerMoveTolerance;\n }\n\n const signalArg = {\n pointer,\n pointerIndex: this.getPointerIndex(pointer),\n event,\n eventTarget,\n dx,\n dy,\n duplicate: duplicateMove,\n interaction: this,\n interactingBeforeMove: this.interacting(),\n };\n\n if (!duplicateMove) {\n // set pointer coordinate, time changes and speeds\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n }\n\n signals.fire('move', signalArg);\n\n if (!duplicateMove) {\n // if interacting, fire an 'action-move' signal etc\n if (this.interacting()) {\n this.doMove(signalArg);\n }\n\n if (this.pointerWasMoved) {\n utils.copyCoords(this.prevCoords, this.curCoords);\n }\n }\n }\n\n /*\\\n * Interaction.doMove\n [ method ]\n *\n * Force a move of the current action at the same coordinates. Useful if\n * snap/restrict has been changed and you want a movement with the new\n * settings.\n *\n **\n | interact(target)\n | .draggable(true)\n | .on('dragmove', function (event) {\n | if (someCondition) {\n | // change the snap settings\n | event.interactable.draggable({ snap: { targets: [] }});\n | // fire another move event with re-calculated snap\n | event.interaction.doMove();\n | }\n | });\n \\*/\n doMove (signalArg) {\n signalArg = utils.extend({\n pointer: this.pointers[0],\n event: this.prevEvent,\n eventTarget: this._eventTarget,\n interaction: this,\n }, signalArg || {});\n\n signals.fire('before-action-move', signalArg);\n\n if (!this._dontFireMove) {\n signals.fire('action-move', signalArg);\n }\n\n this._dontFireMove = false;\n }\n\n // End interact move events and stop auto-scroll unless simulation is running\n pointerUp (pointer, event, eventTarget, curEventTarget) {\n const pointerIndex = this.getPointerIndex(pointer);\n\n signals.fire(/cancel$/i.test(event.type)? 'cancel' : 'up', {\n pointer,\n pointerIndex,\n event,\n eventTarget,\n curEventTarget,\n interaction: this,\n });\n\n if (!this.simulation) {\n this.end(event);\n }\n\n this.pointerIsDown = false;\n this.removePointer(pointer, event);\n }\n\n /*\\\n * Interaction.end\n [ method ]\n *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n - event (PointerEvent) #optional\n **\n | interact(target)\n | .draggable(true)\n | .on('move', function (event) {\n | if (event.pageX > 1000) {\n | // end the current action\n | event.interaction.end();\n | // stop all further listeners from being called\n | event.stopImmediatePropagation();\n | }\n | });\n \\*/\n end (event) {\n event = event || this.prevEvent;\n\n if (this.interacting()) {\n signals.fire('action-end', {\n event,\n interaction: this,\n });\n }\n\n this.stop();\n }\n\n currentAction () {\n return this._interacting? this.prepared.name: null;\n }\n\n interacting () {\n return this._interacting;\n }\n\n stop () {\n signals.fire('stop', { interaction: this });\n\n if (this._interacting) {\n signals.fire('stop-active', { interaction: this });\n signals.fire('stop-' + this.prepared.name, { interaction: this });\n }\n\n this.target = this.element = null;\n\n this._interacting = false;\n this.prepared.name = this.prevEvent = null;\n }\n\n getPointerIndex (pointer) {\n // mouse and pen interactions may have only one pointer\n if (this.pointerType === 'mouse' || this.pointerType === 'pen') {\n return 0;\n }\n\n return utils.indexOf(this.pointerIds, utils.getPointerId(pointer));\n }\n\n updatePointer (pointer, event, down = event && /(down|start)$/i.test(event.type)) {\n const id = utils.getPointerId(pointer);\n let index = this.getPointerIndex(pointer);\n\n if (index === -1) {\n index = this.pointerIds.length;\n this.pointerIds[index] = id;\n }\n\n if (down) {\n signals.fire('update-pointer-down', {\n pointer,\n event,\n down,\n pointerId: id,\n pointerIndex: index,\n interaction: this,\n });\n }\n\n this.pointers[index] = pointer;\n\n return index;\n }\n\n removePointer (pointer, event) {\n const index = this.getPointerIndex(pointer);\n\n if (index === -1) { return; }\n\n signals.fire('remove-pointer', {\n pointer,\n event,\n pointerIndex: index,\n interaction: this,\n });\n\n this.pointers .splice(index, 1);\n this.pointerIds .splice(index, 1);\n this.downTargets.splice(index, 1);\n this.downTimes .splice(index, 1);\n }\n\n _updateEventTargets (target, currentTarget) {\n this._eventTarget = target;\n this._curEventTarget = currentTarget;\n }\n}\n\nfor (let i = 0, len = methodNames.length; i < len; i++) {\n const method = methodNames[i];\n\n listeners[method] = doOnInteractions(method);\n}\n\nfunction doOnInteractions (method) {\n return (function (event) {\n const pointerType = utils.getPointerType(event);\n const [eventTarget, curEventTarget] = utils.getEventTargets(event);\n const matches = []; // [ [pointer, interaction], ...]\n\n if (browser.supportsTouch && /touch/.test(event.type)) {\n prevTouchTime = new Date().getTime();\n\n for (let i = 0; i < event.changedTouches.length; i++) {\n const pointer = event.changedTouches[i];\n const interaction = finder.search(pointer, event.type, eventTarget);\n\n matches.push([pointer, interaction || new Interaction({ pointerType })]);\n }\n }\n else {\n let invalidPointer = false;\n\n if (!browser.supportsPointerEvent && /mouse/.test(event.type)) {\n // ignore mouse events while touch interactions are active\n for (let i = 0; i < scope.interactions.length && !invalidPointer; i++) {\n invalidPointer = scope.interactions[i].pointerType !== 'mouse' && scope.interactions[i].pointerIsDown;\n }\n\n // try to ignore mouse events that are simulated by the browser\n // after a touch event\n invalidPointer = invalidPointer\n || (new Date().getTime() - prevTouchTime < 500)\n // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated\n || event.timeStamp === 0;\n }\n\n if (!invalidPointer) {\n let interaction = finder.search(event, event.type, eventTarget);\n\n if (!interaction) {\n interaction = new Interaction({ pointerType });\n }\n\n matches.push([event, interaction]);\n }\n }\n\n for (const [pointer, interaction] of matches) {\n interaction._updateEventTargets(eventTarget, curEventTarget);\n interaction[method](pointer, event, eventTarget, curEventTarget);\n }\n });\n}\n\nfunction endAll (event) {\n for (let i = 0; i < scope.interactions.length; i++) {\n const interaction = scope.interactions[i];\n\n interaction.end(event);\n signals.fire('endall', { event, interaction });\n }\n}\n\nconst docEvents = { /* 'eventType': listenerFunc */ };\nconst pEventTypes = browser.pEventTypes;\n\nif (domObjects.PointerEvent) {\n docEvents[pEventTypes.down ] = listeners.pointerDown;\n docEvents[pEventTypes.move ] = listeners.pointerMove;\n docEvents[pEventTypes.up ] = listeners.pointerUp;\n docEvents[pEventTypes.cancel] = listeners.pointerUp;\n}\nelse {\n docEvents.mousedown = listeners.pointerDown;\n docEvents.mousemove = listeners.pointerMove;\n docEvents.mouseup = listeners.pointerUp;\n\n docEvents.touchstart = listeners.pointerDown;\n docEvents.touchmove = listeners.pointerMove;\n docEvents.touchend = listeners.pointerUp;\n docEvents.touchcancel = listeners.pointerUp;\n}\n\ndocEvents.blur = endAll;\n\nfunction onDocSignal ({ doc }, signalName) {\n const eventMethod = signalName.indexOf('add') === 0\n ? events.add : events.remove;\n\n // delegate event listener\n for (const eventType in scope.delegatedEvents) {\n eventMethod(doc, eventType, events.delegateListener);\n eventMethod(doc, eventType, events.delegateUseCapture, true);\n }\n\n for (const eventType in docEvents) {\n eventMethod(doc, eventType, docEvents[eventType]);\n }\n}\n\nsignals.on('update-pointer-down', ({ interaction, pointer, pointerId, pointerIndex, event, eventTarget, down }) => {\n interaction.pointerIds[pointerIndex] = pointerId;\n interaction.pointers[pointerIndex] = pointer;\n\n if (down) {\n interaction.pointerIsDown = true;\n }\n\n if (!interaction.interacting()) {\n utils.setCoords(interaction.startCoords, interaction.pointers);\n\n utils.copyCoords(interaction.curCoords , interaction.startCoords);\n utils.copyCoords(interaction.prevCoords, interaction.startCoords);\n\n interaction.downEvent = event;\n interaction.downTimes[pointerIndex] = interaction.curCoords.timeStamp;\n interaction.downTargets[pointerIndex] = eventTarget || event && utils.getEventTargets(event)[0];\n interaction.pointerWasMoved = false;\n\n utils.pointerExtend(interaction.downPointer, pointer);\n }\n});\n\nscope.signals.on('add-document' , onDocSignal);\nscope.signals.on('remove-document', onDocSignal);\n\nInteraction.pointerMoveTolerance = 1;\nInteraction.doOnInteractions = doOnInteractions;\nInteraction.endAll = endAll;\nInteraction.signals = signals;\nInteraction.docEvents = docEvents;\n\nscope.endAllInteractions = endAll;\n\nmodule.exports = Interaction;\n","const Interaction = require('../Interaction');\nconst InteractEvent = require('../InteractEvent');\n\nconst actions = {\n firePrepared,\n names: [],\n methodDict: {},\n};\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n interaction._interacting = true;\n firePrepared(interaction, event, 'start');\n});\n\nInteraction.signals.on('action-move', function ({ interaction, event, preEnd }) {\n firePrepared(interaction, event, 'move', preEnd);\n\n // if the action was ended in a listener\n if (!interaction.interacting()) { return false; }\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n firePrepared(interaction, event, 'end');\n});\n\nfunction firePrepared (interaction, event, phase, preEnd) {\n const actionName = interaction.prepared.name;\n\n const newEvent = new InteractEvent(interaction, event, actionName, phase, interaction.element, null, preEnd);\n\n interaction.target.fire(newEvent);\n interaction.prevEvent = newEvent;\n}\n\nmodule.exports = actions;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drag = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n startAxis : 'xy',\n lockAxis : 'xy',\n },\n\n checker: function (pointer, event, interactable) {\n const dragOptions = interactable.options.drag;\n\n return dragOptions.enabled\n ? { name: 'drag', axis: (dragOptions.lockAxis === 'start'\n ? dragOptions.startAxis\n : dragOptions.lockAxis)}\n : null;\n },\n\n getCursor: function () {\n return 'move';\n },\n};\n\nInteraction.signals.on('before-action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n interaction.curCoords.page.y = interaction.startCoords.page.y;\n interaction.curCoords.client.y = interaction.startCoords.client.y;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vx);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vx);\n interaction.pointerDelta.client.vy = 0;\n interaction.pointerDelta.page.vy = 0;\n }\n else if (axis === 'y') {\n interaction.curCoords.page.x = interaction.startCoords.page.x;\n interaction.curCoords.client.x = interaction.startCoords.client.x;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vy);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vy);\n interaction.pointerDelta.client.vx = 0;\n interaction.pointerDelta.page.vx = 0;\n }\n});\n\n// dragmove\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'dragmove') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n iEvent.pageY = interaction.startCoords.page.y;\n iEvent.clientY = interaction.startCoords.client.y;\n iEvent.dy = 0;\n }\n else if (axis === 'y') {\n iEvent.pageX = interaction.startCoords.page.x;\n iEvent.clientX = interaction.startCoords.client.x;\n iEvent.dx = 0;\n }\n});\n\n/*\\\n * Interactable.draggable\n [ method ]\n *\n * Gets or sets whether drag actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of drag events\n | var isDraggable = interact('ul li').draggable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on drag events (object makes the Interactable draggable)\n = (object) This Interactable\n | interact(element).draggable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // the axis in which the first movement must be\n | // for the drag sequence to start\n | // 'xy' by default - any direction\n | startAxis: 'x' || 'y' || 'xy',\n |\n | // 'xy' by default - don't restrict to one axis (move in any direction)\n | // 'x' or 'y' to restrict movement to either axis\n | // 'start' to restrict movement to the axis the drag started in\n | lockAxis: 'x' || 'y' || 'xy' || 'start',\n |\n | // max number of drags that can happen concurrently\n | // with elements of this Interactable. Infinity by default\n | max: Infinity,\n |\n | // max number of drags that can target the same element+Interactable\n | // 1 by default\n | maxPerElement: 2\n | });\n\\*/\nInteractable.prototype.draggable = function (options) {\n if (utils.is.object(options)) {\n this.options.drag.enabled = options.enabled === false? false: true;\n this.setPerAction('drag', options);\n this.setOnEvents('drag', options);\n\n if (/^(xy|x|y|start)$/.test(options.lockAxis)) {\n this.options.drag.lockAxis = options.lockAxis;\n }\n if (/^(xy|x|y)$/.test(options.startAxis)) {\n this.options.drag.startAxis = options.startAxis;\n }\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drag.enabled = options;\n\n if (!options) {\n this.ondragstart = this.ondragstart = this.ondragend = null;\n }\n\n return this;\n }\n\n return this.options.drag;\n};\n\nactions.drag = drag;\nactions.names.push('drag');\nutils.merge(Interactable.eventTypes, [\n 'dragstart',\n 'dragmove',\n 'draginertiastart',\n 'draginertiaresume',\n 'dragend',\n]);\nactions.methodDict.drag = 'draggable';\n\ndefaultOptions.drag = drag.defaults;\n\nmodule.exports = drag;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst scope = require('../scope');\nconst interact = require('../interact');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drop = {\n defaults: {\n enabled: false,\n accept : null,\n overlap: 'pointer',\n },\n};\n\nlet dynamicDrop = false;\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // reset active dropzones\n interaction.activeDrops.dropzones = [];\n interaction.activeDrops.elements = [];\n interaction.activeDrops.rects = [];\n\n interaction.dropEvents = null;\n\n if (!interaction.dynamicDrop) {\n setActiveDrops(interaction, interaction.element);\n }\n\n const dragEvent = interaction.prevEvent;\n const dropEvents = getDropEvents(interaction, event, dragEvent);\n\n if (dropEvents.activate) {\n fireActiveDrops(interaction, dropEvents.activate);\n }\n});\n\nInteractEvent.signals.on('new', function ({ interaction, iEvent, event }) {\n if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { return; }\n\n const draggableElement = interaction.element;\n const dragEvent = iEvent;\n const dropResult = getDrop(dragEvent, event, draggableElement);\n\n interaction.dropTarget = dropResult.dropzone;\n interaction.dropElement = dropResult.element;\n\n interaction.dropEvents = getDropEvents(interaction, event, dragEvent);\n});\n\nInteraction.signals.on('action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n fireDropEvents(interaction, interaction.dropEvents);\n});\n\nInteraction.signals.on('action-end', function ({ interaction }) {\n if (interaction.prepared.name === 'drag') {\n fireDropEvents(interaction, interaction.dropEvents);\n }\n});\n\nInteraction.signals.on('stop-drag', function ({ interaction }) {\n interaction.activeDrops.dropzones =\n interaction.activeDrops.elements =\n interaction.activeDrops.rects =\n interaction.dropEvents = null;\n});\n\nfunction collectDrops (interaction, element) {\n const drops = [];\n const elements = [];\n\n element = element || interaction.element;\n\n // collect all dropzones and their elements which qualify for a drop\n for (const current of scope.interactables) {\n if (!current.options.drop.enabled) { continue; }\n\n const accept = current.options.drop.accept;\n\n // test the draggable element against the dropzone's accept setting\n if ((utils.is.element(accept) && accept !== element)\n || (utils.is.string(accept)\n && !utils.matchesSelector(element, accept))) {\n\n continue;\n }\n\n // query for new elements if necessary\n const dropElements = utils.is.string(current.target)\n ? current._context.querySelectorAll(current.target)\n : [current.target];\n\n for (let i = 0; i < dropElements.length; i++) {\n const currentElement = dropElements[i];\n\n if (currentElement !== element) {\n drops.push(current);\n elements.push(currentElement);\n }\n }\n }\n\n return {\n elements,\n dropzones: drops,\n };\n}\n\nfunction fireActiveDrops (interaction, event) {\n let prevElement;\n\n // loop through all active dropzones and trigger event\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n const current = interaction.activeDrops.dropzones[i];\n const currentElement = interaction.activeDrops.elements [i];\n\n // prevent trigger of duplicate events on same element\n if (currentElement !== prevElement) {\n // set current element as event target\n event.target = currentElement;\n current.fire(event);\n }\n prevElement = currentElement;\n }\n}\n\n// Collect a new set of possible drops and save them in activeDrops.\n// setActiveDrops should always be called when a drag has just started or a\n// drag event happens while dynamicDrop is true\nfunction setActiveDrops (interaction, dragElement) {\n // get dropzones and their elements that could receive the draggable\n const possibleDrops = collectDrops(interaction, dragElement, true);\n\n interaction.activeDrops.dropzones = possibleDrops.dropzones;\n interaction.activeDrops.elements = possibleDrops.elements;\n interaction.activeDrops.rects = [];\n\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n interaction.activeDrops.rects[i] =\n interaction.activeDrops.dropzones[i].getRect(interaction.activeDrops.elements[i]);\n }\n}\n\nfunction getDrop (dragEvent, event, dragElement) {\n const interaction = dragEvent.interaction;\n const validDrops = [];\n\n if (dynamicDrop) {\n setActiveDrops(interaction, dragElement);\n }\n\n // collect all dropzones and their elements which qualify for a drop\n for (let j = 0; j < interaction.activeDrops.dropzones.length; j++) {\n const current = interaction.activeDrops.dropzones[j];\n const currentElement = interaction.activeDrops.elements [j];\n const rect = interaction.activeDrops.rects [j];\n\n validDrops.push(current.dropCheck(dragEvent, event, interaction.target, dragElement, currentElement, rect)\n ? currentElement\n : null);\n }\n\n // get the most appropriate dropzone based on DOM depth and order\n const dropIndex = utils.indexOfDeepestElement(validDrops);\n\n return {\n dropzone: interaction.activeDrops.dropzones[dropIndex] || null,\n element : interaction.activeDrops.elements [dropIndex] || null,\n };\n}\n\nfunction getDropEvents (interaction, pointerEvent, dragEvent) {\n const dropEvents = {\n enter : null,\n leave : null,\n activate : null,\n deactivate: null,\n move : null,\n drop : null,\n };\n\n const tmpl = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n };\n\n if (interaction.dropElement !== interaction.prevDropElement) {\n // if there was a prevDropTarget, create a dragleave event\n if (interaction.prevDropTarget) {\n dropEvents.leave = utils.extend({ type: 'dragleave' }, tmpl);\n\n dragEvent.dragLeave = dropEvents.leave.target = interaction.prevDropElement;\n dragEvent.prevDropzone = dropEvents.leave.dropzone = interaction.prevDropTarget;\n }\n // if the dropTarget is not null, create a dragenter event\n if (interaction.dropTarget) {\n dropEvents.enter = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n type : 'dragenter',\n };\n\n dragEvent.dragEnter = interaction.dropElement;\n dragEvent.dropzone = interaction.dropTarget;\n }\n }\n\n if (dragEvent.type === 'dragend' && interaction.dropTarget) {\n dropEvents.drop = utils.extend({ type: 'drop' }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n dragEvent.relatedTarget = interaction.dropElement;\n }\n if (dragEvent.type === 'dragstart') {\n dropEvents.activate = utils.extend({ type: 'dropactivate' }, tmpl);\n\n dropEvents.activate.target = null;\n dropEvents.activate.dropzone = null;\n }\n if (dragEvent.type === 'dragend') {\n dropEvents.deactivate = utils.extend({ type: 'dropdeactivate' }, tmpl);\n\n dropEvents.deactivate.target = null;\n dropEvents.deactivate.dropzone = null;\n }\n if (dragEvent.type === 'dragmove' && interaction.dropTarget) {\n dropEvents.move = utils.extend({\n dragmove : dragEvent,\n type : 'dropmove',\n }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n }\n\n return dropEvents;\n}\n\nfunction fireDropEvents (interaction, dropEvents) {\n if (dropEvents.leave) { interaction.prevDropTarget.fire(dropEvents.leave); }\n if (dropEvents.move ) { interaction.dropTarget.fire(dropEvents.move ); }\n if (dropEvents.enter) { interaction.dropTarget.fire(dropEvents.enter); }\n if (dropEvents.drop ) { interaction.dropTarget.fire(dropEvents.drop ); }\n if (dropEvents.deactivate) {\n fireActiveDrops(interaction, dropEvents.deactivate);\n }\n\n interaction.prevDropTarget = interaction.dropTarget;\n interaction.prevDropElement = interaction.dropElement;\n}\n\n/*\\\n * Interactable.dropzone\n [ method ]\n *\n * Returns or sets whether elements can be dropped onto this\n * Interactable to trigger drop events\n *\n * Dropzones can receive the following events:\n * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends\n * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone\n * - `dragmove` when a draggable that has entered the dropzone is moved\n * - `drop` when a draggable is dropped into this dropzone\n *\n * Use the `accept` option to allow only elements that match the given CSS\n * selector or element. The value can be:\n *\n * - **an Element** - only that element can be dropped into this dropzone.\n * - **a string**, - the element being dragged must match it as a CSS selector.\n * - **`null`** - accept options is cleared - it accepts any element.\n *\n * Use the `overlap` option to set how drops are checked for. The allowed\n * values are:\n *\n * - `'pointer'`, the pointer must be over the dropzone (default)\n * - `'center'`, the draggable element's center must be over the dropzone\n * - a number from 0-1 which is the `(intersection area) / (draggable area)`.\n * e.g. `0.5` for drop to happen when half of the area of the draggable is\n * over the dropzone\n *\n * Use the `checker` option to specify a function to check if a dragged\n * element is over this Interactable.\n *\n | interact(target)\n | .dropChecker(function(dragEvent, // related dragmove or dragend event\n | event, // TouchEvent/PointerEvent/MouseEvent\n | dropped, // bool result of the default checker\n | dropzone, // dropzone Interactable\n | dropElement, // dropzone elemnt\n | draggable, // draggable Interactable\n | draggableElement) {// draggable element\n |\n | return dropped && event.target.hasAttribute('allow-drop');\n | }\n *\n *\n - options (boolean | object | null) #optional The new value to be set.\n | interact('.drop').dropzone({\n | accept: '.can-drop' || document.getElementById('single-drop'),\n | overlap: 'pointer' || 'center' || zeroToOne\n | }\n = (boolean | object) The current setting or this Interactable\n\\*/\nInteractable.prototype.dropzone = function (options) {\n if (utils.is.object(options)) {\n this.options.drop.enabled = options.enabled === false? false: true;\n\n if (utils.is.function(options.ondrop) ) { this.events.ondrop = options.ondrop ; }\n if (utils.is.function(options.ondropactivate) ) { this.events.ondropactivate = options.ondropactivate ; }\n if (utils.is.function(options.ondropdeactivate)) { this.events.ondropdeactivate = options.ondropdeactivate; }\n if (utils.is.function(options.ondragenter) ) { this.events.ondragenter = options.ondragenter ; }\n if (utils.is.function(options.ondragleave) ) { this.events.ondragleave = options.ondragleave ; }\n if (utils.is.function(options.ondropmove) ) { this.events.ondropmove = options.ondropmove ; }\n\n if (/^(pointer|center)$/.test(options.overlap)) {\n this.options.drop.overlap = options.overlap;\n }\n else if (utils.is.number(options.overlap)) {\n this.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0);\n }\n if ('accept' in options) {\n this.options.drop.accept = options.accept;\n }\n if ('checker' in options) {\n this.options.drop.checker = options.checker;\n }\n\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drop.enabled = options;\n\n if (!options) {\n this.ondragenter = this.ondragleave = this.ondrop\n = this.ondropactivate = this.ondropdeactivate = null;\n }\n\n return this;\n }\n\n return this.options.drop;\n};\n\nInteractable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) {\n let dropped = false;\n\n // if the dropzone has no rect (eg. display: none)\n // call the custom dropChecker or just return false\n if (!(rect = rect || this.getRect(dropElement))) {\n return (this.options.drop.checker\n ? this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement)\n : false);\n }\n\n const dropOverlap = this.options.drop.overlap;\n\n if (dropOverlap === 'pointer') {\n const origin = utils.getOriginXY(draggable, draggableElement, 'drag');\n const page = utils.getPageXY(dragEvent);\n\n page.x += origin.x;\n page.y += origin.y;\n\n const horizontal = (page.x > rect.left) && (page.x < rect.right);\n const vertical = (page.y > rect.top ) && (page.y < rect.bottom);\n\n dropped = horizontal && vertical;\n }\n\n const dragRect = draggable.getRect(draggableElement);\n\n if (dragRect && dropOverlap === 'center') {\n const cx = dragRect.left + dragRect.width / 2;\n const cy = dragRect.top + dragRect.height / 2;\n\n dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom;\n }\n\n if (dragRect && utils.is.number(dropOverlap)) {\n const overlapArea = (Math.max(0, Math.min(rect.right , dragRect.right ) - Math.max(rect.left, dragRect.left))\n * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top , dragRect.top )));\n\n const overlapRatio = overlapArea / (dragRect.width * dragRect.height);\n\n dropped = overlapRatio >= dropOverlap;\n }\n\n if (this.options.drop.checker) {\n dropped = this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement);\n }\n\n return dropped;\n};\n\nInteractable.signals.on('unset', function ({ interactable }) {\n interactable.dropzone(false);\n});\n\nInteractable.settingsMethods.push('dropChecker');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.dropTarget = null; // the dropzone a drag target might be dropped into\n interaction.dropElement = null; // the element at the time of checking\n interaction.prevDropTarget = null; // the dropzone that was recently dragged away from\n interaction.prevDropElement = null; // the element at the time of checking\n interaction.dropEvents = null; // the dropEvents related to the current drag event\n\n interaction.activeDrops = {\n dropzones: [], // the dropzones that are mentioned below\n elements : [], // elements of dropzones that accept the target draggable\n rects : [], // the rects of the elements mentioned above\n };\n\n});\n\nInteraction.signals.on('stop', function ({ interaction }) {\n interaction.dropTarget = interaction.dropElement =\n interaction.prevDropTarget = interaction.prevDropElement = null;\n});\n\n/*\\\n * interact.dynamicDrop\n [ method ]\n *\n * Returns or sets whether the dimensions of dropzone elements are\n * calculated on every dragmove or only on dragstart for the default\n * dropChecker\n *\n - newValue (boolean) #optional True to check on each move. False to check only before start\n = (boolean | interact) The current setting or interact\n\\*/\ninteract.dynamicDrop = function (newValue) {\n if (utils.is.bool(newValue)) {\n //if (dragging && dynamicDrop !== newValue && !newValue) {\n //calcRects(dropzones);\n //}\n\n dynamicDrop = newValue;\n\n return interact;\n }\n return dynamicDrop;\n};\n\nutils.merge(Interactable.eventTypes, [\n 'dragenter',\n 'dragleave',\n 'dropactivate',\n 'dropdeactivate',\n 'dropmove',\n 'drop',\n]);\nactions.methodDict.drop = 'dropzone';\n\ndefaultOptions.drop = drop.defaults;\n\nmodule.exports = drop;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst gesture = {\n defaults: {\n enabled : false,\n origin : null,\n restrict: null,\n },\n\n checker: function (pointer, event, interactable, element, interaction) {\n if (interaction.pointerIds.length >= 2) {\n return { name: 'gesture' };\n }\n\n return null;\n },\n\n getCursor: function () {\n return '';\n },\n};\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturestart') { return; }\n iEvent.ds = 0;\n\n interaction.gesture.startDistance = interaction.gesture.prevDistance = iEvent.distance;\n interaction.gesture.startAngle = interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.scale = 1;\n});\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturemove') { return; }\n\n iEvent.ds = iEvent.scale - interaction.gesture.scale;\n\n interaction.target.fire(iEvent);\n\n interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.prevDistance = iEvent.distance;\n\n if (iEvent.scale !== Infinity\n && iEvent.scale !== null\n && iEvent.scale !== undefined\n && !isNaN(iEvent.scale)) {\n\n interaction.gesture.scale = iEvent.scale;\n }\n});\n\n/*\\\n * Interactable.gesturable\n [ method ]\n *\n * Gets or sets whether multitouch gestures can be performed on the\n * Interactable's element\n *\n = (boolean) Indicates if this can be the target of gesture events\n | var isGestureable = interact(element).gesturable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on gesture events (makes the Interactable gesturable)\n = (object) this Interactable\n | interact(element).gesturable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // limit multiple gestures.\n | // See the explanation in @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n\\*/\nInteractable.prototype.gesturable = function (options) {\n if (utils.is.object(options)) {\n this.options.gesture.enabled = options.enabled === false? false: true;\n this.setPerAction('gesture', options);\n this.setOnEvents('gesture', options);\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.gesture.enabled = options;\n\n if (!options) {\n this.ongesturestart = this.ongesturestart = this.ongestureend = null;\n }\n\n return this;\n }\n\n return this.options.gesture;\n};\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action, event, starting, ending, deltaSource }) {\n if (action !== 'gesture') { return; }\n\n const pointers = interaction.pointers;\n\n iEvent.touches = [pointers[0], pointers[1]];\n\n if (starting) {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = 1;\n iEvent.ds = 0;\n iEvent.angle = utils.touchAngle(pointers, undefined, deltaSource);\n iEvent.da = 0;\n }\n else if (ending || event instanceof InteractEvent) {\n iEvent.distance = interaction.prevEvent.distance;\n iEvent.box = interaction.prevEvent.box;\n iEvent.scale = interaction.prevEvent.scale;\n iEvent.ds = iEvent.scale - 1;\n iEvent.angle = interaction.prevEvent.angle;\n iEvent.da = iEvent.angle - interaction.gesture.startAngle;\n }\n else {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = iEvent.distance / interaction.gesture.startDistance;\n iEvent.angle = utils.touchAngle(pointers, interaction.gesture.prevAngle, deltaSource);\n\n iEvent.ds = iEvent.scale - interaction.gesture.prevScale;\n iEvent.da = iEvent.angle - interaction.gesture.prevAngle;\n }\n});\n\nInteraction.signals.on('new', function (interaction) {\n interaction.gesture = {\n start: { x: 0, y: 0 },\n\n startDistance: 0, // distance between two touches of touchStart\n prevDistance : 0,\n distance : 0,\n\n scale: 1, // gesture.distance / gesture.startDistance\n\n startAngle: 0, // angle of line joining two touches\n prevAngle : 0, // angle of the previous gesture event\n };\n});\n\nactions.gesture = gesture;\nactions.names.push('gesture');\nutils.merge(Interactable.eventTypes, [\n 'gesturestart',\n 'gesturemove',\n 'gestureend',\n]);\nactions.methodDict.gesture = 'gesturable';\n\ndefaultOptions.gesture = gesture.defaults;\n\nmodule.exports = gesture;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\n// Less Precision with touch input\nconst defaultMargin = browser.supportsTouch || browser.supportsPointerEvent? 20: 10;\n\nconst resize = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n square: false,\n preserveAspectRatio: false,\n axis: 'xy',\n\n // use default margin\n margin: NaN,\n\n // object with props left, right, top, bottom which are\n // true/false values to resize when the pointer is over that edge,\n // CSS selectors to match the handles for each direction\n // or the Elements for each handle\n edges: null,\n\n // a value of 'none' will limit the resize rect to a minimum of 0x0\n // 'negate' will alow the rect to have negative width/height\n // 'reposition' will keep the width/height positive by swapping\n // the top and bottom edges and/or swapping the left and right edges\n invert: 'none',\n },\n\n checker: function (pointer, event, interactable, element, interaction, rect) {\n if (!rect) { return null; }\n\n const page = utils.extend({}, interaction.curCoords.page);\n const options = interactable.options;\n\n if (options.resize.enabled) {\n const resizeOptions = options.resize;\n const resizeEdges = { left: false, right: false, top: false, bottom: false };\n\n // if using resize.edges\n if (utils.is.object(resizeOptions.edges)) {\n for (const edge in resizeEdges) {\n resizeEdges[edge] = checkResizeEdge(edge,\n resizeOptions.edges[edge],\n page,\n interaction._eventTarget,\n element,\n rect,\n resizeOptions.margin || defaultMargin);\n }\n\n resizeEdges.left = resizeEdges.left && !resizeEdges.right;\n resizeEdges.top = resizeEdges.top && !resizeEdges.bottom;\n\n if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) {\n return {\n name: 'resize',\n edges: resizeEdges,\n };\n }\n }\n else {\n const right = options.resize.axis !== 'y' && page.x > (rect.right - defaultMargin);\n const bottom = options.resize.axis !== 'x' && page.y > (rect.bottom - defaultMargin);\n\n if (right || bottom) {\n return {\n name: 'resize',\n axes: (right? 'x' : '') + (bottom? 'y' : ''),\n };\n }\n }\n }\n\n return null;\n },\n\n cursors: (browser.isIe9OrOlder ? {\n x : 'e-resize',\n y : 's-resize',\n xy: 'se-resize',\n\n top : 'n-resize',\n left : 'w-resize',\n bottom : 's-resize',\n right : 'e-resize',\n topleft : 'se-resize',\n bottomright: 'se-resize',\n topright : 'ne-resize',\n bottomleft : 'ne-resize',\n } : {\n x : 'ew-resize',\n y : 'ns-resize',\n xy: 'nwse-resize',\n\n top : 'ns-resize',\n left : 'ew-resize',\n bottom : 'ns-resize',\n right : 'ew-resize',\n topleft : 'nwse-resize',\n bottomright: 'nwse-resize',\n topright : 'nesw-resize',\n bottomleft : 'nesw-resize',\n }),\n\n getCursor: function (action) {\n if (action.axis) {\n return resize.cursors[action.name + action.axis];\n }\n else if (action.edges) {\n let cursorKey = '';\n const edgeNames = ['top', 'bottom', 'left', 'right'];\n\n for (let i = 0; i < 4; i++) {\n if (action.edges[edgeNames[i]]) {\n cursorKey += edgeNames[i];\n }\n }\n\n return resize.cursors[cursorKey];\n }\n },\n};\n\n// resizestart\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'resizestart' || !interaction.prepared.edges) {\n return;\n }\n\n const startRect = interaction.target.getRect(interaction.element);\n const resizeOptions = interaction.target.options.resize;\n\n /*\n * When using the `resizable.square` or `resizable.preserveAspectRatio` options, resizing from one edge\n * will affect another. E.g. with `resizable.square`, resizing to make the right edge larger will make\n * the bottom edge larger by the same amount. We call these 'linked' edges. Any linked edges will depend\n * on the active edges and the edge being interacted with.\n */\n if (resizeOptions.square || resizeOptions.preserveAspectRatio) {\n const linkedEdges = utils.extend({}, interaction.prepared.edges);\n\n linkedEdges.top = linkedEdges.top || (linkedEdges.left && !linkedEdges.bottom);\n linkedEdges.left = linkedEdges.left || (linkedEdges.top && !linkedEdges.right );\n linkedEdges.bottom = linkedEdges.bottom || (linkedEdges.right && !linkedEdges.top );\n linkedEdges.right = linkedEdges.right || (linkedEdges.bottom && !linkedEdges.left );\n\n interaction.prepared._linkedEdges = linkedEdges;\n }\n else {\n interaction.prepared._linkedEdges = null;\n }\n\n // if using `resizable.preserveAspectRatio` option, record aspect ratio at the start of the resize\n if (resizeOptions.preserveAspectRatio) {\n interaction.resizeStartAspectRatio = startRect.width / startRect.height;\n }\n\n interaction.resizeRects = {\n start : startRect,\n current : utils.extend({}, startRect),\n inverted : utils.extend({}, startRect),\n previous : utils.extend({}, startRect),\n delta : {\n left: 0, right : 0, width : 0,\n top : 0, bottom: 0, height: 0,\n },\n };\n\n iEvent.rect = interaction.resizeRects.inverted;\n iEvent.deltaRect = interaction.resizeRects.delta;\n});\n\n// resizemove\nInteractEvent.signals.on('new', function ({ iEvent, phase, interaction }) {\n if (phase !== 'move' || !interaction.prepared.edges) { return; }\n\n const resizeOptions = interaction.target.options.resize;\n const invert = resizeOptions.invert;\n const invertible = invert === 'reposition' || invert === 'negate';\n\n let edges = interaction.prepared.edges;\n\n const start = interaction.resizeRects.start;\n const current = interaction.resizeRects.current;\n const inverted = interaction.resizeRects.inverted;\n const delta = interaction.resizeRects.delta;\n const previous = utils.extend(interaction.resizeRects.previous, inverted);\n const originalEdges = edges;\n\n let dx = iEvent.dx;\n let dy = iEvent.dy;\n\n if (resizeOptions.preserveAspectRatio || resizeOptions.square) {\n // `resize.preserveAspectRatio` takes precedence over `resize.square`\n const startAspectRatio = resizeOptions.preserveAspectRatio\n ? interaction.resizeStartAspectRatio\n : 1;\n\n edges = interaction.prepared._linkedEdges;\n\n if ((originalEdges.left && originalEdges.bottom)\n || (originalEdges.right && originalEdges.top)) {\n dy = -dx / startAspectRatio;\n }\n else if (originalEdges.left || originalEdges.right ) { dy = dx / startAspectRatio; }\n else if (originalEdges.top || originalEdges.bottom) { dx = dy * startAspectRatio; }\n }\n\n // update the 'current' rect without modifications\n if (edges.top ) { current.top += dy; }\n if (edges.bottom) { current.bottom += dy; }\n if (edges.left ) { current.left += dx; }\n if (edges.right ) { current.right += dx; }\n\n if (invertible) {\n // if invertible, copy the current rect\n utils.extend(inverted, current);\n\n if (invert === 'reposition') {\n // swap edge values if necessary to keep width/height positive\n let swap;\n\n if (inverted.top > inverted.bottom) {\n swap = inverted.top;\n\n inverted.top = inverted.bottom;\n inverted.bottom = swap;\n }\n if (inverted.left > inverted.right) {\n swap = inverted.left;\n\n inverted.left = inverted.right;\n inverted.right = swap;\n }\n }\n }\n else {\n // if not invertible, restrict to minimum of 0x0 rect\n inverted.top = Math.min(current.top, start.bottom);\n inverted.bottom = Math.max(current.bottom, start.top);\n inverted.left = Math.min(current.left, start.right);\n inverted.right = Math.max(current.right, start.left);\n }\n\n inverted.width = inverted.right - inverted.left;\n inverted.height = inverted.bottom - inverted.top ;\n\n for (const edge in inverted) {\n delta[edge] = inverted[edge] - previous[edge];\n }\n\n iEvent.edges = interaction.prepared.edges;\n iEvent.rect = inverted;\n iEvent.deltaRect = delta;\n});\n\n/*\\\n * Interactable.resizable\n [ method ]\n *\n * Gets or sets whether resize actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of resize elements\n | var isResizeable = interact('input[type=text]').resizable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on resize events (object makes the Interactable resizable)\n = (object) This Interactable\n | interact(element).resizable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | edges: {\n | top : true, // Use pointer coords to check for resize.\n | left : false, // Disable resizing from left edge.\n | bottom: '.resize-s',// Resize if pointer target matches selector\n | right : handleEl // Resize if pointer target is the given Element\n | },\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height are adjusted at a 1:1 ratio.\n | square: false,\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height maintain the aspect ratio they had when resizing started.\n | preserveAspectRatio: false,\n |\n | // a value of 'none' will limit the resize rect to a minimum of 0x0\n | // 'negate' will allow the rect to have negative width/height\n | // 'reposition' will keep the width/height positive by swapping\n | // the top and bottom edges and/or swapping the left and right edges\n | invert: 'none' || 'negate' || 'reposition'\n |\n | // limit multiple resizes.\n | // See the explanation in the @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n \\*/\nInteractable.prototype.resizable = function (options) {\n if (utils.is.object(options)) {\n this.options.resize.enabled = options.enabled === false? false: true;\n this.setPerAction('resize', options);\n this.setOnEvents('resize', options);\n\n if (/^x$|^y$|^xy$/.test(options.axis)) {\n this.options.resize.axis = options.axis;\n }\n else if (options.axis === null) {\n this.options.resize.axis = defaultOptions.resize.axis;\n }\n\n if (utils.is.bool(options.preserveAspectRatio)) {\n this.options.resize.preserveAspectRatio = options.preserveAspectRatio;\n }\n else if (utils.is.bool(options.square)) {\n this.options.resize.square = options.square;\n }\n\n return this;\n }\n if (utils.is.bool(options)) {\n this.options.resize.enabled = options;\n\n if (!options) {\n this.onresizestart = this.onresizestart = this.onresizeend = null;\n }\n\n return this;\n }\n return this.options.resize;\n};\n\nfunction checkResizeEdge (name, value, page, element, interactableElement, rect, margin) {\n // false, '', undefined, null\n if (!value) { return false; }\n\n // true value, use pointer coords and element rect\n if (value === true) {\n // if dimensions are negative, \"switch\" edges\n const width = utils.is.number(rect.width )? rect.width : rect.right - rect.left;\n const height = utils.is.number(rect.height)? rect.height : rect.bottom - rect.top ;\n\n if (width < 0) {\n if (name === 'left' ) { name = 'right'; }\n else if (name === 'right') { name = 'left' ; }\n }\n if (height < 0) {\n if (name === 'top' ) { name = 'bottom'; }\n else if (name === 'bottom') { name = 'top' ; }\n }\n\n if (name === 'left' ) { return page.x < ((width >= 0? rect.left: rect.right ) + margin); }\n if (name === 'top' ) { return page.y < ((height >= 0? rect.top : rect.bottom) + margin); }\n\n if (name === 'right' ) { return page.x > ((width >= 0? rect.right : rect.left) - margin); }\n if (name === 'bottom') { return page.y > ((height >= 0? rect.bottom: rect.top ) - margin); }\n }\n\n // the remaining checks require an element\n if (!utils.is.element(element)) { return false; }\n\n return utils.is.element(value)\n // the value is an element to use as a resize handle\n ? value === element\n // otherwise check if element matches value as selector\n : utils.matchesUpTo(element, value, interactableElement);\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.resizeAxes = 'xy';\n});\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action }) {\n if (action !== 'resize' || !interaction.resizeAxes) { return; }\n\n const options = interaction.target.options;\n\n if (options.resize.square) {\n if (interaction.resizeAxes === 'y') {\n iEvent.dx = iEvent.dy;\n }\n else {\n iEvent.dy = iEvent.dx;\n }\n iEvent.axes = 'xy';\n }\n else {\n iEvent.axes = interaction.resizeAxes;\n\n if (interaction.resizeAxes === 'x') {\n iEvent.dy = 0;\n }\n else if (interaction.resizeAxes === 'y') {\n iEvent.dx = 0;\n }\n }\n});\n\nactions.resize = resize;\nactions.names.push('resize');\nutils.merge(Interactable.eventTypes, [\n 'resizestart',\n 'resizemove',\n 'resizeinertiastart',\n 'resizeinertiaresume',\n 'resizeend',\n]);\nactions.methodDict.resize = 'resizable';\n\ndefaultOptions.resize = resize.defaults;\n\nmodule.exports = resize;\n","const raf = require('./utils/raf');\nconst getWindow = require('./utils/window').getWindow;\nconst is = require('./utils/is');\nconst domUtils = require('./utils/domUtils');\nconst Interaction = require('./Interaction');\nconst defaultOptions = require('./defaultOptions');\n\nconst autoScroll = {\n defaults: {\n enabled : false,\n container: null, // the item that is scrolled (Window or HTMLElement)\n margin : 60,\n speed : 300, // the scroll speed in pixels per second\n },\n\n interaction: null,\n i: null, // the handle returned by window.setInterval\n x: 0, y: 0, // Direction each pulse is to scroll in\n\n isScrolling: false,\n prevTime: 0,\n\n start: function (interaction) {\n autoScroll.isScrolling = true;\n raf.cancel(autoScroll.i);\n\n autoScroll.interaction = interaction;\n autoScroll.prevTime = new Date().getTime();\n autoScroll.i = raf.request(autoScroll.scroll);\n },\n\n stop: function () {\n autoScroll.isScrolling = false;\n raf.cancel(autoScroll.i);\n },\n\n // scroll the window by the values in scroll.x/y\n scroll: function () {\n const options = autoScroll.interaction.target.options[autoScroll.interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(autoScroll.interaction.element);\n const now = new Date().getTime();\n // change in time in seconds\n const dt = (now - autoScroll.prevTime) / 1000;\n // displacement\n const s = options.speed * dt;\n\n if (s >= 1) {\n if (is.window(container)) {\n container.scrollBy(autoScroll.x * s, autoScroll.y * s);\n }\n else if (container) {\n container.scrollLeft += autoScroll.x * s;\n container.scrollTop += autoScroll.y * s;\n }\n\n autoScroll.prevTime = now;\n }\n\n if (autoScroll.isScrolling) {\n raf.cancel(autoScroll.i);\n autoScroll.i = raf.request(autoScroll.scroll);\n }\n },\n check: function (interactable, actionName) {\n const options = interactable.options;\n\n return options[actionName].autoScroll && options[actionName].autoScroll.enabled;\n },\n onInteractionMove: function ({ interaction, pointer }) {\n if (!(interaction.interacting()\n && autoScroll.check(interaction.target, interaction.prepared.name))) {\n return;\n }\n\n if (interaction.simulation) {\n autoScroll.x = autoScroll.y = 0;\n return;\n }\n\n let top;\n let right;\n let bottom;\n let left;\n\n const options = interaction.target.options[interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(interaction.element);\n\n if (is.window(container)) {\n left = pointer.clientX < autoScroll.margin;\n top = pointer.clientY < autoScroll.margin;\n right = pointer.clientX > container.innerWidth - autoScroll.margin;\n bottom = pointer.clientY > container.innerHeight - autoScroll.margin;\n }\n else {\n const rect = domUtils.getElementClientRect(container);\n\n left = pointer.clientX < rect.left + autoScroll.margin;\n top = pointer.clientY < rect.top + autoScroll.margin;\n right = pointer.clientX > rect.right - autoScroll.margin;\n bottom = pointer.clientY > rect.bottom - autoScroll.margin;\n }\n\n autoScroll.x = (right ? 1: left? -1: 0);\n autoScroll.y = (bottom? 1: top? -1: 0);\n\n if (!autoScroll.isScrolling) {\n // set the autoScroll properties to those of the target\n autoScroll.margin = options.margin;\n autoScroll.speed = options.speed;\n\n autoScroll.start(interaction);\n }\n },\n};\n\nInteraction.signals.on('stop-active', function () {\n autoScroll.stop();\n});\n\nInteraction.signals.on('action-move', autoScroll.onInteractionMove);\n\ndefaultOptions.perAction.autoScroll = autoScroll.defaults;\n\nmodule.exports = autoScroll;\n","const Interactable = require('../Interactable');\nconst actions = require('../actions/base');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.ignoreFrom\n [ method ]\n *\n * If the target of the `mousedown`, `pointerdown` or `touchstart`\n * event or any of it's parents match the given CSS selector or\n * Element, no drag/resize/gesture is started.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to not ignore any elements\n = (string | Element | object) The current ignoreFrom value or this Interactable\n **\n | interact(element, { ignoreFrom: document.getElementById('no-action') });\n | // or\n | interact(element).ignoreFrom('input, textarea, a');\n\\*/\nInteractable.prototype.ignoreFrom = function (newValue) {\n return this._backCompatOption('ignoreFrom', newValue);\n};\n\n/*\\\n * Interactable.allowFrom\n [ method ]\n *\n * A drag/resize/gesture is started only If the target of the\n * `mousedown`, `pointerdown` or `touchstart` event or any of it's\n * parents match the given CSS selector or Element.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to allow from any element\n = (string | Element | object) The current allowFrom value or this Interactable\n **\n | interact(element, { allowFrom: document.getElementById('drag-handle') });\n | // or\n | interact(element).allowFrom('.handle');\n\\*/\nInteractable.prototype.allowFrom = function (newValue) {\n return this._backCompatOption('allowFrom', newValue);\n};\n\nInteractable.prototype.testIgnore = function (ignoreFrom, interactableElement, element) {\n if (!ignoreFrom || !is.element(element)) { return false; }\n\n if (is.string(ignoreFrom)) {\n return domUtils.matchesUpTo(element, ignoreFrom, interactableElement);\n }\n else if (is.element(ignoreFrom)) {\n return domUtils.nodeContains(ignoreFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testAllow = function (allowFrom, interactableElement, element) {\n if (!allowFrom) { return true; }\n\n if (!is.element(element)) { return false; }\n\n if (is.string(allowFrom)) {\n return domUtils.matchesUpTo(element, allowFrom, interactableElement);\n }\n else if (is.element(allowFrom)) {\n return domUtils.nodeContains(allowFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testIgnoreAllow = function (options, interactableElement, eventTarget) {\n return (!this.testIgnore(options.ignoreFrom, interactableElement, eventTarget)\n && this.testAllow(options.allowFrom, interactableElement, eventTarget));\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (event.buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\n","const interact = require('../interact');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst actions = require('../actions/base');\nconst defaultOptions = require('../defaultOptions');\nconst browser = require('../utils/browser');\nconst scope = require('../scope');\nconst utils = require('../utils');\nconst signals = require('../utils/Signals').new();\n\nrequire('./InteractableMethods');\n\nconst autoStart = {\n signals,\n withinInteractionLimit,\n // Allow this many interactions to happen simultaneously\n maxInteractions: Infinity,\n defaults: {\n perAction: {\n manualStart: false,\n max: Infinity,\n maxPerElement: 1,\n allowFrom: null,\n ignoreFrom: null,\n },\n },\n setActionDefaults: function (action) {\n utils.extend(action.defaults, autoStart.defaults.perAction);\n },\n};\n\n// set cursor style on mousedown\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget }) {\n if (interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\n// set cursor style on mousemove\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget }) {\n if (!interaction.mouse\n || interaction.pointerIsDown\n || interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\nInteraction.signals.on('move', function (arg) {\n const { interaction, event } = arg;\n\n if (!interaction.pointerIsDown\n || interaction.interacting()\n || !interaction.pointerWasMoved\n || !interaction.prepared.name) {\n return;\n }\n\n signals.fire('before-start', arg);\n\n const target = interaction.target;\n\n if (interaction.prepared.name && target) {\n // check manualStart and interaction limit\n if (target.options[interaction.prepared.name].manualStart\n || !withinInteractionLimit(target, interaction.element, interaction.prepared)) {\n interaction.stop(event);\n }\n else {\n interaction.start(interaction.prepared, target, interaction.element);\n }\n }\n});\n\n// Check if the current target supports the action.\n// If so, return the validated action. Otherwise, return null\nfunction validateAction (action, interactable, element, eventTarget) {\n if (utils.is.object(action)\n && interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget)\n && interactable.options[action.name].enabled\n && withinInteractionLimit(interactable, element, action)) {\n return action;\n }\n\n return null;\n}\n\nfunction validateSelector (interaction, pointer, event, matches, matchElements, eventTarget) {\n for (let i = 0, len = matches.length; i < len; i++) {\n const match = matches[i];\n const matchElement = matchElements[i];\n const action = validateAction(match.getAction(pointer, event, interaction, matchElement),\n match,\n matchElement,\n eventTarget);\n\n if (action) {\n return {\n action,\n target: match,\n element: matchElement,\n };\n }\n }\n\n return {};\n}\n\nfunction getActionInfo (interaction, pointer, event, eventTarget) {\n let matches = [];\n let matchElements = [];\n\n let element = eventTarget;\n let action = null;\n\n function pushMatches (interactable, selector, context) {\n const elements = (browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined);\n\n if (utils.matchesSelector(element, selector, elements)) {\n\n matches.push(interactable);\n matchElements.push(element);\n }\n }\n\n while (utils.is.element(element)) {\n matches = [];\n matchElements = [];\n\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && (action = validateAction(elementInteractable.getAction(pointer, event, interaction, element, eventTarget),\n elementInteractable,\n element,\n eventTarget))\n && !elementInteractable.options[action.name].manualStart) {\n return {\n element,\n action,\n target: elementInteractable,\n };\n }\n else {\n scope.interactables.forEachSelector(pushMatches, element);\n\n const actionInfo = validateSelector(interaction, pointer, event, matches, matchElements, eventTarget);\n\n if (actionInfo.action\n && !actionInfo.target.options[actionInfo.action.name].manualStart) {\n return actionInfo;\n }\n }\n\n element = utils.parentNode(element);\n }\n\n return {};\n}\n\nfunction prepare (interaction, { action, target, element }) {\n action = action || {};\n\n if (interaction.target && interaction.target.options.styleCursor) {\n interaction.target._doc.documentElement.style.cursor = '';\n }\n\n interaction.target = target;\n interaction.element = element;\n utils.copyAction(interaction.prepared, action);\n\n if (target && target.options.styleCursor) {\n const cursor = action? actions[action.name].getCursor(action) : '';\n interaction.target._doc.documentElement.style.cursor = cursor;\n }\n\n signals.fire('prepared', { interaction: interaction });\n}\n\nInteraction.signals.on('stop', function ({ interaction }) {\n const target = interaction.target;\n\n if (target && target.options.styleCursor) {\n target._doc.documentElement.style.cursor = '';\n }\n});\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (utils.is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (utils.is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n const buttons = event.buttons || ({\n 0: 1,\n 1: 4,\n 3: 8,\n 4: 16,\n })[event.button];\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\nfunction withinInteractionLimit (interactable, element, action) {\n const options = interactable.options;\n const maxActions = options[action.name].max;\n const maxPerElement = options[action.name].maxPerElement;\n let activeInteractions = 0;\n let targetCount = 0;\n let targetElementCount = 0;\n\n // no actions if any of these values == 0\n if (!(maxActions && maxPerElement && autoStart.maxInteractions)) { return; }\n\n for (let i = 0, len = scope.interactions.length; i < len; i++) {\n const interaction = scope.interactions[i];\n const otherAction = interaction.prepared.name;\n\n if (!interaction.interacting()) { continue; }\n\n activeInteractions++;\n\n if (activeInteractions >= autoStart.maxInteractions) {\n return false;\n }\n\n if (interaction.target !== interactable) { continue; }\n\n targetCount += (otherAction === action.name)|0;\n\n if (targetCount >= maxActions) {\n return false;\n }\n\n if (interaction.element === element) {\n targetElementCount++;\n\n if (otherAction !== action.name || targetElementCount >= maxPerElement) {\n return false;\n }\n }\n }\n\n return autoStart.maxInteractions > 0;\n}\n\n/*\\\n * interact.maxInteractions\n [ method ]\n **\n * Returns or sets the maximum number of concurrent interactions allowed.\n * By default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables\n * and elements, you need to enable it in the draggable, resizable and\n * gesturable `'max'` and `'maxPerElement'` options.\n **\n - newValue (number) #optional Any number. newValue <= 0 means no interactions.\n\\*/\ninteract.maxInteractions = function (newValue) {\n if (utils.is.number(newValue)) {\n autoStart.maxInteractions = newValue;\n\n return this;\n }\n\n return autoStart.maxInteractions;\n};\n\nInteractable.settingsMethods.push('styleCursor');\nInteractable.settingsMethods.push('actionChecker');\nInteractable.settingsMethods.push('ignoreFrom');\nInteractable.settingsMethods.push('allowFrom');\n\ndefaultOptions.base.actionChecker = null;\ndefaultOptions.base.styleCursor = true;\n\nutils.extend(defaultOptions.perAction, autoStart.defaults.perAction);\n\nmodule.exports = autoStart;\n","const autoStart = require('./base');\nconst Interaction = require('../Interaction');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.delayTimer = null;\n});\n\nautoStart.signals.on('prepared', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.delayTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.target, interaction.element);\n }, delay);\n }\n});\n\nInteraction.signals.on('move', function ({ interaction, duplicate }) {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.delayTimer);\n }\n});\n\n// prevent regular down->move autoStart\nautoStart.signals.on('before-start', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.prepared.name = null;\n }\n});\n","const autoStart = require('./base');\nconst scope = require('../scope');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\n\nconst { matchesSelector, parentNode } = require('../utils/domUtils');\n\nautoStart.setActionDefaults(require('../actions/drag'));\n\nautoStart.signals.on('before-start', function ({ interaction, eventTarget, dx, dy }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // check if a drag is in the correct axis\n const absX = Math.abs(dx);\n const absY = Math.abs(dy);\n const options = interaction.target.options.drag;\n const startAxis = options.startAxis;\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy');\n\n interaction.prepared.axis = options.lockAxis === 'start'\n ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n : options.lockAxis;\n\n // if the movement isn't in the startAxis of the interactable\n if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) {\n // cancel the prepared action\n interaction.prepared.name = null;\n\n // then try to get a drag from another ineractable\n\n if (!interaction.prepared.name) {\n\n let element = eventTarget;\n\n const getDraggable = function (interactable, selector, context) {\n const elements = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n if (interactable === interaction.target) { return; }\n\n if (!options.manualStart\n && !interactable.testIgnoreAllow(options, element, eventTarget)\n && matchesSelector(element, selector, elements)) {\n\n const action = interactable.getAction(interaction.downPointer,\n interaction.downEvent,\n interaction,\n element);\n\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, interactable)\n && autoStart.validateAction(action, interactable, element, eventTarget)) {\n\n return interactable;\n }\n }\n };\n\n let action = null;\n\n // check all interactables\n while (is.element(element)) {\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && elementInteractable !== interaction.target\n && !elementInteractable.options.drag.manualStart) {\n\n action = elementInteractable.getAction(interaction.downPointer, interaction.downEvent, interaction, element);\n }\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, elementInteractable)) {\n\n interaction.prepared.name = 'drag';\n interaction.target = elementInteractable;\n interaction.element = element;\n break;\n }\n\n const selectorInteractable = scope.interactables.forEachSelector(getDraggable, element);\n\n if (selectorInteractable) {\n interaction.prepared.name = 'drag';\n interaction.target = selectorInteractable;\n interaction.element = element;\n break;\n }\n\n element = parentNode(element);\n }\n }\n }\n});\n\nfunction checkStartAxis (startAxis, interactable) {\n if (!interactable) { return false; }\n\n const thisAxis = interactable.options.drag.startAxis;\n\n return (startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis);\n}\n","require('./base').setActionDefaults(require('../actions/gesture'));\n","require('./base').setActionDefaults(require('../actions/resize'));\n","module.exports = {\n base: {\n accept : null,\n preventDefault: 'auto',\n deltaSource : 'page',\n },\n\n perAction: {\n origin: { x: 0, y: 0 },\n\n // only allow left button by default\n // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n mouseButtons: 1,\n\n inertia: {\n enabled : false,\n resistance : 10, // the lambda in exponential decay\n minSpeed : 100, // target speed must be above this for inertia to start\n endSpeed : 10, // the speed at which inertia is slow enough to stop\n allowResume : true, // allow resuming an action in inertia phase\n smoothEndDuration: 300, // animate to snap/restrict endOnly if there's no inertia\n },\n },\n};\n","/* browser entry point */\n\n// Legacy browser support\nrequire('./legacyBrowsers');\n\n// inertia\nrequire('./inertia');\n\n// modifiers\nrequire('./modifiers/snap');\nrequire('./modifiers/restrict');\n\n// pointerEvents\nrequire('./pointerEvents/base');\nrequire('./pointerEvents/holdRepeat');\nrequire('./pointerEvents/interactableTargets');\n\n// delay\nrequire('./autoStart/delay');\n\n// actions\nrequire('./actions/gesture');\nrequire('./actions/resize');\nrequire('./actions/drag');\nrequire('./actions/drop');\n\n// load these modifiers after resize is loaded\nrequire('./modifiers/snapSize');\nrequire('./modifiers/restrictEdges');\nrequire('./modifiers/restrictSize');\n\n// autoStart actions\nrequire('./autoStart/gesture');\nrequire('./autoStart/resize');\nrequire('./autoStart/drag');\n\n// Interactable preventDefault setting\nrequire('./interactablePreventDefault.js');\n\n// autoScroll\nrequire('./autoScroll');\n\n// export interact\nmodule.exports = require('./interact');\n","const InteractEvent = require('./InteractEvent');\nconst Interaction = require('./Interaction');\nconst modifiers = require('./modifiers');\nconst utils = require('./utils');\nconst animationFrame = require('./utils/raf');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.inertiaStatus = {\n active : false,\n smoothEnd : false,\n allowResume: false,\n\n startEvent: null,\n upCoords : {},\n\n xe: 0, ye: 0,\n sx: 0, sy: 0,\n\n t0: 0,\n vx0: 0, vys: 0,\n duration: 0,\n\n lambda_v0: 0,\n one_ve_v0: 0,\n i : null,\n };\n\n interaction.boundInertiaFrame = () => inertiaFrame .apply(interaction);\n interaction.boundSmoothEndFrame = () => smoothEndFrame.apply(interaction);\n});\n\nInteraction.signals.on('down', function ({ interaction, event, pointer, eventTarget }) {\n const status = interaction.inertiaStatus;\n\n // Check if the down event hits the current inertia target\n if (status.active) {\n let element = eventTarget;\n\n // climb up the DOM tree from the event target\n while (utils.is.element(element)) {\n\n // if interaction element is the current inertia target element\n if (element === interaction.element) {\n // stop inertia\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n\n // update pointers to the down event's coordinates\n interaction.updatePointer(pointer);\n utils.setCoords(interaction.curCoords, interaction.pointers);\n\n // fire appropriate signals\n const signalArg = { interaction };\n Interaction.signals.fire('before-action-move', signalArg);\n Interaction.signals.fire('action-resume' , signalArg);\n\n // fire a reume event\n const resumeEvent = new InteractEvent(interaction,\n event,\n interaction.prepared.name,\n 'inertiaresume',\n interaction.element);\n\n interaction.target.fire(resumeEvent);\n interaction.prevEvent = resumeEvent;\n modifiers.resetStatuses(interaction.modifierStatuses);\n\n utils.copyCoords(interaction.prevCoords, interaction.curCoords);\n break;\n }\n\n element = utils.parentNode(element);\n }\n }\n});\n\nInteraction.signals.on('up', function ({ interaction, event }) {\n const status = interaction.inertiaStatus;\n\n if (!interaction.interacting() || status.active) { return; }\n\n const target = interaction.target;\n const options = target && target.options;\n const inertiaOptions = options && interaction.prepared.name && options[interaction.prepared.name].inertia;\n\n const now = new Date().getTime();\n const statuses = {};\n const page = utils.extend({}, interaction.curCoords.page);\n const pointerSpeed = interaction.pointerDelta.client.speed;\n\n let smoothEnd = false;\n let modifierResult;\n\n // check if inertia should be started\n const inertiaPossible = (inertiaOptions && inertiaOptions.enabled\n && interaction.prepared.name !== 'gesture'\n && event !== status.startEvent);\n\n const inertia = (inertiaPossible\n && (now - interaction.curCoords.timeStamp) < 50\n && pointerSpeed > inertiaOptions.minSpeed\n && pointerSpeed > inertiaOptions.endSpeed);\n\n const modifierArg = {\n interaction,\n pageCoords: page,\n statuses,\n preEnd: true,\n requireEndOnly: true,\n };\n\n // smoothEnd\n if (inertiaPossible && !inertia) {\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n if (modifierResult.shouldMove && modifierResult.locked) {\n smoothEnd = true;\n }\n }\n\n if (!(inertia || smoothEnd)) { return; }\n\n utils.copyCoords(status.upCoords, interaction.curCoords);\n\n interaction.pointers[0] = status.startEvent =\n new InteractEvent(interaction, event, interaction.prepared.name, 'inertiastart', interaction.element);\n\n status.t0 = now;\n\n status.active = true;\n status.allowResume = inertiaOptions.allowResume;\n interaction.simulation = status;\n\n target.fire(status.startEvent);\n\n if (inertia) {\n status.vx0 = interaction.pointerDelta.client.vx;\n status.vy0 = interaction.pointerDelta.client.vy;\n status.v0 = pointerSpeed;\n\n calcInertia(interaction, status);\n\n utils.extend(page, interaction.curCoords.page);\n\n page.x += status.xe;\n page.y += status.ye;\n\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n status.modifiedXe += modifierResult.dx;\n status.modifiedYe += modifierResult.dy;\n\n status.i = animationFrame.request(interaction.boundInertiaFrame);\n }\n else {\n status.smoothEnd = true;\n status.xe = modifierResult.dx;\n status.ye = modifierResult.dy;\n\n status.sx = status.sy = 0;\n\n status.i = animationFrame.request(interaction.boundSmoothEndFrame);\n }\n});\n\nInteraction.signals.on('stop-active', function ({ interaction }) {\n const status = interaction.inertiaStatus;\n\n if (status.active) {\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n }\n});\n\nfunction calcInertia (interaction, status) {\n const inertiaOptions = interaction.target.options[interaction.prepared.name].inertia;\n const lambda = inertiaOptions.resistance;\n const inertiaDur = -Math.log(inertiaOptions.endSpeed / status.v0) / lambda;\n\n status.x0 = interaction.prevEvent.pageX;\n status.y0 = interaction.prevEvent.pageY;\n status.t0 = status.startEvent.timeStamp / 1000;\n status.sx = status.sy = 0;\n\n status.modifiedXe = status.xe = (status.vx0 - inertiaDur) / lambda;\n status.modifiedYe = status.ye = (status.vy0 - inertiaDur) / lambda;\n status.te = inertiaDur;\n\n status.lambda_v0 = lambda / status.v0;\n status.one_ve_v0 = 1 - inertiaOptions.endSpeed / status.v0;\n}\n\nfunction inertiaFrame () {\n updateInertiaCoords(this);\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n\n const status = this.inertiaStatus;\n const options = this.target.options[this.prepared.name].inertia;\n const lambda = options.resistance;\n const t = new Date().getTime() / 1000 - status.t0;\n\n if (t < status.te) {\n\n const progress = 1 - (Math.exp(-lambda * t) - status.lambda_v0) / status.one_ve_v0;\n\n if (status.modifiedXe === status.xe && status.modifiedYe === status.ye) {\n status.sx = status.xe * progress;\n status.sy = status.ye * progress;\n }\n else {\n const quadPoint = utils.getQuadraticCurvePoint(0, 0,\n status.xe,\n status.ye,\n status.modifiedXe,\n status.modifiedYe,\n progress);\n\n status.sx = quadPoint.x;\n status.sy = quadPoint.y;\n }\n\n this.doMove();\n\n status.i = animationFrame.request(this.boundInertiaFrame);\n }\n else {\n status.sx = status.modifiedXe;\n status.sy = status.modifiedYe;\n\n this.doMove();\n this.end(status.startEvent);\n status.active = false;\n this.simulation = null;\n }\n\n utils.copyCoords(this.prevCoords, this.curCoords);\n}\n\nfunction smoothEndFrame () {\n updateInertiaCoords(this);\n\n const status = this.inertiaStatus;\n const t = new Date().getTime() - status.t0;\n const duration = this.target.options[this.prepared.name].inertia.smoothEndDuration;\n\n if (t < duration) {\n status.sx = utils.easeOutQuad(t, 0, status.xe, duration);\n status.sy = utils.easeOutQuad(t, 0, status.ye, duration);\n\n this.pointerMove(status.startEvent, status.startEvent);\n\n status.i = animationFrame.request(this.boundSmoothEndFrame);\n }\n else {\n status.sx = status.xe;\n status.sy = status.ye;\n\n this.pointerMove(status.startEvent, status.startEvent);\n this.end(status.startEvent);\n\n status.smoothEnd =\n status.active = false;\n this.simulation = null;\n }\n}\n\nfunction updateInertiaCoords (interaction) {\n const status = interaction.inertiaStatus;\n\n // return if inertia isn't running\n if (!status.active) { return; }\n\n const pageUp = status.upCoords.page;\n const clientUp = status.upCoords.client;\n\n utils.setCoords(interaction.curCoords, [ {\n pageX : pageUp.x + status.sx,\n pageY : pageUp.y + status.sy,\n clientX: clientUp.x + status.sx,\n clientY: clientUp.y + status.sy,\n } ]);\n}\n","const browser = require('./utils/browser');\nconst events = require('./utils/events');\nconst utils = require('./utils');\nconst scope = require('./scope');\nconst Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\n\nconst globalEvents = {};\n\n/*\\\n * interact\n [ method ]\n *\n * The methods of this variable can be used to set elements as\n * interactables and also to change various default settings.\n *\n * Calling it as a function and passing an element or a valid CSS selector\n * string returns an Interactable object which has various methods to\n * configure it.\n *\n - element (Element | string) The HTML or SVG Element to interact with or CSS selector\n = (object) An @Interactable\n *\n > Usage\n | interact('#draggable').draggable(true);\n |\n | var rectables = interact('rect');\n | rectables\n | .gesturable(true)\n | .on('gesturemove', function (event) {\n | // ...\n | });\n\\*/\nfunction interact (element, options) {\n let interactable = scope.interactables.get(element, options);\n\n if (!interactable) {\n interactable = new Interactable(element, options);\n interactable.events.global = globalEvents;\n }\n\n return interactable;\n}\n\n/*\\\n * interact.isSet\n [ method ]\n *\n * Check if an element has been set\n - element (Element) The Element being searched for\n = (boolean) Indicates if the element or CSS selector was previously passed to interact\n\\*/\ninteract.isSet = function (element, options) {\n return scope.interactables.indexOfElement(element, options && options.context) !== -1;\n};\n\n/*\\\n * interact.on\n [ method ]\n *\n * Adds a global listener for an InteractEvent or adds a DOM event to\n * `document`\n *\n - type (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) interact\n\\*/\ninteract.on = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.on(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.on(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n // if it is an InteractEvent type, add listener to globalEvents\n if (utils.contains(Interactable.eventTypes, type)) {\n // if this type of event was never bound\n if (!globalEvents[type]) {\n globalEvents[type] = [listener];\n }\n else {\n globalEvents[type].push(listener);\n }\n }\n // If non InteractEvent type, addEventListener to document\n else {\n events.add(scope.document, type, listener, { options });\n }\n\n return interact;\n};\n\n/*\\\n * interact.off\n [ method ]\n *\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n - type (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) interact\n \\*/\ninteract.off = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.off(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.off(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n if (!utils.contains(Interactable.eventTypes, type)) {\n events.remove(scope.document, type, listener, options);\n }\n else {\n let index;\n\n if (type in globalEvents\n && (index = utils.indexOf(globalEvents[type], listener)) !== -1) {\n globalEvents[type].splice(index, 1);\n }\n }\n\n return interact;\n};\n\n/*\\\n * interact.debug\n [ method ]\n *\n * Returns an object which exposes internal data\n = (object) An object with properties that outline the current state and expose internal functions and variables\n\\*/\ninteract.debug = function () {\n return scope;\n};\n\n// expose the functions used to calculate multi-touch properties\ninteract.getPointerAverage = utils.pointerAverage;\ninteract.getTouchBBox = utils.touchBBox;\ninteract.getTouchDistance = utils.touchDistance;\ninteract.getTouchAngle = utils.touchAngle;\n\ninteract.getElementRect = utils.getElementRect;\ninteract.getElementClientRect = utils.getElementClientRect;\ninteract.matchesSelector = utils.matchesSelector;\ninteract.closest = utils.closest;\n\n/*\\\n * interact.supportsTouch\n [ method ]\n *\n = (boolean) Whether or not the browser supports touch input\n\\*/\ninteract.supportsTouch = function () {\n return browser.supportsTouch;\n};\n\n/*\\\n * interact.supportsPointerEvent\n [ method ]\n *\n = (boolean) Whether or not the browser supports PointerEvents\n\\*/\ninteract.supportsPointerEvent = function () {\n return browser.supportsPointerEvent;\n};\n\n/*\\\n * interact.stop\n [ method ]\n *\n * Cancels all interactions (end events are not fired)\n *\n - event (Event) An event on which to call preventDefault()\n = (object) interact\n\\*/\ninteract.stop = function (event) {\n for (let i = scope.interactions.length - 1; i >= 0; i--) {\n scope.interactions[i].stop(event);\n }\n\n return interact;\n};\n\n/*\\\n * interact.pointerMoveTolerance\n [ method ]\n * Returns or sets the distance the pointer must be moved before an action\n * sequence occurs. This also affects tolerance for tap events.\n *\n - newValue (number) #optional The movement from the start position must be greater than this value\n = (number | Interactable) The current setting or interact\n\\*/\ninteract.pointerMoveTolerance = function (newValue) {\n if (utils.is.number(newValue)) {\n Interaction.pointerMoveTolerance = newValue;\n\n return this;\n }\n\n return Interaction.pointerMoveTolerance;\n};\n\ninteract.addDocument = scope.addDocument;\ninteract.removeDocument = scope.removeDocument;\n\nscope.interact = interact;\n\nmodule.exports = interact;\n","const Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\nconst scope = require('./scope');\nconst is = require('./utils/is');\nconst events = require('./utils/events');\n\nconst { nodeContains, matchesSelector } = require('./utils/domUtils');\n\n/*\\\n * Interactable.preventDefault\n [ method ]\n *\n * Returns or sets whether to prevent the browser's default behaviour\n * in response to pointer events. Can be set to:\n * - `'always'` to always prevent\n * - `'never'` to never prevent\n * - `'auto'` to let interact.js try to determine what would be best\n *\n - newValue (string) #optional `true`, `false` or `'auto'`\n = (string | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.preventDefault = function (newValue) {\n if (/^(always|never|auto)$/.test(newValue)) {\n this.options.preventDefault = newValue;\n return this;\n }\n\n if (is.bool(newValue)) {\n this.options.preventDefault = newValue? 'always' : 'never';\n return this;\n }\n\n return this.options.preventDefault;\n};\n\nInteractable.prototype.checkAndPreventDefault = function (event) {\n const setting = this.options.preventDefault;\n\n if (setting === 'never') { return; }\n\n if (setting === 'always') {\n event.preventDefault();\n return;\n }\n\n // setting === 'auto'\n\n // don't preventDefault if the browser supports passiveEvents\n // CSS touch-action and user-selecct should be used instead\n if (events.supportsOptions) {\n return;\n }\n\n // don't preventDefault of pointerdown events\n if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) {\n return;\n }\n\n // don't preventDefault on editable elements\n if (is.element(event.target)\n && matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) {\n return;\n }\n\n event.preventDefault();\n};\n\nfunction onInteractionEvent ({ interaction, event }) {\n if (interaction.target) {\n interaction.target.checkAndPreventDefault(event);\n }\n}\n\nfor (const eventSignal of ['down', 'move', 'up', 'cancel']) {\n Interaction.signals.on(eventSignal, onInteractionEvent);\n}\n\n// prevent native HTML5 drag on interact.js target elements\nInteraction.docEvents.dragstart = function preventNativeDrag (event) {\n for (const interaction of scope.interactions) {\n\n if (interaction.element\n && (interaction.element === event.target\n || nodeContains(interaction.element, event.target))) {\n\n interaction.target.checkAndPreventDefault(event);\n return;\n }\n }\n};\n","const scope = require('./scope');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst iFinder = require('./utils/interactionFinder');\nconst pointerEvents = require('./pointerEvents/base');\n\nconst { window } = require('./utils/window');\n\nconst toString = Object.prototype.toString;\n\nif (!window.Array.isArray) {\n window.Array.isArray = function (obj) {\n return toString.call(obj) === '[object Array]';\n };\n}\n\nif (!String.prototype.trim) {\n String.prototype.trim = function () {\n return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n };\n}\n\n// http://www.quirksmode.org/dom/events/click.html\n// >Events leading to dblclick\n//\n// IE8 doesn't fire down event before dblclick.\n// This workaround tries to fire a tap and doubletap after dblclick\nfunction onIE8Dblclick (event) {\n const eventTarget = event.target;\n const interaction = iFinder.search(event, event.type, eventTarget);\n\n if (!interaction) { return; }\n\n if (interaction.prevTap\n && event.clientX === interaction.prevTap.clientX\n && event.clientY === interaction.prevTap.clientY\n && eventTarget === interaction.prevTap.target) {\n\n interaction.downTargets[0] = eventTarget;\n interaction.downTimes [0] = new Date().getTime();\n\n pointerEvents.fire({\n interaction,\n event,\n eventTarget,\n pointer: event,\n type: 'tap',\n });\n }\n}\n\nif (browser.isIE8) {\n const selectFix = function (event) {\n for (const interaction of scope.interactions) {\n if (interaction.interacting()) {\n interaction.target.checkAndPreventDefault(event);\n }\n }\n };\n\n const onDocIE8 = function onDocIE8 ({ doc, win }, signalName) {\n const eventMethod = signalName.indexOf('listen') === 0\n ? events.add : events.remove;\n\n // For IE's lack of Event#preventDefault\n eventMethod(doc, 'selectstart', selectFix);\n\n if (pointerEvents) {\n eventMethod(doc, 'dblclick', onIE8Dblclick);\n }\n };\n\n scope.signals.on('add-document' , onDocIE8);\n scope.signals.on('remove-document', onDocIE8);\n}\n\nmodule.exports = null;\n","const InteractEvent = require('../InteractEvent');\nconst Interaction = require('../Interaction');\nconst extend = require('../utils/extend');\n\nconst modifiers = {\n names: [],\n\n setOffsets: function (arg) {\n const { interaction, pageCoords: page } = arg;\n const { target, element, startOffset } = interaction;\n const rect = target.getRect(element);\n\n if (rect) {\n startOffset.left = page.x - rect.left;\n startOffset.top = page.y - rect.top;\n\n startOffset.right = rect.right - page.x;\n startOffset.bottom = rect.bottom - page.y;\n\n if (!('width' in rect)) { rect.width = rect.right - rect.left; }\n if (!('height' in rect)) { rect.height = rect.bottom - rect.top ; }\n }\n else {\n startOffset.left = startOffset.top = startOffset.right = startOffset.bottom = 0;\n }\n\n arg.rect = rect;\n arg.interactable = target;\n arg.element = element;\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n\n arg.options = target.options[interaction.prepared.name][modifierName];\n\n if (!arg.options) {\n continue;\n }\n\n interaction.modifierOffsets[modifierName] = modifiers[modifierName].setOffset(arg);\n }\n },\n\n setAll: function (arg) {\n const { interaction, statuses, preEnd, requireEndOnly } = arg;\n const coords = extend({}, arg.pageCoords);\n const result = {\n dx: 0,\n dy: 0,\n changed: false,\n locked: false,\n shouldMove: true,\n };\n\n for (const modifierName of modifiers.names) {\n const modifier = modifiers[modifierName];\n const options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!shouldDo(options, preEnd, requireEndOnly)) { continue; }\n\n arg.status = arg.status = statuses[modifierName];\n arg.options = options;\n arg.offset = arg.interaction.modifierOffsets[modifierName];\n\n modifier.set(arg);\n\n if (arg.status.locked) {\n coords.x += arg.status.dx;\n coords.y += arg.status.dy;\n\n result.dx += arg.status.dx;\n result.dy += arg.status.dy;\n\n result.locked = true;\n }\n }\n\n // a move should be fired if:\n // - there are no modifiers enabled,\n // - no modifiers are \"locked\" i.e. have changed the pointer's coordinates, or\n // - the locked coords have changed since the last pointer move\n result.shouldMove = !arg.status || !result.locked || arg.status.changed;\n\n return result;\n },\n\n resetStatuses: function (statuses) {\n for (const modifierName of modifiers.names) {\n const status = statuses[modifierName] || {};\n\n status.dx = status.dy = 0;\n status.modifiedX = status.modifiedY = NaN;\n status.locked = false;\n status.changed = true;\n\n statuses[modifierName] = status;\n }\n\n return statuses;\n },\n\n start: function ({ interaction }, signalName) {\n const arg = {\n interaction,\n pageCoords: (signalName === 'action-resume' ?\n interaction.curCoords : interaction.startCoords).page,\n startOffset: interaction.startOffset,\n statuses: interaction.modifierStatuses,\n preEnd: false,\n requireEndOnly: false,\n };\n\n modifiers.setOffsets(arg);\n modifiers.resetStatuses(arg.statuses);\n\n arg.pageCoords = extend({}, interaction.startCoords.page);\n interaction.modifierResult = modifiers.setAll(arg);\n },\n};\n\nInteraction.signals.on('new', function (interaction) {\n interaction.startOffset = { left: 0, right: 0, top: 0, bottom: 0 };\n interaction.modifierOffsets = {};\n interaction.modifierStatuses = modifiers.resetStatuses({});\n interaction.modifierResult = null;\n});\n\nInteraction.signals.on('action-start' , modifiers.start);\nInteraction.signals.on('action-resume', modifiers.start);\n\nInteraction.signals.on('before-action-move', function ({ interaction, preEnd, interactingBeforeMove }) {\n const modifierResult = modifiers.setAll({\n interaction,\n preEnd,\n pageCoords: interaction.curCoords.page,\n statuses: interaction.modifierStatuses,\n requireEndOnly: false,\n });\n\n // don't fire an action move if a modifier would keep the event in the same\n // cordinates as before\n if (!modifierResult.shouldMove && interactingBeforeMove) {\n interaction._dontFireMove = true;\n }\n\n interaction.modifierResult = modifierResult;\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n for (let i = 0; i < modifiers.names.length; i++) {\n const options = interaction.target.options[interaction.prepared.name][modifiers.names[i]];\n\n // if the endOnly option is true for any modifier\n if (shouldDo(options, true, true)) {\n // fire a move event at the modified coordinates\n interaction.doMove({ event, preEnd: true });\n break;\n }\n }\n});\n\nInteractEvent.signals.on('set-xy', function (arg) {\n const { iEvent, interaction } = arg;\n const modifierArg = extend({}, arg);\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n modifierArg.options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!modifierArg.options) {\n continue;\n }\n\n const modifier = modifiers[modifierName];\n\n modifierArg.status = interaction.modifierStatuses[modifierName];\n\n iEvent[modifierName] = modifier.modifyCoords(modifierArg);\n }\n});\n\nfunction shouldDo (options, preEnd, requireEndOnly) {\n return (options && options.enabled\n && (preEnd || !options.endOnly)\n && (!requireEndOnly || options.endOnly));\n}\n\nmodule.exports = modifiers;\n","const modifiers = require('./index');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst restrict = {\n defaults: {\n enabled : false,\n endOnly : false,\n restriction: null,\n elementRect: null,\n },\n\n setOffset: function ({ rect, startOffset, options }) {\n const elementRect = options && options.elementRect;\n const offset = {};\n\n if (rect && elementRect) {\n offset.left = startOffset.left - (rect.width * elementRect.left);\n offset.top = startOffset.top - (rect.height * elementRect.top);\n\n offset.right = startOffset.right - (rect.width * (1 - elementRect.right));\n offset.bottom = startOffset.bottom - (rect.height * (1 - elementRect.bottom));\n }\n else {\n offset.left = offset.top = offset.right = offset.bottom = 0;\n }\n\n return offset;\n },\n\n set: function ({ pageCoords, interaction, status, options }) {\n if (!options) { return status; }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n\n const restriction = getRestrictionRect(options.restriction, interaction, page);\n\n if (!restriction) { return status; }\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n const rect = restriction;\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n const offset = interaction.modifierOffsets.restrict;\n\n // object is assumed to have\n // x, y, width, height or\n // left, top, right, bottom\n if ('x' in restriction && 'y' in restriction) {\n modifiedX = Math.max(Math.min(rect.x + rect.width - offset.right , page.x), rect.x + offset.left);\n modifiedY = Math.max(Math.min(rect.y + rect.height - offset.bottom, page.y), rect.y + offset.top );\n }\n else {\n modifiedX = Math.max(Math.min(rect.right - offset.right , page.x), rect.left + offset.left);\n modifiedY = Math.max(Math.min(rect.bottom - offset.bottom, page.y), rect.top + offset.top );\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const elementRect = options && options.elementRect;\n\n if (options && options.enabled\n && !(phase === 'start' && elementRect && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n getRestrictionRect,\n};\n\nfunction getRestrictionRect (value, interaction, page) {\n if (utils.is.function(value)) {\n return utils.resolveRectLike(value, interaction.target, interaction.element, [page.x, page.y, interaction]);\n } else {\n return utils.resolveRectLike(value, interaction.target, interaction.element);\n }\n}\n\nmodifiers.restrict = restrict;\nmodifiers.names.push('restrict');\n\ndefaultOptions.perAction.restrict = restrict.defaults;\n\nmodule.exports = restrict;\n","// This module adds the options.resize.restrictEdges setting which sets min and\n// max for the top, left, bottom and right edges of the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictEdges: {\n// inner: { top: 200, left: 200, right: 400, bottom: 400 },\n// outer: { top: 0, left: 0, right: 600, bottom: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst { getRestrictionRect } = require('./restrict');\n\nconst noInner = { top: +Infinity, left: +Infinity, bottom: -Infinity, right: -Infinity };\nconst noOuter = { top: -Infinity, left: -Infinity, bottom: +Infinity, right: +Infinity };\n\nconst restrictEdges = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n offset: null,\n },\n\n setOffset: function ({ interaction, startOffset, options }) {\n if (!options) {\n return utils.extend({}, startOffset);\n }\n\n const offset = getRestrictionRect(options.offset, interaction, interaction.startCoords.page);\n\n if (offset) {\n return {\n top: startOffset.top + offset.y,\n left: startOffset.left + offset.x,\n bottom: startOffset.bottom + offset.y,\n right: startOffset.right + offset.x,\n };\n }\n\n return startOffset;\n },\n\n set: function ({ pageCoords, interaction, status, offset, options }) {\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n const inner = rectUtils.xywhToTlbr(getRestrictionRect(options.inner, interaction, page)) || noInner;\n const outer = rectUtils.xywhToTlbr(getRestrictionRect(options.outer, interaction, page)) || noOuter;\n\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n if (edges.top) {\n modifiedY = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top);\n }\n else if (edges.bottom) {\n modifiedY = Math.max(Math.min(outer.bottom - offset.bottom, page.y), inner.bottom - offset.bottom);\n }\n if (edges.left) {\n modifiedX = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left);\n }\n else if (edges.right) {\n modifiedX = Math.max(Math.min(outer.right - offset.right, page.x), inner.right - offset.right);\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n if (options && options.enabled\n && !(phase === 'start' && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n noInner,\n noOuter,\n getRestrictionRect,\n};\n\nmodifiers.restrictEdges = restrictEdges;\nmodifiers.names.push('restrictEdges');\n\ndefaultOptions.perAction.restrictEdges = restrictEdges.defaults;\nresize.defaults.restrictEdges = restrictEdges.defaults;\n\nmodule.exports = restrictEdges;\n","// This module adds the options.resize.restrictSize setting which sets min and\n// max width and height for the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictSize: {\n// min: { width: -600, height: -600 },\n// max: { width: 600, height: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst restrictEdges = require('./restrictEdges');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst noMin = { width: -Infinity, height: -Infinity };\nconst noMax = { width: +Infinity, height: +Infinity };\n\nconst restrictSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n },\n\n setOffset: function ({ interaction }) {\n return interaction.startOffset;\n },\n\n set: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const rect = rectUtils.xywhToTlbr(interaction.resizeRects.inverted);\n\n const minSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.min, interaction)) || noMin;\n const maxSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.max, interaction)) || noMax;\n\n arg.options = {\n enabled: options.enabled,\n endOnly: options.endOnly,\n inner: utils.extend({}, restrictEdges.noInner),\n outer: utils.extend({}, restrictEdges.noOuter),\n };\n\n if (edges.top) {\n arg.options.inner.top = rect.bottom - minSize.height;\n arg.options.outer.top = rect.bottom - maxSize.height;\n }\n else if (edges.bottom) {\n arg.options.inner.bottom = rect.top + minSize.height;\n arg.options.outer.bottom = rect.top + maxSize.height;\n }\n if (edges.left) {\n arg.options.inner.left = rect.right - minSize.width;\n arg.options.outer.left = rect.right - maxSize.width;\n }\n else if (edges.right) {\n arg.options.inner.right = rect.left + minSize.width;\n arg.options.outer.right = rect.left + maxSize.width;\n }\n\n restrictEdges.set(arg);\n },\n\n modifyCoords: restrictEdges.modifyCoords,\n};\n\nmodifiers.restrictSize = restrictSize;\nmodifiers.names.push('restrictSize');\n\ndefaultOptions.perAction.restrictSize = restrictSize.defaults;\nresize.defaults.restrictSize = restrictSize.defaults;\n\nmodule.exports = restrictSize;\n","const modifiers = require('./index');\nconst interact = require('../interact');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst snap = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n\n relativePoints: null,\n },\n\n setOffset: function ({ interaction, interactable, element, rect, startOffset, options }) {\n const offsets = [];\n const optionsOrigin = utils.rectToXY(utils.resolveRectLike(options.origin));\n const origin = optionsOrigin || utils.getOriginXY(interactable, element, interaction.prepared.name);\n options = options || interactable.options[interaction.prepared.name].snap || {};\n\n let snapOffset;\n\n if (options.offset === 'startCoords') {\n snapOffset = {\n x: interaction.startCoords.page.x - origin.x,\n y: interaction.startCoords.page.y - origin.y,\n };\n }\n else {\n const offsetRect = utils.resolveRectLike(options.offset, interactable, element, [interaction]);\n\n snapOffset = utils.rectToXY(offsetRect) || { x: 0, y: 0 };\n }\n\n if (rect && options.relativePoints && options.relativePoints.length) {\n for (const { x: relativeX, y: relativeY } of options.relativePoints) {\n offsets.push({\n x: startOffset.left - (rect.width * relativeX) + snapOffset.x,\n y: startOffset.top - (rect.height * relativeY) + snapOffset.y,\n });\n }\n }\n else {\n offsets.push(snapOffset);\n }\n\n return offsets;\n },\n\n set: function ({ interaction, pageCoords, status, options, offset: offsets }) {\n const targets = [];\n let target;\n let page;\n let i;\n\n if (status.useStatusXY) {\n page = { x: status.x, y: status.y };\n }\n else {\n const origin = utils.getOriginXY(interaction.target, interaction.element, interaction.prepared.name);\n\n page = utils.extend({}, pageCoords);\n\n page.x -= origin.x;\n page.y -= origin.y;\n }\n\n status.realX = page.x;\n status.realY = page.y;\n\n let len = options.targets? options.targets.length : 0;\n\n for (const { x: offsetX, y: offsetY } of offsets) {\n const relativeX = page.x - offsetX;\n const relativeY = page.y - offsetY;\n\n for (const snapTarget of options.targets) {\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n targets.push({\n x: utils.is.number(target.x) ? (target.x + offsetX) : relativeX,\n y: utils.is.number(target.y) ? (target.y + offsetY) : relativeY,\n\n range: utils.is.number(target.range)? target.range: options.range,\n });\n }\n }\n\n const closest = {\n target: null,\n inRange: false,\n distance: 0,\n range: 0,\n dx: 0,\n dy: 0,\n };\n\n for (i = 0, len = targets.length; i < len; i++) {\n target = targets[i];\n\n const range = target.range;\n const dx = target.x - page.x;\n const dy = target.y - page.y;\n const distance = utils.hypot(dx, dy);\n let inRange = distance <= range;\n\n // Infinite targets count as being out of range\n // compared to non infinite ones that are in range\n if (range === Infinity && closest.inRange && closest.range !== Infinity) {\n inRange = false;\n }\n\n if (!closest.target || (inRange\n // is the closest target in range?\n ? (closest.inRange && range !== Infinity\n // the pointer is relatively deeper in this target\n ? distance / range < closest.distance / closest.range\n // this target has Infinite range and the closest doesn't\n : (range === Infinity && closest.range !== Infinity)\n // OR this target is closer that the previous closest\n || distance < closest.distance)\n // The other is not in range and the pointer is closer to this target\n : (!closest.inRange && distance < closest.distance))) {\n\n closest.target = target;\n closest.distance = distance;\n closest.range = range;\n closest.inRange = inRange;\n closest.dx = dx;\n closest.dy = dy;\n\n status.range = range;\n }\n }\n\n let snapChanged;\n\n if (closest.target) {\n snapChanged = (status.modifiedX !== closest.target.x || status.modifiedY !== closest.target.y);\n\n status.modifiedX = closest.target.x;\n status.modifiedY = closest.target.y;\n }\n else {\n snapChanged = true;\n\n status.modifiedX = NaN;\n status.modifiedY = NaN;\n }\n\n status.dx = closest.dx;\n status.dy = closest.dy;\n\n status.changed = (snapChanged || (closest.inRange && !status.locked));\n status.locked = closest.inRange;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const relativePoints = options && options.relativePoints;\n\n if (options && options.enabled\n && !(phase === 'start' && relativePoints && relativePoints.length)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n }\n\n return {\n range : status.range,\n locked : status.locked,\n x : status.modifiedX,\n y : status.modifiedY,\n realX : status.realX,\n realY : status.realY,\n dx : status.dx,\n dy : status.dy,\n };\n }\n },\n};\n\ninteract.createSnapGrid = function (grid) {\n return function (x, y) {\n const limits = grid.limits || {\n left : -Infinity,\n right : Infinity,\n top : -Infinity,\n bottom: Infinity,\n };\n let offsetX = 0;\n let offsetY = 0;\n\n if (utils.is.object(grid.offset)) {\n offsetX = grid.offset.x;\n offsetY = grid.offset.y;\n }\n\n const gridx = Math.round((x - offsetX) / grid.x);\n const gridy = Math.round((y - offsetY) / grid.y);\n\n const newX = Math.max(limits.left, Math.min(limits.right , gridx * grid.x + offsetX));\n const newY = Math.max(limits.top , Math.min(limits.bottom, gridy * grid.y + offsetY));\n\n return {\n x: newX,\n y: newY,\n range: grid.range,\n };\n };\n};\n\nmodifiers.snap = snap;\nmodifiers.names.push('snap');\n\ndefaultOptions.perAction.snap = snap.defaults;\n\nmodule.exports = snap;\n","// This module allows snapping of the size of targets during resize\n// interactions.\n\nconst modifiers = require('./index');\nconst snap = require('./snap');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\nconst utils = require('../utils/');\n\nconst snapSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n },\n\n setOffset: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.edges;\n\n if (!edges) { return; }\n\n arg.options = {\n relativePoints: [{\n x: edges.left? 0 : 1,\n y: edges.top ? 0 : 1,\n }],\n origin: { x: 0, y: 0 },\n offset: 'self',\n range: options.range,\n };\n\n const offsets = snap.setOffset(arg);\n arg.options = options;\n\n return offsets;\n },\n\n set: function (arg) {\n const { interaction, options, offset, pageCoords } = arg;\n const page = utils.extend({}, pageCoords);\n const relativeX = page.x - offset[0].x;\n const relativeY = page.y - offset[0].y;\n\n arg.options = utils.extend({}, options);\n arg.options.targets = [];\n\n for (const snapTarget of options.targets) {\n let target;\n\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n if ('width' in target && 'height' in target) {\n target.x = target.width;\n target.y = target.height;\n }\n\n arg.options.targets.push(target);\n }\n\n snap.set(arg);\n },\n\n modifyCoords: function (arg) {\n const { options } = arg;\n\n arg.options = utils.extend({}, options);\n arg.options.enabled = options.enabled;\n arg.options.relativePoints = [null];\n\n snap.modifyCoords(arg);\n },\n};\n\nmodifiers.snapSize = snapSize;\nmodifiers.names.push('snapSize');\n\ndefaultOptions.perAction.snapSize = snapSize.defaults;\nresize.defaults.snapSize = snapSize.defaults;\n\nmodule.exports = snapSize;\n","const pointerUtils = require('../utils/pointerUtils');\n\nmodule.exports = class PointerEvent {\n constructor (type, pointer, event, eventTarget, interaction) {\n pointerUtils.pointerExtend(this, event);\n\n if (event !== pointer) {\n pointerUtils.pointerExtend(this, pointer);\n }\n\n this.interaction = interaction;\n\n this.timeStamp = new Date().getTime();\n this.originalEvent = event;\n this.type = type;\n this.pointerId = pointerUtils.getPointerId(pointer);\n this.pointerType = pointerUtils.getPointerType(pointer);\n this.target = eventTarget;\n this.currentTarget = null;\n\n if (type === 'tap') {\n const pointerIndex = interaction.getPointerIndex(pointer);\n this.dt = this.timeStamp - interaction.downTimes[pointerIndex];\n\n const interval = this.timeStamp - interaction.tapTime;\n\n this.double = !!(interaction.prevTap\n && interaction.prevTap.type !== 'doubletap'\n && interaction.prevTap.target === this.target\n && interval < 500);\n }\n else if (type === 'doubletap') {\n this.dt = pointer.timeStamp - interaction.tapTime;\n }\n }\n\n subtractOrigin ({ x: originX, y: originY }) {\n this.pageX -= originX;\n this.pageY -= originY;\n this.clientX -= originX;\n this.clientY -= originY;\n\n return this;\n }\n\n addOrigin ({ x: originX, y: originY }) {\n this.pageX += originX;\n this.pageY += originY;\n this.clientX += originX;\n this.clientY += originY;\n\n return this;\n }\n\n preventDefault () {\n this.originalEvent.preventDefault();\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n};\n","const PointerEvent = require('./PointerEvent');\nconst Interaction = require('../Interaction');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst defaults = require('../defaultOptions');\nconst signals = require('../utils/Signals').new();\nconst { filter } = require('../utils/arr');\n\nconst simpleSignals = [ 'down', 'up', 'cancel' ];\nconst simpleEvents = [ 'down', 'up', 'cancel' ];\n\nconst pointerEvents = {\n PointerEvent,\n fire,\n collectEventTargets,\n signals,\n defaults: {\n holdDuration: 600,\n ignoreFrom : null,\n allowFrom : null,\n origin : { x: 0, y: 0 },\n },\n types: [\n 'down',\n 'move',\n 'up',\n 'cancel',\n 'tap',\n 'doubletap',\n 'hold',\n ],\n};\n\nfunction fire (arg) {\n const {\n interaction, pointer, event, eventTarget,\n type = arg.pointerEvent.type,\n targets = collectEventTargets(arg),\n pointerEvent = new PointerEvent(type, pointer, event, eventTarget, interaction),\n } = arg;\n\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n targets,\n type,\n pointerEvent,\n };\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n\n for (const prop in target.props || {}) {\n pointerEvent[prop] = target.props[prop];\n }\n\n const origin = utils.getOriginXY(target.eventable, target.element);\n\n pointerEvent.subtractOrigin(origin);\n pointerEvent.eventable = target.eventable;\n pointerEvent.currentTarget = target.element;\n\n target.eventable.fire(pointerEvent);\n\n pointerEvent.addOrigin(origin);\n\n if (pointerEvent.immediatePropagationStopped\n || (pointerEvent.propagationStopped\n && (i + 1) < targets.length && targets[i + 1].element !== pointerEvent.currentTarget)) {\n break;\n }\n }\n\n signals.fire('fired', signalArg);\n\n if (type === 'tap') {\n // if pointerEvent should make a double tap, create and fire a doubletap\n // PointerEvent and use that as the prevTap\n const prevTap = pointerEvent.double\n ? fire({\n interaction, pointer, event, eventTarget,\n type: 'doubletap',\n })\n : pointerEvent;\n\n interaction.prevTap = prevTap;\n interaction.tapTime = prevTap.timeStamp;\n }\n\n return pointerEvent;\n}\n\nfunction collectEventTargets ({ interaction, pointer, event, eventTarget, type }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n // do not fire a tap event if the pointer was moved before being lifted\n if (type === 'tap' && (interaction.pointerWasMoved\n // or if the pointerup target is different to the pointerdown target\n || !(interaction.downTargets[pointerIndex] && interaction.downTargets[pointerIndex] === eventTarget))) {\n return [];\n }\n\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n path,\n targets: [],\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (type === 'hold') {\n signalArg.targets = filter(signalArg.targets, target =>\n target.eventable.options.holdDuration === interaction.holdTimers[pointerIndex].duration);\n }\n\n return signalArg.targets;\n}\n\nInteraction.signals.on('update-pointer-down', function ({ interaction, pointerIndex }) {\n interaction.holdTimers[pointerIndex] = { duration: Infinity, timeout: null };\n});\n\nInteraction.signals.on('remove-pointer', function ({ interaction, pointerIndex }) {\n interaction.holdTimers.splice(pointerIndex, 1);\n});\n\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget, duplicateMove }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n if (!duplicateMove && (!interaction.pointerIsDown || interaction.pointerWasMoved)) {\n if (interaction.pointerIsDown) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n\n fire({\n interaction, pointer, event, eventTarget,\n type: 'move',\n });\n }\n});\n\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget, pointerIndex }) {\n // copy event to be used in timeout for IE8\n const eventCopy = browser.isIE8? utils.extend({}, event) : event;\n\n const timer = interaction.holdTimers[pointerIndex];\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'hold',\n targets: [],\n path,\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (!signalArg.targets.length) { return; }\n\n let minDuration = Infinity;\n\n for (let i = 0; i < signalArg.targets.length; i++) {\n const target = signalArg.targets[i];\n const holdDuration = target.eventable.options.holdDuration;\n\n if (holdDuration < minDuration) {\n minDuration = holdDuration;\n }\n }\n\n timer.duration = minDuration;\n timer.timeout = setTimeout(function () {\n fire({\n interaction,\n eventTarget,\n pointer: browser.isIE8? eventCopy : pointer,\n event: eventCopy,\n type: 'hold',\n });\n }, minDuration);\n});\n\nInteraction.signals.on('up', ({ interaction, pointer, event, eventTarget }) => {\n if (!interaction.pointerWasMoved) {\n fire({ interaction, eventTarget, pointer, event, type: 'tap' });\n }\n});\n\n['up', 'cancel'].forEach(function (signalName) {\n Interaction.signals.on(signalName, function ({ interaction, pointerIndex }) {\n if (interaction.holdTimers[pointerIndex]) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n });\n});\n\nfunction createSignalListener (type) {\n return function ({ interaction, pointer, event, eventTarget }) {\n fire({ interaction, eventTarget, pointer, event, type });\n };\n}\n\nfor (let i = 0; i < simpleSignals.length; i++) {\n Interaction.signals.on(simpleSignals[i], createSignalListener(simpleEvents[i]));\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.prevTap = null; // the most recent tap event on this interaction\n interaction.tapTime = 0; // time of the most recent tap event\n interaction.holdTimers = []; // [{ duration, timeout }]\n});\n\ndefaults.pointerEvents = pointerEvents.defaults;\nmodule.exports = pointerEvents;\n","const pointerEvents = require('./base');\nconst Interaction = require('../Interaction');\n\npointerEvents.signals.on('new', onNew);\npointerEvents.signals.on('fired', onFired);\n\nfor (const signal of ['move', 'up', 'cancel', 'endall']) {\n Interaction.signals.on(signal, endHoldRepeat);\n}\n\nfunction onNew ({ pointerEvent }) {\n if (pointerEvent.type !== 'hold') { return; }\n\n pointerEvent.count = (pointerEvent.count || 0) + 1;\n}\n\nfunction onFired ({ interaction, pointerEvent, eventTarget, targets }) {\n if (pointerEvent.type !== 'hold' || !targets.length) { return; }\n\n // get the repeat interval from the first eventable\n const interval = targets[0].eventable.options.holdRepeatInterval;\n\n // don't repeat if the interval is 0 or less\n if (interval <= 0) { return; }\n\n // set a timeout to fire the holdrepeat event\n interaction.holdIntervalHandle = setTimeout(function () {\n pointerEvents.fire({\n interaction,\n eventTarget,\n type: 'hold',\n pointer: pointerEvent,\n event: pointerEvent,\n });\n }, interval);\n}\n\nfunction endHoldRepeat ({ interaction }) {\n // set the interaction's holdStopTime property\n // to stop further holdRepeat events\n if (interaction.holdIntervalHandle) {\n clearInterval(interaction.holdIntervalHandle);\n interaction.holdIntervalHandle = null;\n }\n}\n\n// don't repeat by default\npointerEvents.defaults.holdRepeatInterval = 0;\npointerEvents.types.push('holdrepeat');\n\nmodule.exports = {\n onNew,\n onFired,\n endHoldRepeat,\n};\n","const pointerEvents = require('./base');\nconst Interactable = require('../Interactable');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\nconst scope = require('../scope');\nconst extend = require('../utils/extend');\nconst { merge } = require('../utils/arr');\n\npointerEvents.signals.on('collect-targets', function ({ targets, element, type, eventTarget }) {\n function collectSelectors (interactable, selector, context) {\n const els = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && is.element(element)\n && domUtils.matchesSelector(element, selector, els)\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n const interactable = scope.interactables.get(element);\n\n if (interactable) {\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n scope.interactables.forEachSelector(collectSelectors, element);\n});\n\nInteractable.signals.on('new', function ({ interactable }) {\n interactable.events.getRect = function (element) {\n return interactable.getRect(element);\n };\n});\n\nInteractable.signals.on('set', function ({ interactable, options }) {\n extend(interactable.events.options, pointerEvents.defaults);\n extend(interactable.events.options, options);\n});\n\nmerge(Interactable.eventTypes, pointerEvents.types);\n\nInteractable.prototype.pointerEvents = function (options) {\n extend(this.events.options, options);\n\n return this;\n};\n\nconst __backCompatOption = Interactable.prototype._backCompatOption;\n\nInteractable.prototype._backCompatOption = function (optionName, newValue) {\n const ret = __backCompatOption.call(this, optionName, newValue);\n\n if (ret === this) {\n this.events.options[optionName] = newValue;\n }\n\n return ret;\n};\n\nInteractable.settingsMethods.push('pointerEvents');\n","const utils = require('./utils');\nconst events = require('./utils/events');\nconst signals = require('./utils/Signals').new();\n\nconst scope = {\n signals,\n events,\n utils,\n\n // main document\n document: require('./utils/domObjects').document,\n // all documents being listened to\n documents: [],\n\n addDocument: function (doc, win) {\n // do nothing if document is already known\n if (utils.contains(scope.documents, doc)) { return false; }\n\n win = win || scope.getWindow(doc);\n\n scope.documents.push(doc);\n events.documents.push(doc);\n\n // don't add an unload event for the main document\n // so that the page may be cached in browser history\n if (doc !== scope.document) {\n events.add(win, 'unload', scope.onWindowUnload);\n }\n\n signals.fire('add-document', { doc, win });\n },\n\n removeDocument: function (doc, win) {\n const index = utils.indexOf(scope.documents, doc);\n\n win = win || scope.getWindow(doc);\n\n events.remove(win, 'unload', scope.onWindowUnload);\n\n scope.documents.splice(index, 1);\n events.documents.splice(index, 1);\n\n signals.fire('remove-document', { win, doc });\n },\n\n onWindowUnload: function () {\n scope.removeDocument(this.document, this);\n },\n};\n\nmodule.exports = scope;\n","const { indexOf } = require('./arr');\n\nclass Signals {\n constructor () {\n this.listeners = {\n // signalName: [listeners],\n };\n }\n\n on (name, listener) {\n if (!this.listeners[name]) {\n this.listeners[name] = [listener];\n return;\n }\n\n this.listeners[name].push(listener);\n }\n\n off (name, listener) {\n if (!this.listeners[name]) { return; }\n\n const index = indexOf(this.listeners[name], listener);\n\n if (index !== -1) {\n this.listeners[name].splice(index, 1);\n }\n }\n\n fire (name, arg) {\n const targetListeners = this.listeners[name];\n\n if (!targetListeners) { return; }\n\n for (let i = 0; i < targetListeners.length; i++) {\n if (targetListeners[i](arg, name) === false) {\n return;\n }\n }\n }\n}\n\nSignals.new = function () {\n return new Signals();\n};\n\nmodule.exports = Signals;\n","function indexOf (array, target) {\n for (let i = 0, len = array.length; i < len; i++) {\n if (array[i] === target) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction contains (array, target) {\n return indexOf(array, target) !== -1;\n}\n\nfunction merge (target, source) {\n for (let i = 0; i < source.length; i++) {\n target.push(source[i]);\n }\n\n return target;\n}\n\nfunction filter (array, test) {\n const result = [];\n\n for (let i = 0; i < array.length; i++) {\n if (test(array[i])) {\n result.push(array[i]);\n }\n }\n\n return result;\n}\n\nmodule.exports = {\n indexOf,\n contains,\n merge,\n filter,\n};\n","const { window } = require('./window');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst Element = domObjects.Element;\nconst navigator = window.navigator;\n\nconst browser = {\n // Does the browser support touch input?\n supportsTouch: !!(('ontouchstart' in window) || is.function(window.DocumentTouch)\n && domObjects.document instanceof window.DocumentTouch),\n\n // Does the browser support PointerEvents\n supportsPointerEvent: !!domObjects.PointerEvent,\n\n isIE8: ('attachEvent' in window) && !('addEventListener' in window),\n\n // Opera Mobile must be handled differently\n isOperaMobile: (navigator.appName === 'Opera'\n && browser.supportsTouch\n && navigator.userAgent.match('Presto')),\n\n // scrolling doesn't change the result of getClientRects on iOS 7\n isIOS7: (/iP(hone|od|ad)/.test(navigator.platform)\n && /OS 7[^\\d]/.test(navigator.appVersion)),\n\n isIe9OrOlder: /MSIE (8|9)/.test(navigator.userAgent),\n\n // prefix matchesSelector\n prefixedMatchesSelector: 'matches' in Element.prototype\n ? 'matches': 'webkitMatchesSelector' in Element.prototype\n ? 'webkitMatchesSelector': 'mozMatchesSelector' in Element.prototype\n ? 'mozMatchesSelector': 'oMatchesSelector' in Element.prototype\n ? 'oMatchesSelector': 'msMatchesSelector',\n\n useMatchesSelectorPolyfill: false,\n\n pEventTypes: (domObjects.PointerEvent\n ? (domObjects.PointerEvent === window.MSPointerEvent\n ? {\n up: 'MSPointerUp',\n down: 'MSPointerDown',\n over: 'mouseover',\n out: 'mouseout',\n move: 'MSPointerMove',\n cancel: 'MSPointerCancel',\n }\n : {\n up: 'pointerup',\n down: 'pointerdown',\n over: 'pointerover',\n out: 'pointerout',\n move: 'pointermove',\n cancel: 'pointercancel',\n })\n : null),\n\n // because Webkit and Opera still use 'mousewheel' event type\n wheelEvent: 'onmousewheel' in domObjects.document? 'mousewheel': 'wheel',\n\n};\n\nbrowser.useMatchesSelectorPolyfill = !is.function(Element.prototype[browser.prefixedMatchesSelector]);\n\nmodule.exports = browser;\n","const domObjects = {};\nconst win = require('./window').window;\n\nfunction blank () {}\n\ndomObjects.document = win.document;\ndomObjects.DocumentFragment = win.DocumentFragment || blank;\ndomObjects.SVGElement = win.SVGElement || blank;\ndomObjects.SVGSVGElement = win.SVGSVGElement || blank;\ndomObjects.SVGElementInstance = win.SVGElementInstance || blank;\ndomObjects.Element = win.Element || blank;\ndomObjects.HTMLElement = win.HTMLElement || domObjects.Element;\n\ndomObjects.Event = win.Event;\ndomObjects.Touch = win.Touch || blank;\ndomObjects.PointerEvent = (win.PointerEvent || win.MSPointerEvent);\n\nmodule.exports = domObjects;\n","const win = require('./window');\nconst browser = require('./browser');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst domUtils = {\n nodeContains: function (parent, child) {\n while (child) {\n if (child === parent) {\n return true;\n }\n\n child = child.parentNode;\n }\n\n return false;\n },\n\n closest: function (element, selector) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) { return element; }\n\n element = domUtils.parentNode(element);\n }\n\n return null;\n },\n\n parentNode: function (node) {\n let parent = node.parentNode;\n\n if (is.docFrag(parent)) {\n // skip past #shado-root fragments\n while ((parent = parent.host) && is.docFrag(parent)) {\n continue;\n }\n\n return parent;\n }\n\n return parent;\n },\n\n // taken from http://tanalin.com/en/blog/2012/12/matches-selector-ie8/ and modified\n matchesSelectorPolyfill: browser.useMatchesSelectorPolyfill\n ? function (element, selector, elems) {\n elems = elems || element.parentNode.querySelectorAll(selector);\n\n for (let i = 0, len = elems.length; i < len; i++) {\n if (elems[i] === element) {\n return true;\n }\n }\n\n return false;\n }\n : null,\n\n matchesSelector: function (element, selector, nodeList) {\n if (browser.useMatchesSelectorPolyfill) {\n return domUtils.matchesSelectorPolyfill(element, selector, nodeList);\n }\n\n // remove /deep/ from selectors if shadowDOM polyfill is used\n if (win.window !== win.realWindow) {\n selector = selector.replace(/\\/deep\\//g, ' ');\n }\n\n return element[browser.prefixedMatchesSelector](selector);\n },\n\n // Test for the element that's \"above\" all other qualifiers\n indexOfDeepestElement: function (elements) {\n let deepestZoneParents = [];\n let dropzoneParents = [];\n let dropzone;\n let deepestZone = elements[0];\n let index = deepestZone? 0: -1;\n let parent;\n let child;\n let i;\n let n;\n\n for (i = 1; i < elements.length; i++) {\n dropzone = elements[i];\n\n // an element might belong to multiple selector dropzones\n if (!dropzone || dropzone === deepestZone) {\n continue;\n }\n\n if (!deepestZone) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n // check if the deepest or current are document.documentElement or document.rootElement\n // - if the current dropzone is, do nothing and continue\n if (dropzone.parentNode === dropzone.ownerDocument) {\n continue;\n }\n // - if deepest is, update with the current dropzone and continue to next\n else if (deepestZone.parentNode === dropzone.ownerDocument) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n if (!deepestZoneParents.length) {\n parent = deepestZone;\n while (parent.parentNode && parent.parentNode !== parent.ownerDocument) {\n deepestZoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n }\n\n // if this element is an svg element and the current deepest is\n // an HTMLElement\n if (deepestZone instanceof domObjects.HTMLElement\n && dropzone instanceof domObjects.SVGElement\n && !(dropzone instanceof domObjects.SVGSVGElement)) {\n\n if (dropzone === deepestZone.parentNode) {\n continue;\n }\n\n parent = dropzone.ownerSVGElement;\n }\n else {\n parent = dropzone;\n }\n\n dropzoneParents = [];\n\n while (parent.parentNode !== parent.ownerDocument) {\n dropzoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n\n n = 0;\n\n // get (position of last common ancestor) + 1\n while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) {\n n++;\n }\n\n const parents = [\n dropzoneParents[n - 1],\n dropzoneParents[n],\n deepestZoneParents[n],\n ];\n\n child = parents[0].lastChild;\n\n while (child) {\n if (child === parents[1]) {\n deepestZone = dropzone;\n index = i;\n deepestZoneParents = [];\n\n break;\n }\n else if (child === parents[2]) {\n break;\n }\n\n child = child.previousSibling;\n }\n }\n\n return index;\n },\n\n matchesUpTo: function (element, selector, limit) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) {\n return true;\n }\n\n element = domUtils.parentNode(element);\n\n if (element === limit) {\n return domUtils.matchesSelector(element, selector);\n }\n }\n\n return false;\n },\n\n getActualElement: function (element) {\n return (element instanceof domObjects.SVGElementInstance\n ? element.correspondingUseElement\n : element);\n },\n\n getScrollXY: function (relevantWindow) {\n relevantWindow = relevantWindow || win.window;\n return {\n x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft,\n y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop,\n };\n },\n\n getElementClientRect: function (element) {\n const clientRect = (element instanceof domObjects.SVGElement\n ? element.getBoundingClientRect()\n : element.getClientRects()[0]);\n\n return clientRect && {\n left : clientRect.left,\n right : clientRect.right,\n top : clientRect.top,\n bottom: clientRect.bottom,\n width : clientRect.width || clientRect.right - clientRect.left,\n height: clientRect.height || clientRect.bottom - clientRect.top,\n };\n },\n\n getElementRect: function (element) {\n const clientRect = domUtils.getElementClientRect(element);\n\n if (!browser.isIOS7 && clientRect) {\n const scroll = domUtils.getScrollXY(win.getWindow(element));\n\n clientRect.left += scroll.x;\n clientRect.right += scroll.x;\n clientRect.top += scroll.y;\n clientRect.bottom += scroll.y;\n }\n\n return clientRect;\n },\n\n getPath: function (element) {\n const path = [];\n\n while (element) {\n path.push(element);\n element = domUtils.parentNode(element);\n }\n\n return path;\n },\n\n trySelector: value => {\n if (!is.string(value)) { return false; }\n\n // an exception will be raised if it is invalid\n domObjects.document.querySelector(value);\n return true;\n },\n};\n\nmodule.exports = domUtils;\n","const is = require('./is');\nconst domUtils = require('./domUtils');\nconst pExtend = require('./pointerExtend');\n\nconst { window, getWindow } = require('./window');\nconst { indexOf, contains } = require('./arr');\n\nconst useAttachEvent = ('attachEvent' in window) && !('addEventListener' in window);\nconst addEvent = useAttachEvent? 'attachEvent': 'addEventListener';\nconst removeEvent = useAttachEvent? 'detachEvent': 'removeEventListener';\nconst on = useAttachEvent? 'on': '';\n\nconst elements = [];\nconst targets = [];\nconst attachedListeners = [];\n\n// {\n// type: {\n// selectors: ['selector', ...],\n// contexts : [document, ...],\n// listeners: [[listener, capture, passive], ...]\n// }\n// }\nconst delegatedEvents = {};\n\nconst documents = [];\n\nconst supportsOptions = !useAttachEvent && (() => {\n let supported = false;\n\n window.document.createElement('div').addEventListener('test', null, {\n get capture () { supported = true; },\n });\n\n return supported;\n})();\n\nfunction add (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n let elementIndex = indexOf(elements, element);\n let target = targets[elementIndex];\n\n if (!target) {\n target = {\n events: {},\n typeCount: 0,\n };\n\n elementIndex = elements.push(element) - 1;\n targets.push(target);\n\n attachedListeners.push(useAttachEvent\n ? {\n supplied: [],\n wrapped : [],\n useCount: [],\n }\n : null);\n }\n\n if (!target.events[type]) {\n target.events[type] = [];\n target.typeCount++;\n }\n\n if (!contains(target.events[type], listener)) {\n let ret;\n\n if (useAttachEvent) {\n const { supplied, wrapped, useCount } = attachedListeners[elementIndex];\n const listenerIndex = indexOf(supplied, listener);\n\n const wrappedListener = wrapped[listenerIndex] || function (event) {\n if (!event.immediatePropagationStopped) {\n event.target = event.srcElement;\n event.currentTarget = element;\n\n event.preventDefault = event.preventDefault || preventDef;\n event.stopPropagation = event.stopPropagation || stopProp;\n event.stopImmediatePropagation = event.stopImmediatePropagation || stopImmProp;\n\n if (/mouse|click/.test(event.type)) {\n event.pageX = event.clientX + getWindow(element).document.documentElement.scrollLeft;\n event.pageY = event.clientY + getWindow(element).document.documentElement.scrollTop;\n }\n\n listener(event);\n }\n };\n\n ret = element[addEvent](on + type, wrappedListener, !!options.capture);\n\n if (listenerIndex === -1) {\n supplied.push(listener);\n wrapped.push(wrappedListener);\n useCount.push(1);\n }\n else {\n useCount[listenerIndex]++;\n }\n }\n else {\n ret = element[addEvent](type, listener, supportsOptions? options : !!options.capture);\n }\n target.events[type].push(listener);\n\n return ret;\n }\n}\n\nfunction remove (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const elementIndex = indexOf(elements, element);\n const target = targets[elementIndex];\n\n if (!target || !target.events) {\n return;\n }\n\n let wrappedListener = listener;\n let listeners;\n let listenerIndex;\n\n if (useAttachEvent) {\n listeners = attachedListeners[elementIndex];\n listenerIndex = indexOf(listeners.supplied, listener);\n wrappedListener = listeners.wrapped[listenerIndex];\n }\n\n if (type === 'all') {\n for (type in target.events) {\n if (target.events.hasOwnProperty(type)) {\n remove(element, type, 'all');\n }\n }\n return;\n }\n\n if (target.events[type]) {\n const len = target.events[type].length;\n\n if (listener === 'all') {\n for (let i = 0; i < len; i++) {\n remove(element, type, target.events[type][i], options);\n }\n return;\n }\n else {\n for (let i = 0; i < len; i++) {\n if (target.events[type][i] === listener) {\n element[removeEvent](on + type, wrappedListener, supportsOptions? options : !!options.capture);\n target.events[type].splice(i, 1);\n\n if (useAttachEvent && listeners) {\n listeners.useCount[listenerIndex]--;\n if (listeners.useCount[listenerIndex] === 0) {\n listeners.supplied.splice(listenerIndex, 1);\n listeners.wrapped.splice(listenerIndex, 1);\n listeners.useCount.splice(listenerIndex, 1);\n }\n }\n\n break;\n }\n }\n }\n\n if (target.events[type] && target.events[type].length === 0) {\n target.events[type] = null;\n target.typeCount--;\n }\n }\n\n if (!target.typeCount) {\n targets.splice(elementIndex, 1);\n elements.splice(elementIndex, 1);\n attachedListeners.splice(elementIndex, 1);\n }\n}\n\nfunction addDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n if (!delegatedEvents[type]) {\n delegatedEvents[type] = {\n selectors: [],\n contexts : [],\n listeners: [],\n };\n\n // add delegate listener functions\n for (let i = 0; i < documents.length; i++) {\n add(documents[i], type, delegateListener);\n add(documents[i], type, delegateUseCapture, true);\n }\n }\n\n const delegated = delegatedEvents[type];\n let index;\n\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n break;\n }\n }\n\n if (index === -1) {\n index = delegated.selectors.length;\n\n delegated.selectors.push(selector);\n delegated.contexts .push(context);\n delegated.listeners.push([]);\n }\n\n // keep listener and capture and passive flags\n delegated.listeners[index].push([listener, !!options.capture, options.passive]);\n}\n\nfunction removeDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const delegated = delegatedEvents[type];\n let matchFound = false;\n let index;\n\n if (!delegated) { return; }\n\n // count from last index of delegated to 0\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n // look for matching selector and context Node\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n\n const listeners = delegated.listeners[index];\n\n // each item of the listeners array is an array: [function, capture, passive]\n for (let i = listeners.length - 1; i >= 0; i--) {\n const [fn, capture, passive] = listeners[i];\n\n // check if the listener functions and capture and passive flags match\n if (fn === listener && capture === !!options.capture && passive === options.passive) {\n // remove the listener from the array of listeners\n listeners.splice(i, 1);\n\n // if all listeners for this interactable have been removed\n // remove the interactable from the delegated arrays\n if (!listeners.length) {\n delegated.selectors.splice(index, 1);\n delegated.contexts .splice(index, 1);\n delegated.listeners.splice(index, 1);\n\n // remove delegate function from context\n remove(context, type, delegateListener);\n remove(context, type, delegateUseCapture, true);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegatedEvents[type] = null;\n }\n }\n\n // only remove one listener\n matchFound = true;\n break;\n }\n }\n\n if (matchFound) { break; }\n }\n }\n}\n\n// bound to the interactable context when a DOM event\n// listener is added to a selector interactable\nfunction delegateListener (event, optionalArg) {\n const options = getOptions(optionalArg);\n const fakeEvent = {};\n const delegated = delegatedEvents[event.type];\n const eventTarget = (domUtils.getActualElement(event.path\n ? event.path[0]\n : event.target));\n let element = eventTarget;\n\n // duplicate the event so that currentTarget can be changed\n pExtend(fakeEvent, event);\n\n fakeEvent.originalEvent = event;\n fakeEvent.preventDefault = preventOriginalDefault;\n\n // climb up document tree looking for selector matches\n while (is.element(element)) {\n for (let i = 0; i < delegated.selectors.length; i++) {\n const selector = delegated.selectors[i];\n const context = delegated.contexts[i];\n\n if (domUtils.matchesSelector(element, selector)\n && domUtils.nodeContains(context, eventTarget)\n && domUtils.nodeContains(context, element)) {\n\n const listeners = delegated.listeners[i];\n\n fakeEvent.currentTarget = element;\n\n for (let j = 0; j < listeners.length; j++) {\n const [fn, capture, passive] = listeners[j];\n\n if (capture === !!options.capture && passive === options.passive) {\n fn(fakeEvent);\n }\n }\n }\n }\n\n element = domUtils.parentNode(element);\n }\n}\n\nfunction delegateUseCapture (event) {\n return delegateListener.call(this, event, true);\n}\n\nfunction preventDef () {\n this.returnValue = false;\n}\n\nfunction preventOriginalDefault () {\n this.originalEvent.preventDefault();\n}\n\nfunction stopProp () {\n this.cancelBubble = true;\n}\n\nfunction stopImmProp () {\n this.cancelBubble = true;\n this.immediatePropagationStopped = true;\n}\n\nfunction getOptions (param) {\n return is.object(param)? param : { capture: param };\n}\n\nmodule.exports = {\n add,\n remove,\n\n addDelegate,\n removeDelegate,\n\n delegateListener,\n delegateUseCapture,\n delegatedEvents,\n documents,\n\n useAttachEvent,\n supportsOptions,\n\n _elements: elements,\n _targets: targets,\n _attachedListeners: attachedListeners,\n};\n","module.exports = function extend (dest, source) {\n for (const prop in source) {\n dest[prop] = source[prop];\n }\n return dest;\n};\n","const {\n resolveRectLike,\n rectToXY,\n} = require('./rect');\n\nmodule.exports = function (target, element, action) {\n const actionOptions = target.options[action];\n const actionOrigin = actionOptions && actionOptions.origin;\n const origin = actionOrigin || target.options.origin;\n\n const originRect = resolveRectLike(origin, target, element, [target && element]);\n\n return rectToXY(originRect) || { x: 0, y: 0 };\n};\n","module.exports = (x, y) => Math.sqrt(x * x + y * y);\n","const extend = require('./extend');\nconst win = require('./window');\n\nconst utils = {\n warnOnce: function (method, message) {\n let warned = false;\n\n return function () {\n if (!warned) {\n win.window.console.warn(message);\n warned = true;\n }\n\n return method.apply(this, arguments);\n };\n },\n\n // http://stackoverflow.com/a/5634528/2280888\n _getQBezierValue: function (t, p1, p2, p3) {\n const iT = 1 - t;\n return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3;\n },\n\n getQuadraticCurvePoint: function (startX, startY, cpX, cpY, endX, endY, position) {\n return {\n x: utils._getQBezierValue(position, startX, cpX, endX),\n y: utils._getQBezierValue(position, startY, cpY, endY),\n };\n },\n\n // http://gizma.com/easing/\n easeOutQuad: function (t, b, c, d) {\n t /= d;\n return -c * t*(t-2) + b;\n },\n\n copyAction: function (dest, src) {\n dest.name = src.name;\n dest.axis = src.axis;\n dest.edges = src.edges;\n\n return dest;\n },\n\n is : require('./is'),\n extend : extend,\n hypot : require('./hypot'),\n getOriginXY: require('./getOriginXY'),\n};\n\nextend(utils, require('./arr'));\nextend(utils, require('./domUtils'));\nextend(utils, require('./pointerUtils'));\nextend(utils, require('./rect'));\n\nmodule.exports = utils;\n","const scope = require('../scope');\nconst utils = require('./index');\n\nconst finder = {\n methodOrder: [ 'simulationResume', 'mouseOrPen', 'hasPointer', 'idle' ],\n\n search: function (pointer, eventType, eventTarget) {\n const pointerType = utils.getPointerType(pointer);\n const pointerId = utils.getPointerId(pointer);\n const details = { pointer, pointerId, pointerType, eventType, eventTarget };\n\n for (const method of finder.methodOrder) {\n const interaction = finder[method](details);\n\n if (interaction) {\n return interaction;\n }\n }\n },\n\n // try to resume simulation with a new pointer\n simulationResume: function ({ pointerType, eventType, eventTarget }) {\n if (!/down|start/i.test(eventType)) {\n return null;\n }\n\n for (const interaction of scope.interactions) {\n let element = eventTarget;\n\n if (interaction.simulation && interaction.simulation.allowResume\n && (interaction.pointerType === pointerType)) {\n while (element) {\n // if the element is the interaction element\n if (element === interaction.element) {\n return interaction;\n }\n element = utils.parentNode(element);\n }\n }\n }\n\n return null;\n },\n\n // if it's a mouse or pen interaction\n mouseOrPen: function ({ pointerId, pointerType, eventType }) {\n if (pointerType !== 'mouse' && pointerType !== 'pen') {\n return null;\n }\n\n let firstNonActive;\n\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType) {\n // if it's a down event, skip interactions with running simulations\n if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; }\n\n // if the interaction is active, return it immediately\n if (interaction.interacting()) {\n return interaction;\n }\n // otherwise save it and look for another active interaction\n else if (!firstNonActive) {\n firstNonActive = interaction;\n }\n }\n }\n\n // if no active mouse interaction was found use the first inactive mouse\n // interaction\n if (firstNonActive) {\n return firstNonActive;\n }\n\n // find any mouse or pen interaction.\n // ignore the interaction if the eventType is a *down, and a simulation\n // is active\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType && !(/down/i.test(eventType) && interaction.simulation)) {\n return interaction;\n }\n }\n\n return null;\n },\n\n // get interaction that has this pointer\n hasPointer: function ({ pointerId }) {\n for (const interaction of scope.interactions) {\n if (utils.contains(interaction.pointerIds, pointerId)) {\n return interaction;\n }\n }\n },\n\n // get first idle interaction with a matching pointerType\n idle: function ({ pointerType }) {\n for (const interaction of scope.interactions) {\n // if there's already a pointer held down\n if (interaction.pointerIds.length === 1) {\n const target = interaction.target;\n // don't add this pointer if there is a target interactable and it\n // isn't gesturable\n if (target && !target.options.gesture.enabled) {\n continue;\n }\n }\n // maximum of 2 pointers per interaction\n else if (interaction.pointerIds.length >= 2) {\n continue;\n }\n\n if (!interaction.interacting() && (pointerType === interaction.pointerType)) {\n return interaction;\n }\n }\n\n return null;\n },\n};\n\nmodule.exports = finder;\n","const win = require('./window');\nconst isWindow = require('./isWindow');\n\nconst is = {\n array : () => {},\n\n window : thing => thing === win.window || isWindow(thing),\n\n docFrag : thing => is.object(thing) && thing.nodeType === 11,\n\n object : thing => !!thing && (typeof thing === 'object'),\n\n function: thing => typeof thing === 'function',\n\n number : thing => typeof thing === 'number' ,\n\n bool : thing => typeof thing === 'boolean' ,\n\n string : thing => typeof thing === 'string' ,\n\n element: thing => {\n if (!thing || (typeof thing !== 'object')) { return false; }\n\n const _window = win.getWindow(thing) || win.window;\n\n return (/object|function/.test(typeof _window.Element)\n ? thing instanceof _window.Element //DOM2\n : thing.nodeType === 1 && typeof thing.nodeName === 'string');\n },\n};\n\nis.array = thing => (is.object(thing)\n && (typeof thing.length !== 'undefined')\n && is.function(thing.splice));\n\nmodule.exports = is;\n","module.exports = (thing) => !!(thing && thing.Window) && (thing instanceof thing.Window);\n","function pointerExtend (dest, source) {\n for (const prop in source) {\n const prefixedPropREs = module.exports.prefixedPropREs;\n let deprecated = false;\n\n // skip deprecated prefixed properties\n for (const vendor in prefixedPropREs) {\n if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) {\n deprecated = true;\n break;\n }\n }\n\n if (!deprecated && typeof source[prop] !== 'function') {\n dest[prop] = source[prop];\n }\n }\n return dest;\n}\n\npointerExtend.prefixedPropREs = {\n webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/,\n};\n\nmodule.exports = pointerExtend;\n","const hypot = require('./hypot');\nconst browser = require('./browser');\nconst dom = require('./domObjects');\nconst domUtils = require('./domUtils');\nconst domObjects = require('./domObjects');\nconst is = require('./is');\nconst pointerExtend = require('./pointerExtend');\n\nconst pointerUtils = {\n copyCoords: function (dest, src) {\n dest.page = dest.page || {};\n dest.page.x = src.page.x;\n dest.page.y = src.page.y;\n\n dest.client = dest.client || {};\n dest.client.x = src.client.x;\n dest.client.y = src.client.y;\n\n dest.timeStamp = src.timeStamp;\n },\n\n setCoordDeltas: function (targetObj, prev, cur) {\n targetObj.page.x = cur.page.x - prev.page.x;\n targetObj.page.y = cur.page.y - prev.page.y;\n targetObj.client.x = cur.client.x - prev.client.x;\n targetObj.client.y = cur.client.y - prev.client.y;\n targetObj.timeStamp = cur.timeStamp - prev.timeStamp;\n\n // set pointer velocity\n const dt = Math.max(targetObj.timeStamp / 1000, 0.001);\n\n targetObj.page.speed = hypot(targetObj.page.x, targetObj.page.y) / dt;\n targetObj.page.vx = targetObj.page.x / dt;\n targetObj.page.vy = targetObj.page.y / dt;\n\n targetObj.client.speed = hypot(targetObj.client.x, targetObj.page.y) / dt;\n targetObj.client.vx = targetObj.client.x / dt;\n targetObj.client.vy = targetObj.client.y / dt;\n },\n\n isNativePointer: function (pointer) {\n return (pointer instanceof dom.Event || pointer instanceof dom.Touch);\n },\n\n // Get specified X/Y coords for mouse or event.touches[0]\n getXY: function (type, pointer, xy) {\n xy = xy || {};\n type = type || 'page';\n\n xy.x = pointer[type + 'X'];\n xy.y = pointer[type + 'Y'];\n\n return xy;\n },\n\n getPageXY: function (pointer, page) {\n page = page || {};\n\n // Opera Mobile handles the viewport and scrolling oddly\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n pointerUtils.getXY('screen', pointer, page);\n\n page.x += window.scrollX;\n page.y += window.scrollY;\n }\n else {\n pointerUtils.getXY('page', pointer, page);\n }\n\n return page;\n },\n\n getClientXY: function (pointer, client) {\n client = client || {};\n\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n // Opera Mobile handles the viewport and scrolling oddly\n pointerUtils.getXY('screen', pointer, client);\n }\n else {\n pointerUtils.getXY('client', pointer, client);\n }\n\n return client;\n },\n\n getPointerId: function (pointer) {\n return is.number(pointer.pointerId)? pointer.pointerId : pointer.identifier;\n },\n\n setCoords: function (targetObj, pointers, timeStamp) {\n const pointer = (pointers.length > 1\n ? pointerUtils.pointerAverage(pointers)\n : pointers[0]);\n\n const tmpXY = {};\n\n pointerUtils.getPageXY(pointer, tmpXY);\n targetObj.page.x = tmpXY.x;\n targetObj.page.y = tmpXY.y;\n\n pointerUtils.getClientXY(pointer, tmpXY);\n targetObj.client.x = tmpXY.x;\n targetObj.client.y = tmpXY.y;\n\n targetObj.timeStamp = is.number(timeStamp) ? timeStamp :new Date().getTime();\n },\n\n pointerExtend: pointerExtend,\n\n getTouchPair: function (event) {\n const touches = [];\n\n // array of touches is supplied\n if (is.array(event)) {\n touches[0] = event[0];\n touches[1] = event[1];\n }\n // an event\n else {\n if (event.type === 'touchend') {\n if (event.touches.length === 1) {\n touches[0] = event.touches[0];\n touches[1] = event.changedTouches[0];\n }\n else if (event.touches.length === 0) {\n touches[0] = event.changedTouches[0];\n touches[1] = event.changedTouches[1];\n }\n }\n else {\n touches[0] = event.touches[0];\n touches[1] = event.touches[1];\n }\n }\n\n return touches;\n },\n\n pointerAverage: function (pointers) {\n const average = {\n pageX : 0,\n pageY : 0,\n clientX: 0,\n clientY: 0,\n screenX: 0,\n screenY: 0,\n };\n\n for (const pointer of pointers) {\n for (const prop in average) {\n average[prop] += pointer[prop];\n }\n }\n for (const prop in average) {\n average[prop] /= pointers.length;\n }\n\n return average;\n },\n\n touchBBox: function (event) {\n if (!event.length && !(event.touches && event.touches.length > 1)) {\n return;\n }\n\n const touches = pointerUtils.getTouchPair(event);\n const minX = Math.min(touches[0].pageX, touches[1].pageX);\n const minY = Math.min(touches[0].pageY, touches[1].pageY);\n const maxX = Math.max(touches[0].pageX, touches[1].pageX);\n const maxY = Math.max(touches[0].pageY, touches[1].pageY);\n\n return {\n x: minX,\n y: minY,\n left: minX,\n top: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n },\n\n touchDistance: function (event, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n\n\n const dx = touches[0][sourceX] - touches[1][sourceX];\n const dy = touches[0][sourceY] - touches[1][sourceY];\n\n return hypot(dx, dy);\n },\n\n touchAngle: function (event, prevAngle, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n const dx = touches[1][sourceX] - touches[0][sourceX];\n const dy = touches[1][sourceY] - touches[0][sourceY];\n const angle = 180 * Math.atan2(dy , dx) / Math.PI;\n\n return angle;\n },\n\n getPointerType: function (pointer) {\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : is.number(pointer.pointerType)\n ? [undefined, undefined,'touch', 'pen', 'mouse'][pointer.pointerType]\n // if the PointerEvent API isn't available, then the \"pointer\" must\n // be either a MouseEvent, TouchEvent, or Touch object\n : /touch/.test(pointer.type) || pointer instanceof domObjects.Touch\n ? 'touch'\n : 'mouse';\n },\n\n // [ event.target, event.currentTarget ]\n getEventTargets: function (event) {\n return [\n domUtils.getActualElement(event.path ? event.path[0] : event.target),\n domUtils.getActualElement(event.currentTarget),\n ];\n },\n};\n\nmodule.exports = pointerUtils;\n","const { window } = require('./window');\n\nconst vendors = ['ms', 'moz', 'webkit', 'o'];\nlet lastTime = 0;\nlet request;\nlet cancel;\n\nfor (let x = 0; x < vendors.length && !window.requestAnimationFrame; x++) {\n request = window[vendors[x] + 'RequestAnimationFrame'];\n cancel = window[vendors[x] +'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n}\n\nif (!request) {\n request = function (callback) {\n const currTime = new Date().getTime();\n const timeToCall = Math.max(0, 16 - (currTime - lastTime));\n const id = setTimeout(function () { callback(currTime + timeToCall); },\n timeToCall);\n\n lastTime = currTime + timeToCall;\n return id;\n };\n}\n\nif (!cancel) {\n cancel = function (id) {\n clearTimeout(id);\n };\n}\n\nmodule.exports = {\n request,\n cancel,\n};\n","const extend = require('./extend');\nconst is = require('./is');\nconst {\n closest,\n parentNode,\n getElementRect,\n} = require('./domUtils');\n\nconst rectUtils = {\n getStringOptionResult: function (value, interactable, element) {\n if (!is.string(value)) {\n return null;\n }\n\n if (value === 'parent') {\n value = parentNode(element);\n }\n else if (value === 'self') {\n value = interactable.getRect(element);\n }\n else {\n value = closest(element, value);\n }\n\n return value;\n },\n\n resolveRectLike: function (value, interactable, element, functionArgs) {\n value = rectUtils.getStringOptionResult(value, interactable, element) || value;\n\n if (is.function(value)) {\n value = value.apply(null, functionArgs);\n }\n\n if (is.element(value)) {\n value = getElementRect(value);\n }\n\n return value;\n },\n\n rectToXY: function (rect) {\n return rect && {\n x: 'x' in rect ? rect.x : rect.left,\n y: 'y' in rect ? rect.y : rect.top,\n };\n },\n\n xywhToTlbr: function (rect) {\n if (rect && !('left' in rect && 'top' in rect)) {\n rect = extend({}, rect);\n\n rect.left = rect.x || 0;\n rect.top = rect.y || 0;\n rect.right = rect.right || (rect.left + rect.width);\n rect.bottom = rect.bottom || (rect.top + rect.height);\n }\n\n return rect;\n },\n\n tlbrToXywh: function (rect) {\n if (rect && !('x' in rect && 'y' in rect)) {\n rect = extend({}, rect);\n\n rect.x = rect.left || 0;\n rect.top = rect.top || 0;\n rect.width = rect.width || (rect.right - rect.x);\n rect.height = rect.height || (rect.bottom - rect.y);\n }\n\n return rect;\n },\n};\n\nmodule.exports = rectUtils;\n","const win = module.exports;\nconst isWindow = require('./isWindow');\n\nfunction init (window) {\n // get wrapped window if using Shadow DOM polyfill\n\n win.realWindow = window;\n\n // create a TextNode\n const el = window.document.createTextNode('');\n\n // check if it's wrapped by a polyfill\n if (el.ownerDocument !== window.document\n && typeof window.wrap === 'function'\n && window.wrap(el) === el) {\n // use wrapped window\n window = window.wrap(window);\n }\n\n win.window = window;\n}\n\nif (typeof window === 'undefined') {\n win.window = undefined;\n win.realWindow = undefined;\n}\nelse {\n init(window);\n}\n\nwin.getWindow = function getWindow (node) {\n if (isWindow(node)) {\n return node;\n }\n\n const rootNode = (node.ownerDocument || node);\n\n return rootNode.defaultView || rootNode.parentWindow || win.window;\n};\n\nwin.init = init;\n"]} \ No newline at end of file diff --git a/dist/interact.min.js b/dist/interact.min.js index c0bb2476c..2d1f0fb62 100644 --- a/dist/interact.min.js +++ b/dist/interact.min.js @@ -1,6 +1,6 @@ -/* interact.js v1.3.0-alpha.3+sha.9595c40 | https://raw.github.com/taye/interact.js/master/LICENSE */ -!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var t;t="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,t.interact=e()}}(function(){return function e(t,n,r){function i(s,a){if(!n[s]){if(!t[s]){var l="function"==typeof require&&require;if(!a&&l)return l(s,!0);if(o)return o(s,!0);var c=new Error("Cannot find module '"+s+"'");throw c.code="MODULE_NOT_FOUND",c}var p=n[s]={exports:{}};t[s][0].call(p.exports,function(e){var n=t[s][1][e];return i(n||e)},p,p.exports,e,t,n,r)}return n[s].exports}for(var o="function"==typeof require&&require,s=0;s6&&void 0!==arguments[6]&&arguments[6];r(this,e);var f=t.target,v=(f&&f.options||s).deltaSource,g=o(f,p,l),h="start"===c,m="end"===c,y=h?t.startCoords:t.curCoords,x=t.prevEvent;p=p||t.element;var b=i({},y.page),w=i({},y.client);b.x-=g.x,b.y-=g.y,w.x-=g.x,w.y-=g.y,this.ctrlKey=n.ctrlKey,this.altKey=n.altKey,this.shiftKey=n.shiftKey,this.metaKey=n.metaKey,this.button=n.button,this.buttons=n.buttons,this.target=p,this.currentTarget=p,this.relatedTarget=u||null,this.preEnd=d,this.type=l+(c||""),this.interaction=t,this.interactable=f,this.t0=h?t.downTimes[t.downTimes.length-1]:x.t0;var E={interaction:t,event:n,action:l,phase:c,element:p,related:u,page:b,client:w,coords:y,starting:h,ending:m,deltaSource:v,iEvent:this};a.fire("set-xy",E),m?(this.pageX=x.pageX,this.pageY=x.pageY,this.clientX=x.clientX,this.clientY=x.clientY):(this.pageX=b.x,this.pageY=b.y,this.clientX=w.x,this.clientY=w.y),this.x0=t.startCoords.page.x-g.x,this.y0=t.startCoords.page.y-g.y,this.clientX0=t.startCoords.client.x-g.x,this.clientY0=t.startCoords.client.y-g.y,a.fire("set-delta",E),this.timeStamp=y.timeStamp,this.dt=t.pointerDelta.timeStamp,this.duration=this.timeStamp-this.t0,this.speed=t.pointerDelta[v].speed,this.velocityX=t.pointerDelta[v].vx,this.velocityY=t.pointerDelta[v].vy,this.swipe=m||"inertiastart"===c?this.getSwipe():null,a.fire("new",E)}return e.prototype.getSwipe=function(){var e=this.interaction;if(e.prevEvent.speed<600||this.timeStamp-e.prevEvent.timeStamp>150)return null;var t=180*Math.atan2(e.prevEvent.velocityY,e.prevEvent.velocityX)/Math.PI;t<0&&(t+=360);var n=112.5<=t&&t<247.5,r=202.5<=t&&t<337.5,i=!n&&(292.5<=t||t<67.5);return{up:r,down:!r&&22.5<=t&&t<157.5,left:n,right:i,angle:t,speed:e.prevEvent.speed,velocity:{x:e.prevEvent.velocityX,y:e.prevEvent.velocityY}}},e.prototype.preventDefault=function(){},e.prototype.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},e.prototype.stopPropagation=function(){this.propagationStopped=!0},e}();a.on("set-delta",function(e){var t=e.iEvent,n=e.interaction,r=e.starting,i=e.deltaSource,o=r?t:n.prevEvent;"client"===i?(t.dx=t.clientX-o.clientX,t.dy=t.clientY-o.clientY):(t.dx=t.pageX-o.pageX,t.dy=t.pageY-o.pageY)}),l.signals=a,t.exports=l},{"./defaultOptions":18,"./utils/Signals":35,"./utils/extend":41,"./utils/getOriginXY":42}],4:[function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=e("./utils/is"),o=e("./utils/events"),s=e("./utils/extend"),a=e("./actions/base"),l=e("./scope"),c=e("./Eventable"),p=e("./defaultOptions"),u=e("./utils/Signals").new(),d=e("./utils/domUtils"),f=d.getElementRect,v=d.nodeContains,g=d.trySelector,h=e("./utils/window"),m=h.getWindow,y=e("./utils/arr"),x=y.indexOf,b=y.contains,w=e("./utils/browser"),E=w.wheelEvent;l.interactables=[];var S=function(){function e(t,n){r(this,e),n=n||{},this.target=t,this.events=new c,this._context=n.context||l.document,this._win=m(g(t)?this._context:t),this._doc=this._win.document,u.fire("new",{target:t,options:n,interactable:this,win:this._win}),l.addDocument(this._doc,this._win),l.interactables.push(this),this.set(n)}return e.prototype.setOnEvents=function(e,t){var n="on"+e;return i.function(t.onstart)&&(this.events[n+"start"]=t.onstart),i.function(t.onmove)&&(this.events[n+"move"]=t.onmove),i.function(t.onend)&&(this.events[n+"end"]=t.onend),i.function(t.oninertiastart)&&(this.events[n+"inertiastart"]=t.oninertiastart),this},e.prototype.setPerAction=function(e,t){for(var n in t)n in p[e]&&(i.object(t[n])?(this.options[e][n]=s(this.options[e][n]||{},t[n]),i.object(p.perAction[n])&&"enabled"in p.perAction[n]&&(this.options[e][n].enabled=!1!==t[n].enabled)):i.bool(t[n])&&i.object(p.perAction[n])?this.options[e][n].enabled=t[n]:void 0!==t[n]&&(this.options[e][n]=t[n]))},e.prototype.getRect=function(e){return e=e||this.target,i.string(this.target)&&!i.element(e)&&(e=this._context.querySelector(this.target)),f(e)},e.prototype.rectChecker=function(e){return i.function(e)?(this.getRect=e,this):null===e?(delete this.options.getRect,this):this.getRect},e.prototype._backCompatOption=function(e,t){if(g(t)||i.object(t)){this.options[e]=t;for(var n=a.names,r=Array.isArray(n),o=0,n=r?n:n[Symbol.iterator]();;){var s;if(r){if(o>=n.length)break;s=n[o++]}else{if(o=n.next(),o.done)break;s=o.value}var l=s;this.options[l][e]=t}return this}return this.options[e]},e.prototype.origin=function(e){return this._backCompatOption("origin",e)},e.prototype.deltaSource=function(e){return"page"===e||"client"===e?(this.options.deltaSource=e,this):this.options.deltaSource},e.prototype.context=function(){return this._context},e.prototype.inContext=function(e){return this._context===e.ownerDocument||v(this._context,e)},e.prototype.fire=function(e){return this.events.fire(e),this},e.prototype._onOffMultiple=function(e,t,n,r){if(i.string(t)&&-1!==t.search(" ")&&(t=t.trim().split(/ +/)),i.array(t)){for(var o=0;o=l.length)break;f=l[d++]}else{if(d=l.next(),d.done)break;f=d.value}var v=f;this.options[v]=p.base[v],v in t&&this[v](t[v])}return u.fire("set",{options:t,interactable:this}),this},e.prototype.unset=function(){if(o.remove(this.target,"all"),i.string(this.target))for(var e in o.delegatedEvents){var t=o.delegatedEvents[e];t.selectors[0]===this.target&&t.contexts[0]===this._context&&(t.selectors.splice(0,1),t.contexts.splice(0,1),t.listeners.splice(0,1),t.selectors.length||(t[e]=null)),o.remove(this._context,e,o.delegateListener),o.remove(this._context,e,o.delegateUseCapture,!0)}else o.remove(this,"all");u.fire("unset",{interactable:this}),l.interactables.splice(x(l.interactables,this),1);for(var n=l.interactions||[],r=Array.isArray(n),s=0,n=r?n:n[Symbol.iterator]();;){var a;if(r){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var c=a;c.target===this&&c.interacting()&&c.stop()}return l.interact},e}();l.interactables.indexOfElement=function(e,t){t=t||l.document;for(var n=0;n=y.length)break;w=y[b++]}else{if(b=y.next(),b.done)break;w=b.value}var E=w,S=E[0],T=E[1];T._updateEventTargets(r,i),T[e](S,t,r,i)}}}function o(e){for(var t=0;te.pointerMoveTolerance);var a={pointer:t,pointerIndex:this.getPointerIndex(t),event:n,eventTarget:r,dx:o,dy:s,duplicate:i,interaction:this,interactingBeforeMove:this.interacting()};i||l.setCoordDeltas(this.pointerDelta,this.prevCoords,this.curCoords),d.fire("move",a),i||(this.interacting()&&this.doMove(a),this.pointerWasMoved&&l.copyCoords(this.prevCoords,this.curCoords))},e.prototype.doMove=function(e){e=l.extend({pointer:this.pointers[0],event:this.prevEvent,eventTarget:this._eventTarget,interaction:this},e||{}),d.fire("before-action-move",e),this._dontFireMove||d.fire("action-move",e),this._dontFireMove=!1},e.prototype.pointerUp=function(e,t,n,r){var i=this.getPointerIndex(e);d.fire(/cancel$/i.test(t.type)?"cancel":"up",{pointer:e,pointerIndex:i,event:t,eventTarget:n,curEventTarget:r,interaction:this}),this.simulation||this.end(t),this.pointerIsDown=!1,this.removePointer(e,t)},e.prototype.end=function(e){e=e||this.prevEvent,this.interacting()&&d.fire("action-end",{event:e,interaction:this}),this.stop()},e.prototype.currentAction=function(){return this._interacting?this.prepared.name:null},e.prototype.interacting=function(){return this._interacting},e.prototype.stop=function(){d.fire("stop",{interaction:this}),this._interacting&&(d.fire("stop-active",{interaction:this}),d.fire("stop-"+this.prepared.name,{interaction:this})),this.target=this.element=null,this._interacting=!1,this.prepared.name=this.prevEvent=null},e.prototype.getPointerIndex=function(e){return l.indexOf(this.pointerIds,l.getPointerId(e))},e.prototype.updatePointer=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:t&&/(down|start)$/i.test(t.type),r=l.getPointerId(e),i=this.getPointerIndex(e);return-1===i&&(i=this.pointerIds.length,this.pointerIds[i]=r),n&&d.fire("update-pointer-down",{pointer:e,event:t,down:n,pointerId:r,pointerIndex:i,interaction:this}),this.pointers[i]=e,i},e.prototype.removePointer=function(e,t){var n=l.getPointerId(e),r=this.mouse?0:l.indexOf(this.pointerIds,n);-1!==r&&(d.fire("remove-pointer",{pointer:e,event:t,pointerIndex:r,interaction:this}),this.pointers.splice(r,1),this.pointerIds.splice(r,1),this.downTargets.splice(r,1),this.downTimes.splice(r,1))},e.prototype._updateEventTargets=function(e,t){this._eventTarget=e,this._curEventTarget=t},e}(),m=0,y=v.length;m=i.length)break;a=i[s++]}else{if(s=i.next(),s.done)break;a=s.value}var l=a;if(l.options.drop.enabled){var c=l.options.drop.accept;if(!(p.is.element(c)&&c!==t||p.is.string(c)&&!p.matchesSelector(t,c)))for(var d=p.is.string(l.target)?l._context.querySelectorAll(l.target):[l.target],f=0;fo.left&&c.xo.top&&c.y=o.left&&v<=o.right&&g>=o.top&&g<=o.bottom}if(f&&p.is.number(a)){s=Math.max(0,Math.min(o.right,f.right)-Math.max(o.left,f.left))*Math.max(0,Math.min(o.bottom,f.bottom)-Math.max(o.top,f.top))/(f.width*f.height)>=a}return this.options.drop.checker&&(s=this.options.drop.checker(e,t,s,this,i,n,r)),s},v.signals.on("unset",function(e){e.interactable.dropzone(!1)}),v.settingsMethods.push("dropChecker"),g.signals.on("new",function(e){e.dropTarget=null,e.dropElement=null,e.prevDropTarget=null,e.prevDropElement=null,e.dropEvents=null,e.activeDrops={dropzones:[],elements:[],rects:[]}}),g.signals.on("stop",function(e){var t=e.interaction;t.dropTarget=t.dropElement=t.prevDropTarget=t.prevDropElement=null}),d.dynamicDrop=function(e){return p.is.bool(e)?(y=e,d):y},p.merge(v.eventTypes,["dragenter","dragleave","dropactivate","dropdeactivate","dropmove","drop"]),c.methodDict.drop="dropzone",h.drop=m.defaults,t.exports=m},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../interact":21,"../scope":34,"../utils":44,"./base":6}],9:[function(e,t,n){"use strict";var r=e("./base"),i=e("../utils"),o=e("../InteractEvent"),s=e("../Interactable"),a=e("../Interaction"),l=e("../defaultOptions"),c={defaults:{enabled:!1,origin:null,restrict:null},checker:function(e,t,n,r,i){return i.pointerIds.length>=2?{name:"gesture"}:null},getCursor:function(){return""}};o.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;"gesturestart"===t.type&&(t.ds=0,n.gesture.startDistance=n.gesture.prevDistance=t.distance,n.gesture.startAngle=n.gesture.prevAngle=t.angle,n.gesture.scale=1)}),o.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;"gesturemove"===t.type&&(t.ds=t.scale-n.gesture.scale,n.target.fire(t),n.gesture.prevAngle=t.angle,n.gesture.prevDistance=t.distance,t.scale===1/0||null===t.scale||void 0===t.scale||isNaN(t.scale)||(n.gesture.scale=t.scale))}),s.prototype.gesturable=function(e){return i.is.object(e)?(this.options.gesture.enabled=!1!==e.enabled,this.setPerAction("gesture",e),this.setOnEvents("gesture",e),this):i.is.bool(e)?(this.options.gesture.enabled=e,e||(this.ongesturestart=this.ongesturestart=this.ongestureend=null),this):this.options.gesture},o.signals.on("set-delta",function(e){var t=e.interaction,n=e.iEvent,r=e.action,s=e.event,a=e.starting,l=e.ending,c=e.deltaSource;if("gesture"===r){var p=t.pointers;n.touches=[p[0],p[1]],a?(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=1,n.ds=0,n.angle=i.touchAngle(p,void 0,c),n.da=0):l||s instanceof o?(n.distance=t.prevEvent.distance,n.box=t.prevEvent.box,n.scale=t.prevEvent.scale,n.ds=n.scale-1,n.angle=t.prevEvent.angle,n.da=n.angle-t.gesture.startAngle):(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=n.distance/t.gesture.startDistance,n.angle=i.touchAngle(p,t.gesture.prevAngle,c),n.ds=n.scale-t.gesture.prevScale,n.da=n.angle-t.gesture.prevAngle)}}),a.signals.on("new",function(e){e.gesture={start:{x:0,y:0},startDistance:0,prevDistance:0,distance:0,scale:1,startAngle:0,prevAngle:0}}),r.gesture=c,r.names.push("gesture"),i.merge(s.eventTypes,["gesturestart","gesturemove","gestureend"]),r.methodDict.gesture="gesturable",l.gesture=c.defaults,t.exports=c},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"./base":6}],10:[function(e,t,n){"use strict";function r(e,t,n,r,i,s,a){if(!t)return!1;if(!0===t){var l=o.is.number(s.width)?s.width:s.right-s.left,c=o.is.number(s.height)?s.height:s.bottom-s.top;if(l<0&&("left"===e?e="right":"right"===e&&(e="left")),c<0&&("top"===e?e="bottom":"bottom"===e&&(e="top")),"left"===e)return n.x<(l>=0?s.left:s.right)+a;if("top"===e)return n.y<(c>=0?s.top:s.bottom)+a;if("right"===e)return n.x>(l>=0?s.right:s.left)-a;if("bottom"===e)return n.y>(c>=0?s.bottom:s.top)-a}return!!o.is.element(r)&&(o.is.element(t)?t===r:o.matchesUpTo(r,t,i))}var i=e("./base"),o=e("../utils"),s=e("../utils/browser"),a=e("../InteractEvent"),l=e("../Interactable"),c=e("../Interaction"),p=e("../defaultOptions"),u=s.supportsTouch||s.supportsPointerEvent?20:10,d={defaults:{enabled:!1,mouseButtons:null,origin:null,snap:null,restrict:null,inertia:null,autoScroll:null,square:!1,preserveAspectRatio:!1,axis:"xy",margin:NaN,edges:null,invert:"none"},checker:function(e,t,n,i,s,a){if(!a)return null;var l=o.extend({},s.curCoords.page),c=n.options;if(c.resize.enabled){var p=c.resize,d={left:!1,right:!1,top:!1,bottom:!1};if(o.is.object(p.edges)){for(var f in d)d[f]=r(f,p.edges[f],l,s._eventTarget,i,a,p.margin||u);if(d.left=d.left&&!d.right,d.top=d.top&&!d.bottom,d.left||d.right||d.top||d.bottom)return{name:"resize",edges:d}}else{var v="y"!==c.resize.axis&&l.x>a.right-u,g="x"!==c.resize.axis&&l.y>a.bottom-u;if(v||g)return{name:"resize",axes:(v?"x":"")+(g?"y":"")}}}return null},cursors:s.isIe9OrOlder?{x:"e-resize",y:"s-resize",xy:"se-resize",top:"n-resize",left:"w-resize",bottom:"s-resize",right:"e-resize",topleft:"se-resize",bottomright:"se-resize",topright:"ne-resize",bottomleft:"ne-resize"}:{x:"ew-resize",y:"ns-resize",xy:"nwse-resize",top:"ns-resize",left:"ew-resize",bottom:"ns-resize",right:"ew-resize",topleft:"nwse-resize",bottomright:"nwse-resize",topright:"nesw-resize",bottomleft:"nesw-resize"},getCursor:function(e){if(e.axis)return d.cursors[e.name+e.axis];if(e.edges){for(var t="",n=["top","bottom","left","right"],r=0;r<4;r++)e.edges[n[r]]&&(t+=n[r]);return d.cursors[t]}}};a.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;if("resizestart"===t.type&&n.prepared.edges){var r=n.target.getRect(n.element),i=n.target.options.resize;if(i.square||i.preserveAspectRatio){var s=o.extend({},n.prepared.edges);s.top=s.top||s.left&&!s.bottom,s.left=s.left||s.top&&!s.right,s.bottom=s.bottom||s.right&&!s.top,s.right=s.right||s.bottom&&!s.left,n.prepared._linkedEdges=s}else n.prepared._linkedEdges=null;i.preserveAspectRatio&&(n.resizeStartAspectRatio=r.width/r.height),n.resizeRects={start:r,current:o.extend({},r),inverted:o.extend({},r),previous:o.extend({},r),delta:{left:0,right:0,width:0,top:0,bottom:0,height:0}},t.rect=n.resizeRects.inverted,t.deltaRect=n.resizeRects.delta}}),a.signals.on("new",function(e){var t=e.iEvent,n=e.phase,r=e.interaction;if("move"===n&&r.prepared.edges){var i=r.target.options.resize,s=i.invert,a="reposition"===s||"negate"===s,l=r.prepared.edges,c=r.resizeRects.start,p=r.resizeRects.current,u=r.resizeRects.inverted,d=r.resizeRects.delta,f=o.extend(r.resizeRects.previous,u),v=l,g=t.dx,h=t.dy;if(i.preserveAspectRatio||i.square){var m=i.preserveAspectRatio?r.resizeStartAspectRatio:1;l=r.prepared._linkedEdges,v.left&&v.bottom||v.right&&v.top?h=-g/m:v.left||v.right?h=g/m:(v.top||v.bottom)&&(g=h*m)}if(l.top&&(p.top+=h),l.bottom&&(p.bottom+=h),l.left&&(p.left+=g),l.right&&(p.right+=g),a){if(o.extend(u,p),"reposition"===s){var y=void 0;u.top>u.bottom&&(y=u.top,u.top=u.bottom,u.bottom=y),u.left>u.right&&(y=u.left,u.left=u.right,u.right=y)}}else u.top=Math.min(p.top,c.bottom),u.bottom=Math.max(p.bottom,c.top),u.left=Math.min(p.left,c.right),u.right=Math.max(p.right,c.left);u.width=u.right-u.left,u.height=u.bottom-u.top;for(var x in u)d[x]=u[x]-f[x];t.edges=r.prepared.edges,t.rect=u,t.deltaRect=d}}),l.prototype.resizable=function(e){return o.is.object(e)?(this.options.resize.enabled=!1!==e.enabled,this.setPerAction("resize",e),this.setOnEvents("resize",e),/^x$|^y$|^xy$/.test(e.axis)?this.options.resize.axis=e.axis:null===e.axis&&(this.options.resize.axis=p.resize.axis),o.is.bool(e.preserveAspectRatio)?this.options.resize.preserveAspectRatio=e.preserveAspectRatio:o.is.bool(e.square)&&(this.options.resize.square=e.square),this):o.is.bool(e)?(this.options.resize.enabled=e,e||(this.onresizestart=this.onresizestart=this.onresizeend=null),this):this.options.resize},c.signals.on("new",function(e){ -e.resizeAxes="xy"}),a.signals.on("set-delta",function(e){var t=e.interaction,n=e.iEvent;"resize"===e.action&&t.resizeAxes&&(t.target.options.resize.square?("y"===t.resizeAxes?n.dx=n.dy:n.dy=n.dx,n.axes="xy"):(n.axes=t.resizeAxes,"x"===t.resizeAxes?n.dy=0:"y"===t.resizeAxes&&(n.dx=0)))}),i.resize=d,i.names.push("resize"),o.merge(l.eventTypes,["resizestart","resizemove","resizeinertiastart","resizeinertiaresume","resizeend"]),i.methodDict.resize="resizable",p.resize=d.defaults,t.exports=d},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"../utils/browser":37,"./base":6}],11:[function(e,t,n){"use strict";var r=e("./utils/raf"),i=e("./utils/window").getWindow,o=e("./utils/is"),s=e("./utils/domUtils"),a=e("./Interaction"),l=e("./defaultOptions"),c={defaults:{enabled:!1,container:null,margin:60,speed:300},interaction:null,i:null,x:0,y:0,isScrolling:!1,prevTime:0,start:function(e){c.isScrolling=!0,r.cancel(c.i),c.interaction=e,c.prevTime=(new Date).getTime(),c.i=r.request(c.scroll)},stop:function(){c.isScrolling=!1,r.cancel(c.i)},scroll:function(){var e=c.interaction.target.options[c.interaction.prepared.name].autoScroll,t=e.container||i(c.interaction.element),n=(new Date).getTime(),s=(n-c.prevTime)/1e3,a=e.speed*s;a>=1&&(o.window(t)?t.scrollBy(c.x*a,c.y*a):t&&(t.scrollLeft+=c.x*a,t.scrollTop+=c.y*a),c.prevTime=n),c.isScrolling&&(r.cancel(c.i),c.i=r.request(c.scroll))},check:function(e,t){var n=e.options;return n[t].autoScroll&&n[t].autoScroll.enabled},onInteractionMove:function(e){var t=e.interaction,n=e.pointer;if(t.interacting()&&c.check(t.target,t.prepared.name)){if(t.simulation)return void(c.x=c.y=0);var r=void 0,a=void 0,l=void 0,p=void 0,u=t.target.options[t.prepared.name].autoScroll,d=u.container||i(t.element);if(o.window(d))p=n.clientXd.innerWidth-c.margin,l=n.clientY>d.innerHeight-c.margin;else{var f=s.getElementClientRect(d);p=n.clientXf.right-c.margin,l=n.clientY>f.bottom-c.margin}c.x=a?1:p?-1:0,c.y=l?1:r?-1:0,c.isScrolling||(c.margin=u.margin,c.speed=u.speed,c.start(t))}}};a.signals.on("stop-active",function(){c.stop()}),a.signals.on("action-move",c.onInteractionMove),l.perAction.autoScroll=c.defaults,t.exports=c},{"./Interaction":5,"./defaultOptions":18,"./utils/domUtils":39,"./utils/is":46,"./utils/raf":50,"./utils/window":52}],12:[function(e,t,n){"use strict";var r=e("../Interactable"),i=e("../actions/base"),o=e("../utils/is"),s=e("../utils/domUtils");r.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},r.prototype.ignoreFrom=function(e){return this._backCompatOption("ignoreFrom",e)},r.prototype.allowFrom=function(e){return this._backCompatOption("allowFrom",e)},r.prototype.testIgnore=function(e,t,n){return!(!e||!o.element(n))&&(o.string(e)?s.matchesUpTo(n,e,t):!!o.element(e)&&s.nodeContains(e,n))},r.prototype.testAllow=function(e,t,n){return!e||!!o.element(n)&&(o.string(e)?s.matchesUpTo(n,e,t):!!o.element(e)&&s.nodeContains(e,n))},r.prototype.testIgnoreAllow=function(e,t,n){return!this.testIgnore(e.ignoreFrom,t,n)&&this.testAllow(e.allowFrom,t,n)},r.prototype.actionChecker=function(e){return o.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},r.prototype.styleCursor=function(e){return o.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},r.prototype.defaultActionChecker=function(e,t,n,r){for(var o=this.getRect(r),s=null,a=i.names,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var u=p;if((!n.pointerIsDown||!n.mouse||0!=(t.buttons&this.options[u].mouseButtons))&&(s=i[u].checker(e,t,this,r,n,o)))return s}}},{"../Interactable":4,"../actions/base":6,"../utils/domUtils":39,"../utils/is":46}],13:[function(e,t,n){"use strict";function r(e,t,n,r){return g.is.object(e)&&t.testIgnoreAllow(t.options[e.name],n,r)&&t.options[e.name].enabled&&a(t,n,e)?e:null}function i(e,t,n,i,o,s){for(var a=0,l=i.length;a=m.maxInteractions)return!1;if(u.target===e){if((a+=d===n.name|0)>=i)return!1;if(u.element===t&&(l++,d!==n.name||l>=o))return!1}}}return m.maxInteractions>0}}var l=e("../interact"),c=e("../Interactable"),p=e("../Interaction"),u=e("../actions/base"),d=e("../defaultOptions"),f=e("../utils/browser"),v=e("../scope"),g=e("../utils"),h=e("../utils/Signals").new();e("./InteractableMethods");var m={signals:h,withinInteractionLimit:a,maxInteractions:1/0,defaults:{perAction:{manualStart:!1,max:1/0,maxPerElement:1,allowFrom:null,ignoreFrom:null}},setActionDefaults:function(e){g.extend(e.defaults,m.defaults.perAction)}};p.signals.on("down",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;if(!t.interacting()){s(t,o(t,n,r,i))}}),p.signals.on("move",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;if(t.mouse&&!t.pointerIsDown&&!t.interacting()){s(t,o(t,n,r,i))}}),p.signals.on("move",function(e){var t=e.interaction,n=e.event;if(t.pointerIsDown&&!t.interacting()&&t.pointerWasMoved&&t.prepared.name){h.fire("before-start",e);var r=t.target;t.prepared.name&&r&&(r.options[t.prepared.name].manualStart||!a(r,t.element,t.prepared)?t.stop(n):t.start(t.prepared,r,t.element))}}),p.signals.on("stop",function(e){var t=e.interaction,n=t.target;n&&n.options.styleCursor&&(n._doc.documentElement.style.cursor="")}),c.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},c.prototype.actionChecker=function(e){return g.is.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},c.prototype.styleCursor=function(e){return g.is.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},c.prototype.defaultActionChecker=function(e,t,n,r){for(var i=this.getRect(r),o=t.buttons||{0:1,1:4,3:8,4:16}[t.button],s=null,a=u.names,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var d=p;if((!n.pointerIsDown||!n.mouse||0!=(o&this.options[d].mouseButtons))&&(s=u[d].checker(e,t,this,r,n,i)))return s}},l.maxInteractions=function(e){return g.is.number(e)?(m.maxInteractions=e,this):m.maxInteractions},c.settingsMethods.push("styleCursor"),c.settingsMethods.push("actionChecker"),c.settingsMethods.push("ignoreFrom"),c.settingsMethods.push("allowFrom"),d.base.actionChecker=null,d.base.styleCursor=!0,g.extend(d.perAction,m.defaults.perAction),t.exports=m},{"../Interactable":4,"../Interaction":5,"../actions/base":6,"../defaultOptions":18,"../interact":21,"../scope":34,"../utils":44,"../utils/Signals":35,"../utils/browser":37,"./InteractableMethods":12}],14:[function(e,t,n){"use strict";var r=e("./base"),i=e("../Interaction");i.signals.on("new",function(e){e.delayTimer=null}),r.signals.on("prepared",function(e){var t=e.interaction,n=t.prepared.name;if(n){var r=t.target.options[n].delay;r>0&&(t.delayTimer=setTimeout(function(){t.start(t.prepared,t.target,t.element)},r))}}),i.signals.on("move",function(e){var t=e.interaction,n=e.duplicate;t.pointerWasMoved&&!n&&clearTimeout(t.delayTimer)}),r.signals.on("before-start",function(e){var t=e.interaction,n=t.prepared.name;if(n){t.target.options[n].delay>0&&(t.prepared.name=null)}})},{"../Interaction":5,"./base":13}],15:[function(e,t,n){"use strict";function r(e,t){if(!t)return!1;var n=t.options.drag.startAxis;return"xy"===e||"xy"===n||n===e}var i=e("./base"),o=e("../scope"),s=e("../utils/browser"),a=e("../utils/is"),l=e("../utils/domUtils"),c=l.matchesSelector,p=l.parentNode;i.setActionDefaults(e("../actions/drag")),i.signals.on("before-start",function(e){var t=e.interaction,n=e.eventTarget,l=e.dx,u=e.dy;if("drag"===t.prepared.name){var d=Math.abs(l),f=Math.abs(u),v=t.target.options.drag,g=v.startAxis,h=d>f?"x":dl.minSpeed&&g>l.endSpeed,b={interaction:t,pageCoords:v,statuses:f,preEnd:!0,requireEndOnly:!0};y&&!x&&(c.resetStatuses(f),m=c.setAll(b),m.shouldMove&&m.locked&&(h=!0)),(x||h)&&(p.copyCoords(i.upCoords,t.curCoords),t.pointers[0]=i.startEvent=new a(t,n,t.prepared.name,"inertiastart",t.element),i.t0=d,i.active=!0,i.allowResume=l.allowResume,t.simulation=i,o.fire(i.startEvent),x?(i.vx0=t.pointerDelta.client.vx,i.vy0=t.pointerDelta.client.vy,i.v0=g,r(t,i),p.extend(v,t.curCoords.page),v.x+=i.xe,v.y+=i.ye,c.resetStatuses(f),m=c.setAll(b),i.modifiedXe+=m.dx,i.modifiedYe+=m.dy,i.i=u.request(t.boundInertiaFrame)):(i.smoothEnd=!0,i.xe=m.dx,i.ye=m.dy,i.sx=i.sy=0,i.i=u.request(t.boundSmoothEndFrame)))}}),l.signals.on("stop-active",function(e){var t=e.interaction,n=t.inertiaStatus;n.active&&(u.cancel(n.i),n.active=!1,t.simulation=null)})},{"./InteractEvent":3,"./Interaction":5,"./modifiers":24,"./utils":44,"./utils/raf":50}],21:[function(e,t,n){"use strict";function r(e,t){var n=a.interactables.get(e,t);return n||(n=new l(e,t),n.events.global=p),n}var i=e("./utils/browser"),o=e("./utils/events"),s=e("./utils"),a=e("./scope"),l=e("./Interactable"),c=e("./Interaction"),p={};r.isSet=function(e,t){return-1!==a.interactables.indexOfElement(e,t&&t.context)},r.on=function(e,t,n){if(s.is.string(e)&&-1!==e.search(" ")&&(e=e.trim().split(/ +/)),s.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.on(f,t,n)}return r}if(s.is.object(e)){for(var v in e)r.on(v,e[v],t);return r}return s.contains(l.eventTypes,e)?p[e]?p[e].push(t):p[e]=[t]:o.add(a.document,e,t,{options:n}),r},r.off=function(e,t,n){if(s.is.string(e)&&-1!==e.search(" ")&&(e=e.trim().split(/ +/)),s.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.off(f,t,n)}return r}if(s.is.object(e)){for(var v in e)r.off(v,e[v],t);return r}if(s.contains(l.eventTypes,e)){var g=void 0;e in p&&-1!==(g=s.indexOf(p[e],t))&&p[e].splice(g,1)}else o.remove(a.document,e,t,n);return r},r.debug=function(){return a},r.getPointerAverage=s.pointerAverage,r.getTouchBBox=s.touchBBox,r.getTouchDistance=s.touchDistance,r.getTouchAngle=s.touchAngle,r.getElementRect=s.getElementRect,r.getElementClientRect=s.getElementClientRect,r.matchesSelector=s.matchesSelector,r.closest=s.closest,r.supportsTouch=function(){return i.supportsTouch},r.supportsPointerEvent=function(){return i.supportsPointerEvent},r.stop=function(e){for(var t=a.interactions.length-1;t>=0;t--)a.interactions[t].stop(e);return r},r.pointerMoveTolerance=function(e){return s.is.number(e)?(c.pointerMoveTolerance=e,this):c.pointerMoveTolerance},r.addDocument=a.addDocument,r.removeDocument=a.removeDocument,a.interact=r,t.exports=r},{"./Interactable":4,"./Interaction":5,"./scope":34,"./utils":44,"./utils/browser":37,"./utils/events":40}],22:[function(e,t,n){"use strict";function r(e){var t=e.interaction,n=e.event;t.target&&t.target.checkAndPreventDefault(n)}var i=e("./Interactable"),o=e("./Interaction"),s=e("./scope"),a=e("./utils/is"),l=e("./utils/events"),c=e("./utils/domUtils"),p=c.nodeContains,u=c.matchesSelector;i.prototype.preventDefault=function(e){return/^(always|never|auto)$/.test(e)?(this.options.preventDefault=e,this):a.bool(e)?(this.options.preventDefault=e?"always":"never",this):this.options.preventDefault},i.prototype.checkAndPreventDefault=function(e){var t=this.options.preventDefault;if("never"!==t)return"always"===t?void e.preventDefault():void(l.supportsOptions||/^(mouse|pointer|touch)*(down|start)/i.test(e.type)||a.element(e.target)&&u(e.target,"input,select,textarea,[contenteditable=true],[contenteditable=true] *")||e.preventDefault())};for(var d=["down","move","up","cancel"],f=0;f=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i;if(o.element&&(o.element===e.target||p(o.element,e.target)))return void o.target.checkAndPreventDefault(e)}}},{"./Interactable":4,"./Interaction":5,"./scope":34,"./utils/domUtils":39,"./utils/events":40,"./utils/is":46}],23:[function(e,t,n){"use strict";function r(e){var t=e.target,n=a.search(e,e.type,t);n&&n.prevTap&&e.clientX===n.prevTap.clientX&&e.clientY===n.prevTap.clientY&&t===n.prevTap.target&&(n.downTargets[0]=t,n.downTimes[0]=(new Date).getTime(),l.fire({interaction:n,event:e,eventTarget:t,pointer:e,type:"tap"}))}var i=e("./scope"),o=e("./utils/events"),s=e("./utils/browser"),a=e("./utils/interactionFinder"),l=e("./pointerEvents/base"),c=e("./utils/window"),p=c.window,u=Object.prototype.toString;if(p.Array.isArray||(p.Array.isArray=function(e){return"[object Array]"===u.call(e)}),String.prototype.trim||(String.prototype.trim=function(){return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")}),s.isIE8){var d=function(e){for(var t=i.interactions,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var o;if(n){if(r>=t.length)break;o=t[r++]}else{if(r=t.next(),r.done)break;o=r.value}var s=o;s.interacting()&&s.target.checkAndPreventDefault(e)}},f=function(e,t){var n=e.doc,i=(e.win,0===t.indexOf("listen")?o.add:o.remove);i(n,"selectstart",d),l&&i(n,"dblclick",r)};i.signals.on("add-document",f),i.signals.on("remove-document",f)}t.exports=null},{"./pointerEvents/base":31,"./scope":34,"./utils/browser":37,"./utils/events":40,"./utils/interactionFinder":45,"./utils/window":52}],24:[function(e,t,n){"use strict";function r(e,t,n){return e&&e.enabled&&(t||!e.endOnly)&&(!n||e.endOnly)}var i=e("../InteractEvent"),o=e("../Interaction"),s=e("../utils/extend"),a={names:[],setOffsets:function(e){var t=e.interaction,n=e.pageCoords,r=t.target,i=t.element,o=t.startOffset,s=r.getRect(i);s?(o.left=n.x-s.left,o.top=n.y-s.top,o.right=s.right-n.x,o.bottom=s.bottom-n.y,"width"in s||(s.width=s.right-s.left),"height"in s||(s.height=s.bottom-s.top)):o.left=o.top=o.right=o.bottom=0,e.rect=s,e.interactable=r,e.element=i;for(var l=0;l=p.length)break;f=p[d++]}else{if(d=p.next(),d.done)break;f=d.value}var v=f,g=a[v],h=t.target.options[t.prepared.name][v];r(h,i,o)&&(e.status=e.status=n[v],e.options=h,e.offset=e.interaction.modifierOffsets[v],g.set(e),e.status.locked&&(l.x+=e.status.dx,l.y+=e.status.dy,c.dx+=e.status.dx,c.dy+=e.status.dy,c.locked=!0))}return c.shouldMove=!e.status||!c.locked||e.status.changed,c},resetStatuses:function(e){for(var t=a.names,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var i;if(n){if(r>=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i,s=e[o]||{};s.dx=s.dy=0,s.modifiedX=s.modifiedY=NaN,s.locked=!1,s.changed=!0,e[o]=s}return e},start:function(e,t){var n=e.interaction,r={interaction:n,pageCoords:("action-resume"===t?n.curCoords:n.startCoords).page,startOffset:n.startOffset,statuses:n.modifierStatuses,preEnd:!1,requireEndOnly:!1};a.setOffsets(r),a.resetStatuses(r.statuses),r.pageCoords=s({},n.startCoords.page),n.modifierResult=a.setAll(r)}};o.signals.on("new",function(e){e.startOffset={left:0,right:0,top:0,bottom:0},e.modifierOffsets={},e.modifierStatuses=a.resetStatuses({}),e.modifierResult=null}),o.signals.on("action-start",a.start),o.signals.on("action-resume",a.start),o.signals.on("before-action-move",function(e){var t=e.interaction,n=e.preEnd,r=e.interactingBeforeMove,i=a.setAll({interaction:t,preEnd:n,pageCoords:t.curCoords.page,statuses:t.modifierStatuses,requireEndOnly:!1});!i.shouldMove&&r&&(t._dontFireMove=!0),t.modifierResult=i}),o.signals.on("action-end",function(e){for(var t=e.interaction,n=e.event,i=0;i=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}var m=h,y=m.x,x=m.y;l.push({x:s.left-i.width*y+u.x,y:s.top-i.height*x+u.y})}else l.push(u);return l},set:function(e){var t=e.interaction,n=e.pageCoords,r=e.status,i=e.options,s=e.offset,a=[],l=void 0,c=void 0,p=void 0;if(r.useStatusXY)c={x:r.x,y:r.y};else{var u=o.getOriginXY(t.target,t.element,t.prepared.name);c=o.extend({},n),c.x-=u.x,c.y-=u.y}r.realX=c.x,r.realY=c.y;for(var d=i.targets?i.targets.length:0,f=s,v=Array.isArray(f),g=0,f=v?f:f[Symbol.iterator]();;){var h;if(v){if(g>=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}for(var m=h,y=m.x,x=m.y,b=c.x-y,w=c.y-x,E=i.targets,S=Array.isArray(E),T=0,E=S?E:E[Symbol.iterator]();;){var C;if(S){if(T>=E.length)break;C=E[T++]}else{if(T=E.next(),T.done)break;C=T.value}var A=C;l=o.is.function(A)?A(b,w,t):A,l&&a.push({x:o.is.number(l.x)?l.x+y:b,y:o.is.number(l.y)?l.y+x:w,range:o.is.number(l.range)?l.range:i.range})}}var D={target:null,inRange:!1,distance:0,range:0,dx:0,dy:0};for(p=0,d=a.length;p=p.length)break;f=p[d++]}else{if(d=p.next(),d.done)break;f=d.value}var v=f,g=void 0;g=a.is.function(v)?v(l,c,t):v,g&&("width"in g&&"height"in g&&(g.x=g.width,g.y=g.height),e.options.targets.push(g))}i.set(e)},modifyCoords:function(e){var t=e.options;e.options=a.extend({},t), -e.options.enabled=t.enabled,e.options.relativePoints=[null],i.modifyCoords(e)}};r.snapSize=l,r.names.push("snapSize"),o.perAction.snapSize=l.defaults,s.defaults.snapSize=l.defaults,t.exports=l},{"../actions/resize":10,"../defaultOptions":18,"../utils/":44,"./index":24,"./snap":28}],30:[function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=e("../utils/pointerUtils");t.exports=function(){function e(t,n,o,s,a){if(r(this,e),i.pointerExtend(this,o),o!==n&&i.pointerExtend(this,n),this.interaction=a,this.timeStamp=(new Date).getTime(),this.originalEvent=o,this.type=t,this.pointerId=i.getPointerId(n),this.pointerType=i.getPointerType(n,a),this.target=s,this.currentTarget=null,"tap"===t){var l=a.getPointerIndex(n);this.dt=this.timeStamp-a.downTimes[l];var c=this.timeStamp-a.tapTime;this.double=!!(a.prevTap&&"doubletap"!==a.prevTap.type&&a.prevTap.target===this.target&&c<500)}else"doubletap"===t&&(this.dt=n.timeStamp-a.tapTime)}return e.prototype.subtractOrigin=function(e){var t=e.x,n=e.y;return this.pageX-=t,this.pageY-=n,this.clientX-=t,this.clientY-=n,this},e.prototype.addOrigin=function(e){var t=e.x,n=e.y;return this.pageX+=t,this.pageY+=n,this.clientX+=t,this.clientY+=n,this},e.prototype.preventDefault=function(){this.originalEvent.preventDefault()},e.prototype.stopPropagation=function(){this.propagationStopped=!0},e.prototype.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},e}()},{"../utils/pointerUtils":49}],31:[function(e,t,n){"use strict";function r(e){for(var t=e.interaction,n=e.pointer,s=e.event,l=e.eventTarget,c=e.type,u=void 0===c?e.pointerEvent.type:c,d=e.targets,f=void 0===d?i(e):d,v=e.pointerEvent,g=void 0===v?new o(u,n,s,l,t):v,h={interaction:t,pointer:n,event:s,eventTarget:l,targets:f,type:u,pointerEvent:g},m=0;m=u.length)break;g=u[v++]}else{if(v=u.next(),v.done)break;g=v.value}var h=g;c.element=h,p.fire("collect-targets",c)}return"hold"===o&&(c.targets=d(c.targets,function(e){return e.eventable.options.holdDuration===t.holdTimers[s].duration})),c.targets}var o=e("./PointerEvent"),s=e("../Interaction"),a=e("../utils"),l=e("../utils/browser"),c=e("../defaultOptions"),p=e("../utils/Signals").new(),u=e("../utils/arr"),d=u.filter,f=["down","up","cancel"],v=["down","up","cancel"],g={PointerEvent:o,fire:r,collectEventTargets:i,signals:p,defaults:{holdDuration:600,ignoreFrom:null,allowFrom:null,origin:{x:0,y:0}},types:["down","move","up","cancel","tap","doubletap","hold"]};s.signals.on("update-pointer-down",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers[n]={duration:1/0,timeout:null}}),s.signals.on("remove-pointer",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers.splice(n,1)}),s.signals.on("move",function(e){var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,s=e.duplicateMove,a=t.getPointerIndex(n);s||t.pointerIsDown&&!t.pointerWasMoved||(t.pointerIsDown&&clearTimeout(t.holdTimers[a].timeout),r({interaction:t,pointer:n,event:i,eventTarget:o,type:"move"}))}),s.signals.on("down",function(e){for(var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,s=e.pointerIndex,c=l.isIE8?a.extend({},i):i,u=t.holdTimers[s],d=a.getPath(o),f={interaction:t,pointer:n,event:i,eventTarget:o,type:"hold",targets:[],path:d,element:null},v=d,g=Array.isArray(v),h=0,v=g?v:v[Symbol.iterator]();;){var m;if(g){if(h>=v.length)break;m=v[h++]}else{if(h=v.next(),h.done)break;m=h.value}var y=m;f.element=y,p.fire("collect-targets",f)}if(f.targets.length){for(var x=1/0,b=0;b=0&&(p.selectors[u]!==e||p.contexts[u]!==t);u--);-1===u&&(u=p.selectors.length,p.selectors.push(e),p.contexts.push(t),p.listeners.push([])),p.listeners[u].push([i,!!s.capture,s.passive])}function s(e,t,n,r,o){var s=f(o),c=O[n],p=!1,u=void 0;if(c)for(u=c.selectors.length-1;u>=0;u--)if(c.selectors[u]===e&&c.contexts[u]===t){for(var d=c.listeners[u],v=d.length-1;v>=0;v--){var g=d[v],h=g[0],m=g[1],y=g[2];if(h===r&&m===!!s.capture&&y===s.passive){d.splice(v,1),d.length||(c.selectors.splice(u,1),c.contexts.splice(u,1),c.listeners.splice(u,1),i(t,n,a),i(t,n,l,!0),c.selectors.length||(O[n]=null)),p=!0;break}}if(p)break}}function a(e,t){var n=f(t),r={},i=O[e.type],o=g.getActualElement(e.path?e.path[0]:e.target),s=o;for(h(r,e),r.originalEvent=e,r.preventDefault=p;v.element(s);){for(var a=0;a=l.length)break;u=l[p++]}else{if(p=l.next(),p.done)break;u=p.value}var d=u,f=s[d](a);if(f)return f}},simulationResume:function(e){var t=e.mouseEvent,n=e.eventType,o=e.eventTarget;if(!/down|start/i.test(n))return null;for(var s=r.interactions,a=Array.isArray(s),l=0,s=a?s:s[Symbol.iterator]();;){var c;if(a){if(l>=s.length)break;c=s[l++]}else{if(l=s.next(),l.done)break;c=l.value}var p=c,u=o;if(p.simulation&&p.simulation.allowResume&&p.mouse===t)for(;u;){if(u===p.element)return p;u=i.parentNode(u)}}return null},mouse:function(e){var t=e.pointerId,n=e.mouseEvent,s=e.eventType;if(!n&&(o.supportsTouch||o.supportsPointerEvent))return null;for(var a=void 0,l=r.interactions,c=Array.isArray(l),p=0,l=c?l:l[Symbol.iterator]();;){var u;if(c){if(p>=l.length)break;u=l[p++]}else{if(p=l.next(),p.done)break;u=p.value}var d=u;if(d.mouse){if(d.simulation&&!i.contains(d.pointerIds,t))continue;if(d.interacting())return d;a||(a=d)}}if(a)return a;for(var f=r.interactions,v=Array.isArray(f),g=0,f=v?f:f[Symbol.iterator]();;){var h;if(v){if(g>=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}var m=h;if(m.mouse&&(!/down/.test(s)||!m.simulation))return m}return null},hasPointer:function(e){for(var t=e.pointerId,n=r.interactions,o=Array.isArray(n),s=0,n=o?n:n[Symbol.iterator]();;){var a;if(o){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var l=a;if(i.contains(l.pointerIds,t))return l}},idle:function(e){for(var t=e.mouseEvent,n=r.interactions,i=Array.isArray(n),o=0,n=i?n:n[Symbol.iterator]();;){var s;if(i){if(o>=n.length)break;s=n[o++]}else{if(o=n.next(),o.done)break;s=o.value}var a=s;if(1===a.pointerIds.length){var l=a.target;if(l&&!l.options.gesture.enabled)continue}else if(a.pointerIds.length>=2)continue;if(!a.interacting()&&t===a.mouse)return a}return null}};t.exports=s},{"../scope":34,"./browser":37,"./index":44}],46:[function(e,t,n){"use strict";var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},i=e("./window"),o=e("./isWindow"),s={array:function(){},window:function(e){return e===i.window||o(e)},docFrag:function(e){return s.object(e)&&11===e.nodeType},object:function(e){return!!e&&"object"===(void 0===e?"undefined":r(e))},function:function(e){return"function"==typeof e},number:function(e){return"number"==typeof e},bool:function(e){return"boolean"==typeof e},string:function(e){return"string"==typeof e},element:function(e){if(!e||"object"!==(void 0===e?"undefined":r(e)))return!1;var t=i.getWindow(e)||i.window;return/object|function/.test(r(t.Element))?e instanceof t.Element:1===e.nodeType&&"string"==typeof e.nodeName}};s.array=function(e){return s.object(e)&&void 0!==e.length&&s.function(e.splice)},t.exports=s},{"./isWindow":47,"./window":52}],47:[function(e,t,n){"use strict";t.exports=function(e){return!(!e||!e.Window)&&e instanceof e.Window}},{}],48:[function(e,t,n){"use strict";function r(e,n){for(var r in n){var i=t.exports.prefixedPropREs,o=!1;for(var s in i)if(0===r.indexOf(s)&&i[s].test(r)){o=!0;break}o||"function"==typeof n[r]||(e[r]=n[r])}return e}r.prefixedPropREs={webkit:/(Movement[XY]|Radius[XY]|RotationAngle|Force)$/},t.exports=r},{}],49:[function(e,t,n){"use strict";var r=e("./hypot"),i=e("./browser"),o=e("./domObjects"),s=e("./domUtils"),a=e("./is"),l=e("./pointerExtend"),c={copyCoords:function(e,t){e.page=e.page||{},e.page.x=t.page.x,e.page.y=t.page.y,e.client=e.client||{},e.client.x=t.client.x,e.client.y=t.client.y,e.timeStamp=t.timeStamp},setCoordDeltas:function(e,t,n){e.page.x=n.page.x-t.page.x,e.page.y=n.page.y-t.page.y,e.client.x=n.client.x-t.client.x,e.client.y=n.client.y-t.client.y,e.timeStamp=n.timeStamp-t.timeStamp;var i=Math.max(e.timeStamp/1e3,.001);e.page.speed=r(e.page.x,e.page.y)/i,e.page.vx=e.page.x/i,e.page.vy=e.page.y/i,e.client.speed=r(e.client.x,e.page.y)/i,e.client.vx=e.client.x/i,e.client.vy=e.client.y/i},isNativePointer:function(e){return e instanceof o.Event||e instanceof o.Touch},getXY:function(e,t,n){return n=n||{},e=e||"page",n.x=t[e+"X"],n.y=t[e+"Y"],n},getPageXY:function(e,t){return t=t||{},i.isOperaMobile&&c.isNativePointer(e)?(c.getXY("screen",e,t),t.x+=window.scrollX,t.y+=window.scrollY):c.getXY("page",e,t),t},getClientXY:function(e,t){return t=t||{},i.isOperaMobile&&c.isNativePointer(e)?c.getXY("screen",e,t):c.getXY("client",e,t),t},getPointerId:function(e){return a.number(e.pointerId)?e.pointerId:e.identifier},setCoords:function(e,t,n){var r=t.length>1?c.pointerAverage(t):t[0],i={};c.getPageXY(r,i),e.page.x=i.x,e.page.y=i.y,c.getClientXY(r,i),e.client.x=i.x,e.client.y=i.y,e.timeStamp=a.number(n)?n:(new Date).getTime()},pointerExtend:l,getTouchPair:function(e){var t=[];return a.array(e)?(t[0]=e[0],t[1]=e[1]):"touchend"===e.type?1===e.touches.length?(t[0]=e.touches[0],t[1]=e.changedTouches[0]):0===e.touches.length&&(t[0]=e.changedTouches[0],t[1]=e.changedTouches[1]):(t[0]=e.touches[0],t[1]=e.touches[1]),t},pointerAverage:function(e){for(var t={pageX:0,pageY:0,clientX:0,clientY:0,screenX:0,screenY:0},n=e,r=Array.isArray(n),i=0,n=r?n:n[Symbol.iterator]();;){var o;if(r){if(i>=n.length)break;o=n[i++]}else{if(i=n.next(),i.done)break;o=i.value}var s=o;for(var a in t)t[a]+=s[a]}for(var l in t)t[l]/=e.length;return t},touchBBox:function(e){if(e.length||e.touches&&e.touches.length>1){var t=c.getTouchPair(e),n=Math.min(t[0].pageX,t[1].pageX),r=Math.min(t[0].pageY,t[1].pageY);return{x:n,y:r,left:n,top:r,width:Math.max(t[0].pageX,t[1].pageX)-n,height:Math.max(t[0].pageY,t[1].pageY)-r}}},touchDistance:function(e,t){var n=t+"X",i=t+"Y",o=c.getTouchPair(e),s=o[0][n]-o[1][n],a=o[0][i]-o[1][i];return r(s,a)},touchAngle:function(e,t,n){var r=n+"X",i=n+"Y",o=c.getTouchPair(e),s=o[1][r]-o[0][r],a=o[1][i]-o[0][i];return 180*Math.atan2(a,s)/Math.PI},getPointerType:function(e,t){return t.mouse?"mouse":i.supportsPointerEvent?a.string(e.pointerType)?e.pointerType:[void 0,void 0,"touch","pen","mouse"][e.pointerType]:"touch"},getEventTargets:function(e){return[s.getActualElement(e.path?e.path[0]:e.target),s.getActualElement(e.currentTarget)]}};t.exports=c},{"./browser":37,"./domObjects":38,"./domUtils":39,"./hypot":43,"./is":46,"./pointerExtend":48}],50:[function(e,t,n){"use strict";for(var r=e("./window"),i=r.window,o=["ms","moz","webkit","o"],s=0,a=void 0,l=void 0,c=0;c6&&void 0!==arguments[6]&&arguments[6];r(this,e);var f=t.target,v=(f&&f.options||s).deltaSource,g=o(f,p,l),h="start"===c,m="end"===c,y=h?t.startCoords:t.curCoords,x=t.prevEvent;p=p||t.element;var b=i({},y.page),w=i({},y.client);b.x-=g.x,b.y-=g.y,w.x-=g.x,w.y-=g.y,this.ctrlKey=n.ctrlKey,this.altKey=n.altKey,this.shiftKey=n.shiftKey,this.metaKey=n.metaKey,this.button=n.button,this.buttons=n.buttons,this.target=p,this.currentTarget=p,this.relatedTarget=u||null,this.preEnd=d,this.type=l+(c||""),this.interaction=t,this.interactable=f,this.t0=h?t.downTimes[t.downTimes.length-1]:x.t0;var E={interaction:t,event:n,action:l,phase:c,element:p,related:u,page:b,client:w,coords:y,starting:h,ending:m,deltaSource:v,iEvent:this};a.fire("set-xy",E),m?(this.pageX=x.pageX,this.pageY=x.pageY,this.clientX=x.clientX,this.clientY=x.clientY):(this.pageX=b.x,this.pageY=b.y,this.clientX=w.x,this.clientY=w.y),this.x0=t.startCoords.page.x-g.x,this.y0=t.startCoords.page.y-g.y,this.clientX0=t.startCoords.client.x-g.x,this.clientY0=t.startCoords.client.y-g.y,a.fire("set-delta",E),this.timeStamp=y.timeStamp,this.dt=t.pointerDelta.timeStamp,this.duration=this.timeStamp-this.t0,this.speed=t.pointerDelta[v].speed,this.velocityX=t.pointerDelta[v].vx,this.velocityY=t.pointerDelta[v].vy,this.swipe=m||"inertiastart"===c?this.getSwipe():null,a.fire("new",E)}return e.prototype.getSwipe=function(){var e=this.interaction;if(e.prevEvent.speed<600||this.timeStamp-e.prevEvent.timeStamp>150)return null;var t=180*Math.atan2(e.prevEvent.velocityY,e.prevEvent.velocityX)/Math.PI;t<0&&(t+=360);var n=112.5<=t&&t<247.5,r=202.5<=t&&t<337.5,i=!n&&(292.5<=t||t<67.5);return{up:r,down:!r&&22.5<=t&&t<157.5,left:n,right:i,angle:t,speed:e.prevEvent.speed,velocity:{x:e.prevEvent.velocityX,y:e.prevEvent.velocityY}}},e.prototype.preventDefault=function(){},e.prototype.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},e.prototype.stopPropagation=function(){this.propagationStopped=!0},e}();a.on("set-delta",function(e){var t=e.iEvent,n=e.interaction,r=e.starting,i=e.deltaSource,o=r?t:n.prevEvent;"client"===i?(t.dx=t.clientX-o.clientX,t.dy=t.clientY-o.clientY):(t.dx=t.pageX-o.pageX,t.dy=t.pageY-o.pageY)}),l.signals=a,t.exports=l},{"./defaultOptions":18,"./utils/Signals":35,"./utils/extend":41,"./utils/getOriginXY":42}],4:[function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=e("./utils/is"),o=e("./utils/events"),s=e("./utils/extend"),a=e("./actions/base"),l=e("./scope"),c=e("./Eventable"),p=e("./defaultOptions"),u=e("./utils/Signals").new(),d=e("./utils/domUtils"),f=d.getElementRect,v=d.nodeContains,g=d.trySelector,h=e("./utils/window"),m=h.getWindow,y=e("./utils/arr"),x=y.indexOf,b=y.contains,w=e("./utils/browser"),E=w.wheelEvent;l.interactables=[];var S=function(){function e(t,n){r(this,e),n=n||{},this.target=t,this.events=new c,this._context=n.context||l.document,this._win=m(g(t)?this._context:t),this._doc=this._win.document,u.fire("new",{target:t,options:n,interactable:this,win:this._win}),l.addDocument(this._doc,this._win),l.interactables.push(this),this.set(n)}return e.prototype.setOnEvents=function(e,t){var n="on"+e;return i.function(t.onstart)&&(this.events[n+"start"]=t.onstart),i.function(t.onmove)&&(this.events[n+"move"]=t.onmove),i.function(t.onend)&&(this.events[n+"end"]=t.onend),i.function(t.oninertiastart)&&(this.events[n+"inertiastart"]=t.oninertiastart),this},e.prototype.setPerAction=function(e,t){for(var n in t)n in p[e]&&(i.object(t[n])?(this.options[e][n]=s(this.options[e][n]||{},t[n]),i.object(p.perAction[n])&&"enabled"in p.perAction[n]&&(this.options[e][n].enabled=!1!==t[n].enabled)):i.bool(t[n])&&i.object(p.perAction[n])?this.options[e][n].enabled=t[n]:void 0!==t[n]&&(this.options[e][n]=t[n]))},e.prototype.getRect=function(e){return e=e||this.target,i.string(this.target)&&!i.element(e)&&(e=this._context.querySelector(this.target)),f(e)},e.prototype.rectChecker=function(e){return i.function(e)?(this.getRect=e,this):null===e?(delete this.options.getRect,this):this.getRect},e.prototype._backCompatOption=function(e,t){if(g(t)||i.object(t)){this.options[e]=t;for(var n=a.names,r=Array.isArray(n),o=0,n=r?n:n[Symbol.iterator]();;){var s;if(r){if(o>=n.length)break;s=n[o++]}else{if(o=n.next(),o.done)break;s=o.value}var l=s;this.options[l][e]=t}return this}return this.options[e]},e.prototype.origin=function(e){return this._backCompatOption("origin",e)},e.prototype.deltaSource=function(e){return"page"===e||"client"===e?(this.options.deltaSource=e,this):this.options.deltaSource},e.prototype.context=function(){return this._context},e.prototype.inContext=function(e){return this._context===e.ownerDocument||v(this._context,e)},e.prototype.fire=function(e){return this.events.fire(e),this},e.prototype._onOffMultiple=function(e,t,n,r){if(i.string(t)&&-1!==t.search(" ")&&(t=t.trim().split(/ +/)),i.array(t)){for(var o=0;o=l.length)break;f=l[d++]}else{if(d=l.next(),d.done)break;f=d.value}var v=f;this.options[v]=p.base[v],v in t&&this[v](t[v])}return u.fire("set",{options:t,interactable:this}),this},e.prototype.unset=function(){if(o.remove(this.target,"all"),i.string(this.target))for(var e in o.delegatedEvents){var t=o.delegatedEvents[e];t.selectors[0]===this.target&&t.contexts[0]===this._context&&(t.selectors.splice(0,1),t.contexts.splice(0,1),t.listeners.splice(0,1),t.selectors.length||(t[e]=null)),o.remove(this._context,e,o.delegateListener),o.remove(this._context,e,o.delegateUseCapture,!0)}else o.remove(this,"all");u.fire("unset",{interactable:this}),l.interactables.splice(x(l.interactables,this),1);for(var n=l.interactions||[],r=Array.isArray(n),s=0,n=r?n:n[Symbol.iterator]();;){var a;if(r){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var c=a;c.target===this&&c.interacting()&&c.stop()}return l.interact},e}();l.interactables.indexOfElement=function(e,t){t=t||l.document;for(var n=0;n=x.length)break;E=x[w++]}else{if(w=x.next(),w.done)break;E=w.value}var S=E,T=S[0],C=S[1];C._updateEventTargets(i,o),C[e](T,t,i,o)}}}function o(e){for(var t=0;te.pointerMoveTolerance);var a={pointer:t,pointerIndex:this.getPointerIndex(t),event:n,eventTarget:r,dx:o,dy:s,duplicate:i,interaction:this,interactingBeforeMove:this.interacting()};i||l.setCoordDeltas(this.pointerDelta,this.prevCoords,this.curCoords),f.fire("move",a),i||(this.interacting()&&this.doMove(a),this.pointerWasMoved&&l.copyCoords(this.prevCoords,this.curCoords))},e.prototype.doMove=function(e){e=l.extend({pointer:this.pointers[0],event:this.prevEvent,eventTarget:this._eventTarget,interaction:this},e||{}),f.fire("before-action-move",e),this._dontFireMove||f.fire("action-move",e),this._dontFireMove=!1},e.prototype.pointerUp=function(e,t,n,r){var i=this.getPointerIndex(e);f.fire(/cancel$/i.test(t.type)?"cancel":"up",{pointer:e,pointerIndex:i,event:t,eventTarget:n,curEventTarget:r,interaction:this}),this.simulation||this.end(t),this.pointerIsDown=!1,this.removePointer(e,t)},e.prototype.end=function(e){e=e||this.prevEvent,this.interacting()&&f.fire("action-end",{event:e,interaction:this}),this.stop()},e.prototype.currentAction=function(){return this._interacting?this.prepared.name:null},e.prototype.interacting=function(){return this._interacting},e.prototype.stop=function(){f.fire("stop",{interaction:this}),this._interacting&&(f.fire("stop-active",{interaction:this}),f.fire("stop-"+this.prepared.name,{interaction:this})),this.target=this.element=null,this._interacting=!1,this.prepared.name=this.prevEvent=null},e.prototype.getPointerIndex=function(e){return"mouse"===this.pointerType||"pen"===this.pointerType?0:l.indexOf(this.pointerIds,l.getPointerId(e))},e.prototype.updatePointer=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:t&&/(down|start)$/i.test(t.type),r=l.getPointerId(e),i=this.getPointerIndex(e);return-1===i&&(i=this.pointerIds.length,this.pointerIds[i]=r),n&&f.fire("update-pointer-down",{pointer:e,event:t,down:n,pointerId:r,pointerIndex:i,interaction:this}),this.pointers[i]=e,i},e.prototype.removePointer=function(e,t){var n=this.getPointerIndex(e);-1!==n&&(f.fire("remove-pointer",{pointer:e,event:t,pointerIndex:n,interaction:this}),this.pointers.splice(n,1),this.pointerIds.splice(n,1),this.downTargets.splice(n,1),this.downTimes.splice(n,1))},e.prototype._updateEventTargets=function(e,t){this._eventTarget=e,this._curEventTarget=t},e}(),y=0,x=g.length;y=i.length)break;a=i[s++]}else{if(s=i.next(),s.done)break;a=s.value}var l=a;if(l.options.drop.enabled){var c=l.options.drop.accept;if(!(p.is.element(c)&&c!==t||p.is.string(c)&&!p.matchesSelector(t,c)))for(var d=p.is.string(l.target)?l._context.querySelectorAll(l.target):[l.target],f=0;fo.left&&c.xo.top&&c.y=o.left&&v<=o.right&&g>=o.top&&g<=o.bottom}if(f&&p.is.number(a)){s=Math.max(0,Math.min(o.right,f.right)-Math.max(o.left,f.left))*Math.max(0,Math.min(o.bottom,f.bottom)-Math.max(o.top,f.top))/(f.width*f.height)>=a}return this.options.drop.checker&&(s=this.options.drop.checker(e,t,s,this,i,n,r)),s},v.signals.on("unset",function(e){e.interactable.dropzone(!1)}),v.settingsMethods.push("dropChecker"),g.signals.on("new",function(e){e.dropTarget=null,e.dropElement=null,e.prevDropTarget=null,e.prevDropElement=null,e.dropEvents=null,e.activeDrops={dropzones:[],elements:[],rects:[]}}),g.signals.on("stop",function(e){var t=e.interaction;t.dropTarget=t.dropElement=t.prevDropTarget=t.prevDropElement=null}),d.dynamicDrop=function(e){return p.is.bool(e)?(y=e,d):y},p.merge(v.eventTypes,["dragenter","dragleave","dropactivate","dropdeactivate","dropmove","drop"]),c.methodDict.drop="dropzone",h.drop=m.defaults,t.exports=m},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../interact":21,"../scope":34,"../utils":44,"./base":6}],9:[function(e,t,n){"use strict";var r=e("./base"),i=e("../utils"),o=e("../InteractEvent"),s=e("../Interactable"),a=e("../Interaction"),l=e("../defaultOptions"),c={defaults:{enabled:!1,origin:null,restrict:null},checker:function(e,t,n,r,i){return i.pointerIds.length>=2?{name:"gesture"}:null},getCursor:function(){return""}};o.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;"gesturestart"===t.type&&(t.ds=0,n.gesture.startDistance=n.gesture.prevDistance=t.distance,n.gesture.startAngle=n.gesture.prevAngle=t.angle,n.gesture.scale=1)}),o.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;"gesturemove"===t.type&&(t.ds=t.scale-n.gesture.scale,n.target.fire(t),n.gesture.prevAngle=t.angle,n.gesture.prevDistance=t.distance,t.scale===1/0||null===t.scale||void 0===t.scale||isNaN(t.scale)||(n.gesture.scale=t.scale))}),s.prototype.gesturable=function(e){return i.is.object(e)?(this.options.gesture.enabled=!1!==e.enabled,this.setPerAction("gesture",e),this.setOnEvents("gesture",e),this):i.is.bool(e)?(this.options.gesture.enabled=e,e||(this.ongesturestart=this.ongesturestart=this.ongestureend=null),this):this.options.gesture},o.signals.on("set-delta",function(e){var t=e.interaction,n=e.iEvent,r=e.action,s=e.event,a=e.starting,l=e.ending,c=e.deltaSource;if("gesture"===r){var p=t.pointers;n.touches=[p[0],p[1]],a?(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=1,n.ds=0,n.angle=i.touchAngle(p,void 0,c),n.da=0):l||s instanceof o?(n.distance=t.prevEvent.distance,n.box=t.prevEvent.box,n.scale=t.prevEvent.scale,n.ds=n.scale-1,n.angle=t.prevEvent.angle,n.da=n.angle-t.gesture.startAngle):(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=n.distance/t.gesture.startDistance,n.angle=i.touchAngle(p,t.gesture.prevAngle,c),n.ds=n.scale-t.gesture.prevScale,n.da=n.angle-t.gesture.prevAngle)}}),a.signals.on("new",function(e){e.gesture={start:{x:0,y:0},startDistance:0,prevDistance:0,distance:0,scale:1,startAngle:0,prevAngle:0}}),r.gesture=c,r.names.push("gesture"),i.merge(s.eventTypes,["gesturestart","gesturemove","gestureend"]),r.methodDict.gesture="gesturable",l.gesture=c.defaults,t.exports=c},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"./base":6}],10:[function(e,t,n){"use strict";function r(e,t,n,r,i,s,a){if(!t)return!1;if(!0===t){var l=o.is.number(s.width)?s.width:s.right-s.left,c=o.is.number(s.height)?s.height:s.bottom-s.top;if(l<0&&("left"===e?e="right":"right"===e&&(e="left")),c<0&&("top"===e?e="bottom":"bottom"===e&&(e="top")),"left"===e)return n.x<(l>=0?s.left:s.right)+a;if("top"===e)return n.y<(c>=0?s.top:s.bottom)+a;if("right"===e)return n.x>(l>=0?s.right:s.left)-a;if("bottom"===e)return n.y>(c>=0?s.bottom:s.top)-a}return!!o.is.element(r)&&(o.is.element(t)?t===r:o.matchesUpTo(r,t,i))}var i=e("./base"),o=e("../utils"),s=e("../utils/browser"),a=e("../InteractEvent"),l=e("../Interactable"),c=e("../Interaction"),p=e("../defaultOptions"),u=s.supportsTouch||s.supportsPointerEvent?20:10,d={defaults:{enabled:!1,mouseButtons:null,origin:null,snap:null,restrict:null,inertia:null,autoScroll:null,square:!1,preserveAspectRatio:!1,axis:"xy",margin:NaN,edges:null,invert:"none"},checker:function(e,t,n,i,s,a){if(!a)return null;var l=o.extend({},s.curCoords.page),c=n.options;if(c.resize.enabled){var p=c.resize,d={left:!1,right:!1,top:!1,bottom:!1};if(o.is.object(p.edges)){for(var f in d)d[f]=r(f,p.edges[f],l,s._eventTarget,i,a,p.margin||u);if(d.left=d.left&&!d.right,d.top=d.top&&!d.bottom,d.left||d.right||d.top||d.bottom)return{name:"resize",edges:d}}else{var v="y"!==c.resize.axis&&l.x>a.right-u,g="x"!==c.resize.axis&&l.y>a.bottom-u;if(v||g)return{name:"resize",axes:(v?"x":"")+(g?"y":"")}}}return null},cursors:s.isIe9OrOlder?{x:"e-resize",y:"s-resize",xy:"se-resize",top:"n-resize",left:"w-resize",bottom:"s-resize",right:"e-resize",topleft:"se-resize",bottomright:"se-resize",topright:"ne-resize",bottomleft:"ne-resize"}:{x:"ew-resize",y:"ns-resize",xy:"nwse-resize",top:"ns-resize",left:"ew-resize",bottom:"ns-resize",right:"ew-resize",topleft:"nwse-resize",bottomright:"nwse-resize",topright:"nesw-resize",bottomleft:"nesw-resize"},getCursor:function(e){if(e.axis)return d.cursors[e.name+e.axis];if(e.edges){for(var t="",n=["top","bottom","left","right"],r=0;r<4;r++)e.edges[n[r]]&&(t+=n[r]);return d.cursors[t]}}};a.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;if("resizestart"===t.type&&n.prepared.edges){var r=n.target.getRect(n.element),i=n.target.options.resize;if(i.square||i.preserveAspectRatio){var s=o.extend({},n.prepared.edges);s.top=s.top||s.left&&!s.bottom,s.left=s.left||s.top&&!s.right,s.bottom=s.bottom||s.right&&!s.top,s.right=s.right||s.bottom&&!s.left,n.prepared._linkedEdges=s}else n.prepared._linkedEdges=null;i.preserveAspectRatio&&(n.resizeStartAspectRatio=r.width/r.height),n.resizeRects={start:r,current:o.extend({},r),inverted:o.extend({},r),previous:o.extend({},r),delta:{left:0,right:0,width:0,top:0,bottom:0,height:0}},t.rect=n.resizeRects.inverted,t.deltaRect=n.resizeRects.delta}}),a.signals.on("new",function(e){var t=e.iEvent,n=e.phase,r=e.interaction;if("move"===n&&r.prepared.edges){var i=r.target.options.resize,s=i.invert,a="reposition"===s||"negate"===s,l=r.prepared.edges,c=r.resizeRects.start,p=r.resizeRects.current,u=r.resizeRects.inverted,d=r.resizeRects.delta,f=o.extend(r.resizeRects.previous,u),v=l,g=t.dx,h=t.dy;if(i.preserveAspectRatio||i.square){var m=i.preserveAspectRatio?r.resizeStartAspectRatio:1;l=r.prepared._linkedEdges,v.left&&v.bottom||v.right&&v.top?h=-g/m:v.left||v.right?h=g/m:(v.top||v.bottom)&&(g=h*m)}if(l.top&&(p.top+=h),l.bottom&&(p.bottom+=h),l.left&&(p.left+=g),l.right&&(p.right+=g),a){if(o.extend(u,p),"reposition"===s){var y=void 0;u.top>u.bottom&&(y=u.top,u.top=u.bottom,u.bottom=y),u.left>u.right&&(y=u.left,u.left=u.right,u.right=y)}}else u.top=Math.min(p.top,c.bottom),u.bottom=Math.max(p.bottom,c.top),u.left=Math.min(p.left,c.right),u.right=Math.max(p.right,c.left);u.width=u.right-u.left,u.height=u.bottom-u.top;for(var x in u)d[x]=u[x]-f[x];t.edges=r.prepared.edges,t.rect=u,t.deltaRect=d}}),l.prototype.resizable=function(e){return o.is.object(e)?(this.options.resize.enabled=!1!==e.enabled,this.setPerAction("resize",e),this.setOnEvents("resize",e),/^x$|^y$|^xy$/.test(e.axis)?this.options.resize.axis=e.axis:null===e.axis&&(this.options.resize.axis=p.resize.axis),o.is.bool(e.preserveAspectRatio)?this.options.resize.preserveAspectRatio=e.preserveAspectRatio:o.is.bool(e.square)&&(this.options.resize.square=e.square),this):o.is.bool(e)?(this.options.resize.enabled=e, +e||(this.onresizestart=this.onresizestart=this.onresizeend=null),this):this.options.resize},c.signals.on("new",function(e){e.resizeAxes="xy"}),a.signals.on("set-delta",function(e){var t=e.interaction,n=e.iEvent;"resize"===e.action&&t.resizeAxes&&(t.target.options.resize.square?("y"===t.resizeAxes?n.dx=n.dy:n.dy=n.dx,n.axes="xy"):(n.axes=t.resizeAxes,"x"===t.resizeAxes?n.dy=0:"y"===t.resizeAxes&&(n.dx=0)))}),i.resize=d,i.names.push("resize"),o.merge(l.eventTypes,["resizestart","resizemove","resizeinertiastart","resizeinertiaresume","resizeend"]),i.methodDict.resize="resizable",p.resize=d.defaults,t.exports=d},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"../utils/browser":37,"./base":6}],11:[function(e,t,n){"use strict";var r=e("./utils/raf"),i=e("./utils/window").getWindow,o=e("./utils/is"),s=e("./utils/domUtils"),a=e("./Interaction"),l=e("./defaultOptions"),c={defaults:{enabled:!1,container:null,margin:60,speed:300},interaction:null,i:null,x:0,y:0,isScrolling:!1,prevTime:0,start:function(e){c.isScrolling=!0,r.cancel(c.i),c.interaction=e,c.prevTime=(new Date).getTime(),c.i=r.request(c.scroll)},stop:function(){c.isScrolling=!1,r.cancel(c.i)},scroll:function(){var e=c.interaction.target.options[c.interaction.prepared.name].autoScroll,t=e.container||i(c.interaction.element),n=(new Date).getTime(),s=(n-c.prevTime)/1e3,a=e.speed*s;a>=1&&(o.window(t)?t.scrollBy(c.x*a,c.y*a):t&&(t.scrollLeft+=c.x*a,t.scrollTop+=c.y*a),c.prevTime=n),c.isScrolling&&(r.cancel(c.i),c.i=r.request(c.scroll))},check:function(e,t){var n=e.options;return n[t].autoScroll&&n[t].autoScroll.enabled},onInteractionMove:function(e){var t=e.interaction,n=e.pointer;if(t.interacting()&&c.check(t.target,t.prepared.name)){if(t.simulation)return void(c.x=c.y=0);var r=void 0,a=void 0,l=void 0,p=void 0,u=t.target.options[t.prepared.name].autoScroll,d=u.container||i(t.element);if(o.window(d))p=n.clientXd.innerWidth-c.margin,l=n.clientY>d.innerHeight-c.margin;else{var f=s.getElementClientRect(d);p=n.clientXf.right-c.margin,l=n.clientY>f.bottom-c.margin}c.x=a?1:p?-1:0,c.y=l?1:r?-1:0,c.isScrolling||(c.margin=u.margin,c.speed=u.speed,c.start(t))}}};a.signals.on("stop-active",function(){c.stop()}),a.signals.on("action-move",c.onInteractionMove),l.perAction.autoScroll=c.defaults,t.exports=c},{"./Interaction":5,"./defaultOptions":18,"./utils/domUtils":39,"./utils/is":46,"./utils/raf":50,"./utils/window":52}],12:[function(e,t,n){"use strict";var r=e("../Interactable"),i=e("../actions/base"),o=e("../utils/is"),s=e("../utils/domUtils");r.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},r.prototype.ignoreFrom=function(e){return this._backCompatOption("ignoreFrom",e)},r.prototype.allowFrom=function(e){return this._backCompatOption("allowFrom",e)},r.prototype.testIgnore=function(e,t,n){return!(!e||!o.element(n))&&(o.string(e)?s.matchesUpTo(n,e,t):!!o.element(e)&&s.nodeContains(e,n))},r.prototype.testAllow=function(e,t,n){return!e||!!o.element(n)&&(o.string(e)?s.matchesUpTo(n,e,t):!!o.element(e)&&s.nodeContains(e,n))},r.prototype.testIgnoreAllow=function(e,t,n){return!this.testIgnore(e.ignoreFrom,t,n)&&this.testAllow(e.allowFrom,t,n)},r.prototype.actionChecker=function(e){return o.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},r.prototype.styleCursor=function(e){return o.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},r.prototype.defaultActionChecker=function(e,t,n,r){for(var o=this.getRect(r),s=null,a=i.names,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var u=p;if((!n.pointerIsDown||!n.mouse||0!=(t.buttons&this.options[u].mouseButtons))&&(s=i[u].checker(e,t,this,r,n,o)))return s}}},{"../Interactable":4,"../actions/base":6,"../utils/domUtils":39,"../utils/is":46}],13:[function(e,t,n){"use strict";function r(e,t,n,r){return g.is.object(e)&&t.testIgnoreAllow(t.options[e.name],n,r)&&t.options[e.name].enabled&&a(t,n,e)?e:null}function i(e,t,n,i,o,s){for(var a=0,l=i.length;a=m.maxInteractions)return!1;if(u.target===e){if((a+=d===n.name|0)>=i)return!1;if(u.element===t&&(l++,d!==n.name||l>=o))return!1}}}return m.maxInteractions>0}}var l=e("../interact"),c=e("../Interactable"),p=e("../Interaction"),u=e("../actions/base"),d=e("../defaultOptions"),f=e("../utils/browser"),v=e("../scope"),g=e("../utils"),h=e("../utils/Signals").new();e("./InteractableMethods");var m={signals:h,withinInteractionLimit:a,maxInteractions:1/0,defaults:{perAction:{manualStart:!1,max:1/0,maxPerElement:1,allowFrom:null,ignoreFrom:null}},setActionDefaults:function(e){g.extend(e.defaults,m.defaults.perAction)}};p.signals.on("down",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;if(!t.interacting()){s(t,o(t,n,r,i))}}),p.signals.on("move",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;if(t.mouse&&!t.pointerIsDown&&!t.interacting()){s(t,o(t,n,r,i))}}),p.signals.on("move",function(e){var t=e.interaction,n=e.event;if(t.pointerIsDown&&!t.interacting()&&t.pointerWasMoved&&t.prepared.name){h.fire("before-start",e);var r=t.target;t.prepared.name&&r&&(r.options[t.prepared.name].manualStart||!a(r,t.element,t.prepared)?t.stop(n):t.start(t.prepared,r,t.element))}}),p.signals.on("stop",function(e){var t=e.interaction,n=t.target;n&&n.options.styleCursor&&(n._doc.documentElement.style.cursor="")}),c.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},c.prototype.actionChecker=function(e){return g.is.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},c.prototype.styleCursor=function(e){return g.is.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},c.prototype.defaultActionChecker=function(e,t,n,r){for(var i=this.getRect(r),o=t.buttons||{0:1,1:4,3:8,4:16}[t.button],s=null,a=u.names,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var d=p;if((!n.pointerIsDown||!n.mouse||0!=(o&this.options[d].mouseButtons))&&(s=u[d].checker(e,t,this,r,n,i)))return s}},l.maxInteractions=function(e){return g.is.number(e)?(m.maxInteractions=e,this):m.maxInteractions},c.settingsMethods.push("styleCursor"),c.settingsMethods.push("actionChecker"),c.settingsMethods.push("ignoreFrom"),c.settingsMethods.push("allowFrom"),d.base.actionChecker=null,d.base.styleCursor=!0,g.extend(d.perAction,m.defaults.perAction),t.exports=m},{"../Interactable":4,"../Interaction":5,"../actions/base":6,"../defaultOptions":18,"../interact":21,"../scope":34,"../utils":44,"../utils/Signals":35,"../utils/browser":37,"./InteractableMethods":12}],14:[function(e,t,n){"use strict";var r=e("./base"),i=e("../Interaction");i.signals.on("new",function(e){e.delayTimer=null}),r.signals.on("prepared",function(e){var t=e.interaction,n=t.prepared.name;if(n){var r=t.target.options[n].delay;r>0&&(t.delayTimer=setTimeout(function(){t.start(t.prepared,t.target,t.element)},r))}}),i.signals.on("move",function(e){var t=e.interaction,n=e.duplicate;t.pointerWasMoved&&!n&&clearTimeout(t.delayTimer)}),r.signals.on("before-start",function(e){var t=e.interaction,n=t.prepared.name;if(n){t.target.options[n].delay>0&&(t.prepared.name=null)}})},{"../Interaction":5,"./base":13}],15:[function(e,t,n){"use strict";function r(e,t){if(!t)return!1;var n=t.options.drag.startAxis;return"xy"===e||"xy"===n||n===e}var i=e("./base"),o=e("../scope"),s=e("../utils/browser"),a=e("../utils/is"),l=e("../utils/domUtils"),c=l.matchesSelector,p=l.parentNode;i.setActionDefaults(e("../actions/drag")),i.signals.on("before-start",function(e){var t=e.interaction,n=e.eventTarget,l=e.dx,u=e.dy;if("drag"===t.prepared.name){var d=Math.abs(l),f=Math.abs(u),v=t.target.options.drag,g=v.startAxis,h=d>f?"x":dl.minSpeed&&g>l.endSpeed,b={interaction:t,pageCoords:v,statuses:f,preEnd:!0,requireEndOnly:!0};y&&!x&&(c.resetStatuses(f),m=c.setAll(b),m.shouldMove&&m.locked&&(h=!0)),(x||h)&&(p.copyCoords(i.upCoords,t.curCoords),t.pointers[0]=i.startEvent=new a(t,n,t.prepared.name,"inertiastart",t.element),i.t0=d,i.active=!0,i.allowResume=l.allowResume,t.simulation=i,o.fire(i.startEvent),x?(i.vx0=t.pointerDelta.client.vx,i.vy0=t.pointerDelta.client.vy,i.v0=g,r(t,i),p.extend(v,t.curCoords.page),v.x+=i.xe,v.y+=i.ye,c.resetStatuses(f),m=c.setAll(b),i.modifiedXe+=m.dx,i.modifiedYe+=m.dy,i.i=u.request(t.boundInertiaFrame)):(i.smoothEnd=!0,i.xe=m.dx,i.ye=m.dy,i.sx=i.sy=0,i.i=u.request(t.boundSmoothEndFrame)))}}),l.signals.on("stop-active",function(e){var t=e.interaction,n=t.inertiaStatus;n.active&&(u.cancel(n.i),n.active=!1,t.simulation=null)})},{"./InteractEvent":3,"./Interaction":5,"./modifiers":24,"./utils":44,"./utils/raf":50}],21:[function(e,t,n){"use strict";function r(e,t){var n=a.interactables.get(e,t);return n||(n=new l(e,t),n.events.global=p),n}var i=e("./utils/browser"),o=e("./utils/events"),s=e("./utils"),a=e("./scope"),l=e("./Interactable"),c=e("./Interaction"),p={};r.isSet=function(e,t){return-1!==a.interactables.indexOfElement(e,t&&t.context)},r.on=function(e,t,n){if(s.is.string(e)&&-1!==e.search(" ")&&(e=e.trim().split(/ +/)),s.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.on(f,t,n)}return r}if(s.is.object(e)){for(var v in e)r.on(v,e[v],t);return r}return s.contains(l.eventTypes,e)?p[e]?p[e].push(t):p[e]=[t]:o.add(a.document,e,t,{options:n}),r},r.off=function(e,t,n){if(s.is.string(e)&&-1!==e.search(" ")&&(e=e.trim().split(/ +/)),s.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.off(f,t,n)}return r}if(s.is.object(e)){for(var v in e)r.off(v,e[v],t);return r}if(s.contains(l.eventTypes,e)){var g=void 0;e in p&&-1!==(g=s.indexOf(p[e],t))&&p[e].splice(g,1)}else o.remove(a.document,e,t,n);return r},r.debug=function(){return a},r.getPointerAverage=s.pointerAverage,r.getTouchBBox=s.touchBBox,r.getTouchDistance=s.touchDistance,r.getTouchAngle=s.touchAngle,r.getElementRect=s.getElementRect,r.getElementClientRect=s.getElementClientRect,r.matchesSelector=s.matchesSelector,r.closest=s.closest,r.supportsTouch=function(){return i.supportsTouch},r.supportsPointerEvent=function(){return i.supportsPointerEvent},r.stop=function(e){for(var t=a.interactions.length-1;t>=0;t--)a.interactions[t].stop(e);return r},r.pointerMoveTolerance=function(e){return s.is.number(e)?(c.pointerMoveTolerance=e,this):c.pointerMoveTolerance},r.addDocument=a.addDocument,r.removeDocument=a.removeDocument,a.interact=r,t.exports=r},{"./Interactable":4,"./Interaction":5,"./scope":34,"./utils":44,"./utils/browser":37,"./utils/events":40}],22:[function(e,t,n){"use strict";function r(e){var t=e.interaction,n=e.event;t.target&&t.target.checkAndPreventDefault(n)}var i=e("./Interactable"),o=e("./Interaction"),s=e("./scope"),a=e("./utils/is"),l=e("./utils/events"),c=e("./utils/domUtils"),p=c.nodeContains,u=c.matchesSelector;i.prototype.preventDefault=function(e){return/^(always|never|auto)$/.test(e)?(this.options.preventDefault=e,this):a.bool(e)?(this.options.preventDefault=e?"always":"never",this):this.options.preventDefault},i.prototype.checkAndPreventDefault=function(e){var t=this.options.preventDefault;if("never"!==t)return"always"===t?void e.preventDefault():void(l.supportsOptions||/^(mouse|pointer|touch)*(down|start)/i.test(e.type)||a.element(e.target)&&u(e.target,"input,select,textarea,[contenteditable=true],[contenteditable=true] *")||e.preventDefault())};for(var d=["down","move","up","cancel"],f=0;f=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i;if(o.element&&(o.element===e.target||p(o.element,e.target)))return void o.target.checkAndPreventDefault(e)}}},{"./Interactable":4,"./Interaction":5,"./scope":34,"./utils/domUtils":39,"./utils/events":40,"./utils/is":46}],23:[function(e,t,n){"use strict";function r(e){var t=e.target,n=a.search(e,e.type,t);n&&n.prevTap&&e.clientX===n.prevTap.clientX&&e.clientY===n.prevTap.clientY&&t===n.prevTap.target&&(n.downTargets[0]=t,n.downTimes[0]=(new Date).getTime(),l.fire({interaction:n,event:e,eventTarget:t,pointer:e,type:"tap"}))}var i=e("./scope"),o=e("./utils/events"),s=e("./utils/browser"),a=e("./utils/interactionFinder"),l=e("./pointerEvents/base"),c=e("./utils/window"),p=c.window,u=Object.prototype.toString;if(p.Array.isArray||(p.Array.isArray=function(e){return"[object Array]"===u.call(e)}),String.prototype.trim||(String.prototype.trim=function(){return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")}),s.isIE8){var d=function(e){for(var t=i.interactions,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var o;if(n){if(r>=t.length)break;o=t[r++]}else{if(r=t.next(),r.done)break;o=r.value}var s=o;s.interacting()&&s.target.checkAndPreventDefault(e)}},f=function(e,t){var n=e.doc,i=(e.win,0===t.indexOf("listen")?o.add:o.remove);i(n,"selectstart",d),l&&i(n,"dblclick",r)};i.signals.on("add-document",f),i.signals.on("remove-document",f)}t.exports=null},{"./pointerEvents/base":31,"./scope":34,"./utils/browser":37,"./utils/events":40,"./utils/interactionFinder":45,"./utils/window":52}],24:[function(e,t,n){"use strict";function r(e,t,n){return e&&e.enabled&&(t||!e.endOnly)&&(!n||e.endOnly)}var i=e("../InteractEvent"),o=e("../Interaction"),s=e("../utils/extend"),a={names:[],setOffsets:function(e){var t=e.interaction,n=e.pageCoords,r=t.target,i=t.element,o=t.startOffset,s=r.getRect(i);s?(o.left=n.x-s.left,o.top=n.y-s.top,o.right=s.right-n.x,o.bottom=s.bottom-n.y,"width"in s||(s.width=s.right-s.left),"height"in s||(s.height=s.bottom-s.top)):o.left=o.top=o.right=o.bottom=0,e.rect=s,e.interactable=r,e.element=i;for(var l=0;l=p.length)break;f=p[d++]}else{if(d=p.next(),d.done)break;f=d.value}var v=f,g=a[v],h=t.target.options[t.prepared.name][v];r(h,i,o)&&(e.status=e.status=n[v],e.options=h,e.offset=e.interaction.modifierOffsets[v],g.set(e),e.status.locked&&(l.x+=e.status.dx,l.y+=e.status.dy,c.dx+=e.status.dx,c.dy+=e.status.dy,c.locked=!0))}return c.shouldMove=!e.status||!c.locked||e.status.changed,c},resetStatuses:function(e){for(var t=a.names,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var i;if(n){if(r>=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i,s=e[o]||{};s.dx=s.dy=0,s.modifiedX=s.modifiedY=NaN,s.locked=!1,s.changed=!0,e[o]=s}return e},start:function(e,t){var n=e.interaction,r={interaction:n,pageCoords:("action-resume"===t?n.curCoords:n.startCoords).page,startOffset:n.startOffset,statuses:n.modifierStatuses,preEnd:!1,requireEndOnly:!1};a.setOffsets(r),a.resetStatuses(r.statuses),r.pageCoords=s({},n.startCoords.page),n.modifierResult=a.setAll(r)}};o.signals.on("new",function(e){e.startOffset={left:0,right:0,top:0,bottom:0},e.modifierOffsets={},e.modifierStatuses=a.resetStatuses({}),e.modifierResult=null}),o.signals.on("action-start",a.start),o.signals.on("action-resume",a.start),o.signals.on("before-action-move",function(e){var t=e.interaction,n=e.preEnd,r=e.interactingBeforeMove,i=a.setAll({interaction:t,preEnd:n,pageCoords:t.curCoords.page,statuses:t.modifierStatuses,requireEndOnly:!1});!i.shouldMove&&r&&(t._dontFireMove=!0),t.modifierResult=i}),o.signals.on("action-end",function(e){for(var t=e.interaction,n=e.event,i=0;i=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}var m=h,y=m.x,x=m.y;l.push({x:s.left-i.width*y+u.x,y:s.top-i.height*x+u.y})}else l.push(u);return l},set:function(e){var t=e.interaction,n=e.pageCoords,r=e.status,i=e.options,s=e.offset,a=[],l=void 0,c=void 0,p=void 0;if(r.useStatusXY)c={x:r.x,y:r.y};else{var u=o.getOriginXY(t.target,t.element,t.prepared.name);c=o.extend({},n),c.x-=u.x,c.y-=u.y}r.realX=c.x,r.realY=c.y;for(var d=i.targets?i.targets.length:0,f=s,v=Array.isArray(f),g=0,f=v?f:f[Symbol.iterator]();;){var h;if(v){if(g>=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}for(var m=h,y=m.x,x=m.y,b=c.x-y,w=c.y-x,E=i.targets,S=Array.isArray(E),T=0,E=S?E:E[Symbol.iterator]();;){var C;if(S){if(T>=E.length)break;C=E[T++]}else{if(T=E.next(),T.done)break;C=T.value}var A=C;l=o.is.function(A)?A(b,w,t):A,l&&a.push({x:o.is.number(l.x)?l.x+y:b,y:o.is.number(l.y)?l.y+x:w,range:o.is.number(l.range)?l.range:i.range})}}var D={target:null,inRange:!1,distance:0,range:0,dx:0,dy:0};for(p=0,d=a.length;p=p.length)break;f=p[d++]}else{if(d=p.next(),d.done)break;f=d.value}var v=f,g=void 0;g=a.is.function(v)?v(l,c,t):v,g&&("width"in g&&"height"in g&&(g.x=g.width, +g.y=g.height),e.options.targets.push(g))}i.set(e)},modifyCoords:function(e){var t=e.options;e.options=a.extend({},t),e.options.enabled=t.enabled,e.options.relativePoints=[null],i.modifyCoords(e)}};r.snapSize=l,r.names.push("snapSize"),o.perAction.snapSize=l.defaults,s.defaults.snapSize=l.defaults,t.exports=l},{"../actions/resize":10,"../defaultOptions":18,"../utils/":44,"./index":24,"./snap":28}],30:[function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=e("../utils/pointerUtils");t.exports=function(){function e(t,n,o,s,a){if(r(this,e),i.pointerExtend(this,o),o!==n&&i.pointerExtend(this,n),this.interaction=a,this.timeStamp=(new Date).getTime(),this.originalEvent=o,this.type=t,this.pointerId=i.getPointerId(n),this.pointerType=i.getPointerType(n),this.target=s,this.currentTarget=null,"tap"===t){var l=a.getPointerIndex(n);this.dt=this.timeStamp-a.downTimes[l];var c=this.timeStamp-a.tapTime;this.double=!!(a.prevTap&&"doubletap"!==a.prevTap.type&&a.prevTap.target===this.target&&c<500)}else"doubletap"===t&&(this.dt=n.timeStamp-a.tapTime)}return e.prototype.subtractOrigin=function(e){var t=e.x,n=e.y;return this.pageX-=t,this.pageY-=n,this.clientX-=t,this.clientY-=n,this},e.prototype.addOrigin=function(e){var t=e.x,n=e.y;return this.pageX+=t,this.pageY+=n,this.clientX+=t,this.clientY+=n,this},e.prototype.preventDefault=function(){this.originalEvent.preventDefault()},e.prototype.stopPropagation=function(){this.propagationStopped=!0},e.prototype.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},e}()},{"../utils/pointerUtils":49}],31:[function(e,t,n){"use strict";function r(e){for(var t=e.interaction,n=e.pointer,s=e.event,l=e.eventTarget,c=e.type,u=void 0===c?e.pointerEvent.type:c,d=e.targets,f=void 0===d?i(e):d,v=e.pointerEvent,g=void 0===v?new o(u,n,s,l,t):v,h={interaction:t,pointer:n,event:s,eventTarget:l,targets:f,type:u,pointerEvent:g},m=0;m=u.length)break;g=u[v++]}else{if(v=u.next(),v.done)break;g=v.value}var h=g;c.element=h,p.fire("collect-targets",c)}return"hold"===o&&(c.targets=d(c.targets,function(e){return e.eventable.options.holdDuration===t.holdTimers[s].duration})),c.targets}var o=e("./PointerEvent"),s=e("../Interaction"),a=e("../utils"),l=e("../utils/browser"),c=e("../defaultOptions"),p=e("../utils/Signals").new(),u=e("../utils/arr"),d=u.filter,f=["down","up","cancel"],v=["down","up","cancel"],g={PointerEvent:o,fire:r,collectEventTargets:i,signals:p,defaults:{holdDuration:600,ignoreFrom:null,allowFrom:null,origin:{x:0,y:0}},types:["down","move","up","cancel","tap","doubletap","hold"]};s.signals.on("update-pointer-down",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers[n]={duration:1/0,timeout:null}}),s.signals.on("remove-pointer",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers.splice(n,1)}),s.signals.on("move",function(e){var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,s=e.duplicateMove,a=t.getPointerIndex(n);s||t.pointerIsDown&&!t.pointerWasMoved||(t.pointerIsDown&&clearTimeout(t.holdTimers[a].timeout),r({interaction:t,pointer:n,event:i,eventTarget:o,type:"move"}))}),s.signals.on("down",function(e){for(var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,s=e.pointerIndex,c=l.isIE8?a.extend({},i):i,u=t.holdTimers[s],d=a.getPath(o),f={interaction:t,pointer:n,event:i,eventTarget:o,type:"hold",targets:[],path:d,element:null},v=d,g=Array.isArray(v),h=0,v=g?v:v[Symbol.iterator]();;){var m;if(g){if(h>=v.length)break;m=v[h++]}else{if(h=v.next(),h.done)break;m=h.value}var y=m;f.element=y,p.fire("collect-targets",f)}if(f.targets.length){for(var x=1/0,b=0;b=0&&(p.selectors[u]!==e||p.contexts[u]!==t);u--);-1===u&&(u=p.selectors.length,p.selectors.push(e),p.contexts.push(t),p.listeners.push([])),p.listeners[u].push([i,!!s.capture,s.passive])}function s(e,t,n,r,o){var s=f(o),c=O[n],p=!1,u=void 0;if(c)for(u=c.selectors.length-1;u>=0;u--)if(c.selectors[u]===e&&c.contexts[u]===t){for(var d=c.listeners[u],v=d.length-1;v>=0;v--){var g=d[v],h=g[0],m=g[1],y=g[2];if(h===r&&m===!!s.capture&&y===s.passive){d.splice(v,1),d.length||(c.selectors.splice(u,1),c.contexts.splice(u,1),c.listeners.splice(u,1),i(t,n,a),i(t,n,l,!0),c.selectors.length||(O[n]=null)),p=!0;break}}if(p)break}}function a(e,t){var n=f(t),r={},i=O[e.type],o=g.getActualElement(e.path?e.path[0]:e.target),s=o;for(h(r,e),r.originalEvent=e,r.preventDefault=p;v.element(s);){for(var a=0;a=l.length)break;u=l[p++]}else{if(p=l.next(),p.done)break;u=p.value}var d=u,f=o[d](a);if(f)return f}},simulationResume:function(e){var t=e.pointerType,n=e.eventType,o=e.eventTarget;if(!/down|start/i.test(n))return null;for(var s=r.interactions,a=Array.isArray(s),l=0,s=a?s:s[Symbol.iterator]();;){var c;if(a){if(l>=s.length)break;c=s[l++]}else{if(l=s.next(),l.done)break;c=l.value}var p=c,u=o;if(p.simulation&&p.simulation.allowResume&&p.pointerType===t)for(;u;){if(u===p.element)return p;u=i.parentNode(u)}}return null},mouseOrPen:function(e){var t=e.pointerId,n=e.pointerType,o=e.eventType;if("mouse"!==n&&"pen"!==n)return null;for(var s=void 0,a=r.interactions,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var u=p;if(u.pointerType===n){if(u.simulation&&!i.contains(u.pointerIds,t))continue;if(u.interacting())return u;s||(s=u)}}if(s)return s;for(var d=r.interactions,f=Array.isArray(d),v=0,d=f?d:d[Symbol.iterator]();;){var g;if(f){if(v>=d.length)break;g=d[v++]}else{if(v=d.next(),v.done)break;g=v.value}var h=g;if(!(h.pointerType!==n||/down/i.test(o)&&h.simulation))return h}return null},hasPointer:function(e){for(var t=e.pointerId,n=r.interactions,o=Array.isArray(n),s=0,n=o?n:n[Symbol.iterator]();;){var a;if(o){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var l=a;if(i.contains(l.pointerIds,t))return l}},idle:function(e){for(var t=e.pointerType,n=r.interactions,i=Array.isArray(n),o=0,n=i?n:n[Symbol.iterator]();;){var s;if(i){if(o>=n.length)break;s=n[o++]}else{if(o=n.next(),o.done)break;s=o.value}var a=s;if(1===a.pointerIds.length){var l=a.target;if(l&&!l.options.gesture.enabled)continue}else if(a.pointerIds.length>=2)continue;if(!a.interacting()&&t===a.pointerType)return a}return null}};t.exports=o},{"../scope":34,"./index":44}],46:[function(e,t,n){"use strict";var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},i=e("./window"),o=e("./isWindow"),s={array:function(){},window:function(e){return e===i.window||o(e)},docFrag:function(e){return s.object(e)&&11===e.nodeType},object:function(e){return!!e&&"object"===(void 0===e?"undefined":r(e))},function:function(e){return"function"==typeof e},number:function(e){return"number"==typeof e},bool:function(e){return"boolean"==typeof e},string:function(e){return"string"==typeof e},element:function(e){if(!e||"object"!==(void 0===e?"undefined":r(e)))return!1;var t=i.getWindow(e)||i.window;return/object|function/.test(r(t.Element))?e instanceof t.Element:1===e.nodeType&&"string"==typeof e.nodeName}};s.array=function(e){return s.object(e)&&void 0!==e.length&&s.function(e.splice)},t.exports=s},{"./isWindow":47,"./window":52}],47:[function(e,t,n){"use strict";t.exports=function(e){return!(!e||!e.Window)&&e instanceof e.Window}},{}],48:[function(e,t,n){"use strict";function r(e,n){for(var r in n){var i=t.exports.prefixedPropREs,o=!1;for(var s in i)if(0===r.indexOf(s)&&i[s].test(r)){o=!0;break}o||"function"==typeof n[r]||(e[r]=n[r])}return e}r.prefixedPropREs={webkit:/(Movement[XY]|Radius[XY]|RotationAngle|Force)$/},t.exports=r},{}],49:[function(e,t,n){"use strict";var r=e("./hypot"),i=e("./browser"),o=e("./domObjects"),s=e("./domUtils"),a=e("./domObjects"),l=e("./is"),c=e("./pointerExtend"),p={copyCoords:function(e,t){e.page=e.page||{},e.page.x=t.page.x,e.page.y=t.page.y,e.client=e.client||{},e.client.x=t.client.x,e.client.y=t.client.y,e.timeStamp=t.timeStamp},setCoordDeltas:function(e,t,n){e.page.x=n.page.x-t.page.x,e.page.y=n.page.y-t.page.y,e.client.x=n.client.x-t.client.x,e.client.y=n.client.y-t.client.y,e.timeStamp=n.timeStamp-t.timeStamp;var i=Math.max(e.timeStamp/1e3,.001);e.page.speed=r(e.page.x,e.page.y)/i,e.page.vx=e.page.x/i,e.page.vy=e.page.y/i,e.client.speed=r(e.client.x,e.page.y)/i,e.client.vx=e.client.x/i,e.client.vy=e.client.y/i},isNativePointer:function(e){return e instanceof o.Event||e instanceof o.Touch},getXY:function(e,t,n){return n=n||{},e=e||"page",n.x=t[e+"X"],n.y=t[e+"Y"],n},getPageXY:function(e,t){return t=t||{},i.isOperaMobile&&p.isNativePointer(e)?(p.getXY("screen",e,t),t.x+=window.scrollX,t.y+=window.scrollY):p.getXY("page",e,t),t},getClientXY:function(e,t){return t=t||{},i.isOperaMobile&&p.isNativePointer(e)?p.getXY("screen",e,t):p.getXY("client",e,t),t},getPointerId:function(e){return l.number(e.pointerId)?e.pointerId:e.identifier},setCoords:function(e,t,n){var r=t.length>1?p.pointerAverage(t):t[0],i={};p.getPageXY(r,i),e.page.x=i.x,e.page.y=i.y,p.getClientXY(r,i),e.client.x=i.x,e.client.y=i.y,e.timeStamp=l.number(n)?n:(new Date).getTime()},pointerExtend:c,getTouchPair:function(e){var t=[];return l.array(e)?(t[0]=e[0],t[1]=e[1]):"touchend"===e.type?1===e.touches.length?(t[0]=e.touches[0],t[1]=e.changedTouches[0]):0===e.touches.length&&(t[0]=e.changedTouches[0],t[1]=e.changedTouches[1]):(t[0]=e.touches[0],t[1]=e.touches[1]),t},pointerAverage:function(e){for(var t={pageX:0,pageY:0,clientX:0,clientY:0,screenX:0,screenY:0},n=e,r=Array.isArray(n),i=0,n=r?n:n[Symbol.iterator]();;){var o;if(r){if(i>=n.length)break;o=n[i++]}else{if(i=n.next(),i.done)break;o=i.value}var s=o;for(var a in t)t[a]+=s[a]}for(var l in t)t[l]/=e.length;return t},touchBBox:function(e){if(e.length||e.touches&&e.touches.length>1){var t=p.getTouchPair(e),n=Math.min(t[0].pageX,t[1].pageX),r=Math.min(t[0].pageY,t[1].pageY);return{x:n,y:r,left:n,top:r,width:Math.max(t[0].pageX,t[1].pageX)-n,height:Math.max(t[0].pageY,t[1].pageY)-r}}},touchDistance:function(e,t){var n=t+"X",i=t+"Y",o=p.getTouchPair(e),s=o[0][n]-o[1][n],a=o[0][i]-o[1][i];return r(s,a)},touchAngle:function(e,t,n){var r=n+"X",i=n+"Y",o=p.getTouchPair(e),s=o[1][r]-o[0][r],a=o[1][i]-o[0][i];return 180*Math.atan2(a,s)/Math.PI},getPointerType:function(e){return l.string(e.pointerType)?e.pointerType:l.number(e.pointerType)?[void 0,void 0,"touch","pen","mouse"][e.pointerType]:/touch/.test(e.type)||e instanceof a.Touch?"touch":"mouse"},getEventTargets:function(e){return[s.getActualElement(e.path?e.path[0]:e.target),s.getActualElement(e.currentTarget)]}};t.exports=p},{"./browser":37,"./domObjects":38,"./domUtils":39,"./hypot":43,"./is":46,"./pointerExtend":48}],50:[function(e,t,n){"use strict";for(var r=e("./window"),i=r.window,o=["ms","moz","webkit","o"],s=0,a=void 0,l=void 0,c=0;c\n * Open source under the MIT License.\n * https://raw.github.com/taye/interact.js/master/LICENSE\n */\n","/*\n * In a (windowless) server environment this file exports a factory function\n * that takes the window to use.\n *\n * var interact = require('interact.js')(windowObject);\n *\n * See https://github.com/taye/interact.js/issues/187\n */\nif (typeof window === 'undefined') {\n module.exports = function (window) {\n require('./src/utils/window').init(window);\n\n return require('./src/index');\n };\n}\nelse {\n module.exports = require('./src/index');\n}\n","const { indexOf } = require('./utils/arr');\nconst extend = require('./utils/extend.js');\n\nfunction fireUntilImmediateStopped (event, listeners) {\n for (let i = 0, len = listeners.length; i < len && !event.immediatePropagationStopped; i++) {\n listeners[i](event);\n }\n}\n\nclass Eventable {\n\n constructor (options) {\n this.options = extend({}, options || {});\n }\n\n fire (event) {\n let listeners;\n const onEvent = 'on' + event.type;\n const global = this.global;\n\n // Interactable#on() listeners\n if ((listeners = this[event.type])) {\n fireUntilImmediateStopped(event, listeners);\n }\n\n // interactable.onevent listener\n if (this[onEvent]) {\n this[onEvent](event);\n }\n\n // interact.on() listeners\n if (!event.propagationStopped && global && (listeners = global[event.type])) {\n fireUntilImmediateStopped(event, listeners);\n }\n }\n\n on (eventType, listener) {\n // if this type of event was never bound\n if (this[eventType]) {\n this[eventType].push(listener);\n }\n else {\n this[eventType] = [listener];\n }\n }\n\n off (eventType, listener) {\n // if it is an action event type\n const eventList = this[eventType];\n const index = eventList? indexOf(eventList, listener) : -1;\n\n if (index !== -1) {\n eventList.splice(index, 1);\n }\n\n if (eventList && eventList.length === 0 || !listener) {\n this[eventType] = listener;\n }\n }\n}\n\nmodule.exports = Eventable;\n","const extend = require('./utils/extend');\nconst getOriginXY = require('./utils/getOriginXY');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nclass InteractEvent {\n constructor (interaction, event, action, phase, element, related, preEnd = false) {\n const target = interaction.target;\n const deltaSource = (target && target.options || defaults).deltaSource;\n const origin = getOriginXY(target, element, action);\n const starting = phase === 'start';\n const ending = phase === 'end';\n const coords = starting? interaction.startCoords : interaction.curCoords;\n const prevEvent = interaction.prevEvent;\n\n element = element || interaction.element;\n\n const page = extend({}, coords.page);\n const client = extend({}, coords.client);\n\n page.x -= origin.x;\n page.y -= origin.y;\n\n client.x -= origin.x;\n client.y -= origin.y;\n\n this.ctrlKey = event.ctrlKey;\n this.altKey = event.altKey;\n this.shiftKey = event.shiftKey;\n this.metaKey = event.metaKey;\n this.button = event.button;\n this.buttons = event.buttons;\n this.target = element;\n this.currentTarget = element;\n this.relatedTarget = related || null;\n this.preEnd = preEnd;\n this.type = action + (phase || '');\n this.interaction = interaction;\n this.interactable = target;\n\n this.t0 = starting ? interaction.downTimes[interaction.downTimes.length - 1]\n : prevEvent.t0;\n\n const signalArg = {\n interaction,\n event,\n action,\n phase,\n element,\n related,\n page,\n client,\n coords,\n starting,\n ending,\n deltaSource,\n iEvent: this,\n };\n\n signals.fire('set-xy', signalArg);\n\n if (ending) {\n // use previous coords when ending\n this.pageX = prevEvent.pageX;\n this.pageY = prevEvent.pageY;\n this.clientX = prevEvent.clientX;\n this.clientY = prevEvent.clientY;\n }\n else {\n this.pageX = page.x;\n this.pageY = page.y;\n this.clientX = client.x;\n this.clientY = client.y;\n }\n\n this.x0 = interaction.startCoords.page.x - origin.x;\n this.y0 = interaction.startCoords.page.y - origin.y;\n this.clientX0 = interaction.startCoords.client.x - origin.x;\n this.clientY0 = interaction.startCoords.client.y - origin.y;\n\n signals.fire('set-delta', signalArg);\n\n this.timeStamp = coords.timeStamp;\n this.dt = interaction.pointerDelta.timeStamp;\n this.duration = this.timeStamp - this.t0;\n\n // speed and velocity in pixels per second\n this.speed = interaction.pointerDelta[deltaSource].speed;\n this.velocityX = interaction.pointerDelta[deltaSource].vx;\n this.velocityY = interaction.pointerDelta[deltaSource].vy;\n\n this.swipe = (ending || phase === 'inertiastart')? this.getSwipe() : null;\n\n signals.fire('new', signalArg);\n }\n\n getSwipe () {\n const interaction = this.interaction;\n\n if (interaction.prevEvent.speed < 600\n || this.timeStamp - interaction.prevEvent.timeStamp > 150) {\n return null;\n }\n\n let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI;\n const overlap = 22.5;\n\n if (angle < 0) {\n angle += 360;\n }\n\n const left = 135 - overlap <= angle && angle < 225 + overlap;\n const up = 225 - overlap <= angle && angle < 315 + overlap;\n\n const right = !left && (315 - overlap <= angle || angle < 45 + overlap);\n const down = !up && 45 - overlap <= angle && angle < 135 + overlap;\n\n return {\n up,\n down,\n left,\n right,\n angle,\n speed: interaction.prevEvent.speed,\n velocity: {\n x: interaction.prevEvent.velocityX,\n y: interaction.prevEvent.velocityY,\n },\n };\n }\n\n preventDefault () {}\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n}\n\nsignals.on('set-delta', function ({ iEvent, interaction, starting, deltaSource }) {\n const prevEvent = starting? iEvent : interaction.prevEvent;\n\n if (deltaSource === 'client') {\n iEvent.dx = iEvent.clientX - prevEvent.clientX;\n iEvent.dy = iEvent.clientY - prevEvent.clientY;\n }\n else {\n iEvent.dx = iEvent.pageX - prevEvent.pageX;\n iEvent.dy = iEvent.pageY - prevEvent.pageY;\n }\n});\n\nInteractEvent.signals = signals;\n\nmodule.exports = InteractEvent;\n","const is = require('./utils/is');\nconst events = require('./utils/events');\nconst extend = require('./utils/extend');\nconst actions = require('./actions/base');\nconst scope = require('./scope');\nconst Eventable = require('./Eventable');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nconst {\n getElementRect,\n nodeContains,\n trySelector,\n} = require('./utils/domUtils');\nconst { getWindow } = require('./utils/window');\nconst { indexOf, contains } = require('./utils/arr');\nconst { wheelEvent } = require('./utils/browser');\n\n// all set interactables\nscope.interactables = [];\n\n/*\\\n * Interactable\n [ property ]\n **\n * Object type returned by @interact\n\\*/\nclass Interactable {\n constructor (target, options) {\n options = options || {};\n\n this.target = target;\n this.events = new Eventable();\n this._context = options.context || scope.document;\n this._win = getWindow(trySelector(target)? this._context : target);\n this._doc = this._win.document;\n\n signals.fire('new', {\n target,\n options,\n interactable: this,\n win: this._win,\n });\n\n scope.addDocument( this._doc, this._win );\n\n scope.interactables.push(this);\n\n this.set(options);\n }\n\n setOnEvents (action, phases) {\n const onAction = 'on' + action;\n\n if (is.function(phases.onstart) ) { this.events[onAction + 'start' ] = phases.onstart ; }\n if (is.function(phases.onmove) ) { this.events[onAction + 'move' ] = phases.onmove ; }\n if (is.function(phases.onend) ) { this.events[onAction + 'end' ] = phases.onend ; }\n if (is.function(phases.oninertiastart)) { this.events[onAction + 'inertiastart' ] = phases.oninertiastart ; }\n\n return this;\n }\n\n setPerAction (action, options) {\n // for all the default per-action options\n for (const option in options) {\n // if this option exists for this action\n if (option in defaults[action]) {\n // if the option in the options arg is an object value\n if (is.object(options[option])) {\n // duplicate the object\n this.options[action][option] = extend(this.options[action][option] || {}, options[option]);\n\n if (is.object(defaults.perAction[option]) && 'enabled' in defaults.perAction[option]) {\n this.options[action][option].enabled = options[option].enabled === false? false : true;\n }\n }\n else if (is.bool(options[option]) && is.object(defaults.perAction[option])) {\n this.options[action][option].enabled = options[option];\n }\n else if (options[option] !== undefined) {\n // or if it's not undefined, do a plain assignment\n this.options[action][option] = options[option];\n }\n }\n }\n }\n\n /*\\\n * Interactable.getRect\n [ method ]\n *\n * The default function to get an Interactables bounding rect. Can be\n * overridden using @Interactable.rectChecker.\n *\n - element (Element) #optional The element to measure.\n = (object) The object's bounding rectangle.\n o {\n o top : 0,\n o left : 0,\n o bottom: 0,\n o right : 0,\n o width : 0,\n o height: 0\n o }\n \\*/\n getRect (element) {\n element = element || this.target;\n\n if (is.string(this.target) && !(is.element(element))) {\n element = this._context.querySelector(this.target);\n }\n\n return getElementRect(element);\n }\n\n /*\\\n * Interactable.rectChecker\n [ method ]\n *\n * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n - checker (function) #optional A function which returns this Interactable's bounding rectangle. See @Interactable.getRect\n = (function | object) The checker function or this Interactable\n \\*/\n rectChecker (checker) {\n if (is.function(checker)) {\n this.getRect = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.getRect;\n\n return this;\n }\n\n return this.getRect;\n }\n\n _backCompatOption (optionName, newValue) {\n if (trySelector(newValue) || is.object(newValue)) {\n this.options[optionName] = newValue;\n\n for (const action of actions.names) {\n this.options[action][optionName] = newValue;\n }\n\n return this;\n }\n\n return this.options[optionName];\n }\n\n /*\\\n * Interactable.origin\n [ method ]\n *\n * Gets or sets the origin of the Interactable's element. The x and y\n * of the origin will be subtracted from action event coordinates.\n *\n - origin (object | string) #optional An object eg. { x: 0, y: 0 } or string 'parent', 'self' or any CSS selector\n * OR\n - origin (Element) #optional An HTML or SVG Element whose rect will be used\n **\n = (object) The current origin or this Interactable\n \\*/\n origin (newValue) {\n return this._backCompatOption('origin', newValue);\n }\n\n /*\\\n * Interactable.deltaSource\n [ method ]\n *\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n - newValue (string) #optional Use 'client' if you will be scrolling while interacting; Use 'page' if you want autoScroll to work\n = (string | object) The current deltaSource or this Interactable\n \\*/\n deltaSource (newValue) {\n if (newValue === 'page' || newValue === 'client') {\n this.options.deltaSource = newValue;\n\n return this;\n }\n\n return this.options.deltaSource;\n }\n\n /*\\\n * Interactable.context\n [ method ]\n *\n * Gets the selector context Node of the Interactable. The default is `window.document`.\n *\n = (Node) The context Node of this Interactable\n **\n \\*/\n context () {\n return this._context;\n }\n\n inContext (element) {\n return (this._context === element.ownerDocument\n || nodeContains(this._context, element));\n }\n\n /*\\\n * Interactable.fire\n [ method ]\n *\n * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n - iEvent (InteractEvent) The InteractEvent object to be fired on this Interactable\n = (Interactable) this Interactable\n \\*/\n fire (iEvent) {\n this.events.fire(iEvent);\n\n return this;\n }\n\n _onOffMultiple (method, eventType, listener, options) {\n if (is.string(eventType) && eventType.search(' ') !== -1) {\n eventType = eventType.trim().split(/ +/);\n }\n\n if (is.array(eventType)) {\n for (let i = 0; i < eventType.length; i++) {\n this[method](eventType[i], listener, options);\n }\n\n return true;\n }\n\n if (is.object(eventType)) {\n for (const prop in eventType) {\n this[method](prop, eventType[prop], listener);\n }\n\n return true;\n }\n }\n\n /*\\\n * Interactable.on\n [ method ]\n *\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n - eventType (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) This Interactable\n \\*/\n on (eventType, listener, options) {\n if (this._onOffMultiple('on', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.on(eventType, listener);\n }\n // delegated event for selector\n else if (is.string(this.target)) {\n events.addDelegate(this.target, this._context, eventType, listener, options);\n }\n else {\n events.add(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.off\n [ method ]\n *\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n - eventType (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) This Interactable\n \\*/\n off (eventType, listener, options) {\n if (this._onOffMultiple('off', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n // if it is an action event type\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.off(eventType, listener);\n }\n // delegated event\n else if (is.string(this.target)) {\n events.removeDelegate(this.target, this._context, eventType, listener, options);\n }\n // remove listener from this Interatable's element\n else {\n events.remove(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.set\n [ method ]\n *\n * Reset the options of this Interactable\n - options (object) The new settings to apply\n = (object) This Interactable\n \\*/\n set (options) {\n if (!is.object(options)) {\n options = {};\n }\n\n this.options = extend({}, defaults.base);\n\n const perActions = extend({}, defaults.perAction);\n\n for (const actionName in actions.methodDict) {\n const methodName = actions.methodDict[actionName];\n\n this.options[actionName] = extend({}, defaults[actionName]);\n\n this.setPerAction(actionName, perActions);\n\n this[methodName](options[actionName]);\n }\n\n for (const setting of Interactable.settingsMethods) {\n this.options[setting] = defaults.base[setting];\n\n if (setting in options) {\n this[setting](options[setting]);\n }\n }\n\n signals.fire('set', {\n options,\n interactable: this,\n });\n\n return this;\n }\n\n /*\\\n * Interactable.unset\n [ method ]\n *\n * Remove this interactable from the list of interactables and remove\n * it's action capabilities and event listeners\n *\n = (object) @interact\n \\*/\n unset () {\n events.remove(this.target, 'all');\n\n if (is.string(this.target)) {\n // remove delegated events\n for (const type in events.delegatedEvents) {\n const delegated = events.delegatedEvents[type];\n\n if (delegated.selectors[0] === this.target\n && delegated.contexts[0] === this._context) {\n\n delegated.selectors.splice(0, 1);\n delegated.contexts .splice(0, 1);\n delegated.listeners.splice(0, 1);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegated[type] = null;\n }\n }\n\n events.remove(this._context, type, events.delegateListener);\n events.remove(this._context, type, events.delegateUseCapture, true);\n }\n }\n else {\n events.remove(this, 'all');\n }\n\n signals.fire('unset', { interactable: this });\n\n scope.interactables.splice(indexOf(scope.interactables, this), 1);\n\n // Stop related interactions when an Interactable is unset\n for (const interaction of scope.interactions || []) {\n if (interaction.target === this && interaction.interacting()) {\n interaction.stop();\n }\n }\n\n return scope.interact;\n }\n}\n\nscope.interactables.indexOfElement = function indexOfElement (target, context) {\n context = context || scope.document;\n\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n if (interactable.target === target && interactable._context === context) {\n return i;\n }\n }\n return -1;\n};\n\nscope.interactables.get = function interactableGet (element, options, dontCheckInContext) {\n const ret = this[this.indexOfElement(element, options && options.context)];\n\n return ret && (is.string(element) || dontCheckInContext || ret.inContext(element))? ret : null;\n};\n\nscope.interactables.forEachSelector = function (callback, element) {\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n // skip non CSS selector targets and out of context elements\n if (!is.string(interactable.target)\n || (element && !interactable.inContext(element))) {\n continue;\n }\n\n const ret = callback(interactable, interactable.target, interactable._context, i, this);\n\n if (ret !== undefined) {\n return ret;\n }\n }\n};\n\n// all interact.js eventTypes\nInteractable.eventTypes = scope.eventTypes = [];\n\nInteractable.signals = signals;\n\nInteractable.settingsMethods = [ 'deltaSource', 'origin', 'preventDefault', 'rectChecker' ];\n\nmodule.exports = Interactable;\n","const scope = require('./scope');\nconst utils = require('./utils');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst finder = require('./utils/interactionFinder');\nconst signals = require('./utils/Signals').new();\n\nconst listeners = {};\nconst methodNames = [\n 'pointerDown', 'pointerMove', 'pointerUp',\n 'updatePointer', 'removePointer',\n];\n\n// for ignoring browser's simulated mouse events\nlet prevTouchTime = 0;\n\n// all active and idle interactions\nscope.interactions = [];\n\nclass Interaction {\n constructor () {\n this.target = null; // current interactable being interacted with\n this.element = null; // the target element of the interactable\n\n this.prepared = { // action that's ready to be fired on next move event\n name : null,\n axis : null,\n edges: null,\n };\n\n // keep track of added pointers\n this.pointers = [];\n this.pointerIds = [];\n this.downTargets = [];\n this.downTimes = [];\n\n // Previous native pointer move event coordinates\n this.prevCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n // current native pointer move event coordinates\n this.curCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Starting InteractEvent pointer coordinates\n this.startCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Change in coordinates and time of the pointer\n this.pointerDelta = {\n page : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n client : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n timeStamp: 0,\n };\n\n this.downEvent = null; // pointerdown/mousedown/touchstart event\n this.downPointer = {};\n\n this._eventTarget = null;\n this._curEventTarget = null;\n\n this.prevEvent = null; // previous action event\n\n this.pointerIsDown = false;\n this.pointerWasMoved = false;\n this._interacting = false;\n\n this.mouse = false;\n\n signals.fire('new', this);\n\n scope.interactions.push(this);\n }\n\n pointerDown (pointer, event, eventTarget) {\n const pointerIndex = this.updatePointer(pointer, event, true);\n\n signals.fire('down', {\n pointer,\n event,\n eventTarget,\n pointerIndex,\n interaction: this,\n });\n }\n\n /*\\\n * Interaction.start\n [ method ]\n *\n * Start an action with the given Interactable and Element as tartgets. The\n * action must be enabled for the target Interactable and an appropriate number\n * of pointers must be held down - 1 for drag/resize, 2 for gesture.\n *\n * Use it with `interactable.able({ manualStart: false })` to always\n * [start actions manually](https://github.com/taye/interact.js/issues/114)\n *\n - action (object) The action to be performed - drag, resize, etc.\n - target (Interactable) The Interactable to target\n - element (Element) The DOM Element to target\n = (object) interact\n **\n | interact(target)\n | .draggable({\n | // disable the default drag start by down->move\n | manualStart: true\n | })\n | // start dragging after the user holds the pointer down\n | .on('hold', function (event) {\n | var interaction = event.interaction;\n |\n | if (!interaction.interacting()) {\n | interaction.start({ name: 'drag' },\n | event.interactable,\n | event.currentTarget);\n | }\n | });\n \\*/\n start (action, target, element) {\n if (this.interacting()\n || !this.pointerIsDown\n || this.pointerIds.length < (action.name === 'gesture'? 2 : 1)) {\n return;\n }\n\n // if this interaction had been removed after stopping\n // add it back\n if (utils.indexOf(scope.interactions, this) === -1) {\n scope.interactions.push(this);\n }\n\n utils.copyAction(this.prepared, action);\n this.target = target;\n this.element = element;\n\n signals.fire('action-start', {\n interaction: this,\n event: this.downEvent,\n });\n }\n\n pointerMove (pointer, event, eventTarget) {\n if (!this.simulation) {\n this.updatePointer(pointer);\n utils.setCoords(this.curCoords, this.pointers);\n }\n\n const duplicateMove = (this.curCoords.page.x === this.prevCoords.page.x\n && this.curCoords.page.y === this.prevCoords.page.y\n && this.curCoords.client.x === this.prevCoords.client.x\n && this.curCoords.client.y === this.prevCoords.client.y);\n\n let dx;\n let dy;\n\n // register movement greater than pointerMoveTolerance\n if (this.pointerIsDown && !this.pointerWasMoved) {\n dx = this.curCoords.client.x - this.startCoords.client.x;\n dy = this.curCoords.client.y - this.startCoords.client.y;\n\n this.pointerWasMoved = utils.hypot(dx, dy) > Interaction.pointerMoveTolerance;\n }\n\n const signalArg = {\n pointer,\n pointerIndex: this.getPointerIndex(pointer),\n event,\n eventTarget,\n dx,\n dy,\n duplicate: duplicateMove,\n interaction: this,\n interactingBeforeMove: this.interacting(),\n };\n\n if (!duplicateMove) {\n // set pointer coordinate, time changes and speeds\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n }\n\n signals.fire('move', signalArg);\n\n if (!duplicateMove) {\n // if interacting, fire an 'action-move' signal etc\n if (this.interacting()) {\n this.doMove(signalArg);\n }\n\n if (this.pointerWasMoved) {\n utils.copyCoords(this.prevCoords, this.curCoords);\n }\n }\n }\n\n /*\\\n * Interaction.doMove\n [ method ]\n *\n * Force a move of the current action at the same coordinates. Useful if\n * snap/restrict has been changed and you want a movement with the new\n * settings.\n *\n **\n | interact(target)\n | .draggable(true)\n | .on('dragmove', function (event) {\n | if (someCondition) {\n | // change the snap settings\n | event.interactable.draggable({ snap: { targets: [] }});\n | // fire another move event with re-calculated snap\n | event.interaction.doMove();\n | }\n | });\n \\*/\n doMove (signalArg) {\n signalArg = utils.extend({\n pointer: this.pointers[0],\n event: this.prevEvent,\n eventTarget: this._eventTarget,\n interaction: this,\n }, signalArg || {});\n\n signals.fire('before-action-move', signalArg);\n\n if (!this._dontFireMove) {\n signals.fire('action-move', signalArg);\n }\n\n this._dontFireMove = false;\n }\n\n // End interact move events and stop auto-scroll unless simulation is running\n pointerUp (pointer, event, eventTarget, curEventTarget) {\n const pointerIndex = this.getPointerIndex(pointer);\n\n signals.fire(/cancel$/i.test(event.type)? 'cancel' : 'up', {\n pointer,\n pointerIndex,\n event,\n eventTarget,\n curEventTarget,\n interaction: this,\n });\n\n if (!this.simulation) {\n this.end(event);\n }\n\n this.pointerIsDown = false;\n this.removePointer(pointer, event);\n }\n\n /*\\\n * Interaction.end\n [ method ]\n *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n - event (PointerEvent) #optional\n **\n | interact(target)\n | .draggable(true)\n | .on('move', function (event) {\n | if (event.pageX > 1000) {\n | // end the current action\n | event.interaction.end();\n | // stop all further listeners from being called\n | event.stopImmediatePropagation();\n | }\n | });\n \\*/\n end (event) {\n event = event || this.prevEvent;\n\n if (this.interacting()) {\n signals.fire('action-end', {\n event,\n interaction: this,\n });\n }\n\n this.stop();\n }\n\n currentAction () {\n return this._interacting? this.prepared.name: null;\n }\n\n interacting () {\n return this._interacting;\n }\n\n stop () {\n signals.fire('stop', { interaction: this });\n\n if (this._interacting) {\n signals.fire('stop-active', { interaction: this });\n signals.fire('stop-' + this.prepared.name, { interaction: this });\n }\n\n this.target = this.element = null;\n\n this._interacting = false;\n this.prepared.name = this.prevEvent = null;\n }\n\n getPointerIndex (pointer) {\n return utils.indexOf(this.pointerIds, utils.getPointerId(pointer));\n }\n\n updatePointer (pointer, event, down = event && /(down|start)$/i.test(event.type)) {\n const id = utils.getPointerId(pointer);\n let index = this.getPointerIndex(pointer);\n\n if (index === -1) {\n index = this.pointerIds.length;\n this.pointerIds[index] = id;\n }\n\n if (down) {\n signals.fire('update-pointer-down', {\n pointer,\n event,\n down,\n pointerId: id,\n pointerIndex: index,\n interaction: this,\n });\n }\n\n this.pointers[index] = pointer;\n\n return index;\n }\n\n removePointer (pointer, event) {\n const id = utils.getPointerId(pointer);\n const index = this.mouse? 0 : utils.indexOf(this.pointerIds, id);\n\n if (index === -1) { return; }\n\n signals.fire('remove-pointer', {\n pointer,\n event,\n pointerIndex: index,\n interaction: this,\n });\n\n this.pointers .splice(index, 1);\n this.pointerIds .splice(index, 1);\n this.downTargets.splice(index, 1);\n this.downTimes .splice(index, 1);\n }\n\n _updateEventTargets (target, currentTarget) {\n this._eventTarget = target;\n this._curEventTarget = currentTarget;\n }\n}\n\nfor (let i = 0, len = methodNames.length; i < len; i++) {\n const method = methodNames[i];\n\n listeners[method] = doOnInteractions(method);\n}\n\nfunction doOnInteractions (method) {\n return (function (event) {\n const [eventTarget, curEventTarget] = utils.getEventTargets(event);\n const matches = []; // [ [pointer, interaction], ...]\n\n if (browser.supportsTouch && /touch/.test(event.type)) {\n prevTouchTime = new Date().getTime();\n\n for (let i = 0; i < event.changedTouches.length; i++) {\n const pointer = event.changedTouches[i];\n const interaction = finder.search(pointer, event.type, eventTarget);\n\n matches.push([pointer, interaction || new Interaction()]);\n }\n }\n else {\n let invalidPointer = false;\n\n if (!browser.supportsPointerEvent && /mouse/.test(event.type)) {\n // ignore mouse events while touch interactions are active\n for (let i = 0; i < scope.interactions.length && !invalidPointer; i++) {\n invalidPointer = !scope.interactions[i].mouse && scope.interactions[i].pointerIsDown;\n }\n\n // try to ignore mouse events that are simulated by the browser\n // after a touch event\n invalidPointer = invalidPointer\n || (new Date().getTime() - prevTouchTime < 500)\n // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated\n || event.timeStamp === 0;\n }\n\n if (!invalidPointer) {\n let interaction = finder.search(event, event.type, eventTarget);\n\n if (!interaction) {\n\n interaction = new Interaction();\n interaction.mouse = (/mouse/i.test(event.pointerType || event.type)\n // MSPointerEvent.MSPOINTER_TYPE_MOUSE\n || event.pointerType === 4\n || !event.pointerType);\n }\n\n matches.push([event, interaction]);\n }\n }\n\n for (const [pointer, interaction] of matches) {\n interaction._updateEventTargets(eventTarget, curEventTarget);\n interaction[method](pointer, event, eventTarget, curEventTarget);\n }\n });\n}\n\nfunction endAll (event) {\n for (let i = 0; i < scope.interactions.length; i++) {\n const interaction = scope.interactions[i];\n\n interaction.end(event);\n signals.fire('endall', { event, interaction });\n }\n}\n\nconst docEvents = { /* 'eventType': listenerFunc */ };\nconst pEventTypes = browser.pEventTypes;\n\nif (scope.PointerEvent) {\n docEvents[pEventTypes.down ] = listeners.pointerDown;\n docEvents[pEventTypes.move ] = listeners.pointerMove;\n docEvents[pEventTypes.up ] = listeners.pointerUp;\n docEvents[pEventTypes.cancel] = listeners.pointerUp;\n}\nelse {\n docEvents.mousedown = listeners.pointerDown;\n docEvents.mousemove = listeners.pointerMove;\n docEvents.mouseup = listeners.pointerUp;\n\n docEvents.touchstart = listeners.pointerDown;\n docEvents.touchmove = listeners.pointerMove;\n docEvents.touchend = listeners.pointerUp;\n docEvents.touchcancel = listeners.pointerUp;\n}\n\ndocEvents.blur = endAll;\n\nfunction onDocSignal ({ doc }, signalName) {\n const eventMethod = signalName.indexOf('add') === 0\n ? events.add : events.remove;\n\n // delegate event listener\n for (const eventType in scope.delegatedEvents) {\n eventMethod(doc, eventType, events.delegateListener);\n eventMethod(doc, eventType, events.delegateUseCapture, true);\n }\n\n for (const eventType in docEvents) {\n eventMethod(doc, eventType, docEvents[eventType]);\n }\n}\n\nsignals.on('update-pointer-down', ({ interaction, pointer, pointerId, pointerIndex, event, eventTarget, down }) => {\n interaction.pointerIds[pointerIndex] = pointerId;\n interaction.pointers[pointerIndex] = pointer;\n\n if (down) {\n interaction.pointerIsDown = true;\n }\n\n if (!interaction.interacting()) {\n utils.setCoords(interaction.startCoords, interaction.pointers);\n\n utils.copyCoords(interaction.curCoords , interaction.startCoords);\n utils.copyCoords(interaction.prevCoords, interaction.startCoords);\n\n interaction.downEvent = event;\n interaction.downTimes[pointerIndex] = interaction.curCoords.timeStamp;\n interaction.downTargets[pointerIndex] = eventTarget || event && utils.getEventTargets(event)[0];\n interaction.pointerWasMoved = false;\n\n utils.pointerExtend(interaction.downPointer, pointer);\n }\n});\n\nscope.signals.on('add-document' , onDocSignal);\nscope.signals.on('remove-document', onDocSignal);\n\nInteraction.pointerMoveTolerance = 1;\nInteraction.doOnInteractions = doOnInteractions;\nInteraction.endAll = endAll;\nInteraction.signals = signals;\nInteraction.docEvents = docEvents;\n\nscope.endAllInteractions = endAll;\n\nmodule.exports = Interaction;\n","const Interaction = require('../Interaction');\nconst InteractEvent = require('../InteractEvent');\n\nconst actions = {\n firePrepared,\n names: [],\n methodDict: {},\n};\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n interaction._interacting = true;\n firePrepared(interaction, event, 'start');\n});\n\nInteraction.signals.on('action-move', function ({ interaction, event, preEnd }) {\n firePrepared(interaction, event, 'move', preEnd);\n\n // if the action was ended in a listener\n if (!interaction.interacting()) { return false; }\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n firePrepared(interaction, event, 'end');\n});\n\nfunction firePrepared (interaction, event, phase, preEnd) {\n const actionName = interaction.prepared.name;\n\n const newEvent = new InteractEvent(interaction, event, actionName, phase, interaction.element, null, preEnd);\n\n interaction.target.fire(newEvent);\n interaction.prevEvent = newEvent;\n}\n\nmodule.exports = actions;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drag = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n startAxis : 'xy',\n lockAxis : 'xy',\n },\n\n checker: function (pointer, event, interactable) {\n const dragOptions = interactable.options.drag;\n\n return dragOptions.enabled\n ? { name: 'drag', axis: (dragOptions.lockAxis === 'start'\n ? dragOptions.startAxis\n : dragOptions.lockAxis)}\n : null;\n },\n\n getCursor: function () {\n return 'move';\n },\n};\n\nInteraction.signals.on('before-action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n interaction.curCoords.page.y = interaction.startCoords.page.y;\n interaction.curCoords.client.y = interaction.startCoords.client.y;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vx);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vx);\n interaction.pointerDelta.client.vy = 0;\n interaction.pointerDelta.page.vy = 0;\n }\n else if (axis === 'y') {\n interaction.curCoords.page.x = interaction.startCoords.page.x;\n interaction.curCoords.client.x = interaction.startCoords.client.x;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vy);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vy);\n interaction.pointerDelta.client.vx = 0;\n interaction.pointerDelta.page.vx = 0;\n }\n});\n\n// dragmove\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'dragmove') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n iEvent.pageY = interaction.startCoords.page.y;\n iEvent.clientY = interaction.startCoords.client.y;\n iEvent.dy = 0;\n }\n else if (axis === 'y') {\n iEvent.pageX = interaction.startCoords.page.x;\n iEvent.clientX = interaction.startCoords.client.x;\n iEvent.dx = 0;\n }\n});\n\n/*\\\n * Interactable.draggable\n [ method ]\n *\n * Gets or sets whether drag actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of drag events\n | var isDraggable = interact('ul li').draggable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on drag events (object makes the Interactable draggable)\n = (object) This Interactable\n | interact(element).draggable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // the axis in which the first movement must be\n | // for the drag sequence to start\n | // 'xy' by default - any direction\n | startAxis: 'x' || 'y' || 'xy',\n |\n | // 'xy' by default - don't restrict to one axis (move in any direction)\n | // 'x' or 'y' to restrict movement to either axis\n | // 'start' to restrict movement to the axis the drag started in\n | lockAxis: 'x' || 'y' || 'xy' || 'start',\n |\n | // max number of drags that can happen concurrently\n | // with elements of this Interactable. Infinity by default\n | max: Infinity,\n |\n | // max number of drags that can target the same element+Interactable\n | // 1 by default\n | maxPerElement: 2\n | });\n\\*/\nInteractable.prototype.draggable = function (options) {\n if (utils.is.object(options)) {\n this.options.drag.enabled = options.enabled === false? false: true;\n this.setPerAction('drag', options);\n this.setOnEvents('drag', options);\n\n if (/^(xy|x|y|start)$/.test(options.lockAxis)) {\n this.options.drag.lockAxis = options.lockAxis;\n }\n if (/^(xy|x|y)$/.test(options.startAxis)) {\n this.options.drag.startAxis = options.startAxis;\n }\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drag.enabled = options;\n\n if (!options) {\n this.ondragstart = this.ondragstart = this.ondragend = null;\n }\n\n return this;\n }\n\n return this.options.drag;\n};\n\nactions.drag = drag;\nactions.names.push('drag');\nutils.merge(Interactable.eventTypes, [\n 'dragstart',\n 'dragmove',\n 'draginertiastart',\n 'draginertiaresume',\n 'dragend',\n]);\nactions.methodDict.drag = 'draggable';\n\ndefaultOptions.drag = drag.defaults;\n\nmodule.exports = drag;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst scope = require('../scope');\nconst interact = require('../interact');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drop = {\n defaults: {\n enabled: false,\n accept : null,\n overlap: 'pointer',\n },\n};\n\nlet dynamicDrop = false;\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // reset active dropzones\n interaction.activeDrops.dropzones = [];\n interaction.activeDrops.elements = [];\n interaction.activeDrops.rects = [];\n\n interaction.dropEvents = null;\n\n if (!interaction.dynamicDrop) {\n setActiveDrops(interaction, interaction.element);\n }\n\n const dragEvent = interaction.prevEvent;\n const dropEvents = getDropEvents(interaction, event, dragEvent);\n\n if (dropEvents.activate) {\n fireActiveDrops(interaction, dropEvents.activate);\n }\n});\n\nInteractEvent.signals.on('new', function ({ interaction, iEvent, event }) {\n if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { return; }\n\n const draggableElement = interaction.element;\n const dragEvent = iEvent;\n const dropResult = getDrop(dragEvent, event, draggableElement);\n\n interaction.dropTarget = dropResult.dropzone;\n interaction.dropElement = dropResult.element;\n\n interaction.dropEvents = getDropEvents(interaction, event, dragEvent);\n});\n\nInteraction.signals.on('action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n fireDropEvents(interaction, interaction.dropEvents);\n});\n\nInteraction.signals.on('action-end', function ({ interaction }) {\n if (interaction.prepared.name === 'drag') {\n fireDropEvents(interaction, interaction.dropEvents);\n }\n});\n\nInteraction.signals.on('stop-drag', function ({ interaction }) {\n interaction.activeDrops.dropzones =\n interaction.activeDrops.elements =\n interaction.activeDrops.rects =\n interaction.dropEvents = null;\n});\n\nfunction collectDrops (interaction, element) {\n const drops = [];\n const elements = [];\n\n element = element || interaction.element;\n\n // collect all dropzones and their elements which qualify for a drop\n for (const current of scope.interactables) {\n if (!current.options.drop.enabled) { continue; }\n\n const accept = current.options.drop.accept;\n\n // test the draggable element against the dropzone's accept setting\n if ((utils.is.element(accept) && accept !== element)\n || (utils.is.string(accept)\n && !utils.matchesSelector(element, accept))) {\n\n continue;\n }\n\n // query for new elements if necessary\n const dropElements = utils.is.string(current.target)\n ? current._context.querySelectorAll(current.target)\n : [current.target];\n\n for (let i = 0; i < dropElements.length; i++) {\n const currentElement = dropElements[i];\n\n if (currentElement !== element) {\n drops.push(current);\n elements.push(currentElement);\n }\n }\n }\n\n return {\n elements,\n dropzones: drops,\n };\n}\n\nfunction fireActiveDrops (interaction, event) {\n let prevElement;\n\n // loop through all active dropzones and trigger event\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n const current = interaction.activeDrops.dropzones[i];\n const currentElement = interaction.activeDrops.elements [i];\n\n // prevent trigger of duplicate events on same element\n if (currentElement !== prevElement) {\n // set current element as event target\n event.target = currentElement;\n current.fire(event);\n }\n prevElement = currentElement;\n }\n}\n\n// Collect a new set of possible drops and save them in activeDrops.\n// setActiveDrops should always be called when a drag has just started or a\n// drag event happens while dynamicDrop is true\nfunction setActiveDrops (interaction, dragElement) {\n // get dropzones and their elements that could receive the draggable\n const possibleDrops = collectDrops(interaction, dragElement, true);\n\n interaction.activeDrops.dropzones = possibleDrops.dropzones;\n interaction.activeDrops.elements = possibleDrops.elements;\n interaction.activeDrops.rects = [];\n\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n interaction.activeDrops.rects[i] =\n interaction.activeDrops.dropzones[i].getRect(interaction.activeDrops.elements[i]);\n }\n}\n\nfunction getDrop (dragEvent, event, dragElement) {\n const interaction = dragEvent.interaction;\n const validDrops = [];\n\n if (dynamicDrop) {\n setActiveDrops(interaction, dragElement);\n }\n\n // collect all dropzones and their elements which qualify for a drop\n for (let j = 0; j < interaction.activeDrops.dropzones.length; j++) {\n const current = interaction.activeDrops.dropzones[j];\n const currentElement = interaction.activeDrops.elements [j];\n const rect = interaction.activeDrops.rects [j];\n\n validDrops.push(current.dropCheck(dragEvent, event, interaction.target, dragElement, currentElement, rect)\n ? currentElement\n : null);\n }\n\n // get the most appropriate dropzone based on DOM depth and order\n const dropIndex = utils.indexOfDeepestElement(validDrops);\n\n return {\n dropzone: interaction.activeDrops.dropzones[dropIndex] || null,\n element : interaction.activeDrops.elements [dropIndex] || null,\n };\n}\n\nfunction getDropEvents (interaction, pointerEvent, dragEvent) {\n const dropEvents = {\n enter : null,\n leave : null,\n activate : null,\n deactivate: null,\n move : null,\n drop : null,\n };\n\n const tmpl = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n };\n\n if (interaction.dropElement !== interaction.prevDropElement) {\n // if there was a prevDropTarget, create a dragleave event\n if (interaction.prevDropTarget) {\n dropEvents.leave = utils.extend({ type: 'dragleave' }, tmpl);\n\n dragEvent.dragLeave = dropEvents.leave.target = interaction.prevDropElement;\n dragEvent.prevDropzone = dropEvents.leave.dropzone = interaction.prevDropTarget;\n }\n // if the dropTarget is not null, create a dragenter event\n if (interaction.dropTarget) {\n dropEvents.enter = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n type : 'dragenter',\n };\n\n dragEvent.dragEnter = interaction.dropElement;\n dragEvent.dropzone = interaction.dropTarget;\n }\n }\n\n if (dragEvent.type === 'dragend' && interaction.dropTarget) {\n dropEvents.drop = utils.extend({ type: 'drop' }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n dragEvent.relatedTarget = interaction.dropElement;\n }\n if (dragEvent.type === 'dragstart') {\n dropEvents.activate = utils.extend({ type: 'dropactivate' }, tmpl);\n\n dropEvents.activate.target = null;\n dropEvents.activate.dropzone = null;\n }\n if (dragEvent.type === 'dragend') {\n dropEvents.deactivate = utils.extend({ type: 'dropdeactivate' }, tmpl);\n\n dropEvents.deactivate.target = null;\n dropEvents.deactivate.dropzone = null;\n }\n if (dragEvent.type === 'dragmove' && interaction.dropTarget) {\n dropEvents.move = utils.extend({\n dragmove : dragEvent,\n type : 'dropmove',\n }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n }\n\n return dropEvents;\n}\n\nfunction fireDropEvents (interaction, dropEvents) {\n if (dropEvents.leave) { interaction.prevDropTarget.fire(dropEvents.leave); }\n if (dropEvents.move ) { interaction.dropTarget.fire(dropEvents.move ); }\n if (dropEvents.enter) { interaction.dropTarget.fire(dropEvents.enter); }\n if (dropEvents.drop ) { interaction.dropTarget.fire(dropEvents.drop ); }\n if (dropEvents.deactivate) {\n fireActiveDrops(interaction, dropEvents.deactivate);\n }\n\n interaction.prevDropTarget = interaction.dropTarget;\n interaction.prevDropElement = interaction.dropElement;\n}\n\n/*\\\n * Interactable.dropzone\n [ method ]\n *\n * Returns or sets whether elements can be dropped onto this\n * Interactable to trigger drop events\n *\n * Dropzones can receive the following events:\n * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends\n * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone\n * - `dragmove` when a draggable that has entered the dropzone is moved\n * - `drop` when a draggable is dropped into this dropzone\n *\n * Use the `accept` option to allow only elements that match the given CSS\n * selector or element. The value can be:\n *\n * - **an Element** - only that element can be dropped into this dropzone.\n * - **a string**, - the element being dragged must match it as a CSS selector.\n * - **`null`** - accept options is cleared - it accepts any element.\n *\n * Use the `overlap` option to set how drops are checked for. The allowed\n * values are:\n *\n * - `'pointer'`, the pointer must be over the dropzone (default)\n * - `'center'`, the draggable element's center must be over the dropzone\n * - a number from 0-1 which is the `(intersection area) / (draggable area)`.\n * e.g. `0.5` for drop to happen when half of the area of the draggable is\n * over the dropzone\n *\n * Use the `checker` option to specify a function to check if a dragged\n * element is over this Interactable.\n *\n | interact(target)\n | .dropChecker(function(dragEvent, // related dragmove or dragend event\n | event, // TouchEvent/PointerEvent/MouseEvent\n | dropped, // bool result of the default checker\n | dropzone, // dropzone Interactable\n | dropElement, // dropzone elemnt\n | draggable, // draggable Interactable\n | draggableElement) {// draggable element\n |\n | return dropped && event.target.hasAttribute('allow-drop');\n | }\n *\n *\n - options (boolean | object | null) #optional The new value to be set.\n | interact('.drop').dropzone({\n | accept: '.can-drop' || document.getElementById('single-drop'),\n | overlap: 'pointer' || 'center' || zeroToOne\n | }\n = (boolean | object) The current setting or this Interactable\n\\*/\nInteractable.prototype.dropzone = function (options) {\n if (utils.is.object(options)) {\n this.options.drop.enabled = options.enabled === false? false: true;\n\n if (utils.is.function(options.ondrop) ) { this.events.ondrop = options.ondrop ; }\n if (utils.is.function(options.ondropactivate) ) { this.events.ondropactivate = options.ondropactivate ; }\n if (utils.is.function(options.ondropdeactivate)) { this.events.ondropdeactivate = options.ondropdeactivate; }\n if (utils.is.function(options.ondragenter) ) { this.events.ondragenter = options.ondragenter ; }\n if (utils.is.function(options.ondragleave) ) { this.events.ondragleave = options.ondragleave ; }\n if (utils.is.function(options.ondropmove) ) { this.events.ondropmove = options.ondropmove ; }\n\n if (/^(pointer|center)$/.test(options.overlap)) {\n this.options.drop.overlap = options.overlap;\n }\n else if (utils.is.number(options.overlap)) {\n this.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0);\n }\n if ('accept' in options) {\n this.options.drop.accept = options.accept;\n }\n if ('checker' in options) {\n this.options.drop.checker = options.checker;\n }\n\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drop.enabled = options;\n\n if (!options) {\n this.ondragenter = this.ondragleave = this.ondrop\n = this.ondropactivate = this.ondropdeactivate = null;\n }\n\n return this;\n }\n\n return this.options.drop;\n};\n\nInteractable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) {\n let dropped = false;\n\n // if the dropzone has no rect (eg. display: none)\n // call the custom dropChecker or just return false\n if (!(rect = rect || this.getRect(dropElement))) {\n return (this.options.drop.checker\n ? this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement)\n : false);\n }\n\n const dropOverlap = this.options.drop.overlap;\n\n if (dropOverlap === 'pointer') {\n const origin = utils.getOriginXY(draggable, draggableElement, 'drag');\n const page = utils.getPageXY(dragEvent);\n\n page.x += origin.x;\n page.y += origin.y;\n\n const horizontal = (page.x > rect.left) && (page.x < rect.right);\n const vertical = (page.y > rect.top ) && (page.y < rect.bottom);\n\n dropped = horizontal && vertical;\n }\n\n const dragRect = draggable.getRect(draggableElement);\n\n if (dragRect && dropOverlap === 'center') {\n const cx = dragRect.left + dragRect.width / 2;\n const cy = dragRect.top + dragRect.height / 2;\n\n dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom;\n }\n\n if (dragRect && utils.is.number(dropOverlap)) {\n const overlapArea = (Math.max(0, Math.min(rect.right , dragRect.right ) - Math.max(rect.left, dragRect.left))\n * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top , dragRect.top )));\n\n const overlapRatio = overlapArea / (dragRect.width * dragRect.height);\n\n dropped = overlapRatio >= dropOverlap;\n }\n\n if (this.options.drop.checker) {\n dropped = this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement);\n }\n\n return dropped;\n};\n\nInteractable.signals.on('unset', function ({ interactable }) {\n interactable.dropzone(false);\n});\n\nInteractable.settingsMethods.push('dropChecker');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.dropTarget = null; // the dropzone a drag target might be dropped into\n interaction.dropElement = null; // the element at the time of checking\n interaction.prevDropTarget = null; // the dropzone that was recently dragged away from\n interaction.prevDropElement = null; // the element at the time of checking\n interaction.dropEvents = null; // the dropEvents related to the current drag event\n\n interaction.activeDrops = {\n dropzones: [], // the dropzones that are mentioned below\n elements : [], // elements of dropzones that accept the target draggable\n rects : [], // the rects of the elements mentioned above\n };\n\n});\n\nInteraction.signals.on('stop', function ({ interaction }) {\n interaction.dropTarget = interaction.dropElement =\n interaction.prevDropTarget = interaction.prevDropElement = null;\n});\n\n/*\\\n * interact.dynamicDrop\n [ method ]\n *\n * Returns or sets whether the dimensions of dropzone elements are\n * calculated on every dragmove or only on dragstart for the default\n * dropChecker\n *\n - newValue (boolean) #optional True to check on each move. False to check only before start\n = (boolean | interact) The current setting or interact\n\\*/\ninteract.dynamicDrop = function (newValue) {\n if (utils.is.bool(newValue)) {\n //if (dragging && dynamicDrop !== newValue && !newValue) {\n //calcRects(dropzones);\n //}\n\n dynamicDrop = newValue;\n\n return interact;\n }\n return dynamicDrop;\n};\n\nutils.merge(Interactable.eventTypes, [\n 'dragenter',\n 'dragleave',\n 'dropactivate',\n 'dropdeactivate',\n 'dropmove',\n 'drop',\n]);\nactions.methodDict.drop = 'dropzone';\n\ndefaultOptions.drop = drop.defaults;\n\nmodule.exports = drop;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst gesture = {\n defaults: {\n enabled : false,\n origin : null,\n restrict: null,\n },\n\n checker: function (pointer, event, interactable, element, interaction) {\n if (interaction.pointerIds.length >= 2) {\n return { name: 'gesture' };\n }\n\n return null;\n },\n\n getCursor: function () {\n return '';\n },\n};\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturestart') { return; }\n iEvent.ds = 0;\n\n interaction.gesture.startDistance = interaction.gesture.prevDistance = iEvent.distance;\n interaction.gesture.startAngle = interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.scale = 1;\n});\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturemove') { return; }\n\n iEvent.ds = iEvent.scale - interaction.gesture.scale;\n\n interaction.target.fire(iEvent);\n\n interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.prevDistance = iEvent.distance;\n\n if (iEvent.scale !== Infinity\n && iEvent.scale !== null\n && iEvent.scale !== undefined\n && !isNaN(iEvent.scale)) {\n\n interaction.gesture.scale = iEvent.scale;\n }\n});\n\n/*\\\n * Interactable.gesturable\n [ method ]\n *\n * Gets or sets whether multitouch gestures can be performed on the\n * Interactable's element\n *\n = (boolean) Indicates if this can be the target of gesture events\n | var isGestureable = interact(element).gesturable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on gesture events (makes the Interactable gesturable)\n = (object) this Interactable\n | interact(element).gesturable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // limit multiple gestures.\n | // See the explanation in @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n\\*/\nInteractable.prototype.gesturable = function (options) {\n if (utils.is.object(options)) {\n this.options.gesture.enabled = options.enabled === false? false: true;\n this.setPerAction('gesture', options);\n this.setOnEvents('gesture', options);\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.gesture.enabled = options;\n\n if (!options) {\n this.ongesturestart = this.ongesturestart = this.ongestureend = null;\n }\n\n return this;\n }\n\n return this.options.gesture;\n};\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action, event, starting, ending, deltaSource }) {\n if (action !== 'gesture') { return; }\n\n const pointers = interaction.pointers;\n\n iEvent.touches = [pointers[0], pointers[1]];\n\n if (starting) {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = 1;\n iEvent.ds = 0;\n iEvent.angle = utils.touchAngle(pointers, undefined, deltaSource);\n iEvent.da = 0;\n }\n else if (ending || event instanceof InteractEvent) {\n iEvent.distance = interaction.prevEvent.distance;\n iEvent.box = interaction.prevEvent.box;\n iEvent.scale = interaction.prevEvent.scale;\n iEvent.ds = iEvent.scale - 1;\n iEvent.angle = interaction.prevEvent.angle;\n iEvent.da = iEvent.angle - interaction.gesture.startAngle;\n }\n else {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = iEvent.distance / interaction.gesture.startDistance;\n iEvent.angle = utils.touchAngle(pointers, interaction.gesture.prevAngle, deltaSource);\n\n iEvent.ds = iEvent.scale - interaction.gesture.prevScale;\n iEvent.da = iEvent.angle - interaction.gesture.prevAngle;\n }\n});\n\nInteraction.signals.on('new', function (interaction) {\n interaction.gesture = {\n start: { x: 0, y: 0 },\n\n startDistance: 0, // distance between two touches of touchStart\n prevDistance : 0,\n distance : 0,\n\n scale: 1, // gesture.distance / gesture.startDistance\n\n startAngle: 0, // angle of line joining two touches\n prevAngle : 0, // angle of the previous gesture event\n };\n});\n\nactions.gesture = gesture;\nactions.names.push('gesture');\nutils.merge(Interactable.eventTypes, [\n 'gesturestart',\n 'gesturemove',\n 'gestureend',\n]);\nactions.methodDict.gesture = 'gesturable';\n\ndefaultOptions.gesture = gesture.defaults;\n\nmodule.exports = gesture;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\n// Less Precision with touch input\nconst defaultMargin = browser.supportsTouch || browser.supportsPointerEvent? 20: 10;\n\nconst resize = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n square: false,\n preserveAspectRatio: false,\n axis: 'xy',\n\n // use default margin\n margin: NaN,\n\n // object with props left, right, top, bottom which are\n // true/false values to resize when the pointer is over that edge,\n // CSS selectors to match the handles for each direction\n // or the Elements for each handle\n edges: null,\n\n // a value of 'none' will limit the resize rect to a minimum of 0x0\n // 'negate' will alow the rect to have negative width/height\n // 'reposition' will keep the width/height positive by swapping\n // the top and bottom edges and/or swapping the left and right edges\n invert: 'none',\n },\n\n checker: function (pointer, event, interactable, element, interaction, rect) {\n if (!rect) { return null; }\n\n const page = utils.extend({}, interaction.curCoords.page);\n const options = interactable.options;\n\n if (options.resize.enabled) {\n const resizeOptions = options.resize;\n const resizeEdges = { left: false, right: false, top: false, bottom: false };\n\n // if using resize.edges\n if (utils.is.object(resizeOptions.edges)) {\n for (const edge in resizeEdges) {\n resizeEdges[edge] = checkResizeEdge(edge,\n resizeOptions.edges[edge],\n page,\n interaction._eventTarget,\n element,\n rect,\n resizeOptions.margin || defaultMargin);\n }\n\n resizeEdges.left = resizeEdges.left && !resizeEdges.right;\n resizeEdges.top = resizeEdges.top && !resizeEdges.bottom;\n\n if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) {\n return {\n name: 'resize',\n edges: resizeEdges,\n };\n }\n }\n else {\n const right = options.resize.axis !== 'y' && page.x > (rect.right - defaultMargin);\n const bottom = options.resize.axis !== 'x' && page.y > (rect.bottom - defaultMargin);\n\n if (right || bottom) {\n return {\n name: 'resize',\n axes: (right? 'x' : '') + (bottom? 'y' : ''),\n };\n }\n }\n }\n\n return null;\n },\n\n cursors: (browser.isIe9OrOlder ? {\n x : 'e-resize',\n y : 's-resize',\n xy: 'se-resize',\n\n top : 'n-resize',\n left : 'w-resize',\n bottom : 's-resize',\n right : 'e-resize',\n topleft : 'se-resize',\n bottomright: 'se-resize',\n topright : 'ne-resize',\n bottomleft : 'ne-resize',\n } : {\n x : 'ew-resize',\n y : 'ns-resize',\n xy: 'nwse-resize',\n\n top : 'ns-resize',\n left : 'ew-resize',\n bottom : 'ns-resize',\n right : 'ew-resize',\n topleft : 'nwse-resize',\n bottomright: 'nwse-resize',\n topright : 'nesw-resize',\n bottomleft : 'nesw-resize',\n }),\n\n getCursor: function (action) {\n if (action.axis) {\n return resize.cursors[action.name + action.axis];\n }\n else if (action.edges) {\n let cursorKey = '';\n const edgeNames = ['top', 'bottom', 'left', 'right'];\n\n for (let i = 0; i < 4; i++) {\n if (action.edges[edgeNames[i]]) {\n cursorKey += edgeNames[i];\n }\n }\n\n return resize.cursors[cursorKey];\n }\n },\n};\n\n// resizestart\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'resizestart' || !interaction.prepared.edges) {\n return;\n }\n\n const startRect = interaction.target.getRect(interaction.element);\n const resizeOptions = interaction.target.options.resize;\n\n /*\n * When using the `resizable.square` or `resizable.preserveAspectRatio` options, resizing from one edge\n * will affect another. E.g. with `resizable.square`, resizing to make the right edge larger will make\n * the bottom edge larger by the same amount. We call these 'linked' edges. Any linked edges will depend\n * on the active edges and the edge being interacted with.\n */\n if (resizeOptions.square || resizeOptions.preserveAspectRatio) {\n const linkedEdges = utils.extend({}, interaction.prepared.edges);\n\n linkedEdges.top = linkedEdges.top || (linkedEdges.left && !linkedEdges.bottom);\n linkedEdges.left = linkedEdges.left || (linkedEdges.top && !linkedEdges.right );\n linkedEdges.bottom = linkedEdges.bottom || (linkedEdges.right && !linkedEdges.top );\n linkedEdges.right = linkedEdges.right || (linkedEdges.bottom && !linkedEdges.left );\n\n interaction.prepared._linkedEdges = linkedEdges;\n }\n else {\n interaction.prepared._linkedEdges = null;\n }\n\n // if using `resizable.preserveAspectRatio` option, record aspect ratio at the start of the resize\n if (resizeOptions.preserveAspectRatio) {\n interaction.resizeStartAspectRatio = startRect.width / startRect.height;\n }\n\n interaction.resizeRects = {\n start : startRect,\n current : utils.extend({}, startRect),\n inverted : utils.extend({}, startRect),\n previous : utils.extend({}, startRect),\n delta : {\n left: 0, right : 0, width : 0,\n top : 0, bottom: 0, height: 0,\n },\n };\n\n iEvent.rect = interaction.resizeRects.inverted;\n iEvent.deltaRect = interaction.resizeRects.delta;\n});\n\n// resizemove\nInteractEvent.signals.on('new', function ({ iEvent, phase, interaction }) {\n if (phase !== 'move' || !interaction.prepared.edges) { return; }\n\n const resizeOptions = interaction.target.options.resize;\n const invert = resizeOptions.invert;\n const invertible = invert === 'reposition' || invert === 'negate';\n\n let edges = interaction.prepared.edges;\n\n const start = interaction.resizeRects.start;\n const current = interaction.resizeRects.current;\n const inverted = interaction.resizeRects.inverted;\n const delta = interaction.resizeRects.delta;\n const previous = utils.extend(interaction.resizeRects.previous, inverted);\n const originalEdges = edges;\n\n let dx = iEvent.dx;\n let dy = iEvent.dy;\n\n if (resizeOptions.preserveAspectRatio || resizeOptions.square) {\n // `resize.preserveAspectRatio` takes precedence over `resize.square`\n const startAspectRatio = resizeOptions.preserveAspectRatio\n ? interaction.resizeStartAspectRatio\n : 1;\n\n edges = interaction.prepared._linkedEdges;\n\n if ((originalEdges.left && originalEdges.bottom)\n || (originalEdges.right && originalEdges.top)) {\n dy = -dx / startAspectRatio;\n }\n else if (originalEdges.left || originalEdges.right ) { dy = dx / startAspectRatio; }\n else if (originalEdges.top || originalEdges.bottom) { dx = dy * startAspectRatio; }\n }\n\n // update the 'current' rect without modifications\n if (edges.top ) { current.top += dy; }\n if (edges.bottom) { current.bottom += dy; }\n if (edges.left ) { current.left += dx; }\n if (edges.right ) { current.right += dx; }\n\n if (invertible) {\n // if invertible, copy the current rect\n utils.extend(inverted, current);\n\n if (invert === 'reposition') {\n // swap edge values if necessary to keep width/height positive\n let swap;\n\n if (inverted.top > inverted.bottom) {\n swap = inverted.top;\n\n inverted.top = inverted.bottom;\n inverted.bottom = swap;\n }\n if (inverted.left > inverted.right) {\n swap = inverted.left;\n\n inverted.left = inverted.right;\n inverted.right = swap;\n }\n }\n }\n else {\n // if not invertible, restrict to minimum of 0x0 rect\n inverted.top = Math.min(current.top, start.bottom);\n inverted.bottom = Math.max(current.bottom, start.top);\n inverted.left = Math.min(current.left, start.right);\n inverted.right = Math.max(current.right, start.left);\n }\n\n inverted.width = inverted.right - inverted.left;\n inverted.height = inverted.bottom - inverted.top ;\n\n for (const edge in inverted) {\n delta[edge] = inverted[edge] - previous[edge];\n }\n\n iEvent.edges = interaction.prepared.edges;\n iEvent.rect = inverted;\n iEvent.deltaRect = delta;\n});\n\n/*\\\n * Interactable.resizable\n [ method ]\n *\n * Gets or sets whether resize actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of resize elements\n | var isResizeable = interact('input[type=text]').resizable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on resize events (object makes the Interactable resizable)\n = (object) This Interactable\n | interact(element).resizable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | edges: {\n | top : true, // Use pointer coords to check for resize.\n | left : false, // Disable resizing from left edge.\n | bottom: '.resize-s',// Resize if pointer target matches selector\n | right : handleEl // Resize if pointer target is the given Element\n | },\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height are adjusted at a 1:1 ratio.\n | square: false,\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height maintain the aspect ratio they had when resizing started.\n | preserveAspectRatio: false,\n |\n | // a value of 'none' will limit the resize rect to a minimum of 0x0\n | // 'negate' will allow the rect to have negative width/height\n | // 'reposition' will keep the width/height positive by swapping\n | // the top and bottom edges and/or swapping the left and right edges\n | invert: 'none' || 'negate' || 'reposition'\n |\n | // limit multiple resizes.\n | // See the explanation in the @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n \\*/\nInteractable.prototype.resizable = function (options) {\n if (utils.is.object(options)) {\n this.options.resize.enabled = options.enabled === false? false: true;\n this.setPerAction('resize', options);\n this.setOnEvents('resize', options);\n\n if (/^x$|^y$|^xy$/.test(options.axis)) {\n this.options.resize.axis = options.axis;\n }\n else if (options.axis === null) {\n this.options.resize.axis = defaultOptions.resize.axis;\n }\n\n if (utils.is.bool(options.preserveAspectRatio)) {\n this.options.resize.preserveAspectRatio = options.preserveAspectRatio;\n }\n else if (utils.is.bool(options.square)) {\n this.options.resize.square = options.square;\n }\n\n return this;\n }\n if (utils.is.bool(options)) {\n this.options.resize.enabled = options;\n\n if (!options) {\n this.onresizestart = this.onresizestart = this.onresizeend = null;\n }\n\n return this;\n }\n return this.options.resize;\n};\n\nfunction checkResizeEdge (name, value, page, element, interactableElement, rect, margin) {\n // false, '', undefined, null\n if (!value) { return false; }\n\n // true value, use pointer coords and element rect\n if (value === true) {\n // if dimensions are negative, \"switch\" edges\n const width = utils.is.number(rect.width )? rect.width : rect.right - rect.left;\n const height = utils.is.number(rect.height)? rect.height : rect.bottom - rect.top ;\n\n if (width < 0) {\n if (name === 'left' ) { name = 'right'; }\n else if (name === 'right') { name = 'left' ; }\n }\n if (height < 0) {\n if (name === 'top' ) { name = 'bottom'; }\n else if (name === 'bottom') { name = 'top' ; }\n }\n\n if (name === 'left' ) { return page.x < ((width >= 0? rect.left: rect.right ) + margin); }\n if (name === 'top' ) { return page.y < ((height >= 0? rect.top : rect.bottom) + margin); }\n\n if (name === 'right' ) { return page.x > ((width >= 0? rect.right : rect.left) - margin); }\n if (name === 'bottom') { return page.y > ((height >= 0? rect.bottom: rect.top ) - margin); }\n }\n\n // the remaining checks require an element\n if (!utils.is.element(element)) { return false; }\n\n return utils.is.element(value)\n // the value is an element to use as a resize handle\n ? value === element\n // otherwise check if element matches value as selector\n : utils.matchesUpTo(element, value, interactableElement);\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.resizeAxes = 'xy';\n});\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action }) {\n if (action !== 'resize' || !interaction.resizeAxes) { return; }\n\n const options = interaction.target.options;\n\n if (options.resize.square) {\n if (interaction.resizeAxes === 'y') {\n iEvent.dx = iEvent.dy;\n }\n else {\n iEvent.dy = iEvent.dx;\n }\n iEvent.axes = 'xy';\n }\n else {\n iEvent.axes = interaction.resizeAxes;\n\n if (interaction.resizeAxes === 'x') {\n iEvent.dy = 0;\n }\n else if (interaction.resizeAxes === 'y') {\n iEvent.dx = 0;\n }\n }\n});\n\nactions.resize = resize;\nactions.names.push('resize');\nutils.merge(Interactable.eventTypes, [\n 'resizestart',\n 'resizemove',\n 'resizeinertiastart',\n 'resizeinertiaresume',\n 'resizeend',\n]);\nactions.methodDict.resize = 'resizable';\n\ndefaultOptions.resize = resize.defaults;\n\nmodule.exports = resize;\n","const raf = require('./utils/raf');\nconst getWindow = require('./utils/window').getWindow;\nconst is = require('./utils/is');\nconst domUtils = require('./utils/domUtils');\nconst Interaction = require('./Interaction');\nconst defaultOptions = require('./defaultOptions');\n\nconst autoScroll = {\n defaults: {\n enabled : false,\n container: null, // the item that is scrolled (Window or HTMLElement)\n margin : 60,\n speed : 300, // the scroll speed in pixels per second\n },\n\n interaction: null,\n i: null, // the handle returned by window.setInterval\n x: 0, y: 0, // Direction each pulse is to scroll in\n\n isScrolling: false,\n prevTime: 0,\n\n start: function (interaction) {\n autoScroll.isScrolling = true;\n raf.cancel(autoScroll.i);\n\n autoScroll.interaction = interaction;\n autoScroll.prevTime = new Date().getTime();\n autoScroll.i = raf.request(autoScroll.scroll);\n },\n\n stop: function () {\n autoScroll.isScrolling = false;\n raf.cancel(autoScroll.i);\n },\n\n // scroll the window by the values in scroll.x/y\n scroll: function () {\n const options = autoScroll.interaction.target.options[autoScroll.interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(autoScroll.interaction.element);\n const now = new Date().getTime();\n // change in time in seconds\n const dt = (now - autoScroll.prevTime) / 1000;\n // displacement\n const s = options.speed * dt;\n\n if (s >= 1) {\n if (is.window(container)) {\n container.scrollBy(autoScroll.x * s, autoScroll.y * s);\n }\n else if (container) {\n container.scrollLeft += autoScroll.x * s;\n container.scrollTop += autoScroll.y * s;\n }\n\n autoScroll.prevTime = now;\n }\n\n if (autoScroll.isScrolling) {\n raf.cancel(autoScroll.i);\n autoScroll.i = raf.request(autoScroll.scroll);\n }\n },\n check: function (interactable, actionName) {\n const options = interactable.options;\n\n return options[actionName].autoScroll && options[actionName].autoScroll.enabled;\n },\n onInteractionMove: function ({ interaction, pointer }) {\n if (!(interaction.interacting()\n && autoScroll.check(interaction.target, interaction.prepared.name))) {\n return;\n }\n\n if (interaction.simulation) {\n autoScroll.x = autoScroll.y = 0;\n return;\n }\n\n let top;\n let right;\n let bottom;\n let left;\n\n const options = interaction.target.options[interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(interaction.element);\n\n if (is.window(container)) {\n left = pointer.clientX < autoScroll.margin;\n top = pointer.clientY < autoScroll.margin;\n right = pointer.clientX > container.innerWidth - autoScroll.margin;\n bottom = pointer.clientY > container.innerHeight - autoScroll.margin;\n }\n else {\n const rect = domUtils.getElementClientRect(container);\n\n left = pointer.clientX < rect.left + autoScroll.margin;\n top = pointer.clientY < rect.top + autoScroll.margin;\n right = pointer.clientX > rect.right - autoScroll.margin;\n bottom = pointer.clientY > rect.bottom - autoScroll.margin;\n }\n\n autoScroll.x = (right ? 1: left? -1: 0);\n autoScroll.y = (bottom? 1: top? -1: 0);\n\n if (!autoScroll.isScrolling) {\n // set the autoScroll properties to those of the target\n autoScroll.margin = options.margin;\n autoScroll.speed = options.speed;\n\n autoScroll.start(interaction);\n }\n },\n};\n\nInteraction.signals.on('stop-active', function () {\n autoScroll.stop();\n});\n\nInteraction.signals.on('action-move', autoScroll.onInteractionMove);\n\ndefaultOptions.perAction.autoScroll = autoScroll.defaults;\n\nmodule.exports = autoScroll;\n","const Interactable = require('../Interactable');\nconst actions = require('../actions/base');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.ignoreFrom\n [ method ]\n *\n * If the target of the `mousedown`, `pointerdown` or `touchstart`\n * event or any of it's parents match the given CSS selector or\n * Element, no drag/resize/gesture is started.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to not ignore any elements\n = (string | Element | object) The current ignoreFrom value or this Interactable\n **\n | interact(element, { ignoreFrom: document.getElementById('no-action') });\n | // or\n | interact(element).ignoreFrom('input, textarea, a');\n\\*/\nInteractable.prototype.ignoreFrom = function (newValue) {\n return this._backCompatOption('ignoreFrom', newValue);\n};\n\n/*\\\n * Interactable.allowFrom\n [ method ]\n *\n * A drag/resize/gesture is started only If the target of the\n * `mousedown`, `pointerdown` or `touchstart` event or any of it's\n * parents match the given CSS selector or Element.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to allow from any element\n = (string | Element | object) The current allowFrom value or this Interactable\n **\n | interact(element, { allowFrom: document.getElementById('drag-handle') });\n | // or\n | interact(element).allowFrom('.handle');\n\\*/\nInteractable.prototype.allowFrom = function (newValue) {\n return this._backCompatOption('allowFrom', newValue);\n};\n\nInteractable.prototype.testIgnore = function (ignoreFrom, interactableElement, element) {\n if (!ignoreFrom || !is.element(element)) { return false; }\n\n if (is.string(ignoreFrom)) {\n return domUtils.matchesUpTo(element, ignoreFrom, interactableElement);\n }\n else if (is.element(ignoreFrom)) {\n return domUtils.nodeContains(ignoreFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testAllow = function (allowFrom, interactableElement, element) {\n if (!allowFrom) { return true; }\n\n if (!is.element(element)) { return false; }\n\n if (is.string(allowFrom)) {\n return domUtils.matchesUpTo(element, allowFrom, interactableElement);\n }\n else if (is.element(allowFrom)) {\n return domUtils.nodeContains(allowFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testIgnoreAllow = function (options, interactableElement, eventTarget) {\n return (!this.testIgnore(options.ignoreFrom, interactableElement, eventTarget)\n && this.testAllow(options.allowFrom, interactableElement, eventTarget));\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (event.buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\n","const interact = require('../interact');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst actions = require('../actions/base');\nconst defaultOptions = require('../defaultOptions');\nconst browser = require('../utils/browser');\nconst scope = require('../scope');\nconst utils = require('../utils');\nconst signals = require('../utils/Signals').new();\n\nrequire('./InteractableMethods');\n\nconst autoStart = {\n signals,\n withinInteractionLimit,\n // Allow this many interactions to happen simultaneously\n maxInteractions: Infinity,\n defaults: {\n perAction: {\n manualStart: false,\n max: Infinity,\n maxPerElement: 1,\n allowFrom: null,\n ignoreFrom: null,\n },\n },\n setActionDefaults: function (action) {\n utils.extend(action.defaults, autoStart.defaults.perAction);\n },\n};\n\n// set cursor style on mousedown\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget }) {\n if (interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\n// set cursor style on mousemove\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget }) {\n if (!interaction.mouse\n || interaction.pointerIsDown\n || interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\nInteraction.signals.on('move', function (arg) {\n const { interaction, event } = arg;\n\n if (!interaction.pointerIsDown\n || interaction.interacting()\n || !interaction.pointerWasMoved\n || !interaction.prepared.name) {\n return;\n }\n\n signals.fire('before-start', arg);\n\n const target = interaction.target;\n\n if (interaction.prepared.name && target) {\n // check manualStart and interaction limit\n if (target.options[interaction.prepared.name].manualStart\n || !withinInteractionLimit(target, interaction.element, interaction.prepared)) {\n interaction.stop(event);\n }\n else {\n interaction.start(interaction.prepared, target, interaction.element);\n }\n }\n});\n\n// Check if the current target supports the action.\n// If so, return the validated action. Otherwise, return null\nfunction validateAction (action, interactable, element, eventTarget) {\n if (utils.is.object(action)\n && interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget)\n && interactable.options[action.name].enabled\n && withinInteractionLimit(interactable, element, action)) {\n return action;\n }\n\n return null;\n}\n\nfunction validateSelector (interaction, pointer, event, matches, matchElements, eventTarget) {\n for (let i = 0, len = matches.length; i < len; i++) {\n const match = matches[i];\n const matchElement = matchElements[i];\n const action = validateAction(match.getAction(pointer, event, interaction, matchElement),\n match,\n matchElement,\n eventTarget);\n\n if (action) {\n return {\n action,\n target: match,\n element: matchElement,\n };\n }\n }\n\n return {};\n}\n\nfunction getActionInfo (interaction, pointer, event, eventTarget) {\n let matches = [];\n let matchElements = [];\n\n let element = eventTarget;\n let action = null;\n\n function pushMatches (interactable, selector, context) {\n const elements = (browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined);\n\n if (utils.matchesSelector(element, selector, elements)) {\n\n matches.push(interactable);\n matchElements.push(element);\n }\n }\n\n while (utils.is.element(element)) {\n matches = [];\n matchElements = [];\n\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && (action = validateAction(elementInteractable.getAction(pointer, event, interaction, element, eventTarget),\n elementInteractable,\n element,\n eventTarget))\n && !elementInteractable.options[action.name].manualStart) {\n return {\n element,\n action,\n target: elementInteractable,\n };\n }\n else {\n scope.interactables.forEachSelector(pushMatches, element);\n\n const actionInfo = validateSelector(interaction, pointer, event, matches, matchElements, eventTarget);\n\n if (actionInfo.action\n && !actionInfo.target.options[actionInfo.action.name].manualStart) {\n return actionInfo;\n }\n }\n\n element = utils.parentNode(element);\n }\n\n return {};\n}\n\nfunction prepare (interaction, { action, target, element }) {\n action = action || {};\n\n if (interaction.target && interaction.target.options.styleCursor) {\n interaction.target._doc.documentElement.style.cursor = '';\n }\n\n interaction.target = target;\n interaction.element = element;\n utils.copyAction(interaction.prepared, action);\n\n if (target && target.options.styleCursor) {\n const cursor = action? actions[action.name].getCursor(action) : '';\n interaction.target._doc.documentElement.style.cursor = cursor;\n }\n\n signals.fire('prepared', { interaction: interaction });\n}\n\nInteraction.signals.on('stop', function ({ interaction }) {\n const target = interaction.target;\n\n if (target && target.options.styleCursor) {\n target._doc.documentElement.style.cursor = '';\n }\n});\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (utils.is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (utils.is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n const buttons = event.buttons || ({\n 0: 1,\n 1: 4,\n 3: 8,\n 4: 16,\n })[event.button];\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\nfunction withinInteractionLimit (interactable, element, action) {\n const options = interactable.options;\n const maxActions = options[action.name].max;\n const maxPerElement = options[action.name].maxPerElement;\n let activeInteractions = 0;\n let targetCount = 0;\n let targetElementCount = 0;\n\n // no actions if any of these values == 0\n if (!(maxActions && maxPerElement && autoStart.maxInteractions)) { return; }\n\n for (let i = 0, len = scope.interactions.length; i < len; i++) {\n const interaction = scope.interactions[i];\n const otherAction = interaction.prepared.name;\n\n if (!interaction.interacting()) { continue; }\n\n activeInteractions++;\n\n if (activeInteractions >= autoStart.maxInteractions) {\n return false;\n }\n\n if (interaction.target !== interactable) { continue; }\n\n targetCount += (otherAction === action.name)|0;\n\n if (targetCount >= maxActions) {\n return false;\n }\n\n if (interaction.element === element) {\n targetElementCount++;\n\n if (otherAction !== action.name || targetElementCount >= maxPerElement) {\n return false;\n }\n }\n }\n\n return autoStart.maxInteractions > 0;\n}\n\n/*\\\n * interact.maxInteractions\n [ method ]\n **\n * Returns or sets the maximum number of concurrent interactions allowed.\n * By default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables\n * and elements, you need to enable it in the draggable, resizable and\n * gesturable `'max'` and `'maxPerElement'` options.\n **\n - newValue (number) #optional Any number. newValue <= 0 means no interactions.\n\\*/\ninteract.maxInteractions = function (newValue) {\n if (utils.is.number(newValue)) {\n autoStart.maxInteractions = newValue;\n\n return this;\n }\n\n return autoStart.maxInteractions;\n};\n\nInteractable.settingsMethods.push('styleCursor');\nInteractable.settingsMethods.push('actionChecker');\nInteractable.settingsMethods.push('ignoreFrom');\nInteractable.settingsMethods.push('allowFrom');\n\ndefaultOptions.base.actionChecker = null;\ndefaultOptions.base.styleCursor = true;\n\nutils.extend(defaultOptions.perAction, autoStart.defaults.perAction);\n\nmodule.exports = autoStart;\n","const autoStart = require('./base');\nconst Interaction = require('../Interaction');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.delayTimer = null;\n});\n\nautoStart.signals.on('prepared', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.delayTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.target, interaction.element);\n }, delay);\n }\n});\n\nInteraction.signals.on('move', function ({ interaction, duplicate }) {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.delayTimer);\n }\n});\n\n// prevent regular down->move autoStart\nautoStart.signals.on('before-start', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.prepared.name = null;\n }\n});\n","const autoStart = require('./base');\nconst scope = require('../scope');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\n\nconst { matchesSelector, parentNode } = require('../utils/domUtils');\n\nautoStart.setActionDefaults(require('../actions/drag'));\n\nautoStart.signals.on('before-start', function ({ interaction, eventTarget, dx, dy }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // check if a drag is in the correct axis\n const absX = Math.abs(dx);\n const absY = Math.abs(dy);\n const options = interaction.target.options.drag;\n const startAxis = options.startAxis;\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy');\n\n interaction.prepared.axis = options.lockAxis === 'start'\n ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n : options.lockAxis;\n\n // if the movement isn't in the startAxis of the interactable\n if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) {\n // cancel the prepared action\n interaction.prepared.name = null;\n\n // then try to get a drag from another ineractable\n\n if (!interaction.prepared.name) {\n\n let element = eventTarget;\n\n const getDraggable = function (interactable, selector, context) {\n const elements = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n if (interactable === interaction.target) { return; }\n\n if (!options.manualStart\n && !interactable.testIgnoreAllow(options, element, eventTarget)\n && matchesSelector(element, selector, elements)) {\n\n const action = interactable.getAction(interaction.downPointer,\n interaction.downEvent,\n interaction,\n element);\n\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, interactable)\n && autoStart.validateAction(action, interactable, element, eventTarget)) {\n\n return interactable;\n }\n }\n };\n\n let action = null;\n\n // check all interactables\n while (is.element(element)) {\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && elementInteractable !== interaction.target\n && !elementInteractable.options.drag.manualStart) {\n\n action = elementInteractable.getAction(interaction.downPointer, interaction.downEvent, interaction, element);\n }\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, elementInteractable)) {\n\n interaction.prepared.name = 'drag';\n interaction.target = elementInteractable;\n interaction.element = element;\n break;\n }\n\n const selectorInteractable = scope.interactables.forEachSelector(getDraggable, element);\n\n if (selectorInteractable) {\n interaction.prepared.name = 'drag';\n interaction.target = selectorInteractable;\n interaction.element = element;\n break;\n }\n\n element = parentNode(element);\n }\n }\n }\n});\n\nfunction checkStartAxis (startAxis, interactable) {\n if (!interactable) { return false; }\n\n const thisAxis = interactable.options.drag.startAxis;\n\n return (startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis);\n}\n","require('./base').setActionDefaults(require('../actions/gesture'));\n","require('./base').setActionDefaults(require('../actions/resize'));\n","module.exports = {\n base: {\n accept : null,\n preventDefault: 'auto',\n deltaSource : 'page',\n },\n\n perAction: {\n origin: { x: 0, y: 0 },\n\n // only allow left button by default\n // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n mouseButtons: 1,\n\n inertia: {\n enabled : false,\n resistance : 10, // the lambda in exponential decay\n minSpeed : 100, // target speed must be above this for inertia to start\n endSpeed : 10, // the speed at which inertia is slow enough to stop\n allowResume : true, // allow resuming an action in inertia phase\n smoothEndDuration: 300, // animate to snap/restrict endOnly if there's no inertia\n },\n },\n};\n","/* browser entry point */\n\n// Legacy browser support\nrequire('./legacyBrowsers');\n\n// inertia\nrequire('./inertia');\n\n// modifiers\nrequire('./modifiers/snap');\nrequire('./modifiers/restrict');\n\n// pointerEvents\nrequire('./pointerEvents/base');\nrequire('./pointerEvents/holdRepeat');\nrequire('./pointerEvents/interactableTargets');\n\n// delay\nrequire('./autoStart/delay');\n\n// actions\nrequire('./actions/gesture');\nrequire('./actions/resize');\nrequire('./actions/drag');\nrequire('./actions/drop');\n\n// load these modifiers after resize is loaded\nrequire('./modifiers/snapSize');\nrequire('./modifiers/restrictEdges');\nrequire('./modifiers/restrictSize');\n\n// autoStart actions\nrequire('./autoStart/gesture');\nrequire('./autoStart/resize');\nrequire('./autoStart/drag');\n\n// Interactable preventDefault setting\nrequire('./interactablePreventDefault.js');\n\n// autoScroll\nrequire('./autoScroll');\n\n// export interact\nmodule.exports = require('./interact');\n","const InteractEvent = require('./InteractEvent');\nconst Interaction = require('./Interaction');\nconst modifiers = require('./modifiers');\nconst utils = require('./utils');\nconst animationFrame = require('./utils/raf');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.inertiaStatus = {\n active : false,\n smoothEnd : false,\n allowResume: false,\n\n startEvent: null,\n upCoords : {},\n\n xe: 0, ye: 0,\n sx: 0, sy: 0,\n\n t0: 0,\n vx0: 0, vys: 0,\n duration: 0,\n\n lambda_v0: 0,\n one_ve_v0: 0,\n i : null,\n };\n\n interaction.boundInertiaFrame = () => inertiaFrame .apply(interaction);\n interaction.boundSmoothEndFrame = () => smoothEndFrame.apply(interaction);\n});\n\nInteraction.signals.on('down', function ({ interaction, event, pointer, eventTarget }) {\n const status = interaction.inertiaStatus;\n\n // Check if the down event hits the current inertia target\n if (status.active) {\n let element = eventTarget;\n\n // climb up the DOM tree from the event target\n while (utils.is.element(element)) {\n\n // if interaction element is the current inertia target element\n if (element === interaction.element) {\n // stop inertia\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n\n // update pointers to the down event's coordinates\n interaction.updatePointer(pointer);\n utils.setCoords(interaction.curCoords, interaction.pointers);\n\n // fire appropriate signals\n const signalArg = { interaction };\n Interaction.signals.fire('before-action-move', signalArg);\n Interaction.signals.fire('action-resume' , signalArg);\n\n // fire a reume event\n const resumeEvent = new InteractEvent(interaction,\n event,\n interaction.prepared.name,\n 'inertiaresume',\n interaction.element);\n\n interaction.target.fire(resumeEvent);\n interaction.prevEvent = resumeEvent;\n modifiers.resetStatuses(interaction.modifierStatuses);\n\n utils.copyCoords(interaction.prevCoords, interaction.curCoords);\n break;\n }\n\n element = utils.parentNode(element);\n }\n }\n});\n\nInteraction.signals.on('up', function ({ interaction, event }) {\n const status = interaction.inertiaStatus;\n\n if (!interaction.interacting() || status.active) { return; }\n\n const target = interaction.target;\n const options = target && target.options;\n const inertiaOptions = options && interaction.prepared.name && options[interaction.prepared.name].inertia;\n\n const now = new Date().getTime();\n const statuses = {};\n const page = utils.extend({}, interaction.curCoords.page);\n const pointerSpeed = interaction.pointerDelta.client.speed;\n\n let smoothEnd = false;\n let modifierResult;\n\n // check if inertia should be started\n const inertiaPossible = (inertiaOptions && inertiaOptions.enabled\n && interaction.prepared.name !== 'gesture'\n && event !== status.startEvent);\n\n const inertia = (inertiaPossible\n && (now - interaction.curCoords.timeStamp) < 50\n && pointerSpeed > inertiaOptions.minSpeed\n && pointerSpeed > inertiaOptions.endSpeed);\n\n const modifierArg = {\n interaction,\n pageCoords: page,\n statuses,\n preEnd: true,\n requireEndOnly: true,\n };\n\n // smoothEnd\n if (inertiaPossible && !inertia) {\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n if (modifierResult.shouldMove && modifierResult.locked) {\n smoothEnd = true;\n }\n }\n\n if (!(inertia || smoothEnd)) { return; }\n\n utils.copyCoords(status.upCoords, interaction.curCoords);\n\n interaction.pointers[0] = status.startEvent =\n new InteractEvent(interaction, event, interaction.prepared.name, 'inertiastart', interaction.element);\n\n status.t0 = now;\n\n status.active = true;\n status.allowResume = inertiaOptions.allowResume;\n interaction.simulation = status;\n\n target.fire(status.startEvent);\n\n if (inertia) {\n status.vx0 = interaction.pointerDelta.client.vx;\n status.vy0 = interaction.pointerDelta.client.vy;\n status.v0 = pointerSpeed;\n\n calcInertia(interaction, status);\n\n utils.extend(page, interaction.curCoords.page);\n\n page.x += status.xe;\n page.y += status.ye;\n\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n status.modifiedXe += modifierResult.dx;\n status.modifiedYe += modifierResult.dy;\n\n status.i = animationFrame.request(interaction.boundInertiaFrame);\n }\n else {\n status.smoothEnd = true;\n status.xe = modifierResult.dx;\n status.ye = modifierResult.dy;\n\n status.sx = status.sy = 0;\n\n status.i = animationFrame.request(interaction.boundSmoothEndFrame);\n }\n});\n\nInteraction.signals.on('stop-active', function ({ interaction }) {\n const status = interaction.inertiaStatus;\n\n if (status.active) {\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n }\n});\n\nfunction calcInertia (interaction, status) {\n const inertiaOptions = interaction.target.options[interaction.prepared.name].inertia;\n const lambda = inertiaOptions.resistance;\n const inertiaDur = -Math.log(inertiaOptions.endSpeed / status.v0) / lambda;\n\n status.x0 = interaction.prevEvent.pageX;\n status.y0 = interaction.prevEvent.pageY;\n status.t0 = status.startEvent.timeStamp / 1000;\n status.sx = status.sy = 0;\n\n status.modifiedXe = status.xe = (status.vx0 - inertiaDur) / lambda;\n status.modifiedYe = status.ye = (status.vy0 - inertiaDur) / lambda;\n status.te = inertiaDur;\n\n status.lambda_v0 = lambda / status.v0;\n status.one_ve_v0 = 1 - inertiaOptions.endSpeed / status.v0;\n}\n\nfunction inertiaFrame () {\n updateInertiaCoords(this);\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n\n const status = this.inertiaStatus;\n const options = this.target.options[this.prepared.name].inertia;\n const lambda = options.resistance;\n const t = new Date().getTime() / 1000 - status.t0;\n\n if (t < status.te) {\n\n const progress = 1 - (Math.exp(-lambda * t) - status.lambda_v0) / status.one_ve_v0;\n\n if (status.modifiedXe === status.xe && status.modifiedYe === status.ye) {\n status.sx = status.xe * progress;\n status.sy = status.ye * progress;\n }\n else {\n const quadPoint = utils.getQuadraticCurvePoint(0, 0,\n status.xe,\n status.ye,\n status.modifiedXe,\n status.modifiedYe,\n progress);\n\n status.sx = quadPoint.x;\n status.sy = quadPoint.y;\n }\n\n this.doMove();\n\n status.i = animationFrame.request(this.boundInertiaFrame);\n }\n else {\n status.sx = status.modifiedXe;\n status.sy = status.modifiedYe;\n\n this.doMove();\n this.end(status.startEvent);\n status.active = false;\n this.simulation = null;\n }\n\n utils.copyCoords(this.prevCoords, this.curCoords);\n}\n\nfunction smoothEndFrame () {\n updateInertiaCoords(this);\n\n const status = this.inertiaStatus;\n const t = new Date().getTime() - status.t0;\n const duration = this.target.options[this.prepared.name].inertia.smoothEndDuration;\n\n if (t < duration) {\n status.sx = utils.easeOutQuad(t, 0, status.xe, duration);\n status.sy = utils.easeOutQuad(t, 0, status.ye, duration);\n\n this.pointerMove(status.startEvent, status.startEvent);\n\n status.i = animationFrame.request(this.boundSmoothEndFrame);\n }\n else {\n status.sx = status.xe;\n status.sy = status.ye;\n\n this.pointerMove(status.startEvent, status.startEvent);\n this.end(status.startEvent);\n\n status.smoothEnd =\n status.active = false;\n this.simulation = null;\n }\n}\n\nfunction updateInertiaCoords (interaction) {\n const status = interaction.inertiaStatus;\n\n // return if inertia isn't running\n if (!status.active) { return; }\n\n const pageUp = status.upCoords.page;\n const clientUp = status.upCoords.client;\n\n utils.setCoords(interaction.curCoords, [ {\n pageX : pageUp.x + status.sx,\n pageY : pageUp.y + status.sy,\n clientX: clientUp.x + status.sx,\n clientY: clientUp.y + status.sy,\n } ]);\n}\n","const browser = require('./utils/browser');\nconst events = require('./utils/events');\nconst utils = require('./utils');\nconst scope = require('./scope');\nconst Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\n\nconst globalEvents = {};\n\n/*\\\n * interact\n [ method ]\n *\n * The methods of this variable can be used to set elements as\n * interactables and also to change various default settings.\n *\n * Calling it as a function and passing an element or a valid CSS selector\n * string returns an Interactable object which has various methods to\n * configure it.\n *\n - element (Element | string) The HTML or SVG Element to interact with or CSS selector\n = (object) An @Interactable\n *\n > Usage\n | interact('#draggable').draggable(true);\n |\n | var rectables = interact('rect');\n | rectables\n | .gesturable(true)\n | .on('gesturemove', function (event) {\n | // ...\n | });\n\\*/\nfunction interact (element, options) {\n let interactable = scope.interactables.get(element, options);\n\n if (!interactable) {\n interactable = new Interactable(element, options);\n interactable.events.global = globalEvents;\n }\n\n return interactable;\n}\n\n/*\\\n * interact.isSet\n [ method ]\n *\n * Check if an element has been set\n - element (Element) The Element being searched for\n = (boolean) Indicates if the element or CSS selector was previously passed to interact\n\\*/\ninteract.isSet = function (element, options) {\n return scope.interactables.indexOfElement(element, options && options.context) !== -1;\n};\n\n/*\\\n * interact.on\n [ method ]\n *\n * Adds a global listener for an InteractEvent or adds a DOM event to\n * `document`\n *\n - type (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) interact\n\\*/\ninteract.on = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.on(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.on(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n // if it is an InteractEvent type, add listener to globalEvents\n if (utils.contains(Interactable.eventTypes, type)) {\n // if this type of event was never bound\n if (!globalEvents[type]) {\n globalEvents[type] = [listener];\n }\n else {\n globalEvents[type].push(listener);\n }\n }\n // If non InteractEvent type, addEventListener to document\n else {\n events.add(scope.document, type, listener, { options });\n }\n\n return interact;\n};\n\n/*\\\n * interact.off\n [ method ]\n *\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n - type (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) interact\n \\*/\ninteract.off = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.off(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.off(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n if (!utils.contains(Interactable.eventTypes, type)) {\n events.remove(scope.document, type, listener, options);\n }\n else {\n let index;\n\n if (type in globalEvents\n && (index = utils.indexOf(globalEvents[type], listener)) !== -1) {\n globalEvents[type].splice(index, 1);\n }\n }\n\n return interact;\n};\n\n/*\\\n * interact.debug\n [ method ]\n *\n * Returns an object which exposes internal data\n = (object) An object with properties that outline the current state and expose internal functions and variables\n\\*/\ninteract.debug = function () {\n return scope;\n};\n\n// expose the functions used to calculate multi-touch properties\ninteract.getPointerAverage = utils.pointerAverage;\ninteract.getTouchBBox = utils.touchBBox;\ninteract.getTouchDistance = utils.touchDistance;\ninteract.getTouchAngle = utils.touchAngle;\n\ninteract.getElementRect = utils.getElementRect;\ninteract.getElementClientRect = utils.getElementClientRect;\ninteract.matchesSelector = utils.matchesSelector;\ninteract.closest = utils.closest;\n\n/*\\\n * interact.supportsTouch\n [ method ]\n *\n = (boolean) Whether or not the browser supports touch input\n\\*/\ninteract.supportsTouch = function () {\n return browser.supportsTouch;\n};\n\n/*\\\n * interact.supportsPointerEvent\n [ method ]\n *\n = (boolean) Whether or not the browser supports PointerEvents\n\\*/\ninteract.supportsPointerEvent = function () {\n return browser.supportsPointerEvent;\n};\n\n/*\\\n * interact.stop\n [ method ]\n *\n * Cancels all interactions (end events are not fired)\n *\n - event (Event) An event on which to call preventDefault()\n = (object) interact\n\\*/\ninteract.stop = function (event) {\n for (let i = scope.interactions.length - 1; i >= 0; i--) {\n scope.interactions[i].stop(event);\n }\n\n return interact;\n};\n\n/*\\\n * interact.pointerMoveTolerance\n [ method ]\n * Returns or sets the distance the pointer must be moved before an action\n * sequence occurs. This also affects tolerance for tap events.\n *\n - newValue (number) #optional The movement from the start position must be greater than this value\n = (number | Interactable) The current setting or interact\n\\*/\ninteract.pointerMoveTolerance = function (newValue) {\n if (utils.is.number(newValue)) {\n Interaction.pointerMoveTolerance = newValue;\n\n return this;\n }\n\n return Interaction.pointerMoveTolerance;\n};\n\ninteract.addDocument = scope.addDocument;\ninteract.removeDocument = scope.removeDocument;\n\nscope.interact = interact;\n\nmodule.exports = interact;\n","const Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\nconst scope = require('./scope');\nconst is = require('./utils/is');\nconst events = require('./utils/events');\n\nconst { nodeContains, matchesSelector } = require('./utils/domUtils');\n\n/*\\\n * Interactable.preventDefault\n [ method ]\n *\n * Returns or sets whether to prevent the browser's default behaviour\n * in response to pointer events. Can be set to:\n * - `'always'` to always prevent\n * - `'never'` to never prevent\n * - `'auto'` to let interact.js try to determine what would be best\n *\n - newValue (string) #optional `true`, `false` or `'auto'`\n = (string | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.preventDefault = function (newValue) {\n if (/^(always|never|auto)$/.test(newValue)) {\n this.options.preventDefault = newValue;\n return this;\n }\n\n if (is.bool(newValue)) {\n this.options.preventDefault = newValue? 'always' : 'never';\n return this;\n }\n\n return this.options.preventDefault;\n};\n\nInteractable.prototype.checkAndPreventDefault = function (event) {\n const setting = this.options.preventDefault;\n\n if (setting === 'never') { return; }\n\n if (setting === 'always') {\n event.preventDefault();\n return;\n }\n\n // setting === 'auto'\n\n // don't preventDefault if the browser supports passiveEvents\n // CSS touch-action and user-selecct should be used instead\n if (events.supportsOptions) {\n return;\n }\n\n // don't preventDefault of pointerdown events\n if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) {\n return;\n }\n\n // don't preventDefault on editable elements\n if (is.element(event.target)\n && matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) {\n return;\n }\n\n event.preventDefault();\n};\n\nfunction onInteractionEvent ({ interaction, event }) {\n if (interaction.target) {\n interaction.target.checkAndPreventDefault(event);\n }\n}\n\nfor (const eventSignal of ['down', 'move', 'up', 'cancel']) {\n Interaction.signals.on(eventSignal, onInteractionEvent);\n}\n\n// prevent native HTML5 drag on interact.js target elements\nInteraction.docEvents.dragstart = function preventNativeDrag (event) {\n for (const interaction of scope.interactions) {\n\n if (interaction.element\n && (interaction.element === event.target\n || nodeContains(interaction.element, event.target))) {\n\n interaction.target.checkAndPreventDefault(event);\n return;\n }\n }\n};\n","const scope = require('./scope');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst iFinder = require('./utils/interactionFinder');\nconst pointerEvents = require('./pointerEvents/base');\n\nconst { window } = require('./utils/window');\n\nconst toString = Object.prototype.toString;\n\nif (!window.Array.isArray) {\n window.Array.isArray = function (obj) {\n return toString.call(obj) === '[object Array]';\n };\n}\n\nif (!String.prototype.trim) {\n String.prototype.trim = function () {\n return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n };\n}\n\n// http://www.quirksmode.org/dom/events/click.html\n// >Events leading to dblclick\n//\n// IE8 doesn't fire down event before dblclick.\n// This workaround tries to fire a tap and doubletap after dblclick\nfunction onIE8Dblclick (event) {\n const eventTarget = event.target;\n const interaction = iFinder.search(event, event.type, eventTarget);\n\n if (!interaction) { return; }\n\n if (interaction.prevTap\n && event.clientX === interaction.prevTap.clientX\n && event.clientY === interaction.prevTap.clientY\n && eventTarget === interaction.prevTap.target) {\n\n interaction.downTargets[0] = eventTarget;\n interaction.downTimes [0] = new Date().getTime();\n\n pointerEvents.fire({\n interaction,\n event,\n eventTarget,\n pointer: event,\n type: 'tap',\n });\n }\n}\n\nif (browser.isIE8) {\n const selectFix = function (event) {\n for (const interaction of scope.interactions) {\n if (interaction.interacting()) {\n interaction.target.checkAndPreventDefault(event);\n }\n }\n };\n\n const onDocIE8 = function onDocIE8 ({ doc, win }, signalName) {\n const eventMethod = signalName.indexOf('listen') === 0\n ? events.add : events.remove;\n\n // For IE's lack of Event#preventDefault\n eventMethod(doc, 'selectstart', selectFix);\n\n if (pointerEvents) {\n eventMethod(doc, 'dblclick', onIE8Dblclick);\n }\n };\n\n scope.signals.on('add-document' , onDocIE8);\n scope.signals.on('remove-document', onDocIE8);\n}\n\nmodule.exports = null;\n","const InteractEvent = require('../InteractEvent');\nconst Interaction = require('../Interaction');\nconst extend = require('../utils/extend');\n\nconst modifiers = {\n names: [],\n\n setOffsets: function (arg) {\n const { interaction, pageCoords: page } = arg;\n const { target, element, startOffset } = interaction;\n const rect = target.getRect(element);\n\n if (rect) {\n startOffset.left = page.x - rect.left;\n startOffset.top = page.y - rect.top;\n\n startOffset.right = rect.right - page.x;\n startOffset.bottom = rect.bottom - page.y;\n\n if (!('width' in rect)) { rect.width = rect.right - rect.left; }\n if (!('height' in rect)) { rect.height = rect.bottom - rect.top ; }\n }\n else {\n startOffset.left = startOffset.top = startOffset.right = startOffset.bottom = 0;\n }\n\n arg.rect = rect;\n arg.interactable = target;\n arg.element = element;\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n\n arg.options = target.options[interaction.prepared.name][modifierName];\n\n if (!arg.options) {\n continue;\n }\n\n interaction.modifierOffsets[modifierName] = modifiers[modifierName].setOffset(arg);\n }\n },\n\n setAll: function (arg) {\n const { interaction, statuses, preEnd, requireEndOnly } = arg;\n const coords = extend({}, arg.pageCoords);\n const result = {\n dx: 0,\n dy: 0,\n changed: false,\n locked: false,\n shouldMove: true,\n };\n\n for (const modifierName of modifiers.names) {\n const modifier = modifiers[modifierName];\n const options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!shouldDo(options, preEnd, requireEndOnly)) { continue; }\n\n arg.status = arg.status = statuses[modifierName];\n arg.options = options;\n arg.offset = arg.interaction.modifierOffsets[modifierName];\n\n modifier.set(arg);\n\n if (arg.status.locked) {\n coords.x += arg.status.dx;\n coords.y += arg.status.dy;\n\n result.dx += arg.status.dx;\n result.dy += arg.status.dy;\n\n result.locked = true;\n }\n }\n\n // a move should be fired if:\n // - there are no modifiers enabled,\n // - no modifiers are \"locked\" i.e. have changed the pointer's coordinates, or\n // - the locked coords have changed since the last pointer move\n result.shouldMove = !arg.status || !result.locked || arg.status.changed;\n\n return result;\n },\n\n resetStatuses: function (statuses) {\n for (const modifierName of modifiers.names) {\n const status = statuses[modifierName] || {};\n\n status.dx = status.dy = 0;\n status.modifiedX = status.modifiedY = NaN;\n status.locked = false;\n status.changed = true;\n\n statuses[modifierName] = status;\n }\n\n return statuses;\n },\n\n start: function ({ interaction }, signalName) {\n const arg = {\n interaction,\n pageCoords: (signalName === 'action-resume' ?\n interaction.curCoords : interaction.startCoords).page,\n startOffset: interaction.startOffset,\n statuses: interaction.modifierStatuses,\n preEnd: false,\n requireEndOnly: false,\n };\n\n modifiers.setOffsets(arg);\n modifiers.resetStatuses(arg.statuses);\n\n arg.pageCoords = extend({}, interaction.startCoords.page);\n interaction.modifierResult = modifiers.setAll(arg);\n },\n};\n\nInteraction.signals.on('new', function (interaction) {\n interaction.startOffset = { left: 0, right: 0, top: 0, bottom: 0 };\n interaction.modifierOffsets = {};\n interaction.modifierStatuses = modifiers.resetStatuses({});\n interaction.modifierResult = null;\n});\n\nInteraction.signals.on('action-start' , modifiers.start);\nInteraction.signals.on('action-resume', modifiers.start);\n\nInteraction.signals.on('before-action-move', function ({ interaction, preEnd, interactingBeforeMove }) {\n const modifierResult = modifiers.setAll({\n interaction,\n preEnd,\n pageCoords: interaction.curCoords.page,\n statuses: interaction.modifierStatuses,\n requireEndOnly: false,\n });\n\n // don't fire an action move if a modifier would keep the event in the same\n // cordinates as before\n if (!modifierResult.shouldMove && interactingBeforeMove) {\n interaction._dontFireMove = true;\n }\n\n interaction.modifierResult = modifierResult;\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n for (let i = 0; i < modifiers.names.length; i++) {\n const options = interaction.target.options[interaction.prepared.name][modifiers.names[i]];\n\n // if the endOnly option is true for any modifier\n if (shouldDo(options, true, true)) {\n // fire a move event at the modified coordinates\n interaction.doMove({ event, preEnd: true });\n break;\n }\n }\n});\n\nInteractEvent.signals.on('set-xy', function (arg) {\n const { iEvent, interaction } = arg;\n const modifierArg = extend({}, arg);\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n modifierArg.options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!modifierArg.options) {\n continue;\n }\n\n const modifier = modifiers[modifierName];\n\n modifierArg.status = interaction.modifierStatuses[modifierName];\n\n iEvent[modifierName] = modifier.modifyCoords(modifierArg);\n }\n});\n\nfunction shouldDo (options, preEnd, requireEndOnly) {\n return (options && options.enabled\n && (preEnd || !options.endOnly)\n && (!requireEndOnly || options.endOnly));\n}\n\nmodule.exports = modifiers;\n","const modifiers = require('./index');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst restrict = {\n defaults: {\n enabled : false,\n endOnly : false,\n restriction: null,\n elementRect: null,\n },\n\n setOffset: function ({ rect, startOffset, options }) {\n const elementRect = options && options.elementRect;\n const offset = {};\n\n if (rect && elementRect) {\n offset.left = startOffset.left - (rect.width * elementRect.left);\n offset.top = startOffset.top - (rect.height * elementRect.top);\n\n offset.right = startOffset.right - (rect.width * (1 - elementRect.right));\n offset.bottom = startOffset.bottom - (rect.height * (1 - elementRect.bottom));\n }\n else {\n offset.left = offset.top = offset.right = offset.bottom = 0;\n }\n\n return offset;\n },\n\n set: function ({ pageCoords, interaction, status, options }) {\n if (!options) { return status; }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n\n const restriction = getRestrictionRect(options.restriction, interaction, page);\n\n if (!restriction) { return status; }\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n const rect = restriction;\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n const offset = interaction.modifierOffsets.restrict;\n\n // object is assumed to have\n // x, y, width, height or\n // left, top, right, bottom\n if ('x' in restriction && 'y' in restriction) {\n modifiedX = Math.max(Math.min(rect.x + rect.width - offset.right , page.x), rect.x + offset.left);\n modifiedY = Math.max(Math.min(rect.y + rect.height - offset.bottom, page.y), rect.y + offset.top );\n }\n else {\n modifiedX = Math.max(Math.min(rect.right - offset.right , page.x), rect.left + offset.left);\n modifiedY = Math.max(Math.min(rect.bottom - offset.bottom, page.y), rect.top + offset.top );\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const elementRect = options && options.elementRect;\n\n if (options && options.enabled\n && !(phase === 'start' && elementRect && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n getRestrictionRect,\n};\n\nfunction getRestrictionRect (value, interaction, page) {\n if (utils.is.function(value)) {\n return utils.resolveRectLike(value, interaction.target, interaction.element, [page.x, page.y, interaction]);\n } else {\n return utils.resolveRectLike(value, interaction.target, interaction.element);\n }\n}\n\nmodifiers.restrict = restrict;\nmodifiers.names.push('restrict');\n\ndefaultOptions.perAction.restrict = restrict.defaults;\n\nmodule.exports = restrict;\n","// This module adds the options.resize.restrictEdges setting which sets min and\n// max for the top, left, bottom and right edges of the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictEdges: {\n// inner: { top: 200, left: 200, right: 400, bottom: 400 },\n// outer: { top: 0, left: 0, right: 600, bottom: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst { getRestrictionRect } = require('./restrict');\n\nconst noInner = { top: +Infinity, left: +Infinity, bottom: -Infinity, right: -Infinity };\nconst noOuter = { top: -Infinity, left: -Infinity, bottom: +Infinity, right: +Infinity };\n\nconst restrictEdges = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n offset: null,\n },\n\n setOffset: function ({ interaction, startOffset, options }) {\n if (!options) {\n return utils.extend({}, startOffset);\n }\n\n const offset = getRestrictionRect(options.offset, interaction, interaction.startCoords.page);\n\n if (offset) {\n return {\n top: startOffset.top + offset.y,\n left: startOffset.left + offset.x,\n bottom: startOffset.bottom + offset.y,\n right: startOffset.right + offset.x,\n };\n }\n\n return startOffset;\n },\n\n set: function ({ pageCoords, interaction, status, offset, options }) {\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n const inner = rectUtils.xywhToTlbr(getRestrictionRect(options.inner, interaction, page)) || noInner;\n const outer = rectUtils.xywhToTlbr(getRestrictionRect(options.outer, interaction, page)) || noOuter;\n\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n if (edges.top) {\n modifiedY = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top);\n }\n else if (edges.bottom) {\n modifiedY = Math.max(Math.min(outer.bottom - offset.bottom, page.y), inner.bottom - offset.bottom);\n }\n if (edges.left) {\n modifiedX = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left);\n }\n else if (edges.right) {\n modifiedX = Math.max(Math.min(outer.right - offset.right, page.x), inner.right - offset.right);\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n if (options && options.enabled\n && !(phase === 'start' && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n noInner,\n noOuter,\n getRestrictionRect,\n};\n\nmodifiers.restrictEdges = restrictEdges;\nmodifiers.names.push('restrictEdges');\n\ndefaultOptions.perAction.restrictEdges = restrictEdges.defaults;\nresize.defaults.restrictEdges = restrictEdges.defaults;\n\nmodule.exports = restrictEdges;\n","// This module adds the options.resize.restrictSize setting which sets min and\n// max width and height for the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictSize: {\n// min: { width: -600, height: -600 },\n// max: { width: 600, height: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst restrictEdges = require('./restrictEdges');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst noMin = { width: -Infinity, height: -Infinity };\nconst noMax = { width: +Infinity, height: +Infinity };\n\nconst restrictSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n },\n\n setOffset: function ({ interaction }) {\n return interaction.startOffset;\n },\n\n set: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const rect = rectUtils.xywhToTlbr(interaction.resizeRects.inverted);\n\n const minSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.min, interaction)) || noMin;\n const maxSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.max, interaction)) || noMax;\n\n arg.options = {\n enabled: options.enabled,\n endOnly: options.endOnly,\n inner: utils.extend({}, restrictEdges.noInner),\n outer: utils.extend({}, restrictEdges.noOuter),\n };\n\n if (edges.top) {\n arg.options.inner.top = rect.bottom - minSize.height;\n arg.options.outer.top = rect.bottom - maxSize.height;\n }\n else if (edges.bottom) {\n arg.options.inner.bottom = rect.top + minSize.height;\n arg.options.outer.bottom = rect.top + maxSize.height;\n }\n if (edges.left) {\n arg.options.inner.left = rect.right - minSize.width;\n arg.options.outer.left = rect.right - maxSize.width;\n }\n else if (edges.right) {\n arg.options.inner.right = rect.left + minSize.width;\n arg.options.outer.right = rect.left + maxSize.width;\n }\n\n restrictEdges.set(arg);\n },\n\n modifyCoords: restrictEdges.modifyCoords,\n};\n\nmodifiers.restrictSize = restrictSize;\nmodifiers.names.push('restrictSize');\n\ndefaultOptions.perAction.restrictSize = restrictSize.defaults;\nresize.defaults.restrictSize = restrictSize.defaults;\n\nmodule.exports = restrictSize;\n","const modifiers = require('./index');\nconst interact = require('../interact');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst snap = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n\n relativePoints: null,\n },\n\n setOffset: function ({ interaction, interactable, element, rect, startOffset, options }) {\n const offsets = [];\n const optionsOrigin = utils.rectToXY(utils.resolveRectLike(options.origin));\n const origin = optionsOrigin || utils.getOriginXY(interactable, element, interaction.prepared.name);\n options = options || interactable.options[interaction.prepared.name].snap || {};\n\n let snapOffset;\n\n if (options.offset === 'startCoords') {\n snapOffset = {\n x: interaction.startCoords.page.x - origin.x,\n y: interaction.startCoords.page.y - origin.y,\n };\n }\n else {\n const offsetRect = utils.resolveRectLike(options.offset, interactable, element, [interaction]);\n\n snapOffset = utils.rectToXY(offsetRect) || { x: 0, y: 0 };\n }\n\n if (rect && options.relativePoints && options.relativePoints.length) {\n for (const { x: relativeX, y: relativeY } of options.relativePoints) {\n offsets.push({\n x: startOffset.left - (rect.width * relativeX) + snapOffset.x,\n y: startOffset.top - (rect.height * relativeY) + snapOffset.y,\n });\n }\n }\n else {\n offsets.push(snapOffset);\n }\n\n return offsets;\n },\n\n set: function ({ interaction, pageCoords, status, options, offset: offsets }) {\n const targets = [];\n let target;\n let page;\n let i;\n\n if (status.useStatusXY) {\n page = { x: status.x, y: status.y };\n }\n else {\n const origin = utils.getOriginXY(interaction.target, interaction.element, interaction.prepared.name);\n\n page = utils.extend({}, pageCoords);\n\n page.x -= origin.x;\n page.y -= origin.y;\n }\n\n status.realX = page.x;\n status.realY = page.y;\n\n let len = options.targets? options.targets.length : 0;\n\n for (const { x: offsetX, y: offsetY } of offsets) {\n const relativeX = page.x - offsetX;\n const relativeY = page.y - offsetY;\n\n for (const snapTarget of options.targets) {\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n targets.push({\n x: utils.is.number(target.x) ? (target.x + offsetX) : relativeX,\n y: utils.is.number(target.y) ? (target.y + offsetY) : relativeY,\n\n range: utils.is.number(target.range)? target.range: options.range,\n });\n }\n }\n\n const closest = {\n target: null,\n inRange: false,\n distance: 0,\n range: 0,\n dx: 0,\n dy: 0,\n };\n\n for (i = 0, len = targets.length; i < len; i++) {\n target = targets[i];\n\n const range = target.range;\n const dx = target.x - page.x;\n const dy = target.y - page.y;\n const distance = utils.hypot(dx, dy);\n let inRange = distance <= range;\n\n // Infinite targets count as being out of range\n // compared to non infinite ones that are in range\n if (range === Infinity && closest.inRange && closest.range !== Infinity) {\n inRange = false;\n }\n\n if (!closest.target || (inRange\n // is the closest target in range?\n ? (closest.inRange && range !== Infinity\n // the pointer is relatively deeper in this target\n ? distance / range < closest.distance / closest.range\n // this target has Infinite range and the closest doesn't\n : (range === Infinity && closest.range !== Infinity)\n // OR this target is closer that the previous closest\n || distance < closest.distance)\n // The other is not in range and the pointer is closer to this target\n : (!closest.inRange && distance < closest.distance))) {\n\n closest.target = target;\n closest.distance = distance;\n closest.range = range;\n closest.inRange = inRange;\n closest.dx = dx;\n closest.dy = dy;\n\n status.range = range;\n }\n }\n\n let snapChanged;\n\n if (closest.target) {\n snapChanged = (status.modifiedX !== closest.target.x || status.modifiedY !== closest.target.y);\n\n status.modifiedX = closest.target.x;\n status.modifiedY = closest.target.y;\n }\n else {\n snapChanged = true;\n\n status.modifiedX = NaN;\n status.modifiedY = NaN;\n }\n\n status.dx = closest.dx;\n status.dy = closest.dy;\n\n status.changed = (snapChanged || (closest.inRange && !status.locked));\n status.locked = closest.inRange;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const relativePoints = options && options.relativePoints;\n\n if (options && options.enabled\n && !(phase === 'start' && relativePoints && relativePoints.length)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n }\n\n return {\n range : status.range,\n locked : status.locked,\n x : status.modifiedX,\n y : status.modifiedY,\n realX : status.realX,\n realY : status.realY,\n dx : status.dx,\n dy : status.dy,\n };\n }\n },\n};\n\ninteract.createSnapGrid = function (grid) {\n return function (x, y) {\n const limits = grid.limits || {\n left : -Infinity,\n right : Infinity,\n top : -Infinity,\n bottom: Infinity,\n };\n let offsetX = 0;\n let offsetY = 0;\n\n if (utils.is.object(grid.offset)) {\n offsetX = grid.offset.x;\n offsetY = grid.offset.y;\n }\n\n const gridx = Math.round((x - offsetX) / grid.x);\n const gridy = Math.round((y - offsetY) / grid.y);\n\n const newX = Math.max(limits.left, Math.min(limits.right , gridx * grid.x + offsetX));\n const newY = Math.max(limits.top , Math.min(limits.bottom, gridy * grid.y + offsetY));\n\n return {\n x: newX,\n y: newY,\n range: grid.range,\n };\n };\n};\n\nmodifiers.snap = snap;\nmodifiers.names.push('snap');\n\ndefaultOptions.perAction.snap = snap.defaults;\n\nmodule.exports = snap;\n","// This module allows snapping of the size of targets during resize\n// interactions.\n\nconst modifiers = require('./index');\nconst snap = require('./snap');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\nconst utils = require('../utils/');\n\nconst snapSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n },\n\n setOffset: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.edges;\n\n if (!edges) { return; }\n\n arg.options = {\n relativePoints: [{\n x: edges.left? 0 : 1,\n y: edges.top ? 0 : 1,\n }],\n origin: { x: 0, y: 0 },\n offset: 'self',\n range: options.range,\n };\n\n const offsets = snap.setOffset(arg);\n arg.options = options;\n\n return offsets;\n },\n\n set: function (arg) {\n const { interaction, options, offset, pageCoords } = arg;\n const page = utils.extend({}, pageCoords);\n const relativeX = page.x - offset[0].x;\n const relativeY = page.y - offset[0].y;\n\n arg.options = utils.extend({}, options);\n arg.options.targets = [];\n\n for (const snapTarget of options.targets) {\n let target;\n\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n if ('width' in target && 'height' in target) {\n target.x = target.width;\n target.y = target.height;\n }\n\n arg.options.targets.push(target);\n }\n\n snap.set(arg);\n },\n\n modifyCoords: function (arg) {\n const { options } = arg;\n\n arg.options = utils.extend({}, options);\n arg.options.enabled = options.enabled;\n arg.options.relativePoints = [null];\n\n snap.modifyCoords(arg);\n },\n};\n\nmodifiers.snapSize = snapSize;\nmodifiers.names.push('snapSize');\n\ndefaultOptions.perAction.snapSize = snapSize.defaults;\nresize.defaults.snapSize = snapSize.defaults;\n\nmodule.exports = snapSize;\n","const pointerUtils = require('../utils/pointerUtils');\n\nmodule.exports = class PointerEvent {\n constructor (type, pointer, event, eventTarget, interaction) {\n pointerUtils.pointerExtend(this, event);\n\n if (event !== pointer) {\n pointerUtils.pointerExtend(this, pointer);\n }\n\n this.interaction = interaction;\n\n this.timeStamp = new Date().getTime();\n this.originalEvent = event;\n this.type = type;\n this.pointerId = pointerUtils.getPointerId(pointer);\n this.pointerType = pointerUtils.getPointerType(pointer, interaction);\n this.target = eventTarget;\n this.currentTarget = null;\n\n if (type === 'tap') {\n const pointerIndex = interaction.getPointerIndex(pointer);\n this.dt = this.timeStamp - interaction.downTimes[pointerIndex];\n\n const interval = this.timeStamp - interaction.tapTime;\n\n this.double = !!(interaction.prevTap\n && interaction.prevTap.type !== 'doubletap'\n && interaction.prevTap.target === this.target\n && interval < 500);\n }\n else if (type === 'doubletap') {\n this.dt = pointer.timeStamp - interaction.tapTime;\n }\n }\n\n subtractOrigin ({ x: originX, y: originY }) {\n this.pageX -= originX;\n this.pageY -= originY;\n this.clientX -= originX;\n this.clientY -= originY;\n\n return this;\n }\n\n addOrigin ({ x: originX, y: originY }) {\n this.pageX += originX;\n this.pageY += originY;\n this.clientX += originX;\n this.clientY += originY;\n\n return this;\n }\n\n preventDefault () {\n this.originalEvent.preventDefault();\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n};\n","const PointerEvent = require('./PointerEvent');\nconst Interaction = require('../Interaction');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst defaults = require('../defaultOptions');\nconst signals = require('../utils/Signals').new();\nconst { filter } = require('../utils/arr');\n\nconst simpleSignals = [ 'down', 'up', 'cancel' ];\nconst simpleEvents = [ 'down', 'up', 'cancel' ];\n\nconst pointerEvents = {\n PointerEvent,\n fire,\n collectEventTargets,\n signals,\n defaults: {\n holdDuration: 600,\n ignoreFrom : null,\n allowFrom : null,\n origin : { x: 0, y: 0 },\n },\n types: [\n 'down',\n 'move',\n 'up',\n 'cancel',\n 'tap',\n 'doubletap',\n 'hold',\n ],\n};\n\nfunction fire (arg) {\n const {\n interaction, pointer, event, eventTarget,\n type = arg.pointerEvent.type,\n targets = collectEventTargets(arg),\n pointerEvent = new PointerEvent(type, pointer, event, eventTarget, interaction),\n } = arg;\n\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n targets,\n type,\n pointerEvent,\n };\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n\n for (const prop in target.props || {}) {\n pointerEvent[prop] = target.props[prop];\n }\n\n const origin = utils.getOriginXY(target.eventable, target.element);\n\n pointerEvent.subtractOrigin(origin);\n pointerEvent.eventable = target.eventable;\n pointerEvent.currentTarget = target.element;\n\n target.eventable.fire(pointerEvent);\n\n pointerEvent.addOrigin(origin);\n\n if (pointerEvent.immediatePropagationStopped\n || (pointerEvent.propagationStopped\n && (i + 1) < targets.length && targets[i + 1].element !== pointerEvent.currentTarget)) {\n break;\n }\n }\n\n signals.fire('fired', signalArg);\n\n if (type === 'tap') {\n // if pointerEvent should make a double tap, create and fire a doubletap\n // PointerEvent and use that as the prevTap\n const prevTap = pointerEvent.double\n ? fire({\n interaction, pointer, event, eventTarget,\n type: 'doubletap',\n })\n : pointerEvent;\n\n interaction.prevTap = prevTap;\n interaction.tapTime = prevTap.timeStamp;\n }\n\n return pointerEvent;\n}\n\nfunction collectEventTargets ({ interaction, pointer, event, eventTarget, type }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n // do not fire a tap event if the pointer was moved before being lifted\n if (type === 'tap' && (interaction.pointerWasMoved\n // or if the pointerup target is different to the pointerdown target\n || !(interaction.downTargets[pointerIndex] && interaction.downTargets[pointerIndex] === eventTarget))) {\n return [];\n }\n\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n path,\n targets: [],\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (type === 'hold') {\n signalArg.targets = filter(signalArg.targets, target =>\n target.eventable.options.holdDuration === interaction.holdTimers[pointerIndex].duration);\n }\n\n return signalArg.targets;\n}\n\nInteraction.signals.on('update-pointer-down', function ({ interaction, pointerIndex }) {\n interaction.holdTimers[pointerIndex] = { duration: Infinity, timeout: null };\n});\n\nInteraction.signals.on('remove-pointer', function ({ interaction, pointerIndex }) {\n interaction.holdTimers.splice(pointerIndex, 1);\n});\n\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget, duplicateMove }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n if (!duplicateMove && (!interaction.pointerIsDown || interaction.pointerWasMoved)) {\n if (interaction.pointerIsDown) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n\n fire({\n interaction, pointer, event, eventTarget,\n type: 'move',\n });\n }\n});\n\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget, pointerIndex }) {\n // copy event to be used in timeout for IE8\n const eventCopy = browser.isIE8? utils.extend({}, event) : event;\n\n const timer = interaction.holdTimers[pointerIndex];\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'hold',\n targets: [],\n path,\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (!signalArg.targets.length) { return; }\n\n let minDuration = Infinity;\n\n for (let i = 0; i < signalArg.targets.length; i++) {\n const target = signalArg.targets[i];\n const holdDuration = target.eventable.options.holdDuration;\n\n if (holdDuration < minDuration) {\n minDuration = holdDuration;\n }\n }\n\n timer.duration = minDuration;\n timer.timeout = setTimeout(function () {\n fire({\n interaction, eventCopy, eventTarget,\n pointer: browser.isIE8? eventCopy : pointer,\n type: 'hold',\n });\n }, minDuration);\n});\n\nInteraction.signals.on('up', ({ interaction, pointer, event, eventTarget }) => {\n if (!interaction.pointerWasMoved) {\n fire({ interaction, eventTarget, pointer, event, type: 'tap' });\n }\n});\n\n['up', 'cancel'].forEach(function (signalName) {\n Interaction.signals.on(signalName, function ({ interaction, pointerIndex }) {\n if (interaction.holdTimers[pointerIndex]) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n });\n});\n\nfunction createSignalListener (type) {\n return function ({ interaction, pointer, event, eventTarget }) {\n fire({ interaction, eventTarget, pointer, event, type });\n };\n}\n\nfor (let i = 0; i < simpleSignals.length; i++) {\n Interaction.signals.on(simpleSignals[i], createSignalListener(simpleEvents[i]));\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.prevTap = null; // the most recent tap event on this interaction\n interaction.tapTime = 0; // time of the most recent tap event\n interaction.holdTimers = []; // [{ duration, timeout }]\n});\n\ndefaults.pointerEvents = pointerEvents.defaults;\nmodule.exports = pointerEvents;\n","const pointerEvents = require('./base');\nconst Interaction = require('../Interaction');\n\npointerEvents.signals.on('new', onNew);\npointerEvents.signals.on('fired', onFired);\n\nfor (const signal of ['move', 'up', 'cancel', 'endall']) {\n Interaction.signals.on(signal, endHoldRepeat);\n}\n\nfunction onNew ({ pointerEvent }) {\n if (pointerEvent.type !== 'hold') { return; }\n\n pointerEvent.count = (pointerEvent.count || 0) + 1;\n}\n\nfunction onFired ({ interaction, pointerEvent, eventTarget, targets }) {\n if (pointerEvent.type !== 'hold' || !targets.length) { return; }\n\n // get the repeat interval from the first eventable\n const interval = targets[0].eventable.options.holdRepeatInterval;\n\n // don't repeat if the interval is 0 or less\n if (interval <= 0) { return; }\n\n // set a timeout to fire the holdrepeat event\n interaction.holdIntervalHandle = setTimeout(function () {\n pointerEvents.fire({\n interaction,\n eventTarget,\n type: 'hold',\n pointer: pointerEvent,\n event: pointerEvent,\n });\n }, interval);\n}\n\nfunction endHoldRepeat ({ interaction }) {\n // set the interaction's holdStopTime property\n // to stop further holdRepeat events\n if (interaction.holdIntervalHandle) {\n clearInterval(interaction.holdIntervalHandle);\n interaction.holdIntervalHandle = null;\n }\n}\n\n// don't repeat by default\npointerEvents.defaults.holdRepeatInterval = 0;\npointerEvents.types.push('holdrepeat');\n\nmodule.exports = {\n onNew,\n onFired,\n endHoldRepeat,\n};\n","const pointerEvents = require('./base');\nconst Interactable = require('../Interactable');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\nconst scope = require('../scope');\nconst extend = require('../utils/extend');\nconst { merge } = require('../utils/arr');\n\npointerEvents.signals.on('collect-targets', function ({ targets, element, type, eventTarget }) {\n function collectSelectors (interactable, selector, context) {\n const els = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && is.element(element)\n && domUtils.matchesSelector(element, selector, els)\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n const interactable = scope.interactables.get(element);\n\n if (interactable) {\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n scope.interactables.forEachSelector(collectSelectors, element);\n});\n\nInteractable.signals.on('new', function ({ interactable }) {\n interactable.events.getRect = function (element) {\n return interactable.getRect(element);\n };\n});\n\nInteractable.signals.on('set', function ({ interactable, options }) {\n extend(interactable.events.options, pointerEvents.defaults);\n extend(interactable.events.options, options);\n});\n\nmerge(Interactable.eventTypes, pointerEvents.types);\n\nInteractable.prototype.pointerEvents = function (options) {\n extend(this.events.options, options);\n\n return this;\n};\n\nconst __backCompatOption = Interactable.prototype._backCompatOption;\n\nInteractable.prototype._backCompatOption = function (optionName, newValue) {\n const ret = __backCompatOption.call(this, optionName, newValue);\n\n if (ret === this) {\n this.events.options[optionName] = newValue;\n }\n\n return ret;\n};\n\nInteractable.settingsMethods.push('pointerEvents');\n","const utils = require('./utils');\nconst events = require('./utils/events');\nconst signals = require('./utils/Signals').new();\n\nconst scope = {\n signals,\n events,\n utils,\n\n // main document\n document: require('./utils/domObjects').document,\n // all documents being listened to\n documents: [],\n\n addDocument: function (doc, win) {\n // do nothing if document is already known\n if (utils.contains(scope.documents, doc)) { return false; }\n\n win = win || scope.getWindow(doc);\n\n scope.documents.push(doc);\n events.documents.push(doc);\n\n // don't add an unload event for the main document\n // so that the page may be cached in browser history\n if (doc !== scope.document) {\n events.add(win, 'unload', scope.onWindowUnload);\n }\n\n signals.fire('add-document', { doc, win });\n },\n\n removeDocument: function (doc, win) {\n const index = utils.indexOf(scope.documents, doc);\n\n win = win || scope.getWindow(doc);\n\n events.remove(win, 'unload', scope.onWindowUnload);\n\n scope.documents.splice(index, 1);\n events.documents.splice(index, 1);\n\n signals.fire('remove-document', { win, doc });\n },\n\n onWindowUnload: function () {\n scope.removeDocument(this.document, this);\n },\n};\n\nmodule.exports = scope;\n","const { indexOf } = require('./arr');\n\nclass Signals {\n constructor () {\n this.listeners = {\n // signalName: [listeners],\n };\n }\n\n on (name, listener) {\n if (!this.listeners[name]) {\n this.listeners[name] = [listener];\n return;\n }\n\n this.listeners[name].push(listener);\n }\n\n off (name, listener) {\n if (!this.listeners[name]) { return; }\n\n const index = indexOf(this.listeners[name], listener);\n\n if (index !== -1) {\n this.listeners[name].splice(index, 1);\n }\n }\n\n fire (name, arg) {\n const targetListeners = this.listeners[name];\n\n if (!targetListeners) { return; }\n\n for (let i = 0; i < targetListeners.length; i++) {\n if (targetListeners[i](arg, name) === false) {\n return;\n }\n }\n }\n}\n\nSignals.new = function () {\n return new Signals();\n};\n\nmodule.exports = Signals;\n","function indexOf (array, target) {\n for (let i = 0, len = array.length; i < len; i++) {\n if (array[i] === target) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction contains (array, target) {\n return indexOf(array, target) !== -1;\n}\n\nfunction merge (target, source) {\n for (let i = 0; i < source.length; i++) {\n target.push(source[i]);\n }\n\n return target;\n}\n\nfunction filter (array, test) {\n const result = [];\n\n for (let i = 0; i < array.length; i++) {\n if (test(array[i])) {\n result.push(array[i]);\n }\n }\n\n return result;\n}\n\nmodule.exports = {\n indexOf,\n contains,\n merge,\n filter,\n};\n","const { window } = require('./window');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst Element = domObjects.Element;\nconst navigator = window.navigator;\n\nconst browser = {\n // Does the browser support touch input?\n supportsTouch: !!(('ontouchstart' in window) || is.function(window.DocumentTouch)\n && domObjects.document instanceof window.DocumentTouch),\n\n // Does the browser support PointerEvents\n supportsPointerEvent: !!domObjects.PointerEvent,\n\n isIE8: ('attachEvent' in window) && !('addEventListener' in window),\n\n // Opera Mobile must be handled differently\n isOperaMobile: (navigator.appName === 'Opera'\n && browser.supportsTouch\n && navigator.userAgent.match('Presto')),\n\n // scrolling doesn't change the result of getClientRects on iOS 7\n isIOS7: (/iP(hone|od|ad)/.test(navigator.platform)\n && /OS 7[^\\d]/.test(navigator.appVersion)),\n\n isIe9OrOlder: /MSIE (8|9)/.test(navigator.userAgent),\n\n // prefix matchesSelector\n prefixedMatchesSelector: 'matches' in Element.prototype\n ? 'matches': 'webkitMatchesSelector' in Element.prototype\n ? 'webkitMatchesSelector': 'mozMatchesSelector' in Element.prototype\n ? 'mozMatchesSelector': 'oMatchesSelector' in Element.prototype\n ? 'oMatchesSelector': 'msMatchesSelector',\n\n useMatchesSelectorPolyfill: false,\n\n pEventTypes: (domObjects.PointerEvent\n ? (domObjects.PointerEvent === window.MSPointerEvent\n ? {\n up: 'MSPointerUp',\n down: 'MSPointerDown',\n over: 'mouseover',\n out: 'mouseout',\n move: 'MSPointerMove',\n cancel: 'MSPointerCancel',\n }\n : {\n up: 'pointerup',\n down: 'pointerdown',\n over: 'pointerover',\n out: 'pointerout',\n move: 'pointermove',\n cancel: 'pointercancel',\n })\n : null),\n\n // because Webkit and Opera still use 'mousewheel' event type\n wheelEvent: 'onmousewheel' in domObjects.document? 'mousewheel': 'wheel',\n\n};\n\nbrowser.useMatchesSelectorPolyfill = !is.function(Element.prototype[browser.prefixedMatchesSelector]);\n\nmodule.exports = browser;\n","const domObjects = {};\nconst win = require('./window').window;\n\nfunction blank () {}\n\ndomObjects.document = win.document;\ndomObjects.DocumentFragment = win.DocumentFragment || blank;\ndomObjects.SVGElement = win.SVGElement || blank;\ndomObjects.SVGSVGElement = win.SVGSVGElement || blank;\ndomObjects.SVGElementInstance = win.SVGElementInstance || blank;\ndomObjects.Element = win.Element || blank;\ndomObjects.HTMLElement = win.HTMLElement || domObjects.Element;\n\ndomObjects.Event = win.Event;\ndomObjects.Touch = win.Touch || blank;\ndomObjects.PointerEvent = (win.PointerEvent || win.MSPointerEvent);\n\nmodule.exports = domObjects;\n","const win = require('./window');\nconst browser = require('./browser');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst domUtils = {\n nodeContains: function (parent, child) {\n while (child) {\n if (child === parent) {\n return true;\n }\n\n child = child.parentNode;\n }\n\n return false;\n },\n\n closest: function (element, selector) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) { return element; }\n\n element = domUtils.parentNode(element);\n }\n\n return null;\n },\n\n parentNode: function (node) {\n let parent = node.parentNode;\n\n if (is.docFrag(parent)) {\n // skip past #shado-root fragments\n while ((parent = parent.host) && is.docFrag(parent)) {\n continue;\n }\n\n return parent;\n }\n\n return parent;\n },\n\n // taken from http://tanalin.com/en/blog/2012/12/matches-selector-ie8/ and modified\n matchesSelectorPolyfill: browser.useMatchesSelectorPolyfill\n ? function (element, selector, elems) {\n elems = elems || element.parentNode.querySelectorAll(selector);\n\n for (let i = 0, len = elems.length; i < len; i++) {\n if (elems[i] === element) {\n return true;\n }\n }\n\n return false;\n }\n : null,\n\n matchesSelector: function (element, selector, nodeList) {\n if (browser.useMatchesSelectorPolyfill) {\n return domUtils.matchesSelectorPolyfill(element, selector, nodeList);\n }\n\n // remove /deep/ from selectors if shadowDOM polyfill is used\n if (win.window !== win.realWindow) {\n selector = selector.replace(/\\/deep\\//g, ' ');\n }\n\n return element[browser.prefixedMatchesSelector](selector);\n },\n\n // Test for the element that's \"above\" all other qualifiers\n indexOfDeepestElement: function (elements) {\n let deepestZoneParents = [];\n let dropzoneParents = [];\n let dropzone;\n let deepestZone = elements[0];\n let index = deepestZone? 0: -1;\n let parent;\n let child;\n let i;\n let n;\n\n for (i = 1; i < elements.length; i++) {\n dropzone = elements[i];\n\n // an element might belong to multiple selector dropzones\n if (!dropzone || dropzone === deepestZone) {\n continue;\n }\n\n if (!deepestZone) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n // check if the deepest or current are document.documentElement or document.rootElement\n // - if the current dropzone is, do nothing and continue\n if (dropzone.parentNode === dropzone.ownerDocument) {\n continue;\n }\n // - if deepest is, update with the current dropzone and continue to next\n else if (deepestZone.parentNode === dropzone.ownerDocument) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n if (!deepestZoneParents.length) {\n parent = deepestZone;\n while (parent.parentNode && parent.parentNode !== parent.ownerDocument) {\n deepestZoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n }\n\n // if this element is an svg element and the current deepest is\n // an HTMLElement\n if (deepestZone instanceof domObjects.HTMLElement\n && dropzone instanceof domObjects.SVGElement\n && !(dropzone instanceof domObjects.SVGSVGElement)) {\n\n if (dropzone === deepestZone.parentNode) {\n continue;\n }\n\n parent = dropzone.ownerSVGElement;\n }\n else {\n parent = dropzone;\n }\n\n dropzoneParents = [];\n\n while (parent.parentNode !== parent.ownerDocument) {\n dropzoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n\n n = 0;\n\n // get (position of last common ancestor) + 1\n while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) {\n n++;\n }\n\n const parents = [\n dropzoneParents[n - 1],\n dropzoneParents[n],\n deepestZoneParents[n],\n ];\n\n child = parents[0].lastChild;\n\n while (child) {\n if (child === parents[1]) {\n deepestZone = dropzone;\n index = i;\n deepestZoneParents = [];\n\n break;\n }\n else if (child === parents[2]) {\n break;\n }\n\n child = child.previousSibling;\n }\n }\n\n return index;\n },\n\n matchesUpTo: function (element, selector, limit) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) {\n return true;\n }\n\n element = domUtils.parentNode(element);\n\n if (element === limit) {\n return domUtils.matchesSelector(element, selector);\n }\n }\n\n return false;\n },\n\n getActualElement: function (element) {\n return (element instanceof domObjects.SVGElementInstance\n ? element.correspondingUseElement\n : element);\n },\n\n getScrollXY: function (relevantWindow) {\n relevantWindow = relevantWindow || win.window;\n return {\n x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft,\n y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop,\n };\n },\n\n getElementClientRect: function (element) {\n const clientRect = (element instanceof domObjects.SVGElement\n ? element.getBoundingClientRect()\n : element.getClientRects()[0]);\n\n return clientRect && {\n left : clientRect.left,\n right : clientRect.right,\n top : clientRect.top,\n bottom: clientRect.bottom,\n width : clientRect.width || clientRect.right - clientRect.left,\n height: clientRect.height || clientRect.bottom - clientRect.top,\n };\n },\n\n getElementRect: function (element) {\n const clientRect = domUtils.getElementClientRect(element);\n\n if (!browser.isIOS7 && clientRect) {\n const scroll = domUtils.getScrollXY(win.getWindow(element));\n\n clientRect.left += scroll.x;\n clientRect.right += scroll.x;\n clientRect.top += scroll.y;\n clientRect.bottom += scroll.y;\n }\n\n return clientRect;\n },\n\n getPath: function (element) {\n const path = [];\n\n while (element) {\n path.push(element);\n element = domUtils.parentNode(element);\n }\n\n return path;\n },\n\n trySelector: value => {\n if (!is.string(value)) { return false; }\n\n // an exception will be raised if it is invalid\n domObjects.document.querySelector(value);\n return true;\n },\n};\n\nmodule.exports = domUtils;\n","const is = require('./is');\nconst domUtils = require('./domUtils');\nconst pExtend = require('./pointerExtend');\n\nconst { window, getWindow } = require('./window');\nconst { indexOf, contains } = require('./arr');\n\nconst useAttachEvent = ('attachEvent' in window) && !('addEventListener' in window);\nconst addEvent = useAttachEvent? 'attachEvent': 'addEventListener';\nconst removeEvent = useAttachEvent? 'detachEvent': 'removeEventListener';\nconst on = useAttachEvent? 'on': '';\n\nconst elements = [];\nconst targets = [];\nconst attachedListeners = [];\n\n// {\n// type: {\n// selectors: ['selector', ...],\n// contexts : [document, ...],\n// listeners: [[listener, capture, passive], ...]\n// }\n// }\nconst delegatedEvents = {};\n\nconst documents = [];\n\nconst supportsOptions = !useAttachEvent && (() => {\n let supported = false;\n\n window.document.createElement('div').addEventListener('test', null, {\n get capture () { supported = true; },\n });\n\n return supported;\n})();\n\nfunction add (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n let elementIndex = indexOf(elements, element);\n let target = targets[elementIndex];\n\n if (!target) {\n target = {\n events: {},\n typeCount: 0,\n };\n\n elementIndex = elements.push(element) - 1;\n targets.push(target);\n\n attachedListeners.push(useAttachEvent\n ? {\n supplied: [],\n wrapped : [],\n useCount: [],\n }\n : null);\n }\n\n if (!target.events[type]) {\n target.events[type] = [];\n target.typeCount++;\n }\n\n if (!contains(target.events[type], listener)) {\n let ret;\n\n if (useAttachEvent) {\n const { supplied, wrapped, useCount } = attachedListeners[elementIndex];\n const listenerIndex = indexOf(supplied, listener);\n\n const wrappedListener = wrapped[listenerIndex] || function (event) {\n if (!event.immediatePropagationStopped) {\n event.target = event.srcElement;\n event.currentTarget = element;\n\n event.preventDefault = event.preventDefault || preventDef;\n event.stopPropagation = event.stopPropagation || stopProp;\n event.stopImmediatePropagation = event.stopImmediatePropagation || stopImmProp;\n\n if (/mouse|click/.test(event.type)) {\n event.pageX = event.clientX + getWindow(element).document.documentElement.scrollLeft;\n event.pageY = event.clientY + getWindow(element).document.documentElement.scrollTop;\n }\n\n listener(event);\n }\n };\n\n ret = element[addEvent](on + type, wrappedListener, !!options.capture);\n\n if (listenerIndex === -1) {\n supplied.push(listener);\n wrapped.push(wrappedListener);\n useCount.push(1);\n }\n else {\n useCount[listenerIndex]++;\n }\n }\n else {\n ret = element[addEvent](type, listener, supportsOptions? options : !!options.capture);\n }\n target.events[type].push(listener);\n\n return ret;\n }\n}\n\nfunction remove (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const elementIndex = indexOf(elements, element);\n const target = targets[elementIndex];\n\n if (!target || !target.events) {\n return;\n }\n\n let wrappedListener = listener;\n let listeners;\n let listenerIndex;\n\n if (useAttachEvent) {\n listeners = attachedListeners[elementIndex];\n listenerIndex = indexOf(listeners.supplied, listener);\n wrappedListener = listeners.wrapped[listenerIndex];\n }\n\n if (type === 'all') {\n for (type in target.events) {\n if (target.events.hasOwnProperty(type)) {\n remove(element, type, 'all');\n }\n }\n return;\n }\n\n if (target.events[type]) {\n const len = target.events[type].length;\n\n if (listener === 'all') {\n for (let i = 0; i < len; i++) {\n remove(element, type, target.events[type][i], options);\n }\n return;\n }\n else {\n for (let i = 0; i < len; i++) {\n if (target.events[type][i] === listener) {\n element[removeEvent](on + type, wrappedListener, supportsOptions? options : !!options.capture);\n target.events[type].splice(i, 1);\n\n if (useAttachEvent && listeners) {\n listeners.useCount[listenerIndex]--;\n if (listeners.useCount[listenerIndex] === 0) {\n listeners.supplied.splice(listenerIndex, 1);\n listeners.wrapped.splice(listenerIndex, 1);\n listeners.useCount.splice(listenerIndex, 1);\n }\n }\n\n break;\n }\n }\n }\n\n if (target.events[type] && target.events[type].length === 0) {\n target.events[type] = null;\n target.typeCount--;\n }\n }\n\n if (!target.typeCount) {\n targets.splice(elementIndex, 1);\n elements.splice(elementIndex, 1);\n attachedListeners.splice(elementIndex, 1);\n }\n}\n\nfunction addDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n if (!delegatedEvents[type]) {\n delegatedEvents[type] = {\n selectors: [],\n contexts : [],\n listeners: [],\n };\n\n // add delegate listener functions\n for (let i = 0; i < documents.length; i++) {\n add(documents[i], type, delegateListener);\n add(documents[i], type, delegateUseCapture, true);\n }\n }\n\n const delegated = delegatedEvents[type];\n let index;\n\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n break;\n }\n }\n\n if (index === -1) {\n index = delegated.selectors.length;\n\n delegated.selectors.push(selector);\n delegated.contexts .push(context);\n delegated.listeners.push([]);\n }\n\n // keep listener and capture and passive flags\n delegated.listeners[index].push([listener, !!options.capture, options.passive]);\n}\n\nfunction removeDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const delegated = delegatedEvents[type];\n let matchFound = false;\n let index;\n\n if (!delegated) { return; }\n\n // count from last index of delegated to 0\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n // look for matching selector and context Node\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n\n const listeners = delegated.listeners[index];\n\n // each item of the listeners array is an array: [function, capture, passive]\n for (let i = listeners.length - 1; i >= 0; i--) {\n const [fn, capture, passive] = listeners[i];\n\n // check if the listener functions and capture and passive flags match\n if (fn === listener && capture === !!options.capture && passive === options.passive) {\n // remove the listener from the array of listeners\n listeners.splice(i, 1);\n\n // if all listeners for this interactable have been removed\n // remove the interactable from the delegated arrays\n if (!listeners.length) {\n delegated.selectors.splice(index, 1);\n delegated.contexts .splice(index, 1);\n delegated.listeners.splice(index, 1);\n\n // remove delegate function from context\n remove(context, type, delegateListener);\n remove(context, type, delegateUseCapture, true);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegatedEvents[type] = null;\n }\n }\n\n // only remove one listener\n matchFound = true;\n break;\n }\n }\n\n if (matchFound) { break; }\n }\n }\n}\n\n// bound to the interactable context when a DOM event\n// listener is added to a selector interactable\nfunction delegateListener (event, optionalArg) {\n const options = getOptions(optionalArg);\n const fakeEvent = {};\n const delegated = delegatedEvents[event.type];\n const eventTarget = (domUtils.getActualElement(event.path\n ? event.path[0]\n : event.target));\n let element = eventTarget;\n\n // duplicate the event so that currentTarget can be changed\n pExtend(fakeEvent, event);\n\n fakeEvent.originalEvent = event;\n fakeEvent.preventDefault = preventOriginalDefault;\n\n // climb up document tree looking for selector matches\n while (is.element(element)) {\n for (let i = 0; i < delegated.selectors.length; i++) {\n const selector = delegated.selectors[i];\n const context = delegated.contexts[i];\n\n if (domUtils.matchesSelector(element, selector)\n && domUtils.nodeContains(context, eventTarget)\n && domUtils.nodeContains(context, element)) {\n\n const listeners = delegated.listeners[i];\n\n fakeEvent.currentTarget = element;\n\n for (let j = 0; j < listeners.length; j++) {\n const [fn, capture, passive] = listeners[j];\n\n if (capture === !!options.capture && passive === options.passive) {\n fn(fakeEvent);\n }\n }\n }\n }\n\n element = domUtils.parentNode(element);\n }\n}\n\nfunction delegateUseCapture (event) {\n return delegateListener.call(this, event, true);\n}\n\nfunction preventDef () {\n this.returnValue = false;\n}\n\nfunction preventOriginalDefault () {\n this.originalEvent.preventDefault();\n}\n\nfunction stopProp () {\n this.cancelBubble = true;\n}\n\nfunction stopImmProp () {\n this.cancelBubble = true;\n this.immediatePropagationStopped = true;\n}\n\nfunction getOptions (param) {\n return is.object(param)? param : { capture: param };\n}\n\nmodule.exports = {\n add,\n remove,\n\n addDelegate,\n removeDelegate,\n\n delegateListener,\n delegateUseCapture,\n delegatedEvents,\n documents,\n\n useAttachEvent,\n supportsOptions,\n\n _elements: elements,\n _targets: targets,\n _attachedListeners: attachedListeners,\n};\n","module.exports = function extend (dest, source) {\n for (const prop in source) {\n dest[prop] = source[prop];\n }\n return dest;\n};\n","const {\n resolveRectLike,\n rectToXY,\n} = require('./rect');\n\nmodule.exports = function (target, element, action) {\n const actionOptions = target.options[action];\n const actionOrigin = actionOptions && actionOptions.origin;\n const origin = actionOrigin || target.options.origin;\n\n const originRect = resolveRectLike(origin, target, element, [target && element]);\n\n return rectToXY(originRect) || { x: 0, y: 0 };\n};\n","module.exports = (x, y) => Math.sqrt(x * x + y * y);\n","const extend = require('./extend');\nconst win = require('./window');\n\nconst utils = {\n warnOnce: function (method, message) {\n let warned = false;\n\n return function () {\n if (!warned) {\n win.window.console.warn(message);\n warned = true;\n }\n\n return method.apply(this, arguments);\n };\n },\n\n // http://stackoverflow.com/a/5634528/2280888\n _getQBezierValue: function (t, p1, p2, p3) {\n const iT = 1 - t;\n return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3;\n },\n\n getQuadraticCurvePoint: function (startX, startY, cpX, cpY, endX, endY, position) {\n return {\n x: utils._getQBezierValue(position, startX, cpX, endX),\n y: utils._getQBezierValue(position, startY, cpY, endY),\n };\n },\n\n // http://gizma.com/easing/\n easeOutQuad: function (t, b, c, d) {\n t /= d;\n return -c * t*(t-2) + b;\n },\n\n copyAction: function (dest, src) {\n dest.name = src.name;\n dest.axis = src.axis;\n dest.edges = src.edges;\n\n return dest;\n },\n\n is : require('./is'),\n extend : extend,\n hypot : require('./hypot'),\n getOriginXY: require('./getOriginXY'),\n};\n\nextend(utils, require('./arr'));\nextend(utils, require('./domUtils'));\nextend(utils, require('./pointerUtils'));\nextend(utils, require('./rect'));\n\nmodule.exports = utils;\n","const scope = require('../scope');\nconst utils = require('./index');\nconst browser = require('./browser');\n\nconst finder = {\n methodOrder: [ 'simulationResume', 'mouse', 'hasPointer', 'idle' ],\n\n search: function (pointer, eventType, eventTarget) {\n const mouseEvent = (/mouse/i.test(pointer.pointerType || eventType)\n // MSPointerEvent.MSPOINTER_TYPE_MOUSE\n || pointer.pointerType === 4);\n const pointerId = utils.getPointerId(pointer);\n const details = { pointer, pointerId, mouseEvent, eventType, eventTarget };\n\n for (const method of finder.methodOrder) {\n const interaction = finder[method](details);\n\n if (interaction) {\n return interaction;\n }\n }\n },\n\n // try to resume simulation with a new pointer\n simulationResume: function ({ mouseEvent, eventType, eventTarget }) {\n if (!/down|start/i.test(eventType)) {\n return null;\n }\n\n for (const interaction of scope.interactions) {\n let element = eventTarget;\n\n if (interaction.simulation && interaction.simulation.allowResume\n && (interaction.mouse === mouseEvent)) {\n while (element) {\n // if the element is the interaction element\n if (element === interaction.element) {\n return interaction;\n }\n element = utils.parentNode(element);\n }\n }\n }\n\n return null;\n },\n\n // if it's a mouse interaction\n mouse: function ({ pointerId, mouseEvent, eventType }) {\n if (!mouseEvent && (browser.supportsTouch || browser.supportsPointerEvent)) {\n return null;\n }\n\n let firstNonActive;\n\n for (const interaction of scope.interactions) {\n if (interaction.mouse) {\n // if it's a down event, skip interactions with running simulations\n if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; }\n\n // if the interaction is active, return it immediately\n if (interaction.interacting()) {\n return interaction;\n }\n // otherwise save it and look for another active interaction\n else if (!firstNonActive) {\n firstNonActive = interaction;\n }\n }\n }\n\n // if no active mouse interaction was found use the first inactive mouse\n // interaction\n if (firstNonActive) {\n return firstNonActive;\n }\n\n // Find any interaction specifically for mouse.\n // ignore the interaction if the eventType is a mousedown, and a simulation\n // is active\n for (const interaction of scope.interactions) {\n if (interaction.mouse && !(/down/.test(eventType) && interaction.simulation)) {\n return interaction;\n }\n }\n\n return null;\n },\n\n // get interaction that has this pointer\n hasPointer: function ({ pointerId }) {\n for (const interaction of scope.interactions) {\n if (utils.contains(interaction.pointerIds, pointerId)) {\n return interaction;\n }\n }\n },\n\n // get first idle interaction\n idle: function ({ mouseEvent }) {\n for (const interaction of scope.interactions) {\n // if there's already a pointer held down\n if (interaction.pointerIds.length === 1) {\n const target = interaction.target;\n // don't add this pointer if there is a target interactable and it\n // isn't gesturable\n if (target && !target.options.gesture.enabled) {\n continue;\n }\n }\n // maximum of 2 pointers per interaction\n else if (interaction.pointerIds.length >= 2) {\n continue;\n }\n\n if (!interaction.interacting() && (mouseEvent === interaction.mouse)) {\n return interaction;\n }\n }\n\n return null;\n },\n};\n\nmodule.exports = finder;\n","const win = require('./window');\nconst isWindow = require('./isWindow');\n\nconst is = {\n array : () => {},\n\n window : thing => thing === win.window || isWindow(thing),\n\n docFrag : thing => is.object(thing) && thing.nodeType === 11,\n\n object : thing => !!thing && (typeof thing === 'object'),\n\n function: thing => typeof thing === 'function',\n\n number : thing => typeof thing === 'number' ,\n\n bool : thing => typeof thing === 'boolean' ,\n\n string : thing => typeof thing === 'string' ,\n\n element: thing => {\n if (!thing || (typeof thing !== 'object')) { return false; }\n\n const _window = win.getWindow(thing) || win.window;\n\n return (/object|function/.test(typeof _window.Element)\n ? thing instanceof _window.Element //DOM2\n : thing.nodeType === 1 && typeof thing.nodeName === 'string');\n },\n};\n\nis.array = thing => (is.object(thing)\n && (typeof thing.length !== 'undefined')\n && is.function(thing.splice));\n\nmodule.exports = is;\n","module.exports = (thing) => !!(thing && thing.Window) && (thing instanceof thing.Window);\n","function pointerExtend (dest, source) {\n for (const prop in source) {\n const prefixedPropREs = module.exports.prefixedPropREs;\n let deprecated = false;\n\n // skip deprecated prefixed properties\n for (const vendor in prefixedPropREs) {\n if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) {\n deprecated = true;\n break;\n }\n }\n\n if (!deprecated && typeof source[prop] !== 'function') {\n dest[prop] = source[prop];\n }\n }\n return dest;\n}\n\npointerExtend.prefixedPropREs = {\n webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/,\n};\n\nmodule.exports = pointerExtend;\n","const hypot = require('./hypot');\nconst browser = require('./browser');\nconst dom = require('./domObjects');\nconst domUtils = require('./domUtils');\nconst is = require('./is');\nconst pointerExtend = require('./pointerExtend');\n\nconst pointerUtils = {\n copyCoords: function (dest, src) {\n dest.page = dest.page || {};\n dest.page.x = src.page.x;\n dest.page.y = src.page.y;\n\n dest.client = dest.client || {};\n dest.client.x = src.client.x;\n dest.client.y = src.client.y;\n\n dest.timeStamp = src.timeStamp;\n },\n\n setCoordDeltas: function (targetObj, prev, cur) {\n targetObj.page.x = cur.page.x - prev.page.x;\n targetObj.page.y = cur.page.y - prev.page.y;\n targetObj.client.x = cur.client.x - prev.client.x;\n targetObj.client.y = cur.client.y - prev.client.y;\n targetObj.timeStamp = cur.timeStamp - prev.timeStamp;\n\n // set pointer velocity\n const dt = Math.max(targetObj.timeStamp / 1000, 0.001);\n\n targetObj.page.speed = hypot(targetObj.page.x, targetObj.page.y) / dt;\n targetObj.page.vx = targetObj.page.x / dt;\n targetObj.page.vy = targetObj.page.y / dt;\n\n targetObj.client.speed = hypot(targetObj.client.x, targetObj.page.y) / dt;\n targetObj.client.vx = targetObj.client.x / dt;\n targetObj.client.vy = targetObj.client.y / dt;\n },\n\n isNativePointer: function (pointer) {\n return (pointer instanceof dom.Event || pointer instanceof dom.Touch);\n },\n\n // Get specified X/Y coords for mouse or event.touches[0]\n getXY: function (type, pointer, xy) {\n xy = xy || {};\n type = type || 'page';\n\n xy.x = pointer[type + 'X'];\n xy.y = pointer[type + 'Y'];\n\n return xy;\n },\n\n getPageXY: function (pointer, page) {\n page = page || {};\n\n // Opera Mobile handles the viewport and scrolling oddly\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n pointerUtils.getXY('screen', pointer, page);\n\n page.x += window.scrollX;\n page.y += window.scrollY;\n }\n else {\n pointerUtils.getXY('page', pointer, page);\n }\n\n return page;\n },\n\n getClientXY: function (pointer, client) {\n client = client || {};\n\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n // Opera Mobile handles the viewport and scrolling oddly\n pointerUtils.getXY('screen', pointer, client);\n }\n else {\n pointerUtils.getXY('client', pointer, client);\n }\n\n return client;\n },\n\n getPointerId: function (pointer) {\n return is.number(pointer.pointerId)? pointer.pointerId : pointer.identifier;\n },\n\n setCoords: function (targetObj, pointers, timeStamp) {\n const pointer = (pointers.length > 1\n ? pointerUtils.pointerAverage(pointers)\n : pointers[0]);\n\n const tmpXY = {};\n\n pointerUtils.getPageXY(pointer, tmpXY);\n targetObj.page.x = tmpXY.x;\n targetObj.page.y = tmpXY.y;\n\n pointerUtils.getClientXY(pointer, tmpXY);\n targetObj.client.x = tmpXY.x;\n targetObj.client.y = tmpXY.y;\n\n targetObj.timeStamp = is.number(timeStamp) ? timeStamp :new Date().getTime();\n },\n\n pointerExtend: pointerExtend,\n\n getTouchPair: function (event) {\n const touches = [];\n\n // array of touches is supplied\n if (is.array(event)) {\n touches[0] = event[0];\n touches[1] = event[1];\n }\n // an event\n else {\n if (event.type === 'touchend') {\n if (event.touches.length === 1) {\n touches[0] = event.touches[0];\n touches[1] = event.changedTouches[0];\n }\n else if (event.touches.length === 0) {\n touches[0] = event.changedTouches[0];\n touches[1] = event.changedTouches[1];\n }\n }\n else {\n touches[0] = event.touches[0];\n touches[1] = event.touches[1];\n }\n }\n\n return touches;\n },\n\n pointerAverage: function (pointers) {\n const average = {\n pageX : 0,\n pageY : 0,\n clientX: 0,\n clientY: 0,\n screenX: 0,\n screenY: 0,\n };\n\n for (const pointer of pointers) {\n for (const prop in average) {\n average[prop] += pointer[prop];\n }\n }\n for (const prop in average) {\n average[prop] /= pointers.length;\n }\n\n return average;\n },\n\n touchBBox: function (event) {\n if (!event.length && !(event.touches && event.touches.length > 1)) {\n return;\n }\n\n const touches = pointerUtils.getTouchPair(event);\n const minX = Math.min(touches[0].pageX, touches[1].pageX);\n const minY = Math.min(touches[0].pageY, touches[1].pageY);\n const maxX = Math.max(touches[0].pageX, touches[1].pageX);\n const maxY = Math.max(touches[0].pageY, touches[1].pageY);\n\n return {\n x: minX,\n y: minY,\n left: minX,\n top: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n },\n\n touchDistance: function (event, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n\n\n const dx = touches[0][sourceX] - touches[1][sourceX];\n const dy = touches[0][sourceY] - touches[1][sourceY];\n\n return hypot(dx, dy);\n },\n\n touchAngle: function (event, prevAngle, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n const dx = touches[1][sourceX] - touches[0][sourceX];\n const dy = touches[1][sourceY] - touches[0][sourceY];\n const angle = 180 * Math.atan2(dy , dx) / Math.PI;\n\n return angle;\n },\n\n getPointerType: function (pointer, interaction) {\n // if the PointerEvent API isn't available, then the pointer must be ither\n // a MouseEvent or TouchEvent\n if (interaction.mouse) { return 'mouse'; }\n if (!browser.supportsPointerEvent) { return 'touch'; }\n\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : [undefined, undefined,'touch', 'pen', 'mouse'][pointer.pointerType];\n },\n\n // [ event.target, event.currentTarget ]\n getEventTargets: function (event) {\n return [\n domUtils.getActualElement(event.path ? event.path[0] : event.target),\n domUtils.getActualElement(event.currentTarget),\n ];\n },\n};\n\nmodule.exports = pointerUtils;\n","const { window } = require('./window');\n\nconst vendors = ['ms', 'moz', 'webkit', 'o'];\nlet lastTime = 0;\nlet request;\nlet cancel;\n\nfor (let x = 0; x < vendors.length && !window.requestAnimationFrame; x++) {\n request = window[vendors[x] + 'RequestAnimationFrame'];\n cancel = window[vendors[x] +'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n}\n\nif (!request) {\n request = function (callback) {\n const currTime = new Date().getTime();\n const timeToCall = Math.max(0, 16 - (currTime - lastTime));\n const id = setTimeout(function () { callback(currTime + timeToCall); },\n timeToCall);\n\n lastTime = currTime + timeToCall;\n return id;\n };\n}\n\nif (!cancel) {\n cancel = function (id) {\n clearTimeout(id);\n };\n}\n\nmodule.exports = {\n request,\n cancel,\n};\n","const extend = require('./extend');\nconst is = require('./is');\nconst {\n closest,\n parentNode,\n getElementRect,\n} = require('./domUtils');\n\nconst rectUtils = {\n getStringOptionResult: function (value, interactable, element) {\n if (!is.string(value)) {\n return null;\n }\n\n if (value === 'parent') {\n value = parentNode(element);\n }\n else if (value === 'self') {\n value = interactable.getRect(element);\n }\n else {\n value = closest(element, value);\n }\n\n return value;\n },\n\n resolveRectLike: function (value, interactable, element, functionArgs) {\n value = rectUtils.getStringOptionResult(value, interactable, element) || value;\n\n if (is.function(value)) {\n value = value.apply(null, functionArgs);\n }\n\n if (is.element(value)) {\n value = getElementRect(value);\n }\n\n return value;\n },\n\n rectToXY: function (rect) {\n return rect && {\n x: 'x' in rect ? rect.x : rect.left,\n y: 'y' in rect ? rect.y : rect.top,\n };\n },\n\n xywhToTlbr: function (rect) {\n if (rect && !('left' in rect && 'top' in rect)) {\n rect = extend({}, rect);\n\n rect.left = rect.x || 0;\n rect.top = rect.y || 0;\n rect.right = rect.right || (rect.left + rect.width);\n rect.bottom = rect.bottom || (rect.top + rect.height);\n }\n\n return rect;\n },\n\n tlbrToXywh: function (rect) {\n if (rect && !('x' in rect && 'y' in rect)) {\n rect = extend({}, rect);\n\n rect.x = rect.left || 0;\n rect.top = rect.top || 0;\n rect.width = rect.width || (rect.right - rect.x);\n rect.height = rect.height || (rect.bottom - rect.y);\n }\n\n return rect;\n },\n};\n\nmodule.exports = rectUtils;\n","const win = module.exports;\nconst isWindow = require('./isWindow');\n\nfunction init (window) {\n // get wrapped window if using Shadow DOM polyfill\n\n win.realWindow = window;\n\n // create a TextNode\n const el = window.document.createTextNode('');\n\n // check if it's wrapped by a polyfill\n if (el.ownerDocument !== window.document\n && typeof window.wrap === 'function'\n && window.wrap(el) === el) {\n // use wrapped window\n window = window.wrap(window);\n }\n\n win.window = window;\n}\n\nif (typeof window === 'undefined') {\n win.window = undefined;\n win.realWindow = undefined;\n}\nelse {\n init(window);\n}\n\nwin.getWindow = function getWindow (node) {\n if (isWindow(node)) {\n return node;\n }\n\n const rootNode = (node.ownerDocument || node);\n\n return rootNode.defaultView || rootNode.parentWindow || win.window;\n};\n\nwin.init = init;\n"]} \ No newline at end of file +{"version":3,"sources":["src/minHeader.js","src/header.js","index.js","src/Eventable.js","src/InteractEvent.js","src/Interactable.js","src/Interaction.js","src/actions/base.js","src/actions/drag.js","src/actions/drop.js","src/actions/gesture.js","src/actions/resize.js","src/autoScroll.js","src/autoStart/InteractableMethods.js","src/autoStart/base.js","src/autoStart/delay.js","src/autoStart/drag.js","src/autoStart/gesture.js","src/autoStart/resize.js","src/defaultOptions.js","src/index.js","src/inertia.js","src/interact.js","src/interactablePreventDefault.js","src/legacyBrowsers.js","src/modifiers/index.js","src/modifiers/restrict.js","src/modifiers/restrictEdges.js","src/modifiers/restrictSize.js","src/modifiers/snap.js","src/modifiers/snapSize.js","src/pointerEvents/PointerEvent.js","src/pointerEvents/base.js","src/pointerEvents/holdRepeat.js","src/pointerEvents/interactableTargets.js","src/scope.js","src/utils/Signals.js","src/utils/arr.js","src/utils/browser.js","src/utils/domObjects.js","src/utils/domUtils.js","src/utils/events.js","src/utils/extend.js","src/utils/getOriginXY.js","src/utils/hypot.js","src/utils/index.js","src/utils/interactionFinder.js","src/utils/is.js","src/utils/isWindow.js","src/utils/pointerExtend.js","src/utils/pointerUtils.js","src/utils/raf.js","src/utils/rect.js","src/utils/window.js"],"names":[],"mappings":"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","file":"interact.min.js","sourceRoot":"","sourcesContent":["/* interact.js v1.3.0-alpha.4+sha.7970416-dirty | https://raw.github.com/taye/interact.js/master/LICENSE */\n","/**\n * interact.js v1.3.0-alpha.4+sha.7970416-dirty\n *\n * Copyright (c) 2012-2017 Taye Adeyemi \n * Open source under the MIT License.\n * https://raw.github.com/taye/interact.js/master/LICENSE\n */\n","/*\n * In a (windowless) server environment this file exports a factory function\n * that takes the window to use.\n *\n * var interact = require('interact.js')(windowObject);\n *\n * See https://github.com/taye/interact.js/issues/187\n */\nif (typeof window === 'undefined') {\n module.exports = function (window) {\n require('./src/utils/window').init(window);\n\n return require('./src/index');\n };\n}\nelse {\n module.exports = require('./src/index');\n}\n","const { indexOf } = require('./utils/arr');\nconst extend = require('./utils/extend.js');\n\nfunction fireUntilImmediateStopped (event, listeners) {\n for (let i = 0, len = listeners.length; i < len && !event.immediatePropagationStopped; i++) {\n listeners[i](event);\n }\n}\n\nclass Eventable {\n\n constructor (options) {\n this.options = extend({}, options || {});\n }\n\n fire (event) {\n let listeners;\n const onEvent = 'on' + event.type;\n const global = this.global;\n\n // Interactable#on() listeners\n if ((listeners = this[event.type])) {\n fireUntilImmediateStopped(event, listeners);\n }\n\n // interactable.onevent listener\n if (this[onEvent]) {\n this[onEvent](event);\n }\n\n // interact.on() listeners\n if (!event.propagationStopped && global && (listeners = global[event.type])) {\n fireUntilImmediateStopped(event, listeners);\n }\n }\n\n on (eventType, listener) {\n // if this type of event was never bound\n if (this[eventType]) {\n this[eventType].push(listener);\n }\n else {\n this[eventType] = [listener];\n }\n }\n\n off (eventType, listener) {\n // if it is an action event type\n const eventList = this[eventType];\n const index = eventList? indexOf(eventList, listener) : -1;\n\n if (index !== -1) {\n eventList.splice(index, 1);\n }\n\n if (eventList && eventList.length === 0 || !listener) {\n this[eventType] = listener;\n }\n }\n}\n\nmodule.exports = Eventable;\n","const extend = require('./utils/extend');\nconst getOriginXY = require('./utils/getOriginXY');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nclass InteractEvent {\n constructor (interaction, event, action, phase, element, related, preEnd = false) {\n const target = interaction.target;\n const deltaSource = (target && target.options || defaults).deltaSource;\n const origin = getOriginXY(target, element, action);\n const starting = phase === 'start';\n const ending = phase === 'end';\n const coords = starting? interaction.startCoords : interaction.curCoords;\n const prevEvent = interaction.prevEvent;\n\n element = element || interaction.element;\n\n const page = extend({}, coords.page);\n const client = extend({}, coords.client);\n\n page.x -= origin.x;\n page.y -= origin.y;\n\n client.x -= origin.x;\n client.y -= origin.y;\n\n this.ctrlKey = event.ctrlKey;\n this.altKey = event.altKey;\n this.shiftKey = event.shiftKey;\n this.metaKey = event.metaKey;\n this.button = event.button;\n this.buttons = event.buttons;\n this.target = element;\n this.currentTarget = element;\n this.relatedTarget = related || null;\n this.preEnd = preEnd;\n this.type = action + (phase || '');\n this.interaction = interaction;\n this.interactable = target;\n\n this.t0 = starting ? interaction.downTimes[interaction.downTimes.length - 1]\n : prevEvent.t0;\n\n const signalArg = {\n interaction,\n event,\n action,\n phase,\n element,\n related,\n page,\n client,\n coords,\n starting,\n ending,\n deltaSource,\n iEvent: this,\n };\n\n signals.fire('set-xy', signalArg);\n\n if (ending) {\n // use previous coords when ending\n this.pageX = prevEvent.pageX;\n this.pageY = prevEvent.pageY;\n this.clientX = prevEvent.clientX;\n this.clientY = prevEvent.clientY;\n }\n else {\n this.pageX = page.x;\n this.pageY = page.y;\n this.clientX = client.x;\n this.clientY = client.y;\n }\n\n this.x0 = interaction.startCoords.page.x - origin.x;\n this.y0 = interaction.startCoords.page.y - origin.y;\n this.clientX0 = interaction.startCoords.client.x - origin.x;\n this.clientY0 = interaction.startCoords.client.y - origin.y;\n\n signals.fire('set-delta', signalArg);\n\n this.timeStamp = coords.timeStamp;\n this.dt = interaction.pointerDelta.timeStamp;\n this.duration = this.timeStamp - this.t0;\n\n // speed and velocity in pixels per second\n this.speed = interaction.pointerDelta[deltaSource].speed;\n this.velocityX = interaction.pointerDelta[deltaSource].vx;\n this.velocityY = interaction.pointerDelta[deltaSource].vy;\n\n this.swipe = (ending || phase === 'inertiastart')? this.getSwipe() : null;\n\n signals.fire('new', signalArg);\n }\n\n getSwipe () {\n const interaction = this.interaction;\n\n if (interaction.prevEvent.speed < 600\n || this.timeStamp - interaction.prevEvent.timeStamp > 150) {\n return null;\n }\n\n let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI;\n const overlap = 22.5;\n\n if (angle < 0) {\n angle += 360;\n }\n\n const left = 135 - overlap <= angle && angle < 225 + overlap;\n const up = 225 - overlap <= angle && angle < 315 + overlap;\n\n const right = !left && (315 - overlap <= angle || angle < 45 + overlap);\n const down = !up && 45 - overlap <= angle && angle < 135 + overlap;\n\n return {\n up,\n down,\n left,\n right,\n angle,\n speed: interaction.prevEvent.speed,\n velocity: {\n x: interaction.prevEvent.velocityX,\n y: interaction.prevEvent.velocityY,\n },\n };\n }\n\n preventDefault () {}\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n}\n\nsignals.on('set-delta', function ({ iEvent, interaction, starting, deltaSource }) {\n const prevEvent = starting? iEvent : interaction.prevEvent;\n\n if (deltaSource === 'client') {\n iEvent.dx = iEvent.clientX - prevEvent.clientX;\n iEvent.dy = iEvent.clientY - prevEvent.clientY;\n }\n else {\n iEvent.dx = iEvent.pageX - prevEvent.pageX;\n iEvent.dy = iEvent.pageY - prevEvent.pageY;\n }\n});\n\nInteractEvent.signals = signals;\n\nmodule.exports = InteractEvent;\n","const is = require('./utils/is');\nconst events = require('./utils/events');\nconst extend = require('./utils/extend');\nconst actions = require('./actions/base');\nconst scope = require('./scope');\nconst Eventable = require('./Eventable');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nconst {\n getElementRect,\n nodeContains,\n trySelector,\n} = require('./utils/domUtils');\nconst { getWindow } = require('./utils/window');\nconst { indexOf, contains } = require('./utils/arr');\nconst { wheelEvent } = require('./utils/browser');\n\n// all set interactables\nscope.interactables = [];\n\n/*\\\n * Interactable\n [ property ]\n **\n * Object type returned by @interact\n\\*/\nclass Interactable {\n constructor (target, options) {\n options = options || {};\n\n this.target = target;\n this.events = new Eventable();\n this._context = options.context || scope.document;\n this._win = getWindow(trySelector(target)? this._context : target);\n this._doc = this._win.document;\n\n signals.fire('new', {\n target,\n options,\n interactable: this,\n win: this._win,\n });\n\n scope.addDocument( this._doc, this._win );\n\n scope.interactables.push(this);\n\n this.set(options);\n }\n\n setOnEvents (action, phases) {\n const onAction = 'on' + action;\n\n if (is.function(phases.onstart) ) { this.events[onAction + 'start' ] = phases.onstart ; }\n if (is.function(phases.onmove) ) { this.events[onAction + 'move' ] = phases.onmove ; }\n if (is.function(phases.onend) ) { this.events[onAction + 'end' ] = phases.onend ; }\n if (is.function(phases.oninertiastart)) { this.events[onAction + 'inertiastart' ] = phases.oninertiastart ; }\n\n return this;\n }\n\n setPerAction (action, options) {\n // for all the default per-action options\n for (const option in options) {\n // if this option exists for this action\n if (option in defaults[action]) {\n // if the option in the options arg is an object value\n if (is.object(options[option])) {\n // duplicate the object\n this.options[action][option] = extend(this.options[action][option] || {}, options[option]);\n\n if (is.object(defaults.perAction[option]) && 'enabled' in defaults.perAction[option]) {\n this.options[action][option].enabled = options[option].enabled === false? false : true;\n }\n }\n else if (is.bool(options[option]) && is.object(defaults.perAction[option])) {\n this.options[action][option].enabled = options[option];\n }\n else if (options[option] !== undefined) {\n // or if it's not undefined, do a plain assignment\n this.options[action][option] = options[option];\n }\n }\n }\n }\n\n /*\\\n * Interactable.getRect\n [ method ]\n *\n * The default function to get an Interactables bounding rect. Can be\n * overridden using @Interactable.rectChecker.\n *\n - element (Element) #optional The element to measure.\n = (object) The object's bounding rectangle.\n o {\n o top : 0,\n o left : 0,\n o bottom: 0,\n o right : 0,\n o width : 0,\n o height: 0\n o }\n \\*/\n getRect (element) {\n element = element || this.target;\n\n if (is.string(this.target) && !(is.element(element))) {\n element = this._context.querySelector(this.target);\n }\n\n return getElementRect(element);\n }\n\n /*\\\n * Interactable.rectChecker\n [ method ]\n *\n * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n - checker (function) #optional A function which returns this Interactable's bounding rectangle. See @Interactable.getRect\n = (function | object) The checker function or this Interactable\n \\*/\n rectChecker (checker) {\n if (is.function(checker)) {\n this.getRect = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.getRect;\n\n return this;\n }\n\n return this.getRect;\n }\n\n _backCompatOption (optionName, newValue) {\n if (trySelector(newValue) || is.object(newValue)) {\n this.options[optionName] = newValue;\n\n for (const action of actions.names) {\n this.options[action][optionName] = newValue;\n }\n\n return this;\n }\n\n return this.options[optionName];\n }\n\n /*\\\n * Interactable.origin\n [ method ]\n *\n * Gets or sets the origin of the Interactable's element. The x and y\n * of the origin will be subtracted from action event coordinates.\n *\n - origin (object | string) #optional An object eg. { x: 0, y: 0 } or string 'parent', 'self' or any CSS selector\n * OR\n - origin (Element) #optional An HTML or SVG Element whose rect will be used\n **\n = (object) The current origin or this Interactable\n \\*/\n origin (newValue) {\n return this._backCompatOption('origin', newValue);\n }\n\n /*\\\n * Interactable.deltaSource\n [ method ]\n *\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n - newValue (string) #optional Use 'client' if you will be scrolling while interacting; Use 'page' if you want autoScroll to work\n = (string | object) The current deltaSource or this Interactable\n \\*/\n deltaSource (newValue) {\n if (newValue === 'page' || newValue === 'client') {\n this.options.deltaSource = newValue;\n\n return this;\n }\n\n return this.options.deltaSource;\n }\n\n /*\\\n * Interactable.context\n [ method ]\n *\n * Gets the selector context Node of the Interactable. The default is `window.document`.\n *\n = (Node) The context Node of this Interactable\n **\n \\*/\n context () {\n return this._context;\n }\n\n inContext (element) {\n return (this._context === element.ownerDocument\n || nodeContains(this._context, element));\n }\n\n /*\\\n * Interactable.fire\n [ method ]\n *\n * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n - iEvent (InteractEvent) The InteractEvent object to be fired on this Interactable\n = (Interactable) this Interactable\n \\*/\n fire (iEvent) {\n this.events.fire(iEvent);\n\n return this;\n }\n\n _onOffMultiple (method, eventType, listener, options) {\n if (is.string(eventType) && eventType.search(' ') !== -1) {\n eventType = eventType.trim().split(/ +/);\n }\n\n if (is.array(eventType)) {\n for (let i = 0; i < eventType.length; i++) {\n this[method](eventType[i], listener, options);\n }\n\n return true;\n }\n\n if (is.object(eventType)) {\n for (const prop in eventType) {\n this[method](prop, eventType[prop], listener);\n }\n\n return true;\n }\n }\n\n /*\\\n * Interactable.on\n [ method ]\n *\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n - eventType (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) This Interactable\n \\*/\n on (eventType, listener, options) {\n if (this._onOffMultiple('on', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.on(eventType, listener);\n }\n // delegated event for selector\n else if (is.string(this.target)) {\n events.addDelegate(this.target, this._context, eventType, listener, options);\n }\n else {\n events.add(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.off\n [ method ]\n *\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n - eventType (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) This Interactable\n \\*/\n off (eventType, listener, options) {\n if (this._onOffMultiple('off', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n // if it is an action event type\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.off(eventType, listener);\n }\n // delegated event\n else if (is.string(this.target)) {\n events.removeDelegate(this.target, this._context, eventType, listener, options);\n }\n // remove listener from this Interatable's element\n else {\n events.remove(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.set\n [ method ]\n *\n * Reset the options of this Interactable\n - options (object) The new settings to apply\n = (object) This Interactable\n \\*/\n set (options) {\n if (!is.object(options)) {\n options = {};\n }\n\n this.options = extend({}, defaults.base);\n\n const perActions = extend({}, defaults.perAction);\n\n for (const actionName in actions.methodDict) {\n const methodName = actions.methodDict[actionName];\n\n this.options[actionName] = extend({}, defaults[actionName]);\n\n this.setPerAction(actionName, perActions);\n\n this[methodName](options[actionName]);\n }\n\n for (const setting of Interactable.settingsMethods) {\n this.options[setting] = defaults.base[setting];\n\n if (setting in options) {\n this[setting](options[setting]);\n }\n }\n\n signals.fire('set', {\n options,\n interactable: this,\n });\n\n return this;\n }\n\n /*\\\n * Interactable.unset\n [ method ]\n *\n * Remove this interactable from the list of interactables and remove\n * it's action capabilities and event listeners\n *\n = (object) @interact\n \\*/\n unset () {\n events.remove(this.target, 'all');\n\n if (is.string(this.target)) {\n // remove delegated events\n for (const type in events.delegatedEvents) {\n const delegated = events.delegatedEvents[type];\n\n if (delegated.selectors[0] === this.target\n && delegated.contexts[0] === this._context) {\n\n delegated.selectors.splice(0, 1);\n delegated.contexts .splice(0, 1);\n delegated.listeners.splice(0, 1);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegated[type] = null;\n }\n }\n\n events.remove(this._context, type, events.delegateListener);\n events.remove(this._context, type, events.delegateUseCapture, true);\n }\n }\n else {\n events.remove(this, 'all');\n }\n\n signals.fire('unset', { interactable: this });\n\n scope.interactables.splice(indexOf(scope.interactables, this), 1);\n\n // Stop related interactions when an Interactable is unset\n for (const interaction of scope.interactions || []) {\n if (interaction.target === this && interaction.interacting()) {\n interaction.stop();\n }\n }\n\n return scope.interact;\n }\n}\n\nscope.interactables.indexOfElement = function indexOfElement (target, context) {\n context = context || scope.document;\n\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n if (interactable.target === target && interactable._context === context) {\n return i;\n }\n }\n return -1;\n};\n\nscope.interactables.get = function interactableGet (element, options, dontCheckInContext) {\n const ret = this[this.indexOfElement(element, options && options.context)];\n\n return ret && (is.string(element) || dontCheckInContext || ret.inContext(element))? ret : null;\n};\n\nscope.interactables.forEachSelector = function (callback, element) {\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n // skip non CSS selector targets and out of context elements\n if (!is.string(interactable.target)\n || (element && !interactable.inContext(element))) {\n continue;\n }\n\n const ret = callback(interactable, interactable.target, interactable._context, i, this);\n\n if (ret !== undefined) {\n return ret;\n }\n }\n};\n\n// all interact.js eventTypes\nInteractable.eventTypes = scope.eventTypes = [];\n\nInteractable.signals = signals;\n\nInteractable.settingsMethods = [ 'deltaSource', 'origin', 'preventDefault', 'rectChecker' ];\n\nmodule.exports = Interactable;\n","const scope = require('./scope');\nconst utils = require('./utils');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst domObjects = require('./utils/domObjects');\nconst finder = require('./utils/interactionFinder');\nconst signals = require('./utils/Signals').new();\n\nconst listeners = {};\nconst methodNames = [\n 'pointerDown', 'pointerMove', 'pointerUp',\n 'updatePointer', 'removePointer',\n];\n\n// for ignoring browser's simulated mouse events\nlet prevTouchTime = 0;\n\n// all active and idle interactions\nscope.interactions = [];\n\nclass Interaction {\n constructor ({ pointerType }) {\n this.target = null; // current interactable being interacted with\n this.element = null; // the target element of the interactable\n\n this.prepared = { // action that's ready to be fired on next move event\n name : null,\n axis : null,\n edges: null,\n };\n\n // keep track of added pointers\n this.pointers = [];\n this.pointerIds = [];\n this.downTargets = [];\n this.downTimes = [];\n\n // Previous native pointer move event coordinates\n this.prevCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n // current native pointer move event coordinates\n this.curCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Starting InteractEvent pointer coordinates\n this.startCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Change in coordinates and time of the pointer\n this.pointerDelta = {\n page : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n client : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n timeStamp: 0,\n };\n\n this.downEvent = null; // pointerdown/mousedown/touchstart event\n this.downPointer = {};\n\n this._eventTarget = null;\n this._curEventTarget = null;\n\n this.prevEvent = null; // previous action event\n\n this.pointerIsDown = false;\n this.pointerWasMoved = false;\n this._interacting = false;\n\n this.pointerType = pointerType;\n\n signals.fire('new', this);\n\n scope.interactions.push(this);\n }\n\n pointerDown (pointer, event, eventTarget) {\n const pointerIndex = this.updatePointer(pointer, event, true);\n\n signals.fire('down', {\n pointer,\n event,\n eventTarget,\n pointerIndex,\n interaction: this,\n });\n }\n\n /*\\\n * Interaction.start\n [ method ]\n *\n * Start an action with the given Interactable and Element as tartgets. The\n * action must be enabled for the target Interactable and an appropriate number\n * of pointers must be held down - 1 for drag/resize, 2 for gesture.\n *\n * Use it with `interactable.able({ manualStart: false })` to always\n * [start actions manually](https://github.com/taye/interact.js/issues/114)\n *\n - action (object) The action to be performed - drag, resize, etc.\n - target (Interactable) The Interactable to target\n - element (Element) The DOM Element to target\n = (object) interact\n **\n | interact(target)\n | .draggable({\n | // disable the default drag start by down->move\n | manualStart: true\n | })\n | // start dragging after the user holds the pointer down\n | .on('hold', function (event) {\n | var interaction = event.interaction;\n |\n | if (!interaction.interacting()) {\n | interaction.start({ name: 'drag' },\n | event.interactable,\n | event.currentTarget);\n | }\n | });\n \\*/\n start (action, target, element) {\n if (this.interacting()\n || !this.pointerIsDown\n || this.pointerIds.length < (action.name === 'gesture'? 2 : 1)) {\n return;\n }\n\n // if this interaction had been removed after stopping\n // add it back\n if (utils.indexOf(scope.interactions, this) === -1) {\n scope.interactions.push(this);\n }\n\n utils.copyAction(this.prepared, action);\n this.target = target;\n this.element = element;\n\n signals.fire('action-start', {\n interaction: this,\n event: this.downEvent,\n });\n }\n\n pointerMove (pointer, event, eventTarget) {\n if (!this.simulation) {\n this.updatePointer(pointer);\n utils.setCoords(this.curCoords, this.pointers);\n }\n\n const duplicateMove = (this.curCoords.page.x === this.prevCoords.page.x\n && this.curCoords.page.y === this.prevCoords.page.y\n && this.curCoords.client.x === this.prevCoords.client.x\n && this.curCoords.client.y === this.prevCoords.client.y);\n\n let dx;\n let dy;\n\n // register movement greater than pointerMoveTolerance\n if (this.pointerIsDown && !this.pointerWasMoved) {\n dx = this.curCoords.client.x - this.startCoords.client.x;\n dy = this.curCoords.client.y - this.startCoords.client.y;\n\n this.pointerWasMoved = utils.hypot(dx, dy) > Interaction.pointerMoveTolerance;\n }\n\n const signalArg = {\n pointer,\n pointerIndex: this.getPointerIndex(pointer),\n event,\n eventTarget,\n dx,\n dy,\n duplicate: duplicateMove,\n interaction: this,\n interactingBeforeMove: this.interacting(),\n };\n\n if (!duplicateMove) {\n // set pointer coordinate, time changes and speeds\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n }\n\n signals.fire('move', signalArg);\n\n if (!duplicateMove) {\n // if interacting, fire an 'action-move' signal etc\n if (this.interacting()) {\n this.doMove(signalArg);\n }\n\n if (this.pointerWasMoved) {\n utils.copyCoords(this.prevCoords, this.curCoords);\n }\n }\n }\n\n /*\\\n * Interaction.doMove\n [ method ]\n *\n * Force a move of the current action at the same coordinates. Useful if\n * snap/restrict has been changed and you want a movement with the new\n * settings.\n *\n **\n | interact(target)\n | .draggable(true)\n | .on('dragmove', function (event) {\n | if (someCondition) {\n | // change the snap settings\n | event.interactable.draggable({ snap: { targets: [] }});\n | // fire another move event with re-calculated snap\n | event.interaction.doMove();\n | }\n | });\n \\*/\n doMove (signalArg) {\n signalArg = utils.extend({\n pointer: this.pointers[0],\n event: this.prevEvent,\n eventTarget: this._eventTarget,\n interaction: this,\n }, signalArg || {});\n\n signals.fire('before-action-move', signalArg);\n\n if (!this._dontFireMove) {\n signals.fire('action-move', signalArg);\n }\n\n this._dontFireMove = false;\n }\n\n // End interact move events and stop auto-scroll unless simulation is running\n pointerUp (pointer, event, eventTarget, curEventTarget) {\n const pointerIndex = this.getPointerIndex(pointer);\n\n signals.fire(/cancel$/i.test(event.type)? 'cancel' : 'up', {\n pointer,\n pointerIndex,\n event,\n eventTarget,\n curEventTarget,\n interaction: this,\n });\n\n if (!this.simulation) {\n this.end(event);\n }\n\n this.pointerIsDown = false;\n this.removePointer(pointer, event);\n }\n\n /*\\\n * Interaction.end\n [ method ]\n *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n - event (PointerEvent) #optional\n **\n | interact(target)\n | .draggable(true)\n | .on('move', function (event) {\n | if (event.pageX > 1000) {\n | // end the current action\n | event.interaction.end();\n | // stop all further listeners from being called\n | event.stopImmediatePropagation();\n | }\n | });\n \\*/\n end (event) {\n event = event || this.prevEvent;\n\n if (this.interacting()) {\n signals.fire('action-end', {\n event,\n interaction: this,\n });\n }\n\n this.stop();\n }\n\n currentAction () {\n return this._interacting? this.prepared.name: null;\n }\n\n interacting () {\n return this._interacting;\n }\n\n stop () {\n signals.fire('stop', { interaction: this });\n\n if (this._interacting) {\n signals.fire('stop-active', { interaction: this });\n signals.fire('stop-' + this.prepared.name, { interaction: this });\n }\n\n this.target = this.element = null;\n\n this._interacting = false;\n this.prepared.name = this.prevEvent = null;\n }\n\n getPointerIndex (pointer) {\n // mouse and pen interactions may have only one pointer\n if (this.pointerType === 'mouse' || this.pointerType === 'pen') {\n return 0;\n }\n\n return utils.indexOf(this.pointerIds, utils.getPointerId(pointer));\n }\n\n updatePointer (pointer, event, down = event && /(down|start)$/i.test(event.type)) {\n const id = utils.getPointerId(pointer);\n let index = this.getPointerIndex(pointer);\n\n if (index === -1) {\n index = this.pointerIds.length;\n this.pointerIds[index] = id;\n }\n\n if (down) {\n signals.fire('update-pointer-down', {\n pointer,\n event,\n down,\n pointerId: id,\n pointerIndex: index,\n interaction: this,\n });\n }\n\n this.pointers[index] = pointer;\n\n return index;\n }\n\n removePointer (pointer, event) {\n const index = this.getPointerIndex(pointer);\n\n if (index === -1) { return; }\n\n signals.fire('remove-pointer', {\n pointer,\n event,\n pointerIndex: index,\n interaction: this,\n });\n\n this.pointers .splice(index, 1);\n this.pointerIds .splice(index, 1);\n this.downTargets.splice(index, 1);\n this.downTimes .splice(index, 1);\n }\n\n _updateEventTargets (target, currentTarget) {\n this._eventTarget = target;\n this._curEventTarget = currentTarget;\n }\n}\n\nfor (let i = 0, len = methodNames.length; i < len; i++) {\n const method = methodNames[i];\n\n listeners[method] = doOnInteractions(method);\n}\n\nfunction doOnInteractions (method) {\n return (function (event) {\n const pointerType = utils.getPointerType(event);\n const [eventTarget, curEventTarget] = utils.getEventTargets(event);\n const matches = []; // [ [pointer, interaction], ...]\n\n if (browser.supportsTouch && /touch/.test(event.type)) {\n prevTouchTime = new Date().getTime();\n\n for (let i = 0; i < event.changedTouches.length; i++) {\n const pointer = event.changedTouches[i];\n const interaction = finder.search(pointer, event.type, eventTarget);\n\n matches.push([pointer, interaction || new Interaction({ pointerType })]);\n }\n }\n else {\n let invalidPointer = false;\n\n if (!browser.supportsPointerEvent && /mouse/.test(event.type)) {\n // ignore mouse events while touch interactions are active\n for (let i = 0; i < scope.interactions.length && !invalidPointer; i++) {\n invalidPointer = scope.interactions[i].pointerType !== 'mouse' && scope.interactions[i].pointerIsDown;\n }\n\n // try to ignore mouse events that are simulated by the browser\n // after a touch event\n invalidPointer = invalidPointer\n || (new Date().getTime() - prevTouchTime < 500)\n // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated\n || event.timeStamp === 0;\n }\n\n if (!invalidPointer) {\n let interaction = finder.search(event, event.type, eventTarget);\n\n if (!interaction) {\n interaction = new Interaction({ pointerType });\n }\n\n matches.push([event, interaction]);\n }\n }\n\n for (const [pointer, interaction] of matches) {\n interaction._updateEventTargets(eventTarget, curEventTarget);\n interaction[method](pointer, event, eventTarget, curEventTarget);\n }\n });\n}\n\nfunction endAll (event) {\n for (let i = 0; i < scope.interactions.length; i++) {\n const interaction = scope.interactions[i];\n\n interaction.end(event);\n signals.fire('endall', { event, interaction });\n }\n}\n\nconst docEvents = { /* 'eventType': listenerFunc */ };\nconst pEventTypes = browser.pEventTypes;\n\nif (domObjects.PointerEvent) {\n docEvents[pEventTypes.down ] = listeners.pointerDown;\n docEvents[pEventTypes.move ] = listeners.pointerMove;\n docEvents[pEventTypes.up ] = listeners.pointerUp;\n docEvents[pEventTypes.cancel] = listeners.pointerUp;\n}\nelse {\n docEvents.mousedown = listeners.pointerDown;\n docEvents.mousemove = listeners.pointerMove;\n docEvents.mouseup = listeners.pointerUp;\n\n docEvents.touchstart = listeners.pointerDown;\n docEvents.touchmove = listeners.pointerMove;\n docEvents.touchend = listeners.pointerUp;\n docEvents.touchcancel = listeners.pointerUp;\n}\n\ndocEvents.blur = endAll;\n\nfunction onDocSignal ({ doc }, signalName) {\n const eventMethod = signalName.indexOf('add') === 0\n ? events.add : events.remove;\n\n // delegate event listener\n for (const eventType in scope.delegatedEvents) {\n eventMethod(doc, eventType, events.delegateListener);\n eventMethod(doc, eventType, events.delegateUseCapture, true);\n }\n\n for (const eventType in docEvents) {\n eventMethod(doc, eventType, docEvents[eventType]);\n }\n}\n\nsignals.on('update-pointer-down', ({ interaction, pointer, pointerId, pointerIndex, event, eventTarget, down }) => {\n interaction.pointerIds[pointerIndex] = pointerId;\n interaction.pointers[pointerIndex] = pointer;\n\n if (down) {\n interaction.pointerIsDown = true;\n }\n\n if (!interaction.interacting()) {\n utils.setCoords(interaction.startCoords, interaction.pointers);\n\n utils.copyCoords(interaction.curCoords , interaction.startCoords);\n utils.copyCoords(interaction.prevCoords, interaction.startCoords);\n\n interaction.downEvent = event;\n interaction.downTimes[pointerIndex] = interaction.curCoords.timeStamp;\n interaction.downTargets[pointerIndex] = eventTarget || event && utils.getEventTargets(event)[0];\n interaction.pointerWasMoved = false;\n\n utils.pointerExtend(interaction.downPointer, pointer);\n }\n});\n\nscope.signals.on('add-document' , onDocSignal);\nscope.signals.on('remove-document', onDocSignal);\n\nInteraction.pointerMoveTolerance = 1;\nInteraction.doOnInteractions = doOnInteractions;\nInteraction.endAll = endAll;\nInteraction.signals = signals;\nInteraction.docEvents = docEvents;\n\nscope.endAllInteractions = endAll;\n\nmodule.exports = Interaction;\n","const Interaction = require('../Interaction');\nconst InteractEvent = require('../InteractEvent');\n\nconst actions = {\n firePrepared,\n names: [],\n methodDict: {},\n};\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n interaction._interacting = true;\n firePrepared(interaction, event, 'start');\n});\n\nInteraction.signals.on('action-move', function ({ interaction, event, preEnd }) {\n firePrepared(interaction, event, 'move', preEnd);\n\n // if the action was ended in a listener\n if (!interaction.interacting()) { return false; }\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n firePrepared(interaction, event, 'end');\n});\n\nfunction firePrepared (interaction, event, phase, preEnd) {\n const actionName = interaction.prepared.name;\n\n const newEvent = new InteractEvent(interaction, event, actionName, phase, interaction.element, null, preEnd);\n\n interaction.target.fire(newEvent);\n interaction.prevEvent = newEvent;\n}\n\nmodule.exports = actions;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drag = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n startAxis : 'xy',\n lockAxis : 'xy',\n },\n\n checker: function (pointer, event, interactable) {\n const dragOptions = interactable.options.drag;\n\n return dragOptions.enabled\n ? { name: 'drag', axis: (dragOptions.lockAxis === 'start'\n ? dragOptions.startAxis\n : dragOptions.lockAxis)}\n : null;\n },\n\n getCursor: function () {\n return 'move';\n },\n};\n\nInteraction.signals.on('before-action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n interaction.curCoords.page.y = interaction.startCoords.page.y;\n interaction.curCoords.client.y = interaction.startCoords.client.y;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vx);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vx);\n interaction.pointerDelta.client.vy = 0;\n interaction.pointerDelta.page.vy = 0;\n }\n else if (axis === 'y') {\n interaction.curCoords.page.x = interaction.startCoords.page.x;\n interaction.curCoords.client.x = interaction.startCoords.client.x;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vy);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vy);\n interaction.pointerDelta.client.vx = 0;\n interaction.pointerDelta.page.vx = 0;\n }\n});\n\n// dragmove\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'dragmove') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n iEvent.pageY = interaction.startCoords.page.y;\n iEvent.clientY = interaction.startCoords.client.y;\n iEvent.dy = 0;\n }\n else if (axis === 'y') {\n iEvent.pageX = interaction.startCoords.page.x;\n iEvent.clientX = interaction.startCoords.client.x;\n iEvent.dx = 0;\n }\n});\n\n/*\\\n * Interactable.draggable\n [ method ]\n *\n * Gets or sets whether drag actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of drag events\n | var isDraggable = interact('ul li').draggable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on drag events (object makes the Interactable draggable)\n = (object) This Interactable\n | interact(element).draggable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // the axis in which the first movement must be\n | // for the drag sequence to start\n | // 'xy' by default - any direction\n | startAxis: 'x' || 'y' || 'xy',\n |\n | // 'xy' by default - don't restrict to one axis (move in any direction)\n | // 'x' or 'y' to restrict movement to either axis\n | // 'start' to restrict movement to the axis the drag started in\n | lockAxis: 'x' || 'y' || 'xy' || 'start',\n |\n | // max number of drags that can happen concurrently\n | // with elements of this Interactable. Infinity by default\n | max: Infinity,\n |\n | // max number of drags that can target the same element+Interactable\n | // 1 by default\n | maxPerElement: 2\n | });\n\\*/\nInteractable.prototype.draggable = function (options) {\n if (utils.is.object(options)) {\n this.options.drag.enabled = options.enabled === false? false: true;\n this.setPerAction('drag', options);\n this.setOnEvents('drag', options);\n\n if (/^(xy|x|y|start)$/.test(options.lockAxis)) {\n this.options.drag.lockAxis = options.lockAxis;\n }\n if (/^(xy|x|y)$/.test(options.startAxis)) {\n this.options.drag.startAxis = options.startAxis;\n }\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drag.enabled = options;\n\n if (!options) {\n this.ondragstart = this.ondragstart = this.ondragend = null;\n }\n\n return this;\n }\n\n return this.options.drag;\n};\n\nactions.drag = drag;\nactions.names.push('drag');\nutils.merge(Interactable.eventTypes, [\n 'dragstart',\n 'dragmove',\n 'draginertiastart',\n 'draginertiaresume',\n 'dragend',\n]);\nactions.methodDict.drag = 'draggable';\n\ndefaultOptions.drag = drag.defaults;\n\nmodule.exports = drag;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst scope = require('../scope');\nconst interact = require('../interact');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drop = {\n defaults: {\n enabled: false,\n accept : null,\n overlap: 'pointer',\n },\n};\n\nlet dynamicDrop = false;\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // reset active dropzones\n interaction.activeDrops.dropzones = [];\n interaction.activeDrops.elements = [];\n interaction.activeDrops.rects = [];\n\n interaction.dropEvents = null;\n\n if (!interaction.dynamicDrop) {\n setActiveDrops(interaction, interaction.element);\n }\n\n const dragEvent = interaction.prevEvent;\n const dropEvents = getDropEvents(interaction, event, dragEvent);\n\n if (dropEvents.activate) {\n fireActiveDrops(interaction, dropEvents.activate);\n }\n});\n\nInteractEvent.signals.on('new', function ({ interaction, iEvent, event }) {\n if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { return; }\n\n const draggableElement = interaction.element;\n const dragEvent = iEvent;\n const dropResult = getDrop(dragEvent, event, draggableElement);\n\n interaction.dropTarget = dropResult.dropzone;\n interaction.dropElement = dropResult.element;\n\n interaction.dropEvents = getDropEvents(interaction, event, dragEvent);\n});\n\nInteraction.signals.on('action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n fireDropEvents(interaction, interaction.dropEvents);\n});\n\nInteraction.signals.on('action-end', function ({ interaction }) {\n if (interaction.prepared.name === 'drag') {\n fireDropEvents(interaction, interaction.dropEvents);\n }\n});\n\nInteraction.signals.on('stop-drag', function ({ interaction }) {\n interaction.activeDrops.dropzones =\n interaction.activeDrops.elements =\n interaction.activeDrops.rects =\n interaction.dropEvents = null;\n});\n\nfunction collectDrops (interaction, element) {\n const drops = [];\n const elements = [];\n\n element = element || interaction.element;\n\n // collect all dropzones and their elements which qualify for a drop\n for (const current of scope.interactables) {\n if (!current.options.drop.enabled) { continue; }\n\n const accept = current.options.drop.accept;\n\n // test the draggable element against the dropzone's accept setting\n if ((utils.is.element(accept) && accept !== element)\n || (utils.is.string(accept)\n && !utils.matchesSelector(element, accept))) {\n\n continue;\n }\n\n // query for new elements if necessary\n const dropElements = utils.is.string(current.target)\n ? current._context.querySelectorAll(current.target)\n : [current.target];\n\n for (let i = 0; i < dropElements.length; i++) {\n const currentElement = dropElements[i];\n\n if (currentElement !== element) {\n drops.push(current);\n elements.push(currentElement);\n }\n }\n }\n\n return {\n elements,\n dropzones: drops,\n };\n}\n\nfunction fireActiveDrops (interaction, event) {\n let prevElement;\n\n // loop through all active dropzones and trigger event\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n const current = interaction.activeDrops.dropzones[i];\n const currentElement = interaction.activeDrops.elements [i];\n\n // prevent trigger of duplicate events on same element\n if (currentElement !== prevElement) {\n // set current element as event target\n event.target = currentElement;\n current.fire(event);\n }\n prevElement = currentElement;\n }\n}\n\n// Collect a new set of possible drops and save them in activeDrops.\n// setActiveDrops should always be called when a drag has just started or a\n// drag event happens while dynamicDrop is true\nfunction setActiveDrops (interaction, dragElement) {\n // get dropzones and their elements that could receive the draggable\n const possibleDrops = collectDrops(interaction, dragElement, true);\n\n interaction.activeDrops.dropzones = possibleDrops.dropzones;\n interaction.activeDrops.elements = possibleDrops.elements;\n interaction.activeDrops.rects = [];\n\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n interaction.activeDrops.rects[i] =\n interaction.activeDrops.dropzones[i].getRect(interaction.activeDrops.elements[i]);\n }\n}\n\nfunction getDrop (dragEvent, event, dragElement) {\n const interaction = dragEvent.interaction;\n const validDrops = [];\n\n if (dynamicDrop) {\n setActiveDrops(interaction, dragElement);\n }\n\n // collect all dropzones and their elements which qualify for a drop\n for (let j = 0; j < interaction.activeDrops.dropzones.length; j++) {\n const current = interaction.activeDrops.dropzones[j];\n const currentElement = interaction.activeDrops.elements [j];\n const rect = interaction.activeDrops.rects [j];\n\n validDrops.push(current.dropCheck(dragEvent, event, interaction.target, dragElement, currentElement, rect)\n ? currentElement\n : null);\n }\n\n // get the most appropriate dropzone based on DOM depth and order\n const dropIndex = utils.indexOfDeepestElement(validDrops);\n\n return {\n dropzone: interaction.activeDrops.dropzones[dropIndex] || null,\n element : interaction.activeDrops.elements [dropIndex] || null,\n };\n}\n\nfunction getDropEvents (interaction, pointerEvent, dragEvent) {\n const dropEvents = {\n enter : null,\n leave : null,\n activate : null,\n deactivate: null,\n move : null,\n drop : null,\n };\n\n const tmpl = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n };\n\n if (interaction.dropElement !== interaction.prevDropElement) {\n // if there was a prevDropTarget, create a dragleave event\n if (interaction.prevDropTarget) {\n dropEvents.leave = utils.extend({ type: 'dragleave' }, tmpl);\n\n dragEvent.dragLeave = dropEvents.leave.target = interaction.prevDropElement;\n dragEvent.prevDropzone = dropEvents.leave.dropzone = interaction.prevDropTarget;\n }\n // if the dropTarget is not null, create a dragenter event\n if (interaction.dropTarget) {\n dropEvents.enter = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n type : 'dragenter',\n };\n\n dragEvent.dragEnter = interaction.dropElement;\n dragEvent.dropzone = interaction.dropTarget;\n }\n }\n\n if (dragEvent.type === 'dragend' && interaction.dropTarget) {\n dropEvents.drop = utils.extend({ type: 'drop' }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n dragEvent.relatedTarget = interaction.dropElement;\n }\n if (dragEvent.type === 'dragstart') {\n dropEvents.activate = utils.extend({ type: 'dropactivate' }, tmpl);\n\n dropEvents.activate.target = null;\n dropEvents.activate.dropzone = null;\n }\n if (dragEvent.type === 'dragend') {\n dropEvents.deactivate = utils.extend({ type: 'dropdeactivate' }, tmpl);\n\n dropEvents.deactivate.target = null;\n dropEvents.deactivate.dropzone = null;\n }\n if (dragEvent.type === 'dragmove' && interaction.dropTarget) {\n dropEvents.move = utils.extend({\n dragmove : dragEvent,\n type : 'dropmove',\n }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n }\n\n return dropEvents;\n}\n\nfunction fireDropEvents (interaction, dropEvents) {\n if (dropEvents.leave) { interaction.prevDropTarget.fire(dropEvents.leave); }\n if (dropEvents.move ) { interaction.dropTarget.fire(dropEvents.move ); }\n if (dropEvents.enter) { interaction.dropTarget.fire(dropEvents.enter); }\n if (dropEvents.drop ) { interaction.dropTarget.fire(dropEvents.drop ); }\n if (dropEvents.deactivate) {\n fireActiveDrops(interaction, dropEvents.deactivate);\n }\n\n interaction.prevDropTarget = interaction.dropTarget;\n interaction.prevDropElement = interaction.dropElement;\n}\n\n/*\\\n * Interactable.dropzone\n [ method ]\n *\n * Returns or sets whether elements can be dropped onto this\n * Interactable to trigger drop events\n *\n * Dropzones can receive the following events:\n * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends\n * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone\n * - `dragmove` when a draggable that has entered the dropzone is moved\n * - `drop` when a draggable is dropped into this dropzone\n *\n * Use the `accept` option to allow only elements that match the given CSS\n * selector or element. The value can be:\n *\n * - **an Element** - only that element can be dropped into this dropzone.\n * - **a string**, - the element being dragged must match it as a CSS selector.\n * - **`null`** - accept options is cleared - it accepts any element.\n *\n * Use the `overlap` option to set how drops are checked for. The allowed\n * values are:\n *\n * - `'pointer'`, the pointer must be over the dropzone (default)\n * - `'center'`, the draggable element's center must be over the dropzone\n * - a number from 0-1 which is the `(intersection area) / (draggable area)`.\n * e.g. `0.5` for drop to happen when half of the area of the draggable is\n * over the dropzone\n *\n * Use the `checker` option to specify a function to check if a dragged\n * element is over this Interactable.\n *\n | interact(target)\n | .dropChecker(function(dragEvent, // related dragmove or dragend event\n | event, // TouchEvent/PointerEvent/MouseEvent\n | dropped, // bool result of the default checker\n | dropzone, // dropzone Interactable\n | dropElement, // dropzone elemnt\n | draggable, // draggable Interactable\n | draggableElement) {// draggable element\n |\n | return dropped && event.target.hasAttribute('allow-drop');\n | }\n *\n *\n - options (boolean | object | null) #optional The new value to be set.\n | interact('.drop').dropzone({\n | accept: '.can-drop' || document.getElementById('single-drop'),\n | overlap: 'pointer' || 'center' || zeroToOne\n | }\n = (boolean | object) The current setting or this Interactable\n\\*/\nInteractable.prototype.dropzone = function (options) {\n if (utils.is.object(options)) {\n this.options.drop.enabled = options.enabled === false? false: true;\n\n if (utils.is.function(options.ondrop) ) { this.events.ondrop = options.ondrop ; }\n if (utils.is.function(options.ondropactivate) ) { this.events.ondropactivate = options.ondropactivate ; }\n if (utils.is.function(options.ondropdeactivate)) { this.events.ondropdeactivate = options.ondropdeactivate; }\n if (utils.is.function(options.ondragenter) ) { this.events.ondragenter = options.ondragenter ; }\n if (utils.is.function(options.ondragleave) ) { this.events.ondragleave = options.ondragleave ; }\n if (utils.is.function(options.ondropmove) ) { this.events.ondropmove = options.ondropmove ; }\n\n if (/^(pointer|center)$/.test(options.overlap)) {\n this.options.drop.overlap = options.overlap;\n }\n else if (utils.is.number(options.overlap)) {\n this.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0);\n }\n if ('accept' in options) {\n this.options.drop.accept = options.accept;\n }\n if ('checker' in options) {\n this.options.drop.checker = options.checker;\n }\n\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drop.enabled = options;\n\n if (!options) {\n this.ondragenter = this.ondragleave = this.ondrop\n = this.ondropactivate = this.ondropdeactivate = null;\n }\n\n return this;\n }\n\n return this.options.drop;\n};\n\nInteractable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) {\n let dropped = false;\n\n // if the dropzone has no rect (eg. display: none)\n // call the custom dropChecker or just return false\n if (!(rect = rect || this.getRect(dropElement))) {\n return (this.options.drop.checker\n ? this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement)\n : false);\n }\n\n const dropOverlap = this.options.drop.overlap;\n\n if (dropOverlap === 'pointer') {\n const origin = utils.getOriginXY(draggable, draggableElement, 'drag');\n const page = utils.getPageXY(dragEvent);\n\n page.x += origin.x;\n page.y += origin.y;\n\n const horizontal = (page.x > rect.left) && (page.x < rect.right);\n const vertical = (page.y > rect.top ) && (page.y < rect.bottom);\n\n dropped = horizontal && vertical;\n }\n\n const dragRect = draggable.getRect(draggableElement);\n\n if (dragRect && dropOverlap === 'center') {\n const cx = dragRect.left + dragRect.width / 2;\n const cy = dragRect.top + dragRect.height / 2;\n\n dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom;\n }\n\n if (dragRect && utils.is.number(dropOverlap)) {\n const overlapArea = (Math.max(0, Math.min(rect.right , dragRect.right ) - Math.max(rect.left, dragRect.left))\n * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top , dragRect.top )));\n\n const overlapRatio = overlapArea / (dragRect.width * dragRect.height);\n\n dropped = overlapRatio >= dropOverlap;\n }\n\n if (this.options.drop.checker) {\n dropped = this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement);\n }\n\n return dropped;\n};\n\nInteractable.signals.on('unset', function ({ interactable }) {\n interactable.dropzone(false);\n});\n\nInteractable.settingsMethods.push('dropChecker');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.dropTarget = null; // the dropzone a drag target might be dropped into\n interaction.dropElement = null; // the element at the time of checking\n interaction.prevDropTarget = null; // the dropzone that was recently dragged away from\n interaction.prevDropElement = null; // the element at the time of checking\n interaction.dropEvents = null; // the dropEvents related to the current drag event\n\n interaction.activeDrops = {\n dropzones: [], // the dropzones that are mentioned below\n elements : [], // elements of dropzones that accept the target draggable\n rects : [], // the rects of the elements mentioned above\n };\n\n});\n\nInteraction.signals.on('stop', function ({ interaction }) {\n interaction.dropTarget = interaction.dropElement =\n interaction.prevDropTarget = interaction.prevDropElement = null;\n});\n\n/*\\\n * interact.dynamicDrop\n [ method ]\n *\n * Returns or sets whether the dimensions of dropzone elements are\n * calculated on every dragmove or only on dragstart for the default\n * dropChecker\n *\n - newValue (boolean) #optional True to check on each move. False to check only before start\n = (boolean | interact) The current setting or interact\n\\*/\ninteract.dynamicDrop = function (newValue) {\n if (utils.is.bool(newValue)) {\n //if (dragging && dynamicDrop !== newValue && !newValue) {\n //calcRects(dropzones);\n //}\n\n dynamicDrop = newValue;\n\n return interact;\n }\n return dynamicDrop;\n};\n\nutils.merge(Interactable.eventTypes, [\n 'dragenter',\n 'dragleave',\n 'dropactivate',\n 'dropdeactivate',\n 'dropmove',\n 'drop',\n]);\nactions.methodDict.drop = 'dropzone';\n\ndefaultOptions.drop = drop.defaults;\n\nmodule.exports = drop;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst gesture = {\n defaults: {\n enabled : false,\n origin : null,\n restrict: null,\n },\n\n checker: function (pointer, event, interactable, element, interaction) {\n if (interaction.pointerIds.length >= 2) {\n return { name: 'gesture' };\n }\n\n return null;\n },\n\n getCursor: function () {\n return '';\n },\n};\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturestart') { return; }\n iEvent.ds = 0;\n\n interaction.gesture.startDistance = interaction.gesture.prevDistance = iEvent.distance;\n interaction.gesture.startAngle = interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.scale = 1;\n});\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturemove') { return; }\n\n iEvent.ds = iEvent.scale - interaction.gesture.scale;\n\n interaction.target.fire(iEvent);\n\n interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.prevDistance = iEvent.distance;\n\n if (iEvent.scale !== Infinity\n && iEvent.scale !== null\n && iEvent.scale !== undefined\n && !isNaN(iEvent.scale)) {\n\n interaction.gesture.scale = iEvent.scale;\n }\n});\n\n/*\\\n * Interactable.gesturable\n [ method ]\n *\n * Gets or sets whether multitouch gestures can be performed on the\n * Interactable's element\n *\n = (boolean) Indicates if this can be the target of gesture events\n | var isGestureable = interact(element).gesturable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on gesture events (makes the Interactable gesturable)\n = (object) this Interactable\n | interact(element).gesturable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // limit multiple gestures.\n | // See the explanation in @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n\\*/\nInteractable.prototype.gesturable = function (options) {\n if (utils.is.object(options)) {\n this.options.gesture.enabled = options.enabled === false? false: true;\n this.setPerAction('gesture', options);\n this.setOnEvents('gesture', options);\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.gesture.enabled = options;\n\n if (!options) {\n this.ongesturestart = this.ongesturestart = this.ongestureend = null;\n }\n\n return this;\n }\n\n return this.options.gesture;\n};\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action, event, starting, ending, deltaSource }) {\n if (action !== 'gesture') { return; }\n\n const pointers = interaction.pointers;\n\n iEvent.touches = [pointers[0], pointers[1]];\n\n if (starting) {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = 1;\n iEvent.ds = 0;\n iEvent.angle = utils.touchAngle(pointers, undefined, deltaSource);\n iEvent.da = 0;\n }\n else if (ending || event instanceof InteractEvent) {\n iEvent.distance = interaction.prevEvent.distance;\n iEvent.box = interaction.prevEvent.box;\n iEvent.scale = interaction.prevEvent.scale;\n iEvent.ds = iEvent.scale - 1;\n iEvent.angle = interaction.prevEvent.angle;\n iEvent.da = iEvent.angle - interaction.gesture.startAngle;\n }\n else {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = iEvent.distance / interaction.gesture.startDistance;\n iEvent.angle = utils.touchAngle(pointers, interaction.gesture.prevAngle, deltaSource);\n\n iEvent.ds = iEvent.scale - interaction.gesture.prevScale;\n iEvent.da = iEvent.angle - interaction.gesture.prevAngle;\n }\n});\n\nInteraction.signals.on('new', function (interaction) {\n interaction.gesture = {\n start: { x: 0, y: 0 },\n\n startDistance: 0, // distance between two touches of touchStart\n prevDistance : 0,\n distance : 0,\n\n scale: 1, // gesture.distance / gesture.startDistance\n\n startAngle: 0, // angle of line joining two touches\n prevAngle : 0, // angle of the previous gesture event\n };\n});\n\nactions.gesture = gesture;\nactions.names.push('gesture');\nutils.merge(Interactable.eventTypes, [\n 'gesturestart',\n 'gesturemove',\n 'gestureend',\n]);\nactions.methodDict.gesture = 'gesturable';\n\ndefaultOptions.gesture = gesture.defaults;\n\nmodule.exports = gesture;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\n// Less Precision with touch input\nconst defaultMargin = browser.supportsTouch || browser.supportsPointerEvent? 20: 10;\n\nconst resize = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n square: false,\n preserveAspectRatio: false,\n axis: 'xy',\n\n // use default margin\n margin: NaN,\n\n // object with props left, right, top, bottom which are\n // true/false values to resize when the pointer is over that edge,\n // CSS selectors to match the handles for each direction\n // or the Elements for each handle\n edges: null,\n\n // a value of 'none' will limit the resize rect to a minimum of 0x0\n // 'negate' will alow the rect to have negative width/height\n // 'reposition' will keep the width/height positive by swapping\n // the top and bottom edges and/or swapping the left and right edges\n invert: 'none',\n },\n\n checker: function (pointer, event, interactable, element, interaction, rect) {\n if (!rect) { return null; }\n\n const page = utils.extend({}, interaction.curCoords.page);\n const options = interactable.options;\n\n if (options.resize.enabled) {\n const resizeOptions = options.resize;\n const resizeEdges = { left: false, right: false, top: false, bottom: false };\n\n // if using resize.edges\n if (utils.is.object(resizeOptions.edges)) {\n for (const edge in resizeEdges) {\n resizeEdges[edge] = checkResizeEdge(edge,\n resizeOptions.edges[edge],\n page,\n interaction._eventTarget,\n element,\n rect,\n resizeOptions.margin || defaultMargin);\n }\n\n resizeEdges.left = resizeEdges.left && !resizeEdges.right;\n resizeEdges.top = resizeEdges.top && !resizeEdges.bottom;\n\n if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) {\n return {\n name: 'resize',\n edges: resizeEdges,\n };\n }\n }\n else {\n const right = options.resize.axis !== 'y' && page.x > (rect.right - defaultMargin);\n const bottom = options.resize.axis !== 'x' && page.y > (rect.bottom - defaultMargin);\n\n if (right || bottom) {\n return {\n name: 'resize',\n axes: (right? 'x' : '') + (bottom? 'y' : ''),\n };\n }\n }\n }\n\n return null;\n },\n\n cursors: (browser.isIe9OrOlder ? {\n x : 'e-resize',\n y : 's-resize',\n xy: 'se-resize',\n\n top : 'n-resize',\n left : 'w-resize',\n bottom : 's-resize',\n right : 'e-resize',\n topleft : 'se-resize',\n bottomright: 'se-resize',\n topright : 'ne-resize',\n bottomleft : 'ne-resize',\n } : {\n x : 'ew-resize',\n y : 'ns-resize',\n xy: 'nwse-resize',\n\n top : 'ns-resize',\n left : 'ew-resize',\n bottom : 'ns-resize',\n right : 'ew-resize',\n topleft : 'nwse-resize',\n bottomright: 'nwse-resize',\n topright : 'nesw-resize',\n bottomleft : 'nesw-resize',\n }),\n\n getCursor: function (action) {\n if (action.axis) {\n return resize.cursors[action.name + action.axis];\n }\n else if (action.edges) {\n let cursorKey = '';\n const edgeNames = ['top', 'bottom', 'left', 'right'];\n\n for (let i = 0; i < 4; i++) {\n if (action.edges[edgeNames[i]]) {\n cursorKey += edgeNames[i];\n }\n }\n\n return resize.cursors[cursorKey];\n }\n },\n};\n\n// resizestart\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'resizestart' || !interaction.prepared.edges) {\n return;\n }\n\n const startRect = interaction.target.getRect(interaction.element);\n const resizeOptions = interaction.target.options.resize;\n\n /*\n * When using the `resizable.square` or `resizable.preserveAspectRatio` options, resizing from one edge\n * will affect another. E.g. with `resizable.square`, resizing to make the right edge larger will make\n * the bottom edge larger by the same amount. We call these 'linked' edges. Any linked edges will depend\n * on the active edges and the edge being interacted with.\n */\n if (resizeOptions.square || resizeOptions.preserveAspectRatio) {\n const linkedEdges = utils.extend({}, interaction.prepared.edges);\n\n linkedEdges.top = linkedEdges.top || (linkedEdges.left && !linkedEdges.bottom);\n linkedEdges.left = linkedEdges.left || (linkedEdges.top && !linkedEdges.right );\n linkedEdges.bottom = linkedEdges.bottom || (linkedEdges.right && !linkedEdges.top );\n linkedEdges.right = linkedEdges.right || (linkedEdges.bottom && !linkedEdges.left );\n\n interaction.prepared._linkedEdges = linkedEdges;\n }\n else {\n interaction.prepared._linkedEdges = null;\n }\n\n // if using `resizable.preserveAspectRatio` option, record aspect ratio at the start of the resize\n if (resizeOptions.preserveAspectRatio) {\n interaction.resizeStartAspectRatio = startRect.width / startRect.height;\n }\n\n interaction.resizeRects = {\n start : startRect,\n current : utils.extend({}, startRect),\n inverted : utils.extend({}, startRect),\n previous : utils.extend({}, startRect),\n delta : {\n left: 0, right : 0, width : 0,\n top : 0, bottom: 0, height: 0,\n },\n };\n\n iEvent.rect = interaction.resizeRects.inverted;\n iEvent.deltaRect = interaction.resizeRects.delta;\n});\n\n// resizemove\nInteractEvent.signals.on('new', function ({ iEvent, phase, interaction }) {\n if (phase !== 'move' || !interaction.prepared.edges) { return; }\n\n const resizeOptions = interaction.target.options.resize;\n const invert = resizeOptions.invert;\n const invertible = invert === 'reposition' || invert === 'negate';\n\n let edges = interaction.prepared.edges;\n\n const start = interaction.resizeRects.start;\n const current = interaction.resizeRects.current;\n const inverted = interaction.resizeRects.inverted;\n const delta = interaction.resizeRects.delta;\n const previous = utils.extend(interaction.resizeRects.previous, inverted);\n const originalEdges = edges;\n\n let dx = iEvent.dx;\n let dy = iEvent.dy;\n\n if (resizeOptions.preserveAspectRatio || resizeOptions.square) {\n // `resize.preserveAspectRatio` takes precedence over `resize.square`\n const startAspectRatio = resizeOptions.preserveAspectRatio\n ? interaction.resizeStartAspectRatio\n : 1;\n\n edges = interaction.prepared._linkedEdges;\n\n if ((originalEdges.left && originalEdges.bottom)\n || (originalEdges.right && originalEdges.top)) {\n dy = -dx / startAspectRatio;\n }\n else if (originalEdges.left || originalEdges.right ) { dy = dx / startAspectRatio; }\n else if (originalEdges.top || originalEdges.bottom) { dx = dy * startAspectRatio; }\n }\n\n // update the 'current' rect without modifications\n if (edges.top ) { current.top += dy; }\n if (edges.bottom) { current.bottom += dy; }\n if (edges.left ) { current.left += dx; }\n if (edges.right ) { current.right += dx; }\n\n if (invertible) {\n // if invertible, copy the current rect\n utils.extend(inverted, current);\n\n if (invert === 'reposition') {\n // swap edge values if necessary to keep width/height positive\n let swap;\n\n if (inverted.top > inverted.bottom) {\n swap = inverted.top;\n\n inverted.top = inverted.bottom;\n inverted.bottom = swap;\n }\n if (inverted.left > inverted.right) {\n swap = inverted.left;\n\n inverted.left = inverted.right;\n inverted.right = swap;\n }\n }\n }\n else {\n // if not invertible, restrict to minimum of 0x0 rect\n inverted.top = Math.min(current.top, start.bottom);\n inverted.bottom = Math.max(current.bottom, start.top);\n inverted.left = Math.min(current.left, start.right);\n inverted.right = Math.max(current.right, start.left);\n }\n\n inverted.width = inverted.right - inverted.left;\n inverted.height = inverted.bottom - inverted.top ;\n\n for (const edge in inverted) {\n delta[edge] = inverted[edge] - previous[edge];\n }\n\n iEvent.edges = interaction.prepared.edges;\n iEvent.rect = inverted;\n iEvent.deltaRect = delta;\n});\n\n/*\\\n * Interactable.resizable\n [ method ]\n *\n * Gets or sets whether resize actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of resize elements\n | var isResizeable = interact('input[type=text]').resizable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on resize events (object makes the Interactable resizable)\n = (object) This Interactable\n | interact(element).resizable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | edges: {\n | top : true, // Use pointer coords to check for resize.\n | left : false, // Disable resizing from left edge.\n | bottom: '.resize-s',// Resize if pointer target matches selector\n | right : handleEl // Resize if pointer target is the given Element\n | },\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height are adjusted at a 1:1 ratio.\n | square: false,\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height maintain the aspect ratio they had when resizing started.\n | preserveAspectRatio: false,\n |\n | // a value of 'none' will limit the resize rect to a minimum of 0x0\n | // 'negate' will allow the rect to have negative width/height\n | // 'reposition' will keep the width/height positive by swapping\n | // the top and bottom edges and/or swapping the left and right edges\n | invert: 'none' || 'negate' || 'reposition'\n |\n | // limit multiple resizes.\n | // See the explanation in the @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n \\*/\nInteractable.prototype.resizable = function (options) {\n if (utils.is.object(options)) {\n this.options.resize.enabled = options.enabled === false? false: true;\n this.setPerAction('resize', options);\n this.setOnEvents('resize', options);\n\n if (/^x$|^y$|^xy$/.test(options.axis)) {\n this.options.resize.axis = options.axis;\n }\n else if (options.axis === null) {\n this.options.resize.axis = defaultOptions.resize.axis;\n }\n\n if (utils.is.bool(options.preserveAspectRatio)) {\n this.options.resize.preserveAspectRatio = options.preserveAspectRatio;\n }\n else if (utils.is.bool(options.square)) {\n this.options.resize.square = options.square;\n }\n\n return this;\n }\n if (utils.is.bool(options)) {\n this.options.resize.enabled = options;\n\n if (!options) {\n this.onresizestart = this.onresizestart = this.onresizeend = null;\n }\n\n return this;\n }\n return this.options.resize;\n};\n\nfunction checkResizeEdge (name, value, page, element, interactableElement, rect, margin) {\n // false, '', undefined, null\n if (!value) { return false; }\n\n // true value, use pointer coords and element rect\n if (value === true) {\n // if dimensions are negative, \"switch\" edges\n const width = utils.is.number(rect.width )? rect.width : rect.right - rect.left;\n const height = utils.is.number(rect.height)? rect.height : rect.bottom - rect.top ;\n\n if (width < 0) {\n if (name === 'left' ) { name = 'right'; }\n else if (name === 'right') { name = 'left' ; }\n }\n if (height < 0) {\n if (name === 'top' ) { name = 'bottom'; }\n else if (name === 'bottom') { name = 'top' ; }\n }\n\n if (name === 'left' ) { return page.x < ((width >= 0? rect.left: rect.right ) + margin); }\n if (name === 'top' ) { return page.y < ((height >= 0? rect.top : rect.bottom) + margin); }\n\n if (name === 'right' ) { return page.x > ((width >= 0? rect.right : rect.left) - margin); }\n if (name === 'bottom') { return page.y > ((height >= 0? rect.bottom: rect.top ) - margin); }\n }\n\n // the remaining checks require an element\n if (!utils.is.element(element)) { return false; }\n\n return utils.is.element(value)\n // the value is an element to use as a resize handle\n ? value === element\n // otherwise check if element matches value as selector\n : utils.matchesUpTo(element, value, interactableElement);\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.resizeAxes = 'xy';\n});\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action }) {\n if (action !== 'resize' || !interaction.resizeAxes) { return; }\n\n const options = interaction.target.options;\n\n if (options.resize.square) {\n if (interaction.resizeAxes === 'y') {\n iEvent.dx = iEvent.dy;\n }\n else {\n iEvent.dy = iEvent.dx;\n }\n iEvent.axes = 'xy';\n }\n else {\n iEvent.axes = interaction.resizeAxes;\n\n if (interaction.resizeAxes === 'x') {\n iEvent.dy = 0;\n }\n else if (interaction.resizeAxes === 'y') {\n iEvent.dx = 0;\n }\n }\n});\n\nactions.resize = resize;\nactions.names.push('resize');\nutils.merge(Interactable.eventTypes, [\n 'resizestart',\n 'resizemove',\n 'resizeinertiastart',\n 'resizeinertiaresume',\n 'resizeend',\n]);\nactions.methodDict.resize = 'resizable';\n\ndefaultOptions.resize = resize.defaults;\n\nmodule.exports = resize;\n","const raf = require('./utils/raf');\nconst getWindow = require('./utils/window').getWindow;\nconst is = require('./utils/is');\nconst domUtils = require('./utils/domUtils');\nconst Interaction = require('./Interaction');\nconst defaultOptions = require('./defaultOptions');\n\nconst autoScroll = {\n defaults: {\n enabled : false,\n container: null, // the item that is scrolled (Window or HTMLElement)\n margin : 60,\n speed : 300, // the scroll speed in pixels per second\n },\n\n interaction: null,\n i: null, // the handle returned by window.setInterval\n x: 0, y: 0, // Direction each pulse is to scroll in\n\n isScrolling: false,\n prevTime: 0,\n\n start: function (interaction) {\n autoScroll.isScrolling = true;\n raf.cancel(autoScroll.i);\n\n autoScroll.interaction = interaction;\n autoScroll.prevTime = new Date().getTime();\n autoScroll.i = raf.request(autoScroll.scroll);\n },\n\n stop: function () {\n autoScroll.isScrolling = false;\n raf.cancel(autoScroll.i);\n },\n\n // scroll the window by the values in scroll.x/y\n scroll: function () {\n const options = autoScroll.interaction.target.options[autoScroll.interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(autoScroll.interaction.element);\n const now = new Date().getTime();\n // change in time in seconds\n const dt = (now - autoScroll.prevTime) / 1000;\n // displacement\n const s = options.speed * dt;\n\n if (s >= 1) {\n if (is.window(container)) {\n container.scrollBy(autoScroll.x * s, autoScroll.y * s);\n }\n else if (container) {\n container.scrollLeft += autoScroll.x * s;\n container.scrollTop += autoScroll.y * s;\n }\n\n autoScroll.prevTime = now;\n }\n\n if (autoScroll.isScrolling) {\n raf.cancel(autoScroll.i);\n autoScroll.i = raf.request(autoScroll.scroll);\n }\n },\n check: function (interactable, actionName) {\n const options = interactable.options;\n\n return options[actionName].autoScroll && options[actionName].autoScroll.enabled;\n },\n onInteractionMove: function ({ interaction, pointer }) {\n if (!(interaction.interacting()\n && autoScroll.check(interaction.target, interaction.prepared.name))) {\n return;\n }\n\n if (interaction.simulation) {\n autoScroll.x = autoScroll.y = 0;\n return;\n }\n\n let top;\n let right;\n let bottom;\n let left;\n\n const options = interaction.target.options[interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(interaction.element);\n\n if (is.window(container)) {\n left = pointer.clientX < autoScroll.margin;\n top = pointer.clientY < autoScroll.margin;\n right = pointer.clientX > container.innerWidth - autoScroll.margin;\n bottom = pointer.clientY > container.innerHeight - autoScroll.margin;\n }\n else {\n const rect = domUtils.getElementClientRect(container);\n\n left = pointer.clientX < rect.left + autoScroll.margin;\n top = pointer.clientY < rect.top + autoScroll.margin;\n right = pointer.clientX > rect.right - autoScroll.margin;\n bottom = pointer.clientY > rect.bottom - autoScroll.margin;\n }\n\n autoScroll.x = (right ? 1: left? -1: 0);\n autoScroll.y = (bottom? 1: top? -1: 0);\n\n if (!autoScroll.isScrolling) {\n // set the autoScroll properties to those of the target\n autoScroll.margin = options.margin;\n autoScroll.speed = options.speed;\n\n autoScroll.start(interaction);\n }\n },\n};\n\nInteraction.signals.on('stop-active', function () {\n autoScroll.stop();\n});\n\nInteraction.signals.on('action-move', autoScroll.onInteractionMove);\n\ndefaultOptions.perAction.autoScroll = autoScroll.defaults;\n\nmodule.exports = autoScroll;\n","const Interactable = require('../Interactable');\nconst actions = require('../actions/base');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.ignoreFrom\n [ method ]\n *\n * If the target of the `mousedown`, `pointerdown` or `touchstart`\n * event or any of it's parents match the given CSS selector or\n * Element, no drag/resize/gesture is started.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to not ignore any elements\n = (string | Element | object) The current ignoreFrom value or this Interactable\n **\n | interact(element, { ignoreFrom: document.getElementById('no-action') });\n | // or\n | interact(element).ignoreFrom('input, textarea, a');\n\\*/\nInteractable.prototype.ignoreFrom = function (newValue) {\n return this._backCompatOption('ignoreFrom', newValue);\n};\n\n/*\\\n * Interactable.allowFrom\n [ method ]\n *\n * A drag/resize/gesture is started only If the target of the\n * `mousedown`, `pointerdown` or `touchstart` event or any of it's\n * parents match the given CSS selector or Element.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to allow from any element\n = (string | Element | object) The current allowFrom value or this Interactable\n **\n | interact(element, { allowFrom: document.getElementById('drag-handle') });\n | // or\n | interact(element).allowFrom('.handle');\n\\*/\nInteractable.prototype.allowFrom = function (newValue) {\n return this._backCompatOption('allowFrom', newValue);\n};\n\nInteractable.prototype.testIgnore = function (ignoreFrom, interactableElement, element) {\n if (!ignoreFrom || !is.element(element)) { return false; }\n\n if (is.string(ignoreFrom)) {\n return domUtils.matchesUpTo(element, ignoreFrom, interactableElement);\n }\n else if (is.element(ignoreFrom)) {\n return domUtils.nodeContains(ignoreFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testAllow = function (allowFrom, interactableElement, element) {\n if (!allowFrom) { return true; }\n\n if (!is.element(element)) { return false; }\n\n if (is.string(allowFrom)) {\n return domUtils.matchesUpTo(element, allowFrom, interactableElement);\n }\n else if (is.element(allowFrom)) {\n return domUtils.nodeContains(allowFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testIgnoreAllow = function (options, interactableElement, eventTarget) {\n return (!this.testIgnore(options.ignoreFrom, interactableElement, eventTarget)\n && this.testAllow(options.allowFrom, interactableElement, eventTarget));\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (event.buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\n","const interact = require('../interact');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst actions = require('../actions/base');\nconst defaultOptions = require('../defaultOptions');\nconst browser = require('../utils/browser');\nconst scope = require('../scope');\nconst utils = require('../utils');\nconst signals = require('../utils/Signals').new();\n\nrequire('./InteractableMethods');\n\nconst autoStart = {\n signals,\n withinInteractionLimit,\n // Allow this many interactions to happen simultaneously\n maxInteractions: Infinity,\n defaults: {\n perAction: {\n manualStart: false,\n max: Infinity,\n maxPerElement: 1,\n allowFrom: null,\n ignoreFrom: null,\n },\n },\n setActionDefaults: function (action) {\n utils.extend(action.defaults, autoStart.defaults.perAction);\n },\n};\n\n// set cursor style on mousedown\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget }) {\n if (interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\n// set cursor style on mousemove\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget }) {\n if (!interaction.mouse\n || interaction.pointerIsDown\n || interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\nInteraction.signals.on('move', function (arg) {\n const { interaction, event } = arg;\n\n if (!interaction.pointerIsDown\n || interaction.interacting()\n || !interaction.pointerWasMoved\n || !interaction.prepared.name) {\n return;\n }\n\n signals.fire('before-start', arg);\n\n const target = interaction.target;\n\n if (interaction.prepared.name && target) {\n // check manualStart and interaction limit\n if (target.options[interaction.prepared.name].manualStart\n || !withinInteractionLimit(target, interaction.element, interaction.prepared)) {\n interaction.stop(event);\n }\n else {\n interaction.start(interaction.prepared, target, interaction.element);\n }\n }\n});\n\n// Check if the current target supports the action.\n// If so, return the validated action. Otherwise, return null\nfunction validateAction (action, interactable, element, eventTarget) {\n if (utils.is.object(action)\n && interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget)\n && interactable.options[action.name].enabled\n && withinInteractionLimit(interactable, element, action)) {\n return action;\n }\n\n return null;\n}\n\nfunction validateSelector (interaction, pointer, event, matches, matchElements, eventTarget) {\n for (let i = 0, len = matches.length; i < len; i++) {\n const match = matches[i];\n const matchElement = matchElements[i];\n const action = validateAction(match.getAction(pointer, event, interaction, matchElement),\n match,\n matchElement,\n eventTarget);\n\n if (action) {\n return {\n action,\n target: match,\n element: matchElement,\n };\n }\n }\n\n return {};\n}\n\nfunction getActionInfo (interaction, pointer, event, eventTarget) {\n let matches = [];\n let matchElements = [];\n\n let element = eventTarget;\n let action = null;\n\n function pushMatches (interactable, selector, context) {\n const elements = (browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined);\n\n if (utils.matchesSelector(element, selector, elements)) {\n\n matches.push(interactable);\n matchElements.push(element);\n }\n }\n\n while (utils.is.element(element)) {\n matches = [];\n matchElements = [];\n\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && (action = validateAction(elementInteractable.getAction(pointer, event, interaction, element, eventTarget),\n elementInteractable,\n element,\n eventTarget))\n && !elementInteractable.options[action.name].manualStart) {\n return {\n element,\n action,\n target: elementInteractable,\n };\n }\n else {\n scope.interactables.forEachSelector(pushMatches, element);\n\n const actionInfo = validateSelector(interaction, pointer, event, matches, matchElements, eventTarget);\n\n if (actionInfo.action\n && !actionInfo.target.options[actionInfo.action.name].manualStart) {\n return actionInfo;\n }\n }\n\n element = utils.parentNode(element);\n }\n\n return {};\n}\n\nfunction prepare (interaction, { action, target, element }) {\n action = action || {};\n\n if (interaction.target && interaction.target.options.styleCursor) {\n interaction.target._doc.documentElement.style.cursor = '';\n }\n\n interaction.target = target;\n interaction.element = element;\n utils.copyAction(interaction.prepared, action);\n\n if (target && target.options.styleCursor) {\n const cursor = action? actions[action.name].getCursor(action) : '';\n interaction.target._doc.documentElement.style.cursor = cursor;\n }\n\n signals.fire('prepared', { interaction: interaction });\n}\n\nInteraction.signals.on('stop', function ({ interaction }) {\n const target = interaction.target;\n\n if (target && target.options.styleCursor) {\n target._doc.documentElement.style.cursor = '';\n }\n});\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (utils.is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (utils.is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n const buttons = event.buttons || ({\n 0: 1,\n 1: 4,\n 3: 8,\n 4: 16,\n })[event.button];\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\nfunction withinInteractionLimit (interactable, element, action) {\n const options = interactable.options;\n const maxActions = options[action.name].max;\n const maxPerElement = options[action.name].maxPerElement;\n let activeInteractions = 0;\n let targetCount = 0;\n let targetElementCount = 0;\n\n // no actions if any of these values == 0\n if (!(maxActions && maxPerElement && autoStart.maxInteractions)) { return; }\n\n for (let i = 0, len = scope.interactions.length; i < len; i++) {\n const interaction = scope.interactions[i];\n const otherAction = interaction.prepared.name;\n\n if (!interaction.interacting()) { continue; }\n\n activeInteractions++;\n\n if (activeInteractions >= autoStart.maxInteractions) {\n return false;\n }\n\n if (interaction.target !== interactable) { continue; }\n\n targetCount += (otherAction === action.name)|0;\n\n if (targetCount >= maxActions) {\n return false;\n }\n\n if (interaction.element === element) {\n targetElementCount++;\n\n if (otherAction !== action.name || targetElementCount >= maxPerElement) {\n return false;\n }\n }\n }\n\n return autoStart.maxInteractions > 0;\n}\n\n/*\\\n * interact.maxInteractions\n [ method ]\n **\n * Returns or sets the maximum number of concurrent interactions allowed.\n * By default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables\n * and elements, you need to enable it in the draggable, resizable and\n * gesturable `'max'` and `'maxPerElement'` options.\n **\n - newValue (number) #optional Any number. newValue <= 0 means no interactions.\n\\*/\ninteract.maxInteractions = function (newValue) {\n if (utils.is.number(newValue)) {\n autoStart.maxInteractions = newValue;\n\n return this;\n }\n\n return autoStart.maxInteractions;\n};\n\nInteractable.settingsMethods.push('styleCursor');\nInteractable.settingsMethods.push('actionChecker');\nInteractable.settingsMethods.push('ignoreFrom');\nInteractable.settingsMethods.push('allowFrom');\n\ndefaultOptions.base.actionChecker = null;\ndefaultOptions.base.styleCursor = true;\n\nutils.extend(defaultOptions.perAction, autoStart.defaults.perAction);\n\nmodule.exports = autoStart;\n","const autoStart = require('./base');\nconst Interaction = require('../Interaction');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.delayTimer = null;\n});\n\nautoStart.signals.on('prepared', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.delayTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.target, interaction.element);\n }, delay);\n }\n});\n\nInteraction.signals.on('move', function ({ interaction, duplicate }) {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.delayTimer);\n }\n});\n\n// prevent regular down->move autoStart\nautoStart.signals.on('before-start', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.prepared.name = null;\n }\n});\n","const autoStart = require('./base');\nconst scope = require('../scope');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\n\nconst { matchesSelector, parentNode } = require('../utils/domUtils');\n\nautoStart.setActionDefaults(require('../actions/drag'));\n\nautoStart.signals.on('before-start', function ({ interaction, eventTarget, dx, dy }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // check if a drag is in the correct axis\n const absX = Math.abs(dx);\n const absY = Math.abs(dy);\n const options = interaction.target.options.drag;\n const startAxis = options.startAxis;\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy');\n\n interaction.prepared.axis = options.lockAxis === 'start'\n ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n : options.lockAxis;\n\n // if the movement isn't in the startAxis of the interactable\n if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) {\n // cancel the prepared action\n interaction.prepared.name = null;\n\n // then try to get a drag from another ineractable\n\n if (!interaction.prepared.name) {\n\n let element = eventTarget;\n\n const getDraggable = function (interactable, selector, context) {\n const elements = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n if (interactable === interaction.target) { return; }\n\n if (!options.manualStart\n && !interactable.testIgnoreAllow(options, element, eventTarget)\n && matchesSelector(element, selector, elements)) {\n\n const action = interactable.getAction(interaction.downPointer,\n interaction.downEvent,\n interaction,\n element);\n\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, interactable)\n && autoStart.validateAction(action, interactable, element, eventTarget)) {\n\n return interactable;\n }\n }\n };\n\n let action = null;\n\n // check all interactables\n while (is.element(element)) {\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && elementInteractable !== interaction.target\n && !elementInteractable.options.drag.manualStart) {\n\n action = elementInteractable.getAction(interaction.downPointer, interaction.downEvent, interaction, element);\n }\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, elementInteractable)) {\n\n interaction.prepared.name = 'drag';\n interaction.target = elementInteractable;\n interaction.element = element;\n break;\n }\n\n const selectorInteractable = scope.interactables.forEachSelector(getDraggable, element);\n\n if (selectorInteractable) {\n interaction.prepared.name = 'drag';\n interaction.target = selectorInteractable;\n interaction.element = element;\n break;\n }\n\n element = parentNode(element);\n }\n }\n }\n});\n\nfunction checkStartAxis (startAxis, interactable) {\n if (!interactable) { return false; }\n\n const thisAxis = interactable.options.drag.startAxis;\n\n return (startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis);\n}\n","require('./base').setActionDefaults(require('../actions/gesture'));\n","require('./base').setActionDefaults(require('../actions/resize'));\n","module.exports = {\n base: {\n accept : null,\n preventDefault: 'auto',\n deltaSource : 'page',\n },\n\n perAction: {\n origin: { x: 0, y: 0 },\n\n // only allow left button by default\n // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n mouseButtons: 1,\n\n inertia: {\n enabled : false,\n resistance : 10, // the lambda in exponential decay\n minSpeed : 100, // target speed must be above this for inertia to start\n endSpeed : 10, // the speed at which inertia is slow enough to stop\n allowResume : true, // allow resuming an action in inertia phase\n smoothEndDuration: 300, // animate to snap/restrict endOnly if there's no inertia\n },\n },\n};\n","/* browser entry point */\n\n// Legacy browser support\nrequire('./legacyBrowsers');\n\n// inertia\nrequire('./inertia');\n\n// modifiers\nrequire('./modifiers/snap');\nrequire('./modifiers/restrict');\n\n// pointerEvents\nrequire('./pointerEvents/base');\nrequire('./pointerEvents/holdRepeat');\nrequire('./pointerEvents/interactableTargets');\n\n// delay\nrequire('./autoStart/delay');\n\n// actions\nrequire('./actions/gesture');\nrequire('./actions/resize');\nrequire('./actions/drag');\nrequire('./actions/drop');\n\n// load these modifiers after resize is loaded\nrequire('./modifiers/snapSize');\nrequire('./modifiers/restrictEdges');\nrequire('./modifiers/restrictSize');\n\n// autoStart actions\nrequire('./autoStart/gesture');\nrequire('./autoStart/resize');\nrequire('./autoStart/drag');\n\n// Interactable preventDefault setting\nrequire('./interactablePreventDefault.js');\n\n// autoScroll\nrequire('./autoScroll');\n\n// export interact\nmodule.exports = require('./interact');\n","const InteractEvent = require('./InteractEvent');\nconst Interaction = require('./Interaction');\nconst modifiers = require('./modifiers');\nconst utils = require('./utils');\nconst animationFrame = require('./utils/raf');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.inertiaStatus = {\n active : false,\n smoothEnd : false,\n allowResume: false,\n\n startEvent: null,\n upCoords : {},\n\n xe: 0, ye: 0,\n sx: 0, sy: 0,\n\n t0: 0,\n vx0: 0, vys: 0,\n duration: 0,\n\n lambda_v0: 0,\n one_ve_v0: 0,\n i : null,\n };\n\n interaction.boundInertiaFrame = () => inertiaFrame .apply(interaction);\n interaction.boundSmoothEndFrame = () => smoothEndFrame.apply(interaction);\n});\n\nInteraction.signals.on('down', function ({ interaction, event, pointer, eventTarget }) {\n const status = interaction.inertiaStatus;\n\n // Check if the down event hits the current inertia target\n if (status.active) {\n let element = eventTarget;\n\n // climb up the DOM tree from the event target\n while (utils.is.element(element)) {\n\n // if interaction element is the current inertia target element\n if (element === interaction.element) {\n // stop inertia\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n\n // update pointers to the down event's coordinates\n interaction.updatePointer(pointer);\n utils.setCoords(interaction.curCoords, interaction.pointers);\n\n // fire appropriate signals\n const signalArg = { interaction };\n Interaction.signals.fire('before-action-move', signalArg);\n Interaction.signals.fire('action-resume' , signalArg);\n\n // fire a reume event\n const resumeEvent = new InteractEvent(interaction,\n event,\n interaction.prepared.name,\n 'inertiaresume',\n interaction.element);\n\n interaction.target.fire(resumeEvent);\n interaction.prevEvent = resumeEvent;\n modifiers.resetStatuses(interaction.modifierStatuses);\n\n utils.copyCoords(interaction.prevCoords, interaction.curCoords);\n break;\n }\n\n element = utils.parentNode(element);\n }\n }\n});\n\nInteraction.signals.on('up', function ({ interaction, event }) {\n const status = interaction.inertiaStatus;\n\n if (!interaction.interacting() || status.active) { return; }\n\n const target = interaction.target;\n const options = target && target.options;\n const inertiaOptions = options && interaction.prepared.name && options[interaction.prepared.name].inertia;\n\n const now = new Date().getTime();\n const statuses = {};\n const page = utils.extend({}, interaction.curCoords.page);\n const pointerSpeed = interaction.pointerDelta.client.speed;\n\n let smoothEnd = false;\n let modifierResult;\n\n // check if inertia should be started\n const inertiaPossible = (inertiaOptions && inertiaOptions.enabled\n && interaction.prepared.name !== 'gesture'\n && event !== status.startEvent);\n\n const inertia = (inertiaPossible\n && (now - interaction.curCoords.timeStamp) < 50\n && pointerSpeed > inertiaOptions.minSpeed\n && pointerSpeed > inertiaOptions.endSpeed);\n\n const modifierArg = {\n interaction,\n pageCoords: page,\n statuses,\n preEnd: true,\n requireEndOnly: true,\n };\n\n // smoothEnd\n if (inertiaPossible && !inertia) {\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n if (modifierResult.shouldMove && modifierResult.locked) {\n smoothEnd = true;\n }\n }\n\n if (!(inertia || smoothEnd)) { return; }\n\n utils.copyCoords(status.upCoords, interaction.curCoords);\n\n interaction.pointers[0] = status.startEvent =\n new InteractEvent(interaction, event, interaction.prepared.name, 'inertiastart', interaction.element);\n\n status.t0 = now;\n\n status.active = true;\n status.allowResume = inertiaOptions.allowResume;\n interaction.simulation = status;\n\n target.fire(status.startEvent);\n\n if (inertia) {\n status.vx0 = interaction.pointerDelta.client.vx;\n status.vy0 = interaction.pointerDelta.client.vy;\n status.v0 = pointerSpeed;\n\n calcInertia(interaction, status);\n\n utils.extend(page, interaction.curCoords.page);\n\n page.x += status.xe;\n page.y += status.ye;\n\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n status.modifiedXe += modifierResult.dx;\n status.modifiedYe += modifierResult.dy;\n\n status.i = animationFrame.request(interaction.boundInertiaFrame);\n }\n else {\n status.smoothEnd = true;\n status.xe = modifierResult.dx;\n status.ye = modifierResult.dy;\n\n status.sx = status.sy = 0;\n\n status.i = animationFrame.request(interaction.boundSmoothEndFrame);\n }\n});\n\nInteraction.signals.on('stop-active', function ({ interaction }) {\n const status = interaction.inertiaStatus;\n\n if (status.active) {\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n }\n});\n\nfunction calcInertia (interaction, status) {\n const inertiaOptions = interaction.target.options[interaction.prepared.name].inertia;\n const lambda = inertiaOptions.resistance;\n const inertiaDur = -Math.log(inertiaOptions.endSpeed / status.v0) / lambda;\n\n status.x0 = interaction.prevEvent.pageX;\n status.y0 = interaction.prevEvent.pageY;\n status.t0 = status.startEvent.timeStamp / 1000;\n status.sx = status.sy = 0;\n\n status.modifiedXe = status.xe = (status.vx0 - inertiaDur) / lambda;\n status.modifiedYe = status.ye = (status.vy0 - inertiaDur) / lambda;\n status.te = inertiaDur;\n\n status.lambda_v0 = lambda / status.v0;\n status.one_ve_v0 = 1 - inertiaOptions.endSpeed / status.v0;\n}\n\nfunction inertiaFrame () {\n updateInertiaCoords(this);\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n\n const status = this.inertiaStatus;\n const options = this.target.options[this.prepared.name].inertia;\n const lambda = options.resistance;\n const t = new Date().getTime() / 1000 - status.t0;\n\n if (t < status.te) {\n\n const progress = 1 - (Math.exp(-lambda * t) - status.lambda_v0) / status.one_ve_v0;\n\n if (status.modifiedXe === status.xe && status.modifiedYe === status.ye) {\n status.sx = status.xe * progress;\n status.sy = status.ye * progress;\n }\n else {\n const quadPoint = utils.getQuadraticCurvePoint(0, 0,\n status.xe,\n status.ye,\n status.modifiedXe,\n status.modifiedYe,\n progress);\n\n status.sx = quadPoint.x;\n status.sy = quadPoint.y;\n }\n\n this.doMove();\n\n status.i = animationFrame.request(this.boundInertiaFrame);\n }\n else {\n status.sx = status.modifiedXe;\n status.sy = status.modifiedYe;\n\n this.doMove();\n this.end(status.startEvent);\n status.active = false;\n this.simulation = null;\n }\n\n utils.copyCoords(this.prevCoords, this.curCoords);\n}\n\nfunction smoothEndFrame () {\n updateInertiaCoords(this);\n\n const status = this.inertiaStatus;\n const t = new Date().getTime() - status.t0;\n const duration = this.target.options[this.prepared.name].inertia.smoothEndDuration;\n\n if (t < duration) {\n status.sx = utils.easeOutQuad(t, 0, status.xe, duration);\n status.sy = utils.easeOutQuad(t, 0, status.ye, duration);\n\n this.pointerMove(status.startEvent, status.startEvent);\n\n status.i = animationFrame.request(this.boundSmoothEndFrame);\n }\n else {\n status.sx = status.xe;\n status.sy = status.ye;\n\n this.pointerMove(status.startEvent, status.startEvent);\n this.end(status.startEvent);\n\n status.smoothEnd =\n status.active = false;\n this.simulation = null;\n }\n}\n\nfunction updateInertiaCoords (interaction) {\n const status = interaction.inertiaStatus;\n\n // return if inertia isn't running\n if (!status.active) { return; }\n\n const pageUp = status.upCoords.page;\n const clientUp = status.upCoords.client;\n\n utils.setCoords(interaction.curCoords, [ {\n pageX : pageUp.x + status.sx,\n pageY : pageUp.y + status.sy,\n clientX: clientUp.x + status.sx,\n clientY: clientUp.y + status.sy,\n } ]);\n}\n","const browser = require('./utils/browser');\nconst events = require('./utils/events');\nconst utils = require('./utils');\nconst scope = require('./scope');\nconst Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\n\nconst globalEvents = {};\n\n/*\\\n * interact\n [ method ]\n *\n * The methods of this variable can be used to set elements as\n * interactables and also to change various default settings.\n *\n * Calling it as a function and passing an element or a valid CSS selector\n * string returns an Interactable object which has various methods to\n * configure it.\n *\n - element (Element | string) The HTML or SVG Element to interact with or CSS selector\n = (object) An @Interactable\n *\n > Usage\n | interact('#draggable').draggable(true);\n |\n | var rectables = interact('rect');\n | rectables\n | .gesturable(true)\n | .on('gesturemove', function (event) {\n | // ...\n | });\n\\*/\nfunction interact (element, options) {\n let interactable = scope.interactables.get(element, options);\n\n if (!interactable) {\n interactable = new Interactable(element, options);\n interactable.events.global = globalEvents;\n }\n\n return interactable;\n}\n\n/*\\\n * interact.isSet\n [ method ]\n *\n * Check if an element has been set\n - element (Element) The Element being searched for\n = (boolean) Indicates if the element or CSS selector was previously passed to interact\n\\*/\ninteract.isSet = function (element, options) {\n return scope.interactables.indexOfElement(element, options && options.context) !== -1;\n};\n\n/*\\\n * interact.on\n [ method ]\n *\n * Adds a global listener for an InteractEvent or adds a DOM event to\n * `document`\n *\n - type (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) interact\n\\*/\ninteract.on = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.on(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.on(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n // if it is an InteractEvent type, add listener to globalEvents\n if (utils.contains(Interactable.eventTypes, type)) {\n // if this type of event was never bound\n if (!globalEvents[type]) {\n globalEvents[type] = [listener];\n }\n else {\n globalEvents[type].push(listener);\n }\n }\n // If non InteractEvent type, addEventListener to document\n else {\n events.add(scope.document, type, listener, { options });\n }\n\n return interact;\n};\n\n/*\\\n * interact.off\n [ method ]\n *\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n - type (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) interact\n \\*/\ninteract.off = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.off(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.off(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n if (!utils.contains(Interactable.eventTypes, type)) {\n events.remove(scope.document, type, listener, options);\n }\n else {\n let index;\n\n if (type in globalEvents\n && (index = utils.indexOf(globalEvents[type], listener)) !== -1) {\n globalEvents[type].splice(index, 1);\n }\n }\n\n return interact;\n};\n\n/*\\\n * interact.debug\n [ method ]\n *\n * Returns an object which exposes internal data\n = (object) An object with properties that outline the current state and expose internal functions and variables\n\\*/\ninteract.debug = function () {\n return scope;\n};\n\n// expose the functions used to calculate multi-touch properties\ninteract.getPointerAverage = utils.pointerAverage;\ninteract.getTouchBBox = utils.touchBBox;\ninteract.getTouchDistance = utils.touchDistance;\ninteract.getTouchAngle = utils.touchAngle;\n\ninteract.getElementRect = utils.getElementRect;\ninteract.getElementClientRect = utils.getElementClientRect;\ninteract.matchesSelector = utils.matchesSelector;\ninteract.closest = utils.closest;\n\n/*\\\n * interact.supportsTouch\n [ method ]\n *\n = (boolean) Whether or not the browser supports touch input\n\\*/\ninteract.supportsTouch = function () {\n return browser.supportsTouch;\n};\n\n/*\\\n * interact.supportsPointerEvent\n [ method ]\n *\n = (boolean) Whether or not the browser supports PointerEvents\n\\*/\ninteract.supportsPointerEvent = function () {\n return browser.supportsPointerEvent;\n};\n\n/*\\\n * interact.stop\n [ method ]\n *\n * Cancels all interactions (end events are not fired)\n *\n - event (Event) An event on which to call preventDefault()\n = (object) interact\n\\*/\ninteract.stop = function (event) {\n for (let i = scope.interactions.length - 1; i >= 0; i--) {\n scope.interactions[i].stop(event);\n }\n\n return interact;\n};\n\n/*\\\n * interact.pointerMoveTolerance\n [ method ]\n * Returns or sets the distance the pointer must be moved before an action\n * sequence occurs. This also affects tolerance for tap events.\n *\n - newValue (number) #optional The movement from the start position must be greater than this value\n = (number | Interactable) The current setting or interact\n\\*/\ninteract.pointerMoveTolerance = function (newValue) {\n if (utils.is.number(newValue)) {\n Interaction.pointerMoveTolerance = newValue;\n\n return this;\n }\n\n return Interaction.pointerMoveTolerance;\n};\n\ninteract.addDocument = scope.addDocument;\ninteract.removeDocument = scope.removeDocument;\n\nscope.interact = interact;\n\nmodule.exports = interact;\n","const Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\nconst scope = require('./scope');\nconst is = require('./utils/is');\nconst events = require('./utils/events');\n\nconst { nodeContains, matchesSelector } = require('./utils/domUtils');\n\n/*\\\n * Interactable.preventDefault\n [ method ]\n *\n * Returns or sets whether to prevent the browser's default behaviour\n * in response to pointer events. Can be set to:\n * - `'always'` to always prevent\n * - `'never'` to never prevent\n * - `'auto'` to let interact.js try to determine what would be best\n *\n - newValue (string) #optional `true`, `false` or `'auto'`\n = (string | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.preventDefault = function (newValue) {\n if (/^(always|never|auto)$/.test(newValue)) {\n this.options.preventDefault = newValue;\n return this;\n }\n\n if (is.bool(newValue)) {\n this.options.preventDefault = newValue? 'always' : 'never';\n return this;\n }\n\n return this.options.preventDefault;\n};\n\nInteractable.prototype.checkAndPreventDefault = function (event) {\n const setting = this.options.preventDefault;\n\n if (setting === 'never') { return; }\n\n if (setting === 'always') {\n event.preventDefault();\n return;\n }\n\n // setting === 'auto'\n\n // don't preventDefault if the browser supports passiveEvents\n // CSS touch-action and user-selecct should be used instead\n if (events.supportsOptions) {\n return;\n }\n\n // don't preventDefault of pointerdown events\n if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) {\n return;\n }\n\n // don't preventDefault on editable elements\n if (is.element(event.target)\n && matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) {\n return;\n }\n\n event.preventDefault();\n};\n\nfunction onInteractionEvent ({ interaction, event }) {\n if (interaction.target) {\n interaction.target.checkAndPreventDefault(event);\n }\n}\n\nfor (const eventSignal of ['down', 'move', 'up', 'cancel']) {\n Interaction.signals.on(eventSignal, onInteractionEvent);\n}\n\n// prevent native HTML5 drag on interact.js target elements\nInteraction.docEvents.dragstart = function preventNativeDrag (event) {\n for (const interaction of scope.interactions) {\n\n if (interaction.element\n && (interaction.element === event.target\n || nodeContains(interaction.element, event.target))) {\n\n interaction.target.checkAndPreventDefault(event);\n return;\n }\n }\n};\n","const scope = require('./scope');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst iFinder = require('./utils/interactionFinder');\nconst pointerEvents = require('./pointerEvents/base');\n\nconst { window } = require('./utils/window');\n\nconst toString = Object.prototype.toString;\n\nif (!window.Array.isArray) {\n window.Array.isArray = function (obj) {\n return toString.call(obj) === '[object Array]';\n };\n}\n\nif (!String.prototype.trim) {\n String.prototype.trim = function () {\n return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n };\n}\n\n// http://www.quirksmode.org/dom/events/click.html\n// >Events leading to dblclick\n//\n// IE8 doesn't fire down event before dblclick.\n// This workaround tries to fire a tap and doubletap after dblclick\nfunction onIE8Dblclick (event) {\n const eventTarget = event.target;\n const interaction = iFinder.search(event, event.type, eventTarget);\n\n if (!interaction) { return; }\n\n if (interaction.prevTap\n && event.clientX === interaction.prevTap.clientX\n && event.clientY === interaction.prevTap.clientY\n && eventTarget === interaction.prevTap.target) {\n\n interaction.downTargets[0] = eventTarget;\n interaction.downTimes [0] = new Date().getTime();\n\n pointerEvents.fire({\n interaction,\n event,\n eventTarget,\n pointer: event,\n type: 'tap',\n });\n }\n}\n\nif (browser.isIE8) {\n const selectFix = function (event) {\n for (const interaction of scope.interactions) {\n if (interaction.interacting()) {\n interaction.target.checkAndPreventDefault(event);\n }\n }\n };\n\n const onDocIE8 = function onDocIE8 ({ doc, win }, signalName) {\n const eventMethod = signalName.indexOf('listen') === 0\n ? events.add : events.remove;\n\n // For IE's lack of Event#preventDefault\n eventMethod(doc, 'selectstart', selectFix);\n\n if (pointerEvents) {\n eventMethod(doc, 'dblclick', onIE8Dblclick);\n }\n };\n\n scope.signals.on('add-document' , onDocIE8);\n scope.signals.on('remove-document', onDocIE8);\n}\n\nmodule.exports = null;\n","const InteractEvent = require('../InteractEvent');\nconst Interaction = require('../Interaction');\nconst extend = require('../utils/extend');\n\nconst modifiers = {\n names: [],\n\n setOffsets: function (arg) {\n const { interaction, pageCoords: page } = arg;\n const { target, element, startOffset } = interaction;\n const rect = target.getRect(element);\n\n if (rect) {\n startOffset.left = page.x - rect.left;\n startOffset.top = page.y - rect.top;\n\n startOffset.right = rect.right - page.x;\n startOffset.bottom = rect.bottom - page.y;\n\n if (!('width' in rect)) { rect.width = rect.right - rect.left; }\n if (!('height' in rect)) { rect.height = rect.bottom - rect.top ; }\n }\n else {\n startOffset.left = startOffset.top = startOffset.right = startOffset.bottom = 0;\n }\n\n arg.rect = rect;\n arg.interactable = target;\n arg.element = element;\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n\n arg.options = target.options[interaction.prepared.name][modifierName];\n\n if (!arg.options) {\n continue;\n }\n\n interaction.modifierOffsets[modifierName] = modifiers[modifierName].setOffset(arg);\n }\n },\n\n setAll: function (arg) {\n const { interaction, statuses, preEnd, requireEndOnly } = arg;\n const coords = extend({}, arg.pageCoords);\n const result = {\n dx: 0,\n dy: 0,\n changed: false,\n locked: false,\n shouldMove: true,\n };\n\n for (const modifierName of modifiers.names) {\n const modifier = modifiers[modifierName];\n const options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!shouldDo(options, preEnd, requireEndOnly)) { continue; }\n\n arg.status = arg.status = statuses[modifierName];\n arg.options = options;\n arg.offset = arg.interaction.modifierOffsets[modifierName];\n\n modifier.set(arg);\n\n if (arg.status.locked) {\n coords.x += arg.status.dx;\n coords.y += arg.status.dy;\n\n result.dx += arg.status.dx;\n result.dy += arg.status.dy;\n\n result.locked = true;\n }\n }\n\n // a move should be fired if:\n // - there are no modifiers enabled,\n // - no modifiers are \"locked\" i.e. have changed the pointer's coordinates, or\n // - the locked coords have changed since the last pointer move\n result.shouldMove = !arg.status || !result.locked || arg.status.changed;\n\n return result;\n },\n\n resetStatuses: function (statuses) {\n for (const modifierName of modifiers.names) {\n const status = statuses[modifierName] || {};\n\n status.dx = status.dy = 0;\n status.modifiedX = status.modifiedY = NaN;\n status.locked = false;\n status.changed = true;\n\n statuses[modifierName] = status;\n }\n\n return statuses;\n },\n\n start: function ({ interaction }, signalName) {\n const arg = {\n interaction,\n pageCoords: (signalName === 'action-resume' ?\n interaction.curCoords : interaction.startCoords).page,\n startOffset: interaction.startOffset,\n statuses: interaction.modifierStatuses,\n preEnd: false,\n requireEndOnly: false,\n };\n\n modifiers.setOffsets(arg);\n modifiers.resetStatuses(arg.statuses);\n\n arg.pageCoords = extend({}, interaction.startCoords.page);\n interaction.modifierResult = modifiers.setAll(arg);\n },\n};\n\nInteraction.signals.on('new', function (interaction) {\n interaction.startOffset = { left: 0, right: 0, top: 0, bottom: 0 };\n interaction.modifierOffsets = {};\n interaction.modifierStatuses = modifiers.resetStatuses({});\n interaction.modifierResult = null;\n});\n\nInteraction.signals.on('action-start' , modifiers.start);\nInteraction.signals.on('action-resume', modifiers.start);\n\nInteraction.signals.on('before-action-move', function ({ interaction, preEnd, interactingBeforeMove }) {\n const modifierResult = modifiers.setAll({\n interaction,\n preEnd,\n pageCoords: interaction.curCoords.page,\n statuses: interaction.modifierStatuses,\n requireEndOnly: false,\n });\n\n // don't fire an action move if a modifier would keep the event in the same\n // cordinates as before\n if (!modifierResult.shouldMove && interactingBeforeMove) {\n interaction._dontFireMove = true;\n }\n\n interaction.modifierResult = modifierResult;\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n for (let i = 0; i < modifiers.names.length; i++) {\n const options = interaction.target.options[interaction.prepared.name][modifiers.names[i]];\n\n // if the endOnly option is true for any modifier\n if (shouldDo(options, true, true)) {\n // fire a move event at the modified coordinates\n interaction.doMove({ event, preEnd: true });\n break;\n }\n }\n});\n\nInteractEvent.signals.on('set-xy', function (arg) {\n const { iEvent, interaction } = arg;\n const modifierArg = extend({}, arg);\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n modifierArg.options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!modifierArg.options) {\n continue;\n }\n\n const modifier = modifiers[modifierName];\n\n modifierArg.status = interaction.modifierStatuses[modifierName];\n\n iEvent[modifierName] = modifier.modifyCoords(modifierArg);\n }\n});\n\nfunction shouldDo (options, preEnd, requireEndOnly) {\n return (options && options.enabled\n && (preEnd || !options.endOnly)\n && (!requireEndOnly || options.endOnly));\n}\n\nmodule.exports = modifiers;\n","const modifiers = require('./index');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst restrict = {\n defaults: {\n enabled : false,\n endOnly : false,\n restriction: null,\n elementRect: null,\n },\n\n setOffset: function ({ rect, startOffset, options }) {\n const elementRect = options && options.elementRect;\n const offset = {};\n\n if (rect && elementRect) {\n offset.left = startOffset.left - (rect.width * elementRect.left);\n offset.top = startOffset.top - (rect.height * elementRect.top);\n\n offset.right = startOffset.right - (rect.width * (1 - elementRect.right));\n offset.bottom = startOffset.bottom - (rect.height * (1 - elementRect.bottom));\n }\n else {\n offset.left = offset.top = offset.right = offset.bottom = 0;\n }\n\n return offset;\n },\n\n set: function ({ pageCoords, interaction, status, options }) {\n if (!options) { return status; }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n\n const restriction = getRestrictionRect(options.restriction, interaction, page);\n\n if (!restriction) { return status; }\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n const rect = restriction;\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n const offset = interaction.modifierOffsets.restrict;\n\n // object is assumed to have\n // x, y, width, height or\n // left, top, right, bottom\n if ('x' in restriction && 'y' in restriction) {\n modifiedX = Math.max(Math.min(rect.x + rect.width - offset.right , page.x), rect.x + offset.left);\n modifiedY = Math.max(Math.min(rect.y + rect.height - offset.bottom, page.y), rect.y + offset.top );\n }\n else {\n modifiedX = Math.max(Math.min(rect.right - offset.right , page.x), rect.left + offset.left);\n modifiedY = Math.max(Math.min(rect.bottom - offset.bottom, page.y), rect.top + offset.top );\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const elementRect = options && options.elementRect;\n\n if (options && options.enabled\n && !(phase === 'start' && elementRect && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n getRestrictionRect,\n};\n\nfunction getRestrictionRect (value, interaction, page) {\n if (utils.is.function(value)) {\n return utils.resolveRectLike(value, interaction.target, interaction.element, [page.x, page.y, interaction]);\n } else {\n return utils.resolveRectLike(value, interaction.target, interaction.element);\n }\n}\n\nmodifiers.restrict = restrict;\nmodifiers.names.push('restrict');\n\ndefaultOptions.perAction.restrict = restrict.defaults;\n\nmodule.exports = restrict;\n","// This module adds the options.resize.restrictEdges setting which sets min and\n// max for the top, left, bottom and right edges of the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictEdges: {\n// inner: { top: 200, left: 200, right: 400, bottom: 400 },\n// outer: { top: 0, left: 0, right: 600, bottom: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst { getRestrictionRect } = require('./restrict');\n\nconst noInner = { top: +Infinity, left: +Infinity, bottom: -Infinity, right: -Infinity };\nconst noOuter = { top: -Infinity, left: -Infinity, bottom: +Infinity, right: +Infinity };\n\nconst restrictEdges = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n offset: null,\n },\n\n setOffset: function ({ interaction, startOffset, options }) {\n if (!options) {\n return utils.extend({}, startOffset);\n }\n\n const offset = getRestrictionRect(options.offset, interaction, interaction.startCoords.page);\n\n if (offset) {\n return {\n top: startOffset.top + offset.y,\n left: startOffset.left + offset.x,\n bottom: startOffset.bottom + offset.y,\n right: startOffset.right + offset.x,\n };\n }\n\n return startOffset;\n },\n\n set: function ({ pageCoords, interaction, status, offset, options }) {\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n const inner = rectUtils.xywhToTlbr(getRestrictionRect(options.inner, interaction, page)) || noInner;\n const outer = rectUtils.xywhToTlbr(getRestrictionRect(options.outer, interaction, page)) || noOuter;\n\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n if (edges.top) {\n modifiedY = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top);\n }\n else if (edges.bottom) {\n modifiedY = Math.max(Math.min(outer.bottom - offset.bottom, page.y), inner.bottom - offset.bottom);\n }\n if (edges.left) {\n modifiedX = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left);\n }\n else if (edges.right) {\n modifiedX = Math.max(Math.min(outer.right - offset.right, page.x), inner.right - offset.right);\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n if (options && options.enabled\n && !(phase === 'start' && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n noInner,\n noOuter,\n getRestrictionRect,\n};\n\nmodifiers.restrictEdges = restrictEdges;\nmodifiers.names.push('restrictEdges');\n\ndefaultOptions.perAction.restrictEdges = restrictEdges.defaults;\nresize.defaults.restrictEdges = restrictEdges.defaults;\n\nmodule.exports = restrictEdges;\n","// This module adds the options.resize.restrictSize setting which sets min and\n// max width and height for the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictSize: {\n// min: { width: -600, height: -600 },\n// max: { width: 600, height: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst restrictEdges = require('./restrictEdges');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst noMin = { width: -Infinity, height: -Infinity };\nconst noMax = { width: +Infinity, height: +Infinity };\n\nconst restrictSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n },\n\n setOffset: function ({ interaction }) {\n return interaction.startOffset;\n },\n\n set: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const rect = rectUtils.xywhToTlbr(interaction.resizeRects.inverted);\n\n const minSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.min, interaction)) || noMin;\n const maxSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.max, interaction)) || noMax;\n\n arg.options = {\n enabled: options.enabled,\n endOnly: options.endOnly,\n inner: utils.extend({}, restrictEdges.noInner),\n outer: utils.extend({}, restrictEdges.noOuter),\n };\n\n if (edges.top) {\n arg.options.inner.top = rect.bottom - minSize.height;\n arg.options.outer.top = rect.bottom - maxSize.height;\n }\n else if (edges.bottom) {\n arg.options.inner.bottom = rect.top + minSize.height;\n arg.options.outer.bottom = rect.top + maxSize.height;\n }\n if (edges.left) {\n arg.options.inner.left = rect.right - minSize.width;\n arg.options.outer.left = rect.right - maxSize.width;\n }\n else if (edges.right) {\n arg.options.inner.right = rect.left + minSize.width;\n arg.options.outer.right = rect.left + maxSize.width;\n }\n\n restrictEdges.set(arg);\n },\n\n modifyCoords: restrictEdges.modifyCoords,\n};\n\nmodifiers.restrictSize = restrictSize;\nmodifiers.names.push('restrictSize');\n\ndefaultOptions.perAction.restrictSize = restrictSize.defaults;\nresize.defaults.restrictSize = restrictSize.defaults;\n\nmodule.exports = restrictSize;\n","const modifiers = require('./index');\nconst interact = require('../interact');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst snap = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n\n relativePoints: null,\n },\n\n setOffset: function ({ interaction, interactable, element, rect, startOffset, options }) {\n const offsets = [];\n const optionsOrigin = utils.rectToXY(utils.resolveRectLike(options.origin));\n const origin = optionsOrigin || utils.getOriginXY(interactable, element, interaction.prepared.name);\n options = options || interactable.options[interaction.prepared.name].snap || {};\n\n let snapOffset;\n\n if (options.offset === 'startCoords') {\n snapOffset = {\n x: interaction.startCoords.page.x - origin.x,\n y: interaction.startCoords.page.y - origin.y,\n };\n }\n else {\n const offsetRect = utils.resolveRectLike(options.offset, interactable, element, [interaction]);\n\n snapOffset = utils.rectToXY(offsetRect) || { x: 0, y: 0 };\n }\n\n if (rect && options.relativePoints && options.relativePoints.length) {\n for (const { x: relativeX, y: relativeY } of options.relativePoints) {\n offsets.push({\n x: startOffset.left - (rect.width * relativeX) + snapOffset.x,\n y: startOffset.top - (rect.height * relativeY) + snapOffset.y,\n });\n }\n }\n else {\n offsets.push(snapOffset);\n }\n\n return offsets;\n },\n\n set: function ({ interaction, pageCoords, status, options, offset: offsets }) {\n const targets = [];\n let target;\n let page;\n let i;\n\n if (status.useStatusXY) {\n page = { x: status.x, y: status.y };\n }\n else {\n const origin = utils.getOriginXY(interaction.target, interaction.element, interaction.prepared.name);\n\n page = utils.extend({}, pageCoords);\n\n page.x -= origin.x;\n page.y -= origin.y;\n }\n\n status.realX = page.x;\n status.realY = page.y;\n\n let len = options.targets? options.targets.length : 0;\n\n for (const { x: offsetX, y: offsetY } of offsets) {\n const relativeX = page.x - offsetX;\n const relativeY = page.y - offsetY;\n\n for (const snapTarget of options.targets) {\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n targets.push({\n x: utils.is.number(target.x) ? (target.x + offsetX) : relativeX,\n y: utils.is.number(target.y) ? (target.y + offsetY) : relativeY,\n\n range: utils.is.number(target.range)? target.range: options.range,\n });\n }\n }\n\n const closest = {\n target: null,\n inRange: false,\n distance: 0,\n range: 0,\n dx: 0,\n dy: 0,\n };\n\n for (i = 0, len = targets.length; i < len; i++) {\n target = targets[i];\n\n const range = target.range;\n const dx = target.x - page.x;\n const dy = target.y - page.y;\n const distance = utils.hypot(dx, dy);\n let inRange = distance <= range;\n\n // Infinite targets count as being out of range\n // compared to non infinite ones that are in range\n if (range === Infinity && closest.inRange && closest.range !== Infinity) {\n inRange = false;\n }\n\n if (!closest.target || (inRange\n // is the closest target in range?\n ? (closest.inRange && range !== Infinity\n // the pointer is relatively deeper in this target\n ? distance / range < closest.distance / closest.range\n // this target has Infinite range and the closest doesn't\n : (range === Infinity && closest.range !== Infinity)\n // OR this target is closer that the previous closest\n || distance < closest.distance)\n // The other is not in range and the pointer is closer to this target\n : (!closest.inRange && distance < closest.distance))) {\n\n closest.target = target;\n closest.distance = distance;\n closest.range = range;\n closest.inRange = inRange;\n closest.dx = dx;\n closest.dy = dy;\n\n status.range = range;\n }\n }\n\n let snapChanged;\n\n if (closest.target) {\n snapChanged = (status.modifiedX !== closest.target.x || status.modifiedY !== closest.target.y);\n\n status.modifiedX = closest.target.x;\n status.modifiedY = closest.target.y;\n }\n else {\n snapChanged = true;\n\n status.modifiedX = NaN;\n status.modifiedY = NaN;\n }\n\n status.dx = closest.dx;\n status.dy = closest.dy;\n\n status.changed = (snapChanged || (closest.inRange && !status.locked));\n status.locked = closest.inRange;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const relativePoints = options && options.relativePoints;\n\n if (options && options.enabled\n && !(phase === 'start' && relativePoints && relativePoints.length)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n }\n\n return {\n range : status.range,\n locked : status.locked,\n x : status.modifiedX,\n y : status.modifiedY,\n realX : status.realX,\n realY : status.realY,\n dx : status.dx,\n dy : status.dy,\n };\n }\n },\n};\n\ninteract.createSnapGrid = function (grid) {\n return function (x, y) {\n const limits = grid.limits || {\n left : -Infinity,\n right : Infinity,\n top : -Infinity,\n bottom: Infinity,\n };\n let offsetX = 0;\n let offsetY = 0;\n\n if (utils.is.object(grid.offset)) {\n offsetX = grid.offset.x;\n offsetY = grid.offset.y;\n }\n\n const gridx = Math.round((x - offsetX) / grid.x);\n const gridy = Math.round((y - offsetY) / grid.y);\n\n const newX = Math.max(limits.left, Math.min(limits.right , gridx * grid.x + offsetX));\n const newY = Math.max(limits.top , Math.min(limits.bottom, gridy * grid.y + offsetY));\n\n return {\n x: newX,\n y: newY,\n range: grid.range,\n };\n };\n};\n\nmodifiers.snap = snap;\nmodifiers.names.push('snap');\n\ndefaultOptions.perAction.snap = snap.defaults;\n\nmodule.exports = snap;\n","// This module allows snapping of the size of targets during resize\n// interactions.\n\nconst modifiers = require('./index');\nconst snap = require('./snap');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\nconst utils = require('../utils/');\n\nconst snapSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n },\n\n setOffset: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.edges;\n\n if (!edges) { return; }\n\n arg.options = {\n relativePoints: [{\n x: edges.left? 0 : 1,\n y: edges.top ? 0 : 1,\n }],\n origin: { x: 0, y: 0 },\n offset: 'self',\n range: options.range,\n };\n\n const offsets = snap.setOffset(arg);\n arg.options = options;\n\n return offsets;\n },\n\n set: function (arg) {\n const { interaction, options, offset, pageCoords } = arg;\n const page = utils.extend({}, pageCoords);\n const relativeX = page.x - offset[0].x;\n const relativeY = page.y - offset[0].y;\n\n arg.options = utils.extend({}, options);\n arg.options.targets = [];\n\n for (const snapTarget of options.targets) {\n let target;\n\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n if ('width' in target && 'height' in target) {\n target.x = target.width;\n target.y = target.height;\n }\n\n arg.options.targets.push(target);\n }\n\n snap.set(arg);\n },\n\n modifyCoords: function (arg) {\n const { options } = arg;\n\n arg.options = utils.extend({}, options);\n arg.options.enabled = options.enabled;\n arg.options.relativePoints = [null];\n\n snap.modifyCoords(arg);\n },\n};\n\nmodifiers.snapSize = snapSize;\nmodifiers.names.push('snapSize');\n\ndefaultOptions.perAction.snapSize = snapSize.defaults;\nresize.defaults.snapSize = snapSize.defaults;\n\nmodule.exports = snapSize;\n","const pointerUtils = require('../utils/pointerUtils');\n\nmodule.exports = class PointerEvent {\n constructor (type, pointer, event, eventTarget, interaction) {\n pointerUtils.pointerExtend(this, event);\n\n if (event !== pointer) {\n pointerUtils.pointerExtend(this, pointer);\n }\n\n this.interaction = interaction;\n\n this.timeStamp = new Date().getTime();\n this.originalEvent = event;\n this.type = type;\n this.pointerId = pointerUtils.getPointerId(pointer);\n this.pointerType = pointerUtils.getPointerType(pointer);\n this.target = eventTarget;\n this.currentTarget = null;\n\n if (type === 'tap') {\n const pointerIndex = interaction.getPointerIndex(pointer);\n this.dt = this.timeStamp - interaction.downTimes[pointerIndex];\n\n const interval = this.timeStamp - interaction.tapTime;\n\n this.double = !!(interaction.prevTap\n && interaction.prevTap.type !== 'doubletap'\n && interaction.prevTap.target === this.target\n && interval < 500);\n }\n else if (type === 'doubletap') {\n this.dt = pointer.timeStamp - interaction.tapTime;\n }\n }\n\n subtractOrigin ({ x: originX, y: originY }) {\n this.pageX -= originX;\n this.pageY -= originY;\n this.clientX -= originX;\n this.clientY -= originY;\n\n return this;\n }\n\n addOrigin ({ x: originX, y: originY }) {\n this.pageX += originX;\n this.pageY += originY;\n this.clientX += originX;\n this.clientY += originY;\n\n return this;\n }\n\n preventDefault () {\n this.originalEvent.preventDefault();\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n};\n","const PointerEvent = require('./PointerEvent');\nconst Interaction = require('../Interaction');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst defaults = require('../defaultOptions');\nconst signals = require('../utils/Signals').new();\nconst { filter } = require('../utils/arr');\n\nconst simpleSignals = [ 'down', 'up', 'cancel' ];\nconst simpleEvents = [ 'down', 'up', 'cancel' ];\n\nconst pointerEvents = {\n PointerEvent,\n fire,\n collectEventTargets,\n signals,\n defaults: {\n holdDuration: 600,\n ignoreFrom : null,\n allowFrom : null,\n origin : { x: 0, y: 0 },\n },\n types: [\n 'down',\n 'move',\n 'up',\n 'cancel',\n 'tap',\n 'doubletap',\n 'hold',\n ],\n};\n\nfunction fire (arg) {\n const {\n interaction, pointer, event, eventTarget,\n type = arg.pointerEvent.type,\n targets = collectEventTargets(arg),\n pointerEvent = new PointerEvent(type, pointer, event, eventTarget, interaction),\n } = arg;\n\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n targets,\n type,\n pointerEvent,\n };\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n\n for (const prop in target.props || {}) {\n pointerEvent[prop] = target.props[prop];\n }\n\n const origin = utils.getOriginXY(target.eventable, target.element);\n\n pointerEvent.subtractOrigin(origin);\n pointerEvent.eventable = target.eventable;\n pointerEvent.currentTarget = target.element;\n\n target.eventable.fire(pointerEvent);\n\n pointerEvent.addOrigin(origin);\n\n if (pointerEvent.immediatePropagationStopped\n || (pointerEvent.propagationStopped\n && (i + 1) < targets.length && targets[i + 1].element !== pointerEvent.currentTarget)) {\n break;\n }\n }\n\n signals.fire('fired', signalArg);\n\n if (type === 'tap') {\n // if pointerEvent should make a double tap, create and fire a doubletap\n // PointerEvent and use that as the prevTap\n const prevTap = pointerEvent.double\n ? fire({\n interaction, pointer, event, eventTarget,\n type: 'doubletap',\n })\n : pointerEvent;\n\n interaction.prevTap = prevTap;\n interaction.tapTime = prevTap.timeStamp;\n }\n\n return pointerEvent;\n}\n\nfunction collectEventTargets ({ interaction, pointer, event, eventTarget, type }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n // do not fire a tap event if the pointer was moved before being lifted\n if (type === 'tap' && (interaction.pointerWasMoved\n // or if the pointerup target is different to the pointerdown target\n || !(interaction.downTargets[pointerIndex] && interaction.downTargets[pointerIndex] === eventTarget))) {\n return [];\n }\n\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n path,\n targets: [],\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (type === 'hold') {\n signalArg.targets = filter(signalArg.targets, target =>\n target.eventable.options.holdDuration === interaction.holdTimers[pointerIndex].duration);\n }\n\n return signalArg.targets;\n}\n\nInteraction.signals.on('update-pointer-down', function ({ interaction, pointerIndex }) {\n interaction.holdTimers[pointerIndex] = { duration: Infinity, timeout: null };\n});\n\nInteraction.signals.on('remove-pointer', function ({ interaction, pointerIndex }) {\n interaction.holdTimers.splice(pointerIndex, 1);\n});\n\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget, duplicateMove }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n if (!duplicateMove && (!interaction.pointerIsDown || interaction.pointerWasMoved)) {\n if (interaction.pointerIsDown) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n\n fire({\n interaction, pointer, event, eventTarget,\n type: 'move',\n });\n }\n});\n\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget, pointerIndex }) {\n // copy event to be used in timeout for IE8\n const eventCopy = browser.isIE8? utils.extend({}, event) : event;\n\n const timer = interaction.holdTimers[pointerIndex];\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'hold',\n targets: [],\n path,\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (!signalArg.targets.length) { return; }\n\n let minDuration = Infinity;\n\n for (let i = 0; i < signalArg.targets.length; i++) {\n const target = signalArg.targets[i];\n const holdDuration = target.eventable.options.holdDuration;\n\n if (holdDuration < minDuration) {\n minDuration = holdDuration;\n }\n }\n\n timer.duration = minDuration;\n timer.timeout = setTimeout(function () {\n fire({\n interaction,\n eventTarget,\n pointer: browser.isIE8? eventCopy : pointer,\n event: eventCopy,\n type: 'hold',\n });\n }, minDuration);\n});\n\nInteraction.signals.on('up', ({ interaction, pointer, event, eventTarget }) => {\n if (!interaction.pointerWasMoved) {\n fire({ interaction, eventTarget, pointer, event, type: 'tap' });\n }\n});\n\n['up', 'cancel'].forEach(function (signalName) {\n Interaction.signals.on(signalName, function ({ interaction, pointerIndex }) {\n if (interaction.holdTimers[pointerIndex]) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n });\n});\n\nfunction createSignalListener (type) {\n return function ({ interaction, pointer, event, eventTarget }) {\n fire({ interaction, eventTarget, pointer, event, type });\n };\n}\n\nfor (let i = 0; i < simpleSignals.length; i++) {\n Interaction.signals.on(simpleSignals[i], createSignalListener(simpleEvents[i]));\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.prevTap = null; // the most recent tap event on this interaction\n interaction.tapTime = 0; // time of the most recent tap event\n interaction.holdTimers = []; // [{ duration, timeout }]\n});\n\ndefaults.pointerEvents = pointerEvents.defaults;\nmodule.exports = pointerEvents;\n","const pointerEvents = require('./base');\nconst Interaction = require('../Interaction');\n\npointerEvents.signals.on('new', onNew);\npointerEvents.signals.on('fired', onFired);\n\nfor (const signal of ['move', 'up', 'cancel', 'endall']) {\n Interaction.signals.on(signal, endHoldRepeat);\n}\n\nfunction onNew ({ pointerEvent }) {\n if (pointerEvent.type !== 'hold') { return; }\n\n pointerEvent.count = (pointerEvent.count || 0) + 1;\n}\n\nfunction onFired ({ interaction, pointerEvent, eventTarget, targets }) {\n if (pointerEvent.type !== 'hold' || !targets.length) { return; }\n\n // get the repeat interval from the first eventable\n const interval = targets[0].eventable.options.holdRepeatInterval;\n\n // don't repeat if the interval is 0 or less\n if (interval <= 0) { return; }\n\n // set a timeout to fire the holdrepeat event\n interaction.holdIntervalHandle = setTimeout(function () {\n pointerEvents.fire({\n interaction,\n eventTarget,\n type: 'hold',\n pointer: pointerEvent,\n event: pointerEvent,\n });\n }, interval);\n}\n\nfunction endHoldRepeat ({ interaction }) {\n // set the interaction's holdStopTime property\n // to stop further holdRepeat events\n if (interaction.holdIntervalHandle) {\n clearInterval(interaction.holdIntervalHandle);\n interaction.holdIntervalHandle = null;\n }\n}\n\n// don't repeat by default\npointerEvents.defaults.holdRepeatInterval = 0;\npointerEvents.types.push('holdrepeat');\n\nmodule.exports = {\n onNew,\n onFired,\n endHoldRepeat,\n};\n","const pointerEvents = require('./base');\nconst Interactable = require('../Interactable');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\nconst scope = require('../scope');\nconst extend = require('../utils/extend');\nconst { merge } = require('../utils/arr');\n\npointerEvents.signals.on('collect-targets', function ({ targets, element, type, eventTarget }) {\n function collectSelectors (interactable, selector, context) {\n const els = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && is.element(element)\n && domUtils.matchesSelector(element, selector, els)\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n const interactable = scope.interactables.get(element);\n\n if (interactable) {\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n scope.interactables.forEachSelector(collectSelectors, element);\n});\n\nInteractable.signals.on('new', function ({ interactable }) {\n interactable.events.getRect = function (element) {\n return interactable.getRect(element);\n };\n});\n\nInteractable.signals.on('set', function ({ interactable, options }) {\n extend(interactable.events.options, pointerEvents.defaults);\n extend(interactable.events.options, options);\n});\n\nmerge(Interactable.eventTypes, pointerEvents.types);\n\nInteractable.prototype.pointerEvents = function (options) {\n extend(this.events.options, options);\n\n return this;\n};\n\nconst __backCompatOption = Interactable.prototype._backCompatOption;\n\nInteractable.prototype._backCompatOption = function (optionName, newValue) {\n const ret = __backCompatOption.call(this, optionName, newValue);\n\n if (ret === this) {\n this.events.options[optionName] = newValue;\n }\n\n return ret;\n};\n\nInteractable.settingsMethods.push('pointerEvents');\n","const utils = require('./utils');\nconst events = require('./utils/events');\nconst signals = require('./utils/Signals').new();\n\nconst scope = {\n signals,\n events,\n utils,\n\n // main document\n document: require('./utils/domObjects').document,\n // all documents being listened to\n documents: [],\n\n addDocument: function (doc, win) {\n // do nothing if document is already known\n if (utils.contains(scope.documents, doc)) { return false; }\n\n win = win || scope.getWindow(doc);\n\n scope.documents.push(doc);\n events.documents.push(doc);\n\n // don't add an unload event for the main document\n // so that the page may be cached in browser history\n if (doc !== scope.document) {\n events.add(win, 'unload', scope.onWindowUnload);\n }\n\n signals.fire('add-document', { doc, win });\n },\n\n removeDocument: function (doc, win) {\n const index = utils.indexOf(scope.documents, doc);\n\n win = win || scope.getWindow(doc);\n\n events.remove(win, 'unload', scope.onWindowUnload);\n\n scope.documents.splice(index, 1);\n events.documents.splice(index, 1);\n\n signals.fire('remove-document', { win, doc });\n },\n\n onWindowUnload: function () {\n scope.removeDocument(this.document, this);\n },\n};\n\nmodule.exports = scope;\n","const { indexOf } = require('./arr');\n\nclass Signals {\n constructor () {\n this.listeners = {\n // signalName: [listeners],\n };\n }\n\n on (name, listener) {\n if (!this.listeners[name]) {\n this.listeners[name] = [listener];\n return;\n }\n\n this.listeners[name].push(listener);\n }\n\n off (name, listener) {\n if (!this.listeners[name]) { return; }\n\n const index = indexOf(this.listeners[name], listener);\n\n if (index !== -1) {\n this.listeners[name].splice(index, 1);\n }\n }\n\n fire (name, arg) {\n const targetListeners = this.listeners[name];\n\n if (!targetListeners) { return; }\n\n for (let i = 0; i < targetListeners.length; i++) {\n if (targetListeners[i](arg, name) === false) {\n return;\n }\n }\n }\n}\n\nSignals.new = function () {\n return new Signals();\n};\n\nmodule.exports = Signals;\n","function indexOf (array, target) {\n for (let i = 0, len = array.length; i < len; i++) {\n if (array[i] === target) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction contains (array, target) {\n return indexOf(array, target) !== -1;\n}\n\nfunction merge (target, source) {\n for (let i = 0; i < source.length; i++) {\n target.push(source[i]);\n }\n\n return target;\n}\n\nfunction filter (array, test) {\n const result = [];\n\n for (let i = 0; i < array.length; i++) {\n if (test(array[i])) {\n result.push(array[i]);\n }\n }\n\n return result;\n}\n\nmodule.exports = {\n indexOf,\n contains,\n merge,\n filter,\n};\n","const { window } = require('./window');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst Element = domObjects.Element;\nconst navigator = window.navigator;\n\nconst browser = {\n // Does the browser support touch input?\n supportsTouch: !!(('ontouchstart' in window) || is.function(window.DocumentTouch)\n && domObjects.document instanceof window.DocumentTouch),\n\n // Does the browser support PointerEvents\n supportsPointerEvent: !!domObjects.PointerEvent,\n\n isIE8: ('attachEvent' in window) && !('addEventListener' in window),\n\n // Opera Mobile must be handled differently\n isOperaMobile: (navigator.appName === 'Opera'\n && browser.supportsTouch\n && navigator.userAgent.match('Presto')),\n\n // scrolling doesn't change the result of getClientRects on iOS 7\n isIOS7: (/iP(hone|od|ad)/.test(navigator.platform)\n && /OS 7[^\\d]/.test(navigator.appVersion)),\n\n isIe9OrOlder: /MSIE (8|9)/.test(navigator.userAgent),\n\n // prefix matchesSelector\n prefixedMatchesSelector: 'matches' in Element.prototype\n ? 'matches': 'webkitMatchesSelector' in Element.prototype\n ? 'webkitMatchesSelector': 'mozMatchesSelector' in Element.prototype\n ? 'mozMatchesSelector': 'oMatchesSelector' in Element.prototype\n ? 'oMatchesSelector': 'msMatchesSelector',\n\n useMatchesSelectorPolyfill: false,\n\n pEventTypes: (domObjects.PointerEvent\n ? (domObjects.PointerEvent === window.MSPointerEvent\n ? {\n up: 'MSPointerUp',\n down: 'MSPointerDown',\n over: 'mouseover',\n out: 'mouseout',\n move: 'MSPointerMove',\n cancel: 'MSPointerCancel',\n }\n : {\n up: 'pointerup',\n down: 'pointerdown',\n over: 'pointerover',\n out: 'pointerout',\n move: 'pointermove',\n cancel: 'pointercancel',\n })\n : null),\n\n // because Webkit and Opera still use 'mousewheel' event type\n wheelEvent: 'onmousewheel' in domObjects.document? 'mousewheel': 'wheel',\n\n};\n\nbrowser.useMatchesSelectorPolyfill = !is.function(Element.prototype[browser.prefixedMatchesSelector]);\n\nmodule.exports = browser;\n","const domObjects = {};\nconst win = require('./window').window;\n\nfunction blank () {}\n\ndomObjects.document = win.document;\ndomObjects.DocumentFragment = win.DocumentFragment || blank;\ndomObjects.SVGElement = win.SVGElement || blank;\ndomObjects.SVGSVGElement = win.SVGSVGElement || blank;\ndomObjects.SVGElementInstance = win.SVGElementInstance || blank;\ndomObjects.Element = win.Element || blank;\ndomObjects.HTMLElement = win.HTMLElement || domObjects.Element;\n\ndomObjects.Event = win.Event;\ndomObjects.Touch = win.Touch || blank;\ndomObjects.PointerEvent = (win.PointerEvent || win.MSPointerEvent);\n\nmodule.exports = domObjects;\n","const win = require('./window');\nconst browser = require('./browser');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst domUtils = {\n nodeContains: function (parent, child) {\n while (child) {\n if (child === parent) {\n return true;\n }\n\n child = child.parentNode;\n }\n\n return false;\n },\n\n closest: function (element, selector) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) { return element; }\n\n element = domUtils.parentNode(element);\n }\n\n return null;\n },\n\n parentNode: function (node) {\n let parent = node.parentNode;\n\n if (is.docFrag(parent)) {\n // skip past #shado-root fragments\n while ((parent = parent.host) && is.docFrag(parent)) {\n continue;\n }\n\n return parent;\n }\n\n return parent;\n },\n\n // taken from http://tanalin.com/en/blog/2012/12/matches-selector-ie8/ and modified\n matchesSelectorPolyfill: browser.useMatchesSelectorPolyfill\n ? function (element, selector, elems) {\n elems = elems || element.parentNode.querySelectorAll(selector);\n\n for (let i = 0, len = elems.length; i < len; i++) {\n if (elems[i] === element) {\n return true;\n }\n }\n\n return false;\n }\n : null,\n\n matchesSelector: function (element, selector, nodeList) {\n if (browser.useMatchesSelectorPolyfill) {\n return domUtils.matchesSelectorPolyfill(element, selector, nodeList);\n }\n\n // remove /deep/ from selectors if shadowDOM polyfill is used\n if (win.window !== win.realWindow) {\n selector = selector.replace(/\\/deep\\//g, ' ');\n }\n\n return element[browser.prefixedMatchesSelector](selector);\n },\n\n // Test for the element that's \"above\" all other qualifiers\n indexOfDeepestElement: function (elements) {\n let deepestZoneParents = [];\n let dropzoneParents = [];\n let dropzone;\n let deepestZone = elements[0];\n let index = deepestZone? 0: -1;\n let parent;\n let child;\n let i;\n let n;\n\n for (i = 1; i < elements.length; i++) {\n dropzone = elements[i];\n\n // an element might belong to multiple selector dropzones\n if (!dropzone || dropzone === deepestZone) {\n continue;\n }\n\n if (!deepestZone) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n // check if the deepest or current are document.documentElement or document.rootElement\n // - if the current dropzone is, do nothing and continue\n if (dropzone.parentNode === dropzone.ownerDocument) {\n continue;\n }\n // - if deepest is, update with the current dropzone and continue to next\n else if (deepestZone.parentNode === dropzone.ownerDocument) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n if (!deepestZoneParents.length) {\n parent = deepestZone;\n while (parent.parentNode && parent.parentNode !== parent.ownerDocument) {\n deepestZoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n }\n\n // if this element is an svg element and the current deepest is\n // an HTMLElement\n if (deepestZone instanceof domObjects.HTMLElement\n && dropzone instanceof domObjects.SVGElement\n && !(dropzone instanceof domObjects.SVGSVGElement)) {\n\n if (dropzone === deepestZone.parentNode) {\n continue;\n }\n\n parent = dropzone.ownerSVGElement;\n }\n else {\n parent = dropzone;\n }\n\n dropzoneParents = [];\n\n while (parent.parentNode !== parent.ownerDocument) {\n dropzoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n\n n = 0;\n\n // get (position of last common ancestor) + 1\n while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) {\n n++;\n }\n\n const parents = [\n dropzoneParents[n - 1],\n dropzoneParents[n],\n deepestZoneParents[n],\n ];\n\n child = parents[0].lastChild;\n\n while (child) {\n if (child === parents[1]) {\n deepestZone = dropzone;\n index = i;\n deepestZoneParents = [];\n\n break;\n }\n else if (child === parents[2]) {\n break;\n }\n\n child = child.previousSibling;\n }\n }\n\n return index;\n },\n\n matchesUpTo: function (element, selector, limit) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) {\n return true;\n }\n\n element = domUtils.parentNode(element);\n\n if (element === limit) {\n return domUtils.matchesSelector(element, selector);\n }\n }\n\n return false;\n },\n\n getActualElement: function (element) {\n return (element instanceof domObjects.SVGElementInstance\n ? element.correspondingUseElement\n : element);\n },\n\n getScrollXY: function (relevantWindow) {\n relevantWindow = relevantWindow || win.window;\n return {\n x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft,\n y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop,\n };\n },\n\n getElementClientRect: function (element) {\n const clientRect = (element instanceof domObjects.SVGElement\n ? element.getBoundingClientRect()\n : element.getClientRects()[0]);\n\n return clientRect && {\n left : clientRect.left,\n right : clientRect.right,\n top : clientRect.top,\n bottom: clientRect.bottom,\n width : clientRect.width || clientRect.right - clientRect.left,\n height: clientRect.height || clientRect.bottom - clientRect.top,\n };\n },\n\n getElementRect: function (element) {\n const clientRect = domUtils.getElementClientRect(element);\n\n if (!browser.isIOS7 && clientRect) {\n const scroll = domUtils.getScrollXY(win.getWindow(element));\n\n clientRect.left += scroll.x;\n clientRect.right += scroll.x;\n clientRect.top += scroll.y;\n clientRect.bottom += scroll.y;\n }\n\n return clientRect;\n },\n\n getPath: function (element) {\n const path = [];\n\n while (element) {\n path.push(element);\n element = domUtils.parentNode(element);\n }\n\n return path;\n },\n\n trySelector: value => {\n if (!is.string(value)) { return false; }\n\n // an exception will be raised if it is invalid\n domObjects.document.querySelector(value);\n return true;\n },\n};\n\nmodule.exports = domUtils;\n","const is = require('./is');\nconst domUtils = require('./domUtils');\nconst pExtend = require('./pointerExtend');\n\nconst { window, getWindow } = require('./window');\nconst { indexOf, contains } = require('./arr');\n\nconst useAttachEvent = ('attachEvent' in window) && !('addEventListener' in window);\nconst addEvent = useAttachEvent? 'attachEvent': 'addEventListener';\nconst removeEvent = useAttachEvent? 'detachEvent': 'removeEventListener';\nconst on = useAttachEvent? 'on': '';\n\nconst elements = [];\nconst targets = [];\nconst attachedListeners = [];\n\n// {\n// type: {\n// selectors: ['selector', ...],\n// contexts : [document, ...],\n// listeners: [[listener, capture, passive], ...]\n// }\n// }\nconst delegatedEvents = {};\n\nconst documents = [];\n\nconst supportsOptions = !useAttachEvent && (() => {\n let supported = false;\n\n window.document.createElement('div').addEventListener('test', null, {\n get capture () { supported = true; },\n });\n\n return supported;\n})();\n\nfunction add (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n let elementIndex = indexOf(elements, element);\n let target = targets[elementIndex];\n\n if (!target) {\n target = {\n events: {},\n typeCount: 0,\n };\n\n elementIndex = elements.push(element) - 1;\n targets.push(target);\n\n attachedListeners.push(useAttachEvent\n ? {\n supplied: [],\n wrapped : [],\n useCount: [],\n }\n : null);\n }\n\n if (!target.events[type]) {\n target.events[type] = [];\n target.typeCount++;\n }\n\n if (!contains(target.events[type], listener)) {\n let ret;\n\n if (useAttachEvent) {\n const { supplied, wrapped, useCount } = attachedListeners[elementIndex];\n const listenerIndex = indexOf(supplied, listener);\n\n const wrappedListener = wrapped[listenerIndex] || function (event) {\n if (!event.immediatePropagationStopped) {\n event.target = event.srcElement;\n event.currentTarget = element;\n\n event.preventDefault = event.preventDefault || preventDef;\n event.stopPropagation = event.stopPropagation || stopProp;\n event.stopImmediatePropagation = event.stopImmediatePropagation || stopImmProp;\n\n if (/mouse|click/.test(event.type)) {\n event.pageX = event.clientX + getWindow(element).document.documentElement.scrollLeft;\n event.pageY = event.clientY + getWindow(element).document.documentElement.scrollTop;\n }\n\n listener(event);\n }\n };\n\n ret = element[addEvent](on + type, wrappedListener, !!options.capture);\n\n if (listenerIndex === -1) {\n supplied.push(listener);\n wrapped.push(wrappedListener);\n useCount.push(1);\n }\n else {\n useCount[listenerIndex]++;\n }\n }\n else {\n ret = element[addEvent](type, listener, supportsOptions? options : !!options.capture);\n }\n target.events[type].push(listener);\n\n return ret;\n }\n}\n\nfunction remove (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const elementIndex = indexOf(elements, element);\n const target = targets[elementIndex];\n\n if (!target || !target.events) {\n return;\n }\n\n let wrappedListener = listener;\n let listeners;\n let listenerIndex;\n\n if (useAttachEvent) {\n listeners = attachedListeners[elementIndex];\n listenerIndex = indexOf(listeners.supplied, listener);\n wrappedListener = listeners.wrapped[listenerIndex];\n }\n\n if (type === 'all') {\n for (type in target.events) {\n if (target.events.hasOwnProperty(type)) {\n remove(element, type, 'all');\n }\n }\n return;\n }\n\n if (target.events[type]) {\n const len = target.events[type].length;\n\n if (listener === 'all') {\n for (let i = 0; i < len; i++) {\n remove(element, type, target.events[type][i], options);\n }\n return;\n }\n else {\n for (let i = 0; i < len; i++) {\n if (target.events[type][i] === listener) {\n element[removeEvent](on + type, wrappedListener, supportsOptions? options : !!options.capture);\n target.events[type].splice(i, 1);\n\n if (useAttachEvent && listeners) {\n listeners.useCount[listenerIndex]--;\n if (listeners.useCount[listenerIndex] === 0) {\n listeners.supplied.splice(listenerIndex, 1);\n listeners.wrapped.splice(listenerIndex, 1);\n listeners.useCount.splice(listenerIndex, 1);\n }\n }\n\n break;\n }\n }\n }\n\n if (target.events[type] && target.events[type].length === 0) {\n target.events[type] = null;\n target.typeCount--;\n }\n }\n\n if (!target.typeCount) {\n targets.splice(elementIndex, 1);\n elements.splice(elementIndex, 1);\n attachedListeners.splice(elementIndex, 1);\n }\n}\n\nfunction addDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n if (!delegatedEvents[type]) {\n delegatedEvents[type] = {\n selectors: [],\n contexts : [],\n listeners: [],\n };\n\n // add delegate listener functions\n for (let i = 0; i < documents.length; i++) {\n add(documents[i], type, delegateListener);\n add(documents[i], type, delegateUseCapture, true);\n }\n }\n\n const delegated = delegatedEvents[type];\n let index;\n\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n break;\n }\n }\n\n if (index === -1) {\n index = delegated.selectors.length;\n\n delegated.selectors.push(selector);\n delegated.contexts .push(context);\n delegated.listeners.push([]);\n }\n\n // keep listener and capture and passive flags\n delegated.listeners[index].push([listener, !!options.capture, options.passive]);\n}\n\nfunction removeDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const delegated = delegatedEvents[type];\n let matchFound = false;\n let index;\n\n if (!delegated) { return; }\n\n // count from last index of delegated to 0\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n // look for matching selector and context Node\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n\n const listeners = delegated.listeners[index];\n\n // each item of the listeners array is an array: [function, capture, passive]\n for (let i = listeners.length - 1; i >= 0; i--) {\n const [fn, capture, passive] = listeners[i];\n\n // check if the listener functions and capture and passive flags match\n if (fn === listener && capture === !!options.capture && passive === options.passive) {\n // remove the listener from the array of listeners\n listeners.splice(i, 1);\n\n // if all listeners for this interactable have been removed\n // remove the interactable from the delegated arrays\n if (!listeners.length) {\n delegated.selectors.splice(index, 1);\n delegated.contexts .splice(index, 1);\n delegated.listeners.splice(index, 1);\n\n // remove delegate function from context\n remove(context, type, delegateListener);\n remove(context, type, delegateUseCapture, true);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegatedEvents[type] = null;\n }\n }\n\n // only remove one listener\n matchFound = true;\n break;\n }\n }\n\n if (matchFound) { break; }\n }\n }\n}\n\n// bound to the interactable context when a DOM event\n// listener is added to a selector interactable\nfunction delegateListener (event, optionalArg) {\n const options = getOptions(optionalArg);\n const fakeEvent = {};\n const delegated = delegatedEvents[event.type];\n const eventTarget = (domUtils.getActualElement(event.path\n ? event.path[0]\n : event.target));\n let element = eventTarget;\n\n // duplicate the event so that currentTarget can be changed\n pExtend(fakeEvent, event);\n\n fakeEvent.originalEvent = event;\n fakeEvent.preventDefault = preventOriginalDefault;\n\n // climb up document tree looking for selector matches\n while (is.element(element)) {\n for (let i = 0; i < delegated.selectors.length; i++) {\n const selector = delegated.selectors[i];\n const context = delegated.contexts[i];\n\n if (domUtils.matchesSelector(element, selector)\n && domUtils.nodeContains(context, eventTarget)\n && domUtils.nodeContains(context, element)) {\n\n const listeners = delegated.listeners[i];\n\n fakeEvent.currentTarget = element;\n\n for (let j = 0; j < listeners.length; j++) {\n const [fn, capture, passive] = listeners[j];\n\n if (capture === !!options.capture && passive === options.passive) {\n fn(fakeEvent);\n }\n }\n }\n }\n\n element = domUtils.parentNode(element);\n }\n}\n\nfunction delegateUseCapture (event) {\n return delegateListener.call(this, event, true);\n}\n\nfunction preventDef () {\n this.returnValue = false;\n}\n\nfunction preventOriginalDefault () {\n this.originalEvent.preventDefault();\n}\n\nfunction stopProp () {\n this.cancelBubble = true;\n}\n\nfunction stopImmProp () {\n this.cancelBubble = true;\n this.immediatePropagationStopped = true;\n}\n\nfunction getOptions (param) {\n return is.object(param)? param : { capture: param };\n}\n\nmodule.exports = {\n add,\n remove,\n\n addDelegate,\n removeDelegate,\n\n delegateListener,\n delegateUseCapture,\n delegatedEvents,\n documents,\n\n useAttachEvent,\n supportsOptions,\n\n _elements: elements,\n _targets: targets,\n _attachedListeners: attachedListeners,\n};\n","module.exports = function extend (dest, source) {\n for (const prop in source) {\n dest[prop] = source[prop];\n }\n return dest;\n};\n","const {\n resolveRectLike,\n rectToXY,\n} = require('./rect');\n\nmodule.exports = function (target, element, action) {\n const actionOptions = target.options[action];\n const actionOrigin = actionOptions && actionOptions.origin;\n const origin = actionOrigin || target.options.origin;\n\n const originRect = resolveRectLike(origin, target, element, [target && element]);\n\n return rectToXY(originRect) || { x: 0, y: 0 };\n};\n","module.exports = (x, y) => Math.sqrt(x * x + y * y);\n","const extend = require('./extend');\nconst win = require('./window');\n\nconst utils = {\n warnOnce: function (method, message) {\n let warned = false;\n\n return function () {\n if (!warned) {\n win.window.console.warn(message);\n warned = true;\n }\n\n return method.apply(this, arguments);\n };\n },\n\n // http://stackoverflow.com/a/5634528/2280888\n _getQBezierValue: function (t, p1, p2, p3) {\n const iT = 1 - t;\n return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3;\n },\n\n getQuadraticCurvePoint: function (startX, startY, cpX, cpY, endX, endY, position) {\n return {\n x: utils._getQBezierValue(position, startX, cpX, endX),\n y: utils._getQBezierValue(position, startY, cpY, endY),\n };\n },\n\n // http://gizma.com/easing/\n easeOutQuad: function (t, b, c, d) {\n t /= d;\n return -c * t*(t-2) + b;\n },\n\n copyAction: function (dest, src) {\n dest.name = src.name;\n dest.axis = src.axis;\n dest.edges = src.edges;\n\n return dest;\n },\n\n is : require('./is'),\n extend : extend,\n hypot : require('./hypot'),\n getOriginXY: require('./getOriginXY'),\n};\n\nextend(utils, require('./arr'));\nextend(utils, require('./domUtils'));\nextend(utils, require('./pointerUtils'));\nextend(utils, require('./rect'));\n\nmodule.exports = utils;\n","const scope = require('../scope');\nconst utils = require('./index');\n\nconst finder = {\n methodOrder: [ 'simulationResume', 'mouseOrPen', 'hasPointer', 'idle' ],\n\n search: function (pointer, eventType, eventTarget) {\n const pointerType = utils.getPointerType(pointer);\n const pointerId = utils.getPointerId(pointer);\n const details = { pointer, pointerId, pointerType, eventType, eventTarget };\n\n for (const method of finder.methodOrder) {\n const interaction = finder[method](details);\n\n if (interaction) {\n return interaction;\n }\n }\n },\n\n // try to resume simulation with a new pointer\n simulationResume: function ({ pointerType, eventType, eventTarget }) {\n if (!/down|start/i.test(eventType)) {\n return null;\n }\n\n for (const interaction of scope.interactions) {\n let element = eventTarget;\n\n if (interaction.simulation && interaction.simulation.allowResume\n && (interaction.pointerType === pointerType)) {\n while (element) {\n // if the element is the interaction element\n if (element === interaction.element) {\n return interaction;\n }\n element = utils.parentNode(element);\n }\n }\n }\n\n return null;\n },\n\n // if it's a mouse or pen interaction\n mouseOrPen: function ({ pointerId, pointerType, eventType }) {\n if (pointerType !== 'mouse' && pointerType !== 'pen') {\n return null;\n }\n\n let firstNonActive;\n\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType) {\n // if it's a down event, skip interactions with running simulations\n if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; }\n\n // if the interaction is active, return it immediately\n if (interaction.interacting()) {\n return interaction;\n }\n // otherwise save it and look for another active interaction\n else if (!firstNonActive) {\n firstNonActive = interaction;\n }\n }\n }\n\n // if no active mouse interaction was found use the first inactive mouse\n // interaction\n if (firstNonActive) {\n return firstNonActive;\n }\n\n // find any mouse or pen interaction.\n // ignore the interaction if the eventType is a *down, and a simulation\n // is active\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType && !(/down/i.test(eventType) && interaction.simulation)) {\n return interaction;\n }\n }\n\n return null;\n },\n\n // get interaction that has this pointer\n hasPointer: function ({ pointerId }) {\n for (const interaction of scope.interactions) {\n if (utils.contains(interaction.pointerIds, pointerId)) {\n return interaction;\n }\n }\n },\n\n // get first idle interaction with a matching pointerType\n idle: function ({ pointerType }) {\n for (const interaction of scope.interactions) {\n // if there's already a pointer held down\n if (interaction.pointerIds.length === 1) {\n const target = interaction.target;\n // don't add this pointer if there is a target interactable and it\n // isn't gesturable\n if (target && !target.options.gesture.enabled) {\n continue;\n }\n }\n // maximum of 2 pointers per interaction\n else if (interaction.pointerIds.length >= 2) {\n continue;\n }\n\n if (!interaction.interacting() && (pointerType === interaction.pointerType)) {\n return interaction;\n }\n }\n\n return null;\n },\n};\n\nmodule.exports = finder;\n","const win = require('./window');\nconst isWindow = require('./isWindow');\n\nconst is = {\n array : () => {},\n\n window : thing => thing === win.window || isWindow(thing),\n\n docFrag : thing => is.object(thing) && thing.nodeType === 11,\n\n object : thing => !!thing && (typeof thing === 'object'),\n\n function: thing => typeof thing === 'function',\n\n number : thing => typeof thing === 'number' ,\n\n bool : thing => typeof thing === 'boolean' ,\n\n string : thing => typeof thing === 'string' ,\n\n element: thing => {\n if (!thing || (typeof thing !== 'object')) { return false; }\n\n const _window = win.getWindow(thing) || win.window;\n\n return (/object|function/.test(typeof _window.Element)\n ? thing instanceof _window.Element //DOM2\n : thing.nodeType === 1 && typeof thing.nodeName === 'string');\n },\n};\n\nis.array = thing => (is.object(thing)\n && (typeof thing.length !== 'undefined')\n && is.function(thing.splice));\n\nmodule.exports = is;\n","module.exports = (thing) => !!(thing && thing.Window) && (thing instanceof thing.Window);\n","function pointerExtend (dest, source) {\n for (const prop in source) {\n const prefixedPropREs = module.exports.prefixedPropREs;\n let deprecated = false;\n\n // skip deprecated prefixed properties\n for (const vendor in prefixedPropREs) {\n if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) {\n deprecated = true;\n break;\n }\n }\n\n if (!deprecated && typeof source[prop] !== 'function') {\n dest[prop] = source[prop];\n }\n }\n return dest;\n}\n\npointerExtend.prefixedPropREs = {\n webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/,\n};\n\nmodule.exports = pointerExtend;\n","const hypot = require('./hypot');\nconst browser = require('./browser');\nconst dom = require('./domObjects');\nconst domUtils = require('./domUtils');\nconst domObjects = require('./domObjects');\nconst is = require('./is');\nconst pointerExtend = require('./pointerExtend');\n\nconst pointerUtils = {\n copyCoords: function (dest, src) {\n dest.page = dest.page || {};\n dest.page.x = src.page.x;\n dest.page.y = src.page.y;\n\n dest.client = dest.client || {};\n dest.client.x = src.client.x;\n dest.client.y = src.client.y;\n\n dest.timeStamp = src.timeStamp;\n },\n\n setCoordDeltas: function (targetObj, prev, cur) {\n targetObj.page.x = cur.page.x - prev.page.x;\n targetObj.page.y = cur.page.y - prev.page.y;\n targetObj.client.x = cur.client.x - prev.client.x;\n targetObj.client.y = cur.client.y - prev.client.y;\n targetObj.timeStamp = cur.timeStamp - prev.timeStamp;\n\n // set pointer velocity\n const dt = Math.max(targetObj.timeStamp / 1000, 0.001);\n\n targetObj.page.speed = hypot(targetObj.page.x, targetObj.page.y) / dt;\n targetObj.page.vx = targetObj.page.x / dt;\n targetObj.page.vy = targetObj.page.y / dt;\n\n targetObj.client.speed = hypot(targetObj.client.x, targetObj.page.y) / dt;\n targetObj.client.vx = targetObj.client.x / dt;\n targetObj.client.vy = targetObj.client.y / dt;\n },\n\n isNativePointer: function (pointer) {\n return (pointer instanceof dom.Event || pointer instanceof dom.Touch);\n },\n\n // Get specified X/Y coords for mouse or event.touches[0]\n getXY: function (type, pointer, xy) {\n xy = xy || {};\n type = type || 'page';\n\n xy.x = pointer[type + 'X'];\n xy.y = pointer[type + 'Y'];\n\n return xy;\n },\n\n getPageXY: function (pointer, page) {\n page = page || {};\n\n // Opera Mobile handles the viewport and scrolling oddly\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n pointerUtils.getXY('screen', pointer, page);\n\n page.x += window.scrollX;\n page.y += window.scrollY;\n }\n else {\n pointerUtils.getXY('page', pointer, page);\n }\n\n return page;\n },\n\n getClientXY: function (pointer, client) {\n client = client || {};\n\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n // Opera Mobile handles the viewport and scrolling oddly\n pointerUtils.getXY('screen', pointer, client);\n }\n else {\n pointerUtils.getXY('client', pointer, client);\n }\n\n return client;\n },\n\n getPointerId: function (pointer) {\n return is.number(pointer.pointerId)? pointer.pointerId : pointer.identifier;\n },\n\n setCoords: function (targetObj, pointers, timeStamp) {\n const pointer = (pointers.length > 1\n ? pointerUtils.pointerAverage(pointers)\n : pointers[0]);\n\n const tmpXY = {};\n\n pointerUtils.getPageXY(pointer, tmpXY);\n targetObj.page.x = tmpXY.x;\n targetObj.page.y = tmpXY.y;\n\n pointerUtils.getClientXY(pointer, tmpXY);\n targetObj.client.x = tmpXY.x;\n targetObj.client.y = tmpXY.y;\n\n targetObj.timeStamp = is.number(timeStamp) ? timeStamp :new Date().getTime();\n },\n\n pointerExtend: pointerExtend,\n\n getTouchPair: function (event) {\n const touches = [];\n\n // array of touches is supplied\n if (is.array(event)) {\n touches[0] = event[0];\n touches[1] = event[1];\n }\n // an event\n else {\n if (event.type === 'touchend') {\n if (event.touches.length === 1) {\n touches[0] = event.touches[0];\n touches[1] = event.changedTouches[0];\n }\n else if (event.touches.length === 0) {\n touches[0] = event.changedTouches[0];\n touches[1] = event.changedTouches[1];\n }\n }\n else {\n touches[0] = event.touches[0];\n touches[1] = event.touches[1];\n }\n }\n\n return touches;\n },\n\n pointerAverage: function (pointers) {\n const average = {\n pageX : 0,\n pageY : 0,\n clientX: 0,\n clientY: 0,\n screenX: 0,\n screenY: 0,\n };\n\n for (const pointer of pointers) {\n for (const prop in average) {\n average[prop] += pointer[prop];\n }\n }\n for (const prop in average) {\n average[prop] /= pointers.length;\n }\n\n return average;\n },\n\n touchBBox: function (event) {\n if (!event.length && !(event.touches && event.touches.length > 1)) {\n return;\n }\n\n const touches = pointerUtils.getTouchPair(event);\n const minX = Math.min(touches[0].pageX, touches[1].pageX);\n const minY = Math.min(touches[0].pageY, touches[1].pageY);\n const maxX = Math.max(touches[0].pageX, touches[1].pageX);\n const maxY = Math.max(touches[0].pageY, touches[1].pageY);\n\n return {\n x: minX,\n y: minY,\n left: minX,\n top: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n },\n\n touchDistance: function (event, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n\n\n const dx = touches[0][sourceX] - touches[1][sourceX];\n const dy = touches[0][sourceY] - touches[1][sourceY];\n\n return hypot(dx, dy);\n },\n\n touchAngle: function (event, prevAngle, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n const dx = touches[1][sourceX] - touches[0][sourceX];\n const dy = touches[1][sourceY] - touches[0][sourceY];\n const angle = 180 * Math.atan2(dy , dx) / Math.PI;\n\n return angle;\n },\n\n getPointerType: function (pointer) {\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : is.number(pointer.pointerType)\n ? [undefined, undefined,'touch', 'pen', 'mouse'][pointer.pointerType]\n // if the PointerEvent API isn't available, then the \"pointer\" must\n // be either a MouseEvent, TouchEvent, or Touch object\n : /touch/.test(pointer.type) || pointer instanceof domObjects.Touch\n ? 'touch'\n : 'mouse';\n },\n\n // [ event.target, event.currentTarget ]\n getEventTargets: function (event) {\n return [\n domUtils.getActualElement(event.path ? event.path[0] : event.target),\n domUtils.getActualElement(event.currentTarget),\n ];\n },\n};\n\nmodule.exports = pointerUtils;\n","const { window } = require('./window');\n\nconst vendors = ['ms', 'moz', 'webkit', 'o'];\nlet lastTime = 0;\nlet request;\nlet cancel;\n\nfor (let x = 0; x < vendors.length && !window.requestAnimationFrame; x++) {\n request = window[vendors[x] + 'RequestAnimationFrame'];\n cancel = window[vendors[x] +'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n}\n\nif (!request) {\n request = function (callback) {\n const currTime = new Date().getTime();\n const timeToCall = Math.max(0, 16 - (currTime - lastTime));\n const id = setTimeout(function () { callback(currTime + timeToCall); },\n timeToCall);\n\n lastTime = currTime + timeToCall;\n return id;\n };\n}\n\nif (!cancel) {\n cancel = function (id) {\n clearTimeout(id);\n };\n}\n\nmodule.exports = {\n request,\n cancel,\n};\n","const extend = require('./extend');\nconst is = require('./is');\nconst {\n closest,\n parentNode,\n getElementRect,\n} = require('./domUtils');\n\nconst rectUtils = {\n getStringOptionResult: function (value, interactable, element) {\n if (!is.string(value)) {\n return null;\n }\n\n if (value === 'parent') {\n value = parentNode(element);\n }\n else if (value === 'self') {\n value = interactable.getRect(element);\n }\n else {\n value = closest(element, value);\n }\n\n return value;\n },\n\n resolveRectLike: function (value, interactable, element, functionArgs) {\n value = rectUtils.getStringOptionResult(value, interactable, element) || value;\n\n if (is.function(value)) {\n value = value.apply(null, functionArgs);\n }\n\n if (is.element(value)) {\n value = getElementRect(value);\n }\n\n return value;\n },\n\n rectToXY: function (rect) {\n return rect && {\n x: 'x' in rect ? rect.x : rect.left,\n y: 'y' in rect ? rect.y : rect.top,\n };\n },\n\n xywhToTlbr: function (rect) {\n if (rect && !('left' in rect && 'top' in rect)) {\n rect = extend({}, rect);\n\n rect.left = rect.x || 0;\n rect.top = rect.y || 0;\n rect.right = rect.right || (rect.left + rect.width);\n rect.bottom = rect.bottom || (rect.top + rect.height);\n }\n\n return rect;\n },\n\n tlbrToXywh: function (rect) {\n if (rect && !('x' in rect && 'y' in rect)) {\n rect = extend({}, rect);\n\n rect.x = rect.left || 0;\n rect.top = rect.top || 0;\n rect.width = rect.width || (rect.right - rect.x);\n rect.height = rect.height || (rect.bottom - rect.y);\n }\n\n return rect;\n },\n};\n\nmodule.exports = rectUtils;\n","const win = module.exports;\nconst isWindow = require('./isWindow');\n\nfunction init (window) {\n // get wrapped window if using Shadow DOM polyfill\n\n win.realWindow = window;\n\n // create a TextNode\n const el = window.document.createTextNode('');\n\n // check if it's wrapped by a polyfill\n if (el.ownerDocument !== window.document\n && typeof window.wrap === 'function'\n && window.wrap(el) === el) {\n // use wrapped window\n window = window.wrap(window);\n }\n\n win.window = window;\n}\n\nif (typeof window === 'undefined') {\n win.window = undefined;\n win.realWindow = undefined;\n}\nelse {\n init(window);\n}\n\nwin.getWindow = function getWindow (node) {\n if (isWindow(node)) {\n return node;\n }\n\n const rootNode = (node.ownerDocument || node);\n\n return rootNode.defaultView || rootNode.parentWindow || win.window;\n};\n\nwin.init = init;\n"]} \ No newline at end of file diff --git a/package.json b/package.json index 76f3e9969..f39704e99 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "interactjs", - "version": "1.3.0-alpha.3+sha.9595c40", + "version": "1.3.0-alpha.4+sha.7970416", "repository": { "type": "git", "url": "https://github.com/taye/interact.js.git"
- Interactable.resizable([options])⚓➭ + Interactable.resizable([options])⚓➭ @@ -638,7 +638,7 @@ Parameters - Interactable.gesturable([options])⚓➭ + Interactable.gesturable([options])⚓➭ @@ -758,7 +758,7 @@ Parameters - Interactable⚓➭ + Interactable⚓➭ @@ -783,7 +783,7 @@ Interactable - Interactable.getRect([element])⚓➭ + Interactable.getRect([element])⚓➭ @@ -888,7 +888,7 @@ Parameters - Interactable.rectChecker([checker])⚓➭ + Interactable.rectChecker([checker])⚓➭ @@ -951,7 +951,7 @@ Parameters - Interactable.origin(…)⚓➭ + Interactable.origin(…)⚓➭ @@ -1041,7 +1041,7 @@ Parameters - Interactable.deltaSource([newValue])⚓➭ + Interactable.deltaSource([newValue])⚓➭ @@ -1104,7 +1104,7 @@ Parameters - Interactable.context()⚓➭ + Interactable.context()⚓➭ @@ -1146,7 +1146,7 @@ Interactable.context() - Interactable.fire(iEvent)⚓➭ + Interactable.fire(iEvent)⚓➭ @@ -1207,7 +1207,7 @@ Parameters - Interactable.on(eventType, listener, [options])⚓➭ + Interactable.on(eventType, listener, [options])⚓➭ @@ -1273,7 +1273,7 @@ Parameters - Interactable.off(eventType, listener, [options])⚓➭ + Interactable.off(eventType, listener, [options])⚓➭ @@ -1339,7 +1339,7 @@ Parameters - Interactable.set(options)⚓➭ + Interactable.set(options)⚓➭ @@ -1399,7 +1399,7 @@ Parameters - Interactable.unset()⚓➭ + Interactable.unset()⚓➭ @@ -1442,7 +1442,7 @@ Interactable.unset() - Interactable.actionChecker([checker])⚓➭ + Interactable.actionChecker([checker])⚓➭ @@ -1542,7 +1542,7 @@ Parameters - Interactable.styleCursor([newValue])⚓➭ + Interactable.styleCursor([newValue])⚓➭ @@ -1605,7 +1605,7 @@ Parameters - interact.maxInteractions([newValue])⚓➭ + interact.maxInteractions([newValue])⚓➭ @@ -1652,7 +1652,7 @@ Parameters - Interactable.preventDefault([newValue])⚓➭ + Interactable.preventDefault([newValue])⚓➭ @@ -1718,7 +1718,7 @@ Parameters - interact(element)⚓➭ + interact(element)⚓➭ @@ -1821,7 +1821,7 @@ Usage - interact.isSet(element)⚓➭ + interact.isSet(element)⚓➭ @@ -1881,7 +1881,7 @@ Parameters - interact.on(type, listener, [options])⚓➭ + interact.on(type, listener, [options])⚓➭ @@ -1948,7 +1948,7 @@ Parameters - interact.off(type, listener, [options])⚓➭ + interact.off(type, listener, [options])⚓➭ @@ -2014,7 +2014,7 @@ Parameters - interact.debug()⚓➭ + interact.debug()⚓➭ @@ -2056,7 +2056,7 @@ interact.debug() - interact.supportsTouch()⚓➭ + interact.supportsTouch()⚓➭ @@ -2097,7 +2097,7 @@ interact.supportsTouch() - interact.supportsPointerEvent()⚓➭ + interact.supportsPointerEvent()⚓➭ @@ -2138,7 +2138,7 @@ interact.supportsPointerEvent() - interact.stop(event)⚓➭ + interact.stop(event)⚓➭ @@ -2198,7 +2198,7 @@ Parameters - interact.pointerMoveTolerance([newValue])⚓➭ + interact.pointerMoveTolerance([newValue])⚓➭ @@ -2261,7 +2261,7 @@ Parameters - Interaction.start(action, target, element)⚓➭ + Interaction.start(action, target, element)⚓➭ @@ -2356,7 +2356,7 @@ Parameters - Interaction.doMove()⚓➭ + Interaction.doMove()⚓➭ @@ -2403,7 +2403,7 @@ Interaction.doMove() - Interaction.end([event])⚓➭ + Interaction.end([event])⚓➭ diff --git a/dist/interact.js b/dist/interact.js index e8ae35c3b..c78a3c751 100644 --- a/dist/interact.js +++ b/dist/interact.js @@ -1,5 +1,5 @@ /** - * interact.js v1.3.0-alpha.3+sha.9595c40 + * interact.js v1.3.0-alpha.4+sha.7970416-dirty * * Copyright (c) 2012-2017 Taye Adeyemi * Open source under the MIT License. @@ -816,6 +816,7 @@ var scope = require('./scope'); var utils = require('./utils'); var events = require('./utils/events'); var browser = require('./utils/browser'); +var domObjects = require('./utils/domObjects'); var finder = require('./utils/interactionFinder'); var signals = require('./utils/Signals').new(); @@ -829,7 +830,9 @@ var prevTouchTime = 0; scope.interactions = []; var Interaction = function () { - function Interaction() { + function Interaction(_ref) { + var pointerType = _ref.pointerType; + _classCallCheck(this, Interaction); this.target = null; // current interactable being interacted with @@ -886,7 +889,7 @@ var Interaction = function () { this.pointerWasMoved = false; this._interacting = false; - this.mouse = false; + this.pointerType = pointerType; signals.fire('new', this); @@ -1130,6 +1133,11 @@ var Interaction = function () { }; Interaction.prototype.getPointerIndex = function getPointerIndex(pointer) { + // mouse and pen interactions may have only one pointer + if (this.pointerType === 'mouse' || this.pointerType === 'pen') { + return 0; + } + return utils.indexOf(this.pointerIds, utils.getPointerId(pointer)); }; @@ -1161,8 +1169,7 @@ var Interaction = function () { }; Interaction.prototype.removePointer = function removePointer(pointer, event) { - var id = utils.getPointerId(pointer); - var index = this.mouse ? 0 : utils.indexOf(this.pointerIds, id); + var index = this.getPointerIndex(pointer); if (index === -1) { return; @@ -1197,6 +1204,8 @@ for (var i = 0, len = methodNames.length; i < len; i++) { function doOnInteractions(method) { return function (event) { + var pointerType = utils.getPointerType(event); + var _utils$getEventTarget = utils.getEventTargets(event), eventTarget = _utils$getEventTarget[0], curEventTarget = _utils$getEventTarget[1]; @@ -1210,7 +1219,7 @@ function doOnInteractions(method) { var pointer = event.changedTouches[_i]; var interaction = finder.search(pointer, event.type, eventTarget); - matches.push([pointer, interaction || new Interaction()]); + matches.push([pointer, interaction || new Interaction({ pointerType: pointerType })]); } } else { var invalidPointer = false; @@ -1218,7 +1227,7 @@ function doOnInteractions(method) { if (!browser.supportsPointerEvent && /mouse/.test(event.type)) { // ignore mouse events while touch interactions are active for (var _i2 = 0; _i2 < scope.interactions.length && !invalidPointer; _i2++) { - invalidPointer = !scope.interactions[_i2].mouse && scope.interactions[_i2].pointerIsDown; + invalidPointer = scope.interactions[_i2].pointerType !== 'mouse' && scope.interactions[_i2].pointerIsDown; } // try to ignore mouse events that are simulated by the browser @@ -1232,11 +1241,7 @@ function doOnInteractions(method) { var _interaction = finder.search(event, event.type, eventTarget); if (!_interaction) { - - _interaction = new Interaction(); - _interaction.mouse = /mouse/i.test(event.pointerType || event.type) - // MSPointerEvent.MSPOINTER_TYPE_MOUSE - || event.pointerType === 4 || !event.pointerType; + _interaction = new Interaction({ pointerType: pointerType }); } matches.push([event, _interaction]); @@ -1244,20 +1249,20 @@ function doOnInteractions(method) { } for (var _iterator = matches, _isArray = Array.isArray(_iterator), _i3 = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { - var _ref; + var _ref2; if (_isArray) { if (_i3 >= _iterator.length) break; - _ref = _iterator[_i3++]; + _ref2 = _iterator[_i3++]; } else { _i3 = _iterator.next(); if (_i3.done) break; - _ref = _i3.value; + _ref2 = _i3.value; } - var _ref2 = _ref, - _pointer = _ref2[0], - _interaction2 = _ref2[1]; + var _ref3 = _ref2, + _pointer = _ref3[0], + _interaction2 = _ref3[1]; _interaction2._updateEventTargets(eventTarget, curEventTarget); _interaction2[method](_pointer, event, eventTarget, curEventTarget); @@ -1277,7 +1282,7 @@ function endAll(event) { var docEvents = {/* 'eventType': listenerFunc */}; var pEventTypes = browser.pEventTypes; -if (scope.PointerEvent) { +if (domObjects.PointerEvent) { docEvents[pEventTypes.down] = listeners.pointerDown; docEvents[pEventTypes.move] = listeners.pointerMove; docEvents[pEventTypes.up] = listeners.pointerUp; @@ -1295,8 +1300,8 @@ if (scope.PointerEvent) { docEvents.blur = endAll; -function onDocSignal(_ref3, signalName) { - var doc = _ref3.doc; +function onDocSignal(_ref4, signalName) { + var doc = _ref4.doc; var eventMethod = signalName.indexOf('add') === 0 ? events.add : events.remove; @@ -1311,14 +1316,14 @@ function onDocSignal(_ref3, signalName) { } } -signals.on('update-pointer-down', function (_ref4) { - var interaction = _ref4.interaction, - pointer = _ref4.pointer, - pointerId = _ref4.pointerId, - pointerIndex = _ref4.pointerIndex, - event = _ref4.event, - eventTarget = _ref4.eventTarget, - down = _ref4.down; +signals.on('update-pointer-down', function (_ref5) { + var interaction = _ref5.interaction, + pointer = _ref5.pointer, + pointerId = _ref5.pointerId, + pointerIndex = _ref5.pointerIndex, + event = _ref5.event, + eventTarget = _ref5.eventTarget, + down = _ref5.down; interaction.pointerIds[pointerIndex] = pointerId; interaction.pointers[pointerIndex] = pointer; @@ -1355,7 +1360,7 @@ scope.endAllInteractions = endAll; module.exports = Interaction; -},{"./scope":34,"./utils":44,"./utils/Signals":35,"./utils/browser":37,"./utils/events":40,"./utils/interactionFinder":45}],6:[function(require,module,exports){ +},{"./scope":34,"./utils":44,"./utils/Signals":35,"./utils/browser":37,"./utils/domObjects":38,"./utils/events":40,"./utils/interactionFinder":45}],6:[function(require,module,exports){ 'use strict'; var Interaction = require('../Interaction'); @@ -5460,7 +5465,7 @@ module.exports = function () { this.originalEvent = event; this.type = type; this.pointerId = pointerUtils.getPointerId(pointer); - this.pointerType = pointerUtils.getPointerType(pointer, interaction); + this.pointerType = pointerUtils.getPointerType(pointer); this.target = eventTarget; this.currentTarget = null; @@ -5758,8 +5763,10 @@ Interaction.signals.on('down', function (_ref6) { timer.duration = minDuration; timer.timeout = setTimeout(function () { fire({ - interaction: interaction, eventCopy: eventCopy, eventTarget: eventTarget, + interaction: interaction, + eventTarget: eventTarget, pointer: browser.isIE8 ? eventCopy : pointer, + event: eventCopy, type: 'hold' }); }, minDuration); @@ -6946,17 +6953,14 @@ module.exports = utils; var scope = require('../scope'); var utils = require('./index'); -var browser = require('./browser'); var finder = { - methodOrder: ['simulationResume', 'mouse', 'hasPointer', 'idle'], + methodOrder: ['simulationResume', 'mouseOrPen', 'hasPointer', 'idle'], search: function search(pointer, eventType, eventTarget) { - var mouseEvent = /mouse/i.test(pointer.pointerType || eventType) - // MSPointerEvent.MSPOINTER_TYPE_MOUSE - || pointer.pointerType === 4; + var pointerType = utils.getPointerType(pointer); var pointerId = utils.getPointerId(pointer); - var details = { pointer: pointer, pointerId: pointerId, mouseEvent: mouseEvent, eventType: eventType, eventTarget: eventTarget }; + var details = { pointer: pointer, pointerId: pointerId, pointerType: pointerType, eventType: eventType, eventTarget: eventTarget }; for (var _iterator = finder.methodOrder, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { var _ref; @@ -6982,7 +6986,7 @@ var finder = { // try to resume simulation with a new pointer simulationResume: function simulationResume(_ref2) { - var mouseEvent = _ref2.mouseEvent, + var pointerType = _ref2.pointerType, eventType = _ref2.eventType, eventTarget = _ref2.eventTarget; @@ -7006,7 +7010,7 @@ var finder = { var element = eventTarget; - if (interaction.simulation && interaction.simulation.allowResume && interaction.mouse === mouseEvent) { + if (interaction.simulation && interaction.simulation.allowResume && interaction.pointerType === pointerType) { while (element) { // if the element is the interaction element if (element === interaction.element) { @@ -7020,13 +7024,13 @@ var finder = { return null; }, - // if it's a mouse interaction - mouse: function mouse(_ref4) { + // if it's a mouse or pen interaction + mouseOrPen: function mouseOrPen(_ref4) { var pointerId = _ref4.pointerId, - mouseEvent = _ref4.mouseEvent, + pointerType = _ref4.pointerType, eventType = _ref4.eventType; - if (!mouseEvent && (browser.supportsTouch || browser.supportsPointerEvent)) { + if (pointerType !== 'mouse' && pointerType !== 'pen') { return null; } @@ -7046,7 +7050,7 @@ var finder = { var interaction = _ref5; - if (interaction.mouse) { + if (interaction.pointerType === pointerType) { // if it's a down event, skip interactions with running simulations if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; @@ -7069,8 +7073,8 @@ var finder = { return firstNonActive; } - // Find any interaction specifically for mouse. - // ignore the interaction if the eventType is a mousedown, and a simulation + // find any mouse or pen interaction. + // ignore the interaction if the eventType is a *down, and a simulation // is active for (var _iterator4 = scope.interactions, _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) { var _ref6; @@ -7086,7 +7090,7 @@ var finder = { var _interaction = _ref6; - if (_interaction.mouse && !(/down/.test(eventType) && _interaction.simulation)) { + if (_interaction.pointerType === pointerType && !(/down/i.test(eventType) && _interaction.simulation)) { return _interaction; } } @@ -7118,9 +7122,9 @@ var finder = { } }, - // get first idle interaction + // get first idle interaction with a matching pointerType idle: function idle(_ref9) { - var mouseEvent = _ref9.mouseEvent; + var pointerType = _ref9.pointerType; for (var _iterator6 = scope.interactions, _isArray6 = Array.isArray(_iterator6), _i6 = 0, _iterator6 = _isArray6 ? _iterator6 : _iterator6[Symbol.iterator]();;) { var _ref10; @@ -7150,7 +7154,7 @@ var finder = { continue; } - if (!interaction.interacting() && mouseEvent === interaction.mouse) { + if (!interaction.interacting() && pointerType === interaction.pointerType) { return interaction; } } @@ -7161,7 +7165,7 @@ var finder = { module.exports = finder; -},{"../scope":34,"./browser":37,"./index":44}],46:[function(require,module,exports){ +},{"../scope":34,"./index":44}],46:[function(require,module,exports){ 'use strict'; var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; @@ -7262,6 +7266,7 @@ var hypot = require('./hypot'); var browser = require('./browser'); var dom = require('./domObjects'); var domUtils = require('./domUtils'); +var domObjects = require('./domObjects'); var is = require('./is'); var pointerExtend = require('./pointerExtend'); @@ -7468,17 +7473,11 @@ var pointerUtils = { return angle; }, - getPointerType: function getPointerType(pointer, interaction) { - // if the PointerEvent API isn't available, then the pointer must be ither - // a MouseEvent or TouchEvent - if (interaction.mouse) { - return 'mouse'; - } - if (!browser.supportsPointerEvent) { - return 'touch'; - } - - return is.string(pointer.pointerType) ? pointer.pointerType : [undefined, undefined, 'touch', 'pen', 'mouse'][pointer.pointerType]; + getPointerType: function getPointerType(pointer) { + return is.string(pointer.pointerType) ? pointer.pointerType : is.number(pointer.pointerType) ? [undefined, undefined, 'touch', 'pen', 'mouse'][pointer.pointerType] + // if the PointerEvent API isn't available, then the "pointer" must + // be either a MouseEvent, TouchEvent, or Touch object + : /touch/.test(pointer.type) || pointer instanceof domObjects.Touch ? 'touch' : 'mouse'; }, // [ event.target, event.currentTarget ] diff --git a/dist/interact.js.map b/dist/interact.js.map index 60832b766..4f3a62ba8 100644 --- a/dist/interact.js.map +++ b/dist/interact.js.map @@ -1 +1 @@ -{"version":3,"sources":["src/header.js","node_modules/browser-pack/_prelude.js","index.js","src/Eventable.js","src/InteractEvent.js","src/Interactable.js","src/Interaction.js","src/actions/base.js","src/actions/drag.js","src/actions/drop.js","src/actions/gesture.js","src/actions/resize.js","src/autoScroll.js","src/autoStart/InteractableMethods.js","src/autoStart/base.js","src/autoStart/delay.js","src/autoStart/drag.js","src/autoStart/gesture.js","src/autoStart/resize.js","src/defaultOptions.js","src/index.js","src/inertia.js","src/interact.js","src/interactablePreventDefault.js","src/legacyBrowsers.js","src/modifiers/index.js","src/modifiers/restrict.js","src/modifiers/restrictEdges.js","src/modifiers/restrictSize.js","src/modifiers/snap.js","src/modifiers/snapSize.js","src/pointerEvents/PointerEvent.js","src/pointerEvents/base.js","src/pointerEvents/holdRepeat.js","src/pointerEvents/interactableTargets.js","src/scope.js","src/utils/Signals.js","src/utils/arr.js","src/utils/browser.js","src/utils/domObjects.js","src/utils/domUtils.js","src/utils/events.js","src/utils/extend.js","src/utils/getOriginXY.js","src/utils/hypot.js","src/utils/index.js","src/utils/interactionFinder.js","src/utils/is.js","src/utils/isWindow.js","src/utils/pointerExtend.js","src/utils/pointerUtils.js","src/utils/raf.js","src/utils/rect.js","src/utils/window.js"],"names":[],"mappings":";AAAA;AACA;AACA;AACA;AACA;AACA;ACLA,ADMA;AACA;;AEPA;;;;;;;;AAQA,IAAI,OAAO,MAAP,KAAkB,WAAtB,EAAmC;AACjC,SAAO,OAAP,GAAiB,UAAU,MAAV,EAAkB;AACjC,YAAQ,oBAAR,EAA8B,IAA9B,CAAmC,MAAnC;;AAEA,WAAO,QAAQ,aAAR,CAAP;AACD,GAJD;AAKD,CAND,MAOK;AACH,SAAO,OAAP,GAAiB,QAAQ,aAAR,CAAjB;AACD;;;;;;;eCjBmB,QAAQ,aAAR,C;IAAZ,O,YAAA,O;;AACR,IAAM,SAAS,QAAQ,mBAAR,CAAf;;AAEA,SAAS,yBAAT,CAAoC,KAApC,EAA2C,SAA3C,EAAsD;AACpD,OAAK,IAAI,IAAI,CAAR,EAAW,MAAM,UAAU,MAAhC,EAAwC,IAAI,GAAJ,IAAW,CAAC,MAAM,2BAA1D,EAAuF,GAAvF,EAA4F;AAC1F,cAAU,CAAV,EAAa,KAAb;AACD;AACF;;IAEK,S;AAEJ,qBAAa,OAAb,EAAsB;AAAA;;AACpB,SAAK,OAAL,GAAe,OAAO,EAAP,EAAW,WAAW,EAAtB,CAAf;AACD;;sBAED,I,iBAAM,K,EAAO;AACX,QAAI,kBAAJ;AACA,QAAM,UAAU,OAAO,MAAM,IAA7B;AACA,QAAM,SAAS,KAAK,MAApB;;AAEA;AACA,QAAK,YAAY,KAAK,MAAM,IAAX,CAAjB,EAAoC;AAClC,gCAA0B,KAA1B,EAAiC,SAAjC;AACD;;AAED;AACA,QAAI,KAAK,OAAL,CAAJ,EAAmB;AACjB,WAAK,OAAL,EAAc,KAAd;AACD;;AAED;AACA,QAAI,CAAC,MAAM,kBAAP,IAA6B,MAA7B,KAAwC,YAAY,OAAO,MAAM,IAAb,CAApD,CAAJ,EAA8E;AAC5E,gCAA0B,KAA1B,EAAiC,SAAjC;AACD;AACF,G;;sBAED,E,eAAI,S,EAAW,Q,EAAU;AACvB;AACA,QAAI,KAAK,SAAL,CAAJ,EAAqB;AACnB,WAAK,SAAL,EAAgB,IAAhB,CAAqB,QAArB;AACD,KAFD,MAGK;AACH,WAAK,SAAL,IAAkB,CAAC,QAAD,CAAlB;AACD;AACF,G;;sBAED,G,gBAAK,S,EAAW,Q,EAAU;AACxB;AACA,QAAM,YAAY,KAAK,SAAL,CAAlB;AACA,QAAM,QAAY,YAAW,QAAQ,SAAR,EAAmB,QAAnB,CAAX,GAA0C,CAAC,CAA7D;;AAEA,QAAI,UAAU,CAAC,CAAf,EAAkB;AAChB,gBAAU,MAAV,CAAiB,KAAjB,EAAwB,CAAxB;AACD;;AAED,QAAI,aAAa,UAAU,MAAV,KAAqB,CAAlC,IAAuC,CAAC,QAA5C,EAAsD;AACpD,WAAK,SAAL,IAAkB,QAAlB;AACD;AACF,G;;;;;AAGH,OAAO,OAAP,GAAiB,SAAjB;;;;;;;AC7DA,IAAM,SAAc,QAAQ,gBAAR,CAApB;AACA,IAAM,cAAc,QAAQ,qBAAR,CAApB;AACA,IAAM,WAAc,QAAQ,kBAAR,CAApB;AACA,IAAM,UAAc,QAAQ,iBAAR,EAA2B,GAA3B,EAApB;;IAEM,a;AACJ,yBAAa,WAAb,EAA0B,KAA1B,EAAiC,MAAjC,EAAyC,KAAzC,EAAgD,OAAhD,EAAyD,OAAzD,EAAkF;AAAA,QAAhB,MAAgB,uEAAP,KAAO;;AAAA;;AAChF,QAAM,SAAc,YAAY,MAAhC;AACA,QAAM,cAAc,CAAC,UAAU,OAAO,OAAjB,IAA4B,QAA7B,EAAuC,WAA3D;AACA,QAAM,SAAc,YAAY,MAAZ,EAAoB,OAApB,EAA6B,MAA7B,CAApB;AACA,QAAM,WAAc,UAAU,OAA9B;AACA,QAAM,SAAc,UAAU,KAA9B;AACA,QAAM,SAAc,WAAU,YAAY,WAAtB,GAAoC,YAAY,SAApE;AACA,QAAM,YAAc,YAAY,SAAhC;;AAEA,cAAU,WAAW,YAAY,OAAjC;;AAEA,QAAM,OAAS,OAAO,EAAP,EAAW,OAAO,IAAlB,CAAf;AACA,QAAM,SAAS,OAAO,EAAP,EAAW,OAAO,MAAlB,CAAf;;AAEA,SAAK,CAAL,IAAU,OAAO,CAAjB;AACA,SAAK,CAAL,IAAU,OAAO,CAAjB;;AAEA,WAAO,CAAP,IAAY,OAAO,CAAnB;AACA,WAAO,CAAP,IAAY,OAAO,CAAnB;;AAEA,SAAK,OAAL,GAAqB,MAAM,OAA3B;AACA,SAAK,MAAL,GAAqB,MAAM,MAA3B;AACA,SAAK,QAAL,GAAqB,MAAM,QAA3B;AACA,SAAK,OAAL,GAAqB,MAAM,OAA3B;AACA,SAAK,MAAL,GAAqB,MAAM,MAA3B;AACA,SAAK,OAAL,GAAqB,MAAM,OAA3B;AACA,SAAK,MAAL,GAAqB,OAArB;AACA,SAAK,aAAL,GAAqB,OAArB;AACA,SAAK,aAAL,GAAqB,WAAW,IAAhC;AACA,SAAK,MAAL,GAAqB,MAArB;AACA,SAAK,IAAL,GAAqB,UAAU,SAAS,EAAnB,CAArB;AACA,SAAK,WAAL,GAAqB,WAArB;AACA,SAAK,YAAL,GAAqB,MAArB;;AAEA,SAAK,EAAL,GAAU,WAAW,YAAY,SAAZ,CAAsB,YAAY,SAAZ,CAAsB,MAAtB,GAA+B,CAArD,CAAX,GACW,UAAU,EAD/B;;AAGA,QAAM,YAAY;AAChB,8BADgB;AAEhB,kBAFgB;AAGhB,oBAHgB;AAIhB,kBAJgB;AAKhB,sBALgB;AAMhB,sBANgB;AAOhB,gBAPgB;AAQhB,oBARgB;AAShB,oBATgB;AAUhB,wBAVgB;AAWhB,oBAXgB;AAYhB,8BAZgB;AAahB,cAAQ;AAbQ,KAAlB;;AAgBA,YAAQ,IAAR,CAAa,QAAb,EAAuB,SAAvB;;AAEA,QAAI,MAAJ,EAAY;AACV;AACA,WAAK,KAAL,GAAa,UAAU,KAAvB;AACA,WAAK,KAAL,GAAa,UAAU,KAAvB;AACA,WAAK,OAAL,GAAe,UAAU,OAAzB;AACA,WAAK,OAAL,GAAe,UAAU,OAAzB;AACD,KAND,MAOK;AACH,WAAK,KAAL,GAAiB,KAAK,CAAtB;AACA,WAAK,KAAL,GAAiB,KAAK,CAAtB;AACA,WAAK,OAAL,GAAiB,OAAO,CAAxB;AACA,WAAK,OAAL,GAAiB,OAAO,CAAxB;AACD;;AAED,SAAK,EAAL,GAAiB,YAAY,WAAZ,CAAwB,IAAxB,CAA6B,CAA7B,GAAiC,OAAO,CAAzD;AACA,SAAK,EAAL,GAAiB,YAAY,WAAZ,CAAwB,IAAxB,CAA6B,CAA7B,GAAiC,OAAO,CAAzD;AACA,SAAK,QAAL,GAAiB,YAAY,WAAZ,CAAwB,MAAxB,CAA+B,CAA/B,GAAmC,OAAO,CAA3D;AACA,SAAK,QAAL,GAAiB,YAAY,WAAZ,CAAwB,MAAxB,CAA+B,CAA/B,GAAmC,OAAO,CAA3D;;AAEA,YAAQ,IAAR,CAAa,WAAb,EAA0B,SAA1B;;AAEA,SAAK,SAAL,GAAiB,OAAO,SAAxB;AACA,SAAK,EAAL,GAAiB,YAAY,YAAZ,CAAyB,SAA1C;AACA,SAAK,QAAL,GAAiB,KAAK,SAAL,GAAiB,KAAK,EAAvC;;AAEA;AACA,SAAK,KAAL,GAAa,YAAY,YAAZ,CAAyB,WAAzB,EAAsC,KAAnD;AACA,SAAK,SAAL,GAAiB,YAAY,YAAZ,CAAyB,WAAzB,EAAsC,EAAvD;AACA,SAAK,SAAL,GAAiB,YAAY,YAAZ,CAAyB,WAAzB,EAAsC,EAAvD;;AAEA,SAAK,KAAL,GAAc,UAAU,UAAU,cAArB,GAAsC,KAAK,QAAL,EAAtC,GAAwD,IAArE;;AAEA,YAAQ,IAAR,CAAa,KAAb,EAAoB,SAApB;AACD;;0BAED,Q,uBAAY;AACV,QAAM,cAAc,KAAK,WAAzB;;AAEA,QAAI,YAAY,SAAZ,CAAsB,KAAtB,GAA8B,GAA9B,IACG,KAAK,SAAL,GAAiB,YAAY,SAAZ,CAAsB,SAAvC,GAAmD,GAD1D,EAC+D;AAC7D,aAAO,IAAP;AACD;;AAED,QAAI,QAAQ,MAAM,KAAK,KAAL,CAAW,YAAY,SAAZ,CAAsB,SAAjC,EAA4C,YAAY,SAAZ,CAAsB,SAAlE,CAAN,GAAqF,KAAK,EAAtG;AACA,QAAM,UAAU,IAAhB;;AAEA,QAAI,QAAQ,CAAZ,EAAe;AACb,eAAS,GAAT;AACD;;AAED,QAAM,OAAO,MAAM,OAAN,IAAiB,KAAjB,IAA0B,QAAQ,MAAM,OAArD;AACA,QAAM,KAAO,MAAM,OAAN,IAAiB,KAAjB,IAA0B,QAAQ,MAAM,OAArD;;AAEA,QAAM,QAAQ,CAAC,IAAD,KAAU,MAAM,OAAN,IAAiB,KAAjB,IAA0B,QAAS,KAAK,OAAlD,CAAd;AACA,QAAM,OAAQ,CAAC,EAAD,IAAW,KAAK,OAAL,IAAgB,KAA3B,IAAoC,QAAQ,MAAM,OAAhE;;AAEA,WAAO;AACL,YADK;AAEL,gBAFK;AAGL,gBAHK;AAIL,kBAJK;AAKL,kBALK;AAML,aAAO,YAAY,SAAZ,CAAsB,KANxB;AAOL,gBAAU;AACR,WAAG,YAAY,SAAZ,CAAsB,SADjB;AAER,WAAG,YAAY,SAAZ,CAAsB;AAFjB;AAPL,KAAP;AAYD,G;;0BAED,c,6BAAkB,CAAE,C;;0BAEpB,wB,uCAA4B;AAC1B,SAAK,2BAAL,GAAmC,KAAK,kBAAL,GAA0B,IAA7D;AACD,G;;0BAED,e,8BAAmB;AACjB,SAAK,kBAAL,GAA0B,IAA1B;AACD,G;;;;;AAGH,QAAQ,EAAR,CAAW,WAAX,EAAwB,gBAA0D;AAAA,MAA9C,MAA8C,QAA9C,MAA8C;AAAA,MAAtC,WAAsC,QAAtC,WAAsC;AAAA,MAAzB,QAAyB,QAAzB,QAAyB;AAAA,MAAf,WAAe,QAAf,WAAe;;AAChF,MAAM,YAAY,WAAU,MAAV,GAAmB,YAAY,SAAjD;;AAEA,MAAI,gBAAgB,QAApB,EAA8B;AAC5B,WAAO,EAAP,GAAY,OAAO,OAAP,GAAiB,UAAU,OAAvC;AACA,WAAO,EAAP,GAAY,OAAO,OAAP,GAAiB,UAAU,OAAvC;AACD,GAHD,MAIK;AACH,WAAO,EAAP,GAAY,OAAO,KAAP,GAAe,UAAU,KAArC;AACA,WAAO,EAAP,GAAY,OAAO,KAAP,GAAe,UAAU,KAArC;AACD;AACF,CAXD;;AAaA,cAAc,OAAd,GAAwB,OAAxB;;AAEA,OAAO,OAAP,GAAiB,aAAjB;;;;;;;AC7JA,IAAM,KAAY,QAAQ,YAAR,CAAlB;AACA,IAAM,SAAY,QAAQ,gBAAR,CAAlB;AACA,IAAM,SAAY,QAAQ,gBAAR,CAAlB;AACA,IAAM,UAAY,QAAQ,gBAAR,CAAlB;AACA,IAAM,QAAY,QAAQ,SAAR,CAAlB;AACA,IAAM,YAAY,QAAQ,aAAR,CAAlB;AACA,IAAM,WAAY,QAAQ,kBAAR,CAAlB;AACA,IAAM,UAAY,QAAQ,iBAAR,EAA2B,GAA3B,EAAlB;;eAM8B,QAAQ,kBAAR,C;IAH5B,c,YAAA,c;IACA,Y,YAAA,Y;IACA,W,YAAA,W;;gBAE4B,QAAQ,gBAAR,C;IAAtB,S,aAAA,S;;gBACsB,QAAQ,aAAR,C;IAAtB,O,aAAA,O;IAAS,Q,aAAA,Q;;gBACa,QAAQ,iBAAR,C;IAAtB,U,aAAA,U;;AAER;;;AACA,MAAM,aAAN,GAAsB,EAAtB;;AAEA;;;;;;;IAMM,Y;AACJ,wBAAa,MAAb,EAAqB,OAArB,EAA8B;AAAA;;AAC5B,cAAU,WAAW,EAArB;;AAEA,SAAK,MAAL,GAAgB,MAAhB;AACA,SAAK,MAAL,GAAgB,IAAI,SAAJ,EAAhB;AACA,SAAK,QAAL,GAAgB,QAAQ,OAAR,IAAmB,MAAM,QAAzC;AACA,SAAK,IAAL,GAAgB,UAAU,YAAY,MAAZ,IAAqB,KAAK,QAA1B,GAAqC,MAA/C,CAAhB;AACA,SAAK,IAAL,GAAgB,KAAK,IAAL,CAAU,QAA1B;;AAEA,YAAQ,IAAR,CAAa,KAAb,EAAoB;AAClB,oBADkB;AAElB,sBAFkB;AAGlB,oBAAc,IAHI;AAIlB,WAAK,KAAK;AAJQ,KAApB;;AAOA,UAAM,WAAN,CAAmB,KAAK,IAAxB,EAA8B,KAAK,IAAnC;;AAEA,UAAM,aAAN,CAAoB,IAApB,CAAyB,IAAzB;;AAEA,SAAK,GAAL,CAAS,OAAT;AACD;;yBAED,W,wBAAa,M,EAAQ,M,EAAQ;AAC3B,QAAM,WAAW,OAAO,MAAxB;;AAEA,QAAI,GAAG,QAAH,CAAY,OAAO,OAAnB,CAAJ,EAAwC;AAAE,WAAK,MAAL,CAAY,WAAW,OAAvB,IAA0C,OAAO,OAAjD;AAAoE;AAC9G,QAAI,GAAG,QAAH,CAAY,OAAO,MAAnB,CAAJ,EAAwC;AAAE,WAAK,MAAL,CAAY,WAAW,MAAvB,IAA0C,OAAO,MAAjD;AAAoE;AAC9G,QAAI,GAAG,QAAH,CAAY,OAAO,KAAnB,CAAJ,EAAwC;AAAE,WAAK,MAAL,CAAY,WAAW,KAAvB,IAA0C,OAAO,KAAjD;AAAoE;AAC9G,QAAI,GAAG,QAAH,CAAY,OAAO,cAAnB,CAAJ,EAAwC;AAAE,WAAK,MAAL,CAAY,WAAW,cAAvB,IAA0C,OAAO,cAAjD;AAAoE;;AAE9G,WAAO,IAAP;AACD,G;;yBAED,Y,yBAAc,M,EAAQ,O,EAAS;AAC7B;AACA,SAAK,IAAM,MAAX,IAAqB,OAArB,EAA8B;AAC5B;AACA,UAAI,UAAU,SAAS,MAAT,CAAd,EAAgC;AAC9B;AACA,YAAI,GAAG,MAAH,CAAU,QAAQ,MAAR,CAAV,CAAJ,EAAgC;AAC9B;AACA,eAAK,OAAL,CAAa,MAAb,EAAqB,MAArB,IAA+B,OAAO,KAAK,OAAL,CAAa,MAAb,EAAqB,MAArB,KAAgC,EAAvC,EAA2C,QAAQ,MAAR,CAA3C,CAA/B;;AAEA,cAAI,GAAG,MAAH,CAAU,SAAS,SAAT,CAAmB,MAAnB,CAAV,KAAyC,aAAa,SAAS,SAAT,CAAmB,MAAnB,CAA1D,EAAsF;AACpF,iBAAK,OAAL,CAAa,MAAb,EAAqB,MAArB,EAA6B,OAA7B,GAAuC,QAAQ,MAAR,EAAgB,OAAhB,KAA4B,KAA5B,GAAmC,KAAnC,GAA2C,IAAlF;AACD;AACF,SAPD,MAQK,IAAI,GAAG,IAAH,CAAQ,QAAQ,MAAR,CAAR,KAA4B,GAAG,MAAH,CAAU,SAAS,SAAT,CAAmB,MAAnB,CAAV,CAAhC,EAAuE;AAC1E,eAAK,OAAL,CAAa,MAAb,EAAqB,MAArB,EAA6B,OAA7B,GAAuC,QAAQ,MAAR,CAAvC;AACD,SAFI,MAGA,IAAI,QAAQ,MAAR,MAAoB,SAAxB,EAAmC;AACtC;AACA,eAAK,OAAL,CAAa,MAAb,EAAqB,MAArB,IAA+B,QAAQ,MAAR,CAA/B;AACD;AACF;AACF;AACF,G;;AAED;;;;;;;;;;;;;;;;;;;;yBAkBA,O,oBAAS,O,EAAS;AAChB,cAAU,WAAW,KAAK,MAA1B;;AAEA,QAAI,GAAG,MAAH,CAAU,KAAK,MAAf,KAA0B,CAAE,GAAG,OAAH,CAAW,OAAX,CAAhC,EAAsD;AACpD,gBAAU,KAAK,QAAL,CAAc,aAAd,CAA4B,KAAK,MAAjC,CAAV;AACD;;AAED,WAAO,eAAe,OAAf,CAAP;AACD,G;;AAED;;;;;;;;;;;;yBAUA,W,wBAAa,O,EAAS;AACpB,QAAI,GAAG,QAAH,CAAY,OAAZ,CAAJ,EAA0B;AACxB,WAAK,OAAL,GAAe,OAAf;;AAEA,aAAO,IAAP;AACD;;AAED,QAAI,YAAY,IAAhB,EAAsB;AACpB,aAAO,KAAK,OAAL,CAAa,OAApB;;AAEA,aAAO,IAAP;AACD;;AAED,WAAO,KAAK,OAAZ;AACD,G;;yBAED,iB,8BAAmB,U,EAAY,Q,EAAU;AACvC,QAAI,YAAY,QAAZ,KAAyB,GAAG,MAAH,CAAU,QAAV,CAA7B,EAAkD;AAChD,WAAK,OAAL,CAAa,UAAb,IAA2B,QAA3B;;AAEA,2BAAqB,QAAQ,KAA7B,kHAAoC;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,YAAzB,MAAyB;;AAClC,aAAK,OAAL,CAAa,MAAb,EAAqB,UAArB,IAAmC,QAAnC;AACD;;AAED,aAAO,IAAP;AACD;;AAED,WAAO,KAAK,OAAL,CAAa,UAAb,CAAP;AACD,G;;AAED;;;;;;;;;;;;;;;yBAaA,M,mBAAQ,Q,EAAU;AAChB,WAAO,KAAK,iBAAL,CAAuB,QAAvB,EAAiC,QAAjC,CAAP;AACD,G;;AAED;;;;;;;;;;;;yBAUA,W,wBAAa,Q,EAAU;AACrB,QAAI,aAAa,MAAb,IAAuB,aAAa,QAAxC,EAAkD;AAChD,WAAK,OAAL,CAAa,WAAb,GAA2B,QAA3B;;AAEA,aAAO,IAAP;AACD;;AAED,WAAO,KAAK,OAAL,CAAa,WAApB;AACD,G;;AAED;;;;;;;;;;;yBASA,O,sBAAW;AACT,WAAO,KAAK,QAAZ;AACD,G;;yBAED,S,sBAAW,O,EAAS;AAClB,WAAQ,KAAK,QAAL,KAAkB,QAAQ,aAA1B,IACG,aAAa,KAAK,QAAlB,EAA4B,OAA5B,CADX;AAED,G;;AAED;;;;;;;;;;;;yBAUA,I,iBAAM,M,EAAQ;AACZ,SAAK,MAAL,CAAY,IAAZ,CAAiB,MAAjB;;AAEA,WAAO,IAAP;AACD,G;;yBAED,c,2BAAgB,M,EAAQ,S,EAAW,Q,EAAU,O,EAAS;AACpD,QAAI,GAAG,MAAH,CAAU,SAAV,KAAwB,UAAU,MAAV,CAAiB,GAAjB,MAA0B,CAAC,CAAvD,EAA0D;AACxD,kBAAY,UAAU,IAAV,GAAiB,KAAjB,CAAuB,IAAvB,CAAZ;AACD;;AAED,QAAI,GAAG,KAAH,CAAS,SAAT,CAAJ,EAAyB;AACvB,WAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,UAAU,MAA9B,EAAsC,GAAtC,EAA2C;AACzC,aAAK,MAAL,EAAa,UAAU,CAAV,CAAb,EAA2B,QAA3B,EAAqC,OAArC;AACD;;AAED,aAAO,IAAP;AACD;;AAED,QAAI,GAAG,MAAH,CAAU,SAAV,CAAJ,EAA0B;AACxB,WAAK,IAAM,IAAX,IAAmB,SAAnB,EAA8B;AAC5B,aAAK,MAAL,EAAa,IAAb,EAAmB,UAAU,IAAV,CAAnB,EAAoC,QAApC;AACD;;AAED,aAAO,IAAP;AACD;AACF,G;;AAED;;;;;;;;;;;;;yBAWA,E,eAAI,S,EAAW,Q,EAAU,O,EAAS;AAChC,QAAI,KAAK,cAAL,CAAoB,IAApB,EAA0B,SAA1B,EAAqC,QAArC,EAA+C,OAA/C,CAAJ,EAA6D;AAC3D,aAAO,IAAP;AACD;;AAED,QAAI,cAAc,OAAlB,EAA2B;AAAE,kBAAY,UAAZ;AAAyB;;AAEtD,QAAI,SAAS,aAAa,UAAtB,EAAkC,SAAlC,CAAJ,EAAkD;AAChD,WAAK,MAAL,CAAY,EAAZ,CAAe,SAAf,EAA0B,QAA1B;AACD;AACD;AAHA,SAIK,IAAI,GAAG,MAAH,CAAU,KAAK,MAAf,CAAJ,EAA4B;AAC/B,eAAO,WAAP,CAAmB,KAAK,MAAxB,EAAgC,KAAK,QAArC,EAA+C,SAA/C,EAA0D,QAA1D,EAAoE,OAApE;AACD,OAFI,MAGA;AACH,eAAO,GAAP,CAAW,KAAK,MAAhB,EAAwB,SAAxB,EAAmC,QAAnC,EAA6C,OAA7C;AACD;;AAED,WAAO,IAAP;AACD,G;;AAED;;;;;;;;;;;;;yBAWA,G,gBAAK,S,EAAW,Q,EAAU,O,EAAS;AACjC,QAAI,KAAK,cAAL,CAAoB,KAApB,EAA2B,SAA3B,EAAsC,QAAtC,EAAgD,OAAhD,CAAJ,EAA8D;AAC5D,aAAO,IAAP;AACD;;AAED,QAAI,cAAc,OAAlB,EAA2B;AAAE,kBAAY,UAAZ;AAAyB;;AAEtD;AACA,QAAI,SAAS,aAAa,UAAtB,EAAkC,SAAlC,CAAJ,EAAkD;AAChD,WAAK,MAAL,CAAY,GAAZ,CAAgB,SAAhB,EAA2B,QAA3B;AACD;AACD;AAHA,SAIK,IAAI,GAAG,MAAH,CAAU,KAAK,MAAf,CAAJ,EAA4B;AAC/B,eAAO,cAAP,CAAsB,KAAK,MAA3B,EAAmC,KAAK,QAAxC,EAAkD,SAAlD,EAA6D,QAA7D,EAAuE,OAAvE;AACD;AACD;AAHK,WAIA;AACH,iBAAO,MAAP,CAAc,KAAK,MAAnB,EAA2B,SAA3B,EAAsC,QAAtC,EAAgD,OAAhD;AACD;;AAED,WAAO,IAAP;AACD,G;;AAED;;;;;;;;;;yBAQA,G,gBAAK,O,EAAS;AACZ,QAAI,CAAC,GAAG,MAAH,CAAU,OAAV,CAAL,EAAyB;AACvB,gBAAU,EAAV;AACD;;AAED,SAAK,OAAL,GAAe,OAAO,EAAP,EAAW,SAAS,IAApB,CAAf;;AAEA,QAAM,aAAa,OAAO,EAAP,EAAW,SAAS,SAApB,CAAnB;;AAEA,SAAK,IAAM,UAAX,IAAyB,QAAQ,UAAjC,EAA6C;AAC3C,UAAM,aAAa,QAAQ,UAAR,CAAmB,UAAnB,CAAnB;;AAEA,WAAK,OAAL,CAAa,UAAb,IAA2B,OAAO,EAAP,EAAW,SAAS,UAAT,CAAX,CAA3B;;AAEA,WAAK,YAAL,CAAkB,UAAlB,EAA8B,UAA9B;;AAEA,WAAK,UAAL,EAAiB,QAAQ,UAAR,CAAjB;AACD;;AAED,0BAAsB,aAAa,eAAnC,yHAAoD;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAAzC,OAAyC;;AAClD,WAAK,OAAL,CAAa,OAAb,IAAwB,SAAS,IAAT,CAAc,OAAd,CAAxB;;AAEA,UAAI,WAAW,OAAf,EAAwB;AACtB,aAAK,OAAL,EAAc,QAAQ,OAAR,CAAd;AACD;AACF;;AAED,YAAQ,IAAR,CAAa,KAAb,EAAoB;AAClB,sBADkB;AAElB,oBAAc;AAFI,KAApB;;AAKA,WAAO,IAAP;AACD,G;;AAED;;;;;;;;;;;yBASA,K,oBAAS;AACP,WAAO,MAAP,CAAc,KAAK,MAAnB,EAA2B,KAA3B;;AAEA,QAAI,GAAG,MAAH,CAAU,KAAK,MAAf,CAAJ,EAA4B;AAC1B;AACA,WAAK,IAAM,IAAX,IAAmB,OAAO,eAA1B,EAA2C;AACzC,YAAM,YAAY,OAAO,eAAP,CAAuB,IAAvB,CAAlB;;AAEA,YAAI,UAAU,SAAV,CAAoB,CAApB,MAA2B,KAAK,MAAhC,IACG,UAAU,QAAV,CAAmB,CAAnB,MAA0B,KAAK,QADtC,EACgD;;AAE9C,oBAAU,SAAV,CAAoB,MAApB,CAA2B,CAA3B,EAA8B,CAA9B;AACA,oBAAU,QAAV,CAAoB,MAApB,CAA2B,CAA3B,EAA8B,CAA9B;AACA,oBAAU,SAAV,CAAoB,MAApB,CAA2B,CAA3B,EAA8B,CAA9B;;AAEA;AACA,cAAI,CAAC,UAAU,SAAV,CAAoB,MAAzB,EAAiC;AAC/B,sBAAU,IAAV,IAAkB,IAAlB;AACD;AACF;;AAED,eAAO,MAAP,CAAc,KAAK,QAAnB,EAA6B,IAA7B,EAAmC,OAAO,gBAA1C;AACA,eAAO,MAAP,CAAc,KAAK,QAAnB,EAA6B,IAA7B,EAAmC,OAAO,kBAA1C,EAA8D,IAA9D;AACD;AACF,KArBD,MAsBK;AACH,aAAO,MAAP,CAAc,IAAd,EAAoB,KAApB;AACD;;AAED,YAAQ,IAAR,CAAa,OAAb,EAAsB,EAAE,cAAc,IAAhB,EAAtB;;AAEA,UAAM,aAAN,CAAoB,MAApB,CAA2B,QAAQ,MAAM,aAAd,EAA6B,IAA7B,CAA3B,EAA+D,CAA/D;;AAEA;AACA,0BAA0B,MAAM,YAAN,IAAsB,EAAhD,yHAAoD;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAAzC,WAAyC;;AAClD,UAAI,YAAY,MAAZ,KAAuB,IAAvB,IAA+B,YAAY,WAAZ,EAAnC,EAA8D;AAC5D,oBAAY,IAAZ;AACD;AACF;;AAED,WAAO,MAAM,QAAb;AACD,G;;;;;AAGH,MAAM,aAAN,CAAoB,cAApB,GAAqC,SAAS,cAAT,CAAyB,MAAzB,EAAiC,OAAjC,EAA0C;AAC7E,YAAU,WAAW,MAAM,QAA3B;;AAEA,OAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,KAAK,MAAzB,EAAiC,GAAjC,EAAsC;AACpC,QAAM,eAAe,KAAK,CAAL,CAArB;;AAEA,QAAI,aAAa,MAAb,KAAwB,MAAxB,IAAkC,aAAa,QAAb,KAA0B,OAAhE,EAAyE;AACvE,aAAO,CAAP;AACD;AACF;AACD,SAAO,CAAC,CAAR;AACD,CAXD;;AAaA,MAAM,aAAN,CAAoB,GAApB,GAA0B,SAAS,eAAT,CAA0B,OAA1B,EAAmC,OAAnC,EAA4C,kBAA5C,EAAgE;AACxF,MAAM,MAAM,KAAK,KAAK,cAAL,CAAoB,OAApB,EAA6B,WAAW,QAAQ,OAAhD,CAAL,CAAZ;;AAEA,SAAO,QAAQ,GAAG,MAAH,CAAU,OAAV,KAAsB,kBAAtB,IAA4C,IAAI,SAAJ,CAAc,OAAd,CAApD,IAA6E,GAA7E,GAAmF,IAA1F;AACD,CAJD;;AAMA,MAAM,aAAN,CAAoB,eAApB,GAAsC,UAAU,QAAV,EAAoB,OAApB,EAA6B;AACjE,OAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,KAAK,MAAzB,EAAiC,GAAjC,EAAsC;AACpC,QAAM,eAAe,KAAK,CAAL,CAArB;;AAEA;AACA,QAAI,CAAC,GAAG,MAAH,CAAU,aAAa,MAAvB,CAAD,IACI,WAAW,CAAC,aAAa,SAAb,CAAuB,OAAvB,CADpB,EACsD;AACpD;AACD;;AAED,QAAM,MAAM,SAAS,YAAT,EAAuB,aAAa,MAApC,EAA4C,aAAa,QAAzD,EAAmE,CAAnE,EAAsE,IAAtE,CAAZ;;AAEA,QAAI,QAAQ,SAAZ,EAAuB;AACrB,aAAO,GAAP;AACD;AACF;AACF,CAhBD;;AAkBA;AACA,aAAa,UAAb,GAA0B,MAAM,UAAN,GAAmB,EAA7C;;AAEA,aAAa,OAAb,GAAuB,OAAvB;;AAEA,aAAa,eAAb,GAA+B,CAAE,aAAF,EAAiB,QAAjB,EAA2B,gBAA3B,EAA6C,aAA7C,CAA/B;;AAEA,OAAO,OAAP,GAAiB,YAAjB;;;;;;;ACtcA,IAAM,QAAU,QAAQ,SAAR,CAAhB;AACA,IAAM,QAAU,QAAQ,SAAR,CAAhB;AACA,IAAM,SAAU,QAAQ,gBAAR,CAAhB;AACA,IAAM,UAAU,QAAQ,iBAAR,CAAhB;AACA,IAAM,SAAU,QAAQ,2BAAR,CAAhB;AACA,IAAM,UAAU,QAAQ,iBAAR,EAA2B,GAA3B,EAAhB;;AAEA,IAAM,YAAc,EAApB;AACA,IAAM,cAAc,CAClB,aADkB,EACH,aADG,EACY,WADZ,EAElB,eAFkB,EAED,eAFC,CAApB;;AAKA;AACA,IAAI,gBAAgB,CAApB;;AAEA;AACA,MAAM,YAAN,GAAqB,EAArB;;IAEM,W;AACJ,yBAAe;AAAA;;AACb,SAAK,MAAL,GAAqB,IAArB,CADa,CACc;AAC3B,SAAK,OAAL,GAAqB,IAArB,CAFa,CAEc;;AAE3B,SAAK,QAAL,GAAqB,EAAM;AACzB,YAAO,IADY;AAEnB,YAAO,IAFY;AAGnB,aAAO;AAHY,KAArB;;AAMA;AACA,SAAK,QAAL,GAAmB,EAAnB;AACA,SAAK,UAAL,GAAmB,EAAnB;AACA,SAAK,WAAL,GAAmB,EAAnB;AACA,SAAK,SAAL,GAAmB,EAAnB;;AAEA;AACA,SAAK,UAAL,GAAkB;AAChB,YAAW,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EADK;AAEhB,cAAW,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EAFK;AAGhB,iBAAW;AAHK,KAAlB;AAKA;AACA,SAAK,SAAL,GAAiB;AACf,YAAW,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EADI;AAEf,cAAW,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EAFI;AAGf,iBAAW;AAHI,KAAjB;;AAMA;AACA,SAAK,WAAL,GAAmB;AACjB,YAAW,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EADM;AAEjB,cAAW,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EAFM;AAGjB,iBAAW;AAHM,KAAnB;;AAMA;AACA,SAAK,YAAL,GAAoB;AAClB,YAAW,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EAAc,IAAI,CAAlB,EAAqB,IAAI,CAAzB,EAA4B,OAAO,CAAnC,EADO;AAElB,cAAW,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EAAc,IAAI,CAAlB,EAAqB,IAAI,CAAzB,EAA4B,OAAO,CAAnC,EAFO;AAGlB,iBAAW;AAHO,KAApB;;AAMA,SAAK,SAAL,GAAmB,IAAnB,CA3Ca,CA2Ce;AAC5B,SAAK,WAAL,GAAmB,EAAnB;;AAEA,SAAK,YAAL,GAAuB,IAAvB;AACA,SAAK,eAAL,GAAuB,IAAvB;;AAEA,SAAK,SAAL,GAAiB,IAAjB,CAjDa,CAiDe;;AAE5B,SAAK,aAAL,GAAuB,KAAvB;AACA,SAAK,eAAL,GAAuB,KAAvB;AACA,SAAK,YAAL,GAAuB,KAAvB;;AAEA,SAAK,KAAL,GAAa,KAAb;;AAEA,YAAQ,IAAR,CAAa,KAAb,EAAoB,IAApB;;AAEA,UAAM,YAAN,CAAmB,IAAnB,CAAwB,IAAxB;AACD;;wBAED,W,wBAAa,O,EAAS,K,EAAO,W,EAAa;AACxC,QAAM,eAAe,KAAK,aAAL,CAAmB,OAAnB,EAA4B,KAA5B,EAAmC,IAAnC,CAArB;;AAEA,YAAQ,IAAR,CAAa,MAAb,EAAqB;AACnB,sBADmB;AAEnB,kBAFmB;AAGnB,8BAHmB;AAInB,gCAJmB;AAKnB,mBAAa;AALM,KAArB;AAOD,G;;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wBAgCA,K,kBAAO,M,EAAQ,M,EAAQ,O,EAAS;AAC9B,QAAI,KAAK,WAAL,MACG,CAAC,KAAK,aADT,IAEG,KAAK,UAAL,CAAgB,MAAhB,IAA0B,OAAO,IAAP,KAAgB,SAAhB,GAA2B,CAA3B,GAA+B,CAAzD,CAFP,EAEoE;AAClE;AACD;;AAED;AACA;AACA,QAAI,MAAM,OAAN,CAAc,MAAM,YAApB,EAAkC,IAAlC,MAA4C,CAAC,CAAjD,EAAoD;AAClD,YAAM,YAAN,CAAmB,IAAnB,CAAwB,IAAxB;AACD;;AAED,UAAM,UAAN,CAAiB,KAAK,QAAtB,EAAgC,MAAhC;AACA,SAAK,MAAL,GAAsB,MAAtB;AACA,SAAK,OAAL,GAAsB,OAAtB;;AAEA,YAAQ,IAAR,CAAa,cAAb,EAA6B;AAC3B,mBAAa,IADc;AAE3B,aAAO,KAAK;AAFe,KAA7B;AAID,G;;wBAED,W,wBAAa,O,EAAS,K,EAAO,W,EAAa;AACxC,QAAI,CAAC,KAAK,UAAV,EAAsB;AACpB,WAAK,aAAL,CAAmB,OAAnB;AACA,YAAM,SAAN,CAAgB,KAAK,SAArB,EAAgC,KAAK,QAArC;AACD;;AAED,QAAM,gBAAiB,KAAK,SAAL,CAAe,IAAf,CAAoB,CAApB,KAA0B,KAAK,UAAL,CAAgB,IAAhB,CAAqB,CAA/C,IACG,KAAK,SAAL,CAAe,IAAf,CAAoB,CAApB,KAA0B,KAAK,UAAL,CAAgB,IAAhB,CAAqB,CADlD,IAEG,KAAK,SAAL,CAAe,MAAf,CAAsB,CAAtB,KAA4B,KAAK,UAAL,CAAgB,MAAhB,CAAuB,CAFtD,IAGG,KAAK,SAAL,CAAe,MAAf,CAAsB,CAAtB,KAA4B,KAAK,UAAL,CAAgB,MAAhB,CAAuB,CAH7E;;AAKA,QAAI,WAAJ;AACA,QAAI,WAAJ;;AAEA;AACA,QAAI,KAAK,aAAL,IAAsB,CAAC,KAAK,eAAhC,EAAiD;AAC/C,WAAK,KAAK,SAAL,CAAe,MAAf,CAAsB,CAAtB,GAA0B,KAAK,WAAL,CAAiB,MAAjB,CAAwB,CAAvD;AACA,WAAK,KAAK,SAAL,CAAe,MAAf,CAAsB,CAAtB,GAA0B,KAAK,WAAL,CAAiB,MAAjB,CAAwB,CAAvD;;AAEA,WAAK,eAAL,GAAuB,MAAM,KAAN,CAAY,EAAZ,EAAgB,EAAhB,IAAsB,YAAY,oBAAzD;AACD;;AAED,QAAM,YAAY;AAChB,sBADgB;AAEhB,oBAAc,KAAK,eAAL,CAAqB,OAArB,CAFE;AAGhB,kBAHgB;AAIhB,8BAJgB;AAKhB,YALgB;AAMhB,YANgB;AAOhB,iBAAW,aAPK;AAQhB,mBAAa,IARG;AAShB,6BAAuB,KAAK,WAAL;AATP,KAAlB;;AAYA,QAAI,CAAC,aAAL,EAAoB;AAClB;AACA,YAAM,cAAN,CAAqB,KAAK,YAA1B,EAAwC,KAAK,UAA7C,EAAyD,KAAK,SAA9D;AACD;;AAED,YAAQ,IAAR,CAAa,MAAb,EAAqB,SAArB;;AAEA,QAAI,CAAC,aAAL,EAAoB;AAClB;AACA,UAAI,KAAK,WAAL,EAAJ,EAAwB;AACtB,aAAK,MAAL,CAAY,SAAZ;AACD;;AAED,UAAI,KAAK,eAAT,EAA0B;AACxB,cAAM,UAAN,CAAiB,KAAK,UAAtB,EAAkC,KAAK,SAAvC;AACD;AACF;AACF,G;;AAED;;;;;;;;;;;;;;;;;;;;;;wBAoBA,M,mBAAQ,S,EAAW;AACjB,gBAAY,MAAM,MAAN,CAAa;AACvB,eAAS,KAAK,QAAL,CAAc,CAAd,CADc;AAEvB,aAAO,KAAK,SAFW;AAGvB,mBAAa,KAAK,YAHK;AAIvB,mBAAa;AAJU,KAAb,EAKT,aAAa,EALJ,CAAZ;;AAOA,YAAQ,IAAR,CAAa,oBAAb,EAAmC,SAAnC;;AAEA,QAAI,CAAC,KAAK,aAAV,EAAyB;AACvB,cAAQ,IAAR,CAAa,aAAb,EAA4B,SAA5B;AACD;;AAED,SAAK,aAAL,GAAqB,KAArB;AACD,G;;AAED;;;wBACA,S,sBAAW,O,EAAS,K,EAAO,W,EAAa,c,EAAgB;AACtD,QAAM,eAAe,KAAK,eAAL,CAAqB,OAArB,CAArB;;AAEA,YAAQ,IAAR,CAAa,WAAW,IAAX,CAAgB,MAAM,IAAtB,IAA6B,QAA7B,GAAwC,IAArD,EAA2D;AACzD,sBADyD;AAEzD,gCAFyD;AAGzD,kBAHyD;AAIzD,8BAJyD;AAKzD,oCALyD;AAMzD,mBAAa;AAN4C,KAA3D;;AASA,QAAI,CAAC,KAAK,UAAV,EAAsB;AACpB,WAAK,GAAL,CAAS,KAAT;AACD;;AAED,SAAK,aAAL,GAAqB,KAArB;AACA,SAAK,aAAL,CAAmB,OAAnB,EAA4B,KAA5B;AACD,G;;AAED;;;;;;;;;;;;;;;;;;;;;;wBAoBA,G,gBAAK,K,EAAO;AACV,YAAQ,SAAS,KAAK,SAAtB;;AAEA,QAAI,KAAK,WAAL,EAAJ,EAAwB;AACtB,cAAQ,IAAR,CAAa,YAAb,EAA2B;AACzB,oBADyB;AAEzB,qBAAa;AAFY,OAA3B;AAID;;AAED,SAAK,IAAL;AACD,G;;wBAED,a,4BAAiB;AACf,WAAO,KAAK,YAAL,GAAmB,KAAK,QAAL,CAAc,IAAjC,GAAuC,IAA9C;AACD,G;;wBAED,W,0BAAe;AACb,WAAO,KAAK,YAAZ;AACD,G;;wBAED,I,mBAAQ;AACN,YAAQ,IAAR,CAAa,MAAb,EAAqB,EAAE,aAAa,IAAf,EAArB;;AAEA,QAAI,KAAK,YAAT,EAAuB;AACrB,cAAQ,IAAR,CAAa,aAAb,EAA4B,EAAE,aAAa,IAAf,EAA5B;AACA,cAAQ,IAAR,CAAa,UAAU,KAAK,QAAL,CAAc,IAArC,EAA2C,EAAE,aAAa,IAAf,EAA3C;AACD;;AAED,SAAK,MAAL,GAAc,KAAK,OAAL,GAAe,IAA7B;;AAEA,SAAK,YAAL,GAAoB,KAApB;AACA,SAAK,QAAL,CAAc,IAAd,GAAqB,KAAK,SAAL,GAAiB,IAAtC;AACD,G;;wBAED,e,4BAAiB,O,EAAS;AACxB,WAAO,MAAM,OAAN,CAAc,KAAK,UAAnB,EAA+B,MAAM,YAAN,CAAmB,OAAnB,CAA/B,CAAP;AACD,G;;wBAED,a,0BAAe,O,EAAS,K,EAA0D;AAAA,QAAnD,IAAmD,uEAA5C,SAAS,iBAAiB,IAAjB,CAAsB,MAAM,IAA5B,CAAmC;;AAChF,QAAM,KAAK,MAAM,YAAN,CAAmB,OAAnB,CAAX;AACA,QAAI,QAAQ,KAAK,eAAL,CAAqB,OAArB,CAAZ;;AAEA,QAAI,UAAU,CAAC,CAAf,EAAkB;AAChB,cAAQ,KAAK,UAAL,CAAgB,MAAxB;AACA,WAAK,UAAL,CAAgB,KAAhB,IAAyB,EAAzB;AACD;;AAED,QAAI,IAAJ,EAAU;AACR,cAAQ,IAAR,CAAa,qBAAb,EAAoC;AAClC,wBADkC;AAElC,oBAFkC;AAGlC,kBAHkC;AAIlC,mBAAW,EAJuB;AAKlC,sBAAc,KALoB;AAMlC,qBAAa;AANqB,OAApC;AAQD;;AAED,SAAK,QAAL,CAAc,KAAd,IAAuB,OAAvB;;AAEA,WAAO,KAAP;AACD,G;;wBAED,a,0BAAe,O,EAAS,K,EAAO;AAC7B,QAAM,KAAK,MAAM,YAAN,CAAmB,OAAnB,CAAX;AACA,QAAM,QAAQ,KAAK,KAAL,GAAY,CAAZ,GAAgB,MAAM,OAAN,CAAc,KAAK,UAAnB,EAA+B,EAA/B,CAA9B;;AAEA,QAAI,UAAU,CAAC,CAAf,EAAkB;AAAE;AAAS;;AAE7B,YAAQ,IAAR,CAAa,gBAAb,EAA+B;AAC7B,sBAD6B;AAE7B,kBAF6B;AAG7B,oBAAc,KAHe;AAI7B,mBAAa;AAJgB,KAA/B;;AAOA,SAAK,QAAL,CAAiB,MAAjB,CAAwB,KAAxB,EAA+B,CAA/B;AACA,SAAK,UAAL,CAAiB,MAAjB,CAAwB,KAAxB,EAA+B,CAA/B;AACA,SAAK,WAAL,CAAiB,MAAjB,CAAwB,KAAxB,EAA+B,CAA/B;AACA,SAAK,SAAL,CAAiB,MAAjB,CAAwB,KAAxB,EAA+B,CAA/B;AACD,G;;wBAED,mB,gCAAqB,M,EAAQ,a,EAAe;AAC1C,SAAK,YAAL,GAAuB,MAAvB;AACA,SAAK,eAAL,GAAuB,aAAvB;AACD,G;;;;;AAGH,KAAK,IAAI,IAAI,CAAR,EAAW,MAAM,YAAY,MAAlC,EAA0C,IAAI,GAA9C,EAAmD,GAAnD,EAAwD;AACtD,MAAM,SAAS,YAAY,CAAZ,CAAf;;AAEA,YAAU,MAAV,IAAoB,iBAAiB,MAAjB,CAApB;AACD;;AAED,SAAS,gBAAT,CAA2B,MAA3B,EAAmC;AACjC,SAAQ,UAAU,KAAV,EAAiB;AAAA,gCACe,MAAM,eAAN,CAAsB,KAAtB,CADf;AAAA,QAChB,WADgB;AAAA,QACH,cADG;;AAEvB,QAAM,UAAU,EAAhB,CAFuB,CAEH;;AAEpB,QAAI,QAAQ,aAAR,IAAyB,QAAQ,IAAR,CAAa,MAAM,IAAnB,CAA7B,EAAuD;AACrD,sBAAgB,IAAI,IAAJ,GAAW,OAAX,EAAhB;;AAEA,WAAK,IAAI,KAAI,CAAb,EAAgB,KAAI,MAAM,cAAN,CAAqB,MAAzC,EAAiD,IAAjD,EAAsD;AACpD,YAAM,UAAU,MAAM,cAAN,CAAqB,EAArB,CAAhB;AACA,YAAM,cAAc,OAAO,MAAP,CAAc,OAAd,EAAuB,MAAM,IAA7B,EAAmC,WAAnC,CAApB;;AAEA,gBAAQ,IAAR,CAAa,CAAC,OAAD,EAAU,eAAe,IAAI,WAAJ,EAAzB,CAAb;AACD;AACF,KATD,MAUK;AACH,UAAI,iBAAiB,KAArB;;AAEA,UAAI,CAAC,QAAQ,oBAAT,IAAiC,QAAQ,IAAR,CAAa,MAAM,IAAnB,CAArC,EAA+D;AAC7D;AACA,aAAK,IAAI,MAAI,CAAb,EAAgB,MAAI,MAAM,YAAN,CAAmB,MAAvB,IAAiC,CAAC,cAAlD,EAAkE,KAAlE,EAAuE;AACrE,2BAAiB,CAAC,MAAM,YAAN,CAAmB,GAAnB,EAAsB,KAAvB,IAAgC,MAAM,YAAN,CAAmB,GAAnB,EAAsB,aAAvE;AACD;;AAED;AACA;AACA,yBAAiB,kBACX,IAAI,IAAJ,GAAW,OAAX,KAAuB,aAAvB,GAAuC;AAC3C;AAFe,WAGZ,MAAM,SAAN,KAAoB,CAHzB;AAID;;AAED,UAAI,CAAC,cAAL,EAAqB;AACnB,YAAI,eAAc,OAAO,MAAP,CAAc,KAAd,EAAqB,MAAM,IAA3B,EAAiC,WAAjC,CAAlB;;AAEA,YAAI,CAAC,YAAL,EAAkB;;AAEhB,yBAAc,IAAI,WAAJ,EAAd;AACA,uBAAY,KAAZ,GAAqB,SAAS,IAAT,CAAc,MAAM,WAAN,IAAqB,MAAM,IAAzC;AACA;AADA,aAEG,MAAM,WAAN,KAAsB,CAFzB,IAGG,CAAC,MAAM,WAH/B;AAID;;AAED,gBAAQ,IAAR,CAAa,CAAC,KAAD,EAAQ,YAAR,CAAb;AACD;AACF;;AAED,yBAAqC,OAArC,mHAA8C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,UAAlC,QAAkC;AAAA,UAAzB,aAAyB;;AAC5C,oBAAY,mBAAZ,CAAgC,WAAhC,EAA6C,cAA7C;AACA,oBAAY,MAAZ,EAAoB,QAApB,EAA6B,KAA7B,EAAoC,WAApC,EAAiD,cAAjD;AACD;AACF,GAnDD;AAoDD;;AAED,SAAS,MAAT,CAAiB,KAAjB,EAAwB;AACtB,OAAK,IAAI,MAAI,CAAb,EAAgB,MAAI,MAAM,YAAN,CAAmB,MAAvC,EAA+C,KAA/C,EAAoD;AAClD,QAAM,cAAc,MAAM,YAAN,CAAmB,GAAnB,CAApB;;AAEA,gBAAY,GAAZ,CAAgB,KAAhB;AACA,YAAQ,IAAR,CAAa,QAAb,EAAuB,EAAE,YAAF,EAAS,wBAAT,EAAvB;AACD;AACF;;AAED,IAAM,YAAY,CAAE,+BAAF,CAAlB;AACA,IAAM,cAAc,QAAQ,WAA5B;;AAEA,IAAI,MAAM,YAAV,EAAwB;AACtB,YAAU,YAAY,IAAtB,IAAgC,UAAU,WAA1C;AACA,YAAU,YAAY,IAAtB,IAAgC,UAAU,WAA1C;AACA,YAAU,YAAY,EAAtB,IAAgC,UAAU,SAA1C;AACA,YAAU,YAAY,MAAtB,IAAgC,UAAU,SAA1C;AACD,CALD,MAMK;AACH,YAAU,SAAV,GAAwB,UAAU,WAAlC;AACA,YAAU,SAAV,GAAwB,UAAU,WAAlC;AACA,YAAU,OAAV,GAAwB,UAAU,SAAlC;;AAEA,YAAU,UAAV,GAAwB,UAAU,WAAlC;AACA,YAAU,SAAV,GAAwB,UAAU,WAAlC;AACA,YAAU,QAAV,GAAwB,UAAU,SAAlC;AACA,YAAU,WAAV,GAAwB,UAAU,SAAlC;AACD;;AAED,UAAU,IAAV,GAAiB,MAAjB;;AAEA,SAAS,WAAT,QAA+B,UAA/B,EAA2C;AAAA,MAAnB,GAAmB,SAAnB,GAAmB;;AACzC,MAAM,cAAc,WAAW,OAAX,CAAmB,KAAnB,MAA8B,CAA9B,GAChB,OAAO,GADS,GACH,OAAO,MADxB;;AAGA;AACA,OAAK,IAAM,SAAX,IAAwB,MAAM,eAA9B,EAA+C;AAC7C,gBAAY,GAAZ,EAAiB,SAAjB,EAA4B,OAAO,gBAAnC;AACA,gBAAY,GAAZ,EAAiB,SAAjB,EAA4B,OAAO,kBAAnC,EAAuD,IAAvD;AACD;;AAED,OAAK,IAAM,UAAX,IAAwB,SAAxB,EAAmC;AACjC,gBAAY,GAAZ,EAAiB,UAAjB,EAA4B,UAAU,UAAV,CAA5B;AACD;AACF;;AAED,QAAQ,EAAR,CAAW,qBAAX,EAAkC,iBAAiF;AAAA,MAA9E,WAA8E,SAA9E,WAA8E;AAAA,MAAjE,OAAiE,SAAjE,OAAiE;AAAA,MAAxD,SAAwD,SAAxD,SAAwD;AAAA,MAA7C,YAA6C,SAA7C,YAA6C;AAAA,MAA/B,KAA+B,SAA/B,KAA+B;AAAA,MAAxB,WAAwB,SAAxB,WAAwB;AAAA,MAAX,IAAW,SAAX,IAAW;;AACjH,cAAY,UAAZ,CAAuB,YAAvB,IAAuC,SAAvC;AACA,cAAY,QAAZ,CAAqB,YAArB,IAAqC,OAArC;;AAEA,MAAI,IAAJ,EAAU;AACR,gBAAY,aAAZ,GAA4B,IAA5B;AACD;;AAED,MAAI,CAAC,YAAY,WAAZ,EAAL,EAAgC;AAC9B,UAAM,SAAN,CAAgB,YAAY,WAA5B,EAAyC,YAAY,QAArD;;AAEA,UAAM,UAAN,CAAiB,YAAY,SAA7B,EAAyC,YAAY,WAArD;AACA,UAAM,UAAN,CAAiB,YAAY,UAA7B,EAAyC,YAAY,WAArD;;AAEA,gBAAY,SAAZ,GAAwC,KAAxC;AACA,gBAAY,SAAZ,CAAsB,YAAtB,IAAwC,YAAY,SAAZ,CAAsB,SAA9D;AACA,gBAAY,WAAZ,CAAwB,YAAxB,IAAwC,eAAe,SAAS,MAAM,eAAN,CAAsB,KAAtB,EAA6B,CAA7B,CAAhE;AACA,gBAAY,eAAZ,GAAwC,KAAxC;;AAEA,UAAM,aAAN,CAAoB,YAAY,WAAhC,EAA6C,OAA7C;AACD;AACF,CArBD;;AAuBA,MAAM,OAAN,CAAc,EAAd,CAAiB,cAAjB,EAAoC,WAApC;AACA,MAAM,OAAN,CAAc,EAAd,CAAiB,iBAAjB,EAAoC,WAApC;;AAEA,YAAY,oBAAZ,GAAmC,CAAnC;AACA,YAAY,gBAAZ,GAA+B,gBAA/B;AACA,YAAY,MAAZ,GAAqB,MAArB;AACA,YAAY,OAAZ,GAAsB,OAAtB;AACA,YAAY,SAAZ,GAAwB,SAAxB;;AAEA,MAAM,kBAAN,GAA2B,MAA3B;;AAEA,OAAO,OAAP,GAAiB,WAAjB;;;;;AC9fA,IAAM,cAAgB,QAAQ,gBAAR,CAAtB;AACA,IAAM,gBAAgB,QAAQ,kBAAR,CAAtB;;AAEA,IAAM,UAAU;AACd,4BADc;AAEd,SAAO,EAFO;AAGd,cAAY;AAHE,CAAhB;;AAMA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,cAAvB,EAAuC,gBAAkC;AAAA,MAAtB,WAAsB,QAAtB,WAAsB;AAAA,MAAT,KAAS,QAAT,KAAS;;AACvE,cAAY,YAAZ,GAA2B,IAA3B;AACA,eAAa,WAAb,EAA0B,KAA1B,EAAiC,OAAjC;AACD,CAHD;;AAKA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,aAAvB,EAAsC,iBAA0C;AAAA,MAA9B,WAA8B,SAA9B,WAA8B;AAAA,MAAjB,KAAiB,SAAjB,KAAiB;AAAA,MAAV,MAAU,SAAV,MAAU;;AAC9E,eAAa,WAAb,EAA0B,KAA1B,EAAiC,MAAjC,EAAyC,MAAzC;;AAEA;AACA,MAAI,CAAC,YAAY,WAAZ,EAAL,EAAgC;AAAE,WAAO,KAAP;AAAe;AAClD,CALD;;AAOA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,YAAvB,EAAqC,iBAAkC;AAAA,MAAtB,WAAsB,SAAtB,WAAsB;AAAA,MAAT,KAAS,SAAT,KAAS;;AACrE,eAAa,WAAb,EAA0B,KAA1B,EAAiC,KAAjC;AACD,CAFD;;AAIA,SAAS,YAAT,CAAuB,WAAvB,EAAoC,KAApC,EAA2C,KAA3C,EAAkD,MAAlD,EAA0D;AACxD,MAAM,aAAa,YAAY,QAAZ,CAAqB,IAAxC;;AAEA,MAAM,WAAW,IAAI,aAAJ,CAAkB,WAAlB,EAA+B,KAA/B,EAAsC,UAAtC,EAAkD,KAAlD,EAAyD,YAAY,OAArE,EAA8E,IAA9E,EAAoF,MAApF,CAAjB;;AAEA,cAAY,MAAZ,CAAmB,IAAnB,CAAwB,QAAxB;AACA,cAAY,SAAZ,GAAwB,QAAxB;AACD;;AAED,OAAO,OAAP,GAAiB,OAAjB;;;;;AClCA,IAAM,UAAiB,QAAQ,QAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,UAAR,CAAvB;AACA,IAAM,gBAAiB,QAAQ,kBAAR,CAAvB;AACA,IAAM,eAAiB,QAAQ,iBAAR,CAAvB;AACA,IAAM,cAAiB,QAAQ,gBAAR,CAAvB;AACA,IAAM,iBAAiB,QAAQ,mBAAR,CAAvB;;AAEA,IAAM,OAAO;AACX,YAAU;AACR,aAAc,KADN;AAER,kBAAc,IAFN;;AAIR,YAAY,IAJJ;AAKR,UAAY,IALJ;AAMR,cAAY,IANJ;AAOR,aAAY,IAPJ;AAQR,gBAAY,IARJ;;AAUR,eAAY,IAVJ;AAWR,cAAY;AAXJ,GADC;;AAeX,WAAS,iBAAU,OAAV,EAAmB,KAAnB,EAA0B,YAA1B,EAAwC;AAC/C,QAAM,cAAc,aAAa,OAAb,CAAqB,IAAzC;;AAEA,WAAO,YAAY,OAAZ,GACH,EAAE,MAAM,MAAR,EAAgB,MAAO,YAAY,QAAZ,KAAyB,OAAzB,GACE,YAAY,SADd,GAEE,YAAY,QAFrC,EADG,GAIH,IAJJ;AAKD,GAvBU;;AAyBX,aAAW,qBAAY;AACrB,WAAO,MAAP;AACD;AA3BU,CAAb;;AA8BA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,oBAAvB,EAA6C,gBAA2B;AAAA,MAAf,WAAe,QAAf,WAAe;;AACtE,MAAI,YAAY,QAAZ,CAAqB,IAArB,KAA8B,MAAlC,EAA0C;AAAE;AAAS;;AAErD,MAAM,OAAO,YAAY,QAAZ,CAAqB,IAAlC;;AAEA,MAAI,SAAS,GAAb,EAAkB;AAChB,gBAAY,SAAZ,CAAsB,IAAtB,CAA2B,CAA3B,GAAiC,YAAY,WAAZ,CAAwB,IAAxB,CAA6B,CAA9D;AACA,gBAAY,SAAZ,CAAsB,MAAtB,CAA6B,CAA7B,GAAiC,YAAY,WAAZ,CAAwB,MAAxB,CAA+B,CAAhE;;AAEA,gBAAY,YAAZ,CAAyB,IAAzB,CAA8B,KAA9B,GAAwC,KAAK,GAAL,CAAS,YAAY,YAAZ,CAAyB,IAAzB,CAA8B,EAAvC,CAAxC;AACA,gBAAY,YAAZ,CAAyB,MAAzB,CAAgC,KAAhC,GAAwC,KAAK,GAAL,CAAS,YAAY,YAAZ,CAAyB,MAAzB,CAAgC,EAAzC,CAAxC;AACA,gBAAY,YAAZ,CAAyB,MAAzB,CAAgC,EAAhC,GAAqC,CAArC;AACA,gBAAY,YAAZ,CAAyB,IAAzB,CAA8B,EAA9B,GAAqC,CAArC;AACD,GARD,MASK,IAAI,SAAS,GAAb,EAAkB;AACrB,gBAAY,SAAZ,CAAsB,IAAtB,CAA2B,CAA3B,GAAiC,YAAY,WAAZ,CAAwB,IAAxB,CAA6B,CAA9D;AACA,gBAAY,SAAZ,CAAsB,MAAtB,CAA6B,CAA7B,GAAiC,YAAY,WAAZ,CAAwB,MAAxB,CAA+B,CAAhE;;AAEA,gBAAY,YAAZ,CAAyB,IAAzB,CAA8B,KAA9B,GAAwC,KAAK,GAAL,CAAS,YAAY,YAAZ,CAAyB,IAAzB,CAA8B,EAAvC,CAAxC;AACA,gBAAY,YAAZ,CAAyB,MAAzB,CAAgC,KAAhC,GAAwC,KAAK,GAAL,CAAS,YAAY,YAAZ,CAAyB,MAAzB,CAAgC,EAAzC,CAAxC;AACA,gBAAY,YAAZ,CAAyB,MAAzB,CAAgC,EAAhC,GAAqC,CAArC;AACA,gBAAY,YAAZ,CAAyB,IAAzB,CAA8B,EAA9B,GAAqC,CAArC;AACD;AACF,CAvBD;;AAyBA;AACA,cAAc,OAAd,CAAsB,EAAtB,CAAyB,KAAzB,EAAgC,iBAAmC;AAAA,MAAvB,MAAuB,SAAvB,MAAuB;AAAA,MAAf,WAAe,SAAf,WAAe;;AACjE,MAAI,OAAO,IAAP,KAAgB,UAApB,EAAgC;AAAE;AAAS;;AAE3C,MAAM,OAAO,YAAY,QAAZ,CAAqB,IAAlC;;AAEA,MAAI,SAAS,GAAb,EAAkB;AAChB,WAAO,KAAP,GAAiB,YAAY,WAAZ,CAAwB,IAAxB,CAA6B,CAA9C;AACA,WAAO,OAAP,GAAiB,YAAY,WAAZ,CAAwB,MAAxB,CAA+B,CAAhD;AACA,WAAO,EAAP,GAAY,CAAZ;AACD,GAJD,MAKK,IAAI,SAAS,GAAb,EAAkB;AACrB,WAAO,KAAP,GAAiB,YAAY,WAAZ,CAAwB,IAAxB,CAA6B,CAA9C;AACA,WAAO,OAAP,GAAiB,YAAY,WAAZ,CAAwB,MAAxB,CAA+B,CAAhD;AACA,WAAO,EAAP,GAAY,CAAZ;AACD;AACF,CAfD;;AAiBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoCA,aAAa,SAAb,CAAuB,SAAvB,GAAmC,UAAU,OAAV,EAAmB;AACpD,MAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,OAAhB,CAAJ,EAA8B;AAC5B,SAAK,OAAL,CAAa,IAAb,CAAkB,OAAlB,GAA4B,QAAQ,OAAR,KAAoB,KAApB,GAA2B,KAA3B,GAAkC,IAA9D;AACA,SAAK,YAAL,CAAkB,MAAlB,EAA0B,OAA1B;AACA,SAAK,WAAL,CAAiB,MAAjB,EAAyB,OAAzB;;AAEA,QAAI,mBAAmB,IAAnB,CAAwB,QAAQ,QAAhC,CAAJ,EAA+C;AAC7C,WAAK,OAAL,CAAa,IAAb,CAAkB,QAAlB,GAA6B,QAAQ,QAArC;AACD;AACD,QAAI,aAAa,IAAb,CAAkB,QAAQ,SAA1B,CAAJ,EAA0C;AACxC,WAAK,OAAL,CAAa,IAAb,CAAkB,SAAlB,GAA8B,QAAQ,SAAtC;AACD;;AAED,WAAO,IAAP;AACD;;AAED,MAAI,MAAM,EAAN,CAAS,IAAT,CAAc,OAAd,CAAJ,EAA4B;AAC1B,SAAK,OAAL,CAAa,IAAb,CAAkB,OAAlB,GAA4B,OAA5B;;AAEA,QAAI,CAAC,OAAL,EAAc;AACZ,WAAK,WAAL,GAAmB,KAAK,WAAL,GAAmB,KAAK,SAAL,GAAiB,IAAvD;AACD;;AAED,WAAO,IAAP;AACD;;AAED,SAAO,KAAK,OAAL,CAAa,IAApB;AACD,CA3BD;;AA6BA,QAAQ,IAAR,GAAe,IAAf;AACA,QAAQ,KAAR,CAAc,IAAd,CAAmB,MAAnB;AACA,MAAM,KAAN,CAAY,aAAa,UAAzB,EAAqC,CACnC,WADmC,EAEnC,UAFmC,EAGnC,kBAHmC,EAInC,mBAJmC,EAKnC,SALmC,CAArC;AAOA,QAAQ,UAAR,CAAmB,IAAnB,GAA0B,WAA1B;;AAEA,eAAe,IAAf,GAAsB,KAAK,QAA3B;;AAEA,OAAO,OAAP,GAAiB,IAAjB;;;;;AC9JA,IAAM,UAAiB,QAAQ,QAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,UAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,UAAR,CAAvB;AACA,IAAM,WAAiB,QAAQ,aAAR,CAAvB;AACA,IAAM,gBAAiB,QAAQ,kBAAR,CAAvB;AACA,IAAM,eAAiB,QAAQ,iBAAR,CAAvB;AACA,IAAM,cAAiB,QAAQ,gBAAR,CAAvB;AACA,IAAM,iBAAiB,QAAQ,mBAAR,CAAvB;;AAEA,IAAM,OAAO;AACX,YAAU;AACR,aAAS,KADD;AAER,YAAS,IAFD;AAGR,aAAS;AAHD;AADC,CAAb;;AAQA,IAAI,cAAc,KAAlB;;AAEA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,cAAvB,EAAuC,gBAAkC;AAAA,MAAtB,WAAsB,QAAtB,WAAsB;AAAA,MAAT,KAAS,QAAT,KAAS;;AACvE,MAAI,YAAY,QAAZ,CAAqB,IAArB,KAA8B,MAAlC,EAA0C;AAAE;AAAS;;AAErD;AACA,cAAY,WAAZ,CAAwB,SAAxB,GAAoC,EAApC;AACA,cAAY,WAAZ,CAAwB,QAAxB,GAAoC,EAApC;AACA,cAAY,WAAZ,CAAwB,KAAxB,GAAoC,EAApC;;AAEA,cAAY,UAAZ,GAAyB,IAAzB;;AAEA,MAAI,CAAC,YAAY,WAAjB,EAA8B;AAC5B,mBAAe,WAAf,EAA4B,YAAY,OAAxC;AACD;;AAED,MAAM,YAAY,YAAY,SAA9B;AACA,MAAM,aAAa,cAAc,WAAd,EAA2B,KAA3B,EAAkC,SAAlC,CAAnB;;AAEA,MAAI,WAAW,QAAf,EAAyB;AACvB,oBAAgB,WAAhB,EAA6B,WAAW,QAAxC;AACD;AACF,CApBD;;AAsBA,cAAc,OAAd,CAAsB,EAAtB,CAAyB,KAAzB,EAAgC,iBAA0C;AAAA,MAA9B,WAA8B,SAA9B,WAA8B;AAAA,MAAjB,MAAiB,SAAjB,MAAiB;AAAA,MAAT,KAAS,SAAT,KAAS;;AACxE,MAAI,OAAO,IAAP,KAAgB,UAAhB,IAA8B,OAAO,IAAP,KAAgB,SAAlD,EAA6D;AAAE;AAAS;;AAExE,MAAM,mBAAmB,YAAY,OAArC;AACA,MAAM,YAAY,MAAlB;AACA,MAAM,aAAa,QAAQ,SAAR,EAAmB,KAAnB,EAA0B,gBAA1B,CAAnB;;AAEA,cAAY,UAAZ,GAA0B,WAAW,QAArC;AACA,cAAY,WAAZ,GAA0B,WAAW,OAArC;;AAEA,cAAY,UAAZ,GAAyB,cAAc,WAAd,EAA2B,KAA3B,EAAkC,SAAlC,CAAzB;AACD,CAXD;;AAaA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,aAAvB,EAAsC,iBAA2B;AAAA,MAAf,WAAe,SAAf,WAAe;;AAC/D,MAAI,YAAY,QAAZ,CAAqB,IAArB,KAA8B,MAAlC,EAA0C;AAAE;AAAS;;AAErD,iBAAe,WAAf,EAA4B,YAAY,UAAxC;AACD,CAJD;;AAMA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,YAAvB,EAAqC,iBAA2B;AAAA,MAAf,WAAe,SAAf,WAAe;;AAC9D,MAAI,YAAY,QAAZ,CAAqB,IAArB,KAA8B,MAAlC,EAA0C;AACxC,mBAAe,WAAf,EAA4B,YAAY,UAAxC;AACD;AACF,CAJD;;AAMA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,WAAvB,EAAoC,iBAA2B;AAAA,MAAf,WAAe,SAAf,WAAe;;AAC7D,cAAY,WAAZ,CAAwB,SAAxB,GACE,YAAY,WAAZ,CAAwB,QAAxB,GACA,YAAY,WAAZ,CAAwB,KAAxB,GACA,YAAY,UAAZ,GAAyB,IAH3B;AAID,CALD;;AAOA,SAAS,YAAT,CAAuB,WAAvB,EAAoC,OAApC,EAA6C;AAC3C,MAAM,QAAQ,EAAd;AACA,MAAM,WAAW,EAAjB;;AAEA,YAAU,WAAW,YAAY,OAAjC;;AAEA;AACA,uBAAsB,MAAM,aAA5B,kHAA2C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,QAAhC,OAAgC;;AACzC,QAAI,CAAC,QAAQ,OAAR,CAAgB,IAAhB,CAAqB,OAA1B,EAAmC;AAAE;AAAW;;AAEhD,QAAM,SAAS,QAAQ,OAAR,CAAgB,IAAhB,CAAqB,MAApC;;AAEA;AACA,QAAK,MAAM,EAAN,CAAS,OAAT,CAAiB,MAAjB,KAA4B,WAAW,OAAxC,IACI,MAAM,EAAN,CAAS,MAAT,CAAgB,MAAhB,KACD,CAAC,MAAM,eAAN,CAAsB,OAAtB,EAA+B,MAA/B,CAFR,EAEiD;;AAE/C;AACD;;AAED;AACA,QAAM,eAAe,MAAM,EAAN,CAAS,MAAT,CAAgB,QAAQ,MAAxB,IACjB,QAAQ,QAAR,CAAiB,gBAAjB,CAAkC,QAAQ,MAA1C,CADiB,GAEjB,CAAC,QAAQ,MAAT,CAFJ;;AAIA,SAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,aAAa,MAAjC,EAAyC,GAAzC,EAA8C;AAC5C,UAAM,iBAAiB,aAAa,CAAb,CAAvB;;AAEA,UAAI,mBAAmB,OAAvB,EAAgC;AAC9B,cAAM,IAAN,CAAW,OAAX;AACA,iBAAS,IAAT,CAAc,cAAd;AACD;AACF;AACF;;AAED,SAAO;AACL,sBADK;AAEL,eAAW;AAFN,GAAP;AAID;;AAED,SAAS,eAAT,CAA0B,WAA1B,EAAuC,KAAvC,EAA8C;AAC5C,MAAI,oBAAJ;;AAEA;AACA,OAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,YAAY,WAAZ,CAAwB,SAAxB,CAAkC,MAAtD,EAA8D,GAA9D,EAAmE;AACjE,QAAM,UAAU,YAAY,WAAZ,CAAwB,SAAxB,CAAkC,CAAlC,CAAhB;AACA,QAAM,iBAAiB,YAAY,WAAZ,CAAwB,QAAxB,CAAkC,CAAlC,CAAvB;;AAEA;AACA,QAAI,mBAAmB,WAAvB,EAAoC;AAClC;AACA,YAAM,MAAN,GAAe,cAAf;AACA,cAAQ,IAAR,CAAa,KAAb;AACD;AACD,kBAAc,cAAd;AACD;AACF;;AAED;AACA;AACA;AACA,SAAS,cAAT,CAAyB,WAAzB,EAAsC,WAAtC,EAAmD;AACjD;AACA,MAAM,gBAAgB,aAAa,WAAb,EAA0B,WAA1B,EAAuC,IAAvC,CAAtB;;AAEA,cAAY,WAAZ,CAAwB,SAAxB,GAAoC,cAAc,SAAlD;AACA,cAAY,WAAZ,CAAwB,QAAxB,GAAoC,cAAc,QAAlD;AACA,cAAY,WAAZ,CAAwB,KAAxB,GAAoC,EAApC;;AAEA,OAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,YAAY,WAAZ,CAAwB,SAAxB,CAAkC,MAAtD,EAA8D,GAA9D,EAAmE;AACjE,gBAAY,WAAZ,CAAwB,KAAxB,CAA8B,CAA9B,IACE,YAAY,WAAZ,CAAwB,SAAxB,CAAkC,CAAlC,EAAqC,OAArC,CAA6C,YAAY,WAAZ,CAAwB,QAAxB,CAAiC,CAAjC,CAA7C,CADF;AAED;AACF;;AAED,SAAS,OAAT,CAAkB,SAAlB,EAA6B,KAA7B,EAAoC,WAApC,EAAiD;AAC/C,MAAM,cAAc,UAAU,WAA9B;AACA,MAAM,aAAa,EAAnB;;AAEA,MAAI,WAAJ,EAAiB;AACf,mBAAe,WAAf,EAA4B,WAA5B;AACD;;AAED;AACA,OAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,YAAY,WAAZ,CAAwB,SAAxB,CAAkC,MAAtD,EAA8D,GAA9D,EAAmE;AACjE,QAAM,UAAiB,YAAY,WAAZ,CAAwB,SAAxB,CAAkC,CAAlC,CAAvB;AACA,QAAM,iBAAiB,YAAY,WAAZ,CAAwB,QAAxB,CAAkC,CAAlC,CAAvB;AACA,QAAM,OAAiB,YAAY,WAAZ,CAAwB,KAAxB,CAAkC,CAAlC,CAAvB;;AAEA,eAAW,IAAX,CAAgB,QAAQ,SAAR,CAAkB,SAAlB,EAA6B,KAA7B,EAAoC,YAAY,MAAhD,EAAwD,WAAxD,EAAqE,cAArE,EAAqF,IAArF,IACZ,cADY,GAEZ,IAFJ;AAGD;;AAED;AACA,MAAM,YAAY,MAAM,qBAAN,CAA4B,UAA5B,CAAlB;;AAEA,SAAO;AACL,cAAU,YAAY,WAAZ,CAAwB,SAAxB,CAAkC,SAAlC,KAAgD,IADrD;AAEL,aAAU,YAAY,WAAZ,CAAwB,QAAxB,CAAkC,SAAlC,KAAgD;AAFrD,GAAP;AAID;;AAED,SAAS,aAAT,CAAwB,WAAxB,EAAqC,YAArC,EAAmD,SAAnD,EAA8D;AAC5D,MAAM,aAAa;AACjB,WAAY,IADK;AAEjB,WAAY,IAFK;AAGjB,cAAY,IAHK;AAIjB,gBAAY,IAJK;AAKjB,UAAY,IALK;AAMjB,UAAY;AANK,GAAnB;;AASA,MAAM,OAAO;AACX,wBADW;AAEX,4BAFW;AAGX,YAAe,YAAY,WAHhB;AAIX,cAAe,YAAY,UAJhB;AAKX,mBAAe,UAAU,MALd;AAMX,eAAe,UAAU,YANd;AAOX,eAAe,UAAU;AAPd,GAAb;;AAUA,MAAI,YAAY,WAAZ,KAA4B,YAAY,eAA5C,EAA6D;AAC3D;AACA,QAAI,YAAY,cAAhB,EAAgC;AAC9B,iBAAW,KAAX,GAAmB,MAAM,MAAN,CAAa,EAAE,MAAM,WAAR,EAAb,EAAoC,IAApC,CAAnB;;AAEA,gBAAU,SAAV,GAAyB,WAAW,KAAX,CAAiB,MAAjB,GAA4B,YAAY,eAAjE;AACA,gBAAU,YAAV,GAAyB,WAAW,KAAX,CAAiB,QAAjB,GAA4B,YAAY,cAAjE;AACD;AACD;AACA,QAAI,YAAY,UAAhB,EAA4B;AAC1B,iBAAW,KAAX,GAAmB;AACjB,4BADiB;AAEjB,gCAFiB;AAGjB,gBAAe,YAAY,WAHV;AAIjB,kBAAe,YAAY,UAJV;AAKjB,uBAAe,UAAU,MALR;AAMjB,mBAAe,UAAU,YANR;AAOjB,mBAAe,UAAU,SAPR;AAQjB,cAAe;AARE,OAAnB;;AAWA,gBAAU,SAAV,GAAsB,YAAY,WAAlC;AACA,gBAAU,QAAV,GAAqB,YAAY,UAAjC;AACD;AACF;;AAED,MAAI,UAAU,IAAV,KAAmB,SAAnB,IAAgC,YAAY,UAAhD,EAA4D;AAC1D,eAAW,IAAX,GAAkB,MAAM,MAAN,CAAa,EAAE,MAAM,MAAR,EAAb,EAA+B,IAA/B,CAAlB;;AAEA,cAAU,QAAV,GAAqB,YAAY,UAAjC;AACA,cAAU,aAAV,GAA0B,YAAY,WAAtC;AACD;AACD,MAAI,UAAU,IAAV,KAAmB,WAAvB,EAAoC;AAClC,eAAW,QAAX,GAAsB,MAAM,MAAN,CAAa,EAAE,MAAM,cAAR,EAAb,EAAuC,IAAvC,CAAtB;;AAEA,eAAW,QAAX,CAAoB,MAApB,GAA+B,IAA/B;AACA,eAAW,QAAX,CAAoB,QAApB,GAA+B,IAA/B;AACD;AACD,MAAI,UAAU,IAAV,KAAmB,SAAvB,EAAkC;AAChC,eAAW,UAAX,GAAwB,MAAM,MAAN,CAAa,EAAE,MAAM,gBAAR,EAAb,EAAyC,IAAzC,CAAxB;;AAEA,eAAW,UAAX,CAAsB,MAAtB,GAAiC,IAAjC;AACA,eAAW,UAAX,CAAsB,QAAtB,GAAiC,IAAjC;AACD;AACD,MAAI,UAAU,IAAV,KAAmB,UAAnB,IAAiC,YAAY,UAAjD,EAA6D;AAC3D,eAAW,IAAX,GAAkB,MAAM,MAAN,CAAa;AAC7B,gBAAe,SADc;AAE7B,YAAe;AAFc,KAAb,EAGf,IAHe,CAAlB;;AAKA,cAAU,QAAV,GAAqB,YAAY,UAAjC;AACD;;AAED,SAAO,UAAP;AACD;;AAED,SAAS,cAAT,CAAyB,WAAzB,EAAsC,UAAtC,EAAkD;AAChD,MAAI,WAAW,KAAf,EAAsB;AAAE,gBAAY,cAAZ,CAA2B,IAA3B,CAAgC,WAAW,KAA3C;AAAoD;AAC5E,MAAI,WAAW,IAAf,EAAsB;AAAM,gBAAY,UAAZ,CAAuB,IAAvB,CAA4B,WAAW,IAAvC;AAAgD;AAC5E,MAAI,WAAW,KAAf,EAAsB;AAAM,gBAAY,UAAZ,CAAuB,IAAvB,CAA4B,WAAW,KAAvC;AAAgD;AAC5E,MAAI,WAAW,IAAf,EAAsB;AAAM,gBAAY,UAAZ,CAAuB,IAAvB,CAA4B,WAAW,IAAvC;AAAgD;AAC5E,MAAI,WAAW,UAAf,EAA2B;AACzB,oBAAgB,WAAhB,EAA6B,WAAW,UAAxC;AACD;;AAED,cAAY,cAAZ,GAA8B,YAAY,UAA1C;AACA,cAAY,eAAZ,GAA8B,YAAY,WAA1C;AACD;;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoDA,aAAa,SAAb,CAAuB,QAAvB,GAAkC,UAAU,OAAV,EAAmB;AACnD,MAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,OAAhB,CAAJ,EAA8B;AAC5B,SAAK,OAAL,CAAa,IAAb,CAAkB,OAAlB,GAA4B,QAAQ,OAAR,KAAoB,KAApB,GAA2B,KAA3B,GAAkC,IAA9D;;AAEA,QAAI,MAAM,EAAN,CAAS,QAAT,CAAkB,QAAQ,MAA1B,CAAJ,EAAiD;AAAE,WAAK,MAAL,CAAY,MAAZ,GAA+B,QAAQ,MAAvC;AAA0D;AAC7G,QAAI,MAAM,EAAN,CAAS,QAAT,CAAkB,QAAQ,cAA1B,CAAJ,EAAiD;AAAE,WAAK,MAAL,CAAY,cAAZ,GAA+B,QAAQ,cAAvC;AAA0D;AAC7G,QAAI,MAAM,EAAN,CAAS,QAAT,CAAkB,QAAQ,gBAA1B,CAAJ,EAAiD;AAAE,WAAK,MAAL,CAAY,gBAAZ,GAA+B,QAAQ,gBAAvC;AAA0D;AAC7G,QAAI,MAAM,EAAN,CAAS,QAAT,CAAkB,QAAQ,WAA1B,CAAJ,EAAiD;AAAE,WAAK,MAAL,CAAY,WAAZ,GAA+B,QAAQ,WAAvC;AAA0D;AAC7G,QAAI,MAAM,EAAN,CAAS,QAAT,CAAkB,QAAQ,WAA1B,CAAJ,EAAiD;AAAE,WAAK,MAAL,CAAY,WAAZ,GAA+B,QAAQ,WAAvC;AAA0D;AAC7G,QAAI,MAAM,EAAN,CAAS,QAAT,CAAkB,QAAQ,UAA1B,CAAJ,EAAiD;AAAE,WAAK,MAAL,CAAY,UAAZ,GAA+B,QAAQ,UAAvC;AAA0D;;AAE7G,QAAI,qBAAqB,IAArB,CAA0B,QAAQ,OAAlC,CAAJ,EAAgD;AAC9C,WAAK,OAAL,CAAa,IAAb,CAAkB,OAAlB,GAA4B,QAAQ,OAApC;AACD,KAFD,MAGK,IAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,QAAQ,OAAxB,CAAJ,EAAsC;AACzC,WAAK,OAAL,CAAa,IAAb,CAAkB,OAAlB,GAA4B,KAAK,GAAL,CAAS,KAAK,GAAL,CAAS,CAAT,EAAY,QAAQ,OAApB,CAAT,EAAuC,CAAvC,CAA5B;AACD;AACD,QAAI,YAAY,OAAhB,EAAyB;AACvB,WAAK,OAAL,CAAa,IAAb,CAAkB,MAAlB,GAA2B,QAAQ,MAAnC;AACD;AACD,QAAI,aAAa,OAAjB,EAA0B;AACxB,WAAK,OAAL,CAAa,IAAb,CAAkB,OAAlB,GAA4B,QAAQ,OAApC;AACD;;AAGD,WAAO,IAAP;AACD;;AAED,MAAI,MAAM,EAAN,CAAS,IAAT,CAAc,OAAd,CAAJ,EAA4B;AAC1B,SAAK,OAAL,CAAa,IAAb,CAAkB,OAAlB,GAA4B,OAA5B;;AAEA,QAAI,CAAC,OAAL,EAAc;AACZ,WAAK,WAAL,GAAmB,KAAK,WAAL,GAAmB,KAAK,MAAL,GAClC,KAAK,cAAL,GAAsB,KAAK,gBAAL,GAAwB,IADlD;AAED;;AAED,WAAO,IAAP;AACD;;AAED,SAAO,KAAK,OAAL,CAAa,IAApB;AACD,CAxCD;;AA0CA,aAAa,SAAb,CAAuB,SAAvB,GAAmC,UAAU,SAAV,EAAqB,KAArB,EAA4B,SAA5B,EAAuC,gBAAvC,EAAyD,WAAzD,EAAsE,IAAtE,EAA4E;AAC7G,MAAI,UAAU,KAAd;;AAEA;AACA;AACA,MAAI,EAAE,OAAO,QAAQ,KAAK,OAAL,CAAa,WAAb,CAAjB,CAAJ,EAAiD;AAC/C,WAAQ,KAAK,OAAL,CAAa,IAAb,CAAkB,OAAlB,GACJ,KAAK,OAAL,CAAa,IAAb,CAAkB,OAAlB,CAA0B,SAA1B,EAAqC,KAArC,EAA4C,OAA5C,EAAqD,IAArD,EAA2D,WAA3D,EAAwE,SAAxE,EAAmF,gBAAnF,CADI,GAEJ,KAFJ;AAGD;;AAED,MAAM,cAAc,KAAK,OAAL,CAAa,IAAb,CAAkB,OAAtC;;AAEA,MAAI,gBAAgB,SAApB,EAA+B;AAC7B,QAAM,SAAS,MAAM,WAAN,CAAkB,SAAlB,EAA6B,gBAA7B,EAA+C,MAA/C,CAAf;AACA,QAAM,OAAO,MAAM,SAAN,CAAgB,SAAhB,CAAb;;AAEA,SAAK,CAAL,IAAU,OAAO,CAAjB;AACA,SAAK,CAAL,IAAU,OAAO,CAAjB;;AAEA,QAAM,aAAc,KAAK,CAAL,GAAS,KAAK,IAAf,IAAyB,KAAK,CAAL,GAAS,KAAK,KAA1D;AACA,QAAM,WAAc,KAAK,CAAL,GAAS,KAAK,GAAf,IAAyB,KAAK,CAAL,GAAS,KAAK,MAA1D;;AAEA,cAAU,cAAc,QAAxB;AACD;;AAED,MAAM,WAAW,UAAU,OAAV,CAAkB,gBAAlB,CAAjB;;AAEA,MAAI,YAAY,gBAAgB,QAAhC,EAA0C;AACxC,QAAM,KAAK,SAAS,IAAT,GAAgB,SAAS,KAAT,GAAkB,CAA7C;AACA,QAAM,KAAK,SAAS,GAAT,GAAgB,SAAS,MAAT,GAAkB,CAA7C;;AAEA,cAAU,MAAM,KAAK,IAAX,IAAmB,MAAM,KAAK,KAA9B,IAAuC,MAAM,KAAK,GAAlD,IAAyD,MAAM,KAAK,MAA9E;AACD;;AAED,MAAI,YAAY,MAAM,EAAN,CAAS,MAAT,CAAgB,WAAhB,CAAhB,EAA8C;AAC5C,QAAM,cAAgB,KAAK,GAAL,CAAS,CAAT,EAAY,KAAK,GAAL,CAAS,KAAK,KAAd,EAAsB,SAAS,KAA/B,IAAyC,KAAK,GAAL,CAAS,KAAK,IAAd,EAAoB,SAAS,IAA7B,CAArD,IACE,KAAK,GAAL,CAAS,CAAT,EAAY,KAAK,GAAL,CAAS,KAAK,MAAd,EAAsB,SAAS,MAA/B,IAAyC,KAAK,GAAL,CAAS,KAAK,GAAd,EAAoB,SAAS,GAA7B,CAArD,CADxB;;AAGA,QAAM,eAAe,eAAe,SAAS,KAAT,GAAiB,SAAS,MAAzC,CAArB;;AAEA,cAAU,gBAAgB,WAA1B;AACD;;AAED,MAAI,KAAK,OAAL,CAAa,IAAb,CAAkB,OAAtB,EAA+B;AAC7B,cAAU,KAAK,OAAL,CAAa,IAAb,CAAkB,OAAlB,CAA0B,SAA1B,EAAqC,KAArC,EAA4C,OAA5C,EAAqD,IAArD,EAA2D,WAA3D,EAAwE,SAAxE,EAAmF,gBAAnF,CAAV;AACD;;AAED,SAAO,OAAP;AACD,CAjDD;;AAmDA,aAAa,OAAb,CAAqB,EAArB,CAAwB,OAAxB,EAAiC,iBAA4B;AAAA,MAAhB,YAAgB,SAAhB,YAAgB;;AAC3D,eAAa,QAAb,CAAsB,KAAtB;AACD,CAFD;;AAIA,aAAa,eAAb,CAA6B,IAA7B,CAAkC,aAAlC;;AAEA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,KAAvB,EAA8B,UAAU,WAAV,EAAuB;AACnD,cAAY,UAAZ,GAA8B,IAA9B,CADmD,CACf;AACpC,cAAY,WAAZ,GAA8B,IAA9B,CAFmD,CAEf;AACpC,cAAY,cAAZ,GAA8B,IAA9B,CAHmD,CAGf;AACpC,cAAY,eAAZ,GAA8B,IAA9B,CAJmD,CAIf;AACpC,cAAY,UAAZ,GAA8B,IAA9B,CALmD,CAKf;;AAEpC,cAAY,WAAZ,GAA0B;AACxB,eAAW,EADa,EACJ;AACpB,cAAW,EAFa,EAEJ;AACpB,WAAW,EAHa,CAGJ;AAHI,GAA1B;AAMD,CAbD;;AAeA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,MAAvB,EAA+B,iBAA2B;AAAA,MAAf,WAAe,SAAf,WAAe;;AACxD,cAAY,UAAZ,GAAyB,YAAY,WAAZ,GACvB,YAAY,cAAZ,GAA6B,YAAY,eAAZ,GAA8B,IAD7D;AAED,CAHD;;AAKA;;;;;;;;;;;AAWA,SAAS,WAAT,GAAuB,UAAU,QAAV,EAAoB;AACzC,MAAI,MAAM,EAAN,CAAS,IAAT,CAAc,QAAd,CAAJ,EAA6B;AAC3B;AACE;AACF;;AAEA,kBAAc,QAAd;;AAEA,WAAO,QAAP;AACD;AACD,SAAO,WAAP;AACD,CAXD;;AAaA,MAAM,KAAN,CAAY,aAAa,UAAzB,EAAqC,CACnC,WADmC,EAEnC,WAFmC,EAGnC,cAHmC,EAInC,gBAJmC,EAKnC,UALmC,EAMnC,MANmC,CAArC;AAQA,QAAQ,UAAR,CAAmB,IAAnB,GAA0B,UAA1B;;AAEA,eAAe,IAAf,GAAsB,KAAK,QAA3B;;AAEA,OAAO,OAAP,GAAiB,IAAjB;;;;;ACzdA,IAAM,UAAiB,QAAQ,QAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,UAAR,CAAvB;AACA,IAAM,gBAAiB,QAAQ,kBAAR,CAAvB;AACA,IAAM,eAAiB,QAAQ,iBAAR,CAAvB;AACA,IAAM,cAAiB,QAAQ,gBAAR,CAAvB;AACA,IAAM,iBAAiB,QAAQ,mBAAR,CAAvB;;AAEA,IAAM,UAAU;AACd,YAAU;AACR,aAAU,KADF;AAER,YAAU,IAFF;AAGR,cAAU;AAHF,GADI;;AAOd,WAAS,iBAAU,OAAV,EAAmB,KAAnB,EAA0B,YAA1B,EAAwC,OAAxC,EAAiD,WAAjD,EAA8D;AACrE,QAAI,YAAY,UAAZ,CAAuB,MAAvB,IAAiC,CAArC,EAAwC;AACtC,aAAO,EAAE,MAAM,SAAR,EAAP;AACD;;AAED,WAAO,IAAP;AACD,GAba;;AAed,aAAW,qBAAY;AACrB,WAAO,EAAP;AACD;AAjBa,CAAhB;;AAoBA,cAAc,OAAd,CAAsB,EAAtB,CAAyB,KAAzB,EAAgC,gBAAmC;AAAA,MAAvB,MAAuB,QAAvB,MAAuB;AAAA,MAAf,WAAe,QAAf,WAAe;;AACjE,MAAI,OAAO,IAAP,KAAgB,cAApB,EAAoC;AAAE;AAAS;AAC/C,SAAO,EAAP,GAAY,CAAZ;;AAEA,cAAY,OAAZ,CAAoB,aAApB,GAAoC,YAAY,OAAZ,CAAoB,YAApB,GAAmC,OAAO,QAA9E;AACA,cAAY,OAAZ,CAAoB,UAApB,GAAiC,YAAY,OAAZ,CAAoB,SAApB,GAAgC,OAAO,KAAxE;AACA,cAAY,OAAZ,CAAoB,KAApB,GAA4B,CAA5B;AACD,CAPD;;AASA,cAAc,OAAd,CAAsB,EAAtB,CAAyB,KAAzB,EAAgC,iBAAmC;AAAA,MAAvB,MAAuB,SAAvB,MAAuB;AAAA,MAAf,WAAe,SAAf,WAAe;;AACjE,MAAI,OAAO,IAAP,KAAgB,aAApB,EAAmC;AAAE;AAAS;;AAE9C,SAAO,EAAP,GAAY,OAAO,KAAP,GAAe,YAAY,OAAZ,CAAoB,KAA/C;;AAEA,cAAY,MAAZ,CAAmB,IAAnB,CAAwB,MAAxB;;AAEA,cAAY,OAAZ,CAAoB,SAApB,GAAgC,OAAO,KAAvC;AACA,cAAY,OAAZ,CAAoB,YAApB,GAAmC,OAAO,QAA1C;;AAEA,MAAI,OAAO,KAAP,KAAiB,QAAjB,IACG,OAAO,KAAP,KAAiB,IADpB,IAEG,OAAO,KAAP,KAAiB,SAFpB,IAGG,CAAC,MAAM,OAAO,KAAb,CAHR,EAG6B;;AAE3B,gBAAY,OAAZ,CAAoB,KAApB,GAA4B,OAAO,KAAnC;AACD;AACF,CAjBD;;AAmBA;;;;;;;;;;;;;;;;;;;;;;;AAuBA,aAAa,SAAb,CAAuB,UAAvB,GAAoC,UAAU,OAAV,EAAmB;AACrD,MAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,OAAhB,CAAJ,EAA8B;AAC5B,SAAK,OAAL,CAAa,OAAb,CAAqB,OAArB,GAA+B,QAAQ,OAAR,KAAoB,KAApB,GAA2B,KAA3B,GAAkC,IAAjE;AACA,SAAK,YAAL,CAAkB,SAAlB,EAA6B,OAA7B;AACA,SAAK,WAAL,CAAiB,SAAjB,EAA4B,OAA5B;;AAEA,WAAO,IAAP;AACD;;AAED,MAAI,MAAM,EAAN,CAAS,IAAT,CAAc,OAAd,CAAJ,EAA4B;AAC1B,SAAK,OAAL,CAAa,OAAb,CAAqB,OAArB,GAA+B,OAA/B;;AAEA,QAAI,CAAC,OAAL,EAAc;AACZ,WAAK,cAAL,GAAsB,KAAK,cAAL,GAAsB,KAAK,YAAL,GAAoB,IAAhE;AACD;;AAED,WAAO,IAAP;AACD;;AAED,SAAO,KAAK,OAAL,CAAa,OAApB;AACD,CApBD;;AAsBA,cAAc,OAAd,CAAsB,EAAtB,CAAyB,WAAzB,EAAsC,iBAAiF;AAAA,MAArE,WAAqE,SAArE,WAAqE;AAAA,MAAxD,MAAwD,SAAxD,MAAwD;AAAA,MAAhD,MAAgD,SAAhD,MAAgD;AAAA,MAAxC,KAAwC,SAAxC,KAAwC;AAAA,MAAjC,QAAiC,SAAjC,QAAiC;AAAA,MAAvB,MAAuB,SAAvB,MAAuB;AAAA,MAAf,WAAe,SAAf,WAAe;;AACrH,MAAI,WAAW,SAAf,EAA0B;AAAE;AAAS;;AAErC,MAAM,WAAW,YAAY,QAA7B;;AAEA,SAAO,OAAP,GAAiB,CAAC,SAAS,CAAT,CAAD,EAAc,SAAS,CAAT,CAAd,CAAjB;;AAEA,MAAI,QAAJ,EAAc;AACZ,WAAO,QAAP,GAAkB,MAAM,aAAN,CAAoB,QAApB,EAA8B,WAA9B,CAAlB;AACA,WAAO,GAAP,GAAkB,MAAM,SAAN,CAAgB,QAAhB,CAAlB;AACA,WAAO,KAAP,GAAkB,CAAlB;AACA,WAAO,EAAP,GAAkB,CAAlB;AACA,WAAO,KAAP,GAAkB,MAAM,UAAN,CAAiB,QAAjB,EAA2B,SAA3B,EAAsC,WAAtC,CAAlB;AACA,WAAO,EAAP,GAAkB,CAAlB;AACD,GAPD,MAQK,IAAI,UAAU,iBAAiB,aAA/B,EAA8C;AACjD,WAAO,QAAP,GAAkB,YAAY,SAAZ,CAAsB,QAAxC;AACA,WAAO,GAAP,GAAkB,YAAY,SAAZ,CAAsB,GAAxC;AACA,WAAO,KAAP,GAAkB,YAAY,SAAZ,CAAsB,KAAxC;AACA,WAAO,EAAP,GAAkB,OAAO,KAAP,GAAe,CAAjC;AACA,WAAO,KAAP,GAAkB,YAAY,SAAZ,CAAsB,KAAxC;AACA,WAAO,EAAP,GAAkB,OAAO,KAAP,GAAe,YAAY,OAAZ,CAAoB,UAArD;AACD,GAPI,MAQA;AACH,WAAO,QAAP,GAAkB,MAAM,aAAN,CAAoB,QAApB,EAA8B,WAA9B,CAAlB;AACA,WAAO,GAAP,GAAkB,MAAM,SAAN,CAAgB,QAAhB,CAAlB;AACA,WAAO,KAAP,GAAkB,OAAO,QAAP,GAAkB,YAAY,OAAZ,CAAoB,aAAxD;AACA,WAAO,KAAP,GAAkB,MAAM,UAAN,CAAiB,QAAjB,EAA2B,YAAY,OAAZ,CAAoB,SAA/C,EAA0D,WAA1D,CAAlB;;AAEA,WAAO,EAAP,GAAY,OAAO,KAAP,GAAe,YAAY,OAAZ,CAAoB,SAA/C;AACA,WAAO,EAAP,GAAY,OAAO,KAAP,GAAe,YAAY,OAAZ,CAAoB,SAA/C;AACD;AACF,CAhCD;;AAkCA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,KAAvB,EAA8B,UAAU,WAAV,EAAuB;AACnD,cAAY,OAAZ,GAAsB;AACpB,WAAO,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EADa;;AAGpB,mBAAe,CAHK,EAGA;AACpB,kBAAe,CAJK;AAKpB,cAAe,CALK;;AAOpB,WAAO,CAPa,EAOA;;AAEpB,gBAAY,CATQ,EASA;AACpB,eAAY,CAVQ,CAUA;AAVA,GAAtB;AAYD,CAbD;;AAeA,QAAQ,OAAR,GAAkB,OAAlB;AACA,QAAQ,KAAR,CAAc,IAAd,CAAmB,SAAnB;AACA,MAAM,KAAN,CAAY,aAAa,UAAzB,EAAqC,CACnC,cADmC,EAEnC,aAFmC,EAGnC,YAHmC,CAArC;AAKA,QAAQ,UAAR,CAAmB,OAAnB,GAA6B,YAA7B;;AAEA,eAAe,OAAf,GAAyB,QAAQ,QAAjC;;AAEA,OAAO,OAAP,GAAiB,OAAjB;;;;;AChKA,IAAM,UAAiB,QAAQ,QAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,UAAR,CAAvB;AACA,IAAM,UAAiB,QAAQ,kBAAR,CAAvB;AACA,IAAM,gBAAiB,QAAQ,kBAAR,CAAvB;AACA,IAAM,eAAiB,QAAQ,iBAAR,CAAvB;AACA,IAAM,cAAiB,QAAQ,gBAAR,CAAvB;AACA,IAAM,iBAAiB,QAAQ,mBAAR,CAAvB;;AAEA;AACA,IAAM,gBAAgB,QAAQ,aAAR,IAAyB,QAAQ,oBAAjC,GAAuD,EAAvD,GAA2D,EAAjF;;AAEA,IAAM,SAAS;AACb,YAAU;AACR,aAAc,KADN;AAER,kBAAc,IAFN;;AAIR,YAAY,IAJJ;AAKR,UAAY,IALJ;AAMR,cAAY,IANJ;AAOR,aAAY,IAPJ;AAQR,gBAAY,IARJ;;AAUR,YAAQ,KAVA;AAWR,yBAAqB,KAXb;AAYR,UAAM,IAZE;;AAcR;AACA,YAAQ,GAfA;;AAiBR;AACA;AACA;AACA;AACA,WAAO,IArBC;;AAuBR;AACA;AACA;AACA;AACA,YAAQ;AA3BA,GADG;;AA+Bb,WAAS,iBAAU,OAAV,EAAmB,KAAnB,EAA0B,YAA1B,EAAwC,OAAxC,EAAiD,WAAjD,EAA8D,IAA9D,EAAoE;AAC3E,QAAI,CAAC,IAAL,EAAW;AAAE,aAAO,IAAP;AAAc;;AAE3B,QAAM,OAAO,MAAM,MAAN,CAAa,EAAb,EAAiB,YAAY,SAAZ,CAAsB,IAAvC,CAAb;AACA,QAAM,UAAU,aAAa,OAA7B;;AAEA,QAAI,QAAQ,MAAR,CAAe,OAAnB,EAA4B;AAC1B,UAAM,gBAAgB,QAAQ,MAA9B;AACA,UAAM,cAAc,EAAE,MAAM,KAAR,EAAe,OAAO,KAAtB,EAA6B,KAAK,KAAlC,EAAyC,QAAQ,KAAjD,EAApB;;AAEA;AACA,UAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,cAAc,KAA9B,CAAJ,EAA0C;AACxC,aAAK,IAAM,IAAX,IAAmB,WAAnB,EAAgC;AAC9B,sBAAY,IAAZ,IAAoB,gBAAgB,IAAhB,EACgB,cAAc,KAAd,CAAoB,IAApB,CADhB,EAEgB,IAFhB,EAGgB,YAAY,YAH5B,EAIgB,OAJhB,EAKgB,IALhB,EAMgB,cAAc,MAAd,IAAwB,aANxC,CAApB;AAOD;;AAED,oBAAY,IAAZ,GAAmB,YAAY,IAAZ,IAAoB,CAAC,YAAY,KAApD;AACA,oBAAY,GAAZ,GAAmB,YAAY,GAAZ,IAAoB,CAAC,YAAY,MAApD;;AAEA,YAAI,YAAY,IAAZ,IAAoB,YAAY,KAAhC,IAAyC,YAAY,GAArD,IAA4D,YAAY,MAA5E,EAAoF;AAClF,iBAAO;AACL,kBAAM,QADD;AAEL,mBAAO;AAFF,WAAP;AAID;AACF,OApBD,MAqBK;AACH,YAAM,QAAS,QAAQ,MAAR,CAAe,IAAf,KAAwB,GAAxB,IAA+B,KAAK,CAAL,GAAU,KAAK,KAAL,GAAc,aAAtE;AACA,YAAM,SAAS,QAAQ,MAAR,CAAe,IAAf,KAAwB,GAAxB,IAA+B,KAAK,CAAL,GAAU,KAAK,MAAL,GAAc,aAAtE;;AAEA,YAAI,SAAS,MAAb,EAAqB;AACnB,iBAAO;AACL,kBAAM,QADD;AAEL,kBAAM,CAAC,QAAO,GAAP,GAAa,EAAd,KAAqB,SAAQ,GAAR,GAAc,EAAnC;AAFD,WAAP;AAID;AACF;AACF;;AAED,WAAO,IAAP;AACD,GA7EY;;AA+Eb,WAAU,QAAQ,YAAR,GAAuB;AAC/B,OAAI,UAD2B;AAE/B,OAAI,UAF2B;AAG/B,QAAI,WAH2B;;AAK/B,SAAa,UALkB;AAM/B,UAAa,UANkB;AAO/B,YAAa,UAPkB;AAQ/B,WAAa,UARkB;AAS/B,aAAa,WATkB;AAU/B,iBAAa,WAVkB;AAW/B,cAAa,WAXkB;AAY/B,gBAAa;AAZkB,GAAvB,GAaN;AACF,OAAI,WADF;AAEF,OAAI,WAFF;AAGF,QAAI,aAHF;;AAKF,SAAa,WALX;AAMF,UAAa,WANX;AAOF,YAAa,WAPX;AAQF,WAAa,WARX;AASF,aAAa,aATX;AAUF,iBAAa,aAVX;AAWF,cAAa,aAXX;AAYF,gBAAa;AAZX,GA5FS;;AA2Gb,aAAW,mBAAU,MAAV,EAAkB;AAC3B,QAAI,OAAO,IAAX,EAAiB;AACf,aAAO,OAAO,OAAP,CAAe,OAAO,IAAP,GAAc,OAAO,IAApC,CAAP;AACD,KAFD,MAGK,IAAI,OAAO,KAAX,EAAkB;AACrB,UAAI,YAAY,EAAhB;AACA,UAAM,YAAY,CAAC,KAAD,EAAQ,QAAR,EAAkB,MAAlB,EAA0B,OAA1B,CAAlB;;AAEA,WAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,CAApB,EAAuB,GAAvB,EAA4B;AAC1B,YAAI,OAAO,KAAP,CAAa,UAAU,CAAV,CAAb,CAAJ,EAAgC;AAC9B,uBAAa,UAAU,CAAV,CAAb;AACD;AACF;;AAED,aAAO,OAAO,OAAP,CAAe,SAAf,CAAP;AACD;AACF;AA3HY,CAAf;;AA8HA;AACA,cAAc,OAAd,CAAsB,EAAtB,CAAyB,KAAzB,EAAgC,gBAAmC;AAAA,MAAvB,MAAuB,QAAvB,MAAuB;AAAA,MAAf,WAAe,QAAf,WAAe;;AACjE,MAAI,OAAO,IAAP,KAAgB,aAAhB,IAAiC,CAAC,YAAY,QAAZ,CAAqB,KAA3D,EAAkE;AAChE;AACD;;AAED,MAAM,YAAY,YAAY,MAAZ,CAAmB,OAAnB,CAA2B,YAAY,OAAvC,CAAlB;AACA,MAAM,gBAAgB,YAAY,MAAZ,CAAmB,OAAnB,CAA2B,MAAjD;;AAEA;;;;;;AAMA,MAAI,cAAc,MAAd,IAAwB,cAAc,mBAA1C,EAA+D;AAC7D,QAAM,cAAc,MAAM,MAAN,CAAa,EAAb,EAAiB,YAAY,QAAZ,CAAqB,KAAtC,CAApB;;AAEA,gBAAY,GAAZ,GAAqB,YAAY,GAAZ,IAAuB,YAAY,IAAZ,IAAsB,CAAC,YAAY,MAA/E;AACA,gBAAY,IAAZ,GAAqB,YAAY,IAAZ,IAAuB,YAAY,GAAZ,IAAsB,CAAC,YAAY,KAA/E;AACA,gBAAY,MAAZ,GAAqB,YAAY,MAAZ,IAAuB,YAAY,KAAZ,IAAsB,CAAC,YAAY,GAA/E;AACA,gBAAY,KAAZ,GAAqB,YAAY,KAAZ,IAAuB,YAAY,MAAZ,IAAsB,CAAC,YAAY,IAA/E;;AAEA,gBAAY,QAAZ,CAAqB,YAArB,GAAoC,WAApC;AACD,GATD,MAUK;AACH,gBAAY,QAAZ,CAAqB,YAArB,GAAoC,IAApC;AACD;;AAED;AACA,MAAI,cAAc,mBAAlB,EAAuC;AACrC,gBAAY,sBAAZ,GAAqC,UAAU,KAAV,GAAkB,UAAU,MAAjE;AACD;;AAED,cAAY,WAAZ,GAA0B;AACxB,WAAY,SADY;AAExB,aAAY,MAAM,MAAN,CAAa,EAAb,EAAiB,SAAjB,CAFY;AAGxB,cAAY,MAAM,MAAN,CAAa,EAAb,EAAiB,SAAjB,CAHY;AAIxB,cAAY,MAAM,MAAN,CAAa,EAAb,EAAiB,SAAjB,CAJY;AAKxB,WAAY;AACV,YAAM,CADI,EACD,OAAQ,CADP,EACU,OAAQ,CADlB;AAEV,WAAM,CAFI,EAED,QAAQ,CAFP,EAEU,QAAQ;AAFlB;AALY,GAA1B;;AAWA,SAAO,IAAP,GAAc,YAAY,WAAZ,CAAwB,QAAtC;AACA,SAAO,SAAP,GAAmB,YAAY,WAAZ,CAAwB,KAA3C;AACD,CA9CD;;AAgDA;AACA,cAAc,OAAd,CAAsB,EAAtB,CAAyB,KAAzB,EAAgC,iBAA0C;AAAA,MAA9B,MAA8B,SAA9B,MAA8B;AAAA,MAAtB,KAAsB,SAAtB,KAAsB;AAAA,MAAf,WAAe,SAAf,WAAe;;AACxE,MAAI,UAAU,MAAV,IAAoB,CAAC,YAAY,QAAZ,CAAqB,KAA9C,EAAqD;AAAE;AAAS;;AAEhE,MAAM,gBAAgB,YAAY,MAAZ,CAAmB,OAAnB,CAA2B,MAAjD;AACA,MAAM,SAAS,cAAc,MAA7B;AACA,MAAM,aAAa,WAAW,YAAX,IAA2B,WAAW,QAAzD;;AAEA,MAAI,QAAQ,YAAY,QAAZ,CAAqB,KAAjC;;AAEA,MAAM,QAAa,YAAY,WAAZ,CAAwB,KAA3C;AACA,MAAM,UAAa,YAAY,WAAZ,CAAwB,OAA3C;AACA,MAAM,WAAa,YAAY,WAAZ,CAAwB,QAA3C;AACA,MAAM,QAAa,YAAY,WAAZ,CAAwB,KAA3C;AACA,MAAM,WAAa,MAAM,MAAN,CAAa,YAAY,WAAZ,CAAwB,QAArC,EAA+C,QAA/C,CAAnB;AACA,MAAM,gBAAgB,KAAtB;;AAEA,MAAI,KAAK,OAAO,EAAhB;AACA,MAAI,KAAK,OAAO,EAAhB;;AAEA,MAAI,cAAc,mBAAd,IAAqC,cAAc,MAAvD,EAA+D;AAC7D;AACA,QAAM,mBAAmB,cAAc,mBAAd,GACrB,YAAY,sBADS,GAErB,CAFJ;;AAIA,YAAQ,YAAY,QAAZ,CAAqB,YAA7B;;AAEA,QAAK,cAAc,IAAd,IAAsB,cAAc,MAArC,IACI,cAAc,KAAd,IAAuB,cAAc,GAD7C,EACmD;AACjD,WAAK,CAAC,EAAD,GAAM,gBAAX;AACD,KAHD,MAIK,IAAI,cAAc,IAAd,IAAsB,cAAc,KAAxC,EAAgD;AAAE,WAAK,KAAK,gBAAV;AAA6B,KAA/E,MACA,IAAI,cAAc,GAAd,IAAsB,cAAc,MAAxC,EAAgD;AAAE,WAAK,KAAK,gBAAV;AAA6B;AACrF;;AAED;AACA,MAAI,MAAM,GAAV,EAAkB;AAAE,YAAQ,GAAR,IAAkB,EAAlB;AAAuB;AAC3C,MAAI,MAAM,MAAV,EAAkB;AAAE,YAAQ,MAAR,IAAkB,EAAlB;AAAuB;AAC3C,MAAI,MAAM,IAAV,EAAkB;AAAE,YAAQ,IAAR,IAAkB,EAAlB;AAAuB;AAC3C,MAAI,MAAM,KAAV,EAAkB;AAAE,YAAQ,KAAR,IAAkB,EAAlB;AAAuB;;AAE3C,MAAI,UAAJ,EAAgB;AACd;AACA,UAAM,MAAN,CAAa,QAAb,EAAuB,OAAvB;;AAEA,QAAI,WAAW,YAAf,EAA6B;AAC3B;AACA,UAAI,aAAJ;;AAEA,UAAI,SAAS,GAAT,GAAe,SAAS,MAA5B,EAAoC;AAClC,eAAO,SAAS,GAAhB;;AAEA,iBAAS,GAAT,GAAe,SAAS,MAAxB;AACA,iBAAS,MAAT,GAAkB,IAAlB;AACD;AACD,UAAI,SAAS,IAAT,GAAgB,SAAS,KAA7B,EAAoC;AAClC,eAAO,SAAS,IAAhB;;AAEA,iBAAS,IAAT,GAAgB,SAAS,KAAzB;AACA,iBAAS,KAAT,GAAiB,IAAjB;AACD;AACF;AACF,GArBD,MAsBK;AACH;AACA,aAAS,GAAT,GAAkB,KAAK,GAAL,CAAS,QAAQ,GAAjB,EAAsB,MAAM,MAA5B,CAAlB;AACA,aAAS,MAAT,GAAkB,KAAK,GAAL,CAAS,QAAQ,MAAjB,EAAyB,MAAM,GAA/B,CAAlB;AACA,aAAS,IAAT,GAAkB,KAAK,GAAL,CAAS,QAAQ,IAAjB,EAAuB,MAAM,KAA7B,CAAlB;AACA,aAAS,KAAT,GAAkB,KAAK,GAAL,CAAS,QAAQ,KAAjB,EAAwB,MAAM,IAA9B,CAAlB;AACD;;AAED,WAAS,KAAT,GAAkB,SAAS,KAAT,GAAkB,SAAS,IAA7C;AACA,WAAS,MAAT,GAAkB,SAAS,MAAT,GAAkB,SAAS,GAA7C;;AAEA,OAAK,IAAM,IAAX,IAAmB,QAAnB,EAA6B;AAC3B,UAAM,IAAN,IAAc,SAAS,IAAT,IAAiB,SAAS,IAAT,CAA/B;AACD;;AAED,SAAO,KAAP,GAAe,YAAY,QAAZ,CAAqB,KAApC;AACA,SAAO,IAAP,GAAc,QAAd;AACA,SAAO,SAAP,GAAmB,KAAnB;AACD,CAjFD;;AAmFA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4CA,aAAa,SAAb,CAAuB,SAAvB,GAAmC,UAAU,OAAV,EAAmB;AACpD,MAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,OAAhB,CAAJ,EAA8B;AAC5B,SAAK,OAAL,CAAa,MAAb,CAAoB,OAApB,GAA8B,QAAQ,OAAR,KAAoB,KAApB,GAA2B,KAA3B,GAAkC,IAAhE;AACA,SAAK,YAAL,CAAkB,QAAlB,EAA4B,OAA5B;AACA,SAAK,WAAL,CAAiB,QAAjB,EAA2B,OAA3B;;AAEA,QAAI,eAAe,IAAf,CAAoB,QAAQ,IAA5B,CAAJ,EAAuC;AACrC,WAAK,OAAL,CAAa,MAAb,CAAoB,IAApB,GAA2B,QAAQ,IAAnC;AACD,KAFD,MAGK,IAAI,QAAQ,IAAR,KAAiB,IAArB,EAA2B;AAC9B,WAAK,OAAL,CAAa,MAAb,CAAoB,IAApB,GAA2B,eAAe,MAAf,CAAsB,IAAjD;AACD;;AAED,QAAI,MAAM,EAAN,CAAS,IAAT,CAAc,QAAQ,mBAAtB,CAAJ,EAAgD;AAC9C,WAAK,OAAL,CAAa,MAAb,CAAoB,mBAApB,GAA0C,QAAQ,mBAAlD;AACD,KAFD,MAGK,IAAI,MAAM,EAAN,CAAS,IAAT,CAAc,QAAQ,MAAtB,CAAJ,EAAmC;AACtC,WAAK,OAAL,CAAa,MAAb,CAAoB,MAApB,GAA6B,QAAQ,MAArC;AACD;;AAED,WAAO,IAAP;AACD;AACD,MAAI,MAAM,EAAN,CAAS,IAAT,CAAc,OAAd,CAAJ,EAA4B;AAC1B,SAAK,OAAL,CAAa,MAAb,CAAoB,OAApB,GAA8B,OAA9B;;AAEA,QAAI,CAAC,OAAL,EAAc;AACZ,WAAK,aAAL,GAAqB,KAAK,aAAL,GAAqB,KAAK,WAAL,GAAmB,IAA7D;AACD;;AAED,WAAO,IAAP;AACD;AACD,SAAO,KAAK,OAAL,CAAa,MAApB;AACD,CAhCD;;AAkCA,SAAS,eAAT,CAA0B,IAA1B,EAAgC,KAAhC,EAAuC,IAAvC,EAA6C,OAA7C,EAAsD,mBAAtD,EAA2E,IAA3E,EAAiF,MAAjF,EAAyF;AACvF;AACA,MAAI,CAAC,KAAL,EAAY;AAAE,WAAO,KAAP;AAAe;;AAE7B;AACA,MAAI,UAAU,IAAd,EAAoB;AAClB;AACA,QAAM,QAAS,MAAM,EAAN,CAAS,MAAT,CAAgB,KAAK,KAArB,IAA8B,KAAK,KAAnC,GAA4C,KAAK,KAAL,GAAc,KAAK,IAA9E;AACA,QAAM,SAAS,MAAM,EAAN,CAAS,MAAT,CAAgB,KAAK,MAArB,IAA8B,KAAK,MAAnC,GAA4C,KAAK,MAAL,GAAc,KAAK,GAA9E;;AAEA,QAAI,QAAQ,CAAZ,EAAe;AACb,UAAS,SAAS,MAAlB,EAA2B;AAAE,eAAO,OAAP;AAAiB,OAA9C,MACK,IAAI,SAAS,OAAb,EAAsB;AAAE,eAAO,MAAP;AAAiB;AAC/C;AACD,QAAI,SAAS,CAAb,EAAgB;AACd,UAAS,SAAS,KAAlB,EAA4B;AAAE,eAAO,QAAP;AAAkB,OAAhD,MACK,IAAI,SAAS,QAAb,EAAuB;AAAE,eAAO,KAAP;AAAkB;AACjD;;AAED,QAAI,SAAS,MAAb,EAAuB;AAAE,aAAO,KAAK,CAAL,GAAU,CAAC,SAAU,CAAV,GAAa,KAAK,IAAlB,GAAwB,KAAK,KAA9B,IAAwC,MAAzD;AAAmE;AAC5F,QAAI,SAAS,KAAb,EAAuB;AAAE,aAAO,KAAK,CAAL,GAAU,CAAC,UAAU,CAAV,GAAa,KAAK,GAAlB,GAAwB,KAAK,MAA9B,IAAwC,MAAzD;AAAmE;;AAE5F,QAAI,SAAS,OAAb,EAAuB;AAAE,aAAO,KAAK,CAAL,GAAU,CAAC,SAAU,CAAV,GAAa,KAAK,KAAlB,GAA0B,KAAK,IAAhC,IAAwC,MAAzD;AAAmE;AAC5F,QAAI,SAAS,QAAb,EAAuB;AAAE,aAAO,KAAK,CAAL,GAAU,CAAC,UAAU,CAAV,GAAa,KAAK,MAAlB,GAA0B,KAAK,GAAhC,IAAwC,MAAzD;AAAmE;AAC7F;;AAED;AACA,MAAI,CAAC,MAAM,EAAN,CAAS,OAAT,CAAiB,OAAjB,CAAL,EAAgC;AAAE,WAAO,KAAP;AAAe;;AAEjD,SAAO,MAAM,EAAN,CAAS,OAAT,CAAiB,KAAjB;AACP;AADO,IAEH,UAAU;AACZ;AAHK,IAIH,MAAM,WAAN,CAAkB,OAAlB,EAA2B,KAA3B,EAAkC,mBAAlC,CAJJ;AAKD;;AAED,YAAY,OAAZ,CAAoB,EAApB,CAAuB,KAAvB,EAA8B,UAAU,WAAV,EAAuB;AACnD,cAAY,UAAZ,GAAyB,IAAzB;AACD,CAFD;;AAIA,cAAc,OAAd,CAAsB,EAAtB,CAAyB,WAAzB,EAAsC,iBAA2C;AAAA,MAA/B,WAA+B,SAA/B,WAA+B;AAAA,MAAlB,MAAkB,SAAlB,MAAkB;AAAA,MAAV,MAAU,SAAV,MAAU;;AAC/E,MAAI,WAAW,QAAX,IAAuB,CAAC,YAAY,UAAxC,EAAoD;AAAE;AAAS;;AAE/D,MAAM,UAAU,YAAY,MAAZ,CAAmB,OAAnC;;AAEA,MAAI,QAAQ,MAAR,CAAe,MAAnB,EAA2B;AACzB,QAAI,YAAY,UAAZ,KAA2B,GAA/B,EAAoC;AAClC,aAAO,EAAP,GAAY,OAAO,EAAnB;AACD,KAFD,MAGK;AACH,aAAO,EAAP,GAAY,OAAO,EAAnB;AACD;AACD,WAAO,IAAP,GAAc,IAAd;AACD,GARD,MASK;AACH,WAAO,IAAP,GAAc,YAAY,UAA1B;;AAEA,QAAI,YAAY,UAAZ,KAA2B,GAA/B,EAAoC;AAClC,aAAO,EAAP,GAAY,CAAZ;AACD,KAFD,MAGK,IAAI,YAAY,UAAZ,KAA2B,GAA/B,EAAoC;AACvC,aAAO,EAAP,GAAY,CAAZ;AACD;AACF;AACF,CAxBD;;AA0BA,QAAQ,MAAR,GAAiB,MAAjB;AACA,QAAQ,KAAR,CAAc,IAAd,CAAmB,QAAnB;AACA,MAAM,KAAN,CAAY,aAAa,UAAzB,EAAqC,CACnC,aADmC,EAEnC,YAFmC,EAGnC,oBAHmC,EAInC,qBAJmC,EAKnC,WALmC,CAArC;AAOA,QAAQ,UAAR,CAAmB,MAAnB,GAA4B,WAA5B;;AAEA,eAAe,MAAf,GAAwB,OAAO,QAA/B;;AAEA,OAAO,OAAP,GAAiB,MAAjB;;;;;AC3aA,IAAM,MAAiB,QAAQ,aAAR,CAAvB;AACA,IAAM,YAAiB,QAAQ,gBAAR,EAA0B,SAAjD;AACA,IAAM,KAAiB,QAAQ,YAAR,CAAvB;AACA,IAAM,WAAiB,QAAQ,kBAAR,CAAvB;AACA,IAAM,cAAiB,QAAQ,eAAR,CAAvB;AACA,IAAM,iBAAiB,QAAQ,kBAAR,CAAvB;;AAEA,IAAM,aAAa;AACjB,YAAU;AACR,aAAW,KADH;AAER,eAAW,IAFH,EAEa;AACrB,YAAW,EAHH;AAIR,WAAW,GAJH,CAIa;AAJb,GADO;;AAQjB,eAAa,IARI;AASjB,KAAG,IATc,EASL;AACZ,KAAG,CAVc,EAUX,GAAG,CAVQ,EAUL;;AAEZ,eAAa,KAZI;AAajB,YAAU,CAbO;;AAejB,SAAO,eAAU,WAAV,EAAuB;AAC5B,eAAW,WAAX,GAAyB,IAAzB;AACA,QAAI,MAAJ,CAAW,WAAW,CAAtB;;AAEA,eAAW,WAAX,GAAyB,WAAzB;AACA,eAAW,QAAX,GAAsB,IAAI,IAAJ,GAAW,OAAX,EAAtB;AACA,eAAW,CAAX,GAAe,IAAI,OAAJ,CAAY,WAAW,MAAvB,CAAf;AACD,GAtBgB;;AAwBjB,QAAM,gBAAY;AAChB,eAAW,WAAX,GAAyB,KAAzB;AACA,QAAI,MAAJ,CAAW,WAAW,CAAtB;AACD,GA3BgB;;AA6BjB;AACA,UAAQ,kBAAY;AAClB,QAAM,UAAU,WAAW,WAAX,CAAuB,MAAvB,CAA8B,OAA9B,CAAsC,WAAW,WAAX,CAAuB,QAAvB,CAAgC,IAAtE,EAA4E,UAA5F;AACA,QAAM,YAAY,QAAQ,SAAR,IAAqB,UAAU,WAAW,WAAX,CAAuB,OAAjC,CAAvC;AACA,QAAM,MAAM,IAAI,IAAJ,GAAW,OAAX,EAAZ;AACA;AACA,QAAM,KAAK,CAAC,MAAM,WAAW,QAAlB,IAA8B,IAAzC;AACA;AACA,QAAM,IAAI,QAAQ,KAAR,GAAgB,EAA1B;;AAEA,QAAI,KAAK,CAAT,EAAY;AACV,UAAI,GAAG,MAAH,CAAU,SAAV,CAAJ,EAA0B;AACxB,kBAAU,QAAV,CAAmB,WAAW,CAAX,GAAe,CAAlC,EAAqC,WAAW,CAAX,GAAe,CAApD;AACD,OAFD,MAGK,IAAI,SAAJ,EAAe;AAClB,kBAAU,UAAV,IAAwB,WAAW,CAAX,GAAe,CAAvC;AACA,kBAAU,SAAV,IAAwB,WAAW,CAAX,GAAe,CAAvC;AACD;;AAED,iBAAW,QAAX,GAAsB,GAAtB;AACD;;AAED,QAAI,WAAW,WAAf,EAA4B;AAC1B,UAAI,MAAJ,CAAW,WAAW,CAAtB;AACA,iBAAW,CAAX,GAAe,IAAI,OAAJ,CAAY,WAAW,MAAvB,CAAf;AACD;AACF,GAvDgB;AAwDjB,SAAO,eAAU,YAAV,EAAwB,UAAxB,EAAoC;AACzC,QAAM,UAAU,aAAa,OAA7B;;AAEA,WAAO,QAAQ,UAAR,EAAoB,UAApB,IAAkC,QAAQ,UAAR,EAAoB,UAApB,CAA+B,OAAxE;AACD,GA5DgB;AA6DjB,qBAAmB,iCAAoC;AAAA,QAAxB,WAAwB,QAAxB,WAAwB;AAAA,QAAX,OAAW,QAAX,OAAW;;AACrD,QAAI,EAAE,YAAY,WAAZ,MACG,WAAW,KAAX,CAAiB,YAAY,MAA7B,EAAqC,YAAY,QAAZ,CAAqB,IAA1D,CADL,CAAJ,EAC2E;AACzE;AACD;;AAED,QAAI,YAAY,UAAhB,EAA4B;AAC1B,iBAAW,CAAX,GAAe,WAAW,CAAX,GAAe,CAA9B;AACA;AACD;;AAED,QAAI,YAAJ;AACA,QAAI,cAAJ;AACA,QAAI,eAAJ;AACA,QAAI,aAAJ;;AAEA,QAAM,UAAU,YAAY,MAAZ,CAAmB,OAAnB,CAA2B,YAAY,QAAZ,CAAqB,IAAhD,EAAsD,UAAtE;AACA,QAAM,YAAY,QAAQ,SAAR,IAAqB,UAAU,YAAY,OAAtB,CAAvC;;AAEA,QAAI,GAAG,MAAH,CAAU,SAAV,CAAJ,EAA0B;AACxB,aAAS,QAAQ,OAAR,GAAkB,WAAW,MAAtC;AACA,YAAS,QAAQ,OAAR,GAAkB,WAAW,MAAtC;AACA,cAAS,QAAQ,OAAR,GAAkB,UAAU,UAAV,GAAwB,WAAW,MAA9D;AACA,eAAS,QAAQ,OAAR,GAAkB,UAAU,WAAV,GAAwB,WAAW,MAA9D;AACD,KALD,MAMK;AACH,UAAM,OAAO,SAAS,oBAAT,CAA8B,SAA9B,CAAb;;AAEA,aAAS,QAAQ,OAAR,GAAkB,KAAK,IAAL,GAAc,WAAW,MAApD;AACA,YAAS,QAAQ,OAAR,GAAkB,KAAK,GAAL,GAAc,WAAW,MAApD;AACA,cAAS,QAAQ,OAAR,GAAkB,KAAK,KAAL,GAAc,WAAW,MAApD;AACA,eAAS,QAAQ,OAAR,GAAkB,KAAK,MAAL,GAAc,WAAW,MAApD;AACD;;AAED,eAAW,CAAX,GAAgB,QAAQ,CAAR,GAAW,OAAM,CAAC,CAAP,GAAU,CAArC;AACA,eAAW,CAAX,GAAgB,SAAQ,CAAR,GAAY,MAAK,CAAC,CAAN,GAAS,CAArC;;AAEA,QAAI,CAAC,WAAW,WAAhB,EAA6B;AAC3B;AACA,iBAAW,MAAX,GAAoB,QAAQ,MAA5B;AACA,iBAAW,KAAX,GAAoB,QAAQ,KAA5B;;AAEA,iBAAW,KAAX,CAAiB,WAAjB;AACD;AACF;AAzGgB,CAAnB;;AA4GA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,aAAvB,EAAsC,YAAY;AAChD,aAAW,IAAX;AACD,CAFD;;AAIA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,aAAvB,EAAsC,WAAW,iBAAjD;;AAEA,eAAe,SAAf,CAAyB,UAAzB,GAAsC,WAAW,QAAjD;;AAEA,OAAO,OAAP,GAAiB,UAAjB;;;;;AC3HA,IAAM,eAAe,QAAQ,iBAAR,CAArB;AACA,IAAM,UAAe,QAAQ,iBAAR,CAArB;AACA,IAAM,KAAe,QAAQ,aAAR,CAArB;AACA,IAAM,WAAe,QAAQ,mBAAR,CAArB;;AAEA,aAAa,SAAb,CAAuB,SAAvB,GAAmC,UAAU,OAAV,EAAmB,KAAnB,EAA0B,WAA1B,EAAuC,OAAvC,EAAgD;AACjF,MAAM,SAAS,KAAK,oBAAL,CAA0B,OAA1B,EAAmC,KAAnC,EAA0C,WAA1C,EAAuD,OAAvD,CAAf;;AAEA,MAAI,KAAK,OAAL,CAAa,aAAjB,EAAgC;AAC9B,WAAO,KAAK,OAAL,CAAa,aAAb,CAA2B,OAA3B,EAAoC,KAApC,EAA2C,MAA3C,EAAmD,IAAnD,EAAyD,OAAzD,EAAkE,WAAlE,CAAP;AACD;;AAED,SAAO,MAAP;AACD,CARD;;AAUA;;;;;;;;;;;;;;;AAeA,aAAa,SAAb,CAAuB,UAAvB,GAAoC,UAAU,QAAV,EAAoB;AACtD,SAAO,KAAK,iBAAL,CAAuB,YAAvB,EAAqC,QAArC,CAAP;AACD,CAFD;;AAIA;;;;;;;;;;;;;;;AAeA,aAAa,SAAb,CAAuB,SAAvB,GAAmC,UAAU,QAAV,EAAoB;AACrD,SAAO,KAAK,iBAAL,CAAuB,WAAvB,EAAoC,QAApC,CAAP;AACD,CAFD;;AAIA,aAAa,SAAb,CAAuB,UAAvB,GAAoC,UAAU,UAAV,EAAsB,mBAAtB,EAA2C,OAA3C,EAAoD;AACtF,MAAI,CAAC,UAAD,IAAe,CAAC,GAAG,OAAH,CAAW,OAAX,CAApB,EAAyC;AAAE,WAAO,KAAP;AAAe;;AAE1D,MAAI,GAAG,MAAH,CAAU,UAAV,CAAJ,EAA2B;AACzB,WAAO,SAAS,WAAT,CAAqB,OAArB,EAA8B,UAA9B,EAA0C,mBAA1C,CAAP;AACD,GAFD,MAGK,IAAI,GAAG,OAAH,CAAW,UAAX,CAAJ,EAA4B;AAC/B,WAAO,SAAS,YAAT,CAAsB,UAAtB,EAAkC,OAAlC,CAAP;AACD;;AAED,SAAO,KAAP;AACD,CAXD;;AAaA,aAAa,SAAb,CAAuB,SAAvB,GAAmC,UAAU,SAAV,EAAqB,mBAArB,EAA0C,OAA1C,EAAmD;AACpF,MAAI,CAAC,SAAL,EAAgB;AAAE,WAAO,IAAP;AAAc;;AAEhC,MAAI,CAAC,GAAG,OAAH,CAAW,OAAX,CAAL,EAA0B;AAAE,WAAO,KAAP;AAAe;;AAE3C,MAAI,GAAG,MAAH,CAAU,SAAV,CAAJ,EAA0B;AACxB,WAAO,SAAS,WAAT,CAAqB,OAArB,EAA8B,SAA9B,EAAyC,mBAAzC,CAAP;AACD,GAFD,MAGK,IAAI,GAAG,OAAH,CAAW,SAAX,CAAJ,EAA2B;AAC9B,WAAO,SAAS,YAAT,CAAsB,SAAtB,EAAiC,OAAjC,CAAP;AACD;;AAED,SAAO,KAAP;AACD,CAbD;;AAeA,aAAa,SAAb,CAAuB,eAAvB,GAAyC,UAAU,OAAV,EAAmB,mBAAnB,EAAwC,WAAxC,EAAqD;AAC5F,SAAQ,CAAC,KAAK,UAAL,CAAgB,QAAQ,UAAxB,EAAoC,mBAApC,EAAyD,WAAzD,CAAD,IACH,KAAK,SAAL,CAAe,QAAQ,SAAvB,EAAkC,mBAAlC,EAAuD,WAAvD,CADL;AAED,CAHD;;AAKA;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4BA,aAAa,SAAb,CAAuB,aAAvB,GAAuC,UAAU,OAAV,EAAmB;AACxD,MAAI,GAAG,QAAH,CAAY,OAAZ,CAAJ,EAA0B;AACxB,SAAK,OAAL,CAAa,aAAb,GAA6B,OAA7B;;AAEA,WAAO,IAAP;AACD;;AAED,MAAI,YAAY,IAAhB,EAAsB;AACpB,WAAO,KAAK,OAAL,CAAa,aAApB;;AAEA,WAAO,IAAP;AACD;;AAED,SAAO,KAAK,OAAL,CAAa,aAApB;AACD,CAdD;;AAgBA;;;;;;;;;;AAUA,aAAa,SAAb,CAAuB,WAAvB,GAAqC,UAAU,QAAV,EAAoB;AACvD,MAAI,GAAG,IAAH,CAAQ,QAAR,CAAJ,EAAuB;AACrB,SAAK,OAAL,CAAa,WAAb,GAA2B,QAA3B;;AAEA,WAAO,IAAP;AACD;;AAED,MAAI,aAAa,IAAjB,EAAuB;AACrB,WAAO,KAAK,OAAL,CAAa,WAApB;;AAEA,WAAO,IAAP;AACD;;AAED,SAAO,KAAK,OAAL,CAAa,WAApB;AACD,CAdD;;AAgBA,aAAa,SAAb,CAAuB,oBAAvB,GAA8C,UAAU,OAAV,EAAmB,KAAnB,EAA0B,WAA1B,EAAuC,OAAvC,EAAgD;AAC5F,MAAM,OAAO,KAAK,OAAL,CAAa,OAAb,CAAb;AACA,MAAI,SAAS,IAAb;;AAEA,uBAAyB,QAAQ,KAAjC,kHAAwC;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,QAA7B,UAA6B;;AACtC;AACA,QAAI,YAAY,aAAZ,IACG,YAAY,KADf,IAEG,CAAC,MAAM,OAAN,GAAgB,KAAK,OAAL,CAAa,UAAb,EAAyB,YAA1C,MAA4D,CAFnE,EAEsE;AACpE;AACD;;AAED,aAAS,QAAQ,UAAR,EAAoB,OAApB,CAA4B,OAA5B,EAAqC,KAArC,EAA4C,IAA5C,EAAkD,OAAlD,EAA2D,WAA3D,EAAwE,IAAxE,CAAT;;AAEA,QAAI,MAAJ,EAAY;AACV,aAAO,MAAP;AACD;AACF;AACF,CAlBD;;;;;AC5JA,IAAM,WAAiB,QAAQ,aAAR,CAAvB;AACA,IAAM,eAAiB,QAAQ,iBAAR,CAAvB;AACA,IAAM,cAAiB,QAAQ,gBAAR,CAAvB;AACA,IAAM,UAAiB,QAAQ,iBAAR,CAAvB;AACA,IAAM,iBAAiB,QAAQ,mBAAR,CAAvB;AACA,IAAM,UAAiB,QAAQ,kBAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,UAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,UAAR,CAAvB;AACA,IAAM,UAAiB,QAAQ,kBAAR,EAA4B,GAA5B,EAAvB;;AAEA,QAAQ,uBAAR;;AAEA,IAAM,YAAY;AAChB,kBADgB;AAEhB,gDAFgB;AAGhB;AACA,mBAAiB,QAJD;AAKhB,YAAU;AACR,eAAW;AACT,mBAAa,KADJ;AAET,WAAK,QAFI;AAGT,qBAAe,CAHN;AAIT,iBAAY,IAJH;AAKT,kBAAY;AALH;AADH,GALM;AAchB,qBAAmB,2BAAU,MAAV,EAAkB;AACnC,UAAM,MAAN,CAAa,OAAO,QAApB,EAA8B,UAAU,QAAV,CAAmB,SAAjD;AACD;AAhBe,CAAlB;;AAmBA;AACA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,MAAvB,EAA+B,gBAAwD;AAAA,MAA5C,WAA4C,QAA5C,WAA4C;AAAA,MAA/B,OAA+B,QAA/B,OAA+B;AAAA,MAAtB,KAAsB,QAAtB,KAAsB;AAAA,MAAf,WAAe,QAAf,WAAe;;AACrF,MAAI,YAAY,WAAZ,EAAJ,EAA+B;AAAE;AAAS;;AAE1C,MAAM,aAAa,cAAc,WAAd,EAA2B,OAA3B,EAAoC,KAApC,EAA2C,WAA3C,CAAnB;AACA,UAAQ,WAAR,EAAqB,UAArB;AACD,CALD;;AAOA;AACA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,MAAvB,EAA+B,iBAAwD;AAAA,MAA5C,WAA4C,SAA5C,WAA4C;AAAA,MAA/B,OAA+B,SAA/B,OAA+B;AAAA,MAAtB,KAAsB,SAAtB,KAAsB;AAAA,MAAf,WAAe,SAAf,WAAe;;AACrF,MAAI,CAAC,YAAY,KAAb,IACG,YAAY,aADf,IAEG,YAAY,WAAZ,EAFP,EAEkC;AAAE;AAAS;;AAE7C,MAAM,aAAa,cAAc,WAAd,EAA2B,OAA3B,EAAoC,KAApC,EAA2C,WAA3C,CAAnB;AACA,UAAQ,WAAR,EAAqB,UAArB;AACD,CAPD;;AASA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,MAAvB,EAA+B,UAAU,GAAV,EAAe;AAAA,MACpC,WADoC,GACb,GADa,CACpC,WADoC;AAAA,MACvB,KADuB,GACb,GADa,CACvB,KADuB;;;AAG5C,MAAI,CAAC,YAAY,aAAb,IACG,YAAY,WAAZ,EADH,IAEG,CAAC,YAAY,eAFhB,IAGG,CAAC,YAAY,QAAZ,CAAqB,IAH7B,EAGmC;AACjC;AACD;;AAED,UAAQ,IAAR,CAAa,cAAb,EAA6B,GAA7B;;AAEA,MAAM,SAAS,YAAY,MAA3B;;AAEA,MAAI,YAAY,QAAZ,CAAqB,IAArB,IAA6B,MAAjC,EAAyC;AACvC;AACA,QAAI,OAAO,OAAP,CAAe,YAAY,QAAZ,CAAqB,IAApC,EAA0C,WAA1C,IACG,CAAC,uBAAuB,MAAvB,EAA+B,YAAY,OAA3C,EAAoD,YAAY,QAAhE,CADR,EACmF;AACjF,kBAAY,IAAZ,CAAiB,KAAjB;AACD,KAHD,MAIK;AACH,kBAAY,KAAZ,CAAkB,YAAY,QAA9B,EAAwC,MAAxC,EAAgD,YAAY,OAA5D;AACD;AACF;AACF,CAxBD;;AA0BA;AACA;AACA,SAAS,cAAT,CAAyB,MAAzB,EAAiC,YAAjC,EAA+C,OAA/C,EAAwD,WAAxD,EAAqE;AACnE,MAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,MAAhB,KACG,aAAa,eAAb,CAA6B,aAAa,OAAb,CAAqB,OAAO,IAA5B,CAA7B,EAAgE,OAAhE,EAAyE,WAAzE,CADH,IAEG,aAAa,OAAb,CAAqB,OAAO,IAA5B,EAAkC,OAFrC,IAGG,uBAAuB,YAAvB,EAAqC,OAArC,EAA8C,MAA9C,CAHP,EAG8D;AAC5D,WAAO,MAAP;AACD;;AAED,SAAO,IAAP;AACD;;AAED,SAAS,gBAAT,CAA2B,WAA3B,EAAwC,OAAxC,EAAiD,KAAjD,EAAwD,OAAxD,EAAiE,aAAjE,EAAgF,WAAhF,EAA6F;AAC3F,OAAK,IAAI,IAAI,CAAR,EAAW,MAAM,QAAQ,MAA9B,EAAsC,IAAI,GAA1C,EAA+C,GAA/C,EAAoD;AAClD,QAAM,QAAQ,QAAQ,CAAR,CAAd;AACA,QAAM,eAAe,cAAc,CAAd,CAArB;AACA,QAAM,SAAS,eAAe,MAAM,SAAN,CAAgB,OAAhB,EAAyB,KAAzB,EAAgC,WAAhC,EAA6C,YAA7C,CAAf,EACe,KADf,EAEe,YAFf,EAGe,WAHf,CAAf;;AAKA,QAAI,MAAJ,EAAY;AACV,aAAO;AACL,sBADK;AAEL,gBAAQ,KAFH;AAGL,iBAAS;AAHJ,OAAP;AAKD;AACF;;AAED,SAAO,EAAP;AACD;;AAED,SAAS,aAAT,CAAwB,WAAxB,EAAqC,OAArC,EAA8C,KAA9C,EAAqD,WAArD,EAAkE;AAChE,MAAI,UAAU,EAAd;AACA,MAAI,gBAAgB,EAApB;;AAEA,MAAI,UAAU,WAAd;AACA,MAAI,SAAS,IAAb;;AAEA,WAAS,WAAT,CAAsB,YAAtB,EAAoC,QAApC,EAA8C,OAA9C,EAAuD;AACrD,QAAM,WAAY,QAAQ,0BAAR,GACd,QAAQ,gBAAR,CAAyB,QAAzB,CADc,GAEd,SAFJ;;AAIA,QAAI,MAAM,eAAN,CAAsB,OAAtB,EAA+B,QAA/B,EAAyC,QAAzC,CAAJ,EAAwD;;AAEtD,cAAQ,IAAR,CAAa,YAAb;AACA,oBAAc,IAAd,CAAmB,OAAnB;AACD;AACF;;AAED,SAAO,MAAM,EAAN,CAAS,OAAT,CAAiB,OAAjB,CAAP,EAAkC;AAChC,cAAU,EAAV;AACA,oBAAgB,EAAhB;;AAEA,QAAM,sBAAsB,MAAM,aAAN,CAAoB,GAApB,CAAwB,OAAxB,CAA5B;;AAEA,QAAI,wBACI,SAAS,eAAe,oBAAoB,SAApB,CAA8B,OAA9B,EAAuC,KAAvC,EAA8C,WAA9C,EAA2D,OAA3D,EAAoE,WAApE,CAAf,EACe,mBADf,EAEe,OAFf,EAGe,WAHf,CADb,KAKG,CAAC,oBAAoB,OAApB,CAA4B,OAAO,IAAnC,EAAyC,WALjD,EAK8D;AAC5D,aAAO;AACL,wBADK;AAEL,sBAFK;AAGL,gBAAQ;AAHH,OAAP;AAKD,KAXD,MAYK;AACH,YAAM,aAAN,CAAoB,eAApB,CAAoC,WAApC,EAAiD,OAAjD;;AAEA,UAAM,aAAa,iBAAiB,WAAjB,EAA8B,OAA9B,EAAuC,KAAvC,EAA8C,OAA9C,EAAuD,aAAvD,EAAsE,WAAtE,CAAnB;;AAEA,UAAI,WAAW,MAAX,IACG,CAAC,WAAW,MAAX,CAAkB,OAAlB,CAA0B,WAAW,MAAX,CAAkB,IAA5C,EAAkD,WAD1D,EACuE;AACrE,eAAO,UAAP;AACD;AACF;;AAED,cAAU,MAAM,UAAN,CAAiB,OAAjB,CAAV;AACD;;AAED,SAAO,EAAP;AACD;;AAED,SAAS,OAAT,CAAkB,WAAlB,SAA4D;AAAA,MAA3B,MAA2B,SAA3B,MAA2B;AAAA,MAAnB,MAAmB,SAAnB,MAAmB;AAAA,MAAX,OAAW,SAAX,OAAW;;AAC1D,WAAS,UAAU,EAAnB;;AAEA,MAAI,YAAY,MAAZ,IAAsB,YAAY,MAAZ,CAAmB,OAAnB,CAA2B,WAArD,EAAkE;AAChE,gBAAY,MAAZ,CAAmB,IAAnB,CAAwB,eAAxB,CAAwC,KAAxC,CAA8C,MAA9C,GAAuD,EAAvD;AACD;;AAED,cAAY,MAAZ,GAAqB,MAArB;AACA,cAAY,OAAZ,GAAsB,OAAtB;AACA,QAAM,UAAN,CAAiB,YAAY,QAA7B,EAAuC,MAAvC;;AAEA,MAAI,UAAU,OAAO,OAAP,CAAe,WAA7B,EAA0C;AACxC,QAAM,SAAS,SAAQ,QAAQ,OAAO,IAAf,EAAqB,SAArB,CAA+B,MAA/B,CAAR,GAAiD,EAAhE;AACA,gBAAY,MAAZ,CAAmB,IAAnB,CAAwB,eAAxB,CAAwC,KAAxC,CAA8C,MAA9C,GAAuD,MAAvD;AACD;;AAED,UAAQ,IAAR,CAAa,UAAb,EAAyB,EAAE,aAAa,WAAf,EAAzB;AACD;;AAED,YAAY,OAAZ,CAAoB,EAApB,CAAuB,MAAvB,EAA+B,iBAA2B;AAAA,MAAf,WAAe,SAAf,WAAe;;AACxD,MAAM,SAAS,YAAY,MAA3B;;AAEA,MAAI,UAAU,OAAO,OAAP,CAAe,WAA7B,EAA0C;AACxC,WAAO,IAAP,CAAY,eAAZ,CAA4B,KAA5B,CAAkC,MAAlC,GAA2C,EAA3C;AACD;AACF,CAND;;AAQA,aAAa,SAAb,CAAuB,SAAvB,GAAmC,UAAU,OAAV,EAAmB,KAAnB,EAA0B,WAA1B,EAAuC,OAAvC,EAAgD;AACjF,MAAM,SAAS,KAAK,oBAAL,CAA0B,OAA1B,EAAmC,KAAnC,EAA0C,WAA1C,EAAuD,OAAvD,CAAf;;AAEA,MAAI,KAAK,OAAL,CAAa,aAAjB,EAAgC;AAC9B,WAAO,KAAK,OAAL,CAAa,aAAb,CAA2B,OAA3B,EAAoC,KAApC,EAA2C,MAA3C,EAAmD,IAAnD,EAAyD,OAAzD,EAAkE,WAAlE,CAAP;AACD;;AAED,SAAO,MAAP;AACD,CARD;;AAUA;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4BA,aAAa,SAAb,CAAuB,aAAvB,GAAuC,UAAU,OAAV,EAAmB;AACxD,MAAI,MAAM,EAAN,CAAS,QAAT,CAAkB,OAAlB,CAAJ,EAAgC;AAC9B,SAAK,OAAL,CAAa,aAAb,GAA6B,OAA7B;;AAEA,WAAO,IAAP;AACD;;AAED,MAAI,YAAY,IAAhB,EAAsB;AACpB,WAAO,KAAK,OAAL,CAAa,aAApB;;AAEA,WAAO,IAAP;AACD;;AAED,SAAO,KAAK,OAAL,CAAa,aAApB;AACD,CAdD;;AAgBA;;;;;;;;;;AAUA,aAAa,SAAb,CAAuB,WAAvB,GAAqC,UAAU,QAAV,EAAoB;AACvD,MAAI,MAAM,EAAN,CAAS,IAAT,CAAc,QAAd,CAAJ,EAA6B;AAC3B,SAAK,OAAL,CAAa,WAAb,GAA2B,QAA3B;;AAEA,WAAO,IAAP;AACD;;AAED,MAAI,aAAa,IAAjB,EAAuB;AACrB,WAAO,KAAK,OAAL,CAAa,WAApB;;AAEA,WAAO,IAAP;AACD;;AAED,SAAO,KAAK,OAAL,CAAa,WAApB;AACD,CAdD;;AAgBA,aAAa,SAAb,CAAuB,oBAAvB,GAA8C,UAAU,OAAV,EAAmB,KAAnB,EAA0B,WAA1B,EAAuC,OAAvC,EAAgD;AAC5F,MAAM,OAAO,KAAK,OAAL,CAAa,OAAb,CAAb;AACA,MAAM,UAAU,MAAM,OAAN,IAAkB;AAChC,OAAG,CAD6B;AAEhC,OAAG,CAF6B;AAGhC,OAAG,CAH6B;AAIhC,OAAG;AAJ6B,GAAD,CAK9B,MAAM,MALwB,CAAjC;AAMA,MAAI,SAAS,IAAb;;AAEA,uBAAyB,QAAQ,KAAjC,kHAAwC;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,QAA7B,UAA6B;;AACtC;AACA,QAAI,YAAY,aAAZ,IACG,YAAY,KADf,IAEG,CAAC,UAAU,KAAK,OAAL,CAAa,UAAb,EAAyB,YAApC,MAAsD,CAF7D,EAEgE;AAC9D;AACD;;AAED,aAAS,QAAQ,UAAR,EAAoB,OAApB,CAA4B,OAA5B,EAAqC,KAArC,EAA4C,IAA5C,EAAkD,OAAlD,EAA2D,WAA3D,EAAwE,IAAxE,CAAT;;AAEA,QAAI,MAAJ,EAAY;AACV,aAAO,MAAP;AACD;AACF;AACF,CAxBD;;AA0BA,SAAS,sBAAT,CAAiC,YAAjC,EAA+C,OAA/C,EAAwD,MAAxD,EAAgE;AAC9D,MAAM,UAAU,aAAa,OAA7B;AACA,MAAM,aAAa,QAAQ,OAAO,IAAf,EAAqB,GAAxC;AACA,MAAM,gBAAgB,QAAQ,OAAO,IAAf,EAAqB,aAA3C;AACA,MAAI,qBAAqB,CAAzB;AACA,MAAI,cAAc,CAAlB;AACA,MAAI,qBAAqB,CAAzB;;AAEA;AACA,MAAI,EAAE,cAAc,aAAd,IAA+B,UAAU,eAA3C,CAAJ,EAAiE;AAAE;AAAS;;AAE5E,OAAK,IAAI,IAAI,CAAR,EAAW,MAAM,MAAM,YAAN,CAAmB,MAAzC,EAAiD,IAAI,GAArD,EAA0D,GAA1D,EAA+D;AAC7D,QAAM,cAAc,MAAM,YAAN,CAAmB,CAAnB,CAApB;AACA,QAAM,cAAc,YAAY,QAAZ,CAAqB,IAAzC;;AAEA,QAAI,CAAC,YAAY,WAAZ,EAAL,EAAgC;AAAE;AAAW;;AAE7C;;AAEA,QAAI,sBAAsB,UAAU,eAApC,EAAqD;AACnD,aAAO,KAAP;AACD;;AAED,QAAI,YAAY,MAAZ,KAAuB,YAA3B,EAAyC;AAAE;AAAW;;AAEtD,mBAAgB,gBAAgB,OAAO,IAAxB,GAA8B,CAA7C;;AAEA,QAAI,eAAe,UAAnB,EAA+B;AAC7B,aAAO,KAAP;AACD;;AAED,QAAI,YAAY,OAAZ,KAAwB,OAA5B,EAAqC;AACnC;;AAEA,UAAI,gBAAgB,OAAO,IAAvB,IAA+B,sBAAsB,aAAzD,EAAwE;AACtE,eAAO,KAAP;AACD;AACF;AACF;;AAED,SAAO,UAAU,eAAV,GAA4B,CAAnC;AACD;;AAED;;;;;;;;;;;;AAYA,SAAS,eAAT,GAA2B,UAAU,QAAV,EAAoB;AAC7C,MAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,QAAhB,CAAJ,EAA+B;AAC7B,cAAU,eAAV,GAA4B,QAA5B;;AAEA,WAAO,IAAP;AACD;;AAED,SAAO,UAAU,eAAjB;AACD,CARD;;AAUA,aAAa,eAAb,CAA6B,IAA7B,CAAkC,aAAlC;AACA,aAAa,eAAb,CAA6B,IAA7B,CAAkC,eAAlC;AACA,aAAa,eAAb,CAA6B,IAA7B,CAAkC,YAAlC;AACA,aAAa,eAAb,CAA6B,IAA7B,CAAkC,WAAlC;;AAEA,eAAe,IAAf,CAAoB,aAApB,GAAoC,IAApC;AACA,eAAe,IAAf,CAAoB,WAApB,GAAkC,IAAlC;;AAEA,MAAM,MAAN,CAAa,eAAe,SAA5B,EAAuC,UAAU,QAAV,CAAmB,SAA1D;;AAEA,OAAO,OAAP,GAAiB,SAAjB;;;;;ACnXA,IAAM,YAAc,QAAQ,QAAR,CAApB;AACA,IAAM,cAAc,QAAQ,gBAAR,CAApB;;AAEA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,KAAvB,EAA8B,UAAU,WAAV,EAAuB;AACnD,cAAY,UAAZ,GAAyB,IAAzB;AACD,CAFD;;AAIA,UAAU,OAAV,CAAkB,EAAlB,CAAqB,UAArB,EAAiC,gBAA2B;AAAA,MAAf,WAAe,QAAf,WAAe;;AAC1D,MAAM,aAAa,YAAY,QAAZ,CAAqB,IAAxC;;AAEA,MAAI,CAAC,UAAL,EAAiB;AAAE;AAAS;;AAE5B,MAAM,QAAQ,YAAY,MAAZ,CAAmB,OAAnB,CAA2B,UAA3B,EAAuC,KAArD;;AAEA,MAAI,QAAQ,CAAZ,EAAe;AACb,gBAAY,UAAZ,GAAyB,WAAW,YAAM;AACxC,kBAAY,KAAZ,CAAkB,YAAY,QAA9B,EAAwC,YAAY,MAApD,EAA4D,YAAY,OAAxE;AACD,KAFwB,EAEtB,KAFsB,CAAzB;AAGD;AACF,CAZD;;AAcA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,MAAvB,EAA+B,iBAAsC;AAAA,MAA1B,WAA0B,SAA1B,WAA0B;AAAA,MAAb,SAAa,SAAb,SAAa;;AACnE,MAAI,YAAY,eAAZ,IAA+B,CAAC,SAApC,EAA+C;AAC7C,iBAAa,YAAY,UAAzB;AACD;AACF,CAJD;;AAMA;AACA,UAAU,OAAV,CAAkB,EAAlB,CAAqB,cAArB,EAAqC,iBAA2B;AAAA,MAAf,WAAe,SAAf,WAAe;;AAC9D,MAAM,aAAa,YAAY,QAAZ,CAAqB,IAAxC;;AAEA,MAAI,CAAC,UAAL,EAAiB;AAAE;AAAS;;AAE5B,MAAM,QAAQ,YAAY,MAAZ,CAAmB,OAAnB,CAA2B,UAA3B,EAAuC,KAArD;;AAEA,MAAI,QAAQ,CAAZ,EAAe;AACb,gBAAY,QAAZ,CAAqB,IAArB,GAA4B,IAA5B;AACD;AACF,CAVD;;;;;AC5BA,IAAM,YAAY,QAAQ,QAAR,CAAlB;AACA,IAAM,QAAY,QAAQ,UAAR,CAAlB;AACA,IAAM,UAAY,QAAQ,kBAAR,CAAlB;AACA,IAAM,KAAY,QAAQ,aAAR,CAAlB;;eAEwC,QAAQ,mBAAR,C;IAAhC,e,YAAA,e;IAAiB,U,YAAA,U;;AAEzB,UAAU,iBAAV,CAA4B,QAAQ,iBAAR,CAA5B;;AAEA,UAAU,OAAV,CAAkB,EAAlB,CAAqB,cAArB,EAAsC,gBAAgD;AAAA,MAApC,WAAoC,QAApC,WAAoC;AAAA,MAAvB,WAAuB,QAAvB,WAAuB;AAAA,MAAV,EAAU,QAAV,EAAU;AAAA,MAAN,EAAM,QAAN,EAAM;;AACpF,MAAI,YAAY,QAAZ,CAAqB,IAArB,KAA8B,MAAlC,EAA0C;AAAE;AAAS;;AAErD;AACA,MAAM,OAAO,KAAK,GAAL,CAAS,EAAT,CAAb;AACA,MAAM,OAAO,KAAK,GAAL,CAAS,EAAT,CAAb;AACA,MAAM,UAAU,YAAY,MAAZ,CAAmB,OAAnB,CAA2B,IAA3C;AACA,MAAM,YAAY,QAAQ,SAA1B;AACA,MAAM,cAAe,OAAO,IAAP,GAAc,GAAd,GAAoB,OAAO,IAAP,GAAc,GAAd,GAAoB,IAA7D;;AAEA,cAAY,QAAZ,CAAqB,IAArB,GAA4B,QAAQ,QAAR,KAAqB,OAArB,GACxB,YAAY,CAAZ,CADwB,CACT;AADS,IAExB,QAAQ,QAFZ;;AAIA;AACA,MAAI,gBAAgB,IAAhB,IAAwB,cAAc,IAAtC,IAA8C,cAAc,WAAhE,EAA6E;AAC3E;AACA,gBAAY,QAAZ,CAAqB,IAArB,GAA4B,IAA5B;;AAEA;;AAEA,QAAI,CAAC,YAAY,QAAZ,CAAqB,IAA1B,EAAgC;;AAE9B,UAAI,UAAU,WAAd;;AAEA,UAAM,eAAe,SAAf,YAAe,CAAU,YAAV,EAAwB,QAAxB,EAAkC,OAAlC,EAA2C;AAC9D,YAAM,WAAW,QAAQ,0BAAR,GACX,QAAQ,gBAAR,CAAyB,QAAzB,CADW,GAEX,SAFN;;AAIA,YAAI,iBAAiB,YAAY,MAAjC,EAAyC;AAAE;AAAS;;AAEpD,YAAI,CAAC,QAAQ,WAAT,IACG,CAAC,aAAa,eAAb,CAA6B,OAA7B,EAAsC,OAAtC,EAA+C,WAA/C,CADJ,IAEG,gBAAgB,OAAhB,EAAyB,QAAzB,EAAmC,QAAnC,CAFP,EAEqD;;AAEnD,cAAM,UAAS,aAAa,SAAb,CAAuB,YAAY,WAAnC,EACuB,YAAY,SADnC,EAEuB,WAFvB,EAGuB,OAHvB,CAAf;;AAKA,cAAI,WACG,QAAO,IAAP,KAAgB,MADnB,IAEG,eAAe,WAAf,EAA4B,YAA5B,CAFH,IAGG,UAAU,cAAV,CAAyB,OAAzB,EAAiC,YAAjC,EAA+C,OAA/C,EAAwD,WAAxD,CAHP,EAG6E;;AAE3E,mBAAO,YAAP;AACD;AACF;AACF,OAxBD;;AA0BA,UAAI,SAAS,IAAb;;AAEA;AACA,aAAO,GAAG,OAAH,CAAW,OAAX,CAAP,EAA4B;AAC1B,YAAM,sBAAsB,MAAM,aAAN,CAAoB,GAApB,CAAwB,OAAxB,CAA5B;;AAEA,YAAI,uBACG,wBAAwB,YAAY,MADvC,IAEG,CAAC,oBAAoB,OAApB,CAA4B,IAA5B,CAAiC,WAFzC,EAEsD;;AAEpD,mBAAS,oBAAoB,SAApB,CAA8B,YAAY,WAA1C,EAAuD,YAAY,SAAnE,EAA8E,WAA9E,EAA2F,OAA3F,CAAT;AACD;AACD,YAAI,UACG,OAAO,IAAP,KAAgB,MADnB,IAEG,eAAe,WAAf,EAA4B,mBAA5B,CAFP,EAEyD;;AAEvD,sBAAY,QAAZ,CAAqB,IAArB,GAA4B,MAA5B;AACA,sBAAY,MAAZ,GAAqB,mBAArB;AACA,sBAAY,OAAZ,GAAsB,OAAtB;AACA;AACD;;AAED,YAAM,uBAAuB,MAAM,aAAN,CAAoB,eAApB,CAAoC,YAApC,EAAkD,OAAlD,CAA7B;;AAEA,YAAI,oBAAJ,EAA0B;AACxB,sBAAY,QAAZ,CAAqB,IAArB,GAA4B,MAA5B;AACA,sBAAY,MAAZ,GAAqB,oBAArB;AACA,sBAAY,OAAZ,GAAsB,OAAtB;AACA;AACD;;AAED,kBAAU,WAAW,OAAX,CAAV;AACD;AACF;AACF;AACF,CAtFD;;AAwFA,SAAS,cAAT,CAAyB,SAAzB,EAAoC,YAApC,EAAkD;AAChD,MAAI,CAAC,YAAL,EAAmB;AAAE,WAAO,KAAP;AAAe;;AAEpC,MAAM,WAAW,aAAa,OAAb,CAAqB,IAArB,CAA0B,SAA3C;;AAEA,SAAQ,cAAc,IAAd,IAAsB,aAAa,IAAnC,IAA2C,aAAa,SAAhE;AACD;;;;;ACvGD,QAAQ,QAAR,EAAkB,iBAAlB,CAAoC,QAAQ,oBAAR,CAApC;;;;;ACAA,QAAQ,QAAR,EAAkB,iBAAlB,CAAoC,QAAQ,mBAAR,CAApC;;;;;ACAA,OAAO,OAAP,GAAiB;AACf,QAAM;AACJ,YAAgB,IADZ;AAEJ,oBAAgB,MAFZ;AAGJ,iBAAgB;AAHZ,GADS;;AAOf,aAAW;AACT,YAAQ,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EADC;;AAGT;AACA;AACA,kBAAc,CALL;;AAOT,aAAS;AACP,eAAmB,KADZ;AAEP,kBAAmB,EAFZ,EAEmB;AAC1B,gBAAmB,GAHZ,EAGmB;AAC1B,gBAAmB,EAJZ,EAImB;AAC1B,mBAAmB,IALZ,EAKmB;AAC1B,yBAAmB,GANZ,CAMmB;AANnB;AAPA;AAPI,CAAjB;;;;;ACAA;;AAEA;AACA,QAAQ,kBAAR;;AAEA;AACA,QAAQ,WAAR;;AAEA;AACA,QAAQ,kBAAR;AACA,QAAQ,sBAAR;;AAEA;AACA,QAAQ,sBAAR;AACA,QAAQ,4BAAR;AACA,QAAQ,qCAAR;;AAEA;AACA,QAAQ,mBAAR;;AAEA;AACA,QAAQ,mBAAR;AACA,QAAQ,kBAAR;AACA,QAAQ,gBAAR;AACA,QAAQ,gBAAR;;AAEA;AACA,QAAQ,sBAAR;AACA,QAAQ,2BAAR;AACA,QAAQ,0BAAR;;AAEA;AACA,QAAQ,qBAAR;AACA,QAAQ,oBAAR;AACA,QAAQ,kBAAR;;AAEA;AACA,QAAQ,iCAAR;;AAEA;AACA,QAAQ,cAAR;;AAEA;AACA,OAAO,OAAP,GAAiB,QAAQ,YAAR,CAAjB;;;;;AC3CA,IAAM,gBAAiB,QAAQ,iBAAR,CAAvB;AACA,IAAM,cAAiB,QAAQ,eAAR,CAAvB;AACA,IAAM,YAAiB,QAAQ,aAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,SAAR,CAAvB;AACA,IAAM,iBAAiB,QAAQ,aAAR,CAAvB;;AAEA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,KAAvB,EAA8B,UAAU,WAAV,EAAuB;AACnD,cAAY,aAAZ,GAA4B;AAC1B,YAAa,KADa;AAE1B,eAAa,KAFa;AAG1B,iBAAa,KAHa;;AAK1B,gBAAY,IALc;AAM1B,cAAY,EANc;;AAQ1B,QAAI,CARsB,EAQnB,IAAI,CARe;AAS1B,QAAI,CATsB,EASnB,IAAI,CATe;;AAW1B,QAAI,CAXsB;AAY1B,SAAK,CAZqB,EAYlB,KAAK,CAZa;AAa1B,cAAU,CAbgB;;AAe1B,eAAW,CAfe;AAgB1B,eAAW,CAhBe;AAiB1B,OAAK;AAjBqB,GAA5B;;AAoBA,cAAY,iBAAZ,GAAkC;AAAA,WAAM,aAAe,KAAf,CAAqB,WAArB,CAAN;AAAA,GAAlC;AACA,cAAY,mBAAZ,GAAkC;AAAA,WAAM,eAAe,KAAf,CAAqB,WAArB,CAAN;AAAA,GAAlC;AACD,CAvBD;;AAyBA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,MAAvB,EAA+B,gBAAwD;AAAA,MAA5C,WAA4C,QAA5C,WAA4C;AAAA,MAA/B,KAA+B,QAA/B,KAA+B;AAAA,MAAxB,OAAwB,QAAxB,OAAwB;AAAA,MAAf,WAAe,QAAf,WAAe;;AACrF,MAAM,SAAS,YAAY,aAA3B;;AAEA;AACA,MAAI,OAAO,MAAX,EAAmB;AACjB,QAAI,UAAU,WAAd;;AAEA;AACA,WAAO,MAAM,EAAN,CAAS,OAAT,CAAiB,OAAjB,CAAP,EAAkC;;AAEhC;AACA,UAAI,YAAY,YAAY,OAA5B,EAAqC;AACnC;AACA,uBAAe,MAAf,CAAsB,OAAO,CAA7B;AACA,eAAO,MAAP,GAAgB,KAAhB;AACA,oBAAY,UAAZ,GAAyB,IAAzB;;AAEA;AACA,oBAAY,aAAZ,CAA0B,OAA1B;AACA,cAAM,SAAN,CAAgB,YAAY,SAA5B,EAAuC,YAAY,QAAnD;;AAEA;AACA,YAAM,YAAY,EAAE,wBAAF,EAAlB;AACA,oBAAY,OAAZ,CAAoB,IAApB,CAAyB,oBAAzB,EAA+C,SAA/C;AACA,oBAAY,OAAZ,CAAoB,IAApB,CAAyB,eAAzB,EAA+C,SAA/C;;AAEA;AACA,YAAM,cAAc,IAAI,aAAJ,CAAkB,WAAlB,EACkB,KADlB,EAEkB,YAAY,QAAZ,CAAqB,IAFvC,EAGkB,eAHlB,EAIkB,YAAY,OAJ9B,CAApB;;AAMA,oBAAY,MAAZ,CAAmB,IAAnB,CAAwB,WAAxB;AACA,oBAAY,SAAZ,GAAwB,WAAxB;AACA,kBAAU,aAAV,CAAwB,YAAY,gBAApC;;AAEA,cAAM,UAAN,CAAiB,YAAY,UAA7B,EAAyC,YAAY,SAArD;AACA;AACD;;AAED,gBAAU,MAAM,UAAN,CAAiB,OAAjB,CAAV;AACD;AACF;AACF,CA5CD;;AA8CA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,IAAvB,EAA6B,iBAAkC;AAAA,MAAtB,WAAsB,SAAtB,WAAsB;AAAA,MAAT,KAAS,SAAT,KAAS;;AAC7D,MAAM,SAAS,YAAY,aAA3B;;AAEA,MAAI,CAAC,YAAY,WAAZ,EAAD,IAA8B,OAAO,MAAzC,EAAiD;AAAE;AAAS;;AAE5D,MAAM,SAAS,YAAY,MAA3B;AACA,MAAM,UAAU,UAAU,OAAO,OAAjC;AACA,MAAM,iBAAiB,WAAW,YAAY,QAAZ,CAAqB,IAAhC,IAAwC,QAAQ,YAAY,QAAZ,CAAqB,IAA7B,EAAmC,OAAlG;;AAEA,MAAM,MAAM,IAAI,IAAJ,GAAW,OAAX,EAAZ;AACA,MAAM,WAAW,EAAjB;AACA,MAAM,OAAO,MAAM,MAAN,CAAa,EAAb,EAAiB,YAAY,SAAZ,CAAsB,IAAvC,CAAb;AACA,MAAM,eAAe,YAAY,YAAZ,CAAyB,MAAzB,CAAgC,KAArD;;AAEA,MAAI,YAAY,KAAhB;AACA,MAAI,uBAAJ;;AAEA;AACA,MAAM,kBAAmB,kBAAkB,eAAe,OAAjC,IACH,YAAY,QAAZ,CAAqB,IAArB,KAA8B,SAD3B,IAEH,UAAU,OAAO,UAFvC;;AAIA,MAAM,UAAW,mBACX,MAAM,YAAY,SAAZ,CAAsB,SAA7B,GAA0C,EAD9B,IAEZ,eAAe,eAAe,QAFlB,IAGZ,eAAe,eAAe,QAHnC;;AAKA,MAAM,cAAc;AAClB,4BADkB;AAElB,gBAAY,IAFM;AAGlB,sBAHkB;AAIlB,YAAQ,IAJU;AAKlB,oBAAgB;AALE,GAApB;;AAQA;AACA,MAAI,mBAAmB,CAAC,OAAxB,EAAiC;AAC/B,cAAU,aAAV,CAAwB,QAAxB;;AAEA,qBAAiB,UAAU,MAAV,CAAiB,WAAjB,CAAjB;;AAEA,QAAI,eAAe,UAAf,IAA6B,eAAe,MAAhD,EAAwD;AACtD,kBAAY,IAAZ;AACD;AACF;;AAED,MAAI,EAAE,WAAW,SAAb,CAAJ,EAA6B;AAAE;AAAS;;AAExC,QAAM,UAAN,CAAiB,OAAO,QAAxB,EAAkC,YAAY,SAA9C;;AAEA,cAAY,QAAZ,CAAqB,CAArB,IAA0B,OAAO,UAAP,GACxB,IAAI,aAAJ,CAAkB,WAAlB,EAA+B,KAA/B,EAAsC,YAAY,QAAZ,CAAqB,IAA3D,EAAiE,cAAjE,EAAiF,YAAY,OAA7F,CADF;;AAGA,SAAO,EAAP,GAAY,GAAZ;;AAEA,SAAO,MAAP,GAAgB,IAAhB;AACA,SAAO,WAAP,GAAqB,eAAe,WAApC;AACA,cAAY,UAAZ,GAAyB,MAAzB;;AAEA,SAAO,IAAP,CAAY,OAAO,UAAnB;;AAEA,MAAI,OAAJ,EAAa;AACX,WAAO,GAAP,GAAa,YAAY,YAAZ,CAAyB,MAAzB,CAAgC,EAA7C;AACA,WAAO,GAAP,GAAa,YAAY,YAAZ,CAAyB,MAAzB,CAAgC,EAA7C;AACA,WAAO,EAAP,GAAY,YAAZ;;AAEA,gBAAY,WAAZ,EAAyB,MAAzB;;AAEA,UAAM,MAAN,CAAa,IAAb,EAAmB,YAAY,SAAZ,CAAsB,IAAzC;;AAEA,SAAK,CAAL,IAAU,OAAO,EAAjB;AACA,SAAK,CAAL,IAAU,OAAO,EAAjB;;AAEA,cAAU,aAAV,CAAwB,QAAxB;;AAEA,qBAAiB,UAAU,MAAV,CAAiB,WAAjB,CAAjB;;AAEA,WAAO,UAAP,IAAqB,eAAe,EAApC;AACA,WAAO,UAAP,IAAqB,eAAe,EAApC;;AAEA,WAAO,CAAP,GAAW,eAAe,OAAf,CAAuB,YAAY,iBAAnC,CAAX;AACD,GApBD,MAqBK;AACH,WAAO,SAAP,GAAmB,IAAnB;AACA,WAAO,EAAP,GAAY,eAAe,EAA3B;AACA,WAAO,EAAP,GAAY,eAAe,EAA3B;;AAEA,WAAO,EAAP,GAAY,OAAO,EAAP,GAAY,CAAxB;;AAEA,WAAO,CAAP,GAAW,eAAe,OAAf,CAAuB,YAAY,mBAAnC,CAAX;AACD;AACF,CA3FD;;AA6FA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,aAAvB,EAAsC,iBAA2B;AAAA,MAAf,WAAe,SAAf,WAAe;;AAC/D,MAAM,SAAS,YAAY,aAA3B;;AAEA,MAAI,OAAO,MAAX,EAAmB;AACjB,mBAAe,MAAf,CAAsB,OAAO,CAA7B;AACA,WAAO,MAAP,GAAgB,KAAhB;AACA,gBAAY,UAAZ,GAAyB,IAAzB;AACD;AACF,CARD;;AAUA,SAAS,WAAT,CAAsB,WAAtB,EAAmC,MAAnC,EAA2C;AACzC,MAAM,iBAAiB,YAAY,MAAZ,CAAmB,OAAnB,CAA2B,YAAY,QAAZ,CAAqB,IAAhD,EAAsD,OAA7E;AACA,MAAM,SAAS,eAAe,UAA9B;AACA,MAAM,aAAa,CAAC,KAAK,GAAL,CAAS,eAAe,QAAf,GAA0B,OAAO,EAA1C,CAAD,GAAiD,MAApE;;AAEA,SAAO,EAAP,GAAY,YAAY,SAAZ,CAAsB,KAAlC;AACA,SAAO,EAAP,GAAY,YAAY,SAAZ,CAAsB,KAAlC;AACA,SAAO,EAAP,GAAY,OAAO,UAAP,CAAkB,SAAlB,GAA8B,IAA1C;AACA,SAAO,EAAP,GAAY,OAAO,EAAP,GAAY,CAAxB;;AAEA,SAAO,UAAP,GAAoB,OAAO,EAAP,GAAY,CAAC,OAAO,GAAP,GAAa,UAAd,IAA4B,MAA5D;AACA,SAAO,UAAP,GAAoB,OAAO,EAAP,GAAY,CAAC,OAAO,GAAP,GAAa,UAAd,IAA4B,MAA5D;AACA,SAAO,EAAP,GAAY,UAAZ;;AAEA,SAAO,SAAP,GAAmB,SAAS,OAAO,EAAnC;AACA,SAAO,SAAP,GAAmB,IAAI,eAAe,QAAf,GAA0B,OAAO,EAAxD;AACD;;AAED,SAAS,YAAT,GAAyB;AACvB,sBAAoB,IAApB;AACA,QAAM,cAAN,CAAqB,KAAK,YAA1B,EAAwC,KAAK,UAA7C,EAAyD,KAAK,SAA9D;;AAEA,MAAM,SAAS,KAAK,aAApB;AACA,MAAM,UAAU,KAAK,MAAL,CAAY,OAAZ,CAAoB,KAAK,QAAL,CAAc,IAAlC,EAAwC,OAAxD;AACA,MAAM,SAAS,QAAQ,UAAvB;AACA,MAAM,IAAI,IAAI,IAAJ,GAAW,OAAX,KAAuB,IAAvB,GAA8B,OAAO,EAA/C;;AAEA,MAAI,IAAI,OAAO,EAAf,EAAmB;;AAEjB,QAAM,WAAY,IAAI,CAAC,KAAK,GAAL,CAAS,CAAC,MAAD,GAAU,CAAnB,IAAwB,OAAO,SAAhC,IAA6C,OAAO,SAA1E;;AAEA,QAAI,OAAO,UAAP,KAAsB,OAAO,EAA7B,IAAmC,OAAO,UAAP,KAAsB,OAAO,EAApE,EAAwE;AACtE,aAAO,EAAP,GAAY,OAAO,EAAP,GAAY,QAAxB;AACA,aAAO,EAAP,GAAY,OAAO,EAAP,GAAY,QAAxB;AACD,KAHD,MAIK;AACH,UAAM,YAAY,MAAM,sBAAN,CAA6B,CAA7B,EAAgC,CAAhC,EAC6B,OAAO,EADpC,EAE6B,OAAO,EAFpC,EAG6B,OAAO,UAHpC,EAI6B,OAAO,UAJpC,EAK6B,QAL7B,CAAlB;;AAOA,aAAO,EAAP,GAAY,UAAU,CAAtB;AACA,aAAO,EAAP,GAAY,UAAU,CAAtB;AACD;;AAED,SAAK,MAAL;;AAEA,WAAO,CAAP,GAAW,eAAe,OAAf,CAAuB,KAAK,iBAA5B,CAAX;AACD,GAvBD,MAwBK;AACH,WAAO,EAAP,GAAY,OAAO,UAAnB;AACA,WAAO,EAAP,GAAY,OAAO,UAAnB;;AAEA,SAAK,MAAL;AACA,SAAK,GAAL,CAAS,OAAO,UAAhB;AACA,WAAO,MAAP,GAAgB,KAAhB;AACA,SAAK,UAAL,GAAkB,IAAlB;AACD;;AAED,QAAM,UAAN,CAAiB,KAAK,UAAtB,EAAkC,KAAK,SAAvC;AACD;;AAED,SAAS,cAAT,GAA2B;AACzB,sBAAoB,IAApB;;AAEA,MAAM,SAAS,KAAK,aAApB;AACA,MAAM,IAAI,IAAI,IAAJ,GAAW,OAAX,KAAuB,OAAO,EAAxC;AACA,MAAM,WAAW,KAAK,MAAL,CAAY,OAAZ,CAAoB,KAAK,QAAL,CAAc,IAAlC,EAAwC,OAAxC,CAAgD,iBAAjE;;AAEA,MAAI,IAAI,QAAR,EAAkB;AAChB,WAAO,EAAP,GAAY,MAAM,WAAN,CAAkB,CAAlB,EAAqB,CAArB,EAAwB,OAAO,EAA/B,EAAmC,QAAnC,CAAZ;AACA,WAAO,EAAP,GAAY,MAAM,WAAN,CAAkB,CAAlB,EAAqB,CAArB,EAAwB,OAAO,EAA/B,EAAmC,QAAnC,CAAZ;;AAEA,SAAK,WAAL,CAAiB,OAAO,UAAxB,EAAoC,OAAO,UAA3C;;AAEA,WAAO,CAAP,GAAW,eAAe,OAAf,CAAuB,KAAK,mBAA5B,CAAX;AACD,GAPD,MAQK;AACH,WAAO,EAAP,GAAY,OAAO,EAAnB;AACA,WAAO,EAAP,GAAY,OAAO,EAAnB;;AAEA,SAAK,WAAL,CAAiB,OAAO,UAAxB,EAAoC,OAAO,UAA3C;AACA,SAAK,GAAL,CAAS,OAAO,UAAhB;;AAEA,WAAO,SAAP,GACE,OAAO,MAAP,GAAgB,KADlB;AAEA,SAAK,UAAL,GAAkB,IAAlB;AACD;AACF;;AAED,SAAS,mBAAT,CAA8B,WAA9B,EAA2C;AACzC,MAAM,SAAS,YAAY,aAA3B;;AAEA;AACA,MAAI,CAAC,OAAO,MAAZ,EAAoB;AAAE;AAAS;;AAE/B,MAAM,SAAW,OAAO,QAAP,CAAgB,IAAjC;AACA,MAAM,WAAW,OAAO,QAAP,CAAgB,MAAjC;;AAEA,QAAM,SAAN,CAAgB,YAAY,SAA5B,EAAuC,CAAE;AACvC,WAAS,OAAO,CAAP,GAAa,OAAO,EADU;AAEvC,WAAS,OAAO,CAAP,GAAa,OAAO,EAFU;AAGvC,aAAS,SAAS,CAAT,GAAa,OAAO,EAHU;AAIvC,aAAS,SAAS,CAAT,GAAa,OAAO;AAJU,GAAF,CAAvC;AAMD;;;;;AC/RD,IAAM,UAAe,QAAQ,iBAAR,CAArB;AACA,IAAM,SAAe,QAAQ,gBAAR,CAArB;AACA,IAAM,QAAe,QAAQ,SAAR,CAArB;AACA,IAAM,QAAe,QAAQ,SAAR,CAArB;AACA,IAAM,eAAe,QAAQ,gBAAR,CAArB;AACA,IAAM,cAAe,QAAQ,eAAR,CAArB;;AAEA,IAAM,eAAe,EAArB;;AAEA;;;;;;;;;;;;;;;;;;;;;;;;AAwBA,SAAS,QAAT,CAAmB,OAAnB,EAA4B,OAA5B,EAAqC;AACnC,MAAI,eAAe,MAAM,aAAN,CAAoB,GAApB,CAAwB,OAAxB,EAAiC,OAAjC,CAAnB;;AAEA,MAAI,CAAC,YAAL,EAAmB;AACjB,mBAAe,IAAI,YAAJ,CAAiB,OAAjB,EAA0B,OAA1B,CAAf;AACA,iBAAa,MAAb,CAAoB,MAApB,GAA6B,YAA7B;AACD;;AAED,SAAO,YAAP;AACD;;AAED;;;;;;;;AAQA,SAAS,KAAT,GAAiB,UAAU,OAAV,EAAmB,OAAnB,EAA4B;AAC3C,SAAO,MAAM,aAAN,CAAoB,cAApB,CAAmC,OAAnC,EAA4C,WAAW,QAAQ,OAA/D,MAA4E,CAAC,CAApF;AACD,CAFD;;AAIA;;;;;;;;;;;;AAYA,SAAS,EAAT,GAAc,UAAU,IAAV,EAAgB,QAAhB,EAA0B,OAA1B,EAAmC;AAC/C,MAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,IAAhB,KAAyB,KAAK,MAAL,CAAY,GAAZ,MAAqB,CAAC,CAAnD,EAAsD;AACpD,WAAO,KAAK,IAAL,GAAY,KAAZ,CAAkB,IAAlB,CAAP;AACD;;AAED,MAAI,MAAM,EAAN,CAAS,KAAT,CAAe,IAAf,CAAJ,EAA0B;AACxB,yBAAwB,IAAxB,kHAA8B;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAAnB,SAAmB;;AAC5B,eAAS,EAAT,CAAY,SAAZ,EAAuB,QAAvB,EAAiC,OAAjC;AACD;;AAED,WAAO,QAAP;AACD;;AAED,MAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,IAAhB,CAAJ,EAA2B;AACzB,SAAK,IAAM,IAAX,IAAmB,IAAnB,EAAyB;AACvB,eAAS,EAAT,CAAY,IAAZ,EAAkB,KAAK,IAAL,CAAlB,EAA8B,QAA9B;AACD;;AAED,WAAO,QAAP;AACD;;AAED;AACA,MAAI,MAAM,QAAN,CAAe,aAAa,UAA5B,EAAwC,IAAxC,CAAJ,EAAmD;AACjD;AACA,QAAI,CAAC,aAAa,IAAb,CAAL,EAAyB;AACvB,mBAAa,IAAb,IAAqB,CAAC,QAAD,CAArB;AACD,KAFD,MAGK;AACH,mBAAa,IAAb,EAAmB,IAAnB,CAAwB,QAAxB;AACD;AACF;AACD;AATA,OAUK;AACH,aAAO,GAAP,CAAW,MAAM,QAAjB,EAA2B,IAA3B,EAAiC,QAAjC,EAA2C,EAAE,gBAAF,EAA3C;AACD;;AAED,SAAO,QAAP;AACD,CArCD;;AAuCA;;;;;;;;;;;AAWA,SAAS,GAAT,GAAe,UAAU,IAAV,EAAgB,QAAhB,EAA0B,OAA1B,EAAmC;AAChD,MAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,IAAhB,KAAyB,KAAK,MAAL,CAAY,GAAZ,MAAqB,CAAC,CAAnD,EAAsD;AACpD,WAAO,KAAK,IAAL,GAAY,KAAZ,CAAkB,IAAlB,CAAP;AACD;;AAED,MAAI,MAAM,EAAN,CAAS,KAAT,CAAe,IAAf,CAAJ,EAA0B;AACxB,0BAAwB,IAAxB,yHAA8B;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAAnB,SAAmB;;AAC5B,eAAS,GAAT,CAAa,SAAb,EAAwB,QAAxB,EAAkC,OAAlC;AACD;;AAED,WAAO,QAAP;AACD;;AAED,MAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,IAAhB,CAAJ,EAA2B;AACzB,SAAK,IAAM,IAAX,IAAmB,IAAnB,EAAyB;AACvB,eAAS,GAAT,CAAa,IAAb,EAAmB,KAAK,IAAL,CAAnB,EAA+B,QAA/B;AACD;;AAED,WAAO,QAAP;AACD;;AAED,MAAI,CAAC,MAAM,QAAN,CAAe,aAAa,UAA5B,EAAwC,IAAxC,CAAL,EAAoD;AAClD,WAAO,MAAP,CAAc,MAAM,QAApB,EAA8B,IAA9B,EAAoC,QAApC,EAA8C,OAA9C;AACD,GAFD,MAGK;AACH,QAAI,cAAJ;;AAEA,QAAI,QAAQ,YAAR,IACG,CAAC,QAAQ,MAAM,OAAN,CAAc,aAAa,IAAb,CAAd,EAAkC,QAAlC,CAAT,MAA0D,CAAC,CADlE,EACqE;AACnE,mBAAa,IAAb,EAAmB,MAAnB,CAA0B,KAA1B,EAAiC,CAAjC;AACD;AACF;;AAED,SAAO,QAAP;AACD,CAlCD;;AAoCA;;;;;;;AAOA,SAAS,KAAT,GAAiB,YAAY;AAC3B,SAAO,KAAP;AACD,CAFD;;AAIA;AACA,SAAS,iBAAT,GAA8B,MAAM,cAApC;AACA,SAAS,YAAT,GAA8B,MAAM,SAApC;AACA,SAAS,gBAAT,GAA8B,MAAM,aAApC;AACA,SAAS,aAAT,GAA8B,MAAM,UAApC;;AAEA,SAAS,cAAT,GAAgC,MAAM,cAAtC;AACA,SAAS,oBAAT,GAAgC,MAAM,oBAAtC;AACA,SAAS,eAAT,GAAgC,MAAM,eAAtC;AACA,SAAS,OAAT,GAAgC,MAAM,OAAtC;;AAEA;;;;;;AAMA,SAAS,aAAT,GAAyB,YAAY;AACnC,SAAO,QAAQ,aAAf;AACD,CAFD;;AAIA;;;;;;AAMA,SAAS,oBAAT,GAAgC,YAAY;AAC1C,SAAO,QAAQ,oBAAf;AACD,CAFD;;AAIA;;;;;;;;;AASA,SAAS,IAAT,GAAgB,UAAU,KAAV,EAAiB;AAC/B,OAAK,IAAI,IAAI,MAAM,YAAN,CAAmB,MAAnB,GAA4B,CAAzC,EAA4C,KAAK,CAAjD,EAAoD,GAApD,EAAyD;AACvD,UAAM,YAAN,CAAmB,CAAnB,EAAsB,IAAtB,CAA2B,KAA3B;AACD;;AAED,SAAO,QAAP;AACD,CAND;;AAQA;;;;;;;;;AASA,SAAS,oBAAT,GAAgC,UAAU,QAAV,EAAoB;AAClD,MAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,QAAhB,CAAJ,EAA+B;AAC7B,gBAAY,oBAAZ,GAAmC,QAAnC;;AAEA,WAAO,IAAP;AACD;;AAED,SAAO,YAAY,oBAAnB;AACD,CARD;;AAUA,SAAS,WAAT,GAA0B,MAAM,WAAhC;AACA,SAAS,cAAT,GAA0B,MAAM,cAAhC;;AAEA,MAAM,QAAN,GAAiB,QAAjB;;AAEA,OAAO,OAAP,GAAiB,QAAjB;;;;;AC7OA,IAAM,eAAe,QAAQ,gBAAR,CAArB;AACA,IAAM,cAAe,QAAQ,eAAR,CAArB;AACA,IAAM,QAAe,QAAQ,SAAR,CAArB;AACA,IAAM,KAAe,QAAQ,YAAR,CAArB;AACA,IAAM,SAAe,QAAQ,gBAAR,CAArB;;eAE0C,QAAQ,kBAAR,C;IAAlC,Y,YAAA,Y;IAAc,e,YAAA,e;;AAEtB;;;;;;;;;;;;;;;AAaA,aAAa,SAAb,CAAuB,cAAvB,GAAwC,UAAU,QAAV,EAAoB;AAC1D,MAAI,wBAAwB,IAAxB,CAA6B,QAA7B,CAAJ,EAA4C;AAC1C,SAAK,OAAL,CAAa,cAAb,GAA8B,QAA9B;AACA,WAAO,IAAP;AACD;;AAED,MAAI,GAAG,IAAH,CAAQ,QAAR,CAAJ,EAAuB;AACrB,SAAK,OAAL,CAAa,cAAb,GAA8B,WAAU,QAAV,GAAqB,OAAnD;AACA,WAAO,IAAP;AACD;;AAED,SAAO,KAAK,OAAL,CAAa,cAApB;AACD,CAZD;;AAcA,aAAa,SAAb,CAAuB,sBAAvB,GAAgD,UAAU,KAAV,EAAiB;AAC/D,MAAM,UAAU,KAAK,OAAL,CAAa,cAA7B;;AAEA,MAAI,YAAY,OAAhB,EAAyB;AAAE;AAAS;;AAEpC,MAAI,YAAY,QAAhB,EAA0B;AACxB,UAAM,cAAN;AACA;AACD;;AAED;;AAEA;AACA;AACA,MAAI,OAAO,eAAX,EAA4B;AAC1B;AACD;;AAED;AACA,MAAI,uCAAuC,IAAvC,CAA4C,MAAM,IAAlD,CAAJ,EAA6D;AAC3D;AACD;;AAED;AACA,MAAI,GAAG,OAAH,CAAW,MAAM,MAAjB,KACG,gBAAgB,MAAM,MAAtB,EAA8B,uEAA9B,CADP,EAC+G;AAC7G;AACD;;AAED,QAAM,cAAN;AACD,CA9BD;;AAgCA,SAAS,kBAAT,OAAqD;AAAA,MAAtB,WAAsB,QAAtB,WAAsB;AAAA,MAAT,KAAS,QAAT,KAAS;;AACnD,MAAI,YAAY,MAAhB,EAAwB;AACtB,gBAAY,MAAZ,CAAmB,sBAAnB,CAA0C,KAA1C;AACD;AACF;;WAEyB,CAAC,MAAD,EAAS,MAAT,EAAiB,IAAjB,EAAuB,QAAvB,C;AAA1B,yCAA4D;AAAvD,MAAM,sBAAN;AACH,cAAY,OAAZ,CAAoB,EAApB,CAAuB,WAAvB,EAAoC,kBAApC;AACD;;AAED;AACA,YAAY,SAAZ,CAAsB,SAAtB,GAAkC,SAAS,iBAAT,CAA4B,KAA5B,EAAmC;AACnE,uBAA0B,MAAM,YAAhC,mHAA8C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,QAAnC,WAAmC;;;AAE5C,QAAI,YAAY,OAAZ,KACI,YAAY,OAAZ,KAAwB,MAAM,MAA9B,IACG,aAAa,YAAY,OAAzB,EAAkC,MAAM,MAAxC,CAFP,CAAJ,EAE6D;;AAE3D,kBAAY,MAAZ,CAAmB,sBAAnB,CAA0C,KAA1C;AACA;AACD;AACF;AACF,CAXD;;;;;AC9EA,IAAM,QAAgB,QAAQ,SAAR,CAAtB;AACA,IAAM,SAAgB,QAAQ,gBAAR,CAAtB;AACA,IAAM,UAAgB,QAAQ,iBAAR,CAAtB;AACA,IAAM,UAAgB,QAAQ,2BAAR,CAAtB;AACA,IAAM,gBAAgB,QAAQ,sBAAR,CAAtB;;eAEmB,QAAQ,gBAAR,C;IAAX,M,YAAA,M;;AAER,IAAM,WAAW,OAAO,SAAP,CAAiB,QAAlC;;AAEA,IAAI,CAAC,OAAO,KAAP,CAAa,OAAlB,EAA2B;AACzB,SAAO,KAAP,CAAa,OAAb,GAAuB,UAAU,GAAV,EAAe;AACpC,WAAO,SAAS,IAAT,CAAc,GAAd,MAAuB,gBAA9B;AACD,GAFD;AAGD;;AAED,IAAI,CAAC,OAAO,SAAP,CAAiB,IAAtB,EAA4B;AAC1B,SAAO,SAAP,CAAiB,IAAjB,GAAwB,YAAY;AAClC,WAAO,KAAK,OAAL,CAAa,oCAAb,EAAmD,EAAnD,CAAP;AACD,GAFD;AAGD;;AAED;AACA;AACA;AACA;AACA;AACA,SAAS,aAAT,CAAwB,KAAxB,EAA+B;AAC7B,MAAM,cAAc,MAAM,MAA1B;AACA,MAAM,cAAc,QAAQ,MAAR,CAAe,KAAf,EAAsB,MAAM,IAA5B,EAAkC,WAAlC,CAApB;;AAEA,MAAI,CAAC,WAAL,EAAkB;AAAE;AAAS;;AAE7B,MAAI,YAAY,OAAZ,IACG,MAAM,OAAN,KAAkB,YAAY,OAAZ,CAAoB,OADzC,IAEG,MAAM,OAAN,KAAkB,YAAY,OAAZ,CAAoB,OAFzC,IAGG,gBAAkB,YAAY,OAAZ,CAAoB,MAH7C,EAGqD;;AAEnD,gBAAY,WAAZ,CAAwB,CAAxB,IAA6B,WAA7B;AACA,gBAAY,SAAZ,CAAwB,CAAxB,IAA6B,IAAI,IAAJ,GAAW,OAAX,EAA7B;;AAEA,kBAAc,IAAd,CAAmB;AACjB,8BADiB;AAEjB,kBAFiB;AAGjB,8BAHiB;AAIjB,eAAS,KAJQ;AAKjB,YAAM;AALW,KAAnB;AAOD;AACF;;AAED,IAAI,QAAQ,KAAZ,EAAmB;AACjB,MAAM,YAAY,SAAZ,SAAY,CAAU,KAAV,EAAiB;AACjC,yBAA0B,MAAM,YAAhC,kHAA8C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAAnC,WAAmC;;AAC5C,UAAI,YAAY,WAAZ,EAAJ,EAA+B;AAC7B,oBAAY,MAAZ,CAAmB,sBAAnB,CAA0C,KAA1C;AACD;AACF;AACF,GAND;;AAQA,MAAM,WAAW,SAAS,QAAT,QAAiC,UAAjC,EAA6C;AAAA,QAAxB,GAAwB,SAAxB,GAAwB;AAAA,QAAnB,GAAmB,SAAnB,GAAmB;;AAC5D,QAAM,cAAc,WAAW,OAAX,CAAmB,QAAnB,MAAiC,CAAjC,GAChB,OAAO,GADS,GACH,OAAO,MADxB;;AAGA;AACA,gBAAY,GAAZ,EAAiB,aAAjB,EAAgC,SAAhC;;AAEA,QAAI,aAAJ,EAAmB;AACjB,kBAAY,GAAZ,EAAiB,UAAjB,EAA6B,aAA7B;AACD;AACF,GAVD;;AAYA,QAAM,OAAN,CAAc,EAAd,CAAiB,cAAjB,EAAoC,QAApC;AACA,QAAM,OAAN,CAAc,EAAd,CAAiB,iBAAjB,EAAoC,QAApC;AACD;;AAED,OAAO,OAAP,GAAiB,IAAjB;;;;;AC5EA,IAAM,gBAAgB,QAAQ,kBAAR,CAAtB;AACA,IAAM,cAAgB,QAAQ,gBAAR,CAAtB;AACA,IAAM,SAAgB,QAAQ,iBAAR,CAAtB;;AAEA,IAAM,YAAY;AAChB,SAAO,EADS;;AAGhB,cAAY,oBAAU,GAAV,EAAe;AAAA,QACjB,WADiB,GACiB,GADjB,CACjB,WADiB;AAAA,QACQ,IADR,GACiB,GADjB,CACJ,UADI;AAAA,QAEjB,MAFiB,GAEgB,WAFhB,CAEjB,MAFiB;AAAA,QAET,OAFS,GAEgB,WAFhB,CAET,OAFS;AAAA,QAEA,WAFA,GAEgB,WAFhB,CAEA,WAFA;;AAGzB,QAAM,OAAO,OAAO,OAAP,CAAe,OAAf,CAAb;;AAEA,QAAI,IAAJ,EAAU;AACR,kBAAY,IAAZ,GAAmB,KAAK,CAAL,GAAS,KAAK,IAAjC;AACA,kBAAY,GAAZ,GAAmB,KAAK,CAAL,GAAS,KAAK,GAAjC;;AAEA,kBAAY,KAAZ,GAAqB,KAAK,KAAL,GAAc,KAAK,CAAxC;AACA,kBAAY,MAAZ,GAAqB,KAAK,MAAL,GAAc,KAAK,CAAxC;;AAEA,UAAI,EAAE,WAAY,IAAd,CAAJ,EAAyB;AAAE,aAAK,KAAL,GAAc,KAAK,KAAL,GAAc,KAAK,IAAjC;AAAwC;AACnE,UAAI,EAAE,YAAY,IAAd,CAAJ,EAAyB;AAAE,aAAK,MAAL,GAAc,KAAK,MAAL,GAAc,KAAK,GAAjC;AAAwC;AACpE,KATD,MAUK;AACH,kBAAY,IAAZ,GAAmB,YAAY,GAAZ,GAAkB,YAAY,KAAZ,GAAoB,YAAY,MAAZ,GAAqB,CAA9E;AACD;;AAED,QAAI,IAAJ,GAAW,IAAX;AACA,QAAI,YAAJ,GAAmB,MAAnB;AACA,QAAI,OAAJ,GAAc,OAAd;;AAEA,SAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,UAAU,KAAV,CAAgB,MAApC,EAA4C,GAA5C,EAAiD;AAC/C,UAAM,eAAe,UAAU,KAAV,CAAgB,CAAhB,CAArB;;AAEA,UAAI,OAAJ,GAAc,OAAO,OAAP,CAAe,YAAY,QAAZ,CAAqB,IAApC,EAA0C,YAA1C,CAAd;;AAEA,UAAI,CAAC,IAAI,OAAT,EAAkB;AAChB;AACD;;AAED,kBAAY,eAAZ,CAA4B,YAA5B,IAA4C,UAAU,YAAV,EAAwB,SAAxB,CAAkC,GAAlC,CAA5C;AACD;AACF,GArCe;;AAuChB,UAAQ,gBAAU,GAAV,EAAe;AAAA,QACb,WADa,GACqC,GADrC,CACb,WADa;AAAA,QACA,QADA,GACqC,GADrC,CACA,QADA;AAAA,QACU,MADV,GACqC,GADrC,CACU,MADV;AAAA,QACkB,cADlB,GACqC,GADrC,CACkB,cADlB;;AAErB,QAAM,SAAS,OAAO,EAAP,EAAW,IAAI,UAAf,CAAf;AACA,QAAM,SAAS;AACb,UAAI,CADS;AAEb,UAAI,CAFS;AAGb,eAAS,KAHI;AAIb,cAAQ,KAJK;AAKb,kBAAY;AALC,KAAf;;AAQA,yBAA2B,UAAU,KAArC,kHAA4C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAAjC,YAAiC;;AAC1C,UAAM,WAAW,UAAU,YAAV,CAAjB;AACA,UAAM,UAAU,YAAY,MAAZ,CAAmB,OAAnB,CAA2B,YAAY,QAAZ,CAAqB,IAAhD,EAAsD,YAAtD,CAAhB;;AAEA,UAAI,CAAC,SAAS,OAAT,EAAkB,MAAlB,EAA0B,cAA1B,CAAL,EAAgD;AAAE;AAAW;;AAE7D,UAAI,MAAJ,GAAa,IAAI,MAAJ,GAAa,SAAS,YAAT,CAA1B;AACA,UAAI,OAAJ,GAAc,OAAd;AACA,UAAI,MAAJ,GAAa,IAAI,WAAJ,CAAgB,eAAhB,CAAgC,YAAhC,CAAb;;AAEA,eAAS,GAAT,CAAa,GAAb;;AAEA,UAAI,IAAI,MAAJ,CAAW,MAAf,EAAuB;AACrB,eAAO,CAAP,IAAY,IAAI,MAAJ,CAAW,EAAvB;AACA,eAAO,CAAP,IAAY,IAAI,MAAJ,CAAW,EAAvB;;AAEA,eAAO,EAAP,IAAa,IAAI,MAAJ,CAAW,EAAxB;AACA,eAAO,EAAP,IAAa,IAAI,MAAJ,CAAW,EAAxB;;AAEA,eAAO,MAAP,GAAgB,IAAhB;AACD;AACF;;AAED;AACA;AACA;AACA;AACA,WAAO,UAAP,GAAoB,CAAC,IAAI,MAAL,IAAe,CAAC,OAAO,MAAvB,IAAiC,IAAI,MAAJ,CAAW,OAAhE;;AAEA,WAAO,MAAP;AACD,GAhFe;;AAkFhB,iBAAe,uBAAU,QAAV,EAAoB;AACjC,0BAA2B,UAAU,KAArC,yHAA4C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAAjC,YAAiC;;AAC1C,UAAM,SAAS,SAAS,YAAT,KAA0B,EAAzC;;AAEA,aAAO,EAAP,GAAY,OAAO,EAAP,GAAY,CAAxB;AACA,aAAO,SAAP,GAAmB,OAAO,SAAP,GAAmB,GAAtC;AACA,aAAO,MAAP,GAAgB,KAAhB;AACA,aAAO,OAAP,GAAiB,IAAjB;;AAEA,eAAS,YAAT,IAAyB,MAAzB;AACD;;AAED,WAAO,QAAP;AACD,GA/Fe;;AAiGhB,SAAO,sBAA2B,UAA3B,EAAuC;AAAA,QAA3B,WAA2B,SAA3B,WAA2B;;AAC5C,QAAM,MAAM;AACV,8BADU;AAEV,kBAAY,CAAC,eAAe,eAAf,GACA,YAAY,SADZ,GACwB,YAAY,WADrC,EACkD,IAHpD;AAIV,mBAAa,YAAY,WAJf;AAKV,gBAAU,YAAY,gBALZ;AAMV,cAAQ,KANE;AAOV,sBAAgB;AAPN,KAAZ;;AAUA,cAAU,UAAV,CAAqB,GAArB;AACA,cAAU,aAAV,CAAwB,IAAI,QAA5B;;AAEA,QAAI,UAAJ,GAAiB,OAAO,EAAP,EAAW,YAAY,WAAZ,CAAwB,IAAnC,CAAjB;AACA,gBAAY,cAAZ,GAA6B,UAAU,MAAV,CAAiB,GAAjB,CAA7B;AACD;AAjHe,CAAlB;;AAoHA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,KAAvB,EAA8B,UAAU,WAAV,EAAuB;AACnD,cAAY,WAAZ,GAA+B,EAAE,MAAM,CAAR,EAAW,OAAO,CAAlB,EAAqB,KAAK,CAA1B,EAA6B,QAAQ,CAArC,EAA/B;AACA,cAAY,eAAZ,GAA+B,EAA/B;AACA,cAAY,gBAAZ,GAA+B,UAAU,aAAV,CAAwB,EAAxB,CAA/B;AACA,cAAY,cAAZ,GAA+B,IAA/B;AACD,CALD;;AAOA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,cAAvB,EAAwC,UAAU,KAAlD;AACA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,eAAvB,EAAwC,UAAU,KAAlD;;AAEA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,oBAAvB,EAA6C,iBAA0D;AAAA,MAA9C,WAA8C,SAA9C,WAA8C;AAAA,MAAjC,MAAiC,SAAjC,MAAiC;AAAA,MAAzB,qBAAyB,SAAzB,qBAAyB;;AACrG,MAAM,iBAAiB,UAAU,MAAV,CAAiB;AACtC,4BADsC;AAEtC,kBAFsC;AAGtC,gBAAY,YAAY,SAAZ,CAAsB,IAHI;AAItC,cAAU,YAAY,gBAJgB;AAKtC,oBAAgB;AALsB,GAAjB,CAAvB;;AAQA;AACA;AACA,MAAI,CAAC,eAAe,UAAhB,IAA8B,qBAAlC,EAAyD;AACvD,gBAAY,aAAZ,GAA4B,IAA5B;AACD;;AAED,cAAY,cAAZ,GAA6B,cAA7B;AACD,CAhBD;;AAkBA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,YAAvB,EAAqC,iBAAkC;AAAA,MAAtB,WAAsB,SAAtB,WAAsB;AAAA,MAAT,KAAS,SAAT,KAAS;;AACrE,OAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,UAAU,KAAV,CAAgB,MAApC,EAA4C,GAA5C,EAAiD;AAC/C,QAAM,UAAU,YAAY,MAAZ,CAAmB,OAAnB,CAA2B,YAAY,QAAZ,CAAqB,IAAhD,EAAsD,UAAU,KAAV,CAAgB,CAAhB,CAAtD,CAAhB;;AAEA;AACA,QAAI,SAAS,OAAT,EAAkB,IAAlB,EAAwB,IAAxB,CAAJ,EAAmC;AACjC;AACA,kBAAY,MAAZ,CAAmB,EAAE,YAAF,EAAS,QAAQ,IAAjB,EAAnB;AACA;AACD;AACF;AACF,CAXD;;AAaA,cAAc,OAAd,CAAsB,EAAtB,CAAyB,QAAzB,EAAmC,UAAU,GAAV,EAAe;AAAA,MACxC,MADwC,GAChB,GADgB,CACxC,MADwC;AAAA,MAChC,WADgC,GAChB,GADgB,CAChC,WADgC;;AAEhD,MAAM,cAAc,OAAO,EAAP,EAAW,GAAX,CAApB;;AAEA,OAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,UAAU,KAAV,CAAgB,MAApC,EAA4C,GAA5C,EAAiD;AAC/C,QAAM,eAAe,UAAU,KAAV,CAAgB,CAAhB,CAArB;AACA,gBAAY,OAAZ,GAAsB,YAAY,MAAZ,CAAmB,OAAnB,CAA2B,YAAY,QAAZ,CAAqB,IAAhD,EAAsD,YAAtD,CAAtB;;AAEA,QAAI,CAAC,YAAY,OAAjB,EAA0B;AACxB;AACD;;AAED,QAAM,WAAW,UAAU,YAAV,CAAjB;;AAEA,gBAAY,MAAZ,GAAqB,YAAY,gBAAZ,CAA6B,YAA7B,CAArB;;AAEA,WAAO,YAAP,IAAuB,SAAS,YAAT,CAAsB,WAAtB,CAAvB;AACD;AACF,CAlBD;;AAoBA,SAAS,QAAT,CAAmB,OAAnB,EAA4B,MAA5B,EAAoC,cAApC,EAAoD;AAClD,SAAQ,WAAW,QAAQ,OAAnB,KACI,UAAU,CAAC,QAAQ,OADvB,MAEI,CAAC,cAAD,IAAmB,QAAQ,OAF/B,CAAR;AAGD;;AAED,OAAO,OAAP,GAAiB,SAAjB;;;;;AC3LA,IAAM,YAAiB,QAAQ,SAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,UAAR,CAAvB;AACA,IAAM,iBAAiB,QAAQ,mBAAR,CAAvB;;AAEA,IAAM,WAAW;AACf,YAAU;AACR,aAAa,KADL;AAER,aAAa,KAFL;AAGR,iBAAa,IAHL;AAIR,iBAAa;AAJL,GADK;;AAQf,aAAW,yBAA0C;AAAA,QAA9B,IAA8B,QAA9B,IAA8B;AAAA,QAAxB,WAAwB,QAAxB,WAAwB;AAAA,QAAX,OAAW,QAAX,OAAW;;AACnD,QAAM,cAAc,WAAW,QAAQ,WAAvC;AACA,QAAM,SAAS,EAAf;;AAEA,QAAI,QAAQ,WAAZ,EAAyB;AACvB,aAAO,IAAP,GAAc,YAAY,IAAZ,GAAoB,KAAK,KAAL,GAAc,YAAY,IAA5D;AACA,aAAO,GAAP,GAAc,YAAY,GAAZ,GAAoB,KAAK,MAAL,GAAc,YAAY,GAA5D;;AAEA,aAAO,KAAP,GAAgB,YAAY,KAAZ,GAAsB,KAAK,KAAL,IAAe,IAAI,YAAY,KAA/B,CAAtC;AACA,aAAO,MAAP,GAAgB,YAAY,MAAZ,GAAsB,KAAK,MAAL,IAAe,IAAI,YAAY,MAA/B,CAAtC;AACD,KAND,MAOK;AACH,aAAO,IAAP,GAAc,OAAO,GAAP,GAAa,OAAO,KAAP,GAAe,OAAO,MAAP,GAAgB,CAA1D;AACD;;AAED,WAAO,MAAP;AACD,GAxBc;;AA0Bf,OAAK,oBAAwD;AAAA,QAA5C,UAA4C,SAA5C,UAA4C;AAAA,QAAhC,WAAgC,SAAhC,WAAgC;AAAA,QAAnB,MAAmB,SAAnB,MAAmB;AAAA,QAAX,OAAW,SAAX,OAAW;;AAC3D,QAAI,CAAC,OAAL,EAAc;AAAE,aAAO,MAAP;AAAgB;;AAEhC,QAAM,OAAO,OAAO,WAAP,GACT,EAAE,GAAG,OAAO,CAAZ,EAAe,GAAG,OAAO,CAAzB,EADS,GAET,MAAM,MAAN,CAAa,EAAb,EAAiB,UAAjB,CAFJ;;AAIA,QAAM,cAAc,mBAAmB,QAAQ,WAA3B,EAAwC,WAAxC,EAAqD,IAArD,CAApB;;AAEA,QAAI,CAAC,WAAL,EAAkB;AAAE,aAAO,MAAP;AAAgB;;AAEpC,WAAO,EAAP,GAAY,CAAZ;AACA,WAAO,EAAP,GAAY,CAAZ;AACA,WAAO,MAAP,GAAgB,KAAhB;;AAEA,QAAM,OAAO,WAAb;AACA,QAAI,YAAY,KAAK,CAArB;AACA,QAAI,YAAY,KAAK,CAArB;;AAEA,QAAM,SAAS,YAAY,eAAZ,CAA4B,QAA3C;;AAEA;AACA;AACA;AACA,QAAI,OAAO,WAAP,IAAsB,OAAO,WAAjC,EAA8C;AAC5C,kBAAY,KAAK,GAAL,CAAS,KAAK,GAAL,CAAS,KAAK,CAAL,GAAS,KAAK,KAAd,GAAuB,OAAO,KAAvC,EAA+C,KAAK,CAApD,CAAT,EAAiE,KAAK,CAAL,GAAS,OAAO,IAAjF,CAAZ;AACA,kBAAY,KAAK,GAAL,CAAS,KAAK,GAAL,CAAS,KAAK,CAAL,GAAS,KAAK,MAAd,GAAuB,OAAO,MAAvC,EAA+C,KAAK,CAApD,CAAT,EAAiE,KAAK,CAAL,GAAS,OAAO,GAAjF,CAAZ;AACD,KAHD,MAIK;AACH,kBAAY,KAAK,GAAL,CAAS,KAAK,GAAL,CAAS,KAAK,KAAL,GAAc,OAAO,KAA9B,EAAsC,KAAK,CAA3C,CAAT,EAAwD,KAAK,IAAL,GAAY,OAAO,IAA3E,CAAZ;AACA,kBAAY,KAAK,GAAL,CAAS,KAAK,GAAL,CAAS,KAAK,MAAL,GAAc,OAAO,MAA9B,EAAsC,KAAK,CAA3C,CAAT,EAAwD,KAAK,GAAL,GAAY,OAAO,GAA3E,CAAZ;AACD;;AAED,WAAO,EAAP,GAAY,YAAY,KAAK,CAA7B;AACA,WAAO,EAAP,GAAY,YAAY,KAAK,CAA7B;;AAEA,WAAO,OAAP,GAAiB,OAAO,SAAP,KAAqB,SAArB,IAAkC,OAAO,SAAP,KAAqB,SAAxE;AACA,WAAO,MAAP,GAAgB,CAAC,EAAE,OAAO,EAAP,IAAa,OAAO,EAAtB,CAAjB;;AAEA,WAAO,SAAP,GAAmB,SAAnB;AACA,WAAO,SAAP,GAAmB,SAAnB;AACD,GAnEc;;AAqEf,gBAAc,6BAAoD;AAAA,QAAxC,IAAwC,SAAxC,IAAwC;AAAA,QAAlC,MAAkC,SAAlC,MAAkC;AAAA,QAA1B,MAA0B,SAA1B,MAA0B;AAAA,QAAlB,KAAkB,SAAlB,KAAkB;AAAA,QAAX,OAAW,SAAX,OAAW;;AAChE,QAAM,cAAc,WAAW,QAAQ,WAAvC;;AAEA,QAAI,WAAW,QAAQ,OAAnB,IACG,EAAE,UAAU,OAAV,IAAqB,WAArB,IAAoC,OAAO,MAA7C,CADP,EAC6D;;AAE3D,UAAI,OAAO,MAAX,EAAmB;AACjB,aAAK,CAAL,IAAU,OAAO,EAAjB;AACA,aAAK,CAAL,IAAU,OAAO,EAAjB;AACA,eAAO,CAAP,IAAY,OAAO,EAAnB;AACA,eAAO,CAAP,IAAY,OAAO,EAAnB;;AAEA,eAAO;AACL,cAAI,OAAO,EADN;AAEL,cAAI,OAAO;AAFN,SAAP;AAID;AACF;AACF,GAvFc;;AAyFf;AAzFe,CAAjB;;AA4FA,SAAS,kBAAT,CAA6B,KAA7B,EAAoC,WAApC,EAAiD,IAAjD,EAAuD;AACrD,MAAI,MAAM,EAAN,CAAS,QAAT,CAAkB,KAAlB,CAAJ,EAA8B;AAC5B,WAAO,MAAM,eAAN,CAAsB,KAAtB,EAA6B,YAAY,MAAzC,EAAiD,YAAY,OAA7D,EAAsE,CAAC,KAAK,CAAN,EAAS,KAAK,CAAd,EAAiB,WAAjB,CAAtE,CAAP;AACD,GAFD,MAEO;AACL,WAAO,MAAM,eAAN,CAAsB,KAAtB,EAA6B,YAAY,MAAzC,EAAiD,YAAY,OAA7D,CAAP;AACD;AACF;;AAED,UAAU,QAAV,GAAqB,QAArB;AACA,UAAU,KAAV,CAAgB,IAAhB,CAAqB,UAArB;;AAEA,eAAe,SAAf,CAAyB,QAAzB,GAAoC,SAAS,QAA7C;;AAEA,OAAO,OAAP,GAAiB,QAAjB;;;;;AC7GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,IAAM,YAAiB,QAAQ,SAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,UAAR,CAAvB;AACA,IAAM,YAAiB,QAAQ,eAAR,CAAvB;AACA,IAAM,iBAAiB,QAAQ,mBAAR,CAAvB;AACA,IAAM,SAAiB,QAAQ,mBAAR,CAAvB;;eAE+B,QAAQ,YAAR,C;IAAvB,kB,YAAA,kB;;AAER,IAAM,UAAU,EAAE,KAAK,CAAC,QAAR,EAAkB,MAAM,CAAC,QAAzB,EAAmC,QAAQ,CAAC,QAA5C,EAAsD,OAAO,CAAC,QAA9D,EAAhB;AACA,IAAM,UAAU,EAAE,KAAK,CAAC,QAAR,EAAkB,MAAM,CAAC,QAAzB,EAAmC,QAAQ,CAAC,QAA5C,EAAsD,OAAO,CAAC,QAA9D,EAAhB;;AAEA,IAAM,gBAAgB;AACpB,YAAU;AACR,aAAS,KADD;AAER,aAAS,KAFD;AAGR,SAAK,IAHG;AAIR,SAAK,IAJG;AAKR,YAAQ;AALA,GADU;;AASpB,aAAW,yBAAiD;AAAA,QAArC,WAAqC,QAArC,WAAqC;AAAA,QAAxB,WAAwB,QAAxB,WAAwB;AAAA,QAAX,OAAW,QAAX,OAAW;;AAC1D,QAAI,CAAC,OAAL,EAAc;AACZ,aAAO,MAAM,MAAN,CAAa,EAAb,EAAiB,WAAjB,CAAP;AACD;;AAED,QAAM,SAAS,mBAAmB,QAAQ,MAA3B,EAAmC,WAAnC,EAAgD,YAAY,WAAZ,CAAwB,IAAxE,CAAf;;AAEA,QAAI,MAAJ,EAAY;AACV,aAAO;AACL,aAAQ,YAAY,GAAZ,GAAqB,OAAO,CAD/B;AAEL,cAAQ,YAAY,IAAZ,GAAqB,OAAO,CAF/B;AAGL,gBAAQ,YAAY,MAAZ,GAAqB,OAAO,CAH/B;AAIL,eAAQ,YAAY,KAAZ,GAAqB,OAAO;AAJ/B,OAAP;AAMD;;AAED,WAAO,WAAP;AACD,GA1BmB;;AA4BpB,OAAK,oBAAgE;AAAA,QAApD,UAAoD,SAApD,UAAoD;AAAA,QAAxC,WAAwC,SAAxC,WAAwC;AAAA,QAA3B,MAA2B,SAA3B,MAA2B;AAAA,QAAnB,MAAmB,SAAnB,MAAmB;AAAA,QAAX,OAAW,SAAX,OAAW;;AACnE,QAAM,QAAQ,YAAY,QAAZ,CAAqB,WAArB,IAAoC,YAAY,QAAZ,CAAqB,KAAvE;;AAEA,QAAI,CAAC,YAAY,WAAZ,EAAD,IAA8B,CAAC,KAAnC,EAA0C;AACxC;AACD;;AAED,QAAM,OAAO,OAAO,WAAP,GACT,EAAE,GAAG,OAAO,CAAZ,EAAe,GAAG,OAAO,CAAzB,EADS,GAET,MAAM,MAAN,CAAa,EAAb,EAAiB,UAAjB,CAFJ;AAGA,QAAM,QAAQ,UAAU,UAAV,CAAqB,mBAAmB,QAAQ,KAA3B,EAAkC,WAAlC,EAA+C,IAA/C,CAArB,KAA8E,OAA5F;AACA,QAAM,QAAQ,UAAU,UAAV,CAAqB,mBAAmB,QAAQ,KAA3B,EAAkC,WAAlC,EAA+C,IAA/C,CAArB,KAA8E,OAA5F;;AAEA,QAAI,YAAY,KAAK,CAArB;AACA,QAAI,YAAY,KAAK,CAArB;;AAEA,WAAO,EAAP,GAAY,CAAZ;AACA,WAAO,EAAP,GAAY,CAAZ;AACA,WAAO,MAAP,GAAgB,KAAhB;;AAEA,QAAI,MAAM,GAAV,EAAe;AACb,kBAAY,KAAK,GAAL,CAAS,KAAK,GAAL,CAAS,MAAM,GAAN,GAAe,OAAO,GAA/B,EAAuC,KAAK,CAA5C,CAAT,EAAyD,MAAM,GAAN,GAAe,OAAO,GAA/E,CAAZ;AACD,KAFD,MAGK,IAAI,MAAM,MAAV,EAAkB;AACrB,kBAAY,KAAK,GAAL,CAAS,KAAK,GAAL,CAAS,MAAM,MAAN,GAAe,OAAO,MAA/B,EAAuC,KAAK,CAA5C,CAAT,EAAyD,MAAM,MAAN,GAAe,OAAO,MAA/E,CAAZ;AACD;AACD,QAAI,MAAM,IAAV,EAAgB;AACd,kBAAY,KAAK,GAAL,CAAS,KAAK,GAAL,CAAS,MAAM,IAAN,GAAe,OAAO,IAA/B,EAAuC,KAAK,CAA5C,CAAT,EAAyD,MAAM,IAAN,GAAe,OAAO,IAA/E,CAAZ;AACD,KAFD,MAGK,IAAI,MAAM,KAAV,EAAiB;AACpB,kBAAY,KAAK,GAAL,CAAS,KAAK,GAAL,CAAS,MAAM,KAAN,GAAe,OAAO,KAA/B,EAAuC,KAAK,CAA5C,CAAT,EAAyD,MAAM,KAAN,GAAe,OAAO,KAA/E,CAAZ;AACD;;AAED,WAAO,EAAP,GAAY,YAAY,KAAK,CAA7B;AACA,WAAO,EAAP,GAAY,YAAY,KAAK,CAA7B;;AAEA,WAAO,OAAP,GAAiB,OAAO,SAAP,KAAqB,SAArB,IAAkC,OAAO,SAAP,KAAqB,SAAxE;AACA,WAAO,MAAP,GAAgB,CAAC,EAAE,OAAO,EAAP,IAAa,OAAO,EAAtB,CAAjB;;AAEA,WAAO,SAAP,GAAmB,SAAnB;AACA,WAAO,SAAP,GAAmB,SAAnB;AACD,GArEmB;;AAuEpB,gBAAc,6BAAoD;AAAA,QAAxC,IAAwC,SAAxC,IAAwC;AAAA,QAAlC,MAAkC,SAAlC,MAAkC;AAAA,QAA1B,MAA0B,SAA1B,MAA0B;AAAA,QAAlB,KAAkB,SAAlB,KAAkB;AAAA,QAAX,OAAW,SAAX,OAAW;;AAChE,QAAI,WAAW,QAAQ,OAAnB,IACG,EAAE,UAAU,OAAV,IAAqB,OAAO,MAA9B,CADP,EAC8C;;AAE5C,UAAI,OAAO,MAAX,EAAmB;AACjB,aAAK,CAAL,IAAU,OAAO,EAAjB;AACA,aAAK,CAAL,IAAU,OAAO,EAAjB;AACA,eAAO,CAAP,IAAY,OAAO,EAAnB;AACA,eAAO,CAAP,IAAY,OAAO,EAAnB;;AAEA,eAAO;AACL,cAAI,OAAO,EADN;AAEL,cAAI,OAAO;AAFN,SAAP;AAID;AACF;AACF,GAvFmB;;AAyFpB,kBAzFoB;AA0FpB,kBA1FoB;AA2FpB;AA3FoB,CAAtB;;AA8FA,UAAU,aAAV,GAA0B,aAA1B;AACA,UAAU,KAAV,CAAgB,IAAhB,CAAqB,eAArB;;AAEA,eAAe,SAAf,CAAyB,aAAzB,GAAyC,cAAc,QAAvD;AACA,OAAO,QAAP,CAAgB,aAAhB,GAAyC,cAAc,QAAvD;;AAEA,OAAO,OAAP,GAAiB,aAAjB;;;;;AC1HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,IAAM,YAAiB,QAAQ,SAAR,CAAvB;AACA,IAAM,gBAAiB,QAAQ,iBAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,UAAR,CAAvB;AACA,IAAM,YAAiB,QAAQ,eAAR,CAAvB;AACA,IAAM,iBAAiB,QAAQ,mBAAR,CAAvB;AACA,IAAM,SAAiB,QAAQ,mBAAR,CAAvB;;AAEA,IAAM,QAAQ,EAAE,OAAO,CAAC,QAAV,EAAoB,QAAQ,CAAC,QAA7B,EAAd;AACA,IAAM,QAAQ,EAAE,OAAO,CAAC,QAAV,EAAoB,QAAQ,CAAC,QAA7B,EAAd;;AAEA,IAAM,eAAe;AACnB,YAAU;AACR,aAAS,KADD;AAER,aAAS,KAFD;AAGR,SAAK,IAHG;AAIR,SAAK;AAJG,GADS;;AAQnB,aAAW,yBAA2B;AAAA,QAAf,WAAe,QAAf,WAAe;;AACpC,WAAO,YAAY,WAAnB;AACD,GAVkB;;AAYnB,OAAK,aAAU,GAAV,EAAe;AAAA,QACV,WADU,GACe,GADf,CACV,WADU;AAAA,QACG,OADH,GACe,GADf,CACG,OADH;;AAElB,QAAM,QAAQ,YAAY,QAAZ,CAAqB,WAArB,IAAoC,YAAY,QAAZ,CAAqB,KAAvE;;AAEA,QAAI,CAAC,YAAY,WAAZ,EAAD,IAA8B,CAAC,KAAnC,EAA0C;AACxC;AACD;;AAED,QAAM,OAAO,UAAU,UAAV,CAAqB,YAAY,WAAZ,CAAwB,QAA7C,CAAb;;AAEA,QAAM,UAAU,UAAU,UAAV,CAAqB,cAAc,kBAAd,CAAiC,QAAQ,GAAzC,EAA8C,WAA9C,CAArB,KAAoF,KAApG;AACA,QAAM,UAAU,UAAU,UAAV,CAAqB,cAAc,kBAAd,CAAiC,QAAQ,GAAzC,EAA8C,WAA9C,CAArB,KAAoF,KAApG;;AAEA,QAAI,OAAJ,GAAc;AACZ,eAAS,QAAQ,OADL;AAEZ,eAAS,QAAQ,OAFL;AAGZ,aAAO,MAAM,MAAN,CAAa,EAAb,EAAiB,cAAc,OAA/B,CAHK;AAIZ,aAAO,MAAM,MAAN,CAAa,EAAb,EAAiB,cAAc,OAA/B;AAJK,KAAd;;AAOA,QAAI,MAAM,GAAV,EAAe;AACb,UAAI,OAAJ,CAAY,KAAZ,CAAkB,GAAlB,GAAwB,KAAK,MAAL,GAAc,QAAQ,MAA9C;AACA,UAAI,OAAJ,CAAY,KAAZ,CAAkB,GAAlB,GAAwB,KAAK,MAAL,GAAc,QAAQ,MAA9C;AACD,KAHD,MAIK,IAAI,MAAM,MAAV,EAAkB;AACrB,UAAI,OAAJ,CAAY,KAAZ,CAAkB,MAAlB,GAA2B,KAAK,GAAL,GAAW,QAAQ,MAA9C;AACA,UAAI,OAAJ,CAAY,KAAZ,CAAkB,MAAlB,GAA2B,KAAK,GAAL,GAAW,QAAQ,MAA9C;AACD;AACD,QAAI,MAAM,IAAV,EAAgB;AACd,UAAI,OAAJ,CAAY,KAAZ,CAAkB,IAAlB,GAAyB,KAAK,KAAL,GAAa,QAAQ,KAA9C;AACA,UAAI,OAAJ,CAAY,KAAZ,CAAkB,IAAlB,GAAyB,KAAK,KAAL,GAAa,QAAQ,KAA9C;AACD,KAHD,MAIK,IAAI,MAAM,KAAV,EAAiB;AACpB,UAAI,OAAJ,CAAY,KAAZ,CAAkB,KAAlB,GAA0B,KAAK,IAAL,GAAY,QAAQ,KAA9C;AACA,UAAI,OAAJ,CAAY,KAAZ,CAAkB,KAAlB,GAA0B,KAAK,IAAL,GAAY,QAAQ,KAA9C;AACD;;AAED,kBAAc,GAAd,CAAkB,GAAlB;AACD,GAlDkB;;AAoDnB,gBAAc,cAAc;AApDT,CAArB;;AAuDA,UAAU,YAAV,GAAyB,YAAzB;AACA,UAAU,KAAV,CAAgB,IAAhB,CAAqB,cAArB;;AAEA,eAAe,SAAf,CAAyB,YAAzB,GAAwC,aAAa,QAArD;AACA,OAAO,QAAP,CAAgB,YAAhB,GAAwC,aAAa,QAArD;;AAEA,OAAO,OAAP,GAAiB,YAAjB;;;;;AClFA,IAAM,YAAiB,QAAQ,SAAR,CAAvB;AACA,IAAM,WAAiB,QAAQ,aAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,UAAR,CAAvB;AACA,IAAM,iBAAiB,QAAQ,mBAAR,CAAvB;;AAEA,IAAM,OAAO;AACX,YAAU;AACR,aAAS,KADD;AAER,aAAS,KAFD;AAGR,WAAS,QAHD;AAIR,aAAS,IAJD;AAKR,aAAS,IALD;;AAOR,oBAAgB;AAPR,GADC;;AAWX,aAAW,yBAA8E;AAAA,QAAlE,WAAkE,QAAlE,WAAkE;AAAA,QAArD,YAAqD,QAArD,YAAqD;AAAA,QAAvC,OAAuC,QAAvC,OAAuC;AAAA,QAA9B,IAA8B,QAA9B,IAA8B;AAAA,QAAxB,WAAwB,QAAxB,WAAwB;AAAA,QAAX,OAAW,QAAX,OAAW;;AACvF,QAAM,UAAU,EAAhB;AACA,QAAM,gBAAgB,MAAM,QAAN,CAAe,MAAM,eAAN,CAAsB,QAAQ,MAA9B,CAAf,CAAtB;AACA,QAAM,SAAS,iBAAiB,MAAM,WAAN,CAAkB,YAAlB,EAAgC,OAAhC,EAAyC,YAAY,QAAZ,CAAqB,IAA9D,CAAhC;AACA,cAAU,WAAW,aAAa,OAAb,CAAqB,YAAY,QAAZ,CAAqB,IAA1C,EAAgD,IAA3D,IAAmE,EAA7E;;AAEA,QAAI,mBAAJ;;AAEA,QAAI,QAAQ,MAAR,KAAmB,aAAvB,EAAsC;AACpC,mBAAa;AACX,WAAG,YAAY,WAAZ,CAAwB,IAAxB,CAA6B,CAA7B,GAAiC,OAAO,CADhC;AAEX,WAAG,YAAY,WAAZ,CAAwB,IAAxB,CAA6B,CAA7B,GAAiC,OAAO;AAFhC,OAAb;AAID,KALD,MAMM;AACJ,UAAM,aAAa,MAAM,eAAN,CAAsB,QAAQ,MAA9B,EAAsC,YAAtC,EAAoD,OAApD,EAA6D,CAAC,WAAD,CAA7D,CAAnB;;AAEA,mBAAa,MAAM,QAAN,CAAe,UAAf,KAA8B,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EAA3C;AACD;;AAED,QAAI,QAAQ,QAAQ,cAAhB,IAAkC,QAAQ,cAAR,CAAuB,MAA7D,EAAqE;AACnE,2BAA6C,QAAQ,cAArD,kHAAqE;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,YAArD,SAAqD,SAAxD,CAAwD;AAAA,YAAvC,SAAuC,SAA1C,CAA0C;;AACnE,gBAAQ,IAAR,CAAa;AACX,aAAG,YAAY,IAAZ,GAAoB,KAAK,KAAL,GAAc,SAAlC,GAA+C,WAAW,CADlD;AAEX,aAAG,YAAY,GAAZ,GAAoB,KAAK,MAAL,GAAc,SAAlC,GAA+C,WAAW;AAFlD,SAAb;AAID;AACF,KAPD,MAQK;AACH,cAAQ,IAAR,CAAa,UAAb;AACD;;AAED,WAAO,OAAP;AACD,GA5CU;;AA8CX,OAAK,oBAAyE;AAAA,QAA7D,WAA6D,SAA7D,WAA6D;AAAA,QAAhD,UAAgD,SAAhD,UAAgD;AAAA,QAApC,MAAoC,SAApC,MAAoC;AAAA,QAA5B,OAA4B,SAA5B,OAA4B;AAAA,QAAX,OAAW,SAAnB,MAAmB;;AAC5E,QAAM,UAAU,EAAhB;AACA,QAAI,eAAJ;AACA,QAAI,aAAJ;AACA,QAAI,UAAJ;;AAEA,QAAI,OAAO,WAAX,EAAwB;AACtB,aAAO,EAAE,GAAG,OAAO,CAAZ,EAAe,GAAG,OAAO,CAAzB,EAAP;AACD,KAFD,MAGK;AACH,UAAM,SAAS,MAAM,WAAN,CAAkB,YAAY,MAA9B,EAAsC,YAAY,OAAlD,EAA2D,YAAY,QAAZ,CAAqB,IAAhF,CAAf;;AAEA,aAAO,MAAM,MAAN,CAAa,EAAb,EAAiB,UAAjB,CAAP;;AAEA,WAAK,CAAL,IAAU,OAAO,CAAjB;AACA,WAAK,CAAL,IAAU,OAAO,CAAjB;AACD;;AAED,WAAO,KAAP,GAAe,KAAK,CAApB;AACA,WAAO,KAAP,GAAe,KAAK,CAApB;;AAEA,QAAI,MAAM,QAAQ,OAAR,GAAiB,QAAQ,OAAR,CAAgB,MAAjC,GAA0C,CAApD;;AAEA,0BAAyC,OAAzC,yHAAkD;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,UAAlC,OAAkC,SAArC,CAAqC;AAAA,UAAtB,OAAsB,SAAzB,CAAyB;;AAChD,UAAM,YAAY,KAAK,CAAL,GAAS,OAA3B;AACA,UAAM,YAAY,KAAK,CAAL,GAAS,OAA3B;;AAEA,4BAAyB,QAAQ,OAAjC,yHAA0C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,YAA/B,UAA+B;;AACxC,YAAI,MAAM,EAAN,CAAS,QAAT,CAAkB,UAAlB,CAAJ,EAAmC;AACjC,mBAAS,WAAW,SAAX,EAAsB,SAAtB,EAAiC,WAAjC,CAAT;AACD,SAFD,MAGK;AACH,mBAAS,UAAT;AACD;;AAED,YAAI,CAAC,MAAL,EAAa;AAAE;AAAW;;AAE1B,gBAAQ,IAAR,CAAa;AACX,aAAG,MAAM,EAAN,CAAS,MAAT,CAAgB,OAAO,CAAvB,IAA6B,OAAO,CAAP,GAAW,OAAxC,GAAmD,SAD3C;AAEX,aAAG,MAAM,EAAN,CAAS,MAAT,CAAgB,OAAO,CAAvB,IAA6B,OAAO,CAAP,GAAW,OAAxC,GAAmD,SAF3C;;AAIX,iBAAO,MAAM,EAAN,CAAS,MAAT,CAAgB,OAAO,KAAvB,IAA+B,OAAO,KAAtC,GAA6C,QAAQ;AAJjD,SAAb;AAMD;AACF;;AAED,QAAM,UAAU;AACd,cAAQ,IADM;AAEd,eAAS,KAFK;AAGd,gBAAU,CAHI;AAId,aAAO,CAJO;AAKd,UAAI,CALU;AAMd,UAAI;AANU,KAAhB;;AASA,SAAK,IAAI,CAAJ,EAAO,MAAM,QAAQ,MAA1B,EAAkC,IAAI,GAAtC,EAA2C,GAA3C,EAAgD;AAC9C,eAAS,QAAQ,CAAR,CAAT;;AAEA,UAAM,QAAQ,OAAO,KAArB;AACA,UAAM,KAAK,OAAO,CAAP,GAAW,KAAK,CAA3B;AACA,UAAM,KAAK,OAAO,CAAP,GAAW,KAAK,CAA3B;AACA,UAAM,WAAW,MAAM,KAAN,CAAY,EAAZ,EAAgB,EAAhB,CAAjB;AACA,UAAI,UAAU,YAAY,KAA1B;;AAEA;AACA;AACA,UAAI,UAAU,QAAV,IAAsB,QAAQ,OAA9B,IAAyC,QAAQ,KAAR,KAAkB,QAA/D,EAAyE;AACvE,kBAAU,KAAV;AACD;;AAED,UAAI,CAAC,QAAQ,MAAT,KAAoB;AACpB;AADoB,QAEjB,QAAQ,OAAR,IAAmB,UAAU;AAChC;AADG,QAED,WAAW,KAAX,GAAmB,QAAQ,QAAR,GAAmB,QAAQ;AAChD;AAHG,QAIA,UAAU,QAAV,IAAsB,QAAQ,KAAR,KAAkB,QAAzC;AACF;AACC,iBAAW,QAAQ,QARA;AASpB;AACG,OAAC,QAAQ,OAAT,IAAoB,WAAW,QAAQ,QAV1C,CAAJ,EAU0D;;AAExD,gBAAQ,MAAR,GAAiB,MAAjB;AACA,gBAAQ,QAAR,GAAmB,QAAnB;AACA,gBAAQ,KAAR,GAAgB,KAAhB;AACA,gBAAQ,OAAR,GAAkB,OAAlB;AACA,gBAAQ,EAAR,GAAa,EAAb;AACA,gBAAQ,EAAR,GAAa,EAAb;;AAEA,eAAO,KAAP,GAAe,KAAf;AACD;AACF;;AAED,QAAI,oBAAJ;;AAEA,QAAI,QAAQ,MAAZ,EAAoB;AAClB,oBAAe,OAAO,SAAP,KAAqB,QAAQ,MAAR,CAAe,CAApC,IAAyC,OAAO,SAAP,KAAqB,QAAQ,MAAR,CAAe,CAA5F;;AAEA,aAAO,SAAP,GAAmB,QAAQ,MAAR,CAAe,CAAlC;AACA,aAAO,SAAP,GAAmB,QAAQ,MAAR,CAAe,CAAlC;AACD,KALD,MAMK;AACH,oBAAc,IAAd;;AAEA,aAAO,SAAP,GAAmB,GAAnB;AACA,aAAO,SAAP,GAAmB,GAAnB;AACD;;AAED,WAAO,EAAP,GAAY,QAAQ,EAApB;AACA,WAAO,EAAP,GAAY,QAAQ,EAApB;;AAEA,WAAO,OAAP,GAAkB,eAAgB,QAAQ,OAAR,IAAmB,CAAC,OAAO,MAA7D;AACA,WAAO,MAAP,GAAgB,QAAQ,OAAxB;AACD,GA/JU;;AAiKX,gBAAc,6BAAoD;AAAA,QAAxC,IAAwC,SAAxC,IAAwC;AAAA,QAAlC,MAAkC,SAAlC,MAAkC;AAAA,QAA1B,MAA0B,SAA1B,MAA0B;AAAA,QAAlB,KAAkB,SAAlB,KAAkB;AAAA,QAAX,OAAW,SAAX,OAAW;;AAChE,QAAM,iBAAiB,WAAW,QAAQ,cAA1C;;AAEA,QAAI,WAAW,QAAQ,OAAnB,IACG,EAAE,UAAU,OAAV,IAAqB,cAArB,IAAuC,eAAe,MAAxD,CADP,EACwE;;AAEtE,UAAI,OAAO,MAAX,EAAmB;AACjB,aAAK,CAAL,IAAU,OAAO,EAAjB;AACA,aAAK,CAAL,IAAU,OAAO,EAAjB;AACA,eAAO,CAAP,IAAY,OAAO,EAAnB;AACA,eAAO,CAAP,IAAY,OAAO,EAAnB;AACD;;AAED,aAAO;AACL,eAAS,OAAO,KADX;AAEL,gBAAS,OAAO,MAFX;AAGL,WAAS,OAAO,SAHX;AAIL,WAAS,OAAO,SAJX;AAKL,eAAS,OAAO,KALX;AAML,eAAS,OAAO,KANX;AAOL,YAAS,OAAO,EAPX;AAQL,YAAS,OAAO;AARX,OAAP;AAUD;AACF;AAzLU,CAAb;;AA4LA,SAAS,cAAT,GAA0B,UAAU,IAAV,EAAgB;AACxC,SAAO,UAAU,CAAV,EAAa,CAAb,EAAgB;AACrB,QAAM,SAAS,KAAK,MAAL,IAAe;AAC5B,YAAQ,CAAC,QADmB;AAE5B,aAAS,QAFmB;AAG5B,WAAQ,CAAC,QAHmB;AAI5B,cAAS;AAJmB,KAA9B;AAMA,QAAI,UAAU,CAAd;AACA,QAAI,UAAU,CAAd;;AAEA,QAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,KAAK,MAArB,CAAJ,EAAkC;AAChC,gBAAU,KAAK,MAAL,CAAY,CAAtB;AACA,gBAAU,KAAK,MAAL,CAAY,CAAtB;AACD;;AAED,QAAM,QAAQ,KAAK,KAAL,CAAW,CAAC,IAAI,OAAL,IAAgB,KAAK,CAAhC,CAAd;AACA,QAAM,QAAQ,KAAK,KAAL,CAAW,CAAC,IAAI,OAAL,IAAgB,KAAK,CAAhC,CAAd;;AAEA,QAAM,OAAO,KAAK,GAAL,CAAS,OAAO,IAAhB,EAAsB,KAAK,GAAL,CAAS,OAAO,KAAhB,EAAwB,QAAQ,KAAK,CAAb,GAAiB,OAAzC,CAAtB,CAAb;AACA,QAAM,OAAO,KAAK,GAAL,CAAS,OAAO,GAAhB,EAAsB,KAAK,GAAL,CAAS,OAAO,MAAhB,EAAwB,QAAQ,KAAK,CAAb,GAAiB,OAAzC,CAAtB,CAAb;;AAEA,WAAO;AACL,SAAG,IADE;AAEL,SAAG,IAFE;AAGL,aAAO,KAAK;AAHP,KAAP;AAKD,GA1BD;AA2BD,CA5BD;;AA8BA,UAAU,IAAV,GAAiB,IAAjB;AACA,UAAU,KAAV,CAAgB,IAAhB,CAAqB,MAArB;;AAEA,eAAe,SAAf,CAAyB,IAAzB,GAAgC,KAAK,QAArC;;AAEA,OAAO,OAAP,GAAiB,IAAjB;;;;;ACpOA;AACA;;AAEA,IAAM,YAAiB,QAAQ,SAAR,CAAvB;AACA,IAAM,OAAiB,QAAQ,QAAR,CAAvB;AACA,IAAM,iBAAiB,QAAQ,mBAAR,CAAvB;AACA,IAAM,SAAiB,QAAQ,mBAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,WAAR,CAAvB;;AAEA,IAAM,WAAW;AACf,YAAU;AACR,aAAS,KADD;AAER,aAAS,KAFD;AAGR,WAAS,QAHD;AAIR,aAAS,IAJD;AAKR,aAAS;AALD,GADK;;AASf,aAAW,mBAAU,GAAV,EAAe;AAAA,QAChB,WADgB,GACS,GADT,CAChB,WADgB;AAAA,QACH,OADG,GACS,GADT,CACH,OADG;;AAExB,QAAM,QAAQ,YAAY,QAAZ,CAAqB,KAAnC;;AAEA,QAAI,CAAC,KAAL,EAAY;AAAE;AAAS;;AAEvB,QAAI,OAAJ,GAAc;AACZ,sBAAgB,CAAC;AACf,WAAG,MAAM,IAAN,GAAY,CAAZ,GAAgB,CADJ;AAEf,WAAG,MAAM,GAAN,GAAY,CAAZ,GAAgB;AAFJ,OAAD,CADJ;AAKZ,cAAQ,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EALI;AAMZ,cAAQ,MANI;AAOZ,aAAO,QAAQ;AAPH,KAAd;;AAUA,QAAM,UAAU,KAAK,SAAL,CAAe,GAAf,CAAhB;AACA,QAAI,OAAJ,GAAc,OAAd;;AAEA,WAAO,OAAP;AACD,GA7Bc;;AA+Bf,OAAK,aAAU,GAAV,EAAe;AAAA,QACV,WADU,GACmC,GADnC,CACV,WADU;AAAA,QACG,OADH,GACmC,GADnC,CACG,OADH;AAAA,QACY,MADZ,GACmC,GADnC,CACY,MADZ;AAAA,QACoB,UADpB,GACmC,GADnC,CACoB,UADpB;;AAElB,QAAM,OAAO,MAAM,MAAN,CAAa,EAAb,EAAiB,UAAjB,CAAb;AACA,QAAM,YAAY,KAAK,CAAL,GAAS,OAAO,CAAP,EAAU,CAArC;AACA,QAAM,YAAY,KAAK,CAAL,GAAS,OAAO,CAAP,EAAU,CAArC;;AAEA,QAAI,OAAJ,GAAc,MAAM,MAAN,CAAa,EAAb,EAAiB,OAAjB,CAAd;AACA,QAAI,OAAJ,CAAY,OAAZ,GAAsB,EAAtB;;AAEA,yBAAyB,QAAQ,OAAjC,kHAA0C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAA/B,UAA+B;;AACxC,UAAI,eAAJ;;AAEA,UAAI,MAAM,EAAN,CAAS,QAAT,CAAkB,UAAlB,CAAJ,EAAmC;AACjC,iBAAS,WAAW,SAAX,EAAsB,SAAtB,EAAiC,WAAjC,CAAT;AACD,OAFD,MAGK;AACH,iBAAS,UAAT;AACD;;AAED,UAAI,CAAC,MAAL,EAAa;AAAE;AAAW;;AAE1B,UAAI,WAAW,MAAX,IAAqB,YAAY,MAArC,EAA6C;AAC3C,eAAO,CAAP,GAAW,OAAO,KAAlB;AACA,eAAO,CAAP,GAAW,OAAO,MAAlB;AACD;;AAED,UAAI,OAAJ,CAAY,OAAZ,CAAoB,IAApB,CAAyB,MAAzB;AACD;;AAED,SAAK,GAAL,CAAS,GAAT;AACD,GA7Dc;;AA+Df,gBAAc,sBAAU,GAAV,EAAe;AAAA,QACnB,OADmB,GACP,GADO,CACnB,OADmB;;;AAG3B,QAAI,OAAJ,GAAc,MAAM,MAAN,CAAa,EAAb,EAAiB,OAAjB,CAAd;AACA,QAAI,OAAJ,CAAY,OAAZ,GAAsB,QAAQ,OAA9B;AACA,QAAI,OAAJ,CAAY,cAAZ,GAA6B,CAAC,IAAD,CAA7B;;AAEA,SAAK,YAAL,CAAkB,GAAlB;AACD;AAvEc,CAAjB;;AA0EA,UAAU,QAAV,GAAqB,QAArB;AACA,UAAU,KAAV,CAAgB,IAAhB,CAAqB,UAArB;;AAEA,eAAe,SAAf,CAAyB,QAAzB,GAAoC,SAAS,QAA7C;AACA,OAAO,QAAP,CAAgB,QAAhB,GAAoC,SAAS,QAA7C;;AAEA,OAAO,OAAP,GAAiB,QAAjB;;;;;;;ACzFA,IAAM,eAAe,QAAQ,uBAAR,CAArB;;AAEA,OAAO,OAAP;AACE,wBAAa,IAAb,EAAmB,OAAnB,EAA4B,KAA5B,EAAmC,WAAnC,EAAgD,WAAhD,EAA6D;AAAA;;AAC3D,iBAAa,aAAb,CAA2B,IAA3B,EAAiC,KAAjC;;AAEA,QAAI,UAAU,OAAd,EAAuB;AACrB,mBAAa,aAAb,CAA2B,IAA3B,EAAiC,OAAjC;AACD;;AAED,SAAK,WAAL,GAAmB,WAAnB;;AAEA,SAAK,SAAL,GAAqB,IAAI,IAAJ,GAAW,OAAX,EAArB;AACA,SAAK,aAAL,GAAqB,KAArB;AACA,SAAK,IAAL,GAAqB,IAArB;AACA,SAAK,SAAL,GAAqB,aAAa,YAAb,CAA0B,OAA1B,CAArB;AACA,SAAK,WAAL,GAAqB,aAAa,cAAb,CAA4B,OAA5B,EAAqC,WAArC,CAArB;AACA,SAAK,MAAL,GAAqB,WAArB;AACA,SAAK,aAAL,GAAqB,IAArB;;AAEA,QAAI,SAAS,KAAb,EAAoB;AAClB,UAAM,eAAe,YAAY,eAAZ,CAA4B,OAA5B,CAArB;AACA,WAAK,EAAL,GAAU,KAAK,SAAL,GAAiB,YAAY,SAAZ,CAAsB,YAAtB,CAA3B;;AAEA,UAAM,WAAW,KAAK,SAAL,GAAiB,YAAY,OAA9C;;AAEA,WAAK,MAAL,GAAc,CAAC,EAAE,YAAY,OAAZ,IACZ,YAAY,OAAZ,CAAoB,IAApB,KAA6B,WADjB,IAEZ,YAAY,OAAZ,CAAoB,MAApB,KAA+B,KAAK,MAFxB,IAGZ,WAAW,GAHD,CAAf;AAID,KAVD,MAWK,IAAI,SAAS,WAAb,EAA0B;AAC7B,WAAK,EAAL,GAAU,QAAQ,SAAR,GAAoB,YAAY,OAA1C;AACD;AACF;;AAhCH,yBAkCE,cAlCF,iCAkC8C;AAAA,QAAvB,OAAuB,QAA1B,CAA0B;AAAA,QAAX,OAAW,QAAd,CAAc;;AAC1C,SAAK,KAAL,IAAgB,OAAhB;AACA,SAAK,KAAL,IAAgB,OAAhB;AACA,SAAK,OAAL,IAAgB,OAAhB;AACA,SAAK,OAAL,IAAgB,OAAhB;;AAEA,WAAO,IAAP;AACD,GAzCH;;AAAA,yBA2CE,SA3CF,6BA2CyC;AAAA,QAAvB,OAAuB,SAA1B,CAA0B;AAAA,QAAX,OAAW,SAAd,CAAc;;AACrC,SAAK,KAAL,IAAgB,OAAhB;AACA,SAAK,KAAL,IAAgB,OAAhB;AACA,SAAK,OAAL,IAAgB,OAAhB;AACA,SAAK,OAAL,IAAgB,OAAhB;;AAEA,WAAO,IAAP;AACD,GAlDH;;AAAA,yBAoDE,cApDF,6BAoDoB;AAChB,SAAK,aAAL,CAAmB,cAAnB;AACD,GAtDH;;AAAA,yBAwDE,eAxDF,8BAwDqB;AACjB,SAAK,kBAAL,GAA0B,IAA1B;AACD,GA1DH;;AAAA,yBA4DE,wBA5DF,uCA4D8B;AAC1B,SAAK,2BAAL,GAAmC,KAAK,kBAAL,GAA0B,IAA7D;AACD,GA9DH;;AAAA;AAAA;;;;;ACFA,IAAM,eAAe,QAAQ,gBAAR,CAArB;AACA,IAAM,cAAe,QAAQ,gBAAR,CAArB;AACA,IAAM,QAAe,QAAQ,UAAR,CAArB;AACA,IAAM,UAAe,QAAQ,kBAAR,CAArB;AACA,IAAM,WAAe,QAAQ,mBAAR,CAArB;AACA,IAAM,UAAe,QAAQ,kBAAR,EAA4B,GAA5B,EAArB;;eACqB,QAAQ,cAAR,C;IAAb,M,YAAA,M;;AAER,IAAM,gBAAgB,CAAE,MAAF,EAAU,IAAV,EAAgB,QAAhB,CAAtB;AACA,IAAM,eAAgB,CAAE,MAAF,EAAU,IAAV,EAAgB,QAAhB,CAAtB;;AAEA,IAAM,gBAAgB;AACpB,4BADoB;AAEpB,YAFoB;AAGpB,0CAHoB;AAIpB,kBAJoB;AAKpB,YAAU;AACR,kBAAc,GADN;AAER,gBAAc,IAFN;AAGR,eAAc,IAHN;AAIR,YAAc,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX;AAJN,GALU;AAWpB,SAAO,CACL,MADK,EAEL,MAFK,EAGL,IAHK,EAIL,QAJK,EAKL,KALK,EAML,WANK,EAOL,MAPK;AAXa,CAAtB;;AAsBA,SAAS,IAAT,CAAe,GAAf,EAAoB;AAAA,MAEhB,WAFgB,GAMd,GANc,CAEhB,WAFgB;AAAA,MAEH,OAFG,GAMd,GANc,CAEH,OAFG;AAAA,MAEM,KAFN,GAMd,GANc,CAEM,KAFN;AAAA,MAEa,WAFb,GAMd,GANc,CAEa,WAFb;AAAA,kBAMd,GANc,CAGhB,IAHgB;AAAA,MAGhB,IAHgB,6BAGT,IAAI,YAAJ,CAAiB,IAHR;AAAA,qBAMd,GANc,CAIhB,OAJgB;AAAA,MAIhB,OAJgB,gCAIN,oBAAoB,GAApB,CAJM;AAAA,0BAMd,GANc,CAKhB,YALgB;AAAA,MAKhB,YALgB,qCAKD,IAAI,YAAJ,CAAiB,IAAjB,EAAuB,OAAvB,EAAgC,KAAhC,EAAuC,WAAvC,EAAoD,WAApD,CALC;;;AAQlB,MAAM,YAAY;AAChB,4BADgB;AAEhB,oBAFgB;AAGhB,gBAHgB;AAIhB,4BAJgB;AAKhB,oBALgB;AAMhB,cANgB;AAOhB;AAPgB,GAAlB;;AAUA,OAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,QAAQ,MAA5B,EAAoC,GAApC,EAAyC;AACvC,QAAM,SAAS,QAAQ,CAAR,CAAf;;AAEA,SAAK,IAAM,IAAX,IAAmB,OAAO,KAAP,IAAgB,EAAnC,EAAuC;AACrC,mBAAa,IAAb,IAAqB,OAAO,KAAP,CAAa,IAAb,CAArB;AACD;;AAED,QAAM,SAAS,MAAM,WAAN,CAAkB,OAAO,SAAzB,EAAoC,OAAO,OAA3C,CAAf;;AAEA,iBAAa,cAAb,CAA4B,MAA5B;AACA,iBAAa,SAAb,GAAyB,OAAO,SAAhC;AACA,iBAAa,aAAb,GAA6B,OAAO,OAApC;;AAEA,WAAO,SAAP,CAAiB,IAAjB,CAAsB,YAAtB;;AAEA,iBAAa,SAAb,CAAuB,MAAvB;;AAEA,QAAI,aAAa,2BAAb,IACI,aAAa,kBAAb,IACI,IAAI,CAAL,GAAU,QAAQ,MADrB,IAC+B,QAAQ,IAAI,CAAZ,EAAe,OAAf,KAA2B,aAAa,aAF/E,EAE+F;AAC7F;AACD;AACF;;AAED,UAAQ,IAAR,CAAa,OAAb,EAAsB,SAAtB;;AAEA,MAAI,SAAS,KAAb,EAAoB;AAClB;AACA;AACA,QAAM,UAAU,aAAa,MAAb,GACZ,KAAK;AACL,8BADK,EACQ,gBADR,EACiB,YADjB,EACwB,wBADxB;AAEL,YAAM;AAFD,KAAL,CADY,GAKZ,YALJ;;AAOA,gBAAY,OAAZ,GAAsB,OAAtB;AACA,gBAAY,OAAZ,GAAsB,QAAQ,SAA9B;AACD;;AAED,SAAO,YAAP;AACD;;AAED,SAAS,mBAAT,OAAkF;AAAA,MAAlD,WAAkD,QAAlD,WAAkD;AAAA,MAArC,OAAqC,QAArC,OAAqC;AAAA,MAA5B,KAA4B,QAA5B,KAA4B;AAAA,MAArB,WAAqB,QAArB,WAAqB;AAAA,MAAR,IAAQ,QAAR,IAAQ;;AAChF,MAAM,eAAe,YAAY,eAAZ,CAA4B,OAA5B,CAArB;;AAEA;AACA,MAAI,SAAS,KAAT,KAAmB,YAAY;AAC/B;AADmB,KAEhB,EAAE,YAAY,WAAZ,CAAwB,YAAxB,KAAyC,YAAY,WAAZ,CAAwB,YAAxB,MAA0C,WAArF,CAFH,CAAJ,EAE2G;AACzG,WAAO,EAAP;AACD;;AAED,MAAM,OAAO,MAAM,OAAN,CAAc,WAAd,CAAb;AACA,MAAM,YAAY;AAChB,4BADgB;AAEhB,oBAFgB;AAGhB,gBAHgB;AAIhB,4BAJgB;AAKhB,cALgB;AAMhB,cANgB;AAOhB,aAAS,EAPO;AAQhB,aAAS;AARO,GAAlB;;AAWA,uBAAsB,IAAtB,kHAA4B;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,QAAjB,OAAiB;;AAC1B,cAAU,OAAV,GAAoB,OAApB;;AAEA,YAAQ,IAAR,CAAa,iBAAb,EAAgC,SAAhC;AACD;;AAED,MAAI,SAAS,MAAb,EAAqB;AACnB,cAAU,OAAV,GAAoB,OAAO,UAAU,OAAjB,EAA0B;AAAA,aAC5C,OAAO,SAAP,CAAiB,OAAjB,CAAyB,YAAzB,KAA0C,YAAY,UAAZ,CAAuB,YAAvB,EAAqC,QADnC;AAAA,KAA1B,CAApB;AAED;;AAED,SAAO,UAAU,OAAjB;AACD;;AAED,YAAY,OAAZ,CAAoB,EAApB,CAAuB,qBAAvB,EAA8C,iBAAyC;AAAA,MAA7B,WAA6B,SAA7B,WAA6B;AAAA,MAAhB,YAAgB,SAAhB,YAAgB;;AACrF,cAAY,UAAZ,CAAuB,YAAvB,IAAuC,EAAE,UAAU,QAAZ,EAAsB,SAAS,IAA/B,EAAvC;AACD,CAFD;;AAIA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,gBAAvB,EAAyC,iBAAyC;AAAA,MAA7B,WAA6B,SAA7B,WAA6B;AAAA,MAAhB,YAAgB,SAAhB,YAAgB;;AAChF,cAAY,UAAZ,CAAuB,MAAvB,CAA8B,YAA9B,EAA4C,CAA5C;AACD,CAFD;;AAIA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,MAAvB,EAA+B,iBAAuE;AAAA,MAA3D,WAA2D,SAA3D,WAA2D;AAAA,MAA9C,OAA8C,SAA9C,OAA8C;AAAA,MAArC,KAAqC,SAArC,KAAqC;AAAA,MAA9B,WAA8B,SAA9B,WAA8B;AAAA,MAAjB,aAAiB,SAAjB,aAAiB;;AACpG,MAAM,eAAe,YAAY,eAAZ,CAA4B,OAA5B,CAArB;;AAEA,MAAI,CAAC,aAAD,KAAmB,CAAC,YAAY,aAAb,IAA8B,YAAY,eAA7D,CAAJ,EAAmF;AACjF,QAAI,YAAY,aAAhB,EAA+B;AAC7B,mBAAa,YAAY,UAAZ,CAAuB,YAAvB,EAAqC,OAAlD;AACD;;AAED,SAAK;AACH,8BADG,EACU,gBADV,EACmB,YADnB,EAC0B,wBAD1B;AAEH,YAAM;AAFH,KAAL;AAID;AACF,CAbD;;AAeA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,MAAvB,EAA+B,iBAAsE;AAAA,MAA1D,WAA0D,SAA1D,WAA0D;AAAA,MAA7C,OAA6C,SAA7C,OAA6C;AAAA,MAApC,KAAoC,SAApC,KAAoC;AAAA,MAA7B,WAA6B,SAA7B,WAA6B;AAAA,MAAhB,YAAgB,SAAhB,YAAgB;;AACnG;AACA,MAAM,YAAY,QAAQ,KAAR,GAAe,MAAM,MAAN,CAAa,EAAb,EAAiB,KAAjB,CAAf,GAAyC,KAA3D;;AAEA,MAAM,QAAQ,YAAY,UAAZ,CAAuB,YAAvB,CAAd;AACA,MAAM,OAAO,MAAM,OAAN,CAAc,WAAd,CAAb;AACA,MAAM,YAAY;AAChB,4BADgB;AAEhB,oBAFgB;AAGhB,gBAHgB;AAIhB,4BAJgB;AAKhB,UAAM,MALU;AAMhB,aAAS,EANO;AAOhB,cAPgB;AAQhB,aAAS;AARO,GAAlB;;AAWA,wBAAsB,IAAtB,yHAA4B;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,QAAjB,OAAiB;;AAC1B,cAAU,OAAV,GAAoB,OAApB;;AAEA,YAAQ,IAAR,CAAa,iBAAb,EAAgC,SAAhC;AACD;;AAED,MAAI,CAAC,UAAU,OAAV,CAAkB,MAAvB,EAA+B;AAAE;AAAS;;AAE1C,MAAI,cAAc,QAAlB;;AAEA,OAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,UAAU,OAAV,CAAkB,MAAtC,EAA8C,GAA9C,EAAmD;AACjD,QAAM,SAAS,UAAU,OAAV,CAAkB,CAAlB,CAAf;AACA,QAAM,eAAe,OAAO,SAAP,CAAiB,OAAjB,CAAyB,YAA9C;;AAEA,QAAI,eAAe,WAAnB,EAAgC;AAC9B,oBAAc,YAAd;AACD;AACF;;AAED,QAAM,QAAN,GAAiB,WAAjB;AACA,QAAM,OAAN,GAAgB,WAAW,YAAY;AACrC,SAAK;AACH,8BADG,EACU,oBADV,EACqB,wBADrB;AAEH,eAAS,QAAQ,KAAR,GAAe,SAAf,GAA2B,OAFjC;AAGH,YAAM;AAHH,KAAL;AAKD,GANe,EAMb,WANa,CAAhB;AAOD,CA5CD;;AA8CA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,IAAvB,EAA6B,iBAAkD;AAAA,MAA/C,WAA+C,SAA/C,WAA+C;AAAA,MAAlC,OAAkC,SAAlC,OAAkC;AAAA,MAAzB,KAAyB,SAAzB,KAAyB;AAAA,MAAlB,WAAkB,SAAlB,WAAkB;;AAC7E,MAAI,CAAC,YAAY,eAAjB,EAAkC;AAChC,SAAK,EAAE,wBAAF,EAAe,wBAAf,EAA4B,gBAA5B,EAAqC,YAArC,EAA4C,MAAM,KAAlD,EAAL;AACD;AACF,CAJD;;AAMA,CAAC,IAAD,EAAO,QAAP,EAAiB,OAAjB,CAAyB,UAAU,UAAV,EAAsB;AAC7C,cAAY,OAAZ,CAAoB,EAApB,CAAuB,UAAvB,EAAmC,iBAAyC;AAAA,QAA7B,WAA6B,SAA7B,WAA6B;AAAA,QAAhB,YAAgB,SAAhB,YAAgB;;AAC1E,QAAI,YAAY,UAAZ,CAAuB,YAAvB,CAAJ,EAA0C;AACxC,mBAAa,YAAY,UAAZ,CAAuB,YAAvB,EAAqC,OAAlD;AACD;AACF,GAJD;AAKD,CAND;;AAQA,SAAS,oBAAT,CAA+B,IAA/B,EAAqC;AACnC,SAAO,kBAAwD;AAAA,QAA5C,WAA4C,UAA5C,WAA4C;AAAA,QAA/B,OAA+B,UAA/B,OAA+B;AAAA,QAAtB,KAAsB,UAAtB,KAAsB;AAAA,QAAf,WAAe,UAAf,WAAe;;AAC7D,SAAK,EAAE,wBAAF,EAAe,wBAAf,EAA4B,gBAA5B,EAAqC,YAArC,EAA4C,UAA5C,EAAL;AACD,GAFD;AAGD;;AAED,KAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,cAAc,MAAlC,EAA0C,GAA1C,EAA+C;AAC7C,cAAY,OAAZ,CAAoB,EAApB,CAAuB,cAAc,CAAd,CAAvB,EAAyC,qBAAqB,aAAa,CAAb,CAArB,CAAzC;AACD;;AAED,YAAY,OAAZ,CAAoB,EAApB,CAAuB,KAAvB,EAA8B,UAAU,WAAV,EAAuB;AACnD,cAAY,OAAZ,GAAyB,IAAzB,CADmD,CACnB;AAChC,cAAY,OAAZ,GAAyB,CAAzB,CAFmD,CAEnB;AAChC,cAAY,UAAZ,GAAyB,EAAzB,CAHmD,CAGnB;AACjC,CAJD;;AAMA,SAAS,aAAT,GAAyB,cAAc,QAAvC;AACA,OAAO,OAAP,GAAiB,aAAjB;;;;;ACtOA,IAAM,gBAAgB,QAAQ,QAAR,CAAtB;AACA,IAAM,cAAgB,QAAQ,gBAAR,CAAtB;;AAEA,cAAc,OAAd,CAAsB,EAAtB,CAAyB,KAAzB,EAAgC,KAAhC;AACA,cAAc,OAAd,CAAsB,EAAtB,CAAyB,OAAzB,EAAkC,OAAlC;;WAEqB,CAAC,MAAD,EAAS,IAAT,EAAe,QAAf,EAAyB,QAAzB,C;AAArB,yCAAyD;AAApD,MAAM,iBAAN;AACH,cAAY,OAAZ,CAAoB,EAApB,CAAuB,MAAvB,EAA+B,aAA/B;AACD;;AAED,SAAS,KAAT,OAAkC;AAAA,MAAhB,YAAgB,QAAhB,YAAgB;;AAChC,MAAI,aAAa,IAAb,KAAsB,MAA1B,EAAkC;AAAE;AAAS;;AAE7C,eAAa,KAAb,GAAqB,CAAC,aAAa,KAAb,IAAsB,CAAvB,IAA4B,CAAjD;AACD;;AAED,SAAS,OAAT,QAAuE;AAAA,MAAnD,WAAmD,SAAnD,WAAmD;AAAA,MAAtC,YAAsC,SAAtC,YAAsC;AAAA,MAAxB,WAAwB,SAAxB,WAAwB;AAAA,MAAX,OAAW,SAAX,OAAW;;AACrE,MAAI,aAAa,IAAb,KAAsB,MAAtB,IAAgC,CAAC,QAAQ,MAA7C,EAAqD;AAAE;AAAS;;AAEhE;AACA,MAAM,WAAW,QAAQ,CAAR,EAAW,SAAX,CAAqB,OAArB,CAA6B,kBAA9C;;AAEA;AACA,MAAI,YAAY,CAAhB,EAAmB;AAAE;AAAS;;AAE9B;AACA,cAAY,kBAAZ,GAAiC,WAAW,YAAY;AACtD,kBAAc,IAAd,CAAmB;AACjB,8BADiB;AAEjB,8BAFiB;AAGjB,YAAM,MAHW;AAIjB,eAAS,YAJQ;AAKjB,aAAO;AALU,KAAnB;AAOD,GARgC,EAQ9B,QAR8B,CAAjC;AASD;;AAED,SAAS,aAAT,QAAyC;AAAA,MAAf,WAAe,SAAf,WAAe;;AACvC;AACA;AACA,MAAI,YAAY,kBAAhB,EAAoC;AAClC,kBAAc,YAAY,kBAA1B;AACA,gBAAY,kBAAZ,GAAiC,IAAjC;AACD;AACF;;AAED;AACA,cAAc,QAAd,CAAuB,kBAAvB,GAA4C,CAA5C;AACA,cAAc,KAAd,CAAoB,IAApB,CAAyB,YAAzB;;AAEA,OAAO,OAAP,GAAiB;AACf,cADe;AAEf,kBAFe;AAGf;AAHe,CAAjB;;;;;AClDA,IAAM,gBAAgB,QAAQ,QAAR,CAAtB;AACA,IAAM,eAAgB,QAAQ,iBAAR,CAAtB;AACA,IAAM,UAAgB,QAAQ,kBAAR,CAAtB;AACA,IAAM,KAAgB,QAAQ,aAAR,CAAtB;AACA,IAAM,WAAgB,QAAQ,mBAAR,CAAtB;AACA,IAAM,QAAgB,QAAQ,UAAR,CAAtB;AACA,IAAM,SAAgB,QAAQ,iBAAR,CAAtB;;eACsB,QAAQ,cAAR,C;IAAd,K,YAAA,K;;AAER,cAAc,OAAd,CAAsB,EAAtB,CAAyB,iBAAzB,EAA4C,gBAAmD;AAAA,MAAvC,OAAuC,QAAvC,OAAuC;AAAA,MAA9B,OAA8B,QAA9B,OAA8B;AAAA,MAArB,IAAqB,QAArB,IAAqB;AAAA,MAAf,WAAe,QAAf,WAAe;;AAC7F,WAAS,gBAAT,CAA2B,YAA3B,EAAyC,QAAzC,EAAmD,OAAnD,EAA4D;AAC1D,QAAM,MAAM,QAAQ,0BAAR,GACN,QAAQ,gBAAR,CAAyB,QAAzB,CADM,GAEN,SAFN;;AAIA,QAAM,YAAY,aAAa,MAA/B;AACA,QAAM,UAAU,UAAU,OAA1B;;AAEA,QAAI,UAAU,IAAV,KACG,GAAG,OAAH,CAAW,OAAX,CADH,IAEG,SAAS,eAAT,CAAyB,OAAzB,EAAkC,QAAlC,EAA4C,GAA5C,CAFH,IAGG,aAAa,eAAb,CAA6B,OAA7B,EAAsC,OAAtC,EAA+C,WAA/C,CAHP,EAGoE;;AAElE,cAAQ,IAAR,CAAa;AACX,wBADW;AAEX,4BAFW;AAGX,eAAO,EAAE,0BAAF;AAHI,OAAb;AAKD;AACF;;AAED,MAAM,eAAe,MAAM,aAAN,CAAoB,GAApB,CAAwB,OAAxB,CAArB;;AAEA,MAAI,YAAJ,EAAkB;AAChB,QAAM,YAAY,aAAa,MAA/B;AACA,QAAM,UAAU,UAAU,OAA1B;;AAEA,QAAI,UAAU,IAAV,KACG,aAAa,eAAb,CAA6B,OAA7B,EAAsC,OAAtC,EAA+C,WAA/C,CADP,EACoE;AAClE,cAAQ,IAAR,CAAa;AACX,wBADW;AAEX,4BAFW;AAGX,eAAO,EAAE,0BAAF;AAHI,OAAb;AAKD;AACF;;AAED,QAAM,aAAN,CAAoB,eAApB,CAAoC,gBAApC,EAAsD,OAAtD;AACD,CAvCD;;AAyCA,aAAa,OAAb,CAAqB,EAArB,CAAwB,KAAxB,EAA+B,iBAA4B;AAAA,MAAhB,YAAgB,SAAhB,YAAgB;;AACzD,eAAa,MAAb,CAAoB,OAApB,GAA8B,UAAU,OAAV,EAAmB;AAC/C,WAAO,aAAa,OAAb,CAAqB,OAArB,CAAP;AACD,GAFD;AAGD,CAJD;;AAMA,aAAa,OAAb,CAAqB,EAArB,CAAwB,KAAxB,EAA+B,iBAAqC;AAAA,MAAzB,YAAyB,SAAzB,YAAyB;AAAA,MAAX,OAAW,SAAX,OAAW;;AAClE,SAAO,aAAa,MAAb,CAAoB,OAA3B,EAAoC,cAAc,QAAlD;AACA,SAAO,aAAa,MAAb,CAAoB,OAA3B,EAAoC,OAApC;AACD,CAHD;;AAKA,MAAM,aAAa,UAAnB,EAA+B,cAAc,KAA7C;;AAEA,aAAa,SAAb,CAAuB,aAAvB,GAAuC,UAAU,OAAV,EAAmB;AACxD,SAAO,KAAK,MAAL,CAAY,OAAnB,EAA4B,OAA5B;;AAEA,SAAO,IAAP;AACD,CAJD;;AAMA,IAAM,qBAAqB,aAAa,SAAb,CAAuB,iBAAlD;;AAEA,aAAa,SAAb,CAAuB,iBAAvB,GAA2C,UAAU,UAAV,EAAsB,QAAtB,EAAgC;AACzE,MAAM,MAAM,mBAAmB,IAAnB,CAAwB,IAAxB,EAA8B,UAA9B,EAA0C,QAA1C,CAAZ;;AAEA,MAAI,QAAQ,IAAZ,EAAkB;AAChB,SAAK,MAAL,CAAY,OAAZ,CAAoB,UAApB,IAAkC,QAAlC;AACD;;AAED,SAAO,GAAP;AACD,CARD;;AAUA,aAAa,eAAb,CAA6B,IAA7B,CAAkC,eAAlC;;;;;ACjFA,IAAM,QAAU,QAAQ,SAAR,CAAhB;AACA,IAAM,SAAU,QAAQ,gBAAR,CAAhB;AACA,IAAM,UAAU,QAAQ,iBAAR,EAA2B,GAA3B,EAAhB;;AAEA,IAAM,QAAQ;AACZ,kBADY;AAEZ,gBAFY;AAGZ,cAHY;;AAKZ;AACA,YAAU,QAAQ,oBAAR,EAA8B,QAN5B;AAOZ;AACA,aAAW,EARC;;AAUZ,eAAa,qBAAU,GAAV,EAAe,GAAf,EAAoB;AAC/B;AACA,QAAI,MAAM,QAAN,CAAe,MAAM,SAArB,EAAgC,GAAhC,CAAJ,EAA0C;AAAE,aAAO,KAAP;AAAe;;AAE3D,UAAM,OAAO,MAAM,SAAN,CAAgB,GAAhB,CAAb;;AAEA,UAAM,SAAN,CAAgB,IAAhB,CAAqB,GAArB;AACA,WAAO,SAAP,CAAiB,IAAjB,CAAsB,GAAtB;;AAEA;AACA;AACA,QAAI,QAAQ,MAAM,QAAlB,EAA4B;AAC1B,aAAO,GAAP,CAAW,GAAX,EAAgB,QAAhB,EAA0B,MAAM,cAAhC;AACD;;AAED,YAAQ,IAAR,CAAa,cAAb,EAA6B,EAAE,QAAF,EAAO,QAAP,EAA7B;AACD,GA1BW;;AA4BZ,kBAAgB,wBAAU,GAAV,EAAe,GAAf,EAAoB;AAClC,QAAM,QAAQ,MAAM,OAAN,CAAc,MAAM,SAApB,EAA+B,GAA/B,CAAd;;AAEA,UAAM,OAAO,MAAM,SAAN,CAAgB,GAAhB,CAAb;;AAEA,WAAO,MAAP,CAAc,GAAd,EAAmB,QAAnB,EAA6B,MAAM,cAAnC;;AAEA,UAAM,SAAN,CAAgB,MAAhB,CAAuB,KAAvB,EAA8B,CAA9B;AACA,WAAO,SAAP,CAAiB,MAAjB,CAAwB,KAAxB,EAA+B,CAA/B;;AAEA,YAAQ,IAAR,CAAa,iBAAb,EAAgC,EAAE,QAAF,EAAO,QAAP,EAAhC;AACD,GAvCW;;AAyCZ,kBAAgB,0BAAY;AAC1B,UAAM,cAAN,CAAqB,KAAK,QAA1B,EAAoC,IAApC;AACD;AA3CW,CAAd;;AA8CA,OAAO,OAAP,GAAiB,KAAjB;;;;;;;eClDoB,QAAQ,OAAR,C;IAAZ,O,YAAA,O;;IAEF,O;AACJ,qBAAe;AAAA;;AACb,SAAK,SAAL,GAAiB;AACf;AADe,KAAjB;AAGD;;oBAED,E,eAAI,I,EAAM,Q,EAAU;AAClB,QAAI,CAAC,KAAK,SAAL,CAAe,IAAf,CAAL,EAA2B;AACzB,WAAK,SAAL,CAAe,IAAf,IAAuB,CAAC,QAAD,CAAvB;AACA;AACD;;AAED,SAAK,SAAL,CAAe,IAAf,EAAqB,IAArB,CAA0B,QAA1B;AACD,G;;oBAED,G,gBAAK,I,EAAM,Q,EAAU;AACnB,QAAI,CAAC,KAAK,SAAL,CAAe,IAAf,CAAL,EAA2B;AAAE;AAAS;;AAEtC,QAAM,QAAQ,QAAQ,KAAK,SAAL,CAAe,IAAf,CAAR,EAA8B,QAA9B,CAAd;;AAEA,QAAI,UAAU,CAAC,CAAf,EAAkB;AAChB,WAAK,SAAL,CAAe,IAAf,EAAqB,MAArB,CAA4B,KAA5B,EAAmC,CAAnC;AACD;AACF,G;;oBAED,I,iBAAM,I,EAAM,G,EAAK;AACf,QAAM,kBAAkB,KAAK,SAAL,CAAe,IAAf,CAAxB;;AAEA,QAAI,CAAC,eAAL,EAAsB;AAAE;AAAS;;AAEjC,SAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,gBAAgB,MAApC,EAA4C,GAA5C,EAAiD;AAC/C,UAAI,gBAAgB,CAAhB,EAAmB,GAAnB,EAAwB,IAAxB,MAAkC,KAAtC,EAA6C;AAC3C;AACD;AACF;AACF,G;;;;;AAGH,QAAQ,GAAR,GAAc,YAAY;AACxB,SAAO,IAAI,OAAJ,EAAP;AACD,CAFD;;AAIA,OAAO,OAAP,GAAiB,OAAjB;;;;;AC7CA,SAAS,OAAT,CAAkB,KAAlB,EAAyB,MAAzB,EAAiC;AAC/B,OAAK,IAAI,IAAI,CAAR,EAAW,MAAM,MAAM,MAA5B,EAAoC,IAAI,GAAxC,EAA6C,GAA7C,EAAkD;AAChD,QAAI,MAAM,CAAN,MAAa,MAAjB,EAAyB;AACvB,aAAO,CAAP;AACD;AACF;;AAED,SAAO,CAAC,CAAR;AACD;;AAED,SAAS,QAAT,CAAmB,KAAnB,EAA0B,MAA1B,EAAkC;AAChC,SAAO,QAAQ,KAAR,EAAe,MAAf,MAA2B,CAAC,CAAnC;AACD;;AAED,SAAS,KAAT,CAAgB,MAAhB,EAAwB,MAAxB,EAAgC;AAC9B,OAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,OAAO,MAA3B,EAAmC,GAAnC,EAAwC;AACtC,WAAO,IAAP,CAAY,OAAO,CAAP,CAAZ;AACD;;AAED,SAAO,MAAP;AACD;;AAED,SAAS,MAAT,CAAiB,KAAjB,EAAwB,IAAxB,EAA8B;AAC5B,MAAM,SAAS,EAAf;;AAEA,OAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,MAAM,MAA1B,EAAkC,GAAlC,EAAuC;AACrC,QAAI,KAAK,MAAM,CAAN,CAAL,CAAJ,EAAoB;AAClB,aAAO,IAAP,CAAY,MAAM,CAAN,CAAZ;AACD;AACF;;AAED,SAAO,MAAP;AACD;;AAED,OAAO,OAAP,GAAiB;AACf,kBADe;AAEf,oBAFe;AAGf,cAHe;AAIf;AAJe,CAAjB;;;;;eClCmB,QAAQ,UAAR,C;IAAX,M,YAAA,M;;AACR,IAAM,KAAS,QAAQ,MAAR,CAAf;AACA,IAAM,aAAa,QAAQ,cAAR,CAAnB;;AAEA,IAAM,UAAU,WAAW,OAA3B;AACA,IAAM,YAAa,OAAO,SAA1B;;AAEA,IAAM,UAAU;AACd;AACA,iBAAe,CAAC,EAAG,kBAAkB,MAAnB,IAA8B,GAAG,QAAH,CAAY,OAAO,aAAnB,KAC1B,WAAW,QAAX,YAA+B,OAAO,aAD5C,CAFF;;AAKd;AACA,wBAAsB,CAAC,CAAC,WAAW,YANrB;;AAQd,SAAQ,iBAAiB,MAAlB,IAA6B,EAAE,sBAAsB,MAAxB,CARtB;;AAUd;AACA,iBAAgB,UAAU,OAAV,KAAsB,OAAtB,IACT,QAAQ,aADC,IAET,UAAU,SAAV,CAAoB,KAApB,CAA0B,QAA1B,CAbO;;AAed;AACA,UAAS,iBAAiB,IAAjB,CAAsB,UAAU,QAAhC,KACG,YAAY,IAAZ,CAAiB,UAAU,UAA3B,CAjBE;;AAmBd,gBAAc,aAAa,IAAb,CAAkB,UAAU,SAA5B,CAnBA;;AAqBd;AACA,2BAAyB,aAAa,QAAQ,SAArB,GACrB,SADqB,GACV,2BAA2B,QAAQ,SAAnC,GACX,uBADW,GACc,wBAAwB,QAAQ,SAAhC,GACzB,oBADyB,GACH,sBAAsB,QAAQ,SAA9B,GACtB,kBADsB,GACF,mBA1BV;;AA4Bd,8BAA4B,KA5Bd;;AA8Bd,eAAc,WAAW,YAAX,GACT,WAAW,YAAX,KAA4B,OAAO,cAAnC,GACC;AACA,QAAQ,aADR;AAEA,UAAQ,eAFR;AAGA,UAAQ,WAHR;AAIA,SAAQ,UAJR;AAKA,UAAQ,eALR;AAMA,YAAQ;AANR,GADD,GASC;AACA,QAAQ,WADR;AAEA,UAAQ,aAFR;AAGA,UAAQ,aAHR;AAIA,SAAQ,YAJR;AAKA,UAAQ,aALR;AAMA,YAAQ;AANR,GAVQ,GAkBV,IAhDU;;AAkDd;AACA,cAAY,kBAAkB,WAAW,QAA7B,GAAuC,YAAvC,GAAqD;;AAnDnD,CAAhB;;AAuDA,QAAQ,0BAAR,GAAqC,CAAC,GAAG,QAAH,CAAY,QAAQ,SAAR,CAAkB,QAAQ,uBAA1B,CAAZ,CAAtC;;AAEA,OAAO,OAAP,GAAiB,OAAjB;;;;;AChEA,IAAM,aAAa,EAAnB;AACA,IAAM,MAAM,QAAQ,UAAR,EAAoB,MAAhC;;AAEA,SAAS,KAAT,GAAkB,CAAE;;AAEpB,WAAW,QAAX,GAAgC,IAAI,QAApC;AACA,WAAW,gBAAX,GAAgC,IAAI,gBAAJ,IAA0B,KAA1D;AACA,WAAW,UAAX,GAAgC,IAAI,UAAJ,IAA0B,KAA1D;AACA,WAAW,aAAX,GAAgC,IAAI,aAAJ,IAA0B,KAA1D;AACA,WAAW,kBAAX,GAAgC,IAAI,kBAAJ,IAA0B,KAA1D;AACA,WAAW,OAAX,GAAgC,IAAI,OAAJ,IAA0B,KAA1D;AACA,WAAW,WAAX,GAAgC,IAAI,WAAJ,IAA0B,WAAW,OAArE;;AAEA,WAAW,KAAX,GAA0B,IAAI,KAA9B;AACA,WAAW,KAAX,GAA0B,IAAI,KAAJ,IAAa,KAAvC;AACA,WAAW,YAAX,GAA2B,IAAI,YAAJ,IAAoB,IAAI,cAAnD;;AAEA,OAAO,OAAP,GAAiB,UAAjB;;;;;ACjBA,IAAM,MAAa,QAAQ,UAAR,CAAnB;AACA,IAAM,UAAa,QAAQ,WAAR,CAAnB;AACA,IAAM,KAAa,QAAQ,MAAR,CAAnB;AACA,IAAM,aAAa,QAAQ,cAAR,CAAnB;;AAEA,IAAM,WAAW;AACf,gBAAc,sBAAU,MAAV,EAAkB,KAAlB,EAAyB;AACrC,WAAO,KAAP,EAAc;AACZ,UAAI,UAAU,MAAd,EAAsB;AACpB,eAAO,IAAP;AACD;;AAED,cAAQ,MAAM,UAAd;AACD;;AAED,WAAO,KAAP;AACD,GAXc;;AAaf,WAAS,iBAAU,OAAV,EAAmB,QAAnB,EAA6B;AACpC,WAAO,GAAG,OAAH,CAAW,OAAX,CAAP,EAA4B;AAC1B,UAAI,SAAS,eAAT,CAAyB,OAAzB,EAAkC,QAAlC,CAAJ,EAAiD;AAAE,eAAO,OAAP;AAAiB;;AAEpE,gBAAU,SAAS,UAAT,CAAoB,OAApB,CAAV;AACD;;AAED,WAAO,IAAP;AACD,GArBc;;AAuBf,cAAY,oBAAU,IAAV,EAAgB;AAC1B,QAAI,SAAS,KAAK,UAAlB;;AAEA,QAAI,GAAG,OAAH,CAAW,MAAX,CAAJ,EAAwB;AACtB;AACA,aAAO,CAAC,SAAS,OAAO,IAAjB,KAA0B,GAAG,OAAH,CAAW,MAAX,CAAjC,EAAqD;AACnD;AACD;;AAED,aAAO,MAAP;AACD;;AAED,WAAO,MAAP;AACD,GApCc;;AAsCf;AACA,2BAAyB,QAAQ,0BAAR,GACrB,UAAU,OAAV,EAAmB,QAAnB,EAA6B,KAA7B,EAAoC;AACpC,YAAQ,SAAS,QAAQ,UAAR,CAAmB,gBAAnB,CAAoC,QAApC,CAAjB;;AAEA,SAAK,IAAI,IAAI,CAAR,EAAW,MAAM,MAAM,MAA5B,EAAoC,IAAI,GAAxC,EAA6C,GAA7C,EAAkD;AAChD,UAAI,MAAM,CAAN,MAAa,OAAjB,EAA0B;AACxB,eAAO,IAAP;AACD;AACF;;AAED,WAAO,KAAP;AACD,GAXsB,GAYrB,IAnDW;;AAqDf,mBAAiB,yBAAU,OAAV,EAAmB,QAAnB,EAA6B,QAA7B,EAAuC;AACtD,QAAI,QAAQ,0BAAZ,EAAwC;AACtC,aAAO,SAAS,uBAAT,CAAiC,OAAjC,EAA0C,QAA1C,EAAoD,QAApD,CAAP;AACD;;AAED;AACA,QAAI,IAAI,MAAJ,KAAe,IAAI,UAAvB,EAAmC;AACjC,iBAAW,SAAS,OAAT,CAAiB,WAAjB,EAA8B,GAA9B,CAAX;AACD;;AAED,WAAO,QAAQ,QAAQ,uBAAhB,EAAyC,QAAzC,CAAP;AACD,GAhEc;;AAkEf;AACA,yBAAuB,+BAAU,QAAV,EAAoB;AACzC,QAAI,qBAAqB,EAAzB;AACA,QAAI,kBAAkB,EAAtB;AACA,QAAI,iBAAJ;AACA,QAAI,cAAc,SAAS,CAAT,CAAlB;AACA,QAAI,QAAQ,cAAa,CAAb,GAAgB,CAAC,CAA7B;AACA,QAAI,eAAJ;AACA,QAAI,cAAJ;AACA,QAAI,UAAJ;AACA,QAAI,UAAJ;;AAEA,SAAK,IAAI,CAAT,EAAY,IAAI,SAAS,MAAzB,EAAiC,GAAjC,EAAsC;AACpC,iBAAW,SAAS,CAAT,CAAX;;AAEA;AACA,UAAI,CAAC,QAAD,IAAa,aAAa,WAA9B,EAA2C;AACzC;AACD;;AAED,UAAI,CAAC,WAAL,EAAkB;AAChB,sBAAc,QAAd;AACA,gBAAQ,CAAR;AACA;AACD;;AAED;AACA;AACA,UAAI,SAAS,UAAT,KAAwB,SAAS,aAArC,EAAoD;AAClD;AACD;AACD;AAHA,WAIK,IAAI,YAAY,UAAZ,KAA2B,SAAS,aAAxC,EAAuD;AAC1D,wBAAc,QAAd;AACA,kBAAQ,CAAR;AACA;AACD;;AAED,UAAI,CAAC,mBAAmB,MAAxB,EAAgC;AAC9B,iBAAS,WAAT;AACA,eAAO,OAAO,UAAP,IAAqB,OAAO,UAAP,KAAsB,OAAO,aAAzD,EAAwE;AACtE,6BAAmB,OAAnB,CAA2B,MAA3B;AACA,mBAAS,OAAO,UAAhB;AACD;AACF;;AAED;AACA;AACA,UAAI,uBAAuB,WAAW,WAAlC,IACG,oBAAoB,WAAW,UADlC,IAEG,EAAE,oBAAoB,WAAW,aAAjC,CAFP,EAEwD;;AAEtD,YAAI,aAAa,YAAY,UAA7B,EAAyC;AACvC;AACD;;AAED,iBAAS,SAAS,eAAlB;AACD,OATD,MAUK;AACH,iBAAS,QAAT;AACD;;AAED,wBAAkB,EAAlB;;AAEA,aAAO,OAAO,UAAP,KAAsB,OAAO,aAApC,EAAmD;AACjD,wBAAgB,OAAhB,CAAwB,MAAxB;AACA,iBAAS,OAAO,UAAhB;AACD;;AAED,UAAI,CAAJ;;AAEA;AACA,aAAO,gBAAgB,CAAhB,KAAsB,gBAAgB,CAAhB,MAAuB,mBAAmB,CAAnB,CAApD,EAA2E;AACzE;AACD;;AAED,UAAM,UAAU,CACd,gBAAgB,IAAI,CAApB,CADc,EAEd,gBAAgB,CAAhB,CAFc,EAGd,mBAAmB,CAAnB,CAHc,CAAhB;;AAMA,cAAQ,QAAQ,CAAR,EAAW,SAAnB;;AAEA,aAAO,KAAP,EAAc;AACZ,YAAI,UAAU,QAAQ,CAAR,CAAd,EAA0B;AACxB,wBAAc,QAAd;AACA,kBAAQ,CAAR;AACA,+BAAqB,EAArB;;AAEA;AACD,SAND,MAOK,IAAI,UAAU,QAAQ,CAAR,CAAd,EAA0B;AAC7B;AACD;;AAED,gBAAQ,MAAM,eAAd;AACD;AACF;;AAED,WAAO,KAAP;AACD,GAvKc;;AAyKf,eAAa,qBAAU,OAAV,EAAmB,QAAnB,EAA6B,KAA7B,EAAoC;AAC/C,WAAO,GAAG,OAAH,CAAW,OAAX,CAAP,EAA4B;AAC1B,UAAI,SAAS,eAAT,CAAyB,OAAzB,EAAkC,QAAlC,CAAJ,EAAiD;AAC/C,eAAO,IAAP;AACD;;AAED,gBAAU,SAAS,UAAT,CAAoB,OAApB,CAAV;;AAEA,UAAI,YAAY,KAAhB,EAAuB;AACrB,eAAO,SAAS,eAAT,CAAyB,OAAzB,EAAkC,QAAlC,CAAP;AACD;AACF;;AAED,WAAO,KAAP;AACD,GAvLc;;AAyLf,oBAAkB,0BAAU,OAAV,EAAmB;AACnC,WAAQ,mBAAmB,WAAW,kBAA9B,GACJ,QAAQ,uBADJ,GAEJ,OAFJ;AAGD,GA7Lc;;AA+Lf,eAAa,qBAAU,cAAV,EAA0B;AACrC,qBAAiB,kBAAkB,IAAI,MAAvC;AACA,WAAO;AACL,SAAG,eAAe,OAAf,IAA0B,eAAe,QAAf,CAAwB,eAAxB,CAAwC,UADhE;AAEL,SAAG,eAAe,OAAf,IAA0B,eAAe,QAAf,CAAwB,eAAxB,CAAwC;AAFhE,KAAP;AAID,GArMc;;AAuMf,wBAAsB,8BAAU,OAAV,EAAmB;AACvC,QAAM,aAAc,mBAAmB,WAAW,UAA9B,GAChB,QAAQ,qBAAR,EADgB,GAEhB,QAAQ,cAAR,GAAyB,CAAzB,CAFJ;;AAIA,WAAO,cAAc;AACnB,YAAQ,WAAW,IADA;AAEnB,aAAQ,WAAW,KAFA;AAGnB,WAAQ,WAAW,GAHA;AAInB,cAAQ,WAAW,MAJA;AAKnB,aAAQ,WAAW,KAAX,IAAqB,WAAW,KAAX,GAAoB,WAAW,IALzC;AAMnB,cAAQ,WAAW,MAAX,IAAqB,WAAW,MAAX,GAAoB,WAAW;AANzC,KAArB;AAQD,GApNc;;AAsNf,kBAAgB,wBAAU,OAAV,EAAmB;AACjC,QAAM,aAAa,SAAS,oBAAT,CAA8B,OAA9B,CAAnB;;AAEA,QAAI,CAAC,QAAQ,MAAT,IAAmB,UAAvB,EAAmC;AACjC,UAAM,SAAS,SAAS,WAAT,CAAqB,IAAI,SAAJ,CAAc,OAAd,CAArB,CAAf;;AAEA,iBAAW,IAAX,IAAqB,OAAO,CAA5B;AACA,iBAAW,KAAX,IAAqB,OAAO,CAA5B;AACA,iBAAW,GAAX,IAAqB,OAAO,CAA5B;AACA,iBAAW,MAAX,IAAqB,OAAO,CAA5B;AACD;;AAED,WAAO,UAAP;AACD,GAnOc;;AAqOf,WAAS,iBAAU,OAAV,EAAmB;AAC1B,QAAM,OAAO,EAAb;;AAEA,WAAO,OAAP,EAAgB;AACd,WAAK,IAAL,CAAU,OAAV;AACA,gBAAU,SAAS,UAAT,CAAoB,OAApB,CAAV;AACD;;AAED,WAAO,IAAP;AACD,GA9Oc;;AAgPf,eAAa,4BAAS;AACpB,QAAI,CAAC,GAAG,MAAH,CAAU,KAAV,CAAL,EAAuB;AAAE,aAAO,KAAP;AAAe;;AAExC;AACA,eAAW,QAAX,CAAoB,aAApB,CAAkC,KAAlC;AACA,WAAO,IAAP;AACD;AAtPc,CAAjB;;AAyPA,OAAO,OAAP,GAAiB,QAAjB;;;;;AC9PA,IAAM,KAAO,QAAQ,MAAR,CAAb;AACA,IAAM,WAAW,QAAQ,YAAR,CAAjB;AACA,IAAM,UAAW,QAAQ,iBAAR,CAAjB;;eAE+B,QAAQ,UAAR,C;IAAvB,M,YAAA,M;IAAQ,S,YAAA,S;;gBACc,QAAQ,OAAR,C;IAAtB,O,aAAA,O;IAAS,Q,aAAA,Q;;AAEjB,IAAM,iBAAkB,iBAAiB,MAAlB,IAA6B,EAAE,sBAAsB,MAAxB,CAApD;AACA,IAAM,WAAiB,iBAAiB,aAAjB,GAAgC,kBAAvD;AACA,IAAM,cAAiB,iBAAiB,aAAjB,GAAgC,qBAAvD;AACA,IAAM,KAAiB,iBAAgB,IAAhB,GAAsB,EAA7C;;AAEA,IAAM,WAAoB,EAA1B;AACA,IAAM,UAAoB,EAA1B;AACA,IAAM,oBAAoB,EAA1B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAM,kBAAkB,EAAxB;;AAEA,IAAM,YAAY,EAAlB;;AAEA,IAAM,kBAAkB,CAAC,cAAD,IAAoB,YAAM;AAChD,MAAI,YAAY,KAAhB;;AAEA,SAAO,QAAP,CAAgB,aAAhB,CAA8B,KAA9B,EAAqC,gBAArC,CAAsD,MAAtD,EAA8D,IAA9D,EAAoE;AAClE,QAAI,OAAJ,GAAe;AAAE,kBAAY,IAAZ;AAAmB;AAD8B,GAApE;;AAIA,SAAO,SAAP;AACD,CAR0C,EAA3C;;AAUA,SAAS,GAAT,CAAc,OAAd,EAAuB,IAAvB,EAA6B,QAA7B,EAAuC,WAAvC,EAAoD;AAClD,MAAM,UAAU,WAAW,WAAX,CAAhB;AACA,MAAI,eAAe,QAAQ,QAAR,EAAkB,OAAlB,CAAnB;AACA,MAAI,SAAS,QAAQ,YAAR,CAAb;;AAEA,MAAI,CAAC,MAAL,EAAa;AACX,aAAS;AACP,cAAQ,EADD;AAEP,iBAAW;AAFJ,KAAT;;AAKA,mBAAe,SAAS,IAAT,CAAc,OAAd,IAAyB,CAAxC;AACA,YAAQ,IAAR,CAAa,MAAb;;AAEA,sBAAkB,IAAlB,CAAuB,iBACnB;AACA,gBAAU,EADV;AAEA,eAAU,EAFV;AAGA,gBAAU;AAHV,KADmB,GAMnB,IANJ;AAOD;;AAED,MAAI,CAAC,OAAO,MAAP,CAAc,IAAd,CAAL,EAA0B;AACxB,WAAO,MAAP,CAAc,IAAd,IAAsB,EAAtB;AACA,WAAO,SAAP;AACD;;AAED,MAAI,CAAC,SAAS,OAAO,MAAP,CAAc,IAAd,CAAT,EAA8B,QAA9B,CAAL,EAA8C;AAC5C,QAAI,YAAJ;;AAEA,QAAI,cAAJ,EAAoB;AAAA,kCACsB,kBAAkB,YAAlB,CADtB;AAAA,UACV,QADU,yBACV,QADU;AAAA,UACA,OADA,yBACA,OADA;AAAA,UACS,QADT,yBACS,QADT;;AAElB,UAAM,gBAAgB,QAAQ,QAAR,EAAkB,QAAlB,CAAtB;;AAEA,UAAM,kBAAkB,QAAQ,aAAR,KAA0B,UAAU,KAAV,EAAiB;AACjE,YAAI,CAAC,MAAM,2BAAX,EAAwC;AACtC,gBAAM,MAAN,GAAe,MAAM,UAArB;AACA,gBAAM,aAAN,GAAsB,OAAtB;;AAEA,gBAAM,cAAN,GAAiC,MAAM,cAAN,IAAkC,UAAnE;AACA,gBAAM,eAAN,GAAiC,MAAM,eAAN,IAAkC,QAAnE;AACA,gBAAM,wBAAN,GAAiC,MAAM,wBAAN,IAAkC,WAAnE;;AAEA,cAAI,cAAc,IAAd,CAAmB,MAAM,IAAzB,CAAJ,EAAoC;AAClC,kBAAM,KAAN,GAAc,MAAM,OAAN,GAAgB,UAAU,OAAV,EAAmB,QAAnB,CAA4B,eAA5B,CAA4C,UAA1E;AACA,kBAAM,KAAN,GAAc,MAAM,OAAN,GAAgB,UAAU,OAAV,EAAmB,QAAnB,CAA4B,eAA5B,CAA4C,SAA1E;AACD;;AAED,mBAAS,KAAT;AACD;AACF,OAhBD;;AAkBA,YAAM,QAAQ,QAAR,EAAkB,KAAK,IAAvB,EAA6B,eAA7B,EAA8C,CAAC,CAAC,QAAQ,OAAxD,CAAN;;AAEA,UAAI,kBAAkB,CAAC,CAAvB,EAA0B;AACxB,iBAAS,IAAT,CAAc,QAAd;AACA,gBAAQ,IAAR,CAAa,eAAb;AACA,iBAAS,IAAT,CAAc,CAAd;AACD,OAJD,MAKK;AACH,iBAAS,aAAT;AACD;AACF,KAhCD,MAiCK;AACH,YAAM,QAAQ,QAAR,EAAkB,IAAlB,EAAwB,QAAxB,EAAkC,kBAAiB,OAAjB,GAA2B,CAAC,CAAC,QAAQ,OAAvE,CAAN;AACD;AACD,WAAO,MAAP,CAAc,IAAd,EAAoB,IAApB,CAAyB,QAAzB;;AAEA,WAAO,GAAP;AACD;AACF;;AAED,SAAS,MAAT,CAAiB,OAAjB,EAA0B,IAA1B,EAAgC,QAAhC,EAA0C,WAA1C,EAAuD;AACrD,MAAM,UAAU,WAAW,WAAX,CAAhB;AACA,MAAM,eAAe,QAAQ,QAAR,EAAkB,OAAlB,CAArB;AACA,MAAM,SAAS,QAAQ,YAAR,CAAf;;AAEA,MAAI,CAAC,MAAD,IAAW,CAAC,OAAO,MAAvB,EAA+B;AAC7B;AACD;;AAED,MAAI,kBAAkB,QAAtB;AACA,MAAI,kBAAJ;AACA,MAAI,sBAAJ;;AAEA,MAAI,cAAJ,EAAoB;AAClB,gBAAY,kBAAkB,YAAlB,CAAZ;AACA,oBAAgB,QAAQ,UAAU,QAAlB,EAA4B,QAA5B,CAAhB;AACA,sBAAkB,UAAU,OAAV,CAAkB,aAAlB,CAAlB;AACD;;AAED,MAAI,SAAS,KAAb,EAAoB;AAClB,SAAK,IAAL,IAAa,OAAO,MAApB,EAA4B;AAC1B,UAAI,OAAO,MAAP,CAAc,cAAd,CAA6B,IAA7B,CAAJ,EAAwC;AACtC,eAAO,OAAP,EAAgB,IAAhB,EAAsB,KAAtB;AACD;AACF;AACD;AACD;;AAED,MAAI,OAAO,MAAP,CAAc,IAAd,CAAJ,EAAyB;AACvB,QAAM,MAAM,OAAO,MAAP,CAAc,IAAd,EAAoB,MAAhC;;AAEA,QAAI,aAAa,KAAjB,EAAwB;AACtB,WAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,GAApB,EAAyB,GAAzB,EAA8B;AAC5B,eAAO,OAAP,EAAgB,IAAhB,EAAsB,OAAO,MAAP,CAAc,IAAd,EAAoB,CAApB,CAAtB,EAA8C,OAA9C;AACD;AACD;AACD,KALD,MAMK;AACH,WAAK,IAAI,KAAI,CAAb,EAAgB,KAAI,GAApB,EAAyB,IAAzB,EAA8B;AAC5B,YAAI,OAAO,MAAP,CAAc,IAAd,EAAoB,EAApB,MAA2B,QAA/B,EAAyC;AACvC,kBAAQ,WAAR,EAAqB,KAAK,IAA1B,EAAgC,eAAhC,EAAiD,kBAAiB,OAAjB,GAA2B,CAAC,CAAC,QAAQ,OAAtF;AACA,iBAAO,MAAP,CAAc,IAAd,EAAoB,MAApB,CAA2B,EAA3B,EAA8B,CAA9B;;AAEA,cAAI,kBAAkB,SAAtB,EAAiC;AAC/B,sBAAU,QAAV,CAAmB,aAAnB;AACA,gBAAI,UAAU,QAAV,CAAmB,aAAnB,MAAsC,CAA1C,EAA6C;AAC3C,wBAAU,QAAV,CAAmB,MAAnB,CAA0B,aAA1B,EAAyC,CAAzC;AACA,wBAAU,OAAV,CAAkB,MAAlB,CAAyB,aAAzB,EAAwC,CAAxC;AACA,wBAAU,QAAV,CAAmB,MAAnB,CAA0B,aAA1B,EAAyC,CAAzC;AACD;AACF;;AAED;AACD;AACF;AACF;;AAED,QAAI,OAAO,MAAP,CAAc,IAAd,KAAuB,OAAO,MAAP,CAAc,IAAd,EAAoB,MAApB,KAA+B,CAA1D,EAA6D;AAC3D,aAAO,MAAP,CAAc,IAAd,IAAsB,IAAtB;AACA,aAAO,SAAP;AACD;AACF;;AAED,MAAI,CAAC,OAAO,SAAZ,EAAuB;AACrB,YAAQ,MAAR,CAAe,YAAf,EAA6B,CAA7B;AACA,aAAS,MAAT,CAAgB,YAAhB,EAA8B,CAA9B;AACA,sBAAkB,MAAlB,CAAyB,YAAzB,EAAuC,CAAvC;AACD;AACF;;AAED,SAAS,WAAT,CAAsB,QAAtB,EAAgC,OAAhC,EAAyC,IAAzC,EAA+C,QAA/C,EAAyD,WAAzD,EAAsE;AACpE,MAAM,UAAU,WAAW,WAAX,CAAhB;AACA,MAAI,CAAC,gBAAgB,IAAhB,CAAL,EAA4B;AAC1B,oBAAgB,IAAhB,IAAwB;AACtB,iBAAW,EADW;AAEtB,gBAAW,EAFW;AAGtB,iBAAW;AAHW,KAAxB;;AAMA;AACA,SAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,UAAU,MAA9B,EAAsC,GAAtC,EAA2C;AACzC,UAAI,UAAU,CAAV,CAAJ,EAAkB,IAAlB,EAAwB,gBAAxB;AACA,UAAI,UAAU,CAAV,CAAJ,EAAkB,IAAlB,EAAwB,kBAAxB,EAA4C,IAA5C;AACD;AACF;;AAED,MAAM,YAAY,gBAAgB,IAAhB,CAAlB;AACA,MAAI,cAAJ;;AAEA,OAAK,QAAQ,UAAU,SAAV,CAAoB,MAApB,GAA6B,CAA1C,EAA6C,SAAS,CAAtD,EAAyD,OAAzD,EAAkE;AAChE,QAAI,UAAU,SAAV,CAAoB,KAApB,MAA+B,QAA/B,IACG,UAAU,QAAV,CAAmB,KAAnB,MAA8B,OADrC,EAC8C;AAC5C;AACD;AACF;;AAED,MAAI,UAAU,CAAC,CAAf,EAAkB;AAChB,YAAQ,UAAU,SAAV,CAAoB,MAA5B;;AAEA,cAAU,SAAV,CAAoB,IAApB,CAAyB,QAAzB;AACA,cAAU,QAAV,CAAoB,IAApB,CAAyB,OAAzB;AACA,cAAU,SAAV,CAAoB,IAApB,CAAyB,EAAzB;AACD;;AAED;AACA,YAAU,SAAV,CAAoB,KAApB,EAA2B,IAA3B,CAAgC,CAAC,QAAD,EAAW,CAAC,CAAC,QAAQ,OAArB,EAA8B,QAAQ,OAAtC,CAAhC;AACD;;AAED,SAAS,cAAT,CAAyB,QAAzB,EAAmC,OAAnC,EAA4C,IAA5C,EAAkD,QAAlD,EAA4D,WAA5D,EAAyE;AACvE,MAAM,UAAU,WAAW,WAAX,CAAhB;AACA,MAAM,YAAY,gBAAgB,IAAhB,CAAlB;AACA,MAAI,aAAa,KAAjB;AACA,MAAI,cAAJ;;AAEA,MAAI,CAAC,SAAL,EAAgB;AAAE;AAAS;;AAE3B;AACA,OAAK,QAAQ,UAAU,SAAV,CAAoB,MAApB,GAA6B,CAA1C,EAA6C,SAAS,CAAtD,EAAyD,OAAzD,EAAkE;AAChE;AACA,QAAI,UAAU,SAAV,CAAoB,KAApB,MAA+B,QAA/B,IACG,UAAU,QAAV,CAAmB,KAAnB,MAA8B,OADrC,EAC8C;;AAE5C,UAAM,YAAY,UAAU,SAAV,CAAoB,KAApB,CAAlB;;AAEA;AACA,WAAK,IAAI,IAAI,UAAU,MAAV,GAAmB,CAAhC,EAAmC,KAAK,CAAxC,EAA2C,GAA3C,EAAgD;AAAA,2BACf,UAAU,CAAV,CADe;AAAA,YACvC,EADuC;AAAA,YACnC,OADmC;AAAA,YAC1B,OAD0B;;AAG9C;;AACA,YAAI,OAAO,QAAP,IAAmB,YAAY,CAAC,CAAC,QAAQ,OAAzC,IAAoD,YAAY,QAAQ,OAA5E,EAAqF;AACnF;AACA,oBAAU,MAAV,CAAiB,CAAjB,EAAoB,CAApB;;AAEA;AACA;AACA,cAAI,CAAC,UAAU,MAAf,EAAuB;AACrB,sBAAU,SAAV,CAAoB,MAApB,CAA2B,KAA3B,EAAkC,CAAlC;AACA,sBAAU,QAAV,CAAoB,MAApB,CAA2B,KAA3B,EAAkC,CAAlC;AACA,sBAAU,SAAV,CAAoB,MAApB,CAA2B,KAA3B,EAAkC,CAAlC;;AAEA;AACA,mBAAO,OAAP,EAAgB,IAAhB,EAAsB,gBAAtB;AACA,mBAAO,OAAP,EAAgB,IAAhB,EAAsB,kBAAtB,EAA0C,IAA1C;;AAEA;AACA,gBAAI,CAAC,UAAU,SAAV,CAAoB,MAAzB,EAAiC;AAC/B,8BAAgB,IAAhB,IAAwB,IAAxB;AACD;AACF;;AAED;AACA,uBAAa,IAAb;AACA;AACD;AACF;;AAED,UAAI,UAAJ,EAAgB;AAAE;AAAQ;AAC3B;AACF;AACF;;AAED;AACA;AACA,SAAS,gBAAT,CAA2B,KAA3B,EAAkC,WAAlC,EAA+C;AAC7C,MAAM,UAAU,WAAW,WAAX,CAAhB;AACA,MAAM,YAAY,EAAlB;AACA,MAAM,YAAY,gBAAgB,MAAM,IAAtB,CAAlB;AACA,MAAM,cAAe,SAAS,gBAAT,CAA0B,MAAM,IAAN,GAC3C,MAAM,IAAN,CAAW,CAAX,CAD2C,GAE3C,MAAM,MAFW,CAArB;AAGA,MAAI,UAAU,WAAd;;AAEA;AACA,UAAQ,SAAR,EAAmB,KAAnB;;AAEA,YAAU,aAAV,GAA0B,KAA1B;AACA,YAAU,cAAV,GAA2B,sBAA3B;;AAEA;AACA,SAAO,GAAG,OAAH,CAAW,OAAX,CAAP,EAA4B;AAC1B,SAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,UAAU,SAAV,CAAoB,MAAxC,EAAgD,GAAhD,EAAqD;AACnD,UAAM,WAAW,UAAU,SAAV,CAAoB,CAApB,CAAjB;AACA,UAAM,UAAU,UAAU,QAAV,CAAmB,CAAnB,CAAhB;;AAEA,UAAI,SAAS,eAAT,CAAyB,OAAzB,EAAkC,QAAlC,KACG,SAAS,YAAT,CAAsB,OAAtB,EAA+B,WAA/B,CADH,IAEG,SAAS,YAAT,CAAsB,OAAtB,EAA+B,OAA/B,CAFP,EAEgD;;AAE9C,YAAM,YAAY,UAAU,SAAV,CAAoB,CAApB,CAAlB;;AAEA,kBAAU,aAAV,GAA0B,OAA1B;;AAEA,aAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,UAAU,MAA9B,EAAsC,GAAtC,EAA2C;AAAA,6BACV,UAAU,CAAV,CADU;AAAA,cAClC,EADkC;AAAA,cAC9B,OAD8B;AAAA,cACrB,OADqB;;;AAGzC,cAAI,YAAY,CAAC,CAAC,QAAQ,OAAtB,IAAiC,YAAY,QAAQ,OAAzD,EAAkE;AAChE,eAAG,SAAH;AACD;AACF;AACF;AACF;;AAED,cAAU,SAAS,UAAT,CAAoB,OAApB,CAAV;AACD;AACF;;AAED,SAAS,kBAAT,CAA6B,KAA7B,EAAoC;AAClC,SAAO,iBAAiB,IAAjB,CAAsB,IAAtB,EAA4B,KAA5B,EAAmC,IAAnC,CAAP;AACD;;AAED,SAAS,UAAT,GAAuB;AACrB,OAAK,WAAL,GAAmB,KAAnB;AACD;;AAED,SAAS,sBAAT,GAAmC;AACjC,OAAK,aAAL,CAAmB,cAAnB;AACD;;AAED,SAAS,QAAT,GAAqB;AACnB,OAAK,YAAL,GAAoB,IAApB;AACD;;AAED,SAAS,WAAT,GAAwB;AACtB,OAAK,YAAL,GAAoB,IAApB;AACA,OAAK,2BAAL,GAAmC,IAAnC;AACD;;AAED,SAAS,UAAT,CAAqB,KAArB,EAA4B;AAC1B,SAAO,GAAG,MAAH,CAAU,KAAV,IAAkB,KAAlB,GAA0B,EAAE,SAAS,KAAX,EAAjC;AACD;;AAED,OAAO,OAAP,GAAiB;AACf,UADe;AAEf,gBAFe;;AAIf,0BAJe;AAKf,gCALe;;AAOf,oCAPe;AAQf,wCARe;AASf,kCATe;AAUf,sBAVe;;AAYf,gCAZe;AAaf,kCAbe;;AAef,aAAW,QAfI;AAgBf,YAAU,OAhBK;AAiBf,sBAAoB;AAjBL,CAAjB;;;;;ACrVA,OAAO,OAAP,GAAiB,SAAS,MAAT,CAAiB,IAAjB,EAAuB,MAAvB,EAA+B;AAC9C,OAAK,IAAM,IAAX,IAAmB,MAAnB,EAA2B;AACzB,SAAK,IAAL,IAAa,OAAO,IAAP,CAAb;AACD;AACD,SAAO,IAAP;AACD,CALD;;;;;eCGI,QAAQ,QAAR,C;IAFF,e,YAAA,e;IACA,Q,YAAA,Q;;AAGF,OAAO,OAAP,GAAiB,UAAU,MAAV,EAAkB,OAAlB,EAA2B,MAA3B,EAAmC;AAClD,MAAM,gBAAgB,OAAO,OAAP,CAAe,MAAf,CAAtB;AACA,MAAM,eAAe,iBAAiB,cAAc,MAApD;AACA,MAAM,SAAS,gBAAgB,OAAO,OAAP,CAAe,MAA9C;;AAEA,MAAM,aAAa,gBAAgB,MAAhB,EAAwB,MAAxB,EAAgC,OAAhC,EAAyC,CAAC,UAAU,OAAX,CAAzC,CAAnB;;AAEA,SAAO,SAAS,UAAT,KAAwB,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EAA/B;AACD,CARD;;;;;ACLA,OAAO,OAAP,GAAiB,UAAC,CAAD,EAAI,CAAJ;AAAA,SAAW,KAAK,IAAL,CAAU,IAAI,CAAJ,GAAQ,IAAI,CAAtB,CAAX;AAAA,CAAjB;;;;;ACAA,IAAM,SAAS,QAAQ,UAAR,CAAf;AACA,IAAM,MAAS,QAAQ,UAAR,CAAf;;AAEA,IAAM,QAAQ;AACZ,YAAU,kBAAU,MAAV,EAAkB,OAAlB,EAA2B;AACnC,QAAI,SAAS,KAAb;;AAEA,WAAO,YAAY;AACjB,UAAI,CAAC,MAAL,EAAa;AACX,YAAI,MAAJ,CAAW,OAAX,CAAmB,IAAnB,CAAwB,OAAxB;AACA,iBAAS,IAAT;AACD;;AAED,aAAO,OAAO,KAAP,CAAa,IAAb,EAAmB,SAAnB,CAAP;AACD,KAPD;AAQD,GAZW;;AAcZ;AACA,oBAAkB,0BAAU,CAAV,EAAa,EAAb,EAAiB,EAAjB,EAAqB,EAArB,EAAyB;AACzC,QAAM,KAAK,IAAI,CAAf;AACA,WAAO,KAAK,EAAL,GAAU,EAAV,GAAe,IAAI,EAAJ,GAAS,CAAT,GAAa,EAA5B,GAAiC,IAAI,CAAJ,GAAQ,EAAhD;AACD,GAlBW;;AAoBZ,0BAAwB,gCAAU,MAAV,EAAkB,MAAlB,EAA0B,GAA1B,EAA+B,GAA/B,EAAoC,IAApC,EAA0C,IAA1C,EAAgD,QAAhD,EAA0D;AAChF,WAAO;AACL,SAAI,MAAM,gBAAN,CAAuB,QAAvB,EAAiC,MAAjC,EAAyC,GAAzC,EAA8C,IAA9C,CADC;AAEL,SAAI,MAAM,gBAAN,CAAuB,QAAvB,EAAiC,MAAjC,EAAyC,GAAzC,EAA8C,IAA9C;AAFC,KAAP;AAID,GAzBW;;AA2BZ;AACA,eAAa,qBAAU,CAAV,EAAa,CAAb,EAAgB,CAAhB,EAAmB,CAAnB,EAAsB;AACjC,SAAK,CAAL;AACA,WAAO,CAAC,CAAD,GAAK,CAAL,IAAQ,IAAE,CAAV,IAAe,CAAtB;AACD,GA/BW;;AAiCZ,cAAY,oBAAU,IAAV,EAAgB,GAAhB,EAAqB;AAC/B,SAAK,IAAL,GAAa,IAAI,IAAjB;AACA,SAAK,IAAL,GAAa,IAAI,IAAjB;AACA,SAAK,KAAL,GAAa,IAAI,KAAjB;;AAEA,WAAO,IAAP;AACD,GAvCW;;AAyCZ,MAAa,QAAQ,MAAR,CAzCD;AA0CZ,UAAa,MA1CD;AA2CZ,SAAa,QAAQ,SAAR,CA3CD;AA4CZ,eAAa,QAAQ,eAAR;AA5CD,CAAd;;AA+CA,OAAO,KAAP,EAAc,QAAQ,OAAR,CAAd;AACA,OAAO,KAAP,EAAc,QAAQ,YAAR,CAAd;AACA,OAAO,KAAP,EAAc,QAAQ,gBAAR,CAAd;AACA,OAAO,KAAP,EAAc,QAAQ,QAAR,CAAd;;AAEA,OAAO,OAAP,GAAiB,KAAjB;;;;;ACvDA,IAAM,QAAU,QAAQ,UAAR,CAAhB;AACA,IAAM,QAAU,QAAQ,SAAR,CAAhB;AACA,IAAM,UAAU,QAAQ,WAAR,CAAhB;;AAEA,IAAM,SAAS;AACb,eAAa,CAAE,kBAAF,EAAsB,OAAtB,EAA+B,YAA/B,EAA6C,MAA7C,CADA;;AAGb,UAAQ,gBAAU,OAAV,EAAmB,SAAnB,EAA8B,WAA9B,EAA2C;AACjD,QAAM,aAAc,SAAS,IAAT,CAAc,QAAQ,WAAR,IAAuB,SAArC;AACA;AADA,OAEG,QAAQ,WAAR,KAAwB,CAF/C;AAGA,QAAM,YAAY,MAAM,YAAN,CAAmB,OAAnB,CAAlB;AACA,QAAM,UAAU,EAAE,gBAAF,EAAW,oBAAX,EAAsB,sBAAtB,EAAkC,oBAAlC,EAA6C,wBAA7C,EAAhB;;AAEA,yBAAqB,OAAO,WAA5B,kHAAyC;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAA9B,MAA8B;;AACvC,UAAM,cAAc,OAAO,MAAP,EAAe,OAAf,CAApB;;AAEA,UAAI,WAAJ,EAAiB;AACf,eAAO,WAAP;AACD;AACF;AACF,GAjBY;;AAmBb;AACA,oBAAkB,iCAAkD;AAAA,QAAtC,UAAsC,SAAtC,UAAsC;AAAA,QAA1B,SAA0B,SAA1B,SAA0B;AAAA,QAAf,WAAe,SAAf,WAAe;;AAClE,QAAI,CAAC,cAAc,IAAd,CAAmB,SAAnB,CAAL,EAAoC;AAClC,aAAO,IAAP;AACD;;AAED,0BAA0B,MAAM,YAAhC,yHAA8C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAAnC,WAAmC;;AAC5C,UAAI,UAAU,WAAd;;AAEA,UAAI,YAAY,UAAZ,IAA0B,YAAY,UAAZ,CAAuB,WAAjD,IACI,YAAY,KAAZ,KAAsB,UAD9B,EAC2C;AACzC,eAAO,OAAP,EAAgB;AACd;AACA,cAAI,YAAY,YAAY,OAA5B,EAAqC;AACnC,mBAAO,WAAP;AACD;AACD,oBAAU,MAAM,UAAN,CAAiB,OAAjB,CAAV;AACD;AACF;AACF;;AAED,WAAO,IAAP;AACD,GAzCY;;AA2Cb;AACA,SAAO,sBAAgD;AAAA,QAApC,SAAoC,SAApC,SAAoC;AAAA,QAAzB,UAAyB,SAAzB,UAAyB;AAAA,QAAb,SAAa,SAAb,SAAa;;AACrD,QAAI,CAAC,UAAD,KAAgB,QAAQ,aAAR,IAAyB,QAAQ,oBAAjD,CAAJ,EAA4E;AAC1E,aAAO,IAAP;AACD;;AAED,QAAI,uBAAJ;;AAEA,0BAA0B,MAAM,YAAhC,yHAA8C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAAnC,WAAmC;;AAC5C,UAAI,YAAY,KAAhB,EAAuB;AACrB;AACA,YAAI,YAAY,UAAZ,IAA0B,CAAC,MAAM,QAAN,CAAe,YAAY,UAA3B,EAAuC,SAAvC,CAA/B,EAAkF;AAAE;AAAW;;AAE/F;AACA,YAAI,YAAY,WAAZ,EAAJ,EAA+B;AAC7B,iBAAO,WAAP;AACD;AACD;AAHA,aAIK,IAAI,CAAC,cAAL,EAAqB;AACxB,6BAAiB,WAAjB;AACD;AACF;AACF;;AAED;AACA;AACA,QAAI,cAAJ,EAAoB;AAClB,aAAO,cAAP;AACD;;AAED;AACA;AACA;AACA,0BAA0B,MAAM,YAAhC,yHAA8C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAAnC,YAAmC;;AAC5C,UAAI,aAAY,KAAZ,IAAqB,EAAE,OAAO,IAAP,CAAY,SAAZ,KAA0B,aAAY,UAAxC,CAAzB,EAA8E;AAC5E,eAAO,YAAP;AACD;AACF;;AAED,WAAO,IAAP;AACD,GAnFY;;AAqFb;AACA,cAAY,2BAAyB;AAAA,QAAb,SAAa,SAAb,SAAa;;AACnC,0BAA0B,MAAM,YAAhC,yHAA8C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAAnC,WAAmC;;AAC5C,UAAI,MAAM,QAAN,CAAe,YAAY,UAA3B,EAAuC,SAAvC,CAAJ,EAAuD;AACrD,eAAO,WAAP;AACD;AACF;AACF,GA5FY;;AA8Fb;AACA,QAAM,qBAA0B;AAAA,QAAd,UAAc,SAAd,UAAc;;AAC9B,0BAA0B,MAAM,YAAhC,yHAA8C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAAnC,WAAmC;;AAC5C;AACA,UAAI,YAAY,UAAZ,CAAuB,MAAvB,KAAkC,CAAtC,EAAyC;AACvC,YAAM,SAAS,YAAY,MAA3B;AACA;AACA;AACA,YAAI,UAAU,CAAC,OAAO,OAAP,CAAe,OAAf,CAAuB,OAAtC,EAA+C;AAC7C;AACD;AACF;AACD;AARA,WASK,IAAI,YAAY,UAAZ,CAAuB,MAAvB,IAAiC,CAArC,EAAwC;AAC3C;AACD;;AAED,UAAI,CAAC,YAAY,WAAZ,EAAD,IAA+B,eAAe,YAAY,KAA9D,EAAsE;AACpE,eAAO,WAAP;AACD;AACF;;AAED,WAAO,IAAP;AACD;AArHY,CAAf;;AAwHA,OAAO,OAAP,GAAiB,MAAjB;;;;;;;AC5HA,IAAM,MAAa,QAAQ,UAAR,CAAnB;AACA,IAAM,WAAa,QAAQ,YAAR,CAAnB;;AAEA,IAAM,KAAK;AACT,SAAU,iBAAM,CAAE,CADT;;AAGT,UAAU;AAAA,WAAS,UAAU,IAAI,MAAd,IAAwB,SAAS,KAAT,CAAjC;AAAA,GAHD;;AAKT,WAAU;AAAA,WAAS,GAAG,MAAH,CAAU,KAAV,KAAoB,MAAM,QAAN,KAAmB,EAAhD;AAAA,GALD;;AAOT,UAAU;AAAA,WAAS,CAAC,CAAC,KAAF,IAAY,QAAO,KAAP,yCAAO,KAAP,OAAiB,QAAtC;AAAA,GAPD;;AAST,YAAU;AAAA,WAAS,OAAO,KAAP,KAAiB,UAA1B;AAAA,GATD;;AAWT,UAAU;AAAA,WAAS,OAAO,KAAP,KAAiB,QAA1B;AAAA,GAXD;;AAaT,QAAU;AAAA,WAAS,OAAO,KAAP,KAAiB,SAA1B;AAAA,GAbD;;AAeT,UAAU;AAAA,WAAS,OAAO,KAAP,KAAiB,QAA1B;AAAA,GAfD;;AAiBT,WAAS,wBAAS;AAChB,QAAI,CAAC,KAAD,IAAW,QAAO,KAAP,yCAAO,KAAP,OAAiB,QAAhC,EAA2C;AAAE,aAAO,KAAP;AAAe;;AAE5D,QAAM,UAAU,IAAI,SAAJ,CAAc,KAAd,KAAwB,IAAI,MAA5C;;AAEA,WAAQ,mBAAkB,IAAlB,SAA8B,QAAQ,OAAtC,KACJ,iBAAiB,QAAQ,OADrB,CAC6B;AAD7B,QAEJ,MAAM,QAAN,KAAmB,CAAnB,IAAwB,OAAO,MAAM,QAAb,KAA0B;AAFtD;AAGD;AAzBQ,CAAX;;AA4BA,GAAG,KAAH,GAAW;AAAA,SAAU,GAAG,MAAH,CAAU,KAAV,KACf,OAAO,MAAM,MAAb,KAAwB,WADT,IAEhB,GAAG,QAAH,CAAY,MAAM,MAAlB,CAFM;AAAA,CAAX;;AAIA,OAAO,OAAP,GAAiB,EAAjB;;;;;ACnCA,OAAO,OAAP,GAAiB,UAAC,KAAD;AAAA,SAAW,CAAC,EAAE,SAAS,MAAM,MAAjB,CAAD,IAA8B,iBAAiB,MAAM,MAAhE;AAAA,CAAjB;;;;;ACAA,SAAS,aAAT,CAAwB,IAAxB,EAA8B,MAA9B,EAAsC;AACpC,OAAK,IAAM,IAAX,IAAmB,MAAnB,EAA2B;AACzB,QAAM,kBAAkB,OAAO,OAAP,CAAe,eAAvC;AACA,QAAI,aAAa,KAAjB;;AAEA;AACA,SAAK,IAAM,MAAX,IAAqB,eAArB,EAAsC;AACpC,UAAI,KAAK,OAAL,CAAa,MAAb,MAAyB,CAAzB,IAA8B,gBAAgB,MAAhB,EAAwB,IAAxB,CAA6B,IAA7B,CAAlC,EAAsE;AACpE,qBAAa,IAAb;AACA;AACD;AACF;;AAED,QAAI,CAAC,UAAD,IAAe,OAAO,OAAO,IAAP,CAAP,KAAwB,UAA3C,EAAuD;AACrD,WAAK,IAAL,IAAa,OAAO,IAAP,CAAb;AACD;AACF;AACD,SAAO,IAAP;AACD;;AAED,cAAc,eAAd,GAAgC;AAC9B,UAAQ;AADsB,CAAhC;;AAIA,OAAO,OAAP,GAAiB,aAAjB;;;;;ACxBA,IAAM,QAAgB,QAAQ,SAAR,CAAtB;AACA,IAAM,UAAgB,QAAQ,WAAR,CAAtB;AACA,IAAM,MAAgB,QAAQ,cAAR,CAAtB;AACA,IAAM,WAAgB,QAAQ,YAAR,CAAtB;AACA,IAAM,KAAgB,QAAQ,MAAR,CAAtB;AACA,IAAM,gBAAgB,QAAQ,iBAAR,CAAtB;;AAEA,IAAM,eAAe;AACnB,cAAY,oBAAU,IAAV,EAAgB,GAAhB,EAAqB;AAC/B,SAAK,IAAL,GAAY,KAAK,IAAL,IAAa,EAAzB;AACA,SAAK,IAAL,CAAU,CAAV,GAAc,IAAI,IAAJ,CAAS,CAAvB;AACA,SAAK,IAAL,CAAU,CAAV,GAAc,IAAI,IAAJ,CAAS,CAAvB;;AAEA,SAAK,MAAL,GAAc,KAAK,MAAL,IAAe,EAA7B;AACA,SAAK,MAAL,CAAY,CAAZ,GAAgB,IAAI,MAAJ,CAAW,CAA3B;AACA,SAAK,MAAL,CAAY,CAAZ,GAAgB,IAAI,MAAJ,CAAW,CAA3B;;AAEA,SAAK,SAAL,GAAiB,IAAI,SAArB;AACD,GAXkB;;AAanB,kBAAgB,wBAAU,SAAV,EAAqB,IAArB,EAA2B,GAA3B,EAAgC;AAC9C,cAAU,IAAV,CAAe,CAAf,GAAsB,IAAI,IAAJ,CAAS,CAAT,GAAgB,KAAK,IAAL,CAAU,CAAhD;AACA,cAAU,IAAV,CAAe,CAAf,GAAsB,IAAI,IAAJ,CAAS,CAAT,GAAgB,KAAK,IAAL,CAAU,CAAhD;AACA,cAAU,MAAV,CAAiB,CAAjB,GAAsB,IAAI,MAAJ,CAAW,CAAX,GAAgB,KAAK,MAAL,CAAY,CAAlD;AACA,cAAU,MAAV,CAAiB,CAAjB,GAAsB,IAAI,MAAJ,CAAW,CAAX,GAAgB,KAAK,MAAL,CAAY,CAAlD;AACA,cAAU,SAAV,GAAsB,IAAI,SAAJ,GAAgB,KAAK,SAA3C;;AAEA;AACA,QAAM,KAAK,KAAK,GAAL,CAAS,UAAU,SAAV,GAAsB,IAA/B,EAAqC,KAArC,CAAX;;AAEA,cAAU,IAAV,CAAe,KAAf,GAAyB,MAAM,UAAU,IAAV,CAAe,CAArB,EAAwB,UAAU,IAAV,CAAe,CAAvC,IAA4C,EAArE;AACA,cAAU,IAAV,CAAe,EAAf,GAAyB,UAAU,IAAV,CAAe,CAAf,GAAmB,EAA5C;AACA,cAAU,IAAV,CAAe,EAAf,GAAyB,UAAU,IAAV,CAAe,CAAf,GAAmB,EAA5C;;AAEA,cAAU,MAAV,CAAiB,KAAjB,GAAyB,MAAM,UAAU,MAAV,CAAiB,CAAvB,EAA0B,UAAU,IAAV,CAAe,CAAzC,IAA8C,EAAvE;AACA,cAAU,MAAV,CAAiB,EAAjB,GAAyB,UAAU,MAAV,CAAiB,CAAjB,GAAqB,EAA9C;AACA,cAAU,MAAV,CAAiB,EAAjB,GAAyB,UAAU,MAAV,CAAiB,CAAjB,GAAqB,EAA9C;AACD,GA9BkB;;AAgCnB,mBAAiB,yBAAW,OAAX,EAAoB;AACnC,WAAQ,mBAAmB,IAAI,KAAvB,IAAgC,mBAAmB,IAAI,KAA/D;AACD,GAlCkB;;AAoCnB;AACA,SAAO,eAAU,IAAV,EAAgB,OAAhB,EAAyB,EAAzB,EAA6B;AAClC,SAAK,MAAM,EAAX;AACA,WAAO,QAAQ,MAAf;;AAEA,OAAG,CAAH,GAAO,QAAQ,OAAO,GAAf,CAAP;AACA,OAAG,CAAH,GAAO,QAAQ,OAAO,GAAf,CAAP;;AAEA,WAAO,EAAP;AACD,GA7CkB;;AA+CnB,aAAW,mBAAU,OAAV,EAAmB,IAAnB,EAAyB;AAClC,WAAO,QAAQ,EAAf;;AAEA;AACA,QAAI,QAAQ,aAAR,IAAyB,aAAa,eAAb,CAA6B,OAA7B,CAA7B,EAAoE;AAClE,mBAAa,KAAb,CAAmB,QAAnB,EAA6B,OAA7B,EAAsC,IAAtC;;AAEA,WAAK,CAAL,IAAU,OAAO,OAAjB;AACA,WAAK,CAAL,IAAU,OAAO,OAAjB;AACD,KALD,MAMK;AACH,mBAAa,KAAb,CAAmB,MAAnB,EAA2B,OAA3B,EAAoC,IAApC;AACD;;AAED,WAAO,IAAP;AACD,GA9DkB;;AAgEnB,eAAa,qBAAU,OAAV,EAAmB,MAAnB,EAA2B;AACtC,aAAS,UAAU,EAAnB;;AAEA,QAAI,QAAQ,aAAR,IAAyB,aAAa,eAAb,CAA6B,OAA7B,CAA7B,EAAoE;AAClE;AACA,mBAAa,KAAb,CAAmB,QAAnB,EAA6B,OAA7B,EAAsC,MAAtC;AACD,KAHD,MAIK;AACH,mBAAa,KAAb,CAAmB,QAAnB,EAA6B,OAA7B,EAAsC,MAAtC;AACD;;AAED,WAAO,MAAP;AACD,GA5EkB;;AA8EnB,gBAAc,sBAAU,OAAV,EAAmB;AAC/B,WAAO,GAAG,MAAH,CAAU,QAAQ,SAAlB,IAA8B,QAAQ,SAAtC,GAAkD,QAAQ,UAAjE;AACD,GAhFkB;;AAkFnB,aAAW,mBAAU,SAAV,EAAqB,QAArB,EAA+B,SAA/B,EAA0C;AACnD,QAAM,UAAW,SAAS,MAAT,GAAkB,CAAlB,GACE,aAAa,cAAb,CAA4B,QAA5B,CADF,GAEE,SAAS,CAAT,CAFnB;;AAIA,QAAM,QAAQ,EAAd;;AAEA,iBAAa,SAAb,CAAuB,OAAvB,EAAgC,KAAhC;AACA,cAAU,IAAV,CAAe,CAAf,GAAmB,MAAM,CAAzB;AACA,cAAU,IAAV,CAAe,CAAf,GAAmB,MAAM,CAAzB;;AAEA,iBAAa,WAAb,CAAyB,OAAzB,EAAkC,KAAlC;AACA,cAAU,MAAV,CAAiB,CAAjB,GAAqB,MAAM,CAA3B;AACA,cAAU,MAAV,CAAiB,CAAjB,GAAqB,MAAM,CAA3B;;AAEA,cAAU,SAAV,GAAsB,GAAG,MAAH,CAAU,SAAV,IAAuB,SAAvB,GAAkC,IAAI,IAAJ,GAAW,OAAX,EAAxD;AACD,GAlGkB;;AAoGnB,iBAAe,aApGI;;AAsGnB,gBAAc,sBAAU,KAAV,EAAiB;AAC7B,QAAM,UAAU,EAAhB;;AAEA;AACA,QAAI,GAAG,KAAH,CAAS,KAAT,CAAJ,EAAqB;AACnB,cAAQ,CAAR,IAAa,MAAM,CAAN,CAAb;AACA,cAAQ,CAAR,IAAa,MAAM,CAAN,CAAb;AACD;AACD;AAJA,SAKK;AACH,YAAI,MAAM,IAAN,KAAe,UAAnB,EAA+B;AAC7B,cAAI,MAAM,OAAN,CAAc,MAAd,KAAyB,CAA7B,EAAgC;AAC9B,oBAAQ,CAAR,IAAa,MAAM,OAAN,CAAc,CAAd,CAAb;AACA,oBAAQ,CAAR,IAAa,MAAM,cAAN,CAAqB,CAArB,CAAb;AACD,WAHD,MAIK,IAAI,MAAM,OAAN,CAAc,MAAd,KAAyB,CAA7B,EAAgC;AACnC,oBAAQ,CAAR,IAAa,MAAM,cAAN,CAAqB,CAArB,CAAb;AACA,oBAAQ,CAAR,IAAa,MAAM,cAAN,CAAqB,CAArB,CAAb;AACD;AACF,SATD,MAUK;AACH,kBAAQ,CAAR,IAAa,MAAM,OAAN,CAAc,CAAd,CAAb;AACA,kBAAQ,CAAR,IAAa,MAAM,OAAN,CAAc,CAAd,CAAb;AACD;AACF;;AAED,WAAO,OAAP;AACD,GAjIkB;;AAmInB,kBAAgB,wBAAU,QAAV,EAAoB;AAClC,QAAM,UAAU;AACd,aAAS,CADK;AAEd,aAAS,CAFK;AAGd,eAAS,CAHK;AAId,eAAS,CAJK;AAKd,eAAS,CALK;AAMd,eAAS;AANK,KAAhB;;AASA,yBAAsB,QAAtB,kHAAgC;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAArB,OAAqB;;AAC9B,WAAK,IAAM,KAAX,IAAmB,OAAnB,EAA4B;AAC1B,gBAAQ,KAAR,KAAiB,QAAQ,KAAR,CAAjB;AACD;AACF;AACD,SAAK,IAAM,IAAX,IAAmB,OAAnB,EAA4B;AAC1B,cAAQ,IAAR,KAAiB,SAAS,MAA1B;AACD;;AAED,WAAO,OAAP;AACD,GAvJkB;;AAyJnB,aAAW,mBAAU,KAAV,EAAiB;AAC1B,QAAI,CAAC,MAAM,MAAP,IAAiB,EAAE,MAAM,OAAN,IAAiB,MAAM,OAAN,CAAc,MAAd,GAAuB,CAA1C,CAArB,EAAmE;AACjE;AACD;;AAED,QAAM,UAAU,aAAa,YAAb,CAA0B,KAA1B,CAAhB;AACA,QAAM,OAAO,KAAK,GAAL,CAAS,QAAQ,CAAR,EAAW,KAApB,EAA2B,QAAQ,CAAR,EAAW,KAAtC,CAAb;AACA,QAAM,OAAO,KAAK,GAAL,CAAS,QAAQ,CAAR,EAAW,KAApB,EAA2B,QAAQ,CAAR,EAAW,KAAtC,CAAb;AACA,QAAM,OAAO,KAAK,GAAL,CAAS,QAAQ,CAAR,EAAW,KAApB,EAA2B,QAAQ,CAAR,EAAW,KAAtC,CAAb;AACA,QAAM,OAAO,KAAK,GAAL,CAAS,QAAQ,CAAR,EAAW,KAApB,EAA2B,QAAQ,CAAR,EAAW,KAAtC,CAAb;;AAEA,WAAO;AACL,SAAG,IADE;AAEL,SAAG,IAFE;AAGL,YAAM,IAHD;AAIL,WAAK,IAJA;AAKL,aAAO,OAAO,IALT;AAML,cAAQ,OAAO;AANV,KAAP;AAQD,GA5KkB;;AA8KnB,iBAAe,uBAAU,KAAV,EAAiB,WAAjB,EAA8B;AAC3C,QAAM,UAAU,cAAc,GAA9B;AACA,QAAM,UAAU,cAAc,GAA9B;AACA,QAAM,UAAU,aAAa,YAAb,CAA0B,KAA1B,CAAhB;;AAGA,QAAM,KAAK,QAAQ,CAAR,EAAW,OAAX,IAAsB,QAAQ,CAAR,EAAW,OAAX,CAAjC;AACA,QAAM,KAAK,QAAQ,CAAR,EAAW,OAAX,IAAsB,QAAQ,CAAR,EAAW,OAAX,CAAjC;;AAEA,WAAO,MAAM,EAAN,EAAU,EAAV,CAAP;AACD,GAxLkB;;AA0LnB,cAAY,oBAAU,KAAV,EAAiB,SAAjB,EAA4B,WAA5B,EAAyC;AACnD,QAAM,UAAU,cAAc,GAA9B;AACA,QAAM,UAAU,cAAc,GAA9B;AACA,QAAM,UAAU,aAAa,YAAb,CAA0B,KAA1B,CAAhB;AACA,QAAM,KAAK,QAAQ,CAAR,EAAW,OAAX,IAAsB,QAAQ,CAAR,EAAW,OAAX,CAAjC;AACA,QAAM,KAAK,QAAQ,CAAR,EAAW,OAAX,IAAsB,QAAQ,CAAR,EAAW,OAAX,CAAjC;AACA,QAAM,QAAQ,MAAM,KAAK,KAAL,CAAW,EAAX,EAAgB,EAAhB,CAAN,GAA4B,KAAK,EAA/C;;AAEA,WAAQ,KAAR;AACD,GAnMkB;;AAqMnB,kBAAgB,wBAAU,OAAV,EAAmB,WAAnB,EAAgC;AAC9C;AACA;AACA,QAAI,YAAY,KAAhB,EAAmC;AAAE,aAAO,OAAP;AAAiB;AACtD,QAAI,CAAC,QAAQ,oBAAb,EAAmC;AAAE,aAAO,OAAP;AAAiB;;AAEtD,WAAO,GAAG,MAAH,CAAU,QAAQ,WAAlB,IACH,QAAQ,WADL,GAEH,CAAC,SAAD,EAAY,SAAZ,EAAsB,OAAtB,EAA+B,KAA/B,EAAsC,OAAtC,EAA+C,QAAQ,WAAvD,CAFJ;AAGD,GA9MkB;;AAgNnB;AACA,mBAAiB,yBAAU,KAAV,EAAiB;AAChC,WAAO,CACL,SAAS,gBAAT,CAA0B,MAAM,IAAN,GAAa,MAAM,IAAN,CAAW,CAAX,CAAb,GAA6B,MAAM,MAA7D,CADK,EAEL,SAAS,gBAAT,CAA0B,MAAM,aAAhC,CAFK,CAAP;AAID;AAtNkB,CAArB;;AAyNA,OAAO,OAAP,GAAiB,YAAjB;;;;;eChOmB,QAAQ,UAAR,C;IAAX,M,YAAA,M;;AAER,IAAM,UAAU,CAAC,IAAD,EAAO,KAAP,EAAc,QAAd,EAAwB,GAAxB,CAAhB;AACA,IAAI,WAAW,CAAf;AACA,IAAI,gBAAJ;AACA,IAAI,eAAJ;;AAEA,KAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,QAAQ,MAAZ,IAAsB,CAAC,OAAO,qBAA9C,EAAqE,GAArE,EAA0E;AACxE,YAAU,OAAO,QAAQ,CAAR,IAAa,uBAApB,CAAV;AACA,WAAS,OAAO,QAAQ,CAAR,IAAY,sBAAnB,KAA8C,OAAO,QAAQ,CAAR,IAAa,6BAApB,CAAvD;AACD;;AAED,IAAI,CAAC,OAAL,EAAc;AACZ,YAAU,iBAAU,QAAV,EAAoB;AAC5B,QAAM,WAAW,IAAI,IAAJ,GAAW,OAAX,EAAjB;AACA,QAAM,aAAa,KAAK,GAAL,CAAS,CAAT,EAAY,MAAM,WAAW,QAAjB,CAAZ,CAAnB;AACA,QAAM,KAAK,WAAW,YAAY;AAAE,eAAS,WAAW,UAApB;AAAkC,KAA3D,EACW,UADX,CAAX;;AAGA,eAAW,WAAW,UAAtB;AACA,WAAO,EAAP;AACD,GARD;AASD;;AAED,IAAI,CAAC,MAAL,EAAa;AACX,WAAS,gBAAU,EAAV,EAAc;AACrB,iBAAa,EAAb;AACD,GAFD;AAGD;;AAED,OAAO,OAAP,GAAiB;AACf,kBADe;AAEf;AAFe,CAAjB;;;;;AC9BA,IAAM,SAAS,QAAQ,UAAR,CAAf;AACA,IAAM,KAAK,QAAQ,MAAR,CAAX;;eAKI,QAAQ,YAAR,C;IAHF,O,YAAA,O;IACA,U,YAAA,U;IACA,c,YAAA,c;;AAGF,IAAM,YAAY;AAChB,yBAAuB,+BAAU,KAAV,EAAiB,YAAjB,EAA+B,OAA/B,EAAwC;AAC7D,QAAI,CAAC,GAAG,MAAH,CAAU,KAAV,CAAL,EAAuB;AACrB,aAAO,IAAP;AACD;;AAED,QAAI,UAAU,QAAd,EAAwB;AACtB,cAAQ,WAAW,OAAX,CAAR;AACD,KAFD,MAGK,IAAI,UAAU,MAAd,EAAsB;AACzB,cAAQ,aAAa,OAAb,CAAqB,OAArB,CAAR;AACD,KAFI,MAGA;AACH,cAAQ,QAAQ,OAAR,EAAiB,KAAjB,CAAR;AACD;;AAED,WAAO,KAAP;AACD,GAjBe;;AAmBhB,mBAAiB,yBAAU,KAAV,EAAiB,YAAjB,EAA+B,OAA/B,EAAwC,YAAxC,EAAsD;AACrE,YAAQ,UAAU,qBAAV,CAAgC,KAAhC,EAAuC,YAAvC,EAAqD,OAArD,KAAiE,KAAzE;;AAEA,QAAI,GAAG,QAAH,CAAY,KAAZ,CAAJ,EAAwB;AACtB,cAAQ,MAAM,KAAN,CAAY,IAAZ,EAAkB,YAAlB,CAAR;AACD;;AAED,QAAI,GAAG,OAAH,CAAW,KAAX,CAAJ,EAAuB;AACrB,cAAQ,eAAe,KAAf,CAAR;AACD;;AAED,WAAO,KAAP;AACD,GA/Be;;AAiChB,YAAU,kBAAU,IAAV,EAAgB;AACxB,WAAQ,QAAQ;AACd,SAAG,OAAO,IAAP,GAAc,KAAK,CAAnB,GAAuB,KAAK,IADjB;AAEd,SAAG,OAAO,IAAP,GAAc,KAAK,CAAnB,GAAuB,KAAK;AAFjB,KAAhB;AAID,GAtCe;;AAwChB,cAAY,oBAAU,IAAV,EAAgB;AAC1B,QAAI,QAAQ,EAAE,UAAU,IAAV,IAAkB,SAAS,IAA7B,CAAZ,EAAgD;AAC9C,aAAO,OAAO,EAAP,EAAW,IAAX,CAAP;;AAEA,WAAK,IAAL,GAAc,KAAK,CAAL,IAAU,CAAxB;AACA,WAAK,GAAL,GAAc,KAAK,CAAL,IAAU,CAAxB;AACA,WAAK,KAAL,GAAc,KAAK,KAAL,IAAiB,KAAK,IAAL,GAAY,KAAK,KAAhD;AACA,WAAK,MAAL,GAAc,KAAK,MAAL,IAAiB,KAAK,GAAL,GAAW,KAAK,MAA/C;AACD;;AAED,WAAO,IAAP;AACD,GAnDe;;AAqDhB,cAAY,oBAAU,IAAV,EAAgB;AAC1B,QAAI,QAAQ,EAAE,OAAO,IAAP,IAAe,OAAO,IAAxB,CAAZ,EAA2C;AACzC,aAAO,OAAO,EAAP,EAAW,IAAX,CAAP;;AAEA,WAAK,CAAL,GAAc,KAAK,IAAL,IAAa,CAA3B;AACA,WAAK,GAAL,GAAc,KAAK,GAAL,IAAa,CAA3B;AACA,WAAK,KAAL,GAAc,KAAK,KAAL,IAAgB,KAAK,KAAL,GAAc,KAAK,CAAjD;AACA,WAAK,MAAL,GAAc,KAAK,MAAL,IAAgB,KAAK,MAAL,GAAc,KAAK,CAAjD;AACD;;AAED,WAAO,IAAP;AACD;AAhEe,CAAlB;;AAmEA,OAAO,OAAP,GAAiB,SAAjB;;;;;AC3EA,IAAM,MAAM,OAAO,OAAnB;AACA,IAAM,WAAW,QAAQ,YAAR,CAAjB;;AAEA,SAAS,IAAT,CAAe,MAAf,EAAuB;AACrB;;AAEA,MAAI,UAAJ,GAAiB,MAAjB;;AAEA;AACA,MAAM,KAAK,OAAO,QAAP,CAAgB,cAAhB,CAA+B,EAA/B,CAAX;;AAEA;AACA,MAAI,GAAG,aAAH,KAAqB,OAAO,QAA5B,IACG,OAAO,OAAO,IAAd,KAAuB,UAD1B,IAEC,OAAO,IAAP,CAAY,EAAZ,MAAoB,EAFzB,EAE6B;AAC3B;AACA,aAAS,OAAO,IAAP,CAAY,MAAZ,CAAT;AACD;;AAED,MAAI,MAAJ,GAAa,MAAb;AACD;;AAED,IAAI,OAAO,MAAP,KAAkB,WAAtB,EAAmC;AACjC,MAAI,MAAJ,GAAiB,SAAjB;AACA,MAAI,UAAJ,GAAiB,SAAjB;AACD,CAHD,MAIK;AACH,OAAK,MAAL;AACD;;AAED,IAAI,SAAJ,GAAgB,SAAS,SAAT,CAAoB,IAApB,EAA0B;AACxC,MAAI,SAAS,IAAT,CAAJ,EAAoB;AAClB,WAAO,IAAP;AACD;;AAED,MAAM,WAAY,KAAK,aAAL,IAAsB,IAAxC;;AAEA,SAAO,SAAS,WAAT,IAAwB,SAAS,YAAjC,IAAiD,IAAI,MAA5D;AACD,CARD;;AAUA,IAAI,IAAJ,GAAW,IAAX","file":"interact.js","sourceRoot":"","sourcesContent":["/**\n * interact.js v1.3.0-alpha.3+sha.9595c40\n *\n * Copyright (c) 2012-2017 Taye Adeyemi \n * Open source under the MIT License.\n * https://raw.github.com/taye/interact.js/master/LICENSE\n */\n","(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o 150) {\n return null;\n }\n\n let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI;\n const overlap = 22.5;\n\n if (angle < 0) {\n angle += 360;\n }\n\n const left = 135 - overlap <= angle && angle < 225 + overlap;\n const up = 225 - overlap <= angle && angle < 315 + overlap;\n\n const right = !left && (315 - overlap <= angle || angle < 45 + overlap);\n const down = !up && 45 - overlap <= angle && angle < 135 + overlap;\n\n return {\n up,\n down,\n left,\n right,\n angle,\n speed: interaction.prevEvent.speed,\n velocity: {\n x: interaction.prevEvent.velocityX,\n y: interaction.prevEvent.velocityY,\n },\n };\n }\n\n preventDefault () {}\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n}\n\nsignals.on('set-delta', function ({ iEvent, interaction, starting, deltaSource }) {\n const prevEvent = starting? iEvent : interaction.prevEvent;\n\n if (deltaSource === 'client') {\n iEvent.dx = iEvent.clientX - prevEvent.clientX;\n iEvent.dy = iEvent.clientY - prevEvent.clientY;\n }\n else {\n iEvent.dx = iEvent.pageX - prevEvent.pageX;\n iEvent.dy = iEvent.pageY - prevEvent.pageY;\n }\n});\n\nInteractEvent.signals = signals;\n\nmodule.exports = InteractEvent;\n","const is = require('./utils/is');\nconst events = require('./utils/events');\nconst extend = require('./utils/extend');\nconst actions = require('./actions/base');\nconst scope = require('./scope');\nconst Eventable = require('./Eventable');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nconst {\n getElementRect,\n nodeContains,\n trySelector,\n} = require('./utils/domUtils');\nconst { getWindow } = require('./utils/window');\nconst { indexOf, contains } = require('./utils/arr');\nconst { wheelEvent } = require('./utils/browser');\n\n// all set interactables\nscope.interactables = [];\n\n/*\\\n * Interactable\n [ property ]\n **\n * Object type returned by @interact\n\\*/\nclass Interactable {\n constructor (target, options) {\n options = options || {};\n\n this.target = target;\n this.events = new Eventable();\n this._context = options.context || scope.document;\n this._win = getWindow(trySelector(target)? this._context : target);\n this._doc = this._win.document;\n\n signals.fire('new', {\n target,\n options,\n interactable: this,\n win: this._win,\n });\n\n scope.addDocument( this._doc, this._win );\n\n scope.interactables.push(this);\n\n this.set(options);\n }\n\n setOnEvents (action, phases) {\n const onAction = 'on' + action;\n\n if (is.function(phases.onstart) ) { this.events[onAction + 'start' ] = phases.onstart ; }\n if (is.function(phases.onmove) ) { this.events[onAction + 'move' ] = phases.onmove ; }\n if (is.function(phases.onend) ) { this.events[onAction + 'end' ] = phases.onend ; }\n if (is.function(phases.oninertiastart)) { this.events[onAction + 'inertiastart' ] = phases.oninertiastart ; }\n\n return this;\n }\n\n setPerAction (action, options) {\n // for all the default per-action options\n for (const option in options) {\n // if this option exists for this action\n if (option in defaults[action]) {\n // if the option in the options arg is an object value\n if (is.object(options[option])) {\n // duplicate the object\n this.options[action][option] = extend(this.options[action][option] || {}, options[option]);\n\n if (is.object(defaults.perAction[option]) && 'enabled' in defaults.perAction[option]) {\n this.options[action][option].enabled = options[option].enabled === false? false : true;\n }\n }\n else if (is.bool(options[option]) && is.object(defaults.perAction[option])) {\n this.options[action][option].enabled = options[option];\n }\n else if (options[option] !== undefined) {\n // or if it's not undefined, do a plain assignment\n this.options[action][option] = options[option];\n }\n }\n }\n }\n\n /*\\\n * Interactable.getRect\n [ method ]\n *\n * The default function to get an Interactables bounding rect. Can be\n * overridden using @Interactable.rectChecker.\n *\n - element (Element) #optional The element to measure.\n = (object) The object's bounding rectangle.\n o {\n o top : 0,\n o left : 0,\n o bottom: 0,\n o right : 0,\n o width : 0,\n o height: 0\n o }\n \\*/\n getRect (element) {\n element = element || this.target;\n\n if (is.string(this.target) && !(is.element(element))) {\n element = this._context.querySelector(this.target);\n }\n\n return getElementRect(element);\n }\n\n /*\\\n * Interactable.rectChecker\n [ method ]\n *\n * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n - checker (function) #optional A function which returns this Interactable's bounding rectangle. See @Interactable.getRect\n = (function | object) The checker function or this Interactable\n \\*/\n rectChecker (checker) {\n if (is.function(checker)) {\n this.getRect = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.getRect;\n\n return this;\n }\n\n return this.getRect;\n }\n\n _backCompatOption (optionName, newValue) {\n if (trySelector(newValue) || is.object(newValue)) {\n this.options[optionName] = newValue;\n\n for (const action of actions.names) {\n this.options[action][optionName] = newValue;\n }\n\n return this;\n }\n\n return this.options[optionName];\n }\n\n /*\\\n * Interactable.origin\n [ method ]\n *\n * Gets or sets the origin of the Interactable's element. The x and y\n * of the origin will be subtracted from action event coordinates.\n *\n - origin (object | string) #optional An object eg. { x: 0, y: 0 } or string 'parent', 'self' or any CSS selector\n * OR\n - origin (Element) #optional An HTML or SVG Element whose rect will be used\n **\n = (object) The current origin or this Interactable\n \\*/\n origin (newValue) {\n return this._backCompatOption('origin', newValue);\n }\n\n /*\\\n * Interactable.deltaSource\n [ method ]\n *\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n - newValue (string) #optional Use 'client' if you will be scrolling while interacting; Use 'page' if you want autoScroll to work\n = (string | object) The current deltaSource or this Interactable\n \\*/\n deltaSource (newValue) {\n if (newValue === 'page' || newValue === 'client') {\n this.options.deltaSource = newValue;\n\n return this;\n }\n\n return this.options.deltaSource;\n }\n\n /*\\\n * Interactable.context\n [ method ]\n *\n * Gets the selector context Node of the Interactable. The default is `window.document`.\n *\n = (Node) The context Node of this Interactable\n **\n \\*/\n context () {\n return this._context;\n }\n\n inContext (element) {\n return (this._context === element.ownerDocument\n || nodeContains(this._context, element));\n }\n\n /*\\\n * Interactable.fire\n [ method ]\n *\n * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n - iEvent (InteractEvent) The InteractEvent object to be fired on this Interactable\n = (Interactable) this Interactable\n \\*/\n fire (iEvent) {\n this.events.fire(iEvent);\n\n return this;\n }\n\n _onOffMultiple (method, eventType, listener, options) {\n if (is.string(eventType) && eventType.search(' ') !== -1) {\n eventType = eventType.trim().split(/ +/);\n }\n\n if (is.array(eventType)) {\n for (let i = 0; i < eventType.length; i++) {\n this[method](eventType[i], listener, options);\n }\n\n return true;\n }\n\n if (is.object(eventType)) {\n for (const prop in eventType) {\n this[method](prop, eventType[prop], listener);\n }\n\n return true;\n }\n }\n\n /*\\\n * Interactable.on\n [ method ]\n *\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n - eventType (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) This Interactable\n \\*/\n on (eventType, listener, options) {\n if (this._onOffMultiple('on', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.on(eventType, listener);\n }\n // delegated event for selector\n else if (is.string(this.target)) {\n events.addDelegate(this.target, this._context, eventType, listener, options);\n }\n else {\n events.add(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.off\n [ method ]\n *\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n - eventType (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) This Interactable\n \\*/\n off (eventType, listener, options) {\n if (this._onOffMultiple('off', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n // if it is an action event type\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.off(eventType, listener);\n }\n // delegated event\n else if (is.string(this.target)) {\n events.removeDelegate(this.target, this._context, eventType, listener, options);\n }\n // remove listener from this Interatable's element\n else {\n events.remove(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.set\n [ method ]\n *\n * Reset the options of this Interactable\n - options (object) The new settings to apply\n = (object) This Interactable\n \\*/\n set (options) {\n if (!is.object(options)) {\n options = {};\n }\n\n this.options = extend({}, defaults.base);\n\n const perActions = extend({}, defaults.perAction);\n\n for (const actionName in actions.methodDict) {\n const methodName = actions.methodDict[actionName];\n\n this.options[actionName] = extend({}, defaults[actionName]);\n\n this.setPerAction(actionName, perActions);\n\n this[methodName](options[actionName]);\n }\n\n for (const setting of Interactable.settingsMethods) {\n this.options[setting] = defaults.base[setting];\n\n if (setting in options) {\n this[setting](options[setting]);\n }\n }\n\n signals.fire('set', {\n options,\n interactable: this,\n });\n\n return this;\n }\n\n /*\\\n * Interactable.unset\n [ method ]\n *\n * Remove this interactable from the list of interactables and remove\n * it's action capabilities and event listeners\n *\n = (object) @interact\n \\*/\n unset () {\n events.remove(this.target, 'all');\n\n if (is.string(this.target)) {\n // remove delegated events\n for (const type in events.delegatedEvents) {\n const delegated = events.delegatedEvents[type];\n\n if (delegated.selectors[0] === this.target\n && delegated.contexts[0] === this._context) {\n\n delegated.selectors.splice(0, 1);\n delegated.contexts .splice(0, 1);\n delegated.listeners.splice(0, 1);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegated[type] = null;\n }\n }\n\n events.remove(this._context, type, events.delegateListener);\n events.remove(this._context, type, events.delegateUseCapture, true);\n }\n }\n else {\n events.remove(this, 'all');\n }\n\n signals.fire('unset', { interactable: this });\n\n scope.interactables.splice(indexOf(scope.interactables, this), 1);\n\n // Stop related interactions when an Interactable is unset\n for (const interaction of scope.interactions || []) {\n if (interaction.target === this && interaction.interacting()) {\n interaction.stop();\n }\n }\n\n return scope.interact;\n }\n}\n\nscope.interactables.indexOfElement = function indexOfElement (target, context) {\n context = context || scope.document;\n\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n if (interactable.target === target && interactable._context === context) {\n return i;\n }\n }\n return -1;\n};\n\nscope.interactables.get = function interactableGet (element, options, dontCheckInContext) {\n const ret = this[this.indexOfElement(element, options && options.context)];\n\n return ret && (is.string(element) || dontCheckInContext || ret.inContext(element))? ret : null;\n};\n\nscope.interactables.forEachSelector = function (callback, element) {\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n // skip non CSS selector targets and out of context elements\n if (!is.string(interactable.target)\n || (element && !interactable.inContext(element))) {\n continue;\n }\n\n const ret = callback(interactable, interactable.target, interactable._context, i, this);\n\n if (ret !== undefined) {\n return ret;\n }\n }\n};\n\n// all interact.js eventTypes\nInteractable.eventTypes = scope.eventTypes = [];\n\nInteractable.signals = signals;\n\nInteractable.settingsMethods = [ 'deltaSource', 'origin', 'preventDefault', 'rectChecker' ];\n\nmodule.exports = Interactable;\n","const scope = require('./scope');\nconst utils = require('./utils');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst finder = require('./utils/interactionFinder');\nconst signals = require('./utils/Signals').new();\n\nconst listeners = {};\nconst methodNames = [\n 'pointerDown', 'pointerMove', 'pointerUp',\n 'updatePointer', 'removePointer',\n];\n\n// for ignoring browser's simulated mouse events\nlet prevTouchTime = 0;\n\n// all active and idle interactions\nscope.interactions = [];\n\nclass Interaction {\n constructor () {\n this.target = null; // current interactable being interacted with\n this.element = null; // the target element of the interactable\n\n this.prepared = { // action that's ready to be fired on next move event\n name : null,\n axis : null,\n edges: null,\n };\n\n // keep track of added pointers\n this.pointers = [];\n this.pointerIds = [];\n this.downTargets = [];\n this.downTimes = [];\n\n // Previous native pointer move event coordinates\n this.prevCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n // current native pointer move event coordinates\n this.curCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Starting InteractEvent pointer coordinates\n this.startCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Change in coordinates and time of the pointer\n this.pointerDelta = {\n page : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n client : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n timeStamp: 0,\n };\n\n this.downEvent = null; // pointerdown/mousedown/touchstart event\n this.downPointer = {};\n\n this._eventTarget = null;\n this._curEventTarget = null;\n\n this.prevEvent = null; // previous action event\n\n this.pointerIsDown = false;\n this.pointerWasMoved = false;\n this._interacting = false;\n\n this.mouse = false;\n\n signals.fire('new', this);\n\n scope.interactions.push(this);\n }\n\n pointerDown (pointer, event, eventTarget) {\n const pointerIndex = this.updatePointer(pointer, event, true);\n\n signals.fire('down', {\n pointer,\n event,\n eventTarget,\n pointerIndex,\n interaction: this,\n });\n }\n\n /*\\\n * Interaction.start\n [ method ]\n *\n * Start an action with the given Interactable and Element as tartgets. The\n * action must be enabled for the target Interactable and an appropriate number\n * of pointers must be held down - 1 for drag/resize, 2 for gesture.\n *\n * Use it with `interactable.able({ manualStart: false })` to always\n * [start actions manually](https://github.com/taye/interact.js/issues/114)\n *\n - action (object) The action to be performed - drag, resize, etc.\n - target (Interactable) The Interactable to target\n - element (Element) The DOM Element to target\n = (object) interact\n **\n | interact(target)\n | .draggable({\n | // disable the default drag start by down->move\n | manualStart: true\n | })\n | // start dragging after the user holds the pointer down\n | .on('hold', function (event) {\n | var interaction = event.interaction;\n |\n | if (!interaction.interacting()) {\n | interaction.start({ name: 'drag' },\n | event.interactable,\n | event.currentTarget);\n | }\n | });\n \\*/\n start (action, target, element) {\n if (this.interacting()\n || !this.pointerIsDown\n || this.pointerIds.length < (action.name === 'gesture'? 2 : 1)) {\n return;\n }\n\n // if this interaction had been removed after stopping\n // add it back\n if (utils.indexOf(scope.interactions, this) === -1) {\n scope.interactions.push(this);\n }\n\n utils.copyAction(this.prepared, action);\n this.target = target;\n this.element = element;\n\n signals.fire('action-start', {\n interaction: this,\n event: this.downEvent,\n });\n }\n\n pointerMove (pointer, event, eventTarget) {\n if (!this.simulation) {\n this.updatePointer(pointer);\n utils.setCoords(this.curCoords, this.pointers);\n }\n\n const duplicateMove = (this.curCoords.page.x === this.prevCoords.page.x\n && this.curCoords.page.y === this.prevCoords.page.y\n && this.curCoords.client.x === this.prevCoords.client.x\n && this.curCoords.client.y === this.prevCoords.client.y);\n\n let dx;\n let dy;\n\n // register movement greater than pointerMoveTolerance\n if (this.pointerIsDown && !this.pointerWasMoved) {\n dx = this.curCoords.client.x - this.startCoords.client.x;\n dy = this.curCoords.client.y - this.startCoords.client.y;\n\n this.pointerWasMoved = utils.hypot(dx, dy) > Interaction.pointerMoveTolerance;\n }\n\n const signalArg = {\n pointer,\n pointerIndex: this.getPointerIndex(pointer),\n event,\n eventTarget,\n dx,\n dy,\n duplicate: duplicateMove,\n interaction: this,\n interactingBeforeMove: this.interacting(),\n };\n\n if (!duplicateMove) {\n // set pointer coordinate, time changes and speeds\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n }\n\n signals.fire('move', signalArg);\n\n if (!duplicateMove) {\n // if interacting, fire an 'action-move' signal etc\n if (this.interacting()) {\n this.doMove(signalArg);\n }\n\n if (this.pointerWasMoved) {\n utils.copyCoords(this.prevCoords, this.curCoords);\n }\n }\n }\n\n /*\\\n * Interaction.doMove\n [ method ]\n *\n * Force a move of the current action at the same coordinates. Useful if\n * snap/restrict has been changed and you want a movement with the new\n * settings.\n *\n **\n | interact(target)\n | .draggable(true)\n | .on('dragmove', function (event) {\n | if (someCondition) {\n | // change the snap settings\n | event.interactable.draggable({ snap: { targets: [] }});\n | // fire another move event with re-calculated snap\n | event.interaction.doMove();\n | }\n | });\n \\*/\n doMove (signalArg) {\n signalArg = utils.extend({\n pointer: this.pointers[0],\n event: this.prevEvent,\n eventTarget: this._eventTarget,\n interaction: this,\n }, signalArg || {});\n\n signals.fire('before-action-move', signalArg);\n\n if (!this._dontFireMove) {\n signals.fire('action-move', signalArg);\n }\n\n this._dontFireMove = false;\n }\n\n // End interact move events and stop auto-scroll unless simulation is running\n pointerUp (pointer, event, eventTarget, curEventTarget) {\n const pointerIndex = this.getPointerIndex(pointer);\n\n signals.fire(/cancel$/i.test(event.type)? 'cancel' : 'up', {\n pointer,\n pointerIndex,\n event,\n eventTarget,\n curEventTarget,\n interaction: this,\n });\n\n if (!this.simulation) {\n this.end(event);\n }\n\n this.pointerIsDown = false;\n this.removePointer(pointer, event);\n }\n\n /*\\\n * Interaction.end\n [ method ]\n *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n - event (PointerEvent) #optional\n **\n | interact(target)\n | .draggable(true)\n | .on('move', function (event) {\n | if (event.pageX > 1000) {\n | // end the current action\n | event.interaction.end();\n | // stop all further listeners from being called\n | event.stopImmediatePropagation();\n | }\n | });\n \\*/\n end (event) {\n event = event || this.prevEvent;\n\n if (this.interacting()) {\n signals.fire('action-end', {\n event,\n interaction: this,\n });\n }\n\n this.stop();\n }\n\n currentAction () {\n return this._interacting? this.prepared.name: null;\n }\n\n interacting () {\n return this._interacting;\n }\n\n stop () {\n signals.fire('stop', { interaction: this });\n\n if (this._interacting) {\n signals.fire('stop-active', { interaction: this });\n signals.fire('stop-' + this.prepared.name, { interaction: this });\n }\n\n this.target = this.element = null;\n\n this._interacting = false;\n this.prepared.name = this.prevEvent = null;\n }\n\n getPointerIndex (pointer) {\n return utils.indexOf(this.pointerIds, utils.getPointerId(pointer));\n }\n\n updatePointer (pointer, event, down = event && /(down|start)$/i.test(event.type)) {\n const id = utils.getPointerId(pointer);\n let index = this.getPointerIndex(pointer);\n\n if (index === -1) {\n index = this.pointerIds.length;\n this.pointerIds[index] = id;\n }\n\n if (down) {\n signals.fire('update-pointer-down', {\n pointer,\n event,\n down,\n pointerId: id,\n pointerIndex: index,\n interaction: this,\n });\n }\n\n this.pointers[index] = pointer;\n\n return index;\n }\n\n removePointer (pointer, event) {\n const id = utils.getPointerId(pointer);\n const index = this.mouse? 0 : utils.indexOf(this.pointerIds, id);\n\n if (index === -1) { return; }\n\n signals.fire('remove-pointer', {\n pointer,\n event,\n pointerIndex: index,\n interaction: this,\n });\n\n this.pointers .splice(index, 1);\n this.pointerIds .splice(index, 1);\n this.downTargets.splice(index, 1);\n this.downTimes .splice(index, 1);\n }\n\n _updateEventTargets (target, currentTarget) {\n this._eventTarget = target;\n this._curEventTarget = currentTarget;\n }\n}\n\nfor (let i = 0, len = methodNames.length; i < len; i++) {\n const method = methodNames[i];\n\n listeners[method] = doOnInteractions(method);\n}\n\nfunction doOnInteractions (method) {\n return (function (event) {\n const [eventTarget, curEventTarget] = utils.getEventTargets(event);\n const matches = []; // [ [pointer, interaction], ...]\n\n if (browser.supportsTouch && /touch/.test(event.type)) {\n prevTouchTime = new Date().getTime();\n\n for (let i = 0; i < event.changedTouches.length; i++) {\n const pointer = event.changedTouches[i];\n const interaction = finder.search(pointer, event.type, eventTarget);\n\n matches.push([pointer, interaction || new Interaction()]);\n }\n }\n else {\n let invalidPointer = false;\n\n if (!browser.supportsPointerEvent && /mouse/.test(event.type)) {\n // ignore mouse events while touch interactions are active\n for (let i = 0; i < scope.interactions.length && !invalidPointer; i++) {\n invalidPointer = !scope.interactions[i].mouse && scope.interactions[i].pointerIsDown;\n }\n\n // try to ignore mouse events that are simulated by the browser\n // after a touch event\n invalidPointer = invalidPointer\n || (new Date().getTime() - prevTouchTime < 500)\n // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated\n || event.timeStamp === 0;\n }\n\n if (!invalidPointer) {\n let interaction = finder.search(event, event.type, eventTarget);\n\n if (!interaction) {\n\n interaction = new Interaction();\n interaction.mouse = (/mouse/i.test(event.pointerType || event.type)\n // MSPointerEvent.MSPOINTER_TYPE_MOUSE\n || event.pointerType === 4\n || !event.pointerType);\n }\n\n matches.push([event, interaction]);\n }\n }\n\n for (const [pointer, interaction] of matches) {\n interaction._updateEventTargets(eventTarget, curEventTarget);\n interaction[method](pointer, event, eventTarget, curEventTarget);\n }\n });\n}\n\nfunction endAll (event) {\n for (let i = 0; i < scope.interactions.length; i++) {\n const interaction = scope.interactions[i];\n\n interaction.end(event);\n signals.fire('endall', { event, interaction });\n }\n}\n\nconst docEvents = { /* 'eventType': listenerFunc */ };\nconst pEventTypes = browser.pEventTypes;\n\nif (scope.PointerEvent) {\n docEvents[pEventTypes.down ] = listeners.pointerDown;\n docEvents[pEventTypes.move ] = listeners.pointerMove;\n docEvents[pEventTypes.up ] = listeners.pointerUp;\n docEvents[pEventTypes.cancel] = listeners.pointerUp;\n}\nelse {\n docEvents.mousedown = listeners.pointerDown;\n docEvents.mousemove = listeners.pointerMove;\n docEvents.mouseup = listeners.pointerUp;\n\n docEvents.touchstart = listeners.pointerDown;\n docEvents.touchmove = listeners.pointerMove;\n docEvents.touchend = listeners.pointerUp;\n docEvents.touchcancel = listeners.pointerUp;\n}\n\ndocEvents.blur = endAll;\n\nfunction onDocSignal ({ doc }, signalName) {\n const eventMethod = signalName.indexOf('add') === 0\n ? events.add : events.remove;\n\n // delegate event listener\n for (const eventType in scope.delegatedEvents) {\n eventMethod(doc, eventType, events.delegateListener);\n eventMethod(doc, eventType, events.delegateUseCapture, true);\n }\n\n for (const eventType in docEvents) {\n eventMethod(doc, eventType, docEvents[eventType]);\n }\n}\n\nsignals.on('update-pointer-down', ({ interaction, pointer, pointerId, pointerIndex, event, eventTarget, down }) => {\n interaction.pointerIds[pointerIndex] = pointerId;\n interaction.pointers[pointerIndex] = pointer;\n\n if (down) {\n interaction.pointerIsDown = true;\n }\n\n if (!interaction.interacting()) {\n utils.setCoords(interaction.startCoords, interaction.pointers);\n\n utils.copyCoords(interaction.curCoords , interaction.startCoords);\n utils.copyCoords(interaction.prevCoords, interaction.startCoords);\n\n interaction.downEvent = event;\n interaction.downTimes[pointerIndex] = interaction.curCoords.timeStamp;\n interaction.downTargets[pointerIndex] = eventTarget || event && utils.getEventTargets(event)[0];\n interaction.pointerWasMoved = false;\n\n utils.pointerExtend(interaction.downPointer, pointer);\n }\n});\n\nscope.signals.on('add-document' , onDocSignal);\nscope.signals.on('remove-document', onDocSignal);\n\nInteraction.pointerMoveTolerance = 1;\nInteraction.doOnInteractions = doOnInteractions;\nInteraction.endAll = endAll;\nInteraction.signals = signals;\nInteraction.docEvents = docEvents;\n\nscope.endAllInteractions = endAll;\n\nmodule.exports = Interaction;\n","const Interaction = require('../Interaction');\nconst InteractEvent = require('../InteractEvent');\n\nconst actions = {\n firePrepared,\n names: [],\n methodDict: {},\n};\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n interaction._interacting = true;\n firePrepared(interaction, event, 'start');\n});\n\nInteraction.signals.on('action-move', function ({ interaction, event, preEnd }) {\n firePrepared(interaction, event, 'move', preEnd);\n\n // if the action was ended in a listener\n if (!interaction.interacting()) { return false; }\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n firePrepared(interaction, event, 'end');\n});\n\nfunction firePrepared (interaction, event, phase, preEnd) {\n const actionName = interaction.prepared.name;\n\n const newEvent = new InteractEvent(interaction, event, actionName, phase, interaction.element, null, preEnd);\n\n interaction.target.fire(newEvent);\n interaction.prevEvent = newEvent;\n}\n\nmodule.exports = actions;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drag = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n startAxis : 'xy',\n lockAxis : 'xy',\n },\n\n checker: function (pointer, event, interactable) {\n const dragOptions = interactable.options.drag;\n\n return dragOptions.enabled\n ? { name: 'drag', axis: (dragOptions.lockAxis === 'start'\n ? dragOptions.startAxis\n : dragOptions.lockAxis)}\n : null;\n },\n\n getCursor: function () {\n return 'move';\n },\n};\n\nInteraction.signals.on('before-action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n interaction.curCoords.page.y = interaction.startCoords.page.y;\n interaction.curCoords.client.y = interaction.startCoords.client.y;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vx);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vx);\n interaction.pointerDelta.client.vy = 0;\n interaction.pointerDelta.page.vy = 0;\n }\n else if (axis === 'y') {\n interaction.curCoords.page.x = interaction.startCoords.page.x;\n interaction.curCoords.client.x = interaction.startCoords.client.x;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vy);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vy);\n interaction.pointerDelta.client.vx = 0;\n interaction.pointerDelta.page.vx = 0;\n }\n});\n\n// dragmove\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'dragmove') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n iEvent.pageY = interaction.startCoords.page.y;\n iEvent.clientY = interaction.startCoords.client.y;\n iEvent.dy = 0;\n }\n else if (axis === 'y') {\n iEvent.pageX = interaction.startCoords.page.x;\n iEvent.clientX = interaction.startCoords.client.x;\n iEvent.dx = 0;\n }\n});\n\n/*\\\n * Interactable.draggable\n [ method ]\n *\n * Gets or sets whether drag actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of drag events\n | var isDraggable = interact('ul li').draggable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on drag events (object makes the Interactable draggable)\n = (object) This Interactable\n | interact(element).draggable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // the axis in which the first movement must be\n | // for the drag sequence to start\n | // 'xy' by default - any direction\n | startAxis: 'x' || 'y' || 'xy',\n |\n | // 'xy' by default - don't restrict to one axis (move in any direction)\n | // 'x' or 'y' to restrict movement to either axis\n | // 'start' to restrict movement to the axis the drag started in\n | lockAxis: 'x' || 'y' || 'xy' || 'start',\n |\n | // max number of drags that can happen concurrently\n | // with elements of this Interactable. Infinity by default\n | max: Infinity,\n |\n | // max number of drags that can target the same element+Interactable\n | // 1 by default\n | maxPerElement: 2\n | });\n\\*/\nInteractable.prototype.draggable = function (options) {\n if (utils.is.object(options)) {\n this.options.drag.enabled = options.enabled === false? false: true;\n this.setPerAction('drag', options);\n this.setOnEvents('drag', options);\n\n if (/^(xy|x|y|start)$/.test(options.lockAxis)) {\n this.options.drag.lockAxis = options.lockAxis;\n }\n if (/^(xy|x|y)$/.test(options.startAxis)) {\n this.options.drag.startAxis = options.startAxis;\n }\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drag.enabled = options;\n\n if (!options) {\n this.ondragstart = this.ondragstart = this.ondragend = null;\n }\n\n return this;\n }\n\n return this.options.drag;\n};\n\nactions.drag = drag;\nactions.names.push('drag');\nutils.merge(Interactable.eventTypes, [\n 'dragstart',\n 'dragmove',\n 'draginertiastart',\n 'draginertiaresume',\n 'dragend',\n]);\nactions.methodDict.drag = 'draggable';\n\ndefaultOptions.drag = drag.defaults;\n\nmodule.exports = drag;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst scope = require('../scope');\nconst interact = require('../interact');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drop = {\n defaults: {\n enabled: false,\n accept : null,\n overlap: 'pointer',\n },\n};\n\nlet dynamicDrop = false;\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // reset active dropzones\n interaction.activeDrops.dropzones = [];\n interaction.activeDrops.elements = [];\n interaction.activeDrops.rects = [];\n\n interaction.dropEvents = null;\n\n if (!interaction.dynamicDrop) {\n setActiveDrops(interaction, interaction.element);\n }\n\n const dragEvent = interaction.prevEvent;\n const dropEvents = getDropEvents(interaction, event, dragEvent);\n\n if (dropEvents.activate) {\n fireActiveDrops(interaction, dropEvents.activate);\n }\n});\n\nInteractEvent.signals.on('new', function ({ interaction, iEvent, event }) {\n if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { return; }\n\n const draggableElement = interaction.element;\n const dragEvent = iEvent;\n const dropResult = getDrop(dragEvent, event, draggableElement);\n\n interaction.dropTarget = dropResult.dropzone;\n interaction.dropElement = dropResult.element;\n\n interaction.dropEvents = getDropEvents(interaction, event, dragEvent);\n});\n\nInteraction.signals.on('action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n fireDropEvents(interaction, interaction.dropEvents);\n});\n\nInteraction.signals.on('action-end', function ({ interaction }) {\n if (interaction.prepared.name === 'drag') {\n fireDropEvents(interaction, interaction.dropEvents);\n }\n});\n\nInteraction.signals.on('stop-drag', function ({ interaction }) {\n interaction.activeDrops.dropzones =\n interaction.activeDrops.elements =\n interaction.activeDrops.rects =\n interaction.dropEvents = null;\n});\n\nfunction collectDrops (interaction, element) {\n const drops = [];\n const elements = [];\n\n element = element || interaction.element;\n\n // collect all dropzones and their elements which qualify for a drop\n for (const current of scope.interactables) {\n if (!current.options.drop.enabled) { continue; }\n\n const accept = current.options.drop.accept;\n\n // test the draggable element against the dropzone's accept setting\n if ((utils.is.element(accept) && accept !== element)\n || (utils.is.string(accept)\n && !utils.matchesSelector(element, accept))) {\n\n continue;\n }\n\n // query for new elements if necessary\n const dropElements = utils.is.string(current.target)\n ? current._context.querySelectorAll(current.target)\n : [current.target];\n\n for (let i = 0; i < dropElements.length; i++) {\n const currentElement = dropElements[i];\n\n if (currentElement !== element) {\n drops.push(current);\n elements.push(currentElement);\n }\n }\n }\n\n return {\n elements,\n dropzones: drops,\n };\n}\n\nfunction fireActiveDrops (interaction, event) {\n let prevElement;\n\n // loop through all active dropzones and trigger event\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n const current = interaction.activeDrops.dropzones[i];\n const currentElement = interaction.activeDrops.elements [i];\n\n // prevent trigger of duplicate events on same element\n if (currentElement !== prevElement) {\n // set current element as event target\n event.target = currentElement;\n current.fire(event);\n }\n prevElement = currentElement;\n }\n}\n\n// Collect a new set of possible drops and save them in activeDrops.\n// setActiveDrops should always be called when a drag has just started or a\n// drag event happens while dynamicDrop is true\nfunction setActiveDrops (interaction, dragElement) {\n // get dropzones and their elements that could receive the draggable\n const possibleDrops = collectDrops(interaction, dragElement, true);\n\n interaction.activeDrops.dropzones = possibleDrops.dropzones;\n interaction.activeDrops.elements = possibleDrops.elements;\n interaction.activeDrops.rects = [];\n\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n interaction.activeDrops.rects[i] =\n interaction.activeDrops.dropzones[i].getRect(interaction.activeDrops.elements[i]);\n }\n}\n\nfunction getDrop (dragEvent, event, dragElement) {\n const interaction = dragEvent.interaction;\n const validDrops = [];\n\n if (dynamicDrop) {\n setActiveDrops(interaction, dragElement);\n }\n\n // collect all dropzones and their elements which qualify for a drop\n for (let j = 0; j < interaction.activeDrops.dropzones.length; j++) {\n const current = interaction.activeDrops.dropzones[j];\n const currentElement = interaction.activeDrops.elements [j];\n const rect = interaction.activeDrops.rects [j];\n\n validDrops.push(current.dropCheck(dragEvent, event, interaction.target, dragElement, currentElement, rect)\n ? currentElement\n : null);\n }\n\n // get the most appropriate dropzone based on DOM depth and order\n const dropIndex = utils.indexOfDeepestElement(validDrops);\n\n return {\n dropzone: interaction.activeDrops.dropzones[dropIndex] || null,\n element : interaction.activeDrops.elements [dropIndex] || null,\n };\n}\n\nfunction getDropEvents (interaction, pointerEvent, dragEvent) {\n const dropEvents = {\n enter : null,\n leave : null,\n activate : null,\n deactivate: null,\n move : null,\n drop : null,\n };\n\n const tmpl = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n };\n\n if (interaction.dropElement !== interaction.prevDropElement) {\n // if there was a prevDropTarget, create a dragleave event\n if (interaction.prevDropTarget) {\n dropEvents.leave = utils.extend({ type: 'dragleave' }, tmpl);\n\n dragEvent.dragLeave = dropEvents.leave.target = interaction.prevDropElement;\n dragEvent.prevDropzone = dropEvents.leave.dropzone = interaction.prevDropTarget;\n }\n // if the dropTarget is not null, create a dragenter event\n if (interaction.dropTarget) {\n dropEvents.enter = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n type : 'dragenter',\n };\n\n dragEvent.dragEnter = interaction.dropElement;\n dragEvent.dropzone = interaction.dropTarget;\n }\n }\n\n if (dragEvent.type === 'dragend' && interaction.dropTarget) {\n dropEvents.drop = utils.extend({ type: 'drop' }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n dragEvent.relatedTarget = interaction.dropElement;\n }\n if (dragEvent.type === 'dragstart') {\n dropEvents.activate = utils.extend({ type: 'dropactivate' }, tmpl);\n\n dropEvents.activate.target = null;\n dropEvents.activate.dropzone = null;\n }\n if (dragEvent.type === 'dragend') {\n dropEvents.deactivate = utils.extend({ type: 'dropdeactivate' }, tmpl);\n\n dropEvents.deactivate.target = null;\n dropEvents.deactivate.dropzone = null;\n }\n if (dragEvent.type === 'dragmove' && interaction.dropTarget) {\n dropEvents.move = utils.extend({\n dragmove : dragEvent,\n type : 'dropmove',\n }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n }\n\n return dropEvents;\n}\n\nfunction fireDropEvents (interaction, dropEvents) {\n if (dropEvents.leave) { interaction.prevDropTarget.fire(dropEvents.leave); }\n if (dropEvents.move ) { interaction.dropTarget.fire(dropEvents.move ); }\n if (dropEvents.enter) { interaction.dropTarget.fire(dropEvents.enter); }\n if (dropEvents.drop ) { interaction.dropTarget.fire(dropEvents.drop ); }\n if (dropEvents.deactivate) {\n fireActiveDrops(interaction, dropEvents.deactivate);\n }\n\n interaction.prevDropTarget = interaction.dropTarget;\n interaction.prevDropElement = interaction.dropElement;\n}\n\n/*\\\n * Interactable.dropzone\n [ method ]\n *\n * Returns or sets whether elements can be dropped onto this\n * Interactable to trigger drop events\n *\n * Dropzones can receive the following events:\n * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends\n * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone\n * - `dragmove` when a draggable that has entered the dropzone is moved\n * - `drop` when a draggable is dropped into this dropzone\n *\n * Use the `accept` option to allow only elements that match the given CSS\n * selector or element. The value can be:\n *\n * - **an Element** - only that element can be dropped into this dropzone.\n * - **a string**, - the element being dragged must match it as a CSS selector.\n * - **`null`** - accept options is cleared - it accepts any element.\n *\n * Use the `overlap` option to set how drops are checked for. The allowed\n * values are:\n *\n * - `'pointer'`, the pointer must be over the dropzone (default)\n * - `'center'`, the draggable element's center must be over the dropzone\n * - a number from 0-1 which is the `(intersection area) / (draggable area)`.\n * e.g. `0.5` for drop to happen when half of the area of the draggable is\n * over the dropzone\n *\n * Use the `checker` option to specify a function to check if a dragged\n * element is over this Interactable.\n *\n | interact(target)\n | .dropChecker(function(dragEvent, // related dragmove or dragend event\n | event, // TouchEvent/PointerEvent/MouseEvent\n | dropped, // bool result of the default checker\n | dropzone, // dropzone Interactable\n | dropElement, // dropzone elemnt\n | draggable, // draggable Interactable\n | draggableElement) {// draggable element\n |\n | return dropped && event.target.hasAttribute('allow-drop');\n | }\n *\n *\n - options (boolean | object | null) #optional The new value to be set.\n | interact('.drop').dropzone({\n | accept: '.can-drop' || document.getElementById('single-drop'),\n | overlap: 'pointer' || 'center' || zeroToOne\n | }\n = (boolean | object) The current setting or this Interactable\n\\*/\nInteractable.prototype.dropzone = function (options) {\n if (utils.is.object(options)) {\n this.options.drop.enabled = options.enabled === false? false: true;\n\n if (utils.is.function(options.ondrop) ) { this.events.ondrop = options.ondrop ; }\n if (utils.is.function(options.ondropactivate) ) { this.events.ondropactivate = options.ondropactivate ; }\n if (utils.is.function(options.ondropdeactivate)) { this.events.ondropdeactivate = options.ondropdeactivate; }\n if (utils.is.function(options.ondragenter) ) { this.events.ondragenter = options.ondragenter ; }\n if (utils.is.function(options.ondragleave) ) { this.events.ondragleave = options.ondragleave ; }\n if (utils.is.function(options.ondropmove) ) { this.events.ondropmove = options.ondropmove ; }\n\n if (/^(pointer|center)$/.test(options.overlap)) {\n this.options.drop.overlap = options.overlap;\n }\n else if (utils.is.number(options.overlap)) {\n this.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0);\n }\n if ('accept' in options) {\n this.options.drop.accept = options.accept;\n }\n if ('checker' in options) {\n this.options.drop.checker = options.checker;\n }\n\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drop.enabled = options;\n\n if (!options) {\n this.ondragenter = this.ondragleave = this.ondrop\n = this.ondropactivate = this.ondropdeactivate = null;\n }\n\n return this;\n }\n\n return this.options.drop;\n};\n\nInteractable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) {\n let dropped = false;\n\n // if the dropzone has no rect (eg. display: none)\n // call the custom dropChecker or just return false\n if (!(rect = rect || this.getRect(dropElement))) {\n return (this.options.drop.checker\n ? this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement)\n : false);\n }\n\n const dropOverlap = this.options.drop.overlap;\n\n if (dropOverlap === 'pointer') {\n const origin = utils.getOriginXY(draggable, draggableElement, 'drag');\n const page = utils.getPageXY(dragEvent);\n\n page.x += origin.x;\n page.y += origin.y;\n\n const horizontal = (page.x > rect.left) && (page.x < rect.right);\n const vertical = (page.y > rect.top ) && (page.y < rect.bottom);\n\n dropped = horizontal && vertical;\n }\n\n const dragRect = draggable.getRect(draggableElement);\n\n if (dragRect && dropOverlap === 'center') {\n const cx = dragRect.left + dragRect.width / 2;\n const cy = dragRect.top + dragRect.height / 2;\n\n dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom;\n }\n\n if (dragRect && utils.is.number(dropOverlap)) {\n const overlapArea = (Math.max(0, Math.min(rect.right , dragRect.right ) - Math.max(rect.left, dragRect.left))\n * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top , dragRect.top )));\n\n const overlapRatio = overlapArea / (dragRect.width * dragRect.height);\n\n dropped = overlapRatio >= dropOverlap;\n }\n\n if (this.options.drop.checker) {\n dropped = this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement);\n }\n\n return dropped;\n};\n\nInteractable.signals.on('unset', function ({ interactable }) {\n interactable.dropzone(false);\n});\n\nInteractable.settingsMethods.push('dropChecker');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.dropTarget = null; // the dropzone a drag target might be dropped into\n interaction.dropElement = null; // the element at the time of checking\n interaction.prevDropTarget = null; // the dropzone that was recently dragged away from\n interaction.prevDropElement = null; // the element at the time of checking\n interaction.dropEvents = null; // the dropEvents related to the current drag event\n\n interaction.activeDrops = {\n dropzones: [], // the dropzones that are mentioned below\n elements : [], // elements of dropzones that accept the target draggable\n rects : [], // the rects of the elements mentioned above\n };\n\n});\n\nInteraction.signals.on('stop', function ({ interaction }) {\n interaction.dropTarget = interaction.dropElement =\n interaction.prevDropTarget = interaction.prevDropElement = null;\n});\n\n/*\\\n * interact.dynamicDrop\n [ method ]\n *\n * Returns or sets whether the dimensions of dropzone elements are\n * calculated on every dragmove or only on dragstart for the default\n * dropChecker\n *\n - newValue (boolean) #optional True to check on each move. False to check only before start\n = (boolean | interact) The current setting or interact\n\\*/\ninteract.dynamicDrop = function (newValue) {\n if (utils.is.bool(newValue)) {\n //if (dragging && dynamicDrop !== newValue && !newValue) {\n //calcRects(dropzones);\n //}\n\n dynamicDrop = newValue;\n\n return interact;\n }\n return dynamicDrop;\n};\n\nutils.merge(Interactable.eventTypes, [\n 'dragenter',\n 'dragleave',\n 'dropactivate',\n 'dropdeactivate',\n 'dropmove',\n 'drop',\n]);\nactions.methodDict.drop = 'dropzone';\n\ndefaultOptions.drop = drop.defaults;\n\nmodule.exports = drop;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst gesture = {\n defaults: {\n enabled : false,\n origin : null,\n restrict: null,\n },\n\n checker: function (pointer, event, interactable, element, interaction) {\n if (interaction.pointerIds.length >= 2) {\n return { name: 'gesture' };\n }\n\n return null;\n },\n\n getCursor: function () {\n return '';\n },\n};\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturestart') { return; }\n iEvent.ds = 0;\n\n interaction.gesture.startDistance = interaction.gesture.prevDistance = iEvent.distance;\n interaction.gesture.startAngle = interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.scale = 1;\n});\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturemove') { return; }\n\n iEvent.ds = iEvent.scale - interaction.gesture.scale;\n\n interaction.target.fire(iEvent);\n\n interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.prevDistance = iEvent.distance;\n\n if (iEvent.scale !== Infinity\n && iEvent.scale !== null\n && iEvent.scale !== undefined\n && !isNaN(iEvent.scale)) {\n\n interaction.gesture.scale = iEvent.scale;\n }\n});\n\n/*\\\n * Interactable.gesturable\n [ method ]\n *\n * Gets or sets whether multitouch gestures can be performed on the\n * Interactable's element\n *\n = (boolean) Indicates if this can be the target of gesture events\n | var isGestureable = interact(element).gesturable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on gesture events (makes the Interactable gesturable)\n = (object) this Interactable\n | interact(element).gesturable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // limit multiple gestures.\n | // See the explanation in @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n\\*/\nInteractable.prototype.gesturable = function (options) {\n if (utils.is.object(options)) {\n this.options.gesture.enabled = options.enabled === false? false: true;\n this.setPerAction('gesture', options);\n this.setOnEvents('gesture', options);\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.gesture.enabled = options;\n\n if (!options) {\n this.ongesturestart = this.ongesturestart = this.ongestureend = null;\n }\n\n return this;\n }\n\n return this.options.gesture;\n};\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action, event, starting, ending, deltaSource }) {\n if (action !== 'gesture') { return; }\n\n const pointers = interaction.pointers;\n\n iEvent.touches = [pointers[0], pointers[1]];\n\n if (starting) {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = 1;\n iEvent.ds = 0;\n iEvent.angle = utils.touchAngle(pointers, undefined, deltaSource);\n iEvent.da = 0;\n }\n else if (ending || event instanceof InteractEvent) {\n iEvent.distance = interaction.prevEvent.distance;\n iEvent.box = interaction.prevEvent.box;\n iEvent.scale = interaction.prevEvent.scale;\n iEvent.ds = iEvent.scale - 1;\n iEvent.angle = interaction.prevEvent.angle;\n iEvent.da = iEvent.angle - interaction.gesture.startAngle;\n }\n else {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = iEvent.distance / interaction.gesture.startDistance;\n iEvent.angle = utils.touchAngle(pointers, interaction.gesture.prevAngle, deltaSource);\n\n iEvent.ds = iEvent.scale - interaction.gesture.prevScale;\n iEvent.da = iEvent.angle - interaction.gesture.prevAngle;\n }\n});\n\nInteraction.signals.on('new', function (interaction) {\n interaction.gesture = {\n start: { x: 0, y: 0 },\n\n startDistance: 0, // distance between two touches of touchStart\n prevDistance : 0,\n distance : 0,\n\n scale: 1, // gesture.distance / gesture.startDistance\n\n startAngle: 0, // angle of line joining two touches\n prevAngle : 0, // angle of the previous gesture event\n };\n});\n\nactions.gesture = gesture;\nactions.names.push('gesture');\nutils.merge(Interactable.eventTypes, [\n 'gesturestart',\n 'gesturemove',\n 'gestureend',\n]);\nactions.methodDict.gesture = 'gesturable';\n\ndefaultOptions.gesture = gesture.defaults;\n\nmodule.exports = gesture;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\n// Less Precision with touch input\nconst defaultMargin = browser.supportsTouch || browser.supportsPointerEvent? 20: 10;\n\nconst resize = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n square: false,\n preserveAspectRatio: false,\n axis: 'xy',\n\n // use default margin\n margin: NaN,\n\n // object with props left, right, top, bottom which are\n // true/false values to resize when the pointer is over that edge,\n // CSS selectors to match the handles for each direction\n // or the Elements for each handle\n edges: null,\n\n // a value of 'none' will limit the resize rect to a minimum of 0x0\n // 'negate' will alow the rect to have negative width/height\n // 'reposition' will keep the width/height positive by swapping\n // the top and bottom edges and/or swapping the left and right edges\n invert: 'none',\n },\n\n checker: function (pointer, event, interactable, element, interaction, rect) {\n if (!rect) { return null; }\n\n const page = utils.extend({}, interaction.curCoords.page);\n const options = interactable.options;\n\n if (options.resize.enabled) {\n const resizeOptions = options.resize;\n const resizeEdges = { left: false, right: false, top: false, bottom: false };\n\n // if using resize.edges\n if (utils.is.object(resizeOptions.edges)) {\n for (const edge in resizeEdges) {\n resizeEdges[edge] = checkResizeEdge(edge,\n resizeOptions.edges[edge],\n page,\n interaction._eventTarget,\n element,\n rect,\n resizeOptions.margin || defaultMargin);\n }\n\n resizeEdges.left = resizeEdges.left && !resizeEdges.right;\n resizeEdges.top = resizeEdges.top && !resizeEdges.bottom;\n\n if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) {\n return {\n name: 'resize',\n edges: resizeEdges,\n };\n }\n }\n else {\n const right = options.resize.axis !== 'y' && page.x > (rect.right - defaultMargin);\n const bottom = options.resize.axis !== 'x' && page.y > (rect.bottom - defaultMargin);\n\n if (right || bottom) {\n return {\n name: 'resize',\n axes: (right? 'x' : '') + (bottom? 'y' : ''),\n };\n }\n }\n }\n\n return null;\n },\n\n cursors: (browser.isIe9OrOlder ? {\n x : 'e-resize',\n y : 's-resize',\n xy: 'se-resize',\n\n top : 'n-resize',\n left : 'w-resize',\n bottom : 's-resize',\n right : 'e-resize',\n topleft : 'se-resize',\n bottomright: 'se-resize',\n topright : 'ne-resize',\n bottomleft : 'ne-resize',\n } : {\n x : 'ew-resize',\n y : 'ns-resize',\n xy: 'nwse-resize',\n\n top : 'ns-resize',\n left : 'ew-resize',\n bottom : 'ns-resize',\n right : 'ew-resize',\n topleft : 'nwse-resize',\n bottomright: 'nwse-resize',\n topright : 'nesw-resize',\n bottomleft : 'nesw-resize',\n }),\n\n getCursor: function (action) {\n if (action.axis) {\n return resize.cursors[action.name + action.axis];\n }\n else if (action.edges) {\n let cursorKey = '';\n const edgeNames = ['top', 'bottom', 'left', 'right'];\n\n for (let i = 0; i < 4; i++) {\n if (action.edges[edgeNames[i]]) {\n cursorKey += edgeNames[i];\n }\n }\n\n return resize.cursors[cursorKey];\n }\n },\n};\n\n// resizestart\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'resizestart' || !interaction.prepared.edges) {\n return;\n }\n\n const startRect = interaction.target.getRect(interaction.element);\n const resizeOptions = interaction.target.options.resize;\n\n /*\n * When using the `resizable.square` or `resizable.preserveAspectRatio` options, resizing from one edge\n * will affect another. E.g. with `resizable.square`, resizing to make the right edge larger will make\n * the bottom edge larger by the same amount. We call these 'linked' edges. Any linked edges will depend\n * on the active edges and the edge being interacted with.\n */\n if (resizeOptions.square || resizeOptions.preserveAspectRatio) {\n const linkedEdges = utils.extend({}, interaction.prepared.edges);\n\n linkedEdges.top = linkedEdges.top || (linkedEdges.left && !linkedEdges.bottom);\n linkedEdges.left = linkedEdges.left || (linkedEdges.top && !linkedEdges.right );\n linkedEdges.bottom = linkedEdges.bottom || (linkedEdges.right && !linkedEdges.top );\n linkedEdges.right = linkedEdges.right || (linkedEdges.bottom && !linkedEdges.left );\n\n interaction.prepared._linkedEdges = linkedEdges;\n }\n else {\n interaction.prepared._linkedEdges = null;\n }\n\n // if using `resizable.preserveAspectRatio` option, record aspect ratio at the start of the resize\n if (resizeOptions.preserveAspectRatio) {\n interaction.resizeStartAspectRatio = startRect.width / startRect.height;\n }\n\n interaction.resizeRects = {\n start : startRect,\n current : utils.extend({}, startRect),\n inverted : utils.extend({}, startRect),\n previous : utils.extend({}, startRect),\n delta : {\n left: 0, right : 0, width : 0,\n top : 0, bottom: 0, height: 0,\n },\n };\n\n iEvent.rect = interaction.resizeRects.inverted;\n iEvent.deltaRect = interaction.resizeRects.delta;\n});\n\n// resizemove\nInteractEvent.signals.on('new', function ({ iEvent, phase, interaction }) {\n if (phase !== 'move' || !interaction.prepared.edges) { return; }\n\n const resizeOptions = interaction.target.options.resize;\n const invert = resizeOptions.invert;\n const invertible = invert === 'reposition' || invert === 'negate';\n\n let edges = interaction.prepared.edges;\n\n const start = interaction.resizeRects.start;\n const current = interaction.resizeRects.current;\n const inverted = interaction.resizeRects.inverted;\n const delta = interaction.resizeRects.delta;\n const previous = utils.extend(interaction.resizeRects.previous, inverted);\n const originalEdges = edges;\n\n let dx = iEvent.dx;\n let dy = iEvent.dy;\n\n if (resizeOptions.preserveAspectRatio || resizeOptions.square) {\n // `resize.preserveAspectRatio` takes precedence over `resize.square`\n const startAspectRatio = resizeOptions.preserveAspectRatio\n ? interaction.resizeStartAspectRatio\n : 1;\n\n edges = interaction.prepared._linkedEdges;\n\n if ((originalEdges.left && originalEdges.bottom)\n || (originalEdges.right && originalEdges.top)) {\n dy = -dx / startAspectRatio;\n }\n else if (originalEdges.left || originalEdges.right ) { dy = dx / startAspectRatio; }\n else if (originalEdges.top || originalEdges.bottom) { dx = dy * startAspectRatio; }\n }\n\n // update the 'current' rect without modifications\n if (edges.top ) { current.top += dy; }\n if (edges.bottom) { current.bottom += dy; }\n if (edges.left ) { current.left += dx; }\n if (edges.right ) { current.right += dx; }\n\n if (invertible) {\n // if invertible, copy the current rect\n utils.extend(inverted, current);\n\n if (invert === 'reposition') {\n // swap edge values if necessary to keep width/height positive\n let swap;\n\n if (inverted.top > inverted.bottom) {\n swap = inverted.top;\n\n inverted.top = inverted.bottom;\n inverted.bottom = swap;\n }\n if (inverted.left > inverted.right) {\n swap = inverted.left;\n\n inverted.left = inverted.right;\n inverted.right = swap;\n }\n }\n }\n else {\n // if not invertible, restrict to minimum of 0x0 rect\n inverted.top = Math.min(current.top, start.bottom);\n inverted.bottom = Math.max(current.bottom, start.top);\n inverted.left = Math.min(current.left, start.right);\n inverted.right = Math.max(current.right, start.left);\n }\n\n inverted.width = inverted.right - inverted.left;\n inverted.height = inverted.bottom - inverted.top ;\n\n for (const edge in inverted) {\n delta[edge] = inverted[edge] - previous[edge];\n }\n\n iEvent.edges = interaction.prepared.edges;\n iEvent.rect = inverted;\n iEvent.deltaRect = delta;\n});\n\n/*\\\n * Interactable.resizable\n [ method ]\n *\n * Gets or sets whether resize actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of resize elements\n | var isResizeable = interact('input[type=text]').resizable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on resize events (object makes the Interactable resizable)\n = (object) This Interactable\n | interact(element).resizable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | edges: {\n | top : true, // Use pointer coords to check for resize.\n | left : false, // Disable resizing from left edge.\n | bottom: '.resize-s',// Resize if pointer target matches selector\n | right : handleEl // Resize if pointer target is the given Element\n | },\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height are adjusted at a 1:1 ratio.\n | square: false,\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height maintain the aspect ratio they had when resizing started.\n | preserveAspectRatio: false,\n |\n | // a value of 'none' will limit the resize rect to a minimum of 0x0\n | // 'negate' will allow the rect to have negative width/height\n | // 'reposition' will keep the width/height positive by swapping\n | // the top and bottom edges and/or swapping the left and right edges\n | invert: 'none' || 'negate' || 'reposition'\n |\n | // limit multiple resizes.\n | // See the explanation in the @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n \\*/\nInteractable.prototype.resizable = function (options) {\n if (utils.is.object(options)) {\n this.options.resize.enabled = options.enabled === false? false: true;\n this.setPerAction('resize', options);\n this.setOnEvents('resize', options);\n\n if (/^x$|^y$|^xy$/.test(options.axis)) {\n this.options.resize.axis = options.axis;\n }\n else if (options.axis === null) {\n this.options.resize.axis = defaultOptions.resize.axis;\n }\n\n if (utils.is.bool(options.preserveAspectRatio)) {\n this.options.resize.preserveAspectRatio = options.preserveAspectRatio;\n }\n else if (utils.is.bool(options.square)) {\n this.options.resize.square = options.square;\n }\n\n return this;\n }\n if (utils.is.bool(options)) {\n this.options.resize.enabled = options;\n\n if (!options) {\n this.onresizestart = this.onresizestart = this.onresizeend = null;\n }\n\n return this;\n }\n return this.options.resize;\n};\n\nfunction checkResizeEdge (name, value, page, element, interactableElement, rect, margin) {\n // false, '', undefined, null\n if (!value) { return false; }\n\n // true value, use pointer coords and element rect\n if (value === true) {\n // if dimensions are negative, \"switch\" edges\n const width = utils.is.number(rect.width )? rect.width : rect.right - rect.left;\n const height = utils.is.number(rect.height)? rect.height : rect.bottom - rect.top ;\n\n if (width < 0) {\n if (name === 'left' ) { name = 'right'; }\n else if (name === 'right') { name = 'left' ; }\n }\n if (height < 0) {\n if (name === 'top' ) { name = 'bottom'; }\n else if (name === 'bottom') { name = 'top' ; }\n }\n\n if (name === 'left' ) { return page.x < ((width >= 0? rect.left: rect.right ) + margin); }\n if (name === 'top' ) { return page.y < ((height >= 0? rect.top : rect.bottom) + margin); }\n\n if (name === 'right' ) { return page.x > ((width >= 0? rect.right : rect.left) - margin); }\n if (name === 'bottom') { return page.y > ((height >= 0? rect.bottom: rect.top ) - margin); }\n }\n\n // the remaining checks require an element\n if (!utils.is.element(element)) { return false; }\n\n return utils.is.element(value)\n // the value is an element to use as a resize handle\n ? value === element\n // otherwise check if element matches value as selector\n : utils.matchesUpTo(element, value, interactableElement);\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.resizeAxes = 'xy';\n});\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action }) {\n if (action !== 'resize' || !interaction.resizeAxes) { return; }\n\n const options = interaction.target.options;\n\n if (options.resize.square) {\n if (interaction.resizeAxes === 'y') {\n iEvent.dx = iEvent.dy;\n }\n else {\n iEvent.dy = iEvent.dx;\n }\n iEvent.axes = 'xy';\n }\n else {\n iEvent.axes = interaction.resizeAxes;\n\n if (interaction.resizeAxes === 'x') {\n iEvent.dy = 0;\n }\n else if (interaction.resizeAxes === 'y') {\n iEvent.dx = 0;\n }\n }\n});\n\nactions.resize = resize;\nactions.names.push('resize');\nutils.merge(Interactable.eventTypes, [\n 'resizestart',\n 'resizemove',\n 'resizeinertiastart',\n 'resizeinertiaresume',\n 'resizeend',\n]);\nactions.methodDict.resize = 'resizable';\n\ndefaultOptions.resize = resize.defaults;\n\nmodule.exports = resize;\n","const raf = require('./utils/raf');\nconst getWindow = require('./utils/window').getWindow;\nconst is = require('./utils/is');\nconst domUtils = require('./utils/domUtils');\nconst Interaction = require('./Interaction');\nconst defaultOptions = require('./defaultOptions');\n\nconst autoScroll = {\n defaults: {\n enabled : false,\n container: null, // the item that is scrolled (Window or HTMLElement)\n margin : 60,\n speed : 300, // the scroll speed in pixels per second\n },\n\n interaction: null,\n i: null, // the handle returned by window.setInterval\n x: 0, y: 0, // Direction each pulse is to scroll in\n\n isScrolling: false,\n prevTime: 0,\n\n start: function (interaction) {\n autoScroll.isScrolling = true;\n raf.cancel(autoScroll.i);\n\n autoScroll.interaction = interaction;\n autoScroll.prevTime = new Date().getTime();\n autoScroll.i = raf.request(autoScroll.scroll);\n },\n\n stop: function () {\n autoScroll.isScrolling = false;\n raf.cancel(autoScroll.i);\n },\n\n // scroll the window by the values in scroll.x/y\n scroll: function () {\n const options = autoScroll.interaction.target.options[autoScroll.interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(autoScroll.interaction.element);\n const now = new Date().getTime();\n // change in time in seconds\n const dt = (now - autoScroll.prevTime) / 1000;\n // displacement\n const s = options.speed * dt;\n\n if (s >= 1) {\n if (is.window(container)) {\n container.scrollBy(autoScroll.x * s, autoScroll.y * s);\n }\n else if (container) {\n container.scrollLeft += autoScroll.x * s;\n container.scrollTop += autoScroll.y * s;\n }\n\n autoScroll.prevTime = now;\n }\n\n if (autoScroll.isScrolling) {\n raf.cancel(autoScroll.i);\n autoScroll.i = raf.request(autoScroll.scroll);\n }\n },\n check: function (interactable, actionName) {\n const options = interactable.options;\n\n return options[actionName].autoScroll && options[actionName].autoScroll.enabled;\n },\n onInteractionMove: function ({ interaction, pointer }) {\n if (!(interaction.interacting()\n && autoScroll.check(interaction.target, interaction.prepared.name))) {\n return;\n }\n\n if (interaction.simulation) {\n autoScroll.x = autoScroll.y = 0;\n return;\n }\n\n let top;\n let right;\n let bottom;\n let left;\n\n const options = interaction.target.options[interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(interaction.element);\n\n if (is.window(container)) {\n left = pointer.clientX < autoScroll.margin;\n top = pointer.clientY < autoScroll.margin;\n right = pointer.clientX > container.innerWidth - autoScroll.margin;\n bottom = pointer.clientY > container.innerHeight - autoScroll.margin;\n }\n else {\n const rect = domUtils.getElementClientRect(container);\n\n left = pointer.clientX < rect.left + autoScroll.margin;\n top = pointer.clientY < rect.top + autoScroll.margin;\n right = pointer.clientX > rect.right - autoScroll.margin;\n bottom = pointer.clientY > rect.bottom - autoScroll.margin;\n }\n\n autoScroll.x = (right ? 1: left? -1: 0);\n autoScroll.y = (bottom? 1: top? -1: 0);\n\n if (!autoScroll.isScrolling) {\n // set the autoScroll properties to those of the target\n autoScroll.margin = options.margin;\n autoScroll.speed = options.speed;\n\n autoScroll.start(interaction);\n }\n },\n};\n\nInteraction.signals.on('stop-active', function () {\n autoScroll.stop();\n});\n\nInteraction.signals.on('action-move', autoScroll.onInteractionMove);\n\ndefaultOptions.perAction.autoScroll = autoScroll.defaults;\n\nmodule.exports = autoScroll;\n","const Interactable = require('../Interactable');\nconst actions = require('../actions/base');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.ignoreFrom\n [ method ]\n *\n * If the target of the `mousedown`, `pointerdown` or `touchstart`\n * event or any of it's parents match the given CSS selector or\n * Element, no drag/resize/gesture is started.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to not ignore any elements\n = (string | Element | object) The current ignoreFrom value or this Interactable\n **\n | interact(element, { ignoreFrom: document.getElementById('no-action') });\n | // or\n | interact(element).ignoreFrom('input, textarea, a');\n\\*/\nInteractable.prototype.ignoreFrom = function (newValue) {\n return this._backCompatOption('ignoreFrom', newValue);\n};\n\n/*\\\n * Interactable.allowFrom\n [ method ]\n *\n * A drag/resize/gesture is started only If the target of the\n * `mousedown`, `pointerdown` or `touchstart` event or any of it's\n * parents match the given CSS selector or Element.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to allow from any element\n = (string | Element | object) The current allowFrom value or this Interactable\n **\n | interact(element, { allowFrom: document.getElementById('drag-handle') });\n | // or\n | interact(element).allowFrom('.handle');\n\\*/\nInteractable.prototype.allowFrom = function (newValue) {\n return this._backCompatOption('allowFrom', newValue);\n};\n\nInteractable.prototype.testIgnore = function (ignoreFrom, interactableElement, element) {\n if (!ignoreFrom || !is.element(element)) { return false; }\n\n if (is.string(ignoreFrom)) {\n return domUtils.matchesUpTo(element, ignoreFrom, interactableElement);\n }\n else if (is.element(ignoreFrom)) {\n return domUtils.nodeContains(ignoreFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testAllow = function (allowFrom, interactableElement, element) {\n if (!allowFrom) { return true; }\n\n if (!is.element(element)) { return false; }\n\n if (is.string(allowFrom)) {\n return domUtils.matchesUpTo(element, allowFrom, interactableElement);\n }\n else if (is.element(allowFrom)) {\n return domUtils.nodeContains(allowFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testIgnoreAllow = function (options, interactableElement, eventTarget) {\n return (!this.testIgnore(options.ignoreFrom, interactableElement, eventTarget)\n && this.testAllow(options.allowFrom, interactableElement, eventTarget));\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (event.buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\n","const interact = require('../interact');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst actions = require('../actions/base');\nconst defaultOptions = require('../defaultOptions');\nconst browser = require('../utils/browser');\nconst scope = require('../scope');\nconst utils = require('../utils');\nconst signals = require('../utils/Signals').new();\n\nrequire('./InteractableMethods');\n\nconst autoStart = {\n signals,\n withinInteractionLimit,\n // Allow this many interactions to happen simultaneously\n maxInteractions: Infinity,\n defaults: {\n perAction: {\n manualStart: false,\n max: Infinity,\n maxPerElement: 1,\n allowFrom: null,\n ignoreFrom: null,\n },\n },\n setActionDefaults: function (action) {\n utils.extend(action.defaults, autoStart.defaults.perAction);\n },\n};\n\n// set cursor style on mousedown\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget }) {\n if (interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\n// set cursor style on mousemove\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget }) {\n if (!interaction.mouse\n || interaction.pointerIsDown\n || interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\nInteraction.signals.on('move', function (arg) {\n const { interaction, event } = arg;\n\n if (!interaction.pointerIsDown\n || interaction.interacting()\n || !interaction.pointerWasMoved\n || !interaction.prepared.name) {\n return;\n }\n\n signals.fire('before-start', arg);\n\n const target = interaction.target;\n\n if (interaction.prepared.name && target) {\n // check manualStart and interaction limit\n if (target.options[interaction.prepared.name].manualStart\n || !withinInteractionLimit(target, interaction.element, interaction.prepared)) {\n interaction.stop(event);\n }\n else {\n interaction.start(interaction.prepared, target, interaction.element);\n }\n }\n});\n\n// Check if the current target supports the action.\n// If so, return the validated action. Otherwise, return null\nfunction validateAction (action, interactable, element, eventTarget) {\n if (utils.is.object(action)\n && interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget)\n && interactable.options[action.name].enabled\n && withinInteractionLimit(interactable, element, action)) {\n return action;\n }\n\n return null;\n}\n\nfunction validateSelector (interaction, pointer, event, matches, matchElements, eventTarget) {\n for (let i = 0, len = matches.length; i < len; i++) {\n const match = matches[i];\n const matchElement = matchElements[i];\n const action = validateAction(match.getAction(pointer, event, interaction, matchElement),\n match,\n matchElement,\n eventTarget);\n\n if (action) {\n return {\n action,\n target: match,\n element: matchElement,\n };\n }\n }\n\n return {};\n}\n\nfunction getActionInfo (interaction, pointer, event, eventTarget) {\n let matches = [];\n let matchElements = [];\n\n let element = eventTarget;\n let action = null;\n\n function pushMatches (interactable, selector, context) {\n const elements = (browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined);\n\n if (utils.matchesSelector(element, selector, elements)) {\n\n matches.push(interactable);\n matchElements.push(element);\n }\n }\n\n while (utils.is.element(element)) {\n matches = [];\n matchElements = [];\n\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && (action = validateAction(elementInteractable.getAction(pointer, event, interaction, element, eventTarget),\n elementInteractable,\n element,\n eventTarget))\n && !elementInteractable.options[action.name].manualStart) {\n return {\n element,\n action,\n target: elementInteractable,\n };\n }\n else {\n scope.interactables.forEachSelector(pushMatches, element);\n\n const actionInfo = validateSelector(interaction, pointer, event, matches, matchElements, eventTarget);\n\n if (actionInfo.action\n && !actionInfo.target.options[actionInfo.action.name].manualStart) {\n return actionInfo;\n }\n }\n\n element = utils.parentNode(element);\n }\n\n return {};\n}\n\nfunction prepare (interaction, { action, target, element }) {\n action = action || {};\n\n if (interaction.target && interaction.target.options.styleCursor) {\n interaction.target._doc.documentElement.style.cursor = '';\n }\n\n interaction.target = target;\n interaction.element = element;\n utils.copyAction(interaction.prepared, action);\n\n if (target && target.options.styleCursor) {\n const cursor = action? actions[action.name].getCursor(action) : '';\n interaction.target._doc.documentElement.style.cursor = cursor;\n }\n\n signals.fire('prepared', { interaction: interaction });\n}\n\nInteraction.signals.on('stop', function ({ interaction }) {\n const target = interaction.target;\n\n if (target && target.options.styleCursor) {\n target._doc.documentElement.style.cursor = '';\n }\n});\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (utils.is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (utils.is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n const buttons = event.buttons || ({\n 0: 1,\n 1: 4,\n 3: 8,\n 4: 16,\n })[event.button];\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\nfunction withinInteractionLimit (interactable, element, action) {\n const options = interactable.options;\n const maxActions = options[action.name].max;\n const maxPerElement = options[action.name].maxPerElement;\n let activeInteractions = 0;\n let targetCount = 0;\n let targetElementCount = 0;\n\n // no actions if any of these values == 0\n if (!(maxActions && maxPerElement && autoStart.maxInteractions)) { return; }\n\n for (let i = 0, len = scope.interactions.length; i < len; i++) {\n const interaction = scope.interactions[i];\n const otherAction = interaction.prepared.name;\n\n if (!interaction.interacting()) { continue; }\n\n activeInteractions++;\n\n if (activeInteractions >= autoStart.maxInteractions) {\n return false;\n }\n\n if (interaction.target !== interactable) { continue; }\n\n targetCount += (otherAction === action.name)|0;\n\n if (targetCount >= maxActions) {\n return false;\n }\n\n if (interaction.element === element) {\n targetElementCount++;\n\n if (otherAction !== action.name || targetElementCount >= maxPerElement) {\n return false;\n }\n }\n }\n\n return autoStart.maxInteractions > 0;\n}\n\n/*\\\n * interact.maxInteractions\n [ method ]\n **\n * Returns or sets the maximum number of concurrent interactions allowed.\n * By default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables\n * and elements, you need to enable it in the draggable, resizable and\n * gesturable `'max'` and `'maxPerElement'` options.\n **\n - newValue (number) #optional Any number. newValue <= 0 means no interactions.\n\\*/\ninteract.maxInteractions = function (newValue) {\n if (utils.is.number(newValue)) {\n autoStart.maxInteractions = newValue;\n\n return this;\n }\n\n return autoStart.maxInteractions;\n};\n\nInteractable.settingsMethods.push('styleCursor');\nInteractable.settingsMethods.push('actionChecker');\nInteractable.settingsMethods.push('ignoreFrom');\nInteractable.settingsMethods.push('allowFrom');\n\ndefaultOptions.base.actionChecker = null;\ndefaultOptions.base.styleCursor = true;\n\nutils.extend(defaultOptions.perAction, autoStart.defaults.perAction);\n\nmodule.exports = autoStart;\n","const autoStart = require('./base');\nconst Interaction = require('../Interaction');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.delayTimer = null;\n});\n\nautoStart.signals.on('prepared', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.delayTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.target, interaction.element);\n }, delay);\n }\n});\n\nInteraction.signals.on('move', function ({ interaction, duplicate }) {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.delayTimer);\n }\n});\n\n// prevent regular down->move autoStart\nautoStart.signals.on('before-start', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.prepared.name = null;\n }\n});\n","const autoStart = require('./base');\nconst scope = require('../scope');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\n\nconst { matchesSelector, parentNode } = require('../utils/domUtils');\n\nautoStart.setActionDefaults(require('../actions/drag'));\n\nautoStart.signals.on('before-start', function ({ interaction, eventTarget, dx, dy }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // check if a drag is in the correct axis\n const absX = Math.abs(dx);\n const absY = Math.abs(dy);\n const options = interaction.target.options.drag;\n const startAxis = options.startAxis;\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy');\n\n interaction.prepared.axis = options.lockAxis === 'start'\n ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n : options.lockAxis;\n\n // if the movement isn't in the startAxis of the interactable\n if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) {\n // cancel the prepared action\n interaction.prepared.name = null;\n\n // then try to get a drag from another ineractable\n\n if (!interaction.prepared.name) {\n\n let element = eventTarget;\n\n const getDraggable = function (interactable, selector, context) {\n const elements = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n if (interactable === interaction.target) { return; }\n\n if (!options.manualStart\n && !interactable.testIgnoreAllow(options, element, eventTarget)\n && matchesSelector(element, selector, elements)) {\n\n const action = interactable.getAction(interaction.downPointer,\n interaction.downEvent,\n interaction,\n element);\n\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, interactable)\n && autoStart.validateAction(action, interactable, element, eventTarget)) {\n\n return interactable;\n }\n }\n };\n\n let action = null;\n\n // check all interactables\n while (is.element(element)) {\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && elementInteractable !== interaction.target\n && !elementInteractable.options.drag.manualStart) {\n\n action = elementInteractable.getAction(interaction.downPointer, interaction.downEvent, interaction, element);\n }\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, elementInteractable)) {\n\n interaction.prepared.name = 'drag';\n interaction.target = elementInteractable;\n interaction.element = element;\n break;\n }\n\n const selectorInteractable = scope.interactables.forEachSelector(getDraggable, element);\n\n if (selectorInteractable) {\n interaction.prepared.name = 'drag';\n interaction.target = selectorInteractable;\n interaction.element = element;\n break;\n }\n\n element = parentNode(element);\n }\n }\n }\n});\n\nfunction checkStartAxis (startAxis, interactable) {\n if (!interactable) { return false; }\n\n const thisAxis = interactable.options.drag.startAxis;\n\n return (startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis);\n}\n","require('./base').setActionDefaults(require('../actions/gesture'));\n","require('./base').setActionDefaults(require('../actions/resize'));\n","module.exports = {\n base: {\n accept : null,\n preventDefault: 'auto',\n deltaSource : 'page',\n },\n\n perAction: {\n origin: { x: 0, y: 0 },\n\n // only allow left button by default\n // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n mouseButtons: 1,\n\n inertia: {\n enabled : false,\n resistance : 10, // the lambda in exponential decay\n minSpeed : 100, // target speed must be above this for inertia to start\n endSpeed : 10, // the speed at which inertia is slow enough to stop\n allowResume : true, // allow resuming an action in inertia phase\n smoothEndDuration: 300, // animate to snap/restrict endOnly if there's no inertia\n },\n },\n};\n","/* browser entry point */\n\n// Legacy browser support\nrequire('./legacyBrowsers');\n\n// inertia\nrequire('./inertia');\n\n// modifiers\nrequire('./modifiers/snap');\nrequire('./modifiers/restrict');\n\n// pointerEvents\nrequire('./pointerEvents/base');\nrequire('./pointerEvents/holdRepeat');\nrequire('./pointerEvents/interactableTargets');\n\n// delay\nrequire('./autoStart/delay');\n\n// actions\nrequire('./actions/gesture');\nrequire('./actions/resize');\nrequire('./actions/drag');\nrequire('./actions/drop');\n\n// load these modifiers after resize is loaded\nrequire('./modifiers/snapSize');\nrequire('./modifiers/restrictEdges');\nrequire('./modifiers/restrictSize');\n\n// autoStart actions\nrequire('./autoStart/gesture');\nrequire('./autoStart/resize');\nrequire('./autoStart/drag');\n\n// Interactable preventDefault setting\nrequire('./interactablePreventDefault.js');\n\n// autoScroll\nrequire('./autoScroll');\n\n// export interact\nmodule.exports = require('./interact');\n","const InteractEvent = require('./InteractEvent');\nconst Interaction = require('./Interaction');\nconst modifiers = require('./modifiers');\nconst utils = require('./utils');\nconst animationFrame = require('./utils/raf');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.inertiaStatus = {\n active : false,\n smoothEnd : false,\n allowResume: false,\n\n startEvent: null,\n upCoords : {},\n\n xe: 0, ye: 0,\n sx: 0, sy: 0,\n\n t0: 0,\n vx0: 0, vys: 0,\n duration: 0,\n\n lambda_v0: 0,\n one_ve_v0: 0,\n i : null,\n };\n\n interaction.boundInertiaFrame = () => inertiaFrame .apply(interaction);\n interaction.boundSmoothEndFrame = () => smoothEndFrame.apply(interaction);\n});\n\nInteraction.signals.on('down', function ({ interaction, event, pointer, eventTarget }) {\n const status = interaction.inertiaStatus;\n\n // Check if the down event hits the current inertia target\n if (status.active) {\n let element = eventTarget;\n\n // climb up the DOM tree from the event target\n while (utils.is.element(element)) {\n\n // if interaction element is the current inertia target element\n if (element === interaction.element) {\n // stop inertia\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n\n // update pointers to the down event's coordinates\n interaction.updatePointer(pointer);\n utils.setCoords(interaction.curCoords, interaction.pointers);\n\n // fire appropriate signals\n const signalArg = { interaction };\n Interaction.signals.fire('before-action-move', signalArg);\n Interaction.signals.fire('action-resume' , signalArg);\n\n // fire a reume event\n const resumeEvent = new InteractEvent(interaction,\n event,\n interaction.prepared.name,\n 'inertiaresume',\n interaction.element);\n\n interaction.target.fire(resumeEvent);\n interaction.prevEvent = resumeEvent;\n modifiers.resetStatuses(interaction.modifierStatuses);\n\n utils.copyCoords(interaction.prevCoords, interaction.curCoords);\n break;\n }\n\n element = utils.parentNode(element);\n }\n }\n});\n\nInteraction.signals.on('up', function ({ interaction, event }) {\n const status = interaction.inertiaStatus;\n\n if (!interaction.interacting() || status.active) { return; }\n\n const target = interaction.target;\n const options = target && target.options;\n const inertiaOptions = options && interaction.prepared.name && options[interaction.prepared.name].inertia;\n\n const now = new Date().getTime();\n const statuses = {};\n const page = utils.extend({}, interaction.curCoords.page);\n const pointerSpeed = interaction.pointerDelta.client.speed;\n\n let smoothEnd = false;\n let modifierResult;\n\n // check if inertia should be started\n const inertiaPossible = (inertiaOptions && inertiaOptions.enabled\n && interaction.prepared.name !== 'gesture'\n && event !== status.startEvent);\n\n const inertia = (inertiaPossible\n && (now - interaction.curCoords.timeStamp) < 50\n && pointerSpeed > inertiaOptions.minSpeed\n && pointerSpeed > inertiaOptions.endSpeed);\n\n const modifierArg = {\n interaction,\n pageCoords: page,\n statuses,\n preEnd: true,\n requireEndOnly: true,\n };\n\n // smoothEnd\n if (inertiaPossible && !inertia) {\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n if (modifierResult.shouldMove && modifierResult.locked) {\n smoothEnd = true;\n }\n }\n\n if (!(inertia || smoothEnd)) { return; }\n\n utils.copyCoords(status.upCoords, interaction.curCoords);\n\n interaction.pointers[0] = status.startEvent =\n new InteractEvent(interaction, event, interaction.prepared.name, 'inertiastart', interaction.element);\n\n status.t0 = now;\n\n status.active = true;\n status.allowResume = inertiaOptions.allowResume;\n interaction.simulation = status;\n\n target.fire(status.startEvent);\n\n if (inertia) {\n status.vx0 = interaction.pointerDelta.client.vx;\n status.vy0 = interaction.pointerDelta.client.vy;\n status.v0 = pointerSpeed;\n\n calcInertia(interaction, status);\n\n utils.extend(page, interaction.curCoords.page);\n\n page.x += status.xe;\n page.y += status.ye;\n\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n status.modifiedXe += modifierResult.dx;\n status.modifiedYe += modifierResult.dy;\n\n status.i = animationFrame.request(interaction.boundInertiaFrame);\n }\n else {\n status.smoothEnd = true;\n status.xe = modifierResult.dx;\n status.ye = modifierResult.dy;\n\n status.sx = status.sy = 0;\n\n status.i = animationFrame.request(interaction.boundSmoothEndFrame);\n }\n});\n\nInteraction.signals.on('stop-active', function ({ interaction }) {\n const status = interaction.inertiaStatus;\n\n if (status.active) {\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n }\n});\n\nfunction calcInertia (interaction, status) {\n const inertiaOptions = interaction.target.options[interaction.prepared.name].inertia;\n const lambda = inertiaOptions.resistance;\n const inertiaDur = -Math.log(inertiaOptions.endSpeed / status.v0) / lambda;\n\n status.x0 = interaction.prevEvent.pageX;\n status.y0 = interaction.prevEvent.pageY;\n status.t0 = status.startEvent.timeStamp / 1000;\n status.sx = status.sy = 0;\n\n status.modifiedXe = status.xe = (status.vx0 - inertiaDur) / lambda;\n status.modifiedYe = status.ye = (status.vy0 - inertiaDur) / lambda;\n status.te = inertiaDur;\n\n status.lambda_v0 = lambda / status.v0;\n status.one_ve_v0 = 1 - inertiaOptions.endSpeed / status.v0;\n}\n\nfunction inertiaFrame () {\n updateInertiaCoords(this);\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n\n const status = this.inertiaStatus;\n const options = this.target.options[this.prepared.name].inertia;\n const lambda = options.resistance;\n const t = new Date().getTime() / 1000 - status.t0;\n\n if (t < status.te) {\n\n const progress = 1 - (Math.exp(-lambda * t) - status.lambda_v0) / status.one_ve_v0;\n\n if (status.modifiedXe === status.xe && status.modifiedYe === status.ye) {\n status.sx = status.xe * progress;\n status.sy = status.ye * progress;\n }\n else {\n const quadPoint = utils.getQuadraticCurvePoint(0, 0,\n status.xe,\n status.ye,\n status.modifiedXe,\n status.modifiedYe,\n progress);\n\n status.sx = quadPoint.x;\n status.sy = quadPoint.y;\n }\n\n this.doMove();\n\n status.i = animationFrame.request(this.boundInertiaFrame);\n }\n else {\n status.sx = status.modifiedXe;\n status.sy = status.modifiedYe;\n\n this.doMove();\n this.end(status.startEvent);\n status.active = false;\n this.simulation = null;\n }\n\n utils.copyCoords(this.prevCoords, this.curCoords);\n}\n\nfunction smoothEndFrame () {\n updateInertiaCoords(this);\n\n const status = this.inertiaStatus;\n const t = new Date().getTime() - status.t0;\n const duration = this.target.options[this.prepared.name].inertia.smoothEndDuration;\n\n if (t < duration) {\n status.sx = utils.easeOutQuad(t, 0, status.xe, duration);\n status.sy = utils.easeOutQuad(t, 0, status.ye, duration);\n\n this.pointerMove(status.startEvent, status.startEvent);\n\n status.i = animationFrame.request(this.boundSmoothEndFrame);\n }\n else {\n status.sx = status.xe;\n status.sy = status.ye;\n\n this.pointerMove(status.startEvent, status.startEvent);\n this.end(status.startEvent);\n\n status.smoothEnd =\n status.active = false;\n this.simulation = null;\n }\n}\n\nfunction updateInertiaCoords (interaction) {\n const status = interaction.inertiaStatus;\n\n // return if inertia isn't running\n if (!status.active) { return; }\n\n const pageUp = status.upCoords.page;\n const clientUp = status.upCoords.client;\n\n utils.setCoords(interaction.curCoords, [ {\n pageX : pageUp.x + status.sx,\n pageY : pageUp.y + status.sy,\n clientX: clientUp.x + status.sx,\n clientY: clientUp.y + status.sy,\n } ]);\n}\n","const browser = require('./utils/browser');\nconst events = require('./utils/events');\nconst utils = require('./utils');\nconst scope = require('./scope');\nconst Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\n\nconst globalEvents = {};\n\n/*\\\n * interact\n [ method ]\n *\n * The methods of this variable can be used to set elements as\n * interactables and also to change various default settings.\n *\n * Calling it as a function and passing an element or a valid CSS selector\n * string returns an Interactable object which has various methods to\n * configure it.\n *\n - element (Element | string) The HTML or SVG Element to interact with or CSS selector\n = (object) An @Interactable\n *\n > Usage\n | interact('#draggable').draggable(true);\n |\n | var rectables = interact('rect');\n | rectables\n | .gesturable(true)\n | .on('gesturemove', function (event) {\n | // ...\n | });\n\\*/\nfunction interact (element, options) {\n let interactable = scope.interactables.get(element, options);\n\n if (!interactable) {\n interactable = new Interactable(element, options);\n interactable.events.global = globalEvents;\n }\n\n return interactable;\n}\n\n/*\\\n * interact.isSet\n [ method ]\n *\n * Check if an element has been set\n - element (Element) The Element being searched for\n = (boolean) Indicates if the element or CSS selector was previously passed to interact\n\\*/\ninteract.isSet = function (element, options) {\n return scope.interactables.indexOfElement(element, options && options.context) !== -1;\n};\n\n/*\\\n * interact.on\n [ method ]\n *\n * Adds a global listener for an InteractEvent or adds a DOM event to\n * `document`\n *\n - type (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) interact\n\\*/\ninteract.on = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.on(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.on(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n // if it is an InteractEvent type, add listener to globalEvents\n if (utils.contains(Interactable.eventTypes, type)) {\n // if this type of event was never bound\n if (!globalEvents[type]) {\n globalEvents[type] = [listener];\n }\n else {\n globalEvents[type].push(listener);\n }\n }\n // If non InteractEvent type, addEventListener to document\n else {\n events.add(scope.document, type, listener, { options });\n }\n\n return interact;\n};\n\n/*\\\n * interact.off\n [ method ]\n *\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n - type (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) interact\n \\*/\ninteract.off = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.off(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.off(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n if (!utils.contains(Interactable.eventTypes, type)) {\n events.remove(scope.document, type, listener, options);\n }\n else {\n let index;\n\n if (type in globalEvents\n && (index = utils.indexOf(globalEvents[type], listener)) !== -1) {\n globalEvents[type].splice(index, 1);\n }\n }\n\n return interact;\n};\n\n/*\\\n * interact.debug\n [ method ]\n *\n * Returns an object which exposes internal data\n = (object) An object with properties that outline the current state and expose internal functions and variables\n\\*/\ninteract.debug = function () {\n return scope;\n};\n\n// expose the functions used to calculate multi-touch properties\ninteract.getPointerAverage = utils.pointerAverage;\ninteract.getTouchBBox = utils.touchBBox;\ninteract.getTouchDistance = utils.touchDistance;\ninteract.getTouchAngle = utils.touchAngle;\n\ninteract.getElementRect = utils.getElementRect;\ninteract.getElementClientRect = utils.getElementClientRect;\ninteract.matchesSelector = utils.matchesSelector;\ninteract.closest = utils.closest;\n\n/*\\\n * interact.supportsTouch\n [ method ]\n *\n = (boolean) Whether or not the browser supports touch input\n\\*/\ninteract.supportsTouch = function () {\n return browser.supportsTouch;\n};\n\n/*\\\n * interact.supportsPointerEvent\n [ method ]\n *\n = (boolean) Whether or not the browser supports PointerEvents\n\\*/\ninteract.supportsPointerEvent = function () {\n return browser.supportsPointerEvent;\n};\n\n/*\\\n * interact.stop\n [ method ]\n *\n * Cancels all interactions (end events are not fired)\n *\n - event (Event) An event on which to call preventDefault()\n = (object) interact\n\\*/\ninteract.stop = function (event) {\n for (let i = scope.interactions.length - 1; i >= 0; i--) {\n scope.interactions[i].stop(event);\n }\n\n return interact;\n};\n\n/*\\\n * interact.pointerMoveTolerance\n [ method ]\n * Returns or sets the distance the pointer must be moved before an action\n * sequence occurs. This also affects tolerance for tap events.\n *\n - newValue (number) #optional The movement from the start position must be greater than this value\n = (number | Interactable) The current setting or interact\n\\*/\ninteract.pointerMoveTolerance = function (newValue) {\n if (utils.is.number(newValue)) {\n Interaction.pointerMoveTolerance = newValue;\n\n return this;\n }\n\n return Interaction.pointerMoveTolerance;\n};\n\ninteract.addDocument = scope.addDocument;\ninteract.removeDocument = scope.removeDocument;\n\nscope.interact = interact;\n\nmodule.exports = interact;\n","const Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\nconst scope = require('./scope');\nconst is = require('./utils/is');\nconst events = require('./utils/events');\n\nconst { nodeContains, matchesSelector } = require('./utils/domUtils');\n\n/*\\\n * Interactable.preventDefault\n [ method ]\n *\n * Returns or sets whether to prevent the browser's default behaviour\n * in response to pointer events. Can be set to:\n * - `'always'` to always prevent\n * - `'never'` to never prevent\n * - `'auto'` to let interact.js try to determine what would be best\n *\n - newValue (string) #optional `true`, `false` or `'auto'`\n = (string | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.preventDefault = function (newValue) {\n if (/^(always|never|auto)$/.test(newValue)) {\n this.options.preventDefault = newValue;\n return this;\n }\n\n if (is.bool(newValue)) {\n this.options.preventDefault = newValue? 'always' : 'never';\n return this;\n }\n\n return this.options.preventDefault;\n};\n\nInteractable.prototype.checkAndPreventDefault = function (event) {\n const setting = this.options.preventDefault;\n\n if (setting === 'never') { return; }\n\n if (setting === 'always') {\n event.preventDefault();\n return;\n }\n\n // setting === 'auto'\n\n // don't preventDefault if the browser supports passiveEvents\n // CSS touch-action and user-selecct should be used instead\n if (events.supportsOptions) {\n return;\n }\n\n // don't preventDefault of pointerdown events\n if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) {\n return;\n }\n\n // don't preventDefault on editable elements\n if (is.element(event.target)\n && matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) {\n return;\n }\n\n event.preventDefault();\n};\n\nfunction onInteractionEvent ({ interaction, event }) {\n if (interaction.target) {\n interaction.target.checkAndPreventDefault(event);\n }\n}\n\nfor (const eventSignal of ['down', 'move', 'up', 'cancel']) {\n Interaction.signals.on(eventSignal, onInteractionEvent);\n}\n\n// prevent native HTML5 drag on interact.js target elements\nInteraction.docEvents.dragstart = function preventNativeDrag (event) {\n for (const interaction of scope.interactions) {\n\n if (interaction.element\n && (interaction.element === event.target\n || nodeContains(interaction.element, event.target))) {\n\n interaction.target.checkAndPreventDefault(event);\n return;\n }\n }\n};\n","const scope = require('./scope');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst iFinder = require('./utils/interactionFinder');\nconst pointerEvents = require('./pointerEvents/base');\n\nconst { window } = require('./utils/window');\n\nconst toString = Object.prototype.toString;\n\nif (!window.Array.isArray) {\n window.Array.isArray = function (obj) {\n return toString.call(obj) === '[object Array]';\n };\n}\n\nif (!String.prototype.trim) {\n String.prototype.trim = function () {\n return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n };\n}\n\n// http://www.quirksmode.org/dom/events/click.html\n// >Events leading to dblclick\n//\n// IE8 doesn't fire down event before dblclick.\n// This workaround tries to fire a tap and doubletap after dblclick\nfunction onIE8Dblclick (event) {\n const eventTarget = event.target;\n const interaction = iFinder.search(event, event.type, eventTarget);\n\n if (!interaction) { return; }\n\n if (interaction.prevTap\n && event.clientX === interaction.prevTap.clientX\n && event.clientY === interaction.prevTap.clientY\n && eventTarget === interaction.prevTap.target) {\n\n interaction.downTargets[0] = eventTarget;\n interaction.downTimes [0] = new Date().getTime();\n\n pointerEvents.fire({\n interaction,\n event,\n eventTarget,\n pointer: event,\n type: 'tap',\n });\n }\n}\n\nif (browser.isIE8) {\n const selectFix = function (event) {\n for (const interaction of scope.interactions) {\n if (interaction.interacting()) {\n interaction.target.checkAndPreventDefault(event);\n }\n }\n };\n\n const onDocIE8 = function onDocIE8 ({ doc, win }, signalName) {\n const eventMethod = signalName.indexOf('listen') === 0\n ? events.add : events.remove;\n\n // For IE's lack of Event#preventDefault\n eventMethod(doc, 'selectstart', selectFix);\n\n if (pointerEvents) {\n eventMethod(doc, 'dblclick', onIE8Dblclick);\n }\n };\n\n scope.signals.on('add-document' , onDocIE8);\n scope.signals.on('remove-document', onDocIE8);\n}\n\nmodule.exports = null;\n","const InteractEvent = require('../InteractEvent');\nconst Interaction = require('../Interaction');\nconst extend = require('../utils/extend');\n\nconst modifiers = {\n names: [],\n\n setOffsets: function (arg) {\n const { interaction, pageCoords: page } = arg;\n const { target, element, startOffset } = interaction;\n const rect = target.getRect(element);\n\n if (rect) {\n startOffset.left = page.x - rect.left;\n startOffset.top = page.y - rect.top;\n\n startOffset.right = rect.right - page.x;\n startOffset.bottom = rect.bottom - page.y;\n\n if (!('width' in rect)) { rect.width = rect.right - rect.left; }\n if (!('height' in rect)) { rect.height = rect.bottom - rect.top ; }\n }\n else {\n startOffset.left = startOffset.top = startOffset.right = startOffset.bottom = 0;\n }\n\n arg.rect = rect;\n arg.interactable = target;\n arg.element = element;\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n\n arg.options = target.options[interaction.prepared.name][modifierName];\n\n if (!arg.options) {\n continue;\n }\n\n interaction.modifierOffsets[modifierName] = modifiers[modifierName].setOffset(arg);\n }\n },\n\n setAll: function (arg) {\n const { interaction, statuses, preEnd, requireEndOnly } = arg;\n const coords = extend({}, arg.pageCoords);\n const result = {\n dx: 0,\n dy: 0,\n changed: false,\n locked: false,\n shouldMove: true,\n };\n\n for (const modifierName of modifiers.names) {\n const modifier = modifiers[modifierName];\n const options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!shouldDo(options, preEnd, requireEndOnly)) { continue; }\n\n arg.status = arg.status = statuses[modifierName];\n arg.options = options;\n arg.offset = arg.interaction.modifierOffsets[modifierName];\n\n modifier.set(arg);\n\n if (arg.status.locked) {\n coords.x += arg.status.dx;\n coords.y += arg.status.dy;\n\n result.dx += arg.status.dx;\n result.dy += arg.status.dy;\n\n result.locked = true;\n }\n }\n\n // a move should be fired if:\n // - there are no modifiers enabled,\n // - no modifiers are \"locked\" i.e. have changed the pointer's coordinates, or\n // - the locked coords have changed since the last pointer move\n result.shouldMove = !arg.status || !result.locked || arg.status.changed;\n\n return result;\n },\n\n resetStatuses: function (statuses) {\n for (const modifierName of modifiers.names) {\n const status = statuses[modifierName] || {};\n\n status.dx = status.dy = 0;\n status.modifiedX = status.modifiedY = NaN;\n status.locked = false;\n status.changed = true;\n\n statuses[modifierName] = status;\n }\n\n return statuses;\n },\n\n start: function ({ interaction }, signalName) {\n const arg = {\n interaction,\n pageCoords: (signalName === 'action-resume' ?\n interaction.curCoords : interaction.startCoords).page,\n startOffset: interaction.startOffset,\n statuses: interaction.modifierStatuses,\n preEnd: false,\n requireEndOnly: false,\n };\n\n modifiers.setOffsets(arg);\n modifiers.resetStatuses(arg.statuses);\n\n arg.pageCoords = extend({}, interaction.startCoords.page);\n interaction.modifierResult = modifiers.setAll(arg);\n },\n};\n\nInteraction.signals.on('new', function (interaction) {\n interaction.startOffset = { left: 0, right: 0, top: 0, bottom: 0 };\n interaction.modifierOffsets = {};\n interaction.modifierStatuses = modifiers.resetStatuses({});\n interaction.modifierResult = null;\n});\n\nInteraction.signals.on('action-start' , modifiers.start);\nInteraction.signals.on('action-resume', modifiers.start);\n\nInteraction.signals.on('before-action-move', function ({ interaction, preEnd, interactingBeforeMove }) {\n const modifierResult = modifiers.setAll({\n interaction,\n preEnd,\n pageCoords: interaction.curCoords.page,\n statuses: interaction.modifierStatuses,\n requireEndOnly: false,\n });\n\n // don't fire an action move if a modifier would keep the event in the same\n // cordinates as before\n if (!modifierResult.shouldMove && interactingBeforeMove) {\n interaction._dontFireMove = true;\n }\n\n interaction.modifierResult = modifierResult;\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n for (let i = 0; i < modifiers.names.length; i++) {\n const options = interaction.target.options[interaction.prepared.name][modifiers.names[i]];\n\n // if the endOnly option is true for any modifier\n if (shouldDo(options, true, true)) {\n // fire a move event at the modified coordinates\n interaction.doMove({ event, preEnd: true });\n break;\n }\n }\n});\n\nInteractEvent.signals.on('set-xy', function (arg) {\n const { iEvent, interaction } = arg;\n const modifierArg = extend({}, arg);\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n modifierArg.options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!modifierArg.options) {\n continue;\n }\n\n const modifier = modifiers[modifierName];\n\n modifierArg.status = interaction.modifierStatuses[modifierName];\n\n iEvent[modifierName] = modifier.modifyCoords(modifierArg);\n }\n});\n\nfunction shouldDo (options, preEnd, requireEndOnly) {\n return (options && options.enabled\n && (preEnd || !options.endOnly)\n && (!requireEndOnly || options.endOnly));\n}\n\nmodule.exports = modifiers;\n","const modifiers = require('./index');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst restrict = {\n defaults: {\n enabled : false,\n endOnly : false,\n restriction: null,\n elementRect: null,\n },\n\n setOffset: function ({ rect, startOffset, options }) {\n const elementRect = options && options.elementRect;\n const offset = {};\n\n if (rect && elementRect) {\n offset.left = startOffset.left - (rect.width * elementRect.left);\n offset.top = startOffset.top - (rect.height * elementRect.top);\n\n offset.right = startOffset.right - (rect.width * (1 - elementRect.right));\n offset.bottom = startOffset.bottom - (rect.height * (1 - elementRect.bottom));\n }\n else {\n offset.left = offset.top = offset.right = offset.bottom = 0;\n }\n\n return offset;\n },\n\n set: function ({ pageCoords, interaction, status, options }) {\n if (!options) { return status; }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n\n const restriction = getRestrictionRect(options.restriction, interaction, page);\n\n if (!restriction) { return status; }\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n const rect = restriction;\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n const offset = interaction.modifierOffsets.restrict;\n\n // object is assumed to have\n // x, y, width, height or\n // left, top, right, bottom\n if ('x' in restriction && 'y' in restriction) {\n modifiedX = Math.max(Math.min(rect.x + rect.width - offset.right , page.x), rect.x + offset.left);\n modifiedY = Math.max(Math.min(rect.y + rect.height - offset.bottom, page.y), rect.y + offset.top );\n }\n else {\n modifiedX = Math.max(Math.min(rect.right - offset.right , page.x), rect.left + offset.left);\n modifiedY = Math.max(Math.min(rect.bottom - offset.bottom, page.y), rect.top + offset.top );\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const elementRect = options && options.elementRect;\n\n if (options && options.enabled\n && !(phase === 'start' && elementRect && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n getRestrictionRect,\n};\n\nfunction getRestrictionRect (value, interaction, page) {\n if (utils.is.function(value)) {\n return utils.resolveRectLike(value, interaction.target, interaction.element, [page.x, page.y, interaction]);\n } else {\n return utils.resolveRectLike(value, interaction.target, interaction.element);\n }\n}\n\nmodifiers.restrict = restrict;\nmodifiers.names.push('restrict');\n\ndefaultOptions.perAction.restrict = restrict.defaults;\n\nmodule.exports = restrict;\n","// This module adds the options.resize.restrictEdges setting which sets min and\n// max for the top, left, bottom and right edges of the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictEdges: {\n// inner: { top: 200, left: 200, right: 400, bottom: 400 },\n// outer: { top: 0, left: 0, right: 600, bottom: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst { getRestrictionRect } = require('./restrict');\n\nconst noInner = { top: +Infinity, left: +Infinity, bottom: -Infinity, right: -Infinity };\nconst noOuter = { top: -Infinity, left: -Infinity, bottom: +Infinity, right: +Infinity };\n\nconst restrictEdges = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n offset: null,\n },\n\n setOffset: function ({ interaction, startOffset, options }) {\n if (!options) {\n return utils.extend({}, startOffset);\n }\n\n const offset = getRestrictionRect(options.offset, interaction, interaction.startCoords.page);\n\n if (offset) {\n return {\n top: startOffset.top + offset.y,\n left: startOffset.left + offset.x,\n bottom: startOffset.bottom + offset.y,\n right: startOffset.right + offset.x,\n };\n }\n\n return startOffset;\n },\n\n set: function ({ pageCoords, interaction, status, offset, options }) {\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n const inner = rectUtils.xywhToTlbr(getRestrictionRect(options.inner, interaction, page)) || noInner;\n const outer = rectUtils.xywhToTlbr(getRestrictionRect(options.outer, interaction, page)) || noOuter;\n\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n if (edges.top) {\n modifiedY = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top);\n }\n else if (edges.bottom) {\n modifiedY = Math.max(Math.min(outer.bottom - offset.bottom, page.y), inner.bottom - offset.bottom);\n }\n if (edges.left) {\n modifiedX = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left);\n }\n else if (edges.right) {\n modifiedX = Math.max(Math.min(outer.right - offset.right, page.x), inner.right - offset.right);\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n if (options && options.enabled\n && !(phase === 'start' && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n noInner,\n noOuter,\n getRestrictionRect,\n};\n\nmodifiers.restrictEdges = restrictEdges;\nmodifiers.names.push('restrictEdges');\n\ndefaultOptions.perAction.restrictEdges = restrictEdges.defaults;\nresize.defaults.restrictEdges = restrictEdges.defaults;\n\nmodule.exports = restrictEdges;\n","// This module adds the options.resize.restrictSize setting which sets min and\n// max width and height for the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictSize: {\n// min: { width: -600, height: -600 },\n// max: { width: 600, height: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst restrictEdges = require('./restrictEdges');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst noMin = { width: -Infinity, height: -Infinity };\nconst noMax = { width: +Infinity, height: +Infinity };\n\nconst restrictSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n },\n\n setOffset: function ({ interaction }) {\n return interaction.startOffset;\n },\n\n set: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const rect = rectUtils.xywhToTlbr(interaction.resizeRects.inverted);\n\n const minSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.min, interaction)) || noMin;\n const maxSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.max, interaction)) || noMax;\n\n arg.options = {\n enabled: options.enabled,\n endOnly: options.endOnly,\n inner: utils.extend({}, restrictEdges.noInner),\n outer: utils.extend({}, restrictEdges.noOuter),\n };\n\n if (edges.top) {\n arg.options.inner.top = rect.bottom - minSize.height;\n arg.options.outer.top = rect.bottom - maxSize.height;\n }\n else if (edges.bottom) {\n arg.options.inner.bottom = rect.top + minSize.height;\n arg.options.outer.bottom = rect.top + maxSize.height;\n }\n if (edges.left) {\n arg.options.inner.left = rect.right - minSize.width;\n arg.options.outer.left = rect.right - maxSize.width;\n }\n else if (edges.right) {\n arg.options.inner.right = rect.left + minSize.width;\n arg.options.outer.right = rect.left + maxSize.width;\n }\n\n restrictEdges.set(arg);\n },\n\n modifyCoords: restrictEdges.modifyCoords,\n};\n\nmodifiers.restrictSize = restrictSize;\nmodifiers.names.push('restrictSize');\n\ndefaultOptions.perAction.restrictSize = restrictSize.defaults;\nresize.defaults.restrictSize = restrictSize.defaults;\n\nmodule.exports = restrictSize;\n","const modifiers = require('./index');\nconst interact = require('../interact');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst snap = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n\n relativePoints: null,\n },\n\n setOffset: function ({ interaction, interactable, element, rect, startOffset, options }) {\n const offsets = [];\n const optionsOrigin = utils.rectToXY(utils.resolveRectLike(options.origin));\n const origin = optionsOrigin || utils.getOriginXY(interactable, element, interaction.prepared.name);\n options = options || interactable.options[interaction.prepared.name].snap || {};\n\n let snapOffset;\n\n if (options.offset === 'startCoords') {\n snapOffset = {\n x: interaction.startCoords.page.x - origin.x,\n y: interaction.startCoords.page.y - origin.y,\n };\n }\n else {\n const offsetRect = utils.resolveRectLike(options.offset, interactable, element, [interaction]);\n\n snapOffset = utils.rectToXY(offsetRect) || { x: 0, y: 0 };\n }\n\n if (rect && options.relativePoints && options.relativePoints.length) {\n for (const { x: relativeX, y: relativeY } of options.relativePoints) {\n offsets.push({\n x: startOffset.left - (rect.width * relativeX) + snapOffset.x,\n y: startOffset.top - (rect.height * relativeY) + snapOffset.y,\n });\n }\n }\n else {\n offsets.push(snapOffset);\n }\n\n return offsets;\n },\n\n set: function ({ interaction, pageCoords, status, options, offset: offsets }) {\n const targets = [];\n let target;\n let page;\n let i;\n\n if (status.useStatusXY) {\n page = { x: status.x, y: status.y };\n }\n else {\n const origin = utils.getOriginXY(interaction.target, interaction.element, interaction.prepared.name);\n\n page = utils.extend({}, pageCoords);\n\n page.x -= origin.x;\n page.y -= origin.y;\n }\n\n status.realX = page.x;\n status.realY = page.y;\n\n let len = options.targets? options.targets.length : 0;\n\n for (const { x: offsetX, y: offsetY } of offsets) {\n const relativeX = page.x - offsetX;\n const relativeY = page.y - offsetY;\n\n for (const snapTarget of options.targets) {\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n targets.push({\n x: utils.is.number(target.x) ? (target.x + offsetX) : relativeX,\n y: utils.is.number(target.y) ? (target.y + offsetY) : relativeY,\n\n range: utils.is.number(target.range)? target.range: options.range,\n });\n }\n }\n\n const closest = {\n target: null,\n inRange: false,\n distance: 0,\n range: 0,\n dx: 0,\n dy: 0,\n };\n\n for (i = 0, len = targets.length; i < len; i++) {\n target = targets[i];\n\n const range = target.range;\n const dx = target.x - page.x;\n const dy = target.y - page.y;\n const distance = utils.hypot(dx, dy);\n let inRange = distance <= range;\n\n // Infinite targets count as being out of range\n // compared to non infinite ones that are in range\n if (range === Infinity && closest.inRange && closest.range !== Infinity) {\n inRange = false;\n }\n\n if (!closest.target || (inRange\n // is the closest target in range?\n ? (closest.inRange && range !== Infinity\n // the pointer is relatively deeper in this target\n ? distance / range < closest.distance / closest.range\n // this target has Infinite range and the closest doesn't\n : (range === Infinity && closest.range !== Infinity)\n // OR this target is closer that the previous closest\n || distance < closest.distance)\n // The other is not in range and the pointer is closer to this target\n : (!closest.inRange && distance < closest.distance))) {\n\n closest.target = target;\n closest.distance = distance;\n closest.range = range;\n closest.inRange = inRange;\n closest.dx = dx;\n closest.dy = dy;\n\n status.range = range;\n }\n }\n\n let snapChanged;\n\n if (closest.target) {\n snapChanged = (status.modifiedX !== closest.target.x || status.modifiedY !== closest.target.y);\n\n status.modifiedX = closest.target.x;\n status.modifiedY = closest.target.y;\n }\n else {\n snapChanged = true;\n\n status.modifiedX = NaN;\n status.modifiedY = NaN;\n }\n\n status.dx = closest.dx;\n status.dy = closest.dy;\n\n status.changed = (snapChanged || (closest.inRange && !status.locked));\n status.locked = closest.inRange;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const relativePoints = options && options.relativePoints;\n\n if (options && options.enabled\n && !(phase === 'start' && relativePoints && relativePoints.length)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n }\n\n return {\n range : status.range,\n locked : status.locked,\n x : status.modifiedX,\n y : status.modifiedY,\n realX : status.realX,\n realY : status.realY,\n dx : status.dx,\n dy : status.dy,\n };\n }\n },\n};\n\ninteract.createSnapGrid = function (grid) {\n return function (x, y) {\n const limits = grid.limits || {\n left : -Infinity,\n right : Infinity,\n top : -Infinity,\n bottom: Infinity,\n };\n let offsetX = 0;\n let offsetY = 0;\n\n if (utils.is.object(grid.offset)) {\n offsetX = grid.offset.x;\n offsetY = grid.offset.y;\n }\n\n const gridx = Math.round((x - offsetX) / grid.x);\n const gridy = Math.round((y - offsetY) / grid.y);\n\n const newX = Math.max(limits.left, Math.min(limits.right , gridx * grid.x + offsetX));\n const newY = Math.max(limits.top , Math.min(limits.bottom, gridy * grid.y + offsetY));\n\n return {\n x: newX,\n y: newY,\n range: grid.range,\n };\n };\n};\n\nmodifiers.snap = snap;\nmodifiers.names.push('snap');\n\ndefaultOptions.perAction.snap = snap.defaults;\n\nmodule.exports = snap;\n","// This module allows snapping of the size of targets during resize\n// interactions.\n\nconst modifiers = require('./index');\nconst snap = require('./snap');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\nconst utils = require('../utils/');\n\nconst snapSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n },\n\n setOffset: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.edges;\n\n if (!edges) { return; }\n\n arg.options = {\n relativePoints: [{\n x: edges.left? 0 : 1,\n y: edges.top ? 0 : 1,\n }],\n origin: { x: 0, y: 0 },\n offset: 'self',\n range: options.range,\n };\n\n const offsets = snap.setOffset(arg);\n arg.options = options;\n\n return offsets;\n },\n\n set: function (arg) {\n const { interaction, options, offset, pageCoords } = arg;\n const page = utils.extend({}, pageCoords);\n const relativeX = page.x - offset[0].x;\n const relativeY = page.y - offset[0].y;\n\n arg.options = utils.extend({}, options);\n arg.options.targets = [];\n\n for (const snapTarget of options.targets) {\n let target;\n\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n if ('width' in target && 'height' in target) {\n target.x = target.width;\n target.y = target.height;\n }\n\n arg.options.targets.push(target);\n }\n\n snap.set(arg);\n },\n\n modifyCoords: function (arg) {\n const { options } = arg;\n\n arg.options = utils.extend({}, options);\n arg.options.enabled = options.enabled;\n arg.options.relativePoints = [null];\n\n snap.modifyCoords(arg);\n },\n};\n\nmodifiers.snapSize = snapSize;\nmodifiers.names.push('snapSize');\n\ndefaultOptions.perAction.snapSize = snapSize.defaults;\nresize.defaults.snapSize = snapSize.defaults;\n\nmodule.exports = snapSize;\n","const pointerUtils = require('../utils/pointerUtils');\n\nmodule.exports = class PointerEvent {\n constructor (type, pointer, event, eventTarget, interaction) {\n pointerUtils.pointerExtend(this, event);\n\n if (event !== pointer) {\n pointerUtils.pointerExtend(this, pointer);\n }\n\n this.interaction = interaction;\n\n this.timeStamp = new Date().getTime();\n this.originalEvent = event;\n this.type = type;\n this.pointerId = pointerUtils.getPointerId(pointer);\n this.pointerType = pointerUtils.getPointerType(pointer, interaction);\n this.target = eventTarget;\n this.currentTarget = null;\n\n if (type === 'tap') {\n const pointerIndex = interaction.getPointerIndex(pointer);\n this.dt = this.timeStamp - interaction.downTimes[pointerIndex];\n\n const interval = this.timeStamp - interaction.tapTime;\n\n this.double = !!(interaction.prevTap\n && interaction.prevTap.type !== 'doubletap'\n && interaction.prevTap.target === this.target\n && interval < 500);\n }\n else if (type === 'doubletap') {\n this.dt = pointer.timeStamp - interaction.tapTime;\n }\n }\n\n subtractOrigin ({ x: originX, y: originY }) {\n this.pageX -= originX;\n this.pageY -= originY;\n this.clientX -= originX;\n this.clientY -= originY;\n\n return this;\n }\n\n addOrigin ({ x: originX, y: originY }) {\n this.pageX += originX;\n this.pageY += originY;\n this.clientX += originX;\n this.clientY += originY;\n\n return this;\n }\n\n preventDefault () {\n this.originalEvent.preventDefault();\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n};\n","const PointerEvent = require('./PointerEvent');\nconst Interaction = require('../Interaction');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst defaults = require('../defaultOptions');\nconst signals = require('../utils/Signals').new();\nconst { filter } = require('../utils/arr');\n\nconst simpleSignals = [ 'down', 'up', 'cancel' ];\nconst simpleEvents = [ 'down', 'up', 'cancel' ];\n\nconst pointerEvents = {\n PointerEvent,\n fire,\n collectEventTargets,\n signals,\n defaults: {\n holdDuration: 600,\n ignoreFrom : null,\n allowFrom : null,\n origin : { x: 0, y: 0 },\n },\n types: [\n 'down',\n 'move',\n 'up',\n 'cancel',\n 'tap',\n 'doubletap',\n 'hold',\n ],\n};\n\nfunction fire (arg) {\n const {\n interaction, pointer, event, eventTarget,\n type = arg.pointerEvent.type,\n targets = collectEventTargets(arg),\n pointerEvent = new PointerEvent(type, pointer, event, eventTarget, interaction),\n } = arg;\n\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n targets,\n type,\n pointerEvent,\n };\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n\n for (const prop in target.props || {}) {\n pointerEvent[prop] = target.props[prop];\n }\n\n const origin = utils.getOriginXY(target.eventable, target.element);\n\n pointerEvent.subtractOrigin(origin);\n pointerEvent.eventable = target.eventable;\n pointerEvent.currentTarget = target.element;\n\n target.eventable.fire(pointerEvent);\n\n pointerEvent.addOrigin(origin);\n\n if (pointerEvent.immediatePropagationStopped\n || (pointerEvent.propagationStopped\n && (i + 1) < targets.length && targets[i + 1].element !== pointerEvent.currentTarget)) {\n break;\n }\n }\n\n signals.fire('fired', signalArg);\n\n if (type === 'tap') {\n // if pointerEvent should make a double tap, create and fire a doubletap\n // PointerEvent and use that as the prevTap\n const prevTap = pointerEvent.double\n ? fire({\n interaction, pointer, event, eventTarget,\n type: 'doubletap',\n })\n : pointerEvent;\n\n interaction.prevTap = prevTap;\n interaction.tapTime = prevTap.timeStamp;\n }\n\n return pointerEvent;\n}\n\nfunction collectEventTargets ({ interaction, pointer, event, eventTarget, type }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n // do not fire a tap event if the pointer was moved before being lifted\n if (type === 'tap' && (interaction.pointerWasMoved\n // or if the pointerup target is different to the pointerdown target\n || !(interaction.downTargets[pointerIndex] && interaction.downTargets[pointerIndex] === eventTarget))) {\n return [];\n }\n\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n path,\n targets: [],\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (type === 'hold') {\n signalArg.targets = filter(signalArg.targets, target =>\n target.eventable.options.holdDuration === interaction.holdTimers[pointerIndex].duration);\n }\n\n return signalArg.targets;\n}\n\nInteraction.signals.on('update-pointer-down', function ({ interaction, pointerIndex }) {\n interaction.holdTimers[pointerIndex] = { duration: Infinity, timeout: null };\n});\n\nInteraction.signals.on('remove-pointer', function ({ interaction, pointerIndex }) {\n interaction.holdTimers.splice(pointerIndex, 1);\n});\n\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget, duplicateMove }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n if (!duplicateMove && (!interaction.pointerIsDown || interaction.pointerWasMoved)) {\n if (interaction.pointerIsDown) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n\n fire({\n interaction, pointer, event, eventTarget,\n type: 'move',\n });\n }\n});\n\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget, pointerIndex }) {\n // copy event to be used in timeout for IE8\n const eventCopy = browser.isIE8? utils.extend({}, event) : event;\n\n const timer = interaction.holdTimers[pointerIndex];\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'hold',\n targets: [],\n path,\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (!signalArg.targets.length) { return; }\n\n let minDuration = Infinity;\n\n for (let i = 0; i < signalArg.targets.length; i++) {\n const target = signalArg.targets[i];\n const holdDuration = target.eventable.options.holdDuration;\n\n if (holdDuration < minDuration) {\n minDuration = holdDuration;\n }\n }\n\n timer.duration = minDuration;\n timer.timeout = setTimeout(function () {\n fire({\n interaction, eventCopy, eventTarget,\n pointer: browser.isIE8? eventCopy : pointer,\n type: 'hold',\n });\n }, minDuration);\n});\n\nInteraction.signals.on('up', ({ interaction, pointer, event, eventTarget }) => {\n if (!interaction.pointerWasMoved) {\n fire({ interaction, eventTarget, pointer, event, type: 'tap' });\n }\n});\n\n['up', 'cancel'].forEach(function (signalName) {\n Interaction.signals.on(signalName, function ({ interaction, pointerIndex }) {\n if (interaction.holdTimers[pointerIndex]) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n });\n});\n\nfunction createSignalListener (type) {\n return function ({ interaction, pointer, event, eventTarget }) {\n fire({ interaction, eventTarget, pointer, event, type });\n };\n}\n\nfor (let i = 0; i < simpleSignals.length; i++) {\n Interaction.signals.on(simpleSignals[i], createSignalListener(simpleEvents[i]));\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.prevTap = null; // the most recent tap event on this interaction\n interaction.tapTime = 0; // time of the most recent tap event\n interaction.holdTimers = []; // [{ duration, timeout }]\n});\n\ndefaults.pointerEvents = pointerEvents.defaults;\nmodule.exports = pointerEvents;\n","const pointerEvents = require('./base');\nconst Interaction = require('../Interaction');\n\npointerEvents.signals.on('new', onNew);\npointerEvents.signals.on('fired', onFired);\n\nfor (const signal of ['move', 'up', 'cancel', 'endall']) {\n Interaction.signals.on(signal, endHoldRepeat);\n}\n\nfunction onNew ({ pointerEvent }) {\n if (pointerEvent.type !== 'hold') { return; }\n\n pointerEvent.count = (pointerEvent.count || 0) + 1;\n}\n\nfunction onFired ({ interaction, pointerEvent, eventTarget, targets }) {\n if (pointerEvent.type !== 'hold' || !targets.length) { return; }\n\n // get the repeat interval from the first eventable\n const interval = targets[0].eventable.options.holdRepeatInterval;\n\n // don't repeat if the interval is 0 or less\n if (interval <= 0) { return; }\n\n // set a timeout to fire the holdrepeat event\n interaction.holdIntervalHandle = setTimeout(function () {\n pointerEvents.fire({\n interaction,\n eventTarget,\n type: 'hold',\n pointer: pointerEvent,\n event: pointerEvent,\n });\n }, interval);\n}\n\nfunction endHoldRepeat ({ interaction }) {\n // set the interaction's holdStopTime property\n // to stop further holdRepeat events\n if (interaction.holdIntervalHandle) {\n clearInterval(interaction.holdIntervalHandle);\n interaction.holdIntervalHandle = null;\n }\n}\n\n// don't repeat by default\npointerEvents.defaults.holdRepeatInterval = 0;\npointerEvents.types.push('holdrepeat');\n\nmodule.exports = {\n onNew,\n onFired,\n endHoldRepeat,\n};\n","const pointerEvents = require('./base');\nconst Interactable = require('../Interactable');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\nconst scope = require('../scope');\nconst extend = require('../utils/extend');\nconst { merge } = require('../utils/arr');\n\npointerEvents.signals.on('collect-targets', function ({ targets, element, type, eventTarget }) {\n function collectSelectors (interactable, selector, context) {\n const els = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && is.element(element)\n && domUtils.matchesSelector(element, selector, els)\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n const interactable = scope.interactables.get(element);\n\n if (interactable) {\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n scope.interactables.forEachSelector(collectSelectors, element);\n});\n\nInteractable.signals.on('new', function ({ interactable }) {\n interactable.events.getRect = function (element) {\n return interactable.getRect(element);\n };\n});\n\nInteractable.signals.on('set', function ({ interactable, options }) {\n extend(interactable.events.options, pointerEvents.defaults);\n extend(interactable.events.options, options);\n});\n\nmerge(Interactable.eventTypes, pointerEvents.types);\n\nInteractable.prototype.pointerEvents = function (options) {\n extend(this.events.options, options);\n\n return this;\n};\n\nconst __backCompatOption = Interactable.prototype._backCompatOption;\n\nInteractable.prototype._backCompatOption = function (optionName, newValue) {\n const ret = __backCompatOption.call(this, optionName, newValue);\n\n if (ret === this) {\n this.events.options[optionName] = newValue;\n }\n\n return ret;\n};\n\nInteractable.settingsMethods.push('pointerEvents');\n","const utils = require('./utils');\nconst events = require('./utils/events');\nconst signals = require('./utils/Signals').new();\n\nconst scope = {\n signals,\n events,\n utils,\n\n // main document\n document: require('./utils/domObjects').document,\n // all documents being listened to\n documents: [],\n\n addDocument: function (doc, win) {\n // do nothing if document is already known\n if (utils.contains(scope.documents, doc)) { return false; }\n\n win = win || scope.getWindow(doc);\n\n scope.documents.push(doc);\n events.documents.push(doc);\n\n // don't add an unload event for the main document\n // so that the page may be cached in browser history\n if (doc !== scope.document) {\n events.add(win, 'unload', scope.onWindowUnload);\n }\n\n signals.fire('add-document', { doc, win });\n },\n\n removeDocument: function (doc, win) {\n const index = utils.indexOf(scope.documents, doc);\n\n win = win || scope.getWindow(doc);\n\n events.remove(win, 'unload', scope.onWindowUnload);\n\n scope.documents.splice(index, 1);\n events.documents.splice(index, 1);\n\n signals.fire('remove-document', { win, doc });\n },\n\n onWindowUnload: function () {\n scope.removeDocument(this.document, this);\n },\n};\n\nmodule.exports = scope;\n","const { indexOf } = require('./arr');\n\nclass Signals {\n constructor () {\n this.listeners = {\n // signalName: [listeners],\n };\n }\n\n on (name, listener) {\n if (!this.listeners[name]) {\n this.listeners[name] = [listener];\n return;\n }\n\n this.listeners[name].push(listener);\n }\n\n off (name, listener) {\n if (!this.listeners[name]) { return; }\n\n const index = indexOf(this.listeners[name], listener);\n\n if (index !== -1) {\n this.listeners[name].splice(index, 1);\n }\n }\n\n fire (name, arg) {\n const targetListeners = this.listeners[name];\n\n if (!targetListeners) { return; }\n\n for (let i = 0; i < targetListeners.length; i++) {\n if (targetListeners[i](arg, name) === false) {\n return;\n }\n }\n }\n}\n\nSignals.new = function () {\n return new Signals();\n};\n\nmodule.exports = Signals;\n","function indexOf (array, target) {\n for (let i = 0, len = array.length; i < len; i++) {\n if (array[i] === target) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction contains (array, target) {\n return indexOf(array, target) !== -1;\n}\n\nfunction merge (target, source) {\n for (let i = 0; i < source.length; i++) {\n target.push(source[i]);\n }\n\n return target;\n}\n\nfunction filter (array, test) {\n const result = [];\n\n for (let i = 0; i < array.length; i++) {\n if (test(array[i])) {\n result.push(array[i]);\n }\n }\n\n return result;\n}\n\nmodule.exports = {\n indexOf,\n contains,\n merge,\n filter,\n};\n","const { window } = require('./window');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst Element = domObjects.Element;\nconst navigator = window.navigator;\n\nconst browser = {\n // Does the browser support touch input?\n supportsTouch: !!(('ontouchstart' in window) || is.function(window.DocumentTouch)\n && domObjects.document instanceof window.DocumentTouch),\n\n // Does the browser support PointerEvents\n supportsPointerEvent: !!domObjects.PointerEvent,\n\n isIE8: ('attachEvent' in window) && !('addEventListener' in window),\n\n // Opera Mobile must be handled differently\n isOperaMobile: (navigator.appName === 'Opera'\n && browser.supportsTouch\n && navigator.userAgent.match('Presto')),\n\n // scrolling doesn't change the result of getClientRects on iOS 7\n isIOS7: (/iP(hone|od|ad)/.test(navigator.platform)\n && /OS 7[^\\d]/.test(navigator.appVersion)),\n\n isIe9OrOlder: /MSIE (8|9)/.test(navigator.userAgent),\n\n // prefix matchesSelector\n prefixedMatchesSelector: 'matches' in Element.prototype\n ? 'matches': 'webkitMatchesSelector' in Element.prototype\n ? 'webkitMatchesSelector': 'mozMatchesSelector' in Element.prototype\n ? 'mozMatchesSelector': 'oMatchesSelector' in Element.prototype\n ? 'oMatchesSelector': 'msMatchesSelector',\n\n useMatchesSelectorPolyfill: false,\n\n pEventTypes: (domObjects.PointerEvent\n ? (domObjects.PointerEvent === window.MSPointerEvent\n ? {\n up: 'MSPointerUp',\n down: 'MSPointerDown',\n over: 'mouseover',\n out: 'mouseout',\n move: 'MSPointerMove',\n cancel: 'MSPointerCancel',\n }\n : {\n up: 'pointerup',\n down: 'pointerdown',\n over: 'pointerover',\n out: 'pointerout',\n move: 'pointermove',\n cancel: 'pointercancel',\n })\n : null),\n\n // because Webkit and Opera still use 'mousewheel' event type\n wheelEvent: 'onmousewheel' in domObjects.document? 'mousewheel': 'wheel',\n\n};\n\nbrowser.useMatchesSelectorPolyfill = !is.function(Element.prototype[browser.prefixedMatchesSelector]);\n\nmodule.exports = browser;\n","const domObjects = {};\nconst win = require('./window').window;\n\nfunction blank () {}\n\ndomObjects.document = win.document;\ndomObjects.DocumentFragment = win.DocumentFragment || blank;\ndomObjects.SVGElement = win.SVGElement || blank;\ndomObjects.SVGSVGElement = win.SVGSVGElement || blank;\ndomObjects.SVGElementInstance = win.SVGElementInstance || blank;\ndomObjects.Element = win.Element || blank;\ndomObjects.HTMLElement = win.HTMLElement || domObjects.Element;\n\ndomObjects.Event = win.Event;\ndomObjects.Touch = win.Touch || blank;\ndomObjects.PointerEvent = (win.PointerEvent || win.MSPointerEvent);\n\nmodule.exports = domObjects;\n","const win = require('./window');\nconst browser = require('./browser');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst domUtils = {\n nodeContains: function (parent, child) {\n while (child) {\n if (child === parent) {\n return true;\n }\n\n child = child.parentNode;\n }\n\n return false;\n },\n\n closest: function (element, selector) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) { return element; }\n\n element = domUtils.parentNode(element);\n }\n\n return null;\n },\n\n parentNode: function (node) {\n let parent = node.parentNode;\n\n if (is.docFrag(parent)) {\n // skip past #shado-root fragments\n while ((parent = parent.host) && is.docFrag(parent)) {\n continue;\n }\n\n return parent;\n }\n\n return parent;\n },\n\n // taken from http://tanalin.com/en/blog/2012/12/matches-selector-ie8/ and modified\n matchesSelectorPolyfill: browser.useMatchesSelectorPolyfill\n ? function (element, selector, elems) {\n elems = elems || element.parentNode.querySelectorAll(selector);\n\n for (let i = 0, len = elems.length; i < len; i++) {\n if (elems[i] === element) {\n return true;\n }\n }\n\n return false;\n }\n : null,\n\n matchesSelector: function (element, selector, nodeList) {\n if (browser.useMatchesSelectorPolyfill) {\n return domUtils.matchesSelectorPolyfill(element, selector, nodeList);\n }\n\n // remove /deep/ from selectors if shadowDOM polyfill is used\n if (win.window !== win.realWindow) {\n selector = selector.replace(/\\/deep\\//g, ' ');\n }\n\n return element[browser.prefixedMatchesSelector](selector);\n },\n\n // Test for the element that's \"above\" all other qualifiers\n indexOfDeepestElement: function (elements) {\n let deepestZoneParents = [];\n let dropzoneParents = [];\n let dropzone;\n let deepestZone = elements[0];\n let index = deepestZone? 0: -1;\n let parent;\n let child;\n let i;\n let n;\n\n for (i = 1; i < elements.length; i++) {\n dropzone = elements[i];\n\n // an element might belong to multiple selector dropzones\n if (!dropzone || dropzone === deepestZone) {\n continue;\n }\n\n if (!deepestZone) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n // check if the deepest or current are document.documentElement or document.rootElement\n // - if the current dropzone is, do nothing and continue\n if (dropzone.parentNode === dropzone.ownerDocument) {\n continue;\n }\n // - if deepest is, update with the current dropzone and continue to next\n else if (deepestZone.parentNode === dropzone.ownerDocument) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n if (!deepestZoneParents.length) {\n parent = deepestZone;\n while (parent.parentNode && parent.parentNode !== parent.ownerDocument) {\n deepestZoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n }\n\n // if this element is an svg element and the current deepest is\n // an HTMLElement\n if (deepestZone instanceof domObjects.HTMLElement\n && dropzone instanceof domObjects.SVGElement\n && !(dropzone instanceof domObjects.SVGSVGElement)) {\n\n if (dropzone === deepestZone.parentNode) {\n continue;\n }\n\n parent = dropzone.ownerSVGElement;\n }\n else {\n parent = dropzone;\n }\n\n dropzoneParents = [];\n\n while (parent.parentNode !== parent.ownerDocument) {\n dropzoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n\n n = 0;\n\n // get (position of last common ancestor) + 1\n while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) {\n n++;\n }\n\n const parents = [\n dropzoneParents[n - 1],\n dropzoneParents[n],\n deepestZoneParents[n],\n ];\n\n child = parents[0].lastChild;\n\n while (child) {\n if (child === parents[1]) {\n deepestZone = dropzone;\n index = i;\n deepestZoneParents = [];\n\n break;\n }\n else if (child === parents[2]) {\n break;\n }\n\n child = child.previousSibling;\n }\n }\n\n return index;\n },\n\n matchesUpTo: function (element, selector, limit) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) {\n return true;\n }\n\n element = domUtils.parentNode(element);\n\n if (element === limit) {\n return domUtils.matchesSelector(element, selector);\n }\n }\n\n return false;\n },\n\n getActualElement: function (element) {\n return (element instanceof domObjects.SVGElementInstance\n ? element.correspondingUseElement\n : element);\n },\n\n getScrollXY: function (relevantWindow) {\n relevantWindow = relevantWindow || win.window;\n return {\n x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft,\n y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop,\n };\n },\n\n getElementClientRect: function (element) {\n const clientRect = (element instanceof domObjects.SVGElement\n ? element.getBoundingClientRect()\n : element.getClientRects()[0]);\n\n return clientRect && {\n left : clientRect.left,\n right : clientRect.right,\n top : clientRect.top,\n bottom: clientRect.bottom,\n width : clientRect.width || clientRect.right - clientRect.left,\n height: clientRect.height || clientRect.bottom - clientRect.top,\n };\n },\n\n getElementRect: function (element) {\n const clientRect = domUtils.getElementClientRect(element);\n\n if (!browser.isIOS7 && clientRect) {\n const scroll = domUtils.getScrollXY(win.getWindow(element));\n\n clientRect.left += scroll.x;\n clientRect.right += scroll.x;\n clientRect.top += scroll.y;\n clientRect.bottom += scroll.y;\n }\n\n return clientRect;\n },\n\n getPath: function (element) {\n const path = [];\n\n while (element) {\n path.push(element);\n element = domUtils.parentNode(element);\n }\n\n return path;\n },\n\n trySelector: value => {\n if (!is.string(value)) { return false; }\n\n // an exception will be raised if it is invalid\n domObjects.document.querySelector(value);\n return true;\n },\n};\n\nmodule.exports = domUtils;\n","const is = require('./is');\nconst domUtils = require('./domUtils');\nconst pExtend = require('./pointerExtend');\n\nconst { window, getWindow } = require('./window');\nconst { indexOf, contains } = require('./arr');\n\nconst useAttachEvent = ('attachEvent' in window) && !('addEventListener' in window);\nconst addEvent = useAttachEvent? 'attachEvent': 'addEventListener';\nconst removeEvent = useAttachEvent? 'detachEvent': 'removeEventListener';\nconst on = useAttachEvent? 'on': '';\n\nconst elements = [];\nconst targets = [];\nconst attachedListeners = [];\n\n// {\n// type: {\n// selectors: ['selector', ...],\n// contexts : [document, ...],\n// listeners: [[listener, capture, passive], ...]\n// }\n// }\nconst delegatedEvents = {};\n\nconst documents = [];\n\nconst supportsOptions = !useAttachEvent && (() => {\n let supported = false;\n\n window.document.createElement('div').addEventListener('test', null, {\n get capture () { supported = true; },\n });\n\n return supported;\n})();\n\nfunction add (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n let elementIndex = indexOf(elements, element);\n let target = targets[elementIndex];\n\n if (!target) {\n target = {\n events: {},\n typeCount: 0,\n };\n\n elementIndex = elements.push(element) - 1;\n targets.push(target);\n\n attachedListeners.push(useAttachEvent\n ? {\n supplied: [],\n wrapped : [],\n useCount: [],\n }\n : null);\n }\n\n if (!target.events[type]) {\n target.events[type] = [];\n target.typeCount++;\n }\n\n if (!contains(target.events[type], listener)) {\n let ret;\n\n if (useAttachEvent) {\n const { supplied, wrapped, useCount } = attachedListeners[elementIndex];\n const listenerIndex = indexOf(supplied, listener);\n\n const wrappedListener = wrapped[listenerIndex] || function (event) {\n if (!event.immediatePropagationStopped) {\n event.target = event.srcElement;\n event.currentTarget = element;\n\n event.preventDefault = event.preventDefault || preventDef;\n event.stopPropagation = event.stopPropagation || stopProp;\n event.stopImmediatePropagation = event.stopImmediatePropagation || stopImmProp;\n\n if (/mouse|click/.test(event.type)) {\n event.pageX = event.clientX + getWindow(element).document.documentElement.scrollLeft;\n event.pageY = event.clientY + getWindow(element).document.documentElement.scrollTop;\n }\n\n listener(event);\n }\n };\n\n ret = element[addEvent](on + type, wrappedListener, !!options.capture);\n\n if (listenerIndex === -1) {\n supplied.push(listener);\n wrapped.push(wrappedListener);\n useCount.push(1);\n }\n else {\n useCount[listenerIndex]++;\n }\n }\n else {\n ret = element[addEvent](type, listener, supportsOptions? options : !!options.capture);\n }\n target.events[type].push(listener);\n\n return ret;\n }\n}\n\nfunction remove (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const elementIndex = indexOf(elements, element);\n const target = targets[elementIndex];\n\n if (!target || !target.events) {\n return;\n }\n\n let wrappedListener = listener;\n let listeners;\n let listenerIndex;\n\n if (useAttachEvent) {\n listeners = attachedListeners[elementIndex];\n listenerIndex = indexOf(listeners.supplied, listener);\n wrappedListener = listeners.wrapped[listenerIndex];\n }\n\n if (type === 'all') {\n for (type in target.events) {\n if (target.events.hasOwnProperty(type)) {\n remove(element, type, 'all');\n }\n }\n return;\n }\n\n if (target.events[type]) {\n const len = target.events[type].length;\n\n if (listener === 'all') {\n for (let i = 0; i < len; i++) {\n remove(element, type, target.events[type][i], options);\n }\n return;\n }\n else {\n for (let i = 0; i < len; i++) {\n if (target.events[type][i] === listener) {\n element[removeEvent](on + type, wrappedListener, supportsOptions? options : !!options.capture);\n target.events[type].splice(i, 1);\n\n if (useAttachEvent && listeners) {\n listeners.useCount[listenerIndex]--;\n if (listeners.useCount[listenerIndex] === 0) {\n listeners.supplied.splice(listenerIndex, 1);\n listeners.wrapped.splice(listenerIndex, 1);\n listeners.useCount.splice(listenerIndex, 1);\n }\n }\n\n break;\n }\n }\n }\n\n if (target.events[type] && target.events[type].length === 0) {\n target.events[type] = null;\n target.typeCount--;\n }\n }\n\n if (!target.typeCount) {\n targets.splice(elementIndex, 1);\n elements.splice(elementIndex, 1);\n attachedListeners.splice(elementIndex, 1);\n }\n}\n\nfunction addDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n if (!delegatedEvents[type]) {\n delegatedEvents[type] = {\n selectors: [],\n contexts : [],\n listeners: [],\n };\n\n // add delegate listener functions\n for (let i = 0; i < documents.length; i++) {\n add(documents[i], type, delegateListener);\n add(documents[i], type, delegateUseCapture, true);\n }\n }\n\n const delegated = delegatedEvents[type];\n let index;\n\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n break;\n }\n }\n\n if (index === -1) {\n index = delegated.selectors.length;\n\n delegated.selectors.push(selector);\n delegated.contexts .push(context);\n delegated.listeners.push([]);\n }\n\n // keep listener and capture and passive flags\n delegated.listeners[index].push([listener, !!options.capture, options.passive]);\n}\n\nfunction removeDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const delegated = delegatedEvents[type];\n let matchFound = false;\n let index;\n\n if (!delegated) { return; }\n\n // count from last index of delegated to 0\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n // look for matching selector and context Node\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n\n const listeners = delegated.listeners[index];\n\n // each item of the listeners array is an array: [function, capture, passive]\n for (let i = listeners.length - 1; i >= 0; i--) {\n const [fn, capture, passive] = listeners[i];\n\n // check if the listener functions and capture and passive flags match\n if (fn === listener && capture === !!options.capture && passive === options.passive) {\n // remove the listener from the array of listeners\n listeners.splice(i, 1);\n\n // if all listeners for this interactable have been removed\n // remove the interactable from the delegated arrays\n if (!listeners.length) {\n delegated.selectors.splice(index, 1);\n delegated.contexts .splice(index, 1);\n delegated.listeners.splice(index, 1);\n\n // remove delegate function from context\n remove(context, type, delegateListener);\n remove(context, type, delegateUseCapture, true);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegatedEvents[type] = null;\n }\n }\n\n // only remove one listener\n matchFound = true;\n break;\n }\n }\n\n if (matchFound) { break; }\n }\n }\n}\n\n// bound to the interactable context when a DOM event\n// listener is added to a selector interactable\nfunction delegateListener (event, optionalArg) {\n const options = getOptions(optionalArg);\n const fakeEvent = {};\n const delegated = delegatedEvents[event.type];\n const eventTarget = (domUtils.getActualElement(event.path\n ? event.path[0]\n : event.target));\n let element = eventTarget;\n\n // duplicate the event so that currentTarget can be changed\n pExtend(fakeEvent, event);\n\n fakeEvent.originalEvent = event;\n fakeEvent.preventDefault = preventOriginalDefault;\n\n // climb up document tree looking for selector matches\n while (is.element(element)) {\n for (let i = 0; i < delegated.selectors.length; i++) {\n const selector = delegated.selectors[i];\n const context = delegated.contexts[i];\n\n if (domUtils.matchesSelector(element, selector)\n && domUtils.nodeContains(context, eventTarget)\n && domUtils.nodeContains(context, element)) {\n\n const listeners = delegated.listeners[i];\n\n fakeEvent.currentTarget = element;\n\n for (let j = 0; j < listeners.length; j++) {\n const [fn, capture, passive] = listeners[j];\n\n if (capture === !!options.capture && passive === options.passive) {\n fn(fakeEvent);\n }\n }\n }\n }\n\n element = domUtils.parentNode(element);\n }\n}\n\nfunction delegateUseCapture (event) {\n return delegateListener.call(this, event, true);\n}\n\nfunction preventDef () {\n this.returnValue = false;\n}\n\nfunction preventOriginalDefault () {\n this.originalEvent.preventDefault();\n}\n\nfunction stopProp () {\n this.cancelBubble = true;\n}\n\nfunction stopImmProp () {\n this.cancelBubble = true;\n this.immediatePropagationStopped = true;\n}\n\nfunction getOptions (param) {\n return is.object(param)? param : { capture: param };\n}\n\nmodule.exports = {\n add,\n remove,\n\n addDelegate,\n removeDelegate,\n\n delegateListener,\n delegateUseCapture,\n delegatedEvents,\n documents,\n\n useAttachEvent,\n supportsOptions,\n\n _elements: elements,\n _targets: targets,\n _attachedListeners: attachedListeners,\n};\n","module.exports = function extend (dest, source) {\n for (const prop in source) {\n dest[prop] = source[prop];\n }\n return dest;\n};\n","const {\n resolveRectLike,\n rectToXY,\n} = require('./rect');\n\nmodule.exports = function (target, element, action) {\n const actionOptions = target.options[action];\n const actionOrigin = actionOptions && actionOptions.origin;\n const origin = actionOrigin || target.options.origin;\n\n const originRect = resolveRectLike(origin, target, element, [target && element]);\n\n return rectToXY(originRect) || { x: 0, y: 0 };\n};\n","module.exports = (x, y) => Math.sqrt(x * x + y * y);\n","const extend = require('./extend');\nconst win = require('./window');\n\nconst utils = {\n warnOnce: function (method, message) {\n let warned = false;\n\n return function () {\n if (!warned) {\n win.window.console.warn(message);\n warned = true;\n }\n\n return method.apply(this, arguments);\n };\n },\n\n // http://stackoverflow.com/a/5634528/2280888\n _getQBezierValue: function (t, p1, p2, p3) {\n const iT = 1 - t;\n return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3;\n },\n\n getQuadraticCurvePoint: function (startX, startY, cpX, cpY, endX, endY, position) {\n return {\n x: utils._getQBezierValue(position, startX, cpX, endX),\n y: utils._getQBezierValue(position, startY, cpY, endY),\n };\n },\n\n // http://gizma.com/easing/\n easeOutQuad: function (t, b, c, d) {\n t /= d;\n return -c * t*(t-2) + b;\n },\n\n copyAction: function (dest, src) {\n dest.name = src.name;\n dest.axis = src.axis;\n dest.edges = src.edges;\n\n return dest;\n },\n\n is : require('./is'),\n extend : extend,\n hypot : require('./hypot'),\n getOriginXY: require('./getOriginXY'),\n};\n\nextend(utils, require('./arr'));\nextend(utils, require('./domUtils'));\nextend(utils, require('./pointerUtils'));\nextend(utils, require('./rect'));\n\nmodule.exports = utils;\n","const scope = require('../scope');\nconst utils = require('./index');\nconst browser = require('./browser');\n\nconst finder = {\n methodOrder: [ 'simulationResume', 'mouse', 'hasPointer', 'idle' ],\n\n search: function (pointer, eventType, eventTarget) {\n const mouseEvent = (/mouse/i.test(pointer.pointerType || eventType)\n // MSPointerEvent.MSPOINTER_TYPE_MOUSE\n || pointer.pointerType === 4);\n const pointerId = utils.getPointerId(pointer);\n const details = { pointer, pointerId, mouseEvent, eventType, eventTarget };\n\n for (const method of finder.methodOrder) {\n const interaction = finder[method](details);\n\n if (interaction) {\n return interaction;\n }\n }\n },\n\n // try to resume simulation with a new pointer\n simulationResume: function ({ mouseEvent, eventType, eventTarget }) {\n if (!/down|start/i.test(eventType)) {\n return null;\n }\n\n for (const interaction of scope.interactions) {\n let element = eventTarget;\n\n if (interaction.simulation && interaction.simulation.allowResume\n && (interaction.mouse === mouseEvent)) {\n while (element) {\n // if the element is the interaction element\n if (element === interaction.element) {\n return interaction;\n }\n element = utils.parentNode(element);\n }\n }\n }\n\n return null;\n },\n\n // if it's a mouse interaction\n mouse: function ({ pointerId, mouseEvent, eventType }) {\n if (!mouseEvent && (browser.supportsTouch || browser.supportsPointerEvent)) {\n return null;\n }\n\n let firstNonActive;\n\n for (const interaction of scope.interactions) {\n if (interaction.mouse) {\n // if it's a down event, skip interactions with running simulations\n if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; }\n\n // if the interaction is active, return it immediately\n if (interaction.interacting()) {\n return interaction;\n }\n // otherwise save it and look for another active interaction\n else if (!firstNonActive) {\n firstNonActive = interaction;\n }\n }\n }\n\n // if no active mouse interaction was found use the first inactive mouse\n // interaction\n if (firstNonActive) {\n return firstNonActive;\n }\n\n // Find any interaction specifically for mouse.\n // ignore the interaction if the eventType is a mousedown, and a simulation\n // is active\n for (const interaction of scope.interactions) {\n if (interaction.mouse && !(/down/.test(eventType) && interaction.simulation)) {\n return interaction;\n }\n }\n\n return null;\n },\n\n // get interaction that has this pointer\n hasPointer: function ({ pointerId }) {\n for (const interaction of scope.interactions) {\n if (utils.contains(interaction.pointerIds, pointerId)) {\n return interaction;\n }\n }\n },\n\n // get first idle interaction\n idle: function ({ mouseEvent }) {\n for (const interaction of scope.interactions) {\n // if there's already a pointer held down\n if (interaction.pointerIds.length === 1) {\n const target = interaction.target;\n // don't add this pointer if there is a target interactable and it\n // isn't gesturable\n if (target && !target.options.gesture.enabled) {\n continue;\n }\n }\n // maximum of 2 pointers per interaction\n else if (interaction.pointerIds.length >= 2) {\n continue;\n }\n\n if (!interaction.interacting() && (mouseEvent === interaction.mouse)) {\n return interaction;\n }\n }\n\n return null;\n },\n};\n\nmodule.exports = finder;\n","const win = require('./window');\nconst isWindow = require('./isWindow');\n\nconst is = {\n array : () => {},\n\n window : thing => thing === win.window || isWindow(thing),\n\n docFrag : thing => is.object(thing) && thing.nodeType === 11,\n\n object : thing => !!thing && (typeof thing === 'object'),\n\n function: thing => typeof thing === 'function',\n\n number : thing => typeof thing === 'number' ,\n\n bool : thing => typeof thing === 'boolean' ,\n\n string : thing => typeof thing === 'string' ,\n\n element: thing => {\n if (!thing || (typeof thing !== 'object')) { return false; }\n\n const _window = win.getWindow(thing) || win.window;\n\n return (/object|function/.test(typeof _window.Element)\n ? thing instanceof _window.Element //DOM2\n : thing.nodeType === 1 && typeof thing.nodeName === 'string');\n },\n};\n\nis.array = thing => (is.object(thing)\n && (typeof thing.length !== 'undefined')\n && is.function(thing.splice));\n\nmodule.exports = is;\n","module.exports = (thing) => !!(thing && thing.Window) && (thing instanceof thing.Window);\n","function pointerExtend (dest, source) {\n for (const prop in source) {\n const prefixedPropREs = module.exports.prefixedPropREs;\n let deprecated = false;\n\n // skip deprecated prefixed properties\n for (const vendor in prefixedPropREs) {\n if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) {\n deprecated = true;\n break;\n }\n }\n\n if (!deprecated && typeof source[prop] !== 'function') {\n dest[prop] = source[prop];\n }\n }\n return dest;\n}\n\npointerExtend.prefixedPropREs = {\n webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/,\n};\n\nmodule.exports = pointerExtend;\n","const hypot = require('./hypot');\nconst browser = require('./browser');\nconst dom = require('./domObjects');\nconst domUtils = require('./domUtils');\nconst is = require('./is');\nconst pointerExtend = require('./pointerExtend');\n\nconst pointerUtils = {\n copyCoords: function (dest, src) {\n dest.page = dest.page || {};\n dest.page.x = src.page.x;\n dest.page.y = src.page.y;\n\n dest.client = dest.client || {};\n dest.client.x = src.client.x;\n dest.client.y = src.client.y;\n\n dest.timeStamp = src.timeStamp;\n },\n\n setCoordDeltas: function (targetObj, prev, cur) {\n targetObj.page.x = cur.page.x - prev.page.x;\n targetObj.page.y = cur.page.y - prev.page.y;\n targetObj.client.x = cur.client.x - prev.client.x;\n targetObj.client.y = cur.client.y - prev.client.y;\n targetObj.timeStamp = cur.timeStamp - prev.timeStamp;\n\n // set pointer velocity\n const dt = Math.max(targetObj.timeStamp / 1000, 0.001);\n\n targetObj.page.speed = hypot(targetObj.page.x, targetObj.page.y) / dt;\n targetObj.page.vx = targetObj.page.x / dt;\n targetObj.page.vy = targetObj.page.y / dt;\n\n targetObj.client.speed = hypot(targetObj.client.x, targetObj.page.y) / dt;\n targetObj.client.vx = targetObj.client.x / dt;\n targetObj.client.vy = targetObj.client.y / dt;\n },\n\n isNativePointer: function (pointer) {\n return (pointer instanceof dom.Event || pointer instanceof dom.Touch);\n },\n\n // Get specified X/Y coords for mouse or event.touches[0]\n getXY: function (type, pointer, xy) {\n xy = xy || {};\n type = type || 'page';\n\n xy.x = pointer[type + 'X'];\n xy.y = pointer[type + 'Y'];\n\n return xy;\n },\n\n getPageXY: function (pointer, page) {\n page = page || {};\n\n // Opera Mobile handles the viewport and scrolling oddly\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n pointerUtils.getXY('screen', pointer, page);\n\n page.x += window.scrollX;\n page.y += window.scrollY;\n }\n else {\n pointerUtils.getXY('page', pointer, page);\n }\n\n return page;\n },\n\n getClientXY: function (pointer, client) {\n client = client || {};\n\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n // Opera Mobile handles the viewport and scrolling oddly\n pointerUtils.getXY('screen', pointer, client);\n }\n else {\n pointerUtils.getXY('client', pointer, client);\n }\n\n return client;\n },\n\n getPointerId: function (pointer) {\n return is.number(pointer.pointerId)? pointer.pointerId : pointer.identifier;\n },\n\n setCoords: function (targetObj, pointers, timeStamp) {\n const pointer = (pointers.length > 1\n ? pointerUtils.pointerAverage(pointers)\n : pointers[0]);\n\n const tmpXY = {};\n\n pointerUtils.getPageXY(pointer, tmpXY);\n targetObj.page.x = tmpXY.x;\n targetObj.page.y = tmpXY.y;\n\n pointerUtils.getClientXY(pointer, tmpXY);\n targetObj.client.x = tmpXY.x;\n targetObj.client.y = tmpXY.y;\n\n targetObj.timeStamp = is.number(timeStamp) ? timeStamp :new Date().getTime();\n },\n\n pointerExtend: pointerExtend,\n\n getTouchPair: function (event) {\n const touches = [];\n\n // array of touches is supplied\n if (is.array(event)) {\n touches[0] = event[0];\n touches[1] = event[1];\n }\n // an event\n else {\n if (event.type === 'touchend') {\n if (event.touches.length === 1) {\n touches[0] = event.touches[0];\n touches[1] = event.changedTouches[0];\n }\n else if (event.touches.length === 0) {\n touches[0] = event.changedTouches[0];\n touches[1] = event.changedTouches[1];\n }\n }\n else {\n touches[0] = event.touches[0];\n touches[1] = event.touches[1];\n }\n }\n\n return touches;\n },\n\n pointerAverage: function (pointers) {\n const average = {\n pageX : 0,\n pageY : 0,\n clientX: 0,\n clientY: 0,\n screenX: 0,\n screenY: 0,\n };\n\n for (const pointer of pointers) {\n for (const prop in average) {\n average[prop] += pointer[prop];\n }\n }\n for (const prop in average) {\n average[prop] /= pointers.length;\n }\n\n return average;\n },\n\n touchBBox: function (event) {\n if (!event.length && !(event.touches && event.touches.length > 1)) {\n return;\n }\n\n const touches = pointerUtils.getTouchPair(event);\n const minX = Math.min(touches[0].pageX, touches[1].pageX);\n const minY = Math.min(touches[0].pageY, touches[1].pageY);\n const maxX = Math.max(touches[0].pageX, touches[1].pageX);\n const maxY = Math.max(touches[0].pageY, touches[1].pageY);\n\n return {\n x: minX,\n y: minY,\n left: minX,\n top: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n },\n\n touchDistance: function (event, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n\n\n const dx = touches[0][sourceX] - touches[1][sourceX];\n const dy = touches[0][sourceY] - touches[1][sourceY];\n\n return hypot(dx, dy);\n },\n\n touchAngle: function (event, prevAngle, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n const dx = touches[1][sourceX] - touches[0][sourceX];\n const dy = touches[1][sourceY] - touches[0][sourceY];\n const angle = 180 * Math.atan2(dy , dx) / Math.PI;\n\n return angle;\n },\n\n getPointerType: function (pointer, interaction) {\n // if the PointerEvent API isn't available, then the pointer must be ither\n // a MouseEvent or TouchEvent\n if (interaction.mouse) { return 'mouse'; }\n if (!browser.supportsPointerEvent) { return 'touch'; }\n\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : [undefined, undefined,'touch', 'pen', 'mouse'][pointer.pointerType];\n },\n\n // [ event.target, event.currentTarget ]\n getEventTargets: function (event) {\n return [\n domUtils.getActualElement(event.path ? event.path[0] : event.target),\n domUtils.getActualElement(event.currentTarget),\n ];\n },\n};\n\nmodule.exports = pointerUtils;\n","const { window } = require('./window');\n\nconst vendors = ['ms', 'moz', 'webkit', 'o'];\nlet lastTime = 0;\nlet request;\nlet cancel;\n\nfor (let x = 0; x < vendors.length && !window.requestAnimationFrame; x++) {\n request = window[vendors[x] + 'RequestAnimationFrame'];\n cancel = window[vendors[x] +'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n}\n\nif (!request) {\n request = function (callback) {\n const currTime = new Date().getTime();\n const timeToCall = Math.max(0, 16 - (currTime - lastTime));\n const id = setTimeout(function () { callback(currTime + timeToCall); },\n timeToCall);\n\n lastTime = currTime + timeToCall;\n return id;\n };\n}\n\nif (!cancel) {\n cancel = function (id) {\n clearTimeout(id);\n };\n}\n\nmodule.exports = {\n request,\n cancel,\n};\n","const extend = require('./extend');\nconst is = require('./is');\nconst {\n closest,\n parentNode,\n getElementRect,\n} = require('./domUtils');\n\nconst rectUtils = {\n getStringOptionResult: function (value, interactable, element) {\n if (!is.string(value)) {\n return null;\n }\n\n if (value === 'parent') {\n value = parentNode(element);\n }\n else if (value === 'self') {\n value = interactable.getRect(element);\n }\n else {\n value = closest(element, value);\n }\n\n return value;\n },\n\n resolveRectLike: function (value, interactable, element, functionArgs) {\n value = rectUtils.getStringOptionResult(value, interactable, element) || value;\n\n if (is.function(value)) {\n value = value.apply(null, functionArgs);\n }\n\n if (is.element(value)) {\n value = getElementRect(value);\n }\n\n return value;\n },\n\n rectToXY: function (rect) {\n return rect && {\n x: 'x' in rect ? rect.x : rect.left,\n y: 'y' in rect ? rect.y : rect.top,\n };\n },\n\n xywhToTlbr: function (rect) {\n if (rect && !('left' in rect && 'top' in rect)) {\n rect = extend({}, rect);\n\n rect.left = rect.x || 0;\n rect.top = rect.y || 0;\n rect.right = rect.right || (rect.left + rect.width);\n rect.bottom = rect.bottom || (rect.top + rect.height);\n }\n\n return rect;\n },\n\n tlbrToXywh: function (rect) {\n if (rect && !('x' in rect && 'y' in rect)) {\n rect = extend({}, rect);\n\n rect.x = rect.left || 0;\n rect.top = rect.top || 0;\n rect.width = rect.width || (rect.right - rect.x);\n rect.height = rect.height || (rect.bottom - rect.y);\n }\n\n return rect;\n },\n};\n\nmodule.exports = rectUtils;\n","const win = module.exports;\nconst isWindow = require('./isWindow');\n\nfunction init (window) {\n // get wrapped window if using Shadow DOM polyfill\n\n win.realWindow = window;\n\n // create a TextNode\n const el = window.document.createTextNode('');\n\n // check if it's wrapped by a polyfill\n if (el.ownerDocument !== window.document\n && typeof window.wrap === 'function'\n && window.wrap(el) === el) {\n // use wrapped window\n window = window.wrap(window);\n }\n\n win.window = window;\n}\n\nif (typeof window === 'undefined') {\n win.window = undefined;\n win.realWindow = undefined;\n}\nelse {\n init(window);\n}\n\nwin.getWindow = function getWindow (node) {\n if (isWindow(node)) {\n return node;\n }\n\n const rootNode = (node.ownerDocument || node);\n\n return rootNode.defaultView || rootNode.parentWindow || win.window;\n};\n\nwin.init = init;\n"]} \ No newline at end of file +{"version":3,"sources":["src/header.js","node_modules/browser-pack/_prelude.js","index.js","src/Eventable.js","src/InteractEvent.js","src/Interactable.js","src/Interaction.js","src/actions/base.js","src/actions/drag.js","src/actions/drop.js","src/actions/gesture.js","src/actions/resize.js","src/autoScroll.js","src/autoStart/InteractableMethods.js","src/autoStart/base.js","src/autoStart/delay.js","src/autoStart/drag.js","src/autoStart/gesture.js","src/autoStart/resize.js","src/defaultOptions.js","src/index.js","src/inertia.js","src/interact.js","src/interactablePreventDefault.js","src/legacyBrowsers.js","src/modifiers/index.js","src/modifiers/restrict.js","src/modifiers/restrictEdges.js","src/modifiers/restrictSize.js","src/modifiers/snap.js","src/modifiers/snapSize.js","src/pointerEvents/PointerEvent.js","src/pointerEvents/base.js","src/pointerEvents/holdRepeat.js","src/pointerEvents/interactableTargets.js","src/scope.js","src/utils/Signals.js","src/utils/arr.js","src/utils/browser.js","src/utils/domObjects.js","src/utils/domUtils.js","src/utils/events.js","src/utils/extend.js","src/utils/getOriginXY.js","src/utils/hypot.js","src/utils/index.js","src/utils/interactionFinder.js","src/utils/is.js","src/utils/isWindow.js","src/utils/pointerExtend.js","src/utils/pointerUtils.js","src/utils/raf.js","src/utils/rect.js","src/utils/window.js"],"names":[],"mappings":";AAAA;AACA;AACA;AACA;AACA;AACA;ACLA,ADMA;AACA;;AEPA;;;;;;;;AAQA,IAAI,OAAO,MAAP,KAAkB,WAAtB,EAAmC;AACjC,SAAO,OAAP,GAAiB,UAAU,MAAV,EAAkB;AACjC,YAAQ,oBAAR,EAA8B,IAA9B,CAAmC,MAAnC;;AAEA,WAAO,QAAQ,aAAR,CAAP;AACD,GAJD;AAKD,CAND,MAOK;AACH,SAAO,OAAP,GAAiB,QAAQ,aAAR,CAAjB;AACD;;;;;;;eCjBmB,QAAQ,aAAR,C;IAAZ,O,YAAA,O;;AACR,IAAM,SAAS,QAAQ,mBAAR,CAAf;;AAEA,SAAS,yBAAT,CAAoC,KAApC,EAA2C,SAA3C,EAAsD;AACpD,OAAK,IAAI,IAAI,CAAR,EAAW,MAAM,UAAU,MAAhC,EAAwC,IAAI,GAAJ,IAAW,CAAC,MAAM,2BAA1D,EAAuF,GAAvF,EAA4F;AAC1F,cAAU,CAAV,EAAa,KAAb;AACD;AACF;;IAEK,S;AAEJ,qBAAa,OAAb,EAAsB;AAAA;;AACpB,SAAK,OAAL,GAAe,OAAO,EAAP,EAAW,WAAW,EAAtB,CAAf;AACD;;sBAED,I,iBAAM,K,EAAO;AACX,QAAI,kBAAJ;AACA,QAAM,UAAU,OAAO,MAAM,IAA7B;AACA,QAAM,SAAS,KAAK,MAApB;;AAEA;AACA,QAAK,YAAY,KAAK,MAAM,IAAX,CAAjB,EAAoC;AAClC,gCAA0B,KAA1B,EAAiC,SAAjC;AACD;;AAED;AACA,QAAI,KAAK,OAAL,CAAJ,EAAmB;AACjB,WAAK,OAAL,EAAc,KAAd;AACD;;AAED;AACA,QAAI,CAAC,MAAM,kBAAP,IAA6B,MAA7B,KAAwC,YAAY,OAAO,MAAM,IAAb,CAApD,CAAJ,EAA8E;AAC5E,gCAA0B,KAA1B,EAAiC,SAAjC;AACD;AACF,G;;sBAED,E,eAAI,S,EAAW,Q,EAAU;AACvB;AACA,QAAI,KAAK,SAAL,CAAJ,EAAqB;AACnB,WAAK,SAAL,EAAgB,IAAhB,CAAqB,QAArB;AACD,KAFD,MAGK;AACH,WAAK,SAAL,IAAkB,CAAC,QAAD,CAAlB;AACD;AACF,G;;sBAED,G,gBAAK,S,EAAW,Q,EAAU;AACxB;AACA,QAAM,YAAY,KAAK,SAAL,CAAlB;AACA,QAAM,QAAY,YAAW,QAAQ,SAAR,EAAmB,QAAnB,CAAX,GAA0C,CAAC,CAA7D;;AAEA,QAAI,UAAU,CAAC,CAAf,EAAkB;AAChB,gBAAU,MAAV,CAAiB,KAAjB,EAAwB,CAAxB;AACD;;AAED,QAAI,aAAa,UAAU,MAAV,KAAqB,CAAlC,IAAuC,CAAC,QAA5C,EAAsD;AACpD,WAAK,SAAL,IAAkB,QAAlB;AACD;AACF,G;;;;;AAGH,OAAO,OAAP,GAAiB,SAAjB;;;;;;;AC7DA,IAAM,SAAc,QAAQ,gBAAR,CAApB;AACA,IAAM,cAAc,QAAQ,qBAAR,CAApB;AACA,IAAM,WAAc,QAAQ,kBAAR,CAApB;AACA,IAAM,UAAc,QAAQ,iBAAR,EAA2B,GAA3B,EAApB;;IAEM,a;AACJ,yBAAa,WAAb,EAA0B,KAA1B,EAAiC,MAAjC,EAAyC,KAAzC,EAAgD,OAAhD,EAAyD,OAAzD,EAAkF;AAAA,QAAhB,MAAgB,uEAAP,KAAO;;AAAA;;AAChF,QAAM,SAAc,YAAY,MAAhC;AACA,QAAM,cAAc,CAAC,UAAU,OAAO,OAAjB,IAA4B,QAA7B,EAAuC,WAA3D;AACA,QAAM,SAAc,YAAY,MAAZ,EAAoB,OAApB,EAA6B,MAA7B,CAApB;AACA,QAAM,WAAc,UAAU,OAA9B;AACA,QAAM,SAAc,UAAU,KAA9B;AACA,QAAM,SAAc,WAAU,YAAY,WAAtB,GAAoC,YAAY,SAApE;AACA,QAAM,YAAc,YAAY,SAAhC;;AAEA,cAAU,WAAW,YAAY,OAAjC;;AAEA,QAAM,OAAS,OAAO,EAAP,EAAW,OAAO,IAAlB,CAAf;AACA,QAAM,SAAS,OAAO,EAAP,EAAW,OAAO,MAAlB,CAAf;;AAEA,SAAK,CAAL,IAAU,OAAO,CAAjB;AACA,SAAK,CAAL,IAAU,OAAO,CAAjB;;AAEA,WAAO,CAAP,IAAY,OAAO,CAAnB;AACA,WAAO,CAAP,IAAY,OAAO,CAAnB;;AAEA,SAAK,OAAL,GAAqB,MAAM,OAA3B;AACA,SAAK,MAAL,GAAqB,MAAM,MAA3B;AACA,SAAK,QAAL,GAAqB,MAAM,QAA3B;AACA,SAAK,OAAL,GAAqB,MAAM,OAA3B;AACA,SAAK,MAAL,GAAqB,MAAM,MAA3B;AACA,SAAK,OAAL,GAAqB,MAAM,OAA3B;AACA,SAAK,MAAL,GAAqB,OAArB;AACA,SAAK,aAAL,GAAqB,OAArB;AACA,SAAK,aAAL,GAAqB,WAAW,IAAhC;AACA,SAAK,MAAL,GAAqB,MAArB;AACA,SAAK,IAAL,GAAqB,UAAU,SAAS,EAAnB,CAArB;AACA,SAAK,WAAL,GAAqB,WAArB;AACA,SAAK,YAAL,GAAqB,MAArB;;AAEA,SAAK,EAAL,GAAU,WAAW,YAAY,SAAZ,CAAsB,YAAY,SAAZ,CAAsB,MAAtB,GAA+B,CAArD,CAAX,GACW,UAAU,EAD/B;;AAGA,QAAM,YAAY;AAChB,8BADgB;AAEhB,kBAFgB;AAGhB,oBAHgB;AAIhB,kBAJgB;AAKhB,sBALgB;AAMhB,sBANgB;AAOhB,gBAPgB;AAQhB,oBARgB;AAShB,oBATgB;AAUhB,wBAVgB;AAWhB,oBAXgB;AAYhB,8BAZgB;AAahB,cAAQ;AAbQ,KAAlB;;AAgBA,YAAQ,IAAR,CAAa,QAAb,EAAuB,SAAvB;;AAEA,QAAI,MAAJ,EAAY;AACV;AACA,WAAK,KAAL,GAAa,UAAU,KAAvB;AACA,WAAK,KAAL,GAAa,UAAU,KAAvB;AACA,WAAK,OAAL,GAAe,UAAU,OAAzB;AACA,WAAK,OAAL,GAAe,UAAU,OAAzB;AACD,KAND,MAOK;AACH,WAAK,KAAL,GAAiB,KAAK,CAAtB;AACA,WAAK,KAAL,GAAiB,KAAK,CAAtB;AACA,WAAK,OAAL,GAAiB,OAAO,CAAxB;AACA,WAAK,OAAL,GAAiB,OAAO,CAAxB;AACD;;AAED,SAAK,EAAL,GAAiB,YAAY,WAAZ,CAAwB,IAAxB,CAA6B,CAA7B,GAAiC,OAAO,CAAzD;AACA,SAAK,EAAL,GAAiB,YAAY,WAAZ,CAAwB,IAAxB,CAA6B,CAA7B,GAAiC,OAAO,CAAzD;AACA,SAAK,QAAL,GAAiB,YAAY,WAAZ,CAAwB,MAAxB,CAA+B,CAA/B,GAAmC,OAAO,CAA3D;AACA,SAAK,QAAL,GAAiB,YAAY,WAAZ,CAAwB,MAAxB,CAA+B,CAA/B,GAAmC,OAAO,CAA3D;;AAEA,YAAQ,IAAR,CAAa,WAAb,EAA0B,SAA1B;;AAEA,SAAK,SAAL,GAAiB,OAAO,SAAxB;AACA,SAAK,EAAL,GAAiB,YAAY,YAAZ,CAAyB,SAA1C;AACA,SAAK,QAAL,GAAiB,KAAK,SAAL,GAAiB,KAAK,EAAvC;;AAEA;AACA,SAAK,KAAL,GAAa,YAAY,YAAZ,CAAyB,WAAzB,EAAsC,KAAnD;AACA,SAAK,SAAL,GAAiB,YAAY,YAAZ,CAAyB,WAAzB,EAAsC,EAAvD;AACA,SAAK,SAAL,GAAiB,YAAY,YAAZ,CAAyB,WAAzB,EAAsC,EAAvD;;AAEA,SAAK,KAAL,GAAc,UAAU,UAAU,cAArB,GAAsC,KAAK,QAAL,EAAtC,GAAwD,IAArE;;AAEA,YAAQ,IAAR,CAAa,KAAb,EAAoB,SAApB;AACD;;0BAED,Q,uBAAY;AACV,QAAM,cAAc,KAAK,WAAzB;;AAEA,QAAI,YAAY,SAAZ,CAAsB,KAAtB,GAA8B,GAA9B,IACG,KAAK,SAAL,GAAiB,YAAY,SAAZ,CAAsB,SAAvC,GAAmD,GAD1D,EAC+D;AAC7D,aAAO,IAAP;AACD;;AAED,QAAI,QAAQ,MAAM,KAAK,KAAL,CAAW,YAAY,SAAZ,CAAsB,SAAjC,EAA4C,YAAY,SAAZ,CAAsB,SAAlE,CAAN,GAAqF,KAAK,EAAtG;AACA,QAAM,UAAU,IAAhB;;AAEA,QAAI,QAAQ,CAAZ,EAAe;AACb,eAAS,GAAT;AACD;;AAED,QAAM,OAAO,MAAM,OAAN,IAAiB,KAAjB,IAA0B,QAAQ,MAAM,OAArD;AACA,QAAM,KAAO,MAAM,OAAN,IAAiB,KAAjB,IAA0B,QAAQ,MAAM,OAArD;;AAEA,QAAM,QAAQ,CAAC,IAAD,KAAU,MAAM,OAAN,IAAiB,KAAjB,IAA0B,QAAS,KAAK,OAAlD,CAAd;AACA,QAAM,OAAQ,CAAC,EAAD,IAAW,KAAK,OAAL,IAAgB,KAA3B,IAAoC,QAAQ,MAAM,OAAhE;;AAEA,WAAO;AACL,YADK;AAEL,gBAFK;AAGL,gBAHK;AAIL,kBAJK;AAKL,kBALK;AAML,aAAO,YAAY,SAAZ,CAAsB,KANxB;AAOL,gBAAU;AACR,WAAG,YAAY,SAAZ,CAAsB,SADjB;AAER,WAAG,YAAY,SAAZ,CAAsB;AAFjB;AAPL,KAAP;AAYD,G;;0BAED,c,6BAAkB,CAAE,C;;0BAEpB,wB,uCAA4B;AAC1B,SAAK,2BAAL,GAAmC,KAAK,kBAAL,GAA0B,IAA7D;AACD,G;;0BAED,e,8BAAmB;AACjB,SAAK,kBAAL,GAA0B,IAA1B;AACD,G;;;;;AAGH,QAAQ,EAAR,CAAW,WAAX,EAAwB,gBAA0D;AAAA,MAA9C,MAA8C,QAA9C,MAA8C;AAAA,MAAtC,WAAsC,QAAtC,WAAsC;AAAA,MAAzB,QAAyB,QAAzB,QAAyB;AAAA,MAAf,WAAe,QAAf,WAAe;;AAChF,MAAM,YAAY,WAAU,MAAV,GAAmB,YAAY,SAAjD;;AAEA,MAAI,gBAAgB,QAApB,EAA8B;AAC5B,WAAO,EAAP,GAAY,OAAO,OAAP,GAAiB,UAAU,OAAvC;AACA,WAAO,EAAP,GAAY,OAAO,OAAP,GAAiB,UAAU,OAAvC;AACD,GAHD,MAIK;AACH,WAAO,EAAP,GAAY,OAAO,KAAP,GAAe,UAAU,KAArC;AACA,WAAO,EAAP,GAAY,OAAO,KAAP,GAAe,UAAU,KAArC;AACD;AACF,CAXD;;AAaA,cAAc,OAAd,GAAwB,OAAxB;;AAEA,OAAO,OAAP,GAAiB,aAAjB;;;;;;;AC7JA,IAAM,KAAY,QAAQ,YAAR,CAAlB;AACA,IAAM,SAAY,QAAQ,gBAAR,CAAlB;AACA,IAAM,SAAY,QAAQ,gBAAR,CAAlB;AACA,IAAM,UAAY,QAAQ,gBAAR,CAAlB;AACA,IAAM,QAAY,QAAQ,SAAR,CAAlB;AACA,IAAM,YAAY,QAAQ,aAAR,CAAlB;AACA,IAAM,WAAY,QAAQ,kBAAR,CAAlB;AACA,IAAM,UAAY,QAAQ,iBAAR,EAA2B,GAA3B,EAAlB;;eAM8B,QAAQ,kBAAR,C;IAH5B,c,YAAA,c;IACA,Y,YAAA,Y;IACA,W,YAAA,W;;gBAE4B,QAAQ,gBAAR,C;IAAtB,S,aAAA,S;;gBACsB,QAAQ,aAAR,C;IAAtB,O,aAAA,O;IAAS,Q,aAAA,Q;;gBACa,QAAQ,iBAAR,C;IAAtB,U,aAAA,U;;AAER;;;AACA,MAAM,aAAN,GAAsB,EAAtB;;AAEA;;;;;;;IAMM,Y;AACJ,wBAAa,MAAb,EAAqB,OAArB,EAA8B;AAAA;;AAC5B,cAAU,WAAW,EAArB;;AAEA,SAAK,MAAL,GAAgB,MAAhB;AACA,SAAK,MAAL,GAAgB,IAAI,SAAJ,EAAhB;AACA,SAAK,QAAL,GAAgB,QAAQ,OAAR,IAAmB,MAAM,QAAzC;AACA,SAAK,IAAL,GAAgB,UAAU,YAAY,MAAZ,IAAqB,KAAK,QAA1B,GAAqC,MAA/C,CAAhB;AACA,SAAK,IAAL,GAAgB,KAAK,IAAL,CAAU,QAA1B;;AAEA,YAAQ,IAAR,CAAa,KAAb,EAAoB;AAClB,oBADkB;AAElB,sBAFkB;AAGlB,oBAAc,IAHI;AAIlB,WAAK,KAAK;AAJQ,KAApB;;AAOA,UAAM,WAAN,CAAmB,KAAK,IAAxB,EAA8B,KAAK,IAAnC;;AAEA,UAAM,aAAN,CAAoB,IAApB,CAAyB,IAAzB;;AAEA,SAAK,GAAL,CAAS,OAAT;AACD;;yBAED,W,wBAAa,M,EAAQ,M,EAAQ;AAC3B,QAAM,WAAW,OAAO,MAAxB;;AAEA,QAAI,GAAG,QAAH,CAAY,OAAO,OAAnB,CAAJ,EAAwC;AAAE,WAAK,MAAL,CAAY,WAAW,OAAvB,IAA0C,OAAO,OAAjD;AAAoE;AAC9G,QAAI,GAAG,QAAH,CAAY,OAAO,MAAnB,CAAJ,EAAwC;AAAE,WAAK,MAAL,CAAY,WAAW,MAAvB,IAA0C,OAAO,MAAjD;AAAoE;AAC9G,QAAI,GAAG,QAAH,CAAY,OAAO,KAAnB,CAAJ,EAAwC;AAAE,WAAK,MAAL,CAAY,WAAW,KAAvB,IAA0C,OAAO,KAAjD;AAAoE;AAC9G,QAAI,GAAG,QAAH,CAAY,OAAO,cAAnB,CAAJ,EAAwC;AAAE,WAAK,MAAL,CAAY,WAAW,cAAvB,IAA0C,OAAO,cAAjD;AAAoE;;AAE9G,WAAO,IAAP;AACD,G;;yBAED,Y,yBAAc,M,EAAQ,O,EAAS;AAC7B;AACA,SAAK,IAAM,MAAX,IAAqB,OAArB,EAA8B;AAC5B;AACA,UAAI,UAAU,SAAS,MAAT,CAAd,EAAgC;AAC9B;AACA,YAAI,GAAG,MAAH,CAAU,QAAQ,MAAR,CAAV,CAAJ,EAAgC;AAC9B;AACA,eAAK,OAAL,CAAa,MAAb,EAAqB,MAArB,IAA+B,OAAO,KAAK,OAAL,CAAa,MAAb,EAAqB,MAArB,KAAgC,EAAvC,EAA2C,QAAQ,MAAR,CAA3C,CAA/B;;AAEA,cAAI,GAAG,MAAH,CAAU,SAAS,SAAT,CAAmB,MAAnB,CAAV,KAAyC,aAAa,SAAS,SAAT,CAAmB,MAAnB,CAA1D,EAAsF;AACpF,iBAAK,OAAL,CAAa,MAAb,EAAqB,MAArB,EAA6B,OAA7B,GAAuC,QAAQ,MAAR,EAAgB,OAAhB,KAA4B,KAA5B,GAAmC,KAAnC,GAA2C,IAAlF;AACD;AACF,SAPD,MAQK,IAAI,GAAG,IAAH,CAAQ,QAAQ,MAAR,CAAR,KAA4B,GAAG,MAAH,CAAU,SAAS,SAAT,CAAmB,MAAnB,CAAV,CAAhC,EAAuE;AAC1E,eAAK,OAAL,CAAa,MAAb,EAAqB,MAArB,EAA6B,OAA7B,GAAuC,QAAQ,MAAR,CAAvC;AACD,SAFI,MAGA,IAAI,QAAQ,MAAR,MAAoB,SAAxB,EAAmC;AACtC;AACA,eAAK,OAAL,CAAa,MAAb,EAAqB,MAArB,IAA+B,QAAQ,MAAR,CAA/B;AACD;AACF;AACF;AACF,G;;AAED;;;;;;;;;;;;;;;;;;;;yBAkBA,O,oBAAS,O,EAAS;AAChB,cAAU,WAAW,KAAK,MAA1B;;AAEA,QAAI,GAAG,MAAH,CAAU,KAAK,MAAf,KAA0B,CAAE,GAAG,OAAH,CAAW,OAAX,CAAhC,EAAsD;AACpD,gBAAU,KAAK,QAAL,CAAc,aAAd,CAA4B,KAAK,MAAjC,CAAV;AACD;;AAED,WAAO,eAAe,OAAf,CAAP;AACD,G;;AAED;;;;;;;;;;;;yBAUA,W,wBAAa,O,EAAS;AACpB,QAAI,GAAG,QAAH,CAAY,OAAZ,CAAJ,EAA0B;AACxB,WAAK,OAAL,GAAe,OAAf;;AAEA,aAAO,IAAP;AACD;;AAED,QAAI,YAAY,IAAhB,EAAsB;AACpB,aAAO,KAAK,OAAL,CAAa,OAApB;;AAEA,aAAO,IAAP;AACD;;AAED,WAAO,KAAK,OAAZ;AACD,G;;yBAED,iB,8BAAmB,U,EAAY,Q,EAAU;AACvC,QAAI,YAAY,QAAZ,KAAyB,GAAG,MAAH,CAAU,QAAV,CAA7B,EAAkD;AAChD,WAAK,OAAL,CAAa,UAAb,IAA2B,QAA3B;;AAEA,2BAAqB,QAAQ,KAA7B,kHAAoC;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,YAAzB,MAAyB;;AAClC,aAAK,OAAL,CAAa,MAAb,EAAqB,UAArB,IAAmC,QAAnC;AACD;;AAED,aAAO,IAAP;AACD;;AAED,WAAO,KAAK,OAAL,CAAa,UAAb,CAAP;AACD,G;;AAED;;;;;;;;;;;;;;;yBAaA,M,mBAAQ,Q,EAAU;AAChB,WAAO,KAAK,iBAAL,CAAuB,QAAvB,EAAiC,QAAjC,CAAP;AACD,G;;AAED;;;;;;;;;;;;yBAUA,W,wBAAa,Q,EAAU;AACrB,QAAI,aAAa,MAAb,IAAuB,aAAa,QAAxC,EAAkD;AAChD,WAAK,OAAL,CAAa,WAAb,GAA2B,QAA3B;;AAEA,aAAO,IAAP;AACD;;AAED,WAAO,KAAK,OAAL,CAAa,WAApB;AACD,G;;AAED;;;;;;;;;;;yBASA,O,sBAAW;AACT,WAAO,KAAK,QAAZ;AACD,G;;yBAED,S,sBAAW,O,EAAS;AAClB,WAAQ,KAAK,QAAL,KAAkB,QAAQ,aAA1B,IACG,aAAa,KAAK,QAAlB,EAA4B,OAA5B,CADX;AAED,G;;AAED;;;;;;;;;;;;yBAUA,I,iBAAM,M,EAAQ;AACZ,SAAK,MAAL,CAAY,IAAZ,CAAiB,MAAjB;;AAEA,WAAO,IAAP;AACD,G;;yBAED,c,2BAAgB,M,EAAQ,S,EAAW,Q,EAAU,O,EAAS;AACpD,QAAI,GAAG,MAAH,CAAU,SAAV,KAAwB,UAAU,MAAV,CAAiB,GAAjB,MAA0B,CAAC,CAAvD,EAA0D;AACxD,kBAAY,UAAU,IAAV,GAAiB,KAAjB,CAAuB,IAAvB,CAAZ;AACD;;AAED,QAAI,GAAG,KAAH,CAAS,SAAT,CAAJ,EAAyB;AACvB,WAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,UAAU,MAA9B,EAAsC,GAAtC,EAA2C;AACzC,aAAK,MAAL,EAAa,UAAU,CAAV,CAAb,EAA2B,QAA3B,EAAqC,OAArC;AACD;;AAED,aAAO,IAAP;AACD;;AAED,QAAI,GAAG,MAAH,CAAU,SAAV,CAAJ,EAA0B;AACxB,WAAK,IAAM,IAAX,IAAmB,SAAnB,EAA8B;AAC5B,aAAK,MAAL,EAAa,IAAb,EAAmB,UAAU,IAAV,CAAnB,EAAoC,QAApC;AACD;;AAED,aAAO,IAAP;AACD;AACF,G;;AAED;;;;;;;;;;;;;yBAWA,E,eAAI,S,EAAW,Q,EAAU,O,EAAS;AAChC,QAAI,KAAK,cAAL,CAAoB,IAApB,EAA0B,SAA1B,EAAqC,QAArC,EAA+C,OAA/C,CAAJ,EAA6D;AAC3D,aAAO,IAAP;AACD;;AAED,QAAI,cAAc,OAAlB,EAA2B;AAAE,kBAAY,UAAZ;AAAyB;;AAEtD,QAAI,SAAS,aAAa,UAAtB,EAAkC,SAAlC,CAAJ,EAAkD;AAChD,WAAK,MAAL,CAAY,EAAZ,CAAe,SAAf,EAA0B,QAA1B;AACD;AACD;AAHA,SAIK,IAAI,GAAG,MAAH,CAAU,KAAK,MAAf,CAAJ,EAA4B;AAC/B,eAAO,WAAP,CAAmB,KAAK,MAAxB,EAAgC,KAAK,QAArC,EAA+C,SAA/C,EAA0D,QAA1D,EAAoE,OAApE;AACD,OAFI,MAGA;AACH,eAAO,GAAP,CAAW,KAAK,MAAhB,EAAwB,SAAxB,EAAmC,QAAnC,EAA6C,OAA7C;AACD;;AAED,WAAO,IAAP;AACD,G;;AAED;;;;;;;;;;;;;yBAWA,G,gBAAK,S,EAAW,Q,EAAU,O,EAAS;AACjC,QAAI,KAAK,cAAL,CAAoB,KAApB,EAA2B,SAA3B,EAAsC,QAAtC,EAAgD,OAAhD,CAAJ,EAA8D;AAC5D,aAAO,IAAP;AACD;;AAED,QAAI,cAAc,OAAlB,EAA2B;AAAE,kBAAY,UAAZ;AAAyB;;AAEtD;AACA,QAAI,SAAS,aAAa,UAAtB,EAAkC,SAAlC,CAAJ,EAAkD;AAChD,WAAK,MAAL,CAAY,GAAZ,CAAgB,SAAhB,EAA2B,QAA3B;AACD;AACD;AAHA,SAIK,IAAI,GAAG,MAAH,CAAU,KAAK,MAAf,CAAJ,EAA4B;AAC/B,eAAO,cAAP,CAAsB,KAAK,MAA3B,EAAmC,KAAK,QAAxC,EAAkD,SAAlD,EAA6D,QAA7D,EAAuE,OAAvE;AACD;AACD;AAHK,WAIA;AACH,iBAAO,MAAP,CAAc,KAAK,MAAnB,EAA2B,SAA3B,EAAsC,QAAtC,EAAgD,OAAhD;AACD;;AAED,WAAO,IAAP;AACD,G;;AAED;;;;;;;;;;yBAQA,G,gBAAK,O,EAAS;AACZ,QAAI,CAAC,GAAG,MAAH,CAAU,OAAV,CAAL,EAAyB;AACvB,gBAAU,EAAV;AACD;;AAED,SAAK,OAAL,GAAe,OAAO,EAAP,EAAW,SAAS,IAApB,CAAf;;AAEA,QAAM,aAAa,OAAO,EAAP,EAAW,SAAS,SAApB,CAAnB;;AAEA,SAAK,IAAM,UAAX,IAAyB,QAAQ,UAAjC,EAA6C;AAC3C,UAAM,aAAa,QAAQ,UAAR,CAAmB,UAAnB,CAAnB;;AAEA,WAAK,OAAL,CAAa,UAAb,IAA2B,OAAO,EAAP,EAAW,SAAS,UAAT,CAAX,CAA3B;;AAEA,WAAK,YAAL,CAAkB,UAAlB,EAA8B,UAA9B;;AAEA,WAAK,UAAL,EAAiB,QAAQ,UAAR,CAAjB;AACD;;AAED,0BAAsB,aAAa,eAAnC,yHAAoD;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAAzC,OAAyC;;AAClD,WAAK,OAAL,CAAa,OAAb,IAAwB,SAAS,IAAT,CAAc,OAAd,CAAxB;;AAEA,UAAI,WAAW,OAAf,EAAwB;AACtB,aAAK,OAAL,EAAc,QAAQ,OAAR,CAAd;AACD;AACF;;AAED,YAAQ,IAAR,CAAa,KAAb,EAAoB;AAClB,sBADkB;AAElB,oBAAc;AAFI,KAApB;;AAKA,WAAO,IAAP;AACD,G;;AAED;;;;;;;;;;;yBASA,K,oBAAS;AACP,WAAO,MAAP,CAAc,KAAK,MAAnB,EAA2B,KAA3B;;AAEA,QAAI,GAAG,MAAH,CAAU,KAAK,MAAf,CAAJ,EAA4B;AAC1B;AACA,WAAK,IAAM,IAAX,IAAmB,OAAO,eAA1B,EAA2C;AACzC,YAAM,YAAY,OAAO,eAAP,CAAuB,IAAvB,CAAlB;;AAEA,YAAI,UAAU,SAAV,CAAoB,CAApB,MAA2B,KAAK,MAAhC,IACG,UAAU,QAAV,CAAmB,CAAnB,MAA0B,KAAK,QADtC,EACgD;;AAE9C,oBAAU,SAAV,CAAoB,MAApB,CAA2B,CAA3B,EAA8B,CAA9B;AACA,oBAAU,QAAV,CAAoB,MAApB,CAA2B,CAA3B,EAA8B,CAA9B;AACA,oBAAU,SAAV,CAAoB,MAApB,CAA2B,CAA3B,EAA8B,CAA9B;;AAEA;AACA,cAAI,CAAC,UAAU,SAAV,CAAoB,MAAzB,EAAiC;AAC/B,sBAAU,IAAV,IAAkB,IAAlB;AACD;AACF;;AAED,eAAO,MAAP,CAAc,KAAK,QAAnB,EAA6B,IAA7B,EAAmC,OAAO,gBAA1C;AACA,eAAO,MAAP,CAAc,KAAK,QAAnB,EAA6B,IAA7B,EAAmC,OAAO,kBAA1C,EAA8D,IAA9D;AACD;AACF,KArBD,MAsBK;AACH,aAAO,MAAP,CAAc,IAAd,EAAoB,KAApB;AACD;;AAED,YAAQ,IAAR,CAAa,OAAb,EAAsB,EAAE,cAAc,IAAhB,EAAtB;;AAEA,UAAM,aAAN,CAAoB,MAApB,CAA2B,QAAQ,MAAM,aAAd,EAA6B,IAA7B,CAA3B,EAA+D,CAA/D;;AAEA;AACA,0BAA0B,MAAM,YAAN,IAAsB,EAAhD,yHAAoD;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAAzC,WAAyC;;AAClD,UAAI,YAAY,MAAZ,KAAuB,IAAvB,IAA+B,YAAY,WAAZ,EAAnC,EAA8D;AAC5D,oBAAY,IAAZ;AACD;AACF;;AAED,WAAO,MAAM,QAAb;AACD,G;;;;;AAGH,MAAM,aAAN,CAAoB,cAApB,GAAqC,SAAS,cAAT,CAAyB,MAAzB,EAAiC,OAAjC,EAA0C;AAC7E,YAAU,WAAW,MAAM,QAA3B;;AAEA,OAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,KAAK,MAAzB,EAAiC,GAAjC,EAAsC;AACpC,QAAM,eAAe,KAAK,CAAL,CAArB;;AAEA,QAAI,aAAa,MAAb,KAAwB,MAAxB,IAAkC,aAAa,QAAb,KAA0B,OAAhE,EAAyE;AACvE,aAAO,CAAP;AACD;AACF;AACD,SAAO,CAAC,CAAR;AACD,CAXD;;AAaA,MAAM,aAAN,CAAoB,GAApB,GAA0B,SAAS,eAAT,CAA0B,OAA1B,EAAmC,OAAnC,EAA4C,kBAA5C,EAAgE;AACxF,MAAM,MAAM,KAAK,KAAK,cAAL,CAAoB,OAApB,EAA6B,WAAW,QAAQ,OAAhD,CAAL,CAAZ;;AAEA,SAAO,QAAQ,GAAG,MAAH,CAAU,OAAV,KAAsB,kBAAtB,IAA4C,IAAI,SAAJ,CAAc,OAAd,CAApD,IAA6E,GAA7E,GAAmF,IAA1F;AACD,CAJD;;AAMA,MAAM,aAAN,CAAoB,eAApB,GAAsC,UAAU,QAAV,EAAoB,OAApB,EAA6B;AACjE,OAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,KAAK,MAAzB,EAAiC,GAAjC,EAAsC;AACpC,QAAM,eAAe,KAAK,CAAL,CAArB;;AAEA;AACA,QAAI,CAAC,GAAG,MAAH,CAAU,aAAa,MAAvB,CAAD,IACI,WAAW,CAAC,aAAa,SAAb,CAAuB,OAAvB,CADpB,EACsD;AACpD;AACD;;AAED,QAAM,MAAM,SAAS,YAAT,EAAuB,aAAa,MAApC,EAA4C,aAAa,QAAzD,EAAmE,CAAnE,EAAsE,IAAtE,CAAZ;;AAEA,QAAI,QAAQ,SAAZ,EAAuB;AACrB,aAAO,GAAP;AACD;AACF;AACF,CAhBD;;AAkBA;AACA,aAAa,UAAb,GAA0B,MAAM,UAAN,GAAmB,EAA7C;;AAEA,aAAa,OAAb,GAAuB,OAAvB;;AAEA,aAAa,eAAb,GAA+B,CAAE,aAAF,EAAiB,QAAjB,EAA2B,gBAA3B,EAA6C,aAA7C,CAA/B;;AAEA,OAAO,OAAP,GAAiB,YAAjB;;;;;;;ACtcA,IAAM,QAAa,QAAQ,SAAR,CAAnB;AACA,IAAM,QAAa,QAAQ,SAAR,CAAnB;AACA,IAAM,SAAa,QAAQ,gBAAR,CAAnB;AACA,IAAM,UAAa,QAAQ,iBAAR,CAAnB;AACA,IAAM,aAAa,QAAQ,oBAAR,CAAnB;AACA,IAAM,SAAa,QAAQ,2BAAR,CAAnB;AACA,IAAM,UAAa,QAAQ,iBAAR,EAA2B,GAA3B,EAAnB;;AAEA,IAAM,YAAc,EAApB;AACA,IAAM,cAAc,CAClB,aADkB,EACH,aADG,EACY,WADZ,EAElB,eAFkB,EAED,eAFC,CAApB;;AAKA;AACA,IAAI,gBAAgB,CAApB;;AAEA;AACA,MAAM,YAAN,GAAqB,EAArB;;IAEM,W;AACJ,6BAA8B;AAAA,QAAf,WAAe,QAAf,WAAe;;AAAA;;AAC5B,SAAK,MAAL,GAAqB,IAArB,CAD4B,CACD;AAC3B,SAAK,OAAL,GAAqB,IAArB,CAF4B,CAED;;AAE3B,SAAK,QAAL,GAAqB,EAAM;AACzB,YAAO,IADY;AAEnB,YAAO,IAFY;AAGnB,aAAO;AAHY,KAArB;;AAMA;AACA,SAAK,QAAL,GAAmB,EAAnB;AACA,SAAK,UAAL,GAAmB,EAAnB;AACA,SAAK,WAAL,GAAmB,EAAnB;AACA,SAAK,SAAL,GAAmB,EAAnB;;AAEA;AACA,SAAK,UAAL,GAAkB;AAChB,YAAW,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EADK;AAEhB,cAAW,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EAFK;AAGhB,iBAAW;AAHK,KAAlB;AAKA;AACA,SAAK,SAAL,GAAiB;AACf,YAAW,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EADI;AAEf,cAAW,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EAFI;AAGf,iBAAW;AAHI,KAAjB;;AAMA;AACA,SAAK,WAAL,GAAmB;AACjB,YAAW,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EADM;AAEjB,cAAW,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EAFM;AAGjB,iBAAW;AAHM,KAAnB;;AAMA;AACA,SAAK,YAAL,GAAoB;AAClB,YAAW,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EAAc,IAAI,CAAlB,EAAqB,IAAI,CAAzB,EAA4B,OAAO,CAAnC,EADO;AAElB,cAAW,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EAAc,IAAI,CAAlB,EAAqB,IAAI,CAAzB,EAA4B,OAAO,CAAnC,EAFO;AAGlB,iBAAW;AAHO,KAApB;;AAMA,SAAK,SAAL,GAAmB,IAAnB,CA3C4B,CA2CA;AAC5B,SAAK,WAAL,GAAmB,EAAnB;;AAEA,SAAK,YAAL,GAAuB,IAAvB;AACA,SAAK,eAAL,GAAuB,IAAvB;;AAEA,SAAK,SAAL,GAAiB,IAAjB,CAjD4B,CAiDA;;AAE5B,SAAK,aAAL,GAAuB,KAAvB;AACA,SAAK,eAAL,GAAuB,KAAvB;AACA,SAAK,YAAL,GAAuB,KAAvB;;AAEA,SAAK,WAAL,GAAmB,WAAnB;;AAEA,YAAQ,IAAR,CAAa,KAAb,EAAoB,IAApB;;AAEA,UAAM,YAAN,CAAmB,IAAnB,CAAwB,IAAxB;AACD;;wBAED,W,wBAAa,O,EAAS,K,EAAO,W,EAAa;AACxC,QAAM,eAAe,KAAK,aAAL,CAAmB,OAAnB,EAA4B,KAA5B,EAAmC,IAAnC,CAArB;;AAEA,YAAQ,IAAR,CAAa,MAAb,EAAqB;AACnB,sBADmB;AAEnB,kBAFmB;AAGnB,8BAHmB;AAInB,gCAJmB;AAKnB,mBAAa;AALM,KAArB;AAOD,G;;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wBAgCA,K,kBAAO,M,EAAQ,M,EAAQ,O,EAAS;AAC9B,QAAI,KAAK,WAAL,MACG,CAAC,KAAK,aADT,IAEG,KAAK,UAAL,CAAgB,MAAhB,IAA0B,OAAO,IAAP,KAAgB,SAAhB,GAA2B,CAA3B,GAA+B,CAAzD,CAFP,EAEoE;AAClE;AACD;;AAED;AACA;AACA,QAAI,MAAM,OAAN,CAAc,MAAM,YAApB,EAAkC,IAAlC,MAA4C,CAAC,CAAjD,EAAoD;AAClD,YAAM,YAAN,CAAmB,IAAnB,CAAwB,IAAxB;AACD;;AAED,UAAM,UAAN,CAAiB,KAAK,QAAtB,EAAgC,MAAhC;AACA,SAAK,MAAL,GAAsB,MAAtB;AACA,SAAK,OAAL,GAAsB,OAAtB;;AAEA,YAAQ,IAAR,CAAa,cAAb,EAA6B;AAC3B,mBAAa,IADc;AAE3B,aAAO,KAAK;AAFe,KAA7B;AAID,G;;wBAED,W,wBAAa,O,EAAS,K,EAAO,W,EAAa;AACxC,QAAI,CAAC,KAAK,UAAV,EAAsB;AACpB,WAAK,aAAL,CAAmB,OAAnB;AACA,YAAM,SAAN,CAAgB,KAAK,SAArB,EAAgC,KAAK,QAArC;AACD;;AAED,QAAM,gBAAiB,KAAK,SAAL,CAAe,IAAf,CAAoB,CAApB,KAA0B,KAAK,UAAL,CAAgB,IAAhB,CAAqB,CAA/C,IACG,KAAK,SAAL,CAAe,IAAf,CAAoB,CAApB,KAA0B,KAAK,UAAL,CAAgB,IAAhB,CAAqB,CADlD,IAEG,KAAK,SAAL,CAAe,MAAf,CAAsB,CAAtB,KAA4B,KAAK,UAAL,CAAgB,MAAhB,CAAuB,CAFtD,IAGG,KAAK,SAAL,CAAe,MAAf,CAAsB,CAAtB,KAA4B,KAAK,UAAL,CAAgB,MAAhB,CAAuB,CAH7E;;AAKA,QAAI,WAAJ;AACA,QAAI,WAAJ;;AAEA;AACA,QAAI,KAAK,aAAL,IAAsB,CAAC,KAAK,eAAhC,EAAiD;AAC/C,WAAK,KAAK,SAAL,CAAe,MAAf,CAAsB,CAAtB,GAA0B,KAAK,WAAL,CAAiB,MAAjB,CAAwB,CAAvD;AACA,WAAK,KAAK,SAAL,CAAe,MAAf,CAAsB,CAAtB,GAA0B,KAAK,WAAL,CAAiB,MAAjB,CAAwB,CAAvD;;AAEA,WAAK,eAAL,GAAuB,MAAM,KAAN,CAAY,EAAZ,EAAgB,EAAhB,IAAsB,YAAY,oBAAzD;AACD;;AAED,QAAM,YAAY;AAChB,sBADgB;AAEhB,oBAAc,KAAK,eAAL,CAAqB,OAArB,CAFE;AAGhB,kBAHgB;AAIhB,8BAJgB;AAKhB,YALgB;AAMhB,YANgB;AAOhB,iBAAW,aAPK;AAQhB,mBAAa,IARG;AAShB,6BAAuB,KAAK,WAAL;AATP,KAAlB;;AAYA,QAAI,CAAC,aAAL,EAAoB;AAClB;AACA,YAAM,cAAN,CAAqB,KAAK,YAA1B,EAAwC,KAAK,UAA7C,EAAyD,KAAK,SAA9D;AACD;;AAED,YAAQ,IAAR,CAAa,MAAb,EAAqB,SAArB;;AAEA,QAAI,CAAC,aAAL,EAAoB;AAClB;AACA,UAAI,KAAK,WAAL,EAAJ,EAAwB;AACtB,aAAK,MAAL,CAAY,SAAZ;AACD;;AAED,UAAI,KAAK,eAAT,EAA0B;AACxB,cAAM,UAAN,CAAiB,KAAK,UAAtB,EAAkC,KAAK,SAAvC;AACD;AACF;AACF,G;;AAED;;;;;;;;;;;;;;;;;;;;;;wBAoBA,M,mBAAQ,S,EAAW;AACjB,gBAAY,MAAM,MAAN,CAAa;AACvB,eAAS,KAAK,QAAL,CAAc,CAAd,CADc;AAEvB,aAAO,KAAK,SAFW;AAGvB,mBAAa,KAAK,YAHK;AAIvB,mBAAa;AAJU,KAAb,EAKT,aAAa,EALJ,CAAZ;;AAOA,YAAQ,IAAR,CAAa,oBAAb,EAAmC,SAAnC;;AAEA,QAAI,CAAC,KAAK,aAAV,EAAyB;AACvB,cAAQ,IAAR,CAAa,aAAb,EAA4B,SAA5B;AACD;;AAED,SAAK,aAAL,GAAqB,KAArB;AACD,G;;AAED;;;wBACA,S,sBAAW,O,EAAS,K,EAAO,W,EAAa,c,EAAgB;AACtD,QAAM,eAAe,KAAK,eAAL,CAAqB,OAArB,CAArB;;AAEA,YAAQ,IAAR,CAAa,WAAW,IAAX,CAAgB,MAAM,IAAtB,IAA6B,QAA7B,GAAwC,IAArD,EAA2D;AACzD,sBADyD;AAEzD,gCAFyD;AAGzD,kBAHyD;AAIzD,8BAJyD;AAKzD,oCALyD;AAMzD,mBAAa;AAN4C,KAA3D;;AASA,QAAI,CAAC,KAAK,UAAV,EAAsB;AACpB,WAAK,GAAL,CAAS,KAAT;AACD;;AAED,SAAK,aAAL,GAAqB,KAArB;AACA,SAAK,aAAL,CAAmB,OAAnB,EAA4B,KAA5B;AACD,G;;AAED;;;;;;;;;;;;;;;;;;;;;;wBAoBA,G,gBAAK,K,EAAO;AACV,YAAQ,SAAS,KAAK,SAAtB;;AAEA,QAAI,KAAK,WAAL,EAAJ,EAAwB;AACtB,cAAQ,IAAR,CAAa,YAAb,EAA2B;AACzB,oBADyB;AAEzB,qBAAa;AAFY,OAA3B;AAID;;AAED,SAAK,IAAL;AACD,G;;wBAED,a,4BAAiB;AACf,WAAO,KAAK,YAAL,GAAmB,KAAK,QAAL,CAAc,IAAjC,GAAuC,IAA9C;AACD,G;;wBAED,W,0BAAe;AACb,WAAO,KAAK,YAAZ;AACD,G;;wBAED,I,mBAAQ;AACN,YAAQ,IAAR,CAAa,MAAb,EAAqB,EAAE,aAAa,IAAf,EAArB;;AAEA,QAAI,KAAK,YAAT,EAAuB;AACrB,cAAQ,IAAR,CAAa,aAAb,EAA4B,EAAE,aAAa,IAAf,EAA5B;AACA,cAAQ,IAAR,CAAa,UAAU,KAAK,QAAL,CAAc,IAArC,EAA2C,EAAE,aAAa,IAAf,EAA3C;AACD;;AAED,SAAK,MAAL,GAAc,KAAK,OAAL,GAAe,IAA7B;;AAEA,SAAK,YAAL,GAAoB,KAApB;AACA,SAAK,QAAL,CAAc,IAAd,GAAqB,KAAK,SAAL,GAAiB,IAAtC;AACD,G;;wBAED,e,4BAAiB,O,EAAS;AACxB;AACA,QAAI,KAAK,WAAL,KAAqB,OAArB,IAAgC,KAAK,WAAL,KAAqB,KAAzD,EAAgE;AAC9D,aAAO,CAAP;AACD;;AAED,WAAO,MAAM,OAAN,CAAc,KAAK,UAAnB,EAA+B,MAAM,YAAN,CAAmB,OAAnB,CAA/B,CAAP;AACD,G;;wBAED,a,0BAAe,O,EAAS,K,EAA0D;AAAA,QAAnD,IAAmD,uEAA5C,SAAS,iBAAiB,IAAjB,CAAsB,MAAM,IAA5B,CAAmC;;AAChF,QAAM,KAAK,MAAM,YAAN,CAAmB,OAAnB,CAAX;AACA,QAAI,QAAQ,KAAK,eAAL,CAAqB,OAArB,CAAZ;;AAEA,QAAI,UAAU,CAAC,CAAf,EAAkB;AAChB,cAAQ,KAAK,UAAL,CAAgB,MAAxB;AACA,WAAK,UAAL,CAAgB,KAAhB,IAAyB,EAAzB;AACD;;AAED,QAAI,IAAJ,EAAU;AACR,cAAQ,IAAR,CAAa,qBAAb,EAAoC;AAClC,wBADkC;AAElC,oBAFkC;AAGlC,kBAHkC;AAIlC,mBAAW,EAJuB;AAKlC,sBAAc,KALoB;AAMlC,qBAAa;AANqB,OAApC;AAQD;;AAED,SAAK,QAAL,CAAc,KAAd,IAAuB,OAAvB;;AAEA,WAAO,KAAP;AACD,G;;wBAED,a,0BAAe,O,EAAS,K,EAAO;AAC7B,QAAM,QAAQ,KAAK,eAAL,CAAqB,OAArB,CAAd;;AAEA,QAAI,UAAU,CAAC,CAAf,EAAkB;AAAE;AAAS;;AAE7B,YAAQ,IAAR,CAAa,gBAAb,EAA+B;AAC7B,sBAD6B;AAE7B,kBAF6B;AAG7B,oBAAc,KAHe;AAI7B,mBAAa;AAJgB,KAA/B;;AAOA,SAAK,QAAL,CAAiB,MAAjB,CAAwB,KAAxB,EAA+B,CAA/B;AACA,SAAK,UAAL,CAAiB,MAAjB,CAAwB,KAAxB,EAA+B,CAA/B;AACA,SAAK,WAAL,CAAiB,MAAjB,CAAwB,KAAxB,EAA+B,CAA/B;AACA,SAAK,SAAL,CAAiB,MAAjB,CAAwB,KAAxB,EAA+B,CAA/B;AACD,G;;wBAED,mB,gCAAqB,M,EAAQ,a,EAAe;AAC1C,SAAK,YAAL,GAAuB,MAAvB;AACA,SAAK,eAAL,GAAuB,aAAvB;AACD,G;;;;;AAGH,KAAK,IAAI,IAAI,CAAR,EAAW,MAAM,YAAY,MAAlC,EAA0C,IAAI,GAA9C,EAAmD,GAAnD,EAAwD;AACtD,MAAM,SAAS,YAAY,CAAZ,CAAf;;AAEA,YAAU,MAAV,IAAoB,iBAAiB,MAAjB,CAApB;AACD;;AAED,SAAS,gBAAT,CAA2B,MAA3B,EAAmC;AACjC,SAAQ,UAAU,KAAV,EAAiB;AACvB,QAAM,cAAc,MAAM,cAAN,CAAqB,KAArB,CAApB;;AADuB,gCAEe,MAAM,eAAN,CAAsB,KAAtB,CAFf;AAAA,QAEhB,WAFgB;AAAA,QAEH,cAFG;;AAGvB,QAAM,UAAU,EAAhB,CAHuB,CAGH;;AAEpB,QAAI,QAAQ,aAAR,IAAyB,QAAQ,IAAR,CAAa,MAAM,IAAnB,CAA7B,EAAuD;AACrD,sBAAgB,IAAI,IAAJ,GAAW,OAAX,EAAhB;;AAEA,WAAK,IAAI,KAAI,CAAb,EAAgB,KAAI,MAAM,cAAN,CAAqB,MAAzC,EAAiD,IAAjD,EAAsD;AACpD,YAAM,UAAU,MAAM,cAAN,CAAqB,EAArB,CAAhB;AACA,YAAM,cAAc,OAAO,MAAP,CAAc,OAAd,EAAuB,MAAM,IAA7B,EAAmC,WAAnC,CAApB;;AAEA,gBAAQ,IAAR,CAAa,CAAC,OAAD,EAAU,eAAe,IAAI,WAAJ,CAAgB,EAAE,wBAAF,EAAhB,CAAzB,CAAb;AACD;AACF,KATD,MAUK;AACH,UAAI,iBAAiB,KAArB;;AAEA,UAAI,CAAC,QAAQ,oBAAT,IAAiC,QAAQ,IAAR,CAAa,MAAM,IAAnB,CAArC,EAA+D;AAC7D;AACA,aAAK,IAAI,MAAI,CAAb,EAAgB,MAAI,MAAM,YAAN,CAAmB,MAAvB,IAAiC,CAAC,cAAlD,EAAkE,KAAlE,EAAuE;AACrE,2BAAiB,MAAM,YAAN,CAAmB,GAAnB,EAAsB,WAAtB,KAAsC,OAAtC,IAAiD,MAAM,YAAN,CAAmB,GAAnB,EAAsB,aAAxF;AACD;;AAED;AACA;AACA,yBAAiB,kBACX,IAAI,IAAJ,GAAW,OAAX,KAAuB,aAAvB,GAAuC;AAC3C;AAFe,WAGZ,MAAM,SAAN,KAAoB,CAHzB;AAID;;AAED,UAAI,CAAC,cAAL,EAAqB;AACnB,YAAI,eAAc,OAAO,MAAP,CAAc,KAAd,EAAqB,MAAM,IAA3B,EAAiC,WAAjC,CAAlB;;AAEA,YAAI,CAAC,YAAL,EAAkB;AAChB,yBAAc,IAAI,WAAJ,CAAgB,EAAE,wBAAF,EAAhB,CAAd;AACD;;AAED,gBAAQ,IAAR,CAAa,CAAC,KAAD,EAAQ,YAAR,CAAb;AACD;AACF;;AAED,yBAAqC,OAArC,mHAA8C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,UAAlC,QAAkC;AAAA,UAAzB,aAAyB;;AAC5C,oBAAY,mBAAZ,CAAgC,WAAhC,EAA6C,cAA7C;AACA,oBAAY,MAAZ,EAAoB,QAApB,EAA6B,KAA7B,EAAoC,WAApC,EAAiD,cAAjD;AACD;AACF,GA/CD;AAgDD;;AAED,SAAS,MAAT,CAAiB,KAAjB,EAAwB;AACtB,OAAK,IAAI,MAAI,CAAb,EAAgB,MAAI,MAAM,YAAN,CAAmB,MAAvC,EAA+C,KAA/C,EAAoD;AAClD,QAAM,cAAc,MAAM,YAAN,CAAmB,GAAnB,CAApB;;AAEA,gBAAY,GAAZ,CAAgB,KAAhB;AACA,YAAQ,IAAR,CAAa,QAAb,EAAuB,EAAE,YAAF,EAAS,wBAAT,EAAvB;AACD;AACF;;AAED,IAAM,YAAY,CAAE,+BAAF,CAAlB;AACA,IAAM,cAAc,QAAQ,WAA5B;;AAEA,IAAI,WAAW,YAAf,EAA6B;AAC3B,YAAU,YAAY,IAAtB,IAAgC,UAAU,WAA1C;AACA,YAAU,YAAY,IAAtB,IAAgC,UAAU,WAA1C;AACA,YAAU,YAAY,EAAtB,IAAgC,UAAU,SAA1C;AACA,YAAU,YAAY,MAAtB,IAAgC,UAAU,SAA1C;AACD,CALD,MAMK;AACH,YAAU,SAAV,GAAwB,UAAU,WAAlC;AACA,YAAU,SAAV,GAAwB,UAAU,WAAlC;AACA,YAAU,OAAV,GAAwB,UAAU,SAAlC;;AAEA,YAAU,UAAV,GAAwB,UAAU,WAAlC;AACA,YAAU,SAAV,GAAwB,UAAU,WAAlC;AACA,YAAU,QAAV,GAAwB,UAAU,SAAlC;AACA,YAAU,WAAV,GAAwB,UAAU,SAAlC;AACD;;AAED,UAAU,IAAV,GAAiB,MAAjB;;AAEA,SAAS,WAAT,QAA+B,UAA/B,EAA2C;AAAA,MAAnB,GAAmB,SAAnB,GAAmB;;AACzC,MAAM,cAAc,WAAW,OAAX,CAAmB,KAAnB,MAA8B,CAA9B,GAChB,OAAO,GADS,GACH,OAAO,MADxB;;AAGA;AACA,OAAK,IAAM,SAAX,IAAwB,MAAM,eAA9B,EAA+C;AAC7C,gBAAY,GAAZ,EAAiB,SAAjB,EAA4B,OAAO,gBAAnC;AACA,gBAAY,GAAZ,EAAiB,SAAjB,EAA4B,OAAO,kBAAnC,EAAuD,IAAvD;AACD;;AAED,OAAK,IAAM,UAAX,IAAwB,SAAxB,EAAmC;AACjC,gBAAY,GAAZ,EAAiB,UAAjB,EAA4B,UAAU,UAAV,CAA5B;AACD;AACF;;AAED,QAAQ,EAAR,CAAW,qBAAX,EAAkC,iBAAiF;AAAA,MAA9E,WAA8E,SAA9E,WAA8E;AAAA,MAAjE,OAAiE,SAAjE,OAAiE;AAAA,MAAxD,SAAwD,SAAxD,SAAwD;AAAA,MAA7C,YAA6C,SAA7C,YAA6C;AAAA,MAA/B,KAA+B,SAA/B,KAA+B;AAAA,MAAxB,WAAwB,SAAxB,WAAwB;AAAA,MAAX,IAAW,SAAX,IAAW;;AACjH,cAAY,UAAZ,CAAuB,YAAvB,IAAuC,SAAvC;AACA,cAAY,QAAZ,CAAqB,YAArB,IAAqC,OAArC;;AAEA,MAAI,IAAJ,EAAU;AACR,gBAAY,aAAZ,GAA4B,IAA5B;AACD;;AAED,MAAI,CAAC,YAAY,WAAZ,EAAL,EAAgC;AAC9B,UAAM,SAAN,CAAgB,YAAY,WAA5B,EAAyC,YAAY,QAArD;;AAEA,UAAM,UAAN,CAAiB,YAAY,SAA7B,EAAyC,YAAY,WAArD;AACA,UAAM,UAAN,CAAiB,YAAY,UAA7B,EAAyC,YAAY,WAArD;;AAEA,gBAAY,SAAZ,GAAwC,KAAxC;AACA,gBAAY,SAAZ,CAAsB,YAAtB,IAAwC,YAAY,SAAZ,CAAsB,SAA9D;AACA,gBAAY,WAAZ,CAAwB,YAAxB,IAAwC,eAAe,SAAS,MAAM,eAAN,CAAsB,KAAtB,EAA6B,CAA7B,CAAhE;AACA,gBAAY,eAAZ,GAAwC,KAAxC;;AAEA,UAAM,aAAN,CAAoB,YAAY,WAAhC,EAA6C,OAA7C;AACD;AACF,CArBD;;AAuBA,MAAM,OAAN,CAAc,EAAd,CAAiB,cAAjB,EAAoC,WAApC;AACA,MAAM,OAAN,CAAc,EAAd,CAAiB,iBAAjB,EAAoC,WAApC;;AAEA,YAAY,oBAAZ,GAAmC,CAAnC;AACA,YAAY,gBAAZ,GAA+B,gBAA/B;AACA,YAAY,MAAZ,GAAqB,MAArB;AACA,YAAY,OAAZ,GAAsB,OAAtB;AACA,YAAY,SAAZ,GAAwB,SAAxB;;AAEA,MAAM,kBAAN,GAA2B,MAA3B;;AAEA,OAAO,OAAP,GAAiB,WAAjB;;;;;AC/fA,IAAM,cAAgB,QAAQ,gBAAR,CAAtB;AACA,IAAM,gBAAgB,QAAQ,kBAAR,CAAtB;;AAEA,IAAM,UAAU;AACd,4BADc;AAEd,SAAO,EAFO;AAGd,cAAY;AAHE,CAAhB;;AAMA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,cAAvB,EAAuC,gBAAkC;AAAA,MAAtB,WAAsB,QAAtB,WAAsB;AAAA,MAAT,KAAS,QAAT,KAAS;;AACvE,cAAY,YAAZ,GAA2B,IAA3B;AACA,eAAa,WAAb,EAA0B,KAA1B,EAAiC,OAAjC;AACD,CAHD;;AAKA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,aAAvB,EAAsC,iBAA0C;AAAA,MAA9B,WAA8B,SAA9B,WAA8B;AAAA,MAAjB,KAAiB,SAAjB,KAAiB;AAAA,MAAV,MAAU,SAAV,MAAU;;AAC9E,eAAa,WAAb,EAA0B,KAA1B,EAAiC,MAAjC,EAAyC,MAAzC;;AAEA;AACA,MAAI,CAAC,YAAY,WAAZ,EAAL,EAAgC;AAAE,WAAO,KAAP;AAAe;AAClD,CALD;;AAOA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,YAAvB,EAAqC,iBAAkC;AAAA,MAAtB,WAAsB,SAAtB,WAAsB;AAAA,MAAT,KAAS,SAAT,KAAS;;AACrE,eAAa,WAAb,EAA0B,KAA1B,EAAiC,KAAjC;AACD,CAFD;;AAIA,SAAS,YAAT,CAAuB,WAAvB,EAAoC,KAApC,EAA2C,KAA3C,EAAkD,MAAlD,EAA0D;AACxD,MAAM,aAAa,YAAY,QAAZ,CAAqB,IAAxC;;AAEA,MAAM,WAAW,IAAI,aAAJ,CAAkB,WAAlB,EAA+B,KAA/B,EAAsC,UAAtC,EAAkD,KAAlD,EAAyD,YAAY,OAArE,EAA8E,IAA9E,EAAoF,MAApF,CAAjB;;AAEA,cAAY,MAAZ,CAAmB,IAAnB,CAAwB,QAAxB;AACA,cAAY,SAAZ,GAAwB,QAAxB;AACD;;AAED,OAAO,OAAP,GAAiB,OAAjB;;;;;AClCA,IAAM,UAAiB,QAAQ,QAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,UAAR,CAAvB;AACA,IAAM,gBAAiB,QAAQ,kBAAR,CAAvB;AACA,IAAM,eAAiB,QAAQ,iBAAR,CAAvB;AACA,IAAM,cAAiB,QAAQ,gBAAR,CAAvB;AACA,IAAM,iBAAiB,QAAQ,mBAAR,CAAvB;;AAEA,IAAM,OAAO;AACX,YAAU;AACR,aAAc,KADN;AAER,kBAAc,IAFN;;AAIR,YAAY,IAJJ;AAKR,UAAY,IALJ;AAMR,cAAY,IANJ;AAOR,aAAY,IAPJ;AAQR,gBAAY,IARJ;;AAUR,eAAY,IAVJ;AAWR,cAAY;AAXJ,GADC;;AAeX,WAAS,iBAAU,OAAV,EAAmB,KAAnB,EAA0B,YAA1B,EAAwC;AAC/C,QAAM,cAAc,aAAa,OAAb,CAAqB,IAAzC;;AAEA,WAAO,YAAY,OAAZ,GACH,EAAE,MAAM,MAAR,EAAgB,MAAO,YAAY,QAAZ,KAAyB,OAAzB,GACE,YAAY,SADd,GAEE,YAAY,QAFrC,EADG,GAIH,IAJJ;AAKD,GAvBU;;AAyBX,aAAW,qBAAY;AACrB,WAAO,MAAP;AACD;AA3BU,CAAb;;AA8BA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,oBAAvB,EAA6C,gBAA2B;AAAA,MAAf,WAAe,QAAf,WAAe;;AACtE,MAAI,YAAY,QAAZ,CAAqB,IAArB,KAA8B,MAAlC,EAA0C;AAAE;AAAS;;AAErD,MAAM,OAAO,YAAY,QAAZ,CAAqB,IAAlC;;AAEA,MAAI,SAAS,GAAb,EAAkB;AAChB,gBAAY,SAAZ,CAAsB,IAAtB,CAA2B,CAA3B,GAAiC,YAAY,WAAZ,CAAwB,IAAxB,CAA6B,CAA9D;AACA,gBAAY,SAAZ,CAAsB,MAAtB,CAA6B,CAA7B,GAAiC,YAAY,WAAZ,CAAwB,MAAxB,CAA+B,CAAhE;;AAEA,gBAAY,YAAZ,CAAyB,IAAzB,CAA8B,KAA9B,GAAwC,KAAK,GAAL,CAAS,YAAY,YAAZ,CAAyB,IAAzB,CAA8B,EAAvC,CAAxC;AACA,gBAAY,YAAZ,CAAyB,MAAzB,CAAgC,KAAhC,GAAwC,KAAK,GAAL,CAAS,YAAY,YAAZ,CAAyB,MAAzB,CAAgC,EAAzC,CAAxC;AACA,gBAAY,YAAZ,CAAyB,MAAzB,CAAgC,EAAhC,GAAqC,CAArC;AACA,gBAAY,YAAZ,CAAyB,IAAzB,CAA8B,EAA9B,GAAqC,CAArC;AACD,GARD,MASK,IAAI,SAAS,GAAb,EAAkB;AACrB,gBAAY,SAAZ,CAAsB,IAAtB,CAA2B,CAA3B,GAAiC,YAAY,WAAZ,CAAwB,IAAxB,CAA6B,CAA9D;AACA,gBAAY,SAAZ,CAAsB,MAAtB,CAA6B,CAA7B,GAAiC,YAAY,WAAZ,CAAwB,MAAxB,CAA+B,CAAhE;;AAEA,gBAAY,YAAZ,CAAyB,IAAzB,CAA8B,KAA9B,GAAwC,KAAK,GAAL,CAAS,YAAY,YAAZ,CAAyB,IAAzB,CAA8B,EAAvC,CAAxC;AACA,gBAAY,YAAZ,CAAyB,MAAzB,CAAgC,KAAhC,GAAwC,KAAK,GAAL,CAAS,YAAY,YAAZ,CAAyB,MAAzB,CAAgC,EAAzC,CAAxC;AACA,gBAAY,YAAZ,CAAyB,MAAzB,CAAgC,EAAhC,GAAqC,CAArC;AACA,gBAAY,YAAZ,CAAyB,IAAzB,CAA8B,EAA9B,GAAqC,CAArC;AACD;AACF,CAvBD;;AAyBA;AACA,cAAc,OAAd,CAAsB,EAAtB,CAAyB,KAAzB,EAAgC,iBAAmC;AAAA,MAAvB,MAAuB,SAAvB,MAAuB;AAAA,MAAf,WAAe,SAAf,WAAe;;AACjE,MAAI,OAAO,IAAP,KAAgB,UAApB,EAAgC;AAAE;AAAS;;AAE3C,MAAM,OAAO,YAAY,QAAZ,CAAqB,IAAlC;;AAEA,MAAI,SAAS,GAAb,EAAkB;AAChB,WAAO,KAAP,GAAiB,YAAY,WAAZ,CAAwB,IAAxB,CAA6B,CAA9C;AACA,WAAO,OAAP,GAAiB,YAAY,WAAZ,CAAwB,MAAxB,CAA+B,CAAhD;AACA,WAAO,EAAP,GAAY,CAAZ;AACD,GAJD,MAKK,IAAI,SAAS,GAAb,EAAkB;AACrB,WAAO,KAAP,GAAiB,YAAY,WAAZ,CAAwB,IAAxB,CAA6B,CAA9C;AACA,WAAO,OAAP,GAAiB,YAAY,WAAZ,CAAwB,MAAxB,CAA+B,CAAhD;AACA,WAAO,EAAP,GAAY,CAAZ;AACD;AACF,CAfD;;AAiBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoCA,aAAa,SAAb,CAAuB,SAAvB,GAAmC,UAAU,OAAV,EAAmB;AACpD,MAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,OAAhB,CAAJ,EAA8B;AAC5B,SAAK,OAAL,CAAa,IAAb,CAAkB,OAAlB,GAA4B,QAAQ,OAAR,KAAoB,KAApB,GAA2B,KAA3B,GAAkC,IAA9D;AACA,SAAK,YAAL,CAAkB,MAAlB,EAA0B,OAA1B;AACA,SAAK,WAAL,CAAiB,MAAjB,EAAyB,OAAzB;;AAEA,QAAI,mBAAmB,IAAnB,CAAwB,QAAQ,QAAhC,CAAJ,EAA+C;AAC7C,WAAK,OAAL,CAAa,IAAb,CAAkB,QAAlB,GAA6B,QAAQ,QAArC;AACD;AACD,QAAI,aAAa,IAAb,CAAkB,QAAQ,SAA1B,CAAJ,EAA0C;AACxC,WAAK,OAAL,CAAa,IAAb,CAAkB,SAAlB,GAA8B,QAAQ,SAAtC;AACD;;AAED,WAAO,IAAP;AACD;;AAED,MAAI,MAAM,EAAN,CAAS,IAAT,CAAc,OAAd,CAAJ,EAA4B;AAC1B,SAAK,OAAL,CAAa,IAAb,CAAkB,OAAlB,GAA4B,OAA5B;;AAEA,QAAI,CAAC,OAAL,EAAc;AACZ,WAAK,WAAL,GAAmB,KAAK,WAAL,GAAmB,KAAK,SAAL,GAAiB,IAAvD;AACD;;AAED,WAAO,IAAP;AACD;;AAED,SAAO,KAAK,OAAL,CAAa,IAApB;AACD,CA3BD;;AA6BA,QAAQ,IAAR,GAAe,IAAf;AACA,QAAQ,KAAR,CAAc,IAAd,CAAmB,MAAnB;AACA,MAAM,KAAN,CAAY,aAAa,UAAzB,EAAqC,CACnC,WADmC,EAEnC,UAFmC,EAGnC,kBAHmC,EAInC,mBAJmC,EAKnC,SALmC,CAArC;AAOA,QAAQ,UAAR,CAAmB,IAAnB,GAA0B,WAA1B;;AAEA,eAAe,IAAf,GAAsB,KAAK,QAA3B;;AAEA,OAAO,OAAP,GAAiB,IAAjB;;;;;AC9JA,IAAM,UAAiB,QAAQ,QAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,UAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,UAAR,CAAvB;AACA,IAAM,WAAiB,QAAQ,aAAR,CAAvB;AACA,IAAM,gBAAiB,QAAQ,kBAAR,CAAvB;AACA,IAAM,eAAiB,QAAQ,iBAAR,CAAvB;AACA,IAAM,cAAiB,QAAQ,gBAAR,CAAvB;AACA,IAAM,iBAAiB,QAAQ,mBAAR,CAAvB;;AAEA,IAAM,OAAO;AACX,YAAU;AACR,aAAS,KADD;AAER,YAAS,IAFD;AAGR,aAAS;AAHD;AADC,CAAb;;AAQA,IAAI,cAAc,KAAlB;;AAEA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,cAAvB,EAAuC,gBAAkC;AAAA,MAAtB,WAAsB,QAAtB,WAAsB;AAAA,MAAT,KAAS,QAAT,KAAS;;AACvE,MAAI,YAAY,QAAZ,CAAqB,IAArB,KAA8B,MAAlC,EAA0C;AAAE;AAAS;;AAErD;AACA,cAAY,WAAZ,CAAwB,SAAxB,GAAoC,EAApC;AACA,cAAY,WAAZ,CAAwB,QAAxB,GAAoC,EAApC;AACA,cAAY,WAAZ,CAAwB,KAAxB,GAAoC,EAApC;;AAEA,cAAY,UAAZ,GAAyB,IAAzB;;AAEA,MAAI,CAAC,YAAY,WAAjB,EAA8B;AAC5B,mBAAe,WAAf,EAA4B,YAAY,OAAxC;AACD;;AAED,MAAM,YAAY,YAAY,SAA9B;AACA,MAAM,aAAa,cAAc,WAAd,EAA2B,KAA3B,EAAkC,SAAlC,CAAnB;;AAEA,MAAI,WAAW,QAAf,EAAyB;AACvB,oBAAgB,WAAhB,EAA6B,WAAW,QAAxC;AACD;AACF,CApBD;;AAsBA,cAAc,OAAd,CAAsB,EAAtB,CAAyB,KAAzB,EAAgC,iBAA0C;AAAA,MAA9B,WAA8B,SAA9B,WAA8B;AAAA,MAAjB,MAAiB,SAAjB,MAAiB;AAAA,MAAT,KAAS,SAAT,KAAS;;AACxE,MAAI,OAAO,IAAP,KAAgB,UAAhB,IAA8B,OAAO,IAAP,KAAgB,SAAlD,EAA6D;AAAE;AAAS;;AAExE,MAAM,mBAAmB,YAAY,OAArC;AACA,MAAM,YAAY,MAAlB;AACA,MAAM,aAAa,QAAQ,SAAR,EAAmB,KAAnB,EAA0B,gBAA1B,CAAnB;;AAEA,cAAY,UAAZ,GAA0B,WAAW,QAArC;AACA,cAAY,WAAZ,GAA0B,WAAW,OAArC;;AAEA,cAAY,UAAZ,GAAyB,cAAc,WAAd,EAA2B,KAA3B,EAAkC,SAAlC,CAAzB;AACD,CAXD;;AAaA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,aAAvB,EAAsC,iBAA2B;AAAA,MAAf,WAAe,SAAf,WAAe;;AAC/D,MAAI,YAAY,QAAZ,CAAqB,IAArB,KAA8B,MAAlC,EAA0C;AAAE;AAAS;;AAErD,iBAAe,WAAf,EAA4B,YAAY,UAAxC;AACD,CAJD;;AAMA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,YAAvB,EAAqC,iBAA2B;AAAA,MAAf,WAAe,SAAf,WAAe;;AAC9D,MAAI,YAAY,QAAZ,CAAqB,IAArB,KAA8B,MAAlC,EAA0C;AACxC,mBAAe,WAAf,EAA4B,YAAY,UAAxC;AACD;AACF,CAJD;;AAMA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,WAAvB,EAAoC,iBAA2B;AAAA,MAAf,WAAe,SAAf,WAAe;;AAC7D,cAAY,WAAZ,CAAwB,SAAxB,GACE,YAAY,WAAZ,CAAwB,QAAxB,GACA,YAAY,WAAZ,CAAwB,KAAxB,GACA,YAAY,UAAZ,GAAyB,IAH3B;AAID,CALD;;AAOA,SAAS,YAAT,CAAuB,WAAvB,EAAoC,OAApC,EAA6C;AAC3C,MAAM,QAAQ,EAAd;AACA,MAAM,WAAW,EAAjB;;AAEA,YAAU,WAAW,YAAY,OAAjC;;AAEA;AACA,uBAAsB,MAAM,aAA5B,kHAA2C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,QAAhC,OAAgC;;AACzC,QAAI,CAAC,QAAQ,OAAR,CAAgB,IAAhB,CAAqB,OAA1B,EAAmC;AAAE;AAAW;;AAEhD,QAAM,SAAS,QAAQ,OAAR,CAAgB,IAAhB,CAAqB,MAApC;;AAEA;AACA,QAAK,MAAM,EAAN,CAAS,OAAT,CAAiB,MAAjB,KAA4B,WAAW,OAAxC,IACI,MAAM,EAAN,CAAS,MAAT,CAAgB,MAAhB,KACD,CAAC,MAAM,eAAN,CAAsB,OAAtB,EAA+B,MAA/B,CAFR,EAEiD;;AAE/C;AACD;;AAED;AACA,QAAM,eAAe,MAAM,EAAN,CAAS,MAAT,CAAgB,QAAQ,MAAxB,IACjB,QAAQ,QAAR,CAAiB,gBAAjB,CAAkC,QAAQ,MAA1C,CADiB,GAEjB,CAAC,QAAQ,MAAT,CAFJ;;AAIA,SAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,aAAa,MAAjC,EAAyC,GAAzC,EAA8C;AAC5C,UAAM,iBAAiB,aAAa,CAAb,CAAvB;;AAEA,UAAI,mBAAmB,OAAvB,EAAgC;AAC9B,cAAM,IAAN,CAAW,OAAX;AACA,iBAAS,IAAT,CAAc,cAAd;AACD;AACF;AACF;;AAED,SAAO;AACL,sBADK;AAEL,eAAW;AAFN,GAAP;AAID;;AAED,SAAS,eAAT,CAA0B,WAA1B,EAAuC,KAAvC,EAA8C;AAC5C,MAAI,oBAAJ;;AAEA;AACA,OAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,YAAY,WAAZ,CAAwB,SAAxB,CAAkC,MAAtD,EAA8D,GAA9D,EAAmE;AACjE,QAAM,UAAU,YAAY,WAAZ,CAAwB,SAAxB,CAAkC,CAAlC,CAAhB;AACA,QAAM,iBAAiB,YAAY,WAAZ,CAAwB,QAAxB,CAAkC,CAAlC,CAAvB;;AAEA;AACA,QAAI,mBAAmB,WAAvB,EAAoC;AAClC;AACA,YAAM,MAAN,GAAe,cAAf;AACA,cAAQ,IAAR,CAAa,KAAb;AACD;AACD,kBAAc,cAAd;AACD;AACF;;AAED;AACA;AACA;AACA,SAAS,cAAT,CAAyB,WAAzB,EAAsC,WAAtC,EAAmD;AACjD;AACA,MAAM,gBAAgB,aAAa,WAAb,EAA0B,WAA1B,EAAuC,IAAvC,CAAtB;;AAEA,cAAY,WAAZ,CAAwB,SAAxB,GAAoC,cAAc,SAAlD;AACA,cAAY,WAAZ,CAAwB,QAAxB,GAAoC,cAAc,QAAlD;AACA,cAAY,WAAZ,CAAwB,KAAxB,GAAoC,EAApC;;AAEA,OAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,YAAY,WAAZ,CAAwB,SAAxB,CAAkC,MAAtD,EAA8D,GAA9D,EAAmE;AACjE,gBAAY,WAAZ,CAAwB,KAAxB,CAA8B,CAA9B,IACE,YAAY,WAAZ,CAAwB,SAAxB,CAAkC,CAAlC,EAAqC,OAArC,CAA6C,YAAY,WAAZ,CAAwB,QAAxB,CAAiC,CAAjC,CAA7C,CADF;AAED;AACF;;AAED,SAAS,OAAT,CAAkB,SAAlB,EAA6B,KAA7B,EAAoC,WAApC,EAAiD;AAC/C,MAAM,cAAc,UAAU,WAA9B;AACA,MAAM,aAAa,EAAnB;;AAEA,MAAI,WAAJ,EAAiB;AACf,mBAAe,WAAf,EAA4B,WAA5B;AACD;;AAED;AACA,OAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,YAAY,WAAZ,CAAwB,SAAxB,CAAkC,MAAtD,EAA8D,GAA9D,EAAmE;AACjE,QAAM,UAAiB,YAAY,WAAZ,CAAwB,SAAxB,CAAkC,CAAlC,CAAvB;AACA,QAAM,iBAAiB,YAAY,WAAZ,CAAwB,QAAxB,CAAkC,CAAlC,CAAvB;AACA,QAAM,OAAiB,YAAY,WAAZ,CAAwB,KAAxB,CAAkC,CAAlC,CAAvB;;AAEA,eAAW,IAAX,CAAgB,QAAQ,SAAR,CAAkB,SAAlB,EAA6B,KAA7B,EAAoC,YAAY,MAAhD,EAAwD,WAAxD,EAAqE,cAArE,EAAqF,IAArF,IACZ,cADY,GAEZ,IAFJ;AAGD;;AAED;AACA,MAAM,YAAY,MAAM,qBAAN,CAA4B,UAA5B,CAAlB;;AAEA,SAAO;AACL,cAAU,YAAY,WAAZ,CAAwB,SAAxB,CAAkC,SAAlC,KAAgD,IADrD;AAEL,aAAU,YAAY,WAAZ,CAAwB,QAAxB,CAAkC,SAAlC,KAAgD;AAFrD,GAAP;AAID;;AAED,SAAS,aAAT,CAAwB,WAAxB,EAAqC,YAArC,EAAmD,SAAnD,EAA8D;AAC5D,MAAM,aAAa;AACjB,WAAY,IADK;AAEjB,WAAY,IAFK;AAGjB,cAAY,IAHK;AAIjB,gBAAY,IAJK;AAKjB,UAAY,IALK;AAMjB,UAAY;AANK,GAAnB;;AASA,MAAM,OAAO;AACX,wBADW;AAEX,4BAFW;AAGX,YAAe,YAAY,WAHhB;AAIX,cAAe,YAAY,UAJhB;AAKX,mBAAe,UAAU,MALd;AAMX,eAAe,UAAU,YANd;AAOX,eAAe,UAAU;AAPd,GAAb;;AAUA,MAAI,YAAY,WAAZ,KAA4B,YAAY,eAA5C,EAA6D;AAC3D;AACA,QAAI,YAAY,cAAhB,EAAgC;AAC9B,iBAAW,KAAX,GAAmB,MAAM,MAAN,CAAa,EAAE,MAAM,WAAR,EAAb,EAAoC,IAApC,CAAnB;;AAEA,gBAAU,SAAV,GAAyB,WAAW,KAAX,CAAiB,MAAjB,GAA4B,YAAY,eAAjE;AACA,gBAAU,YAAV,GAAyB,WAAW,KAAX,CAAiB,QAAjB,GAA4B,YAAY,cAAjE;AACD;AACD;AACA,QAAI,YAAY,UAAhB,EAA4B;AAC1B,iBAAW,KAAX,GAAmB;AACjB,4BADiB;AAEjB,gCAFiB;AAGjB,gBAAe,YAAY,WAHV;AAIjB,kBAAe,YAAY,UAJV;AAKjB,uBAAe,UAAU,MALR;AAMjB,mBAAe,UAAU,YANR;AAOjB,mBAAe,UAAU,SAPR;AAQjB,cAAe;AARE,OAAnB;;AAWA,gBAAU,SAAV,GAAsB,YAAY,WAAlC;AACA,gBAAU,QAAV,GAAqB,YAAY,UAAjC;AACD;AACF;;AAED,MAAI,UAAU,IAAV,KAAmB,SAAnB,IAAgC,YAAY,UAAhD,EAA4D;AAC1D,eAAW,IAAX,GAAkB,MAAM,MAAN,CAAa,EAAE,MAAM,MAAR,EAAb,EAA+B,IAA/B,CAAlB;;AAEA,cAAU,QAAV,GAAqB,YAAY,UAAjC;AACA,cAAU,aAAV,GAA0B,YAAY,WAAtC;AACD;AACD,MAAI,UAAU,IAAV,KAAmB,WAAvB,EAAoC;AAClC,eAAW,QAAX,GAAsB,MAAM,MAAN,CAAa,EAAE,MAAM,cAAR,EAAb,EAAuC,IAAvC,CAAtB;;AAEA,eAAW,QAAX,CAAoB,MAApB,GAA+B,IAA/B;AACA,eAAW,QAAX,CAAoB,QAApB,GAA+B,IAA/B;AACD;AACD,MAAI,UAAU,IAAV,KAAmB,SAAvB,EAAkC;AAChC,eAAW,UAAX,GAAwB,MAAM,MAAN,CAAa,EAAE,MAAM,gBAAR,EAAb,EAAyC,IAAzC,CAAxB;;AAEA,eAAW,UAAX,CAAsB,MAAtB,GAAiC,IAAjC;AACA,eAAW,UAAX,CAAsB,QAAtB,GAAiC,IAAjC;AACD;AACD,MAAI,UAAU,IAAV,KAAmB,UAAnB,IAAiC,YAAY,UAAjD,EAA6D;AAC3D,eAAW,IAAX,GAAkB,MAAM,MAAN,CAAa;AAC7B,gBAAe,SADc;AAE7B,YAAe;AAFc,KAAb,EAGf,IAHe,CAAlB;;AAKA,cAAU,QAAV,GAAqB,YAAY,UAAjC;AACD;;AAED,SAAO,UAAP;AACD;;AAED,SAAS,cAAT,CAAyB,WAAzB,EAAsC,UAAtC,EAAkD;AAChD,MAAI,WAAW,KAAf,EAAsB;AAAE,gBAAY,cAAZ,CAA2B,IAA3B,CAAgC,WAAW,KAA3C;AAAoD;AAC5E,MAAI,WAAW,IAAf,EAAsB;AAAM,gBAAY,UAAZ,CAAuB,IAAvB,CAA4B,WAAW,IAAvC;AAAgD;AAC5E,MAAI,WAAW,KAAf,EAAsB;AAAM,gBAAY,UAAZ,CAAuB,IAAvB,CAA4B,WAAW,KAAvC;AAAgD;AAC5E,MAAI,WAAW,IAAf,EAAsB;AAAM,gBAAY,UAAZ,CAAuB,IAAvB,CAA4B,WAAW,IAAvC;AAAgD;AAC5E,MAAI,WAAW,UAAf,EAA2B;AACzB,oBAAgB,WAAhB,EAA6B,WAAW,UAAxC;AACD;;AAED,cAAY,cAAZ,GAA8B,YAAY,UAA1C;AACA,cAAY,eAAZ,GAA8B,YAAY,WAA1C;AACD;;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoDA,aAAa,SAAb,CAAuB,QAAvB,GAAkC,UAAU,OAAV,EAAmB;AACnD,MAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,OAAhB,CAAJ,EAA8B;AAC5B,SAAK,OAAL,CAAa,IAAb,CAAkB,OAAlB,GAA4B,QAAQ,OAAR,KAAoB,KAApB,GAA2B,KAA3B,GAAkC,IAA9D;;AAEA,QAAI,MAAM,EAAN,CAAS,QAAT,CAAkB,QAAQ,MAA1B,CAAJ,EAAiD;AAAE,WAAK,MAAL,CAAY,MAAZ,GAA+B,QAAQ,MAAvC;AAA0D;AAC7G,QAAI,MAAM,EAAN,CAAS,QAAT,CAAkB,QAAQ,cAA1B,CAAJ,EAAiD;AAAE,WAAK,MAAL,CAAY,cAAZ,GAA+B,QAAQ,cAAvC;AAA0D;AAC7G,QAAI,MAAM,EAAN,CAAS,QAAT,CAAkB,QAAQ,gBAA1B,CAAJ,EAAiD;AAAE,WAAK,MAAL,CAAY,gBAAZ,GAA+B,QAAQ,gBAAvC;AAA0D;AAC7G,QAAI,MAAM,EAAN,CAAS,QAAT,CAAkB,QAAQ,WAA1B,CAAJ,EAAiD;AAAE,WAAK,MAAL,CAAY,WAAZ,GAA+B,QAAQ,WAAvC;AAA0D;AAC7G,QAAI,MAAM,EAAN,CAAS,QAAT,CAAkB,QAAQ,WAA1B,CAAJ,EAAiD;AAAE,WAAK,MAAL,CAAY,WAAZ,GAA+B,QAAQ,WAAvC;AAA0D;AAC7G,QAAI,MAAM,EAAN,CAAS,QAAT,CAAkB,QAAQ,UAA1B,CAAJ,EAAiD;AAAE,WAAK,MAAL,CAAY,UAAZ,GAA+B,QAAQ,UAAvC;AAA0D;;AAE7G,QAAI,qBAAqB,IAArB,CAA0B,QAAQ,OAAlC,CAAJ,EAAgD;AAC9C,WAAK,OAAL,CAAa,IAAb,CAAkB,OAAlB,GAA4B,QAAQ,OAApC;AACD,KAFD,MAGK,IAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,QAAQ,OAAxB,CAAJ,EAAsC;AACzC,WAAK,OAAL,CAAa,IAAb,CAAkB,OAAlB,GAA4B,KAAK,GAAL,CAAS,KAAK,GAAL,CAAS,CAAT,EAAY,QAAQ,OAApB,CAAT,EAAuC,CAAvC,CAA5B;AACD;AACD,QAAI,YAAY,OAAhB,EAAyB;AACvB,WAAK,OAAL,CAAa,IAAb,CAAkB,MAAlB,GAA2B,QAAQ,MAAnC;AACD;AACD,QAAI,aAAa,OAAjB,EAA0B;AACxB,WAAK,OAAL,CAAa,IAAb,CAAkB,OAAlB,GAA4B,QAAQ,OAApC;AACD;;AAGD,WAAO,IAAP;AACD;;AAED,MAAI,MAAM,EAAN,CAAS,IAAT,CAAc,OAAd,CAAJ,EAA4B;AAC1B,SAAK,OAAL,CAAa,IAAb,CAAkB,OAAlB,GAA4B,OAA5B;;AAEA,QAAI,CAAC,OAAL,EAAc;AACZ,WAAK,WAAL,GAAmB,KAAK,WAAL,GAAmB,KAAK,MAAL,GAClC,KAAK,cAAL,GAAsB,KAAK,gBAAL,GAAwB,IADlD;AAED;;AAED,WAAO,IAAP;AACD;;AAED,SAAO,KAAK,OAAL,CAAa,IAApB;AACD,CAxCD;;AA0CA,aAAa,SAAb,CAAuB,SAAvB,GAAmC,UAAU,SAAV,EAAqB,KAArB,EAA4B,SAA5B,EAAuC,gBAAvC,EAAyD,WAAzD,EAAsE,IAAtE,EAA4E;AAC7G,MAAI,UAAU,KAAd;;AAEA;AACA;AACA,MAAI,EAAE,OAAO,QAAQ,KAAK,OAAL,CAAa,WAAb,CAAjB,CAAJ,EAAiD;AAC/C,WAAQ,KAAK,OAAL,CAAa,IAAb,CAAkB,OAAlB,GACJ,KAAK,OAAL,CAAa,IAAb,CAAkB,OAAlB,CAA0B,SAA1B,EAAqC,KAArC,EAA4C,OAA5C,EAAqD,IAArD,EAA2D,WAA3D,EAAwE,SAAxE,EAAmF,gBAAnF,CADI,GAEJ,KAFJ;AAGD;;AAED,MAAM,cAAc,KAAK,OAAL,CAAa,IAAb,CAAkB,OAAtC;;AAEA,MAAI,gBAAgB,SAApB,EAA+B;AAC7B,QAAM,SAAS,MAAM,WAAN,CAAkB,SAAlB,EAA6B,gBAA7B,EAA+C,MAA/C,CAAf;AACA,QAAM,OAAO,MAAM,SAAN,CAAgB,SAAhB,CAAb;;AAEA,SAAK,CAAL,IAAU,OAAO,CAAjB;AACA,SAAK,CAAL,IAAU,OAAO,CAAjB;;AAEA,QAAM,aAAc,KAAK,CAAL,GAAS,KAAK,IAAf,IAAyB,KAAK,CAAL,GAAS,KAAK,KAA1D;AACA,QAAM,WAAc,KAAK,CAAL,GAAS,KAAK,GAAf,IAAyB,KAAK,CAAL,GAAS,KAAK,MAA1D;;AAEA,cAAU,cAAc,QAAxB;AACD;;AAED,MAAM,WAAW,UAAU,OAAV,CAAkB,gBAAlB,CAAjB;;AAEA,MAAI,YAAY,gBAAgB,QAAhC,EAA0C;AACxC,QAAM,KAAK,SAAS,IAAT,GAAgB,SAAS,KAAT,GAAkB,CAA7C;AACA,QAAM,KAAK,SAAS,GAAT,GAAgB,SAAS,MAAT,GAAkB,CAA7C;;AAEA,cAAU,MAAM,KAAK,IAAX,IAAmB,MAAM,KAAK,KAA9B,IAAuC,MAAM,KAAK,GAAlD,IAAyD,MAAM,KAAK,MAA9E;AACD;;AAED,MAAI,YAAY,MAAM,EAAN,CAAS,MAAT,CAAgB,WAAhB,CAAhB,EAA8C;AAC5C,QAAM,cAAgB,KAAK,GAAL,CAAS,CAAT,EAAY,KAAK,GAAL,CAAS,KAAK,KAAd,EAAsB,SAAS,KAA/B,IAAyC,KAAK,GAAL,CAAS,KAAK,IAAd,EAAoB,SAAS,IAA7B,CAArD,IACE,KAAK,GAAL,CAAS,CAAT,EAAY,KAAK,GAAL,CAAS,KAAK,MAAd,EAAsB,SAAS,MAA/B,IAAyC,KAAK,GAAL,CAAS,KAAK,GAAd,EAAoB,SAAS,GAA7B,CAArD,CADxB;;AAGA,QAAM,eAAe,eAAe,SAAS,KAAT,GAAiB,SAAS,MAAzC,CAArB;;AAEA,cAAU,gBAAgB,WAA1B;AACD;;AAED,MAAI,KAAK,OAAL,CAAa,IAAb,CAAkB,OAAtB,EAA+B;AAC7B,cAAU,KAAK,OAAL,CAAa,IAAb,CAAkB,OAAlB,CAA0B,SAA1B,EAAqC,KAArC,EAA4C,OAA5C,EAAqD,IAArD,EAA2D,WAA3D,EAAwE,SAAxE,EAAmF,gBAAnF,CAAV;AACD;;AAED,SAAO,OAAP;AACD,CAjDD;;AAmDA,aAAa,OAAb,CAAqB,EAArB,CAAwB,OAAxB,EAAiC,iBAA4B;AAAA,MAAhB,YAAgB,SAAhB,YAAgB;;AAC3D,eAAa,QAAb,CAAsB,KAAtB;AACD,CAFD;;AAIA,aAAa,eAAb,CAA6B,IAA7B,CAAkC,aAAlC;;AAEA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,KAAvB,EAA8B,UAAU,WAAV,EAAuB;AACnD,cAAY,UAAZ,GAA8B,IAA9B,CADmD,CACf;AACpC,cAAY,WAAZ,GAA8B,IAA9B,CAFmD,CAEf;AACpC,cAAY,cAAZ,GAA8B,IAA9B,CAHmD,CAGf;AACpC,cAAY,eAAZ,GAA8B,IAA9B,CAJmD,CAIf;AACpC,cAAY,UAAZ,GAA8B,IAA9B,CALmD,CAKf;;AAEpC,cAAY,WAAZ,GAA0B;AACxB,eAAW,EADa,EACJ;AACpB,cAAW,EAFa,EAEJ;AACpB,WAAW,EAHa,CAGJ;AAHI,GAA1B;AAMD,CAbD;;AAeA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,MAAvB,EAA+B,iBAA2B;AAAA,MAAf,WAAe,SAAf,WAAe;;AACxD,cAAY,UAAZ,GAAyB,YAAY,WAAZ,GACvB,YAAY,cAAZ,GAA6B,YAAY,eAAZ,GAA8B,IAD7D;AAED,CAHD;;AAKA;;;;;;;;;;;AAWA,SAAS,WAAT,GAAuB,UAAU,QAAV,EAAoB;AACzC,MAAI,MAAM,EAAN,CAAS,IAAT,CAAc,QAAd,CAAJ,EAA6B;AAC3B;AACE;AACF;;AAEA,kBAAc,QAAd;;AAEA,WAAO,QAAP;AACD;AACD,SAAO,WAAP;AACD,CAXD;;AAaA,MAAM,KAAN,CAAY,aAAa,UAAzB,EAAqC,CACnC,WADmC,EAEnC,WAFmC,EAGnC,cAHmC,EAInC,gBAJmC,EAKnC,UALmC,EAMnC,MANmC,CAArC;AAQA,QAAQ,UAAR,CAAmB,IAAnB,GAA0B,UAA1B;;AAEA,eAAe,IAAf,GAAsB,KAAK,QAA3B;;AAEA,OAAO,OAAP,GAAiB,IAAjB;;;;;ACzdA,IAAM,UAAiB,QAAQ,QAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,UAAR,CAAvB;AACA,IAAM,gBAAiB,QAAQ,kBAAR,CAAvB;AACA,IAAM,eAAiB,QAAQ,iBAAR,CAAvB;AACA,IAAM,cAAiB,QAAQ,gBAAR,CAAvB;AACA,IAAM,iBAAiB,QAAQ,mBAAR,CAAvB;;AAEA,IAAM,UAAU;AACd,YAAU;AACR,aAAU,KADF;AAER,YAAU,IAFF;AAGR,cAAU;AAHF,GADI;;AAOd,WAAS,iBAAU,OAAV,EAAmB,KAAnB,EAA0B,YAA1B,EAAwC,OAAxC,EAAiD,WAAjD,EAA8D;AACrE,QAAI,YAAY,UAAZ,CAAuB,MAAvB,IAAiC,CAArC,EAAwC;AACtC,aAAO,EAAE,MAAM,SAAR,EAAP;AACD;;AAED,WAAO,IAAP;AACD,GAba;;AAed,aAAW,qBAAY;AACrB,WAAO,EAAP;AACD;AAjBa,CAAhB;;AAoBA,cAAc,OAAd,CAAsB,EAAtB,CAAyB,KAAzB,EAAgC,gBAAmC;AAAA,MAAvB,MAAuB,QAAvB,MAAuB;AAAA,MAAf,WAAe,QAAf,WAAe;;AACjE,MAAI,OAAO,IAAP,KAAgB,cAApB,EAAoC;AAAE;AAAS;AAC/C,SAAO,EAAP,GAAY,CAAZ;;AAEA,cAAY,OAAZ,CAAoB,aAApB,GAAoC,YAAY,OAAZ,CAAoB,YAApB,GAAmC,OAAO,QAA9E;AACA,cAAY,OAAZ,CAAoB,UAApB,GAAiC,YAAY,OAAZ,CAAoB,SAApB,GAAgC,OAAO,KAAxE;AACA,cAAY,OAAZ,CAAoB,KAApB,GAA4B,CAA5B;AACD,CAPD;;AASA,cAAc,OAAd,CAAsB,EAAtB,CAAyB,KAAzB,EAAgC,iBAAmC;AAAA,MAAvB,MAAuB,SAAvB,MAAuB;AAAA,MAAf,WAAe,SAAf,WAAe;;AACjE,MAAI,OAAO,IAAP,KAAgB,aAApB,EAAmC;AAAE;AAAS;;AAE9C,SAAO,EAAP,GAAY,OAAO,KAAP,GAAe,YAAY,OAAZ,CAAoB,KAA/C;;AAEA,cAAY,MAAZ,CAAmB,IAAnB,CAAwB,MAAxB;;AAEA,cAAY,OAAZ,CAAoB,SAApB,GAAgC,OAAO,KAAvC;AACA,cAAY,OAAZ,CAAoB,YAApB,GAAmC,OAAO,QAA1C;;AAEA,MAAI,OAAO,KAAP,KAAiB,QAAjB,IACG,OAAO,KAAP,KAAiB,IADpB,IAEG,OAAO,KAAP,KAAiB,SAFpB,IAGG,CAAC,MAAM,OAAO,KAAb,CAHR,EAG6B;;AAE3B,gBAAY,OAAZ,CAAoB,KAApB,GAA4B,OAAO,KAAnC;AACD;AACF,CAjBD;;AAmBA;;;;;;;;;;;;;;;;;;;;;;;AAuBA,aAAa,SAAb,CAAuB,UAAvB,GAAoC,UAAU,OAAV,EAAmB;AACrD,MAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,OAAhB,CAAJ,EAA8B;AAC5B,SAAK,OAAL,CAAa,OAAb,CAAqB,OAArB,GAA+B,QAAQ,OAAR,KAAoB,KAApB,GAA2B,KAA3B,GAAkC,IAAjE;AACA,SAAK,YAAL,CAAkB,SAAlB,EAA6B,OAA7B;AACA,SAAK,WAAL,CAAiB,SAAjB,EAA4B,OAA5B;;AAEA,WAAO,IAAP;AACD;;AAED,MAAI,MAAM,EAAN,CAAS,IAAT,CAAc,OAAd,CAAJ,EAA4B;AAC1B,SAAK,OAAL,CAAa,OAAb,CAAqB,OAArB,GAA+B,OAA/B;;AAEA,QAAI,CAAC,OAAL,EAAc;AACZ,WAAK,cAAL,GAAsB,KAAK,cAAL,GAAsB,KAAK,YAAL,GAAoB,IAAhE;AACD;;AAED,WAAO,IAAP;AACD;;AAED,SAAO,KAAK,OAAL,CAAa,OAApB;AACD,CApBD;;AAsBA,cAAc,OAAd,CAAsB,EAAtB,CAAyB,WAAzB,EAAsC,iBAAiF;AAAA,MAArE,WAAqE,SAArE,WAAqE;AAAA,MAAxD,MAAwD,SAAxD,MAAwD;AAAA,MAAhD,MAAgD,SAAhD,MAAgD;AAAA,MAAxC,KAAwC,SAAxC,KAAwC;AAAA,MAAjC,QAAiC,SAAjC,QAAiC;AAAA,MAAvB,MAAuB,SAAvB,MAAuB;AAAA,MAAf,WAAe,SAAf,WAAe;;AACrH,MAAI,WAAW,SAAf,EAA0B;AAAE;AAAS;;AAErC,MAAM,WAAW,YAAY,QAA7B;;AAEA,SAAO,OAAP,GAAiB,CAAC,SAAS,CAAT,CAAD,EAAc,SAAS,CAAT,CAAd,CAAjB;;AAEA,MAAI,QAAJ,EAAc;AACZ,WAAO,QAAP,GAAkB,MAAM,aAAN,CAAoB,QAApB,EAA8B,WAA9B,CAAlB;AACA,WAAO,GAAP,GAAkB,MAAM,SAAN,CAAgB,QAAhB,CAAlB;AACA,WAAO,KAAP,GAAkB,CAAlB;AACA,WAAO,EAAP,GAAkB,CAAlB;AACA,WAAO,KAAP,GAAkB,MAAM,UAAN,CAAiB,QAAjB,EAA2B,SAA3B,EAAsC,WAAtC,CAAlB;AACA,WAAO,EAAP,GAAkB,CAAlB;AACD,GAPD,MAQK,IAAI,UAAU,iBAAiB,aAA/B,EAA8C;AACjD,WAAO,QAAP,GAAkB,YAAY,SAAZ,CAAsB,QAAxC;AACA,WAAO,GAAP,GAAkB,YAAY,SAAZ,CAAsB,GAAxC;AACA,WAAO,KAAP,GAAkB,YAAY,SAAZ,CAAsB,KAAxC;AACA,WAAO,EAAP,GAAkB,OAAO,KAAP,GAAe,CAAjC;AACA,WAAO,KAAP,GAAkB,YAAY,SAAZ,CAAsB,KAAxC;AACA,WAAO,EAAP,GAAkB,OAAO,KAAP,GAAe,YAAY,OAAZ,CAAoB,UAArD;AACD,GAPI,MAQA;AACH,WAAO,QAAP,GAAkB,MAAM,aAAN,CAAoB,QAApB,EAA8B,WAA9B,CAAlB;AACA,WAAO,GAAP,GAAkB,MAAM,SAAN,CAAgB,QAAhB,CAAlB;AACA,WAAO,KAAP,GAAkB,OAAO,QAAP,GAAkB,YAAY,OAAZ,CAAoB,aAAxD;AACA,WAAO,KAAP,GAAkB,MAAM,UAAN,CAAiB,QAAjB,EAA2B,YAAY,OAAZ,CAAoB,SAA/C,EAA0D,WAA1D,CAAlB;;AAEA,WAAO,EAAP,GAAY,OAAO,KAAP,GAAe,YAAY,OAAZ,CAAoB,SAA/C;AACA,WAAO,EAAP,GAAY,OAAO,KAAP,GAAe,YAAY,OAAZ,CAAoB,SAA/C;AACD;AACF,CAhCD;;AAkCA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,KAAvB,EAA8B,UAAU,WAAV,EAAuB;AACnD,cAAY,OAAZ,GAAsB;AACpB,WAAO,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EADa;;AAGpB,mBAAe,CAHK,EAGA;AACpB,kBAAe,CAJK;AAKpB,cAAe,CALK;;AAOpB,WAAO,CAPa,EAOA;;AAEpB,gBAAY,CATQ,EASA;AACpB,eAAY,CAVQ,CAUA;AAVA,GAAtB;AAYD,CAbD;;AAeA,QAAQ,OAAR,GAAkB,OAAlB;AACA,QAAQ,KAAR,CAAc,IAAd,CAAmB,SAAnB;AACA,MAAM,KAAN,CAAY,aAAa,UAAzB,EAAqC,CACnC,cADmC,EAEnC,aAFmC,EAGnC,YAHmC,CAArC;AAKA,QAAQ,UAAR,CAAmB,OAAnB,GAA6B,YAA7B;;AAEA,eAAe,OAAf,GAAyB,QAAQ,QAAjC;;AAEA,OAAO,OAAP,GAAiB,OAAjB;;;;;AChKA,IAAM,UAAiB,QAAQ,QAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,UAAR,CAAvB;AACA,IAAM,UAAiB,QAAQ,kBAAR,CAAvB;AACA,IAAM,gBAAiB,QAAQ,kBAAR,CAAvB;AACA,IAAM,eAAiB,QAAQ,iBAAR,CAAvB;AACA,IAAM,cAAiB,QAAQ,gBAAR,CAAvB;AACA,IAAM,iBAAiB,QAAQ,mBAAR,CAAvB;;AAEA;AACA,IAAM,gBAAgB,QAAQ,aAAR,IAAyB,QAAQ,oBAAjC,GAAuD,EAAvD,GAA2D,EAAjF;;AAEA,IAAM,SAAS;AACb,YAAU;AACR,aAAc,KADN;AAER,kBAAc,IAFN;;AAIR,YAAY,IAJJ;AAKR,UAAY,IALJ;AAMR,cAAY,IANJ;AAOR,aAAY,IAPJ;AAQR,gBAAY,IARJ;;AAUR,YAAQ,KAVA;AAWR,yBAAqB,KAXb;AAYR,UAAM,IAZE;;AAcR;AACA,YAAQ,GAfA;;AAiBR;AACA;AACA;AACA;AACA,WAAO,IArBC;;AAuBR;AACA;AACA;AACA;AACA,YAAQ;AA3BA,GADG;;AA+Bb,WAAS,iBAAU,OAAV,EAAmB,KAAnB,EAA0B,YAA1B,EAAwC,OAAxC,EAAiD,WAAjD,EAA8D,IAA9D,EAAoE;AAC3E,QAAI,CAAC,IAAL,EAAW;AAAE,aAAO,IAAP;AAAc;;AAE3B,QAAM,OAAO,MAAM,MAAN,CAAa,EAAb,EAAiB,YAAY,SAAZ,CAAsB,IAAvC,CAAb;AACA,QAAM,UAAU,aAAa,OAA7B;;AAEA,QAAI,QAAQ,MAAR,CAAe,OAAnB,EAA4B;AAC1B,UAAM,gBAAgB,QAAQ,MAA9B;AACA,UAAM,cAAc,EAAE,MAAM,KAAR,EAAe,OAAO,KAAtB,EAA6B,KAAK,KAAlC,EAAyC,QAAQ,KAAjD,EAApB;;AAEA;AACA,UAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,cAAc,KAA9B,CAAJ,EAA0C;AACxC,aAAK,IAAM,IAAX,IAAmB,WAAnB,EAAgC;AAC9B,sBAAY,IAAZ,IAAoB,gBAAgB,IAAhB,EACgB,cAAc,KAAd,CAAoB,IAApB,CADhB,EAEgB,IAFhB,EAGgB,YAAY,YAH5B,EAIgB,OAJhB,EAKgB,IALhB,EAMgB,cAAc,MAAd,IAAwB,aANxC,CAApB;AAOD;;AAED,oBAAY,IAAZ,GAAmB,YAAY,IAAZ,IAAoB,CAAC,YAAY,KAApD;AACA,oBAAY,GAAZ,GAAmB,YAAY,GAAZ,IAAoB,CAAC,YAAY,MAApD;;AAEA,YAAI,YAAY,IAAZ,IAAoB,YAAY,KAAhC,IAAyC,YAAY,GAArD,IAA4D,YAAY,MAA5E,EAAoF;AAClF,iBAAO;AACL,kBAAM,QADD;AAEL,mBAAO;AAFF,WAAP;AAID;AACF,OApBD,MAqBK;AACH,YAAM,QAAS,QAAQ,MAAR,CAAe,IAAf,KAAwB,GAAxB,IAA+B,KAAK,CAAL,GAAU,KAAK,KAAL,GAAc,aAAtE;AACA,YAAM,SAAS,QAAQ,MAAR,CAAe,IAAf,KAAwB,GAAxB,IAA+B,KAAK,CAAL,GAAU,KAAK,MAAL,GAAc,aAAtE;;AAEA,YAAI,SAAS,MAAb,EAAqB;AACnB,iBAAO;AACL,kBAAM,QADD;AAEL,kBAAM,CAAC,QAAO,GAAP,GAAa,EAAd,KAAqB,SAAQ,GAAR,GAAc,EAAnC;AAFD,WAAP;AAID;AACF;AACF;;AAED,WAAO,IAAP;AACD,GA7EY;;AA+Eb,WAAU,QAAQ,YAAR,GAAuB;AAC/B,OAAI,UAD2B;AAE/B,OAAI,UAF2B;AAG/B,QAAI,WAH2B;;AAK/B,SAAa,UALkB;AAM/B,UAAa,UANkB;AAO/B,YAAa,UAPkB;AAQ/B,WAAa,UARkB;AAS/B,aAAa,WATkB;AAU/B,iBAAa,WAVkB;AAW/B,cAAa,WAXkB;AAY/B,gBAAa;AAZkB,GAAvB,GAaN;AACF,OAAI,WADF;AAEF,OAAI,WAFF;AAGF,QAAI,aAHF;;AAKF,SAAa,WALX;AAMF,UAAa,WANX;AAOF,YAAa,WAPX;AAQF,WAAa,WARX;AASF,aAAa,aATX;AAUF,iBAAa,aAVX;AAWF,cAAa,aAXX;AAYF,gBAAa;AAZX,GA5FS;;AA2Gb,aAAW,mBAAU,MAAV,EAAkB;AAC3B,QAAI,OAAO,IAAX,EAAiB;AACf,aAAO,OAAO,OAAP,CAAe,OAAO,IAAP,GAAc,OAAO,IAApC,CAAP;AACD,KAFD,MAGK,IAAI,OAAO,KAAX,EAAkB;AACrB,UAAI,YAAY,EAAhB;AACA,UAAM,YAAY,CAAC,KAAD,EAAQ,QAAR,EAAkB,MAAlB,EAA0B,OAA1B,CAAlB;;AAEA,WAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,CAApB,EAAuB,GAAvB,EAA4B;AAC1B,YAAI,OAAO,KAAP,CAAa,UAAU,CAAV,CAAb,CAAJ,EAAgC;AAC9B,uBAAa,UAAU,CAAV,CAAb;AACD;AACF;;AAED,aAAO,OAAO,OAAP,CAAe,SAAf,CAAP;AACD;AACF;AA3HY,CAAf;;AA8HA;AACA,cAAc,OAAd,CAAsB,EAAtB,CAAyB,KAAzB,EAAgC,gBAAmC;AAAA,MAAvB,MAAuB,QAAvB,MAAuB;AAAA,MAAf,WAAe,QAAf,WAAe;;AACjE,MAAI,OAAO,IAAP,KAAgB,aAAhB,IAAiC,CAAC,YAAY,QAAZ,CAAqB,KAA3D,EAAkE;AAChE;AACD;;AAED,MAAM,YAAY,YAAY,MAAZ,CAAmB,OAAnB,CAA2B,YAAY,OAAvC,CAAlB;AACA,MAAM,gBAAgB,YAAY,MAAZ,CAAmB,OAAnB,CAA2B,MAAjD;;AAEA;;;;;;AAMA,MAAI,cAAc,MAAd,IAAwB,cAAc,mBAA1C,EAA+D;AAC7D,QAAM,cAAc,MAAM,MAAN,CAAa,EAAb,EAAiB,YAAY,QAAZ,CAAqB,KAAtC,CAApB;;AAEA,gBAAY,GAAZ,GAAqB,YAAY,GAAZ,IAAuB,YAAY,IAAZ,IAAsB,CAAC,YAAY,MAA/E;AACA,gBAAY,IAAZ,GAAqB,YAAY,IAAZ,IAAuB,YAAY,GAAZ,IAAsB,CAAC,YAAY,KAA/E;AACA,gBAAY,MAAZ,GAAqB,YAAY,MAAZ,IAAuB,YAAY,KAAZ,IAAsB,CAAC,YAAY,GAA/E;AACA,gBAAY,KAAZ,GAAqB,YAAY,KAAZ,IAAuB,YAAY,MAAZ,IAAsB,CAAC,YAAY,IAA/E;;AAEA,gBAAY,QAAZ,CAAqB,YAArB,GAAoC,WAApC;AACD,GATD,MAUK;AACH,gBAAY,QAAZ,CAAqB,YAArB,GAAoC,IAApC;AACD;;AAED;AACA,MAAI,cAAc,mBAAlB,EAAuC;AACrC,gBAAY,sBAAZ,GAAqC,UAAU,KAAV,GAAkB,UAAU,MAAjE;AACD;;AAED,cAAY,WAAZ,GAA0B;AACxB,WAAY,SADY;AAExB,aAAY,MAAM,MAAN,CAAa,EAAb,EAAiB,SAAjB,CAFY;AAGxB,cAAY,MAAM,MAAN,CAAa,EAAb,EAAiB,SAAjB,CAHY;AAIxB,cAAY,MAAM,MAAN,CAAa,EAAb,EAAiB,SAAjB,CAJY;AAKxB,WAAY;AACV,YAAM,CADI,EACD,OAAQ,CADP,EACU,OAAQ,CADlB;AAEV,WAAM,CAFI,EAED,QAAQ,CAFP,EAEU,QAAQ;AAFlB;AALY,GAA1B;;AAWA,SAAO,IAAP,GAAc,YAAY,WAAZ,CAAwB,QAAtC;AACA,SAAO,SAAP,GAAmB,YAAY,WAAZ,CAAwB,KAA3C;AACD,CA9CD;;AAgDA;AACA,cAAc,OAAd,CAAsB,EAAtB,CAAyB,KAAzB,EAAgC,iBAA0C;AAAA,MAA9B,MAA8B,SAA9B,MAA8B;AAAA,MAAtB,KAAsB,SAAtB,KAAsB;AAAA,MAAf,WAAe,SAAf,WAAe;;AACxE,MAAI,UAAU,MAAV,IAAoB,CAAC,YAAY,QAAZ,CAAqB,KAA9C,EAAqD;AAAE;AAAS;;AAEhE,MAAM,gBAAgB,YAAY,MAAZ,CAAmB,OAAnB,CAA2B,MAAjD;AACA,MAAM,SAAS,cAAc,MAA7B;AACA,MAAM,aAAa,WAAW,YAAX,IAA2B,WAAW,QAAzD;;AAEA,MAAI,QAAQ,YAAY,QAAZ,CAAqB,KAAjC;;AAEA,MAAM,QAAa,YAAY,WAAZ,CAAwB,KAA3C;AACA,MAAM,UAAa,YAAY,WAAZ,CAAwB,OAA3C;AACA,MAAM,WAAa,YAAY,WAAZ,CAAwB,QAA3C;AACA,MAAM,QAAa,YAAY,WAAZ,CAAwB,KAA3C;AACA,MAAM,WAAa,MAAM,MAAN,CAAa,YAAY,WAAZ,CAAwB,QAArC,EAA+C,QAA/C,CAAnB;AACA,MAAM,gBAAgB,KAAtB;;AAEA,MAAI,KAAK,OAAO,EAAhB;AACA,MAAI,KAAK,OAAO,EAAhB;;AAEA,MAAI,cAAc,mBAAd,IAAqC,cAAc,MAAvD,EAA+D;AAC7D;AACA,QAAM,mBAAmB,cAAc,mBAAd,GACrB,YAAY,sBADS,GAErB,CAFJ;;AAIA,YAAQ,YAAY,QAAZ,CAAqB,YAA7B;;AAEA,QAAK,cAAc,IAAd,IAAsB,cAAc,MAArC,IACI,cAAc,KAAd,IAAuB,cAAc,GAD7C,EACmD;AACjD,WAAK,CAAC,EAAD,GAAM,gBAAX;AACD,KAHD,MAIK,IAAI,cAAc,IAAd,IAAsB,cAAc,KAAxC,EAAgD;AAAE,WAAK,KAAK,gBAAV;AAA6B,KAA/E,MACA,IAAI,cAAc,GAAd,IAAsB,cAAc,MAAxC,EAAgD;AAAE,WAAK,KAAK,gBAAV;AAA6B;AACrF;;AAED;AACA,MAAI,MAAM,GAAV,EAAkB;AAAE,YAAQ,GAAR,IAAkB,EAAlB;AAAuB;AAC3C,MAAI,MAAM,MAAV,EAAkB;AAAE,YAAQ,MAAR,IAAkB,EAAlB;AAAuB;AAC3C,MAAI,MAAM,IAAV,EAAkB;AAAE,YAAQ,IAAR,IAAkB,EAAlB;AAAuB;AAC3C,MAAI,MAAM,KAAV,EAAkB;AAAE,YAAQ,KAAR,IAAkB,EAAlB;AAAuB;;AAE3C,MAAI,UAAJ,EAAgB;AACd;AACA,UAAM,MAAN,CAAa,QAAb,EAAuB,OAAvB;;AAEA,QAAI,WAAW,YAAf,EAA6B;AAC3B;AACA,UAAI,aAAJ;;AAEA,UAAI,SAAS,GAAT,GAAe,SAAS,MAA5B,EAAoC;AAClC,eAAO,SAAS,GAAhB;;AAEA,iBAAS,GAAT,GAAe,SAAS,MAAxB;AACA,iBAAS,MAAT,GAAkB,IAAlB;AACD;AACD,UAAI,SAAS,IAAT,GAAgB,SAAS,KAA7B,EAAoC;AAClC,eAAO,SAAS,IAAhB;;AAEA,iBAAS,IAAT,GAAgB,SAAS,KAAzB;AACA,iBAAS,KAAT,GAAiB,IAAjB;AACD;AACF;AACF,GArBD,MAsBK;AACH;AACA,aAAS,GAAT,GAAkB,KAAK,GAAL,CAAS,QAAQ,GAAjB,EAAsB,MAAM,MAA5B,CAAlB;AACA,aAAS,MAAT,GAAkB,KAAK,GAAL,CAAS,QAAQ,MAAjB,EAAyB,MAAM,GAA/B,CAAlB;AACA,aAAS,IAAT,GAAkB,KAAK,GAAL,CAAS,QAAQ,IAAjB,EAAuB,MAAM,KAA7B,CAAlB;AACA,aAAS,KAAT,GAAkB,KAAK,GAAL,CAAS,QAAQ,KAAjB,EAAwB,MAAM,IAA9B,CAAlB;AACD;;AAED,WAAS,KAAT,GAAkB,SAAS,KAAT,GAAkB,SAAS,IAA7C;AACA,WAAS,MAAT,GAAkB,SAAS,MAAT,GAAkB,SAAS,GAA7C;;AAEA,OAAK,IAAM,IAAX,IAAmB,QAAnB,EAA6B;AAC3B,UAAM,IAAN,IAAc,SAAS,IAAT,IAAiB,SAAS,IAAT,CAA/B;AACD;;AAED,SAAO,KAAP,GAAe,YAAY,QAAZ,CAAqB,KAApC;AACA,SAAO,IAAP,GAAc,QAAd;AACA,SAAO,SAAP,GAAmB,KAAnB;AACD,CAjFD;;AAmFA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4CA,aAAa,SAAb,CAAuB,SAAvB,GAAmC,UAAU,OAAV,EAAmB;AACpD,MAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,OAAhB,CAAJ,EAA8B;AAC5B,SAAK,OAAL,CAAa,MAAb,CAAoB,OAApB,GAA8B,QAAQ,OAAR,KAAoB,KAApB,GAA2B,KAA3B,GAAkC,IAAhE;AACA,SAAK,YAAL,CAAkB,QAAlB,EAA4B,OAA5B;AACA,SAAK,WAAL,CAAiB,QAAjB,EAA2B,OAA3B;;AAEA,QAAI,eAAe,IAAf,CAAoB,QAAQ,IAA5B,CAAJ,EAAuC;AACrC,WAAK,OAAL,CAAa,MAAb,CAAoB,IAApB,GAA2B,QAAQ,IAAnC;AACD,KAFD,MAGK,IAAI,QAAQ,IAAR,KAAiB,IAArB,EAA2B;AAC9B,WAAK,OAAL,CAAa,MAAb,CAAoB,IAApB,GAA2B,eAAe,MAAf,CAAsB,IAAjD;AACD;;AAED,QAAI,MAAM,EAAN,CAAS,IAAT,CAAc,QAAQ,mBAAtB,CAAJ,EAAgD;AAC9C,WAAK,OAAL,CAAa,MAAb,CAAoB,mBAApB,GAA0C,QAAQ,mBAAlD;AACD,KAFD,MAGK,IAAI,MAAM,EAAN,CAAS,IAAT,CAAc,QAAQ,MAAtB,CAAJ,EAAmC;AACtC,WAAK,OAAL,CAAa,MAAb,CAAoB,MAApB,GAA6B,QAAQ,MAArC;AACD;;AAED,WAAO,IAAP;AACD;AACD,MAAI,MAAM,EAAN,CAAS,IAAT,CAAc,OAAd,CAAJ,EAA4B;AAC1B,SAAK,OAAL,CAAa,MAAb,CAAoB,OAApB,GAA8B,OAA9B;;AAEA,QAAI,CAAC,OAAL,EAAc;AACZ,WAAK,aAAL,GAAqB,KAAK,aAAL,GAAqB,KAAK,WAAL,GAAmB,IAA7D;AACD;;AAED,WAAO,IAAP;AACD;AACD,SAAO,KAAK,OAAL,CAAa,MAApB;AACD,CAhCD;;AAkCA,SAAS,eAAT,CAA0B,IAA1B,EAAgC,KAAhC,EAAuC,IAAvC,EAA6C,OAA7C,EAAsD,mBAAtD,EAA2E,IAA3E,EAAiF,MAAjF,EAAyF;AACvF;AACA,MAAI,CAAC,KAAL,EAAY;AAAE,WAAO,KAAP;AAAe;;AAE7B;AACA,MAAI,UAAU,IAAd,EAAoB;AAClB;AACA,QAAM,QAAS,MAAM,EAAN,CAAS,MAAT,CAAgB,KAAK,KAArB,IAA8B,KAAK,KAAnC,GAA4C,KAAK,KAAL,GAAc,KAAK,IAA9E;AACA,QAAM,SAAS,MAAM,EAAN,CAAS,MAAT,CAAgB,KAAK,MAArB,IAA8B,KAAK,MAAnC,GAA4C,KAAK,MAAL,GAAc,KAAK,GAA9E;;AAEA,QAAI,QAAQ,CAAZ,EAAe;AACb,UAAS,SAAS,MAAlB,EAA2B;AAAE,eAAO,OAAP;AAAiB,OAA9C,MACK,IAAI,SAAS,OAAb,EAAsB;AAAE,eAAO,MAAP;AAAiB;AAC/C;AACD,QAAI,SAAS,CAAb,EAAgB;AACd,UAAS,SAAS,KAAlB,EAA4B;AAAE,eAAO,QAAP;AAAkB,OAAhD,MACK,IAAI,SAAS,QAAb,EAAuB;AAAE,eAAO,KAAP;AAAkB;AACjD;;AAED,QAAI,SAAS,MAAb,EAAuB;AAAE,aAAO,KAAK,CAAL,GAAU,CAAC,SAAU,CAAV,GAAa,KAAK,IAAlB,GAAwB,KAAK,KAA9B,IAAwC,MAAzD;AAAmE;AAC5F,QAAI,SAAS,KAAb,EAAuB;AAAE,aAAO,KAAK,CAAL,GAAU,CAAC,UAAU,CAAV,GAAa,KAAK,GAAlB,GAAwB,KAAK,MAA9B,IAAwC,MAAzD;AAAmE;;AAE5F,QAAI,SAAS,OAAb,EAAuB;AAAE,aAAO,KAAK,CAAL,GAAU,CAAC,SAAU,CAAV,GAAa,KAAK,KAAlB,GAA0B,KAAK,IAAhC,IAAwC,MAAzD;AAAmE;AAC5F,QAAI,SAAS,QAAb,EAAuB;AAAE,aAAO,KAAK,CAAL,GAAU,CAAC,UAAU,CAAV,GAAa,KAAK,MAAlB,GAA0B,KAAK,GAAhC,IAAwC,MAAzD;AAAmE;AAC7F;;AAED;AACA,MAAI,CAAC,MAAM,EAAN,CAAS,OAAT,CAAiB,OAAjB,CAAL,EAAgC;AAAE,WAAO,KAAP;AAAe;;AAEjD,SAAO,MAAM,EAAN,CAAS,OAAT,CAAiB,KAAjB;AACP;AADO,IAEH,UAAU;AACZ;AAHK,IAIH,MAAM,WAAN,CAAkB,OAAlB,EAA2B,KAA3B,EAAkC,mBAAlC,CAJJ;AAKD;;AAED,YAAY,OAAZ,CAAoB,EAApB,CAAuB,KAAvB,EAA8B,UAAU,WAAV,EAAuB;AACnD,cAAY,UAAZ,GAAyB,IAAzB;AACD,CAFD;;AAIA,cAAc,OAAd,CAAsB,EAAtB,CAAyB,WAAzB,EAAsC,iBAA2C;AAAA,MAA/B,WAA+B,SAA/B,WAA+B;AAAA,MAAlB,MAAkB,SAAlB,MAAkB;AAAA,MAAV,MAAU,SAAV,MAAU;;AAC/E,MAAI,WAAW,QAAX,IAAuB,CAAC,YAAY,UAAxC,EAAoD;AAAE;AAAS;;AAE/D,MAAM,UAAU,YAAY,MAAZ,CAAmB,OAAnC;;AAEA,MAAI,QAAQ,MAAR,CAAe,MAAnB,EAA2B;AACzB,QAAI,YAAY,UAAZ,KAA2B,GAA/B,EAAoC;AAClC,aAAO,EAAP,GAAY,OAAO,EAAnB;AACD,KAFD,MAGK;AACH,aAAO,EAAP,GAAY,OAAO,EAAnB;AACD;AACD,WAAO,IAAP,GAAc,IAAd;AACD,GARD,MASK;AACH,WAAO,IAAP,GAAc,YAAY,UAA1B;;AAEA,QAAI,YAAY,UAAZ,KAA2B,GAA/B,EAAoC;AAClC,aAAO,EAAP,GAAY,CAAZ;AACD,KAFD,MAGK,IAAI,YAAY,UAAZ,KAA2B,GAA/B,EAAoC;AACvC,aAAO,EAAP,GAAY,CAAZ;AACD;AACF;AACF,CAxBD;;AA0BA,QAAQ,MAAR,GAAiB,MAAjB;AACA,QAAQ,KAAR,CAAc,IAAd,CAAmB,QAAnB;AACA,MAAM,KAAN,CAAY,aAAa,UAAzB,EAAqC,CACnC,aADmC,EAEnC,YAFmC,EAGnC,oBAHmC,EAInC,qBAJmC,EAKnC,WALmC,CAArC;AAOA,QAAQ,UAAR,CAAmB,MAAnB,GAA4B,WAA5B;;AAEA,eAAe,MAAf,GAAwB,OAAO,QAA/B;;AAEA,OAAO,OAAP,GAAiB,MAAjB;;;;;AC3aA,IAAM,MAAiB,QAAQ,aAAR,CAAvB;AACA,IAAM,YAAiB,QAAQ,gBAAR,EAA0B,SAAjD;AACA,IAAM,KAAiB,QAAQ,YAAR,CAAvB;AACA,IAAM,WAAiB,QAAQ,kBAAR,CAAvB;AACA,IAAM,cAAiB,QAAQ,eAAR,CAAvB;AACA,IAAM,iBAAiB,QAAQ,kBAAR,CAAvB;;AAEA,IAAM,aAAa;AACjB,YAAU;AACR,aAAW,KADH;AAER,eAAW,IAFH,EAEa;AACrB,YAAW,EAHH;AAIR,WAAW,GAJH,CAIa;AAJb,GADO;;AAQjB,eAAa,IARI;AASjB,KAAG,IATc,EASL;AACZ,KAAG,CAVc,EAUX,GAAG,CAVQ,EAUL;;AAEZ,eAAa,KAZI;AAajB,YAAU,CAbO;;AAejB,SAAO,eAAU,WAAV,EAAuB;AAC5B,eAAW,WAAX,GAAyB,IAAzB;AACA,QAAI,MAAJ,CAAW,WAAW,CAAtB;;AAEA,eAAW,WAAX,GAAyB,WAAzB;AACA,eAAW,QAAX,GAAsB,IAAI,IAAJ,GAAW,OAAX,EAAtB;AACA,eAAW,CAAX,GAAe,IAAI,OAAJ,CAAY,WAAW,MAAvB,CAAf;AACD,GAtBgB;;AAwBjB,QAAM,gBAAY;AAChB,eAAW,WAAX,GAAyB,KAAzB;AACA,QAAI,MAAJ,CAAW,WAAW,CAAtB;AACD,GA3BgB;;AA6BjB;AACA,UAAQ,kBAAY;AAClB,QAAM,UAAU,WAAW,WAAX,CAAuB,MAAvB,CAA8B,OAA9B,CAAsC,WAAW,WAAX,CAAuB,QAAvB,CAAgC,IAAtE,EAA4E,UAA5F;AACA,QAAM,YAAY,QAAQ,SAAR,IAAqB,UAAU,WAAW,WAAX,CAAuB,OAAjC,CAAvC;AACA,QAAM,MAAM,IAAI,IAAJ,GAAW,OAAX,EAAZ;AACA;AACA,QAAM,KAAK,CAAC,MAAM,WAAW,QAAlB,IAA8B,IAAzC;AACA;AACA,QAAM,IAAI,QAAQ,KAAR,GAAgB,EAA1B;;AAEA,QAAI,KAAK,CAAT,EAAY;AACV,UAAI,GAAG,MAAH,CAAU,SAAV,CAAJ,EAA0B;AACxB,kBAAU,QAAV,CAAmB,WAAW,CAAX,GAAe,CAAlC,EAAqC,WAAW,CAAX,GAAe,CAApD;AACD,OAFD,MAGK,IAAI,SAAJ,EAAe;AAClB,kBAAU,UAAV,IAAwB,WAAW,CAAX,GAAe,CAAvC;AACA,kBAAU,SAAV,IAAwB,WAAW,CAAX,GAAe,CAAvC;AACD;;AAED,iBAAW,QAAX,GAAsB,GAAtB;AACD;;AAED,QAAI,WAAW,WAAf,EAA4B;AAC1B,UAAI,MAAJ,CAAW,WAAW,CAAtB;AACA,iBAAW,CAAX,GAAe,IAAI,OAAJ,CAAY,WAAW,MAAvB,CAAf;AACD;AACF,GAvDgB;AAwDjB,SAAO,eAAU,YAAV,EAAwB,UAAxB,EAAoC;AACzC,QAAM,UAAU,aAAa,OAA7B;;AAEA,WAAO,QAAQ,UAAR,EAAoB,UAApB,IAAkC,QAAQ,UAAR,EAAoB,UAApB,CAA+B,OAAxE;AACD,GA5DgB;AA6DjB,qBAAmB,iCAAoC;AAAA,QAAxB,WAAwB,QAAxB,WAAwB;AAAA,QAAX,OAAW,QAAX,OAAW;;AACrD,QAAI,EAAE,YAAY,WAAZ,MACG,WAAW,KAAX,CAAiB,YAAY,MAA7B,EAAqC,YAAY,QAAZ,CAAqB,IAA1D,CADL,CAAJ,EAC2E;AACzE;AACD;;AAED,QAAI,YAAY,UAAhB,EAA4B;AAC1B,iBAAW,CAAX,GAAe,WAAW,CAAX,GAAe,CAA9B;AACA;AACD;;AAED,QAAI,YAAJ;AACA,QAAI,cAAJ;AACA,QAAI,eAAJ;AACA,QAAI,aAAJ;;AAEA,QAAM,UAAU,YAAY,MAAZ,CAAmB,OAAnB,CAA2B,YAAY,QAAZ,CAAqB,IAAhD,EAAsD,UAAtE;AACA,QAAM,YAAY,QAAQ,SAAR,IAAqB,UAAU,YAAY,OAAtB,CAAvC;;AAEA,QAAI,GAAG,MAAH,CAAU,SAAV,CAAJ,EAA0B;AACxB,aAAS,QAAQ,OAAR,GAAkB,WAAW,MAAtC;AACA,YAAS,QAAQ,OAAR,GAAkB,WAAW,MAAtC;AACA,cAAS,QAAQ,OAAR,GAAkB,UAAU,UAAV,GAAwB,WAAW,MAA9D;AACA,eAAS,QAAQ,OAAR,GAAkB,UAAU,WAAV,GAAwB,WAAW,MAA9D;AACD,KALD,MAMK;AACH,UAAM,OAAO,SAAS,oBAAT,CAA8B,SAA9B,CAAb;;AAEA,aAAS,QAAQ,OAAR,GAAkB,KAAK,IAAL,GAAc,WAAW,MAApD;AACA,YAAS,QAAQ,OAAR,GAAkB,KAAK,GAAL,GAAc,WAAW,MAApD;AACA,cAAS,QAAQ,OAAR,GAAkB,KAAK,KAAL,GAAc,WAAW,MAApD;AACA,eAAS,QAAQ,OAAR,GAAkB,KAAK,MAAL,GAAc,WAAW,MAApD;AACD;;AAED,eAAW,CAAX,GAAgB,QAAQ,CAAR,GAAW,OAAM,CAAC,CAAP,GAAU,CAArC;AACA,eAAW,CAAX,GAAgB,SAAQ,CAAR,GAAY,MAAK,CAAC,CAAN,GAAS,CAArC;;AAEA,QAAI,CAAC,WAAW,WAAhB,EAA6B;AAC3B;AACA,iBAAW,MAAX,GAAoB,QAAQ,MAA5B;AACA,iBAAW,KAAX,GAAoB,QAAQ,KAA5B;;AAEA,iBAAW,KAAX,CAAiB,WAAjB;AACD;AACF;AAzGgB,CAAnB;;AA4GA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,aAAvB,EAAsC,YAAY;AAChD,aAAW,IAAX;AACD,CAFD;;AAIA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,aAAvB,EAAsC,WAAW,iBAAjD;;AAEA,eAAe,SAAf,CAAyB,UAAzB,GAAsC,WAAW,QAAjD;;AAEA,OAAO,OAAP,GAAiB,UAAjB;;;;;AC3HA,IAAM,eAAe,QAAQ,iBAAR,CAArB;AACA,IAAM,UAAe,QAAQ,iBAAR,CAArB;AACA,IAAM,KAAe,QAAQ,aAAR,CAArB;AACA,IAAM,WAAe,QAAQ,mBAAR,CAArB;;AAEA,aAAa,SAAb,CAAuB,SAAvB,GAAmC,UAAU,OAAV,EAAmB,KAAnB,EAA0B,WAA1B,EAAuC,OAAvC,EAAgD;AACjF,MAAM,SAAS,KAAK,oBAAL,CAA0B,OAA1B,EAAmC,KAAnC,EAA0C,WAA1C,EAAuD,OAAvD,CAAf;;AAEA,MAAI,KAAK,OAAL,CAAa,aAAjB,EAAgC;AAC9B,WAAO,KAAK,OAAL,CAAa,aAAb,CAA2B,OAA3B,EAAoC,KAApC,EAA2C,MAA3C,EAAmD,IAAnD,EAAyD,OAAzD,EAAkE,WAAlE,CAAP;AACD;;AAED,SAAO,MAAP;AACD,CARD;;AAUA;;;;;;;;;;;;;;;AAeA,aAAa,SAAb,CAAuB,UAAvB,GAAoC,UAAU,QAAV,EAAoB;AACtD,SAAO,KAAK,iBAAL,CAAuB,YAAvB,EAAqC,QAArC,CAAP;AACD,CAFD;;AAIA;;;;;;;;;;;;;;;AAeA,aAAa,SAAb,CAAuB,SAAvB,GAAmC,UAAU,QAAV,EAAoB;AACrD,SAAO,KAAK,iBAAL,CAAuB,WAAvB,EAAoC,QAApC,CAAP;AACD,CAFD;;AAIA,aAAa,SAAb,CAAuB,UAAvB,GAAoC,UAAU,UAAV,EAAsB,mBAAtB,EAA2C,OAA3C,EAAoD;AACtF,MAAI,CAAC,UAAD,IAAe,CAAC,GAAG,OAAH,CAAW,OAAX,CAApB,EAAyC;AAAE,WAAO,KAAP;AAAe;;AAE1D,MAAI,GAAG,MAAH,CAAU,UAAV,CAAJ,EAA2B;AACzB,WAAO,SAAS,WAAT,CAAqB,OAArB,EAA8B,UAA9B,EAA0C,mBAA1C,CAAP;AACD,GAFD,MAGK,IAAI,GAAG,OAAH,CAAW,UAAX,CAAJ,EAA4B;AAC/B,WAAO,SAAS,YAAT,CAAsB,UAAtB,EAAkC,OAAlC,CAAP;AACD;;AAED,SAAO,KAAP;AACD,CAXD;;AAaA,aAAa,SAAb,CAAuB,SAAvB,GAAmC,UAAU,SAAV,EAAqB,mBAArB,EAA0C,OAA1C,EAAmD;AACpF,MAAI,CAAC,SAAL,EAAgB;AAAE,WAAO,IAAP;AAAc;;AAEhC,MAAI,CAAC,GAAG,OAAH,CAAW,OAAX,CAAL,EAA0B;AAAE,WAAO,KAAP;AAAe;;AAE3C,MAAI,GAAG,MAAH,CAAU,SAAV,CAAJ,EAA0B;AACxB,WAAO,SAAS,WAAT,CAAqB,OAArB,EAA8B,SAA9B,EAAyC,mBAAzC,CAAP;AACD,GAFD,MAGK,IAAI,GAAG,OAAH,CAAW,SAAX,CAAJ,EAA2B;AAC9B,WAAO,SAAS,YAAT,CAAsB,SAAtB,EAAiC,OAAjC,CAAP;AACD;;AAED,SAAO,KAAP;AACD,CAbD;;AAeA,aAAa,SAAb,CAAuB,eAAvB,GAAyC,UAAU,OAAV,EAAmB,mBAAnB,EAAwC,WAAxC,EAAqD;AAC5F,SAAQ,CAAC,KAAK,UAAL,CAAgB,QAAQ,UAAxB,EAAoC,mBAApC,EAAyD,WAAzD,CAAD,IACH,KAAK,SAAL,CAAe,QAAQ,SAAvB,EAAkC,mBAAlC,EAAuD,WAAvD,CADL;AAED,CAHD;;AAKA;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4BA,aAAa,SAAb,CAAuB,aAAvB,GAAuC,UAAU,OAAV,EAAmB;AACxD,MAAI,GAAG,QAAH,CAAY,OAAZ,CAAJ,EAA0B;AACxB,SAAK,OAAL,CAAa,aAAb,GAA6B,OAA7B;;AAEA,WAAO,IAAP;AACD;;AAED,MAAI,YAAY,IAAhB,EAAsB;AACpB,WAAO,KAAK,OAAL,CAAa,aAApB;;AAEA,WAAO,IAAP;AACD;;AAED,SAAO,KAAK,OAAL,CAAa,aAApB;AACD,CAdD;;AAgBA;;;;;;;;;;AAUA,aAAa,SAAb,CAAuB,WAAvB,GAAqC,UAAU,QAAV,EAAoB;AACvD,MAAI,GAAG,IAAH,CAAQ,QAAR,CAAJ,EAAuB;AACrB,SAAK,OAAL,CAAa,WAAb,GAA2B,QAA3B;;AAEA,WAAO,IAAP;AACD;;AAED,MAAI,aAAa,IAAjB,EAAuB;AACrB,WAAO,KAAK,OAAL,CAAa,WAApB;;AAEA,WAAO,IAAP;AACD;;AAED,SAAO,KAAK,OAAL,CAAa,WAApB;AACD,CAdD;;AAgBA,aAAa,SAAb,CAAuB,oBAAvB,GAA8C,UAAU,OAAV,EAAmB,KAAnB,EAA0B,WAA1B,EAAuC,OAAvC,EAAgD;AAC5F,MAAM,OAAO,KAAK,OAAL,CAAa,OAAb,CAAb;AACA,MAAI,SAAS,IAAb;;AAEA,uBAAyB,QAAQ,KAAjC,kHAAwC;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,QAA7B,UAA6B;;AACtC;AACA,QAAI,YAAY,aAAZ,IACG,YAAY,KADf,IAEG,CAAC,MAAM,OAAN,GAAgB,KAAK,OAAL,CAAa,UAAb,EAAyB,YAA1C,MAA4D,CAFnE,EAEsE;AACpE;AACD;;AAED,aAAS,QAAQ,UAAR,EAAoB,OAApB,CAA4B,OAA5B,EAAqC,KAArC,EAA4C,IAA5C,EAAkD,OAAlD,EAA2D,WAA3D,EAAwE,IAAxE,CAAT;;AAEA,QAAI,MAAJ,EAAY;AACV,aAAO,MAAP;AACD;AACF;AACF,CAlBD;;;;;AC5JA,IAAM,WAAiB,QAAQ,aAAR,CAAvB;AACA,IAAM,eAAiB,QAAQ,iBAAR,CAAvB;AACA,IAAM,cAAiB,QAAQ,gBAAR,CAAvB;AACA,IAAM,UAAiB,QAAQ,iBAAR,CAAvB;AACA,IAAM,iBAAiB,QAAQ,mBAAR,CAAvB;AACA,IAAM,UAAiB,QAAQ,kBAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,UAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,UAAR,CAAvB;AACA,IAAM,UAAiB,QAAQ,kBAAR,EAA4B,GAA5B,EAAvB;;AAEA,QAAQ,uBAAR;;AAEA,IAAM,YAAY;AAChB,kBADgB;AAEhB,gDAFgB;AAGhB;AACA,mBAAiB,QAJD;AAKhB,YAAU;AACR,eAAW;AACT,mBAAa,KADJ;AAET,WAAK,QAFI;AAGT,qBAAe,CAHN;AAIT,iBAAY,IAJH;AAKT,kBAAY;AALH;AADH,GALM;AAchB,qBAAmB,2BAAU,MAAV,EAAkB;AACnC,UAAM,MAAN,CAAa,OAAO,QAApB,EAA8B,UAAU,QAAV,CAAmB,SAAjD;AACD;AAhBe,CAAlB;;AAmBA;AACA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,MAAvB,EAA+B,gBAAwD;AAAA,MAA5C,WAA4C,QAA5C,WAA4C;AAAA,MAA/B,OAA+B,QAA/B,OAA+B;AAAA,MAAtB,KAAsB,QAAtB,KAAsB;AAAA,MAAf,WAAe,QAAf,WAAe;;AACrF,MAAI,YAAY,WAAZ,EAAJ,EAA+B;AAAE;AAAS;;AAE1C,MAAM,aAAa,cAAc,WAAd,EAA2B,OAA3B,EAAoC,KAApC,EAA2C,WAA3C,CAAnB;AACA,UAAQ,WAAR,EAAqB,UAArB;AACD,CALD;;AAOA;AACA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,MAAvB,EAA+B,iBAAwD;AAAA,MAA5C,WAA4C,SAA5C,WAA4C;AAAA,MAA/B,OAA+B,SAA/B,OAA+B;AAAA,MAAtB,KAAsB,SAAtB,KAAsB;AAAA,MAAf,WAAe,SAAf,WAAe;;AACrF,MAAI,CAAC,YAAY,KAAb,IACG,YAAY,aADf,IAEG,YAAY,WAAZ,EAFP,EAEkC;AAAE;AAAS;;AAE7C,MAAM,aAAa,cAAc,WAAd,EAA2B,OAA3B,EAAoC,KAApC,EAA2C,WAA3C,CAAnB;AACA,UAAQ,WAAR,EAAqB,UAArB;AACD,CAPD;;AASA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,MAAvB,EAA+B,UAAU,GAAV,EAAe;AAAA,MACpC,WADoC,GACb,GADa,CACpC,WADoC;AAAA,MACvB,KADuB,GACb,GADa,CACvB,KADuB;;;AAG5C,MAAI,CAAC,YAAY,aAAb,IACG,YAAY,WAAZ,EADH,IAEG,CAAC,YAAY,eAFhB,IAGG,CAAC,YAAY,QAAZ,CAAqB,IAH7B,EAGmC;AACjC;AACD;;AAED,UAAQ,IAAR,CAAa,cAAb,EAA6B,GAA7B;;AAEA,MAAM,SAAS,YAAY,MAA3B;;AAEA,MAAI,YAAY,QAAZ,CAAqB,IAArB,IAA6B,MAAjC,EAAyC;AACvC;AACA,QAAI,OAAO,OAAP,CAAe,YAAY,QAAZ,CAAqB,IAApC,EAA0C,WAA1C,IACG,CAAC,uBAAuB,MAAvB,EAA+B,YAAY,OAA3C,EAAoD,YAAY,QAAhE,CADR,EACmF;AACjF,kBAAY,IAAZ,CAAiB,KAAjB;AACD,KAHD,MAIK;AACH,kBAAY,KAAZ,CAAkB,YAAY,QAA9B,EAAwC,MAAxC,EAAgD,YAAY,OAA5D;AACD;AACF;AACF,CAxBD;;AA0BA;AACA;AACA,SAAS,cAAT,CAAyB,MAAzB,EAAiC,YAAjC,EAA+C,OAA/C,EAAwD,WAAxD,EAAqE;AACnE,MAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,MAAhB,KACG,aAAa,eAAb,CAA6B,aAAa,OAAb,CAAqB,OAAO,IAA5B,CAA7B,EAAgE,OAAhE,EAAyE,WAAzE,CADH,IAEG,aAAa,OAAb,CAAqB,OAAO,IAA5B,EAAkC,OAFrC,IAGG,uBAAuB,YAAvB,EAAqC,OAArC,EAA8C,MAA9C,CAHP,EAG8D;AAC5D,WAAO,MAAP;AACD;;AAED,SAAO,IAAP;AACD;;AAED,SAAS,gBAAT,CAA2B,WAA3B,EAAwC,OAAxC,EAAiD,KAAjD,EAAwD,OAAxD,EAAiE,aAAjE,EAAgF,WAAhF,EAA6F;AAC3F,OAAK,IAAI,IAAI,CAAR,EAAW,MAAM,QAAQ,MAA9B,EAAsC,IAAI,GAA1C,EAA+C,GAA/C,EAAoD;AAClD,QAAM,QAAQ,QAAQ,CAAR,CAAd;AACA,QAAM,eAAe,cAAc,CAAd,CAArB;AACA,QAAM,SAAS,eAAe,MAAM,SAAN,CAAgB,OAAhB,EAAyB,KAAzB,EAAgC,WAAhC,EAA6C,YAA7C,CAAf,EACe,KADf,EAEe,YAFf,EAGe,WAHf,CAAf;;AAKA,QAAI,MAAJ,EAAY;AACV,aAAO;AACL,sBADK;AAEL,gBAAQ,KAFH;AAGL,iBAAS;AAHJ,OAAP;AAKD;AACF;;AAED,SAAO,EAAP;AACD;;AAED,SAAS,aAAT,CAAwB,WAAxB,EAAqC,OAArC,EAA8C,KAA9C,EAAqD,WAArD,EAAkE;AAChE,MAAI,UAAU,EAAd;AACA,MAAI,gBAAgB,EAApB;;AAEA,MAAI,UAAU,WAAd;AACA,MAAI,SAAS,IAAb;;AAEA,WAAS,WAAT,CAAsB,YAAtB,EAAoC,QAApC,EAA8C,OAA9C,EAAuD;AACrD,QAAM,WAAY,QAAQ,0BAAR,GACd,QAAQ,gBAAR,CAAyB,QAAzB,CADc,GAEd,SAFJ;;AAIA,QAAI,MAAM,eAAN,CAAsB,OAAtB,EAA+B,QAA/B,EAAyC,QAAzC,CAAJ,EAAwD;;AAEtD,cAAQ,IAAR,CAAa,YAAb;AACA,oBAAc,IAAd,CAAmB,OAAnB;AACD;AACF;;AAED,SAAO,MAAM,EAAN,CAAS,OAAT,CAAiB,OAAjB,CAAP,EAAkC;AAChC,cAAU,EAAV;AACA,oBAAgB,EAAhB;;AAEA,QAAM,sBAAsB,MAAM,aAAN,CAAoB,GAApB,CAAwB,OAAxB,CAA5B;;AAEA,QAAI,wBACI,SAAS,eAAe,oBAAoB,SAApB,CAA8B,OAA9B,EAAuC,KAAvC,EAA8C,WAA9C,EAA2D,OAA3D,EAAoE,WAApE,CAAf,EACe,mBADf,EAEe,OAFf,EAGe,WAHf,CADb,KAKG,CAAC,oBAAoB,OAApB,CAA4B,OAAO,IAAnC,EAAyC,WALjD,EAK8D;AAC5D,aAAO;AACL,wBADK;AAEL,sBAFK;AAGL,gBAAQ;AAHH,OAAP;AAKD,KAXD,MAYK;AACH,YAAM,aAAN,CAAoB,eAApB,CAAoC,WAApC,EAAiD,OAAjD;;AAEA,UAAM,aAAa,iBAAiB,WAAjB,EAA8B,OAA9B,EAAuC,KAAvC,EAA8C,OAA9C,EAAuD,aAAvD,EAAsE,WAAtE,CAAnB;;AAEA,UAAI,WAAW,MAAX,IACG,CAAC,WAAW,MAAX,CAAkB,OAAlB,CAA0B,WAAW,MAAX,CAAkB,IAA5C,EAAkD,WAD1D,EACuE;AACrE,eAAO,UAAP;AACD;AACF;;AAED,cAAU,MAAM,UAAN,CAAiB,OAAjB,CAAV;AACD;;AAED,SAAO,EAAP;AACD;;AAED,SAAS,OAAT,CAAkB,WAAlB,SAA4D;AAAA,MAA3B,MAA2B,SAA3B,MAA2B;AAAA,MAAnB,MAAmB,SAAnB,MAAmB;AAAA,MAAX,OAAW,SAAX,OAAW;;AAC1D,WAAS,UAAU,EAAnB;;AAEA,MAAI,YAAY,MAAZ,IAAsB,YAAY,MAAZ,CAAmB,OAAnB,CAA2B,WAArD,EAAkE;AAChE,gBAAY,MAAZ,CAAmB,IAAnB,CAAwB,eAAxB,CAAwC,KAAxC,CAA8C,MAA9C,GAAuD,EAAvD;AACD;;AAED,cAAY,MAAZ,GAAqB,MAArB;AACA,cAAY,OAAZ,GAAsB,OAAtB;AACA,QAAM,UAAN,CAAiB,YAAY,QAA7B,EAAuC,MAAvC;;AAEA,MAAI,UAAU,OAAO,OAAP,CAAe,WAA7B,EAA0C;AACxC,QAAM,SAAS,SAAQ,QAAQ,OAAO,IAAf,EAAqB,SAArB,CAA+B,MAA/B,CAAR,GAAiD,EAAhE;AACA,gBAAY,MAAZ,CAAmB,IAAnB,CAAwB,eAAxB,CAAwC,KAAxC,CAA8C,MAA9C,GAAuD,MAAvD;AACD;;AAED,UAAQ,IAAR,CAAa,UAAb,EAAyB,EAAE,aAAa,WAAf,EAAzB;AACD;;AAED,YAAY,OAAZ,CAAoB,EAApB,CAAuB,MAAvB,EAA+B,iBAA2B;AAAA,MAAf,WAAe,SAAf,WAAe;;AACxD,MAAM,SAAS,YAAY,MAA3B;;AAEA,MAAI,UAAU,OAAO,OAAP,CAAe,WAA7B,EAA0C;AACxC,WAAO,IAAP,CAAY,eAAZ,CAA4B,KAA5B,CAAkC,MAAlC,GAA2C,EAA3C;AACD;AACF,CAND;;AAQA,aAAa,SAAb,CAAuB,SAAvB,GAAmC,UAAU,OAAV,EAAmB,KAAnB,EAA0B,WAA1B,EAAuC,OAAvC,EAAgD;AACjF,MAAM,SAAS,KAAK,oBAAL,CAA0B,OAA1B,EAAmC,KAAnC,EAA0C,WAA1C,EAAuD,OAAvD,CAAf;;AAEA,MAAI,KAAK,OAAL,CAAa,aAAjB,EAAgC;AAC9B,WAAO,KAAK,OAAL,CAAa,aAAb,CAA2B,OAA3B,EAAoC,KAApC,EAA2C,MAA3C,EAAmD,IAAnD,EAAyD,OAAzD,EAAkE,WAAlE,CAAP;AACD;;AAED,SAAO,MAAP;AACD,CARD;;AAUA;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4BA,aAAa,SAAb,CAAuB,aAAvB,GAAuC,UAAU,OAAV,EAAmB;AACxD,MAAI,MAAM,EAAN,CAAS,QAAT,CAAkB,OAAlB,CAAJ,EAAgC;AAC9B,SAAK,OAAL,CAAa,aAAb,GAA6B,OAA7B;;AAEA,WAAO,IAAP;AACD;;AAED,MAAI,YAAY,IAAhB,EAAsB;AACpB,WAAO,KAAK,OAAL,CAAa,aAApB;;AAEA,WAAO,IAAP;AACD;;AAED,SAAO,KAAK,OAAL,CAAa,aAApB;AACD,CAdD;;AAgBA;;;;;;;;;;AAUA,aAAa,SAAb,CAAuB,WAAvB,GAAqC,UAAU,QAAV,EAAoB;AACvD,MAAI,MAAM,EAAN,CAAS,IAAT,CAAc,QAAd,CAAJ,EAA6B;AAC3B,SAAK,OAAL,CAAa,WAAb,GAA2B,QAA3B;;AAEA,WAAO,IAAP;AACD;;AAED,MAAI,aAAa,IAAjB,EAAuB;AACrB,WAAO,KAAK,OAAL,CAAa,WAApB;;AAEA,WAAO,IAAP;AACD;;AAED,SAAO,KAAK,OAAL,CAAa,WAApB;AACD,CAdD;;AAgBA,aAAa,SAAb,CAAuB,oBAAvB,GAA8C,UAAU,OAAV,EAAmB,KAAnB,EAA0B,WAA1B,EAAuC,OAAvC,EAAgD;AAC5F,MAAM,OAAO,KAAK,OAAL,CAAa,OAAb,CAAb;AACA,MAAM,UAAU,MAAM,OAAN,IAAkB;AAChC,OAAG,CAD6B;AAEhC,OAAG,CAF6B;AAGhC,OAAG,CAH6B;AAIhC,OAAG;AAJ6B,GAAD,CAK9B,MAAM,MALwB,CAAjC;AAMA,MAAI,SAAS,IAAb;;AAEA,uBAAyB,QAAQ,KAAjC,kHAAwC;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,QAA7B,UAA6B;;AACtC;AACA,QAAI,YAAY,aAAZ,IACG,YAAY,KADf,IAEG,CAAC,UAAU,KAAK,OAAL,CAAa,UAAb,EAAyB,YAApC,MAAsD,CAF7D,EAEgE;AAC9D;AACD;;AAED,aAAS,QAAQ,UAAR,EAAoB,OAApB,CAA4B,OAA5B,EAAqC,KAArC,EAA4C,IAA5C,EAAkD,OAAlD,EAA2D,WAA3D,EAAwE,IAAxE,CAAT;;AAEA,QAAI,MAAJ,EAAY;AACV,aAAO,MAAP;AACD;AACF;AACF,CAxBD;;AA0BA,SAAS,sBAAT,CAAiC,YAAjC,EAA+C,OAA/C,EAAwD,MAAxD,EAAgE;AAC9D,MAAM,UAAU,aAAa,OAA7B;AACA,MAAM,aAAa,QAAQ,OAAO,IAAf,EAAqB,GAAxC;AACA,MAAM,gBAAgB,QAAQ,OAAO,IAAf,EAAqB,aAA3C;AACA,MAAI,qBAAqB,CAAzB;AACA,MAAI,cAAc,CAAlB;AACA,MAAI,qBAAqB,CAAzB;;AAEA;AACA,MAAI,EAAE,cAAc,aAAd,IAA+B,UAAU,eAA3C,CAAJ,EAAiE;AAAE;AAAS;;AAE5E,OAAK,IAAI,IAAI,CAAR,EAAW,MAAM,MAAM,YAAN,CAAmB,MAAzC,EAAiD,IAAI,GAArD,EAA0D,GAA1D,EAA+D;AAC7D,QAAM,cAAc,MAAM,YAAN,CAAmB,CAAnB,CAApB;AACA,QAAM,cAAc,YAAY,QAAZ,CAAqB,IAAzC;;AAEA,QAAI,CAAC,YAAY,WAAZ,EAAL,EAAgC;AAAE;AAAW;;AAE7C;;AAEA,QAAI,sBAAsB,UAAU,eAApC,EAAqD;AACnD,aAAO,KAAP;AACD;;AAED,QAAI,YAAY,MAAZ,KAAuB,YAA3B,EAAyC;AAAE;AAAW;;AAEtD,mBAAgB,gBAAgB,OAAO,IAAxB,GAA8B,CAA7C;;AAEA,QAAI,eAAe,UAAnB,EAA+B;AAC7B,aAAO,KAAP;AACD;;AAED,QAAI,YAAY,OAAZ,KAAwB,OAA5B,EAAqC;AACnC;;AAEA,UAAI,gBAAgB,OAAO,IAAvB,IAA+B,sBAAsB,aAAzD,EAAwE;AACtE,eAAO,KAAP;AACD;AACF;AACF;;AAED,SAAO,UAAU,eAAV,GAA4B,CAAnC;AACD;;AAED;;;;;;;;;;;;AAYA,SAAS,eAAT,GAA2B,UAAU,QAAV,EAAoB;AAC7C,MAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,QAAhB,CAAJ,EAA+B;AAC7B,cAAU,eAAV,GAA4B,QAA5B;;AAEA,WAAO,IAAP;AACD;;AAED,SAAO,UAAU,eAAjB;AACD,CARD;;AAUA,aAAa,eAAb,CAA6B,IAA7B,CAAkC,aAAlC;AACA,aAAa,eAAb,CAA6B,IAA7B,CAAkC,eAAlC;AACA,aAAa,eAAb,CAA6B,IAA7B,CAAkC,YAAlC;AACA,aAAa,eAAb,CAA6B,IAA7B,CAAkC,WAAlC;;AAEA,eAAe,IAAf,CAAoB,aAApB,GAAoC,IAApC;AACA,eAAe,IAAf,CAAoB,WAApB,GAAkC,IAAlC;;AAEA,MAAM,MAAN,CAAa,eAAe,SAA5B,EAAuC,UAAU,QAAV,CAAmB,SAA1D;;AAEA,OAAO,OAAP,GAAiB,SAAjB;;;;;ACnXA,IAAM,YAAc,QAAQ,QAAR,CAApB;AACA,IAAM,cAAc,QAAQ,gBAAR,CAApB;;AAEA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,KAAvB,EAA8B,UAAU,WAAV,EAAuB;AACnD,cAAY,UAAZ,GAAyB,IAAzB;AACD,CAFD;;AAIA,UAAU,OAAV,CAAkB,EAAlB,CAAqB,UAArB,EAAiC,gBAA2B;AAAA,MAAf,WAAe,QAAf,WAAe;;AAC1D,MAAM,aAAa,YAAY,QAAZ,CAAqB,IAAxC;;AAEA,MAAI,CAAC,UAAL,EAAiB;AAAE;AAAS;;AAE5B,MAAM,QAAQ,YAAY,MAAZ,CAAmB,OAAnB,CAA2B,UAA3B,EAAuC,KAArD;;AAEA,MAAI,QAAQ,CAAZ,EAAe;AACb,gBAAY,UAAZ,GAAyB,WAAW,YAAM;AACxC,kBAAY,KAAZ,CAAkB,YAAY,QAA9B,EAAwC,YAAY,MAApD,EAA4D,YAAY,OAAxE;AACD,KAFwB,EAEtB,KAFsB,CAAzB;AAGD;AACF,CAZD;;AAcA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,MAAvB,EAA+B,iBAAsC;AAAA,MAA1B,WAA0B,SAA1B,WAA0B;AAAA,MAAb,SAAa,SAAb,SAAa;;AACnE,MAAI,YAAY,eAAZ,IAA+B,CAAC,SAApC,EAA+C;AAC7C,iBAAa,YAAY,UAAzB;AACD;AACF,CAJD;;AAMA;AACA,UAAU,OAAV,CAAkB,EAAlB,CAAqB,cAArB,EAAqC,iBAA2B;AAAA,MAAf,WAAe,SAAf,WAAe;;AAC9D,MAAM,aAAa,YAAY,QAAZ,CAAqB,IAAxC;;AAEA,MAAI,CAAC,UAAL,EAAiB;AAAE;AAAS;;AAE5B,MAAM,QAAQ,YAAY,MAAZ,CAAmB,OAAnB,CAA2B,UAA3B,EAAuC,KAArD;;AAEA,MAAI,QAAQ,CAAZ,EAAe;AACb,gBAAY,QAAZ,CAAqB,IAArB,GAA4B,IAA5B;AACD;AACF,CAVD;;;;;AC5BA,IAAM,YAAY,QAAQ,QAAR,CAAlB;AACA,IAAM,QAAY,QAAQ,UAAR,CAAlB;AACA,IAAM,UAAY,QAAQ,kBAAR,CAAlB;AACA,IAAM,KAAY,QAAQ,aAAR,CAAlB;;eAEwC,QAAQ,mBAAR,C;IAAhC,e,YAAA,e;IAAiB,U,YAAA,U;;AAEzB,UAAU,iBAAV,CAA4B,QAAQ,iBAAR,CAA5B;;AAEA,UAAU,OAAV,CAAkB,EAAlB,CAAqB,cAArB,EAAsC,gBAAgD;AAAA,MAApC,WAAoC,QAApC,WAAoC;AAAA,MAAvB,WAAuB,QAAvB,WAAuB;AAAA,MAAV,EAAU,QAAV,EAAU;AAAA,MAAN,EAAM,QAAN,EAAM;;AACpF,MAAI,YAAY,QAAZ,CAAqB,IAArB,KAA8B,MAAlC,EAA0C;AAAE;AAAS;;AAErD;AACA,MAAM,OAAO,KAAK,GAAL,CAAS,EAAT,CAAb;AACA,MAAM,OAAO,KAAK,GAAL,CAAS,EAAT,CAAb;AACA,MAAM,UAAU,YAAY,MAAZ,CAAmB,OAAnB,CAA2B,IAA3C;AACA,MAAM,YAAY,QAAQ,SAA1B;AACA,MAAM,cAAe,OAAO,IAAP,GAAc,GAAd,GAAoB,OAAO,IAAP,GAAc,GAAd,GAAoB,IAA7D;;AAEA,cAAY,QAAZ,CAAqB,IAArB,GAA4B,QAAQ,QAAR,KAAqB,OAArB,GACxB,YAAY,CAAZ,CADwB,CACT;AADS,IAExB,QAAQ,QAFZ;;AAIA;AACA,MAAI,gBAAgB,IAAhB,IAAwB,cAAc,IAAtC,IAA8C,cAAc,WAAhE,EAA6E;AAC3E;AACA,gBAAY,QAAZ,CAAqB,IAArB,GAA4B,IAA5B;;AAEA;;AAEA,QAAI,CAAC,YAAY,QAAZ,CAAqB,IAA1B,EAAgC;;AAE9B,UAAI,UAAU,WAAd;;AAEA,UAAM,eAAe,SAAf,YAAe,CAAU,YAAV,EAAwB,QAAxB,EAAkC,OAAlC,EAA2C;AAC9D,YAAM,WAAW,QAAQ,0BAAR,GACX,QAAQ,gBAAR,CAAyB,QAAzB,CADW,GAEX,SAFN;;AAIA,YAAI,iBAAiB,YAAY,MAAjC,EAAyC;AAAE;AAAS;;AAEpD,YAAI,CAAC,QAAQ,WAAT,IACG,CAAC,aAAa,eAAb,CAA6B,OAA7B,EAAsC,OAAtC,EAA+C,WAA/C,CADJ,IAEG,gBAAgB,OAAhB,EAAyB,QAAzB,EAAmC,QAAnC,CAFP,EAEqD;;AAEnD,cAAM,UAAS,aAAa,SAAb,CAAuB,YAAY,WAAnC,EACuB,YAAY,SADnC,EAEuB,WAFvB,EAGuB,OAHvB,CAAf;;AAKA,cAAI,WACG,QAAO,IAAP,KAAgB,MADnB,IAEG,eAAe,WAAf,EAA4B,YAA5B,CAFH,IAGG,UAAU,cAAV,CAAyB,OAAzB,EAAiC,YAAjC,EAA+C,OAA/C,EAAwD,WAAxD,CAHP,EAG6E;;AAE3E,mBAAO,YAAP;AACD;AACF;AACF,OAxBD;;AA0BA,UAAI,SAAS,IAAb;;AAEA;AACA,aAAO,GAAG,OAAH,CAAW,OAAX,CAAP,EAA4B;AAC1B,YAAM,sBAAsB,MAAM,aAAN,CAAoB,GAApB,CAAwB,OAAxB,CAA5B;;AAEA,YAAI,uBACG,wBAAwB,YAAY,MADvC,IAEG,CAAC,oBAAoB,OAApB,CAA4B,IAA5B,CAAiC,WAFzC,EAEsD;;AAEpD,mBAAS,oBAAoB,SAApB,CAA8B,YAAY,WAA1C,EAAuD,YAAY,SAAnE,EAA8E,WAA9E,EAA2F,OAA3F,CAAT;AACD;AACD,YAAI,UACG,OAAO,IAAP,KAAgB,MADnB,IAEG,eAAe,WAAf,EAA4B,mBAA5B,CAFP,EAEyD;;AAEvD,sBAAY,QAAZ,CAAqB,IAArB,GAA4B,MAA5B;AACA,sBAAY,MAAZ,GAAqB,mBAArB;AACA,sBAAY,OAAZ,GAAsB,OAAtB;AACA;AACD;;AAED,YAAM,uBAAuB,MAAM,aAAN,CAAoB,eAApB,CAAoC,YAApC,EAAkD,OAAlD,CAA7B;;AAEA,YAAI,oBAAJ,EAA0B;AACxB,sBAAY,QAAZ,CAAqB,IAArB,GAA4B,MAA5B;AACA,sBAAY,MAAZ,GAAqB,oBAArB;AACA,sBAAY,OAAZ,GAAsB,OAAtB;AACA;AACD;;AAED,kBAAU,WAAW,OAAX,CAAV;AACD;AACF;AACF;AACF,CAtFD;;AAwFA,SAAS,cAAT,CAAyB,SAAzB,EAAoC,YAApC,EAAkD;AAChD,MAAI,CAAC,YAAL,EAAmB;AAAE,WAAO,KAAP;AAAe;;AAEpC,MAAM,WAAW,aAAa,OAAb,CAAqB,IAArB,CAA0B,SAA3C;;AAEA,SAAQ,cAAc,IAAd,IAAsB,aAAa,IAAnC,IAA2C,aAAa,SAAhE;AACD;;;;;ACvGD,QAAQ,QAAR,EAAkB,iBAAlB,CAAoC,QAAQ,oBAAR,CAApC;;;;;ACAA,QAAQ,QAAR,EAAkB,iBAAlB,CAAoC,QAAQ,mBAAR,CAApC;;;;;ACAA,OAAO,OAAP,GAAiB;AACf,QAAM;AACJ,YAAgB,IADZ;AAEJ,oBAAgB,MAFZ;AAGJ,iBAAgB;AAHZ,GADS;;AAOf,aAAW;AACT,YAAQ,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EADC;;AAGT;AACA;AACA,kBAAc,CALL;;AAOT,aAAS;AACP,eAAmB,KADZ;AAEP,kBAAmB,EAFZ,EAEmB;AAC1B,gBAAmB,GAHZ,EAGmB;AAC1B,gBAAmB,EAJZ,EAImB;AAC1B,mBAAmB,IALZ,EAKmB;AAC1B,yBAAmB,GANZ,CAMmB;AANnB;AAPA;AAPI,CAAjB;;;;;ACAA;;AAEA;AACA,QAAQ,kBAAR;;AAEA;AACA,QAAQ,WAAR;;AAEA;AACA,QAAQ,kBAAR;AACA,QAAQ,sBAAR;;AAEA;AACA,QAAQ,sBAAR;AACA,QAAQ,4BAAR;AACA,QAAQ,qCAAR;;AAEA;AACA,QAAQ,mBAAR;;AAEA;AACA,QAAQ,mBAAR;AACA,QAAQ,kBAAR;AACA,QAAQ,gBAAR;AACA,QAAQ,gBAAR;;AAEA;AACA,QAAQ,sBAAR;AACA,QAAQ,2BAAR;AACA,QAAQ,0BAAR;;AAEA;AACA,QAAQ,qBAAR;AACA,QAAQ,oBAAR;AACA,QAAQ,kBAAR;;AAEA;AACA,QAAQ,iCAAR;;AAEA;AACA,QAAQ,cAAR;;AAEA;AACA,OAAO,OAAP,GAAiB,QAAQ,YAAR,CAAjB;;;;;AC3CA,IAAM,gBAAiB,QAAQ,iBAAR,CAAvB;AACA,IAAM,cAAiB,QAAQ,eAAR,CAAvB;AACA,IAAM,YAAiB,QAAQ,aAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,SAAR,CAAvB;AACA,IAAM,iBAAiB,QAAQ,aAAR,CAAvB;;AAEA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,KAAvB,EAA8B,UAAU,WAAV,EAAuB;AACnD,cAAY,aAAZ,GAA4B;AAC1B,YAAa,KADa;AAE1B,eAAa,KAFa;AAG1B,iBAAa,KAHa;;AAK1B,gBAAY,IALc;AAM1B,cAAY,EANc;;AAQ1B,QAAI,CARsB,EAQnB,IAAI,CARe;AAS1B,QAAI,CATsB,EASnB,IAAI,CATe;;AAW1B,QAAI,CAXsB;AAY1B,SAAK,CAZqB,EAYlB,KAAK,CAZa;AAa1B,cAAU,CAbgB;;AAe1B,eAAW,CAfe;AAgB1B,eAAW,CAhBe;AAiB1B,OAAK;AAjBqB,GAA5B;;AAoBA,cAAY,iBAAZ,GAAkC;AAAA,WAAM,aAAe,KAAf,CAAqB,WAArB,CAAN;AAAA,GAAlC;AACA,cAAY,mBAAZ,GAAkC;AAAA,WAAM,eAAe,KAAf,CAAqB,WAArB,CAAN;AAAA,GAAlC;AACD,CAvBD;;AAyBA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,MAAvB,EAA+B,gBAAwD;AAAA,MAA5C,WAA4C,QAA5C,WAA4C;AAAA,MAA/B,KAA+B,QAA/B,KAA+B;AAAA,MAAxB,OAAwB,QAAxB,OAAwB;AAAA,MAAf,WAAe,QAAf,WAAe;;AACrF,MAAM,SAAS,YAAY,aAA3B;;AAEA;AACA,MAAI,OAAO,MAAX,EAAmB;AACjB,QAAI,UAAU,WAAd;;AAEA;AACA,WAAO,MAAM,EAAN,CAAS,OAAT,CAAiB,OAAjB,CAAP,EAAkC;;AAEhC;AACA,UAAI,YAAY,YAAY,OAA5B,EAAqC;AACnC;AACA,uBAAe,MAAf,CAAsB,OAAO,CAA7B;AACA,eAAO,MAAP,GAAgB,KAAhB;AACA,oBAAY,UAAZ,GAAyB,IAAzB;;AAEA;AACA,oBAAY,aAAZ,CAA0B,OAA1B;AACA,cAAM,SAAN,CAAgB,YAAY,SAA5B,EAAuC,YAAY,QAAnD;;AAEA;AACA,YAAM,YAAY,EAAE,wBAAF,EAAlB;AACA,oBAAY,OAAZ,CAAoB,IAApB,CAAyB,oBAAzB,EAA+C,SAA/C;AACA,oBAAY,OAAZ,CAAoB,IAApB,CAAyB,eAAzB,EAA+C,SAA/C;;AAEA;AACA,YAAM,cAAc,IAAI,aAAJ,CAAkB,WAAlB,EACkB,KADlB,EAEkB,YAAY,QAAZ,CAAqB,IAFvC,EAGkB,eAHlB,EAIkB,YAAY,OAJ9B,CAApB;;AAMA,oBAAY,MAAZ,CAAmB,IAAnB,CAAwB,WAAxB;AACA,oBAAY,SAAZ,GAAwB,WAAxB;AACA,kBAAU,aAAV,CAAwB,YAAY,gBAApC;;AAEA,cAAM,UAAN,CAAiB,YAAY,UAA7B,EAAyC,YAAY,SAArD;AACA;AACD;;AAED,gBAAU,MAAM,UAAN,CAAiB,OAAjB,CAAV;AACD;AACF;AACF,CA5CD;;AA8CA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,IAAvB,EAA6B,iBAAkC;AAAA,MAAtB,WAAsB,SAAtB,WAAsB;AAAA,MAAT,KAAS,SAAT,KAAS;;AAC7D,MAAM,SAAS,YAAY,aAA3B;;AAEA,MAAI,CAAC,YAAY,WAAZ,EAAD,IAA8B,OAAO,MAAzC,EAAiD;AAAE;AAAS;;AAE5D,MAAM,SAAS,YAAY,MAA3B;AACA,MAAM,UAAU,UAAU,OAAO,OAAjC;AACA,MAAM,iBAAiB,WAAW,YAAY,QAAZ,CAAqB,IAAhC,IAAwC,QAAQ,YAAY,QAAZ,CAAqB,IAA7B,EAAmC,OAAlG;;AAEA,MAAM,MAAM,IAAI,IAAJ,GAAW,OAAX,EAAZ;AACA,MAAM,WAAW,EAAjB;AACA,MAAM,OAAO,MAAM,MAAN,CAAa,EAAb,EAAiB,YAAY,SAAZ,CAAsB,IAAvC,CAAb;AACA,MAAM,eAAe,YAAY,YAAZ,CAAyB,MAAzB,CAAgC,KAArD;;AAEA,MAAI,YAAY,KAAhB;AACA,MAAI,uBAAJ;;AAEA;AACA,MAAM,kBAAmB,kBAAkB,eAAe,OAAjC,IACH,YAAY,QAAZ,CAAqB,IAArB,KAA8B,SAD3B,IAEH,UAAU,OAAO,UAFvC;;AAIA,MAAM,UAAW,mBACX,MAAM,YAAY,SAAZ,CAAsB,SAA7B,GAA0C,EAD9B,IAEZ,eAAe,eAAe,QAFlB,IAGZ,eAAe,eAAe,QAHnC;;AAKA,MAAM,cAAc;AAClB,4BADkB;AAElB,gBAAY,IAFM;AAGlB,sBAHkB;AAIlB,YAAQ,IAJU;AAKlB,oBAAgB;AALE,GAApB;;AAQA;AACA,MAAI,mBAAmB,CAAC,OAAxB,EAAiC;AAC/B,cAAU,aAAV,CAAwB,QAAxB;;AAEA,qBAAiB,UAAU,MAAV,CAAiB,WAAjB,CAAjB;;AAEA,QAAI,eAAe,UAAf,IAA6B,eAAe,MAAhD,EAAwD;AACtD,kBAAY,IAAZ;AACD;AACF;;AAED,MAAI,EAAE,WAAW,SAAb,CAAJ,EAA6B;AAAE;AAAS;;AAExC,QAAM,UAAN,CAAiB,OAAO,QAAxB,EAAkC,YAAY,SAA9C;;AAEA,cAAY,QAAZ,CAAqB,CAArB,IAA0B,OAAO,UAAP,GACxB,IAAI,aAAJ,CAAkB,WAAlB,EAA+B,KAA/B,EAAsC,YAAY,QAAZ,CAAqB,IAA3D,EAAiE,cAAjE,EAAiF,YAAY,OAA7F,CADF;;AAGA,SAAO,EAAP,GAAY,GAAZ;;AAEA,SAAO,MAAP,GAAgB,IAAhB;AACA,SAAO,WAAP,GAAqB,eAAe,WAApC;AACA,cAAY,UAAZ,GAAyB,MAAzB;;AAEA,SAAO,IAAP,CAAY,OAAO,UAAnB;;AAEA,MAAI,OAAJ,EAAa;AACX,WAAO,GAAP,GAAa,YAAY,YAAZ,CAAyB,MAAzB,CAAgC,EAA7C;AACA,WAAO,GAAP,GAAa,YAAY,YAAZ,CAAyB,MAAzB,CAAgC,EAA7C;AACA,WAAO,EAAP,GAAY,YAAZ;;AAEA,gBAAY,WAAZ,EAAyB,MAAzB;;AAEA,UAAM,MAAN,CAAa,IAAb,EAAmB,YAAY,SAAZ,CAAsB,IAAzC;;AAEA,SAAK,CAAL,IAAU,OAAO,EAAjB;AACA,SAAK,CAAL,IAAU,OAAO,EAAjB;;AAEA,cAAU,aAAV,CAAwB,QAAxB;;AAEA,qBAAiB,UAAU,MAAV,CAAiB,WAAjB,CAAjB;;AAEA,WAAO,UAAP,IAAqB,eAAe,EAApC;AACA,WAAO,UAAP,IAAqB,eAAe,EAApC;;AAEA,WAAO,CAAP,GAAW,eAAe,OAAf,CAAuB,YAAY,iBAAnC,CAAX;AACD,GApBD,MAqBK;AACH,WAAO,SAAP,GAAmB,IAAnB;AACA,WAAO,EAAP,GAAY,eAAe,EAA3B;AACA,WAAO,EAAP,GAAY,eAAe,EAA3B;;AAEA,WAAO,EAAP,GAAY,OAAO,EAAP,GAAY,CAAxB;;AAEA,WAAO,CAAP,GAAW,eAAe,OAAf,CAAuB,YAAY,mBAAnC,CAAX;AACD;AACF,CA3FD;;AA6FA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,aAAvB,EAAsC,iBAA2B;AAAA,MAAf,WAAe,SAAf,WAAe;;AAC/D,MAAM,SAAS,YAAY,aAA3B;;AAEA,MAAI,OAAO,MAAX,EAAmB;AACjB,mBAAe,MAAf,CAAsB,OAAO,CAA7B;AACA,WAAO,MAAP,GAAgB,KAAhB;AACA,gBAAY,UAAZ,GAAyB,IAAzB;AACD;AACF,CARD;;AAUA,SAAS,WAAT,CAAsB,WAAtB,EAAmC,MAAnC,EAA2C;AACzC,MAAM,iBAAiB,YAAY,MAAZ,CAAmB,OAAnB,CAA2B,YAAY,QAAZ,CAAqB,IAAhD,EAAsD,OAA7E;AACA,MAAM,SAAS,eAAe,UAA9B;AACA,MAAM,aAAa,CAAC,KAAK,GAAL,CAAS,eAAe,QAAf,GAA0B,OAAO,EAA1C,CAAD,GAAiD,MAApE;;AAEA,SAAO,EAAP,GAAY,YAAY,SAAZ,CAAsB,KAAlC;AACA,SAAO,EAAP,GAAY,YAAY,SAAZ,CAAsB,KAAlC;AACA,SAAO,EAAP,GAAY,OAAO,UAAP,CAAkB,SAAlB,GAA8B,IAA1C;AACA,SAAO,EAAP,GAAY,OAAO,EAAP,GAAY,CAAxB;;AAEA,SAAO,UAAP,GAAoB,OAAO,EAAP,GAAY,CAAC,OAAO,GAAP,GAAa,UAAd,IAA4B,MAA5D;AACA,SAAO,UAAP,GAAoB,OAAO,EAAP,GAAY,CAAC,OAAO,GAAP,GAAa,UAAd,IAA4B,MAA5D;AACA,SAAO,EAAP,GAAY,UAAZ;;AAEA,SAAO,SAAP,GAAmB,SAAS,OAAO,EAAnC;AACA,SAAO,SAAP,GAAmB,IAAI,eAAe,QAAf,GAA0B,OAAO,EAAxD;AACD;;AAED,SAAS,YAAT,GAAyB;AACvB,sBAAoB,IAApB;AACA,QAAM,cAAN,CAAqB,KAAK,YAA1B,EAAwC,KAAK,UAA7C,EAAyD,KAAK,SAA9D;;AAEA,MAAM,SAAS,KAAK,aAApB;AACA,MAAM,UAAU,KAAK,MAAL,CAAY,OAAZ,CAAoB,KAAK,QAAL,CAAc,IAAlC,EAAwC,OAAxD;AACA,MAAM,SAAS,QAAQ,UAAvB;AACA,MAAM,IAAI,IAAI,IAAJ,GAAW,OAAX,KAAuB,IAAvB,GAA8B,OAAO,EAA/C;;AAEA,MAAI,IAAI,OAAO,EAAf,EAAmB;;AAEjB,QAAM,WAAY,IAAI,CAAC,KAAK,GAAL,CAAS,CAAC,MAAD,GAAU,CAAnB,IAAwB,OAAO,SAAhC,IAA6C,OAAO,SAA1E;;AAEA,QAAI,OAAO,UAAP,KAAsB,OAAO,EAA7B,IAAmC,OAAO,UAAP,KAAsB,OAAO,EAApE,EAAwE;AACtE,aAAO,EAAP,GAAY,OAAO,EAAP,GAAY,QAAxB;AACA,aAAO,EAAP,GAAY,OAAO,EAAP,GAAY,QAAxB;AACD,KAHD,MAIK;AACH,UAAM,YAAY,MAAM,sBAAN,CAA6B,CAA7B,EAAgC,CAAhC,EAC6B,OAAO,EADpC,EAE6B,OAAO,EAFpC,EAG6B,OAAO,UAHpC,EAI6B,OAAO,UAJpC,EAK6B,QAL7B,CAAlB;;AAOA,aAAO,EAAP,GAAY,UAAU,CAAtB;AACA,aAAO,EAAP,GAAY,UAAU,CAAtB;AACD;;AAED,SAAK,MAAL;;AAEA,WAAO,CAAP,GAAW,eAAe,OAAf,CAAuB,KAAK,iBAA5B,CAAX;AACD,GAvBD,MAwBK;AACH,WAAO,EAAP,GAAY,OAAO,UAAnB;AACA,WAAO,EAAP,GAAY,OAAO,UAAnB;;AAEA,SAAK,MAAL;AACA,SAAK,GAAL,CAAS,OAAO,UAAhB;AACA,WAAO,MAAP,GAAgB,KAAhB;AACA,SAAK,UAAL,GAAkB,IAAlB;AACD;;AAED,QAAM,UAAN,CAAiB,KAAK,UAAtB,EAAkC,KAAK,SAAvC;AACD;;AAED,SAAS,cAAT,GAA2B;AACzB,sBAAoB,IAApB;;AAEA,MAAM,SAAS,KAAK,aAApB;AACA,MAAM,IAAI,IAAI,IAAJ,GAAW,OAAX,KAAuB,OAAO,EAAxC;AACA,MAAM,WAAW,KAAK,MAAL,CAAY,OAAZ,CAAoB,KAAK,QAAL,CAAc,IAAlC,EAAwC,OAAxC,CAAgD,iBAAjE;;AAEA,MAAI,IAAI,QAAR,EAAkB;AAChB,WAAO,EAAP,GAAY,MAAM,WAAN,CAAkB,CAAlB,EAAqB,CAArB,EAAwB,OAAO,EAA/B,EAAmC,QAAnC,CAAZ;AACA,WAAO,EAAP,GAAY,MAAM,WAAN,CAAkB,CAAlB,EAAqB,CAArB,EAAwB,OAAO,EAA/B,EAAmC,QAAnC,CAAZ;;AAEA,SAAK,WAAL,CAAiB,OAAO,UAAxB,EAAoC,OAAO,UAA3C;;AAEA,WAAO,CAAP,GAAW,eAAe,OAAf,CAAuB,KAAK,mBAA5B,CAAX;AACD,GAPD,MAQK;AACH,WAAO,EAAP,GAAY,OAAO,EAAnB;AACA,WAAO,EAAP,GAAY,OAAO,EAAnB;;AAEA,SAAK,WAAL,CAAiB,OAAO,UAAxB,EAAoC,OAAO,UAA3C;AACA,SAAK,GAAL,CAAS,OAAO,UAAhB;;AAEA,WAAO,SAAP,GACE,OAAO,MAAP,GAAgB,KADlB;AAEA,SAAK,UAAL,GAAkB,IAAlB;AACD;AACF;;AAED,SAAS,mBAAT,CAA8B,WAA9B,EAA2C;AACzC,MAAM,SAAS,YAAY,aAA3B;;AAEA;AACA,MAAI,CAAC,OAAO,MAAZ,EAAoB;AAAE;AAAS;;AAE/B,MAAM,SAAW,OAAO,QAAP,CAAgB,IAAjC;AACA,MAAM,WAAW,OAAO,QAAP,CAAgB,MAAjC;;AAEA,QAAM,SAAN,CAAgB,YAAY,SAA5B,EAAuC,CAAE;AACvC,WAAS,OAAO,CAAP,GAAa,OAAO,EADU;AAEvC,WAAS,OAAO,CAAP,GAAa,OAAO,EAFU;AAGvC,aAAS,SAAS,CAAT,GAAa,OAAO,EAHU;AAIvC,aAAS,SAAS,CAAT,GAAa,OAAO;AAJU,GAAF,CAAvC;AAMD;;;;;AC/RD,IAAM,UAAe,QAAQ,iBAAR,CAArB;AACA,IAAM,SAAe,QAAQ,gBAAR,CAArB;AACA,IAAM,QAAe,QAAQ,SAAR,CAArB;AACA,IAAM,QAAe,QAAQ,SAAR,CAArB;AACA,IAAM,eAAe,QAAQ,gBAAR,CAArB;AACA,IAAM,cAAe,QAAQ,eAAR,CAArB;;AAEA,IAAM,eAAe,EAArB;;AAEA;;;;;;;;;;;;;;;;;;;;;;;;AAwBA,SAAS,QAAT,CAAmB,OAAnB,EAA4B,OAA5B,EAAqC;AACnC,MAAI,eAAe,MAAM,aAAN,CAAoB,GAApB,CAAwB,OAAxB,EAAiC,OAAjC,CAAnB;;AAEA,MAAI,CAAC,YAAL,EAAmB;AACjB,mBAAe,IAAI,YAAJ,CAAiB,OAAjB,EAA0B,OAA1B,CAAf;AACA,iBAAa,MAAb,CAAoB,MAApB,GAA6B,YAA7B;AACD;;AAED,SAAO,YAAP;AACD;;AAED;;;;;;;;AAQA,SAAS,KAAT,GAAiB,UAAU,OAAV,EAAmB,OAAnB,EAA4B;AAC3C,SAAO,MAAM,aAAN,CAAoB,cAApB,CAAmC,OAAnC,EAA4C,WAAW,QAAQ,OAA/D,MAA4E,CAAC,CAApF;AACD,CAFD;;AAIA;;;;;;;;;;;;AAYA,SAAS,EAAT,GAAc,UAAU,IAAV,EAAgB,QAAhB,EAA0B,OAA1B,EAAmC;AAC/C,MAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,IAAhB,KAAyB,KAAK,MAAL,CAAY,GAAZ,MAAqB,CAAC,CAAnD,EAAsD;AACpD,WAAO,KAAK,IAAL,GAAY,KAAZ,CAAkB,IAAlB,CAAP;AACD;;AAED,MAAI,MAAM,EAAN,CAAS,KAAT,CAAe,IAAf,CAAJ,EAA0B;AACxB,yBAAwB,IAAxB,kHAA8B;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAAnB,SAAmB;;AAC5B,eAAS,EAAT,CAAY,SAAZ,EAAuB,QAAvB,EAAiC,OAAjC;AACD;;AAED,WAAO,QAAP;AACD;;AAED,MAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,IAAhB,CAAJ,EAA2B;AACzB,SAAK,IAAM,IAAX,IAAmB,IAAnB,EAAyB;AACvB,eAAS,EAAT,CAAY,IAAZ,EAAkB,KAAK,IAAL,CAAlB,EAA8B,QAA9B;AACD;;AAED,WAAO,QAAP;AACD;;AAED;AACA,MAAI,MAAM,QAAN,CAAe,aAAa,UAA5B,EAAwC,IAAxC,CAAJ,EAAmD;AACjD;AACA,QAAI,CAAC,aAAa,IAAb,CAAL,EAAyB;AACvB,mBAAa,IAAb,IAAqB,CAAC,QAAD,CAArB;AACD,KAFD,MAGK;AACH,mBAAa,IAAb,EAAmB,IAAnB,CAAwB,QAAxB;AACD;AACF;AACD;AATA,OAUK;AACH,aAAO,GAAP,CAAW,MAAM,QAAjB,EAA2B,IAA3B,EAAiC,QAAjC,EAA2C,EAAE,gBAAF,EAA3C;AACD;;AAED,SAAO,QAAP;AACD,CArCD;;AAuCA;;;;;;;;;;;AAWA,SAAS,GAAT,GAAe,UAAU,IAAV,EAAgB,QAAhB,EAA0B,OAA1B,EAAmC;AAChD,MAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,IAAhB,KAAyB,KAAK,MAAL,CAAY,GAAZ,MAAqB,CAAC,CAAnD,EAAsD;AACpD,WAAO,KAAK,IAAL,GAAY,KAAZ,CAAkB,IAAlB,CAAP;AACD;;AAED,MAAI,MAAM,EAAN,CAAS,KAAT,CAAe,IAAf,CAAJ,EAA0B;AACxB,0BAAwB,IAAxB,yHAA8B;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAAnB,SAAmB;;AAC5B,eAAS,GAAT,CAAa,SAAb,EAAwB,QAAxB,EAAkC,OAAlC;AACD;;AAED,WAAO,QAAP;AACD;;AAED,MAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,IAAhB,CAAJ,EAA2B;AACzB,SAAK,IAAM,IAAX,IAAmB,IAAnB,EAAyB;AACvB,eAAS,GAAT,CAAa,IAAb,EAAmB,KAAK,IAAL,CAAnB,EAA+B,QAA/B;AACD;;AAED,WAAO,QAAP;AACD;;AAED,MAAI,CAAC,MAAM,QAAN,CAAe,aAAa,UAA5B,EAAwC,IAAxC,CAAL,EAAoD;AAClD,WAAO,MAAP,CAAc,MAAM,QAApB,EAA8B,IAA9B,EAAoC,QAApC,EAA8C,OAA9C;AACD,GAFD,MAGK;AACH,QAAI,cAAJ;;AAEA,QAAI,QAAQ,YAAR,IACG,CAAC,QAAQ,MAAM,OAAN,CAAc,aAAa,IAAb,CAAd,EAAkC,QAAlC,CAAT,MAA0D,CAAC,CADlE,EACqE;AACnE,mBAAa,IAAb,EAAmB,MAAnB,CAA0B,KAA1B,EAAiC,CAAjC;AACD;AACF;;AAED,SAAO,QAAP;AACD,CAlCD;;AAoCA;;;;;;;AAOA,SAAS,KAAT,GAAiB,YAAY;AAC3B,SAAO,KAAP;AACD,CAFD;;AAIA;AACA,SAAS,iBAAT,GAA8B,MAAM,cAApC;AACA,SAAS,YAAT,GAA8B,MAAM,SAApC;AACA,SAAS,gBAAT,GAA8B,MAAM,aAApC;AACA,SAAS,aAAT,GAA8B,MAAM,UAApC;;AAEA,SAAS,cAAT,GAAgC,MAAM,cAAtC;AACA,SAAS,oBAAT,GAAgC,MAAM,oBAAtC;AACA,SAAS,eAAT,GAAgC,MAAM,eAAtC;AACA,SAAS,OAAT,GAAgC,MAAM,OAAtC;;AAEA;;;;;;AAMA,SAAS,aAAT,GAAyB,YAAY;AACnC,SAAO,QAAQ,aAAf;AACD,CAFD;;AAIA;;;;;;AAMA,SAAS,oBAAT,GAAgC,YAAY;AAC1C,SAAO,QAAQ,oBAAf;AACD,CAFD;;AAIA;;;;;;;;;AASA,SAAS,IAAT,GAAgB,UAAU,KAAV,EAAiB;AAC/B,OAAK,IAAI,IAAI,MAAM,YAAN,CAAmB,MAAnB,GAA4B,CAAzC,EAA4C,KAAK,CAAjD,EAAoD,GAApD,EAAyD;AACvD,UAAM,YAAN,CAAmB,CAAnB,EAAsB,IAAtB,CAA2B,KAA3B;AACD;;AAED,SAAO,QAAP;AACD,CAND;;AAQA;;;;;;;;;AASA,SAAS,oBAAT,GAAgC,UAAU,QAAV,EAAoB;AAClD,MAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,QAAhB,CAAJ,EAA+B;AAC7B,gBAAY,oBAAZ,GAAmC,QAAnC;;AAEA,WAAO,IAAP;AACD;;AAED,SAAO,YAAY,oBAAnB;AACD,CARD;;AAUA,SAAS,WAAT,GAA0B,MAAM,WAAhC;AACA,SAAS,cAAT,GAA0B,MAAM,cAAhC;;AAEA,MAAM,QAAN,GAAiB,QAAjB;;AAEA,OAAO,OAAP,GAAiB,QAAjB;;;;;AC7OA,IAAM,eAAe,QAAQ,gBAAR,CAArB;AACA,IAAM,cAAe,QAAQ,eAAR,CAArB;AACA,IAAM,QAAe,QAAQ,SAAR,CAArB;AACA,IAAM,KAAe,QAAQ,YAAR,CAArB;AACA,IAAM,SAAe,QAAQ,gBAAR,CAArB;;eAE0C,QAAQ,kBAAR,C;IAAlC,Y,YAAA,Y;IAAc,e,YAAA,e;;AAEtB;;;;;;;;;;;;;;;AAaA,aAAa,SAAb,CAAuB,cAAvB,GAAwC,UAAU,QAAV,EAAoB;AAC1D,MAAI,wBAAwB,IAAxB,CAA6B,QAA7B,CAAJ,EAA4C;AAC1C,SAAK,OAAL,CAAa,cAAb,GAA8B,QAA9B;AACA,WAAO,IAAP;AACD;;AAED,MAAI,GAAG,IAAH,CAAQ,QAAR,CAAJ,EAAuB;AACrB,SAAK,OAAL,CAAa,cAAb,GAA8B,WAAU,QAAV,GAAqB,OAAnD;AACA,WAAO,IAAP;AACD;;AAED,SAAO,KAAK,OAAL,CAAa,cAApB;AACD,CAZD;;AAcA,aAAa,SAAb,CAAuB,sBAAvB,GAAgD,UAAU,KAAV,EAAiB;AAC/D,MAAM,UAAU,KAAK,OAAL,CAAa,cAA7B;;AAEA,MAAI,YAAY,OAAhB,EAAyB;AAAE;AAAS;;AAEpC,MAAI,YAAY,QAAhB,EAA0B;AACxB,UAAM,cAAN;AACA;AACD;;AAED;;AAEA;AACA;AACA,MAAI,OAAO,eAAX,EAA4B;AAC1B;AACD;;AAED;AACA,MAAI,uCAAuC,IAAvC,CAA4C,MAAM,IAAlD,CAAJ,EAA6D;AAC3D;AACD;;AAED;AACA,MAAI,GAAG,OAAH,CAAW,MAAM,MAAjB,KACG,gBAAgB,MAAM,MAAtB,EAA8B,uEAA9B,CADP,EAC+G;AAC7G;AACD;;AAED,QAAM,cAAN;AACD,CA9BD;;AAgCA,SAAS,kBAAT,OAAqD;AAAA,MAAtB,WAAsB,QAAtB,WAAsB;AAAA,MAAT,KAAS,QAAT,KAAS;;AACnD,MAAI,YAAY,MAAhB,EAAwB;AACtB,gBAAY,MAAZ,CAAmB,sBAAnB,CAA0C,KAA1C;AACD;AACF;;WAEyB,CAAC,MAAD,EAAS,MAAT,EAAiB,IAAjB,EAAuB,QAAvB,C;AAA1B,yCAA4D;AAAvD,MAAM,sBAAN;AACH,cAAY,OAAZ,CAAoB,EAApB,CAAuB,WAAvB,EAAoC,kBAApC;AACD;;AAED;AACA,YAAY,SAAZ,CAAsB,SAAtB,GAAkC,SAAS,iBAAT,CAA4B,KAA5B,EAAmC;AACnE,uBAA0B,MAAM,YAAhC,mHAA8C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,QAAnC,WAAmC;;;AAE5C,QAAI,YAAY,OAAZ,KACI,YAAY,OAAZ,KAAwB,MAAM,MAA9B,IACG,aAAa,YAAY,OAAzB,EAAkC,MAAM,MAAxC,CAFP,CAAJ,EAE6D;;AAE3D,kBAAY,MAAZ,CAAmB,sBAAnB,CAA0C,KAA1C;AACA;AACD;AACF;AACF,CAXD;;;;;AC9EA,IAAM,QAAgB,QAAQ,SAAR,CAAtB;AACA,IAAM,SAAgB,QAAQ,gBAAR,CAAtB;AACA,IAAM,UAAgB,QAAQ,iBAAR,CAAtB;AACA,IAAM,UAAgB,QAAQ,2BAAR,CAAtB;AACA,IAAM,gBAAgB,QAAQ,sBAAR,CAAtB;;eAEmB,QAAQ,gBAAR,C;IAAX,M,YAAA,M;;AAER,IAAM,WAAW,OAAO,SAAP,CAAiB,QAAlC;;AAEA,IAAI,CAAC,OAAO,KAAP,CAAa,OAAlB,EAA2B;AACzB,SAAO,KAAP,CAAa,OAAb,GAAuB,UAAU,GAAV,EAAe;AACpC,WAAO,SAAS,IAAT,CAAc,GAAd,MAAuB,gBAA9B;AACD,GAFD;AAGD;;AAED,IAAI,CAAC,OAAO,SAAP,CAAiB,IAAtB,EAA4B;AAC1B,SAAO,SAAP,CAAiB,IAAjB,GAAwB,YAAY;AAClC,WAAO,KAAK,OAAL,CAAa,oCAAb,EAAmD,EAAnD,CAAP;AACD,GAFD;AAGD;;AAED;AACA;AACA;AACA;AACA;AACA,SAAS,aAAT,CAAwB,KAAxB,EAA+B;AAC7B,MAAM,cAAc,MAAM,MAA1B;AACA,MAAM,cAAc,QAAQ,MAAR,CAAe,KAAf,EAAsB,MAAM,IAA5B,EAAkC,WAAlC,CAApB;;AAEA,MAAI,CAAC,WAAL,EAAkB;AAAE;AAAS;;AAE7B,MAAI,YAAY,OAAZ,IACG,MAAM,OAAN,KAAkB,YAAY,OAAZ,CAAoB,OADzC,IAEG,MAAM,OAAN,KAAkB,YAAY,OAAZ,CAAoB,OAFzC,IAGG,gBAAkB,YAAY,OAAZ,CAAoB,MAH7C,EAGqD;;AAEnD,gBAAY,WAAZ,CAAwB,CAAxB,IAA6B,WAA7B;AACA,gBAAY,SAAZ,CAAwB,CAAxB,IAA6B,IAAI,IAAJ,GAAW,OAAX,EAA7B;;AAEA,kBAAc,IAAd,CAAmB;AACjB,8BADiB;AAEjB,kBAFiB;AAGjB,8BAHiB;AAIjB,eAAS,KAJQ;AAKjB,YAAM;AALW,KAAnB;AAOD;AACF;;AAED,IAAI,QAAQ,KAAZ,EAAmB;AACjB,MAAM,YAAY,SAAZ,SAAY,CAAU,KAAV,EAAiB;AACjC,yBAA0B,MAAM,YAAhC,kHAA8C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAAnC,WAAmC;;AAC5C,UAAI,YAAY,WAAZ,EAAJ,EAA+B;AAC7B,oBAAY,MAAZ,CAAmB,sBAAnB,CAA0C,KAA1C;AACD;AACF;AACF,GAND;;AAQA,MAAM,WAAW,SAAS,QAAT,QAAiC,UAAjC,EAA6C;AAAA,QAAxB,GAAwB,SAAxB,GAAwB;AAAA,QAAnB,GAAmB,SAAnB,GAAmB;;AAC5D,QAAM,cAAc,WAAW,OAAX,CAAmB,QAAnB,MAAiC,CAAjC,GAChB,OAAO,GADS,GACH,OAAO,MADxB;;AAGA;AACA,gBAAY,GAAZ,EAAiB,aAAjB,EAAgC,SAAhC;;AAEA,QAAI,aAAJ,EAAmB;AACjB,kBAAY,GAAZ,EAAiB,UAAjB,EAA6B,aAA7B;AACD;AACF,GAVD;;AAYA,QAAM,OAAN,CAAc,EAAd,CAAiB,cAAjB,EAAoC,QAApC;AACA,QAAM,OAAN,CAAc,EAAd,CAAiB,iBAAjB,EAAoC,QAApC;AACD;;AAED,OAAO,OAAP,GAAiB,IAAjB;;;;;AC5EA,IAAM,gBAAgB,QAAQ,kBAAR,CAAtB;AACA,IAAM,cAAgB,QAAQ,gBAAR,CAAtB;AACA,IAAM,SAAgB,QAAQ,iBAAR,CAAtB;;AAEA,IAAM,YAAY;AAChB,SAAO,EADS;;AAGhB,cAAY,oBAAU,GAAV,EAAe;AAAA,QACjB,WADiB,GACiB,GADjB,CACjB,WADiB;AAAA,QACQ,IADR,GACiB,GADjB,CACJ,UADI;AAAA,QAEjB,MAFiB,GAEgB,WAFhB,CAEjB,MAFiB;AAAA,QAET,OAFS,GAEgB,WAFhB,CAET,OAFS;AAAA,QAEA,WAFA,GAEgB,WAFhB,CAEA,WAFA;;AAGzB,QAAM,OAAO,OAAO,OAAP,CAAe,OAAf,CAAb;;AAEA,QAAI,IAAJ,EAAU;AACR,kBAAY,IAAZ,GAAmB,KAAK,CAAL,GAAS,KAAK,IAAjC;AACA,kBAAY,GAAZ,GAAmB,KAAK,CAAL,GAAS,KAAK,GAAjC;;AAEA,kBAAY,KAAZ,GAAqB,KAAK,KAAL,GAAc,KAAK,CAAxC;AACA,kBAAY,MAAZ,GAAqB,KAAK,MAAL,GAAc,KAAK,CAAxC;;AAEA,UAAI,EAAE,WAAY,IAAd,CAAJ,EAAyB;AAAE,aAAK,KAAL,GAAc,KAAK,KAAL,GAAc,KAAK,IAAjC;AAAwC;AACnE,UAAI,EAAE,YAAY,IAAd,CAAJ,EAAyB;AAAE,aAAK,MAAL,GAAc,KAAK,MAAL,GAAc,KAAK,GAAjC;AAAwC;AACpE,KATD,MAUK;AACH,kBAAY,IAAZ,GAAmB,YAAY,GAAZ,GAAkB,YAAY,KAAZ,GAAoB,YAAY,MAAZ,GAAqB,CAA9E;AACD;;AAED,QAAI,IAAJ,GAAW,IAAX;AACA,QAAI,YAAJ,GAAmB,MAAnB;AACA,QAAI,OAAJ,GAAc,OAAd;;AAEA,SAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,UAAU,KAAV,CAAgB,MAApC,EAA4C,GAA5C,EAAiD;AAC/C,UAAM,eAAe,UAAU,KAAV,CAAgB,CAAhB,CAArB;;AAEA,UAAI,OAAJ,GAAc,OAAO,OAAP,CAAe,YAAY,QAAZ,CAAqB,IAApC,EAA0C,YAA1C,CAAd;;AAEA,UAAI,CAAC,IAAI,OAAT,EAAkB;AAChB;AACD;;AAED,kBAAY,eAAZ,CAA4B,YAA5B,IAA4C,UAAU,YAAV,EAAwB,SAAxB,CAAkC,GAAlC,CAA5C;AACD;AACF,GArCe;;AAuChB,UAAQ,gBAAU,GAAV,EAAe;AAAA,QACb,WADa,GACqC,GADrC,CACb,WADa;AAAA,QACA,QADA,GACqC,GADrC,CACA,QADA;AAAA,QACU,MADV,GACqC,GADrC,CACU,MADV;AAAA,QACkB,cADlB,GACqC,GADrC,CACkB,cADlB;;AAErB,QAAM,SAAS,OAAO,EAAP,EAAW,IAAI,UAAf,CAAf;AACA,QAAM,SAAS;AACb,UAAI,CADS;AAEb,UAAI,CAFS;AAGb,eAAS,KAHI;AAIb,cAAQ,KAJK;AAKb,kBAAY;AALC,KAAf;;AAQA,yBAA2B,UAAU,KAArC,kHAA4C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAAjC,YAAiC;;AAC1C,UAAM,WAAW,UAAU,YAAV,CAAjB;AACA,UAAM,UAAU,YAAY,MAAZ,CAAmB,OAAnB,CAA2B,YAAY,QAAZ,CAAqB,IAAhD,EAAsD,YAAtD,CAAhB;;AAEA,UAAI,CAAC,SAAS,OAAT,EAAkB,MAAlB,EAA0B,cAA1B,CAAL,EAAgD;AAAE;AAAW;;AAE7D,UAAI,MAAJ,GAAa,IAAI,MAAJ,GAAa,SAAS,YAAT,CAA1B;AACA,UAAI,OAAJ,GAAc,OAAd;AACA,UAAI,MAAJ,GAAa,IAAI,WAAJ,CAAgB,eAAhB,CAAgC,YAAhC,CAAb;;AAEA,eAAS,GAAT,CAAa,GAAb;;AAEA,UAAI,IAAI,MAAJ,CAAW,MAAf,EAAuB;AACrB,eAAO,CAAP,IAAY,IAAI,MAAJ,CAAW,EAAvB;AACA,eAAO,CAAP,IAAY,IAAI,MAAJ,CAAW,EAAvB;;AAEA,eAAO,EAAP,IAAa,IAAI,MAAJ,CAAW,EAAxB;AACA,eAAO,EAAP,IAAa,IAAI,MAAJ,CAAW,EAAxB;;AAEA,eAAO,MAAP,GAAgB,IAAhB;AACD;AACF;;AAED;AACA;AACA;AACA;AACA,WAAO,UAAP,GAAoB,CAAC,IAAI,MAAL,IAAe,CAAC,OAAO,MAAvB,IAAiC,IAAI,MAAJ,CAAW,OAAhE;;AAEA,WAAO,MAAP;AACD,GAhFe;;AAkFhB,iBAAe,uBAAU,QAAV,EAAoB;AACjC,0BAA2B,UAAU,KAArC,yHAA4C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAAjC,YAAiC;;AAC1C,UAAM,SAAS,SAAS,YAAT,KAA0B,EAAzC;;AAEA,aAAO,EAAP,GAAY,OAAO,EAAP,GAAY,CAAxB;AACA,aAAO,SAAP,GAAmB,OAAO,SAAP,GAAmB,GAAtC;AACA,aAAO,MAAP,GAAgB,KAAhB;AACA,aAAO,OAAP,GAAiB,IAAjB;;AAEA,eAAS,YAAT,IAAyB,MAAzB;AACD;;AAED,WAAO,QAAP;AACD,GA/Fe;;AAiGhB,SAAO,sBAA2B,UAA3B,EAAuC;AAAA,QAA3B,WAA2B,SAA3B,WAA2B;;AAC5C,QAAM,MAAM;AACV,8BADU;AAEV,kBAAY,CAAC,eAAe,eAAf,GACA,YAAY,SADZ,GACwB,YAAY,WADrC,EACkD,IAHpD;AAIV,mBAAa,YAAY,WAJf;AAKV,gBAAU,YAAY,gBALZ;AAMV,cAAQ,KANE;AAOV,sBAAgB;AAPN,KAAZ;;AAUA,cAAU,UAAV,CAAqB,GAArB;AACA,cAAU,aAAV,CAAwB,IAAI,QAA5B;;AAEA,QAAI,UAAJ,GAAiB,OAAO,EAAP,EAAW,YAAY,WAAZ,CAAwB,IAAnC,CAAjB;AACA,gBAAY,cAAZ,GAA6B,UAAU,MAAV,CAAiB,GAAjB,CAA7B;AACD;AAjHe,CAAlB;;AAoHA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,KAAvB,EAA8B,UAAU,WAAV,EAAuB;AACnD,cAAY,WAAZ,GAA+B,EAAE,MAAM,CAAR,EAAW,OAAO,CAAlB,EAAqB,KAAK,CAA1B,EAA6B,QAAQ,CAArC,EAA/B;AACA,cAAY,eAAZ,GAA+B,EAA/B;AACA,cAAY,gBAAZ,GAA+B,UAAU,aAAV,CAAwB,EAAxB,CAA/B;AACA,cAAY,cAAZ,GAA+B,IAA/B;AACD,CALD;;AAOA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,cAAvB,EAAwC,UAAU,KAAlD;AACA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,eAAvB,EAAwC,UAAU,KAAlD;;AAEA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,oBAAvB,EAA6C,iBAA0D;AAAA,MAA9C,WAA8C,SAA9C,WAA8C;AAAA,MAAjC,MAAiC,SAAjC,MAAiC;AAAA,MAAzB,qBAAyB,SAAzB,qBAAyB;;AACrG,MAAM,iBAAiB,UAAU,MAAV,CAAiB;AACtC,4BADsC;AAEtC,kBAFsC;AAGtC,gBAAY,YAAY,SAAZ,CAAsB,IAHI;AAItC,cAAU,YAAY,gBAJgB;AAKtC,oBAAgB;AALsB,GAAjB,CAAvB;;AAQA;AACA;AACA,MAAI,CAAC,eAAe,UAAhB,IAA8B,qBAAlC,EAAyD;AACvD,gBAAY,aAAZ,GAA4B,IAA5B;AACD;;AAED,cAAY,cAAZ,GAA6B,cAA7B;AACD,CAhBD;;AAkBA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,YAAvB,EAAqC,iBAAkC;AAAA,MAAtB,WAAsB,SAAtB,WAAsB;AAAA,MAAT,KAAS,SAAT,KAAS;;AACrE,OAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,UAAU,KAAV,CAAgB,MAApC,EAA4C,GAA5C,EAAiD;AAC/C,QAAM,UAAU,YAAY,MAAZ,CAAmB,OAAnB,CAA2B,YAAY,QAAZ,CAAqB,IAAhD,EAAsD,UAAU,KAAV,CAAgB,CAAhB,CAAtD,CAAhB;;AAEA;AACA,QAAI,SAAS,OAAT,EAAkB,IAAlB,EAAwB,IAAxB,CAAJ,EAAmC;AACjC;AACA,kBAAY,MAAZ,CAAmB,EAAE,YAAF,EAAS,QAAQ,IAAjB,EAAnB;AACA;AACD;AACF;AACF,CAXD;;AAaA,cAAc,OAAd,CAAsB,EAAtB,CAAyB,QAAzB,EAAmC,UAAU,GAAV,EAAe;AAAA,MACxC,MADwC,GAChB,GADgB,CACxC,MADwC;AAAA,MAChC,WADgC,GAChB,GADgB,CAChC,WADgC;;AAEhD,MAAM,cAAc,OAAO,EAAP,EAAW,GAAX,CAApB;;AAEA,OAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,UAAU,KAAV,CAAgB,MAApC,EAA4C,GAA5C,EAAiD;AAC/C,QAAM,eAAe,UAAU,KAAV,CAAgB,CAAhB,CAArB;AACA,gBAAY,OAAZ,GAAsB,YAAY,MAAZ,CAAmB,OAAnB,CAA2B,YAAY,QAAZ,CAAqB,IAAhD,EAAsD,YAAtD,CAAtB;;AAEA,QAAI,CAAC,YAAY,OAAjB,EAA0B;AACxB;AACD;;AAED,QAAM,WAAW,UAAU,YAAV,CAAjB;;AAEA,gBAAY,MAAZ,GAAqB,YAAY,gBAAZ,CAA6B,YAA7B,CAArB;;AAEA,WAAO,YAAP,IAAuB,SAAS,YAAT,CAAsB,WAAtB,CAAvB;AACD;AACF,CAlBD;;AAoBA,SAAS,QAAT,CAAmB,OAAnB,EAA4B,MAA5B,EAAoC,cAApC,EAAoD;AAClD,SAAQ,WAAW,QAAQ,OAAnB,KACI,UAAU,CAAC,QAAQ,OADvB,MAEI,CAAC,cAAD,IAAmB,QAAQ,OAF/B,CAAR;AAGD;;AAED,OAAO,OAAP,GAAiB,SAAjB;;;;;AC3LA,IAAM,YAAiB,QAAQ,SAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,UAAR,CAAvB;AACA,IAAM,iBAAiB,QAAQ,mBAAR,CAAvB;;AAEA,IAAM,WAAW;AACf,YAAU;AACR,aAAa,KADL;AAER,aAAa,KAFL;AAGR,iBAAa,IAHL;AAIR,iBAAa;AAJL,GADK;;AAQf,aAAW,yBAA0C;AAAA,QAA9B,IAA8B,QAA9B,IAA8B;AAAA,QAAxB,WAAwB,QAAxB,WAAwB;AAAA,QAAX,OAAW,QAAX,OAAW;;AACnD,QAAM,cAAc,WAAW,QAAQ,WAAvC;AACA,QAAM,SAAS,EAAf;;AAEA,QAAI,QAAQ,WAAZ,EAAyB;AACvB,aAAO,IAAP,GAAc,YAAY,IAAZ,GAAoB,KAAK,KAAL,GAAc,YAAY,IAA5D;AACA,aAAO,GAAP,GAAc,YAAY,GAAZ,GAAoB,KAAK,MAAL,GAAc,YAAY,GAA5D;;AAEA,aAAO,KAAP,GAAgB,YAAY,KAAZ,GAAsB,KAAK,KAAL,IAAe,IAAI,YAAY,KAA/B,CAAtC;AACA,aAAO,MAAP,GAAgB,YAAY,MAAZ,GAAsB,KAAK,MAAL,IAAe,IAAI,YAAY,MAA/B,CAAtC;AACD,KAND,MAOK;AACH,aAAO,IAAP,GAAc,OAAO,GAAP,GAAa,OAAO,KAAP,GAAe,OAAO,MAAP,GAAgB,CAA1D;AACD;;AAED,WAAO,MAAP;AACD,GAxBc;;AA0Bf,OAAK,oBAAwD;AAAA,QAA5C,UAA4C,SAA5C,UAA4C;AAAA,QAAhC,WAAgC,SAAhC,WAAgC;AAAA,QAAnB,MAAmB,SAAnB,MAAmB;AAAA,QAAX,OAAW,SAAX,OAAW;;AAC3D,QAAI,CAAC,OAAL,EAAc;AAAE,aAAO,MAAP;AAAgB;;AAEhC,QAAM,OAAO,OAAO,WAAP,GACT,EAAE,GAAG,OAAO,CAAZ,EAAe,GAAG,OAAO,CAAzB,EADS,GAET,MAAM,MAAN,CAAa,EAAb,EAAiB,UAAjB,CAFJ;;AAIA,QAAM,cAAc,mBAAmB,QAAQ,WAA3B,EAAwC,WAAxC,EAAqD,IAArD,CAApB;;AAEA,QAAI,CAAC,WAAL,EAAkB;AAAE,aAAO,MAAP;AAAgB;;AAEpC,WAAO,EAAP,GAAY,CAAZ;AACA,WAAO,EAAP,GAAY,CAAZ;AACA,WAAO,MAAP,GAAgB,KAAhB;;AAEA,QAAM,OAAO,WAAb;AACA,QAAI,YAAY,KAAK,CAArB;AACA,QAAI,YAAY,KAAK,CAArB;;AAEA,QAAM,SAAS,YAAY,eAAZ,CAA4B,QAA3C;;AAEA;AACA;AACA;AACA,QAAI,OAAO,WAAP,IAAsB,OAAO,WAAjC,EAA8C;AAC5C,kBAAY,KAAK,GAAL,CAAS,KAAK,GAAL,CAAS,KAAK,CAAL,GAAS,KAAK,KAAd,GAAuB,OAAO,KAAvC,EAA+C,KAAK,CAApD,CAAT,EAAiE,KAAK,CAAL,GAAS,OAAO,IAAjF,CAAZ;AACA,kBAAY,KAAK,GAAL,CAAS,KAAK,GAAL,CAAS,KAAK,CAAL,GAAS,KAAK,MAAd,GAAuB,OAAO,MAAvC,EAA+C,KAAK,CAApD,CAAT,EAAiE,KAAK,CAAL,GAAS,OAAO,GAAjF,CAAZ;AACD,KAHD,MAIK;AACH,kBAAY,KAAK,GAAL,CAAS,KAAK,GAAL,CAAS,KAAK,KAAL,GAAc,OAAO,KAA9B,EAAsC,KAAK,CAA3C,CAAT,EAAwD,KAAK,IAAL,GAAY,OAAO,IAA3E,CAAZ;AACA,kBAAY,KAAK,GAAL,CAAS,KAAK,GAAL,CAAS,KAAK,MAAL,GAAc,OAAO,MAA9B,EAAsC,KAAK,CAA3C,CAAT,EAAwD,KAAK,GAAL,GAAY,OAAO,GAA3E,CAAZ;AACD;;AAED,WAAO,EAAP,GAAY,YAAY,KAAK,CAA7B;AACA,WAAO,EAAP,GAAY,YAAY,KAAK,CAA7B;;AAEA,WAAO,OAAP,GAAiB,OAAO,SAAP,KAAqB,SAArB,IAAkC,OAAO,SAAP,KAAqB,SAAxE;AACA,WAAO,MAAP,GAAgB,CAAC,EAAE,OAAO,EAAP,IAAa,OAAO,EAAtB,CAAjB;;AAEA,WAAO,SAAP,GAAmB,SAAnB;AACA,WAAO,SAAP,GAAmB,SAAnB;AACD,GAnEc;;AAqEf,gBAAc,6BAAoD;AAAA,QAAxC,IAAwC,SAAxC,IAAwC;AAAA,QAAlC,MAAkC,SAAlC,MAAkC;AAAA,QAA1B,MAA0B,SAA1B,MAA0B;AAAA,QAAlB,KAAkB,SAAlB,KAAkB;AAAA,QAAX,OAAW,SAAX,OAAW;;AAChE,QAAM,cAAc,WAAW,QAAQ,WAAvC;;AAEA,QAAI,WAAW,QAAQ,OAAnB,IACG,EAAE,UAAU,OAAV,IAAqB,WAArB,IAAoC,OAAO,MAA7C,CADP,EAC6D;;AAE3D,UAAI,OAAO,MAAX,EAAmB;AACjB,aAAK,CAAL,IAAU,OAAO,EAAjB;AACA,aAAK,CAAL,IAAU,OAAO,EAAjB;AACA,eAAO,CAAP,IAAY,OAAO,EAAnB;AACA,eAAO,CAAP,IAAY,OAAO,EAAnB;;AAEA,eAAO;AACL,cAAI,OAAO,EADN;AAEL,cAAI,OAAO;AAFN,SAAP;AAID;AACF;AACF,GAvFc;;AAyFf;AAzFe,CAAjB;;AA4FA,SAAS,kBAAT,CAA6B,KAA7B,EAAoC,WAApC,EAAiD,IAAjD,EAAuD;AACrD,MAAI,MAAM,EAAN,CAAS,QAAT,CAAkB,KAAlB,CAAJ,EAA8B;AAC5B,WAAO,MAAM,eAAN,CAAsB,KAAtB,EAA6B,YAAY,MAAzC,EAAiD,YAAY,OAA7D,EAAsE,CAAC,KAAK,CAAN,EAAS,KAAK,CAAd,EAAiB,WAAjB,CAAtE,CAAP;AACD,GAFD,MAEO;AACL,WAAO,MAAM,eAAN,CAAsB,KAAtB,EAA6B,YAAY,MAAzC,EAAiD,YAAY,OAA7D,CAAP;AACD;AACF;;AAED,UAAU,QAAV,GAAqB,QAArB;AACA,UAAU,KAAV,CAAgB,IAAhB,CAAqB,UAArB;;AAEA,eAAe,SAAf,CAAyB,QAAzB,GAAoC,SAAS,QAA7C;;AAEA,OAAO,OAAP,GAAiB,QAAjB;;;;;AC7GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,IAAM,YAAiB,QAAQ,SAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,UAAR,CAAvB;AACA,IAAM,YAAiB,QAAQ,eAAR,CAAvB;AACA,IAAM,iBAAiB,QAAQ,mBAAR,CAAvB;AACA,IAAM,SAAiB,QAAQ,mBAAR,CAAvB;;eAE+B,QAAQ,YAAR,C;IAAvB,kB,YAAA,kB;;AAER,IAAM,UAAU,EAAE,KAAK,CAAC,QAAR,EAAkB,MAAM,CAAC,QAAzB,EAAmC,QAAQ,CAAC,QAA5C,EAAsD,OAAO,CAAC,QAA9D,EAAhB;AACA,IAAM,UAAU,EAAE,KAAK,CAAC,QAAR,EAAkB,MAAM,CAAC,QAAzB,EAAmC,QAAQ,CAAC,QAA5C,EAAsD,OAAO,CAAC,QAA9D,EAAhB;;AAEA,IAAM,gBAAgB;AACpB,YAAU;AACR,aAAS,KADD;AAER,aAAS,KAFD;AAGR,SAAK,IAHG;AAIR,SAAK,IAJG;AAKR,YAAQ;AALA,GADU;;AASpB,aAAW,yBAAiD;AAAA,QAArC,WAAqC,QAArC,WAAqC;AAAA,QAAxB,WAAwB,QAAxB,WAAwB;AAAA,QAAX,OAAW,QAAX,OAAW;;AAC1D,QAAI,CAAC,OAAL,EAAc;AACZ,aAAO,MAAM,MAAN,CAAa,EAAb,EAAiB,WAAjB,CAAP;AACD;;AAED,QAAM,SAAS,mBAAmB,QAAQ,MAA3B,EAAmC,WAAnC,EAAgD,YAAY,WAAZ,CAAwB,IAAxE,CAAf;;AAEA,QAAI,MAAJ,EAAY;AACV,aAAO;AACL,aAAQ,YAAY,GAAZ,GAAqB,OAAO,CAD/B;AAEL,cAAQ,YAAY,IAAZ,GAAqB,OAAO,CAF/B;AAGL,gBAAQ,YAAY,MAAZ,GAAqB,OAAO,CAH/B;AAIL,eAAQ,YAAY,KAAZ,GAAqB,OAAO;AAJ/B,OAAP;AAMD;;AAED,WAAO,WAAP;AACD,GA1BmB;;AA4BpB,OAAK,oBAAgE;AAAA,QAApD,UAAoD,SAApD,UAAoD;AAAA,QAAxC,WAAwC,SAAxC,WAAwC;AAAA,QAA3B,MAA2B,SAA3B,MAA2B;AAAA,QAAnB,MAAmB,SAAnB,MAAmB;AAAA,QAAX,OAAW,SAAX,OAAW;;AACnE,QAAM,QAAQ,YAAY,QAAZ,CAAqB,WAArB,IAAoC,YAAY,QAAZ,CAAqB,KAAvE;;AAEA,QAAI,CAAC,YAAY,WAAZ,EAAD,IAA8B,CAAC,KAAnC,EAA0C;AACxC;AACD;;AAED,QAAM,OAAO,OAAO,WAAP,GACT,EAAE,GAAG,OAAO,CAAZ,EAAe,GAAG,OAAO,CAAzB,EADS,GAET,MAAM,MAAN,CAAa,EAAb,EAAiB,UAAjB,CAFJ;AAGA,QAAM,QAAQ,UAAU,UAAV,CAAqB,mBAAmB,QAAQ,KAA3B,EAAkC,WAAlC,EAA+C,IAA/C,CAArB,KAA8E,OAA5F;AACA,QAAM,QAAQ,UAAU,UAAV,CAAqB,mBAAmB,QAAQ,KAA3B,EAAkC,WAAlC,EAA+C,IAA/C,CAArB,KAA8E,OAA5F;;AAEA,QAAI,YAAY,KAAK,CAArB;AACA,QAAI,YAAY,KAAK,CAArB;;AAEA,WAAO,EAAP,GAAY,CAAZ;AACA,WAAO,EAAP,GAAY,CAAZ;AACA,WAAO,MAAP,GAAgB,KAAhB;;AAEA,QAAI,MAAM,GAAV,EAAe;AACb,kBAAY,KAAK,GAAL,CAAS,KAAK,GAAL,CAAS,MAAM,GAAN,GAAe,OAAO,GAA/B,EAAuC,KAAK,CAA5C,CAAT,EAAyD,MAAM,GAAN,GAAe,OAAO,GAA/E,CAAZ;AACD,KAFD,MAGK,IAAI,MAAM,MAAV,EAAkB;AACrB,kBAAY,KAAK,GAAL,CAAS,KAAK,GAAL,CAAS,MAAM,MAAN,GAAe,OAAO,MAA/B,EAAuC,KAAK,CAA5C,CAAT,EAAyD,MAAM,MAAN,GAAe,OAAO,MAA/E,CAAZ;AACD;AACD,QAAI,MAAM,IAAV,EAAgB;AACd,kBAAY,KAAK,GAAL,CAAS,KAAK,GAAL,CAAS,MAAM,IAAN,GAAe,OAAO,IAA/B,EAAuC,KAAK,CAA5C,CAAT,EAAyD,MAAM,IAAN,GAAe,OAAO,IAA/E,CAAZ;AACD,KAFD,MAGK,IAAI,MAAM,KAAV,EAAiB;AACpB,kBAAY,KAAK,GAAL,CAAS,KAAK,GAAL,CAAS,MAAM,KAAN,GAAe,OAAO,KAA/B,EAAuC,KAAK,CAA5C,CAAT,EAAyD,MAAM,KAAN,GAAe,OAAO,KAA/E,CAAZ;AACD;;AAED,WAAO,EAAP,GAAY,YAAY,KAAK,CAA7B;AACA,WAAO,EAAP,GAAY,YAAY,KAAK,CAA7B;;AAEA,WAAO,OAAP,GAAiB,OAAO,SAAP,KAAqB,SAArB,IAAkC,OAAO,SAAP,KAAqB,SAAxE;AACA,WAAO,MAAP,GAAgB,CAAC,EAAE,OAAO,EAAP,IAAa,OAAO,EAAtB,CAAjB;;AAEA,WAAO,SAAP,GAAmB,SAAnB;AACA,WAAO,SAAP,GAAmB,SAAnB;AACD,GArEmB;;AAuEpB,gBAAc,6BAAoD;AAAA,QAAxC,IAAwC,SAAxC,IAAwC;AAAA,QAAlC,MAAkC,SAAlC,MAAkC;AAAA,QAA1B,MAA0B,SAA1B,MAA0B;AAAA,QAAlB,KAAkB,SAAlB,KAAkB;AAAA,QAAX,OAAW,SAAX,OAAW;;AAChE,QAAI,WAAW,QAAQ,OAAnB,IACG,EAAE,UAAU,OAAV,IAAqB,OAAO,MAA9B,CADP,EAC8C;;AAE5C,UAAI,OAAO,MAAX,EAAmB;AACjB,aAAK,CAAL,IAAU,OAAO,EAAjB;AACA,aAAK,CAAL,IAAU,OAAO,EAAjB;AACA,eAAO,CAAP,IAAY,OAAO,EAAnB;AACA,eAAO,CAAP,IAAY,OAAO,EAAnB;;AAEA,eAAO;AACL,cAAI,OAAO,EADN;AAEL,cAAI,OAAO;AAFN,SAAP;AAID;AACF;AACF,GAvFmB;;AAyFpB,kBAzFoB;AA0FpB,kBA1FoB;AA2FpB;AA3FoB,CAAtB;;AA8FA,UAAU,aAAV,GAA0B,aAA1B;AACA,UAAU,KAAV,CAAgB,IAAhB,CAAqB,eAArB;;AAEA,eAAe,SAAf,CAAyB,aAAzB,GAAyC,cAAc,QAAvD;AACA,OAAO,QAAP,CAAgB,aAAhB,GAAyC,cAAc,QAAvD;;AAEA,OAAO,OAAP,GAAiB,aAAjB;;;;;AC1HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,IAAM,YAAiB,QAAQ,SAAR,CAAvB;AACA,IAAM,gBAAiB,QAAQ,iBAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,UAAR,CAAvB;AACA,IAAM,YAAiB,QAAQ,eAAR,CAAvB;AACA,IAAM,iBAAiB,QAAQ,mBAAR,CAAvB;AACA,IAAM,SAAiB,QAAQ,mBAAR,CAAvB;;AAEA,IAAM,QAAQ,EAAE,OAAO,CAAC,QAAV,EAAoB,QAAQ,CAAC,QAA7B,EAAd;AACA,IAAM,QAAQ,EAAE,OAAO,CAAC,QAAV,EAAoB,QAAQ,CAAC,QAA7B,EAAd;;AAEA,IAAM,eAAe;AACnB,YAAU;AACR,aAAS,KADD;AAER,aAAS,KAFD;AAGR,SAAK,IAHG;AAIR,SAAK;AAJG,GADS;;AAQnB,aAAW,yBAA2B;AAAA,QAAf,WAAe,QAAf,WAAe;;AACpC,WAAO,YAAY,WAAnB;AACD,GAVkB;;AAYnB,OAAK,aAAU,GAAV,EAAe;AAAA,QACV,WADU,GACe,GADf,CACV,WADU;AAAA,QACG,OADH,GACe,GADf,CACG,OADH;;AAElB,QAAM,QAAQ,YAAY,QAAZ,CAAqB,WAArB,IAAoC,YAAY,QAAZ,CAAqB,KAAvE;;AAEA,QAAI,CAAC,YAAY,WAAZ,EAAD,IAA8B,CAAC,KAAnC,EAA0C;AACxC;AACD;;AAED,QAAM,OAAO,UAAU,UAAV,CAAqB,YAAY,WAAZ,CAAwB,QAA7C,CAAb;;AAEA,QAAM,UAAU,UAAU,UAAV,CAAqB,cAAc,kBAAd,CAAiC,QAAQ,GAAzC,EAA8C,WAA9C,CAArB,KAAoF,KAApG;AACA,QAAM,UAAU,UAAU,UAAV,CAAqB,cAAc,kBAAd,CAAiC,QAAQ,GAAzC,EAA8C,WAA9C,CAArB,KAAoF,KAApG;;AAEA,QAAI,OAAJ,GAAc;AACZ,eAAS,QAAQ,OADL;AAEZ,eAAS,QAAQ,OAFL;AAGZ,aAAO,MAAM,MAAN,CAAa,EAAb,EAAiB,cAAc,OAA/B,CAHK;AAIZ,aAAO,MAAM,MAAN,CAAa,EAAb,EAAiB,cAAc,OAA/B;AAJK,KAAd;;AAOA,QAAI,MAAM,GAAV,EAAe;AACb,UAAI,OAAJ,CAAY,KAAZ,CAAkB,GAAlB,GAAwB,KAAK,MAAL,GAAc,QAAQ,MAA9C;AACA,UAAI,OAAJ,CAAY,KAAZ,CAAkB,GAAlB,GAAwB,KAAK,MAAL,GAAc,QAAQ,MAA9C;AACD,KAHD,MAIK,IAAI,MAAM,MAAV,EAAkB;AACrB,UAAI,OAAJ,CAAY,KAAZ,CAAkB,MAAlB,GAA2B,KAAK,GAAL,GAAW,QAAQ,MAA9C;AACA,UAAI,OAAJ,CAAY,KAAZ,CAAkB,MAAlB,GAA2B,KAAK,GAAL,GAAW,QAAQ,MAA9C;AACD;AACD,QAAI,MAAM,IAAV,EAAgB;AACd,UAAI,OAAJ,CAAY,KAAZ,CAAkB,IAAlB,GAAyB,KAAK,KAAL,GAAa,QAAQ,KAA9C;AACA,UAAI,OAAJ,CAAY,KAAZ,CAAkB,IAAlB,GAAyB,KAAK,KAAL,GAAa,QAAQ,KAA9C;AACD,KAHD,MAIK,IAAI,MAAM,KAAV,EAAiB;AACpB,UAAI,OAAJ,CAAY,KAAZ,CAAkB,KAAlB,GAA0B,KAAK,IAAL,GAAY,QAAQ,KAA9C;AACA,UAAI,OAAJ,CAAY,KAAZ,CAAkB,KAAlB,GAA0B,KAAK,IAAL,GAAY,QAAQ,KAA9C;AACD;;AAED,kBAAc,GAAd,CAAkB,GAAlB;AACD,GAlDkB;;AAoDnB,gBAAc,cAAc;AApDT,CAArB;;AAuDA,UAAU,YAAV,GAAyB,YAAzB;AACA,UAAU,KAAV,CAAgB,IAAhB,CAAqB,cAArB;;AAEA,eAAe,SAAf,CAAyB,YAAzB,GAAwC,aAAa,QAArD;AACA,OAAO,QAAP,CAAgB,YAAhB,GAAwC,aAAa,QAArD;;AAEA,OAAO,OAAP,GAAiB,YAAjB;;;;;AClFA,IAAM,YAAiB,QAAQ,SAAR,CAAvB;AACA,IAAM,WAAiB,QAAQ,aAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,UAAR,CAAvB;AACA,IAAM,iBAAiB,QAAQ,mBAAR,CAAvB;;AAEA,IAAM,OAAO;AACX,YAAU;AACR,aAAS,KADD;AAER,aAAS,KAFD;AAGR,WAAS,QAHD;AAIR,aAAS,IAJD;AAKR,aAAS,IALD;;AAOR,oBAAgB;AAPR,GADC;;AAWX,aAAW,yBAA8E;AAAA,QAAlE,WAAkE,QAAlE,WAAkE;AAAA,QAArD,YAAqD,QAArD,YAAqD;AAAA,QAAvC,OAAuC,QAAvC,OAAuC;AAAA,QAA9B,IAA8B,QAA9B,IAA8B;AAAA,QAAxB,WAAwB,QAAxB,WAAwB;AAAA,QAAX,OAAW,QAAX,OAAW;;AACvF,QAAM,UAAU,EAAhB;AACA,QAAM,gBAAgB,MAAM,QAAN,CAAe,MAAM,eAAN,CAAsB,QAAQ,MAA9B,CAAf,CAAtB;AACA,QAAM,SAAS,iBAAiB,MAAM,WAAN,CAAkB,YAAlB,EAAgC,OAAhC,EAAyC,YAAY,QAAZ,CAAqB,IAA9D,CAAhC;AACA,cAAU,WAAW,aAAa,OAAb,CAAqB,YAAY,QAAZ,CAAqB,IAA1C,EAAgD,IAA3D,IAAmE,EAA7E;;AAEA,QAAI,mBAAJ;;AAEA,QAAI,QAAQ,MAAR,KAAmB,aAAvB,EAAsC;AACpC,mBAAa;AACX,WAAG,YAAY,WAAZ,CAAwB,IAAxB,CAA6B,CAA7B,GAAiC,OAAO,CADhC;AAEX,WAAG,YAAY,WAAZ,CAAwB,IAAxB,CAA6B,CAA7B,GAAiC,OAAO;AAFhC,OAAb;AAID,KALD,MAMM;AACJ,UAAM,aAAa,MAAM,eAAN,CAAsB,QAAQ,MAA9B,EAAsC,YAAtC,EAAoD,OAApD,EAA6D,CAAC,WAAD,CAA7D,CAAnB;;AAEA,mBAAa,MAAM,QAAN,CAAe,UAAf,KAA8B,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EAA3C;AACD;;AAED,QAAI,QAAQ,QAAQ,cAAhB,IAAkC,QAAQ,cAAR,CAAuB,MAA7D,EAAqE;AACnE,2BAA6C,QAAQ,cAArD,kHAAqE;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,YAArD,SAAqD,SAAxD,CAAwD;AAAA,YAAvC,SAAuC,SAA1C,CAA0C;;AACnE,gBAAQ,IAAR,CAAa;AACX,aAAG,YAAY,IAAZ,GAAoB,KAAK,KAAL,GAAc,SAAlC,GAA+C,WAAW,CADlD;AAEX,aAAG,YAAY,GAAZ,GAAoB,KAAK,MAAL,GAAc,SAAlC,GAA+C,WAAW;AAFlD,SAAb;AAID;AACF,KAPD,MAQK;AACH,cAAQ,IAAR,CAAa,UAAb;AACD;;AAED,WAAO,OAAP;AACD,GA5CU;;AA8CX,OAAK,oBAAyE;AAAA,QAA7D,WAA6D,SAA7D,WAA6D;AAAA,QAAhD,UAAgD,SAAhD,UAAgD;AAAA,QAApC,MAAoC,SAApC,MAAoC;AAAA,QAA5B,OAA4B,SAA5B,OAA4B;AAAA,QAAX,OAAW,SAAnB,MAAmB;;AAC5E,QAAM,UAAU,EAAhB;AACA,QAAI,eAAJ;AACA,QAAI,aAAJ;AACA,QAAI,UAAJ;;AAEA,QAAI,OAAO,WAAX,EAAwB;AACtB,aAAO,EAAE,GAAG,OAAO,CAAZ,EAAe,GAAG,OAAO,CAAzB,EAAP;AACD,KAFD,MAGK;AACH,UAAM,SAAS,MAAM,WAAN,CAAkB,YAAY,MAA9B,EAAsC,YAAY,OAAlD,EAA2D,YAAY,QAAZ,CAAqB,IAAhF,CAAf;;AAEA,aAAO,MAAM,MAAN,CAAa,EAAb,EAAiB,UAAjB,CAAP;;AAEA,WAAK,CAAL,IAAU,OAAO,CAAjB;AACA,WAAK,CAAL,IAAU,OAAO,CAAjB;AACD;;AAED,WAAO,KAAP,GAAe,KAAK,CAApB;AACA,WAAO,KAAP,GAAe,KAAK,CAApB;;AAEA,QAAI,MAAM,QAAQ,OAAR,GAAiB,QAAQ,OAAR,CAAgB,MAAjC,GAA0C,CAApD;;AAEA,0BAAyC,OAAzC,yHAAkD;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,UAAlC,OAAkC,SAArC,CAAqC;AAAA,UAAtB,OAAsB,SAAzB,CAAyB;;AAChD,UAAM,YAAY,KAAK,CAAL,GAAS,OAA3B;AACA,UAAM,YAAY,KAAK,CAAL,GAAS,OAA3B;;AAEA,4BAAyB,QAAQ,OAAjC,yHAA0C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,YAA/B,UAA+B;;AACxC,YAAI,MAAM,EAAN,CAAS,QAAT,CAAkB,UAAlB,CAAJ,EAAmC;AACjC,mBAAS,WAAW,SAAX,EAAsB,SAAtB,EAAiC,WAAjC,CAAT;AACD,SAFD,MAGK;AACH,mBAAS,UAAT;AACD;;AAED,YAAI,CAAC,MAAL,EAAa;AAAE;AAAW;;AAE1B,gBAAQ,IAAR,CAAa;AACX,aAAG,MAAM,EAAN,CAAS,MAAT,CAAgB,OAAO,CAAvB,IAA6B,OAAO,CAAP,GAAW,OAAxC,GAAmD,SAD3C;AAEX,aAAG,MAAM,EAAN,CAAS,MAAT,CAAgB,OAAO,CAAvB,IAA6B,OAAO,CAAP,GAAW,OAAxC,GAAmD,SAF3C;;AAIX,iBAAO,MAAM,EAAN,CAAS,MAAT,CAAgB,OAAO,KAAvB,IAA+B,OAAO,KAAtC,GAA6C,QAAQ;AAJjD,SAAb;AAMD;AACF;;AAED,QAAM,UAAU;AACd,cAAQ,IADM;AAEd,eAAS,KAFK;AAGd,gBAAU,CAHI;AAId,aAAO,CAJO;AAKd,UAAI,CALU;AAMd,UAAI;AANU,KAAhB;;AASA,SAAK,IAAI,CAAJ,EAAO,MAAM,QAAQ,MAA1B,EAAkC,IAAI,GAAtC,EAA2C,GAA3C,EAAgD;AAC9C,eAAS,QAAQ,CAAR,CAAT;;AAEA,UAAM,QAAQ,OAAO,KAArB;AACA,UAAM,KAAK,OAAO,CAAP,GAAW,KAAK,CAA3B;AACA,UAAM,KAAK,OAAO,CAAP,GAAW,KAAK,CAA3B;AACA,UAAM,WAAW,MAAM,KAAN,CAAY,EAAZ,EAAgB,EAAhB,CAAjB;AACA,UAAI,UAAU,YAAY,KAA1B;;AAEA;AACA;AACA,UAAI,UAAU,QAAV,IAAsB,QAAQ,OAA9B,IAAyC,QAAQ,KAAR,KAAkB,QAA/D,EAAyE;AACvE,kBAAU,KAAV;AACD;;AAED,UAAI,CAAC,QAAQ,MAAT,KAAoB;AACpB;AADoB,QAEjB,QAAQ,OAAR,IAAmB,UAAU;AAChC;AADG,QAED,WAAW,KAAX,GAAmB,QAAQ,QAAR,GAAmB,QAAQ;AAChD;AAHG,QAIA,UAAU,QAAV,IAAsB,QAAQ,KAAR,KAAkB,QAAzC;AACF;AACC,iBAAW,QAAQ,QARA;AASpB;AACG,OAAC,QAAQ,OAAT,IAAoB,WAAW,QAAQ,QAV1C,CAAJ,EAU0D;;AAExD,gBAAQ,MAAR,GAAiB,MAAjB;AACA,gBAAQ,QAAR,GAAmB,QAAnB;AACA,gBAAQ,KAAR,GAAgB,KAAhB;AACA,gBAAQ,OAAR,GAAkB,OAAlB;AACA,gBAAQ,EAAR,GAAa,EAAb;AACA,gBAAQ,EAAR,GAAa,EAAb;;AAEA,eAAO,KAAP,GAAe,KAAf;AACD;AACF;;AAED,QAAI,oBAAJ;;AAEA,QAAI,QAAQ,MAAZ,EAAoB;AAClB,oBAAe,OAAO,SAAP,KAAqB,QAAQ,MAAR,CAAe,CAApC,IAAyC,OAAO,SAAP,KAAqB,QAAQ,MAAR,CAAe,CAA5F;;AAEA,aAAO,SAAP,GAAmB,QAAQ,MAAR,CAAe,CAAlC;AACA,aAAO,SAAP,GAAmB,QAAQ,MAAR,CAAe,CAAlC;AACD,KALD,MAMK;AACH,oBAAc,IAAd;;AAEA,aAAO,SAAP,GAAmB,GAAnB;AACA,aAAO,SAAP,GAAmB,GAAnB;AACD;;AAED,WAAO,EAAP,GAAY,QAAQ,EAApB;AACA,WAAO,EAAP,GAAY,QAAQ,EAApB;;AAEA,WAAO,OAAP,GAAkB,eAAgB,QAAQ,OAAR,IAAmB,CAAC,OAAO,MAA7D;AACA,WAAO,MAAP,GAAgB,QAAQ,OAAxB;AACD,GA/JU;;AAiKX,gBAAc,6BAAoD;AAAA,QAAxC,IAAwC,SAAxC,IAAwC;AAAA,QAAlC,MAAkC,SAAlC,MAAkC;AAAA,QAA1B,MAA0B,SAA1B,MAA0B;AAAA,QAAlB,KAAkB,SAAlB,KAAkB;AAAA,QAAX,OAAW,SAAX,OAAW;;AAChE,QAAM,iBAAiB,WAAW,QAAQ,cAA1C;;AAEA,QAAI,WAAW,QAAQ,OAAnB,IACG,EAAE,UAAU,OAAV,IAAqB,cAArB,IAAuC,eAAe,MAAxD,CADP,EACwE;;AAEtE,UAAI,OAAO,MAAX,EAAmB;AACjB,aAAK,CAAL,IAAU,OAAO,EAAjB;AACA,aAAK,CAAL,IAAU,OAAO,EAAjB;AACA,eAAO,CAAP,IAAY,OAAO,EAAnB;AACA,eAAO,CAAP,IAAY,OAAO,EAAnB;AACD;;AAED,aAAO;AACL,eAAS,OAAO,KADX;AAEL,gBAAS,OAAO,MAFX;AAGL,WAAS,OAAO,SAHX;AAIL,WAAS,OAAO,SAJX;AAKL,eAAS,OAAO,KALX;AAML,eAAS,OAAO,KANX;AAOL,YAAS,OAAO,EAPX;AAQL,YAAS,OAAO;AARX,OAAP;AAUD;AACF;AAzLU,CAAb;;AA4LA,SAAS,cAAT,GAA0B,UAAU,IAAV,EAAgB;AACxC,SAAO,UAAU,CAAV,EAAa,CAAb,EAAgB;AACrB,QAAM,SAAS,KAAK,MAAL,IAAe;AAC5B,YAAQ,CAAC,QADmB;AAE5B,aAAS,QAFmB;AAG5B,WAAQ,CAAC,QAHmB;AAI5B,cAAS;AAJmB,KAA9B;AAMA,QAAI,UAAU,CAAd;AACA,QAAI,UAAU,CAAd;;AAEA,QAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,KAAK,MAArB,CAAJ,EAAkC;AAChC,gBAAU,KAAK,MAAL,CAAY,CAAtB;AACA,gBAAU,KAAK,MAAL,CAAY,CAAtB;AACD;;AAED,QAAM,QAAQ,KAAK,KAAL,CAAW,CAAC,IAAI,OAAL,IAAgB,KAAK,CAAhC,CAAd;AACA,QAAM,QAAQ,KAAK,KAAL,CAAW,CAAC,IAAI,OAAL,IAAgB,KAAK,CAAhC,CAAd;;AAEA,QAAM,OAAO,KAAK,GAAL,CAAS,OAAO,IAAhB,EAAsB,KAAK,GAAL,CAAS,OAAO,KAAhB,EAAwB,QAAQ,KAAK,CAAb,GAAiB,OAAzC,CAAtB,CAAb;AACA,QAAM,OAAO,KAAK,GAAL,CAAS,OAAO,GAAhB,EAAsB,KAAK,GAAL,CAAS,OAAO,MAAhB,EAAwB,QAAQ,KAAK,CAAb,GAAiB,OAAzC,CAAtB,CAAb;;AAEA,WAAO;AACL,SAAG,IADE;AAEL,SAAG,IAFE;AAGL,aAAO,KAAK;AAHP,KAAP;AAKD,GA1BD;AA2BD,CA5BD;;AA8BA,UAAU,IAAV,GAAiB,IAAjB;AACA,UAAU,KAAV,CAAgB,IAAhB,CAAqB,MAArB;;AAEA,eAAe,SAAf,CAAyB,IAAzB,GAAgC,KAAK,QAArC;;AAEA,OAAO,OAAP,GAAiB,IAAjB;;;;;ACpOA;AACA;;AAEA,IAAM,YAAiB,QAAQ,SAAR,CAAvB;AACA,IAAM,OAAiB,QAAQ,QAAR,CAAvB;AACA,IAAM,iBAAiB,QAAQ,mBAAR,CAAvB;AACA,IAAM,SAAiB,QAAQ,mBAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,WAAR,CAAvB;;AAEA,IAAM,WAAW;AACf,YAAU;AACR,aAAS,KADD;AAER,aAAS,KAFD;AAGR,WAAS,QAHD;AAIR,aAAS,IAJD;AAKR,aAAS;AALD,GADK;;AASf,aAAW,mBAAU,GAAV,EAAe;AAAA,QAChB,WADgB,GACS,GADT,CAChB,WADgB;AAAA,QACH,OADG,GACS,GADT,CACH,OADG;;AAExB,QAAM,QAAQ,YAAY,QAAZ,CAAqB,KAAnC;;AAEA,QAAI,CAAC,KAAL,EAAY;AAAE;AAAS;;AAEvB,QAAI,OAAJ,GAAc;AACZ,sBAAgB,CAAC;AACf,WAAG,MAAM,IAAN,GAAY,CAAZ,GAAgB,CADJ;AAEf,WAAG,MAAM,GAAN,GAAY,CAAZ,GAAgB;AAFJ,OAAD,CADJ;AAKZ,cAAQ,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EALI;AAMZ,cAAQ,MANI;AAOZ,aAAO,QAAQ;AAPH,KAAd;;AAUA,QAAM,UAAU,KAAK,SAAL,CAAe,GAAf,CAAhB;AACA,QAAI,OAAJ,GAAc,OAAd;;AAEA,WAAO,OAAP;AACD,GA7Bc;;AA+Bf,OAAK,aAAU,GAAV,EAAe;AAAA,QACV,WADU,GACmC,GADnC,CACV,WADU;AAAA,QACG,OADH,GACmC,GADnC,CACG,OADH;AAAA,QACY,MADZ,GACmC,GADnC,CACY,MADZ;AAAA,QACoB,UADpB,GACmC,GADnC,CACoB,UADpB;;AAElB,QAAM,OAAO,MAAM,MAAN,CAAa,EAAb,EAAiB,UAAjB,CAAb;AACA,QAAM,YAAY,KAAK,CAAL,GAAS,OAAO,CAAP,EAAU,CAArC;AACA,QAAM,YAAY,KAAK,CAAL,GAAS,OAAO,CAAP,EAAU,CAArC;;AAEA,QAAI,OAAJ,GAAc,MAAM,MAAN,CAAa,EAAb,EAAiB,OAAjB,CAAd;AACA,QAAI,OAAJ,CAAY,OAAZ,GAAsB,EAAtB;;AAEA,yBAAyB,QAAQ,OAAjC,kHAA0C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAA/B,UAA+B;;AACxC,UAAI,eAAJ;;AAEA,UAAI,MAAM,EAAN,CAAS,QAAT,CAAkB,UAAlB,CAAJ,EAAmC;AACjC,iBAAS,WAAW,SAAX,EAAsB,SAAtB,EAAiC,WAAjC,CAAT;AACD,OAFD,MAGK;AACH,iBAAS,UAAT;AACD;;AAED,UAAI,CAAC,MAAL,EAAa;AAAE;AAAW;;AAE1B,UAAI,WAAW,MAAX,IAAqB,YAAY,MAArC,EAA6C;AAC3C,eAAO,CAAP,GAAW,OAAO,KAAlB;AACA,eAAO,CAAP,GAAW,OAAO,MAAlB;AACD;;AAED,UAAI,OAAJ,CAAY,OAAZ,CAAoB,IAApB,CAAyB,MAAzB;AACD;;AAED,SAAK,GAAL,CAAS,GAAT;AACD,GA7Dc;;AA+Df,gBAAc,sBAAU,GAAV,EAAe;AAAA,QACnB,OADmB,GACP,GADO,CACnB,OADmB;;;AAG3B,QAAI,OAAJ,GAAc,MAAM,MAAN,CAAa,EAAb,EAAiB,OAAjB,CAAd;AACA,QAAI,OAAJ,CAAY,OAAZ,GAAsB,QAAQ,OAA9B;AACA,QAAI,OAAJ,CAAY,cAAZ,GAA6B,CAAC,IAAD,CAA7B;;AAEA,SAAK,YAAL,CAAkB,GAAlB;AACD;AAvEc,CAAjB;;AA0EA,UAAU,QAAV,GAAqB,QAArB;AACA,UAAU,KAAV,CAAgB,IAAhB,CAAqB,UAArB;;AAEA,eAAe,SAAf,CAAyB,QAAzB,GAAoC,SAAS,QAA7C;AACA,OAAO,QAAP,CAAgB,QAAhB,GAAoC,SAAS,QAA7C;;AAEA,OAAO,OAAP,GAAiB,QAAjB;;;;;;;ACzFA,IAAM,eAAe,QAAQ,uBAAR,CAArB;;AAEA,OAAO,OAAP;AACE,wBAAa,IAAb,EAAmB,OAAnB,EAA4B,KAA5B,EAAmC,WAAnC,EAAgD,WAAhD,EAA6D;AAAA;;AAC3D,iBAAa,aAAb,CAA2B,IAA3B,EAAiC,KAAjC;;AAEA,QAAI,UAAU,OAAd,EAAuB;AACrB,mBAAa,aAAb,CAA2B,IAA3B,EAAiC,OAAjC;AACD;;AAED,SAAK,WAAL,GAAmB,WAAnB;;AAEA,SAAK,SAAL,GAAqB,IAAI,IAAJ,GAAW,OAAX,EAArB;AACA,SAAK,aAAL,GAAqB,KAArB;AACA,SAAK,IAAL,GAAqB,IAArB;AACA,SAAK,SAAL,GAAqB,aAAa,YAAb,CAA0B,OAA1B,CAArB;AACA,SAAK,WAAL,GAAqB,aAAa,cAAb,CAA4B,OAA5B,CAArB;AACA,SAAK,MAAL,GAAqB,WAArB;AACA,SAAK,aAAL,GAAqB,IAArB;;AAEA,QAAI,SAAS,KAAb,EAAoB;AAClB,UAAM,eAAe,YAAY,eAAZ,CAA4B,OAA5B,CAArB;AACA,WAAK,EAAL,GAAU,KAAK,SAAL,GAAiB,YAAY,SAAZ,CAAsB,YAAtB,CAA3B;;AAEA,UAAM,WAAW,KAAK,SAAL,GAAiB,YAAY,OAA9C;;AAEA,WAAK,MAAL,GAAc,CAAC,EAAE,YAAY,OAAZ,IACZ,YAAY,OAAZ,CAAoB,IAApB,KAA6B,WADjB,IAEZ,YAAY,OAAZ,CAAoB,MAApB,KAA+B,KAAK,MAFxB,IAGZ,WAAW,GAHD,CAAf;AAID,KAVD,MAWK,IAAI,SAAS,WAAb,EAA0B;AAC7B,WAAK,EAAL,GAAU,QAAQ,SAAR,GAAoB,YAAY,OAA1C;AACD;AACF;;AAhCH,yBAkCE,cAlCF,iCAkC8C;AAAA,QAAvB,OAAuB,QAA1B,CAA0B;AAAA,QAAX,OAAW,QAAd,CAAc;;AAC1C,SAAK,KAAL,IAAgB,OAAhB;AACA,SAAK,KAAL,IAAgB,OAAhB;AACA,SAAK,OAAL,IAAgB,OAAhB;AACA,SAAK,OAAL,IAAgB,OAAhB;;AAEA,WAAO,IAAP;AACD,GAzCH;;AAAA,yBA2CE,SA3CF,6BA2CyC;AAAA,QAAvB,OAAuB,SAA1B,CAA0B;AAAA,QAAX,OAAW,SAAd,CAAc;;AACrC,SAAK,KAAL,IAAgB,OAAhB;AACA,SAAK,KAAL,IAAgB,OAAhB;AACA,SAAK,OAAL,IAAgB,OAAhB;AACA,SAAK,OAAL,IAAgB,OAAhB;;AAEA,WAAO,IAAP;AACD,GAlDH;;AAAA,yBAoDE,cApDF,6BAoDoB;AAChB,SAAK,aAAL,CAAmB,cAAnB;AACD,GAtDH;;AAAA,yBAwDE,eAxDF,8BAwDqB;AACjB,SAAK,kBAAL,GAA0B,IAA1B;AACD,GA1DH;;AAAA,yBA4DE,wBA5DF,uCA4D8B;AAC1B,SAAK,2BAAL,GAAmC,KAAK,kBAAL,GAA0B,IAA7D;AACD,GA9DH;;AAAA;AAAA;;;;;ACFA,IAAM,eAAe,QAAQ,gBAAR,CAArB;AACA,IAAM,cAAe,QAAQ,gBAAR,CAArB;AACA,IAAM,QAAe,QAAQ,UAAR,CAArB;AACA,IAAM,UAAe,QAAQ,kBAAR,CAArB;AACA,IAAM,WAAe,QAAQ,mBAAR,CAArB;AACA,IAAM,UAAe,QAAQ,kBAAR,EAA4B,GAA5B,EAArB;;eACqB,QAAQ,cAAR,C;IAAb,M,YAAA,M;;AAER,IAAM,gBAAgB,CAAE,MAAF,EAAU,IAAV,EAAgB,QAAhB,CAAtB;AACA,IAAM,eAAgB,CAAE,MAAF,EAAU,IAAV,EAAgB,QAAhB,CAAtB;;AAEA,IAAM,gBAAgB;AACpB,4BADoB;AAEpB,YAFoB;AAGpB,0CAHoB;AAIpB,kBAJoB;AAKpB,YAAU;AACR,kBAAc,GADN;AAER,gBAAc,IAFN;AAGR,eAAc,IAHN;AAIR,YAAc,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX;AAJN,GALU;AAWpB,SAAO,CACL,MADK,EAEL,MAFK,EAGL,IAHK,EAIL,QAJK,EAKL,KALK,EAML,WANK,EAOL,MAPK;AAXa,CAAtB;;AAsBA,SAAS,IAAT,CAAe,GAAf,EAAoB;AAAA,MAEhB,WAFgB,GAMd,GANc,CAEhB,WAFgB;AAAA,MAEH,OAFG,GAMd,GANc,CAEH,OAFG;AAAA,MAEM,KAFN,GAMd,GANc,CAEM,KAFN;AAAA,MAEa,WAFb,GAMd,GANc,CAEa,WAFb;AAAA,kBAMd,GANc,CAGhB,IAHgB;AAAA,MAGhB,IAHgB,6BAGT,IAAI,YAAJ,CAAiB,IAHR;AAAA,qBAMd,GANc,CAIhB,OAJgB;AAAA,MAIhB,OAJgB,gCAIN,oBAAoB,GAApB,CAJM;AAAA,0BAMd,GANc,CAKhB,YALgB;AAAA,MAKhB,YALgB,qCAKD,IAAI,YAAJ,CAAiB,IAAjB,EAAuB,OAAvB,EAAgC,KAAhC,EAAuC,WAAvC,EAAoD,WAApD,CALC;;;AAQlB,MAAM,YAAY;AAChB,4BADgB;AAEhB,oBAFgB;AAGhB,gBAHgB;AAIhB,4BAJgB;AAKhB,oBALgB;AAMhB,cANgB;AAOhB;AAPgB,GAAlB;;AAUA,OAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,QAAQ,MAA5B,EAAoC,GAApC,EAAyC;AACvC,QAAM,SAAS,QAAQ,CAAR,CAAf;;AAEA,SAAK,IAAM,IAAX,IAAmB,OAAO,KAAP,IAAgB,EAAnC,EAAuC;AACrC,mBAAa,IAAb,IAAqB,OAAO,KAAP,CAAa,IAAb,CAArB;AACD;;AAED,QAAM,SAAS,MAAM,WAAN,CAAkB,OAAO,SAAzB,EAAoC,OAAO,OAA3C,CAAf;;AAEA,iBAAa,cAAb,CAA4B,MAA5B;AACA,iBAAa,SAAb,GAAyB,OAAO,SAAhC;AACA,iBAAa,aAAb,GAA6B,OAAO,OAApC;;AAEA,WAAO,SAAP,CAAiB,IAAjB,CAAsB,YAAtB;;AAEA,iBAAa,SAAb,CAAuB,MAAvB;;AAEA,QAAI,aAAa,2BAAb,IACI,aAAa,kBAAb,IACI,IAAI,CAAL,GAAU,QAAQ,MADrB,IAC+B,QAAQ,IAAI,CAAZ,EAAe,OAAf,KAA2B,aAAa,aAF/E,EAE+F;AAC7F;AACD;AACF;;AAED,UAAQ,IAAR,CAAa,OAAb,EAAsB,SAAtB;;AAEA,MAAI,SAAS,KAAb,EAAoB;AAClB;AACA;AACA,QAAM,UAAU,aAAa,MAAb,GACZ,KAAK;AACL,8BADK,EACQ,gBADR,EACiB,YADjB,EACwB,wBADxB;AAEL,YAAM;AAFD,KAAL,CADY,GAKZ,YALJ;;AAOA,gBAAY,OAAZ,GAAsB,OAAtB;AACA,gBAAY,OAAZ,GAAsB,QAAQ,SAA9B;AACD;;AAED,SAAO,YAAP;AACD;;AAED,SAAS,mBAAT,OAAkF;AAAA,MAAlD,WAAkD,QAAlD,WAAkD;AAAA,MAArC,OAAqC,QAArC,OAAqC;AAAA,MAA5B,KAA4B,QAA5B,KAA4B;AAAA,MAArB,WAAqB,QAArB,WAAqB;AAAA,MAAR,IAAQ,QAAR,IAAQ;;AAChF,MAAM,eAAe,YAAY,eAAZ,CAA4B,OAA5B,CAArB;;AAEA;AACA,MAAI,SAAS,KAAT,KAAmB,YAAY;AAC/B;AADmB,KAEhB,EAAE,YAAY,WAAZ,CAAwB,YAAxB,KAAyC,YAAY,WAAZ,CAAwB,YAAxB,MAA0C,WAArF,CAFH,CAAJ,EAE2G;AACzG,WAAO,EAAP;AACD;;AAED,MAAM,OAAO,MAAM,OAAN,CAAc,WAAd,CAAb;AACA,MAAM,YAAY;AAChB,4BADgB;AAEhB,oBAFgB;AAGhB,gBAHgB;AAIhB,4BAJgB;AAKhB,cALgB;AAMhB,cANgB;AAOhB,aAAS,EAPO;AAQhB,aAAS;AARO,GAAlB;;AAWA,uBAAsB,IAAtB,kHAA4B;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,QAAjB,OAAiB;;AAC1B,cAAU,OAAV,GAAoB,OAApB;;AAEA,YAAQ,IAAR,CAAa,iBAAb,EAAgC,SAAhC;AACD;;AAED,MAAI,SAAS,MAAb,EAAqB;AACnB,cAAU,OAAV,GAAoB,OAAO,UAAU,OAAjB,EAA0B;AAAA,aAC5C,OAAO,SAAP,CAAiB,OAAjB,CAAyB,YAAzB,KAA0C,YAAY,UAAZ,CAAuB,YAAvB,EAAqC,QADnC;AAAA,KAA1B,CAApB;AAED;;AAED,SAAO,UAAU,OAAjB;AACD;;AAED,YAAY,OAAZ,CAAoB,EAApB,CAAuB,qBAAvB,EAA8C,iBAAyC;AAAA,MAA7B,WAA6B,SAA7B,WAA6B;AAAA,MAAhB,YAAgB,SAAhB,YAAgB;;AACrF,cAAY,UAAZ,CAAuB,YAAvB,IAAuC,EAAE,UAAU,QAAZ,EAAsB,SAAS,IAA/B,EAAvC;AACD,CAFD;;AAIA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,gBAAvB,EAAyC,iBAAyC;AAAA,MAA7B,WAA6B,SAA7B,WAA6B;AAAA,MAAhB,YAAgB,SAAhB,YAAgB;;AAChF,cAAY,UAAZ,CAAuB,MAAvB,CAA8B,YAA9B,EAA4C,CAA5C;AACD,CAFD;;AAIA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,MAAvB,EAA+B,iBAAuE;AAAA,MAA3D,WAA2D,SAA3D,WAA2D;AAAA,MAA9C,OAA8C,SAA9C,OAA8C;AAAA,MAArC,KAAqC,SAArC,KAAqC;AAAA,MAA9B,WAA8B,SAA9B,WAA8B;AAAA,MAAjB,aAAiB,SAAjB,aAAiB;;AACpG,MAAM,eAAe,YAAY,eAAZ,CAA4B,OAA5B,CAArB;;AAEA,MAAI,CAAC,aAAD,KAAmB,CAAC,YAAY,aAAb,IAA8B,YAAY,eAA7D,CAAJ,EAAmF;AACjF,QAAI,YAAY,aAAhB,EAA+B;AAC7B,mBAAa,YAAY,UAAZ,CAAuB,YAAvB,EAAqC,OAAlD;AACD;;AAED,SAAK;AACH,8BADG,EACU,gBADV,EACmB,YADnB,EAC0B,wBAD1B;AAEH,YAAM;AAFH,KAAL;AAID;AACF,CAbD;;AAeA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,MAAvB,EAA+B,iBAAsE;AAAA,MAA1D,WAA0D,SAA1D,WAA0D;AAAA,MAA7C,OAA6C,SAA7C,OAA6C;AAAA,MAApC,KAAoC,SAApC,KAAoC;AAAA,MAA7B,WAA6B,SAA7B,WAA6B;AAAA,MAAhB,YAAgB,SAAhB,YAAgB;;AACnG;AACA,MAAM,YAAY,QAAQ,KAAR,GAAe,MAAM,MAAN,CAAa,EAAb,EAAiB,KAAjB,CAAf,GAAyC,KAA3D;;AAEA,MAAM,QAAQ,YAAY,UAAZ,CAAuB,YAAvB,CAAd;AACA,MAAM,OAAO,MAAM,OAAN,CAAc,WAAd,CAAb;AACA,MAAM,YAAY;AAChB,4BADgB;AAEhB,oBAFgB;AAGhB,gBAHgB;AAIhB,4BAJgB;AAKhB,UAAM,MALU;AAMhB,aAAS,EANO;AAOhB,cAPgB;AAQhB,aAAS;AARO,GAAlB;;AAWA,wBAAsB,IAAtB,yHAA4B;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,QAAjB,OAAiB;;AAC1B,cAAU,OAAV,GAAoB,OAApB;;AAEA,YAAQ,IAAR,CAAa,iBAAb,EAAgC,SAAhC;AACD;;AAED,MAAI,CAAC,UAAU,OAAV,CAAkB,MAAvB,EAA+B;AAAE;AAAS;;AAE1C,MAAI,cAAc,QAAlB;;AAEA,OAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,UAAU,OAAV,CAAkB,MAAtC,EAA8C,GAA9C,EAAmD;AACjD,QAAM,SAAS,UAAU,OAAV,CAAkB,CAAlB,CAAf;AACA,QAAM,eAAe,OAAO,SAAP,CAAiB,OAAjB,CAAyB,YAA9C;;AAEA,QAAI,eAAe,WAAnB,EAAgC;AAC9B,oBAAc,YAAd;AACD;AACF;;AAED,QAAM,QAAN,GAAiB,WAAjB;AACA,QAAM,OAAN,GAAgB,WAAW,YAAY;AACrC,SAAK;AACH,8BADG;AAEH,8BAFG;AAGH,eAAS,QAAQ,KAAR,GAAe,SAAf,GAA2B,OAHjC;AAIH,aAAO,SAJJ;AAKH,YAAM;AALH,KAAL;AAOD,GARe,EAQb,WARa,CAAhB;AASD,CA9CD;;AAgDA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,IAAvB,EAA6B,iBAAkD;AAAA,MAA/C,WAA+C,SAA/C,WAA+C;AAAA,MAAlC,OAAkC,SAAlC,OAAkC;AAAA,MAAzB,KAAyB,SAAzB,KAAyB;AAAA,MAAlB,WAAkB,SAAlB,WAAkB;;AAC7E,MAAI,CAAC,YAAY,eAAjB,EAAkC;AAChC,SAAK,EAAE,wBAAF,EAAe,wBAAf,EAA4B,gBAA5B,EAAqC,YAArC,EAA4C,MAAM,KAAlD,EAAL;AACD;AACF,CAJD;;AAMA,CAAC,IAAD,EAAO,QAAP,EAAiB,OAAjB,CAAyB,UAAU,UAAV,EAAsB;AAC7C,cAAY,OAAZ,CAAoB,EAApB,CAAuB,UAAvB,EAAmC,iBAAyC;AAAA,QAA7B,WAA6B,SAA7B,WAA6B;AAAA,QAAhB,YAAgB,SAAhB,YAAgB;;AAC1E,QAAI,YAAY,UAAZ,CAAuB,YAAvB,CAAJ,EAA0C;AACxC,mBAAa,YAAY,UAAZ,CAAuB,YAAvB,EAAqC,OAAlD;AACD;AACF,GAJD;AAKD,CAND;;AAQA,SAAS,oBAAT,CAA+B,IAA/B,EAAqC;AACnC,SAAO,kBAAwD;AAAA,QAA5C,WAA4C,UAA5C,WAA4C;AAAA,QAA/B,OAA+B,UAA/B,OAA+B;AAAA,QAAtB,KAAsB,UAAtB,KAAsB;AAAA,QAAf,WAAe,UAAf,WAAe;;AAC7D,SAAK,EAAE,wBAAF,EAAe,wBAAf,EAA4B,gBAA5B,EAAqC,YAArC,EAA4C,UAA5C,EAAL;AACD,GAFD;AAGD;;AAED,KAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,cAAc,MAAlC,EAA0C,GAA1C,EAA+C;AAC7C,cAAY,OAAZ,CAAoB,EAApB,CAAuB,cAAc,CAAd,CAAvB,EAAyC,qBAAqB,aAAa,CAAb,CAArB,CAAzC;AACD;;AAED,YAAY,OAAZ,CAAoB,EAApB,CAAuB,KAAvB,EAA8B,UAAU,WAAV,EAAuB;AACnD,cAAY,OAAZ,GAAyB,IAAzB,CADmD,CACnB;AAChC,cAAY,OAAZ,GAAyB,CAAzB,CAFmD,CAEnB;AAChC,cAAY,UAAZ,GAAyB,EAAzB,CAHmD,CAGnB;AACjC,CAJD;;AAMA,SAAS,aAAT,GAAyB,cAAc,QAAvC;AACA,OAAO,OAAP,GAAiB,aAAjB;;;;;ACxOA,IAAM,gBAAgB,QAAQ,QAAR,CAAtB;AACA,IAAM,cAAgB,QAAQ,gBAAR,CAAtB;;AAEA,cAAc,OAAd,CAAsB,EAAtB,CAAyB,KAAzB,EAAgC,KAAhC;AACA,cAAc,OAAd,CAAsB,EAAtB,CAAyB,OAAzB,EAAkC,OAAlC;;WAEqB,CAAC,MAAD,EAAS,IAAT,EAAe,QAAf,EAAyB,QAAzB,C;AAArB,yCAAyD;AAApD,MAAM,iBAAN;AACH,cAAY,OAAZ,CAAoB,EAApB,CAAuB,MAAvB,EAA+B,aAA/B;AACD;;AAED,SAAS,KAAT,OAAkC;AAAA,MAAhB,YAAgB,QAAhB,YAAgB;;AAChC,MAAI,aAAa,IAAb,KAAsB,MAA1B,EAAkC;AAAE;AAAS;;AAE7C,eAAa,KAAb,GAAqB,CAAC,aAAa,KAAb,IAAsB,CAAvB,IAA4B,CAAjD;AACD;;AAED,SAAS,OAAT,QAAuE;AAAA,MAAnD,WAAmD,SAAnD,WAAmD;AAAA,MAAtC,YAAsC,SAAtC,YAAsC;AAAA,MAAxB,WAAwB,SAAxB,WAAwB;AAAA,MAAX,OAAW,SAAX,OAAW;;AACrE,MAAI,aAAa,IAAb,KAAsB,MAAtB,IAAgC,CAAC,QAAQ,MAA7C,EAAqD;AAAE;AAAS;;AAEhE;AACA,MAAM,WAAW,QAAQ,CAAR,EAAW,SAAX,CAAqB,OAArB,CAA6B,kBAA9C;;AAEA;AACA,MAAI,YAAY,CAAhB,EAAmB;AAAE;AAAS;;AAE9B;AACA,cAAY,kBAAZ,GAAiC,WAAW,YAAY;AACtD,kBAAc,IAAd,CAAmB;AACjB,8BADiB;AAEjB,8BAFiB;AAGjB,YAAM,MAHW;AAIjB,eAAS,YAJQ;AAKjB,aAAO;AALU,KAAnB;AAOD,GARgC,EAQ9B,QAR8B,CAAjC;AASD;;AAED,SAAS,aAAT,QAAyC;AAAA,MAAf,WAAe,SAAf,WAAe;;AACvC;AACA;AACA,MAAI,YAAY,kBAAhB,EAAoC;AAClC,kBAAc,YAAY,kBAA1B;AACA,gBAAY,kBAAZ,GAAiC,IAAjC;AACD;AACF;;AAED;AACA,cAAc,QAAd,CAAuB,kBAAvB,GAA4C,CAA5C;AACA,cAAc,KAAd,CAAoB,IAApB,CAAyB,YAAzB;;AAEA,OAAO,OAAP,GAAiB;AACf,cADe;AAEf,kBAFe;AAGf;AAHe,CAAjB;;;;;AClDA,IAAM,gBAAgB,QAAQ,QAAR,CAAtB;AACA,IAAM,eAAgB,QAAQ,iBAAR,CAAtB;AACA,IAAM,UAAgB,QAAQ,kBAAR,CAAtB;AACA,IAAM,KAAgB,QAAQ,aAAR,CAAtB;AACA,IAAM,WAAgB,QAAQ,mBAAR,CAAtB;AACA,IAAM,QAAgB,QAAQ,UAAR,CAAtB;AACA,IAAM,SAAgB,QAAQ,iBAAR,CAAtB;;eACsB,QAAQ,cAAR,C;IAAd,K,YAAA,K;;AAER,cAAc,OAAd,CAAsB,EAAtB,CAAyB,iBAAzB,EAA4C,gBAAmD;AAAA,MAAvC,OAAuC,QAAvC,OAAuC;AAAA,MAA9B,OAA8B,QAA9B,OAA8B;AAAA,MAArB,IAAqB,QAArB,IAAqB;AAAA,MAAf,WAAe,QAAf,WAAe;;AAC7F,WAAS,gBAAT,CAA2B,YAA3B,EAAyC,QAAzC,EAAmD,OAAnD,EAA4D;AAC1D,QAAM,MAAM,QAAQ,0BAAR,GACN,QAAQ,gBAAR,CAAyB,QAAzB,CADM,GAEN,SAFN;;AAIA,QAAM,YAAY,aAAa,MAA/B;AACA,QAAM,UAAU,UAAU,OAA1B;;AAEA,QAAI,UAAU,IAAV,KACG,GAAG,OAAH,CAAW,OAAX,CADH,IAEG,SAAS,eAAT,CAAyB,OAAzB,EAAkC,QAAlC,EAA4C,GAA5C,CAFH,IAGG,aAAa,eAAb,CAA6B,OAA7B,EAAsC,OAAtC,EAA+C,WAA/C,CAHP,EAGoE;;AAElE,cAAQ,IAAR,CAAa;AACX,wBADW;AAEX,4BAFW;AAGX,eAAO,EAAE,0BAAF;AAHI,OAAb;AAKD;AACF;;AAED,MAAM,eAAe,MAAM,aAAN,CAAoB,GAApB,CAAwB,OAAxB,CAArB;;AAEA,MAAI,YAAJ,EAAkB;AAChB,QAAM,YAAY,aAAa,MAA/B;AACA,QAAM,UAAU,UAAU,OAA1B;;AAEA,QAAI,UAAU,IAAV,KACG,aAAa,eAAb,CAA6B,OAA7B,EAAsC,OAAtC,EAA+C,WAA/C,CADP,EACoE;AAClE,cAAQ,IAAR,CAAa;AACX,wBADW;AAEX,4BAFW;AAGX,eAAO,EAAE,0BAAF;AAHI,OAAb;AAKD;AACF;;AAED,QAAM,aAAN,CAAoB,eAApB,CAAoC,gBAApC,EAAsD,OAAtD;AACD,CAvCD;;AAyCA,aAAa,OAAb,CAAqB,EAArB,CAAwB,KAAxB,EAA+B,iBAA4B;AAAA,MAAhB,YAAgB,SAAhB,YAAgB;;AACzD,eAAa,MAAb,CAAoB,OAApB,GAA8B,UAAU,OAAV,EAAmB;AAC/C,WAAO,aAAa,OAAb,CAAqB,OAArB,CAAP;AACD,GAFD;AAGD,CAJD;;AAMA,aAAa,OAAb,CAAqB,EAArB,CAAwB,KAAxB,EAA+B,iBAAqC;AAAA,MAAzB,YAAyB,SAAzB,YAAyB;AAAA,MAAX,OAAW,SAAX,OAAW;;AAClE,SAAO,aAAa,MAAb,CAAoB,OAA3B,EAAoC,cAAc,QAAlD;AACA,SAAO,aAAa,MAAb,CAAoB,OAA3B,EAAoC,OAApC;AACD,CAHD;;AAKA,MAAM,aAAa,UAAnB,EAA+B,cAAc,KAA7C;;AAEA,aAAa,SAAb,CAAuB,aAAvB,GAAuC,UAAU,OAAV,EAAmB;AACxD,SAAO,KAAK,MAAL,CAAY,OAAnB,EAA4B,OAA5B;;AAEA,SAAO,IAAP;AACD,CAJD;;AAMA,IAAM,qBAAqB,aAAa,SAAb,CAAuB,iBAAlD;;AAEA,aAAa,SAAb,CAAuB,iBAAvB,GAA2C,UAAU,UAAV,EAAsB,QAAtB,EAAgC;AACzE,MAAM,MAAM,mBAAmB,IAAnB,CAAwB,IAAxB,EAA8B,UAA9B,EAA0C,QAA1C,CAAZ;;AAEA,MAAI,QAAQ,IAAZ,EAAkB;AAChB,SAAK,MAAL,CAAY,OAAZ,CAAoB,UAApB,IAAkC,QAAlC;AACD;;AAED,SAAO,GAAP;AACD,CARD;;AAUA,aAAa,eAAb,CAA6B,IAA7B,CAAkC,eAAlC;;;;;ACjFA,IAAM,QAAU,QAAQ,SAAR,CAAhB;AACA,IAAM,SAAU,QAAQ,gBAAR,CAAhB;AACA,IAAM,UAAU,QAAQ,iBAAR,EAA2B,GAA3B,EAAhB;;AAEA,IAAM,QAAQ;AACZ,kBADY;AAEZ,gBAFY;AAGZ,cAHY;;AAKZ;AACA,YAAU,QAAQ,oBAAR,EAA8B,QAN5B;AAOZ;AACA,aAAW,EARC;;AAUZ,eAAa,qBAAU,GAAV,EAAe,GAAf,EAAoB;AAC/B;AACA,QAAI,MAAM,QAAN,CAAe,MAAM,SAArB,EAAgC,GAAhC,CAAJ,EAA0C;AAAE,aAAO,KAAP;AAAe;;AAE3D,UAAM,OAAO,MAAM,SAAN,CAAgB,GAAhB,CAAb;;AAEA,UAAM,SAAN,CAAgB,IAAhB,CAAqB,GAArB;AACA,WAAO,SAAP,CAAiB,IAAjB,CAAsB,GAAtB;;AAEA;AACA;AACA,QAAI,QAAQ,MAAM,QAAlB,EAA4B;AAC1B,aAAO,GAAP,CAAW,GAAX,EAAgB,QAAhB,EAA0B,MAAM,cAAhC;AACD;;AAED,YAAQ,IAAR,CAAa,cAAb,EAA6B,EAAE,QAAF,EAAO,QAAP,EAA7B;AACD,GA1BW;;AA4BZ,kBAAgB,wBAAU,GAAV,EAAe,GAAf,EAAoB;AAClC,QAAM,QAAQ,MAAM,OAAN,CAAc,MAAM,SAApB,EAA+B,GAA/B,CAAd;;AAEA,UAAM,OAAO,MAAM,SAAN,CAAgB,GAAhB,CAAb;;AAEA,WAAO,MAAP,CAAc,GAAd,EAAmB,QAAnB,EAA6B,MAAM,cAAnC;;AAEA,UAAM,SAAN,CAAgB,MAAhB,CAAuB,KAAvB,EAA8B,CAA9B;AACA,WAAO,SAAP,CAAiB,MAAjB,CAAwB,KAAxB,EAA+B,CAA/B;;AAEA,YAAQ,IAAR,CAAa,iBAAb,EAAgC,EAAE,QAAF,EAAO,QAAP,EAAhC;AACD,GAvCW;;AAyCZ,kBAAgB,0BAAY;AAC1B,UAAM,cAAN,CAAqB,KAAK,QAA1B,EAAoC,IAApC;AACD;AA3CW,CAAd;;AA8CA,OAAO,OAAP,GAAiB,KAAjB;;;;;;;eClDoB,QAAQ,OAAR,C;IAAZ,O,YAAA,O;;IAEF,O;AACJ,qBAAe;AAAA;;AACb,SAAK,SAAL,GAAiB;AACf;AADe,KAAjB;AAGD;;oBAED,E,eAAI,I,EAAM,Q,EAAU;AAClB,QAAI,CAAC,KAAK,SAAL,CAAe,IAAf,CAAL,EAA2B;AACzB,WAAK,SAAL,CAAe,IAAf,IAAuB,CAAC,QAAD,CAAvB;AACA;AACD;;AAED,SAAK,SAAL,CAAe,IAAf,EAAqB,IAArB,CAA0B,QAA1B;AACD,G;;oBAED,G,gBAAK,I,EAAM,Q,EAAU;AACnB,QAAI,CAAC,KAAK,SAAL,CAAe,IAAf,CAAL,EAA2B;AAAE;AAAS;;AAEtC,QAAM,QAAQ,QAAQ,KAAK,SAAL,CAAe,IAAf,CAAR,EAA8B,QAA9B,CAAd;;AAEA,QAAI,UAAU,CAAC,CAAf,EAAkB;AAChB,WAAK,SAAL,CAAe,IAAf,EAAqB,MAArB,CAA4B,KAA5B,EAAmC,CAAnC;AACD;AACF,G;;oBAED,I,iBAAM,I,EAAM,G,EAAK;AACf,QAAM,kBAAkB,KAAK,SAAL,CAAe,IAAf,CAAxB;;AAEA,QAAI,CAAC,eAAL,EAAsB;AAAE;AAAS;;AAEjC,SAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,gBAAgB,MAApC,EAA4C,GAA5C,EAAiD;AAC/C,UAAI,gBAAgB,CAAhB,EAAmB,GAAnB,EAAwB,IAAxB,MAAkC,KAAtC,EAA6C;AAC3C;AACD;AACF;AACF,G;;;;;AAGH,QAAQ,GAAR,GAAc,YAAY;AACxB,SAAO,IAAI,OAAJ,EAAP;AACD,CAFD;;AAIA,OAAO,OAAP,GAAiB,OAAjB;;;;;AC7CA,SAAS,OAAT,CAAkB,KAAlB,EAAyB,MAAzB,EAAiC;AAC/B,OAAK,IAAI,IAAI,CAAR,EAAW,MAAM,MAAM,MAA5B,EAAoC,IAAI,GAAxC,EAA6C,GAA7C,EAAkD;AAChD,QAAI,MAAM,CAAN,MAAa,MAAjB,EAAyB;AACvB,aAAO,CAAP;AACD;AACF;;AAED,SAAO,CAAC,CAAR;AACD;;AAED,SAAS,QAAT,CAAmB,KAAnB,EAA0B,MAA1B,EAAkC;AAChC,SAAO,QAAQ,KAAR,EAAe,MAAf,MAA2B,CAAC,CAAnC;AACD;;AAED,SAAS,KAAT,CAAgB,MAAhB,EAAwB,MAAxB,EAAgC;AAC9B,OAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,OAAO,MAA3B,EAAmC,GAAnC,EAAwC;AACtC,WAAO,IAAP,CAAY,OAAO,CAAP,CAAZ;AACD;;AAED,SAAO,MAAP;AACD;;AAED,SAAS,MAAT,CAAiB,KAAjB,EAAwB,IAAxB,EAA8B;AAC5B,MAAM,SAAS,EAAf;;AAEA,OAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,MAAM,MAA1B,EAAkC,GAAlC,EAAuC;AACrC,QAAI,KAAK,MAAM,CAAN,CAAL,CAAJ,EAAoB;AAClB,aAAO,IAAP,CAAY,MAAM,CAAN,CAAZ;AACD;AACF;;AAED,SAAO,MAAP;AACD;;AAED,OAAO,OAAP,GAAiB;AACf,kBADe;AAEf,oBAFe;AAGf,cAHe;AAIf;AAJe,CAAjB;;;;;eClCmB,QAAQ,UAAR,C;IAAX,M,YAAA,M;;AACR,IAAM,KAAS,QAAQ,MAAR,CAAf;AACA,IAAM,aAAa,QAAQ,cAAR,CAAnB;;AAEA,IAAM,UAAU,WAAW,OAA3B;AACA,IAAM,YAAa,OAAO,SAA1B;;AAEA,IAAM,UAAU;AACd;AACA,iBAAe,CAAC,EAAG,kBAAkB,MAAnB,IAA8B,GAAG,QAAH,CAAY,OAAO,aAAnB,KAC1B,WAAW,QAAX,YAA+B,OAAO,aAD5C,CAFF;;AAKd;AACA,wBAAsB,CAAC,CAAC,WAAW,YANrB;;AAQd,SAAQ,iBAAiB,MAAlB,IAA6B,EAAE,sBAAsB,MAAxB,CARtB;;AAUd;AACA,iBAAgB,UAAU,OAAV,KAAsB,OAAtB,IACT,QAAQ,aADC,IAET,UAAU,SAAV,CAAoB,KAApB,CAA0B,QAA1B,CAbO;;AAed;AACA,UAAS,iBAAiB,IAAjB,CAAsB,UAAU,QAAhC,KACG,YAAY,IAAZ,CAAiB,UAAU,UAA3B,CAjBE;;AAmBd,gBAAc,aAAa,IAAb,CAAkB,UAAU,SAA5B,CAnBA;;AAqBd;AACA,2BAAyB,aAAa,QAAQ,SAArB,GACrB,SADqB,GACV,2BAA2B,QAAQ,SAAnC,GACX,uBADW,GACc,wBAAwB,QAAQ,SAAhC,GACzB,oBADyB,GACH,sBAAsB,QAAQ,SAA9B,GACtB,kBADsB,GACF,mBA1BV;;AA4Bd,8BAA4B,KA5Bd;;AA8Bd,eAAc,WAAW,YAAX,GACT,WAAW,YAAX,KAA4B,OAAO,cAAnC,GACC;AACA,QAAQ,aADR;AAEA,UAAQ,eAFR;AAGA,UAAQ,WAHR;AAIA,SAAQ,UAJR;AAKA,UAAQ,eALR;AAMA,YAAQ;AANR,GADD,GASC;AACA,QAAQ,WADR;AAEA,UAAQ,aAFR;AAGA,UAAQ,aAHR;AAIA,SAAQ,YAJR;AAKA,UAAQ,aALR;AAMA,YAAQ;AANR,GAVQ,GAkBV,IAhDU;;AAkDd;AACA,cAAY,kBAAkB,WAAW,QAA7B,GAAuC,YAAvC,GAAqD;;AAnDnD,CAAhB;;AAuDA,QAAQ,0BAAR,GAAqC,CAAC,GAAG,QAAH,CAAY,QAAQ,SAAR,CAAkB,QAAQ,uBAA1B,CAAZ,CAAtC;;AAEA,OAAO,OAAP,GAAiB,OAAjB;;;;;AChEA,IAAM,aAAa,EAAnB;AACA,IAAM,MAAM,QAAQ,UAAR,EAAoB,MAAhC;;AAEA,SAAS,KAAT,GAAkB,CAAE;;AAEpB,WAAW,QAAX,GAAgC,IAAI,QAApC;AACA,WAAW,gBAAX,GAAgC,IAAI,gBAAJ,IAA0B,KAA1D;AACA,WAAW,UAAX,GAAgC,IAAI,UAAJ,IAA0B,KAA1D;AACA,WAAW,aAAX,GAAgC,IAAI,aAAJ,IAA0B,KAA1D;AACA,WAAW,kBAAX,GAAgC,IAAI,kBAAJ,IAA0B,KAA1D;AACA,WAAW,OAAX,GAAgC,IAAI,OAAJ,IAA0B,KAA1D;AACA,WAAW,WAAX,GAAgC,IAAI,WAAJ,IAA0B,WAAW,OAArE;;AAEA,WAAW,KAAX,GAA0B,IAAI,KAA9B;AACA,WAAW,KAAX,GAA0B,IAAI,KAAJ,IAAa,KAAvC;AACA,WAAW,YAAX,GAA2B,IAAI,YAAJ,IAAoB,IAAI,cAAnD;;AAEA,OAAO,OAAP,GAAiB,UAAjB;;;;;ACjBA,IAAM,MAAa,QAAQ,UAAR,CAAnB;AACA,IAAM,UAAa,QAAQ,WAAR,CAAnB;AACA,IAAM,KAAa,QAAQ,MAAR,CAAnB;AACA,IAAM,aAAa,QAAQ,cAAR,CAAnB;;AAEA,IAAM,WAAW;AACf,gBAAc,sBAAU,MAAV,EAAkB,KAAlB,EAAyB;AACrC,WAAO,KAAP,EAAc;AACZ,UAAI,UAAU,MAAd,EAAsB;AACpB,eAAO,IAAP;AACD;;AAED,cAAQ,MAAM,UAAd;AACD;;AAED,WAAO,KAAP;AACD,GAXc;;AAaf,WAAS,iBAAU,OAAV,EAAmB,QAAnB,EAA6B;AACpC,WAAO,GAAG,OAAH,CAAW,OAAX,CAAP,EAA4B;AAC1B,UAAI,SAAS,eAAT,CAAyB,OAAzB,EAAkC,QAAlC,CAAJ,EAAiD;AAAE,eAAO,OAAP;AAAiB;;AAEpE,gBAAU,SAAS,UAAT,CAAoB,OAApB,CAAV;AACD;;AAED,WAAO,IAAP;AACD,GArBc;;AAuBf,cAAY,oBAAU,IAAV,EAAgB;AAC1B,QAAI,SAAS,KAAK,UAAlB;;AAEA,QAAI,GAAG,OAAH,CAAW,MAAX,CAAJ,EAAwB;AACtB;AACA,aAAO,CAAC,SAAS,OAAO,IAAjB,KAA0B,GAAG,OAAH,CAAW,MAAX,CAAjC,EAAqD;AACnD;AACD;;AAED,aAAO,MAAP;AACD;;AAED,WAAO,MAAP;AACD,GApCc;;AAsCf;AACA,2BAAyB,QAAQ,0BAAR,GACrB,UAAU,OAAV,EAAmB,QAAnB,EAA6B,KAA7B,EAAoC;AACpC,YAAQ,SAAS,QAAQ,UAAR,CAAmB,gBAAnB,CAAoC,QAApC,CAAjB;;AAEA,SAAK,IAAI,IAAI,CAAR,EAAW,MAAM,MAAM,MAA5B,EAAoC,IAAI,GAAxC,EAA6C,GAA7C,EAAkD;AAChD,UAAI,MAAM,CAAN,MAAa,OAAjB,EAA0B;AACxB,eAAO,IAAP;AACD;AACF;;AAED,WAAO,KAAP;AACD,GAXsB,GAYrB,IAnDW;;AAqDf,mBAAiB,yBAAU,OAAV,EAAmB,QAAnB,EAA6B,QAA7B,EAAuC;AACtD,QAAI,QAAQ,0BAAZ,EAAwC;AACtC,aAAO,SAAS,uBAAT,CAAiC,OAAjC,EAA0C,QAA1C,EAAoD,QAApD,CAAP;AACD;;AAED;AACA,QAAI,IAAI,MAAJ,KAAe,IAAI,UAAvB,EAAmC;AACjC,iBAAW,SAAS,OAAT,CAAiB,WAAjB,EAA8B,GAA9B,CAAX;AACD;;AAED,WAAO,QAAQ,QAAQ,uBAAhB,EAAyC,QAAzC,CAAP;AACD,GAhEc;;AAkEf;AACA,yBAAuB,+BAAU,QAAV,EAAoB;AACzC,QAAI,qBAAqB,EAAzB;AACA,QAAI,kBAAkB,EAAtB;AACA,QAAI,iBAAJ;AACA,QAAI,cAAc,SAAS,CAAT,CAAlB;AACA,QAAI,QAAQ,cAAa,CAAb,GAAgB,CAAC,CAA7B;AACA,QAAI,eAAJ;AACA,QAAI,cAAJ;AACA,QAAI,UAAJ;AACA,QAAI,UAAJ;;AAEA,SAAK,IAAI,CAAT,EAAY,IAAI,SAAS,MAAzB,EAAiC,GAAjC,EAAsC;AACpC,iBAAW,SAAS,CAAT,CAAX;;AAEA;AACA,UAAI,CAAC,QAAD,IAAa,aAAa,WAA9B,EAA2C;AACzC;AACD;;AAED,UAAI,CAAC,WAAL,EAAkB;AAChB,sBAAc,QAAd;AACA,gBAAQ,CAAR;AACA;AACD;;AAED;AACA;AACA,UAAI,SAAS,UAAT,KAAwB,SAAS,aAArC,EAAoD;AAClD;AACD;AACD;AAHA,WAIK,IAAI,YAAY,UAAZ,KAA2B,SAAS,aAAxC,EAAuD;AAC1D,wBAAc,QAAd;AACA,kBAAQ,CAAR;AACA;AACD;;AAED,UAAI,CAAC,mBAAmB,MAAxB,EAAgC;AAC9B,iBAAS,WAAT;AACA,eAAO,OAAO,UAAP,IAAqB,OAAO,UAAP,KAAsB,OAAO,aAAzD,EAAwE;AACtE,6BAAmB,OAAnB,CAA2B,MAA3B;AACA,mBAAS,OAAO,UAAhB;AACD;AACF;;AAED;AACA;AACA,UAAI,uBAAuB,WAAW,WAAlC,IACG,oBAAoB,WAAW,UADlC,IAEG,EAAE,oBAAoB,WAAW,aAAjC,CAFP,EAEwD;;AAEtD,YAAI,aAAa,YAAY,UAA7B,EAAyC;AACvC;AACD;;AAED,iBAAS,SAAS,eAAlB;AACD,OATD,MAUK;AACH,iBAAS,QAAT;AACD;;AAED,wBAAkB,EAAlB;;AAEA,aAAO,OAAO,UAAP,KAAsB,OAAO,aAApC,EAAmD;AACjD,wBAAgB,OAAhB,CAAwB,MAAxB;AACA,iBAAS,OAAO,UAAhB;AACD;;AAED,UAAI,CAAJ;;AAEA;AACA,aAAO,gBAAgB,CAAhB,KAAsB,gBAAgB,CAAhB,MAAuB,mBAAmB,CAAnB,CAApD,EAA2E;AACzE;AACD;;AAED,UAAM,UAAU,CACd,gBAAgB,IAAI,CAApB,CADc,EAEd,gBAAgB,CAAhB,CAFc,EAGd,mBAAmB,CAAnB,CAHc,CAAhB;;AAMA,cAAQ,QAAQ,CAAR,EAAW,SAAnB;;AAEA,aAAO,KAAP,EAAc;AACZ,YAAI,UAAU,QAAQ,CAAR,CAAd,EAA0B;AACxB,wBAAc,QAAd;AACA,kBAAQ,CAAR;AACA,+BAAqB,EAArB;;AAEA;AACD,SAND,MAOK,IAAI,UAAU,QAAQ,CAAR,CAAd,EAA0B;AAC7B;AACD;;AAED,gBAAQ,MAAM,eAAd;AACD;AACF;;AAED,WAAO,KAAP;AACD,GAvKc;;AAyKf,eAAa,qBAAU,OAAV,EAAmB,QAAnB,EAA6B,KAA7B,EAAoC;AAC/C,WAAO,GAAG,OAAH,CAAW,OAAX,CAAP,EAA4B;AAC1B,UAAI,SAAS,eAAT,CAAyB,OAAzB,EAAkC,QAAlC,CAAJ,EAAiD;AAC/C,eAAO,IAAP;AACD;;AAED,gBAAU,SAAS,UAAT,CAAoB,OAApB,CAAV;;AAEA,UAAI,YAAY,KAAhB,EAAuB;AACrB,eAAO,SAAS,eAAT,CAAyB,OAAzB,EAAkC,QAAlC,CAAP;AACD;AACF;;AAED,WAAO,KAAP;AACD,GAvLc;;AAyLf,oBAAkB,0BAAU,OAAV,EAAmB;AACnC,WAAQ,mBAAmB,WAAW,kBAA9B,GACJ,QAAQ,uBADJ,GAEJ,OAFJ;AAGD,GA7Lc;;AA+Lf,eAAa,qBAAU,cAAV,EAA0B;AACrC,qBAAiB,kBAAkB,IAAI,MAAvC;AACA,WAAO;AACL,SAAG,eAAe,OAAf,IAA0B,eAAe,QAAf,CAAwB,eAAxB,CAAwC,UADhE;AAEL,SAAG,eAAe,OAAf,IAA0B,eAAe,QAAf,CAAwB,eAAxB,CAAwC;AAFhE,KAAP;AAID,GArMc;;AAuMf,wBAAsB,8BAAU,OAAV,EAAmB;AACvC,QAAM,aAAc,mBAAmB,WAAW,UAA9B,GAChB,QAAQ,qBAAR,EADgB,GAEhB,QAAQ,cAAR,GAAyB,CAAzB,CAFJ;;AAIA,WAAO,cAAc;AACnB,YAAQ,WAAW,IADA;AAEnB,aAAQ,WAAW,KAFA;AAGnB,WAAQ,WAAW,GAHA;AAInB,cAAQ,WAAW,MAJA;AAKnB,aAAQ,WAAW,KAAX,IAAqB,WAAW,KAAX,GAAoB,WAAW,IALzC;AAMnB,cAAQ,WAAW,MAAX,IAAqB,WAAW,MAAX,GAAoB,WAAW;AANzC,KAArB;AAQD,GApNc;;AAsNf,kBAAgB,wBAAU,OAAV,EAAmB;AACjC,QAAM,aAAa,SAAS,oBAAT,CAA8B,OAA9B,CAAnB;;AAEA,QAAI,CAAC,QAAQ,MAAT,IAAmB,UAAvB,EAAmC;AACjC,UAAM,SAAS,SAAS,WAAT,CAAqB,IAAI,SAAJ,CAAc,OAAd,CAArB,CAAf;;AAEA,iBAAW,IAAX,IAAqB,OAAO,CAA5B;AACA,iBAAW,KAAX,IAAqB,OAAO,CAA5B;AACA,iBAAW,GAAX,IAAqB,OAAO,CAA5B;AACA,iBAAW,MAAX,IAAqB,OAAO,CAA5B;AACD;;AAED,WAAO,UAAP;AACD,GAnOc;;AAqOf,WAAS,iBAAU,OAAV,EAAmB;AAC1B,QAAM,OAAO,EAAb;;AAEA,WAAO,OAAP,EAAgB;AACd,WAAK,IAAL,CAAU,OAAV;AACA,gBAAU,SAAS,UAAT,CAAoB,OAApB,CAAV;AACD;;AAED,WAAO,IAAP;AACD,GA9Oc;;AAgPf,eAAa,4BAAS;AACpB,QAAI,CAAC,GAAG,MAAH,CAAU,KAAV,CAAL,EAAuB;AAAE,aAAO,KAAP;AAAe;;AAExC;AACA,eAAW,QAAX,CAAoB,aAApB,CAAkC,KAAlC;AACA,WAAO,IAAP;AACD;AAtPc,CAAjB;;AAyPA,OAAO,OAAP,GAAiB,QAAjB;;;;;AC9PA,IAAM,KAAO,QAAQ,MAAR,CAAb;AACA,IAAM,WAAW,QAAQ,YAAR,CAAjB;AACA,IAAM,UAAW,QAAQ,iBAAR,CAAjB;;eAE+B,QAAQ,UAAR,C;IAAvB,M,YAAA,M;IAAQ,S,YAAA,S;;gBACc,QAAQ,OAAR,C;IAAtB,O,aAAA,O;IAAS,Q,aAAA,Q;;AAEjB,IAAM,iBAAkB,iBAAiB,MAAlB,IAA6B,EAAE,sBAAsB,MAAxB,CAApD;AACA,IAAM,WAAiB,iBAAiB,aAAjB,GAAgC,kBAAvD;AACA,IAAM,cAAiB,iBAAiB,aAAjB,GAAgC,qBAAvD;AACA,IAAM,KAAiB,iBAAgB,IAAhB,GAAsB,EAA7C;;AAEA,IAAM,WAAoB,EAA1B;AACA,IAAM,UAAoB,EAA1B;AACA,IAAM,oBAAoB,EAA1B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAM,kBAAkB,EAAxB;;AAEA,IAAM,YAAY,EAAlB;;AAEA,IAAM,kBAAkB,CAAC,cAAD,IAAoB,YAAM;AAChD,MAAI,YAAY,KAAhB;;AAEA,SAAO,QAAP,CAAgB,aAAhB,CAA8B,KAA9B,EAAqC,gBAArC,CAAsD,MAAtD,EAA8D,IAA9D,EAAoE;AAClE,QAAI,OAAJ,GAAe;AAAE,kBAAY,IAAZ;AAAmB;AAD8B,GAApE;;AAIA,SAAO,SAAP;AACD,CAR0C,EAA3C;;AAUA,SAAS,GAAT,CAAc,OAAd,EAAuB,IAAvB,EAA6B,QAA7B,EAAuC,WAAvC,EAAoD;AAClD,MAAM,UAAU,WAAW,WAAX,CAAhB;AACA,MAAI,eAAe,QAAQ,QAAR,EAAkB,OAAlB,CAAnB;AACA,MAAI,SAAS,QAAQ,YAAR,CAAb;;AAEA,MAAI,CAAC,MAAL,EAAa;AACX,aAAS;AACP,cAAQ,EADD;AAEP,iBAAW;AAFJ,KAAT;;AAKA,mBAAe,SAAS,IAAT,CAAc,OAAd,IAAyB,CAAxC;AACA,YAAQ,IAAR,CAAa,MAAb;;AAEA,sBAAkB,IAAlB,CAAuB,iBACnB;AACA,gBAAU,EADV;AAEA,eAAU,EAFV;AAGA,gBAAU;AAHV,KADmB,GAMnB,IANJ;AAOD;;AAED,MAAI,CAAC,OAAO,MAAP,CAAc,IAAd,CAAL,EAA0B;AACxB,WAAO,MAAP,CAAc,IAAd,IAAsB,EAAtB;AACA,WAAO,SAAP;AACD;;AAED,MAAI,CAAC,SAAS,OAAO,MAAP,CAAc,IAAd,CAAT,EAA8B,QAA9B,CAAL,EAA8C;AAC5C,QAAI,YAAJ;;AAEA,QAAI,cAAJ,EAAoB;AAAA,kCACsB,kBAAkB,YAAlB,CADtB;AAAA,UACV,QADU,yBACV,QADU;AAAA,UACA,OADA,yBACA,OADA;AAAA,UACS,QADT,yBACS,QADT;;AAElB,UAAM,gBAAgB,QAAQ,QAAR,EAAkB,QAAlB,CAAtB;;AAEA,UAAM,kBAAkB,QAAQ,aAAR,KAA0B,UAAU,KAAV,EAAiB;AACjE,YAAI,CAAC,MAAM,2BAAX,EAAwC;AACtC,gBAAM,MAAN,GAAe,MAAM,UAArB;AACA,gBAAM,aAAN,GAAsB,OAAtB;;AAEA,gBAAM,cAAN,GAAiC,MAAM,cAAN,IAAkC,UAAnE;AACA,gBAAM,eAAN,GAAiC,MAAM,eAAN,IAAkC,QAAnE;AACA,gBAAM,wBAAN,GAAiC,MAAM,wBAAN,IAAkC,WAAnE;;AAEA,cAAI,cAAc,IAAd,CAAmB,MAAM,IAAzB,CAAJ,EAAoC;AAClC,kBAAM,KAAN,GAAc,MAAM,OAAN,GAAgB,UAAU,OAAV,EAAmB,QAAnB,CAA4B,eAA5B,CAA4C,UAA1E;AACA,kBAAM,KAAN,GAAc,MAAM,OAAN,GAAgB,UAAU,OAAV,EAAmB,QAAnB,CAA4B,eAA5B,CAA4C,SAA1E;AACD;;AAED,mBAAS,KAAT;AACD;AACF,OAhBD;;AAkBA,YAAM,QAAQ,QAAR,EAAkB,KAAK,IAAvB,EAA6B,eAA7B,EAA8C,CAAC,CAAC,QAAQ,OAAxD,CAAN;;AAEA,UAAI,kBAAkB,CAAC,CAAvB,EAA0B;AACxB,iBAAS,IAAT,CAAc,QAAd;AACA,gBAAQ,IAAR,CAAa,eAAb;AACA,iBAAS,IAAT,CAAc,CAAd;AACD,OAJD,MAKK;AACH,iBAAS,aAAT;AACD;AACF,KAhCD,MAiCK;AACH,YAAM,QAAQ,QAAR,EAAkB,IAAlB,EAAwB,QAAxB,EAAkC,kBAAiB,OAAjB,GAA2B,CAAC,CAAC,QAAQ,OAAvE,CAAN;AACD;AACD,WAAO,MAAP,CAAc,IAAd,EAAoB,IAApB,CAAyB,QAAzB;;AAEA,WAAO,GAAP;AACD;AACF;;AAED,SAAS,MAAT,CAAiB,OAAjB,EAA0B,IAA1B,EAAgC,QAAhC,EAA0C,WAA1C,EAAuD;AACrD,MAAM,UAAU,WAAW,WAAX,CAAhB;AACA,MAAM,eAAe,QAAQ,QAAR,EAAkB,OAAlB,CAArB;AACA,MAAM,SAAS,QAAQ,YAAR,CAAf;;AAEA,MAAI,CAAC,MAAD,IAAW,CAAC,OAAO,MAAvB,EAA+B;AAC7B;AACD;;AAED,MAAI,kBAAkB,QAAtB;AACA,MAAI,kBAAJ;AACA,MAAI,sBAAJ;;AAEA,MAAI,cAAJ,EAAoB;AAClB,gBAAY,kBAAkB,YAAlB,CAAZ;AACA,oBAAgB,QAAQ,UAAU,QAAlB,EAA4B,QAA5B,CAAhB;AACA,sBAAkB,UAAU,OAAV,CAAkB,aAAlB,CAAlB;AACD;;AAED,MAAI,SAAS,KAAb,EAAoB;AAClB,SAAK,IAAL,IAAa,OAAO,MAApB,EAA4B;AAC1B,UAAI,OAAO,MAAP,CAAc,cAAd,CAA6B,IAA7B,CAAJ,EAAwC;AACtC,eAAO,OAAP,EAAgB,IAAhB,EAAsB,KAAtB;AACD;AACF;AACD;AACD;;AAED,MAAI,OAAO,MAAP,CAAc,IAAd,CAAJ,EAAyB;AACvB,QAAM,MAAM,OAAO,MAAP,CAAc,IAAd,EAAoB,MAAhC;;AAEA,QAAI,aAAa,KAAjB,EAAwB;AACtB,WAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,GAApB,EAAyB,GAAzB,EAA8B;AAC5B,eAAO,OAAP,EAAgB,IAAhB,EAAsB,OAAO,MAAP,CAAc,IAAd,EAAoB,CAApB,CAAtB,EAA8C,OAA9C;AACD;AACD;AACD,KALD,MAMK;AACH,WAAK,IAAI,KAAI,CAAb,EAAgB,KAAI,GAApB,EAAyB,IAAzB,EAA8B;AAC5B,YAAI,OAAO,MAAP,CAAc,IAAd,EAAoB,EAApB,MAA2B,QAA/B,EAAyC;AACvC,kBAAQ,WAAR,EAAqB,KAAK,IAA1B,EAAgC,eAAhC,EAAiD,kBAAiB,OAAjB,GAA2B,CAAC,CAAC,QAAQ,OAAtF;AACA,iBAAO,MAAP,CAAc,IAAd,EAAoB,MAApB,CAA2B,EAA3B,EAA8B,CAA9B;;AAEA,cAAI,kBAAkB,SAAtB,EAAiC;AAC/B,sBAAU,QAAV,CAAmB,aAAnB;AACA,gBAAI,UAAU,QAAV,CAAmB,aAAnB,MAAsC,CAA1C,EAA6C;AAC3C,wBAAU,QAAV,CAAmB,MAAnB,CAA0B,aAA1B,EAAyC,CAAzC;AACA,wBAAU,OAAV,CAAkB,MAAlB,CAAyB,aAAzB,EAAwC,CAAxC;AACA,wBAAU,QAAV,CAAmB,MAAnB,CAA0B,aAA1B,EAAyC,CAAzC;AACD;AACF;;AAED;AACD;AACF;AACF;;AAED,QAAI,OAAO,MAAP,CAAc,IAAd,KAAuB,OAAO,MAAP,CAAc,IAAd,EAAoB,MAApB,KAA+B,CAA1D,EAA6D;AAC3D,aAAO,MAAP,CAAc,IAAd,IAAsB,IAAtB;AACA,aAAO,SAAP;AACD;AACF;;AAED,MAAI,CAAC,OAAO,SAAZ,EAAuB;AACrB,YAAQ,MAAR,CAAe,YAAf,EAA6B,CAA7B;AACA,aAAS,MAAT,CAAgB,YAAhB,EAA8B,CAA9B;AACA,sBAAkB,MAAlB,CAAyB,YAAzB,EAAuC,CAAvC;AACD;AACF;;AAED,SAAS,WAAT,CAAsB,QAAtB,EAAgC,OAAhC,EAAyC,IAAzC,EAA+C,QAA/C,EAAyD,WAAzD,EAAsE;AACpE,MAAM,UAAU,WAAW,WAAX,CAAhB;AACA,MAAI,CAAC,gBAAgB,IAAhB,CAAL,EAA4B;AAC1B,oBAAgB,IAAhB,IAAwB;AACtB,iBAAW,EADW;AAEtB,gBAAW,EAFW;AAGtB,iBAAW;AAHW,KAAxB;;AAMA;AACA,SAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,UAAU,MAA9B,EAAsC,GAAtC,EAA2C;AACzC,UAAI,UAAU,CAAV,CAAJ,EAAkB,IAAlB,EAAwB,gBAAxB;AACA,UAAI,UAAU,CAAV,CAAJ,EAAkB,IAAlB,EAAwB,kBAAxB,EAA4C,IAA5C;AACD;AACF;;AAED,MAAM,YAAY,gBAAgB,IAAhB,CAAlB;AACA,MAAI,cAAJ;;AAEA,OAAK,QAAQ,UAAU,SAAV,CAAoB,MAApB,GAA6B,CAA1C,EAA6C,SAAS,CAAtD,EAAyD,OAAzD,EAAkE;AAChE,QAAI,UAAU,SAAV,CAAoB,KAApB,MAA+B,QAA/B,IACG,UAAU,QAAV,CAAmB,KAAnB,MAA8B,OADrC,EAC8C;AAC5C;AACD;AACF;;AAED,MAAI,UAAU,CAAC,CAAf,EAAkB;AAChB,YAAQ,UAAU,SAAV,CAAoB,MAA5B;;AAEA,cAAU,SAAV,CAAoB,IAApB,CAAyB,QAAzB;AACA,cAAU,QAAV,CAAoB,IAApB,CAAyB,OAAzB;AACA,cAAU,SAAV,CAAoB,IAApB,CAAyB,EAAzB;AACD;;AAED;AACA,YAAU,SAAV,CAAoB,KAApB,EAA2B,IAA3B,CAAgC,CAAC,QAAD,EAAW,CAAC,CAAC,QAAQ,OAArB,EAA8B,QAAQ,OAAtC,CAAhC;AACD;;AAED,SAAS,cAAT,CAAyB,QAAzB,EAAmC,OAAnC,EAA4C,IAA5C,EAAkD,QAAlD,EAA4D,WAA5D,EAAyE;AACvE,MAAM,UAAU,WAAW,WAAX,CAAhB;AACA,MAAM,YAAY,gBAAgB,IAAhB,CAAlB;AACA,MAAI,aAAa,KAAjB;AACA,MAAI,cAAJ;;AAEA,MAAI,CAAC,SAAL,EAAgB;AAAE;AAAS;;AAE3B;AACA,OAAK,QAAQ,UAAU,SAAV,CAAoB,MAApB,GAA6B,CAA1C,EAA6C,SAAS,CAAtD,EAAyD,OAAzD,EAAkE;AAChE;AACA,QAAI,UAAU,SAAV,CAAoB,KAApB,MAA+B,QAA/B,IACG,UAAU,QAAV,CAAmB,KAAnB,MAA8B,OADrC,EAC8C;;AAE5C,UAAM,YAAY,UAAU,SAAV,CAAoB,KAApB,CAAlB;;AAEA;AACA,WAAK,IAAI,IAAI,UAAU,MAAV,GAAmB,CAAhC,EAAmC,KAAK,CAAxC,EAA2C,GAA3C,EAAgD;AAAA,2BACf,UAAU,CAAV,CADe;AAAA,YACvC,EADuC;AAAA,YACnC,OADmC;AAAA,YAC1B,OAD0B;;AAG9C;;AACA,YAAI,OAAO,QAAP,IAAmB,YAAY,CAAC,CAAC,QAAQ,OAAzC,IAAoD,YAAY,QAAQ,OAA5E,EAAqF;AACnF;AACA,oBAAU,MAAV,CAAiB,CAAjB,EAAoB,CAApB;;AAEA;AACA;AACA,cAAI,CAAC,UAAU,MAAf,EAAuB;AACrB,sBAAU,SAAV,CAAoB,MAApB,CAA2B,KAA3B,EAAkC,CAAlC;AACA,sBAAU,QAAV,CAAoB,MAApB,CAA2B,KAA3B,EAAkC,CAAlC;AACA,sBAAU,SAAV,CAAoB,MAApB,CAA2B,KAA3B,EAAkC,CAAlC;;AAEA;AACA,mBAAO,OAAP,EAAgB,IAAhB,EAAsB,gBAAtB;AACA,mBAAO,OAAP,EAAgB,IAAhB,EAAsB,kBAAtB,EAA0C,IAA1C;;AAEA;AACA,gBAAI,CAAC,UAAU,SAAV,CAAoB,MAAzB,EAAiC;AAC/B,8BAAgB,IAAhB,IAAwB,IAAxB;AACD;AACF;;AAED;AACA,uBAAa,IAAb;AACA;AACD;AACF;;AAED,UAAI,UAAJ,EAAgB;AAAE;AAAQ;AAC3B;AACF;AACF;;AAED;AACA;AACA,SAAS,gBAAT,CAA2B,KAA3B,EAAkC,WAAlC,EAA+C;AAC7C,MAAM,UAAU,WAAW,WAAX,CAAhB;AACA,MAAM,YAAY,EAAlB;AACA,MAAM,YAAY,gBAAgB,MAAM,IAAtB,CAAlB;AACA,MAAM,cAAe,SAAS,gBAAT,CAA0B,MAAM,IAAN,GAC3C,MAAM,IAAN,CAAW,CAAX,CAD2C,GAE3C,MAAM,MAFW,CAArB;AAGA,MAAI,UAAU,WAAd;;AAEA;AACA,UAAQ,SAAR,EAAmB,KAAnB;;AAEA,YAAU,aAAV,GAA0B,KAA1B;AACA,YAAU,cAAV,GAA2B,sBAA3B;;AAEA;AACA,SAAO,GAAG,OAAH,CAAW,OAAX,CAAP,EAA4B;AAC1B,SAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,UAAU,SAAV,CAAoB,MAAxC,EAAgD,GAAhD,EAAqD;AACnD,UAAM,WAAW,UAAU,SAAV,CAAoB,CAApB,CAAjB;AACA,UAAM,UAAU,UAAU,QAAV,CAAmB,CAAnB,CAAhB;;AAEA,UAAI,SAAS,eAAT,CAAyB,OAAzB,EAAkC,QAAlC,KACG,SAAS,YAAT,CAAsB,OAAtB,EAA+B,WAA/B,CADH,IAEG,SAAS,YAAT,CAAsB,OAAtB,EAA+B,OAA/B,CAFP,EAEgD;;AAE9C,YAAM,YAAY,UAAU,SAAV,CAAoB,CAApB,CAAlB;;AAEA,kBAAU,aAAV,GAA0B,OAA1B;;AAEA,aAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,UAAU,MAA9B,EAAsC,GAAtC,EAA2C;AAAA,6BACV,UAAU,CAAV,CADU;AAAA,cAClC,EADkC;AAAA,cAC9B,OAD8B;AAAA,cACrB,OADqB;;;AAGzC,cAAI,YAAY,CAAC,CAAC,QAAQ,OAAtB,IAAiC,YAAY,QAAQ,OAAzD,EAAkE;AAChE,eAAG,SAAH;AACD;AACF;AACF;AACF;;AAED,cAAU,SAAS,UAAT,CAAoB,OAApB,CAAV;AACD;AACF;;AAED,SAAS,kBAAT,CAA6B,KAA7B,EAAoC;AAClC,SAAO,iBAAiB,IAAjB,CAAsB,IAAtB,EAA4B,KAA5B,EAAmC,IAAnC,CAAP;AACD;;AAED,SAAS,UAAT,GAAuB;AACrB,OAAK,WAAL,GAAmB,KAAnB;AACD;;AAED,SAAS,sBAAT,GAAmC;AACjC,OAAK,aAAL,CAAmB,cAAnB;AACD;;AAED,SAAS,QAAT,GAAqB;AACnB,OAAK,YAAL,GAAoB,IAApB;AACD;;AAED,SAAS,WAAT,GAAwB;AACtB,OAAK,YAAL,GAAoB,IAApB;AACA,OAAK,2BAAL,GAAmC,IAAnC;AACD;;AAED,SAAS,UAAT,CAAqB,KAArB,EAA4B;AAC1B,SAAO,GAAG,MAAH,CAAU,KAAV,IAAkB,KAAlB,GAA0B,EAAE,SAAS,KAAX,EAAjC;AACD;;AAED,OAAO,OAAP,GAAiB;AACf,UADe;AAEf,gBAFe;;AAIf,0BAJe;AAKf,gCALe;;AAOf,oCAPe;AAQf,wCARe;AASf,kCATe;AAUf,sBAVe;;AAYf,gCAZe;AAaf,kCAbe;;AAef,aAAW,QAfI;AAgBf,YAAU,OAhBK;AAiBf,sBAAoB;AAjBL,CAAjB;;;;;ACrVA,OAAO,OAAP,GAAiB,SAAS,MAAT,CAAiB,IAAjB,EAAuB,MAAvB,EAA+B;AAC9C,OAAK,IAAM,IAAX,IAAmB,MAAnB,EAA2B;AACzB,SAAK,IAAL,IAAa,OAAO,IAAP,CAAb;AACD;AACD,SAAO,IAAP;AACD,CALD;;;;;eCGI,QAAQ,QAAR,C;IAFF,e,YAAA,e;IACA,Q,YAAA,Q;;AAGF,OAAO,OAAP,GAAiB,UAAU,MAAV,EAAkB,OAAlB,EAA2B,MAA3B,EAAmC;AAClD,MAAM,gBAAgB,OAAO,OAAP,CAAe,MAAf,CAAtB;AACA,MAAM,eAAe,iBAAiB,cAAc,MAApD;AACA,MAAM,SAAS,gBAAgB,OAAO,OAAP,CAAe,MAA9C;;AAEA,MAAM,aAAa,gBAAgB,MAAhB,EAAwB,MAAxB,EAAgC,OAAhC,EAAyC,CAAC,UAAU,OAAX,CAAzC,CAAnB;;AAEA,SAAO,SAAS,UAAT,KAAwB,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EAA/B;AACD,CARD;;;;;ACLA,OAAO,OAAP,GAAiB,UAAC,CAAD,EAAI,CAAJ;AAAA,SAAW,KAAK,IAAL,CAAU,IAAI,CAAJ,GAAQ,IAAI,CAAtB,CAAX;AAAA,CAAjB;;;;;ACAA,IAAM,SAAS,QAAQ,UAAR,CAAf;AACA,IAAM,MAAS,QAAQ,UAAR,CAAf;;AAEA,IAAM,QAAQ;AACZ,YAAU,kBAAU,MAAV,EAAkB,OAAlB,EAA2B;AACnC,QAAI,SAAS,KAAb;;AAEA,WAAO,YAAY;AACjB,UAAI,CAAC,MAAL,EAAa;AACX,YAAI,MAAJ,CAAW,OAAX,CAAmB,IAAnB,CAAwB,OAAxB;AACA,iBAAS,IAAT;AACD;;AAED,aAAO,OAAO,KAAP,CAAa,IAAb,EAAmB,SAAnB,CAAP;AACD,KAPD;AAQD,GAZW;;AAcZ;AACA,oBAAkB,0BAAU,CAAV,EAAa,EAAb,EAAiB,EAAjB,EAAqB,EAArB,EAAyB;AACzC,QAAM,KAAK,IAAI,CAAf;AACA,WAAO,KAAK,EAAL,GAAU,EAAV,GAAe,IAAI,EAAJ,GAAS,CAAT,GAAa,EAA5B,GAAiC,IAAI,CAAJ,GAAQ,EAAhD;AACD,GAlBW;;AAoBZ,0BAAwB,gCAAU,MAAV,EAAkB,MAAlB,EAA0B,GAA1B,EAA+B,GAA/B,EAAoC,IAApC,EAA0C,IAA1C,EAAgD,QAAhD,EAA0D;AAChF,WAAO;AACL,SAAI,MAAM,gBAAN,CAAuB,QAAvB,EAAiC,MAAjC,EAAyC,GAAzC,EAA8C,IAA9C,CADC;AAEL,SAAI,MAAM,gBAAN,CAAuB,QAAvB,EAAiC,MAAjC,EAAyC,GAAzC,EAA8C,IAA9C;AAFC,KAAP;AAID,GAzBW;;AA2BZ;AACA,eAAa,qBAAU,CAAV,EAAa,CAAb,EAAgB,CAAhB,EAAmB,CAAnB,EAAsB;AACjC,SAAK,CAAL;AACA,WAAO,CAAC,CAAD,GAAK,CAAL,IAAQ,IAAE,CAAV,IAAe,CAAtB;AACD,GA/BW;;AAiCZ,cAAY,oBAAU,IAAV,EAAgB,GAAhB,EAAqB;AAC/B,SAAK,IAAL,GAAa,IAAI,IAAjB;AACA,SAAK,IAAL,GAAa,IAAI,IAAjB;AACA,SAAK,KAAL,GAAa,IAAI,KAAjB;;AAEA,WAAO,IAAP;AACD,GAvCW;;AAyCZ,MAAa,QAAQ,MAAR,CAzCD;AA0CZ,UAAa,MA1CD;AA2CZ,SAAa,QAAQ,SAAR,CA3CD;AA4CZ,eAAa,QAAQ,eAAR;AA5CD,CAAd;;AA+CA,OAAO,KAAP,EAAc,QAAQ,OAAR,CAAd;AACA,OAAO,KAAP,EAAc,QAAQ,YAAR,CAAd;AACA,OAAO,KAAP,EAAc,QAAQ,gBAAR,CAAd;AACA,OAAO,KAAP,EAAc,QAAQ,QAAR,CAAd;;AAEA,OAAO,OAAP,GAAiB,KAAjB;;;;;ACvDA,IAAM,QAAU,QAAQ,UAAR,CAAhB;AACA,IAAM,QAAU,QAAQ,SAAR,CAAhB;;AAEA,IAAM,SAAS;AACb,eAAa,CAAE,kBAAF,EAAsB,YAAtB,EAAoC,YAApC,EAAkD,MAAlD,CADA;;AAGb,UAAQ,gBAAU,OAAV,EAAmB,SAAnB,EAA8B,WAA9B,EAA2C;AACjD,QAAM,cAAc,MAAM,cAAN,CAAqB,OAArB,CAApB;AACA,QAAM,YAAY,MAAM,YAAN,CAAmB,OAAnB,CAAlB;AACA,QAAM,UAAU,EAAE,gBAAF,EAAW,oBAAX,EAAsB,wBAAtB,EAAmC,oBAAnC,EAA8C,wBAA9C,EAAhB;;AAEA,yBAAqB,OAAO,WAA5B,kHAAyC;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAA9B,MAA8B;;AACvC,UAAM,cAAc,OAAO,MAAP,EAAe,OAAf,CAApB;;AAEA,UAAI,WAAJ,EAAiB;AACf,eAAO,WAAP;AACD;AACF;AACF,GAfY;;AAiBb;AACA,oBAAkB,iCAAmD;AAAA,QAAvC,WAAuC,SAAvC,WAAuC;AAAA,QAA1B,SAA0B,SAA1B,SAA0B;AAAA,QAAf,WAAe,SAAf,WAAe;;AACnE,QAAI,CAAC,cAAc,IAAd,CAAmB,SAAnB,CAAL,EAAoC;AAClC,aAAO,IAAP;AACD;;AAED,0BAA0B,MAAM,YAAhC,yHAA8C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAAnC,WAAmC;;AAC5C,UAAI,UAAU,WAAd;;AAEA,UAAI,YAAY,UAAZ,IAA0B,YAAY,UAAZ,CAAuB,WAAjD,IACI,YAAY,WAAZ,KAA4B,WADpC,EACkD;AAChD,eAAO,OAAP,EAAgB;AACd;AACA,cAAI,YAAY,YAAY,OAA5B,EAAqC;AACnC,mBAAO,WAAP;AACD;AACD,oBAAU,MAAM,UAAN,CAAiB,OAAjB,CAAV;AACD;AACF;AACF;;AAED,WAAO,IAAP;AACD,GAvCY;;AAyCb;AACA,cAAY,2BAAiD;AAAA,QAArC,SAAqC,SAArC,SAAqC;AAAA,QAA1B,WAA0B,SAA1B,WAA0B;AAAA,QAAb,SAAa,SAAb,SAAa;;AAC3D,QAAI,gBAAgB,OAAhB,IAA2B,gBAAgB,KAA/C,EAAsD;AACpD,aAAO,IAAP;AACD;;AAED,QAAI,uBAAJ;;AAEA,0BAA0B,MAAM,YAAhC,yHAA8C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAAnC,WAAmC;;AAC5C,UAAI,YAAY,WAAZ,KAA4B,WAAhC,EAA6C;AAC3C;AACA,YAAI,YAAY,UAAZ,IAA0B,CAAC,MAAM,QAAN,CAAe,YAAY,UAA3B,EAAuC,SAAvC,CAA/B,EAAkF;AAAE;AAAW;;AAE/F;AACA,YAAI,YAAY,WAAZ,EAAJ,EAA+B;AAC7B,iBAAO,WAAP;AACD;AACD;AAHA,aAIK,IAAI,CAAC,cAAL,EAAqB;AACxB,6BAAiB,WAAjB;AACD;AACF;AACF;;AAED;AACA;AACA,QAAI,cAAJ,EAAoB;AAClB,aAAO,cAAP;AACD;;AAED;AACA;AACA;AACA,0BAA0B,MAAM,YAAhC,yHAA8C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAAnC,YAAmC;;AAC5C,UAAI,aAAY,WAAZ,KAA4B,WAA5B,IAA2C,EAAE,QAAQ,IAAR,CAAa,SAAb,KAA2B,aAAY,UAAzC,CAA/C,EAAqG;AACnG,eAAO,YAAP;AACD;AACF;;AAED,WAAO,IAAP;AACD,GAjFY;;AAmFb;AACA,cAAY,2BAAyB;AAAA,QAAb,SAAa,SAAb,SAAa;;AACnC,0BAA0B,MAAM,YAAhC,yHAA8C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAAnC,WAAmC;;AAC5C,UAAI,MAAM,QAAN,CAAe,YAAY,UAA3B,EAAuC,SAAvC,CAAJ,EAAuD;AACrD,eAAO,WAAP;AACD;AACF;AACF,GA1FY;;AA4Fb;AACA,QAAM,qBAA2B;AAAA,QAAf,WAAe,SAAf,WAAe;;AAC/B,0BAA0B,MAAM,YAAhC,yHAA8C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAAnC,WAAmC;;AAC5C;AACA,UAAI,YAAY,UAAZ,CAAuB,MAAvB,KAAkC,CAAtC,EAAyC;AACvC,YAAM,SAAS,YAAY,MAA3B;AACA;AACA;AACA,YAAI,UAAU,CAAC,OAAO,OAAP,CAAe,OAAf,CAAuB,OAAtC,EAA+C;AAC7C;AACD;AACF;AACD;AARA,WASK,IAAI,YAAY,UAAZ,CAAuB,MAAvB,IAAiC,CAArC,EAAwC;AAC3C;AACD;;AAED,UAAI,CAAC,YAAY,WAAZ,EAAD,IAA+B,gBAAgB,YAAY,WAA/D,EAA6E;AAC3E,eAAO,WAAP;AACD;AACF;;AAED,WAAO,IAAP;AACD;AAnHY,CAAf;;AAsHA,OAAO,OAAP,GAAiB,MAAjB;;;;;;;ACzHA,IAAM,MAAa,QAAQ,UAAR,CAAnB;AACA,IAAM,WAAa,QAAQ,YAAR,CAAnB;;AAEA,IAAM,KAAK;AACT,SAAU,iBAAM,CAAE,CADT;;AAGT,UAAU;AAAA,WAAS,UAAU,IAAI,MAAd,IAAwB,SAAS,KAAT,CAAjC;AAAA,GAHD;;AAKT,WAAU;AAAA,WAAS,GAAG,MAAH,CAAU,KAAV,KAAoB,MAAM,QAAN,KAAmB,EAAhD;AAAA,GALD;;AAOT,UAAU;AAAA,WAAS,CAAC,CAAC,KAAF,IAAY,QAAO,KAAP,yCAAO,KAAP,OAAiB,QAAtC;AAAA,GAPD;;AAST,YAAU;AAAA,WAAS,OAAO,KAAP,KAAiB,UAA1B;AAAA,GATD;;AAWT,UAAU;AAAA,WAAS,OAAO,KAAP,KAAiB,QAA1B;AAAA,GAXD;;AAaT,QAAU;AAAA,WAAS,OAAO,KAAP,KAAiB,SAA1B;AAAA,GAbD;;AAeT,UAAU;AAAA,WAAS,OAAO,KAAP,KAAiB,QAA1B;AAAA,GAfD;;AAiBT,WAAS,wBAAS;AAChB,QAAI,CAAC,KAAD,IAAW,QAAO,KAAP,yCAAO,KAAP,OAAiB,QAAhC,EAA2C;AAAE,aAAO,KAAP;AAAe;;AAE5D,QAAM,UAAU,IAAI,SAAJ,CAAc,KAAd,KAAwB,IAAI,MAA5C;;AAEA,WAAQ,mBAAkB,IAAlB,SAA8B,QAAQ,OAAtC,KACJ,iBAAiB,QAAQ,OADrB,CAC6B;AAD7B,QAEJ,MAAM,QAAN,KAAmB,CAAnB,IAAwB,OAAO,MAAM,QAAb,KAA0B;AAFtD;AAGD;AAzBQ,CAAX;;AA4BA,GAAG,KAAH,GAAW;AAAA,SAAU,GAAG,MAAH,CAAU,KAAV,KACf,OAAO,MAAM,MAAb,KAAwB,WADT,IAEhB,GAAG,QAAH,CAAY,MAAM,MAAlB,CAFM;AAAA,CAAX;;AAIA,OAAO,OAAP,GAAiB,EAAjB;;;;;ACnCA,OAAO,OAAP,GAAiB,UAAC,KAAD;AAAA,SAAW,CAAC,EAAE,SAAS,MAAM,MAAjB,CAAD,IAA8B,iBAAiB,MAAM,MAAhE;AAAA,CAAjB;;;;;ACAA,SAAS,aAAT,CAAwB,IAAxB,EAA8B,MAA9B,EAAsC;AACpC,OAAK,IAAM,IAAX,IAAmB,MAAnB,EAA2B;AACzB,QAAM,kBAAkB,OAAO,OAAP,CAAe,eAAvC;AACA,QAAI,aAAa,KAAjB;;AAEA;AACA,SAAK,IAAM,MAAX,IAAqB,eAArB,EAAsC;AACpC,UAAI,KAAK,OAAL,CAAa,MAAb,MAAyB,CAAzB,IAA8B,gBAAgB,MAAhB,EAAwB,IAAxB,CAA6B,IAA7B,CAAlC,EAAsE;AACpE,qBAAa,IAAb;AACA;AACD;AACF;;AAED,QAAI,CAAC,UAAD,IAAe,OAAO,OAAO,IAAP,CAAP,KAAwB,UAA3C,EAAuD;AACrD,WAAK,IAAL,IAAa,OAAO,IAAP,CAAb;AACD;AACF;AACD,SAAO,IAAP;AACD;;AAED,cAAc,eAAd,GAAgC;AAC9B,UAAQ;AADsB,CAAhC;;AAIA,OAAO,OAAP,GAAiB,aAAjB;;;;;ACxBA,IAAM,QAAgB,QAAQ,SAAR,CAAtB;AACA,IAAM,UAAgB,QAAQ,WAAR,CAAtB;AACA,IAAM,MAAgB,QAAQ,cAAR,CAAtB;AACA,IAAM,WAAgB,QAAQ,YAAR,CAAtB;AACA,IAAM,aAAgB,QAAQ,cAAR,CAAtB;AACA,IAAM,KAAgB,QAAQ,MAAR,CAAtB;AACA,IAAM,gBAAgB,QAAQ,iBAAR,CAAtB;;AAEA,IAAM,eAAe;AACnB,cAAY,oBAAU,IAAV,EAAgB,GAAhB,EAAqB;AAC/B,SAAK,IAAL,GAAY,KAAK,IAAL,IAAa,EAAzB;AACA,SAAK,IAAL,CAAU,CAAV,GAAc,IAAI,IAAJ,CAAS,CAAvB;AACA,SAAK,IAAL,CAAU,CAAV,GAAc,IAAI,IAAJ,CAAS,CAAvB;;AAEA,SAAK,MAAL,GAAc,KAAK,MAAL,IAAe,EAA7B;AACA,SAAK,MAAL,CAAY,CAAZ,GAAgB,IAAI,MAAJ,CAAW,CAA3B;AACA,SAAK,MAAL,CAAY,CAAZ,GAAgB,IAAI,MAAJ,CAAW,CAA3B;;AAEA,SAAK,SAAL,GAAiB,IAAI,SAArB;AACD,GAXkB;;AAanB,kBAAgB,wBAAU,SAAV,EAAqB,IAArB,EAA2B,GAA3B,EAAgC;AAC9C,cAAU,IAAV,CAAe,CAAf,GAAsB,IAAI,IAAJ,CAAS,CAAT,GAAgB,KAAK,IAAL,CAAU,CAAhD;AACA,cAAU,IAAV,CAAe,CAAf,GAAsB,IAAI,IAAJ,CAAS,CAAT,GAAgB,KAAK,IAAL,CAAU,CAAhD;AACA,cAAU,MAAV,CAAiB,CAAjB,GAAsB,IAAI,MAAJ,CAAW,CAAX,GAAgB,KAAK,MAAL,CAAY,CAAlD;AACA,cAAU,MAAV,CAAiB,CAAjB,GAAsB,IAAI,MAAJ,CAAW,CAAX,GAAgB,KAAK,MAAL,CAAY,CAAlD;AACA,cAAU,SAAV,GAAsB,IAAI,SAAJ,GAAgB,KAAK,SAA3C;;AAEA;AACA,QAAM,KAAK,KAAK,GAAL,CAAS,UAAU,SAAV,GAAsB,IAA/B,EAAqC,KAArC,CAAX;;AAEA,cAAU,IAAV,CAAe,KAAf,GAAyB,MAAM,UAAU,IAAV,CAAe,CAArB,EAAwB,UAAU,IAAV,CAAe,CAAvC,IAA4C,EAArE;AACA,cAAU,IAAV,CAAe,EAAf,GAAyB,UAAU,IAAV,CAAe,CAAf,GAAmB,EAA5C;AACA,cAAU,IAAV,CAAe,EAAf,GAAyB,UAAU,IAAV,CAAe,CAAf,GAAmB,EAA5C;;AAEA,cAAU,MAAV,CAAiB,KAAjB,GAAyB,MAAM,UAAU,MAAV,CAAiB,CAAvB,EAA0B,UAAU,IAAV,CAAe,CAAzC,IAA8C,EAAvE;AACA,cAAU,MAAV,CAAiB,EAAjB,GAAyB,UAAU,MAAV,CAAiB,CAAjB,GAAqB,EAA9C;AACA,cAAU,MAAV,CAAiB,EAAjB,GAAyB,UAAU,MAAV,CAAiB,CAAjB,GAAqB,EAA9C;AACD,GA9BkB;;AAgCnB,mBAAiB,yBAAW,OAAX,EAAoB;AACnC,WAAQ,mBAAmB,IAAI,KAAvB,IAAgC,mBAAmB,IAAI,KAA/D;AACD,GAlCkB;;AAoCnB;AACA,SAAO,eAAU,IAAV,EAAgB,OAAhB,EAAyB,EAAzB,EAA6B;AAClC,SAAK,MAAM,EAAX;AACA,WAAO,QAAQ,MAAf;;AAEA,OAAG,CAAH,GAAO,QAAQ,OAAO,GAAf,CAAP;AACA,OAAG,CAAH,GAAO,QAAQ,OAAO,GAAf,CAAP;;AAEA,WAAO,EAAP;AACD,GA7CkB;;AA+CnB,aAAW,mBAAU,OAAV,EAAmB,IAAnB,EAAyB;AAClC,WAAO,QAAQ,EAAf;;AAEA;AACA,QAAI,QAAQ,aAAR,IAAyB,aAAa,eAAb,CAA6B,OAA7B,CAA7B,EAAoE;AAClE,mBAAa,KAAb,CAAmB,QAAnB,EAA6B,OAA7B,EAAsC,IAAtC;;AAEA,WAAK,CAAL,IAAU,OAAO,OAAjB;AACA,WAAK,CAAL,IAAU,OAAO,OAAjB;AACD,KALD,MAMK;AACH,mBAAa,KAAb,CAAmB,MAAnB,EAA2B,OAA3B,EAAoC,IAApC;AACD;;AAED,WAAO,IAAP;AACD,GA9DkB;;AAgEnB,eAAa,qBAAU,OAAV,EAAmB,MAAnB,EAA2B;AACtC,aAAS,UAAU,EAAnB;;AAEA,QAAI,QAAQ,aAAR,IAAyB,aAAa,eAAb,CAA6B,OAA7B,CAA7B,EAAoE;AAClE;AACA,mBAAa,KAAb,CAAmB,QAAnB,EAA6B,OAA7B,EAAsC,MAAtC;AACD,KAHD,MAIK;AACH,mBAAa,KAAb,CAAmB,QAAnB,EAA6B,OAA7B,EAAsC,MAAtC;AACD;;AAED,WAAO,MAAP;AACD,GA5EkB;;AA8EnB,gBAAc,sBAAU,OAAV,EAAmB;AAC/B,WAAO,GAAG,MAAH,CAAU,QAAQ,SAAlB,IAA8B,QAAQ,SAAtC,GAAkD,QAAQ,UAAjE;AACD,GAhFkB;;AAkFnB,aAAW,mBAAU,SAAV,EAAqB,QAArB,EAA+B,SAA/B,EAA0C;AACnD,QAAM,UAAW,SAAS,MAAT,GAAkB,CAAlB,GACE,aAAa,cAAb,CAA4B,QAA5B,CADF,GAEE,SAAS,CAAT,CAFnB;;AAIA,QAAM,QAAQ,EAAd;;AAEA,iBAAa,SAAb,CAAuB,OAAvB,EAAgC,KAAhC;AACA,cAAU,IAAV,CAAe,CAAf,GAAmB,MAAM,CAAzB;AACA,cAAU,IAAV,CAAe,CAAf,GAAmB,MAAM,CAAzB;;AAEA,iBAAa,WAAb,CAAyB,OAAzB,EAAkC,KAAlC;AACA,cAAU,MAAV,CAAiB,CAAjB,GAAqB,MAAM,CAA3B;AACA,cAAU,MAAV,CAAiB,CAAjB,GAAqB,MAAM,CAA3B;;AAEA,cAAU,SAAV,GAAsB,GAAG,MAAH,CAAU,SAAV,IAAuB,SAAvB,GAAkC,IAAI,IAAJ,GAAW,OAAX,EAAxD;AACD,GAlGkB;;AAoGnB,iBAAe,aApGI;;AAsGnB,gBAAc,sBAAU,KAAV,EAAiB;AAC7B,QAAM,UAAU,EAAhB;;AAEA;AACA,QAAI,GAAG,KAAH,CAAS,KAAT,CAAJ,EAAqB;AACnB,cAAQ,CAAR,IAAa,MAAM,CAAN,CAAb;AACA,cAAQ,CAAR,IAAa,MAAM,CAAN,CAAb;AACD;AACD;AAJA,SAKK;AACH,YAAI,MAAM,IAAN,KAAe,UAAnB,EAA+B;AAC7B,cAAI,MAAM,OAAN,CAAc,MAAd,KAAyB,CAA7B,EAAgC;AAC9B,oBAAQ,CAAR,IAAa,MAAM,OAAN,CAAc,CAAd,CAAb;AACA,oBAAQ,CAAR,IAAa,MAAM,cAAN,CAAqB,CAArB,CAAb;AACD,WAHD,MAIK,IAAI,MAAM,OAAN,CAAc,MAAd,KAAyB,CAA7B,EAAgC;AACnC,oBAAQ,CAAR,IAAa,MAAM,cAAN,CAAqB,CAArB,CAAb;AACA,oBAAQ,CAAR,IAAa,MAAM,cAAN,CAAqB,CAArB,CAAb;AACD;AACF,SATD,MAUK;AACH,kBAAQ,CAAR,IAAa,MAAM,OAAN,CAAc,CAAd,CAAb;AACA,kBAAQ,CAAR,IAAa,MAAM,OAAN,CAAc,CAAd,CAAb;AACD;AACF;;AAED,WAAO,OAAP;AACD,GAjIkB;;AAmInB,kBAAgB,wBAAU,QAAV,EAAoB;AAClC,QAAM,UAAU;AACd,aAAS,CADK;AAEd,aAAS,CAFK;AAGd,eAAS,CAHK;AAId,eAAS,CAJK;AAKd,eAAS,CALK;AAMd,eAAS;AANK,KAAhB;;AASA,yBAAsB,QAAtB,kHAAgC;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAArB,OAAqB;;AAC9B,WAAK,IAAM,KAAX,IAAmB,OAAnB,EAA4B;AAC1B,gBAAQ,KAAR,KAAiB,QAAQ,KAAR,CAAjB;AACD;AACF;AACD,SAAK,IAAM,IAAX,IAAmB,OAAnB,EAA4B;AAC1B,cAAQ,IAAR,KAAiB,SAAS,MAA1B;AACD;;AAED,WAAO,OAAP;AACD,GAvJkB;;AAyJnB,aAAW,mBAAU,KAAV,EAAiB;AAC1B,QAAI,CAAC,MAAM,MAAP,IAAiB,EAAE,MAAM,OAAN,IAAiB,MAAM,OAAN,CAAc,MAAd,GAAuB,CAA1C,CAArB,EAAmE;AACjE;AACD;;AAED,QAAM,UAAU,aAAa,YAAb,CAA0B,KAA1B,CAAhB;AACA,QAAM,OAAO,KAAK,GAAL,CAAS,QAAQ,CAAR,EAAW,KAApB,EAA2B,QAAQ,CAAR,EAAW,KAAtC,CAAb;AACA,QAAM,OAAO,KAAK,GAAL,CAAS,QAAQ,CAAR,EAAW,KAApB,EAA2B,QAAQ,CAAR,EAAW,KAAtC,CAAb;AACA,QAAM,OAAO,KAAK,GAAL,CAAS,QAAQ,CAAR,EAAW,KAApB,EAA2B,QAAQ,CAAR,EAAW,KAAtC,CAAb;AACA,QAAM,OAAO,KAAK,GAAL,CAAS,QAAQ,CAAR,EAAW,KAApB,EAA2B,QAAQ,CAAR,EAAW,KAAtC,CAAb;;AAEA,WAAO;AACL,SAAG,IADE;AAEL,SAAG,IAFE;AAGL,YAAM,IAHD;AAIL,WAAK,IAJA;AAKL,aAAO,OAAO,IALT;AAML,cAAQ,OAAO;AANV,KAAP;AAQD,GA5KkB;;AA8KnB,iBAAe,uBAAU,KAAV,EAAiB,WAAjB,EAA8B;AAC3C,QAAM,UAAU,cAAc,GAA9B;AACA,QAAM,UAAU,cAAc,GAA9B;AACA,QAAM,UAAU,aAAa,YAAb,CAA0B,KAA1B,CAAhB;;AAGA,QAAM,KAAK,QAAQ,CAAR,EAAW,OAAX,IAAsB,QAAQ,CAAR,EAAW,OAAX,CAAjC;AACA,QAAM,KAAK,QAAQ,CAAR,EAAW,OAAX,IAAsB,QAAQ,CAAR,EAAW,OAAX,CAAjC;;AAEA,WAAO,MAAM,EAAN,EAAU,EAAV,CAAP;AACD,GAxLkB;;AA0LnB,cAAY,oBAAU,KAAV,EAAiB,SAAjB,EAA4B,WAA5B,EAAyC;AACnD,QAAM,UAAU,cAAc,GAA9B;AACA,QAAM,UAAU,cAAc,GAA9B;AACA,QAAM,UAAU,aAAa,YAAb,CAA0B,KAA1B,CAAhB;AACA,QAAM,KAAK,QAAQ,CAAR,EAAW,OAAX,IAAsB,QAAQ,CAAR,EAAW,OAAX,CAAjC;AACA,QAAM,KAAK,QAAQ,CAAR,EAAW,OAAX,IAAsB,QAAQ,CAAR,EAAW,OAAX,CAAjC;AACA,QAAM,QAAQ,MAAM,KAAK,KAAL,CAAW,EAAX,EAAgB,EAAhB,CAAN,GAA4B,KAAK,EAA/C;;AAEA,WAAQ,KAAR;AACD,GAnMkB;;AAqMnB,kBAAgB,wBAAU,OAAV,EAAmB;AACjC,WAAO,GAAG,MAAH,CAAU,QAAQ,WAAlB,IACH,QAAQ,WADL,GAEH,GAAG,MAAH,CAAU,QAAQ,WAAlB,IACE,CAAC,SAAD,EAAY,SAAZ,EAAsB,OAAtB,EAA+B,KAA/B,EAAsC,OAAtC,EAA+C,QAAQ,WAAvD;AACA;AACA;AAHF,MAII,QAAQ,IAAR,CAAa,QAAQ,IAArB,KAA8B,mBAAmB,WAAW,KAA5D,GACE,OADF,GAEE,OARV;AASD,GA/MkB;;AAiNnB;AACA,mBAAiB,yBAAU,KAAV,EAAiB;AAChC,WAAO,CACL,SAAS,gBAAT,CAA0B,MAAM,IAAN,GAAa,MAAM,IAAN,CAAW,CAAX,CAAb,GAA6B,MAAM,MAA7D,CADK,EAEL,SAAS,gBAAT,CAA0B,MAAM,aAAhC,CAFK,CAAP;AAID;AAvNkB,CAArB;;AA0NA,OAAO,OAAP,GAAiB,YAAjB;;;;;eClOmB,QAAQ,UAAR,C;IAAX,M,YAAA,M;;AAER,IAAM,UAAU,CAAC,IAAD,EAAO,KAAP,EAAc,QAAd,EAAwB,GAAxB,CAAhB;AACA,IAAI,WAAW,CAAf;AACA,IAAI,gBAAJ;AACA,IAAI,eAAJ;;AAEA,KAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,QAAQ,MAAZ,IAAsB,CAAC,OAAO,qBAA9C,EAAqE,GAArE,EAA0E;AACxE,YAAU,OAAO,QAAQ,CAAR,IAAa,uBAApB,CAAV;AACA,WAAS,OAAO,QAAQ,CAAR,IAAY,sBAAnB,KAA8C,OAAO,QAAQ,CAAR,IAAa,6BAApB,CAAvD;AACD;;AAED,IAAI,CAAC,OAAL,EAAc;AACZ,YAAU,iBAAU,QAAV,EAAoB;AAC5B,QAAM,WAAW,IAAI,IAAJ,GAAW,OAAX,EAAjB;AACA,QAAM,aAAa,KAAK,GAAL,CAAS,CAAT,EAAY,MAAM,WAAW,QAAjB,CAAZ,CAAnB;AACA,QAAM,KAAK,WAAW,YAAY;AAAE,eAAS,WAAW,UAApB;AAAkC,KAA3D,EACW,UADX,CAAX;;AAGA,eAAW,WAAW,UAAtB;AACA,WAAO,EAAP;AACD,GARD;AASD;;AAED,IAAI,CAAC,MAAL,EAAa;AACX,WAAS,gBAAU,EAAV,EAAc;AACrB,iBAAa,EAAb;AACD,GAFD;AAGD;;AAED,OAAO,OAAP,GAAiB;AACf,kBADe;AAEf;AAFe,CAAjB;;;;;AC9BA,IAAM,SAAS,QAAQ,UAAR,CAAf;AACA,IAAM,KAAK,QAAQ,MAAR,CAAX;;eAKI,QAAQ,YAAR,C;IAHF,O,YAAA,O;IACA,U,YAAA,U;IACA,c,YAAA,c;;AAGF,IAAM,YAAY;AAChB,yBAAuB,+BAAU,KAAV,EAAiB,YAAjB,EAA+B,OAA/B,EAAwC;AAC7D,QAAI,CAAC,GAAG,MAAH,CAAU,KAAV,CAAL,EAAuB;AACrB,aAAO,IAAP;AACD;;AAED,QAAI,UAAU,QAAd,EAAwB;AACtB,cAAQ,WAAW,OAAX,CAAR;AACD,KAFD,MAGK,IAAI,UAAU,MAAd,EAAsB;AACzB,cAAQ,aAAa,OAAb,CAAqB,OAArB,CAAR;AACD,KAFI,MAGA;AACH,cAAQ,QAAQ,OAAR,EAAiB,KAAjB,CAAR;AACD;;AAED,WAAO,KAAP;AACD,GAjBe;;AAmBhB,mBAAiB,yBAAU,KAAV,EAAiB,YAAjB,EAA+B,OAA/B,EAAwC,YAAxC,EAAsD;AACrE,YAAQ,UAAU,qBAAV,CAAgC,KAAhC,EAAuC,YAAvC,EAAqD,OAArD,KAAiE,KAAzE;;AAEA,QAAI,GAAG,QAAH,CAAY,KAAZ,CAAJ,EAAwB;AACtB,cAAQ,MAAM,KAAN,CAAY,IAAZ,EAAkB,YAAlB,CAAR;AACD;;AAED,QAAI,GAAG,OAAH,CAAW,KAAX,CAAJ,EAAuB;AACrB,cAAQ,eAAe,KAAf,CAAR;AACD;;AAED,WAAO,KAAP;AACD,GA/Be;;AAiChB,YAAU,kBAAU,IAAV,EAAgB;AACxB,WAAQ,QAAQ;AACd,SAAG,OAAO,IAAP,GAAc,KAAK,CAAnB,GAAuB,KAAK,IADjB;AAEd,SAAG,OAAO,IAAP,GAAc,KAAK,CAAnB,GAAuB,KAAK;AAFjB,KAAhB;AAID,GAtCe;;AAwChB,cAAY,oBAAU,IAAV,EAAgB;AAC1B,QAAI,QAAQ,EAAE,UAAU,IAAV,IAAkB,SAAS,IAA7B,CAAZ,EAAgD;AAC9C,aAAO,OAAO,EAAP,EAAW,IAAX,CAAP;;AAEA,WAAK,IAAL,GAAc,KAAK,CAAL,IAAU,CAAxB;AACA,WAAK,GAAL,GAAc,KAAK,CAAL,IAAU,CAAxB;AACA,WAAK,KAAL,GAAc,KAAK,KAAL,IAAiB,KAAK,IAAL,GAAY,KAAK,KAAhD;AACA,WAAK,MAAL,GAAc,KAAK,MAAL,IAAiB,KAAK,GAAL,GAAW,KAAK,MAA/C;AACD;;AAED,WAAO,IAAP;AACD,GAnDe;;AAqDhB,cAAY,oBAAU,IAAV,EAAgB;AAC1B,QAAI,QAAQ,EAAE,OAAO,IAAP,IAAe,OAAO,IAAxB,CAAZ,EAA2C;AACzC,aAAO,OAAO,EAAP,EAAW,IAAX,CAAP;;AAEA,WAAK,CAAL,GAAc,KAAK,IAAL,IAAa,CAA3B;AACA,WAAK,GAAL,GAAc,KAAK,GAAL,IAAa,CAA3B;AACA,WAAK,KAAL,GAAc,KAAK,KAAL,IAAgB,KAAK,KAAL,GAAc,KAAK,CAAjD;AACA,WAAK,MAAL,GAAc,KAAK,MAAL,IAAgB,KAAK,MAAL,GAAc,KAAK,CAAjD;AACD;;AAED,WAAO,IAAP;AACD;AAhEe,CAAlB;;AAmEA,OAAO,OAAP,GAAiB,SAAjB;;;;;AC3EA,IAAM,MAAM,OAAO,OAAnB;AACA,IAAM,WAAW,QAAQ,YAAR,CAAjB;;AAEA,SAAS,IAAT,CAAe,MAAf,EAAuB;AACrB;;AAEA,MAAI,UAAJ,GAAiB,MAAjB;;AAEA;AACA,MAAM,KAAK,OAAO,QAAP,CAAgB,cAAhB,CAA+B,EAA/B,CAAX;;AAEA;AACA,MAAI,GAAG,aAAH,KAAqB,OAAO,QAA5B,IACG,OAAO,OAAO,IAAd,KAAuB,UAD1B,IAEC,OAAO,IAAP,CAAY,EAAZ,MAAoB,EAFzB,EAE6B;AAC3B;AACA,aAAS,OAAO,IAAP,CAAY,MAAZ,CAAT;AACD;;AAED,MAAI,MAAJ,GAAa,MAAb;AACD;;AAED,IAAI,OAAO,MAAP,KAAkB,WAAtB,EAAmC;AACjC,MAAI,MAAJ,GAAiB,SAAjB;AACA,MAAI,UAAJ,GAAiB,SAAjB;AACD,CAHD,MAIK;AACH,OAAK,MAAL;AACD;;AAED,IAAI,SAAJ,GAAgB,SAAS,SAAT,CAAoB,IAApB,EAA0B;AACxC,MAAI,SAAS,IAAT,CAAJ,EAAoB;AAClB,WAAO,IAAP;AACD;;AAED,MAAM,WAAY,KAAK,aAAL,IAAsB,IAAxC;;AAEA,SAAO,SAAS,WAAT,IAAwB,SAAS,YAAjC,IAAiD,IAAI,MAA5D;AACD,CARD;;AAUA,IAAI,IAAJ,GAAW,IAAX","file":"interact.js","sourceRoot":"","sourcesContent":["/**\n * interact.js v1.3.0-alpha.4+sha.7970416-dirty\n *\n * Copyright (c) 2012-2017 Taye Adeyemi \n * Open source under the MIT License.\n * https://raw.github.com/taye/interact.js/master/LICENSE\n */\n","(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o 150) {\n return null;\n }\n\n let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI;\n const overlap = 22.5;\n\n if (angle < 0) {\n angle += 360;\n }\n\n const left = 135 - overlap <= angle && angle < 225 + overlap;\n const up = 225 - overlap <= angle && angle < 315 + overlap;\n\n const right = !left && (315 - overlap <= angle || angle < 45 + overlap);\n const down = !up && 45 - overlap <= angle && angle < 135 + overlap;\n\n return {\n up,\n down,\n left,\n right,\n angle,\n speed: interaction.prevEvent.speed,\n velocity: {\n x: interaction.prevEvent.velocityX,\n y: interaction.prevEvent.velocityY,\n },\n };\n }\n\n preventDefault () {}\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n}\n\nsignals.on('set-delta', function ({ iEvent, interaction, starting, deltaSource }) {\n const prevEvent = starting? iEvent : interaction.prevEvent;\n\n if (deltaSource === 'client') {\n iEvent.dx = iEvent.clientX - prevEvent.clientX;\n iEvent.dy = iEvent.clientY - prevEvent.clientY;\n }\n else {\n iEvent.dx = iEvent.pageX - prevEvent.pageX;\n iEvent.dy = iEvent.pageY - prevEvent.pageY;\n }\n});\n\nInteractEvent.signals = signals;\n\nmodule.exports = InteractEvent;\n","const is = require('./utils/is');\nconst events = require('./utils/events');\nconst extend = require('./utils/extend');\nconst actions = require('./actions/base');\nconst scope = require('./scope');\nconst Eventable = require('./Eventable');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nconst {\n getElementRect,\n nodeContains,\n trySelector,\n} = require('./utils/domUtils');\nconst { getWindow } = require('./utils/window');\nconst { indexOf, contains } = require('./utils/arr');\nconst { wheelEvent } = require('./utils/browser');\n\n// all set interactables\nscope.interactables = [];\n\n/*\\\n * Interactable\n [ property ]\n **\n * Object type returned by @interact\n\\*/\nclass Interactable {\n constructor (target, options) {\n options = options || {};\n\n this.target = target;\n this.events = new Eventable();\n this._context = options.context || scope.document;\n this._win = getWindow(trySelector(target)? this._context : target);\n this._doc = this._win.document;\n\n signals.fire('new', {\n target,\n options,\n interactable: this,\n win: this._win,\n });\n\n scope.addDocument( this._doc, this._win );\n\n scope.interactables.push(this);\n\n this.set(options);\n }\n\n setOnEvents (action, phases) {\n const onAction = 'on' + action;\n\n if (is.function(phases.onstart) ) { this.events[onAction + 'start' ] = phases.onstart ; }\n if (is.function(phases.onmove) ) { this.events[onAction + 'move' ] = phases.onmove ; }\n if (is.function(phases.onend) ) { this.events[onAction + 'end' ] = phases.onend ; }\n if (is.function(phases.oninertiastart)) { this.events[onAction + 'inertiastart' ] = phases.oninertiastart ; }\n\n return this;\n }\n\n setPerAction (action, options) {\n // for all the default per-action options\n for (const option in options) {\n // if this option exists for this action\n if (option in defaults[action]) {\n // if the option in the options arg is an object value\n if (is.object(options[option])) {\n // duplicate the object\n this.options[action][option] = extend(this.options[action][option] || {}, options[option]);\n\n if (is.object(defaults.perAction[option]) && 'enabled' in defaults.perAction[option]) {\n this.options[action][option].enabled = options[option].enabled === false? false : true;\n }\n }\n else if (is.bool(options[option]) && is.object(defaults.perAction[option])) {\n this.options[action][option].enabled = options[option];\n }\n else if (options[option] !== undefined) {\n // or if it's not undefined, do a plain assignment\n this.options[action][option] = options[option];\n }\n }\n }\n }\n\n /*\\\n * Interactable.getRect\n [ method ]\n *\n * The default function to get an Interactables bounding rect. Can be\n * overridden using @Interactable.rectChecker.\n *\n - element (Element) #optional The element to measure.\n = (object) The object's bounding rectangle.\n o {\n o top : 0,\n o left : 0,\n o bottom: 0,\n o right : 0,\n o width : 0,\n o height: 0\n o }\n \\*/\n getRect (element) {\n element = element || this.target;\n\n if (is.string(this.target) && !(is.element(element))) {\n element = this._context.querySelector(this.target);\n }\n\n return getElementRect(element);\n }\n\n /*\\\n * Interactable.rectChecker\n [ method ]\n *\n * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n - checker (function) #optional A function which returns this Interactable's bounding rectangle. See @Interactable.getRect\n = (function | object) The checker function or this Interactable\n \\*/\n rectChecker (checker) {\n if (is.function(checker)) {\n this.getRect = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.getRect;\n\n return this;\n }\n\n return this.getRect;\n }\n\n _backCompatOption (optionName, newValue) {\n if (trySelector(newValue) || is.object(newValue)) {\n this.options[optionName] = newValue;\n\n for (const action of actions.names) {\n this.options[action][optionName] = newValue;\n }\n\n return this;\n }\n\n return this.options[optionName];\n }\n\n /*\\\n * Interactable.origin\n [ method ]\n *\n * Gets or sets the origin of the Interactable's element. The x and y\n * of the origin will be subtracted from action event coordinates.\n *\n - origin (object | string) #optional An object eg. { x: 0, y: 0 } or string 'parent', 'self' or any CSS selector\n * OR\n - origin (Element) #optional An HTML or SVG Element whose rect will be used\n **\n = (object) The current origin or this Interactable\n \\*/\n origin (newValue) {\n return this._backCompatOption('origin', newValue);\n }\n\n /*\\\n * Interactable.deltaSource\n [ method ]\n *\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n - newValue (string) #optional Use 'client' if you will be scrolling while interacting; Use 'page' if you want autoScroll to work\n = (string | object) The current deltaSource or this Interactable\n \\*/\n deltaSource (newValue) {\n if (newValue === 'page' || newValue === 'client') {\n this.options.deltaSource = newValue;\n\n return this;\n }\n\n return this.options.deltaSource;\n }\n\n /*\\\n * Interactable.context\n [ method ]\n *\n * Gets the selector context Node of the Interactable. The default is `window.document`.\n *\n = (Node) The context Node of this Interactable\n **\n \\*/\n context () {\n return this._context;\n }\n\n inContext (element) {\n return (this._context === element.ownerDocument\n || nodeContains(this._context, element));\n }\n\n /*\\\n * Interactable.fire\n [ method ]\n *\n * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n - iEvent (InteractEvent) The InteractEvent object to be fired on this Interactable\n = (Interactable) this Interactable\n \\*/\n fire (iEvent) {\n this.events.fire(iEvent);\n\n return this;\n }\n\n _onOffMultiple (method, eventType, listener, options) {\n if (is.string(eventType) && eventType.search(' ') !== -1) {\n eventType = eventType.trim().split(/ +/);\n }\n\n if (is.array(eventType)) {\n for (let i = 0; i < eventType.length; i++) {\n this[method](eventType[i], listener, options);\n }\n\n return true;\n }\n\n if (is.object(eventType)) {\n for (const prop in eventType) {\n this[method](prop, eventType[prop], listener);\n }\n\n return true;\n }\n }\n\n /*\\\n * Interactable.on\n [ method ]\n *\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n - eventType (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) This Interactable\n \\*/\n on (eventType, listener, options) {\n if (this._onOffMultiple('on', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.on(eventType, listener);\n }\n // delegated event for selector\n else if (is.string(this.target)) {\n events.addDelegate(this.target, this._context, eventType, listener, options);\n }\n else {\n events.add(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.off\n [ method ]\n *\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n - eventType (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) This Interactable\n \\*/\n off (eventType, listener, options) {\n if (this._onOffMultiple('off', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n // if it is an action event type\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.off(eventType, listener);\n }\n // delegated event\n else if (is.string(this.target)) {\n events.removeDelegate(this.target, this._context, eventType, listener, options);\n }\n // remove listener from this Interatable's element\n else {\n events.remove(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.set\n [ method ]\n *\n * Reset the options of this Interactable\n - options (object) The new settings to apply\n = (object) This Interactable\n \\*/\n set (options) {\n if (!is.object(options)) {\n options = {};\n }\n\n this.options = extend({}, defaults.base);\n\n const perActions = extend({}, defaults.perAction);\n\n for (const actionName in actions.methodDict) {\n const methodName = actions.methodDict[actionName];\n\n this.options[actionName] = extend({}, defaults[actionName]);\n\n this.setPerAction(actionName, perActions);\n\n this[methodName](options[actionName]);\n }\n\n for (const setting of Interactable.settingsMethods) {\n this.options[setting] = defaults.base[setting];\n\n if (setting in options) {\n this[setting](options[setting]);\n }\n }\n\n signals.fire('set', {\n options,\n interactable: this,\n });\n\n return this;\n }\n\n /*\\\n * Interactable.unset\n [ method ]\n *\n * Remove this interactable from the list of interactables and remove\n * it's action capabilities and event listeners\n *\n = (object) @interact\n \\*/\n unset () {\n events.remove(this.target, 'all');\n\n if (is.string(this.target)) {\n // remove delegated events\n for (const type in events.delegatedEvents) {\n const delegated = events.delegatedEvents[type];\n\n if (delegated.selectors[0] === this.target\n && delegated.contexts[0] === this._context) {\n\n delegated.selectors.splice(0, 1);\n delegated.contexts .splice(0, 1);\n delegated.listeners.splice(0, 1);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegated[type] = null;\n }\n }\n\n events.remove(this._context, type, events.delegateListener);\n events.remove(this._context, type, events.delegateUseCapture, true);\n }\n }\n else {\n events.remove(this, 'all');\n }\n\n signals.fire('unset', { interactable: this });\n\n scope.interactables.splice(indexOf(scope.interactables, this), 1);\n\n // Stop related interactions when an Interactable is unset\n for (const interaction of scope.interactions || []) {\n if (interaction.target === this && interaction.interacting()) {\n interaction.stop();\n }\n }\n\n return scope.interact;\n }\n}\n\nscope.interactables.indexOfElement = function indexOfElement (target, context) {\n context = context || scope.document;\n\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n if (interactable.target === target && interactable._context === context) {\n return i;\n }\n }\n return -1;\n};\n\nscope.interactables.get = function interactableGet (element, options, dontCheckInContext) {\n const ret = this[this.indexOfElement(element, options && options.context)];\n\n return ret && (is.string(element) || dontCheckInContext || ret.inContext(element))? ret : null;\n};\n\nscope.interactables.forEachSelector = function (callback, element) {\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n // skip non CSS selector targets and out of context elements\n if (!is.string(interactable.target)\n || (element && !interactable.inContext(element))) {\n continue;\n }\n\n const ret = callback(interactable, interactable.target, interactable._context, i, this);\n\n if (ret !== undefined) {\n return ret;\n }\n }\n};\n\n// all interact.js eventTypes\nInteractable.eventTypes = scope.eventTypes = [];\n\nInteractable.signals = signals;\n\nInteractable.settingsMethods = [ 'deltaSource', 'origin', 'preventDefault', 'rectChecker' ];\n\nmodule.exports = Interactable;\n","const scope = require('./scope');\nconst utils = require('./utils');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst domObjects = require('./utils/domObjects');\nconst finder = require('./utils/interactionFinder');\nconst signals = require('./utils/Signals').new();\n\nconst listeners = {};\nconst methodNames = [\n 'pointerDown', 'pointerMove', 'pointerUp',\n 'updatePointer', 'removePointer',\n];\n\n// for ignoring browser's simulated mouse events\nlet prevTouchTime = 0;\n\n// all active and idle interactions\nscope.interactions = [];\n\nclass Interaction {\n constructor ({ pointerType }) {\n this.target = null; // current interactable being interacted with\n this.element = null; // the target element of the interactable\n\n this.prepared = { // action that's ready to be fired on next move event\n name : null,\n axis : null,\n edges: null,\n };\n\n // keep track of added pointers\n this.pointers = [];\n this.pointerIds = [];\n this.downTargets = [];\n this.downTimes = [];\n\n // Previous native pointer move event coordinates\n this.prevCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n // current native pointer move event coordinates\n this.curCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Starting InteractEvent pointer coordinates\n this.startCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Change in coordinates and time of the pointer\n this.pointerDelta = {\n page : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n client : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n timeStamp: 0,\n };\n\n this.downEvent = null; // pointerdown/mousedown/touchstart event\n this.downPointer = {};\n\n this._eventTarget = null;\n this._curEventTarget = null;\n\n this.prevEvent = null; // previous action event\n\n this.pointerIsDown = false;\n this.pointerWasMoved = false;\n this._interacting = false;\n\n this.pointerType = pointerType;\n\n signals.fire('new', this);\n\n scope.interactions.push(this);\n }\n\n pointerDown (pointer, event, eventTarget) {\n const pointerIndex = this.updatePointer(pointer, event, true);\n\n signals.fire('down', {\n pointer,\n event,\n eventTarget,\n pointerIndex,\n interaction: this,\n });\n }\n\n /*\\\n * Interaction.start\n [ method ]\n *\n * Start an action with the given Interactable and Element as tartgets. The\n * action must be enabled for the target Interactable and an appropriate number\n * of pointers must be held down - 1 for drag/resize, 2 for gesture.\n *\n * Use it with `interactable.able({ manualStart: false })` to always\n * [start actions manually](https://github.com/taye/interact.js/issues/114)\n *\n - action (object) The action to be performed - drag, resize, etc.\n - target (Interactable) The Interactable to target\n - element (Element) The DOM Element to target\n = (object) interact\n **\n | interact(target)\n | .draggable({\n | // disable the default drag start by down->move\n | manualStart: true\n | })\n | // start dragging after the user holds the pointer down\n | .on('hold', function (event) {\n | var interaction = event.interaction;\n |\n | if (!interaction.interacting()) {\n | interaction.start({ name: 'drag' },\n | event.interactable,\n | event.currentTarget);\n | }\n | });\n \\*/\n start (action, target, element) {\n if (this.interacting()\n || !this.pointerIsDown\n || this.pointerIds.length < (action.name === 'gesture'? 2 : 1)) {\n return;\n }\n\n // if this interaction had been removed after stopping\n // add it back\n if (utils.indexOf(scope.interactions, this) === -1) {\n scope.interactions.push(this);\n }\n\n utils.copyAction(this.prepared, action);\n this.target = target;\n this.element = element;\n\n signals.fire('action-start', {\n interaction: this,\n event: this.downEvent,\n });\n }\n\n pointerMove (pointer, event, eventTarget) {\n if (!this.simulation) {\n this.updatePointer(pointer);\n utils.setCoords(this.curCoords, this.pointers);\n }\n\n const duplicateMove = (this.curCoords.page.x === this.prevCoords.page.x\n && this.curCoords.page.y === this.prevCoords.page.y\n && this.curCoords.client.x === this.prevCoords.client.x\n && this.curCoords.client.y === this.prevCoords.client.y);\n\n let dx;\n let dy;\n\n // register movement greater than pointerMoveTolerance\n if (this.pointerIsDown && !this.pointerWasMoved) {\n dx = this.curCoords.client.x - this.startCoords.client.x;\n dy = this.curCoords.client.y - this.startCoords.client.y;\n\n this.pointerWasMoved = utils.hypot(dx, dy) > Interaction.pointerMoveTolerance;\n }\n\n const signalArg = {\n pointer,\n pointerIndex: this.getPointerIndex(pointer),\n event,\n eventTarget,\n dx,\n dy,\n duplicate: duplicateMove,\n interaction: this,\n interactingBeforeMove: this.interacting(),\n };\n\n if (!duplicateMove) {\n // set pointer coordinate, time changes and speeds\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n }\n\n signals.fire('move', signalArg);\n\n if (!duplicateMove) {\n // if interacting, fire an 'action-move' signal etc\n if (this.interacting()) {\n this.doMove(signalArg);\n }\n\n if (this.pointerWasMoved) {\n utils.copyCoords(this.prevCoords, this.curCoords);\n }\n }\n }\n\n /*\\\n * Interaction.doMove\n [ method ]\n *\n * Force a move of the current action at the same coordinates. Useful if\n * snap/restrict has been changed and you want a movement with the new\n * settings.\n *\n **\n | interact(target)\n | .draggable(true)\n | .on('dragmove', function (event) {\n | if (someCondition) {\n | // change the snap settings\n | event.interactable.draggable({ snap: { targets: [] }});\n | // fire another move event with re-calculated snap\n | event.interaction.doMove();\n | }\n | });\n \\*/\n doMove (signalArg) {\n signalArg = utils.extend({\n pointer: this.pointers[0],\n event: this.prevEvent,\n eventTarget: this._eventTarget,\n interaction: this,\n }, signalArg || {});\n\n signals.fire('before-action-move', signalArg);\n\n if (!this._dontFireMove) {\n signals.fire('action-move', signalArg);\n }\n\n this._dontFireMove = false;\n }\n\n // End interact move events and stop auto-scroll unless simulation is running\n pointerUp (pointer, event, eventTarget, curEventTarget) {\n const pointerIndex = this.getPointerIndex(pointer);\n\n signals.fire(/cancel$/i.test(event.type)? 'cancel' : 'up', {\n pointer,\n pointerIndex,\n event,\n eventTarget,\n curEventTarget,\n interaction: this,\n });\n\n if (!this.simulation) {\n this.end(event);\n }\n\n this.pointerIsDown = false;\n this.removePointer(pointer, event);\n }\n\n /*\\\n * Interaction.end\n [ method ]\n *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n - event (PointerEvent) #optional\n **\n | interact(target)\n | .draggable(true)\n | .on('move', function (event) {\n | if (event.pageX > 1000) {\n | // end the current action\n | event.interaction.end();\n | // stop all further listeners from being called\n | event.stopImmediatePropagation();\n | }\n | });\n \\*/\n end (event) {\n event = event || this.prevEvent;\n\n if (this.interacting()) {\n signals.fire('action-end', {\n event,\n interaction: this,\n });\n }\n\n this.stop();\n }\n\n currentAction () {\n return this._interacting? this.prepared.name: null;\n }\n\n interacting () {\n return this._interacting;\n }\n\n stop () {\n signals.fire('stop', { interaction: this });\n\n if (this._interacting) {\n signals.fire('stop-active', { interaction: this });\n signals.fire('stop-' + this.prepared.name, { interaction: this });\n }\n\n this.target = this.element = null;\n\n this._interacting = false;\n this.prepared.name = this.prevEvent = null;\n }\n\n getPointerIndex (pointer) {\n // mouse and pen interactions may have only one pointer\n if (this.pointerType === 'mouse' || this.pointerType === 'pen') {\n return 0;\n }\n\n return utils.indexOf(this.pointerIds, utils.getPointerId(pointer));\n }\n\n updatePointer (pointer, event, down = event && /(down|start)$/i.test(event.type)) {\n const id = utils.getPointerId(pointer);\n let index = this.getPointerIndex(pointer);\n\n if (index === -1) {\n index = this.pointerIds.length;\n this.pointerIds[index] = id;\n }\n\n if (down) {\n signals.fire('update-pointer-down', {\n pointer,\n event,\n down,\n pointerId: id,\n pointerIndex: index,\n interaction: this,\n });\n }\n\n this.pointers[index] = pointer;\n\n return index;\n }\n\n removePointer (pointer, event) {\n const index = this.getPointerIndex(pointer);\n\n if (index === -1) { return; }\n\n signals.fire('remove-pointer', {\n pointer,\n event,\n pointerIndex: index,\n interaction: this,\n });\n\n this.pointers .splice(index, 1);\n this.pointerIds .splice(index, 1);\n this.downTargets.splice(index, 1);\n this.downTimes .splice(index, 1);\n }\n\n _updateEventTargets (target, currentTarget) {\n this._eventTarget = target;\n this._curEventTarget = currentTarget;\n }\n}\n\nfor (let i = 0, len = methodNames.length; i < len; i++) {\n const method = methodNames[i];\n\n listeners[method] = doOnInteractions(method);\n}\n\nfunction doOnInteractions (method) {\n return (function (event) {\n const pointerType = utils.getPointerType(event);\n const [eventTarget, curEventTarget] = utils.getEventTargets(event);\n const matches = []; // [ [pointer, interaction], ...]\n\n if (browser.supportsTouch && /touch/.test(event.type)) {\n prevTouchTime = new Date().getTime();\n\n for (let i = 0; i < event.changedTouches.length; i++) {\n const pointer = event.changedTouches[i];\n const interaction = finder.search(pointer, event.type, eventTarget);\n\n matches.push([pointer, interaction || new Interaction({ pointerType })]);\n }\n }\n else {\n let invalidPointer = false;\n\n if (!browser.supportsPointerEvent && /mouse/.test(event.type)) {\n // ignore mouse events while touch interactions are active\n for (let i = 0; i < scope.interactions.length && !invalidPointer; i++) {\n invalidPointer = scope.interactions[i].pointerType !== 'mouse' && scope.interactions[i].pointerIsDown;\n }\n\n // try to ignore mouse events that are simulated by the browser\n // after a touch event\n invalidPointer = invalidPointer\n || (new Date().getTime() - prevTouchTime < 500)\n // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated\n || event.timeStamp === 0;\n }\n\n if (!invalidPointer) {\n let interaction = finder.search(event, event.type, eventTarget);\n\n if (!interaction) {\n interaction = new Interaction({ pointerType });\n }\n\n matches.push([event, interaction]);\n }\n }\n\n for (const [pointer, interaction] of matches) {\n interaction._updateEventTargets(eventTarget, curEventTarget);\n interaction[method](pointer, event, eventTarget, curEventTarget);\n }\n });\n}\n\nfunction endAll (event) {\n for (let i = 0; i < scope.interactions.length; i++) {\n const interaction = scope.interactions[i];\n\n interaction.end(event);\n signals.fire('endall', { event, interaction });\n }\n}\n\nconst docEvents = { /* 'eventType': listenerFunc */ };\nconst pEventTypes = browser.pEventTypes;\n\nif (domObjects.PointerEvent) {\n docEvents[pEventTypes.down ] = listeners.pointerDown;\n docEvents[pEventTypes.move ] = listeners.pointerMove;\n docEvents[pEventTypes.up ] = listeners.pointerUp;\n docEvents[pEventTypes.cancel] = listeners.pointerUp;\n}\nelse {\n docEvents.mousedown = listeners.pointerDown;\n docEvents.mousemove = listeners.pointerMove;\n docEvents.mouseup = listeners.pointerUp;\n\n docEvents.touchstart = listeners.pointerDown;\n docEvents.touchmove = listeners.pointerMove;\n docEvents.touchend = listeners.pointerUp;\n docEvents.touchcancel = listeners.pointerUp;\n}\n\ndocEvents.blur = endAll;\n\nfunction onDocSignal ({ doc }, signalName) {\n const eventMethod = signalName.indexOf('add') === 0\n ? events.add : events.remove;\n\n // delegate event listener\n for (const eventType in scope.delegatedEvents) {\n eventMethod(doc, eventType, events.delegateListener);\n eventMethod(doc, eventType, events.delegateUseCapture, true);\n }\n\n for (const eventType in docEvents) {\n eventMethod(doc, eventType, docEvents[eventType]);\n }\n}\n\nsignals.on('update-pointer-down', ({ interaction, pointer, pointerId, pointerIndex, event, eventTarget, down }) => {\n interaction.pointerIds[pointerIndex] = pointerId;\n interaction.pointers[pointerIndex] = pointer;\n\n if (down) {\n interaction.pointerIsDown = true;\n }\n\n if (!interaction.interacting()) {\n utils.setCoords(interaction.startCoords, interaction.pointers);\n\n utils.copyCoords(interaction.curCoords , interaction.startCoords);\n utils.copyCoords(interaction.prevCoords, interaction.startCoords);\n\n interaction.downEvent = event;\n interaction.downTimes[pointerIndex] = interaction.curCoords.timeStamp;\n interaction.downTargets[pointerIndex] = eventTarget || event && utils.getEventTargets(event)[0];\n interaction.pointerWasMoved = false;\n\n utils.pointerExtend(interaction.downPointer, pointer);\n }\n});\n\nscope.signals.on('add-document' , onDocSignal);\nscope.signals.on('remove-document', onDocSignal);\n\nInteraction.pointerMoveTolerance = 1;\nInteraction.doOnInteractions = doOnInteractions;\nInteraction.endAll = endAll;\nInteraction.signals = signals;\nInteraction.docEvents = docEvents;\n\nscope.endAllInteractions = endAll;\n\nmodule.exports = Interaction;\n","const Interaction = require('../Interaction');\nconst InteractEvent = require('../InteractEvent');\n\nconst actions = {\n firePrepared,\n names: [],\n methodDict: {},\n};\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n interaction._interacting = true;\n firePrepared(interaction, event, 'start');\n});\n\nInteraction.signals.on('action-move', function ({ interaction, event, preEnd }) {\n firePrepared(interaction, event, 'move', preEnd);\n\n // if the action was ended in a listener\n if (!interaction.interacting()) { return false; }\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n firePrepared(interaction, event, 'end');\n});\n\nfunction firePrepared (interaction, event, phase, preEnd) {\n const actionName = interaction.prepared.name;\n\n const newEvent = new InteractEvent(interaction, event, actionName, phase, interaction.element, null, preEnd);\n\n interaction.target.fire(newEvent);\n interaction.prevEvent = newEvent;\n}\n\nmodule.exports = actions;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drag = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n startAxis : 'xy',\n lockAxis : 'xy',\n },\n\n checker: function (pointer, event, interactable) {\n const dragOptions = interactable.options.drag;\n\n return dragOptions.enabled\n ? { name: 'drag', axis: (dragOptions.lockAxis === 'start'\n ? dragOptions.startAxis\n : dragOptions.lockAxis)}\n : null;\n },\n\n getCursor: function () {\n return 'move';\n },\n};\n\nInteraction.signals.on('before-action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n interaction.curCoords.page.y = interaction.startCoords.page.y;\n interaction.curCoords.client.y = interaction.startCoords.client.y;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vx);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vx);\n interaction.pointerDelta.client.vy = 0;\n interaction.pointerDelta.page.vy = 0;\n }\n else if (axis === 'y') {\n interaction.curCoords.page.x = interaction.startCoords.page.x;\n interaction.curCoords.client.x = interaction.startCoords.client.x;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vy);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vy);\n interaction.pointerDelta.client.vx = 0;\n interaction.pointerDelta.page.vx = 0;\n }\n});\n\n// dragmove\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'dragmove') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n iEvent.pageY = interaction.startCoords.page.y;\n iEvent.clientY = interaction.startCoords.client.y;\n iEvent.dy = 0;\n }\n else if (axis === 'y') {\n iEvent.pageX = interaction.startCoords.page.x;\n iEvent.clientX = interaction.startCoords.client.x;\n iEvent.dx = 0;\n }\n});\n\n/*\\\n * Interactable.draggable\n [ method ]\n *\n * Gets or sets whether drag actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of drag events\n | var isDraggable = interact('ul li').draggable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on drag events (object makes the Interactable draggable)\n = (object) This Interactable\n | interact(element).draggable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // the axis in which the first movement must be\n | // for the drag sequence to start\n | // 'xy' by default - any direction\n | startAxis: 'x' || 'y' || 'xy',\n |\n | // 'xy' by default - don't restrict to one axis (move in any direction)\n | // 'x' or 'y' to restrict movement to either axis\n | // 'start' to restrict movement to the axis the drag started in\n | lockAxis: 'x' || 'y' || 'xy' || 'start',\n |\n | // max number of drags that can happen concurrently\n | // with elements of this Interactable. Infinity by default\n | max: Infinity,\n |\n | // max number of drags that can target the same element+Interactable\n | // 1 by default\n | maxPerElement: 2\n | });\n\\*/\nInteractable.prototype.draggable = function (options) {\n if (utils.is.object(options)) {\n this.options.drag.enabled = options.enabled === false? false: true;\n this.setPerAction('drag', options);\n this.setOnEvents('drag', options);\n\n if (/^(xy|x|y|start)$/.test(options.lockAxis)) {\n this.options.drag.lockAxis = options.lockAxis;\n }\n if (/^(xy|x|y)$/.test(options.startAxis)) {\n this.options.drag.startAxis = options.startAxis;\n }\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drag.enabled = options;\n\n if (!options) {\n this.ondragstart = this.ondragstart = this.ondragend = null;\n }\n\n return this;\n }\n\n return this.options.drag;\n};\n\nactions.drag = drag;\nactions.names.push('drag');\nutils.merge(Interactable.eventTypes, [\n 'dragstart',\n 'dragmove',\n 'draginertiastart',\n 'draginertiaresume',\n 'dragend',\n]);\nactions.methodDict.drag = 'draggable';\n\ndefaultOptions.drag = drag.defaults;\n\nmodule.exports = drag;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst scope = require('../scope');\nconst interact = require('../interact');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drop = {\n defaults: {\n enabled: false,\n accept : null,\n overlap: 'pointer',\n },\n};\n\nlet dynamicDrop = false;\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // reset active dropzones\n interaction.activeDrops.dropzones = [];\n interaction.activeDrops.elements = [];\n interaction.activeDrops.rects = [];\n\n interaction.dropEvents = null;\n\n if (!interaction.dynamicDrop) {\n setActiveDrops(interaction, interaction.element);\n }\n\n const dragEvent = interaction.prevEvent;\n const dropEvents = getDropEvents(interaction, event, dragEvent);\n\n if (dropEvents.activate) {\n fireActiveDrops(interaction, dropEvents.activate);\n }\n});\n\nInteractEvent.signals.on('new', function ({ interaction, iEvent, event }) {\n if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { return; }\n\n const draggableElement = interaction.element;\n const dragEvent = iEvent;\n const dropResult = getDrop(dragEvent, event, draggableElement);\n\n interaction.dropTarget = dropResult.dropzone;\n interaction.dropElement = dropResult.element;\n\n interaction.dropEvents = getDropEvents(interaction, event, dragEvent);\n});\n\nInteraction.signals.on('action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n fireDropEvents(interaction, interaction.dropEvents);\n});\n\nInteraction.signals.on('action-end', function ({ interaction }) {\n if (interaction.prepared.name === 'drag') {\n fireDropEvents(interaction, interaction.dropEvents);\n }\n});\n\nInteraction.signals.on('stop-drag', function ({ interaction }) {\n interaction.activeDrops.dropzones =\n interaction.activeDrops.elements =\n interaction.activeDrops.rects =\n interaction.dropEvents = null;\n});\n\nfunction collectDrops (interaction, element) {\n const drops = [];\n const elements = [];\n\n element = element || interaction.element;\n\n // collect all dropzones and their elements which qualify for a drop\n for (const current of scope.interactables) {\n if (!current.options.drop.enabled) { continue; }\n\n const accept = current.options.drop.accept;\n\n // test the draggable element against the dropzone's accept setting\n if ((utils.is.element(accept) && accept !== element)\n || (utils.is.string(accept)\n && !utils.matchesSelector(element, accept))) {\n\n continue;\n }\n\n // query for new elements if necessary\n const dropElements = utils.is.string(current.target)\n ? current._context.querySelectorAll(current.target)\n : [current.target];\n\n for (let i = 0; i < dropElements.length; i++) {\n const currentElement = dropElements[i];\n\n if (currentElement !== element) {\n drops.push(current);\n elements.push(currentElement);\n }\n }\n }\n\n return {\n elements,\n dropzones: drops,\n };\n}\n\nfunction fireActiveDrops (interaction, event) {\n let prevElement;\n\n // loop through all active dropzones and trigger event\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n const current = interaction.activeDrops.dropzones[i];\n const currentElement = interaction.activeDrops.elements [i];\n\n // prevent trigger of duplicate events on same element\n if (currentElement !== prevElement) {\n // set current element as event target\n event.target = currentElement;\n current.fire(event);\n }\n prevElement = currentElement;\n }\n}\n\n// Collect a new set of possible drops and save them in activeDrops.\n// setActiveDrops should always be called when a drag has just started or a\n// drag event happens while dynamicDrop is true\nfunction setActiveDrops (interaction, dragElement) {\n // get dropzones and their elements that could receive the draggable\n const possibleDrops = collectDrops(interaction, dragElement, true);\n\n interaction.activeDrops.dropzones = possibleDrops.dropzones;\n interaction.activeDrops.elements = possibleDrops.elements;\n interaction.activeDrops.rects = [];\n\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n interaction.activeDrops.rects[i] =\n interaction.activeDrops.dropzones[i].getRect(interaction.activeDrops.elements[i]);\n }\n}\n\nfunction getDrop (dragEvent, event, dragElement) {\n const interaction = dragEvent.interaction;\n const validDrops = [];\n\n if (dynamicDrop) {\n setActiveDrops(interaction, dragElement);\n }\n\n // collect all dropzones and their elements which qualify for a drop\n for (let j = 0; j < interaction.activeDrops.dropzones.length; j++) {\n const current = interaction.activeDrops.dropzones[j];\n const currentElement = interaction.activeDrops.elements [j];\n const rect = interaction.activeDrops.rects [j];\n\n validDrops.push(current.dropCheck(dragEvent, event, interaction.target, dragElement, currentElement, rect)\n ? currentElement\n : null);\n }\n\n // get the most appropriate dropzone based on DOM depth and order\n const dropIndex = utils.indexOfDeepestElement(validDrops);\n\n return {\n dropzone: interaction.activeDrops.dropzones[dropIndex] || null,\n element : interaction.activeDrops.elements [dropIndex] || null,\n };\n}\n\nfunction getDropEvents (interaction, pointerEvent, dragEvent) {\n const dropEvents = {\n enter : null,\n leave : null,\n activate : null,\n deactivate: null,\n move : null,\n drop : null,\n };\n\n const tmpl = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n };\n\n if (interaction.dropElement !== interaction.prevDropElement) {\n // if there was a prevDropTarget, create a dragleave event\n if (interaction.prevDropTarget) {\n dropEvents.leave = utils.extend({ type: 'dragleave' }, tmpl);\n\n dragEvent.dragLeave = dropEvents.leave.target = interaction.prevDropElement;\n dragEvent.prevDropzone = dropEvents.leave.dropzone = interaction.prevDropTarget;\n }\n // if the dropTarget is not null, create a dragenter event\n if (interaction.dropTarget) {\n dropEvents.enter = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n type : 'dragenter',\n };\n\n dragEvent.dragEnter = interaction.dropElement;\n dragEvent.dropzone = interaction.dropTarget;\n }\n }\n\n if (dragEvent.type === 'dragend' && interaction.dropTarget) {\n dropEvents.drop = utils.extend({ type: 'drop' }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n dragEvent.relatedTarget = interaction.dropElement;\n }\n if (dragEvent.type === 'dragstart') {\n dropEvents.activate = utils.extend({ type: 'dropactivate' }, tmpl);\n\n dropEvents.activate.target = null;\n dropEvents.activate.dropzone = null;\n }\n if (dragEvent.type === 'dragend') {\n dropEvents.deactivate = utils.extend({ type: 'dropdeactivate' }, tmpl);\n\n dropEvents.deactivate.target = null;\n dropEvents.deactivate.dropzone = null;\n }\n if (dragEvent.type === 'dragmove' && interaction.dropTarget) {\n dropEvents.move = utils.extend({\n dragmove : dragEvent,\n type : 'dropmove',\n }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n }\n\n return dropEvents;\n}\n\nfunction fireDropEvents (interaction, dropEvents) {\n if (dropEvents.leave) { interaction.prevDropTarget.fire(dropEvents.leave); }\n if (dropEvents.move ) { interaction.dropTarget.fire(dropEvents.move ); }\n if (dropEvents.enter) { interaction.dropTarget.fire(dropEvents.enter); }\n if (dropEvents.drop ) { interaction.dropTarget.fire(dropEvents.drop ); }\n if (dropEvents.deactivate) {\n fireActiveDrops(interaction, dropEvents.deactivate);\n }\n\n interaction.prevDropTarget = interaction.dropTarget;\n interaction.prevDropElement = interaction.dropElement;\n}\n\n/*\\\n * Interactable.dropzone\n [ method ]\n *\n * Returns or sets whether elements can be dropped onto this\n * Interactable to trigger drop events\n *\n * Dropzones can receive the following events:\n * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends\n * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone\n * - `dragmove` when a draggable that has entered the dropzone is moved\n * - `drop` when a draggable is dropped into this dropzone\n *\n * Use the `accept` option to allow only elements that match the given CSS\n * selector or element. The value can be:\n *\n * - **an Element** - only that element can be dropped into this dropzone.\n * - **a string**, - the element being dragged must match it as a CSS selector.\n * - **`null`** - accept options is cleared - it accepts any element.\n *\n * Use the `overlap` option to set how drops are checked for. The allowed\n * values are:\n *\n * - `'pointer'`, the pointer must be over the dropzone (default)\n * - `'center'`, the draggable element's center must be over the dropzone\n * - a number from 0-1 which is the `(intersection area) / (draggable area)`.\n * e.g. `0.5` for drop to happen when half of the area of the draggable is\n * over the dropzone\n *\n * Use the `checker` option to specify a function to check if a dragged\n * element is over this Interactable.\n *\n | interact(target)\n | .dropChecker(function(dragEvent, // related dragmove or dragend event\n | event, // TouchEvent/PointerEvent/MouseEvent\n | dropped, // bool result of the default checker\n | dropzone, // dropzone Interactable\n | dropElement, // dropzone elemnt\n | draggable, // draggable Interactable\n | draggableElement) {// draggable element\n |\n | return dropped && event.target.hasAttribute('allow-drop');\n | }\n *\n *\n - options (boolean | object | null) #optional The new value to be set.\n | interact('.drop').dropzone({\n | accept: '.can-drop' || document.getElementById('single-drop'),\n | overlap: 'pointer' || 'center' || zeroToOne\n | }\n = (boolean | object) The current setting or this Interactable\n\\*/\nInteractable.prototype.dropzone = function (options) {\n if (utils.is.object(options)) {\n this.options.drop.enabled = options.enabled === false? false: true;\n\n if (utils.is.function(options.ondrop) ) { this.events.ondrop = options.ondrop ; }\n if (utils.is.function(options.ondropactivate) ) { this.events.ondropactivate = options.ondropactivate ; }\n if (utils.is.function(options.ondropdeactivate)) { this.events.ondropdeactivate = options.ondropdeactivate; }\n if (utils.is.function(options.ondragenter) ) { this.events.ondragenter = options.ondragenter ; }\n if (utils.is.function(options.ondragleave) ) { this.events.ondragleave = options.ondragleave ; }\n if (utils.is.function(options.ondropmove) ) { this.events.ondropmove = options.ondropmove ; }\n\n if (/^(pointer|center)$/.test(options.overlap)) {\n this.options.drop.overlap = options.overlap;\n }\n else if (utils.is.number(options.overlap)) {\n this.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0);\n }\n if ('accept' in options) {\n this.options.drop.accept = options.accept;\n }\n if ('checker' in options) {\n this.options.drop.checker = options.checker;\n }\n\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drop.enabled = options;\n\n if (!options) {\n this.ondragenter = this.ondragleave = this.ondrop\n = this.ondropactivate = this.ondropdeactivate = null;\n }\n\n return this;\n }\n\n return this.options.drop;\n};\n\nInteractable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) {\n let dropped = false;\n\n // if the dropzone has no rect (eg. display: none)\n // call the custom dropChecker or just return false\n if (!(rect = rect || this.getRect(dropElement))) {\n return (this.options.drop.checker\n ? this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement)\n : false);\n }\n\n const dropOverlap = this.options.drop.overlap;\n\n if (dropOverlap === 'pointer') {\n const origin = utils.getOriginXY(draggable, draggableElement, 'drag');\n const page = utils.getPageXY(dragEvent);\n\n page.x += origin.x;\n page.y += origin.y;\n\n const horizontal = (page.x > rect.left) && (page.x < rect.right);\n const vertical = (page.y > rect.top ) && (page.y < rect.bottom);\n\n dropped = horizontal && vertical;\n }\n\n const dragRect = draggable.getRect(draggableElement);\n\n if (dragRect && dropOverlap === 'center') {\n const cx = dragRect.left + dragRect.width / 2;\n const cy = dragRect.top + dragRect.height / 2;\n\n dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom;\n }\n\n if (dragRect && utils.is.number(dropOverlap)) {\n const overlapArea = (Math.max(0, Math.min(rect.right , dragRect.right ) - Math.max(rect.left, dragRect.left))\n * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top , dragRect.top )));\n\n const overlapRatio = overlapArea / (dragRect.width * dragRect.height);\n\n dropped = overlapRatio >= dropOverlap;\n }\n\n if (this.options.drop.checker) {\n dropped = this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement);\n }\n\n return dropped;\n};\n\nInteractable.signals.on('unset', function ({ interactable }) {\n interactable.dropzone(false);\n});\n\nInteractable.settingsMethods.push('dropChecker');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.dropTarget = null; // the dropzone a drag target might be dropped into\n interaction.dropElement = null; // the element at the time of checking\n interaction.prevDropTarget = null; // the dropzone that was recently dragged away from\n interaction.prevDropElement = null; // the element at the time of checking\n interaction.dropEvents = null; // the dropEvents related to the current drag event\n\n interaction.activeDrops = {\n dropzones: [], // the dropzones that are mentioned below\n elements : [], // elements of dropzones that accept the target draggable\n rects : [], // the rects of the elements mentioned above\n };\n\n});\n\nInteraction.signals.on('stop', function ({ interaction }) {\n interaction.dropTarget = interaction.dropElement =\n interaction.prevDropTarget = interaction.prevDropElement = null;\n});\n\n/*\\\n * interact.dynamicDrop\n [ method ]\n *\n * Returns or sets whether the dimensions of dropzone elements are\n * calculated on every dragmove or only on dragstart for the default\n * dropChecker\n *\n - newValue (boolean) #optional True to check on each move. False to check only before start\n = (boolean | interact) The current setting or interact\n\\*/\ninteract.dynamicDrop = function (newValue) {\n if (utils.is.bool(newValue)) {\n //if (dragging && dynamicDrop !== newValue && !newValue) {\n //calcRects(dropzones);\n //}\n\n dynamicDrop = newValue;\n\n return interact;\n }\n return dynamicDrop;\n};\n\nutils.merge(Interactable.eventTypes, [\n 'dragenter',\n 'dragleave',\n 'dropactivate',\n 'dropdeactivate',\n 'dropmove',\n 'drop',\n]);\nactions.methodDict.drop = 'dropzone';\n\ndefaultOptions.drop = drop.defaults;\n\nmodule.exports = drop;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst gesture = {\n defaults: {\n enabled : false,\n origin : null,\n restrict: null,\n },\n\n checker: function (pointer, event, interactable, element, interaction) {\n if (interaction.pointerIds.length >= 2) {\n return { name: 'gesture' };\n }\n\n return null;\n },\n\n getCursor: function () {\n return '';\n },\n};\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturestart') { return; }\n iEvent.ds = 0;\n\n interaction.gesture.startDistance = interaction.gesture.prevDistance = iEvent.distance;\n interaction.gesture.startAngle = interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.scale = 1;\n});\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturemove') { return; }\n\n iEvent.ds = iEvent.scale - interaction.gesture.scale;\n\n interaction.target.fire(iEvent);\n\n interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.prevDistance = iEvent.distance;\n\n if (iEvent.scale !== Infinity\n && iEvent.scale !== null\n && iEvent.scale !== undefined\n && !isNaN(iEvent.scale)) {\n\n interaction.gesture.scale = iEvent.scale;\n }\n});\n\n/*\\\n * Interactable.gesturable\n [ method ]\n *\n * Gets or sets whether multitouch gestures can be performed on the\n * Interactable's element\n *\n = (boolean) Indicates if this can be the target of gesture events\n | var isGestureable = interact(element).gesturable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on gesture events (makes the Interactable gesturable)\n = (object) this Interactable\n | interact(element).gesturable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // limit multiple gestures.\n | // See the explanation in @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n\\*/\nInteractable.prototype.gesturable = function (options) {\n if (utils.is.object(options)) {\n this.options.gesture.enabled = options.enabled === false? false: true;\n this.setPerAction('gesture', options);\n this.setOnEvents('gesture', options);\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.gesture.enabled = options;\n\n if (!options) {\n this.ongesturestart = this.ongesturestart = this.ongestureend = null;\n }\n\n return this;\n }\n\n return this.options.gesture;\n};\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action, event, starting, ending, deltaSource }) {\n if (action !== 'gesture') { return; }\n\n const pointers = interaction.pointers;\n\n iEvent.touches = [pointers[0], pointers[1]];\n\n if (starting) {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = 1;\n iEvent.ds = 0;\n iEvent.angle = utils.touchAngle(pointers, undefined, deltaSource);\n iEvent.da = 0;\n }\n else if (ending || event instanceof InteractEvent) {\n iEvent.distance = interaction.prevEvent.distance;\n iEvent.box = interaction.prevEvent.box;\n iEvent.scale = interaction.prevEvent.scale;\n iEvent.ds = iEvent.scale - 1;\n iEvent.angle = interaction.prevEvent.angle;\n iEvent.da = iEvent.angle - interaction.gesture.startAngle;\n }\n else {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = iEvent.distance / interaction.gesture.startDistance;\n iEvent.angle = utils.touchAngle(pointers, interaction.gesture.prevAngle, deltaSource);\n\n iEvent.ds = iEvent.scale - interaction.gesture.prevScale;\n iEvent.da = iEvent.angle - interaction.gesture.prevAngle;\n }\n});\n\nInteraction.signals.on('new', function (interaction) {\n interaction.gesture = {\n start: { x: 0, y: 0 },\n\n startDistance: 0, // distance between two touches of touchStart\n prevDistance : 0,\n distance : 0,\n\n scale: 1, // gesture.distance / gesture.startDistance\n\n startAngle: 0, // angle of line joining two touches\n prevAngle : 0, // angle of the previous gesture event\n };\n});\n\nactions.gesture = gesture;\nactions.names.push('gesture');\nutils.merge(Interactable.eventTypes, [\n 'gesturestart',\n 'gesturemove',\n 'gestureend',\n]);\nactions.methodDict.gesture = 'gesturable';\n\ndefaultOptions.gesture = gesture.defaults;\n\nmodule.exports = gesture;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\n// Less Precision with touch input\nconst defaultMargin = browser.supportsTouch || browser.supportsPointerEvent? 20: 10;\n\nconst resize = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n square: false,\n preserveAspectRatio: false,\n axis: 'xy',\n\n // use default margin\n margin: NaN,\n\n // object with props left, right, top, bottom which are\n // true/false values to resize when the pointer is over that edge,\n // CSS selectors to match the handles for each direction\n // or the Elements for each handle\n edges: null,\n\n // a value of 'none' will limit the resize rect to a minimum of 0x0\n // 'negate' will alow the rect to have negative width/height\n // 'reposition' will keep the width/height positive by swapping\n // the top and bottom edges and/or swapping the left and right edges\n invert: 'none',\n },\n\n checker: function (pointer, event, interactable, element, interaction, rect) {\n if (!rect) { return null; }\n\n const page = utils.extend({}, interaction.curCoords.page);\n const options = interactable.options;\n\n if (options.resize.enabled) {\n const resizeOptions = options.resize;\n const resizeEdges = { left: false, right: false, top: false, bottom: false };\n\n // if using resize.edges\n if (utils.is.object(resizeOptions.edges)) {\n for (const edge in resizeEdges) {\n resizeEdges[edge] = checkResizeEdge(edge,\n resizeOptions.edges[edge],\n page,\n interaction._eventTarget,\n element,\n rect,\n resizeOptions.margin || defaultMargin);\n }\n\n resizeEdges.left = resizeEdges.left && !resizeEdges.right;\n resizeEdges.top = resizeEdges.top && !resizeEdges.bottom;\n\n if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) {\n return {\n name: 'resize',\n edges: resizeEdges,\n };\n }\n }\n else {\n const right = options.resize.axis !== 'y' && page.x > (rect.right - defaultMargin);\n const bottom = options.resize.axis !== 'x' && page.y > (rect.bottom - defaultMargin);\n\n if (right || bottom) {\n return {\n name: 'resize',\n axes: (right? 'x' : '') + (bottom? 'y' : ''),\n };\n }\n }\n }\n\n return null;\n },\n\n cursors: (browser.isIe9OrOlder ? {\n x : 'e-resize',\n y : 's-resize',\n xy: 'se-resize',\n\n top : 'n-resize',\n left : 'w-resize',\n bottom : 's-resize',\n right : 'e-resize',\n topleft : 'se-resize',\n bottomright: 'se-resize',\n topright : 'ne-resize',\n bottomleft : 'ne-resize',\n } : {\n x : 'ew-resize',\n y : 'ns-resize',\n xy: 'nwse-resize',\n\n top : 'ns-resize',\n left : 'ew-resize',\n bottom : 'ns-resize',\n right : 'ew-resize',\n topleft : 'nwse-resize',\n bottomright: 'nwse-resize',\n topright : 'nesw-resize',\n bottomleft : 'nesw-resize',\n }),\n\n getCursor: function (action) {\n if (action.axis) {\n return resize.cursors[action.name + action.axis];\n }\n else if (action.edges) {\n let cursorKey = '';\n const edgeNames = ['top', 'bottom', 'left', 'right'];\n\n for (let i = 0; i < 4; i++) {\n if (action.edges[edgeNames[i]]) {\n cursorKey += edgeNames[i];\n }\n }\n\n return resize.cursors[cursorKey];\n }\n },\n};\n\n// resizestart\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'resizestart' || !interaction.prepared.edges) {\n return;\n }\n\n const startRect = interaction.target.getRect(interaction.element);\n const resizeOptions = interaction.target.options.resize;\n\n /*\n * When using the `resizable.square` or `resizable.preserveAspectRatio` options, resizing from one edge\n * will affect another. E.g. with `resizable.square`, resizing to make the right edge larger will make\n * the bottom edge larger by the same amount. We call these 'linked' edges. Any linked edges will depend\n * on the active edges and the edge being interacted with.\n */\n if (resizeOptions.square || resizeOptions.preserveAspectRatio) {\n const linkedEdges = utils.extend({}, interaction.prepared.edges);\n\n linkedEdges.top = linkedEdges.top || (linkedEdges.left && !linkedEdges.bottom);\n linkedEdges.left = linkedEdges.left || (linkedEdges.top && !linkedEdges.right );\n linkedEdges.bottom = linkedEdges.bottom || (linkedEdges.right && !linkedEdges.top );\n linkedEdges.right = linkedEdges.right || (linkedEdges.bottom && !linkedEdges.left );\n\n interaction.prepared._linkedEdges = linkedEdges;\n }\n else {\n interaction.prepared._linkedEdges = null;\n }\n\n // if using `resizable.preserveAspectRatio` option, record aspect ratio at the start of the resize\n if (resizeOptions.preserveAspectRatio) {\n interaction.resizeStartAspectRatio = startRect.width / startRect.height;\n }\n\n interaction.resizeRects = {\n start : startRect,\n current : utils.extend({}, startRect),\n inverted : utils.extend({}, startRect),\n previous : utils.extend({}, startRect),\n delta : {\n left: 0, right : 0, width : 0,\n top : 0, bottom: 0, height: 0,\n },\n };\n\n iEvent.rect = interaction.resizeRects.inverted;\n iEvent.deltaRect = interaction.resizeRects.delta;\n});\n\n// resizemove\nInteractEvent.signals.on('new', function ({ iEvent, phase, interaction }) {\n if (phase !== 'move' || !interaction.prepared.edges) { return; }\n\n const resizeOptions = interaction.target.options.resize;\n const invert = resizeOptions.invert;\n const invertible = invert === 'reposition' || invert === 'negate';\n\n let edges = interaction.prepared.edges;\n\n const start = interaction.resizeRects.start;\n const current = interaction.resizeRects.current;\n const inverted = interaction.resizeRects.inverted;\n const delta = interaction.resizeRects.delta;\n const previous = utils.extend(interaction.resizeRects.previous, inverted);\n const originalEdges = edges;\n\n let dx = iEvent.dx;\n let dy = iEvent.dy;\n\n if (resizeOptions.preserveAspectRatio || resizeOptions.square) {\n // `resize.preserveAspectRatio` takes precedence over `resize.square`\n const startAspectRatio = resizeOptions.preserveAspectRatio\n ? interaction.resizeStartAspectRatio\n : 1;\n\n edges = interaction.prepared._linkedEdges;\n\n if ((originalEdges.left && originalEdges.bottom)\n || (originalEdges.right && originalEdges.top)) {\n dy = -dx / startAspectRatio;\n }\n else if (originalEdges.left || originalEdges.right ) { dy = dx / startAspectRatio; }\n else if (originalEdges.top || originalEdges.bottom) { dx = dy * startAspectRatio; }\n }\n\n // update the 'current' rect without modifications\n if (edges.top ) { current.top += dy; }\n if (edges.bottom) { current.bottom += dy; }\n if (edges.left ) { current.left += dx; }\n if (edges.right ) { current.right += dx; }\n\n if (invertible) {\n // if invertible, copy the current rect\n utils.extend(inverted, current);\n\n if (invert === 'reposition') {\n // swap edge values if necessary to keep width/height positive\n let swap;\n\n if (inverted.top > inverted.bottom) {\n swap = inverted.top;\n\n inverted.top = inverted.bottom;\n inverted.bottom = swap;\n }\n if (inverted.left > inverted.right) {\n swap = inverted.left;\n\n inverted.left = inverted.right;\n inverted.right = swap;\n }\n }\n }\n else {\n // if not invertible, restrict to minimum of 0x0 rect\n inverted.top = Math.min(current.top, start.bottom);\n inverted.bottom = Math.max(current.bottom, start.top);\n inverted.left = Math.min(current.left, start.right);\n inverted.right = Math.max(current.right, start.left);\n }\n\n inverted.width = inverted.right - inverted.left;\n inverted.height = inverted.bottom - inverted.top ;\n\n for (const edge in inverted) {\n delta[edge] = inverted[edge] - previous[edge];\n }\n\n iEvent.edges = interaction.prepared.edges;\n iEvent.rect = inverted;\n iEvent.deltaRect = delta;\n});\n\n/*\\\n * Interactable.resizable\n [ method ]\n *\n * Gets or sets whether resize actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of resize elements\n | var isResizeable = interact('input[type=text]').resizable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on resize events (object makes the Interactable resizable)\n = (object) This Interactable\n | interact(element).resizable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | edges: {\n | top : true, // Use pointer coords to check for resize.\n | left : false, // Disable resizing from left edge.\n | bottom: '.resize-s',// Resize if pointer target matches selector\n | right : handleEl // Resize if pointer target is the given Element\n | },\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height are adjusted at a 1:1 ratio.\n | square: false,\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height maintain the aspect ratio they had when resizing started.\n | preserveAspectRatio: false,\n |\n | // a value of 'none' will limit the resize rect to a minimum of 0x0\n | // 'negate' will allow the rect to have negative width/height\n | // 'reposition' will keep the width/height positive by swapping\n | // the top and bottom edges and/or swapping the left and right edges\n | invert: 'none' || 'negate' || 'reposition'\n |\n | // limit multiple resizes.\n | // See the explanation in the @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n \\*/\nInteractable.prototype.resizable = function (options) {\n if (utils.is.object(options)) {\n this.options.resize.enabled = options.enabled === false? false: true;\n this.setPerAction('resize', options);\n this.setOnEvents('resize', options);\n\n if (/^x$|^y$|^xy$/.test(options.axis)) {\n this.options.resize.axis = options.axis;\n }\n else if (options.axis === null) {\n this.options.resize.axis = defaultOptions.resize.axis;\n }\n\n if (utils.is.bool(options.preserveAspectRatio)) {\n this.options.resize.preserveAspectRatio = options.preserveAspectRatio;\n }\n else if (utils.is.bool(options.square)) {\n this.options.resize.square = options.square;\n }\n\n return this;\n }\n if (utils.is.bool(options)) {\n this.options.resize.enabled = options;\n\n if (!options) {\n this.onresizestart = this.onresizestart = this.onresizeend = null;\n }\n\n return this;\n }\n return this.options.resize;\n};\n\nfunction checkResizeEdge (name, value, page, element, interactableElement, rect, margin) {\n // false, '', undefined, null\n if (!value) { return false; }\n\n // true value, use pointer coords and element rect\n if (value === true) {\n // if dimensions are negative, \"switch\" edges\n const width = utils.is.number(rect.width )? rect.width : rect.right - rect.left;\n const height = utils.is.number(rect.height)? rect.height : rect.bottom - rect.top ;\n\n if (width < 0) {\n if (name === 'left' ) { name = 'right'; }\n else if (name === 'right') { name = 'left' ; }\n }\n if (height < 0) {\n if (name === 'top' ) { name = 'bottom'; }\n else if (name === 'bottom') { name = 'top' ; }\n }\n\n if (name === 'left' ) { return page.x < ((width >= 0? rect.left: rect.right ) + margin); }\n if (name === 'top' ) { return page.y < ((height >= 0? rect.top : rect.bottom) + margin); }\n\n if (name === 'right' ) { return page.x > ((width >= 0? rect.right : rect.left) - margin); }\n if (name === 'bottom') { return page.y > ((height >= 0? rect.bottom: rect.top ) - margin); }\n }\n\n // the remaining checks require an element\n if (!utils.is.element(element)) { return false; }\n\n return utils.is.element(value)\n // the value is an element to use as a resize handle\n ? value === element\n // otherwise check if element matches value as selector\n : utils.matchesUpTo(element, value, interactableElement);\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.resizeAxes = 'xy';\n});\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action }) {\n if (action !== 'resize' || !interaction.resizeAxes) { return; }\n\n const options = interaction.target.options;\n\n if (options.resize.square) {\n if (interaction.resizeAxes === 'y') {\n iEvent.dx = iEvent.dy;\n }\n else {\n iEvent.dy = iEvent.dx;\n }\n iEvent.axes = 'xy';\n }\n else {\n iEvent.axes = interaction.resizeAxes;\n\n if (interaction.resizeAxes === 'x') {\n iEvent.dy = 0;\n }\n else if (interaction.resizeAxes === 'y') {\n iEvent.dx = 0;\n }\n }\n});\n\nactions.resize = resize;\nactions.names.push('resize');\nutils.merge(Interactable.eventTypes, [\n 'resizestart',\n 'resizemove',\n 'resizeinertiastart',\n 'resizeinertiaresume',\n 'resizeend',\n]);\nactions.methodDict.resize = 'resizable';\n\ndefaultOptions.resize = resize.defaults;\n\nmodule.exports = resize;\n","const raf = require('./utils/raf');\nconst getWindow = require('./utils/window').getWindow;\nconst is = require('./utils/is');\nconst domUtils = require('./utils/domUtils');\nconst Interaction = require('./Interaction');\nconst defaultOptions = require('./defaultOptions');\n\nconst autoScroll = {\n defaults: {\n enabled : false,\n container: null, // the item that is scrolled (Window or HTMLElement)\n margin : 60,\n speed : 300, // the scroll speed in pixels per second\n },\n\n interaction: null,\n i: null, // the handle returned by window.setInterval\n x: 0, y: 0, // Direction each pulse is to scroll in\n\n isScrolling: false,\n prevTime: 0,\n\n start: function (interaction) {\n autoScroll.isScrolling = true;\n raf.cancel(autoScroll.i);\n\n autoScroll.interaction = interaction;\n autoScroll.prevTime = new Date().getTime();\n autoScroll.i = raf.request(autoScroll.scroll);\n },\n\n stop: function () {\n autoScroll.isScrolling = false;\n raf.cancel(autoScroll.i);\n },\n\n // scroll the window by the values in scroll.x/y\n scroll: function () {\n const options = autoScroll.interaction.target.options[autoScroll.interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(autoScroll.interaction.element);\n const now = new Date().getTime();\n // change in time in seconds\n const dt = (now - autoScroll.prevTime) / 1000;\n // displacement\n const s = options.speed * dt;\n\n if (s >= 1) {\n if (is.window(container)) {\n container.scrollBy(autoScroll.x * s, autoScroll.y * s);\n }\n else if (container) {\n container.scrollLeft += autoScroll.x * s;\n container.scrollTop += autoScroll.y * s;\n }\n\n autoScroll.prevTime = now;\n }\n\n if (autoScroll.isScrolling) {\n raf.cancel(autoScroll.i);\n autoScroll.i = raf.request(autoScroll.scroll);\n }\n },\n check: function (interactable, actionName) {\n const options = interactable.options;\n\n return options[actionName].autoScroll && options[actionName].autoScroll.enabled;\n },\n onInteractionMove: function ({ interaction, pointer }) {\n if (!(interaction.interacting()\n && autoScroll.check(interaction.target, interaction.prepared.name))) {\n return;\n }\n\n if (interaction.simulation) {\n autoScroll.x = autoScroll.y = 0;\n return;\n }\n\n let top;\n let right;\n let bottom;\n let left;\n\n const options = interaction.target.options[interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(interaction.element);\n\n if (is.window(container)) {\n left = pointer.clientX < autoScroll.margin;\n top = pointer.clientY < autoScroll.margin;\n right = pointer.clientX > container.innerWidth - autoScroll.margin;\n bottom = pointer.clientY > container.innerHeight - autoScroll.margin;\n }\n else {\n const rect = domUtils.getElementClientRect(container);\n\n left = pointer.clientX < rect.left + autoScroll.margin;\n top = pointer.clientY < rect.top + autoScroll.margin;\n right = pointer.clientX > rect.right - autoScroll.margin;\n bottom = pointer.clientY > rect.bottom - autoScroll.margin;\n }\n\n autoScroll.x = (right ? 1: left? -1: 0);\n autoScroll.y = (bottom? 1: top? -1: 0);\n\n if (!autoScroll.isScrolling) {\n // set the autoScroll properties to those of the target\n autoScroll.margin = options.margin;\n autoScroll.speed = options.speed;\n\n autoScroll.start(interaction);\n }\n },\n};\n\nInteraction.signals.on('stop-active', function () {\n autoScroll.stop();\n});\n\nInteraction.signals.on('action-move', autoScroll.onInteractionMove);\n\ndefaultOptions.perAction.autoScroll = autoScroll.defaults;\n\nmodule.exports = autoScroll;\n","const Interactable = require('../Interactable');\nconst actions = require('../actions/base');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.ignoreFrom\n [ method ]\n *\n * If the target of the `mousedown`, `pointerdown` or `touchstart`\n * event or any of it's parents match the given CSS selector or\n * Element, no drag/resize/gesture is started.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to not ignore any elements\n = (string | Element | object) The current ignoreFrom value or this Interactable\n **\n | interact(element, { ignoreFrom: document.getElementById('no-action') });\n | // or\n | interact(element).ignoreFrom('input, textarea, a');\n\\*/\nInteractable.prototype.ignoreFrom = function (newValue) {\n return this._backCompatOption('ignoreFrom', newValue);\n};\n\n/*\\\n * Interactable.allowFrom\n [ method ]\n *\n * A drag/resize/gesture is started only If the target of the\n * `mousedown`, `pointerdown` or `touchstart` event or any of it's\n * parents match the given CSS selector or Element.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to allow from any element\n = (string | Element | object) The current allowFrom value or this Interactable\n **\n | interact(element, { allowFrom: document.getElementById('drag-handle') });\n | // or\n | interact(element).allowFrom('.handle');\n\\*/\nInteractable.prototype.allowFrom = function (newValue) {\n return this._backCompatOption('allowFrom', newValue);\n};\n\nInteractable.prototype.testIgnore = function (ignoreFrom, interactableElement, element) {\n if (!ignoreFrom || !is.element(element)) { return false; }\n\n if (is.string(ignoreFrom)) {\n return domUtils.matchesUpTo(element, ignoreFrom, interactableElement);\n }\n else if (is.element(ignoreFrom)) {\n return domUtils.nodeContains(ignoreFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testAllow = function (allowFrom, interactableElement, element) {\n if (!allowFrom) { return true; }\n\n if (!is.element(element)) { return false; }\n\n if (is.string(allowFrom)) {\n return domUtils.matchesUpTo(element, allowFrom, interactableElement);\n }\n else if (is.element(allowFrom)) {\n return domUtils.nodeContains(allowFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testIgnoreAllow = function (options, interactableElement, eventTarget) {\n return (!this.testIgnore(options.ignoreFrom, interactableElement, eventTarget)\n && this.testAllow(options.allowFrom, interactableElement, eventTarget));\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (event.buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\n","const interact = require('../interact');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst actions = require('../actions/base');\nconst defaultOptions = require('../defaultOptions');\nconst browser = require('../utils/browser');\nconst scope = require('../scope');\nconst utils = require('../utils');\nconst signals = require('../utils/Signals').new();\n\nrequire('./InteractableMethods');\n\nconst autoStart = {\n signals,\n withinInteractionLimit,\n // Allow this many interactions to happen simultaneously\n maxInteractions: Infinity,\n defaults: {\n perAction: {\n manualStart: false,\n max: Infinity,\n maxPerElement: 1,\n allowFrom: null,\n ignoreFrom: null,\n },\n },\n setActionDefaults: function (action) {\n utils.extend(action.defaults, autoStart.defaults.perAction);\n },\n};\n\n// set cursor style on mousedown\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget }) {\n if (interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\n// set cursor style on mousemove\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget }) {\n if (!interaction.mouse\n || interaction.pointerIsDown\n || interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\nInteraction.signals.on('move', function (arg) {\n const { interaction, event } = arg;\n\n if (!interaction.pointerIsDown\n || interaction.interacting()\n || !interaction.pointerWasMoved\n || !interaction.prepared.name) {\n return;\n }\n\n signals.fire('before-start', arg);\n\n const target = interaction.target;\n\n if (interaction.prepared.name && target) {\n // check manualStart and interaction limit\n if (target.options[interaction.prepared.name].manualStart\n || !withinInteractionLimit(target, interaction.element, interaction.prepared)) {\n interaction.stop(event);\n }\n else {\n interaction.start(interaction.prepared, target, interaction.element);\n }\n }\n});\n\n// Check if the current target supports the action.\n// If so, return the validated action. Otherwise, return null\nfunction validateAction (action, interactable, element, eventTarget) {\n if (utils.is.object(action)\n && interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget)\n && interactable.options[action.name].enabled\n && withinInteractionLimit(interactable, element, action)) {\n return action;\n }\n\n return null;\n}\n\nfunction validateSelector (interaction, pointer, event, matches, matchElements, eventTarget) {\n for (let i = 0, len = matches.length; i < len; i++) {\n const match = matches[i];\n const matchElement = matchElements[i];\n const action = validateAction(match.getAction(pointer, event, interaction, matchElement),\n match,\n matchElement,\n eventTarget);\n\n if (action) {\n return {\n action,\n target: match,\n element: matchElement,\n };\n }\n }\n\n return {};\n}\n\nfunction getActionInfo (interaction, pointer, event, eventTarget) {\n let matches = [];\n let matchElements = [];\n\n let element = eventTarget;\n let action = null;\n\n function pushMatches (interactable, selector, context) {\n const elements = (browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined);\n\n if (utils.matchesSelector(element, selector, elements)) {\n\n matches.push(interactable);\n matchElements.push(element);\n }\n }\n\n while (utils.is.element(element)) {\n matches = [];\n matchElements = [];\n\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && (action = validateAction(elementInteractable.getAction(pointer, event, interaction, element, eventTarget),\n elementInteractable,\n element,\n eventTarget))\n && !elementInteractable.options[action.name].manualStart) {\n return {\n element,\n action,\n target: elementInteractable,\n };\n }\n else {\n scope.interactables.forEachSelector(pushMatches, element);\n\n const actionInfo = validateSelector(interaction, pointer, event, matches, matchElements, eventTarget);\n\n if (actionInfo.action\n && !actionInfo.target.options[actionInfo.action.name].manualStart) {\n return actionInfo;\n }\n }\n\n element = utils.parentNode(element);\n }\n\n return {};\n}\n\nfunction prepare (interaction, { action, target, element }) {\n action = action || {};\n\n if (interaction.target && interaction.target.options.styleCursor) {\n interaction.target._doc.documentElement.style.cursor = '';\n }\n\n interaction.target = target;\n interaction.element = element;\n utils.copyAction(interaction.prepared, action);\n\n if (target && target.options.styleCursor) {\n const cursor = action? actions[action.name].getCursor(action) : '';\n interaction.target._doc.documentElement.style.cursor = cursor;\n }\n\n signals.fire('prepared', { interaction: interaction });\n}\n\nInteraction.signals.on('stop', function ({ interaction }) {\n const target = interaction.target;\n\n if (target && target.options.styleCursor) {\n target._doc.documentElement.style.cursor = '';\n }\n});\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (utils.is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (utils.is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n const buttons = event.buttons || ({\n 0: 1,\n 1: 4,\n 3: 8,\n 4: 16,\n })[event.button];\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\nfunction withinInteractionLimit (interactable, element, action) {\n const options = interactable.options;\n const maxActions = options[action.name].max;\n const maxPerElement = options[action.name].maxPerElement;\n let activeInteractions = 0;\n let targetCount = 0;\n let targetElementCount = 0;\n\n // no actions if any of these values == 0\n if (!(maxActions && maxPerElement && autoStart.maxInteractions)) { return; }\n\n for (let i = 0, len = scope.interactions.length; i < len; i++) {\n const interaction = scope.interactions[i];\n const otherAction = interaction.prepared.name;\n\n if (!interaction.interacting()) { continue; }\n\n activeInteractions++;\n\n if (activeInteractions >= autoStart.maxInteractions) {\n return false;\n }\n\n if (interaction.target !== interactable) { continue; }\n\n targetCount += (otherAction === action.name)|0;\n\n if (targetCount >= maxActions) {\n return false;\n }\n\n if (interaction.element === element) {\n targetElementCount++;\n\n if (otherAction !== action.name || targetElementCount >= maxPerElement) {\n return false;\n }\n }\n }\n\n return autoStart.maxInteractions > 0;\n}\n\n/*\\\n * interact.maxInteractions\n [ method ]\n **\n * Returns or sets the maximum number of concurrent interactions allowed.\n * By default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables\n * and elements, you need to enable it in the draggable, resizable and\n * gesturable `'max'` and `'maxPerElement'` options.\n **\n - newValue (number) #optional Any number. newValue <= 0 means no interactions.\n\\*/\ninteract.maxInteractions = function (newValue) {\n if (utils.is.number(newValue)) {\n autoStart.maxInteractions = newValue;\n\n return this;\n }\n\n return autoStart.maxInteractions;\n};\n\nInteractable.settingsMethods.push('styleCursor');\nInteractable.settingsMethods.push('actionChecker');\nInteractable.settingsMethods.push('ignoreFrom');\nInteractable.settingsMethods.push('allowFrom');\n\ndefaultOptions.base.actionChecker = null;\ndefaultOptions.base.styleCursor = true;\n\nutils.extend(defaultOptions.perAction, autoStart.defaults.perAction);\n\nmodule.exports = autoStart;\n","const autoStart = require('./base');\nconst Interaction = require('../Interaction');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.delayTimer = null;\n});\n\nautoStart.signals.on('prepared', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.delayTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.target, interaction.element);\n }, delay);\n }\n});\n\nInteraction.signals.on('move', function ({ interaction, duplicate }) {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.delayTimer);\n }\n});\n\n// prevent regular down->move autoStart\nautoStart.signals.on('before-start', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.prepared.name = null;\n }\n});\n","const autoStart = require('./base');\nconst scope = require('../scope');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\n\nconst { matchesSelector, parentNode } = require('../utils/domUtils');\n\nautoStart.setActionDefaults(require('../actions/drag'));\n\nautoStart.signals.on('before-start', function ({ interaction, eventTarget, dx, dy }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // check if a drag is in the correct axis\n const absX = Math.abs(dx);\n const absY = Math.abs(dy);\n const options = interaction.target.options.drag;\n const startAxis = options.startAxis;\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy');\n\n interaction.prepared.axis = options.lockAxis === 'start'\n ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n : options.lockAxis;\n\n // if the movement isn't in the startAxis of the interactable\n if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) {\n // cancel the prepared action\n interaction.prepared.name = null;\n\n // then try to get a drag from another ineractable\n\n if (!interaction.prepared.name) {\n\n let element = eventTarget;\n\n const getDraggable = function (interactable, selector, context) {\n const elements = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n if (interactable === interaction.target) { return; }\n\n if (!options.manualStart\n && !interactable.testIgnoreAllow(options, element, eventTarget)\n && matchesSelector(element, selector, elements)) {\n\n const action = interactable.getAction(interaction.downPointer,\n interaction.downEvent,\n interaction,\n element);\n\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, interactable)\n && autoStart.validateAction(action, interactable, element, eventTarget)) {\n\n return interactable;\n }\n }\n };\n\n let action = null;\n\n // check all interactables\n while (is.element(element)) {\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && elementInteractable !== interaction.target\n && !elementInteractable.options.drag.manualStart) {\n\n action = elementInteractable.getAction(interaction.downPointer, interaction.downEvent, interaction, element);\n }\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, elementInteractable)) {\n\n interaction.prepared.name = 'drag';\n interaction.target = elementInteractable;\n interaction.element = element;\n break;\n }\n\n const selectorInteractable = scope.interactables.forEachSelector(getDraggable, element);\n\n if (selectorInteractable) {\n interaction.prepared.name = 'drag';\n interaction.target = selectorInteractable;\n interaction.element = element;\n break;\n }\n\n element = parentNode(element);\n }\n }\n }\n});\n\nfunction checkStartAxis (startAxis, interactable) {\n if (!interactable) { return false; }\n\n const thisAxis = interactable.options.drag.startAxis;\n\n return (startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis);\n}\n","require('./base').setActionDefaults(require('../actions/gesture'));\n","require('./base').setActionDefaults(require('../actions/resize'));\n","module.exports = {\n base: {\n accept : null,\n preventDefault: 'auto',\n deltaSource : 'page',\n },\n\n perAction: {\n origin: { x: 0, y: 0 },\n\n // only allow left button by default\n // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n mouseButtons: 1,\n\n inertia: {\n enabled : false,\n resistance : 10, // the lambda in exponential decay\n minSpeed : 100, // target speed must be above this for inertia to start\n endSpeed : 10, // the speed at which inertia is slow enough to stop\n allowResume : true, // allow resuming an action in inertia phase\n smoothEndDuration: 300, // animate to snap/restrict endOnly if there's no inertia\n },\n },\n};\n","/* browser entry point */\n\n// Legacy browser support\nrequire('./legacyBrowsers');\n\n// inertia\nrequire('./inertia');\n\n// modifiers\nrequire('./modifiers/snap');\nrequire('./modifiers/restrict');\n\n// pointerEvents\nrequire('./pointerEvents/base');\nrequire('./pointerEvents/holdRepeat');\nrequire('./pointerEvents/interactableTargets');\n\n// delay\nrequire('./autoStart/delay');\n\n// actions\nrequire('./actions/gesture');\nrequire('./actions/resize');\nrequire('./actions/drag');\nrequire('./actions/drop');\n\n// load these modifiers after resize is loaded\nrequire('./modifiers/snapSize');\nrequire('./modifiers/restrictEdges');\nrequire('./modifiers/restrictSize');\n\n// autoStart actions\nrequire('./autoStart/gesture');\nrequire('./autoStart/resize');\nrequire('./autoStart/drag');\n\n// Interactable preventDefault setting\nrequire('./interactablePreventDefault.js');\n\n// autoScroll\nrequire('./autoScroll');\n\n// export interact\nmodule.exports = require('./interact');\n","const InteractEvent = require('./InteractEvent');\nconst Interaction = require('./Interaction');\nconst modifiers = require('./modifiers');\nconst utils = require('./utils');\nconst animationFrame = require('./utils/raf');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.inertiaStatus = {\n active : false,\n smoothEnd : false,\n allowResume: false,\n\n startEvent: null,\n upCoords : {},\n\n xe: 0, ye: 0,\n sx: 0, sy: 0,\n\n t0: 0,\n vx0: 0, vys: 0,\n duration: 0,\n\n lambda_v0: 0,\n one_ve_v0: 0,\n i : null,\n };\n\n interaction.boundInertiaFrame = () => inertiaFrame .apply(interaction);\n interaction.boundSmoothEndFrame = () => smoothEndFrame.apply(interaction);\n});\n\nInteraction.signals.on('down', function ({ interaction, event, pointer, eventTarget }) {\n const status = interaction.inertiaStatus;\n\n // Check if the down event hits the current inertia target\n if (status.active) {\n let element = eventTarget;\n\n // climb up the DOM tree from the event target\n while (utils.is.element(element)) {\n\n // if interaction element is the current inertia target element\n if (element === interaction.element) {\n // stop inertia\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n\n // update pointers to the down event's coordinates\n interaction.updatePointer(pointer);\n utils.setCoords(interaction.curCoords, interaction.pointers);\n\n // fire appropriate signals\n const signalArg = { interaction };\n Interaction.signals.fire('before-action-move', signalArg);\n Interaction.signals.fire('action-resume' , signalArg);\n\n // fire a reume event\n const resumeEvent = new InteractEvent(interaction,\n event,\n interaction.prepared.name,\n 'inertiaresume',\n interaction.element);\n\n interaction.target.fire(resumeEvent);\n interaction.prevEvent = resumeEvent;\n modifiers.resetStatuses(interaction.modifierStatuses);\n\n utils.copyCoords(interaction.prevCoords, interaction.curCoords);\n break;\n }\n\n element = utils.parentNode(element);\n }\n }\n});\n\nInteraction.signals.on('up', function ({ interaction, event }) {\n const status = interaction.inertiaStatus;\n\n if (!interaction.interacting() || status.active) { return; }\n\n const target = interaction.target;\n const options = target && target.options;\n const inertiaOptions = options && interaction.prepared.name && options[interaction.prepared.name].inertia;\n\n const now = new Date().getTime();\n const statuses = {};\n const page = utils.extend({}, interaction.curCoords.page);\n const pointerSpeed = interaction.pointerDelta.client.speed;\n\n let smoothEnd = false;\n let modifierResult;\n\n // check if inertia should be started\n const inertiaPossible = (inertiaOptions && inertiaOptions.enabled\n && interaction.prepared.name !== 'gesture'\n && event !== status.startEvent);\n\n const inertia = (inertiaPossible\n && (now - interaction.curCoords.timeStamp) < 50\n && pointerSpeed > inertiaOptions.minSpeed\n && pointerSpeed > inertiaOptions.endSpeed);\n\n const modifierArg = {\n interaction,\n pageCoords: page,\n statuses,\n preEnd: true,\n requireEndOnly: true,\n };\n\n // smoothEnd\n if (inertiaPossible && !inertia) {\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n if (modifierResult.shouldMove && modifierResult.locked) {\n smoothEnd = true;\n }\n }\n\n if (!(inertia || smoothEnd)) { return; }\n\n utils.copyCoords(status.upCoords, interaction.curCoords);\n\n interaction.pointers[0] = status.startEvent =\n new InteractEvent(interaction, event, interaction.prepared.name, 'inertiastart', interaction.element);\n\n status.t0 = now;\n\n status.active = true;\n status.allowResume = inertiaOptions.allowResume;\n interaction.simulation = status;\n\n target.fire(status.startEvent);\n\n if (inertia) {\n status.vx0 = interaction.pointerDelta.client.vx;\n status.vy0 = interaction.pointerDelta.client.vy;\n status.v0 = pointerSpeed;\n\n calcInertia(interaction, status);\n\n utils.extend(page, interaction.curCoords.page);\n\n page.x += status.xe;\n page.y += status.ye;\n\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n status.modifiedXe += modifierResult.dx;\n status.modifiedYe += modifierResult.dy;\n\n status.i = animationFrame.request(interaction.boundInertiaFrame);\n }\n else {\n status.smoothEnd = true;\n status.xe = modifierResult.dx;\n status.ye = modifierResult.dy;\n\n status.sx = status.sy = 0;\n\n status.i = animationFrame.request(interaction.boundSmoothEndFrame);\n }\n});\n\nInteraction.signals.on('stop-active', function ({ interaction }) {\n const status = interaction.inertiaStatus;\n\n if (status.active) {\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n }\n});\n\nfunction calcInertia (interaction, status) {\n const inertiaOptions = interaction.target.options[interaction.prepared.name].inertia;\n const lambda = inertiaOptions.resistance;\n const inertiaDur = -Math.log(inertiaOptions.endSpeed / status.v0) / lambda;\n\n status.x0 = interaction.prevEvent.pageX;\n status.y0 = interaction.prevEvent.pageY;\n status.t0 = status.startEvent.timeStamp / 1000;\n status.sx = status.sy = 0;\n\n status.modifiedXe = status.xe = (status.vx0 - inertiaDur) / lambda;\n status.modifiedYe = status.ye = (status.vy0 - inertiaDur) / lambda;\n status.te = inertiaDur;\n\n status.lambda_v0 = lambda / status.v0;\n status.one_ve_v0 = 1 - inertiaOptions.endSpeed / status.v0;\n}\n\nfunction inertiaFrame () {\n updateInertiaCoords(this);\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n\n const status = this.inertiaStatus;\n const options = this.target.options[this.prepared.name].inertia;\n const lambda = options.resistance;\n const t = new Date().getTime() / 1000 - status.t0;\n\n if (t < status.te) {\n\n const progress = 1 - (Math.exp(-lambda * t) - status.lambda_v0) / status.one_ve_v0;\n\n if (status.modifiedXe === status.xe && status.modifiedYe === status.ye) {\n status.sx = status.xe * progress;\n status.sy = status.ye * progress;\n }\n else {\n const quadPoint = utils.getQuadraticCurvePoint(0, 0,\n status.xe,\n status.ye,\n status.modifiedXe,\n status.modifiedYe,\n progress);\n\n status.sx = quadPoint.x;\n status.sy = quadPoint.y;\n }\n\n this.doMove();\n\n status.i = animationFrame.request(this.boundInertiaFrame);\n }\n else {\n status.sx = status.modifiedXe;\n status.sy = status.modifiedYe;\n\n this.doMove();\n this.end(status.startEvent);\n status.active = false;\n this.simulation = null;\n }\n\n utils.copyCoords(this.prevCoords, this.curCoords);\n}\n\nfunction smoothEndFrame () {\n updateInertiaCoords(this);\n\n const status = this.inertiaStatus;\n const t = new Date().getTime() - status.t0;\n const duration = this.target.options[this.prepared.name].inertia.smoothEndDuration;\n\n if (t < duration) {\n status.sx = utils.easeOutQuad(t, 0, status.xe, duration);\n status.sy = utils.easeOutQuad(t, 0, status.ye, duration);\n\n this.pointerMove(status.startEvent, status.startEvent);\n\n status.i = animationFrame.request(this.boundSmoothEndFrame);\n }\n else {\n status.sx = status.xe;\n status.sy = status.ye;\n\n this.pointerMove(status.startEvent, status.startEvent);\n this.end(status.startEvent);\n\n status.smoothEnd =\n status.active = false;\n this.simulation = null;\n }\n}\n\nfunction updateInertiaCoords (interaction) {\n const status = interaction.inertiaStatus;\n\n // return if inertia isn't running\n if (!status.active) { return; }\n\n const pageUp = status.upCoords.page;\n const clientUp = status.upCoords.client;\n\n utils.setCoords(interaction.curCoords, [ {\n pageX : pageUp.x + status.sx,\n pageY : pageUp.y + status.sy,\n clientX: clientUp.x + status.sx,\n clientY: clientUp.y + status.sy,\n } ]);\n}\n","const browser = require('./utils/browser');\nconst events = require('./utils/events');\nconst utils = require('./utils');\nconst scope = require('./scope');\nconst Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\n\nconst globalEvents = {};\n\n/*\\\n * interact\n [ method ]\n *\n * The methods of this variable can be used to set elements as\n * interactables and also to change various default settings.\n *\n * Calling it as a function and passing an element or a valid CSS selector\n * string returns an Interactable object which has various methods to\n * configure it.\n *\n - element (Element | string) The HTML or SVG Element to interact with or CSS selector\n = (object) An @Interactable\n *\n > Usage\n | interact('#draggable').draggable(true);\n |\n | var rectables = interact('rect');\n | rectables\n | .gesturable(true)\n | .on('gesturemove', function (event) {\n | // ...\n | });\n\\*/\nfunction interact (element, options) {\n let interactable = scope.interactables.get(element, options);\n\n if (!interactable) {\n interactable = new Interactable(element, options);\n interactable.events.global = globalEvents;\n }\n\n return interactable;\n}\n\n/*\\\n * interact.isSet\n [ method ]\n *\n * Check if an element has been set\n - element (Element) The Element being searched for\n = (boolean) Indicates if the element or CSS selector was previously passed to interact\n\\*/\ninteract.isSet = function (element, options) {\n return scope.interactables.indexOfElement(element, options && options.context) !== -1;\n};\n\n/*\\\n * interact.on\n [ method ]\n *\n * Adds a global listener for an InteractEvent or adds a DOM event to\n * `document`\n *\n - type (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) interact\n\\*/\ninteract.on = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.on(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.on(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n // if it is an InteractEvent type, add listener to globalEvents\n if (utils.contains(Interactable.eventTypes, type)) {\n // if this type of event was never bound\n if (!globalEvents[type]) {\n globalEvents[type] = [listener];\n }\n else {\n globalEvents[type].push(listener);\n }\n }\n // If non InteractEvent type, addEventListener to document\n else {\n events.add(scope.document, type, listener, { options });\n }\n\n return interact;\n};\n\n/*\\\n * interact.off\n [ method ]\n *\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n - type (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) interact\n \\*/\ninteract.off = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.off(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.off(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n if (!utils.contains(Interactable.eventTypes, type)) {\n events.remove(scope.document, type, listener, options);\n }\n else {\n let index;\n\n if (type in globalEvents\n && (index = utils.indexOf(globalEvents[type], listener)) !== -1) {\n globalEvents[type].splice(index, 1);\n }\n }\n\n return interact;\n};\n\n/*\\\n * interact.debug\n [ method ]\n *\n * Returns an object which exposes internal data\n = (object) An object with properties that outline the current state and expose internal functions and variables\n\\*/\ninteract.debug = function () {\n return scope;\n};\n\n// expose the functions used to calculate multi-touch properties\ninteract.getPointerAverage = utils.pointerAverage;\ninteract.getTouchBBox = utils.touchBBox;\ninteract.getTouchDistance = utils.touchDistance;\ninteract.getTouchAngle = utils.touchAngle;\n\ninteract.getElementRect = utils.getElementRect;\ninteract.getElementClientRect = utils.getElementClientRect;\ninteract.matchesSelector = utils.matchesSelector;\ninteract.closest = utils.closest;\n\n/*\\\n * interact.supportsTouch\n [ method ]\n *\n = (boolean) Whether or not the browser supports touch input\n\\*/\ninteract.supportsTouch = function () {\n return browser.supportsTouch;\n};\n\n/*\\\n * interact.supportsPointerEvent\n [ method ]\n *\n = (boolean) Whether or not the browser supports PointerEvents\n\\*/\ninteract.supportsPointerEvent = function () {\n return browser.supportsPointerEvent;\n};\n\n/*\\\n * interact.stop\n [ method ]\n *\n * Cancels all interactions (end events are not fired)\n *\n - event (Event) An event on which to call preventDefault()\n = (object) interact\n\\*/\ninteract.stop = function (event) {\n for (let i = scope.interactions.length - 1; i >= 0; i--) {\n scope.interactions[i].stop(event);\n }\n\n return interact;\n};\n\n/*\\\n * interact.pointerMoveTolerance\n [ method ]\n * Returns or sets the distance the pointer must be moved before an action\n * sequence occurs. This also affects tolerance for tap events.\n *\n - newValue (number) #optional The movement from the start position must be greater than this value\n = (number | Interactable) The current setting or interact\n\\*/\ninteract.pointerMoveTolerance = function (newValue) {\n if (utils.is.number(newValue)) {\n Interaction.pointerMoveTolerance = newValue;\n\n return this;\n }\n\n return Interaction.pointerMoveTolerance;\n};\n\ninteract.addDocument = scope.addDocument;\ninteract.removeDocument = scope.removeDocument;\n\nscope.interact = interact;\n\nmodule.exports = interact;\n","const Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\nconst scope = require('./scope');\nconst is = require('./utils/is');\nconst events = require('./utils/events');\n\nconst { nodeContains, matchesSelector } = require('./utils/domUtils');\n\n/*\\\n * Interactable.preventDefault\n [ method ]\n *\n * Returns or sets whether to prevent the browser's default behaviour\n * in response to pointer events. Can be set to:\n * - `'always'` to always prevent\n * - `'never'` to never prevent\n * - `'auto'` to let interact.js try to determine what would be best\n *\n - newValue (string) #optional `true`, `false` or `'auto'`\n = (string | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.preventDefault = function (newValue) {\n if (/^(always|never|auto)$/.test(newValue)) {\n this.options.preventDefault = newValue;\n return this;\n }\n\n if (is.bool(newValue)) {\n this.options.preventDefault = newValue? 'always' : 'never';\n return this;\n }\n\n return this.options.preventDefault;\n};\n\nInteractable.prototype.checkAndPreventDefault = function (event) {\n const setting = this.options.preventDefault;\n\n if (setting === 'never') { return; }\n\n if (setting === 'always') {\n event.preventDefault();\n return;\n }\n\n // setting === 'auto'\n\n // don't preventDefault if the browser supports passiveEvents\n // CSS touch-action and user-selecct should be used instead\n if (events.supportsOptions) {\n return;\n }\n\n // don't preventDefault of pointerdown events\n if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) {\n return;\n }\n\n // don't preventDefault on editable elements\n if (is.element(event.target)\n && matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) {\n return;\n }\n\n event.preventDefault();\n};\n\nfunction onInteractionEvent ({ interaction, event }) {\n if (interaction.target) {\n interaction.target.checkAndPreventDefault(event);\n }\n}\n\nfor (const eventSignal of ['down', 'move', 'up', 'cancel']) {\n Interaction.signals.on(eventSignal, onInteractionEvent);\n}\n\n// prevent native HTML5 drag on interact.js target elements\nInteraction.docEvents.dragstart = function preventNativeDrag (event) {\n for (const interaction of scope.interactions) {\n\n if (interaction.element\n && (interaction.element === event.target\n || nodeContains(interaction.element, event.target))) {\n\n interaction.target.checkAndPreventDefault(event);\n return;\n }\n }\n};\n","const scope = require('./scope');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst iFinder = require('./utils/interactionFinder');\nconst pointerEvents = require('./pointerEvents/base');\n\nconst { window } = require('./utils/window');\n\nconst toString = Object.prototype.toString;\n\nif (!window.Array.isArray) {\n window.Array.isArray = function (obj) {\n return toString.call(obj) === '[object Array]';\n };\n}\n\nif (!String.prototype.trim) {\n String.prototype.trim = function () {\n return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n };\n}\n\n// http://www.quirksmode.org/dom/events/click.html\n// >Events leading to dblclick\n//\n// IE8 doesn't fire down event before dblclick.\n// This workaround tries to fire a tap and doubletap after dblclick\nfunction onIE8Dblclick (event) {\n const eventTarget = event.target;\n const interaction = iFinder.search(event, event.type, eventTarget);\n\n if (!interaction) { return; }\n\n if (interaction.prevTap\n && event.clientX === interaction.prevTap.clientX\n && event.clientY === interaction.prevTap.clientY\n && eventTarget === interaction.prevTap.target) {\n\n interaction.downTargets[0] = eventTarget;\n interaction.downTimes [0] = new Date().getTime();\n\n pointerEvents.fire({\n interaction,\n event,\n eventTarget,\n pointer: event,\n type: 'tap',\n });\n }\n}\n\nif (browser.isIE8) {\n const selectFix = function (event) {\n for (const interaction of scope.interactions) {\n if (interaction.interacting()) {\n interaction.target.checkAndPreventDefault(event);\n }\n }\n };\n\n const onDocIE8 = function onDocIE8 ({ doc, win }, signalName) {\n const eventMethod = signalName.indexOf('listen') === 0\n ? events.add : events.remove;\n\n // For IE's lack of Event#preventDefault\n eventMethod(doc, 'selectstart', selectFix);\n\n if (pointerEvents) {\n eventMethod(doc, 'dblclick', onIE8Dblclick);\n }\n };\n\n scope.signals.on('add-document' , onDocIE8);\n scope.signals.on('remove-document', onDocIE8);\n}\n\nmodule.exports = null;\n","const InteractEvent = require('../InteractEvent');\nconst Interaction = require('../Interaction');\nconst extend = require('../utils/extend');\n\nconst modifiers = {\n names: [],\n\n setOffsets: function (arg) {\n const { interaction, pageCoords: page } = arg;\n const { target, element, startOffset } = interaction;\n const rect = target.getRect(element);\n\n if (rect) {\n startOffset.left = page.x - rect.left;\n startOffset.top = page.y - rect.top;\n\n startOffset.right = rect.right - page.x;\n startOffset.bottom = rect.bottom - page.y;\n\n if (!('width' in rect)) { rect.width = rect.right - rect.left; }\n if (!('height' in rect)) { rect.height = rect.bottom - rect.top ; }\n }\n else {\n startOffset.left = startOffset.top = startOffset.right = startOffset.bottom = 0;\n }\n\n arg.rect = rect;\n arg.interactable = target;\n arg.element = element;\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n\n arg.options = target.options[interaction.prepared.name][modifierName];\n\n if (!arg.options) {\n continue;\n }\n\n interaction.modifierOffsets[modifierName] = modifiers[modifierName].setOffset(arg);\n }\n },\n\n setAll: function (arg) {\n const { interaction, statuses, preEnd, requireEndOnly } = arg;\n const coords = extend({}, arg.pageCoords);\n const result = {\n dx: 0,\n dy: 0,\n changed: false,\n locked: false,\n shouldMove: true,\n };\n\n for (const modifierName of modifiers.names) {\n const modifier = modifiers[modifierName];\n const options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!shouldDo(options, preEnd, requireEndOnly)) { continue; }\n\n arg.status = arg.status = statuses[modifierName];\n arg.options = options;\n arg.offset = arg.interaction.modifierOffsets[modifierName];\n\n modifier.set(arg);\n\n if (arg.status.locked) {\n coords.x += arg.status.dx;\n coords.y += arg.status.dy;\n\n result.dx += arg.status.dx;\n result.dy += arg.status.dy;\n\n result.locked = true;\n }\n }\n\n // a move should be fired if:\n // - there are no modifiers enabled,\n // - no modifiers are \"locked\" i.e. have changed the pointer's coordinates, or\n // - the locked coords have changed since the last pointer move\n result.shouldMove = !arg.status || !result.locked || arg.status.changed;\n\n return result;\n },\n\n resetStatuses: function (statuses) {\n for (const modifierName of modifiers.names) {\n const status = statuses[modifierName] || {};\n\n status.dx = status.dy = 0;\n status.modifiedX = status.modifiedY = NaN;\n status.locked = false;\n status.changed = true;\n\n statuses[modifierName] = status;\n }\n\n return statuses;\n },\n\n start: function ({ interaction }, signalName) {\n const arg = {\n interaction,\n pageCoords: (signalName === 'action-resume' ?\n interaction.curCoords : interaction.startCoords).page,\n startOffset: interaction.startOffset,\n statuses: interaction.modifierStatuses,\n preEnd: false,\n requireEndOnly: false,\n };\n\n modifiers.setOffsets(arg);\n modifiers.resetStatuses(arg.statuses);\n\n arg.pageCoords = extend({}, interaction.startCoords.page);\n interaction.modifierResult = modifiers.setAll(arg);\n },\n};\n\nInteraction.signals.on('new', function (interaction) {\n interaction.startOffset = { left: 0, right: 0, top: 0, bottom: 0 };\n interaction.modifierOffsets = {};\n interaction.modifierStatuses = modifiers.resetStatuses({});\n interaction.modifierResult = null;\n});\n\nInteraction.signals.on('action-start' , modifiers.start);\nInteraction.signals.on('action-resume', modifiers.start);\n\nInteraction.signals.on('before-action-move', function ({ interaction, preEnd, interactingBeforeMove }) {\n const modifierResult = modifiers.setAll({\n interaction,\n preEnd,\n pageCoords: interaction.curCoords.page,\n statuses: interaction.modifierStatuses,\n requireEndOnly: false,\n });\n\n // don't fire an action move if a modifier would keep the event in the same\n // cordinates as before\n if (!modifierResult.shouldMove && interactingBeforeMove) {\n interaction._dontFireMove = true;\n }\n\n interaction.modifierResult = modifierResult;\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n for (let i = 0; i < modifiers.names.length; i++) {\n const options = interaction.target.options[interaction.prepared.name][modifiers.names[i]];\n\n // if the endOnly option is true for any modifier\n if (shouldDo(options, true, true)) {\n // fire a move event at the modified coordinates\n interaction.doMove({ event, preEnd: true });\n break;\n }\n }\n});\n\nInteractEvent.signals.on('set-xy', function (arg) {\n const { iEvent, interaction } = arg;\n const modifierArg = extend({}, arg);\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n modifierArg.options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!modifierArg.options) {\n continue;\n }\n\n const modifier = modifiers[modifierName];\n\n modifierArg.status = interaction.modifierStatuses[modifierName];\n\n iEvent[modifierName] = modifier.modifyCoords(modifierArg);\n }\n});\n\nfunction shouldDo (options, preEnd, requireEndOnly) {\n return (options && options.enabled\n && (preEnd || !options.endOnly)\n && (!requireEndOnly || options.endOnly));\n}\n\nmodule.exports = modifiers;\n","const modifiers = require('./index');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst restrict = {\n defaults: {\n enabled : false,\n endOnly : false,\n restriction: null,\n elementRect: null,\n },\n\n setOffset: function ({ rect, startOffset, options }) {\n const elementRect = options && options.elementRect;\n const offset = {};\n\n if (rect && elementRect) {\n offset.left = startOffset.left - (rect.width * elementRect.left);\n offset.top = startOffset.top - (rect.height * elementRect.top);\n\n offset.right = startOffset.right - (rect.width * (1 - elementRect.right));\n offset.bottom = startOffset.bottom - (rect.height * (1 - elementRect.bottom));\n }\n else {\n offset.left = offset.top = offset.right = offset.bottom = 0;\n }\n\n return offset;\n },\n\n set: function ({ pageCoords, interaction, status, options }) {\n if (!options) { return status; }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n\n const restriction = getRestrictionRect(options.restriction, interaction, page);\n\n if (!restriction) { return status; }\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n const rect = restriction;\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n const offset = interaction.modifierOffsets.restrict;\n\n // object is assumed to have\n // x, y, width, height or\n // left, top, right, bottom\n if ('x' in restriction && 'y' in restriction) {\n modifiedX = Math.max(Math.min(rect.x + rect.width - offset.right , page.x), rect.x + offset.left);\n modifiedY = Math.max(Math.min(rect.y + rect.height - offset.bottom, page.y), rect.y + offset.top );\n }\n else {\n modifiedX = Math.max(Math.min(rect.right - offset.right , page.x), rect.left + offset.left);\n modifiedY = Math.max(Math.min(rect.bottom - offset.bottom, page.y), rect.top + offset.top );\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const elementRect = options && options.elementRect;\n\n if (options && options.enabled\n && !(phase === 'start' && elementRect && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n getRestrictionRect,\n};\n\nfunction getRestrictionRect (value, interaction, page) {\n if (utils.is.function(value)) {\n return utils.resolveRectLike(value, interaction.target, interaction.element, [page.x, page.y, interaction]);\n } else {\n return utils.resolveRectLike(value, interaction.target, interaction.element);\n }\n}\n\nmodifiers.restrict = restrict;\nmodifiers.names.push('restrict');\n\ndefaultOptions.perAction.restrict = restrict.defaults;\n\nmodule.exports = restrict;\n","// This module adds the options.resize.restrictEdges setting which sets min and\n// max for the top, left, bottom and right edges of the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictEdges: {\n// inner: { top: 200, left: 200, right: 400, bottom: 400 },\n// outer: { top: 0, left: 0, right: 600, bottom: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst { getRestrictionRect } = require('./restrict');\n\nconst noInner = { top: +Infinity, left: +Infinity, bottom: -Infinity, right: -Infinity };\nconst noOuter = { top: -Infinity, left: -Infinity, bottom: +Infinity, right: +Infinity };\n\nconst restrictEdges = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n offset: null,\n },\n\n setOffset: function ({ interaction, startOffset, options }) {\n if (!options) {\n return utils.extend({}, startOffset);\n }\n\n const offset = getRestrictionRect(options.offset, interaction, interaction.startCoords.page);\n\n if (offset) {\n return {\n top: startOffset.top + offset.y,\n left: startOffset.left + offset.x,\n bottom: startOffset.bottom + offset.y,\n right: startOffset.right + offset.x,\n };\n }\n\n return startOffset;\n },\n\n set: function ({ pageCoords, interaction, status, offset, options }) {\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n const inner = rectUtils.xywhToTlbr(getRestrictionRect(options.inner, interaction, page)) || noInner;\n const outer = rectUtils.xywhToTlbr(getRestrictionRect(options.outer, interaction, page)) || noOuter;\n\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n if (edges.top) {\n modifiedY = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top);\n }\n else if (edges.bottom) {\n modifiedY = Math.max(Math.min(outer.bottom - offset.bottom, page.y), inner.bottom - offset.bottom);\n }\n if (edges.left) {\n modifiedX = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left);\n }\n else if (edges.right) {\n modifiedX = Math.max(Math.min(outer.right - offset.right, page.x), inner.right - offset.right);\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n if (options && options.enabled\n && !(phase === 'start' && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n noInner,\n noOuter,\n getRestrictionRect,\n};\n\nmodifiers.restrictEdges = restrictEdges;\nmodifiers.names.push('restrictEdges');\n\ndefaultOptions.perAction.restrictEdges = restrictEdges.defaults;\nresize.defaults.restrictEdges = restrictEdges.defaults;\n\nmodule.exports = restrictEdges;\n","// This module adds the options.resize.restrictSize setting which sets min and\n// max width and height for the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictSize: {\n// min: { width: -600, height: -600 },\n// max: { width: 600, height: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst restrictEdges = require('./restrictEdges');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst noMin = { width: -Infinity, height: -Infinity };\nconst noMax = { width: +Infinity, height: +Infinity };\n\nconst restrictSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n },\n\n setOffset: function ({ interaction }) {\n return interaction.startOffset;\n },\n\n set: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const rect = rectUtils.xywhToTlbr(interaction.resizeRects.inverted);\n\n const minSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.min, interaction)) || noMin;\n const maxSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.max, interaction)) || noMax;\n\n arg.options = {\n enabled: options.enabled,\n endOnly: options.endOnly,\n inner: utils.extend({}, restrictEdges.noInner),\n outer: utils.extend({}, restrictEdges.noOuter),\n };\n\n if (edges.top) {\n arg.options.inner.top = rect.bottom - minSize.height;\n arg.options.outer.top = rect.bottom - maxSize.height;\n }\n else if (edges.bottom) {\n arg.options.inner.bottom = rect.top + minSize.height;\n arg.options.outer.bottom = rect.top + maxSize.height;\n }\n if (edges.left) {\n arg.options.inner.left = rect.right - minSize.width;\n arg.options.outer.left = rect.right - maxSize.width;\n }\n else if (edges.right) {\n arg.options.inner.right = rect.left + minSize.width;\n arg.options.outer.right = rect.left + maxSize.width;\n }\n\n restrictEdges.set(arg);\n },\n\n modifyCoords: restrictEdges.modifyCoords,\n};\n\nmodifiers.restrictSize = restrictSize;\nmodifiers.names.push('restrictSize');\n\ndefaultOptions.perAction.restrictSize = restrictSize.defaults;\nresize.defaults.restrictSize = restrictSize.defaults;\n\nmodule.exports = restrictSize;\n","const modifiers = require('./index');\nconst interact = require('../interact');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst snap = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n\n relativePoints: null,\n },\n\n setOffset: function ({ interaction, interactable, element, rect, startOffset, options }) {\n const offsets = [];\n const optionsOrigin = utils.rectToXY(utils.resolveRectLike(options.origin));\n const origin = optionsOrigin || utils.getOriginXY(interactable, element, interaction.prepared.name);\n options = options || interactable.options[interaction.prepared.name].snap || {};\n\n let snapOffset;\n\n if (options.offset === 'startCoords') {\n snapOffset = {\n x: interaction.startCoords.page.x - origin.x,\n y: interaction.startCoords.page.y - origin.y,\n };\n }\n else {\n const offsetRect = utils.resolveRectLike(options.offset, interactable, element, [interaction]);\n\n snapOffset = utils.rectToXY(offsetRect) || { x: 0, y: 0 };\n }\n\n if (rect && options.relativePoints && options.relativePoints.length) {\n for (const { x: relativeX, y: relativeY } of options.relativePoints) {\n offsets.push({\n x: startOffset.left - (rect.width * relativeX) + snapOffset.x,\n y: startOffset.top - (rect.height * relativeY) + snapOffset.y,\n });\n }\n }\n else {\n offsets.push(snapOffset);\n }\n\n return offsets;\n },\n\n set: function ({ interaction, pageCoords, status, options, offset: offsets }) {\n const targets = [];\n let target;\n let page;\n let i;\n\n if (status.useStatusXY) {\n page = { x: status.x, y: status.y };\n }\n else {\n const origin = utils.getOriginXY(interaction.target, interaction.element, interaction.prepared.name);\n\n page = utils.extend({}, pageCoords);\n\n page.x -= origin.x;\n page.y -= origin.y;\n }\n\n status.realX = page.x;\n status.realY = page.y;\n\n let len = options.targets? options.targets.length : 0;\n\n for (const { x: offsetX, y: offsetY } of offsets) {\n const relativeX = page.x - offsetX;\n const relativeY = page.y - offsetY;\n\n for (const snapTarget of options.targets) {\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n targets.push({\n x: utils.is.number(target.x) ? (target.x + offsetX) : relativeX,\n y: utils.is.number(target.y) ? (target.y + offsetY) : relativeY,\n\n range: utils.is.number(target.range)? target.range: options.range,\n });\n }\n }\n\n const closest = {\n target: null,\n inRange: false,\n distance: 0,\n range: 0,\n dx: 0,\n dy: 0,\n };\n\n for (i = 0, len = targets.length; i < len; i++) {\n target = targets[i];\n\n const range = target.range;\n const dx = target.x - page.x;\n const dy = target.y - page.y;\n const distance = utils.hypot(dx, dy);\n let inRange = distance <= range;\n\n // Infinite targets count as being out of range\n // compared to non infinite ones that are in range\n if (range === Infinity && closest.inRange && closest.range !== Infinity) {\n inRange = false;\n }\n\n if (!closest.target || (inRange\n // is the closest target in range?\n ? (closest.inRange && range !== Infinity\n // the pointer is relatively deeper in this target\n ? distance / range < closest.distance / closest.range\n // this target has Infinite range and the closest doesn't\n : (range === Infinity && closest.range !== Infinity)\n // OR this target is closer that the previous closest\n || distance < closest.distance)\n // The other is not in range and the pointer is closer to this target\n : (!closest.inRange && distance < closest.distance))) {\n\n closest.target = target;\n closest.distance = distance;\n closest.range = range;\n closest.inRange = inRange;\n closest.dx = dx;\n closest.dy = dy;\n\n status.range = range;\n }\n }\n\n let snapChanged;\n\n if (closest.target) {\n snapChanged = (status.modifiedX !== closest.target.x || status.modifiedY !== closest.target.y);\n\n status.modifiedX = closest.target.x;\n status.modifiedY = closest.target.y;\n }\n else {\n snapChanged = true;\n\n status.modifiedX = NaN;\n status.modifiedY = NaN;\n }\n\n status.dx = closest.dx;\n status.dy = closest.dy;\n\n status.changed = (snapChanged || (closest.inRange && !status.locked));\n status.locked = closest.inRange;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const relativePoints = options && options.relativePoints;\n\n if (options && options.enabled\n && !(phase === 'start' && relativePoints && relativePoints.length)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n }\n\n return {\n range : status.range,\n locked : status.locked,\n x : status.modifiedX,\n y : status.modifiedY,\n realX : status.realX,\n realY : status.realY,\n dx : status.dx,\n dy : status.dy,\n };\n }\n },\n};\n\ninteract.createSnapGrid = function (grid) {\n return function (x, y) {\n const limits = grid.limits || {\n left : -Infinity,\n right : Infinity,\n top : -Infinity,\n bottom: Infinity,\n };\n let offsetX = 0;\n let offsetY = 0;\n\n if (utils.is.object(grid.offset)) {\n offsetX = grid.offset.x;\n offsetY = grid.offset.y;\n }\n\n const gridx = Math.round((x - offsetX) / grid.x);\n const gridy = Math.round((y - offsetY) / grid.y);\n\n const newX = Math.max(limits.left, Math.min(limits.right , gridx * grid.x + offsetX));\n const newY = Math.max(limits.top , Math.min(limits.bottom, gridy * grid.y + offsetY));\n\n return {\n x: newX,\n y: newY,\n range: grid.range,\n };\n };\n};\n\nmodifiers.snap = snap;\nmodifiers.names.push('snap');\n\ndefaultOptions.perAction.snap = snap.defaults;\n\nmodule.exports = snap;\n","// This module allows snapping of the size of targets during resize\n// interactions.\n\nconst modifiers = require('./index');\nconst snap = require('./snap');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\nconst utils = require('../utils/');\n\nconst snapSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n },\n\n setOffset: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.edges;\n\n if (!edges) { return; }\n\n arg.options = {\n relativePoints: [{\n x: edges.left? 0 : 1,\n y: edges.top ? 0 : 1,\n }],\n origin: { x: 0, y: 0 },\n offset: 'self',\n range: options.range,\n };\n\n const offsets = snap.setOffset(arg);\n arg.options = options;\n\n return offsets;\n },\n\n set: function (arg) {\n const { interaction, options, offset, pageCoords } = arg;\n const page = utils.extend({}, pageCoords);\n const relativeX = page.x - offset[0].x;\n const relativeY = page.y - offset[0].y;\n\n arg.options = utils.extend({}, options);\n arg.options.targets = [];\n\n for (const snapTarget of options.targets) {\n let target;\n\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n if ('width' in target && 'height' in target) {\n target.x = target.width;\n target.y = target.height;\n }\n\n arg.options.targets.push(target);\n }\n\n snap.set(arg);\n },\n\n modifyCoords: function (arg) {\n const { options } = arg;\n\n arg.options = utils.extend({}, options);\n arg.options.enabled = options.enabled;\n arg.options.relativePoints = [null];\n\n snap.modifyCoords(arg);\n },\n};\n\nmodifiers.snapSize = snapSize;\nmodifiers.names.push('snapSize');\n\ndefaultOptions.perAction.snapSize = snapSize.defaults;\nresize.defaults.snapSize = snapSize.defaults;\n\nmodule.exports = snapSize;\n","const pointerUtils = require('../utils/pointerUtils');\n\nmodule.exports = class PointerEvent {\n constructor (type, pointer, event, eventTarget, interaction) {\n pointerUtils.pointerExtend(this, event);\n\n if (event !== pointer) {\n pointerUtils.pointerExtend(this, pointer);\n }\n\n this.interaction = interaction;\n\n this.timeStamp = new Date().getTime();\n this.originalEvent = event;\n this.type = type;\n this.pointerId = pointerUtils.getPointerId(pointer);\n this.pointerType = pointerUtils.getPointerType(pointer);\n this.target = eventTarget;\n this.currentTarget = null;\n\n if (type === 'tap') {\n const pointerIndex = interaction.getPointerIndex(pointer);\n this.dt = this.timeStamp - interaction.downTimes[pointerIndex];\n\n const interval = this.timeStamp - interaction.tapTime;\n\n this.double = !!(interaction.prevTap\n && interaction.prevTap.type !== 'doubletap'\n && interaction.prevTap.target === this.target\n && interval < 500);\n }\n else if (type === 'doubletap') {\n this.dt = pointer.timeStamp - interaction.tapTime;\n }\n }\n\n subtractOrigin ({ x: originX, y: originY }) {\n this.pageX -= originX;\n this.pageY -= originY;\n this.clientX -= originX;\n this.clientY -= originY;\n\n return this;\n }\n\n addOrigin ({ x: originX, y: originY }) {\n this.pageX += originX;\n this.pageY += originY;\n this.clientX += originX;\n this.clientY += originY;\n\n return this;\n }\n\n preventDefault () {\n this.originalEvent.preventDefault();\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n};\n","const PointerEvent = require('./PointerEvent');\nconst Interaction = require('../Interaction');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst defaults = require('../defaultOptions');\nconst signals = require('../utils/Signals').new();\nconst { filter } = require('../utils/arr');\n\nconst simpleSignals = [ 'down', 'up', 'cancel' ];\nconst simpleEvents = [ 'down', 'up', 'cancel' ];\n\nconst pointerEvents = {\n PointerEvent,\n fire,\n collectEventTargets,\n signals,\n defaults: {\n holdDuration: 600,\n ignoreFrom : null,\n allowFrom : null,\n origin : { x: 0, y: 0 },\n },\n types: [\n 'down',\n 'move',\n 'up',\n 'cancel',\n 'tap',\n 'doubletap',\n 'hold',\n ],\n};\n\nfunction fire (arg) {\n const {\n interaction, pointer, event, eventTarget,\n type = arg.pointerEvent.type,\n targets = collectEventTargets(arg),\n pointerEvent = new PointerEvent(type, pointer, event, eventTarget, interaction),\n } = arg;\n\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n targets,\n type,\n pointerEvent,\n };\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n\n for (const prop in target.props || {}) {\n pointerEvent[prop] = target.props[prop];\n }\n\n const origin = utils.getOriginXY(target.eventable, target.element);\n\n pointerEvent.subtractOrigin(origin);\n pointerEvent.eventable = target.eventable;\n pointerEvent.currentTarget = target.element;\n\n target.eventable.fire(pointerEvent);\n\n pointerEvent.addOrigin(origin);\n\n if (pointerEvent.immediatePropagationStopped\n || (pointerEvent.propagationStopped\n && (i + 1) < targets.length && targets[i + 1].element !== pointerEvent.currentTarget)) {\n break;\n }\n }\n\n signals.fire('fired', signalArg);\n\n if (type === 'tap') {\n // if pointerEvent should make a double tap, create and fire a doubletap\n // PointerEvent and use that as the prevTap\n const prevTap = pointerEvent.double\n ? fire({\n interaction, pointer, event, eventTarget,\n type: 'doubletap',\n })\n : pointerEvent;\n\n interaction.prevTap = prevTap;\n interaction.tapTime = prevTap.timeStamp;\n }\n\n return pointerEvent;\n}\n\nfunction collectEventTargets ({ interaction, pointer, event, eventTarget, type }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n // do not fire a tap event if the pointer was moved before being lifted\n if (type === 'tap' && (interaction.pointerWasMoved\n // or if the pointerup target is different to the pointerdown target\n || !(interaction.downTargets[pointerIndex] && interaction.downTargets[pointerIndex] === eventTarget))) {\n return [];\n }\n\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n path,\n targets: [],\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (type === 'hold') {\n signalArg.targets = filter(signalArg.targets, target =>\n target.eventable.options.holdDuration === interaction.holdTimers[pointerIndex].duration);\n }\n\n return signalArg.targets;\n}\n\nInteraction.signals.on('update-pointer-down', function ({ interaction, pointerIndex }) {\n interaction.holdTimers[pointerIndex] = { duration: Infinity, timeout: null };\n});\n\nInteraction.signals.on('remove-pointer', function ({ interaction, pointerIndex }) {\n interaction.holdTimers.splice(pointerIndex, 1);\n});\n\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget, duplicateMove }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n if (!duplicateMove && (!interaction.pointerIsDown || interaction.pointerWasMoved)) {\n if (interaction.pointerIsDown) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n\n fire({\n interaction, pointer, event, eventTarget,\n type: 'move',\n });\n }\n});\n\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget, pointerIndex }) {\n // copy event to be used in timeout for IE8\n const eventCopy = browser.isIE8? utils.extend({}, event) : event;\n\n const timer = interaction.holdTimers[pointerIndex];\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'hold',\n targets: [],\n path,\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (!signalArg.targets.length) { return; }\n\n let minDuration = Infinity;\n\n for (let i = 0; i < signalArg.targets.length; i++) {\n const target = signalArg.targets[i];\n const holdDuration = target.eventable.options.holdDuration;\n\n if (holdDuration < minDuration) {\n minDuration = holdDuration;\n }\n }\n\n timer.duration = minDuration;\n timer.timeout = setTimeout(function () {\n fire({\n interaction,\n eventTarget,\n pointer: browser.isIE8? eventCopy : pointer,\n event: eventCopy,\n type: 'hold',\n });\n }, minDuration);\n});\n\nInteraction.signals.on('up', ({ interaction, pointer, event, eventTarget }) => {\n if (!interaction.pointerWasMoved) {\n fire({ interaction, eventTarget, pointer, event, type: 'tap' });\n }\n});\n\n['up', 'cancel'].forEach(function (signalName) {\n Interaction.signals.on(signalName, function ({ interaction, pointerIndex }) {\n if (interaction.holdTimers[pointerIndex]) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n });\n});\n\nfunction createSignalListener (type) {\n return function ({ interaction, pointer, event, eventTarget }) {\n fire({ interaction, eventTarget, pointer, event, type });\n };\n}\n\nfor (let i = 0; i < simpleSignals.length; i++) {\n Interaction.signals.on(simpleSignals[i], createSignalListener(simpleEvents[i]));\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.prevTap = null; // the most recent tap event on this interaction\n interaction.tapTime = 0; // time of the most recent tap event\n interaction.holdTimers = []; // [{ duration, timeout }]\n});\n\ndefaults.pointerEvents = pointerEvents.defaults;\nmodule.exports = pointerEvents;\n","const pointerEvents = require('./base');\nconst Interaction = require('../Interaction');\n\npointerEvents.signals.on('new', onNew);\npointerEvents.signals.on('fired', onFired);\n\nfor (const signal of ['move', 'up', 'cancel', 'endall']) {\n Interaction.signals.on(signal, endHoldRepeat);\n}\n\nfunction onNew ({ pointerEvent }) {\n if (pointerEvent.type !== 'hold') { return; }\n\n pointerEvent.count = (pointerEvent.count || 0) + 1;\n}\n\nfunction onFired ({ interaction, pointerEvent, eventTarget, targets }) {\n if (pointerEvent.type !== 'hold' || !targets.length) { return; }\n\n // get the repeat interval from the first eventable\n const interval = targets[0].eventable.options.holdRepeatInterval;\n\n // don't repeat if the interval is 0 or less\n if (interval <= 0) { return; }\n\n // set a timeout to fire the holdrepeat event\n interaction.holdIntervalHandle = setTimeout(function () {\n pointerEvents.fire({\n interaction,\n eventTarget,\n type: 'hold',\n pointer: pointerEvent,\n event: pointerEvent,\n });\n }, interval);\n}\n\nfunction endHoldRepeat ({ interaction }) {\n // set the interaction's holdStopTime property\n // to stop further holdRepeat events\n if (interaction.holdIntervalHandle) {\n clearInterval(interaction.holdIntervalHandle);\n interaction.holdIntervalHandle = null;\n }\n}\n\n// don't repeat by default\npointerEvents.defaults.holdRepeatInterval = 0;\npointerEvents.types.push('holdrepeat');\n\nmodule.exports = {\n onNew,\n onFired,\n endHoldRepeat,\n};\n","const pointerEvents = require('./base');\nconst Interactable = require('../Interactable');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\nconst scope = require('../scope');\nconst extend = require('../utils/extend');\nconst { merge } = require('../utils/arr');\n\npointerEvents.signals.on('collect-targets', function ({ targets, element, type, eventTarget }) {\n function collectSelectors (interactable, selector, context) {\n const els = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && is.element(element)\n && domUtils.matchesSelector(element, selector, els)\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n const interactable = scope.interactables.get(element);\n\n if (interactable) {\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n scope.interactables.forEachSelector(collectSelectors, element);\n});\n\nInteractable.signals.on('new', function ({ interactable }) {\n interactable.events.getRect = function (element) {\n return interactable.getRect(element);\n };\n});\n\nInteractable.signals.on('set', function ({ interactable, options }) {\n extend(interactable.events.options, pointerEvents.defaults);\n extend(interactable.events.options, options);\n});\n\nmerge(Interactable.eventTypes, pointerEvents.types);\n\nInteractable.prototype.pointerEvents = function (options) {\n extend(this.events.options, options);\n\n return this;\n};\n\nconst __backCompatOption = Interactable.prototype._backCompatOption;\n\nInteractable.prototype._backCompatOption = function (optionName, newValue) {\n const ret = __backCompatOption.call(this, optionName, newValue);\n\n if (ret === this) {\n this.events.options[optionName] = newValue;\n }\n\n return ret;\n};\n\nInteractable.settingsMethods.push('pointerEvents');\n","const utils = require('./utils');\nconst events = require('./utils/events');\nconst signals = require('./utils/Signals').new();\n\nconst scope = {\n signals,\n events,\n utils,\n\n // main document\n document: require('./utils/domObjects').document,\n // all documents being listened to\n documents: [],\n\n addDocument: function (doc, win) {\n // do nothing if document is already known\n if (utils.contains(scope.documents, doc)) { return false; }\n\n win = win || scope.getWindow(doc);\n\n scope.documents.push(doc);\n events.documents.push(doc);\n\n // don't add an unload event for the main document\n // so that the page may be cached in browser history\n if (doc !== scope.document) {\n events.add(win, 'unload', scope.onWindowUnload);\n }\n\n signals.fire('add-document', { doc, win });\n },\n\n removeDocument: function (doc, win) {\n const index = utils.indexOf(scope.documents, doc);\n\n win = win || scope.getWindow(doc);\n\n events.remove(win, 'unload', scope.onWindowUnload);\n\n scope.documents.splice(index, 1);\n events.documents.splice(index, 1);\n\n signals.fire('remove-document', { win, doc });\n },\n\n onWindowUnload: function () {\n scope.removeDocument(this.document, this);\n },\n};\n\nmodule.exports = scope;\n","const { indexOf } = require('./arr');\n\nclass Signals {\n constructor () {\n this.listeners = {\n // signalName: [listeners],\n };\n }\n\n on (name, listener) {\n if (!this.listeners[name]) {\n this.listeners[name] = [listener];\n return;\n }\n\n this.listeners[name].push(listener);\n }\n\n off (name, listener) {\n if (!this.listeners[name]) { return; }\n\n const index = indexOf(this.listeners[name], listener);\n\n if (index !== -1) {\n this.listeners[name].splice(index, 1);\n }\n }\n\n fire (name, arg) {\n const targetListeners = this.listeners[name];\n\n if (!targetListeners) { return; }\n\n for (let i = 0; i < targetListeners.length; i++) {\n if (targetListeners[i](arg, name) === false) {\n return;\n }\n }\n }\n}\n\nSignals.new = function () {\n return new Signals();\n};\n\nmodule.exports = Signals;\n","function indexOf (array, target) {\n for (let i = 0, len = array.length; i < len; i++) {\n if (array[i] === target) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction contains (array, target) {\n return indexOf(array, target) !== -1;\n}\n\nfunction merge (target, source) {\n for (let i = 0; i < source.length; i++) {\n target.push(source[i]);\n }\n\n return target;\n}\n\nfunction filter (array, test) {\n const result = [];\n\n for (let i = 0; i < array.length; i++) {\n if (test(array[i])) {\n result.push(array[i]);\n }\n }\n\n return result;\n}\n\nmodule.exports = {\n indexOf,\n contains,\n merge,\n filter,\n};\n","const { window } = require('./window');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst Element = domObjects.Element;\nconst navigator = window.navigator;\n\nconst browser = {\n // Does the browser support touch input?\n supportsTouch: !!(('ontouchstart' in window) || is.function(window.DocumentTouch)\n && domObjects.document instanceof window.DocumentTouch),\n\n // Does the browser support PointerEvents\n supportsPointerEvent: !!domObjects.PointerEvent,\n\n isIE8: ('attachEvent' in window) && !('addEventListener' in window),\n\n // Opera Mobile must be handled differently\n isOperaMobile: (navigator.appName === 'Opera'\n && browser.supportsTouch\n && navigator.userAgent.match('Presto')),\n\n // scrolling doesn't change the result of getClientRects on iOS 7\n isIOS7: (/iP(hone|od|ad)/.test(navigator.platform)\n && /OS 7[^\\d]/.test(navigator.appVersion)),\n\n isIe9OrOlder: /MSIE (8|9)/.test(navigator.userAgent),\n\n // prefix matchesSelector\n prefixedMatchesSelector: 'matches' in Element.prototype\n ? 'matches': 'webkitMatchesSelector' in Element.prototype\n ? 'webkitMatchesSelector': 'mozMatchesSelector' in Element.prototype\n ? 'mozMatchesSelector': 'oMatchesSelector' in Element.prototype\n ? 'oMatchesSelector': 'msMatchesSelector',\n\n useMatchesSelectorPolyfill: false,\n\n pEventTypes: (domObjects.PointerEvent\n ? (domObjects.PointerEvent === window.MSPointerEvent\n ? {\n up: 'MSPointerUp',\n down: 'MSPointerDown',\n over: 'mouseover',\n out: 'mouseout',\n move: 'MSPointerMove',\n cancel: 'MSPointerCancel',\n }\n : {\n up: 'pointerup',\n down: 'pointerdown',\n over: 'pointerover',\n out: 'pointerout',\n move: 'pointermove',\n cancel: 'pointercancel',\n })\n : null),\n\n // because Webkit and Opera still use 'mousewheel' event type\n wheelEvent: 'onmousewheel' in domObjects.document? 'mousewheel': 'wheel',\n\n};\n\nbrowser.useMatchesSelectorPolyfill = !is.function(Element.prototype[browser.prefixedMatchesSelector]);\n\nmodule.exports = browser;\n","const domObjects = {};\nconst win = require('./window').window;\n\nfunction blank () {}\n\ndomObjects.document = win.document;\ndomObjects.DocumentFragment = win.DocumentFragment || blank;\ndomObjects.SVGElement = win.SVGElement || blank;\ndomObjects.SVGSVGElement = win.SVGSVGElement || blank;\ndomObjects.SVGElementInstance = win.SVGElementInstance || blank;\ndomObjects.Element = win.Element || blank;\ndomObjects.HTMLElement = win.HTMLElement || domObjects.Element;\n\ndomObjects.Event = win.Event;\ndomObjects.Touch = win.Touch || blank;\ndomObjects.PointerEvent = (win.PointerEvent || win.MSPointerEvent);\n\nmodule.exports = domObjects;\n","const win = require('./window');\nconst browser = require('./browser');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst domUtils = {\n nodeContains: function (parent, child) {\n while (child) {\n if (child === parent) {\n return true;\n }\n\n child = child.parentNode;\n }\n\n return false;\n },\n\n closest: function (element, selector) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) { return element; }\n\n element = domUtils.parentNode(element);\n }\n\n return null;\n },\n\n parentNode: function (node) {\n let parent = node.parentNode;\n\n if (is.docFrag(parent)) {\n // skip past #shado-root fragments\n while ((parent = parent.host) && is.docFrag(parent)) {\n continue;\n }\n\n return parent;\n }\n\n return parent;\n },\n\n // taken from http://tanalin.com/en/blog/2012/12/matches-selector-ie8/ and modified\n matchesSelectorPolyfill: browser.useMatchesSelectorPolyfill\n ? function (element, selector, elems) {\n elems = elems || element.parentNode.querySelectorAll(selector);\n\n for (let i = 0, len = elems.length; i < len; i++) {\n if (elems[i] === element) {\n return true;\n }\n }\n\n return false;\n }\n : null,\n\n matchesSelector: function (element, selector, nodeList) {\n if (browser.useMatchesSelectorPolyfill) {\n return domUtils.matchesSelectorPolyfill(element, selector, nodeList);\n }\n\n // remove /deep/ from selectors if shadowDOM polyfill is used\n if (win.window !== win.realWindow) {\n selector = selector.replace(/\\/deep\\//g, ' ');\n }\n\n return element[browser.prefixedMatchesSelector](selector);\n },\n\n // Test for the element that's \"above\" all other qualifiers\n indexOfDeepestElement: function (elements) {\n let deepestZoneParents = [];\n let dropzoneParents = [];\n let dropzone;\n let deepestZone = elements[0];\n let index = deepestZone? 0: -1;\n let parent;\n let child;\n let i;\n let n;\n\n for (i = 1; i < elements.length; i++) {\n dropzone = elements[i];\n\n // an element might belong to multiple selector dropzones\n if (!dropzone || dropzone === deepestZone) {\n continue;\n }\n\n if (!deepestZone) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n // check if the deepest or current are document.documentElement or document.rootElement\n // - if the current dropzone is, do nothing and continue\n if (dropzone.parentNode === dropzone.ownerDocument) {\n continue;\n }\n // - if deepest is, update with the current dropzone and continue to next\n else if (deepestZone.parentNode === dropzone.ownerDocument) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n if (!deepestZoneParents.length) {\n parent = deepestZone;\n while (parent.parentNode && parent.parentNode !== parent.ownerDocument) {\n deepestZoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n }\n\n // if this element is an svg element and the current deepest is\n // an HTMLElement\n if (deepestZone instanceof domObjects.HTMLElement\n && dropzone instanceof domObjects.SVGElement\n && !(dropzone instanceof domObjects.SVGSVGElement)) {\n\n if (dropzone === deepestZone.parentNode) {\n continue;\n }\n\n parent = dropzone.ownerSVGElement;\n }\n else {\n parent = dropzone;\n }\n\n dropzoneParents = [];\n\n while (parent.parentNode !== parent.ownerDocument) {\n dropzoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n\n n = 0;\n\n // get (position of last common ancestor) + 1\n while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) {\n n++;\n }\n\n const parents = [\n dropzoneParents[n - 1],\n dropzoneParents[n],\n deepestZoneParents[n],\n ];\n\n child = parents[0].lastChild;\n\n while (child) {\n if (child === parents[1]) {\n deepestZone = dropzone;\n index = i;\n deepestZoneParents = [];\n\n break;\n }\n else if (child === parents[2]) {\n break;\n }\n\n child = child.previousSibling;\n }\n }\n\n return index;\n },\n\n matchesUpTo: function (element, selector, limit) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) {\n return true;\n }\n\n element = domUtils.parentNode(element);\n\n if (element === limit) {\n return domUtils.matchesSelector(element, selector);\n }\n }\n\n return false;\n },\n\n getActualElement: function (element) {\n return (element instanceof domObjects.SVGElementInstance\n ? element.correspondingUseElement\n : element);\n },\n\n getScrollXY: function (relevantWindow) {\n relevantWindow = relevantWindow || win.window;\n return {\n x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft,\n y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop,\n };\n },\n\n getElementClientRect: function (element) {\n const clientRect = (element instanceof domObjects.SVGElement\n ? element.getBoundingClientRect()\n : element.getClientRects()[0]);\n\n return clientRect && {\n left : clientRect.left,\n right : clientRect.right,\n top : clientRect.top,\n bottom: clientRect.bottom,\n width : clientRect.width || clientRect.right - clientRect.left,\n height: clientRect.height || clientRect.bottom - clientRect.top,\n };\n },\n\n getElementRect: function (element) {\n const clientRect = domUtils.getElementClientRect(element);\n\n if (!browser.isIOS7 && clientRect) {\n const scroll = domUtils.getScrollXY(win.getWindow(element));\n\n clientRect.left += scroll.x;\n clientRect.right += scroll.x;\n clientRect.top += scroll.y;\n clientRect.bottom += scroll.y;\n }\n\n return clientRect;\n },\n\n getPath: function (element) {\n const path = [];\n\n while (element) {\n path.push(element);\n element = domUtils.parentNode(element);\n }\n\n return path;\n },\n\n trySelector: value => {\n if (!is.string(value)) { return false; }\n\n // an exception will be raised if it is invalid\n domObjects.document.querySelector(value);\n return true;\n },\n};\n\nmodule.exports = domUtils;\n","const is = require('./is');\nconst domUtils = require('./domUtils');\nconst pExtend = require('./pointerExtend');\n\nconst { window, getWindow } = require('./window');\nconst { indexOf, contains } = require('./arr');\n\nconst useAttachEvent = ('attachEvent' in window) && !('addEventListener' in window);\nconst addEvent = useAttachEvent? 'attachEvent': 'addEventListener';\nconst removeEvent = useAttachEvent? 'detachEvent': 'removeEventListener';\nconst on = useAttachEvent? 'on': '';\n\nconst elements = [];\nconst targets = [];\nconst attachedListeners = [];\n\n// {\n// type: {\n// selectors: ['selector', ...],\n// contexts : [document, ...],\n// listeners: [[listener, capture, passive], ...]\n// }\n// }\nconst delegatedEvents = {};\n\nconst documents = [];\n\nconst supportsOptions = !useAttachEvent && (() => {\n let supported = false;\n\n window.document.createElement('div').addEventListener('test', null, {\n get capture () { supported = true; },\n });\n\n return supported;\n})();\n\nfunction add (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n let elementIndex = indexOf(elements, element);\n let target = targets[elementIndex];\n\n if (!target) {\n target = {\n events: {},\n typeCount: 0,\n };\n\n elementIndex = elements.push(element) - 1;\n targets.push(target);\n\n attachedListeners.push(useAttachEvent\n ? {\n supplied: [],\n wrapped : [],\n useCount: [],\n }\n : null);\n }\n\n if (!target.events[type]) {\n target.events[type] = [];\n target.typeCount++;\n }\n\n if (!contains(target.events[type], listener)) {\n let ret;\n\n if (useAttachEvent) {\n const { supplied, wrapped, useCount } = attachedListeners[elementIndex];\n const listenerIndex = indexOf(supplied, listener);\n\n const wrappedListener = wrapped[listenerIndex] || function (event) {\n if (!event.immediatePropagationStopped) {\n event.target = event.srcElement;\n event.currentTarget = element;\n\n event.preventDefault = event.preventDefault || preventDef;\n event.stopPropagation = event.stopPropagation || stopProp;\n event.stopImmediatePropagation = event.stopImmediatePropagation || stopImmProp;\n\n if (/mouse|click/.test(event.type)) {\n event.pageX = event.clientX + getWindow(element).document.documentElement.scrollLeft;\n event.pageY = event.clientY + getWindow(element).document.documentElement.scrollTop;\n }\n\n listener(event);\n }\n };\n\n ret = element[addEvent](on + type, wrappedListener, !!options.capture);\n\n if (listenerIndex === -1) {\n supplied.push(listener);\n wrapped.push(wrappedListener);\n useCount.push(1);\n }\n else {\n useCount[listenerIndex]++;\n }\n }\n else {\n ret = element[addEvent](type, listener, supportsOptions? options : !!options.capture);\n }\n target.events[type].push(listener);\n\n return ret;\n }\n}\n\nfunction remove (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const elementIndex = indexOf(elements, element);\n const target = targets[elementIndex];\n\n if (!target || !target.events) {\n return;\n }\n\n let wrappedListener = listener;\n let listeners;\n let listenerIndex;\n\n if (useAttachEvent) {\n listeners = attachedListeners[elementIndex];\n listenerIndex = indexOf(listeners.supplied, listener);\n wrappedListener = listeners.wrapped[listenerIndex];\n }\n\n if (type === 'all') {\n for (type in target.events) {\n if (target.events.hasOwnProperty(type)) {\n remove(element, type, 'all');\n }\n }\n return;\n }\n\n if (target.events[type]) {\n const len = target.events[type].length;\n\n if (listener === 'all') {\n for (let i = 0; i < len; i++) {\n remove(element, type, target.events[type][i], options);\n }\n return;\n }\n else {\n for (let i = 0; i < len; i++) {\n if (target.events[type][i] === listener) {\n element[removeEvent](on + type, wrappedListener, supportsOptions? options : !!options.capture);\n target.events[type].splice(i, 1);\n\n if (useAttachEvent && listeners) {\n listeners.useCount[listenerIndex]--;\n if (listeners.useCount[listenerIndex] === 0) {\n listeners.supplied.splice(listenerIndex, 1);\n listeners.wrapped.splice(listenerIndex, 1);\n listeners.useCount.splice(listenerIndex, 1);\n }\n }\n\n break;\n }\n }\n }\n\n if (target.events[type] && target.events[type].length === 0) {\n target.events[type] = null;\n target.typeCount--;\n }\n }\n\n if (!target.typeCount) {\n targets.splice(elementIndex, 1);\n elements.splice(elementIndex, 1);\n attachedListeners.splice(elementIndex, 1);\n }\n}\n\nfunction addDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n if (!delegatedEvents[type]) {\n delegatedEvents[type] = {\n selectors: [],\n contexts : [],\n listeners: [],\n };\n\n // add delegate listener functions\n for (let i = 0; i < documents.length; i++) {\n add(documents[i], type, delegateListener);\n add(documents[i], type, delegateUseCapture, true);\n }\n }\n\n const delegated = delegatedEvents[type];\n let index;\n\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n break;\n }\n }\n\n if (index === -1) {\n index = delegated.selectors.length;\n\n delegated.selectors.push(selector);\n delegated.contexts .push(context);\n delegated.listeners.push([]);\n }\n\n // keep listener and capture and passive flags\n delegated.listeners[index].push([listener, !!options.capture, options.passive]);\n}\n\nfunction removeDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const delegated = delegatedEvents[type];\n let matchFound = false;\n let index;\n\n if (!delegated) { return; }\n\n // count from last index of delegated to 0\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n // look for matching selector and context Node\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n\n const listeners = delegated.listeners[index];\n\n // each item of the listeners array is an array: [function, capture, passive]\n for (let i = listeners.length - 1; i >= 0; i--) {\n const [fn, capture, passive] = listeners[i];\n\n // check if the listener functions and capture and passive flags match\n if (fn === listener && capture === !!options.capture && passive === options.passive) {\n // remove the listener from the array of listeners\n listeners.splice(i, 1);\n\n // if all listeners for this interactable have been removed\n // remove the interactable from the delegated arrays\n if (!listeners.length) {\n delegated.selectors.splice(index, 1);\n delegated.contexts .splice(index, 1);\n delegated.listeners.splice(index, 1);\n\n // remove delegate function from context\n remove(context, type, delegateListener);\n remove(context, type, delegateUseCapture, true);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegatedEvents[type] = null;\n }\n }\n\n // only remove one listener\n matchFound = true;\n break;\n }\n }\n\n if (matchFound) { break; }\n }\n }\n}\n\n// bound to the interactable context when a DOM event\n// listener is added to a selector interactable\nfunction delegateListener (event, optionalArg) {\n const options = getOptions(optionalArg);\n const fakeEvent = {};\n const delegated = delegatedEvents[event.type];\n const eventTarget = (domUtils.getActualElement(event.path\n ? event.path[0]\n : event.target));\n let element = eventTarget;\n\n // duplicate the event so that currentTarget can be changed\n pExtend(fakeEvent, event);\n\n fakeEvent.originalEvent = event;\n fakeEvent.preventDefault = preventOriginalDefault;\n\n // climb up document tree looking for selector matches\n while (is.element(element)) {\n for (let i = 0; i < delegated.selectors.length; i++) {\n const selector = delegated.selectors[i];\n const context = delegated.contexts[i];\n\n if (domUtils.matchesSelector(element, selector)\n && domUtils.nodeContains(context, eventTarget)\n && domUtils.nodeContains(context, element)) {\n\n const listeners = delegated.listeners[i];\n\n fakeEvent.currentTarget = element;\n\n for (let j = 0; j < listeners.length; j++) {\n const [fn, capture, passive] = listeners[j];\n\n if (capture === !!options.capture && passive === options.passive) {\n fn(fakeEvent);\n }\n }\n }\n }\n\n element = domUtils.parentNode(element);\n }\n}\n\nfunction delegateUseCapture (event) {\n return delegateListener.call(this, event, true);\n}\n\nfunction preventDef () {\n this.returnValue = false;\n}\n\nfunction preventOriginalDefault () {\n this.originalEvent.preventDefault();\n}\n\nfunction stopProp () {\n this.cancelBubble = true;\n}\n\nfunction stopImmProp () {\n this.cancelBubble = true;\n this.immediatePropagationStopped = true;\n}\n\nfunction getOptions (param) {\n return is.object(param)? param : { capture: param };\n}\n\nmodule.exports = {\n add,\n remove,\n\n addDelegate,\n removeDelegate,\n\n delegateListener,\n delegateUseCapture,\n delegatedEvents,\n documents,\n\n useAttachEvent,\n supportsOptions,\n\n _elements: elements,\n _targets: targets,\n _attachedListeners: attachedListeners,\n};\n","module.exports = function extend (dest, source) {\n for (const prop in source) {\n dest[prop] = source[prop];\n }\n return dest;\n};\n","const {\n resolveRectLike,\n rectToXY,\n} = require('./rect');\n\nmodule.exports = function (target, element, action) {\n const actionOptions = target.options[action];\n const actionOrigin = actionOptions && actionOptions.origin;\n const origin = actionOrigin || target.options.origin;\n\n const originRect = resolveRectLike(origin, target, element, [target && element]);\n\n return rectToXY(originRect) || { x: 0, y: 0 };\n};\n","module.exports = (x, y) => Math.sqrt(x * x + y * y);\n","const extend = require('./extend');\nconst win = require('./window');\n\nconst utils = {\n warnOnce: function (method, message) {\n let warned = false;\n\n return function () {\n if (!warned) {\n win.window.console.warn(message);\n warned = true;\n }\n\n return method.apply(this, arguments);\n };\n },\n\n // http://stackoverflow.com/a/5634528/2280888\n _getQBezierValue: function (t, p1, p2, p3) {\n const iT = 1 - t;\n return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3;\n },\n\n getQuadraticCurvePoint: function (startX, startY, cpX, cpY, endX, endY, position) {\n return {\n x: utils._getQBezierValue(position, startX, cpX, endX),\n y: utils._getQBezierValue(position, startY, cpY, endY),\n };\n },\n\n // http://gizma.com/easing/\n easeOutQuad: function (t, b, c, d) {\n t /= d;\n return -c * t*(t-2) + b;\n },\n\n copyAction: function (dest, src) {\n dest.name = src.name;\n dest.axis = src.axis;\n dest.edges = src.edges;\n\n return dest;\n },\n\n is : require('./is'),\n extend : extend,\n hypot : require('./hypot'),\n getOriginXY: require('./getOriginXY'),\n};\n\nextend(utils, require('./arr'));\nextend(utils, require('./domUtils'));\nextend(utils, require('./pointerUtils'));\nextend(utils, require('./rect'));\n\nmodule.exports = utils;\n","const scope = require('../scope');\nconst utils = require('./index');\n\nconst finder = {\n methodOrder: [ 'simulationResume', 'mouseOrPen', 'hasPointer', 'idle' ],\n\n search: function (pointer, eventType, eventTarget) {\n const pointerType = utils.getPointerType(pointer);\n const pointerId = utils.getPointerId(pointer);\n const details = { pointer, pointerId, pointerType, eventType, eventTarget };\n\n for (const method of finder.methodOrder) {\n const interaction = finder[method](details);\n\n if (interaction) {\n return interaction;\n }\n }\n },\n\n // try to resume simulation with a new pointer\n simulationResume: function ({ pointerType, eventType, eventTarget }) {\n if (!/down|start/i.test(eventType)) {\n return null;\n }\n\n for (const interaction of scope.interactions) {\n let element = eventTarget;\n\n if (interaction.simulation && interaction.simulation.allowResume\n && (interaction.pointerType === pointerType)) {\n while (element) {\n // if the element is the interaction element\n if (element === interaction.element) {\n return interaction;\n }\n element = utils.parentNode(element);\n }\n }\n }\n\n return null;\n },\n\n // if it's a mouse or pen interaction\n mouseOrPen: function ({ pointerId, pointerType, eventType }) {\n if (pointerType !== 'mouse' && pointerType !== 'pen') {\n return null;\n }\n\n let firstNonActive;\n\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType) {\n // if it's a down event, skip interactions with running simulations\n if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; }\n\n // if the interaction is active, return it immediately\n if (interaction.interacting()) {\n return interaction;\n }\n // otherwise save it and look for another active interaction\n else if (!firstNonActive) {\n firstNonActive = interaction;\n }\n }\n }\n\n // if no active mouse interaction was found use the first inactive mouse\n // interaction\n if (firstNonActive) {\n return firstNonActive;\n }\n\n // find any mouse or pen interaction.\n // ignore the interaction if the eventType is a *down, and a simulation\n // is active\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType && !(/down/i.test(eventType) && interaction.simulation)) {\n return interaction;\n }\n }\n\n return null;\n },\n\n // get interaction that has this pointer\n hasPointer: function ({ pointerId }) {\n for (const interaction of scope.interactions) {\n if (utils.contains(interaction.pointerIds, pointerId)) {\n return interaction;\n }\n }\n },\n\n // get first idle interaction with a matching pointerType\n idle: function ({ pointerType }) {\n for (const interaction of scope.interactions) {\n // if there's already a pointer held down\n if (interaction.pointerIds.length === 1) {\n const target = interaction.target;\n // don't add this pointer if there is a target interactable and it\n // isn't gesturable\n if (target && !target.options.gesture.enabled) {\n continue;\n }\n }\n // maximum of 2 pointers per interaction\n else if (interaction.pointerIds.length >= 2) {\n continue;\n }\n\n if (!interaction.interacting() && (pointerType === interaction.pointerType)) {\n return interaction;\n }\n }\n\n return null;\n },\n};\n\nmodule.exports = finder;\n","const win = require('./window');\nconst isWindow = require('./isWindow');\n\nconst is = {\n array : () => {},\n\n window : thing => thing === win.window || isWindow(thing),\n\n docFrag : thing => is.object(thing) && thing.nodeType === 11,\n\n object : thing => !!thing && (typeof thing === 'object'),\n\n function: thing => typeof thing === 'function',\n\n number : thing => typeof thing === 'number' ,\n\n bool : thing => typeof thing === 'boolean' ,\n\n string : thing => typeof thing === 'string' ,\n\n element: thing => {\n if (!thing || (typeof thing !== 'object')) { return false; }\n\n const _window = win.getWindow(thing) || win.window;\n\n return (/object|function/.test(typeof _window.Element)\n ? thing instanceof _window.Element //DOM2\n : thing.nodeType === 1 && typeof thing.nodeName === 'string');\n },\n};\n\nis.array = thing => (is.object(thing)\n && (typeof thing.length !== 'undefined')\n && is.function(thing.splice));\n\nmodule.exports = is;\n","module.exports = (thing) => !!(thing && thing.Window) && (thing instanceof thing.Window);\n","function pointerExtend (dest, source) {\n for (const prop in source) {\n const prefixedPropREs = module.exports.prefixedPropREs;\n let deprecated = false;\n\n // skip deprecated prefixed properties\n for (const vendor in prefixedPropREs) {\n if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) {\n deprecated = true;\n break;\n }\n }\n\n if (!deprecated && typeof source[prop] !== 'function') {\n dest[prop] = source[prop];\n }\n }\n return dest;\n}\n\npointerExtend.prefixedPropREs = {\n webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/,\n};\n\nmodule.exports = pointerExtend;\n","const hypot = require('./hypot');\nconst browser = require('./browser');\nconst dom = require('./domObjects');\nconst domUtils = require('./domUtils');\nconst domObjects = require('./domObjects');\nconst is = require('./is');\nconst pointerExtend = require('./pointerExtend');\n\nconst pointerUtils = {\n copyCoords: function (dest, src) {\n dest.page = dest.page || {};\n dest.page.x = src.page.x;\n dest.page.y = src.page.y;\n\n dest.client = dest.client || {};\n dest.client.x = src.client.x;\n dest.client.y = src.client.y;\n\n dest.timeStamp = src.timeStamp;\n },\n\n setCoordDeltas: function (targetObj, prev, cur) {\n targetObj.page.x = cur.page.x - prev.page.x;\n targetObj.page.y = cur.page.y - prev.page.y;\n targetObj.client.x = cur.client.x - prev.client.x;\n targetObj.client.y = cur.client.y - prev.client.y;\n targetObj.timeStamp = cur.timeStamp - prev.timeStamp;\n\n // set pointer velocity\n const dt = Math.max(targetObj.timeStamp / 1000, 0.001);\n\n targetObj.page.speed = hypot(targetObj.page.x, targetObj.page.y) / dt;\n targetObj.page.vx = targetObj.page.x / dt;\n targetObj.page.vy = targetObj.page.y / dt;\n\n targetObj.client.speed = hypot(targetObj.client.x, targetObj.page.y) / dt;\n targetObj.client.vx = targetObj.client.x / dt;\n targetObj.client.vy = targetObj.client.y / dt;\n },\n\n isNativePointer: function (pointer) {\n return (pointer instanceof dom.Event || pointer instanceof dom.Touch);\n },\n\n // Get specified X/Y coords for mouse or event.touches[0]\n getXY: function (type, pointer, xy) {\n xy = xy || {};\n type = type || 'page';\n\n xy.x = pointer[type + 'X'];\n xy.y = pointer[type + 'Y'];\n\n return xy;\n },\n\n getPageXY: function (pointer, page) {\n page = page || {};\n\n // Opera Mobile handles the viewport and scrolling oddly\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n pointerUtils.getXY('screen', pointer, page);\n\n page.x += window.scrollX;\n page.y += window.scrollY;\n }\n else {\n pointerUtils.getXY('page', pointer, page);\n }\n\n return page;\n },\n\n getClientXY: function (pointer, client) {\n client = client || {};\n\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n // Opera Mobile handles the viewport and scrolling oddly\n pointerUtils.getXY('screen', pointer, client);\n }\n else {\n pointerUtils.getXY('client', pointer, client);\n }\n\n return client;\n },\n\n getPointerId: function (pointer) {\n return is.number(pointer.pointerId)? pointer.pointerId : pointer.identifier;\n },\n\n setCoords: function (targetObj, pointers, timeStamp) {\n const pointer = (pointers.length > 1\n ? pointerUtils.pointerAverage(pointers)\n : pointers[0]);\n\n const tmpXY = {};\n\n pointerUtils.getPageXY(pointer, tmpXY);\n targetObj.page.x = tmpXY.x;\n targetObj.page.y = tmpXY.y;\n\n pointerUtils.getClientXY(pointer, tmpXY);\n targetObj.client.x = tmpXY.x;\n targetObj.client.y = tmpXY.y;\n\n targetObj.timeStamp = is.number(timeStamp) ? timeStamp :new Date().getTime();\n },\n\n pointerExtend: pointerExtend,\n\n getTouchPair: function (event) {\n const touches = [];\n\n // array of touches is supplied\n if (is.array(event)) {\n touches[0] = event[0];\n touches[1] = event[1];\n }\n // an event\n else {\n if (event.type === 'touchend') {\n if (event.touches.length === 1) {\n touches[0] = event.touches[0];\n touches[1] = event.changedTouches[0];\n }\n else if (event.touches.length === 0) {\n touches[0] = event.changedTouches[0];\n touches[1] = event.changedTouches[1];\n }\n }\n else {\n touches[0] = event.touches[0];\n touches[1] = event.touches[1];\n }\n }\n\n return touches;\n },\n\n pointerAverage: function (pointers) {\n const average = {\n pageX : 0,\n pageY : 0,\n clientX: 0,\n clientY: 0,\n screenX: 0,\n screenY: 0,\n };\n\n for (const pointer of pointers) {\n for (const prop in average) {\n average[prop] += pointer[prop];\n }\n }\n for (const prop in average) {\n average[prop] /= pointers.length;\n }\n\n return average;\n },\n\n touchBBox: function (event) {\n if (!event.length && !(event.touches && event.touches.length > 1)) {\n return;\n }\n\n const touches = pointerUtils.getTouchPair(event);\n const minX = Math.min(touches[0].pageX, touches[1].pageX);\n const minY = Math.min(touches[0].pageY, touches[1].pageY);\n const maxX = Math.max(touches[0].pageX, touches[1].pageX);\n const maxY = Math.max(touches[0].pageY, touches[1].pageY);\n\n return {\n x: minX,\n y: minY,\n left: minX,\n top: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n },\n\n touchDistance: function (event, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n\n\n const dx = touches[0][sourceX] - touches[1][sourceX];\n const dy = touches[0][sourceY] - touches[1][sourceY];\n\n return hypot(dx, dy);\n },\n\n touchAngle: function (event, prevAngle, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n const dx = touches[1][sourceX] - touches[0][sourceX];\n const dy = touches[1][sourceY] - touches[0][sourceY];\n const angle = 180 * Math.atan2(dy , dx) / Math.PI;\n\n return angle;\n },\n\n getPointerType: function (pointer) {\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : is.number(pointer.pointerType)\n ? [undefined, undefined,'touch', 'pen', 'mouse'][pointer.pointerType]\n // if the PointerEvent API isn't available, then the \"pointer\" must\n // be either a MouseEvent, TouchEvent, or Touch object\n : /touch/.test(pointer.type) || pointer instanceof domObjects.Touch\n ? 'touch'\n : 'mouse';\n },\n\n // [ event.target, event.currentTarget ]\n getEventTargets: function (event) {\n return [\n domUtils.getActualElement(event.path ? event.path[0] : event.target),\n domUtils.getActualElement(event.currentTarget),\n ];\n },\n};\n\nmodule.exports = pointerUtils;\n","const { window } = require('./window');\n\nconst vendors = ['ms', 'moz', 'webkit', 'o'];\nlet lastTime = 0;\nlet request;\nlet cancel;\n\nfor (let x = 0; x < vendors.length && !window.requestAnimationFrame; x++) {\n request = window[vendors[x] + 'RequestAnimationFrame'];\n cancel = window[vendors[x] +'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n}\n\nif (!request) {\n request = function (callback) {\n const currTime = new Date().getTime();\n const timeToCall = Math.max(0, 16 - (currTime - lastTime));\n const id = setTimeout(function () { callback(currTime + timeToCall); },\n timeToCall);\n\n lastTime = currTime + timeToCall;\n return id;\n };\n}\n\nif (!cancel) {\n cancel = function (id) {\n clearTimeout(id);\n };\n}\n\nmodule.exports = {\n request,\n cancel,\n};\n","const extend = require('./extend');\nconst is = require('./is');\nconst {\n closest,\n parentNode,\n getElementRect,\n} = require('./domUtils');\n\nconst rectUtils = {\n getStringOptionResult: function (value, interactable, element) {\n if (!is.string(value)) {\n return null;\n }\n\n if (value === 'parent') {\n value = parentNode(element);\n }\n else if (value === 'self') {\n value = interactable.getRect(element);\n }\n else {\n value = closest(element, value);\n }\n\n return value;\n },\n\n resolveRectLike: function (value, interactable, element, functionArgs) {\n value = rectUtils.getStringOptionResult(value, interactable, element) || value;\n\n if (is.function(value)) {\n value = value.apply(null, functionArgs);\n }\n\n if (is.element(value)) {\n value = getElementRect(value);\n }\n\n return value;\n },\n\n rectToXY: function (rect) {\n return rect && {\n x: 'x' in rect ? rect.x : rect.left,\n y: 'y' in rect ? rect.y : rect.top,\n };\n },\n\n xywhToTlbr: function (rect) {\n if (rect && !('left' in rect && 'top' in rect)) {\n rect = extend({}, rect);\n\n rect.left = rect.x || 0;\n rect.top = rect.y || 0;\n rect.right = rect.right || (rect.left + rect.width);\n rect.bottom = rect.bottom || (rect.top + rect.height);\n }\n\n return rect;\n },\n\n tlbrToXywh: function (rect) {\n if (rect && !('x' in rect && 'y' in rect)) {\n rect = extend({}, rect);\n\n rect.x = rect.left || 0;\n rect.top = rect.top || 0;\n rect.width = rect.width || (rect.right - rect.x);\n rect.height = rect.height || (rect.bottom - rect.y);\n }\n\n return rect;\n },\n};\n\nmodule.exports = rectUtils;\n","const win = module.exports;\nconst isWindow = require('./isWindow');\n\nfunction init (window) {\n // get wrapped window if using Shadow DOM polyfill\n\n win.realWindow = window;\n\n // create a TextNode\n const el = window.document.createTextNode('');\n\n // check if it's wrapped by a polyfill\n if (el.ownerDocument !== window.document\n && typeof window.wrap === 'function'\n && window.wrap(el) === el) {\n // use wrapped window\n window = window.wrap(window);\n }\n\n win.window = window;\n}\n\nif (typeof window === 'undefined') {\n win.window = undefined;\n win.realWindow = undefined;\n}\nelse {\n init(window);\n}\n\nwin.getWindow = function getWindow (node) {\n if (isWindow(node)) {\n return node;\n }\n\n const rootNode = (node.ownerDocument || node);\n\n return rootNode.defaultView || rootNode.parentWindow || win.window;\n};\n\nwin.init = init;\n"]} \ No newline at end of file diff --git a/dist/interact.min.js b/dist/interact.min.js index c0bb2476c..2d1f0fb62 100644 --- a/dist/interact.min.js +++ b/dist/interact.min.js @@ -1,6 +1,6 @@ -/* interact.js v1.3.0-alpha.3+sha.9595c40 | https://raw.github.com/taye/interact.js/master/LICENSE */ -!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var t;t="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,t.interact=e()}}(function(){return function e(t,n,r){function i(s,a){if(!n[s]){if(!t[s]){var l="function"==typeof require&&require;if(!a&&l)return l(s,!0);if(o)return o(s,!0);var c=new Error("Cannot find module '"+s+"'");throw c.code="MODULE_NOT_FOUND",c}var p=n[s]={exports:{}};t[s][0].call(p.exports,function(e){var n=t[s][1][e];return i(n||e)},p,p.exports,e,t,n,r)}return n[s].exports}for(var o="function"==typeof require&&require,s=0;s6&&void 0!==arguments[6]&&arguments[6];r(this,e);var f=t.target,v=(f&&f.options||s).deltaSource,g=o(f,p,l),h="start"===c,m="end"===c,y=h?t.startCoords:t.curCoords,x=t.prevEvent;p=p||t.element;var b=i({},y.page),w=i({},y.client);b.x-=g.x,b.y-=g.y,w.x-=g.x,w.y-=g.y,this.ctrlKey=n.ctrlKey,this.altKey=n.altKey,this.shiftKey=n.shiftKey,this.metaKey=n.metaKey,this.button=n.button,this.buttons=n.buttons,this.target=p,this.currentTarget=p,this.relatedTarget=u||null,this.preEnd=d,this.type=l+(c||""),this.interaction=t,this.interactable=f,this.t0=h?t.downTimes[t.downTimes.length-1]:x.t0;var E={interaction:t,event:n,action:l,phase:c,element:p,related:u,page:b,client:w,coords:y,starting:h,ending:m,deltaSource:v,iEvent:this};a.fire("set-xy",E),m?(this.pageX=x.pageX,this.pageY=x.pageY,this.clientX=x.clientX,this.clientY=x.clientY):(this.pageX=b.x,this.pageY=b.y,this.clientX=w.x,this.clientY=w.y),this.x0=t.startCoords.page.x-g.x,this.y0=t.startCoords.page.y-g.y,this.clientX0=t.startCoords.client.x-g.x,this.clientY0=t.startCoords.client.y-g.y,a.fire("set-delta",E),this.timeStamp=y.timeStamp,this.dt=t.pointerDelta.timeStamp,this.duration=this.timeStamp-this.t0,this.speed=t.pointerDelta[v].speed,this.velocityX=t.pointerDelta[v].vx,this.velocityY=t.pointerDelta[v].vy,this.swipe=m||"inertiastart"===c?this.getSwipe():null,a.fire("new",E)}return e.prototype.getSwipe=function(){var e=this.interaction;if(e.prevEvent.speed<600||this.timeStamp-e.prevEvent.timeStamp>150)return null;var t=180*Math.atan2(e.prevEvent.velocityY,e.prevEvent.velocityX)/Math.PI;t<0&&(t+=360);var n=112.5<=t&&t<247.5,r=202.5<=t&&t<337.5,i=!n&&(292.5<=t||t<67.5);return{up:r,down:!r&&22.5<=t&&t<157.5,left:n,right:i,angle:t,speed:e.prevEvent.speed,velocity:{x:e.prevEvent.velocityX,y:e.prevEvent.velocityY}}},e.prototype.preventDefault=function(){},e.prototype.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},e.prototype.stopPropagation=function(){this.propagationStopped=!0},e}();a.on("set-delta",function(e){var t=e.iEvent,n=e.interaction,r=e.starting,i=e.deltaSource,o=r?t:n.prevEvent;"client"===i?(t.dx=t.clientX-o.clientX,t.dy=t.clientY-o.clientY):(t.dx=t.pageX-o.pageX,t.dy=t.pageY-o.pageY)}),l.signals=a,t.exports=l},{"./defaultOptions":18,"./utils/Signals":35,"./utils/extend":41,"./utils/getOriginXY":42}],4:[function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=e("./utils/is"),o=e("./utils/events"),s=e("./utils/extend"),a=e("./actions/base"),l=e("./scope"),c=e("./Eventable"),p=e("./defaultOptions"),u=e("./utils/Signals").new(),d=e("./utils/domUtils"),f=d.getElementRect,v=d.nodeContains,g=d.trySelector,h=e("./utils/window"),m=h.getWindow,y=e("./utils/arr"),x=y.indexOf,b=y.contains,w=e("./utils/browser"),E=w.wheelEvent;l.interactables=[];var S=function(){function e(t,n){r(this,e),n=n||{},this.target=t,this.events=new c,this._context=n.context||l.document,this._win=m(g(t)?this._context:t),this._doc=this._win.document,u.fire("new",{target:t,options:n,interactable:this,win:this._win}),l.addDocument(this._doc,this._win),l.interactables.push(this),this.set(n)}return e.prototype.setOnEvents=function(e,t){var n="on"+e;return i.function(t.onstart)&&(this.events[n+"start"]=t.onstart),i.function(t.onmove)&&(this.events[n+"move"]=t.onmove),i.function(t.onend)&&(this.events[n+"end"]=t.onend),i.function(t.oninertiastart)&&(this.events[n+"inertiastart"]=t.oninertiastart),this},e.prototype.setPerAction=function(e,t){for(var n in t)n in p[e]&&(i.object(t[n])?(this.options[e][n]=s(this.options[e][n]||{},t[n]),i.object(p.perAction[n])&&"enabled"in p.perAction[n]&&(this.options[e][n].enabled=!1!==t[n].enabled)):i.bool(t[n])&&i.object(p.perAction[n])?this.options[e][n].enabled=t[n]:void 0!==t[n]&&(this.options[e][n]=t[n]))},e.prototype.getRect=function(e){return e=e||this.target,i.string(this.target)&&!i.element(e)&&(e=this._context.querySelector(this.target)),f(e)},e.prototype.rectChecker=function(e){return i.function(e)?(this.getRect=e,this):null===e?(delete this.options.getRect,this):this.getRect},e.prototype._backCompatOption=function(e,t){if(g(t)||i.object(t)){this.options[e]=t;for(var n=a.names,r=Array.isArray(n),o=0,n=r?n:n[Symbol.iterator]();;){var s;if(r){if(o>=n.length)break;s=n[o++]}else{if(o=n.next(),o.done)break;s=o.value}var l=s;this.options[l][e]=t}return this}return this.options[e]},e.prototype.origin=function(e){return this._backCompatOption("origin",e)},e.prototype.deltaSource=function(e){return"page"===e||"client"===e?(this.options.deltaSource=e,this):this.options.deltaSource},e.prototype.context=function(){return this._context},e.prototype.inContext=function(e){return this._context===e.ownerDocument||v(this._context,e)},e.prototype.fire=function(e){return this.events.fire(e),this},e.prototype._onOffMultiple=function(e,t,n,r){if(i.string(t)&&-1!==t.search(" ")&&(t=t.trim().split(/ +/)),i.array(t)){for(var o=0;o=l.length)break;f=l[d++]}else{if(d=l.next(),d.done)break;f=d.value}var v=f;this.options[v]=p.base[v],v in t&&this[v](t[v])}return u.fire("set",{options:t,interactable:this}),this},e.prototype.unset=function(){if(o.remove(this.target,"all"),i.string(this.target))for(var e in o.delegatedEvents){var t=o.delegatedEvents[e];t.selectors[0]===this.target&&t.contexts[0]===this._context&&(t.selectors.splice(0,1),t.contexts.splice(0,1),t.listeners.splice(0,1),t.selectors.length||(t[e]=null)),o.remove(this._context,e,o.delegateListener),o.remove(this._context,e,o.delegateUseCapture,!0)}else o.remove(this,"all");u.fire("unset",{interactable:this}),l.interactables.splice(x(l.interactables,this),1);for(var n=l.interactions||[],r=Array.isArray(n),s=0,n=r?n:n[Symbol.iterator]();;){var a;if(r){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var c=a;c.target===this&&c.interacting()&&c.stop()}return l.interact},e}();l.interactables.indexOfElement=function(e,t){t=t||l.document;for(var n=0;n=y.length)break;w=y[b++]}else{if(b=y.next(),b.done)break;w=b.value}var E=w,S=E[0],T=E[1];T._updateEventTargets(r,i),T[e](S,t,r,i)}}}function o(e){for(var t=0;te.pointerMoveTolerance);var a={pointer:t,pointerIndex:this.getPointerIndex(t),event:n,eventTarget:r,dx:o,dy:s,duplicate:i,interaction:this,interactingBeforeMove:this.interacting()};i||l.setCoordDeltas(this.pointerDelta,this.prevCoords,this.curCoords),d.fire("move",a),i||(this.interacting()&&this.doMove(a),this.pointerWasMoved&&l.copyCoords(this.prevCoords,this.curCoords))},e.prototype.doMove=function(e){e=l.extend({pointer:this.pointers[0],event:this.prevEvent,eventTarget:this._eventTarget,interaction:this},e||{}),d.fire("before-action-move",e),this._dontFireMove||d.fire("action-move",e),this._dontFireMove=!1},e.prototype.pointerUp=function(e,t,n,r){var i=this.getPointerIndex(e);d.fire(/cancel$/i.test(t.type)?"cancel":"up",{pointer:e,pointerIndex:i,event:t,eventTarget:n,curEventTarget:r,interaction:this}),this.simulation||this.end(t),this.pointerIsDown=!1,this.removePointer(e,t)},e.prototype.end=function(e){e=e||this.prevEvent,this.interacting()&&d.fire("action-end",{event:e,interaction:this}),this.stop()},e.prototype.currentAction=function(){return this._interacting?this.prepared.name:null},e.prototype.interacting=function(){return this._interacting},e.prototype.stop=function(){d.fire("stop",{interaction:this}),this._interacting&&(d.fire("stop-active",{interaction:this}),d.fire("stop-"+this.prepared.name,{interaction:this})),this.target=this.element=null,this._interacting=!1,this.prepared.name=this.prevEvent=null},e.prototype.getPointerIndex=function(e){return l.indexOf(this.pointerIds,l.getPointerId(e))},e.prototype.updatePointer=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:t&&/(down|start)$/i.test(t.type),r=l.getPointerId(e),i=this.getPointerIndex(e);return-1===i&&(i=this.pointerIds.length,this.pointerIds[i]=r),n&&d.fire("update-pointer-down",{pointer:e,event:t,down:n,pointerId:r,pointerIndex:i,interaction:this}),this.pointers[i]=e,i},e.prototype.removePointer=function(e,t){var n=l.getPointerId(e),r=this.mouse?0:l.indexOf(this.pointerIds,n);-1!==r&&(d.fire("remove-pointer",{pointer:e,event:t,pointerIndex:r,interaction:this}),this.pointers.splice(r,1),this.pointerIds.splice(r,1),this.downTargets.splice(r,1),this.downTimes.splice(r,1))},e.prototype._updateEventTargets=function(e,t){this._eventTarget=e,this._curEventTarget=t},e}(),m=0,y=v.length;m=i.length)break;a=i[s++]}else{if(s=i.next(),s.done)break;a=s.value}var l=a;if(l.options.drop.enabled){var c=l.options.drop.accept;if(!(p.is.element(c)&&c!==t||p.is.string(c)&&!p.matchesSelector(t,c)))for(var d=p.is.string(l.target)?l._context.querySelectorAll(l.target):[l.target],f=0;fo.left&&c.xo.top&&c.y=o.left&&v<=o.right&&g>=o.top&&g<=o.bottom}if(f&&p.is.number(a)){s=Math.max(0,Math.min(o.right,f.right)-Math.max(o.left,f.left))*Math.max(0,Math.min(o.bottom,f.bottom)-Math.max(o.top,f.top))/(f.width*f.height)>=a}return this.options.drop.checker&&(s=this.options.drop.checker(e,t,s,this,i,n,r)),s},v.signals.on("unset",function(e){e.interactable.dropzone(!1)}),v.settingsMethods.push("dropChecker"),g.signals.on("new",function(e){e.dropTarget=null,e.dropElement=null,e.prevDropTarget=null,e.prevDropElement=null,e.dropEvents=null,e.activeDrops={dropzones:[],elements:[],rects:[]}}),g.signals.on("stop",function(e){var t=e.interaction;t.dropTarget=t.dropElement=t.prevDropTarget=t.prevDropElement=null}),d.dynamicDrop=function(e){return p.is.bool(e)?(y=e,d):y},p.merge(v.eventTypes,["dragenter","dragleave","dropactivate","dropdeactivate","dropmove","drop"]),c.methodDict.drop="dropzone",h.drop=m.defaults,t.exports=m},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../interact":21,"../scope":34,"../utils":44,"./base":6}],9:[function(e,t,n){"use strict";var r=e("./base"),i=e("../utils"),o=e("../InteractEvent"),s=e("../Interactable"),a=e("../Interaction"),l=e("../defaultOptions"),c={defaults:{enabled:!1,origin:null,restrict:null},checker:function(e,t,n,r,i){return i.pointerIds.length>=2?{name:"gesture"}:null},getCursor:function(){return""}};o.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;"gesturestart"===t.type&&(t.ds=0,n.gesture.startDistance=n.gesture.prevDistance=t.distance,n.gesture.startAngle=n.gesture.prevAngle=t.angle,n.gesture.scale=1)}),o.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;"gesturemove"===t.type&&(t.ds=t.scale-n.gesture.scale,n.target.fire(t),n.gesture.prevAngle=t.angle,n.gesture.prevDistance=t.distance,t.scale===1/0||null===t.scale||void 0===t.scale||isNaN(t.scale)||(n.gesture.scale=t.scale))}),s.prototype.gesturable=function(e){return i.is.object(e)?(this.options.gesture.enabled=!1!==e.enabled,this.setPerAction("gesture",e),this.setOnEvents("gesture",e),this):i.is.bool(e)?(this.options.gesture.enabled=e,e||(this.ongesturestart=this.ongesturestart=this.ongestureend=null),this):this.options.gesture},o.signals.on("set-delta",function(e){var t=e.interaction,n=e.iEvent,r=e.action,s=e.event,a=e.starting,l=e.ending,c=e.deltaSource;if("gesture"===r){var p=t.pointers;n.touches=[p[0],p[1]],a?(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=1,n.ds=0,n.angle=i.touchAngle(p,void 0,c),n.da=0):l||s instanceof o?(n.distance=t.prevEvent.distance,n.box=t.prevEvent.box,n.scale=t.prevEvent.scale,n.ds=n.scale-1,n.angle=t.prevEvent.angle,n.da=n.angle-t.gesture.startAngle):(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=n.distance/t.gesture.startDistance,n.angle=i.touchAngle(p,t.gesture.prevAngle,c),n.ds=n.scale-t.gesture.prevScale,n.da=n.angle-t.gesture.prevAngle)}}),a.signals.on("new",function(e){e.gesture={start:{x:0,y:0},startDistance:0,prevDistance:0,distance:0,scale:1,startAngle:0,prevAngle:0}}),r.gesture=c,r.names.push("gesture"),i.merge(s.eventTypes,["gesturestart","gesturemove","gestureend"]),r.methodDict.gesture="gesturable",l.gesture=c.defaults,t.exports=c},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"./base":6}],10:[function(e,t,n){"use strict";function r(e,t,n,r,i,s,a){if(!t)return!1;if(!0===t){var l=o.is.number(s.width)?s.width:s.right-s.left,c=o.is.number(s.height)?s.height:s.bottom-s.top;if(l<0&&("left"===e?e="right":"right"===e&&(e="left")),c<0&&("top"===e?e="bottom":"bottom"===e&&(e="top")),"left"===e)return n.x<(l>=0?s.left:s.right)+a;if("top"===e)return n.y<(c>=0?s.top:s.bottom)+a;if("right"===e)return n.x>(l>=0?s.right:s.left)-a;if("bottom"===e)return n.y>(c>=0?s.bottom:s.top)-a}return!!o.is.element(r)&&(o.is.element(t)?t===r:o.matchesUpTo(r,t,i))}var i=e("./base"),o=e("../utils"),s=e("../utils/browser"),a=e("../InteractEvent"),l=e("../Interactable"),c=e("../Interaction"),p=e("../defaultOptions"),u=s.supportsTouch||s.supportsPointerEvent?20:10,d={defaults:{enabled:!1,mouseButtons:null,origin:null,snap:null,restrict:null,inertia:null,autoScroll:null,square:!1,preserveAspectRatio:!1,axis:"xy",margin:NaN,edges:null,invert:"none"},checker:function(e,t,n,i,s,a){if(!a)return null;var l=o.extend({},s.curCoords.page),c=n.options;if(c.resize.enabled){var p=c.resize,d={left:!1,right:!1,top:!1,bottom:!1};if(o.is.object(p.edges)){for(var f in d)d[f]=r(f,p.edges[f],l,s._eventTarget,i,a,p.margin||u);if(d.left=d.left&&!d.right,d.top=d.top&&!d.bottom,d.left||d.right||d.top||d.bottom)return{name:"resize",edges:d}}else{var v="y"!==c.resize.axis&&l.x>a.right-u,g="x"!==c.resize.axis&&l.y>a.bottom-u;if(v||g)return{name:"resize",axes:(v?"x":"")+(g?"y":"")}}}return null},cursors:s.isIe9OrOlder?{x:"e-resize",y:"s-resize",xy:"se-resize",top:"n-resize",left:"w-resize",bottom:"s-resize",right:"e-resize",topleft:"se-resize",bottomright:"se-resize",topright:"ne-resize",bottomleft:"ne-resize"}:{x:"ew-resize",y:"ns-resize",xy:"nwse-resize",top:"ns-resize",left:"ew-resize",bottom:"ns-resize",right:"ew-resize",topleft:"nwse-resize",bottomright:"nwse-resize",topright:"nesw-resize",bottomleft:"nesw-resize"},getCursor:function(e){if(e.axis)return d.cursors[e.name+e.axis];if(e.edges){for(var t="",n=["top","bottom","left","right"],r=0;r<4;r++)e.edges[n[r]]&&(t+=n[r]);return d.cursors[t]}}};a.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;if("resizestart"===t.type&&n.prepared.edges){var r=n.target.getRect(n.element),i=n.target.options.resize;if(i.square||i.preserveAspectRatio){var s=o.extend({},n.prepared.edges);s.top=s.top||s.left&&!s.bottom,s.left=s.left||s.top&&!s.right,s.bottom=s.bottom||s.right&&!s.top,s.right=s.right||s.bottom&&!s.left,n.prepared._linkedEdges=s}else n.prepared._linkedEdges=null;i.preserveAspectRatio&&(n.resizeStartAspectRatio=r.width/r.height),n.resizeRects={start:r,current:o.extend({},r),inverted:o.extend({},r),previous:o.extend({},r),delta:{left:0,right:0,width:0,top:0,bottom:0,height:0}},t.rect=n.resizeRects.inverted,t.deltaRect=n.resizeRects.delta}}),a.signals.on("new",function(e){var t=e.iEvent,n=e.phase,r=e.interaction;if("move"===n&&r.prepared.edges){var i=r.target.options.resize,s=i.invert,a="reposition"===s||"negate"===s,l=r.prepared.edges,c=r.resizeRects.start,p=r.resizeRects.current,u=r.resizeRects.inverted,d=r.resizeRects.delta,f=o.extend(r.resizeRects.previous,u),v=l,g=t.dx,h=t.dy;if(i.preserveAspectRatio||i.square){var m=i.preserveAspectRatio?r.resizeStartAspectRatio:1;l=r.prepared._linkedEdges,v.left&&v.bottom||v.right&&v.top?h=-g/m:v.left||v.right?h=g/m:(v.top||v.bottom)&&(g=h*m)}if(l.top&&(p.top+=h),l.bottom&&(p.bottom+=h),l.left&&(p.left+=g),l.right&&(p.right+=g),a){if(o.extend(u,p),"reposition"===s){var y=void 0;u.top>u.bottom&&(y=u.top,u.top=u.bottom,u.bottom=y),u.left>u.right&&(y=u.left,u.left=u.right,u.right=y)}}else u.top=Math.min(p.top,c.bottom),u.bottom=Math.max(p.bottom,c.top),u.left=Math.min(p.left,c.right),u.right=Math.max(p.right,c.left);u.width=u.right-u.left,u.height=u.bottom-u.top;for(var x in u)d[x]=u[x]-f[x];t.edges=r.prepared.edges,t.rect=u,t.deltaRect=d}}),l.prototype.resizable=function(e){return o.is.object(e)?(this.options.resize.enabled=!1!==e.enabled,this.setPerAction("resize",e),this.setOnEvents("resize",e),/^x$|^y$|^xy$/.test(e.axis)?this.options.resize.axis=e.axis:null===e.axis&&(this.options.resize.axis=p.resize.axis),o.is.bool(e.preserveAspectRatio)?this.options.resize.preserveAspectRatio=e.preserveAspectRatio:o.is.bool(e.square)&&(this.options.resize.square=e.square),this):o.is.bool(e)?(this.options.resize.enabled=e,e||(this.onresizestart=this.onresizestart=this.onresizeend=null),this):this.options.resize},c.signals.on("new",function(e){ -e.resizeAxes="xy"}),a.signals.on("set-delta",function(e){var t=e.interaction,n=e.iEvent;"resize"===e.action&&t.resizeAxes&&(t.target.options.resize.square?("y"===t.resizeAxes?n.dx=n.dy:n.dy=n.dx,n.axes="xy"):(n.axes=t.resizeAxes,"x"===t.resizeAxes?n.dy=0:"y"===t.resizeAxes&&(n.dx=0)))}),i.resize=d,i.names.push("resize"),o.merge(l.eventTypes,["resizestart","resizemove","resizeinertiastart","resizeinertiaresume","resizeend"]),i.methodDict.resize="resizable",p.resize=d.defaults,t.exports=d},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"../utils/browser":37,"./base":6}],11:[function(e,t,n){"use strict";var r=e("./utils/raf"),i=e("./utils/window").getWindow,o=e("./utils/is"),s=e("./utils/domUtils"),a=e("./Interaction"),l=e("./defaultOptions"),c={defaults:{enabled:!1,container:null,margin:60,speed:300},interaction:null,i:null,x:0,y:0,isScrolling:!1,prevTime:0,start:function(e){c.isScrolling=!0,r.cancel(c.i),c.interaction=e,c.prevTime=(new Date).getTime(),c.i=r.request(c.scroll)},stop:function(){c.isScrolling=!1,r.cancel(c.i)},scroll:function(){var e=c.interaction.target.options[c.interaction.prepared.name].autoScroll,t=e.container||i(c.interaction.element),n=(new Date).getTime(),s=(n-c.prevTime)/1e3,a=e.speed*s;a>=1&&(o.window(t)?t.scrollBy(c.x*a,c.y*a):t&&(t.scrollLeft+=c.x*a,t.scrollTop+=c.y*a),c.prevTime=n),c.isScrolling&&(r.cancel(c.i),c.i=r.request(c.scroll))},check:function(e,t){var n=e.options;return n[t].autoScroll&&n[t].autoScroll.enabled},onInteractionMove:function(e){var t=e.interaction,n=e.pointer;if(t.interacting()&&c.check(t.target,t.prepared.name)){if(t.simulation)return void(c.x=c.y=0);var r=void 0,a=void 0,l=void 0,p=void 0,u=t.target.options[t.prepared.name].autoScroll,d=u.container||i(t.element);if(o.window(d))p=n.clientXd.innerWidth-c.margin,l=n.clientY>d.innerHeight-c.margin;else{var f=s.getElementClientRect(d);p=n.clientXf.right-c.margin,l=n.clientY>f.bottom-c.margin}c.x=a?1:p?-1:0,c.y=l?1:r?-1:0,c.isScrolling||(c.margin=u.margin,c.speed=u.speed,c.start(t))}}};a.signals.on("stop-active",function(){c.stop()}),a.signals.on("action-move",c.onInteractionMove),l.perAction.autoScroll=c.defaults,t.exports=c},{"./Interaction":5,"./defaultOptions":18,"./utils/domUtils":39,"./utils/is":46,"./utils/raf":50,"./utils/window":52}],12:[function(e,t,n){"use strict";var r=e("../Interactable"),i=e("../actions/base"),o=e("../utils/is"),s=e("../utils/domUtils");r.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},r.prototype.ignoreFrom=function(e){return this._backCompatOption("ignoreFrom",e)},r.prototype.allowFrom=function(e){return this._backCompatOption("allowFrom",e)},r.prototype.testIgnore=function(e,t,n){return!(!e||!o.element(n))&&(o.string(e)?s.matchesUpTo(n,e,t):!!o.element(e)&&s.nodeContains(e,n))},r.prototype.testAllow=function(e,t,n){return!e||!!o.element(n)&&(o.string(e)?s.matchesUpTo(n,e,t):!!o.element(e)&&s.nodeContains(e,n))},r.prototype.testIgnoreAllow=function(e,t,n){return!this.testIgnore(e.ignoreFrom,t,n)&&this.testAllow(e.allowFrom,t,n)},r.prototype.actionChecker=function(e){return o.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},r.prototype.styleCursor=function(e){return o.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},r.prototype.defaultActionChecker=function(e,t,n,r){for(var o=this.getRect(r),s=null,a=i.names,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var u=p;if((!n.pointerIsDown||!n.mouse||0!=(t.buttons&this.options[u].mouseButtons))&&(s=i[u].checker(e,t,this,r,n,o)))return s}}},{"../Interactable":4,"../actions/base":6,"../utils/domUtils":39,"../utils/is":46}],13:[function(e,t,n){"use strict";function r(e,t,n,r){return g.is.object(e)&&t.testIgnoreAllow(t.options[e.name],n,r)&&t.options[e.name].enabled&&a(t,n,e)?e:null}function i(e,t,n,i,o,s){for(var a=0,l=i.length;a=m.maxInteractions)return!1;if(u.target===e){if((a+=d===n.name|0)>=i)return!1;if(u.element===t&&(l++,d!==n.name||l>=o))return!1}}}return m.maxInteractions>0}}var l=e("../interact"),c=e("../Interactable"),p=e("../Interaction"),u=e("../actions/base"),d=e("../defaultOptions"),f=e("../utils/browser"),v=e("../scope"),g=e("../utils"),h=e("../utils/Signals").new();e("./InteractableMethods");var m={signals:h,withinInteractionLimit:a,maxInteractions:1/0,defaults:{perAction:{manualStart:!1,max:1/0,maxPerElement:1,allowFrom:null,ignoreFrom:null}},setActionDefaults:function(e){g.extend(e.defaults,m.defaults.perAction)}};p.signals.on("down",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;if(!t.interacting()){s(t,o(t,n,r,i))}}),p.signals.on("move",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;if(t.mouse&&!t.pointerIsDown&&!t.interacting()){s(t,o(t,n,r,i))}}),p.signals.on("move",function(e){var t=e.interaction,n=e.event;if(t.pointerIsDown&&!t.interacting()&&t.pointerWasMoved&&t.prepared.name){h.fire("before-start",e);var r=t.target;t.prepared.name&&r&&(r.options[t.prepared.name].manualStart||!a(r,t.element,t.prepared)?t.stop(n):t.start(t.prepared,r,t.element))}}),p.signals.on("stop",function(e){var t=e.interaction,n=t.target;n&&n.options.styleCursor&&(n._doc.documentElement.style.cursor="")}),c.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},c.prototype.actionChecker=function(e){return g.is.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},c.prototype.styleCursor=function(e){return g.is.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},c.prototype.defaultActionChecker=function(e,t,n,r){for(var i=this.getRect(r),o=t.buttons||{0:1,1:4,3:8,4:16}[t.button],s=null,a=u.names,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var d=p;if((!n.pointerIsDown||!n.mouse||0!=(o&this.options[d].mouseButtons))&&(s=u[d].checker(e,t,this,r,n,i)))return s}},l.maxInteractions=function(e){return g.is.number(e)?(m.maxInteractions=e,this):m.maxInteractions},c.settingsMethods.push("styleCursor"),c.settingsMethods.push("actionChecker"),c.settingsMethods.push("ignoreFrom"),c.settingsMethods.push("allowFrom"),d.base.actionChecker=null,d.base.styleCursor=!0,g.extend(d.perAction,m.defaults.perAction),t.exports=m},{"../Interactable":4,"../Interaction":5,"../actions/base":6,"../defaultOptions":18,"../interact":21,"../scope":34,"../utils":44,"../utils/Signals":35,"../utils/browser":37,"./InteractableMethods":12}],14:[function(e,t,n){"use strict";var r=e("./base"),i=e("../Interaction");i.signals.on("new",function(e){e.delayTimer=null}),r.signals.on("prepared",function(e){var t=e.interaction,n=t.prepared.name;if(n){var r=t.target.options[n].delay;r>0&&(t.delayTimer=setTimeout(function(){t.start(t.prepared,t.target,t.element)},r))}}),i.signals.on("move",function(e){var t=e.interaction,n=e.duplicate;t.pointerWasMoved&&!n&&clearTimeout(t.delayTimer)}),r.signals.on("before-start",function(e){var t=e.interaction,n=t.prepared.name;if(n){t.target.options[n].delay>0&&(t.prepared.name=null)}})},{"../Interaction":5,"./base":13}],15:[function(e,t,n){"use strict";function r(e,t){if(!t)return!1;var n=t.options.drag.startAxis;return"xy"===e||"xy"===n||n===e}var i=e("./base"),o=e("../scope"),s=e("../utils/browser"),a=e("../utils/is"),l=e("../utils/domUtils"),c=l.matchesSelector,p=l.parentNode;i.setActionDefaults(e("../actions/drag")),i.signals.on("before-start",function(e){var t=e.interaction,n=e.eventTarget,l=e.dx,u=e.dy;if("drag"===t.prepared.name){var d=Math.abs(l),f=Math.abs(u),v=t.target.options.drag,g=v.startAxis,h=d>f?"x":dl.minSpeed&&g>l.endSpeed,b={interaction:t,pageCoords:v,statuses:f,preEnd:!0,requireEndOnly:!0};y&&!x&&(c.resetStatuses(f),m=c.setAll(b),m.shouldMove&&m.locked&&(h=!0)),(x||h)&&(p.copyCoords(i.upCoords,t.curCoords),t.pointers[0]=i.startEvent=new a(t,n,t.prepared.name,"inertiastart",t.element),i.t0=d,i.active=!0,i.allowResume=l.allowResume,t.simulation=i,o.fire(i.startEvent),x?(i.vx0=t.pointerDelta.client.vx,i.vy0=t.pointerDelta.client.vy,i.v0=g,r(t,i),p.extend(v,t.curCoords.page),v.x+=i.xe,v.y+=i.ye,c.resetStatuses(f),m=c.setAll(b),i.modifiedXe+=m.dx,i.modifiedYe+=m.dy,i.i=u.request(t.boundInertiaFrame)):(i.smoothEnd=!0,i.xe=m.dx,i.ye=m.dy,i.sx=i.sy=0,i.i=u.request(t.boundSmoothEndFrame)))}}),l.signals.on("stop-active",function(e){var t=e.interaction,n=t.inertiaStatus;n.active&&(u.cancel(n.i),n.active=!1,t.simulation=null)})},{"./InteractEvent":3,"./Interaction":5,"./modifiers":24,"./utils":44,"./utils/raf":50}],21:[function(e,t,n){"use strict";function r(e,t){var n=a.interactables.get(e,t);return n||(n=new l(e,t),n.events.global=p),n}var i=e("./utils/browser"),o=e("./utils/events"),s=e("./utils"),a=e("./scope"),l=e("./Interactable"),c=e("./Interaction"),p={};r.isSet=function(e,t){return-1!==a.interactables.indexOfElement(e,t&&t.context)},r.on=function(e,t,n){if(s.is.string(e)&&-1!==e.search(" ")&&(e=e.trim().split(/ +/)),s.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.on(f,t,n)}return r}if(s.is.object(e)){for(var v in e)r.on(v,e[v],t);return r}return s.contains(l.eventTypes,e)?p[e]?p[e].push(t):p[e]=[t]:o.add(a.document,e,t,{options:n}),r},r.off=function(e,t,n){if(s.is.string(e)&&-1!==e.search(" ")&&(e=e.trim().split(/ +/)),s.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.off(f,t,n)}return r}if(s.is.object(e)){for(var v in e)r.off(v,e[v],t);return r}if(s.contains(l.eventTypes,e)){var g=void 0;e in p&&-1!==(g=s.indexOf(p[e],t))&&p[e].splice(g,1)}else o.remove(a.document,e,t,n);return r},r.debug=function(){return a},r.getPointerAverage=s.pointerAverage,r.getTouchBBox=s.touchBBox,r.getTouchDistance=s.touchDistance,r.getTouchAngle=s.touchAngle,r.getElementRect=s.getElementRect,r.getElementClientRect=s.getElementClientRect,r.matchesSelector=s.matchesSelector,r.closest=s.closest,r.supportsTouch=function(){return i.supportsTouch},r.supportsPointerEvent=function(){return i.supportsPointerEvent},r.stop=function(e){for(var t=a.interactions.length-1;t>=0;t--)a.interactions[t].stop(e);return r},r.pointerMoveTolerance=function(e){return s.is.number(e)?(c.pointerMoveTolerance=e,this):c.pointerMoveTolerance},r.addDocument=a.addDocument,r.removeDocument=a.removeDocument,a.interact=r,t.exports=r},{"./Interactable":4,"./Interaction":5,"./scope":34,"./utils":44,"./utils/browser":37,"./utils/events":40}],22:[function(e,t,n){"use strict";function r(e){var t=e.interaction,n=e.event;t.target&&t.target.checkAndPreventDefault(n)}var i=e("./Interactable"),o=e("./Interaction"),s=e("./scope"),a=e("./utils/is"),l=e("./utils/events"),c=e("./utils/domUtils"),p=c.nodeContains,u=c.matchesSelector;i.prototype.preventDefault=function(e){return/^(always|never|auto)$/.test(e)?(this.options.preventDefault=e,this):a.bool(e)?(this.options.preventDefault=e?"always":"never",this):this.options.preventDefault},i.prototype.checkAndPreventDefault=function(e){var t=this.options.preventDefault;if("never"!==t)return"always"===t?void e.preventDefault():void(l.supportsOptions||/^(mouse|pointer|touch)*(down|start)/i.test(e.type)||a.element(e.target)&&u(e.target,"input,select,textarea,[contenteditable=true],[contenteditable=true] *")||e.preventDefault())};for(var d=["down","move","up","cancel"],f=0;f=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i;if(o.element&&(o.element===e.target||p(o.element,e.target)))return void o.target.checkAndPreventDefault(e)}}},{"./Interactable":4,"./Interaction":5,"./scope":34,"./utils/domUtils":39,"./utils/events":40,"./utils/is":46}],23:[function(e,t,n){"use strict";function r(e){var t=e.target,n=a.search(e,e.type,t);n&&n.prevTap&&e.clientX===n.prevTap.clientX&&e.clientY===n.prevTap.clientY&&t===n.prevTap.target&&(n.downTargets[0]=t,n.downTimes[0]=(new Date).getTime(),l.fire({interaction:n,event:e,eventTarget:t,pointer:e,type:"tap"}))}var i=e("./scope"),o=e("./utils/events"),s=e("./utils/browser"),a=e("./utils/interactionFinder"),l=e("./pointerEvents/base"),c=e("./utils/window"),p=c.window,u=Object.prototype.toString;if(p.Array.isArray||(p.Array.isArray=function(e){return"[object Array]"===u.call(e)}),String.prototype.trim||(String.prototype.trim=function(){return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")}),s.isIE8){var d=function(e){for(var t=i.interactions,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var o;if(n){if(r>=t.length)break;o=t[r++]}else{if(r=t.next(),r.done)break;o=r.value}var s=o;s.interacting()&&s.target.checkAndPreventDefault(e)}},f=function(e,t){var n=e.doc,i=(e.win,0===t.indexOf("listen")?o.add:o.remove);i(n,"selectstart",d),l&&i(n,"dblclick",r)};i.signals.on("add-document",f),i.signals.on("remove-document",f)}t.exports=null},{"./pointerEvents/base":31,"./scope":34,"./utils/browser":37,"./utils/events":40,"./utils/interactionFinder":45,"./utils/window":52}],24:[function(e,t,n){"use strict";function r(e,t,n){return e&&e.enabled&&(t||!e.endOnly)&&(!n||e.endOnly)}var i=e("../InteractEvent"),o=e("../Interaction"),s=e("../utils/extend"),a={names:[],setOffsets:function(e){var t=e.interaction,n=e.pageCoords,r=t.target,i=t.element,o=t.startOffset,s=r.getRect(i);s?(o.left=n.x-s.left,o.top=n.y-s.top,o.right=s.right-n.x,o.bottom=s.bottom-n.y,"width"in s||(s.width=s.right-s.left),"height"in s||(s.height=s.bottom-s.top)):o.left=o.top=o.right=o.bottom=0,e.rect=s,e.interactable=r,e.element=i;for(var l=0;l=p.length)break;f=p[d++]}else{if(d=p.next(),d.done)break;f=d.value}var v=f,g=a[v],h=t.target.options[t.prepared.name][v];r(h,i,o)&&(e.status=e.status=n[v],e.options=h,e.offset=e.interaction.modifierOffsets[v],g.set(e),e.status.locked&&(l.x+=e.status.dx,l.y+=e.status.dy,c.dx+=e.status.dx,c.dy+=e.status.dy,c.locked=!0))}return c.shouldMove=!e.status||!c.locked||e.status.changed,c},resetStatuses:function(e){for(var t=a.names,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var i;if(n){if(r>=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i,s=e[o]||{};s.dx=s.dy=0,s.modifiedX=s.modifiedY=NaN,s.locked=!1,s.changed=!0,e[o]=s}return e},start:function(e,t){var n=e.interaction,r={interaction:n,pageCoords:("action-resume"===t?n.curCoords:n.startCoords).page,startOffset:n.startOffset,statuses:n.modifierStatuses,preEnd:!1,requireEndOnly:!1};a.setOffsets(r),a.resetStatuses(r.statuses),r.pageCoords=s({},n.startCoords.page),n.modifierResult=a.setAll(r)}};o.signals.on("new",function(e){e.startOffset={left:0,right:0,top:0,bottom:0},e.modifierOffsets={},e.modifierStatuses=a.resetStatuses({}),e.modifierResult=null}),o.signals.on("action-start",a.start),o.signals.on("action-resume",a.start),o.signals.on("before-action-move",function(e){var t=e.interaction,n=e.preEnd,r=e.interactingBeforeMove,i=a.setAll({interaction:t,preEnd:n,pageCoords:t.curCoords.page,statuses:t.modifierStatuses,requireEndOnly:!1});!i.shouldMove&&r&&(t._dontFireMove=!0),t.modifierResult=i}),o.signals.on("action-end",function(e){for(var t=e.interaction,n=e.event,i=0;i=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}var m=h,y=m.x,x=m.y;l.push({x:s.left-i.width*y+u.x,y:s.top-i.height*x+u.y})}else l.push(u);return l},set:function(e){var t=e.interaction,n=e.pageCoords,r=e.status,i=e.options,s=e.offset,a=[],l=void 0,c=void 0,p=void 0;if(r.useStatusXY)c={x:r.x,y:r.y};else{var u=o.getOriginXY(t.target,t.element,t.prepared.name);c=o.extend({},n),c.x-=u.x,c.y-=u.y}r.realX=c.x,r.realY=c.y;for(var d=i.targets?i.targets.length:0,f=s,v=Array.isArray(f),g=0,f=v?f:f[Symbol.iterator]();;){var h;if(v){if(g>=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}for(var m=h,y=m.x,x=m.y,b=c.x-y,w=c.y-x,E=i.targets,S=Array.isArray(E),T=0,E=S?E:E[Symbol.iterator]();;){var C;if(S){if(T>=E.length)break;C=E[T++]}else{if(T=E.next(),T.done)break;C=T.value}var A=C;l=o.is.function(A)?A(b,w,t):A,l&&a.push({x:o.is.number(l.x)?l.x+y:b,y:o.is.number(l.y)?l.y+x:w,range:o.is.number(l.range)?l.range:i.range})}}var D={target:null,inRange:!1,distance:0,range:0,dx:0,dy:0};for(p=0,d=a.length;p=p.length)break;f=p[d++]}else{if(d=p.next(),d.done)break;f=d.value}var v=f,g=void 0;g=a.is.function(v)?v(l,c,t):v,g&&("width"in g&&"height"in g&&(g.x=g.width,g.y=g.height),e.options.targets.push(g))}i.set(e)},modifyCoords:function(e){var t=e.options;e.options=a.extend({},t), -e.options.enabled=t.enabled,e.options.relativePoints=[null],i.modifyCoords(e)}};r.snapSize=l,r.names.push("snapSize"),o.perAction.snapSize=l.defaults,s.defaults.snapSize=l.defaults,t.exports=l},{"../actions/resize":10,"../defaultOptions":18,"../utils/":44,"./index":24,"./snap":28}],30:[function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=e("../utils/pointerUtils");t.exports=function(){function e(t,n,o,s,a){if(r(this,e),i.pointerExtend(this,o),o!==n&&i.pointerExtend(this,n),this.interaction=a,this.timeStamp=(new Date).getTime(),this.originalEvent=o,this.type=t,this.pointerId=i.getPointerId(n),this.pointerType=i.getPointerType(n,a),this.target=s,this.currentTarget=null,"tap"===t){var l=a.getPointerIndex(n);this.dt=this.timeStamp-a.downTimes[l];var c=this.timeStamp-a.tapTime;this.double=!!(a.prevTap&&"doubletap"!==a.prevTap.type&&a.prevTap.target===this.target&&c<500)}else"doubletap"===t&&(this.dt=n.timeStamp-a.tapTime)}return e.prototype.subtractOrigin=function(e){var t=e.x,n=e.y;return this.pageX-=t,this.pageY-=n,this.clientX-=t,this.clientY-=n,this},e.prototype.addOrigin=function(e){var t=e.x,n=e.y;return this.pageX+=t,this.pageY+=n,this.clientX+=t,this.clientY+=n,this},e.prototype.preventDefault=function(){this.originalEvent.preventDefault()},e.prototype.stopPropagation=function(){this.propagationStopped=!0},e.prototype.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},e}()},{"../utils/pointerUtils":49}],31:[function(e,t,n){"use strict";function r(e){for(var t=e.interaction,n=e.pointer,s=e.event,l=e.eventTarget,c=e.type,u=void 0===c?e.pointerEvent.type:c,d=e.targets,f=void 0===d?i(e):d,v=e.pointerEvent,g=void 0===v?new o(u,n,s,l,t):v,h={interaction:t,pointer:n,event:s,eventTarget:l,targets:f,type:u,pointerEvent:g},m=0;m=u.length)break;g=u[v++]}else{if(v=u.next(),v.done)break;g=v.value}var h=g;c.element=h,p.fire("collect-targets",c)}return"hold"===o&&(c.targets=d(c.targets,function(e){return e.eventable.options.holdDuration===t.holdTimers[s].duration})),c.targets}var o=e("./PointerEvent"),s=e("../Interaction"),a=e("../utils"),l=e("../utils/browser"),c=e("../defaultOptions"),p=e("../utils/Signals").new(),u=e("../utils/arr"),d=u.filter,f=["down","up","cancel"],v=["down","up","cancel"],g={PointerEvent:o,fire:r,collectEventTargets:i,signals:p,defaults:{holdDuration:600,ignoreFrom:null,allowFrom:null,origin:{x:0,y:0}},types:["down","move","up","cancel","tap","doubletap","hold"]};s.signals.on("update-pointer-down",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers[n]={duration:1/0,timeout:null}}),s.signals.on("remove-pointer",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers.splice(n,1)}),s.signals.on("move",function(e){var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,s=e.duplicateMove,a=t.getPointerIndex(n);s||t.pointerIsDown&&!t.pointerWasMoved||(t.pointerIsDown&&clearTimeout(t.holdTimers[a].timeout),r({interaction:t,pointer:n,event:i,eventTarget:o,type:"move"}))}),s.signals.on("down",function(e){for(var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,s=e.pointerIndex,c=l.isIE8?a.extend({},i):i,u=t.holdTimers[s],d=a.getPath(o),f={interaction:t,pointer:n,event:i,eventTarget:o,type:"hold",targets:[],path:d,element:null},v=d,g=Array.isArray(v),h=0,v=g?v:v[Symbol.iterator]();;){var m;if(g){if(h>=v.length)break;m=v[h++]}else{if(h=v.next(),h.done)break;m=h.value}var y=m;f.element=y,p.fire("collect-targets",f)}if(f.targets.length){for(var x=1/0,b=0;b=0&&(p.selectors[u]!==e||p.contexts[u]!==t);u--);-1===u&&(u=p.selectors.length,p.selectors.push(e),p.contexts.push(t),p.listeners.push([])),p.listeners[u].push([i,!!s.capture,s.passive])}function s(e,t,n,r,o){var s=f(o),c=O[n],p=!1,u=void 0;if(c)for(u=c.selectors.length-1;u>=0;u--)if(c.selectors[u]===e&&c.contexts[u]===t){for(var d=c.listeners[u],v=d.length-1;v>=0;v--){var g=d[v],h=g[0],m=g[1],y=g[2];if(h===r&&m===!!s.capture&&y===s.passive){d.splice(v,1),d.length||(c.selectors.splice(u,1),c.contexts.splice(u,1),c.listeners.splice(u,1),i(t,n,a),i(t,n,l,!0),c.selectors.length||(O[n]=null)),p=!0;break}}if(p)break}}function a(e,t){var n=f(t),r={},i=O[e.type],o=g.getActualElement(e.path?e.path[0]:e.target),s=o;for(h(r,e),r.originalEvent=e,r.preventDefault=p;v.element(s);){for(var a=0;a=l.length)break;u=l[p++]}else{if(p=l.next(),p.done)break;u=p.value}var d=u,f=s[d](a);if(f)return f}},simulationResume:function(e){var t=e.mouseEvent,n=e.eventType,o=e.eventTarget;if(!/down|start/i.test(n))return null;for(var s=r.interactions,a=Array.isArray(s),l=0,s=a?s:s[Symbol.iterator]();;){var c;if(a){if(l>=s.length)break;c=s[l++]}else{if(l=s.next(),l.done)break;c=l.value}var p=c,u=o;if(p.simulation&&p.simulation.allowResume&&p.mouse===t)for(;u;){if(u===p.element)return p;u=i.parentNode(u)}}return null},mouse:function(e){var t=e.pointerId,n=e.mouseEvent,s=e.eventType;if(!n&&(o.supportsTouch||o.supportsPointerEvent))return null;for(var a=void 0,l=r.interactions,c=Array.isArray(l),p=0,l=c?l:l[Symbol.iterator]();;){var u;if(c){if(p>=l.length)break;u=l[p++]}else{if(p=l.next(),p.done)break;u=p.value}var d=u;if(d.mouse){if(d.simulation&&!i.contains(d.pointerIds,t))continue;if(d.interacting())return d;a||(a=d)}}if(a)return a;for(var f=r.interactions,v=Array.isArray(f),g=0,f=v?f:f[Symbol.iterator]();;){var h;if(v){if(g>=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}var m=h;if(m.mouse&&(!/down/.test(s)||!m.simulation))return m}return null},hasPointer:function(e){for(var t=e.pointerId,n=r.interactions,o=Array.isArray(n),s=0,n=o?n:n[Symbol.iterator]();;){var a;if(o){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var l=a;if(i.contains(l.pointerIds,t))return l}},idle:function(e){for(var t=e.mouseEvent,n=r.interactions,i=Array.isArray(n),o=0,n=i?n:n[Symbol.iterator]();;){var s;if(i){if(o>=n.length)break;s=n[o++]}else{if(o=n.next(),o.done)break;s=o.value}var a=s;if(1===a.pointerIds.length){var l=a.target;if(l&&!l.options.gesture.enabled)continue}else if(a.pointerIds.length>=2)continue;if(!a.interacting()&&t===a.mouse)return a}return null}};t.exports=s},{"../scope":34,"./browser":37,"./index":44}],46:[function(e,t,n){"use strict";var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},i=e("./window"),o=e("./isWindow"),s={array:function(){},window:function(e){return e===i.window||o(e)},docFrag:function(e){return s.object(e)&&11===e.nodeType},object:function(e){return!!e&&"object"===(void 0===e?"undefined":r(e))},function:function(e){return"function"==typeof e},number:function(e){return"number"==typeof e},bool:function(e){return"boolean"==typeof e},string:function(e){return"string"==typeof e},element:function(e){if(!e||"object"!==(void 0===e?"undefined":r(e)))return!1;var t=i.getWindow(e)||i.window;return/object|function/.test(r(t.Element))?e instanceof t.Element:1===e.nodeType&&"string"==typeof e.nodeName}};s.array=function(e){return s.object(e)&&void 0!==e.length&&s.function(e.splice)},t.exports=s},{"./isWindow":47,"./window":52}],47:[function(e,t,n){"use strict";t.exports=function(e){return!(!e||!e.Window)&&e instanceof e.Window}},{}],48:[function(e,t,n){"use strict";function r(e,n){for(var r in n){var i=t.exports.prefixedPropREs,o=!1;for(var s in i)if(0===r.indexOf(s)&&i[s].test(r)){o=!0;break}o||"function"==typeof n[r]||(e[r]=n[r])}return e}r.prefixedPropREs={webkit:/(Movement[XY]|Radius[XY]|RotationAngle|Force)$/},t.exports=r},{}],49:[function(e,t,n){"use strict";var r=e("./hypot"),i=e("./browser"),o=e("./domObjects"),s=e("./domUtils"),a=e("./is"),l=e("./pointerExtend"),c={copyCoords:function(e,t){e.page=e.page||{},e.page.x=t.page.x,e.page.y=t.page.y,e.client=e.client||{},e.client.x=t.client.x,e.client.y=t.client.y,e.timeStamp=t.timeStamp},setCoordDeltas:function(e,t,n){e.page.x=n.page.x-t.page.x,e.page.y=n.page.y-t.page.y,e.client.x=n.client.x-t.client.x,e.client.y=n.client.y-t.client.y,e.timeStamp=n.timeStamp-t.timeStamp;var i=Math.max(e.timeStamp/1e3,.001);e.page.speed=r(e.page.x,e.page.y)/i,e.page.vx=e.page.x/i,e.page.vy=e.page.y/i,e.client.speed=r(e.client.x,e.page.y)/i,e.client.vx=e.client.x/i,e.client.vy=e.client.y/i},isNativePointer:function(e){return e instanceof o.Event||e instanceof o.Touch},getXY:function(e,t,n){return n=n||{},e=e||"page",n.x=t[e+"X"],n.y=t[e+"Y"],n},getPageXY:function(e,t){return t=t||{},i.isOperaMobile&&c.isNativePointer(e)?(c.getXY("screen",e,t),t.x+=window.scrollX,t.y+=window.scrollY):c.getXY("page",e,t),t},getClientXY:function(e,t){return t=t||{},i.isOperaMobile&&c.isNativePointer(e)?c.getXY("screen",e,t):c.getXY("client",e,t),t},getPointerId:function(e){return a.number(e.pointerId)?e.pointerId:e.identifier},setCoords:function(e,t,n){var r=t.length>1?c.pointerAverage(t):t[0],i={};c.getPageXY(r,i),e.page.x=i.x,e.page.y=i.y,c.getClientXY(r,i),e.client.x=i.x,e.client.y=i.y,e.timeStamp=a.number(n)?n:(new Date).getTime()},pointerExtend:l,getTouchPair:function(e){var t=[];return a.array(e)?(t[0]=e[0],t[1]=e[1]):"touchend"===e.type?1===e.touches.length?(t[0]=e.touches[0],t[1]=e.changedTouches[0]):0===e.touches.length&&(t[0]=e.changedTouches[0],t[1]=e.changedTouches[1]):(t[0]=e.touches[0],t[1]=e.touches[1]),t},pointerAverage:function(e){for(var t={pageX:0,pageY:0,clientX:0,clientY:0,screenX:0,screenY:0},n=e,r=Array.isArray(n),i=0,n=r?n:n[Symbol.iterator]();;){var o;if(r){if(i>=n.length)break;o=n[i++]}else{if(i=n.next(),i.done)break;o=i.value}var s=o;for(var a in t)t[a]+=s[a]}for(var l in t)t[l]/=e.length;return t},touchBBox:function(e){if(e.length||e.touches&&e.touches.length>1){var t=c.getTouchPair(e),n=Math.min(t[0].pageX,t[1].pageX),r=Math.min(t[0].pageY,t[1].pageY);return{x:n,y:r,left:n,top:r,width:Math.max(t[0].pageX,t[1].pageX)-n,height:Math.max(t[0].pageY,t[1].pageY)-r}}},touchDistance:function(e,t){var n=t+"X",i=t+"Y",o=c.getTouchPair(e),s=o[0][n]-o[1][n],a=o[0][i]-o[1][i];return r(s,a)},touchAngle:function(e,t,n){var r=n+"X",i=n+"Y",o=c.getTouchPair(e),s=o[1][r]-o[0][r],a=o[1][i]-o[0][i];return 180*Math.atan2(a,s)/Math.PI},getPointerType:function(e,t){return t.mouse?"mouse":i.supportsPointerEvent?a.string(e.pointerType)?e.pointerType:[void 0,void 0,"touch","pen","mouse"][e.pointerType]:"touch"},getEventTargets:function(e){return[s.getActualElement(e.path?e.path[0]:e.target),s.getActualElement(e.currentTarget)]}};t.exports=c},{"./browser":37,"./domObjects":38,"./domUtils":39,"./hypot":43,"./is":46,"./pointerExtend":48}],50:[function(e,t,n){"use strict";for(var r=e("./window"),i=r.window,o=["ms","moz","webkit","o"],s=0,a=void 0,l=void 0,c=0;c6&&void 0!==arguments[6]&&arguments[6];r(this,e);var f=t.target,v=(f&&f.options||s).deltaSource,g=o(f,p,l),h="start"===c,m="end"===c,y=h?t.startCoords:t.curCoords,x=t.prevEvent;p=p||t.element;var b=i({},y.page),w=i({},y.client);b.x-=g.x,b.y-=g.y,w.x-=g.x,w.y-=g.y,this.ctrlKey=n.ctrlKey,this.altKey=n.altKey,this.shiftKey=n.shiftKey,this.metaKey=n.metaKey,this.button=n.button,this.buttons=n.buttons,this.target=p,this.currentTarget=p,this.relatedTarget=u||null,this.preEnd=d,this.type=l+(c||""),this.interaction=t,this.interactable=f,this.t0=h?t.downTimes[t.downTimes.length-1]:x.t0;var E={interaction:t,event:n,action:l,phase:c,element:p,related:u,page:b,client:w,coords:y,starting:h,ending:m,deltaSource:v,iEvent:this};a.fire("set-xy",E),m?(this.pageX=x.pageX,this.pageY=x.pageY,this.clientX=x.clientX,this.clientY=x.clientY):(this.pageX=b.x,this.pageY=b.y,this.clientX=w.x,this.clientY=w.y),this.x0=t.startCoords.page.x-g.x,this.y0=t.startCoords.page.y-g.y,this.clientX0=t.startCoords.client.x-g.x,this.clientY0=t.startCoords.client.y-g.y,a.fire("set-delta",E),this.timeStamp=y.timeStamp,this.dt=t.pointerDelta.timeStamp,this.duration=this.timeStamp-this.t0,this.speed=t.pointerDelta[v].speed,this.velocityX=t.pointerDelta[v].vx,this.velocityY=t.pointerDelta[v].vy,this.swipe=m||"inertiastart"===c?this.getSwipe():null,a.fire("new",E)}return e.prototype.getSwipe=function(){var e=this.interaction;if(e.prevEvent.speed<600||this.timeStamp-e.prevEvent.timeStamp>150)return null;var t=180*Math.atan2(e.prevEvent.velocityY,e.prevEvent.velocityX)/Math.PI;t<0&&(t+=360);var n=112.5<=t&&t<247.5,r=202.5<=t&&t<337.5,i=!n&&(292.5<=t||t<67.5);return{up:r,down:!r&&22.5<=t&&t<157.5,left:n,right:i,angle:t,speed:e.prevEvent.speed,velocity:{x:e.prevEvent.velocityX,y:e.prevEvent.velocityY}}},e.prototype.preventDefault=function(){},e.prototype.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},e.prototype.stopPropagation=function(){this.propagationStopped=!0},e}();a.on("set-delta",function(e){var t=e.iEvent,n=e.interaction,r=e.starting,i=e.deltaSource,o=r?t:n.prevEvent;"client"===i?(t.dx=t.clientX-o.clientX,t.dy=t.clientY-o.clientY):(t.dx=t.pageX-o.pageX,t.dy=t.pageY-o.pageY)}),l.signals=a,t.exports=l},{"./defaultOptions":18,"./utils/Signals":35,"./utils/extend":41,"./utils/getOriginXY":42}],4:[function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=e("./utils/is"),o=e("./utils/events"),s=e("./utils/extend"),a=e("./actions/base"),l=e("./scope"),c=e("./Eventable"),p=e("./defaultOptions"),u=e("./utils/Signals").new(),d=e("./utils/domUtils"),f=d.getElementRect,v=d.nodeContains,g=d.trySelector,h=e("./utils/window"),m=h.getWindow,y=e("./utils/arr"),x=y.indexOf,b=y.contains,w=e("./utils/browser"),E=w.wheelEvent;l.interactables=[];var S=function(){function e(t,n){r(this,e),n=n||{},this.target=t,this.events=new c,this._context=n.context||l.document,this._win=m(g(t)?this._context:t),this._doc=this._win.document,u.fire("new",{target:t,options:n,interactable:this,win:this._win}),l.addDocument(this._doc,this._win),l.interactables.push(this),this.set(n)}return e.prototype.setOnEvents=function(e,t){var n="on"+e;return i.function(t.onstart)&&(this.events[n+"start"]=t.onstart),i.function(t.onmove)&&(this.events[n+"move"]=t.onmove),i.function(t.onend)&&(this.events[n+"end"]=t.onend),i.function(t.oninertiastart)&&(this.events[n+"inertiastart"]=t.oninertiastart),this},e.prototype.setPerAction=function(e,t){for(var n in t)n in p[e]&&(i.object(t[n])?(this.options[e][n]=s(this.options[e][n]||{},t[n]),i.object(p.perAction[n])&&"enabled"in p.perAction[n]&&(this.options[e][n].enabled=!1!==t[n].enabled)):i.bool(t[n])&&i.object(p.perAction[n])?this.options[e][n].enabled=t[n]:void 0!==t[n]&&(this.options[e][n]=t[n]))},e.prototype.getRect=function(e){return e=e||this.target,i.string(this.target)&&!i.element(e)&&(e=this._context.querySelector(this.target)),f(e)},e.prototype.rectChecker=function(e){return i.function(e)?(this.getRect=e,this):null===e?(delete this.options.getRect,this):this.getRect},e.prototype._backCompatOption=function(e,t){if(g(t)||i.object(t)){this.options[e]=t;for(var n=a.names,r=Array.isArray(n),o=0,n=r?n:n[Symbol.iterator]();;){var s;if(r){if(o>=n.length)break;s=n[o++]}else{if(o=n.next(),o.done)break;s=o.value}var l=s;this.options[l][e]=t}return this}return this.options[e]},e.prototype.origin=function(e){return this._backCompatOption("origin",e)},e.prototype.deltaSource=function(e){return"page"===e||"client"===e?(this.options.deltaSource=e,this):this.options.deltaSource},e.prototype.context=function(){return this._context},e.prototype.inContext=function(e){return this._context===e.ownerDocument||v(this._context,e)},e.prototype.fire=function(e){return this.events.fire(e),this},e.prototype._onOffMultiple=function(e,t,n,r){if(i.string(t)&&-1!==t.search(" ")&&(t=t.trim().split(/ +/)),i.array(t)){for(var o=0;o=l.length)break;f=l[d++]}else{if(d=l.next(),d.done)break;f=d.value}var v=f;this.options[v]=p.base[v],v in t&&this[v](t[v])}return u.fire("set",{options:t,interactable:this}),this},e.prototype.unset=function(){if(o.remove(this.target,"all"),i.string(this.target))for(var e in o.delegatedEvents){var t=o.delegatedEvents[e];t.selectors[0]===this.target&&t.contexts[0]===this._context&&(t.selectors.splice(0,1),t.contexts.splice(0,1),t.listeners.splice(0,1),t.selectors.length||(t[e]=null)),o.remove(this._context,e,o.delegateListener),o.remove(this._context,e,o.delegateUseCapture,!0)}else o.remove(this,"all");u.fire("unset",{interactable:this}),l.interactables.splice(x(l.interactables,this),1);for(var n=l.interactions||[],r=Array.isArray(n),s=0,n=r?n:n[Symbol.iterator]();;){var a;if(r){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var c=a;c.target===this&&c.interacting()&&c.stop()}return l.interact},e}();l.interactables.indexOfElement=function(e,t){t=t||l.document;for(var n=0;n=x.length)break;E=x[w++]}else{if(w=x.next(),w.done)break;E=w.value}var S=E,T=S[0],C=S[1];C._updateEventTargets(i,o),C[e](T,t,i,o)}}}function o(e){for(var t=0;te.pointerMoveTolerance);var a={pointer:t,pointerIndex:this.getPointerIndex(t),event:n,eventTarget:r,dx:o,dy:s,duplicate:i,interaction:this,interactingBeforeMove:this.interacting()};i||l.setCoordDeltas(this.pointerDelta,this.prevCoords,this.curCoords),f.fire("move",a),i||(this.interacting()&&this.doMove(a),this.pointerWasMoved&&l.copyCoords(this.prevCoords,this.curCoords))},e.prototype.doMove=function(e){e=l.extend({pointer:this.pointers[0],event:this.prevEvent,eventTarget:this._eventTarget,interaction:this},e||{}),f.fire("before-action-move",e),this._dontFireMove||f.fire("action-move",e),this._dontFireMove=!1},e.prototype.pointerUp=function(e,t,n,r){var i=this.getPointerIndex(e);f.fire(/cancel$/i.test(t.type)?"cancel":"up",{pointer:e,pointerIndex:i,event:t,eventTarget:n,curEventTarget:r,interaction:this}),this.simulation||this.end(t),this.pointerIsDown=!1,this.removePointer(e,t)},e.prototype.end=function(e){e=e||this.prevEvent,this.interacting()&&f.fire("action-end",{event:e,interaction:this}),this.stop()},e.prototype.currentAction=function(){return this._interacting?this.prepared.name:null},e.prototype.interacting=function(){return this._interacting},e.prototype.stop=function(){f.fire("stop",{interaction:this}),this._interacting&&(f.fire("stop-active",{interaction:this}),f.fire("stop-"+this.prepared.name,{interaction:this})),this.target=this.element=null,this._interacting=!1,this.prepared.name=this.prevEvent=null},e.prototype.getPointerIndex=function(e){return"mouse"===this.pointerType||"pen"===this.pointerType?0:l.indexOf(this.pointerIds,l.getPointerId(e))},e.prototype.updatePointer=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:t&&/(down|start)$/i.test(t.type),r=l.getPointerId(e),i=this.getPointerIndex(e);return-1===i&&(i=this.pointerIds.length,this.pointerIds[i]=r),n&&f.fire("update-pointer-down",{pointer:e,event:t,down:n,pointerId:r,pointerIndex:i,interaction:this}),this.pointers[i]=e,i},e.prototype.removePointer=function(e,t){var n=this.getPointerIndex(e);-1!==n&&(f.fire("remove-pointer",{pointer:e,event:t,pointerIndex:n,interaction:this}),this.pointers.splice(n,1),this.pointerIds.splice(n,1),this.downTargets.splice(n,1),this.downTimes.splice(n,1))},e.prototype._updateEventTargets=function(e,t){this._eventTarget=e,this._curEventTarget=t},e}(),y=0,x=g.length;y=i.length)break;a=i[s++]}else{if(s=i.next(),s.done)break;a=s.value}var l=a;if(l.options.drop.enabled){var c=l.options.drop.accept;if(!(p.is.element(c)&&c!==t||p.is.string(c)&&!p.matchesSelector(t,c)))for(var d=p.is.string(l.target)?l._context.querySelectorAll(l.target):[l.target],f=0;fo.left&&c.xo.top&&c.y=o.left&&v<=o.right&&g>=o.top&&g<=o.bottom}if(f&&p.is.number(a)){s=Math.max(0,Math.min(o.right,f.right)-Math.max(o.left,f.left))*Math.max(0,Math.min(o.bottom,f.bottom)-Math.max(o.top,f.top))/(f.width*f.height)>=a}return this.options.drop.checker&&(s=this.options.drop.checker(e,t,s,this,i,n,r)),s},v.signals.on("unset",function(e){e.interactable.dropzone(!1)}),v.settingsMethods.push("dropChecker"),g.signals.on("new",function(e){e.dropTarget=null,e.dropElement=null,e.prevDropTarget=null,e.prevDropElement=null,e.dropEvents=null,e.activeDrops={dropzones:[],elements:[],rects:[]}}),g.signals.on("stop",function(e){var t=e.interaction;t.dropTarget=t.dropElement=t.prevDropTarget=t.prevDropElement=null}),d.dynamicDrop=function(e){return p.is.bool(e)?(y=e,d):y},p.merge(v.eventTypes,["dragenter","dragleave","dropactivate","dropdeactivate","dropmove","drop"]),c.methodDict.drop="dropzone",h.drop=m.defaults,t.exports=m},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../interact":21,"../scope":34,"../utils":44,"./base":6}],9:[function(e,t,n){"use strict";var r=e("./base"),i=e("../utils"),o=e("../InteractEvent"),s=e("../Interactable"),a=e("../Interaction"),l=e("../defaultOptions"),c={defaults:{enabled:!1,origin:null,restrict:null},checker:function(e,t,n,r,i){return i.pointerIds.length>=2?{name:"gesture"}:null},getCursor:function(){return""}};o.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;"gesturestart"===t.type&&(t.ds=0,n.gesture.startDistance=n.gesture.prevDistance=t.distance,n.gesture.startAngle=n.gesture.prevAngle=t.angle,n.gesture.scale=1)}),o.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;"gesturemove"===t.type&&(t.ds=t.scale-n.gesture.scale,n.target.fire(t),n.gesture.prevAngle=t.angle,n.gesture.prevDistance=t.distance,t.scale===1/0||null===t.scale||void 0===t.scale||isNaN(t.scale)||(n.gesture.scale=t.scale))}),s.prototype.gesturable=function(e){return i.is.object(e)?(this.options.gesture.enabled=!1!==e.enabled,this.setPerAction("gesture",e),this.setOnEvents("gesture",e),this):i.is.bool(e)?(this.options.gesture.enabled=e,e||(this.ongesturestart=this.ongesturestart=this.ongestureend=null),this):this.options.gesture},o.signals.on("set-delta",function(e){var t=e.interaction,n=e.iEvent,r=e.action,s=e.event,a=e.starting,l=e.ending,c=e.deltaSource;if("gesture"===r){var p=t.pointers;n.touches=[p[0],p[1]],a?(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=1,n.ds=0,n.angle=i.touchAngle(p,void 0,c),n.da=0):l||s instanceof o?(n.distance=t.prevEvent.distance,n.box=t.prevEvent.box,n.scale=t.prevEvent.scale,n.ds=n.scale-1,n.angle=t.prevEvent.angle,n.da=n.angle-t.gesture.startAngle):(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=n.distance/t.gesture.startDistance,n.angle=i.touchAngle(p,t.gesture.prevAngle,c),n.ds=n.scale-t.gesture.prevScale,n.da=n.angle-t.gesture.prevAngle)}}),a.signals.on("new",function(e){e.gesture={start:{x:0,y:0},startDistance:0,prevDistance:0,distance:0,scale:1,startAngle:0,prevAngle:0}}),r.gesture=c,r.names.push("gesture"),i.merge(s.eventTypes,["gesturestart","gesturemove","gestureend"]),r.methodDict.gesture="gesturable",l.gesture=c.defaults,t.exports=c},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"./base":6}],10:[function(e,t,n){"use strict";function r(e,t,n,r,i,s,a){if(!t)return!1;if(!0===t){var l=o.is.number(s.width)?s.width:s.right-s.left,c=o.is.number(s.height)?s.height:s.bottom-s.top;if(l<0&&("left"===e?e="right":"right"===e&&(e="left")),c<0&&("top"===e?e="bottom":"bottom"===e&&(e="top")),"left"===e)return n.x<(l>=0?s.left:s.right)+a;if("top"===e)return n.y<(c>=0?s.top:s.bottom)+a;if("right"===e)return n.x>(l>=0?s.right:s.left)-a;if("bottom"===e)return n.y>(c>=0?s.bottom:s.top)-a}return!!o.is.element(r)&&(o.is.element(t)?t===r:o.matchesUpTo(r,t,i))}var i=e("./base"),o=e("../utils"),s=e("../utils/browser"),a=e("../InteractEvent"),l=e("../Interactable"),c=e("../Interaction"),p=e("../defaultOptions"),u=s.supportsTouch||s.supportsPointerEvent?20:10,d={defaults:{enabled:!1,mouseButtons:null,origin:null,snap:null,restrict:null,inertia:null,autoScroll:null,square:!1,preserveAspectRatio:!1,axis:"xy",margin:NaN,edges:null,invert:"none"},checker:function(e,t,n,i,s,a){if(!a)return null;var l=o.extend({},s.curCoords.page),c=n.options;if(c.resize.enabled){var p=c.resize,d={left:!1,right:!1,top:!1,bottom:!1};if(o.is.object(p.edges)){for(var f in d)d[f]=r(f,p.edges[f],l,s._eventTarget,i,a,p.margin||u);if(d.left=d.left&&!d.right,d.top=d.top&&!d.bottom,d.left||d.right||d.top||d.bottom)return{name:"resize",edges:d}}else{var v="y"!==c.resize.axis&&l.x>a.right-u,g="x"!==c.resize.axis&&l.y>a.bottom-u;if(v||g)return{name:"resize",axes:(v?"x":"")+(g?"y":"")}}}return null},cursors:s.isIe9OrOlder?{x:"e-resize",y:"s-resize",xy:"se-resize",top:"n-resize",left:"w-resize",bottom:"s-resize",right:"e-resize",topleft:"se-resize",bottomright:"se-resize",topright:"ne-resize",bottomleft:"ne-resize"}:{x:"ew-resize",y:"ns-resize",xy:"nwse-resize",top:"ns-resize",left:"ew-resize",bottom:"ns-resize",right:"ew-resize",topleft:"nwse-resize",bottomright:"nwse-resize",topright:"nesw-resize",bottomleft:"nesw-resize"},getCursor:function(e){if(e.axis)return d.cursors[e.name+e.axis];if(e.edges){for(var t="",n=["top","bottom","left","right"],r=0;r<4;r++)e.edges[n[r]]&&(t+=n[r]);return d.cursors[t]}}};a.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;if("resizestart"===t.type&&n.prepared.edges){var r=n.target.getRect(n.element),i=n.target.options.resize;if(i.square||i.preserveAspectRatio){var s=o.extend({},n.prepared.edges);s.top=s.top||s.left&&!s.bottom,s.left=s.left||s.top&&!s.right,s.bottom=s.bottom||s.right&&!s.top,s.right=s.right||s.bottom&&!s.left,n.prepared._linkedEdges=s}else n.prepared._linkedEdges=null;i.preserveAspectRatio&&(n.resizeStartAspectRatio=r.width/r.height),n.resizeRects={start:r,current:o.extend({},r),inverted:o.extend({},r),previous:o.extend({},r),delta:{left:0,right:0,width:0,top:0,bottom:0,height:0}},t.rect=n.resizeRects.inverted,t.deltaRect=n.resizeRects.delta}}),a.signals.on("new",function(e){var t=e.iEvent,n=e.phase,r=e.interaction;if("move"===n&&r.prepared.edges){var i=r.target.options.resize,s=i.invert,a="reposition"===s||"negate"===s,l=r.prepared.edges,c=r.resizeRects.start,p=r.resizeRects.current,u=r.resizeRects.inverted,d=r.resizeRects.delta,f=o.extend(r.resizeRects.previous,u),v=l,g=t.dx,h=t.dy;if(i.preserveAspectRatio||i.square){var m=i.preserveAspectRatio?r.resizeStartAspectRatio:1;l=r.prepared._linkedEdges,v.left&&v.bottom||v.right&&v.top?h=-g/m:v.left||v.right?h=g/m:(v.top||v.bottom)&&(g=h*m)}if(l.top&&(p.top+=h),l.bottom&&(p.bottom+=h),l.left&&(p.left+=g),l.right&&(p.right+=g),a){if(o.extend(u,p),"reposition"===s){var y=void 0;u.top>u.bottom&&(y=u.top,u.top=u.bottom,u.bottom=y),u.left>u.right&&(y=u.left,u.left=u.right,u.right=y)}}else u.top=Math.min(p.top,c.bottom),u.bottom=Math.max(p.bottom,c.top),u.left=Math.min(p.left,c.right),u.right=Math.max(p.right,c.left);u.width=u.right-u.left,u.height=u.bottom-u.top;for(var x in u)d[x]=u[x]-f[x];t.edges=r.prepared.edges,t.rect=u,t.deltaRect=d}}),l.prototype.resizable=function(e){return o.is.object(e)?(this.options.resize.enabled=!1!==e.enabled,this.setPerAction("resize",e),this.setOnEvents("resize",e),/^x$|^y$|^xy$/.test(e.axis)?this.options.resize.axis=e.axis:null===e.axis&&(this.options.resize.axis=p.resize.axis),o.is.bool(e.preserveAspectRatio)?this.options.resize.preserveAspectRatio=e.preserveAspectRatio:o.is.bool(e.square)&&(this.options.resize.square=e.square),this):o.is.bool(e)?(this.options.resize.enabled=e, +e||(this.onresizestart=this.onresizestart=this.onresizeend=null),this):this.options.resize},c.signals.on("new",function(e){e.resizeAxes="xy"}),a.signals.on("set-delta",function(e){var t=e.interaction,n=e.iEvent;"resize"===e.action&&t.resizeAxes&&(t.target.options.resize.square?("y"===t.resizeAxes?n.dx=n.dy:n.dy=n.dx,n.axes="xy"):(n.axes=t.resizeAxes,"x"===t.resizeAxes?n.dy=0:"y"===t.resizeAxes&&(n.dx=0)))}),i.resize=d,i.names.push("resize"),o.merge(l.eventTypes,["resizestart","resizemove","resizeinertiastart","resizeinertiaresume","resizeend"]),i.methodDict.resize="resizable",p.resize=d.defaults,t.exports=d},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"../utils/browser":37,"./base":6}],11:[function(e,t,n){"use strict";var r=e("./utils/raf"),i=e("./utils/window").getWindow,o=e("./utils/is"),s=e("./utils/domUtils"),a=e("./Interaction"),l=e("./defaultOptions"),c={defaults:{enabled:!1,container:null,margin:60,speed:300},interaction:null,i:null,x:0,y:0,isScrolling:!1,prevTime:0,start:function(e){c.isScrolling=!0,r.cancel(c.i),c.interaction=e,c.prevTime=(new Date).getTime(),c.i=r.request(c.scroll)},stop:function(){c.isScrolling=!1,r.cancel(c.i)},scroll:function(){var e=c.interaction.target.options[c.interaction.prepared.name].autoScroll,t=e.container||i(c.interaction.element),n=(new Date).getTime(),s=(n-c.prevTime)/1e3,a=e.speed*s;a>=1&&(o.window(t)?t.scrollBy(c.x*a,c.y*a):t&&(t.scrollLeft+=c.x*a,t.scrollTop+=c.y*a),c.prevTime=n),c.isScrolling&&(r.cancel(c.i),c.i=r.request(c.scroll))},check:function(e,t){var n=e.options;return n[t].autoScroll&&n[t].autoScroll.enabled},onInteractionMove:function(e){var t=e.interaction,n=e.pointer;if(t.interacting()&&c.check(t.target,t.prepared.name)){if(t.simulation)return void(c.x=c.y=0);var r=void 0,a=void 0,l=void 0,p=void 0,u=t.target.options[t.prepared.name].autoScroll,d=u.container||i(t.element);if(o.window(d))p=n.clientXd.innerWidth-c.margin,l=n.clientY>d.innerHeight-c.margin;else{var f=s.getElementClientRect(d);p=n.clientXf.right-c.margin,l=n.clientY>f.bottom-c.margin}c.x=a?1:p?-1:0,c.y=l?1:r?-1:0,c.isScrolling||(c.margin=u.margin,c.speed=u.speed,c.start(t))}}};a.signals.on("stop-active",function(){c.stop()}),a.signals.on("action-move",c.onInteractionMove),l.perAction.autoScroll=c.defaults,t.exports=c},{"./Interaction":5,"./defaultOptions":18,"./utils/domUtils":39,"./utils/is":46,"./utils/raf":50,"./utils/window":52}],12:[function(e,t,n){"use strict";var r=e("../Interactable"),i=e("../actions/base"),o=e("../utils/is"),s=e("../utils/domUtils");r.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},r.prototype.ignoreFrom=function(e){return this._backCompatOption("ignoreFrom",e)},r.prototype.allowFrom=function(e){return this._backCompatOption("allowFrom",e)},r.prototype.testIgnore=function(e,t,n){return!(!e||!o.element(n))&&(o.string(e)?s.matchesUpTo(n,e,t):!!o.element(e)&&s.nodeContains(e,n))},r.prototype.testAllow=function(e,t,n){return!e||!!o.element(n)&&(o.string(e)?s.matchesUpTo(n,e,t):!!o.element(e)&&s.nodeContains(e,n))},r.prototype.testIgnoreAllow=function(e,t,n){return!this.testIgnore(e.ignoreFrom,t,n)&&this.testAllow(e.allowFrom,t,n)},r.prototype.actionChecker=function(e){return o.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},r.prototype.styleCursor=function(e){return o.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},r.prototype.defaultActionChecker=function(e,t,n,r){for(var o=this.getRect(r),s=null,a=i.names,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var u=p;if((!n.pointerIsDown||!n.mouse||0!=(t.buttons&this.options[u].mouseButtons))&&(s=i[u].checker(e,t,this,r,n,o)))return s}}},{"../Interactable":4,"../actions/base":6,"../utils/domUtils":39,"../utils/is":46}],13:[function(e,t,n){"use strict";function r(e,t,n,r){return g.is.object(e)&&t.testIgnoreAllow(t.options[e.name],n,r)&&t.options[e.name].enabled&&a(t,n,e)?e:null}function i(e,t,n,i,o,s){for(var a=0,l=i.length;a=m.maxInteractions)return!1;if(u.target===e){if((a+=d===n.name|0)>=i)return!1;if(u.element===t&&(l++,d!==n.name||l>=o))return!1}}}return m.maxInteractions>0}}var l=e("../interact"),c=e("../Interactable"),p=e("../Interaction"),u=e("../actions/base"),d=e("../defaultOptions"),f=e("../utils/browser"),v=e("../scope"),g=e("../utils"),h=e("../utils/Signals").new();e("./InteractableMethods");var m={signals:h,withinInteractionLimit:a,maxInteractions:1/0,defaults:{perAction:{manualStart:!1,max:1/0,maxPerElement:1,allowFrom:null,ignoreFrom:null}},setActionDefaults:function(e){g.extend(e.defaults,m.defaults.perAction)}};p.signals.on("down",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;if(!t.interacting()){s(t,o(t,n,r,i))}}),p.signals.on("move",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;if(t.mouse&&!t.pointerIsDown&&!t.interacting()){s(t,o(t,n,r,i))}}),p.signals.on("move",function(e){var t=e.interaction,n=e.event;if(t.pointerIsDown&&!t.interacting()&&t.pointerWasMoved&&t.prepared.name){h.fire("before-start",e);var r=t.target;t.prepared.name&&r&&(r.options[t.prepared.name].manualStart||!a(r,t.element,t.prepared)?t.stop(n):t.start(t.prepared,r,t.element))}}),p.signals.on("stop",function(e){var t=e.interaction,n=t.target;n&&n.options.styleCursor&&(n._doc.documentElement.style.cursor="")}),c.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},c.prototype.actionChecker=function(e){return g.is.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},c.prototype.styleCursor=function(e){return g.is.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},c.prototype.defaultActionChecker=function(e,t,n,r){for(var i=this.getRect(r),o=t.buttons||{0:1,1:4,3:8,4:16}[t.button],s=null,a=u.names,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var d=p;if((!n.pointerIsDown||!n.mouse||0!=(o&this.options[d].mouseButtons))&&(s=u[d].checker(e,t,this,r,n,i)))return s}},l.maxInteractions=function(e){return g.is.number(e)?(m.maxInteractions=e,this):m.maxInteractions},c.settingsMethods.push("styleCursor"),c.settingsMethods.push("actionChecker"),c.settingsMethods.push("ignoreFrom"),c.settingsMethods.push("allowFrom"),d.base.actionChecker=null,d.base.styleCursor=!0,g.extend(d.perAction,m.defaults.perAction),t.exports=m},{"../Interactable":4,"../Interaction":5,"../actions/base":6,"../defaultOptions":18,"../interact":21,"../scope":34,"../utils":44,"../utils/Signals":35,"../utils/browser":37,"./InteractableMethods":12}],14:[function(e,t,n){"use strict";var r=e("./base"),i=e("../Interaction");i.signals.on("new",function(e){e.delayTimer=null}),r.signals.on("prepared",function(e){var t=e.interaction,n=t.prepared.name;if(n){var r=t.target.options[n].delay;r>0&&(t.delayTimer=setTimeout(function(){t.start(t.prepared,t.target,t.element)},r))}}),i.signals.on("move",function(e){var t=e.interaction,n=e.duplicate;t.pointerWasMoved&&!n&&clearTimeout(t.delayTimer)}),r.signals.on("before-start",function(e){var t=e.interaction,n=t.prepared.name;if(n){t.target.options[n].delay>0&&(t.prepared.name=null)}})},{"../Interaction":5,"./base":13}],15:[function(e,t,n){"use strict";function r(e,t){if(!t)return!1;var n=t.options.drag.startAxis;return"xy"===e||"xy"===n||n===e}var i=e("./base"),o=e("../scope"),s=e("../utils/browser"),a=e("../utils/is"),l=e("../utils/domUtils"),c=l.matchesSelector,p=l.parentNode;i.setActionDefaults(e("../actions/drag")),i.signals.on("before-start",function(e){var t=e.interaction,n=e.eventTarget,l=e.dx,u=e.dy;if("drag"===t.prepared.name){var d=Math.abs(l),f=Math.abs(u),v=t.target.options.drag,g=v.startAxis,h=d>f?"x":dl.minSpeed&&g>l.endSpeed,b={interaction:t,pageCoords:v,statuses:f,preEnd:!0,requireEndOnly:!0};y&&!x&&(c.resetStatuses(f),m=c.setAll(b),m.shouldMove&&m.locked&&(h=!0)),(x||h)&&(p.copyCoords(i.upCoords,t.curCoords),t.pointers[0]=i.startEvent=new a(t,n,t.prepared.name,"inertiastart",t.element),i.t0=d,i.active=!0,i.allowResume=l.allowResume,t.simulation=i,o.fire(i.startEvent),x?(i.vx0=t.pointerDelta.client.vx,i.vy0=t.pointerDelta.client.vy,i.v0=g,r(t,i),p.extend(v,t.curCoords.page),v.x+=i.xe,v.y+=i.ye,c.resetStatuses(f),m=c.setAll(b),i.modifiedXe+=m.dx,i.modifiedYe+=m.dy,i.i=u.request(t.boundInertiaFrame)):(i.smoothEnd=!0,i.xe=m.dx,i.ye=m.dy,i.sx=i.sy=0,i.i=u.request(t.boundSmoothEndFrame)))}}),l.signals.on("stop-active",function(e){var t=e.interaction,n=t.inertiaStatus;n.active&&(u.cancel(n.i),n.active=!1,t.simulation=null)})},{"./InteractEvent":3,"./Interaction":5,"./modifiers":24,"./utils":44,"./utils/raf":50}],21:[function(e,t,n){"use strict";function r(e,t){var n=a.interactables.get(e,t);return n||(n=new l(e,t),n.events.global=p),n}var i=e("./utils/browser"),o=e("./utils/events"),s=e("./utils"),a=e("./scope"),l=e("./Interactable"),c=e("./Interaction"),p={};r.isSet=function(e,t){return-1!==a.interactables.indexOfElement(e,t&&t.context)},r.on=function(e,t,n){if(s.is.string(e)&&-1!==e.search(" ")&&(e=e.trim().split(/ +/)),s.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.on(f,t,n)}return r}if(s.is.object(e)){for(var v in e)r.on(v,e[v],t);return r}return s.contains(l.eventTypes,e)?p[e]?p[e].push(t):p[e]=[t]:o.add(a.document,e,t,{options:n}),r},r.off=function(e,t,n){if(s.is.string(e)&&-1!==e.search(" ")&&(e=e.trim().split(/ +/)),s.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.off(f,t,n)}return r}if(s.is.object(e)){for(var v in e)r.off(v,e[v],t);return r}if(s.contains(l.eventTypes,e)){var g=void 0;e in p&&-1!==(g=s.indexOf(p[e],t))&&p[e].splice(g,1)}else o.remove(a.document,e,t,n);return r},r.debug=function(){return a},r.getPointerAverage=s.pointerAverage,r.getTouchBBox=s.touchBBox,r.getTouchDistance=s.touchDistance,r.getTouchAngle=s.touchAngle,r.getElementRect=s.getElementRect,r.getElementClientRect=s.getElementClientRect,r.matchesSelector=s.matchesSelector,r.closest=s.closest,r.supportsTouch=function(){return i.supportsTouch},r.supportsPointerEvent=function(){return i.supportsPointerEvent},r.stop=function(e){for(var t=a.interactions.length-1;t>=0;t--)a.interactions[t].stop(e);return r},r.pointerMoveTolerance=function(e){return s.is.number(e)?(c.pointerMoveTolerance=e,this):c.pointerMoveTolerance},r.addDocument=a.addDocument,r.removeDocument=a.removeDocument,a.interact=r,t.exports=r},{"./Interactable":4,"./Interaction":5,"./scope":34,"./utils":44,"./utils/browser":37,"./utils/events":40}],22:[function(e,t,n){"use strict";function r(e){var t=e.interaction,n=e.event;t.target&&t.target.checkAndPreventDefault(n)}var i=e("./Interactable"),o=e("./Interaction"),s=e("./scope"),a=e("./utils/is"),l=e("./utils/events"),c=e("./utils/domUtils"),p=c.nodeContains,u=c.matchesSelector;i.prototype.preventDefault=function(e){return/^(always|never|auto)$/.test(e)?(this.options.preventDefault=e,this):a.bool(e)?(this.options.preventDefault=e?"always":"never",this):this.options.preventDefault},i.prototype.checkAndPreventDefault=function(e){var t=this.options.preventDefault;if("never"!==t)return"always"===t?void e.preventDefault():void(l.supportsOptions||/^(mouse|pointer|touch)*(down|start)/i.test(e.type)||a.element(e.target)&&u(e.target,"input,select,textarea,[contenteditable=true],[contenteditable=true] *")||e.preventDefault())};for(var d=["down","move","up","cancel"],f=0;f=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i;if(o.element&&(o.element===e.target||p(o.element,e.target)))return void o.target.checkAndPreventDefault(e)}}},{"./Interactable":4,"./Interaction":5,"./scope":34,"./utils/domUtils":39,"./utils/events":40,"./utils/is":46}],23:[function(e,t,n){"use strict";function r(e){var t=e.target,n=a.search(e,e.type,t);n&&n.prevTap&&e.clientX===n.prevTap.clientX&&e.clientY===n.prevTap.clientY&&t===n.prevTap.target&&(n.downTargets[0]=t,n.downTimes[0]=(new Date).getTime(),l.fire({interaction:n,event:e,eventTarget:t,pointer:e,type:"tap"}))}var i=e("./scope"),o=e("./utils/events"),s=e("./utils/browser"),a=e("./utils/interactionFinder"),l=e("./pointerEvents/base"),c=e("./utils/window"),p=c.window,u=Object.prototype.toString;if(p.Array.isArray||(p.Array.isArray=function(e){return"[object Array]"===u.call(e)}),String.prototype.trim||(String.prototype.trim=function(){return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")}),s.isIE8){var d=function(e){for(var t=i.interactions,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var o;if(n){if(r>=t.length)break;o=t[r++]}else{if(r=t.next(),r.done)break;o=r.value}var s=o;s.interacting()&&s.target.checkAndPreventDefault(e)}},f=function(e,t){var n=e.doc,i=(e.win,0===t.indexOf("listen")?o.add:o.remove);i(n,"selectstart",d),l&&i(n,"dblclick",r)};i.signals.on("add-document",f),i.signals.on("remove-document",f)}t.exports=null},{"./pointerEvents/base":31,"./scope":34,"./utils/browser":37,"./utils/events":40,"./utils/interactionFinder":45,"./utils/window":52}],24:[function(e,t,n){"use strict";function r(e,t,n){return e&&e.enabled&&(t||!e.endOnly)&&(!n||e.endOnly)}var i=e("../InteractEvent"),o=e("../Interaction"),s=e("../utils/extend"),a={names:[],setOffsets:function(e){var t=e.interaction,n=e.pageCoords,r=t.target,i=t.element,o=t.startOffset,s=r.getRect(i);s?(o.left=n.x-s.left,o.top=n.y-s.top,o.right=s.right-n.x,o.bottom=s.bottom-n.y,"width"in s||(s.width=s.right-s.left),"height"in s||(s.height=s.bottom-s.top)):o.left=o.top=o.right=o.bottom=0,e.rect=s,e.interactable=r,e.element=i;for(var l=0;l=p.length)break;f=p[d++]}else{if(d=p.next(),d.done)break;f=d.value}var v=f,g=a[v],h=t.target.options[t.prepared.name][v];r(h,i,o)&&(e.status=e.status=n[v],e.options=h,e.offset=e.interaction.modifierOffsets[v],g.set(e),e.status.locked&&(l.x+=e.status.dx,l.y+=e.status.dy,c.dx+=e.status.dx,c.dy+=e.status.dy,c.locked=!0))}return c.shouldMove=!e.status||!c.locked||e.status.changed,c},resetStatuses:function(e){for(var t=a.names,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var i;if(n){if(r>=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i,s=e[o]||{};s.dx=s.dy=0,s.modifiedX=s.modifiedY=NaN,s.locked=!1,s.changed=!0,e[o]=s}return e},start:function(e,t){var n=e.interaction,r={interaction:n,pageCoords:("action-resume"===t?n.curCoords:n.startCoords).page,startOffset:n.startOffset,statuses:n.modifierStatuses,preEnd:!1,requireEndOnly:!1};a.setOffsets(r),a.resetStatuses(r.statuses),r.pageCoords=s({},n.startCoords.page),n.modifierResult=a.setAll(r)}};o.signals.on("new",function(e){e.startOffset={left:0,right:0,top:0,bottom:0},e.modifierOffsets={},e.modifierStatuses=a.resetStatuses({}),e.modifierResult=null}),o.signals.on("action-start",a.start),o.signals.on("action-resume",a.start),o.signals.on("before-action-move",function(e){var t=e.interaction,n=e.preEnd,r=e.interactingBeforeMove,i=a.setAll({interaction:t,preEnd:n,pageCoords:t.curCoords.page,statuses:t.modifierStatuses,requireEndOnly:!1});!i.shouldMove&&r&&(t._dontFireMove=!0),t.modifierResult=i}),o.signals.on("action-end",function(e){for(var t=e.interaction,n=e.event,i=0;i=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}var m=h,y=m.x,x=m.y;l.push({x:s.left-i.width*y+u.x,y:s.top-i.height*x+u.y})}else l.push(u);return l},set:function(e){var t=e.interaction,n=e.pageCoords,r=e.status,i=e.options,s=e.offset,a=[],l=void 0,c=void 0,p=void 0;if(r.useStatusXY)c={x:r.x,y:r.y};else{var u=o.getOriginXY(t.target,t.element,t.prepared.name);c=o.extend({},n),c.x-=u.x,c.y-=u.y}r.realX=c.x,r.realY=c.y;for(var d=i.targets?i.targets.length:0,f=s,v=Array.isArray(f),g=0,f=v?f:f[Symbol.iterator]();;){var h;if(v){if(g>=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}for(var m=h,y=m.x,x=m.y,b=c.x-y,w=c.y-x,E=i.targets,S=Array.isArray(E),T=0,E=S?E:E[Symbol.iterator]();;){var C;if(S){if(T>=E.length)break;C=E[T++]}else{if(T=E.next(),T.done)break;C=T.value}var A=C;l=o.is.function(A)?A(b,w,t):A,l&&a.push({x:o.is.number(l.x)?l.x+y:b,y:o.is.number(l.y)?l.y+x:w,range:o.is.number(l.range)?l.range:i.range})}}var D={target:null,inRange:!1,distance:0,range:0,dx:0,dy:0};for(p=0,d=a.length;p=p.length)break;f=p[d++]}else{if(d=p.next(),d.done)break;f=d.value}var v=f,g=void 0;g=a.is.function(v)?v(l,c,t):v,g&&("width"in g&&"height"in g&&(g.x=g.width, +g.y=g.height),e.options.targets.push(g))}i.set(e)},modifyCoords:function(e){var t=e.options;e.options=a.extend({},t),e.options.enabled=t.enabled,e.options.relativePoints=[null],i.modifyCoords(e)}};r.snapSize=l,r.names.push("snapSize"),o.perAction.snapSize=l.defaults,s.defaults.snapSize=l.defaults,t.exports=l},{"../actions/resize":10,"../defaultOptions":18,"../utils/":44,"./index":24,"./snap":28}],30:[function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=e("../utils/pointerUtils");t.exports=function(){function e(t,n,o,s,a){if(r(this,e),i.pointerExtend(this,o),o!==n&&i.pointerExtend(this,n),this.interaction=a,this.timeStamp=(new Date).getTime(),this.originalEvent=o,this.type=t,this.pointerId=i.getPointerId(n),this.pointerType=i.getPointerType(n),this.target=s,this.currentTarget=null,"tap"===t){var l=a.getPointerIndex(n);this.dt=this.timeStamp-a.downTimes[l];var c=this.timeStamp-a.tapTime;this.double=!!(a.prevTap&&"doubletap"!==a.prevTap.type&&a.prevTap.target===this.target&&c<500)}else"doubletap"===t&&(this.dt=n.timeStamp-a.tapTime)}return e.prototype.subtractOrigin=function(e){var t=e.x,n=e.y;return this.pageX-=t,this.pageY-=n,this.clientX-=t,this.clientY-=n,this},e.prototype.addOrigin=function(e){var t=e.x,n=e.y;return this.pageX+=t,this.pageY+=n,this.clientX+=t,this.clientY+=n,this},e.prototype.preventDefault=function(){this.originalEvent.preventDefault()},e.prototype.stopPropagation=function(){this.propagationStopped=!0},e.prototype.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},e}()},{"../utils/pointerUtils":49}],31:[function(e,t,n){"use strict";function r(e){for(var t=e.interaction,n=e.pointer,s=e.event,l=e.eventTarget,c=e.type,u=void 0===c?e.pointerEvent.type:c,d=e.targets,f=void 0===d?i(e):d,v=e.pointerEvent,g=void 0===v?new o(u,n,s,l,t):v,h={interaction:t,pointer:n,event:s,eventTarget:l,targets:f,type:u,pointerEvent:g},m=0;m=u.length)break;g=u[v++]}else{if(v=u.next(),v.done)break;g=v.value}var h=g;c.element=h,p.fire("collect-targets",c)}return"hold"===o&&(c.targets=d(c.targets,function(e){return e.eventable.options.holdDuration===t.holdTimers[s].duration})),c.targets}var o=e("./PointerEvent"),s=e("../Interaction"),a=e("../utils"),l=e("../utils/browser"),c=e("../defaultOptions"),p=e("../utils/Signals").new(),u=e("../utils/arr"),d=u.filter,f=["down","up","cancel"],v=["down","up","cancel"],g={PointerEvent:o,fire:r,collectEventTargets:i,signals:p,defaults:{holdDuration:600,ignoreFrom:null,allowFrom:null,origin:{x:0,y:0}},types:["down","move","up","cancel","tap","doubletap","hold"]};s.signals.on("update-pointer-down",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers[n]={duration:1/0,timeout:null}}),s.signals.on("remove-pointer",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers.splice(n,1)}),s.signals.on("move",function(e){var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,s=e.duplicateMove,a=t.getPointerIndex(n);s||t.pointerIsDown&&!t.pointerWasMoved||(t.pointerIsDown&&clearTimeout(t.holdTimers[a].timeout),r({interaction:t,pointer:n,event:i,eventTarget:o,type:"move"}))}),s.signals.on("down",function(e){for(var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,s=e.pointerIndex,c=l.isIE8?a.extend({},i):i,u=t.holdTimers[s],d=a.getPath(o),f={interaction:t,pointer:n,event:i,eventTarget:o,type:"hold",targets:[],path:d,element:null},v=d,g=Array.isArray(v),h=0,v=g?v:v[Symbol.iterator]();;){var m;if(g){if(h>=v.length)break;m=v[h++]}else{if(h=v.next(),h.done)break;m=h.value}var y=m;f.element=y,p.fire("collect-targets",f)}if(f.targets.length){for(var x=1/0,b=0;b=0&&(p.selectors[u]!==e||p.contexts[u]!==t);u--);-1===u&&(u=p.selectors.length,p.selectors.push(e),p.contexts.push(t),p.listeners.push([])),p.listeners[u].push([i,!!s.capture,s.passive])}function s(e,t,n,r,o){var s=f(o),c=O[n],p=!1,u=void 0;if(c)for(u=c.selectors.length-1;u>=0;u--)if(c.selectors[u]===e&&c.contexts[u]===t){for(var d=c.listeners[u],v=d.length-1;v>=0;v--){var g=d[v],h=g[0],m=g[1],y=g[2];if(h===r&&m===!!s.capture&&y===s.passive){d.splice(v,1),d.length||(c.selectors.splice(u,1),c.contexts.splice(u,1),c.listeners.splice(u,1),i(t,n,a),i(t,n,l,!0),c.selectors.length||(O[n]=null)),p=!0;break}}if(p)break}}function a(e,t){var n=f(t),r={},i=O[e.type],o=g.getActualElement(e.path?e.path[0]:e.target),s=o;for(h(r,e),r.originalEvent=e,r.preventDefault=p;v.element(s);){for(var a=0;a=l.length)break;u=l[p++]}else{if(p=l.next(),p.done)break;u=p.value}var d=u,f=o[d](a);if(f)return f}},simulationResume:function(e){var t=e.pointerType,n=e.eventType,o=e.eventTarget;if(!/down|start/i.test(n))return null;for(var s=r.interactions,a=Array.isArray(s),l=0,s=a?s:s[Symbol.iterator]();;){var c;if(a){if(l>=s.length)break;c=s[l++]}else{if(l=s.next(),l.done)break;c=l.value}var p=c,u=o;if(p.simulation&&p.simulation.allowResume&&p.pointerType===t)for(;u;){if(u===p.element)return p;u=i.parentNode(u)}}return null},mouseOrPen:function(e){var t=e.pointerId,n=e.pointerType,o=e.eventType;if("mouse"!==n&&"pen"!==n)return null;for(var s=void 0,a=r.interactions,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var u=p;if(u.pointerType===n){if(u.simulation&&!i.contains(u.pointerIds,t))continue;if(u.interacting())return u;s||(s=u)}}if(s)return s;for(var d=r.interactions,f=Array.isArray(d),v=0,d=f?d:d[Symbol.iterator]();;){var g;if(f){if(v>=d.length)break;g=d[v++]}else{if(v=d.next(),v.done)break;g=v.value}var h=g;if(!(h.pointerType!==n||/down/i.test(o)&&h.simulation))return h}return null},hasPointer:function(e){for(var t=e.pointerId,n=r.interactions,o=Array.isArray(n),s=0,n=o?n:n[Symbol.iterator]();;){var a;if(o){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var l=a;if(i.contains(l.pointerIds,t))return l}},idle:function(e){for(var t=e.pointerType,n=r.interactions,i=Array.isArray(n),o=0,n=i?n:n[Symbol.iterator]();;){var s;if(i){if(o>=n.length)break;s=n[o++]}else{if(o=n.next(),o.done)break;s=o.value}var a=s;if(1===a.pointerIds.length){var l=a.target;if(l&&!l.options.gesture.enabled)continue}else if(a.pointerIds.length>=2)continue;if(!a.interacting()&&t===a.pointerType)return a}return null}};t.exports=o},{"../scope":34,"./index":44}],46:[function(e,t,n){"use strict";var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},i=e("./window"),o=e("./isWindow"),s={array:function(){},window:function(e){return e===i.window||o(e)},docFrag:function(e){return s.object(e)&&11===e.nodeType},object:function(e){return!!e&&"object"===(void 0===e?"undefined":r(e))},function:function(e){return"function"==typeof e},number:function(e){return"number"==typeof e},bool:function(e){return"boolean"==typeof e},string:function(e){return"string"==typeof e},element:function(e){if(!e||"object"!==(void 0===e?"undefined":r(e)))return!1;var t=i.getWindow(e)||i.window;return/object|function/.test(r(t.Element))?e instanceof t.Element:1===e.nodeType&&"string"==typeof e.nodeName}};s.array=function(e){return s.object(e)&&void 0!==e.length&&s.function(e.splice)},t.exports=s},{"./isWindow":47,"./window":52}],47:[function(e,t,n){"use strict";t.exports=function(e){return!(!e||!e.Window)&&e instanceof e.Window}},{}],48:[function(e,t,n){"use strict";function r(e,n){for(var r in n){var i=t.exports.prefixedPropREs,o=!1;for(var s in i)if(0===r.indexOf(s)&&i[s].test(r)){o=!0;break}o||"function"==typeof n[r]||(e[r]=n[r])}return e}r.prefixedPropREs={webkit:/(Movement[XY]|Radius[XY]|RotationAngle|Force)$/},t.exports=r},{}],49:[function(e,t,n){"use strict";var r=e("./hypot"),i=e("./browser"),o=e("./domObjects"),s=e("./domUtils"),a=e("./domObjects"),l=e("./is"),c=e("./pointerExtend"),p={copyCoords:function(e,t){e.page=e.page||{},e.page.x=t.page.x,e.page.y=t.page.y,e.client=e.client||{},e.client.x=t.client.x,e.client.y=t.client.y,e.timeStamp=t.timeStamp},setCoordDeltas:function(e,t,n){e.page.x=n.page.x-t.page.x,e.page.y=n.page.y-t.page.y,e.client.x=n.client.x-t.client.x,e.client.y=n.client.y-t.client.y,e.timeStamp=n.timeStamp-t.timeStamp;var i=Math.max(e.timeStamp/1e3,.001);e.page.speed=r(e.page.x,e.page.y)/i,e.page.vx=e.page.x/i,e.page.vy=e.page.y/i,e.client.speed=r(e.client.x,e.page.y)/i,e.client.vx=e.client.x/i,e.client.vy=e.client.y/i},isNativePointer:function(e){return e instanceof o.Event||e instanceof o.Touch},getXY:function(e,t,n){return n=n||{},e=e||"page",n.x=t[e+"X"],n.y=t[e+"Y"],n},getPageXY:function(e,t){return t=t||{},i.isOperaMobile&&p.isNativePointer(e)?(p.getXY("screen",e,t),t.x+=window.scrollX,t.y+=window.scrollY):p.getXY("page",e,t),t},getClientXY:function(e,t){return t=t||{},i.isOperaMobile&&p.isNativePointer(e)?p.getXY("screen",e,t):p.getXY("client",e,t),t},getPointerId:function(e){return l.number(e.pointerId)?e.pointerId:e.identifier},setCoords:function(e,t,n){var r=t.length>1?p.pointerAverage(t):t[0],i={};p.getPageXY(r,i),e.page.x=i.x,e.page.y=i.y,p.getClientXY(r,i),e.client.x=i.x,e.client.y=i.y,e.timeStamp=l.number(n)?n:(new Date).getTime()},pointerExtend:c,getTouchPair:function(e){var t=[];return l.array(e)?(t[0]=e[0],t[1]=e[1]):"touchend"===e.type?1===e.touches.length?(t[0]=e.touches[0],t[1]=e.changedTouches[0]):0===e.touches.length&&(t[0]=e.changedTouches[0],t[1]=e.changedTouches[1]):(t[0]=e.touches[0],t[1]=e.touches[1]),t},pointerAverage:function(e){for(var t={pageX:0,pageY:0,clientX:0,clientY:0,screenX:0,screenY:0},n=e,r=Array.isArray(n),i=0,n=r?n:n[Symbol.iterator]();;){var o;if(r){if(i>=n.length)break;o=n[i++]}else{if(i=n.next(),i.done)break;o=i.value}var s=o;for(var a in t)t[a]+=s[a]}for(var l in t)t[l]/=e.length;return t},touchBBox:function(e){if(e.length||e.touches&&e.touches.length>1){var t=p.getTouchPair(e),n=Math.min(t[0].pageX,t[1].pageX),r=Math.min(t[0].pageY,t[1].pageY);return{x:n,y:r,left:n,top:r,width:Math.max(t[0].pageX,t[1].pageX)-n,height:Math.max(t[0].pageY,t[1].pageY)-r}}},touchDistance:function(e,t){var n=t+"X",i=t+"Y",o=p.getTouchPair(e),s=o[0][n]-o[1][n],a=o[0][i]-o[1][i];return r(s,a)},touchAngle:function(e,t,n){var r=n+"X",i=n+"Y",o=p.getTouchPair(e),s=o[1][r]-o[0][r],a=o[1][i]-o[0][i];return 180*Math.atan2(a,s)/Math.PI},getPointerType:function(e){return l.string(e.pointerType)?e.pointerType:l.number(e.pointerType)?[void 0,void 0,"touch","pen","mouse"][e.pointerType]:/touch/.test(e.type)||e instanceof a.Touch?"touch":"mouse"},getEventTargets:function(e){return[s.getActualElement(e.path?e.path[0]:e.target),s.getActualElement(e.currentTarget)]}};t.exports=p},{"./browser":37,"./domObjects":38,"./domUtils":39,"./hypot":43,"./is":46,"./pointerExtend":48}],50:[function(e,t,n){"use strict";for(var r=e("./window"),i=r.window,o=["ms","moz","webkit","o"],s=0,a=void 0,l=void 0,c=0;c\n * Open source under the MIT License.\n * https://raw.github.com/taye/interact.js/master/LICENSE\n */\n","/*\n * In a (windowless) server environment this file exports a factory function\n * that takes the window to use.\n *\n * var interact = require('interact.js')(windowObject);\n *\n * See https://github.com/taye/interact.js/issues/187\n */\nif (typeof window === 'undefined') {\n module.exports = function (window) {\n require('./src/utils/window').init(window);\n\n return require('./src/index');\n };\n}\nelse {\n module.exports = require('./src/index');\n}\n","const { indexOf } = require('./utils/arr');\nconst extend = require('./utils/extend.js');\n\nfunction fireUntilImmediateStopped (event, listeners) {\n for (let i = 0, len = listeners.length; i < len && !event.immediatePropagationStopped; i++) {\n listeners[i](event);\n }\n}\n\nclass Eventable {\n\n constructor (options) {\n this.options = extend({}, options || {});\n }\n\n fire (event) {\n let listeners;\n const onEvent = 'on' + event.type;\n const global = this.global;\n\n // Interactable#on() listeners\n if ((listeners = this[event.type])) {\n fireUntilImmediateStopped(event, listeners);\n }\n\n // interactable.onevent listener\n if (this[onEvent]) {\n this[onEvent](event);\n }\n\n // interact.on() listeners\n if (!event.propagationStopped && global && (listeners = global[event.type])) {\n fireUntilImmediateStopped(event, listeners);\n }\n }\n\n on (eventType, listener) {\n // if this type of event was never bound\n if (this[eventType]) {\n this[eventType].push(listener);\n }\n else {\n this[eventType] = [listener];\n }\n }\n\n off (eventType, listener) {\n // if it is an action event type\n const eventList = this[eventType];\n const index = eventList? indexOf(eventList, listener) : -1;\n\n if (index !== -1) {\n eventList.splice(index, 1);\n }\n\n if (eventList && eventList.length === 0 || !listener) {\n this[eventType] = listener;\n }\n }\n}\n\nmodule.exports = Eventable;\n","const extend = require('./utils/extend');\nconst getOriginXY = require('./utils/getOriginXY');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nclass InteractEvent {\n constructor (interaction, event, action, phase, element, related, preEnd = false) {\n const target = interaction.target;\n const deltaSource = (target && target.options || defaults).deltaSource;\n const origin = getOriginXY(target, element, action);\n const starting = phase === 'start';\n const ending = phase === 'end';\n const coords = starting? interaction.startCoords : interaction.curCoords;\n const prevEvent = interaction.prevEvent;\n\n element = element || interaction.element;\n\n const page = extend({}, coords.page);\n const client = extend({}, coords.client);\n\n page.x -= origin.x;\n page.y -= origin.y;\n\n client.x -= origin.x;\n client.y -= origin.y;\n\n this.ctrlKey = event.ctrlKey;\n this.altKey = event.altKey;\n this.shiftKey = event.shiftKey;\n this.metaKey = event.metaKey;\n this.button = event.button;\n this.buttons = event.buttons;\n this.target = element;\n this.currentTarget = element;\n this.relatedTarget = related || null;\n this.preEnd = preEnd;\n this.type = action + (phase || '');\n this.interaction = interaction;\n this.interactable = target;\n\n this.t0 = starting ? interaction.downTimes[interaction.downTimes.length - 1]\n : prevEvent.t0;\n\n const signalArg = {\n interaction,\n event,\n action,\n phase,\n element,\n related,\n page,\n client,\n coords,\n starting,\n ending,\n deltaSource,\n iEvent: this,\n };\n\n signals.fire('set-xy', signalArg);\n\n if (ending) {\n // use previous coords when ending\n this.pageX = prevEvent.pageX;\n this.pageY = prevEvent.pageY;\n this.clientX = prevEvent.clientX;\n this.clientY = prevEvent.clientY;\n }\n else {\n this.pageX = page.x;\n this.pageY = page.y;\n this.clientX = client.x;\n this.clientY = client.y;\n }\n\n this.x0 = interaction.startCoords.page.x - origin.x;\n this.y0 = interaction.startCoords.page.y - origin.y;\n this.clientX0 = interaction.startCoords.client.x - origin.x;\n this.clientY0 = interaction.startCoords.client.y - origin.y;\n\n signals.fire('set-delta', signalArg);\n\n this.timeStamp = coords.timeStamp;\n this.dt = interaction.pointerDelta.timeStamp;\n this.duration = this.timeStamp - this.t0;\n\n // speed and velocity in pixels per second\n this.speed = interaction.pointerDelta[deltaSource].speed;\n this.velocityX = interaction.pointerDelta[deltaSource].vx;\n this.velocityY = interaction.pointerDelta[deltaSource].vy;\n\n this.swipe = (ending || phase === 'inertiastart')? this.getSwipe() : null;\n\n signals.fire('new', signalArg);\n }\n\n getSwipe () {\n const interaction = this.interaction;\n\n if (interaction.prevEvent.speed < 600\n || this.timeStamp - interaction.prevEvent.timeStamp > 150) {\n return null;\n }\n\n let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI;\n const overlap = 22.5;\n\n if (angle < 0) {\n angle += 360;\n }\n\n const left = 135 - overlap <= angle && angle < 225 + overlap;\n const up = 225 - overlap <= angle && angle < 315 + overlap;\n\n const right = !left && (315 - overlap <= angle || angle < 45 + overlap);\n const down = !up && 45 - overlap <= angle && angle < 135 + overlap;\n\n return {\n up,\n down,\n left,\n right,\n angle,\n speed: interaction.prevEvent.speed,\n velocity: {\n x: interaction.prevEvent.velocityX,\n y: interaction.prevEvent.velocityY,\n },\n };\n }\n\n preventDefault () {}\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n}\n\nsignals.on('set-delta', function ({ iEvent, interaction, starting, deltaSource }) {\n const prevEvent = starting? iEvent : interaction.prevEvent;\n\n if (deltaSource === 'client') {\n iEvent.dx = iEvent.clientX - prevEvent.clientX;\n iEvent.dy = iEvent.clientY - prevEvent.clientY;\n }\n else {\n iEvent.dx = iEvent.pageX - prevEvent.pageX;\n iEvent.dy = iEvent.pageY - prevEvent.pageY;\n }\n});\n\nInteractEvent.signals = signals;\n\nmodule.exports = InteractEvent;\n","const is = require('./utils/is');\nconst events = require('./utils/events');\nconst extend = require('./utils/extend');\nconst actions = require('./actions/base');\nconst scope = require('./scope');\nconst Eventable = require('./Eventable');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nconst {\n getElementRect,\n nodeContains,\n trySelector,\n} = require('./utils/domUtils');\nconst { getWindow } = require('./utils/window');\nconst { indexOf, contains } = require('./utils/arr');\nconst { wheelEvent } = require('./utils/browser');\n\n// all set interactables\nscope.interactables = [];\n\n/*\\\n * Interactable\n [ property ]\n **\n * Object type returned by @interact\n\\*/\nclass Interactable {\n constructor (target, options) {\n options = options || {};\n\n this.target = target;\n this.events = new Eventable();\n this._context = options.context || scope.document;\n this._win = getWindow(trySelector(target)? this._context : target);\n this._doc = this._win.document;\n\n signals.fire('new', {\n target,\n options,\n interactable: this,\n win: this._win,\n });\n\n scope.addDocument( this._doc, this._win );\n\n scope.interactables.push(this);\n\n this.set(options);\n }\n\n setOnEvents (action, phases) {\n const onAction = 'on' + action;\n\n if (is.function(phases.onstart) ) { this.events[onAction + 'start' ] = phases.onstart ; }\n if (is.function(phases.onmove) ) { this.events[onAction + 'move' ] = phases.onmove ; }\n if (is.function(phases.onend) ) { this.events[onAction + 'end' ] = phases.onend ; }\n if (is.function(phases.oninertiastart)) { this.events[onAction + 'inertiastart' ] = phases.oninertiastart ; }\n\n return this;\n }\n\n setPerAction (action, options) {\n // for all the default per-action options\n for (const option in options) {\n // if this option exists for this action\n if (option in defaults[action]) {\n // if the option in the options arg is an object value\n if (is.object(options[option])) {\n // duplicate the object\n this.options[action][option] = extend(this.options[action][option] || {}, options[option]);\n\n if (is.object(defaults.perAction[option]) && 'enabled' in defaults.perAction[option]) {\n this.options[action][option].enabled = options[option].enabled === false? false : true;\n }\n }\n else if (is.bool(options[option]) && is.object(defaults.perAction[option])) {\n this.options[action][option].enabled = options[option];\n }\n else if (options[option] !== undefined) {\n // or if it's not undefined, do a plain assignment\n this.options[action][option] = options[option];\n }\n }\n }\n }\n\n /*\\\n * Interactable.getRect\n [ method ]\n *\n * The default function to get an Interactables bounding rect. Can be\n * overridden using @Interactable.rectChecker.\n *\n - element (Element) #optional The element to measure.\n = (object) The object's bounding rectangle.\n o {\n o top : 0,\n o left : 0,\n o bottom: 0,\n o right : 0,\n o width : 0,\n o height: 0\n o }\n \\*/\n getRect (element) {\n element = element || this.target;\n\n if (is.string(this.target) && !(is.element(element))) {\n element = this._context.querySelector(this.target);\n }\n\n return getElementRect(element);\n }\n\n /*\\\n * Interactable.rectChecker\n [ method ]\n *\n * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n - checker (function) #optional A function which returns this Interactable's bounding rectangle. See @Interactable.getRect\n = (function | object) The checker function or this Interactable\n \\*/\n rectChecker (checker) {\n if (is.function(checker)) {\n this.getRect = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.getRect;\n\n return this;\n }\n\n return this.getRect;\n }\n\n _backCompatOption (optionName, newValue) {\n if (trySelector(newValue) || is.object(newValue)) {\n this.options[optionName] = newValue;\n\n for (const action of actions.names) {\n this.options[action][optionName] = newValue;\n }\n\n return this;\n }\n\n return this.options[optionName];\n }\n\n /*\\\n * Interactable.origin\n [ method ]\n *\n * Gets or sets the origin of the Interactable's element. The x and y\n * of the origin will be subtracted from action event coordinates.\n *\n - origin (object | string) #optional An object eg. { x: 0, y: 0 } or string 'parent', 'self' or any CSS selector\n * OR\n - origin (Element) #optional An HTML or SVG Element whose rect will be used\n **\n = (object) The current origin or this Interactable\n \\*/\n origin (newValue) {\n return this._backCompatOption('origin', newValue);\n }\n\n /*\\\n * Interactable.deltaSource\n [ method ]\n *\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n - newValue (string) #optional Use 'client' if you will be scrolling while interacting; Use 'page' if you want autoScroll to work\n = (string | object) The current deltaSource or this Interactable\n \\*/\n deltaSource (newValue) {\n if (newValue === 'page' || newValue === 'client') {\n this.options.deltaSource = newValue;\n\n return this;\n }\n\n return this.options.deltaSource;\n }\n\n /*\\\n * Interactable.context\n [ method ]\n *\n * Gets the selector context Node of the Interactable. The default is `window.document`.\n *\n = (Node) The context Node of this Interactable\n **\n \\*/\n context () {\n return this._context;\n }\n\n inContext (element) {\n return (this._context === element.ownerDocument\n || nodeContains(this._context, element));\n }\n\n /*\\\n * Interactable.fire\n [ method ]\n *\n * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n - iEvent (InteractEvent) The InteractEvent object to be fired on this Interactable\n = (Interactable) this Interactable\n \\*/\n fire (iEvent) {\n this.events.fire(iEvent);\n\n return this;\n }\n\n _onOffMultiple (method, eventType, listener, options) {\n if (is.string(eventType) && eventType.search(' ') !== -1) {\n eventType = eventType.trim().split(/ +/);\n }\n\n if (is.array(eventType)) {\n for (let i = 0; i < eventType.length; i++) {\n this[method](eventType[i], listener, options);\n }\n\n return true;\n }\n\n if (is.object(eventType)) {\n for (const prop in eventType) {\n this[method](prop, eventType[prop], listener);\n }\n\n return true;\n }\n }\n\n /*\\\n * Interactable.on\n [ method ]\n *\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n - eventType (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) This Interactable\n \\*/\n on (eventType, listener, options) {\n if (this._onOffMultiple('on', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.on(eventType, listener);\n }\n // delegated event for selector\n else if (is.string(this.target)) {\n events.addDelegate(this.target, this._context, eventType, listener, options);\n }\n else {\n events.add(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.off\n [ method ]\n *\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n - eventType (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) This Interactable\n \\*/\n off (eventType, listener, options) {\n if (this._onOffMultiple('off', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n // if it is an action event type\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.off(eventType, listener);\n }\n // delegated event\n else if (is.string(this.target)) {\n events.removeDelegate(this.target, this._context, eventType, listener, options);\n }\n // remove listener from this Interatable's element\n else {\n events.remove(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.set\n [ method ]\n *\n * Reset the options of this Interactable\n - options (object) The new settings to apply\n = (object) This Interactable\n \\*/\n set (options) {\n if (!is.object(options)) {\n options = {};\n }\n\n this.options = extend({}, defaults.base);\n\n const perActions = extend({}, defaults.perAction);\n\n for (const actionName in actions.methodDict) {\n const methodName = actions.methodDict[actionName];\n\n this.options[actionName] = extend({}, defaults[actionName]);\n\n this.setPerAction(actionName, perActions);\n\n this[methodName](options[actionName]);\n }\n\n for (const setting of Interactable.settingsMethods) {\n this.options[setting] = defaults.base[setting];\n\n if (setting in options) {\n this[setting](options[setting]);\n }\n }\n\n signals.fire('set', {\n options,\n interactable: this,\n });\n\n return this;\n }\n\n /*\\\n * Interactable.unset\n [ method ]\n *\n * Remove this interactable from the list of interactables and remove\n * it's action capabilities and event listeners\n *\n = (object) @interact\n \\*/\n unset () {\n events.remove(this.target, 'all');\n\n if (is.string(this.target)) {\n // remove delegated events\n for (const type in events.delegatedEvents) {\n const delegated = events.delegatedEvents[type];\n\n if (delegated.selectors[0] === this.target\n && delegated.contexts[0] === this._context) {\n\n delegated.selectors.splice(0, 1);\n delegated.contexts .splice(0, 1);\n delegated.listeners.splice(0, 1);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegated[type] = null;\n }\n }\n\n events.remove(this._context, type, events.delegateListener);\n events.remove(this._context, type, events.delegateUseCapture, true);\n }\n }\n else {\n events.remove(this, 'all');\n }\n\n signals.fire('unset', { interactable: this });\n\n scope.interactables.splice(indexOf(scope.interactables, this), 1);\n\n // Stop related interactions when an Interactable is unset\n for (const interaction of scope.interactions || []) {\n if (interaction.target === this && interaction.interacting()) {\n interaction.stop();\n }\n }\n\n return scope.interact;\n }\n}\n\nscope.interactables.indexOfElement = function indexOfElement (target, context) {\n context = context || scope.document;\n\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n if (interactable.target === target && interactable._context === context) {\n return i;\n }\n }\n return -1;\n};\n\nscope.interactables.get = function interactableGet (element, options, dontCheckInContext) {\n const ret = this[this.indexOfElement(element, options && options.context)];\n\n return ret && (is.string(element) || dontCheckInContext || ret.inContext(element))? ret : null;\n};\n\nscope.interactables.forEachSelector = function (callback, element) {\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n // skip non CSS selector targets and out of context elements\n if (!is.string(interactable.target)\n || (element && !interactable.inContext(element))) {\n continue;\n }\n\n const ret = callback(interactable, interactable.target, interactable._context, i, this);\n\n if (ret !== undefined) {\n return ret;\n }\n }\n};\n\n// all interact.js eventTypes\nInteractable.eventTypes = scope.eventTypes = [];\n\nInteractable.signals = signals;\n\nInteractable.settingsMethods = [ 'deltaSource', 'origin', 'preventDefault', 'rectChecker' ];\n\nmodule.exports = Interactable;\n","const scope = require('./scope');\nconst utils = require('./utils');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst finder = require('./utils/interactionFinder');\nconst signals = require('./utils/Signals').new();\n\nconst listeners = {};\nconst methodNames = [\n 'pointerDown', 'pointerMove', 'pointerUp',\n 'updatePointer', 'removePointer',\n];\n\n// for ignoring browser's simulated mouse events\nlet prevTouchTime = 0;\n\n// all active and idle interactions\nscope.interactions = [];\n\nclass Interaction {\n constructor () {\n this.target = null; // current interactable being interacted with\n this.element = null; // the target element of the interactable\n\n this.prepared = { // action that's ready to be fired on next move event\n name : null,\n axis : null,\n edges: null,\n };\n\n // keep track of added pointers\n this.pointers = [];\n this.pointerIds = [];\n this.downTargets = [];\n this.downTimes = [];\n\n // Previous native pointer move event coordinates\n this.prevCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n // current native pointer move event coordinates\n this.curCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Starting InteractEvent pointer coordinates\n this.startCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Change in coordinates and time of the pointer\n this.pointerDelta = {\n page : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n client : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n timeStamp: 0,\n };\n\n this.downEvent = null; // pointerdown/mousedown/touchstart event\n this.downPointer = {};\n\n this._eventTarget = null;\n this._curEventTarget = null;\n\n this.prevEvent = null; // previous action event\n\n this.pointerIsDown = false;\n this.pointerWasMoved = false;\n this._interacting = false;\n\n this.mouse = false;\n\n signals.fire('new', this);\n\n scope.interactions.push(this);\n }\n\n pointerDown (pointer, event, eventTarget) {\n const pointerIndex = this.updatePointer(pointer, event, true);\n\n signals.fire('down', {\n pointer,\n event,\n eventTarget,\n pointerIndex,\n interaction: this,\n });\n }\n\n /*\\\n * Interaction.start\n [ method ]\n *\n * Start an action with the given Interactable and Element as tartgets. The\n * action must be enabled for the target Interactable and an appropriate number\n * of pointers must be held down - 1 for drag/resize, 2 for gesture.\n *\n * Use it with `interactable.able({ manualStart: false })` to always\n * [start actions manually](https://github.com/taye/interact.js/issues/114)\n *\n - action (object) The action to be performed - drag, resize, etc.\n - target (Interactable) The Interactable to target\n - element (Element) The DOM Element to target\n = (object) interact\n **\n | interact(target)\n | .draggable({\n | // disable the default drag start by down->move\n | manualStart: true\n | })\n | // start dragging after the user holds the pointer down\n | .on('hold', function (event) {\n | var interaction = event.interaction;\n |\n | if (!interaction.interacting()) {\n | interaction.start({ name: 'drag' },\n | event.interactable,\n | event.currentTarget);\n | }\n | });\n \\*/\n start (action, target, element) {\n if (this.interacting()\n || !this.pointerIsDown\n || this.pointerIds.length < (action.name === 'gesture'? 2 : 1)) {\n return;\n }\n\n // if this interaction had been removed after stopping\n // add it back\n if (utils.indexOf(scope.interactions, this) === -1) {\n scope.interactions.push(this);\n }\n\n utils.copyAction(this.prepared, action);\n this.target = target;\n this.element = element;\n\n signals.fire('action-start', {\n interaction: this,\n event: this.downEvent,\n });\n }\n\n pointerMove (pointer, event, eventTarget) {\n if (!this.simulation) {\n this.updatePointer(pointer);\n utils.setCoords(this.curCoords, this.pointers);\n }\n\n const duplicateMove = (this.curCoords.page.x === this.prevCoords.page.x\n && this.curCoords.page.y === this.prevCoords.page.y\n && this.curCoords.client.x === this.prevCoords.client.x\n && this.curCoords.client.y === this.prevCoords.client.y);\n\n let dx;\n let dy;\n\n // register movement greater than pointerMoveTolerance\n if (this.pointerIsDown && !this.pointerWasMoved) {\n dx = this.curCoords.client.x - this.startCoords.client.x;\n dy = this.curCoords.client.y - this.startCoords.client.y;\n\n this.pointerWasMoved = utils.hypot(dx, dy) > Interaction.pointerMoveTolerance;\n }\n\n const signalArg = {\n pointer,\n pointerIndex: this.getPointerIndex(pointer),\n event,\n eventTarget,\n dx,\n dy,\n duplicate: duplicateMove,\n interaction: this,\n interactingBeforeMove: this.interacting(),\n };\n\n if (!duplicateMove) {\n // set pointer coordinate, time changes and speeds\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n }\n\n signals.fire('move', signalArg);\n\n if (!duplicateMove) {\n // if interacting, fire an 'action-move' signal etc\n if (this.interacting()) {\n this.doMove(signalArg);\n }\n\n if (this.pointerWasMoved) {\n utils.copyCoords(this.prevCoords, this.curCoords);\n }\n }\n }\n\n /*\\\n * Interaction.doMove\n [ method ]\n *\n * Force a move of the current action at the same coordinates. Useful if\n * snap/restrict has been changed and you want a movement with the new\n * settings.\n *\n **\n | interact(target)\n | .draggable(true)\n | .on('dragmove', function (event) {\n | if (someCondition) {\n | // change the snap settings\n | event.interactable.draggable({ snap: { targets: [] }});\n | // fire another move event with re-calculated snap\n | event.interaction.doMove();\n | }\n | });\n \\*/\n doMove (signalArg) {\n signalArg = utils.extend({\n pointer: this.pointers[0],\n event: this.prevEvent,\n eventTarget: this._eventTarget,\n interaction: this,\n }, signalArg || {});\n\n signals.fire('before-action-move', signalArg);\n\n if (!this._dontFireMove) {\n signals.fire('action-move', signalArg);\n }\n\n this._dontFireMove = false;\n }\n\n // End interact move events and stop auto-scroll unless simulation is running\n pointerUp (pointer, event, eventTarget, curEventTarget) {\n const pointerIndex = this.getPointerIndex(pointer);\n\n signals.fire(/cancel$/i.test(event.type)? 'cancel' : 'up', {\n pointer,\n pointerIndex,\n event,\n eventTarget,\n curEventTarget,\n interaction: this,\n });\n\n if (!this.simulation) {\n this.end(event);\n }\n\n this.pointerIsDown = false;\n this.removePointer(pointer, event);\n }\n\n /*\\\n * Interaction.end\n [ method ]\n *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n - event (PointerEvent) #optional\n **\n | interact(target)\n | .draggable(true)\n | .on('move', function (event) {\n | if (event.pageX > 1000) {\n | // end the current action\n | event.interaction.end();\n | // stop all further listeners from being called\n | event.stopImmediatePropagation();\n | }\n | });\n \\*/\n end (event) {\n event = event || this.prevEvent;\n\n if (this.interacting()) {\n signals.fire('action-end', {\n event,\n interaction: this,\n });\n }\n\n this.stop();\n }\n\n currentAction () {\n return this._interacting? this.prepared.name: null;\n }\n\n interacting () {\n return this._interacting;\n }\n\n stop () {\n signals.fire('stop', { interaction: this });\n\n if (this._interacting) {\n signals.fire('stop-active', { interaction: this });\n signals.fire('stop-' + this.prepared.name, { interaction: this });\n }\n\n this.target = this.element = null;\n\n this._interacting = false;\n this.prepared.name = this.prevEvent = null;\n }\n\n getPointerIndex (pointer) {\n return utils.indexOf(this.pointerIds, utils.getPointerId(pointer));\n }\n\n updatePointer (pointer, event, down = event && /(down|start)$/i.test(event.type)) {\n const id = utils.getPointerId(pointer);\n let index = this.getPointerIndex(pointer);\n\n if (index === -1) {\n index = this.pointerIds.length;\n this.pointerIds[index] = id;\n }\n\n if (down) {\n signals.fire('update-pointer-down', {\n pointer,\n event,\n down,\n pointerId: id,\n pointerIndex: index,\n interaction: this,\n });\n }\n\n this.pointers[index] = pointer;\n\n return index;\n }\n\n removePointer (pointer, event) {\n const id = utils.getPointerId(pointer);\n const index = this.mouse? 0 : utils.indexOf(this.pointerIds, id);\n\n if (index === -1) { return; }\n\n signals.fire('remove-pointer', {\n pointer,\n event,\n pointerIndex: index,\n interaction: this,\n });\n\n this.pointers .splice(index, 1);\n this.pointerIds .splice(index, 1);\n this.downTargets.splice(index, 1);\n this.downTimes .splice(index, 1);\n }\n\n _updateEventTargets (target, currentTarget) {\n this._eventTarget = target;\n this._curEventTarget = currentTarget;\n }\n}\n\nfor (let i = 0, len = methodNames.length; i < len; i++) {\n const method = methodNames[i];\n\n listeners[method] = doOnInteractions(method);\n}\n\nfunction doOnInteractions (method) {\n return (function (event) {\n const [eventTarget, curEventTarget] = utils.getEventTargets(event);\n const matches = []; // [ [pointer, interaction], ...]\n\n if (browser.supportsTouch && /touch/.test(event.type)) {\n prevTouchTime = new Date().getTime();\n\n for (let i = 0; i < event.changedTouches.length; i++) {\n const pointer = event.changedTouches[i];\n const interaction = finder.search(pointer, event.type, eventTarget);\n\n matches.push([pointer, interaction || new Interaction()]);\n }\n }\n else {\n let invalidPointer = false;\n\n if (!browser.supportsPointerEvent && /mouse/.test(event.type)) {\n // ignore mouse events while touch interactions are active\n for (let i = 0; i < scope.interactions.length && !invalidPointer; i++) {\n invalidPointer = !scope.interactions[i].mouse && scope.interactions[i].pointerIsDown;\n }\n\n // try to ignore mouse events that are simulated by the browser\n // after a touch event\n invalidPointer = invalidPointer\n || (new Date().getTime() - prevTouchTime < 500)\n // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated\n || event.timeStamp === 0;\n }\n\n if (!invalidPointer) {\n let interaction = finder.search(event, event.type, eventTarget);\n\n if (!interaction) {\n\n interaction = new Interaction();\n interaction.mouse = (/mouse/i.test(event.pointerType || event.type)\n // MSPointerEvent.MSPOINTER_TYPE_MOUSE\n || event.pointerType === 4\n || !event.pointerType);\n }\n\n matches.push([event, interaction]);\n }\n }\n\n for (const [pointer, interaction] of matches) {\n interaction._updateEventTargets(eventTarget, curEventTarget);\n interaction[method](pointer, event, eventTarget, curEventTarget);\n }\n });\n}\n\nfunction endAll (event) {\n for (let i = 0; i < scope.interactions.length; i++) {\n const interaction = scope.interactions[i];\n\n interaction.end(event);\n signals.fire('endall', { event, interaction });\n }\n}\n\nconst docEvents = { /* 'eventType': listenerFunc */ };\nconst pEventTypes = browser.pEventTypes;\n\nif (scope.PointerEvent) {\n docEvents[pEventTypes.down ] = listeners.pointerDown;\n docEvents[pEventTypes.move ] = listeners.pointerMove;\n docEvents[pEventTypes.up ] = listeners.pointerUp;\n docEvents[pEventTypes.cancel] = listeners.pointerUp;\n}\nelse {\n docEvents.mousedown = listeners.pointerDown;\n docEvents.mousemove = listeners.pointerMove;\n docEvents.mouseup = listeners.pointerUp;\n\n docEvents.touchstart = listeners.pointerDown;\n docEvents.touchmove = listeners.pointerMove;\n docEvents.touchend = listeners.pointerUp;\n docEvents.touchcancel = listeners.pointerUp;\n}\n\ndocEvents.blur = endAll;\n\nfunction onDocSignal ({ doc }, signalName) {\n const eventMethod = signalName.indexOf('add') === 0\n ? events.add : events.remove;\n\n // delegate event listener\n for (const eventType in scope.delegatedEvents) {\n eventMethod(doc, eventType, events.delegateListener);\n eventMethod(doc, eventType, events.delegateUseCapture, true);\n }\n\n for (const eventType in docEvents) {\n eventMethod(doc, eventType, docEvents[eventType]);\n }\n}\n\nsignals.on('update-pointer-down', ({ interaction, pointer, pointerId, pointerIndex, event, eventTarget, down }) => {\n interaction.pointerIds[pointerIndex] = pointerId;\n interaction.pointers[pointerIndex] = pointer;\n\n if (down) {\n interaction.pointerIsDown = true;\n }\n\n if (!interaction.interacting()) {\n utils.setCoords(interaction.startCoords, interaction.pointers);\n\n utils.copyCoords(interaction.curCoords , interaction.startCoords);\n utils.copyCoords(interaction.prevCoords, interaction.startCoords);\n\n interaction.downEvent = event;\n interaction.downTimes[pointerIndex] = interaction.curCoords.timeStamp;\n interaction.downTargets[pointerIndex] = eventTarget || event && utils.getEventTargets(event)[0];\n interaction.pointerWasMoved = false;\n\n utils.pointerExtend(interaction.downPointer, pointer);\n }\n});\n\nscope.signals.on('add-document' , onDocSignal);\nscope.signals.on('remove-document', onDocSignal);\n\nInteraction.pointerMoveTolerance = 1;\nInteraction.doOnInteractions = doOnInteractions;\nInteraction.endAll = endAll;\nInteraction.signals = signals;\nInteraction.docEvents = docEvents;\n\nscope.endAllInteractions = endAll;\n\nmodule.exports = Interaction;\n","const Interaction = require('../Interaction');\nconst InteractEvent = require('../InteractEvent');\n\nconst actions = {\n firePrepared,\n names: [],\n methodDict: {},\n};\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n interaction._interacting = true;\n firePrepared(interaction, event, 'start');\n});\n\nInteraction.signals.on('action-move', function ({ interaction, event, preEnd }) {\n firePrepared(interaction, event, 'move', preEnd);\n\n // if the action was ended in a listener\n if (!interaction.interacting()) { return false; }\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n firePrepared(interaction, event, 'end');\n});\n\nfunction firePrepared (interaction, event, phase, preEnd) {\n const actionName = interaction.prepared.name;\n\n const newEvent = new InteractEvent(interaction, event, actionName, phase, interaction.element, null, preEnd);\n\n interaction.target.fire(newEvent);\n interaction.prevEvent = newEvent;\n}\n\nmodule.exports = actions;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drag = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n startAxis : 'xy',\n lockAxis : 'xy',\n },\n\n checker: function (pointer, event, interactable) {\n const dragOptions = interactable.options.drag;\n\n return dragOptions.enabled\n ? { name: 'drag', axis: (dragOptions.lockAxis === 'start'\n ? dragOptions.startAxis\n : dragOptions.lockAxis)}\n : null;\n },\n\n getCursor: function () {\n return 'move';\n },\n};\n\nInteraction.signals.on('before-action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n interaction.curCoords.page.y = interaction.startCoords.page.y;\n interaction.curCoords.client.y = interaction.startCoords.client.y;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vx);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vx);\n interaction.pointerDelta.client.vy = 0;\n interaction.pointerDelta.page.vy = 0;\n }\n else if (axis === 'y') {\n interaction.curCoords.page.x = interaction.startCoords.page.x;\n interaction.curCoords.client.x = interaction.startCoords.client.x;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vy);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vy);\n interaction.pointerDelta.client.vx = 0;\n interaction.pointerDelta.page.vx = 0;\n }\n});\n\n// dragmove\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'dragmove') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n iEvent.pageY = interaction.startCoords.page.y;\n iEvent.clientY = interaction.startCoords.client.y;\n iEvent.dy = 0;\n }\n else if (axis === 'y') {\n iEvent.pageX = interaction.startCoords.page.x;\n iEvent.clientX = interaction.startCoords.client.x;\n iEvent.dx = 0;\n }\n});\n\n/*\\\n * Interactable.draggable\n [ method ]\n *\n * Gets or sets whether drag actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of drag events\n | var isDraggable = interact('ul li').draggable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on drag events (object makes the Interactable draggable)\n = (object) This Interactable\n | interact(element).draggable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // the axis in which the first movement must be\n | // for the drag sequence to start\n | // 'xy' by default - any direction\n | startAxis: 'x' || 'y' || 'xy',\n |\n | // 'xy' by default - don't restrict to one axis (move in any direction)\n | // 'x' or 'y' to restrict movement to either axis\n | // 'start' to restrict movement to the axis the drag started in\n | lockAxis: 'x' || 'y' || 'xy' || 'start',\n |\n | // max number of drags that can happen concurrently\n | // with elements of this Interactable. Infinity by default\n | max: Infinity,\n |\n | // max number of drags that can target the same element+Interactable\n | // 1 by default\n | maxPerElement: 2\n | });\n\\*/\nInteractable.prototype.draggable = function (options) {\n if (utils.is.object(options)) {\n this.options.drag.enabled = options.enabled === false? false: true;\n this.setPerAction('drag', options);\n this.setOnEvents('drag', options);\n\n if (/^(xy|x|y|start)$/.test(options.lockAxis)) {\n this.options.drag.lockAxis = options.lockAxis;\n }\n if (/^(xy|x|y)$/.test(options.startAxis)) {\n this.options.drag.startAxis = options.startAxis;\n }\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drag.enabled = options;\n\n if (!options) {\n this.ondragstart = this.ondragstart = this.ondragend = null;\n }\n\n return this;\n }\n\n return this.options.drag;\n};\n\nactions.drag = drag;\nactions.names.push('drag');\nutils.merge(Interactable.eventTypes, [\n 'dragstart',\n 'dragmove',\n 'draginertiastart',\n 'draginertiaresume',\n 'dragend',\n]);\nactions.methodDict.drag = 'draggable';\n\ndefaultOptions.drag = drag.defaults;\n\nmodule.exports = drag;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst scope = require('../scope');\nconst interact = require('../interact');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drop = {\n defaults: {\n enabled: false,\n accept : null,\n overlap: 'pointer',\n },\n};\n\nlet dynamicDrop = false;\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // reset active dropzones\n interaction.activeDrops.dropzones = [];\n interaction.activeDrops.elements = [];\n interaction.activeDrops.rects = [];\n\n interaction.dropEvents = null;\n\n if (!interaction.dynamicDrop) {\n setActiveDrops(interaction, interaction.element);\n }\n\n const dragEvent = interaction.prevEvent;\n const dropEvents = getDropEvents(interaction, event, dragEvent);\n\n if (dropEvents.activate) {\n fireActiveDrops(interaction, dropEvents.activate);\n }\n});\n\nInteractEvent.signals.on('new', function ({ interaction, iEvent, event }) {\n if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { return; }\n\n const draggableElement = interaction.element;\n const dragEvent = iEvent;\n const dropResult = getDrop(dragEvent, event, draggableElement);\n\n interaction.dropTarget = dropResult.dropzone;\n interaction.dropElement = dropResult.element;\n\n interaction.dropEvents = getDropEvents(interaction, event, dragEvent);\n});\n\nInteraction.signals.on('action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n fireDropEvents(interaction, interaction.dropEvents);\n});\n\nInteraction.signals.on('action-end', function ({ interaction }) {\n if (interaction.prepared.name === 'drag') {\n fireDropEvents(interaction, interaction.dropEvents);\n }\n});\n\nInteraction.signals.on('stop-drag', function ({ interaction }) {\n interaction.activeDrops.dropzones =\n interaction.activeDrops.elements =\n interaction.activeDrops.rects =\n interaction.dropEvents = null;\n});\n\nfunction collectDrops (interaction, element) {\n const drops = [];\n const elements = [];\n\n element = element || interaction.element;\n\n // collect all dropzones and their elements which qualify for a drop\n for (const current of scope.interactables) {\n if (!current.options.drop.enabled) { continue; }\n\n const accept = current.options.drop.accept;\n\n // test the draggable element against the dropzone's accept setting\n if ((utils.is.element(accept) && accept !== element)\n || (utils.is.string(accept)\n && !utils.matchesSelector(element, accept))) {\n\n continue;\n }\n\n // query for new elements if necessary\n const dropElements = utils.is.string(current.target)\n ? current._context.querySelectorAll(current.target)\n : [current.target];\n\n for (let i = 0; i < dropElements.length; i++) {\n const currentElement = dropElements[i];\n\n if (currentElement !== element) {\n drops.push(current);\n elements.push(currentElement);\n }\n }\n }\n\n return {\n elements,\n dropzones: drops,\n };\n}\n\nfunction fireActiveDrops (interaction, event) {\n let prevElement;\n\n // loop through all active dropzones and trigger event\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n const current = interaction.activeDrops.dropzones[i];\n const currentElement = interaction.activeDrops.elements [i];\n\n // prevent trigger of duplicate events on same element\n if (currentElement !== prevElement) {\n // set current element as event target\n event.target = currentElement;\n current.fire(event);\n }\n prevElement = currentElement;\n }\n}\n\n// Collect a new set of possible drops and save them in activeDrops.\n// setActiveDrops should always be called when a drag has just started or a\n// drag event happens while dynamicDrop is true\nfunction setActiveDrops (interaction, dragElement) {\n // get dropzones and their elements that could receive the draggable\n const possibleDrops = collectDrops(interaction, dragElement, true);\n\n interaction.activeDrops.dropzones = possibleDrops.dropzones;\n interaction.activeDrops.elements = possibleDrops.elements;\n interaction.activeDrops.rects = [];\n\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n interaction.activeDrops.rects[i] =\n interaction.activeDrops.dropzones[i].getRect(interaction.activeDrops.elements[i]);\n }\n}\n\nfunction getDrop (dragEvent, event, dragElement) {\n const interaction = dragEvent.interaction;\n const validDrops = [];\n\n if (dynamicDrop) {\n setActiveDrops(interaction, dragElement);\n }\n\n // collect all dropzones and their elements which qualify for a drop\n for (let j = 0; j < interaction.activeDrops.dropzones.length; j++) {\n const current = interaction.activeDrops.dropzones[j];\n const currentElement = interaction.activeDrops.elements [j];\n const rect = interaction.activeDrops.rects [j];\n\n validDrops.push(current.dropCheck(dragEvent, event, interaction.target, dragElement, currentElement, rect)\n ? currentElement\n : null);\n }\n\n // get the most appropriate dropzone based on DOM depth and order\n const dropIndex = utils.indexOfDeepestElement(validDrops);\n\n return {\n dropzone: interaction.activeDrops.dropzones[dropIndex] || null,\n element : interaction.activeDrops.elements [dropIndex] || null,\n };\n}\n\nfunction getDropEvents (interaction, pointerEvent, dragEvent) {\n const dropEvents = {\n enter : null,\n leave : null,\n activate : null,\n deactivate: null,\n move : null,\n drop : null,\n };\n\n const tmpl = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n };\n\n if (interaction.dropElement !== interaction.prevDropElement) {\n // if there was a prevDropTarget, create a dragleave event\n if (interaction.prevDropTarget) {\n dropEvents.leave = utils.extend({ type: 'dragleave' }, tmpl);\n\n dragEvent.dragLeave = dropEvents.leave.target = interaction.prevDropElement;\n dragEvent.prevDropzone = dropEvents.leave.dropzone = interaction.prevDropTarget;\n }\n // if the dropTarget is not null, create a dragenter event\n if (interaction.dropTarget) {\n dropEvents.enter = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n type : 'dragenter',\n };\n\n dragEvent.dragEnter = interaction.dropElement;\n dragEvent.dropzone = interaction.dropTarget;\n }\n }\n\n if (dragEvent.type === 'dragend' && interaction.dropTarget) {\n dropEvents.drop = utils.extend({ type: 'drop' }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n dragEvent.relatedTarget = interaction.dropElement;\n }\n if (dragEvent.type === 'dragstart') {\n dropEvents.activate = utils.extend({ type: 'dropactivate' }, tmpl);\n\n dropEvents.activate.target = null;\n dropEvents.activate.dropzone = null;\n }\n if (dragEvent.type === 'dragend') {\n dropEvents.deactivate = utils.extend({ type: 'dropdeactivate' }, tmpl);\n\n dropEvents.deactivate.target = null;\n dropEvents.deactivate.dropzone = null;\n }\n if (dragEvent.type === 'dragmove' && interaction.dropTarget) {\n dropEvents.move = utils.extend({\n dragmove : dragEvent,\n type : 'dropmove',\n }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n }\n\n return dropEvents;\n}\n\nfunction fireDropEvents (interaction, dropEvents) {\n if (dropEvents.leave) { interaction.prevDropTarget.fire(dropEvents.leave); }\n if (dropEvents.move ) { interaction.dropTarget.fire(dropEvents.move ); }\n if (dropEvents.enter) { interaction.dropTarget.fire(dropEvents.enter); }\n if (dropEvents.drop ) { interaction.dropTarget.fire(dropEvents.drop ); }\n if (dropEvents.deactivate) {\n fireActiveDrops(interaction, dropEvents.deactivate);\n }\n\n interaction.prevDropTarget = interaction.dropTarget;\n interaction.prevDropElement = interaction.dropElement;\n}\n\n/*\\\n * Interactable.dropzone\n [ method ]\n *\n * Returns or sets whether elements can be dropped onto this\n * Interactable to trigger drop events\n *\n * Dropzones can receive the following events:\n * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends\n * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone\n * - `dragmove` when a draggable that has entered the dropzone is moved\n * - `drop` when a draggable is dropped into this dropzone\n *\n * Use the `accept` option to allow only elements that match the given CSS\n * selector or element. The value can be:\n *\n * - **an Element** - only that element can be dropped into this dropzone.\n * - **a string**, - the element being dragged must match it as a CSS selector.\n * - **`null`** - accept options is cleared - it accepts any element.\n *\n * Use the `overlap` option to set how drops are checked for. The allowed\n * values are:\n *\n * - `'pointer'`, the pointer must be over the dropzone (default)\n * - `'center'`, the draggable element's center must be over the dropzone\n * - a number from 0-1 which is the `(intersection area) / (draggable area)`.\n * e.g. `0.5` for drop to happen when half of the area of the draggable is\n * over the dropzone\n *\n * Use the `checker` option to specify a function to check if a dragged\n * element is over this Interactable.\n *\n | interact(target)\n | .dropChecker(function(dragEvent, // related dragmove or dragend event\n | event, // TouchEvent/PointerEvent/MouseEvent\n | dropped, // bool result of the default checker\n | dropzone, // dropzone Interactable\n | dropElement, // dropzone elemnt\n | draggable, // draggable Interactable\n | draggableElement) {// draggable element\n |\n | return dropped && event.target.hasAttribute('allow-drop');\n | }\n *\n *\n - options (boolean | object | null) #optional The new value to be set.\n | interact('.drop').dropzone({\n | accept: '.can-drop' || document.getElementById('single-drop'),\n | overlap: 'pointer' || 'center' || zeroToOne\n | }\n = (boolean | object) The current setting or this Interactable\n\\*/\nInteractable.prototype.dropzone = function (options) {\n if (utils.is.object(options)) {\n this.options.drop.enabled = options.enabled === false? false: true;\n\n if (utils.is.function(options.ondrop) ) { this.events.ondrop = options.ondrop ; }\n if (utils.is.function(options.ondropactivate) ) { this.events.ondropactivate = options.ondropactivate ; }\n if (utils.is.function(options.ondropdeactivate)) { this.events.ondropdeactivate = options.ondropdeactivate; }\n if (utils.is.function(options.ondragenter) ) { this.events.ondragenter = options.ondragenter ; }\n if (utils.is.function(options.ondragleave) ) { this.events.ondragleave = options.ondragleave ; }\n if (utils.is.function(options.ondropmove) ) { this.events.ondropmove = options.ondropmove ; }\n\n if (/^(pointer|center)$/.test(options.overlap)) {\n this.options.drop.overlap = options.overlap;\n }\n else if (utils.is.number(options.overlap)) {\n this.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0);\n }\n if ('accept' in options) {\n this.options.drop.accept = options.accept;\n }\n if ('checker' in options) {\n this.options.drop.checker = options.checker;\n }\n\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drop.enabled = options;\n\n if (!options) {\n this.ondragenter = this.ondragleave = this.ondrop\n = this.ondropactivate = this.ondropdeactivate = null;\n }\n\n return this;\n }\n\n return this.options.drop;\n};\n\nInteractable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) {\n let dropped = false;\n\n // if the dropzone has no rect (eg. display: none)\n // call the custom dropChecker or just return false\n if (!(rect = rect || this.getRect(dropElement))) {\n return (this.options.drop.checker\n ? this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement)\n : false);\n }\n\n const dropOverlap = this.options.drop.overlap;\n\n if (dropOverlap === 'pointer') {\n const origin = utils.getOriginXY(draggable, draggableElement, 'drag');\n const page = utils.getPageXY(dragEvent);\n\n page.x += origin.x;\n page.y += origin.y;\n\n const horizontal = (page.x > rect.left) && (page.x < rect.right);\n const vertical = (page.y > rect.top ) && (page.y < rect.bottom);\n\n dropped = horizontal && vertical;\n }\n\n const dragRect = draggable.getRect(draggableElement);\n\n if (dragRect && dropOverlap === 'center') {\n const cx = dragRect.left + dragRect.width / 2;\n const cy = dragRect.top + dragRect.height / 2;\n\n dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom;\n }\n\n if (dragRect && utils.is.number(dropOverlap)) {\n const overlapArea = (Math.max(0, Math.min(rect.right , dragRect.right ) - Math.max(rect.left, dragRect.left))\n * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top , dragRect.top )));\n\n const overlapRatio = overlapArea / (dragRect.width * dragRect.height);\n\n dropped = overlapRatio >= dropOverlap;\n }\n\n if (this.options.drop.checker) {\n dropped = this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement);\n }\n\n return dropped;\n};\n\nInteractable.signals.on('unset', function ({ interactable }) {\n interactable.dropzone(false);\n});\n\nInteractable.settingsMethods.push('dropChecker');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.dropTarget = null; // the dropzone a drag target might be dropped into\n interaction.dropElement = null; // the element at the time of checking\n interaction.prevDropTarget = null; // the dropzone that was recently dragged away from\n interaction.prevDropElement = null; // the element at the time of checking\n interaction.dropEvents = null; // the dropEvents related to the current drag event\n\n interaction.activeDrops = {\n dropzones: [], // the dropzones that are mentioned below\n elements : [], // elements of dropzones that accept the target draggable\n rects : [], // the rects of the elements mentioned above\n };\n\n});\n\nInteraction.signals.on('stop', function ({ interaction }) {\n interaction.dropTarget = interaction.dropElement =\n interaction.prevDropTarget = interaction.prevDropElement = null;\n});\n\n/*\\\n * interact.dynamicDrop\n [ method ]\n *\n * Returns or sets whether the dimensions of dropzone elements are\n * calculated on every dragmove or only on dragstart for the default\n * dropChecker\n *\n - newValue (boolean) #optional True to check on each move. False to check only before start\n = (boolean | interact) The current setting or interact\n\\*/\ninteract.dynamicDrop = function (newValue) {\n if (utils.is.bool(newValue)) {\n //if (dragging && dynamicDrop !== newValue && !newValue) {\n //calcRects(dropzones);\n //}\n\n dynamicDrop = newValue;\n\n return interact;\n }\n return dynamicDrop;\n};\n\nutils.merge(Interactable.eventTypes, [\n 'dragenter',\n 'dragleave',\n 'dropactivate',\n 'dropdeactivate',\n 'dropmove',\n 'drop',\n]);\nactions.methodDict.drop = 'dropzone';\n\ndefaultOptions.drop = drop.defaults;\n\nmodule.exports = drop;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst gesture = {\n defaults: {\n enabled : false,\n origin : null,\n restrict: null,\n },\n\n checker: function (pointer, event, interactable, element, interaction) {\n if (interaction.pointerIds.length >= 2) {\n return { name: 'gesture' };\n }\n\n return null;\n },\n\n getCursor: function () {\n return '';\n },\n};\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturestart') { return; }\n iEvent.ds = 0;\n\n interaction.gesture.startDistance = interaction.gesture.prevDistance = iEvent.distance;\n interaction.gesture.startAngle = interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.scale = 1;\n});\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturemove') { return; }\n\n iEvent.ds = iEvent.scale - interaction.gesture.scale;\n\n interaction.target.fire(iEvent);\n\n interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.prevDistance = iEvent.distance;\n\n if (iEvent.scale !== Infinity\n && iEvent.scale !== null\n && iEvent.scale !== undefined\n && !isNaN(iEvent.scale)) {\n\n interaction.gesture.scale = iEvent.scale;\n }\n});\n\n/*\\\n * Interactable.gesturable\n [ method ]\n *\n * Gets or sets whether multitouch gestures can be performed on the\n * Interactable's element\n *\n = (boolean) Indicates if this can be the target of gesture events\n | var isGestureable = interact(element).gesturable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on gesture events (makes the Interactable gesturable)\n = (object) this Interactable\n | interact(element).gesturable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // limit multiple gestures.\n | // See the explanation in @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n\\*/\nInteractable.prototype.gesturable = function (options) {\n if (utils.is.object(options)) {\n this.options.gesture.enabled = options.enabled === false? false: true;\n this.setPerAction('gesture', options);\n this.setOnEvents('gesture', options);\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.gesture.enabled = options;\n\n if (!options) {\n this.ongesturestart = this.ongesturestart = this.ongestureend = null;\n }\n\n return this;\n }\n\n return this.options.gesture;\n};\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action, event, starting, ending, deltaSource }) {\n if (action !== 'gesture') { return; }\n\n const pointers = interaction.pointers;\n\n iEvent.touches = [pointers[0], pointers[1]];\n\n if (starting) {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = 1;\n iEvent.ds = 0;\n iEvent.angle = utils.touchAngle(pointers, undefined, deltaSource);\n iEvent.da = 0;\n }\n else if (ending || event instanceof InteractEvent) {\n iEvent.distance = interaction.prevEvent.distance;\n iEvent.box = interaction.prevEvent.box;\n iEvent.scale = interaction.prevEvent.scale;\n iEvent.ds = iEvent.scale - 1;\n iEvent.angle = interaction.prevEvent.angle;\n iEvent.da = iEvent.angle - interaction.gesture.startAngle;\n }\n else {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = iEvent.distance / interaction.gesture.startDistance;\n iEvent.angle = utils.touchAngle(pointers, interaction.gesture.prevAngle, deltaSource);\n\n iEvent.ds = iEvent.scale - interaction.gesture.prevScale;\n iEvent.da = iEvent.angle - interaction.gesture.prevAngle;\n }\n});\n\nInteraction.signals.on('new', function (interaction) {\n interaction.gesture = {\n start: { x: 0, y: 0 },\n\n startDistance: 0, // distance between two touches of touchStart\n prevDistance : 0,\n distance : 0,\n\n scale: 1, // gesture.distance / gesture.startDistance\n\n startAngle: 0, // angle of line joining two touches\n prevAngle : 0, // angle of the previous gesture event\n };\n});\n\nactions.gesture = gesture;\nactions.names.push('gesture');\nutils.merge(Interactable.eventTypes, [\n 'gesturestart',\n 'gesturemove',\n 'gestureend',\n]);\nactions.methodDict.gesture = 'gesturable';\n\ndefaultOptions.gesture = gesture.defaults;\n\nmodule.exports = gesture;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\n// Less Precision with touch input\nconst defaultMargin = browser.supportsTouch || browser.supportsPointerEvent? 20: 10;\n\nconst resize = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n square: false,\n preserveAspectRatio: false,\n axis: 'xy',\n\n // use default margin\n margin: NaN,\n\n // object with props left, right, top, bottom which are\n // true/false values to resize when the pointer is over that edge,\n // CSS selectors to match the handles for each direction\n // or the Elements for each handle\n edges: null,\n\n // a value of 'none' will limit the resize rect to a minimum of 0x0\n // 'negate' will alow the rect to have negative width/height\n // 'reposition' will keep the width/height positive by swapping\n // the top and bottom edges and/or swapping the left and right edges\n invert: 'none',\n },\n\n checker: function (pointer, event, interactable, element, interaction, rect) {\n if (!rect) { return null; }\n\n const page = utils.extend({}, interaction.curCoords.page);\n const options = interactable.options;\n\n if (options.resize.enabled) {\n const resizeOptions = options.resize;\n const resizeEdges = { left: false, right: false, top: false, bottom: false };\n\n // if using resize.edges\n if (utils.is.object(resizeOptions.edges)) {\n for (const edge in resizeEdges) {\n resizeEdges[edge] = checkResizeEdge(edge,\n resizeOptions.edges[edge],\n page,\n interaction._eventTarget,\n element,\n rect,\n resizeOptions.margin || defaultMargin);\n }\n\n resizeEdges.left = resizeEdges.left && !resizeEdges.right;\n resizeEdges.top = resizeEdges.top && !resizeEdges.bottom;\n\n if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) {\n return {\n name: 'resize',\n edges: resizeEdges,\n };\n }\n }\n else {\n const right = options.resize.axis !== 'y' && page.x > (rect.right - defaultMargin);\n const bottom = options.resize.axis !== 'x' && page.y > (rect.bottom - defaultMargin);\n\n if (right || bottom) {\n return {\n name: 'resize',\n axes: (right? 'x' : '') + (bottom? 'y' : ''),\n };\n }\n }\n }\n\n return null;\n },\n\n cursors: (browser.isIe9OrOlder ? {\n x : 'e-resize',\n y : 's-resize',\n xy: 'se-resize',\n\n top : 'n-resize',\n left : 'w-resize',\n bottom : 's-resize',\n right : 'e-resize',\n topleft : 'se-resize',\n bottomright: 'se-resize',\n topright : 'ne-resize',\n bottomleft : 'ne-resize',\n } : {\n x : 'ew-resize',\n y : 'ns-resize',\n xy: 'nwse-resize',\n\n top : 'ns-resize',\n left : 'ew-resize',\n bottom : 'ns-resize',\n right : 'ew-resize',\n topleft : 'nwse-resize',\n bottomright: 'nwse-resize',\n topright : 'nesw-resize',\n bottomleft : 'nesw-resize',\n }),\n\n getCursor: function (action) {\n if (action.axis) {\n return resize.cursors[action.name + action.axis];\n }\n else if (action.edges) {\n let cursorKey = '';\n const edgeNames = ['top', 'bottom', 'left', 'right'];\n\n for (let i = 0; i < 4; i++) {\n if (action.edges[edgeNames[i]]) {\n cursorKey += edgeNames[i];\n }\n }\n\n return resize.cursors[cursorKey];\n }\n },\n};\n\n// resizestart\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'resizestart' || !interaction.prepared.edges) {\n return;\n }\n\n const startRect = interaction.target.getRect(interaction.element);\n const resizeOptions = interaction.target.options.resize;\n\n /*\n * When using the `resizable.square` or `resizable.preserveAspectRatio` options, resizing from one edge\n * will affect another. E.g. with `resizable.square`, resizing to make the right edge larger will make\n * the bottom edge larger by the same amount. We call these 'linked' edges. Any linked edges will depend\n * on the active edges and the edge being interacted with.\n */\n if (resizeOptions.square || resizeOptions.preserveAspectRatio) {\n const linkedEdges = utils.extend({}, interaction.prepared.edges);\n\n linkedEdges.top = linkedEdges.top || (linkedEdges.left && !linkedEdges.bottom);\n linkedEdges.left = linkedEdges.left || (linkedEdges.top && !linkedEdges.right );\n linkedEdges.bottom = linkedEdges.bottom || (linkedEdges.right && !linkedEdges.top );\n linkedEdges.right = linkedEdges.right || (linkedEdges.bottom && !linkedEdges.left );\n\n interaction.prepared._linkedEdges = linkedEdges;\n }\n else {\n interaction.prepared._linkedEdges = null;\n }\n\n // if using `resizable.preserveAspectRatio` option, record aspect ratio at the start of the resize\n if (resizeOptions.preserveAspectRatio) {\n interaction.resizeStartAspectRatio = startRect.width / startRect.height;\n }\n\n interaction.resizeRects = {\n start : startRect,\n current : utils.extend({}, startRect),\n inverted : utils.extend({}, startRect),\n previous : utils.extend({}, startRect),\n delta : {\n left: 0, right : 0, width : 0,\n top : 0, bottom: 0, height: 0,\n },\n };\n\n iEvent.rect = interaction.resizeRects.inverted;\n iEvent.deltaRect = interaction.resizeRects.delta;\n});\n\n// resizemove\nInteractEvent.signals.on('new', function ({ iEvent, phase, interaction }) {\n if (phase !== 'move' || !interaction.prepared.edges) { return; }\n\n const resizeOptions = interaction.target.options.resize;\n const invert = resizeOptions.invert;\n const invertible = invert === 'reposition' || invert === 'negate';\n\n let edges = interaction.prepared.edges;\n\n const start = interaction.resizeRects.start;\n const current = interaction.resizeRects.current;\n const inverted = interaction.resizeRects.inverted;\n const delta = interaction.resizeRects.delta;\n const previous = utils.extend(interaction.resizeRects.previous, inverted);\n const originalEdges = edges;\n\n let dx = iEvent.dx;\n let dy = iEvent.dy;\n\n if (resizeOptions.preserveAspectRatio || resizeOptions.square) {\n // `resize.preserveAspectRatio` takes precedence over `resize.square`\n const startAspectRatio = resizeOptions.preserveAspectRatio\n ? interaction.resizeStartAspectRatio\n : 1;\n\n edges = interaction.prepared._linkedEdges;\n\n if ((originalEdges.left && originalEdges.bottom)\n || (originalEdges.right && originalEdges.top)) {\n dy = -dx / startAspectRatio;\n }\n else if (originalEdges.left || originalEdges.right ) { dy = dx / startAspectRatio; }\n else if (originalEdges.top || originalEdges.bottom) { dx = dy * startAspectRatio; }\n }\n\n // update the 'current' rect without modifications\n if (edges.top ) { current.top += dy; }\n if (edges.bottom) { current.bottom += dy; }\n if (edges.left ) { current.left += dx; }\n if (edges.right ) { current.right += dx; }\n\n if (invertible) {\n // if invertible, copy the current rect\n utils.extend(inverted, current);\n\n if (invert === 'reposition') {\n // swap edge values if necessary to keep width/height positive\n let swap;\n\n if (inverted.top > inverted.bottom) {\n swap = inverted.top;\n\n inverted.top = inverted.bottom;\n inverted.bottom = swap;\n }\n if (inverted.left > inverted.right) {\n swap = inverted.left;\n\n inverted.left = inverted.right;\n inverted.right = swap;\n }\n }\n }\n else {\n // if not invertible, restrict to minimum of 0x0 rect\n inverted.top = Math.min(current.top, start.bottom);\n inverted.bottom = Math.max(current.bottom, start.top);\n inverted.left = Math.min(current.left, start.right);\n inverted.right = Math.max(current.right, start.left);\n }\n\n inverted.width = inverted.right - inverted.left;\n inverted.height = inverted.bottom - inverted.top ;\n\n for (const edge in inverted) {\n delta[edge] = inverted[edge] - previous[edge];\n }\n\n iEvent.edges = interaction.prepared.edges;\n iEvent.rect = inverted;\n iEvent.deltaRect = delta;\n});\n\n/*\\\n * Interactable.resizable\n [ method ]\n *\n * Gets or sets whether resize actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of resize elements\n | var isResizeable = interact('input[type=text]').resizable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on resize events (object makes the Interactable resizable)\n = (object) This Interactable\n | interact(element).resizable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | edges: {\n | top : true, // Use pointer coords to check for resize.\n | left : false, // Disable resizing from left edge.\n | bottom: '.resize-s',// Resize if pointer target matches selector\n | right : handleEl // Resize if pointer target is the given Element\n | },\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height are adjusted at a 1:1 ratio.\n | square: false,\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height maintain the aspect ratio they had when resizing started.\n | preserveAspectRatio: false,\n |\n | // a value of 'none' will limit the resize rect to a minimum of 0x0\n | // 'negate' will allow the rect to have negative width/height\n | // 'reposition' will keep the width/height positive by swapping\n | // the top and bottom edges and/or swapping the left and right edges\n | invert: 'none' || 'negate' || 'reposition'\n |\n | // limit multiple resizes.\n | // See the explanation in the @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n \\*/\nInteractable.prototype.resizable = function (options) {\n if (utils.is.object(options)) {\n this.options.resize.enabled = options.enabled === false? false: true;\n this.setPerAction('resize', options);\n this.setOnEvents('resize', options);\n\n if (/^x$|^y$|^xy$/.test(options.axis)) {\n this.options.resize.axis = options.axis;\n }\n else if (options.axis === null) {\n this.options.resize.axis = defaultOptions.resize.axis;\n }\n\n if (utils.is.bool(options.preserveAspectRatio)) {\n this.options.resize.preserveAspectRatio = options.preserveAspectRatio;\n }\n else if (utils.is.bool(options.square)) {\n this.options.resize.square = options.square;\n }\n\n return this;\n }\n if (utils.is.bool(options)) {\n this.options.resize.enabled = options;\n\n if (!options) {\n this.onresizestart = this.onresizestart = this.onresizeend = null;\n }\n\n return this;\n }\n return this.options.resize;\n};\n\nfunction checkResizeEdge (name, value, page, element, interactableElement, rect, margin) {\n // false, '', undefined, null\n if (!value) { return false; }\n\n // true value, use pointer coords and element rect\n if (value === true) {\n // if dimensions are negative, \"switch\" edges\n const width = utils.is.number(rect.width )? rect.width : rect.right - rect.left;\n const height = utils.is.number(rect.height)? rect.height : rect.bottom - rect.top ;\n\n if (width < 0) {\n if (name === 'left' ) { name = 'right'; }\n else if (name === 'right') { name = 'left' ; }\n }\n if (height < 0) {\n if (name === 'top' ) { name = 'bottom'; }\n else if (name === 'bottom') { name = 'top' ; }\n }\n\n if (name === 'left' ) { return page.x < ((width >= 0? rect.left: rect.right ) + margin); }\n if (name === 'top' ) { return page.y < ((height >= 0? rect.top : rect.bottom) + margin); }\n\n if (name === 'right' ) { return page.x > ((width >= 0? rect.right : rect.left) - margin); }\n if (name === 'bottom') { return page.y > ((height >= 0? rect.bottom: rect.top ) - margin); }\n }\n\n // the remaining checks require an element\n if (!utils.is.element(element)) { return false; }\n\n return utils.is.element(value)\n // the value is an element to use as a resize handle\n ? value === element\n // otherwise check if element matches value as selector\n : utils.matchesUpTo(element, value, interactableElement);\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.resizeAxes = 'xy';\n});\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action }) {\n if (action !== 'resize' || !interaction.resizeAxes) { return; }\n\n const options = interaction.target.options;\n\n if (options.resize.square) {\n if (interaction.resizeAxes === 'y') {\n iEvent.dx = iEvent.dy;\n }\n else {\n iEvent.dy = iEvent.dx;\n }\n iEvent.axes = 'xy';\n }\n else {\n iEvent.axes = interaction.resizeAxes;\n\n if (interaction.resizeAxes === 'x') {\n iEvent.dy = 0;\n }\n else if (interaction.resizeAxes === 'y') {\n iEvent.dx = 0;\n }\n }\n});\n\nactions.resize = resize;\nactions.names.push('resize');\nutils.merge(Interactable.eventTypes, [\n 'resizestart',\n 'resizemove',\n 'resizeinertiastart',\n 'resizeinertiaresume',\n 'resizeend',\n]);\nactions.methodDict.resize = 'resizable';\n\ndefaultOptions.resize = resize.defaults;\n\nmodule.exports = resize;\n","const raf = require('./utils/raf');\nconst getWindow = require('./utils/window').getWindow;\nconst is = require('./utils/is');\nconst domUtils = require('./utils/domUtils');\nconst Interaction = require('./Interaction');\nconst defaultOptions = require('./defaultOptions');\n\nconst autoScroll = {\n defaults: {\n enabled : false,\n container: null, // the item that is scrolled (Window or HTMLElement)\n margin : 60,\n speed : 300, // the scroll speed in pixels per second\n },\n\n interaction: null,\n i: null, // the handle returned by window.setInterval\n x: 0, y: 0, // Direction each pulse is to scroll in\n\n isScrolling: false,\n prevTime: 0,\n\n start: function (interaction) {\n autoScroll.isScrolling = true;\n raf.cancel(autoScroll.i);\n\n autoScroll.interaction = interaction;\n autoScroll.prevTime = new Date().getTime();\n autoScroll.i = raf.request(autoScroll.scroll);\n },\n\n stop: function () {\n autoScroll.isScrolling = false;\n raf.cancel(autoScroll.i);\n },\n\n // scroll the window by the values in scroll.x/y\n scroll: function () {\n const options = autoScroll.interaction.target.options[autoScroll.interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(autoScroll.interaction.element);\n const now = new Date().getTime();\n // change in time in seconds\n const dt = (now - autoScroll.prevTime) / 1000;\n // displacement\n const s = options.speed * dt;\n\n if (s >= 1) {\n if (is.window(container)) {\n container.scrollBy(autoScroll.x * s, autoScroll.y * s);\n }\n else if (container) {\n container.scrollLeft += autoScroll.x * s;\n container.scrollTop += autoScroll.y * s;\n }\n\n autoScroll.prevTime = now;\n }\n\n if (autoScroll.isScrolling) {\n raf.cancel(autoScroll.i);\n autoScroll.i = raf.request(autoScroll.scroll);\n }\n },\n check: function (interactable, actionName) {\n const options = interactable.options;\n\n return options[actionName].autoScroll && options[actionName].autoScroll.enabled;\n },\n onInteractionMove: function ({ interaction, pointer }) {\n if (!(interaction.interacting()\n && autoScroll.check(interaction.target, interaction.prepared.name))) {\n return;\n }\n\n if (interaction.simulation) {\n autoScroll.x = autoScroll.y = 0;\n return;\n }\n\n let top;\n let right;\n let bottom;\n let left;\n\n const options = interaction.target.options[interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(interaction.element);\n\n if (is.window(container)) {\n left = pointer.clientX < autoScroll.margin;\n top = pointer.clientY < autoScroll.margin;\n right = pointer.clientX > container.innerWidth - autoScroll.margin;\n bottom = pointer.clientY > container.innerHeight - autoScroll.margin;\n }\n else {\n const rect = domUtils.getElementClientRect(container);\n\n left = pointer.clientX < rect.left + autoScroll.margin;\n top = pointer.clientY < rect.top + autoScroll.margin;\n right = pointer.clientX > rect.right - autoScroll.margin;\n bottom = pointer.clientY > rect.bottom - autoScroll.margin;\n }\n\n autoScroll.x = (right ? 1: left? -1: 0);\n autoScroll.y = (bottom? 1: top? -1: 0);\n\n if (!autoScroll.isScrolling) {\n // set the autoScroll properties to those of the target\n autoScroll.margin = options.margin;\n autoScroll.speed = options.speed;\n\n autoScroll.start(interaction);\n }\n },\n};\n\nInteraction.signals.on('stop-active', function () {\n autoScroll.stop();\n});\n\nInteraction.signals.on('action-move', autoScroll.onInteractionMove);\n\ndefaultOptions.perAction.autoScroll = autoScroll.defaults;\n\nmodule.exports = autoScroll;\n","const Interactable = require('../Interactable');\nconst actions = require('../actions/base');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.ignoreFrom\n [ method ]\n *\n * If the target of the `mousedown`, `pointerdown` or `touchstart`\n * event or any of it's parents match the given CSS selector or\n * Element, no drag/resize/gesture is started.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to not ignore any elements\n = (string | Element | object) The current ignoreFrom value or this Interactable\n **\n | interact(element, { ignoreFrom: document.getElementById('no-action') });\n | // or\n | interact(element).ignoreFrom('input, textarea, a');\n\\*/\nInteractable.prototype.ignoreFrom = function (newValue) {\n return this._backCompatOption('ignoreFrom', newValue);\n};\n\n/*\\\n * Interactable.allowFrom\n [ method ]\n *\n * A drag/resize/gesture is started only If the target of the\n * `mousedown`, `pointerdown` or `touchstart` event or any of it's\n * parents match the given CSS selector or Element.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to allow from any element\n = (string | Element | object) The current allowFrom value or this Interactable\n **\n | interact(element, { allowFrom: document.getElementById('drag-handle') });\n | // or\n | interact(element).allowFrom('.handle');\n\\*/\nInteractable.prototype.allowFrom = function (newValue) {\n return this._backCompatOption('allowFrom', newValue);\n};\n\nInteractable.prototype.testIgnore = function (ignoreFrom, interactableElement, element) {\n if (!ignoreFrom || !is.element(element)) { return false; }\n\n if (is.string(ignoreFrom)) {\n return domUtils.matchesUpTo(element, ignoreFrom, interactableElement);\n }\n else if (is.element(ignoreFrom)) {\n return domUtils.nodeContains(ignoreFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testAllow = function (allowFrom, interactableElement, element) {\n if (!allowFrom) { return true; }\n\n if (!is.element(element)) { return false; }\n\n if (is.string(allowFrom)) {\n return domUtils.matchesUpTo(element, allowFrom, interactableElement);\n }\n else if (is.element(allowFrom)) {\n return domUtils.nodeContains(allowFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testIgnoreAllow = function (options, interactableElement, eventTarget) {\n return (!this.testIgnore(options.ignoreFrom, interactableElement, eventTarget)\n && this.testAllow(options.allowFrom, interactableElement, eventTarget));\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (event.buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\n","const interact = require('../interact');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst actions = require('../actions/base');\nconst defaultOptions = require('../defaultOptions');\nconst browser = require('../utils/browser');\nconst scope = require('../scope');\nconst utils = require('../utils');\nconst signals = require('../utils/Signals').new();\n\nrequire('./InteractableMethods');\n\nconst autoStart = {\n signals,\n withinInteractionLimit,\n // Allow this many interactions to happen simultaneously\n maxInteractions: Infinity,\n defaults: {\n perAction: {\n manualStart: false,\n max: Infinity,\n maxPerElement: 1,\n allowFrom: null,\n ignoreFrom: null,\n },\n },\n setActionDefaults: function (action) {\n utils.extend(action.defaults, autoStart.defaults.perAction);\n },\n};\n\n// set cursor style on mousedown\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget }) {\n if (interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\n// set cursor style on mousemove\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget }) {\n if (!interaction.mouse\n || interaction.pointerIsDown\n || interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\nInteraction.signals.on('move', function (arg) {\n const { interaction, event } = arg;\n\n if (!interaction.pointerIsDown\n || interaction.interacting()\n || !interaction.pointerWasMoved\n || !interaction.prepared.name) {\n return;\n }\n\n signals.fire('before-start', arg);\n\n const target = interaction.target;\n\n if (interaction.prepared.name && target) {\n // check manualStart and interaction limit\n if (target.options[interaction.prepared.name].manualStart\n || !withinInteractionLimit(target, interaction.element, interaction.prepared)) {\n interaction.stop(event);\n }\n else {\n interaction.start(interaction.prepared, target, interaction.element);\n }\n }\n});\n\n// Check if the current target supports the action.\n// If so, return the validated action. Otherwise, return null\nfunction validateAction (action, interactable, element, eventTarget) {\n if (utils.is.object(action)\n && interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget)\n && interactable.options[action.name].enabled\n && withinInteractionLimit(interactable, element, action)) {\n return action;\n }\n\n return null;\n}\n\nfunction validateSelector (interaction, pointer, event, matches, matchElements, eventTarget) {\n for (let i = 0, len = matches.length; i < len; i++) {\n const match = matches[i];\n const matchElement = matchElements[i];\n const action = validateAction(match.getAction(pointer, event, interaction, matchElement),\n match,\n matchElement,\n eventTarget);\n\n if (action) {\n return {\n action,\n target: match,\n element: matchElement,\n };\n }\n }\n\n return {};\n}\n\nfunction getActionInfo (interaction, pointer, event, eventTarget) {\n let matches = [];\n let matchElements = [];\n\n let element = eventTarget;\n let action = null;\n\n function pushMatches (interactable, selector, context) {\n const elements = (browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined);\n\n if (utils.matchesSelector(element, selector, elements)) {\n\n matches.push(interactable);\n matchElements.push(element);\n }\n }\n\n while (utils.is.element(element)) {\n matches = [];\n matchElements = [];\n\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && (action = validateAction(elementInteractable.getAction(pointer, event, interaction, element, eventTarget),\n elementInteractable,\n element,\n eventTarget))\n && !elementInteractable.options[action.name].manualStart) {\n return {\n element,\n action,\n target: elementInteractable,\n };\n }\n else {\n scope.interactables.forEachSelector(pushMatches, element);\n\n const actionInfo = validateSelector(interaction, pointer, event, matches, matchElements, eventTarget);\n\n if (actionInfo.action\n && !actionInfo.target.options[actionInfo.action.name].manualStart) {\n return actionInfo;\n }\n }\n\n element = utils.parentNode(element);\n }\n\n return {};\n}\n\nfunction prepare (interaction, { action, target, element }) {\n action = action || {};\n\n if (interaction.target && interaction.target.options.styleCursor) {\n interaction.target._doc.documentElement.style.cursor = '';\n }\n\n interaction.target = target;\n interaction.element = element;\n utils.copyAction(interaction.prepared, action);\n\n if (target && target.options.styleCursor) {\n const cursor = action? actions[action.name].getCursor(action) : '';\n interaction.target._doc.documentElement.style.cursor = cursor;\n }\n\n signals.fire('prepared', { interaction: interaction });\n}\n\nInteraction.signals.on('stop', function ({ interaction }) {\n const target = interaction.target;\n\n if (target && target.options.styleCursor) {\n target._doc.documentElement.style.cursor = '';\n }\n});\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (utils.is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (utils.is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n const buttons = event.buttons || ({\n 0: 1,\n 1: 4,\n 3: 8,\n 4: 16,\n })[event.button];\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\nfunction withinInteractionLimit (interactable, element, action) {\n const options = interactable.options;\n const maxActions = options[action.name].max;\n const maxPerElement = options[action.name].maxPerElement;\n let activeInteractions = 0;\n let targetCount = 0;\n let targetElementCount = 0;\n\n // no actions if any of these values == 0\n if (!(maxActions && maxPerElement && autoStart.maxInteractions)) { return; }\n\n for (let i = 0, len = scope.interactions.length; i < len; i++) {\n const interaction = scope.interactions[i];\n const otherAction = interaction.prepared.name;\n\n if (!interaction.interacting()) { continue; }\n\n activeInteractions++;\n\n if (activeInteractions >= autoStart.maxInteractions) {\n return false;\n }\n\n if (interaction.target !== interactable) { continue; }\n\n targetCount += (otherAction === action.name)|0;\n\n if (targetCount >= maxActions) {\n return false;\n }\n\n if (interaction.element === element) {\n targetElementCount++;\n\n if (otherAction !== action.name || targetElementCount >= maxPerElement) {\n return false;\n }\n }\n }\n\n return autoStart.maxInteractions > 0;\n}\n\n/*\\\n * interact.maxInteractions\n [ method ]\n **\n * Returns or sets the maximum number of concurrent interactions allowed.\n * By default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables\n * and elements, you need to enable it in the draggable, resizable and\n * gesturable `'max'` and `'maxPerElement'` options.\n **\n - newValue (number) #optional Any number. newValue <= 0 means no interactions.\n\\*/\ninteract.maxInteractions = function (newValue) {\n if (utils.is.number(newValue)) {\n autoStart.maxInteractions = newValue;\n\n return this;\n }\n\n return autoStart.maxInteractions;\n};\n\nInteractable.settingsMethods.push('styleCursor');\nInteractable.settingsMethods.push('actionChecker');\nInteractable.settingsMethods.push('ignoreFrom');\nInteractable.settingsMethods.push('allowFrom');\n\ndefaultOptions.base.actionChecker = null;\ndefaultOptions.base.styleCursor = true;\n\nutils.extend(defaultOptions.perAction, autoStart.defaults.perAction);\n\nmodule.exports = autoStart;\n","const autoStart = require('./base');\nconst Interaction = require('../Interaction');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.delayTimer = null;\n});\n\nautoStart.signals.on('prepared', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.delayTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.target, interaction.element);\n }, delay);\n }\n});\n\nInteraction.signals.on('move', function ({ interaction, duplicate }) {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.delayTimer);\n }\n});\n\n// prevent regular down->move autoStart\nautoStart.signals.on('before-start', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.prepared.name = null;\n }\n});\n","const autoStart = require('./base');\nconst scope = require('../scope');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\n\nconst { matchesSelector, parentNode } = require('../utils/domUtils');\n\nautoStart.setActionDefaults(require('../actions/drag'));\n\nautoStart.signals.on('before-start', function ({ interaction, eventTarget, dx, dy }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // check if a drag is in the correct axis\n const absX = Math.abs(dx);\n const absY = Math.abs(dy);\n const options = interaction.target.options.drag;\n const startAxis = options.startAxis;\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy');\n\n interaction.prepared.axis = options.lockAxis === 'start'\n ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n : options.lockAxis;\n\n // if the movement isn't in the startAxis of the interactable\n if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) {\n // cancel the prepared action\n interaction.prepared.name = null;\n\n // then try to get a drag from another ineractable\n\n if (!interaction.prepared.name) {\n\n let element = eventTarget;\n\n const getDraggable = function (interactable, selector, context) {\n const elements = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n if (interactable === interaction.target) { return; }\n\n if (!options.manualStart\n && !interactable.testIgnoreAllow(options, element, eventTarget)\n && matchesSelector(element, selector, elements)) {\n\n const action = interactable.getAction(interaction.downPointer,\n interaction.downEvent,\n interaction,\n element);\n\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, interactable)\n && autoStart.validateAction(action, interactable, element, eventTarget)) {\n\n return interactable;\n }\n }\n };\n\n let action = null;\n\n // check all interactables\n while (is.element(element)) {\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && elementInteractable !== interaction.target\n && !elementInteractable.options.drag.manualStart) {\n\n action = elementInteractable.getAction(interaction.downPointer, interaction.downEvent, interaction, element);\n }\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, elementInteractable)) {\n\n interaction.prepared.name = 'drag';\n interaction.target = elementInteractable;\n interaction.element = element;\n break;\n }\n\n const selectorInteractable = scope.interactables.forEachSelector(getDraggable, element);\n\n if (selectorInteractable) {\n interaction.prepared.name = 'drag';\n interaction.target = selectorInteractable;\n interaction.element = element;\n break;\n }\n\n element = parentNode(element);\n }\n }\n }\n});\n\nfunction checkStartAxis (startAxis, interactable) {\n if (!interactable) { return false; }\n\n const thisAxis = interactable.options.drag.startAxis;\n\n return (startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis);\n}\n","require('./base').setActionDefaults(require('../actions/gesture'));\n","require('./base').setActionDefaults(require('../actions/resize'));\n","module.exports = {\n base: {\n accept : null,\n preventDefault: 'auto',\n deltaSource : 'page',\n },\n\n perAction: {\n origin: { x: 0, y: 0 },\n\n // only allow left button by default\n // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n mouseButtons: 1,\n\n inertia: {\n enabled : false,\n resistance : 10, // the lambda in exponential decay\n minSpeed : 100, // target speed must be above this for inertia to start\n endSpeed : 10, // the speed at which inertia is slow enough to stop\n allowResume : true, // allow resuming an action in inertia phase\n smoothEndDuration: 300, // animate to snap/restrict endOnly if there's no inertia\n },\n },\n};\n","/* browser entry point */\n\n// Legacy browser support\nrequire('./legacyBrowsers');\n\n// inertia\nrequire('./inertia');\n\n// modifiers\nrequire('./modifiers/snap');\nrequire('./modifiers/restrict');\n\n// pointerEvents\nrequire('./pointerEvents/base');\nrequire('./pointerEvents/holdRepeat');\nrequire('./pointerEvents/interactableTargets');\n\n// delay\nrequire('./autoStart/delay');\n\n// actions\nrequire('./actions/gesture');\nrequire('./actions/resize');\nrequire('./actions/drag');\nrequire('./actions/drop');\n\n// load these modifiers after resize is loaded\nrequire('./modifiers/snapSize');\nrequire('./modifiers/restrictEdges');\nrequire('./modifiers/restrictSize');\n\n// autoStart actions\nrequire('./autoStart/gesture');\nrequire('./autoStart/resize');\nrequire('./autoStart/drag');\n\n// Interactable preventDefault setting\nrequire('./interactablePreventDefault.js');\n\n// autoScroll\nrequire('./autoScroll');\n\n// export interact\nmodule.exports = require('./interact');\n","const InteractEvent = require('./InteractEvent');\nconst Interaction = require('./Interaction');\nconst modifiers = require('./modifiers');\nconst utils = require('./utils');\nconst animationFrame = require('./utils/raf');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.inertiaStatus = {\n active : false,\n smoothEnd : false,\n allowResume: false,\n\n startEvent: null,\n upCoords : {},\n\n xe: 0, ye: 0,\n sx: 0, sy: 0,\n\n t0: 0,\n vx0: 0, vys: 0,\n duration: 0,\n\n lambda_v0: 0,\n one_ve_v0: 0,\n i : null,\n };\n\n interaction.boundInertiaFrame = () => inertiaFrame .apply(interaction);\n interaction.boundSmoothEndFrame = () => smoothEndFrame.apply(interaction);\n});\n\nInteraction.signals.on('down', function ({ interaction, event, pointer, eventTarget }) {\n const status = interaction.inertiaStatus;\n\n // Check if the down event hits the current inertia target\n if (status.active) {\n let element = eventTarget;\n\n // climb up the DOM tree from the event target\n while (utils.is.element(element)) {\n\n // if interaction element is the current inertia target element\n if (element === interaction.element) {\n // stop inertia\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n\n // update pointers to the down event's coordinates\n interaction.updatePointer(pointer);\n utils.setCoords(interaction.curCoords, interaction.pointers);\n\n // fire appropriate signals\n const signalArg = { interaction };\n Interaction.signals.fire('before-action-move', signalArg);\n Interaction.signals.fire('action-resume' , signalArg);\n\n // fire a reume event\n const resumeEvent = new InteractEvent(interaction,\n event,\n interaction.prepared.name,\n 'inertiaresume',\n interaction.element);\n\n interaction.target.fire(resumeEvent);\n interaction.prevEvent = resumeEvent;\n modifiers.resetStatuses(interaction.modifierStatuses);\n\n utils.copyCoords(interaction.prevCoords, interaction.curCoords);\n break;\n }\n\n element = utils.parentNode(element);\n }\n }\n});\n\nInteraction.signals.on('up', function ({ interaction, event }) {\n const status = interaction.inertiaStatus;\n\n if (!interaction.interacting() || status.active) { return; }\n\n const target = interaction.target;\n const options = target && target.options;\n const inertiaOptions = options && interaction.prepared.name && options[interaction.prepared.name].inertia;\n\n const now = new Date().getTime();\n const statuses = {};\n const page = utils.extend({}, interaction.curCoords.page);\n const pointerSpeed = interaction.pointerDelta.client.speed;\n\n let smoothEnd = false;\n let modifierResult;\n\n // check if inertia should be started\n const inertiaPossible = (inertiaOptions && inertiaOptions.enabled\n && interaction.prepared.name !== 'gesture'\n && event !== status.startEvent);\n\n const inertia = (inertiaPossible\n && (now - interaction.curCoords.timeStamp) < 50\n && pointerSpeed > inertiaOptions.minSpeed\n && pointerSpeed > inertiaOptions.endSpeed);\n\n const modifierArg = {\n interaction,\n pageCoords: page,\n statuses,\n preEnd: true,\n requireEndOnly: true,\n };\n\n // smoothEnd\n if (inertiaPossible && !inertia) {\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n if (modifierResult.shouldMove && modifierResult.locked) {\n smoothEnd = true;\n }\n }\n\n if (!(inertia || smoothEnd)) { return; }\n\n utils.copyCoords(status.upCoords, interaction.curCoords);\n\n interaction.pointers[0] = status.startEvent =\n new InteractEvent(interaction, event, interaction.prepared.name, 'inertiastart', interaction.element);\n\n status.t0 = now;\n\n status.active = true;\n status.allowResume = inertiaOptions.allowResume;\n interaction.simulation = status;\n\n target.fire(status.startEvent);\n\n if (inertia) {\n status.vx0 = interaction.pointerDelta.client.vx;\n status.vy0 = interaction.pointerDelta.client.vy;\n status.v0 = pointerSpeed;\n\n calcInertia(interaction, status);\n\n utils.extend(page, interaction.curCoords.page);\n\n page.x += status.xe;\n page.y += status.ye;\n\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n status.modifiedXe += modifierResult.dx;\n status.modifiedYe += modifierResult.dy;\n\n status.i = animationFrame.request(interaction.boundInertiaFrame);\n }\n else {\n status.smoothEnd = true;\n status.xe = modifierResult.dx;\n status.ye = modifierResult.dy;\n\n status.sx = status.sy = 0;\n\n status.i = animationFrame.request(interaction.boundSmoothEndFrame);\n }\n});\n\nInteraction.signals.on('stop-active', function ({ interaction }) {\n const status = interaction.inertiaStatus;\n\n if (status.active) {\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n }\n});\n\nfunction calcInertia (interaction, status) {\n const inertiaOptions = interaction.target.options[interaction.prepared.name].inertia;\n const lambda = inertiaOptions.resistance;\n const inertiaDur = -Math.log(inertiaOptions.endSpeed / status.v0) / lambda;\n\n status.x0 = interaction.prevEvent.pageX;\n status.y0 = interaction.prevEvent.pageY;\n status.t0 = status.startEvent.timeStamp / 1000;\n status.sx = status.sy = 0;\n\n status.modifiedXe = status.xe = (status.vx0 - inertiaDur) / lambda;\n status.modifiedYe = status.ye = (status.vy0 - inertiaDur) / lambda;\n status.te = inertiaDur;\n\n status.lambda_v0 = lambda / status.v0;\n status.one_ve_v0 = 1 - inertiaOptions.endSpeed / status.v0;\n}\n\nfunction inertiaFrame () {\n updateInertiaCoords(this);\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n\n const status = this.inertiaStatus;\n const options = this.target.options[this.prepared.name].inertia;\n const lambda = options.resistance;\n const t = new Date().getTime() / 1000 - status.t0;\n\n if (t < status.te) {\n\n const progress = 1 - (Math.exp(-lambda * t) - status.lambda_v0) / status.one_ve_v0;\n\n if (status.modifiedXe === status.xe && status.modifiedYe === status.ye) {\n status.sx = status.xe * progress;\n status.sy = status.ye * progress;\n }\n else {\n const quadPoint = utils.getQuadraticCurvePoint(0, 0,\n status.xe,\n status.ye,\n status.modifiedXe,\n status.modifiedYe,\n progress);\n\n status.sx = quadPoint.x;\n status.sy = quadPoint.y;\n }\n\n this.doMove();\n\n status.i = animationFrame.request(this.boundInertiaFrame);\n }\n else {\n status.sx = status.modifiedXe;\n status.sy = status.modifiedYe;\n\n this.doMove();\n this.end(status.startEvent);\n status.active = false;\n this.simulation = null;\n }\n\n utils.copyCoords(this.prevCoords, this.curCoords);\n}\n\nfunction smoothEndFrame () {\n updateInertiaCoords(this);\n\n const status = this.inertiaStatus;\n const t = new Date().getTime() - status.t0;\n const duration = this.target.options[this.prepared.name].inertia.smoothEndDuration;\n\n if (t < duration) {\n status.sx = utils.easeOutQuad(t, 0, status.xe, duration);\n status.sy = utils.easeOutQuad(t, 0, status.ye, duration);\n\n this.pointerMove(status.startEvent, status.startEvent);\n\n status.i = animationFrame.request(this.boundSmoothEndFrame);\n }\n else {\n status.sx = status.xe;\n status.sy = status.ye;\n\n this.pointerMove(status.startEvent, status.startEvent);\n this.end(status.startEvent);\n\n status.smoothEnd =\n status.active = false;\n this.simulation = null;\n }\n}\n\nfunction updateInertiaCoords (interaction) {\n const status = interaction.inertiaStatus;\n\n // return if inertia isn't running\n if (!status.active) { return; }\n\n const pageUp = status.upCoords.page;\n const clientUp = status.upCoords.client;\n\n utils.setCoords(interaction.curCoords, [ {\n pageX : pageUp.x + status.sx,\n pageY : pageUp.y + status.sy,\n clientX: clientUp.x + status.sx,\n clientY: clientUp.y + status.sy,\n } ]);\n}\n","const browser = require('./utils/browser');\nconst events = require('./utils/events');\nconst utils = require('./utils');\nconst scope = require('./scope');\nconst Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\n\nconst globalEvents = {};\n\n/*\\\n * interact\n [ method ]\n *\n * The methods of this variable can be used to set elements as\n * interactables and also to change various default settings.\n *\n * Calling it as a function and passing an element or a valid CSS selector\n * string returns an Interactable object which has various methods to\n * configure it.\n *\n - element (Element | string) The HTML or SVG Element to interact with or CSS selector\n = (object) An @Interactable\n *\n > Usage\n | interact('#draggable').draggable(true);\n |\n | var rectables = interact('rect');\n | rectables\n | .gesturable(true)\n | .on('gesturemove', function (event) {\n | // ...\n | });\n\\*/\nfunction interact (element, options) {\n let interactable = scope.interactables.get(element, options);\n\n if (!interactable) {\n interactable = new Interactable(element, options);\n interactable.events.global = globalEvents;\n }\n\n return interactable;\n}\n\n/*\\\n * interact.isSet\n [ method ]\n *\n * Check if an element has been set\n - element (Element) The Element being searched for\n = (boolean) Indicates if the element or CSS selector was previously passed to interact\n\\*/\ninteract.isSet = function (element, options) {\n return scope.interactables.indexOfElement(element, options && options.context) !== -1;\n};\n\n/*\\\n * interact.on\n [ method ]\n *\n * Adds a global listener for an InteractEvent or adds a DOM event to\n * `document`\n *\n - type (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) interact\n\\*/\ninteract.on = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.on(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.on(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n // if it is an InteractEvent type, add listener to globalEvents\n if (utils.contains(Interactable.eventTypes, type)) {\n // if this type of event was never bound\n if (!globalEvents[type]) {\n globalEvents[type] = [listener];\n }\n else {\n globalEvents[type].push(listener);\n }\n }\n // If non InteractEvent type, addEventListener to document\n else {\n events.add(scope.document, type, listener, { options });\n }\n\n return interact;\n};\n\n/*\\\n * interact.off\n [ method ]\n *\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n - type (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) interact\n \\*/\ninteract.off = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.off(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.off(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n if (!utils.contains(Interactable.eventTypes, type)) {\n events.remove(scope.document, type, listener, options);\n }\n else {\n let index;\n\n if (type in globalEvents\n && (index = utils.indexOf(globalEvents[type], listener)) !== -1) {\n globalEvents[type].splice(index, 1);\n }\n }\n\n return interact;\n};\n\n/*\\\n * interact.debug\n [ method ]\n *\n * Returns an object which exposes internal data\n = (object) An object with properties that outline the current state and expose internal functions and variables\n\\*/\ninteract.debug = function () {\n return scope;\n};\n\n// expose the functions used to calculate multi-touch properties\ninteract.getPointerAverage = utils.pointerAverage;\ninteract.getTouchBBox = utils.touchBBox;\ninteract.getTouchDistance = utils.touchDistance;\ninteract.getTouchAngle = utils.touchAngle;\n\ninteract.getElementRect = utils.getElementRect;\ninteract.getElementClientRect = utils.getElementClientRect;\ninteract.matchesSelector = utils.matchesSelector;\ninteract.closest = utils.closest;\n\n/*\\\n * interact.supportsTouch\n [ method ]\n *\n = (boolean) Whether or not the browser supports touch input\n\\*/\ninteract.supportsTouch = function () {\n return browser.supportsTouch;\n};\n\n/*\\\n * interact.supportsPointerEvent\n [ method ]\n *\n = (boolean) Whether or not the browser supports PointerEvents\n\\*/\ninteract.supportsPointerEvent = function () {\n return browser.supportsPointerEvent;\n};\n\n/*\\\n * interact.stop\n [ method ]\n *\n * Cancels all interactions (end events are not fired)\n *\n - event (Event) An event on which to call preventDefault()\n = (object) interact\n\\*/\ninteract.stop = function (event) {\n for (let i = scope.interactions.length - 1; i >= 0; i--) {\n scope.interactions[i].stop(event);\n }\n\n return interact;\n};\n\n/*\\\n * interact.pointerMoveTolerance\n [ method ]\n * Returns or sets the distance the pointer must be moved before an action\n * sequence occurs. This also affects tolerance for tap events.\n *\n - newValue (number) #optional The movement from the start position must be greater than this value\n = (number | Interactable) The current setting or interact\n\\*/\ninteract.pointerMoveTolerance = function (newValue) {\n if (utils.is.number(newValue)) {\n Interaction.pointerMoveTolerance = newValue;\n\n return this;\n }\n\n return Interaction.pointerMoveTolerance;\n};\n\ninteract.addDocument = scope.addDocument;\ninteract.removeDocument = scope.removeDocument;\n\nscope.interact = interact;\n\nmodule.exports = interact;\n","const Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\nconst scope = require('./scope');\nconst is = require('./utils/is');\nconst events = require('./utils/events');\n\nconst { nodeContains, matchesSelector } = require('./utils/domUtils');\n\n/*\\\n * Interactable.preventDefault\n [ method ]\n *\n * Returns or sets whether to prevent the browser's default behaviour\n * in response to pointer events. Can be set to:\n * - `'always'` to always prevent\n * - `'never'` to never prevent\n * - `'auto'` to let interact.js try to determine what would be best\n *\n - newValue (string) #optional `true`, `false` or `'auto'`\n = (string | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.preventDefault = function (newValue) {\n if (/^(always|never|auto)$/.test(newValue)) {\n this.options.preventDefault = newValue;\n return this;\n }\n\n if (is.bool(newValue)) {\n this.options.preventDefault = newValue? 'always' : 'never';\n return this;\n }\n\n return this.options.preventDefault;\n};\n\nInteractable.prototype.checkAndPreventDefault = function (event) {\n const setting = this.options.preventDefault;\n\n if (setting === 'never') { return; }\n\n if (setting === 'always') {\n event.preventDefault();\n return;\n }\n\n // setting === 'auto'\n\n // don't preventDefault if the browser supports passiveEvents\n // CSS touch-action and user-selecct should be used instead\n if (events.supportsOptions) {\n return;\n }\n\n // don't preventDefault of pointerdown events\n if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) {\n return;\n }\n\n // don't preventDefault on editable elements\n if (is.element(event.target)\n && matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) {\n return;\n }\n\n event.preventDefault();\n};\n\nfunction onInteractionEvent ({ interaction, event }) {\n if (interaction.target) {\n interaction.target.checkAndPreventDefault(event);\n }\n}\n\nfor (const eventSignal of ['down', 'move', 'up', 'cancel']) {\n Interaction.signals.on(eventSignal, onInteractionEvent);\n}\n\n// prevent native HTML5 drag on interact.js target elements\nInteraction.docEvents.dragstart = function preventNativeDrag (event) {\n for (const interaction of scope.interactions) {\n\n if (interaction.element\n && (interaction.element === event.target\n || nodeContains(interaction.element, event.target))) {\n\n interaction.target.checkAndPreventDefault(event);\n return;\n }\n }\n};\n","const scope = require('./scope');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst iFinder = require('./utils/interactionFinder');\nconst pointerEvents = require('./pointerEvents/base');\n\nconst { window } = require('./utils/window');\n\nconst toString = Object.prototype.toString;\n\nif (!window.Array.isArray) {\n window.Array.isArray = function (obj) {\n return toString.call(obj) === '[object Array]';\n };\n}\n\nif (!String.prototype.trim) {\n String.prototype.trim = function () {\n return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n };\n}\n\n// http://www.quirksmode.org/dom/events/click.html\n// >Events leading to dblclick\n//\n// IE8 doesn't fire down event before dblclick.\n// This workaround tries to fire a tap and doubletap after dblclick\nfunction onIE8Dblclick (event) {\n const eventTarget = event.target;\n const interaction = iFinder.search(event, event.type, eventTarget);\n\n if (!interaction) { return; }\n\n if (interaction.prevTap\n && event.clientX === interaction.prevTap.clientX\n && event.clientY === interaction.prevTap.clientY\n && eventTarget === interaction.prevTap.target) {\n\n interaction.downTargets[0] = eventTarget;\n interaction.downTimes [0] = new Date().getTime();\n\n pointerEvents.fire({\n interaction,\n event,\n eventTarget,\n pointer: event,\n type: 'tap',\n });\n }\n}\n\nif (browser.isIE8) {\n const selectFix = function (event) {\n for (const interaction of scope.interactions) {\n if (interaction.interacting()) {\n interaction.target.checkAndPreventDefault(event);\n }\n }\n };\n\n const onDocIE8 = function onDocIE8 ({ doc, win }, signalName) {\n const eventMethod = signalName.indexOf('listen') === 0\n ? events.add : events.remove;\n\n // For IE's lack of Event#preventDefault\n eventMethod(doc, 'selectstart', selectFix);\n\n if (pointerEvents) {\n eventMethod(doc, 'dblclick', onIE8Dblclick);\n }\n };\n\n scope.signals.on('add-document' , onDocIE8);\n scope.signals.on('remove-document', onDocIE8);\n}\n\nmodule.exports = null;\n","const InteractEvent = require('../InteractEvent');\nconst Interaction = require('../Interaction');\nconst extend = require('../utils/extend');\n\nconst modifiers = {\n names: [],\n\n setOffsets: function (arg) {\n const { interaction, pageCoords: page } = arg;\n const { target, element, startOffset } = interaction;\n const rect = target.getRect(element);\n\n if (rect) {\n startOffset.left = page.x - rect.left;\n startOffset.top = page.y - rect.top;\n\n startOffset.right = rect.right - page.x;\n startOffset.bottom = rect.bottom - page.y;\n\n if (!('width' in rect)) { rect.width = rect.right - rect.left; }\n if (!('height' in rect)) { rect.height = rect.bottom - rect.top ; }\n }\n else {\n startOffset.left = startOffset.top = startOffset.right = startOffset.bottom = 0;\n }\n\n arg.rect = rect;\n arg.interactable = target;\n arg.element = element;\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n\n arg.options = target.options[interaction.prepared.name][modifierName];\n\n if (!arg.options) {\n continue;\n }\n\n interaction.modifierOffsets[modifierName] = modifiers[modifierName].setOffset(arg);\n }\n },\n\n setAll: function (arg) {\n const { interaction, statuses, preEnd, requireEndOnly } = arg;\n const coords = extend({}, arg.pageCoords);\n const result = {\n dx: 0,\n dy: 0,\n changed: false,\n locked: false,\n shouldMove: true,\n };\n\n for (const modifierName of modifiers.names) {\n const modifier = modifiers[modifierName];\n const options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!shouldDo(options, preEnd, requireEndOnly)) { continue; }\n\n arg.status = arg.status = statuses[modifierName];\n arg.options = options;\n arg.offset = arg.interaction.modifierOffsets[modifierName];\n\n modifier.set(arg);\n\n if (arg.status.locked) {\n coords.x += arg.status.dx;\n coords.y += arg.status.dy;\n\n result.dx += arg.status.dx;\n result.dy += arg.status.dy;\n\n result.locked = true;\n }\n }\n\n // a move should be fired if:\n // - there are no modifiers enabled,\n // - no modifiers are \"locked\" i.e. have changed the pointer's coordinates, or\n // - the locked coords have changed since the last pointer move\n result.shouldMove = !arg.status || !result.locked || arg.status.changed;\n\n return result;\n },\n\n resetStatuses: function (statuses) {\n for (const modifierName of modifiers.names) {\n const status = statuses[modifierName] || {};\n\n status.dx = status.dy = 0;\n status.modifiedX = status.modifiedY = NaN;\n status.locked = false;\n status.changed = true;\n\n statuses[modifierName] = status;\n }\n\n return statuses;\n },\n\n start: function ({ interaction }, signalName) {\n const arg = {\n interaction,\n pageCoords: (signalName === 'action-resume' ?\n interaction.curCoords : interaction.startCoords).page,\n startOffset: interaction.startOffset,\n statuses: interaction.modifierStatuses,\n preEnd: false,\n requireEndOnly: false,\n };\n\n modifiers.setOffsets(arg);\n modifiers.resetStatuses(arg.statuses);\n\n arg.pageCoords = extend({}, interaction.startCoords.page);\n interaction.modifierResult = modifiers.setAll(arg);\n },\n};\n\nInteraction.signals.on('new', function (interaction) {\n interaction.startOffset = { left: 0, right: 0, top: 0, bottom: 0 };\n interaction.modifierOffsets = {};\n interaction.modifierStatuses = modifiers.resetStatuses({});\n interaction.modifierResult = null;\n});\n\nInteraction.signals.on('action-start' , modifiers.start);\nInteraction.signals.on('action-resume', modifiers.start);\n\nInteraction.signals.on('before-action-move', function ({ interaction, preEnd, interactingBeforeMove }) {\n const modifierResult = modifiers.setAll({\n interaction,\n preEnd,\n pageCoords: interaction.curCoords.page,\n statuses: interaction.modifierStatuses,\n requireEndOnly: false,\n });\n\n // don't fire an action move if a modifier would keep the event in the same\n // cordinates as before\n if (!modifierResult.shouldMove && interactingBeforeMove) {\n interaction._dontFireMove = true;\n }\n\n interaction.modifierResult = modifierResult;\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n for (let i = 0; i < modifiers.names.length; i++) {\n const options = interaction.target.options[interaction.prepared.name][modifiers.names[i]];\n\n // if the endOnly option is true for any modifier\n if (shouldDo(options, true, true)) {\n // fire a move event at the modified coordinates\n interaction.doMove({ event, preEnd: true });\n break;\n }\n }\n});\n\nInteractEvent.signals.on('set-xy', function (arg) {\n const { iEvent, interaction } = arg;\n const modifierArg = extend({}, arg);\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n modifierArg.options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!modifierArg.options) {\n continue;\n }\n\n const modifier = modifiers[modifierName];\n\n modifierArg.status = interaction.modifierStatuses[modifierName];\n\n iEvent[modifierName] = modifier.modifyCoords(modifierArg);\n }\n});\n\nfunction shouldDo (options, preEnd, requireEndOnly) {\n return (options && options.enabled\n && (preEnd || !options.endOnly)\n && (!requireEndOnly || options.endOnly));\n}\n\nmodule.exports = modifiers;\n","const modifiers = require('./index');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst restrict = {\n defaults: {\n enabled : false,\n endOnly : false,\n restriction: null,\n elementRect: null,\n },\n\n setOffset: function ({ rect, startOffset, options }) {\n const elementRect = options && options.elementRect;\n const offset = {};\n\n if (rect && elementRect) {\n offset.left = startOffset.left - (rect.width * elementRect.left);\n offset.top = startOffset.top - (rect.height * elementRect.top);\n\n offset.right = startOffset.right - (rect.width * (1 - elementRect.right));\n offset.bottom = startOffset.bottom - (rect.height * (1 - elementRect.bottom));\n }\n else {\n offset.left = offset.top = offset.right = offset.bottom = 0;\n }\n\n return offset;\n },\n\n set: function ({ pageCoords, interaction, status, options }) {\n if (!options) { return status; }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n\n const restriction = getRestrictionRect(options.restriction, interaction, page);\n\n if (!restriction) { return status; }\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n const rect = restriction;\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n const offset = interaction.modifierOffsets.restrict;\n\n // object is assumed to have\n // x, y, width, height or\n // left, top, right, bottom\n if ('x' in restriction && 'y' in restriction) {\n modifiedX = Math.max(Math.min(rect.x + rect.width - offset.right , page.x), rect.x + offset.left);\n modifiedY = Math.max(Math.min(rect.y + rect.height - offset.bottom, page.y), rect.y + offset.top );\n }\n else {\n modifiedX = Math.max(Math.min(rect.right - offset.right , page.x), rect.left + offset.left);\n modifiedY = Math.max(Math.min(rect.bottom - offset.bottom, page.y), rect.top + offset.top );\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const elementRect = options && options.elementRect;\n\n if (options && options.enabled\n && !(phase === 'start' && elementRect && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n getRestrictionRect,\n};\n\nfunction getRestrictionRect (value, interaction, page) {\n if (utils.is.function(value)) {\n return utils.resolveRectLike(value, interaction.target, interaction.element, [page.x, page.y, interaction]);\n } else {\n return utils.resolveRectLike(value, interaction.target, interaction.element);\n }\n}\n\nmodifiers.restrict = restrict;\nmodifiers.names.push('restrict');\n\ndefaultOptions.perAction.restrict = restrict.defaults;\n\nmodule.exports = restrict;\n","// This module adds the options.resize.restrictEdges setting which sets min and\n// max for the top, left, bottom and right edges of the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictEdges: {\n// inner: { top: 200, left: 200, right: 400, bottom: 400 },\n// outer: { top: 0, left: 0, right: 600, bottom: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst { getRestrictionRect } = require('./restrict');\n\nconst noInner = { top: +Infinity, left: +Infinity, bottom: -Infinity, right: -Infinity };\nconst noOuter = { top: -Infinity, left: -Infinity, bottom: +Infinity, right: +Infinity };\n\nconst restrictEdges = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n offset: null,\n },\n\n setOffset: function ({ interaction, startOffset, options }) {\n if (!options) {\n return utils.extend({}, startOffset);\n }\n\n const offset = getRestrictionRect(options.offset, interaction, interaction.startCoords.page);\n\n if (offset) {\n return {\n top: startOffset.top + offset.y,\n left: startOffset.left + offset.x,\n bottom: startOffset.bottom + offset.y,\n right: startOffset.right + offset.x,\n };\n }\n\n return startOffset;\n },\n\n set: function ({ pageCoords, interaction, status, offset, options }) {\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n const inner = rectUtils.xywhToTlbr(getRestrictionRect(options.inner, interaction, page)) || noInner;\n const outer = rectUtils.xywhToTlbr(getRestrictionRect(options.outer, interaction, page)) || noOuter;\n\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n if (edges.top) {\n modifiedY = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top);\n }\n else if (edges.bottom) {\n modifiedY = Math.max(Math.min(outer.bottom - offset.bottom, page.y), inner.bottom - offset.bottom);\n }\n if (edges.left) {\n modifiedX = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left);\n }\n else if (edges.right) {\n modifiedX = Math.max(Math.min(outer.right - offset.right, page.x), inner.right - offset.right);\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n if (options && options.enabled\n && !(phase === 'start' && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n noInner,\n noOuter,\n getRestrictionRect,\n};\n\nmodifiers.restrictEdges = restrictEdges;\nmodifiers.names.push('restrictEdges');\n\ndefaultOptions.perAction.restrictEdges = restrictEdges.defaults;\nresize.defaults.restrictEdges = restrictEdges.defaults;\n\nmodule.exports = restrictEdges;\n","// This module adds the options.resize.restrictSize setting which sets min and\n// max width and height for the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictSize: {\n// min: { width: -600, height: -600 },\n// max: { width: 600, height: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst restrictEdges = require('./restrictEdges');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst noMin = { width: -Infinity, height: -Infinity };\nconst noMax = { width: +Infinity, height: +Infinity };\n\nconst restrictSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n },\n\n setOffset: function ({ interaction }) {\n return interaction.startOffset;\n },\n\n set: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const rect = rectUtils.xywhToTlbr(interaction.resizeRects.inverted);\n\n const minSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.min, interaction)) || noMin;\n const maxSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.max, interaction)) || noMax;\n\n arg.options = {\n enabled: options.enabled,\n endOnly: options.endOnly,\n inner: utils.extend({}, restrictEdges.noInner),\n outer: utils.extend({}, restrictEdges.noOuter),\n };\n\n if (edges.top) {\n arg.options.inner.top = rect.bottom - minSize.height;\n arg.options.outer.top = rect.bottom - maxSize.height;\n }\n else if (edges.bottom) {\n arg.options.inner.bottom = rect.top + minSize.height;\n arg.options.outer.bottom = rect.top + maxSize.height;\n }\n if (edges.left) {\n arg.options.inner.left = rect.right - minSize.width;\n arg.options.outer.left = rect.right - maxSize.width;\n }\n else if (edges.right) {\n arg.options.inner.right = rect.left + minSize.width;\n arg.options.outer.right = rect.left + maxSize.width;\n }\n\n restrictEdges.set(arg);\n },\n\n modifyCoords: restrictEdges.modifyCoords,\n};\n\nmodifiers.restrictSize = restrictSize;\nmodifiers.names.push('restrictSize');\n\ndefaultOptions.perAction.restrictSize = restrictSize.defaults;\nresize.defaults.restrictSize = restrictSize.defaults;\n\nmodule.exports = restrictSize;\n","const modifiers = require('./index');\nconst interact = require('../interact');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst snap = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n\n relativePoints: null,\n },\n\n setOffset: function ({ interaction, interactable, element, rect, startOffset, options }) {\n const offsets = [];\n const optionsOrigin = utils.rectToXY(utils.resolveRectLike(options.origin));\n const origin = optionsOrigin || utils.getOriginXY(interactable, element, interaction.prepared.name);\n options = options || interactable.options[interaction.prepared.name].snap || {};\n\n let snapOffset;\n\n if (options.offset === 'startCoords') {\n snapOffset = {\n x: interaction.startCoords.page.x - origin.x,\n y: interaction.startCoords.page.y - origin.y,\n };\n }\n else {\n const offsetRect = utils.resolveRectLike(options.offset, interactable, element, [interaction]);\n\n snapOffset = utils.rectToXY(offsetRect) || { x: 0, y: 0 };\n }\n\n if (rect && options.relativePoints && options.relativePoints.length) {\n for (const { x: relativeX, y: relativeY } of options.relativePoints) {\n offsets.push({\n x: startOffset.left - (rect.width * relativeX) + snapOffset.x,\n y: startOffset.top - (rect.height * relativeY) + snapOffset.y,\n });\n }\n }\n else {\n offsets.push(snapOffset);\n }\n\n return offsets;\n },\n\n set: function ({ interaction, pageCoords, status, options, offset: offsets }) {\n const targets = [];\n let target;\n let page;\n let i;\n\n if (status.useStatusXY) {\n page = { x: status.x, y: status.y };\n }\n else {\n const origin = utils.getOriginXY(interaction.target, interaction.element, interaction.prepared.name);\n\n page = utils.extend({}, pageCoords);\n\n page.x -= origin.x;\n page.y -= origin.y;\n }\n\n status.realX = page.x;\n status.realY = page.y;\n\n let len = options.targets? options.targets.length : 0;\n\n for (const { x: offsetX, y: offsetY } of offsets) {\n const relativeX = page.x - offsetX;\n const relativeY = page.y - offsetY;\n\n for (const snapTarget of options.targets) {\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n targets.push({\n x: utils.is.number(target.x) ? (target.x + offsetX) : relativeX,\n y: utils.is.number(target.y) ? (target.y + offsetY) : relativeY,\n\n range: utils.is.number(target.range)? target.range: options.range,\n });\n }\n }\n\n const closest = {\n target: null,\n inRange: false,\n distance: 0,\n range: 0,\n dx: 0,\n dy: 0,\n };\n\n for (i = 0, len = targets.length; i < len; i++) {\n target = targets[i];\n\n const range = target.range;\n const dx = target.x - page.x;\n const dy = target.y - page.y;\n const distance = utils.hypot(dx, dy);\n let inRange = distance <= range;\n\n // Infinite targets count as being out of range\n // compared to non infinite ones that are in range\n if (range === Infinity && closest.inRange && closest.range !== Infinity) {\n inRange = false;\n }\n\n if (!closest.target || (inRange\n // is the closest target in range?\n ? (closest.inRange && range !== Infinity\n // the pointer is relatively deeper in this target\n ? distance / range < closest.distance / closest.range\n // this target has Infinite range and the closest doesn't\n : (range === Infinity && closest.range !== Infinity)\n // OR this target is closer that the previous closest\n || distance < closest.distance)\n // The other is not in range and the pointer is closer to this target\n : (!closest.inRange && distance < closest.distance))) {\n\n closest.target = target;\n closest.distance = distance;\n closest.range = range;\n closest.inRange = inRange;\n closest.dx = dx;\n closest.dy = dy;\n\n status.range = range;\n }\n }\n\n let snapChanged;\n\n if (closest.target) {\n snapChanged = (status.modifiedX !== closest.target.x || status.modifiedY !== closest.target.y);\n\n status.modifiedX = closest.target.x;\n status.modifiedY = closest.target.y;\n }\n else {\n snapChanged = true;\n\n status.modifiedX = NaN;\n status.modifiedY = NaN;\n }\n\n status.dx = closest.dx;\n status.dy = closest.dy;\n\n status.changed = (snapChanged || (closest.inRange && !status.locked));\n status.locked = closest.inRange;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const relativePoints = options && options.relativePoints;\n\n if (options && options.enabled\n && !(phase === 'start' && relativePoints && relativePoints.length)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n }\n\n return {\n range : status.range,\n locked : status.locked,\n x : status.modifiedX,\n y : status.modifiedY,\n realX : status.realX,\n realY : status.realY,\n dx : status.dx,\n dy : status.dy,\n };\n }\n },\n};\n\ninteract.createSnapGrid = function (grid) {\n return function (x, y) {\n const limits = grid.limits || {\n left : -Infinity,\n right : Infinity,\n top : -Infinity,\n bottom: Infinity,\n };\n let offsetX = 0;\n let offsetY = 0;\n\n if (utils.is.object(grid.offset)) {\n offsetX = grid.offset.x;\n offsetY = grid.offset.y;\n }\n\n const gridx = Math.round((x - offsetX) / grid.x);\n const gridy = Math.round((y - offsetY) / grid.y);\n\n const newX = Math.max(limits.left, Math.min(limits.right , gridx * grid.x + offsetX));\n const newY = Math.max(limits.top , Math.min(limits.bottom, gridy * grid.y + offsetY));\n\n return {\n x: newX,\n y: newY,\n range: grid.range,\n };\n };\n};\n\nmodifiers.snap = snap;\nmodifiers.names.push('snap');\n\ndefaultOptions.perAction.snap = snap.defaults;\n\nmodule.exports = snap;\n","// This module allows snapping of the size of targets during resize\n// interactions.\n\nconst modifiers = require('./index');\nconst snap = require('./snap');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\nconst utils = require('../utils/');\n\nconst snapSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n },\n\n setOffset: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.edges;\n\n if (!edges) { return; }\n\n arg.options = {\n relativePoints: [{\n x: edges.left? 0 : 1,\n y: edges.top ? 0 : 1,\n }],\n origin: { x: 0, y: 0 },\n offset: 'self',\n range: options.range,\n };\n\n const offsets = snap.setOffset(arg);\n arg.options = options;\n\n return offsets;\n },\n\n set: function (arg) {\n const { interaction, options, offset, pageCoords } = arg;\n const page = utils.extend({}, pageCoords);\n const relativeX = page.x - offset[0].x;\n const relativeY = page.y - offset[0].y;\n\n arg.options = utils.extend({}, options);\n arg.options.targets = [];\n\n for (const snapTarget of options.targets) {\n let target;\n\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n if ('width' in target && 'height' in target) {\n target.x = target.width;\n target.y = target.height;\n }\n\n arg.options.targets.push(target);\n }\n\n snap.set(arg);\n },\n\n modifyCoords: function (arg) {\n const { options } = arg;\n\n arg.options = utils.extend({}, options);\n arg.options.enabled = options.enabled;\n arg.options.relativePoints = [null];\n\n snap.modifyCoords(arg);\n },\n};\n\nmodifiers.snapSize = snapSize;\nmodifiers.names.push('snapSize');\n\ndefaultOptions.perAction.snapSize = snapSize.defaults;\nresize.defaults.snapSize = snapSize.defaults;\n\nmodule.exports = snapSize;\n","const pointerUtils = require('../utils/pointerUtils');\n\nmodule.exports = class PointerEvent {\n constructor (type, pointer, event, eventTarget, interaction) {\n pointerUtils.pointerExtend(this, event);\n\n if (event !== pointer) {\n pointerUtils.pointerExtend(this, pointer);\n }\n\n this.interaction = interaction;\n\n this.timeStamp = new Date().getTime();\n this.originalEvent = event;\n this.type = type;\n this.pointerId = pointerUtils.getPointerId(pointer);\n this.pointerType = pointerUtils.getPointerType(pointer, interaction);\n this.target = eventTarget;\n this.currentTarget = null;\n\n if (type === 'tap') {\n const pointerIndex = interaction.getPointerIndex(pointer);\n this.dt = this.timeStamp - interaction.downTimes[pointerIndex];\n\n const interval = this.timeStamp - interaction.tapTime;\n\n this.double = !!(interaction.prevTap\n && interaction.prevTap.type !== 'doubletap'\n && interaction.prevTap.target === this.target\n && interval < 500);\n }\n else if (type === 'doubletap') {\n this.dt = pointer.timeStamp - interaction.tapTime;\n }\n }\n\n subtractOrigin ({ x: originX, y: originY }) {\n this.pageX -= originX;\n this.pageY -= originY;\n this.clientX -= originX;\n this.clientY -= originY;\n\n return this;\n }\n\n addOrigin ({ x: originX, y: originY }) {\n this.pageX += originX;\n this.pageY += originY;\n this.clientX += originX;\n this.clientY += originY;\n\n return this;\n }\n\n preventDefault () {\n this.originalEvent.preventDefault();\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n};\n","const PointerEvent = require('./PointerEvent');\nconst Interaction = require('../Interaction');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst defaults = require('../defaultOptions');\nconst signals = require('../utils/Signals').new();\nconst { filter } = require('../utils/arr');\n\nconst simpleSignals = [ 'down', 'up', 'cancel' ];\nconst simpleEvents = [ 'down', 'up', 'cancel' ];\n\nconst pointerEvents = {\n PointerEvent,\n fire,\n collectEventTargets,\n signals,\n defaults: {\n holdDuration: 600,\n ignoreFrom : null,\n allowFrom : null,\n origin : { x: 0, y: 0 },\n },\n types: [\n 'down',\n 'move',\n 'up',\n 'cancel',\n 'tap',\n 'doubletap',\n 'hold',\n ],\n};\n\nfunction fire (arg) {\n const {\n interaction, pointer, event, eventTarget,\n type = arg.pointerEvent.type,\n targets = collectEventTargets(arg),\n pointerEvent = new PointerEvent(type, pointer, event, eventTarget, interaction),\n } = arg;\n\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n targets,\n type,\n pointerEvent,\n };\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n\n for (const prop in target.props || {}) {\n pointerEvent[prop] = target.props[prop];\n }\n\n const origin = utils.getOriginXY(target.eventable, target.element);\n\n pointerEvent.subtractOrigin(origin);\n pointerEvent.eventable = target.eventable;\n pointerEvent.currentTarget = target.element;\n\n target.eventable.fire(pointerEvent);\n\n pointerEvent.addOrigin(origin);\n\n if (pointerEvent.immediatePropagationStopped\n || (pointerEvent.propagationStopped\n && (i + 1) < targets.length && targets[i + 1].element !== pointerEvent.currentTarget)) {\n break;\n }\n }\n\n signals.fire('fired', signalArg);\n\n if (type === 'tap') {\n // if pointerEvent should make a double tap, create and fire a doubletap\n // PointerEvent and use that as the prevTap\n const prevTap = pointerEvent.double\n ? fire({\n interaction, pointer, event, eventTarget,\n type: 'doubletap',\n })\n : pointerEvent;\n\n interaction.prevTap = prevTap;\n interaction.tapTime = prevTap.timeStamp;\n }\n\n return pointerEvent;\n}\n\nfunction collectEventTargets ({ interaction, pointer, event, eventTarget, type }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n // do not fire a tap event if the pointer was moved before being lifted\n if (type === 'tap' && (interaction.pointerWasMoved\n // or if the pointerup target is different to the pointerdown target\n || !(interaction.downTargets[pointerIndex] && interaction.downTargets[pointerIndex] === eventTarget))) {\n return [];\n }\n\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n path,\n targets: [],\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (type === 'hold') {\n signalArg.targets = filter(signalArg.targets, target =>\n target.eventable.options.holdDuration === interaction.holdTimers[pointerIndex].duration);\n }\n\n return signalArg.targets;\n}\n\nInteraction.signals.on('update-pointer-down', function ({ interaction, pointerIndex }) {\n interaction.holdTimers[pointerIndex] = { duration: Infinity, timeout: null };\n});\n\nInteraction.signals.on('remove-pointer', function ({ interaction, pointerIndex }) {\n interaction.holdTimers.splice(pointerIndex, 1);\n});\n\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget, duplicateMove }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n if (!duplicateMove && (!interaction.pointerIsDown || interaction.pointerWasMoved)) {\n if (interaction.pointerIsDown) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n\n fire({\n interaction, pointer, event, eventTarget,\n type: 'move',\n });\n }\n});\n\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget, pointerIndex }) {\n // copy event to be used in timeout for IE8\n const eventCopy = browser.isIE8? utils.extend({}, event) : event;\n\n const timer = interaction.holdTimers[pointerIndex];\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'hold',\n targets: [],\n path,\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (!signalArg.targets.length) { return; }\n\n let minDuration = Infinity;\n\n for (let i = 0; i < signalArg.targets.length; i++) {\n const target = signalArg.targets[i];\n const holdDuration = target.eventable.options.holdDuration;\n\n if (holdDuration < minDuration) {\n minDuration = holdDuration;\n }\n }\n\n timer.duration = minDuration;\n timer.timeout = setTimeout(function () {\n fire({\n interaction, eventCopy, eventTarget,\n pointer: browser.isIE8? eventCopy : pointer,\n type: 'hold',\n });\n }, minDuration);\n});\n\nInteraction.signals.on('up', ({ interaction, pointer, event, eventTarget }) => {\n if (!interaction.pointerWasMoved) {\n fire({ interaction, eventTarget, pointer, event, type: 'tap' });\n }\n});\n\n['up', 'cancel'].forEach(function (signalName) {\n Interaction.signals.on(signalName, function ({ interaction, pointerIndex }) {\n if (interaction.holdTimers[pointerIndex]) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n });\n});\n\nfunction createSignalListener (type) {\n return function ({ interaction, pointer, event, eventTarget }) {\n fire({ interaction, eventTarget, pointer, event, type });\n };\n}\n\nfor (let i = 0; i < simpleSignals.length; i++) {\n Interaction.signals.on(simpleSignals[i], createSignalListener(simpleEvents[i]));\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.prevTap = null; // the most recent tap event on this interaction\n interaction.tapTime = 0; // time of the most recent tap event\n interaction.holdTimers = []; // [{ duration, timeout }]\n});\n\ndefaults.pointerEvents = pointerEvents.defaults;\nmodule.exports = pointerEvents;\n","const pointerEvents = require('./base');\nconst Interaction = require('../Interaction');\n\npointerEvents.signals.on('new', onNew);\npointerEvents.signals.on('fired', onFired);\n\nfor (const signal of ['move', 'up', 'cancel', 'endall']) {\n Interaction.signals.on(signal, endHoldRepeat);\n}\n\nfunction onNew ({ pointerEvent }) {\n if (pointerEvent.type !== 'hold') { return; }\n\n pointerEvent.count = (pointerEvent.count || 0) + 1;\n}\n\nfunction onFired ({ interaction, pointerEvent, eventTarget, targets }) {\n if (pointerEvent.type !== 'hold' || !targets.length) { return; }\n\n // get the repeat interval from the first eventable\n const interval = targets[0].eventable.options.holdRepeatInterval;\n\n // don't repeat if the interval is 0 or less\n if (interval <= 0) { return; }\n\n // set a timeout to fire the holdrepeat event\n interaction.holdIntervalHandle = setTimeout(function () {\n pointerEvents.fire({\n interaction,\n eventTarget,\n type: 'hold',\n pointer: pointerEvent,\n event: pointerEvent,\n });\n }, interval);\n}\n\nfunction endHoldRepeat ({ interaction }) {\n // set the interaction's holdStopTime property\n // to stop further holdRepeat events\n if (interaction.holdIntervalHandle) {\n clearInterval(interaction.holdIntervalHandle);\n interaction.holdIntervalHandle = null;\n }\n}\n\n// don't repeat by default\npointerEvents.defaults.holdRepeatInterval = 0;\npointerEvents.types.push('holdrepeat');\n\nmodule.exports = {\n onNew,\n onFired,\n endHoldRepeat,\n};\n","const pointerEvents = require('./base');\nconst Interactable = require('../Interactable');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\nconst scope = require('../scope');\nconst extend = require('../utils/extend');\nconst { merge } = require('../utils/arr');\n\npointerEvents.signals.on('collect-targets', function ({ targets, element, type, eventTarget }) {\n function collectSelectors (interactable, selector, context) {\n const els = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && is.element(element)\n && domUtils.matchesSelector(element, selector, els)\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n const interactable = scope.interactables.get(element);\n\n if (interactable) {\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n scope.interactables.forEachSelector(collectSelectors, element);\n});\n\nInteractable.signals.on('new', function ({ interactable }) {\n interactable.events.getRect = function (element) {\n return interactable.getRect(element);\n };\n});\n\nInteractable.signals.on('set', function ({ interactable, options }) {\n extend(interactable.events.options, pointerEvents.defaults);\n extend(interactable.events.options, options);\n});\n\nmerge(Interactable.eventTypes, pointerEvents.types);\n\nInteractable.prototype.pointerEvents = function (options) {\n extend(this.events.options, options);\n\n return this;\n};\n\nconst __backCompatOption = Interactable.prototype._backCompatOption;\n\nInteractable.prototype._backCompatOption = function (optionName, newValue) {\n const ret = __backCompatOption.call(this, optionName, newValue);\n\n if (ret === this) {\n this.events.options[optionName] = newValue;\n }\n\n return ret;\n};\n\nInteractable.settingsMethods.push('pointerEvents');\n","const utils = require('./utils');\nconst events = require('./utils/events');\nconst signals = require('./utils/Signals').new();\n\nconst scope = {\n signals,\n events,\n utils,\n\n // main document\n document: require('./utils/domObjects').document,\n // all documents being listened to\n documents: [],\n\n addDocument: function (doc, win) {\n // do nothing if document is already known\n if (utils.contains(scope.documents, doc)) { return false; }\n\n win = win || scope.getWindow(doc);\n\n scope.documents.push(doc);\n events.documents.push(doc);\n\n // don't add an unload event for the main document\n // so that the page may be cached in browser history\n if (doc !== scope.document) {\n events.add(win, 'unload', scope.onWindowUnload);\n }\n\n signals.fire('add-document', { doc, win });\n },\n\n removeDocument: function (doc, win) {\n const index = utils.indexOf(scope.documents, doc);\n\n win = win || scope.getWindow(doc);\n\n events.remove(win, 'unload', scope.onWindowUnload);\n\n scope.documents.splice(index, 1);\n events.documents.splice(index, 1);\n\n signals.fire('remove-document', { win, doc });\n },\n\n onWindowUnload: function () {\n scope.removeDocument(this.document, this);\n },\n};\n\nmodule.exports = scope;\n","const { indexOf } = require('./arr');\n\nclass Signals {\n constructor () {\n this.listeners = {\n // signalName: [listeners],\n };\n }\n\n on (name, listener) {\n if (!this.listeners[name]) {\n this.listeners[name] = [listener];\n return;\n }\n\n this.listeners[name].push(listener);\n }\n\n off (name, listener) {\n if (!this.listeners[name]) { return; }\n\n const index = indexOf(this.listeners[name], listener);\n\n if (index !== -1) {\n this.listeners[name].splice(index, 1);\n }\n }\n\n fire (name, arg) {\n const targetListeners = this.listeners[name];\n\n if (!targetListeners) { return; }\n\n for (let i = 0; i < targetListeners.length; i++) {\n if (targetListeners[i](arg, name) === false) {\n return;\n }\n }\n }\n}\n\nSignals.new = function () {\n return new Signals();\n};\n\nmodule.exports = Signals;\n","function indexOf (array, target) {\n for (let i = 0, len = array.length; i < len; i++) {\n if (array[i] === target) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction contains (array, target) {\n return indexOf(array, target) !== -1;\n}\n\nfunction merge (target, source) {\n for (let i = 0; i < source.length; i++) {\n target.push(source[i]);\n }\n\n return target;\n}\n\nfunction filter (array, test) {\n const result = [];\n\n for (let i = 0; i < array.length; i++) {\n if (test(array[i])) {\n result.push(array[i]);\n }\n }\n\n return result;\n}\n\nmodule.exports = {\n indexOf,\n contains,\n merge,\n filter,\n};\n","const { window } = require('./window');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst Element = domObjects.Element;\nconst navigator = window.navigator;\n\nconst browser = {\n // Does the browser support touch input?\n supportsTouch: !!(('ontouchstart' in window) || is.function(window.DocumentTouch)\n && domObjects.document instanceof window.DocumentTouch),\n\n // Does the browser support PointerEvents\n supportsPointerEvent: !!domObjects.PointerEvent,\n\n isIE8: ('attachEvent' in window) && !('addEventListener' in window),\n\n // Opera Mobile must be handled differently\n isOperaMobile: (navigator.appName === 'Opera'\n && browser.supportsTouch\n && navigator.userAgent.match('Presto')),\n\n // scrolling doesn't change the result of getClientRects on iOS 7\n isIOS7: (/iP(hone|od|ad)/.test(navigator.platform)\n && /OS 7[^\\d]/.test(navigator.appVersion)),\n\n isIe9OrOlder: /MSIE (8|9)/.test(navigator.userAgent),\n\n // prefix matchesSelector\n prefixedMatchesSelector: 'matches' in Element.prototype\n ? 'matches': 'webkitMatchesSelector' in Element.prototype\n ? 'webkitMatchesSelector': 'mozMatchesSelector' in Element.prototype\n ? 'mozMatchesSelector': 'oMatchesSelector' in Element.prototype\n ? 'oMatchesSelector': 'msMatchesSelector',\n\n useMatchesSelectorPolyfill: false,\n\n pEventTypes: (domObjects.PointerEvent\n ? (domObjects.PointerEvent === window.MSPointerEvent\n ? {\n up: 'MSPointerUp',\n down: 'MSPointerDown',\n over: 'mouseover',\n out: 'mouseout',\n move: 'MSPointerMove',\n cancel: 'MSPointerCancel',\n }\n : {\n up: 'pointerup',\n down: 'pointerdown',\n over: 'pointerover',\n out: 'pointerout',\n move: 'pointermove',\n cancel: 'pointercancel',\n })\n : null),\n\n // because Webkit and Opera still use 'mousewheel' event type\n wheelEvent: 'onmousewheel' in domObjects.document? 'mousewheel': 'wheel',\n\n};\n\nbrowser.useMatchesSelectorPolyfill = !is.function(Element.prototype[browser.prefixedMatchesSelector]);\n\nmodule.exports = browser;\n","const domObjects = {};\nconst win = require('./window').window;\n\nfunction blank () {}\n\ndomObjects.document = win.document;\ndomObjects.DocumentFragment = win.DocumentFragment || blank;\ndomObjects.SVGElement = win.SVGElement || blank;\ndomObjects.SVGSVGElement = win.SVGSVGElement || blank;\ndomObjects.SVGElementInstance = win.SVGElementInstance || blank;\ndomObjects.Element = win.Element || blank;\ndomObjects.HTMLElement = win.HTMLElement || domObjects.Element;\n\ndomObjects.Event = win.Event;\ndomObjects.Touch = win.Touch || blank;\ndomObjects.PointerEvent = (win.PointerEvent || win.MSPointerEvent);\n\nmodule.exports = domObjects;\n","const win = require('./window');\nconst browser = require('./browser');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst domUtils = {\n nodeContains: function (parent, child) {\n while (child) {\n if (child === parent) {\n return true;\n }\n\n child = child.parentNode;\n }\n\n return false;\n },\n\n closest: function (element, selector) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) { return element; }\n\n element = domUtils.parentNode(element);\n }\n\n return null;\n },\n\n parentNode: function (node) {\n let parent = node.parentNode;\n\n if (is.docFrag(parent)) {\n // skip past #shado-root fragments\n while ((parent = parent.host) && is.docFrag(parent)) {\n continue;\n }\n\n return parent;\n }\n\n return parent;\n },\n\n // taken from http://tanalin.com/en/blog/2012/12/matches-selector-ie8/ and modified\n matchesSelectorPolyfill: browser.useMatchesSelectorPolyfill\n ? function (element, selector, elems) {\n elems = elems || element.parentNode.querySelectorAll(selector);\n\n for (let i = 0, len = elems.length; i < len; i++) {\n if (elems[i] === element) {\n return true;\n }\n }\n\n return false;\n }\n : null,\n\n matchesSelector: function (element, selector, nodeList) {\n if (browser.useMatchesSelectorPolyfill) {\n return domUtils.matchesSelectorPolyfill(element, selector, nodeList);\n }\n\n // remove /deep/ from selectors if shadowDOM polyfill is used\n if (win.window !== win.realWindow) {\n selector = selector.replace(/\\/deep\\//g, ' ');\n }\n\n return element[browser.prefixedMatchesSelector](selector);\n },\n\n // Test for the element that's \"above\" all other qualifiers\n indexOfDeepestElement: function (elements) {\n let deepestZoneParents = [];\n let dropzoneParents = [];\n let dropzone;\n let deepestZone = elements[0];\n let index = deepestZone? 0: -1;\n let parent;\n let child;\n let i;\n let n;\n\n for (i = 1; i < elements.length; i++) {\n dropzone = elements[i];\n\n // an element might belong to multiple selector dropzones\n if (!dropzone || dropzone === deepestZone) {\n continue;\n }\n\n if (!deepestZone) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n // check if the deepest or current are document.documentElement or document.rootElement\n // - if the current dropzone is, do nothing and continue\n if (dropzone.parentNode === dropzone.ownerDocument) {\n continue;\n }\n // - if deepest is, update with the current dropzone and continue to next\n else if (deepestZone.parentNode === dropzone.ownerDocument) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n if (!deepestZoneParents.length) {\n parent = deepestZone;\n while (parent.parentNode && parent.parentNode !== parent.ownerDocument) {\n deepestZoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n }\n\n // if this element is an svg element and the current deepest is\n // an HTMLElement\n if (deepestZone instanceof domObjects.HTMLElement\n && dropzone instanceof domObjects.SVGElement\n && !(dropzone instanceof domObjects.SVGSVGElement)) {\n\n if (dropzone === deepestZone.parentNode) {\n continue;\n }\n\n parent = dropzone.ownerSVGElement;\n }\n else {\n parent = dropzone;\n }\n\n dropzoneParents = [];\n\n while (parent.parentNode !== parent.ownerDocument) {\n dropzoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n\n n = 0;\n\n // get (position of last common ancestor) + 1\n while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) {\n n++;\n }\n\n const parents = [\n dropzoneParents[n - 1],\n dropzoneParents[n],\n deepestZoneParents[n],\n ];\n\n child = parents[0].lastChild;\n\n while (child) {\n if (child === parents[1]) {\n deepestZone = dropzone;\n index = i;\n deepestZoneParents = [];\n\n break;\n }\n else if (child === parents[2]) {\n break;\n }\n\n child = child.previousSibling;\n }\n }\n\n return index;\n },\n\n matchesUpTo: function (element, selector, limit) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) {\n return true;\n }\n\n element = domUtils.parentNode(element);\n\n if (element === limit) {\n return domUtils.matchesSelector(element, selector);\n }\n }\n\n return false;\n },\n\n getActualElement: function (element) {\n return (element instanceof domObjects.SVGElementInstance\n ? element.correspondingUseElement\n : element);\n },\n\n getScrollXY: function (relevantWindow) {\n relevantWindow = relevantWindow || win.window;\n return {\n x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft,\n y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop,\n };\n },\n\n getElementClientRect: function (element) {\n const clientRect = (element instanceof domObjects.SVGElement\n ? element.getBoundingClientRect()\n : element.getClientRects()[0]);\n\n return clientRect && {\n left : clientRect.left,\n right : clientRect.right,\n top : clientRect.top,\n bottom: clientRect.bottom,\n width : clientRect.width || clientRect.right - clientRect.left,\n height: clientRect.height || clientRect.bottom - clientRect.top,\n };\n },\n\n getElementRect: function (element) {\n const clientRect = domUtils.getElementClientRect(element);\n\n if (!browser.isIOS7 && clientRect) {\n const scroll = domUtils.getScrollXY(win.getWindow(element));\n\n clientRect.left += scroll.x;\n clientRect.right += scroll.x;\n clientRect.top += scroll.y;\n clientRect.bottom += scroll.y;\n }\n\n return clientRect;\n },\n\n getPath: function (element) {\n const path = [];\n\n while (element) {\n path.push(element);\n element = domUtils.parentNode(element);\n }\n\n return path;\n },\n\n trySelector: value => {\n if (!is.string(value)) { return false; }\n\n // an exception will be raised if it is invalid\n domObjects.document.querySelector(value);\n return true;\n },\n};\n\nmodule.exports = domUtils;\n","const is = require('./is');\nconst domUtils = require('./domUtils');\nconst pExtend = require('./pointerExtend');\n\nconst { window, getWindow } = require('./window');\nconst { indexOf, contains } = require('./arr');\n\nconst useAttachEvent = ('attachEvent' in window) && !('addEventListener' in window);\nconst addEvent = useAttachEvent? 'attachEvent': 'addEventListener';\nconst removeEvent = useAttachEvent? 'detachEvent': 'removeEventListener';\nconst on = useAttachEvent? 'on': '';\n\nconst elements = [];\nconst targets = [];\nconst attachedListeners = [];\n\n// {\n// type: {\n// selectors: ['selector', ...],\n// contexts : [document, ...],\n// listeners: [[listener, capture, passive], ...]\n// }\n// }\nconst delegatedEvents = {};\n\nconst documents = [];\n\nconst supportsOptions = !useAttachEvent && (() => {\n let supported = false;\n\n window.document.createElement('div').addEventListener('test', null, {\n get capture () { supported = true; },\n });\n\n return supported;\n})();\n\nfunction add (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n let elementIndex = indexOf(elements, element);\n let target = targets[elementIndex];\n\n if (!target) {\n target = {\n events: {},\n typeCount: 0,\n };\n\n elementIndex = elements.push(element) - 1;\n targets.push(target);\n\n attachedListeners.push(useAttachEvent\n ? {\n supplied: [],\n wrapped : [],\n useCount: [],\n }\n : null);\n }\n\n if (!target.events[type]) {\n target.events[type] = [];\n target.typeCount++;\n }\n\n if (!contains(target.events[type], listener)) {\n let ret;\n\n if (useAttachEvent) {\n const { supplied, wrapped, useCount } = attachedListeners[elementIndex];\n const listenerIndex = indexOf(supplied, listener);\n\n const wrappedListener = wrapped[listenerIndex] || function (event) {\n if (!event.immediatePropagationStopped) {\n event.target = event.srcElement;\n event.currentTarget = element;\n\n event.preventDefault = event.preventDefault || preventDef;\n event.stopPropagation = event.stopPropagation || stopProp;\n event.stopImmediatePropagation = event.stopImmediatePropagation || stopImmProp;\n\n if (/mouse|click/.test(event.type)) {\n event.pageX = event.clientX + getWindow(element).document.documentElement.scrollLeft;\n event.pageY = event.clientY + getWindow(element).document.documentElement.scrollTop;\n }\n\n listener(event);\n }\n };\n\n ret = element[addEvent](on + type, wrappedListener, !!options.capture);\n\n if (listenerIndex === -1) {\n supplied.push(listener);\n wrapped.push(wrappedListener);\n useCount.push(1);\n }\n else {\n useCount[listenerIndex]++;\n }\n }\n else {\n ret = element[addEvent](type, listener, supportsOptions? options : !!options.capture);\n }\n target.events[type].push(listener);\n\n return ret;\n }\n}\n\nfunction remove (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const elementIndex = indexOf(elements, element);\n const target = targets[elementIndex];\n\n if (!target || !target.events) {\n return;\n }\n\n let wrappedListener = listener;\n let listeners;\n let listenerIndex;\n\n if (useAttachEvent) {\n listeners = attachedListeners[elementIndex];\n listenerIndex = indexOf(listeners.supplied, listener);\n wrappedListener = listeners.wrapped[listenerIndex];\n }\n\n if (type === 'all') {\n for (type in target.events) {\n if (target.events.hasOwnProperty(type)) {\n remove(element, type, 'all');\n }\n }\n return;\n }\n\n if (target.events[type]) {\n const len = target.events[type].length;\n\n if (listener === 'all') {\n for (let i = 0; i < len; i++) {\n remove(element, type, target.events[type][i], options);\n }\n return;\n }\n else {\n for (let i = 0; i < len; i++) {\n if (target.events[type][i] === listener) {\n element[removeEvent](on + type, wrappedListener, supportsOptions? options : !!options.capture);\n target.events[type].splice(i, 1);\n\n if (useAttachEvent && listeners) {\n listeners.useCount[listenerIndex]--;\n if (listeners.useCount[listenerIndex] === 0) {\n listeners.supplied.splice(listenerIndex, 1);\n listeners.wrapped.splice(listenerIndex, 1);\n listeners.useCount.splice(listenerIndex, 1);\n }\n }\n\n break;\n }\n }\n }\n\n if (target.events[type] && target.events[type].length === 0) {\n target.events[type] = null;\n target.typeCount--;\n }\n }\n\n if (!target.typeCount) {\n targets.splice(elementIndex, 1);\n elements.splice(elementIndex, 1);\n attachedListeners.splice(elementIndex, 1);\n }\n}\n\nfunction addDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n if (!delegatedEvents[type]) {\n delegatedEvents[type] = {\n selectors: [],\n contexts : [],\n listeners: [],\n };\n\n // add delegate listener functions\n for (let i = 0; i < documents.length; i++) {\n add(documents[i], type, delegateListener);\n add(documents[i], type, delegateUseCapture, true);\n }\n }\n\n const delegated = delegatedEvents[type];\n let index;\n\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n break;\n }\n }\n\n if (index === -1) {\n index = delegated.selectors.length;\n\n delegated.selectors.push(selector);\n delegated.contexts .push(context);\n delegated.listeners.push([]);\n }\n\n // keep listener and capture and passive flags\n delegated.listeners[index].push([listener, !!options.capture, options.passive]);\n}\n\nfunction removeDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const delegated = delegatedEvents[type];\n let matchFound = false;\n let index;\n\n if (!delegated) { return; }\n\n // count from last index of delegated to 0\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n // look for matching selector and context Node\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n\n const listeners = delegated.listeners[index];\n\n // each item of the listeners array is an array: [function, capture, passive]\n for (let i = listeners.length - 1; i >= 0; i--) {\n const [fn, capture, passive] = listeners[i];\n\n // check if the listener functions and capture and passive flags match\n if (fn === listener && capture === !!options.capture && passive === options.passive) {\n // remove the listener from the array of listeners\n listeners.splice(i, 1);\n\n // if all listeners for this interactable have been removed\n // remove the interactable from the delegated arrays\n if (!listeners.length) {\n delegated.selectors.splice(index, 1);\n delegated.contexts .splice(index, 1);\n delegated.listeners.splice(index, 1);\n\n // remove delegate function from context\n remove(context, type, delegateListener);\n remove(context, type, delegateUseCapture, true);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegatedEvents[type] = null;\n }\n }\n\n // only remove one listener\n matchFound = true;\n break;\n }\n }\n\n if (matchFound) { break; }\n }\n }\n}\n\n// bound to the interactable context when a DOM event\n// listener is added to a selector interactable\nfunction delegateListener (event, optionalArg) {\n const options = getOptions(optionalArg);\n const fakeEvent = {};\n const delegated = delegatedEvents[event.type];\n const eventTarget = (domUtils.getActualElement(event.path\n ? event.path[0]\n : event.target));\n let element = eventTarget;\n\n // duplicate the event so that currentTarget can be changed\n pExtend(fakeEvent, event);\n\n fakeEvent.originalEvent = event;\n fakeEvent.preventDefault = preventOriginalDefault;\n\n // climb up document tree looking for selector matches\n while (is.element(element)) {\n for (let i = 0; i < delegated.selectors.length; i++) {\n const selector = delegated.selectors[i];\n const context = delegated.contexts[i];\n\n if (domUtils.matchesSelector(element, selector)\n && domUtils.nodeContains(context, eventTarget)\n && domUtils.nodeContains(context, element)) {\n\n const listeners = delegated.listeners[i];\n\n fakeEvent.currentTarget = element;\n\n for (let j = 0; j < listeners.length; j++) {\n const [fn, capture, passive] = listeners[j];\n\n if (capture === !!options.capture && passive === options.passive) {\n fn(fakeEvent);\n }\n }\n }\n }\n\n element = domUtils.parentNode(element);\n }\n}\n\nfunction delegateUseCapture (event) {\n return delegateListener.call(this, event, true);\n}\n\nfunction preventDef () {\n this.returnValue = false;\n}\n\nfunction preventOriginalDefault () {\n this.originalEvent.preventDefault();\n}\n\nfunction stopProp () {\n this.cancelBubble = true;\n}\n\nfunction stopImmProp () {\n this.cancelBubble = true;\n this.immediatePropagationStopped = true;\n}\n\nfunction getOptions (param) {\n return is.object(param)? param : { capture: param };\n}\n\nmodule.exports = {\n add,\n remove,\n\n addDelegate,\n removeDelegate,\n\n delegateListener,\n delegateUseCapture,\n delegatedEvents,\n documents,\n\n useAttachEvent,\n supportsOptions,\n\n _elements: elements,\n _targets: targets,\n _attachedListeners: attachedListeners,\n};\n","module.exports = function extend (dest, source) {\n for (const prop in source) {\n dest[prop] = source[prop];\n }\n return dest;\n};\n","const {\n resolveRectLike,\n rectToXY,\n} = require('./rect');\n\nmodule.exports = function (target, element, action) {\n const actionOptions = target.options[action];\n const actionOrigin = actionOptions && actionOptions.origin;\n const origin = actionOrigin || target.options.origin;\n\n const originRect = resolveRectLike(origin, target, element, [target && element]);\n\n return rectToXY(originRect) || { x: 0, y: 0 };\n};\n","module.exports = (x, y) => Math.sqrt(x * x + y * y);\n","const extend = require('./extend');\nconst win = require('./window');\n\nconst utils = {\n warnOnce: function (method, message) {\n let warned = false;\n\n return function () {\n if (!warned) {\n win.window.console.warn(message);\n warned = true;\n }\n\n return method.apply(this, arguments);\n };\n },\n\n // http://stackoverflow.com/a/5634528/2280888\n _getQBezierValue: function (t, p1, p2, p3) {\n const iT = 1 - t;\n return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3;\n },\n\n getQuadraticCurvePoint: function (startX, startY, cpX, cpY, endX, endY, position) {\n return {\n x: utils._getQBezierValue(position, startX, cpX, endX),\n y: utils._getQBezierValue(position, startY, cpY, endY),\n };\n },\n\n // http://gizma.com/easing/\n easeOutQuad: function (t, b, c, d) {\n t /= d;\n return -c * t*(t-2) + b;\n },\n\n copyAction: function (dest, src) {\n dest.name = src.name;\n dest.axis = src.axis;\n dest.edges = src.edges;\n\n return dest;\n },\n\n is : require('./is'),\n extend : extend,\n hypot : require('./hypot'),\n getOriginXY: require('./getOriginXY'),\n};\n\nextend(utils, require('./arr'));\nextend(utils, require('./domUtils'));\nextend(utils, require('./pointerUtils'));\nextend(utils, require('./rect'));\n\nmodule.exports = utils;\n","const scope = require('../scope');\nconst utils = require('./index');\nconst browser = require('./browser');\n\nconst finder = {\n methodOrder: [ 'simulationResume', 'mouse', 'hasPointer', 'idle' ],\n\n search: function (pointer, eventType, eventTarget) {\n const mouseEvent = (/mouse/i.test(pointer.pointerType || eventType)\n // MSPointerEvent.MSPOINTER_TYPE_MOUSE\n || pointer.pointerType === 4);\n const pointerId = utils.getPointerId(pointer);\n const details = { pointer, pointerId, mouseEvent, eventType, eventTarget };\n\n for (const method of finder.methodOrder) {\n const interaction = finder[method](details);\n\n if (interaction) {\n return interaction;\n }\n }\n },\n\n // try to resume simulation with a new pointer\n simulationResume: function ({ mouseEvent, eventType, eventTarget }) {\n if (!/down|start/i.test(eventType)) {\n return null;\n }\n\n for (const interaction of scope.interactions) {\n let element = eventTarget;\n\n if (interaction.simulation && interaction.simulation.allowResume\n && (interaction.mouse === mouseEvent)) {\n while (element) {\n // if the element is the interaction element\n if (element === interaction.element) {\n return interaction;\n }\n element = utils.parentNode(element);\n }\n }\n }\n\n return null;\n },\n\n // if it's a mouse interaction\n mouse: function ({ pointerId, mouseEvent, eventType }) {\n if (!mouseEvent && (browser.supportsTouch || browser.supportsPointerEvent)) {\n return null;\n }\n\n let firstNonActive;\n\n for (const interaction of scope.interactions) {\n if (interaction.mouse) {\n // if it's a down event, skip interactions with running simulations\n if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; }\n\n // if the interaction is active, return it immediately\n if (interaction.interacting()) {\n return interaction;\n }\n // otherwise save it and look for another active interaction\n else if (!firstNonActive) {\n firstNonActive = interaction;\n }\n }\n }\n\n // if no active mouse interaction was found use the first inactive mouse\n // interaction\n if (firstNonActive) {\n return firstNonActive;\n }\n\n // Find any interaction specifically for mouse.\n // ignore the interaction if the eventType is a mousedown, and a simulation\n // is active\n for (const interaction of scope.interactions) {\n if (interaction.mouse && !(/down/.test(eventType) && interaction.simulation)) {\n return interaction;\n }\n }\n\n return null;\n },\n\n // get interaction that has this pointer\n hasPointer: function ({ pointerId }) {\n for (const interaction of scope.interactions) {\n if (utils.contains(interaction.pointerIds, pointerId)) {\n return interaction;\n }\n }\n },\n\n // get first idle interaction\n idle: function ({ mouseEvent }) {\n for (const interaction of scope.interactions) {\n // if there's already a pointer held down\n if (interaction.pointerIds.length === 1) {\n const target = interaction.target;\n // don't add this pointer if there is a target interactable and it\n // isn't gesturable\n if (target && !target.options.gesture.enabled) {\n continue;\n }\n }\n // maximum of 2 pointers per interaction\n else if (interaction.pointerIds.length >= 2) {\n continue;\n }\n\n if (!interaction.interacting() && (mouseEvent === interaction.mouse)) {\n return interaction;\n }\n }\n\n return null;\n },\n};\n\nmodule.exports = finder;\n","const win = require('./window');\nconst isWindow = require('./isWindow');\n\nconst is = {\n array : () => {},\n\n window : thing => thing === win.window || isWindow(thing),\n\n docFrag : thing => is.object(thing) && thing.nodeType === 11,\n\n object : thing => !!thing && (typeof thing === 'object'),\n\n function: thing => typeof thing === 'function',\n\n number : thing => typeof thing === 'number' ,\n\n bool : thing => typeof thing === 'boolean' ,\n\n string : thing => typeof thing === 'string' ,\n\n element: thing => {\n if (!thing || (typeof thing !== 'object')) { return false; }\n\n const _window = win.getWindow(thing) || win.window;\n\n return (/object|function/.test(typeof _window.Element)\n ? thing instanceof _window.Element //DOM2\n : thing.nodeType === 1 && typeof thing.nodeName === 'string');\n },\n};\n\nis.array = thing => (is.object(thing)\n && (typeof thing.length !== 'undefined')\n && is.function(thing.splice));\n\nmodule.exports = is;\n","module.exports = (thing) => !!(thing && thing.Window) && (thing instanceof thing.Window);\n","function pointerExtend (dest, source) {\n for (const prop in source) {\n const prefixedPropREs = module.exports.prefixedPropREs;\n let deprecated = false;\n\n // skip deprecated prefixed properties\n for (const vendor in prefixedPropREs) {\n if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) {\n deprecated = true;\n break;\n }\n }\n\n if (!deprecated && typeof source[prop] !== 'function') {\n dest[prop] = source[prop];\n }\n }\n return dest;\n}\n\npointerExtend.prefixedPropREs = {\n webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/,\n};\n\nmodule.exports = pointerExtend;\n","const hypot = require('./hypot');\nconst browser = require('./browser');\nconst dom = require('./domObjects');\nconst domUtils = require('./domUtils');\nconst is = require('./is');\nconst pointerExtend = require('./pointerExtend');\n\nconst pointerUtils = {\n copyCoords: function (dest, src) {\n dest.page = dest.page || {};\n dest.page.x = src.page.x;\n dest.page.y = src.page.y;\n\n dest.client = dest.client || {};\n dest.client.x = src.client.x;\n dest.client.y = src.client.y;\n\n dest.timeStamp = src.timeStamp;\n },\n\n setCoordDeltas: function (targetObj, prev, cur) {\n targetObj.page.x = cur.page.x - prev.page.x;\n targetObj.page.y = cur.page.y - prev.page.y;\n targetObj.client.x = cur.client.x - prev.client.x;\n targetObj.client.y = cur.client.y - prev.client.y;\n targetObj.timeStamp = cur.timeStamp - prev.timeStamp;\n\n // set pointer velocity\n const dt = Math.max(targetObj.timeStamp / 1000, 0.001);\n\n targetObj.page.speed = hypot(targetObj.page.x, targetObj.page.y) / dt;\n targetObj.page.vx = targetObj.page.x / dt;\n targetObj.page.vy = targetObj.page.y / dt;\n\n targetObj.client.speed = hypot(targetObj.client.x, targetObj.page.y) / dt;\n targetObj.client.vx = targetObj.client.x / dt;\n targetObj.client.vy = targetObj.client.y / dt;\n },\n\n isNativePointer: function (pointer) {\n return (pointer instanceof dom.Event || pointer instanceof dom.Touch);\n },\n\n // Get specified X/Y coords for mouse or event.touches[0]\n getXY: function (type, pointer, xy) {\n xy = xy || {};\n type = type || 'page';\n\n xy.x = pointer[type + 'X'];\n xy.y = pointer[type + 'Y'];\n\n return xy;\n },\n\n getPageXY: function (pointer, page) {\n page = page || {};\n\n // Opera Mobile handles the viewport and scrolling oddly\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n pointerUtils.getXY('screen', pointer, page);\n\n page.x += window.scrollX;\n page.y += window.scrollY;\n }\n else {\n pointerUtils.getXY('page', pointer, page);\n }\n\n return page;\n },\n\n getClientXY: function (pointer, client) {\n client = client || {};\n\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n // Opera Mobile handles the viewport and scrolling oddly\n pointerUtils.getXY('screen', pointer, client);\n }\n else {\n pointerUtils.getXY('client', pointer, client);\n }\n\n return client;\n },\n\n getPointerId: function (pointer) {\n return is.number(pointer.pointerId)? pointer.pointerId : pointer.identifier;\n },\n\n setCoords: function (targetObj, pointers, timeStamp) {\n const pointer = (pointers.length > 1\n ? pointerUtils.pointerAverage(pointers)\n : pointers[0]);\n\n const tmpXY = {};\n\n pointerUtils.getPageXY(pointer, tmpXY);\n targetObj.page.x = tmpXY.x;\n targetObj.page.y = tmpXY.y;\n\n pointerUtils.getClientXY(pointer, tmpXY);\n targetObj.client.x = tmpXY.x;\n targetObj.client.y = tmpXY.y;\n\n targetObj.timeStamp = is.number(timeStamp) ? timeStamp :new Date().getTime();\n },\n\n pointerExtend: pointerExtend,\n\n getTouchPair: function (event) {\n const touches = [];\n\n // array of touches is supplied\n if (is.array(event)) {\n touches[0] = event[0];\n touches[1] = event[1];\n }\n // an event\n else {\n if (event.type === 'touchend') {\n if (event.touches.length === 1) {\n touches[0] = event.touches[0];\n touches[1] = event.changedTouches[0];\n }\n else if (event.touches.length === 0) {\n touches[0] = event.changedTouches[0];\n touches[1] = event.changedTouches[1];\n }\n }\n else {\n touches[0] = event.touches[0];\n touches[1] = event.touches[1];\n }\n }\n\n return touches;\n },\n\n pointerAverage: function (pointers) {\n const average = {\n pageX : 0,\n pageY : 0,\n clientX: 0,\n clientY: 0,\n screenX: 0,\n screenY: 0,\n };\n\n for (const pointer of pointers) {\n for (const prop in average) {\n average[prop] += pointer[prop];\n }\n }\n for (const prop in average) {\n average[prop] /= pointers.length;\n }\n\n return average;\n },\n\n touchBBox: function (event) {\n if (!event.length && !(event.touches && event.touches.length > 1)) {\n return;\n }\n\n const touches = pointerUtils.getTouchPair(event);\n const minX = Math.min(touches[0].pageX, touches[1].pageX);\n const minY = Math.min(touches[0].pageY, touches[1].pageY);\n const maxX = Math.max(touches[0].pageX, touches[1].pageX);\n const maxY = Math.max(touches[0].pageY, touches[1].pageY);\n\n return {\n x: minX,\n y: minY,\n left: minX,\n top: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n },\n\n touchDistance: function (event, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n\n\n const dx = touches[0][sourceX] - touches[1][sourceX];\n const dy = touches[0][sourceY] - touches[1][sourceY];\n\n return hypot(dx, dy);\n },\n\n touchAngle: function (event, prevAngle, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n const dx = touches[1][sourceX] - touches[0][sourceX];\n const dy = touches[1][sourceY] - touches[0][sourceY];\n const angle = 180 * Math.atan2(dy , dx) / Math.PI;\n\n return angle;\n },\n\n getPointerType: function (pointer, interaction) {\n // if the PointerEvent API isn't available, then the pointer must be ither\n // a MouseEvent or TouchEvent\n if (interaction.mouse) { return 'mouse'; }\n if (!browser.supportsPointerEvent) { return 'touch'; }\n\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : [undefined, undefined,'touch', 'pen', 'mouse'][pointer.pointerType];\n },\n\n // [ event.target, event.currentTarget ]\n getEventTargets: function (event) {\n return [\n domUtils.getActualElement(event.path ? event.path[0] : event.target),\n domUtils.getActualElement(event.currentTarget),\n ];\n },\n};\n\nmodule.exports = pointerUtils;\n","const { window } = require('./window');\n\nconst vendors = ['ms', 'moz', 'webkit', 'o'];\nlet lastTime = 0;\nlet request;\nlet cancel;\n\nfor (let x = 0; x < vendors.length && !window.requestAnimationFrame; x++) {\n request = window[vendors[x] + 'RequestAnimationFrame'];\n cancel = window[vendors[x] +'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n}\n\nif (!request) {\n request = function (callback) {\n const currTime = new Date().getTime();\n const timeToCall = Math.max(0, 16 - (currTime - lastTime));\n const id = setTimeout(function () { callback(currTime + timeToCall); },\n timeToCall);\n\n lastTime = currTime + timeToCall;\n return id;\n };\n}\n\nif (!cancel) {\n cancel = function (id) {\n clearTimeout(id);\n };\n}\n\nmodule.exports = {\n request,\n cancel,\n};\n","const extend = require('./extend');\nconst is = require('./is');\nconst {\n closest,\n parentNode,\n getElementRect,\n} = require('./domUtils');\n\nconst rectUtils = {\n getStringOptionResult: function (value, interactable, element) {\n if (!is.string(value)) {\n return null;\n }\n\n if (value === 'parent') {\n value = parentNode(element);\n }\n else if (value === 'self') {\n value = interactable.getRect(element);\n }\n else {\n value = closest(element, value);\n }\n\n return value;\n },\n\n resolveRectLike: function (value, interactable, element, functionArgs) {\n value = rectUtils.getStringOptionResult(value, interactable, element) || value;\n\n if (is.function(value)) {\n value = value.apply(null, functionArgs);\n }\n\n if (is.element(value)) {\n value = getElementRect(value);\n }\n\n return value;\n },\n\n rectToXY: function (rect) {\n return rect && {\n x: 'x' in rect ? rect.x : rect.left,\n y: 'y' in rect ? rect.y : rect.top,\n };\n },\n\n xywhToTlbr: function (rect) {\n if (rect && !('left' in rect && 'top' in rect)) {\n rect = extend({}, rect);\n\n rect.left = rect.x || 0;\n rect.top = rect.y || 0;\n rect.right = rect.right || (rect.left + rect.width);\n rect.bottom = rect.bottom || (rect.top + rect.height);\n }\n\n return rect;\n },\n\n tlbrToXywh: function (rect) {\n if (rect && !('x' in rect && 'y' in rect)) {\n rect = extend({}, rect);\n\n rect.x = rect.left || 0;\n rect.top = rect.top || 0;\n rect.width = rect.width || (rect.right - rect.x);\n rect.height = rect.height || (rect.bottom - rect.y);\n }\n\n return rect;\n },\n};\n\nmodule.exports = rectUtils;\n","const win = module.exports;\nconst isWindow = require('./isWindow');\n\nfunction init (window) {\n // get wrapped window if using Shadow DOM polyfill\n\n win.realWindow = window;\n\n // create a TextNode\n const el = window.document.createTextNode('');\n\n // check if it's wrapped by a polyfill\n if (el.ownerDocument !== window.document\n && typeof window.wrap === 'function'\n && window.wrap(el) === el) {\n // use wrapped window\n window = window.wrap(window);\n }\n\n win.window = window;\n}\n\nif (typeof window === 'undefined') {\n win.window = undefined;\n win.realWindow = undefined;\n}\nelse {\n init(window);\n}\n\nwin.getWindow = function getWindow (node) {\n if (isWindow(node)) {\n return node;\n }\n\n const rootNode = (node.ownerDocument || node);\n\n return rootNode.defaultView || rootNode.parentWindow || win.window;\n};\n\nwin.init = init;\n"]} \ No newline at end of file +{"version":3,"sources":["src/minHeader.js","src/header.js","index.js","src/Eventable.js","src/InteractEvent.js","src/Interactable.js","src/Interaction.js","src/actions/base.js","src/actions/drag.js","src/actions/drop.js","src/actions/gesture.js","src/actions/resize.js","src/autoScroll.js","src/autoStart/InteractableMethods.js","src/autoStart/base.js","src/autoStart/delay.js","src/autoStart/drag.js","src/autoStart/gesture.js","src/autoStart/resize.js","src/defaultOptions.js","src/index.js","src/inertia.js","src/interact.js","src/interactablePreventDefault.js","src/legacyBrowsers.js","src/modifiers/index.js","src/modifiers/restrict.js","src/modifiers/restrictEdges.js","src/modifiers/restrictSize.js","src/modifiers/snap.js","src/modifiers/snapSize.js","src/pointerEvents/PointerEvent.js","src/pointerEvents/base.js","src/pointerEvents/holdRepeat.js","src/pointerEvents/interactableTargets.js","src/scope.js","src/utils/Signals.js","src/utils/arr.js","src/utils/browser.js","src/utils/domObjects.js","src/utils/domUtils.js","src/utils/events.js","src/utils/extend.js","src/utils/getOriginXY.js","src/utils/hypot.js","src/utils/index.js","src/utils/interactionFinder.js","src/utils/is.js","src/utils/isWindow.js","src/utils/pointerExtend.js","src/utils/pointerUtils.js","src/utils/raf.js","src/utils/rect.js","src/utils/window.js"],"names":[],"mappings":";AAAA,CCMA,SAAA,GAAA,GAAA,gBAAA,UAAA,mBAAA,QAAA,OAAA,QAAA,QAAA,IAAA,kBAAA,SAAA,OAAA,IAAA,UAAA,OAAA,CAAA,GAAA,EAAA,GAAA,mBAAA,QAAA,OAAA,mBAAA,QAAA,OAAA,mBAAA,MAAA,KAAA,KAAA,EAAA,SAAA,MAAA,WAAA,MAAA,SAAA,GAAA,EAAA,EAAA,GAAA,QAAA,GAAA,EAAA,GAAA,IAAA,EAAA,GAAA,CAAA,IAAA,EAAA,GAAA,CAAA,GAAA,GAAA,kBAAA,UAAA,OAAA,KAAA,GAAA,EAAA,MAAA,GAAA,GAAA,EAAA,IAAA,EAAA,MAAA,GAAA,GAAA,EAAA,IAAA,GAAA,GAAA,OAAA,uBAAA,EAAA,IAAA,MAAA,GAAA,KAAA,mBAAA,EAAA,GAAA,GAAA,EAAA,IAAA,WAAA,GAAA,GAAA,GAAA,KAAA,EAAA,QAAA,SAAA,GAAA,GAAA,GAAA,EAAA,GAAA,GAAA,EAAA,OAAA,GAAA,GAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,GAAA,MAAA,GAAA,GAAA,QAAA,IAAA,GAAA,GAAA,kBAAA,UAAA,QAAA,EAAA,EAAA,EAAA,EAAA,OAAA,IAAA,EAAA,EAAA,GAAA,OAAA,KAAA,GAAA,SAAA,EAAA,EAAA,GACA,YCCsB,oBAAX,QACT,EAAO,QAAU,SAAU,GAGzB,MAFA,GAAQ,sBAAsB,KAAK,GAE5B,EAAQ,gBAIjB,EAAO,QAAU,EAAQ,0LCb3B,QAAS,GAA2B,EAAO,GACzC,IAAK,GAAI,GAAI,EAAG,EAAM,EAAU,OAAQ,EAAI,IAAQ,EAAM,4BAA6B,IACrF,EAAU,GAAG,SALG,EAAQ,eAApB,IAAA,QACF,EAAS,EAAQ,qBAQjB,aAEJ,QAAA,GAAa,GAAS,EAAA,KAAA,GACpB,KAAK,QAAU,KAAW,0BAG5B,cAAM,GACJ,GAAI,OAAA,GACE,EAAU,KAAO,EAAM,KACvB,EAAS,KAAK,QAGf,EAAY,KAAK,EAAM,QAC1B,EAA0B,EAAO,GAI/B,KAAK,IACP,KAAK,GAAS,IAIX,EAAM,oBAAsB,IAAW,EAAY,EAAO,EAAM,QACnE,EAA0B,EAAO,gBAIrC,YAAI,EAAW,GAET,KAAK,GACP,KAAK,GAAW,KAAK,GAGrB,KAAK,IAAc,gBAIvB,aAAK,EAAW,GAEd,GAAM,GAAY,KAAK,GACjB,EAAY,EAAW,EAAQ,EAAW,IAAa,GAE9C,IAAX,GACF,EAAU,OAAO,EAAO,IAGtB,GAAkC,IAArB,EAAU,SAAiB,KAC1C,KAAK,GAAa,QAKxB,GAAO,QAAU,4KC7DjB,GAAM,GAAc,EAAQ,kBACtB,EAAc,EAAQ,uBACtB,EAAc,EAAQ,oBACtB,EAAc,EAAQ,mBAAmB,MAEzC,aACJ,QAAA,GAAa,EAAa,EAAO,EAAQ,EAAO,EAAS,GAAyB,GAAhB,GAAgB,UAAA,OAAA,OAAA,KAAA,UAAA,IAAA,UAAA,EAAA,GAAA,KAAA,EAChF,IAAM,GAAc,EAAY,OAC1B,GAAe,GAAU,EAAO,SAAW,GAAU,YACrD,EAAc,EAAY,EAAQ,EAAS,GAC3C,EAAwB,UAAV,EACd,EAAwB,QAAV,EACd,EAAc,EAAU,EAAY,YAAc,EAAY,UAC9D,EAAc,EAAY,SAEhC,GAAU,GAAW,EAAY,OAEjC,IAAM,GAAS,KAAW,EAAO,MAC3B,EAAS,KAAW,EAAO,OAEjC,GAAK,GAAK,EAAO,EACjB,EAAK,GAAK,EAAO,EAEjB,EAAO,GAAK,EAAO,EACnB,EAAO,GAAK,EAAO,EAEnB,KAAK,QAAgB,EAAM,QAC3B,KAAK,OAAgB,EAAM,OAC3B,KAAK,SAAgB,EAAM,SAC3B,KAAK,QAAgB,EAAM,QAC3B,KAAK,OAAgB,EAAM,OAC3B,KAAK,QAAgB,EAAM,QAC3B,KAAK,OAAgB,EACrB,KAAK,cAAgB,EACrB,KAAK,cAAgB,GAAW,KAChC,KAAK,OAAgB,EACrB,KAAK,KAAgB,GAAU,GAAS,IACxC,KAAK,YAAgB,EACrB,KAAK,aAAgB,EAErB,KAAK,GAAK,EAAW,EAAY,UAAU,EAAY,UAAU,OAAS,GACrD,EAAU,EAE/B,IAAM,IACJ,YAAA,EACA,MAAA,EACA,OAAA,EACA,MAAA,EACA,QAAA,EACA,QAAA,EACA,KAAA,EACA,OAAA,EACA,OAAA,EACA,SAAA,EACA,OAAA,EACA,YAAA,EACA,OAAQ,KAGV,GAAQ,KAAK,SAAU,GAEnB,GAEF,KAAK,MAAQ,EAAU,MACvB,KAAK,MAAQ,EAAU,MACvB,KAAK,QAAU,EAAU,QACzB,KAAK,QAAU,EAAU,UAGzB,KAAK,MAAY,EAAK,EACtB,KAAK,MAAY,EAAK,EACtB,KAAK,QAAY,EAAO,EACxB,KAAK,QAAY,EAAO,GAG1B,KAAK,GAAY,EAAY,YAAY,KAAK,EAAI,EAAO,EACzD,KAAK,GAAY,EAAY,YAAY,KAAK,EAAI,EAAO,EACzD,KAAK,SAAY,EAAY,YAAY,OAAO,EAAI,EAAO,EAC3D,KAAK,SAAY,EAAY,YAAY,OAAO,EAAI,EAAO,EAE3D,EAAQ,KAAK,YAAa,GAE1B,KAAK,UAAY,EAAO,UACxB,KAAK,GAAY,EAAY,aAAa,UAC1C,KAAK,SAAY,KAAK,UAAY,KAAK,GAGvC,KAAK,MAAQ,EAAY,aAAa,GAAa,MACnD,KAAK,UAAY,EAAY,aAAa,GAAa,GACvD,KAAK,UAAY,EAAY,aAAa,GAAa,GAEvD,KAAK,MAAS,GAAoB,iBAAV,EAA2B,KAAK,WAAa,KAErE,EAAQ,KAAK,MAAO,sBAGtB,oBACE,GAAM,GAAc,KAAK,WAEzB,IAAI,EAAY,UAAU,MAAQ,KAC3B,KAAK,UAAY,EAAY,UAAU,UAAY,IACxD,MAAO,KAGT,IAAI,GAAQ,IAAM,KAAK,MAAM,EAAY,UAAU,UAAW,EAAY,UAAU,WAAa,KAAK,EAGlG,GAAQ,IACV,GAAS,IAGX,IAAM,GAAO,OAAiB,GAAS,EAAQ,MACzC,EAAO,OAAiB,GAAS,EAAQ,MAEzC,GAAS,IAAS,OAAiB,GAAS,EAAS,KAG3D,QACE,GAAA,EACA,MAJa,GAAU,MAAgB,GAAS,EAAQ,MAKxD,KAAA,EACA,MAAA,EACA,MAAA,EACA,MAAO,EAAY,UAAU,MAC7B,UACE,EAAG,EAAY,UAAU,UACzB,EAAG,EAAY,UAAU,yBAK/B,wCAEA,oCACE,KAAK,4BAA8B,KAAK,oBAAqB,eAG/D,2BACE,KAAK,oBAAqB,OAI9B,GAAQ,GAAG,YAAa,SAAA,GAA0D,GAA9C,GAA8C,EAA9C,OAAQ,EAAsC,EAAtC,YAAa,EAAyB,EAAzB,SAAU,EAAe,EAAf,YAC3D,EAAY,EAAU,EAAS,EAAY,SAE7B,YAAhB,GACF,EAAO,GAAK,EAAO,QAAU,EAAU,QACvC,EAAO,GAAK,EAAO,QAAU,EAAU,UAGvC,EAAO,GAAK,EAAO,MAAQ,EAAU,MACrC,EAAO,GAAK,EAAO,MAAQ,EAAU,SAIzC,EAAc,QAAU,EAExB,EAAO,QAAU,4NC7JjB,GAAM,GAAY,EAAQ,cACpB,EAAY,EAAQ,kBACpB,EAAY,EAAQ,kBACpB,EAAY,EAAQ,kBACpB,EAAY,EAAQ,WACpB,EAAY,EAAQ,eACpB,EAAY,EAAQ,oBACpB,EAAY,EAAQ,mBAAmB,QAMf,EAAQ,oBAHpC,IAAA,eACA,IAAA,aACA,IAAA,cAE4B,EAAQ,kBAA9B,IAAA,YACsB,EAAQ,eAA9B,IAAA,QAAS,IAAA,WACa,EAAQ,mBAA9B,IAAA,UAGR,GAAM,oBAQA,cACJ,QAAA,GAAa,EAAQ,GAAS,EAAA,KAAA,GAC5B,EAAU,MAEV,KAAK,OAAW,EAChB,KAAK,OAAW,GAAI,GACpB,KAAK,SAAW,EAAQ,SAAW,EAAM,SACzC,KAAK,KAAW,EAAU,EAAY,GAAS,KAAK,SAAW,GAC/D,KAAK,KAAW,KAAK,KAAK,SAE1B,EAAQ,KAAK,OACX,OAAA,EACA,QAAA,EACA,aAAc,KACd,IAAK,KAAK,OAGZ,EAAM,YAAa,KAAK,KAAM,KAAK,MAEnC,EAAM,cAAc,KAAK,MAEzB,KAAK,IAAI,sBAGX,qBAAa,EAAQ,GACnB,GAAM,GAAW,KAAO,CAOxB,OALI,GAAG,SAAS,EAAO,WAAmB,KAAK,OAAO,EAAW,SAAmB,EAAO,SACvF,EAAG,SAAS,EAAO,UAAmB,KAAK,OAAO,EAAW,QAAmB,EAAO,QACvF,EAAG,SAAS,EAAO,SAAmB,KAAK,OAAO,EAAW,OAAmB,EAAO,OACvF,EAAG,SAAS,EAAO,kBAAmB,KAAK,OAAO,EAAW,gBAAmB,EAAO,gBAEpF,kBAGT,sBAAc,EAAQ,GAEpB,IAAK,GAAM,KAAU,GAEf,IAAU,GAAS,KAEjB,EAAG,OAAO,EAAQ,KAEpB,KAAK,QAAQ,GAAQ,GAAU,EAAO,KAAK,QAAQ,GAAQ,OAAe,EAAQ,IAE9E,EAAG,OAAO,EAAS,UAAU,KAAY,WAAa,GAAS,UAAU,KAC3E,KAAK,QAAQ,GAAQ,GAAQ,SAAsC,IAA5B,EAAQ,GAAQ,UAGlD,EAAG,KAAK,EAAQ,KAAY,EAAG,OAAO,EAAS,UAAU,IAChE,KAAK,QAAQ,GAAQ,GAAQ,QAAU,EAAQ,OAEpB,KAApB,EAAQ,KAEf,KAAK,QAAQ,GAAQ,GAAU,EAAQ,kBAwB/C,iBAAS,GAOP,MANA,GAAU,GAAW,KAAK,OAEtB,EAAG,OAAO,KAAK,UAAa,EAAG,QAAQ,KACzC,EAAU,KAAK,SAAS,cAAc,KAAK,SAGtC,EAAe,gBAaxB,qBAAa,GACX,MAAI,GAAG,SAAS,IACd,KAAK,QAAU,EAER,MAGO,OAAZ,SACK,MAAK,QAAQ,QAEb,MAGF,KAAK,qBAGd,2BAAmB,EAAY,GAC7B,GAAI,EAAY,IAAa,EAAG,OAAO,GAAW,CAChD,KAAK,QAAQ,GAAc,CAE3B,KAAA,GAAA,GAAqB,EAAQ,MAA7B,EAAA,MAAA,QAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,OAAA,cAAoC,CAAA,GAAA,EAAA,IAAA,EAAA,CAAA,GAAA,GAAA,EAAA,OAAA,KAAA,GAAA,EAAA,SAAA,CAAA,GAAA,EAAA,EAAA,OAAA,EAAA,KAAA,KAAA,GAAA,EAAA,MAAA,GAAzB,GAAyB,CAClC,MAAK,QAAQ,GAAQ,GAAc,EAGrC,MAAO,MAGT,MAAO,MAAK,QAAQ,gBAgBtB,gBAAQ,GACN,MAAO,MAAK,kBAAkB,SAAU,gBAa1C,qBAAa,GACX,MAAiB,SAAb,GAAoC,WAAb,GACzB,KAAK,QAAQ,YAAc,EAEpB,MAGF,KAAK,QAAQ,yBAYtB,mBACE,MAAO,MAAK,sBAGd,mBAAW,GACT,MAAQ,MAAK,WAAa,EAAQ,eACvB,EAAa,KAAK,SAAU,gBAazC,cAAM,GAGJ,MAFA,MAAK,OAAO,KAAK,GAEV,kBAGT,wBAAgB,EAAQ,EAAW,EAAU,GAK3C,GAJI,EAAG,OAAO,KAAyC,IAA3B,EAAU,OAAO,OAC3C,EAAY,EAAU,OAAO,MAAM,OAGjC,EAAG,MAAM,GAAY,CACvB,IAAK,GAAI,GAAI,EAAG,EAAI,EAAU,OAAQ,IACpC,KAAK,GAAQ,EAAU,GAAI,EAAU,EAGvC,QAAO,EAGT,GAAI,EAAG,OAAO,GAAY,CACxB,IAAK,GAAM,KAAQ,GACjB,KAAK,GAAQ,EAAM,EAAU,GAAO,EAGtC,QAAO,gBAeX,YAAI,EAAW,EAAU,GACvB,MAAI,MAAK,eAAe,KAAM,EAAW,EAAU,GAC1C,MAGS,UAAd,IAAyB,EAAY,GAErC,EAAS,EAAa,WAAY,GACpC,KAAK,OAAO,GAAG,EAAW,GAGnB,EAAG,OAAO,KAAK,QACtB,EAAO,YAAY,KAAK,OAAQ,KAAK,SAAU,EAAW,EAAU,GAGpE,EAAO,IAAI,KAAK,OAAQ,EAAW,EAAU,GAGxC,mBAcT,aAAK,EAAW,EAAU,GACxB,MAAI,MAAK,eAAe,MAAO,EAAW,EAAU,GAC3C,MAGS,UAAd,IAAyB,EAAY,GAGrC,EAAS,EAAa,WAAY,GACpC,KAAK,OAAO,IAAI,EAAW,GAGpB,EAAG,OAAO,KAAK,QACtB,EAAO,eAAe,KAAK,OAAQ,KAAK,SAAU,EAAW,EAAU,GAIvE,EAAO,OAAO,KAAK,OAAQ,EAAW,EAAU,GAG3C,mBAWT,aAAK,GACE,EAAG,OAAO,KACb,MAGF,KAAK,QAAU,KAAW,EAAS,KAEnC,IAAM,GAAa,KAAW,EAAS,UAEvC,KAAK,GAAM,KAAc,GAAQ,WAAY,CAC3C,GAAM,GAAa,EAAQ,WAAW,EAEtC,MAAK,QAAQ,GAAc,KAAW,EAAS,IAE/C,KAAK,aAAa,EAAY,GAE9B,KAAK,GAAY,EAAQ,IAG3B,IAAA,GAAA,GAAsB,EAAa,gBAAnC,EAAA,MAAA,QAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,OAAA,cAAoD,CAAA,GAAA,EAAA,IAAA,EAAA,CAAA,GAAA,GAAA,EAAA,OAAA,KAAA,GAAA,EAAA,SAAA,CAAA,GAAA,EAAA,EAAA,OAAA,EAAA,KAAA,KAAA,GAAA,EAAA,MAAA,GAAzC,GAAyC,CAClD,MAAK,QAAQ,GAAW,EAAS,KAAK,GAElC,IAAW,IACb,KAAK,GAAS,EAAQ,IAS1B,MALA,GAAQ,KAAK,OACX,QAAA,EACA,aAAc,OAGT,kBAYT,iBAGE,GAFA,EAAO,OAAO,KAAK,OAAQ,OAEvB,EAAG,OAAO,KAAK,QAEjB,IAAK,GAAM,KAAQ,GAAO,gBAAiB,CACzC,GAAM,GAAY,EAAO,gBAAgB,EAErC,GAAU,UAAU,KAAO,KAAK,QAC7B,EAAU,SAAS,KAAO,KAAK,WAEpC,EAAU,UAAU,OAAO,EAAG,GAC9B,EAAU,SAAU,OAAO,EAAG,GAC9B,EAAU,UAAU,OAAO,EAAG,GAGzB,EAAU,UAAU,SACvB,EAAU,GAAQ,OAItB,EAAO,OAAO,KAAK,SAAU,EAAM,EAAO,kBAC1C,EAAO,OAAO,KAAK,SAAU,EAAM,EAAO,oBAAoB,OAIhE,GAAO,OAAO,KAAM,MAGtB,GAAQ,KAAK,SAAW,aAAc,OAEtC,EAAM,cAAc,OAAO,EAAQ,EAAM,cAAe,MAAO,EAG/D,KAAA,GAAA,GAA0B,EAAM,iBAAhC,EAAA,MAAA,QAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,OAAA,cAAoD,CAAA,GAAA,EAAA,IAAA,EAAA,CAAA,GAAA,GAAA,EAAA,OAAA,KAAA,GAAA,EAAA,SAAA,CAAA,GAAA,EAAA,EAAA,OAAA,EAAA,KAAA,KAAA,GAAA,EAAA,MAAA,GAAzC,GAAyC,CAC9C,GAAY,SAAW,MAAQ,EAAY,eAC7C,EAAY,OAIhB,MAAO,GAAM,cAIjB,GAAM,cAAc,eAAiB,SAAyB,EAAQ,GACpE,EAAU,GAAW,EAAM,QAE3B,KAAK,GAAI,GAAI,EAAG,EAAI,KAAK,OAAQ,IAAK,CACpC,GAAM,GAAe,KAAK,EAE1B,IAAI,EAAa,SAAW,GAAU,EAAa,WAAa,EAC9D,MAAO,GAGX,OAAQ,GAGV,EAAM,cAAc,IAAM,SAA0B,EAAS,EAAS,GACpE,GAAM,GAAM,KAAK,KAAK,eAAe,EAAS,GAAW,EAAQ,SAEjE,OAAO,KAAQ,EAAG,OAAO,IAAY,GAAsB,EAAI,UAAU,IAAW,EAAM,MAG5F,EAAM,cAAc,gBAAkB,SAAU,EAAU,GACxD,IAAK,GAAI,GAAI,EAAG,EAAI,KAAK,OAAQ,IAAK,CACpC,GAAM,GAAe,KAAK,EAG1B,IAAK,EAAG,OAAO,EAAa,WACpB,GAAY,EAAa,UAAU,IAD3C,CAKA,GAAM,GAAM,EAAS,EAAc,EAAa,OAAQ,EAAa,SAAU,EAAG,KAElF,QAAY,KAAR,EACF,MAAO,MAMb,EAAa,WAAa,EAAM,cAEhC,EAAa,QAAU,EAEvB,EAAa,iBAAoB,cAAe,SAAU,iBAAkB,eAE5E,EAAO,QAAU,uWC1EjB,QAAS,GAAkB,GACzB,MAAQ,UAAU,GAChB,GAAM,GAAc,EAAM,eAAe,GADlB,EAEe,EAAM,gBAAgB,GAArD,EAFgB,EAAA,GAEH,EAFG,EAAA,GAGjB,IAEN,IAAI,EAAQ,eAAiB,QAAQ,KAAK,EAAM,MAAO,CACrD,GAAgB,GAAI,OAAO,SAE3B,KAAK,GAAI,GAAI,EAAG,EAAI,EAAM,eAAe,OAAQ,IAAK,CACpD,GAAM,GAAU,EAAM,eAAe,GAC/B,EAAc,EAAO,OAAO,EAAS,EAAM,KAAM,EAEvD,GAAQ,MAAM,EAAS,GAAe,GAAI,IAAc,YAAA,WAGvD,CACH,GAAI,IAAiB,CAErB,KAAK,EAAQ,sBAAwB,QAAQ,KAAK,EAAM,MAAO,CAE7D,IAAK,GAAI,GAAI,EAAG,EAAI,EAAM,aAAa,SAAW,EAAgB,IAChE,EAAuD,UAAtC,EAAM,aAAa,GAAG,aAA2B,EAAM,aAAa,GAAG,aAK1F,GAAiB,IACX,GAAI,OAAO,UAAY,EAAgB,KAEpB,IAApB,EAAM,UAGb,IAAK,EAAgB,CACnB,GAAI,GAAc,EAAO,OAAO,EAAO,EAAM,KAAM,EAE9C,KACH,EAAc,GAAI,IAAc,YAAA,KAGlC,EAAQ,MAAM,EAAO,KAIzB,IAAA,GAAA,GAAqC,EAArC,EAAA,MAAA,QAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,OAAA,cAA8C,CAAA,GAAA,EAAA,IAAA,EAAA,CAAA,GAAA,GAAA,EAAA,OAAA,KAAA,GAAA,EAAA,SAAA,CAAA,GAAA,EAAA,EAAA,OAAA,EAAA,KAAA,KAAA,GAAA,EAAA,MAAA,GAAA,GAAA,EAAlC,EAAkC,EAAA,GAAzB,EAAyB,EAAA,EAC5C,GAAY,oBAAoB,EAAa,GAC7C,EAAY,GAAQ,EAAS,EAAO,EAAa,KAKvD,QAAS,GAAQ,GACf,IAAK,GAAI,GAAI,EAAG,EAAI,EAAM,aAAa,OAAQ,IAAK,CAClD,GAAM,GAAc,EAAM,aAAa,EAEvC,GAAY,IAAI,GAChB,EAAQ,KAAK,UAAY,MAAA,EAAO,YAAA,KA0BpC,QAAS,GAAT,EAA+B,GAAY,GAAnB,GAAmB,EAAnB,IAChB,EAA4C,IAA9B,EAAW,QAAQ,OACnC,EAAO,IAAM,EAAO,MAGxB,KAAK,GAAM,KAAa,GAAM,gBAC5B,EAAY,EAAK,EAAW,EAAO,kBACnC,EAAY,EAAK,EAAW,EAAO,oBAAoB,EAGzD,KAAK,GAAM,KAAa,GACtB,EAAY,EAAK,EAAW,EAAU,IAzd1C,GAAM,GAAa,EAAQ,WACrB,EAAa,EAAQ,WACrB,EAAa,EAAQ,kBACrB,EAAa,EAAQ,mBACrB,EAAa,EAAQ,sBACrB,EAAa,EAAQ,6BACrB,EAAa,EAAQ,mBAAmB,MAExC,KACA,GACJ,cAAe,cAAe,YAC9B,gBAAiB,iBAIf,EAAgB,CAGpB,GAAM,eAoWN,KAAK,GAlWC,cACJ,QAAA,GAAA,GAA8B,GAAf,GAAe,EAAf,WAAe,GAAA,KAAA,GAC5B,KAAK,OAAgB,KACrB,KAAK,QAAgB,KAErB,KAAK,UACH,KAAO,KACP,KAAO,KACP,MAAO,MAIT,KAAK,YACL,KAAK,cACL,KAAK,eACL,KAAK,aAGL,KAAK,YACH,MAAa,EAAG,EAAG,EAAG,GACtB,QAAa,EAAG,EAAG,EAAG,GACtB,UAAW,GAGb,KAAK,WACH,MAAa,EAAG,EAAG,EAAG,GACtB,QAAa,EAAG,EAAG,EAAG,GACtB,UAAW,GAIb,KAAK,aACH,MAAa,EAAG,EAAG,EAAG,GACtB,QAAa,EAAG,EAAG,EAAG,GACtB,UAAW,GAIb,KAAK,cACH,MAAa,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,GAAI,EAAG,MAAO,GAC9C,QAAa,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,GAAI,EAAG,MAAO,GAC9C,UAAW,GAGb,KAAK,UAAc,KACnB,KAAK,eAEL,KAAK,aAAkB,KACvB,KAAK,gBAAkB,KAEvB,KAAK,UAAY,KAEjB,KAAK,eAAkB,EACvB,KAAK,iBAAkB,EACvB,KAAK,cAAkB,EAEvB,KAAK,YAAc,EAEnB,EAAQ,KAAK,MAAO,MAEpB,EAAM,aAAa,KAAK,yBAG1B,qBAAa,EAAS,EAAO,GAC3B,GAAM,GAAe,KAAK,cAAc,EAAS,GAAO,EAExD,GAAQ,KAAK,QACX,QAAA,EACA,MAAA,EACA,YAAA,EACA,aAAA,EACA,YAAa,oBAoCjB,eAAO,EAAQ,EAAQ,GACjB,KAAK,gBACD,KAAK,eACN,KAAK,WAAW,QAA0B,YAAhB,EAAO,KAAoB,EAAI,MAMf,IAA7C,EAAM,QAAQ,EAAM,aAAc,OACpC,EAAM,aAAa,KAAK,MAG1B,EAAM,WAAW,KAAK,SAAU,GAChC,KAAK,OAAiB,EACtB,KAAK,QAAiB,EAEtB,EAAQ,KAAK,gBACX,YAAa,KACb,MAAO,KAAK,0BAIhB,qBAAa,EAAS,EAAO,GACtB,KAAK,aACR,KAAK,cAAc,GACnB,EAAM,UAAU,KAAK,UAAW,KAAK,UAGvC,IAAM,GAAiB,KAAK,UAAU,KAAK,IAAM,KAAK,WAAW,KAAK,GAC5C,KAAK,UAAU,KAAK,IAAM,KAAK,WAAW,KAAK,GAC/C,KAAK,UAAU,OAAO,IAAM,KAAK,WAAW,OAAO,GACnD,KAAK,UAAU,OAAO,IAAM,KAAK,WAAW,OAAO,EAEzE,MAAA,GACA,MAAA,EAGA,MAAK,gBAAkB,KAAK,kBAC9B,EAAK,KAAK,UAAU,OAAO,EAAI,KAAK,YAAY,OAAO,EACvD,EAAK,KAAK,UAAU,OAAO,EAAI,KAAK,YAAY,OAAO,EAEvD,KAAK,gBAAkB,EAAM,MAAM,EAAI,GAAM,EAAY,qBAG3D,IAAM,IACJ,QAAA,EACA,aAAc,KAAK,gBAAgB,GACnC,MAAA,EACA,YAAA,EACA,GAAA,EACA,GAAA,EACA,UAAW,EACX,YAAa,KACb,sBAAuB,KAAK,cAGzB,IAEH,EAAM,eAAe,KAAK,aAAc,KAAK,WAAY,KAAK,WAGhE,EAAQ,KAAK,OAAQ,GAEhB,IAEC,KAAK,eACP,KAAK,OAAO,GAGV,KAAK,iBACP,EAAM,WAAW,KAAK,WAAY,KAAK,yBAyB7C,gBAAQ,GACN,EAAY,EAAM,QAChB,QAAS,KAAK,SAAS,GACvB,MAAO,KAAK,UACZ,YAAa,KAAK,aAClB,YAAa,MACZ,OAEH,EAAQ,KAAK,qBAAsB,GAE9B,KAAK,eACR,EAAQ,KAAK,cAAe,GAG9B,KAAK,eAAgB,eAIvB,mBAAW,EAAS,EAAO,EAAa,GACtC,GAAM,GAAe,KAAK,gBAAgB,EAE1C,GAAQ,KAAK,WAAW,KAAK,EAAM,MAAO,SAAW,MACnD,QAAA,EACA,aAAA,EACA,MAAA,EACA,YAAA,EACA,eAAA,EACA,YAAa,OAGV,KAAK,YACR,KAAK,IAAI,GAGX,KAAK,eAAgB,EACrB,KAAK,cAAc,EAAS,gBAuB9B,aAAK,GACH,EAAQ,GAAS,KAAK,UAElB,KAAK,eACP,EAAQ,KAAK,cACX,MAAA,EACA,YAAa,OAIjB,KAAK,oBAGP,yBACE,MAAO,MAAK,aAAc,KAAK,SAAS,KAAM,kBAGhD,uBACE,MAAO,MAAK,0BAGd,gBACE,EAAQ,KAAK,QAAU,YAAa,OAEhC,KAAK,eACP,EAAQ,KAAK,eAAiB,YAAa,OAC3C,EAAQ,KAAK,QAAU,KAAK,SAAS,MAAQ,YAAa,QAG5D,KAAK,OAAS,KAAK,QAAU,KAE7B,KAAK,cAAe,EACpB,KAAK,SAAS,KAAO,KAAK,UAAY,kBAGxC,yBAAiB,GAEf,MAAyB,UAArB,KAAK,aAAgD,QAArB,KAAK,YAChC,EAGF,EAAM,QAAQ,KAAK,WAAY,EAAM,aAAa,iBAG3D,uBAAe,EAAS,GAA0D,GAAnD,GAAmD,UAAA,OAAA,OAAA,KAAA,UAAA,GAAA,UAAA,GAA5C,GAAS,iBAAiB,KAAK,EAAM,MACnE,EAAK,EAAM,aAAa,GAC1B,EAAQ,KAAK,gBAAgB,EAoBjC,QAlBe,IAAX,IACF,EAAQ,KAAK,WAAW,OACxB,KAAK,WAAW,GAAS,GAGvB,GACF,EAAQ,KAAK,uBACX,QAAA,EACA,MAAA,EACA,KAAA,EACA,UAAW,EACX,aAAc,EACd,YAAa,OAIjB,KAAK,SAAS,GAAS,EAEhB,eAGT,uBAAe,EAAS,GACtB,GAAM,GAAQ,KAAK,gBAAgB,IAEpB,IAAX,IAEJ,EAAQ,KAAK,kBACX,QAAA,EACA,MAAA,EACA,aAAc,EACd,YAAa,OAGf,KAAK,SAAY,OAAO,EAAO,GAC/B,KAAK,WAAY,OAAO,EAAO,GAC/B,KAAK,YAAY,OAAO,EAAO,GAC/B,KAAK,UAAY,OAAO,EAAO,iBAGjC,6BAAqB,EAAQ,GAC3B,KAAK,aAAkB,EACvB,KAAK,gBAAkB,QAIlB,EAAI,EAAG,EAAM,EAAY,OAAQ,EAAI,EAAK,IAAK,CACtD,GAAM,GAAS,EAAY,EAE3B,GAAU,GAAU,EAAiB,GA+DvC,GAAM,MACA,EAAc,EAAQ,WAExB,GAAW,cACb,EAAU,EAAY,MAAU,EAAU,YAC1C,EAAU,EAAY,MAAU,EAAU,YAC1C,EAAU,EAAY,IAAU,EAAU,UAC1C,EAAU,EAAY,QAAU,EAAU,YAG1C,EAAU,UAAc,EAAU,YAClC,EAAU,UAAc,EAAU,YAClC,EAAU,QAAc,EAAU,UAElC,EAAU,WAAc,EAAU,YAClC,EAAU,UAAc,EAAU,YAClC,EAAU,SAAc,EAAU,UAClC,EAAU,YAAc,EAAU,WAGpC,EAAU,KAAO,EAiBjB,EAAQ,GAAG,sBAAuB,SAAA,GAAiF,GAA9E,GAA8E,EAA9E,YAAa,EAAiE,EAAjE,QAAS,EAAwD,EAAxD,UAAW,EAA6C,EAA7C,aAAc,EAA+B,EAA/B,MAAO,EAAwB,EAAxB,YAAa,EAAW,EAAX,IACtG,GAAY,WAAW,GAAgB,EACvC,EAAY,SAAS,GAAgB,EAEjC,IACF,EAAY,eAAgB,GAGzB,EAAY,gBACf,EAAM,UAAU,EAAY,YAAa,EAAY,UAErD,EAAM,WAAW,EAAY,UAAY,EAAY,aACrD,EAAM,WAAW,EAAY,WAAY,EAAY,aAErD,EAAY,UAA4B,EACxC,EAAY,UAAU,GAAkB,EAAY,UAAU,UAC9D,EAAY,YAAY,GAAgB,GAAe,GAAS,EAAM,gBAAgB,GAAO,GAC7F,EAAY,iBAA4B,EAExC,EAAM,cAAc,EAAY,YAAa,MAIjD,EAAM,QAAQ,GAAG,eAAmB,GACpC,EAAM,QAAQ,GAAG,kBAAmB,GAEpC,EAAY,qBAAuB,EACnC,EAAY,iBAAmB,EAC/B,EAAY,OAAS,EACrB,EAAY,QAAU,EACtB,EAAY,UAAY,EAExB,EAAM,mBAAqB,EAE3B,EAAO,QAAU,oLCtejB,SAAS,GAAc,EAAa,EAAO,EAAO,GAChD,GAAM,GAAa,EAAY,SAAS,KAElC,EAAW,GAAI,GAAc,EAAa,EAAO,EAAY,EAAO,EAAY,QAAS,KAAM,EAErG,GAAY,OAAO,KAAK,GACxB,EAAY,UAAY,EA/B1B,GAAM,GAAgB,EAAQ,kBACxB,EAAgB,EAAQ,oBAExB,GACJ,aAAA,EACA,SACA,cAGF,GAAY,QAAQ,GAAG,eAAgB,SAAA,GAAkC,GAAtB,GAAsB,EAAtB,YAAa,EAAS,EAAT,KAC9D,GAAY,cAAe,EAC3B,EAAa,EAAa,EAAO,WAGnC,EAAY,QAAQ,GAAG,cAAe,SAAA,GAA0C,GAA9B,GAA8B,EAA9B,WAIhD,IAHA,EAAa,EADiE,EAAjB,MAC5B,OAD6C,EAAV,SAI/D,EAAY,cAAiB,OAAO,IAG3C,EAAY,QAAQ,GAAG,aAAc,SAAA,GACnC,EADqE,EAAtB,YAAsB,EAAT,MAC3B,SAYnC,EAAO,QAAU,6EClCjB,IAAM,GAAiB,EAAQ,UACzB,EAAiB,EAAQ,YACzB,EAAiB,EAAQ,oBACzB,EAAiB,EAAQ,mBACzB,EAAiB,EAAQ,kBACzB,EAAiB,EAAQ,qBAEzB,GACJ,UACE,SAAc,EACd,aAAc,KAEd,OAAY,KACZ,KAAY,KACZ,SAAY,KACZ,QAAY,KACZ,WAAY,KAEZ,UAAY,KACZ,SAAY,MAGd,QAAS,SAAU,EAAS,EAAO,GACjC,GAAM,GAAc,EAAa,QAAQ,IAEzC,OAAO,GAAY,SACb,KAAM,OAAQ,KAAgC,UAAzB,EAAY,SACV,EAAY,UACZ,EAAY,UACrC,MAGN,UAAW,WACT,MAAO,QAIX,GAAY,QAAQ,GAAG,qBAAsB,SAAA,GAA2B,GAAf,GAAe,EAAf,WACvD,IAAkC,SAA9B,EAAY,SAAS,KAAzB,CAEA,GAAM,GAAO,EAAY,SAAS,IAErB,OAAT,GACF,EAAY,UAAU,KAAK,EAAM,EAAY,YAAY,KAAK,EAC9D,EAAY,UAAU,OAAO,EAAI,EAAY,YAAY,OAAO,EAEhE,EAAY,aAAa,KAAK,MAAU,KAAK,IAAI,EAAY,aAAa,KAAK,IAC/E,EAAY,aAAa,OAAO,MAAQ,KAAK,IAAI,EAAY,aAAa,OAAO,IACjF,EAAY,aAAa,OAAO,GAAK,EACrC,EAAY,aAAa,KAAK,GAAO,GAErB,MAAT,IACP,EAAY,UAAU,KAAK,EAAM,EAAY,YAAY,KAAK,EAC9D,EAAY,UAAU,OAAO,EAAI,EAAY,YAAY,OAAO,EAEhE,EAAY,aAAa,KAAK,MAAU,KAAK,IAAI,EAAY,aAAa,KAAK,IAC/E,EAAY,aAAa,OAAO,MAAQ,KAAK,IAAI,EAAY,aAAa,OAAO,IACjF,EAAY,aAAa,OAAO,GAAK,EACrC,EAAY,aAAa,KAAK,GAAO,MAKzC,EAAc,QAAQ,GAAG,MAAO,SAAA,GAAmC,GAAvB,GAAuB,EAAvB,OAAQ,EAAe,EAAf,WAClD,IAAoB,aAAhB,EAAO,KAAX,CAEA,GAAM,GAAO,EAAY,SAAS,IAErB,OAAT,GACF,EAAO,MAAU,EAAY,YAAY,KAAK,EAC9C,EAAO,QAAU,EAAY,YAAY,OAAO,EAChD,EAAO,GAAK,GAEI,MAAT,IACP,EAAO,MAAU,EAAY,YAAY,KAAK,EAC9C,EAAO,QAAU,EAAY,YAAY,OAAO,EAChD,EAAO,GAAK,MAwChB,EAAa,UAAU,UAAY,SAAU,GAC3C,MAAI,GAAM,GAAG,OAAO,IAClB,KAAK,QAAQ,KAAK,SAA8B,IAApB,EAAQ,QACpC,KAAK,aAAa,OAAQ,GAC1B,KAAK,YAAY,OAAQ,GAErB,mBAAmB,KAAK,EAAQ,YAClC,KAAK,QAAQ,KAAK,SAAW,EAAQ,UAEnC,aAAa,KAAK,EAAQ,aAC5B,KAAK,QAAQ,KAAK,UAAY,EAAQ,WAGjC,MAGL,EAAM,GAAG,KAAK,IAChB,KAAK,QAAQ,KAAK,QAAU,EAEvB,IACH,KAAK,YAAc,KAAK,YAAc,KAAK,UAAY,MAGlD,MAGF,KAAK,QAAQ,MAGtB,EAAQ,KAAO,EACf,EAAQ,MAAM,KAAK,QACnB,EAAM,MAAM,EAAa,YACvB,YACA,WACA,mBACA,oBACA,YAEF,EAAQ,WAAW,KAAO,YAE1B,EAAe,KAAO,EAAK,SAE3B,EAAO,QAAU,iJCrFjB,SAAS,GAAc,EAAa,GAClC,GAAM,MACA,IAEN,GAAU,GAAW,EAAY,OAGjC,KAAA,GAAA,GAAsB,EAAM,cAA5B,EAAA,MAAA,QAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,OAAA,cAA2C,CAAA,GAAA,EAAA,IAAA,EAAA,CAAA,GAAA,GAAA,EAAA,OAAA,KAAA,GAAA,EAAA,SAAA,CAAA,GAAA,EAAA,EAAA,OAAA,EAAA,KAAA,KAAA,GAAA,EAAA,MAAA,GAAhC,GAAgC,CACzC,IAAK,EAAQ,QAAQ,KAAK,QAA1B,CAEA,GAAM,GAAS,EAAQ,QAAQ,KAAK,MAGpC,MAAK,EAAM,GAAG,QAAQ,IAAW,IAAW,GACpC,EAAM,GAAG,OAAO,KAChB,EAAM,gBAAgB,EAAS,IAUvC,IAAK,GAJC,GAAe,EAAM,GAAG,OAAO,EAAQ,QACzC,EAAQ,SAAS,iBAAiB,EAAQ,SACzC,EAAQ,QAEJ,EAAI,EAAG,EAAI,EAAa,OAAQ,IAAK,CAC5C,GAAM,GAAiB,EAAa,EAEhC,KAAmB,IACrB,EAAM,KAAK,GACX,EAAS,KAAK,MAKpB,OACE,SAAA,EACA,UAAW,GAIf,QAAS,GAAiB,EAAa,GAIrC,IAAK,GAHD,OAAA,GAGK,EAAI,EAAG,EAAI,EAAY,YAAY,UAAU,OAAQ,IAAK,CACjE,GAAM,GAAU,EAAY,YAAY,UAAU,GAC5C,EAAiB,EAAY,YAAY,SAAU,EAGrD,KAAmB,IAErB,EAAM,OAAS,EACf,EAAQ,KAAK,IAEf,EAAc,GAOlB,QAAS,GAAgB,EAAa,GAEpC,GAAM,GAAgB,EAAa,EAAa,GAAa,EAE7D,GAAY,YAAY,UAAY,EAAc,UAClD,EAAY,YAAY,SAAY,EAAc,SAClD,EAAY,YAAY,QAExB,KAAK,GAAI,GAAI,EAAG,EAAI,EAAY,YAAY,UAAU,OAAQ,IAC5D,EAAY,YAAY,MAAM,GAC5B,EAAY,YAAY,UAAU,GAAG,QAAQ,EAAY,YAAY,SAAS,IAIpF,QAAS,GAAS,EAAW,EAAO,GAClC,GAAM,GAAc,EAAU,YACxB,IAEF,IACF,EAAe,EAAa,EAI9B,KAAK,GAAI,GAAI,EAAG,EAAI,EAAY,YAAY,UAAU,OAAQ,IAAK,CACjE,GAAM,GAAiB,EAAY,YAAY,UAAU,GACnD,EAAiB,EAAY,YAAY,SAAU,GACnD,EAAiB,EAAY,YAAY,MAAU,EAEzD,GAAW,KAAK,EAAQ,UAAU,EAAW,EAAO,EAAY,OAAQ,EAAa,EAAgB,GACjG,EACA,MAIN,GAAM,GAAY,EAAM,sBAAsB,EAE9C,QACE,SAAU,EAAY,YAAY,UAAU,IAAc,KAC1D,QAAU,EAAY,YAAY,SAAU,IAAc,MAI9D,QAAS,GAAe,EAAa,EAAc,GACjD,GAAM,IACJ,MAAY,KACZ,MAAY,KACZ,SAAY,KACZ,WAAY,KACZ,KAAY,KACZ,KAAY,MAGR,GACJ,UAAA,EACA,YAAA,EACA,OAAe,EAAY,YAC3B,SAAe,EAAY,WAC3B,cAAe,EAAU,OACzB,UAAe,EAAU,aACzB,UAAe,EAAU,UAwD3B,OArDI,GAAY,cAAgB,EAAY,kBAEtC,EAAY,iBACd,EAAW,MAAQ,EAAM,QAAS,KAAM,aAAe,GAEvD,EAAU,UAAe,EAAW,MAAM,OAAW,EAAY,gBACjE,EAAU,aAAe,EAAW,MAAM,SAAW,EAAY,gBAG/D,EAAY,aACd,EAAW,OACT,UAAA,EACA,YAAA,EACA,OAAe,EAAY,YAC3B,SAAe,EAAY,WAC3B,cAAe,EAAU,OACzB,UAAe,EAAU,aACzB,UAAe,EAAU,UACzB,KAAe,aAGjB,EAAU,UAAY,EAAY,YAClC,EAAU,SAAW,EAAY,aAId,YAAnB,EAAU,MAAsB,EAAY,aAC9C,EAAW,KAAO,EAAM,QAAS,KAAM,QAAU,GAEjD,EAAU,SAAW,EAAY,WACjC,EAAU,cAAgB,EAAY,aAEjB,cAAnB,EAAU,OACZ,EAAW,SAAW,EAAM,QAAS,KAAM,gBAAkB,GAE7D,EAAW,SAAS,OAAW,KAC/B,EAAW,SAAS,SAAW,MAEV,YAAnB,EAAU,OACZ,EAAW,WAAa,EAAM,QAAS,KAAM,kBAAoB,GAEjE,EAAW,WAAW,OAAW,KACjC,EAAW,WAAW,SAAW,MAEZ,aAAnB,EAAU,MAAuB,EAAY,aAC/C,EAAW,KAAO,EAAM,QACtB,SAAe,EACf,KAAe,YACd,GAEH,EAAU,SAAW,EAAY,YAG5B,EAGT,QAAS,GAAgB,EAAa,GAChC,EAAW,OAAS,EAAY,eAAe,KAAK,EAAW,OAC/D,EAAW,MAAa,EAAY,WAAW,KAAK,EAAW,MAC/D,EAAW,OAAa,EAAY,WAAW,KAAK,EAAW,OAC/D,EAAW,MAAa,EAAY,WAAW,KAAK,EAAW,MAC/D,EAAW,YACb,EAAgB,EAAa,EAAW,YAG1C,EAAY,eAAkB,EAAY,WAC1C,EAAY,gBAAkB,EAAY,YAvQ5C,GAAM,GAAiB,EAAQ,UACzB,EAAiB,EAAQ,YACzB,EAAiB,EAAQ,YACzB,EAAiB,EAAQ,eACzB,EAAiB,EAAQ,oBACzB,EAAiB,EAAQ,mBACzB,EAAiB,EAAQ,kBACzB,EAAiB,EAAQ,qBAEzB,GACJ,UACE,SAAS,EACT,OAAS,KACT,QAAS,YAIT,GAAc,CAElB,GAAY,QAAQ,GAAG,eAAgB,SAAA,GAAkC,GAAtB,GAAsB,EAAtB,YAAa,EAAS,EAAT,KAC9D,IAAkC,SAA9B,EAAY,SAAS,KAAzB,CAGA,EAAY,YAAY,aACxB,EAAY,YAAY,YACxB,EAAY,YAAY,SAExB,EAAY,WAAa,KAEpB,EAAY,aACf,EAAe,EAAa,EAAY,QAG1C,IAAM,GAAY,EAAY,UACxB,EAAa,EAAc,EAAa,EAAO,EAEjD,GAAW,UACb,EAAgB,EAAa,EAAW,aAI5C,EAAc,QAAQ,GAAG,MAAO,SAAA,GAA0C,GAA9B,GAA8B,EAA9B,YAAa,EAAiB,EAAjB,OAAQ,EAAS,EAAT,KAC/D,IAAoB,aAAhB,EAAO,MAAuC,YAAhB,EAAO,KAAzC,CAEA,GAAM,GAAmB,EAAY,QAC/B,EAAY,EACZ,EAAa,EAAQ,EAAW,EAAO,EAE7C,GAAY,WAAc,EAAW,SACrC,EAAY,YAAc,EAAW,QAErC,EAAY,WAAa,EAAc,EAAa,EAAO,MAG7D,EAAY,QAAQ,GAAG,cAAe,SAAA,GAA2B,GAAf,GAAe,EAAf,WACd,UAA9B,EAAY,SAAS,MAEzB,EAAe,EAAa,EAAY,cAG1C,EAAY,QAAQ,GAAG,aAAc,SAAA,GAA2B,GAAf,GAAe,EAAf,WACb,UAA9B,EAAY,SAAS,MACvB,EAAe,EAAa,EAAY,cAI5C,EAAY,QAAQ,GAAG,YAAa,SAAA,GAA2B,GAAf,GAAe,EAAf,WAC9C,GAAY,YAAY,UACtB,EAAY,YAAY,SACxB,EAAY,YAAY,MACxB,EAAY,WAAa,OAwP7B,EAAa,UAAU,SAAW,SAAU,GAC1C,MAAI,GAAM,GAAG,OAAO,IAClB,KAAK,QAAQ,KAAK,SAA8B,IAApB,EAAQ,QAEhC,EAAM,GAAG,SAAS,EAAQ,UAAqB,KAAK,OAAO,OAAmB,EAAQ,QACtF,EAAM,GAAG,SAAS,EAAQ,kBAAqB,KAAK,OAAO,eAAmB,EAAQ,gBACtF,EAAM,GAAG,SAAS,EAAQ,oBAAqB,KAAK,OAAO,iBAAmB,EAAQ,kBACtF,EAAM,GAAG,SAAS,EAAQ,eAAqB,KAAK,OAAO,YAAmB,EAAQ,aACtF,EAAM,GAAG,SAAS,EAAQ,eAAqB,KAAK,OAAO,YAAmB,EAAQ,aACtF,EAAM,GAAG,SAAS,EAAQ,cAAqB,KAAK,OAAO,WAAmB,EAAQ,YAEtF,qBAAqB,KAAK,EAAQ,SACpC,KAAK,QAAQ,KAAK,QAAU,EAAQ,QAE7B,EAAM,GAAG,OAAO,EAAQ,WAC/B,KAAK,QAAQ,KAAK,QAAU,KAAK,IAAI,KAAK,IAAI,EAAG,EAAQ,SAAU,IAEjE,UAAY,KACd,KAAK,QAAQ,KAAK,OAAS,EAAQ,QAEjC,WAAa,KACf,KAAK,QAAQ,KAAK,QAAU,EAAQ,SAI/B,MAGL,EAAM,GAAG,KAAK,IAChB,KAAK,QAAQ,KAAK,QAAU,EAEvB,IACH,KAAK,YAAc,KAAK,YAAc,KAAK,OACvC,KAAK,eAAiB,KAAK,iBAAmB,MAG7C,MAGF,KAAK,QAAQ,MAGtB,EAAa,UAAU,UAAY,SAAU,EAAW,EAAO,EAAW,EAAkB,EAAa,GACvG,GAAI,IAAU,CAId,MAAM,EAAO,GAAQ,KAAK,QAAQ,IAChC,QAAQ,KAAK,QAAQ,KAAK,SACtB,KAAK,QAAQ,KAAK,QAAQ,EAAW,EAAO,EAAS,KAAM,EAAa,EAAW,EAIzF,IAAM,GAAc,KAAK,QAAQ,KAAK,OAEtC,IAAoB,YAAhB,EAA2B,CAC7B,GAAM,GAAS,EAAM,YAAY,EAAW,EAAkB,QACxD,EAAO,EAAM,UAAU,EAE7B,GAAK,GAAK,EAAO,EACjB,EAAK,GAAK,EAAO,CAEjB,IAAM,GAAc,EAAK,EAAI,EAAK,MAAU,EAAK,EAAI,EAAK,MACpD,EAAc,EAAK,EAAI,EAAK,KAAU,EAAK,EAAI,EAAK,MAE1D,GAAU,GAAc,EAG1B,GAAM,GAAW,EAAU,QAAQ,EAEnC,IAAI,GAA4B,WAAhB,EAA0B,CACxC,GAAM,GAAK,EAAS,KAAO,EAAS,MAAS,EACvC,EAAK,EAAS,IAAO,EAAS,OAAS,CAE7C,GAAU,GAAM,EAAK,MAAQ,GAAM,EAAK,OAAS,GAAM,EAAK,KAAO,GAAM,EAAK,OAGhF,GAAI,GAAY,EAAM,GAAG,OAAO,GAAc,CAM5C,EALsB,KAAK,IAAI,EAAG,KAAK,IAAI,EAAK,MAAQ,EAAS,OAAU,KAAK,IAAI,EAAK,KAAM,EAAS,OAChF,KAAK,IAAI,EAAG,KAAK,IAAI,EAAK,OAAQ,EAAS,QAAU,KAAK,IAAI,EAAK,IAAM,EAAS,OAEtE,EAAS,MAAQ,EAAS,SAEpC,EAO5B,MAJI,MAAK,QAAQ,KAAK,UACpB,EAAU,KAAK,QAAQ,KAAK,QAAQ,EAAW,EAAO,EAAS,KAAM,EAAa,EAAW,IAGxF,GAGT,EAAa,QAAQ,GAAG,QAAS,SAAA,GAA4B,EAAhB,aAC9B,UAAS,KAGxB,EAAa,gBAAgB,KAAK,eAElC,EAAY,QAAQ,GAAG,MAAO,SAAU,GACtC,EAAY,WAAkB,KAC9B,EAAY,YAAkB,KAC9B,EAAY,eAAkB,KAC9B,EAAY,gBAAkB,KAC9B,EAAY,WAAkB,KAE9B,EAAY,aACV,aACA,YACA,YAKJ,EAAY,QAAQ,GAAG,OAAQ,SAAA,GAA2B,GAAf,GAAe,EAAf,WACzC,GAAY,WAAa,EAAY,YACnC,EAAY,eAAiB,EAAY,gBAAkB,OAc/D,EAAS,YAAc,SAAU,GAC/B,MAAI,GAAM,GAAG,KAAK,IAKhB,EAAc,EAEP,GAEF,GAGT,EAAM,MAAM,EAAa,YACvB,YACA,YACA,eACA,iBACA,WACA,SAEF,EAAQ,WAAW,KAAO,WAE1B,EAAe,KAAO,EAAK,SAE3B,EAAO,QAAU,gLCzdjB,IAAM,GAAiB,EAAQ,UACzB,EAAiB,EAAQ,YACzB,EAAiB,EAAQ,oBACzB,EAAiB,EAAQ,mBACzB,EAAiB,EAAQ,kBACzB,EAAiB,EAAQ,qBAEzB,GACJ,UACE,SAAU,EACV,OAAU,KACV,SAAU,MAGZ,QAAS,SAAU,EAAS,EAAO,EAAc,EAAS,GACxD,MAAI,GAAY,WAAW,QAAU,GAC1B,KAAM,WAGV,MAGT,UAAW,WACT,MAAO,IAIX,GAAc,QAAQ,GAAG,MAAO,SAAA,GAAmC,GAAvB,GAAuB,EAAvB,OAAQ,EAAe,EAAf,WAC9B,kBAAhB,EAAO,OACX,EAAO,GAAK,EAEZ,EAAY,QAAQ,cAAgB,EAAY,QAAQ,aAAe,EAAO,SAC9E,EAAY,QAAQ,WAAa,EAAY,QAAQ,UAAY,EAAO,MACxE,EAAY,QAAQ,MAAQ,KAG9B,EAAc,QAAQ,GAAG,MAAO,SAAA,GAAmC,GAAvB,GAAuB,EAAvB,OAAQ,EAAe,EAAf,WAC9B,iBAAhB,EAAO,OAEX,EAAO,GAAK,EAAO,MAAQ,EAAY,QAAQ,MAE/C,EAAY,OAAO,KAAK,GAExB,EAAY,QAAQ,UAAY,EAAO,MACvC,EAAY,QAAQ,aAAe,EAAO,SAEtC,EAAO,QAAU,EAAA,GACG,OAAjB,EAAO,WACU,KAAjB,EAAO,OACN,MAAM,EAAO,SAEnB,EAAY,QAAQ,MAAQ,EAAO,UA2BvC,EAAa,UAAU,WAAa,SAAU,GAC5C,MAAI,GAAM,GAAG,OAAO,IAClB,KAAK,QAAQ,QAAQ,SAA8B,IAApB,EAAQ,QACvC,KAAK,aAAa,UAAW,GAC7B,KAAK,YAAY,UAAW,GAErB,MAGL,EAAM,GAAG,KAAK,IAChB,KAAK,QAAQ,QAAQ,QAAU,EAE1B,IACH,KAAK,eAAiB,KAAK,eAAiB,KAAK,aAAe,MAG3D,MAGF,KAAK,QAAQ,SAGtB,EAAc,QAAQ,GAAG,YAAa,SAAA,GAAiF,GAArE,GAAqE,EAArE,YAAa,EAAwD,EAAxD,OAAQ,EAAgD,EAAhD,OAAQ,EAAwC,EAAxC,MAAO,EAAiC,EAAjC,SAAU,EAAuB,EAAvB,OAAQ,EAAe,EAAf,WACtG,IAAe,YAAX,EAAJ,CAEA,GAAM,GAAW,EAAY,QAE7B,GAAO,SAAW,EAAS,GAAI,EAAS,IAEpC,GACF,EAAO,SAAW,EAAM,cAAc,EAAU,GAChD,EAAO,IAAW,EAAM,UAAU,GAClC,EAAO,MAAW,EAClB,EAAO,GAAW,EAClB,EAAO,MAAW,EAAM,WAAW,MAAU,GAAW,GACxD,EAAO,GAAW,GAEX,GAAU,YAAiB,IAClC,EAAO,SAAW,EAAY,UAAU,SACxC,EAAO,IAAW,EAAY,UAAU,IACxC,EAAO,MAAW,EAAY,UAAU,MACxC,EAAO,GAAW,EAAO,MAAQ,EACjC,EAAO,MAAW,EAAY,UAAU,MACxC,EAAO,GAAW,EAAO,MAAQ,EAAY,QAAQ,aAGrD,EAAO,SAAW,EAAM,cAAc,EAAU,GAChD,EAAO,IAAW,EAAM,UAAU,GAClC,EAAO,MAAW,EAAO,SAAW,EAAY,QAAQ,cACxD,EAAO,MAAW,EAAM,WAAW,EAAU,EAAY,QAAQ,UAAW,GAE5E,EAAO,GAAK,EAAO,MAAQ,EAAY,QAAQ,UAC/C,EAAO,GAAK,EAAO,MAAQ,EAAY,QAAQ,cAInD,EAAY,QAAQ,GAAG,MAAO,SAAU,GACtC,EAAY,SACV,OAAS,EAAG,EAAG,EAAG,GAElB,cAAe,EACf,aAAe,EACf,SAAe,EAEf,MAAO,EAEP,WAAY,EACZ,UAAY,KAIhB,EAAQ,QAAU,EAClB,EAAQ,MAAM,KAAK,WACnB,EAAM,MAAM,EAAa,YACvB,eACA,cACA,eAEF,EAAQ,WAAW,QAAU,aAE7B,EAAe,QAAU,EAAQ,SAEjC,EAAO,QAAU,kJC4LjB,SAAS,GAAiB,EAAM,EAAO,EAAM,EAAS,EAAqB,EAAM,GAE/E,IAAK,EAAS,OAAO,CAGrB,KAAc,IAAV,EAAgB,CAElB,GAAM,GAAS,EAAM,GAAG,OAAO,EAAK,OAAS,EAAK,MAAS,EAAK,MAAS,EAAK,KACxE,EAAS,EAAM,GAAG,OAAO,EAAK,QAAS,EAAK,OAAS,EAAK,OAAS,EAAK,GAW9E,IATI,EAAQ,IACQ,SAAT,EAAoB,EAAO,QAClB,UAAT,IAAoB,EAAO,SAElC,EAAS,IACO,QAAT,EAAqB,EAAO,SACnB,WAAT,IAAqB,EAAO,QAG1B,SAAT,EAAqB,MAAO,GAAK,GAAM,GAAU,EAAG,EAAK,KAAM,EAAK,OAAU,CAClF,IAAa,QAAT,EAAqB,MAAO,GAAK,GAAM,GAAU,EAAG,EAAK,IAAM,EAAK,QAAU,CAElF,IAAa,UAAT,EAAqB,MAAO,GAAK,GAAM,GAAU,EAAG,EAAK,MAAQ,EAAK,MAAQ,CAClF,IAAa,WAAT,EAAqB,MAAO,GAAK,GAAM,GAAU,EAAG,EAAK,OAAQ,EAAK,KAAQ,EAIpF,QAAK,EAAM,GAAG,QAAQ,KAEf,EAAM,GAAG,QAAQ,GAEpB,IAAU,EAEV,EAAM,YAAY,EAAS,EAAO,IA7XxC,GAAM,GAAiB,EAAQ,UACzB,EAAiB,EAAQ,YACzB,EAAiB,EAAQ,oBACzB,EAAiB,EAAQ,oBACzB,EAAiB,EAAQ,mBACzB,EAAiB,EAAQ,kBACzB,EAAiB,EAAQ,qBAGzB,EAAgB,EAAQ,eAAiB,EAAQ,qBAAsB,GAAI,GAE3E,GACJ,UACE,SAAc,EACd,aAAc,KAEd,OAAY,KACZ,KAAY,KACZ,SAAY,KACZ,QAAY,KACZ,WAAY,KAEZ,QAAQ,EACR,qBAAqB,EACrB,KAAM,KAGN,OAAQ,IAMR,MAAO,KAMP,OAAQ,QAGV,QAAS,SAAU,EAAS,EAAO,EAAc,EAAS,EAAa,GACrE,IAAK,EAAQ,MAAO,KAEpB,IAAM,GAAO,EAAM,UAAW,EAAY,UAAU,MAC9C,EAAU,EAAa,OAE7B,IAAI,EAAQ,OAAO,QAAS,CAC1B,GAAM,GAAgB,EAAQ,OACxB,GAAgB,MAAM,EAAO,OAAO,EAAO,KAAK,EAAO,QAAQ,EAGrE,IAAI,EAAM,GAAG,OAAO,EAAc,OAAQ,CACxC,IAAK,GAAM,KAAQ,GACjB,EAAY,GAAQ,EAAgB,EACA,EAAc,MAAM,GACpB,EACA,EAAY,aACZ,EACA,EACA,EAAc,QAAU,EAM9D,IAHA,EAAY,KAAO,EAAY,OAAS,EAAY,MACpD,EAAY,IAAO,EAAY,MAAS,EAAY,OAEhD,EAAY,MAAQ,EAAY,OAAS,EAAY,KAAO,EAAY,OAC1E,OACE,KAAM,SACN,MAAO,OAIR,CACH,GAAM,GAAiC,MAAxB,EAAQ,OAAO,MAAgB,EAAK,EAAK,EAAK,MAAS,EAChE,EAAiC,MAAxB,EAAQ,OAAO,MAAgB,EAAK,EAAK,EAAK,OAAS,CAEtE,IAAI,GAAS,EACX,OACE,KAAM,SACN,MAAO,EAAO,IAAM,KAAO,EAAQ,IAAM,MAMjD,MAAO,OAGT,QAAU,EAAQ,cAChB,EAAI,WACJ,EAAI,WACJ,GAAI,YAEJ,IAAa,WACb,KAAa,WACb,OAAa,WACb,MAAa,WACb,QAAa,YACb,YAAa,YACb,SAAa,YACb,WAAa,cAEb,EAAI,YACJ,EAAI,YACJ,GAAI,cAEJ,IAAa,YACb,KAAa,YACb,OAAa,YACb,MAAa,YACb,QAAa,cACb,YAAa,cACb,SAAa,cACb,WAAa,eAGf,UAAW,SAAU,GACnB,GAAI,EAAO,KACT,MAAO,GAAO,QAAQ,EAAO,KAAO,EAAO,KAExC,IAAI,EAAO,MAAO,CAIrB,IAAK,GAHD,GAAY,GACV,GAAa,MAAO,SAAU,OAAQ,SAEnC,EAAI,EAAG,EAAI,EAAG,IACjB,EAAO,MAAM,EAAU,MACzB,GAAa,EAAU,GAI3B,OAAO,GAAO,QAAQ,KAM5B,GAAc,QAAQ,GAAG,MAAO,SAAA,GAAmC,GAAvB,GAAuB,EAAvB,OAAQ,EAAe,EAAf,WAClD,IAAoB,gBAAhB,EAAO,MAA2B,EAAY,SAAS,MAA3D,CAIA,GAAM,GAAY,EAAY,OAAO,QAAQ,EAAY,SACnD,EAAgB,EAAY,OAAO,QAAQ,MAQjD,IAAI,EAAc,QAAU,EAAc,oBAAqB,CAC7D,GAAM,GAAc,EAAM,UAAW,EAAY,SAAS,MAE1D,GAAY,IAAS,EAAY,KAAW,EAAY,OAAW,EAAY,OAC/E,EAAY,KAAS,EAAY,MAAW,EAAY,MAAW,EAAY,MAC/E,EAAY,OAAS,EAAY,QAAW,EAAY,QAAW,EAAY,IAC/E,EAAY,MAAS,EAAY,OAAW,EAAY,SAAW,EAAY,KAE/E,EAAY,SAAS,aAAe,MAGpC,GAAY,SAAS,aAAe,IAIlC,GAAc,sBAChB,EAAY,uBAAyB,EAAU,MAAQ,EAAU,QAGnE,EAAY,aACV,MAAY,EACZ,QAAY,EAAM,UAAW,GAC7B,SAAY,EAAM,UAAW,GAC7B,SAAY,EAAM,UAAW,GAC7B,OACE,KAAM,EAAG,MAAQ,EAAG,MAAQ,EAC5B,IAAM,EAAG,OAAQ,EAAG,OAAQ,IAIhC,EAAO,KAAO,EAAY,YAAY,SACtC,EAAO,UAAY,EAAY,YAAY,SAI7C,EAAc,QAAQ,GAAG,MAAO,SAAA,GAA0C,GAA9B,GAA8B,EAA9B,OAAQ,EAAsB,EAAtB,MAAO,EAAe,EAAf,WACzD,IAAc,SAAV,GAAqB,EAAY,SAAS,MAA9C,CAEA,GAAM,GAAgB,EAAY,OAAO,QAAQ,OAC3C,EAAS,EAAc,OACvB,EAAwB,eAAX,GAAsC,WAAX,EAE1C,EAAQ,EAAY,SAAS,MAE3B,EAAa,EAAY,YAAY,MACrC,EAAa,EAAY,YAAY,QACrC,EAAa,EAAY,YAAY,SACrC,EAAa,EAAY,YAAY,MACrC,EAAa,EAAM,OAAO,EAAY,YAAY,SAAU,GAC5D,EAAgB,EAElB,EAAK,EAAO,GACZ,EAAK,EAAO,EAEhB,IAAI,EAAc,qBAAuB,EAAc,OAAQ,CAE7D,GAAM,GAAmB,EAAc,oBACnC,EAAY,uBACZ,CAEJ,GAAQ,EAAY,SAAS,aAExB,EAAc,MAAQ,EAAc,QACjC,EAAc,OAAS,EAAc,IAC3C,GAAM,EAAK,EAEJ,EAAc,MAAQ,EAAc,MAAU,EAAK,EAAK,GACxD,EAAc,KAAQ,EAAc,UAAU,EAAK,EAAK,GASnE,GALI,EAAM,MAAU,EAAQ,KAAU,GAClC,EAAM,SAAU,EAAQ,QAAU,GAClC,EAAM,OAAU,EAAQ,MAAU,GAClC,EAAM,QAAU,EAAQ,OAAU,GAElC,GAIF,GAFA,EAAM,OAAO,EAAU,GAER,eAAX,EAAyB,CAE3B,GAAI,OAAA,EAEA,GAAS,IAAM,EAAS,SAC1B,EAAO,EAAS,IAEhB,EAAS,IAAM,EAAS,OACxB,EAAS,OAAS,GAEhB,EAAS,KAAO,EAAS,QAC3B,EAAO,EAAS,KAEhB,EAAS,KAAO,EAAS,MACzB,EAAS,MAAQ,QAMrB,GAAS,IAAS,KAAK,IAAI,EAAQ,IAAK,EAAM,QAC9C,EAAS,OAAS,KAAK,IAAI,EAAQ,OAAQ,EAAM,KACjD,EAAS,KAAS,KAAK,IAAI,EAAQ,KAAM,EAAM,OAC/C,EAAS,MAAS,KAAK,IAAI,EAAQ,MAAO,EAAM,KAGlD,GAAS,MAAS,EAAS,MAAS,EAAS,KAC7C,EAAS,OAAS,EAAS,OAAS,EAAS,GAE7C,KAAK,GAAM,KAAQ,GACjB,EAAM,GAAQ,EAAS,GAAQ,EAAS,EAG1C,GAAO,MAAQ,EAAY,SAAS,MACpC,EAAO,KAAO,EACd,EAAO,UAAY,KA+CrB,EAAa,UAAU,UAAY,SAAU,GAC3C,MAAI,GAAM,GAAG,OAAO,IAClB,KAAK,QAAQ,OAAO,SAA8B,IAApB,EAAQ,QACtC,KAAK,aAAa,SAAU,GAC5B,KAAK,YAAY,SAAU,GAEvB,eAAe,KAAK,EAAQ,MAC9B,KAAK,QAAQ,OAAO,KAAO,EAAQ,KAEX,OAAjB,EAAQ,OACf,KAAK,QAAQ,OAAO,KAAO,EAAe,OAAO,MAG/C,EAAM,GAAG,KAAK,EAAQ,qBACxB,KAAK,QAAQ,OAAO,oBAAsB,EAAQ,oBAE3C,EAAM,GAAG,KAAK,EAAQ,UAC7B,KAAK,QAAQ,OAAO,OAAS,EAAQ,QAGhC,MAEL,EAAM,GAAG,KAAK,IAChB,KAAK,QAAQ,OAAO,QAAU,EAEzB,IACH,KAAK,cAAgB,KAAK,cAAgB,KAAK,YAAc;AXnVnE,iEWsVW,MAEF,KAAK,QAAQ,QAuCtB,EAAY,QAAQ,GAAG,MAAO,SAAU,GACtC,EAAY,WAAa,OAG3B,EAAc,QAAQ,GAAG,YAAa,SAAA,GAA2C,GAA/B,GAA+B,EAA/B,YAAa,EAAkB,EAAlB,MAC9C,YADgE,EAAV,QACzC,EAAY,aAExB,EAAY,OAAO,QAEvB,OAAO,QACc,MAA3B,EAAY,WACd,EAAO,GAAK,EAAO,GAGnB,EAAO,GAAK,EAAO,GAErB,EAAO,KAAO,OAGd,EAAO,KAAO,EAAY,WAEK,MAA3B,EAAY,WACd,EAAO,GAAK,EAEsB,MAA3B,EAAY,aACnB,EAAO,GAAK,OAKlB,EAAQ,OAAS,EACjB,EAAQ,MAAM,KAAK,UACnB,EAAM,MAAM,EAAa,YACvB,cACA,aACA,qBACA,sBACA,cAEF,EAAQ,WAAW,OAAS,YAE5B,EAAe,OAAS,EAAO,SAE/B,EAAO,QAAU,wKC3ajB,IAAM,GAAiB,EAAQ,eACzB,EAAiB,EAAQ,kBAAkB,UAC3C,EAAiB,EAAQ,cACzB,EAAiB,EAAQ,oBACzB,EAAiB,EAAQ,iBACzB,EAAiB,EAAQ,oBAEzB,GACJ,UACE,SAAW,EACX,UAAW,KACX,OAAW,GACX,MAAW,KAGb,YAAa,KACb,EAAG,KACH,EAAG,EAAG,EAAG,EAET,aAAa,EACb,SAAU,EAEV,MAAO,SAAU,GACf,EAAW,aAAc,EACzB,EAAI,OAAO,EAAW,GAEtB,EAAW,YAAc,EACzB,EAAW,UAAW,GAAI,OAAO,UACjC,EAAW,EAAI,EAAI,QAAQ,EAAW,SAGxC,KAAM,WACJ,EAAW,aAAc,EACzB,EAAI,OAAO,EAAW,IAIxB,OAAQ,WACN,GAAM,GAAU,EAAW,YAAY,OAAO,QAAQ,EAAW,YAAY,SAAS,MAAM,WACtF,EAAY,EAAQ,WAAa,EAAU,EAAW,YAAY,SAClE,GAAM,GAAI,OAAO,UAEjB,GAAM,EAAM,EAAW,UAAY,IAEnC,EAAI,EAAQ,MAAQ,CAEtB,IAAK,IACH,EAAG,OAAO,GACZ,EAAU,SAAS,EAAW,EAAI,EAAG,EAAW,EAAI,GAE7C,IACP,EAAU,YAAc,EAAW,EAAI,EACvC,EAAU,WAAc,EAAW,EAAI,GAGzC,EAAW,SAAW,GAGpB,EAAW,cACb,EAAI,OAAO,EAAW,GACtB,EAAW,EAAI,EAAI,QAAQ,EAAW,UAG1C,MAAO,SAAU,EAAc,GAC7B,GAAM,GAAU,EAAa,OAE7B,OAAO,GAAQ,GAAY,YAAc,EAAQ,GAAY,WAAW,SAE1E,kBAAmB,SAAA,GAAoC,GAAxB,GAAwB,EAAxB,YAAa,EAAW,EAAX,OAC1C,IAAM,EAAY,eACT,EAAW,MAAM,EAAY,OAAQ,EAAY,SAAS,MADnE,CAKA,GAAI,EAAY,WAEd,YADA,EAAW,EAAI,EAAW,EAAI,EAIhC,IAAI,OAAA,GACA,MAAA,GACA,MAAA,GACA,MAAA,GAEE,EAAU,EAAY,OAAO,QAAQ,EAAY,SAAS,MAAM,WAChE,EAAY,EAAQ,WAAa,EAAU,EAAY,QAE7D,IAAI,EAAG,OAAO,GACZ,EAAS,EAAQ,QAAU,EAAW,OACtC,EAAS,EAAQ,QAAU,EAAW,OACtC,EAAS,EAAQ,QAAU,EAAU,WAAc,EAAW,OAC9D,EAAS,EAAQ,QAAU,EAAU,YAAc,EAAW,WAE3D,CACH,GAAM,GAAO,EAAS,qBAAqB,EAE3C,GAAS,EAAQ,QAAU,EAAK,KAAS,EAAW,OACpD,EAAS,EAAQ,QAAU,EAAK,IAAS,EAAW,OACpD,EAAS,EAAQ,QAAU,EAAK,MAAS,EAAW,OACpD,EAAS,EAAQ,QAAU,EAAK,OAAS,EAAW,OAGtD,EAAW,EAAK,EAAQ,EAAG,GAAO,EAAG,EACrC,EAAW,EAAK,EAAQ,EAAI,GAAM,EAAG,EAEhC,EAAW,cAEd,EAAW,OAAS,EAAQ,OAC5B,EAAW,MAAS,EAAQ,MAE5B,EAAW,MAAM,MAKvB,GAAY,QAAQ,GAAG,cAAe,WACpC,EAAW,SAGb,EAAY,QAAQ,GAAG,cAAe,EAAW,mBAEjD,EAAe,UAAU,WAAa,EAAW,SAEjD,EAAO,QAAU,yJC3HjB,IAAM,GAAe,EAAQ,mBACvB,EAAe,EAAQ,mBACvB,EAAe,EAAQ,eACvB,EAAe,EAAQ,oBAE7B,GAAa,UAAU,UAAY,SAAU,EAAS,EAAO,EAAa,GACxE,GAAM,GAAS,KAAK,qBAAqB,EAAS,EAAO,EAAa,EAEtE,OAAI,MAAK,QAAQ,cACR,KAAK,QAAQ,cAAc,EAAS,EAAO,EAAQ,KAAM,EAAS,GAGpE,GAkBT,EAAa,UAAU,WAAa,SAAU,GAC5C,MAAO,MAAK,kBAAkB,aAAc,IAkB9C,EAAa,UAAU,UAAY,SAAU,GAC3C,MAAO,MAAK,kBAAkB,YAAa,IAG7C,EAAa,UAAU,WAAa,SAAU,EAAY,EAAqB,GAC7E,SAAK,IAAe,EAAG,QAAQ,MAE3B,EAAG,OAAO,GACL,EAAS,YAAY,EAAS,EAAY,KAE1C,EAAG,QAAQ,IACX,EAAS,aAAa,EAAY,KAM7C,EAAa,UAAU,UAAY,SAAU,EAAW,EAAqB,GAC3E,OAAK,KAEA,EAAG,QAAQ,KAEZ,EAAG,OAAO,GACL,EAAS,YAAY,EAAS,EAAW,KAEzC,EAAG,QAAQ,IACX,EAAS,aAAa,EAAW,KAM5C,EAAa,UAAU,gBAAkB,SAAU,EAAS,EAAqB,GAC/E,OAAS,KAAK,WAAW,EAAQ,WAAY,EAAqB,IAC7D,KAAK,UAAU,EAAQ,UAAW,EAAqB,IA+B9D,EAAa,UAAU,cAAgB,SAAU,GAC/C,MAAI,GAAG,SAAS,IACd,KAAK,QAAQ,cAAgB,EAEtB,MAGO,OAAZ,SACK,MAAK,QAAQ,cAEb,MAGF,KAAK,QAAQ,eAatB,EAAa,UAAU,YAAc,SAAU,GAC7C,MAAI,GAAG,KAAK,IACV,KAAK,QAAQ,YAAc,EAEpB,MAGQ,OAAb,SACK,MAAK,QAAQ,YAEb,MAGF,KAAK,QAAQ,aAGtB,EAAa,UAAU,qBAAuB,SAAU,EAAS,EAAO,EAAa,GAInF,IAAA,GAHM,GAAO,KAAK,QAAQ,GACtB,EAAS,KAEb,EAAyB,EAAQ,MAAjC,EAAA,MAAA,QAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,OAAA,cAAwC,CAAA,GAAA,EAAA,IAAA,EAAA,CAAA,GAAA,GAAA,EAAA,OAAA,KAAA,GAAA,EAAA,SAAA,CAAA,GAAA,EAAA,EAAA,OAAA,EAAA,KAAA,KAAA,GAAA,EAAA,MAAA,GAA7B,GAA6B,CAEtC,MAAI,EAAY,gBACT,EAAY,OACgD,IAA3D,EAAM,QAAU,KAAK,QAAQ,GAAY,iBAIjD,EAAS,EAAQ,GAAY,QAAQ,EAAS,EAAO,KAAM,EAAS,EAAa,IAG/E,MAAO,yHC9Fb,SAAS,GAAgB,EAAQ,EAAc,EAAS,GACtD,MAAI,GAAM,GAAG,OAAO,IACb,EAAa,gBAAgB,EAAa,QAAQ,EAAO,MAAO,EAAS,IACzE,EAAa,QAAQ,EAAO,MAAM,SAClC,EAAuB,EAAc,EAAS,GAC5C,EAGF,KAGT,QAAS,GAAkB,EAAa,EAAS,EAAO,EAAS,EAAe,GAC9E,IAAK,GAAI,GAAI,EAAG,EAAM,EAAQ,OAAQ,EAAI,EAAK,IAAK,CAClD,GAAM,GAAQ,EAAQ,GAChB,EAAe,EAAc,GAC7B,EAAS,EAAe,EAAM,UAAU,EAAS,EAAO,EAAa,GAC7C,EACA,EACA,EAE9B,IAAI,EACF,OACE,OAAA,EACA,OAAQ,EACR,QAAS,GAKf,SAGF,QAAS,GAAe,EAAa,EAAS,EAAO,GAOnD,QAAS,GAAa,EAAc,EAAU,GAC5C,GAAM,GAAY,EAAQ,2BACtB,EAAQ,iBAAiB,OACzB,EAEA,GAAM,gBAAgB,EAAS,EAAU,KAE3C,EAAQ,KAAK,GACb,EAAc,KAAK,IAIvB,IAlBA,GAAI,MACA,KAEA,EAAU,EACV,EAAS,KAcN,EAAM,GAAG,QAAQ,IAAU,CAChC,KACA,IAEA,IAAM,GAAsB,EAAM,cAAc,IAAI,EAEpD,IAAI,IACI,EAAS,EAAe,EAAoB,UAAU,EAAS,EAAO,EAAa,EAAS,GACpE,EACA,EACA,MACxB,EAAoB,QAAQ,EAAO,MAAM,YAC/C,OACE,QAAA,EACA,OAAA,EACA,OAAQ,EAIV,GAAM,cAAc,gBAAgB,EAAa,EAEjD,IAAM,GAAa,EAAiB,EAAa,EAAS,EAAO,EAAS,EAAe,EAEzF,IAAI,EAAW,SACP,EAAW,OAAO,QAAQ,EAAW,OAAO,MAAM,YACxD,MAAO,EAIX,GAAU,EAAM,WAAW,GAG7B,SAGF,QAAS,GAAS,EAAlB,GAA4D,GAA3B,GAA2B,EAA3B,OAAQ,EAAmB,EAAnB,OAAQ,EAAW,EAAX,OAW/C,IAVA,EAAS,MAEL,EAAY,QAAU,EAAY,OAAO,QAAQ,cACnD,EAAY,OAAO,KAAK,gBAAgB,MAAM,OAAS,IAGzD,EAAY,OAAS,EACrB,EAAY,QAAU,EACtB,EAAM,WAAW,EAAY,SAAU,GAEnC,GAAU,EAAO,QAAQ,YAAa,CACxC,GAAM,GAAS,EAAQ,EAAQ,EAAO,MAAM,UAAU,GAAU,EAChE,GAAY,OAAO,KAAK,gBAAgB,MAAM,OAAS,EAGzD,EAAQ,KAAK,YAAc,YAAa,IAqH1C,QAAS,GAAwB,EAAc,EAAS,GACtD,GAAM,GAAU,EAAa,QACvB,EAAa,EAAQ,EAAO,MAAM,IAClC,EAAgB,EAAQ,EAAO,MAAM,cACvC,EAAqB,EACrB,EAAc,EACd,EAAqB,CAGzB,IAAM,GAAc,GAAiB,EAAU,gBAA/C,CAEA,IAAK,GAAI,GAAI,EAAG,EAAM,EAAM,aAAa,OAAQ,EAAI,EAAK,IAAK,CAC7D,GAAM,GAAc,EAAM,aAAa,GACjC,EAAc,EAAY,SAAS,IAEzC,IAAK,EAAY,cAAjB,CAIA,KAFA,GAE0B,EAAU,gBAClC,OAAO,CAGT,IAAI,EAAY,SAAW,EAA3B,CAIA,IAFA,GAAgB,IAAgB,EAAO,KAAM,IAE1B,EACjB,OAAO,CAGT,IAAI,EAAY,UAAY,IAC1B,IAEI,IAAgB,EAAO,MAAQ,GAAsB,GACvD,OAAO,IAKb,MAAO,GAAU,gBAAkB,GAhVrC,GAAM,GAAiB,EAAQ,eACzB,EAAiB,EAAQ,mBACzB,EAAiB,EAAQ,kBACzB,EAAiB,EAAQ,mBACzB,EAAiB,EAAQ,qBACzB,EAAiB,EAAQ,oBACzB,EAAiB,EAAQ,YACzB,EAAiB,EAAQ,YACzB,EAAiB,EAAQ,oBAAoB,KAEnD,GAAQ,wBAER,IAAM,IACJ,QAAA,EACA,uBAAA,EAEA,gBAAiB,EAAA,EACjB,UACE,WACE,aAAa,EACb,IAAK,EAAA,EACL,cAAe,EACf,UAAY,KACZ,WAAY,OAGhB,kBAAmB,SAAU,GAC3B,EAAM,OAAO,EAAO,SAAU,EAAU,SAAS,YAKrD,GAAY,QAAQ,GAAG,OAAQ,SAAA,GAAwD,GAA5C,GAA4C,EAA5C,YAAa,EAA+B,EAA/B,QAAS,EAAsB,EAAtB,MAAO,EAAe,EAAf,WACtE,KAAI,EAAY,cAAhB,CAGA,EAAQ,EADW,EAAc,EAAa,EAAS,EAAO,OAKhE,EAAY,QAAQ,GAAG,OAAQ,SAAA,GAAwD,GAA5C,GAA4C,EAA5C,YAAa,EAA+B,EAA/B,QAAS,EAAsB,EAAtB,MAAO,EAAe,EAAf,WACtE,IAAK,EAAY,QACV,EAAY,gBACZ,EAAY,cAFnB,CAKA,EAAQ,EADW,EAAc,EAAa,EAAS,EAAO,OAIhE,EAAY,QAAQ,GAAG,OAAQ,SAAU,GAAK,GACpC,GAAuB,EAAvB,YAAa,EAAU,EAAV,KAErB,IAAK,EAAY,gBACV,EAAY,eACX,EAAY,iBACZ,EAAY,SAAS,KAH7B,CAOA,EAAQ,KAAK,eAAgB,EAE7B,IAAM,GAAS,EAAY,MAEvB,GAAY,SAAS,MAAQ,IAE3B,EAAO,QAAQ,EAAY,SAAS,MAAM,cACtC,EAAuB,EAAQ,EAAY,QAAS,EAAY,UACtE,EAAY,KAAK,GAGjB,EAAY,MAAM,EAAY,SAAU,EAAQ,EAAY,aAgHlE,EAAY,QAAQ,GAAG,OAAQ,SAAA,GAA2B,GAAf,GAAe,EAAf,YACnC,EAAS,EAAY,MAEvB,IAAU,EAAO,QAAQ,cAC3B,EAAO,KAAK,gBAAgB,MAAM,OAAS,MAI/C,EAAa,UAAU,UAAY,SAAU,EAAS,EAAO,EAAa,GACxE,GAAM,GAAS,KAAK,qBAAqB,EAAS,EAAO,EAAa,EAEtE,OAAI,MAAK,QAAQ,cACR,KAAK,QAAQ,cAAc,EAAS,EAAO,EAAQ,KAAM,EAAS,GAGpE,GA+BT,EAAa,UAAU,cAAgB,SAAU,GAC/C,MAAI,GAAM,GAAG,SAAS,IACpB,KAAK,QAAQ,cAAgB,EAEtB,MAGO,OAAZ,SACK,MAAK,QAAQ,cAEb,MAGF,KAAK,QAAQ,eAatB,EAAa,UAAU,YAAc,SAAU,GAC7C,MAAI,GAAM,GAAG,KAAK,IAChB,KAAK,QAAQ,YAAc,EAEpB,MAGQ,OAAb,SACK,MAAK,QAAQ,YAEb,MAGF,KAAK,QAAQ,aAGtB,EAAa,UAAU,qBAAuB,SAAU,EAAS,EAAO,EAAa,GAUnF,IAAA,GATM,GAAO,KAAK,QAAQ,GACpB,EAAU,EAAM,UACpB,EAAG,EACH,EAAG,EACH,EAAG,EACH,EAAG,IACF,EAAM,QACL,EAAS,KAEb,EAAyB,EAAQ,MAAjC,EAAA,MAAA,QAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,OAAA,cAAwC,CAAA,GAAA,EAAA,IAAA,EAAA,CAAA,GAAA,GAAA,EAAA,OAAA,KAAA,GAAA,EAAA,SAAA,CAAA,GAAA,EAAA,EAAA,OAAA,EAAA,KAAA,KAAA,GAAA,EAAA,MAAA,GAA7B,GAA6B,CAEtC,MAAI,EAAY,gBACT,EAAY,OAC0C,IAArD,EAAU,KAAK,QAAQ,GAAY,iBAI3C,EAAS,EAAQ,GAAY,QAAQ,EAAS,EAAO,KAAM,EAAS,EAAa,IAG/E,MAAO,KA4Db,EAAS,gBAAkB,SAAU,GACnC,MAAI,GAAM,GAAG,OAAO,IAClB,EAAU,gBAAkB,EAErB,MAGF,EAAU,iBAGnB,EAAa,gBAAgB,KAAK,eAClC,EAAa,gBAAgB,KAAK,iBAClC,EAAa,gBAAgB,KAAK,cAClC,EAAa,gBAAgB,KAAK,aAElC,EAAe,KAAK,cAAgB,KACpC,EAAe,KAAK,aAAc,EAElC,EAAM,OAAO,EAAe,UAAW,EAAU,SAAS,WAE1D,EAAO,QAAU,4OCnXjB,IAAM,GAAc,EAAQ,UACtB,EAAc,EAAQ,iBAE5B,GAAY,QAAQ,GAAG,MAAO,SAAU,GACtC,EAAY,WAAa,OAG3B,EAAU,QAAQ,GAAG,WAAY,SAAA,GAA2B,GAAf,GAAe,EAAf,YACrC,EAAa,EAAY,SAAS,IAExC,IAAK,EAAL,CAEA,GAAM,GAAQ,EAAY,OAAO,QAAQ,GAAY,KAEjD,GAAQ,IACV,EAAY,WAAa,WAAW,WAClC,EAAY,MAAM,EAAY,SAAU,EAAY,OAAQ,EAAY,UACvE,OAIP,EAAY,QAAQ,GAAG,OAAQ,SAAA,GAAsC,GAA1B,GAA0B,EAA1B,YAAa,EAAa,EAAb,SAClD,GAAY,kBAAoB,GAClC,aAAa,EAAY,cAK7B,EAAU,QAAQ,GAAG,eAAgB,SAAA,GAA2B,GAAf,GAAe,EAAf,YACzC,EAAa,EAAY,SAAS,IAExC,IAAK,EAAL,CAEc,EAAY,OAAO,QAAQ,GAAY,MAEzC,IACV,EAAY,SAAS,KAAO,4EC6DhC,SAAS,GAAgB,EAAW,GAClC,IAAK,EAAgB,OAAO,CAE5B,IAAM,GAAW,EAAa,QAAQ,KAAK,SAE3C,OAAsB,OAAd,GAAmC,OAAb,GAAqB,IAAa,EAtGlE,GAAM,GAAY,EAAQ,UACpB,EAAY,EAAQ,YACpB,EAAY,EAAQ,oBACpB,EAAY,EAAQ,iBAEc,EAAQ,qBAAxC,IAAA,gBAAiB,IAAA,UAEzB,GAAU,kBAAkB,EAAQ,oBAEpC,EAAU,QAAQ,GAAG,eAAiB,SAAA,GAAgD,GAApC,GAAoC,EAApC,YAAa,EAAuB,EAAvB,YAAa,EAAU,EAAV,GAAI,EAAM,EAAN,EAC9E,IAAkC,SAA9B,EAAY,SAAS,KAAzB,CAGA,GAAM,GAAO,KAAK,IAAI,GAChB,EAAO,KAAK,IAAI,GAChB,EAAU,EAAY,OAAO,QAAQ,KACrC,EAAY,EAAQ,UACpB,EAAe,EAAO,EAAO,IAAM,EAAO,EAAO,IAAM,IAO7D,IALA,EAAY,SAAS,KAA4B,UAArB,EAAQ,SAChC,EAAY,GACZ,EAAQ,SAGQ,OAAhB,GAAsC,OAAd,GAAsB,IAAc,IAE9D,EAAY,SAAS,KAAO,MAIvB,EAAY,SAAS,MAiCxB,IA/BA,GAAI,GAAU,EAER,EAAe,SAAU,EAAc,EAAU,GACrD,GAAM,GAAW,EAAQ,2BACnB,EAAQ,iBAAiB,OACzB,EAEN,IAAI,IAAiB,EAAY,SAE5B,EAAQ,cACL,EAAa,gBAAgB,EAAS,EAAS,IAChD,EAAgB,EAAS,EAAU,GAAW,CAEnD,GAAM,GAAS,EAAa,UAAU,EAAY,YACZ,EAAY,UACZ,EACA,EAEtC,IAAI,GACmB,SAAhB,EAAO,MACP,EAAe,EAAa,IAC5B,EAAU,eAAe,EAAQ,EAAc,EAAS,GAE7D,MAAO,KAKT,EAAS,KAGN,EAAG,QAAQ,IAAU,CAC1B,GAAM,GAAsB,EAAM,cAAc,IAAI,EAQpD,IANI,GACG,IAAwB,EAAY,SACnC,EAAoB,QAAQ,KAAK,cAEvC,EAAS,EAAoB,UAAU,EAAY,YAAa,EAAY,UAAW,EAAa,IAElG,GACmB,SAAhB,EAAO,MACP,EAAe,EAAa,GAAsB,CAEvD,EAAY,SAAS,KAAO,OAC5B,EAAY,OAAS,EACrB,EAAY,QAAU,CACtB,OAGF,GAAM,GAAuB,EAAM,cAAc,gBAAgB,EAAc,EAE/E,IAAI,EAAsB,CACxB,EAAY,SAAS,KAAO,OAC5B,EAAY,OAAS,EACrB,EAAY,QAAU,CACtB,OAGF,EAAU,EAAW,uJC3F7B,GAAQ,UAAU,kBAAkB,EAAQ,8FCA5C,GAAQ,UAAU,kBAAkB,EAAQ,6FCA5C,GAAO,SACL,MACE,OAAgB,KAChB,eAAgB,OAChB,YAAgB,QAGlB,WACE,QAAU,EAAG,EAAG,EAAG,GAInB,aAAc,EAEd,SACE,SAAmB,EACnB,WAAmB,GACnB,SAAmB,IACnB,SAAmB,GACnB,aAAmB,EACnB,kBAAmB,4CCjBzB,GAAQ,oBAGR,EAAQ,aAGR,EAAQ,oBACR,EAAQ,wBAGR,EAAQ,wBACR,EAAQ,8BACR,EAAQ,uCAGR,EAAQ,qBAGR,EAAQ,qBACR,EAAQ,oBACR,EAAQ,kBACR,EAAQ,kBAGR,EAAQ,wBACR,EAAQ,6BACR,EAAQ,4BAGR,EAAQ,uBACR,EAAQ,sBACR,EAAQ,oBAGR,EAAQ,mCAGR,EAAQ,gBAGR,EAAO,QAAU,EAAQ,wjBCyIzB,SAAS,GAAa,EAAa,GACjC,GAAM,GAAiB,EAAY,OAAO,QAAQ,EAAY,SAAS,MAAM,QACvE,EAAS,EAAe,WACxB,GAAc,KAAK,IAAI,EAAe,SAAW,EAAO,IAAM,CAEpE,GAAO,GAAK,EAAY,UAAU,MAClC,EAAO,GAAK,EAAY,UAAU,MAClC,EAAO,GAAK,EAAO,WAAW,UAAY,IAC1C,EAAO,GAAK,EAAO,GAAK,EAExB,EAAO,WAAa,EAAO,IAAM,EAAO,IAAM,GAAc,EAC5D,EAAO,WAAa,EAAO,IAAM,EAAO,IAAM,GAAc,EAC5D,EAAO,GAAK,EAEZ,EAAO,UAAY,EAAS,EAAO,GACnC,EAAO,UAAY,EAAI,EAAe,SAAW,EAAO,GAG1D,QAAS,KACP,EAAoB,MACpB,EAAM,eAAe,KAAK,aAAc,KAAK,WAAY,KAAK,UAE9D,IAAM,GAAS,KAAK,cACd,EAAU,KAAK,OAAO,QAAQ,KAAK,SAAS,MAAM,QAClD,EAAS,EAAQ,WACjB,GAAI,GAAI,OAAO,UAAY,IAAO,EAAO,EAE/C,IAAI,EAAI,EAAO,GAAI,CAEjB,GAAM,GAAY,GAAK,KAAK,KAAK,EAAS,GAAK,EAAO,WAAa,EAAO,SAE1E,IAAI,EAAO,aAAe,EAAO,IAAM,EAAO,aAAe,EAAO,GAClE,EAAO,GAAK,EAAO,GAAK,EACxB,EAAO,GAAK,EAAO,GAAK,MAErB,CACH,GAAM,GAAY,EAAM,uBAAuB,EAAG,EACH,EAAO,GACP,EAAO,GACP,EAAO,WACP,EAAO,WACP,EAE/C,GAAO,GAAK,EAAU,EACtB,EAAO,GAAK,EAAU,EAGxB,KAAK,SAEL,EAAO,EAAI,EAAe,QAAQ,KAAK,uBAGvC,GAAO,GAAK,EAAO,WACnB,EAAO,GAAK,EAAO,WAEnB,KAAK,SACL,KAAK,IAAI,EAAO,YAChB,EAAO,QAAS,EAChB,KAAK,WAAa,IAGpB,GAAM,WAAW,KAAK,WAAY,KAAK,WAGzC,QAAS,KACP,EAAoB,KAEpB,IAAM,GAAS,KAAK,cACd,GAAI,GAAI,OAAO,UAAY,EAAO,GAClC,EAAW,KAAK,OAAO,QAAQ,KAAK,SAAS,MAAM,QAAQ,iBAE7D,GAAI,GACN,EAAO,GAAK,EAAM,YAAY,EAAG,EAAG,EAAO,GAAI,GAC/C,EAAO,GAAK,EAAM,YAAY,EAAG,EAAG,EAAO,GAAI,GAE/C,KAAK,YAAY,EAAO,WAAY,EAAO,YAE3C,EAAO,EAAI,EAAe,QAAQ,KAAK,uBAGvC,EAAO,GAAK,EAAO,GACnB,EAAO,GAAK,EAAO,GAEnB,KAAK,YAAY,EAAO,WAAY,EAAO,YAC3C,KAAK,IAAI,EAAO,YAEhB,EAAO,UACL,EAAO,QAAS,EAClB,KAAK,WAAa,MAItB,QAAS,GAAqB,GAC5B,GAAM,GAAS,EAAY,aAG3B,IAAK,EAAO,OAAZ,CAEA,GAAM,GAAW,EAAO,SAAS,KAC3B,EAAW,EAAO,SAAS,MAEjC,GAAM,UAAU,EAAY,YAC1B,MAAS,EAAO,EAAM,EAAO,GAC7B,MAAS,EAAO,EAAM,EAAO,GAC7B,QAAS,EAAS,EAAI,EAAO,GAC7B,QAAS,EAAS,EAAI,EAAO,OA7RjC,GAAM,GAAiB,EAAQ,mBACzB,EAAiB,EAAQ,iBACzB,EAAiB,EAAQ,eACzB,EAAiB,EAAQ,WACzB,EAAiB,EAAQ,cAE/B,GAAY,QAAQ,GAAG,MAAO,SAAU,GACtC,EAAY,eACV,QAAa,EACb,WAAa,EACb,aAAa,EAEb,WAAY,KACZ,YAEA,GAAI,EAAG,GAAI,EACX,GAAI,EAAG,GAAI,EAEX,GAAI,EACJ,IAAK,EAAG,IAAK,EACb,SAAU,EAEV,UAAW,EACX,UAAW,EACX,EAAK,MAGP,EAAY,kBAAsB,WAAA,MAAM,GAAe,MAAM,IAC7D,EAAY,oBAAsB,WAAA,MAAM,GAAe,MAAM,MAG/D,EAAY,QAAQ,GAAG,OAAQ,SAAA,GAAwD,GAA5C,GAA4C,EAA5C,YAAa,EAA+B,EAA/B,MAAO,EAAwB,EAAxB,QAAS,EAAe,EAAf,YAChE,EAAS,EAAY,aAG3B,IAAI,EAAO,OAIT,IAHA,GAAI,GAAU,EAGP,EAAM,GAAG,QAAQ,IAAU,CAGhC,GAAI,IAAY,EAAY,QAAS,CAEnC,EAAe,OAAO,EAAO,GAC7B,EAAO,QAAS,EAChB,EAAY,WAAa,KAGzB,EAAY,cAAc,GAC1B,EAAM,UAAU,EAAY,UAAW,EAAY,SAGnD,IAAM,IAAc,YAAA,EACpB,GAAY,QAAQ,KAAK,qBAAsB,GAC/C,EAAY,QAAQ,KAAK,gBAAsB,EAG/C,IAAM,GAAc,GAAI,GAAc,EACA,EACA,EAAY,SAAS,KACrB,gBACA,EAAY,QAElD,GAAY,OAAO,KAAK,GACxB,EAAY,UAAY,EACxB,EAAU,cAAc,EAAY,kBAEpC,EAAM,WAAW,EAAY,WAAY,EAAY,UACrD,OAGF,EAAU,EAAM,WAAW,MAKjC,EAAY,QAAQ,GAAG,KAAM,SAAA,GAAkC,GAAtB,GAAsB,EAAtB,YAAa,EAAS,EAAT,MAC9C,EAAS,EAAY,aAE3B,IAAK,EAAY,gBAAiB,EAAO,OAAzC,CAEA,GAAM,GAAS,EAAY,OACrB,EAAU,GAAU,EAAO,QAC3B,EAAiB,GAAW,EAAY,SAAS,MAAQ,EAAQ,EAAY,SAAS,MAAM,QAE5F,GAAM,GAAI,OAAO,UACjB,KACA,EAAO,EAAM,UAAW,EAAY,UAAU,MAC9C,EAAe,EAAY,aAAa,OAAO,MAEjD,GAAY,EACZ,MAAA,GAGE,EAAmB,GAAkB,EAAe,SACN,YAA9B,EAAY,SAAS,MACrB,IAAU,EAAO,WAEjC,EAAW,GACX,EAAM,EAAY,UAAU,UAAa,IAC1C,EAAe,EAAe,UAC9B,EAAe,EAAe,SAE7B,GACJ,YAAA,EACA,WAAY,EACZ,SAAA,EACA,QAAQ,EACR,gBAAgB,EAId,KAAoB,IACtB,EAAU,cAAc,GAExB,EAAiB,EAAU,OAAO,GAE9B,EAAe,YAAc,EAAe,SAC9C,GAAY,KAIV,GAAW,KAEjB,EAAM,WAAW,EAAO,SAAU,EAAY,WAE9C,EAAY,SAAS,GAAK,EAAO,WAC/B,GAAI,GAAc,EAAa,EAAO,EAAY,SAAS,KAAM,eAAgB,EAAY,SAE/F,EAAO,GAAK,EAEZ,EAAO,QAAS,EAChB,EAAO,YAAc,EAAe,YACpC,EAAY,WAAa,EAEzB,EAAO,KAAK,EAAO,YAEf,GACF,EAAO,IAAM,EAAY,aAAa,OAAO,GAC7C,EAAO,IAAM,EAAY,aAAa,OAAO,GAC7C,EAAO,GAAK,EAEZ,EAAY,EAAa,GAEzB,EAAM,OAAO,EAAM,EAAY,UAAU,MAEzC,EAAK,GAAK,EAAO,GACjB,EAAK,GAAK,EAAO,GAEjB,EAAU,cAAc,GAExB,EAAiB,EAAU,OAAO,GAElC,EAAO,YAAc,EAAe,GACpC,EAAO,YAAc,EAAe,GAEpC,EAAO,EAAI,EAAe,QAAQ,EAAY,qBAG9C,EAAO,WAAY,EACnB,EAAO,GAAK,EAAe,GAC3B,EAAO,GAAK,EAAe,GAE3B,EAAO,GAAK,EAAO,GAAK,EAExB,EAAO,EAAI,EAAe,QAAQ,EAAY,0BAIlD,EAAY,QAAQ,GAAG,cAAe,SAAA,GAA2B,GAAf,GAAe,EAAf,YAC1C,EAAS,EAAY,aAEvB,GAAO,SACT,EAAe,OAAO,EAAO,GAC7B,EAAO,QAAS,EAChB,EAAY,WAAa,iIC/I7B,SAAS,GAAU,EAAS,GAC1B,GAAI,GAAe,EAAM,cAAc,IAAI,EAAS,EAOpD,OALK,KACH,EAAe,GAAI,GAAa,EAAS,GACzC,EAAa,OAAO,OAAS,GAGxB,EAzCT,GAAM,GAAe,EAAQ,mBACvB,EAAe,EAAQ,kBACvB,EAAe,EAAQ,WACvB,EAAe,EAAQ,WACvB,EAAe,EAAQ,kBACvB,EAAe,EAAQ,iBAEvB,IA6CN,GAAS,MAAQ,SAAU,EAAS,GAClC,OAAoF,IAA7E,EAAM,cAAc,eAAe,EAAS,GAAW,EAAQ,UAexE,EAAS,GAAK,SAAU,EAAM,EAAU,GAKtC,GAJI,EAAM,GAAG,OAAO,KAA+B,IAAtB,EAAK,OAAO,OACvC,EAAO,EAAK,OAAO,MAAM,OAGvB,EAAM,GAAG,MAAM,GAAO,CACxB,IAAA,GAAA,GAAwB,EAAxB,EAAA,MAAA,QAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,OAAA,cAA8B,CAAA,GAAA,EAAA,IAAA,EAAA,CAAA,GAAA,GAAA,EAAA,OAAA,KAAA,GAAA,EAAA,SAAA,CAAA,GAAA,EAAA,EAAA,OAAA,EAAA,KAAA,KAAA,GAAA,EAAA,MAAA,GAAnB,GAAmB,CAC5B,GAAS,GAAG,EAAW,EAAU,GAGnC,MAAO,GAGT,GAAI,EAAM,GAAG,OAAO,GAAO,CACzB,IAAK,GAAM,KAAQ,GACjB,EAAS,GAAG,EAAM,EAAK,GAAO,EAGhC,OAAO,GAkBT,MAdI,GAAM,SAAS,EAAa,WAAY,GAErC,EAAa,GAIhB,EAAa,GAAM,KAAK,GAHxB,EAAa,IAAS,GAQxB,EAAO,IAAI,EAAM,SAAU,EAAM,GAAY,QAAA,IAGxC,GAcT,EAAS,IAAM,SAAU,EAAM,EAAU,GAKvC,GAJI,EAAM,GAAG,OAAO,KAA+B,IAAtB,EAAK,OAAO,OACvC,EAAO,EAAK,OAAO,MAAM,OAGvB,EAAM,GAAG,MAAM,GAAO,CACxB,IAAA,GAAA,GAAwB,EAAxB,EAAA,MAAA,QAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,OAAA,cAA8B,CAAA,GAAA,EAAA,IAAA,EAAA,CAAA,GAAA,GAAA,EAAA,OAAA,KAAA,GAAA,EAAA,SAAA,CAAA,GAAA,EAAA,EAAA,OAAA,EAAA,KAAA,KAAA,GAAA,EAAA,MAAA,GAAnB,GAAmB,CAC5B,GAAS,IAAI,EAAW,EAAU,GAGpC,MAAO,GAGT,GAAI,EAAM,GAAG,OAAO,GAAO,CACzB,IAAK,GAAM,KAAQ,GACjB,EAAS,IAAI,EAAM,EAAK,GAAO,EAGjC,OAAO,GAGT,GAAK,EAAM,SAAS,EAAa,WAAY,GAGxC,CACH,GAAI,OAAA,EAEA,KAAQ,KACsD,KAA1D,EAAQ,EAAM,QAAQ,EAAa,GAAO,KAChD,EAAa,GAAM,OAAO,EAAO,OAPnC,GAAO,OAAO,EAAM,SAAU,EAAM,EAAU,EAWhD,OAAO,IAUT,EAAS,MAAQ,WACf,MAAO,IAIT,EAAS,kBAAqB,EAAM,eACpC,EAAS,aAAqB,EAAM,UACpC,EAAS,iBAAqB,EAAM,cACpC,EAAS,cAAqB,EAAM,WAEpC,EAAS,eAAuB,EAAM,eACtC,EAAS,qBAAuB,EAAM,qBACtC,EAAS,gBAAuB,EAAM,gBACtC,EAAS,QAAuB,EAAM,QAQtC,EAAS,cAAgB,WACvB,MAAO,GAAQ,eASjB,EAAS,qBAAuB,WAC9B,MAAO,GAAQ,sBAYjB,EAAS,KAAO,SAAU,GACxB,IAAK,GAAI,GAAI,EAAM,aAAa,OAAS,EAAG,GAAK,EAAG,IAClD,EAAM,aAAa,GAAG,KAAK,EAG7B,OAAO,IAYT,EAAS,qBAAuB,SAAU,GACxC,MAAI,GAAM,GAAG,OAAO,IAClB,EAAY,qBAAuB,EAE5B,MAGF,EAAY,sBAGrB,EAAS,YAAiB,EAAM,YAChC,EAAS,eAAiB,EAAM,eAEhC,EAAM,SAAW,EAEjB,EAAO,QAAU,8IC1KjB,SAAS,GAAT,GAAqD,GAAtB,GAAsB,EAAtB,YAAa,EAAS,EAAT,KACtC,GAAY,QACd,EAAY,OAAO,uBAAuB,GArE9C,GAAM,GAAe,EAAQ,kBACvB,EAAe,EAAQ,iBACvB,EAAe,EAAQ,WACvB,EAAe,EAAQ,cACvB,EAAe,EAAQ,oBAEa,EAAQ,oBAA1C,IAAA,aAAc,IAAA,eAetB,GAAa,UAAU,eAAiB,SAAU,GAChD,MAAI,wBAAwB,KAAK,IAC/B,KAAK,QAAQ,eAAiB,EACvB,MAGL,EAAG,KAAK,IACV,KAAK,QAAQ,eAAiB,EAAU,SAAW,QAC5C,MAGF,KAAK,QAAQ,gBAGtB,EAAa,UAAU,uBAAyB,SAAU,GACxD,GAAM,GAAU,KAAK,QAAQ,cAE7B,IAAgB,UAAZ,EAEJ,MAAgB,WAAZ,MACF,GAAM,sBAQJ,EAAO,iBAKP,uCAAuC,KAAK,EAAM,OAKlD,EAAG,QAAQ,EAAM,SACd,EAAgB,EAAM,OAAQ,0EAIrC,EAAM,kBASR,KAAA,OAA2B,OAAQ,OAAQ,KAAM,UAAjD,EAAA,EAAA,EAAA,EAAA,OAAA,IAA4D,CAAvD,GAAM,GAAA,EAAA,EACT,GAAY,QAAQ,GAAG,EAAa,GAItC,EAAY,UAAU,UAAY,SAA4B,GAC5D,IAAA,GAAA,GAA0B,EAAM,aAAhC,EAAA,MAAA,QAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,OAAA,cAA8C,CAAA,GAAA,EAAA,IAAA,EAAA,CAAA,GAAA,GAAA,EAAA,OAAA,KAAA,GAAA,EAAA,SAAA,CAAA,GAAA,EAAA,EAAA,OAAA,EAAA,KAAA,KAAA,GAAA,EAAA,MAAA,GAAnC,GAAmC,CAE5C,IAAI,EAAY,UACR,EAAY,UAAY,EAAM,QAC3B,EAAa,EAAY,QAAS,EAAM,SAGjD,WADA,GAAY,OAAO,uBAAuB,qJC1DhD,SAAS,GAAe,GACtB,GAAM,GAAc,EAAM,OACpB,EAAc,EAAQ,OAAO,EAAO,EAAM,KAAM,EAEjD,IAED,EAAY,SACT,EAAM,UAAY,EAAY,QAAQ,SACtC,EAAM,UAAY,EAAY,QAAQ,SACtC,IAAkB,EAAY,QAAQ,SAE3C,EAAY,YAAY,GAAK,EAC7B,EAAY,UAAY,IAAK,GAAI,OAAO,UAExC,EAAc,MACZ,YAAA,EACA,MAAA,EACA,YAAA,EACA,QAAS,EACT,KAAM,SA9CZ,GAAM,GAAgB,EAAQ,WACxB,EAAgB,EAAQ,kBACxB,EAAgB,EAAQ,mBACxB,EAAgB,EAAQ,6BACxB,EAAgB,EAAQ,0BAEX,EAAQ,kBAAnB,IAAA,OAEF,EAAW,OAAO,UAAU,QA2ClC,IAzCK,EAAO,MAAM,UAChB,EAAO,MAAM,QAAU,SAAU,GAC/B,MAA8B,mBAAvB,EAAS,KAAK,KAIpB,OAAO,UAAU,OACpB,OAAO,UAAU,KAAO,WACtB,MAAO,MAAK,QAAQ,qCAAsC,MAiC1D,EAAQ,MAAO,CACjB,GAAM,GAAY,SAAU,GAC1B,IAAA,GAAA,GAA0B,EAAM,aAAhC,EAAA,MAAA,QAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,OAAA,cAA8C,CAAA,GAAA,EAAA,IAAA,EAAA,CAAA,GAAA,GAAA,EAAA,OAAA,KAAA,GAAA,EAAA,SAAA,CAAA,GAAA,EAAA,EAAA,OAAA,EAAA,KAAA,KAAA,GAAA,EAAA,MAAA,GAAnC,GAAmC,CACxC,GAAY,eACd,EAAY,OAAO,uBAAuB,KAK1C,EAAW,SAAA,EAAiC,GAAY,GAAxB,GAAwB,EAAxB,IAC9B,GADsD,EAAnB,IACY,IAAjC,EAAW,QAAQ,UACnC,EAAO,IAAM,EAAO,OAGxB,GAAY,EAAK,cAAe,GAE5B,GACF,EAAY,EAAK,WAAY,GAIjC,GAAM,QAAQ,GAAG,eAAmB,GACpC,EAAM,QAAQ,GAAG,kBAAmB,GAGtC,EAAO,QAAU,4KCyGjB,SAAS,GAAU,EAAS,EAAQ,GAClC,MAAQ,IAAW,EAAQ,UACf,IAAW,EAAQ,YAClB,GAAkB,EAAQ,SAxLzC,GAAM,GAAgB,EAAQ,oBACxB,EAAgB,EAAQ,kBACxB,EAAgB,EAAQ,mBAExB,GACJ,SAEA,WAAY,SAAU,GAAK,GACjB,GAAkC,EAAlC,YAAyB,EAAS,EAArB,WACb,EAAiC,EAAjC,OAAQ,EAAyB,EAAzB,QAAS,EAAgB,EAAhB,YACnB,EAAO,EAAO,QAAQ,EAExB,IACF,EAAY,KAAO,EAAK,EAAI,EAAK,KACjC,EAAY,IAAO,EAAK,EAAI,EAAK,IAEjC,EAAY,MAAS,EAAK,MAAS,EAAK,EACxC,EAAY,OAAS,EAAK,OAAS,EAAK,EAElC,SAAY,KAAS,EAAK,MAAS,EAAK,MAAS,EAAK,MACtD,UAAY,KAAS,EAAK,OAAS,EAAK,OAAS,EAAK,MAG5D,EAAY,KAAO,EAAY,IAAM,EAAY,MAAQ,EAAY,OAAS,EAGhF,EAAI,KAAO,EACX,EAAI,aAAe,EACnB,EAAI,QAAU,CAEd,KAAK,GAAI,GAAI,EAAG,EAAI,EAAU,MAAM,OAAQ,IAAK,CAC/C,GAAM,GAAe,EAAU,MAAM,EAErC,GAAI,QAAU,EAAO,QAAQ,EAAY,SAAS,MAAM,GAEnD,EAAI,UAIT,EAAY,gBAAgB,GAAgB,EAAU,GAAc,UAAU,MAIlF,OAAQ,SAAU,GAWhB,IAAA,GAVQ,GAAkD,EAAlD,YAAa,EAAqC,EAArC,SAAU,EAA2B,EAA3B,OAAQ,EAAmB,EAAnB,eACjC,EAAS,KAAW,EAAI,YACxB,GACJ,GAAI,EACJ,GAAI,EACJ,SAAS,EACT,QAAQ,EACR,YAAY,GAGd,EAA2B,EAAU,MAArC,EAAA,MAAA,QAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,OAAA,cAA4C,CAAA,GAAA,EAAA,IAAA,EAAA,CAAA,GAAA,GAAA,EAAA,OAAA,KAAA,GAAA,EAAA,SAAA,CAAA,GAAA,EAAA,EAAA,OAAA,EAAA,KAAA,KAAA,GAAA,EAAA,MAAA,GAAjC,GAAiC,EACpC,EAAW,EAAU,GACrB,EAAU,EAAY,OAAO,QAAQ,EAAY,SAAS,MAAM,EAEjE,GAAS,EAAS,EAAQ,KAE/B,EAAI,OAAS,EAAI,OAAS,EAAS,GACnC,EAAI,QAAU,EACd,EAAI,OAAS,EAAI,YAAY,gBAAgB,GAE7C,EAAS,IAAI,GAET,EAAI,OAAO,SACb,EAAO,GAAK,EAAI,OAAO,GACvB,EAAO,GAAK,EAAI,OAAO,GAEvB,EAAO,IAAM,EAAI,OAAO,GACxB,EAAO,IAAM,EAAI,OAAO,GAExB,EAAO,QAAS,IAUpB,MAFA,GAAO,YAAc,EAAI,SAAW,EAAO,QAAU,EAAI,OAAO,QAEzD,GAGT,cAAe,SAAU,GACvB,IAAA,GAAA,GAA2B,EAAU,MAArC,EAAA,MAAA,QAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,OAAA,cAA4C,CAAA,GAAA,EAAA,IAAA,EAAA,CAAA,GAAA,GAAA,EAAA,OAAA,KAAA,GAAA,EAAA,SAAA,CAAA,GAAA,EAAA,EAAA,OAAA,EAAA,KAAA,KAAA,GAAA,EAAA,MAAA,GAAjC,GAAiC,EACpC,EAAS,EAAS,MAExB,GAAO,GAAK,EAAO,GAAK,EACxB,EAAO,UAAY,EAAO,UAAY,IACtC,EAAO,QAAS,EAChB,EAAO,SAAU,EAEjB,EAAS,GAAgB,EAG3B,MAAO,IAGT,MAAO,SAAA,EAA2B,GAAY,GAA3B,GAA2B,EAA3B,YACX,GACJ,YAAA,EACA,YAA4B,kBAAf,EACA,EAAY,UAAY,EAAY,aAAa,KAC9D,YAAa,EAAY,YACzB,SAAU,EAAY,iBACtB,QAAQ,EACR,gBAAgB,EAGlB,GAAU,WAAW,GACrB,EAAU,cAAc,EAAI,UAE5B,EAAI,WAAa,KAAW,EAAY,YAAY,MACpD,EAAY,eAAiB,EAAU,OAAO,IAIlD,GAAY,QAAQ,GAAG,MAAO,SAAU,GACtC,EAAY,aAAqB,KAAM,EAAG,MAAO,EAAG,IAAK,EAAG,OAAQ,GACpE,EAAY,mBACZ,EAAY,iBAAmB,EAAU,kBACzC,EAAY,eAAmB,OAGjC,EAAY,QAAQ,GAAG,eAAiB,EAAU,OAClD,EAAY,QAAQ,GAAG,gBAAiB,EAAU,OAElD,EAAY,QAAQ,GAAG,qBAAsB,SAAA,GAA0D,GAA9C,GAA8C,EAA9C,YAAa,EAAiC,EAAjC,OAAQ,EAAyB,EAAzB,sBACtE,EAAiB,EAAU,QAC/B,YAAA,EACA,OAAA,EACA,WAAY,EAAY,UAAU,KAClC,SAAU,EAAY,iBACtB,gBAAgB,KAKb,EAAe,YAAc,IAChC,EAAY,eAAgB,GAG9B,EAAY,eAAiB,IAG/B,EAAY,QAAQ,GAAG,aAAc,SAAA,GACnC,IAAK,GAD0C,GAAsB,EAAtB,YAAa,EAAS,EAAT,MACnD,EAAI,EAAG,EAAI,EAAU,MAAM,OAAQ,IAAK,CAI/C,GAAI,EAHY,EAAY,OAAO,QAAQ,EAAY,SAAS,MAAM,EAAU,MAAM,KAGhE,GAAM,GAAO,CAEjC,EAAY,QAAS,MAAA,EAAO,QAAQ,GACpC,WAKN,EAAc,QAAQ,GAAG,SAAU,SAAU,GAI3C,IAAK,GAHG,GAAwB,EAAxB,OAAQ,EAAgB,EAAhB,YACV,EAAc,KAAW,GAEtB,EAAI,EAAG,EAAI,EAAU,MAAM,OAAQ,IAAK,CAC/C,GAAM,GAAe,EAAU,MAAM,EAGrC,IAFA,EAAY,QAAU,EAAY,OAAO,QAAQ,EAAY,SAAS,MAAM,GAEvE,EAAY,QAAjB,CAIA,GAAM,GAAW,EAAU,EAE3B,GAAY,OAAS,EAAY,iBAAiB,GAElD,EAAO,GAAgB,EAAS,aAAa,OAUjD,EAAO,QAAU,mGC3FjB,SAAS,GAAoB,EAAO,EAAa,GAC/C,MAAI,GAAM,GAAG,SAAS,GACb,EAAM,gBAAgB,EAAO,EAAY,OAAQ,EAAY,SAAU,EAAK,EAAG,EAAK,EAAG,IAEvF,EAAM,gBAAgB,EAAO,EAAY,OAAQ,EAAY,SApGxE,GAAM,GAAiB,EAAQ,WACzB,EAAiB,EAAQ,YACzB,EAAiB,EAAQ,qBAEzB,GACJ,UACE,SAAa,EACb,SAAa,EACb,YAAa,KACb,YAAa,MAGf,UAAW,SAAA,GAA0C,GAA9B,GAA8B,EAA9B,KAAM,EAAwB,EAAxB,YAAa,EAAW,EAAX,QAClC,EAAc,GAAW,EAAQ,YACjC,IAaN,OAXI,IAAQ,GACV,EAAO,KAAO,EAAY,KAAQ,EAAK,MAAS,EAAY,KAC5D,EAAO,IAAO,EAAY,IAAQ,EAAK,OAAS,EAAY,IAE5D,EAAO,MAAS,EAAY,MAAU,EAAK,OAAU,EAAI,EAAY,OACrE,EAAO,OAAS,EAAY,OAAU,EAAK,QAAU,EAAI,EAAY,SAGrE,EAAO,KAAO,EAAO,IAAM,EAAO,MAAQ,EAAO,OAAS,EAGrD,GAGT,IAAK,SAAA,GAAwD,GAA5C,GAA4C,EAA5C,WAAY,EAAgC,EAAhC,YAAa,EAAmB,EAAnB,OAAQ,EAAW,EAAX,OAChD,KAAK,EAAW,MAAO,EAEvB,IAAM,GAAO,EAAO,aACd,EAAG,EAAO,EAAG,EAAG,EAAO,GACzB,EAAM,UAAW,GAEf,EAAc,EAAmB,EAAQ,YAAa,EAAa,EAEzE,KAAK,EAAe,MAAO,EAE3B,GAAO,GAAK,EACZ,EAAO,GAAK,EACZ,EAAO,QAAS,CAEhB,IAAM,GAAO,EACT,EAAY,EAAK,EACjB,EAAY,EAAK,EAEf,EAAS,EAAY,gBAAgB,QAKvC,MAAO,IAAe,KAAO,IAC/B,EAAY,KAAK,IAAI,KAAK,IAAI,EAAK,EAAI,EAAK,MAAS,EAAO,MAAQ,EAAK,GAAI,EAAK,EAAI,EAAO,MAC7F,EAAY,KAAK,IAAI,KAAK,IAAI,EAAK,EAAI,EAAK,OAAS,EAAO,OAAQ,EAAK,GAAI,EAAK,EAAI,EAAO,OAG7F,EAAY,KAAK,IAAI,KAAK,IAAI,EAAK,MAAS,EAAO,MAAQ,EAAK,GAAI,EAAK,KAAO,EAAO,MACvF,EAAY,KAAK,IAAI,KAAK,IAAI,EAAK,OAAS,EAAO,OAAQ,EAAK,GAAI,EAAK,IAAO,EAAO,MAGzF,EAAO,GAAK,EAAY,EAAK,EAC7B,EAAO,GAAK,EAAY,EAAK,EAE7B,EAAO,QAAU,EAAO,YAAc,GAAa,EAAO,YAAc,EACxE,EAAO,UAAY,EAAO,KAAM,EAAO,IAEvC,EAAO,UAAY,EACnB,EAAO,UAAY,GAGrB,aAAc,SAAA,GAAoD,GAAxC,GAAwC,EAAxC,KAAM,EAAkC,EAAlC,OAAQ,EAA0B,EAA1B,OAAQ,EAAkB,EAAlB,MAAO,EAAW,EAAX,QAC/C,EAAc,GAAW,EAAQ,WAEvC,IAAI,GAAW,EAAQ,UACJ,UAAV,IAAqB,IAAe,EAAO,SAE9C,EAAO,OAMT,MALA,GAAK,GAAK,EAAO,GACjB,EAAK,GAAK,EAAO,GACjB,EAAO,GAAK,EAAO,GACnB,EAAO,GAAK,EAAO,IAGjB,GAAI,EAAO,GACX,GAAI,EAAO,KAMnB,mBAAA,EAWF,GAAU,SAAW,EACrB,EAAU,MAAM,KAAK,YAErB,EAAe,UAAU,SAAW,EAAS,SAE7C,EAAO,QAAU,wFClGjB,IAAM,GAAiB,EAAQ,WACzB,EAAiB,EAAQ,YACzB,EAAiB,EAAQ,iBACzB,EAAiB,EAAQ,qBACzB,EAAiB,EAAQ,uBAEA,EAAQ,cAA/B,IAAA,mBAEF,GAAY,IAAM,EAAA,EAAU,KAAO,EAAA,EAAU,QAAS,EAAA,EAAU,OAAQ,EAAA,GACxE,GAAY,KAAM,EAAA,EAAU,MAAO,EAAA,EAAU,OAAS,EAAA,EAAU,MAAQ,EAAA,GAExE,GACJ,UACE,SAAS,EACT,SAAS,EACT,IAAK,KACL,IAAK,KACL,OAAQ,MAGV,UAAW,SAAA,GAAiD,GAArC,GAAqC,EAArC,YAAa,EAAwB,EAAxB,YAAa,EAAW,EAAX,OAC/C,KAAK,EACH,MAAO,GAAM,UAAW,EAG1B,IAAM,GAAS,EAAmB,EAAQ,OAAQ,EAAa,EAAY,YAAY,KAEvF,OAAI,IAEA,IAAQ,EAAY,IAAS,EAAO,EACpC,KAAQ,EAAY,KAAS,EAAO,EACpC,OAAQ,EAAY,OAAS,EAAO,EACpC,MAAQ,EAAY,MAAS,EAAO,GAIjC,GAGT,IAAK,SAAA,GAAgE,GAApD,GAAoD,EAApD,WAAY,EAAwC,EAAxC,YAAa,EAA2B,EAA3B,OAAQ,EAAmB,EAAnB,OAAQ,EAAW,EAAX,QAClD,EAAQ,EAAY,SAAS,aAAe,EAAY,SAAS,KAEvE,IAAK,EAAY,eAAkB,EAAnC,CAIA,GAAM,GAAO,EAAO,aACd,EAAG,EAAO,EAAG,EAAG,EAAO,GACzB,EAAM,UAAW,GACf,EAAQ,EAAU,WAAW,EAAmB,EAAQ,MAAO,EAAa,KAAU,EACtF,EAAQ,EAAU,WAAW,EAAmB,EAAQ,MAAO,EAAa,KAAU,EAExF,EAAY,EAAK,EACjB,EAAY,EAAK,CAErB,GAAO,GAAK,EACZ,EAAO,GAAK,EACZ,EAAO,QAAS,EAEZ,EAAM,IACR,EAAY,KAAK,IAAI,KAAK,IAAI,EAAM,IAAS,EAAO,IAAQ,EAAK,GAAI,EAAM,IAAS,EAAO,KAEpF,EAAM,SACb,EAAY,KAAK,IAAI,KAAK,IAAI,EAAM,OAAS,EAAO,OAAQ,EAAK,GAAI,EAAM,OAAS,EAAO,SAEzF,EAAM,KACR,EAAY,KAAK,IAAI,KAAK,IAAI,EAAM,KAAS,EAAO,KAAQ,EAAK,GAAI,EAAM,KAAS,EAAO,MAEpF,EAAM,QACb,EAAY,KAAK,IAAI,KAAK,IAAI,EAAM,MAAS,EAAO,MAAQ,EAAK,GAAI,EAAM,MAAS,EAAO,QAG7F,EAAO,GAAK,EAAY,EAAK,EAC7B,EAAO,GAAK,EAAY,EAAK,EAE7B,EAAO,QAAU,EAAO,YAAc,GAAa,EAAO,YAAc,EACxE,EAAO,UAAY,EAAO,KAAM,EAAO,IAEvC,EAAO,UAAY,EACnB,EAAO,UAAY,IAGrB,aAAc,SAAA,GAAoD,GAAxC,GAAwC,EAAxC,KAAM,EAAkC,EAAlC,OAAQ,EAA0B,EAA1B,OAAQ,EAAkB,EAAlB,MAAO,EAAW,EAAX,OACrD,IAAI,GAAW,EAAQ,UACJ,UAAV,IAAqB,EAAO,SAE/B,EAAO,OAMT,MALA,GAAK,GAAK,EAAO,GACjB,EAAK,GAAK,EAAO,GACjB,EAAO,GAAK,EAAO,GACnB,EAAO,GAAK,EAAO,IAGjB,GAAI,EAAO,GACX,GAAI,EAAO,KAMnB,QAAA,EACA,QAAA,EACA,mBAAA,EAGF,GAAU,cAAgB,EAC1B,EAAU,MAAM,KAAK,iBAErB,EAAe,UAAU,cAAgB,EAAc,SACvD,EAAO,SAAS,cAAyB,EAAc,SAEvD,EAAO,QAAU,kJC/GjB,IAAM,GAAiB,EAAQ,WACzB,EAAiB,EAAQ,mBACzB,EAAiB,EAAQ,YACzB,EAAiB,EAAQ,iBACzB,EAAiB,EAAQ,qBACzB,EAAiB,EAAQ,qBAEzB,GAAU,OAAQ,EAAA,EAAU,QAAS,EAAA,GACrC,GAAU,MAAQ,EAAA,EAAU,OAAS,EAAA,GAErC,GACJ,UACE,SAAS,EACT,SAAS,EACT,IAAK,KACL,IAAK,MAGP,UAAW,SAAA,GACT,MADoC,GAAf,YACF,aAGrB,IAAK,SAAU,GAAK,GACV,GAAyB,EAAzB,YAAa,EAAY,EAAZ,QACf,EAAQ,EAAY,SAAS,aAAe,EAAY,SAAS,KAEvE,IAAK,EAAY,eAAkB,EAAnC,CAIA,GAAM,GAAO,EAAU,WAAW,EAAY,YAAY,UAEpD,EAAU,EAAU,WAAW,EAAc,mBAAmB,EAAQ,IAAK,KAAiB,EAC9F,EAAU,EAAU,WAAW,EAAc,mBAAmB,EAAQ,IAAK,KAAiB,CAEpG,GAAI,SACF,QAAS,EAAQ,QACjB,QAAS,EAAQ,QACjB,MAAO,EAAM,UAAW,EAAc,SACtC,MAAO,EAAM,UAAW,EAAc,UAGpC,EAAM,KACR,EAAI,QAAQ,MAAM,IAAM,EAAK,OAAS,EAAQ,OAC9C,EAAI,QAAQ,MAAM,IAAM,EAAK,OAAS,EAAQ,QAEvC,EAAM,SACb,EAAI,QAAQ,MAAM,OAAS,EAAK,IAAM,EAAQ,OAC9C,EAAI,QAAQ,MAAM,OAAS,EAAK,IAAM,EAAQ,QAE5C,EAAM,MACR,EAAI,QAAQ,MAAM,KAAO,EAAK,MAAQ,EAAQ,MAC9C,EAAI,QAAQ,MAAM,KAAO,EAAK,MAAQ,EAAQ,OAEvC,EAAM,QACb,EAAI,QAAQ,MAAM,MAAQ,EAAK,KAAO,EAAQ,MAC9C,EAAI,QAAQ,MAAM,MAAQ,EAAK,KAAO,EAAQ,OAGhD,EAAc,IAAI,KAGpB,aAAc,EAAc,aAG9B,GAAU,aAAe,EACzB,EAAU,MAAM,KAAK,gBAErB,EAAe,UAAU,aAAe,EAAa,SACrD,EAAO,SAAS,aAAwB,EAAa,SAErD,EAAO,QAAU,uJClFjB,IAAM,GAAiB,EAAQ,WACzB,EAAiB,EAAQ,eACzB,EAAiB,EAAQ,YACzB,EAAiB,EAAQ,qBAEzB,GACJ,UACE,SAAS,EACT,SAAS,EACT,MAAS,EAAA,EACT,QAAS,KACT,QAAS,KAET,eAAgB,MAGlB,UAAW,SAAA,GAA8E,GAAlE,GAAkE,EAAlE,YAAa,EAAqD,EAArD,aAAc,EAAuC,EAAvC,QAAS,EAA8B,EAA9B,KAAM,EAAwB,EAAxB,YAAa,EAAW,EAAX,QACtE,KACA,EAAgB,EAAM,SAAS,EAAM,gBAAgB,EAAQ,SAC7D,EAAS,GAAiB,EAAM,YAAY,EAAc,EAAS,EAAY,SAAS,KAC9F,GAAU,GAAW,EAAa,QAAQ,EAAY,SAAS,MAAM,QAErE,IAAI,OAAA,EAEJ,IAAuB,gBAAnB,EAAQ,OACV,GACE,EAAG,EAAY,YAAY,KAAK,EAAI,EAAO,EAC3C,EAAG,EAAY,YAAY,KAAK,EAAI,EAAO,OAGzC,CACJ,GAAM,GAAa,EAAM,gBAAgB,EAAQ,OAAQ,EAAc,GAAU,GAEjF,GAAa,EAAM,SAAS,KAAiB,EAAG,EAAG,EAAG,GAGxD,GAAI,GAAQ,EAAQ,gBAAkB,EAAQ,eAAe,OAC3D,IAAA,GAAA,GAA6C,EAAQ,eAArD,EAAA,MAAA,QAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,OAAA,cAAqE,CAAA,GAAA,EAAA,IAAA,EAAA,CAAA,GAAA,GAAA,EAAA,OAAA,KAAA,GAAA,EAAA,SAAA,CAAA,GAAA,EAAA,EAAA,OAAA,EAAA,KAAA,KAAA,GAAA,EAAA,MAAA,GAAA,GAAA,EAArD,EAAqD,EAAxD,EAAiB,EAAuC,EAA1C,CACzB,GAAQ,MACN,EAAG,EAAY,KAAQ,EAAK,MAAS,EAAa,EAAW,EAC7D,EAAG,EAAY,IAAQ,EAAK,OAAS,EAAa,EAAW,QAKjE,GAAQ,KAAK,EAGf,OAAO,IAGT,IAAK,SAAA,GAAyE,GAA7D,GAA6D,EAA7D,YAAa,EAAgD,EAAhD,WAAY,EAAoC,EAApC,OAAQ,EAA4B,EAA5B,QAAiB,EAAW,EAAnB,OACnD,KACF,MAAA,GACA,MAAA,GACA,MAAA,EAEJ,IAAI,EAAO,YACT,GAAS,EAAG,EAAO,EAAG,EAAG,EAAO,OAE7B,CACH,GAAM,GAAS,EAAM,YAAY,EAAY,OAAQ,EAAY,QAAS,EAAY,SAAS,KAE/F,GAAO,EAAM,UAAW,GAExB,EAAK,GAAK,EAAO,EACjB,EAAK,GAAK,EAAO,EAGnB,EAAO,MAAQ,EAAK,EACpB,EAAO,MAAQ,EAAK,CAIpB,KAAA,GAFI,GAAM,EAAQ,QAAS,EAAQ,QAAQ,OAAS,EAEpD,EAAyC,EAAzC,EAAA,MAAA,QAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,OAAA,cAAkD,CAAA,GAAA,EAAA,IAAA,EAAA,CAAA,GAAA,GAAA,EAAA,OAAA,KAAA,GAAA,EAAA,SAAA,CAAA,GAAA,EAAA,EAAA,OAAA,EAAA,KAAA,KAAA,GAAA,EAAA,MAIhD,IAAA,GAJgD,GAAA,EAAlC,EAAkC,EAArC,EAAe,EAAsB,EAAzB,EACjB,EAAY,EAAK,EAAI,EACrB,EAAY,EAAK,EAAI,EAE3B,EAAyB,EAAQ,QAAjC,EAAA,MAAA,QAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,OAAA,cAA0C,CAAA,GAAA,EAAA,IAAA,EAAA,CAAA,GAAA,GAAA,EAAA,OAAA,KAAA,GAAA,EAAA,SAAA,CAAA,GAAA,EAAA,EAAA,OAAA,EAAA,KAAA,KAAA,GAAA,EAAA,MAAA,GAA/B,GAA+B,CAEtC,GADE,EAAM,GAAG,SAAS,GACX,EAAW,EAAW,EAAW,GAGjC,EAGN,GAEL,EAAQ,MACN,EAAG,EAAM,GAAG,OAAO,EAAO,GAAM,EAAO,EAAI,EAAW,EACtD,EAAG,EAAM,GAAG,OAAO,EAAO,GAAM,EAAO,EAAI,EAAW,EAEtD,MAAO,EAAM,GAAG,OAAO,EAAO,OAAQ,EAAO,MAAO,EAAQ,SAKlE,GAAM,IACJ,OAAQ,KACR,SAAS,EACT,SAAU,EACV,MAAO,EACP,GAAI,EACJ,GAAI,EAGN,KAAK,EAAI,EAAG,EAAM,EAAQ,OAAQ,EAAI,EAAK,IAAK,CAC9C,EAAS,EAAQ,EAEjB,IAAM,GAAQ,EAAO,MACf,EAAK,EAAO,EAAI,EAAK,EACrB,EAAK,EAAO,EAAI,EAAK,EACrB,EAAW,EAAM,MAAM,EAAI,GAC7B,EAAU,GAAY,CAItB,KAAU,EAAA,GAAY,EAAQ,SAAW,EAAQ,QAAU,EAAA,IAC7D,GAAU,GAGP,EAAQ,UAAW,EAEjB,EAAQ,SAAW,IAAU,EAAA,EAE9B,EAAW,EAAQ,EAAQ,SAAW,EAAQ,MAE7C,IAAU,EAAA,GAAY,EAAQ,QAAU,EAAA,GAE1C,EAAW,EAAQ,UAEhB,EAAQ,SAAW,EAAW,EAAQ,YAE5C,EAAQ,OAAS,EACjB,EAAQ,SAAW,EACnB,EAAQ,MAAQ,EAChB,EAAQ,QAAU,EAClB,EAAQ,GAAK,EACb,EAAQ,GAAK,EAEb,EAAO,MAAQ,GAInB,GAAI,OAAA,EAEA,GAAQ,QACV,EAAe,EAAO,YAAc,EAAQ,OAAO,GAAK,EAAO,YAAc,EAAQ,OAAO,EAE5F,EAAO,UAAY,EAAQ,OAAO,EAClC,EAAO,UAAY,EAAQ,OAAO,IAGlC,GAAc,EAEd,EAAO,UAAY,IACnB,EAAO,UAAY,KAGrB,EAAO,GAAK,EAAQ,GACpB,EAAO,GAAK,EAAQ,GAEpB,EAAO,QAAW,GAAgB,EAAQ,UAAY,EAAO,OAC7D,EAAO,OAAS,EAAQ,SAG1B,aAAc,SAAA,GAAoD,GAAxC,GAAwC,EAAxC,KAAM,EAAkC,EAAlC,OAAQ,EAA0B,EAA1B,OAAQ,EAAkB,EAAlB,MAAO,EAAW,EAAX,QAC/C,EAAiB,GAAW,EAAQ,cAE1C,IAAI,GAAW,EAAQ,UACJ,UAAV,IAAqB,IAAkB,EAAe,QAS7D,MAPI,GAAO,SACT,EAAK,GAAK,EAAO,GACjB,EAAK,GAAK,EAAO,GACjB,EAAO,GAAK,EAAO,GACnB,EAAO,GAAK,EAAO,KAInB,MAAS,EAAO,MAChB,OAAS,EAAO,OAChB,EAAS,EAAO,UAChB,EAAS,EAAO,UAChB,MAAS,EAAO,MAChB,MAAS,EAAO,MAChB,GAAS,EAAO,GAChB,GAAS,EAAO,KAMxB,GAAS,eAAiB,SAAU,GAClC,MAAO,UAAU,EAAG,GAClB,GAAM,GAAS,EAAK,SAClB,MAAS,EAAA,EACT,MAAS,EAAA,EACT,KAAS,EAAA,EACT,OAAS,EAAA,GAEP,EAAU,EACV,EAAU,CAEV,GAAM,GAAG,OAAO,EAAK,UACvB,EAAU,EAAK,OAAO,EACtB,EAAU,EAAK,OAAO,EAGxB,IAAM,GAAQ,KAAK,OAAO,EAAI,GAAW,EAAK,GACxC,EAAQ,KAAK,OAAO,EAAI,GAAW,EAAK,EAK9C,QACE,EAJW,KAAK,IAAI,EAAO,KAAM,KAAK,IAAI,EAAO,MAAQ,EAAQ,EAAK,EAAI,IAK1E,EAJW,KAAK,IAAI,EAAO,IAAM,KAAK,IAAI,EAAO,OAAQ,EAAQ,EAAK,EAAI,IAK1E,MAAO,EAAK,SAKlB,EAAU,KAAO,EACjB,EAAU,MAAM,KAAK,QAErB,EAAe,UAAU,KAAO,EAAK,SAErC,EAAO,QAAU,yGCjOjB,IAAM,GAAiB,EAAQ,WACzB,EAAiB,EAAQ,UACzB,EAAiB,EAAQ,qBACzB,EAAiB,EAAQ,qBACzB,EAAiB,EAAQ,aAEzB,GACJ,UACE,SAAS,EACT,SAAS,EACT,MAAS,EAAA,EACT,QAAS,KACT,QAAS,MAGX,UAAW,SAAU,GAAK,GAChB,GAAyB,EAAzB,YAAa,EAAY,EAAZ,QACf,EAAQ,EAAY,SAAS,KAEnC,IAAK,EAAL,CAEA,EAAI,SACF,iBACE,EAAG,EAAM,KAAM,EAAI,EACnB,EAAG,EAAM,IAAM,EAAI,IAErB,QAAU,EAAG,EAAG,EAAG,GACnB,OAAQ,OACR,MAAO,EAAQ,MAGjB,IAAM,GAAU,EAAK,UAAU,EAG/B,OAFA,GAAI,QAAU,EAEP,IAGT,IAAK,SAAU,GAAK,GACV,GAA6C,EAA7C,YAAa,EAAgC,EAAhC,QAAS,EAAuB,EAAvB,OAAQ,EAAe,EAAf,WAChC,EAAO,EAAM,UAAW,GACxB,EAAY,EAAK,EAAI,EAAO,GAAG,EAC/B,EAAY,EAAK,EAAI,EAAO,GAAG,CAErC,GAAI,QAAU,EAAM,UAAW,GAC/B,EAAI,QAAQ,UAEZ,KAAA,GAAA,GAAyB,EAAQ,QAAjC,EAAA,MAAA,QAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,OAAA,cAA0C,CAAA,GAAA,EAAA,IAAA,EAAA,CAAA,GAAA,GAAA,EAAA,OAAA,KAAA,GAAA,EAAA,SAAA,CAAA,GAAA,EAAA,EAAA,OAAA,EAAA,KAAA,KAAA,GAAA,EAAA,MAAA,GAA/B,GAA+B,EACpC,MAAA,EAGF,GADE,EAAM,GAAG,SAAS,GACX,EAAW,EAAW,EAAW,GAGjC,EAGN,IAED,SAAW,IAAU,UAAY,KACnC,EAAO,EAAI,EAAO,MAClB,EAAO,EAAI,EAAO;cAGpB,EAAI,QAAQ,QAAQ,KAAK,IAG3B,EAAK,IAAI,IAGX,aAAc,SAAU,GAAK,GACnB,GAAY,EAAZ,OAER,GAAI,QAAU,EAAM,UAAW,GAC/B,EAAI,QAAQ,QAAU,EAAQ,QAC9B,EAAI,QAAQ,gBAAkB,MAE9B,EAAK,aAAa,IAItB,GAAU,SAAW,EACrB,EAAU,MAAM,KAAK,YAErB,EAAe,UAAU,SAAW,EAAS,SAC7C,EAAO,SAAS,SAAoB,EAAS,SAE7C,EAAO,QAAU,2NCzFjB,GAAM,GAAe,EAAQ,wBAE7B,GAAO,QAAP,WACE,QAAA,GAAa,EAAM,EAAS,EAAO,EAAa,GAiB9C,GAjB2D,EAAA,KAAA,GAC3D,EAAa,cAAc,KAAM,GAE7B,IAAU,GACZ,EAAa,cAAc,KAAM,GAGnC,KAAK,YAAc,EAEnB,KAAK,WAAgB,GAAI,OAAO,UAChC,KAAK,cAAgB,EACrB,KAAK,KAAgB,EACrB,KAAK,UAAgB,EAAa,aAAa,GAC/C,KAAK,YAAgB,EAAa,eAAe,GACjD,KAAK,OAAgB,EACrB,KAAK,cAAgB,KAER,QAAT,EAAgB,CAClB,GAAM,GAAe,EAAY,gBAAgB,EACjD,MAAK,GAAK,KAAK,UAAY,EAAY,UAAU,EAEjD,IAAM,GAAW,KAAK,UAAY,EAAY,OAE9C,MAAK,UAAY,EAAY,SACK,cAA7B,EAAY,QAAQ,MACpB,EAAY,QAAQ,SAAW,KAAK,QACpC,EAAW,SAEA,cAAT,IACP,KAAK,GAAK,EAAQ,UAAY,EAAY,SA9BhD,MAAA,GAAA,UAkCE,eAlCF,SAAA,GAkC8C,GAAvB,GAAuB,EAA1B,EAAe,EAAW,EAAd,CAM5B,OALA,MAAK,OAAW,EAChB,KAAK,OAAW,EAChB,KAAK,SAAW,EAChB,KAAK,SAAW,EAET,MAxCX,EAAA,UA2CE,UA3CF,SAAA,GA2CyC,GAAvB,GAAuB,EAA1B,EAAe,EAAW,EAAd,CAMvB,OALA,MAAK,OAAW,EAChB,KAAK,OAAW,EAChB,KAAK,SAAW,EAChB,KAAK,SAAW,EAET,MAjDX,EAAA,UAoDE,eApDF,WAqDI,KAAK,cAAc,kBArDvB,EAAA,UAwDE,gBAxDF,WAyDI,KAAK,oBAAqB,GAzD9B,EAAA,UA4DE,yBA5DF,WA6DI,KAAK,4BAA8B,KAAK,oBAAqB,GA7DjE,oEC+BA,SAAS,GAAM,GAkBb,IAAK,GAhBH,GAIE,EAJF,YAAa,EAIX,EAJW,QAAS,EAIpB,EAJoB,MAAO,EAI3B,EAJ2B,YAFb,EAMd,EAHF,KAAA,MAHgB,KAAA,EAGT,EAAI,aAAa,KAHR,EAAA,EAMd,EAFF,QAAA,MAJgB,KAAA,EAIN,EAAoB,GAJd,EAAA,EAMd,EADF,aAAA,MALgB,KAAA,EAKD,GAAI,GAAa,EAAM,EAAS,EAAO,EAAa,GALnD,EAQZ,GACJ,YAAA,EACA,QAAA,EACA,MAAA,EACA,YAAA,EACA,QAAA,EACA,KAAA,EACA,aAAA,GAGO,EAAI,EAAG,EAAI,EAAQ,OAAQ,IAAK,CACvC,GAAM,GAAS,EAAQ,EAEvB,KAAK,GAAM,KAAQ,GAAO,UACxB,EAAa,GAAQ,EAAO,MAAM,EAGpC,IAAM,GAAS,EAAM,YAAY,EAAO,UAAW,EAAO,QAU1D,IARA,EAAa,eAAe,GAC5B,EAAa,UAAY,EAAO,UAChC,EAAa,cAAgB,EAAO,QAEpC,EAAO,UAAU,KAAK,GAEtB,EAAa,UAAU,GAEnB,EAAa,6BACT,EAAa,oBACT,EAAI,EAAK,EAAQ,QAAU,EAAQ,EAAI,GAAG,UAAY,EAAa,cAC7E,MAMJ,GAFA,EAAQ,KAAK,QAAS,GAET,QAAT,EAAgB,CAGlB,GAAM,GAAU,EAAa,OACzB,GACA,YAAA,EAAa,QAAA,EAAS,MAAA,EAAO,YAAA,EAC7B,KAAM,cAEN,CAEJ,GAAY,QAAU,EACtB,EAAY,QAAU,EAAQ,UAGhC,MAAO,GAGT,QAAS,GAAT,GAAkF,GAAlD,GAAkD,EAAlD,YAAa,EAAqC,EAArC,QAAS,EAA4B,EAA5B,MAAO,EAAqB,EAArB,YAAa,EAAQ,EAAR,KAClE,EAAe,EAAY,gBAAgB,EAGjD,IAAa,QAAT,IAAmB,EAAY,kBAE1B,EAAY,YAAY,IAAiB,EAAY,YAAY,KAAkB,GAC1F,QAeF,KAAA,GAZM,GAAO,EAAM,QAAQ,GACrB,GACJ,YAAA,EACA,QAAA,EACA,MAAA,EACA,YAAA,EACA,KAAA,EACA,KAAA,EACA,WACA,QAAS,MAGX,EAAsB,EAAtB,EAAA,MAAA,QAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,OAAA,cAA4B,CAAA,GAAA,EAAA,IAAA,EAAA,CAAA,GAAA,GAAA,EAAA,OAAA,KAAA,GAAA,EAAA,SAAA,CAAA,GAAA,EAAA,EAAA,OAAA,EAAA,KAAA,KAAA,GAAA,EAAA,MAAA,GAAjB,GAAiB,CAC1B,GAAU,QAAU,EAEpB,EAAQ,KAAK,kBAAmB,GAQlC,MALa,SAAT,IACF,EAAU,QAAU,EAAO,EAAU,QAAS,SAAA,GAAA,MAC5C,GAAO,UAAU,QAAQ,eAAiB,EAAY,WAAW,GAAc,YAG5E,EAAU,QA/HnB,GAAM,GAAe,EAAQ,kBACvB,EAAe,EAAQ,kBACvB,EAAe,EAAQ,YACvB,EAAe,EAAQ,oBACvB,EAAe,EAAQ,qBACvB,EAAe,EAAQ,oBAAoB,QAC5B,EAAQ,gBAArB,IAAA,OAEF,GAAkB,OAAQ,KAAM,UAChC,GAAkB,OAAQ,KAAM,UAEhC,GACJ,aAAA,EACA,KAAA,EACA,oBAAA,EACA,QAAA,EACA,UACE,aAAc,IACd,WAAc,KACd,UAAc,KACd,QAAgB,EAAG,EAAG,EAAG,IAE3B,OACE,OACA,OACA,KACA,SACA,MACA,YACA,QAqGJ,GAAY,QAAQ,GAAG,sBAAuB,SAAA,GAAyC,GAA7B,GAA6B,EAA7B,YAAa,EAAgB,EAAhB,YACrE,GAAY,WAAW,IAAkB,SAAU,EAAA,EAAU,QAAS,QAGxE,EAAY,QAAQ,GAAG,iBAAkB,SAAA,GAAyC,GAA7B,GAA6B,EAA7B,YAAa,EAAgB,EAAhB,YAChE,GAAY,WAAW,OAAO,EAAc,KAG9C,EAAY,QAAQ,GAAG,OAAQ,SAAA,GAAuE,GAA3D,GAA2D,EAA3D,YAAa,EAA8C,EAA9C,QAAS,EAAqC,EAArC,MAAO,EAA8B,EAA9B,YAAa,EAAiB,EAAjB,cAC7E,EAAe,EAAY,gBAAgB,EAE5C,IAAmB,EAAY,gBAAiB,EAAY,kBAC3D,EAAY,eACd,aAAa,EAAY,WAAW,GAAc,SAGpD,GACE,YAAA,EAAa,QAAA,EAAS,MAAA,EAAO,YAAA,EAC7B,KAAM,YAKZ,EAAY,QAAQ,GAAG,OAAQ,SAAA,GAiB7B,IAAA,GAjByC,GAA0D,EAA1D,YAAa,EAA6C,EAA7C,QAAS,EAAoC,EAApC,MAAO,EAA6B,EAA7B,YAAa,EAAgB,EAAhB,aAE7E,EAAY,EAAQ,MAAO,EAAM,UAAW,GAAS,EAErD,EAAQ,EAAY,WAAW,GAC/B,EAAO,EAAM,QAAQ,GACrB,GACJ,YAAA,EACA,QAAA,EACA,MAAA,EACA,YAAA,EACA,KAAM,OACN,WACA,KAAA,EACA,QAAS,MAGX,EAAsB,EAAtB,EAAA,MAAA,QAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,OAAA,cAA4B,CAAA,GAAA,EAAA,IAAA,EAAA,CAAA,GAAA,GAAA,EAAA,OAAA,KAAA,GAAA,EAAA,SAAA,CAAA,GAAA,EAAA,EAAA,OAAA,EAAA,KAAA,KAAA,GAAA,EAAA,MAAA,GAAjB,GAAiB,CAC1B,GAAU,QAAU,EAEpB,EAAQ,KAAK,kBAAmB,GAGlC,GAAK,EAAU,QAAQ,OAAvB,CAIA,IAAK,GAFD,GAAc,EAAA,EAET,EAAI,EAAG,EAAI,EAAU,QAAQ,OAAQ,IAAK,CACjD,GAAM,GAAS,EAAU,QAAQ,GAC3B,EAAe,EAAO,UAAU,QAAQ,YAE1C,GAAe,IACjB,EAAc,GAIlB,EAAM,SAAW,EACjB,EAAM,QAAU,WAAW,WACzB,GACE,YAAA,EACA,YAAA,EACA,QAAS,EAAQ,MAAO,EAAY,EACpC,MAAO,EACP,KAAM,UAEP,MAGL,EAAY,QAAQ,GAAG,KAAM,SAAA,GAAkD,GAA/C,GAA+C,EAA/C,YAAa,EAAkC,EAAlC,QAAS,EAAyB,EAAzB,MAAO,EAAkB,EAAlB,WACtD,GAAY,iBACf,GAAO,YAAA,EAAa,YAAA,EAAa,QAAA,EAAS,MAAA,EAAO,KAAM,WAI1D,KAAM,UAAU,QAAQ,SAAU,GACjC,EAAY,QAAQ,GAAG,EAAY,SAAA,GAAyC,GAA7B,GAA6B,EAA7B,YAAa,EAAgB,EAAhB,YACtD,GAAY,WAAW,IACzB,aAAa,EAAY,WAAW,GAAc,YAWxD,KAAK,GAAI,GAAI,EAAG,EAAI,EAAc,OAAQ,IACxC,EAAY,QAAQ,GAAG,EAAc,GAPvC,SAA+B,GAC7B,MAAO,UAAA,GAAwD,GAA5C,GAA4C,EAA5C,YAAa,EAA+B,EAA/B,QAAS,EAAsB,EAAtB,KACvC,IAAO,YAAA,EAAa,YADyC,EAAf,YACb,QAAA,EAAS,MAAA,EAAO,KAAA,MAKW,EAAa,IAG7E,GAAY,QAAQ,GAAG,MAAO,SAAU,GACtC,EAAY,QAAa,KACzB,EAAY,QAAa,EACzB,EAAY,gBAGd,EAAS,cAAgB,EAAc,SACvC,EAAO,QAAU,gLC9NjB,SAAS,GAAT,GAAkC,GAAhB,GAAgB,EAAhB,YACU,UAAtB,EAAa,OAEjB,EAAa,OAAS,EAAa,OAAS,GAAK,GAGnD,QAAS,GAAT,GAAuE,GAAnD,GAAmD,EAAnD,YAAa,EAAsC,EAAtC,aAAc,EAAwB,EAAxB,YAAa,EAAW,EAAX,OAC1D,IAA0B,SAAtB,EAAa,MAAoB,EAAQ,OAA7C,CAGA,GAAM,GAAW,EAAQ,GAAG,UAAU,QAAQ,kBAG1C,IAAY,IAGhB,EAAY,mBAAqB,WAAW,WAC1C,EAAc,MACZ,YAAA,EACA,YAAA,EACA,KAAM,OACN,QAAS,EACT,MAAO,KAER,KAGL,QAAS,GAAT,GAAyC,GAAf,GAAe,EAAf,WAGpB,GAAY,qBACd,cAAc,EAAY,oBAC1B,EAAY,mBAAqB,MA1CrC,GAAM,GAAgB,EAAQ,UACxB,EAAgB,EAAQ,iBAE9B,GAAc,QAAQ,GAAG,MAAO,GAChC,EAAc,QAAQ,GAAG,QAAS,EAElC,KAAA,OAAsB,OAAQ,KAAM,SAAU,UAA9C,EAAA,EAAA,EAAA,EAAA,OAAA,IAAyD,CAApD,GAAM,GAAA,EAAA,EACT,GAAY,QAAQ,GAAG,EAAQ,GAwCjC,EAAc,SAAS,mBAAqB,EAC5C,EAAc,MAAM,KAAK,cAEzB,EAAO,SACL,MAAA,EACA,QAAA,EACA,cAAA,sECrDF,IAAM,GAAgB,EAAQ,UACxB,EAAgB,EAAQ,mBACxB,EAAgB,EAAQ,oBACxB,EAAgB,EAAQ,eACxB,EAAgB,EAAQ,qBACxB,EAAgB,EAAQ,YACxB,EAAgB,EAAQ,qBACR,EAAQ,gBAAtB,IAAA,KAER,GAAc,QAAQ,GAAG,kBAAmB,SAAA,GAC1C,QAAS,GAAkB,EAAc,EAAU,GACjD,GAAM,GAAM,EAAQ,2BACd,EAAQ,iBAAiB,OACzB,GAEA,EAAY,EAAa,OACzB,EAAU,EAAU,OAEtB,GAAU,IACP,EAAG,QAAQ,IACX,EAAS,gBAAgB,EAAS,EAAU,IAC5C,EAAa,gBAAgB,EAAS,EAAS,IAEpD,EAAQ,MACN,QAAA,EACA,UAAA,EACA,OAAS,aAAA,KAjB8E,GAAvC,GAAuC,EAAvC,QAAS,EAA8B,EAA9B,QAAS,EAAqB,EAArB,KAAM,EAAe,EAAf,YAsBxE,EAAe,EAAM,cAAc,IAAI,EAE7C,IAAI,EAAc,CAChB,GAAM,GAAY,EAAa,OACzB,EAAU,EAAU,OAEtB,GAAU,IACP,EAAa,gBAAgB,EAAS,EAAS,IACpD,EAAQ,MACN,QAAA,EACA,UAAA,EACA,OAAS,aAAA,KAKf,EAAM,cAAc,gBAAgB,EAAkB,KAGxD,EAAa,QAAQ,GAAG,MAAO,SAAA,GAA4B,GAAhB,GAAgB,EAAhB,YACzC,GAAa,OAAO,QAAU,SAAU,GACtC,MAAO,GAAa,QAAQ,MAIhC,EAAa,QAAQ,GAAG,MAAO,SAAA,GAAqC,GAAzB,GAAyB,EAAzB,aAAc,EAAW,EAAX,OACvD,GAAO,EAAa,OAAO,QAAS,EAAc,UAClD,EAAO,EAAa,OAAO,QAAS,KAGtC,EAAM,EAAa,WAAY,EAAc,OAE7C,EAAa,UAAU,cAAgB,SAAU,GAG/C,MAFA,GAAO,KAAK,OAAO,QAAS,GAErB,KAGT,IAAM,GAAqB,EAAa,UAAU,iBAElD,GAAa,UAAU,kBAAoB,SAAU,EAAY,GAC/D,GAAM,GAAM,EAAmB,KAAK,KAAM,EAAY,EAMtD,OAJI,KAAQ,OACV,KAAK,OAAO,QAAQ,GAAc,GAG7B,GAGT,EAAa,gBAAgB,KAAK,wMCjFlC,IAAM,GAAU,EAAQ,WAClB,EAAU,EAAQ,kBAClB,EAAU,EAAQ,mBAAmB,MAErC,GACJ,QAAA,EACA,OAAA,EACA,MAAA,EAGA,SAAU,EAAQ,sBAAsB,SAExC,aAEA,YAAa,SAAU,EAAK,GAE1B,GAAI,EAAM,SAAS,EAAM,UAAW,GAAQ,OAAO,CAEnD,GAAM,GAAO,EAAM,UAAU,GAE7B,EAAM,UAAU,KAAK,GACrB,EAAO,UAAU,KAAK,GAIlB,IAAQ,EAAM,UAChB,EAAO,IAAI,EAAK,SAAU,EAAM,gBAGlC,EAAQ,KAAK,gBAAkB,IAAA,EAAK,IAAA,KAGtC,eAAgB,SAAU,EAAK,GAC7B,GAAM,GAAQ,EAAM,QAAQ,EAAM,UAAW,EAE7C,GAAM,GAAO,EAAM,UAAU,GAE7B,EAAO,OAAO,EAAK,SAAU,EAAM,gBAEnC,EAAM,UAAU,OAAO,EAAO,GAC9B,EAAO,UAAU,OAAO,EAAO,GAE/B,EAAQ,KAAK,mBAAqB,IAAA,EAAK,IAAA,KAGzC,eAAgB,WACd,EAAM,eAAe,KAAK,SAAU,OAIxC,GAAO,QAAU,yNClDG,EAAQ,SAApB,IAAA,QAEF,aACJ,QAAA,KAAe,EAAA,KAAA,GACb,KAAK,gCAKP,YAAI,EAAM,GACR,IAAK,KAAK,UAAU,GAElB,YADA,KAAK,UAAU,IAAS,GAI1B,MAAK,UAAU,GAAM,KAAK,gBAG5B,aAAK,EAAM,GACT,GAAK,KAAK,UAAU,GAApB,CAEA,GAAM,GAAQ,EAAQ,KAAK,UAAU,GAAO,IAE7B,IAAX,GACF,KAAK,UAAU,GAAM,OAAO,EAAO,iBAIvC,cAAM,EAAM,GACV,GAAM,GAAkB,KAAK,UAAU,EAEvC,IAAK,EAEL,IAAK,GAAI,GAAI,EAAG,EAAI,EAAgB,OAAQ,IAC1C,IAAsC,IAAlC,EAAgB,GAAG,EAAK,GAC1B,YAMR,GAAQ,IAAM,WACZ,MAAO,IAAI,IAGb,EAAO,QAAU,iDC7CjB,SAAS,GAAS,EAAO,GACvB,IAAK,GAAI,GAAI,EAAG,EAAM,EAAM,OAAQ,EAAI,EAAK,IAC3C,GAAI,EAAM,KAAO,EACf,MAAO,EAIX,QAAQ,EAGV,QAAS,GAAU,EAAO,GACxB,OAAmC,IAA5B,EAAQ,EAAO,GAGxB,QAAS,GAAO,EAAQ,GACtB,IAAK,GAAI,GAAI,EAAG,EAAI,EAAO,OAAQ,IACjC,EAAO,KAAK,EAAO,GAGrB,OAAO,GAGT,QAAS,GAAQ,EAAO,GAGtB,IAAK,GAFC,MAEG,EAAI,EAAG,EAAI,EAAM,OAAQ,IAC5B,EAAK,EAAM,KACb,EAAO,KAAK,EAAM,GAItB,OAAO,GAGT,EAAO,SACL,QAAA,EACA,SAAA,EACA,MAAA,EACA,OAAA,+CCtCiB,EAAQ,YAAnB,IAAA,OACF,EAAS,EAAQ,QACjB,EAAa,EAAQ,gBAErB,EAAU,EAAW,QACrB,EAAa,EAAO,UAEpB,GAEJ,iBAAmB,gBAAkB,IAAW,EAAG,SAAS,EAAO,gBAC7C,EAAW,mBAAoB,GAAO,eAG5D,uBAAwB,EAAW,aAEnC,MAAQ,eAAiB,MAAa,oBAAsB,IAG5D,cAAsC,UAAtB,EAAU,SACnB,EAAQ,eACR,EAAU,UAAU,MAAM,UAGjC,OAAS,iBAAiB,KAAK,EAAU,WAC7B,YAAY,KAAK,EAAU,YAEvC,aAAc,aAAa,KAAK,EAAU,WAG1C,wBAAyB,WAAa,GAAQ,UAC1C,UAAW,yBAA2B,GAAQ,UAC9C,wBAAyB,sBAAwB,GAAQ,UACzD,qBAAsB,oBAAsB,GAAQ,UACpD,mBAAoB,oBAExB,4BAA4B,EAE5B,YAAc,EAAW,aACpB,EAAW,eAAiB,EAAO,gBAElC,GAAQ,cACR,KAAQ,gBACR,KAAQ,YACR,IAAQ,WACR,KAAQ,gBACR,OAAQ,oBAGR,GAAQ,YACR,KAAQ,cACR,KAAQ,cACR,IAAQ,aACR,KAAQ,cACR,OAAQ,iBAEV,KAGJ,WAAY,gBAAkB,GAAW,SAAU,aAAc,QAInE,GAAQ,4BAA8B,EAAG,SAAS,EAAQ,UAAU,EAAQ,0BAE5E,EAAO,QAAU,gFC7DjB,SAAS,MAHT,GAAM,MACA,EAAM,EAAQ,YAAY,MAIhC,GAAW,SAAqB,EAAI,SACpC,EAAW,iBAAqB,EAAI,kBAAsB,EAC1D,EAAW,WAAqB,EAAI,YAAsB,EAC1D,EAAW,cAAqB,EAAI,eAAsB,EAC1D,EAAW,mBAAqB,EAAI,oBAAsB,EAC1D,EAAW,QAAqB,EAAI,SAAsB,EAC1D,EAAW,YAAqB,EAAI,aAAsB,EAAW,QAErE,EAAW,MAAe,EAAI,MAC9B,EAAW,MAAe,EAAI,OAAS,EACvC,EAAW,aAAgB,EAAI,cAAgB,EAAI,eAEnD,EAAO,QAAU,oDCjBjB,IAAM,GAAa,EAAQ,YACrB,EAAa,EAAQ,aACrB,EAAa,EAAQ,QACrB,EAAa,EAAQ,gBAErB,GACJ,aAAc,SAAU,EAAQ,GAC9B,KAAO,GAAO,CACZ,GAAI,IAAU,EACZ,OAAO,CAGT,GAAQ,EAAM,WAGhB,OAAO,GAGT,QAAS,SAAU,EAAS,GAC1B,KAAO,EAAG,QAAQ,IAAU,CAC1B,GAAI,EAAS,gBAAgB,EAAS,GAAa,MAAO,EAE1D,GAAU,EAAS,WAAW,GAGhC,MAAO,OAGT,WAAY,SAAU,GACpB,GAAI,GAAS,EAAK,UAElB,IAAI,EAAG,QAAQ,GAAS,CAEtB,MAAQ,EAAS,EAAO,OAAS,EAAG,QAAQ,KAI5C,MAAO,GAGT,MAAO,IAIT,wBAAyB,EAAQ,2BAC7B,SAAU,EAAS,EAAU,GAC7B,EAAQ,GAAS,EAAQ,WAAW,iBAAiB,EAErD,KAAK,GAAI,GAAI,EAAG,EAAM,EAAM,OAAQ,EAAI,EAAK,IAC3C,GAAI,EAAM,KAAO,EACf,OAAO,CAIX,QAAO,GAEP,KAEJ,gBAAiB,SAAU,EAAS,EAAU,GAC5C,MAAI,GAAQ,2BACH,EAAS,wBAAwB,EAAS,EAAU,IAIzD,EAAI,SAAW,EAAI,aACrB,EAAW,EAAS,QAAQ,YAAa,MAGpC,EAAQ,EAAQ,yBAAyB,KAIlD,sBAAuB,SAAU,GAC/B,GAAI,MACA,KACA,MAAA,GACA,EAAc,EAAS,GACvB,EAAQ,EAAa,GAAI,EACzB,MAAA,GACA,MAAA,GACA,MAAA,GACA,MAAA,EAEJ,KAAK,EAAI,EAAG,EAAI,EAAS,OAAQ,IAI/B,IAHA,EAAW,EAAS,KAGH,IAAa,EAI9B,GAAK,GAQL,GAAI,EAAS,aAAe,EAAS,cAIhC,GAAI,EAAY,aAAe,EAAS,cAAxC,CAML,IAAK,EAAmB,OAEtB,IADA,EAAS,EACF,EAAO,YAAc,EAAO,aAAe,EAAO,eACvD,EAAmB,QAAQ,GAC3B,EAAS,EAAO,UAMpB,IAAI,YAAuB,GAAW,aAC/B,YAAoB,GAAW,cAC7B,YAAoB,GAAW,eAAgB,CAEtD,GAAI,IAAa,EAAY,WAC3B,QAGF,GAAS,EAAS,oBAGlB,GAAS,CAKX,KAFA,KAEO,EAAO,aAAe,EAAO,eAClC,EAAgB,QAAQ,GACxB,EAAS,EAAO,UAMlB,KAHA,EAAI,EAGG,EAAgB,IAAM,EAAgB,KAAO,EAAmB,IACrE,GAGF,IAAM,IACJ,EAAgB,EAAI,GACpB,EAAgB,GAChB,EAAmB,GAKrB,KAFA,EAAQ,EAAQ,GAAG,UAEZ,GAAO,CACZ,GAAI,IAAU,EAAQ,GAAI,CACxB,EAAc,EACd,EAAQ,EACR,IAEA,OAEG,GAAI,IAAU,EAAQ,GACzB,KAGF,GAAQ,EAAM,qBA/Dd,GAAc,EACd,EAAQ,MAbR,GAAc,EACd,EAAQ,CA8EZ,OAAO,IAGT,YAAa,SAAU,EAAS,EAAU,GACxC,KAAO,EAAG,QAAQ,IAAU,CAC1B,GAAI,EAAS,gBAAgB,EAAS,GACpC,OAAO,CAKT,KAFA,EAAU,EAAS,WAAW,MAEd,EACd,MAAO,GAAS,gBAAgB,EAAS,GAI7C,OAAO,GAGT,iBAAkB,SAAU,GAC1B,MAAQ,aAAmB,GAAW,mBAClC,EAAQ,wBACR,GAGN,YAAa,SAAU,GAErB,MADA,GAAiB,GAAkB,EAAI,QAErC,EAAG,EAAe,SAAW,EAAe,SAAS,gBAAgB,WACrE,EAAG,EAAe,SAAW,EAAe,SAAS,gBAAgB,YAIzE,qBAAsB,SAAU,GAC9B,GAAM,GAAc,YAAmB,GAAW,WAC9C,EAAQ,wBACR,EAAQ,iBAAiB,EAE7B,OAAO,KACL,KAAQ,EAAW,KACnB,MAAQ,EAAW,MACnB,IAAQ,EAAW,IACnB,OAAQ,EAAW,OACnB,MAAQ,EAAW,OAAU,EAAW,MAAS,EAAW,KAC5D,OAAQ,EAAW,QAAU,EAAW,OAAS,EAAW,MAIhE,eAAgB,SAAU,GACxB,GAAM,GAAa,EAAS,qBAAqB,EAEjD,KAAK,EAAQ,QAAU,EAAY,CACjC,GAAM,GAAS,EAAS,YAAY,EAAI,UAAU,GAElD,GAAW,MAAU,EAAO,EAC5B,EAAW,OAAU,EAAO,EAC5B,EAAW,KAAU,EAAO,EAC5B,EAAW,QAAU,EAAO,EAG9B,MAAO,IAGT,QAAS,SAAU,GAGjB,IAFA,GAAM,MAEC,GACL,EAAK,KAAK,GACV,EAAU,EAAS,WAAW,EAGhC,OAAO,IAGT,YAAa,SAAA,GACX,QAAK,EAAG,OAAO,KAGf,EAAW,SAAS,cAAc,IAC3B,IAIX,GAAO,QAAU,+FCzNjB,SAAS,GAAK,EAAS,EAAM,EAAU,GACrC,GAAM,GAAU,EAAW,GACvB,EAAe,EAAQ,EAAU,GACjC,EAAS,EAAQ,EAyBrB,IAvBK,IACH,GACE,UACA,UAAW,GAGb,EAAe,EAAS,KAAK,GAAW,EACxC,EAAQ,KAAK,GAEb,EAAkB,KAAK,GAEnB,YACA,WACA,aAEA,OAGD,EAAO,OAAO,KACjB,EAAO,OAAO,MACd,EAAO,cAGJ,EAAS,EAAO,OAAO,GAAO,GAAW,CAC5C,GAAI,OAAA,EAEJ,IAAI,EAAgB,CAAA,GAAA,GACsB,EAAkB,GAAlD,EADU,EACV,SAAU,EADA,EACA,QAAS,EADT,EACS,SACrB,EAAgB,EAAQ,EAAU,GAElC,EAAkB,EAAQ,IAAkB,SAAU,GACrD,EAAM,8BACT,EAAM,OAAS,EAAM,WACrB,EAAM,cAAgB,EAEtB,EAAM,eAA2B,EAAM,gBAA4B,EACnE,EAAM,gBAA2B,EAAM,iBAA4B,EACnE,EAAM,yBAA2B,EAAM,0BAA4B,EAE/D,cAAc,KAAK,EAAM,QAC3B,EAAM,MAAQ,EAAM,QAAU,EAAU,GAAS,SAAS,gBAAgB,WAC1E,EAAM,MAAQ,EAAM,QAAU,EAAU,GAAS,SAAS,gBAAgB,WAG5E,EAAS,IAIb,GAAM,EAAQ,GAAU,EAAK,EAAM,IAAmB,EAAQ,UAEvC,IAAnB,GACF,EAAS,KAAK,GACd,EAAQ,KAAK,GACb,EAAS,KAAK,IAGd,EAAS,SAIX,GAAM,EAAQ,GAAU,EAAM,EAAU,EAAiB,IAAY,EAAQ,QAI/E,OAFA,GAAO,OAAO,GAAM,KAAK,GAElB,GAIX,QAAS,GAAQ,EAAS,EAAM,EAAU,GACxC,GAAM,GAAU,EAAW,GACrB,EAAe,EAAQ,EAAU,GACjC,EAAS,EAAQ,EAEvB,IAAK,GAAW,EAAO,OAAvB,CAIA,GAAI,GAAkB,EAClB,MAAA,GACA,MAAA,EAQJ,IANI,IACF,EAAY,EAAkB,GAC9B,EAAgB,EAAQ,EAAU,SAAU,GAC5C,EAAkB,EAAU,QAAQ,IAGzB,QAAT,EAAJ,CASA,GAAI,EAAO,OAAO,GAAO,CACvB,GAAM,GAAM,EAAO,OAAO,GAAM,MAEhC,IAAiB,QAAb,EAAoB,CACtB,IAAK,GAAI,GAAI,EAAG,EAAI,EAAK,IACvB,EAAO,EAAS,EAAM,EAAO,OAAO,GAAM,GAAI,EAEhD,QAGA,IAAK,GAAI,GAAI,EAAG,EAAI,EAAK,IACvB,GAAI,EAAO,OAAO,GAAM,KAAO,EAAU,CACvC,EAAQ,GAAa,EAAK,EAAM,EAAiB,EAAiB,IAAY,EAAQ,SACtF,EAAO,OAAO,GAAM,OAAO,EAAG,GAE1B,GAAkB,GAEsB,MAD1C,EAAU,SAAS,KAEjB,EAAU,SAAS,OAAO,EAAe,GACzC,EAAU,QAAQ,OAAO,EAAe,GACxC,EAAU,SAAS,OAAO,EAAe,GAI7C,OAKF,EAAO,OAAO,IAAwC,IAA/B,EAAO,OAAO,GAAM,SAC7C,EAAO,OAAO,GAAQ,KACtB,EAAO,aAIN,EAAO,YACV,EAAQ,OAAO,EAAc,GAC7B,EAAS,OAAO,EAAc,GAC9B,EAAkB,OAAO,EAAc,QA9CvC,KAAK,IAAQ,GAAO,OACd,EAAO,OAAO,eAAe,IAC/B,EAAO,EAAS,EAAM,QAgD9B,QAAS,GAAa,EAAU,EAAS,EAAM,EAAU,GACvD,GAAM,GAAU,EAAW,EAC3B,KAAK,EAAgB,GAAO,CAC1B,EAAgB,IACd,aACA,YACA,aAIF,KAAK,GAAI,GAAI,EAAG,EAAI,EAAU,OAAQ,IACpC,EAAI,EAAU,GAAI,EAAM,GACxB,EAAI,EAAU,GAAI,EAAM,GAAoB,GAIhD,GAAM,GAAY,EAAgB,GAC9B,MAAA,EAEJ,KAAK,EAAQ,EAAU,UAAU,OAAS,EAAG,GAAS,IAChD,EAAU,UAAU,KAAW,GAC5B,EAAU,SAAS,KAAW,GAFkB,MAO1C,IAAX,IACF,EAAQ,EAAU,UAAU,OAE5B,EAAU,UAAU,KAAK,GACzB,EAAU,SAAU,KAAK,GACzB,EAAU,UAAU,UAItB,EAAU,UAAU,GAAO,MAAM,IAAY,EAAQ,QAAS,EAAQ,UAGxE,QAAS,GAAgB,EAAU,EAAS,EAAM,EAAU,GAC1D,GAAM,GAAU,EAAW,GACrB,EAAY,EAAgB,GAC9B,GAAa,EACb,MAAA,EAEJ,IAAK,EAGL,IAAK,EAAQ,EAAU,UAAU,OAAS,EAAG,GAAS,EAAG,IAEvD,GAAI,EAAU,UAAU,KAAW,GAC5B,EAAU,SAAS,KAAW,EAAS,CAK5C,IAAK,GAHC,GAAY,EAAU,UAAU,GAG7B,EAAI,EAAU,OAAS,EAAG,GAAK,EAAG,IAAK,CAAA,GAAA,GACf,EAAU,GAAlC,EADuC,EAAA,GACnC,EADmC,EAAA,GAC1B,EAD0B,EAAA,EAI9C,IAAI,IAAO,GAAY,MAAc,EAAQ,SAAW,IAAY,EAAQ,QAAS,CAEnF,EAAU,OAAO,EAAG,GAIf,EAAU,SACb,EAAU,UAAU,OAAO,EAAO,GAClC,EAAU,SAAU,OAAO,EAAO,GAClC,EAAU,UAAU,OAAO,EAAO,GAGlC,EAAO,EAAS,EAAM,GACtB,EAAO,EAAS,EAAM,GAAoB,GAGrC,EAAU,UAAU,SACvB,EAAgB,GAAQ,OAK5B,GAAa,CACb,QAIJ,GAAI,EAAc,OAOxB,QAAS,GAAkB,EAAO,GAChC,GAAM,GAAU,EAAW,GACrB,KACA,EAAY,EAAgB,EAAM,MAClC,EAAe,EAAS,iBAAiB,EAAM,KACjD,EAAM,KAAK,GACX,EAAM,QACN,EAAU,CASd,KANA,EAAQ,EAAW,GAEnB,EAAU,cAAgB,EAC1B,EAAU,eAAiB,EAGpB,EAAG,QAAQ,IAAU,CAC1B,IAAK,GAAI,GAAI,EAAG,EAAI,EAAU,UAAU,OAAQ,IAAK,CACnD,GAAM,GAAW,EAAU,UAAU,GAC/B,EAAU,EAAU,SAAS,EAEnC,IAAI,EAAS,gBAAgB,EAAS,IAC/B,EAAS,aAAa,EAAS,IAC/B,EAAS,aAAa,EAAS,GAAU,CAE9C,GAAM,GAAY,EAAU,UAAU,EAEtC,GAAU,cAAgB,CAE1B,KAAK,GAAI,GAAI,EAAG,EAAI,EAAU,OAAQ,IAAK,CAAA,GAAA,GACV,EAAU,GAAlC,EADkC,EAAA,GAC9B,EAD8B,EAAA,GACrB,EADqB,EAAA,EAGrC,OAAc,EAAQ,SAAW,IAAY,EAAQ,SACvD,EAAG,KAMX,EAAU,EAAS,WAAW,IAIlC,QAAS,GAAoB,GAC3B,MAAO,GAAiB,KAAK,KAAM,GAAO,GAG5C,QAAS,KACP,KAAK,aAAc,EAGrB,QAAS,KACP,KAAK,cAAc,iBAGrB,QAAS,KACP,KAAK,cAAe,EAGtB,QAAS,KACP,KAAK,cAAe,EACpB,KAAK,6BAA8B,EAGrC,QAAS,GAAY,GACnB,MAAO,GAAG,OAAO,GAAQ,GAAU,QAAS,GAlV9C,GAAM,GAAO,EAAQ,QACf,EAAW,EAAQ,cACnB,EAAW,EAAQ,qBAEM,EAAQ,YAA/B,IAAA,OAAQ,IAAA,YACc,EAAQ,SAA9B,IAAA,QAAS,IAAA,SAEX,EAAkB,eAAiB,MAAa,oBAAsB,IACtE,EAAiB,EAAiB,cAAe,mBACjD,EAAiB,EAAiB,cAAe,sBACjD,EAAiB,EAAgB,KAAM,GAEvC,KACA,KACA,KASA,KAEA,KAEA,GAAmB,GAAmB,WAC1C,GAAI,IAAY,CAMhB,OAJA,GAAO,SAAS,cAAc,OAAO,iBAAiB,OAAQ,MAC5D,cAAiB,GAAY,KAGxB,IAmTT,GAAO,SACL,IAAA,EACA,OAAA,EAEA,YAAA,EACA,eAAA,EAEA,iBAAA,EACA,mBAAA,EACA,gBAAA,EACA,UAAA,EAEA,eAAA,EACA,gBAAA,EAEA,UAAW,EACX,SAAU,EACV,mBAAoB,+GCtWtB,GAAO,QAAU,SAAiB,EAAM,GACtC,IAAK,GAAM,KAAQ,GACjB,EAAK,GAAQ,EAAO,EAEtB,OAAO,gDCDL,EAAQ,UAFV,IAAA,gBACA,IAAA,QAGF,GAAO,QAAU,SAAU,EAAQ,EAAS,GAC1C,GAAM,GAAgB,EAAO,QAAQ,GAC/B,EAAe,GAAiB,EAAc,OAC9C,EAAS,GAAgB,EAAO,QAAQ,OAExC,EAAa,EAAgB,EAAQ,EAAQ,GAAU,GAAU,GAEvE,OAAO,GAAS,KAAiB,EAAG,EAAG,EAAG,oDCZ5C,GAAO,QAAU,SAAC,EAAG,GAAJ,MAAW,MAAK,KAAK,EAAI,EAAI,EAAI,yCCAlD,IAAM,GAAS,EAAQ,YACjB,EAAS,EAAQ,YAEjB,GACJ,SAAU,SAAU,EAAQ,GAC1B,GAAI,IAAS,CAEb,OAAO,YAML,MALK,KACH,EAAI,OAAO,QAAQ,KAAK,GACxB,GAAS,GAGJ,EAAO,MAAM,KAAM,aAK9B,iBAAkB,SAAU,EAAG,EAAI,EAAI,GACrC,GAAM,GAAK,EAAI,CACf,OAAO,GAAK,EAAK,EAAK,EAAI,EAAK,EAAI,EAAK,EAAI,EAAI,GAGlD,uBAAwB,SAAU,EAAQ,EAAQ,EAAK,EAAK,EAAM,EAAM,GACtE,OACE,EAAI,EAAM,iBAAiB,EAAU,EAAQ,EAAK,GAClD,EAAI,EAAM,iBAAiB,EAAU,EAAQ,EAAK,KAKtD,YAAa,SAAU,EAAG,EAAG,EAAG,GAE9B,MADA,IAAK,GACG,EAAI,GAAG,EAAE,GAAK,GAGxB,WAAY,SAAU,EAAM,GAK1B,MAJA,GAAK,KAAQ,EAAI,KACjB,EAAK,KAAQ,EAAI,KACjB,EAAK,MAAQ,EAAI,MAEV,GAGT,GAAa,EAAQ,QACrB,OAAa,EACb,MAAa,EAAQ,WACrB,YAAa,EAAQ,iBAGvB,GAAO,EAAO,EAAQ,UACtB,EAAO,EAAO,EAAQ,eACtB,EAAO,EAAO,EAAQ,mBACtB,EAAO,EAAO,EAAQ,WAEtB,EAAO,QAAU,uKCvDjB,IAAM,GAAU,EAAQ,YAClB,EAAU,EAAQ,WAElB,GACJ,aAAe,mBAAoB,aAAc,aAAc,QAE/D,OAAQ,SAAU,EAAS,EAAW,GAKpC,IAAA,GAJM,GAAc,EAAM,eAAe,GACnC,EAAY,EAAM,aAAa,GAC/B,GAAY,QAAA,EAAS,UAAA,EAAW,YAAA,EAAa,UAAA,EAAW,YAAA,GAE9D,EAAqB,EAAO,YAA5B,EAAA,MAAA,QAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,OAAA,cAAyC,CAAA,GAAA,EAAA,IAAA,EAAA,CAAA,GAAA,GAAA,EAAA,OAAA,KAAA,GAAA,EAAA,SAAA,CAAA,GAAA,EAAA,EAAA,OAAA,EAAA,KAAA,KAAA,GAAA,EAAA,MAAA,GAA9B,GAA8B,EACjC,EAAc,EAAO,GAAQ,EAEnC,IAAI,EACF,MAAO,KAMb,iBAAkB,SAAA,GAAmD,GAAvC,GAAuC,EAAvC,YAAa,EAA0B,EAA1B,UAAW,EAAe,EAAf,WACpD,KAAK,cAAc,KAAK,GACtB,MAAO,KAGT,KAAA,GAAA,GAA0B,EAAM,aAAhC,EAAA,MAAA,QAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,OAAA,cAA8C,CAAA,GAAA,EAAA,IAAA,EAAA,CAAA,GAAA,GAAA,EAAA,OAAA,KAAA,GAAA,EAAA,SAAA,CAAA,GAAA,EAAA,EAAA,OAAA,EAAA,KAAA,KAAA,GAAA,EAAA,MAAA,GAAnC,GAAmC,EACxC,EAAU,CAEd,IAAI,EAAY,YAAc,EAAY,WAAW,aAC7C,EAAY,cAAgB,EAClC,KAAO,GAAS,CAEd,GAAI,IAAY,EAAY,QAC1B,MAAO,EAET,GAAU,EAAM,WAAW,IAKjC,MAAO,OAIT,WAAY,SAAA,GAAiD,GAArC,GAAqC,EAArC,UAAW,EAA0B,EAA1B,YAAa,EAAa,EAAb,SAC9C,IAAoB,UAAhB,GAA2C,QAAhB,EAC7B,MAAO,KAKT,KAAA,GAFI,OAAA,GAEJ,EAA0B,EAAM,aAAhC,EAAA,MAAA,QAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,OAAA,cAA8C,CAAA,GAAA,EAAA,IAAA,EAAA,CAAA,GAAA,GAAA,EAAA,OAAA,KAAA,GAAA,EAAA,SAAA,CAAA,GAAA,EAAA,EAAA,OAAA,EAAA,KAAA,KAAA,GAAA,EAAA,MAAA,GAAnC,GAAmC,CAC5C,IAAI,EAAY,cAAgB,EAAa,CAE3C,GAAI,EAAY,aAAe,EAAM,SAAS,EAAY,WAAY,GAAc,QAGpF,IAAI,EAAY,cACd,MAAO,EAGC,KACR,EAAiB,IAOvB,GAAI,EACF,MAAO,EAMT,KAAA,GAAA,GAA0B,EAAM,aAAhC,EAAA,MAAA,QAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,OAAA,cAA8C,CAAA,GAAA,EAAA,IAAA,EAAA,CAAA,GAAA,GAAA,EAAA,OAAA,KAAA,GAAA,EAAA,SAAA,CAAA,GAAA,EAAA,EAAA,OAAA,EAAA,KAAA,KAAA,GAAA,EAAA,MAAA,GAAnC,GAAmC,CAC5C,MAAI,EAAY,cAAgB,GAAiB,QAAQ,KAAK,IAAc,EAAY,YACtF,MAAO,GAIX,MAAO,OAIT,WAAY,SAAA,GACV,IAAA,GADsB,GAAa,EAAb,UACtB,EAA0B,EAAM,aAAhC,EAAA,MAAA,QAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,OAAA,cAA8C,CAAA,GAAA,EAAA,IAAA,EAAA,CAAA,GAAA,GAAA,EAAA,OAAA,KAAA,GAAA,EAAA,SAAA,CAAA,GAAA,EAAA,EAAA,OAAA,EAAA,KAAA,KAAA,GAAA,EAAA,MAAA,GAAnC,GAAmC,CAC5C,IAAI,EAAM,SAAS,EAAY,WAAY,GACzC,MAAO,KAMb,KAAM,SAAA,GACJ,IAAA,GADgB,GAAe,EAAf,YAChB,EAA0B,EAAM,aAAhC,EAAA,MAAA,QAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,OAAA,cAA8C,CAAA,GAAA,EAAA,IAAA,EAAA,CAAA,GAAA,GAAA,EAAA,OAAA,KAAA,GAAA,EAAA,SAAA,CAAA,GAAA,EAAA,EAAA,OAAA,EAAA,KAAA,KAAA,GAAA,EAAA,MAAA,GAAnC,GAAmC,CAE5C,IAAsC,IAAlC,EAAY,WAAW,OAAc,CACvC,GAAM,GAAS,EAAY,MAG3B,IAAI,IAAW,EAAO,QAAQ,QAAQ,QACpC,aAIC,IAAI,EAAY,WAAW,QAAU,EACxC,QAGF,KAAK,EAAY,eAAkB,IAAgB,EAAY,YAC7D,MAAO,GAIX,MAAO,OAIX,GAAO,QAAU,kRCzHX,EAAa,EAAQ,YACrB,EAAa,EAAQ,cAErB,GACJ,MAAU,aAEV,OAAU,SAAA,GAAA,MAAS,KAAU,EAAI,QAAU,EAAS,IAEpD,QAAU,SAAA,GAAA,MAAS,GAAG,OAAO,IAA6B,KAAnB,EAAM,UAE7C,OAAU,SAAA,GAAA,QAAW,GAA2B,gBAAjB,KAAO,EAAP,YAAA,EAAO,KAEtC,SAAU,SAAA,GAAA,MAA0B,kBAAV,IAE1B,OAAU,SAAA,GAAA,MAA0B,gBAAV,IAE1B,KAAU,SAAA,GAAA,MAA0B,iBAAV,IAE1B,OAAU,SAAA,GAAA,MAA0B,gBAAV,IAE1B,QAAS,SAAA,GACP,IAAK,GAA2B,gBAAjB,KAAO,EAAP,YAAA,EAAO,IAAuB,OAAO,CAEpD,IAAM,GAAU,EAAI,UAAU,IAAU,EAAI,MAE5C,OAAQ,kBAAkB,KAAlB,EAA8B,EAAQ,UAC1C,YAAiB,GAAQ,QACN,IAAnB,EAAM,UAA4C,gBAAnB,GAAM,UAI7C,GAAG,MAAQ,SAAA,GAAA,MAAU,GAAG,OAAO,QACD,KAAjB,EAAM,QACd,EAAG,SAAS,EAAM,SAEvB,EAAO,QAAU,oECnCjB,GAAO,QAAU,SAAC,GAAD,SAAc,IAAS,EAAM,SAAY,YAAiB,GAAM,6CCAjF,SAAS,GAAe,EAAM,GAC5B,IAAK,GAAM,KAAQ,GAAQ,CACzB,GAAM,GAAkB,EAAO,QAAQ,gBACnC,GAAa,CAGjB,KAAK,GAAM,KAAU,GACnB,GAA6B,IAAzB,EAAK,QAAQ,IAAiB,EAAgB,GAAQ,KAAK,GAAO,CACpE,GAAa,CACb,OAIC,GAAsC,kBAAjB,GAAO,KAC/B,EAAK,GAAQ,EAAO,IAGxB,MAAO,GAGT,EAAc,iBACZ,OAAQ,kDAGV,EAAO,QAAU,uCCxBjB,IAAM,GAAgB,EAAQ,WACxB,EAAgB,EAAQ,aACxB,EAAgB,EAAQ,gBACxB,EAAgB,EAAQ,cACxB,EAAgB,EAAQ,gBACxB,EAAgB,EAAQ,QACxB,EAAgB,EAAQ,mBAExB,GACJ,WAAY,SAAU,EAAM,GAC1B,EAAK,KAAO,EAAK,SACjB,EAAK,KAAK,EAAI,EAAI,KAAK,EACvB,EAAK,KAAK,EAAI,EAAI,KAAK,EAEvB,EAAK,OAAS,EAAK,WACnB,EAAK,OAAO,EAAI,EAAI,OAAO,EAC3B,EAAK,OAAO,EAAI,EAAI,OAAO,EAE3B,EAAK,UAAY,EAAI,WAGvB,eAAgB,SAAU,EAAW,EAAM,GACzC,EAAU,KAAK,EAAO,EAAI,KAAK,EAAO,EAAK,KAAK,EAChD,EAAU,KAAK,EAAO,EAAI,KAAK,EAAO,EAAK,KAAK,EAChD,EAAU,OAAO,EAAK,EAAI,OAAO,EAAK,EAAK,OAAO,EAClD,EAAU,OAAO,EAAK,EAAI,OAAO,EAAK,EAAK,OAAO,EAClD,EAAU,UAAY,EAAI,UAAY,EAAK,SAG3C,IAAM,GAAK,KAAK,IAAI,EAAU,UAAY,IAAM,KAEhD,GAAU,KAAK,MAAU,EAAM,EAAU,KAAK,EAAG,EAAU,KAAK,GAAK,EACrE,EAAU,KAAK,GAAU,EAAU,KAAK,EAAI,EAC5C,EAAU,KAAK,GAAU,EAAU,KAAK,EAAI,EAE5C,EAAU,OAAO,MAAQ,EAAM,EAAU,OAAO,EAAG,EAAU,KAAK,GAAK,EACvE,EAAU,OAAO,GAAQ,EAAU,OAAO,EAAI,EAC9C,EAAU,OAAO,GAAQ,EAAU,OAAO,EAAI,GAGhD,gBAAiB,SAAW,GAC1B,MAAQ,aAAmB,GAAI,OAAS,YAAmB,GAAI,OAIjE,MAAO,SAAU,EAAM,EAAS,GAO9B,MANA,GAAK,MACL,EAAO,GAAQ,OAEf,EAAG,EAAI,EAAQ,EAAO,KACtB,EAAG,EAAI,EAAQ,EAAO,KAEf,GAGT,UAAW,SAAU,EAAS,GAc5B,MAbA,GAAO,MAGH,EAAQ,eAAiB,EAAa,gBAAgB,IACxD,EAAa,MAAM,SAAU,EAAS,GAEtC,EAAK,GAAK,OAAO,QACjB,EAAK,GAAK,OAAO,SAGjB,EAAa,MAAM,OAAQ,EAAS,GAG/B,GAGT,YAAa,SAAU,EAAS,GAW9B,MAVA,GAAS,MAEL,EAAQ,eAAiB,EAAa,gBAAgB,GAExD,EAAa,MAAM,SAAU,EAAS,GAGtC,EAAa,MAAM,SAAU,EAAS,GAGjC,GAGT,aAAc,SAAU,GACtB,MAAO,GAAG,OAAO,EAAQ,WAAY,EAAQ,UAAY,EAAQ,YAGnE,UAAW,SAAU,EAAW,EAAU,GACxC,GAAM,GAAW,EAAS,OAAS,EAChB,EAAa,eAAe,GAC5B,EAAS,GAEtB,IAEN,GAAa,UAAU,EAAS,GAChC,EAAU,KAAK,EAAI,EAAM,EACzB,EAAU,KAAK,EAAI,EAAM,EAEzB,EAAa,YAAY,EAAS,GAClC,EAAU,OAAO,EAAI,EAAM,EAC3B,EAAU,OAAO,EAAI,EAAM,EAE3B,EAAU,UAAY,EAAG,OAAO,GAAa,GAAW,GAAI,OAAO,WAGrE,cAAe,EAEf,aAAc,SAAU,GACtB,GAAM,KAyBN,OAtBI,GAAG,MAAM,IACX,EAAQ,GAAK,EAAM,GACnB,EAAQ,GAAK,EAAM,IAIA,aAAf,EAAM,KACqB,IAAzB,EAAM,QAAQ,QAChB,EAAQ,GAAK,EAAM,QAAQ,GAC3B,EAAQ,GAAK,EAAM,eAAe,IAEF,IAAzB,EAAM,QAAQ,SACrB,EAAQ,GAAK,EAAM,eAAe,GAClC,EAAQ,GAAK,EAAM,eAAe,KAIpC,EAAQ,GAAK,EAAM,QAAQ,GAC3B,EAAQ,GAAK,EAAM,QAAQ,IAIxB,GAGT,eAAgB,SAAU,GAUxB,IAAA,GATM,IACJ,MAAS,EACT,MAAS,EACT,QAAS,EACT,QAAS,EACT,QAAS,EACT,QAAS,GAGX,EAAsB,EAAtB,EAAA,MAAA,QAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,OAAA,cAAgC,CAAA,GAAA,EAAA,IAAA,EAAA,CAAA,GAAA,GAAA,EAAA,OAAA,KAAA,GAAA,EAAA,SAAA,CAAA,GAAA,EAAA,EAAA,OAAA,EAAA,KAAA,KAAA,GAAA,EAAA,MAAA,GAArB,GAAqB,CAC9B,KAAK,GAAM,KAAQ,GACjB,EAAQ,IAAS,EAAQ,GAG7B,IAAK,GAAM,KAAQ,GACjB,EAAQ,IAAS,EAAS,MAG5B,OAAO,IAGT,UAAW,SAAU,GACnB,GAAK,EAAM,QAAY,EAAM,SAAW,EAAM,QAAQ,OAAS,EAA/D,CAIA,GAAM,GAAU,EAAa,aAAa,GACpC,EAAO,KAAK,IAAI,EAAQ,GAAG,MAAO,EAAQ,GAAG,OAC7C,EAAO,KAAK,IAAI,EAAQ,GAAG,MAAO,EAAQ,GAAG,MAInD,QACE,EAAG,EACH,EAAG,EACH,KAAM,EACN,IAAK,EACL,MARW,KAAK,IAAI,EAAQ,GAAG,MAAO,EAAQ,GAAG,OAQnC,EACd,OARW,KAAK,IAAI,EAAQ,GAAG,MAAO,EAAQ,GAAG,OAQlC,KAInB,cAAe,SAAU,EAAO,GAC9B,GAAM,GAAU,EAAc,IACxB,EAAU,EAAc,IACxB,EAAU,EAAa,aAAa,GAGpC,EAAK,EAAQ,GAAG,GAAW,EAAQ,GAAG,GACtC,EAAK,EAAQ,GAAG,GAAW,EAAQ,GAAG,EAE5C,OAAO,GAAM,EAAI,IAGnB,WAAY,SAAU,EAAO,EAAW,GACtC,GAAM,GAAU,EAAc,IACxB,EAAU,EAAc,IACxB,EAAU,EAAa,aAAa,GACpC,EAAK,EAAQ,GAAG,GAAW,EAAQ,GAAG,GACtC,EAAK,EAAQ,GAAG,GAAW,EAAQ,GAAG,EAG5C,OAFc,KAAM,KAAK,MAAM,EAAK,GAAM,KAAK,IAKjD,eAAgB,SAAU,GACxB,MAAO,GAAG,OAAO,EAAQ,aACrB,EAAQ,YACR,EAAG,OAAO,EAAQ,kBACf,OAAW,GAAU,QAAS,MAAO,SAAS,EAAQ,aAGrD,QAAQ,KAAK,EAAQ,OAAS,YAAmB,GAAW,MAC1D,QACA,SAIZ,gBAAiB,SAAU,GACzB,OACE,EAAS,iBAAiB,EAAM,KAAO,EAAM,KAAK,GAAK,EAAM,QAC7D,EAAS,iBAAiB,EAAM,iBAKtC,GAAO,QAAU,mIC3NjB,KAAK,MAPc,EAAQ,YAAnB,IAAA,OAEF,GAAW,KAAM,MAAO,SAAU,KACpC,EAAW,EACX,MAAA,GACA,MAAA,GAEK,EAAI,EAAG,EAAI,EAAQ,SAAW,EAAO,sBAAuB,IACnE,EAAU,EAAO,EAAQ,GAAK,yBAC9B,EAAS,EAAO,EAAQ,GAAI,yBAA2B,EAAO,EAAQ,GAAK,8BAGxE,KACH,EAAU,SAAU,GAClB,GAAM,IAAW,GAAI,OAAO,UACtB,EAAa,KAAK,IAAI,EAAG,IAAM,EAAW,IAC1C,EAAK,WAAW,WAAc,EAAS,EAAW,IAClC,EAGtB,OADA,GAAW,EAAW,EACf,IAIN,IACH,EAAS,SAAU,GACjB,aAAa,KAIjB,EAAO,SACL,QAAA,EACA,OAAA,qDChCF,IAAM,GAAS,EAAQ,YACjB,EAAK,EAAQ,UAKf,EAAQ,cAHV,IAAA,QACA,IAAA,WACA,IAAA,eAGI,GACJ,sBAAuB,SAAU,EAAO,EAAc,GACpD,MAAK,GAAG,OAAO,GAKb,EADY,WAAV,EACM,EAAW,GAEF,SAAV,EACC,EAAa,QAAQ,GAGrB,EAAQ,EAAS,GAVlB,MAgBX,gBAAiB,SAAU,EAAO,EAAc,EAAS,GAWvD,MAVA,GAAQ,EAAU,sBAAsB,EAAO,EAAc,IAAY,EAErE,EAAG,SAAS,KACd,EAAQ,EAAM,MAAM,KAAM,IAGxB,EAAG,QAAQ,KACb,EAAQ,EAAe,IAGlB,GAGT,SAAU,SAAU,GAClB,MAAQ,KACN,EAAG,KAAO,GAAO,EAAK,EAAI,EAAK,KAC/B,EAAG,KAAO,GAAO,EAAK,EAAI,EAAK,MAInC,WAAY,SAAU,GAUpB,OATI,GAAU,QAAU,IAAQ,OAAS,KACvC,EAAO,KAAW,GAElB,EAAK,KAAS,EAAK,GAAK,EACxB,EAAK,IAAS,EAAK,GAAK,EACxB,EAAK,MAAS,EAAK,OAAY,EAAK,KAAO,EAAK,MAChD,EAAK,OAAS,EAAK,QAAY,EAAK,IAAM,EAAK,QAG1C,GAGT,WAAY,SAAU,GAUpB,OATI,GAAU,KAAO,IAAQ,KAAO,KAClC,EAAO,KAAW,GAElB,EAAK,EAAS,EAAK,MAAQ,EAC3B,EAAK,IAAS,EAAK,KAAQ,EAC3B,EAAK,MAAS,EAAK,OAAW,EAAK,MAAS,EAAK,EACjD,EAAK,OAAS,EAAK,QAAW,EAAK,OAAS,EAAK,GAG5C,GAIX,GAAO,QAAU,8ECxEjB,SAAS,GAAM,GAGb,EAAI,WAAa,CAGjB,IAAM,GAAK,EAAO,SAAS,eAAe,GAGtC,GAAG,gBAAkB,EAAO,UACF,kBAAhB,GAAO,MAChB,EAAO,KAAK,KAAQ,IAEvB,EAAS,EAAO,KAAK,IAGvB,EAAI,OAAS,EAnBf,GAAM,GAAM,EAAO,QACb,EAAW,EAAQ,aAqBH,oBAAX,SACT,EAAI,WAAa,GACjB,EAAI,eAAa,IAGjB,EAAK,QAGP,EAAI,UAAY,SAAoB,GAClC,GAAI,EAAS,GACX,MAAO,EAGT,IAAM,GAAY,EAAK,eAAiB,CAExC,OAAO,GAAS,aAAe,EAAS,cAAgB,EAAI,QAG9D,EAAI,KAAO","file":"interact.min.js","sourceRoot":"","sourcesContent":["/* interact.js v1.3.0-alpha.4+sha.7970416-dirty | https://raw.github.com/taye/interact.js/master/LICENSE */\n","/**\n * interact.js v1.3.0-alpha.4+sha.7970416-dirty\n *\n * Copyright (c) 2012-2017 Taye Adeyemi \n * Open source under the MIT License.\n * https://raw.github.com/taye/interact.js/master/LICENSE\n */\n","/*\n * In a (windowless) server environment this file exports a factory function\n * that takes the window to use.\n *\n * var interact = require('interact.js')(windowObject);\n *\n * See https://github.com/taye/interact.js/issues/187\n */\nif (typeof window === 'undefined') {\n module.exports = function (window) {\n require('./src/utils/window').init(window);\n\n return require('./src/index');\n };\n}\nelse {\n module.exports = require('./src/index');\n}\n","const { indexOf } = require('./utils/arr');\nconst extend = require('./utils/extend.js');\n\nfunction fireUntilImmediateStopped (event, listeners) {\n for (let i = 0, len = listeners.length; i < len && !event.immediatePropagationStopped; i++) {\n listeners[i](event);\n }\n}\n\nclass Eventable {\n\n constructor (options) {\n this.options = extend({}, options || {});\n }\n\n fire (event) {\n let listeners;\n const onEvent = 'on' + event.type;\n const global = this.global;\n\n // Interactable#on() listeners\n if ((listeners = this[event.type])) {\n fireUntilImmediateStopped(event, listeners);\n }\n\n // interactable.onevent listener\n if (this[onEvent]) {\n this[onEvent](event);\n }\n\n // interact.on() listeners\n if (!event.propagationStopped && global && (listeners = global[event.type])) {\n fireUntilImmediateStopped(event, listeners);\n }\n }\n\n on (eventType, listener) {\n // if this type of event was never bound\n if (this[eventType]) {\n this[eventType].push(listener);\n }\n else {\n this[eventType] = [listener];\n }\n }\n\n off (eventType, listener) {\n // if it is an action event type\n const eventList = this[eventType];\n const index = eventList? indexOf(eventList, listener) : -1;\n\n if (index !== -1) {\n eventList.splice(index, 1);\n }\n\n if (eventList && eventList.length === 0 || !listener) {\n this[eventType] = listener;\n }\n }\n}\n\nmodule.exports = Eventable;\n","const extend = require('./utils/extend');\nconst getOriginXY = require('./utils/getOriginXY');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nclass InteractEvent {\n constructor (interaction, event, action, phase, element, related, preEnd = false) {\n const target = interaction.target;\n const deltaSource = (target && target.options || defaults).deltaSource;\n const origin = getOriginXY(target, element, action);\n const starting = phase === 'start';\n const ending = phase === 'end';\n const coords = starting? interaction.startCoords : interaction.curCoords;\n const prevEvent = interaction.prevEvent;\n\n element = element || interaction.element;\n\n const page = extend({}, coords.page);\n const client = extend({}, coords.client);\n\n page.x -= origin.x;\n page.y -= origin.y;\n\n client.x -= origin.x;\n client.y -= origin.y;\n\n this.ctrlKey = event.ctrlKey;\n this.altKey = event.altKey;\n this.shiftKey = event.shiftKey;\n this.metaKey = event.metaKey;\n this.button = event.button;\n this.buttons = event.buttons;\n this.target = element;\n this.currentTarget = element;\n this.relatedTarget = related || null;\n this.preEnd = preEnd;\n this.type = action + (phase || '');\n this.interaction = interaction;\n this.interactable = target;\n\n this.t0 = starting ? interaction.downTimes[interaction.downTimes.length - 1]\n : prevEvent.t0;\n\n const signalArg = {\n interaction,\n event,\n action,\n phase,\n element,\n related,\n page,\n client,\n coords,\n starting,\n ending,\n deltaSource,\n iEvent: this,\n };\n\n signals.fire('set-xy', signalArg);\n\n if (ending) {\n // use previous coords when ending\n this.pageX = prevEvent.pageX;\n this.pageY = prevEvent.pageY;\n this.clientX = prevEvent.clientX;\n this.clientY = prevEvent.clientY;\n }\n else {\n this.pageX = page.x;\n this.pageY = page.y;\n this.clientX = client.x;\n this.clientY = client.y;\n }\n\n this.x0 = interaction.startCoords.page.x - origin.x;\n this.y0 = interaction.startCoords.page.y - origin.y;\n this.clientX0 = interaction.startCoords.client.x - origin.x;\n this.clientY0 = interaction.startCoords.client.y - origin.y;\n\n signals.fire('set-delta', signalArg);\n\n this.timeStamp = coords.timeStamp;\n this.dt = interaction.pointerDelta.timeStamp;\n this.duration = this.timeStamp - this.t0;\n\n // speed and velocity in pixels per second\n this.speed = interaction.pointerDelta[deltaSource].speed;\n this.velocityX = interaction.pointerDelta[deltaSource].vx;\n this.velocityY = interaction.pointerDelta[deltaSource].vy;\n\n this.swipe = (ending || phase === 'inertiastart')? this.getSwipe() : null;\n\n signals.fire('new', signalArg);\n }\n\n getSwipe () {\n const interaction = this.interaction;\n\n if (interaction.prevEvent.speed < 600\n || this.timeStamp - interaction.prevEvent.timeStamp > 150) {\n return null;\n }\n\n let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI;\n const overlap = 22.5;\n\n if (angle < 0) {\n angle += 360;\n }\n\n const left = 135 - overlap <= angle && angle < 225 + overlap;\n const up = 225 - overlap <= angle && angle < 315 + overlap;\n\n const right = !left && (315 - overlap <= angle || angle < 45 + overlap);\n const down = !up && 45 - overlap <= angle && angle < 135 + overlap;\n\n return {\n up,\n down,\n left,\n right,\n angle,\n speed: interaction.prevEvent.speed,\n velocity: {\n x: interaction.prevEvent.velocityX,\n y: interaction.prevEvent.velocityY,\n },\n };\n }\n\n preventDefault () {}\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n}\n\nsignals.on('set-delta', function ({ iEvent, interaction, starting, deltaSource }) {\n const prevEvent = starting? iEvent : interaction.prevEvent;\n\n if (deltaSource === 'client') {\n iEvent.dx = iEvent.clientX - prevEvent.clientX;\n iEvent.dy = iEvent.clientY - prevEvent.clientY;\n }\n else {\n iEvent.dx = iEvent.pageX - prevEvent.pageX;\n iEvent.dy = iEvent.pageY - prevEvent.pageY;\n }\n});\n\nInteractEvent.signals = signals;\n\nmodule.exports = InteractEvent;\n","const is = require('./utils/is');\nconst events = require('./utils/events');\nconst extend = require('./utils/extend');\nconst actions = require('./actions/base');\nconst scope = require('./scope');\nconst Eventable = require('./Eventable');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nconst {\n getElementRect,\n nodeContains,\n trySelector,\n} = require('./utils/domUtils');\nconst { getWindow } = require('./utils/window');\nconst { indexOf, contains } = require('./utils/arr');\nconst { wheelEvent } = require('./utils/browser');\n\n// all set interactables\nscope.interactables = [];\n\n/*\\\n * Interactable\n [ property ]\n **\n * Object type returned by @interact\n\\*/\nclass Interactable {\n constructor (target, options) {\n options = options || {};\n\n this.target = target;\n this.events = new Eventable();\n this._context = options.context || scope.document;\n this._win = getWindow(trySelector(target)? this._context : target);\n this._doc = this._win.document;\n\n signals.fire('new', {\n target,\n options,\n interactable: this,\n win: this._win,\n });\n\n scope.addDocument( this._doc, this._win );\n\n scope.interactables.push(this);\n\n this.set(options);\n }\n\n setOnEvents (action, phases) {\n const onAction = 'on' + action;\n\n if (is.function(phases.onstart) ) { this.events[onAction + 'start' ] = phases.onstart ; }\n if (is.function(phases.onmove) ) { this.events[onAction + 'move' ] = phases.onmove ; }\n if (is.function(phases.onend) ) { this.events[onAction + 'end' ] = phases.onend ; }\n if (is.function(phases.oninertiastart)) { this.events[onAction + 'inertiastart' ] = phases.oninertiastart ; }\n\n return this;\n }\n\n setPerAction (action, options) {\n // for all the default per-action options\n for (const option in options) {\n // if this option exists for this action\n if (option in defaults[action]) {\n // if the option in the options arg is an object value\n if (is.object(options[option])) {\n // duplicate the object\n this.options[action][option] = extend(this.options[action][option] || {}, options[option]);\n\n if (is.object(defaults.perAction[option]) && 'enabled' in defaults.perAction[option]) {\n this.options[action][option].enabled = options[option].enabled === false? false : true;\n }\n }\n else if (is.bool(options[option]) && is.object(defaults.perAction[option])) {\n this.options[action][option].enabled = options[option];\n }\n else if (options[option] !== undefined) {\n // or if it's not undefined, do a plain assignment\n this.options[action][option] = options[option];\n }\n }\n }\n }\n\n /*\\\n * Interactable.getRect\n [ method ]\n *\n * The default function to get an Interactables bounding rect. Can be\n * overridden using @Interactable.rectChecker.\n *\n - element (Element) #optional The element to measure.\n = (object) The object's bounding rectangle.\n o {\n o top : 0,\n o left : 0,\n o bottom: 0,\n o right : 0,\n o width : 0,\n o height: 0\n o }\n \\*/\n getRect (element) {\n element = element || this.target;\n\n if (is.string(this.target) && !(is.element(element))) {\n element = this._context.querySelector(this.target);\n }\n\n return getElementRect(element);\n }\n\n /*\\\n * Interactable.rectChecker\n [ method ]\n *\n * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n - checker (function) #optional A function which returns this Interactable's bounding rectangle. See @Interactable.getRect\n = (function | object) The checker function or this Interactable\n \\*/\n rectChecker (checker) {\n if (is.function(checker)) {\n this.getRect = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.getRect;\n\n return this;\n }\n\n return this.getRect;\n }\n\n _backCompatOption (optionName, newValue) {\n if (trySelector(newValue) || is.object(newValue)) {\n this.options[optionName] = newValue;\n\n for (const action of actions.names) {\n this.options[action][optionName] = newValue;\n }\n\n return this;\n }\n\n return this.options[optionName];\n }\n\n /*\\\n * Interactable.origin\n [ method ]\n *\n * Gets or sets the origin of the Interactable's element. The x and y\n * of the origin will be subtracted from action event coordinates.\n *\n - origin (object | string) #optional An object eg. { x: 0, y: 0 } or string 'parent', 'self' or any CSS selector\n * OR\n - origin (Element) #optional An HTML or SVG Element whose rect will be used\n **\n = (object) The current origin or this Interactable\n \\*/\n origin (newValue) {\n return this._backCompatOption('origin', newValue);\n }\n\n /*\\\n * Interactable.deltaSource\n [ method ]\n *\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n - newValue (string) #optional Use 'client' if you will be scrolling while interacting; Use 'page' if you want autoScroll to work\n = (string | object) The current deltaSource or this Interactable\n \\*/\n deltaSource (newValue) {\n if (newValue === 'page' || newValue === 'client') {\n this.options.deltaSource = newValue;\n\n return this;\n }\n\n return this.options.deltaSource;\n }\n\n /*\\\n * Interactable.context\n [ method ]\n *\n * Gets the selector context Node of the Interactable. The default is `window.document`.\n *\n = (Node) The context Node of this Interactable\n **\n \\*/\n context () {\n return this._context;\n }\n\n inContext (element) {\n return (this._context === element.ownerDocument\n || nodeContains(this._context, element));\n }\n\n /*\\\n * Interactable.fire\n [ method ]\n *\n * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n - iEvent (InteractEvent) The InteractEvent object to be fired on this Interactable\n = (Interactable) this Interactable\n \\*/\n fire (iEvent) {\n this.events.fire(iEvent);\n\n return this;\n }\n\n _onOffMultiple (method, eventType, listener, options) {\n if (is.string(eventType) && eventType.search(' ') !== -1) {\n eventType = eventType.trim().split(/ +/);\n }\n\n if (is.array(eventType)) {\n for (let i = 0; i < eventType.length; i++) {\n this[method](eventType[i], listener, options);\n }\n\n return true;\n }\n\n if (is.object(eventType)) {\n for (const prop in eventType) {\n this[method](prop, eventType[prop], listener);\n }\n\n return true;\n }\n }\n\n /*\\\n * Interactable.on\n [ method ]\n *\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n - eventType (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) This Interactable\n \\*/\n on (eventType, listener, options) {\n if (this._onOffMultiple('on', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.on(eventType, listener);\n }\n // delegated event for selector\n else if (is.string(this.target)) {\n events.addDelegate(this.target, this._context, eventType, listener, options);\n }\n else {\n events.add(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.off\n [ method ]\n *\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n - eventType (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) This Interactable\n \\*/\n off (eventType, listener, options) {\n if (this._onOffMultiple('off', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n // if it is an action event type\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.off(eventType, listener);\n }\n // delegated event\n else if (is.string(this.target)) {\n events.removeDelegate(this.target, this._context, eventType, listener, options);\n }\n // remove listener from this Interatable's element\n else {\n events.remove(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.set\n [ method ]\n *\n * Reset the options of this Interactable\n - options (object) The new settings to apply\n = (object) This Interactable\n \\*/\n set (options) {\n if (!is.object(options)) {\n options = {};\n }\n\n this.options = extend({}, defaults.base);\n\n const perActions = extend({}, defaults.perAction);\n\n for (const actionName in actions.methodDict) {\n const methodName = actions.methodDict[actionName];\n\n this.options[actionName] = extend({}, defaults[actionName]);\n\n this.setPerAction(actionName, perActions);\n\n this[methodName](options[actionName]);\n }\n\n for (const setting of Interactable.settingsMethods) {\n this.options[setting] = defaults.base[setting];\n\n if (setting in options) {\n this[setting](options[setting]);\n }\n }\n\n signals.fire('set', {\n options,\n interactable: this,\n });\n\n return this;\n }\n\n /*\\\n * Interactable.unset\n [ method ]\n *\n * Remove this interactable from the list of interactables and remove\n * it's action capabilities and event listeners\n *\n = (object) @interact\n \\*/\n unset () {\n events.remove(this.target, 'all');\n\n if (is.string(this.target)) {\n // remove delegated events\n for (const type in events.delegatedEvents) {\n const delegated = events.delegatedEvents[type];\n\n if (delegated.selectors[0] === this.target\n && delegated.contexts[0] === this._context) {\n\n delegated.selectors.splice(0, 1);\n delegated.contexts .splice(0, 1);\n delegated.listeners.splice(0, 1);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegated[type] = null;\n }\n }\n\n events.remove(this._context, type, events.delegateListener);\n events.remove(this._context, type, events.delegateUseCapture, true);\n }\n }\n else {\n events.remove(this, 'all');\n }\n\n signals.fire('unset', { interactable: this });\n\n scope.interactables.splice(indexOf(scope.interactables, this), 1);\n\n // Stop related interactions when an Interactable is unset\n for (const interaction of scope.interactions || []) {\n if (interaction.target === this && interaction.interacting()) {\n interaction.stop();\n }\n }\n\n return scope.interact;\n }\n}\n\nscope.interactables.indexOfElement = function indexOfElement (target, context) {\n context = context || scope.document;\n\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n if (interactable.target === target && interactable._context === context) {\n return i;\n }\n }\n return -1;\n};\n\nscope.interactables.get = function interactableGet (element, options, dontCheckInContext) {\n const ret = this[this.indexOfElement(element, options && options.context)];\n\n return ret && (is.string(element) || dontCheckInContext || ret.inContext(element))? ret : null;\n};\n\nscope.interactables.forEachSelector = function (callback, element) {\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n // skip non CSS selector targets and out of context elements\n if (!is.string(interactable.target)\n || (element && !interactable.inContext(element))) {\n continue;\n }\n\n const ret = callback(interactable, interactable.target, interactable._context, i, this);\n\n if (ret !== undefined) {\n return ret;\n }\n }\n};\n\n// all interact.js eventTypes\nInteractable.eventTypes = scope.eventTypes = [];\n\nInteractable.signals = signals;\n\nInteractable.settingsMethods = [ 'deltaSource', 'origin', 'preventDefault', 'rectChecker' ];\n\nmodule.exports = Interactable;\n","const scope = require('./scope');\nconst utils = require('./utils');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst domObjects = require('./utils/domObjects');\nconst finder = require('./utils/interactionFinder');\nconst signals = require('./utils/Signals').new();\n\nconst listeners = {};\nconst methodNames = [\n 'pointerDown', 'pointerMove', 'pointerUp',\n 'updatePointer', 'removePointer',\n];\n\n// for ignoring browser's simulated mouse events\nlet prevTouchTime = 0;\n\n// all active and idle interactions\nscope.interactions = [];\n\nclass Interaction {\n constructor ({ pointerType }) {\n this.target = null; // current interactable being interacted with\n this.element = null; // the target element of the interactable\n\n this.prepared = { // action that's ready to be fired on next move event\n name : null,\n axis : null,\n edges: null,\n };\n\n // keep track of added pointers\n this.pointers = [];\n this.pointerIds = [];\n this.downTargets = [];\n this.downTimes = [];\n\n // Previous native pointer move event coordinates\n this.prevCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n // current native pointer move event coordinates\n this.curCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Starting InteractEvent pointer coordinates\n this.startCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Change in coordinates and time of the pointer\n this.pointerDelta = {\n page : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n client : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n timeStamp: 0,\n };\n\n this.downEvent = null; // pointerdown/mousedown/touchstart event\n this.downPointer = {};\n\n this._eventTarget = null;\n this._curEventTarget = null;\n\n this.prevEvent = null; // previous action event\n\n this.pointerIsDown = false;\n this.pointerWasMoved = false;\n this._interacting = false;\n\n this.pointerType = pointerType;\n\n signals.fire('new', this);\n\n scope.interactions.push(this);\n }\n\n pointerDown (pointer, event, eventTarget) {\n const pointerIndex = this.updatePointer(pointer, event, true);\n\n signals.fire('down', {\n pointer,\n event,\n eventTarget,\n pointerIndex,\n interaction: this,\n });\n }\n\n /*\\\n * Interaction.start\n [ method ]\n *\n * Start an action with the given Interactable and Element as tartgets. The\n * action must be enabled for the target Interactable and an appropriate number\n * of pointers must be held down - 1 for drag/resize, 2 for gesture.\n *\n * Use it with `interactable.able({ manualStart: false })` to always\n * [start actions manually](https://github.com/taye/interact.js/issues/114)\n *\n - action (object) The action to be performed - drag, resize, etc.\n - target (Interactable) The Interactable to target\n - element (Element) The DOM Element to target\n = (object) interact\n **\n | interact(target)\n | .draggable({\n | // disable the default drag start by down->move\n | manualStart: true\n | })\n | // start dragging after the user holds the pointer down\n | .on('hold', function (event) {\n | var interaction = event.interaction;\n |\n | if (!interaction.interacting()) {\n | interaction.start({ name: 'drag' },\n | event.interactable,\n | event.currentTarget);\n | }\n | });\n \\*/\n start (action, target, element) {\n if (this.interacting()\n || !this.pointerIsDown\n || this.pointerIds.length < (action.name === 'gesture'? 2 : 1)) {\n return;\n }\n\n // if this interaction had been removed after stopping\n // add it back\n if (utils.indexOf(scope.interactions, this) === -1) {\n scope.interactions.push(this);\n }\n\n utils.copyAction(this.prepared, action);\n this.target = target;\n this.element = element;\n\n signals.fire('action-start', {\n interaction: this,\n event: this.downEvent,\n });\n }\n\n pointerMove (pointer, event, eventTarget) {\n if (!this.simulation) {\n this.updatePointer(pointer);\n utils.setCoords(this.curCoords, this.pointers);\n }\n\n const duplicateMove = (this.curCoords.page.x === this.prevCoords.page.x\n && this.curCoords.page.y === this.prevCoords.page.y\n && this.curCoords.client.x === this.prevCoords.client.x\n && this.curCoords.client.y === this.prevCoords.client.y);\n\n let dx;\n let dy;\n\n // register movement greater than pointerMoveTolerance\n if (this.pointerIsDown && !this.pointerWasMoved) {\n dx = this.curCoords.client.x - this.startCoords.client.x;\n dy = this.curCoords.client.y - this.startCoords.client.y;\n\n this.pointerWasMoved = utils.hypot(dx, dy) > Interaction.pointerMoveTolerance;\n }\n\n const signalArg = {\n pointer,\n pointerIndex: this.getPointerIndex(pointer),\n event,\n eventTarget,\n dx,\n dy,\n duplicate: duplicateMove,\n interaction: this,\n interactingBeforeMove: this.interacting(),\n };\n\n if (!duplicateMove) {\n // set pointer coordinate, time changes and speeds\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n }\n\n signals.fire('move', signalArg);\n\n if (!duplicateMove) {\n // if interacting, fire an 'action-move' signal etc\n if (this.interacting()) {\n this.doMove(signalArg);\n }\n\n if (this.pointerWasMoved) {\n utils.copyCoords(this.prevCoords, this.curCoords);\n }\n }\n }\n\n /*\\\n * Interaction.doMove\n [ method ]\n *\n * Force a move of the current action at the same coordinates. Useful if\n * snap/restrict has been changed and you want a movement with the new\n * settings.\n *\n **\n | interact(target)\n | .draggable(true)\n | .on('dragmove', function (event) {\n | if (someCondition) {\n | // change the snap settings\n | event.interactable.draggable({ snap: { targets: [] }});\n | // fire another move event with re-calculated snap\n | event.interaction.doMove();\n | }\n | });\n \\*/\n doMove (signalArg) {\n signalArg = utils.extend({\n pointer: this.pointers[0],\n event: this.prevEvent,\n eventTarget: this._eventTarget,\n interaction: this,\n }, signalArg || {});\n\n signals.fire('before-action-move', signalArg);\n\n if (!this._dontFireMove) {\n signals.fire('action-move', signalArg);\n }\n\n this._dontFireMove = false;\n }\n\n // End interact move events and stop auto-scroll unless simulation is running\n pointerUp (pointer, event, eventTarget, curEventTarget) {\n const pointerIndex = this.getPointerIndex(pointer);\n\n signals.fire(/cancel$/i.test(event.type)? 'cancel' : 'up', {\n pointer,\n pointerIndex,\n event,\n eventTarget,\n curEventTarget,\n interaction: this,\n });\n\n if (!this.simulation) {\n this.end(event);\n }\n\n this.pointerIsDown = false;\n this.removePointer(pointer, event);\n }\n\n /*\\\n * Interaction.end\n [ method ]\n *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n - event (PointerEvent) #optional\n **\n | interact(target)\n | .draggable(true)\n | .on('move', function (event) {\n | if (event.pageX > 1000) {\n | // end the current action\n | event.interaction.end();\n | // stop all further listeners from being called\n | event.stopImmediatePropagation();\n | }\n | });\n \\*/\n end (event) {\n event = event || this.prevEvent;\n\n if (this.interacting()) {\n signals.fire('action-end', {\n event,\n interaction: this,\n });\n }\n\n this.stop();\n }\n\n currentAction () {\n return this._interacting? this.prepared.name: null;\n }\n\n interacting () {\n return this._interacting;\n }\n\n stop () {\n signals.fire('stop', { interaction: this });\n\n if (this._interacting) {\n signals.fire('stop-active', { interaction: this });\n signals.fire('stop-' + this.prepared.name, { interaction: this });\n }\n\n this.target = this.element = null;\n\n this._interacting = false;\n this.prepared.name = this.prevEvent = null;\n }\n\n getPointerIndex (pointer) {\n // mouse and pen interactions may have only one pointer\n if (this.pointerType === 'mouse' || this.pointerType === 'pen') {\n return 0;\n }\n\n return utils.indexOf(this.pointerIds, utils.getPointerId(pointer));\n }\n\n updatePointer (pointer, event, down = event && /(down|start)$/i.test(event.type)) {\n const id = utils.getPointerId(pointer);\n let index = this.getPointerIndex(pointer);\n\n if (index === -1) {\n index = this.pointerIds.length;\n this.pointerIds[index] = id;\n }\n\n if (down) {\n signals.fire('update-pointer-down', {\n pointer,\n event,\n down,\n pointerId: id,\n pointerIndex: index,\n interaction: this,\n });\n }\n\n this.pointers[index] = pointer;\n\n return index;\n }\n\n removePointer (pointer, event) {\n const index = this.getPointerIndex(pointer);\n\n if (index === -1) { return; }\n\n signals.fire('remove-pointer', {\n pointer,\n event,\n pointerIndex: index,\n interaction: this,\n });\n\n this.pointers .splice(index, 1);\n this.pointerIds .splice(index, 1);\n this.downTargets.splice(index, 1);\n this.downTimes .splice(index, 1);\n }\n\n _updateEventTargets (target, currentTarget) {\n this._eventTarget = target;\n this._curEventTarget = currentTarget;\n }\n}\n\nfor (let i = 0, len = methodNames.length; i < len; i++) {\n const method = methodNames[i];\n\n listeners[method] = doOnInteractions(method);\n}\n\nfunction doOnInteractions (method) {\n return (function (event) {\n const pointerType = utils.getPointerType(event);\n const [eventTarget, curEventTarget] = utils.getEventTargets(event);\n const matches = []; // [ [pointer, interaction], ...]\n\n if (browser.supportsTouch && /touch/.test(event.type)) {\n prevTouchTime = new Date().getTime();\n\n for (let i = 0; i < event.changedTouches.length; i++) {\n const pointer = event.changedTouches[i];\n const interaction = finder.search(pointer, event.type, eventTarget);\n\n matches.push([pointer, interaction || new Interaction({ pointerType })]);\n }\n }\n else {\n let invalidPointer = false;\n\n if (!browser.supportsPointerEvent && /mouse/.test(event.type)) {\n // ignore mouse events while touch interactions are active\n for (let i = 0; i < scope.interactions.length && !invalidPointer; i++) {\n invalidPointer = scope.interactions[i].pointerType !== 'mouse' && scope.interactions[i].pointerIsDown;\n }\n\n // try to ignore mouse events that are simulated by the browser\n // after a touch event\n invalidPointer = invalidPointer\n || (new Date().getTime() - prevTouchTime < 500)\n // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated\n || event.timeStamp === 0;\n }\n\n if (!invalidPointer) {\n let interaction = finder.search(event, event.type, eventTarget);\n\n if (!interaction) {\n interaction = new Interaction({ pointerType });\n }\n\n matches.push([event, interaction]);\n }\n }\n\n for (const [pointer, interaction] of matches) {\n interaction._updateEventTargets(eventTarget, curEventTarget);\n interaction[method](pointer, event, eventTarget, curEventTarget);\n }\n });\n}\n\nfunction endAll (event) {\n for (let i = 0; i < scope.interactions.length; i++) {\n const interaction = scope.interactions[i];\n\n interaction.end(event);\n signals.fire('endall', { event, interaction });\n }\n}\n\nconst docEvents = { /* 'eventType': listenerFunc */ };\nconst pEventTypes = browser.pEventTypes;\n\nif (domObjects.PointerEvent) {\n docEvents[pEventTypes.down ] = listeners.pointerDown;\n docEvents[pEventTypes.move ] = listeners.pointerMove;\n docEvents[pEventTypes.up ] = listeners.pointerUp;\n docEvents[pEventTypes.cancel] = listeners.pointerUp;\n}\nelse {\n docEvents.mousedown = listeners.pointerDown;\n docEvents.mousemove = listeners.pointerMove;\n docEvents.mouseup = listeners.pointerUp;\n\n docEvents.touchstart = listeners.pointerDown;\n docEvents.touchmove = listeners.pointerMove;\n docEvents.touchend = listeners.pointerUp;\n docEvents.touchcancel = listeners.pointerUp;\n}\n\ndocEvents.blur = endAll;\n\nfunction onDocSignal ({ doc }, signalName) {\n const eventMethod = signalName.indexOf('add') === 0\n ? events.add : events.remove;\n\n // delegate event listener\n for (const eventType in scope.delegatedEvents) {\n eventMethod(doc, eventType, events.delegateListener);\n eventMethod(doc, eventType, events.delegateUseCapture, true);\n }\n\n for (const eventType in docEvents) {\n eventMethod(doc, eventType, docEvents[eventType]);\n }\n}\n\nsignals.on('update-pointer-down', ({ interaction, pointer, pointerId, pointerIndex, event, eventTarget, down }) => {\n interaction.pointerIds[pointerIndex] = pointerId;\n interaction.pointers[pointerIndex] = pointer;\n\n if (down) {\n interaction.pointerIsDown = true;\n }\n\n if (!interaction.interacting()) {\n utils.setCoords(interaction.startCoords, interaction.pointers);\n\n utils.copyCoords(interaction.curCoords , interaction.startCoords);\n utils.copyCoords(interaction.prevCoords, interaction.startCoords);\n\n interaction.downEvent = event;\n interaction.downTimes[pointerIndex] = interaction.curCoords.timeStamp;\n interaction.downTargets[pointerIndex] = eventTarget || event && utils.getEventTargets(event)[0];\n interaction.pointerWasMoved = false;\n\n utils.pointerExtend(interaction.downPointer, pointer);\n }\n});\n\nscope.signals.on('add-document' , onDocSignal);\nscope.signals.on('remove-document', onDocSignal);\n\nInteraction.pointerMoveTolerance = 1;\nInteraction.doOnInteractions = doOnInteractions;\nInteraction.endAll = endAll;\nInteraction.signals = signals;\nInteraction.docEvents = docEvents;\n\nscope.endAllInteractions = endAll;\n\nmodule.exports = Interaction;\n","const Interaction = require('../Interaction');\nconst InteractEvent = require('../InteractEvent');\n\nconst actions = {\n firePrepared,\n names: [],\n methodDict: {},\n};\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n interaction._interacting = true;\n firePrepared(interaction, event, 'start');\n});\n\nInteraction.signals.on('action-move', function ({ interaction, event, preEnd }) {\n firePrepared(interaction, event, 'move', preEnd);\n\n // if the action was ended in a listener\n if (!interaction.interacting()) { return false; }\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n firePrepared(interaction, event, 'end');\n});\n\nfunction firePrepared (interaction, event, phase, preEnd) {\n const actionName = interaction.prepared.name;\n\n const newEvent = new InteractEvent(interaction, event, actionName, phase, interaction.element, null, preEnd);\n\n interaction.target.fire(newEvent);\n interaction.prevEvent = newEvent;\n}\n\nmodule.exports = actions;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drag = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n startAxis : 'xy',\n lockAxis : 'xy',\n },\n\n checker: function (pointer, event, interactable) {\n const dragOptions = interactable.options.drag;\n\n return dragOptions.enabled\n ? { name: 'drag', axis: (dragOptions.lockAxis === 'start'\n ? dragOptions.startAxis\n : dragOptions.lockAxis)}\n : null;\n },\n\n getCursor: function () {\n return 'move';\n },\n};\n\nInteraction.signals.on('before-action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n interaction.curCoords.page.y = interaction.startCoords.page.y;\n interaction.curCoords.client.y = interaction.startCoords.client.y;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vx);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vx);\n interaction.pointerDelta.client.vy = 0;\n interaction.pointerDelta.page.vy = 0;\n }\n else if (axis === 'y') {\n interaction.curCoords.page.x = interaction.startCoords.page.x;\n interaction.curCoords.client.x = interaction.startCoords.client.x;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vy);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vy);\n interaction.pointerDelta.client.vx = 0;\n interaction.pointerDelta.page.vx = 0;\n }\n});\n\n// dragmove\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'dragmove') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n iEvent.pageY = interaction.startCoords.page.y;\n iEvent.clientY = interaction.startCoords.client.y;\n iEvent.dy = 0;\n }\n else if (axis === 'y') {\n iEvent.pageX = interaction.startCoords.page.x;\n iEvent.clientX = interaction.startCoords.client.x;\n iEvent.dx = 0;\n }\n});\n\n/*\\\n * Interactable.draggable\n [ method ]\n *\n * Gets or sets whether drag actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of drag events\n | var isDraggable = interact('ul li').draggable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on drag events (object makes the Interactable draggable)\n = (object) This Interactable\n | interact(element).draggable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // the axis in which the first movement must be\n | // for the drag sequence to start\n | // 'xy' by default - any direction\n | startAxis: 'x' || 'y' || 'xy',\n |\n | // 'xy' by default - don't restrict to one axis (move in any direction)\n | // 'x' or 'y' to restrict movement to either axis\n | // 'start' to restrict movement to the axis the drag started in\n | lockAxis: 'x' || 'y' || 'xy' || 'start',\n |\n | // max number of drags that can happen concurrently\n | // with elements of this Interactable. Infinity by default\n | max: Infinity,\n |\n | // max number of drags that can target the same element+Interactable\n | // 1 by default\n | maxPerElement: 2\n | });\n\\*/\nInteractable.prototype.draggable = function (options) {\n if (utils.is.object(options)) {\n this.options.drag.enabled = options.enabled === false? false: true;\n this.setPerAction('drag', options);\n this.setOnEvents('drag', options);\n\n if (/^(xy|x|y|start)$/.test(options.lockAxis)) {\n this.options.drag.lockAxis = options.lockAxis;\n }\n if (/^(xy|x|y)$/.test(options.startAxis)) {\n this.options.drag.startAxis = options.startAxis;\n }\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drag.enabled = options;\n\n if (!options) {\n this.ondragstart = this.ondragstart = this.ondragend = null;\n }\n\n return this;\n }\n\n return this.options.drag;\n};\n\nactions.drag = drag;\nactions.names.push('drag');\nutils.merge(Interactable.eventTypes, [\n 'dragstart',\n 'dragmove',\n 'draginertiastart',\n 'draginertiaresume',\n 'dragend',\n]);\nactions.methodDict.drag = 'draggable';\n\ndefaultOptions.drag = drag.defaults;\n\nmodule.exports = drag;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst scope = require('../scope');\nconst interact = require('../interact');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drop = {\n defaults: {\n enabled: false,\n accept : null,\n overlap: 'pointer',\n },\n};\n\nlet dynamicDrop = false;\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // reset active dropzones\n interaction.activeDrops.dropzones = [];\n interaction.activeDrops.elements = [];\n interaction.activeDrops.rects = [];\n\n interaction.dropEvents = null;\n\n if (!interaction.dynamicDrop) {\n setActiveDrops(interaction, interaction.element);\n }\n\n const dragEvent = interaction.prevEvent;\n const dropEvents = getDropEvents(interaction, event, dragEvent);\n\n if (dropEvents.activate) {\n fireActiveDrops(interaction, dropEvents.activate);\n }\n});\n\nInteractEvent.signals.on('new', function ({ interaction, iEvent, event }) {\n if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { return; }\n\n const draggableElement = interaction.element;\n const dragEvent = iEvent;\n const dropResult = getDrop(dragEvent, event, draggableElement);\n\n interaction.dropTarget = dropResult.dropzone;\n interaction.dropElement = dropResult.element;\n\n interaction.dropEvents = getDropEvents(interaction, event, dragEvent);\n});\n\nInteraction.signals.on('action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n fireDropEvents(interaction, interaction.dropEvents);\n});\n\nInteraction.signals.on('action-end', function ({ interaction }) {\n if (interaction.prepared.name === 'drag') {\n fireDropEvents(interaction, interaction.dropEvents);\n }\n});\n\nInteraction.signals.on('stop-drag', function ({ interaction }) {\n interaction.activeDrops.dropzones =\n interaction.activeDrops.elements =\n interaction.activeDrops.rects =\n interaction.dropEvents = null;\n});\n\nfunction collectDrops (interaction, element) {\n const drops = [];\n const elements = [];\n\n element = element || interaction.element;\n\n // collect all dropzones and their elements which qualify for a drop\n for (const current of scope.interactables) {\n if (!current.options.drop.enabled) { continue; }\n\n const accept = current.options.drop.accept;\n\n // test the draggable element against the dropzone's accept setting\n if ((utils.is.element(accept) && accept !== element)\n || (utils.is.string(accept)\n && !utils.matchesSelector(element, accept))) {\n\n continue;\n }\n\n // query for new elements if necessary\n const dropElements = utils.is.string(current.target)\n ? current._context.querySelectorAll(current.target)\n : [current.target];\n\n for (let i = 0; i < dropElements.length; i++) {\n const currentElement = dropElements[i];\n\n if (currentElement !== element) {\n drops.push(current);\n elements.push(currentElement);\n }\n }\n }\n\n return {\n elements,\n dropzones: drops,\n };\n}\n\nfunction fireActiveDrops (interaction, event) {\n let prevElement;\n\n // loop through all active dropzones and trigger event\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n const current = interaction.activeDrops.dropzones[i];\n const currentElement = interaction.activeDrops.elements [i];\n\n // prevent trigger of duplicate events on same element\n if (currentElement !== prevElement) {\n // set current element as event target\n event.target = currentElement;\n current.fire(event);\n }\n prevElement = currentElement;\n }\n}\n\n// Collect a new set of possible drops and save them in activeDrops.\n// setActiveDrops should always be called when a drag has just started or a\n// drag event happens while dynamicDrop is true\nfunction setActiveDrops (interaction, dragElement) {\n // get dropzones and their elements that could receive the draggable\n const possibleDrops = collectDrops(interaction, dragElement, true);\n\n interaction.activeDrops.dropzones = possibleDrops.dropzones;\n interaction.activeDrops.elements = possibleDrops.elements;\n interaction.activeDrops.rects = [];\n\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n interaction.activeDrops.rects[i] =\n interaction.activeDrops.dropzones[i].getRect(interaction.activeDrops.elements[i]);\n }\n}\n\nfunction getDrop (dragEvent, event, dragElement) {\n const interaction = dragEvent.interaction;\n const validDrops = [];\n\n if (dynamicDrop) {\n setActiveDrops(interaction, dragElement);\n }\n\n // collect all dropzones and their elements which qualify for a drop\n for (let j = 0; j < interaction.activeDrops.dropzones.length; j++) {\n const current = interaction.activeDrops.dropzones[j];\n const currentElement = interaction.activeDrops.elements [j];\n const rect = interaction.activeDrops.rects [j];\n\n validDrops.push(current.dropCheck(dragEvent, event, interaction.target, dragElement, currentElement, rect)\n ? currentElement\n : null);\n }\n\n // get the most appropriate dropzone based on DOM depth and order\n const dropIndex = utils.indexOfDeepestElement(validDrops);\n\n return {\n dropzone: interaction.activeDrops.dropzones[dropIndex] || null,\n element : interaction.activeDrops.elements [dropIndex] || null,\n };\n}\n\nfunction getDropEvents (interaction, pointerEvent, dragEvent) {\n const dropEvents = {\n enter : null,\n leave : null,\n activate : null,\n deactivate: null,\n move : null,\n drop : null,\n };\n\n const tmpl = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n };\n\n if (interaction.dropElement !== interaction.prevDropElement) {\n // if there was a prevDropTarget, create a dragleave event\n if (interaction.prevDropTarget) {\n dropEvents.leave = utils.extend({ type: 'dragleave' }, tmpl);\n\n dragEvent.dragLeave = dropEvents.leave.target = interaction.prevDropElement;\n dragEvent.prevDropzone = dropEvents.leave.dropzone = interaction.prevDropTarget;\n }\n // if the dropTarget is not null, create a dragenter event\n if (interaction.dropTarget) {\n dropEvents.enter = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n type : 'dragenter',\n };\n\n dragEvent.dragEnter = interaction.dropElement;\n dragEvent.dropzone = interaction.dropTarget;\n }\n }\n\n if (dragEvent.type === 'dragend' && interaction.dropTarget) {\n dropEvents.drop = utils.extend({ type: 'drop' }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n dragEvent.relatedTarget = interaction.dropElement;\n }\n if (dragEvent.type === 'dragstart') {\n dropEvents.activate = utils.extend({ type: 'dropactivate' }, tmpl);\n\n dropEvents.activate.target = null;\n dropEvents.activate.dropzone = null;\n }\n if (dragEvent.type === 'dragend') {\n dropEvents.deactivate = utils.extend({ type: 'dropdeactivate' }, tmpl);\n\n dropEvents.deactivate.target = null;\n dropEvents.deactivate.dropzone = null;\n }\n if (dragEvent.type === 'dragmove' && interaction.dropTarget) {\n dropEvents.move = utils.extend({\n dragmove : dragEvent,\n type : 'dropmove',\n }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n }\n\n return dropEvents;\n}\n\nfunction fireDropEvents (interaction, dropEvents) {\n if (dropEvents.leave) { interaction.prevDropTarget.fire(dropEvents.leave); }\n if (dropEvents.move ) { interaction.dropTarget.fire(dropEvents.move ); }\n if (dropEvents.enter) { interaction.dropTarget.fire(dropEvents.enter); }\n if (dropEvents.drop ) { interaction.dropTarget.fire(dropEvents.drop ); }\n if (dropEvents.deactivate) {\n fireActiveDrops(interaction, dropEvents.deactivate);\n }\n\n interaction.prevDropTarget = interaction.dropTarget;\n interaction.prevDropElement = interaction.dropElement;\n}\n\n/*\\\n * Interactable.dropzone\n [ method ]\n *\n * Returns or sets whether elements can be dropped onto this\n * Interactable to trigger drop events\n *\n * Dropzones can receive the following events:\n * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends\n * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone\n * - `dragmove` when a draggable that has entered the dropzone is moved\n * - `drop` when a draggable is dropped into this dropzone\n *\n * Use the `accept` option to allow only elements that match the given CSS\n * selector or element. The value can be:\n *\n * - **an Element** - only that element can be dropped into this dropzone.\n * - **a string**, - the element being dragged must match it as a CSS selector.\n * - **`null`** - accept options is cleared - it accepts any element.\n *\n * Use the `overlap` option to set how drops are checked for. The allowed\n * values are:\n *\n * - `'pointer'`, the pointer must be over the dropzone (default)\n * - `'center'`, the draggable element's center must be over the dropzone\n * - a number from 0-1 which is the `(intersection area) / (draggable area)`.\n * e.g. `0.5` for drop to happen when half of the area of the draggable is\n * over the dropzone\n *\n * Use the `checker` option to specify a function to check if a dragged\n * element is over this Interactable.\n *\n | interact(target)\n | .dropChecker(function(dragEvent, // related dragmove or dragend event\n | event, // TouchEvent/PointerEvent/MouseEvent\n | dropped, // bool result of the default checker\n | dropzone, // dropzone Interactable\n | dropElement, // dropzone elemnt\n | draggable, // draggable Interactable\n | draggableElement) {// draggable element\n |\n | return dropped && event.target.hasAttribute('allow-drop');\n | }\n *\n *\n - options (boolean | object | null) #optional The new value to be set.\n | interact('.drop').dropzone({\n | accept: '.can-drop' || document.getElementById('single-drop'),\n | overlap: 'pointer' || 'center' || zeroToOne\n | }\n = (boolean | object) The current setting or this Interactable\n\\*/\nInteractable.prototype.dropzone = function (options) {\n if (utils.is.object(options)) {\n this.options.drop.enabled = options.enabled === false? false: true;\n\n if (utils.is.function(options.ondrop) ) { this.events.ondrop = options.ondrop ; }\n if (utils.is.function(options.ondropactivate) ) { this.events.ondropactivate = options.ondropactivate ; }\n if (utils.is.function(options.ondropdeactivate)) { this.events.ondropdeactivate = options.ondropdeactivate; }\n if (utils.is.function(options.ondragenter) ) { this.events.ondragenter = options.ondragenter ; }\n if (utils.is.function(options.ondragleave) ) { this.events.ondragleave = options.ondragleave ; }\n if (utils.is.function(options.ondropmove) ) { this.events.ondropmove = options.ondropmove ; }\n\n if (/^(pointer|center)$/.test(options.overlap)) {\n this.options.drop.overlap = options.overlap;\n }\n else if (utils.is.number(options.overlap)) {\n this.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0);\n }\n if ('accept' in options) {\n this.options.drop.accept = options.accept;\n }\n if ('checker' in options) {\n this.options.drop.checker = options.checker;\n }\n\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drop.enabled = options;\n\n if (!options) {\n this.ondragenter = this.ondragleave = this.ondrop\n = this.ondropactivate = this.ondropdeactivate = null;\n }\n\n return this;\n }\n\n return this.options.drop;\n};\n\nInteractable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) {\n let dropped = false;\n\n // if the dropzone has no rect (eg. display: none)\n // call the custom dropChecker or just return false\n if (!(rect = rect || this.getRect(dropElement))) {\n return (this.options.drop.checker\n ? this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement)\n : false);\n }\n\n const dropOverlap = this.options.drop.overlap;\n\n if (dropOverlap === 'pointer') {\n const origin = utils.getOriginXY(draggable, draggableElement, 'drag');\n const page = utils.getPageXY(dragEvent);\n\n page.x += origin.x;\n page.y += origin.y;\n\n const horizontal = (page.x > rect.left) && (page.x < rect.right);\n const vertical = (page.y > rect.top ) && (page.y < rect.bottom);\n\n dropped = horizontal && vertical;\n }\n\n const dragRect = draggable.getRect(draggableElement);\n\n if (dragRect && dropOverlap === 'center') {\n const cx = dragRect.left + dragRect.width / 2;\n const cy = dragRect.top + dragRect.height / 2;\n\n dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom;\n }\n\n if (dragRect && utils.is.number(dropOverlap)) {\n const overlapArea = (Math.max(0, Math.min(rect.right , dragRect.right ) - Math.max(rect.left, dragRect.left))\n * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top , dragRect.top )));\n\n const overlapRatio = overlapArea / (dragRect.width * dragRect.height);\n\n dropped = overlapRatio >= dropOverlap;\n }\n\n if (this.options.drop.checker) {\n dropped = this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement);\n }\n\n return dropped;\n};\n\nInteractable.signals.on('unset', function ({ interactable }) {\n interactable.dropzone(false);\n});\n\nInteractable.settingsMethods.push('dropChecker');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.dropTarget = null; // the dropzone a drag target might be dropped into\n interaction.dropElement = null; // the element at the time of checking\n interaction.prevDropTarget = null; // the dropzone that was recently dragged away from\n interaction.prevDropElement = null; // the element at the time of checking\n interaction.dropEvents = null; // the dropEvents related to the current drag event\n\n interaction.activeDrops = {\n dropzones: [], // the dropzones that are mentioned below\n elements : [], // elements of dropzones that accept the target draggable\n rects : [], // the rects of the elements mentioned above\n };\n\n});\n\nInteraction.signals.on('stop', function ({ interaction }) {\n interaction.dropTarget = interaction.dropElement =\n interaction.prevDropTarget = interaction.prevDropElement = null;\n});\n\n/*\\\n * interact.dynamicDrop\n [ method ]\n *\n * Returns or sets whether the dimensions of dropzone elements are\n * calculated on every dragmove or only on dragstart for the default\n * dropChecker\n *\n - newValue (boolean) #optional True to check on each move. False to check only before start\n = (boolean | interact) The current setting or interact\n\\*/\ninteract.dynamicDrop = function (newValue) {\n if (utils.is.bool(newValue)) {\n //if (dragging && dynamicDrop !== newValue && !newValue) {\n //calcRects(dropzones);\n //}\n\n dynamicDrop = newValue;\n\n return interact;\n }\n return dynamicDrop;\n};\n\nutils.merge(Interactable.eventTypes, [\n 'dragenter',\n 'dragleave',\n 'dropactivate',\n 'dropdeactivate',\n 'dropmove',\n 'drop',\n]);\nactions.methodDict.drop = 'dropzone';\n\ndefaultOptions.drop = drop.defaults;\n\nmodule.exports = drop;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst gesture = {\n defaults: {\n enabled : false,\n origin : null,\n restrict: null,\n },\n\n checker: function (pointer, event, interactable, element, interaction) {\n if (interaction.pointerIds.length >= 2) {\n return { name: 'gesture' };\n }\n\n return null;\n },\n\n getCursor: function () {\n return '';\n },\n};\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturestart') { return; }\n iEvent.ds = 0;\n\n interaction.gesture.startDistance = interaction.gesture.prevDistance = iEvent.distance;\n interaction.gesture.startAngle = interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.scale = 1;\n});\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturemove') { return; }\n\n iEvent.ds = iEvent.scale - interaction.gesture.scale;\n\n interaction.target.fire(iEvent);\n\n interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.prevDistance = iEvent.distance;\n\n if (iEvent.scale !== Infinity\n && iEvent.scale !== null\n && iEvent.scale !== undefined\n && !isNaN(iEvent.scale)) {\n\n interaction.gesture.scale = iEvent.scale;\n }\n});\n\n/*\\\n * Interactable.gesturable\n [ method ]\n *\n * Gets or sets whether multitouch gestures can be performed on the\n * Interactable's element\n *\n = (boolean) Indicates if this can be the target of gesture events\n | var isGestureable = interact(element).gesturable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on gesture events (makes the Interactable gesturable)\n = (object) this Interactable\n | interact(element).gesturable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // limit multiple gestures.\n | // See the explanation in @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n\\*/\nInteractable.prototype.gesturable = function (options) {\n if (utils.is.object(options)) {\n this.options.gesture.enabled = options.enabled === false? false: true;\n this.setPerAction('gesture', options);\n this.setOnEvents('gesture', options);\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.gesture.enabled = options;\n\n if (!options) {\n this.ongesturestart = this.ongesturestart = this.ongestureend = null;\n }\n\n return this;\n }\n\n return this.options.gesture;\n};\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action, event, starting, ending, deltaSource }) {\n if (action !== 'gesture') { return; }\n\n const pointers = interaction.pointers;\n\n iEvent.touches = [pointers[0], pointers[1]];\n\n if (starting) {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = 1;\n iEvent.ds = 0;\n iEvent.angle = utils.touchAngle(pointers, undefined, deltaSource);\n iEvent.da = 0;\n }\n else if (ending || event instanceof InteractEvent) {\n iEvent.distance = interaction.prevEvent.distance;\n iEvent.box = interaction.prevEvent.box;\n iEvent.scale = interaction.prevEvent.scale;\n iEvent.ds = iEvent.scale - 1;\n iEvent.angle = interaction.prevEvent.angle;\n iEvent.da = iEvent.angle - interaction.gesture.startAngle;\n }\n else {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = iEvent.distance / interaction.gesture.startDistance;\n iEvent.angle = utils.touchAngle(pointers, interaction.gesture.prevAngle, deltaSource);\n\n iEvent.ds = iEvent.scale - interaction.gesture.prevScale;\n iEvent.da = iEvent.angle - interaction.gesture.prevAngle;\n }\n});\n\nInteraction.signals.on('new', function (interaction) {\n interaction.gesture = {\n start: { x: 0, y: 0 },\n\n startDistance: 0, // distance between two touches of touchStart\n prevDistance : 0,\n distance : 0,\n\n scale: 1, // gesture.distance / gesture.startDistance\n\n startAngle: 0, // angle of line joining two touches\n prevAngle : 0, // angle of the previous gesture event\n };\n});\n\nactions.gesture = gesture;\nactions.names.push('gesture');\nutils.merge(Interactable.eventTypes, [\n 'gesturestart',\n 'gesturemove',\n 'gestureend',\n]);\nactions.methodDict.gesture = 'gesturable';\n\ndefaultOptions.gesture = gesture.defaults;\n\nmodule.exports = gesture;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\n// Less Precision with touch input\nconst defaultMargin = browser.supportsTouch || browser.supportsPointerEvent? 20: 10;\n\nconst resize = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n square: false,\n preserveAspectRatio: false,\n axis: 'xy',\n\n // use default margin\n margin: NaN,\n\n // object with props left, right, top, bottom which are\n // true/false values to resize when the pointer is over that edge,\n // CSS selectors to match the handles for each direction\n // or the Elements for each handle\n edges: null,\n\n // a value of 'none' will limit the resize rect to a minimum of 0x0\n // 'negate' will alow the rect to have negative width/height\n // 'reposition' will keep the width/height positive by swapping\n // the top and bottom edges and/or swapping the left and right edges\n invert: 'none',\n },\n\n checker: function (pointer, event, interactable, element, interaction, rect) {\n if (!rect) { return null; }\n\n const page = utils.extend({}, interaction.curCoords.page);\n const options = interactable.options;\n\n if (options.resize.enabled) {\n const resizeOptions = options.resize;\n const resizeEdges = { left: false, right: false, top: false, bottom: false };\n\n // if using resize.edges\n if (utils.is.object(resizeOptions.edges)) {\n for (const edge in resizeEdges) {\n resizeEdges[edge] = checkResizeEdge(edge,\n resizeOptions.edges[edge],\n page,\n interaction._eventTarget,\n element,\n rect,\n resizeOptions.margin || defaultMargin);\n }\n\n resizeEdges.left = resizeEdges.left && !resizeEdges.right;\n resizeEdges.top = resizeEdges.top && !resizeEdges.bottom;\n\n if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) {\n return {\n name: 'resize',\n edges: resizeEdges,\n };\n }\n }\n else {\n const right = options.resize.axis !== 'y' && page.x > (rect.right - defaultMargin);\n const bottom = options.resize.axis !== 'x' && page.y > (rect.bottom - defaultMargin);\n\n if (right || bottom) {\n return {\n name: 'resize',\n axes: (right? 'x' : '') + (bottom? 'y' : ''),\n };\n }\n }\n }\n\n return null;\n },\n\n cursors: (browser.isIe9OrOlder ? {\n x : 'e-resize',\n y : 's-resize',\n xy: 'se-resize',\n\n top : 'n-resize',\n left : 'w-resize',\n bottom : 's-resize',\n right : 'e-resize',\n topleft : 'se-resize',\n bottomright: 'se-resize',\n topright : 'ne-resize',\n bottomleft : 'ne-resize',\n } : {\n x : 'ew-resize',\n y : 'ns-resize',\n xy: 'nwse-resize',\n\n top : 'ns-resize',\n left : 'ew-resize',\n bottom : 'ns-resize',\n right : 'ew-resize',\n topleft : 'nwse-resize',\n bottomright: 'nwse-resize',\n topright : 'nesw-resize',\n bottomleft : 'nesw-resize',\n }),\n\n getCursor: function (action) {\n if (action.axis) {\n return resize.cursors[action.name + action.axis];\n }\n else if (action.edges) {\n let cursorKey = '';\n const edgeNames = ['top', 'bottom', 'left', 'right'];\n\n for (let i = 0; i < 4; i++) {\n if (action.edges[edgeNames[i]]) {\n cursorKey += edgeNames[i];\n }\n }\n\n return resize.cursors[cursorKey];\n }\n },\n};\n\n// resizestart\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'resizestart' || !interaction.prepared.edges) {\n return;\n }\n\n const startRect = interaction.target.getRect(interaction.element);\n const resizeOptions = interaction.target.options.resize;\n\n /*\n * When using the `resizable.square` or `resizable.preserveAspectRatio` options, resizing from one edge\n * will affect another. E.g. with `resizable.square`, resizing to make the right edge larger will make\n * the bottom edge larger by the same amount. We call these 'linked' edges. Any linked edges will depend\n * on the active edges and the edge being interacted with.\n */\n if (resizeOptions.square || resizeOptions.preserveAspectRatio) {\n const linkedEdges = utils.extend({}, interaction.prepared.edges);\n\n linkedEdges.top = linkedEdges.top || (linkedEdges.left && !linkedEdges.bottom);\n linkedEdges.left = linkedEdges.left || (linkedEdges.top && !linkedEdges.right );\n linkedEdges.bottom = linkedEdges.bottom || (linkedEdges.right && !linkedEdges.top );\n linkedEdges.right = linkedEdges.right || (linkedEdges.bottom && !linkedEdges.left );\n\n interaction.prepared._linkedEdges = linkedEdges;\n }\n else {\n interaction.prepared._linkedEdges = null;\n }\n\n // if using `resizable.preserveAspectRatio` option, record aspect ratio at the start of the resize\n if (resizeOptions.preserveAspectRatio) {\n interaction.resizeStartAspectRatio = startRect.width / startRect.height;\n }\n\n interaction.resizeRects = {\n start : startRect,\n current : utils.extend({}, startRect),\n inverted : utils.extend({}, startRect),\n previous : utils.extend({}, startRect),\n delta : {\n left: 0, right : 0, width : 0,\n top : 0, bottom: 0, height: 0,\n },\n };\n\n iEvent.rect = interaction.resizeRects.inverted;\n iEvent.deltaRect = interaction.resizeRects.delta;\n});\n\n// resizemove\nInteractEvent.signals.on('new', function ({ iEvent, phase, interaction }) {\n if (phase !== 'move' || !interaction.prepared.edges) { return; }\n\n const resizeOptions = interaction.target.options.resize;\n const invert = resizeOptions.invert;\n const invertible = invert === 'reposition' || invert === 'negate';\n\n let edges = interaction.prepared.edges;\n\n const start = interaction.resizeRects.start;\n const current = interaction.resizeRects.current;\n const inverted = interaction.resizeRects.inverted;\n const delta = interaction.resizeRects.delta;\n const previous = utils.extend(interaction.resizeRects.previous, inverted);\n const originalEdges = edges;\n\n let dx = iEvent.dx;\n let dy = iEvent.dy;\n\n if (resizeOptions.preserveAspectRatio || resizeOptions.square) {\n // `resize.preserveAspectRatio` takes precedence over `resize.square`\n const startAspectRatio = resizeOptions.preserveAspectRatio\n ? interaction.resizeStartAspectRatio\n : 1;\n\n edges = interaction.prepared._linkedEdges;\n\n if ((originalEdges.left && originalEdges.bottom)\n || (originalEdges.right && originalEdges.top)) {\n dy = -dx / startAspectRatio;\n }\n else if (originalEdges.left || originalEdges.right ) { dy = dx / startAspectRatio; }\n else if (originalEdges.top || originalEdges.bottom) { dx = dy * startAspectRatio; }\n }\n\n // update the 'current' rect without modifications\n if (edges.top ) { current.top += dy; }\n if (edges.bottom) { current.bottom += dy; }\n if (edges.left ) { current.left += dx; }\n if (edges.right ) { current.right += dx; }\n\n if (invertible) {\n // if invertible, copy the current rect\n utils.extend(inverted, current);\n\n if (invert === 'reposition') {\n // swap edge values if necessary to keep width/height positive\n let swap;\n\n if (inverted.top > inverted.bottom) {\n swap = inverted.top;\n\n inverted.top = inverted.bottom;\n inverted.bottom = swap;\n }\n if (inverted.left > inverted.right) {\n swap = inverted.left;\n\n inverted.left = inverted.right;\n inverted.right = swap;\n }\n }\n }\n else {\n // if not invertible, restrict to minimum of 0x0 rect\n inverted.top = Math.min(current.top, start.bottom);\n inverted.bottom = Math.max(current.bottom, start.top);\n inverted.left = Math.min(current.left, start.right);\n inverted.right = Math.max(current.right, start.left);\n }\n\n inverted.width = inverted.right - inverted.left;\n inverted.height = inverted.bottom - inverted.top ;\n\n for (const edge in inverted) {\n delta[edge] = inverted[edge] - previous[edge];\n }\n\n iEvent.edges = interaction.prepared.edges;\n iEvent.rect = inverted;\n iEvent.deltaRect = delta;\n});\n\n/*\\\n * Interactable.resizable\n [ method ]\n *\n * Gets or sets whether resize actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of resize elements\n | var isResizeable = interact('input[type=text]').resizable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on resize events (object makes the Interactable resizable)\n = (object) This Interactable\n | interact(element).resizable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | edges: {\n | top : true, // Use pointer coords to check for resize.\n | left : false, // Disable resizing from left edge.\n | bottom: '.resize-s',// Resize if pointer target matches selector\n | right : handleEl // Resize if pointer target is the given Element\n | },\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height are adjusted at a 1:1 ratio.\n | square: false,\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height maintain the aspect ratio they had when resizing started.\n | preserveAspectRatio: false,\n |\n | // a value of 'none' will limit the resize rect to a minimum of 0x0\n | // 'negate' will allow the rect to have negative width/height\n | // 'reposition' will keep the width/height positive by swapping\n | // the top and bottom edges and/or swapping the left and right edges\n | invert: 'none' || 'negate' || 'reposition'\n |\n | // limit multiple resizes.\n | // See the explanation in the @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n \\*/\nInteractable.prototype.resizable = function (options) {\n if (utils.is.object(options)) {\n this.options.resize.enabled = options.enabled === false? false: true;\n this.setPerAction('resize', options);\n this.setOnEvents('resize', options);\n\n if (/^x$|^y$|^xy$/.test(options.axis)) {\n this.options.resize.axis = options.axis;\n }\n else if (options.axis === null) {\n this.options.resize.axis = defaultOptions.resize.axis;\n }\n\n if (utils.is.bool(options.preserveAspectRatio)) {\n this.options.resize.preserveAspectRatio = options.preserveAspectRatio;\n }\n else if (utils.is.bool(options.square)) {\n this.options.resize.square = options.square;\n }\n\n return this;\n }\n if (utils.is.bool(options)) {\n this.options.resize.enabled = options;\n\n if (!options) {\n this.onresizestart = this.onresizestart = this.onresizeend = null;\n }\n\n return this;\n }\n return this.options.resize;\n};\n\nfunction checkResizeEdge (name, value, page, element, interactableElement, rect, margin) {\n // false, '', undefined, null\n if (!value) { return false; }\n\n // true value, use pointer coords and element rect\n if (value === true) {\n // if dimensions are negative, \"switch\" edges\n const width = utils.is.number(rect.width )? rect.width : rect.right - rect.left;\n const height = utils.is.number(rect.height)? rect.height : rect.bottom - rect.top ;\n\n if (width < 0) {\n if (name === 'left' ) { name = 'right'; }\n else if (name === 'right') { name = 'left' ; }\n }\n if (height < 0) {\n if (name === 'top' ) { name = 'bottom'; }\n else if (name === 'bottom') { name = 'top' ; }\n }\n\n if (name === 'left' ) { return page.x < ((width >= 0? rect.left: rect.right ) + margin); }\n if (name === 'top' ) { return page.y < ((height >= 0? rect.top : rect.bottom) + margin); }\n\n if (name === 'right' ) { return page.x > ((width >= 0? rect.right : rect.left) - margin); }\n if (name === 'bottom') { return page.y > ((height >= 0? rect.bottom: rect.top ) - margin); }\n }\n\n // the remaining checks require an element\n if (!utils.is.element(element)) { return false; }\n\n return utils.is.element(value)\n // the value is an element to use as a resize handle\n ? value === element\n // otherwise check if element matches value as selector\n : utils.matchesUpTo(element, value, interactableElement);\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.resizeAxes = 'xy';\n});\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action }) {\n if (action !== 'resize' || !interaction.resizeAxes) { return; }\n\n const options = interaction.target.options;\n\n if (options.resize.square) {\n if (interaction.resizeAxes === 'y') {\n iEvent.dx = iEvent.dy;\n }\n else {\n iEvent.dy = iEvent.dx;\n }\n iEvent.axes = 'xy';\n }\n else {\n iEvent.axes = interaction.resizeAxes;\n\n if (interaction.resizeAxes === 'x') {\n iEvent.dy = 0;\n }\n else if (interaction.resizeAxes === 'y') {\n iEvent.dx = 0;\n }\n }\n});\n\nactions.resize = resize;\nactions.names.push('resize');\nutils.merge(Interactable.eventTypes, [\n 'resizestart',\n 'resizemove',\n 'resizeinertiastart',\n 'resizeinertiaresume',\n 'resizeend',\n]);\nactions.methodDict.resize = 'resizable';\n\ndefaultOptions.resize = resize.defaults;\n\nmodule.exports = resize;\n","const raf = require('./utils/raf');\nconst getWindow = require('./utils/window').getWindow;\nconst is = require('./utils/is');\nconst domUtils = require('./utils/domUtils');\nconst Interaction = require('./Interaction');\nconst defaultOptions = require('./defaultOptions');\n\nconst autoScroll = {\n defaults: {\n enabled : false,\n container: null, // the item that is scrolled (Window or HTMLElement)\n margin : 60,\n speed : 300, // the scroll speed in pixels per second\n },\n\n interaction: null,\n i: null, // the handle returned by window.setInterval\n x: 0, y: 0, // Direction each pulse is to scroll in\n\n isScrolling: false,\n prevTime: 0,\n\n start: function (interaction) {\n autoScroll.isScrolling = true;\n raf.cancel(autoScroll.i);\n\n autoScroll.interaction = interaction;\n autoScroll.prevTime = new Date().getTime();\n autoScroll.i = raf.request(autoScroll.scroll);\n },\n\n stop: function () {\n autoScroll.isScrolling = false;\n raf.cancel(autoScroll.i);\n },\n\n // scroll the window by the values in scroll.x/y\n scroll: function () {\n const options = autoScroll.interaction.target.options[autoScroll.interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(autoScroll.interaction.element);\n const now = new Date().getTime();\n // change in time in seconds\n const dt = (now - autoScroll.prevTime) / 1000;\n // displacement\n const s = options.speed * dt;\n\n if (s >= 1) {\n if (is.window(container)) {\n container.scrollBy(autoScroll.x * s, autoScroll.y * s);\n }\n else if (container) {\n container.scrollLeft += autoScroll.x * s;\n container.scrollTop += autoScroll.y * s;\n }\n\n autoScroll.prevTime = now;\n }\n\n if (autoScroll.isScrolling) {\n raf.cancel(autoScroll.i);\n autoScroll.i = raf.request(autoScroll.scroll);\n }\n },\n check: function (interactable, actionName) {\n const options = interactable.options;\n\n return options[actionName].autoScroll && options[actionName].autoScroll.enabled;\n },\n onInteractionMove: function ({ interaction, pointer }) {\n if (!(interaction.interacting()\n && autoScroll.check(interaction.target, interaction.prepared.name))) {\n return;\n }\n\n if (interaction.simulation) {\n autoScroll.x = autoScroll.y = 0;\n return;\n }\n\n let top;\n let right;\n let bottom;\n let left;\n\n const options = interaction.target.options[interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(interaction.element);\n\n if (is.window(container)) {\n left = pointer.clientX < autoScroll.margin;\n top = pointer.clientY < autoScroll.margin;\n right = pointer.clientX > container.innerWidth - autoScroll.margin;\n bottom = pointer.clientY > container.innerHeight - autoScroll.margin;\n }\n else {\n const rect = domUtils.getElementClientRect(container);\n\n left = pointer.clientX < rect.left + autoScroll.margin;\n top = pointer.clientY < rect.top + autoScroll.margin;\n right = pointer.clientX > rect.right - autoScroll.margin;\n bottom = pointer.clientY > rect.bottom - autoScroll.margin;\n }\n\n autoScroll.x = (right ? 1: left? -1: 0);\n autoScroll.y = (bottom? 1: top? -1: 0);\n\n if (!autoScroll.isScrolling) {\n // set the autoScroll properties to those of the target\n autoScroll.margin = options.margin;\n autoScroll.speed = options.speed;\n\n autoScroll.start(interaction);\n }\n },\n};\n\nInteraction.signals.on('stop-active', function () {\n autoScroll.stop();\n});\n\nInteraction.signals.on('action-move', autoScroll.onInteractionMove);\n\ndefaultOptions.perAction.autoScroll = autoScroll.defaults;\n\nmodule.exports = autoScroll;\n","const Interactable = require('../Interactable');\nconst actions = require('../actions/base');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.ignoreFrom\n [ method ]\n *\n * If the target of the `mousedown`, `pointerdown` or `touchstart`\n * event or any of it's parents match the given CSS selector or\n * Element, no drag/resize/gesture is started.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to not ignore any elements\n = (string | Element | object) The current ignoreFrom value or this Interactable\n **\n | interact(element, { ignoreFrom: document.getElementById('no-action') });\n | // or\n | interact(element).ignoreFrom('input, textarea, a');\n\\*/\nInteractable.prototype.ignoreFrom = function (newValue) {\n return this._backCompatOption('ignoreFrom', newValue);\n};\n\n/*\\\n * Interactable.allowFrom\n [ method ]\n *\n * A drag/resize/gesture is started only If the target of the\n * `mousedown`, `pointerdown` or `touchstart` event or any of it's\n * parents match the given CSS selector or Element.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to allow from any element\n = (string | Element | object) The current allowFrom value or this Interactable\n **\n | interact(element, { allowFrom: document.getElementById('drag-handle') });\n | // or\n | interact(element).allowFrom('.handle');\n\\*/\nInteractable.prototype.allowFrom = function (newValue) {\n return this._backCompatOption('allowFrom', newValue);\n};\n\nInteractable.prototype.testIgnore = function (ignoreFrom, interactableElement, element) {\n if (!ignoreFrom || !is.element(element)) { return false; }\n\n if (is.string(ignoreFrom)) {\n return domUtils.matchesUpTo(element, ignoreFrom, interactableElement);\n }\n else if (is.element(ignoreFrom)) {\n return domUtils.nodeContains(ignoreFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testAllow = function (allowFrom, interactableElement, element) {\n if (!allowFrom) { return true; }\n\n if (!is.element(element)) { return false; }\n\n if (is.string(allowFrom)) {\n return domUtils.matchesUpTo(element, allowFrom, interactableElement);\n }\n else if (is.element(allowFrom)) {\n return domUtils.nodeContains(allowFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testIgnoreAllow = function (options, interactableElement, eventTarget) {\n return (!this.testIgnore(options.ignoreFrom, interactableElement, eventTarget)\n && this.testAllow(options.allowFrom, interactableElement, eventTarget));\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (event.buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\n","const interact = require('../interact');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst actions = require('../actions/base');\nconst defaultOptions = require('../defaultOptions');\nconst browser = require('../utils/browser');\nconst scope = require('../scope');\nconst utils = require('../utils');\nconst signals = require('../utils/Signals').new();\n\nrequire('./InteractableMethods');\n\nconst autoStart = {\n signals,\n withinInteractionLimit,\n // Allow this many interactions to happen simultaneously\n maxInteractions: Infinity,\n defaults: {\n perAction: {\n manualStart: false,\n max: Infinity,\n maxPerElement: 1,\n allowFrom: null,\n ignoreFrom: null,\n },\n },\n setActionDefaults: function (action) {\n utils.extend(action.defaults, autoStart.defaults.perAction);\n },\n};\n\n// set cursor style on mousedown\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget }) {\n if (interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\n// set cursor style on mousemove\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget }) {\n if (!interaction.mouse\n || interaction.pointerIsDown\n || interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\nInteraction.signals.on('move', function (arg) {\n const { interaction, event } = arg;\n\n if (!interaction.pointerIsDown\n || interaction.interacting()\n || !interaction.pointerWasMoved\n || !interaction.prepared.name) {\n return;\n }\n\n signals.fire('before-start', arg);\n\n const target = interaction.target;\n\n if (interaction.prepared.name && target) {\n // check manualStart and interaction limit\n if (target.options[interaction.prepared.name].manualStart\n || !withinInteractionLimit(target, interaction.element, interaction.prepared)) {\n interaction.stop(event);\n }\n else {\n interaction.start(interaction.prepared, target, interaction.element);\n }\n }\n});\n\n// Check if the current target supports the action.\n// If so, return the validated action. Otherwise, return null\nfunction validateAction (action, interactable, element, eventTarget) {\n if (utils.is.object(action)\n && interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget)\n && interactable.options[action.name].enabled\n && withinInteractionLimit(interactable, element, action)) {\n return action;\n }\n\n return null;\n}\n\nfunction validateSelector (interaction, pointer, event, matches, matchElements, eventTarget) {\n for (let i = 0, len = matches.length; i < len; i++) {\n const match = matches[i];\n const matchElement = matchElements[i];\n const action = validateAction(match.getAction(pointer, event, interaction, matchElement),\n match,\n matchElement,\n eventTarget);\n\n if (action) {\n return {\n action,\n target: match,\n element: matchElement,\n };\n }\n }\n\n return {};\n}\n\nfunction getActionInfo (interaction, pointer, event, eventTarget) {\n let matches = [];\n let matchElements = [];\n\n let element = eventTarget;\n let action = null;\n\n function pushMatches (interactable, selector, context) {\n const elements = (browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined);\n\n if (utils.matchesSelector(element, selector, elements)) {\n\n matches.push(interactable);\n matchElements.push(element);\n }\n }\n\n while (utils.is.element(element)) {\n matches = [];\n matchElements = [];\n\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && (action = validateAction(elementInteractable.getAction(pointer, event, interaction, element, eventTarget),\n elementInteractable,\n element,\n eventTarget))\n && !elementInteractable.options[action.name].manualStart) {\n return {\n element,\n action,\n target: elementInteractable,\n };\n }\n else {\n scope.interactables.forEachSelector(pushMatches, element);\n\n const actionInfo = validateSelector(interaction, pointer, event, matches, matchElements, eventTarget);\n\n if (actionInfo.action\n && !actionInfo.target.options[actionInfo.action.name].manualStart) {\n return actionInfo;\n }\n }\n\n element = utils.parentNode(element);\n }\n\n return {};\n}\n\nfunction prepare (interaction, { action, target, element }) {\n action = action || {};\n\n if (interaction.target && interaction.target.options.styleCursor) {\n interaction.target._doc.documentElement.style.cursor = '';\n }\n\n interaction.target = target;\n interaction.element = element;\n utils.copyAction(interaction.prepared, action);\n\n if (target && target.options.styleCursor) {\n const cursor = action? actions[action.name].getCursor(action) : '';\n interaction.target._doc.documentElement.style.cursor = cursor;\n }\n\n signals.fire('prepared', { interaction: interaction });\n}\n\nInteraction.signals.on('stop', function ({ interaction }) {\n const target = interaction.target;\n\n if (target && target.options.styleCursor) {\n target._doc.documentElement.style.cursor = '';\n }\n});\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (utils.is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (utils.is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n const buttons = event.buttons || ({\n 0: 1,\n 1: 4,\n 3: 8,\n 4: 16,\n })[event.button];\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\nfunction withinInteractionLimit (interactable, element, action) {\n const options = interactable.options;\n const maxActions = options[action.name].max;\n const maxPerElement = options[action.name].maxPerElement;\n let activeInteractions = 0;\n let targetCount = 0;\n let targetElementCount = 0;\n\n // no actions if any of these values == 0\n if (!(maxActions && maxPerElement && autoStart.maxInteractions)) { return; }\n\n for (let i = 0, len = scope.interactions.length; i < len; i++) {\n const interaction = scope.interactions[i];\n const otherAction = interaction.prepared.name;\n\n if (!interaction.interacting()) { continue; }\n\n activeInteractions++;\n\n if (activeInteractions >= autoStart.maxInteractions) {\n return false;\n }\n\n if (interaction.target !== interactable) { continue; }\n\n targetCount += (otherAction === action.name)|0;\n\n if (targetCount >= maxActions) {\n return false;\n }\n\n if (interaction.element === element) {\n targetElementCount++;\n\n if (otherAction !== action.name || targetElementCount >= maxPerElement) {\n return false;\n }\n }\n }\n\n return autoStart.maxInteractions > 0;\n}\n\n/*\\\n * interact.maxInteractions\n [ method ]\n **\n * Returns or sets the maximum number of concurrent interactions allowed.\n * By default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables\n * and elements, you need to enable it in the draggable, resizable and\n * gesturable `'max'` and `'maxPerElement'` options.\n **\n - newValue (number) #optional Any number. newValue <= 0 means no interactions.\n\\*/\ninteract.maxInteractions = function (newValue) {\n if (utils.is.number(newValue)) {\n autoStart.maxInteractions = newValue;\n\n return this;\n }\n\n return autoStart.maxInteractions;\n};\n\nInteractable.settingsMethods.push('styleCursor');\nInteractable.settingsMethods.push('actionChecker');\nInteractable.settingsMethods.push('ignoreFrom');\nInteractable.settingsMethods.push('allowFrom');\n\ndefaultOptions.base.actionChecker = null;\ndefaultOptions.base.styleCursor = true;\n\nutils.extend(defaultOptions.perAction, autoStart.defaults.perAction);\n\nmodule.exports = autoStart;\n","const autoStart = require('./base');\nconst Interaction = require('../Interaction');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.delayTimer = null;\n});\n\nautoStart.signals.on('prepared', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.delayTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.target, interaction.element);\n }, delay);\n }\n});\n\nInteraction.signals.on('move', function ({ interaction, duplicate }) {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.delayTimer);\n }\n});\n\n// prevent regular down->move autoStart\nautoStart.signals.on('before-start', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.prepared.name = null;\n }\n});\n","const autoStart = require('./base');\nconst scope = require('../scope');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\n\nconst { matchesSelector, parentNode } = require('../utils/domUtils');\n\nautoStart.setActionDefaults(require('../actions/drag'));\n\nautoStart.signals.on('before-start', function ({ interaction, eventTarget, dx, dy }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // check if a drag is in the correct axis\n const absX = Math.abs(dx);\n const absY = Math.abs(dy);\n const options = interaction.target.options.drag;\n const startAxis = options.startAxis;\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy');\n\n interaction.prepared.axis = options.lockAxis === 'start'\n ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n : options.lockAxis;\n\n // if the movement isn't in the startAxis of the interactable\n if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) {\n // cancel the prepared action\n interaction.prepared.name = null;\n\n // then try to get a drag from another ineractable\n\n if (!interaction.prepared.name) {\n\n let element = eventTarget;\n\n const getDraggable = function (interactable, selector, context) {\n const elements = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n if (interactable === interaction.target) { return; }\n\n if (!options.manualStart\n && !interactable.testIgnoreAllow(options, element, eventTarget)\n && matchesSelector(element, selector, elements)) {\n\n const action = interactable.getAction(interaction.downPointer,\n interaction.downEvent,\n interaction,\n element);\n\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, interactable)\n && autoStart.validateAction(action, interactable, element, eventTarget)) {\n\n return interactable;\n }\n }\n };\n\n let action = null;\n\n // check all interactables\n while (is.element(element)) {\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && elementInteractable !== interaction.target\n && !elementInteractable.options.drag.manualStart) {\n\n action = elementInteractable.getAction(interaction.downPointer, interaction.downEvent, interaction, element);\n }\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, elementInteractable)) {\n\n interaction.prepared.name = 'drag';\n interaction.target = elementInteractable;\n interaction.element = element;\n break;\n }\n\n const selectorInteractable = scope.interactables.forEachSelector(getDraggable, element);\n\n if (selectorInteractable) {\n interaction.prepared.name = 'drag';\n interaction.target = selectorInteractable;\n interaction.element = element;\n break;\n }\n\n element = parentNode(element);\n }\n }\n }\n});\n\nfunction checkStartAxis (startAxis, interactable) {\n if (!interactable) { return false; }\n\n const thisAxis = interactable.options.drag.startAxis;\n\n return (startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis);\n}\n","require('./base').setActionDefaults(require('../actions/gesture'));\n","require('./base').setActionDefaults(require('../actions/resize'));\n","module.exports = {\n base: {\n accept : null,\n preventDefault: 'auto',\n deltaSource : 'page',\n },\n\n perAction: {\n origin: { x: 0, y: 0 },\n\n // only allow left button by default\n // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n mouseButtons: 1,\n\n inertia: {\n enabled : false,\n resistance : 10, // the lambda in exponential decay\n minSpeed : 100, // target speed must be above this for inertia to start\n endSpeed : 10, // the speed at which inertia is slow enough to stop\n allowResume : true, // allow resuming an action in inertia phase\n smoothEndDuration: 300, // animate to snap/restrict endOnly if there's no inertia\n },\n },\n};\n","/* browser entry point */\n\n// Legacy browser support\nrequire('./legacyBrowsers');\n\n// inertia\nrequire('./inertia');\n\n// modifiers\nrequire('./modifiers/snap');\nrequire('./modifiers/restrict');\n\n// pointerEvents\nrequire('./pointerEvents/base');\nrequire('./pointerEvents/holdRepeat');\nrequire('./pointerEvents/interactableTargets');\n\n// delay\nrequire('./autoStart/delay');\n\n// actions\nrequire('./actions/gesture');\nrequire('./actions/resize');\nrequire('./actions/drag');\nrequire('./actions/drop');\n\n// load these modifiers after resize is loaded\nrequire('./modifiers/snapSize');\nrequire('./modifiers/restrictEdges');\nrequire('./modifiers/restrictSize');\n\n// autoStart actions\nrequire('./autoStart/gesture');\nrequire('./autoStart/resize');\nrequire('./autoStart/drag');\n\n// Interactable preventDefault setting\nrequire('./interactablePreventDefault.js');\n\n// autoScroll\nrequire('./autoScroll');\n\n// export interact\nmodule.exports = require('./interact');\n","const InteractEvent = require('./InteractEvent');\nconst Interaction = require('./Interaction');\nconst modifiers = require('./modifiers');\nconst utils = require('./utils');\nconst animationFrame = require('./utils/raf');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.inertiaStatus = {\n active : false,\n smoothEnd : false,\n allowResume: false,\n\n startEvent: null,\n upCoords : {},\n\n xe: 0, ye: 0,\n sx: 0, sy: 0,\n\n t0: 0,\n vx0: 0, vys: 0,\n duration: 0,\n\n lambda_v0: 0,\n one_ve_v0: 0,\n i : null,\n };\n\n interaction.boundInertiaFrame = () => inertiaFrame .apply(interaction);\n interaction.boundSmoothEndFrame = () => smoothEndFrame.apply(interaction);\n});\n\nInteraction.signals.on('down', function ({ interaction, event, pointer, eventTarget }) {\n const status = interaction.inertiaStatus;\n\n // Check if the down event hits the current inertia target\n if (status.active) {\n let element = eventTarget;\n\n // climb up the DOM tree from the event target\n while (utils.is.element(element)) {\n\n // if interaction element is the current inertia target element\n if (element === interaction.element) {\n // stop inertia\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n\n // update pointers to the down event's coordinates\n interaction.updatePointer(pointer);\n utils.setCoords(interaction.curCoords, interaction.pointers);\n\n // fire appropriate signals\n const signalArg = { interaction };\n Interaction.signals.fire('before-action-move', signalArg);\n Interaction.signals.fire('action-resume' , signalArg);\n\n // fire a reume event\n const resumeEvent = new InteractEvent(interaction,\n event,\n interaction.prepared.name,\n 'inertiaresume',\n interaction.element);\n\n interaction.target.fire(resumeEvent);\n interaction.prevEvent = resumeEvent;\n modifiers.resetStatuses(interaction.modifierStatuses);\n\n utils.copyCoords(interaction.prevCoords, interaction.curCoords);\n break;\n }\n\n element = utils.parentNode(element);\n }\n }\n});\n\nInteraction.signals.on('up', function ({ interaction, event }) {\n const status = interaction.inertiaStatus;\n\n if (!interaction.interacting() || status.active) { return; }\n\n const target = interaction.target;\n const options = target && target.options;\n const inertiaOptions = options && interaction.prepared.name && options[interaction.prepared.name].inertia;\n\n const now = new Date().getTime();\n const statuses = {};\n const page = utils.extend({}, interaction.curCoords.page);\n const pointerSpeed = interaction.pointerDelta.client.speed;\n\n let smoothEnd = false;\n let modifierResult;\n\n // check if inertia should be started\n const inertiaPossible = (inertiaOptions && inertiaOptions.enabled\n && interaction.prepared.name !== 'gesture'\n && event !== status.startEvent);\n\n const inertia = (inertiaPossible\n && (now - interaction.curCoords.timeStamp) < 50\n && pointerSpeed > inertiaOptions.minSpeed\n && pointerSpeed > inertiaOptions.endSpeed);\n\n const modifierArg = {\n interaction,\n pageCoords: page,\n statuses,\n preEnd: true,\n requireEndOnly: true,\n };\n\n // smoothEnd\n if (inertiaPossible && !inertia) {\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n if (modifierResult.shouldMove && modifierResult.locked) {\n smoothEnd = true;\n }\n }\n\n if (!(inertia || smoothEnd)) { return; }\n\n utils.copyCoords(status.upCoords, interaction.curCoords);\n\n interaction.pointers[0] = status.startEvent =\n new InteractEvent(interaction, event, interaction.prepared.name, 'inertiastart', interaction.element);\n\n status.t0 = now;\n\n status.active = true;\n status.allowResume = inertiaOptions.allowResume;\n interaction.simulation = status;\n\n target.fire(status.startEvent);\n\n if (inertia) {\n status.vx0 = interaction.pointerDelta.client.vx;\n status.vy0 = interaction.pointerDelta.client.vy;\n status.v0 = pointerSpeed;\n\n calcInertia(interaction, status);\n\n utils.extend(page, interaction.curCoords.page);\n\n page.x += status.xe;\n page.y += status.ye;\n\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n status.modifiedXe += modifierResult.dx;\n status.modifiedYe += modifierResult.dy;\n\n status.i = animationFrame.request(interaction.boundInertiaFrame);\n }\n else {\n status.smoothEnd = true;\n status.xe = modifierResult.dx;\n status.ye = modifierResult.dy;\n\n status.sx = status.sy = 0;\n\n status.i = animationFrame.request(interaction.boundSmoothEndFrame);\n }\n});\n\nInteraction.signals.on('stop-active', function ({ interaction }) {\n const status = interaction.inertiaStatus;\n\n if (status.active) {\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n }\n});\n\nfunction calcInertia (interaction, status) {\n const inertiaOptions = interaction.target.options[interaction.prepared.name].inertia;\n const lambda = inertiaOptions.resistance;\n const inertiaDur = -Math.log(inertiaOptions.endSpeed / status.v0) / lambda;\n\n status.x0 = interaction.prevEvent.pageX;\n status.y0 = interaction.prevEvent.pageY;\n status.t0 = status.startEvent.timeStamp / 1000;\n status.sx = status.sy = 0;\n\n status.modifiedXe = status.xe = (status.vx0 - inertiaDur) / lambda;\n status.modifiedYe = status.ye = (status.vy0 - inertiaDur) / lambda;\n status.te = inertiaDur;\n\n status.lambda_v0 = lambda / status.v0;\n status.one_ve_v0 = 1 - inertiaOptions.endSpeed / status.v0;\n}\n\nfunction inertiaFrame () {\n updateInertiaCoords(this);\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n\n const status = this.inertiaStatus;\n const options = this.target.options[this.prepared.name].inertia;\n const lambda = options.resistance;\n const t = new Date().getTime() / 1000 - status.t0;\n\n if (t < status.te) {\n\n const progress = 1 - (Math.exp(-lambda * t) - status.lambda_v0) / status.one_ve_v0;\n\n if (status.modifiedXe === status.xe && status.modifiedYe === status.ye) {\n status.sx = status.xe * progress;\n status.sy = status.ye * progress;\n }\n else {\n const quadPoint = utils.getQuadraticCurvePoint(0, 0,\n status.xe,\n status.ye,\n status.modifiedXe,\n status.modifiedYe,\n progress);\n\n status.sx = quadPoint.x;\n status.sy = quadPoint.y;\n }\n\n this.doMove();\n\n status.i = animationFrame.request(this.boundInertiaFrame);\n }\n else {\n status.sx = status.modifiedXe;\n status.sy = status.modifiedYe;\n\n this.doMove();\n this.end(status.startEvent);\n status.active = false;\n this.simulation = null;\n }\n\n utils.copyCoords(this.prevCoords, this.curCoords);\n}\n\nfunction smoothEndFrame () {\n updateInertiaCoords(this);\n\n const status = this.inertiaStatus;\n const t = new Date().getTime() - status.t0;\n const duration = this.target.options[this.prepared.name].inertia.smoothEndDuration;\n\n if (t < duration) {\n status.sx = utils.easeOutQuad(t, 0, status.xe, duration);\n status.sy = utils.easeOutQuad(t, 0, status.ye, duration);\n\n this.pointerMove(status.startEvent, status.startEvent);\n\n status.i = animationFrame.request(this.boundSmoothEndFrame);\n }\n else {\n status.sx = status.xe;\n status.sy = status.ye;\n\n this.pointerMove(status.startEvent, status.startEvent);\n this.end(status.startEvent);\n\n status.smoothEnd =\n status.active = false;\n this.simulation = null;\n }\n}\n\nfunction updateInertiaCoords (interaction) {\n const status = interaction.inertiaStatus;\n\n // return if inertia isn't running\n if (!status.active) { return; }\n\n const pageUp = status.upCoords.page;\n const clientUp = status.upCoords.client;\n\n utils.setCoords(interaction.curCoords, [ {\n pageX : pageUp.x + status.sx,\n pageY : pageUp.y + status.sy,\n clientX: clientUp.x + status.sx,\n clientY: clientUp.y + status.sy,\n } ]);\n}\n","const browser = require('./utils/browser');\nconst events = require('./utils/events');\nconst utils = require('./utils');\nconst scope = require('./scope');\nconst Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\n\nconst globalEvents = {};\n\n/*\\\n * interact\n [ method ]\n *\n * The methods of this variable can be used to set elements as\n * interactables and also to change various default settings.\n *\n * Calling it as a function and passing an element or a valid CSS selector\n * string returns an Interactable object which has various methods to\n * configure it.\n *\n - element (Element | string) The HTML or SVG Element to interact with or CSS selector\n = (object) An @Interactable\n *\n > Usage\n | interact('#draggable').draggable(true);\n |\n | var rectables = interact('rect');\n | rectables\n | .gesturable(true)\n | .on('gesturemove', function (event) {\n | // ...\n | });\n\\*/\nfunction interact (element, options) {\n let interactable = scope.interactables.get(element, options);\n\n if (!interactable) {\n interactable = new Interactable(element, options);\n interactable.events.global = globalEvents;\n }\n\n return interactable;\n}\n\n/*\\\n * interact.isSet\n [ method ]\n *\n * Check if an element has been set\n - element (Element) The Element being searched for\n = (boolean) Indicates if the element or CSS selector was previously passed to interact\n\\*/\ninteract.isSet = function (element, options) {\n return scope.interactables.indexOfElement(element, options && options.context) !== -1;\n};\n\n/*\\\n * interact.on\n [ method ]\n *\n * Adds a global listener for an InteractEvent or adds a DOM event to\n * `document`\n *\n - type (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) interact\n\\*/\ninteract.on = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.on(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.on(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n // if it is an InteractEvent type, add listener to globalEvents\n if (utils.contains(Interactable.eventTypes, type)) {\n // if this type of event was never bound\n if (!globalEvents[type]) {\n globalEvents[type] = [listener];\n }\n else {\n globalEvents[type].push(listener);\n }\n }\n // If non InteractEvent type, addEventListener to document\n else {\n events.add(scope.document, type, listener, { options });\n }\n\n return interact;\n};\n\n/*\\\n * interact.off\n [ method ]\n *\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n - type (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) interact\n \\*/\ninteract.off = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.off(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.off(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n if (!utils.contains(Interactable.eventTypes, type)) {\n events.remove(scope.document, type, listener, options);\n }\n else {\n let index;\n\n if (type in globalEvents\n && (index = utils.indexOf(globalEvents[type], listener)) !== -1) {\n globalEvents[type].splice(index, 1);\n }\n }\n\n return interact;\n};\n\n/*\\\n * interact.debug\n [ method ]\n *\n * Returns an object which exposes internal data\n = (object) An object with properties that outline the current state and expose internal functions and variables\n\\*/\ninteract.debug = function () {\n return scope;\n};\n\n// expose the functions used to calculate multi-touch properties\ninteract.getPointerAverage = utils.pointerAverage;\ninteract.getTouchBBox = utils.touchBBox;\ninteract.getTouchDistance = utils.touchDistance;\ninteract.getTouchAngle = utils.touchAngle;\n\ninteract.getElementRect = utils.getElementRect;\ninteract.getElementClientRect = utils.getElementClientRect;\ninteract.matchesSelector = utils.matchesSelector;\ninteract.closest = utils.closest;\n\n/*\\\n * interact.supportsTouch\n [ method ]\n *\n = (boolean) Whether or not the browser supports touch input\n\\*/\ninteract.supportsTouch = function () {\n return browser.supportsTouch;\n};\n\n/*\\\n * interact.supportsPointerEvent\n [ method ]\n *\n = (boolean) Whether or not the browser supports PointerEvents\n\\*/\ninteract.supportsPointerEvent = function () {\n return browser.supportsPointerEvent;\n};\n\n/*\\\n * interact.stop\n [ method ]\n *\n * Cancels all interactions (end events are not fired)\n *\n - event (Event) An event on which to call preventDefault()\n = (object) interact\n\\*/\ninteract.stop = function (event) {\n for (let i = scope.interactions.length - 1; i >= 0; i--) {\n scope.interactions[i].stop(event);\n }\n\n return interact;\n};\n\n/*\\\n * interact.pointerMoveTolerance\n [ method ]\n * Returns or sets the distance the pointer must be moved before an action\n * sequence occurs. This also affects tolerance for tap events.\n *\n - newValue (number) #optional The movement from the start position must be greater than this value\n = (number | Interactable) The current setting or interact\n\\*/\ninteract.pointerMoveTolerance = function (newValue) {\n if (utils.is.number(newValue)) {\n Interaction.pointerMoveTolerance = newValue;\n\n return this;\n }\n\n return Interaction.pointerMoveTolerance;\n};\n\ninteract.addDocument = scope.addDocument;\ninteract.removeDocument = scope.removeDocument;\n\nscope.interact = interact;\n\nmodule.exports = interact;\n","const Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\nconst scope = require('./scope');\nconst is = require('./utils/is');\nconst events = require('./utils/events');\n\nconst { nodeContains, matchesSelector } = require('./utils/domUtils');\n\n/*\\\n * Interactable.preventDefault\n [ method ]\n *\n * Returns or sets whether to prevent the browser's default behaviour\n * in response to pointer events. Can be set to:\n * - `'always'` to always prevent\n * - `'never'` to never prevent\n * - `'auto'` to let interact.js try to determine what would be best\n *\n - newValue (string) #optional `true`, `false` or `'auto'`\n = (string | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.preventDefault = function (newValue) {\n if (/^(always|never|auto)$/.test(newValue)) {\n this.options.preventDefault = newValue;\n return this;\n }\n\n if (is.bool(newValue)) {\n this.options.preventDefault = newValue? 'always' : 'never';\n return this;\n }\n\n return this.options.preventDefault;\n};\n\nInteractable.prototype.checkAndPreventDefault = function (event) {\n const setting = this.options.preventDefault;\n\n if (setting === 'never') { return; }\n\n if (setting === 'always') {\n event.preventDefault();\n return;\n }\n\n // setting === 'auto'\n\n // don't preventDefault if the browser supports passiveEvents\n // CSS touch-action and user-selecct should be used instead\n if (events.supportsOptions) {\n return;\n }\n\n // don't preventDefault of pointerdown events\n if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) {\n return;\n }\n\n // don't preventDefault on editable elements\n if (is.element(event.target)\n && matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) {\n return;\n }\n\n event.preventDefault();\n};\n\nfunction onInteractionEvent ({ interaction, event }) {\n if (interaction.target) {\n interaction.target.checkAndPreventDefault(event);\n }\n}\n\nfor (const eventSignal of ['down', 'move', 'up', 'cancel']) {\n Interaction.signals.on(eventSignal, onInteractionEvent);\n}\n\n// prevent native HTML5 drag on interact.js target elements\nInteraction.docEvents.dragstart = function preventNativeDrag (event) {\n for (const interaction of scope.interactions) {\n\n if (interaction.element\n && (interaction.element === event.target\n || nodeContains(interaction.element, event.target))) {\n\n interaction.target.checkAndPreventDefault(event);\n return;\n }\n }\n};\n","const scope = require('./scope');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst iFinder = require('./utils/interactionFinder');\nconst pointerEvents = require('./pointerEvents/base');\n\nconst { window } = require('./utils/window');\n\nconst toString = Object.prototype.toString;\n\nif (!window.Array.isArray) {\n window.Array.isArray = function (obj) {\n return toString.call(obj) === '[object Array]';\n };\n}\n\nif (!String.prototype.trim) {\n String.prototype.trim = function () {\n return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n };\n}\n\n// http://www.quirksmode.org/dom/events/click.html\n// >Events leading to dblclick\n//\n// IE8 doesn't fire down event before dblclick.\n// This workaround tries to fire a tap and doubletap after dblclick\nfunction onIE8Dblclick (event) {\n const eventTarget = event.target;\n const interaction = iFinder.search(event, event.type, eventTarget);\n\n if (!interaction) { return; }\n\n if (interaction.prevTap\n && event.clientX === interaction.prevTap.clientX\n && event.clientY === interaction.prevTap.clientY\n && eventTarget === interaction.prevTap.target) {\n\n interaction.downTargets[0] = eventTarget;\n interaction.downTimes [0] = new Date().getTime();\n\n pointerEvents.fire({\n interaction,\n event,\n eventTarget,\n pointer: event,\n type: 'tap',\n });\n }\n}\n\nif (browser.isIE8) {\n const selectFix = function (event) {\n for (const interaction of scope.interactions) {\n if (interaction.interacting()) {\n interaction.target.checkAndPreventDefault(event);\n }\n }\n };\n\n const onDocIE8 = function onDocIE8 ({ doc, win }, signalName) {\n const eventMethod = signalName.indexOf('listen') === 0\n ? events.add : events.remove;\n\n // For IE's lack of Event#preventDefault\n eventMethod(doc, 'selectstart', selectFix);\n\n if (pointerEvents) {\n eventMethod(doc, 'dblclick', onIE8Dblclick);\n }\n };\n\n scope.signals.on('add-document' , onDocIE8);\n scope.signals.on('remove-document', onDocIE8);\n}\n\nmodule.exports = null;\n","const InteractEvent = require('../InteractEvent');\nconst Interaction = require('../Interaction');\nconst extend = require('../utils/extend');\n\nconst modifiers = {\n names: [],\n\n setOffsets: function (arg) {\n const { interaction, pageCoords: page } = arg;\n const { target, element, startOffset } = interaction;\n const rect = target.getRect(element);\n\n if (rect) {\n startOffset.left = page.x - rect.left;\n startOffset.top = page.y - rect.top;\n\n startOffset.right = rect.right - page.x;\n startOffset.bottom = rect.bottom - page.y;\n\n if (!('width' in rect)) { rect.width = rect.right - rect.left; }\n if (!('height' in rect)) { rect.height = rect.bottom - rect.top ; }\n }\n else {\n startOffset.left = startOffset.top = startOffset.right = startOffset.bottom = 0;\n }\n\n arg.rect = rect;\n arg.interactable = target;\n arg.element = element;\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n\n arg.options = target.options[interaction.prepared.name][modifierName];\n\n if (!arg.options) {\n continue;\n }\n\n interaction.modifierOffsets[modifierName] = modifiers[modifierName].setOffset(arg);\n }\n },\n\n setAll: function (arg) {\n const { interaction, statuses, preEnd, requireEndOnly } = arg;\n const coords = extend({}, arg.pageCoords);\n const result = {\n dx: 0,\n dy: 0,\n changed: false,\n locked: false,\n shouldMove: true,\n };\n\n for (const modifierName of modifiers.names) {\n const modifier = modifiers[modifierName];\n const options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!shouldDo(options, preEnd, requireEndOnly)) { continue; }\n\n arg.status = arg.status = statuses[modifierName];\n arg.options = options;\n arg.offset = arg.interaction.modifierOffsets[modifierName];\n\n modifier.set(arg);\n\n if (arg.status.locked) {\n coords.x += arg.status.dx;\n coords.y += arg.status.dy;\n\n result.dx += arg.status.dx;\n result.dy += arg.status.dy;\n\n result.locked = true;\n }\n }\n\n // a move should be fired if:\n // - there are no modifiers enabled,\n // - no modifiers are \"locked\" i.e. have changed the pointer's coordinates, or\n // - the locked coords have changed since the last pointer move\n result.shouldMove = !arg.status || !result.locked || arg.status.changed;\n\n return result;\n },\n\n resetStatuses: function (statuses) {\n for (const modifierName of modifiers.names) {\n const status = statuses[modifierName] || {};\n\n status.dx = status.dy = 0;\n status.modifiedX = status.modifiedY = NaN;\n status.locked = false;\n status.changed = true;\n\n statuses[modifierName] = status;\n }\n\n return statuses;\n },\n\n start: function ({ interaction }, signalName) {\n const arg = {\n interaction,\n pageCoords: (signalName === 'action-resume' ?\n interaction.curCoords : interaction.startCoords).page,\n startOffset: interaction.startOffset,\n statuses: interaction.modifierStatuses,\n preEnd: false,\n requireEndOnly: false,\n };\n\n modifiers.setOffsets(arg);\n modifiers.resetStatuses(arg.statuses);\n\n arg.pageCoords = extend({}, interaction.startCoords.page);\n interaction.modifierResult = modifiers.setAll(arg);\n },\n};\n\nInteraction.signals.on('new', function (interaction) {\n interaction.startOffset = { left: 0, right: 0, top: 0, bottom: 0 };\n interaction.modifierOffsets = {};\n interaction.modifierStatuses = modifiers.resetStatuses({});\n interaction.modifierResult = null;\n});\n\nInteraction.signals.on('action-start' , modifiers.start);\nInteraction.signals.on('action-resume', modifiers.start);\n\nInteraction.signals.on('before-action-move', function ({ interaction, preEnd, interactingBeforeMove }) {\n const modifierResult = modifiers.setAll({\n interaction,\n preEnd,\n pageCoords: interaction.curCoords.page,\n statuses: interaction.modifierStatuses,\n requireEndOnly: false,\n });\n\n // don't fire an action move if a modifier would keep the event in the same\n // cordinates as before\n if (!modifierResult.shouldMove && interactingBeforeMove) {\n interaction._dontFireMove = true;\n }\n\n interaction.modifierResult = modifierResult;\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n for (let i = 0; i < modifiers.names.length; i++) {\n const options = interaction.target.options[interaction.prepared.name][modifiers.names[i]];\n\n // if the endOnly option is true for any modifier\n if (shouldDo(options, true, true)) {\n // fire a move event at the modified coordinates\n interaction.doMove({ event, preEnd: true });\n break;\n }\n }\n});\n\nInteractEvent.signals.on('set-xy', function (arg) {\n const { iEvent, interaction } = arg;\n const modifierArg = extend({}, arg);\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n modifierArg.options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!modifierArg.options) {\n continue;\n }\n\n const modifier = modifiers[modifierName];\n\n modifierArg.status = interaction.modifierStatuses[modifierName];\n\n iEvent[modifierName] = modifier.modifyCoords(modifierArg);\n }\n});\n\nfunction shouldDo (options, preEnd, requireEndOnly) {\n return (options && options.enabled\n && (preEnd || !options.endOnly)\n && (!requireEndOnly || options.endOnly));\n}\n\nmodule.exports = modifiers;\n","const modifiers = require('./index');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst restrict = {\n defaults: {\n enabled : false,\n endOnly : false,\n restriction: null,\n elementRect: null,\n },\n\n setOffset: function ({ rect, startOffset, options }) {\n const elementRect = options && options.elementRect;\n const offset = {};\n\n if (rect && elementRect) {\n offset.left = startOffset.left - (rect.width * elementRect.left);\n offset.top = startOffset.top - (rect.height * elementRect.top);\n\n offset.right = startOffset.right - (rect.width * (1 - elementRect.right));\n offset.bottom = startOffset.bottom - (rect.height * (1 - elementRect.bottom));\n }\n else {\n offset.left = offset.top = offset.right = offset.bottom = 0;\n }\n\n return offset;\n },\n\n set: function ({ pageCoords, interaction, status, options }) {\n if (!options) { return status; }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n\n const restriction = getRestrictionRect(options.restriction, interaction, page);\n\n if (!restriction) { return status; }\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n const rect = restriction;\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n const offset = interaction.modifierOffsets.restrict;\n\n // object is assumed to have\n // x, y, width, height or\n // left, top, right, bottom\n if ('x' in restriction && 'y' in restriction) {\n modifiedX = Math.max(Math.min(rect.x + rect.width - offset.right , page.x), rect.x + offset.left);\n modifiedY = Math.max(Math.min(rect.y + rect.height - offset.bottom, page.y), rect.y + offset.top );\n }\n else {\n modifiedX = Math.max(Math.min(rect.right - offset.right , page.x), rect.left + offset.left);\n modifiedY = Math.max(Math.min(rect.bottom - offset.bottom, page.y), rect.top + offset.top );\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const elementRect = options && options.elementRect;\n\n if (options && options.enabled\n && !(phase === 'start' && elementRect && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n getRestrictionRect,\n};\n\nfunction getRestrictionRect (value, interaction, page) {\n if (utils.is.function(value)) {\n return utils.resolveRectLike(value, interaction.target, interaction.element, [page.x, page.y, interaction]);\n } else {\n return utils.resolveRectLike(value, interaction.target, interaction.element);\n }\n}\n\nmodifiers.restrict = restrict;\nmodifiers.names.push('restrict');\n\ndefaultOptions.perAction.restrict = restrict.defaults;\n\nmodule.exports = restrict;\n","// This module adds the options.resize.restrictEdges setting which sets min and\n// max for the top, left, bottom and right edges of the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictEdges: {\n// inner: { top: 200, left: 200, right: 400, bottom: 400 },\n// outer: { top: 0, left: 0, right: 600, bottom: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst { getRestrictionRect } = require('./restrict');\n\nconst noInner = { top: +Infinity, left: +Infinity, bottom: -Infinity, right: -Infinity };\nconst noOuter = { top: -Infinity, left: -Infinity, bottom: +Infinity, right: +Infinity };\n\nconst restrictEdges = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n offset: null,\n },\n\n setOffset: function ({ interaction, startOffset, options }) {\n if (!options) {\n return utils.extend({}, startOffset);\n }\n\n const offset = getRestrictionRect(options.offset, interaction, interaction.startCoords.page);\n\n if (offset) {\n return {\n top: startOffset.top + offset.y,\n left: startOffset.left + offset.x,\n bottom: startOffset.bottom + offset.y,\n right: startOffset.right + offset.x,\n };\n }\n\n return startOffset;\n },\n\n set: function ({ pageCoords, interaction, status, offset, options }) {\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n const inner = rectUtils.xywhToTlbr(getRestrictionRect(options.inner, interaction, page)) || noInner;\n const outer = rectUtils.xywhToTlbr(getRestrictionRect(options.outer, interaction, page)) || noOuter;\n\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n if (edges.top) {\n modifiedY = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top);\n }\n else if (edges.bottom) {\n modifiedY = Math.max(Math.min(outer.bottom - offset.bottom, page.y), inner.bottom - offset.bottom);\n }\n if (edges.left) {\n modifiedX = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left);\n }\n else if (edges.right) {\n modifiedX = Math.max(Math.min(outer.right - offset.right, page.x), inner.right - offset.right);\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n if (options && options.enabled\n && !(phase === 'start' && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n noInner,\n noOuter,\n getRestrictionRect,\n};\n\nmodifiers.restrictEdges = restrictEdges;\nmodifiers.names.push('restrictEdges');\n\ndefaultOptions.perAction.restrictEdges = restrictEdges.defaults;\nresize.defaults.restrictEdges = restrictEdges.defaults;\n\nmodule.exports = restrictEdges;\n","// This module adds the options.resize.restrictSize setting which sets min and\n// max width and height for the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictSize: {\n// min: { width: -600, height: -600 },\n// max: { width: 600, height: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst restrictEdges = require('./restrictEdges');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst noMin = { width: -Infinity, height: -Infinity };\nconst noMax = { width: +Infinity, height: +Infinity };\n\nconst restrictSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n },\n\n setOffset: function ({ interaction }) {\n return interaction.startOffset;\n },\n\n set: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const rect = rectUtils.xywhToTlbr(interaction.resizeRects.inverted);\n\n const minSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.min, interaction)) || noMin;\n const maxSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.max, interaction)) || noMax;\n\n arg.options = {\n enabled: options.enabled,\n endOnly: options.endOnly,\n inner: utils.extend({}, restrictEdges.noInner),\n outer: utils.extend({}, restrictEdges.noOuter),\n };\n\n if (edges.top) {\n arg.options.inner.top = rect.bottom - minSize.height;\n arg.options.outer.top = rect.bottom - maxSize.height;\n }\n else if (edges.bottom) {\n arg.options.inner.bottom = rect.top + minSize.height;\n arg.options.outer.bottom = rect.top + maxSize.height;\n }\n if (edges.left) {\n arg.options.inner.left = rect.right - minSize.width;\n arg.options.outer.left = rect.right - maxSize.width;\n }\n else if (edges.right) {\n arg.options.inner.right = rect.left + minSize.width;\n arg.options.outer.right = rect.left + maxSize.width;\n }\n\n restrictEdges.set(arg);\n },\n\n modifyCoords: restrictEdges.modifyCoords,\n};\n\nmodifiers.restrictSize = restrictSize;\nmodifiers.names.push('restrictSize');\n\ndefaultOptions.perAction.restrictSize = restrictSize.defaults;\nresize.defaults.restrictSize = restrictSize.defaults;\n\nmodule.exports = restrictSize;\n","const modifiers = require('./index');\nconst interact = require('../interact');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst snap = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n\n relativePoints: null,\n },\n\n setOffset: function ({ interaction, interactable, element, rect, startOffset, options }) {\n const offsets = [];\n const optionsOrigin = utils.rectToXY(utils.resolveRectLike(options.origin));\n const origin = optionsOrigin || utils.getOriginXY(interactable, element, interaction.prepared.name);\n options = options || interactable.options[interaction.prepared.name].snap || {};\n\n let snapOffset;\n\n if (options.offset === 'startCoords') {\n snapOffset = {\n x: interaction.startCoords.page.x - origin.x,\n y: interaction.startCoords.page.y - origin.y,\n };\n }\n else {\n const offsetRect = utils.resolveRectLike(options.offset, interactable, element, [interaction]);\n\n snapOffset = utils.rectToXY(offsetRect) || { x: 0, y: 0 };\n }\n\n if (rect && options.relativePoints && options.relativePoints.length) {\n for (const { x: relativeX, y: relativeY } of options.relativePoints) {\n offsets.push({\n x: startOffset.left - (rect.width * relativeX) + snapOffset.x,\n y: startOffset.top - (rect.height * relativeY) + snapOffset.y,\n });\n }\n }\n else {\n offsets.push(snapOffset);\n }\n\n return offsets;\n },\n\n set: function ({ interaction, pageCoords, status, options, offset: offsets }) {\n const targets = [];\n let target;\n let page;\n let i;\n\n if (status.useStatusXY) {\n page = { x: status.x, y: status.y };\n }\n else {\n const origin = utils.getOriginXY(interaction.target, interaction.element, interaction.prepared.name);\n\n page = utils.extend({}, pageCoords);\n\n page.x -= origin.x;\n page.y -= origin.y;\n }\n\n status.realX = page.x;\n status.realY = page.y;\n\n let len = options.targets? options.targets.length : 0;\n\n for (const { x: offsetX, y: offsetY } of offsets) {\n const relativeX = page.x - offsetX;\n const relativeY = page.y - offsetY;\n\n for (const snapTarget of options.targets) {\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n targets.push({\n x: utils.is.number(target.x) ? (target.x + offsetX) : relativeX,\n y: utils.is.number(target.y) ? (target.y + offsetY) : relativeY,\n\n range: utils.is.number(target.range)? target.range: options.range,\n });\n }\n }\n\n const closest = {\n target: null,\n inRange: false,\n distance: 0,\n range: 0,\n dx: 0,\n dy: 0,\n };\n\n for (i = 0, len = targets.length; i < len; i++) {\n target = targets[i];\n\n const range = target.range;\n const dx = target.x - page.x;\n const dy = target.y - page.y;\n const distance = utils.hypot(dx, dy);\n let inRange = distance <= range;\n\n // Infinite targets count as being out of range\n // compared to non infinite ones that are in range\n if (range === Infinity && closest.inRange && closest.range !== Infinity) {\n inRange = false;\n }\n\n if (!closest.target || (inRange\n // is the closest target in range?\n ? (closest.inRange && range !== Infinity\n // the pointer is relatively deeper in this target\n ? distance / range < closest.distance / closest.range\n // this target has Infinite range and the closest doesn't\n : (range === Infinity && closest.range !== Infinity)\n // OR this target is closer that the previous closest\n || distance < closest.distance)\n // The other is not in range and the pointer is closer to this target\n : (!closest.inRange && distance < closest.distance))) {\n\n closest.target = target;\n closest.distance = distance;\n closest.range = range;\n closest.inRange = inRange;\n closest.dx = dx;\n closest.dy = dy;\n\n status.range = range;\n }\n }\n\n let snapChanged;\n\n if (closest.target) {\n snapChanged = (status.modifiedX !== closest.target.x || status.modifiedY !== closest.target.y);\n\n status.modifiedX = closest.target.x;\n status.modifiedY = closest.target.y;\n }\n else {\n snapChanged = true;\n\n status.modifiedX = NaN;\n status.modifiedY = NaN;\n }\n\n status.dx = closest.dx;\n status.dy = closest.dy;\n\n status.changed = (snapChanged || (closest.inRange && !status.locked));\n status.locked = closest.inRange;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const relativePoints = options && options.relativePoints;\n\n if (options && options.enabled\n && !(phase === 'start' && relativePoints && relativePoints.length)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n }\n\n return {\n range : status.range,\n locked : status.locked,\n x : status.modifiedX,\n y : status.modifiedY,\n realX : status.realX,\n realY : status.realY,\n dx : status.dx,\n dy : status.dy,\n };\n }\n },\n};\n\ninteract.createSnapGrid = function (grid) {\n return function (x, y) {\n const limits = grid.limits || {\n left : -Infinity,\n right : Infinity,\n top : -Infinity,\n bottom: Infinity,\n };\n let offsetX = 0;\n let offsetY = 0;\n\n if (utils.is.object(grid.offset)) {\n offsetX = grid.offset.x;\n offsetY = grid.offset.y;\n }\n\n const gridx = Math.round((x - offsetX) / grid.x);\n const gridy = Math.round((y - offsetY) / grid.y);\n\n const newX = Math.max(limits.left, Math.min(limits.right , gridx * grid.x + offsetX));\n const newY = Math.max(limits.top , Math.min(limits.bottom, gridy * grid.y + offsetY));\n\n return {\n x: newX,\n y: newY,\n range: grid.range,\n };\n };\n};\n\nmodifiers.snap = snap;\nmodifiers.names.push('snap');\n\ndefaultOptions.perAction.snap = snap.defaults;\n\nmodule.exports = snap;\n","// This module allows snapping of the size of targets during resize\n// interactions.\n\nconst modifiers = require('./index');\nconst snap = require('./snap');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\nconst utils = require('../utils/');\n\nconst snapSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n },\n\n setOffset: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.edges;\n\n if (!edges) { return; }\n\n arg.options = {\n relativePoints: [{\n x: edges.left? 0 : 1,\n y: edges.top ? 0 : 1,\n }],\n origin: { x: 0, y: 0 },\n offset: 'self',\n range: options.range,\n };\n\n const offsets = snap.setOffset(arg);\n arg.options = options;\n\n return offsets;\n },\n\n set: function (arg) {\n const { interaction, options, offset, pageCoords } = arg;\n const page = utils.extend({}, pageCoords);\n const relativeX = page.x - offset[0].x;\n const relativeY = page.y - offset[0].y;\n\n arg.options = utils.extend({}, options);\n arg.options.targets = [];\n\n for (const snapTarget of options.targets) {\n let target;\n\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n if ('width' in target && 'height' in target) {\n target.x = target.width;\n target.y = target.height;\n }\n\n arg.options.targets.push(target);\n }\n\n snap.set(arg);\n },\n\n modifyCoords: function (arg) {\n const { options } = arg;\n\n arg.options = utils.extend({}, options);\n arg.options.enabled = options.enabled;\n arg.options.relativePoints = [null];\n\n snap.modifyCoords(arg);\n },\n};\n\nmodifiers.snapSize = snapSize;\nmodifiers.names.push('snapSize');\n\ndefaultOptions.perAction.snapSize = snapSize.defaults;\nresize.defaults.snapSize = snapSize.defaults;\n\nmodule.exports = snapSize;\n","const pointerUtils = require('../utils/pointerUtils');\n\nmodule.exports = class PointerEvent {\n constructor (type, pointer, event, eventTarget, interaction) {\n pointerUtils.pointerExtend(this, event);\n\n if (event !== pointer) {\n pointerUtils.pointerExtend(this, pointer);\n }\n\n this.interaction = interaction;\n\n this.timeStamp = new Date().getTime();\n this.originalEvent = event;\n this.type = type;\n this.pointerId = pointerUtils.getPointerId(pointer);\n this.pointerType = pointerUtils.getPointerType(pointer);\n this.target = eventTarget;\n this.currentTarget = null;\n\n if (type === 'tap') {\n const pointerIndex = interaction.getPointerIndex(pointer);\n this.dt = this.timeStamp - interaction.downTimes[pointerIndex];\n\n const interval = this.timeStamp - interaction.tapTime;\n\n this.double = !!(interaction.prevTap\n && interaction.prevTap.type !== 'doubletap'\n && interaction.prevTap.target === this.target\n && interval < 500);\n }\n else if (type === 'doubletap') {\n this.dt = pointer.timeStamp - interaction.tapTime;\n }\n }\n\n subtractOrigin ({ x: originX, y: originY }) {\n this.pageX -= originX;\n this.pageY -= originY;\n this.clientX -= originX;\n this.clientY -= originY;\n\n return this;\n }\n\n addOrigin ({ x: originX, y: originY }) {\n this.pageX += originX;\n this.pageY += originY;\n this.clientX += originX;\n this.clientY += originY;\n\n return this;\n }\n\n preventDefault () {\n this.originalEvent.preventDefault();\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n};\n","const PointerEvent = require('./PointerEvent');\nconst Interaction = require('../Interaction');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst defaults = require('../defaultOptions');\nconst signals = require('../utils/Signals').new();\nconst { filter } = require('../utils/arr');\n\nconst simpleSignals = [ 'down', 'up', 'cancel' ];\nconst simpleEvents = [ 'down', 'up', 'cancel' ];\n\nconst pointerEvents = {\n PointerEvent,\n fire,\n collectEventTargets,\n signals,\n defaults: {\n holdDuration: 600,\n ignoreFrom : null,\n allowFrom : null,\n origin : { x: 0, y: 0 },\n },\n types: [\n 'down',\n 'move',\n 'up',\n 'cancel',\n 'tap',\n 'doubletap',\n 'hold',\n ],\n};\n\nfunction fire (arg) {\n const {\n interaction, pointer, event, eventTarget,\n type = arg.pointerEvent.type,\n targets = collectEventTargets(arg),\n pointerEvent = new PointerEvent(type, pointer, event, eventTarget, interaction),\n } = arg;\n\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n targets,\n type,\n pointerEvent,\n };\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n\n for (const prop in target.props || {}) {\n pointerEvent[prop] = target.props[prop];\n }\n\n const origin = utils.getOriginXY(target.eventable, target.element);\n\n pointerEvent.subtractOrigin(origin);\n pointerEvent.eventable = target.eventable;\n pointerEvent.currentTarget = target.element;\n\n target.eventable.fire(pointerEvent);\n\n pointerEvent.addOrigin(origin);\n\n if (pointerEvent.immediatePropagationStopped\n || (pointerEvent.propagationStopped\n && (i + 1) < targets.length && targets[i + 1].element !== pointerEvent.currentTarget)) {\n break;\n }\n }\n\n signals.fire('fired', signalArg);\n\n if (type === 'tap') {\n // if pointerEvent should make a double tap, create and fire a doubletap\n // PointerEvent and use that as the prevTap\n const prevTap = pointerEvent.double\n ? fire({\n interaction, pointer, event, eventTarget,\n type: 'doubletap',\n })\n : pointerEvent;\n\n interaction.prevTap = prevTap;\n interaction.tapTime = prevTap.timeStamp;\n }\n\n return pointerEvent;\n}\n\nfunction collectEventTargets ({ interaction, pointer, event, eventTarget, type }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n // do not fire a tap event if the pointer was moved before being lifted\n if (type === 'tap' && (interaction.pointerWasMoved\n // or if the pointerup target is different to the pointerdown target\n || !(interaction.downTargets[pointerIndex] && interaction.downTargets[pointerIndex] === eventTarget))) {\n return [];\n }\n\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n path,\n targets: [],\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (type === 'hold') {\n signalArg.targets = filter(signalArg.targets, target =>\n target.eventable.options.holdDuration === interaction.holdTimers[pointerIndex].duration);\n }\n\n return signalArg.targets;\n}\n\nInteraction.signals.on('update-pointer-down', function ({ interaction, pointerIndex }) {\n interaction.holdTimers[pointerIndex] = { duration: Infinity, timeout: null };\n});\n\nInteraction.signals.on('remove-pointer', function ({ interaction, pointerIndex }) {\n interaction.holdTimers.splice(pointerIndex, 1);\n});\n\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget, duplicateMove }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n if (!duplicateMove && (!interaction.pointerIsDown || interaction.pointerWasMoved)) {\n if (interaction.pointerIsDown) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n\n fire({\n interaction, pointer, event, eventTarget,\n type: 'move',\n });\n }\n});\n\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget, pointerIndex }) {\n // copy event to be used in timeout for IE8\n const eventCopy = browser.isIE8? utils.extend({}, event) : event;\n\n const timer = interaction.holdTimers[pointerIndex];\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'hold',\n targets: [],\n path,\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (!signalArg.targets.length) { return; }\n\n let minDuration = Infinity;\n\n for (let i = 0; i < signalArg.targets.length; i++) {\n const target = signalArg.targets[i];\n const holdDuration = target.eventable.options.holdDuration;\n\n if (holdDuration < minDuration) {\n minDuration = holdDuration;\n }\n }\n\n timer.duration = minDuration;\n timer.timeout = setTimeout(function () {\n fire({\n interaction,\n eventTarget,\n pointer: browser.isIE8? eventCopy : pointer,\n event: eventCopy,\n type: 'hold',\n });\n }, minDuration);\n});\n\nInteraction.signals.on('up', ({ interaction, pointer, event, eventTarget }) => {\n if (!interaction.pointerWasMoved) {\n fire({ interaction, eventTarget, pointer, event, type: 'tap' });\n }\n});\n\n['up', 'cancel'].forEach(function (signalName) {\n Interaction.signals.on(signalName, function ({ interaction, pointerIndex }) {\n if (interaction.holdTimers[pointerIndex]) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n });\n});\n\nfunction createSignalListener (type) {\n return function ({ interaction, pointer, event, eventTarget }) {\n fire({ interaction, eventTarget, pointer, event, type });\n };\n}\n\nfor (let i = 0; i < simpleSignals.length; i++) {\n Interaction.signals.on(simpleSignals[i], createSignalListener(simpleEvents[i]));\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.prevTap = null; // the most recent tap event on this interaction\n interaction.tapTime = 0; // time of the most recent tap event\n interaction.holdTimers = []; // [{ duration, timeout }]\n});\n\ndefaults.pointerEvents = pointerEvents.defaults;\nmodule.exports = pointerEvents;\n","const pointerEvents = require('./base');\nconst Interaction = require('../Interaction');\n\npointerEvents.signals.on('new', onNew);\npointerEvents.signals.on('fired', onFired);\n\nfor (const signal of ['move', 'up', 'cancel', 'endall']) {\n Interaction.signals.on(signal, endHoldRepeat);\n}\n\nfunction onNew ({ pointerEvent }) {\n if (pointerEvent.type !== 'hold') { return; }\n\n pointerEvent.count = (pointerEvent.count || 0) + 1;\n}\n\nfunction onFired ({ interaction, pointerEvent, eventTarget, targets }) {\n if (pointerEvent.type !== 'hold' || !targets.length) { return; }\n\n // get the repeat interval from the first eventable\n const interval = targets[0].eventable.options.holdRepeatInterval;\n\n // don't repeat if the interval is 0 or less\n if (interval <= 0) { return; }\n\n // set a timeout to fire the holdrepeat event\n interaction.holdIntervalHandle = setTimeout(function () {\n pointerEvents.fire({\n interaction,\n eventTarget,\n type: 'hold',\n pointer: pointerEvent,\n event: pointerEvent,\n });\n }, interval);\n}\n\nfunction endHoldRepeat ({ interaction }) {\n // set the interaction's holdStopTime property\n // to stop further holdRepeat events\n if (interaction.holdIntervalHandle) {\n clearInterval(interaction.holdIntervalHandle);\n interaction.holdIntervalHandle = null;\n }\n}\n\n// don't repeat by default\npointerEvents.defaults.holdRepeatInterval = 0;\npointerEvents.types.push('holdrepeat');\n\nmodule.exports = {\n onNew,\n onFired,\n endHoldRepeat,\n};\n","const pointerEvents = require('./base');\nconst Interactable = require('../Interactable');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\nconst scope = require('../scope');\nconst extend = require('../utils/extend');\nconst { merge } = require('../utils/arr');\n\npointerEvents.signals.on('collect-targets', function ({ targets, element, type, eventTarget }) {\n function collectSelectors (interactable, selector, context) {\n const els = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && is.element(element)\n && domUtils.matchesSelector(element, selector, els)\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n const interactable = scope.interactables.get(element);\n\n if (interactable) {\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n scope.interactables.forEachSelector(collectSelectors, element);\n});\n\nInteractable.signals.on('new', function ({ interactable }) {\n interactable.events.getRect = function (element) {\n return interactable.getRect(element);\n };\n});\n\nInteractable.signals.on('set', function ({ interactable, options }) {\n extend(interactable.events.options, pointerEvents.defaults);\n extend(interactable.events.options, options);\n});\n\nmerge(Interactable.eventTypes, pointerEvents.types);\n\nInteractable.prototype.pointerEvents = function (options) {\n extend(this.events.options, options);\n\n return this;\n};\n\nconst __backCompatOption = Interactable.prototype._backCompatOption;\n\nInteractable.prototype._backCompatOption = function (optionName, newValue) {\n const ret = __backCompatOption.call(this, optionName, newValue);\n\n if (ret === this) {\n this.events.options[optionName] = newValue;\n }\n\n return ret;\n};\n\nInteractable.settingsMethods.push('pointerEvents');\n","const utils = require('./utils');\nconst events = require('./utils/events');\nconst signals = require('./utils/Signals').new();\n\nconst scope = {\n signals,\n events,\n utils,\n\n // main document\n document: require('./utils/domObjects').document,\n // all documents being listened to\n documents: [],\n\n addDocument: function (doc, win) {\n // do nothing if document is already known\n if (utils.contains(scope.documents, doc)) { return false; }\n\n win = win || scope.getWindow(doc);\n\n scope.documents.push(doc);\n events.documents.push(doc);\n\n // don't add an unload event for the main document\n // so that the page may be cached in browser history\n if (doc !== scope.document) {\n events.add(win, 'unload', scope.onWindowUnload);\n }\n\n signals.fire('add-document', { doc, win });\n },\n\n removeDocument: function (doc, win) {\n const index = utils.indexOf(scope.documents, doc);\n\n win = win || scope.getWindow(doc);\n\n events.remove(win, 'unload', scope.onWindowUnload);\n\n scope.documents.splice(index, 1);\n events.documents.splice(index, 1);\n\n signals.fire('remove-document', { win, doc });\n },\n\n onWindowUnload: function () {\n scope.removeDocument(this.document, this);\n },\n};\n\nmodule.exports = scope;\n","const { indexOf } = require('./arr');\n\nclass Signals {\n constructor () {\n this.listeners = {\n // signalName: [listeners],\n };\n }\n\n on (name, listener) {\n if (!this.listeners[name]) {\n this.listeners[name] = [listener];\n return;\n }\n\n this.listeners[name].push(listener);\n }\n\n off (name, listener) {\n if (!this.listeners[name]) { return; }\n\n const index = indexOf(this.listeners[name], listener);\n\n if (index !== -1) {\n this.listeners[name].splice(index, 1);\n }\n }\n\n fire (name, arg) {\n const targetListeners = this.listeners[name];\n\n if (!targetListeners) { return; }\n\n for (let i = 0; i < targetListeners.length; i++) {\n if (targetListeners[i](arg, name) === false) {\n return;\n }\n }\n }\n}\n\nSignals.new = function () {\n return new Signals();\n};\n\nmodule.exports = Signals;\n","function indexOf (array, target) {\n for (let i = 0, len = array.length; i < len; i++) {\n if (array[i] === target) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction contains (array, target) {\n return indexOf(array, target) !== -1;\n}\n\nfunction merge (target, source) {\n for (let i = 0; i < source.length; i++) {\n target.push(source[i]);\n }\n\n return target;\n}\n\nfunction filter (array, test) {\n const result = [];\n\n for (let i = 0; i < array.length; i++) {\n if (test(array[i])) {\n result.push(array[i]);\n }\n }\n\n return result;\n}\n\nmodule.exports = {\n indexOf,\n contains,\n merge,\n filter,\n};\n","const { window } = require('./window');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst Element = domObjects.Element;\nconst navigator = window.navigator;\n\nconst browser = {\n // Does the browser support touch input?\n supportsTouch: !!(('ontouchstart' in window) || is.function(window.DocumentTouch)\n && domObjects.document instanceof window.DocumentTouch),\n\n // Does the browser support PointerEvents\n supportsPointerEvent: !!domObjects.PointerEvent,\n\n isIE8: ('attachEvent' in window) && !('addEventListener' in window),\n\n // Opera Mobile must be handled differently\n isOperaMobile: (navigator.appName === 'Opera'\n && browser.supportsTouch\n && navigator.userAgent.match('Presto')),\n\n // scrolling doesn't change the result of getClientRects on iOS 7\n isIOS7: (/iP(hone|od|ad)/.test(navigator.platform)\n && /OS 7[^\\d]/.test(navigator.appVersion)),\n\n isIe9OrOlder: /MSIE (8|9)/.test(navigator.userAgent),\n\n // prefix matchesSelector\n prefixedMatchesSelector: 'matches' in Element.prototype\n ? 'matches': 'webkitMatchesSelector' in Element.prototype\n ? 'webkitMatchesSelector': 'mozMatchesSelector' in Element.prototype\n ? 'mozMatchesSelector': 'oMatchesSelector' in Element.prototype\n ? 'oMatchesSelector': 'msMatchesSelector',\n\n useMatchesSelectorPolyfill: false,\n\n pEventTypes: (domObjects.PointerEvent\n ? (domObjects.PointerEvent === window.MSPointerEvent\n ? {\n up: 'MSPointerUp',\n down: 'MSPointerDown',\n over: 'mouseover',\n out: 'mouseout',\n move: 'MSPointerMove',\n cancel: 'MSPointerCancel',\n }\n : {\n up: 'pointerup',\n down: 'pointerdown',\n over: 'pointerover',\n out: 'pointerout',\n move: 'pointermove',\n cancel: 'pointercancel',\n })\n : null),\n\n // because Webkit and Opera still use 'mousewheel' event type\n wheelEvent: 'onmousewheel' in domObjects.document? 'mousewheel': 'wheel',\n\n};\n\nbrowser.useMatchesSelectorPolyfill = !is.function(Element.prototype[browser.prefixedMatchesSelector]);\n\nmodule.exports = browser;\n","const domObjects = {};\nconst win = require('./window').window;\n\nfunction blank () {}\n\ndomObjects.document = win.document;\ndomObjects.DocumentFragment = win.DocumentFragment || blank;\ndomObjects.SVGElement = win.SVGElement || blank;\ndomObjects.SVGSVGElement = win.SVGSVGElement || blank;\ndomObjects.SVGElementInstance = win.SVGElementInstance || blank;\ndomObjects.Element = win.Element || blank;\ndomObjects.HTMLElement = win.HTMLElement || domObjects.Element;\n\ndomObjects.Event = win.Event;\ndomObjects.Touch = win.Touch || blank;\ndomObjects.PointerEvent = (win.PointerEvent || win.MSPointerEvent);\n\nmodule.exports = domObjects;\n","const win = require('./window');\nconst browser = require('./browser');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst domUtils = {\n nodeContains: function (parent, child) {\n while (child) {\n if (child === parent) {\n return true;\n }\n\n child = child.parentNode;\n }\n\n return false;\n },\n\n closest: function (element, selector) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) { return element; }\n\n element = domUtils.parentNode(element);\n }\n\n return null;\n },\n\n parentNode: function (node) {\n let parent = node.parentNode;\n\n if (is.docFrag(parent)) {\n // skip past #shado-root fragments\n while ((parent = parent.host) && is.docFrag(parent)) {\n continue;\n }\n\n return parent;\n }\n\n return parent;\n },\n\n // taken from http://tanalin.com/en/blog/2012/12/matches-selector-ie8/ and modified\n matchesSelectorPolyfill: browser.useMatchesSelectorPolyfill\n ? function (element, selector, elems) {\n elems = elems || element.parentNode.querySelectorAll(selector);\n\n for (let i = 0, len = elems.length; i < len; i++) {\n if (elems[i] === element) {\n return true;\n }\n }\n\n return false;\n }\n : null,\n\n matchesSelector: function (element, selector, nodeList) {\n if (browser.useMatchesSelectorPolyfill) {\n return domUtils.matchesSelectorPolyfill(element, selector, nodeList);\n }\n\n // remove /deep/ from selectors if shadowDOM polyfill is used\n if (win.window !== win.realWindow) {\n selector = selector.replace(/\\/deep\\//g, ' ');\n }\n\n return element[browser.prefixedMatchesSelector](selector);\n },\n\n // Test for the element that's \"above\" all other qualifiers\n indexOfDeepestElement: function (elements) {\n let deepestZoneParents = [];\n let dropzoneParents = [];\n let dropzone;\n let deepestZone = elements[0];\n let index = deepestZone? 0: -1;\n let parent;\n let child;\n let i;\n let n;\n\n for (i = 1; i < elements.length; i++) {\n dropzone = elements[i];\n\n // an element might belong to multiple selector dropzones\n if (!dropzone || dropzone === deepestZone) {\n continue;\n }\n\n if (!deepestZone) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n // check if the deepest or current are document.documentElement or document.rootElement\n // - if the current dropzone is, do nothing and continue\n if (dropzone.parentNode === dropzone.ownerDocument) {\n continue;\n }\n // - if deepest is, update with the current dropzone and continue to next\n else if (deepestZone.parentNode === dropzone.ownerDocument) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n if (!deepestZoneParents.length) {\n parent = deepestZone;\n while (parent.parentNode && parent.parentNode !== parent.ownerDocument) {\n deepestZoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n }\n\n // if this element is an svg element and the current deepest is\n // an HTMLElement\n if (deepestZone instanceof domObjects.HTMLElement\n && dropzone instanceof domObjects.SVGElement\n && !(dropzone instanceof domObjects.SVGSVGElement)) {\n\n if (dropzone === deepestZone.parentNode) {\n continue;\n }\n\n parent = dropzone.ownerSVGElement;\n }\n else {\n parent = dropzone;\n }\n\n dropzoneParents = [];\n\n while (parent.parentNode !== parent.ownerDocument) {\n dropzoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n\n n = 0;\n\n // get (position of last common ancestor) + 1\n while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) {\n n++;\n }\n\n const parents = [\n dropzoneParents[n - 1],\n dropzoneParents[n],\n deepestZoneParents[n],\n ];\n\n child = parents[0].lastChild;\n\n while (child) {\n if (child === parents[1]) {\n deepestZone = dropzone;\n index = i;\n deepestZoneParents = [];\n\n break;\n }\n else if (child === parents[2]) {\n break;\n }\n\n child = child.previousSibling;\n }\n }\n\n return index;\n },\n\n matchesUpTo: function (element, selector, limit) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) {\n return true;\n }\n\n element = domUtils.parentNode(element);\n\n if (element === limit) {\n return domUtils.matchesSelector(element, selector);\n }\n }\n\n return false;\n },\n\n getActualElement: function (element) {\n return (element instanceof domObjects.SVGElementInstance\n ? element.correspondingUseElement\n : element);\n },\n\n getScrollXY: function (relevantWindow) {\n relevantWindow = relevantWindow || win.window;\n return {\n x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft,\n y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop,\n };\n },\n\n getElementClientRect: function (element) {\n const clientRect = (element instanceof domObjects.SVGElement\n ? element.getBoundingClientRect()\n : element.getClientRects()[0]);\n\n return clientRect && {\n left : clientRect.left,\n right : clientRect.right,\n top : clientRect.top,\n bottom: clientRect.bottom,\n width : clientRect.width || clientRect.right - clientRect.left,\n height: clientRect.height || clientRect.bottom - clientRect.top,\n };\n },\n\n getElementRect: function (element) {\n const clientRect = domUtils.getElementClientRect(element);\n\n if (!browser.isIOS7 && clientRect) {\n const scroll = domUtils.getScrollXY(win.getWindow(element));\n\n clientRect.left += scroll.x;\n clientRect.right += scroll.x;\n clientRect.top += scroll.y;\n clientRect.bottom += scroll.y;\n }\n\n return clientRect;\n },\n\n getPath: function (element) {\n const path = [];\n\n while (element) {\n path.push(element);\n element = domUtils.parentNode(element);\n }\n\n return path;\n },\n\n trySelector: value => {\n if (!is.string(value)) { return false; }\n\n // an exception will be raised if it is invalid\n domObjects.document.querySelector(value);\n return true;\n },\n};\n\nmodule.exports = domUtils;\n","const is = require('./is');\nconst domUtils = require('./domUtils');\nconst pExtend = require('./pointerExtend');\n\nconst { window, getWindow } = require('./window');\nconst { indexOf, contains } = require('./arr');\n\nconst useAttachEvent = ('attachEvent' in window) && !('addEventListener' in window);\nconst addEvent = useAttachEvent? 'attachEvent': 'addEventListener';\nconst removeEvent = useAttachEvent? 'detachEvent': 'removeEventListener';\nconst on = useAttachEvent? 'on': '';\n\nconst elements = [];\nconst targets = [];\nconst attachedListeners = [];\n\n// {\n// type: {\n// selectors: ['selector', ...],\n// contexts : [document, ...],\n// listeners: [[listener, capture, passive], ...]\n// }\n// }\nconst delegatedEvents = {};\n\nconst documents = [];\n\nconst supportsOptions = !useAttachEvent && (() => {\n let supported = false;\n\n window.document.createElement('div').addEventListener('test', null, {\n get capture () { supported = true; },\n });\n\n return supported;\n})();\n\nfunction add (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n let elementIndex = indexOf(elements, element);\n let target = targets[elementIndex];\n\n if (!target) {\n target = {\n events: {},\n typeCount: 0,\n };\n\n elementIndex = elements.push(element) - 1;\n targets.push(target);\n\n attachedListeners.push(useAttachEvent\n ? {\n supplied: [],\n wrapped : [],\n useCount: [],\n }\n : null);\n }\n\n if (!target.events[type]) {\n target.events[type] = [];\n target.typeCount++;\n }\n\n if (!contains(target.events[type], listener)) {\n let ret;\n\n if (useAttachEvent) {\n const { supplied, wrapped, useCount } = attachedListeners[elementIndex];\n const listenerIndex = indexOf(supplied, listener);\n\n const wrappedListener = wrapped[listenerIndex] || function (event) {\n if (!event.immediatePropagationStopped) {\n event.target = event.srcElement;\n event.currentTarget = element;\n\n event.preventDefault = event.preventDefault || preventDef;\n event.stopPropagation = event.stopPropagation || stopProp;\n event.stopImmediatePropagation = event.stopImmediatePropagation || stopImmProp;\n\n if (/mouse|click/.test(event.type)) {\n event.pageX = event.clientX + getWindow(element).document.documentElement.scrollLeft;\n event.pageY = event.clientY + getWindow(element).document.documentElement.scrollTop;\n }\n\n listener(event);\n }\n };\n\n ret = element[addEvent](on + type, wrappedListener, !!options.capture);\n\n if (listenerIndex === -1) {\n supplied.push(listener);\n wrapped.push(wrappedListener);\n useCount.push(1);\n }\n else {\n useCount[listenerIndex]++;\n }\n }\n else {\n ret = element[addEvent](type, listener, supportsOptions? options : !!options.capture);\n }\n target.events[type].push(listener);\n\n return ret;\n }\n}\n\nfunction remove (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const elementIndex = indexOf(elements, element);\n const target = targets[elementIndex];\n\n if (!target || !target.events) {\n return;\n }\n\n let wrappedListener = listener;\n let listeners;\n let listenerIndex;\n\n if (useAttachEvent) {\n listeners = attachedListeners[elementIndex];\n listenerIndex = indexOf(listeners.supplied, listener);\n wrappedListener = listeners.wrapped[listenerIndex];\n }\n\n if (type === 'all') {\n for (type in target.events) {\n if (target.events.hasOwnProperty(type)) {\n remove(element, type, 'all');\n }\n }\n return;\n }\n\n if (target.events[type]) {\n const len = target.events[type].length;\n\n if (listener === 'all') {\n for (let i = 0; i < len; i++) {\n remove(element, type, target.events[type][i], options);\n }\n return;\n }\n else {\n for (let i = 0; i < len; i++) {\n if (target.events[type][i] === listener) {\n element[removeEvent](on + type, wrappedListener, supportsOptions? options : !!options.capture);\n target.events[type].splice(i, 1);\n\n if (useAttachEvent && listeners) {\n listeners.useCount[listenerIndex]--;\n if (listeners.useCount[listenerIndex] === 0) {\n listeners.supplied.splice(listenerIndex, 1);\n listeners.wrapped.splice(listenerIndex, 1);\n listeners.useCount.splice(listenerIndex, 1);\n }\n }\n\n break;\n }\n }\n }\n\n if (target.events[type] && target.events[type].length === 0) {\n target.events[type] = null;\n target.typeCount--;\n }\n }\n\n if (!target.typeCount) {\n targets.splice(elementIndex, 1);\n elements.splice(elementIndex, 1);\n attachedListeners.splice(elementIndex, 1);\n }\n}\n\nfunction addDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n if (!delegatedEvents[type]) {\n delegatedEvents[type] = {\n selectors: [],\n contexts : [],\n listeners: [],\n };\n\n // add delegate listener functions\n for (let i = 0; i < documents.length; i++) {\n add(documents[i], type, delegateListener);\n add(documents[i], type, delegateUseCapture, true);\n }\n }\n\n const delegated = delegatedEvents[type];\n let index;\n\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n break;\n }\n }\n\n if (index === -1) {\n index = delegated.selectors.length;\n\n delegated.selectors.push(selector);\n delegated.contexts .push(context);\n delegated.listeners.push([]);\n }\n\n // keep listener and capture and passive flags\n delegated.listeners[index].push([listener, !!options.capture, options.passive]);\n}\n\nfunction removeDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const delegated = delegatedEvents[type];\n let matchFound = false;\n let index;\n\n if (!delegated) { return; }\n\n // count from last index of delegated to 0\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n // look for matching selector and context Node\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n\n const listeners = delegated.listeners[index];\n\n // each item of the listeners array is an array: [function, capture, passive]\n for (let i = listeners.length - 1; i >= 0; i--) {\n const [fn, capture, passive] = listeners[i];\n\n // check if the listener functions and capture and passive flags match\n if (fn === listener && capture === !!options.capture && passive === options.passive) {\n // remove the listener from the array of listeners\n listeners.splice(i, 1);\n\n // if all listeners for this interactable have been removed\n // remove the interactable from the delegated arrays\n if (!listeners.length) {\n delegated.selectors.splice(index, 1);\n delegated.contexts .splice(index, 1);\n delegated.listeners.splice(index, 1);\n\n // remove delegate function from context\n remove(context, type, delegateListener);\n remove(context, type, delegateUseCapture, true);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegatedEvents[type] = null;\n }\n }\n\n // only remove one listener\n matchFound = true;\n break;\n }\n }\n\n if (matchFound) { break; }\n }\n }\n}\n\n// bound to the interactable context when a DOM event\n// listener is added to a selector interactable\nfunction delegateListener (event, optionalArg) {\n const options = getOptions(optionalArg);\n const fakeEvent = {};\n const delegated = delegatedEvents[event.type];\n const eventTarget = (domUtils.getActualElement(event.path\n ? event.path[0]\n : event.target));\n let element = eventTarget;\n\n // duplicate the event so that currentTarget can be changed\n pExtend(fakeEvent, event);\n\n fakeEvent.originalEvent = event;\n fakeEvent.preventDefault = preventOriginalDefault;\n\n // climb up document tree looking for selector matches\n while (is.element(element)) {\n for (let i = 0; i < delegated.selectors.length; i++) {\n const selector = delegated.selectors[i];\n const context = delegated.contexts[i];\n\n if (domUtils.matchesSelector(element, selector)\n && domUtils.nodeContains(context, eventTarget)\n && domUtils.nodeContains(context, element)) {\n\n const listeners = delegated.listeners[i];\n\n fakeEvent.currentTarget = element;\n\n for (let j = 0; j < listeners.length; j++) {\n const [fn, capture, passive] = listeners[j];\n\n if (capture === !!options.capture && passive === options.passive) {\n fn(fakeEvent);\n }\n }\n }\n }\n\n element = domUtils.parentNode(element);\n }\n}\n\nfunction delegateUseCapture (event) {\n return delegateListener.call(this, event, true);\n}\n\nfunction preventDef () {\n this.returnValue = false;\n}\n\nfunction preventOriginalDefault () {\n this.originalEvent.preventDefault();\n}\n\nfunction stopProp () {\n this.cancelBubble = true;\n}\n\nfunction stopImmProp () {\n this.cancelBubble = true;\n this.immediatePropagationStopped = true;\n}\n\nfunction getOptions (param) {\n return is.object(param)? param : { capture: param };\n}\n\nmodule.exports = {\n add,\n remove,\n\n addDelegate,\n removeDelegate,\n\n delegateListener,\n delegateUseCapture,\n delegatedEvents,\n documents,\n\n useAttachEvent,\n supportsOptions,\n\n _elements: elements,\n _targets: targets,\n _attachedListeners: attachedListeners,\n};\n","module.exports = function extend (dest, source) {\n for (const prop in source) {\n dest[prop] = source[prop];\n }\n return dest;\n};\n","const {\n resolveRectLike,\n rectToXY,\n} = require('./rect');\n\nmodule.exports = function (target, element, action) {\n const actionOptions = target.options[action];\n const actionOrigin = actionOptions && actionOptions.origin;\n const origin = actionOrigin || target.options.origin;\n\n const originRect = resolveRectLike(origin, target, element, [target && element]);\n\n return rectToXY(originRect) || { x: 0, y: 0 };\n};\n","module.exports = (x, y) => Math.sqrt(x * x + y * y);\n","const extend = require('./extend');\nconst win = require('./window');\n\nconst utils = {\n warnOnce: function (method, message) {\n let warned = false;\n\n return function () {\n if (!warned) {\n win.window.console.warn(message);\n warned = true;\n }\n\n return method.apply(this, arguments);\n };\n },\n\n // http://stackoverflow.com/a/5634528/2280888\n _getQBezierValue: function (t, p1, p2, p3) {\n const iT = 1 - t;\n return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3;\n },\n\n getQuadraticCurvePoint: function (startX, startY, cpX, cpY, endX, endY, position) {\n return {\n x: utils._getQBezierValue(position, startX, cpX, endX),\n y: utils._getQBezierValue(position, startY, cpY, endY),\n };\n },\n\n // http://gizma.com/easing/\n easeOutQuad: function (t, b, c, d) {\n t /= d;\n return -c * t*(t-2) + b;\n },\n\n copyAction: function (dest, src) {\n dest.name = src.name;\n dest.axis = src.axis;\n dest.edges = src.edges;\n\n return dest;\n },\n\n is : require('./is'),\n extend : extend,\n hypot : require('./hypot'),\n getOriginXY: require('./getOriginXY'),\n};\n\nextend(utils, require('./arr'));\nextend(utils, require('./domUtils'));\nextend(utils, require('./pointerUtils'));\nextend(utils, require('./rect'));\n\nmodule.exports = utils;\n","const scope = require('../scope');\nconst utils = require('./index');\n\nconst finder = {\n methodOrder: [ 'simulationResume', 'mouseOrPen', 'hasPointer', 'idle' ],\n\n search: function (pointer, eventType, eventTarget) {\n const pointerType = utils.getPointerType(pointer);\n const pointerId = utils.getPointerId(pointer);\n const details = { pointer, pointerId, pointerType, eventType, eventTarget };\n\n for (const method of finder.methodOrder) {\n const interaction = finder[method](details);\n\n if (interaction) {\n return interaction;\n }\n }\n },\n\n // try to resume simulation with a new pointer\n simulationResume: function ({ pointerType, eventType, eventTarget }) {\n if (!/down|start/i.test(eventType)) {\n return null;\n }\n\n for (const interaction of scope.interactions) {\n let element = eventTarget;\n\n if (interaction.simulation && interaction.simulation.allowResume\n && (interaction.pointerType === pointerType)) {\n while (element) {\n // if the element is the interaction element\n if (element === interaction.element) {\n return interaction;\n }\n element = utils.parentNode(element);\n }\n }\n }\n\n return null;\n },\n\n // if it's a mouse or pen interaction\n mouseOrPen: function ({ pointerId, pointerType, eventType }) {\n if (pointerType !== 'mouse' && pointerType !== 'pen') {\n return null;\n }\n\n let firstNonActive;\n\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType) {\n // if it's a down event, skip interactions with running simulations\n if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; }\n\n // if the interaction is active, return it immediately\n if (interaction.interacting()) {\n return interaction;\n }\n // otherwise save it and look for another active interaction\n else if (!firstNonActive) {\n firstNonActive = interaction;\n }\n }\n }\n\n // if no active mouse interaction was found use the first inactive mouse\n // interaction\n if (firstNonActive) {\n return firstNonActive;\n }\n\n // find any mouse or pen interaction.\n // ignore the interaction if the eventType is a *down, and a simulation\n // is active\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType && !(/down/i.test(eventType) && interaction.simulation)) {\n return interaction;\n }\n }\n\n return null;\n },\n\n // get interaction that has this pointer\n hasPointer: function ({ pointerId }) {\n for (const interaction of scope.interactions) {\n if (utils.contains(interaction.pointerIds, pointerId)) {\n return interaction;\n }\n }\n },\n\n // get first idle interaction with a matching pointerType\n idle: function ({ pointerType }) {\n for (const interaction of scope.interactions) {\n // if there's already a pointer held down\n if (interaction.pointerIds.length === 1) {\n const target = interaction.target;\n // don't add this pointer if there is a target interactable and it\n // isn't gesturable\n if (target && !target.options.gesture.enabled) {\n continue;\n }\n }\n // maximum of 2 pointers per interaction\n else if (interaction.pointerIds.length >= 2) {\n continue;\n }\n\n if (!interaction.interacting() && (pointerType === interaction.pointerType)) {\n return interaction;\n }\n }\n\n return null;\n },\n};\n\nmodule.exports = finder;\n","const win = require('./window');\nconst isWindow = require('./isWindow');\n\nconst is = {\n array : () => {},\n\n window : thing => thing === win.window || isWindow(thing),\n\n docFrag : thing => is.object(thing) && thing.nodeType === 11,\n\n object : thing => !!thing && (typeof thing === 'object'),\n\n function: thing => typeof thing === 'function',\n\n number : thing => typeof thing === 'number' ,\n\n bool : thing => typeof thing === 'boolean' ,\n\n string : thing => typeof thing === 'string' ,\n\n element: thing => {\n if (!thing || (typeof thing !== 'object')) { return false; }\n\n const _window = win.getWindow(thing) || win.window;\n\n return (/object|function/.test(typeof _window.Element)\n ? thing instanceof _window.Element //DOM2\n : thing.nodeType === 1 && typeof thing.nodeName === 'string');\n },\n};\n\nis.array = thing => (is.object(thing)\n && (typeof thing.length !== 'undefined')\n && is.function(thing.splice));\n\nmodule.exports = is;\n","module.exports = (thing) => !!(thing && thing.Window) && (thing instanceof thing.Window);\n","function pointerExtend (dest, source) {\n for (const prop in source) {\n const prefixedPropREs = module.exports.prefixedPropREs;\n let deprecated = false;\n\n // skip deprecated prefixed properties\n for (const vendor in prefixedPropREs) {\n if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) {\n deprecated = true;\n break;\n }\n }\n\n if (!deprecated && typeof source[prop] !== 'function') {\n dest[prop] = source[prop];\n }\n }\n return dest;\n}\n\npointerExtend.prefixedPropREs = {\n webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/,\n};\n\nmodule.exports = pointerExtend;\n","const hypot = require('./hypot');\nconst browser = require('./browser');\nconst dom = require('./domObjects');\nconst domUtils = require('./domUtils');\nconst domObjects = require('./domObjects');\nconst is = require('./is');\nconst pointerExtend = require('./pointerExtend');\n\nconst pointerUtils = {\n copyCoords: function (dest, src) {\n dest.page = dest.page || {};\n dest.page.x = src.page.x;\n dest.page.y = src.page.y;\n\n dest.client = dest.client || {};\n dest.client.x = src.client.x;\n dest.client.y = src.client.y;\n\n dest.timeStamp = src.timeStamp;\n },\n\n setCoordDeltas: function (targetObj, prev, cur) {\n targetObj.page.x = cur.page.x - prev.page.x;\n targetObj.page.y = cur.page.y - prev.page.y;\n targetObj.client.x = cur.client.x - prev.client.x;\n targetObj.client.y = cur.client.y - prev.client.y;\n targetObj.timeStamp = cur.timeStamp - prev.timeStamp;\n\n // set pointer velocity\n const dt = Math.max(targetObj.timeStamp / 1000, 0.001);\n\n targetObj.page.speed = hypot(targetObj.page.x, targetObj.page.y) / dt;\n targetObj.page.vx = targetObj.page.x / dt;\n targetObj.page.vy = targetObj.page.y / dt;\n\n targetObj.client.speed = hypot(targetObj.client.x, targetObj.page.y) / dt;\n targetObj.client.vx = targetObj.client.x / dt;\n targetObj.client.vy = targetObj.client.y / dt;\n },\n\n isNativePointer: function (pointer) {\n return (pointer instanceof dom.Event || pointer instanceof dom.Touch);\n },\n\n // Get specified X/Y coords for mouse or event.touches[0]\n getXY: function (type, pointer, xy) {\n xy = xy || {};\n type = type || 'page';\n\n xy.x = pointer[type + 'X'];\n xy.y = pointer[type + 'Y'];\n\n return xy;\n },\n\n getPageXY: function (pointer, page) {\n page = page || {};\n\n // Opera Mobile handles the viewport and scrolling oddly\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n pointerUtils.getXY('screen', pointer, page);\n\n page.x += window.scrollX;\n page.y += window.scrollY;\n }\n else {\n pointerUtils.getXY('page', pointer, page);\n }\n\n return page;\n },\n\n getClientXY: function (pointer, client) {\n client = client || {};\n\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n // Opera Mobile handles the viewport and scrolling oddly\n pointerUtils.getXY('screen', pointer, client);\n }\n else {\n pointerUtils.getXY('client', pointer, client);\n }\n\n return client;\n },\n\n getPointerId: function (pointer) {\n return is.number(pointer.pointerId)? pointer.pointerId : pointer.identifier;\n },\n\n setCoords: function (targetObj, pointers, timeStamp) {\n const pointer = (pointers.length > 1\n ? pointerUtils.pointerAverage(pointers)\n : pointers[0]);\n\n const tmpXY = {};\n\n pointerUtils.getPageXY(pointer, tmpXY);\n targetObj.page.x = tmpXY.x;\n targetObj.page.y = tmpXY.y;\n\n pointerUtils.getClientXY(pointer, tmpXY);\n targetObj.client.x = tmpXY.x;\n targetObj.client.y = tmpXY.y;\n\n targetObj.timeStamp = is.number(timeStamp) ? timeStamp :new Date().getTime();\n },\n\n pointerExtend: pointerExtend,\n\n getTouchPair: function (event) {\n const touches = [];\n\n // array of touches is supplied\n if (is.array(event)) {\n touches[0] = event[0];\n touches[1] = event[1];\n }\n // an event\n else {\n if (event.type === 'touchend') {\n if (event.touches.length === 1) {\n touches[0] = event.touches[0];\n touches[1] = event.changedTouches[0];\n }\n else if (event.touches.length === 0) {\n touches[0] = event.changedTouches[0];\n touches[1] = event.changedTouches[1];\n }\n }\n else {\n touches[0] = event.touches[0];\n touches[1] = event.touches[1];\n }\n }\n\n return touches;\n },\n\n pointerAverage: function (pointers) {\n const average = {\n pageX : 0,\n pageY : 0,\n clientX: 0,\n clientY: 0,\n screenX: 0,\n screenY: 0,\n };\n\n for (const pointer of pointers) {\n for (const prop in average) {\n average[prop] += pointer[prop];\n }\n }\n for (const prop in average) {\n average[prop] /= pointers.length;\n }\n\n return average;\n },\n\n touchBBox: function (event) {\n if (!event.length && !(event.touches && event.touches.length > 1)) {\n return;\n }\n\n const touches = pointerUtils.getTouchPair(event);\n const minX = Math.min(touches[0].pageX, touches[1].pageX);\n const minY = Math.min(touches[0].pageY, touches[1].pageY);\n const maxX = Math.max(touches[0].pageX, touches[1].pageX);\n const maxY = Math.max(touches[0].pageY, touches[1].pageY);\n\n return {\n x: minX,\n y: minY,\n left: minX,\n top: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n },\n\n touchDistance: function (event, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n\n\n const dx = touches[0][sourceX] - touches[1][sourceX];\n const dy = touches[0][sourceY] - touches[1][sourceY];\n\n return hypot(dx, dy);\n },\n\n touchAngle: function (event, prevAngle, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n const dx = touches[1][sourceX] - touches[0][sourceX];\n const dy = touches[1][sourceY] - touches[0][sourceY];\n const angle = 180 * Math.atan2(dy , dx) / Math.PI;\n\n return angle;\n },\n\n getPointerType: function (pointer) {\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : is.number(pointer.pointerType)\n ? [undefined, undefined,'touch', 'pen', 'mouse'][pointer.pointerType]\n // if the PointerEvent API isn't available, then the \"pointer\" must\n // be either a MouseEvent, TouchEvent, or Touch object\n : /touch/.test(pointer.type) || pointer instanceof domObjects.Touch\n ? 'touch'\n : 'mouse';\n },\n\n // [ event.target, event.currentTarget ]\n getEventTargets: function (event) {\n return [\n domUtils.getActualElement(event.path ? event.path[0] : event.target),\n domUtils.getActualElement(event.currentTarget),\n ];\n },\n};\n\nmodule.exports = pointerUtils;\n","const { window } = require('./window');\n\nconst vendors = ['ms', 'moz', 'webkit', 'o'];\nlet lastTime = 0;\nlet request;\nlet cancel;\n\nfor (let x = 0; x < vendors.length && !window.requestAnimationFrame; x++) {\n request = window[vendors[x] + 'RequestAnimationFrame'];\n cancel = window[vendors[x] +'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n}\n\nif (!request) {\n request = function (callback) {\n const currTime = new Date().getTime();\n const timeToCall = Math.max(0, 16 - (currTime - lastTime));\n const id = setTimeout(function () { callback(currTime + timeToCall); },\n timeToCall);\n\n lastTime = currTime + timeToCall;\n return id;\n };\n}\n\nif (!cancel) {\n cancel = function (id) {\n clearTimeout(id);\n };\n}\n\nmodule.exports = {\n request,\n cancel,\n};\n","const extend = require('./extend');\nconst is = require('./is');\nconst {\n closest,\n parentNode,\n getElementRect,\n} = require('./domUtils');\n\nconst rectUtils = {\n getStringOptionResult: function (value, interactable, element) {\n if (!is.string(value)) {\n return null;\n }\n\n if (value === 'parent') {\n value = parentNode(element);\n }\n else if (value === 'self') {\n value = interactable.getRect(element);\n }\n else {\n value = closest(element, value);\n }\n\n return value;\n },\n\n resolveRectLike: function (value, interactable, element, functionArgs) {\n value = rectUtils.getStringOptionResult(value, interactable, element) || value;\n\n if (is.function(value)) {\n value = value.apply(null, functionArgs);\n }\n\n if (is.element(value)) {\n value = getElementRect(value);\n }\n\n return value;\n },\n\n rectToXY: function (rect) {\n return rect && {\n x: 'x' in rect ? rect.x : rect.left,\n y: 'y' in rect ? rect.y : rect.top,\n };\n },\n\n xywhToTlbr: function (rect) {\n if (rect && !('left' in rect && 'top' in rect)) {\n rect = extend({}, rect);\n\n rect.left = rect.x || 0;\n rect.top = rect.y || 0;\n rect.right = rect.right || (rect.left + rect.width);\n rect.bottom = rect.bottom || (rect.top + rect.height);\n }\n\n return rect;\n },\n\n tlbrToXywh: function (rect) {\n if (rect && !('x' in rect && 'y' in rect)) {\n rect = extend({}, rect);\n\n rect.x = rect.left || 0;\n rect.top = rect.top || 0;\n rect.width = rect.width || (rect.right - rect.x);\n rect.height = rect.height || (rect.bottom - rect.y);\n }\n\n return rect;\n },\n};\n\nmodule.exports = rectUtils;\n","const win = module.exports;\nconst isWindow = require('./isWindow');\n\nfunction init (window) {\n // get wrapped window if using Shadow DOM polyfill\n\n win.realWindow = window;\n\n // create a TextNode\n const el = window.document.createTextNode('');\n\n // check if it's wrapped by a polyfill\n if (el.ownerDocument !== window.document\n && typeof window.wrap === 'function'\n && window.wrap(el) === el) {\n // use wrapped window\n window = window.wrap(window);\n }\n\n win.window = window;\n}\n\nif (typeof window === 'undefined') {\n win.window = undefined;\n win.realWindow = undefined;\n}\nelse {\n init(window);\n}\n\nwin.getWindow = function getWindow (node) {\n if (isWindow(node)) {\n return node;\n }\n\n const rootNode = (node.ownerDocument || node);\n\n return rootNode.defaultView || rootNode.parentWindow || win.window;\n};\n\nwin.init = init;\n"]} \ No newline at end of file diff --git a/package.json b/package.json index 76f3e9969..f39704e99 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "interactjs", - "version": "1.3.0-alpha.3+sha.9595c40", + "version": "1.3.0-alpha.4+sha.7970416", "repository": { "type": "git", "url": "https://github.com/taye/interact.js.git"
- Interactable.gesturable([options])⚓➭ + Interactable.gesturable([options])⚓➭ @@ -758,7 +758,7 @@ Parameters - Interactable⚓➭ + Interactable⚓➭ @@ -783,7 +783,7 @@ Interactable - Interactable.getRect([element])⚓➭ + Interactable.getRect([element])⚓➭ @@ -888,7 +888,7 @@ Parameters - Interactable.rectChecker([checker])⚓➭ + Interactable.rectChecker([checker])⚓➭ @@ -951,7 +951,7 @@ Parameters - Interactable.origin(…)⚓➭ + Interactable.origin(…)⚓➭ @@ -1041,7 +1041,7 @@ Parameters - Interactable.deltaSource([newValue])⚓➭ + Interactable.deltaSource([newValue])⚓➭ @@ -1104,7 +1104,7 @@ Parameters - Interactable.context()⚓➭ + Interactable.context()⚓➭ @@ -1146,7 +1146,7 @@ Interactable.context() - Interactable.fire(iEvent)⚓➭ + Interactable.fire(iEvent)⚓➭ @@ -1207,7 +1207,7 @@ Parameters - Interactable.on(eventType, listener, [options])⚓➭ + Interactable.on(eventType, listener, [options])⚓➭ @@ -1273,7 +1273,7 @@ Parameters - Interactable.off(eventType, listener, [options])⚓➭ + Interactable.off(eventType, listener, [options])⚓➭ @@ -1339,7 +1339,7 @@ Parameters - Interactable.set(options)⚓➭ + Interactable.set(options)⚓➭ @@ -1399,7 +1399,7 @@ Parameters - Interactable.unset()⚓➭ + Interactable.unset()⚓➭ @@ -1442,7 +1442,7 @@ Interactable.unset() - Interactable.actionChecker([checker])⚓➭ + Interactable.actionChecker([checker])⚓➭ @@ -1542,7 +1542,7 @@ Parameters - Interactable.styleCursor([newValue])⚓➭ + Interactable.styleCursor([newValue])⚓➭ @@ -1605,7 +1605,7 @@ Parameters - interact.maxInteractions([newValue])⚓➭ + interact.maxInteractions([newValue])⚓➭ @@ -1652,7 +1652,7 @@ Parameters - Interactable.preventDefault([newValue])⚓➭ + Interactable.preventDefault([newValue])⚓➭ @@ -1718,7 +1718,7 @@ Parameters - interact(element)⚓➭ + interact(element)⚓➭ @@ -1821,7 +1821,7 @@ Usage - interact.isSet(element)⚓➭ + interact.isSet(element)⚓➭ @@ -1881,7 +1881,7 @@ Parameters - interact.on(type, listener, [options])⚓➭ + interact.on(type, listener, [options])⚓➭ @@ -1948,7 +1948,7 @@ Parameters - interact.off(type, listener, [options])⚓➭ + interact.off(type, listener, [options])⚓➭ @@ -2014,7 +2014,7 @@ Parameters - interact.debug()⚓➭ + interact.debug()⚓➭ @@ -2056,7 +2056,7 @@ interact.debug() - interact.supportsTouch()⚓➭ + interact.supportsTouch()⚓➭ @@ -2097,7 +2097,7 @@ interact.supportsTouch() - interact.supportsPointerEvent()⚓➭ + interact.supportsPointerEvent()⚓➭ @@ -2138,7 +2138,7 @@ interact.supportsPointerEvent() - interact.stop(event)⚓➭ + interact.stop(event)⚓➭ @@ -2198,7 +2198,7 @@ Parameters - interact.pointerMoveTolerance([newValue])⚓➭ + interact.pointerMoveTolerance([newValue])⚓➭ @@ -2261,7 +2261,7 @@ Parameters - Interaction.start(action, target, element)⚓➭ + Interaction.start(action, target, element)⚓➭ @@ -2356,7 +2356,7 @@ Parameters - Interaction.doMove()⚓➭ + Interaction.doMove()⚓➭ @@ -2403,7 +2403,7 @@ Interaction.doMove() - Interaction.end([event])⚓➭ + Interaction.end([event])⚓➭ diff --git a/dist/interact.js b/dist/interact.js index e8ae35c3b..c78a3c751 100644 --- a/dist/interact.js +++ b/dist/interact.js @@ -1,5 +1,5 @@ /** - * interact.js v1.3.0-alpha.3+sha.9595c40 + * interact.js v1.3.0-alpha.4+sha.7970416-dirty * * Copyright (c) 2012-2017 Taye Adeyemi * Open source under the MIT License. @@ -816,6 +816,7 @@ var scope = require('./scope'); var utils = require('./utils'); var events = require('./utils/events'); var browser = require('./utils/browser'); +var domObjects = require('./utils/domObjects'); var finder = require('./utils/interactionFinder'); var signals = require('./utils/Signals').new(); @@ -829,7 +830,9 @@ var prevTouchTime = 0; scope.interactions = []; var Interaction = function () { - function Interaction() { + function Interaction(_ref) { + var pointerType = _ref.pointerType; + _classCallCheck(this, Interaction); this.target = null; // current interactable being interacted with @@ -886,7 +889,7 @@ var Interaction = function () { this.pointerWasMoved = false; this._interacting = false; - this.mouse = false; + this.pointerType = pointerType; signals.fire('new', this); @@ -1130,6 +1133,11 @@ var Interaction = function () { }; Interaction.prototype.getPointerIndex = function getPointerIndex(pointer) { + // mouse and pen interactions may have only one pointer + if (this.pointerType === 'mouse' || this.pointerType === 'pen') { + return 0; + } + return utils.indexOf(this.pointerIds, utils.getPointerId(pointer)); }; @@ -1161,8 +1169,7 @@ var Interaction = function () { }; Interaction.prototype.removePointer = function removePointer(pointer, event) { - var id = utils.getPointerId(pointer); - var index = this.mouse ? 0 : utils.indexOf(this.pointerIds, id); + var index = this.getPointerIndex(pointer); if (index === -1) { return; @@ -1197,6 +1204,8 @@ for (var i = 0, len = methodNames.length; i < len; i++) { function doOnInteractions(method) { return function (event) { + var pointerType = utils.getPointerType(event); + var _utils$getEventTarget = utils.getEventTargets(event), eventTarget = _utils$getEventTarget[0], curEventTarget = _utils$getEventTarget[1]; @@ -1210,7 +1219,7 @@ function doOnInteractions(method) { var pointer = event.changedTouches[_i]; var interaction = finder.search(pointer, event.type, eventTarget); - matches.push([pointer, interaction || new Interaction()]); + matches.push([pointer, interaction || new Interaction({ pointerType: pointerType })]); } } else { var invalidPointer = false; @@ -1218,7 +1227,7 @@ function doOnInteractions(method) { if (!browser.supportsPointerEvent && /mouse/.test(event.type)) { // ignore mouse events while touch interactions are active for (var _i2 = 0; _i2 < scope.interactions.length && !invalidPointer; _i2++) { - invalidPointer = !scope.interactions[_i2].mouse && scope.interactions[_i2].pointerIsDown; + invalidPointer = scope.interactions[_i2].pointerType !== 'mouse' && scope.interactions[_i2].pointerIsDown; } // try to ignore mouse events that are simulated by the browser @@ -1232,11 +1241,7 @@ function doOnInteractions(method) { var _interaction = finder.search(event, event.type, eventTarget); if (!_interaction) { - - _interaction = new Interaction(); - _interaction.mouse = /mouse/i.test(event.pointerType || event.type) - // MSPointerEvent.MSPOINTER_TYPE_MOUSE - || event.pointerType === 4 || !event.pointerType; + _interaction = new Interaction({ pointerType: pointerType }); } matches.push([event, _interaction]); @@ -1244,20 +1249,20 @@ function doOnInteractions(method) { } for (var _iterator = matches, _isArray = Array.isArray(_iterator), _i3 = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { - var _ref; + var _ref2; if (_isArray) { if (_i3 >= _iterator.length) break; - _ref = _iterator[_i3++]; + _ref2 = _iterator[_i3++]; } else { _i3 = _iterator.next(); if (_i3.done) break; - _ref = _i3.value; + _ref2 = _i3.value; } - var _ref2 = _ref, - _pointer = _ref2[0], - _interaction2 = _ref2[1]; + var _ref3 = _ref2, + _pointer = _ref3[0], + _interaction2 = _ref3[1]; _interaction2._updateEventTargets(eventTarget, curEventTarget); _interaction2[method](_pointer, event, eventTarget, curEventTarget); @@ -1277,7 +1282,7 @@ function endAll(event) { var docEvents = {/* 'eventType': listenerFunc */}; var pEventTypes = browser.pEventTypes; -if (scope.PointerEvent) { +if (domObjects.PointerEvent) { docEvents[pEventTypes.down] = listeners.pointerDown; docEvents[pEventTypes.move] = listeners.pointerMove; docEvents[pEventTypes.up] = listeners.pointerUp; @@ -1295,8 +1300,8 @@ if (scope.PointerEvent) { docEvents.blur = endAll; -function onDocSignal(_ref3, signalName) { - var doc = _ref3.doc; +function onDocSignal(_ref4, signalName) { + var doc = _ref4.doc; var eventMethod = signalName.indexOf('add') === 0 ? events.add : events.remove; @@ -1311,14 +1316,14 @@ function onDocSignal(_ref3, signalName) { } } -signals.on('update-pointer-down', function (_ref4) { - var interaction = _ref4.interaction, - pointer = _ref4.pointer, - pointerId = _ref4.pointerId, - pointerIndex = _ref4.pointerIndex, - event = _ref4.event, - eventTarget = _ref4.eventTarget, - down = _ref4.down; +signals.on('update-pointer-down', function (_ref5) { + var interaction = _ref5.interaction, + pointer = _ref5.pointer, + pointerId = _ref5.pointerId, + pointerIndex = _ref5.pointerIndex, + event = _ref5.event, + eventTarget = _ref5.eventTarget, + down = _ref5.down; interaction.pointerIds[pointerIndex] = pointerId; interaction.pointers[pointerIndex] = pointer; @@ -1355,7 +1360,7 @@ scope.endAllInteractions = endAll; module.exports = Interaction; -},{"./scope":34,"./utils":44,"./utils/Signals":35,"./utils/browser":37,"./utils/events":40,"./utils/interactionFinder":45}],6:[function(require,module,exports){ +},{"./scope":34,"./utils":44,"./utils/Signals":35,"./utils/browser":37,"./utils/domObjects":38,"./utils/events":40,"./utils/interactionFinder":45}],6:[function(require,module,exports){ 'use strict'; var Interaction = require('../Interaction'); @@ -5460,7 +5465,7 @@ module.exports = function () { this.originalEvent = event; this.type = type; this.pointerId = pointerUtils.getPointerId(pointer); - this.pointerType = pointerUtils.getPointerType(pointer, interaction); + this.pointerType = pointerUtils.getPointerType(pointer); this.target = eventTarget; this.currentTarget = null; @@ -5758,8 +5763,10 @@ Interaction.signals.on('down', function (_ref6) { timer.duration = minDuration; timer.timeout = setTimeout(function () { fire({ - interaction: interaction, eventCopy: eventCopy, eventTarget: eventTarget, + interaction: interaction, + eventTarget: eventTarget, pointer: browser.isIE8 ? eventCopy : pointer, + event: eventCopy, type: 'hold' }); }, minDuration); @@ -6946,17 +6953,14 @@ module.exports = utils; var scope = require('../scope'); var utils = require('./index'); -var browser = require('./browser'); var finder = { - methodOrder: ['simulationResume', 'mouse', 'hasPointer', 'idle'], + methodOrder: ['simulationResume', 'mouseOrPen', 'hasPointer', 'idle'], search: function search(pointer, eventType, eventTarget) { - var mouseEvent = /mouse/i.test(pointer.pointerType || eventType) - // MSPointerEvent.MSPOINTER_TYPE_MOUSE - || pointer.pointerType === 4; + var pointerType = utils.getPointerType(pointer); var pointerId = utils.getPointerId(pointer); - var details = { pointer: pointer, pointerId: pointerId, mouseEvent: mouseEvent, eventType: eventType, eventTarget: eventTarget }; + var details = { pointer: pointer, pointerId: pointerId, pointerType: pointerType, eventType: eventType, eventTarget: eventTarget }; for (var _iterator = finder.methodOrder, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { var _ref; @@ -6982,7 +6986,7 @@ var finder = { // try to resume simulation with a new pointer simulationResume: function simulationResume(_ref2) { - var mouseEvent = _ref2.mouseEvent, + var pointerType = _ref2.pointerType, eventType = _ref2.eventType, eventTarget = _ref2.eventTarget; @@ -7006,7 +7010,7 @@ var finder = { var element = eventTarget; - if (interaction.simulation && interaction.simulation.allowResume && interaction.mouse === mouseEvent) { + if (interaction.simulation && interaction.simulation.allowResume && interaction.pointerType === pointerType) { while (element) { // if the element is the interaction element if (element === interaction.element) { @@ -7020,13 +7024,13 @@ var finder = { return null; }, - // if it's a mouse interaction - mouse: function mouse(_ref4) { + // if it's a mouse or pen interaction + mouseOrPen: function mouseOrPen(_ref4) { var pointerId = _ref4.pointerId, - mouseEvent = _ref4.mouseEvent, + pointerType = _ref4.pointerType, eventType = _ref4.eventType; - if (!mouseEvent && (browser.supportsTouch || browser.supportsPointerEvent)) { + if (pointerType !== 'mouse' && pointerType !== 'pen') { return null; } @@ -7046,7 +7050,7 @@ var finder = { var interaction = _ref5; - if (interaction.mouse) { + if (interaction.pointerType === pointerType) { // if it's a down event, skip interactions with running simulations if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; @@ -7069,8 +7073,8 @@ var finder = { return firstNonActive; } - // Find any interaction specifically for mouse. - // ignore the interaction if the eventType is a mousedown, and a simulation + // find any mouse or pen interaction. + // ignore the interaction if the eventType is a *down, and a simulation // is active for (var _iterator4 = scope.interactions, _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) { var _ref6; @@ -7086,7 +7090,7 @@ var finder = { var _interaction = _ref6; - if (_interaction.mouse && !(/down/.test(eventType) && _interaction.simulation)) { + if (_interaction.pointerType === pointerType && !(/down/i.test(eventType) && _interaction.simulation)) { return _interaction; } } @@ -7118,9 +7122,9 @@ var finder = { } }, - // get first idle interaction + // get first idle interaction with a matching pointerType idle: function idle(_ref9) { - var mouseEvent = _ref9.mouseEvent; + var pointerType = _ref9.pointerType; for (var _iterator6 = scope.interactions, _isArray6 = Array.isArray(_iterator6), _i6 = 0, _iterator6 = _isArray6 ? _iterator6 : _iterator6[Symbol.iterator]();;) { var _ref10; @@ -7150,7 +7154,7 @@ var finder = { continue; } - if (!interaction.interacting() && mouseEvent === interaction.mouse) { + if (!interaction.interacting() && pointerType === interaction.pointerType) { return interaction; } } @@ -7161,7 +7165,7 @@ var finder = { module.exports = finder; -},{"../scope":34,"./browser":37,"./index":44}],46:[function(require,module,exports){ +},{"../scope":34,"./index":44}],46:[function(require,module,exports){ 'use strict'; var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; @@ -7262,6 +7266,7 @@ var hypot = require('./hypot'); var browser = require('./browser'); var dom = require('./domObjects'); var domUtils = require('./domUtils'); +var domObjects = require('./domObjects'); var is = require('./is'); var pointerExtend = require('./pointerExtend'); @@ -7468,17 +7473,11 @@ var pointerUtils = { return angle; }, - getPointerType: function getPointerType(pointer, interaction) { - // if the PointerEvent API isn't available, then the pointer must be ither - // a MouseEvent or TouchEvent - if (interaction.mouse) { - return 'mouse'; - } - if (!browser.supportsPointerEvent) { - return 'touch'; - } - - return is.string(pointer.pointerType) ? pointer.pointerType : [undefined, undefined, 'touch', 'pen', 'mouse'][pointer.pointerType]; + getPointerType: function getPointerType(pointer) { + return is.string(pointer.pointerType) ? pointer.pointerType : is.number(pointer.pointerType) ? [undefined, undefined, 'touch', 'pen', 'mouse'][pointer.pointerType] + // if the PointerEvent API isn't available, then the "pointer" must + // be either a MouseEvent, TouchEvent, or Touch object + : /touch/.test(pointer.type) || pointer instanceof domObjects.Touch ? 'touch' : 'mouse'; }, // [ event.target, event.currentTarget ] diff --git a/dist/interact.js.map b/dist/interact.js.map index 60832b766..4f3a62ba8 100644 --- a/dist/interact.js.map +++ b/dist/interact.js.map @@ -1 +1 @@ -{"version":3,"sources":["src/header.js","node_modules/browser-pack/_prelude.js","index.js","src/Eventable.js","src/InteractEvent.js","src/Interactable.js","src/Interaction.js","src/actions/base.js","src/actions/drag.js","src/actions/drop.js","src/actions/gesture.js","src/actions/resize.js","src/autoScroll.js","src/autoStart/InteractableMethods.js","src/autoStart/base.js","src/autoStart/delay.js","src/autoStart/drag.js","src/autoStart/gesture.js","src/autoStart/resize.js","src/defaultOptions.js","src/index.js","src/inertia.js","src/interact.js","src/interactablePreventDefault.js","src/legacyBrowsers.js","src/modifiers/index.js","src/modifiers/restrict.js","src/modifiers/restrictEdges.js","src/modifiers/restrictSize.js","src/modifiers/snap.js","src/modifiers/snapSize.js","src/pointerEvents/PointerEvent.js","src/pointerEvents/base.js","src/pointerEvents/holdRepeat.js","src/pointerEvents/interactableTargets.js","src/scope.js","src/utils/Signals.js","src/utils/arr.js","src/utils/browser.js","src/utils/domObjects.js","src/utils/domUtils.js","src/utils/events.js","src/utils/extend.js","src/utils/getOriginXY.js","src/utils/hypot.js","src/utils/index.js","src/utils/interactionFinder.js","src/utils/is.js","src/utils/isWindow.js","src/utils/pointerExtend.js","src/utils/pointerUtils.js","src/utils/raf.js","src/utils/rect.js","src/utils/window.js"],"names":[],"mappings":"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","file":"interact.js","sourceRoot":"","sourcesContent":["/**\n * interact.js v1.3.0-alpha.3+sha.9595c40\n *\n * Copyright (c) 2012-2017 Taye Adeyemi \n * Open source under the MIT License.\n * https://raw.github.com/taye/interact.js/master/LICENSE\n */\n","(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o 150) {\n return null;\n }\n\n let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI;\n const overlap = 22.5;\n\n if (angle < 0) {\n angle += 360;\n }\n\n const left = 135 - overlap <= angle && angle < 225 + overlap;\n const up = 225 - overlap <= angle && angle < 315 + overlap;\n\n const right = !left && (315 - overlap <= angle || angle < 45 + overlap);\n const down = !up && 45 - overlap <= angle && angle < 135 + overlap;\n\n return {\n up,\n down,\n left,\n right,\n angle,\n speed: interaction.prevEvent.speed,\n velocity: {\n x: interaction.prevEvent.velocityX,\n y: interaction.prevEvent.velocityY,\n },\n };\n }\n\n preventDefault () {}\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n}\n\nsignals.on('set-delta', function ({ iEvent, interaction, starting, deltaSource }) {\n const prevEvent = starting? iEvent : interaction.prevEvent;\n\n if (deltaSource === 'client') {\n iEvent.dx = iEvent.clientX - prevEvent.clientX;\n iEvent.dy = iEvent.clientY - prevEvent.clientY;\n }\n else {\n iEvent.dx = iEvent.pageX - prevEvent.pageX;\n iEvent.dy = iEvent.pageY - prevEvent.pageY;\n }\n});\n\nInteractEvent.signals = signals;\n\nmodule.exports = InteractEvent;\n","const is = require('./utils/is');\nconst events = require('./utils/events');\nconst extend = require('./utils/extend');\nconst actions = require('./actions/base');\nconst scope = require('./scope');\nconst Eventable = require('./Eventable');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nconst {\n getElementRect,\n nodeContains,\n trySelector,\n} = require('./utils/domUtils');\nconst { getWindow } = require('./utils/window');\nconst { indexOf, contains } = require('./utils/arr');\nconst { wheelEvent } = require('./utils/browser');\n\n// all set interactables\nscope.interactables = [];\n\n/*\\\n * Interactable\n [ property ]\n **\n * Object type returned by @interact\n\\*/\nclass Interactable {\n constructor (target, options) {\n options = options || {};\n\n this.target = target;\n this.events = new Eventable();\n this._context = options.context || scope.document;\n this._win = getWindow(trySelector(target)? this._context : target);\n this._doc = this._win.document;\n\n signals.fire('new', {\n target,\n options,\n interactable: this,\n win: this._win,\n });\n\n scope.addDocument( this._doc, this._win );\n\n scope.interactables.push(this);\n\n this.set(options);\n }\n\n setOnEvents (action, phases) {\n const onAction = 'on' + action;\n\n if (is.function(phases.onstart) ) { this.events[onAction + 'start' ] = phases.onstart ; }\n if (is.function(phases.onmove) ) { this.events[onAction + 'move' ] = phases.onmove ; }\n if (is.function(phases.onend) ) { this.events[onAction + 'end' ] = phases.onend ; }\n if (is.function(phases.oninertiastart)) { this.events[onAction + 'inertiastart' ] = phases.oninertiastart ; }\n\n return this;\n }\n\n setPerAction (action, options) {\n // for all the default per-action options\n for (const option in options) {\n // if this option exists for this action\n if (option in defaults[action]) {\n // if the option in the options arg is an object value\n if (is.object(options[option])) {\n // duplicate the object\n this.options[action][option] = extend(this.options[action][option] || {}, options[option]);\n\n if (is.object(defaults.perAction[option]) && 'enabled' in defaults.perAction[option]) {\n this.options[action][option].enabled = options[option].enabled === false? false : true;\n }\n }\n else if (is.bool(options[option]) && is.object(defaults.perAction[option])) {\n this.options[action][option].enabled = options[option];\n }\n else if (options[option] !== undefined) {\n // or if it's not undefined, do a plain assignment\n this.options[action][option] = options[option];\n }\n }\n }\n }\n\n /*\\\n * Interactable.getRect\n [ method ]\n *\n * The default function to get an Interactables bounding rect. Can be\n * overridden using @Interactable.rectChecker.\n *\n - element (Element) #optional The element to measure.\n = (object) The object's bounding rectangle.\n o {\n o top : 0,\n o left : 0,\n o bottom: 0,\n o right : 0,\n o width : 0,\n o height: 0\n o }\n \\*/\n getRect (element) {\n element = element || this.target;\n\n if (is.string(this.target) && !(is.element(element))) {\n element = this._context.querySelector(this.target);\n }\n\n return getElementRect(element);\n }\n\n /*\\\n * Interactable.rectChecker\n [ method ]\n *\n * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n - checker (function) #optional A function which returns this Interactable's bounding rectangle. See @Interactable.getRect\n = (function | object) The checker function or this Interactable\n \\*/\n rectChecker (checker) {\n if (is.function(checker)) {\n this.getRect = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.getRect;\n\n return this;\n }\n\n return this.getRect;\n }\n\n _backCompatOption (optionName, newValue) {\n if (trySelector(newValue) || is.object(newValue)) {\n this.options[optionName] = newValue;\n\n for (const action of actions.names) {\n this.options[action][optionName] = newValue;\n }\n\n return this;\n }\n\n return this.options[optionName];\n }\n\n /*\\\n * Interactable.origin\n [ method ]\n *\n * Gets or sets the origin of the Interactable's element. The x and y\n * of the origin will be subtracted from action event coordinates.\n *\n - origin (object | string) #optional An object eg. { x: 0, y: 0 } or string 'parent', 'self' or any CSS selector\n * OR\n - origin (Element) #optional An HTML or SVG Element whose rect will be used\n **\n = (object) The current origin or this Interactable\n \\*/\n origin (newValue) {\n return this._backCompatOption('origin', newValue);\n }\n\n /*\\\n * Interactable.deltaSource\n [ method ]\n *\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n - newValue (string) #optional Use 'client' if you will be scrolling while interacting; Use 'page' if you want autoScroll to work\n = (string | object) The current deltaSource or this Interactable\n \\*/\n deltaSource (newValue) {\n if (newValue === 'page' || newValue === 'client') {\n this.options.deltaSource = newValue;\n\n return this;\n }\n\n return this.options.deltaSource;\n }\n\n /*\\\n * Interactable.context\n [ method ]\n *\n * Gets the selector context Node of the Interactable. The default is `window.document`.\n *\n = (Node) The context Node of this Interactable\n **\n \\*/\n context () {\n return this._context;\n }\n\n inContext (element) {\n return (this._context === element.ownerDocument\n || nodeContains(this._context, element));\n }\n\n /*\\\n * Interactable.fire\n [ method ]\n *\n * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n - iEvent (InteractEvent) The InteractEvent object to be fired on this Interactable\n = (Interactable) this Interactable\n \\*/\n fire (iEvent) {\n this.events.fire(iEvent);\n\n return this;\n }\n\n _onOffMultiple (method, eventType, listener, options) {\n if (is.string(eventType) && eventType.search(' ') !== -1) {\n eventType = eventType.trim().split(/ +/);\n }\n\n if (is.array(eventType)) {\n for (let i = 0; i < eventType.length; i++) {\n this[method](eventType[i], listener, options);\n }\n\n return true;\n }\n\n if (is.object(eventType)) {\n for (const prop in eventType) {\n this[method](prop, eventType[prop], listener);\n }\n\n return true;\n }\n }\n\n /*\\\n * Interactable.on\n [ method ]\n *\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n - eventType (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) This Interactable\n \\*/\n on (eventType, listener, options) {\n if (this._onOffMultiple('on', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.on(eventType, listener);\n }\n // delegated event for selector\n else if (is.string(this.target)) {\n events.addDelegate(this.target, this._context, eventType, listener, options);\n }\n else {\n events.add(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.off\n [ method ]\n *\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n - eventType (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) This Interactable\n \\*/\n off (eventType, listener, options) {\n if (this._onOffMultiple('off', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n // if it is an action event type\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.off(eventType, listener);\n }\n // delegated event\n else if (is.string(this.target)) {\n events.removeDelegate(this.target, this._context, eventType, listener, options);\n }\n // remove listener from this Interatable's element\n else {\n events.remove(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.set\n [ method ]\n *\n * Reset the options of this Interactable\n - options (object) The new settings to apply\n = (object) This Interactable\n \\*/\n set (options) {\n if (!is.object(options)) {\n options = {};\n }\n\n this.options = extend({}, defaults.base);\n\n const perActions = extend({}, defaults.perAction);\n\n for (const actionName in actions.methodDict) {\n const methodName = actions.methodDict[actionName];\n\n this.options[actionName] = extend({}, defaults[actionName]);\n\n this.setPerAction(actionName, perActions);\n\n this[methodName](options[actionName]);\n }\n\n for (const setting of Interactable.settingsMethods) {\n this.options[setting] = defaults.base[setting];\n\n if (setting in options) {\n this[setting](options[setting]);\n }\n }\n\n signals.fire('set', {\n options,\n interactable: this,\n });\n\n return this;\n }\n\n /*\\\n * Interactable.unset\n [ method ]\n *\n * Remove this interactable from the list of interactables and remove\n * it's action capabilities and event listeners\n *\n = (object) @interact\n \\*/\n unset () {\n events.remove(this.target, 'all');\n\n if (is.string(this.target)) {\n // remove delegated events\n for (const type in events.delegatedEvents) {\n const delegated = events.delegatedEvents[type];\n\n if (delegated.selectors[0] === this.target\n && delegated.contexts[0] === this._context) {\n\n delegated.selectors.splice(0, 1);\n delegated.contexts .splice(0, 1);\n delegated.listeners.splice(0, 1);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegated[type] = null;\n }\n }\n\n events.remove(this._context, type, events.delegateListener);\n events.remove(this._context, type, events.delegateUseCapture, true);\n }\n }\n else {\n events.remove(this, 'all');\n }\n\n signals.fire('unset', { interactable: this });\n\n scope.interactables.splice(indexOf(scope.interactables, this), 1);\n\n // Stop related interactions when an Interactable is unset\n for (const interaction of scope.interactions || []) {\n if (interaction.target === this && interaction.interacting()) {\n interaction.stop();\n }\n }\n\n return scope.interact;\n }\n}\n\nscope.interactables.indexOfElement = function indexOfElement (target, context) {\n context = context || scope.document;\n\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n if (interactable.target === target && interactable._context === context) {\n return i;\n }\n }\n return -1;\n};\n\nscope.interactables.get = function interactableGet (element, options, dontCheckInContext) {\n const ret = this[this.indexOfElement(element, options && options.context)];\n\n return ret && (is.string(element) || dontCheckInContext || ret.inContext(element))? ret : null;\n};\n\nscope.interactables.forEachSelector = function (callback, element) {\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n // skip non CSS selector targets and out of context elements\n if (!is.string(interactable.target)\n || (element && !interactable.inContext(element))) {\n continue;\n }\n\n const ret = callback(interactable, interactable.target, interactable._context, i, this);\n\n if (ret !== undefined) {\n return ret;\n }\n }\n};\n\n// all interact.js eventTypes\nInteractable.eventTypes = scope.eventTypes = [];\n\nInteractable.signals = signals;\n\nInteractable.settingsMethods = [ 'deltaSource', 'origin', 'preventDefault', 'rectChecker' ];\n\nmodule.exports = Interactable;\n","const scope = require('./scope');\nconst utils = require('./utils');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst finder = require('./utils/interactionFinder');\nconst signals = require('./utils/Signals').new();\n\nconst listeners = {};\nconst methodNames = [\n 'pointerDown', 'pointerMove', 'pointerUp',\n 'updatePointer', 'removePointer',\n];\n\n// for ignoring browser's simulated mouse events\nlet prevTouchTime = 0;\n\n// all active and idle interactions\nscope.interactions = [];\n\nclass Interaction {\n constructor () {\n this.target = null; // current interactable being interacted with\n this.element = null; // the target element of the interactable\n\n this.prepared = { // action that's ready to be fired on next move event\n name : null,\n axis : null,\n edges: null,\n };\n\n // keep track of added pointers\n this.pointers = [];\n this.pointerIds = [];\n this.downTargets = [];\n this.downTimes = [];\n\n // Previous native pointer move event coordinates\n this.prevCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n // current native pointer move event coordinates\n this.curCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Starting InteractEvent pointer coordinates\n this.startCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Change in coordinates and time of the pointer\n this.pointerDelta = {\n page : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n client : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n timeStamp: 0,\n };\n\n this.downEvent = null; // pointerdown/mousedown/touchstart event\n this.downPointer = {};\n\n this._eventTarget = null;\n this._curEventTarget = null;\n\n this.prevEvent = null; // previous action event\n\n this.pointerIsDown = false;\n this.pointerWasMoved = false;\n this._interacting = false;\n\n this.mouse = false;\n\n signals.fire('new', this);\n\n scope.interactions.push(this);\n }\n\n pointerDown (pointer, event, eventTarget) {\n const pointerIndex = this.updatePointer(pointer, event, true);\n\n signals.fire('down', {\n pointer,\n event,\n eventTarget,\n pointerIndex,\n interaction: this,\n });\n }\n\n /*\\\n * Interaction.start\n [ method ]\n *\n * Start an action with the given Interactable and Element as tartgets. The\n * action must be enabled for the target Interactable and an appropriate number\n * of pointers must be held down - 1 for drag/resize, 2 for gesture.\n *\n * Use it with `interactable.able({ manualStart: false })` to always\n * [start actions manually](https://github.com/taye/interact.js/issues/114)\n *\n - action (object) The action to be performed - drag, resize, etc.\n - target (Interactable) The Interactable to target\n - element (Element) The DOM Element to target\n = (object) interact\n **\n | interact(target)\n | .draggable({\n | // disable the default drag start by down->move\n | manualStart: true\n | })\n | // start dragging after the user holds the pointer down\n | .on('hold', function (event) {\n | var interaction = event.interaction;\n |\n | if (!interaction.interacting()) {\n | interaction.start({ name: 'drag' },\n | event.interactable,\n | event.currentTarget);\n | }\n | });\n \\*/\n start (action, target, element) {\n if (this.interacting()\n || !this.pointerIsDown\n || this.pointerIds.length < (action.name === 'gesture'? 2 : 1)) {\n return;\n }\n\n // if this interaction had been removed after stopping\n // add it back\n if (utils.indexOf(scope.interactions, this) === -1) {\n scope.interactions.push(this);\n }\n\n utils.copyAction(this.prepared, action);\n this.target = target;\n this.element = element;\n\n signals.fire('action-start', {\n interaction: this,\n event: this.downEvent,\n });\n }\n\n pointerMove (pointer, event, eventTarget) {\n if (!this.simulation) {\n this.updatePointer(pointer);\n utils.setCoords(this.curCoords, this.pointers);\n }\n\n const duplicateMove = (this.curCoords.page.x === this.prevCoords.page.x\n && this.curCoords.page.y === this.prevCoords.page.y\n && this.curCoords.client.x === this.prevCoords.client.x\n && this.curCoords.client.y === this.prevCoords.client.y);\n\n let dx;\n let dy;\n\n // register movement greater than pointerMoveTolerance\n if (this.pointerIsDown && !this.pointerWasMoved) {\n dx = this.curCoords.client.x - this.startCoords.client.x;\n dy = this.curCoords.client.y - this.startCoords.client.y;\n\n this.pointerWasMoved = utils.hypot(dx, dy) > Interaction.pointerMoveTolerance;\n }\n\n const signalArg = {\n pointer,\n pointerIndex: this.getPointerIndex(pointer),\n event,\n eventTarget,\n dx,\n dy,\n duplicate: duplicateMove,\n interaction: this,\n interactingBeforeMove: this.interacting(),\n };\n\n if (!duplicateMove) {\n // set pointer coordinate, time changes and speeds\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n }\n\n signals.fire('move', signalArg);\n\n if (!duplicateMove) {\n // if interacting, fire an 'action-move' signal etc\n if (this.interacting()) {\n this.doMove(signalArg);\n }\n\n if (this.pointerWasMoved) {\n utils.copyCoords(this.prevCoords, this.curCoords);\n }\n }\n }\n\n /*\\\n * Interaction.doMove\n [ method ]\n *\n * Force a move of the current action at the same coordinates. Useful if\n * snap/restrict has been changed and you want a movement with the new\n * settings.\n *\n **\n | interact(target)\n | .draggable(true)\n | .on('dragmove', function (event) {\n | if (someCondition) {\n | // change the snap settings\n | event.interactable.draggable({ snap: { targets: [] }});\n | // fire another move event with re-calculated snap\n | event.interaction.doMove();\n | }\n | });\n \\*/\n doMove (signalArg) {\n signalArg = utils.extend({\n pointer: this.pointers[0],\n event: this.prevEvent,\n eventTarget: this._eventTarget,\n interaction: this,\n }, signalArg || {});\n\n signals.fire('before-action-move', signalArg);\n\n if (!this._dontFireMove) {\n signals.fire('action-move', signalArg);\n }\n\n this._dontFireMove = false;\n }\n\n // End interact move events and stop auto-scroll unless simulation is running\n pointerUp (pointer, event, eventTarget, curEventTarget) {\n const pointerIndex = this.getPointerIndex(pointer);\n\n signals.fire(/cancel$/i.test(event.type)? 'cancel' : 'up', {\n pointer,\n pointerIndex,\n event,\n eventTarget,\n curEventTarget,\n interaction: this,\n });\n\n if (!this.simulation) {\n this.end(event);\n }\n\n this.pointerIsDown = false;\n this.removePointer(pointer, event);\n }\n\n /*\\\n * Interaction.end\n [ method ]\n *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n - event (PointerEvent) #optional\n **\n | interact(target)\n | .draggable(true)\n | .on('move', function (event) {\n | if (event.pageX > 1000) {\n | // end the current action\n | event.interaction.end();\n | // stop all further listeners from being called\n | event.stopImmediatePropagation();\n | }\n | });\n \\*/\n end (event) {\n event = event || this.prevEvent;\n\n if (this.interacting()) {\n signals.fire('action-end', {\n event,\n interaction: this,\n });\n }\n\n this.stop();\n }\n\n currentAction () {\n return this._interacting? this.prepared.name: null;\n }\n\n interacting () {\n return this._interacting;\n }\n\n stop () {\n signals.fire('stop', { interaction: this });\n\n if (this._interacting) {\n signals.fire('stop-active', { interaction: this });\n signals.fire('stop-' + this.prepared.name, { interaction: this });\n }\n\n this.target = this.element = null;\n\n this._interacting = false;\n this.prepared.name = this.prevEvent = null;\n }\n\n getPointerIndex (pointer) {\n return utils.indexOf(this.pointerIds, utils.getPointerId(pointer));\n }\n\n updatePointer (pointer, event, down = event && /(down|start)$/i.test(event.type)) {\n const id = utils.getPointerId(pointer);\n let index = this.getPointerIndex(pointer);\n\n if (index === -1) {\n index = this.pointerIds.length;\n this.pointerIds[index] = id;\n }\n\n if (down) {\n signals.fire('update-pointer-down', {\n pointer,\n event,\n down,\n pointerId: id,\n pointerIndex: index,\n interaction: this,\n });\n }\n\n this.pointers[index] = pointer;\n\n return index;\n }\n\n removePointer (pointer, event) {\n const id = utils.getPointerId(pointer);\n const index = this.mouse? 0 : utils.indexOf(this.pointerIds, id);\n\n if (index === -1) { return; }\n\n signals.fire('remove-pointer', {\n pointer,\n event,\n pointerIndex: index,\n interaction: this,\n });\n\n this.pointers .splice(index, 1);\n this.pointerIds .splice(index, 1);\n this.downTargets.splice(index, 1);\n this.downTimes .splice(index, 1);\n }\n\n _updateEventTargets (target, currentTarget) {\n this._eventTarget = target;\n this._curEventTarget = currentTarget;\n }\n}\n\nfor (let i = 0, len = methodNames.length; i < len; i++) {\n const method = methodNames[i];\n\n listeners[method] = doOnInteractions(method);\n}\n\nfunction doOnInteractions (method) {\n return (function (event) {\n const [eventTarget, curEventTarget] = utils.getEventTargets(event);\n const matches = []; // [ [pointer, interaction], ...]\n\n if (browser.supportsTouch && /touch/.test(event.type)) {\n prevTouchTime = new Date().getTime();\n\n for (let i = 0; i < event.changedTouches.length; i++) {\n const pointer = event.changedTouches[i];\n const interaction = finder.search(pointer, event.type, eventTarget);\n\n matches.push([pointer, interaction || new Interaction()]);\n }\n }\n else {\n let invalidPointer = false;\n\n if (!browser.supportsPointerEvent && /mouse/.test(event.type)) {\n // ignore mouse events while touch interactions are active\n for (let i = 0; i < scope.interactions.length && !invalidPointer; i++) {\n invalidPointer = !scope.interactions[i].mouse && scope.interactions[i].pointerIsDown;\n }\n\n // try to ignore mouse events that are simulated by the browser\n // after a touch event\n invalidPointer = invalidPointer\n || (new Date().getTime() - prevTouchTime < 500)\n // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated\n || event.timeStamp === 0;\n }\n\n if (!invalidPointer) {\n let interaction = finder.search(event, event.type, eventTarget);\n\n if (!interaction) {\n\n interaction = new Interaction();\n interaction.mouse = (/mouse/i.test(event.pointerType || event.type)\n // MSPointerEvent.MSPOINTER_TYPE_MOUSE\n || event.pointerType === 4\n || !event.pointerType);\n }\n\n matches.push([event, interaction]);\n }\n }\n\n for (const [pointer, interaction] of matches) {\n interaction._updateEventTargets(eventTarget, curEventTarget);\n interaction[method](pointer, event, eventTarget, curEventTarget);\n }\n });\n}\n\nfunction endAll (event) {\n for (let i = 0; i < scope.interactions.length; i++) {\n const interaction = scope.interactions[i];\n\n interaction.end(event);\n signals.fire('endall', { event, interaction });\n }\n}\n\nconst docEvents = { /* 'eventType': listenerFunc */ };\nconst pEventTypes = browser.pEventTypes;\n\nif (scope.PointerEvent) {\n docEvents[pEventTypes.down ] = listeners.pointerDown;\n docEvents[pEventTypes.move ] = listeners.pointerMove;\n docEvents[pEventTypes.up ] = listeners.pointerUp;\n docEvents[pEventTypes.cancel] = listeners.pointerUp;\n}\nelse {\n docEvents.mousedown = listeners.pointerDown;\n docEvents.mousemove = listeners.pointerMove;\n docEvents.mouseup = listeners.pointerUp;\n\n docEvents.touchstart = listeners.pointerDown;\n docEvents.touchmove = listeners.pointerMove;\n docEvents.touchend = listeners.pointerUp;\n docEvents.touchcancel = listeners.pointerUp;\n}\n\ndocEvents.blur = endAll;\n\nfunction onDocSignal ({ doc }, signalName) {\n const eventMethod = signalName.indexOf('add') === 0\n ? events.add : events.remove;\n\n // delegate event listener\n for (const eventType in scope.delegatedEvents) {\n eventMethod(doc, eventType, events.delegateListener);\n eventMethod(doc, eventType, events.delegateUseCapture, true);\n }\n\n for (const eventType in docEvents) {\n eventMethod(doc, eventType, docEvents[eventType]);\n }\n}\n\nsignals.on('update-pointer-down', ({ interaction, pointer, pointerId, pointerIndex, event, eventTarget, down }) => {\n interaction.pointerIds[pointerIndex] = pointerId;\n interaction.pointers[pointerIndex] = pointer;\n\n if (down) {\n interaction.pointerIsDown = true;\n }\n\n if (!interaction.interacting()) {\n utils.setCoords(interaction.startCoords, interaction.pointers);\n\n utils.copyCoords(interaction.curCoords , interaction.startCoords);\n utils.copyCoords(interaction.prevCoords, interaction.startCoords);\n\n interaction.downEvent = event;\n interaction.downTimes[pointerIndex] = interaction.curCoords.timeStamp;\n interaction.downTargets[pointerIndex] = eventTarget || event && utils.getEventTargets(event)[0];\n interaction.pointerWasMoved = false;\n\n utils.pointerExtend(interaction.downPointer, pointer);\n }\n});\n\nscope.signals.on('add-document' , onDocSignal);\nscope.signals.on('remove-document', onDocSignal);\n\nInteraction.pointerMoveTolerance = 1;\nInteraction.doOnInteractions = doOnInteractions;\nInteraction.endAll = endAll;\nInteraction.signals = signals;\nInteraction.docEvents = docEvents;\n\nscope.endAllInteractions = endAll;\n\nmodule.exports = Interaction;\n","const Interaction = require('../Interaction');\nconst InteractEvent = require('../InteractEvent');\n\nconst actions = {\n firePrepared,\n names: [],\n methodDict: {},\n};\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n interaction._interacting = true;\n firePrepared(interaction, event, 'start');\n});\n\nInteraction.signals.on('action-move', function ({ interaction, event, preEnd }) {\n firePrepared(interaction, event, 'move', preEnd);\n\n // if the action was ended in a listener\n if (!interaction.interacting()) { return false; }\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n firePrepared(interaction, event, 'end');\n});\n\nfunction firePrepared (interaction, event, phase, preEnd) {\n const actionName = interaction.prepared.name;\n\n const newEvent = new InteractEvent(interaction, event, actionName, phase, interaction.element, null, preEnd);\n\n interaction.target.fire(newEvent);\n interaction.prevEvent = newEvent;\n}\n\nmodule.exports = actions;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drag = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n startAxis : 'xy',\n lockAxis : 'xy',\n },\n\n checker: function (pointer, event, interactable) {\n const dragOptions = interactable.options.drag;\n\n return dragOptions.enabled\n ? { name: 'drag', axis: (dragOptions.lockAxis === 'start'\n ? dragOptions.startAxis\n : dragOptions.lockAxis)}\n : null;\n },\n\n getCursor: function () {\n return 'move';\n },\n};\n\nInteraction.signals.on('before-action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n interaction.curCoords.page.y = interaction.startCoords.page.y;\n interaction.curCoords.client.y = interaction.startCoords.client.y;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vx);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vx);\n interaction.pointerDelta.client.vy = 0;\n interaction.pointerDelta.page.vy = 0;\n }\n else if (axis === 'y') {\n interaction.curCoords.page.x = interaction.startCoords.page.x;\n interaction.curCoords.client.x = interaction.startCoords.client.x;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vy);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vy);\n interaction.pointerDelta.client.vx = 0;\n interaction.pointerDelta.page.vx = 0;\n }\n});\n\n// dragmove\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'dragmove') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n iEvent.pageY = interaction.startCoords.page.y;\n iEvent.clientY = interaction.startCoords.client.y;\n iEvent.dy = 0;\n }\n else if (axis === 'y') {\n iEvent.pageX = interaction.startCoords.page.x;\n iEvent.clientX = interaction.startCoords.client.x;\n iEvent.dx = 0;\n }\n});\n\n/*\\\n * Interactable.draggable\n [ method ]\n *\n * Gets or sets whether drag actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of drag events\n | var isDraggable = interact('ul li').draggable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on drag events (object makes the Interactable draggable)\n = (object) This Interactable\n | interact(element).draggable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // the axis in which the first movement must be\n | // for the drag sequence to start\n | // 'xy' by default - any direction\n | startAxis: 'x' || 'y' || 'xy',\n |\n | // 'xy' by default - don't restrict to one axis (move in any direction)\n | // 'x' or 'y' to restrict movement to either axis\n | // 'start' to restrict movement to the axis the drag started in\n | lockAxis: 'x' || 'y' || 'xy' || 'start',\n |\n | // max number of drags that can happen concurrently\n | // with elements of this Interactable. Infinity by default\n | max: Infinity,\n |\n | // max number of drags that can target the same element+Interactable\n | // 1 by default\n | maxPerElement: 2\n | });\n\\*/\nInteractable.prototype.draggable = function (options) {\n if (utils.is.object(options)) {\n this.options.drag.enabled = options.enabled === false? false: true;\n this.setPerAction('drag', options);\n this.setOnEvents('drag', options);\n\n if (/^(xy|x|y|start)$/.test(options.lockAxis)) {\n this.options.drag.lockAxis = options.lockAxis;\n }\n if (/^(xy|x|y)$/.test(options.startAxis)) {\n this.options.drag.startAxis = options.startAxis;\n }\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drag.enabled = options;\n\n if (!options) {\n this.ondragstart = this.ondragstart = this.ondragend = null;\n }\n\n return this;\n }\n\n return this.options.drag;\n};\n\nactions.drag = drag;\nactions.names.push('drag');\nutils.merge(Interactable.eventTypes, [\n 'dragstart',\n 'dragmove',\n 'draginertiastart',\n 'draginertiaresume',\n 'dragend',\n]);\nactions.methodDict.drag = 'draggable';\n\ndefaultOptions.drag = drag.defaults;\n\nmodule.exports = drag;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst scope = require('../scope');\nconst interact = require('../interact');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drop = {\n defaults: {\n enabled: false,\n accept : null,\n overlap: 'pointer',\n },\n};\n\nlet dynamicDrop = false;\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // reset active dropzones\n interaction.activeDrops.dropzones = [];\n interaction.activeDrops.elements = [];\n interaction.activeDrops.rects = [];\n\n interaction.dropEvents = null;\n\n if (!interaction.dynamicDrop) {\n setActiveDrops(interaction, interaction.element);\n }\n\n const dragEvent = interaction.prevEvent;\n const dropEvents = getDropEvents(interaction, event, dragEvent);\n\n if (dropEvents.activate) {\n fireActiveDrops(interaction, dropEvents.activate);\n }\n});\n\nInteractEvent.signals.on('new', function ({ interaction, iEvent, event }) {\n if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { return; }\n\n const draggableElement = interaction.element;\n const dragEvent = iEvent;\n const dropResult = getDrop(dragEvent, event, draggableElement);\n\n interaction.dropTarget = dropResult.dropzone;\n interaction.dropElement = dropResult.element;\n\n interaction.dropEvents = getDropEvents(interaction, event, dragEvent);\n});\n\nInteraction.signals.on('action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n fireDropEvents(interaction, interaction.dropEvents);\n});\n\nInteraction.signals.on('action-end', function ({ interaction }) {\n if (interaction.prepared.name === 'drag') {\n fireDropEvents(interaction, interaction.dropEvents);\n }\n});\n\nInteraction.signals.on('stop-drag', function ({ interaction }) {\n interaction.activeDrops.dropzones =\n interaction.activeDrops.elements =\n interaction.activeDrops.rects =\n interaction.dropEvents = null;\n});\n\nfunction collectDrops (interaction, element) {\n const drops = [];\n const elements = [];\n\n element = element || interaction.element;\n\n // collect all dropzones and their elements which qualify for a drop\n for (const current of scope.interactables) {\n if (!current.options.drop.enabled) { continue; }\n\n const accept = current.options.drop.accept;\n\n // test the draggable element against the dropzone's accept setting\n if ((utils.is.element(accept) && accept !== element)\n || (utils.is.string(accept)\n && !utils.matchesSelector(element, accept))) {\n\n continue;\n }\n\n // query for new elements if necessary\n const dropElements = utils.is.string(current.target)\n ? current._context.querySelectorAll(current.target)\n : [current.target];\n\n for (let i = 0; i < dropElements.length; i++) {\n const currentElement = dropElements[i];\n\n if (currentElement !== element) {\n drops.push(current);\n elements.push(currentElement);\n }\n }\n }\n\n return {\n elements,\n dropzones: drops,\n };\n}\n\nfunction fireActiveDrops (interaction, event) {\n let prevElement;\n\n // loop through all active dropzones and trigger event\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n const current = interaction.activeDrops.dropzones[i];\n const currentElement = interaction.activeDrops.elements [i];\n\n // prevent trigger of duplicate events on same element\n if (currentElement !== prevElement) {\n // set current element as event target\n event.target = currentElement;\n current.fire(event);\n }\n prevElement = currentElement;\n }\n}\n\n// Collect a new set of possible drops and save them in activeDrops.\n// setActiveDrops should always be called when a drag has just started or a\n// drag event happens while dynamicDrop is true\nfunction setActiveDrops (interaction, dragElement) {\n // get dropzones and their elements that could receive the draggable\n const possibleDrops = collectDrops(interaction, dragElement, true);\n\n interaction.activeDrops.dropzones = possibleDrops.dropzones;\n interaction.activeDrops.elements = possibleDrops.elements;\n interaction.activeDrops.rects = [];\n\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n interaction.activeDrops.rects[i] =\n interaction.activeDrops.dropzones[i].getRect(interaction.activeDrops.elements[i]);\n }\n}\n\nfunction getDrop (dragEvent, event, dragElement) {\n const interaction = dragEvent.interaction;\n const validDrops = [];\n\n if (dynamicDrop) {\n setActiveDrops(interaction, dragElement);\n }\n\n // collect all dropzones and their elements which qualify for a drop\n for (let j = 0; j < interaction.activeDrops.dropzones.length; j++) {\n const current = interaction.activeDrops.dropzones[j];\n const currentElement = interaction.activeDrops.elements [j];\n const rect = interaction.activeDrops.rects [j];\n\n validDrops.push(current.dropCheck(dragEvent, event, interaction.target, dragElement, currentElement, rect)\n ? currentElement\n : null);\n }\n\n // get the most appropriate dropzone based on DOM depth and order\n const dropIndex = utils.indexOfDeepestElement(validDrops);\n\n return {\n dropzone: interaction.activeDrops.dropzones[dropIndex] || null,\n element : interaction.activeDrops.elements [dropIndex] || null,\n };\n}\n\nfunction getDropEvents (interaction, pointerEvent, dragEvent) {\n const dropEvents = {\n enter : null,\n leave : null,\n activate : null,\n deactivate: null,\n move : null,\n drop : null,\n };\n\n const tmpl = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n };\n\n if (interaction.dropElement !== interaction.prevDropElement) {\n // if there was a prevDropTarget, create a dragleave event\n if (interaction.prevDropTarget) {\n dropEvents.leave = utils.extend({ type: 'dragleave' }, tmpl);\n\n dragEvent.dragLeave = dropEvents.leave.target = interaction.prevDropElement;\n dragEvent.prevDropzone = dropEvents.leave.dropzone = interaction.prevDropTarget;\n }\n // if the dropTarget is not null, create a dragenter event\n if (interaction.dropTarget) {\n dropEvents.enter = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n type : 'dragenter',\n };\n\n dragEvent.dragEnter = interaction.dropElement;\n dragEvent.dropzone = interaction.dropTarget;\n }\n }\n\n if (dragEvent.type === 'dragend' && interaction.dropTarget) {\n dropEvents.drop = utils.extend({ type: 'drop' }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n dragEvent.relatedTarget = interaction.dropElement;\n }\n if (dragEvent.type === 'dragstart') {\n dropEvents.activate = utils.extend({ type: 'dropactivate' }, tmpl);\n\n dropEvents.activate.target = null;\n dropEvents.activate.dropzone = null;\n }\n if (dragEvent.type === 'dragend') {\n dropEvents.deactivate = utils.extend({ type: 'dropdeactivate' }, tmpl);\n\n dropEvents.deactivate.target = null;\n dropEvents.deactivate.dropzone = null;\n }\n if (dragEvent.type === 'dragmove' && interaction.dropTarget) {\n dropEvents.move = utils.extend({\n dragmove : dragEvent,\n type : 'dropmove',\n }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n }\n\n return dropEvents;\n}\n\nfunction fireDropEvents (interaction, dropEvents) {\n if (dropEvents.leave) { interaction.prevDropTarget.fire(dropEvents.leave); }\n if (dropEvents.move ) { interaction.dropTarget.fire(dropEvents.move ); }\n if (dropEvents.enter) { interaction.dropTarget.fire(dropEvents.enter); }\n if (dropEvents.drop ) { interaction.dropTarget.fire(dropEvents.drop ); }\n if (dropEvents.deactivate) {\n fireActiveDrops(interaction, dropEvents.deactivate);\n }\n\n interaction.prevDropTarget = interaction.dropTarget;\n interaction.prevDropElement = interaction.dropElement;\n}\n\n/*\\\n * Interactable.dropzone\n [ method ]\n *\n * Returns or sets whether elements can be dropped onto this\n * Interactable to trigger drop events\n *\n * Dropzones can receive the following events:\n * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends\n * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone\n * - `dragmove` when a draggable that has entered the dropzone is moved\n * - `drop` when a draggable is dropped into this dropzone\n *\n * Use the `accept` option to allow only elements that match the given CSS\n * selector or element. The value can be:\n *\n * - **an Element** - only that element can be dropped into this dropzone.\n * - **a string**, - the element being dragged must match it as a CSS selector.\n * - **`null`** - accept options is cleared - it accepts any element.\n *\n * Use the `overlap` option to set how drops are checked for. The allowed\n * values are:\n *\n * - `'pointer'`, the pointer must be over the dropzone (default)\n * - `'center'`, the draggable element's center must be over the dropzone\n * - a number from 0-1 which is the `(intersection area) / (draggable area)`.\n * e.g. `0.5` for drop to happen when half of the area of the draggable is\n * over the dropzone\n *\n * Use the `checker` option to specify a function to check if a dragged\n * element is over this Interactable.\n *\n | interact(target)\n | .dropChecker(function(dragEvent, // related dragmove or dragend event\n | event, // TouchEvent/PointerEvent/MouseEvent\n | dropped, // bool result of the default checker\n | dropzone, // dropzone Interactable\n | dropElement, // dropzone elemnt\n | draggable, // draggable Interactable\n | draggableElement) {// draggable element\n |\n | return dropped && event.target.hasAttribute('allow-drop');\n | }\n *\n *\n - options (boolean | object | null) #optional The new value to be set.\n | interact('.drop').dropzone({\n | accept: '.can-drop' || document.getElementById('single-drop'),\n | overlap: 'pointer' || 'center' || zeroToOne\n | }\n = (boolean | object) The current setting or this Interactable\n\\*/\nInteractable.prototype.dropzone = function (options) {\n if (utils.is.object(options)) {\n this.options.drop.enabled = options.enabled === false? false: true;\n\n if (utils.is.function(options.ondrop) ) { this.events.ondrop = options.ondrop ; }\n if (utils.is.function(options.ondropactivate) ) { this.events.ondropactivate = options.ondropactivate ; }\n if (utils.is.function(options.ondropdeactivate)) { this.events.ondropdeactivate = options.ondropdeactivate; }\n if (utils.is.function(options.ondragenter) ) { this.events.ondragenter = options.ondragenter ; }\n if (utils.is.function(options.ondragleave) ) { this.events.ondragleave = options.ondragleave ; }\n if (utils.is.function(options.ondropmove) ) { this.events.ondropmove = options.ondropmove ; }\n\n if (/^(pointer|center)$/.test(options.overlap)) {\n this.options.drop.overlap = options.overlap;\n }\n else if (utils.is.number(options.overlap)) {\n this.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0);\n }\n if ('accept' in options) {\n this.options.drop.accept = options.accept;\n }\n if ('checker' in options) {\n this.options.drop.checker = options.checker;\n }\n\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drop.enabled = options;\n\n if (!options) {\n this.ondragenter = this.ondragleave = this.ondrop\n = this.ondropactivate = this.ondropdeactivate = null;\n }\n\n return this;\n }\n\n return this.options.drop;\n};\n\nInteractable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) {\n let dropped = false;\n\n // if the dropzone has no rect (eg. display: none)\n // call the custom dropChecker or just return false\n if (!(rect = rect || this.getRect(dropElement))) {\n return (this.options.drop.checker\n ? this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement)\n : false);\n }\n\n const dropOverlap = this.options.drop.overlap;\n\n if (dropOverlap === 'pointer') {\n const origin = utils.getOriginXY(draggable, draggableElement, 'drag');\n const page = utils.getPageXY(dragEvent);\n\n page.x += origin.x;\n page.y += origin.y;\n\n const horizontal = (page.x > rect.left) && (page.x < rect.right);\n const vertical = (page.y > rect.top ) && (page.y < rect.bottom);\n\n dropped = horizontal && vertical;\n }\n\n const dragRect = draggable.getRect(draggableElement);\n\n if (dragRect && dropOverlap === 'center') {\n const cx = dragRect.left + dragRect.width / 2;\n const cy = dragRect.top + dragRect.height / 2;\n\n dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom;\n }\n\n if (dragRect && utils.is.number(dropOverlap)) {\n const overlapArea = (Math.max(0, Math.min(rect.right , dragRect.right ) - Math.max(rect.left, dragRect.left))\n * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top , dragRect.top )));\n\n const overlapRatio = overlapArea / (dragRect.width * dragRect.height);\n\n dropped = overlapRatio >= dropOverlap;\n }\n\n if (this.options.drop.checker) {\n dropped = this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement);\n }\n\n return dropped;\n};\n\nInteractable.signals.on('unset', function ({ interactable }) {\n interactable.dropzone(false);\n});\n\nInteractable.settingsMethods.push('dropChecker');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.dropTarget = null; // the dropzone a drag target might be dropped into\n interaction.dropElement = null; // the element at the time of checking\n interaction.prevDropTarget = null; // the dropzone that was recently dragged away from\n interaction.prevDropElement = null; // the element at the time of checking\n interaction.dropEvents = null; // the dropEvents related to the current drag event\n\n interaction.activeDrops = {\n dropzones: [], // the dropzones that are mentioned below\n elements : [], // elements of dropzones that accept the target draggable\n rects : [], // the rects of the elements mentioned above\n };\n\n});\n\nInteraction.signals.on('stop', function ({ interaction }) {\n interaction.dropTarget = interaction.dropElement =\n interaction.prevDropTarget = interaction.prevDropElement = null;\n});\n\n/*\\\n * interact.dynamicDrop\n [ method ]\n *\n * Returns or sets whether the dimensions of dropzone elements are\n * calculated on every dragmove or only on dragstart for the default\n * dropChecker\n *\n - newValue (boolean) #optional True to check on each move. False to check only before start\n = (boolean | interact) The current setting or interact\n\\*/\ninteract.dynamicDrop = function (newValue) {\n if (utils.is.bool(newValue)) {\n //if (dragging && dynamicDrop !== newValue && !newValue) {\n //calcRects(dropzones);\n //}\n\n dynamicDrop = newValue;\n\n return interact;\n }\n return dynamicDrop;\n};\n\nutils.merge(Interactable.eventTypes, [\n 'dragenter',\n 'dragleave',\n 'dropactivate',\n 'dropdeactivate',\n 'dropmove',\n 'drop',\n]);\nactions.methodDict.drop = 'dropzone';\n\ndefaultOptions.drop = drop.defaults;\n\nmodule.exports = drop;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst gesture = {\n defaults: {\n enabled : false,\n origin : null,\n restrict: null,\n },\n\n checker: function (pointer, event, interactable, element, interaction) {\n if (interaction.pointerIds.length >= 2) {\n return { name: 'gesture' };\n }\n\n return null;\n },\n\n getCursor: function () {\n return '';\n },\n};\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturestart') { return; }\n iEvent.ds = 0;\n\n interaction.gesture.startDistance = interaction.gesture.prevDistance = iEvent.distance;\n interaction.gesture.startAngle = interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.scale = 1;\n});\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturemove') { return; }\n\n iEvent.ds = iEvent.scale - interaction.gesture.scale;\n\n interaction.target.fire(iEvent);\n\n interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.prevDistance = iEvent.distance;\n\n if (iEvent.scale !== Infinity\n && iEvent.scale !== null\n && iEvent.scale !== undefined\n && !isNaN(iEvent.scale)) {\n\n interaction.gesture.scale = iEvent.scale;\n }\n});\n\n/*\\\n * Interactable.gesturable\n [ method ]\n *\n * Gets or sets whether multitouch gestures can be performed on the\n * Interactable's element\n *\n = (boolean) Indicates if this can be the target of gesture events\n | var isGestureable = interact(element).gesturable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on gesture events (makes the Interactable gesturable)\n = (object) this Interactable\n | interact(element).gesturable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // limit multiple gestures.\n | // See the explanation in @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n\\*/\nInteractable.prototype.gesturable = function (options) {\n if (utils.is.object(options)) {\n this.options.gesture.enabled = options.enabled === false? false: true;\n this.setPerAction('gesture', options);\n this.setOnEvents('gesture', options);\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.gesture.enabled = options;\n\n if (!options) {\n this.ongesturestart = this.ongesturestart = this.ongestureend = null;\n }\n\n return this;\n }\n\n return this.options.gesture;\n};\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action, event, starting, ending, deltaSource }) {\n if (action !== 'gesture') { return; }\n\n const pointers = interaction.pointers;\n\n iEvent.touches = [pointers[0], pointers[1]];\n\n if (starting) {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = 1;\n iEvent.ds = 0;\n iEvent.angle = utils.touchAngle(pointers, undefined, deltaSource);\n iEvent.da = 0;\n }\n else if (ending || event instanceof InteractEvent) {\n iEvent.distance = interaction.prevEvent.distance;\n iEvent.box = interaction.prevEvent.box;\n iEvent.scale = interaction.prevEvent.scale;\n iEvent.ds = iEvent.scale - 1;\n iEvent.angle = interaction.prevEvent.angle;\n iEvent.da = iEvent.angle - interaction.gesture.startAngle;\n }\n else {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = iEvent.distance / interaction.gesture.startDistance;\n iEvent.angle = utils.touchAngle(pointers, interaction.gesture.prevAngle, deltaSource);\n\n iEvent.ds = iEvent.scale - interaction.gesture.prevScale;\n iEvent.da = iEvent.angle - interaction.gesture.prevAngle;\n }\n});\n\nInteraction.signals.on('new', function (interaction) {\n interaction.gesture = {\n start: { x: 0, y: 0 },\n\n startDistance: 0, // distance between two touches of touchStart\n prevDistance : 0,\n distance : 0,\n\n scale: 1, // gesture.distance / gesture.startDistance\n\n startAngle: 0, // angle of line joining two touches\n prevAngle : 0, // angle of the previous gesture event\n };\n});\n\nactions.gesture = gesture;\nactions.names.push('gesture');\nutils.merge(Interactable.eventTypes, [\n 'gesturestart',\n 'gesturemove',\n 'gestureend',\n]);\nactions.methodDict.gesture = 'gesturable';\n\ndefaultOptions.gesture = gesture.defaults;\n\nmodule.exports = gesture;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\n// Less Precision with touch input\nconst defaultMargin = browser.supportsTouch || browser.supportsPointerEvent? 20: 10;\n\nconst resize = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n square: false,\n preserveAspectRatio: false,\n axis: 'xy',\n\n // use default margin\n margin: NaN,\n\n // object with props left, right, top, bottom which are\n // true/false values to resize when the pointer is over that edge,\n // CSS selectors to match the handles for each direction\n // or the Elements for each handle\n edges: null,\n\n // a value of 'none' will limit the resize rect to a minimum of 0x0\n // 'negate' will alow the rect to have negative width/height\n // 'reposition' will keep the width/height positive by swapping\n // the top and bottom edges and/or swapping the left and right edges\n invert: 'none',\n },\n\n checker: function (pointer, event, interactable, element, interaction, rect) {\n if (!rect) { return null; }\n\n const page = utils.extend({}, interaction.curCoords.page);\n const options = interactable.options;\n\n if (options.resize.enabled) {\n const resizeOptions = options.resize;\n const resizeEdges = { left: false, right: false, top: false, bottom: false };\n\n // if using resize.edges\n if (utils.is.object(resizeOptions.edges)) {\n for (const edge in resizeEdges) {\n resizeEdges[edge] = checkResizeEdge(edge,\n resizeOptions.edges[edge],\n page,\n interaction._eventTarget,\n element,\n rect,\n resizeOptions.margin || defaultMargin);\n }\n\n resizeEdges.left = resizeEdges.left && !resizeEdges.right;\n resizeEdges.top = resizeEdges.top && !resizeEdges.bottom;\n\n if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) {\n return {\n name: 'resize',\n edges: resizeEdges,\n };\n }\n }\n else {\n const right = options.resize.axis !== 'y' && page.x > (rect.right - defaultMargin);\n const bottom = options.resize.axis !== 'x' && page.y > (rect.bottom - defaultMargin);\n\n if (right || bottom) {\n return {\n name: 'resize',\n axes: (right? 'x' : '') + (bottom? 'y' : ''),\n };\n }\n }\n }\n\n return null;\n },\n\n cursors: (browser.isIe9OrOlder ? {\n x : 'e-resize',\n y : 's-resize',\n xy: 'se-resize',\n\n top : 'n-resize',\n left : 'w-resize',\n bottom : 's-resize',\n right : 'e-resize',\n topleft : 'se-resize',\n bottomright: 'se-resize',\n topright : 'ne-resize',\n bottomleft : 'ne-resize',\n } : {\n x : 'ew-resize',\n y : 'ns-resize',\n xy: 'nwse-resize',\n\n top : 'ns-resize',\n left : 'ew-resize',\n bottom : 'ns-resize',\n right : 'ew-resize',\n topleft : 'nwse-resize',\n bottomright: 'nwse-resize',\n topright : 'nesw-resize',\n bottomleft : 'nesw-resize',\n }),\n\n getCursor: function (action) {\n if (action.axis) {\n return resize.cursors[action.name + action.axis];\n }\n else if (action.edges) {\n let cursorKey = '';\n const edgeNames = ['top', 'bottom', 'left', 'right'];\n\n for (let i = 0; i < 4; i++) {\n if (action.edges[edgeNames[i]]) {\n cursorKey += edgeNames[i];\n }\n }\n\n return resize.cursors[cursorKey];\n }\n },\n};\n\n// resizestart\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'resizestart' || !interaction.prepared.edges) {\n return;\n }\n\n const startRect = interaction.target.getRect(interaction.element);\n const resizeOptions = interaction.target.options.resize;\n\n /*\n * When using the `resizable.square` or `resizable.preserveAspectRatio` options, resizing from one edge\n * will affect another. E.g. with `resizable.square`, resizing to make the right edge larger will make\n * the bottom edge larger by the same amount. We call these 'linked' edges. Any linked edges will depend\n * on the active edges and the edge being interacted with.\n */\n if (resizeOptions.square || resizeOptions.preserveAspectRatio) {\n const linkedEdges = utils.extend({}, interaction.prepared.edges);\n\n linkedEdges.top = linkedEdges.top || (linkedEdges.left && !linkedEdges.bottom);\n linkedEdges.left = linkedEdges.left || (linkedEdges.top && !linkedEdges.right );\n linkedEdges.bottom = linkedEdges.bottom || (linkedEdges.right && !linkedEdges.top );\n linkedEdges.right = linkedEdges.right || (linkedEdges.bottom && !linkedEdges.left );\n\n interaction.prepared._linkedEdges = linkedEdges;\n }\n else {\n interaction.prepared._linkedEdges = null;\n }\n\n // if using `resizable.preserveAspectRatio` option, record aspect ratio at the start of the resize\n if (resizeOptions.preserveAspectRatio) {\n interaction.resizeStartAspectRatio = startRect.width / startRect.height;\n }\n\n interaction.resizeRects = {\n start : startRect,\n current : utils.extend({}, startRect),\n inverted : utils.extend({}, startRect),\n previous : utils.extend({}, startRect),\n delta : {\n left: 0, right : 0, width : 0,\n top : 0, bottom: 0, height: 0,\n },\n };\n\n iEvent.rect = interaction.resizeRects.inverted;\n iEvent.deltaRect = interaction.resizeRects.delta;\n});\n\n// resizemove\nInteractEvent.signals.on('new', function ({ iEvent, phase, interaction }) {\n if (phase !== 'move' || !interaction.prepared.edges) { return; }\n\n const resizeOptions = interaction.target.options.resize;\n const invert = resizeOptions.invert;\n const invertible = invert === 'reposition' || invert === 'negate';\n\n let edges = interaction.prepared.edges;\n\n const start = interaction.resizeRects.start;\n const current = interaction.resizeRects.current;\n const inverted = interaction.resizeRects.inverted;\n const delta = interaction.resizeRects.delta;\n const previous = utils.extend(interaction.resizeRects.previous, inverted);\n const originalEdges = edges;\n\n let dx = iEvent.dx;\n let dy = iEvent.dy;\n\n if (resizeOptions.preserveAspectRatio || resizeOptions.square) {\n // `resize.preserveAspectRatio` takes precedence over `resize.square`\n const startAspectRatio = resizeOptions.preserveAspectRatio\n ? interaction.resizeStartAspectRatio\n : 1;\n\n edges = interaction.prepared._linkedEdges;\n\n if ((originalEdges.left && originalEdges.bottom)\n || (originalEdges.right && originalEdges.top)) {\n dy = -dx / startAspectRatio;\n }\n else if (originalEdges.left || originalEdges.right ) { dy = dx / startAspectRatio; }\n else if (originalEdges.top || originalEdges.bottom) { dx = dy * startAspectRatio; }\n }\n\n // update the 'current' rect without modifications\n if (edges.top ) { current.top += dy; }\n if (edges.bottom) { current.bottom += dy; }\n if (edges.left ) { current.left += dx; }\n if (edges.right ) { current.right += dx; }\n\n if (invertible) {\n // if invertible, copy the current rect\n utils.extend(inverted, current);\n\n if (invert === 'reposition') {\n // swap edge values if necessary to keep width/height positive\n let swap;\n\n if (inverted.top > inverted.bottom) {\n swap = inverted.top;\n\n inverted.top = inverted.bottom;\n inverted.bottom = swap;\n }\n if (inverted.left > inverted.right) {\n swap = inverted.left;\n\n inverted.left = inverted.right;\n inverted.right = swap;\n }\n }\n }\n else {\n // if not invertible, restrict to minimum of 0x0 rect\n inverted.top = Math.min(current.top, start.bottom);\n inverted.bottom = Math.max(current.bottom, start.top);\n inverted.left = Math.min(current.left, start.right);\n inverted.right = Math.max(current.right, start.left);\n }\n\n inverted.width = inverted.right - inverted.left;\n inverted.height = inverted.bottom - inverted.top ;\n\n for (const edge in inverted) {\n delta[edge] = inverted[edge] - previous[edge];\n }\n\n iEvent.edges = interaction.prepared.edges;\n iEvent.rect = inverted;\n iEvent.deltaRect = delta;\n});\n\n/*\\\n * Interactable.resizable\n [ method ]\n *\n * Gets or sets whether resize actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of resize elements\n | var isResizeable = interact('input[type=text]').resizable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on resize events (object makes the Interactable resizable)\n = (object) This Interactable\n | interact(element).resizable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | edges: {\n | top : true, // Use pointer coords to check for resize.\n | left : false, // Disable resizing from left edge.\n | bottom: '.resize-s',// Resize if pointer target matches selector\n | right : handleEl // Resize if pointer target is the given Element\n | },\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height are adjusted at a 1:1 ratio.\n | square: false,\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height maintain the aspect ratio they had when resizing started.\n | preserveAspectRatio: false,\n |\n | // a value of 'none' will limit the resize rect to a minimum of 0x0\n | // 'negate' will allow the rect to have negative width/height\n | // 'reposition' will keep the width/height positive by swapping\n | // the top and bottom edges and/or swapping the left and right edges\n | invert: 'none' || 'negate' || 'reposition'\n |\n | // limit multiple resizes.\n | // See the explanation in the @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n \\*/\nInteractable.prototype.resizable = function (options) {\n if (utils.is.object(options)) {\n this.options.resize.enabled = options.enabled === false? false: true;\n this.setPerAction('resize', options);\n this.setOnEvents('resize', options);\n\n if (/^x$|^y$|^xy$/.test(options.axis)) {\n this.options.resize.axis = options.axis;\n }\n else if (options.axis === null) {\n this.options.resize.axis = defaultOptions.resize.axis;\n }\n\n if (utils.is.bool(options.preserveAspectRatio)) {\n this.options.resize.preserveAspectRatio = options.preserveAspectRatio;\n }\n else if (utils.is.bool(options.square)) {\n this.options.resize.square = options.square;\n }\n\n return this;\n }\n if (utils.is.bool(options)) {\n this.options.resize.enabled = options;\n\n if (!options) {\n this.onresizestart = this.onresizestart = this.onresizeend = null;\n }\n\n return this;\n }\n return this.options.resize;\n};\n\nfunction checkResizeEdge (name, value, page, element, interactableElement, rect, margin) {\n // false, '', undefined, null\n if (!value) { return false; }\n\n // true value, use pointer coords and element rect\n if (value === true) {\n // if dimensions are negative, \"switch\" edges\n const width = utils.is.number(rect.width )? rect.width : rect.right - rect.left;\n const height = utils.is.number(rect.height)? rect.height : rect.bottom - rect.top ;\n\n if (width < 0) {\n if (name === 'left' ) { name = 'right'; }\n else if (name === 'right') { name = 'left' ; }\n }\n if (height < 0) {\n if (name === 'top' ) { name = 'bottom'; }\n else if (name === 'bottom') { name = 'top' ; }\n }\n\n if (name === 'left' ) { return page.x < ((width >= 0? rect.left: rect.right ) + margin); }\n if (name === 'top' ) { return page.y < ((height >= 0? rect.top : rect.bottom) + margin); }\n\n if (name === 'right' ) { return page.x > ((width >= 0? rect.right : rect.left) - margin); }\n if (name === 'bottom') { return page.y > ((height >= 0? rect.bottom: rect.top ) - margin); }\n }\n\n // the remaining checks require an element\n if (!utils.is.element(element)) { return false; }\n\n return utils.is.element(value)\n // the value is an element to use as a resize handle\n ? value === element\n // otherwise check if element matches value as selector\n : utils.matchesUpTo(element, value, interactableElement);\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.resizeAxes = 'xy';\n});\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action }) {\n if (action !== 'resize' || !interaction.resizeAxes) { return; }\n\n const options = interaction.target.options;\n\n if (options.resize.square) {\n if (interaction.resizeAxes === 'y') {\n iEvent.dx = iEvent.dy;\n }\n else {\n iEvent.dy = iEvent.dx;\n }\n iEvent.axes = 'xy';\n }\n else {\n iEvent.axes = interaction.resizeAxes;\n\n if (interaction.resizeAxes === 'x') {\n iEvent.dy = 0;\n }\n else if (interaction.resizeAxes === 'y') {\n iEvent.dx = 0;\n }\n }\n});\n\nactions.resize = resize;\nactions.names.push('resize');\nutils.merge(Interactable.eventTypes, [\n 'resizestart',\n 'resizemove',\n 'resizeinertiastart',\n 'resizeinertiaresume',\n 'resizeend',\n]);\nactions.methodDict.resize = 'resizable';\n\ndefaultOptions.resize = resize.defaults;\n\nmodule.exports = resize;\n","const raf = require('./utils/raf');\nconst getWindow = require('./utils/window').getWindow;\nconst is = require('./utils/is');\nconst domUtils = require('./utils/domUtils');\nconst Interaction = require('./Interaction');\nconst defaultOptions = require('./defaultOptions');\n\nconst autoScroll = {\n defaults: {\n enabled : false,\n container: null, // the item that is scrolled (Window or HTMLElement)\n margin : 60,\n speed : 300, // the scroll speed in pixels per second\n },\n\n interaction: null,\n i: null, // the handle returned by window.setInterval\n x: 0, y: 0, // Direction each pulse is to scroll in\n\n isScrolling: false,\n prevTime: 0,\n\n start: function (interaction) {\n autoScroll.isScrolling = true;\n raf.cancel(autoScroll.i);\n\n autoScroll.interaction = interaction;\n autoScroll.prevTime = new Date().getTime();\n autoScroll.i = raf.request(autoScroll.scroll);\n },\n\n stop: function () {\n autoScroll.isScrolling = false;\n raf.cancel(autoScroll.i);\n },\n\n // scroll the window by the values in scroll.x/y\n scroll: function () {\n const options = autoScroll.interaction.target.options[autoScroll.interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(autoScroll.interaction.element);\n const now = new Date().getTime();\n // change in time in seconds\n const dt = (now - autoScroll.prevTime) / 1000;\n // displacement\n const s = options.speed * dt;\n\n if (s >= 1) {\n if (is.window(container)) {\n container.scrollBy(autoScroll.x * s, autoScroll.y * s);\n }\n else if (container) {\n container.scrollLeft += autoScroll.x * s;\n container.scrollTop += autoScroll.y * s;\n }\n\n autoScroll.prevTime = now;\n }\n\n if (autoScroll.isScrolling) {\n raf.cancel(autoScroll.i);\n autoScroll.i = raf.request(autoScroll.scroll);\n }\n },\n check: function (interactable, actionName) {\n const options = interactable.options;\n\n return options[actionName].autoScroll && options[actionName].autoScroll.enabled;\n },\n onInteractionMove: function ({ interaction, pointer }) {\n if (!(interaction.interacting()\n && autoScroll.check(interaction.target, interaction.prepared.name))) {\n return;\n }\n\n if (interaction.simulation) {\n autoScroll.x = autoScroll.y = 0;\n return;\n }\n\n let top;\n let right;\n let bottom;\n let left;\n\n const options = interaction.target.options[interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(interaction.element);\n\n if (is.window(container)) {\n left = pointer.clientX < autoScroll.margin;\n top = pointer.clientY < autoScroll.margin;\n right = pointer.clientX > container.innerWidth - autoScroll.margin;\n bottom = pointer.clientY > container.innerHeight - autoScroll.margin;\n }\n else {\n const rect = domUtils.getElementClientRect(container);\n\n left = pointer.clientX < rect.left + autoScroll.margin;\n top = pointer.clientY < rect.top + autoScroll.margin;\n right = pointer.clientX > rect.right - autoScroll.margin;\n bottom = pointer.clientY > rect.bottom - autoScroll.margin;\n }\n\n autoScroll.x = (right ? 1: left? -1: 0);\n autoScroll.y = (bottom? 1: top? -1: 0);\n\n if (!autoScroll.isScrolling) {\n // set the autoScroll properties to those of the target\n autoScroll.margin = options.margin;\n autoScroll.speed = options.speed;\n\n autoScroll.start(interaction);\n }\n },\n};\n\nInteraction.signals.on('stop-active', function () {\n autoScroll.stop();\n});\n\nInteraction.signals.on('action-move', autoScroll.onInteractionMove);\n\ndefaultOptions.perAction.autoScroll = autoScroll.defaults;\n\nmodule.exports = autoScroll;\n","const Interactable = require('../Interactable');\nconst actions = require('../actions/base');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.ignoreFrom\n [ method ]\n *\n * If the target of the `mousedown`, `pointerdown` or `touchstart`\n * event or any of it's parents match the given CSS selector or\n * Element, no drag/resize/gesture is started.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to not ignore any elements\n = (string | Element | object) The current ignoreFrom value or this Interactable\n **\n | interact(element, { ignoreFrom: document.getElementById('no-action') });\n | // or\n | interact(element).ignoreFrom('input, textarea, a');\n\\*/\nInteractable.prototype.ignoreFrom = function (newValue) {\n return this._backCompatOption('ignoreFrom', newValue);\n};\n\n/*\\\n * Interactable.allowFrom\n [ method ]\n *\n * A drag/resize/gesture is started only If the target of the\n * `mousedown`, `pointerdown` or `touchstart` event or any of it's\n * parents match the given CSS selector or Element.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to allow from any element\n = (string | Element | object) The current allowFrom value or this Interactable\n **\n | interact(element, { allowFrom: document.getElementById('drag-handle') });\n | // or\n | interact(element).allowFrom('.handle');\n\\*/\nInteractable.prototype.allowFrom = function (newValue) {\n return this._backCompatOption('allowFrom', newValue);\n};\n\nInteractable.prototype.testIgnore = function (ignoreFrom, interactableElement, element) {\n if (!ignoreFrom || !is.element(element)) { return false; }\n\n if (is.string(ignoreFrom)) {\n return domUtils.matchesUpTo(element, ignoreFrom, interactableElement);\n }\n else if (is.element(ignoreFrom)) {\n return domUtils.nodeContains(ignoreFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testAllow = function (allowFrom, interactableElement, element) {\n if (!allowFrom) { return true; }\n\n if (!is.element(element)) { return false; }\n\n if (is.string(allowFrom)) {\n return domUtils.matchesUpTo(element, allowFrom, interactableElement);\n }\n else if (is.element(allowFrom)) {\n return domUtils.nodeContains(allowFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testIgnoreAllow = function (options, interactableElement, eventTarget) {\n return (!this.testIgnore(options.ignoreFrom, interactableElement, eventTarget)\n && this.testAllow(options.allowFrom, interactableElement, eventTarget));\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (event.buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\n","const interact = require('../interact');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst actions = require('../actions/base');\nconst defaultOptions = require('../defaultOptions');\nconst browser = require('../utils/browser');\nconst scope = require('../scope');\nconst utils = require('../utils');\nconst signals = require('../utils/Signals').new();\n\nrequire('./InteractableMethods');\n\nconst autoStart = {\n signals,\n withinInteractionLimit,\n // Allow this many interactions to happen simultaneously\n maxInteractions: Infinity,\n defaults: {\n perAction: {\n manualStart: false,\n max: Infinity,\n maxPerElement: 1,\n allowFrom: null,\n ignoreFrom: null,\n },\n },\n setActionDefaults: function (action) {\n utils.extend(action.defaults, autoStart.defaults.perAction);\n },\n};\n\n// set cursor style on mousedown\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget }) {\n if (interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\n// set cursor style on mousemove\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget }) {\n if (!interaction.mouse\n || interaction.pointerIsDown\n || interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\nInteraction.signals.on('move', function (arg) {\n const { interaction, event } = arg;\n\n if (!interaction.pointerIsDown\n || interaction.interacting()\n || !interaction.pointerWasMoved\n || !interaction.prepared.name) {\n return;\n }\n\n signals.fire('before-start', arg);\n\n const target = interaction.target;\n\n if (interaction.prepared.name && target) {\n // check manualStart and interaction limit\n if (target.options[interaction.prepared.name].manualStart\n || !withinInteractionLimit(target, interaction.element, interaction.prepared)) {\n interaction.stop(event);\n }\n else {\n interaction.start(interaction.prepared, target, interaction.element);\n }\n }\n});\n\n// Check if the current target supports the action.\n// If so, return the validated action. Otherwise, return null\nfunction validateAction (action, interactable, element, eventTarget) {\n if (utils.is.object(action)\n && interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget)\n && interactable.options[action.name].enabled\n && withinInteractionLimit(interactable, element, action)) {\n return action;\n }\n\n return null;\n}\n\nfunction validateSelector (interaction, pointer, event, matches, matchElements, eventTarget) {\n for (let i = 0, len = matches.length; i < len; i++) {\n const match = matches[i];\n const matchElement = matchElements[i];\n const action = validateAction(match.getAction(pointer, event, interaction, matchElement),\n match,\n matchElement,\n eventTarget);\n\n if (action) {\n return {\n action,\n target: match,\n element: matchElement,\n };\n }\n }\n\n return {};\n}\n\nfunction getActionInfo (interaction, pointer, event, eventTarget) {\n let matches = [];\n let matchElements = [];\n\n let element = eventTarget;\n let action = null;\n\n function pushMatches (interactable, selector, context) {\n const elements = (browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined);\n\n if (utils.matchesSelector(element, selector, elements)) {\n\n matches.push(interactable);\n matchElements.push(element);\n }\n }\n\n while (utils.is.element(element)) {\n matches = [];\n matchElements = [];\n\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && (action = validateAction(elementInteractable.getAction(pointer, event, interaction, element, eventTarget),\n elementInteractable,\n element,\n eventTarget))\n && !elementInteractable.options[action.name].manualStart) {\n return {\n element,\n action,\n target: elementInteractable,\n };\n }\n else {\n scope.interactables.forEachSelector(pushMatches, element);\n\n const actionInfo = validateSelector(interaction, pointer, event, matches, matchElements, eventTarget);\n\n if (actionInfo.action\n && !actionInfo.target.options[actionInfo.action.name].manualStart) {\n return actionInfo;\n }\n }\n\n element = utils.parentNode(element);\n }\n\n return {};\n}\n\nfunction prepare (interaction, { action, target, element }) {\n action = action || {};\n\n if (interaction.target && interaction.target.options.styleCursor) {\n interaction.target._doc.documentElement.style.cursor = '';\n }\n\n interaction.target = target;\n interaction.element = element;\n utils.copyAction(interaction.prepared, action);\n\n if (target && target.options.styleCursor) {\n const cursor = action? actions[action.name].getCursor(action) : '';\n interaction.target._doc.documentElement.style.cursor = cursor;\n }\n\n signals.fire('prepared', { interaction: interaction });\n}\n\nInteraction.signals.on('stop', function ({ interaction }) {\n const target = interaction.target;\n\n if (target && target.options.styleCursor) {\n target._doc.documentElement.style.cursor = '';\n }\n});\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (utils.is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (utils.is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n const buttons = event.buttons || ({\n 0: 1,\n 1: 4,\n 3: 8,\n 4: 16,\n })[event.button];\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\nfunction withinInteractionLimit (interactable, element, action) {\n const options = interactable.options;\n const maxActions = options[action.name].max;\n const maxPerElement = options[action.name].maxPerElement;\n let activeInteractions = 0;\n let targetCount = 0;\n let targetElementCount = 0;\n\n // no actions if any of these values == 0\n if (!(maxActions && maxPerElement && autoStart.maxInteractions)) { return; }\n\n for (let i = 0, len = scope.interactions.length; i < len; i++) {\n const interaction = scope.interactions[i];\n const otherAction = interaction.prepared.name;\n\n if (!interaction.interacting()) { continue; }\n\n activeInteractions++;\n\n if (activeInteractions >= autoStart.maxInteractions) {\n return false;\n }\n\n if (interaction.target !== interactable) { continue; }\n\n targetCount += (otherAction === action.name)|0;\n\n if (targetCount >= maxActions) {\n return false;\n }\n\n if (interaction.element === element) {\n targetElementCount++;\n\n if (otherAction !== action.name || targetElementCount >= maxPerElement) {\n return false;\n }\n }\n }\n\n return autoStart.maxInteractions > 0;\n}\n\n/*\\\n * interact.maxInteractions\n [ method ]\n **\n * Returns or sets the maximum number of concurrent interactions allowed.\n * By default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables\n * and elements, you need to enable it in the draggable, resizable and\n * gesturable `'max'` and `'maxPerElement'` options.\n **\n - newValue (number) #optional Any number. newValue <= 0 means no interactions.\n\\*/\ninteract.maxInteractions = function (newValue) {\n if (utils.is.number(newValue)) {\n autoStart.maxInteractions = newValue;\n\n return this;\n }\n\n return autoStart.maxInteractions;\n};\n\nInteractable.settingsMethods.push('styleCursor');\nInteractable.settingsMethods.push('actionChecker');\nInteractable.settingsMethods.push('ignoreFrom');\nInteractable.settingsMethods.push('allowFrom');\n\ndefaultOptions.base.actionChecker = null;\ndefaultOptions.base.styleCursor = true;\n\nutils.extend(defaultOptions.perAction, autoStart.defaults.perAction);\n\nmodule.exports = autoStart;\n","const autoStart = require('./base');\nconst Interaction = require('../Interaction');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.delayTimer = null;\n});\n\nautoStart.signals.on('prepared', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.delayTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.target, interaction.element);\n }, delay);\n }\n});\n\nInteraction.signals.on('move', function ({ interaction, duplicate }) {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.delayTimer);\n }\n});\n\n// prevent regular down->move autoStart\nautoStart.signals.on('before-start', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.prepared.name = null;\n }\n});\n","const autoStart = require('./base');\nconst scope = require('../scope');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\n\nconst { matchesSelector, parentNode } = require('../utils/domUtils');\n\nautoStart.setActionDefaults(require('../actions/drag'));\n\nautoStart.signals.on('before-start', function ({ interaction, eventTarget, dx, dy }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // check if a drag is in the correct axis\n const absX = Math.abs(dx);\n const absY = Math.abs(dy);\n const options = interaction.target.options.drag;\n const startAxis = options.startAxis;\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy');\n\n interaction.prepared.axis = options.lockAxis === 'start'\n ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n : options.lockAxis;\n\n // if the movement isn't in the startAxis of the interactable\n if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) {\n // cancel the prepared action\n interaction.prepared.name = null;\n\n // then try to get a drag from another ineractable\n\n if (!interaction.prepared.name) {\n\n let element = eventTarget;\n\n const getDraggable = function (interactable, selector, context) {\n const elements = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n if (interactable === interaction.target) { return; }\n\n if (!options.manualStart\n && !interactable.testIgnoreAllow(options, element, eventTarget)\n && matchesSelector(element, selector, elements)) {\n\n const action = interactable.getAction(interaction.downPointer,\n interaction.downEvent,\n interaction,\n element);\n\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, interactable)\n && autoStart.validateAction(action, interactable, element, eventTarget)) {\n\n return interactable;\n }\n }\n };\n\n let action = null;\n\n // check all interactables\n while (is.element(element)) {\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && elementInteractable !== interaction.target\n && !elementInteractable.options.drag.manualStart) {\n\n action = elementInteractable.getAction(interaction.downPointer, interaction.downEvent, interaction, element);\n }\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, elementInteractable)) {\n\n interaction.prepared.name = 'drag';\n interaction.target = elementInteractable;\n interaction.element = element;\n break;\n }\n\n const selectorInteractable = scope.interactables.forEachSelector(getDraggable, element);\n\n if (selectorInteractable) {\n interaction.prepared.name = 'drag';\n interaction.target = selectorInteractable;\n interaction.element = element;\n break;\n }\n\n element = parentNode(element);\n }\n }\n }\n});\n\nfunction checkStartAxis (startAxis, interactable) {\n if (!interactable) { return false; }\n\n const thisAxis = interactable.options.drag.startAxis;\n\n return (startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis);\n}\n","require('./base').setActionDefaults(require('../actions/gesture'));\n","require('./base').setActionDefaults(require('../actions/resize'));\n","module.exports = {\n base: {\n accept : null,\n preventDefault: 'auto',\n deltaSource : 'page',\n },\n\n perAction: {\n origin: { x: 0, y: 0 },\n\n // only allow left button by default\n // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n mouseButtons: 1,\n\n inertia: {\n enabled : false,\n resistance : 10, // the lambda in exponential decay\n minSpeed : 100, // target speed must be above this for inertia to start\n endSpeed : 10, // the speed at which inertia is slow enough to stop\n allowResume : true, // allow resuming an action in inertia phase\n smoothEndDuration: 300, // animate to snap/restrict endOnly if there's no inertia\n },\n },\n};\n","/* browser entry point */\n\n// Legacy browser support\nrequire('./legacyBrowsers');\n\n// inertia\nrequire('./inertia');\n\n// modifiers\nrequire('./modifiers/snap');\nrequire('./modifiers/restrict');\n\n// pointerEvents\nrequire('./pointerEvents/base');\nrequire('./pointerEvents/holdRepeat');\nrequire('./pointerEvents/interactableTargets');\n\n// delay\nrequire('./autoStart/delay');\n\n// actions\nrequire('./actions/gesture');\nrequire('./actions/resize');\nrequire('./actions/drag');\nrequire('./actions/drop');\n\n// load these modifiers after resize is loaded\nrequire('./modifiers/snapSize');\nrequire('./modifiers/restrictEdges');\nrequire('./modifiers/restrictSize');\n\n// autoStart actions\nrequire('./autoStart/gesture');\nrequire('./autoStart/resize');\nrequire('./autoStart/drag');\n\n// Interactable preventDefault setting\nrequire('./interactablePreventDefault.js');\n\n// autoScroll\nrequire('./autoScroll');\n\n// export interact\nmodule.exports = require('./interact');\n","const InteractEvent = require('./InteractEvent');\nconst Interaction = require('./Interaction');\nconst modifiers = require('./modifiers');\nconst utils = require('./utils');\nconst animationFrame = require('./utils/raf');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.inertiaStatus = {\n active : false,\n smoothEnd : false,\n allowResume: false,\n\n startEvent: null,\n upCoords : {},\n\n xe: 0, ye: 0,\n sx: 0, sy: 0,\n\n t0: 0,\n vx0: 0, vys: 0,\n duration: 0,\n\n lambda_v0: 0,\n one_ve_v0: 0,\n i : null,\n };\n\n interaction.boundInertiaFrame = () => inertiaFrame .apply(interaction);\n interaction.boundSmoothEndFrame = () => smoothEndFrame.apply(interaction);\n});\n\nInteraction.signals.on('down', function ({ interaction, event, pointer, eventTarget }) {\n const status = interaction.inertiaStatus;\n\n // Check if the down event hits the current inertia target\n if (status.active) {\n let element = eventTarget;\n\n // climb up the DOM tree from the event target\n while (utils.is.element(element)) {\n\n // if interaction element is the current inertia target element\n if (element === interaction.element) {\n // stop inertia\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n\n // update pointers to the down event's coordinates\n interaction.updatePointer(pointer);\n utils.setCoords(interaction.curCoords, interaction.pointers);\n\n // fire appropriate signals\n const signalArg = { interaction };\n Interaction.signals.fire('before-action-move', signalArg);\n Interaction.signals.fire('action-resume' , signalArg);\n\n // fire a reume event\n const resumeEvent = new InteractEvent(interaction,\n event,\n interaction.prepared.name,\n 'inertiaresume',\n interaction.element);\n\n interaction.target.fire(resumeEvent);\n interaction.prevEvent = resumeEvent;\n modifiers.resetStatuses(interaction.modifierStatuses);\n\n utils.copyCoords(interaction.prevCoords, interaction.curCoords);\n break;\n }\n\n element = utils.parentNode(element);\n }\n }\n});\n\nInteraction.signals.on('up', function ({ interaction, event }) {\n const status = interaction.inertiaStatus;\n\n if (!interaction.interacting() || status.active) { return; }\n\n const target = interaction.target;\n const options = target && target.options;\n const inertiaOptions = options && interaction.prepared.name && options[interaction.prepared.name].inertia;\n\n const now = new Date().getTime();\n const statuses = {};\n const page = utils.extend({}, interaction.curCoords.page);\n const pointerSpeed = interaction.pointerDelta.client.speed;\n\n let smoothEnd = false;\n let modifierResult;\n\n // check if inertia should be started\n const inertiaPossible = (inertiaOptions && inertiaOptions.enabled\n && interaction.prepared.name !== 'gesture'\n && event !== status.startEvent);\n\n const inertia = (inertiaPossible\n && (now - interaction.curCoords.timeStamp) < 50\n && pointerSpeed > inertiaOptions.minSpeed\n && pointerSpeed > inertiaOptions.endSpeed);\n\n const modifierArg = {\n interaction,\n pageCoords: page,\n statuses,\n preEnd: true,\n requireEndOnly: true,\n };\n\n // smoothEnd\n if (inertiaPossible && !inertia) {\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n if (modifierResult.shouldMove && modifierResult.locked) {\n smoothEnd = true;\n }\n }\n\n if (!(inertia || smoothEnd)) { return; }\n\n utils.copyCoords(status.upCoords, interaction.curCoords);\n\n interaction.pointers[0] = status.startEvent =\n new InteractEvent(interaction, event, interaction.prepared.name, 'inertiastart', interaction.element);\n\n status.t0 = now;\n\n status.active = true;\n status.allowResume = inertiaOptions.allowResume;\n interaction.simulation = status;\n\n target.fire(status.startEvent);\n\n if (inertia) {\n status.vx0 = interaction.pointerDelta.client.vx;\n status.vy0 = interaction.pointerDelta.client.vy;\n status.v0 = pointerSpeed;\n\n calcInertia(interaction, status);\n\n utils.extend(page, interaction.curCoords.page);\n\n page.x += status.xe;\n page.y += status.ye;\n\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n status.modifiedXe += modifierResult.dx;\n status.modifiedYe += modifierResult.dy;\n\n status.i = animationFrame.request(interaction.boundInertiaFrame);\n }\n else {\n status.smoothEnd = true;\n status.xe = modifierResult.dx;\n status.ye = modifierResult.dy;\n\n status.sx = status.sy = 0;\n\n status.i = animationFrame.request(interaction.boundSmoothEndFrame);\n }\n});\n\nInteraction.signals.on('stop-active', function ({ interaction }) {\n const status = interaction.inertiaStatus;\n\n if (status.active) {\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n }\n});\n\nfunction calcInertia (interaction, status) {\n const inertiaOptions = interaction.target.options[interaction.prepared.name].inertia;\n const lambda = inertiaOptions.resistance;\n const inertiaDur = -Math.log(inertiaOptions.endSpeed / status.v0) / lambda;\n\n status.x0 = interaction.prevEvent.pageX;\n status.y0 = interaction.prevEvent.pageY;\n status.t0 = status.startEvent.timeStamp / 1000;\n status.sx = status.sy = 0;\n\n status.modifiedXe = status.xe = (status.vx0 - inertiaDur) / lambda;\n status.modifiedYe = status.ye = (status.vy0 - inertiaDur) / lambda;\n status.te = inertiaDur;\n\n status.lambda_v0 = lambda / status.v0;\n status.one_ve_v0 = 1 - inertiaOptions.endSpeed / status.v0;\n}\n\nfunction inertiaFrame () {\n updateInertiaCoords(this);\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n\n const status = this.inertiaStatus;\n const options = this.target.options[this.prepared.name].inertia;\n const lambda = options.resistance;\n const t = new Date().getTime() / 1000 - status.t0;\n\n if (t < status.te) {\n\n const progress = 1 - (Math.exp(-lambda * t) - status.lambda_v0) / status.one_ve_v0;\n\n if (status.modifiedXe === status.xe && status.modifiedYe === status.ye) {\n status.sx = status.xe * progress;\n status.sy = status.ye * progress;\n }\n else {\n const quadPoint = utils.getQuadraticCurvePoint(0, 0,\n status.xe,\n status.ye,\n status.modifiedXe,\n status.modifiedYe,\n progress);\n\n status.sx = quadPoint.x;\n status.sy = quadPoint.y;\n }\n\n this.doMove();\n\n status.i = animationFrame.request(this.boundInertiaFrame);\n }\n else {\n status.sx = status.modifiedXe;\n status.sy = status.modifiedYe;\n\n this.doMove();\n this.end(status.startEvent);\n status.active = false;\n this.simulation = null;\n }\n\n utils.copyCoords(this.prevCoords, this.curCoords);\n}\n\nfunction smoothEndFrame () {\n updateInertiaCoords(this);\n\n const status = this.inertiaStatus;\n const t = new Date().getTime() - status.t0;\n const duration = this.target.options[this.prepared.name].inertia.smoothEndDuration;\n\n if (t < duration) {\n status.sx = utils.easeOutQuad(t, 0, status.xe, duration);\n status.sy = utils.easeOutQuad(t, 0, status.ye, duration);\n\n this.pointerMove(status.startEvent, status.startEvent);\n\n status.i = animationFrame.request(this.boundSmoothEndFrame);\n }\n else {\n status.sx = status.xe;\n status.sy = status.ye;\n\n this.pointerMove(status.startEvent, status.startEvent);\n this.end(status.startEvent);\n\n status.smoothEnd =\n status.active = false;\n this.simulation = null;\n }\n}\n\nfunction updateInertiaCoords (interaction) {\n const status = interaction.inertiaStatus;\n\n // return if inertia isn't running\n if (!status.active) { return; }\n\n const pageUp = status.upCoords.page;\n const clientUp = status.upCoords.client;\n\n utils.setCoords(interaction.curCoords, [ {\n pageX : pageUp.x + status.sx,\n pageY : pageUp.y + status.sy,\n clientX: clientUp.x + status.sx,\n clientY: clientUp.y + status.sy,\n } ]);\n}\n","const browser = require('./utils/browser');\nconst events = require('./utils/events');\nconst utils = require('./utils');\nconst scope = require('./scope');\nconst Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\n\nconst globalEvents = {};\n\n/*\\\n * interact\n [ method ]\n *\n * The methods of this variable can be used to set elements as\n * interactables and also to change various default settings.\n *\n * Calling it as a function and passing an element or a valid CSS selector\n * string returns an Interactable object which has various methods to\n * configure it.\n *\n - element (Element | string) The HTML or SVG Element to interact with or CSS selector\n = (object) An @Interactable\n *\n > Usage\n | interact('#draggable').draggable(true);\n |\n | var rectables = interact('rect');\n | rectables\n | .gesturable(true)\n | .on('gesturemove', function (event) {\n | // ...\n | });\n\\*/\nfunction interact (element, options) {\n let interactable = scope.interactables.get(element, options);\n\n if (!interactable) {\n interactable = new Interactable(element, options);\n interactable.events.global = globalEvents;\n }\n\n return interactable;\n}\n\n/*\\\n * interact.isSet\n [ method ]\n *\n * Check if an element has been set\n - element (Element) The Element being searched for\n = (boolean) Indicates if the element or CSS selector was previously passed to interact\n\\*/\ninteract.isSet = function (element, options) {\n return scope.interactables.indexOfElement(element, options && options.context) !== -1;\n};\n\n/*\\\n * interact.on\n [ method ]\n *\n * Adds a global listener for an InteractEvent or adds a DOM event to\n * `document`\n *\n - type (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) interact\n\\*/\ninteract.on = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.on(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.on(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n // if it is an InteractEvent type, add listener to globalEvents\n if (utils.contains(Interactable.eventTypes, type)) {\n // if this type of event was never bound\n if (!globalEvents[type]) {\n globalEvents[type] = [listener];\n }\n else {\n globalEvents[type].push(listener);\n }\n }\n // If non InteractEvent type, addEventListener to document\n else {\n events.add(scope.document, type, listener, { options });\n }\n\n return interact;\n};\n\n/*\\\n * interact.off\n [ method ]\n *\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n - type (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) interact\n \\*/\ninteract.off = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.off(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.off(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n if (!utils.contains(Interactable.eventTypes, type)) {\n events.remove(scope.document, type, listener, options);\n }\n else {\n let index;\n\n if (type in globalEvents\n && (index = utils.indexOf(globalEvents[type], listener)) !== -1) {\n globalEvents[type].splice(index, 1);\n }\n }\n\n return interact;\n};\n\n/*\\\n * interact.debug\n [ method ]\n *\n * Returns an object which exposes internal data\n = (object) An object with properties that outline the current state and expose internal functions and variables\n\\*/\ninteract.debug = function () {\n return scope;\n};\n\n// expose the functions used to calculate multi-touch properties\ninteract.getPointerAverage = utils.pointerAverage;\ninteract.getTouchBBox = utils.touchBBox;\ninteract.getTouchDistance = utils.touchDistance;\ninteract.getTouchAngle = utils.touchAngle;\n\ninteract.getElementRect = utils.getElementRect;\ninteract.getElementClientRect = utils.getElementClientRect;\ninteract.matchesSelector = utils.matchesSelector;\ninteract.closest = utils.closest;\n\n/*\\\n * interact.supportsTouch\n [ method ]\n *\n = (boolean) Whether or not the browser supports touch input\n\\*/\ninteract.supportsTouch = function () {\n return browser.supportsTouch;\n};\n\n/*\\\n * interact.supportsPointerEvent\n [ method ]\n *\n = (boolean) Whether or not the browser supports PointerEvents\n\\*/\ninteract.supportsPointerEvent = function () {\n return browser.supportsPointerEvent;\n};\n\n/*\\\n * interact.stop\n [ method ]\n *\n * Cancels all interactions (end events are not fired)\n *\n - event (Event) An event on which to call preventDefault()\n = (object) interact\n\\*/\ninteract.stop = function (event) {\n for (let i = scope.interactions.length - 1; i >= 0; i--) {\n scope.interactions[i].stop(event);\n }\n\n return interact;\n};\n\n/*\\\n * interact.pointerMoveTolerance\n [ method ]\n * Returns or sets the distance the pointer must be moved before an action\n * sequence occurs. This also affects tolerance for tap events.\n *\n - newValue (number) #optional The movement from the start position must be greater than this value\n = (number | Interactable) The current setting or interact\n\\*/\ninteract.pointerMoveTolerance = function (newValue) {\n if (utils.is.number(newValue)) {\n Interaction.pointerMoveTolerance = newValue;\n\n return this;\n }\n\n return Interaction.pointerMoveTolerance;\n};\n\ninteract.addDocument = scope.addDocument;\ninteract.removeDocument = scope.removeDocument;\n\nscope.interact = interact;\n\nmodule.exports = interact;\n","const Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\nconst scope = require('./scope');\nconst is = require('./utils/is');\nconst events = require('./utils/events');\n\nconst { nodeContains, matchesSelector } = require('./utils/domUtils');\n\n/*\\\n * Interactable.preventDefault\n [ method ]\n *\n * Returns or sets whether to prevent the browser's default behaviour\n * in response to pointer events. Can be set to:\n * - `'always'` to always prevent\n * - `'never'` to never prevent\n * - `'auto'` to let interact.js try to determine what would be best\n *\n - newValue (string) #optional `true`, `false` or `'auto'`\n = (string | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.preventDefault = function (newValue) {\n if (/^(always|never|auto)$/.test(newValue)) {\n this.options.preventDefault = newValue;\n return this;\n }\n\n if (is.bool(newValue)) {\n this.options.preventDefault = newValue? 'always' : 'never';\n return this;\n }\n\n return this.options.preventDefault;\n};\n\nInteractable.prototype.checkAndPreventDefault = function (event) {\n const setting = this.options.preventDefault;\n\n if (setting === 'never') { return; }\n\n if (setting === 'always') {\n event.preventDefault();\n return;\n }\n\n // setting === 'auto'\n\n // don't preventDefault if the browser supports passiveEvents\n // CSS touch-action and user-selecct should be used instead\n if (events.supportsOptions) {\n return;\n }\n\n // don't preventDefault of pointerdown events\n if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) {\n return;\n }\n\n // don't preventDefault on editable elements\n if (is.element(event.target)\n && matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) {\n return;\n }\n\n event.preventDefault();\n};\n\nfunction onInteractionEvent ({ interaction, event }) {\n if (interaction.target) {\n interaction.target.checkAndPreventDefault(event);\n }\n}\n\nfor (const eventSignal of ['down', 'move', 'up', 'cancel']) {\n Interaction.signals.on(eventSignal, onInteractionEvent);\n}\n\n// prevent native HTML5 drag on interact.js target elements\nInteraction.docEvents.dragstart = function preventNativeDrag (event) {\n for (const interaction of scope.interactions) {\n\n if (interaction.element\n && (interaction.element === event.target\n || nodeContains(interaction.element, event.target))) {\n\n interaction.target.checkAndPreventDefault(event);\n return;\n }\n }\n};\n","const scope = require('./scope');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst iFinder = require('./utils/interactionFinder');\nconst pointerEvents = require('./pointerEvents/base');\n\nconst { window } = require('./utils/window');\n\nconst toString = Object.prototype.toString;\n\nif (!window.Array.isArray) {\n window.Array.isArray = function (obj) {\n return toString.call(obj) === '[object Array]';\n };\n}\n\nif (!String.prototype.trim) {\n String.prototype.trim = function () {\n return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n };\n}\n\n// http://www.quirksmode.org/dom/events/click.html\n// >Events leading to dblclick\n//\n// IE8 doesn't fire down event before dblclick.\n// This workaround tries to fire a tap and doubletap after dblclick\nfunction onIE8Dblclick (event) {\n const eventTarget = event.target;\n const interaction = iFinder.search(event, event.type, eventTarget);\n\n if (!interaction) { return; }\n\n if (interaction.prevTap\n && event.clientX === interaction.prevTap.clientX\n && event.clientY === interaction.prevTap.clientY\n && eventTarget === interaction.prevTap.target) {\n\n interaction.downTargets[0] = eventTarget;\n interaction.downTimes [0] = new Date().getTime();\n\n pointerEvents.fire({\n interaction,\n event,\n eventTarget,\n pointer: event,\n type: 'tap',\n });\n }\n}\n\nif (browser.isIE8) {\n const selectFix = function (event) {\n for (const interaction of scope.interactions) {\n if (interaction.interacting()) {\n interaction.target.checkAndPreventDefault(event);\n }\n }\n };\n\n const onDocIE8 = function onDocIE8 ({ doc, win }, signalName) {\n const eventMethod = signalName.indexOf('listen') === 0\n ? events.add : events.remove;\n\n // For IE's lack of Event#preventDefault\n eventMethod(doc, 'selectstart', selectFix);\n\n if (pointerEvents) {\n eventMethod(doc, 'dblclick', onIE8Dblclick);\n }\n };\n\n scope.signals.on('add-document' , onDocIE8);\n scope.signals.on('remove-document', onDocIE8);\n}\n\nmodule.exports = null;\n","const InteractEvent = require('../InteractEvent');\nconst Interaction = require('../Interaction');\nconst extend = require('../utils/extend');\n\nconst modifiers = {\n names: [],\n\n setOffsets: function (arg) {\n const { interaction, pageCoords: page } = arg;\n const { target, element, startOffset } = interaction;\n const rect = target.getRect(element);\n\n if (rect) {\n startOffset.left = page.x - rect.left;\n startOffset.top = page.y - rect.top;\n\n startOffset.right = rect.right - page.x;\n startOffset.bottom = rect.bottom - page.y;\n\n if (!('width' in rect)) { rect.width = rect.right - rect.left; }\n if (!('height' in rect)) { rect.height = rect.bottom - rect.top ; }\n }\n else {\n startOffset.left = startOffset.top = startOffset.right = startOffset.bottom = 0;\n }\n\n arg.rect = rect;\n arg.interactable = target;\n arg.element = element;\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n\n arg.options = target.options[interaction.prepared.name][modifierName];\n\n if (!arg.options) {\n continue;\n }\n\n interaction.modifierOffsets[modifierName] = modifiers[modifierName].setOffset(arg);\n }\n },\n\n setAll: function (arg) {\n const { interaction, statuses, preEnd, requireEndOnly } = arg;\n const coords = extend({}, arg.pageCoords);\n const result = {\n dx: 0,\n dy: 0,\n changed: false,\n locked: false,\n shouldMove: true,\n };\n\n for (const modifierName of modifiers.names) {\n const modifier = modifiers[modifierName];\n const options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!shouldDo(options, preEnd, requireEndOnly)) { continue; }\n\n arg.status = arg.status = statuses[modifierName];\n arg.options = options;\n arg.offset = arg.interaction.modifierOffsets[modifierName];\n\n modifier.set(arg);\n\n if (arg.status.locked) {\n coords.x += arg.status.dx;\n coords.y += arg.status.dy;\n\n result.dx += arg.status.dx;\n result.dy += arg.status.dy;\n\n result.locked = true;\n }\n }\n\n // a move should be fired if:\n // - there are no modifiers enabled,\n // - no modifiers are \"locked\" i.e. have changed the pointer's coordinates, or\n // - the locked coords have changed since the last pointer move\n result.shouldMove = !arg.status || !result.locked || arg.status.changed;\n\n return result;\n },\n\n resetStatuses: function (statuses) {\n for (const modifierName of modifiers.names) {\n const status = statuses[modifierName] || {};\n\n status.dx = status.dy = 0;\n status.modifiedX = status.modifiedY = NaN;\n status.locked = false;\n status.changed = true;\n\n statuses[modifierName] = status;\n }\n\n return statuses;\n },\n\n start: function ({ interaction }, signalName) {\n const arg = {\n interaction,\n pageCoords: (signalName === 'action-resume' ?\n interaction.curCoords : interaction.startCoords).page,\n startOffset: interaction.startOffset,\n statuses: interaction.modifierStatuses,\n preEnd: false,\n requireEndOnly: false,\n };\n\n modifiers.setOffsets(arg);\n modifiers.resetStatuses(arg.statuses);\n\n arg.pageCoords = extend({}, interaction.startCoords.page);\n interaction.modifierResult = modifiers.setAll(arg);\n },\n};\n\nInteraction.signals.on('new', function (interaction) {\n interaction.startOffset = { left: 0, right: 0, top: 0, bottom: 0 };\n interaction.modifierOffsets = {};\n interaction.modifierStatuses = modifiers.resetStatuses({});\n interaction.modifierResult = null;\n});\n\nInteraction.signals.on('action-start' , modifiers.start);\nInteraction.signals.on('action-resume', modifiers.start);\n\nInteraction.signals.on('before-action-move', function ({ interaction, preEnd, interactingBeforeMove }) {\n const modifierResult = modifiers.setAll({\n interaction,\n preEnd,\n pageCoords: interaction.curCoords.page,\n statuses: interaction.modifierStatuses,\n requireEndOnly: false,\n });\n\n // don't fire an action move if a modifier would keep the event in the same\n // cordinates as before\n if (!modifierResult.shouldMove && interactingBeforeMove) {\n interaction._dontFireMove = true;\n }\n\n interaction.modifierResult = modifierResult;\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n for (let i = 0; i < modifiers.names.length; i++) {\n const options = interaction.target.options[interaction.prepared.name][modifiers.names[i]];\n\n // if the endOnly option is true for any modifier\n if (shouldDo(options, true, true)) {\n // fire a move event at the modified coordinates\n interaction.doMove({ event, preEnd: true });\n break;\n }\n }\n});\n\nInteractEvent.signals.on('set-xy', function (arg) {\n const { iEvent, interaction } = arg;\n const modifierArg = extend({}, arg);\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n modifierArg.options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!modifierArg.options) {\n continue;\n }\n\n const modifier = modifiers[modifierName];\n\n modifierArg.status = interaction.modifierStatuses[modifierName];\n\n iEvent[modifierName] = modifier.modifyCoords(modifierArg);\n }\n});\n\nfunction shouldDo (options, preEnd, requireEndOnly) {\n return (options && options.enabled\n && (preEnd || !options.endOnly)\n && (!requireEndOnly || options.endOnly));\n}\n\nmodule.exports = modifiers;\n","const modifiers = require('./index');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst restrict = {\n defaults: {\n enabled : false,\n endOnly : false,\n restriction: null,\n elementRect: null,\n },\n\n setOffset: function ({ rect, startOffset, options }) {\n const elementRect = options && options.elementRect;\n const offset = {};\n\n if (rect && elementRect) {\n offset.left = startOffset.left - (rect.width * elementRect.left);\n offset.top = startOffset.top - (rect.height * elementRect.top);\n\n offset.right = startOffset.right - (rect.width * (1 - elementRect.right));\n offset.bottom = startOffset.bottom - (rect.height * (1 - elementRect.bottom));\n }\n else {\n offset.left = offset.top = offset.right = offset.bottom = 0;\n }\n\n return offset;\n },\n\n set: function ({ pageCoords, interaction, status, options }) {\n if (!options) { return status; }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n\n const restriction = getRestrictionRect(options.restriction, interaction, page);\n\n if (!restriction) { return status; }\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n const rect = restriction;\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n const offset = interaction.modifierOffsets.restrict;\n\n // object is assumed to have\n // x, y, width, height or\n // left, top, right, bottom\n if ('x' in restriction && 'y' in restriction) {\n modifiedX = Math.max(Math.min(rect.x + rect.width - offset.right , page.x), rect.x + offset.left);\n modifiedY = Math.max(Math.min(rect.y + rect.height - offset.bottom, page.y), rect.y + offset.top );\n }\n else {\n modifiedX = Math.max(Math.min(rect.right - offset.right , page.x), rect.left + offset.left);\n modifiedY = Math.max(Math.min(rect.bottom - offset.bottom, page.y), rect.top + offset.top );\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const elementRect = options && options.elementRect;\n\n if (options && options.enabled\n && !(phase === 'start' && elementRect && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n getRestrictionRect,\n};\n\nfunction getRestrictionRect (value, interaction, page) {\n if (utils.is.function(value)) {\n return utils.resolveRectLike(value, interaction.target, interaction.element, [page.x, page.y, interaction]);\n } else {\n return utils.resolveRectLike(value, interaction.target, interaction.element);\n }\n}\n\nmodifiers.restrict = restrict;\nmodifiers.names.push('restrict');\n\ndefaultOptions.perAction.restrict = restrict.defaults;\n\nmodule.exports = restrict;\n","// This module adds the options.resize.restrictEdges setting which sets min and\n// max for the top, left, bottom and right edges of the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictEdges: {\n// inner: { top: 200, left: 200, right: 400, bottom: 400 },\n// outer: { top: 0, left: 0, right: 600, bottom: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst { getRestrictionRect } = require('./restrict');\n\nconst noInner = { top: +Infinity, left: +Infinity, bottom: -Infinity, right: -Infinity };\nconst noOuter = { top: -Infinity, left: -Infinity, bottom: +Infinity, right: +Infinity };\n\nconst restrictEdges = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n offset: null,\n },\n\n setOffset: function ({ interaction, startOffset, options }) {\n if (!options) {\n return utils.extend({}, startOffset);\n }\n\n const offset = getRestrictionRect(options.offset, interaction, interaction.startCoords.page);\n\n if (offset) {\n return {\n top: startOffset.top + offset.y,\n left: startOffset.left + offset.x,\n bottom: startOffset.bottom + offset.y,\n right: startOffset.right + offset.x,\n };\n }\n\n return startOffset;\n },\n\n set: function ({ pageCoords, interaction, status, offset, options }) {\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n const inner = rectUtils.xywhToTlbr(getRestrictionRect(options.inner, interaction, page)) || noInner;\n const outer = rectUtils.xywhToTlbr(getRestrictionRect(options.outer, interaction, page)) || noOuter;\n\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n if (edges.top) {\n modifiedY = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top);\n }\n else if (edges.bottom) {\n modifiedY = Math.max(Math.min(outer.bottom - offset.bottom, page.y), inner.bottom - offset.bottom);\n }\n if (edges.left) {\n modifiedX = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left);\n }\n else if (edges.right) {\n modifiedX = Math.max(Math.min(outer.right - offset.right, page.x), inner.right - offset.right);\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n if (options && options.enabled\n && !(phase === 'start' && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n noInner,\n noOuter,\n getRestrictionRect,\n};\n\nmodifiers.restrictEdges = restrictEdges;\nmodifiers.names.push('restrictEdges');\n\ndefaultOptions.perAction.restrictEdges = restrictEdges.defaults;\nresize.defaults.restrictEdges = restrictEdges.defaults;\n\nmodule.exports = restrictEdges;\n","// This module adds the options.resize.restrictSize setting which sets min and\n// max width and height for the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictSize: {\n// min: { width: -600, height: -600 },\n// max: { width: 600, height: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst restrictEdges = require('./restrictEdges');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst noMin = { width: -Infinity, height: -Infinity };\nconst noMax = { width: +Infinity, height: +Infinity };\n\nconst restrictSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n },\n\n setOffset: function ({ interaction }) {\n return interaction.startOffset;\n },\n\n set: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const rect = rectUtils.xywhToTlbr(interaction.resizeRects.inverted);\n\n const minSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.min, interaction)) || noMin;\n const maxSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.max, interaction)) || noMax;\n\n arg.options = {\n enabled: options.enabled,\n endOnly: options.endOnly,\n inner: utils.extend({}, restrictEdges.noInner),\n outer: utils.extend({}, restrictEdges.noOuter),\n };\n\n if (edges.top) {\n arg.options.inner.top = rect.bottom - minSize.height;\n arg.options.outer.top = rect.bottom - maxSize.height;\n }\n else if (edges.bottom) {\n arg.options.inner.bottom = rect.top + minSize.height;\n arg.options.outer.bottom = rect.top + maxSize.height;\n }\n if (edges.left) {\n arg.options.inner.left = rect.right - minSize.width;\n arg.options.outer.left = rect.right - maxSize.width;\n }\n else if (edges.right) {\n arg.options.inner.right = rect.left + minSize.width;\n arg.options.outer.right = rect.left + maxSize.width;\n }\n\n restrictEdges.set(arg);\n },\n\n modifyCoords: restrictEdges.modifyCoords,\n};\n\nmodifiers.restrictSize = restrictSize;\nmodifiers.names.push('restrictSize');\n\ndefaultOptions.perAction.restrictSize = restrictSize.defaults;\nresize.defaults.restrictSize = restrictSize.defaults;\n\nmodule.exports = restrictSize;\n","const modifiers = require('./index');\nconst interact = require('../interact');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst snap = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n\n relativePoints: null,\n },\n\n setOffset: function ({ interaction, interactable, element, rect, startOffset, options }) {\n const offsets = [];\n const optionsOrigin = utils.rectToXY(utils.resolveRectLike(options.origin));\n const origin = optionsOrigin || utils.getOriginXY(interactable, element, interaction.prepared.name);\n options = options || interactable.options[interaction.prepared.name].snap || {};\n\n let snapOffset;\n\n if (options.offset === 'startCoords') {\n snapOffset = {\n x: interaction.startCoords.page.x - origin.x,\n y: interaction.startCoords.page.y - origin.y,\n };\n }\n else {\n const offsetRect = utils.resolveRectLike(options.offset, interactable, element, [interaction]);\n\n snapOffset = utils.rectToXY(offsetRect) || { x: 0, y: 0 };\n }\n\n if (rect && options.relativePoints && options.relativePoints.length) {\n for (const { x: relativeX, y: relativeY } of options.relativePoints) {\n offsets.push({\n x: startOffset.left - (rect.width * relativeX) + snapOffset.x,\n y: startOffset.top - (rect.height * relativeY) + snapOffset.y,\n });\n }\n }\n else {\n offsets.push(snapOffset);\n }\n\n return offsets;\n },\n\n set: function ({ interaction, pageCoords, status, options, offset: offsets }) {\n const targets = [];\n let target;\n let page;\n let i;\n\n if (status.useStatusXY) {\n page = { x: status.x, y: status.y };\n }\n else {\n const origin = utils.getOriginXY(interaction.target, interaction.element, interaction.prepared.name);\n\n page = utils.extend({}, pageCoords);\n\n page.x -= origin.x;\n page.y -= origin.y;\n }\n\n status.realX = page.x;\n status.realY = page.y;\n\n let len = options.targets? options.targets.length : 0;\n\n for (const { x: offsetX, y: offsetY } of offsets) {\n const relativeX = page.x - offsetX;\n const relativeY = page.y - offsetY;\n\n for (const snapTarget of options.targets) {\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n targets.push({\n x: utils.is.number(target.x) ? (target.x + offsetX) : relativeX,\n y: utils.is.number(target.y) ? (target.y + offsetY) : relativeY,\n\n range: utils.is.number(target.range)? target.range: options.range,\n });\n }\n }\n\n const closest = {\n target: null,\n inRange: false,\n distance: 0,\n range: 0,\n dx: 0,\n dy: 0,\n };\n\n for (i = 0, len = targets.length; i < len; i++) {\n target = targets[i];\n\n const range = target.range;\n const dx = target.x - page.x;\n const dy = target.y - page.y;\n const distance = utils.hypot(dx, dy);\n let inRange = distance <= range;\n\n // Infinite targets count as being out of range\n // compared to non infinite ones that are in range\n if (range === Infinity && closest.inRange && closest.range !== Infinity) {\n inRange = false;\n }\n\n if (!closest.target || (inRange\n // is the closest target in range?\n ? (closest.inRange && range !== Infinity\n // the pointer is relatively deeper in this target\n ? distance / range < closest.distance / closest.range\n // this target has Infinite range and the closest doesn't\n : (range === Infinity && closest.range !== Infinity)\n // OR this target is closer that the previous closest\n || distance < closest.distance)\n // The other is not in range and the pointer is closer to this target\n : (!closest.inRange && distance < closest.distance))) {\n\n closest.target = target;\n closest.distance = distance;\n closest.range = range;\n closest.inRange = inRange;\n closest.dx = dx;\n closest.dy = dy;\n\n status.range = range;\n }\n }\n\n let snapChanged;\n\n if (closest.target) {\n snapChanged = (status.modifiedX !== closest.target.x || status.modifiedY !== closest.target.y);\n\n status.modifiedX = closest.target.x;\n status.modifiedY = closest.target.y;\n }\n else {\n snapChanged = true;\n\n status.modifiedX = NaN;\n status.modifiedY = NaN;\n }\n\n status.dx = closest.dx;\n status.dy = closest.dy;\n\n status.changed = (snapChanged || (closest.inRange && !status.locked));\n status.locked = closest.inRange;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const relativePoints = options && options.relativePoints;\n\n if (options && options.enabled\n && !(phase === 'start' && relativePoints && relativePoints.length)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n }\n\n return {\n range : status.range,\n locked : status.locked,\n x : status.modifiedX,\n y : status.modifiedY,\n realX : status.realX,\n realY : status.realY,\n dx : status.dx,\n dy : status.dy,\n };\n }\n },\n};\n\ninteract.createSnapGrid = function (grid) {\n return function (x, y) {\n const limits = grid.limits || {\n left : -Infinity,\n right : Infinity,\n top : -Infinity,\n bottom: Infinity,\n };\n let offsetX = 0;\n let offsetY = 0;\n\n if (utils.is.object(grid.offset)) {\n offsetX = grid.offset.x;\n offsetY = grid.offset.y;\n }\n\n const gridx = Math.round((x - offsetX) / grid.x);\n const gridy = Math.round((y - offsetY) / grid.y);\n\n const newX = Math.max(limits.left, Math.min(limits.right , gridx * grid.x + offsetX));\n const newY = Math.max(limits.top , Math.min(limits.bottom, gridy * grid.y + offsetY));\n\n return {\n x: newX,\n y: newY,\n range: grid.range,\n };\n };\n};\n\nmodifiers.snap = snap;\nmodifiers.names.push('snap');\n\ndefaultOptions.perAction.snap = snap.defaults;\n\nmodule.exports = snap;\n","// This module allows snapping of the size of targets during resize\n// interactions.\n\nconst modifiers = require('./index');\nconst snap = require('./snap');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\nconst utils = require('../utils/');\n\nconst snapSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n },\n\n setOffset: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.edges;\n\n if (!edges) { return; }\n\n arg.options = {\n relativePoints: [{\n x: edges.left? 0 : 1,\n y: edges.top ? 0 : 1,\n }],\n origin: { x: 0, y: 0 },\n offset: 'self',\n range: options.range,\n };\n\n const offsets = snap.setOffset(arg);\n arg.options = options;\n\n return offsets;\n },\n\n set: function (arg) {\n const { interaction, options, offset, pageCoords } = arg;\n const page = utils.extend({}, pageCoords);\n const relativeX = page.x - offset[0].x;\n const relativeY = page.y - offset[0].y;\n\n arg.options = utils.extend({}, options);\n arg.options.targets = [];\n\n for (const snapTarget of options.targets) {\n let target;\n\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n if ('width' in target && 'height' in target) {\n target.x = target.width;\n target.y = target.height;\n }\n\n arg.options.targets.push(target);\n }\n\n snap.set(arg);\n },\n\n modifyCoords: function (arg) {\n const { options } = arg;\n\n arg.options = utils.extend({}, options);\n arg.options.enabled = options.enabled;\n arg.options.relativePoints = [null];\n\n snap.modifyCoords(arg);\n },\n};\n\nmodifiers.snapSize = snapSize;\nmodifiers.names.push('snapSize');\n\ndefaultOptions.perAction.snapSize = snapSize.defaults;\nresize.defaults.snapSize = snapSize.defaults;\n\nmodule.exports = snapSize;\n","const pointerUtils = require('../utils/pointerUtils');\n\nmodule.exports = class PointerEvent {\n constructor (type, pointer, event, eventTarget, interaction) {\n pointerUtils.pointerExtend(this, event);\n\n if (event !== pointer) {\n pointerUtils.pointerExtend(this, pointer);\n }\n\n this.interaction = interaction;\n\n this.timeStamp = new Date().getTime();\n this.originalEvent = event;\n this.type = type;\n this.pointerId = pointerUtils.getPointerId(pointer);\n this.pointerType = pointerUtils.getPointerType(pointer, interaction);\n this.target = eventTarget;\n this.currentTarget = null;\n\n if (type === 'tap') {\n const pointerIndex = interaction.getPointerIndex(pointer);\n this.dt = this.timeStamp - interaction.downTimes[pointerIndex];\n\n const interval = this.timeStamp - interaction.tapTime;\n\n this.double = !!(interaction.prevTap\n && interaction.prevTap.type !== 'doubletap'\n && interaction.prevTap.target === this.target\n && interval < 500);\n }\n else if (type === 'doubletap') {\n this.dt = pointer.timeStamp - interaction.tapTime;\n }\n }\n\n subtractOrigin ({ x: originX, y: originY }) {\n this.pageX -= originX;\n this.pageY -= originY;\n this.clientX -= originX;\n this.clientY -= originY;\n\n return this;\n }\n\n addOrigin ({ x: originX, y: originY }) {\n this.pageX += originX;\n this.pageY += originY;\n this.clientX += originX;\n this.clientY += originY;\n\n return this;\n }\n\n preventDefault () {\n this.originalEvent.preventDefault();\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n};\n","const PointerEvent = require('./PointerEvent');\nconst Interaction = require('../Interaction');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst defaults = require('../defaultOptions');\nconst signals = require('../utils/Signals').new();\nconst { filter } = require('../utils/arr');\n\nconst simpleSignals = [ 'down', 'up', 'cancel' ];\nconst simpleEvents = [ 'down', 'up', 'cancel' ];\n\nconst pointerEvents = {\n PointerEvent,\n fire,\n collectEventTargets,\n signals,\n defaults: {\n holdDuration: 600,\n ignoreFrom : null,\n allowFrom : null,\n origin : { x: 0, y: 0 },\n },\n types: [\n 'down',\n 'move',\n 'up',\n 'cancel',\n 'tap',\n 'doubletap',\n 'hold',\n ],\n};\n\nfunction fire (arg) {\n const {\n interaction, pointer, event, eventTarget,\n type = arg.pointerEvent.type,\n targets = collectEventTargets(arg),\n pointerEvent = new PointerEvent(type, pointer, event, eventTarget, interaction),\n } = arg;\n\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n targets,\n type,\n pointerEvent,\n };\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n\n for (const prop in target.props || {}) {\n pointerEvent[prop] = target.props[prop];\n }\n\n const origin = utils.getOriginXY(target.eventable, target.element);\n\n pointerEvent.subtractOrigin(origin);\n pointerEvent.eventable = target.eventable;\n pointerEvent.currentTarget = target.element;\n\n target.eventable.fire(pointerEvent);\n\n pointerEvent.addOrigin(origin);\n\n if (pointerEvent.immediatePropagationStopped\n || (pointerEvent.propagationStopped\n && (i + 1) < targets.length && targets[i + 1].element !== pointerEvent.currentTarget)) {\n break;\n }\n }\n\n signals.fire('fired', signalArg);\n\n if (type === 'tap') {\n // if pointerEvent should make a double tap, create and fire a doubletap\n // PointerEvent and use that as the prevTap\n const prevTap = pointerEvent.double\n ? fire({\n interaction, pointer, event, eventTarget,\n type: 'doubletap',\n })\n : pointerEvent;\n\n interaction.prevTap = prevTap;\n interaction.tapTime = prevTap.timeStamp;\n }\n\n return pointerEvent;\n}\n\nfunction collectEventTargets ({ interaction, pointer, event, eventTarget, type }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n // do not fire a tap event if the pointer was moved before being lifted\n if (type === 'tap' && (interaction.pointerWasMoved\n // or if the pointerup target is different to the pointerdown target\n || !(interaction.downTargets[pointerIndex] && interaction.downTargets[pointerIndex] === eventTarget))) {\n return [];\n }\n\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n path,\n targets: [],\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (type === 'hold') {\n signalArg.targets = filter(signalArg.targets, target =>\n target.eventable.options.holdDuration === interaction.holdTimers[pointerIndex].duration);\n }\n\n return signalArg.targets;\n}\n\nInteraction.signals.on('update-pointer-down', function ({ interaction, pointerIndex }) {\n interaction.holdTimers[pointerIndex] = { duration: Infinity, timeout: null };\n});\n\nInteraction.signals.on('remove-pointer', function ({ interaction, pointerIndex }) {\n interaction.holdTimers.splice(pointerIndex, 1);\n});\n\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget, duplicateMove }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n if (!duplicateMove && (!interaction.pointerIsDown || interaction.pointerWasMoved)) {\n if (interaction.pointerIsDown) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n\n fire({\n interaction, pointer, event, eventTarget,\n type: 'move',\n });\n }\n});\n\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget, pointerIndex }) {\n // copy event to be used in timeout for IE8\n const eventCopy = browser.isIE8? utils.extend({}, event) : event;\n\n const timer = interaction.holdTimers[pointerIndex];\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'hold',\n targets: [],\n path,\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (!signalArg.targets.length) { return; }\n\n let minDuration = Infinity;\n\n for (let i = 0; i < signalArg.targets.length; i++) {\n const target = signalArg.targets[i];\n const holdDuration = target.eventable.options.holdDuration;\n\n if (holdDuration < minDuration) {\n minDuration = holdDuration;\n }\n }\n\n timer.duration = minDuration;\n timer.timeout = setTimeout(function () {\n fire({\n interaction, eventCopy, eventTarget,\n pointer: browser.isIE8? eventCopy : pointer,\n type: 'hold',\n });\n }, minDuration);\n});\n\nInteraction.signals.on('up', ({ interaction, pointer, event, eventTarget }) => {\n if (!interaction.pointerWasMoved) {\n fire({ interaction, eventTarget, pointer, event, type: 'tap' });\n }\n});\n\n['up', 'cancel'].forEach(function (signalName) {\n Interaction.signals.on(signalName, function ({ interaction, pointerIndex }) {\n if (interaction.holdTimers[pointerIndex]) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n });\n});\n\nfunction createSignalListener (type) {\n return function ({ interaction, pointer, event, eventTarget }) {\n fire({ interaction, eventTarget, pointer, event, type });\n };\n}\n\nfor (let i = 0; i < simpleSignals.length; i++) {\n Interaction.signals.on(simpleSignals[i], createSignalListener(simpleEvents[i]));\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.prevTap = null; // the most recent tap event on this interaction\n interaction.tapTime = 0; // time of the most recent tap event\n interaction.holdTimers = []; // [{ duration, timeout }]\n});\n\ndefaults.pointerEvents = pointerEvents.defaults;\nmodule.exports = pointerEvents;\n","const pointerEvents = require('./base');\nconst Interaction = require('../Interaction');\n\npointerEvents.signals.on('new', onNew);\npointerEvents.signals.on('fired', onFired);\n\nfor (const signal of ['move', 'up', 'cancel', 'endall']) {\n Interaction.signals.on(signal, endHoldRepeat);\n}\n\nfunction onNew ({ pointerEvent }) {\n if (pointerEvent.type !== 'hold') { return; }\n\n pointerEvent.count = (pointerEvent.count || 0) + 1;\n}\n\nfunction onFired ({ interaction, pointerEvent, eventTarget, targets }) {\n if (pointerEvent.type !== 'hold' || !targets.length) { return; }\n\n // get the repeat interval from the first eventable\n const interval = targets[0].eventable.options.holdRepeatInterval;\n\n // don't repeat if the interval is 0 or less\n if (interval <= 0) { return; }\n\n // set a timeout to fire the holdrepeat event\n interaction.holdIntervalHandle = setTimeout(function () {\n pointerEvents.fire({\n interaction,\n eventTarget,\n type: 'hold',\n pointer: pointerEvent,\n event: pointerEvent,\n });\n }, interval);\n}\n\nfunction endHoldRepeat ({ interaction }) {\n // set the interaction's holdStopTime property\n // to stop further holdRepeat events\n if (interaction.holdIntervalHandle) {\n clearInterval(interaction.holdIntervalHandle);\n interaction.holdIntervalHandle = null;\n }\n}\n\n// don't repeat by default\npointerEvents.defaults.holdRepeatInterval = 0;\npointerEvents.types.push('holdrepeat');\n\nmodule.exports = {\n onNew,\n onFired,\n endHoldRepeat,\n};\n","const pointerEvents = require('./base');\nconst Interactable = require('../Interactable');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\nconst scope = require('../scope');\nconst extend = require('../utils/extend');\nconst { merge } = require('../utils/arr');\n\npointerEvents.signals.on('collect-targets', function ({ targets, element, type, eventTarget }) {\n function collectSelectors (interactable, selector, context) {\n const els = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && is.element(element)\n && domUtils.matchesSelector(element, selector, els)\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n const interactable = scope.interactables.get(element);\n\n if (interactable) {\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n scope.interactables.forEachSelector(collectSelectors, element);\n});\n\nInteractable.signals.on('new', function ({ interactable }) {\n interactable.events.getRect = function (element) {\n return interactable.getRect(element);\n };\n});\n\nInteractable.signals.on('set', function ({ interactable, options }) {\n extend(interactable.events.options, pointerEvents.defaults);\n extend(interactable.events.options, options);\n});\n\nmerge(Interactable.eventTypes, pointerEvents.types);\n\nInteractable.prototype.pointerEvents = function (options) {\n extend(this.events.options, options);\n\n return this;\n};\n\nconst __backCompatOption = Interactable.prototype._backCompatOption;\n\nInteractable.prototype._backCompatOption = function (optionName, newValue) {\n const ret = __backCompatOption.call(this, optionName, newValue);\n\n if (ret === this) {\n this.events.options[optionName] = newValue;\n }\n\n return ret;\n};\n\nInteractable.settingsMethods.push('pointerEvents');\n","const utils = require('./utils');\nconst events = require('./utils/events');\nconst signals = require('./utils/Signals').new();\n\nconst scope = {\n signals,\n events,\n utils,\n\n // main document\n document: require('./utils/domObjects').document,\n // all documents being listened to\n documents: [],\n\n addDocument: function (doc, win) {\n // do nothing if document is already known\n if (utils.contains(scope.documents, doc)) { return false; }\n\n win = win || scope.getWindow(doc);\n\n scope.documents.push(doc);\n events.documents.push(doc);\n\n // don't add an unload event for the main document\n // so that the page may be cached in browser history\n if (doc !== scope.document) {\n events.add(win, 'unload', scope.onWindowUnload);\n }\n\n signals.fire('add-document', { doc, win });\n },\n\n removeDocument: function (doc, win) {\n const index = utils.indexOf(scope.documents, doc);\n\n win = win || scope.getWindow(doc);\n\n events.remove(win, 'unload', scope.onWindowUnload);\n\n scope.documents.splice(index, 1);\n events.documents.splice(index, 1);\n\n signals.fire('remove-document', { win, doc });\n },\n\n onWindowUnload: function () {\n scope.removeDocument(this.document, this);\n },\n};\n\nmodule.exports = scope;\n","const { indexOf } = require('./arr');\n\nclass Signals {\n constructor () {\n this.listeners = {\n // signalName: [listeners],\n };\n }\n\n on (name, listener) {\n if (!this.listeners[name]) {\n this.listeners[name] = [listener];\n return;\n }\n\n this.listeners[name].push(listener);\n }\n\n off (name, listener) {\n if (!this.listeners[name]) { return; }\n\n const index = indexOf(this.listeners[name], listener);\n\n if (index !== -1) {\n this.listeners[name].splice(index, 1);\n }\n }\n\n fire (name, arg) {\n const targetListeners = this.listeners[name];\n\n if (!targetListeners) { return; }\n\n for (let i = 0; i < targetListeners.length; i++) {\n if (targetListeners[i](arg, name) === false) {\n return;\n }\n }\n }\n}\n\nSignals.new = function () {\n return new Signals();\n};\n\nmodule.exports = Signals;\n","function indexOf (array, target) {\n for (let i = 0, len = array.length; i < len; i++) {\n if (array[i] === target) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction contains (array, target) {\n return indexOf(array, target) !== -1;\n}\n\nfunction merge (target, source) {\n for (let i = 0; i < source.length; i++) {\n target.push(source[i]);\n }\n\n return target;\n}\n\nfunction filter (array, test) {\n const result = [];\n\n for (let i = 0; i < array.length; i++) {\n if (test(array[i])) {\n result.push(array[i]);\n }\n }\n\n return result;\n}\n\nmodule.exports = {\n indexOf,\n contains,\n merge,\n filter,\n};\n","const { window } = require('./window');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst Element = domObjects.Element;\nconst navigator = window.navigator;\n\nconst browser = {\n // Does the browser support touch input?\n supportsTouch: !!(('ontouchstart' in window) || is.function(window.DocumentTouch)\n && domObjects.document instanceof window.DocumentTouch),\n\n // Does the browser support PointerEvents\n supportsPointerEvent: !!domObjects.PointerEvent,\n\n isIE8: ('attachEvent' in window) && !('addEventListener' in window),\n\n // Opera Mobile must be handled differently\n isOperaMobile: (navigator.appName === 'Opera'\n && browser.supportsTouch\n && navigator.userAgent.match('Presto')),\n\n // scrolling doesn't change the result of getClientRects on iOS 7\n isIOS7: (/iP(hone|od|ad)/.test(navigator.platform)\n && /OS 7[^\\d]/.test(navigator.appVersion)),\n\n isIe9OrOlder: /MSIE (8|9)/.test(navigator.userAgent),\n\n // prefix matchesSelector\n prefixedMatchesSelector: 'matches' in Element.prototype\n ? 'matches': 'webkitMatchesSelector' in Element.prototype\n ? 'webkitMatchesSelector': 'mozMatchesSelector' in Element.prototype\n ? 'mozMatchesSelector': 'oMatchesSelector' in Element.prototype\n ? 'oMatchesSelector': 'msMatchesSelector',\n\n useMatchesSelectorPolyfill: false,\n\n pEventTypes: (domObjects.PointerEvent\n ? (domObjects.PointerEvent === window.MSPointerEvent\n ? {\n up: 'MSPointerUp',\n down: 'MSPointerDown',\n over: 'mouseover',\n out: 'mouseout',\n move: 'MSPointerMove',\n cancel: 'MSPointerCancel',\n }\n : {\n up: 'pointerup',\n down: 'pointerdown',\n over: 'pointerover',\n out: 'pointerout',\n move: 'pointermove',\n cancel: 'pointercancel',\n })\n : null),\n\n // because Webkit and Opera still use 'mousewheel' event type\n wheelEvent: 'onmousewheel' in domObjects.document? 'mousewheel': 'wheel',\n\n};\n\nbrowser.useMatchesSelectorPolyfill = !is.function(Element.prototype[browser.prefixedMatchesSelector]);\n\nmodule.exports = browser;\n","const domObjects = {};\nconst win = require('./window').window;\n\nfunction blank () {}\n\ndomObjects.document = win.document;\ndomObjects.DocumentFragment = win.DocumentFragment || blank;\ndomObjects.SVGElement = win.SVGElement || blank;\ndomObjects.SVGSVGElement = win.SVGSVGElement || blank;\ndomObjects.SVGElementInstance = win.SVGElementInstance || blank;\ndomObjects.Element = win.Element || blank;\ndomObjects.HTMLElement = win.HTMLElement || domObjects.Element;\n\ndomObjects.Event = win.Event;\ndomObjects.Touch = win.Touch || blank;\ndomObjects.PointerEvent = (win.PointerEvent || win.MSPointerEvent);\n\nmodule.exports = domObjects;\n","const win = require('./window');\nconst browser = require('./browser');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst domUtils = {\n nodeContains: function (parent, child) {\n while (child) {\n if (child === parent) {\n return true;\n }\n\n child = child.parentNode;\n }\n\n return false;\n },\n\n closest: function (element, selector) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) { return element; }\n\n element = domUtils.parentNode(element);\n }\n\n return null;\n },\n\n parentNode: function (node) {\n let parent = node.parentNode;\n\n if (is.docFrag(parent)) {\n // skip past #shado-root fragments\n while ((parent = parent.host) && is.docFrag(parent)) {\n continue;\n }\n\n return parent;\n }\n\n return parent;\n },\n\n // taken from http://tanalin.com/en/blog/2012/12/matches-selector-ie8/ and modified\n matchesSelectorPolyfill: browser.useMatchesSelectorPolyfill\n ? function (element, selector, elems) {\n elems = elems || element.parentNode.querySelectorAll(selector);\n\n for (let i = 0, len = elems.length; i < len; i++) {\n if (elems[i] === element) {\n return true;\n }\n }\n\n return false;\n }\n : null,\n\n matchesSelector: function (element, selector, nodeList) {\n if (browser.useMatchesSelectorPolyfill) {\n return domUtils.matchesSelectorPolyfill(element, selector, nodeList);\n }\n\n // remove /deep/ from selectors if shadowDOM polyfill is used\n if (win.window !== win.realWindow) {\n selector = selector.replace(/\\/deep\\//g, ' ');\n }\n\n return element[browser.prefixedMatchesSelector](selector);\n },\n\n // Test for the element that's \"above\" all other qualifiers\n indexOfDeepestElement: function (elements) {\n let deepestZoneParents = [];\n let dropzoneParents = [];\n let dropzone;\n let deepestZone = elements[0];\n let index = deepestZone? 0: -1;\n let parent;\n let child;\n let i;\n let n;\n\n for (i = 1; i < elements.length; i++) {\n dropzone = elements[i];\n\n // an element might belong to multiple selector dropzones\n if (!dropzone || dropzone === deepestZone) {\n continue;\n }\n\n if (!deepestZone) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n // check if the deepest or current are document.documentElement or document.rootElement\n // - if the current dropzone is, do nothing and continue\n if (dropzone.parentNode === dropzone.ownerDocument) {\n continue;\n }\n // - if deepest is, update with the current dropzone and continue to next\n else if (deepestZone.parentNode === dropzone.ownerDocument) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n if (!deepestZoneParents.length) {\n parent = deepestZone;\n while (parent.parentNode && parent.parentNode !== parent.ownerDocument) {\n deepestZoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n }\n\n // if this element is an svg element and the current deepest is\n // an HTMLElement\n if (deepestZone instanceof domObjects.HTMLElement\n && dropzone instanceof domObjects.SVGElement\n && !(dropzone instanceof domObjects.SVGSVGElement)) {\n\n if (dropzone === deepestZone.parentNode) {\n continue;\n }\n\n parent = dropzone.ownerSVGElement;\n }\n else {\n parent = dropzone;\n }\n\n dropzoneParents = [];\n\n while (parent.parentNode !== parent.ownerDocument) {\n dropzoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n\n n = 0;\n\n // get (position of last common ancestor) + 1\n while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) {\n n++;\n }\n\n const parents = [\n dropzoneParents[n - 1],\n dropzoneParents[n],\n deepestZoneParents[n],\n ];\n\n child = parents[0].lastChild;\n\n while (child) {\n if (child === parents[1]) {\n deepestZone = dropzone;\n index = i;\n deepestZoneParents = [];\n\n break;\n }\n else if (child === parents[2]) {\n break;\n }\n\n child = child.previousSibling;\n }\n }\n\n return index;\n },\n\n matchesUpTo: function (element, selector, limit) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) {\n return true;\n }\n\n element = domUtils.parentNode(element);\n\n if (element === limit) {\n return domUtils.matchesSelector(element, selector);\n }\n }\n\n return false;\n },\n\n getActualElement: function (element) {\n return (element instanceof domObjects.SVGElementInstance\n ? element.correspondingUseElement\n : element);\n },\n\n getScrollXY: function (relevantWindow) {\n relevantWindow = relevantWindow || win.window;\n return {\n x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft,\n y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop,\n };\n },\n\n getElementClientRect: function (element) {\n const clientRect = (element instanceof domObjects.SVGElement\n ? element.getBoundingClientRect()\n : element.getClientRects()[0]);\n\n return clientRect && {\n left : clientRect.left,\n right : clientRect.right,\n top : clientRect.top,\n bottom: clientRect.bottom,\n width : clientRect.width || clientRect.right - clientRect.left,\n height: clientRect.height || clientRect.bottom - clientRect.top,\n };\n },\n\n getElementRect: function (element) {\n const clientRect = domUtils.getElementClientRect(element);\n\n if (!browser.isIOS7 && clientRect) {\n const scroll = domUtils.getScrollXY(win.getWindow(element));\n\n clientRect.left += scroll.x;\n clientRect.right += scroll.x;\n clientRect.top += scroll.y;\n clientRect.bottom += scroll.y;\n }\n\n return clientRect;\n },\n\n getPath: function (element) {\n const path = [];\n\n while (element) {\n path.push(element);\n element = domUtils.parentNode(element);\n }\n\n return path;\n },\n\n trySelector: value => {\n if (!is.string(value)) { return false; }\n\n // an exception will be raised if it is invalid\n domObjects.document.querySelector(value);\n return true;\n },\n};\n\nmodule.exports = domUtils;\n","const is = require('./is');\nconst domUtils = require('./domUtils');\nconst pExtend = require('./pointerExtend');\n\nconst { window, getWindow } = require('./window');\nconst { indexOf, contains } = require('./arr');\n\nconst useAttachEvent = ('attachEvent' in window) && !('addEventListener' in window);\nconst addEvent = useAttachEvent? 'attachEvent': 'addEventListener';\nconst removeEvent = useAttachEvent? 'detachEvent': 'removeEventListener';\nconst on = useAttachEvent? 'on': '';\n\nconst elements = [];\nconst targets = [];\nconst attachedListeners = [];\n\n// {\n// type: {\n// selectors: ['selector', ...],\n// contexts : [document, ...],\n// listeners: [[listener, capture, passive], ...]\n// }\n// }\nconst delegatedEvents = {};\n\nconst documents = [];\n\nconst supportsOptions = !useAttachEvent && (() => {\n let supported = false;\n\n window.document.createElement('div').addEventListener('test', null, {\n get capture () { supported = true; },\n });\n\n return supported;\n})();\n\nfunction add (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n let elementIndex = indexOf(elements, element);\n let target = targets[elementIndex];\n\n if (!target) {\n target = {\n events: {},\n typeCount: 0,\n };\n\n elementIndex = elements.push(element) - 1;\n targets.push(target);\n\n attachedListeners.push(useAttachEvent\n ? {\n supplied: [],\n wrapped : [],\n useCount: [],\n }\n : null);\n }\n\n if (!target.events[type]) {\n target.events[type] = [];\n target.typeCount++;\n }\n\n if (!contains(target.events[type], listener)) {\n let ret;\n\n if (useAttachEvent) {\n const { supplied, wrapped, useCount } = attachedListeners[elementIndex];\n const listenerIndex = indexOf(supplied, listener);\n\n const wrappedListener = wrapped[listenerIndex] || function (event) {\n if (!event.immediatePropagationStopped) {\n event.target = event.srcElement;\n event.currentTarget = element;\n\n event.preventDefault = event.preventDefault || preventDef;\n event.stopPropagation = event.stopPropagation || stopProp;\n event.stopImmediatePropagation = event.stopImmediatePropagation || stopImmProp;\n\n if (/mouse|click/.test(event.type)) {\n event.pageX = event.clientX + getWindow(element).document.documentElement.scrollLeft;\n event.pageY = event.clientY + getWindow(element).document.documentElement.scrollTop;\n }\n\n listener(event);\n }\n };\n\n ret = element[addEvent](on + type, wrappedListener, !!options.capture);\n\n if (listenerIndex === -1) {\n supplied.push(listener);\n wrapped.push(wrappedListener);\n useCount.push(1);\n }\n else {\n useCount[listenerIndex]++;\n }\n }\n else {\n ret = element[addEvent](type, listener, supportsOptions? options : !!options.capture);\n }\n target.events[type].push(listener);\n\n return ret;\n }\n}\n\nfunction remove (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const elementIndex = indexOf(elements, element);\n const target = targets[elementIndex];\n\n if (!target || !target.events) {\n return;\n }\n\n let wrappedListener = listener;\n let listeners;\n let listenerIndex;\n\n if (useAttachEvent) {\n listeners = attachedListeners[elementIndex];\n listenerIndex = indexOf(listeners.supplied, listener);\n wrappedListener = listeners.wrapped[listenerIndex];\n }\n\n if (type === 'all') {\n for (type in target.events) {\n if (target.events.hasOwnProperty(type)) {\n remove(element, type, 'all');\n }\n }\n return;\n }\n\n if (target.events[type]) {\n const len = target.events[type].length;\n\n if (listener === 'all') {\n for (let i = 0; i < len; i++) {\n remove(element, type, target.events[type][i], options);\n }\n return;\n }\n else {\n for (let i = 0; i < len; i++) {\n if (target.events[type][i] === listener) {\n element[removeEvent](on + type, wrappedListener, supportsOptions? options : !!options.capture);\n target.events[type].splice(i, 1);\n\n if (useAttachEvent && listeners) {\n listeners.useCount[listenerIndex]--;\n if (listeners.useCount[listenerIndex] === 0) {\n listeners.supplied.splice(listenerIndex, 1);\n listeners.wrapped.splice(listenerIndex, 1);\n listeners.useCount.splice(listenerIndex, 1);\n }\n }\n\n break;\n }\n }\n }\n\n if (target.events[type] && target.events[type].length === 0) {\n target.events[type] = null;\n target.typeCount--;\n }\n }\n\n if (!target.typeCount) {\n targets.splice(elementIndex, 1);\n elements.splice(elementIndex, 1);\n attachedListeners.splice(elementIndex, 1);\n }\n}\n\nfunction addDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n if (!delegatedEvents[type]) {\n delegatedEvents[type] = {\n selectors: [],\n contexts : [],\n listeners: [],\n };\n\n // add delegate listener functions\n for (let i = 0; i < documents.length; i++) {\n add(documents[i], type, delegateListener);\n add(documents[i], type, delegateUseCapture, true);\n }\n }\n\n const delegated = delegatedEvents[type];\n let index;\n\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n break;\n }\n }\n\n if (index === -1) {\n index = delegated.selectors.length;\n\n delegated.selectors.push(selector);\n delegated.contexts .push(context);\n delegated.listeners.push([]);\n }\n\n // keep listener and capture and passive flags\n delegated.listeners[index].push([listener, !!options.capture, options.passive]);\n}\n\nfunction removeDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const delegated = delegatedEvents[type];\n let matchFound = false;\n let index;\n\n if (!delegated) { return; }\n\n // count from last index of delegated to 0\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n // look for matching selector and context Node\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n\n const listeners = delegated.listeners[index];\n\n // each item of the listeners array is an array: [function, capture, passive]\n for (let i = listeners.length - 1; i >= 0; i--) {\n const [fn, capture, passive] = listeners[i];\n\n // check if the listener functions and capture and passive flags match\n if (fn === listener && capture === !!options.capture && passive === options.passive) {\n // remove the listener from the array of listeners\n listeners.splice(i, 1);\n\n // if all listeners for this interactable have been removed\n // remove the interactable from the delegated arrays\n if (!listeners.length) {\n delegated.selectors.splice(index, 1);\n delegated.contexts .splice(index, 1);\n delegated.listeners.splice(index, 1);\n\n // remove delegate function from context\n remove(context, type, delegateListener);\n remove(context, type, delegateUseCapture, true);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegatedEvents[type] = null;\n }\n }\n\n // only remove one listener\n matchFound = true;\n break;\n }\n }\n\n if (matchFound) { break; }\n }\n }\n}\n\n// bound to the interactable context when a DOM event\n// listener is added to a selector interactable\nfunction delegateListener (event, optionalArg) {\n const options = getOptions(optionalArg);\n const fakeEvent = {};\n const delegated = delegatedEvents[event.type];\n const eventTarget = (domUtils.getActualElement(event.path\n ? event.path[0]\n : event.target));\n let element = eventTarget;\n\n // duplicate the event so that currentTarget can be changed\n pExtend(fakeEvent, event);\n\n fakeEvent.originalEvent = event;\n fakeEvent.preventDefault = preventOriginalDefault;\n\n // climb up document tree looking for selector matches\n while (is.element(element)) {\n for (let i = 0; i < delegated.selectors.length; i++) {\n const selector = delegated.selectors[i];\n const context = delegated.contexts[i];\n\n if (domUtils.matchesSelector(element, selector)\n && domUtils.nodeContains(context, eventTarget)\n && domUtils.nodeContains(context, element)) {\n\n const listeners = delegated.listeners[i];\n\n fakeEvent.currentTarget = element;\n\n for (let j = 0; j < listeners.length; j++) {\n const [fn, capture, passive] = listeners[j];\n\n if (capture === !!options.capture && passive === options.passive) {\n fn(fakeEvent);\n }\n }\n }\n }\n\n element = domUtils.parentNode(element);\n }\n}\n\nfunction delegateUseCapture (event) {\n return delegateListener.call(this, event, true);\n}\n\nfunction preventDef () {\n this.returnValue = false;\n}\n\nfunction preventOriginalDefault () {\n this.originalEvent.preventDefault();\n}\n\nfunction stopProp () {\n this.cancelBubble = true;\n}\n\nfunction stopImmProp () {\n this.cancelBubble = true;\n this.immediatePropagationStopped = true;\n}\n\nfunction getOptions (param) {\n return is.object(param)? param : { capture: param };\n}\n\nmodule.exports = {\n add,\n remove,\n\n addDelegate,\n removeDelegate,\n\n delegateListener,\n delegateUseCapture,\n delegatedEvents,\n documents,\n\n useAttachEvent,\n supportsOptions,\n\n _elements: elements,\n _targets: targets,\n _attachedListeners: attachedListeners,\n};\n","module.exports = function extend (dest, source) {\n for (const prop in source) {\n dest[prop] = source[prop];\n }\n return dest;\n};\n","const {\n resolveRectLike,\n rectToXY,\n} = require('./rect');\n\nmodule.exports = function (target, element, action) {\n const actionOptions = target.options[action];\n const actionOrigin = actionOptions && actionOptions.origin;\n const origin = actionOrigin || target.options.origin;\n\n const originRect = resolveRectLike(origin, target, element, [target && element]);\n\n return rectToXY(originRect) || { x: 0, y: 0 };\n};\n","module.exports = (x, y) => Math.sqrt(x * x + y * y);\n","const extend = require('./extend');\nconst win = require('./window');\n\nconst utils = {\n warnOnce: function (method, message) {\n let warned = false;\n\n return function () {\n if (!warned) {\n win.window.console.warn(message);\n warned = true;\n }\n\n return method.apply(this, arguments);\n };\n },\n\n // http://stackoverflow.com/a/5634528/2280888\n _getQBezierValue: function (t, p1, p2, p3) {\n const iT = 1 - t;\n return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3;\n },\n\n getQuadraticCurvePoint: function (startX, startY, cpX, cpY, endX, endY, position) {\n return {\n x: utils._getQBezierValue(position, startX, cpX, endX),\n y: utils._getQBezierValue(position, startY, cpY, endY),\n };\n },\n\n // http://gizma.com/easing/\n easeOutQuad: function (t, b, c, d) {\n t /= d;\n return -c * t*(t-2) + b;\n },\n\n copyAction: function (dest, src) {\n dest.name = src.name;\n dest.axis = src.axis;\n dest.edges = src.edges;\n\n return dest;\n },\n\n is : require('./is'),\n extend : extend,\n hypot : require('./hypot'),\n getOriginXY: require('./getOriginXY'),\n};\n\nextend(utils, require('./arr'));\nextend(utils, require('./domUtils'));\nextend(utils, require('./pointerUtils'));\nextend(utils, require('./rect'));\n\nmodule.exports = utils;\n","const scope = require('../scope');\nconst utils = require('./index');\nconst browser = require('./browser');\n\nconst finder = {\n methodOrder: [ 'simulationResume', 'mouse', 'hasPointer', 'idle' ],\n\n search: function (pointer, eventType, eventTarget) {\n const mouseEvent = (/mouse/i.test(pointer.pointerType || eventType)\n // MSPointerEvent.MSPOINTER_TYPE_MOUSE\n || pointer.pointerType === 4);\n const pointerId = utils.getPointerId(pointer);\n const details = { pointer, pointerId, mouseEvent, eventType, eventTarget };\n\n for (const method of finder.methodOrder) {\n const interaction = finder[method](details);\n\n if (interaction) {\n return interaction;\n }\n }\n },\n\n // try to resume simulation with a new pointer\n simulationResume: function ({ mouseEvent, eventType, eventTarget }) {\n if (!/down|start/i.test(eventType)) {\n return null;\n }\n\n for (const interaction of scope.interactions) {\n let element = eventTarget;\n\n if (interaction.simulation && interaction.simulation.allowResume\n && (interaction.mouse === mouseEvent)) {\n while (element) {\n // if the element is the interaction element\n if (element === interaction.element) {\n return interaction;\n }\n element = utils.parentNode(element);\n }\n }\n }\n\n return null;\n },\n\n // if it's a mouse interaction\n mouse: function ({ pointerId, mouseEvent, eventType }) {\n if (!mouseEvent && (browser.supportsTouch || browser.supportsPointerEvent)) {\n return null;\n }\n\n let firstNonActive;\n\n for (const interaction of scope.interactions) {\n if (interaction.mouse) {\n // if it's a down event, skip interactions with running simulations\n if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; }\n\n // if the interaction is active, return it immediately\n if (interaction.interacting()) {\n return interaction;\n }\n // otherwise save it and look for another active interaction\n else if (!firstNonActive) {\n firstNonActive = interaction;\n }\n }\n }\n\n // if no active mouse interaction was found use the first inactive mouse\n // interaction\n if (firstNonActive) {\n return firstNonActive;\n }\n\n // Find any interaction specifically for mouse.\n // ignore the interaction if the eventType is a mousedown, and a simulation\n // is active\n for (const interaction of scope.interactions) {\n if (interaction.mouse && !(/down/.test(eventType) && interaction.simulation)) {\n return interaction;\n }\n }\n\n return null;\n },\n\n // get interaction that has this pointer\n hasPointer: function ({ pointerId }) {\n for (const interaction of scope.interactions) {\n if (utils.contains(interaction.pointerIds, pointerId)) {\n return interaction;\n }\n }\n },\n\n // get first idle interaction\n idle: function ({ mouseEvent }) {\n for (const interaction of scope.interactions) {\n // if there's already a pointer held down\n if (interaction.pointerIds.length === 1) {\n const target = interaction.target;\n // don't add this pointer if there is a target interactable and it\n // isn't gesturable\n if (target && !target.options.gesture.enabled) {\n continue;\n }\n }\n // maximum of 2 pointers per interaction\n else if (interaction.pointerIds.length >= 2) {\n continue;\n }\n\n if (!interaction.interacting() && (mouseEvent === interaction.mouse)) {\n return interaction;\n }\n }\n\n return null;\n },\n};\n\nmodule.exports = finder;\n","const win = require('./window');\nconst isWindow = require('./isWindow');\n\nconst is = {\n array : () => {},\n\n window : thing => thing === win.window || isWindow(thing),\n\n docFrag : thing => is.object(thing) && thing.nodeType === 11,\n\n object : thing => !!thing && (typeof thing === 'object'),\n\n function: thing => typeof thing === 'function',\n\n number : thing => typeof thing === 'number' ,\n\n bool : thing => typeof thing === 'boolean' ,\n\n string : thing => typeof thing === 'string' ,\n\n element: thing => {\n if (!thing || (typeof thing !== 'object')) { return false; }\n\n const _window = win.getWindow(thing) || win.window;\n\n return (/object|function/.test(typeof _window.Element)\n ? thing instanceof _window.Element //DOM2\n : thing.nodeType === 1 && typeof thing.nodeName === 'string');\n },\n};\n\nis.array = thing => (is.object(thing)\n && (typeof thing.length !== 'undefined')\n && is.function(thing.splice));\n\nmodule.exports = is;\n","module.exports = (thing) => !!(thing && thing.Window) && (thing instanceof thing.Window);\n","function pointerExtend (dest, source) {\n for (const prop in source) {\n const prefixedPropREs = module.exports.prefixedPropREs;\n let deprecated = false;\n\n // skip deprecated prefixed properties\n for (const vendor in prefixedPropREs) {\n if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) {\n deprecated = true;\n break;\n }\n }\n\n if (!deprecated && typeof source[prop] !== 'function') {\n dest[prop] = source[prop];\n }\n }\n return dest;\n}\n\npointerExtend.prefixedPropREs = {\n webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/,\n};\n\nmodule.exports = pointerExtend;\n","const hypot = require('./hypot');\nconst browser = require('./browser');\nconst dom = require('./domObjects');\nconst domUtils = require('./domUtils');\nconst is = require('./is');\nconst pointerExtend = require('./pointerExtend');\n\nconst pointerUtils = {\n copyCoords: function (dest, src) {\n dest.page = dest.page || {};\n dest.page.x = src.page.x;\n dest.page.y = src.page.y;\n\n dest.client = dest.client || {};\n dest.client.x = src.client.x;\n dest.client.y = src.client.y;\n\n dest.timeStamp = src.timeStamp;\n },\n\n setCoordDeltas: function (targetObj, prev, cur) {\n targetObj.page.x = cur.page.x - prev.page.x;\n targetObj.page.y = cur.page.y - prev.page.y;\n targetObj.client.x = cur.client.x - prev.client.x;\n targetObj.client.y = cur.client.y - prev.client.y;\n targetObj.timeStamp = cur.timeStamp - prev.timeStamp;\n\n // set pointer velocity\n const dt = Math.max(targetObj.timeStamp / 1000, 0.001);\n\n targetObj.page.speed = hypot(targetObj.page.x, targetObj.page.y) / dt;\n targetObj.page.vx = targetObj.page.x / dt;\n targetObj.page.vy = targetObj.page.y / dt;\n\n targetObj.client.speed = hypot(targetObj.client.x, targetObj.page.y) / dt;\n targetObj.client.vx = targetObj.client.x / dt;\n targetObj.client.vy = targetObj.client.y / dt;\n },\n\n isNativePointer: function (pointer) {\n return (pointer instanceof dom.Event || pointer instanceof dom.Touch);\n },\n\n // Get specified X/Y coords for mouse or event.touches[0]\n getXY: function (type, pointer, xy) {\n xy = xy || {};\n type = type || 'page';\n\n xy.x = pointer[type + 'X'];\n xy.y = pointer[type + 'Y'];\n\n return xy;\n },\n\n getPageXY: function (pointer, page) {\n page = page || {};\n\n // Opera Mobile handles the viewport and scrolling oddly\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n pointerUtils.getXY('screen', pointer, page);\n\n page.x += window.scrollX;\n page.y += window.scrollY;\n }\n else {\n pointerUtils.getXY('page', pointer, page);\n }\n\n return page;\n },\n\n getClientXY: function (pointer, client) {\n client = client || {};\n\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n // Opera Mobile handles the viewport and scrolling oddly\n pointerUtils.getXY('screen', pointer, client);\n }\n else {\n pointerUtils.getXY('client', pointer, client);\n }\n\n return client;\n },\n\n getPointerId: function (pointer) {\n return is.number(pointer.pointerId)? pointer.pointerId : pointer.identifier;\n },\n\n setCoords: function (targetObj, pointers, timeStamp) {\n const pointer = (pointers.length > 1\n ? pointerUtils.pointerAverage(pointers)\n : pointers[0]);\n\n const tmpXY = {};\n\n pointerUtils.getPageXY(pointer, tmpXY);\n targetObj.page.x = tmpXY.x;\n targetObj.page.y = tmpXY.y;\n\n pointerUtils.getClientXY(pointer, tmpXY);\n targetObj.client.x = tmpXY.x;\n targetObj.client.y = tmpXY.y;\n\n targetObj.timeStamp = is.number(timeStamp) ? timeStamp :new Date().getTime();\n },\n\n pointerExtend: pointerExtend,\n\n getTouchPair: function (event) {\n const touches = [];\n\n // array of touches is supplied\n if (is.array(event)) {\n touches[0] = event[0];\n touches[1] = event[1];\n }\n // an event\n else {\n if (event.type === 'touchend') {\n if (event.touches.length === 1) {\n touches[0] = event.touches[0];\n touches[1] = event.changedTouches[0];\n }\n else if (event.touches.length === 0) {\n touches[0] = event.changedTouches[0];\n touches[1] = event.changedTouches[1];\n }\n }\n else {\n touches[0] = event.touches[0];\n touches[1] = event.touches[1];\n }\n }\n\n return touches;\n },\n\n pointerAverage: function (pointers) {\n const average = {\n pageX : 0,\n pageY : 0,\n clientX: 0,\n clientY: 0,\n screenX: 0,\n screenY: 0,\n };\n\n for (const pointer of pointers) {\n for (const prop in average) {\n average[prop] += pointer[prop];\n }\n }\n for (const prop in average) {\n average[prop] /= pointers.length;\n }\n\n return average;\n },\n\n touchBBox: function (event) {\n if (!event.length && !(event.touches && event.touches.length > 1)) {\n return;\n }\n\n const touches = pointerUtils.getTouchPair(event);\n const minX = Math.min(touches[0].pageX, touches[1].pageX);\n const minY = Math.min(touches[0].pageY, touches[1].pageY);\n const maxX = Math.max(touches[0].pageX, touches[1].pageX);\n const maxY = Math.max(touches[0].pageY, touches[1].pageY);\n\n return {\n x: minX,\n y: minY,\n left: minX,\n top: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n },\n\n touchDistance: function (event, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n\n\n const dx = touches[0][sourceX] - touches[1][sourceX];\n const dy = touches[0][sourceY] - touches[1][sourceY];\n\n return hypot(dx, dy);\n },\n\n touchAngle: function (event, prevAngle, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n const dx = touches[1][sourceX] - touches[0][sourceX];\n const dy = touches[1][sourceY] - touches[0][sourceY];\n const angle = 180 * Math.atan2(dy , dx) / Math.PI;\n\n return angle;\n },\n\n getPointerType: function (pointer, interaction) {\n // if the PointerEvent API isn't available, then the pointer must be ither\n // a MouseEvent or TouchEvent\n if (interaction.mouse) { return 'mouse'; }\n if (!browser.supportsPointerEvent) { return 'touch'; }\n\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : [undefined, undefined,'touch', 'pen', 'mouse'][pointer.pointerType];\n },\n\n // [ event.target, event.currentTarget ]\n getEventTargets: function (event) {\n return [\n domUtils.getActualElement(event.path ? event.path[0] : event.target),\n domUtils.getActualElement(event.currentTarget),\n ];\n },\n};\n\nmodule.exports = pointerUtils;\n","const { window } = require('./window');\n\nconst vendors = ['ms', 'moz', 'webkit', 'o'];\nlet lastTime = 0;\nlet request;\nlet cancel;\n\nfor (let x = 0; x < vendors.length && !window.requestAnimationFrame; x++) {\n request = window[vendors[x] + 'RequestAnimationFrame'];\n cancel = window[vendors[x] +'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n}\n\nif (!request) {\n request = function (callback) {\n const currTime = new Date().getTime();\n const timeToCall = Math.max(0, 16 - (currTime - lastTime));\n const id = setTimeout(function () { callback(currTime + timeToCall); },\n timeToCall);\n\n lastTime = currTime + timeToCall;\n return id;\n };\n}\n\nif (!cancel) {\n cancel = function (id) {\n clearTimeout(id);\n };\n}\n\nmodule.exports = {\n request,\n cancel,\n};\n","const extend = require('./extend');\nconst is = require('./is');\nconst {\n closest,\n parentNode,\n getElementRect,\n} = require('./domUtils');\n\nconst rectUtils = {\n getStringOptionResult: function (value, interactable, element) {\n if (!is.string(value)) {\n return null;\n }\n\n if (value === 'parent') {\n value = parentNode(element);\n }\n else if (value === 'self') {\n value = interactable.getRect(element);\n }\n else {\n value = closest(element, value);\n }\n\n return value;\n },\n\n resolveRectLike: function (value, interactable, element, functionArgs) {\n value = rectUtils.getStringOptionResult(value, interactable, element) || value;\n\n if (is.function(value)) {\n value = value.apply(null, functionArgs);\n }\n\n if (is.element(value)) {\n value = getElementRect(value);\n }\n\n return value;\n },\n\n rectToXY: function (rect) {\n return rect && {\n x: 'x' in rect ? rect.x : rect.left,\n y: 'y' in rect ? rect.y : rect.top,\n };\n },\n\n xywhToTlbr: function (rect) {\n if (rect && !('left' in rect && 'top' in rect)) {\n rect = extend({}, rect);\n\n rect.left = rect.x || 0;\n rect.top = rect.y || 0;\n rect.right = rect.right || (rect.left + rect.width);\n rect.bottom = rect.bottom || (rect.top + rect.height);\n }\n\n return rect;\n },\n\n tlbrToXywh: function (rect) {\n if (rect && !('x' in rect && 'y' in rect)) {\n rect = extend({}, rect);\n\n rect.x = rect.left || 0;\n rect.top = rect.top || 0;\n rect.width = rect.width || (rect.right - rect.x);\n rect.height = rect.height || (rect.bottom - rect.y);\n }\n\n return rect;\n },\n};\n\nmodule.exports = rectUtils;\n","const win = module.exports;\nconst isWindow = require('./isWindow');\n\nfunction init (window) {\n // get wrapped window if using Shadow DOM polyfill\n\n win.realWindow = window;\n\n // create a TextNode\n const el = window.document.createTextNode('');\n\n // check if it's wrapped by a polyfill\n if (el.ownerDocument !== window.document\n && typeof window.wrap === 'function'\n && window.wrap(el) === el) {\n // use wrapped window\n window = window.wrap(window);\n }\n\n win.window = window;\n}\n\nif (typeof window === 'undefined') {\n win.window = undefined;\n win.realWindow = undefined;\n}\nelse {\n init(window);\n}\n\nwin.getWindow = function getWindow (node) {\n if (isWindow(node)) {\n return node;\n }\n\n const rootNode = (node.ownerDocument || node);\n\n return rootNode.defaultView || rootNode.parentWindow || win.window;\n};\n\nwin.init = init;\n"]} \ No newline at end of file +{"version":3,"sources":["src/header.js","node_modules/browser-pack/_prelude.js","index.js","src/Eventable.js","src/InteractEvent.js","src/Interactable.js","src/Interaction.js","src/actions/base.js","src/actions/drag.js","src/actions/drop.js","src/actions/gesture.js","src/actions/resize.js","src/autoScroll.js","src/autoStart/InteractableMethods.js","src/autoStart/base.js","src/autoStart/delay.js","src/autoStart/drag.js","src/autoStart/gesture.js","src/autoStart/resize.js","src/defaultOptions.js","src/index.js","src/inertia.js","src/interact.js","src/interactablePreventDefault.js","src/legacyBrowsers.js","src/modifiers/index.js","src/modifiers/restrict.js","src/modifiers/restrictEdges.js","src/modifiers/restrictSize.js","src/modifiers/snap.js","src/modifiers/snapSize.js","src/pointerEvents/PointerEvent.js","src/pointerEvents/base.js","src/pointerEvents/holdRepeat.js","src/pointerEvents/interactableTargets.js","src/scope.js","src/utils/Signals.js","src/utils/arr.js","src/utils/browser.js","src/utils/domObjects.js","src/utils/domUtils.js","src/utils/events.js","src/utils/extend.js","src/utils/getOriginXY.js","src/utils/hypot.js","src/utils/index.js","src/utils/interactionFinder.js","src/utils/is.js","src/utils/isWindow.js","src/utils/pointerExtend.js","src/utils/pointerUtils.js","src/utils/raf.js","src/utils/rect.js","src/utils/window.js"],"names":[],"mappings":"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","file":"interact.js","sourceRoot":"","sourcesContent":["/**\n * interact.js v1.3.0-alpha.4+sha.7970416-dirty\n *\n * Copyright (c) 2012-2017 Taye Adeyemi \n * Open source under the MIT License.\n * https://raw.github.com/taye/interact.js/master/LICENSE\n */\n","(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o 150) {\n return null;\n }\n\n let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI;\n const overlap = 22.5;\n\n if (angle < 0) {\n angle += 360;\n }\n\n const left = 135 - overlap <= angle && angle < 225 + overlap;\n const up = 225 - overlap <= angle && angle < 315 + overlap;\n\n const right = !left && (315 - overlap <= angle || angle < 45 + overlap);\n const down = !up && 45 - overlap <= angle && angle < 135 + overlap;\n\n return {\n up,\n down,\n left,\n right,\n angle,\n speed: interaction.prevEvent.speed,\n velocity: {\n x: interaction.prevEvent.velocityX,\n y: interaction.prevEvent.velocityY,\n },\n };\n }\n\n preventDefault () {}\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n}\n\nsignals.on('set-delta', function ({ iEvent, interaction, starting, deltaSource }) {\n const prevEvent = starting? iEvent : interaction.prevEvent;\n\n if (deltaSource === 'client') {\n iEvent.dx = iEvent.clientX - prevEvent.clientX;\n iEvent.dy = iEvent.clientY - prevEvent.clientY;\n }\n else {\n iEvent.dx = iEvent.pageX - prevEvent.pageX;\n iEvent.dy = iEvent.pageY - prevEvent.pageY;\n }\n});\n\nInteractEvent.signals = signals;\n\nmodule.exports = InteractEvent;\n","const is = require('./utils/is');\nconst events = require('./utils/events');\nconst extend = require('./utils/extend');\nconst actions = require('./actions/base');\nconst scope = require('./scope');\nconst Eventable = require('./Eventable');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nconst {\n getElementRect,\n nodeContains,\n trySelector,\n} = require('./utils/domUtils');\nconst { getWindow } = require('./utils/window');\nconst { indexOf, contains } = require('./utils/arr');\nconst { wheelEvent } = require('./utils/browser');\n\n// all set interactables\nscope.interactables = [];\n\n/*\\\n * Interactable\n [ property ]\n **\n * Object type returned by @interact\n\\*/\nclass Interactable {\n constructor (target, options) {\n options = options || {};\n\n this.target = target;\n this.events = new Eventable();\n this._context = options.context || scope.document;\n this._win = getWindow(trySelector(target)? this._context : target);\n this._doc = this._win.document;\n\n signals.fire('new', {\n target,\n options,\n interactable: this,\n win: this._win,\n });\n\n scope.addDocument( this._doc, this._win );\n\n scope.interactables.push(this);\n\n this.set(options);\n }\n\n setOnEvents (action, phases) {\n const onAction = 'on' + action;\n\n if (is.function(phases.onstart) ) { this.events[onAction + 'start' ] = phases.onstart ; }\n if (is.function(phases.onmove) ) { this.events[onAction + 'move' ] = phases.onmove ; }\n if (is.function(phases.onend) ) { this.events[onAction + 'end' ] = phases.onend ; }\n if (is.function(phases.oninertiastart)) { this.events[onAction + 'inertiastart' ] = phases.oninertiastart ; }\n\n return this;\n }\n\n setPerAction (action, options) {\n // for all the default per-action options\n for (const option in options) {\n // if this option exists for this action\n if (option in defaults[action]) {\n // if the option in the options arg is an object value\n if (is.object(options[option])) {\n // duplicate the object\n this.options[action][option] = extend(this.options[action][option] || {}, options[option]);\n\n if (is.object(defaults.perAction[option]) && 'enabled' in defaults.perAction[option]) {\n this.options[action][option].enabled = options[option].enabled === false? false : true;\n }\n }\n else if (is.bool(options[option]) && is.object(defaults.perAction[option])) {\n this.options[action][option].enabled = options[option];\n }\n else if (options[option] !== undefined) {\n // or if it's not undefined, do a plain assignment\n this.options[action][option] = options[option];\n }\n }\n }\n }\n\n /*\\\n * Interactable.getRect\n [ method ]\n *\n * The default function to get an Interactables bounding rect. Can be\n * overridden using @Interactable.rectChecker.\n *\n - element (Element) #optional The element to measure.\n = (object) The object's bounding rectangle.\n o {\n o top : 0,\n o left : 0,\n o bottom: 0,\n o right : 0,\n o width : 0,\n o height: 0\n o }\n \\*/\n getRect (element) {\n element = element || this.target;\n\n if (is.string(this.target) && !(is.element(element))) {\n element = this._context.querySelector(this.target);\n }\n\n return getElementRect(element);\n }\n\n /*\\\n * Interactable.rectChecker\n [ method ]\n *\n * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n - checker (function) #optional A function which returns this Interactable's bounding rectangle. See @Interactable.getRect\n = (function | object) The checker function or this Interactable\n \\*/\n rectChecker (checker) {\n if (is.function(checker)) {\n this.getRect = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.getRect;\n\n return this;\n }\n\n return this.getRect;\n }\n\n _backCompatOption (optionName, newValue) {\n if (trySelector(newValue) || is.object(newValue)) {\n this.options[optionName] = newValue;\n\n for (const action of actions.names) {\n this.options[action][optionName] = newValue;\n }\n\n return this;\n }\n\n return this.options[optionName];\n }\n\n /*\\\n * Interactable.origin\n [ method ]\n *\n * Gets or sets the origin of the Interactable's element. The x and y\n * of the origin will be subtracted from action event coordinates.\n *\n - origin (object | string) #optional An object eg. { x: 0, y: 0 } or string 'parent', 'self' or any CSS selector\n * OR\n - origin (Element) #optional An HTML or SVG Element whose rect will be used\n **\n = (object) The current origin or this Interactable\n \\*/\n origin (newValue) {\n return this._backCompatOption('origin', newValue);\n }\n\n /*\\\n * Interactable.deltaSource\n [ method ]\n *\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n - newValue (string) #optional Use 'client' if you will be scrolling while interacting; Use 'page' if you want autoScroll to work\n = (string | object) The current deltaSource or this Interactable\n \\*/\n deltaSource (newValue) {\n if (newValue === 'page' || newValue === 'client') {\n this.options.deltaSource = newValue;\n\n return this;\n }\n\n return this.options.deltaSource;\n }\n\n /*\\\n * Interactable.context\n [ method ]\n *\n * Gets the selector context Node of the Interactable. The default is `window.document`.\n *\n = (Node) The context Node of this Interactable\n **\n \\*/\n context () {\n return this._context;\n }\n\n inContext (element) {\n return (this._context === element.ownerDocument\n || nodeContains(this._context, element));\n }\n\n /*\\\n * Interactable.fire\n [ method ]\n *\n * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n - iEvent (InteractEvent) The InteractEvent object to be fired on this Interactable\n = (Interactable) this Interactable\n \\*/\n fire (iEvent) {\n this.events.fire(iEvent);\n\n return this;\n }\n\n _onOffMultiple (method, eventType, listener, options) {\n if (is.string(eventType) && eventType.search(' ') !== -1) {\n eventType = eventType.trim().split(/ +/);\n }\n\n if (is.array(eventType)) {\n for (let i = 0; i < eventType.length; i++) {\n this[method](eventType[i], listener, options);\n }\n\n return true;\n }\n\n if (is.object(eventType)) {\n for (const prop in eventType) {\n this[method](prop, eventType[prop], listener);\n }\n\n return true;\n }\n }\n\n /*\\\n * Interactable.on\n [ method ]\n *\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n - eventType (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) This Interactable\n \\*/\n on (eventType, listener, options) {\n if (this._onOffMultiple('on', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.on(eventType, listener);\n }\n // delegated event for selector\n else if (is.string(this.target)) {\n events.addDelegate(this.target, this._context, eventType, listener, options);\n }\n else {\n events.add(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.off\n [ method ]\n *\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n - eventType (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) This Interactable\n \\*/\n off (eventType, listener, options) {\n if (this._onOffMultiple('off', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n // if it is an action event type\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.off(eventType, listener);\n }\n // delegated event\n else if (is.string(this.target)) {\n events.removeDelegate(this.target, this._context, eventType, listener, options);\n }\n // remove listener from this Interatable's element\n else {\n events.remove(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.set\n [ method ]\n *\n * Reset the options of this Interactable\n - options (object) The new settings to apply\n = (object) This Interactable\n \\*/\n set (options) {\n if (!is.object(options)) {\n options = {};\n }\n\n this.options = extend({}, defaults.base);\n\n const perActions = extend({}, defaults.perAction);\n\n for (const actionName in actions.methodDict) {\n const methodName = actions.methodDict[actionName];\n\n this.options[actionName] = extend({}, defaults[actionName]);\n\n this.setPerAction(actionName, perActions);\n\n this[methodName](options[actionName]);\n }\n\n for (const setting of Interactable.settingsMethods) {\n this.options[setting] = defaults.base[setting];\n\n if (setting in options) {\n this[setting](options[setting]);\n }\n }\n\n signals.fire('set', {\n options,\n interactable: this,\n });\n\n return this;\n }\n\n /*\\\n * Interactable.unset\n [ method ]\n *\n * Remove this interactable from the list of interactables and remove\n * it's action capabilities and event listeners\n *\n = (object) @interact\n \\*/\n unset () {\n events.remove(this.target, 'all');\n\n if (is.string(this.target)) {\n // remove delegated events\n for (const type in events.delegatedEvents) {\n const delegated = events.delegatedEvents[type];\n\n if (delegated.selectors[0] === this.target\n && delegated.contexts[0] === this._context) {\n\n delegated.selectors.splice(0, 1);\n delegated.contexts .splice(0, 1);\n delegated.listeners.splice(0, 1);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegated[type] = null;\n }\n }\n\n events.remove(this._context, type, events.delegateListener);\n events.remove(this._context, type, events.delegateUseCapture, true);\n }\n }\n else {\n events.remove(this, 'all');\n }\n\n signals.fire('unset', { interactable: this });\n\n scope.interactables.splice(indexOf(scope.interactables, this), 1);\n\n // Stop related interactions when an Interactable is unset\n for (const interaction of scope.interactions || []) {\n if (interaction.target === this && interaction.interacting()) {\n interaction.stop();\n }\n }\n\n return scope.interact;\n }\n}\n\nscope.interactables.indexOfElement = function indexOfElement (target, context) {\n context = context || scope.document;\n\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n if (interactable.target === target && interactable._context === context) {\n return i;\n }\n }\n return -1;\n};\n\nscope.interactables.get = function interactableGet (element, options, dontCheckInContext) {\n const ret = this[this.indexOfElement(element, options && options.context)];\n\n return ret && (is.string(element) || dontCheckInContext || ret.inContext(element))? ret : null;\n};\n\nscope.interactables.forEachSelector = function (callback, element) {\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n // skip non CSS selector targets and out of context elements\n if (!is.string(interactable.target)\n || (element && !interactable.inContext(element))) {\n continue;\n }\n\n const ret = callback(interactable, interactable.target, interactable._context, i, this);\n\n if (ret !== undefined) {\n return ret;\n }\n }\n};\n\n// all interact.js eventTypes\nInteractable.eventTypes = scope.eventTypes = [];\n\nInteractable.signals = signals;\n\nInteractable.settingsMethods = [ 'deltaSource', 'origin', 'preventDefault', 'rectChecker' ];\n\nmodule.exports = Interactable;\n","const scope = require('./scope');\nconst utils = require('./utils');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst domObjects = require('./utils/domObjects');\nconst finder = require('./utils/interactionFinder');\nconst signals = require('./utils/Signals').new();\n\nconst listeners = {};\nconst methodNames = [\n 'pointerDown', 'pointerMove', 'pointerUp',\n 'updatePointer', 'removePointer',\n];\n\n// for ignoring browser's simulated mouse events\nlet prevTouchTime = 0;\n\n// all active and idle interactions\nscope.interactions = [];\n\nclass Interaction {\n constructor ({ pointerType }) {\n this.target = null; // current interactable being interacted with\n this.element = null; // the target element of the interactable\n\n this.prepared = { // action that's ready to be fired on next move event\n name : null,\n axis : null,\n edges: null,\n };\n\n // keep track of added pointers\n this.pointers = [];\n this.pointerIds = [];\n this.downTargets = [];\n this.downTimes = [];\n\n // Previous native pointer move event coordinates\n this.prevCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n // current native pointer move event coordinates\n this.curCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Starting InteractEvent pointer coordinates\n this.startCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Change in coordinates and time of the pointer\n this.pointerDelta = {\n page : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n client : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n timeStamp: 0,\n };\n\n this.downEvent = null; // pointerdown/mousedown/touchstart event\n this.downPointer = {};\n\n this._eventTarget = null;\n this._curEventTarget = null;\n\n this.prevEvent = null; // previous action event\n\n this.pointerIsDown = false;\n this.pointerWasMoved = false;\n this._interacting = false;\n\n this.pointerType = pointerType;\n\n signals.fire('new', this);\n\n scope.interactions.push(this);\n }\n\n pointerDown (pointer, event, eventTarget) {\n const pointerIndex = this.updatePointer(pointer, event, true);\n\n signals.fire('down', {\n pointer,\n event,\n eventTarget,\n pointerIndex,\n interaction: this,\n });\n }\n\n /*\\\n * Interaction.start\n [ method ]\n *\n * Start an action with the given Interactable and Element as tartgets. The\n * action must be enabled for the target Interactable and an appropriate number\n * of pointers must be held down - 1 for drag/resize, 2 for gesture.\n *\n * Use it with `interactable.able({ manualStart: false })` to always\n * [start actions manually](https://github.com/taye/interact.js/issues/114)\n *\n - action (object) The action to be performed - drag, resize, etc.\n - target (Interactable) The Interactable to target\n - element (Element) The DOM Element to target\n = (object) interact\n **\n | interact(target)\n | .draggable({\n | // disable the default drag start by down->move\n | manualStart: true\n | })\n | // start dragging after the user holds the pointer down\n | .on('hold', function (event) {\n | var interaction = event.interaction;\n |\n | if (!interaction.interacting()) {\n | interaction.start({ name: 'drag' },\n | event.interactable,\n | event.currentTarget);\n | }\n | });\n \\*/\n start (action, target, element) {\n if (this.interacting()\n || !this.pointerIsDown\n || this.pointerIds.length < (action.name === 'gesture'? 2 : 1)) {\n return;\n }\n\n // if this interaction had been removed after stopping\n // add it back\n if (utils.indexOf(scope.interactions, this) === -1) {\n scope.interactions.push(this);\n }\n\n utils.copyAction(this.prepared, action);\n this.target = target;\n this.element = element;\n\n signals.fire('action-start', {\n interaction: this,\n event: this.downEvent,\n });\n }\n\n pointerMove (pointer, event, eventTarget) {\n if (!this.simulation) {\n this.updatePointer(pointer);\n utils.setCoords(this.curCoords, this.pointers);\n }\n\n const duplicateMove = (this.curCoords.page.x === this.prevCoords.page.x\n && this.curCoords.page.y === this.prevCoords.page.y\n && this.curCoords.client.x === this.prevCoords.client.x\n && this.curCoords.client.y === this.prevCoords.client.y);\n\n let dx;\n let dy;\n\n // register movement greater than pointerMoveTolerance\n if (this.pointerIsDown && !this.pointerWasMoved) {\n dx = this.curCoords.client.x - this.startCoords.client.x;\n dy = this.curCoords.client.y - this.startCoords.client.y;\n\n this.pointerWasMoved = utils.hypot(dx, dy) > Interaction.pointerMoveTolerance;\n }\n\n const signalArg = {\n pointer,\n pointerIndex: this.getPointerIndex(pointer),\n event,\n eventTarget,\n dx,\n dy,\n duplicate: duplicateMove,\n interaction: this,\n interactingBeforeMove: this.interacting(),\n };\n\n if (!duplicateMove) {\n // set pointer coordinate, time changes and speeds\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n }\n\n signals.fire('move', signalArg);\n\n if (!duplicateMove) {\n // if interacting, fire an 'action-move' signal etc\n if (this.interacting()) {\n this.doMove(signalArg);\n }\n\n if (this.pointerWasMoved) {\n utils.copyCoords(this.prevCoords, this.curCoords);\n }\n }\n }\n\n /*\\\n * Interaction.doMove\n [ method ]\n *\n * Force a move of the current action at the same coordinates. Useful if\n * snap/restrict has been changed and you want a movement with the new\n * settings.\n *\n **\n | interact(target)\n | .draggable(true)\n | .on('dragmove', function (event) {\n | if (someCondition) {\n | // change the snap settings\n | event.interactable.draggable({ snap: { targets: [] }});\n | // fire another move event with re-calculated snap\n | event.interaction.doMove();\n | }\n | });\n \\*/\n doMove (signalArg) {\n signalArg = utils.extend({\n pointer: this.pointers[0],\n event: this.prevEvent,\n eventTarget: this._eventTarget,\n interaction: this,\n }, signalArg || {});\n\n signals.fire('before-action-move', signalArg);\n\n if (!this._dontFireMove) {\n signals.fire('action-move', signalArg);\n }\n\n this._dontFireMove = false;\n }\n\n // End interact move events and stop auto-scroll unless simulation is running\n pointerUp (pointer, event, eventTarget, curEventTarget) {\n const pointerIndex = this.getPointerIndex(pointer);\n\n signals.fire(/cancel$/i.test(event.type)? 'cancel' : 'up', {\n pointer,\n pointerIndex,\n event,\n eventTarget,\n curEventTarget,\n interaction: this,\n });\n\n if (!this.simulation) {\n this.end(event);\n }\n\n this.pointerIsDown = false;\n this.removePointer(pointer, event);\n }\n\n /*\\\n * Interaction.end\n [ method ]\n *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n - event (PointerEvent) #optional\n **\n | interact(target)\n | .draggable(true)\n | .on('move', function (event) {\n | if (event.pageX > 1000) {\n | // end the current action\n | event.interaction.end();\n | // stop all further listeners from being called\n | event.stopImmediatePropagation();\n | }\n | });\n \\*/\n end (event) {\n event = event || this.prevEvent;\n\n if (this.interacting()) {\n signals.fire('action-end', {\n event,\n interaction: this,\n });\n }\n\n this.stop();\n }\n\n currentAction () {\n return this._interacting? this.prepared.name: null;\n }\n\n interacting () {\n return this._interacting;\n }\n\n stop () {\n signals.fire('stop', { interaction: this });\n\n if (this._interacting) {\n signals.fire('stop-active', { interaction: this });\n signals.fire('stop-' + this.prepared.name, { interaction: this });\n }\n\n this.target = this.element = null;\n\n this._interacting = false;\n this.prepared.name = this.prevEvent = null;\n }\n\n getPointerIndex (pointer) {\n // mouse and pen interactions may have only one pointer\n if (this.pointerType === 'mouse' || this.pointerType === 'pen') {\n return 0;\n }\n\n return utils.indexOf(this.pointerIds, utils.getPointerId(pointer));\n }\n\n updatePointer (pointer, event, down = event && /(down|start)$/i.test(event.type)) {\n const id = utils.getPointerId(pointer);\n let index = this.getPointerIndex(pointer);\n\n if (index === -1) {\n index = this.pointerIds.length;\n this.pointerIds[index] = id;\n }\n\n if (down) {\n signals.fire('update-pointer-down', {\n pointer,\n event,\n down,\n pointerId: id,\n pointerIndex: index,\n interaction: this,\n });\n }\n\n this.pointers[index] = pointer;\n\n return index;\n }\n\n removePointer (pointer, event) {\n const index = this.getPointerIndex(pointer);\n\n if (index === -1) { return; }\n\n signals.fire('remove-pointer', {\n pointer,\n event,\n pointerIndex: index,\n interaction: this,\n });\n\n this.pointers .splice(index, 1);\n this.pointerIds .splice(index, 1);\n this.downTargets.splice(index, 1);\n this.downTimes .splice(index, 1);\n }\n\n _updateEventTargets (target, currentTarget) {\n this._eventTarget = target;\n this._curEventTarget = currentTarget;\n }\n}\n\nfor (let i = 0, len = methodNames.length; i < len; i++) {\n const method = methodNames[i];\n\n listeners[method] = doOnInteractions(method);\n}\n\nfunction doOnInteractions (method) {\n return (function (event) {\n const pointerType = utils.getPointerType(event);\n const [eventTarget, curEventTarget] = utils.getEventTargets(event);\n const matches = []; // [ [pointer, interaction], ...]\n\n if (browser.supportsTouch && /touch/.test(event.type)) {\n prevTouchTime = new Date().getTime();\n\n for (let i = 0; i < event.changedTouches.length; i++) {\n const pointer = event.changedTouches[i];\n const interaction = finder.search(pointer, event.type, eventTarget);\n\n matches.push([pointer, interaction || new Interaction({ pointerType })]);\n }\n }\n else {\n let invalidPointer = false;\n\n if (!browser.supportsPointerEvent && /mouse/.test(event.type)) {\n // ignore mouse events while touch interactions are active\n for (let i = 0; i < scope.interactions.length && !invalidPointer; i++) {\n invalidPointer = scope.interactions[i].pointerType !== 'mouse' && scope.interactions[i].pointerIsDown;\n }\n\n // try to ignore mouse events that are simulated by the browser\n // after a touch event\n invalidPointer = invalidPointer\n || (new Date().getTime() - prevTouchTime < 500)\n // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated\n || event.timeStamp === 0;\n }\n\n if (!invalidPointer) {\n let interaction = finder.search(event, event.type, eventTarget);\n\n if (!interaction) {\n interaction = new Interaction({ pointerType });\n }\n\n matches.push([event, interaction]);\n }\n }\n\n for (const [pointer, interaction] of matches) {\n interaction._updateEventTargets(eventTarget, curEventTarget);\n interaction[method](pointer, event, eventTarget, curEventTarget);\n }\n });\n}\n\nfunction endAll (event) {\n for (let i = 0; i < scope.interactions.length; i++) {\n const interaction = scope.interactions[i];\n\n interaction.end(event);\n signals.fire('endall', { event, interaction });\n }\n}\n\nconst docEvents = { /* 'eventType': listenerFunc */ };\nconst pEventTypes = browser.pEventTypes;\n\nif (domObjects.PointerEvent) {\n docEvents[pEventTypes.down ] = listeners.pointerDown;\n docEvents[pEventTypes.move ] = listeners.pointerMove;\n docEvents[pEventTypes.up ] = listeners.pointerUp;\n docEvents[pEventTypes.cancel] = listeners.pointerUp;\n}\nelse {\n docEvents.mousedown = listeners.pointerDown;\n docEvents.mousemove = listeners.pointerMove;\n docEvents.mouseup = listeners.pointerUp;\n\n docEvents.touchstart = listeners.pointerDown;\n docEvents.touchmove = listeners.pointerMove;\n docEvents.touchend = listeners.pointerUp;\n docEvents.touchcancel = listeners.pointerUp;\n}\n\ndocEvents.blur = endAll;\n\nfunction onDocSignal ({ doc }, signalName) {\n const eventMethod = signalName.indexOf('add') === 0\n ? events.add : events.remove;\n\n // delegate event listener\n for (const eventType in scope.delegatedEvents) {\n eventMethod(doc, eventType, events.delegateListener);\n eventMethod(doc, eventType, events.delegateUseCapture, true);\n }\n\n for (const eventType in docEvents) {\n eventMethod(doc, eventType, docEvents[eventType]);\n }\n}\n\nsignals.on('update-pointer-down', ({ interaction, pointer, pointerId, pointerIndex, event, eventTarget, down }) => {\n interaction.pointerIds[pointerIndex] = pointerId;\n interaction.pointers[pointerIndex] = pointer;\n\n if (down) {\n interaction.pointerIsDown = true;\n }\n\n if (!interaction.interacting()) {\n utils.setCoords(interaction.startCoords, interaction.pointers);\n\n utils.copyCoords(interaction.curCoords , interaction.startCoords);\n utils.copyCoords(interaction.prevCoords, interaction.startCoords);\n\n interaction.downEvent = event;\n interaction.downTimes[pointerIndex] = interaction.curCoords.timeStamp;\n interaction.downTargets[pointerIndex] = eventTarget || event && utils.getEventTargets(event)[0];\n interaction.pointerWasMoved = false;\n\n utils.pointerExtend(interaction.downPointer, pointer);\n }\n});\n\nscope.signals.on('add-document' , onDocSignal);\nscope.signals.on('remove-document', onDocSignal);\n\nInteraction.pointerMoveTolerance = 1;\nInteraction.doOnInteractions = doOnInteractions;\nInteraction.endAll = endAll;\nInteraction.signals = signals;\nInteraction.docEvents = docEvents;\n\nscope.endAllInteractions = endAll;\n\nmodule.exports = Interaction;\n","const Interaction = require('../Interaction');\nconst InteractEvent = require('../InteractEvent');\n\nconst actions = {\n firePrepared,\n names: [],\n methodDict: {},\n};\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n interaction._interacting = true;\n firePrepared(interaction, event, 'start');\n});\n\nInteraction.signals.on('action-move', function ({ interaction, event, preEnd }) {\n firePrepared(interaction, event, 'move', preEnd);\n\n // if the action was ended in a listener\n if (!interaction.interacting()) { return false; }\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n firePrepared(interaction, event, 'end');\n});\n\nfunction firePrepared (interaction, event, phase, preEnd) {\n const actionName = interaction.prepared.name;\n\n const newEvent = new InteractEvent(interaction, event, actionName, phase, interaction.element, null, preEnd);\n\n interaction.target.fire(newEvent);\n interaction.prevEvent = newEvent;\n}\n\nmodule.exports = actions;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drag = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n startAxis : 'xy',\n lockAxis : 'xy',\n },\n\n checker: function (pointer, event, interactable) {\n const dragOptions = interactable.options.drag;\n\n return dragOptions.enabled\n ? { name: 'drag', axis: (dragOptions.lockAxis === 'start'\n ? dragOptions.startAxis\n : dragOptions.lockAxis)}\n : null;\n },\n\n getCursor: function () {\n return 'move';\n },\n};\n\nInteraction.signals.on('before-action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n interaction.curCoords.page.y = interaction.startCoords.page.y;\n interaction.curCoords.client.y = interaction.startCoords.client.y;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vx);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vx);\n interaction.pointerDelta.client.vy = 0;\n interaction.pointerDelta.page.vy = 0;\n }\n else if (axis === 'y') {\n interaction.curCoords.page.x = interaction.startCoords.page.x;\n interaction.curCoords.client.x = interaction.startCoords.client.x;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vy);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vy);\n interaction.pointerDelta.client.vx = 0;\n interaction.pointerDelta.page.vx = 0;\n }\n});\n\n// dragmove\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'dragmove') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n iEvent.pageY = interaction.startCoords.page.y;\n iEvent.clientY = interaction.startCoords.client.y;\n iEvent.dy = 0;\n }\n else if (axis === 'y') {\n iEvent.pageX = interaction.startCoords.page.x;\n iEvent.clientX = interaction.startCoords.client.x;\n iEvent.dx = 0;\n }\n});\n\n/*\\\n * Interactable.draggable\n [ method ]\n *\n * Gets or sets whether drag actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of drag events\n | var isDraggable = interact('ul li').draggable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on drag events (object makes the Interactable draggable)\n = (object) This Interactable\n | interact(element).draggable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // the axis in which the first movement must be\n | // for the drag sequence to start\n | // 'xy' by default - any direction\n | startAxis: 'x' || 'y' || 'xy',\n |\n | // 'xy' by default - don't restrict to one axis (move in any direction)\n | // 'x' or 'y' to restrict movement to either axis\n | // 'start' to restrict movement to the axis the drag started in\n | lockAxis: 'x' || 'y' || 'xy' || 'start',\n |\n | // max number of drags that can happen concurrently\n | // with elements of this Interactable. Infinity by default\n | max: Infinity,\n |\n | // max number of drags that can target the same element+Interactable\n | // 1 by default\n | maxPerElement: 2\n | });\n\\*/\nInteractable.prototype.draggable = function (options) {\n if (utils.is.object(options)) {\n this.options.drag.enabled = options.enabled === false? false: true;\n this.setPerAction('drag', options);\n this.setOnEvents('drag', options);\n\n if (/^(xy|x|y|start)$/.test(options.lockAxis)) {\n this.options.drag.lockAxis = options.lockAxis;\n }\n if (/^(xy|x|y)$/.test(options.startAxis)) {\n this.options.drag.startAxis = options.startAxis;\n }\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drag.enabled = options;\n\n if (!options) {\n this.ondragstart = this.ondragstart = this.ondragend = null;\n }\n\n return this;\n }\n\n return this.options.drag;\n};\n\nactions.drag = drag;\nactions.names.push('drag');\nutils.merge(Interactable.eventTypes, [\n 'dragstart',\n 'dragmove',\n 'draginertiastart',\n 'draginertiaresume',\n 'dragend',\n]);\nactions.methodDict.drag = 'draggable';\n\ndefaultOptions.drag = drag.defaults;\n\nmodule.exports = drag;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst scope = require('../scope');\nconst interact = require('../interact');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drop = {\n defaults: {\n enabled: false,\n accept : null,\n overlap: 'pointer',\n },\n};\n\nlet dynamicDrop = false;\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // reset active dropzones\n interaction.activeDrops.dropzones = [];\n interaction.activeDrops.elements = [];\n interaction.activeDrops.rects = [];\n\n interaction.dropEvents = null;\n\n if (!interaction.dynamicDrop) {\n setActiveDrops(interaction, interaction.element);\n }\n\n const dragEvent = interaction.prevEvent;\n const dropEvents = getDropEvents(interaction, event, dragEvent);\n\n if (dropEvents.activate) {\n fireActiveDrops(interaction, dropEvents.activate);\n }\n});\n\nInteractEvent.signals.on('new', function ({ interaction, iEvent, event }) {\n if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { return; }\n\n const draggableElement = interaction.element;\n const dragEvent = iEvent;\n const dropResult = getDrop(dragEvent, event, draggableElement);\n\n interaction.dropTarget = dropResult.dropzone;\n interaction.dropElement = dropResult.element;\n\n interaction.dropEvents = getDropEvents(interaction, event, dragEvent);\n});\n\nInteraction.signals.on('action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n fireDropEvents(interaction, interaction.dropEvents);\n});\n\nInteraction.signals.on('action-end', function ({ interaction }) {\n if (interaction.prepared.name === 'drag') {\n fireDropEvents(interaction, interaction.dropEvents);\n }\n});\n\nInteraction.signals.on('stop-drag', function ({ interaction }) {\n interaction.activeDrops.dropzones =\n interaction.activeDrops.elements =\n interaction.activeDrops.rects =\n interaction.dropEvents = null;\n});\n\nfunction collectDrops (interaction, element) {\n const drops = [];\n const elements = [];\n\n element = element || interaction.element;\n\n // collect all dropzones and their elements which qualify for a drop\n for (const current of scope.interactables) {\n if (!current.options.drop.enabled) { continue; }\n\n const accept = current.options.drop.accept;\n\n // test the draggable element against the dropzone's accept setting\n if ((utils.is.element(accept) && accept !== element)\n || (utils.is.string(accept)\n && !utils.matchesSelector(element, accept))) {\n\n continue;\n }\n\n // query for new elements if necessary\n const dropElements = utils.is.string(current.target)\n ? current._context.querySelectorAll(current.target)\n : [current.target];\n\n for (let i = 0; i < dropElements.length; i++) {\n const currentElement = dropElements[i];\n\n if (currentElement !== element) {\n drops.push(current);\n elements.push(currentElement);\n }\n }\n }\n\n return {\n elements,\n dropzones: drops,\n };\n}\n\nfunction fireActiveDrops (interaction, event) {\n let prevElement;\n\n // loop through all active dropzones and trigger event\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n const current = interaction.activeDrops.dropzones[i];\n const currentElement = interaction.activeDrops.elements [i];\n\n // prevent trigger of duplicate events on same element\n if (currentElement !== prevElement) {\n // set current element as event target\n event.target = currentElement;\n current.fire(event);\n }\n prevElement = currentElement;\n }\n}\n\n// Collect a new set of possible drops and save them in activeDrops.\n// setActiveDrops should always be called when a drag has just started or a\n// drag event happens while dynamicDrop is true\nfunction setActiveDrops (interaction, dragElement) {\n // get dropzones and their elements that could receive the draggable\n const possibleDrops = collectDrops(interaction, dragElement, true);\n\n interaction.activeDrops.dropzones = possibleDrops.dropzones;\n interaction.activeDrops.elements = possibleDrops.elements;\n interaction.activeDrops.rects = [];\n\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n interaction.activeDrops.rects[i] =\n interaction.activeDrops.dropzones[i].getRect(interaction.activeDrops.elements[i]);\n }\n}\n\nfunction getDrop (dragEvent, event, dragElement) {\n const interaction = dragEvent.interaction;\n const validDrops = [];\n\n if (dynamicDrop) {\n setActiveDrops(interaction, dragElement);\n }\n\n // collect all dropzones and their elements which qualify for a drop\n for (let j = 0; j < interaction.activeDrops.dropzones.length; j++) {\n const current = interaction.activeDrops.dropzones[j];\n const currentElement = interaction.activeDrops.elements [j];\n const rect = interaction.activeDrops.rects [j];\n\n validDrops.push(current.dropCheck(dragEvent, event, interaction.target, dragElement, currentElement, rect)\n ? currentElement\n : null);\n }\n\n // get the most appropriate dropzone based on DOM depth and order\n const dropIndex = utils.indexOfDeepestElement(validDrops);\n\n return {\n dropzone: interaction.activeDrops.dropzones[dropIndex] || null,\n element : interaction.activeDrops.elements [dropIndex] || null,\n };\n}\n\nfunction getDropEvents (interaction, pointerEvent, dragEvent) {\n const dropEvents = {\n enter : null,\n leave : null,\n activate : null,\n deactivate: null,\n move : null,\n drop : null,\n };\n\n const tmpl = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n };\n\n if (interaction.dropElement !== interaction.prevDropElement) {\n // if there was a prevDropTarget, create a dragleave event\n if (interaction.prevDropTarget) {\n dropEvents.leave = utils.extend({ type: 'dragleave' }, tmpl);\n\n dragEvent.dragLeave = dropEvents.leave.target = interaction.prevDropElement;\n dragEvent.prevDropzone = dropEvents.leave.dropzone = interaction.prevDropTarget;\n }\n // if the dropTarget is not null, create a dragenter event\n if (interaction.dropTarget) {\n dropEvents.enter = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n type : 'dragenter',\n };\n\n dragEvent.dragEnter = interaction.dropElement;\n dragEvent.dropzone = interaction.dropTarget;\n }\n }\n\n if (dragEvent.type === 'dragend' && interaction.dropTarget) {\n dropEvents.drop = utils.extend({ type: 'drop' }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n dragEvent.relatedTarget = interaction.dropElement;\n }\n if (dragEvent.type === 'dragstart') {\n dropEvents.activate = utils.extend({ type: 'dropactivate' }, tmpl);\n\n dropEvents.activate.target = null;\n dropEvents.activate.dropzone = null;\n }\n if (dragEvent.type === 'dragend') {\n dropEvents.deactivate = utils.extend({ type: 'dropdeactivate' }, tmpl);\n\n dropEvents.deactivate.target = null;\n dropEvents.deactivate.dropzone = null;\n }\n if (dragEvent.type === 'dragmove' && interaction.dropTarget) {\n dropEvents.move = utils.extend({\n dragmove : dragEvent,\n type : 'dropmove',\n }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n }\n\n return dropEvents;\n}\n\nfunction fireDropEvents (interaction, dropEvents) {\n if (dropEvents.leave) { interaction.prevDropTarget.fire(dropEvents.leave); }\n if (dropEvents.move ) { interaction.dropTarget.fire(dropEvents.move ); }\n if (dropEvents.enter) { interaction.dropTarget.fire(dropEvents.enter); }\n if (dropEvents.drop ) { interaction.dropTarget.fire(dropEvents.drop ); }\n if (dropEvents.deactivate) {\n fireActiveDrops(interaction, dropEvents.deactivate);\n }\n\n interaction.prevDropTarget = interaction.dropTarget;\n interaction.prevDropElement = interaction.dropElement;\n}\n\n/*\\\n * Interactable.dropzone\n [ method ]\n *\n * Returns or sets whether elements can be dropped onto this\n * Interactable to trigger drop events\n *\n * Dropzones can receive the following events:\n * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends\n * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone\n * - `dragmove` when a draggable that has entered the dropzone is moved\n * - `drop` when a draggable is dropped into this dropzone\n *\n * Use the `accept` option to allow only elements that match the given CSS\n * selector or element. The value can be:\n *\n * - **an Element** - only that element can be dropped into this dropzone.\n * - **a string**, - the element being dragged must match it as a CSS selector.\n * - **`null`** - accept options is cleared - it accepts any element.\n *\n * Use the `overlap` option to set how drops are checked for. The allowed\n * values are:\n *\n * - `'pointer'`, the pointer must be over the dropzone (default)\n * - `'center'`, the draggable element's center must be over the dropzone\n * - a number from 0-1 which is the `(intersection area) / (draggable area)`.\n * e.g. `0.5` for drop to happen when half of the area of the draggable is\n * over the dropzone\n *\n * Use the `checker` option to specify a function to check if a dragged\n * element is over this Interactable.\n *\n | interact(target)\n | .dropChecker(function(dragEvent, // related dragmove or dragend event\n | event, // TouchEvent/PointerEvent/MouseEvent\n | dropped, // bool result of the default checker\n | dropzone, // dropzone Interactable\n | dropElement, // dropzone elemnt\n | draggable, // draggable Interactable\n | draggableElement) {// draggable element\n |\n | return dropped && event.target.hasAttribute('allow-drop');\n | }\n *\n *\n - options (boolean | object | null) #optional The new value to be set.\n | interact('.drop').dropzone({\n | accept: '.can-drop' || document.getElementById('single-drop'),\n | overlap: 'pointer' || 'center' || zeroToOne\n | }\n = (boolean | object) The current setting or this Interactable\n\\*/\nInteractable.prototype.dropzone = function (options) {\n if (utils.is.object(options)) {\n this.options.drop.enabled = options.enabled === false? false: true;\n\n if (utils.is.function(options.ondrop) ) { this.events.ondrop = options.ondrop ; }\n if (utils.is.function(options.ondropactivate) ) { this.events.ondropactivate = options.ondropactivate ; }\n if (utils.is.function(options.ondropdeactivate)) { this.events.ondropdeactivate = options.ondropdeactivate; }\n if (utils.is.function(options.ondragenter) ) { this.events.ondragenter = options.ondragenter ; }\n if (utils.is.function(options.ondragleave) ) { this.events.ondragleave = options.ondragleave ; }\n if (utils.is.function(options.ondropmove) ) { this.events.ondropmove = options.ondropmove ; }\n\n if (/^(pointer|center)$/.test(options.overlap)) {\n this.options.drop.overlap = options.overlap;\n }\n else if (utils.is.number(options.overlap)) {\n this.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0);\n }\n if ('accept' in options) {\n this.options.drop.accept = options.accept;\n }\n if ('checker' in options) {\n this.options.drop.checker = options.checker;\n }\n\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drop.enabled = options;\n\n if (!options) {\n this.ondragenter = this.ondragleave = this.ondrop\n = this.ondropactivate = this.ondropdeactivate = null;\n }\n\n return this;\n }\n\n return this.options.drop;\n};\n\nInteractable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) {\n let dropped = false;\n\n // if the dropzone has no rect (eg. display: none)\n // call the custom dropChecker or just return false\n if (!(rect = rect || this.getRect(dropElement))) {\n return (this.options.drop.checker\n ? this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement)\n : false);\n }\n\n const dropOverlap = this.options.drop.overlap;\n\n if (dropOverlap === 'pointer') {\n const origin = utils.getOriginXY(draggable, draggableElement, 'drag');\n const page = utils.getPageXY(dragEvent);\n\n page.x += origin.x;\n page.y += origin.y;\n\n const horizontal = (page.x > rect.left) && (page.x < rect.right);\n const vertical = (page.y > rect.top ) && (page.y < rect.bottom);\n\n dropped = horizontal && vertical;\n }\n\n const dragRect = draggable.getRect(draggableElement);\n\n if (dragRect && dropOverlap === 'center') {\n const cx = dragRect.left + dragRect.width / 2;\n const cy = dragRect.top + dragRect.height / 2;\n\n dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom;\n }\n\n if (dragRect && utils.is.number(dropOverlap)) {\n const overlapArea = (Math.max(0, Math.min(rect.right , dragRect.right ) - Math.max(rect.left, dragRect.left))\n * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top , dragRect.top )));\n\n const overlapRatio = overlapArea / (dragRect.width * dragRect.height);\n\n dropped = overlapRatio >= dropOverlap;\n }\n\n if (this.options.drop.checker) {\n dropped = this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement);\n }\n\n return dropped;\n};\n\nInteractable.signals.on('unset', function ({ interactable }) {\n interactable.dropzone(false);\n});\n\nInteractable.settingsMethods.push('dropChecker');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.dropTarget = null; // the dropzone a drag target might be dropped into\n interaction.dropElement = null; // the element at the time of checking\n interaction.prevDropTarget = null; // the dropzone that was recently dragged away from\n interaction.prevDropElement = null; // the element at the time of checking\n interaction.dropEvents = null; // the dropEvents related to the current drag event\n\n interaction.activeDrops = {\n dropzones: [], // the dropzones that are mentioned below\n elements : [], // elements of dropzones that accept the target draggable\n rects : [], // the rects of the elements mentioned above\n };\n\n});\n\nInteraction.signals.on('stop', function ({ interaction }) {\n interaction.dropTarget = interaction.dropElement =\n interaction.prevDropTarget = interaction.prevDropElement = null;\n});\n\n/*\\\n * interact.dynamicDrop\n [ method ]\n *\n * Returns or sets whether the dimensions of dropzone elements are\n * calculated on every dragmove or only on dragstart for the default\n * dropChecker\n *\n - newValue (boolean) #optional True to check on each move. False to check only before start\n = (boolean | interact) The current setting or interact\n\\*/\ninteract.dynamicDrop = function (newValue) {\n if (utils.is.bool(newValue)) {\n //if (dragging && dynamicDrop !== newValue && !newValue) {\n //calcRects(dropzones);\n //}\n\n dynamicDrop = newValue;\n\n return interact;\n }\n return dynamicDrop;\n};\n\nutils.merge(Interactable.eventTypes, [\n 'dragenter',\n 'dragleave',\n 'dropactivate',\n 'dropdeactivate',\n 'dropmove',\n 'drop',\n]);\nactions.methodDict.drop = 'dropzone';\n\ndefaultOptions.drop = drop.defaults;\n\nmodule.exports = drop;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst gesture = {\n defaults: {\n enabled : false,\n origin : null,\n restrict: null,\n },\n\n checker: function (pointer, event, interactable, element, interaction) {\n if (interaction.pointerIds.length >= 2) {\n return { name: 'gesture' };\n }\n\n return null;\n },\n\n getCursor: function () {\n return '';\n },\n};\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturestart') { return; }\n iEvent.ds = 0;\n\n interaction.gesture.startDistance = interaction.gesture.prevDistance = iEvent.distance;\n interaction.gesture.startAngle = interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.scale = 1;\n});\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturemove') { return; }\n\n iEvent.ds = iEvent.scale - interaction.gesture.scale;\n\n interaction.target.fire(iEvent);\n\n interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.prevDistance = iEvent.distance;\n\n if (iEvent.scale !== Infinity\n && iEvent.scale !== null\n && iEvent.scale !== undefined\n && !isNaN(iEvent.scale)) {\n\n interaction.gesture.scale = iEvent.scale;\n }\n});\n\n/*\\\n * Interactable.gesturable\n [ method ]\n *\n * Gets or sets whether multitouch gestures can be performed on the\n * Interactable's element\n *\n = (boolean) Indicates if this can be the target of gesture events\n | var isGestureable = interact(element).gesturable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on gesture events (makes the Interactable gesturable)\n = (object) this Interactable\n | interact(element).gesturable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // limit multiple gestures.\n | // See the explanation in @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n\\*/\nInteractable.prototype.gesturable = function (options) {\n if (utils.is.object(options)) {\n this.options.gesture.enabled = options.enabled === false? false: true;\n this.setPerAction('gesture', options);\n this.setOnEvents('gesture', options);\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.gesture.enabled = options;\n\n if (!options) {\n this.ongesturestart = this.ongesturestart = this.ongestureend = null;\n }\n\n return this;\n }\n\n return this.options.gesture;\n};\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action, event, starting, ending, deltaSource }) {\n if (action !== 'gesture') { return; }\n\n const pointers = interaction.pointers;\n\n iEvent.touches = [pointers[0], pointers[1]];\n\n if (starting) {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = 1;\n iEvent.ds = 0;\n iEvent.angle = utils.touchAngle(pointers, undefined, deltaSource);\n iEvent.da = 0;\n }\n else if (ending || event instanceof InteractEvent) {\n iEvent.distance = interaction.prevEvent.distance;\n iEvent.box = interaction.prevEvent.box;\n iEvent.scale = interaction.prevEvent.scale;\n iEvent.ds = iEvent.scale - 1;\n iEvent.angle = interaction.prevEvent.angle;\n iEvent.da = iEvent.angle - interaction.gesture.startAngle;\n }\n else {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = iEvent.distance / interaction.gesture.startDistance;\n iEvent.angle = utils.touchAngle(pointers, interaction.gesture.prevAngle, deltaSource);\n\n iEvent.ds = iEvent.scale - interaction.gesture.prevScale;\n iEvent.da = iEvent.angle - interaction.gesture.prevAngle;\n }\n});\n\nInteraction.signals.on('new', function (interaction) {\n interaction.gesture = {\n start: { x: 0, y: 0 },\n\n startDistance: 0, // distance between two touches of touchStart\n prevDistance : 0,\n distance : 0,\n\n scale: 1, // gesture.distance / gesture.startDistance\n\n startAngle: 0, // angle of line joining two touches\n prevAngle : 0, // angle of the previous gesture event\n };\n});\n\nactions.gesture = gesture;\nactions.names.push('gesture');\nutils.merge(Interactable.eventTypes, [\n 'gesturestart',\n 'gesturemove',\n 'gestureend',\n]);\nactions.methodDict.gesture = 'gesturable';\n\ndefaultOptions.gesture = gesture.defaults;\n\nmodule.exports = gesture;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\n// Less Precision with touch input\nconst defaultMargin = browser.supportsTouch || browser.supportsPointerEvent? 20: 10;\n\nconst resize = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n square: false,\n preserveAspectRatio: false,\n axis: 'xy',\n\n // use default margin\n margin: NaN,\n\n // object with props left, right, top, bottom which are\n // true/false values to resize when the pointer is over that edge,\n // CSS selectors to match the handles for each direction\n // or the Elements for each handle\n edges: null,\n\n // a value of 'none' will limit the resize rect to a minimum of 0x0\n // 'negate' will alow the rect to have negative width/height\n // 'reposition' will keep the width/height positive by swapping\n // the top and bottom edges and/or swapping the left and right edges\n invert: 'none',\n },\n\n checker: function (pointer, event, interactable, element, interaction, rect) {\n if (!rect) { return null; }\n\n const page = utils.extend({}, interaction.curCoords.page);\n const options = interactable.options;\n\n if (options.resize.enabled) {\n const resizeOptions = options.resize;\n const resizeEdges = { left: false, right: false, top: false, bottom: false };\n\n // if using resize.edges\n if (utils.is.object(resizeOptions.edges)) {\n for (const edge in resizeEdges) {\n resizeEdges[edge] = checkResizeEdge(edge,\n resizeOptions.edges[edge],\n page,\n interaction._eventTarget,\n element,\n rect,\n resizeOptions.margin || defaultMargin);\n }\n\n resizeEdges.left = resizeEdges.left && !resizeEdges.right;\n resizeEdges.top = resizeEdges.top && !resizeEdges.bottom;\n\n if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) {\n return {\n name: 'resize',\n edges: resizeEdges,\n };\n }\n }\n else {\n const right = options.resize.axis !== 'y' && page.x > (rect.right - defaultMargin);\n const bottom = options.resize.axis !== 'x' && page.y > (rect.bottom - defaultMargin);\n\n if (right || bottom) {\n return {\n name: 'resize',\n axes: (right? 'x' : '') + (bottom? 'y' : ''),\n };\n }\n }\n }\n\n return null;\n },\n\n cursors: (browser.isIe9OrOlder ? {\n x : 'e-resize',\n y : 's-resize',\n xy: 'se-resize',\n\n top : 'n-resize',\n left : 'w-resize',\n bottom : 's-resize',\n right : 'e-resize',\n topleft : 'se-resize',\n bottomright: 'se-resize',\n topright : 'ne-resize',\n bottomleft : 'ne-resize',\n } : {\n x : 'ew-resize',\n y : 'ns-resize',\n xy: 'nwse-resize',\n\n top : 'ns-resize',\n left : 'ew-resize',\n bottom : 'ns-resize',\n right : 'ew-resize',\n topleft : 'nwse-resize',\n bottomright: 'nwse-resize',\n topright : 'nesw-resize',\n bottomleft : 'nesw-resize',\n }),\n\n getCursor: function (action) {\n if (action.axis) {\n return resize.cursors[action.name + action.axis];\n }\n else if (action.edges) {\n let cursorKey = '';\n const edgeNames = ['top', 'bottom', 'left', 'right'];\n\n for (let i = 0; i < 4; i++) {\n if (action.edges[edgeNames[i]]) {\n cursorKey += edgeNames[i];\n }\n }\n\n return resize.cursors[cursorKey];\n }\n },\n};\n\n// resizestart\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'resizestart' || !interaction.prepared.edges) {\n return;\n }\n\n const startRect = interaction.target.getRect(interaction.element);\n const resizeOptions = interaction.target.options.resize;\n\n /*\n * When using the `resizable.square` or `resizable.preserveAspectRatio` options, resizing from one edge\n * will affect another. E.g. with `resizable.square`, resizing to make the right edge larger will make\n * the bottom edge larger by the same amount. We call these 'linked' edges. Any linked edges will depend\n * on the active edges and the edge being interacted with.\n */\n if (resizeOptions.square || resizeOptions.preserveAspectRatio) {\n const linkedEdges = utils.extend({}, interaction.prepared.edges);\n\n linkedEdges.top = linkedEdges.top || (linkedEdges.left && !linkedEdges.bottom);\n linkedEdges.left = linkedEdges.left || (linkedEdges.top && !linkedEdges.right );\n linkedEdges.bottom = linkedEdges.bottom || (linkedEdges.right && !linkedEdges.top );\n linkedEdges.right = linkedEdges.right || (linkedEdges.bottom && !linkedEdges.left );\n\n interaction.prepared._linkedEdges = linkedEdges;\n }\n else {\n interaction.prepared._linkedEdges = null;\n }\n\n // if using `resizable.preserveAspectRatio` option, record aspect ratio at the start of the resize\n if (resizeOptions.preserveAspectRatio) {\n interaction.resizeStartAspectRatio = startRect.width / startRect.height;\n }\n\n interaction.resizeRects = {\n start : startRect,\n current : utils.extend({}, startRect),\n inverted : utils.extend({}, startRect),\n previous : utils.extend({}, startRect),\n delta : {\n left: 0, right : 0, width : 0,\n top : 0, bottom: 0, height: 0,\n },\n };\n\n iEvent.rect = interaction.resizeRects.inverted;\n iEvent.deltaRect = interaction.resizeRects.delta;\n});\n\n// resizemove\nInteractEvent.signals.on('new', function ({ iEvent, phase, interaction }) {\n if (phase !== 'move' || !interaction.prepared.edges) { return; }\n\n const resizeOptions = interaction.target.options.resize;\n const invert = resizeOptions.invert;\n const invertible = invert === 'reposition' || invert === 'negate';\n\n let edges = interaction.prepared.edges;\n\n const start = interaction.resizeRects.start;\n const current = interaction.resizeRects.current;\n const inverted = interaction.resizeRects.inverted;\n const delta = interaction.resizeRects.delta;\n const previous = utils.extend(interaction.resizeRects.previous, inverted);\n const originalEdges = edges;\n\n let dx = iEvent.dx;\n let dy = iEvent.dy;\n\n if (resizeOptions.preserveAspectRatio || resizeOptions.square) {\n // `resize.preserveAspectRatio` takes precedence over `resize.square`\n const startAspectRatio = resizeOptions.preserveAspectRatio\n ? interaction.resizeStartAspectRatio\n : 1;\n\n edges = interaction.prepared._linkedEdges;\n\n if ((originalEdges.left && originalEdges.bottom)\n || (originalEdges.right && originalEdges.top)) {\n dy = -dx / startAspectRatio;\n }\n else if (originalEdges.left || originalEdges.right ) { dy = dx / startAspectRatio; }\n else if (originalEdges.top || originalEdges.bottom) { dx = dy * startAspectRatio; }\n }\n\n // update the 'current' rect without modifications\n if (edges.top ) { current.top += dy; }\n if (edges.bottom) { current.bottom += dy; }\n if (edges.left ) { current.left += dx; }\n if (edges.right ) { current.right += dx; }\n\n if (invertible) {\n // if invertible, copy the current rect\n utils.extend(inverted, current);\n\n if (invert === 'reposition') {\n // swap edge values if necessary to keep width/height positive\n let swap;\n\n if (inverted.top > inverted.bottom) {\n swap = inverted.top;\n\n inverted.top = inverted.bottom;\n inverted.bottom = swap;\n }\n if (inverted.left > inverted.right) {\n swap = inverted.left;\n\n inverted.left = inverted.right;\n inverted.right = swap;\n }\n }\n }\n else {\n // if not invertible, restrict to minimum of 0x0 rect\n inverted.top = Math.min(current.top, start.bottom);\n inverted.bottom = Math.max(current.bottom, start.top);\n inverted.left = Math.min(current.left, start.right);\n inverted.right = Math.max(current.right, start.left);\n }\n\n inverted.width = inverted.right - inverted.left;\n inverted.height = inverted.bottom - inverted.top ;\n\n for (const edge in inverted) {\n delta[edge] = inverted[edge] - previous[edge];\n }\n\n iEvent.edges = interaction.prepared.edges;\n iEvent.rect = inverted;\n iEvent.deltaRect = delta;\n});\n\n/*\\\n * Interactable.resizable\n [ method ]\n *\n * Gets or sets whether resize actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of resize elements\n | var isResizeable = interact('input[type=text]').resizable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on resize events (object makes the Interactable resizable)\n = (object) This Interactable\n | interact(element).resizable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | edges: {\n | top : true, // Use pointer coords to check for resize.\n | left : false, // Disable resizing from left edge.\n | bottom: '.resize-s',// Resize if pointer target matches selector\n | right : handleEl // Resize if pointer target is the given Element\n | },\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height are adjusted at a 1:1 ratio.\n | square: false,\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height maintain the aspect ratio they had when resizing started.\n | preserveAspectRatio: false,\n |\n | // a value of 'none' will limit the resize rect to a minimum of 0x0\n | // 'negate' will allow the rect to have negative width/height\n | // 'reposition' will keep the width/height positive by swapping\n | // the top and bottom edges and/or swapping the left and right edges\n | invert: 'none' || 'negate' || 'reposition'\n |\n | // limit multiple resizes.\n | // See the explanation in the @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n \\*/\nInteractable.prototype.resizable = function (options) {\n if (utils.is.object(options)) {\n this.options.resize.enabled = options.enabled === false? false: true;\n this.setPerAction('resize', options);\n this.setOnEvents('resize', options);\n\n if (/^x$|^y$|^xy$/.test(options.axis)) {\n this.options.resize.axis = options.axis;\n }\n else if (options.axis === null) {\n this.options.resize.axis = defaultOptions.resize.axis;\n }\n\n if (utils.is.bool(options.preserveAspectRatio)) {\n this.options.resize.preserveAspectRatio = options.preserveAspectRatio;\n }\n else if (utils.is.bool(options.square)) {\n this.options.resize.square = options.square;\n }\n\n return this;\n }\n if (utils.is.bool(options)) {\n this.options.resize.enabled = options;\n\n if (!options) {\n this.onresizestart = this.onresizestart = this.onresizeend = null;\n }\n\n return this;\n }\n return this.options.resize;\n};\n\nfunction checkResizeEdge (name, value, page, element, interactableElement, rect, margin) {\n // false, '', undefined, null\n if (!value) { return false; }\n\n // true value, use pointer coords and element rect\n if (value === true) {\n // if dimensions are negative, \"switch\" edges\n const width = utils.is.number(rect.width )? rect.width : rect.right - rect.left;\n const height = utils.is.number(rect.height)? rect.height : rect.bottom - rect.top ;\n\n if (width < 0) {\n if (name === 'left' ) { name = 'right'; }\n else if (name === 'right') { name = 'left' ; }\n }\n if (height < 0) {\n if (name === 'top' ) { name = 'bottom'; }\n else if (name === 'bottom') { name = 'top' ; }\n }\n\n if (name === 'left' ) { return page.x < ((width >= 0? rect.left: rect.right ) + margin); }\n if (name === 'top' ) { return page.y < ((height >= 0? rect.top : rect.bottom) + margin); }\n\n if (name === 'right' ) { return page.x > ((width >= 0? rect.right : rect.left) - margin); }\n if (name === 'bottom') { return page.y > ((height >= 0? rect.bottom: rect.top ) - margin); }\n }\n\n // the remaining checks require an element\n if (!utils.is.element(element)) { return false; }\n\n return utils.is.element(value)\n // the value is an element to use as a resize handle\n ? value === element\n // otherwise check if element matches value as selector\n : utils.matchesUpTo(element, value, interactableElement);\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.resizeAxes = 'xy';\n});\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action }) {\n if (action !== 'resize' || !interaction.resizeAxes) { return; }\n\n const options = interaction.target.options;\n\n if (options.resize.square) {\n if (interaction.resizeAxes === 'y') {\n iEvent.dx = iEvent.dy;\n }\n else {\n iEvent.dy = iEvent.dx;\n }\n iEvent.axes = 'xy';\n }\n else {\n iEvent.axes = interaction.resizeAxes;\n\n if (interaction.resizeAxes === 'x') {\n iEvent.dy = 0;\n }\n else if (interaction.resizeAxes === 'y') {\n iEvent.dx = 0;\n }\n }\n});\n\nactions.resize = resize;\nactions.names.push('resize');\nutils.merge(Interactable.eventTypes, [\n 'resizestart',\n 'resizemove',\n 'resizeinertiastart',\n 'resizeinertiaresume',\n 'resizeend',\n]);\nactions.methodDict.resize = 'resizable';\n\ndefaultOptions.resize = resize.defaults;\n\nmodule.exports = resize;\n","const raf = require('./utils/raf');\nconst getWindow = require('./utils/window').getWindow;\nconst is = require('./utils/is');\nconst domUtils = require('./utils/domUtils');\nconst Interaction = require('./Interaction');\nconst defaultOptions = require('./defaultOptions');\n\nconst autoScroll = {\n defaults: {\n enabled : false,\n container: null, // the item that is scrolled (Window or HTMLElement)\n margin : 60,\n speed : 300, // the scroll speed in pixels per second\n },\n\n interaction: null,\n i: null, // the handle returned by window.setInterval\n x: 0, y: 0, // Direction each pulse is to scroll in\n\n isScrolling: false,\n prevTime: 0,\n\n start: function (interaction) {\n autoScroll.isScrolling = true;\n raf.cancel(autoScroll.i);\n\n autoScroll.interaction = interaction;\n autoScroll.prevTime = new Date().getTime();\n autoScroll.i = raf.request(autoScroll.scroll);\n },\n\n stop: function () {\n autoScroll.isScrolling = false;\n raf.cancel(autoScroll.i);\n },\n\n // scroll the window by the values in scroll.x/y\n scroll: function () {\n const options = autoScroll.interaction.target.options[autoScroll.interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(autoScroll.interaction.element);\n const now = new Date().getTime();\n // change in time in seconds\n const dt = (now - autoScroll.prevTime) / 1000;\n // displacement\n const s = options.speed * dt;\n\n if (s >= 1) {\n if (is.window(container)) {\n container.scrollBy(autoScroll.x * s, autoScroll.y * s);\n }\n else if (container) {\n container.scrollLeft += autoScroll.x * s;\n container.scrollTop += autoScroll.y * s;\n }\n\n autoScroll.prevTime = now;\n }\n\n if (autoScroll.isScrolling) {\n raf.cancel(autoScroll.i);\n autoScroll.i = raf.request(autoScroll.scroll);\n }\n },\n check: function (interactable, actionName) {\n const options = interactable.options;\n\n return options[actionName].autoScroll && options[actionName].autoScroll.enabled;\n },\n onInteractionMove: function ({ interaction, pointer }) {\n if (!(interaction.interacting()\n && autoScroll.check(interaction.target, interaction.prepared.name))) {\n return;\n }\n\n if (interaction.simulation) {\n autoScroll.x = autoScroll.y = 0;\n return;\n }\n\n let top;\n let right;\n let bottom;\n let left;\n\n const options = interaction.target.options[interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(interaction.element);\n\n if (is.window(container)) {\n left = pointer.clientX < autoScroll.margin;\n top = pointer.clientY < autoScroll.margin;\n right = pointer.clientX > container.innerWidth - autoScroll.margin;\n bottom = pointer.clientY > container.innerHeight - autoScroll.margin;\n }\n else {\n const rect = domUtils.getElementClientRect(container);\n\n left = pointer.clientX < rect.left + autoScroll.margin;\n top = pointer.clientY < rect.top + autoScroll.margin;\n right = pointer.clientX > rect.right - autoScroll.margin;\n bottom = pointer.clientY > rect.bottom - autoScroll.margin;\n }\n\n autoScroll.x = (right ? 1: left? -1: 0);\n autoScroll.y = (bottom? 1: top? -1: 0);\n\n if (!autoScroll.isScrolling) {\n // set the autoScroll properties to those of the target\n autoScroll.margin = options.margin;\n autoScroll.speed = options.speed;\n\n autoScroll.start(interaction);\n }\n },\n};\n\nInteraction.signals.on('stop-active', function () {\n autoScroll.stop();\n});\n\nInteraction.signals.on('action-move', autoScroll.onInteractionMove);\n\ndefaultOptions.perAction.autoScroll = autoScroll.defaults;\n\nmodule.exports = autoScroll;\n","const Interactable = require('../Interactable');\nconst actions = require('../actions/base');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.ignoreFrom\n [ method ]\n *\n * If the target of the `mousedown`, `pointerdown` or `touchstart`\n * event or any of it's parents match the given CSS selector or\n * Element, no drag/resize/gesture is started.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to not ignore any elements\n = (string | Element | object) The current ignoreFrom value or this Interactable\n **\n | interact(element, { ignoreFrom: document.getElementById('no-action') });\n | // or\n | interact(element).ignoreFrom('input, textarea, a');\n\\*/\nInteractable.prototype.ignoreFrom = function (newValue) {\n return this._backCompatOption('ignoreFrom', newValue);\n};\n\n/*\\\n * Interactable.allowFrom\n [ method ]\n *\n * A drag/resize/gesture is started only If the target of the\n * `mousedown`, `pointerdown` or `touchstart` event or any of it's\n * parents match the given CSS selector or Element.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to allow from any element\n = (string | Element | object) The current allowFrom value or this Interactable\n **\n | interact(element, { allowFrom: document.getElementById('drag-handle') });\n | // or\n | interact(element).allowFrom('.handle');\n\\*/\nInteractable.prototype.allowFrom = function (newValue) {\n return this._backCompatOption('allowFrom', newValue);\n};\n\nInteractable.prototype.testIgnore = function (ignoreFrom, interactableElement, element) {\n if (!ignoreFrom || !is.element(element)) { return false; }\n\n if (is.string(ignoreFrom)) {\n return domUtils.matchesUpTo(element, ignoreFrom, interactableElement);\n }\n else if (is.element(ignoreFrom)) {\n return domUtils.nodeContains(ignoreFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testAllow = function (allowFrom, interactableElement, element) {\n if (!allowFrom) { return true; }\n\n if (!is.element(element)) { return false; }\n\n if (is.string(allowFrom)) {\n return domUtils.matchesUpTo(element, allowFrom, interactableElement);\n }\n else if (is.element(allowFrom)) {\n return domUtils.nodeContains(allowFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testIgnoreAllow = function (options, interactableElement, eventTarget) {\n return (!this.testIgnore(options.ignoreFrom, interactableElement, eventTarget)\n && this.testAllow(options.allowFrom, interactableElement, eventTarget));\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (event.buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\n","const interact = require('../interact');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst actions = require('../actions/base');\nconst defaultOptions = require('../defaultOptions');\nconst browser = require('../utils/browser');\nconst scope = require('../scope');\nconst utils = require('../utils');\nconst signals = require('../utils/Signals').new();\n\nrequire('./InteractableMethods');\n\nconst autoStart = {\n signals,\n withinInteractionLimit,\n // Allow this many interactions to happen simultaneously\n maxInteractions: Infinity,\n defaults: {\n perAction: {\n manualStart: false,\n max: Infinity,\n maxPerElement: 1,\n allowFrom: null,\n ignoreFrom: null,\n },\n },\n setActionDefaults: function (action) {\n utils.extend(action.defaults, autoStart.defaults.perAction);\n },\n};\n\n// set cursor style on mousedown\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget }) {\n if (interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\n// set cursor style on mousemove\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget }) {\n if (!interaction.mouse\n || interaction.pointerIsDown\n || interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\nInteraction.signals.on('move', function (arg) {\n const { interaction, event } = arg;\n\n if (!interaction.pointerIsDown\n || interaction.interacting()\n || !interaction.pointerWasMoved\n || !interaction.prepared.name) {\n return;\n }\n\n signals.fire('before-start', arg);\n\n const target = interaction.target;\n\n if (interaction.prepared.name && target) {\n // check manualStart and interaction limit\n if (target.options[interaction.prepared.name].manualStart\n || !withinInteractionLimit(target, interaction.element, interaction.prepared)) {\n interaction.stop(event);\n }\n else {\n interaction.start(interaction.prepared, target, interaction.element);\n }\n }\n});\n\n// Check if the current target supports the action.\n// If so, return the validated action. Otherwise, return null\nfunction validateAction (action, interactable, element, eventTarget) {\n if (utils.is.object(action)\n && interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget)\n && interactable.options[action.name].enabled\n && withinInteractionLimit(interactable, element, action)) {\n return action;\n }\n\n return null;\n}\n\nfunction validateSelector (interaction, pointer, event, matches, matchElements, eventTarget) {\n for (let i = 0, len = matches.length; i < len; i++) {\n const match = matches[i];\n const matchElement = matchElements[i];\n const action = validateAction(match.getAction(pointer, event, interaction, matchElement),\n match,\n matchElement,\n eventTarget);\n\n if (action) {\n return {\n action,\n target: match,\n element: matchElement,\n };\n }\n }\n\n return {};\n}\n\nfunction getActionInfo (interaction, pointer, event, eventTarget) {\n let matches = [];\n let matchElements = [];\n\n let element = eventTarget;\n let action = null;\n\n function pushMatches (interactable, selector, context) {\n const elements = (browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined);\n\n if (utils.matchesSelector(element, selector, elements)) {\n\n matches.push(interactable);\n matchElements.push(element);\n }\n }\n\n while (utils.is.element(element)) {\n matches = [];\n matchElements = [];\n\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && (action = validateAction(elementInteractable.getAction(pointer, event, interaction, element, eventTarget),\n elementInteractable,\n element,\n eventTarget))\n && !elementInteractable.options[action.name].manualStart) {\n return {\n element,\n action,\n target: elementInteractable,\n };\n }\n else {\n scope.interactables.forEachSelector(pushMatches, element);\n\n const actionInfo = validateSelector(interaction, pointer, event, matches, matchElements, eventTarget);\n\n if (actionInfo.action\n && !actionInfo.target.options[actionInfo.action.name].manualStart) {\n return actionInfo;\n }\n }\n\n element = utils.parentNode(element);\n }\n\n return {};\n}\n\nfunction prepare (interaction, { action, target, element }) {\n action = action || {};\n\n if (interaction.target && interaction.target.options.styleCursor) {\n interaction.target._doc.documentElement.style.cursor = '';\n }\n\n interaction.target = target;\n interaction.element = element;\n utils.copyAction(interaction.prepared, action);\n\n if (target && target.options.styleCursor) {\n const cursor = action? actions[action.name].getCursor(action) : '';\n interaction.target._doc.documentElement.style.cursor = cursor;\n }\n\n signals.fire('prepared', { interaction: interaction });\n}\n\nInteraction.signals.on('stop', function ({ interaction }) {\n const target = interaction.target;\n\n if (target && target.options.styleCursor) {\n target._doc.documentElement.style.cursor = '';\n }\n});\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (utils.is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (utils.is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n const buttons = event.buttons || ({\n 0: 1,\n 1: 4,\n 3: 8,\n 4: 16,\n })[event.button];\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\nfunction withinInteractionLimit (interactable, element, action) {\n const options = interactable.options;\n const maxActions = options[action.name].max;\n const maxPerElement = options[action.name].maxPerElement;\n let activeInteractions = 0;\n let targetCount = 0;\n let targetElementCount = 0;\n\n // no actions if any of these values == 0\n if (!(maxActions && maxPerElement && autoStart.maxInteractions)) { return; }\n\n for (let i = 0, len = scope.interactions.length; i < len; i++) {\n const interaction = scope.interactions[i];\n const otherAction = interaction.prepared.name;\n\n if (!interaction.interacting()) { continue; }\n\n activeInteractions++;\n\n if (activeInteractions >= autoStart.maxInteractions) {\n return false;\n }\n\n if (interaction.target !== interactable) { continue; }\n\n targetCount += (otherAction === action.name)|0;\n\n if (targetCount >= maxActions) {\n return false;\n }\n\n if (interaction.element === element) {\n targetElementCount++;\n\n if (otherAction !== action.name || targetElementCount >= maxPerElement) {\n return false;\n }\n }\n }\n\n return autoStart.maxInteractions > 0;\n}\n\n/*\\\n * interact.maxInteractions\n [ method ]\n **\n * Returns or sets the maximum number of concurrent interactions allowed.\n * By default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables\n * and elements, you need to enable it in the draggable, resizable and\n * gesturable `'max'` and `'maxPerElement'` options.\n **\n - newValue (number) #optional Any number. newValue <= 0 means no interactions.\n\\*/\ninteract.maxInteractions = function (newValue) {\n if (utils.is.number(newValue)) {\n autoStart.maxInteractions = newValue;\n\n return this;\n }\n\n return autoStart.maxInteractions;\n};\n\nInteractable.settingsMethods.push('styleCursor');\nInteractable.settingsMethods.push('actionChecker');\nInteractable.settingsMethods.push('ignoreFrom');\nInteractable.settingsMethods.push('allowFrom');\n\ndefaultOptions.base.actionChecker = null;\ndefaultOptions.base.styleCursor = true;\n\nutils.extend(defaultOptions.perAction, autoStart.defaults.perAction);\n\nmodule.exports = autoStart;\n","const autoStart = require('./base');\nconst Interaction = require('../Interaction');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.delayTimer = null;\n});\n\nautoStart.signals.on('prepared', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.delayTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.target, interaction.element);\n }, delay);\n }\n});\n\nInteraction.signals.on('move', function ({ interaction, duplicate }) {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.delayTimer);\n }\n});\n\n// prevent regular down->move autoStart\nautoStart.signals.on('before-start', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.prepared.name = null;\n }\n});\n","const autoStart = require('./base');\nconst scope = require('../scope');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\n\nconst { matchesSelector, parentNode } = require('../utils/domUtils');\n\nautoStart.setActionDefaults(require('../actions/drag'));\n\nautoStart.signals.on('before-start', function ({ interaction, eventTarget, dx, dy }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // check if a drag is in the correct axis\n const absX = Math.abs(dx);\n const absY = Math.abs(dy);\n const options = interaction.target.options.drag;\n const startAxis = options.startAxis;\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy');\n\n interaction.prepared.axis = options.lockAxis === 'start'\n ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n : options.lockAxis;\n\n // if the movement isn't in the startAxis of the interactable\n if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) {\n // cancel the prepared action\n interaction.prepared.name = null;\n\n // then try to get a drag from another ineractable\n\n if (!interaction.prepared.name) {\n\n let element = eventTarget;\n\n const getDraggable = function (interactable, selector, context) {\n const elements = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n if (interactable === interaction.target) { return; }\n\n if (!options.manualStart\n && !interactable.testIgnoreAllow(options, element, eventTarget)\n && matchesSelector(element, selector, elements)) {\n\n const action = interactable.getAction(interaction.downPointer,\n interaction.downEvent,\n interaction,\n element);\n\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, interactable)\n && autoStart.validateAction(action, interactable, element, eventTarget)) {\n\n return interactable;\n }\n }\n };\n\n let action = null;\n\n // check all interactables\n while (is.element(element)) {\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && elementInteractable !== interaction.target\n && !elementInteractable.options.drag.manualStart) {\n\n action = elementInteractable.getAction(interaction.downPointer, interaction.downEvent, interaction, element);\n }\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, elementInteractable)) {\n\n interaction.prepared.name = 'drag';\n interaction.target = elementInteractable;\n interaction.element = element;\n break;\n }\n\n const selectorInteractable = scope.interactables.forEachSelector(getDraggable, element);\n\n if (selectorInteractable) {\n interaction.prepared.name = 'drag';\n interaction.target = selectorInteractable;\n interaction.element = element;\n break;\n }\n\n element = parentNode(element);\n }\n }\n }\n});\n\nfunction checkStartAxis (startAxis, interactable) {\n if (!interactable) { return false; }\n\n const thisAxis = interactable.options.drag.startAxis;\n\n return (startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis);\n}\n","require('./base').setActionDefaults(require('../actions/gesture'));\n","require('./base').setActionDefaults(require('../actions/resize'));\n","module.exports = {\n base: {\n accept : null,\n preventDefault: 'auto',\n deltaSource : 'page',\n },\n\n perAction: {\n origin: { x: 0, y: 0 },\n\n // only allow left button by default\n // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n mouseButtons: 1,\n\n inertia: {\n enabled : false,\n resistance : 10, // the lambda in exponential decay\n minSpeed : 100, // target speed must be above this for inertia to start\n endSpeed : 10, // the speed at which inertia is slow enough to stop\n allowResume : true, // allow resuming an action in inertia phase\n smoothEndDuration: 300, // animate to snap/restrict endOnly if there's no inertia\n },\n },\n};\n","/* browser entry point */\n\n// Legacy browser support\nrequire('./legacyBrowsers');\n\n// inertia\nrequire('./inertia');\n\n// modifiers\nrequire('./modifiers/snap');\nrequire('./modifiers/restrict');\n\n// pointerEvents\nrequire('./pointerEvents/base');\nrequire('./pointerEvents/holdRepeat');\nrequire('./pointerEvents/interactableTargets');\n\n// delay\nrequire('./autoStart/delay');\n\n// actions\nrequire('./actions/gesture');\nrequire('./actions/resize');\nrequire('./actions/drag');\nrequire('./actions/drop');\n\n// load these modifiers after resize is loaded\nrequire('./modifiers/snapSize');\nrequire('./modifiers/restrictEdges');\nrequire('./modifiers/restrictSize');\n\n// autoStart actions\nrequire('./autoStart/gesture');\nrequire('./autoStart/resize');\nrequire('./autoStart/drag');\n\n// Interactable preventDefault setting\nrequire('./interactablePreventDefault.js');\n\n// autoScroll\nrequire('./autoScroll');\n\n// export interact\nmodule.exports = require('./interact');\n","const InteractEvent = require('./InteractEvent');\nconst Interaction = require('./Interaction');\nconst modifiers = require('./modifiers');\nconst utils = require('./utils');\nconst animationFrame = require('./utils/raf');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.inertiaStatus = {\n active : false,\n smoothEnd : false,\n allowResume: false,\n\n startEvent: null,\n upCoords : {},\n\n xe: 0, ye: 0,\n sx: 0, sy: 0,\n\n t0: 0,\n vx0: 0, vys: 0,\n duration: 0,\n\n lambda_v0: 0,\n one_ve_v0: 0,\n i : null,\n };\n\n interaction.boundInertiaFrame = () => inertiaFrame .apply(interaction);\n interaction.boundSmoothEndFrame = () => smoothEndFrame.apply(interaction);\n});\n\nInteraction.signals.on('down', function ({ interaction, event, pointer, eventTarget }) {\n const status = interaction.inertiaStatus;\n\n // Check if the down event hits the current inertia target\n if (status.active) {\n let element = eventTarget;\n\n // climb up the DOM tree from the event target\n while (utils.is.element(element)) {\n\n // if interaction element is the current inertia target element\n if (element === interaction.element) {\n // stop inertia\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n\n // update pointers to the down event's coordinates\n interaction.updatePointer(pointer);\n utils.setCoords(interaction.curCoords, interaction.pointers);\n\n // fire appropriate signals\n const signalArg = { interaction };\n Interaction.signals.fire('before-action-move', signalArg);\n Interaction.signals.fire('action-resume' , signalArg);\n\n // fire a reume event\n const resumeEvent = new InteractEvent(interaction,\n event,\n interaction.prepared.name,\n 'inertiaresume',\n interaction.element);\n\n interaction.target.fire(resumeEvent);\n interaction.prevEvent = resumeEvent;\n modifiers.resetStatuses(interaction.modifierStatuses);\n\n utils.copyCoords(interaction.prevCoords, interaction.curCoords);\n break;\n }\n\n element = utils.parentNode(element);\n }\n }\n});\n\nInteraction.signals.on('up', function ({ interaction, event }) {\n const status = interaction.inertiaStatus;\n\n if (!interaction.interacting() || status.active) { return; }\n\n const target = interaction.target;\n const options = target && target.options;\n const inertiaOptions = options && interaction.prepared.name && options[interaction.prepared.name].inertia;\n\n const now = new Date().getTime();\n const statuses = {};\n const page = utils.extend({}, interaction.curCoords.page);\n const pointerSpeed = interaction.pointerDelta.client.speed;\n\n let smoothEnd = false;\n let modifierResult;\n\n // check if inertia should be started\n const inertiaPossible = (inertiaOptions && inertiaOptions.enabled\n && interaction.prepared.name !== 'gesture'\n && event !== status.startEvent);\n\n const inertia = (inertiaPossible\n && (now - interaction.curCoords.timeStamp) < 50\n && pointerSpeed > inertiaOptions.minSpeed\n && pointerSpeed > inertiaOptions.endSpeed);\n\n const modifierArg = {\n interaction,\n pageCoords: page,\n statuses,\n preEnd: true,\n requireEndOnly: true,\n };\n\n // smoothEnd\n if (inertiaPossible && !inertia) {\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n if (modifierResult.shouldMove && modifierResult.locked) {\n smoothEnd = true;\n }\n }\n\n if (!(inertia || smoothEnd)) { return; }\n\n utils.copyCoords(status.upCoords, interaction.curCoords);\n\n interaction.pointers[0] = status.startEvent =\n new InteractEvent(interaction, event, interaction.prepared.name, 'inertiastart', interaction.element);\n\n status.t0 = now;\n\n status.active = true;\n status.allowResume = inertiaOptions.allowResume;\n interaction.simulation = status;\n\n target.fire(status.startEvent);\n\n if (inertia) {\n status.vx0 = interaction.pointerDelta.client.vx;\n status.vy0 = interaction.pointerDelta.client.vy;\n status.v0 = pointerSpeed;\n\n calcInertia(interaction, status);\n\n utils.extend(page, interaction.curCoords.page);\n\n page.x += status.xe;\n page.y += status.ye;\n\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n status.modifiedXe += modifierResult.dx;\n status.modifiedYe += modifierResult.dy;\n\n status.i = animationFrame.request(interaction.boundInertiaFrame);\n }\n else {\n status.smoothEnd = true;\n status.xe = modifierResult.dx;\n status.ye = modifierResult.dy;\n\n status.sx = status.sy = 0;\n\n status.i = animationFrame.request(interaction.boundSmoothEndFrame);\n }\n});\n\nInteraction.signals.on('stop-active', function ({ interaction }) {\n const status = interaction.inertiaStatus;\n\n if (status.active) {\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n }\n});\n\nfunction calcInertia (interaction, status) {\n const inertiaOptions = interaction.target.options[interaction.prepared.name].inertia;\n const lambda = inertiaOptions.resistance;\n const inertiaDur = -Math.log(inertiaOptions.endSpeed / status.v0) / lambda;\n\n status.x0 = interaction.prevEvent.pageX;\n status.y0 = interaction.prevEvent.pageY;\n status.t0 = status.startEvent.timeStamp / 1000;\n status.sx = status.sy = 0;\n\n status.modifiedXe = status.xe = (status.vx0 - inertiaDur) / lambda;\n status.modifiedYe = status.ye = (status.vy0 - inertiaDur) / lambda;\n status.te = inertiaDur;\n\n status.lambda_v0 = lambda / status.v0;\n status.one_ve_v0 = 1 - inertiaOptions.endSpeed / status.v0;\n}\n\nfunction inertiaFrame () {\n updateInertiaCoords(this);\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n\n const status = this.inertiaStatus;\n const options = this.target.options[this.prepared.name].inertia;\n const lambda = options.resistance;\n const t = new Date().getTime() / 1000 - status.t0;\n\n if (t < status.te) {\n\n const progress = 1 - (Math.exp(-lambda * t) - status.lambda_v0) / status.one_ve_v0;\n\n if (status.modifiedXe === status.xe && status.modifiedYe === status.ye) {\n status.sx = status.xe * progress;\n status.sy = status.ye * progress;\n }\n else {\n const quadPoint = utils.getQuadraticCurvePoint(0, 0,\n status.xe,\n status.ye,\n status.modifiedXe,\n status.modifiedYe,\n progress);\n\n status.sx = quadPoint.x;\n status.sy = quadPoint.y;\n }\n\n this.doMove();\n\n status.i = animationFrame.request(this.boundInertiaFrame);\n }\n else {\n status.sx = status.modifiedXe;\n status.sy = status.modifiedYe;\n\n this.doMove();\n this.end(status.startEvent);\n status.active = false;\n this.simulation = null;\n }\n\n utils.copyCoords(this.prevCoords, this.curCoords);\n}\n\nfunction smoothEndFrame () {\n updateInertiaCoords(this);\n\n const status = this.inertiaStatus;\n const t = new Date().getTime() - status.t0;\n const duration = this.target.options[this.prepared.name].inertia.smoothEndDuration;\n\n if (t < duration) {\n status.sx = utils.easeOutQuad(t, 0, status.xe, duration);\n status.sy = utils.easeOutQuad(t, 0, status.ye, duration);\n\n this.pointerMove(status.startEvent, status.startEvent);\n\n status.i = animationFrame.request(this.boundSmoothEndFrame);\n }\n else {\n status.sx = status.xe;\n status.sy = status.ye;\n\n this.pointerMove(status.startEvent, status.startEvent);\n this.end(status.startEvent);\n\n status.smoothEnd =\n status.active = false;\n this.simulation = null;\n }\n}\n\nfunction updateInertiaCoords (interaction) {\n const status = interaction.inertiaStatus;\n\n // return if inertia isn't running\n if (!status.active) { return; }\n\n const pageUp = status.upCoords.page;\n const clientUp = status.upCoords.client;\n\n utils.setCoords(interaction.curCoords, [ {\n pageX : pageUp.x + status.sx,\n pageY : pageUp.y + status.sy,\n clientX: clientUp.x + status.sx,\n clientY: clientUp.y + status.sy,\n } ]);\n}\n","const browser = require('./utils/browser');\nconst events = require('./utils/events');\nconst utils = require('./utils');\nconst scope = require('./scope');\nconst Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\n\nconst globalEvents = {};\n\n/*\\\n * interact\n [ method ]\n *\n * The methods of this variable can be used to set elements as\n * interactables and also to change various default settings.\n *\n * Calling it as a function and passing an element or a valid CSS selector\n * string returns an Interactable object which has various methods to\n * configure it.\n *\n - element (Element | string) The HTML or SVG Element to interact with or CSS selector\n = (object) An @Interactable\n *\n > Usage\n | interact('#draggable').draggable(true);\n |\n | var rectables = interact('rect');\n | rectables\n | .gesturable(true)\n | .on('gesturemove', function (event) {\n | // ...\n | });\n\\*/\nfunction interact (element, options) {\n let interactable = scope.interactables.get(element, options);\n\n if (!interactable) {\n interactable = new Interactable(element, options);\n interactable.events.global = globalEvents;\n }\n\n return interactable;\n}\n\n/*\\\n * interact.isSet\n [ method ]\n *\n * Check if an element has been set\n - element (Element) The Element being searched for\n = (boolean) Indicates if the element or CSS selector was previously passed to interact\n\\*/\ninteract.isSet = function (element, options) {\n return scope.interactables.indexOfElement(element, options && options.context) !== -1;\n};\n\n/*\\\n * interact.on\n [ method ]\n *\n * Adds a global listener for an InteractEvent or adds a DOM event to\n * `document`\n *\n - type (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) interact\n\\*/\ninteract.on = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.on(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.on(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n // if it is an InteractEvent type, add listener to globalEvents\n if (utils.contains(Interactable.eventTypes, type)) {\n // if this type of event was never bound\n if (!globalEvents[type]) {\n globalEvents[type] = [listener];\n }\n else {\n globalEvents[type].push(listener);\n }\n }\n // If non InteractEvent type, addEventListener to document\n else {\n events.add(scope.document, type, listener, { options });\n }\n\n return interact;\n};\n\n/*\\\n * interact.off\n [ method ]\n *\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n - type (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) interact\n \\*/\ninteract.off = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.off(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.off(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n if (!utils.contains(Interactable.eventTypes, type)) {\n events.remove(scope.document, type, listener, options);\n }\n else {\n let index;\n\n if (type in globalEvents\n && (index = utils.indexOf(globalEvents[type], listener)) !== -1) {\n globalEvents[type].splice(index, 1);\n }\n }\n\n return interact;\n};\n\n/*\\\n * interact.debug\n [ method ]\n *\n * Returns an object which exposes internal data\n = (object) An object with properties that outline the current state and expose internal functions and variables\n\\*/\ninteract.debug = function () {\n return scope;\n};\n\n// expose the functions used to calculate multi-touch properties\ninteract.getPointerAverage = utils.pointerAverage;\ninteract.getTouchBBox = utils.touchBBox;\ninteract.getTouchDistance = utils.touchDistance;\ninteract.getTouchAngle = utils.touchAngle;\n\ninteract.getElementRect = utils.getElementRect;\ninteract.getElementClientRect = utils.getElementClientRect;\ninteract.matchesSelector = utils.matchesSelector;\ninteract.closest = utils.closest;\n\n/*\\\n * interact.supportsTouch\n [ method ]\n *\n = (boolean) Whether or not the browser supports touch input\n\\*/\ninteract.supportsTouch = function () {\n return browser.supportsTouch;\n};\n\n/*\\\n * interact.supportsPointerEvent\n [ method ]\n *\n = (boolean) Whether or not the browser supports PointerEvents\n\\*/\ninteract.supportsPointerEvent = function () {\n return browser.supportsPointerEvent;\n};\n\n/*\\\n * interact.stop\n [ method ]\n *\n * Cancels all interactions (end events are not fired)\n *\n - event (Event) An event on which to call preventDefault()\n = (object) interact\n\\*/\ninteract.stop = function (event) {\n for (let i = scope.interactions.length - 1; i >= 0; i--) {\n scope.interactions[i].stop(event);\n }\n\n return interact;\n};\n\n/*\\\n * interact.pointerMoveTolerance\n [ method ]\n * Returns or sets the distance the pointer must be moved before an action\n * sequence occurs. This also affects tolerance for tap events.\n *\n - newValue (number) #optional The movement from the start position must be greater than this value\n = (number | Interactable) The current setting or interact\n\\*/\ninteract.pointerMoveTolerance = function (newValue) {\n if (utils.is.number(newValue)) {\n Interaction.pointerMoveTolerance = newValue;\n\n return this;\n }\n\n return Interaction.pointerMoveTolerance;\n};\n\ninteract.addDocument = scope.addDocument;\ninteract.removeDocument = scope.removeDocument;\n\nscope.interact = interact;\n\nmodule.exports = interact;\n","const Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\nconst scope = require('./scope');\nconst is = require('./utils/is');\nconst events = require('./utils/events');\n\nconst { nodeContains, matchesSelector } = require('./utils/domUtils');\n\n/*\\\n * Interactable.preventDefault\n [ method ]\n *\n * Returns or sets whether to prevent the browser's default behaviour\n * in response to pointer events. Can be set to:\n * - `'always'` to always prevent\n * - `'never'` to never prevent\n * - `'auto'` to let interact.js try to determine what would be best\n *\n - newValue (string) #optional `true`, `false` or `'auto'`\n = (string | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.preventDefault = function (newValue) {\n if (/^(always|never|auto)$/.test(newValue)) {\n this.options.preventDefault = newValue;\n return this;\n }\n\n if (is.bool(newValue)) {\n this.options.preventDefault = newValue? 'always' : 'never';\n return this;\n }\n\n return this.options.preventDefault;\n};\n\nInteractable.prototype.checkAndPreventDefault = function (event) {\n const setting = this.options.preventDefault;\n\n if (setting === 'never') { return; }\n\n if (setting === 'always') {\n event.preventDefault();\n return;\n }\n\n // setting === 'auto'\n\n // don't preventDefault if the browser supports passiveEvents\n // CSS touch-action and user-selecct should be used instead\n if (events.supportsOptions) {\n return;\n }\n\n // don't preventDefault of pointerdown events\n if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) {\n return;\n }\n\n // don't preventDefault on editable elements\n if (is.element(event.target)\n && matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) {\n return;\n }\n\n event.preventDefault();\n};\n\nfunction onInteractionEvent ({ interaction, event }) {\n if (interaction.target) {\n interaction.target.checkAndPreventDefault(event);\n }\n}\n\nfor (const eventSignal of ['down', 'move', 'up', 'cancel']) {\n Interaction.signals.on(eventSignal, onInteractionEvent);\n}\n\n// prevent native HTML5 drag on interact.js target elements\nInteraction.docEvents.dragstart = function preventNativeDrag (event) {\n for (const interaction of scope.interactions) {\n\n if (interaction.element\n && (interaction.element === event.target\n || nodeContains(interaction.element, event.target))) {\n\n interaction.target.checkAndPreventDefault(event);\n return;\n }\n }\n};\n","const scope = require('./scope');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst iFinder = require('./utils/interactionFinder');\nconst pointerEvents = require('./pointerEvents/base');\n\nconst { window } = require('./utils/window');\n\nconst toString = Object.prototype.toString;\n\nif (!window.Array.isArray) {\n window.Array.isArray = function (obj) {\n return toString.call(obj) === '[object Array]';\n };\n}\n\nif (!String.prototype.trim) {\n String.prototype.trim = function () {\n return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n };\n}\n\n// http://www.quirksmode.org/dom/events/click.html\n// >Events leading to dblclick\n//\n// IE8 doesn't fire down event before dblclick.\n// This workaround tries to fire a tap and doubletap after dblclick\nfunction onIE8Dblclick (event) {\n const eventTarget = event.target;\n const interaction = iFinder.search(event, event.type, eventTarget);\n\n if (!interaction) { return; }\n\n if (interaction.prevTap\n && event.clientX === interaction.prevTap.clientX\n && event.clientY === interaction.prevTap.clientY\n && eventTarget === interaction.prevTap.target) {\n\n interaction.downTargets[0] = eventTarget;\n interaction.downTimes [0] = new Date().getTime();\n\n pointerEvents.fire({\n interaction,\n event,\n eventTarget,\n pointer: event,\n type: 'tap',\n });\n }\n}\n\nif (browser.isIE8) {\n const selectFix = function (event) {\n for (const interaction of scope.interactions) {\n if (interaction.interacting()) {\n interaction.target.checkAndPreventDefault(event);\n }\n }\n };\n\n const onDocIE8 = function onDocIE8 ({ doc, win }, signalName) {\n const eventMethod = signalName.indexOf('listen') === 0\n ? events.add : events.remove;\n\n // For IE's lack of Event#preventDefault\n eventMethod(doc, 'selectstart', selectFix);\n\n if (pointerEvents) {\n eventMethod(doc, 'dblclick', onIE8Dblclick);\n }\n };\n\n scope.signals.on('add-document' , onDocIE8);\n scope.signals.on('remove-document', onDocIE8);\n}\n\nmodule.exports = null;\n","const InteractEvent = require('../InteractEvent');\nconst Interaction = require('../Interaction');\nconst extend = require('../utils/extend');\n\nconst modifiers = {\n names: [],\n\n setOffsets: function (arg) {\n const { interaction, pageCoords: page } = arg;\n const { target, element, startOffset } = interaction;\n const rect = target.getRect(element);\n\n if (rect) {\n startOffset.left = page.x - rect.left;\n startOffset.top = page.y - rect.top;\n\n startOffset.right = rect.right - page.x;\n startOffset.bottom = rect.bottom - page.y;\n\n if (!('width' in rect)) { rect.width = rect.right - rect.left; }\n if (!('height' in rect)) { rect.height = rect.bottom - rect.top ; }\n }\n else {\n startOffset.left = startOffset.top = startOffset.right = startOffset.bottom = 0;\n }\n\n arg.rect = rect;\n arg.interactable = target;\n arg.element = element;\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n\n arg.options = target.options[interaction.prepared.name][modifierName];\n\n if (!arg.options) {\n continue;\n }\n\n interaction.modifierOffsets[modifierName] = modifiers[modifierName].setOffset(arg);\n }\n },\n\n setAll: function (arg) {\n const { interaction, statuses, preEnd, requireEndOnly } = arg;\n const coords = extend({}, arg.pageCoords);\n const result = {\n dx: 0,\n dy: 0,\n changed: false,\n locked: false,\n shouldMove: true,\n };\n\n for (const modifierName of modifiers.names) {\n const modifier = modifiers[modifierName];\n const options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!shouldDo(options, preEnd, requireEndOnly)) { continue; }\n\n arg.status = arg.status = statuses[modifierName];\n arg.options = options;\n arg.offset = arg.interaction.modifierOffsets[modifierName];\n\n modifier.set(arg);\n\n if (arg.status.locked) {\n coords.x += arg.status.dx;\n coords.y += arg.status.dy;\n\n result.dx += arg.status.dx;\n result.dy += arg.status.dy;\n\n result.locked = true;\n }\n }\n\n // a move should be fired if:\n // - there are no modifiers enabled,\n // - no modifiers are \"locked\" i.e. have changed the pointer's coordinates, or\n // - the locked coords have changed since the last pointer move\n result.shouldMove = !arg.status || !result.locked || arg.status.changed;\n\n return result;\n },\n\n resetStatuses: function (statuses) {\n for (const modifierName of modifiers.names) {\n const status = statuses[modifierName] || {};\n\n status.dx = status.dy = 0;\n status.modifiedX = status.modifiedY = NaN;\n status.locked = false;\n status.changed = true;\n\n statuses[modifierName] = status;\n }\n\n return statuses;\n },\n\n start: function ({ interaction }, signalName) {\n const arg = {\n interaction,\n pageCoords: (signalName === 'action-resume' ?\n interaction.curCoords : interaction.startCoords).page,\n startOffset: interaction.startOffset,\n statuses: interaction.modifierStatuses,\n preEnd: false,\n requireEndOnly: false,\n };\n\n modifiers.setOffsets(arg);\n modifiers.resetStatuses(arg.statuses);\n\n arg.pageCoords = extend({}, interaction.startCoords.page);\n interaction.modifierResult = modifiers.setAll(arg);\n },\n};\n\nInteraction.signals.on('new', function (interaction) {\n interaction.startOffset = { left: 0, right: 0, top: 0, bottom: 0 };\n interaction.modifierOffsets = {};\n interaction.modifierStatuses = modifiers.resetStatuses({});\n interaction.modifierResult = null;\n});\n\nInteraction.signals.on('action-start' , modifiers.start);\nInteraction.signals.on('action-resume', modifiers.start);\n\nInteraction.signals.on('before-action-move', function ({ interaction, preEnd, interactingBeforeMove }) {\n const modifierResult = modifiers.setAll({\n interaction,\n preEnd,\n pageCoords: interaction.curCoords.page,\n statuses: interaction.modifierStatuses,\n requireEndOnly: false,\n });\n\n // don't fire an action move if a modifier would keep the event in the same\n // cordinates as before\n if (!modifierResult.shouldMove && interactingBeforeMove) {\n interaction._dontFireMove = true;\n }\n\n interaction.modifierResult = modifierResult;\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n for (let i = 0; i < modifiers.names.length; i++) {\n const options = interaction.target.options[interaction.prepared.name][modifiers.names[i]];\n\n // if the endOnly option is true for any modifier\n if (shouldDo(options, true, true)) {\n // fire a move event at the modified coordinates\n interaction.doMove({ event, preEnd: true });\n break;\n }\n }\n});\n\nInteractEvent.signals.on('set-xy', function (arg) {\n const { iEvent, interaction } = arg;\n const modifierArg = extend({}, arg);\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n modifierArg.options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!modifierArg.options) {\n continue;\n }\n\n const modifier = modifiers[modifierName];\n\n modifierArg.status = interaction.modifierStatuses[modifierName];\n\n iEvent[modifierName] = modifier.modifyCoords(modifierArg);\n }\n});\n\nfunction shouldDo (options, preEnd, requireEndOnly) {\n return (options && options.enabled\n && (preEnd || !options.endOnly)\n && (!requireEndOnly || options.endOnly));\n}\n\nmodule.exports = modifiers;\n","const modifiers = require('./index');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst restrict = {\n defaults: {\n enabled : false,\n endOnly : false,\n restriction: null,\n elementRect: null,\n },\n\n setOffset: function ({ rect, startOffset, options }) {\n const elementRect = options && options.elementRect;\n const offset = {};\n\n if (rect && elementRect) {\n offset.left = startOffset.left - (rect.width * elementRect.left);\n offset.top = startOffset.top - (rect.height * elementRect.top);\n\n offset.right = startOffset.right - (rect.width * (1 - elementRect.right));\n offset.bottom = startOffset.bottom - (rect.height * (1 - elementRect.bottom));\n }\n else {\n offset.left = offset.top = offset.right = offset.bottom = 0;\n }\n\n return offset;\n },\n\n set: function ({ pageCoords, interaction, status, options }) {\n if (!options) { return status; }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n\n const restriction = getRestrictionRect(options.restriction, interaction, page);\n\n if (!restriction) { return status; }\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n const rect = restriction;\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n const offset = interaction.modifierOffsets.restrict;\n\n // object is assumed to have\n // x, y, width, height or\n // left, top, right, bottom\n if ('x' in restriction && 'y' in restriction) {\n modifiedX = Math.max(Math.min(rect.x + rect.width - offset.right , page.x), rect.x + offset.left);\n modifiedY = Math.max(Math.min(rect.y + rect.height - offset.bottom, page.y), rect.y + offset.top );\n }\n else {\n modifiedX = Math.max(Math.min(rect.right - offset.right , page.x), rect.left + offset.left);\n modifiedY = Math.max(Math.min(rect.bottom - offset.bottom, page.y), rect.top + offset.top );\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const elementRect = options && options.elementRect;\n\n if (options && options.enabled\n && !(phase === 'start' && elementRect && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n getRestrictionRect,\n};\n\nfunction getRestrictionRect (value, interaction, page) {\n if (utils.is.function(value)) {\n return utils.resolveRectLike(value, interaction.target, interaction.element, [page.x, page.y, interaction]);\n } else {\n return utils.resolveRectLike(value, interaction.target, interaction.element);\n }\n}\n\nmodifiers.restrict = restrict;\nmodifiers.names.push('restrict');\n\ndefaultOptions.perAction.restrict = restrict.defaults;\n\nmodule.exports = restrict;\n","// This module adds the options.resize.restrictEdges setting which sets min and\n// max for the top, left, bottom and right edges of the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictEdges: {\n// inner: { top: 200, left: 200, right: 400, bottom: 400 },\n// outer: { top: 0, left: 0, right: 600, bottom: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst { getRestrictionRect } = require('./restrict');\n\nconst noInner = { top: +Infinity, left: +Infinity, bottom: -Infinity, right: -Infinity };\nconst noOuter = { top: -Infinity, left: -Infinity, bottom: +Infinity, right: +Infinity };\n\nconst restrictEdges = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n offset: null,\n },\n\n setOffset: function ({ interaction, startOffset, options }) {\n if (!options) {\n return utils.extend({}, startOffset);\n }\n\n const offset = getRestrictionRect(options.offset, interaction, interaction.startCoords.page);\n\n if (offset) {\n return {\n top: startOffset.top + offset.y,\n left: startOffset.left + offset.x,\n bottom: startOffset.bottom + offset.y,\n right: startOffset.right + offset.x,\n };\n }\n\n return startOffset;\n },\n\n set: function ({ pageCoords, interaction, status, offset, options }) {\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n const inner = rectUtils.xywhToTlbr(getRestrictionRect(options.inner, interaction, page)) || noInner;\n const outer = rectUtils.xywhToTlbr(getRestrictionRect(options.outer, interaction, page)) || noOuter;\n\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n if (edges.top) {\n modifiedY = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top);\n }\n else if (edges.bottom) {\n modifiedY = Math.max(Math.min(outer.bottom - offset.bottom, page.y), inner.bottom - offset.bottom);\n }\n if (edges.left) {\n modifiedX = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left);\n }\n else if (edges.right) {\n modifiedX = Math.max(Math.min(outer.right - offset.right, page.x), inner.right - offset.right);\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n if (options && options.enabled\n && !(phase === 'start' && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n noInner,\n noOuter,\n getRestrictionRect,\n};\n\nmodifiers.restrictEdges = restrictEdges;\nmodifiers.names.push('restrictEdges');\n\ndefaultOptions.perAction.restrictEdges = restrictEdges.defaults;\nresize.defaults.restrictEdges = restrictEdges.defaults;\n\nmodule.exports = restrictEdges;\n","// This module adds the options.resize.restrictSize setting which sets min and\n// max width and height for the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictSize: {\n// min: { width: -600, height: -600 },\n// max: { width: 600, height: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst restrictEdges = require('./restrictEdges');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst noMin = { width: -Infinity, height: -Infinity };\nconst noMax = { width: +Infinity, height: +Infinity };\n\nconst restrictSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n },\n\n setOffset: function ({ interaction }) {\n return interaction.startOffset;\n },\n\n set: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const rect = rectUtils.xywhToTlbr(interaction.resizeRects.inverted);\n\n const minSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.min, interaction)) || noMin;\n const maxSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.max, interaction)) || noMax;\n\n arg.options = {\n enabled: options.enabled,\n endOnly: options.endOnly,\n inner: utils.extend({}, restrictEdges.noInner),\n outer: utils.extend({}, restrictEdges.noOuter),\n };\n\n if (edges.top) {\n arg.options.inner.top = rect.bottom - minSize.height;\n arg.options.outer.top = rect.bottom - maxSize.height;\n }\n else if (edges.bottom) {\n arg.options.inner.bottom = rect.top + minSize.height;\n arg.options.outer.bottom = rect.top + maxSize.height;\n }\n if (edges.left) {\n arg.options.inner.left = rect.right - minSize.width;\n arg.options.outer.left = rect.right - maxSize.width;\n }\n else if (edges.right) {\n arg.options.inner.right = rect.left + minSize.width;\n arg.options.outer.right = rect.left + maxSize.width;\n }\n\n restrictEdges.set(arg);\n },\n\n modifyCoords: restrictEdges.modifyCoords,\n};\n\nmodifiers.restrictSize = restrictSize;\nmodifiers.names.push('restrictSize');\n\ndefaultOptions.perAction.restrictSize = restrictSize.defaults;\nresize.defaults.restrictSize = restrictSize.defaults;\n\nmodule.exports = restrictSize;\n","const modifiers = require('./index');\nconst interact = require('../interact');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst snap = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n\n relativePoints: null,\n },\n\n setOffset: function ({ interaction, interactable, element, rect, startOffset, options }) {\n const offsets = [];\n const optionsOrigin = utils.rectToXY(utils.resolveRectLike(options.origin));\n const origin = optionsOrigin || utils.getOriginXY(interactable, element, interaction.prepared.name);\n options = options || interactable.options[interaction.prepared.name].snap || {};\n\n let snapOffset;\n\n if (options.offset === 'startCoords') {\n snapOffset = {\n x: interaction.startCoords.page.x - origin.x,\n y: interaction.startCoords.page.y - origin.y,\n };\n }\n else {\n const offsetRect = utils.resolveRectLike(options.offset, interactable, element, [interaction]);\n\n snapOffset = utils.rectToXY(offsetRect) || { x: 0, y: 0 };\n }\n\n if (rect && options.relativePoints && options.relativePoints.length) {\n for (const { x: relativeX, y: relativeY } of options.relativePoints) {\n offsets.push({\n x: startOffset.left - (rect.width * relativeX) + snapOffset.x,\n y: startOffset.top - (rect.height * relativeY) + snapOffset.y,\n });\n }\n }\n else {\n offsets.push(snapOffset);\n }\n\n return offsets;\n },\n\n set: function ({ interaction, pageCoords, status, options, offset: offsets }) {\n const targets = [];\n let target;\n let page;\n let i;\n\n if (status.useStatusXY) {\n page = { x: status.x, y: status.y };\n }\n else {\n const origin = utils.getOriginXY(interaction.target, interaction.element, interaction.prepared.name);\n\n page = utils.extend({}, pageCoords);\n\n page.x -= origin.x;\n page.y -= origin.y;\n }\n\n status.realX = page.x;\n status.realY = page.y;\n\n let len = options.targets? options.targets.length : 0;\n\n for (const { x: offsetX, y: offsetY } of offsets) {\n const relativeX = page.x - offsetX;\n const relativeY = page.y - offsetY;\n\n for (const snapTarget of options.targets) {\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n targets.push({\n x: utils.is.number(target.x) ? (target.x + offsetX) : relativeX,\n y: utils.is.number(target.y) ? (target.y + offsetY) : relativeY,\n\n range: utils.is.number(target.range)? target.range: options.range,\n });\n }\n }\n\n const closest = {\n target: null,\n inRange: false,\n distance: 0,\n range: 0,\n dx: 0,\n dy: 0,\n };\n\n for (i = 0, len = targets.length; i < len; i++) {\n target = targets[i];\n\n const range = target.range;\n const dx = target.x - page.x;\n const dy = target.y - page.y;\n const distance = utils.hypot(dx, dy);\n let inRange = distance <= range;\n\n // Infinite targets count as being out of range\n // compared to non infinite ones that are in range\n if (range === Infinity && closest.inRange && closest.range !== Infinity) {\n inRange = false;\n }\n\n if (!closest.target || (inRange\n // is the closest target in range?\n ? (closest.inRange && range !== Infinity\n // the pointer is relatively deeper in this target\n ? distance / range < closest.distance / closest.range\n // this target has Infinite range and the closest doesn't\n : (range === Infinity && closest.range !== Infinity)\n // OR this target is closer that the previous closest\n || distance < closest.distance)\n // The other is not in range and the pointer is closer to this target\n : (!closest.inRange && distance < closest.distance))) {\n\n closest.target = target;\n closest.distance = distance;\n closest.range = range;\n closest.inRange = inRange;\n closest.dx = dx;\n closest.dy = dy;\n\n status.range = range;\n }\n }\n\n let snapChanged;\n\n if (closest.target) {\n snapChanged = (status.modifiedX !== closest.target.x || status.modifiedY !== closest.target.y);\n\n status.modifiedX = closest.target.x;\n status.modifiedY = closest.target.y;\n }\n else {\n snapChanged = true;\n\n status.modifiedX = NaN;\n status.modifiedY = NaN;\n }\n\n status.dx = closest.dx;\n status.dy = closest.dy;\n\n status.changed = (snapChanged || (closest.inRange && !status.locked));\n status.locked = closest.inRange;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const relativePoints = options && options.relativePoints;\n\n if (options && options.enabled\n && !(phase === 'start' && relativePoints && relativePoints.length)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n }\n\n return {\n range : status.range,\n locked : status.locked,\n x : status.modifiedX,\n y : status.modifiedY,\n realX : status.realX,\n realY : status.realY,\n dx : status.dx,\n dy : status.dy,\n };\n }\n },\n};\n\ninteract.createSnapGrid = function (grid) {\n return function (x, y) {\n const limits = grid.limits || {\n left : -Infinity,\n right : Infinity,\n top : -Infinity,\n bottom: Infinity,\n };\n let offsetX = 0;\n let offsetY = 0;\n\n if (utils.is.object(grid.offset)) {\n offsetX = grid.offset.x;\n offsetY = grid.offset.y;\n }\n\n const gridx = Math.round((x - offsetX) / grid.x);\n const gridy = Math.round((y - offsetY) / grid.y);\n\n const newX = Math.max(limits.left, Math.min(limits.right , gridx * grid.x + offsetX));\n const newY = Math.max(limits.top , Math.min(limits.bottom, gridy * grid.y + offsetY));\n\n return {\n x: newX,\n y: newY,\n range: grid.range,\n };\n };\n};\n\nmodifiers.snap = snap;\nmodifiers.names.push('snap');\n\ndefaultOptions.perAction.snap = snap.defaults;\n\nmodule.exports = snap;\n","// This module allows snapping of the size of targets during resize\n// interactions.\n\nconst modifiers = require('./index');\nconst snap = require('./snap');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\nconst utils = require('../utils/');\n\nconst snapSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n },\n\n setOffset: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.edges;\n\n if (!edges) { return; }\n\n arg.options = {\n relativePoints: [{\n x: edges.left? 0 : 1,\n y: edges.top ? 0 : 1,\n }],\n origin: { x: 0, y: 0 },\n offset: 'self',\n range: options.range,\n };\n\n const offsets = snap.setOffset(arg);\n arg.options = options;\n\n return offsets;\n },\n\n set: function (arg) {\n const { interaction, options, offset, pageCoords } = arg;\n const page = utils.extend({}, pageCoords);\n const relativeX = page.x - offset[0].x;\n const relativeY = page.y - offset[0].y;\n\n arg.options = utils.extend({}, options);\n arg.options.targets = [];\n\n for (const snapTarget of options.targets) {\n let target;\n\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n if ('width' in target && 'height' in target) {\n target.x = target.width;\n target.y = target.height;\n }\n\n arg.options.targets.push(target);\n }\n\n snap.set(arg);\n },\n\n modifyCoords: function (arg) {\n const { options } = arg;\n\n arg.options = utils.extend({}, options);\n arg.options.enabled = options.enabled;\n arg.options.relativePoints = [null];\n\n snap.modifyCoords(arg);\n },\n};\n\nmodifiers.snapSize = snapSize;\nmodifiers.names.push('snapSize');\n\ndefaultOptions.perAction.snapSize = snapSize.defaults;\nresize.defaults.snapSize = snapSize.defaults;\n\nmodule.exports = snapSize;\n","const pointerUtils = require('../utils/pointerUtils');\n\nmodule.exports = class PointerEvent {\n constructor (type, pointer, event, eventTarget, interaction) {\n pointerUtils.pointerExtend(this, event);\n\n if (event !== pointer) {\n pointerUtils.pointerExtend(this, pointer);\n }\n\n this.interaction = interaction;\n\n this.timeStamp = new Date().getTime();\n this.originalEvent = event;\n this.type = type;\n this.pointerId = pointerUtils.getPointerId(pointer);\n this.pointerType = pointerUtils.getPointerType(pointer);\n this.target = eventTarget;\n this.currentTarget = null;\n\n if (type === 'tap') {\n const pointerIndex = interaction.getPointerIndex(pointer);\n this.dt = this.timeStamp - interaction.downTimes[pointerIndex];\n\n const interval = this.timeStamp - interaction.tapTime;\n\n this.double = !!(interaction.prevTap\n && interaction.prevTap.type !== 'doubletap'\n && interaction.prevTap.target === this.target\n && interval < 500);\n }\n else if (type === 'doubletap') {\n this.dt = pointer.timeStamp - interaction.tapTime;\n }\n }\n\n subtractOrigin ({ x: originX, y: originY }) {\n this.pageX -= originX;\n this.pageY -= originY;\n this.clientX -= originX;\n this.clientY -= originY;\n\n return this;\n }\n\n addOrigin ({ x: originX, y: originY }) {\n this.pageX += originX;\n this.pageY += originY;\n this.clientX += originX;\n this.clientY += originY;\n\n return this;\n }\n\n preventDefault () {\n this.originalEvent.preventDefault();\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n};\n","const PointerEvent = require('./PointerEvent');\nconst Interaction = require('../Interaction');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst defaults = require('../defaultOptions');\nconst signals = require('../utils/Signals').new();\nconst { filter } = require('../utils/arr');\n\nconst simpleSignals = [ 'down', 'up', 'cancel' ];\nconst simpleEvents = [ 'down', 'up', 'cancel' ];\n\nconst pointerEvents = {\n PointerEvent,\n fire,\n collectEventTargets,\n signals,\n defaults: {\n holdDuration: 600,\n ignoreFrom : null,\n allowFrom : null,\n origin : { x: 0, y: 0 },\n },\n types: [\n 'down',\n 'move',\n 'up',\n 'cancel',\n 'tap',\n 'doubletap',\n 'hold',\n ],\n};\n\nfunction fire (arg) {\n const {\n interaction, pointer, event, eventTarget,\n type = arg.pointerEvent.type,\n targets = collectEventTargets(arg),\n pointerEvent = new PointerEvent(type, pointer, event, eventTarget, interaction),\n } = arg;\n\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n targets,\n type,\n pointerEvent,\n };\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n\n for (const prop in target.props || {}) {\n pointerEvent[prop] = target.props[prop];\n }\n\n const origin = utils.getOriginXY(target.eventable, target.element);\n\n pointerEvent.subtractOrigin(origin);\n pointerEvent.eventable = target.eventable;\n pointerEvent.currentTarget = target.element;\n\n target.eventable.fire(pointerEvent);\n\n pointerEvent.addOrigin(origin);\n\n if (pointerEvent.immediatePropagationStopped\n || (pointerEvent.propagationStopped\n && (i + 1) < targets.length && targets[i + 1].element !== pointerEvent.currentTarget)) {\n break;\n }\n }\n\n signals.fire('fired', signalArg);\n\n if (type === 'tap') {\n // if pointerEvent should make a double tap, create and fire a doubletap\n // PointerEvent and use that as the prevTap\n const prevTap = pointerEvent.double\n ? fire({\n interaction, pointer, event, eventTarget,\n type: 'doubletap',\n })\n : pointerEvent;\n\n interaction.prevTap = prevTap;\n interaction.tapTime = prevTap.timeStamp;\n }\n\n return pointerEvent;\n}\n\nfunction collectEventTargets ({ interaction, pointer, event, eventTarget, type }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n // do not fire a tap event if the pointer was moved before being lifted\n if (type === 'tap' && (interaction.pointerWasMoved\n // or if the pointerup target is different to the pointerdown target\n || !(interaction.downTargets[pointerIndex] && interaction.downTargets[pointerIndex] === eventTarget))) {\n return [];\n }\n\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n path,\n targets: [],\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (type === 'hold') {\n signalArg.targets = filter(signalArg.targets, target =>\n target.eventable.options.holdDuration === interaction.holdTimers[pointerIndex].duration);\n }\n\n return signalArg.targets;\n}\n\nInteraction.signals.on('update-pointer-down', function ({ interaction, pointerIndex }) {\n interaction.holdTimers[pointerIndex] = { duration: Infinity, timeout: null };\n});\n\nInteraction.signals.on('remove-pointer', function ({ interaction, pointerIndex }) {\n interaction.holdTimers.splice(pointerIndex, 1);\n});\n\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget, duplicateMove }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n if (!duplicateMove && (!interaction.pointerIsDown || interaction.pointerWasMoved)) {\n if (interaction.pointerIsDown) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n\n fire({\n interaction, pointer, event, eventTarget,\n type: 'move',\n });\n }\n});\n\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget, pointerIndex }) {\n // copy event to be used in timeout for IE8\n const eventCopy = browser.isIE8? utils.extend({}, event) : event;\n\n const timer = interaction.holdTimers[pointerIndex];\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'hold',\n targets: [],\n path,\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (!signalArg.targets.length) { return; }\n\n let minDuration = Infinity;\n\n for (let i = 0; i < signalArg.targets.length; i++) {\n const target = signalArg.targets[i];\n const holdDuration = target.eventable.options.holdDuration;\n\n if (holdDuration < minDuration) {\n minDuration = holdDuration;\n }\n }\n\n timer.duration = minDuration;\n timer.timeout = setTimeout(function () {\n fire({\n interaction,\n eventTarget,\n pointer: browser.isIE8? eventCopy : pointer,\n event: eventCopy,\n type: 'hold',\n });\n }, minDuration);\n});\n\nInteraction.signals.on('up', ({ interaction, pointer, event, eventTarget }) => {\n if (!interaction.pointerWasMoved) {\n fire({ interaction, eventTarget, pointer, event, type: 'tap' });\n }\n});\n\n['up', 'cancel'].forEach(function (signalName) {\n Interaction.signals.on(signalName, function ({ interaction, pointerIndex }) {\n if (interaction.holdTimers[pointerIndex]) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n });\n});\n\nfunction createSignalListener (type) {\n return function ({ interaction, pointer, event, eventTarget }) {\n fire({ interaction, eventTarget, pointer, event, type });\n };\n}\n\nfor (let i = 0; i < simpleSignals.length; i++) {\n Interaction.signals.on(simpleSignals[i], createSignalListener(simpleEvents[i]));\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.prevTap = null; // the most recent tap event on this interaction\n interaction.tapTime = 0; // time of the most recent tap event\n interaction.holdTimers = []; // [{ duration, timeout }]\n});\n\ndefaults.pointerEvents = pointerEvents.defaults;\nmodule.exports = pointerEvents;\n","const pointerEvents = require('./base');\nconst Interaction = require('../Interaction');\n\npointerEvents.signals.on('new', onNew);\npointerEvents.signals.on('fired', onFired);\n\nfor (const signal of ['move', 'up', 'cancel', 'endall']) {\n Interaction.signals.on(signal, endHoldRepeat);\n}\n\nfunction onNew ({ pointerEvent }) {\n if (pointerEvent.type !== 'hold') { return; }\n\n pointerEvent.count = (pointerEvent.count || 0) + 1;\n}\n\nfunction onFired ({ interaction, pointerEvent, eventTarget, targets }) {\n if (pointerEvent.type !== 'hold' || !targets.length) { return; }\n\n // get the repeat interval from the first eventable\n const interval = targets[0].eventable.options.holdRepeatInterval;\n\n // don't repeat if the interval is 0 or less\n if (interval <= 0) { return; }\n\n // set a timeout to fire the holdrepeat event\n interaction.holdIntervalHandle = setTimeout(function () {\n pointerEvents.fire({\n interaction,\n eventTarget,\n type: 'hold',\n pointer: pointerEvent,\n event: pointerEvent,\n });\n }, interval);\n}\n\nfunction endHoldRepeat ({ interaction }) {\n // set the interaction's holdStopTime property\n // to stop further holdRepeat events\n if (interaction.holdIntervalHandle) {\n clearInterval(interaction.holdIntervalHandle);\n interaction.holdIntervalHandle = null;\n }\n}\n\n// don't repeat by default\npointerEvents.defaults.holdRepeatInterval = 0;\npointerEvents.types.push('holdrepeat');\n\nmodule.exports = {\n onNew,\n onFired,\n endHoldRepeat,\n};\n","const pointerEvents = require('./base');\nconst Interactable = require('../Interactable');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\nconst scope = require('../scope');\nconst extend = require('../utils/extend');\nconst { merge } = require('../utils/arr');\n\npointerEvents.signals.on('collect-targets', function ({ targets, element, type, eventTarget }) {\n function collectSelectors (interactable, selector, context) {\n const els = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && is.element(element)\n && domUtils.matchesSelector(element, selector, els)\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n const interactable = scope.interactables.get(element);\n\n if (interactable) {\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n scope.interactables.forEachSelector(collectSelectors, element);\n});\n\nInteractable.signals.on('new', function ({ interactable }) {\n interactable.events.getRect = function (element) {\n return interactable.getRect(element);\n };\n});\n\nInteractable.signals.on('set', function ({ interactable, options }) {\n extend(interactable.events.options, pointerEvents.defaults);\n extend(interactable.events.options, options);\n});\n\nmerge(Interactable.eventTypes, pointerEvents.types);\n\nInteractable.prototype.pointerEvents = function (options) {\n extend(this.events.options, options);\n\n return this;\n};\n\nconst __backCompatOption = Interactable.prototype._backCompatOption;\n\nInteractable.prototype._backCompatOption = function (optionName, newValue) {\n const ret = __backCompatOption.call(this, optionName, newValue);\n\n if (ret === this) {\n this.events.options[optionName] = newValue;\n }\n\n return ret;\n};\n\nInteractable.settingsMethods.push('pointerEvents');\n","const utils = require('./utils');\nconst events = require('./utils/events');\nconst signals = require('./utils/Signals').new();\n\nconst scope = {\n signals,\n events,\n utils,\n\n // main document\n document: require('./utils/domObjects').document,\n // all documents being listened to\n documents: [],\n\n addDocument: function (doc, win) {\n // do nothing if document is already known\n if (utils.contains(scope.documents, doc)) { return false; }\n\n win = win || scope.getWindow(doc);\n\n scope.documents.push(doc);\n events.documents.push(doc);\n\n // don't add an unload event for the main document\n // so that the page may be cached in browser history\n if (doc !== scope.document) {\n events.add(win, 'unload', scope.onWindowUnload);\n }\n\n signals.fire('add-document', { doc, win });\n },\n\n removeDocument: function (doc, win) {\n const index = utils.indexOf(scope.documents, doc);\n\n win = win || scope.getWindow(doc);\n\n events.remove(win, 'unload', scope.onWindowUnload);\n\n scope.documents.splice(index, 1);\n events.documents.splice(index, 1);\n\n signals.fire('remove-document', { win, doc });\n },\n\n onWindowUnload: function () {\n scope.removeDocument(this.document, this);\n },\n};\n\nmodule.exports = scope;\n","const { indexOf } = require('./arr');\n\nclass Signals {\n constructor () {\n this.listeners = {\n // signalName: [listeners],\n };\n }\n\n on (name, listener) {\n if (!this.listeners[name]) {\n this.listeners[name] = [listener];\n return;\n }\n\n this.listeners[name].push(listener);\n }\n\n off (name, listener) {\n if (!this.listeners[name]) { return; }\n\n const index = indexOf(this.listeners[name], listener);\n\n if (index !== -1) {\n this.listeners[name].splice(index, 1);\n }\n }\n\n fire (name, arg) {\n const targetListeners = this.listeners[name];\n\n if (!targetListeners) { return; }\n\n for (let i = 0; i < targetListeners.length; i++) {\n if (targetListeners[i](arg, name) === false) {\n return;\n }\n }\n }\n}\n\nSignals.new = function () {\n return new Signals();\n};\n\nmodule.exports = Signals;\n","function indexOf (array, target) {\n for (let i = 0, len = array.length; i < len; i++) {\n if (array[i] === target) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction contains (array, target) {\n return indexOf(array, target) !== -1;\n}\n\nfunction merge (target, source) {\n for (let i = 0; i < source.length; i++) {\n target.push(source[i]);\n }\n\n return target;\n}\n\nfunction filter (array, test) {\n const result = [];\n\n for (let i = 0; i < array.length; i++) {\n if (test(array[i])) {\n result.push(array[i]);\n }\n }\n\n return result;\n}\n\nmodule.exports = {\n indexOf,\n contains,\n merge,\n filter,\n};\n","const { window } = require('./window');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst Element = domObjects.Element;\nconst navigator = window.navigator;\n\nconst browser = {\n // Does the browser support touch input?\n supportsTouch: !!(('ontouchstart' in window) || is.function(window.DocumentTouch)\n && domObjects.document instanceof window.DocumentTouch),\n\n // Does the browser support PointerEvents\n supportsPointerEvent: !!domObjects.PointerEvent,\n\n isIE8: ('attachEvent' in window) && !('addEventListener' in window),\n\n // Opera Mobile must be handled differently\n isOperaMobile: (navigator.appName === 'Opera'\n && browser.supportsTouch\n && navigator.userAgent.match('Presto')),\n\n // scrolling doesn't change the result of getClientRects on iOS 7\n isIOS7: (/iP(hone|od|ad)/.test(navigator.platform)\n && /OS 7[^\\d]/.test(navigator.appVersion)),\n\n isIe9OrOlder: /MSIE (8|9)/.test(navigator.userAgent),\n\n // prefix matchesSelector\n prefixedMatchesSelector: 'matches' in Element.prototype\n ? 'matches': 'webkitMatchesSelector' in Element.prototype\n ? 'webkitMatchesSelector': 'mozMatchesSelector' in Element.prototype\n ? 'mozMatchesSelector': 'oMatchesSelector' in Element.prototype\n ? 'oMatchesSelector': 'msMatchesSelector',\n\n useMatchesSelectorPolyfill: false,\n\n pEventTypes: (domObjects.PointerEvent\n ? (domObjects.PointerEvent === window.MSPointerEvent\n ? {\n up: 'MSPointerUp',\n down: 'MSPointerDown',\n over: 'mouseover',\n out: 'mouseout',\n move: 'MSPointerMove',\n cancel: 'MSPointerCancel',\n }\n : {\n up: 'pointerup',\n down: 'pointerdown',\n over: 'pointerover',\n out: 'pointerout',\n move: 'pointermove',\n cancel: 'pointercancel',\n })\n : null),\n\n // because Webkit and Opera still use 'mousewheel' event type\n wheelEvent: 'onmousewheel' in domObjects.document? 'mousewheel': 'wheel',\n\n};\n\nbrowser.useMatchesSelectorPolyfill = !is.function(Element.prototype[browser.prefixedMatchesSelector]);\n\nmodule.exports = browser;\n","const domObjects = {};\nconst win = require('./window').window;\n\nfunction blank () {}\n\ndomObjects.document = win.document;\ndomObjects.DocumentFragment = win.DocumentFragment || blank;\ndomObjects.SVGElement = win.SVGElement || blank;\ndomObjects.SVGSVGElement = win.SVGSVGElement || blank;\ndomObjects.SVGElementInstance = win.SVGElementInstance || blank;\ndomObjects.Element = win.Element || blank;\ndomObjects.HTMLElement = win.HTMLElement || domObjects.Element;\n\ndomObjects.Event = win.Event;\ndomObjects.Touch = win.Touch || blank;\ndomObjects.PointerEvent = (win.PointerEvent || win.MSPointerEvent);\n\nmodule.exports = domObjects;\n","const win = require('./window');\nconst browser = require('./browser');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst domUtils = {\n nodeContains: function (parent, child) {\n while (child) {\n if (child === parent) {\n return true;\n }\n\n child = child.parentNode;\n }\n\n return false;\n },\n\n closest: function (element, selector) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) { return element; }\n\n element = domUtils.parentNode(element);\n }\n\n return null;\n },\n\n parentNode: function (node) {\n let parent = node.parentNode;\n\n if (is.docFrag(parent)) {\n // skip past #shado-root fragments\n while ((parent = parent.host) && is.docFrag(parent)) {\n continue;\n }\n\n return parent;\n }\n\n return parent;\n },\n\n // taken from http://tanalin.com/en/blog/2012/12/matches-selector-ie8/ and modified\n matchesSelectorPolyfill: browser.useMatchesSelectorPolyfill\n ? function (element, selector, elems) {\n elems = elems || element.parentNode.querySelectorAll(selector);\n\n for (let i = 0, len = elems.length; i < len; i++) {\n if (elems[i] === element) {\n return true;\n }\n }\n\n return false;\n }\n : null,\n\n matchesSelector: function (element, selector, nodeList) {\n if (browser.useMatchesSelectorPolyfill) {\n return domUtils.matchesSelectorPolyfill(element, selector, nodeList);\n }\n\n // remove /deep/ from selectors if shadowDOM polyfill is used\n if (win.window !== win.realWindow) {\n selector = selector.replace(/\\/deep\\//g, ' ');\n }\n\n return element[browser.prefixedMatchesSelector](selector);\n },\n\n // Test for the element that's \"above\" all other qualifiers\n indexOfDeepestElement: function (elements) {\n let deepestZoneParents = [];\n let dropzoneParents = [];\n let dropzone;\n let deepestZone = elements[0];\n let index = deepestZone? 0: -1;\n let parent;\n let child;\n let i;\n let n;\n\n for (i = 1; i < elements.length; i++) {\n dropzone = elements[i];\n\n // an element might belong to multiple selector dropzones\n if (!dropzone || dropzone === deepestZone) {\n continue;\n }\n\n if (!deepestZone) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n // check if the deepest or current are document.documentElement or document.rootElement\n // - if the current dropzone is, do nothing and continue\n if (dropzone.parentNode === dropzone.ownerDocument) {\n continue;\n }\n // - if deepest is, update with the current dropzone and continue to next\n else if (deepestZone.parentNode === dropzone.ownerDocument) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n if (!deepestZoneParents.length) {\n parent = deepestZone;\n while (parent.parentNode && parent.parentNode !== parent.ownerDocument) {\n deepestZoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n }\n\n // if this element is an svg element and the current deepest is\n // an HTMLElement\n if (deepestZone instanceof domObjects.HTMLElement\n && dropzone instanceof domObjects.SVGElement\n && !(dropzone instanceof domObjects.SVGSVGElement)) {\n\n if (dropzone === deepestZone.parentNode) {\n continue;\n }\n\n parent = dropzone.ownerSVGElement;\n }\n else {\n parent = dropzone;\n }\n\n dropzoneParents = [];\n\n while (parent.parentNode !== parent.ownerDocument) {\n dropzoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n\n n = 0;\n\n // get (position of last common ancestor) + 1\n while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) {\n n++;\n }\n\n const parents = [\n dropzoneParents[n - 1],\n dropzoneParents[n],\n deepestZoneParents[n],\n ];\n\n child = parents[0].lastChild;\n\n while (child) {\n if (child === parents[1]) {\n deepestZone = dropzone;\n index = i;\n deepestZoneParents = [];\n\n break;\n }\n else if (child === parents[2]) {\n break;\n }\n\n child = child.previousSibling;\n }\n }\n\n return index;\n },\n\n matchesUpTo: function (element, selector, limit) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) {\n return true;\n }\n\n element = domUtils.parentNode(element);\n\n if (element === limit) {\n return domUtils.matchesSelector(element, selector);\n }\n }\n\n return false;\n },\n\n getActualElement: function (element) {\n return (element instanceof domObjects.SVGElementInstance\n ? element.correspondingUseElement\n : element);\n },\n\n getScrollXY: function (relevantWindow) {\n relevantWindow = relevantWindow || win.window;\n return {\n x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft,\n y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop,\n };\n },\n\n getElementClientRect: function (element) {\n const clientRect = (element instanceof domObjects.SVGElement\n ? element.getBoundingClientRect()\n : element.getClientRects()[0]);\n\n return clientRect && {\n left : clientRect.left,\n right : clientRect.right,\n top : clientRect.top,\n bottom: clientRect.bottom,\n width : clientRect.width || clientRect.right - clientRect.left,\n height: clientRect.height || clientRect.bottom - clientRect.top,\n };\n },\n\n getElementRect: function (element) {\n const clientRect = domUtils.getElementClientRect(element);\n\n if (!browser.isIOS7 && clientRect) {\n const scroll = domUtils.getScrollXY(win.getWindow(element));\n\n clientRect.left += scroll.x;\n clientRect.right += scroll.x;\n clientRect.top += scroll.y;\n clientRect.bottom += scroll.y;\n }\n\n return clientRect;\n },\n\n getPath: function (element) {\n const path = [];\n\n while (element) {\n path.push(element);\n element = domUtils.parentNode(element);\n }\n\n return path;\n },\n\n trySelector: value => {\n if (!is.string(value)) { return false; }\n\n // an exception will be raised if it is invalid\n domObjects.document.querySelector(value);\n return true;\n },\n};\n\nmodule.exports = domUtils;\n","const is = require('./is');\nconst domUtils = require('./domUtils');\nconst pExtend = require('./pointerExtend');\n\nconst { window, getWindow } = require('./window');\nconst { indexOf, contains } = require('./arr');\n\nconst useAttachEvent = ('attachEvent' in window) && !('addEventListener' in window);\nconst addEvent = useAttachEvent? 'attachEvent': 'addEventListener';\nconst removeEvent = useAttachEvent? 'detachEvent': 'removeEventListener';\nconst on = useAttachEvent? 'on': '';\n\nconst elements = [];\nconst targets = [];\nconst attachedListeners = [];\n\n// {\n// type: {\n// selectors: ['selector', ...],\n// contexts : [document, ...],\n// listeners: [[listener, capture, passive], ...]\n// }\n// }\nconst delegatedEvents = {};\n\nconst documents = [];\n\nconst supportsOptions = !useAttachEvent && (() => {\n let supported = false;\n\n window.document.createElement('div').addEventListener('test', null, {\n get capture () { supported = true; },\n });\n\n return supported;\n})();\n\nfunction add (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n let elementIndex = indexOf(elements, element);\n let target = targets[elementIndex];\n\n if (!target) {\n target = {\n events: {},\n typeCount: 0,\n };\n\n elementIndex = elements.push(element) - 1;\n targets.push(target);\n\n attachedListeners.push(useAttachEvent\n ? {\n supplied: [],\n wrapped : [],\n useCount: [],\n }\n : null);\n }\n\n if (!target.events[type]) {\n target.events[type] = [];\n target.typeCount++;\n }\n\n if (!contains(target.events[type], listener)) {\n let ret;\n\n if (useAttachEvent) {\n const { supplied, wrapped, useCount } = attachedListeners[elementIndex];\n const listenerIndex = indexOf(supplied, listener);\n\n const wrappedListener = wrapped[listenerIndex] || function (event) {\n if (!event.immediatePropagationStopped) {\n event.target = event.srcElement;\n event.currentTarget = element;\n\n event.preventDefault = event.preventDefault || preventDef;\n event.stopPropagation = event.stopPropagation || stopProp;\n event.stopImmediatePropagation = event.stopImmediatePropagation || stopImmProp;\n\n if (/mouse|click/.test(event.type)) {\n event.pageX = event.clientX + getWindow(element).document.documentElement.scrollLeft;\n event.pageY = event.clientY + getWindow(element).document.documentElement.scrollTop;\n }\n\n listener(event);\n }\n };\n\n ret = element[addEvent](on + type, wrappedListener, !!options.capture);\n\n if (listenerIndex === -1) {\n supplied.push(listener);\n wrapped.push(wrappedListener);\n useCount.push(1);\n }\n else {\n useCount[listenerIndex]++;\n }\n }\n else {\n ret = element[addEvent](type, listener, supportsOptions? options : !!options.capture);\n }\n target.events[type].push(listener);\n\n return ret;\n }\n}\n\nfunction remove (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const elementIndex = indexOf(elements, element);\n const target = targets[elementIndex];\n\n if (!target || !target.events) {\n return;\n }\n\n let wrappedListener = listener;\n let listeners;\n let listenerIndex;\n\n if (useAttachEvent) {\n listeners = attachedListeners[elementIndex];\n listenerIndex = indexOf(listeners.supplied, listener);\n wrappedListener = listeners.wrapped[listenerIndex];\n }\n\n if (type === 'all') {\n for (type in target.events) {\n if (target.events.hasOwnProperty(type)) {\n remove(element, type, 'all');\n }\n }\n return;\n }\n\n if (target.events[type]) {\n const len = target.events[type].length;\n\n if (listener === 'all') {\n for (let i = 0; i < len; i++) {\n remove(element, type, target.events[type][i], options);\n }\n return;\n }\n else {\n for (let i = 0; i < len; i++) {\n if (target.events[type][i] === listener) {\n element[removeEvent](on + type, wrappedListener, supportsOptions? options : !!options.capture);\n target.events[type].splice(i, 1);\n\n if (useAttachEvent && listeners) {\n listeners.useCount[listenerIndex]--;\n if (listeners.useCount[listenerIndex] === 0) {\n listeners.supplied.splice(listenerIndex, 1);\n listeners.wrapped.splice(listenerIndex, 1);\n listeners.useCount.splice(listenerIndex, 1);\n }\n }\n\n break;\n }\n }\n }\n\n if (target.events[type] && target.events[type].length === 0) {\n target.events[type] = null;\n target.typeCount--;\n }\n }\n\n if (!target.typeCount) {\n targets.splice(elementIndex, 1);\n elements.splice(elementIndex, 1);\n attachedListeners.splice(elementIndex, 1);\n }\n}\n\nfunction addDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n if (!delegatedEvents[type]) {\n delegatedEvents[type] = {\n selectors: [],\n contexts : [],\n listeners: [],\n };\n\n // add delegate listener functions\n for (let i = 0; i < documents.length; i++) {\n add(documents[i], type, delegateListener);\n add(documents[i], type, delegateUseCapture, true);\n }\n }\n\n const delegated = delegatedEvents[type];\n let index;\n\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n break;\n }\n }\n\n if (index === -1) {\n index = delegated.selectors.length;\n\n delegated.selectors.push(selector);\n delegated.contexts .push(context);\n delegated.listeners.push([]);\n }\n\n // keep listener and capture and passive flags\n delegated.listeners[index].push([listener, !!options.capture, options.passive]);\n}\n\nfunction removeDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const delegated = delegatedEvents[type];\n let matchFound = false;\n let index;\n\n if (!delegated) { return; }\n\n // count from last index of delegated to 0\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n // look for matching selector and context Node\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n\n const listeners = delegated.listeners[index];\n\n // each item of the listeners array is an array: [function, capture, passive]\n for (let i = listeners.length - 1; i >= 0; i--) {\n const [fn, capture, passive] = listeners[i];\n\n // check if the listener functions and capture and passive flags match\n if (fn === listener && capture === !!options.capture && passive === options.passive) {\n // remove the listener from the array of listeners\n listeners.splice(i, 1);\n\n // if all listeners for this interactable have been removed\n // remove the interactable from the delegated arrays\n if (!listeners.length) {\n delegated.selectors.splice(index, 1);\n delegated.contexts .splice(index, 1);\n delegated.listeners.splice(index, 1);\n\n // remove delegate function from context\n remove(context, type, delegateListener);\n remove(context, type, delegateUseCapture, true);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegatedEvents[type] = null;\n }\n }\n\n // only remove one listener\n matchFound = true;\n break;\n }\n }\n\n if (matchFound) { break; }\n }\n }\n}\n\n// bound to the interactable context when a DOM event\n// listener is added to a selector interactable\nfunction delegateListener (event, optionalArg) {\n const options = getOptions(optionalArg);\n const fakeEvent = {};\n const delegated = delegatedEvents[event.type];\n const eventTarget = (domUtils.getActualElement(event.path\n ? event.path[0]\n : event.target));\n let element = eventTarget;\n\n // duplicate the event so that currentTarget can be changed\n pExtend(fakeEvent, event);\n\n fakeEvent.originalEvent = event;\n fakeEvent.preventDefault = preventOriginalDefault;\n\n // climb up document tree looking for selector matches\n while (is.element(element)) {\n for (let i = 0; i < delegated.selectors.length; i++) {\n const selector = delegated.selectors[i];\n const context = delegated.contexts[i];\n\n if (domUtils.matchesSelector(element, selector)\n && domUtils.nodeContains(context, eventTarget)\n && domUtils.nodeContains(context, element)) {\n\n const listeners = delegated.listeners[i];\n\n fakeEvent.currentTarget = element;\n\n for (let j = 0; j < listeners.length; j++) {\n const [fn, capture, passive] = listeners[j];\n\n if (capture === !!options.capture && passive === options.passive) {\n fn(fakeEvent);\n }\n }\n }\n }\n\n element = domUtils.parentNode(element);\n }\n}\n\nfunction delegateUseCapture (event) {\n return delegateListener.call(this, event, true);\n}\n\nfunction preventDef () {\n this.returnValue = false;\n}\n\nfunction preventOriginalDefault () {\n this.originalEvent.preventDefault();\n}\n\nfunction stopProp () {\n this.cancelBubble = true;\n}\n\nfunction stopImmProp () {\n this.cancelBubble = true;\n this.immediatePropagationStopped = true;\n}\n\nfunction getOptions (param) {\n return is.object(param)? param : { capture: param };\n}\n\nmodule.exports = {\n add,\n remove,\n\n addDelegate,\n removeDelegate,\n\n delegateListener,\n delegateUseCapture,\n delegatedEvents,\n documents,\n\n useAttachEvent,\n supportsOptions,\n\n _elements: elements,\n _targets: targets,\n _attachedListeners: attachedListeners,\n};\n","module.exports = function extend (dest, source) {\n for (const prop in source) {\n dest[prop] = source[prop];\n }\n return dest;\n};\n","const {\n resolveRectLike,\n rectToXY,\n} = require('./rect');\n\nmodule.exports = function (target, element, action) {\n const actionOptions = target.options[action];\n const actionOrigin = actionOptions && actionOptions.origin;\n const origin = actionOrigin || target.options.origin;\n\n const originRect = resolveRectLike(origin, target, element, [target && element]);\n\n return rectToXY(originRect) || { x: 0, y: 0 };\n};\n","module.exports = (x, y) => Math.sqrt(x * x + y * y);\n","const extend = require('./extend');\nconst win = require('./window');\n\nconst utils = {\n warnOnce: function (method, message) {\n let warned = false;\n\n return function () {\n if (!warned) {\n win.window.console.warn(message);\n warned = true;\n }\n\n return method.apply(this, arguments);\n };\n },\n\n // http://stackoverflow.com/a/5634528/2280888\n _getQBezierValue: function (t, p1, p2, p3) {\n const iT = 1 - t;\n return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3;\n },\n\n getQuadraticCurvePoint: function (startX, startY, cpX, cpY, endX, endY, position) {\n return {\n x: utils._getQBezierValue(position, startX, cpX, endX),\n y: utils._getQBezierValue(position, startY, cpY, endY),\n };\n },\n\n // http://gizma.com/easing/\n easeOutQuad: function (t, b, c, d) {\n t /= d;\n return -c * t*(t-2) + b;\n },\n\n copyAction: function (dest, src) {\n dest.name = src.name;\n dest.axis = src.axis;\n dest.edges = src.edges;\n\n return dest;\n },\n\n is : require('./is'),\n extend : extend,\n hypot : require('./hypot'),\n getOriginXY: require('./getOriginXY'),\n};\n\nextend(utils, require('./arr'));\nextend(utils, require('./domUtils'));\nextend(utils, require('./pointerUtils'));\nextend(utils, require('./rect'));\n\nmodule.exports = utils;\n","const scope = require('../scope');\nconst utils = require('./index');\n\nconst finder = {\n methodOrder: [ 'simulationResume', 'mouseOrPen', 'hasPointer', 'idle' ],\n\n search: function (pointer, eventType, eventTarget) {\n const pointerType = utils.getPointerType(pointer);\n const pointerId = utils.getPointerId(pointer);\n const details = { pointer, pointerId, pointerType, eventType, eventTarget };\n\n for (const method of finder.methodOrder) {\n const interaction = finder[method](details);\n\n if (interaction) {\n return interaction;\n }\n }\n },\n\n // try to resume simulation with a new pointer\n simulationResume: function ({ pointerType, eventType, eventTarget }) {\n if (!/down|start/i.test(eventType)) {\n return null;\n }\n\n for (const interaction of scope.interactions) {\n let element = eventTarget;\n\n if (interaction.simulation && interaction.simulation.allowResume\n && (interaction.pointerType === pointerType)) {\n while (element) {\n // if the element is the interaction element\n if (element === interaction.element) {\n return interaction;\n }\n element = utils.parentNode(element);\n }\n }\n }\n\n return null;\n },\n\n // if it's a mouse or pen interaction\n mouseOrPen: function ({ pointerId, pointerType, eventType }) {\n if (pointerType !== 'mouse' && pointerType !== 'pen') {\n return null;\n }\n\n let firstNonActive;\n\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType) {\n // if it's a down event, skip interactions with running simulations\n if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; }\n\n // if the interaction is active, return it immediately\n if (interaction.interacting()) {\n return interaction;\n }\n // otherwise save it and look for another active interaction\n else if (!firstNonActive) {\n firstNonActive = interaction;\n }\n }\n }\n\n // if no active mouse interaction was found use the first inactive mouse\n // interaction\n if (firstNonActive) {\n return firstNonActive;\n }\n\n // find any mouse or pen interaction.\n // ignore the interaction if the eventType is a *down, and a simulation\n // is active\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType && !(/down/i.test(eventType) && interaction.simulation)) {\n return interaction;\n }\n }\n\n return null;\n },\n\n // get interaction that has this pointer\n hasPointer: function ({ pointerId }) {\n for (const interaction of scope.interactions) {\n if (utils.contains(interaction.pointerIds, pointerId)) {\n return interaction;\n }\n }\n },\n\n // get first idle interaction with a matching pointerType\n idle: function ({ pointerType }) {\n for (const interaction of scope.interactions) {\n // if there's already a pointer held down\n if (interaction.pointerIds.length === 1) {\n const target = interaction.target;\n // don't add this pointer if there is a target interactable and it\n // isn't gesturable\n if (target && !target.options.gesture.enabled) {\n continue;\n }\n }\n // maximum of 2 pointers per interaction\n else if (interaction.pointerIds.length >= 2) {\n continue;\n }\n\n if (!interaction.interacting() && (pointerType === interaction.pointerType)) {\n return interaction;\n }\n }\n\n return null;\n },\n};\n\nmodule.exports = finder;\n","const win = require('./window');\nconst isWindow = require('./isWindow');\n\nconst is = {\n array : () => {},\n\n window : thing => thing === win.window || isWindow(thing),\n\n docFrag : thing => is.object(thing) && thing.nodeType === 11,\n\n object : thing => !!thing && (typeof thing === 'object'),\n\n function: thing => typeof thing === 'function',\n\n number : thing => typeof thing === 'number' ,\n\n bool : thing => typeof thing === 'boolean' ,\n\n string : thing => typeof thing === 'string' ,\n\n element: thing => {\n if (!thing || (typeof thing !== 'object')) { return false; }\n\n const _window = win.getWindow(thing) || win.window;\n\n return (/object|function/.test(typeof _window.Element)\n ? thing instanceof _window.Element //DOM2\n : thing.nodeType === 1 && typeof thing.nodeName === 'string');\n },\n};\n\nis.array = thing => (is.object(thing)\n && (typeof thing.length !== 'undefined')\n && is.function(thing.splice));\n\nmodule.exports = is;\n","module.exports = (thing) => !!(thing && thing.Window) && (thing instanceof thing.Window);\n","function pointerExtend (dest, source) {\n for (const prop in source) {\n const prefixedPropREs = module.exports.prefixedPropREs;\n let deprecated = false;\n\n // skip deprecated prefixed properties\n for (const vendor in prefixedPropREs) {\n if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) {\n deprecated = true;\n break;\n }\n }\n\n if (!deprecated && typeof source[prop] !== 'function') {\n dest[prop] = source[prop];\n }\n }\n return dest;\n}\n\npointerExtend.prefixedPropREs = {\n webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/,\n};\n\nmodule.exports = pointerExtend;\n","const hypot = require('./hypot');\nconst browser = require('./browser');\nconst dom = require('./domObjects');\nconst domUtils = require('./domUtils');\nconst domObjects = require('./domObjects');\nconst is = require('./is');\nconst pointerExtend = require('./pointerExtend');\n\nconst pointerUtils = {\n copyCoords: function (dest, src) {\n dest.page = dest.page || {};\n dest.page.x = src.page.x;\n dest.page.y = src.page.y;\n\n dest.client = dest.client || {};\n dest.client.x = src.client.x;\n dest.client.y = src.client.y;\n\n dest.timeStamp = src.timeStamp;\n },\n\n setCoordDeltas: function (targetObj, prev, cur) {\n targetObj.page.x = cur.page.x - prev.page.x;\n targetObj.page.y = cur.page.y - prev.page.y;\n targetObj.client.x = cur.client.x - prev.client.x;\n targetObj.client.y = cur.client.y - prev.client.y;\n targetObj.timeStamp = cur.timeStamp - prev.timeStamp;\n\n // set pointer velocity\n const dt = Math.max(targetObj.timeStamp / 1000, 0.001);\n\n targetObj.page.speed = hypot(targetObj.page.x, targetObj.page.y) / dt;\n targetObj.page.vx = targetObj.page.x / dt;\n targetObj.page.vy = targetObj.page.y / dt;\n\n targetObj.client.speed = hypot(targetObj.client.x, targetObj.page.y) / dt;\n targetObj.client.vx = targetObj.client.x / dt;\n targetObj.client.vy = targetObj.client.y / dt;\n },\n\n isNativePointer: function (pointer) {\n return (pointer instanceof dom.Event || pointer instanceof dom.Touch);\n },\n\n // Get specified X/Y coords for mouse or event.touches[0]\n getXY: function (type, pointer, xy) {\n xy = xy || {};\n type = type || 'page';\n\n xy.x = pointer[type + 'X'];\n xy.y = pointer[type + 'Y'];\n\n return xy;\n },\n\n getPageXY: function (pointer, page) {\n page = page || {};\n\n // Opera Mobile handles the viewport and scrolling oddly\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n pointerUtils.getXY('screen', pointer, page);\n\n page.x += window.scrollX;\n page.y += window.scrollY;\n }\n else {\n pointerUtils.getXY('page', pointer, page);\n }\n\n return page;\n },\n\n getClientXY: function (pointer, client) {\n client = client || {};\n\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n // Opera Mobile handles the viewport and scrolling oddly\n pointerUtils.getXY('screen', pointer, client);\n }\n else {\n pointerUtils.getXY('client', pointer, client);\n }\n\n return client;\n },\n\n getPointerId: function (pointer) {\n return is.number(pointer.pointerId)? pointer.pointerId : pointer.identifier;\n },\n\n setCoords: function (targetObj, pointers, timeStamp) {\n const pointer = (pointers.length > 1\n ? pointerUtils.pointerAverage(pointers)\n : pointers[0]);\n\n const tmpXY = {};\n\n pointerUtils.getPageXY(pointer, tmpXY);\n targetObj.page.x = tmpXY.x;\n targetObj.page.y = tmpXY.y;\n\n pointerUtils.getClientXY(pointer, tmpXY);\n targetObj.client.x = tmpXY.x;\n targetObj.client.y = tmpXY.y;\n\n targetObj.timeStamp = is.number(timeStamp) ? timeStamp :new Date().getTime();\n },\n\n pointerExtend: pointerExtend,\n\n getTouchPair: function (event) {\n const touches = [];\n\n // array of touches is supplied\n if (is.array(event)) {\n touches[0] = event[0];\n touches[1] = event[1];\n }\n // an event\n else {\n if (event.type === 'touchend') {\n if (event.touches.length === 1) {\n touches[0] = event.touches[0];\n touches[1] = event.changedTouches[0];\n }\n else if (event.touches.length === 0) {\n touches[0] = event.changedTouches[0];\n touches[1] = event.changedTouches[1];\n }\n }\n else {\n touches[0] = event.touches[0];\n touches[1] = event.touches[1];\n }\n }\n\n return touches;\n },\n\n pointerAverage: function (pointers) {\n const average = {\n pageX : 0,\n pageY : 0,\n clientX: 0,\n clientY: 0,\n screenX: 0,\n screenY: 0,\n };\n\n for (const pointer of pointers) {\n for (const prop in average) {\n average[prop] += pointer[prop];\n }\n }\n for (const prop in average) {\n average[prop] /= pointers.length;\n }\n\n return average;\n },\n\n touchBBox: function (event) {\n if (!event.length && !(event.touches && event.touches.length > 1)) {\n return;\n }\n\n const touches = pointerUtils.getTouchPair(event);\n const minX = Math.min(touches[0].pageX, touches[1].pageX);\n const minY = Math.min(touches[0].pageY, touches[1].pageY);\n const maxX = Math.max(touches[0].pageX, touches[1].pageX);\n const maxY = Math.max(touches[0].pageY, touches[1].pageY);\n\n return {\n x: minX,\n y: minY,\n left: minX,\n top: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n },\n\n touchDistance: function (event, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n\n\n const dx = touches[0][sourceX] - touches[1][sourceX];\n const dy = touches[0][sourceY] - touches[1][sourceY];\n\n return hypot(dx, dy);\n },\n\n touchAngle: function (event, prevAngle, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n const dx = touches[1][sourceX] - touches[0][sourceX];\n const dy = touches[1][sourceY] - touches[0][sourceY];\n const angle = 180 * Math.atan2(dy , dx) / Math.PI;\n\n return angle;\n },\n\n getPointerType: function (pointer) {\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : is.number(pointer.pointerType)\n ? [undefined, undefined,'touch', 'pen', 'mouse'][pointer.pointerType]\n // if the PointerEvent API isn't available, then the \"pointer\" must\n // be either a MouseEvent, TouchEvent, or Touch object\n : /touch/.test(pointer.type) || pointer instanceof domObjects.Touch\n ? 'touch'\n : 'mouse';\n },\n\n // [ event.target, event.currentTarget ]\n getEventTargets: function (event) {\n return [\n domUtils.getActualElement(event.path ? event.path[0] : event.target),\n domUtils.getActualElement(event.currentTarget),\n ];\n },\n};\n\nmodule.exports = pointerUtils;\n","const { window } = require('./window');\n\nconst vendors = ['ms', 'moz', 'webkit', 'o'];\nlet lastTime = 0;\nlet request;\nlet cancel;\n\nfor (let x = 0; x < vendors.length && !window.requestAnimationFrame; x++) {\n request = window[vendors[x] + 'RequestAnimationFrame'];\n cancel = window[vendors[x] +'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n}\n\nif (!request) {\n request = function (callback) {\n const currTime = new Date().getTime();\n const timeToCall = Math.max(0, 16 - (currTime - lastTime));\n const id = setTimeout(function () { callback(currTime + timeToCall); },\n timeToCall);\n\n lastTime = currTime + timeToCall;\n return id;\n };\n}\n\nif (!cancel) {\n cancel = function (id) {\n clearTimeout(id);\n };\n}\n\nmodule.exports = {\n request,\n cancel,\n};\n","const extend = require('./extend');\nconst is = require('./is');\nconst {\n closest,\n parentNode,\n getElementRect,\n} = require('./domUtils');\n\nconst rectUtils = {\n getStringOptionResult: function (value, interactable, element) {\n if (!is.string(value)) {\n return null;\n }\n\n if (value === 'parent') {\n value = parentNode(element);\n }\n else if (value === 'self') {\n value = interactable.getRect(element);\n }\n else {\n value = closest(element, value);\n }\n\n return value;\n },\n\n resolveRectLike: function (value, interactable, element, functionArgs) {\n value = rectUtils.getStringOptionResult(value, interactable, element) || value;\n\n if (is.function(value)) {\n value = value.apply(null, functionArgs);\n }\n\n if (is.element(value)) {\n value = getElementRect(value);\n }\n\n return value;\n },\n\n rectToXY: function (rect) {\n return rect && {\n x: 'x' in rect ? rect.x : rect.left,\n y: 'y' in rect ? rect.y : rect.top,\n };\n },\n\n xywhToTlbr: function (rect) {\n if (rect && !('left' in rect && 'top' in rect)) {\n rect = extend({}, rect);\n\n rect.left = rect.x || 0;\n rect.top = rect.y || 0;\n rect.right = rect.right || (rect.left + rect.width);\n rect.bottom = rect.bottom || (rect.top + rect.height);\n }\n\n return rect;\n },\n\n tlbrToXywh: function (rect) {\n if (rect && !('x' in rect && 'y' in rect)) {\n rect = extend({}, rect);\n\n rect.x = rect.left || 0;\n rect.top = rect.top || 0;\n rect.width = rect.width || (rect.right - rect.x);\n rect.height = rect.height || (rect.bottom - rect.y);\n }\n\n return rect;\n },\n};\n\nmodule.exports = rectUtils;\n","const win = module.exports;\nconst isWindow = require('./isWindow');\n\nfunction init (window) {\n // get wrapped window if using Shadow DOM polyfill\n\n win.realWindow = window;\n\n // create a TextNode\n const el = window.document.createTextNode('');\n\n // check if it's wrapped by a polyfill\n if (el.ownerDocument !== window.document\n && typeof window.wrap === 'function'\n && window.wrap(el) === el) {\n // use wrapped window\n window = window.wrap(window);\n }\n\n win.window = window;\n}\n\nif (typeof window === 'undefined') {\n win.window = undefined;\n win.realWindow = undefined;\n}\nelse {\n init(window);\n}\n\nwin.getWindow = function getWindow (node) {\n if (isWindow(node)) {\n return node;\n }\n\n const rootNode = (node.ownerDocument || node);\n\n return rootNode.defaultView || rootNode.parentWindow || win.window;\n};\n\nwin.init = init;\n"]} \ No newline at end of file diff --git a/dist/interact.min.js b/dist/interact.min.js index c0bb2476c..2d1f0fb62 100644 --- a/dist/interact.min.js +++ b/dist/interact.min.js @@ -1,6 +1,6 @@ -/* interact.js v1.3.0-alpha.3+sha.9595c40 | https://raw.github.com/taye/interact.js/master/LICENSE */ -!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var t;t="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,t.interact=e()}}(function(){return function e(t,n,r){function i(s,a){if(!n[s]){if(!t[s]){var l="function"==typeof require&&require;if(!a&&l)return l(s,!0);if(o)return o(s,!0);var c=new Error("Cannot find module '"+s+"'");throw c.code="MODULE_NOT_FOUND",c}var p=n[s]={exports:{}};t[s][0].call(p.exports,function(e){var n=t[s][1][e];return i(n||e)},p,p.exports,e,t,n,r)}return n[s].exports}for(var o="function"==typeof require&&require,s=0;s6&&void 0!==arguments[6]&&arguments[6];r(this,e);var f=t.target,v=(f&&f.options||s).deltaSource,g=o(f,p,l),h="start"===c,m="end"===c,y=h?t.startCoords:t.curCoords,x=t.prevEvent;p=p||t.element;var b=i({},y.page),w=i({},y.client);b.x-=g.x,b.y-=g.y,w.x-=g.x,w.y-=g.y,this.ctrlKey=n.ctrlKey,this.altKey=n.altKey,this.shiftKey=n.shiftKey,this.metaKey=n.metaKey,this.button=n.button,this.buttons=n.buttons,this.target=p,this.currentTarget=p,this.relatedTarget=u||null,this.preEnd=d,this.type=l+(c||""),this.interaction=t,this.interactable=f,this.t0=h?t.downTimes[t.downTimes.length-1]:x.t0;var E={interaction:t,event:n,action:l,phase:c,element:p,related:u,page:b,client:w,coords:y,starting:h,ending:m,deltaSource:v,iEvent:this};a.fire("set-xy",E),m?(this.pageX=x.pageX,this.pageY=x.pageY,this.clientX=x.clientX,this.clientY=x.clientY):(this.pageX=b.x,this.pageY=b.y,this.clientX=w.x,this.clientY=w.y),this.x0=t.startCoords.page.x-g.x,this.y0=t.startCoords.page.y-g.y,this.clientX0=t.startCoords.client.x-g.x,this.clientY0=t.startCoords.client.y-g.y,a.fire("set-delta",E),this.timeStamp=y.timeStamp,this.dt=t.pointerDelta.timeStamp,this.duration=this.timeStamp-this.t0,this.speed=t.pointerDelta[v].speed,this.velocityX=t.pointerDelta[v].vx,this.velocityY=t.pointerDelta[v].vy,this.swipe=m||"inertiastart"===c?this.getSwipe():null,a.fire("new",E)}return e.prototype.getSwipe=function(){var e=this.interaction;if(e.prevEvent.speed<600||this.timeStamp-e.prevEvent.timeStamp>150)return null;var t=180*Math.atan2(e.prevEvent.velocityY,e.prevEvent.velocityX)/Math.PI;t<0&&(t+=360);var n=112.5<=t&&t<247.5,r=202.5<=t&&t<337.5,i=!n&&(292.5<=t||t<67.5);return{up:r,down:!r&&22.5<=t&&t<157.5,left:n,right:i,angle:t,speed:e.prevEvent.speed,velocity:{x:e.prevEvent.velocityX,y:e.prevEvent.velocityY}}},e.prototype.preventDefault=function(){},e.prototype.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},e.prototype.stopPropagation=function(){this.propagationStopped=!0},e}();a.on("set-delta",function(e){var t=e.iEvent,n=e.interaction,r=e.starting,i=e.deltaSource,o=r?t:n.prevEvent;"client"===i?(t.dx=t.clientX-o.clientX,t.dy=t.clientY-o.clientY):(t.dx=t.pageX-o.pageX,t.dy=t.pageY-o.pageY)}),l.signals=a,t.exports=l},{"./defaultOptions":18,"./utils/Signals":35,"./utils/extend":41,"./utils/getOriginXY":42}],4:[function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=e("./utils/is"),o=e("./utils/events"),s=e("./utils/extend"),a=e("./actions/base"),l=e("./scope"),c=e("./Eventable"),p=e("./defaultOptions"),u=e("./utils/Signals").new(),d=e("./utils/domUtils"),f=d.getElementRect,v=d.nodeContains,g=d.trySelector,h=e("./utils/window"),m=h.getWindow,y=e("./utils/arr"),x=y.indexOf,b=y.contains,w=e("./utils/browser"),E=w.wheelEvent;l.interactables=[];var S=function(){function e(t,n){r(this,e),n=n||{},this.target=t,this.events=new c,this._context=n.context||l.document,this._win=m(g(t)?this._context:t),this._doc=this._win.document,u.fire("new",{target:t,options:n,interactable:this,win:this._win}),l.addDocument(this._doc,this._win),l.interactables.push(this),this.set(n)}return e.prototype.setOnEvents=function(e,t){var n="on"+e;return i.function(t.onstart)&&(this.events[n+"start"]=t.onstart),i.function(t.onmove)&&(this.events[n+"move"]=t.onmove),i.function(t.onend)&&(this.events[n+"end"]=t.onend),i.function(t.oninertiastart)&&(this.events[n+"inertiastart"]=t.oninertiastart),this},e.prototype.setPerAction=function(e,t){for(var n in t)n in p[e]&&(i.object(t[n])?(this.options[e][n]=s(this.options[e][n]||{},t[n]),i.object(p.perAction[n])&&"enabled"in p.perAction[n]&&(this.options[e][n].enabled=!1!==t[n].enabled)):i.bool(t[n])&&i.object(p.perAction[n])?this.options[e][n].enabled=t[n]:void 0!==t[n]&&(this.options[e][n]=t[n]))},e.prototype.getRect=function(e){return e=e||this.target,i.string(this.target)&&!i.element(e)&&(e=this._context.querySelector(this.target)),f(e)},e.prototype.rectChecker=function(e){return i.function(e)?(this.getRect=e,this):null===e?(delete this.options.getRect,this):this.getRect},e.prototype._backCompatOption=function(e,t){if(g(t)||i.object(t)){this.options[e]=t;for(var n=a.names,r=Array.isArray(n),o=0,n=r?n:n[Symbol.iterator]();;){var s;if(r){if(o>=n.length)break;s=n[o++]}else{if(o=n.next(),o.done)break;s=o.value}var l=s;this.options[l][e]=t}return this}return this.options[e]},e.prototype.origin=function(e){return this._backCompatOption("origin",e)},e.prototype.deltaSource=function(e){return"page"===e||"client"===e?(this.options.deltaSource=e,this):this.options.deltaSource},e.prototype.context=function(){return this._context},e.prototype.inContext=function(e){return this._context===e.ownerDocument||v(this._context,e)},e.prototype.fire=function(e){return this.events.fire(e),this},e.prototype._onOffMultiple=function(e,t,n,r){if(i.string(t)&&-1!==t.search(" ")&&(t=t.trim().split(/ +/)),i.array(t)){for(var o=0;o=l.length)break;f=l[d++]}else{if(d=l.next(),d.done)break;f=d.value}var v=f;this.options[v]=p.base[v],v in t&&this[v](t[v])}return u.fire("set",{options:t,interactable:this}),this},e.prototype.unset=function(){if(o.remove(this.target,"all"),i.string(this.target))for(var e in o.delegatedEvents){var t=o.delegatedEvents[e];t.selectors[0]===this.target&&t.contexts[0]===this._context&&(t.selectors.splice(0,1),t.contexts.splice(0,1),t.listeners.splice(0,1),t.selectors.length||(t[e]=null)),o.remove(this._context,e,o.delegateListener),o.remove(this._context,e,o.delegateUseCapture,!0)}else o.remove(this,"all");u.fire("unset",{interactable:this}),l.interactables.splice(x(l.interactables,this),1);for(var n=l.interactions||[],r=Array.isArray(n),s=0,n=r?n:n[Symbol.iterator]();;){var a;if(r){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var c=a;c.target===this&&c.interacting()&&c.stop()}return l.interact},e}();l.interactables.indexOfElement=function(e,t){t=t||l.document;for(var n=0;n=y.length)break;w=y[b++]}else{if(b=y.next(),b.done)break;w=b.value}var E=w,S=E[0],T=E[1];T._updateEventTargets(r,i),T[e](S,t,r,i)}}}function o(e){for(var t=0;te.pointerMoveTolerance);var a={pointer:t,pointerIndex:this.getPointerIndex(t),event:n,eventTarget:r,dx:o,dy:s,duplicate:i,interaction:this,interactingBeforeMove:this.interacting()};i||l.setCoordDeltas(this.pointerDelta,this.prevCoords,this.curCoords),d.fire("move",a),i||(this.interacting()&&this.doMove(a),this.pointerWasMoved&&l.copyCoords(this.prevCoords,this.curCoords))},e.prototype.doMove=function(e){e=l.extend({pointer:this.pointers[0],event:this.prevEvent,eventTarget:this._eventTarget,interaction:this},e||{}),d.fire("before-action-move",e),this._dontFireMove||d.fire("action-move",e),this._dontFireMove=!1},e.prototype.pointerUp=function(e,t,n,r){var i=this.getPointerIndex(e);d.fire(/cancel$/i.test(t.type)?"cancel":"up",{pointer:e,pointerIndex:i,event:t,eventTarget:n,curEventTarget:r,interaction:this}),this.simulation||this.end(t),this.pointerIsDown=!1,this.removePointer(e,t)},e.prototype.end=function(e){e=e||this.prevEvent,this.interacting()&&d.fire("action-end",{event:e,interaction:this}),this.stop()},e.prototype.currentAction=function(){return this._interacting?this.prepared.name:null},e.prototype.interacting=function(){return this._interacting},e.prototype.stop=function(){d.fire("stop",{interaction:this}),this._interacting&&(d.fire("stop-active",{interaction:this}),d.fire("stop-"+this.prepared.name,{interaction:this})),this.target=this.element=null,this._interacting=!1,this.prepared.name=this.prevEvent=null},e.prototype.getPointerIndex=function(e){return l.indexOf(this.pointerIds,l.getPointerId(e))},e.prototype.updatePointer=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:t&&/(down|start)$/i.test(t.type),r=l.getPointerId(e),i=this.getPointerIndex(e);return-1===i&&(i=this.pointerIds.length,this.pointerIds[i]=r),n&&d.fire("update-pointer-down",{pointer:e,event:t,down:n,pointerId:r,pointerIndex:i,interaction:this}),this.pointers[i]=e,i},e.prototype.removePointer=function(e,t){var n=l.getPointerId(e),r=this.mouse?0:l.indexOf(this.pointerIds,n);-1!==r&&(d.fire("remove-pointer",{pointer:e,event:t,pointerIndex:r,interaction:this}),this.pointers.splice(r,1),this.pointerIds.splice(r,1),this.downTargets.splice(r,1),this.downTimes.splice(r,1))},e.prototype._updateEventTargets=function(e,t){this._eventTarget=e,this._curEventTarget=t},e}(),m=0,y=v.length;m=i.length)break;a=i[s++]}else{if(s=i.next(),s.done)break;a=s.value}var l=a;if(l.options.drop.enabled){var c=l.options.drop.accept;if(!(p.is.element(c)&&c!==t||p.is.string(c)&&!p.matchesSelector(t,c)))for(var d=p.is.string(l.target)?l._context.querySelectorAll(l.target):[l.target],f=0;fo.left&&c.xo.top&&c.y=o.left&&v<=o.right&&g>=o.top&&g<=o.bottom}if(f&&p.is.number(a)){s=Math.max(0,Math.min(o.right,f.right)-Math.max(o.left,f.left))*Math.max(0,Math.min(o.bottom,f.bottom)-Math.max(o.top,f.top))/(f.width*f.height)>=a}return this.options.drop.checker&&(s=this.options.drop.checker(e,t,s,this,i,n,r)),s},v.signals.on("unset",function(e){e.interactable.dropzone(!1)}),v.settingsMethods.push("dropChecker"),g.signals.on("new",function(e){e.dropTarget=null,e.dropElement=null,e.prevDropTarget=null,e.prevDropElement=null,e.dropEvents=null,e.activeDrops={dropzones:[],elements:[],rects:[]}}),g.signals.on("stop",function(e){var t=e.interaction;t.dropTarget=t.dropElement=t.prevDropTarget=t.prevDropElement=null}),d.dynamicDrop=function(e){return p.is.bool(e)?(y=e,d):y},p.merge(v.eventTypes,["dragenter","dragleave","dropactivate","dropdeactivate","dropmove","drop"]),c.methodDict.drop="dropzone",h.drop=m.defaults,t.exports=m},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../interact":21,"../scope":34,"../utils":44,"./base":6}],9:[function(e,t,n){"use strict";var r=e("./base"),i=e("../utils"),o=e("../InteractEvent"),s=e("../Interactable"),a=e("../Interaction"),l=e("../defaultOptions"),c={defaults:{enabled:!1,origin:null,restrict:null},checker:function(e,t,n,r,i){return i.pointerIds.length>=2?{name:"gesture"}:null},getCursor:function(){return""}};o.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;"gesturestart"===t.type&&(t.ds=0,n.gesture.startDistance=n.gesture.prevDistance=t.distance,n.gesture.startAngle=n.gesture.prevAngle=t.angle,n.gesture.scale=1)}),o.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;"gesturemove"===t.type&&(t.ds=t.scale-n.gesture.scale,n.target.fire(t),n.gesture.prevAngle=t.angle,n.gesture.prevDistance=t.distance,t.scale===1/0||null===t.scale||void 0===t.scale||isNaN(t.scale)||(n.gesture.scale=t.scale))}),s.prototype.gesturable=function(e){return i.is.object(e)?(this.options.gesture.enabled=!1!==e.enabled,this.setPerAction("gesture",e),this.setOnEvents("gesture",e),this):i.is.bool(e)?(this.options.gesture.enabled=e,e||(this.ongesturestart=this.ongesturestart=this.ongestureend=null),this):this.options.gesture},o.signals.on("set-delta",function(e){var t=e.interaction,n=e.iEvent,r=e.action,s=e.event,a=e.starting,l=e.ending,c=e.deltaSource;if("gesture"===r){var p=t.pointers;n.touches=[p[0],p[1]],a?(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=1,n.ds=0,n.angle=i.touchAngle(p,void 0,c),n.da=0):l||s instanceof o?(n.distance=t.prevEvent.distance,n.box=t.prevEvent.box,n.scale=t.prevEvent.scale,n.ds=n.scale-1,n.angle=t.prevEvent.angle,n.da=n.angle-t.gesture.startAngle):(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=n.distance/t.gesture.startDistance,n.angle=i.touchAngle(p,t.gesture.prevAngle,c),n.ds=n.scale-t.gesture.prevScale,n.da=n.angle-t.gesture.prevAngle)}}),a.signals.on("new",function(e){e.gesture={start:{x:0,y:0},startDistance:0,prevDistance:0,distance:0,scale:1,startAngle:0,prevAngle:0}}),r.gesture=c,r.names.push("gesture"),i.merge(s.eventTypes,["gesturestart","gesturemove","gestureend"]),r.methodDict.gesture="gesturable",l.gesture=c.defaults,t.exports=c},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"./base":6}],10:[function(e,t,n){"use strict";function r(e,t,n,r,i,s,a){if(!t)return!1;if(!0===t){var l=o.is.number(s.width)?s.width:s.right-s.left,c=o.is.number(s.height)?s.height:s.bottom-s.top;if(l<0&&("left"===e?e="right":"right"===e&&(e="left")),c<0&&("top"===e?e="bottom":"bottom"===e&&(e="top")),"left"===e)return n.x<(l>=0?s.left:s.right)+a;if("top"===e)return n.y<(c>=0?s.top:s.bottom)+a;if("right"===e)return n.x>(l>=0?s.right:s.left)-a;if("bottom"===e)return n.y>(c>=0?s.bottom:s.top)-a}return!!o.is.element(r)&&(o.is.element(t)?t===r:o.matchesUpTo(r,t,i))}var i=e("./base"),o=e("../utils"),s=e("../utils/browser"),a=e("../InteractEvent"),l=e("../Interactable"),c=e("../Interaction"),p=e("../defaultOptions"),u=s.supportsTouch||s.supportsPointerEvent?20:10,d={defaults:{enabled:!1,mouseButtons:null,origin:null,snap:null,restrict:null,inertia:null,autoScroll:null,square:!1,preserveAspectRatio:!1,axis:"xy",margin:NaN,edges:null,invert:"none"},checker:function(e,t,n,i,s,a){if(!a)return null;var l=o.extend({},s.curCoords.page),c=n.options;if(c.resize.enabled){var p=c.resize,d={left:!1,right:!1,top:!1,bottom:!1};if(o.is.object(p.edges)){for(var f in d)d[f]=r(f,p.edges[f],l,s._eventTarget,i,a,p.margin||u);if(d.left=d.left&&!d.right,d.top=d.top&&!d.bottom,d.left||d.right||d.top||d.bottom)return{name:"resize",edges:d}}else{var v="y"!==c.resize.axis&&l.x>a.right-u,g="x"!==c.resize.axis&&l.y>a.bottom-u;if(v||g)return{name:"resize",axes:(v?"x":"")+(g?"y":"")}}}return null},cursors:s.isIe9OrOlder?{x:"e-resize",y:"s-resize",xy:"se-resize",top:"n-resize",left:"w-resize",bottom:"s-resize",right:"e-resize",topleft:"se-resize",bottomright:"se-resize",topright:"ne-resize",bottomleft:"ne-resize"}:{x:"ew-resize",y:"ns-resize",xy:"nwse-resize",top:"ns-resize",left:"ew-resize",bottom:"ns-resize",right:"ew-resize",topleft:"nwse-resize",bottomright:"nwse-resize",topright:"nesw-resize",bottomleft:"nesw-resize"},getCursor:function(e){if(e.axis)return d.cursors[e.name+e.axis];if(e.edges){for(var t="",n=["top","bottom","left","right"],r=0;r<4;r++)e.edges[n[r]]&&(t+=n[r]);return d.cursors[t]}}};a.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;if("resizestart"===t.type&&n.prepared.edges){var r=n.target.getRect(n.element),i=n.target.options.resize;if(i.square||i.preserveAspectRatio){var s=o.extend({},n.prepared.edges);s.top=s.top||s.left&&!s.bottom,s.left=s.left||s.top&&!s.right,s.bottom=s.bottom||s.right&&!s.top,s.right=s.right||s.bottom&&!s.left,n.prepared._linkedEdges=s}else n.prepared._linkedEdges=null;i.preserveAspectRatio&&(n.resizeStartAspectRatio=r.width/r.height),n.resizeRects={start:r,current:o.extend({},r),inverted:o.extend({},r),previous:o.extend({},r),delta:{left:0,right:0,width:0,top:0,bottom:0,height:0}},t.rect=n.resizeRects.inverted,t.deltaRect=n.resizeRects.delta}}),a.signals.on("new",function(e){var t=e.iEvent,n=e.phase,r=e.interaction;if("move"===n&&r.prepared.edges){var i=r.target.options.resize,s=i.invert,a="reposition"===s||"negate"===s,l=r.prepared.edges,c=r.resizeRects.start,p=r.resizeRects.current,u=r.resizeRects.inverted,d=r.resizeRects.delta,f=o.extend(r.resizeRects.previous,u),v=l,g=t.dx,h=t.dy;if(i.preserveAspectRatio||i.square){var m=i.preserveAspectRatio?r.resizeStartAspectRatio:1;l=r.prepared._linkedEdges,v.left&&v.bottom||v.right&&v.top?h=-g/m:v.left||v.right?h=g/m:(v.top||v.bottom)&&(g=h*m)}if(l.top&&(p.top+=h),l.bottom&&(p.bottom+=h),l.left&&(p.left+=g),l.right&&(p.right+=g),a){if(o.extend(u,p),"reposition"===s){var y=void 0;u.top>u.bottom&&(y=u.top,u.top=u.bottom,u.bottom=y),u.left>u.right&&(y=u.left,u.left=u.right,u.right=y)}}else u.top=Math.min(p.top,c.bottom),u.bottom=Math.max(p.bottom,c.top),u.left=Math.min(p.left,c.right),u.right=Math.max(p.right,c.left);u.width=u.right-u.left,u.height=u.bottom-u.top;for(var x in u)d[x]=u[x]-f[x];t.edges=r.prepared.edges,t.rect=u,t.deltaRect=d}}),l.prototype.resizable=function(e){return o.is.object(e)?(this.options.resize.enabled=!1!==e.enabled,this.setPerAction("resize",e),this.setOnEvents("resize",e),/^x$|^y$|^xy$/.test(e.axis)?this.options.resize.axis=e.axis:null===e.axis&&(this.options.resize.axis=p.resize.axis),o.is.bool(e.preserveAspectRatio)?this.options.resize.preserveAspectRatio=e.preserveAspectRatio:o.is.bool(e.square)&&(this.options.resize.square=e.square),this):o.is.bool(e)?(this.options.resize.enabled=e,e||(this.onresizestart=this.onresizestart=this.onresizeend=null),this):this.options.resize},c.signals.on("new",function(e){ -e.resizeAxes="xy"}),a.signals.on("set-delta",function(e){var t=e.interaction,n=e.iEvent;"resize"===e.action&&t.resizeAxes&&(t.target.options.resize.square?("y"===t.resizeAxes?n.dx=n.dy:n.dy=n.dx,n.axes="xy"):(n.axes=t.resizeAxes,"x"===t.resizeAxes?n.dy=0:"y"===t.resizeAxes&&(n.dx=0)))}),i.resize=d,i.names.push("resize"),o.merge(l.eventTypes,["resizestart","resizemove","resizeinertiastart","resizeinertiaresume","resizeend"]),i.methodDict.resize="resizable",p.resize=d.defaults,t.exports=d},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"../utils/browser":37,"./base":6}],11:[function(e,t,n){"use strict";var r=e("./utils/raf"),i=e("./utils/window").getWindow,o=e("./utils/is"),s=e("./utils/domUtils"),a=e("./Interaction"),l=e("./defaultOptions"),c={defaults:{enabled:!1,container:null,margin:60,speed:300},interaction:null,i:null,x:0,y:0,isScrolling:!1,prevTime:0,start:function(e){c.isScrolling=!0,r.cancel(c.i),c.interaction=e,c.prevTime=(new Date).getTime(),c.i=r.request(c.scroll)},stop:function(){c.isScrolling=!1,r.cancel(c.i)},scroll:function(){var e=c.interaction.target.options[c.interaction.prepared.name].autoScroll,t=e.container||i(c.interaction.element),n=(new Date).getTime(),s=(n-c.prevTime)/1e3,a=e.speed*s;a>=1&&(o.window(t)?t.scrollBy(c.x*a,c.y*a):t&&(t.scrollLeft+=c.x*a,t.scrollTop+=c.y*a),c.prevTime=n),c.isScrolling&&(r.cancel(c.i),c.i=r.request(c.scroll))},check:function(e,t){var n=e.options;return n[t].autoScroll&&n[t].autoScroll.enabled},onInteractionMove:function(e){var t=e.interaction,n=e.pointer;if(t.interacting()&&c.check(t.target,t.prepared.name)){if(t.simulation)return void(c.x=c.y=0);var r=void 0,a=void 0,l=void 0,p=void 0,u=t.target.options[t.prepared.name].autoScroll,d=u.container||i(t.element);if(o.window(d))p=n.clientXd.innerWidth-c.margin,l=n.clientY>d.innerHeight-c.margin;else{var f=s.getElementClientRect(d);p=n.clientXf.right-c.margin,l=n.clientY>f.bottom-c.margin}c.x=a?1:p?-1:0,c.y=l?1:r?-1:0,c.isScrolling||(c.margin=u.margin,c.speed=u.speed,c.start(t))}}};a.signals.on("stop-active",function(){c.stop()}),a.signals.on("action-move",c.onInteractionMove),l.perAction.autoScroll=c.defaults,t.exports=c},{"./Interaction":5,"./defaultOptions":18,"./utils/domUtils":39,"./utils/is":46,"./utils/raf":50,"./utils/window":52}],12:[function(e,t,n){"use strict";var r=e("../Interactable"),i=e("../actions/base"),o=e("../utils/is"),s=e("../utils/domUtils");r.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},r.prototype.ignoreFrom=function(e){return this._backCompatOption("ignoreFrom",e)},r.prototype.allowFrom=function(e){return this._backCompatOption("allowFrom",e)},r.prototype.testIgnore=function(e,t,n){return!(!e||!o.element(n))&&(o.string(e)?s.matchesUpTo(n,e,t):!!o.element(e)&&s.nodeContains(e,n))},r.prototype.testAllow=function(e,t,n){return!e||!!o.element(n)&&(o.string(e)?s.matchesUpTo(n,e,t):!!o.element(e)&&s.nodeContains(e,n))},r.prototype.testIgnoreAllow=function(e,t,n){return!this.testIgnore(e.ignoreFrom,t,n)&&this.testAllow(e.allowFrom,t,n)},r.prototype.actionChecker=function(e){return o.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},r.prototype.styleCursor=function(e){return o.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},r.prototype.defaultActionChecker=function(e,t,n,r){for(var o=this.getRect(r),s=null,a=i.names,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var u=p;if((!n.pointerIsDown||!n.mouse||0!=(t.buttons&this.options[u].mouseButtons))&&(s=i[u].checker(e,t,this,r,n,o)))return s}}},{"../Interactable":4,"../actions/base":6,"../utils/domUtils":39,"../utils/is":46}],13:[function(e,t,n){"use strict";function r(e,t,n,r){return g.is.object(e)&&t.testIgnoreAllow(t.options[e.name],n,r)&&t.options[e.name].enabled&&a(t,n,e)?e:null}function i(e,t,n,i,o,s){for(var a=0,l=i.length;a=m.maxInteractions)return!1;if(u.target===e){if((a+=d===n.name|0)>=i)return!1;if(u.element===t&&(l++,d!==n.name||l>=o))return!1}}}return m.maxInteractions>0}}var l=e("../interact"),c=e("../Interactable"),p=e("../Interaction"),u=e("../actions/base"),d=e("../defaultOptions"),f=e("../utils/browser"),v=e("../scope"),g=e("../utils"),h=e("../utils/Signals").new();e("./InteractableMethods");var m={signals:h,withinInteractionLimit:a,maxInteractions:1/0,defaults:{perAction:{manualStart:!1,max:1/0,maxPerElement:1,allowFrom:null,ignoreFrom:null}},setActionDefaults:function(e){g.extend(e.defaults,m.defaults.perAction)}};p.signals.on("down",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;if(!t.interacting()){s(t,o(t,n,r,i))}}),p.signals.on("move",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;if(t.mouse&&!t.pointerIsDown&&!t.interacting()){s(t,o(t,n,r,i))}}),p.signals.on("move",function(e){var t=e.interaction,n=e.event;if(t.pointerIsDown&&!t.interacting()&&t.pointerWasMoved&&t.prepared.name){h.fire("before-start",e);var r=t.target;t.prepared.name&&r&&(r.options[t.prepared.name].manualStart||!a(r,t.element,t.prepared)?t.stop(n):t.start(t.prepared,r,t.element))}}),p.signals.on("stop",function(e){var t=e.interaction,n=t.target;n&&n.options.styleCursor&&(n._doc.documentElement.style.cursor="")}),c.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},c.prototype.actionChecker=function(e){return g.is.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},c.prototype.styleCursor=function(e){return g.is.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},c.prototype.defaultActionChecker=function(e,t,n,r){for(var i=this.getRect(r),o=t.buttons||{0:1,1:4,3:8,4:16}[t.button],s=null,a=u.names,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var d=p;if((!n.pointerIsDown||!n.mouse||0!=(o&this.options[d].mouseButtons))&&(s=u[d].checker(e,t,this,r,n,i)))return s}},l.maxInteractions=function(e){return g.is.number(e)?(m.maxInteractions=e,this):m.maxInteractions},c.settingsMethods.push("styleCursor"),c.settingsMethods.push("actionChecker"),c.settingsMethods.push("ignoreFrom"),c.settingsMethods.push("allowFrom"),d.base.actionChecker=null,d.base.styleCursor=!0,g.extend(d.perAction,m.defaults.perAction),t.exports=m},{"../Interactable":4,"../Interaction":5,"../actions/base":6,"../defaultOptions":18,"../interact":21,"../scope":34,"../utils":44,"../utils/Signals":35,"../utils/browser":37,"./InteractableMethods":12}],14:[function(e,t,n){"use strict";var r=e("./base"),i=e("../Interaction");i.signals.on("new",function(e){e.delayTimer=null}),r.signals.on("prepared",function(e){var t=e.interaction,n=t.prepared.name;if(n){var r=t.target.options[n].delay;r>0&&(t.delayTimer=setTimeout(function(){t.start(t.prepared,t.target,t.element)},r))}}),i.signals.on("move",function(e){var t=e.interaction,n=e.duplicate;t.pointerWasMoved&&!n&&clearTimeout(t.delayTimer)}),r.signals.on("before-start",function(e){var t=e.interaction,n=t.prepared.name;if(n){t.target.options[n].delay>0&&(t.prepared.name=null)}})},{"../Interaction":5,"./base":13}],15:[function(e,t,n){"use strict";function r(e,t){if(!t)return!1;var n=t.options.drag.startAxis;return"xy"===e||"xy"===n||n===e}var i=e("./base"),o=e("../scope"),s=e("../utils/browser"),a=e("../utils/is"),l=e("../utils/domUtils"),c=l.matchesSelector,p=l.parentNode;i.setActionDefaults(e("../actions/drag")),i.signals.on("before-start",function(e){var t=e.interaction,n=e.eventTarget,l=e.dx,u=e.dy;if("drag"===t.prepared.name){var d=Math.abs(l),f=Math.abs(u),v=t.target.options.drag,g=v.startAxis,h=d>f?"x":dl.minSpeed&&g>l.endSpeed,b={interaction:t,pageCoords:v,statuses:f,preEnd:!0,requireEndOnly:!0};y&&!x&&(c.resetStatuses(f),m=c.setAll(b),m.shouldMove&&m.locked&&(h=!0)),(x||h)&&(p.copyCoords(i.upCoords,t.curCoords),t.pointers[0]=i.startEvent=new a(t,n,t.prepared.name,"inertiastart",t.element),i.t0=d,i.active=!0,i.allowResume=l.allowResume,t.simulation=i,o.fire(i.startEvent),x?(i.vx0=t.pointerDelta.client.vx,i.vy0=t.pointerDelta.client.vy,i.v0=g,r(t,i),p.extend(v,t.curCoords.page),v.x+=i.xe,v.y+=i.ye,c.resetStatuses(f),m=c.setAll(b),i.modifiedXe+=m.dx,i.modifiedYe+=m.dy,i.i=u.request(t.boundInertiaFrame)):(i.smoothEnd=!0,i.xe=m.dx,i.ye=m.dy,i.sx=i.sy=0,i.i=u.request(t.boundSmoothEndFrame)))}}),l.signals.on("stop-active",function(e){var t=e.interaction,n=t.inertiaStatus;n.active&&(u.cancel(n.i),n.active=!1,t.simulation=null)})},{"./InteractEvent":3,"./Interaction":5,"./modifiers":24,"./utils":44,"./utils/raf":50}],21:[function(e,t,n){"use strict";function r(e,t){var n=a.interactables.get(e,t);return n||(n=new l(e,t),n.events.global=p),n}var i=e("./utils/browser"),o=e("./utils/events"),s=e("./utils"),a=e("./scope"),l=e("./Interactable"),c=e("./Interaction"),p={};r.isSet=function(e,t){return-1!==a.interactables.indexOfElement(e,t&&t.context)},r.on=function(e,t,n){if(s.is.string(e)&&-1!==e.search(" ")&&(e=e.trim().split(/ +/)),s.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.on(f,t,n)}return r}if(s.is.object(e)){for(var v in e)r.on(v,e[v],t);return r}return s.contains(l.eventTypes,e)?p[e]?p[e].push(t):p[e]=[t]:o.add(a.document,e,t,{options:n}),r},r.off=function(e,t,n){if(s.is.string(e)&&-1!==e.search(" ")&&(e=e.trim().split(/ +/)),s.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.off(f,t,n)}return r}if(s.is.object(e)){for(var v in e)r.off(v,e[v],t);return r}if(s.contains(l.eventTypes,e)){var g=void 0;e in p&&-1!==(g=s.indexOf(p[e],t))&&p[e].splice(g,1)}else o.remove(a.document,e,t,n);return r},r.debug=function(){return a},r.getPointerAverage=s.pointerAverage,r.getTouchBBox=s.touchBBox,r.getTouchDistance=s.touchDistance,r.getTouchAngle=s.touchAngle,r.getElementRect=s.getElementRect,r.getElementClientRect=s.getElementClientRect,r.matchesSelector=s.matchesSelector,r.closest=s.closest,r.supportsTouch=function(){return i.supportsTouch},r.supportsPointerEvent=function(){return i.supportsPointerEvent},r.stop=function(e){for(var t=a.interactions.length-1;t>=0;t--)a.interactions[t].stop(e);return r},r.pointerMoveTolerance=function(e){return s.is.number(e)?(c.pointerMoveTolerance=e,this):c.pointerMoveTolerance},r.addDocument=a.addDocument,r.removeDocument=a.removeDocument,a.interact=r,t.exports=r},{"./Interactable":4,"./Interaction":5,"./scope":34,"./utils":44,"./utils/browser":37,"./utils/events":40}],22:[function(e,t,n){"use strict";function r(e){var t=e.interaction,n=e.event;t.target&&t.target.checkAndPreventDefault(n)}var i=e("./Interactable"),o=e("./Interaction"),s=e("./scope"),a=e("./utils/is"),l=e("./utils/events"),c=e("./utils/domUtils"),p=c.nodeContains,u=c.matchesSelector;i.prototype.preventDefault=function(e){return/^(always|never|auto)$/.test(e)?(this.options.preventDefault=e,this):a.bool(e)?(this.options.preventDefault=e?"always":"never",this):this.options.preventDefault},i.prototype.checkAndPreventDefault=function(e){var t=this.options.preventDefault;if("never"!==t)return"always"===t?void e.preventDefault():void(l.supportsOptions||/^(mouse|pointer|touch)*(down|start)/i.test(e.type)||a.element(e.target)&&u(e.target,"input,select,textarea,[contenteditable=true],[contenteditable=true] *")||e.preventDefault())};for(var d=["down","move","up","cancel"],f=0;f=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i;if(o.element&&(o.element===e.target||p(o.element,e.target)))return void o.target.checkAndPreventDefault(e)}}},{"./Interactable":4,"./Interaction":5,"./scope":34,"./utils/domUtils":39,"./utils/events":40,"./utils/is":46}],23:[function(e,t,n){"use strict";function r(e){var t=e.target,n=a.search(e,e.type,t);n&&n.prevTap&&e.clientX===n.prevTap.clientX&&e.clientY===n.prevTap.clientY&&t===n.prevTap.target&&(n.downTargets[0]=t,n.downTimes[0]=(new Date).getTime(),l.fire({interaction:n,event:e,eventTarget:t,pointer:e,type:"tap"}))}var i=e("./scope"),o=e("./utils/events"),s=e("./utils/browser"),a=e("./utils/interactionFinder"),l=e("./pointerEvents/base"),c=e("./utils/window"),p=c.window,u=Object.prototype.toString;if(p.Array.isArray||(p.Array.isArray=function(e){return"[object Array]"===u.call(e)}),String.prototype.trim||(String.prototype.trim=function(){return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")}),s.isIE8){var d=function(e){for(var t=i.interactions,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var o;if(n){if(r>=t.length)break;o=t[r++]}else{if(r=t.next(),r.done)break;o=r.value}var s=o;s.interacting()&&s.target.checkAndPreventDefault(e)}},f=function(e,t){var n=e.doc,i=(e.win,0===t.indexOf("listen")?o.add:o.remove);i(n,"selectstart",d),l&&i(n,"dblclick",r)};i.signals.on("add-document",f),i.signals.on("remove-document",f)}t.exports=null},{"./pointerEvents/base":31,"./scope":34,"./utils/browser":37,"./utils/events":40,"./utils/interactionFinder":45,"./utils/window":52}],24:[function(e,t,n){"use strict";function r(e,t,n){return e&&e.enabled&&(t||!e.endOnly)&&(!n||e.endOnly)}var i=e("../InteractEvent"),o=e("../Interaction"),s=e("../utils/extend"),a={names:[],setOffsets:function(e){var t=e.interaction,n=e.pageCoords,r=t.target,i=t.element,o=t.startOffset,s=r.getRect(i);s?(o.left=n.x-s.left,o.top=n.y-s.top,o.right=s.right-n.x,o.bottom=s.bottom-n.y,"width"in s||(s.width=s.right-s.left),"height"in s||(s.height=s.bottom-s.top)):o.left=o.top=o.right=o.bottom=0,e.rect=s,e.interactable=r,e.element=i;for(var l=0;l=p.length)break;f=p[d++]}else{if(d=p.next(),d.done)break;f=d.value}var v=f,g=a[v],h=t.target.options[t.prepared.name][v];r(h,i,o)&&(e.status=e.status=n[v],e.options=h,e.offset=e.interaction.modifierOffsets[v],g.set(e),e.status.locked&&(l.x+=e.status.dx,l.y+=e.status.dy,c.dx+=e.status.dx,c.dy+=e.status.dy,c.locked=!0))}return c.shouldMove=!e.status||!c.locked||e.status.changed,c},resetStatuses:function(e){for(var t=a.names,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var i;if(n){if(r>=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i,s=e[o]||{};s.dx=s.dy=0,s.modifiedX=s.modifiedY=NaN,s.locked=!1,s.changed=!0,e[o]=s}return e},start:function(e,t){var n=e.interaction,r={interaction:n,pageCoords:("action-resume"===t?n.curCoords:n.startCoords).page,startOffset:n.startOffset,statuses:n.modifierStatuses,preEnd:!1,requireEndOnly:!1};a.setOffsets(r),a.resetStatuses(r.statuses),r.pageCoords=s({},n.startCoords.page),n.modifierResult=a.setAll(r)}};o.signals.on("new",function(e){e.startOffset={left:0,right:0,top:0,bottom:0},e.modifierOffsets={},e.modifierStatuses=a.resetStatuses({}),e.modifierResult=null}),o.signals.on("action-start",a.start),o.signals.on("action-resume",a.start),o.signals.on("before-action-move",function(e){var t=e.interaction,n=e.preEnd,r=e.interactingBeforeMove,i=a.setAll({interaction:t,preEnd:n,pageCoords:t.curCoords.page,statuses:t.modifierStatuses,requireEndOnly:!1});!i.shouldMove&&r&&(t._dontFireMove=!0),t.modifierResult=i}),o.signals.on("action-end",function(e){for(var t=e.interaction,n=e.event,i=0;i=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}var m=h,y=m.x,x=m.y;l.push({x:s.left-i.width*y+u.x,y:s.top-i.height*x+u.y})}else l.push(u);return l},set:function(e){var t=e.interaction,n=e.pageCoords,r=e.status,i=e.options,s=e.offset,a=[],l=void 0,c=void 0,p=void 0;if(r.useStatusXY)c={x:r.x,y:r.y};else{var u=o.getOriginXY(t.target,t.element,t.prepared.name);c=o.extend({},n),c.x-=u.x,c.y-=u.y}r.realX=c.x,r.realY=c.y;for(var d=i.targets?i.targets.length:0,f=s,v=Array.isArray(f),g=0,f=v?f:f[Symbol.iterator]();;){var h;if(v){if(g>=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}for(var m=h,y=m.x,x=m.y,b=c.x-y,w=c.y-x,E=i.targets,S=Array.isArray(E),T=0,E=S?E:E[Symbol.iterator]();;){var C;if(S){if(T>=E.length)break;C=E[T++]}else{if(T=E.next(),T.done)break;C=T.value}var A=C;l=o.is.function(A)?A(b,w,t):A,l&&a.push({x:o.is.number(l.x)?l.x+y:b,y:o.is.number(l.y)?l.y+x:w,range:o.is.number(l.range)?l.range:i.range})}}var D={target:null,inRange:!1,distance:0,range:0,dx:0,dy:0};for(p=0,d=a.length;p=p.length)break;f=p[d++]}else{if(d=p.next(),d.done)break;f=d.value}var v=f,g=void 0;g=a.is.function(v)?v(l,c,t):v,g&&("width"in g&&"height"in g&&(g.x=g.width,g.y=g.height),e.options.targets.push(g))}i.set(e)},modifyCoords:function(e){var t=e.options;e.options=a.extend({},t), -e.options.enabled=t.enabled,e.options.relativePoints=[null],i.modifyCoords(e)}};r.snapSize=l,r.names.push("snapSize"),o.perAction.snapSize=l.defaults,s.defaults.snapSize=l.defaults,t.exports=l},{"../actions/resize":10,"../defaultOptions":18,"../utils/":44,"./index":24,"./snap":28}],30:[function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=e("../utils/pointerUtils");t.exports=function(){function e(t,n,o,s,a){if(r(this,e),i.pointerExtend(this,o),o!==n&&i.pointerExtend(this,n),this.interaction=a,this.timeStamp=(new Date).getTime(),this.originalEvent=o,this.type=t,this.pointerId=i.getPointerId(n),this.pointerType=i.getPointerType(n,a),this.target=s,this.currentTarget=null,"tap"===t){var l=a.getPointerIndex(n);this.dt=this.timeStamp-a.downTimes[l];var c=this.timeStamp-a.tapTime;this.double=!!(a.prevTap&&"doubletap"!==a.prevTap.type&&a.prevTap.target===this.target&&c<500)}else"doubletap"===t&&(this.dt=n.timeStamp-a.tapTime)}return e.prototype.subtractOrigin=function(e){var t=e.x,n=e.y;return this.pageX-=t,this.pageY-=n,this.clientX-=t,this.clientY-=n,this},e.prototype.addOrigin=function(e){var t=e.x,n=e.y;return this.pageX+=t,this.pageY+=n,this.clientX+=t,this.clientY+=n,this},e.prototype.preventDefault=function(){this.originalEvent.preventDefault()},e.prototype.stopPropagation=function(){this.propagationStopped=!0},e.prototype.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},e}()},{"../utils/pointerUtils":49}],31:[function(e,t,n){"use strict";function r(e){for(var t=e.interaction,n=e.pointer,s=e.event,l=e.eventTarget,c=e.type,u=void 0===c?e.pointerEvent.type:c,d=e.targets,f=void 0===d?i(e):d,v=e.pointerEvent,g=void 0===v?new o(u,n,s,l,t):v,h={interaction:t,pointer:n,event:s,eventTarget:l,targets:f,type:u,pointerEvent:g},m=0;m=u.length)break;g=u[v++]}else{if(v=u.next(),v.done)break;g=v.value}var h=g;c.element=h,p.fire("collect-targets",c)}return"hold"===o&&(c.targets=d(c.targets,function(e){return e.eventable.options.holdDuration===t.holdTimers[s].duration})),c.targets}var o=e("./PointerEvent"),s=e("../Interaction"),a=e("../utils"),l=e("../utils/browser"),c=e("../defaultOptions"),p=e("../utils/Signals").new(),u=e("../utils/arr"),d=u.filter,f=["down","up","cancel"],v=["down","up","cancel"],g={PointerEvent:o,fire:r,collectEventTargets:i,signals:p,defaults:{holdDuration:600,ignoreFrom:null,allowFrom:null,origin:{x:0,y:0}},types:["down","move","up","cancel","tap","doubletap","hold"]};s.signals.on("update-pointer-down",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers[n]={duration:1/0,timeout:null}}),s.signals.on("remove-pointer",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers.splice(n,1)}),s.signals.on("move",function(e){var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,s=e.duplicateMove,a=t.getPointerIndex(n);s||t.pointerIsDown&&!t.pointerWasMoved||(t.pointerIsDown&&clearTimeout(t.holdTimers[a].timeout),r({interaction:t,pointer:n,event:i,eventTarget:o,type:"move"}))}),s.signals.on("down",function(e){for(var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,s=e.pointerIndex,c=l.isIE8?a.extend({},i):i,u=t.holdTimers[s],d=a.getPath(o),f={interaction:t,pointer:n,event:i,eventTarget:o,type:"hold",targets:[],path:d,element:null},v=d,g=Array.isArray(v),h=0,v=g?v:v[Symbol.iterator]();;){var m;if(g){if(h>=v.length)break;m=v[h++]}else{if(h=v.next(),h.done)break;m=h.value}var y=m;f.element=y,p.fire("collect-targets",f)}if(f.targets.length){for(var x=1/0,b=0;b=0&&(p.selectors[u]!==e||p.contexts[u]!==t);u--);-1===u&&(u=p.selectors.length,p.selectors.push(e),p.contexts.push(t),p.listeners.push([])),p.listeners[u].push([i,!!s.capture,s.passive])}function s(e,t,n,r,o){var s=f(o),c=O[n],p=!1,u=void 0;if(c)for(u=c.selectors.length-1;u>=0;u--)if(c.selectors[u]===e&&c.contexts[u]===t){for(var d=c.listeners[u],v=d.length-1;v>=0;v--){var g=d[v],h=g[0],m=g[1],y=g[2];if(h===r&&m===!!s.capture&&y===s.passive){d.splice(v,1),d.length||(c.selectors.splice(u,1),c.contexts.splice(u,1),c.listeners.splice(u,1),i(t,n,a),i(t,n,l,!0),c.selectors.length||(O[n]=null)),p=!0;break}}if(p)break}}function a(e,t){var n=f(t),r={},i=O[e.type],o=g.getActualElement(e.path?e.path[0]:e.target),s=o;for(h(r,e),r.originalEvent=e,r.preventDefault=p;v.element(s);){for(var a=0;a=l.length)break;u=l[p++]}else{if(p=l.next(),p.done)break;u=p.value}var d=u,f=s[d](a);if(f)return f}},simulationResume:function(e){var t=e.mouseEvent,n=e.eventType,o=e.eventTarget;if(!/down|start/i.test(n))return null;for(var s=r.interactions,a=Array.isArray(s),l=0,s=a?s:s[Symbol.iterator]();;){var c;if(a){if(l>=s.length)break;c=s[l++]}else{if(l=s.next(),l.done)break;c=l.value}var p=c,u=o;if(p.simulation&&p.simulation.allowResume&&p.mouse===t)for(;u;){if(u===p.element)return p;u=i.parentNode(u)}}return null},mouse:function(e){var t=e.pointerId,n=e.mouseEvent,s=e.eventType;if(!n&&(o.supportsTouch||o.supportsPointerEvent))return null;for(var a=void 0,l=r.interactions,c=Array.isArray(l),p=0,l=c?l:l[Symbol.iterator]();;){var u;if(c){if(p>=l.length)break;u=l[p++]}else{if(p=l.next(),p.done)break;u=p.value}var d=u;if(d.mouse){if(d.simulation&&!i.contains(d.pointerIds,t))continue;if(d.interacting())return d;a||(a=d)}}if(a)return a;for(var f=r.interactions,v=Array.isArray(f),g=0,f=v?f:f[Symbol.iterator]();;){var h;if(v){if(g>=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}var m=h;if(m.mouse&&(!/down/.test(s)||!m.simulation))return m}return null},hasPointer:function(e){for(var t=e.pointerId,n=r.interactions,o=Array.isArray(n),s=0,n=o?n:n[Symbol.iterator]();;){var a;if(o){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var l=a;if(i.contains(l.pointerIds,t))return l}},idle:function(e){for(var t=e.mouseEvent,n=r.interactions,i=Array.isArray(n),o=0,n=i?n:n[Symbol.iterator]();;){var s;if(i){if(o>=n.length)break;s=n[o++]}else{if(o=n.next(),o.done)break;s=o.value}var a=s;if(1===a.pointerIds.length){var l=a.target;if(l&&!l.options.gesture.enabled)continue}else if(a.pointerIds.length>=2)continue;if(!a.interacting()&&t===a.mouse)return a}return null}};t.exports=s},{"../scope":34,"./browser":37,"./index":44}],46:[function(e,t,n){"use strict";var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},i=e("./window"),o=e("./isWindow"),s={array:function(){},window:function(e){return e===i.window||o(e)},docFrag:function(e){return s.object(e)&&11===e.nodeType},object:function(e){return!!e&&"object"===(void 0===e?"undefined":r(e))},function:function(e){return"function"==typeof e},number:function(e){return"number"==typeof e},bool:function(e){return"boolean"==typeof e},string:function(e){return"string"==typeof e},element:function(e){if(!e||"object"!==(void 0===e?"undefined":r(e)))return!1;var t=i.getWindow(e)||i.window;return/object|function/.test(r(t.Element))?e instanceof t.Element:1===e.nodeType&&"string"==typeof e.nodeName}};s.array=function(e){return s.object(e)&&void 0!==e.length&&s.function(e.splice)},t.exports=s},{"./isWindow":47,"./window":52}],47:[function(e,t,n){"use strict";t.exports=function(e){return!(!e||!e.Window)&&e instanceof e.Window}},{}],48:[function(e,t,n){"use strict";function r(e,n){for(var r in n){var i=t.exports.prefixedPropREs,o=!1;for(var s in i)if(0===r.indexOf(s)&&i[s].test(r)){o=!0;break}o||"function"==typeof n[r]||(e[r]=n[r])}return e}r.prefixedPropREs={webkit:/(Movement[XY]|Radius[XY]|RotationAngle|Force)$/},t.exports=r},{}],49:[function(e,t,n){"use strict";var r=e("./hypot"),i=e("./browser"),o=e("./domObjects"),s=e("./domUtils"),a=e("./is"),l=e("./pointerExtend"),c={copyCoords:function(e,t){e.page=e.page||{},e.page.x=t.page.x,e.page.y=t.page.y,e.client=e.client||{},e.client.x=t.client.x,e.client.y=t.client.y,e.timeStamp=t.timeStamp},setCoordDeltas:function(e,t,n){e.page.x=n.page.x-t.page.x,e.page.y=n.page.y-t.page.y,e.client.x=n.client.x-t.client.x,e.client.y=n.client.y-t.client.y,e.timeStamp=n.timeStamp-t.timeStamp;var i=Math.max(e.timeStamp/1e3,.001);e.page.speed=r(e.page.x,e.page.y)/i,e.page.vx=e.page.x/i,e.page.vy=e.page.y/i,e.client.speed=r(e.client.x,e.page.y)/i,e.client.vx=e.client.x/i,e.client.vy=e.client.y/i},isNativePointer:function(e){return e instanceof o.Event||e instanceof o.Touch},getXY:function(e,t,n){return n=n||{},e=e||"page",n.x=t[e+"X"],n.y=t[e+"Y"],n},getPageXY:function(e,t){return t=t||{},i.isOperaMobile&&c.isNativePointer(e)?(c.getXY("screen",e,t),t.x+=window.scrollX,t.y+=window.scrollY):c.getXY("page",e,t),t},getClientXY:function(e,t){return t=t||{},i.isOperaMobile&&c.isNativePointer(e)?c.getXY("screen",e,t):c.getXY("client",e,t),t},getPointerId:function(e){return a.number(e.pointerId)?e.pointerId:e.identifier},setCoords:function(e,t,n){var r=t.length>1?c.pointerAverage(t):t[0],i={};c.getPageXY(r,i),e.page.x=i.x,e.page.y=i.y,c.getClientXY(r,i),e.client.x=i.x,e.client.y=i.y,e.timeStamp=a.number(n)?n:(new Date).getTime()},pointerExtend:l,getTouchPair:function(e){var t=[];return a.array(e)?(t[0]=e[0],t[1]=e[1]):"touchend"===e.type?1===e.touches.length?(t[0]=e.touches[0],t[1]=e.changedTouches[0]):0===e.touches.length&&(t[0]=e.changedTouches[0],t[1]=e.changedTouches[1]):(t[0]=e.touches[0],t[1]=e.touches[1]),t},pointerAverage:function(e){for(var t={pageX:0,pageY:0,clientX:0,clientY:0,screenX:0,screenY:0},n=e,r=Array.isArray(n),i=0,n=r?n:n[Symbol.iterator]();;){var o;if(r){if(i>=n.length)break;o=n[i++]}else{if(i=n.next(),i.done)break;o=i.value}var s=o;for(var a in t)t[a]+=s[a]}for(var l in t)t[l]/=e.length;return t},touchBBox:function(e){if(e.length||e.touches&&e.touches.length>1){var t=c.getTouchPair(e),n=Math.min(t[0].pageX,t[1].pageX),r=Math.min(t[0].pageY,t[1].pageY);return{x:n,y:r,left:n,top:r,width:Math.max(t[0].pageX,t[1].pageX)-n,height:Math.max(t[0].pageY,t[1].pageY)-r}}},touchDistance:function(e,t){var n=t+"X",i=t+"Y",o=c.getTouchPair(e),s=o[0][n]-o[1][n],a=o[0][i]-o[1][i];return r(s,a)},touchAngle:function(e,t,n){var r=n+"X",i=n+"Y",o=c.getTouchPair(e),s=o[1][r]-o[0][r],a=o[1][i]-o[0][i];return 180*Math.atan2(a,s)/Math.PI},getPointerType:function(e,t){return t.mouse?"mouse":i.supportsPointerEvent?a.string(e.pointerType)?e.pointerType:[void 0,void 0,"touch","pen","mouse"][e.pointerType]:"touch"},getEventTargets:function(e){return[s.getActualElement(e.path?e.path[0]:e.target),s.getActualElement(e.currentTarget)]}};t.exports=c},{"./browser":37,"./domObjects":38,"./domUtils":39,"./hypot":43,"./is":46,"./pointerExtend":48}],50:[function(e,t,n){"use strict";for(var r=e("./window"),i=r.window,o=["ms","moz","webkit","o"],s=0,a=void 0,l=void 0,c=0;c6&&void 0!==arguments[6]&&arguments[6];r(this,e);var f=t.target,v=(f&&f.options||s).deltaSource,g=o(f,p,l),h="start"===c,m="end"===c,y=h?t.startCoords:t.curCoords,x=t.prevEvent;p=p||t.element;var b=i({},y.page),w=i({},y.client);b.x-=g.x,b.y-=g.y,w.x-=g.x,w.y-=g.y,this.ctrlKey=n.ctrlKey,this.altKey=n.altKey,this.shiftKey=n.shiftKey,this.metaKey=n.metaKey,this.button=n.button,this.buttons=n.buttons,this.target=p,this.currentTarget=p,this.relatedTarget=u||null,this.preEnd=d,this.type=l+(c||""),this.interaction=t,this.interactable=f,this.t0=h?t.downTimes[t.downTimes.length-1]:x.t0;var E={interaction:t,event:n,action:l,phase:c,element:p,related:u,page:b,client:w,coords:y,starting:h,ending:m,deltaSource:v,iEvent:this};a.fire("set-xy",E),m?(this.pageX=x.pageX,this.pageY=x.pageY,this.clientX=x.clientX,this.clientY=x.clientY):(this.pageX=b.x,this.pageY=b.y,this.clientX=w.x,this.clientY=w.y),this.x0=t.startCoords.page.x-g.x,this.y0=t.startCoords.page.y-g.y,this.clientX0=t.startCoords.client.x-g.x,this.clientY0=t.startCoords.client.y-g.y,a.fire("set-delta",E),this.timeStamp=y.timeStamp,this.dt=t.pointerDelta.timeStamp,this.duration=this.timeStamp-this.t0,this.speed=t.pointerDelta[v].speed,this.velocityX=t.pointerDelta[v].vx,this.velocityY=t.pointerDelta[v].vy,this.swipe=m||"inertiastart"===c?this.getSwipe():null,a.fire("new",E)}return e.prototype.getSwipe=function(){var e=this.interaction;if(e.prevEvent.speed<600||this.timeStamp-e.prevEvent.timeStamp>150)return null;var t=180*Math.atan2(e.prevEvent.velocityY,e.prevEvent.velocityX)/Math.PI;t<0&&(t+=360);var n=112.5<=t&&t<247.5,r=202.5<=t&&t<337.5,i=!n&&(292.5<=t||t<67.5);return{up:r,down:!r&&22.5<=t&&t<157.5,left:n,right:i,angle:t,speed:e.prevEvent.speed,velocity:{x:e.prevEvent.velocityX,y:e.prevEvent.velocityY}}},e.prototype.preventDefault=function(){},e.prototype.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},e.prototype.stopPropagation=function(){this.propagationStopped=!0},e}();a.on("set-delta",function(e){var t=e.iEvent,n=e.interaction,r=e.starting,i=e.deltaSource,o=r?t:n.prevEvent;"client"===i?(t.dx=t.clientX-o.clientX,t.dy=t.clientY-o.clientY):(t.dx=t.pageX-o.pageX,t.dy=t.pageY-o.pageY)}),l.signals=a,t.exports=l},{"./defaultOptions":18,"./utils/Signals":35,"./utils/extend":41,"./utils/getOriginXY":42}],4:[function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=e("./utils/is"),o=e("./utils/events"),s=e("./utils/extend"),a=e("./actions/base"),l=e("./scope"),c=e("./Eventable"),p=e("./defaultOptions"),u=e("./utils/Signals").new(),d=e("./utils/domUtils"),f=d.getElementRect,v=d.nodeContains,g=d.trySelector,h=e("./utils/window"),m=h.getWindow,y=e("./utils/arr"),x=y.indexOf,b=y.contains,w=e("./utils/browser"),E=w.wheelEvent;l.interactables=[];var S=function(){function e(t,n){r(this,e),n=n||{},this.target=t,this.events=new c,this._context=n.context||l.document,this._win=m(g(t)?this._context:t),this._doc=this._win.document,u.fire("new",{target:t,options:n,interactable:this,win:this._win}),l.addDocument(this._doc,this._win),l.interactables.push(this),this.set(n)}return e.prototype.setOnEvents=function(e,t){var n="on"+e;return i.function(t.onstart)&&(this.events[n+"start"]=t.onstart),i.function(t.onmove)&&(this.events[n+"move"]=t.onmove),i.function(t.onend)&&(this.events[n+"end"]=t.onend),i.function(t.oninertiastart)&&(this.events[n+"inertiastart"]=t.oninertiastart),this},e.prototype.setPerAction=function(e,t){for(var n in t)n in p[e]&&(i.object(t[n])?(this.options[e][n]=s(this.options[e][n]||{},t[n]),i.object(p.perAction[n])&&"enabled"in p.perAction[n]&&(this.options[e][n].enabled=!1!==t[n].enabled)):i.bool(t[n])&&i.object(p.perAction[n])?this.options[e][n].enabled=t[n]:void 0!==t[n]&&(this.options[e][n]=t[n]))},e.prototype.getRect=function(e){return e=e||this.target,i.string(this.target)&&!i.element(e)&&(e=this._context.querySelector(this.target)),f(e)},e.prototype.rectChecker=function(e){return i.function(e)?(this.getRect=e,this):null===e?(delete this.options.getRect,this):this.getRect},e.prototype._backCompatOption=function(e,t){if(g(t)||i.object(t)){this.options[e]=t;for(var n=a.names,r=Array.isArray(n),o=0,n=r?n:n[Symbol.iterator]();;){var s;if(r){if(o>=n.length)break;s=n[o++]}else{if(o=n.next(),o.done)break;s=o.value}var l=s;this.options[l][e]=t}return this}return this.options[e]},e.prototype.origin=function(e){return this._backCompatOption("origin",e)},e.prototype.deltaSource=function(e){return"page"===e||"client"===e?(this.options.deltaSource=e,this):this.options.deltaSource},e.prototype.context=function(){return this._context},e.prototype.inContext=function(e){return this._context===e.ownerDocument||v(this._context,e)},e.prototype.fire=function(e){return this.events.fire(e),this},e.prototype._onOffMultiple=function(e,t,n,r){if(i.string(t)&&-1!==t.search(" ")&&(t=t.trim().split(/ +/)),i.array(t)){for(var o=0;o=l.length)break;f=l[d++]}else{if(d=l.next(),d.done)break;f=d.value}var v=f;this.options[v]=p.base[v],v in t&&this[v](t[v])}return u.fire("set",{options:t,interactable:this}),this},e.prototype.unset=function(){if(o.remove(this.target,"all"),i.string(this.target))for(var e in o.delegatedEvents){var t=o.delegatedEvents[e];t.selectors[0]===this.target&&t.contexts[0]===this._context&&(t.selectors.splice(0,1),t.contexts.splice(0,1),t.listeners.splice(0,1),t.selectors.length||(t[e]=null)),o.remove(this._context,e,o.delegateListener),o.remove(this._context,e,o.delegateUseCapture,!0)}else o.remove(this,"all");u.fire("unset",{interactable:this}),l.interactables.splice(x(l.interactables,this),1);for(var n=l.interactions||[],r=Array.isArray(n),s=0,n=r?n:n[Symbol.iterator]();;){var a;if(r){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var c=a;c.target===this&&c.interacting()&&c.stop()}return l.interact},e}();l.interactables.indexOfElement=function(e,t){t=t||l.document;for(var n=0;n=x.length)break;E=x[w++]}else{if(w=x.next(),w.done)break;E=w.value}var S=E,T=S[0],C=S[1];C._updateEventTargets(i,o),C[e](T,t,i,o)}}}function o(e){for(var t=0;te.pointerMoveTolerance);var a={pointer:t,pointerIndex:this.getPointerIndex(t),event:n,eventTarget:r,dx:o,dy:s,duplicate:i,interaction:this,interactingBeforeMove:this.interacting()};i||l.setCoordDeltas(this.pointerDelta,this.prevCoords,this.curCoords),f.fire("move",a),i||(this.interacting()&&this.doMove(a),this.pointerWasMoved&&l.copyCoords(this.prevCoords,this.curCoords))},e.prototype.doMove=function(e){e=l.extend({pointer:this.pointers[0],event:this.prevEvent,eventTarget:this._eventTarget,interaction:this},e||{}),f.fire("before-action-move",e),this._dontFireMove||f.fire("action-move",e),this._dontFireMove=!1},e.prototype.pointerUp=function(e,t,n,r){var i=this.getPointerIndex(e);f.fire(/cancel$/i.test(t.type)?"cancel":"up",{pointer:e,pointerIndex:i,event:t,eventTarget:n,curEventTarget:r,interaction:this}),this.simulation||this.end(t),this.pointerIsDown=!1,this.removePointer(e,t)},e.prototype.end=function(e){e=e||this.prevEvent,this.interacting()&&f.fire("action-end",{event:e,interaction:this}),this.stop()},e.prototype.currentAction=function(){return this._interacting?this.prepared.name:null},e.prototype.interacting=function(){return this._interacting},e.prototype.stop=function(){f.fire("stop",{interaction:this}),this._interacting&&(f.fire("stop-active",{interaction:this}),f.fire("stop-"+this.prepared.name,{interaction:this})),this.target=this.element=null,this._interacting=!1,this.prepared.name=this.prevEvent=null},e.prototype.getPointerIndex=function(e){return"mouse"===this.pointerType||"pen"===this.pointerType?0:l.indexOf(this.pointerIds,l.getPointerId(e))},e.prototype.updatePointer=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:t&&/(down|start)$/i.test(t.type),r=l.getPointerId(e),i=this.getPointerIndex(e);return-1===i&&(i=this.pointerIds.length,this.pointerIds[i]=r),n&&f.fire("update-pointer-down",{pointer:e,event:t,down:n,pointerId:r,pointerIndex:i,interaction:this}),this.pointers[i]=e,i},e.prototype.removePointer=function(e,t){var n=this.getPointerIndex(e);-1!==n&&(f.fire("remove-pointer",{pointer:e,event:t,pointerIndex:n,interaction:this}),this.pointers.splice(n,1),this.pointerIds.splice(n,1),this.downTargets.splice(n,1),this.downTimes.splice(n,1))},e.prototype._updateEventTargets=function(e,t){this._eventTarget=e,this._curEventTarget=t},e}(),y=0,x=g.length;y=i.length)break;a=i[s++]}else{if(s=i.next(),s.done)break;a=s.value}var l=a;if(l.options.drop.enabled){var c=l.options.drop.accept;if(!(p.is.element(c)&&c!==t||p.is.string(c)&&!p.matchesSelector(t,c)))for(var d=p.is.string(l.target)?l._context.querySelectorAll(l.target):[l.target],f=0;fo.left&&c.xo.top&&c.y=o.left&&v<=o.right&&g>=o.top&&g<=o.bottom}if(f&&p.is.number(a)){s=Math.max(0,Math.min(o.right,f.right)-Math.max(o.left,f.left))*Math.max(0,Math.min(o.bottom,f.bottom)-Math.max(o.top,f.top))/(f.width*f.height)>=a}return this.options.drop.checker&&(s=this.options.drop.checker(e,t,s,this,i,n,r)),s},v.signals.on("unset",function(e){e.interactable.dropzone(!1)}),v.settingsMethods.push("dropChecker"),g.signals.on("new",function(e){e.dropTarget=null,e.dropElement=null,e.prevDropTarget=null,e.prevDropElement=null,e.dropEvents=null,e.activeDrops={dropzones:[],elements:[],rects:[]}}),g.signals.on("stop",function(e){var t=e.interaction;t.dropTarget=t.dropElement=t.prevDropTarget=t.prevDropElement=null}),d.dynamicDrop=function(e){return p.is.bool(e)?(y=e,d):y},p.merge(v.eventTypes,["dragenter","dragleave","dropactivate","dropdeactivate","dropmove","drop"]),c.methodDict.drop="dropzone",h.drop=m.defaults,t.exports=m},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../interact":21,"../scope":34,"../utils":44,"./base":6}],9:[function(e,t,n){"use strict";var r=e("./base"),i=e("../utils"),o=e("../InteractEvent"),s=e("../Interactable"),a=e("../Interaction"),l=e("../defaultOptions"),c={defaults:{enabled:!1,origin:null,restrict:null},checker:function(e,t,n,r,i){return i.pointerIds.length>=2?{name:"gesture"}:null},getCursor:function(){return""}};o.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;"gesturestart"===t.type&&(t.ds=0,n.gesture.startDistance=n.gesture.prevDistance=t.distance,n.gesture.startAngle=n.gesture.prevAngle=t.angle,n.gesture.scale=1)}),o.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;"gesturemove"===t.type&&(t.ds=t.scale-n.gesture.scale,n.target.fire(t),n.gesture.prevAngle=t.angle,n.gesture.prevDistance=t.distance,t.scale===1/0||null===t.scale||void 0===t.scale||isNaN(t.scale)||(n.gesture.scale=t.scale))}),s.prototype.gesturable=function(e){return i.is.object(e)?(this.options.gesture.enabled=!1!==e.enabled,this.setPerAction("gesture",e),this.setOnEvents("gesture",e),this):i.is.bool(e)?(this.options.gesture.enabled=e,e||(this.ongesturestart=this.ongesturestart=this.ongestureend=null),this):this.options.gesture},o.signals.on("set-delta",function(e){var t=e.interaction,n=e.iEvent,r=e.action,s=e.event,a=e.starting,l=e.ending,c=e.deltaSource;if("gesture"===r){var p=t.pointers;n.touches=[p[0],p[1]],a?(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=1,n.ds=0,n.angle=i.touchAngle(p,void 0,c),n.da=0):l||s instanceof o?(n.distance=t.prevEvent.distance,n.box=t.prevEvent.box,n.scale=t.prevEvent.scale,n.ds=n.scale-1,n.angle=t.prevEvent.angle,n.da=n.angle-t.gesture.startAngle):(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=n.distance/t.gesture.startDistance,n.angle=i.touchAngle(p,t.gesture.prevAngle,c),n.ds=n.scale-t.gesture.prevScale,n.da=n.angle-t.gesture.prevAngle)}}),a.signals.on("new",function(e){e.gesture={start:{x:0,y:0},startDistance:0,prevDistance:0,distance:0,scale:1,startAngle:0,prevAngle:0}}),r.gesture=c,r.names.push("gesture"),i.merge(s.eventTypes,["gesturestart","gesturemove","gestureend"]),r.methodDict.gesture="gesturable",l.gesture=c.defaults,t.exports=c},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"./base":6}],10:[function(e,t,n){"use strict";function r(e,t,n,r,i,s,a){if(!t)return!1;if(!0===t){var l=o.is.number(s.width)?s.width:s.right-s.left,c=o.is.number(s.height)?s.height:s.bottom-s.top;if(l<0&&("left"===e?e="right":"right"===e&&(e="left")),c<0&&("top"===e?e="bottom":"bottom"===e&&(e="top")),"left"===e)return n.x<(l>=0?s.left:s.right)+a;if("top"===e)return n.y<(c>=0?s.top:s.bottom)+a;if("right"===e)return n.x>(l>=0?s.right:s.left)-a;if("bottom"===e)return n.y>(c>=0?s.bottom:s.top)-a}return!!o.is.element(r)&&(o.is.element(t)?t===r:o.matchesUpTo(r,t,i))}var i=e("./base"),o=e("../utils"),s=e("../utils/browser"),a=e("../InteractEvent"),l=e("../Interactable"),c=e("../Interaction"),p=e("../defaultOptions"),u=s.supportsTouch||s.supportsPointerEvent?20:10,d={defaults:{enabled:!1,mouseButtons:null,origin:null,snap:null,restrict:null,inertia:null,autoScroll:null,square:!1,preserveAspectRatio:!1,axis:"xy",margin:NaN,edges:null,invert:"none"},checker:function(e,t,n,i,s,a){if(!a)return null;var l=o.extend({},s.curCoords.page),c=n.options;if(c.resize.enabled){var p=c.resize,d={left:!1,right:!1,top:!1,bottom:!1};if(o.is.object(p.edges)){for(var f in d)d[f]=r(f,p.edges[f],l,s._eventTarget,i,a,p.margin||u);if(d.left=d.left&&!d.right,d.top=d.top&&!d.bottom,d.left||d.right||d.top||d.bottom)return{name:"resize",edges:d}}else{var v="y"!==c.resize.axis&&l.x>a.right-u,g="x"!==c.resize.axis&&l.y>a.bottom-u;if(v||g)return{name:"resize",axes:(v?"x":"")+(g?"y":"")}}}return null},cursors:s.isIe9OrOlder?{x:"e-resize",y:"s-resize",xy:"se-resize",top:"n-resize",left:"w-resize",bottom:"s-resize",right:"e-resize",topleft:"se-resize",bottomright:"se-resize",topright:"ne-resize",bottomleft:"ne-resize"}:{x:"ew-resize",y:"ns-resize",xy:"nwse-resize",top:"ns-resize",left:"ew-resize",bottom:"ns-resize",right:"ew-resize",topleft:"nwse-resize",bottomright:"nwse-resize",topright:"nesw-resize",bottomleft:"nesw-resize"},getCursor:function(e){if(e.axis)return d.cursors[e.name+e.axis];if(e.edges){for(var t="",n=["top","bottom","left","right"],r=0;r<4;r++)e.edges[n[r]]&&(t+=n[r]);return d.cursors[t]}}};a.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;if("resizestart"===t.type&&n.prepared.edges){var r=n.target.getRect(n.element),i=n.target.options.resize;if(i.square||i.preserveAspectRatio){var s=o.extend({},n.prepared.edges);s.top=s.top||s.left&&!s.bottom,s.left=s.left||s.top&&!s.right,s.bottom=s.bottom||s.right&&!s.top,s.right=s.right||s.bottom&&!s.left,n.prepared._linkedEdges=s}else n.prepared._linkedEdges=null;i.preserveAspectRatio&&(n.resizeStartAspectRatio=r.width/r.height),n.resizeRects={start:r,current:o.extend({},r),inverted:o.extend({},r),previous:o.extend({},r),delta:{left:0,right:0,width:0,top:0,bottom:0,height:0}},t.rect=n.resizeRects.inverted,t.deltaRect=n.resizeRects.delta}}),a.signals.on("new",function(e){var t=e.iEvent,n=e.phase,r=e.interaction;if("move"===n&&r.prepared.edges){var i=r.target.options.resize,s=i.invert,a="reposition"===s||"negate"===s,l=r.prepared.edges,c=r.resizeRects.start,p=r.resizeRects.current,u=r.resizeRects.inverted,d=r.resizeRects.delta,f=o.extend(r.resizeRects.previous,u),v=l,g=t.dx,h=t.dy;if(i.preserveAspectRatio||i.square){var m=i.preserveAspectRatio?r.resizeStartAspectRatio:1;l=r.prepared._linkedEdges,v.left&&v.bottom||v.right&&v.top?h=-g/m:v.left||v.right?h=g/m:(v.top||v.bottom)&&(g=h*m)}if(l.top&&(p.top+=h),l.bottom&&(p.bottom+=h),l.left&&(p.left+=g),l.right&&(p.right+=g),a){if(o.extend(u,p),"reposition"===s){var y=void 0;u.top>u.bottom&&(y=u.top,u.top=u.bottom,u.bottom=y),u.left>u.right&&(y=u.left,u.left=u.right,u.right=y)}}else u.top=Math.min(p.top,c.bottom),u.bottom=Math.max(p.bottom,c.top),u.left=Math.min(p.left,c.right),u.right=Math.max(p.right,c.left);u.width=u.right-u.left,u.height=u.bottom-u.top;for(var x in u)d[x]=u[x]-f[x];t.edges=r.prepared.edges,t.rect=u,t.deltaRect=d}}),l.prototype.resizable=function(e){return o.is.object(e)?(this.options.resize.enabled=!1!==e.enabled,this.setPerAction("resize",e),this.setOnEvents("resize",e),/^x$|^y$|^xy$/.test(e.axis)?this.options.resize.axis=e.axis:null===e.axis&&(this.options.resize.axis=p.resize.axis),o.is.bool(e.preserveAspectRatio)?this.options.resize.preserveAspectRatio=e.preserveAspectRatio:o.is.bool(e.square)&&(this.options.resize.square=e.square),this):o.is.bool(e)?(this.options.resize.enabled=e, +e||(this.onresizestart=this.onresizestart=this.onresizeend=null),this):this.options.resize},c.signals.on("new",function(e){e.resizeAxes="xy"}),a.signals.on("set-delta",function(e){var t=e.interaction,n=e.iEvent;"resize"===e.action&&t.resizeAxes&&(t.target.options.resize.square?("y"===t.resizeAxes?n.dx=n.dy:n.dy=n.dx,n.axes="xy"):(n.axes=t.resizeAxes,"x"===t.resizeAxes?n.dy=0:"y"===t.resizeAxes&&(n.dx=0)))}),i.resize=d,i.names.push("resize"),o.merge(l.eventTypes,["resizestart","resizemove","resizeinertiastart","resizeinertiaresume","resizeend"]),i.methodDict.resize="resizable",p.resize=d.defaults,t.exports=d},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"../utils/browser":37,"./base":6}],11:[function(e,t,n){"use strict";var r=e("./utils/raf"),i=e("./utils/window").getWindow,o=e("./utils/is"),s=e("./utils/domUtils"),a=e("./Interaction"),l=e("./defaultOptions"),c={defaults:{enabled:!1,container:null,margin:60,speed:300},interaction:null,i:null,x:0,y:0,isScrolling:!1,prevTime:0,start:function(e){c.isScrolling=!0,r.cancel(c.i),c.interaction=e,c.prevTime=(new Date).getTime(),c.i=r.request(c.scroll)},stop:function(){c.isScrolling=!1,r.cancel(c.i)},scroll:function(){var e=c.interaction.target.options[c.interaction.prepared.name].autoScroll,t=e.container||i(c.interaction.element),n=(new Date).getTime(),s=(n-c.prevTime)/1e3,a=e.speed*s;a>=1&&(o.window(t)?t.scrollBy(c.x*a,c.y*a):t&&(t.scrollLeft+=c.x*a,t.scrollTop+=c.y*a),c.prevTime=n),c.isScrolling&&(r.cancel(c.i),c.i=r.request(c.scroll))},check:function(e,t){var n=e.options;return n[t].autoScroll&&n[t].autoScroll.enabled},onInteractionMove:function(e){var t=e.interaction,n=e.pointer;if(t.interacting()&&c.check(t.target,t.prepared.name)){if(t.simulation)return void(c.x=c.y=0);var r=void 0,a=void 0,l=void 0,p=void 0,u=t.target.options[t.prepared.name].autoScroll,d=u.container||i(t.element);if(o.window(d))p=n.clientXd.innerWidth-c.margin,l=n.clientY>d.innerHeight-c.margin;else{var f=s.getElementClientRect(d);p=n.clientXf.right-c.margin,l=n.clientY>f.bottom-c.margin}c.x=a?1:p?-1:0,c.y=l?1:r?-1:0,c.isScrolling||(c.margin=u.margin,c.speed=u.speed,c.start(t))}}};a.signals.on("stop-active",function(){c.stop()}),a.signals.on("action-move",c.onInteractionMove),l.perAction.autoScroll=c.defaults,t.exports=c},{"./Interaction":5,"./defaultOptions":18,"./utils/domUtils":39,"./utils/is":46,"./utils/raf":50,"./utils/window":52}],12:[function(e,t,n){"use strict";var r=e("../Interactable"),i=e("../actions/base"),o=e("../utils/is"),s=e("../utils/domUtils");r.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},r.prototype.ignoreFrom=function(e){return this._backCompatOption("ignoreFrom",e)},r.prototype.allowFrom=function(e){return this._backCompatOption("allowFrom",e)},r.prototype.testIgnore=function(e,t,n){return!(!e||!o.element(n))&&(o.string(e)?s.matchesUpTo(n,e,t):!!o.element(e)&&s.nodeContains(e,n))},r.prototype.testAllow=function(e,t,n){return!e||!!o.element(n)&&(o.string(e)?s.matchesUpTo(n,e,t):!!o.element(e)&&s.nodeContains(e,n))},r.prototype.testIgnoreAllow=function(e,t,n){return!this.testIgnore(e.ignoreFrom,t,n)&&this.testAllow(e.allowFrom,t,n)},r.prototype.actionChecker=function(e){return o.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},r.prototype.styleCursor=function(e){return o.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},r.prototype.defaultActionChecker=function(e,t,n,r){for(var o=this.getRect(r),s=null,a=i.names,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var u=p;if((!n.pointerIsDown||!n.mouse||0!=(t.buttons&this.options[u].mouseButtons))&&(s=i[u].checker(e,t,this,r,n,o)))return s}}},{"../Interactable":4,"../actions/base":6,"../utils/domUtils":39,"../utils/is":46}],13:[function(e,t,n){"use strict";function r(e,t,n,r){return g.is.object(e)&&t.testIgnoreAllow(t.options[e.name],n,r)&&t.options[e.name].enabled&&a(t,n,e)?e:null}function i(e,t,n,i,o,s){for(var a=0,l=i.length;a=m.maxInteractions)return!1;if(u.target===e){if((a+=d===n.name|0)>=i)return!1;if(u.element===t&&(l++,d!==n.name||l>=o))return!1}}}return m.maxInteractions>0}}var l=e("../interact"),c=e("../Interactable"),p=e("../Interaction"),u=e("../actions/base"),d=e("../defaultOptions"),f=e("../utils/browser"),v=e("../scope"),g=e("../utils"),h=e("../utils/Signals").new();e("./InteractableMethods");var m={signals:h,withinInteractionLimit:a,maxInteractions:1/0,defaults:{perAction:{manualStart:!1,max:1/0,maxPerElement:1,allowFrom:null,ignoreFrom:null}},setActionDefaults:function(e){g.extend(e.defaults,m.defaults.perAction)}};p.signals.on("down",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;if(!t.interacting()){s(t,o(t,n,r,i))}}),p.signals.on("move",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;if(t.mouse&&!t.pointerIsDown&&!t.interacting()){s(t,o(t,n,r,i))}}),p.signals.on("move",function(e){var t=e.interaction,n=e.event;if(t.pointerIsDown&&!t.interacting()&&t.pointerWasMoved&&t.prepared.name){h.fire("before-start",e);var r=t.target;t.prepared.name&&r&&(r.options[t.prepared.name].manualStart||!a(r,t.element,t.prepared)?t.stop(n):t.start(t.prepared,r,t.element))}}),p.signals.on("stop",function(e){var t=e.interaction,n=t.target;n&&n.options.styleCursor&&(n._doc.documentElement.style.cursor="")}),c.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},c.prototype.actionChecker=function(e){return g.is.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},c.prototype.styleCursor=function(e){return g.is.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},c.prototype.defaultActionChecker=function(e,t,n,r){for(var i=this.getRect(r),o=t.buttons||{0:1,1:4,3:8,4:16}[t.button],s=null,a=u.names,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var d=p;if((!n.pointerIsDown||!n.mouse||0!=(o&this.options[d].mouseButtons))&&(s=u[d].checker(e,t,this,r,n,i)))return s}},l.maxInteractions=function(e){return g.is.number(e)?(m.maxInteractions=e,this):m.maxInteractions},c.settingsMethods.push("styleCursor"),c.settingsMethods.push("actionChecker"),c.settingsMethods.push("ignoreFrom"),c.settingsMethods.push("allowFrom"),d.base.actionChecker=null,d.base.styleCursor=!0,g.extend(d.perAction,m.defaults.perAction),t.exports=m},{"../Interactable":4,"../Interaction":5,"../actions/base":6,"../defaultOptions":18,"../interact":21,"../scope":34,"../utils":44,"../utils/Signals":35,"../utils/browser":37,"./InteractableMethods":12}],14:[function(e,t,n){"use strict";var r=e("./base"),i=e("../Interaction");i.signals.on("new",function(e){e.delayTimer=null}),r.signals.on("prepared",function(e){var t=e.interaction,n=t.prepared.name;if(n){var r=t.target.options[n].delay;r>0&&(t.delayTimer=setTimeout(function(){t.start(t.prepared,t.target,t.element)},r))}}),i.signals.on("move",function(e){var t=e.interaction,n=e.duplicate;t.pointerWasMoved&&!n&&clearTimeout(t.delayTimer)}),r.signals.on("before-start",function(e){var t=e.interaction,n=t.prepared.name;if(n){t.target.options[n].delay>0&&(t.prepared.name=null)}})},{"../Interaction":5,"./base":13}],15:[function(e,t,n){"use strict";function r(e,t){if(!t)return!1;var n=t.options.drag.startAxis;return"xy"===e||"xy"===n||n===e}var i=e("./base"),o=e("../scope"),s=e("../utils/browser"),a=e("../utils/is"),l=e("../utils/domUtils"),c=l.matchesSelector,p=l.parentNode;i.setActionDefaults(e("../actions/drag")),i.signals.on("before-start",function(e){var t=e.interaction,n=e.eventTarget,l=e.dx,u=e.dy;if("drag"===t.prepared.name){var d=Math.abs(l),f=Math.abs(u),v=t.target.options.drag,g=v.startAxis,h=d>f?"x":dl.minSpeed&&g>l.endSpeed,b={interaction:t,pageCoords:v,statuses:f,preEnd:!0,requireEndOnly:!0};y&&!x&&(c.resetStatuses(f),m=c.setAll(b),m.shouldMove&&m.locked&&(h=!0)),(x||h)&&(p.copyCoords(i.upCoords,t.curCoords),t.pointers[0]=i.startEvent=new a(t,n,t.prepared.name,"inertiastart",t.element),i.t0=d,i.active=!0,i.allowResume=l.allowResume,t.simulation=i,o.fire(i.startEvent),x?(i.vx0=t.pointerDelta.client.vx,i.vy0=t.pointerDelta.client.vy,i.v0=g,r(t,i),p.extend(v,t.curCoords.page),v.x+=i.xe,v.y+=i.ye,c.resetStatuses(f),m=c.setAll(b),i.modifiedXe+=m.dx,i.modifiedYe+=m.dy,i.i=u.request(t.boundInertiaFrame)):(i.smoothEnd=!0,i.xe=m.dx,i.ye=m.dy,i.sx=i.sy=0,i.i=u.request(t.boundSmoothEndFrame)))}}),l.signals.on("stop-active",function(e){var t=e.interaction,n=t.inertiaStatus;n.active&&(u.cancel(n.i),n.active=!1,t.simulation=null)})},{"./InteractEvent":3,"./Interaction":5,"./modifiers":24,"./utils":44,"./utils/raf":50}],21:[function(e,t,n){"use strict";function r(e,t){var n=a.interactables.get(e,t);return n||(n=new l(e,t),n.events.global=p),n}var i=e("./utils/browser"),o=e("./utils/events"),s=e("./utils"),a=e("./scope"),l=e("./Interactable"),c=e("./Interaction"),p={};r.isSet=function(e,t){return-1!==a.interactables.indexOfElement(e,t&&t.context)},r.on=function(e,t,n){if(s.is.string(e)&&-1!==e.search(" ")&&(e=e.trim().split(/ +/)),s.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.on(f,t,n)}return r}if(s.is.object(e)){for(var v in e)r.on(v,e[v],t);return r}return s.contains(l.eventTypes,e)?p[e]?p[e].push(t):p[e]=[t]:o.add(a.document,e,t,{options:n}),r},r.off=function(e,t,n){if(s.is.string(e)&&-1!==e.search(" ")&&(e=e.trim().split(/ +/)),s.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.off(f,t,n)}return r}if(s.is.object(e)){for(var v in e)r.off(v,e[v],t);return r}if(s.contains(l.eventTypes,e)){var g=void 0;e in p&&-1!==(g=s.indexOf(p[e],t))&&p[e].splice(g,1)}else o.remove(a.document,e,t,n);return r},r.debug=function(){return a},r.getPointerAverage=s.pointerAverage,r.getTouchBBox=s.touchBBox,r.getTouchDistance=s.touchDistance,r.getTouchAngle=s.touchAngle,r.getElementRect=s.getElementRect,r.getElementClientRect=s.getElementClientRect,r.matchesSelector=s.matchesSelector,r.closest=s.closest,r.supportsTouch=function(){return i.supportsTouch},r.supportsPointerEvent=function(){return i.supportsPointerEvent},r.stop=function(e){for(var t=a.interactions.length-1;t>=0;t--)a.interactions[t].stop(e);return r},r.pointerMoveTolerance=function(e){return s.is.number(e)?(c.pointerMoveTolerance=e,this):c.pointerMoveTolerance},r.addDocument=a.addDocument,r.removeDocument=a.removeDocument,a.interact=r,t.exports=r},{"./Interactable":4,"./Interaction":5,"./scope":34,"./utils":44,"./utils/browser":37,"./utils/events":40}],22:[function(e,t,n){"use strict";function r(e){var t=e.interaction,n=e.event;t.target&&t.target.checkAndPreventDefault(n)}var i=e("./Interactable"),o=e("./Interaction"),s=e("./scope"),a=e("./utils/is"),l=e("./utils/events"),c=e("./utils/domUtils"),p=c.nodeContains,u=c.matchesSelector;i.prototype.preventDefault=function(e){return/^(always|never|auto)$/.test(e)?(this.options.preventDefault=e,this):a.bool(e)?(this.options.preventDefault=e?"always":"never",this):this.options.preventDefault},i.prototype.checkAndPreventDefault=function(e){var t=this.options.preventDefault;if("never"!==t)return"always"===t?void e.preventDefault():void(l.supportsOptions||/^(mouse|pointer|touch)*(down|start)/i.test(e.type)||a.element(e.target)&&u(e.target,"input,select,textarea,[contenteditable=true],[contenteditable=true] *")||e.preventDefault())};for(var d=["down","move","up","cancel"],f=0;f=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i;if(o.element&&(o.element===e.target||p(o.element,e.target)))return void o.target.checkAndPreventDefault(e)}}},{"./Interactable":4,"./Interaction":5,"./scope":34,"./utils/domUtils":39,"./utils/events":40,"./utils/is":46}],23:[function(e,t,n){"use strict";function r(e){var t=e.target,n=a.search(e,e.type,t);n&&n.prevTap&&e.clientX===n.prevTap.clientX&&e.clientY===n.prevTap.clientY&&t===n.prevTap.target&&(n.downTargets[0]=t,n.downTimes[0]=(new Date).getTime(),l.fire({interaction:n,event:e,eventTarget:t,pointer:e,type:"tap"}))}var i=e("./scope"),o=e("./utils/events"),s=e("./utils/browser"),a=e("./utils/interactionFinder"),l=e("./pointerEvents/base"),c=e("./utils/window"),p=c.window,u=Object.prototype.toString;if(p.Array.isArray||(p.Array.isArray=function(e){return"[object Array]"===u.call(e)}),String.prototype.trim||(String.prototype.trim=function(){return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")}),s.isIE8){var d=function(e){for(var t=i.interactions,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var o;if(n){if(r>=t.length)break;o=t[r++]}else{if(r=t.next(),r.done)break;o=r.value}var s=o;s.interacting()&&s.target.checkAndPreventDefault(e)}},f=function(e,t){var n=e.doc,i=(e.win,0===t.indexOf("listen")?o.add:o.remove);i(n,"selectstart",d),l&&i(n,"dblclick",r)};i.signals.on("add-document",f),i.signals.on("remove-document",f)}t.exports=null},{"./pointerEvents/base":31,"./scope":34,"./utils/browser":37,"./utils/events":40,"./utils/interactionFinder":45,"./utils/window":52}],24:[function(e,t,n){"use strict";function r(e,t,n){return e&&e.enabled&&(t||!e.endOnly)&&(!n||e.endOnly)}var i=e("../InteractEvent"),o=e("../Interaction"),s=e("../utils/extend"),a={names:[],setOffsets:function(e){var t=e.interaction,n=e.pageCoords,r=t.target,i=t.element,o=t.startOffset,s=r.getRect(i);s?(o.left=n.x-s.left,o.top=n.y-s.top,o.right=s.right-n.x,o.bottom=s.bottom-n.y,"width"in s||(s.width=s.right-s.left),"height"in s||(s.height=s.bottom-s.top)):o.left=o.top=o.right=o.bottom=0,e.rect=s,e.interactable=r,e.element=i;for(var l=0;l=p.length)break;f=p[d++]}else{if(d=p.next(),d.done)break;f=d.value}var v=f,g=a[v],h=t.target.options[t.prepared.name][v];r(h,i,o)&&(e.status=e.status=n[v],e.options=h,e.offset=e.interaction.modifierOffsets[v],g.set(e),e.status.locked&&(l.x+=e.status.dx,l.y+=e.status.dy,c.dx+=e.status.dx,c.dy+=e.status.dy,c.locked=!0))}return c.shouldMove=!e.status||!c.locked||e.status.changed,c},resetStatuses:function(e){for(var t=a.names,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var i;if(n){if(r>=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i,s=e[o]||{};s.dx=s.dy=0,s.modifiedX=s.modifiedY=NaN,s.locked=!1,s.changed=!0,e[o]=s}return e},start:function(e,t){var n=e.interaction,r={interaction:n,pageCoords:("action-resume"===t?n.curCoords:n.startCoords).page,startOffset:n.startOffset,statuses:n.modifierStatuses,preEnd:!1,requireEndOnly:!1};a.setOffsets(r),a.resetStatuses(r.statuses),r.pageCoords=s({},n.startCoords.page),n.modifierResult=a.setAll(r)}};o.signals.on("new",function(e){e.startOffset={left:0,right:0,top:0,bottom:0},e.modifierOffsets={},e.modifierStatuses=a.resetStatuses({}),e.modifierResult=null}),o.signals.on("action-start",a.start),o.signals.on("action-resume",a.start),o.signals.on("before-action-move",function(e){var t=e.interaction,n=e.preEnd,r=e.interactingBeforeMove,i=a.setAll({interaction:t,preEnd:n,pageCoords:t.curCoords.page,statuses:t.modifierStatuses,requireEndOnly:!1});!i.shouldMove&&r&&(t._dontFireMove=!0),t.modifierResult=i}),o.signals.on("action-end",function(e){for(var t=e.interaction,n=e.event,i=0;i=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}var m=h,y=m.x,x=m.y;l.push({x:s.left-i.width*y+u.x,y:s.top-i.height*x+u.y})}else l.push(u);return l},set:function(e){var t=e.interaction,n=e.pageCoords,r=e.status,i=e.options,s=e.offset,a=[],l=void 0,c=void 0,p=void 0;if(r.useStatusXY)c={x:r.x,y:r.y};else{var u=o.getOriginXY(t.target,t.element,t.prepared.name);c=o.extend({},n),c.x-=u.x,c.y-=u.y}r.realX=c.x,r.realY=c.y;for(var d=i.targets?i.targets.length:0,f=s,v=Array.isArray(f),g=0,f=v?f:f[Symbol.iterator]();;){var h;if(v){if(g>=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}for(var m=h,y=m.x,x=m.y,b=c.x-y,w=c.y-x,E=i.targets,S=Array.isArray(E),T=0,E=S?E:E[Symbol.iterator]();;){var C;if(S){if(T>=E.length)break;C=E[T++]}else{if(T=E.next(),T.done)break;C=T.value}var A=C;l=o.is.function(A)?A(b,w,t):A,l&&a.push({x:o.is.number(l.x)?l.x+y:b,y:o.is.number(l.y)?l.y+x:w,range:o.is.number(l.range)?l.range:i.range})}}var D={target:null,inRange:!1,distance:0,range:0,dx:0,dy:0};for(p=0,d=a.length;p=p.length)break;f=p[d++]}else{if(d=p.next(),d.done)break;f=d.value}var v=f,g=void 0;g=a.is.function(v)?v(l,c,t):v,g&&("width"in g&&"height"in g&&(g.x=g.width, +g.y=g.height),e.options.targets.push(g))}i.set(e)},modifyCoords:function(e){var t=e.options;e.options=a.extend({},t),e.options.enabled=t.enabled,e.options.relativePoints=[null],i.modifyCoords(e)}};r.snapSize=l,r.names.push("snapSize"),o.perAction.snapSize=l.defaults,s.defaults.snapSize=l.defaults,t.exports=l},{"../actions/resize":10,"../defaultOptions":18,"../utils/":44,"./index":24,"./snap":28}],30:[function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=e("../utils/pointerUtils");t.exports=function(){function e(t,n,o,s,a){if(r(this,e),i.pointerExtend(this,o),o!==n&&i.pointerExtend(this,n),this.interaction=a,this.timeStamp=(new Date).getTime(),this.originalEvent=o,this.type=t,this.pointerId=i.getPointerId(n),this.pointerType=i.getPointerType(n),this.target=s,this.currentTarget=null,"tap"===t){var l=a.getPointerIndex(n);this.dt=this.timeStamp-a.downTimes[l];var c=this.timeStamp-a.tapTime;this.double=!!(a.prevTap&&"doubletap"!==a.prevTap.type&&a.prevTap.target===this.target&&c<500)}else"doubletap"===t&&(this.dt=n.timeStamp-a.tapTime)}return e.prototype.subtractOrigin=function(e){var t=e.x,n=e.y;return this.pageX-=t,this.pageY-=n,this.clientX-=t,this.clientY-=n,this},e.prototype.addOrigin=function(e){var t=e.x,n=e.y;return this.pageX+=t,this.pageY+=n,this.clientX+=t,this.clientY+=n,this},e.prototype.preventDefault=function(){this.originalEvent.preventDefault()},e.prototype.stopPropagation=function(){this.propagationStopped=!0},e.prototype.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},e}()},{"../utils/pointerUtils":49}],31:[function(e,t,n){"use strict";function r(e){for(var t=e.interaction,n=e.pointer,s=e.event,l=e.eventTarget,c=e.type,u=void 0===c?e.pointerEvent.type:c,d=e.targets,f=void 0===d?i(e):d,v=e.pointerEvent,g=void 0===v?new o(u,n,s,l,t):v,h={interaction:t,pointer:n,event:s,eventTarget:l,targets:f,type:u,pointerEvent:g},m=0;m=u.length)break;g=u[v++]}else{if(v=u.next(),v.done)break;g=v.value}var h=g;c.element=h,p.fire("collect-targets",c)}return"hold"===o&&(c.targets=d(c.targets,function(e){return e.eventable.options.holdDuration===t.holdTimers[s].duration})),c.targets}var o=e("./PointerEvent"),s=e("../Interaction"),a=e("../utils"),l=e("../utils/browser"),c=e("../defaultOptions"),p=e("../utils/Signals").new(),u=e("../utils/arr"),d=u.filter,f=["down","up","cancel"],v=["down","up","cancel"],g={PointerEvent:o,fire:r,collectEventTargets:i,signals:p,defaults:{holdDuration:600,ignoreFrom:null,allowFrom:null,origin:{x:0,y:0}},types:["down","move","up","cancel","tap","doubletap","hold"]};s.signals.on("update-pointer-down",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers[n]={duration:1/0,timeout:null}}),s.signals.on("remove-pointer",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers.splice(n,1)}),s.signals.on("move",function(e){var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,s=e.duplicateMove,a=t.getPointerIndex(n);s||t.pointerIsDown&&!t.pointerWasMoved||(t.pointerIsDown&&clearTimeout(t.holdTimers[a].timeout),r({interaction:t,pointer:n,event:i,eventTarget:o,type:"move"}))}),s.signals.on("down",function(e){for(var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,s=e.pointerIndex,c=l.isIE8?a.extend({},i):i,u=t.holdTimers[s],d=a.getPath(o),f={interaction:t,pointer:n,event:i,eventTarget:o,type:"hold",targets:[],path:d,element:null},v=d,g=Array.isArray(v),h=0,v=g?v:v[Symbol.iterator]();;){var m;if(g){if(h>=v.length)break;m=v[h++]}else{if(h=v.next(),h.done)break;m=h.value}var y=m;f.element=y,p.fire("collect-targets",f)}if(f.targets.length){for(var x=1/0,b=0;b=0&&(p.selectors[u]!==e||p.contexts[u]!==t);u--);-1===u&&(u=p.selectors.length,p.selectors.push(e),p.contexts.push(t),p.listeners.push([])),p.listeners[u].push([i,!!s.capture,s.passive])}function s(e,t,n,r,o){var s=f(o),c=O[n],p=!1,u=void 0;if(c)for(u=c.selectors.length-1;u>=0;u--)if(c.selectors[u]===e&&c.contexts[u]===t){for(var d=c.listeners[u],v=d.length-1;v>=0;v--){var g=d[v],h=g[0],m=g[1],y=g[2];if(h===r&&m===!!s.capture&&y===s.passive){d.splice(v,1),d.length||(c.selectors.splice(u,1),c.contexts.splice(u,1),c.listeners.splice(u,1),i(t,n,a),i(t,n,l,!0),c.selectors.length||(O[n]=null)),p=!0;break}}if(p)break}}function a(e,t){var n=f(t),r={},i=O[e.type],o=g.getActualElement(e.path?e.path[0]:e.target),s=o;for(h(r,e),r.originalEvent=e,r.preventDefault=p;v.element(s);){for(var a=0;a=l.length)break;u=l[p++]}else{if(p=l.next(),p.done)break;u=p.value}var d=u,f=o[d](a);if(f)return f}},simulationResume:function(e){var t=e.pointerType,n=e.eventType,o=e.eventTarget;if(!/down|start/i.test(n))return null;for(var s=r.interactions,a=Array.isArray(s),l=0,s=a?s:s[Symbol.iterator]();;){var c;if(a){if(l>=s.length)break;c=s[l++]}else{if(l=s.next(),l.done)break;c=l.value}var p=c,u=o;if(p.simulation&&p.simulation.allowResume&&p.pointerType===t)for(;u;){if(u===p.element)return p;u=i.parentNode(u)}}return null},mouseOrPen:function(e){var t=e.pointerId,n=e.pointerType,o=e.eventType;if("mouse"!==n&&"pen"!==n)return null;for(var s=void 0,a=r.interactions,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var u=p;if(u.pointerType===n){if(u.simulation&&!i.contains(u.pointerIds,t))continue;if(u.interacting())return u;s||(s=u)}}if(s)return s;for(var d=r.interactions,f=Array.isArray(d),v=0,d=f?d:d[Symbol.iterator]();;){var g;if(f){if(v>=d.length)break;g=d[v++]}else{if(v=d.next(),v.done)break;g=v.value}var h=g;if(!(h.pointerType!==n||/down/i.test(o)&&h.simulation))return h}return null},hasPointer:function(e){for(var t=e.pointerId,n=r.interactions,o=Array.isArray(n),s=0,n=o?n:n[Symbol.iterator]();;){var a;if(o){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var l=a;if(i.contains(l.pointerIds,t))return l}},idle:function(e){for(var t=e.pointerType,n=r.interactions,i=Array.isArray(n),o=0,n=i?n:n[Symbol.iterator]();;){var s;if(i){if(o>=n.length)break;s=n[o++]}else{if(o=n.next(),o.done)break;s=o.value}var a=s;if(1===a.pointerIds.length){var l=a.target;if(l&&!l.options.gesture.enabled)continue}else if(a.pointerIds.length>=2)continue;if(!a.interacting()&&t===a.pointerType)return a}return null}};t.exports=o},{"../scope":34,"./index":44}],46:[function(e,t,n){"use strict";var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},i=e("./window"),o=e("./isWindow"),s={array:function(){},window:function(e){return e===i.window||o(e)},docFrag:function(e){return s.object(e)&&11===e.nodeType},object:function(e){return!!e&&"object"===(void 0===e?"undefined":r(e))},function:function(e){return"function"==typeof e},number:function(e){return"number"==typeof e},bool:function(e){return"boolean"==typeof e},string:function(e){return"string"==typeof e},element:function(e){if(!e||"object"!==(void 0===e?"undefined":r(e)))return!1;var t=i.getWindow(e)||i.window;return/object|function/.test(r(t.Element))?e instanceof t.Element:1===e.nodeType&&"string"==typeof e.nodeName}};s.array=function(e){return s.object(e)&&void 0!==e.length&&s.function(e.splice)},t.exports=s},{"./isWindow":47,"./window":52}],47:[function(e,t,n){"use strict";t.exports=function(e){return!(!e||!e.Window)&&e instanceof e.Window}},{}],48:[function(e,t,n){"use strict";function r(e,n){for(var r in n){var i=t.exports.prefixedPropREs,o=!1;for(var s in i)if(0===r.indexOf(s)&&i[s].test(r)){o=!0;break}o||"function"==typeof n[r]||(e[r]=n[r])}return e}r.prefixedPropREs={webkit:/(Movement[XY]|Radius[XY]|RotationAngle|Force)$/},t.exports=r},{}],49:[function(e,t,n){"use strict";var r=e("./hypot"),i=e("./browser"),o=e("./domObjects"),s=e("./domUtils"),a=e("./domObjects"),l=e("./is"),c=e("./pointerExtend"),p={copyCoords:function(e,t){e.page=e.page||{},e.page.x=t.page.x,e.page.y=t.page.y,e.client=e.client||{},e.client.x=t.client.x,e.client.y=t.client.y,e.timeStamp=t.timeStamp},setCoordDeltas:function(e,t,n){e.page.x=n.page.x-t.page.x,e.page.y=n.page.y-t.page.y,e.client.x=n.client.x-t.client.x,e.client.y=n.client.y-t.client.y,e.timeStamp=n.timeStamp-t.timeStamp;var i=Math.max(e.timeStamp/1e3,.001);e.page.speed=r(e.page.x,e.page.y)/i,e.page.vx=e.page.x/i,e.page.vy=e.page.y/i,e.client.speed=r(e.client.x,e.page.y)/i,e.client.vx=e.client.x/i,e.client.vy=e.client.y/i},isNativePointer:function(e){return e instanceof o.Event||e instanceof o.Touch},getXY:function(e,t,n){return n=n||{},e=e||"page",n.x=t[e+"X"],n.y=t[e+"Y"],n},getPageXY:function(e,t){return t=t||{},i.isOperaMobile&&p.isNativePointer(e)?(p.getXY("screen",e,t),t.x+=window.scrollX,t.y+=window.scrollY):p.getXY("page",e,t),t},getClientXY:function(e,t){return t=t||{},i.isOperaMobile&&p.isNativePointer(e)?p.getXY("screen",e,t):p.getXY("client",e,t),t},getPointerId:function(e){return l.number(e.pointerId)?e.pointerId:e.identifier},setCoords:function(e,t,n){var r=t.length>1?p.pointerAverage(t):t[0],i={};p.getPageXY(r,i),e.page.x=i.x,e.page.y=i.y,p.getClientXY(r,i),e.client.x=i.x,e.client.y=i.y,e.timeStamp=l.number(n)?n:(new Date).getTime()},pointerExtend:c,getTouchPair:function(e){var t=[];return l.array(e)?(t[0]=e[0],t[1]=e[1]):"touchend"===e.type?1===e.touches.length?(t[0]=e.touches[0],t[1]=e.changedTouches[0]):0===e.touches.length&&(t[0]=e.changedTouches[0],t[1]=e.changedTouches[1]):(t[0]=e.touches[0],t[1]=e.touches[1]),t},pointerAverage:function(e){for(var t={pageX:0,pageY:0,clientX:0,clientY:0,screenX:0,screenY:0},n=e,r=Array.isArray(n),i=0,n=r?n:n[Symbol.iterator]();;){var o;if(r){if(i>=n.length)break;o=n[i++]}else{if(i=n.next(),i.done)break;o=i.value}var s=o;for(var a in t)t[a]+=s[a]}for(var l in t)t[l]/=e.length;return t},touchBBox:function(e){if(e.length||e.touches&&e.touches.length>1){var t=p.getTouchPair(e),n=Math.min(t[0].pageX,t[1].pageX),r=Math.min(t[0].pageY,t[1].pageY);return{x:n,y:r,left:n,top:r,width:Math.max(t[0].pageX,t[1].pageX)-n,height:Math.max(t[0].pageY,t[1].pageY)-r}}},touchDistance:function(e,t){var n=t+"X",i=t+"Y",o=p.getTouchPair(e),s=o[0][n]-o[1][n],a=o[0][i]-o[1][i];return r(s,a)},touchAngle:function(e,t,n){var r=n+"X",i=n+"Y",o=p.getTouchPair(e),s=o[1][r]-o[0][r],a=o[1][i]-o[0][i];return 180*Math.atan2(a,s)/Math.PI},getPointerType:function(e){return l.string(e.pointerType)?e.pointerType:l.number(e.pointerType)?[void 0,void 0,"touch","pen","mouse"][e.pointerType]:/touch/.test(e.type)||e instanceof a.Touch?"touch":"mouse"},getEventTargets:function(e){return[s.getActualElement(e.path?e.path[0]:e.target),s.getActualElement(e.currentTarget)]}};t.exports=p},{"./browser":37,"./domObjects":38,"./domUtils":39,"./hypot":43,"./is":46,"./pointerExtend":48}],50:[function(e,t,n){"use strict";for(var r=e("./window"),i=r.window,o=["ms","moz","webkit","o"],s=0,a=void 0,l=void 0,c=0;c\n * Open source under the MIT License.\n * https://raw.github.com/taye/interact.js/master/LICENSE\n */\n","/*\n * In a (windowless) server environment this file exports a factory function\n * that takes the window to use.\n *\n * var interact = require('interact.js')(windowObject);\n *\n * See https://github.com/taye/interact.js/issues/187\n */\nif (typeof window === 'undefined') {\n module.exports = function (window) {\n require('./src/utils/window').init(window);\n\n return require('./src/index');\n };\n}\nelse {\n module.exports = require('./src/index');\n}\n","const { indexOf } = require('./utils/arr');\nconst extend = require('./utils/extend.js');\n\nfunction fireUntilImmediateStopped (event, listeners) {\n for (let i = 0, len = listeners.length; i < len && !event.immediatePropagationStopped; i++) {\n listeners[i](event);\n }\n}\n\nclass Eventable {\n\n constructor (options) {\n this.options = extend({}, options || {});\n }\n\n fire (event) {\n let listeners;\n const onEvent = 'on' + event.type;\n const global = this.global;\n\n // Interactable#on() listeners\n if ((listeners = this[event.type])) {\n fireUntilImmediateStopped(event, listeners);\n }\n\n // interactable.onevent listener\n if (this[onEvent]) {\n this[onEvent](event);\n }\n\n // interact.on() listeners\n if (!event.propagationStopped && global && (listeners = global[event.type])) {\n fireUntilImmediateStopped(event, listeners);\n }\n }\n\n on (eventType, listener) {\n // if this type of event was never bound\n if (this[eventType]) {\n this[eventType].push(listener);\n }\n else {\n this[eventType] = [listener];\n }\n }\n\n off (eventType, listener) {\n // if it is an action event type\n const eventList = this[eventType];\n const index = eventList? indexOf(eventList, listener) : -1;\n\n if (index !== -1) {\n eventList.splice(index, 1);\n }\n\n if (eventList && eventList.length === 0 || !listener) {\n this[eventType] = listener;\n }\n }\n}\n\nmodule.exports = Eventable;\n","const extend = require('./utils/extend');\nconst getOriginXY = require('./utils/getOriginXY');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nclass InteractEvent {\n constructor (interaction, event, action, phase, element, related, preEnd = false) {\n const target = interaction.target;\n const deltaSource = (target && target.options || defaults).deltaSource;\n const origin = getOriginXY(target, element, action);\n const starting = phase === 'start';\n const ending = phase === 'end';\n const coords = starting? interaction.startCoords : interaction.curCoords;\n const prevEvent = interaction.prevEvent;\n\n element = element || interaction.element;\n\n const page = extend({}, coords.page);\n const client = extend({}, coords.client);\n\n page.x -= origin.x;\n page.y -= origin.y;\n\n client.x -= origin.x;\n client.y -= origin.y;\n\n this.ctrlKey = event.ctrlKey;\n this.altKey = event.altKey;\n this.shiftKey = event.shiftKey;\n this.metaKey = event.metaKey;\n this.button = event.button;\n this.buttons = event.buttons;\n this.target = element;\n this.currentTarget = element;\n this.relatedTarget = related || null;\n this.preEnd = preEnd;\n this.type = action + (phase || '');\n this.interaction = interaction;\n this.interactable = target;\n\n this.t0 = starting ? interaction.downTimes[interaction.downTimes.length - 1]\n : prevEvent.t0;\n\n const signalArg = {\n interaction,\n event,\n action,\n phase,\n element,\n related,\n page,\n client,\n coords,\n starting,\n ending,\n deltaSource,\n iEvent: this,\n };\n\n signals.fire('set-xy', signalArg);\n\n if (ending) {\n // use previous coords when ending\n this.pageX = prevEvent.pageX;\n this.pageY = prevEvent.pageY;\n this.clientX = prevEvent.clientX;\n this.clientY = prevEvent.clientY;\n }\n else {\n this.pageX = page.x;\n this.pageY = page.y;\n this.clientX = client.x;\n this.clientY = client.y;\n }\n\n this.x0 = interaction.startCoords.page.x - origin.x;\n this.y0 = interaction.startCoords.page.y - origin.y;\n this.clientX0 = interaction.startCoords.client.x - origin.x;\n this.clientY0 = interaction.startCoords.client.y - origin.y;\n\n signals.fire('set-delta', signalArg);\n\n this.timeStamp = coords.timeStamp;\n this.dt = interaction.pointerDelta.timeStamp;\n this.duration = this.timeStamp - this.t0;\n\n // speed and velocity in pixels per second\n this.speed = interaction.pointerDelta[deltaSource].speed;\n this.velocityX = interaction.pointerDelta[deltaSource].vx;\n this.velocityY = interaction.pointerDelta[deltaSource].vy;\n\n this.swipe = (ending || phase === 'inertiastart')? this.getSwipe() : null;\n\n signals.fire('new', signalArg);\n }\n\n getSwipe () {\n const interaction = this.interaction;\n\n if (interaction.prevEvent.speed < 600\n || this.timeStamp - interaction.prevEvent.timeStamp > 150) {\n return null;\n }\n\n let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI;\n const overlap = 22.5;\n\n if (angle < 0) {\n angle += 360;\n }\n\n const left = 135 - overlap <= angle && angle < 225 + overlap;\n const up = 225 - overlap <= angle && angle < 315 + overlap;\n\n const right = !left && (315 - overlap <= angle || angle < 45 + overlap);\n const down = !up && 45 - overlap <= angle && angle < 135 + overlap;\n\n return {\n up,\n down,\n left,\n right,\n angle,\n speed: interaction.prevEvent.speed,\n velocity: {\n x: interaction.prevEvent.velocityX,\n y: interaction.prevEvent.velocityY,\n },\n };\n }\n\n preventDefault () {}\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n}\n\nsignals.on('set-delta', function ({ iEvent, interaction, starting, deltaSource }) {\n const prevEvent = starting? iEvent : interaction.prevEvent;\n\n if (deltaSource === 'client') {\n iEvent.dx = iEvent.clientX - prevEvent.clientX;\n iEvent.dy = iEvent.clientY - prevEvent.clientY;\n }\n else {\n iEvent.dx = iEvent.pageX - prevEvent.pageX;\n iEvent.dy = iEvent.pageY - prevEvent.pageY;\n }\n});\n\nInteractEvent.signals = signals;\n\nmodule.exports = InteractEvent;\n","const is = require('./utils/is');\nconst events = require('./utils/events');\nconst extend = require('./utils/extend');\nconst actions = require('./actions/base');\nconst scope = require('./scope');\nconst Eventable = require('./Eventable');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nconst {\n getElementRect,\n nodeContains,\n trySelector,\n} = require('./utils/domUtils');\nconst { getWindow } = require('./utils/window');\nconst { indexOf, contains } = require('./utils/arr');\nconst { wheelEvent } = require('./utils/browser');\n\n// all set interactables\nscope.interactables = [];\n\n/*\\\n * Interactable\n [ property ]\n **\n * Object type returned by @interact\n\\*/\nclass Interactable {\n constructor (target, options) {\n options = options || {};\n\n this.target = target;\n this.events = new Eventable();\n this._context = options.context || scope.document;\n this._win = getWindow(trySelector(target)? this._context : target);\n this._doc = this._win.document;\n\n signals.fire('new', {\n target,\n options,\n interactable: this,\n win: this._win,\n });\n\n scope.addDocument( this._doc, this._win );\n\n scope.interactables.push(this);\n\n this.set(options);\n }\n\n setOnEvents (action, phases) {\n const onAction = 'on' + action;\n\n if (is.function(phases.onstart) ) { this.events[onAction + 'start' ] = phases.onstart ; }\n if (is.function(phases.onmove) ) { this.events[onAction + 'move' ] = phases.onmove ; }\n if (is.function(phases.onend) ) { this.events[onAction + 'end' ] = phases.onend ; }\n if (is.function(phases.oninertiastart)) { this.events[onAction + 'inertiastart' ] = phases.oninertiastart ; }\n\n return this;\n }\n\n setPerAction (action, options) {\n // for all the default per-action options\n for (const option in options) {\n // if this option exists for this action\n if (option in defaults[action]) {\n // if the option in the options arg is an object value\n if (is.object(options[option])) {\n // duplicate the object\n this.options[action][option] = extend(this.options[action][option] || {}, options[option]);\n\n if (is.object(defaults.perAction[option]) && 'enabled' in defaults.perAction[option]) {\n this.options[action][option].enabled = options[option].enabled === false? false : true;\n }\n }\n else if (is.bool(options[option]) && is.object(defaults.perAction[option])) {\n this.options[action][option].enabled = options[option];\n }\n else if (options[option] !== undefined) {\n // or if it's not undefined, do a plain assignment\n this.options[action][option] = options[option];\n }\n }\n }\n }\n\n /*\\\n * Interactable.getRect\n [ method ]\n *\n * The default function to get an Interactables bounding rect. Can be\n * overridden using @Interactable.rectChecker.\n *\n - element (Element) #optional The element to measure.\n = (object) The object's bounding rectangle.\n o {\n o top : 0,\n o left : 0,\n o bottom: 0,\n o right : 0,\n o width : 0,\n o height: 0\n o }\n \\*/\n getRect (element) {\n element = element || this.target;\n\n if (is.string(this.target) && !(is.element(element))) {\n element = this._context.querySelector(this.target);\n }\n\n return getElementRect(element);\n }\n\n /*\\\n * Interactable.rectChecker\n [ method ]\n *\n * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n - checker (function) #optional A function which returns this Interactable's bounding rectangle. See @Interactable.getRect\n = (function | object) The checker function or this Interactable\n \\*/\n rectChecker (checker) {\n if (is.function(checker)) {\n this.getRect = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.getRect;\n\n return this;\n }\n\n return this.getRect;\n }\n\n _backCompatOption (optionName, newValue) {\n if (trySelector(newValue) || is.object(newValue)) {\n this.options[optionName] = newValue;\n\n for (const action of actions.names) {\n this.options[action][optionName] = newValue;\n }\n\n return this;\n }\n\n return this.options[optionName];\n }\n\n /*\\\n * Interactable.origin\n [ method ]\n *\n * Gets or sets the origin of the Interactable's element. The x and y\n * of the origin will be subtracted from action event coordinates.\n *\n - origin (object | string) #optional An object eg. { x: 0, y: 0 } or string 'parent', 'self' or any CSS selector\n * OR\n - origin (Element) #optional An HTML or SVG Element whose rect will be used\n **\n = (object) The current origin or this Interactable\n \\*/\n origin (newValue) {\n return this._backCompatOption('origin', newValue);\n }\n\n /*\\\n * Interactable.deltaSource\n [ method ]\n *\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n - newValue (string) #optional Use 'client' if you will be scrolling while interacting; Use 'page' if you want autoScroll to work\n = (string | object) The current deltaSource or this Interactable\n \\*/\n deltaSource (newValue) {\n if (newValue === 'page' || newValue === 'client') {\n this.options.deltaSource = newValue;\n\n return this;\n }\n\n return this.options.deltaSource;\n }\n\n /*\\\n * Interactable.context\n [ method ]\n *\n * Gets the selector context Node of the Interactable. The default is `window.document`.\n *\n = (Node) The context Node of this Interactable\n **\n \\*/\n context () {\n return this._context;\n }\n\n inContext (element) {\n return (this._context === element.ownerDocument\n || nodeContains(this._context, element));\n }\n\n /*\\\n * Interactable.fire\n [ method ]\n *\n * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n - iEvent (InteractEvent) The InteractEvent object to be fired on this Interactable\n = (Interactable) this Interactable\n \\*/\n fire (iEvent) {\n this.events.fire(iEvent);\n\n return this;\n }\n\n _onOffMultiple (method, eventType, listener, options) {\n if (is.string(eventType) && eventType.search(' ') !== -1) {\n eventType = eventType.trim().split(/ +/);\n }\n\n if (is.array(eventType)) {\n for (let i = 0; i < eventType.length; i++) {\n this[method](eventType[i], listener, options);\n }\n\n return true;\n }\n\n if (is.object(eventType)) {\n for (const prop in eventType) {\n this[method](prop, eventType[prop], listener);\n }\n\n return true;\n }\n }\n\n /*\\\n * Interactable.on\n [ method ]\n *\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n - eventType (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) This Interactable\n \\*/\n on (eventType, listener, options) {\n if (this._onOffMultiple('on', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.on(eventType, listener);\n }\n // delegated event for selector\n else if (is.string(this.target)) {\n events.addDelegate(this.target, this._context, eventType, listener, options);\n }\n else {\n events.add(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.off\n [ method ]\n *\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n - eventType (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) This Interactable\n \\*/\n off (eventType, listener, options) {\n if (this._onOffMultiple('off', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n // if it is an action event type\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.off(eventType, listener);\n }\n // delegated event\n else if (is.string(this.target)) {\n events.removeDelegate(this.target, this._context, eventType, listener, options);\n }\n // remove listener from this Interatable's element\n else {\n events.remove(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.set\n [ method ]\n *\n * Reset the options of this Interactable\n - options (object) The new settings to apply\n = (object) This Interactable\n \\*/\n set (options) {\n if (!is.object(options)) {\n options = {};\n }\n\n this.options = extend({}, defaults.base);\n\n const perActions = extend({}, defaults.perAction);\n\n for (const actionName in actions.methodDict) {\n const methodName = actions.methodDict[actionName];\n\n this.options[actionName] = extend({}, defaults[actionName]);\n\n this.setPerAction(actionName, perActions);\n\n this[methodName](options[actionName]);\n }\n\n for (const setting of Interactable.settingsMethods) {\n this.options[setting] = defaults.base[setting];\n\n if (setting in options) {\n this[setting](options[setting]);\n }\n }\n\n signals.fire('set', {\n options,\n interactable: this,\n });\n\n return this;\n }\n\n /*\\\n * Interactable.unset\n [ method ]\n *\n * Remove this interactable from the list of interactables and remove\n * it's action capabilities and event listeners\n *\n = (object) @interact\n \\*/\n unset () {\n events.remove(this.target, 'all');\n\n if (is.string(this.target)) {\n // remove delegated events\n for (const type in events.delegatedEvents) {\n const delegated = events.delegatedEvents[type];\n\n if (delegated.selectors[0] === this.target\n && delegated.contexts[0] === this._context) {\n\n delegated.selectors.splice(0, 1);\n delegated.contexts .splice(0, 1);\n delegated.listeners.splice(0, 1);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegated[type] = null;\n }\n }\n\n events.remove(this._context, type, events.delegateListener);\n events.remove(this._context, type, events.delegateUseCapture, true);\n }\n }\n else {\n events.remove(this, 'all');\n }\n\n signals.fire('unset', { interactable: this });\n\n scope.interactables.splice(indexOf(scope.interactables, this), 1);\n\n // Stop related interactions when an Interactable is unset\n for (const interaction of scope.interactions || []) {\n if (interaction.target === this && interaction.interacting()) {\n interaction.stop();\n }\n }\n\n return scope.interact;\n }\n}\n\nscope.interactables.indexOfElement = function indexOfElement (target, context) {\n context = context || scope.document;\n\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n if (interactable.target === target && interactable._context === context) {\n return i;\n }\n }\n return -1;\n};\n\nscope.interactables.get = function interactableGet (element, options, dontCheckInContext) {\n const ret = this[this.indexOfElement(element, options && options.context)];\n\n return ret && (is.string(element) || dontCheckInContext || ret.inContext(element))? ret : null;\n};\n\nscope.interactables.forEachSelector = function (callback, element) {\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n // skip non CSS selector targets and out of context elements\n if (!is.string(interactable.target)\n || (element && !interactable.inContext(element))) {\n continue;\n }\n\n const ret = callback(interactable, interactable.target, interactable._context, i, this);\n\n if (ret !== undefined) {\n return ret;\n }\n }\n};\n\n// all interact.js eventTypes\nInteractable.eventTypes = scope.eventTypes = [];\n\nInteractable.signals = signals;\n\nInteractable.settingsMethods = [ 'deltaSource', 'origin', 'preventDefault', 'rectChecker' ];\n\nmodule.exports = Interactable;\n","const scope = require('./scope');\nconst utils = require('./utils');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst finder = require('./utils/interactionFinder');\nconst signals = require('./utils/Signals').new();\n\nconst listeners = {};\nconst methodNames = [\n 'pointerDown', 'pointerMove', 'pointerUp',\n 'updatePointer', 'removePointer',\n];\n\n// for ignoring browser's simulated mouse events\nlet prevTouchTime = 0;\n\n// all active and idle interactions\nscope.interactions = [];\n\nclass Interaction {\n constructor () {\n this.target = null; // current interactable being interacted with\n this.element = null; // the target element of the interactable\n\n this.prepared = { // action that's ready to be fired on next move event\n name : null,\n axis : null,\n edges: null,\n };\n\n // keep track of added pointers\n this.pointers = [];\n this.pointerIds = [];\n this.downTargets = [];\n this.downTimes = [];\n\n // Previous native pointer move event coordinates\n this.prevCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n // current native pointer move event coordinates\n this.curCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Starting InteractEvent pointer coordinates\n this.startCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Change in coordinates and time of the pointer\n this.pointerDelta = {\n page : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n client : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n timeStamp: 0,\n };\n\n this.downEvent = null; // pointerdown/mousedown/touchstart event\n this.downPointer = {};\n\n this._eventTarget = null;\n this._curEventTarget = null;\n\n this.prevEvent = null; // previous action event\n\n this.pointerIsDown = false;\n this.pointerWasMoved = false;\n this._interacting = false;\n\n this.mouse = false;\n\n signals.fire('new', this);\n\n scope.interactions.push(this);\n }\n\n pointerDown (pointer, event, eventTarget) {\n const pointerIndex = this.updatePointer(pointer, event, true);\n\n signals.fire('down', {\n pointer,\n event,\n eventTarget,\n pointerIndex,\n interaction: this,\n });\n }\n\n /*\\\n * Interaction.start\n [ method ]\n *\n * Start an action with the given Interactable and Element as tartgets. The\n * action must be enabled for the target Interactable and an appropriate number\n * of pointers must be held down - 1 for drag/resize, 2 for gesture.\n *\n * Use it with `interactable.able({ manualStart: false })` to always\n * [start actions manually](https://github.com/taye/interact.js/issues/114)\n *\n - action (object) The action to be performed - drag, resize, etc.\n - target (Interactable) The Interactable to target\n - element (Element) The DOM Element to target\n = (object) interact\n **\n | interact(target)\n | .draggable({\n | // disable the default drag start by down->move\n | manualStart: true\n | })\n | // start dragging after the user holds the pointer down\n | .on('hold', function (event) {\n | var interaction = event.interaction;\n |\n | if (!interaction.interacting()) {\n | interaction.start({ name: 'drag' },\n | event.interactable,\n | event.currentTarget);\n | }\n | });\n \\*/\n start (action, target, element) {\n if (this.interacting()\n || !this.pointerIsDown\n || this.pointerIds.length < (action.name === 'gesture'? 2 : 1)) {\n return;\n }\n\n // if this interaction had been removed after stopping\n // add it back\n if (utils.indexOf(scope.interactions, this) === -1) {\n scope.interactions.push(this);\n }\n\n utils.copyAction(this.prepared, action);\n this.target = target;\n this.element = element;\n\n signals.fire('action-start', {\n interaction: this,\n event: this.downEvent,\n });\n }\n\n pointerMove (pointer, event, eventTarget) {\n if (!this.simulation) {\n this.updatePointer(pointer);\n utils.setCoords(this.curCoords, this.pointers);\n }\n\n const duplicateMove = (this.curCoords.page.x === this.prevCoords.page.x\n && this.curCoords.page.y === this.prevCoords.page.y\n && this.curCoords.client.x === this.prevCoords.client.x\n && this.curCoords.client.y === this.prevCoords.client.y);\n\n let dx;\n let dy;\n\n // register movement greater than pointerMoveTolerance\n if (this.pointerIsDown && !this.pointerWasMoved) {\n dx = this.curCoords.client.x - this.startCoords.client.x;\n dy = this.curCoords.client.y - this.startCoords.client.y;\n\n this.pointerWasMoved = utils.hypot(dx, dy) > Interaction.pointerMoveTolerance;\n }\n\n const signalArg = {\n pointer,\n pointerIndex: this.getPointerIndex(pointer),\n event,\n eventTarget,\n dx,\n dy,\n duplicate: duplicateMove,\n interaction: this,\n interactingBeforeMove: this.interacting(),\n };\n\n if (!duplicateMove) {\n // set pointer coordinate, time changes and speeds\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n }\n\n signals.fire('move', signalArg);\n\n if (!duplicateMove) {\n // if interacting, fire an 'action-move' signal etc\n if (this.interacting()) {\n this.doMove(signalArg);\n }\n\n if (this.pointerWasMoved) {\n utils.copyCoords(this.prevCoords, this.curCoords);\n }\n }\n }\n\n /*\\\n * Interaction.doMove\n [ method ]\n *\n * Force a move of the current action at the same coordinates. Useful if\n * snap/restrict has been changed and you want a movement with the new\n * settings.\n *\n **\n | interact(target)\n | .draggable(true)\n | .on('dragmove', function (event) {\n | if (someCondition) {\n | // change the snap settings\n | event.interactable.draggable({ snap: { targets: [] }});\n | // fire another move event with re-calculated snap\n | event.interaction.doMove();\n | }\n | });\n \\*/\n doMove (signalArg) {\n signalArg = utils.extend({\n pointer: this.pointers[0],\n event: this.prevEvent,\n eventTarget: this._eventTarget,\n interaction: this,\n }, signalArg || {});\n\n signals.fire('before-action-move', signalArg);\n\n if (!this._dontFireMove) {\n signals.fire('action-move', signalArg);\n }\n\n this._dontFireMove = false;\n }\n\n // End interact move events and stop auto-scroll unless simulation is running\n pointerUp (pointer, event, eventTarget, curEventTarget) {\n const pointerIndex = this.getPointerIndex(pointer);\n\n signals.fire(/cancel$/i.test(event.type)? 'cancel' : 'up', {\n pointer,\n pointerIndex,\n event,\n eventTarget,\n curEventTarget,\n interaction: this,\n });\n\n if (!this.simulation) {\n this.end(event);\n }\n\n this.pointerIsDown = false;\n this.removePointer(pointer, event);\n }\n\n /*\\\n * Interaction.end\n [ method ]\n *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n - event (PointerEvent) #optional\n **\n | interact(target)\n | .draggable(true)\n | .on('move', function (event) {\n | if (event.pageX > 1000) {\n | // end the current action\n | event.interaction.end();\n | // stop all further listeners from being called\n | event.stopImmediatePropagation();\n | }\n | });\n \\*/\n end (event) {\n event = event || this.prevEvent;\n\n if (this.interacting()) {\n signals.fire('action-end', {\n event,\n interaction: this,\n });\n }\n\n this.stop();\n }\n\n currentAction () {\n return this._interacting? this.prepared.name: null;\n }\n\n interacting () {\n return this._interacting;\n }\n\n stop () {\n signals.fire('stop', { interaction: this });\n\n if (this._interacting) {\n signals.fire('stop-active', { interaction: this });\n signals.fire('stop-' + this.prepared.name, { interaction: this });\n }\n\n this.target = this.element = null;\n\n this._interacting = false;\n this.prepared.name = this.prevEvent = null;\n }\n\n getPointerIndex (pointer) {\n return utils.indexOf(this.pointerIds, utils.getPointerId(pointer));\n }\n\n updatePointer (pointer, event, down = event && /(down|start)$/i.test(event.type)) {\n const id = utils.getPointerId(pointer);\n let index = this.getPointerIndex(pointer);\n\n if (index === -1) {\n index = this.pointerIds.length;\n this.pointerIds[index] = id;\n }\n\n if (down) {\n signals.fire('update-pointer-down', {\n pointer,\n event,\n down,\n pointerId: id,\n pointerIndex: index,\n interaction: this,\n });\n }\n\n this.pointers[index] = pointer;\n\n return index;\n }\n\n removePointer (pointer, event) {\n const id = utils.getPointerId(pointer);\n const index = this.mouse? 0 : utils.indexOf(this.pointerIds, id);\n\n if (index === -1) { return; }\n\n signals.fire('remove-pointer', {\n pointer,\n event,\n pointerIndex: index,\n interaction: this,\n });\n\n this.pointers .splice(index, 1);\n this.pointerIds .splice(index, 1);\n this.downTargets.splice(index, 1);\n this.downTimes .splice(index, 1);\n }\n\n _updateEventTargets (target, currentTarget) {\n this._eventTarget = target;\n this._curEventTarget = currentTarget;\n }\n}\n\nfor (let i = 0, len = methodNames.length; i < len; i++) {\n const method = methodNames[i];\n\n listeners[method] = doOnInteractions(method);\n}\n\nfunction doOnInteractions (method) {\n return (function (event) {\n const [eventTarget, curEventTarget] = utils.getEventTargets(event);\n const matches = []; // [ [pointer, interaction], ...]\n\n if (browser.supportsTouch && /touch/.test(event.type)) {\n prevTouchTime = new Date().getTime();\n\n for (let i = 0; i < event.changedTouches.length; i++) {\n const pointer = event.changedTouches[i];\n const interaction = finder.search(pointer, event.type, eventTarget);\n\n matches.push([pointer, interaction || new Interaction()]);\n }\n }\n else {\n let invalidPointer = false;\n\n if (!browser.supportsPointerEvent && /mouse/.test(event.type)) {\n // ignore mouse events while touch interactions are active\n for (let i = 0; i < scope.interactions.length && !invalidPointer; i++) {\n invalidPointer = !scope.interactions[i].mouse && scope.interactions[i].pointerIsDown;\n }\n\n // try to ignore mouse events that are simulated by the browser\n // after a touch event\n invalidPointer = invalidPointer\n || (new Date().getTime() - prevTouchTime < 500)\n // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated\n || event.timeStamp === 0;\n }\n\n if (!invalidPointer) {\n let interaction = finder.search(event, event.type, eventTarget);\n\n if (!interaction) {\n\n interaction = new Interaction();\n interaction.mouse = (/mouse/i.test(event.pointerType || event.type)\n // MSPointerEvent.MSPOINTER_TYPE_MOUSE\n || event.pointerType === 4\n || !event.pointerType);\n }\n\n matches.push([event, interaction]);\n }\n }\n\n for (const [pointer, interaction] of matches) {\n interaction._updateEventTargets(eventTarget, curEventTarget);\n interaction[method](pointer, event, eventTarget, curEventTarget);\n }\n });\n}\n\nfunction endAll (event) {\n for (let i = 0; i < scope.interactions.length; i++) {\n const interaction = scope.interactions[i];\n\n interaction.end(event);\n signals.fire('endall', { event, interaction });\n }\n}\n\nconst docEvents = { /* 'eventType': listenerFunc */ };\nconst pEventTypes = browser.pEventTypes;\n\nif (scope.PointerEvent) {\n docEvents[pEventTypes.down ] = listeners.pointerDown;\n docEvents[pEventTypes.move ] = listeners.pointerMove;\n docEvents[pEventTypes.up ] = listeners.pointerUp;\n docEvents[pEventTypes.cancel] = listeners.pointerUp;\n}\nelse {\n docEvents.mousedown = listeners.pointerDown;\n docEvents.mousemove = listeners.pointerMove;\n docEvents.mouseup = listeners.pointerUp;\n\n docEvents.touchstart = listeners.pointerDown;\n docEvents.touchmove = listeners.pointerMove;\n docEvents.touchend = listeners.pointerUp;\n docEvents.touchcancel = listeners.pointerUp;\n}\n\ndocEvents.blur = endAll;\n\nfunction onDocSignal ({ doc }, signalName) {\n const eventMethod = signalName.indexOf('add') === 0\n ? events.add : events.remove;\n\n // delegate event listener\n for (const eventType in scope.delegatedEvents) {\n eventMethod(doc, eventType, events.delegateListener);\n eventMethod(doc, eventType, events.delegateUseCapture, true);\n }\n\n for (const eventType in docEvents) {\n eventMethod(doc, eventType, docEvents[eventType]);\n }\n}\n\nsignals.on('update-pointer-down', ({ interaction, pointer, pointerId, pointerIndex, event, eventTarget, down }) => {\n interaction.pointerIds[pointerIndex] = pointerId;\n interaction.pointers[pointerIndex] = pointer;\n\n if (down) {\n interaction.pointerIsDown = true;\n }\n\n if (!interaction.interacting()) {\n utils.setCoords(interaction.startCoords, interaction.pointers);\n\n utils.copyCoords(interaction.curCoords , interaction.startCoords);\n utils.copyCoords(interaction.prevCoords, interaction.startCoords);\n\n interaction.downEvent = event;\n interaction.downTimes[pointerIndex] = interaction.curCoords.timeStamp;\n interaction.downTargets[pointerIndex] = eventTarget || event && utils.getEventTargets(event)[0];\n interaction.pointerWasMoved = false;\n\n utils.pointerExtend(interaction.downPointer, pointer);\n }\n});\n\nscope.signals.on('add-document' , onDocSignal);\nscope.signals.on('remove-document', onDocSignal);\n\nInteraction.pointerMoveTolerance = 1;\nInteraction.doOnInteractions = doOnInteractions;\nInteraction.endAll = endAll;\nInteraction.signals = signals;\nInteraction.docEvents = docEvents;\n\nscope.endAllInteractions = endAll;\n\nmodule.exports = Interaction;\n","const Interaction = require('../Interaction');\nconst InteractEvent = require('../InteractEvent');\n\nconst actions = {\n firePrepared,\n names: [],\n methodDict: {},\n};\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n interaction._interacting = true;\n firePrepared(interaction, event, 'start');\n});\n\nInteraction.signals.on('action-move', function ({ interaction, event, preEnd }) {\n firePrepared(interaction, event, 'move', preEnd);\n\n // if the action was ended in a listener\n if (!interaction.interacting()) { return false; }\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n firePrepared(interaction, event, 'end');\n});\n\nfunction firePrepared (interaction, event, phase, preEnd) {\n const actionName = interaction.prepared.name;\n\n const newEvent = new InteractEvent(interaction, event, actionName, phase, interaction.element, null, preEnd);\n\n interaction.target.fire(newEvent);\n interaction.prevEvent = newEvent;\n}\n\nmodule.exports = actions;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drag = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n startAxis : 'xy',\n lockAxis : 'xy',\n },\n\n checker: function (pointer, event, interactable) {\n const dragOptions = interactable.options.drag;\n\n return dragOptions.enabled\n ? { name: 'drag', axis: (dragOptions.lockAxis === 'start'\n ? dragOptions.startAxis\n : dragOptions.lockAxis)}\n : null;\n },\n\n getCursor: function () {\n return 'move';\n },\n};\n\nInteraction.signals.on('before-action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n interaction.curCoords.page.y = interaction.startCoords.page.y;\n interaction.curCoords.client.y = interaction.startCoords.client.y;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vx);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vx);\n interaction.pointerDelta.client.vy = 0;\n interaction.pointerDelta.page.vy = 0;\n }\n else if (axis === 'y') {\n interaction.curCoords.page.x = interaction.startCoords.page.x;\n interaction.curCoords.client.x = interaction.startCoords.client.x;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vy);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vy);\n interaction.pointerDelta.client.vx = 0;\n interaction.pointerDelta.page.vx = 0;\n }\n});\n\n// dragmove\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'dragmove') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n iEvent.pageY = interaction.startCoords.page.y;\n iEvent.clientY = interaction.startCoords.client.y;\n iEvent.dy = 0;\n }\n else if (axis === 'y') {\n iEvent.pageX = interaction.startCoords.page.x;\n iEvent.clientX = interaction.startCoords.client.x;\n iEvent.dx = 0;\n }\n});\n\n/*\\\n * Interactable.draggable\n [ method ]\n *\n * Gets or sets whether drag actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of drag events\n | var isDraggable = interact('ul li').draggable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on drag events (object makes the Interactable draggable)\n = (object) This Interactable\n | interact(element).draggable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // the axis in which the first movement must be\n | // for the drag sequence to start\n | // 'xy' by default - any direction\n | startAxis: 'x' || 'y' || 'xy',\n |\n | // 'xy' by default - don't restrict to one axis (move in any direction)\n | // 'x' or 'y' to restrict movement to either axis\n | // 'start' to restrict movement to the axis the drag started in\n | lockAxis: 'x' || 'y' || 'xy' || 'start',\n |\n | // max number of drags that can happen concurrently\n | // with elements of this Interactable. Infinity by default\n | max: Infinity,\n |\n | // max number of drags that can target the same element+Interactable\n | // 1 by default\n | maxPerElement: 2\n | });\n\\*/\nInteractable.prototype.draggable = function (options) {\n if (utils.is.object(options)) {\n this.options.drag.enabled = options.enabled === false? false: true;\n this.setPerAction('drag', options);\n this.setOnEvents('drag', options);\n\n if (/^(xy|x|y|start)$/.test(options.lockAxis)) {\n this.options.drag.lockAxis = options.lockAxis;\n }\n if (/^(xy|x|y)$/.test(options.startAxis)) {\n this.options.drag.startAxis = options.startAxis;\n }\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drag.enabled = options;\n\n if (!options) {\n this.ondragstart = this.ondragstart = this.ondragend = null;\n }\n\n return this;\n }\n\n return this.options.drag;\n};\n\nactions.drag = drag;\nactions.names.push('drag');\nutils.merge(Interactable.eventTypes, [\n 'dragstart',\n 'dragmove',\n 'draginertiastart',\n 'draginertiaresume',\n 'dragend',\n]);\nactions.methodDict.drag = 'draggable';\n\ndefaultOptions.drag = drag.defaults;\n\nmodule.exports = drag;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst scope = require('../scope');\nconst interact = require('../interact');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drop = {\n defaults: {\n enabled: false,\n accept : null,\n overlap: 'pointer',\n },\n};\n\nlet dynamicDrop = false;\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // reset active dropzones\n interaction.activeDrops.dropzones = [];\n interaction.activeDrops.elements = [];\n interaction.activeDrops.rects = [];\n\n interaction.dropEvents = null;\n\n if (!interaction.dynamicDrop) {\n setActiveDrops(interaction, interaction.element);\n }\n\n const dragEvent = interaction.prevEvent;\n const dropEvents = getDropEvents(interaction, event, dragEvent);\n\n if (dropEvents.activate) {\n fireActiveDrops(interaction, dropEvents.activate);\n }\n});\n\nInteractEvent.signals.on('new', function ({ interaction, iEvent, event }) {\n if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { return; }\n\n const draggableElement = interaction.element;\n const dragEvent = iEvent;\n const dropResult = getDrop(dragEvent, event, draggableElement);\n\n interaction.dropTarget = dropResult.dropzone;\n interaction.dropElement = dropResult.element;\n\n interaction.dropEvents = getDropEvents(interaction, event, dragEvent);\n});\n\nInteraction.signals.on('action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n fireDropEvents(interaction, interaction.dropEvents);\n});\n\nInteraction.signals.on('action-end', function ({ interaction }) {\n if (interaction.prepared.name === 'drag') {\n fireDropEvents(interaction, interaction.dropEvents);\n }\n});\n\nInteraction.signals.on('stop-drag', function ({ interaction }) {\n interaction.activeDrops.dropzones =\n interaction.activeDrops.elements =\n interaction.activeDrops.rects =\n interaction.dropEvents = null;\n});\n\nfunction collectDrops (interaction, element) {\n const drops = [];\n const elements = [];\n\n element = element || interaction.element;\n\n // collect all dropzones and their elements which qualify for a drop\n for (const current of scope.interactables) {\n if (!current.options.drop.enabled) { continue; }\n\n const accept = current.options.drop.accept;\n\n // test the draggable element against the dropzone's accept setting\n if ((utils.is.element(accept) && accept !== element)\n || (utils.is.string(accept)\n && !utils.matchesSelector(element, accept))) {\n\n continue;\n }\n\n // query for new elements if necessary\n const dropElements = utils.is.string(current.target)\n ? current._context.querySelectorAll(current.target)\n : [current.target];\n\n for (let i = 0; i < dropElements.length; i++) {\n const currentElement = dropElements[i];\n\n if (currentElement !== element) {\n drops.push(current);\n elements.push(currentElement);\n }\n }\n }\n\n return {\n elements,\n dropzones: drops,\n };\n}\n\nfunction fireActiveDrops (interaction, event) {\n let prevElement;\n\n // loop through all active dropzones and trigger event\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n const current = interaction.activeDrops.dropzones[i];\n const currentElement = interaction.activeDrops.elements [i];\n\n // prevent trigger of duplicate events on same element\n if (currentElement !== prevElement) {\n // set current element as event target\n event.target = currentElement;\n current.fire(event);\n }\n prevElement = currentElement;\n }\n}\n\n// Collect a new set of possible drops and save them in activeDrops.\n// setActiveDrops should always be called when a drag has just started or a\n// drag event happens while dynamicDrop is true\nfunction setActiveDrops (interaction, dragElement) {\n // get dropzones and their elements that could receive the draggable\n const possibleDrops = collectDrops(interaction, dragElement, true);\n\n interaction.activeDrops.dropzones = possibleDrops.dropzones;\n interaction.activeDrops.elements = possibleDrops.elements;\n interaction.activeDrops.rects = [];\n\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n interaction.activeDrops.rects[i] =\n interaction.activeDrops.dropzones[i].getRect(interaction.activeDrops.elements[i]);\n }\n}\n\nfunction getDrop (dragEvent, event, dragElement) {\n const interaction = dragEvent.interaction;\n const validDrops = [];\n\n if (dynamicDrop) {\n setActiveDrops(interaction, dragElement);\n }\n\n // collect all dropzones and their elements which qualify for a drop\n for (let j = 0; j < interaction.activeDrops.dropzones.length; j++) {\n const current = interaction.activeDrops.dropzones[j];\n const currentElement = interaction.activeDrops.elements [j];\n const rect = interaction.activeDrops.rects [j];\n\n validDrops.push(current.dropCheck(dragEvent, event, interaction.target, dragElement, currentElement, rect)\n ? currentElement\n : null);\n }\n\n // get the most appropriate dropzone based on DOM depth and order\n const dropIndex = utils.indexOfDeepestElement(validDrops);\n\n return {\n dropzone: interaction.activeDrops.dropzones[dropIndex] || null,\n element : interaction.activeDrops.elements [dropIndex] || null,\n };\n}\n\nfunction getDropEvents (interaction, pointerEvent, dragEvent) {\n const dropEvents = {\n enter : null,\n leave : null,\n activate : null,\n deactivate: null,\n move : null,\n drop : null,\n };\n\n const tmpl = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n };\n\n if (interaction.dropElement !== interaction.prevDropElement) {\n // if there was a prevDropTarget, create a dragleave event\n if (interaction.prevDropTarget) {\n dropEvents.leave = utils.extend({ type: 'dragleave' }, tmpl);\n\n dragEvent.dragLeave = dropEvents.leave.target = interaction.prevDropElement;\n dragEvent.prevDropzone = dropEvents.leave.dropzone = interaction.prevDropTarget;\n }\n // if the dropTarget is not null, create a dragenter event\n if (interaction.dropTarget) {\n dropEvents.enter = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n type : 'dragenter',\n };\n\n dragEvent.dragEnter = interaction.dropElement;\n dragEvent.dropzone = interaction.dropTarget;\n }\n }\n\n if (dragEvent.type === 'dragend' && interaction.dropTarget) {\n dropEvents.drop = utils.extend({ type: 'drop' }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n dragEvent.relatedTarget = interaction.dropElement;\n }\n if (dragEvent.type === 'dragstart') {\n dropEvents.activate = utils.extend({ type: 'dropactivate' }, tmpl);\n\n dropEvents.activate.target = null;\n dropEvents.activate.dropzone = null;\n }\n if (dragEvent.type === 'dragend') {\n dropEvents.deactivate = utils.extend({ type: 'dropdeactivate' }, tmpl);\n\n dropEvents.deactivate.target = null;\n dropEvents.deactivate.dropzone = null;\n }\n if (dragEvent.type === 'dragmove' && interaction.dropTarget) {\n dropEvents.move = utils.extend({\n dragmove : dragEvent,\n type : 'dropmove',\n }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n }\n\n return dropEvents;\n}\n\nfunction fireDropEvents (interaction, dropEvents) {\n if (dropEvents.leave) { interaction.prevDropTarget.fire(dropEvents.leave); }\n if (dropEvents.move ) { interaction.dropTarget.fire(dropEvents.move ); }\n if (dropEvents.enter) { interaction.dropTarget.fire(dropEvents.enter); }\n if (dropEvents.drop ) { interaction.dropTarget.fire(dropEvents.drop ); }\n if (dropEvents.deactivate) {\n fireActiveDrops(interaction, dropEvents.deactivate);\n }\n\n interaction.prevDropTarget = interaction.dropTarget;\n interaction.prevDropElement = interaction.dropElement;\n}\n\n/*\\\n * Interactable.dropzone\n [ method ]\n *\n * Returns or sets whether elements can be dropped onto this\n * Interactable to trigger drop events\n *\n * Dropzones can receive the following events:\n * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends\n * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone\n * - `dragmove` when a draggable that has entered the dropzone is moved\n * - `drop` when a draggable is dropped into this dropzone\n *\n * Use the `accept` option to allow only elements that match the given CSS\n * selector or element. The value can be:\n *\n * - **an Element** - only that element can be dropped into this dropzone.\n * - **a string**, - the element being dragged must match it as a CSS selector.\n * - **`null`** - accept options is cleared - it accepts any element.\n *\n * Use the `overlap` option to set how drops are checked for. The allowed\n * values are:\n *\n * - `'pointer'`, the pointer must be over the dropzone (default)\n * - `'center'`, the draggable element's center must be over the dropzone\n * - a number from 0-1 which is the `(intersection area) / (draggable area)`.\n * e.g. `0.5` for drop to happen when half of the area of the draggable is\n * over the dropzone\n *\n * Use the `checker` option to specify a function to check if a dragged\n * element is over this Interactable.\n *\n | interact(target)\n | .dropChecker(function(dragEvent, // related dragmove or dragend event\n | event, // TouchEvent/PointerEvent/MouseEvent\n | dropped, // bool result of the default checker\n | dropzone, // dropzone Interactable\n | dropElement, // dropzone elemnt\n | draggable, // draggable Interactable\n | draggableElement) {// draggable element\n |\n | return dropped && event.target.hasAttribute('allow-drop');\n | }\n *\n *\n - options (boolean | object | null) #optional The new value to be set.\n | interact('.drop').dropzone({\n | accept: '.can-drop' || document.getElementById('single-drop'),\n | overlap: 'pointer' || 'center' || zeroToOne\n | }\n = (boolean | object) The current setting or this Interactable\n\\*/\nInteractable.prototype.dropzone = function (options) {\n if (utils.is.object(options)) {\n this.options.drop.enabled = options.enabled === false? false: true;\n\n if (utils.is.function(options.ondrop) ) { this.events.ondrop = options.ondrop ; }\n if (utils.is.function(options.ondropactivate) ) { this.events.ondropactivate = options.ondropactivate ; }\n if (utils.is.function(options.ondropdeactivate)) { this.events.ondropdeactivate = options.ondropdeactivate; }\n if (utils.is.function(options.ondragenter) ) { this.events.ondragenter = options.ondragenter ; }\n if (utils.is.function(options.ondragleave) ) { this.events.ondragleave = options.ondragleave ; }\n if (utils.is.function(options.ondropmove) ) { this.events.ondropmove = options.ondropmove ; }\n\n if (/^(pointer|center)$/.test(options.overlap)) {\n this.options.drop.overlap = options.overlap;\n }\n else if (utils.is.number(options.overlap)) {\n this.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0);\n }\n if ('accept' in options) {\n this.options.drop.accept = options.accept;\n }\n if ('checker' in options) {\n this.options.drop.checker = options.checker;\n }\n\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drop.enabled = options;\n\n if (!options) {\n this.ondragenter = this.ondragleave = this.ondrop\n = this.ondropactivate = this.ondropdeactivate = null;\n }\n\n return this;\n }\n\n return this.options.drop;\n};\n\nInteractable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) {\n let dropped = false;\n\n // if the dropzone has no rect (eg. display: none)\n // call the custom dropChecker or just return false\n if (!(rect = rect || this.getRect(dropElement))) {\n return (this.options.drop.checker\n ? this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement)\n : false);\n }\n\n const dropOverlap = this.options.drop.overlap;\n\n if (dropOverlap === 'pointer') {\n const origin = utils.getOriginXY(draggable, draggableElement, 'drag');\n const page = utils.getPageXY(dragEvent);\n\n page.x += origin.x;\n page.y += origin.y;\n\n const horizontal = (page.x > rect.left) && (page.x < rect.right);\n const vertical = (page.y > rect.top ) && (page.y < rect.bottom);\n\n dropped = horizontal && vertical;\n }\n\n const dragRect = draggable.getRect(draggableElement);\n\n if (dragRect && dropOverlap === 'center') {\n const cx = dragRect.left + dragRect.width / 2;\n const cy = dragRect.top + dragRect.height / 2;\n\n dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom;\n }\n\n if (dragRect && utils.is.number(dropOverlap)) {\n const overlapArea = (Math.max(0, Math.min(rect.right , dragRect.right ) - Math.max(rect.left, dragRect.left))\n * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top , dragRect.top )));\n\n const overlapRatio = overlapArea / (dragRect.width * dragRect.height);\n\n dropped = overlapRatio >= dropOverlap;\n }\n\n if (this.options.drop.checker) {\n dropped = this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement);\n }\n\n return dropped;\n};\n\nInteractable.signals.on('unset', function ({ interactable }) {\n interactable.dropzone(false);\n});\n\nInteractable.settingsMethods.push('dropChecker');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.dropTarget = null; // the dropzone a drag target might be dropped into\n interaction.dropElement = null; // the element at the time of checking\n interaction.prevDropTarget = null; // the dropzone that was recently dragged away from\n interaction.prevDropElement = null; // the element at the time of checking\n interaction.dropEvents = null; // the dropEvents related to the current drag event\n\n interaction.activeDrops = {\n dropzones: [], // the dropzones that are mentioned below\n elements : [], // elements of dropzones that accept the target draggable\n rects : [], // the rects of the elements mentioned above\n };\n\n});\n\nInteraction.signals.on('stop', function ({ interaction }) {\n interaction.dropTarget = interaction.dropElement =\n interaction.prevDropTarget = interaction.prevDropElement = null;\n});\n\n/*\\\n * interact.dynamicDrop\n [ method ]\n *\n * Returns or sets whether the dimensions of dropzone elements are\n * calculated on every dragmove or only on dragstart for the default\n * dropChecker\n *\n - newValue (boolean) #optional True to check on each move. False to check only before start\n = (boolean | interact) The current setting or interact\n\\*/\ninteract.dynamicDrop = function (newValue) {\n if (utils.is.bool(newValue)) {\n //if (dragging && dynamicDrop !== newValue && !newValue) {\n //calcRects(dropzones);\n //}\n\n dynamicDrop = newValue;\n\n return interact;\n }\n return dynamicDrop;\n};\n\nutils.merge(Interactable.eventTypes, [\n 'dragenter',\n 'dragleave',\n 'dropactivate',\n 'dropdeactivate',\n 'dropmove',\n 'drop',\n]);\nactions.methodDict.drop = 'dropzone';\n\ndefaultOptions.drop = drop.defaults;\n\nmodule.exports = drop;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst gesture = {\n defaults: {\n enabled : false,\n origin : null,\n restrict: null,\n },\n\n checker: function (pointer, event, interactable, element, interaction) {\n if (interaction.pointerIds.length >= 2) {\n return { name: 'gesture' };\n }\n\n return null;\n },\n\n getCursor: function () {\n return '';\n },\n};\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturestart') { return; }\n iEvent.ds = 0;\n\n interaction.gesture.startDistance = interaction.gesture.prevDistance = iEvent.distance;\n interaction.gesture.startAngle = interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.scale = 1;\n});\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturemove') { return; }\n\n iEvent.ds = iEvent.scale - interaction.gesture.scale;\n\n interaction.target.fire(iEvent);\n\n interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.prevDistance = iEvent.distance;\n\n if (iEvent.scale !== Infinity\n && iEvent.scale !== null\n && iEvent.scale !== undefined\n && !isNaN(iEvent.scale)) {\n\n interaction.gesture.scale = iEvent.scale;\n }\n});\n\n/*\\\n * Interactable.gesturable\n [ method ]\n *\n * Gets or sets whether multitouch gestures can be performed on the\n * Interactable's element\n *\n = (boolean) Indicates if this can be the target of gesture events\n | var isGestureable = interact(element).gesturable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on gesture events (makes the Interactable gesturable)\n = (object) this Interactable\n | interact(element).gesturable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // limit multiple gestures.\n | // See the explanation in @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n\\*/\nInteractable.prototype.gesturable = function (options) {\n if (utils.is.object(options)) {\n this.options.gesture.enabled = options.enabled === false? false: true;\n this.setPerAction('gesture', options);\n this.setOnEvents('gesture', options);\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.gesture.enabled = options;\n\n if (!options) {\n this.ongesturestart = this.ongesturestart = this.ongestureend = null;\n }\n\n return this;\n }\n\n return this.options.gesture;\n};\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action, event, starting, ending, deltaSource }) {\n if (action !== 'gesture') { return; }\n\n const pointers = interaction.pointers;\n\n iEvent.touches = [pointers[0], pointers[1]];\n\n if (starting) {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = 1;\n iEvent.ds = 0;\n iEvent.angle = utils.touchAngle(pointers, undefined, deltaSource);\n iEvent.da = 0;\n }\n else if (ending || event instanceof InteractEvent) {\n iEvent.distance = interaction.prevEvent.distance;\n iEvent.box = interaction.prevEvent.box;\n iEvent.scale = interaction.prevEvent.scale;\n iEvent.ds = iEvent.scale - 1;\n iEvent.angle = interaction.prevEvent.angle;\n iEvent.da = iEvent.angle - interaction.gesture.startAngle;\n }\n else {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = iEvent.distance / interaction.gesture.startDistance;\n iEvent.angle = utils.touchAngle(pointers, interaction.gesture.prevAngle, deltaSource);\n\n iEvent.ds = iEvent.scale - interaction.gesture.prevScale;\n iEvent.da = iEvent.angle - interaction.gesture.prevAngle;\n }\n});\n\nInteraction.signals.on('new', function (interaction) {\n interaction.gesture = {\n start: { x: 0, y: 0 },\n\n startDistance: 0, // distance between two touches of touchStart\n prevDistance : 0,\n distance : 0,\n\n scale: 1, // gesture.distance / gesture.startDistance\n\n startAngle: 0, // angle of line joining two touches\n prevAngle : 0, // angle of the previous gesture event\n };\n});\n\nactions.gesture = gesture;\nactions.names.push('gesture');\nutils.merge(Interactable.eventTypes, [\n 'gesturestart',\n 'gesturemove',\n 'gestureend',\n]);\nactions.methodDict.gesture = 'gesturable';\n\ndefaultOptions.gesture = gesture.defaults;\n\nmodule.exports = gesture;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\n// Less Precision with touch input\nconst defaultMargin = browser.supportsTouch || browser.supportsPointerEvent? 20: 10;\n\nconst resize = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n square: false,\n preserveAspectRatio: false,\n axis: 'xy',\n\n // use default margin\n margin: NaN,\n\n // object with props left, right, top, bottom which are\n // true/false values to resize when the pointer is over that edge,\n // CSS selectors to match the handles for each direction\n // or the Elements for each handle\n edges: null,\n\n // a value of 'none' will limit the resize rect to a minimum of 0x0\n // 'negate' will alow the rect to have negative width/height\n // 'reposition' will keep the width/height positive by swapping\n // the top and bottom edges and/or swapping the left and right edges\n invert: 'none',\n },\n\n checker: function (pointer, event, interactable, element, interaction, rect) {\n if (!rect) { return null; }\n\n const page = utils.extend({}, interaction.curCoords.page);\n const options = interactable.options;\n\n if (options.resize.enabled) {\n const resizeOptions = options.resize;\n const resizeEdges = { left: false, right: false, top: false, bottom: false };\n\n // if using resize.edges\n if (utils.is.object(resizeOptions.edges)) {\n for (const edge in resizeEdges) {\n resizeEdges[edge] = checkResizeEdge(edge,\n resizeOptions.edges[edge],\n page,\n interaction._eventTarget,\n element,\n rect,\n resizeOptions.margin || defaultMargin);\n }\n\n resizeEdges.left = resizeEdges.left && !resizeEdges.right;\n resizeEdges.top = resizeEdges.top && !resizeEdges.bottom;\n\n if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) {\n return {\n name: 'resize',\n edges: resizeEdges,\n };\n }\n }\n else {\n const right = options.resize.axis !== 'y' && page.x > (rect.right - defaultMargin);\n const bottom = options.resize.axis !== 'x' && page.y > (rect.bottom - defaultMargin);\n\n if (right || bottom) {\n return {\n name: 'resize',\n axes: (right? 'x' : '') + (bottom? 'y' : ''),\n };\n }\n }\n }\n\n return null;\n },\n\n cursors: (browser.isIe9OrOlder ? {\n x : 'e-resize',\n y : 's-resize',\n xy: 'se-resize',\n\n top : 'n-resize',\n left : 'w-resize',\n bottom : 's-resize',\n right : 'e-resize',\n topleft : 'se-resize',\n bottomright: 'se-resize',\n topright : 'ne-resize',\n bottomleft : 'ne-resize',\n } : {\n x : 'ew-resize',\n y : 'ns-resize',\n xy: 'nwse-resize',\n\n top : 'ns-resize',\n left : 'ew-resize',\n bottom : 'ns-resize',\n right : 'ew-resize',\n topleft : 'nwse-resize',\n bottomright: 'nwse-resize',\n topright : 'nesw-resize',\n bottomleft : 'nesw-resize',\n }),\n\n getCursor: function (action) {\n if (action.axis) {\n return resize.cursors[action.name + action.axis];\n }\n else if (action.edges) {\n let cursorKey = '';\n const edgeNames = ['top', 'bottom', 'left', 'right'];\n\n for (let i = 0; i < 4; i++) {\n if (action.edges[edgeNames[i]]) {\n cursorKey += edgeNames[i];\n }\n }\n\n return resize.cursors[cursorKey];\n }\n },\n};\n\n// resizestart\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'resizestart' || !interaction.prepared.edges) {\n return;\n }\n\n const startRect = interaction.target.getRect(interaction.element);\n const resizeOptions = interaction.target.options.resize;\n\n /*\n * When using the `resizable.square` or `resizable.preserveAspectRatio` options, resizing from one edge\n * will affect another. E.g. with `resizable.square`, resizing to make the right edge larger will make\n * the bottom edge larger by the same amount. We call these 'linked' edges. Any linked edges will depend\n * on the active edges and the edge being interacted with.\n */\n if (resizeOptions.square || resizeOptions.preserveAspectRatio) {\n const linkedEdges = utils.extend({}, interaction.prepared.edges);\n\n linkedEdges.top = linkedEdges.top || (linkedEdges.left && !linkedEdges.bottom);\n linkedEdges.left = linkedEdges.left || (linkedEdges.top && !linkedEdges.right );\n linkedEdges.bottom = linkedEdges.bottom || (linkedEdges.right && !linkedEdges.top );\n linkedEdges.right = linkedEdges.right || (linkedEdges.bottom && !linkedEdges.left );\n\n interaction.prepared._linkedEdges = linkedEdges;\n }\n else {\n interaction.prepared._linkedEdges = null;\n }\n\n // if using `resizable.preserveAspectRatio` option, record aspect ratio at the start of the resize\n if (resizeOptions.preserveAspectRatio) {\n interaction.resizeStartAspectRatio = startRect.width / startRect.height;\n }\n\n interaction.resizeRects = {\n start : startRect,\n current : utils.extend({}, startRect),\n inverted : utils.extend({}, startRect),\n previous : utils.extend({}, startRect),\n delta : {\n left: 0, right : 0, width : 0,\n top : 0, bottom: 0, height: 0,\n },\n };\n\n iEvent.rect = interaction.resizeRects.inverted;\n iEvent.deltaRect = interaction.resizeRects.delta;\n});\n\n// resizemove\nInteractEvent.signals.on('new', function ({ iEvent, phase, interaction }) {\n if (phase !== 'move' || !interaction.prepared.edges) { return; }\n\n const resizeOptions = interaction.target.options.resize;\n const invert = resizeOptions.invert;\n const invertible = invert === 'reposition' || invert === 'negate';\n\n let edges = interaction.prepared.edges;\n\n const start = interaction.resizeRects.start;\n const current = interaction.resizeRects.current;\n const inverted = interaction.resizeRects.inverted;\n const delta = interaction.resizeRects.delta;\n const previous = utils.extend(interaction.resizeRects.previous, inverted);\n const originalEdges = edges;\n\n let dx = iEvent.dx;\n let dy = iEvent.dy;\n\n if (resizeOptions.preserveAspectRatio || resizeOptions.square) {\n // `resize.preserveAspectRatio` takes precedence over `resize.square`\n const startAspectRatio = resizeOptions.preserveAspectRatio\n ? interaction.resizeStartAspectRatio\n : 1;\n\n edges = interaction.prepared._linkedEdges;\n\n if ((originalEdges.left && originalEdges.bottom)\n || (originalEdges.right && originalEdges.top)) {\n dy = -dx / startAspectRatio;\n }\n else if (originalEdges.left || originalEdges.right ) { dy = dx / startAspectRatio; }\n else if (originalEdges.top || originalEdges.bottom) { dx = dy * startAspectRatio; }\n }\n\n // update the 'current' rect without modifications\n if (edges.top ) { current.top += dy; }\n if (edges.bottom) { current.bottom += dy; }\n if (edges.left ) { current.left += dx; }\n if (edges.right ) { current.right += dx; }\n\n if (invertible) {\n // if invertible, copy the current rect\n utils.extend(inverted, current);\n\n if (invert === 'reposition') {\n // swap edge values if necessary to keep width/height positive\n let swap;\n\n if (inverted.top > inverted.bottom) {\n swap = inverted.top;\n\n inverted.top = inverted.bottom;\n inverted.bottom = swap;\n }\n if (inverted.left > inverted.right) {\n swap = inverted.left;\n\n inverted.left = inverted.right;\n inverted.right = swap;\n }\n }\n }\n else {\n // if not invertible, restrict to minimum of 0x0 rect\n inverted.top = Math.min(current.top, start.bottom);\n inverted.bottom = Math.max(current.bottom, start.top);\n inverted.left = Math.min(current.left, start.right);\n inverted.right = Math.max(current.right, start.left);\n }\n\n inverted.width = inverted.right - inverted.left;\n inverted.height = inverted.bottom - inverted.top ;\n\n for (const edge in inverted) {\n delta[edge] = inverted[edge] - previous[edge];\n }\n\n iEvent.edges = interaction.prepared.edges;\n iEvent.rect = inverted;\n iEvent.deltaRect = delta;\n});\n\n/*\\\n * Interactable.resizable\n [ method ]\n *\n * Gets or sets whether resize actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of resize elements\n | var isResizeable = interact('input[type=text]').resizable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on resize events (object makes the Interactable resizable)\n = (object) This Interactable\n | interact(element).resizable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | edges: {\n | top : true, // Use pointer coords to check for resize.\n | left : false, // Disable resizing from left edge.\n | bottom: '.resize-s',// Resize if pointer target matches selector\n | right : handleEl // Resize if pointer target is the given Element\n | },\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height are adjusted at a 1:1 ratio.\n | square: false,\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height maintain the aspect ratio they had when resizing started.\n | preserveAspectRatio: false,\n |\n | // a value of 'none' will limit the resize rect to a minimum of 0x0\n | // 'negate' will allow the rect to have negative width/height\n | // 'reposition' will keep the width/height positive by swapping\n | // the top and bottom edges and/or swapping the left and right edges\n | invert: 'none' || 'negate' || 'reposition'\n |\n | // limit multiple resizes.\n | // See the explanation in the @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n \\*/\nInteractable.prototype.resizable = function (options) {\n if (utils.is.object(options)) {\n this.options.resize.enabled = options.enabled === false? false: true;\n this.setPerAction('resize', options);\n this.setOnEvents('resize', options);\n\n if (/^x$|^y$|^xy$/.test(options.axis)) {\n this.options.resize.axis = options.axis;\n }\n else if (options.axis === null) {\n this.options.resize.axis = defaultOptions.resize.axis;\n }\n\n if (utils.is.bool(options.preserveAspectRatio)) {\n this.options.resize.preserveAspectRatio = options.preserveAspectRatio;\n }\n else if (utils.is.bool(options.square)) {\n this.options.resize.square = options.square;\n }\n\n return this;\n }\n if (utils.is.bool(options)) {\n this.options.resize.enabled = options;\n\n if (!options) {\n this.onresizestart = this.onresizestart = this.onresizeend = null;\n }\n\n return this;\n }\n return this.options.resize;\n};\n\nfunction checkResizeEdge (name, value, page, element, interactableElement, rect, margin) {\n // false, '', undefined, null\n if (!value) { return false; }\n\n // true value, use pointer coords and element rect\n if (value === true) {\n // if dimensions are negative, \"switch\" edges\n const width = utils.is.number(rect.width )? rect.width : rect.right - rect.left;\n const height = utils.is.number(rect.height)? rect.height : rect.bottom - rect.top ;\n\n if (width < 0) {\n if (name === 'left' ) { name = 'right'; }\n else if (name === 'right') { name = 'left' ; }\n }\n if (height < 0) {\n if (name === 'top' ) { name = 'bottom'; }\n else if (name === 'bottom') { name = 'top' ; }\n }\n\n if (name === 'left' ) { return page.x < ((width >= 0? rect.left: rect.right ) + margin); }\n if (name === 'top' ) { return page.y < ((height >= 0? rect.top : rect.bottom) + margin); }\n\n if (name === 'right' ) { return page.x > ((width >= 0? rect.right : rect.left) - margin); }\n if (name === 'bottom') { return page.y > ((height >= 0? rect.bottom: rect.top ) - margin); }\n }\n\n // the remaining checks require an element\n if (!utils.is.element(element)) { return false; }\n\n return utils.is.element(value)\n // the value is an element to use as a resize handle\n ? value === element\n // otherwise check if element matches value as selector\n : utils.matchesUpTo(element, value, interactableElement);\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.resizeAxes = 'xy';\n});\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action }) {\n if (action !== 'resize' || !interaction.resizeAxes) { return; }\n\n const options = interaction.target.options;\n\n if (options.resize.square) {\n if (interaction.resizeAxes === 'y') {\n iEvent.dx = iEvent.dy;\n }\n else {\n iEvent.dy = iEvent.dx;\n }\n iEvent.axes = 'xy';\n }\n else {\n iEvent.axes = interaction.resizeAxes;\n\n if (interaction.resizeAxes === 'x') {\n iEvent.dy = 0;\n }\n else if (interaction.resizeAxes === 'y') {\n iEvent.dx = 0;\n }\n }\n});\n\nactions.resize = resize;\nactions.names.push('resize');\nutils.merge(Interactable.eventTypes, [\n 'resizestart',\n 'resizemove',\n 'resizeinertiastart',\n 'resizeinertiaresume',\n 'resizeend',\n]);\nactions.methodDict.resize = 'resizable';\n\ndefaultOptions.resize = resize.defaults;\n\nmodule.exports = resize;\n","const raf = require('./utils/raf');\nconst getWindow = require('./utils/window').getWindow;\nconst is = require('./utils/is');\nconst domUtils = require('./utils/domUtils');\nconst Interaction = require('./Interaction');\nconst defaultOptions = require('./defaultOptions');\n\nconst autoScroll = {\n defaults: {\n enabled : false,\n container: null, // the item that is scrolled (Window or HTMLElement)\n margin : 60,\n speed : 300, // the scroll speed in pixels per second\n },\n\n interaction: null,\n i: null, // the handle returned by window.setInterval\n x: 0, y: 0, // Direction each pulse is to scroll in\n\n isScrolling: false,\n prevTime: 0,\n\n start: function (interaction) {\n autoScroll.isScrolling = true;\n raf.cancel(autoScroll.i);\n\n autoScroll.interaction = interaction;\n autoScroll.prevTime = new Date().getTime();\n autoScroll.i = raf.request(autoScroll.scroll);\n },\n\n stop: function () {\n autoScroll.isScrolling = false;\n raf.cancel(autoScroll.i);\n },\n\n // scroll the window by the values in scroll.x/y\n scroll: function () {\n const options = autoScroll.interaction.target.options[autoScroll.interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(autoScroll.interaction.element);\n const now = new Date().getTime();\n // change in time in seconds\n const dt = (now - autoScroll.prevTime) / 1000;\n // displacement\n const s = options.speed * dt;\n\n if (s >= 1) {\n if (is.window(container)) {\n container.scrollBy(autoScroll.x * s, autoScroll.y * s);\n }\n else if (container) {\n container.scrollLeft += autoScroll.x * s;\n container.scrollTop += autoScroll.y * s;\n }\n\n autoScroll.prevTime = now;\n }\n\n if (autoScroll.isScrolling) {\n raf.cancel(autoScroll.i);\n autoScroll.i = raf.request(autoScroll.scroll);\n }\n },\n check: function (interactable, actionName) {\n const options = interactable.options;\n\n return options[actionName].autoScroll && options[actionName].autoScroll.enabled;\n },\n onInteractionMove: function ({ interaction, pointer }) {\n if (!(interaction.interacting()\n && autoScroll.check(interaction.target, interaction.prepared.name))) {\n return;\n }\n\n if (interaction.simulation) {\n autoScroll.x = autoScroll.y = 0;\n return;\n }\n\n let top;\n let right;\n let bottom;\n let left;\n\n const options = interaction.target.options[interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(interaction.element);\n\n if (is.window(container)) {\n left = pointer.clientX < autoScroll.margin;\n top = pointer.clientY < autoScroll.margin;\n right = pointer.clientX > container.innerWidth - autoScroll.margin;\n bottom = pointer.clientY > container.innerHeight - autoScroll.margin;\n }\n else {\n const rect = domUtils.getElementClientRect(container);\n\n left = pointer.clientX < rect.left + autoScroll.margin;\n top = pointer.clientY < rect.top + autoScroll.margin;\n right = pointer.clientX > rect.right - autoScroll.margin;\n bottom = pointer.clientY > rect.bottom - autoScroll.margin;\n }\n\n autoScroll.x = (right ? 1: left? -1: 0);\n autoScroll.y = (bottom? 1: top? -1: 0);\n\n if (!autoScroll.isScrolling) {\n // set the autoScroll properties to those of the target\n autoScroll.margin = options.margin;\n autoScroll.speed = options.speed;\n\n autoScroll.start(interaction);\n }\n },\n};\n\nInteraction.signals.on('stop-active', function () {\n autoScroll.stop();\n});\n\nInteraction.signals.on('action-move', autoScroll.onInteractionMove);\n\ndefaultOptions.perAction.autoScroll = autoScroll.defaults;\n\nmodule.exports = autoScroll;\n","const Interactable = require('../Interactable');\nconst actions = require('../actions/base');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.ignoreFrom\n [ method ]\n *\n * If the target of the `mousedown`, `pointerdown` or `touchstart`\n * event or any of it's parents match the given CSS selector or\n * Element, no drag/resize/gesture is started.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to not ignore any elements\n = (string | Element | object) The current ignoreFrom value or this Interactable\n **\n | interact(element, { ignoreFrom: document.getElementById('no-action') });\n | // or\n | interact(element).ignoreFrom('input, textarea, a');\n\\*/\nInteractable.prototype.ignoreFrom = function (newValue) {\n return this._backCompatOption('ignoreFrom', newValue);\n};\n\n/*\\\n * Interactable.allowFrom\n [ method ]\n *\n * A drag/resize/gesture is started only If the target of the\n * `mousedown`, `pointerdown` or `touchstart` event or any of it's\n * parents match the given CSS selector or Element.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to allow from any element\n = (string | Element | object) The current allowFrom value or this Interactable\n **\n | interact(element, { allowFrom: document.getElementById('drag-handle') });\n | // or\n | interact(element).allowFrom('.handle');\n\\*/\nInteractable.prototype.allowFrom = function (newValue) {\n return this._backCompatOption('allowFrom', newValue);\n};\n\nInteractable.prototype.testIgnore = function (ignoreFrom, interactableElement, element) {\n if (!ignoreFrom || !is.element(element)) { return false; }\n\n if (is.string(ignoreFrom)) {\n return domUtils.matchesUpTo(element, ignoreFrom, interactableElement);\n }\n else if (is.element(ignoreFrom)) {\n return domUtils.nodeContains(ignoreFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testAllow = function (allowFrom, interactableElement, element) {\n if (!allowFrom) { return true; }\n\n if (!is.element(element)) { return false; }\n\n if (is.string(allowFrom)) {\n return domUtils.matchesUpTo(element, allowFrom, interactableElement);\n }\n else if (is.element(allowFrom)) {\n return domUtils.nodeContains(allowFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testIgnoreAllow = function (options, interactableElement, eventTarget) {\n return (!this.testIgnore(options.ignoreFrom, interactableElement, eventTarget)\n && this.testAllow(options.allowFrom, interactableElement, eventTarget));\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (event.buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\n","const interact = require('../interact');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst actions = require('../actions/base');\nconst defaultOptions = require('../defaultOptions');\nconst browser = require('../utils/browser');\nconst scope = require('../scope');\nconst utils = require('../utils');\nconst signals = require('../utils/Signals').new();\n\nrequire('./InteractableMethods');\n\nconst autoStart = {\n signals,\n withinInteractionLimit,\n // Allow this many interactions to happen simultaneously\n maxInteractions: Infinity,\n defaults: {\n perAction: {\n manualStart: false,\n max: Infinity,\n maxPerElement: 1,\n allowFrom: null,\n ignoreFrom: null,\n },\n },\n setActionDefaults: function (action) {\n utils.extend(action.defaults, autoStart.defaults.perAction);\n },\n};\n\n// set cursor style on mousedown\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget }) {\n if (interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\n// set cursor style on mousemove\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget }) {\n if (!interaction.mouse\n || interaction.pointerIsDown\n || interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\nInteraction.signals.on('move', function (arg) {\n const { interaction, event } = arg;\n\n if (!interaction.pointerIsDown\n || interaction.interacting()\n || !interaction.pointerWasMoved\n || !interaction.prepared.name) {\n return;\n }\n\n signals.fire('before-start', arg);\n\n const target = interaction.target;\n\n if (interaction.prepared.name && target) {\n // check manualStart and interaction limit\n if (target.options[interaction.prepared.name].manualStart\n || !withinInteractionLimit(target, interaction.element, interaction.prepared)) {\n interaction.stop(event);\n }\n else {\n interaction.start(interaction.prepared, target, interaction.element);\n }\n }\n});\n\n// Check if the current target supports the action.\n// If so, return the validated action. Otherwise, return null\nfunction validateAction (action, interactable, element, eventTarget) {\n if (utils.is.object(action)\n && interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget)\n && interactable.options[action.name].enabled\n && withinInteractionLimit(interactable, element, action)) {\n return action;\n }\n\n return null;\n}\n\nfunction validateSelector (interaction, pointer, event, matches, matchElements, eventTarget) {\n for (let i = 0, len = matches.length; i < len; i++) {\n const match = matches[i];\n const matchElement = matchElements[i];\n const action = validateAction(match.getAction(pointer, event, interaction, matchElement),\n match,\n matchElement,\n eventTarget);\n\n if (action) {\n return {\n action,\n target: match,\n element: matchElement,\n };\n }\n }\n\n return {};\n}\n\nfunction getActionInfo (interaction, pointer, event, eventTarget) {\n let matches = [];\n let matchElements = [];\n\n let element = eventTarget;\n let action = null;\n\n function pushMatches (interactable, selector, context) {\n const elements = (browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined);\n\n if (utils.matchesSelector(element, selector, elements)) {\n\n matches.push(interactable);\n matchElements.push(element);\n }\n }\n\n while (utils.is.element(element)) {\n matches = [];\n matchElements = [];\n\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && (action = validateAction(elementInteractable.getAction(pointer, event, interaction, element, eventTarget),\n elementInteractable,\n element,\n eventTarget))\n && !elementInteractable.options[action.name].manualStart) {\n return {\n element,\n action,\n target: elementInteractable,\n };\n }\n else {\n scope.interactables.forEachSelector(pushMatches, element);\n\n const actionInfo = validateSelector(interaction, pointer, event, matches, matchElements, eventTarget);\n\n if (actionInfo.action\n && !actionInfo.target.options[actionInfo.action.name].manualStart) {\n return actionInfo;\n }\n }\n\n element = utils.parentNode(element);\n }\n\n return {};\n}\n\nfunction prepare (interaction, { action, target, element }) {\n action = action || {};\n\n if (interaction.target && interaction.target.options.styleCursor) {\n interaction.target._doc.documentElement.style.cursor = '';\n }\n\n interaction.target = target;\n interaction.element = element;\n utils.copyAction(interaction.prepared, action);\n\n if (target && target.options.styleCursor) {\n const cursor = action? actions[action.name].getCursor(action) : '';\n interaction.target._doc.documentElement.style.cursor = cursor;\n }\n\n signals.fire('prepared', { interaction: interaction });\n}\n\nInteraction.signals.on('stop', function ({ interaction }) {\n const target = interaction.target;\n\n if (target && target.options.styleCursor) {\n target._doc.documentElement.style.cursor = '';\n }\n});\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (utils.is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (utils.is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n const buttons = event.buttons || ({\n 0: 1,\n 1: 4,\n 3: 8,\n 4: 16,\n })[event.button];\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\nfunction withinInteractionLimit (interactable, element, action) {\n const options = interactable.options;\n const maxActions = options[action.name].max;\n const maxPerElement = options[action.name].maxPerElement;\n let activeInteractions = 0;\n let targetCount = 0;\n let targetElementCount = 0;\n\n // no actions if any of these values == 0\n if (!(maxActions && maxPerElement && autoStart.maxInteractions)) { return; }\n\n for (let i = 0, len = scope.interactions.length; i < len; i++) {\n const interaction = scope.interactions[i];\n const otherAction = interaction.prepared.name;\n\n if (!interaction.interacting()) { continue; }\n\n activeInteractions++;\n\n if (activeInteractions >= autoStart.maxInteractions) {\n return false;\n }\n\n if (interaction.target !== interactable) { continue; }\n\n targetCount += (otherAction === action.name)|0;\n\n if (targetCount >= maxActions) {\n return false;\n }\n\n if (interaction.element === element) {\n targetElementCount++;\n\n if (otherAction !== action.name || targetElementCount >= maxPerElement) {\n return false;\n }\n }\n }\n\n return autoStart.maxInteractions > 0;\n}\n\n/*\\\n * interact.maxInteractions\n [ method ]\n **\n * Returns or sets the maximum number of concurrent interactions allowed.\n * By default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables\n * and elements, you need to enable it in the draggable, resizable and\n * gesturable `'max'` and `'maxPerElement'` options.\n **\n - newValue (number) #optional Any number. newValue <= 0 means no interactions.\n\\*/\ninteract.maxInteractions = function (newValue) {\n if (utils.is.number(newValue)) {\n autoStart.maxInteractions = newValue;\n\n return this;\n }\n\n return autoStart.maxInteractions;\n};\n\nInteractable.settingsMethods.push('styleCursor');\nInteractable.settingsMethods.push('actionChecker');\nInteractable.settingsMethods.push('ignoreFrom');\nInteractable.settingsMethods.push('allowFrom');\n\ndefaultOptions.base.actionChecker = null;\ndefaultOptions.base.styleCursor = true;\n\nutils.extend(defaultOptions.perAction, autoStart.defaults.perAction);\n\nmodule.exports = autoStart;\n","const autoStart = require('./base');\nconst Interaction = require('../Interaction');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.delayTimer = null;\n});\n\nautoStart.signals.on('prepared', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.delayTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.target, interaction.element);\n }, delay);\n }\n});\n\nInteraction.signals.on('move', function ({ interaction, duplicate }) {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.delayTimer);\n }\n});\n\n// prevent regular down->move autoStart\nautoStart.signals.on('before-start', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.prepared.name = null;\n }\n});\n","const autoStart = require('./base');\nconst scope = require('../scope');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\n\nconst { matchesSelector, parentNode } = require('../utils/domUtils');\n\nautoStart.setActionDefaults(require('../actions/drag'));\n\nautoStart.signals.on('before-start', function ({ interaction, eventTarget, dx, dy }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // check if a drag is in the correct axis\n const absX = Math.abs(dx);\n const absY = Math.abs(dy);\n const options = interaction.target.options.drag;\n const startAxis = options.startAxis;\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy');\n\n interaction.prepared.axis = options.lockAxis === 'start'\n ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n : options.lockAxis;\n\n // if the movement isn't in the startAxis of the interactable\n if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) {\n // cancel the prepared action\n interaction.prepared.name = null;\n\n // then try to get a drag from another ineractable\n\n if (!interaction.prepared.name) {\n\n let element = eventTarget;\n\n const getDraggable = function (interactable, selector, context) {\n const elements = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n if (interactable === interaction.target) { return; }\n\n if (!options.manualStart\n && !interactable.testIgnoreAllow(options, element, eventTarget)\n && matchesSelector(element, selector, elements)) {\n\n const action = interactable.getAction(interaction.downPointer,\n interaction.downEvent,\n interaction,\n element);\n\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, interactable)\n && autoStart.validateAction(action, interactable, element, eventTarget)) {\n\n return interactable;\n }\n }\n };\n\n let action = null;\n\n // check all interactables\n while (is.element(element)) {\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && elementInteractable !== interaction.target\n && !elementInteractable.options.drag.manualStart) {\n\n action = elementInteractable.getAction(interaction.downPointer, interaction.downEvent, interaction, element);\n }\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, elementInteractable)) {\n\n interaction.prepared.name = 'drag';\n interaction.target = elementInteractable;\n interaction.element = element;\n break;\n }\n\n const selectorInteractable = scope.interactables.forEachSelector(getDraggable, element);\n\n if (selectorInteractable) {\n interaction.prepared.name = 'drag';\n interaction.target = selectorInteractable;\n interaction.element = element;\n break;\n }\n\n element = parentNode(element);\n }\n }\n }\n});\n\nfunction checkStartAxis (startAxis, interactable) {\n if (!interactable) { return false; }\n\n const thisAxis = interactable.options.drag.startAxis;\n\n return (startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis);\n}\n","require('./base').setActionDefaults(require('../actions/gesture'));\n","require('./base').setActionDefaults(require('../actions/resize'));\n","module.exports = {\n base: {\n accept : null,\n preventDefault: 'auto',\n deltaSource : 'page',\n },\n\n perAction: {\n origin: { x: 0, y: 0 },\n\n // only allow left button by default\n // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n mouseButtons: 1,\n\n inertia: {\n enabled : false,\n resistance : 10, // the lambda in exponential decay\n minSpeed : 100, // target speed must be above this for inertia to start\n endSpeed : 10, // the speed at which inertia is slow enough to stop\n allowResume : true, // allow resuming an action in inertia phase\n smoothEndDuration: 300, // animate to snap/restrict endOnly if there's no inertia\n },\n },\n};\n","/* browser entry point */\n\n// Legacy browser support\nrequire('./legacyBrowsers');\n\n// inertia\nrequire('./inertia');\n\n// modifiers\nrequire('./modifiers/snap');\nrequire('./modifiers/restrict');\n\n// pointerEvents\nrequire('./pointerEvents/base');\nrequire('./pointerEvents/holdRepeat');\nrequire('./pointerEvents/interactableTargets');\n\n// delay\nrequire('./autoStart/delay');\n\n// actions\nrequire('./actions/gesture');\nrequire('./actions/resize');\nrequire('./actions/drag');\nrequire('./actions/drop');\n\n// load these modifiers after resize is loaded\nrequire('./modifiers/snapSize');\nrequire('./modifiers/restrictEdges');\nrequire('./modifiers/restrictSize');\n\n// autoStart actions\nrequire('./autoStart/gesture');\nrequire('./autoStart/resize');\nrequire('./autoStart/drag');\n\n// Interactable preventDefault setting\nrequire('./interactablePreventDefault.js');\n\n// autoScroll\nrequire('./autoScroll');\n\n// export interact\nmodule.exports = require('./interact');\n","const InteractEvent = require('./InteractEvent');\nconst Interaction = require('./Interaction');\nconst modifiers = require('./modifiers');\nconst utils = require('./utils');\nconst animationFrame = require('./utils/raf');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.inertiaStatus = {\n active : false,\n smoothEnd : false,\n allowResume: false,\n\n startEvent: null,\n upCoords : {},\n\n xe: 0, ye: 0,\n sx: 0, sy: 0,\n\n t0: 0,\n vx0: 0, vys: 0,\n duration: 0,\n\n lambda_v0: 0,\n one_ve_v0: 0,\n i : null,\n };\n\n interaction.boundInertiaFrame = () => inertiaFrame .apply(interaction);\n interaction.boundSmoothEndFrame = () => smoothEndFrame.apply(interaction);\n});\n\nInteraction.signals.on('down', function ({ interaction, event, pointer, eventTarget }) {\n const status = interaction.inertiaStatus;\n\n // Check if the down event hits the current inertia target\n if (status.active) {\n let element = eventTarget;\n\n // climb up the DOM tree from the event target\n while (utils.is.element(element)) {\n\n // if interaction element is the current inertia target element\n if (element === interaction.element) {\n // stop inertia\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n\n // update pointers to the down event's coordinates\n interaction.updatePointer(pointer);\n utils.setCoords(interaction.curCoords, interaction.pointers);\n\n // fire appropriate signals\n const signalArg = { interaction };\n Interaction.signals.fire('before-action-move', signalArg);\n Interaction.signals.fire('action-resume' , signalArg);\n\n // fire a reume event\n const resumeEvent = new InteractEvent(interaction,\n event,\n interaction.prepared.name,\n 'inertiaresume',\n interaction.element);\n\n interaction.target.fire(resumeEvent);\n interaction.prevEvent = resumeEvent;\n modifiers.resetStatuses(interaction.modifierStatuses);\n\n utils.copyCoords(interaction.prevCoords, interaction.curCoords);\n break;\n }\n\n element = utils.parentNode(element);\n }\n }\n});\n\nInteraction.signals.on('up', function ({ interaction, event }) {\n const status = interaction.inertiaStatus;\n\n if (!interaction.interacting() || status.active) { return; }\n\n const target = interaction.target;\n const options = target && target.options;\n const inertiaOptions = options && interaction.prepared.name && options[interaction.prepared.name].inertia;\n\n const now = new Date().getTime();\n const statuses = {};\n const page = utils.extend({}, interaction.curCoords.page);\n const pointerSpeed = interaction.pointerDelta.client.speed;\n\n let smoothEnd = false;\n let modifierResult;\n\n // check if inertia should be started\n const inertiaPossible = (inertiaOptions && inertiaOptions.enabled\n && interaction.prepared.name !== 'gesture'\n && event !== status.startEvent);\n\n const inertia = (inertiaPossible\n && (now - interaction.curCoords.timeStamp) < 50\n && pointerSpeed > inertiaOptions.minSpeed\n && pointerSpeed > inertiaOptions.endSpeed);\n\n const modifierArg = {\n interaction,\n pageCoords: page,\n statuses,\n preEnd: true,\n requireEndOnly: true,\n };\n\n // smoothEnd\n if (inertiaPossible && !inertia) {\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n if (modifierResult.shouldMove && modifierResult.locked) {\n smoothEnd = true;\n }\n }\n\n if (!(inertia || smoothEnd)) { return; }\n\n utils.copyCoords(status.upCoords, interaction.curCoords);\n\n interaction.pointers[0] = status.startEvent =\n new InteractEvent(interaction, event, interaction.prepared.name, 'inertiastart', interaction.element);\n\n status.t0 = now;\n\n status.active = true;\n status.allowResume = inertiaOptions.allowResume;\n interaction.simulation = status;\n\n target.fire(status.startEvent);\n\n if (inertia) {\n status.vx0 = interaction.pointerDelta.client.vx;\n status.vy0 = interaction.pointerDelta.client.vy;\n status.v0 = pointerSpeed;\n\n calcInertia(interaction, status);\n\n utils.extend(page, interaction.curCoords.page);\n\n page.x += status.xe;\n page.y += status.ye;\n\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n status.modifiedXe += modifierResult.dx;\n status.modifiedYe += modifierResult.dy;\n\n status.i = animationFrame.request(interaction.boundInertiaFrame);\n }\n else {\n status.smoothEnd = true;\n status.xe = modifierResult.dx;\n status.ye = modifierResult.dy;\n\n status.sx = status.sy = 0;\n\n status.i = animationFrame.request(interaction.boundSmoothEndFrame);\n }\n});\n\nInteraction.signals.on('stop-active', function ({ interaction }) {\n const status = interaction.inertiaStatus;\n\n if (status.active) {\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n }\n});\n\nfunction calcInertia (interaction, status) {\n const inertiaOptions = interaction.target.options[interaction.prepared.name].inertia;\n const lambda = inertiaOptions.resistance;\n const inertiaDur = -Math.log(inertiaOptions.endSpeed / status.v0) / lambda;\n\n status.x0 = interaction.prevEvent.pageX;\n status.y0 = interaction.prevEvent.pageY;\n status.t0 = status.startEvent.timeStamp / 1000;\n status.sx = status.sy = 0;\n\n status.modifiedXe = status.xe = (status.vx0 - inertiaDur) / lambda;\n status.modifiedYe = status.ye = (status.vy0 - inertiaDur) / lambda;\n status.te = inertiaDur;\n\n status.lambda_v0 = lambda / status.v0;\n status.one_ve_v0 = 1 - inertiaOptions.endSpeed / status.v0;\n}\n\nfunction inertiaFrame () {\n updateInertiaCoords(this);\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n\n const status = this.inertiaStatus;\n const options = this.target.options[this.prepared.name].inertia;\n const lambda = options.resistance;\n const t = new Date().getTime() / 1000 - status.t0;\n\n if (t < status.te) {\n\n const progress = 1 - (Math.exp(-lambda * t) - status.lambda_v0) / status.one_ve_v0;\n\n if (status.modifiedXe === status.xe && status.modifiedYe === status.ye) {\n status.sx = status.xe * progress;\n status.sy = status.ye * progress;\n }\n else {\n const quadPoint = utils.getQuadraticCurvePoint(0, 0,\n status.xe,\n status.ye,\n status.modifiedXe,\n status.modifiedYe,\n progress);\n\n status.sx = quadPoint.x;\n status.sy = quadPoint.y;\n }\n\n this.doMove();\n\n status.i = animationFrame.request(this.boundInertiaFrame);\n }\n else {\n status.sx = status.modifiedXe;\n status.sy = status.modifiedYe;\n\n this.doMove();\n this.end(status.startEvent);\n status.active = false;\n this.simulation = null;\n }\n\n utils.copyCoords(this.prevCoords, this.curCoords);\n}\n\nfunction smoothEndFrame () {\n updateInertiaCoords(this);\n\n const status = this.inertiaStatus;\n const t = new Date().getTime() - status.t0;\n const duration = this.target.options[this.prepared.name].inertia.smoothEndDuration;\n\n if (t < duration) {\n status.sx = utils.easeOutQuad(t, 0, status.xe, duration);\n status.sy = utils.easeOutQuad(t, 0, status.ye, duration);\n\n this.pointerMove(status.startEvent, status.startEvent);\n\n status.i = animationFrame.request(this.boundSmoothEndFrame);\n }\n else {\n status.sx = status.xe;\n status.sy = status.ye;\n\n this.pointerMove(status.startEvent, status.startEvent);\n this.end(status.startEvent);\n\n status.smoothEnd =\n status.active = false;\n this.simulation = null;\n }\n}\n\nfunction updateInertiaCoords (interaction) {\n const status = interaction.inertiaStatus;\n\n // return if inertia isn't running\n if (!status.active) { return; }\n\n const pageUp = status.upCoords.page;\n const clientUp = status.upCoords.client;\n\n utils.setCoords(interaction.curCoords, [ {\n pageX : pageUp.x + status.sx,\n pageY : pageUp.y + status.sy,\n clientX: clientUp.x + status.sx,\n clientY: clientUp.y + status.sy,\n } ]);\n}\n","const browser = require('./utils/browser');\nconst events = require('./utils/events');\nconst utils = require('./utils');\nconst scope = require('./scope');\nconst Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\n\nconst globalEvents = {};\n\n/*\\\n * interact\n [ method ]\n *\n * The methods of this variable can be used to set elements as\n * interactables and also to change various default settings.\n *\n * Calling it as a function and passing an element or a valid CSS selector\n * string returns an Interactable object which has various methods to\n * configure it.\n *\n - element (Element | string) The HTML or SVG Element to interact with or CSS selector\n = (object) An @Interactable\n *\n > Usage\n | interact('#draggable').draggable(true);\n |\n | var rectables = interact('rect');\n | rectables\n | .gesturable(true)\n | .on('gesturemove', function (event) {\n | // ...\n | });\n\\*/\nfunction interact (element, options) {\n let interactable = scope.interactables.get(element, options);\n\n if (!interactable) {\n interactable = new Interactable(element, options);\n interactable.events.global = globalEvents;\n }\n\n return interactable;\n}\n\n/*\\\n * interact.isSet\n [ method ]\n *\n * Check if an element has been set\n - element (Element) The Element being searched for\n = (boolean) Indicates if the element or CSS selector was previously passed to interact\n\\*/\ninteract.isSet = function (element, options) {\n return scope.interactables.indexOfElement(element, options && options.context) !== -1;\n};\n\n/*\\\n * interact.on\n [ method ]\n *\n * Adds a global listener for an InteractEvent or adds a DOM event to\n * `document`\n *\n - type (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) interact\n\\*/\ninteract.on = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.on(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.on(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n // if it is an InteractEvent type, add listener to globalEvents\n if (utils.contains(Interactable.eventTypes, type)) {\n // if this type of event was never bound\n if (!globalEvents[type]) {\n globalEvents[type] = [listener];\n }\n else {\n globalEvents[type].push(listener);\n }\n }\n // If non InteractEvent type, addEventListener to document\n else {\n events.add(scope.document, type, listener, { options });\n }\n\n return interact;\n};\n\n/*\\\n * interact.off\n [ method ]\n *\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n - type (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) interact\n \\*/\ninteract.off = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.off(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.off(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n if (!utils.contains(Interactable.eventTypes, type)) {\n events.remove(scope.document, type, listener, options);\n }\n else {\n let index;\n\n if (type in globalEvents\n && (index = utils.indexOf(globalEvents[type], listener)) !== -1) {\n globalEvents[type].splice(index, 1);\n }\n }\n\n return interact;\n};\n\n/*\\\n * interact.debug\n [ method ]\n *\n * Returns an object which exposes internal data\n = (object) An object with properties that outline the current state and expose internal functions and variables\n\\*/\ninteract.debug = function () {\n return scope;\n};\n\n// expose the functions used to calculate multi-touch properties\ninteract.getPointerAverage = utils.pointerAverage;\ninteract.getTouchBBox = utils.touchBBox;\ninteract.getTouchDistance = utils.touchDistance;\ninteract.getTouchAngle = utils.touchAngle;\n\ninteract.getElementRect = utils.getElementRect;\ninteract.getElementClientRect = utils.getElementClientRect;\ninteract.matchesSelector = utils.matchesSelector;\ninteract.closest = utils.closest;\n\n/*\\\n * interact.supportsTouch\n [ method ]\n *\n = (boolean) Whether or not the browser supports touch input\n\\*/\ninteract.supportsTouch = function () {\n return browser.supportsTouch;\n};\n\n/*\\\n * interact.supportsPointerEvent\n [ method ]\n *\n = (boolean) Whether or not the browser supports PointerEvents\n\\*/\ninteract.supportsPointerEvent = function () {\n return browser.supportsPointerEvent;\n};\n\n/*\\\n * interact.stop\n [ method ]\n *\n * Cancels all interactions (end events are not fired)\n *\n - event (Event) An event on which to call preventDefault()\n = (object) interact\n\\*/\ninteract.stop = function (event) {\n for (let i = scope.interactions.length - 1; i >= 0; i--) {\n scope.interactions[i].stop(event);\n }\n\n return interact;\n};\n\n/*\\\n * interact.pointerMoveTolerance\n [ method ]\n * Returns or sets the distance the pointer must be moved before an action\n * sequence occurs. This also affects tolerance for tap events.\n *\n - newValue (number) #optional The movement from the start position must be greater than this value\n = (number | Interactable) The current setting or interact\n\\*/\ninteract.pointerMoveTolerance = function (newValue) {\n if (utils.is.number(newValue)) {\n Interaction.pointerMoveTolerance = newValue;\n\n return this;\n }\n\n return Interaction.pointerMoveTolerance;\n};\n\ninteract.addDocument = scope.addDocument;\ninteract.removeDocument = scope.removeDocument;\n\nscope.interact = interact;\n\nmodule.exports = interact;\n","const Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\nconst scope = require('./scope');\nconst is = require('./utils/is');\nconst events = require('./utils/events');\n\nconst { nodeContains, matchesSelector } = require('./utils/domUtils');\n\n/*\\\n * Interactable.preventDefault\n [ method ]\n *\n * Returns or sets whether to prevent the browser's default behaviour\n * in response to pointer events. Can be set to:\n * - `'always'` to always prevent\n * - `'never'` to never prevent\n * - `'auto'` to let interact.js try to determine what would be best\n *\n - newValue (string) #optional `true`, `false` or `'auto'`\n = (string | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.preventDefault = function (newValue) {\n if (/^(always|never|auto)$/.test(newValue)) {\n this.options.preventDefault = newValue;\n return this;\n }\n\n if (is.bool(newValue)) {\n this.options.preventDefault = newValue? 'always' : 'never';\n return this;\n }\n\n return this.options.preventDefault;\n};\n\nInteractable.prototype.checkAndPreventDefault = function (event) {\n const setting = this.options.preventDefault;\n\n if (setting === 'never') { return; }\n\n if (setting === 'always') {\n event.preventDefault();\n return;\n }\n\n // setting === 'auto'\n\n // don't preventDefault if the browser supports passiveEvents\n // CSS touch-action and user-selecct should be used instead\n if (events.supportsOptions) {\n return;\n }\n\n // don't preventDefault of pointerdown events\n if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) {\n return;\n }\n\n // don't preventDefault on editable elements\n if (is.element(event.target)\n && matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) {\n return;\n }\n\n event.preventDefault();\n};\n\nfunction onInteractionEvent ({ interaction, event }) {\n if (interaction.target) {\n interaction.target.checkAndPreventDefault(event);\n }\n}\n\nfor (const eventSignal of ['down', 'move', 'up', 'cancel']) {\n Interaction.signals.on(eventSignal, onInteractionEvent);\n}\n\n// prevent native HTML5 drag on interact.js target elements\nInteraction.docEvents.dragstart = function preventNativeDrag (event) {\n for (const interaction of scope.interactions) {\n\n if (interaction.element\n && (interaction.element === event.target\n || nodeContains(interaction.element, event.target))) {\n\n interaction.target.checkAndPreventDefault(event);\n return;\n }\n }\n};\n","const scope = require('./scope');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst iFinder = require('./utils/interactionFinder');\nconst pointerEvents = require('./pointerEvents/base');\n\nconst { window } = require('./utils/window');\n\nconst toString = Object.prototype.toString;\n\nif (!window.Array.isArray) {\n window.Array.isArray = function (obj) {\n return toString.call(obj) === '[object Array]';\n };\n}\n\nif (!String.prototype.trim) {\n String.prototype.trim = function () {\n return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n };\n}\n\n// http://www.quirksmode.org/dom/events/click.html\n// >Events leading to dblclick\n//\n// IE8 doesn't fire down event before dblclick.\n// This workaround tries to fire a tap and doubletap after dblclick\nfunction onIE8Dblclick (event) {\n const eventTarget = event.target;\n const interaction = iFinder.search(event, event.type, eventTarget);\n\n if (!interaction) { return; }\n\n if (interaction.prevTap\n && event.clientX === interaction.prevTap.clientX\n && event.clientY === interaction.prevTap.clientY\n && eventTarget === interaction.prevTap.target) {\n\n interaction.downTargets[0] = eventTarget;\n interaction.downTimes [0] = new Date().getTime();\n\n pointerEvents.fire({\n interaction,\n event,\n eventTarget,\n pointer: event,\n type: 'tap',\n });\n }\n}\n\nif (browser.isIE8) {\n const selectFix = function (event) {\n for (const interaction of scope.interactions) {\n if (interaction.interacting()) {\n interaction.target.checkAndPreventDefault(event);\n }\n }\n };\n\n const onDocIE8 = function onDocIE8 ({ doc, win }, signalName) {\n const eventMethod = signalName.indexOf('listen') === 0\n ? events.add : events.remove;\n\n // For IE's lack of Event#preventDefault\n eventMethod(doc, 'selectstart', selectFix);\n\n if (pointerEvents) {\n eventMethod(doc, 'dblclick', onIE8Dblclick);\n }\n };\n\n scope.signals.on('add-document' , onDocIE8);\n scope.signals.on('remove-document', onDocIE8);\n}\n\nmodule.exports = null;\n","const InteractEvent = require('../InteractEvent');\nconst Interaction = require('../Interaction');\nconst extend = require('../utils/extend');\n\nconst modifiers = {\n names: [],\n\n setOffsets: function (arg) {\n const { interaction, pageCoords: page } = arg;\n const { target, element, startOffset } = interaction;\n const rect = target.getRect(element);\n\n if (rect) {\n startOffset.left = page.x - rect.left;\n startOffset.top = page.y - rect.top;\n\n startOffset.right = rect.right - page.x;\n startOffset.bottom = rect.bottom - page.y;\n\n if (!('width' in rect)) { rect.width = rect.right - rect.left; }\n if (!('height' in rect)) { rect.height = rect.bottom - rect.top ; }\n }\n else {\n startOffset.left = startOffset.top = startOffset.right = startOffset.bottom = 0;\n }\n\n arg.rect = rect;\n arg.interactable = target;\n arg.element = element;\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n\n arg.options = target.options[interaction.prepared.name][modifierName];\n\n if (!arg.options) {\n continue;\n }\n\n interaction.modifierOffsets[modifierName] = modifiers[modifierName].setOffset(arg);\n }\n },\n\n setAll: function (arg) {\n const { interaction, statuses, preEnd, requireEndOnly } = arg;\n const coords = extend({}, arg.pageCoords);\n const result = {\n dx: 0,\n dy: 0,\n changed: false,\n locked: false,\n shouldMove: true,\n };\n\n for (const modifierName of modifiers.names) {\n const modifier = modifiers[modifierName];\n const options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!shouldDo(options, preEnd, requireEndOnly)) { continue; }\n\n arg.status = arg.status = statuses[modifierName];\n arg.options = options;\n arg.offset = arg.interaction.modifierOffsets[modifierName];\n\n modifier.set(arg);\n\n if (arg.status.locked) {\n coords.x += arg.status.dx;\n coords.y += arg.status.dy;\n\n result.dx += arg.status.dx;\n result.dy += arg.status.dy;\n\n result.locked = true;\n }\n }\n\n // a move should be fired if:\n // - there are no modifiers enabled,\n // - no modifiers are \"locked\" i.e. have changed the pointer's coordinates, or\n // - the locked coords have changed since the last pointer move\n result.shouldMove = !arg.status || !result.locked || arg.status.changed;\n\n return result;\n },\n\n resetStatuses: function (statuses) {\n for (const modifierName of modifiers.names) {\n const status = statuses[modifierName] || {};\n\n status.dx = status.dy = 0;\n status.modifiedX = status.modifiedY = NaN;\n status.locked = false;\n status.changed = true;\n\n statuses[modifierName] = status;\n }\n\n return statuses;\n },\n\n start: function ({ interaction }, signalName) {\n const arg = {\n interaction,\n pageCoords: (signalName === 'action-resume' ?\n interaction.curCoords : interaction.startCoords).page,\n startOffset: interaction.startOffset,\n statuses: interaction.modifierStatuses,\n preEnd: false,\n requireEndOnly: false,\n };\n\n modifiers.setOffsets(arg);\n modifiers.resetStatuses(arg.statuses);\n\n arg.pageCoords = extend({}, interaction.startCoords.page);\n interaction.modifierResult = modifiers.setAll(arg);\n },\n};\n\nInteraction.signals.on('new', function (interaction) {\n interaction.startOffset = { left: 0, right: 0, top: 0, bottom: 0 };\n interaction.modifierOffsets = {};\n interaction.modifierStatuses = modifiers.resetStatuses({});\n interaction.modifierResult = null;\n});\n\nInteraction.signals.on('action-start' , modifiers.start);\nInteraction.signals.on('action-resume', modifiers.start);\n\nInteraction.signals.on('before-action-move', function ({ interaction, preEnd, interactingBeforeMove }) {\n const modifierResult = modifiers.setAll({\n interaction,\n preEnd,\n pageCoords: interaction.curCoords.page,\n statuses: interaction.modifierStatuses,\n requireEndOnly: false,\n });\n\n // don't fire an action move if a modifier would keep the event in the same\n // cordinates as before\n if (!modifierResult.shouldMove && interactingBeforeMove) {\n interaction._dontFireMove = true;\n }\n\n interaction.modifierResult = modifierResult;\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n for (let i = 0; i < modifiers.names.length; i++) {\n const options = interaction.target.options[interaction.prepared.name][modifiers.names[i]];\n\n // if the endOnly option is true for any modifier\n if (shouldDo(options, true, true)) {\n // fire a move event at the modified coordinates\n interaction.doMove({ event, preEnd: true });\n break;\n }\n }\n});\n\nInteractEvent.signals.on('set-xy', function (arg) {\n const { iEvent, interaction } = arg;\n const modifierArg = extend({}, arg);\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n modifierArg.options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!modifierArg.options) {\n continue;\n }\n\n const modifier = modifiers[modifierName];\n\n modifierArg.status = interaction.modifierStatuses[modifierName];\n\n iEvent[modifierName] = modifier.modifyCoords(modifierArg);\n }\n});\n\nfunction shouldDo (options, preEnd, requireEndOnly) {\n return (options && options.enabled\n && (preEnd || !options.endOnly)\n && (!requireEndOnly || options.endOnly));\n}\n\nmodule.exports = modifiers;\n","const modifiers = require('./index');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst restrict = {\n defaults: {\n enabled : false,\n endOnly : false,\n restriction: null,\n elementRect: null,\n },\n\n setOffset: function ({ rect, startOffset, options }) {\n const elementRect = options && options.elementRect;\n const offset = {};\n\n if (rect && elementRect) {\n offset.left = startOffset.left - (rect.width * elementRect.left);\n offset.top = startOffset.top - (rect.height * elementRect.top);\n\n offset.right = startOffset.right - (rect.width * (1 - elementRect.right));\n offset.bottom = startOffset.bottom - (rect.height * (1 - elementRect.bottom));\n }\n else {\n offset.left = offset.top = offset.right = offset.bottom = 0;\n }\n\n return offset;\n },\n\n set: function ({ pageCoords, interaction, status, options }) {\n if (!options) { return status; }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n\n const restriction = getRestrictionRect(options.restriction, interaction, page);\n\n if (!restriction) { return status; }\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n const rect = restriction;\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n const offset = interaction.modifierOffsets.restrict;\n\n // object is assumed to have\n // x, y, width, height or\n // left, top, right, bottom\n if ('x' in restriction && 'y' in restriction) {\n modifiedX = Math.max(Math.min(rect.x + rect.width - offset.right , page.x), rect.x + offset.left);\n modifiedY = Math.max(Math.min(rect.y + rect.height - offset.bottom, page.y), rect.y + offset.top );\n }\n else {\n modifiedX = Math.max(Math.min(rect.right - offset.right , page.x), rect.left + offset.left);\n modifiedY = Math.max(Math.min(rect.bottom - offset.bottom, page.y), rect.top + offset.top );\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const elementRect = options && options.elementRect;\n\n if (options && options.enabled\n && !(phase === 'start' && elementRect && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n getRestrictionRect,\n};\n\nfunction getRestrictionRect (value, interaction, page) {\n if (utils.is.function(value)) {\n return utils.resolveRectLike(value, interaction.target, interaction.element, [page.x, page.y, interaction]);\n } else {\n return utils.resolveRectLike(value, interaction.target, interaction.element);\n }\n}\n\nmodifiers.restrict = restrict;\nmodifiers.names.push('restrict');\n\ndefaultOptions.perAction.restrict = restrict.defaults;\n\nmodule.exports = restrict;\n","// This module adds the options.resize.restrictEdges setting which sets min and\n// max for the top, left, bottom and right edges of the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictEdges: {\n// inner: { top: 200, left: 200, right: 400, bottom: 400 },\n// outer: { top: 0, left: 0, right: 600, bottom: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst { getRestrictionRect } = require('./restrict');\n\nconst noInner = { top: +Infinity, left: +Infinity, bottom: -Infinity, right: -Infinity };\nconst noOuter = { top: -Infinity, left: -Infinity, bottom: +Infinity, right: +Infinity };\n\nconst restrictEdges = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n offset: null,\n },\n\n setOffset: function ({ interaction, startOffset, options }) {\n if (!options) {\n return utils.extend({}, startOffset);\n }\n\n const offset = getRestrictionRect(options.offset, interaction, interaction.startCoords.page);\n\n if (offset) {\n return {\n top: startOffset.top + offset.y,\n left: startOffset.left + offset.x,\n bottom: startOffset.bottom + offset.y,\n right: startOffset.right + offset.x,\n };\n }\n\n return startOffset;\n },\n\n set: function ({ pageCoords, interaction, status, offset, options }) {\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n const inner = rectUtils.xywhToTlbr(getRestrictionRect(options.inner, interaction, page)) || noInner;\n const outer = rectUtils.xywhToTlbr(getRestrictionRect(options.outer, interaction, page)) || noOuter;\n\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n if (edges.top) {\n modifiedY = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top);\n }\n else if (edges.bottom) {\n modifiedY = Math.max(Math.min(outer.bottom - offset.bottom, page.y), inner.bottom - offset.bottom);\n }\n if (edges.left) {\n modifiedX = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left);\n }\n else if (edges.right) {\n modifiedX = Math.max(Math.min(outer.right - offset.right, page.x), inner.right - offset.right);\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n if (options && options.enabled\n && !(phase === 'start' && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n noInner,\n noOuter,\n getRestrictionRect,\n};\n\nmodifiers.restrictEdges = restrictEdges;\nmodifiers.names.push('restrictEdges');\n\ndefaultOptions.perAction.restrictEdges = restrictEdges.defaults;\nresize.defaults.restrictEdges = restrictEdges.defaults;\n\nmodule.exports = restrictEdges;\n","// This module adds the options.resize.restrictSize setting which sets min and\n// max width and height for the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictSize: {\n// min: { width: -600, height: -600 },\n// max: { width: 600, height: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst restrictEdges = require('./restrictEdges');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst noMin = { width: -Infinity, height: -Infinity };\nconst noMax = { width: +Infinity, height: +Infinity };\n\nconst restrictSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n },\n\n setOffset: function ({ interaction }) {\n return interaction.startOffset;\n },\n\n set: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const rect = rectUtils.xywhToTlbr(interaction.resizeRects.inverted);\n\n const minSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.min, interaction)) || noMin;\n const maxSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.max, interaction)) || noMax;\n\n arg.options = {\n enabled: options.enabled,\n endOnly: options.endOnly,\n inner: utils.extend({}, restrictEdges.noInner),\n outer: utils.extend({}, restrictEdges.noOuter),\n };\n\n if (edges.top) {\n arg.options.inner.top = rect.bottom - minSize.height;\n arg.options.outer.top = rect.bottom - maxSize.height;\n }\n else if (edges.bottom) {\n arg.options.inner.bottom = rect.top + minSize.height;\n arg.options.outer.bottom = rect.top + maxSize.height;\n }\n if (edges.left) {\n arg.options.inner.left = rect.right - minSize.width;\n arg.options.outer.left = rect.right - maxSize.width;\n }\n else if (edges.right) {\n arg.options.inner.right = rect.left + minSize.width;\n arg.options.outer.right = rect.left + maxSize.width;\n }\n\n restrictEdges.set(arg);\n },\n\n modifyCoords: restrictEdges.modifyCoords,\n};\n\nmodifiers.restrictSize = restrictSize;\nmodifiers.names.push('restrictSize');\n\ndefaultOptions.perAction.restrictSize = restrictSize.defaults;\nresize.defaults.restrictSize = restrictSize.defaults;\n\nmodule.exports = restrictSize;\n","const modifiers = require('./index');\nconst interact = require('../interact');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst snap = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n\n relativePoints: null,\n },\n\n setOffset: function ({ interaction, interactable, element, rect, startOffset, options }) {\n const offsets = [];\n const optionsOrigin = utils.rectToXY(utils.resolveRectLike(options.origin));\n const origin = optionsOrigin || utils.getOriginXY(interactable, element, interaction.prepared.name);\n options = options || interactable.options[interaction.prepared.name].snap || {};\n\n let snapOffset;\n\n if (options.offset === 'startCoords') {\n snapOffset = {\n x: interaction.startCoords.page.x - origin.x,\n y: interaction.startCoords.page.y - origin.y,\n };\n }\n else {\n const offsetRect = utils.resolveRectLike(options.offset, interactable, element, [interaction]);\n\n snapOffset = utils.rectToXY(offsetRect) || { x: 0, y: 0 };\n }\n\n if (rect && options.relativePoints && options.relativePoints.length) {\n for (const { x: relativeX, y: relativeY } of options.relativePoints) {\n offsets.push({\n x: startOffset.left - (rect.width * relativeX) + snapOffset.x,\n y: startOffset.top - (rect.height * relativeY) + snapOffset.y,\n });\n }\n }\n else {\n offsets.push(snapOffset);\n }\n\n return offsets;\n },\n\n set: function ({ interaction, pageCoords, status, options, offset: offsets }) {\n const targets = [];\n let target;\n let page;\n let i;\n\n if (status.useStatusXY) {\n page = { x: status.x, y: status.y };\n }\n else {\n const origin = utils.getOriginXY(interaction.target, interaction.element, interaction.prepared.name);\n\n page = utils.extend({}, pageCoords);\n\n page.x -= origin.x;\n page.y -= origin.y;\n }\n\n status.realX = page.x;\n status.realY = page.y;\n\n let len = options.targets? options.targets.length : 0;\n\n for (const { x: offsetX, y: offsetY } of offsets) {\n const relativeX = page.x - offsetX;\n const relativeY = page.y - offsetY;\n\n for (const snapTarget of options.targets) {\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n targets.push({\n x: utils.is.number(target.x) ? (target.x + offsetX) : relativeX,\n y: utils.is.number(target.y) ? (target.y + offsetY) : relativeY,\n\n range: utils.is.number(target.range)? target.range: options.range,\n });\n }\n }\n\n const closest = {\n target: null,\n inRange: false,\n distance: 0,\n range: 0,\n dx: 0,\n dy: 0,\n };\n\n for (i = 0, len = targets.length; i < len; i++) {\n target = targets[i];\n\n const range = target.range;\n const dx = target.x - page.x;\n const dy = target.y - page.y;\n const distance = utils.hypot(dx, dy);\n let inRange = distance <= range;\n\n // Infinite targets count as being out of range\n // compared to non infinite ones that are in range\n if (range === Infinity && closest.inRange && closest.range !== Infinity) {\n inRange = false;\n }\n\n if (!closest.target || (inRange\n // is the closest target in range?\n ? (closest.inRange && range !== Infinity\n // the pointer is relatively deeper in this target\n ? distance / range < closest.distance / closest.range\n // this target has Infinite range and the closest doesn't\n : (range === Infinity && closest.range !== Infinity)\n // OR this target is closer that the previous closest\n || distance < closest.distance)\n // The other is not in range and the pointer is closer to this target\n : (!closest.inRange && distance < closest.distance))) {\n\n closest.target = target;\n closest.distance = distance;\n closest.range = range;\n closest.inRange = inRange;\n closest.dx = dx;\n closest.dy = dy;\n\n status.range = range;\n }\n }\n\n let snapChanged;\n\n if (closest.target) {\n snapChanged = (status.modifiedX !== closest.target.x || status.modifiedY !== closest.target.y);\n\n status.modifiedX = closest.target.x;\n status.modifiedY = closest.target.y;\n }\n else {\n snapChanged = true;\n\n status.modifiedX = NaN;\n status.modifiedY = NaN;\n }\n\n status.dx = closest.dx;\n status.dy = closest.dy;\n\n status.changed = (snapChanged || (closest.inRange && !status.locked));\n status.locked = closest.inRange;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const relativePoints = options && options.relativePoints;\n\n if (options && options.enabled\n && !(phase === 'start' && relativePoints && relativePoints.length)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n }\n\n return {\n range : status.range,\n locked : status.locked,\n x : status.modifiedX,\n y : status.modifiedY,\n realX : status.realX,\n realY : status.realY,\n dx : status.dx,\n dy : status.dy,\n };\n }\n },\n};\n\ninteract.createSnapGrid = function (grid) {\n return function (x, y) {\n const limits = grid.limits || {\n left : -Infinity,\n right : Infinity,\n top : -Infinity,\n bottom: Infinity,\n };\n let offsetX = 0;\n let offsetY = 0;\n\n if (utils.is.object(grid.offset)) {\n offsetX = grid.offset.x;\n offsetY = grid.offset.y;\n }\n\n const gridx = Math.round((x - offsetX) / grid.x);\n const gridy = Math.round((y - offsetY) / grid.y);\n\n const newX = Math.max(limits.left, Math.min(limits.right , gridx * grid.x + offsetX));\n const newY = Math.max(limits.top , Math.min(limits.bottom, gridy * grid.y + offsetY));\n\n return {\n x: newX,\n y: newY,\n range: grid.range,\n };\n };\n};\n\nmodifiers.snap = snap;\nmodifiers.names.push('snap');\n\ndefaultOptions.perAction.snap = snap.defaults;\n\nmodule.exports = snap;\n","// This module allows snapping of the size of targets during resize\n// interactions.\n\nconst modifiers = require('./index');\nconst snap = require('./snap');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\nconst utils = require('../utils/');\n\nconst snapSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n },\n\n setOffset: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.edges;\n\n if (!edges) { return; }\n\n arg.options = {\n relativePoints: [{\n x: edges.left? 0 : 1,\n y: edges.top ? 0 : 1,\n }],\n origin: { x: 0, y: 0 },\n offset: 'self',\n range: options.range,\n };\n\n const offsets = snap.setOffset(arg);\n arg.options = options;\n\n return offsets;\n },\n\n set: function (arg) {\n const { interaction, options, offset, pageCoords } = arg;\n const page = utils.extend({}, pageCoords);\n const relativeX = page.x - offset[0].x;\n const relativeY = page.y - offset[0].y;\n\n arg.options = utils.extend({}, options);\n arg.options.targets = [];\n\n for (const snapTarget of options.targets) {\n let target;\n\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n if ('width' in target && 'height' in target) {\n target.x = target.width;\n target.y = target.height;\n }\n\n arg.options.targets.push(target);\n }\n\n snap.set(arg);\n },\n\n modifyCoords: function (arg) {\n const { options } = arg;\n\n arg.options = utils.extend({}, options);\n arg.options.enabled = options.enabled;\n arg.options.relativePoints = [null];\n\n snap.modifyCoords(arg);\n },\n};\n\nmodifiers.snapSize = snapSize;\nmodifiers.names.push('snapSize');\n\ndefaultOptions.perAction.snapSize = snapSize.defaults;\nresize.defaults.snapSize = snapSize.defaults;\n\nmodule.exports = snapSize;\n","const pointerUtils = require('../utils/pointerUtils');\n\nmodule.exports = class PointerEvent {\n constructor (type, pointer, event, eventTarget, interaction) {\n pointerUtils.pointerExtend(this, event);\n\n if (event !== pointer) {\n pointerUtils.pointerExtend(this, pointer);\n }\n\n this.interaction = interaction;\n\n this.timeStamp = new Date().getTime();\n this.originalEvent = event;\n this.type = type;\n this.pointerId = pointerUtils.getPointerId(pointer);\n this.pointerType = pointerUtils.getPointerType(pointer, interaction);\n this.target = eventTarget;\n this.currentTarget = null;\n\n if (type === 'tap') {\n const pointerIndex = interaction.getPointerIndex(pointer);\n this.dt = this.timeStamp - interaction.downTimes[pointerIndex];\n\n const interval = this.timeStamp - interaction.tapTime;\n\n this.double = !!(interaction.prevTap\n && interaction.prevTap.type !== 'doubletap'\n && interaction.prevTap.target === this.target\n && interval < 500);\n }\n else if (type === 'doubletap') {\n this.dt = pointer.timeStamp - interaction.tapTime;\n }\n }\n\n subtractOrigin ({ x: originX, y: originY }) {\n this.pageX -= originX;\n this.pageY -= originY;\n this.clientX -= originX;\n this.clientY -= originY;\n\n return this;\n }\n\n addOrigin ({ x: originX, y: originY }) {\n this.pageX += originX;\n this.pageY += originY;\n this.clientX += originX;\n this.clientY += originY;\n\n return this;\n }\n\n preventDefault () {\n this.originalEvent.preventDefault();\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n};\n","const PointerEvent = require('./PointerEvent');\nconst Interaction = require('../Interaction');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst defaults = require('../defaultOptions');\nconst signals = require('../utils/Signals').new();\nconst { filter } = require('../utils/arr');\n\nconst simpleSignals = [ 'down', 'up', 'cancel' ];\nconst simpleEvents = [ 'down', 'up', 'cancel' ];\n\nconst pointerEvents = {\n PointerEvent,\n fire,\n collectEventTargets,\n signals,\n defaults: {\n holdDuration: 600,\n ignoreFrom : null,\n allowFrom : null,\n origin : { x: 0, y: 0 },\n },\n types: [\n 'down',\n 'move',\n 'up',\n 'cancel',\n 'tap',\n 'doubletap',\n 'hold',\n ],\n};\n\nfunction fire (arg) {\n const {\n interaction, pointer, event, eventTarget,\n type = arg.pointerEvent.type,\n targets = collectEventTargets(arg),\n pointerEvent = new PointerEvent(type, pointer, event, eventTarget, interaction),\n } = arg;\n\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n targets,\n type,\n pointerEvent,\n };\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n\n for (const prop in target.props || {}) {\n pointerEvent[prop] = target.props[prop];\n }\n\n const origin = utils.getOriginXY(target.eventable, target.element);\n\n pointerEvent.subtractOrigin(origin);\n pointerEvent.eventable = target.eventable;\n pointerEvent.currentTarget = target.element;\n\n target.eventable.fire(pointerEvent);\n\n pointerEvent.addOrigin(origin);\n\n if (pointerEvent.immediatePropagationStopped\n || (pointerEvent.propagationStopped\n && (i + 1) < targets.length && targets[i + 1].element !== pointerEvent.currentTarget)) {\n break;\n }\n }\n\n signals.fire('fired', signalArg);\n\n if (type === 'tap') {\n // if pointerEvent should make a double tap, create and fire a doubletap\n // PointerEvent and use that as the prevTap\n const prevTap = pointerEvent.double\n ? fire({\n interaction, pointer, event, eventTarget,\n type: 'doubletap',\n })\n : pointerEvent;\n\n interaction.prevTap = prevTap;\n interaction.tapTime = prevTap.timeStamp;\n }\n\n return pointerEvent;\n}\n\nfunction collectEventTargets ({ interaction, pointer, event, eventTarget, type }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n // do not fire a tap event if the pointer was moved before being lifted\n if (type === 'tap' && (interaction.pointerWasMoved\n // or if the pointerup target is different to the pointerdown target\n || !(interaction.downTargets[pointerIndex] && interaction.downTargets[pointerIndex] === eventTarget))) {\n return [];\n }\n\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n path,\n targets: [],\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (type === 'hold') {\n signalArg.targets = filter(signalArg.targets, target =>\n target.eventable.options.holdDuration === interaction.holdTimers[pointerIndex].duration);\n }\n\n return signalArg.targets;\n}\n\nInteraction.signals.on('update-pointer-down', function ({ interaction, pointerIndex }) {\n interaction.holdTimers[pointerIndex] = { duration: Infinity, timeout: null };\n});\n\nInteraction.signals.on('remove-pointer', function ({ interaction, pointerIndex }) {\n interaction.holdTimers.splice(pointerIndex, 1);\n});\n\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget, duplicateMove }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n if (!duplicateMove && (!interaction.pointerIsDown || interaction.pointerWasMoved)) {\n if (interaction.pointerIsDown) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n\n fire({\n interaction, pointer, event, eventTarget,\n type: 'move',\n });\n }\n});\n\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget, pointerIndex }) {\n // copy event to be used in timeout for IE8\n const eventCopy = browser.isIE8? utils.extend({}, event) : event;\n\n const timer = interaction.holdTimers[pointerIndex];\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'hold',\n targets: [],\n path,\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (!signalArg.targets.length) { return; }\n\n let minDuration = Infinity;\n\n for (let i = 0; i < signalArg.targets.length; i++) {\n const target = signalArg.targets[i];\n const holdDuration = target.eventable.options.holdDuration;\n\n if (holdDuration < minDuration) {\n minDuration = holdDuration;\n }\n }\n\n timer.duration = minDuration;\n timer.timeout = setTimeout(function () {\n fire({\n interaction, eventCopy, eventTarget,\n pointer: browser.isIE8? eventCopy : pointer,\n type: 'hold',\n });\n }, minDuration);\n});\n\nInteraction.signals.on('up', ({ interaction, pointer, event, eventTarget }) => {\n if (!interaction.pointerWasMoved) {\n fire({ interaction, eventTarget, pointer, event, type: 'tap' });\n }\n});\n\n['up', 'cancel'].forEach(function (signalName) {\n Interaction.signals.on(signalName, function ({ interaction, pointerIndex }) {\n if (interaction.holdTimers[pointerIndex]) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n });\n});\n\nfunction createSignalListener (type) {\n return function ({ interaction, pointer, event, eventTarget }) {\n fire({ interaction, eventTarget, pointer, event, type });\n };\n}\n\nfor (let i = 0; i < simpleSignals.length; i++) {\n Interaction.signals.on(simpleSignals[i], createSignalListener(simpleEvents[i]));\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.prevTap = null; // the most recent tap event on this interaction\n interaction.tapTime = 0; // time of the most recent tap event\n interaction.holdTimers = []; // [{ duration, timeout }]\n});\n\ndefaults.pointerEvents = pointerEvents.defaults;\nmodule.exports = pointerEvents;\n","const pointerEvents = require('./base');\nconst Interaction = require('../Interaction');\n\npointerEvents.signals.on('new', onNew);\npointerEvents.signals.on('fired', onFired);\n\nfor (const signal of ['move', 'up', 'cancel', 'endall']) {\n Interaction.signals.on(signal, endHoldRepeat);\n}\n\nfunction onNew ({ pointerEvent }) {\n if (pointerEvent.type !== 'hold') { return; }\n\n pointerEvent.count = (pointerEvent.count || 0) + 1;\n}\n\nfunction onFired ({ interaction, pointerEvent, eventTarget, targets }) {\n if (pointerEvent.type !== 'hold' || !targets.length) { return; }\n\n // get the repeat interval from the first eventable\n const interval = targets[0].eventable.options.holdRepeatInterval;\n\n // don't repeat if the interval is 0 or less\n if (interval <= 0) { return; }\n\n // set a timeout to fire the holdrepeat event\n interaction.holdIntervalHandle = setTimeout(function () {\n pointerEvents.fire({\n interaction,\n eventTarget,\n type: 'hold',\n pointer: pointerEvent,\n event: pointerEvent,\n });\n }, interval);\n}\n\nfunction endHoldRepeat ({ interaction }) {\n // set the interaction's holdStopTime property\n // to stop further holdRepeat events\n if (interaction.holdIntervalHandle) {\n clearInterval(interaction.holdIntervalHandle);\n interaction.holdIntervalHandle = null;\n }\n}\n\n// don't repeat by default\npointerEvents.defaults.holdRepeatInterval = 0;\npointerEvents.types.push('holdrepeat');\n\nmodule.exports = {\n onNew,\n onFired,\n endHoldRepeat,\n};\n","const pointerEvents = require('./base');\nconst Interactable = require('../Interactable');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\nconst scope = require('../scope');\nconst extend = require('../utils/extend');\nconst { merge } = require('../utils/arr');\n\npointerEvents.signals.on('collect-targets', function ({ targets, element, type, eventTarget }) {\n function collectSelectors (interactable, selector, context) {\n const els = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && is.element(element)\n && domUtils.matchesSelector(element, selector, els)\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n const interactable = scope.interactables.get(element);\n\n if (interactable) {\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n scope.interactables.forEachSelector(collectSelectors, element);\n});\n\nInteractable.signals.on('new', function ({ interactable }) {\n interactable.events.getRect = function (element) {\n return interactable.getRect(element);\n };\n});\n\nInteractable.signals.on('set', function ({ interactable, options }) {\n extend(interactable.events.options, pointerEvents.defaults);\n extend(interactable.events.options, options);\n});\n\nmerge(Interactable.eventTypes, pointerEvents.types);\n\nInteractable.prototype.pointerEvents = function (options) {\n extend(this.events.options, options);\n\n return this;\n};\n\nconst __backCompatOption = Interactable.prototype._backCompatOption;\n\nInteractable.prototype._backCompatOption = function (optionName, newValue) {\n const ret = __backCompatOption.call(this, optionName, newValue);\n\n if (ret === this) {\n this.events.options[optionName] = newValue;\n }\n\n return ret;\n};\n\nInteractable.settingsMethods.push('pointerEvents');\n","const utils = require('./utils');\nconst events = require('./utils/events');\nconst signals = require('./utils/Signals').new();\n\nconst scope = {\n signals,\n events,\n utils,\n\n // main document\n document: require('./utils/domObjects').document,\n // all documents being listened to\n documents: [],\n\n addDocument: function (doc, win) {\n // do nothing if document is already known\n if (utils.contains(scope.documents, doc)) { return false; }\n\n win = win || scope.getWindow(doc);\n\n scope.documents.push(doc);\n events.documents.push(doc);\n\n // don't add an unload event for the main document\n // so that the page may be cached in browser history\n if (doc !== scope.document) {\n events.add(win, 'unload', scope.onWindowUnload);\n }\n\n signals.fire('add-document', { doc, win });\n },\n\n removeDocument: function (doc, win) {\n const index = utils.indexOf(scope.documents, doc);\n\n win = win || scope.getWindow(doc);\n\n events.remove(win, 'unload', scope.onWindowUnload);\n\n scope.documents.splice(index, 1);\n events.documents.splice(index, 1);\n\n signals.fire('remove-document', { win, doc });\n },\n\n onWindowUnload: function () {\n scope.removeDocument(this.document, this);\n },\n};\n\nmodule.exports = scope;\n","const { indexOf } = require('./arr');\n\nclass Signals {\n constructor () {\n this.listeners = {\n // signalName: [listeners],\n };\n }\n\n on (name, listener) {\n if (!this.listeners[name]) {\n this.listeners[name] = [listener];\n return;\n }\n\n this.listeners[name].push(listener);\n }\n\n off (name, listener) {\n if (!this.listeners[name]) { return; }\n\n const index = indexOf(this.listeners[name], listener);\n\n if (index !== -1) {\n this.listeners[name].splice(index, 1);\n }\n }\n\n fire (name, arg) {\n const targetListeners = this.listeners[name];\n\n if (!targetListeners) { return; }\n\n for (let i = 0; i < targetListeners.length; i++) {\n if (targetListeners[i](arg, name) === false) {\n return;\n }\n }\n }\n}\n\nSignals.new = function () {\n return new Signals();\n};\n\nmodule.exports = Signals;\n","function indexOf (array, target) {\n for (let i = 0, len = array.length; i < len; i++) {\n if (array[i] === target) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction contains (array, target) {\n return indexOf(array, target) !== -1;\n}\n\nfunction merge (target, source) {\n for (let i = 0; i < source.length; i++) {\n target.push(source[i]);\n }\n\n return target;\n}\n\nfunction filter (array, test) {\n const result = [];\n\n for (let i = 0; i < array.length; i++) {\n if (test(array[i])) {\n result.push(array[i]);\n }\n }\n\n return result;\n}\n\nmodule.exports = {\n indexOf,\n contains,\n merge,\n filter,\n};\n","const { window } = require('./window');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst Element = domObjects.Element;\nconst navigator = window.navigator;\n\nconst browser = {\n // Does the browser support touch input?\n supportsTouch: !!(('ontouchstart' in window) || is.function(window.DocumentTouch)\n && domObjects.document instanceof window.DocumentTouch),\n\n // Does the browser support PointerEvents\n supportsPointerEvent: !!domObjects.PointerEvent,\n\n isIE8: ('attachEvent' in window) && !('addEventListener' in window),\n\n // Opera Mobile must be handled differently\n isOperaMobile: (navigator.appName === 'Opera'\n && browser.supportsTouch\n && navigator.userAgent.match('Presto')),\n\n // scrolling doesn't change the result of getClientRects on iOS 7\n isIOS7: (/iP(hone|od|ad)/.test(navigator.platform)\n && /OS 7[^\\d]/.test(navigator.appVersion)),\n\n isIe9OrOlder: /MSIE (8|9)/.test(navigator.userAgent),\n\n // prefix matchesSelector\n prefixedMatchesSelector: 'matches' in Element.prototype\n ? 'matches': 'webkitMatchesSelector' in Element.prototype\n ? 'webkitMatchesSelector': 'mozMatchesSelector' in Element.prototype\n ? 'mozMatchesSelector': 'oMatchesSelector' in Element.prototype\n ? 'oMatchesSelector': 'msMatchesSelector',\n\n useMatchesSelectorPolyfill: false,\n\n pEventTypes: (domObjects.PointerEvent\n ? (domObjects.PointerEvent === window.MSPointerEvent\n ? {\n up: 'MSPointerUp',\n down: 'MSPointerDown',\n over: 'mouseover',\n out: 'mouseout',\n move: 'MSPointerMove',\n cancel: 'MSPointerCancel',\n }\n : {\n up: 'pointerup',\n down: 'pointerdown',\n over: 'pointerover',\n out: 'pointerout',\n move: 'pointermove',\n cancel: 'pointercancel',\n })\n : null),\n\n // because Webkit and Opera still use 'mousewheel' event type\n wheelEvent: 'onmousewheel' in domObjects.document? 'mousewheel': 'wheel',\n\n};\n\nbrowser.useMatchesSelectorPolyfill = !is.function(Element.prototype[browser.prefixedMatchesSelector]);\n\nmodule.exports = browser;\n","const domObjects = {};\nconst win = require('./window').window;\n\nfunction blank () {}\n\ndomObjects.document = win.document;\ndomObjects.DocumentFragment = win.DocumentFragment || blank;\ndomObjects.SVGElement = win.SVGElement || blank;\ndomObjects.SVGSVGElement = win.SVGSVGElement || blank;\ndomObjects.SVGElementInstance = win.SVGElementInstance || blank;\ndomObjects.Element = win.Element || blank;\ndomObjects.HTMLElement = win.HTMLElement || domObjects.Element;\n\ndomObjects.Event = win.Event;\ndomObjects.Touch = win.Touch || blank;\ndomObjects.PointerEvent = (win.PointerEvent || win.MSPointerEvent);\n\nmodule.exports = domObjects;\n","const win = require('./window');\nconst browser = require('./browser');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst domUtils = {\n nodeContains: function (parent, child) {\n while (child) {\n if (child === parent) {\n return true;\n }\n\n child = child.parentNode;\n }\n\n return false;\n },\n\n closest: function (element, selector) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) { return element; }\n\n element = domUtils.parentNode(element);\n }\n\n return null;\n },\n\n parentNode: function (node) {\n let parent = node.parentNode;\n\n if (is.docFrag(parent)) {\n // skip past #shado-root fragments\n while ((parent = parent.host) && is.docFrag(parent)) {\n continue;\n }\n\n return parent;\n }\n\n return parent;\n },\n\n // taken from http://tanalin.com/en/blog/2012/12/matches-selector-ie8/ and modified\n matchesSelectorPolyfill: browser.useMatchesSelectorPolyfill\n ? function (element, selector, elems) {\n elems = elems || element.parentNode.querySelectorAll(selector);\n\n for (let i = 0, len = elems.length; i < len; i++) {\n if (elems[i] === element) {\n return true;\n }\n }\n\n return false;\n }\n : null,\n\n matchesSelector: function (element, selector, nodeList) {\n if (browser.useMatchesSelectorPolyfill) {\n return domUtils.matchesSelectorPolyfill(element, selector, nodeList);\n }\n\n // remove /deep/ from selectors if shadowDOM polyfill is used\n if (win.window !== win.realWindow) {\n selector = selector.replace(/\\/deep\\//g, ' ');\n }\n\n return element[browser.prefixedMatchesSelector](selector);\n },\n\n // Test for the element that's \"above\" all other qualifiers\n indexOfDeepestElement: function (elements) {\n let deepestZoneParents = [];\n let dropzoneParents = [];\n let dropzone;\n let deepestZone = elements[0];\n let index = deepestZone? 0: -1;\n let parent;\n let child;\n let i;\n let n;\n\n for (i = 1; i < elements.length; i++) {\n dropzone = elements[i];\n\n // an element might belong to multiple selector dropzones\n if (!dropzone || dropzone === deepestZone) {\n continue;\n }\n\n if (!deepestZone) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n // check if the deepest or current are document.documentElement or document.rootElement\n // - if the current dropzone is, do nothing and continue\n if (dropzone.parentNode === dropzone.ownerDocument) {\n continue;\n }\n // - if deepest is, update with the current dropzone and continue to next\n else if (deepestZone.parentNode === dropzone.ownerDocument) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n if (!deepestZoneParents.length) {\n parent = deepestZone;\n while (parent.parentNode && parent.parentNode !== parent.ownerDocument) {\n deepestZoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n }\n\n // if this element is an svg element and the current deepest is\n // an HTMLElement\n if (deepestZone instanceof domObjects.HTMLElement\n && dropzone instanceof domObjects.SVGElement\n && !(dropzone instanceof domObjects.SVGSVGElement)) {\n\n if (dropzone === deepestZone.parentNode) {\n continue;\n }\n\n parent = dropzone.ownerSVGElement;\n }\n else {\n parent = dropzone;\n }\n\n dropzoneParents = [];\n\n while (parent.parentNode !== parent.ownerDocument) {\n dropzoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n\n n = 0;\n\n // get (position of last common ancestor) + 1\n while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) {\n n++;\n }\n\n const parents = [\n dropzoneParents[n - 1],\n dropzoneParents[n],\n deepestZoneParents[n],\n ];\n\n child = parents[0].lastChild;\n\n while (child) {\n if (child === parents[1]) {\n deepestZone = dropzone;\n index = i;\n deepestZoneParents = [];\n\n break;\n }\n else if (child === parents[2]) {\n break;\n }\n\n child = child.previousSibling;\n }\n }\n\n return index;\n },\n\n matchesUpTo: function (element, selector, limit) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) {\n return true;\n }\n\n element = domUtils.parentNode(element);\n\n if (element === limit) {\n return domUtils.matchesSelector(element, selector);\n }\n }\n\n return false;\n },\n\n getActualElement: function (element) {\n return (element instanceof domObjects.SVGElementInstance\n ? element.correspondingUseElement\n : element);\n },\n\n getScrollXY: function (relevantWindow) {\n relevantWindow = relevantWindow || win.window;\n return {\n x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft,\n y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop,\n };\n },\n\n getElementClientRect: function (element) {\n const clientRect = (element instanceof domObjects.SVGElement\n ? element.getBoundingClientRect()\n : element.getClientRects()[0]);\n\n return clientRect && {\n left : clientRect.left,\n right : clientRect.right,\n top : clientRect.top,\n bottom: clientRect.bottom,\n width : clientRect.width || clientRect.right - clientRect.left,\n height: clientRect.height || clientRect.bottom - clientRect.top,\n };\n },\n\n getElementRect: function (element) {\n const clientRect = domUtils.getElementClientRect(element);\n\n if (!browser.isIOS7 && clientRect) {\n const scroll = domUtils.getScrollXY(win.getWindow(element));\n\n clientRect.left += scroll.x;\n clientRect.right += scroll.x;\n clientRect.top += scroll.y;\n clientRect.bottom += scroll.y;\n }\n\n return clientRect;\n },\n\n getPath: function (element) {\n const path = [];\n\n while (element) {\n path.push(element);\n element = domUtils.parentNode(element);\n }\n\n return path;\n },\n\n trySelector: value => {\n if (!is.string(value)) { return false; }\n\n // an exception will be raised if it is invalid\n domObjects.document.querySelector(value);\n return true;\n },\n};\n\nmodule.exports = domUtils;\n","const is = require('./is');\nconst domUtils = require('./domUtils');\nconst pExtend = require('./pointerExtend');\n\nconst { window, getWindow } = require('./window');\nconst { indexOf, contains } = require('./arr');\n\nconst useAttachEvent = ('attachEvent' in window) && !('addEventListener' in window);\nconst addEvent = useAttachEvent? 'attachEvent': 'addEventListener';\nconst removeEvent = useAttachEvent? 'detachEvent': 'removeEventListener';\nconst on = useAttachEvent? 'on': '';\n\nconst elements = [];\nconst targets = [];\nconst attachedListeners = [];\n\n// {\n// type: {\n// selectors: ['selector', ...],\n// contexts : [document, ...],\n// listeners: [[listener, capture, passive], ...]\n// }\n// }\nconst delegatedEvents = {};\n\nconst documents = [];\n\nconst supportsOptions = !useAttachEvent && (() => {\n let supported = false;\n\n window.document.createElement('div').addEventListener('test', null, {\n get capture () { supported = true; },\n });\n\n return supported;\n})();\n\nfunction add (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n let elementIndex = indexOf(elements, element);\n let target = targets[elementIndex];\n\n if (!target) {\n target = {\n events: {},\n typeCount: 0,\n };\n\n elementIndex = elements.push(element) - 1;\n targets.push(target);\n\n attachedListeners.push(useAttachEvent\n ? {\n supplied: [],\n wrapped : [],\n useCount: [],\n }\n : null);\n }\n\n if (!target.events[type]) {\n target.events[type] = [];\n target.typeCount++;\n }\n\n if (!contains(target.events[type], listener)) {\n let ret;\n\n if (useAttachEvent) {\n const { supplied, wrapped, useCount } = attachedListeners[elementIndex];\n const listenerIndex = indexOf(supplied, listener);\n\n const wrappedListener = wrapped[listenerIndex] || function (event) {\n if (!event.immediatePropagationStopped) {\n event.target = event.srcElement;\n event.currentTarget = element;\n\n event.preventDefault = event.preventDefault || preventDef;\n event.stopPropagation = event.stopPropagation || stopProp;\n event.stopImmediatePropagation = event.stopImmediatePropagation || stopImmProp;\n\n if (/mouse|click/.test(event.type)) {\n event.pageX = event.clientX + getWindow(element).document.documentElement.scrollLeft;\n event.pageY = event.clientY + getWindow(element).document.documentElement.scrollTop;\n }\n\n listener(event);\n }\n };\n\n ret = element[addEvent](on + type, wrappedListener, !!options.capture);\n\n if (listenerIndex === -1) {\n supplied.push(listener);\n wrapped.push(wrappedListener);\n useCount.push(1);\n }\n else {\n useCount[listenerIndex]++;\n }\n }\n else {\n ret = element[addEvent](type, listener, supportsOptions? options : !!options.capture);\n }\n target.events[type].push(listener);\n\n return ret;\n }\n}\n\nfunction remove (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const elementIndex = indexOf(elements, element);\n const target = targets[elementIndex];\n\n if (!target || !target.events) {\n return;\n }\n\n let wrappedListener = listener;\n let listeners;\n let listenerIndex;\n\n if (useAttachEvent) {\n listeners = attachedListeners[elementIndex];\n listenerIndex = indexOf(listeners.supplied, listener);\n wrappedListener = listeners.wrapped[listenerIndex];\n }\n\n if (type === 'all') {\n for (type in target.events) {\n if (target.events.hasOwnProperty(type)) {\n remove(element, type, 'all');\n }\n }\n return;\n }\n\n if (target.events[type]) {\n const len = target.events[type].length;\n\n if (listener === 'all') {\n for (let i = 0; i < len; i++) {\n remove(element, type, target.events[type][i], options);\n }\n return;\n }\n else {\n for (let i = 0; i < len; i++) {\n if (target.events[type][i] === listener) {\n element[removeEvent](on + type, wrappedListener, supportsOptions? options : !!options.capture);\n target.events[type].splice(i, 1);\n\n if (useAttachEvent && listeners) {\n listeners.useCount[listenerIndex]--;\n if (listeners.useCount[listenerIndex] === 0) {\n listeners.supplied.splice(listenerIndex, 1);\n listeners.wrapped.splice(listenerIndex, 1);\n listeners.useCount.splice(listenerIndex, 1);\n }\n }\n\n break;\n }\n }\n }\n\n if (target.events[type] && target.events[type].length === 0) {\n target.events[type] = null;\n target.typeCount--;\n }\n }\n\n if (!target.typeCount) {\n targets.splice(elementIndex, 1);\n elements.splice(elementIndex, 1);\n attachedListeners.splice(elementIndex, 1);\n }\n}\n\nfunction addDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n if (!delegatedEvents[type]) {\n delegatedEvents[type] = {\n selectors: [],\n contexts : [],\n listeners: [],\n };\n\n // add delegate listener functions\n for (let i = 0; i < documents.length; i++) {\n add(documents[i], type, delegateListener);\n add(documents[i], type, delegateUseCapture, true);\n }\n }\n\n const delegated = delegatedEvents[type];\n let index;\n\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n break;\n }\n }\n\n if (index === -1) {\n index = delegated.selectors.length;\n\n delegated.selectors.push(selector);\n delegated.contexts .push(context);\n delegated.listeners.push([]);\n }\n\n // keep listener and capture and passive flags\n delegated.listeners[index].push([listener, !!options.capture, options.passive]);\n}\n\nfunction removeDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const delegated = delegatedEvents[type];\n let matchFound = false;\n let index;\n\n if (!delegated) { return; }\n\n // count from last index of delegated to 0\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n // look for matching selector and context Node\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n\n const listeners = delegated.listeners[index];\n\n // each item of the listeners array is an array: [function, capture, passive]\n for (let i = listeners.length - 1; i >= 0; i--) {\n const [fn, capture, passive] = listeners[i];\n\n // check if the listener functions and capture and passive flags match\n if (fn === listener && capture === !!options.capture && passive === options.passive) {\n // remove the listener from the array of listeners\n listeners.splice(i, 1);\n\n // if all listeners for this interactable have been removed\n // remove the interactable from the delegated arrays\n if (!listeners.length) {\n delegated.selectors.splice(index, 1);\n delegated.contexts .splice(index, 1);\n delegated.listeners.splice(index, 1);\n\n // remove delegate function from context\n remove(context, type, delegateListener);\n remove(context, type, delegateUseCapture, true);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegatedEvents[type] = null;\n }\n }\n\n // only remove one listener\n matchFound = true;\n break;\n }\n }\n\n if (matchFound) { break; }\n }\n }\n}\n\n// bound to the interactable context when a DOM event\n// listener is added to a selector interactable\nfunction delegateListener (event, optionalArg) {\n const options = getOptions(optionalArg);\n const fakeEvent = {};\n const delegated = delegatedEvents[event.type];\n const eventTarget = (domUtils.getActualElement(event.path\n ? event.path[0]\n : event.target));\n let element = eventTarget;\n\n // duplicate the event so that currentTarget can be changed\n pExtend(fakeEvent, event);\n\n fakeEvent.originalEvent = event;\n fakeEvent.preventDefault = preventOriginalDefault;\n\n // climb up document tree looking for selector matches\n while (is.element(element)) {\n for (let i = 0; i < delegated.selectors.length; i++) {\n const selector = delegated.selectors[i];\n const context = delegated.contexts[i];\n\n if (domUtils.matchesSelector(element, selector)\n && domUtils.nodeContains(context, eventTarget)\n && domUtils.nodeContains(context, element)) {\n\n const listeners = delegated.listeners[i];\n\n fakeEvent.currentTarget = element;\n\n for (let j = 0; j < listeners.length; j++) {\n const [fn, capture, passive] = listeners[j];\n\n if (capture === !!options.capture && passive === options.passive) {\n fn(fakeEvent);\n }\n }\n }\n }\n\n element = domUtils.parentNode(element);\n }\n}\n\nfunction delegateUseCapture (event) {\n return delegateListener.call(this, event, true);\n}\n\nfunction preventDef () {\n this.returnValue = false;\n}\n\nfunction preventOriginalDefault () {\n this.originalEvent.preventDefault();\n}\n\nfunction stopProp () {\n this.cancelBubble = true;\n}\n\nfunction stopImmProp () {\n this.cancelBubble = true;\n this.immediatePropagationStopped = true;\n}\n\nfunction getOptions (param) {\n return is.object(param)? param : { capture: param };\n}\n\nmodule.exports = {\n add,\n remove,\n\n addDelegate,\n removeDelegate,\n\n delegateListener,\n delegateUseCapture,\n delegatedEvents,\n documents,\n\n useAttachEvent,\n supportsOptions,\n\n _elements: elements,\n _targets: targets,\n _attachedListeners: attachedListeners,\n};\n","module.exports = function extend (dest, source) {\n for (const prop in source) {\n dest[prop] = source[prop];\n }\n return dest;\n};\n","const {\n resolveRectLike,\n rectToXY,\n} = require('./rect');\n\nmodule.exports = function (target, element, action) {\n const actionOptions = target.options[action];\n const actionOrigin = actionOptions && actionOptions.origin;\n const origin = actionOrigin || target.options.origin;\n\n const originRect = resolveRectLike(origin, target, element, [target && element]);\n\n return rectToXY(originRect) || { x: 0, y: 0 };\n};\n","module.exports = (x, y) => Math.sqrt(x * x + y * y);\n","const extend = require('./extend');\nconst win = require('./window');\n\nconst utils = {\n warnOnce: function (method, message) {\n let warned = false;\n\n return function () {\n if (!warned) {\n win.window.console.warn(message);\n warned = true;\n }\n\n return method.apply(this, arguments);\n };\n },\n\n // http://stackoverflow.com/a/5634528/2280888\n _getQBezierValue: function (t, p1, p2, p3) {\n const iT = 1 - t;\n return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3;\n },\n\n getQuadraticCurvePoint: function (startX, startY, cpX, cpY, endX, endY, position) {\n return {\n x: utils._getQBezierValue(position, startX, cpX, endX),\n y: utils._getQBezierValue(position, startY, cpY, endY),\n };\n },\n\n // http://gizma.com/easing/\n easeOutQuad: function (t, b, c, d) {\n t /= d;\n return -c * t*(t-2) + b;\n },\n\n copyAction: function (dest, src) {\n dest.name = src.name;\n dest.axis = src.axis;\n dest.edges = src.edges;\n\n return dest;\n },\n\n is : require('./is'),\n extend : extend,\n hypot : require('./hypot'),\n getOriginXY: require('./getOriginXY'),\n};\n\nextend(utils, require('./arr'));\nextend(utils, require('./domUtils'));\nextend(utils, require('./pointerUtils'));\nextend(utils, require('./rect'));\n\nmodule.exports = utils;\n","const scope = require('../scope');\nconst utils = require('./index');\nconst browser = require('./browser');\n\nconst finder = {\n methodOrder: [ 'simulationResume', 'mouse', 'hasPointer', 'idle' ],\n\n search: function (pointer, eventType, eventTarget) {\n const mouseEvent = (/mouse/i.test(pointer.pointerType || eventType)\n // MSPointerEvent.MSPOINTER_TYPE_MOUSE\n || pointer.pointerType === 4);\n const pointerId = utils.getPointerId(pointer);\n const details = { pointer, pointerId, mouseEvent, eventType, eventTarget };\n\n for (const method of finder.methodOrder) {\n const interaction = finder[method](details);\n\n if (interaction) {\n return interaction;\n }\n }\n },\n\n // try to resume simulation with a new pointer\n simulationResume: function ({ mouseEvent, eventType, eventTarget }) {\n if (!/down|start/i.test(eventType)) {\n return null;\n }\n\n for (const interaction of scope.interactions) {\n let element = eventTarget;\n\n if (interaction.simulation && interaction.simulation.allowResume\n && (interaction.mouse === mouseEvent)) {\n while (element) {\n // if the element is the interaction element\n if (element === interaction.element) {\n return interaction;\n }\n element = utils.parentNode(element);\n }\n }\n }\n\n return null;\n },\n\n // if it's a mouse interaction\n mouse: function ({ pointerId, mouseEvent, eventType }) {\n if (!mouseEvent && (browser.supportsTouch || browser.supportsPointerEvent)) {\n return null;\n }\n\n let firstNonActive;\n\n for (const interaction of scope.interactions) {\n if (interaction.mouse) {\n // if it's a down event, skip interactions with running simulations\n if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; }\n\n // if the interaction is active, return it immediately\n if (interaction.interacting()) {\n return interaction;\n }\n // otherwise save it and look for another active interaction\n else if (!firstNonActive) {\n firstNonActive = interaction;\n }\n }\n }\n\n // if no active mouse interaction was found use the first inactive mouse\n // interaction\n if (firstNonActive) {\n return firstNonActive;\n }\n\n // Find any interaction specifically for mouse.\n // ignore the interaction if the eventType is a mousedown, and a simulation\n // is active\n for (const interaction of scope.interactions) {\n if (interaction.mouse && !(/down/.test(eventType) && interaction.simulation)) {\n return interaction;\n }\n }\n\n return null;\n },\n\n // get interaction that has this pointer\n hasPointer: function ({ pointerId }) {\n for (const interaction of scope.interactions) {\n if (utils.contains(interaction.pointerIds, pointerId)) {\n return interaction;\n }\n }\n },\n\n // get first idle interaction\n idle: function ({ mouseEvent }) {\n for (const interaction of scope.interactions) {\n // if there's already a pointer held down\n if (interaction.pointerIds.length === 1) {\n const target = interaction.target;\n // don't add this pointer if there is a target interactable and it\n // isn't gesturable\n if (target && !target.options.gesture.enabled) {\n continue;\n }\n }\n // maximum of 2 pointers per interaction\n else if (interaction.pointerIds.length >= 2) {\n continue;\n }\n\n if (!interaction.interacting() && (mouseEvent === interaction.mouse)) {\n return interaction;\n }\n }\n\n return null;\n },\n};\n\nmodule.exports = finder;\n","const win = require('./window');\nconst isWindow = require('./isWindow');\n\nconst is = {\n array : () => {},\n\n window : thing => thing === win.window || isWindow(thing),\n\n docFrag : thing => is.object(thing) && thing.nodeType === 11,\n\n object : thing => !!thing && (typeof thing === 'object'),\n\n function: thing => typeof thing === 'function',\n\n number : thing => typeof thing === 'number' ,\n\n bool : thing => typeof thing === 'boolean' ,\n\n string : thing => typeof thing === 'string' ,\n\n element: thing => {\n if (!thing || (typeof thing !== 'object')) { return false; }\n\n const _window = win.getWindow(thing) || win.window;\n\n return (/object|function/.test(typeof _window.Element)\n ? thing instanceof _window.Element //DOM2\n : thing.nodeType === 1 && typeof thing.nodeName === 'string');\n },\n};\n\nis.array = thing => (is.object(thing)\n && (typeof thing.length !== 'undefined')\n && is.function(thing.splice));\n\nmodule.exports = is;\n","module.exports = (thing) => !!(thing && thing.Window) && (thing instanceof thing.Window);\n","function pointerExtend (dest, source) {\n for (const prop in source) {\n const prefixedPropREs = module.exports.prefixedPropREs;\n let deprecated = false;\n\n // skip deprecated prefixed properties\n for (const vendor in prefixedPropREs) {\n if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) {\n deprecated = true;\n break;\n }\n }\n\n if (!deprecated && typeof source[prop] !== 'function') {\n dest[prop] = source[prop];\n }\n }\n return dest;\n}\n\npointerExtend.prefixedPropREs = {\n webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/,\n};\n\nmodule.exports = pointerExtend;\n","const hypot = require('./hypot');\nconst browser = require('./browser');\nconst dom = require('./domObjects');\nconst domUtils = require('./domUtils');\nconst is = require('./is');\nconst pointerExtend = require('./pointerExtend');\n\nconst pointerUtils = {\n copyCoords: function (dest, src) {\n dest.page = dest.page || {};\n dest.page.x = src.page.x;\n dest.page.y = src.page.y;\n\n dest.client = dest.client || {};\n dest.client.x = src.client.x;\n dest.client.y = src.client.y;\n\n dest.timeStamp = src.timeStamp;\n },\n\n setCoordDeltas: function (targetObj, prev, cur) {\n targetObj.page.x = cur.page.x - prev.page.x;\n targetObj.page.y = cur.page.y - prev.page.y;\n targetObj.client.x = cur.client.x - prev.client.x;\n targetObj.client.y = cur.client.y - prev.client.y;\n targetObj.timeStamp = cur.timeStamp - prev.timeStamp;\n\n // set pointer velocity\n const dt = Math.max(targetObj.timeStamp / 1000, 0.001);\n\n targetObj.page.speed = hypot(targetObj.page.x, targetObj.page.y) / dt;\n targetObj.page.vx = targetObj.page.x / dt;\n targetObj.page.vy = targetObj.page.y / dt;\n\n targetObj.client.speed = hypot(targetObj.client.x, targetObj.page.y) / dt;\n targetObj.client.vx = targetObj.client.x / dt;\n targetObj.client.vy = targetObj.client.y / dt;\n },\n\n isNativePointer: function (pointer) {\n return (pointer instanceof dom.Event || pointer instanceof dom.Touch);\n },\n\n // Get specified X/Y coords for mouse or event.touches[0]\n getXY: function (type, pointer, xy) {\n xy = xy || {};\n type = type || 'page';\n\n xy.x = pointer[type + 'X'];\n xy.y = pointer[type + 'Y'];\n\n return xy;\n },\n\n getPageXY: function (pointer, page) {\n page = page || {};\n\n // Opera Mobile handles the viewport and scrolling oddly\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n pointerUtils.getXY('screen', pointer, page);\n\n page.x += window.scrollX;\n page.y += window.scrollY;\n }\n else {\n pointerUtils.getXY('page', pointer, page);\n }\n\n return page;\n },\n\n getClientXY: function (pointer, client) {\n client = client || {};\n\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n // Opera Mobile handles the viewport and scrolling oddly\n pointerUtils.getXY('screen', pointer, client);\n }\n else {\n pointerUtils.getXY('client', pointer, client);\n }\n\n return client;\n },\n\n getPointerId: function (pointer) {\n return is.number(pointer.pointerId)? pointer.pointerId : pointer.identifier;\n },\n\n setCoords: function (targetObj, pointers, timeStamp) {\n const pointer = (pointers.length > 1\n ? pointerUtils.pointerAverage(pointers)\n : pointers[0]);\n\n const tmpXY = {};\n\n pointerUtils.getPageXY(pointer, tmpXY);\n targetObj.page.x = tmpXY.x;\n targetObj.page.y = tmpXY.y;\n\n pointerUtils.getClientXY(pointer, tmpXY);\n targetObj.client.x = tmpXY.x;\n targetObj.client.y = tmpXY.y;\n\n targetObj.timeStamp = is.number(timeStamp) ? timeStamp :new Date().getTime();\n },\n\n pointerExtend: pointerExtend,\n\n getTouchPair: function (event) {\n const touches = [];\n\n // array of touches is supplied\n if (is.array(event)) {\n touches[0] = event[0];\n touches[1] = event[1];\n }\n // an event\n else {\n if (event.type === 'touchend') {\n if (event.touches.length === 1) {\n touches[0] = event.touches[0];\n touches[1] = event.changedTouches[0];\n }\n else if (event.touches.length === 0) {\n touches[0] = event.changedTouches[0];\n touches[1] = event.changedTouches[1];\n }\n }\n else {\n touches[0] = event.touches[0];\n touches[1] = event.touches[1];\n }\n }\n\n return touches;\n },\n\n pointerAverage: function (pointers) {\n const average = {\n pageX : 0,\n pageY : 0,\n clientX: 0,\n clientY: 0,\n screenX: 0,\n screenY: 0,\n };\n\n for (const pointer of pointers) {\n for (const prop in average) {\n average[prop] += pointer[prop];\n }\n }\n for (const prop in average) {\n average[prop] /= pointers.length;\n }\n\n return average;\n },\n\n touchBBox: function (event) {\n if (!event.length && !(event.touches && event.touches.length > 1)) {\n return;\n }\n\n const touches = pointerUtils.getTouchPair(event);\n const minX = Math.min(touches[0].pageX, touches[1].pageX);\n const minY = Math.min(touches[0].pageY, touches[1].pageY);\n const maxX = Math.max(touches[0].pageX, touches[1].pageX);\n const maxY = Math.max(touches[0].pageY, touches[1].pageY);\n\n return {\n x: minX,\n y: minY,\n left: minX,\n top: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n },\n\n touchDistance: function (event, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n\n\n const dx = touches[0][sourceX] - touches[1][sourceX];\n const dy = touches[0][sourceY] - touches[1][sourceY];\n\n return hypot(dx, dy);\n },\n\n touchAngle: function (event, prevAngle, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n const dx = touches[1][sourceX] - touches[0][sourceX];\n const dy = touches[1][sourceY] - touches[0][sourceY];\n const angle = 180 * Math.atan2(dy , dx) / Math.PI;\n\n return angle;\n },\n\n getPointerType: function (pointer, interaction) {\n // if the PointerEvent API isn't available, then the pointer must be ither\n // a MouseEvent or TouchEvent\n if (interaction.mouse) { return 'mouse'; }\n if (!browser.supportsPointerEvent) { return 'touch'; }\n\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : [undefined, undefined,'touch', 'pen', 'mouse'][pointer.pointerType];\n },\n\n // [ event.target, event.currentTarget ]\n getEventTargets: function (event) {\n return [\n domUtils.getActualElement(event.path ? event.path[0] : event.target),\n domUtils.getActualElement(event.currentTarget),\n ];\n },\n};\n\nmodule.exports = pointerUtils;\n","const { window } = require('./window');\n\nconst vendors = ['ms', 'moz', 'webkit', 'o'];\nlet lastTime = 0;\nlet request;\nlet cancel;\n\nfor (let x = 0; x < vendors.length && !window.requestAnimationFrame; x++) {\n request = window[vendors[x] + 'RequestAnimationFrame'];\n cancel = window[vendors[x] +'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n}\n\nif (!request) {\n request = function (callback) {\n const currTime = new Date().getTime();\n const timeToCall = Math.max(0, 16 - (currTime - lastTime));\n const id = setTimeout(function () { callback(currTime + timeToCall); },\n timeToCall);\n\n lastTime = currTime + timeToCall;\n return id;\n };\n}\n\nif (!cancel) {\n cancel = function (id) {\n clearTimeout(id);\n };\n}\n\nmodule.exports = {\n request,\n cancel,\n};\n","const extend = require('./extend');\nconst is = require('./is');\nconst {\n closest,\n parentNode,\n getElementRect,\n} = require('./domUtils');\n\nconst rectUtils = {\n getStringOptionResult: function (value, interactable, element) {\n if (!is.string(value)) {\n return null;\n }\n\n if (value === 'parent') {\n value = parentNode(element);\n }\n else if (value === 'self') {\n value = interactable.getRect(element);\n }\n else {\n value = closest(element, value);\n }\n\n return value;\n },\n\n resolveRectLike: function (value, interactable, element, functionArgs) {\n value = rectUtils.getStringOptionResult(value, interactable, element) || value;\n\n if (is.function(value)) {\n value = value.apply(null, functionArgs);\n }\n\n if (is.element(value)) {\n value = getElementRect(value);\n }\n\n return value;\n },\n\n rectToXY: function (rect) {\n return rect && {\n x: 'x' in rect ? rect.x : rect.left,\n y: 'y' in rect ? rect.y : rect.top,\n };\n },\n\n xywhToTlbr: function (rect) {\n if (rect && !('left' in rect && 'top' in rect)) {\n rect = extend({}, rect);\n\n rect.left = rect.x || 0;\n rect.top = rect.y || 0;\n rect.right = rect.right || (rect.left + rect.width);\n rect.bottom = rect.bottom || (rect.top + rect.height);\n }\n\n return rect;\n },\n\n tlbrToXywh: function (rect) {\n if (rect && !('x' in rect && 'y' in rect)) {\n rect = extend({}, rect);\n\n rect.x = rect.left || 0;\n rect.top = rect.top || 0;\n rect.width = rect.width || (rect.right - rect.x);\n rect.height = rect.height || (rect.bottom - rect.y);\n }\n\n return rect;\n },\n};\n\nmodule.exports = rectUtils;\n","const win = module.exports;\nconst isWindow = require('./isWindow');\n\nfunction init (window) {\n // get wrapped window if using Shadow DOM polyfill\n\n win.realWindow = window;\n\n // create a TextNode\n const el = window.document.createTextNode('');\n\n // check if it's wrapped by a polyfill\n if (el.ownerDocument !== window.document\n && typeof window.wrap === 'function'\n && window.wrap(el) === el) {\n // use wrapped window\n window = window.wrap(window);\n }\n\n win.window = window;\n}\n\nif (typeof window === 'undefined') {\n win.window = undefined;\n win.realWindow = undefined;\n}\nelse {\n init(window);\n}\n\nwin.getWindow = function getWindow (node) {\n if (isWindow(node)) {\n return node;\n }\n\n const rootNode = (node.ownerDocument || node);\n\n return rootNode.defaultView || rootNode.parentWindow || win.window;\n};\n\nwin.init = init;\n"]} \ No newline at end of file +{"version":3,"sources":["src/minHeader.js","src/header.js","index.js","src/Eventable.js","src/InteractEvent.js","src/Interactable.js","src/Interaction.js","src/actions/base.js","src/actions/drag.js","src/actions/drop.js","src/actions/gesture.js","src/actions/resize.js","src/autoScroll.js","src/autoStart/InteractableMethods.js","src/autoStart/base.js","src/autoStart/delay.js","src/autoStart/drag.js","src/autoStart/gesture.js","src/autoStart/resize.js","src/defaultOptions.js","src/index.js","src/inertia.js","src/interact.js","src/interactablePreventDefault.js","src/legacyBrowsers.js","src/modifiers/index.js","src/modifiers/restrict.js","src/modifiers/restrictEdges.js","src/modifiers/restrictSize.js","src/modifiers/snap.js","src/modifiers/snapSize.js","src/pointerEvents/PointerEvent.js","src/pointerEvents/base.js","src/pointerEvents/holdRepeat.js","src/pointerEvents/interactableTargets.js","src/scope.js","src/utils/Signals.js","src/utils/arr.js","src/utils/browser.js","src/utils/domObjects.js","src/utils/domUtils.js","src/utils/events.js","src/utils/extend.js","src/utils/getOriginXY.js","src/utils/hypot.js","src/utils/index.js","src/utils/interactionFinder.js","src/utils/is.js","src/utils/isWindow.js","src/utils/pointerExtend.js","src/utils/pointerUtils.js","src/utils/raf.js","src/utils/rect.js","src/utils/window.js"],"names":[],"mappings":"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","file":"interact.min.js","sourceRoot":"","sourcesContent":["/* interact.js v1.3.0-alpha.4+sha.7970416-dirty | https://raw.github.com/taye/interact.js/master/LICENSE */\n","/**\n * interact.js v1.3.0-alpha.4+sha.7970416-dirty\n *\n * Copyright (c) 2012-2017 Taye Adeyemi \n * Open source under the MIT License.\n * https://raw.github.com/taye/interact.js/master/LICENSE\n */\n","/*\n * In a (windowless) server environment this file exports a factory function\n * that takes the window to use.\n *\n * var interact = require('interact.js')(windowObject);\n *\n * See https://github.com/taye/interact.js/issues/187\n */\nif (typeof window === 'undefined') {\n module.exports = function (window) {\n require('./src/utils/window').init(window);\n\n return require('./src/index');\n };\n}\nelse {\n module.exports = require('./src/index');\n}\n","const { indexOf } = require('./utils/arr');\nconst extend = require('./utils/extend.js');\n\nfunction fireUntilImmediateStopped (event, listeners) {\n for (let i = 0, len = listeners.length; i < len && !event.immediatePropagationStopped; i++) {\n listeners[i](event);\n }\n}\n\nclass Eventable {\n\n constructor (options) {\n this.options = extend({}, options || {});\n }\n\n fire (event) {\n let listeners;\n const onEvent = 'on' + event.type;\n const global = this.global;\n\n // Interactable#on() listeners\n if ((listeners = this[event.type])) {\n fireUntilImmediateStopped(event, listeners);\n }\n\n // interactable.onevent listener\n if (this[onEvent]) {\n this[onEvent](event);\n }\n\n // interact.on() listeners\n if (!event.propagationStopped && global && (listeners = global[event.type])) {\n fireUntilImmediateStopped(event, listeners);\n }\n }\n\n on (eventType, listener) {\n // if this type of event was never bound\n if (this[eventType]) {\n this[eventType].push(listener);\n }\n else {\n this[eventType] = [listener];\n }\n }\n\n off (eventType, listener) {\n // if it is an action event type\n const eventList = this[eventType];\n const index = eventList? indexOf(eventList, listener) : -1;\n\n if (index !== -1) {\n eventList.splice(index, 1);\n }\n\n if (eventList && eventList.length === 0 || !listener) {\n this[eventType] = listener;\n }\n }\n}\n\nmodule.exports = Eventable;\n","const extend = require('./utils/extend');\nconst getOriginXY = require('./utils/getOriginXY');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nclass InteractEvent {\n constructor (interaction, event, action, phase, element, related, preEnd = false) {\n const target = interaction.target;\n const deltaSource = (target && target.options || defaults).deltaSource;\n const origin = getOriginXY(target, element, action);\n const starting = phase === 'start';\n const ending = phase === 'end';\n const coords = starting? interaction.startCoords : interaction.curCoords;\n const prevEvent = interaction.prevEvent;\n\n element = element || interaction.element;\n\n const page = extend({}, coords.page);\n const client = extend({}, coords.client);\n\n page.x -= origin.x;\n page.y -= origin.y;\n\n client.x -= origin.x;\n client.y -= origin.y;\n\n this.ctrlKey = event.ctrlKey;\n this.altKey = event.altKey;\n this.shiftKey = event.shiftKey;\n this.metaKey = event.metaKey;\n this.button = event.button;\n this.buttons = event.buttons;\n this.target = element;\n this.currentTarget = element;\n this.relatedTarget = related || null;\n this.preEnd = preEnd;\n this.type = action + (phase || '');\n this.interaction = interaction;\n this.interactable = target;\n\n this.t0 = starting ? interaction.downTimes[interaction.downTimes.length - 1]\n : prevEvent.t0;\n\n const signalArg = {\n interaction,\n event,\n action,\n phase,\n element,\n related,\n page,\n client,\n coords,\n starting,\n ending,\n deltaSource,\n iEvent: this,\n };\n\n signals.fire('set-xy', signalArg);\n\n if (ending) {\n // use previous coords when ending\n this.pageX = prevEvent.pageX;\n this.pageY = prevEvent.pageY;\n this.clientX = prevEvent.clientX;\n this.clientY = prevEvent.clientY;\n }\n else {\n this.pageX = page.x;\n this.pageY = page.y;\n this.clientX = client.x;\n this.clientY = client.y;\n }\n\n this.x0 = interaction.startCoords.page.x - origin.x;\n this.y0 = interaction.startCoords.page.y - origin.y;\n this.clientX0 = interaction.startCoords.client.x - origin.x;\n this.clientY0 = interaction.startCoords.client.y - origin.y;\n\n signals.fire('set-delta', signalArg);\n\n this.timeStamp = coords.timeStamp;\n this.dt = interaction.pointerDelta.timeStamp;\n this.duration = this.timeStamp - this.t0;\n\n // speed and velocity in pixels per second\n this.speed = interaction.pointerDelta[deltaSource].speed;\n this.velocityX = interaction.pointerDelta[deltaSource].vx;\n this.velocityY = interaction.pointerDelta[deltaSource].vy;\n\n this.swipe = (ending || phase === 'inertiastart')? this.getSwipe() : null;\n\n signals.fire('new', signalArg);\n }\n\n getSwipe () {\n const interaction = this.interaction;\n\n if (interaction.prevEvent.speed < 600\n || this.timeStamp - interaction.prevEvent.timeStamp > 150) {\n return null;\n }\n\n let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI;\n const overlap = 22.5;\n\n if (angle < 0) {\n angle += 360;\n }\n\n const left = 135 - overlap <= angle && angle < 225 + overlap;\n const up = 225 - overlap <= angle && angle < 315 + overlap;\n\n const right = !left && (315 - overlap <= angle || angle < 45 + overlap);\n const down = !up && 45 - overlap <= angle && angle < 135 + overlap;\n\n return {\n up,\n down,\n left,\n right,\n angle,\n speed: interaction.prevEvent.speed,\n velocity: {\n x: interaction.prevEvent.velocityX,\n y: interaction.prevEvent.velocityY,\n },\n };\n }\n\n preventDefault () {}\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n}\n\nsignals.on('set-delta', function ({ iEvent, interaction, starting, deltaSource }) {\n const prevEvent = starting? iEvent : interaction.prevEvent;\n\n if (deltaSource === 'client') {\n iEvent.dx = iEvent.clientX - prevEvent.clientX;\n iEvent.dy = iEvent.clientY - prevEvent.clientY;\n }\n else {\n iEvent.dx = iEvent.pageX - prevEvent.pageX;\n iEvent.dy = iEvent.pageY - prevEvent.pageY;\n }\n});\n\nInteractEvent.signals = signals;\n\nmodule.exports = InteractEvent;\n","const is = require('./utils/is');\nconst events = require('./utils/events');\nconst extend = require('./utils/extend');\nconst actions = require('./actions/base');\nconst scope = require('./scope');\nconst Eventable = require('./Eventable');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nconst {\n getElementRect,\n nodeContains,\n trySelector,\n} = require('./utils/domUtils');\nconst { getWindow } = require('./utils/window');\nconst { indexOf, contains } = require('./utils/arr');\nconst { wheelEvent } = require('./utils/browser');\n\n// all set interactables\nscope.interactables = [];\n\n/*\\\n * Interactable\n [ property ]\n **\n * Object type returned by @interact\n\\*/\nclass Interactable {\n constructor (target, options) {\n options = options || {};\n\n this.target = target;\n this.events = new Eventable();\n this._context = options.context || scope.document;\n this._win = getWindow(trySelector(target)? this._context : target);\n this._doc = this._win.document;\n\n signals.fire('new', {\n target,\n options,\n interactable: this,\n win: this._win,\n });\n\n scope.addDocument( this._doc, this._win );\n\n scope.interactables.push(this);\n\n this.set(options);\n }\n\n setOnEvents (action, phases) {\n const onAction = 'on' + action;\n\n if (is.function(phases.onstart) ) { this.events[onAction + 'start' ] = phases.onstart ; }\n if (is.function(phases.onmove) ) { this.events[onAction + 'move' ] = phases.onmove ; }\n if (is.function(phases.onend) ) { this.events[onAction + 'end' ] = phases.onend ; }\n if (is.function(phases.oninertiastart)) { this.events[onAction + 'inertiastart' ] = phases.oninertiastart ; }\n\n return this;\n }\n\n setPerAction (action, options) {\n // for all the default per-action options\n for (const option in options) {\n // if this option exists for this action\n if (option in defaults[action]) {\n // if the option in the options arg is an object value\n if (is.object(options[option])) {\n // duplicate the object\n this.options[action][option] = extend(this.options[action][option] || {}, options[option]);\n\n if (is.object(defaults.perAction[option]) && 'enabled' in defaults.perAction[option]) {\n this.options[action][option].enabled = options[option].enabled === false? false : true;\n }\n }\n else if (is.bool(options[option]) && is.object(defaults.perAction[option])) {\n this.options[action][option].enabled = options[option];\n }\n else if (options[option] !== undefined) {\n // or if it's not undefined, do a plain assignment\n this.options[action][option] = options[option];\n }\n }\n }\n }\n\n /*\\\n * Interactable.getRect\n [ method ]\n *\n * The default function to get an Interactables bounding rect. Can be\n * overridden using @Interactable.rectChecker.\n *\n - element (Element) #optional The element to measure.\n = (object) The object's bounding rectangle.\n o {\n o top : 0,\n o left : 0,\n o bottom: 0,\n o right : 0,\n o width : 0,\n o height: 0\n o }\n \\*/\n getRect (element) {\n element = element || this.target;\n\n if (is.string(this.target) && !(is.element(element))) {\n element = this._context.querySelector(this.target);\n }\n\n return getElementRect(element);\n }\n\n /*\\\n * Interactable.rectChecker\n [ method ]\n *\n * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n - checker (function) #optional A function which returns this Interactable's bounding rectangle. See @Interactable.getRect\n = (function | object) The checker function or this Interactable\n \\*/\n rectChecker (checker) {\n if (is.function(checker)) {\n this.getRect = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.getRect;\n\n return this;\n }\n\n return this.getRect;\n }\n\n _backCompatOption (optionName, newValue) {\n if (trySelector(newValue) || is.object(newValue)) {\n this.options[optionName] = newValue;\n\n for (const action of actions.names) {\n this.options[action][optionName] = newValue;\n }\n\n return this;\n }\n\n return this.options[optionName];\n }\n\n /*\\\n * Interactable.origin\n [ method ]\n *\n * Gets or sets the origin of the Interactable's element. The x and y\n * of the origin will be subtracted from action event coordinates.\n *\n - origin (object | string) #optional An object eg. { x: 0, y: 0 } or string 'parent', 'self' or any CSS selector\n * OR\n - origin (Element) #optional An HTML or SVG Element whose rect will be used\n **\n = (object) The current origin or this Interactable\n \\*/\n origin (newValue) {\n return this._backCompatOption('origin', newValue);\n }\n\n /*\\\n * Interactable.deltaSource\n [ method ]\n *\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n - newValue (string) #optional Use 'client' if you will be scrolling while interacting; Use 'page' if you want autoScroll to work\n = (string | object) The current deltaSource or this Interactable\n \\*/\n deltaSource (newValue) {\n if (newValue === 'page' || newValue === 'client') {\n this.options.deltaSource = newValue;\n\n return this;\n }\n\n return this.options.deltaSource;\n }\n\n /*\\\n * Interactable.context\n [ method ]\n *\n * Gets the selector context Node of the Interactable. The default is `window.document`.\n *\n = (Node) The context Node of this Interactable\n **\n \\*/\n context () {\n return this._context;\n }\n\n inContext (element) {\n return (this._context === element.ownerDocument\n || nodeContains(this._context, element));\n }\n\n /*\\\n * Interactable.fire\n [ method ]\n *\n * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n - iEvent (InteractEvent) The InteractEvent object to be fired on this Interactable\n = (Interactable) this Interactable\n \\*/\n fire (iEvent) {\n this.events.fire(iEvent);\n\n return this;\n }\n\n _onOffMultiple (method, eventType, listener, options) {\n if (is.string(eventType) && eventType.search(' ') !== -1) {\n eventType = eventType.trim().split(/ +/);\n }\n\n if (is.array(eventType)) {\n for (let i = 0; i < eventType.length; i++) {\n this[method](eventType[i], listener, options);\n }\n\n return true;\n }\n\n if (is.object(eventType)) {\n for (const prop in eventType) {\n this[method](prop, eventType[prop], listener);\n }\n\n return true;\n }\n }\n\n /*\\\n * Interactable.on\n [ method ]\n *\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n - eventType (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) This Interactable\n \\*/\n on (eventType, listener, options) {\n if (this._onOffMultiple('on', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.on(eventType, listener);\n }\n // delegated event for selector\n else if (is.string(this.target)) {\n events.addDelegate(this.target, this._context, eventType, listener, options);\n }\n else {\n events.add(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.off\n [ method ]\n *\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n - eventType (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) This Interactable\n \\*/\n off (eventType, listener, options) {\n if (this._onOffMultiple('off', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n // if it is an action event type\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.off(eventType, listener);\n }\n // delegated event\n else if (is.string(this.target)) {\n events.removeDelegate(this.target, this._context, eventType, listener, options);\n }\n // remove listener from this Interatable's element\n else {\n events.remove(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.set\n [ method ]\n *\n * Reset the options of this Interactable\n - options (object) The new settings to apply\n = (object) This Interactable\n \\*/\n set (options) {\n if (!is.object(options)) {\n options = {};\n }\n\n this.options = extend({}, defaults.base);\n\n const perActions = extend({}, defaults.perAction);\n\n for (const actionName in actions.methodDict) {\n const methodName = actions.methodDict[actionName];\n\n this.options[actionName] = extend({}, defaults[actionName]);\n\n this.setPerAction(actionName, perActions);\n\n this[methodName](options[actionName]);\n }\n\n for (const setting of Interactable.settingsMethods) {\n this.options[setting] = defaults.base[setting];\n\n if (setting in options) {\n this[setting](options[setting]);\n }\n }\n\n signals.fire('set', {\n options,\n interactable: this,\n });\n\n return this;\n }\n\n /*\\\n * Interactable.unset\n [ method ]\n *\n * Remove this interactable from the list of interactables and remove\n * it's action capabilities and event listeners\n *\n = (object) @interact\n \\*/\n unset () {\n events.remove(this.target, 'all');\n\n if (is.string(this.target)) {\n // remove delegated events\n for (const type in events.delegatedEvents) {\n const delegated = events.delegatedEvents[type];\n\n if (delegated.selectors[0] === this.target\n && delegated.contexts[0] === this._context) {\n\n delegated.selectors.splice(0, 1);\n delegated.contexts .splice(0, 1);\n delegated.listeners.splice(0, 1);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegated[type] = null;\n }\n }\n\n events.remove(this._context, type, events.delegateListener);\n events.remove(this._context, type, events.delegateUseCapture, true);\n }\n }\n else {\n events.remove(this, 'all');\n }\n\n signals.fire('unset', { interactable: this });\n\n scope.interactables.splice(indexOf(scope.interactables, this), 1);\n\n // Stop related interactions when an Interactable is unset\n for (const interaction of scope.interactions || []) {\n if (interaction.target === this && interaction.interacting()) {\n interaction.stop();\n }\n }\n\n return scope.interact;\n }\n}\n\nscope.interactables.indexOfElement = function indexOfElement (target, context) {\n context = context || scope.document;\n\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n if (interactable.target === target && interactable._context === context) {\n return i;\n }\n }\n return -1;\n};\n\nscope.interactables.get = function interactableGet (element, options, dontCheckInContext) {\n const ret = this[this.indexOfElement(element, options && options.context)];\n\n return ret && (is.string(element) || dontCheckInContext || ret.inContext(element))? ret : null;\n};\n\nscope.interactables.forEachSelector = function (callback, element) {\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n // skip non CSS selector targets and out of context elements\n if (!is.string(interactable.target)\n || (element && !interactable.inContext(element))) {\n continue;\n }\n\n const ret = callback(interactable, interactable.target, interactable._context, i, this);\n\n if (ret !== undefined) {\n return ret;\n }\n }\n};\n\n// all interact.js eventTypes\nInteractable.eventTypes = scope.eventTypes = [];\n\nInteractable.signals = signals;\n\nInteractable.settingsMethods = [ 'deltaSource', 'origin', 'preventDefault', 'rectChecker' ];\n\nmodule.exports = Interactable;\n","const scope = require('./scope');\nconst utils = require('./utils');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst domObjects = require('./utils/domObjects');\nconst finder = require('./utils/interactionFinder');\nconst signals = require('./utils/Signals').new();\n\nconst listeners = {};\nconst methodNames = [\n 'pointerDown', 'pointerMove', 'pointerUp',\n 'updatePointer', 'removePointer',\n];\n\n// for ignoring browser's simulated mouse events\nlet prevTouchTime = 0;\n\n// all active and idle interactions\nscope.interactions = [];\n\nclass Interaction {\n constructor ({ pointerType }) {\n this.target = null; // current interactable being interacted with\n this.element = null; // the target element of the interactable\n\n this.prepared = { // action that's ready to be fired on next move event\n name : null,\n axis : null,\n edges: null,\n };\n\n // keep track of added pointers\n this.pointers = [];\n this.pointerIds = [];\n this.downTargets = [];\n this.downTimes = [];\n\n // Previous native pointer move event coordinates\n this.prevCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n // current native pointer move event coordinates\n this.curCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Starting InteractEvent pointer coordinates\n this.startCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Change in coordinates and time of the pointer\n this.pointerDelta = {\n page : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n client : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n timeStamp: 0,\n };\n\n this.downEvent = null; // pointerdown/mousedown/touchstart event\n this.downPointer = {};\n\n this._eventTarget = null;\n this._curEventTarget = null;\n\n this.prevEvent = null; // previous action event\n\n this.pointerIsDown = false;\n this.pointerWasMoved = false;\n this._interacting = false;\n\n this.pointerType = pointerType;\n\n signals.fire('new', this);\n\n scope.interactions.push(this);\n }\n\n pointerDown (pointer, event, eventTarget) {\n const pointerIndex = this.updatePointer(pointer, event, true);\n\n signals.fire('down', {\n pointer,\n event,\n eventTarget,\n pointerIndex,\n interaction: this,\n });\n }\n\n /*\\\n * Interaction.start\n [ method ]\n *\n * Start an action with the given Interactable and Element as tartgets. The\n * action must be enabled for the target Interactable and an appropriate number\n * of pointers must be held down - 1 for drag/resize, 2 for gesture.\n *\n * Use it with `interactable.able({ manualStart: false })` to always\n * [start actions manually](https://github.com/taye/interact.js/issues/114)\n *\n - action (object) The action to be performed - drag, resize, etc.\n - target (Interactable) The Interactable to target\n - element (Element) The DOM Element to target\n = (object) interact\n **\n | interact(target)\n | .draggable({\n | // disable the default drag start by down->move\n | manualStart: true\n | })\n | // start dragging after the user holds the pointer down\n | .on('hold', function (event) {\n | var interaction = event.interaction;\n |\n | if (!interaction.interacting()) {\n | interaction.start({ name: 'drag' },\n | event.interactable,\n | event.currentTarget);\n | }\n | });\n \\*/\n start (action, target, element) {\n if (this.interacting()\n || !this.pointerIsDown\n || this.pointerIds.length < (action.name === 'gesture'? 2 : 1)) {\n return;\n }\n\n // if this interaction had been removed after stopping\n // add it back\n if (utils.indexOf(scope.interactions, this) === -1) {\n scope.interactions.push(this);\n }\n\n utils.copyAction(this.prepared, action);\n this.target = target;\n this.element = element;\n\n signals.fire('action-start', {\n interaction: this,\n event: this.downEvent,\n });\n }\n\n pointerMove (pointer, event, eventTarget) {\n if (!this.simulation) {\n this.updatePointer(pointer);\n utils.setCoords(this.curCoords, this.pointers);\n }\n\n const duplicateMove = (this.curCoords.page.x === this.prevCoords.page.x\n && this.curCoords.page.y === this.prevCoords.page.y\n && this.curCoords.client.x === this.prevCoords.client.x\n && this.curCoords.client.y === this.prevCoords.client.y);\n\n let dx;\n let dy;\n\n // register movement greater than pointerMoveTolerance\n if (this.pointerIsDown && !this.pointerWasMoved) {\n dx = this.curCoords.client.x - this.startCoords.client.x;\n dy = this.curCoords.client.y - this.startCoords.client.y;\n\n this.pointerWasMoved = utils.hypot(dx, dy) > Interaction.pointerMoveTolerance;\n }\n\n const signalArg = {\n pointer,\n pointerIndex: this.getPointerIndex(pointer),\n event,\n eventTarget,\n dx,\n dy,\n duplicate: duplicateMove,\n interaction: this,\n interactingBeforeMove: this.interacting(),\n };\n\n if (!duplicateMove) {\n // set pointer coordinate, time changes and speeds\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n }\n\n signals.fire('move', signalArg);\n\n if (!duplicateMove) {\n // if interacting, fire an 'action-move' signal etc\n if (this.interacting()) {\n this.doMove(signalArg);\n }\n\n if (this.pointerWasMoved) {\n utils.copyCoords(this.prevCoords, this.curCoords);\n }\n }\n }\n\n /*\\\n * Interaction.doMove\n [ method ]\n *\n * Force a move of the current action at the same coordinates. Useful if\n * snap/restrict has been changed and you want a movement with the new\n * settings.\n *\n **\n | interact(target)\n | .draggable(true)\n | .on('dragmove', function (event) {\n | if (someCondition) {\n | // change the snap settings\n | event.interactable.draggable({ snap: { targets: [] }});\n | // fire another move event with re-calculated snap\n | event.interaction.doMove();\n | }\n | });\n \\*/\n doMove (signalArg) {\n signalArg = utils.extend({\n pointer: this.pointers[0],\n event: this.prevEvent,\n eventTarget: this._eventTarget,\n interaction: this,\n }, signalArg || {});\n\n signals.fire('before-action-move', signalArg);\n\n if (!this._dontFireMove) {\n signals.fire('action-move', signalArg);\n }\n\n this._dontFireMove = false;\n }\n\n // End interact move events and stop auto-scroll unless simulation is running\n pointerUp (pointer, event, eventTarget, curEventTarget) {\n const pointerIndex = this.getPointerIndex(pointer);\n\n signals.fire(/cancel$/i.test(event.type)? 'cancel' : 'up', {\n pointer,\n pointerIndex,\n event,\n eventTarget,\n curEventTarget,\n interaction: this,\n });\n\n if (!this.simulation) {\n this.end(event);\n }\n\n this.pointerIsDown = false;\n this.removePointer(pointer, event);\n }\n\n /*\\\n * Interaction.end\n [ method ]\n *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n - event (PointerEvent) #optional\n **\n | interact(target)\n | .draggable(true)\n | .on('move', function (event) {\n | if (event.pageX > 1000) {\n | // end the current action\n | event.interaction.end();\n | // stop all further listeners from being called\n | event.stopImmediatePropagation();\n | }\n | });\n \\*/\n end (event) {\n event = event || this.prevEvent;\n\n if (this.interacting()) {\n signals.fire('action-end', {\n event,\n interaction: this,\n });\n }\n\n this.stop();\n }\n\n currentAction () {\n return this._interacting? this.prepared.name: null;\n }\n\n interacting () {\n return this._interacting;\n }\n\n stop () {\n signals.fire('stop', { interaction: this });\n\n if (this._interacting) {\n signals.fire('stop-active', { interaction: this });\n signals.fire('stop-' + this.prepared.name, { interaction: this });\n }\n\n this.target = this.element = null;\n\n this._interacting = false;\n this.prepared.name = this.prevEvent = null;\n }\n\n getPointerIndex (pointer) {\n // mouse and pen interactions may have only one pointer\n if (this.pointerType === 'mouse' || this.pointerType === 'pen') {\n return 0;\n }\n\n return utils.indexOf(this.pointerIds, utils.getPointerId(pointer));\n }\n\n updatePointer (pointer, event, down = event && /(down|start)$/i.test(event.type)) {\n const id = utils.getPointerId(pointer);\n let index = this.getPointerIndex(pointer);\n\n if (index === -1) {\n index = this.pointerIds.length;\n this.pointerIds[index] = id;\n }\n\n if (down) {\n signals.fire('update-pointer-down', {\n pointer,\n event,\n down,\n pointerId: id,\n pointerIndex: index,\n interaction: this,\n });\n }\n\n this.pointers[index] = pointer;\n\n return index;\n }\n\n removePointer (pointer, event) {\n const index = this.getPointerIndex(pointer);\n\n if (index === -1) { return; }\n\n signals.fire('remove-pointer', {\n pointer,\n event,\n pointerIndex: index,\n interaction: this,\n });\n\n this.pointers .splice(index, 1);\n this.pointerIds .splice(index, 1);\n this.downTargets.splice(index, 1);\n this.downTimes .splice(index, 1);\n }\n\n _updateEventTargets (target, currentTarget) {\n this._eventTarget = target;\n this._curEventTarget = currentTarget;\n }\n}\n\nfor (let i = 0, len = methodNames.length; i < len; i++) {\n const method = methodNames[i];\n\n listeners[method] = doOnInteractions(method);\n}\n\nfunction doOnInteractions (method) {\n return (function (event) {\n const pointerType = utils.getPointerType(event);\n const [eventTarget, curEventTarget] = utils.getEventTargets(event);\n const matches = []; // [ [pointer, interaction], ...]\n\n if (browser.supportsTouch && /touch/.test(event.type)) {\n prevTouchTime = new Date().getTime();\n\n for (let i = 0; i < event.changedTouches.length; i++) {\n const pointer = event.changedTouches[i];\n const interaction = finder.search(pointer, event.type, eventTarget);\n\n matches.push([pointer, interaction || new Interaction({ pointerType })]);\n }\n }\n else {\n let invalidPointer = false;\n\n if (!browser.supportsPointerEvent && /mouse/.test(event.type)) {\n // ignore mouse events while touch interactions are active\n for (let i = 0; i < scope.interactions.length && !invalidPointer; i++) {\n invalidPointer = scope.interactions[i].pointerType !== 'mouse' && scope.interactions[i].pointerIsDown;\n }\n\n // try to ignore mouse events that are simulated by the browser\n // after a touch event\n invalidPointer = invalidPointer\n || (new Date().getTime() - prevTouchTime < 500)\n // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated\n || event.timeStamp === 0;\n }\n\n if (!invalidPointer) {\n let interaction = finder.search(event, event.type, eventTarget);\n\n if (!interaction) {\n interaction = new Interaction({ pointerType });\n }\n\n matches.push([event, interaction]);\n }\n }\n\n for (const [pointer, interaction] of matches) {\n interaction._updateEventTargets(eventTarget, curEventTarget);\n interaction[method](pointer, event, eventTarget, curEventTarget);\n }\n });\n}\n\nfunction endAll (event) {\n for (let i = 0; i < scope.interactions.length; i++) {\n const interaction = scope.interactions[i];\n\n interaction.end(event);\n signals.fire('endall', { event, interaction });\n }\n}\n\nconst docEvents = { /* 'eventType': listenerFunc */ };\nconst pEventTypes = browser.pEventTypes;\n\nif (domObjects.PointerEvent) {\n docEvents[pEventTypes.down ] = listeners.pointerDown;\n docEvents[pEventTypes.move ] = listeners.pointerMove;\n docEvents[pEventTypes.up ] = listeners.pointerUp;\n docEvents[pEventTypes.cancel] = listeners.pointerUp;\n}\nelse {\n docEvents.mousedown = listeners.pointerDown;\n docEvents.mousemove = listeners.pointerMove;\n docEvents.mouseup = listeners.pointerUp;\n\n docEvents.touchstart = listeners.pointerDown;\n docEvents.touchmove = listeners.pointerMove;\n docEvents.touchend = listeners.pointerUp;\n docEvents.touchcancel = listeners.pointerUp;\n}\n\ndocEvents.blur = endAll;\n\nfunction onDocSignal ({ doc }, signalName) {\n const eventMethod = signalName.indexOf('add') === 0\n ? events.add : events.remove;\n\n // delegate event listener\n for (const eventType in scope.delegatedEvents) {\n eventMethod(doc, eventType, events.delegateListener);\n eventMethod(doc, eventType, events.delegateUseCapture, true);\n }\n\n for (const eventType in docEvents) {\n eventMethod(doc, eventType, docEvents[eventType]);\n }\n}\n\nsignals.on('update-pointer-down', ({ interaction, pointer, pointerId, pointerIndex, event, eventTarget, down }) => {\n interaction.pointerIds[pointerIndex] = pointerId;\n interaction.pointers[pointerIndex] = pointer;\n\n if (down) {\n interaction.pointerIsDown = true;\n }\n\n if (!interaction.interacting()) {\n utils.setCoords(interaction.startCoords, interaction.pointers);\n\n utils.copyCoords(interaction.curCoords , interaction.startCoords);\n utils.copyCoords(interaction.prevCoords, interaction.startCoords);\n\n interaction.downEvent = event;\n interaction.downTimes[pointerIndex] = interaction.curCoords.timeStamp;\n interaction.downTargets[pointerIndex] = eventTarget || event && utils.getEventTargets(event)[0];\n interaction.pointerWasMoved = false;\n\n utils.pointerExtend(interaction.downPointer, pointer);\n }\n});\n\nscope.signals.on('add-document' , onDocSignal);\nscope.signals.on('remove-document', onDocSignal);\n\nInteraction.pointerMoveTolerance = 1;\nInteraction.doOnInteractions = doOnInteractions;\nInteraction.endAll = endAll;\nInteraction.signals = signals;\nInteraction.docEvents = docEvents;\n\nscope.endAllInteractions = endAll;\n\nmodule.exports = Interaction;\n","const Interaction = require('../Interaction');\nconst InteractEvent = require('../InteractEvent');\n\nconst actions = {\n firePrepared,\n names: [],\n methodDict: {},\n};\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n interaction._interacting = true;\n firePrepared(interaction, event, 'start');\n});\n\nInteraction.signals.on('action-move', function ({ interaction, event, preEnd }) {\n firePrepared(interaction, event, 'move', preEnd);\n\n // if the action was ended in a listener\n if (!interaction.interacting()) { return false; }\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n firePrepared(interaction, event, 'end');\n});\n\nfunction firePrepared (interaction, event, phase, preEnd) {\n const actionName = interaction.prepared.name;\n\n const newEvent = new InteractEvent(interaction, event, actionName, phase, interaction.element, null, preEnd);\n\n interaction.target.fire(newEvent);\n interaction.prevEvent = newEvent;\n}\n\nmodule.exports = actions;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drag = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n startAxis : 'xy',\n lockAxis : 'xy',\n },\n\n checker: function (pointer, event, interactable) {\n const dragOptions = interactable.options.drag;\n\n return dragOptions.enabled\n ? { name: 'drag', axis: (dragOptions.lockAxis === 'start'\n ? dragOptions.startAxis\n : dragOptions.lockAxis)}\n : null;\n },\n\n getCursor: function () {\n return 'move';\n },\n};\n\nInteraction.signals.on('before-action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n interaction.curCoords.page.y = interaction.startCoords.page.y;\n interaction.curCoords.client.y = interaction.startCoords.client.y;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vx);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vx);\n interaction.pointerDelta.client.vy = 0;\n interaction.pointerDelta.page.vy = 0;\n }\n else if (axis === 'y') {\n interaction.curCoords.page.x = interaction.startCoords.page.x;\n interaction.curCoords.client.x = interaction.startCoords.client.x;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vy);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vy);\n interaction.pointerDelta.client.vx = 0;\n interaction.pointerDelta.page.vx = 0;\n }\n});\n\n// dragmove\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'dragmove') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n iEvent.pageY = interaction.startCoords.page.y;\n iEvent.clientY = interaction.startCoords.client.y;\n iEvent.dy = 0;\n }\n else if (axis === 'y') {\n iEvent.pageX = interaction.startCoords.page.x;\n iEvent.clientX = interaction.startCoords.client.x;\n iEvent.dx = 0;\n }\n});\n\n/*\\\n * Interactable.draggable\n [ method ]\n *\n * Gets or sets whether drag actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of drag events\n | var isDraggable = interact('ul li').draggable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on drag events (object makes the Interactable draggable)\n = (object) This Interactable\n | interact(element).draggable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // the axis in which the first movement must be\n | // for the drag sequence to start\n | // 'xy' by default - any direction\n | startAxis: 'x' || 'y' || 'xy',\n |\n | // 'xy' by default - don't restrict to one axis (move in any direction)\n | // 'x' or 'y' to restrict movement to either axis\n | // 'start' to restrict movement to the axis the drag started in\n | lockAxis: 'x' || 'y' || 'xy' || 'start',\n |\n | // max number of drags that can happen concurrently\n | // with elements of this Interactable. Infinity by default\n | max: Infinity,\n |\n | // max number of drags that can target the same element+Interactable\n | // 1 by default\n | maxPerElement: 2\n | });\n\\*/\nInteractable.prototype.draggable = function (options) {\n if (utils.is.object(options)) {\n this.options.drag.enabled = options.enabled === false? false: true;\n this.setPerAction('drag', options);\n this.setOnEvents('drag', options);\n\n if (/^(xy|x|y|start)$/.test(options.lockAxis)) {\n this.options.drag.lockAxis = options.lockAxis;\n }\n if (/^(xy|x|y)$/.test(options.startAxis)) {\n this.options.drag.startAxis = options.startAxis;\n }\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drag.enabled = options;\n\n if (!options) {\n this.ondragstart = this.ondragstart = this.ondragend = null;\n }\n\n return this;\n }\n\n return this.options.drag;\n};\n\nactions.drag = drag;\nactions.names.push('drag');\nutils.merge(Interactable.eventTypes, [\n 'dragstart',\n 'dragmove',\n 'draginertiastart',\n 'draginertiaresume',\n 'dragend',\n]);\nactions.methodDict.drag = 'draggable';\n\ndefaultOptions.drag = drag.defaults;\n\nmodule.exports = drag;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst scope = require('../scope');\nconst interact = require('../interact');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drop = {\n defaults: {\n enabled: false,\n accept : null,\n overlap: 'pointer',\n },\n};\n\nlet dynamicDrop = false;\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // reset active dropzones\n interaction.activeDrops.dropzones = [];\n interaction.activeDrops.elements = [];\n interaction.activeDrops.rects = [];\n\n interaction.dropEvents = null;\n\n if (!interaction.dynamicDrop) {\n setActiveDrops(interaction, interaction.element);\n }\n\n const dragEvent = interaction.prevEvent;\n const dropEvents = getDropEvents(interaction, event, dragEvent);\n\n if (dropEvents.activate) {\n fireActiveDrops(interaction, dropEvents.activate);\n }\n});\n\nInteractEvent.signals.on('new', function ({ interaction, iEvent, event }) {\n if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { return; }\n\n const draggableElement = interaction.element;\n const dragEvent = iEvent;\n const dropResult = getDrop(dragEvent, event, draggableElement);\n\n interaction.dropTarget = dropResult.dropzone;\n interaction.dropElement = dropResult.element;\n\n interaction.dropEvents = getDropEvents(interaction, event, dragEvent);\n});\n\nInteraction.signals.on('action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n fireDropEvents(interaction, interaction.dropEvents);\n});\n\nInteraction.signals.on('action-end', function ({ interaction }) {\n if (interaction.prepared.name === 'drag') {\n fireDropEvents(interaction, interaction.dropEvents);\n }\n});\n\nInteraction.signals.on('stop-drag', function ({ interaction }) {\n interaction.activeDrops.dropzones =\n interaction.activeDrops.elements =\n interaction.activeDrops.rects =\n interaction.dropEvents = null;\n});\n\nfunction collectDrops (interaction, element) {\n const drops = [];\n const elements = [];\n\n element = element || interaction.element;\n\n // collect all dropzones and their elements which qualify for a drop\n for (const current of scope.interactables) {\n if (!current.options.drop.enabled) { continue; }\n\n const accept = current.options.drop.accept;\n\n // test the draggable element against the dropzone's accept setting\n if ((utils.is.element(accept) && accept !== element)\n || (utils.is.string(accept)\n && !utils.matchesSelector(element, accept))) {\n\n continue;\n }\n\n // query for new elements if necessary\n const dropElements = utils.is.string(current.target)\n ? current._context.querySelectorAll(current.target)\n : [current.target];\n\n for (let i = 0; i < dropElements.length; i++) {\n const currentElement = dropElements[i];\n\n if (currentElement !== element) {\n drops.push(current);\n elements.push(currentElement);\n }\n }\n }\n\n return {\n elements,\n dropzones: drops,\n };\n}\n\nfunction fireActiveDrops (interaction, event) {\n let prevElement;\n\n // loop through all active dropzones and trigger event\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n const current = interaction.activeDrops.dropzones[i];\n const currentElement = interaction.activeDrops.elements [i];\n\n // prevent trigger of duplicate events on same element\n if (currentElement !== prevElement) {\n // set current element as event target\n event.target = currentElement;\n current.fire(event);\n }\n prevElement = currentElement;\n }\n}\n\n// Collect a new set of possible drops and save them in activeDrops.\n// setActiveDrops should always be called when a drag has just started or a\n// drag event happens while dynamicDrop is true\nfunction setActiveDrops (interaction, dragElement) {\n // get dropzones and their elements that could receive the draggable\n const possibleDrops = collectDrops(interaction, dragElement, true);\n\n interaction.activeDrops.dropzones = possibleDrops.dropzones;\n interaction.activeDrops.elements = possibleDrops.elements;\n interaction.activeDrops.rects = [];\n\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n interaction.activeDrops.rects[i] =\n interaction.activeDrops.dropzones[i].getRect(interaction.activeDrops.elements[i]);\n }\n}\n\nfunction getDrop (dragEvent, event, dragElement) {\n const interaction = dragEvent.interaction;\n const validDrops = [];\n\n if (dynamicDrop) {\n setActiveDrops(interaction, dragElement);\n }\n\n // collect all dropzones and their elements which qualify for a drop\n for (let j = 0; j < interaction.activeDrops.dropzones.length; j++) {\n const current = interaction.activeDrops.dropzones[j];\n const currentElement = interaction.activeDrops.elements [j];\n const rect = interaction.activeDrops.rects [j];\n\n validDrops.push(current.dropCheck(dragEvent, event, interaction.target, dragElement, currentElement, rect)\n ? currentElement\n : null);\n }\n\n // get the most appropriate dropzone based on DOM depth and order\n const dropIndex = utils.indexOfDeepestElement(validDrops);\n\n return {\n dropzone: interaction.activeDrops.dropzones[dropIndex] || null,\n element : interaction.activeDrops.elements [dropIndex] || null,\n };\n}\n\nfunction getDropEvents (interaction, pointerEvent, dragEvent) {\n const dropEvents = {\n enter : null,\n leave : null,\n activate : null,\n deactivate: null,\n move : null,\n drop : null,\n };\n\n const tmpl = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n };\n\n if (interaction.dropElement !== interaction.prevDropElement) {\n // if there was a prevDropTarget, create a dragleave event\n if (interaction.prevDropTarget) {\n dropEvents.leave = utils.extend({ type: 'dragleave' }, tmpl);\n\n dragEvent.dragLeave = dropEvents.leave.target = interaction.prevDropElement;\n dragEvent.prevDropzone = dropEvents.leave.dropzone = interaction.prevDropTarget;\n }\n // if the dropTarget is not null, create a dragenter event\n if (interaction.dropTarget) {\n dropEvents.enter = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n type : 'dragenter',\n };\n\n dragEvent.dragEnter = interaction.dropElement;\n dragEvent.dropzone = interaction.dropTarget;\n }\n }\n\n if (dragEvent.type === 'dragend' && interaction.dropTarget) {\n dropEvents.drop = utils.extend({ type: 'drop' }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n dragEvent.relatedTarget = interaction.dropElement;\n }\n if (dragEvent.type === 'dragstart') {\n dropEvents.activate = utils.extend({ type: 'dropactivate' }, tmpl);\n\n dropEvents.activate.target = null;\n dropEvents.activate.dropzone = null;\n }\n if (dragEvent.type === 'dragend') {\n dropEvents.deactivate = utils.extend({ type: 'dropdeactivate' }, tmpl);\n\n dropEvents.deactivate.target = null;\n dropEvents.deactivate.dropzone = null;\n }\n if (dragEvent.type === 'dragmove' && interaction.dropTarget) {\n dropEvents.move = utils.extend({\n dragmove : dragEvent,\n type : 'dropmove',\n }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n }\n\n return dropEvents;\n}\n\nfunction fireDropEvents (interaction, dropEvents) {\n if (dropEvents.leave) { interaction.prevDropTarget.fire(dropEvents.leave); }\n if (dropEvents.move ) { interaction.dropTarget.fire(dropEvents.move ); }\n if (dropEvents.enter) { interaction.dropTarget.fire(dropEvents.enter); }\n if (dropEvents.drop ) { interaction.dropTarget.fire(dropEvents.drop ); }\n if (dropEvents.deactivate) {\n fireActiveDrops(interaction, dropEvents.deactivate);\n }\n\n interaction.prevDropTarget = interaction.dropTarget;\n interaction.prevDropElement = interaction.dropElement;\n}\n\n/*\\\n * Interactable.dropzone\n [ method ]\n *\n * Returns or sets whether elements can be dropped onto this\n * Interactable to trigger drop events\n *\n * Dropzones can receive the following events:\n * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends\n * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone\n * - `dragmove` when a draggable that has entered the dropzone is moved\n * - `drop` when a draggable is dropped into this dropzone\n *\n * Use the `accept` option to allow only elements that match the given CSS\n * selector or element. The value can be:\n *\n * - **an Element** - only that element can be dropped into this dropzone.\n * - **a string**, - the element being dragged must match it as a CSS selector.\n * - **`null`** - accept options is cleared - it accepts any element.\n *\n * Use the `overlap` option to set how drops are checked for. The allowed\n * values are:\n *\n * - `'pointer'`, the pointer must be over the dropzone (default)\n * - `'center'`, the draggable element's center must be over the dropzone\n * - a number from 0-1 which is the `(intersection area) / (draggable area)`.\n * e.g. `0.5` for drop to happen when half of the area of the draggable is\n * over the dropzone\n *\n * Use the `checker` option to specify a function to check if a dragged\n * element is over this Interactable.\n *\n | interact(target)\n | .dropChecker(function(dragEvent, // related dragmove or dragend event\n | event, // TouchEvent/PointerEvent/MouseEvent\n | dropped, // bool result of the default checker\n | dropzone, // dropzone Interactable\n | dropElement, // dropzone elemnt\n | draggable, // draggable Interactable\n | draggableElement) {// draggable element\n |\n | return dropped && event.target.hasAttribute('allow-drop');\n | }\n *\n *\n - options (boolean | object | null) #optional The new value to be set.\n | interact('.drop').dropzone({\n | accept: '.can-drop' || document.getElementById('single-drop'),\n | overlap: 'pointer' || 'center' || zeroToOne\n | }\n = (boolean | object) The current setting or this Interactable\n\\*/\nInteractable.prototype.dropzone = function (options) {\n if (utils.is.object(options)) {\n this.options.drop.enabled = options.enabled === false? false: true;\n\n if (utils.is.function(options.ondrop) ) { this.events.ondrop = options.ondrop ; }\n if (utils.is.function(options.ondropactivate) ) { this.events.ondropactivate = options.ondropactivate ; }\n if (utils.is.function(options.ondropdeactivate)) { this.events.ondropdeactivate = options.ondropdeactivate; }\n if (utils.is.function(options.ondragenter) ) { this.events.ondragenter = options.ondragenter ; }\n if (utils.is.function(options.ondragleave) ) { this.events.ondragleave = options.ondragleave ; }\n if (utils.is.function(options.ondropmove) ) { this.events.ondropmove = options.ondropmove ; }\n\n if (/^(pointer|center)$/.test(options.overlap)) {\n this.options.drop.overlap = options.overlap;\n }\n else if (utils.is.number(options.overlap)) {\n this.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0);\n }\n if ('accept' in options) {\n this.options.drop.accept = options.accept;\n }\n if ('checker' in options) {\n this.options.drop.checker = options.checker;\n }\n\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drop.enabled = options;\n\n if (!options) {\n this.ondragenter = this.ondragleave = this.ondrop\n = this.ondropactivate = this.ondropdeactivate = null;\n }\n\n return this;\n }\n\n return this.options.drop;\n};\n\nInteractable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) {\n let dropped = false;\n\n // if the dropzone has no rect (eg. display: none)\n // call the custom dropChecker or just return false\n if (!(rect = rect || this.getRect(dropElement))) {\n return (this.options.drop.checker\n ? this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement)\n : false);\n }\n\n const dropOverlap = this.options.drop.overlap;\n\n if (dropOverlap === 'pointer') {\n const origin = utils.getOriginXY(draggable, draggableElement, 'drag');\n const page = utils.getPageXY(dragEvent);\n\n page.x += origin.x;\n page.y += origin.y;\n\n const horizontal = (page.x > rect.left) && (page.x < rect.right);\n const vertical = (page.y > rect.top ) && (page.y < rect.bottom);\n\n dropped = horizontal && vertical;\n }\n\n const dragRect = draggable.getRect(draggableElement);\n\n if (dragRect && dropOverlap === 'center') {\n const cx = dragRect.left + dragRect.width / 2;\n const cy = dragRect.top + dragRect.height / 2;\n\n dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom;\n }\n\n if (dragRect && utils.is.number(dropOverlap)) {\n const overlapArea = (Math.max(0, Math.min(rect.right , dragRect.right ) - Math.max(rect.left, dragRect.left))\n * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top , dragRect.top )));\n\n const overlapRatio = overlapArea / (dragRect.width * dragRect.height);\n\n dropped = overlapRatio >= dropOverlap;\n }\n\n if (this.options.drop.checker) {\n dropped = this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement);\n }\n\n return dropped;\n};\n\nInteractable.signals.on('unset', function ({ interactable }) {\n interactable.dropzone(false);\n});\n\nInteractable.settingsMethods.push('dropChecker');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.dropTarget = null; // the dropzone a drag target might be dropped into\n interaction.dropElement = null; // the element at the time of checking\n interaction.prevDropTarget = null; // the dropzone that was recently dragged away from\n interaction.prevDropElement = null; // the element at the time of checking\n interaction.dropEvents = null; // the dropEvents related to the current drag event\n\n interaction.activeDrops = {\n dropzones: [], // the dropzones that are mentioned below\n elements : [], // elements of dropzones that accept the target draggable\n rects : [], // the rects of the elements mentioned above\n };\n\n});\n\nInteraction.signals.on('stop', function ({ interaction }) {\n interaction.dropTarget = interaction.dropElement =\n interaction.prevDropTarget = interaction.prevDropElement = null;\n});\n\n/*\\\n * interact.dynamicDrop\n [ method ]\n *\n * Returns or sets whether the dimensions of dropzone elements are\n * calculated on every dragmove or only on dragstart for the default\n * dropChecker\n *\n - newValue (boolean) #optional True to check on each move. False to check only before start\n = (boolean | interact) The current setting or interact\n\\*/\ninteract.dynamicDrop = function (newValue) {\n if (utils.is.bool(newValue)) {\n //if (dragging && dynamicDrop !== newValue && !newValue) {\n //calcRects(dropzones);\n //}\n\n dynamicDrop = newValue;\n\n return interact;\n }\n return dynamicDrop;\n};\n\nutils.merge(Interactable.eventTypes, [\n 'dragenter',\n 'dragleave',\n 'dropactivate',\n 'dropdeactivate',\n 'dropmove',\n 'drop',\n]);\nactions.methodDict.drop = 'dropzone';\n\ndefaultOptions.drop = drop.defaults;\n\nmodule.exports = drop;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst gesture = {\n defaults: {\n enabled : false,\n origin : null,\n restrict: null,\n },\n\n checker: function (pointer, event, interactable, element, interaction) {\n if (interaction.pointerIds.length >= 2) {\n return { name: 'gesture' };\n }\n\n return null;\n },\n\n getCursor: function () {\n return '';\n },\n};\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturestart') { return; }\n iEvent.ds = 0;\n\n interaction.gesture.startDistance = interaction.gesture.prevDistance = iEvent.distance;\n interaction.gesture.startAngle = interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.scale = 1;\n});\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturemove') { return; }\n\n iEvent.ds = iEvent.scale - interaction.gesture.scale;\n\n interaction.target.fire(iEvent);\n\n interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.prevDistance = iEvent.distance;\n\n if (iEvent.scale !== Infinity\n && iEvent.scale !== null\n && iEvent.scale !== undefined\n && !isNaN(iEvent.scale)) {\n\n interaction.gesture.scale = iEvent.scale;\n }\n});\n\n/*\\\n * Interactable.gesturable\n [ method ]\n *\n * Gets or sets whether multitouch gestures can be performed on the\n * Interactable's element\n *\n = (boolean) Indicates if this can be the target of gesture events\n | var isGestureable = interact(element).gesturable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on gesture events (makes the Interactable gesturable)\n = (object) this Interactable\n | interact(element).gesturable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // limit multiple gestures.\n | // See the explanation in @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n\\*/\nInteractable.prototype.gesturable = function (options) {\n if (utils.is.object(options)) {\n this.options.gesture.enabled = options.enabled === false? false: true;\n this.setPerAction('gesture', options);\n this.setOnEvents('gesture', options);\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.gesture.enabled = options;\n\n if (!options) {\n this.ongesturestart = this.ongesturestart = this.ongestureend = null;\n }\n\n return this;\n }\n\n return this.options.gesture;\n};\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action, event, starting, ending, deltaSource }) {\n if (action !== 'gesture') { return; }\n\n const pointers = interaction.pointers;\n\n iEvent.touches = [pointers[0], pointers[1]];\n\n if (starting) {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = 1;\n iEvent.ds = 0;\n iEvent.angle = utils.touchAngle(pointers, undefined, deltaSource);\n iEvent.da = 0;\n }\n else if (ending || event instanceof InteractEvent) {\n iEvent.distance = interaction.prevEvent.distance;\n iEvent.box = interaction.prevEvent.box;\n iEvent.scale = interaction.prevEvent.scale;\n iEvent.ds = iEvent.scale - 1;\n iEvent.angle = interaction.prevEvent.angle;\n iEvent.da = iEvent.angle - interaction.gesture.startAngle;\n }\n else {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = iEvent.distance / interaction.gesture.startDistance;\n iEvent.angle = utils.touchAngle(pointers, interaction.gesture.prevAngle, deltaSource);\n\n iEvent.ds = iEvent.scale - interaction.gesture.prevScale;\n iEvent.da = iEvent.angle - interaction.gesture.prevAngle;\n }\n});\n\nInteraction.signals.on('new', function (interaction) {\n interaction.gesture = {\n start: { x: 0, y: 0 },\n\n startDistance: 0, // distance between two touches of touchStart\n prevDistance : 0,\n distance : 0,\n\n scale: 1, // gesture.distance / gesture.startDistance\n\n startAngle: 0, // angle of line joining two touches\n prevAngle : 0, // angle of the previous gesture event\n };\n});\n\nactions.gesture = gesture;\nactions.names.push('gesture');\nutils.merge(Interactable.eventTypes, [\n 'gesturestart',\n 'gesturemove',\n 'gestureend',\n]);\nactions.methodDict.gesture = 'gesturable';\n\ndefaultOptions.gesture = gesture.defaults;\n\nmodule.exports = gesture;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\n// Less Precision with touch input\nconst defaultMargin = browser.supportsTouch || browser.supportsPointerEvent? 20: 10;\n\nconst resize = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n square: false,\n preserveAspectRatio: false,\n axis: 'xy',\n\n // use default margin\n margin: NaN,\n\n // object with props left, right, top, bottom which are\n // true/false values to resize when the pointer is over that edge,\n // CSS selectors to match the handles for each direction\n // or the Elements for each handle\n edges: null,\n\n // a value of 'none' will limit the resize rect to a minimum of 0x0\n // 'negate' will alow the rect to have negative width/height\n // 'reposition' will keep the width/height positive by swapping\n // the top and bottom edges and/or swapping the left and right edges\n invert: 'none',\n },\n\n checker: function (pointer, event, interactable, element, interaction, rect) {\n if (!rect) { return null; }\n\n const page = utils.extend({}, interaction.curCoords.page);\n const options = interactable.options;\n\n if (options.resize.enabled) {\n const resizeOptions = options.resize;\n const resizeEdges = { left: false, right: false, top: false, bottom: false };\n\n // if using resize.edges\n if (utils.is.object(resizeOptions.edges)) {\n for (const edge in resizeEdges) {\n resizeEdges[edge] = checkResizeEdge(edge,\n resizeOptions.edges[edge],\n page,\n interaction._eventTarget,\n element,\n rect,\n resizeOptions.margin || defaultMargin);\n }\n\n resizeEdges.left = resizeEdges.left && !resizeEdges.right;\n resizeEdges.top = resizeEdges.top && !resizeEdges.bottom;\n\n if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) {\n return {\n name: 'resize',\n edges: resizeEdges,\n };\n }\n }\n else {\n const right = options.resize.axis !== 'y' && page.x > (rect.right - defaultMargin);\n const bottom = options.resize.axis !== 'x' && page.y > (rect.bottom - defaultMargin);\n\n if (right || bottom) {\n return {\n name: 'resize',\n axes: (right? 'x' : '') + (bottom? 'y' : ''),\n };\n }\n }\n }\n\n return null;\n },\n\n cursors: (browser.isIe9OrOlder ? {\n x : 'e-resize',\n y : 's-resize',\n xy: 'se-resize',\n\n top : 'n-resize',\n left : 'w-resize',\n bottom : 's-resize',\n right : 'e-resize',\n topleft : 'se-resize',\n bottomright: 'se-resize',\n topright : 'ne-resize',\n bottomleft : 'ne-resize',\n } : {\n x : 'ew-resize',\n y : 'ns-resize',\n xy: 'nwse-resize',\n\n top : 'ns-resize',\n left : 'ew-resize',\n bottom : 'ns-resize',\n right : 'ew-resize',\n topleft : 'nwse-resize',\n bottomright: 'nwse-resize',\n topright : 'nesw-resize',\n bottomleft : 'nesw-resize',\n }),\n\n getCursor: function (action) {\n if (action.axis) {\n return resize.cursors[action.name + action.axis];\n }\n else if (action.edges) {\n let cursorKey = '';\n const edgeNames = ['top', 'bottom', 'left', 'right'];\n\n for (let i = 0; i < 4; i++) {\n if (action.edges[edgeNames[i]]) {\n cursorKey += edgeNames[i];\n }\n }\n\n return resize.cursors[cursorKey];\n }\n },\n};\n\n// resizestart\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'resizestart' || !interaction.prepared.edges) {\n return;\n }\n\n const startRect = interaction.target.getRect(interaction.element);\n const resizeOptions = interaction.target.options.resize;\n\n /*\n * When using the `resizable.square` or `resizable.preserveAspectRatio` options, resizing from one edge\n * will affect another. E.g. with `resizable.square`, resizing to make the right edge larger will make\n * the bottom edge larger by the same amount. We call these 'linked' edges. Any linked edges will depend\n * on the active edges and the edge being interacted with.\n */\n if (resizeOptions.square || resizeOptions.preserveAspectRatio) {\n const linkedEdges = utils.extend({}, interaction.prepared.edges);\n\n linkedEdges.top = linkedEdges.top || (linkedEdges.left && !linkedEdges.bottom);\n linkedEdges.left = linkedEdges.left || (linkedEdges.top && !linkedEdges.right );\n linkedEdges.bottom = linkedEdges.bottom || (linkedEdges.right && !linkedEdges.top );\n linkedEdges.right = linkedEdges.right || (linkedEdges.bottom && !linkedEdges.left );\n\n interaction.prepared._linkedEdges = linkedEdges;\n }\n else {\n interaction.prepared._linkedEdges = null;\n }\n\n // if using `resizable.preserveAspectRatio` option, record aspect ratio at the start of the resize\n if (resizeOptions.preserveAspectRatio) {\n interaction.resizeStartAspectRatio = startRect.width / startRect.height;\n }\n\n interaction.resizeRects = {\n start : startRect,\n current : utils.extend({}, startRect),\n inverted : utils.extend({}, startRect),\n previous : utils.extend({}, startRect),\n delta : {\n left: 0, right : 0, width : 0,\n top : 0, bottom: 0, height: 0,\n },\n };\n\n iEvent.rect = interaction.resizeRects.inverted;\n iEvent.deltaRect = interaction.resizeRects.delta;\n});\n\n// resizemove\nInteractEvent.signals.on('new', function ({ iEvent, phase, interaction }) {\n if (phase !== 'move' || !interaction.prepared.edges) { return; }\n\n const resizeOptions = interaction.target.options.resize;\n const invert = resizeOptions.invert;\n const invertible = invert === 'reposition' || invert === 'negate';\n\n let edges = interaction.prepared.edges;\n\n const start = interaction.resizeRects.start;\n const current = interaction.resizeRects.current;\n const inverted = interaction.resizeRects.inverted;\n const delta = interaction.resizeRects.delta;\n const previous = utils.extend(interaction.resizeRects.previous, inverted);\n const originalEdges = edges;\n\n let dx = iEvent.dx;\n let dy = iEvent.dy;\n\n if (resizeOptions.preserveAspectRatio || resizeOptions.square) {\n // `resize.preserveAspectRatio` takes precedence over `resize.square`\n const startAspectRatio = resizeOptions.preserveAspectRatio\n ? interaction.resizeStartAspectRatio\n : 1;\n\n edges = interaction.prepared._linkedEdges;\n\n if ((originalEdges.left && originalEdges.bottom)\n || (originalEdges.right && originalEdges.top)) {\n dy = -dx / startAspectRatio;\n }\n else if (originalEdges.left || originalEdges.right ) { dy = dx / startAspectRatio; }\n else if (originalEdges.top || originalEdges.bottom) { dx = dy * startAspectRatio; }\n }\n\n // update the 'current' rect without modifications\n if (edges.top ) { current.top += dy; }\n if (edges.bottom) { current.bottom += dy; }\n if (edges.left ) { current.left += dx; }\n if (edges.right ) { current.right += dx; }\n\n if (invertible) {\n // if invertible, copy the current rect\n utils.extend(inverted, current);\n\n if (invert === 'reposition') {\n // swap edge values if necessary to keep width/height positive\n let swap;\n\n if (inverted.top > inverted.bottom) {\n swap = inverted.top;\n\n inverted.top = inverted.bottom;\n inverted.bottom = swap;\n }\n if (inverted.left > inverted.right) {\n swap = inverted.left;\n\n inverted.left = inverted.right;\n inverted.right = swap;\n }\n }\n }\n else {\n // if not invertible, restrict to minimum of 0x0 rect\n inverted.top = Math.min(current.top, start.bottom);\n inverted.bottom = Math.max(current.bottom, start.top);\n inverted.left = Math.min(current.left, start.right);\n inverted.right = Math.max(current.right, start.left);\n }\n\n inverted.width = inverted.right - inverted.left;\n inverted.height = inverted.bottom - inverted.top ;\n\n for (const edge in inverted) {\n delta[edge] = inverted[edge] - previous[edge];\n }\n\n iEvent.edges = interaction.prepared.edges;\n iEvent.rect = inverted;\n iEvent.deltaRect = delta;\n});\n\n/*\\\n * Interactable.resizable\n [ method ]\n *\n * Gets or sets whether resize actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of resize elements\n | var isResizeable = interact('input[type=text]').resizable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on resize events (object makes the Interactable resizable)\n = (object) This Interactable\n | interact(element).resizable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | edges: {\n | top : true, // Use pointer coords to check for resize.\n | left : false, // Disable resizing from left edge.\n | bottom: '.resize-s',// Resize if pointer target matches selector\n | right : handleEl // Resize if pointer target is the given Element\n | },\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height are adjusted at a 1:1 ratio.\n | square: false,\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height maintain the aspect ratio they had when resizing started.\n | preserveAspectRatio: false,\n |\n | // a value of 'none' will limit the resize rect to a minimum of 0x0\n | // 'negate' will allow the rect to have negative width/height\n | // 'reposition' will keep the width/height positive by swapping\n | // the top and bottom edges and/or swapping the left and right edges\n | invert: 'none' || 'negate' || 'reposition'\n |\n | // limit multiple resizes.\n | // See the explanation in the @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n \\*/\nInteractable.prototype.resizable = function (options) {\n if (utils.is.object(options)) {\n this.options.resize.enabled = options.enabled === false? false: true;\n this.setPerAction('resize', options);\n this.setOnEvents('resize', options);\n\n if (/^x$|^y$|^xy$/.test(options.axis)) {\n this.options.resize.axis = options.axis;\n }\n else if (options.axis === null) {\n this.options.resize.axis = defaultOptions.resize.axis;\n }\n\n if (utils.is.bool(options.preserveAspectRatio)) {\n this.options.resize.preserveAspectRatio = options.preserveAspectRatio;\n }\n else if (utils.is.bool(options.square)) {\n this.options.resize.square = options.square;\n }\n\n return this;\n }\n if (utils.is.bool(options)) {\n this.options.resize.enabled = options;\n\n if (!options) {\n this.onresizestart = this.onresizestart = this.onresizeend = null;\n }\n\n return this;\n }\n return this.options.resize;\n};\n\nfunction checkResizeEdge (name, value, page, element, interactableElement, rect, margin) {\n // false, '', undefined, null\n if (!value) { return false; }\n\n // true value, use pointer coords and element rect\n if (value === true) {\n // if dimensions are negative, \"switch\" edges\n const width = utils.is.number(rect.width )? rect.width : rect.right - rect.left;\n const height = utils.is.number(rect.height)? rect.height : rect.bottom - rect.top ;\n\n if (width < 0) {\n if (name === 'left' ) { name = 'right'; }\n else if (name === 'right') { name = 'left' ; }\n }\n if (height < 0) {\n if (name === 'top' ) { name = 'bottom'; }\n else if (name === 'bottom') { name = 'top' ; }\n }\n\n if (name === 'left' ) { return page.x < ((width >= 0? rect.left: rect.right ) + margin); }\n if (name === 'top' ) { return page.y < ((height >= 0? rect.top : rect.bottom) + margin); }\n\n if (name === 'right' ) { return page.x > ((width >= 0? rect.right : rect.left) - margin); }\n if (name === 'bottom') { return page.y > ((height >= 0? rect.bottom: rect.top ) - margin); }\n }\n\n // the remaining checks require an element\n if (!utils.is.element(element)) { return false; }\n\n return utils.is.element(value)\n // the value is an element to use as a resize handle\n ? value === element\n // otherwise check if element matches value as selector\n : utils.matchesUpTo(element, value, interactableElement);\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.resizeAxes = 'xy';\n});\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action }) {\n if (action !== 'resize' || !interaction.resizeAxes) { return; }\n\n const options = interaction.target.options;\n\n if (options.resize.square) {\n if (interaction.resizeAxes === 'y') {\n iEvent.dx = iEvent.dy;\n }\n else {\n iEvent.dy = iEvent.dx;\n }\n iEvent.axes = 'xy';\n }\n else {\n iEvent.axes = interaction.resizeAxes;\n\n if (interaction.resizeAxes === 'x') {\n iEvent.dy = 0;\n }\n else if (interaction.resizeAxes === 'y') {\n iEvent.dx = 0;\n }\n }\n});\n\nactions.resize = resize;\nactions.names.push('resize');\nutils.merge(Interactable.eventTypes, [\n 'resizestart',\n 'resizemove',\n 'resizeinertiastart',\n 'resizeinertiaresume',\n 'resizeend',\n]);\nactions.methodDict.resize = 'resizable';\n\ndefaultOptions.resize = resize.defaults;\n\nmodule.exports = resize;\n","const raf = require('./utils/raf');\nconst getWindow = require('./utils/window').getWindow;\nconst is = require('./utils/is');\nconst domUtils = require('./utils/domUtils');\nconst Interaction = require('./Interaction');\nconst defaultOptions = require('./defaultOptions');\n\nconst autoScroll = {\n defaults: {\n enabled : false,\n container: null, // the item that is scrolled (Window or HTMLElement)\n margin : 60,\n speed : 300, // the scroll speed in pixels per second\n },\n\n interaction: null,\n i: null, // the handle returned by window.setInterval\n x: 0, y: 0, // Direction each pulse is to scroll in\n\n isScrolling: false,\n prevTime: 0,\n\n start: function (interaction) {\n autoScroll.isScrolling = true;\n raf.cancel(autoScroll.i);\n\n autoScroll.interaction = interaction;\n autoScroll.prevTime = new Date().getTime();\n autoScroll.i = raf.request(autoScroll.scroll);\n },\n\n stop: function () {\n autoScroll.isScrolling = false;\n raf.cancel(autoScroll.i);\n },\n\n // scroll the window by the values in scroll.x/y\n scroll: function () {\n const options = autoScroll.interaction.target.options[autoScroll.interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(autoScroll.interaction.element);\n const now = new Date().getTime();\n // change in time in seconds\n const dt = (now - autoScroll.prevTime) / 1000;\n // displacement\n const s = options.speed * dt;\n\n if (s >= 1) {\n if (is.window(container)) {\n container.scrollBy(autoScroll.x * s, autoScroll.y * s);\n }\n else if (container) {\n container.scrollLeft += autoScroll.x * s;\n container.scrollTop += autoScroll.y * s;\n }\n\n autoScroll.prevTime = now;\n }\n\n if (autoScroll.isScrolling) {\n raf.cancel(autoScroll.i);\n autoScroll.i = raf.request(autoScroll.scroll);\n }\n },\n check: function (interactable, actionName) {\n const options = interactable.options;\n\n return options[actionName].autoScroll && options[actionName].autoScroll.enabled;\n },\n onInteractionMove: function ({ interaction, pointer }) {\n if (!(interaction.interacting()\n && autoScroll.check(interaction.target, interaction.prepared.name))) {\n return;\n }\n\n if (interaction.simulation) {\n autoScroll.x = autoScroll.y = 0;\n return;\n }\n\n let top;\n let right;\n let bottom;\n let left;\n\n const options = interaction.target.options[interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(interaction.element);\n\n if (is.window(container)) {\n left = pointer.clientX < autoScroll.margin;\n top = pointer.clientY < autoScroll.margin;\n right = pointer.clientX > container.innerWidth - autoScroll.margin;\n bottom = pointer.clientY > container.innerHeight - autoScroll.margin;\n }\n else {\n const rect = domUtils.getElementClientRect(container);\n\n left = pointer.clientX < rect.left + autoScroll.margin;\n top = pointer.clientY < rect.top + autoScroll.margin;\n right = pointer.clientX > rect.right - autoScroll.margin;\n bottom = pointer.clientY > rect.bottom - autoScroll.margin;\n }\n\n autoScroll.x = (right ? 1: left? -1: 0);\n autoScroll.y = (bottom? 1: top? -1: 0);\n\n if (!autoScroll.isScrolling) {\n // set the autoScroll properties to those of the target\n autoScroll.margin = options.margin;\n autoScroll.speed = options.speed;\n\n autoScroll.start(interaction);\n }\n },\n};\n\nInteraction.signals.on('stop-active', function () {\n autoScroll.stop();\n});\n\nInteraction.signals.on('action-move', autoScroll.onInteractionMove);\n\ndefaultOptions.perAction.autoScroll = autoScroll.defaults;\n\nmodule.exports = autoScroll;\n","const Interactable = require('../Interactable');\nconst actions = require('../actions/base');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.ignoreFrom\n [ method ]\n *\n * If the target of the `mousedown`, `pointerdown` or `touchstart`\n * event or any of it's parents match the given CSS selector or\n * Element, no drag/resize/gesture is started.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to not ignore any elements\n = (string | Element | object) The current ignoreFrom value or this Interactable\n **\n | interact(element, { ignoreFrom: document.getElementById('no-action') });\n | // or\n | interact(element).ignoreFrom('input, textarea, a');\n\\*/\nInteractable.prototype.ignoreFrom = function (newValue) {\n return this._backCompatOption('ignoreFrom', newValue);\n};\n\n/*\\\n * Interactable.allowFrom\n [ method ]\n *\n * A drag/resize/gesture is started only If the target of the\n * `mousedown`, `pointerdown` or `touchstart` event or any of it's\n * parents match the given CSS selector or Element.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to allow from any element\n = (string | Element | object) The current allowFrom value or this Interactable\n **\n | interact(element, { allowFrom: document.getElementById('drag-handle') });\n | // or\n | interact(element).allowFrom('.handle');\n\\*/\nInteractable.prototype.allowFrom = function (newValue) {\n return this._backCompatOption('allowFrom', newValue);\n};\n\nInteractable.prototype.testIgnore = function (ignoreFrom, interactableElement, element) {\n if (!ignoreFrom || !is.element(element)) { return false; }\n\n if (is.string(ignoreFrom)) {\n return domUtils.matchesUpTo(element, ignoreFrom, interactableElement);\n }\n else if (is.element(ignoreFrom)) {\n return domUtils.nodeContains(ignoreFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testAllow = function (allowFrom, interactableElement, element) {\n if (!allowFrom) { return true; }\n\n if (!is.element(element)) { return false; }\n\n if (is.string(allowFrom)) {\n return domUtils.matchesUpTo(element, allowFrom, interactableElement);\n }\n else if (is.element(allowFrom)) {\n return domUtils.nodeContains(allowFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testIgnoreAllow = function (options, interactableElement, eventTarget) {\n return (!this.testIgnore(options.ignoreFrom, interactableElement, eventTarget)\n && this.testAllow(options.allowFrom, interactableElement, eventTarget));\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (event.buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\n","const interact = require('../interact');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst actions = require('../actions/base');\nconst defaultOptions = require('../defaultOptions');\nconst browser = require('../utils/browser');\nconst scope = require('../scope');\nconst utils = require('../utils');\nconst signals = require('../utils/Signals').new();\n\nrequire('./InteractableMethods');\n\nconst autoStart = {\n signals,\n withinInteractionLimit,\n // Allow this many interactions to happen simultaneously\n maxInteractions: Infinity,\n defaults: {\n perAction: {\n manualStart: false,\n max: Infinity,\n maxPerElement: 1,\n allowFrom: null,\n ignoreFrom: null,\n },\n },\n setActionDefaults: function (action) {\n utils.extend(action.defaults, autoStart.defaults.perAction);\n },\n};\n\n// set cursor style on mousedown\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget }) {\n if (interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\n// set cursor style on mousemove\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget }) {\n if (!interaction.mouse\n || interaction.pointerIsDown\n || interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\nInteraction.signals.on('move', function (arg) {\n const { interaction, event } = arg;\n\n if (!interaction.pointerIsDown\n || interaction.interacting()\n || !interaction.pointerWasMoved\n || !interaction.prepared.name) {\n return;\n }\n\n signals.fire('before-start', arg);\n\n const target = interaction.target;\n\n if (interaction.prepared.name && target) {\n // check manualStart and interaction limit\n if (target.options[interaction.prepared.name].manualStart\n || !withinInteractionLimit(target, interaction.element, interaction.prepared)) {\n interaction.stop(event);\n }\n else {\n interaction.start(interaction.prepared, target, interaction.element);\n }\n }\n});\n\n// Check if the current target supports the action.\n// If so, return the validated action. Otherwise, return null\nfunction validateAction (action, interactable, element, eventTarget) {\n if (utils.is.object(action)\n && interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget)\n && interactable.options[action.name].enabled\n && withinInteractionLimit(interactable, element, action)) {\n return action;\n }\n\n return null;\n}\n\nfunction validateSelector (interaction, pointer, event, matches, matchElements, eventTarget) {\n for (let i = 0, len = matches.length; i < len; i++) {\n const match = matches[i];\n const matchElement = matchElements[i];\n const action = validateAction(match.getAction(pointer, event, interaction, matchElement),\n match,\n matchElement,\n eventTarget);\n\n if (action) {\n return {\n action,\n target: match,\n element: matchElement,\n };\n }\n }\n\n return {};\n}\n\nfunction getActionInfo (interaction, pointer, event, eventTarget) {\n let matches = [];\n let matchElements = [];\n\n let element = eventTarget;\n let action = null;\n\n function pushMatches (interactable, selector, context) {\n const elements = (browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined);\n\n if (utils.matchesSelector(element, selector, elements)) {\n\n matches.push(interactable);\n matchElements.push(element);\n }\n }\n\n while (utils.is.element(element)) {\n matches = [];\n matchElements = [];\n\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && (action = validateAction(elementInteractable.getAction(pointer, event, interaction, element, eventTarget),\n elementInteractable,\n element,\n eventTarget))\n && !elementInteractable.options[action.name].manualStart) {\n return {\n element,\n action,\n target: elementInteractable,\n };\n }\n else {\n scope.interactables.forEachSelector(pushMatches, element);\n\n const actionInfo = validateSelector(interaction, pointer, event, matches, matchElements, eventTarget);\n\n if (actionInfo.action\n && !actionInfo.target.options[actionInfo.action.name].manualStart) {\n return actionInfo;\n }\n }\n\n element = utils.parentNode(element);\n }\n\n return {};\n}\n\nfunction prepare (interaction, { action, target, element }) {\n action = action || {};\n\n if (interaction.target && interaction.target.options.styleCursor) {\n interaction.target._doc.documentElement.style.cursor = '';\n }\n\n interaction.target = target;\n interaction.element = element;\n utils.copyAction(interaction.prepared, action);\n\n if (target && target.options.styleCursor) {\n const cursor = action? actions[action.name].getCursor(action) : '';\n interaction.target._doc.documentElement.style.cursor = cursor;\n }\n\n signals.fire('prepared', { interaction: interaction });\n}\n\nInteraction.signals.on('stop', function ({ interaction }) {\n const target = interaction.target;\n\n if (target && target.options.styleCursor) {\n target._doc.documentElement.style.cursor = '';\n }\n});\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (utils.is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (utils.is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n const buttons = event.buttons || ({\n 0: 1,\n 1: 4,\n 3: 8,\n 4: 16,\n })[event.button];\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\nfunction withinInteractionLimit (interactable, element, action) {\n const options = interactable.options;\n const maxActions = options[action.name].max;\n const maxPerElement = options[action.name].maxPerElement;\n let activeInteractions = 0;\n let targetCount = 0;\n let targetElementCount = 0;\n\n // no actions if any of these values == 0\n if (!(maxActions && maxPerElement && autoStart.maxInteractions)) { return; }\n\n for (let i = 0, len = scope.interactions.length; i < len; i++) {\n const interaction = scope.interactions[i];\n const otherAction = interaction.prepared.name;\n\n if (!interaction.interacting()) { continue; }\n\n activeInteractions++;\n\n if (activeInteractions >= autoStart.maxInteractions) {\n return false;\n }\n\n if (interaction.target !== interactable) { continue; }\n\n targetCount += (otherAction === action.name)|0;\n\n if (targetCount >= maxActions) {\n return false;\n }\n\n if (interaction.element === element) {\n targetElementCount++;\n\n if (otherAction !== action.name || targetElementCount >= maxPerElement) {\n return false;\n }\n }\n }\n\n return autoStart.maxInteractions > 0;\n}\n\n/*\\\n * interact.maxInteractions\n [ method ]\n **\n * Returns or sets the maximum number of concurrent interactions allowed.\n * By default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables\n * and elements, you need to enable it in the draggable, resizable and\n * gesturable `'max'` and `'maxPerElement'` options.\n **\n - newValue (number) #optional Any number. newValue <= 0 means no interactions.\n\\*/\ninteract.maxInteractions = function (newValue) {\n if (utils.is.number(newValue)) {\n autoStart.maxInteractions = newValue;\n\n return this;\n }\n\n return autoStart.maxInteractions;\n};\n\nInteractable.settingsMethods.push('styleCursor');\nInteractable.settingsMethods.push('actionChecker');\nInteractable.settingsMethods.push('ignoreFrom');\nInteractable.settingsMethods.push('allowFrom');\n\ndefaultOptions.base.actionChecker = null;\ndefaultOptions.base.styleCursor = true;\n\nutils.extend(defaultOptions.perAction, autoStart.defaults.perAction);\n\nmodule.exports = autoStart;\n","const autoStart = require('./base');\nconst Interaction = require('../Interaction');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.delayTimer = null;\n});\n\nautoStart.signals.on('prepared', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.delayTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.target, interaction.element);\n }, delay);\n }\n});\n\nInteraction.signals.on('move', function ({ interaction, duplicate }) {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.delayTimer);\n }\n});\n\n// prevent regular down->move autoStart\nautoStart.signals.on('before-start', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.prepared.name = null;\n }\n});\n","const autoStart = require('./base');\nconst scope = require('../scope');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\n\nconst { matchesSelector, parentNode } = require('../utils/domUtils');\n\nautoStart.setActionDefaults(require('../actions/drag'));\n\nautoStart.signals.on('before-start', function ({ interaction, eventTarget, dx, dy }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // check if a drag is in the correct axis\n const absX = Math.abs(dx);\n const absY = Math.abs(dy);\n const options = interaction.target.options.drag;\n const startAxis = options.startAxis;\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy');\n\n interaction.prepared.axis = options.lockAxis === 'start'\n ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n : options.lockAxis;\n\n // if the movement isn't in the startAxis of the interactable\n if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) {\n // cancel the prepared action\n interaction.prepared.name = null;\n\n // then try to get a drag from another ineractable\n\n if (!interaction.prepared.name) {\n\n let element = eventTarget;\n\n const getDraggable = function (interactable, selector, context) {\n const elements = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n if (interactable === interaction.target) { return; }\n\n if (!options.manualStart\n && !interactable.testIgnoreAllow(options, element, eventTarget)\n && matchesSelector(element, selector, elements)) {\n\n const action = interactable.getAction(interaction.downPointer,\n interaction.downEvent,\n interaction,\n element);\n\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, interactable)\n && autoStart.validateAction(action, interactable, element, eventTarget)) {\n\n return interactable;\n }\n }\n };\n\n let action = null;\n\n // check all interactables\n while (is.element(element)) {\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && elementInteractable !== interaction.target\n && !elementInteractable.options.drag.manualStart) {\n\n action = elementInteractable.getAction(interaction.downPointer, interaction.downEvent, interaction, element);\n }\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, elementInteractable)) {\n\n interaction.prepared.name = 'drag';\n interaction.target = elementInteractable;\n interaction.element = element;\n break;\n }\n\n const selectorInteractable = scope.interactables.forEachSelector(getDraggable, element);\n\n if (selectorInteractable) {\n interaction.prepared.name = 'drag';\n interaction.target = selectorInteractable;\n interaction.element = element;\n break;\n }\n\n element = parentNode(element);\n }\n }\n }\n});\n\nfunction checkStartAxis (startAxis, interactable) {\n if (!interactable) { return false; }\n\n const thisAxis = interactable.options.drag.startAxis;\n\n return (startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis);\n}\n","require('./base').setActionDefaults(require('../actions/gesture'));\n","require('./base').setActionDefaults(require('../actions/resize'));\n","module.exports = {\n base: {\n accept : null,\n preventDefault: 'auto',\n deltaSource : 'page',\n },\n\n perAction: {\n origin: { x: 0, y: 0 },\n\n // only allow left button by default\n // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n mouseButtons: 1,\n\n inertia: {\n enabled : false,\n resistance : 10, // the lambda in exponential decay\n minSpeed : 100, // target speed must be above this for inertia to start\n endSpeed : 10, // the speed at which inertia is slow enough to stop\n allowResume : true, // allow resuming an action in inertia phase\n smoothEndDuration: 300, // animate to snap/restrict endOnly if there's no inertia\n },\n },\n};\n","/* browser entry point */\n\n// Legacy browser support\nrequire('./legacyBrowsers');\n\n// inertia\nrequire('./inertia');\n\n// modifiers\nrequire('./modifiers/snap');\nrequire('./modifiers/restrict');\n\n// pointerEvents\nrequire('./pointerEvents/base');\nrequire('./pointerEvents/holdRepeat');\nrequire('./pointerEvents/interactableTargets');\n\n// delay\nrequire('./autoStart/delay');\n\n// actions\nrequire('./actions/gesture');\nrequire('./actions/resize');\nrequire('./actions/drag');\nrequire('./actions/drop');\n\n// load these modifiers after resize is loaded\nrequire('./modifiers/snapSize');\nrequire('./modifiers/restrictEdges');\nrequire('./modifiers/restrictSize');\n\n// autoStart actions\nrequire('./autoStart/gesture');\nrequire('./autoStart/resize');\nrequire('./autoStart/drag');\n\n// Interactable preventDefault setting\nrequire('./interactablePreventDefault.js');\n\n// autoScroll\nrequire('./autoScroll');\n\n// export interact\nmodule.exports = require('./interact');\n","const InteractEvent = require('./InteractEvent');\nconst Interaction = require('./Interaction');\nconst modifiers = require('./modifiers');\nconst utils = require('./utils');\nconst animationFrame = require('./utils/raf');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.inertiaStatus = {\n active : false,\n smoothEnd : false,\n allowResume: false,\n\n startEvent: null,\n upCoords : {},\n\n xe: 0, ye: 0,\n sx: 0, sy: 0,\n\n t0: 0,\n vx0: 0, vys: 0,\n duration: 0,\n\n lambda_v0: 0,\n one_ve_v0: 0,\n i : null,\n };\n\n interaction.boundInertiaFrame = () => inertiaFrame .apply(interaction);\n interaction.boundSmoothEndFrame = () => smoothEndFrame.apply(interaction);\n});\n\nInteraction.signals.on('down', function ({ interaction, event, pointer, eventTarget }) {\n const status = interaction.inertiaStatus;\n\n // Check if the down event hits the current inertia target\n if (status.active) {\n let element = eventTarget;\n\n // climb up the DOM tree from the event target\n while (utils.is.element(element)) {\n\n // if interaction element is the current inertia target element\n if (element === interaction.element) {\n // stop inertia\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n\n // update pointers to the down event's coordinates\n interaction.updatePointer(pointer);\n utils.setCoords(interaction.curCoords, interaction.pointers);\n\n // fire appropriate signals\n const signalArg = { interaction };\n Interaction.signals.fire('before-action-move', signalArg);\n Interaction.signals.fire('action-resume' , signalArg);\n\n // fire a reume event\n const resumeEvent = new InteractEvent(interaction,\n event,\n interaction.prepared.name,\n 'inertiaresume',\n interaction.element);\n\n interaction.target.fire(resumeEvent);\n interaction.prevEvent = resumeEvent;\n modifiers.resetStatuses(interaction.modifierStatuses);\n\n utils.copyCoords(interaction.prevCoords, interaction.curCoords);\n break;\n }\n\n element = utils.parentNode(element);\n }\n }\n});\n\nInteraction.signals.on('up', function ({ interaction, event }) {\n const status = interaction.inertiaStatus;\n\n if (!interaction.interacting() || status.active) { return; }\n\n const target = interaction.target;\n const options = target && target.options;\n const inertiaOptions = options && interaction.prepared.name && options[interaction.prepared.name].inertia;\n\n const now = new Date().getTime();\n const statuses = {};\n const page = utils.extend({}, interaction.curCoords.page);\n const pointerSpeed = interaction.pointerDelta.client.speed;\n\n let smoothEnd = false;\n let modifierResult;\n\n // check if inertia should be started\n const inertiaPossible = (inertiaOptions && inertiaOptions.enabled\n && interaction.prepared.name !== 'gesture'\n && event !== status.startEvent);\n\n const inertia = (inertiaPossible\n && (now - interaction.curCoords.timeStamp) < 50\n && pointerSpeed > inertiaOptions.minSpeed\n && pointerSpeed > inertiaOptions.endSpeed);\n\n const modifierArg = {\n interaction,\n pageCoords: page,\n statuses,\n preEnd: true,\n requireEndOnly: true,\n };\n\n // smoothEnd\n if (inertiaPossible && !inertia) {\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n if (modifierResult.shouldMove && modifierResult.locked) {\n smoothEnd = true;\n }\n }\n\n if (!(inertia || smoothEnd)) { return; }\n\n utils.copyCoords(status.upCoords, interaction.curCoords);\n\n interaction.pointers[0] = status.startEvent =\n new InteractEvent(interaction, event, interaction.prepared.name, 'inertiastart', interaction.element);\n\n status.t0 = now;\n\n status.active = true;\n status.allowResume = inertiaOptions.allowResume;\n interaction.simulation = status;\n\n target.fire(status.startEvent);\n\n if (inertia) {\n status.vx0 = interaction.pointerDelta.client.vx;\n status.vy0 = interaction.pointerDelta.client.vy;\n status.v0 = pointerSpeed;\n\n calcInertia(interaction, status);\n\n utils.extend(page, interaction.curCoords.page);\n\n page.x += status.xe;\n page.y += status.ye;\n\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n status.modifiedXe += modifierResult.dx;\n status.modifiedYe += modifierResult.dy;\n\n status.i = animationFrame.request(interaction.boundInertiaFrame);\n }\n else {\n status.smoothEnd = true;\n status.xe = modifierResult.dx;\n status.ye = modifierResult.dy;\n\n status.sx = status.sy = 0;\n\n status.i = animationFrame.request(interaction.boundSmoothEndFrame);\n }\n});\n\nInteraction.signals.on('stop-active', function ({ interaction }) {\n const status = interaction.inertiaStatus;\n\n if (status.active) {\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n }\n});\n\nfunction calcInertia (interaction, status) {\n const inertiaOptions = interaction.target.options[interaction.prepared.name].inertia;\n const lambda = inertiaOptions.resistance;\n const inertiaDur = -Math.log(inertiaOptions.endSpeed / status.v0) / lambda;\n\n status.x0 = interaction.prevEvent.pageX;\n status.y0 = interaction.prevEvent.pageY;\n status.t0 = status.startEvent.timeStamp / 1000;\n status.sx = status.sy = 0;\n\n status.modifiedXe = status.xe = (status.vx0 - inertiaDur) / lambda;\n status.modifiedYe = status.ye = (status.vy0 - inertiaDur) / lambda;\n status.te = inertiaDur;\n\n status.lambda_v0 = lambda / status.v0;\n status.one_ve_v0 = 1 - inertiaOptions.endSpeed / status.v0;\n}\n\nfunction inertiaFrame () {\n updateInertiaCoords(this);\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n\n const status = this.inertiaStatus;\n const options = this.target.options[this.prepared.name].inertia;\n const lambda = options.resistance;\n const t = new Date().getTime() / 1000 - status.t0;\n\n if (t < status.te) {\n\n const progress = 1 - (Math.exp(-lambda * t) - status.lambda_v0) / status.one_ve_v0;\n\n if (status.modifiedXe === status.xe && status.modifiedYe === status.ye) {\n status.sx = status.xe * progress;\n status.sy = status.ye * progress;\n }\n else {\n const quadPoint = utils.getQuadraticCurvePoint(0, 0,\n status.xe,\n status.ye,\n status.modifiedXe,\n status.modifiedYe,\n progress);\n\n status.sx = quadPoint.x;\n status.sy = quadPoint.y;\n }\n\n this.doMove();\n\n status.i = animationFrame.request(this.boundInertiaFrame);\n }\n else {\n status.sx = status.modifiedXe;\n status.sy = status.modifiedYe;\n\n this.doMove();\n this.end(status.startEvent);\n status.active = false;\n this.simulation = null;\n }\n\n utils.copyCoords(this.prevCoords, this.curCoords);\n}\n\nfunction smoothEndFrame () {\n updateInertiaCoords(this);\n\n const status = this.inertiaStatus;\n const t = new Date().getTime() - status.t0;\n const duration = this.target.options[this.prepared.name].inertia.smoothEndDuration;\n\n if (t < duration) {\n status.sx = utils.easeOutQuad(t, 0, status.xe, duration);\n status.sy = utils.easeOutQuad(t, 0, status.ye, duration);\n\n this.pointerMove(status.startEvent, status.startEvent);\n\n status.i = animationFrame.request(this.boundSmoothEndFrame);\n }\n else {\n status.sx = status.xe;\n status.sy = status.ye;\n\n this.pointerMove(status.startEvent, status.startEvent);\n this.end(status.startEvent);\n\n status.smoothEnd =\n status.active = false;\n this.simulation = null;\n }\n}\n\nfunction updateInertiaCoords (interaction) {\n const status = interaction.inertiaStatus;\n\n // return if inertia isn't running\n if (!status.active) { return; }\n\n const pageUp = status.upCoords.page;\n const clientUp = status.upCoords.client;\n\n utils.setCoords(interaction.curCoords, [ {\n pageX : pageUp.x + status.sx,\n pageY : pageUp.y + status.sy,\n clientX: clientUp.x + status.sx,\n clientY: clientUp.y + status.sy,\n } ]);\n}\n","const browser = require('./utils/browser');\nconst events = require('./utils/events');\nconst utils = require('./utils');\nconst scope = require('./scope');\nconst Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\n\nconst globalEvents = {};\n\n/*\\\n * interact\n [ method ]\n *\n * The methods of this variable can be used to set elements as\n * interactables and also to change various default settings.\n *\n * Calling it as a function and passing an element or a valid CSS selector\n * string returns an Interactable object which has various methods to\n * configure it.\n *\n - element (Element | string) The HTML or SVG Element to interact with or CSS selector\n = (object) An @Interactable\n *\n > Usage\n | interact('#draggable').draggable(true);\n |\n | var rectables = interact('rect');\n | rectables\n | .gesturable(true)\n | .on('gesturemove', function (event) {\n | // ...\n | });\n\\*/\nfunction interact (element, options) {\n let interactable = scope.interactables.get(element, options);\n\n if (!interactable) {\n interactable = new Interactable(element, options);\n interactable.events.global = globalEvents;\n }\n\n return interactable;\n}\n\n/*\\\n * interact.isSet\n [ method ]\n *\n * Check if an element has been set\n - element (Element) The Element being searched for\n = (boolean) Indicates if the element or CSS selector was previously passed to interact\n\\*/\ninteract.isSet = function (element, options) {\n return scope.interactables.indexOfElement(element, options && options.context) !== -1;\n};\n\n/*\\\n * interact.on\n [ method ]\n *\n * Adds a global listener for an InteractEvent or adds a DOM event to\n * `document`\n *\n - type (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) interact\n\\*/\ninteract.on = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.on(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.on(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n // if it is an InteractEvent type, add listener to globalEvents\n if (utils.contains(Interactable.eventTypes, type)) {\n // if this type of event was never bound\n if (!globalEvents[type]) {\n globalEvents[type] = [listener];\n }\n else {\n globalEvents[type].push(listener);\n }\n }\n // If non InteractEvent type, addEventListener to document\n else {\n events.add(scope.document, type, listener, { options });\n }\n\n return interact;\n};\n\n/*\\\n * interact.off\n [ method ]\n *\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n - type (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) interact\n \\*/\ninteract.off = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.off(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.off(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n if (!utils.contains(Interactable.eventTypes, type)) {\n events.remove(scope.document, type, listener, options);\n }\n else {\n let index;\n\n if (type in globalEvents\n && (index = utils.indexOf(globalEvents[type], listener)) !== -1) {\n globalEvents[type].splice(index, 1);\n }\n }\n\n return interact;\n};\n\n/*\\\n * interact.debug\n [ method ]\n *\n * Returns an object which exposes internal data\n = (object) An object with properties that outline the current state and expose internal functions and variables\n\\*/\ninteract.debug = function () {\n return scope;\n};\n\n// expose the functions used to calculate multi-touch properties\ninteract.getPointerAverage = utils.pointerAverage;\ninteract.getTouchBBox = utils.touchBBox;\ninteract.getTouchDistance = utils.touchDistance;\ninteract.getTouchAngle = utils.touchAngle;\n\ninteract.getElementRect = utils.getElementRect;\ninteract.getElementClientRect = utils.getElementClientRect;\ninteract.matchesSelector = utils.matchesSelector;\ninteract.closest = utils.closest;\n\n/*\\\n * interact.supportsTouch\n [ method ]\n *\n = (boolean) Whether or not the browser supports touch input\n\\*/\ninteract.supportsTouch = function () {\n return browser.supportsTouch;\n};\n\n/*\\\n * interact.supportsPointerEvent\n [ method ]\n *\n = (boolean) Whether or not the browser supports PointerEvents\n\\*/\ninteract.supportsPointerEvent = function () {\n return browser.supportsPointerEvent;\n};\n\n/*\\\n * interact.stop\n [ method ]\n *\n * Cancels all interactions (end events are not fired)\n *\n - event (Event) An event on which to call preventDefault()\n = (object) interact\n\\*/\ninteract.stop = function (event) {\n for (let i = scope.interactions.length - 1; i >= 0; i--) {\n scope.interactions[i].stop(event);\n }\n\n return interact;\n};\n\n/*\\\n * interact.pointerMoveTolerance\n [ method ]\n * Returns or sets the distance the pointer must be moved before an action\n * sequence occurs. This also affects tolerance for tap events.\n *\n - newValue (number) #optional The movement from the start position must be greater than this value\n = (number | Interactable) The current setting or interact\n\\*/\ninteract.pointerMoveTolerance = function (newValue) {\n if (utils.is.number(newValue)) {\n Interaction.pointerMoveTolerance = newValue;\n\n return this;\n }\n\n return Interaction.pointerMoveTolerance;\n};\n\ninteract.addDocument = scope.addDocument;\ninteract.removeDocument = scope.removeDocument;\n\nscope.interact = interact;\n\nmodule.exports = interact;\n","const Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\nconst scope = require('./scope');\nconst is = require('./utils/is');\nconst events = require('./utils/events');\n\nconst { nodeContains, matchesSelector } = require('./utils/domUtils');\n\n/*\\\n * Interactable.preventDefault\n [ method ]\n *\n * Returns or sets whether to prevent the browser's default behaviour\n * in response to pointer events. Can be set to:\n * - `'always'` to always prevent\n * - `'never'` to never prevent\n * - `'auto'` to let interact.js try to determine what would be best\n *\n - newValue (string) #optional `true`, `false` or `'auto'`\n = (string | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.preventDefault = function (newValue) {\n if (/^(always|never|auto)$/.test(newValue)) {\n this.options.preventDefault = newValue;\n return this;\n }\n\n if (is.bool(newValue)) {\n this.options.preventDefault = newValue? 'always' : 'never';\n return this;\n }\n\n return this.options.preventDefault;\n};\n\nInteractable.prototype.checkAndPreventDefault = function (event) {\n const setting = this.options.preventDefault;\n\n if (setting === 'never') { return; }\n\n if (setting === 'always') {\n event.preventDefault();\n return;\n }\n\n // setting === 'auto'\n\n // don't preventDefault if the browser supports passiveEvents\n // CSS touch-action and user-selecct should be used instead\n if (events.supportsOptions) {\n return;\n }\n\n // don't preventDefault of pointerdown events\n if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) {\n return;\n }\n\n // don't preventDefault on editable elements\n if (is.element(event.target)\n && matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) {\n return;\n }\n\n event.preventDefault();\n};\n\nfunction onInteractionEvent ({ interaction, event }) {\n if (interaction.target) {\n interaction.target.checkAndPreventDefault(event);\n }\n}\n\nfor (const eventSignal of ['down', 'move', 'up', 'cancel']) {\n Interaction.signals.on(eventSignal, onInteractionEvent);\n}\n\n// prevent native HTML5 drag on interact.js target elements\nInteraction.docEvents.dragstart = function preventNativeDrag (event) {\n for (const interaction of scope.interactions) {\n\n if (interaction.element\n && (interaction.element === event.target\n || nodeContains(interaction.element, event.target))) {\n\n interaction.target.checkAndPreventDefault(event);\n return;\n }\n }\n};\n","const scope = require('./scope');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst iFinder = require('./utils/interactionFinder');\nconst pointerEvents = require('./pointerEvents/base');\n\nconst { window } = require('./utils/window');\n\nconst toString = Object.prototype.toString;\n\nif (!window.Array.isArray) {\n window.Array.isArray = function (obj) {\n return toString.call(obj) === '[object Array]';\n };\n}\n\nif (!String.prototype.trim) {\n String.prototype.trim = function () {\n return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n };\n}\n\n// http://www.quirksmode.org/dom/events/click.html\n// >Events leading to dblclick\n//\n// IE8 doesn't fire down event before dblclick.\n// This workaround tries to fire a tap and doubletap after dblclick\nfunction onIE8Dblclick (event) {\n const eventTarget = event.target;\n const interaction = iFinder.search(event, event.type, eventTarget);\n\n if (!interaction) { return; }\n\n if (interaction.prevTap\n && event.clientX === interaction.prevTap.clientX\n && event.clientY === interaction.prevTap.clientY\n && eventTarget === interaction.prevTap.target) {\n\n interaction.downTargets[0] = eventTarget;\n interaction.downTimes [0] = new Date().getTime();\n\n pointerEvents.fire({\n interaction,\n event,\n eventTarget,\n pointer: event,\n type: 'tap',\n });\n }\n}\n\nif (browser.isIE8) {\n const selectFix = function (event) {\n for (const interaction of scope.interactions) {\n if (interaction.interacting()) {\n interaction.target.checkAndPreventDefault(event);\n }\n }\n };\n\n const onDocIE8 = function onDocIE8 ({ doc, win }, signalName) {\n const eventMethod = signalName.indexOf('listen') === 0\n ? events.add : events.remove;\n\n // For IE's lack of Event#preventDefault\n eventMethod(doc, 'selectstart', selectFix);\n\n if (pointerEvents) {\n eventMethod(doc, 'dblclick', onIE8Dblclick);\n }\n };\n\n scope.signals.on('add-document' , onDocIE8);\n scope.signals.on('remove-document', onDocIE8);\n}\n\nmodule.exports = null;\n","const InteractEvent = require('../InteractEvent');\nconst Interaction = require('../Interaction');\nconst extend = require('../utils/extend');\n\nconst modifiers = {\n names: [],\n\n setOffsets: function (arg) {\n const { interaction, pageCoords: page } = arg;\n const { target, element, startOffset } = interaction;\n const rect = target.getRect(element);\n\n if (rect) {\n startOffset.left = page.x - rect.left;\n startOffset.top = page.y - rect.top;\n\n startOffset.right = rect.right - page.x;\n startOffset.bottom = rect.bottom - page.y;\n\n if (!('width' in rect)) { rect.width = rect.right - rect.left; }\n if (!('height' in rect)) { rect.height = rect.bottom - rect.top ; }\n }\n else {\n startOffset.left = startOffset.top = startOffset.right = startOffset.bottom = 0;\n }\n\n arg.rect = rect;\n arg.interactable = target;\n arg.element = element;\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n\n arg.options = target.options[interaction.prepared.name][modifierName];\n\n if (!arg.options) {\n continue;\n }\n\n interaction.modifierOffsets[modifierName] = modifiers[modifierName].setOffset(arg);\n }\n },\n\n setAll: function (arg) {\n const { interaction, statuses, preEnd, requireEndOnly } = arg;\n const coords = extend({}, arg.pageCoords);\n const result = {\n dx: 0,\n dy: 0,\n changed: false,\n locked: false,\n shouldMove: true,\n };\n\n for (const modifierName of modifiers.names) {\n const modifier = modifiers[modifierName];\n const options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!shouldDo(options, preEnd, requireEndOnly)) { continue; }\n\n arg.status = arg.status = statuses[modifierName];\n arg.options = options;\n arg.offset = arg.interaction.modifierOffsets[modifierName];\n\n modifier.set(arg);\n\n if (arg.status.locked) {\n coords.x += arg.status.dx;\n coords.y += arg.status.dy;\n\n result.dx += arg.status.dx;\n result.dy += arg.status.dy;\n\n result.locked = true;\n }\n }\n\n // a move should be fired if:\n // - there are no modifiers enabled,\n // - no modifiers are \"locked\" i.e. have changed the pointer's coordinates, or\n // - the locked coords have changed since the last pointer move\n result.shouldMove = !arg.status || !result.locked || arg.status.changed;\n\n return result;\n },\n\n resetStatuses: function (statuses) {\n for (const modifierName of modifiers.names) {\n const status = statuses[modifierName] || {};\n\n status.dx = status.dy = 0;\n status.modifiedX = status.modifiedY = NaN;\n status.locked = false;\n status.changed = true;\n\n statuses[modifierName] = status;\n }\n\n return statuses;\n },\n\n start: function ({ interaction }, signalName) {\n const arg = {\n interaction,\n pageCoords: (signalName === 'action-resume' ?\n interaction.curCoords : interaction.startCoords).page,\n startOffset: interaction.startOffset,\n statuses: interaction.modifierStatuses,\n preEnd: false,\n requireEndOnly: false,\n };\n\n modifiers.setOffsets(arg);\n modifiers.resetStatuses(arg.statuses);\n\n arg.pageCoords = extend({}, interaction.startCoords.page);\n interaction.modifierResult = modifiers.setAll(arg);\n },\n};\n\nInteraction.signals.on('new', function (interaction) {\n interaction.startOffset = { left: 0, right: 0, top: 0, bottom: 0 };\n interaction.modifierOffsets = {};\n interaction.modifierStatuses = modifiers.resetStatuses({});\n interaction.modifierResult = null;\n});\n\nInteraction.signals.on('action-start' , modifiers.start);\nInteraction.signals.on('action-resume', modifiers.start);\n\nInteraction.signals.on('before-action-move', function ({ interaction, preEnd, interactingBeforeMove }) {\n const modifierResult = modifiers.setAll({\n interaction,\n preEnd,\n pageCoords: interaction.curCoords.page,\n statuses: interaction.modifierStatuses,\n requireEndOnly: false,\n });\n\n // don't fire an action move if a modifier would keep the event in the same\n // cordinates as before\n if (!modifierResult.shouldMove && interactingBeforeMove) {\n interaction._dontFireMove = true;\n }\n\n interaction.modifierResult = modifierResult;\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n for (let i = 0; i < modifiers.names.length; i++) {\n const options = interaction.target.options[interaction.prepared.name][modifiers.names[i]];\n\n // if the endOnly option is true for any modifier\n if (shouldDo(options, true, true)) {\n // fire a move event at the modified coordinates\n interaction.doMove({ event, preEnd: true });\n break;\n }\n }\n});\n\nInteractEvent.signals.on('set-xy', function (arg) {\n const { iEvent, interaction } = arg;\n const modifierArg = extend({}, arg);\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n modifierArg.options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!modifierArg.options) {\n continue;\n }\n\n const modifier = modifiers[modifierName];\n\n modifierArg.status = interaction.modifierStatuses[modifierName];\n\n iEvent[modifierName] = modifier.modifyCoords(modifierArg);\n }\n});\n\nfunction shouldDo (options, preEnd, requireEndOnly) {\n return (options && options.enabled\n && (preEnd || !options.endOnly)\n && (!requireEndOnly || options.endOnly));\n}\n\nmodule.exports = modifiers;\n","const modifiers = require('./index');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst restrict = {\n defaults: {\n enabled : false,\n endOnly : false,\n restriction: null,\n elementRect: null,\n },\n\n setOffset: function ({ rect, startOffset, options }) {\n const elementRect = options && options.elementRect;\n const offset = {};\n\n if (rect && elementRect) {\n offset.left = startOffset.left - (rect.width * elementRect.left);\n offset.top = startOffset.top - (rect.height * elementRect.top);\n\n offset.right = startOffset.right - (rect.width * (1 - elementRect.right));\n offset.bottom = startOffset.bottom - (rect.height * (1 - elementRect.bottom));\n }\n else {\n offset.left = offset.top = offset.right = offset.bottom = 0;\n }\n\n return offset;\n },\n\n set: function ({ pageCoords, interaction, status, options }) {\n if (!options) { return status; }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n\n const restriction = getRestrictionRect(options.restriction, interaction, page);\n\n if (!restriction) { return status; }\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n const rect = restriction;\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n const offset = interaction.modifierOffsets.restrict;\n\n // object is assumed to have\n // x, y, width, height or\n // left, top, right, bottom\n if ('x' in restriction && 'y' in restriction) {\n modifiedX = Math.max(Math.min(rect.x + rect.width - offset.right , page.x), rect.x + offset.left);\n modifiedY = Math.max(Math.min(rect.y + rect.height - offset.bottom, page.y), rect.y + offset.top );\n }\n else {\n modifiedX = Math.max(Math.min(rect.right - offset.right , page.x), rect.left + offset.left);\n modifiedY = Math.max(Math.min(rect.bottom - offset.bottom, page.y), rect.top + offset.top );\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const elementRect = options && options.elementRect;\n\n if (options && options.enabled\n && !(phase === 'start' && elementRect && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n getRestrictionRect,\n};\n\nfunction getRestrictionRect (value, interaction, page) {\n if (utils.is.function(value)) {\n return utils.resolveRectLike(value, interaction.target, interaction.element, [page.x, page.y, interaction]);\n } else {\n return utils.resolveRectLike(value, interaction.target, interaction.element);\n }\n}\n\nmodifiers.restrict = restrict;\nmodifiers.names.push('restrict');\n\ndefaultOptions.perAction.restrict = restrict.defaults;\n\nmodule.exports = restrict;\n","// This module adds the options.resize.restrictEdges setting which sets min and\n// max for the top, left, bottom and right edges of the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictEdges: {\n// inner: { top: 200, left: 200, right: 400, bottom: 400 },\n// outer: { top: 0, left: 0, right: 600, bottom: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst { getRestrictionRect } = require('./restrict');\n\nconst noInner = { top: +Infinity, left: +Infinity, bottom: -Infinity, right: -Infinity };\nconst noOuter = { top: -Infinity, left: -Infinity, bottom: +Infinity, right: +Infinity };\n\nconst restrictEdges = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n offset: null,\n },\n\n setOffset: function ({ interaction, startOffset, options }) {\n if (!options) {\n return utils.extend({}, startOffset);\n }\n\n const offset = getRestrictionRect(options.offset, interaction, interaction.startCoords.page);\n\n if (offset) {\n return {\n top: startOffset.top + offset.y,\n left: startOffset.left + offset.x,\n bottom: startOffset.bottom + offset.y,\n right: startOffset.right + offset.x,\n };\n }\n\n return startOffset;\n },\n\n set: function ({ pageCoords, interaction, status, offset, options }) {\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n const inner = rectUtils.xywhToTlbr(getRestrictionRect(options.inner, interaction, page)) || noInner;\n const outer = rectUtils.xywhToTlbr(getRestrictionRect(options.outer, interaction, page)) || noOuter;\n\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n if (edges.top) {\n modifiedY = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top);\n }\n else if (edges.bottom) {\n modifiedY = Math.max(Math.min(outer.bottom - offset.bottom, page.y), inner.bottom - offset.bottom);\n }\n if (edges.left) {\n modifiedX = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left);\n }\n else if (edges.right) {\n modifiedX = Math.max(Math.min(outer.right - offset.right, page.x), inner.right - offset.right);\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n if (options && options.enabled\n && !(phase === 'start' && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n noInner,\n noOuter,\n getRestrictionRect,\n};\n\nmodifiers.restrictEdges = restrictEdges;\nmodifiers.names.push('restrictEdges');\n\ndefaultOptions.perAction.restrictEdges = restrictEdges.defaults;\nresize.defaults.restrictEdges = restrictEdges.defaults;\n\nmodule.exports = restrictEdges;\n","// This module adds the options.resize.restrictSize setting which sets min and\n// max width and height for the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictSize: {\n// min: { width: -600, height: -600 },\n// max: { width: 600, height: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst restrictEdges = require('./restrictEdges');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst noMin = { width: -Infinity, height: -Infinity };\nconst noMax = { width: +Infinity, height: +Infinity };\n\nconst restrictSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n },\n\n setOffset: function ({ interaction }) {\n return interaction.startOffset;\n },\n\n set: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const rect = rectUtils.xywhToTlbr(interaction.resizeRects.inverted);\n\n const minSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.min, interaction)) || noMin;\n const maxSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.max, interaction)) || noMax;\n\n arg.options = {\n enabled: options.enabled,\n endOnly: options.endOnly,\n inner: utils.extend({}, restrictEdges.noInner),\n outer: utils.extend({}, restrictEdges.noOuter),\n };\n\n if (edges.top) {\n arg.options.inner.top = rect.bottom - minSize.height;\n arg.options.outer.top = rect.bottom - maxSize.height;\n }\n else if (edges.bottom) {\n arg.options.inner.bottom = rect.top + minSize.height;\n arg.options.outer.bottom = rect.top + maxSize.height;\n }\n if (edges.left) {\n arg.options.inner.left = rect.right - minSize.width;\n arg.options.outer.left = rect.right - maxSize.width;\n }\n else if (edges.right) {\n arg.options.inner.right = rect.left + minSize.width;\n arg.options.outer.right = rect.left + maxSize.width;\n }\n\n restrictEdges.set(arg);\n },\n\n modifyCoords: restrictEdges.modifyCoords,\n};\n\nmodifiers.restrictSize = restrictSize;\nmodifiers.names.push('restrictSize');\n\ndefaultOptions.perAction.restrictSize = restrictSize.defaults;\nresize.defaults.restrictSize = restrictSize.defaults;\n\nmodule.exports = restrictSize;\n","const modifiers = require('./index');\nconst interact = require('../interact');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst snap = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n\n relativePoints: null,\n },\n\n setOffset: function ({ interaction, interactable, element, rect, startOffset, options }) {\n const offsets = [];\n const optionsOrigin = utils.rectToXY(utils.resolveRectLike(options.origin));\n const origin = optionsOrigin || utils.getOriginXY(interactable, element, interaction.prepared.name);\n options = options || interactable.options[interaction.prepared.name].snap || {};\n\n let snapOffset;\n\n if (options.offset === 'startCoords') {\n snapOffset = {\n x: interaction.startCoords.page.x - origin.x,\n y: interaction.startCoords.page.y - origin.y,\n };\n }\n else {\n const offsetRect = utils.resolveRectLike(options.offset, interactable, element, [interaction]);\n\n snapOffset = utils.rectToXY(offsetRect) || { x: 0, y: 0 };\n }\n\n if (rect && options.relativePoints && options.relativePoints.length) {\n for (const { x: relativeX, y: relativeY } of options.relativePoints) {\n offsets.push({\n x: startOffset.left - (rect.width * relativeX) + snapOffset.x,\n y: startOffset.top - (rect.height * relativeY) + snapOffset.y,\n });\n }\n }\n else {\n offsets.push(snapOffset);\n }\n\n return offsets;\n },\n\n set: function ({ interaction, pageCoords, status, options, offset: offsets }) {\n const targets = [];\n let target;\n let page;\n let i;\n\n if (status.useStatusXY) {\n page = { x: status.x, y: status.y };\n }\n else {\n const origin = utils.getOriginXY(interaction.target, interaction.element, interaction.prepared.name);\n\n page = utils.extend({}, pageCoords);\n\n page.x -= origin.x;\n page.y -= origin.y;\n }\n\n status.realX = page.x;\n status.realY = page.y;\n\n let len = options.targets? options.targets.length : 0;\n\n for (const { x: offsetX, y: offsetY } of offsets) {\n const relativeX = page.x - offsetX;\n const relativeY = page.y - offsetY;\n\n for (const snapTarget of options.targets) {\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n targets.push({\n x: utils.is.number(target.x) ? (target.x + offsetX) : relativeX,\n y: utils.is.number(target.y) ? (target.y + offsetY) : relativeY,\n\n range: utils.is.number(target.range)? target.range: options.range,\n });\n }\n }\n\n const closest = {\n target: null,\n inRange: false,\n distance: 0,\n range: 0,\n dx: 0,\n dy: 0,\n };\n\n for (i = 0, len = targets.length; i < len; i++) {\n target = targets[i];\n\n const range = target.range;\n const dx = target.x - page.x;\n const dy = target.y - page.y;\n const distance = utils.hypot(dx, dy);\n let inRange = distance <= range;\n\n // Infinite targets count as being out of range\n // compared to non infinite ones that are in range\n if (range === Infinity && closest.inRange && closest.range !== Infinity) {\n inRange = false;\n }\n\n if (!closest.target || (inRange\n // is the closest target in range?\n ? (closest.inRange && range !== Infinity\n // the pointer is relatively deeper in this target\n ? distance / range < closest.distance / closest.range\n // this target has Infinite range and the closest doesn't\n : (range === Infinity && closest.range !== Infinity)\n // OR this target is closer that the previous closest\n || distance < closest.distance)\n // The other is not in range and the pointer is closer to this target\n : (!closest.inRange && distance < closest.distance))) {\n\n closest.target = target;\n closest.distance = distance;\n closest.range = range;\n closest.inRange = inRange;\n closest.dx = dx;\n closest.dy = dy;\n\n status.range = range;\n }\n }\n\n let snapChanged;\n\n if (closest.target) {\n snapChanged = (status.modifiedX !== closest.target.x || status.modifiedY !== closest.target.y);\n\n status.modifiedX = closest.target.x;\n status.modifiedY = closest.target.y;\n }\n else {\n snapChanged = true;\n\n status.modifiedX = NaN;\n status.modifiedY = NaN;\n }\n\n status.dx = closest.dx;\n status.dy = closest.dy;\n\n status.changed = (snapChanged || (closest.inRange && !status.locked));\n status.locked = closest.inRange;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const relativePoints = options && options.relativePoints;\n\n if (options && options.enabled\n && !(phase === 'start' && relativePoints && relativePoints.length)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n }\n\n return {\n range : status.range,\n locked : status.locked,\n x : status.modifiedX,\n y : status.modifiedY,\n realX : status.realX,\n realY : status.realY,\n dx : status.dx,\n dy : status.dy,\n };\n }\n },\n};\n\ninteract.createSnapGrid = function (grid) {\n return function (x, y) {\n const limits = grid.limits || {\n left : -Infinity,\n right : Infinity,\n top : -Infinity,\n bottom: Infinity,\n };\n let offsetX = 0;\n let offsetY = 0;\n\n if (utils.is.object(grid.offset)) {\n offsetX = grid.offset.x;\n offsetY = grid.offset.y;\n }\n\n const gridx = Math.round((x - offsetX) / grid.x);\n const gridy = Math.round((y - offsetY) / grid.y);\n\n const newX = Math.max(limits.left, Math.min(limits.right , gridx * grid.x + offsetX));\n const newY = Math.max(limits.top , Math.min(limits.bottom, gridy * grid.y + offsetY));\n\n return {\n x: newX,\n y: newY,\n range: grid.range,\n };\n };\n};\n\nmodifiers.snap = snap;\nmodifiers.names.push('snap');\n\ndefaultOptions.perAction.snap = snap.defaults;\n\nmodule.exports = snap;\n","// This module allows snapping of the size of targets during resize\n// interactions.\n\nconst modifiers = require('./index');\nconst snap = require('./snap');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\nconst utils = require('../utils/');\n\nconst snapSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n },\n\n setOffset: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.edges;\n\n if (!edges) { return; }\n\n arg.options = {\n relativePoints: [{\n x: edges.left? 0 : 1,\n y: edges.top ? 0 : 1,\n }],\n origin: { x: 0, y: 0 },\n offset: 'self',\n range: options.range,\n };\n\n const offsets = snap.setOffset(arg);\n arg.options = options;\n\n return offsets;\n },\n\n set: function (arg) {\n const { interaction, options, offset, pageCoords } = arg;\n const page = utils.extend({}, pageCoords);\n const relativeX = page.x - offset[0].x;\n const relativeY = page.y - offset[0].y;\n\n arg.options = utils.extend({}, options);\n arg.options.targets = [];\n\n for (const snapTarget of options.targets) {\n let target;\n\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n if ('width' in target && 'height' in target) {\n target.x = target.width;\n target.y = target.height;\n }\n\n arg.options.targets.push(target);\n }\n\n snap.set(arg);\n },\n\n modifyCoords: function (arg) {\n const { options } = arg;\n\n arg.options = utils.extend({}, options);\n arg.options.enabled = options.enabled;\n arg.options.relativePoints = [null];\n\n snap.modifyCoords(arg);\n },\n};\n\nmodifiers.snapSize = snapSize;\nmodifiers.names.push('snapSize');\n\ndefaultOptions.perAction.snapSize = snapSize.defaults;\nresize.defaults.snapSize = snapSize.defaults;\n\nmodule.exports = snapSize;\n","const pointerUtils = require('../utils/pointerUtils');\n\nmodule.exports = class PointerEvent {\n constructor (type, pointer, event, eventTarget, interaction) {\n pointerUtils.pointerExtend(this, event);\n\n if (event !== pointer) {\n pointerUtils.pointerExtend(this, pointer);\n }\n\n this.interaction = interaction;\n\n this.timeStamp = new Date().getTime();\n this.originalEvent = event;\n this.type = type;\n this.pointerId = pointerUtils.getPointerId(pointer);\n this.pointerType = pointerUtils.getPointerType(pointer);\n this.target = eventTarget;\n this.currentTarget = null;\n\n if (type === 'tap') {\n const pointerIndex = interaction.getPointerIndex(pointer);\n this.dt = this.timeStamp - interaction.downTimes[pointerIndex];\n\n const interval = this.timeStamp - interaction.tapTime;\n\n this.double = !!(interaction.prevTap\n && interaction.prevTap.type !== 'doubletap'\n && interaction.prevTap.target === this.target\n && interval < 500);\n }\n else if (type === 'doubletap') {\n this.dt = pointer.timeStamp - interaction.tapTime;\n }\n }\n\n subtractOrigin ({ x: originX, y: originY }) {\n this.pageX -= originX;\n this.pageY -= originY;\n this.clientX -= originX;\n this.clientY -= originY;\n\n return this;\n }\n\n addOrigin ({ x: originX, y: originY }) {\n this.pageX += originX;\n this.pageY += originY;\n this.clientX += originX;\n this.clientY += originY;\n\n return this;\n }\n\n preventDefault () {\n this.originalEvent.preventDefault();\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n};\n","const PointerEvent = require('./PointerEvent');\nconst Interaction = require('../Interaction');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst defaults = require('../defaultOptions');\nconst signals = require('../utils/Signals').new();\nconst { filter } = require('../utils/arr');\n\nconst simpleSignals = [ 'down', 'up', 'cancel' ];\nconst simpleEvents = [ 'down', 'up', 'cancel' ];\n\nconst pointerEvents = {\n PointerEvent,\n fire,\n collectEventTargets,\n signals,\n defaults: {\n holdDuration: 600,\n ignoreFrom : null,\n allowFrom : null,\n origin : { x: 0, y: 0 },\n },\n types: [\n 'down',\n 'move',\n 'up',\n 'cancel',\n 'tap',\n 'doubletap',\n 'hold',\n ],\n};\n\nfunction fire (arg) {\n const {\n interaction, pointer, event, eventTarget,\n type = arg.pointerEvent.type,\n targets = collectEventTargets(arg),\n pointerEvent = new PointerEvent(type, pointer, event, eventTarget, interaction),\n } = arg;\n\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n targets,\n type,\n pointerEvent,\n };\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n\n for (const prop in target.props || {}) {\n pointerEvent[prop] = target.props[prop];\n }\n\n const origin = utils.getOriginXY(target.eventable, target.element);\n\n pointerEvent.subtractOrigin(origin);\n pointerEvent.eventable = target.eventable;\n pointerEvent.currentTarget = target.element;\n\n target.eventable.fire(pointerEvent);\n\n pointerEvent.addOrigin(origin);\n\n if (pointerEvent.immediatePropagationStopped\n || (pointerEvent.propagationStopped\n && (i + 1) < targets.length && targets[i + 1].element !== pointerEvent.currentTarget)) {\n break;\n }\n }\n\n signals.fire('fired', signalArg);\n\n if (type === 'tap') {\n // if pointerEvent should make a double tap, create and fire a doubletap\n // PointerEvent and use that as the prevTap\n const prevTap = pointerEvent.double\n ? fire({\n interaction, pointer, event, eventTarget,\n type: 'doubletap',\n })\n : pointerEvent;\n\n interaction.prevTap = prevTap;\n interaction.tapTime = prevTap.timeStamp;\n }\n\n return pointerEvent;\n}\n\nfunction collectEventTargets ({ interaction, pointer, event, eventTarget, type }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n // do not fire a tap event if the pointer was moved before being lifted\n if (type === 'tap' && (interaction.pointerWasMoved\n // or if the pointerup target is different to the pointerdown target\n || !(interaction.downTargets[pointerIndex] && interaction.downTargets[pointerIndex] === eventTarget))) {\n return [];\n }\n\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n path,\n targets: [],\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (type === 'hold') {\n signalArg.targets = filter(signalArg.targets, target =>\n target.eventable.options.holdDuration === interaction.holdTimers[pointerIndex].duration);\n }\n\n return signalArg.targets;\n}\n\nInteraction.signals.on('update-pointer-down', function ({ interaction, pointerIndex }) {\n interaction.holdTimers[pointerIndex] = { duration: Infinity, timeout: null };\n});\n\nInteraction.signals.on('remove-pointer', function ({ interaction, pointerIndex }) {\n interaction.holdTimers.splice(pointerIndex, 1);\n});\n\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget, duplicateMove }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n if (!duplicateMove && (!interaction.pointerIsDown || interaction.pointerWasMoved)) {\n if (interaction.pointerIsDown) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n\n fire({\n interaction, pointer, event, eventTarget,\n type: 'move',\n });\n }\n});\n\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget, pointerIndex }) {\n // copy event to be used in timeout for IE8\n const eventCopy = browser.isIE8? utils.extend({}, event) : event;\n\n const timer = interaction.holdTimers[pointerIndex];\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'hold',\n targets: [],\n path,\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (!signalArg.targets.length) { return; }\n\n let minDuration = Infinity;\n\n for (let i = 0; i < signalArg.targets.length; i++) {\n const target = signalArg.targets[i];\n const holdDuration = target.eventable.options.holdDuration;\n\n if (holdDuration < minDuration) {\n minDuration = holdDuration;\n }\n }\n\n timer.duration = minDuration;\n timer.timeout = setTimeout(function () {\n fire({\n interaction,\n eventTarget,\n pointer: browser.isIE8? eventCopy : pointer,\n event: eventCopy,\n type: 'hold',\n });\n }, minDuration);\n});\n\nInteraction.signals.on('up', ({ interaction, pointer, event, eventTarget }) => {\n if (!interaction.pointerWasMoved) {\n fire({ interaction, eventTarget, pointer, event, type: 'tap' });\n }\n});\n\n['up', 'cancel'].forEach(function (signalName) {\n Interaction.signals.on(signalName, function ({ interaction, pointerIndex }) {\n if (interaction.holdTimers[pointerIndex]) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n });\n});\n\nfunction createSignalListener (type) {\n return function ({ interaction, pointer, event, eventTarget }) {\n fire({ interaction, eventTarget, pointer, event, type });\n };\n}\n\nfor (let i = 0; i < simpleSignals.length; i++) {\n Interaction.signals.on(simpleSignals[i], createSignalListener(simpleEvents[i]));\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.prevTap = null; // the most recent tap event on this interaction\n interaction.tapTime = 0; // time of the most recent tap event\n interaction.holdTimers = []; // [{ duration, timeout }]\n});\n\ndefaults.pointerEvents = pointerEvents.defaults;\nmodule.exports = pointerEvents;\n","const pointerEvents = require('./base');\nconst Interaction = require('../Interaction');\n\npointerEvents.signals.on('new', onNew);\npointerEvents.signals.on('fired', onFired);\n\nfor (const signal of ['move', 'up', 'cancel', 'endall']) {\n Interaction.signals.on(signal, endHoldRepeat);\n}\n\nfunction onNew ({ pointerEvent }) {\n if (pointerEvent.type !== 'hold') { return; }\n\n pointerEvent.count = (pointerEvent.count || 0) + 1;\n}\n\nfunction onFired ({ interaction, pointerEvent, eventTarget, targets }) {\n if (pointerEvent.type !== 'hold' || !targets.length) { return; }\n\n // get the repeat interval from the first eventable\n const interval = targets[0].eventable.options.holdRepeatInterval;\n\n // don't repeat if the interval is 0 or less\n if (interval <= 0) { return; }\n\n // set a timeout to fire the holdrepeat event\n interaction.holdIntervalHandle = setTimeout(function () {\n pointerEvents.fire({\n interaction,\n eventTarget,\n type: 'hold',\n pointer: pointerEvent,\n event: pointerEvent,\n });\n }, interval);\n}\n\nfunction endHoldRepeat ({ interaction }) {\n // set the interaction's holdStopTime property\n // to stop further holdRepeat events\n if (interaction.holdIntervalHandle) {\n clearInterval(interaction.holdIntervalHandle);\n interaction.holdIntervalHandle = null;\n }\n}\n\n// don't repeat by default\npointerEvents.defaults.holdRepeatInterval = 0;\npointerEvents.types.push('holdrepeat');\n\nmodule.exports = {\n onNew,\n onFired,\n endHoldRepeat,\n};\n","const pointerEvents = require('./base');\nconst Interactable = require('../Interactable');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\nconst scope = require('../scope');\nconst extend = require('../utils/extend');\nconst { merge } = require('../utils/arr');\n\npointerEvents.signals.on('collect-targets', function ({ targets, element, type, eventTarget }) {\n function collectSelectors (interactable, selector, context) {\n const els = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && is.element(element)\n && domUtils.matchesSelector(element, selector, els)\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n const interactable = scope.interactables.get(element);\n\n if (interactable) {\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n scope.interactables.forEachSelector(collectSelectors, element);\n});\n\nInteractable.signals.on('new', function ({ interactable }) {\n interactable.events.getRect = function (element) {\n return interactable.getRect(element);\n };\n});\n\nInteractable.signals.on('set', function ({ interactable, options }) {\n extend(interactable.events.options, pointerEvents.defaults);\n extend(interactable.events.options, options);\n});\n\nmerge(Interactable.eventTypes, pointerEvents.types);\n\nInteractable.prototype.pointerEvents = function (options) {\n extend(this.events.options, options);\n\n return this;\n};\n\nconst __backCompatOption = Interactable.prototype._backCompatOption;\n\nInteractable.prototype._backCompatOption = function (optionName, newValue) {\n const ret = __backCompatOption.call(this, optionName, newValue);\n\n if (ret === this) {\n this.events.options[optionName] = newValue;\n }\n\n return ret;\n};\n\nInteractable.settingsMethods.push('pointerEvents');\n","const utils = require('./utils');\nconst events = require('./utils/events');\nconst signals = require('./utils/Signals').new();\n\nconst scope = {\n signals,\n events,\n utils,\n\n // main document\n document: require('./utils/domObjects').document,\n // all documents being listened to\n documents: [],\n\n addDocument: function (doc, win) {\n // do nothing if document is already known\n if (utils.contains(scope.documents, doc)) { return false; }\n\n win = win || scope.getWindow(doc);\n\n scope.documents.push(doc);\n events.documents.push(doc);\n\n // don't add an unload event for the main document\n // so that the page may be cached in browser history\n if (doc !== scope.document) {\n events.add(win, 'unload', scope.onWindowUnload);\n }\n\n signals.fire('add-document', { doc, win });\n },\n\n removeDocument: function (doc, win) {\n const index = utils.indexOf(scope.documents, doc);\n\n win = win || scope.getWindow(doc);\n\n events.remove(win, 'unload', scope.onWindowUnload);\n\n scope.documents.splice(index, 1);\n events.documents.splice(index, 1);\n\n signals.fire('remove-document', { win, doc });\n },\n\n onWindowUnload: function () {\n scope.removeDocument(this.document, this);\n },\n};\n\nmodule.exports = scope;\n","const { indexOf } = require('./arr');\n\nclass Signals {\n constructor () {\n this.listeners = {\n // signalName: [listeners],\n };\n }\n\n on (name, listener) {\n if (!this.listeners[name]) {\n this.listeners[name] = [listener];\n return;\n }\n\n this.listeners[name].push(listener);\n }\n\n off (name, listener) {\n if (!this.listeners[name]) { return; }\n\n const index = indexOf(this.listeners[name], listener);\n\n if (index !== -1) {\n this.listeners[name].splice(index, 1);\n }\n }\n\n fire (name, arg) {\n const targetListeners = this.listeners[name];\n\n if (!targetListeners) { return; }\n\n for (let i = 0; i < targetListeners.length; i++) {\n if (targetListeners[i](arg, name) === false) {\n return;\n }\n }\n }\n}\n\nSignals.new = function () {\n return new Signals();\n};\n\nmodule.exports = Signals;\n","function indexOf (array, target) {\n for (let i = 0, len = array.length; i < len; i++) {\n if (array[i] === target) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction contains (array, target) {\n return indexOf(array, target) !== -1;\n}\n\nfunction merge (target, source) {\n for (let i = 0; i < source.length; i++) {\n target.push(source[i]);\n }\n\n return target;\n}\n\nfunction filter (array, test) {\n const result = [];\n\n for (let i = 0; i < array.length; i++) {\n if (test(array[i])) {\n result.push(array[i]);\n }\n }\n\n return result;\n}\n\nmodule.exports = {\n indexOf,\n contains,\n merge,\n filter,\n};\n","const { window } = require('./window');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst Element = domObjects.Element;\nconst navigator = window.navigator;\n\nconst browser = {\n // Does the browser support touch input?\n supportsTouch: !!(('ontouchstart' in window) || is.function(window.DocumentTouch)\n && domObjects.document instanceof window.DocumentTouch),\n\n // Does the browser support PointerEvents\n supportsPointerEvent: !!domObjects.PointerEvent,\n\n isIE8: ('attachEvent' in window) && !('addEventListener' in window),\n\n // Opera Mobile must be handled differently\n isOperaMobile: (navigator.appName === 'Opera'\n && browser.supportsTouch\n && navigator.userAgent.match('Presto')),\n\n // scrolling doesn't change the result of getClientRects on iOS 7\n isIOS7: (/iP(hone|od|ad)/.test(navigator.platform)\n && /OS 7[^\\d]/.test(navigator.appVersion)),\n\n isIe9OrOlder: /MSIE (8|9)/.test(navigator.userAgent),\n\n // prefix matchesSelector\n prefixedMatchesSelector: 'matches' in Element.prototype\n ? 'matches': 'webkitMatchesSelector' in Element.prototype\n ? 'webkitMatchesSelector': 'mozMatchesSelector' in Element.prototype\n ? 'mozMatchesSelector': 'oMatchesSelector' in Element.prototype\n ? 'oMatchesSelector': 'msMatchesSelector',\n\n useMatchesSelectorPolyfill: false,\n\n pEventTypes: (domObjects.PointerEvent\n ? (domObjects.PointerEvent === window.MSPointerEvent\n ? {\n up: 'MSPointerUp',\n down: 'MSPointerDown',\n over: 'mouseover',\n out: 'mouseout',\n move: 'MSPointerMove',\n cancel: 'MSPointerCancel',\n }\n : {\n up: 'pointerup',\n down: 'pointerdown',\n over: 'pointerover',\n out: 'pointerout',\n move: 'pointermove',\n cancel: 'pointercancel',\n })\n : null),\n\n // because Webkit and Opera still use 'mousewheel' event type\n wheelEvent: 'onmousewheel' in domObjects.document? 'mousewheel': 'wheel',\n\n};\n\nbrowser.useMatchesSelectorPolyfill = !is.function(Element.prototype[browser.prefixedMatchesSelector]);\n\nmodule.exports = browser;\n","const domObjects = {};\nconst win = require('./window').window;\n\nfunction blank () {}\n\ndomObjects.document = win.document;\ndomObjects.DocumentFragment = win.DocumentFragment || blank;\ndomObjects.SVGElement = win.SVGElement || blank;\ndomObjects.SVGSVGElement = win.SVGSVGElement || blank;\ndomObjects.SVGElementInstance = win.SVGElementInstance || blank;\ndomObjects.Element = win.Element || blank;\ndomObjects.HTMLElement = win.HTMLElement || domObjects.Element;\n\ndomObjects.Event = win.Event;\ndomObjects.Touch = win.Touch || blank;\ndomObjects.PointerEvent = (win.PointerEvent || win.MSPointerEvent);\n\nmodule.exports = domObjects;\n","const win = require('./window');\nconst browser = require('./browser');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst domUtils = {\n nodeContains: function (parent, child) {\n while (child) {\n if (child === parent) {\n return true;\n }\n\n child = child.parentNode;\n }\n\n return false;\n },\n\n closest: function (element, selector) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) { return element; }\n\n element = domUtils.parentNode(element);\n }\n\n return null;\n },\n\n parentNode: function (node) {\n let parent = node.parentNode;\n\n if (is.docFrag(parent)) {\n // skip past #shado-root fragments\n while ((parent = parent.host) && is.docFrag(parent)) {\n continue;\n }\n\n return parent;\n }\n\n return parent;\n },\n\n // taken from http://tanalin.com/en/blog/2012/12/matches-selector-ie8/ and modified\n matchesSelectorPolyfill: browser.useMatchesSelectorPolyfill\n ? function (element, selector, elems) {\n elems = elems || element.parentNode.querySelectorAll(selector);\n\n for (let i = 0, len = elems.length; i < len; i++) {\n if (elems[i] === element) {\n return true;\n }\n }\n\n return false;\n }\n : null,\n\n matchesSelector: function (element, selector, nodeList) {\n if (browser.useMatchesSelectorPolyfill) {\n return domUtils.matchesSelectorPolyfill(element, selector, nodeList);\n }\n\n // remove /deep/ from selectors if shadowDOM polyfill is used\n if (win.window !== win.realWindow) {\n selector = selector.replace(/\\/deep\\//g, ' ');\n }\n\n return element[browser.prefixedMatchesSelector](selector);\n },\n\n // Test for the element that's \"above\" all other qualifiers\n indexOfDeepestElement: function (elements) {\n let deepestZoneParents = [];\n let dropzoneParents = [];\n let dropzone;\n let deepestZone = elements[0];\n let index = deepestZone? 0: -1;\n let parent;\n let child;\n let i;\n let n;\n\n for (i = 1; i < elements.length; i++) {\n dropzone = elements[i];\n\n // an element might belong to multiple selector dropzones\n if (!dropzone || dropzone === deepestZone) {\n continue;\n }\n\n if (!deepestZone) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n // check if the deepest or current are document.documentElement or document.rootElement\n // - if the current dropzone is, do nothing and continue\n if (dropzone.parentNode === dropzone.ownerDocument) {\n continue;\n }\n // - if deepest is, update with the current dropzone and continue to next\n else if (deepestZone.parentNode === dropzone.ownerDocument) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n if (!deepestZoneParents.length) {\n parent = deepestZone;\n while (parent.parentNode && parent.parentNode !== parent.ownerDocument) {\n deepestZoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n }\n\n // if this element is an svg element and the current deepest is\n // an HTMLElement\n if (deepestZone instanceof domObjects.HTMLElement\n && dropzone instanceof domObjects.SVGElement\n && !(dropzone instanceof domObjects.SVGSVGElement)) {\n\n if (dropzone === deepestZone.parentNode) {\n continue;\n }\n\n parent = dropzone.ownerSVGElement;\n }\n else {\n parent = dropzone;\n }\n\n dropzoneParents = [];\n\n while (parent.parentNode !== parent.ownerDocument) {\n dropzoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n\n n = 0;\n\n // get (position of last common ancestor) + 1\n while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) {\n n++;\n }\n\n const parents = [\n dropzoneParents[n - 1],\n dropzoneParents[n],\n deepestZoneParents[n],\n ];\n\n child = parents[0].lastChild;\n\n while (child) {\n if (child === parents[1]) {\n deepestZone = dropzone;\n index = i;\n deepestZoneParents = [];\n\n break;\n }\n else if (child === parents[2]) {\n break;\n }\n\n child = child.previousSibling;\n }\n }\n\n return index;\n },\n\n matchesUpTo: function (element, selector, limit) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) {\n return true;\n }\n\n element = domUtils.parentNode(element);\n\n if (element === limit) {\n return domUtils.matchesSelector(element, selector);\n }\n }\n\n return false;\n },\n\n getActualElement: function (element) {\n return (element instanceof domObjects.SVGElementInstance\n ? element.correspondingUseElement\n : element);\n },\n\n getScrollXY: function (relevantWindow) {\n relevantWindow = relevantWindow || win.window;\n return {\n x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft,\n y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop,\n };\n },\n\n getElementClientRect: function (element) {\n const clientRect = (element instanceof domObjects.SVGElement\n ? element.getBoundingClientRect()\n : element.getClientRects()[0]);\n\n return clientRect && {\n left : clientRect.left,\n right : clientRect.right,\n top : clientRect.top,\n bottom: clientRect.bottom,\n width : clientRect.width || clientRect.right - clientRect.left,\n height: clientRect.height || clientRect.bottom - clientRect.top,\n };\n },\n\n getElementRect: function (element) {\n const clientRect = domUtils.getElementClientRect(element);\n\n if (!browser.isIOS7 && clientRect) {\n const scroll = domUtils.getScrollXY(win.getWindow(element));\n\n clientRect.left += scroll.x;\n clientRect.right += scroll.x;\n clientRect.top += scroll.y;\n clientRect.bottom += scroll.y;\n }\n\n return clientRect;\n },\n\n getPath: function (element) {\n const path = [];\n\n while (element) {\n path.push(element);\n element = domUtils.parentNode(element);\n }\n\n return path;\n },\n\n trySelector: value => {\n if (!is.string(value)) { return false; }\n\n // an exception will be raised if it is invalid\n domObjects.document.querySelector(value);\n return true;\n },\n};\n\nmodule.exports = domUtils;\n","const is = require('./is');\nconst domUtils = require('./domUtils');\nconst pExtend = require('./pointerExtend');\n\nconst { window, getWindow } = require('./window');\nconst { indexOf, contains } = require('./arr');\n\nconst useAttachEvent = ('attachEvent' in window) && !('addEventListener' in window);\nconst addEvent = useAttachEvent? 'attachEvent': 'addEventListener';\nconst removeEvent = useAttachEvent? 'detachEvent': 'removeEventListener';\nconst on = useAttachEvent? 'on': '';\n\nconst elements = [];\nconst targets = [];\nconst attachedListeners = [];\n\n// {\n// type: {\n// selectors: ['selector', ...],\n// contexts : [document, ...],\n// listeners: [[listener, capture, passive], ...]\n// }\n// }\nconst delegatedEvents = {};\n\nconst documents = [];\n\nconst supportsOptions = !useAttachEvent && (() => {\n let supported = false;\n\n window.document.createElement('div').addEventListener('test', null, {\n get capture () { supported = true; },\n });\n\n return supported;\n})();\n\nfunction add (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n let elementIndex = indexOf(elements, element);\n let target = targets[elementIndex];\n\n if (!target) {\n target = {\n events: {},\n typeCount: 0,\n };\n\n elementIndex = elements.push(element) - 1;\n targets.push(target);\n\n attachedListeners.push(useAttachEvent\n ? {\n supplied: [],\n wrapped : [],\n useCount: [],\n }\n : null);\n }\n\n if (!target.events[type]) {\n target.events[type] = [];\n target.typeCount++;\n }\n\n if (!contains(target.events[type], listener)) {\n let ret;\n\n if (useAttachEvent) {\n const { supplied, wrapped, useCount } = attachedListeners[elementIndex];\n const listenerIndex = indexOf(supplied, listener);\n\n const wrappedListener = wrapped[listenerIndex] || function (event) {\n if (!event.immediatePropagationStopped) {\n event.target = event.srcElement;\n event.currentTarget = element;\n\n event.preventDefault = event.preventDefault || preventDef;\n event.stopPropagation = event.stopPropagation || stopProp;\n event.stopImmediatePropagation = event.stopImmediatePropagation || stopImmProp;\n\n if (/mouse|click/.test(event.type)) {\n event.pageX = event.clientX + getWindow(element).document.documentElement.scrollLeft;\n event.pageY = event.clientY + getWindow(element).document.documentElement.scrollTop;\n }\n\n listener(event);\n }\n };\n\n ret = element[addEvent](on + type, wrappedListener, !!options.capture);\n\n if (listenerIndex === -1) {\n supplied.push(listener);\n wrapped.push(wrappedListener);\n useCount.push(1);\n }\n else {\n useCount[listenerIndex]++;\n }\n }\n else {\n ret = element[addEvent](type, listener, supportsOptions? options : !!options.capture);\n }\n target.events[type].push(listener);\n\n return ret;\n }\n}\n\nfunction remove (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const elementIndex = indexOf(elements, element);\n const target = targets[elementIndex];\n\n if (!target || !target.events) {\n return;\n }\n\n let wrappedListener = listener;\n let listeners;\n let listenerIndex;\n\n if (useAttachEvent) {\n listeners = attachedListeners[elementIndex];\n listenerIndex = indexOf(listeners.supplied, listener);\n wrappedListener = listeners.wrapped[listenerIndex];\n }\n\n if (type === 'all') {\n for (type in target.events) {\n if (target.events.hasOwnProperty(type)) {\n remove(element, type, 'all');\n }\n }\n return;\n }\n\n if (target.events[type]) {\n const len = target.events[type].length;\n\n if (listener === 'all') {\n for (let i = 0; i < len; i++) {\n remove(element, type, target.events[type][i], options);\n }\n return;\n }\n else {\n for (let i = 0; i < len; i++) {\n if (target.events[type][i] === listener) {\n element[removeEvent](on + type, wrappedListener, supportsOptions? options : !!options.capture);\n target.events[type].splice(i, 1);\n\n if (useAttachEvent && listeners) {\n listeners.useCount[listenerIndex]--;\n if (listeners.useCount[listenerIndex] === 0) {\n listeners.supplied.splice(listenerIndex, 1);\n listeners.wrapped.splice(listenerIndex, 1);\n listeners.useCount.splice(listenerIndex, 1);\n }\n }\n\n break;\n }\n }\n }\n\n if (target.events[type] && target.events[type].length === 0) {\n target.events[type] = null;\n target.typeCount--;\n }\n }\n\n if (!target.typeCount) {\n targets.splice(elementIndex, 1);\n elements.splice(elementIndex, 1);\n attachedListeners.splice(elementIndex, 1);\n }\n}\n\nfunction addDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n if (!delegatedEvents[type]) {\n delegatedEvents[type] = {\n selectors: [],\n contexts : [],\n listeners: [],\n };\n\n // add delegate listener functions\n for (let i = 0; i < documents.length; i++) {\n add(documents[i], type, delegateListener);\n add(documents[i], type, delegateUseCapture, true);\n }\n }\n\n const delegated = delegatedEvents[type];\n let index;\n\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n break;\n }\n }\n\n if (index === -1) {\n index = delegated.selectors.length;\n\n delegated.selectors.push(selector);\n delegated.contexts .push(context);\n delegated.listeners.push([]);\n }\n\n // keep listener and capture and passive flags\n delegated.listeners[index].push([listener, !!options.capture, options.passive]);\n}\n\nfunction removeDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const delegated = delegatedEvents[type];\n let matchFound = false;\n let index;\n\n if (!delegated) { return; }\n\n // count from last index of delegated to 0\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n // look for matching selector and context Node\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n\n const listeners = delegated.listeners[index];\n\n // each item of the listeners array is an array: [function, capture, passive]\n for (let i = listeners.length - 1; i >= 0; i--) {\n const [fn, capture, passive] = listeners[i];\n\n // check if the listener functions and capture and passive flags match\n if (fn === listener && capture === !!options.capture && passive === options.passive) {\n // remove the listener from the array of listeners\n listeners.splice(i, 1);\n\n // if all listeners for this interactable have been removed\n // remove the interactable from the delegated arrays\n if (!listeners.length) {\n delegated.selectors.splice(index, 1);\n delegated.contexts .splice(index, 1);\n delegated.listeners.splice(index, 1);\n\n // remove delegate function from context\n remove(context, type, delegateListener);\n remove(context, type, delegateUseCapture, true);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegatedEvents[type] = null;\n }\n }\n\n // only remove one listener\n matchFound = true;\n break;\n }\n }\n\n if (matchFound) { break; }\n }\n }\n}\n\n// bound to the interactable context when a DOM event\n// listener is added to a selector interactable\nfunction delegateListener (event, optionalArg) {\n const options = getOptions(optionalArg);\n const fakeEvent = {};\n const delegated = delegatedEvents[event.type];\n const eventTarget = (domUtils.getActualElement(event.path\n ? event.path[0]\n : event.target));\n let element = eventTarget;\n\n // duplicate the event so that currentTarget can be changed\n pExtend(fakeEvent, event);\n\n fakeEvent.originalEvent = event;\n fakeEvent.preventDefault = preventOriginalDefault;\n\n // climb up document tree looking for selector matches\n while (is.element(element)) {\n for (let i = 0; i < delegated.selectors.length; i++) {\n const selector = delegated.selectors[i];\n const context = delegated.contexts[i];\n\n if (domUtils.matchesSelector(element, selector)\n && domUtils.nodeContains(context, eventTarget)\n && domUtils.nodeContains(context, element)) {\n\n const listeners = delegated.listeners[i];\n\n fakeEvent.currentTarget = element;\n\n for (let j = 0; j < listeners.length; j++) {\n const [fn, capture, passive] = listeners[j];\n\n if (capture === !!options.capture && passive === options.passive) {\n fn(fakeEvent);\n }\n }\n }\n }\n\n element = domUtils.parentNode(element);\n }\n}\n\nfunction delegateUseCapture (event) {\n return delegateListener.call(this, event, true);\n}\n\nfunction preventDef () {\n this.returnValue = false;\n}\n\nfunction preventOriginalDefault () {\n this.originalEvent.preventDefault();\n}\n\nfunction stopProp () {\n this.cancelBubble = true;\n}\n\nfunction stopImmProp () {\n this.cancelBubble = true;\n this.immediatePropagationStopped = true;\n}\n\nfunction getOptions (param) {\n return is.object(param)? param : { capture: param };\n}\n\nmodule.exports = {\n add,\n remove,\n\n addDelegate,\n removeDelegate,\n\n delegateListener,\n delegateUseCapture,\n delegatedEvents,\n documents,\n\n useAttachEvent,\n supportsOptions,\n\n _elements: elements,\n _targets: targets,\n _attachedListeners: attachedListeners,\n};\n","module.exports = function extend (dest, source) {\n for (const prop in source) {\n dest[prop] = source[prop];\n }\n return dest;\n};\n","const {\n resolveRectLike,\n rectToXY,\n} = require('./rect');\n\nmodule.exports = function (target, element, action) {\n const actionOptions = target.options[action];\n const actionOrigin = actionOptions && actionOptions.origin;\n const origin = actionOrigin || target.options.origin;\n\n const originRect = resolveRectLike(origin, target, element, [target && element]);\n\n return rectToXY(originRect) || { x: 0, y: 0 };\n};\n","module.exports = (x, y) => Math.sqrt(x * x + y * y);\n","const extend = require('./extend');\nconst win = require('./window');\n\nconst utils = {\n warnOnce: function (method, message) {\n let warned = false;\n\n return function () {\n if (!warned) {\n win.window.console.warn(message);\n warned = true;\n }\n\n return method.apply(this, arguments);\n };\n },\n\n // http://stackoverflow.com/a/5634528/2280888\n _getQBezierValue: function (t, p1, p2, p3) {\n const iT = 1 - t;\n return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3;\n },\n\n getQuadraticCurvePoint: function (startX, startY, cpX, cpY, endX, endY, position) {\n return {\n x: utils._getQBezierValue(position, startX, cpX, endX),\n y: utils._getQBezierValue(position, startY, cpY, endY),\n };\n },\n\n // http://gizma.com/easing/\n easeOutQuad: function (t, b, c, d) {\n t /= d;\n return -c * t*(t-2) + b;\n },\n\n copyAction: function (dest, src) {\n dest.name = src.name;\n dest.axis = src.axis;\n dest.edges = src.edges;\n\n return dest;\n },\n\n is : require('./is'),\n extend : extend,\n hypot : require('./hypot'),\n getOriginXY: require('./getOriginXY'),\n};\n\nextend(utils, require('./arr'));\nextend(utils, require('./domUtils'));\nextend(utils, require('./pointerUtils'));\nextend(utils, require('./rect'));\n\nmodule.exports = utils;\n","const scope = require('../scope');\nconst utils = require('./index');\n\nconst finder = {\n methodOrder: [ 'simulationResume', 'mouseOrPen', 'hasPointer', 'idle' ],\n\n search: function (pointer, eventType, eventTarget) {\n const pointerType = utils.getPointerType(pointer);\n const pointerId = utils.getPointerId(pointer);\n const details = { pointer, pointerId, pointerType, eventType, eventTarget };\n\n for (const method of finder.methodOrder) {\n const interaction = finder[method](details);\n\n if (interaction) {\n return interaction;\n }\n }\n },\n\n // try to resume simulation with a new pointer\n simulationResume: function ({ pointerType, eventType, eventTarget }) {\n if (!/down|start/i.test(eventType)) {\n return null;\n }\n\n for (const interaction of scope.interactions) {\n let element = eventTarget;\n\n if (interaction.simulation && interaction.simulation.allowResume\n && (interaction.pointerType === pointerType)) {\n while (element) {\n // if the element is the interaction element\n if (element === interaction.element) {\n return interaction;\n }\n element = utils.parentNode(element);\n }\n }\n }\n\n return null;\n },\n\n // if it's a mouse or pen interaction\n mouseOrPen: function ({ pointerId, pointerType, eventType }) {\n if (pointerType !== 'mouse' && pointerType !== 'pen') {\n return null;\n }\n\n let firstNonActive;\n\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType) {\n // if it's a down event, skip interactions with running simulations\n if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; }\n\n // if the interaction is active, return it immediately\n if (interaction.interacting()) {\n return interaction;\n }\n // otherwise save it and look for another active interaction\n else if (!firstNonActive) {\n firstNonActive = interaction;\n }\n }\n }\n\n // if no active mouse interaction was found use the first inactive mouse\n // interaction\n if (firstNonActive) {\n return firstNonActive;\n }\n\n // find any mouse or pen interaction.\n // ignore the interaction if the eventType is a *down, and a simulation\n // is active\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType && !(/down/i.test(eventType) && interaction.simulation)) {\n return interaction;\n }\n }\n\n return null;\n },\n\n // get interaction that has this pointer\n hasPointer: function ({ pointerId }) {\n for (const interaction of scope.interactions) {\n if (utils.contains(interaction.pointerIds, pointerId)) {\n return interaction;\n }\n }\n },\n\n // get first idle interaction with a matching pointerType\n idle: function ({ pointerType }) {\n for (const interaction of scope.interactions) {\n // if there's already a pointer held down\n if (interaction.pointerIds.length === 1) {\n const target = interaction.target;\n // don't add this pointer if there is a target interactable and it\n // isn't gesturable\n if (target && !target.options.gesture.enabled) {\n continue;\n }\n }\n // maximum of 2 pointers per interaction\n else if (interaction.pointerIds.length >= 2) {\n continue;\n }\n\n if (!interaction.interacting() && (pointerType === interaction.pointerType)) {\n return interaction;\n }\n }\n\n return null;\n },\n};\n\nmodule.exports = finder;\n","const win = require('./window');\nconst isWindow = require('./isWindow');\n\nconst is = {\n array : () => {},\n\n window : thing => thing === win.window || isWindow(thing),\n\n docFrag : thing => is.object(thing) && thing.nodeType === 11,\n\n object : thing => !!thing && (typeof thing === 'object'),\n\n function: thing => typeof thing === 'function',\n\n number : thing => typeof thing === 'number' ,\n\n bool : thing => typeof thing === 'boolean' ,\n\n string : thing => typeof thing === 'string' ,\n\n element: thing => {\n if (!thing || (typeof thing !== 'object')) { return false; }\n\n const _window = win.getWindow(thing) || win.window;\n\n return (/object|function/.test(typeof _window.Element)\n ? thing instanceof _window.Element //DOM2\n : thing.nodeType === 1 && typeof thing.nodeName === 'string');\n },\n};\n\nis.array = thing => (is.object(thing)\n && (typeof thing.length !== 'undefined')\n && is.function(thing.splice));\n\nmodule.exports = is;\n","module.exports = (thing) => !!(thing && thing.Window) && (thing instanceof thing.Window);\n","function pointerExtend (dest, source) {\n for (const prop in source) {\n const prefixedPropREs = module.exports.prefixedPropREs;\n let deprecated = false;\n\n // skip deprecated prefixed properties\n for (const vendor in prefixedPropREs) {\n if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) {\n deprecated = true;\n break;\n }\n }\n\n if (!deprecated && typeof source[prop] !== 'function') {\n dest[prop] = source[prop];\n }\n }\n return dest;\n}\n\npointerExtend.prefixedPropREs = {\n webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/,\n};\n\nmodule.exports = pointerExtend;\n","const hypot = require('./hypot');\nconst browser = require('./browser');\nconst dom = require('./domObjects');\nconst domUtils = require('./domUtils');\nconst domObjects = require('./domObjects');\nconst is = require('./is');\nconst pointerExtend = require('./pointerExtend');\n\nconst pointerUtils = {\n copyCoords: function (dest, src) {\n dest.page = dest.page || {};\n dest.page.x = src.page.x;\n dest.page.y = src.page.y;\n\n dest.client = dest.client || {};\n dest.client.x = src.client.x;\n dest.client.y = src.client.y;\n\n dest.timeStamp = src.timeStamp;\n },\n\n setCoordDeltas: function (targetObj, prev, cur) {\n targetObj.page.x = cur.page.x - prev.page.x;\n targetObj.page.y = cur.page.y - prev.page.y;\n targetObj.client.x = cur.client.x - prev.client.x;\n targetObj.client.y = cur.client.y - prev.client.y;\n targetObj.timeStamp = cur.timeStamp - prev.timeStamp;\n\n // set pointer velocity\n const dt = Math.max(targetObj.timeStamp / 1000, 0.001);\n\n targetObj.page.speed = hypot(targetObj.page.x, targetObj.page.y) / dt;\n targetObj.page.vx = targetObj.page.x / dt;\n targetObj.page.vy = targetObj.page.y / dt;\n\n targetObj.client.speed = hypot(targetObj.client.x, targetObj.page.y) / dt;\n targetObj.client.vx = targetObj.client.x / dt;\n targetObj.client.vy = targetObj.client.y / dt;\n },\n\n isNativePointer: function (pointer) {\n return (pointer instanceof dom.Event || pointer instanceof dom.Touch);\n },\n\n // Get specified X/Y coords for mouse or event.touches[0]\n getXY: function (type, pointer, xy) {\n xy = xy || {};\n type = type || 'page';\n\n xy.x = pointer[type + 'X'];\n xy.y = pointer[type + 'Y'];\n\n return xy;\n },\n\n getPageXY: function (pointer, page) {\n page = page || {};\n\n // Opera Mobile handles the viewport and scrolling oddly\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n pointerUtils.getXY('screen', pointer, page);\n\n page.x += window.scrollX;\n page.y += window.scrollY;\n }\n else {\n pointerUtils.getXY('page', pointer, page);\n }\n\n return page;\n },\n\n getClientXY: function (pointer, client) {\n client = client || {};\n\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n // Opera Mobile handles the viewport and scrolling oddly\n pointerUtils.getXY('screen', pointer, client);\n }\n else {\n pointerUtils.getXY('client', pointer, client);\n }\n\n return client;\n },\n\n getPointerId: function (pointer) {\n return is.number(pointer.pointerId)? pointer.pointerId : pointer.identifier;\n },\n\n setCoords: function (targetObj, pointers, timeStamp) {\n const pointer = (pointers.length > 1\n ? pointerUtils.pointerAverage(pointers)\n : pointers[0]);\n\n const tmpXY = {};\n\n pointerUtils.getPageXY(pointer, tmpXY);\n targetObj.page.x = tmpXY.x;\n targetObj.page.y = tmpXY.y;\n\n pointerUtils.getClientXY(pointer, tmpXY);\n targetObj.client.x = tmpXY.x;\n targetObj.client.y = tmpXY.y;\n\n targetObj.timeStamp = is.number(timeStamp) ? timeStamp :new Date().getTime();\n },\n\n pointerExtend: pointerExtend,\n\n getTouchPair: function (event) {\n const touches = [];\n\n // array of touches is supplied\n if (is.array(event)) {\n touches[0] = event[0];\n touches[1] = event[1];\n }\n // an event\n else {\n if (event.type === 'touchend') {\n if (event.touches.length === 1) {\n touches[0] = event.touches[0];\n touches[1] = event.changedTouches[0];\n }\n else if (event.touches.length === 0) {\n touches[0] = event.changedTouches[0];\n touches[1] = event.changedTouches[1];\n }\n }\n else {\n touches[0] = event.touches[0];\n touches[1] = event.touches[1];\n }\n }\n\n return touches;\n },\n\n pointerAverage: function (pointers) {\n const average = {\n pageX : 0,\n pageY : 0,\n clientX: 0,\n clientY: 0,\n screenX: 0,\n screenY: 0,\n };\n\n for (const pointer of pointers) {\n for (const prop in average) {\n average[prop] += pointer[prop];\n }\n }\n for (const prop in average) {\n average[prop] /= pointers.length;\n }\n\n return average;\n },\n\n touchBBox: function (event) {\n if (!event.length && !(event.touches && event.touches.length > 1)) {\n return;\n }\n\n const touches = pointerUtils.getTouchPair(event);\n const minX = Math.min(touches[0].pageX, touches[1].pageX);\n const minY = Math.min(touches[0].pageY, touches[1].pageY);\n const maxX = Math.max(touches[0].pageX, touches[1].pageX);\n const maxY = Math.max(touches[0].pageY, touches[1].pageY);\n\n return {\n x: minX,\n y: minY,\n left: minX,\n top: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n },\n\n touchDistance: function (event, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n\n\n const dx = touches[0][sourceX] - touches[1][sourceX];\n const dy = touches[0][sourceY] - touches[1][sourceY];\n\n return hypot(dx, dy);\n },\n\n touchAngle: function (event, prevAngle, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n const dx = touches[1][sourceX] - touches[0][sourceX];\n const dy = touches[1][sourceY] - touches[0][sourceY];\n const angle = 180 * Math.atan2(dy , dx) / Math.PI;\n\n return angle;\n },\n\n getPointerType: function (pointer) {\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : is.number(pointer.pointerType)\n ? [undefined, undefined,'touch', 'pen', 'mouse'][pointer.pointerType]\n // if the PointerEvent API isn't available, then the \"pointer\" must\n // be either a MouseEvent, TouchEvent, or Touch object\n : /touch/.test(pointer.type) || pointer instanceof domObjects.Touch\n ? 'touch'\n : 'mouse';\n },\n\n // [ event.target, event.currentTarget ]\n getEventTargets: function (event) {\n return [\n domUtils.getActualElement(event.path ? event.path[0] : event.target),\n domUtils.getActualElement(event.currentTarget),\n ];\n },\n};\n\nmodule.exports = pointerUtils;\n","const { window } = require('./window');\n\nconst vendors = ['ms', 'moz', 'webkit', 'o'];\nlet lastTime = 0;\nlet request;\nlet cancel;\n\nfor (let x = 0; x < vendors.length && !window.requestAnimationFrame; x++) {\n request = window[vendors[x] + 'RequestAnimationFrame'];\n cancel = window[vendors[x] +'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n}\n\nif (!request) {\n request = function (callback) {\n const currTime = new Date().getTime();\n const timeToCall = Math.max(0, 16 - (currTime - lastTime));\n const id = setTimeout(function () { callback(currTime + timeToCall); },\n timeToCall);\n\n lastTime = currTime + timeToCall;\n return id;\n };\n}\n\nif (!cancel) {\n cancel = function (id) {\n clearTimeout(id);\n };\n}\n\nmodule.exports = {\n request,\n cancel,\n};\n","const extend = require('./extend');\nconst is = require('./is');\nconst {\n closest,\n parentNode,\n getElementRect,\n} = require('./domUtils');\n\nconst rectUtils = {\n getStringOptionResult: function (value, interactable, element) {\n if (!is.string(value)) {\n return null;\n }\n\n if (value === 'parent') {\n value = parentNode(element);\n }\n else if (value === 'self') {\n value = interactable.getRect(element);\n }\n else {\n value = closest(element, value);\n }\n\n return value;\n },\n\n resolveRectLike: function (value, interactable, element, functionArgs) {\n value = rectUtils.getStringOptionResult(value, interactable, element) || value;\n\n if (is.function(value)) {\n value = value.apply(null, functionArgs);\n }\n\n if (is.element(value)) {\n value = getElementRect(value);\n }\n\n return value;\n },\n\n rectToXY: function (rect) {\n return rect && {\n x: 'x' in rect ? rect.x : rect.left,\n y: 'y' in rect ? rect.y : rect.top,\n };\n },\n\n xywhToTlbr: function (rect) {\n if (rect && !('left' in rect && 'top' in rect)) {\n rect = extend({}, rect);\n\n rect.left = rect.x || 0;\n rect.top = rect.y || 0;\n rect.right = rect.right || (rect.left + rect.width);\n rect.bottom = rect.bottom || (rect.top + rect.height);\n }\n\n return rect;\n },\n\n tlbrToXywh: function (rect) {\n if (rect && !('x' in rect && 'y' in rect)) {\n rect = extend({}, rect);\n\n rect.x = rect.left || 0;\n rect.top = rect.top || 0;\n rect.width = rect.width || (rect.right - rect.x);\n rect.height = rect.height || (rect.bottom - rect.y);\n }\n\n return rect;\n },\n};\n\nmodule.exports = rectUtils;\n","const win = module.exports;\nconst isWindow = require('./isWindow');\n\nfunction init (window) {\n // get wrapped window if using Shadow DOM polyfill\n\n win.realWindow = window;\n\n // create a TextNode\n const el = window.document.createTextNode('');\n\n // check if it's wrapped by a polyfill\n if (el.ownerDocument !== window.document\n && typeof window.wrap === 'function'\n && window.wrap(el) === el) {\n // use wrapped window\n window = window.wrap(window);\n }\n\n win.window = window;\n}\n\nif (typeof window === 'undefined') {\n win.window = undefined;\n win.realWindow = undefined;\n}\nelse {\n init(window);\n}\n\nwin.getWindow = function getWindow (node) {\n if (isWindow(node)) {\n return node;\n }\n\n const rootNode = (node.ownerDocument || node);\n\n return rootNode.defaultView || rootNode.parentWindow || win.window;\n};\n\nwin.init = init;\n"]} \ No newline at end of file diff --git a/package.json b/package.json index 76f3e9969..f39704e99 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "interactjs", - "version": "1.3.0-alpha.3+sha.9595c40", + "version": "1.3.0-alpha.4+sha.7970416", "repository": { "type": "git", "url": "https://github.com/taye/interact.js.git"
- Interactable⚓➭ + Interactable⚓➭ @@ -783,7 +783,7 @@ Interactable - Interactable.getRect([element])⚓➭ + Interactable.getRect([element])⚓➭ @@ -888,7 +888,7 @@ Parameters - Interactable.rectChecker([checker])⚓➭ + Interactable.rectChecker([checker])⚓➭ @@ -951,7 +951,7 @@ Parameters - Interactable.origin(…)⚓➭ + Interactable.origin(…)⚓➭ @@ -1041,7 +1041,7 @@ Parameters - Interactable.deltaSource([newValue])⚓➭ + Interactable.deltaSource([newValue])⚓➭ @@ -1104,7 +1104,7 @@ Parameters - Interactable.context()⚓➭ + Interactable.context()⚓➭ @@ -1146,7 +1146,7 @@ Interactable.context() - Interactable.fire(iEvent)⚓➭ + Interactable.fire(iEvent)⚓➭ @@ -1207,7 +1207,7 @@ Parameters - Interactable.on(eventType, listener, [options])⚓➭ + Interactable.on(eventType, listener, [options])⚓➭ @@ -1273,7 +1273,7 @@ Parameters - Interactable.off(eventType, listener, [options])⚓➭ + Interactable.off(eventType, listener, [options])⚓➭ @@ -1339,7 +1339,7 @@ Parameters - Interactable.set(options)⚓➭ + Interactable.set(options)⚓➭ @@ -1399,7 +1399,7 @@ Parameters - Interactable.unset()⚓➭ + Interactable.unset()⚓➭ @@ -1442,7 +1442,7 @@ Interactable.unset() - Interactable.actionChecker([checker])⚓➭ + Interactable.actionChecker([checker])⚓➭ @@ -1542,7 +1542,7 @@ Parameters - Interactable.styleCursor([newValue])⚓➭ + Interactable.styleCursor([newValue])⚓➭ @@ -1605,7 +1605,7 @@ Parameters - interact.maxInteractions([newValue])⚓➭ + interact.maxInteractions([newValue])⚓➭ @@ -1652,7 +1652,7 @@ Parameters - Interactable.preventDefault([newValue])⚓➭ + Interactable.preventDefault([newValue])⚓➭ @@ -1718,7 +1718,7 @@ Parameters - interact(element)⚓➭ + interact(element)⚓➭ @@ -1821,7 +1821,7 @@ Usage - interact.isSet(element)⚓➭ + interact.isSet(element)⚓➭ @@ -1881,7 +1881,7 @@ Parameters - interact.on(type, listener, [options])⚓➭ + interact.on(type, listener, [options])⚓➭ @@ -1948,7 +1948,7 @@ Parameters - interact.off(type, listener, [options])⚓➭ + interact.off(type, listener, [options])⚓➭ @@ -2014,7 +2014,7 @@ Parameters - interact.debug()⚓➭ + interact.debug()⚓➭ @@ -2056,7 +2056,7 @@ interact.debug() - interact.supportsTouch()⚓➭ + interact.supportsTouch()⚓➭ @@ -2097,7 +2097,7 @@ interact.supportsTouch() - interact.supportsPointerEvent()⚓➭ + interact.supportsPointerEvent()⚓➭ @@ -2138,7 +2138,7 @@ interact.supportsPointerEvent() - interact.stop(event)⚓➭ + interact.stop(event)⚓➭ @@ -2198,7 +2198,7 @@ Parameters - interact.pointerMoveTolerance([newValue])⚓➭ + interact.pointerMoveTolerance([newValue])⚓➭ @@ -2261,7 +2261,7 @@ Parameters - Interaction.start(action, target, element)⚓➭ + Interaction.start(action, target, element)⚓➭ @@ -2356,7 +2356,7 @@ Parameters - Interaction.doMove()⚓➭ + Interaction.doMove()⚓➭ @@ -2403,7 +2403,7 @@ Interaction.doMove() - Interaction.end([event])⚓➭ + Interaction.end([event])⚓➭ diff --git a/dist/interact.js b/dist/interact.js index e8ae35c3b..c78a3c751 100644 --- a/dist/interact.js +++ b/dist/interact.js @@ -1,5 +1,5 @@ /** - * interact.js v1.3.0-alpha.3+sha.9595c40 + * interact.js v1.3.0-alpha.4+sha.7970416-dirty * * Copyright (c) 2012-2017 Taye Adeyemi * Open source under the MIT License. @@ -816,6 +816,7 @@ var scope = require('./scope'); var utils = require('./utils'); var events = require('./utils/events'); var browser = require('./utils/browser'); +var domObjects = require('./utils/domObjects'); var finder = require('./utils/interactionFinder'); var signals = require('./utils/Signals').new(); @@ -829,7 +830,9 @@ var prevTouchTime = 0; scope.interactions = []; var Interaction = function () { - function Interaction() { + function Interaction(_ref) { + var pointerType = _ref.pointerType; + _classCallCheck(this, Interaction); this.target = null; // current interactable being interacted with @@ -886,7 +889,7 @@ var Interaction = function () { this.pointerWasMoved = false; this._interacting = false; - this.mouse = false; + this.pointerType = pointerType; signals.fire('new', this); @@ -1130,6 +1133,11 @@ var Interaction = function () { }; Interaction.prototype.getPointerIndex = function getPointerIndex(pointer) { + // mouse and pen interactions may have only one pointer + if (this.pointerType === 'mouse' || this.pointerType === 'pen') { + return 0; + } + return utils.indexOf(this.pointerIds, utils.getPointerId(pointer)); }; @@ -1161,8 +1169,7 @@ var Interaction = function () { }; Interaction.prototype.removePointer = function removePointer(pointer, event) { - var id = utils.getPointerId(pointer); - var index = this.mouse ? 0 : utils.indexOf(this.pointerIds, id); + var index = this.getPointerIndex(pointer); if (index === -1) { return; @@ -1197,6 +1204,8 @@ for (var i = 0, len = methodNames.length; i < len; i++) { function doOnInteractions(method) { return function (event) { + var pointerType = utils.getPointerType(event); + var _utils$getEventTarget = utils.getEventTargets(event), eventTarget = _utils$getEventTarget[0], curEventTarget = _utils$getEventTarget[1]; @@ -1210,7 +1219,7 @@ function doOnInteractions(method) { var pointer = event.changedTouches[_i]; var interaction = finder.search(pointer, event.type, eventTarget); - matches.push([pointer, interaction || new Interaction()]); + matches.push([pointer, interaction || new Interaction({ pointerType: pointerType })]); } } else { var invalidPointer = false; @@ -1218,7 +1227,7 @@ function doOnInteractions(method) { if (!browser.supportsPointerEvent && /mouse/.test(event.type)) { // ignore mouse events while touch interactions are active for (var _i2 = 0; _i2 < scope.interactions.length && !invalidPointer; _i2++) { - invalidPointer = !scope.interactions[_i2].mouse && scope.interactions[_i2].pointerIsDown; + invalidPointer = scope.interactions[_i2].pointerType !== 'mouse' && scope.interactions[_i2].pointerIsDown; } // try to ignore mouse events that are simulated by the browser @@ -1232,11 +1241,7 @@ function doOnInteractions(method) { var _interaction = finder.search(event, event.type, eventTarget); if (!_interaction) { - - _interaction = new Interaction(); - _interaction.mouse = /mouse/i.test(event.pointerType || event.type) - // MSPointerEvent.MSPOINTER_TYPE_MOUSE - || event.pointerType === 4 || !event.pointerType; + _interaction = new Interaction({ pointerType: pointerType }); } matches.push([event, _interaction]); @@ -1244,20 +1249,20 @@ function doOnInteractions(method) { } for (var _iterator = matches, _isArray = Array.isArray(_iterator), _i3 = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { - var _ref; + var _ref2; if (_isArray) { if (_i3 >= _iterator.length) break; - _ref = _iterator[_i3++]; + _ref2 = _iterator[_i3++]; } else { _i3 = _iterator.next(); if (_i3.done) break; - _ref = _i3.value; + _ref2 = _i3.value; } - var _ref2 = _ref, - _pointer = _ref2[0], - _interaction2 = _ref2[1]; + var _ref3 = _ref2, + _pointer = _ref3[0], + _interaction2 = _ref3[1]; _interaction2._updateEventTargets(eventTarget, curEventTarget); _interaction2[method](_pointer, event, eventTarget, curEventTarget); @@ -1277,7 +1282,7 @@ function endAll(event) { var docEvents = {/* 'eventType': listenerFunc */}; var pEventTypes = browser.pEventTypes; -if (scope.PointerEvent) { +if (domObjects.PointerEvent) { docEvents[pEventTypes.down] = listeners.pointerDown; docEvents[pEventTypes.move] = listeners.pointerMove; docEvents[pEventTypes.up] = listeners.pointerUp; @@ -1295,8 +1300,8 @@ if (scope.PointerEvent) { docEvents.blur = endAll; -function onDocSignal(_ref3, signalName) { - var doc = _ref3.doc; +function onDocSignal(_ref4, signalName) { + var doc = _ref4.doc; var eventMethod = signalName.indexOf('add') === 0 ? events.add : events.remove; @@ -1311,14 +1316,14 @@ function onDocSignal(_ref3, signalName) { } } -signals.on('update-pointer-down', function (_ref4) { - var interaction = _ref4.interaction, - pointer = _ref4.pointer, - pointerId = _ref4.pointerId, - pointerIndex = _ref4.pointerIndex, - event = _ref4.event, - eventTarget = _ref4.eventTarget, - down = _ref4.down; +signals.on('update-pointer-down', function (_ref5) { + var interaction = _ref5.interaction, + pointer = _ref5.pointer, + pointerId = _ref5.pointerId, + pointerIndex = _ref5.pointerIndex, + event = _ref5.event, + eventTarget = _ref5.eventTarget, + down = _ref5.down; interaction.pointerIds[pointerIndex] = pointerId; interaction.pointers[pointerIndex] = pointer; @@ -1355,7 +1360,7 @@ scope.endAllInteractions = endAll; module.exports = Interaction; -},{"./scope":34,"./utils":44,"./utils/Signals":35,"./utils/browser":37,"./utils/events":40,"./utils/interactionFinder":45}],6:[function(require,module,exports){ +},{"./scope":34,"./utils":44,"./utils/Signals":35,"./utils/browser":37,"./utils/domObjects":38,"./utils/events":40,"./utils/interactionFinder":45}],6:[function(require,module,exports){ 'use strict'; var Interaction = require('../Interaction'); @@ -5460,7 +5465,7 @@ module.exports = function () { this.originalEvent = event; this.type = type; this.pointerId = pointerUtils.getPointerId(pointer); - this.pointerType = pointerUtils.getPointerType(pointer, interaction); + this.pointerType = pointerUtils.getPointerType(pointer); this.target = eventTarget; this.currentTarget = null; @@ -5758,8 +5763,10 @@ Interaction.signals.on('down', function (_ref6) { timer.duration = minDuration; timer.timeout = setTimeout(function () { fire({ - interaction: interaction, eventCopy: eventCopy, eventTarget: eventTarget, + interaction: interaction, + eventTarget: eventTarget, pointer: browser.isIE8 ? eventCopy : pointer, + event: eventCopy, type: 'hold' }); }, minDuration); @@ -6946,17 +6953,14 @@ module.exports = utils; var scope = require('../scope'); var utils = require('./index'); -var browser = require('./browser'); var finder = { - methodOrder: ['simulationResume', 'mouse', 'hasPointer', 'idle'], + methodOrder: ['simulationResume', 'mouseOrPen', 'hasPointer', 'idle'], search: function search(pointer, eventType, eventTarget) { - var mouseEvent = /mouse/i.test(pointer.pointerType || eventType) - // MSPointerEvent.MSPOINTER_TYPE_MOUSE - || pointer.pointerType === 4; + var pointerType = utils.getPointerType(pointer); var pointerId = utils.getPointerId(pointer); - var details = { pointer: pointer, pointerId: pointerId, mouseEvent: mouseEvent, eventType: eventType, eventTarget: eventTarget }; + var details = { pointer: pointer, pointerId: pointerId, pointerType: pointerType, eventType: eventType, eventTarget: eventTarget }; for (var _iterator = finder.methodOrder, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { var _ref; @@ -6982,7 +6986,7 @@ var finder = { // try to resume simulation with a new pointer simulationResume: function simulationResume(_ref2) { - var mouseEvent = _ref2.mouseEvent, + var pointerType = _ref2.pointerType, eventType = _ref2.eventType, eventTarget = _ref2.eventTarget; @@ -7006,7 +7010,7 @@ var finder = { var element = eventTarget; - if (interaction.simulation && interaction.simulation.allowResume && interaction.mouse === mouseEvent) { + if (interaction.simulation && interaction.simulation.allowResume && interaction.pointerType === pointerType) { while (element) { // if the element is the interaction element if (element === interaction.element) { @@ -7020,13 +7024,13 @@ var finder = { return null; }, - // if it's a mouse interaction - mouse: function mouse(_ref4) { + // if it's a mouse or pen interaction + mouseOrPen: function mouseOrPen(_ref4) { var pointerId = _ref4.pointerId, - mouseEvent = _ref4.mouseEvent, + pointerType = _ref4.pointerType, eventType = _ref4.eventType; - if (!mouseEvent && (browser.supportsTouch || browser.supportsPointerEvent)) { + if (pointerType !== 'mouse' && pointerType !== 'pen') { return null; } @@ -7046,7 +7050,7 @@ var finder = { var interaction = _ref5; - if (interaction.mouse) { + if (interaction.pointerType === pointerType) { // if it's a down event, skip interactions with running simulations if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; @@ -7069,8 +7073,8 @@ var finder = { return firstNonActive; } - // Find any interaction specifically for mouse. - // ignore the interaction if the eventType is a mousedown, and a simulation + // find any mouse or pen interaction. + // ignore the interaction if the eventType is a *down, and a simulation // is active for (var _iterator4 = scope.interactions, _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) { var _ref6; @@ -7086,7 +7090,7 @@ var finder = { var _interaction = _ref6; - if (_interaction.mouse && !(/down/.test(eventType) && _interaction.simulation)) { + if (_interaction.pointerType === pointerType && !(/down/i.test(eventType) && _interaction.simulation)) { return _interaction; } } @@ -7118,9 +7122,9 @@ var finder = { } }, - // get first idle interaction + // get first idle interaction with a matching pointerType idle: function idle(_ref9) { - var mouseEvent = _ref9.mouseEvent; + var pointerType = _ref9.pointerType; for (var _iterator6 = scope.interactions, _isArray6 = Array.isArray(_iterator6), _i6 = 0, _iterator6 = _isArray6 ? _iterator6 : _iterator6[Symbol.iterator]();;) { var _ref10; @@ -7150,7 +7154,7 @@ var finder = { continue; } - if (!interaction.interacting() && mouseEvent === interaction.mouse) { + if (!interaction.interacting() && pointerType === interaction.pointerType) { return interaction; } } @@ -7161,7 +7165,7 @@ var finder = { module.exports = finder; -},{"../scope":34,"./browser":37,"./index":44}],46:[function(require,module,exports){ +},{"../scope":34,"./index":44}],46:[function(require,module,exports){ 'use strict'; var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; @@ -7262,6 +7266,7 @@ var hypot = require('./hypot'); var browser = require('./browser'); var dom = require('./domObjects'); var domUtils = require('./domUtils'); +var domObjects = require('./domObjects'); var is = require('./is'); var pointerExtend = require('./pointerExtend'); @@ -7468,17 +7473,11 @@ var pointerUtils = { return angle; }, - getPointerType: function getPointerType(pointer, interaction) { - // if the PointerEvent API isn't available, then the pointer must be ither - // a MouseEvent or TouchEvent - if (interaction.mouse) { - return 'mouse'; - } - if (!browser.supportsPointerEvent) { - return 'touch'; - } - - return is.string(pointer.pointerType) ? pointer.pointerType : [undefined, undefined, 'touch', 'pen', 'mouse'][pointer.pointerType]; + getPointerType: function getPointerType(pointer) { + return is.string(pointer.pointerType) ? pointer.pointerType : is.number(pointer.pointerType) ? [undefined, undefined, 'touch', 'pen', 'mouse'][pointer.pointerType] + // if the PointerEvent API isn't available, then the "pointer" must + // be either a MouseEvent, TouchEvent, or Touch object + : /touch/.test(pointer.type) || pointer instanceof domObjects.Touch ? 'touch' : 'mouse'; }, // [ event.target, event.currentTarget ] diff --git a/dist/interact.js.map b/dist/interact.js.map index 60832b766..4f3a62ba8 100644 --- a/dist/interact.js.map +++ b/dist/interact.js.map @@ -1 +1 @@ -{"version":3,"sources":["src/header.js","node_modules/browser-pack/_prelude.js","index.js","src/Eventable.js","src/InteractEvent.js","src/Interactable.js","src/Interaction.js","src/actions/base.js","src/actions/drag.js","src/actions/drop.js","src/actions/gesture.js","src/actions/resize.js","src/autoScroll.js","src/autoStart/InteractableMethods.js","src/autoStart/base.js","src/autoStart/delay.js","src/autoStart/drag.js","src/autoStart/gesture.js","src/autoStart/resize.js","src/defaultOptions.js","src/index.js","src/inertia.js","src/interact.js","src/interactablePreventDefault.js","src/legacyBrowsers.js","src/modifiers/index.js","src/modifiers/restrict.js","src/modifiers/restrictEdges.js","src/modifiers/restrictSize.js","src/modifiers/snap.js","src/modifiers/snapSize.js","src/pointerEvents/PointerEvent.js","src/pointerEvents/base.js","src/pointerEvents/holdRepeat.js","src/pointerEvents/interactableTargets.js","src/scope.js","src/utils/Signals.js","src/utils/arr.js","src/utils/browser.js","src/utils/domObjects.js","src/utils/domUtils.js","src/utils/events.js","src/utils/extend.js","src/utils/getOriginXY.js","src/utils/hypot.js","src/utils/index.js","src/utils/interactionFinder.js","src/utils/is.js","src/utils/isWindow.js","src/utils/pointerExtend.js","src/utils/pointerUtils.js","src/utils/raf.js","src/utils/rect.js","src/utils/window.js"],"names":[],"mappings":"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","file":"interact.js","sourceRoot":"","sourcesContent":["/**\n * interact.js v1.3.0-alpha.3+sha.9595c40\n *\n * Copyright (c) 2012-2017 Taye Adeyemi \n * Open source under the MIT License.\n * https://raw.github.com/taye/interact.js/master/LICENSE\n */\n","(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o 150) {\n return null;\n }\n\n let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI;\n const overlap = 22.5;\n\n if (angle < 0) {\n angle += 360;\n }\n\n const left = 135 - overlap <= angle && angle < 225 + overlap;\n const up = 225 - overlap <= angle && angle < 315 + overlap;\n\n const right = !left && (315 - overlap <= angle || angle < 45 + overlap);\n const down = !up && 45 - overlap <= angle && angle < 135 + overlap;\n\n return {\n up,\n down,\n left,\n right,\n angle,\n speed: interaction.prevEvent.speed,\n velocity: {\n x: interaction.prevEvent.velocityX,\n y: interaction.prevEvent.velocityY,\n },\n };\n }\n\n preventDefault () {}\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n}\n\nsignals.on('set-delta', function ({ iEvent, interaction, starting, deltaSource }) {\n const prevEvent = starting? iEvent : interaction.prevEvent;\n\n if (deltaSource === 'client') {\n iEvent.dx = iEvent.clientX - prevEvent.clientX;\n iEvent.dy = iEvent.clientY - prevEvent.clientY;\n }\n else {\n iEvent.dx = iEvent.pageX - prevEvent.pageX;\n iEvent.dy = iEvent.pageY - prevEvent.pageY;\n }\n});\n\nInteractEvent.signals = signals;\n\nmodule.exports = InteractEvent;\n","const is = require('./utils/is');\nconst events = require('./utils/events');\nconst extend = require('./utils/extend');\nconst actions = require('./actions/base');\nconst scope = require('./scope');\nconst Eventable = require('./Eventable');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nconst {\n getElementRect,\n nodeContains,\n trySelector,\n} = require('./utils/domUtils');\nconst { getWindow } = require('./utils/window');\nconst { indexOf, contains } = require('./utils/arr');\nconst { wheelEvent } = require('./utils/browser');\n\n// all set interactables\nscope.interactables = [];\n\n/*\\\n * Interactable\n [ property ]\n **\n * Object type returned by @interact\n\\*/\nclass Interactable {\n constructor (target, options) {\n options = options || {};\n\n this.target = target;\n this.events = new Eventable();\n this._context = options.context || scope.document;\n this._win = getWindow(trySelector(target)? this._context : target);\n this._doc = this._win.document;\n\n signals.fire('new', {\n target,\n options,\n interactable: this,\n win: this._win,\n });\n\n scope.addDocument( this._doc, this._win );\n\n scope.interactables.push(this);\n\n this.set(options);\n }\n\n setOnEvents (action, phases) {\n const onAction = 'on' + action;\n\n if (is.function(phases.onstart) ) { this.events[onAction + 'start' ] = phases.onstart ; }\n if (is.function(phases.onmove) ) { this.events[onAction + 'move' ] = phases.onmove ; }\n if (is.function(phases.onend) ) { this.events[onAction + 'end' ] = phases.onend ; }\n if (is.function(phases.oninertiastart)) { this.events[onAction + 'inertiastart' ] = phases.oninertiastart ; }\n\n return this;\n }\n\n setPerAction (action, options) {\n // for all the default per-action options\n for (const option in options) {\n // if this option exists for this action\n if (option in defaults[action]) {\n // if the option in the options arg is an object value\n if (is.object(options[option])) {\n // duplicate the object\n this.options[action][option] = extend(this.options[action][option] || {}, options[option]);\n\n if (is.object(defaults.perAction[option]) && 'enabled' in defaults.perAction[option]) {\n this.options[action][option].enabled = options[option].enabled === false? false : true;\n }\n }\n else if (is.bool(options[option]) && is.object(defaults.perAction[option])) {\n this.options[action][option].enabled = options[option];\n }\n else if (options[option] !== undefined) {\n // or if it's not undefined, do a plain assignment\n this.options[action][option] = options[option];\n }\n }\n }\n }\n\n /*\\\n * Interactable.getRect\n [ method ]\n *\n * The default function to get an Interactables bounding rect. Can be\n * overridden using @Interactable.rectChecker.\n *\n - element (Element) #optional The element to measure.\n = (object) The object's bounding rectangle.\n o {\n o top : 0,\n o left : 0,\n o bottom: 0,\n o right : 0,\n o width : 0,\n o height: 0\n o }\n \\*/\n getRect (element) {\n element = element || this.target;\n\n if (is.string(this.target) && !(is.element(element))) {\n element = this._context.querySelector(this.target);\n }\n\n return getElementRect(element);\n }\n\n /*\\\n * Interactable.rectChecker\n [ method ]\n *\n * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n - checker (function) #optional A function which returns this Interactable's bounding rectangle. See @Interactable.getRect\n = (function | object) The checker function or this Interactable\n \\*/\n rectChecker (checker) {\n if (is.function(checker)) {\n this.getRect = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.getRect;\n\n return this;\n }\n\n return this.getRect;\n }\n\n _backCompatOption (optionName, newValue) {\n if (trySelector(newValue) || is.object(newValue)) {\n this.options[optionName] = newValue;\n\n for (const action of actions.names) {\n this.options[action][optionName] = newValue;\n }\n\n return this;\n }\n\n return this.options[optionName];\n }\n\n /*\\\n * Interactable.origin\n [ method ]\n *\n * Gets or sets the origin of the Interactable's element. The x and y\n * of the origin will be subtracted from action event coordinates.\n *\n - origin (object | string) #optional An object eg. { x: 0, y: 0 } or string 'parent', 'self' or any CSS selector\n * OR\n - origin (Element) #optional An HTML or SVG Element whose rect will be used\n **\n = (object) The current origin or this Interactable\n \\*/\n origin (newValue) {\n return this._backCompatOption('origin', newValue);\n }\n\n /*\\\n * Interactable.deltaSource\n [ method ]\n *\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n - newValue (string) #optional Use 'client' if you will be scrolling while interacting; Use 'page' if you want autoScroll to work\n = (string | object) The current deltaSource or this Interactable\n \\*/\n deltaSource (newValue) {\n if (newValue === 'page' || newValue === 'client') {\n this.options.deltaSource = newValue;\n\n return this;\n }\n\n return this.options.deltaSource;\n }\n\n /*\\\n * Interactable.context\n [ method ]\n *\n * Gets the selector context Node of the Interactable. The default is `window.document`.\n *\n = (Node) The context Node of this Interactable\n **\n \\*/\n context () {\n return this._context;\n }\n\n inContext (element) {\n return (this._context === element.ownerDocument\n || nodeContains(this._context, element));\n }\n\n /*\\\n * Interactable.fire\n [ method ]\n *\n * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n - iEvent (InteractEvent) The InteractEvent object to be fired on this Interactable\n = (Interactable) this Interactable\n \\*/\n fire (iEvent) {\n this.events.fire(iEvent);\n\n return this;\n }\n\n _onOffMultiple (method, eventType, listener, options) {\n if (is.string(eventType) && eventType.search(' ') !== -1) {\n eventType = eventType.trim().split(/ +/);\n }\n\n if (is.array(eventType)) {\n for (let i = 0; i < eventType.length; i++) {\n this[method](eventType[i], listener, options);\n }\n\n return true;\n }\n\n if (is.object(eventType)) {\n for (const prop in eventType) {\n this[method](prop, eventType[prop], listener);\n }\n\n return true;\n }\n }\n\n /*\\\n * Interactable.on\n [ method ]\n *\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n - eventType (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) This Interactable\n \\*/\n on (eventType, listener, options) {\n if (this._onOffMultiple('on', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.on(eventType, listener);\n }\n // delegated event for selector\n else if (is.string(this.target)) {\n events.addDelegate(this.target, this._context, eventType, listener, options);\n }\n else {\n events.add(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.off\n [ method ]\n *\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n - eventType (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) This Interactable\n \\*/\n off (eventType, listener, options) {\n if (this._onOffMultiple('off', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n // if it is an action event type\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.off(eventType, listener);\n }\n // delegated event\n else if (is.string(this.target)) {\n events.removeDelegate(this.target, this._context, eventType, listener, options);\n }\n // remove listener from this Interatable's element\n else {\n events.remove(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.set\n [ method ]\n *\n * Reset the options of this Interactable\n - options (object) The new settings to apply\n = (object) This Interactable\n \\*/\n set (options) {\n if (!is.object(options)) {\n options = {};\n }\n\n this.options = extend({}, defaults.base);\n\n const perActions = extend({}, defaults.perAction);\n\n for (const actionName in actions.methodDict) {\n const methodName = actions.methodDict[actionName];\n\n this.options[actionName] = extend({}, defaults[actionName]);\n\n this.setPerAction(actionName, perActions);\n\n this[methodName](options[actionName]);\n }\n\n for (const setting of Interactable.settingsMethods) {\n this.options[setting] = defaults.base[setting];\n\n if (setting in options) {\n this[setting](options[setting]);\n }\n }\n\n signals.fire('set', {\n options,\n interactable: this,\n });\n\n return this;\n }\n\n /*\\\n * Interactable.unset\n [ method ]\n *\n * Remove this interactable from the list of interactables and remove\n * it's action capabilities and event listeners\n *\n = (object) @interact\n \\*/\n unset () {\n events.remove(this.target, 'all');\n\n if (is.string(this.target)) {\n // remove delegated events\n for (const type in events.delegatedEvents) {\n const delegated = events.delegatedEvents[type];\n\n if (delegated.selectors[0] === this.target\n && delegated.contexts[0] === this._context) {\n\n delegated.selectors.splice(0, 1);\n delegated.contexts .splice(0, 1);\n delegated.listeners.splice(0, 1);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegated[type] = null;\n }\n }\n\n events.remove(this._context, type, events.delegateListener);\n events.remove(this._context, type, events.delegateUseCapture, true);\n }\n }\n else {\n events.remove(this, 'all');\n }\n\n signals.fire('unset', { interactable: this });\n\n scope.interactables.splice(indexOf(scope.interactables, this), 1);\n\n // Stop related interactions when an Interactable is unset\n for (const interaction of scope.interactions || []) {\n if (interaction.target === this && interaction.interacting()) {\n interaction.stop();\n }\n }\n\n return scope.interact;\n }\n}\n\nscope.interactables.indexOfElement = function indexOfElement (target, context) {\n context = context || scope.document;\n\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n if (interactable.target === target && interactable._context === context) {\n return i;\n }\n }\n return -1;\n};\n\nscope.interactables.get = function interactableGet (element, options, dontCheckInContext) {\n const ret = this[this.indexOfElement(element, options && options.context)];\n\n return ret && (is.string(element) || dontCheckInContext || ret.inContext(element))? ret : null;\n};\n\nscope.interactables.forEachSelector = function (callback, element) {\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n // skip non CSS selector targets and out of context elements\n if (!is.string(interactable.target)\n || (element && !interactable.inContext(element))) {\n continue;\n }\n\n const ret = callback(interactable, interactable.target, interactable._context, i, this);\n\n if (ret !== undefined) {\n return ret;\n }\n }\n};\n\n// all interact.js eventTypes\nInteractable.eventTypes = scope.eventTypes = [];\n\nInteractable.signals = signals;\n\nInteractable.settingsMethods = [ 'deltaSource', 'origin', 'preventDefault', 'rectChecker' ];\n\nmodule.exports = Interactable;\n","const scope = require('./scope');\nconst utils = require('./utils');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst finder = require('./utils/interactionFinder');\nconst signals = require('./utils/Signals').new();\n\nconst listeners = {};\nconst methodNames = [\n 'pointerDown', 'pointerMove', 'pointerUp',\n 'updatePointer', 'removePointer',\n];\n\n// for ignoring browser's simulated mouse events\nlet prevTouchTime = 0;\n\n// all active and idle interactions\nscope.interactions = [];\n\nclass Interaction {\n constructor () {\n this.target = null; // current interactable being interacted with\n this.element = null; // the target element of the interactable\n\n this.prepared = { // action that's ready to be fired on next move event\n name : null,\n axis : null,\n edges: null,\n };\n\n // keep track of added pointers\n this.pointers = [];\n this.pointerIds = [];\n this.downTargets = [];\n this.downTimes = [];\n\n // Previous native pointer move event coordinates\n this.prevCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n // current native pointer move event coordinates\n this.curCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Starting InteractEvent pointer coordinates\n this.startCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Change in coordinates and time of the pointer\n this.pointerDelta = {\n page : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n client : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n timeStamp: 0,\n };\n\n this.downEvent = null; // pointerdown/mousedown/touchstart event\n this.downPointer = {};\n\n this._eventTarget = null;\n this._curEventTarget = null;\n\n this.prevEvent = null; // previous action event\n\n this.pointerIsDown = false;\n this.pointerWasMoved = false;\n this._interacting = false;\n\n this.mouse = false;\n\n signals.fire('new', this);\n\n scope.interactions.push(this);\n }\n\n pointerDown (pointer, event, eventTarget) {\n const pointerIndex = this.updatePointer(pointer, event, true);\n\n signals.fire('down', {\n pointer,\n event,\n eventTarget,\n pointerIndex,\n interaction: this,\n });\n }\n\n /*\\\n * Interaction.start\n [ method ]\n *\n * Start an action with the given Interactable and Element as tartgets. The\n * action must be enabled for the target Interactable and an appropriate number\n * of pointers must be held down - 1 for drag/resize, 2 for gesture.\n *\n * Use it with `interactable.able({ manualStart: false })` to always\n * [start actions manually](https://github.com/taye/interact.js/issues/114)\n *\n - action (object) The action to be performed - drag, resize, etc.\n - target (Interactable) The Interactable to target\n - element (Element) The DOM Element to target\n = (object) interact\n **\n | interact(target)\n | .draggable({\n | // disable the default drag start by down->move\n | manualStart: true\n | })\n | // start dragging after the user holds the pointer down\n | .on('hold', function (event) {\n | var interaction = event.interaction;\n |\n | if (!interaction.interacting()) {\n | interaction.start({ name: 'drag' },\n | event.interactable,\n | event.currentTarget);\n | }\n | });\n \\*/\n start (action, target, element) {\n if (this.interacting()\n || !this.pointerIsDown\n || this.pointerIds.length < (action.name === 'gesture'? 2 : 1)) {\n return;\n }\n\n // if this interaction had been removed after stopping\n // add it back\n if (utils.indexOf(scope.interactions, this) === -1) {\n scope.interactions.push(this);\n }\n\n utils.copyAction(this.prepared, action);\n this.target = target;\n this.element = element;\n\n signals.fire('action-start', {\n interaction: this,\n event: this.downEvent,\n });\n }\n\n pointerMove (pointer, event, eventTarget) {\n if (!this.simulation) {\n this.updatePointer(pointer);\n utils.setCoords(this.curCoords, this.pointers);\n }\n\n const duplicateMove = (this.curCoords.page.x === this.prevCoords.page.x\n && this.curCoords.page.y === this.prevCoords.page.y\n && this.curCoords.client.x === this.prevCoords.client.x\n && this.curCoords.client.y === this.prevCoords.client.y);\n\n let dx;\n let dy;\n\n // register movement greater than pointerMoveTolerance\n if (this.pointerIsDown && !this.pointerWasMoved) {\n dx = this.curCoords.client.x - this.startCoords.client.x;\n dy = this.curCoords.client.y - this.startCoords.client.y;\n\n this.pointerWasMoved = utils.hypot(dx, dy) > Interaction.pointerMoveTolerance;\n }\n\n const signalArg = {\n pointer,\n pointerIndex: this.getPointerIndex(pointer),\n event,\n eventTarget,\n dx,\n dy,\n duplicate: duplicateMove,\n interaction: this,\n interactingBeforeMove: this.interacting(),\n };\n\n if (!duplicateMove) {\n // set pointer coordinate, time changes and speeds\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n }\n\n signals.fire('move', signalArg);\n\n if (!duplicateMove) {\n // if interacting, fire an 'action-move' signal etc\n if (this.interacting()) {\n this.doMove(signalArg);\n }\n\n if (this.pointerWasMoved) {\n utils.copyCoords(this.prevCoords, this.curCoords);\n }\n }\n }\n\n /*\\\n * Interaction.doMove\n [ method ]\n *\n * Force a move of the current action at the same coordinates. Useful if\n * snap/restrict has been changed and you want a movement with the new\n * settings.\n *\n **\n | interact(target)\n | .draggable(true)\n | .on('dragmove', function (event) {\n | if (someCondition) {\n | // change the snap settings\n | event.interactable.draggable({ snap: { targets: [] }});\n | // fire another move event with re-calculated snap\n | event.interaction.doMove();\n | }\n | });\n \\*/\n doMove (signalArg) {\n signalArg = utils.extend({\n pointer: this.pointers[0],\n event: this.prevEvent,\n eventTarget: this._eventTarget,\n interaction: this,\n }, signalArg || {});\n\n signals.fire('before-action-move', signalArg);\n\n if (!this._dontFireMove) {\n signals.fire('action-move', signalArg);\n }\n\n this._dontFireMove = false;\n }\n\n // End interact move events and stop auto-scroll unless simulation is running\n pointerUp (pointer, event, eventTarget, curEventTarget) {\n const pointerIndex = this.getPointerIndex(pointer);\n\n signals.fire(/cancel$/i.test(event.type)? 'cancel' : 'up', {\n pointer,\n pointerIndex,\n event,\n eventTarget,\n curEventTarget,\n interaction: this,\n });\n\n if (!this.simulation) {\n this.end(event);\n }\n\n this.pointerIsDown = false;\n this.removePointer(pointer, event);\n }\n\n /*\\\n * Interaction.end\n [ method ]\n *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n - event (PointerEvent) #optional\n **\n | interact(target)\n | .draggable(true)\n | .on('move', function (event) {\n | if (event.pageX > 1000) {\n | // end the current action\n | event.interaction.end();\n | // stop all further listeners from being called\n | event.stopImmediatePropagation();\n | }\n | });\n \\*/\n end (event) {\n event = event || this.prevEvent;\n\n if (this.interacting()) {\n signals.fire('action-end', {\n event,\n interaction: this,\n });\n }\n\n this.stop();\n }\n\n currentAction () {\n return this._interacting? this.prepared.name: null;\n }\n\n interacting () {\n return this._interacting;\n }\n\n stop () {\n signals.fire('stop', { interaction: this });\n\n if (this._interacting) {\n signals.fire('stop-active', { interaction: this });\n signals.fire('stop-' + this.prepared.name, { interaction: this });\n }\n\n this.target = this.element = null;\n\n this._interacting = false;\n this.prepared.name = this.prevEvent = null;\n }\n\n getPointerIndex (pointer) {\n return utils.indexOf(this.pointerIds, utils.getPointerId(pointer));\n }\n\n updatePointer (pointer, event, down = event && /(down|start)$/i.test(event.type)) {\n const id = utils.getPointerId(pointer);\n let index = this.getPointerIndex(pointer);\n\n if (index === -1) {\n index = this.pointerIds.length;\n this.pointerIds[index] = id;\n }\n\n if (down) {\n signals.fire('update-pointer-down', {\n pointer,\n event,\n down,\n pointerId: id,\n pointerIndex: index,\n interaction: this,\n });\n }\n\n this.pointers[index] = pointer;\n\n return index;\n }\n\n removePointer (pointer, event) {\n const id = utils.getPointerId(pointer);\n const index = this.mouse? 0 : utils.indexOf(this.pointerIds, id);\n\n if (index === -1) { return; }\n\n signals.fire('remove-pointer', {\n pointer,\n event,\n pointerIndex: index,\n interaction: this,\n });\n\n this.pointers .splice(index, 1);\n this.pointerIds .splice(index, 1);\n this.downTargets.splice(index, 1);\n this.downTimes .splice(index, 1);\n }\n\n _updateEventTargets (target, currentTarget) {\n this._eventTarget = target;\n this._curEventTarget = currentTarget;\n }\n}\n\nfor (let i = 0, len = methodNames.length; i < len; i++) {\n const method = methodNames[i];\n\n listeners[method] = doOnInteractions(method);\n}\n\nfunction doOnInteractions (method) {\n return (function (event) {\n const [eventTarget, curEventTarget] = utils.getEventTargets(event);\n const matches = []; // [ [pointer, interaction], ...]\n\n if (browser.supportsTouch && /touch/.test(event.type)) {\n prevTouchTime = new Date().getTime();\n\n for (let i = 0; i < event.changedTouches.length; i++) {\n const pointer = event.changedTouches[i];\n const interaction = finder.search(pointer, event.type, eventTarget);\n\n matches.push([pointer, interaction || new Interaction()]);\n }\n }\n else {\n let invalidPointer = false;\n\n if (!browser.supportsPointerEvent && /mouse/.test(event.type)) {\n // ignore mouse events while touch interactions are active\n for (let i = 0; i < scope.interactions.length && !invalidPointer; i++) {\n invalidPointer = !scope.interactions[i].mouse && scope.interactions[i].pointerIsDown;\n }\n\n // try to ignore mouse events that are simulated by the browser\n // after a touch event\n invalidPointer = invalidPointer\n || (new Date().getTime() - prevTouchTime < 500)\n // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated\n || event.timeStamp === 0;\n }\n\n if (!invalidPointer) {\n let interaction = finder.search(event, event.type, eventTarget);\n\n if (!interaction) {\n\n interaction = new Interaction();\n interaction.mouse = (/mouse/i.test(event.pointerType || event.type)\n // MSPointerEvent.MSPOINTER_TYPE_MOUSE\n || event.pointerType === 4\n || !event.pointerType);\n }\n\n matches.push([event, interaction]);\n }\n }\n\n for (const [pointer, interaction] of matches) {\n interaction._updateEventTargets(eventTarget, curEventTarget);\n interaction[method](pointer, event, eventTarget, curEventTarget);\n }\n });\n}\n\nfunction endAll (event) {\n for (let i = 0; i < scope.interactions.length; i++) {\n const interaction = scope.interactions[i];\n\n interaction.end(event);\n signals.fire('endall', { event, interaction });\n }\n}\n\nconst docEvents = { /* 'eventType': listenerFunc */ };\nconst pEventTypes = browser.pEventTypes;\n\nif (scope.PointerEvent) {\n docEvents[pEventTypes.down ] = listeners.pointerDown;\n docEvents[pEventTypes.move ] = listeners.pointerMove;\n docEvents[pEventTypes.up ] = listeners.pointerUp;\n docEvents[pEventTypes.cancel] = listeners.pointerUp;\n}\nelse {\n docEvents.mousedown = listeners.pointerDown;\n docEvents.mousemove = listeners.pointerMove;\n docEvents.mouseup = listeners.pointerUp;\n\n docEvents.touchstart = listeners.pointerDown;\n docEvents.touchmove = listeners.pointerMove;\n docEvents.touchend = listeners.pointerUp;\n docEvents.touchcancel = listeners.pointerUp;\n}\n\ndocEvents.blur = endAll;\n\nfunction onDocSignal ({ doc }, signalName) {\n const eventMethod = signalName.indexOf('add') === 0\n ? events.add : events.remove;\n\n // delegate event listener\n for (const eventType in scope.delegatedEvents) {\n eventMethod(doc, eventType, events.delegateListener);\n eventMethod(doc, eventType, events.delegateUseCapture, true);\n }\n\n for (const eventType in docEvents) {\n eventMethod(doc, eventType, docEvents[eventType]);\n }\n}\n\nsignals.on('update-pointer-down', ({ interaction, pointer, pointerId, pointerIndex, event, eventTarget, down }) => {\n interaction.pointerIds[pointerIndex] = pointerId;\n interaction.pointers[pointerIndex] = pointer;\n\n if (down) {\n interaction.pointerIsDown = true;\n }\n\n if (!interaction.interacting()) {\n utils.setCoords(interaction.startCoords, interaction.pointers);\n\n utils.copyCoords(interaction.curCoords , interaction.startCoords);\n utils.copyCoords(interaction.prevCoords, interaction.startCoords);\n\n interaction.downEvent = event;\n interaction.downTimes[pointerIndex] = interaction.curCoords.timeStamp;\n interaction.downTargets[pointerIndex] = eventTarget || event && utils.getEventTargets(event)[0];\n interaction.pointerWasMoved = false;\n\n utils.pointerExtend(interaction.downPointer, pointer);\n }\n});\n\nscope.signals.on('add-document' , onDocSignal);\nscope.signals.on('remove-document', onDocSignal);\n\nInteraction.pointerMoveTolerance = 1;\nInteraction.doOnInteractions = doOnInteractions;\nInteraction.endAll = endAll;\nInteraction.signals = signals;\nInteraction.docEvents = docEvents;\n\nscope.endAllInteractions = endAll;\n\nmodule.exports = Interaction;\n","const Interaction = require('../Interaction');\nconst InteractEvent = require('../InteractEvent');\n\nconst actions = {\n firePrepared,\n names: [],\n methodDict: {},\n};\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n interaction._interacting = true;\n firePrepared(interaction, event, 'start');\n});\n\nInteraction.signals.on('action-move', function ({ interaction, event, preEnd }) {\n firePrepared(interaction, event, 'move', preEnd);\n\n // if the action was ended in a listener\n if (!interaction.interacting()) { return false; }\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n firePrepared(interaction, event, 'end');\n});\n\nfunction firePrepared (interaction, event, phase, preEnd) {\n const actionName = interaction.prepared.name;\n\n const newEvent = new InteractEvent(interaction, event, actionName, phase, interaction.element, null, preEnd);\n\n interaction.target.fire(newEvent);\n interaction.prevEvent = newEvent;\n}\n\nmodule.exports = actions;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drag = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n startAxis : 'xy',\n lockAxis : 'xy',\n },\n\n checker: function (pointer, event, interactable) {\n const dragOptions = interactable.options.drag;\n\n return dragOptions.enabled\n ? { name: 'drag', axis: (dragOptions.lockAxis === 'start'\n ? dragOptions.startAxis\n : dragOptions.lockAxis)}\n : null;\n },\n\n getCursor: function () {\n return 'move';\n },\n};\n\nInteraction.signals.on('before-action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n interaction.curCoords.page.y = interaction.startCoords.page.y;\n interaction.curCoords.client.y = interaction.startCoords.client.y;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vx);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vx);\n interaction.pointerDelta.client.vy = 0;\n interaction.pointerDelta.page.vy = 0;\n }\n else if (axis === 'y') {\n interaction.curCoords.page.x = interaction.startCoords.page.x;\n interaction.curCoords.client.x = interaction.startCoords.client.x;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vy);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vy);\n interaction.pointerDelta.client.vx = 0;\n interaction.pointerDelta.page.vx = 0;\n }\n});\n\n// dragmove\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'dragmove') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n iEvent.pageY = interaction.startCoords.page.y;\n iEvent.clientY = interaction.startCoords.client.y;\n iEvent.dy = 0;\n }\n else if (axis === 'y') {\n iEvent.pageX = interaction.startCoords.page.x;\n iEvent.clientX = interaction.startCoords.client.x;\n iEvent.dx = 0;\n }\n});\n\n/*\\\n * Interactable.draggable\n [ method ]\n *\n * Gets or sets whether drag actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of drag events\n | var isDraggable = interact('ul li').draggable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on drag events (object makes the Interactable draggable)\n = (object) This Interactable\n | interact(element).draggable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // the axis in which the first movement must be\n | // for the drag sequence to start\n | // 'xy' by default - any direction\n | startAxis: 'x' || 'y' || 'xy',\n |\n | // 'xy' by default - don't restrict to one axis (move in any direction)\n | // 'x' or 'y' to restrict movement to either axis\n | // 'start' to restrict movement to the axis the drag started in\n | lockAxis: 'x' || 'y' || 'xy' || 'start',\n |\n | // max number of drags that can happen concurrently\n | // with elements of this Interactable. Infinity by default\n | max: Infinity,\n |\n | // max number of drags that can target the same element+Interactable\n | // 1 by default\n | maxPerElement: 2\n | });\n\\*/\nInteractable.prototype.draggable = function (options) {\n if (utils.is.object(options)) {\n this.options.drag.enabled = options.enabled === false? false: true;\n this.setPerAction('drag', options);\n this.setOnEvents('drag', options);\n\n if (/^(xy|x|y|start)$/.test(options.lockAxis)) {\n this.options.drag.lockAxis = options.lockAxis;\n }\n if (/^(xy|x|y)$/.test(options.startAxis)) {\n this.options.drag.startAxis = options.startAxis;\n }\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drag.enabled = options;\n\n if (!options) {\n this.ondragstart = this.ondragstart = this.ondragend = null;\n }\n\n return this;\n }\n\n return this.options.drag;\n};\n\nactions.drag = drag;\nactions.names.push('drag');\nutils.merge(Interactable.eventTypes, [\n 'dragstart',\n 'dragmove',\n 'draginertiastart',\n 'draginertiaresume',\n 'dragend',\n]);\nactions.methodDict.drag = 'draggable';\n\ndefaultOptions.drag = drag.defaults;\n\nmodule.exports = drag;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst scope = require('../scope');\nconst interact = require('../interact');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drop = {\n defaults: {\n enabled: false,\n accept : null,\n overlap: 'pointer',\n },\n};\n\nlet dynamicDrop = false;\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // reset active dropzones\n interaction.activeDrops.dropzones = [];\n interaction.activeDrops.elements = [];\n interaction.activeDrops.rects = [];\n\n interaction.dropEvents = null;\n\n if (!interaction.dynamicDrop) {\n setActiveDrops(interaction, interaction.element);\n }\n\n const dragEvent = interaction.prevEvent;\n const dropEvents = getDropEvents(interaction, event, dragEvent);\n\n if (dropEvents.activate) {\n fireActiveDrops(interaction, dropEvents.activate);\n }\n});\n\nInteractEvent.signals.on('new', function ({ interaction, iEvent, event }) {\n if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { return; }\n\n const draggableElement = interaction.element;\n const dragEvent = iEvent;\n const dropResult = getDrop(dragEvent, event, draggableElement);\n\n interaction.dropTarget = dropResult.dropzone;\n interaction.dropElement = dropResult.element;\n\n interaction.dropEvents = getDropEvents(interaction, event, dragEvent);\n});\n\nInteraction.signals.on('action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n fireDropEvents(interaction, interaction.dropEvents);\n});\n\nInteraction.signals.on('action-end', function ({ interaction }) {\n if (interaction.prepared.name === 'drag') {\n fireDropEvents(interaction, interaction.dropEvents);\n }\n});\n\nInteraction.signals.on('stop-drag', function ({ interaction }) {\n interaction.activeDrops.dropzones =\n interaction.activeDrops.elements =\n interaction.activeDrops.rects =\n interaction.dropEvents = null;\n});\n\nfunction collectDrops (interaction, element) {\n const drops = [];\n const elements = [];\n\n element = element || interaction.element;\n\n // collect all dropzones and their elements which qualify for a drop\n for (const current of scope.interactables) {\n if (!current.options.drop.enabled) { continue; }\n\n const accept = current.options.drop.accept;\n\n // test the draggable element against the dropzone's accept setting\n if ((utils.is.element(accept) && accept !== element)\n || (utils.is.string(accept)\n && !utils.matchesSelector(element, accept))) {\n\n continue;\n }\n\n // query for new elements if necessary\n const dropElements = utils.is.string(current.target)\n ? current._context.querySelectorAll(current.target)\n : [current.target];\n\n for (let i = 0; i < dropElements.length; i++) {\n const currentElement = dropElements[i];\n\n if (currentElement !== element) {\n drops.push(current);\n elements.push(currentElement);\n }\n }\n }\n\n return {\n elements,\n dropzones: drops,\n };\n}\n\nfunction fireActiveDrops (interaction, event) {\n let prevElement;\n\n // loop through all active dropzones and trigger event\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n const current = interaction.activeDrops.dropzones[i];\n const currentElement = interaction.activeDrops.elements [i];\n\n // prevent trigger of duplicate events on same element\n if (currentElement !== prevElement) {\n // set current element as event target\n event.target = currentElement;\n current.fire(event);\n }\n prevElement = currentElement;\n }\n}\n\n// Collect a new set of possible drops and save them in activeDrops.\n// setActiveDrops should always be called when a drag has just started or a\n// drag event happens while dynamicDrop is true\nfunction setActiveDrops (interaction, dragElement) {\n // get dropzones and their elements that could receive the draggable\n const possibleDrops = collectDrops(interaction, dragElement, true);\n\n interaction.activeDrops.dropzones = possibleDrops.dropzones;\n interaction.activeDrops.elements = possibleDrops.elements;\n interaction.activeDrops.rects = [];\n\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n interaction.activeDrops.rects[i] =\n interaction.activeDrops.dropzones[i].getRect(interaction.activeDrops.elements[i]);\n }\n}\n\nfunction getDrop (dragEvent, event, dragElement) {\n const interaction = dragEvent.interaction;\n const validDrops = [];\n\n if (dynamicDrop) {\n setActiveDrops(interaction, dragElement);\n }\n\n // collect all dropzones and their elements which qualify for a drop\n for (let j = 0; j < interaction.activeDrops.dropzones.length; j++) {\n const current = interaction.activeDrops.dropzones[j];\n const currentElement = interaction.activeDrops.elements [j];\n const rect = interaction.activeDrops.rects [j];\n\n validDrops.push(current.dropCheck(dragEvent, event, interaction.target, dragElement, currentElement, rect)\n ? currentElement\n : null);\n }\n\n // get the most appropriate dropzone based on DOM depth and order\n const dropIndex = utils.indexOfDeepestElement(validDrops);\n\n return {\n dropzone: interaction.activeDrops.dropzones[dropIndex] || null,\n element : interaction.activeDrops.elements [dropIndex] || null,\n };\n}\n\nfunction getDropEvents (interaction, pointerEvent, dragEvent) {\n const dropEvents = {\n enter : null,\n leave : null,\n activate : null,\n deactivate: null,\n move : null,\n drop : null,\n };\n\n const tmpl = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n };\n\n if (interaction.dropElement !== interaction.prevDropElement) {\n // if there was a prevDropTarget, create a dragleave event\n if (interaction.prevDropTarget) {\n dropEvents.leave = utils.extend({ type: 'dragleave' }, tmpl);\n\n dragEvent.dragLeave = dropEvents.leave.target = interaction.prevDropElement;\n dragEvent.prevDropzone = dropEvents.leave.dropzone = interaction.prevDropTarget;\n }\n // if the dropTarget is not null, create a dragenter event\n if (interaction.dropTarget) {\n dropEvents.enter = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n type : 'dragenter',\n };\n\n dragEvent.dragEnter = interaction.dropElement;\n dragEvent.dropzone = interaction.dropTarget;\n }\n }\n\n if (dragEvent.type === 'dragend' && interaction.dropTarget) {\n dropEvents.drop = utils.extend({ type: 'drop' }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n dragEvent.relatedTarget = interaction.dropElement;\n }\n if (dragEvent.type === 'dragstart') {\n dropEvents.activate = utils.extend({ type: 'dropactivate' }, tmpl);\n\n dropEvents.activate.target = null;\n dropEvents.activate.dropzone = null;\n }\n if (dragEvent.type === 'dragend') {\n dropEvents.deactivate = utils.extend({ type: 'dropdeactivate' }, tmpl);\n\n dropEvents.deactivate.target = null;\n dropEvents.deactivate.dropzone = null;\n }\n if (dragEvent.type === 'dragmove' && interaction.dropTarget) {\n dropEvents.move = utils.extend({\n dragmove : dragEvent,\n type : 'dropmove',\n }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n }\n\n return dropEvents;\n}\n\nfunction fireDropEvents (interaction, dropEvents) {\n if (dropEvents.leave) { interaction.prevDropTarget.fire(dropEvents.leave); }\n if (dropEvents.move ) { interaction.dropTarget.fire(dropEvents.move ); }\n if (dropEvents.enter) { interaction.dropTarget.fire(dropEvents.enter); }\n if (dropEvents.drop ) { interaction.dropTarget.fire(dropEvents.drop ); }\n if (dropEvents.deactivate) {\n fireActiveDrops(interaction, dropEvents.deactivate);\n }\n\n interaction.prevDropTarget = interaction.dropTarget;\n interaction.prevDropElement = interaction.dropElement;\n}\n\n/*\\\n * Interactable.dropzone\n [ method ]\n *\n * Returns or sets whether elements can be dropped onto this\n * Interactable to trigger drop events\n *\n * Dropzones can receive the following events:\n * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends\n * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone\n * - `dragmove` when a draggable that has entered the dropzone is moved\n * - `drop` when a draggable is dropped into this dropzone\n *\n * Use the `accept` option to allow only elements that match the given CSS\n * selector or element. The value can be:\n *\n * - **an Element** - only that element can be dropped into this dropzone.\n * - **a string**, - the element being dragged must match it as a CSS selector.\n * - **`null`** - accept options is cleared - it accepts any element.\n *\n * Use the `overlap` option to set how drops are checked for. The allowed\n * values are:\n *\n * - `'pointer'`, the pointer must be over the dropzone (default)\n * - `'center'`, the draggable element's center must be over the dropzone\n * - a number from 0-1 which is the `(intersection area) / (draggable area)`.\n * e.g. `0.5` for drop to happen when half of the area of the draggable is\n * over the dropzone\n *\n * Use the `checker` option to specify a function to check if a dragged\n * element is over this Interactable.\n *\n | interact(target)\n | .dropChecker(function(dragEvent, // related dragmove or dragend event\n | event, // TouchEvent/PointerEvent/MouseEvent\n | dropped, // bool result of the default checker\n | dropzone, // dropzone Interactable\n | dropElement, // dropzone elemnt\n | draggable, // draggable Interactable\n | draggableElement) {// draggable element\n |\n | return dropped && event.target.hasAttribute('allow-drop');\n | }\n *\n *\n - options (boolean | object | null) #optional The new value to be set.\n | interact('.drop').dropzone({\n | accept: '.can-drop' || document.getElementById('single-drop'),\n | overlap: 'pointer' || 'center' || zeroToOne\n | }\n = (boolean | object) The current setting or this Interactable\n\\*/\nInteractable.prototype.dropzone = function (options) {\n if (utils.is.object(options)) {\n this.options.drop.enabled = options.enabled === false? false: true;\n\n if (utils.is.function(options.ondrop) ) { this.events.ondrop = options.ondrop ; }\n if (utils.is.function(options.ondropactivate) ) { this.events.ondropactivate = options.ondropactivate ; }\n if (utils.is.function(options.ondropdeactivate)) { this.events.ondropdeactivate = options.ondropdeactivate; }\n if (utils.is.function(options.ondragenter) ) { this.events.ondragenter = options.ondragenter ; }\n if (utils.is.function(options.ondragleave) ) { this.events.ondragleave = options.ondragleave ; }\n if (utils.is.function(options.ondropmove) ) { this.events.ondropmove = options.ondropmove ; }\n\n if (/^(pointer|center)$/.test(options.overlap)) {\n this.options.drop.overlap = options.overlap;\n }\n else if (utils.is.number(options.overlap)) {\n this.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0);\n }\n if ('accept' in options) {\n this.options.drop.accept = options.accept;\n }\n if ('checker' in options) {\n this.options.drop.checker = options.checker;\n }\n\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drop.enabled = options;\n\n if (!options) {\n this.ondragenter = this.ondragleave = this.ondrop\n = this.ondropactivate = this.ondropdeactivate = null;\n }\n\n return this;\n }\n\n return this.options.drop;\n};\n\nInteractable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) {\n let dropped = false;\n\n // if the dropzone has no rect (eg. display: none)\n // call the custom dropChecker or just return false\n if (!(rect = rect || this.getRect(dropElement))) {\n return (this.options.drop.checker\n ? this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement)\n : false);\n }\n\n const dropOverlap = this.options.drop.overlap;\n\n if (dropOverlap === 'pointer') {\n const origin = utils.getOriginXY(draggable, draggableElement, 'drag');\n const page = utils.getPageXY(dragEvent);\n\n page.x += origin.x;\n page.y += origin.y;\n\n const horizontal = (page.x > rect.left) && (page.x < rect.right);\n const vertical = (page.y > rect.top ) && (page.y < rect.bottom);\n\n dropped = horizontal && vertical;\n }\n\n const dragRect = draggable.getRect(draggableElement);\n\n if (dragRect && dropOverlap === 'center') {\n const cx = dragRect.left + dragRect.width / 2;\n const cy = dragRect.top + dragRect.height / 2;\n\n dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom;\n }\n\n if (dragRect && utils.is.number(dropOverlap)) {\n const overlapArea = (Math.max(0, Math.min(rect.right , dragRect.right ) - Math.max(rect.left, dragRect.left))\n * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top , dragRect.top )));\n\n const overlapRatio = overlapArea / (dragRect.width * dragRect.height);\n\n dropped = overlapRatio >= dropOverlap;\n }\n\n if (this.options.drop.checker) {\n dropped = this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement);\n }\n\n return dropped;\n};\n\nInteractable.signals.on('unset', function ({ interactable }) {\n interactable.dropzone(false);\n});\n\nInteractable.settingsMethods.push('dropChecker');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.dropTarget = null; // the dropzone a drag target might be dropped into\n interaction.dropElement = null; // the element at the time of checking\n interaction.prevDropTarget = null; // the dropzone that was recently dragged away from\n interaction.prevDropElement = null; // the element at the time of checking\n interaction.dropEvents = null; // the dropEvents related to the current drag event\n\n interaction.activeDrops = {\n dropzones: [], // the dropzones that are mentioned below\n elements : [], // elements of dropzones that accept the target draggable\n rects : [], // the rects of the elements mentioned above\n };\n\n});\n\nInteraction.signals.on('stop', function ({ interaction }) {\n interaction.dropTarget = interaction.dropElement =\n interaction.prevDropTarget = interaction.prevDropElement = null;\n});\n\n/*\\\n * interact.dynamicDrop\n [ method ]\n *\n * Returns or sets whether the dimensions of dropzone elements are\n * calculated on every dragmove or only on dragstart for the default\n * dropChecker\n *\n - newValue (boolean) #optional True to check on each move. False to check only before start\n = (boolean | interact) The current setting or interact\n\\*/\ninteract.dynamicDrop = function (newValue) {\n if (utils.is.bool(newValue)) {\n //if (dragging && dynamicDrop !== newValue && !newValue) {\n //calcRects(dropzones);\n //}\n\n dynamicDrop = newValue;\n\n return interact;\n }\n return dynamicDrop;\n};\n\nutils.merge(Interactable.eventTypes, [\n 'dragenter',\n 'dragleave',\n 'dropactivate',\n 'dropdeactivate',\n 'dropmove',\n 'drop',\n]);\nactions.methodDict.drop = 'dropzone';\n\ndefaultOptions.drop = drop.defaults;\n\nmodule.exports = drop;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst gesture = {\n defaults: {\n enabled : false,\n origin : null,\n restrict: null,\n },\n\n checker: function (pointer, event, interactable, element, interaction) {\n if (interaction.pointerIds.length >= 2) {\n return { name: 'gesture' };\n }\n\n return null;\n },\n\n getCursor: function () {\n return '';\n },\n};\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturestart') { return; }\n iEvent.ds = 0;\n\n interaction.gesture.startDistance = interaction.gesture.prevDistance = iEvent.distance;\n interaction.gesture.startAngle = interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.scale = 1;\n});\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturemove') { return; }\n\n iEvent.ds = iEvent.scale - interaction.gesture.scale;\n\n interaction.target.fire(iEvent);\n\n interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.prevDistance = iEvent.distance;\n\n if (iEvent.scale !== Infinity\n && iEvent.scale !== null\n && iEvent.scale !== undefined\n && !isNaN(iEvent.scale)) {\n\n interaction.gesture.scale = iEvent.scale;\n }\n});\n\n/*\\\n * Interactable.gesturable\n [ method ]\n *\n * Gets or sets whether multitouch gestures can be performed on the\n * Interactable's element\n *\n = (boolean) Indicates if this can be the target of gesture events\n | var isGestureable = interact(element).gesturable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on gesture events (makes the Interactable gesturable)\n = (object) this Interactable\n | interact(element).gesturable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // limit multiple gestures.\n | // See the explanation in @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n\\*/\nInteractable.prototype.gesturable = function (options) {\n if (utils.is.object(options)) {\n this.options.gesture.enabled = options.enabled === false? false: true;\n this.setPerAction('gesture', options);\n this.setOnEvents('gesture', options);\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.gesture.enabled = options;\n\n if (!options) {\n this.ongesturestart = this.ongesturestart = this.ongestureend = null;\n }\n\n return this;\n }\n\n return this.options.gesture;\n};\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action, event, starting, ending, deltaSource }) {\n if (action !== 'gesture') { return; }\n\n const pointers = interaction.pointers;\n\n iEvent.touches = [pointers[0], pointers[1]];\n\n if (starting) {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = 1;\n iEvent.ds = 0;\n iEvent.angle = utils.touchAngle(pointers, undefined, deltaSource);\n iEvent.da = 0;\n }\n else if (ending || event instanceof InteractEvent) {\n iEvent.distance = interaction.prevEvent.distance;\n iEvent.box = interaction.prevEvent.box;\n iEvent.scale = interaction.prevEvent.scale;\n iEvent.ds = iEvent.scale - 1;\n iEvent.angle = interaction.prevEvent.angle;\n iEvent.da = iEvent.angle - interaction.gesture.startAngle;\n }\n else {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = iEvent.distance / interaction.gesture.startDistance;\n iEvent.angle = utils.touchAngle(pointers, interaction.gesture.prevAngle, deltaSource);\n\n iEvent.ds = iEvent.scale - interaction.gesture.prevScale;\n iEvent.da = iEvent.angle - interaction.gesture.prevAngle;\n }\n});\n\nInteraction.signals.on('new', function (interaction) {\n interaction.gesture = {\n start: { x: 0, y: 0 },\n\n startDistance: 0, // distance between two touches of touchStart\n prevDistance : 0,\n distance : 0,\n\n scale: 1, // gesture.distance / gesture.startDistance\n\n startAngle: 0, // angle of line joining two touches\n prevAngle : 0, // angle of the previous gesture event\n };\n});\n\nactions.gesture = gesture;\nactions.names.push('gesture');\nutils.merge(Interactable.eventTypes, [\n 'gesturestart',\n 'gesturemove',\n 'gestureend',\n]);\nactions.methodDict.gesture = 'gesturable';\n\ndefaultOptions.gesture = gesture.defaults;\n\nmodule.exports = gesture;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\n// Less Precision with touch input\nconst defaultMargin = browser.supportsTouch || browser.supportsPointerEvent? 20: 10;\n\nconst resize = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n square: false,\n preserveAspectRatio: false,\n axis: 'xy',\n\n // use default margin\n margin: NaN,\n\n // object with props left, right, top, bottom which are\n // true/false values to resize when the pointer is over that edge,\n // CSS selectors to match the handles for each direction\n // or the Elements for each handle\n edges: null,\n\n // a value of 'none' will limit the resize rect to a minimum of 0x0\n // 'negate' will alow the rect to have negative width/height\n // 'reposition' will keep the width/height positive by swapping\n // the top and bottom edges and/or swapping the left and right edges\n invert: 'none',\n },\n\n checker: function (pointer, event, interactable, element, interaction, rect) {\n if (!rect) { return null; }\n\n const page = utils.extend({}, interaction.curCoords.page);\n const options = interactable.options;\n\n if (options.resize.enabled) {\n const resizeOptions = options.resize;\n const resizeEdges = { left: false, right: false, top: false, bottom: false };\n\n // if using resize.edges\n if (utils.is.object(resizeOptions.edges)) {\n for (const edge in resizeEdges) {\n resizeEdges[edge] = checkResizeEdge(edge,\n resizeOptions.edges[edge],\n page,\n interaction._eventTarget,\n element,\n rect,\n resizeOptions.margin || defaultMargin);\n }\n\n resizeEdges.left = resizeEdges.left && !resizeEdges.right;\n resizeEdges.top = resizeEdges.top && !resizeEdges.bottom;\n\n if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) {\n return {\n name: 'resize',\n edges: resizeEdges,\n };\n }\n }\n else {\n const right = options.resize.axis !== 'y' && page.x > (rect.right - defaultMargin);\n const bottom = options.resize.axis !== 'x' && page.y > (rect.bottom - defaultMargin);\n\n if (right || bottom) {\n return {\n name: 'resize',\n axes: (right? 'x' : '') + (bottom? 'y' : ''),\n };\n }\n }\n }\n\n return null;\n },\n\n cursors: (browser.isIe9OrOlder ? {\n x : 'e-resize',\n y : 's-resize',\n xy: 'se-resize',\n\n top : 'n-resize',\n left : 'w-resize',\n bottom : 's-resize',\n right : 'e-resize',\n topleft : 'se-resize',\n bottomright: 'se-resize',\n topright : 'ne-resize',\n bottomleft : 'ne-resize',\n } : {\n x : 'ew-resize',\n y : 'ns-resize',\n xy: 'nwse-resize',\n\n top : 'ns-resize',\n left : 'ew-resize',\n bottom : 'ns-resize',\n right : 'ew-resize',\n topleft : 'nwse-resize',\n bottomright: 'nwse-resize',\n topright : 'nesw-resize',\n bottomleft : 'nesw-resize',\n }),\n\n getCursor: function (action) {\n if (action.axis) {\n return resize.cursors[action.name + action.axis];\n }\n else if (action.edges) {\n let cursorKey = '';\n const edgeNames = ['top', 'bottom', 'left', 'right'];\n\n for (let i = 0; i < 4; i++) {\n if (action.edges[edgeNames[i]]) {\n cursorKey += edgeNames[i];\n }\n }\n\n return resize.cursors[cursorKey];\n }\n },\n};\n\n// resizestart\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'resizestart' || !interaction.prepared.edges) {\n return;\n }\n\n const startRect = interaction.target.getRect(interaction.element);\n const resizeOptions = interaction.target.options.resize;\n\n /*\n * When using the `resizable.square` or `resizable.preserveAspectRatio` options, resizing from one edge\n * will affect another. E.g. with `resizable.square`, resizing to make the right edge larger will make\n * the bottom edge larger by the same amount. We call these 'linked' edges. Any linked edges will depend\n * on the active edges and the edge being interacted with.\n */\n if (resizeOptions.square || resizeOptions.preserveAspectRatio) {\n const linkedEdges = utils.extend({}, interaction.prepared.edges);\n\n linkedEdges.top = linkedEdges.top || (linkedEdges.left && !linkedEdges.bottom);\n linkedEdges.left = linkedEdges.left || (linkedEdges.top && !linkedEdges.right );\n linkedEdges.bottom = linkedEdges.bottom || (linkedEdges.right && !linkedEdges.top );\n linkedEdges.right = linkedEdges.right || (linkedEdges.bottom && !linkedEdges.left );\n\n interaction.prepared._linkedEdges = linkedEdges;\n }\n else {\n interaction.prepared._linkedEdges = null;\n }\n\n // if using `resizable.preserveAspectRatio` option, record aspect ratio at the start of the resize\n if (resizeOptions.preserveAspectRatio) {\n interaction.resizeStartAspectRatio = startRect.width / startRect.height;\n }\n\n interaction.resizeRects = {\n start : startRect,\n current : utils.extend({}, startRect),\n inverted : utils.extend({}, startRect),\n previous : utils.extend({}, startRect),\n delta : {\n left: 0, right : 0, width : 0,\n top : 0, bottom: 0, height: 0,\n },\n };\n\n iEvent.rect = interaction.resizeRects.inverted;\n iEvent.deltaRect = interaction.resizeRects.delta;\n});\n\n// resizemove\nInteractEvent.signals.on('new', function ({ iEvent, phase, interaction }) {\n if (phase !== 'move' || !interaction.prepared.edges) { return; }\n\n const resizeOptions = interaction.target.options.resize;\n const invert = resizeOptions.invert;\n const invertible = invert === 'reposition' || invert === 'negate';\n\n let edges = interaction.prepared.edges;\n\n const start = interaction.resizeRects.start;\n const current = interaction.resizeRects.current;\n const inverted = interaction.resizeRects.inverted;\n const delta = interaction.resizeRects.delta;\n const previous = utils.extend(interaction.resizeRects.previous, inverted);\n const originalEdges = edges;\n\n let dx = iEvent.dx;\n let dy = iEvent.dy;\n\n if (resizeOptions.preserveAspectRatio || resizeOptions.square) {\n // `resize.preserveAspectRatio` takes precedence over `resize.square`\n const startAspectRatio = resizeOptions.preserveAspectRatio\n ? interaction.resizeStartAspectRatio\n : 1;\n\n edges = interaction.prepared._linkedEdges;\n\n if ((originalEdges.left && originalEdges.bottom)\n || (originalEdges.right && originalEdges.top)) {\n dy = -dx / startAspectRatio;\n }\n else if (originalEdges.left || originalEdges.right ) { dy = dx / startAspectRatio; }\n else if (originalEdges.top || originalEdges.bottom) { dx = dy * startAspectRatio; }\n }\n\n // update the 'current' rect without modifications\n if (edges.top ) { current.top += dy; }\n if (edges.bottom) { current.bottom += dy; }\n if (edges.left ) { current.left += dx; }\n if (edges.right ) { current.right += dx; }\n\n if (invertible) {\n // if invertible, copy the current rect\n utils.extend(inverted, current);\n\n if (invert === 'reposition') {\n // swap edge values if necessary to keep width/height positive\n let swap;\n\n if (inverted.top > inverted.bottom) {\n swap = inverted.top;\n\n inverted.top = inverted.bottom;\n inverted.bottom = swap;\n }\n if (inverted.left > inverted.right) {\n swap = inverted.left;\n\n inverted.left = inverted.right;\n inverted.right = swap;\n }\n }\n }\n else {\n // if not invertible, restrict to minimum of 0x0 rect\n inverted.top = Math.min(current.top, start.bottom);\n inverted.bottom = Math.max(current.bottom, start.top);\n inverted.left = Math.min(current.left, start.right);\n inverted.right = Math.max(current.right, start.left);\n }\n\n inverted.width = inverted.right - inverted.left;\n inverted.height = inverted.bottom - inverted.top ;\n\n for (const edge in inverted) {\n delta[edge] = inverted[edge] - previous[edge];\n }\n\n iEvent.edges = interaction.prepared.edges;\n iEvent.rect = inverted;\n iEvent.deltaRect = delta;\n});\n\n/*\\\n * Interactable.resizable\n [ method ]\n *\n * Gets or sets whether resize actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of resize elements\n | var isResizeable = interact('input[type=text]').resizable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on resize events (object makes the Interactable resizable)\n = (object) This Interactable\n | interact(element).resizable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | edges: {\n | top : true, // Use pointer coords to check for resize.\n | left : false, // Disable resizing from left edge.\n | bottom: '.resize-s',// Resize if pointer target matches selector\n | right : handleEl // Resize if pointer target is the given Element\n | },\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height are adjusted at a 1:1 ratio.\n | square: false,\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height maintain the aspect ratio they had when resizing started.\n | preserveAspectRatio: false,\n |\n | // a value of 'none' will limit the resize rect to a minimum of 0x0\n | // 'negate' will allow the rect to have negative width/height\n | // 'reposition' will keep the width/height positive by swapping\n | // the top and bottom edges and/or swapping the left and right edges\n | invert: 'none' || 'negate' || 'reposition'\n |\n | // limit multiple resizes.\n | // See the explanation in the @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n \\*/\nInteractable.prototype.resizable = function (options) {\n if (utils.is.object(options)) {\n this.options.resize.enabled = options.enabled === false? false: true;\n this.setPerAction('resize', options);\n this.setOnEvents('resize', options);\n\n if (/^x$|^y$|^xy$/.test(options.axis)) {\n this.options.resize.axis = options.axis;\n }\n else if (options.axis === null) {\n this.options.resize.axis = defaultOptions.resize.axis;\n }\n\n if (utils.is.bool(options.preserveAspectRatio)) {\n this.options.resize.preserveAspectRatio = options.preserveAspectRatio;\n }\n else if (utils.is.bool(options.square)) {\n this.options.resize.square = options.square;\n }\n\n return this;\n }\n if (utils.is.bool(options)) {\n this.options.resize.enabled = options;\n\n if (!options) {\n this.onresizestart = this.onresizestart = this.onresizeend = null;\n }\n\n return this;\n }\n return this.options.resize;\n};\n\nfunction checkResizeEdge (name, value, page, element, interactableElement, rect, margin) {\n // false, '', undefined, null\n if (!value) { return false; }\n\n // true value, use pointer coords and element rect\n if (value === true) {\n // if dimensions are negative, \"switch\" edges\n const width = utils.is.number(rect.width )? rect.width : rect.right - rect.left;\n const height = utils.is.number(rect.height)? rect.height : rect.bottom - rect.top ;\n\n if (width < 0) {\n if (name === 'left' ) { name = 'right'; }\n else if (name === 'right') { name = 'left' ; }\n }\n if (height < 0) {\n if (name === 'top' ) { name = 'bottom'; }\n else if (name === 'bottom') { name = 'top' ; }\n }\n\n if (name === 'left' ) { return page.x < ((width >= 0? rect.left: rect.right ) + margin); }\n if (name === 'top' ) { return page.y < ((height >= 0? rect.top : rect.bottom) + margin); }\n\n if (name === 'right' ) { return page.x > ((width >= 0? rect.right : rect.left) - margin); }\n if (name === 'bottom') { return page.y > ((height >= 0? rect.bottom: rect.top ) - margin); }\n }\n\n // the remaining checks require an element\n if (!utils.is.element(element)) { return false; }\n\n return utils.is.element(value)\n // the value is an element to use as a resize handle\n ? value === element\n // otherwise check if element matches value as selector\n : utils.matchesUpTo(element, value, interactableElement);\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.resizeAxes = 'xy';\n});\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action }) {\n if (action !== 'resize' || !interaction.resizeAxes) { return; }\n\n const options = interaction.target.options;\n\n if (options.resize.square) {\n if (interaction.resizeAxes === 'y') {\n iEvent.dx = iEvent.dy;\n }\n else {\n iEvent.dy = iEvent.dx;\n }\n iEvent.axes = 'xy';\n }\n else {\n iEvent.axes = interaction.resizeAxes;\n\n if (interaction.resizeAxes === 'x') {\n iEvent.dy = 0;\n }\n else if (interaction.resizeAxes === 'y') {\n iEvent.dx = 0;\n }\n }\n});\n\nactions.resize = resize;\nactions.names.push('resize');\nutils.merge(Interactable.eventTypes, [\n 'resizestart',\n 'resizemove',\n 'resizeinertiastart',\n 'resizeinertiaresume',\n 'resizeend',\n]);\nactions.methodDict.resize = 'resizable';\n\ndefaultOptions.resize = resize.defaults;\n\nmodule.exports = resize;\n","const raf = require('./utils/raf');\nconst getWindow = require('./utils/window').getWindow;\nconst is = require('./utils/is');\nconst domUtils = require('./utils/domUtils');\nconst Interaction = require('./Interaction');\nconst defaultOptions = require('./defaultOptions');\n\nconst autoScroll = {\n defaults: {\n enabled : false,\n container: null, // the item that is scrolled (Window or HTMLElement)\n margin : 60,\n speed : 300, // the scroll speed in pixels per second\n },\n\n interaction: null,\n i: null, // the handle returned by window.setInterval\n x: 0, y: 0, // Direction each pulse is to scroll in\n\n isScrolling: false,\n prevTime: 0,\n\n start: function (interaction) {\n autoScroll.isScrolling = true;\n raf.cancel(autoScroll.i);\n\n autoScroll.interaction = interaction;\n autoScroll.prevTime = new Date().getTime();\n autoScroll.i = raf.request(autoScroll.scroll);\n },\n\n stop: function () {\n autoScroll.isScrolling = false;\n raf.cancel(autoScroll.i);\n },\n\n // scroll the window by the values in scroll.x/y\n scroll: function () {\n const options = autoScroll.interaction.target.options[autoScroll.interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(autoScroll.interaction.element);\n const now = new Date().getTime();\n // change in time in seconds\n const dt = (now - autoScroll.prevTime) / 1000;\n // displacement\n const s = options.speed * dt;\n\n if (s >= 1) {\n if (is.window(container)) {\n container.scrollBy(autoScroll.x * s, autoScroll.y * s);\n }\n else if (container) {\n container.scrollLeft += autoScroll.x * s;\n container.scrollTop += autoScroll.y * s;\n }\n\n autoScroll.prevTime = now;\n }\n\n if (autoScroll.isScrolling) {\n raf.cancel(autoScroll.i);\n autoScroll.i = raf.request(autoScroll.scroll);\n }\n },\n check: function (interactable, actionName) {\n const options = interactable.options;\n\n return options[actionName].autoScroll && options[actionName].autoScroll.enabled;\n },\n onInteractionMove: function ({ interaction, pointer }) {\n if (!(interaction.interacting()\n && autoScroll.check(interaction.target, interaction.prepared.name))) {\n return;\n }\n\n if (interaction.simulation) {\n autoScroll.x = autoScroll.y = 0;\n return;\n }\n\n let top;\n let right;\n let bottom;\n let left;\n\n const options = interaction.target.options[interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(interaction.element);\n\n if (is.window(container)) {\n left = pointer.clientX < autoScroll.margin;\n top = pointer.clientY < autoScroll.margin;\n right = pointer.clientX > container.innerWidth - autoScroll.margin;\n bottom = pointer.clientY > container.innerHeight - autoScroll.margin;\n }\n else {\n const rect = domUtils.getElementClientRect(container);\n\n left = pointer.clientX < rect.left + autoScroll.margin;\n top = pointer.clientY < rect.top + autoScroll.margin;\n right = pointer.clientX > rect.right - autoScroll.margin;\n bottom = pointer.clientY > rect.bottom - autoScroll.margin;\n }\n\n autoScroll.x = (right ? 1: left? -1: 0);\n autoScroll.y = (bottom? 1: top? -1: 0);\n\n if (!autoScroll.isScrolling) {\n // set the autoScroll properties to those of the target\n autoScroll.margin = options.margin;\n autoScroll.speed = options.speed;\n\n autoScroll.start(interaction);\n }\n },\n};\n\nInteraction.signals.on('stop-active', function () {\n autoScroll.stop();\n});\n\nInteraction.signals.on('action-move', autoScroll.onInteractionMove);\n\ndefaultOptions.perAction.autoScroll = autoScroll.defaults;\n\nmodule.exports = autoScroll;\n","const Interactable = require('../Interactable');\nconst actions = require('../actions/base');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.ignoreFrom\n [ method ]\n *\n * If the target of the `mousedown`, `pointerdown` or `touchstart`\n * event or any of it's parents match the given CSS selector or\n * Element, no drag/resize/gesture is started.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to not ignore any elements\n = (string | Element | object) The current ignoreFrom value or this Interactable\n **\n | interact(element, { ignoreFrom: document.getElementById('no-action') });\n | // or\n | interact(element).ignoreFrom('input, textarea, a');\n\\*/\nInteractable.prototype.ignoreFrom = function (newValue) {\n return this._backCompatOption('ignoreFrom', newValue);\n};\n\n/*\\\n * Interactable.allowFrom\n [ method ]\n *\n * A drag/resize/gesture is started only If the target of the\n * `mousedown`, `pointerdown` or `touchstart` event or any of it's\n * parents match the given CSS selector or Element.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to allow from any element\n = (string | Element | object) The current allowFrom value or this Interactable\n **\n | interact(element, { allowFrom: document.getElementById('drag-handle') });\n | // or\n | interact(element).allowFrom('.handle');\n\\*/\nInteractable.prototype.allowFrom = function (newValue) {\n return this._backCompatOption('allowFrom', newValue);\n};\n\nInteractable.prototype.testIgnore = function (ignoreFrom, interactableElement, element) {\n if (!ignoreFrom || !is.element(element)) { return false; }\n\n if (is.string(ignoreFrom)) {\n return domUtils.matchesUpTo(element, ignoreFrom, interactableElement);\n }\n else if (is.element(ignoreFrom)) {\n return domUtils.nodeContains(ignoreFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testAllow = function (allowFrom, interactableElement, element) {\n if (!allowFrom) { return true; }\n\n if (!is.element(element)) { return false; }\n\n if (is.string(allowFrom)) {\n return domUtils.matchesUpTo(element, allowFrom, interactableElement);\n }\n else if (is.element(allowFrom)) {\n return domUtils.nodeContains(allowFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testIgnoreAllow = function (options, interactableElement, eventTarget) {\n return (!this.testIgnore(options.ignoreFrom, interactableElement, eventTarget)\n && this.testAllow(options.allowFrom, interactableElement, eventTarget));\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (event.buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\n","const interact = require('../interact');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst actions = require('../actions/base');\nconst defaultOptions = require('../defaultOptions');\nconst browser = require('../utils/browser');\nconst scope = require('../scope');\nconst utils = require('../utils');\nconst signals = require('../utils/Signals').new();\n\nrequire('./InteractableMethods');\n\nconst autoStart = {\n signals,\n withinInteractionLimit,\n // Allow this many interactions to happen simultaneously\n maxInteractions: Infinity,\n defaults: {\n perAction: {\n manualStart: false,\n max: Infinity,\n maxPerElement: 1,\n allowFrom: null,\n ignoreFrom: null,\n },\n },\n setActionDefaults: function (action) {\n utils.extend(action.defaults, autoStart.defaults.perAction);\n },\n};\n\n// set cursor style on mousedown\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget }) {\n if (interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\n// set cursor style on mousemove\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget }) {\n if (!interaction.mouse\n || interaction.pointerIsDown\n || interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\nInteraction.signals.on('move', function (arg) {\n const { interaction, event } = arg;\n\n if (!interaction.pointerIsDown\n || interaction.interacting()\n || !interaction.pointerWasMoved\n || !interaction.prepared.name) {\n return;\n }\n\n signals.fire('before-start', arg);\n\n const target = interaction.target;\n\n if (interaction.prepared.name && target) {\n // check manualStart and interaction limit\n if (target.options[interaction.prepared.name].manualStart\n || !withinInteractionLimit(target, interaction.element, interaction.prepared)) {\n interaction.stop(event);\n }\n else {\n interaction.start(interaction.prepared, target, interaction.element);\n }\n }\n});\n\n// Check if the current target supports the action.\n// If so, return the validated action. Otherwise, return null\nfunction validateAction (action, interactable, element, eventTarget) {\n if (utils.is.object(action)\n && interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget)\n && interactable.options[action.name].enabled\n && withinInteractionLimit(interactable, element, action)) {\n return action;\n }\n\n return null;\n}\n\nfunction validateSelector (interaction, pointer, event, matches, matchElements, eventTarget) {\n for (let i = 0, len = matches.length; i < len; i++) {\n const match = matches[i];\n const matchElement = matchElements[i];\n const action = validateAction(match.getAction(pointer, event, interaction, matchElement),\n match,\n matchElement,\n eventTarget);\n\n if (action) {\n return {\n action,\n target: match,\n element: matchElement,\n };\n }\n }\n\n return {};\n}\n\nfunction getActionInfo (interaction, pointer, event, eventTarget) {\n let matches = [];\n let matchElements = [];\n\n let element = eventTarget;\n let action = null;\n\n function pushMatches (interactable, selector, context) {\n const elements = (browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined);\n\n if (utils.matchesSelector(element, selector, elements)) {\n\n matches.push(interactable);\n matchElements.push(element);\n }\n }\n\n while (utils.is.element(element)) {\n matches = [];\n matchElements = [];\n\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && (action = validateAction(elementInteractable.getAction(pointer, event, interaction, element, eventTarget),\n elementInteractable,\n element,\n eventTarget))\n && !elementInteractable.options[action.name].manualStart) {\n return {\n element,\n action,\n target: elementInteractable,\n };\n }\n else {\n scope.interactables.forEachSelector(pushMatches, element);\n\n const actionInfo = validateSelector(interaction, pointer, event, matches, matchElements, eventTarget);\n\n if (actionInfo.action\n && !actionInfo.target.options[actionInfo.action.name].manualStart) {\n return actionInfo;\n }\n }\n\n element = utils.parentNode(element);\n }\n\n return {};\n}\n\nfunction prepare (interaction, { action, target, element }) {\n action = action || {};\n\n if (interaction.target && interaction.target.options.styleCursor) {\n interaction.target._doc.documentElement.style.cursor = '';\n }\n\n interaction.target = target;\n interaction.element = element;\n utils.copyAction(interaction.prepared, action);\n\n if (target && target.options.styleCursor) {\n const cursor = action? actions[action.name].getCursor(action) : '';\n interaction.target._doc.documentElement.style.cursor = cursor;\n }\n\n signals.fire('prepared', { interaction: interaction });\n}\n\nInteraction.signals.on('stop', function ({ interaction }) {\n const target = interaction.target;\n\n if (target && target.options.styleCursor) {\n target._doc.documentElement.style.cursor = '';\n }\n});\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (utils.is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (utils.is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n const buttons = event.buttons || ({\n 0: 1,\n 1: 4,\n 3: 8,\n 4: 16,\n })[event.button];\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\nfunction withinInteractionLimit (interactable, element, action) {\n const options = interactable.options;\n const maxActions = options[action.name].max;\n const maxPerElement = options[action.name].maxPerElement;\n let activeInteractions = 0;\n let targetCount = 0;\n let targetElementCount = 0;\n\n // no actions if any of these values == 0\n if (!(maxActions && maxPerElement && autoStart.maxInteractions)) { return; }\n\n for (let i = 0, len = scope.interactions.length; i < len; i++) {\n const interaction = scope.interactions[i];\n const otherAction = interaction.prepared.name;\n\n if (!interaction.interacting()) { continue; }\n\n activeInteractions++;\n\n if (activeInteractions >= autoStart.maxInteractions) {\n return false;\n }\n\n if (interaction.target !== interactable) { continue; }\n\n targetCount += (otherAction === action.name)|0;\n\n if (targetCount >= maxActions) {\n return false;\n }\n\n if (interaction.element === element) {\n targetElementCount++;\n\n if (otherAction !== action.name || targetElementCount >= maxPerElement) {\n return false;\n }\n }\n }\n\n return autoStart.maxInteractions > 0;\n}\n\n/*\\\n * interact.maxInteractions\n [ method ]\n **\n * Returns or sets the maximum number of concurrent interactions allowed.\n * By default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables\n * and elements, you need to enable it in the draggable, resizable and\n * gesturable `'max'` and `'maxPerElement'` options.\n **\n - newValue (number) #optional Any number. newValue <= 0 means no interactions.\n\\*/\ninteract.maxInteractions = function (newValue) {\n if (utils.is.number(newValue)) {\n autoStart.maxInteractions = newValue;\n\n return this;\n }\n\n return autoStart.maxInteractions;\n};\n\nInteractable.settingsMethods.push('styleCursor');\nInteractable.settingsMethods.push('actionChecker');\nInteractable.settingsMethods.push('ignoreFrom');\nInteractable.settingsMethods.push('allowFrom');\n\ndefaultOptions.base.actionChecker = null;\ndefaultOptions.base.styleCursor = true;\n\nutils.extend(defaultOptions.perAction, autoStart.defaults.perAction);\n\nmodule.exports = autoStart;\n","const autoStart = require('./base');\nconst Interaction = require('../Interaction');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.delayTimer = null;\n});\n\nautoStart.signals.on('prepared', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.delayTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.target, interaction.element);\n }, delay);\n }\n});\n\nInteraction.signals.on('move', function ({ interaction, duplicate }) {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.delayTimer);\n }\n});\n\n// prevent regular down->move autoStart\nautoStart.signals.on('before-start', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.prepared.name = null;\n }\n});\n","const autoStart = require('./base');\nconst scope = require('../scope');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\n\nconst { matchesSelector, parentNode } = require('../utils/domUtils');\n\nautoStart.setActionDefaults(require('../actions/drag'));\n\nautoStart.signals.on('before-start', function ({ interaction, eventTarget, dx, dy }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // check if a drag is in the correct axis\n const absX = Math.abs(dx);\n const absY = Math.abs(dy);\n const options = interaction.target.options.drag;\n const startAxis = options.startAxis;\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy');\n\n interaction.prepared.axis = options.lockAxis === 'start'\n ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n : options.lockAxis;\n\n // if the movement isn't in the startAxis of the interactable\n if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) {\n // cancel the prepared action\n interaction.prepared.name = null;\n\n // then try to get a drag from another ineractable\n\n if (!interaction.prepared.name) {\n\n let element = eventTarget;\n\n const getDraggable = function (interactable, selector, context) {\n const elements = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n if (interactable === interaction.target) { return; }\n\n if (!options.manualStart\n && !interactable.testIgnoreAllow(options, element, eventTarget)\n && matchesSelector(element, selector, elements)) {\n\n const action = interactable.getAction(interaction.downPointer,\n interaction.downEvent,\n interaction,\n element);\n\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, interactable)\n && autoStart.validateAction(action, interactable, element, eventTarget)) {\n\n return interactable;\n }\n }\n };\n\n let action = null;\n\n // check all interactables\n while (is.element(element)) {\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && elementInteractable !== interaction.target\n && !elementInteractable.options.drag.manualStart) {\n\n action = elementInteractable.getAction(interaction.downPointer, interaction.downEvent, interaction, element);\n }\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, elementInteractable)) {\n\n interaction.prepared.name = 'drag';\n interaction.target = elementInteractable;\n interaction.element = element;\n break;\n }\n\n const selectorInteractable = scope.interactables.forEachSelector(getDraggable, element);\n\n if (selectorInteractable) {\n interaction.prepared.name = 'drag';\n interaction.target = selectorInteractable;\n interaction.element = element;\n break;\n }\n\n element = parentNode(element);\n }\n }\n }\n});\n\nfunction checkStartAxis (startAxis, interactable) {\n if (!interactable) { return false; }\n\n const thisAxis = interactable.options.drag.startAxis;\n\n return (startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis);\n}\n","require('./base').setActionDefaults(require('../actions/gesture'));\n","require('./base').setActionDefaults(require('../actions/resize'));\n","module.exports = {\n base: {\n accept : null,\n preventDefault: 'auto',\n deltaSource : 'page',\n },\n\n perAction: {\n origin: { x: 0, y: 0 },\n\n // only allow left button by default\n // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n mouseButtons: 1,\n\n inertia: {\n enabled : false,\n resistance : 10, // the lambda in exponential decay\n minSpeed : 100, // target speed must be above this for inertia to start\n endSpeed : 10, // the speed at which inertia is slow enough to stop\n allowResume : true, // allow resuming an action in inertia phase\n smoothEndDuration: 300, // animate to snap/restrict endOnly if there's no inertia\n },\n },\n};\n","/* browser entry point */\n\n// Legacy browser support\nrequire('./legacyBrowsers');\n\n// inertia\nrequire('./inertia');\n\n// modifiers\nrequire('./modifiers/snap');\nrequire('./modifiers/restrict');\n\n// pointerEvents\nrequire('./pointerEvents/base');\nrequire('./pointerEvents/holdRepeat');\nrequire('./pointerEvents/interactableTargets');\n\n// delay\nrequire('./autoStart/delay');\n\n// actions\nrequire('./actions/gesture');\nrequire('./actions/resize');\nrequire('./actions/drag');\nrequire('./actions/drop');\n\n// load these modifiers after resize is loaded\nrequire('./modifiers/snapSize');\nrequire('./modifiers/restrictEdges');\nrequire('./modifiers/restrictSize');\n\n// autoStart actions\nrequire('./autoStart/gesture');\nrequire('./autoStart/resize');\nrequire('./autoStart/drag');\n\n// Interactable preventDefault setting\nrequire('./interactablePreventDefault.js');\n\n// autoScroll\nrequire('./autoScroll');\n\n// export interact\nmodule.exports = require('./interact');\n","const InteractEvent = require('./InteractEvent');\nconst Interaction = require('./Interaction');\nconst modifiers = require('./modifiers');\nconst utils = require('./utils');\nconst animationFrame = require('./utils/raf');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.inertiaStatus = {\n active : false,\n smoothEnd : false,\n allowResume: false,\n\n startEvent: null,\n upCoords : {},\n\n xe: 0, ye: 0,\n sx: 0, sy: 0,\n\n t0: 0,\n vx0: 0, vys: 0,\n duration: 0,\n\n lambda_v0: 0,\n one_ve_v0: 0,\n i : null,\n };\n\n interaction.boundInertiaFrame = () => inertiaFrame .apply(interaction);\n interaction.boundSmoothEndFrame = () => smoothEndFrame.apply(interaction);\n});\n\nInteraction.signals.on('down', function ({ interaction, event, pointer, eventTarget }) {\n const status = interaction.inertiaStatus;\n\n // Check if the down event hits the current inertia target\n if (status.active) {\n let element = eventTarget;\n\n // climb up the DOM tree from the event target\n while (utils.is.element(element)) {\n\n // if interaction element is the current inertia target element\n if (element === interaction.element) {\n // stop inertia\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n\n // update pointers to the down event's coordinates\n interaction.updatePointer(pointer);\n utils.setCoords(interaction.curCoords, interaction.pointers);\n\n // fire appropriate signals\n const signalArg = { interaction };\n Interaction.signals.fire('before-action-move', signalArg);\n Interaction.signals.fire('action-resume' , signalArg);\n\n // fire a reume event\n const resumeEvent = new InteractEvent(interaction,\n event,\n interaction.prepared.name,\n 'inertiaresume',\n interaction.element);\n\n interaction.target.fire(resumeEvent);\n interaction.prevEvent = resumeEvent;\n modifiers.resetStatuses(interaction.modifierStatuses);\n\n utils.copyCoords(interaction.prevCoords, interaction.curCoords);\n break;\n }\n\n element = utils.parentNode(element);\n }\n }\n});\n\nInteraction.signals.on('up', function ({ interaction, event }) {\n const status = interaction.inertiaStatus;\n\n if (!interaction.interacting() || status.active) { return; }\n\n const target = interaction.target;\n const options = target && target.options;\n const inertiaOptions = options && interaction.prepared.name && options[interaction.prepared.name].inertia;\n\n const now = new Date().getTime();\n const statuses = {};\n const page = utils.extend({}, interaction.curCoords.page);\n const pointerSpeed = interaction.pointerDelta.client.speed;\n\n let smoothEnd = false;\n let modifierResult;\n\n // check if inertia should be started\n const inertiaPossible = (inertiaOptions && inertiaOptions.enabled\n && interaction.prepared.name !== 'gesture'\n && event !== status.startEvent);\n\n const inertia = (inertiaPossible\n && (now - interaction.curCoords.timeStamp) < 50\n && pointerSpeed > inertiaOptions.minSpeed\n && pointerSpeed > inertiaOptions.endSpeed);\n\n const modifierArg = {\n interaction,\n pageCoords: page,\n statuses,\n preEnd: true,\n requireEndOnly: true,\n };\n\n // smoothEnd\n if (inertiaPossible && !inertia) {\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n if (modifierResult.shouldMove && modifierResult.locked) {\n smoothEnd = true;\n }\n }\n\n if (!(inertia || smoothEnd)) { return; }\n\n utils.copyCoords(status.upCoords, interaction.curCoords);\n\n interaction.pointers[0] = status.startEvent =\n new InteractEvent(interaction, event, interaction.prepared.name, 'inertiastart', interaction.element);\n\n status.t0 = now;\n\n status.active = true;\n status.allowResume = inertiaOptions.allowResume;\n interaction.simulation = status;\n\n target.fire(status.startEvent);\n\n if (inertia) {\n status.vx0 = interaction.pointerDelta.client.vx;\n status.vy0 = interaction.pointerDelta.client.vy;\n status.v0 = pointerSpeed;\n\n calcInertia(interaction, status);\n\n utils.extend(page, interaction.curCoords.page);\n\n page.x += status.xe;\n page.y += status.ye;\n\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n status.modifiedXe += modifierResult.dx;\n status.modifiedYe += modifierResult.dy;\n\n status.i = animationFrame.request(interaction.boundInertiaFrame);\n }\n else {\n status.smoothEnd = true;\n status.xe = modifierResult.dx;\n status.ye = modifierResult.dy;\n\n status.sx = status.sy = 0;\n\n status.i = animationFrame.request(interaction.boundSmoothEndFrame);\n }\n});\n\nInteraction.signals.on('stop-active', function ({ interaction }) {\n const status = interaction.inertiaStatus;\n\n if (status.active) {\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n }\n});\n\nfunction calcInertia (interaction, status) {\n const inertiaOptions = interaction.target.options[interaction.prepared.name].inertia;\n const lambda = inertiaOptions.resistance;\n const inertiaDur = -Math.log(inertiaOptions.endSpeed / status.v0) / lambda;\n\n status.x0 = interaction.prevEvent.pageX;\n status.y0 = interaction.prevEvent.pageY;\n status.t0 = status.startEvent.timeStamp / 1000;\n status.sx = status.sy = 0;\n\n status.modifiedXe = status.xe = (status.vx0 - inertiaDur) / lambda;\n status.modifiedYe = status.ye = (status.vy0 - inertiaDur) / lambda;\n status.te = inertiaDur;\n\n status.lambda_v0 = lambda / status.v0;\n status.one_ve_v0 = 1 - inertiaOptions.endSpeed / status.v0;\n}\n\nfunction inertiaFrame () {\n updateInertiaCoords(this);\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n\n const status = this.inertiaStatus;\n const options = this.target.options[this.prepared.name].inertia;\n const lambda = options.resistance;\n const t = new Date().getTime() / 1000 - status.t0;\n\n if (t < status.te) {\n\n const progress = 1 - (Math.exp(-lambda * t) - status.lambda_v0) / status.one_ve_v0;\n\n if (status.modifiedXe === status.xe && status.modifiedYe === status.ye) {\n status.sx = status.xe * progress;\n status.sy = status.ye * progress;\n }\n else {\n const quadPoint = utils.getQuadraticCurvePoint(0, 0,\n status.xe,\n status.ye,\n status.modifiedXe,\n status.modifiedYe,\n progress);\n\n status.sx = quadPoint.x;\n status.sy = quadPoint.y;\n }\n\n this.doMove();\n\n status.i = animationFrame.request(this.boundInertiaFrame);\n }\n else {\n status.sx = status.modifiedXe;\n status.sy = status.modifiedYe;\n\n this.doMove();\n this.end(status.startEvent);\n status.active = false;\n this.simulation = null;\n }\n\n utils.copyCoords(this.prevCoords, this.curCoords);\n}\n\nfunction smoothEndFrame () {\n updateInertiaCoords(this);\n\n const status = this.inertiaStatus;\n const t = new Date().getTime() - status.t0;\n const duration = this.target.options[this.prepared.name].inertia.smoothEndDuration;\n\n if (t < duration) {\n status.sx = utils.easeOutQuad(t, 0, status.xe, duration);\n status.sy = utils.easeOutQuad(t, 0, status.ye, duration);\n\n this.pointerMove(status.startEvent, status.startEvent);\n\n status.i = animationFrame.request(this.boundSmoothEndFrame);\n }\n else {\n status.sx = status.xe;\n status.sy = status.ye;\n\n this.pointerMove(status.startEvent, status.startEvent);\n this.end(status.startEvent);\n\n status.smoothEnd =\n status.active = false;\n this.simulation = null;\n }\n}\n\nfunction updateInertiaCoords (interaction) {\n const status = interaction.inertiaStatus;\n\n // return if inertia isn't running\n if (!status.active) { return; }\n\n const pageUp = status.upCoords.page;\n const clientUp = status.upCoords.client;\n\n utils.setCoords(interaction.curCoords, [ {\n pageX : pageUp.x + status.sx,\n pageY : pageUp.y + status.sy,\n clientX: clientUp.x + status.sx,\n clientY: clientUp.y + status.sy,\n } ]);\n}\n","const browser = require('./utils/browser');\nconst events = require('./utils/events');\nconst utils = require('./utils');\nconst scope = require('./scope');\nconst Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\n\nconst globalEvents = {};\n\n/*\\\n * interact\n [ method ]\n *\n * The methods of this variable can be used to set elements as\n * interactables and also to change various default settings.\n *\n * Calling it as a function and passing an element or a valid CSS selector\n * string returns an Interactable object which has various methods to\n * configure it.\n *\n - element (Element | string) The HTML or SVG Element to interact with or CSS selector\n = (object) An @Interactable\n *\n > Usage\n | interact('#draggable').draggable(true);\n |\n | var rectables = interact('rect');\n | rectables\n | .gesturable(true)\n | .on('gesturemove', function (event) {\n | // ...\n | });\n\\*/\nfunction interact (element, options) {\n let interactable = scope.interactables.get(element, options);\n\n if (!interactable) {\n interactable = new Interactable(element, options);\n interactable.events.global = globalEvents;\n }\n\n return interactable;\n}\n\n/*\\\n * interact.isSet\n [ method ]\n *\n * Check if an element has been set\n - element (Element) The Element being searched for\n = (boolean) Indicates if the element or CSS selector was previously passed to interact\n\\*/\ninteract.isSet = function (element, options) {\n return scope.interactables.indexOfElement(element, options && options.context) !== -1;\n};\n\n/*\\\n * interact.on\n [ method ]\n *\n * Adds a global listener for an InteractEvent or adds a DOM event to\n * `document`\n *\n - type (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) interact\n\\*/\ninteract.on = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.on(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.on(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n // if it is an InteractEvent type, add listener to globalEvents\n if (utils.contains(Interactable.eventTypes, type)) {\n // if this type of event was never bound\n if (!globalEvents[type]) {\n globalEvents[type] = [listener];\n }\n else {\n globalEvents[type].push(listener);\n }\n }\n // If non InteractEvent type, addEventListener to document\n else {\n events.add(scope.document, type, listener, { options });\n }\n\n return interact;\n};\n\n/*\\\n * interact.off\n [ method ]\n *\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n - type (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) interact\n \\*/\ninteract.off = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.off(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.off(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n if (!utils.contains(Interactable.eventTypes, type)) {\n events.remove(scope.document, type, listener, options);\n }\n else {\n let index;\n\n if (type in globalEvents\n && (index = utils.indexOf(globalEvents[type], listener)) !== -1) {\n globalEvents[type].splice(index, 1);\n }\n }\n\n return interact;\n};\n\n/*\\\n * interact.debug\n [ method ]\n *\n * Returns an object which exposes internal data\n = (object) An object with properties that outline the current state and expose internal functions and variables\n\\*/\ninteract.debug = function () {\n return scope;\n};\n\n// expose the functions used to calculate multi-touch properties\ninteract.getPointerAverage = utils.pointerAverage;\ninteract.getTouchBBox = utils.touchBBox;\ninteract.getTouchDistance = utils.touchDistance;\ninteract.getTouchAngle = utils.touchAngle;\n\ninteract.getElementRect = utils.getElementRect;\ninteract.getElementClientRect = utils.getElementClientRect;\ninteract.matchesSelector = utils.matchesSelector;\ninteract.closest = utils.closest;\n\n/*\\\n * interact.supportsTouch\n [ method ]\n *\n = (boolean) Whether or not the browser supports touch input\n\\*/\ninteract.supportsTouch = function () {\n return browser.supportsTouch;\n};\n\n/*\\\n * interact.supportsPointerEvent\n [ method ]\n *\n = (boolean) Whether or not the browser supports PointerEvents\n\\*/\ninteract.supportsPointerEvent = function () {\n return browser.supportsPointerEvent;\n};\n\n/*\\\n * interact.stop\n [ method ]\n *\n * Cancels all interactions (end events are not fired)\n *\n - event (Event) An event on which to call preventDefault()\n = (object) interact\n\\*/\ninteract.stop = function (event) {\n for (let i = scope.interactions.length - 1; i >= 0; i--) {\n scope.interactions[i].stop(event);\n }\n\n return interact;\n};\n\n/*\\\n * interact.pointerMoveTolerance\n [ method ]\n * Returns or sets the distance the pointer must be moved before an action\n * sequence occurs. This also affects tolerance for tap events.\n *\n - newValue (number) #optional The movement from the start position must be greater than this value\n = (number | Interactable) The current setting or interact\n\\*/\ninteract.pointerMoveTolerance = function (newValue) {\n if (utils.is.number(newValue)) {\n Interaction.pointerMoveTolerance = newValue;\n\n return this;\n }\n\n return Interaction.pointerMoveTolerance;\n};\n\ninteract.addDocument = scope.addDocument;\ninteract.removeDocument = scope.removeDocument;\n\nscope.interact = interact;\n\nmodule.exports = interact;\n","const Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\nconst scope = require('./scope');\nconst is = require('./utils/is');\nconst events = require('./utils/events');\n\nconst { nodeContains, matchesSelector } = require('./utils/domUtils');\n\n/*\\\n * Interactable.preventDefault\n [ method ]\n *\n * Returns or sets whether to prevent the browser's default behaviour\n * in response to pointer events. Can be set to:\n * - `'always'` to always prevent\n * - `'never'` to never prevent\n * - `'auto'` to let interact.js try to determine what would be best\n *\n - newValue (string) #optional `true`, `false` or `'auto'`\n = (string | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.preventDefault = function (newValue) {\n if (/^(always|never|auto)$/.test(newValue)) {\n this.options.preventDefault = newValue;\n return this;\n }\n\n if (is.bool(newValue)) {\n this.options.preventDefault = newValue? 'always' : 'never';\n return this;\n }\n\n return this.options.preventDefault;\n};\n\nInteractable.prototype.checkAndPreventDefault = function (event) {\n const setting = this.options.preventDefault;\n\n if (setting === 'never') { return; }\n\n if (setting === 'always') {\n event.preventDefault();\n return;\n }\n\n // setting === 'auto'\n\n // don't preventDefault if the browser supports passiveEvents\n // CSS touch-action and user-selecct should be used instead\n if (events.supportsOptions) {\n return;\n }\n\n // don't preventDefault of pointerdown events\n if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) {\n return;\n }\n\n // don't preventDefault on editable elements\n if (is.element(event.target)\n && matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) {\n return;\n }\n\n event.preventDefault();\n};\n\nfunction onInteractionEvent ({ interaction, event }) {\n if (interaction.target) {\n interaction.target.checkAndPreventDefault(event);\n }\n}\n\nfor (const eventSignal of ['down', 'move', 'up', 'cancel']) {\n Interaction.signals.on(eventSignal, onInteractionEvent);\n}\n\n// prevent native HTML5 drag on interact.js target elements\nInteraction.docEvents.dragstart = function preventNativeDrag (event) {\n for (const interaction of scope.interactions) {\n\n if (interaction.element\n && (interaction.element === event.target\n || nodeContains(interaction.element, event.target))) {\n\n interaction.target.checkAndPreventDefault(event);\n return;\n }\n }\n};\n","const scope = require('./scope');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst iFinder = require('./utils/interactionFinder');\nconst pointerEvents = require('./pointerEvents/base');\n\nconst { window } = require('./utils/window');\n\nconst toString = Object.prototype.toString;\n\nif (!window.Array.isArray) {\n window.Array.isArray = function (obj) {\n return toString.call(obj) === '[object Array]';\n };\n}\n\nif (!String.prototype.trim) {\n String.prototype.trim = function () {\n return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n };\n}\n\n// http://www.quirksmode.org/dom/events/click.html\n// >Events leading to dblclick\n//\n// IE8 doesn't fire down event before dblclick.\n// This workaround tries to fire a tap and doubletap after dblclick\nfunction onIE8Dblclick (event) {\n const eventTarget = event.target;\n const interaction = iFinder.search(event, event.type, eventTarget);\n\n if (!interaction) { return; }\n\n if (interaction.prevTap\n && event.clientX === interaction.prevTap.clientX\n && event.clientY === interaction.prevTap.clientY\n && eventTarget === interaction.prevTap.target) {\n\n interaction.downTargets[0] = eventTarget;\n interaction.downTimes [0] = new Date().getTime();\n\n pointerEvents.fire({\n interaction,\n event,\n eventTarget,\n pointer: event,\n type: 'tap',\n });\n }\n}\n\nif (browser.isIE8) {\n const selectFix = function (event) {\n for (const interaction of scope.interactions) {\n if (interaction.interacting()) {\n interaction.target.checkAndPreventDefault(event);\n }\n }\n };\n\n const onDocIE8 = function onDocIE8 ({ doc, win }, signalName) {\n const eventMethod = signalName.indexOf('listen') === 0\n ? events.add : events.remove;\n\n // For IE's lack of Event#preventDefault\n eventMethod(doc, 'selectstart', selectFix);\n\n if (pointerEvents) {\n eventMethod(doc, 'dblclick', onIE8Dblclick);\n }\n };\n\n scope.signals.on('add-document' , onDocIE8);\n scope.signals.on('remove-document', onDocIE8);\n}\n\nmodule.exports = null;\n","const InteractEvent = require('../InteractEvent');\nconst Interaction = require('../Interaction');\nconst extend = require('../utils/extend');\n\nconst modifiers = {\n names: [],\n\n setOffsets: function (arg) {\n const { interaction, pageCoords: page } = arg;\n const { target, element, startOffset } = interaction;\n const rect = target.getRect(element);\n\n if (rect) {\n startOffset.left = page.x - rect.left;\n startOffset.top = page.y - rect.top;\n\n startOffset.right = rect.right - page.x;\n startOffset.bottom = rect.bottom - page.y;\n\n if (!('width' in rect)) { rect.width = rect.right - rect.left; }\n if (!('height' in rect)) { rect.height = rect.bottom - rect.top ; }\n }\n else {\n startOffset.left = startOffset.top = startOffset.right = startOffset.bottom = 0;\n }\n\n arg.rect = rect;\n arg.interactable = target;\n arg.element = element;\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n\n arg.options = target.options[interaction.prepared.name][modifierName];\n\n if (!arg.options) {\n continue;\n }\n\n interaction.modifierOffsets[modifierName] = modifiers[modifierName].setOffset(arg);\n }\n },\n\n setAll: function (arg) {\n const { interaction, statuses, preEnd, requireEndOnly } = arg;\n const coords = extend({}, arg.pageCoords);\n const result = {\n dx: 0,\n dy: 0,\n changed: false,\n locked: false,\n shouldMove: true,\n };\n\n for (const modifierName of modifiers.names) {\n const modifier = modifiers[modifierName];\n const options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!shouldDo(options, preEnd, requireEndOnly)) { continue; }\n\n arg.status = arg.status = statuses[modifierName];\n arg.options = options;\n arg.offset = arg.interaction.modifierOffsets[modifierName];\n\n modifier.set(arg);\n\n if (arg.status.locked) {\n coords.x += arg.status.dx;\n coords.y += arg.status.dy;\n\n result.dx += arg.status.dx;\n result.dy += arg.status.dy;\n\n result.locked = true;\n }\n }\n\n // a move should be fired if:\n // - there are no modifiers enabled,\n // - no modifiers are \"locked\" i.e. have changed the pointer's coordinates, or\n // - the locked coords have changed since the last pointer move\n result.shouldMove = !arg.status || !result.locked || arg.status.changed;\n\n return result;\n },\n\n resetStatuses: function (statuses) {\n for (const modifierName of modifiers.names) {\n const status = statuses[modifierName] || {};\n\n status.dx = status.dy = 0;\n status.modifiedX = status.modifiedY = NaN;\n status.locked = false;\n status.changed = true;\n\n statuses[modifierName] = status;\n }\n\n return statuses;\n },\n\n start: function ({ interaction }, signalName) {\n const arg = {\n interaction,\n pageCoords: (signalName === 'action-resume' ?\n interaction.curCoords : interaction.startCoords).page,\n startOffset: interaction.startOffset,\n statuses: interaction.modifierStatuses,\n preEnd: false,\n requireEndOnly: false,\n };\n\n modifiers.setOffsets(arg);\n modifiers.resetStatuses(arg.statuses);\n\n arg.pageCoords = extend({}, interaction.startCoords.page);\n interaction.modifierResult = modifiers.setAll(arg);\n },\n};\n\nInteraction.signals.on('new', function (interaction) {\n interaction.startOffset = { left: 0, right: 0, top: 0, bottom: 0 };\n interaction.modifierOffsets = {};\n interaction.modifierStatuses = modifiers.resetStatuses({});\n interaction.modifierResult = null;\n});\n\nInteraction.signals.on('action-start' , modifiers.start);\nInteraction.signals.on('action-resume', modifiers.start);\n\nInteraction.signals.on('before-action-move', function ({ interaction, preEnd, interactingBeforeMove }) {\n const modifierResult = modifiers.setAll({\n interaction,\n preEnd,\n pageCoords: interaction.curCoords.page,\n statuses: interaction.modifierStatuses,\n requireEndOnly: false,\n });\n\n // don't fire an action move if a modifier would keep the event in the same\n // cordinates as before\n if (!modifierResult.shouldMove && interactingBeforeMove) {\n interaction._dontFireMove = true;\n }\n\n interaction.modifierResult = modifierResult;\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n for (let i = 0; i < modifiers.names.length; i++) {\n const options = interaction.target.options[interaction.prepared.name][modifiers.names[i]];\n\n // if the endOnly option is true for any modifier\n if (shouldDo(options, true, true)) {\n // fire a move event at the modified coordinates\n interaction.doMove({ event, preEnd: true });\n break;\n }\n }\n});\n\nInteractEvent.signals.on('set-xy', function (arg) {\n const { iEvent, interaction } = arg;\n const modifierArg = extend({}, arg);\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n modifierArg.options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!modifierArg.options) {\n continue;\n }\n\n const modifier = modifiers[modifierName];\n\n modifierArg.status = interaction.modifierStatuses[modifierName];\n\n iEvent[modifierName] = modifier.modifyCoords(modifierArg);\n }\n});\n\nfunction shouldDo (options, preEnd, requireEndOnly) {\n return (options && options.enabled\n && (preEnd || !options.endOnly)\n && (!requireEndOnly || options.endOnly));\n}\n\nmodule.exports = modifiers;\n","const modifiers = require('./index');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst restrict = {\n defaults: {\n enabled : false,\n endOnly : false,\n restriction: null,\n elementRect: null,\n },\n\n setOffset: function ({ rect, startOffset, options }) {\n const elementRect = options && options.elementRect;\n const offset = {};\n\n if (rect && elementRect) {\n offset.left = startOffset.left - (rect.width * elementRect.left);\n offset.top = startOffset.top - (rect.height * elementRect.top);\n\n offset.right = startOffset.right - (rect.width * (1 - elementRect.right));\n offset.bottom = startOffset.bottom - (rect.height * (1 - elementRect.bottom));\n }\n else {\n offset.left = offset.top = offset.right = offset.bottom = 0;\n }\n\n return offset;\n },\n\n set: function ({ pageCoords, interaction, status, options }) {\n if (!options) { return status; }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n\n const restriction = getRestrictionRect(options.restriction, interaction, page);\n\n if (!restriction) { return status; }\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n const rect = restriction;\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n const offset = interaction.modifierOffsets.restrict;\n\n // object is assumed to have\n // x, y, width, height or\n // left, top, right, bottom\n if ('x' in restriction && 'y' in restriction) {\n modifiedX = Math.max(Math.min(rect.x + rect.width - offset.right , page.x), rect.x + offset.left);\n modifiedY = Math.max(Math.min(rect.y + rect.height - offset.bottom, page.y), rect.y + offset.top );\n }\n else {\n modifiedX = Math.max(Math.min(rect.right - offset.right , page.x), rect.left + offset.left);\n modifiedY = Math.max(Math.min(rect.bottom - offset.bottom, page.y), rect.top + offset.top );\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const elementRect = options && options.elementRect;\n\n if (options && options.enabled\n && !(phase === 'start' && elementRect && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n getRestrictionRect,\n};\n\nfunction getRestrictionRect (value, interaction, page) {\n if (utils.is.function(value)) {\n return utils.resolveRectLike(value, interaction.target, interaction.element, [page.x, page.y, interaction]);\n } else {\n return utils.resolveRectLike(value, interaction.target, interaction.element);\n }\n}\n\nmodifiers.restrict = restrict;\nmodifiers.names.push('restrict');\n\ndefaultOptions.perAction.restrict = restrict.defaults;\n\nmodule.exports = restrict;\n","// This module adds the options.resize.restrictEdges setting which sets min and\n// max for the top, left, bottom and right edges of the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictEdges: {\n// inner: { top: 200, left: 200, right: 400, bottom: 400 },\n// outer: { top: 0, left: 0, right: 600, bottom: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst { getRestrictionRect } = require('./restrict');\n\nconst noInner = { top: +Infinity, left: +Infinity, bottom: -Infinity, right: -Infinity };\nconst noOuter = { top: -Infinity, left: -Infinity, bottom: +Infinity, right: +Infinity };\n\nconst restrictEdges = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n offset: null,\n },\n\n setOffset: function ({ interaction, startOffset, options }) {\n if (!options) {\n return utils.extend({}, startOffset);\n }\n\n const offset = getRestrictionRect(options.offset, interaction, interaction.startCoords.page);\n\n if (offset) {\n return {\n top: startOffset.top + offset.y,\n left: startOffset.left + offset.x,\n bottom: startOffset.bottom + offset.y,\n right: startOffset.right + offset.x,\n };\n }\n\n return startOffset;\n },\n\n set: function ({ pageCoords, interaction, status, offset, options }) {\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n const inner = rectUtils.xywhToTlbr(getRestrictionRect(options.inner, interaction, page)) || noInner;\n const outer = rectUtils.xywhToTlbr(getRestrictionRect(options.outer, interaction, page)) || noOuter;\n\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n if (edges.top) {\n modifiedY = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top);\n }\n else if (edges.bottom) {\n modifiedY = Math.max(Math.min(outer.bottom - offset.bottom, page.y), inner.bottom - offset.bottom);\n }\n if (edges.left) {\n modifiedX = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left);\n }\n else if (edges.right) {\n modifiedX = Math.max(Math.min(outer.right - offset.right, page.x), inner.right - offset.right);\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n if (options && options.enabled\n && !(phase === 'start' && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n noInner,\n noOuter,\n getRestrictionRect,\n};\n\nmodifiers.restrictEdges = restrictEdges;\nmodifiers.names.push('restrictEdges');\n\ndefaultOptions.perAction.restrictEdges = restrictEdges.defaults;\nresize.defaults.restrictEdges = restrictEdges.defaults;\n\nmodule.exports = restrictEdges;\n","// This module adds the options.resize.restrictSize setting which sets min and\n// max width and height for the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictSize: {\n// min: { width: -600, height: -600 },\n// max: { width: 600, height: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst restrictEdges = require('./restrictEdges');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst noMin = { width: -Infinity, height: -Infinity };\nconst noMax = { width: +Infinity, height: +Infinity };\n\nconst restrictSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n },\n\n setOffset: function ({ interaction }) {\n return interaction.startOffset;\n },\n\n set: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const rect = rectUtils.xywhToTlbr(interaction.resizeRects.inverted);\n\n const minSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.min, interaction)) || noMin;\n const maxSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.max, interaction)) || noMax;\n\n arg.options = {\n enabled: options.enabled,\n endOnly: options.endOnly,\n inner: utils.extend({}, restrictEdges.noInner),\n outer: utils.extend({}, restrictEdges.noOuter),\n };\n\n if (edges.top) {\n arg.options.inner.top = rect.bottom - minSize.height;\n arg.options.outer.top = rect.bottom - maxSize.height;\n }\n else if (edges.bottom) {\n arg.options.inner.bottom = rect.top + minSize.height;\n arg.options.outer.bottom = rect.top + maxSize.height;\n }\n if (edges.left) {\n arg.options.inner.left = rect.right - minSize.width;\n arg.options.outer.left = rect.right - maxSize.width;\n }\n else if (edges.right) {\n arg.options.inner.right = rect.left + minSize.width;\n arg.options.outer.right = rect.left + maxSize.width;\n }\n\n restrictEdges.set(arg);\n },\n\n modifyCoords: restrictEdges.modifyCoords,\n};\n\nmodifiers.restrictSize = restrictSize;\nmodifiers.names.push('restrictSize');\n\ndefaultOptions.perAction.restrictSize = restrictSize.defaults;\nresize.defaults.restrictSize = restrictSize.defaults;\n\nmodule.exports = restrictSize;\n","const modifiers = require('./index');\nconst interact = require('../interact');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst snap = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n\n relativePoints: null,\n },\n\n setOffset: function ({ interaction, interactable, element, rect, startOffset, options }) {\n const offsets = [];\n const optionsOrigin = utils.rectToXY(utils.resolveRectLike(options.origin));\n const origin = optionsOrigin || utils.getOriginXY(interactable, element, interaction.prepared.name);\n options = options || interactable.options[interaction.prepared.name].snap || {};\n\n let snapOffset;\n\n if (options.offset === 'startCoords') {\n snapOffset = {\n x: interaction.startCoords.page.x - origin.x,\n y: interaction.startCoords.page.y - origin.y,\n };\n }\n else {\n const offsetRect = utils.resolveRectLike(options.offset, interactable, element, [interaction]);\n\n snapOffset = utils.rectToXY(offsetRect) || { x: 0, y: 0 };\n }\n\n if (rect && options.relativePoints && options.relativePoints.length) {\n for (const { x: relativeX, y: relativeY } of options.relativePoints) {\n offsets.push({\n x: startOffset.left - (rect.width * relativeX) + snapOffset.x,\n y: startOffset.top - (rect.height * relativeY) + snapOffset.y,\n });\n }\n }\n else {\n offsets.push(snapOffset);\n }\n\n return offsets;\n },\n\n set: function ({ interaction, pageCoords, status, options, offset: offsets }) {\n const targets = [];\n let target;\n let page;\n let i;\n\n if (status.useStatusXY) {\n page = { x: status.x, y: status.y };\n }\n else {\n const origin = utils.getOriginXY(interaction.target, interaction.element, interaction.prepared.name);\n\n page = utils.extend({}, pageCoords);\n\n page.x -= origin.x;\n page.y -= origin.y;\n }\n\n status.realX = page.x;\n status.realY = page.y;\n\n let len = options.targets? options.targets.length : 0;\n\n for (const { x: offsetX, y: offsetY } of offsets) {\n const relativeX = page.x - offsetX;\n const relativeY = page.y - offsetY;\n\n for (const snapTarget of options.targets) {\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n targets.push({\n x: utils.is.number(target.x) ? (target.x + offsetX) : relativeX,\n y: utils.is.number(target.y) ? (target.y + offsetY) : relativeY,\n\n range: utils.is.number(target.range)? target.range: options.range,\n });\n }\n }\n\n const closest = {\n target: null,\n inRange: false,\n distance: 0,\n range: 0,\n dx: 0,\n dy: 0,\n };\n\n for (i = 0, len = targets.length; i < len; i++) {\n target = targets[i];\n\n const range = target.range;\n const dx = target.x - page.x;\n const dy = target.y - page.y;\n const distance = utils.hypot(dx, dy);\n let inRange = distance <= range;\n\n // Infinite targets count as being out of range\n // compared to non infinite ones that are in range\n if (range === Infinity && closest.inRange && closest.range !== Infinity) {\n inRange = false;\n }\n\n if (!closest.target || (inRange\n // is the closest target in range?\n ? (closest.inRange && range !== Infinity\n // the pointer is relatively deeper in this target\n ? distance / range < closest.distance / closest.range\n // this target has Infinite range and the closest doesn't\n : (range === Infinity && closest.range !== Infinity)\n // OR this target is closer that the previous closest\n || distance < closest.distance)\n // The other is not in range and the pointer is closer to this target\n : (!closest.inRange && distance < closest.distance))) {\n\n closest.target = target;\n closest.distance = distance;\n closest.range = range;\n closest.inRange = inRange;\n closest.dx = dx;\n closest.dy = dy;\n\n status.range = range;\n }\n }\n\n let snapChanged;\n\n if (closest.target) {\n snapChanged = (status.modifiedX !== closest.target.x || status.modifiedY !== closest.target.y);\n\n status.modifiedX = closest.target.x;\n status.modifiedY = closest.target.y;\n }\n else {\n snapChanged = true;\n\n status.modifiedX = NaN;\n status.modifiedY = NaN;\n }\n\n status.dx = closest.dx;\n status.dy = closest.dy;\n\n status.changed = (snapChanged || (closest.inRange && !status.locked));\n status.locked = closest.inRange;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const relativePoints = options && options.relativePoints;\n\n if (options && options.enabled\n && !(phase === 'start' && relativePoints && relativePoints.length)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n }\n\n return {\n range : status.range,\n locked : status.locked,\n x : status.modifiedX,\n y : status.modifiedY,\n realX : status.realX,\n realY : status.realY,\n dx : status.dx,\n dy : status.dy,\n };\n }\n },\n};\n\ninteract.createSnapGrid = function (grid) {\n return function (x, y) {\n const limits = grid.limits || {\n left : -Infinity,\n right : Infinity,\n top : -Infinity,\n bottom: Infinity,\n };\n let offsetX = 0;\n let offsetY = 0;\n\n if (utils.is.object(grid.offset)) {\n offsetX = grid.offset.x;\n offsetY = grid.offset.y;\n }\n\n const gridx = Math.round((x - offsetX) / grid.x);\n const gridy = Math.round((y - offsetY) / grid.y);\n\n const newX = Math.max(limits.left, Math.min(limits.right , gridx * grid.x + offsetX));\n const newY = Math.max(limits.top , Math.min(limits.bottom, gridy * grid.y + offsetY));\n\n return {\n x: newX,\n y: newY,\n range: grid.range,\n };\n };\n};\n\nmodifiers.snap = snap;\nmodifiers.names.push('snap');\n\ndefaultOptions.perAction.snap = snap.defaults;\n\nmodule.exports = snap;\n","// This module allows snapping of the size of targets during resize\n// interactions.\n\nconst modifiers = require('./index');\nconst snap = require('./snap');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\nconst utils = require('../utils/');\n\nconst snapSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n },\n\n setOffset: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.edges;\n\n if (!edges) { return; }\n\n arg.options = {\n relativePoints: [{\n x: edges.left? 0 : 1,\n y: edges.top ? 0 : 1,\n }],\n origin: { x: 0, y: 0 },\n offset: 'self',\n range: options.range,\n };\n\n const offsets = snap.setOffset(arg);\n arg.options = options;\n\n return offsets;\n },\n\n set: function (arg) {\n const { interaction, options, offset, pageCoords } = arg;\n const page = utils.extend({}, pageCoords);\n const relativeX = page.x - offset[0].x;\n const relativeY = page.y - offset[0].y;\n\n arg.options = utils.extend({}, options);\n arg.options.targets = [];\n\n for (const snapTarget of options.targets) {\n let target;\n\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n if ('width' in target && 'height' in target) {\n target.x = target.width;\n target.y = target.height;\n }\n\n arg.options.targets.push(target);\n }\n\n snap.set(arg);\n },\n\n modifyCoords: function (arg) {\n const { options } = arg;\n\n arg.options = utils.extend({}, options);\n arg.options.enabled = options.enabled;\n arg.options.relativePoints = [null];\n\n snap.modifyCoords(arg);\n },\n};\n\nmodifiers.snapSize = snapSize;\nmodifiers.names.push('snapSize');\n\ndefaultOptions.perAction.snapSize = snapSize.defaults;\nresize.defaults.snapSize = snapSize.defaults;\n\nmodule.exports = snapSize;\n","const pointerUtils = require('../utils/pointerUtils');\n\nmodule.exports = class PointerEvent {\n constructor (type, pointer, event, eventTarget, interaction) {\n pointerUtils.pointerExtend(this, event);\n\n if (event !== pointer) {\n pointerUtils.pointerExtend(this, pointer);\n }\n\n this.interaction = interaction;\n\n this.timeStamp = new Date().getTime();\n this.originalEvent = event;\n this.type = type;\n this.pointerId = pointerUtils.getPointerId(pointer);\n this.pointerType = pointerUtils.getPointerType(pointer, interaction);\n this.target = eventTarget;\n this.currentTarget = null;\n\n if (type === 'tap') {\n const pointerIndex = interaction.getPointerIndex(pointer);\n this.dt = this.timeStamp - interaction.downTimes[pointerIndex];\n\n const interval = this.timeStamp - interaction.tapTime;\n\n this.double = !!(interaction.prevTap\n && interaction.prevTap.type !== 'doubletap'\n && interaction.prevTap.target === this.target\n && interval < 500);\n }\n else if (type === 'doubletap') {\n this.dt = pointer.timeStamp - interaction.tapTime;\n }\n }\n\n subtractOrigin ({ x: originX, y: originY }) {\n this.pageX -= originX;\n this.pageY -= originY;\n this.clientX -= originX;\n this.clientY -= originY;\n\n return this;\n }\n\n addOrigin ({ x: originX, y: originY }) {\n this.pageX += originX;\n this.pageY += originY;\n this.clientX += originX;\n this.clientY += originY;\n\n return this;\n }\n\n preventDefault () {\n this.originalEvent.preventDefault();\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n};\n","const PointerEvent = require('./PointerEvent');\nconst Interaction = require('../Interaction');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst defaults = require('../defaultOptions');\nconst signals = require('../utils/Signals').new();\nconst { filter } = require('../utils/arr');\n\nconst simpleSignals = [ 'down', 'up', 'cancel' ];\nconst simpleEvents = [ 'down', 'up', 'cancel' ];\n\nconst pointerEvents = {\n PointerEvent,\n fire,\n collectEventTargets,\n signals,\n defaults: {\n holdDuration: 600,\n ignoreFrom : null,\n allowFrom : null,\n origin : { x: 0, y: 0 },\n },\n types: [\n 'down',\n 'move',\n 'up',\n 'cancel',\n 'tap',\n 'doubletap',\n 'hold',\n ],\n};\n\nfunction fire (arg) {\n const {\n interaction, pointer, event, eventTarget,\n type = arg.pointerEvent.type,\n targets = collectEventTargets(arg),\n pointerEvent = new PointerEvent(type, pointer, event, eventTarget, interaction),\n } = arg;\n\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n targets,\n type,\n pointerEvent,\n };\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n\n for (const prop in target.props || {}) {\n pointerEvent[prop] = target.props[prop];\n }\n\n const origin = utils.getOriginXY(target.eventable, target.element);\n\n pointerEvent.subtractOrigin(origin);\n pointerEvent.eventable = target.eventable;\n pointerEvent.currentTarget = target.element;\n\n target.eventable.fire(pointerEvent);\n\n pointerEvent.addOrigin(origin);\n\n if (pointerEvent.immediatePropagationStopped\n || (pointerEvent.propagationStopped\n && (i + 1) < targets.length && targets[i + 1].element !== pointerEvent.currentTarget)) {\n break;\n }\n }\n\n signals.fire('fired', signalArg);\n\n if (type === 'tap') {\n // if pointerEvent should make a double tap, create and fire a doubletap\n // PointerEvent and use that as the prevTap\n const prevTap = pointerEvent.double\n ? fire({\n interaction, pointer, event, eventTarget,\n type: 'doubletap',\n })\n : pointerEvent;\n\n interaction.prevTap = prevTap;\n interaction.tapTime = prevTap.timeStamp;\n }\n\n return pointerEvent;\n}\n\nfunction collectEventTargets ({ interaction, pointer, event, eventTarget, type }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n // do not fire a tap event if the pointer was moved before being lifted\n if (type === 'tap' && (interaction.pointerWasMoved\n // or if the pointerup target is different to the pointerdown target\n || !(interaction.downTargets[pointerIndex] && interaction.downTargets[pointerIndex] === eventTarget))) {\n return [];\n }\n\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n path,\n targets: [],\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (type === 'hold') {\n signalArg.targets = filter(signalArg.targets, target =>\n target.eventable.options.holdDuration === interaction.holdTimers[pointerIndex].duration);\n }\n\n return signalArg.targets;\n}\n\nInteraction.signals.on('update-pointer-down', function ({ interaction, pointerIndex }) {\n interaction.holdTimers[pointerIndex] = { duration: Infinity, timeout: null };\n});\n\nInteraction.signals.on('remove-pointer', function ({ interaction, pointerIndex }) {\n interaction.holdTimers.splice(pointerIndex, 1);\n});\n\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget, duplicateMove }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n if (!duplicateMove && (!interaction.pointerIsDown || interaction.pointerWasMoved)) {\n if (interaction.pointerIsDown) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n\n fire({\n interaction, pointer, event, eventTarget,\n type: 'move',\n });\n }\n});\n\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget, pointerIndex }) {\n // copy event to be used in timeout for IE8\n const eventCopy = browser.isIE8? utils.extend({}, event) : event;\n\n const timer = interaction.holdTimers[pointerIndex];\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'hold',\n targets: [],\n path,\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (!signalArg.targets.length) { return; }\n\n let minDuration = Infinity;\n\n for (let i = 0; i < signalArg.targets.length; i++) {\n const target = signalArg.targets[i];\n const holdDuration = target.eventable.options.holdDuration;\n\n if (holdDuration < minDuration) {\n minDuration = holdDuration;\n }\n }\n\n timer.duration = minDuration;\n timer.timeout = setTimeout(function () {\n fire({\n interaction, eventCopy, eventTarget,\n pointer: browser.isIE8? eventCopy : pointer,\n type: 'hold',\n });\n }, minDuration);\n});\n\nInteraction.signals.on('up', ({ interaction, pointer, event, eventTarget }) => {\n if (!interaction.pointerWasMoved) {\n fire({ interaction, eventTarget, pointer, event, type: 'tap' });\n }\n});\n\n['up', 'cancel'].forEach(function (signalName) {\n Interaction.signals.on(signalName, function ({ interaction, pointerIndex }) {\n if (interaction.holdTimers[pointerIndex]) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n });\n});\n\nfunction createSignalListener (type) {\n return function ({ interaction, pointer, event, eventTarget }) {\n fire({ interaction, eventTarget, pointer, event, type });\n };\n}\n\nfor (let i = 0; i < simpleSignals.length; i++) {\n Interaction.signals.on(simpleSignals[i], createSignalListener(simpleEvents[i]));\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.prevTap = null; // the most recent tap event on this interaction\n interaction.tapTime = 0; // time of the most recent tap event\n interaction.holdTimers = []; // [{ duration, timeout }]\n});\n\ndefaults.pointerEvents = pointerEvents.defaults;\nmodule.exports = pointerEvents;\n","const pointerEvents = require('./base');\nconst Interaction = require('../Interaction');\n\npointerEvents.signals.on('new', onNew);\npointerEvents.signals.on('fired', onFired);\n\nfor (const signal of ['move', 'up', 'cancel', 'endall']) {\n Interaction.signals.on(signal, endHoldRepeat);\n}\n\nfunction onNew ({ pointerEvent }) {\n if (pointerEvent.type !== 'hold') { return; }\n\n pointerEvent.count = (pointerEvent.count || 0) + 1;\n}\n\nfunction onFired ({ interaction, pointerEvent, eventTarget, targets }) {\n if (pointerEvent.type !== 'hold' || !targets.length) { return; }\n\n // get the repeat interval from the first eventable\n const interval = targets[0].eventable.options.holdRepeatInterval;\n\n // don't repeat if the interval is 0 or less\n if (interval <= 0) { return; }\n\n // set a timeout to fire the holdrepeat event\n interaction.holdIntervalHandle = setTimeout(function () {\n pointerEvents.fire({\n interaction,\n eventTarget,\n type: 'hold',\n pointer: pointerEvent,\n event: pointerEvent,\n });\n }, interval);\n}\n\nfunction endHoldRepeat ({ interaction }) {\n // set the interaction's holdStopTime property\n // to stop further holdRepeat events\n if (interaction.holdIntervalHandle) {\n clearInterval(interaction.holdIntervalHandle);\n interaction.holdIntervalHandle = null;\n }\n}\n\n// don't repeat by default\npointerEvents.defaults.holdRepeatInterval = 0;\npointerEvents.types.push('holdrepeat');\n\nmodule.exports = {\n onNew,\n onFired,\n endHoldRepeat,\n};\n","const pointerEvents = require('./base');\nconst Interactable = require('../Interactable');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\nconst scope = require('../scope');\nconst extend = require('../utils/extend');\nconst { merge } = require('../utils/arr');\n\npointerEvents.signals.on('collect-targets', function ({ targets, element, type, eventTarget }) {\n function collectSelectors (interactable, selector, context) {\n const els = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && is.element(element)\n && domUtils.matchesSelector(element, selector, els)\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n const interactable = scope.interactables.get(element);\n\n if (interactable) {\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n scope.interactables.forEachSelector(collectSelectors, element);\n});\n\nInteractable.signals.on('new', function ({ interactable }) {\n interactable.events.getRect = function (element) {\n return interactable.getRect(element);\n };\n});\n\nInteractable.signals.on('set', function ({ interactable, options }) {\n extend(interactable.events.options, pointerEvents.defaults);\n extend(interactable.events.options, options);\n});\n\nmerge(Interactable.eventTypes, pointerEvents.types);\n\nInteractable.prototype.pointerEvents = function (options) {\n extend(this.events.options, options);\n\n return this;\n};\n\nconst __backCompatOption = Interactable.prototype._backCompatOption;\n\nInteractable.prototype._backCompatOption = function (optionName, newValue) {\n const ret = __backCompatOption.call(this, optionName, newValue);\n\n if (ret === this) {\n this.events.options[optionName] = newValue;\n }\n\n return ret;\n};\n\nInteractable.settingsMethods.push('pointerEvents');\n","const utils = require('./utils');\nconst events = require('./utils/events');\nconst signals = require('./utils/Signals').new();\n\nconst scope = {\n signals,\n events,\n utils,\n\n // main document\n document: require('./utils/domObjects').document,\n // all documents being listened to\n documents: [],\n\n addDocument: function (doc, win) {\n // do nothing if document is already known\n if (utils.contains(scope.documents, doc)) { return false; }\n\n win = win || scope.getWindow(doc);\n\n scope.documents.push(doc);\n events.documents.push(doc);\n\n // don't add an unload event for the main document\n // so that the page may be cached in browser history\n if (doc !== scope.document) {\n events.add(win, 'unload', scope.onWindowUnload);\n }\n\n signals.fire('add-document', { doc, win });\n },\n\n removeDocument: function (doc, win) {\n const index = utils.indexOf(scope.documents, doc);\n\n win = win || scope.getWindow(doc);\n\n events.remove(win, 'unload', scope.onWindowUnload);\n\n scope.documents.splice(index, 1);\n events.documents.splice(index, 1);\n\n signals.fire('remove-document', { win, doc });\n },\n\n onWindowUnload: function () {\n scope.removeDocument(this.document, this);\n },\n};\n\nmodule.exports = scope;\n","const { indexOf } = require('./arr');\n\nclass Signals {\n constructor () {\n this.listeners = {\n // signalName: [listeners],\n };\n }\n\n on (name, listener) {\n if (!this.listeners[name]) {\n this.listeners[name] = [listener];\n return;\n }\n\n this.listeners[name].push(listener);\n }\n\n off (name, listener) {\n if (!this.listeners[name]) { return; }\n\n const index = indexOf(this.listeners[name], listener);\n\n if (index !== -1) {\n this.listeners[name].splice(index, 1);\n }\n }\n\n fire (name, arg) {\n const targetListeners = this.listeners[name];\n\n if (!targetListeners) { return; }\n\n for (let i = 0; i < targetListeners.length; i++) {\n if (targetListeners[i](arg, name) === false) {\n return;\n }\n }\n }\n}\n\nSignals.new = function () {\n return new Signals();\n};\n\nmodule.exports = Signals;\n","function indexOf (array, target) {\n for (let i = 0, len = array.length; i < len; i++) {\n if (array[i] === target) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction contains (array, target) {\n return indexOf(array, target) !== -1;\n}\n\nfunction merge (target, source) {\n for (let i = 0; i < source.length; i++) {\n target.push(source[i]);\n }\n\n return target;\n}\n\nfunction filter (array, test) {\n const result = [];\n\n for (let i = 0; i < array.length; i++) {\n if (test(array[i])) {\n result.push(array[i]);\n }\n }\n\n return result;\n}\n\nmodule.exports = {\n indexOf,\n contains,\n merge,\n filter,\n};\n","const { window } = require('./window');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst Element = domObjects.Element;\nconst navigator = window.navigator;\n\nconst browser = {\n // Does the browser support touch input?\n supportsTouch: !!(('ontouchstart' in window) || is.function(window.DocumentTouch)\n && domObjects.document instanceof window.DocumentTouch),\n\n // Does the browser support PointerEvents\n supportsPointerEvent: !!domObjects.PointerEvent,\n\n isIE8: ('attachEvent' in window) && !('addEventListener' in window),\n\n // Opera Mobile must be handled differently\n isOperaMobile: (navigator.appName === 'Opera'\n && browser.supportsTouch\n && navigator.userAgent.match('Presto')),\n\n // scrolling doesn't change the result of getClientRects on iOS 7\n isIOS7: (/iP(hone|od|ad)/.test(navigator.platform)\n && /OS 7[^\\d]/.test(navigator.appVersion)),\n\n isIe9OrOlder: /MSIE (8|9)/.test(navigator.userAgent),\n\n // prefix matchesSelector\n prefixedMatchesSelector: 'matches' in Element.prototype\n ? 'matches': 'webkitMatchesSelector' in Element.prototype\n ? 'webkitMatchesSelector': 'mozMatchesSelector' in Element.prototype\n ? 'mozMatchesSelector': 'oMatchesSelector' in Element.prototype\n ? 'oMatchesSelector': 'msMatchesSelector',\n\n useMatchesSelectorPolyfill: false,\n\n pEventTypes: (domObjects.PointerEvent\n ? (domObjects.PointerEvent === window.MSPointerEvent\n ? {\n up: 'MSPointerUp',\n down: 'MSPointerDown',\n over: 'mouseover',\n out: 'mouseout',\n move: 'MSPointerMove',\n cancel: 'MSPointerCancel',\n }\n : {\n up: 'pointerup',\n down: 'pointerdown',\n over: 'pointerover',\n out: 'pointerout',\n move: 'pointermove',\n cancel: 'pointercancel',\n })\n : null),\n\n // because Webkit and Opera still use 'mousewheel' event type\n wheelEvent: 'onmousewheel' in domObjects.document? 'mousewheel': 'wheel',\n\n};\n\nbrowser.useMatchesSelectorPolyfill = !is.function(Element.prototype[browser.prefixedMatchesSelector]);\n\nmodule.exports = browser;\n","const domObjects = {};\nconst win = require('./window').window;\n\nfunction blank () {}\n\ndomObjects.document = win.document;\ndomObjects.DocumentFragment = win.DocumentFragment || blank;\ndomObjects.SVGElement = win.SVGElement || blank;\ndomObjects.SVGSVGElement = win.SVGSVGElement || blank;\ndomObjects.SVGElementInstance = win.SVGElementInstance || blank;\ndomObjects.Element = win.Element || blank;\ndomObjects.HTMLElement = win.HTMLElement || domObjects.Element;\n\ndomObjects.Event = win.Event;\ndomObjects.Touch = win.Touch || blank;\ndomObjects.PointerEvent = (win.PointerEvent || win.MSPointerEvent);\n\nmodule.exports = domObjects;\n","const win = require('./window');\nconst browser = require('./browser');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst domUtils = {\n nodeContains: function (parent, child) {\n while (child) {\n if (child === parent) {\n return true;\n }\n\n child = child.parentNode;\n }\n\n return false;\n },\n\n closest: function (element, selector) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) { return element; }\n\n element = domUtils.parentNode(element);\n }\n\n return null;\n },\n\n parentNode: function (node) {\n let parent = node.parentNode;\n\n if (is.docFrag(parent)) {\n // skip past #shado-root fragments\n while ((parent = parent.host) && is.docFrag(parent)) {\n continue;\n }\n\n return parent;\n }\n\n return parent;\n },\n\n // taken from http://tanalin.com/en/blog/2012/12/matches-selector-ie8/ and modified\n matchesSelectorPolyfill: browser.useMatchesSelectorPolyfill\n ? function (element, selector, elems) {\n elems = elems || element.parentNode.querySelectorAll(selector);\n\n for (let i = 0, len = elems.length; i < len; i++) {\n if (elems[i] === element) {\n return true;\n }\n }\n\n return false;\n }\n : null,\n\n matchesSelector: function (element, selector, nodeList) {\n if (browser.useMatchesSelectorPolyfill) {\n return domUtils.matchesSelectorPolyfill(element, selector, nodeList);\n }\n\n // remove /deep/ from selectors if shadowDOM polyfill is used\n if (win.window !== win.realWindow) {\n selector = selector.replace(/\\/deep\\//g, ' ');\n }\n\n return element[browser.prefixedMatchesSelector](selector);\n },\n\n // Test for the element that's \"above\" all other qualifiers\n indexOfDeepestElement: function (elements) {\n let deepestZoneParents = [];\n let dropzoneParents = [];\n let dropzone;\n let deepestZone = elements[0];\n let index = deepestZone? 0: -1;\n let parent;\n let child;\n let i;\n let n;\n\n for (i = 1; i < elements.length; i++) {\n dropzone = elements[i];\n\n // an element might belong to multiple selector dropzones\n if (!dropzone || dropzone === deepestZone) {\n continue;\n }\n\n if (!deepestZone) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n // check if the deepest or current are document.documentElement or document.rootElement\n // - if the current dropzone is, do nothing and continue\n if (dropzone.parentNode === dropzone.ownerDocument) {\n continue;\n }\n // - if deepest is, update with the current dropzone and continue to next\n else if (deepestZone.parentNode === dropzone.ownerDocument) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n if (!deepestZoneParents.length) {\n parent = deepestZone;\n while (parent.parentNode && parent.parentNode !== parent.ownerDocument) {\n deepestZoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n }\n\n // if this element is an svg element and the current deepest is\n // an HTMLElement\n if (deepestZone instanceof domObjects.HTMLElement\n && dropzone instanceof domObjects.SVGElement\n && !(dropzone instanceof domObjects.SVGSVGElement)) {\n\n if (dropzone === deepestZone.parentNode) {\n continue;\n }\n\n parent = dropzone.ownerSVGElement;\n }\n else {\n parent = dropzone;\n }\n\n dropzoneParents = [];\n\n while (parent.parentNode !== parent.ownerDocument) {\n dropzoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n\n n = 0;\n\n // get (position of last common ancestor) + 1\n while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) {\n n++;\n }\n\n const parents = [\n dropzoneParents[n - 1],\n dropzoneParents[n],\n deepestZoneParents[n],\n ];\n\n child = parents[0].lastChild;\n\n while (child) {\n if (child === parents[1]) {\n deepestZone = dropzone;\n index = i;\n deepestZoneParents = [];\n\n break;\n }\n else if (child === parents[2]) {\n break;\n }\n\n child = child.previousSibling;\n }\n }\n\n return index;\n },\n\n matchesUpTo: function (element, selector, limit) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) {\n return true;\n }\n\n element = domUtils.parentNode(element);\n\n if (element === limit) {\n return domUtils.matchesSelector(element, selector);\n }\n }\n\n return false;\n },\n\n getActualElement: function (element) {\n return (element instanceof domObjects.SVGElementInstance\n ? element.correspondingUseElement\n : element);\n },\n\n getScrollXY: function (relevantWindow) {\n relevantWindow = relevantWindow || win.window;\n return {\n x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft,\n y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop,\n };\n },\n\n getElementClientRect: function (element) {\n const clientRect = (element instanceof domObjects.SVGElement\n ? element.getBoundingClientRect()\n : element.getClientRects()[0]);\n\n return clientRect && {\n left : clientRect.left,\n right : clientRect.right,\n top : clientRect.top,\n bottom: clientRect.bottom,\n width : clientRect.width || clientRect.right - clientRect.left,\n height: clientRect.height || clientRect.bottom - clientRect.top,\n };\n },\n\n getElementRect: function (element) {\n const clientRect = domUtils.getElementClientRect(element);\n\n if (!browser.isIOS7 && clientRect) {\n const scroll = domUtils.getScrollXY(win.getWindow(element));\n\n clientRect.left += scroll.x;\n clientRect.right += scroll.x;\n clientRect.top += scroll.y;\n clientRect.bottom += scroll.y;\n }\n\n return clientRect;\n },\n\n getPath: function (element) {\n const path = [];\n\n while (element) {\n path.push(element);\n element = domUtils.parentNode(element);\n }\n\n return path;\n },\n\n trySelector: value => {\n if (!is.string(value)) { return false; }\n\n // an exception will be raised if it is invalid\n domObjects.document.querySelector(value);\n return true;\n },\n};\n\nmodule.exports = domUtils;\n","const is = require('./is');\nconst domUtils = require('./domUtils');\nconst pExtend = require('./pointerExtend');\n\nconst { window, getWindow } = require('./window');\nconst { indexOf, contains } = require('./arr');\n\nconst useAttachEvent = ('attachEvent' in window) && !('addEventListener' in window);\nconst addEvent = useAttachEvent? 'attachEvent': 'addEventListener';\nconst removeEvent = useAttachEvent? 'detachEvent': 'removeEventListener';\nconst on = useAttachEvent? 'on': '';\n\nconst elements = [];\nconst targets = [];\nconst attachedListeners = [];\n\n// {\n// type: {\n// selectors: ['selector', ...],\n// contexts : [document, ...],\n// listeners: [[listener, capture, passive], ...]\n// }\n// }\nconst delegatedEvents = {};\n\nconst documents = [];\n\nconst supportsOptions = !useAttachEvent && (() => {\n let supported = false;\n\n window.document.createElement('div').addEventListener('test', null, {\n get capture () { supported = true; },\n });\n\n return supported;\n})();\n\nfunction add (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n let elementIndex = indexOf(elements, element);\n let target = targets[elementIndex];\n\n if (!target) {\n target = {\n events: {},\n typeCount: 0,\n };\n\n elementIndex = elements.push(element) - 1;\n targets.push(target);\n\n attachedListeners.push(useAttachEvent\n ? {\n supplied: [],\n wrapped : [],\n useCount: [],\n }\n : null);\n }\n\n if (!target.events[type]) {\n target.events[type] = [];\n target.typeCount++;\n }\n\n if (!contains(target.events[type], listener)) {\n let ret;\n\n if (useAttachEvent) {\n const { supplied, wrapped, useCount } = attachedListeners[elementIndex];\n const listenerIndex = indexOf(supplied, listener);\n\n const wrappedListener = wrapped[listenerIndex] || function (event) {\n if (!event.immediatePropagationStopped) {\n event.target = event.srcElement;\n event.currentTarget = element;\n\n event.preventDefault = event.preventDefault || preventDef;\n event.stopPropagation = event.stopPropagation || stopProp;\n event.stopImmediatePropagation = event.stopImmediatePropagation || stopImmProp;\n\n if (/mouse|click/.test(event.type)) {\n event.pageX = event.clientX + getWindow(element).document.documentElement.scrollLeft;\n event.pageY = event.clientY + getWindow(element).document.documentElement.scrollTop;\n }\n\n listener(event);\n }\n };\n\n ret = element[addEvent](on + type, wrappedListener, !!options.capture);\n\n if (listenerIndex === -1) {\n supplied.push(listener);\n wrapped.push(wrappedListener);\n useCount.push(1);\n }\n else {\n useCount[listenerIndex]++;\n }\n }\n else {\n ret = element[addEvent](type, listener, supportsOptions? options : !!options.capture);\n }\n target.events[type].push(listener);\n\n return ret;\n }\n}\n\nfunction remove (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const elementIndex = indexOf(elements, element);\n const target = targets[elementIndex];\n\n if (!target || !target.events) {\n return;\n }\n\n let wrappedListener = listener;\n let listeners;\n let listenerIndex;\n\n if (useAttachEvent) {\n listeners = attachedListeners[elementIndex];\n listenerIndex = indexOf(listeners.supplied, listener);\n wrappedListener = listeners.wrapped[listenerIndex];\n }\n\n if (type === 'all') {\n for (type in target.events) {\n if (target.events.hasOwnProperty(type)) {\n remove(element, type, 'all');\n }\n }\n return;\n }\n\n if (target.events[type]) {\n const len = target.events[type].length;\n\n if (listener === 'all') {\n for (let i = 0; i < len; i++) {\n remove(element, type, target.events[type][i], options);\n }\n return;\n }\n else {\n for (let i = 0; i < len; i++) {\n if (target.events[type][i] === listener) {\n element[removeEvent](on + type, wrappedListener, supportsOptions? options : !!options.capture);\n target.events[type].splice(i, 1);\n\n if (useAttachEvent && listeners) {\n listeners.useCount[listenerIndex]--;\n if (listeners.useCount[listenerIndex] === 0) {\n listeners.supplied.splice(listenerIndex, 1);\n listeners.wrapped.splice(listenerIndex, 1);\n listeners.useCount.splice(listenerIndex, 1);\n }\n }\n\n break;\n }\n }\n }\n\n if (target.events[type] && target.events[type].length === 0) {\n target.events[type] = null;\n target.typeCount--;\n }\n }\n\n if (!target.typeCount) {\n targets.splice(elementIndex, 1);\n elements.splice(elementIndex, 1);\n attachedListeners.splice(elementIndex, 1);\n }\n}\n\nfunction addDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n if (!delegatedEvents[type]) {\n delegatedEvents[type] = {\n selectors: [],\n contexts : [],\n listeners: [],\n };\n\n // add delegate listener functions\n for (let i = 0; i < documents.length; i++) {\n add(documents[i], type, delegateListener);\n add(documents[i], type, delegateUseCapture, true);\n }\n }\n\n const delegated = delegatedEvents[type];\n let index;\n\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n break;\n }\n }\n\n if (index === -1) {\n index = delegated.selectors.length;\n\n delegated.selectors.push(selector);\n delegated.contexts .push(context);\n delegated.listeners.push([]);\n }\n\n // keep listener and capture and passive flags\n delegated.listeners[index].push([listener, !!options.capture, options.passive]);\n}\n\nfunction removeDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const delegated = delegatedEvents[type];\n let matchFound = false;\n let index;\n\n if (!delegated) { return; }\n\n // count from last index of delegated to 0\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n // look for matching selector and context Node\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n\n const listeners = delegated.listeners[index];\n\n // each item of the listeners array is an array: [function, capture, passive]\n for (let i = listeners.length - 1; i >= 0; i--) {\n const [fn, capture, passive] = listeners[i];\n\n // check if the listener functions and capture and passive flags match\n if (fn === listener && capture === !!options.capture && passive === options.passive) {\n // remove the listener from the array of listeners\n listeners.splice(i, 1);\n\n // if all listeners for this interactable have been removed\n // remove the interactable from the delegated arrays\n if (!listeners.length) {\n delegated.selectors.splice(index, 1);\n delegated.contexts .splice(index, 1);\n delegated.listeners.splice(index, 1);\n\n // remove delegate function from context\n remove(context, type, delegateListener);\n remove(context, type, delegateUseCapture, true);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegatedEvents[type] = null;\n }\n }\n\n // only remove one listener\n matchFound = true;\n break;\n }\n }\n\n if (matchFound) { break; }\n }\n }\n}\n\n// bound to the interactable context when a DOM event\n// listener is added to a selector interactable\nfunction delegateListener (event, optionalArg) {\n const options = getOptions(optionalArg);\n const fakeEvent = {};\n const delegated = delegatedEvents[event.type];\n const eventTarget = (domUtils.getActualElement(event.path\n ? event.path[0]\n : event.target));\n let element = eventTarget;\n\n // duplicate the event so that currentTarget can be changed\n pExtend(fakeEvent, event);\n\n fakeEvent.originalEvent = event;\n fakeEvent.preventDefault = preventOriginalDefault;\n\n // climb up document tree looking for selector matches\n while (is.element(element)) {\n for (let i = 0; i < delegated.selectors.length; i++) {\n const selector = delegated.selectors[i];\n const context = delegated.contexts[i];\n\n if (domUtils.matchesSelector(element, selector)\n && domUtils.nodeContains(context, eventTarget)\n && domUtils.nodeContains(context, element)) {\n\n const listeners = delegated.listeners[i];\n\n fakeEvent.currentTarget = element;\n\n for (let j = 0; j < listeners.length; j++) {\n const [fn, capture, passive] = listeners[j];\n\n if (capture === !!options.capture && passive === options.passive) {\n fn(fakeEvent);\n }\n }\n }\n }\n\n element = domUtils.parentNode(element);\n }\n}\n\nfunction delegateUseCapture (event) {\n return delegateListener.call(this, event, true);\n}\n\nfunction preventDef () {\n this.returnValue = false;\n}\n\nfunction preventOriginalDefault () {\n this.originalEvent.preventDefault();\n}\n\nfunction stopProp () {\n this.cancelBubble = true;\n}\n\nfunction stopImmProp () {\n this.cancelBubble = true;\n this.immediatePropagationStopped = true;\n}\n\nfunction getOptions (param) {\n return is.object(param)? param : { capture: param };\n}\n\nmodule.exports = {\n add,\n remove,\n\n addDelegate,\n removeDelegate,\n\n delegateListener,\n delegateUseCapture,\n delegatedEvents,\n documents,\n\n useAttachEvent,\n supportsOptions,\n\n _elements: elements,\n _targets: targets,\n _attachedListeners: attachedListeners,\n};\n","module.exports = function extend (dest, source) {\n for (const prop in source) {\n dest[prop] = source[prop];\n }\n return dest;\n};\n","const {\n resolveRectLike,\n rectToXY,\n} = require('./rect');\n\nmodule.exports = function (target, element, action) {\n const actionOptions = target.options[action];\n const actionOrigin = actionOptions && actionOptions.origin;\n const origin = actionOrigin || target.options.origin;\n\n const originRect = resolveRectLike(origin, target, element, [target && element]);\n\n return rectToXY(originRect) || { x: 0, y: 0 };\n};\n","module.exports = (x, y) => Math.sqrt(x * x + y * y);\n","const extend = require('./extend');\nconst win = require('./window');\n\nconst utils = {\n warnOnce: function (method, message) {\n let warned = false;\n\n return function () {\n if (!warned) {\n win.window.console.warn(message);\n warned = true;\n }\n\n return method.apply(this, arguments);\n };\n },\n\n // http://stackoverflow.com/a/5634528/2280888\n _getQBezierValue: function (t, p1, p2, p3) {\n const iT = 1 - t;\n return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3;\n },\n\n getQuadraticCurvePoint: function (startX, startY, cpX, cpY, endX, endY, position) {\n return {\n x: utils._getQBezierValue(position, startX, cpX, endX),\n y: utils._getQBezierValue(position, startY, cpY, endY),\n };\n },\n\n // http://gizma.com/easing/\n easeOutQuad: function (t, b, c, d) {\n t /= d;\n return -c * t*(t-2) + b;\n },\n\n copyAction: function (dest, src) {\n dest.name = src.name;\n dest.axis = src.axis;\n dest.edges = src.edges;\n\n return dest;\n },\n\n is : require('./is'),\n extend : extend,\n hypot : require('./hypot'),\n getOriginXY: require('./getOriginXY'),\n};\n\nextend(utils, require('./arr'));\nextend(utils, require('./domUtils'));\nextend(utils, require('./pointerUtils'));\nextend(utils, require('./rect'));\n\nmodule.exports = utils;\n","const scope = require('../scope');\nconst utils = require('./index');\nconst browser = require('./browser');\n\nconst finder = {\n methodOrder: [ 'simulationResume', 'mouse', 'hasPointer', 'idle' ],\n\n search: function (pointer, eventType, eventTarget) {\n const mouseEvent = (/mouse/i.test(pointer.pointerType || eventType)\n // MSPointerEvent.MSPOINTER_TYPE_MOUSE\n || pointer.pointerType === 4);\n const pointerId = utils.getPointerId(pointer);\n const details = { pointer, pointerId, mouseEvent, eventType, eventTarget };\n\n for (const method of finder.methodOrder) {\n const interaction = finder[method](details);\n\n if (interaction) {\n return interaction;\n }\n }\n },\n\n // try to resume simulation with a new pointer\n simulationResume: function ({ mouseEvent, eventType, eventTarget }) {\n if (!/down|start/i.test(eventType)) {\n return null;\n }\n\n for (const interaction of scope.interactions) {\n let element = eventTarget;\n\n if (interaction.simulation && interaction.simulation.allowResume\n && (interaction.mouse === mouseEvent)) {\n while (element) {\n // if the element is the interaction element\n if (element === interaction.element) {\n return interaction;\n }\n element = utils.parentNode(element);\n }\n }\n }\n\n return null;\n },\n\n // if it's a mouse interaction\n mouse: function ({ pointerId, mouseEvent, eventType }) {\n if (!mouseEvent && (browser.supportsTouch || browser.supportsPointerEvent)) {\n return null;\n }\n\n let firstNonActive;\n\n for (const interaction of scope.interactions) {\n if (interaction.mouse) {\n // if it's a down event, skip interactions with running simulations\n if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; }\n\n // if the interaction is active, return it immediately\n if (interaction.interacting()) {\n return interaction;\n }\n // otherwise save it and look for another active interaction\n else if (!firstNonActive) {\n firstNonActive = interaction;\n }\n }\n }\n\n // if no active mouse interaction was found use the first inactive mouse\n // interaction\n if (firstNonActive) {\n return firstNonActive;\n }\n\n // Find any interaction specifically for mouse.\n // ignore the interaction if the eventType is a mousedown, and a simulation\n // is active\n for (const interaction of scope.interactions) {\n if (interaction.mouse && !(/down/.test(eventType) && interaction.simulation)) {\n return interaction;\n }\n }\n\n return null;\n },\n\n // get interaction that has this pointer\n hasPointer: function ({ pointerId }) {\n for (const interaction of scope.interactions) {\n if (utils.contains(interaction.pointerIds, pointerId)) {\n return interaction;\n }\n }\n },\n\n // get first idle interaction\n idle: function ({ mouseEvent }) {\n for (const interaction of scope.interactions) {\n // if there's already a pointer held down\n if (interaction.pointerIds.length === 1) {\n const target = interaction.target;\n // don't add this pointer if there is a target interactable and it\n // isn't gesturable\n if (target && !target.options.gesture.enabled) {\n continue;\n }\n }\n // maximum of 2 pointers per interaction\n else if (interaction.pointerIds.length >= 2) {\n continue;\n }\n\n if (!interaction.interacting() && (mouseEvent === interaction.mouse)) {\n return interaction;\n }\n }\n\n return null;\n },\n};\n\nmodule.exports = finder;\n","const win = require('./window');\nconst isWindow = require('./isWindow');\n\nconst is = {\n array : () => {},\n\n window : thing => thing === win.window || isWindow(thing),\n\n docFrag : thing => is.object(thing) && thing.nodeType === 11,\n\n object : thing => !!thing && (typeof thing === 'object'),\n\n function: thing => typeof thing === 'function',\n\n number : thing => typeof thing === 'number' ,\n\n bool : thing => typeof thing === 'boolean' ,\n\n string : thing => typeof thing === 'string' ,\n\n element: thing => {\n if (!thing || (typeof thing !== 'object')) { return false; }\n\n const _window = win.getWindow(thing) || win.window;\n\n return (/object|function/.test(typeof _window.Element)\n ? thing instanceof _window.Element //DOM2\n : thing.nodeType === 1 && typeof thing.nodeName === 'string');\n },\n};\n\nis.array = thing => (is.object(thing)\n && (typeof thing.length !== 'undefined')\n && is.function(thing.splice));\n\nmodule.exports = is;\n","module.exports = (thing) => !!(thing && thing.Window) && (thing instanceof thing.Window);\n","function pointerExtend (dest, source) {\n for (const prop in source) {\n const prefixedPropREs = module.exports.prefixedPropREs;\n let deprecated = false;\n\n // skip deprecated prefixed properties\n for (const vendor in prefixedPropREs) {\n if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) {\n deprecated = true;\n break;\n }\n }\n\n if (!deprecated && typeof source[prop] !== 'function') {\n dest[prop] = source[prop];\n }\n }\n return dest;\n}\n\npointerExtend.prefixedPropREs = {\n webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/,\n};\n\nmodule.exports = pointerExtend;\n","const hypot = require('./hypot');\nconst browser = require('./browser');\nconst dom = require('./domObjects');\nconst domUtils = require('./domUtils');\nconst is = require('./is');\nconst pointerExtend = require('./pointerExtend');\n\nconst pointerUtils = {\n copyCoords: function (dest, src) {\n dest.page = dest.page || {};\n dest.page.x = src.page.x;\n dest.page.y = src.page.y;\n\n dest.client = dest.client || {};\n dest.client.x = src.client.x;\n dest.client.y = src.client.y;\n\n dest.timeStamp = src.timeStamp;\n },\n\n setCoordDeltas: function (targetObj, prev, cur) {\n targetObj.page.x = cur.page.x - prev.page.x;\n targetObj.page.y = cur.page.y - prev.page.y;\n targetObj.client.x = cur.client.x - prev.client.x;\n targetObj.client.y = cur.client.y - prev.client.y;\n targetObj.timeStamp = cur.timeStamp - prev.timeStamp;\n\n // set pointer velocity\n const dt = Math.max(targetObj.timeStamp / 1000, 0.001);\n\n targetObj.page.speed = hypot(targetObj.page.x, targetObj.page.y) / dt;\n targetObj.page.vx = targetObj.page.x / dt;\n targetObj.page.vy = targetObj.page.y / dt;\n\n targetObj.client.speed = hypot(targetObj.client.x, targetObj.page.y) / dt;\n targetObj.client.vx = targetObj.client.x / dt;\n targetObj.client.vy = targetObj.client.y / dt;\n },\n\n isNativePointer: function (pointer) {\n return (pointer instanceof dom.Event || pointer instanceof dom.Touch);\n },\n\n // Get specified X/Y coords for mouse or event.touches[0]\n getXY: function (type, pointer, xy) {\n xy = xy || {};\n type = type || 'page';\n\n xy.x = pointer[type + 'X'];\n xy.y = pointer[type + 'Y'];\n\n return xy;\n },\n\n getPageXY: function (pointer, page) {\n page = page || {};\n\n // Opera Mobile handles the viewport and scrolling oddly\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n pointerUtils.getXY('screen', pointer, page);\n\n page.x += window.scrollX;\n page.y += window.scrollY;\n }\n else {\n pointerUtils.getXY('page', pointer, page);\n }\n\n return page;\n },\n\n getClientXY: function (pointer, client) {\n client = client || {};\n\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n // Opera Mobile handles the viewport and scrolling oddly\n pointerUtils.getXY('screen', pointer, client);\n }\n else {\n pointerUtils.getXY('client', pointer, client);\n }\n\n return client;\n },\n\n getPointerId: function (pointer) {\n return is.number(pointer.pointerId)? pointer.pointerId : pointer.identifier;\n },\n\n setCoords: function (targetObj, pointers, timeStamp) {\n const pointer = (pointers.length > 1\n ? pointerUtils.pointerAverage(pointers)\n : pointers[0]);\n\n const tmpXY = {};\n\n pointerUtils.getPageXY(pointer, tmpXY);\n targetObj.page.x = tmpXY.x;\n targetObj.page.y = tmpXY.y;\n\n pointerUtils.getClientXY(pointer, tmpXY);\n targetObj.client.x = tmpXY.x;\n targetObj.client.y = tmpXY.y;\n\n targetObj.timeStamp = is.number(timeStamp) ? timeStamp :new Date().getTime();\n },\n\n pointerExtend: pointerExtend,\n\n getTouchPair: function (event) {\n const touches = [];\n\n // array of touches is supplied\n if (is.array(event)) {\n touches[0] = event[0];\n touches[1] = event[1];\n }\n // an event\n else {\n if (event.type === 'touchend') {\n if (event.touches.length === 1) {\n touches[0] = event.touches[0];\n touches[1] = event.changedTouches[0];\n }\n else if (event.touches.length === 0) {\n touches[0] = event.changedTouches[0];\n touches[1] = event.changedTouches[1];\n }\n }\n else {\n touches[0] = event.touches[0];\n touches[1] = event.touches[1];\n }\n }\n\n return touches;\n },\n\n pointerAverage: function (pointers) {\n const average = {\n pageX : 0,\n pageY : 0,\n clientX: 0,\n clientY: 0,\n screenX: 0,\n screenY: 0,\n };\n\n for (const pointer of pointers) {\n for (const prop in average) {\n average[prop] += pointer[prop];\n }\n }\n for (const prop in average) {\n average[prop] /= pointers.length;\n }\n\n return average;\n },\n\n touchBBox: function (event) {\n if (!event.length && !(event.touches && event.touches.length > 1)) {\n return;\n }\n\n const touches = pointerUtils.getTouchPair(event);\n const minX = Math.min(touches[0].pageX, touches[1].pageX);\n const minY = Math.min(touches[0].pageY, touches[1].pageY);\n const maxX = Math.max(touches[0].pageX, touches[1].pageX);\n const maxY = Math.max(touches[0].pageY, touches[1].pageY);\n\n return {\n x: minX,\n y: minY,\n left: minX,\n top: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n },\n\n touchDistance: function (event, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n\n\n const dx = touches[0][sourceX] - touches[1][sourceX];\n const dy = touches[0][sourceY] - touches[1][sourceY];\n\n return hypot(dx, dy);\n },\n\n touchAngle: function (event, prevAngle, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n const dx = touches[1][sourceX] - touches[0][sourceX];\n const dy = touches[1][sourceY] - touches[0][sourceY];\n const angle = 180 * Math.atan2(dy , dx) / Math.PI;\n\n return angle;\n },\n\n getPointerType: function (pointer, interaction) {\n // if the PointerEvent API isn't available, then the pointer must be ither\n // a MouseEvent or TouchEvent\n if (interaction.mouse) { return 'mouse'; }\n if (!browser.supportsPointerEvent) { return 'touch'; }\n\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : [undefined, undefined,'touch', 'pen', 'mouse'][pointer.pointerType];\n },\n\n // [ event.target, event.currentTarget ]\n getEventTargets: function (event) {\n return [\n domUtils.getActualElement(event.path ? event.path[0] : event.target),\n domUtils.getActualElement(event.currentTarget),\n ];\n },\n};\n\nmodule.exports = pointerUtils;\n","const { window } = require('./window');\n\nconst vendors = ['ms', 'moz', 'webkit', 'o'];\nlet lastTime = 0;\nlet request;\nlet cancel;\n\nfor (let x = 0; x < vendors.length && !window.requestAnimationFrame; x++) {\n request = window[vendors[x] + 'RequestAnimationFrame'];\n cancel = window[vendors[x] +'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n}\n\nif (!request) {\n request = function (callback) {\n const currTime = new Date().getTime();\n const timeToCall = Math.max(0, 16 - (currTime - lastTime));\n const id = setTimeout(function () { callback(currTime + timeToCall); },\n timeToCall);\n\n lastTime = currTime + timeToCall;\n return id;\n };\n}\n\nif (!cancel) {\n cancel = function (id) {\n clearTimeout(id);\n };\n}\n\nmodule.exports = {\n request,\n cancel,\n};\n","const extend = require('./extend');\nconst is = require('./is');\nconst {\n closest,\n parentNode,\n getElementRect,\n} = require('./domUtils');\n\nconst rectUtils = {\n getStringOptionResult: function (value, interactable, element) {\n if (!is.string(value)) {\n return null;\n }\n\n if (value === 'parent') {\n value = parentNode(element);\n }\n else if (value === 'self') {\n value = interactable.getRect(element);\n }\n else {\n value = closest(element, value);\n }\n\n return value;\n },\n\n resolveRectLike: function (value, interactable, element, functionArgs) {\n value = rectUtils.getStringOptionResult(value, interactable, element) || value;\n\n if (is.function(value)) {\n value = value.apply(null, functionArgs);\n }\n\n if (is.element(value)) {\n value = getElementRect(value);\n }\n\n return value;\n },\n\n rectToXY: function (rect) {\n return rect && {\n x: 'x' in rect ? rect.x : rect.left,\n y: 'y' in rect ? rect.y : rect.top,\n };\n },\n\n xywhToTlbr: function (rect) {\n if (rect && !('left' in rect && 'top' in rect)) {\n rect = extend({}, rect);\n\n rect.left = rect.x || 0;\n rect.top = rect.y || 0;\n rect.right = rect.right || (rect.left + rect.width);\n rect.bottom = rect.bottom || (rect.top + rect.height);\n }\n\n return rect;\n },\n\n tlbrToXywh: function (rect) {\n if (rect && !('x' in rect && 'y' in rect)) {\n rect = extend({}, rect);\n\n rect.x = rect.left || 0;\n rect.top = rect.top || 0;\n rect.width = rect.width || (rect.right - rect.x);\n rect.height = rect.height || (rect.bottom - rect.y);\n }\n\n return rect;\n },\n};\n\nmodule.exports = rectUtils;\n","const win = module.exports;\nconst isWindow = require('./isWindow');\n\nfunction init (window) {\n // get wrapped window if using Shadow DOM polyfill\n\n win.realWindow = window;\n\n // create a TextNode\n const el = window.document.createTextNode('');\n\n // check if it's wrapped by a polyfill\n if (el.ownerDocument !== window.document\n && typeof window.wrap === 'function'\n && window.wrap(el) === el) {\n // use wrapped window\n window = window.wrap(window);\n }\n\n win.window = window;\n}\n\nif (typeof window === 'undefined') {\n win.window = undefined;\n win.realWindow = undefined;\n}\nelse {\n init(window);\n}\n\nwin.getWindow = function getWindow (node) {\n if (isWindow(node)) {\n return node;\n }\n\n const rootNode = (node.ownerDocument || node);\n\n return rootNode.defaultView || rootNode.parentWindow || win.window;\n};\n\nwin.init = init;\n"]} \ No newline at end of file +{"version":3,"sources":["src/header.js","node_modules/browser-pack/_prelude.js","index.js","src/Eventable.js","src/InteractEvent.js","src/Interactable.js","src/Interaction.js","src/actions/base.js","src/actions/drag.js","src/actions/drop.js","src/actions/gesture.js","src/actions/resize.js","src/autoScroll.js","src/autoStart/InteractableMethods.js","src/autoStart/base.js","src/autoStart/delay.js","src/autoStart/drag.js","src/autoStart/gesture.js","src/autoStart/resize.js","src/defaultOptions.js","src/index.js","src/inertia.js","src/interact.js","src/interactablePreventDefault.js","src/legacyBrowsers.js","src/modifiers/index.js","src/modifiers/restrict.js","src/modifiers/restrictEdges.js","src/modifiers/restrictSize.js","src/modifiers/snap.js","src/modifiers/snapSize.js","src/pointerEvents/PointerEvent.js","src/pointerEvents/base.js","src/pointerEvents/holdRepeat.js","src/pointerEvents/interactableTargets.js","src/scope.js","src/utils/Signals.js","src/utils/arr.js","src/utils/browser.js","src/utils/domObjects.js","src/utils/domUtils.js","src/utils/events.js","src/utils/extend.js","src/utils/getOriginXY.js","src/utils/hypot.js","src/utils/index.js","src/utils/interactionFinder.js","src/utils/is.js","src/utils/isWindow.js","src/utils/pointerExtend.js","src/utils/pointerUtils.js","src/utils/raf.js","src/utils/rect.js","src/utils/window.js"],"names":[],"mappings":"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","file":"interact.js","sourceRoot":"","sourcesContent":["/**\n * interact.js v1.3.0-alpha.4+sha.7970416-dirty\n *\n * Copyright (c) 2012-2017 Taye Adeyemi \n * Open source under the MIT License.\n * https://raw.github.com/taye/interact.js/master/LICENSE\n */\n","(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o 150) {\n return null;\n }\n\n let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI;\n const overlap = 22.5;\n\n if (angle < 0) {\n angle += 360;\n }\n\n const left = 135 - overlap <= angle && angle < 225 + overlap;\n const up = 225 - overlap <= angle && angle < 315 + overlap;\n\n const right = !left && (315 - overlap <= angle || angle < 45 + overlap);\n const down = !up && 45 - overlap <= angle && angle < 135 + overlap;\n\n return {\n up,\n down,\n left,\n right,\n angle,\n speed: interaction.prevEvent.speed,\n velocity: {\n x: interaction.prevEvent.velocityX,\n y: interaction.prevEvent.velocityY,\n },\n };\n }\n\n preventDefault () {}\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n}\n\nsignals.on('set-delta', function ({ iEvent, interaction, starting, deltaSource }) {\n const prevEvent = starting? iEvent : interaction.prevEvent;\n\n if (deltaSource === 'client') {\n iEvent.dx = iEvent.clientX - prevEvent.clientX;\n iEvent.dy = iEvent.clientY - prevEvent.clientY;\n }\n else {\n iEvent.dx = iEvent.pageX - prevEvent.pageX;\n iEvent.dy = iEvent.pageY - prevEvent.pageY;\n }\n});\n\nInteractEvent.signals = signals;\n\nmodule.exports = InteractEvent;\n","const is = require('./utils/is');\nconst events = require('./utils/events');\nconst extend = require('./utils/extend');\nconst actions = require('./actions/base');\nconst scope = require('./scope');\nconst Eventable = require('./Eventable');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nconst {\n getElementRect,\n nodeContains,\n trySelector,\n} = require('./utils/domUtils');\nconst { getWindow } = require('./utils/window');\nconst { indexOf, contains } = require('./utils/arr');\nconst { wheelEvent } = require('./utils/browser');\n\n// all set interactables\nscope.interactables = [];\n\n/*\\\n * Interactable\n [ property ]\n **\n * Object type returned by @interact\n\\*/\nclass Interactable {\n constructor (target, options) {\n options = options || {};\n\n this.target = target;\n this.events = new Eventable();\n this._context = options.context || scope.document;\n this._win = getWindow(trySelector(target)? this._context : target);\n this._doc = this._win.document;\n\n signals.fire('new', {\n target,\n options,\n interactable: this,\n win: this._win,\n });\n\n scope.addDocument( this._doc, this._win );\n\n scope.interactables.push(this);\n\n this.set(options);\n }\n\n setOnEvents (action, phases) {\n const onAction = 'on' + action;\n\n if (is.function(phases.onstart) ) { this.events[onAction + 'start' ] = phases.onstart ; }\n if (is.function(phases.onmove) ) { this.events[onAction + 'move' ] = phases.onmove ; }\n if (is.function(phases.onend) ) { this.events[onAction + 'end' ] = phases.onend ; }\n if (is.function(phases.oninertiastart)) { this.events[onAction + 'inertiastart' ] = phases.oninertiastart ; }\n\n return this;\n }\n\n setPerAction (action, options) {\n // for all the default per-action options\n for (const option in options) {\n // if this option exists for this action\n if (option in defaults[action]) {\n // if the option in the options arg is an object value\n if (is.object(options[option])) {\n // duplicate the object\n this.options[action][option] = extend(this.options[action][option] || {}, options[option]);\n\n if (is.object(defaults.perAction[option]) && 'enabled' in defaults.perAction[option]) {\n this.options[action][option].enabled = options[option].enabled === false? false : true;\n }\n }\n else if (is.bool(options[option]) && is.object(defaults.perAction[option])) {\n this.options[action][option].enabled = options[option];\n }\n else if (options[option] !== undefined) {\n // or if it's not undefined, do a plain assignment\n this.options[action][option] = options[option];\n }\n }\n }\n }\n\n /*\\\n * Interactable.getRect\n [ method ]\n *\n * The default function to get an Interactables bounding rect. Can be\n * overridden using @Interactable.rectChecker.\n *\n - element (Element) #optional The element to measure.\n = (object) The object's bounding rectangle.\n o {\n o top : 0,\n o left : 0,\n o bottom: 0,\n o right : 0,\n o width : 0,\n o height: 0\n o }\n \\*/\n getRect (element) {\n element = element || this.target;\n\n if (is.string(this.target) && !(is.element(element))) {\n element = this._context.querySelector(this.target);\n }\n\n return getElementRect(element);\n }\n\n /*\\\n * Interactable.rectChecker\n [ method ]\n *\n * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n - checker (function) #optional A function which returns this Interactable's bounding rectangle. See @Interactable.getRect\n = (function | object) The checker function or this Interactable\n \\*/\n rectChecker (checker) {\n if (is.function(checker)) {\n this.getRect = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.getRect;\n\n return this;\n }\n\n return this.getRect;\n }\n\n _backCompatOption (optionName, newValue) {\n if (trySelector(newValue) || is.object(newValue)) {\n this.options[optionName] = newValue;\n\n for (const action of actions.names) {\n this.options[action][optionName] = newValue;\n }\n\n return this;\n }\n\n return this.options[optionName];\n }\n\n /*\\\n * Interactable.origin\n [ method ]\n *\n * Gets or sets the origin of the Interactable's element. The x and y\n * of the origin will be subtracted from action event coordinates.\n *\n - origin (object | string) #optional An object eg. { x: 0, y: 0 } or string 'parent', 'self' or any CSS selector\n * OR\n - origin (Element) #optional An HTML or SVG Element whose rect will be used\n **\n = (object) The current origin or this Interactable\n \\*/\n origin (newValue) {\n return this._backCompatOption('origin', newValue);\n }\n\n /*\\\n * Interactable.deltaSource\n [ method ]\n *\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n - newValue (string) #optional Use 'client' if you will be scrolling while interacting; Use 'page' if you want autoScroll to work\n = (string | object) The current deltaSource or this Interactable\n \\*/\n deltaSource (newValue) {\n if (newValue === 'page' || newValue === 'client') {\n this.options.deltaSource = newValue;\n\n return this;\n }\n\n return this.options.deltaSource;\n }\n\n /*\\\n * Interactable.context\n [ method ]\n *\n * Gets the selector context Node of the Interactable. The default is `window.document`.\n *\n = (Node) The context Node of this Interactable\n **\n \\*/\n context () {\n return this._context;\n }\n\n inContext (element) {\n return (this._context === element.ownerDocument\n || nodeContains(this._context, element));\n }\n\n /*\\\n * Interactable.fire\n [ method ]\n *\n * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n - iEvent (InteractEvent) The InteractEvent object to be fired on this Interactable\n = (Interactable) this Interactable\n \\*/\n fire (iEvent) {\n this.events.fire(iEvent);\n\n return this;\n }\n\n _onOffMultiple (method, eventType, listener, options) {\n if (is.string(eventType) && eventType.search(' ') !== -1) {\n eventType = eventType.trim().split(/ +/);\n }\n\n if (is.array(eventType)) {\n for (let i = 0; i < eventType.length; i++) {\n this[method](eventType[i], listener, options);\n }\n\n return true;\n }\n\n if (is.object(eventType)) {\n for (const prop in eventType) {\n this[method](prop, eventType[prop], listener);\n }\n\n return true;\n }\n }\n\n /*\\\n * Interactable.on\n [ method ]\n *\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n - eventType (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) This Interactable\n \\*/\n on (eventType, listener, options) {\n if (this._onOffMultiple('on', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.on(eventType, listener);\n }\n // delegated event for selector\n else if (is.string(this.target)) {\n events.addDelegate(this.target, this._context, eventType, listener, options);\n }\n else {\n events.add(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.off\n [ method ]\n *\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n - eventType (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) This Interactable\n \\*/\n off (eventType, listener, options) {\n if (this._onOffMultiple('off', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n // if it is an action event type\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.off(eventType, listener);\n }\n // delegated event\n else if (is.string(this.target)) {\n events.removeDelegate(this.target, this._context, eventType, listener, options);\n }\n // remove listener from this Interatable's element\n else {\n events.remove(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.set\n [ method ]\n *\n * Reset the options of this Interactable\n - options (object) The new settings to apply\n = (object) This Interactable\n \\*/\n set (options) {\n if (!is.object(options)) {\n options = {};\n }\n\n this.options = extend({}, defaults.base);\n\n const perActions = extend({}, defaults.perAction);\n\n for (const actionName in actions.methodDict) {\n const methodName = actions.methodDict[actionName];\n\n this.options[actionName] = extend({}, defaults[actionName]);\n\n this.setPerAction(actionName, perActions);\n\n this[methodName](options[actionName]);\n }\n\n for (const setting of Interactable.settingsMethods) {\n this.options[setting] = defaults.base[setting];\n\n if (setting in options) {\n this[setting](options[setting]);\n }\n }\n\n signals.fire('set', {\n options,\n interactable: this,\n });\n\n return this;\n }\n\n /*\\\n * Interactable.unset\n [ method ]\n *\n * Remove this interactable from the list of interactables and remove\n * it's action capabilities and event listeners\n *\n = (object) @interact\n \\*/\n unset () {\n events.remove(this.target, 'all');\n\n if (is.string(this.target)) {\n // remove delegated events\n for (const type in events.delegatedEvents) {\n const delegated = events.delegatedEvents[type];\n\n if (delegated.selectors[0] === this.target\n && delegated.contexts[0] === this._context) {\n\n delegated.selectors.splice(0, 1);\n delegated.contexts .splice(0, 1);\n delegated.listeners.splice(0, 1);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegated[type] = null;\n }\n }\n\n events.remove(this._context, type, events.delegateListener);\n events.remove(this._context, type, events.delegateUseCapture, true);\n }\n }\n else {\n events.remove(this, 'all');\n }\n\n signals.fire('unset', { interactable: this });\n\n scope.interactables.splice(indexOf(scope.interactables, this), 1);\n\n // Stop related interactions when an Interactable is unset\n for (const interaction of scope.interactions || []) {\n if (interaction.target === this && interaction.interacting()) {\n interaction.stop();\n }\n }\n\n return scope.interact;\n }\n}\n\nscope.interactables.indexOfElement = function indexOfElement (target, context) {\n context = context || scope.document;\n\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n if (interactable.target === target && interactable._context === context) {\n return i;\n }\n }\n return -1;\n};\n\nscope.interactables.get = function interactableGet (element, options, dontCheckInContext) {\n const ret = this[this.indexOfElement(element, options && options.context)];\n\n return ret && (is.string(element) || dontCheckInContext || ret.inContext(element))? ret : null;\n};\n\nscope.interactables.forEachSelector = function (callback, element) {\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n // skip non CSS selector targets and out of context elements\n if (!is.string(interactable.target)\n || (element && !interactable.inContext(element))) {\n continue;\n }\n\n const ret = callback(interactable, interactable.target, interactable._context, i, this);\n\n if (ret !== undefined) {\n return ret;\n }\n }\n};\n\n// all interact.js eventTypes\nInteractable.eventTypes = scope.eventTypes = [];\n\nInteractable.signals = signals;\n\nInteractable.settingsMethods = [ 'deltaSource', 'origin', 'preventDefault', 'rectChecker' ];\n\nmodule.exports = Interactable;\n","const scope = require('./scope');\nconst utils = require('./utils');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst domObjects = require('./utils/domObjects');\nconst finder = require('./utils/interactionFinder');\nconst signals = require('./utils/Signals').new();\n\nconst listeners = {};\nconst methodNames = [\n 'pointerDown', 'pointerMove', 'pointerUp',\n 'updatePointer', 'removePointer',\n];\n\n// for ignoring browser's simulated mouse events\nlet prevTouchTime = 0;\n\n// all active and idle interactions\nscope.interactions = [];\n\nclass Interaction {\n constructor ({ pointerType }) {\n this.target = null; // current interactable being interacted with\n this.element = null; // the target element of the interactable\n\n this.prepared = { // action that's ready to be fired on next move event\n name : null,\n axis : null,\n edges: null,\n };\n\n // keep track of added pointers\n this.pointers = [];\n this.pointerIds = [];\n this.downTargets = [];\n this.downTimes = [];\n\n // Previous native pointer move event coordinates\n this.prevCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n // current native pointer move event coordinates\n this.curCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Starting InteractEvent pointer coordinates\n this.startCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Change in coordinates and time of the pointer\n this.pointerDelta = {\n page : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n client : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n timeStamp: 0,\n };\n\n this.downEvent = null; // pointerdown/mousedown/touchstart event\n this.downPointer = {};\n\n this._eventTarget = null;\n this._curEventTarget = null;\n\n this.prevEvent = null; // previous action event\n\n this.pointerIsDown = false;\n this.pointerWasMoved = false;\n this._interacting = false;\n\n this.pointerType = pointerType;\n\n signals.fire('new', this);\n\n scope.interactions.push(this);\n }\n\n pointerDown (pointer, event, eventTarget) {\n const pointerIndex = this.updatePointer(pointer, event, true);\n\n signals.fire('down', {\n pointer,\n event,\n eventTarget,\n pointerIndex,\n interaction: this,\n });\n }\n\n /*\\\n * Interaction.start\n [ method ]\n *\n * Start an action with the given Interactable and Element as tartgets. The\n * action must be enabled for the target Interactable and an appropriate number\n * of pointers must be held down - 1 for drag/resize, 2 for gesture.\n *\n * Use it with `interactable.able({ manualStart: false })` to always\n * [start actions manually](https://github.com/taye/interact.js/issues/114)\n *\n - action (object) The action to be performed - drag, resize, etc.\n - target (Interactable) The Interactable to target\n - element (Element) The DOM Element to target\n = (object) interact\n **\n | interact(target)\n | .draggable({\n | // disable the default drag start by down->move\n | manualStart: true\n | })\n | // start dragging after the user holds the pointer down\n | .on('hold', function (event) {\n | var interaction = event.interaction;\n |\n | if (!interaction.interacting()) {\n | interaction.start({ name: 'drag' },\n | event.interactable,\n | event.currentTarget);\n | }\n | });\n \\*/\n start (action, target, element) {\n if (this.interacting()\n || !this.pointerIsDown\n || this.pointerIds.length < (action.name === 'gesture'? 2 : 1)) {\n return;\n }\n\n // if this interaction had been removed after stopping\n // add it back\n if (utils.indexOf(scope.interactions, this) === -1) {\n scope.interactions.push(this);\n }\n\n utils.copyAction(this.prepared, action);\n this.target = target;\n this.element = element;\n\n signals.fire('action-start', {\n interaction: this,\n event: this.downEvent,\n });\n }\n\n pointerMove (pointer, event, eventTarget) {\n if (!this.simulation) {\n this.updatePointer(pointer);\n utils.setCoords(this.curCoords, this.pointers);\n }\n\n const duplicateMove = (this.curCoords.page.x === this.prevCoords.page.x\n && this.curCoords.page.y === this.prevCoords.page.y\n && this.curCoords.client.x === this.prevCoords.client.x\n && this.curCoords.client.y === this.prevCoords.client.y);\n\n let dx;\n let dy;\n\n // register movement greater than pointerMoveTolerance\n if (this.pointerIsDown && !this.pointerWasMoved) {\n dx = this.curCoords.client.x - this.startCoords.client.x;\n dy = this.curCoords.client.y - this.startCoords.client.y;\n\n this.pointerWasMoved = utils.hypot(dx, dy) > Interaction.pointerMoveTolerance;\n }\n\n const signalArg = {\n pointer,\n pointerIndex: this.getPointerIndex(pointer),\n event,\n eventTarget,\n dx,\n dy,\n duplicate: duplicateMove,\n interaction: this,\n interactingBeforeMove: this.interacting(),\n };\n\n if (!duplicateMove) {\n // set pointer coordinate, time changes and speeds\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n }\n\n signals.fire('move', signalArg);\n\n if (!duplicateMove) {\n // if interacting, fire an 'action-move' signal etc\n if (this.interacting()) {\n this.doMove(signalArg);\n }\n\n if (this.pointerWasMoved) {\n utils.copyCoords(this.prevCoords, this.curCoords);\n }\n }\n }\n\n /*\\\n * Interaction.doMove\n [ method ]\n *\n * Force a move of the current action at the same coordinates. Useful if\n * snap/restrict has been changed and you want a movement with the new\n * settings.\n *\n **\n | interact(target)\n | .draggable(true)\n | .on('dragmove', function (event) {\n | if (someCondition) {\n | // change the snap settings\n | event.interactable.draggable({ snap: { targets: [] }});\n | // fire another move event with re-calculated snap\n | event.interaction.doMove();\n | }\n | });\n \\*/\n doMove (signalArg) {\n signalArg = utils.extend({\n pointer: this.pointers[0],\n event: this.prevEvent,\n eventTarget: this._eventTarget,\n interaction: this,\n }, signalArg || {});\n\n signals.fire('before-action-move', signalArg);\n\n if (!this._dontFireMove) {\n signals.fire('action-move', signalArg);\n }\n\n this._dontFireMove = false;\n }\n\n // End interact move events and stop auto-scroll unless simulation is running\n pointerUp (pointer, event, eventTarget, curEventTarget) {\n const pointerIndex = this.getPointerIndex(pointer);\n\n signals.fire(/cancel$/i.test(event.type)? 'cancel' : 'up', {\n pointer,\n pointerIndex,\n event,\n eventTarget,\n curEventTarget,\n interaction: this,\n });\n\n if (!this.simulation) {\n this.end(event);\n }\n\n this.pointerIsDown = false;\n this.removePointer(pointer, event);\n }\n\n /*\\\n * Interaction.end\n [ method ]\n *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n - event (PointerEvent) #optional\n **\n | interact(target)\n | .draggable(true)\n | .on('move', function (event) {\n | if (event.pageX > 1000) {\n | // end the current action\n | event.interaction.end();\n | // stop all further listeners from being called\n | event.stopImmediatePropagation();\n | }\n | });\n \\*/\n end (event) {\n event = event || this.prevEvent;\n\n if (this.interacting()) {\n signals.fire('action-end', {\n event,\n interaction: this,\n });\n }\n\n this.stop();\n }\n\n currentAction () {\n return this._interacting? this.prepared.name: null;\n }\n\n interacting () {\n return this._interacting;\n }\n\n stop () {\n signals.fire('stop', { interaction: this });\n\n if (this._interacting) {\n signals.fire('stop-active', { interaction: this });\n signals.fire('stop-' + this.prepared.name, { interaction: this });\n }\n\n this.target = this.element = null;\n\n this._interacting = false;\n this.prepared.name = this.prevEvent = null;\n }\n\n getPointerIndex (pointer) {\n // mouse and pen interactions may have only one pointer\n if (this.pointerType === 'mouse' || this.pointerType === 'pen') {\n return 0;\n }\n\n return utils.indexOf(this.pointerIds, utils.getPointerId(pointer));\n }\n\n updatePointer (pointer, event, down = event && /(down|start)$/i.test(event.type)) {\n const id = utils.getPointerId(pointer);\n let index = this.getPointerIndex(pointer);\n\n if (index === -1) {\n index = this.pointerIds.length;\n this.pointerIds[index] = id;\n }\n\n if (down) {\n signals.fire('update-pointer-down', {\n pointer,\n event,\n down,\n pointerId: id,\n pointerIndex: index,\n interaction: this,\n });\n }\n\n this.pointers[index] = pointer;\n\n return index;\n }\n\n removePointer (pointer, event) {\n const index = this.getPointerIndex(pointer);\n\n if (index === -1) { return; }\n\n signals.fire('remove-pointer', {\n pointer,\n event,\n pointerIndex: index,\n interaction: this,\n });\n\n this.pointers .splice(index, 1);\n this.pointerIds .splice(index, 1);\n this.downTargets.splice(index, 1);\n this.downTimes .splice(index, 1);\n }\n\n _updateEventTargets (target, currentTarget) {\n this._eventTarget = target;\n this._curEventTarget = currentTarget;\n }\n}\n\nfor (let i = 0, len = methodNames.length; i < len; i++) {\n const method = methodNames[i];\n\n listeners[method] = doOnInteractions(method);\n}\n\nfunction doOnInteractions (method) {\n return (function (event) {\n const pointerType = utils.getPointerType(event);\n const [eventTarget, curEventTarget] = utils.getEventTargets(event);\n const matches = []; // [ [pointer, interaction], ...]\n\n if (browser.supportsTouch && /touch/.test(event.type)) {\n prevTouchTime = new Date().getTime();\n\n for (let i = 0; i < event.changedTouches.length; i++) {\n const pointer = event.changedTouches[i];\n const interaction = finder.search(pointer, event.type, eventTarget);\n\n matches.push([pointer, interaction || new Interaction({ pointerType })]);\n }\n }\n else {\n let invalidPointer = false;\n\n if (!browser.supportsPointerEvent && /mouse/.test(event.type)) {\n // ignore mouse events while touch interactions are active\n for (let i = 0; i < scope.interactions.length && !invalidPointer; i++) {\n invalidPointer = scope.interactions[i].pointerType !== 'mouse' && scope.interactions[i].pointerIsDown;\n }\n\n // try to ignore mouse events that are simulated by the browser\n // after a touch event\n invalidPointer = invalidPointer\n || (new Date().getTime() - prevTouchTime < 500)\n // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated\n || event.timeStamp === 0;\n }\n\n if (!invalidPointer) {\n let interaction = finder.search(event, event.type, eventTarget);\n\n if (!interaction) {\n interaction = new Interaction({ pointerType });\n }\n\n matches.push([event, interaction]);\n }\n }\n\n for (const [pointer, interaction] of matches) {\n interaction._updateEventTargets(eventTarget, curEventTarget);\n interaction[method](pointer, event, eventTarget, curEventTarget);\n }\n });\n}\n\nfunction endAll (event) {\n for (let i = 0; i < scope.interactions.length; i++) {\n const interaction = scope.interactions[i];\n\n interaction.end(event);\n signals.fire('endall', { event, interaction });\n }\n}\n\nconst docEvents = { /* 'eventType': listenerFunc */ };\nconst pEventTypes = browser.pEventTypes;\n\nif (domObjects.PointerEvent) {\n docEvents[pEventTypes.down ] = listeners.pointerDown;\n docEvents[pEventTypes.move ] = listeners.pointerMove;\n docEvents[pEventTypes.up ] = listeners.pointerUp;\n docEvents[pEventTypes.cancel] = listeners.pointerUp;\n}\nelse {\n docEvents.mousedown = listeners.pointerDown;\n docEvents.mousemove = listeners.pointerMove;\n docEvents.mouseup = listeners.pointerUp;\n\n docEvents.touchstart = listeners.pointerDown;\n docEvents.touchmove = listeners.pointerMove;\n docEvents.touchend = listeners.pointerUp;\n docEvents.touchcancel = listeners.pointerUp;\n}\n\ndocEvents.blur = endAll;\n\nfunction onDocSignal ({ doc }, signalName) {\n const eventMethod = signalName.indexOf('add') === 0\n ? events.add : events.remove;\n\n // delegate event listener\n for (const eventType in scope.delegatedEvents) {\n eventMethod(doc, eventType, events.delegateListener);\n eventMethod(doc, eventType, events.delegateUseCapture, true);\n }\n\n for (const eventType in docEvents) {\n eventMethod(doc, eventType, docEvents[eventType]);\n }\n}\n\nsignals.on('update-pointer-down', ({ interaction, pointer, pointerId, pointerIndex, event, eventTarget, down }) => {\n interaction.pointerIds[pointerIndex] = pointerId;\n interaction.pointers[pointerIndex] = pointer;\n\n if (down) {\n interaction.pointerIsDown = true;\n }\n\n if (!interaction.interacting()) {\n utils.setCoords(interaction.startCoords, interaction.pointers);\n\n utils.copyCoords(interaction.curCoords , interaction.startCoords);\n utils.copyCoords(interaction.prevCoords, interaction.startCoords);\n\n interaction.downEvent = event;\n interaction.downTimes[pointerIndex] = interaction.curCoords.timeStamp;\n interaction.downTargets[pointerIndex] = eventTarget || event && utils.getEventTargets(event)[0];\n interaction.pointerWasMoved = false;\n\n utils.pointerExtend(interaction.downPointer, pointer);\n }\n});\n\nscope.signals.on('add-document' , onDocSignal);\nscope.signals.on('remove-document', onDocSignal);\n\nInteraction.pointerMoveTolerance = 1;\nInteraction.doOnInteractions = doOnInteractions;\nInteraction.endAll = endAll;\nInteraction.signals = signals;\nInteraction.docEvents = docEvents;\n\nscope.endAllInteractions = endAll;\n\nmodule.exports = Interaction;\n","const Interaction = require('../Interaction');\nconst InteractEvent = require('../InteractEvent');\n\nconst actions = {\n firePrepared,\n names: [],\n methodDict: {},\n};\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n interaction._interacting = true;\n firePrepared(interaction, event, 'start');\n});\n\nInteraction.signals.on('action-move', function ({ interaction, event, preEnd }) {\n firePrepared(interaction, event, 'move', preEnd);\n\n // if the action was ended in a listener\n if (!interaction.interacting()) { return false; }\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n firePrepared(interaction, event, 'end');\n});\n\nfunction firePrepared (interaction, event, phase, preEnd) {\n const actionName = interaction.prepared.name;\n\n const newEvent = new InteractEvent(interaction, event, actionName, phase, interaction.element, null, preEnd);\n\n interaction.target.fire(newEvent);\n interaction.prevEvent = newEvent;\n}\n\nmodule.exports = actions;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drag = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n startAxis : 'xy',\n lockAxis : 'xy',\n },\n\n checker: function (pointer, event, interactable) {\n const dragOptions = interactable.options.drag;\n\n return dragOptions.enabled\n ? { name: 'drag', axis: (dragOptions.lockAxis === 'start'\n ? dragOptions.startAxis\n : dragOptions.lockAxis)}\n : null;\n },\n\n getCursor: function () {\n return 'move';\n },\n};\n\nInteraction.signals.on('before-action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n interaction.curCoords.page.y = interaction.startCoords.page.y;\n interaction.curCoords.client.y = interaction.startCoords.client.y;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vx);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vx);\n interaction.pointerDelta.client.vy = 0;\n interaction.pointerDelta.page.vy = 0;\n }\n else if (axis === 'y') {\n interaction.curCoords.page.x = interaction.startCoords.page.x;\n interaction.curCoords.client.x = interaction.startCoords.client.x;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vy);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vy);\n interaction.pointerDelta.client.vx = 0;\n interaction.pointerDelta.page.vx = 0;\n }\n});\n\n// dragmove\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'dragmove') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n iEvent.pageY = interaction.startCoords.page.y;\n iEvent.clientY = interaction.startCoords.client.y;\n iEvent.dy = 0;\n }\n else if (axis === 'y') {\n iEvent.pageX = interaction.startCoords.page.x;\n iEvent.clientX = interaction.startCoords.client.x;\n iEvent.dx = 0;\n }\n});\n\n/*\\\n * Interactable.draggable\n [ method ]\n *\n * Gets or sets whether drag actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of drag events\n | var isDraggable = interact('ul li').draggable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on drag events (object makes the Interactable draggable)\n = (object) This Interactable\n | interact(element).draggable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // the axis in which the first movement must be\n | // for the drag sequence to start\n | // 'xy' by default - any direction\n | startAxis: 'x' || 'y' || 'xy',\n |\n | // 'xy' by default - don't restrict to one axis (move in any direction)\n | // 'x' or 'y' to restrict movement to either axis\n | // 'start' to restrict movement to the axis the drag started in\n | lockAxis: 'x' || 'y' || 'xy' || 'start',\n |\n | // max number of drags that can happen concurrently\n | // with elements of this Interactable. Infinity by default\n | max: Infinity,\n |\n | // max number of drags that can target the same element+Interactable\n | // 1 by default\n | maxPerElement: 2\n | });\n\\*/\nInteractable.prototype.draggable = function (options) {\n if (utils.is.object(options)) {\n this.options.drag.enabled = options.enabled === false? false: true;\n this.setPerAction('drag', options);\n this.setOnEvents('drag', options);\n\n if (/^(xy|x|y|start)$/.test(options.lockAxis)) {\n this.options.drag.lockAxis = options.lockAxis;\n }\n if (/^(xy|x|y)$/.test(options.startAxis)) {\n this.options.drag.startAxis = options.startAxis;\n }\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drag.enabled = options;\n\n if (!options) {\n this.ondragstart = this.ondragstart = this.ondragend = null;\n }\n\n return this;\n }\n\n return this.options.drag;\n};\n\nactions.drag = drag;\nactions.names.push('drag');\nutils.merge(Interactable.eventTypes, [\n 'dragstart',\n 'dragmove',\n 'draginertiastart',\n 'draginertiaresume',\n 'dragend',\n]);\nactions.methodDict.drag = 'draggable';\n\ndefaultOptions.drag = drag.defaults;\n\nmodule.exports = drag;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst scope = require('../scope');\nconst interact = require('../interact');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drop = {\n defaults: {\n enabled: false,\n accept : null,\n overlap: 'pointer',\n },\n};\n\nlet dynamicDrop = false;\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // reset active dropzones\n interaction.activeDrops.dropzones = [];\n interaction.activeDrops.elements = [];\n interaction.activeDrops.rects = [];\n\n interaction.dropEvents = null;\n\n if (!interaction.dynamicDrop) {\n setActiveDrops(interaction, interaction.element);\n }\n\n const dragEvent = interaction.prevEvent;\n const dropEvents = getDropEvents(interaction, event, dragEvent);\n\n if (dropEvents.activate) {\n fireActiveDrops(interaction, dropEvents.activate);\n }\n});\n\nInteractEvent.signals.on('new', function ({ interaction, iEvent, event }) {\n if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { return; }\n\n const draggableElement = interaction.element;\n const dragEvent = iEvent;\n const dropResult = getDrop(dragEvent, event, draggableElement);\n\n interaction.dropTarget = dropResult.dropzone;\n interaction.dropElement = dropResult.element;\n\n interaction.dropEvents = getDropEvents(interaction, event, dragEvent);\n});\n\nInteraction.signals.on('action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n fireDropEvents(interaction, interaction.dropEvents);\n});\n\nInteraction.signals.on('action-end', function ({ interaction }) {\n if (interaction.prepared.name === 'drag') {\n fireDropEvents(interaction, interaction.dropEvents);\n }\n});\n\nInteraction.signals.on('stop-drag', function ({ interaction }) {\n interaction.activeDrops.dropzones =\n interaction.activeDrops.elements =\n interaction.activeDrops.rects =\n interaction.dropEvents = null;\n});\n\nfunction collectDrops (interaction, element) {\n const drops = [];\n const elements = [];\n\n element = element || interaction.element;\n\n // collect all dropzones and their elements which qualify for a drop\n for (const current of scope.interactables) {\n if (!current.options.drop.enabled) { continue; }\n\n const accept = current.options.drop.accept;\n\n // test the draggable element against the dropzone's accept setting\n if ((utils.is.element(accept) && accept !== element)\n || (utils.is.string(accept)\n && !utils.matchesSelector(element, accept))) {\n\n continue;\n }\n\n // query for new elements if necessary\n const dropElements = utils.is.string(current.target)\n ? current._context.querySelectorAll(current.target)\n : [current.target];\n\n for (let i = 0; i < dropElements.length; i++) {\n const currentElement = dropElements[i];\n\n if (currentElement !== element) {\n drops.push(current);\n elements.push(currentElement);\n }\n }\n }\n\n return {\n elements,\n dropzones: drops,\n };\n}\n\nfunction fireActiveDrops (interaction, event) {\n let prevElement;\n\n // loop through all active dropzones and trigger event\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n const current = interaction.activeDrops.dropzones[i];\n const currentElement = interaction.activeDrops.elements [i];\n\n // prevent trigger of duplicate events on same element\n if (currentElement !== prevElement) {\n // set current element as event target\n event.target = currentElement;\n current.fire(event);\n }\n prevElement = currentElement;\n }\n}\n\n// Collect a new set of possible drops and save them in activeDrops.\n// setActiveDrops should always be called when a drag has just started or a\n// drag event happens while dynamicDrop is true\nfunction setActiveDrops (interaction, dragElement) {\n // get dropzones and their elements that could receive the draggable\n const possibleDrops = collectDrops(interaction, dragElement, true);\n\n interaction.activeDrops.dropzones = possibleDrops.dropzones;\n interaction.activeDrops.elements = possibleDrops.elements;\n interaction.activeDrops.rects = [];\n\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n interaction.activeDrops.rects[i] =\n interaction.activeDrops.dropzones[i].getRect(interaction.activeDrops.elements[i]);\n }\n}\n\nfunction getDrop (dragEvent, event, dragElement) {\n const interaction = dragEvent.interaction;\n const validDrops = [];\n\n if (dynamicDrop) {\n setActiveDrops(interaction, dragElement);\n }\n\n // collect all dropzones and their elements which qualify for a drop\n for (let j = 0; j < interaction.activeDrops.dropzones.length; j++) {\n const current = interaction.activeDrops.dropzones[j];\n const currentElement = interaction.activeDrops.elements [j];\n const rect = interaction.activeDrops.rects [j];\n\n validDrops.push(current.dropCheck(dragEvent, event, interaction.target, dragElement, currentElement, rect)\n ? currentElement\n : null);\n }\n\n // get the most appropriate dropzone based on DOM depth and order\n const dropIndex = utils.indexOfDeepestElement(validDrops);\n\n return {\n dropzone: interaction.activeDrops.dropzones[dropIndex] || null,\n element : interaction.activeDrops.elements [dropIndex] || null,\n };\n}\n\nfunction getDropEvents (interaction, pointerEvent, dragEvent) {\n const dropEvents = {\n enter : null,\n leave : null,\n activate : null,\n deactivate: null,\n move : null,\n drop : null,\n };\n\n const tmpl = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n };\n\n if (interaction.dropElement !== interaction.prevDropElement) {\n // if there was a prevDropTarget, create a dragleave event\n if (interaction.prevDropTarget) {\n dropEvents.leave = utils.extend({ type: 'dragleave' }, tmpl);\n\n dragEvent.dragLeave = dropEvents.leave.target = interaction.prevDropElement;\n dragEvent.prevDropzone = dropEvents.leave.dropzone = interaction.prevDropTarget;\n }\n // if the dropTarget is not null, create a dragenter event\n if (interaction.dropTarget) {\n dropEvents.enter = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n type : 'dragenter',\n };\n\n dragEvent.dragEnter = interaction.dropElement;\n dragEvent.dropzone = interaction.dropTarget;\n }\n }\n\n if (dragEvent.type === 'dragend' && interaction.dropTarget) {\n dropEvents.drop = utils.extend({ type: 'drop' }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n dragEvent.relatedTarget = interaction.dropElement;\n }\n if (dragEvent.type === 'dragstart') {\n dropEvents.activate = utils.extend({ type: 'dropactivate' }, tmpl);\n\n dropEvents.activate.target = null;\n dropEvents.activate.dropzone = null;\n }\n if (dragEvent.type === 'dragend') {\n dropEvents.deactivate = utils.extend({ type: 'dropdeactivate' }, tmpl);\n\n dropEvents.deactivate.target = null;\n dropEvents.deactivate.dropzone = null;\n }\n if (dragEvent.type === 'dragmove' && interaction.dropTarget) {\n dropEvents.move = utils.extend({\n dragmove : dragEvent,\n type : 'dropmove',\n }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n }\n\n return dropEvents;\n}\n\nfunction fireDropEvents (interaction, dropEvents) {\n if (dropEvents.leave) { interaction.prevDropTarget.fire(dropEvents.leave); }\n if (dropEvents.move ) { interaction.dropTarget.fire(dropEvents.move ); }\n if (dropEvents.enter) { interaction.dropTarget.fire(dropEvents.enter); }\n if (dropEvents.drop ) { interaction.dropTarget.fire(dropEvents.drop ); }\n if (dropEvents.deactivate) {\n fireActiveDrops(interaction, dropEvents.deactivate);\n }\n\n interaction.prevDropTarget = interaction.dropTarget;\n interaction.prevDropElement = interaction.dropElement;\n}\n\n/*\\\n * Interactable.dropzone\n [ method ]\n *\n * Returns or sets whether elements can be dropped onto this\n * Interactable to trigger drop events\n *\n * Dropzones can receive the following events:\n * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends\n * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone\n * - `dragmove` when a draggable that has entered the dropzone is moved\n * - `drop` when a draggable is dropped into this dropzone\n *\n * Use the `accept` option to allow only elements that match the given CSS\n * selector or element. The value can be:\n *\n * - **an Element** - only that element can be dropped into this dropzone.\n * - **a string**, - the element being dragged must match it as a CSS selector.\n * - **`null`** - accept options is cleared - it accepts any element.\n *\n * Use the `overlap` option to set how drops are checked for. The allowed\n * values are:\n *\n * - `'pointer'`, the pointer must be over the dropzone (default)\n * - `'center'`, the draggable element's center must be over the dropzone\n * - a number from 0-1 which is the `(intersection area) / (draggable area)`.\n * e.g. `0.5` for drop to happen when half of the area of the draggable is\n * over the dropzone\n *\n * Use the `checker` option to specify a function to check if a dragged\n * element is over this Interactable.\n *\n | interact(target)\n | .dropChecker(function(dragEvent, // related dragmove or dragend event\n | event, // TouchEvent/PointerEvent/MouseEvent\n | dropped, // bool result of the default checker\n | dropzone, // dropzone Interactable\n | dropElement, // dropzone elemnt\n | draggable, // draggable Interactable\n | draggableElement) {// draggable element\n |\n | return dropped && event.target.hasAttribute('allow-drop');\n | }\n *\n *\n - options (boolean | object | null) #optional The new value to be set.\n | interact('.drop').dropzone({\n | accept: '.can-drop' || document.getElementById('single-drop'),\n | overlap: 'pointer' || 'center' || zeroToOne\n | }\n = (boolean | object) The current setting or this Interactable\n\\*/\nInteractable.prototype.dropzone = function (options) {\n if (utils.is.object(options)) {\n this.options.drop.enabled = options.enabled === false? false: true;\n\n if (utils.is.function(options.ondrop) ) { this.events.ondrop = options.ondrop ; }\n if (utils.is.function(options.ondropactivate) ) { this.events.ondropactivate = options.ondropactivate ; }\n if (utils.is.function(options.ondropdeactivate)) { this.events.ondropdeactivate = options.ondropdeactivate; }\n if (utils.is.function(options.ondragenter) ) { this.events.ondragenter = options.ondragenter ; }\n if (utils.is.function(options.ondragleave) ) { this.events.ondragleave = options.ondragleave ; }\n if (utils.is.function(options.ondropmove) ) { this.events.ondropmove = options.ondropmove ; }\n\n if (/^(pointer|center)$/.test(options.overlap)) {\n this.options.drop.overlap = options.overlap;\n }\n else if (utils.is.number(options.overlap)) {\n this.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0);\n }\n if ('accept' in options) {\n this.options.drop.accept = options.accept;\n }\n if ('checker' in options) {\n this.options.drop.checker = options.checker;\n }\n\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drop.enabled = options;\n\n if (!options) {\n this.ondragenter = this.ondragleave = this.ondrop\n = this.ondropactivate = this.ondropdeactivate = null;\n }\n\n return this;\n }\n\n return this.options.drop;\n};\n\nInteractable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) {\n let dropped = false;\n\n // if the dropzone has no rect (eg. display: none)\n // call the custom dropChecker or just return false\n if (!(rect = rect || this.getRect(dropElement))) {\n return (this.options.drop.checker\n ? this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement)\n : false);\n }\n\n const dropOverlap = this.options.drop.overlap;\n\n if (dropOverlap === 'pointer') {\n const origin = utils.getOriginXY(draggable, draggableElement, 'drag');\n const page = utils.getPageXY(dragEvent);\n\n page.x += origin.x;\n page.y += origin.y;\n\n const horizontal = (page.x > rect.left) && (page.x < rect.right);\n const vertical = (page.y > rect.top ) && (page.y < rect.bottom);\n\n dropped = horizontal && vertical;\n }\n\n const dragRect = draggable.getRect(draggableElement);\n\n if (dragRect && dropOverlap === 'center') {\n const cx = dragRect.left + dragRect.width / 2;\n const cy = dragRect.top + dragRect.height / 2;\n\n dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom;\n }\n\n if (dragRect && utils.is.number(dropOverlap)) {\n const overlapArea = (Math.max(0, Math.min(rect.right , dragRect.right ) - Math.max(rect.left, dragRect.left))\n * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top , dragRect.top )));\n\n const overlapRatio = overlapArea / (dragRect.width * dragRect.height);\n\n dropped = overlapRatio >= dropOverlap;\n }\n\n if (this.options.drop.checker) {\n dropped = this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement);\n }\n\n return dropped;\n};\n\nInteractable.signals.on('unset', function ({ interactable }) {\n interactable.dropzone(false);\n});\n\nInteractable.settingsMethods.push('dropChecker');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.dropTarget = null; // the dropzone a drag target might be dropped into\n interaction.dropElement = null; // the element at the time of checking\n interaction.prevDropTarget = null; // the dropzone that was recently dragged away from\n interaction.prevDropElement = null; // the element at the time of checking\n interaction.dropEvents = null; // the dropEvents related to the current drag event\n\n interaction.activeDrops = {\n dropzones: [], // the dropzones that are mentioned below\n elements : [], // elements of dropzones that accept the target draggable\n rects : [], // the rects of the elements mentioned above\n };\n\n});\n\nInteraction.signals.on('stop', function ({ interaction }) {\n interaction.dropTarget = interaction.dropElement =\n interaction.prevDropTarget = interaction.prevDropElement = null;\n});\n\n/*\\\n * interact.dynamicDrop\n [ method ]\n *\n * Returns or sets whether the dimensions of dropzone elements are\n * calculated on every dragmove or only on dragstart for the default\n * dropChecker\n *\n - newValue (boolean) #optional True to check on each move. False to check only before start\n = (boolean | interact) The current setting or interact\n\\*/\ninteract.dynamicDrop = function (newValue) {\n if (utils.is.bool(newValue)) {\n //if (dragging && dynamicDrop !== newValue && !newValue) {\n //calcRects(dropzones);\n //}\n\n dynamicDrop = newValue;\n\n return interact;\n }\n return dynamicDrop;\n};\n\nutils.merge(Interactable.eventTypes, [\n 'dragenter',\n 'dragleave',\n 'dropactivate',\n 'dropdeactivate',\n 'dropmove',\n 'drop',\n]);\nactions.methodDict.drop = 'dropzone';\n\ndefaultOptions.drop = drop.defaults;\n\nmodule.exports = drop;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst gesture = {\n defaults: {\n enabled : false,\n origin : null,\n restrict: null,\n },\n\n checker: function (pointer, event, interactable, element, interaction) {\n if (interaction.pointerIds.length >= 2) {\n return { name: 'gesture' };\n }\n\n return null;\n },\n\n getCursor: function () {\n return '';\n },\n};\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturestart') { return; }\n iEvent.ds = 0;\n\n interaction.gesture.startDistance = interaction.gesture.prevDistance = iEvent.distance;\n interaction.gesture.startAngle = interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.scale = 1;\n});\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturemove') { return; }\n\n iEvent.ds = iEvent.scale - interaction.gesture.scale;\n\n interaction.target.fire(iEvent);\n\n interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.prevDistance = iEvent.distance;\n\n if (iEvent.scale !== Infinity\n && iEvent.scale !== null\n && iEvent.scale !== undefined\n && !isNaN(iEvent.scale)) {\n\n interaction.gesture.scale = iEvent.scale;\n }\n});\n\n/*\\\n * Interactable.gesturable\n [ method ]\n *\n * Gets or sets whether multitouch gestures can be performed on the\n * Interactable's element\n *\n = (boolean) Indicates if this can be the target of gesture events\n | var isGestureable = interact(element).gesturable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on gesture events (makes the Interactable gesturable)\n = (object) this Interactable\n | interact(element).gesturable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // limit multiple gestures.\n | // See the explanation in @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n\\*/\nInteractable.prototype.gesturable = function (options) {\n if (utils.is.object(options)) {\n this.options.gesture.enabled = options.enabled === false? false: true;\n this.setPerAction('gesture', options);\n this.setOnEvents('gesture', options);\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.gesture.enabled = options;\n\n if (!options) {\n this.ongesturestart = this.ongesturestart = this.ongestureend = null;\n }\n\n return this;\n }\n\n return this.options.gesture;\n};\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action, event, starting, ending, deltaSource }) {\n if (action !== 'gesture') { return; }\n\n const pointers = interaction.pointers;\n\n iEvent.touches = [pointers[0], pointers[1]];\n\n if (starting) {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = 1;\n iEvent.ds = 0;\n iEvent.angle = utils.touchAngle(pointers, undefined, deltaSource);\n iEvent.da = 0;\n }\n else if (ending || event instanceof InteractEvent) {\n iEvent.distance = interaction.prevEvent.distance;\n iEvent.box = interaction.prevEvent.box;\n iEvent.scale = interaction.prevEvent.scale;\n iEvent.ds = iEvent.scale - 1;\n iEvent.angle = interaction.prevEvent.angle;\n iEvent.da = iEvent.angle - interaction.gesture.startAngle;\n }\n else {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = iEvent.distance / interaction.gesture.startDistance;\n iEvent.angle = utils.touchAngle(pointers, interaction.gesture.prevAngle, deltaSource);\n\n iEvent.ds = iEvent.scale - interaction.gesture.prevScale;\n iEvent.da = iEvent.angle - interaction.gesture.prevAngle;\n }\n});\n\nInteraction.signals.on('new', function (interaction) {\n interaction.gesture = {\n start: { x: 0, y: 0 },\n\n startDistance: 0, // distance between two touches of touchStart\n prevDistance : 0,\n distance : 0,\n\n scale: 1, // gesture.distance / gesture.startDistance\n\n startAngle: 0, // angle of line joining two touches\n prevAngle : 0, // angle of the previous gesture event\n };\n});\n\nactions.gesture = gesture;\nactions.names.push('gesture');\nutils.merge(Interactable.eventTypes, [\n 'gesturestart',\n 'gesturemove',\n 'gestureend',\n]);\nactions.methodDict.gesture = 'gesturable';\n\ndefaultOptions.gesture = gesture.defaults;\n\nmodule.exports = gesture;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\n// Less Precision with touch input\nconst defaultMargin = browser.supportsTouch || browser.supportsPointerEvent? 20: 10;\n\nconst resize = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n square: false,\n preserveAspectRatio: false,\n axis: 'xy',\n\n // use default margin\n margin: NaN,\n\n // object with props left, right, top, bottom which are\n // true/false values to resize when the pointer is over that edge,\n // CSS selectors to match the handles for each direction\n // or the Elements for each handle\n edges: null,\n\n // a value of 'none' will limit the resize rect to a minimum of 0x0\n // 'negate' will alow the rect to have negative width/height\n // 'reposition' will keep the width/height positive by swapping\n // the top and bottom edges and/or swapping the left and right edges\n invert: 'none',\n },\n\n checker: function (pointer, event, interactable, element, interaction, rect) {\n if (!rect) { return null; }\n\n const page = utils.extend({}, interaction.curCoords.page);\n const options = interactable.options;\n\n if (options.resize.enabled) {\n const resizeOptions = options.resize;\n const resizeEdges = { left: false, right: false, top: false, bottom: false };\n\n // if using resize.edges\n if (utils.is.object(resizeOptions.edges)) {\n for (const edge in resizeEdges) {\n resizeEdges[edge] = checkResizeEdge(edge,\n resizeOptions.edges[edge],\n page,\n interaction._eventTarget,\n element,\n rect,\n resizeOptions.margin || defaultMargin);\n }\n\n resizeEdges.left = resizeEdges.left && !resizeEdges.right;\n resizeEdges.top = resizeEdges.top && !resizeEdges.bottom;\n\n if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) {\n return {\n name: 'resize',\n edges: resizeEdges,\n };\n }\n }\n else {\n const right = options.resize.axis !== 'y' && page.x > (rect.right - defaultMargin);\n const bottom = options.resize.axis !== 'x' && page.y > (rect.bottom - defaultMargin);\n\n if (right || bottom) {\n return {\n name: 'resize',\n axes: (right? 'x' : '') + (bottom? 'y' : ''),\n };\n }\n }\n }\n\n return null;\n },\n\n cursors: (browser.isIe9OrOlder ? {\n x : 'e-resize',\n y : 's-resize',\n xy: 'se-resize',\n\n top : 'n-resize',\n left : 'w-resize',\n bottom : 's-resize',\n right : 'e-resize',\n topleft : 'se-resize',\n bottomright: 'se-resize',\n topright : 'ne-resize',\n bottomleft : 'ne-resize',\n } : {\n x : 'ew-resize',\n y : 'ns-resize',\n xy: 'nwse-resize',\n\n top : 'ns-resize',\n left : 'ew-resize',\n bottom : 'ns-resize',\n right : 'ew-resize',\n topleft : 'nwse-resize',\n bottomright: 'nwse-resize',\n topright : 'nesw-resize',\n bottomleft : 'nesw-resize',\n }),\n\n getCursor: function (action) {\n if (action.axis) {\n return resize.cursors[action.name + action.axis];\n }\n else if (action.edges) {\n let cursorKey = '';\n const edgeNames = ['top', 'bottom', 'left', 'right'];\n\n for (let i = 0; i < 4; i++) {\n if (action.edges[edgeNames[i]]) {\n cursorKey += edgeNames[i];\n }\n }\n\n return resize.cursors[cursorKey];\n }\n },\n};\n\n// resizestart\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'resizestart' || !interaction.prepared.edges) {\n return;\n }\n\n const startRect = interaction.target.getRect(interaction.element);\n const resizeOptions = interaction.target.options.resize;\n\n /*\n * When using the `resizable.square` or `resizable.preserveAspectRatio` options, resizing from one edge\n * will affect another. E.g. with `resizable.square`, resizing to make the right edge larger will make\n * the bottom edge larger by the same amount. We call these 'linked' edges. Any linked edges will depend\n * on the active edges and the edge being interacted with.\n */\n if (resizeOptions.square || resizeOptions.preserveAspectRatio) {\n const linkedEdges = utils.extend({}, interaction.prepared.edges);\n\n linkedEdges.top = linkedEdges.top || (linkedEdges.left && !linkedEdges.bottom);\n linkedEdges.left = linkedEdges.left || (linkedEdges.top && !linkedEdges.right );\n linkedEdges.bottom = linkedEdges.bottom || (linkedEdges.right && !linkedEdges.top );\n linkedEdges.right = linkedEdges.right || (linkedEdges.bottom && !linkedEdges.left );\n\n interaction.prepared._linkedEdges = linkedEdges;\n }\n else {\n interaction.prepared._linkedEdges = null;\n }\n\n // if using `resizable.preserveAspectRatio` option, record aspect ratio at the start of the resize\n if (resizeOptions.preserveAspectRatio) {\n interaction.resizeStartAspectRatio = startRect.width / startRect.height;\n }\n\n interaction.resizeRects = {\n start : startRect,\n current : utils.extend({}, startRect),\n inverted : utils.extend({}, startRect),\n previous : utils.extend({}, startRect),\n delta : {\n left: 0, right : 0, width : 0,\n top : 0, bottom: 0, height: 0,\n },\n };\n\n iEvent.rect = interaction.resizeRects.inverted;\n iEvent.deltaRect = interaction.resizeRects.delta;\n});\n\n// resizemove\nInteractEvent.signals.on('new', function ({ iEvent, phase, interaction }) {\n if (phase !== 'move' || !interaction.prepared.edges) { return; }\n\n const resizeOptions = interaction.target.options.resize;\n const invert = resizeOptions.invert;\n const invertible = invert === 'reposition' || invert === 'negate';\n\n let edges = interaction.prepared.edges;\n\n const start = interaction.resizeRects.start;\n const current = interaction.resizeRects.current;\n const inverted = interaction.resizeRects.inverted;\n const delta = interaction.resizeRects.delta;\n const previous = utils.extend(interaction.resizeRects.previous, inverted);\n const originalEdges = edges;\n\n let dx = iEvent.dx;\n let dy = iEvent.dy;\n\n if (resizeOptions.preserveAspectRatio || resizeOptions.square) {\n // `resize.preserveAspectRatio` takes precedence over `resize.square`\n const startAspectRatio = resizeOptions.preserveAspectRatio\n ? interaction.resizeStartAspectRatio\n : 1;\n\n edges = interaction.prepared._linkedEdges;\n\n if ((originalEdges.left && originalEdges.bottom)\n || (originalEdges.right && originalEdges.top)) {\n dy = -dx / startAspectRatio;\n }\n else if (originalEdges.left || originalEdges.right ) { dy = dx / startAspectRatio; }\n else if (originalEdges.top || originalEdges.bottom) { dx = dy * startAspectRatio; }\n }\n\n // update the 'current' rect without modifications\n if (edges.top ) { current.top += dy; }\n if (edges.bottom) { current.bottom += dy; }\n if (edges.left ) { current.left += dx; }\n if (edges.right ) { current.right += dx; }\n\n if (invertible) {\n // if invertible, copy the current rect\n utils.extend(inverted, current);\n\n if (invert === 'reposition') {\n // swap edge values if necessary to keep width/height positive\n let swap;\n\n if (inverted.top > inverted.bottom) {\n swap = inverted.top;\n\n inverted.top = inverted.bottom;\n inverted.bottom = swap;\n }\n if (inverted.left > inverted.right) {\n swap = inverted.left;\n\n inverted.left = inverted.right;\n inverted.right = swap;\n }\n }\n }\n else {\n // if not invertible, restrict to minimum of 0x0 rect\n inverted.top = Math.min(current.top, start.bottom);\n inverted.bottom = Math.max(current.bottom, start.top);\n inverted.left = Math.min(current.left, start.right);\n inverted.right = Math.max(current.right, start.left);\n }\n\n inverted.width = inverted.right - inverted.left;\n inverted.height = inverted.bottom - inverted.top ;\n\n for (const edge in inverted) {\n delta[edge] = inverted[edge] - previous[edge];\n }\n\n iEvent.edges = interaction.prepared.edges;\n iEvent.rect = inverted;\n iEvent.deltaRect = delta;\n});\n\n/*\\\n * Interactable.resizable\n [ method ]\n *\n * Gets or sets whether resize actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of resize elements\n | var isResizeable = interact('input[type=text]').resizable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on resize events (object makes the Interactable resizable)\n = (object) This Interactable\n | interact(element).resizable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | edges: {\n | top : true, // Use pointer coords to check for resize.\n | left : false, // Disable resizing from left edge.\n | bottom: '.resize-s',// Resize if pointer target matches selector\n | right : handleEl // Resize if pointer target is the given Element\n | },\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height are adjusted at a 1:1 ratio.\n | square: false,\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height maintain the aspect ratio they had when resizing started.\n | preserveAspectRatio: false,\n |\n | // a value of 'none' will limit the resize rect to a minimum of 0x0\n | // 'negate' will allow the rect to have negative width/height\n | // 'reposition' will keep the width/height positive by swapping\n | // the top and bottom edges and/or swapping the left and right edges\n | invert: 'none' || 'negate' || 'reposition'\n |\n | // limit multiple resizes.\n | // See the explanation in the @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n \\*/\nInteractable.prototype.resizable = function (options) {\n if (utils.is.object(options)) {\n this.options.resize.enabled = options.enabled === false? false: true;\n this.setPerAction('resize', options);\n this.setOnEvents('resize', options);\n\n if (/^x$|^y$|^xy$/.test(options.axis)) {\n this.options.resize.axis = options.axis;\n }\n else if (options.axis === null) {\n this.options.resize.axis = defaultOptions.resize.axis;\n }\n\n if (utils.is.bool(options.preserveAspectRatio)) {\n this.options.resize.preserveAspectRatio = options.preserveAspectRatio;\n }\n else if (utils.is.bool(options.square)) {\n this.options.resize.square = options.square;\n }\n\n return this;\n }\n if (utils.is.bool(options)) {\n this.options.resize.enabled = options;\n\n if (!options) {\n this.onresizestart = this.onresizestart = this.onresizeend = null;\n }\n\n return this;\n }\n return this.options.resize;\n};\n\nfunction checkResizeEdge (name, value, page, element, interactableElement, rect, margin) {\n // false, '', undefined, null\n if (!value) { return false; }\n\n // true value, use pointer coords and element rect\n if (value === true) {\n // if dimensions are negative, \"switch\" edges\n const width = utils.is.number(rect.width )? rect.width : rect.right - rect.left;\n const height = utils.is.number(rect.height)? rect.height : rect.bottom - rect.top ;\n\n if (width < 0) {\n if (name === 'left' ) { name = 'right'; }\n else if (name === 'right') { name = 'left' ; }\n }\n if (height < 0) {\n if (name === 'top' ) { name = 'bottom'; }\n else if (name === 'bottom') { name = 'top' ; }\n }\n\n if (name === 'left' ) { return page.x < ((width >= 0? rect.left: rect.right ) + margin); }\n if (name === 'top' ) { return page.y < ((height >= 0? rect.top : rect.bottom) + margin); }\n\n if (name === 'right' ) { return page.x > ((width >= 0? rect.right : rect.left) - margin); }\n if (name === 'bottom') { return page.y > ((height >= 0? rect.bottom: rect.top ) - margin); }\n }\n\n // the remaining checks require an element\n if (!utils.is.element(element)) { return false; }\n\n return utils.is.element(value)\n // the value is an element to use as a resize handle\n ? value === element\n // otherwise check if element matches value as selector\n : utils.matchesUpTo(element, value, interactableElement);\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.resizeAxes = 'xy';\n});\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action }) {\n if (action !== 'resize' || !interaction.resizeAxes) { return; }\n\n const options = interaction.target.options;\n\n if (options.resize.square) {\n if (interaction.resizeAxes === 'y') {\n iEvent.dx = iEvent.dy;\n }\n else {\n iEvent.dy = iEvent.dx;\n }\n iEvent.axes = 'xy';\n }\n else {\n iEvent.axes = interaction.resizeAxes;\n\n if (interaction.resizeAxes === 'x') {\n iEvent.dy = 0;\n }\n else if (interaction.resizeAxes === 'y') {\n iEvent.dx = 0;\n }\n }\n});\n\nactions.resize = resize;\nactions.names.push('resize');\nutils.merge(Interactable.eventTypes, [\n 'resizestart',\n 'resizemove',\n 'resizeinertiastart',\n 'resizeinertiaresume',\n 'resizeend',\n]);\nactions.methodDict.resize = 'resizable';\n\ndefaultOptions.resize = resize.defaults;\n\nmodule.exports = resize;\n","const raf = require('./utils/raf');\nconst getWindow = require('./utils/window').getWindow;\nconst is = require('./utils/is');\nconst domUtils = require('./utils/domUtils');\nconst Interaction = require('./Interaction');\nconst defaultOptions = require('./defaultOptions');\n\nconst autoScroll = {\n defaults: {\n enabled : false,\n container: null, // the item that is scrolled (Window or HTMLElement)\n margin : 60,\n speed : 300, // the scroll speed in pixels per second\n },\n\n interaction: null,\n i: null, // the handle returned by window.setInterval\n x: 0, y: 0, // Direction each pulse is to scroll in\n\n isScrolling: false,\n prevTime: 0,\n\n start: function (interaction) {\n autoScroll.isScrolling = true;\n raf.cancel(autoScroll.i);\n\n autoScroll.interaction = interaction;\n autoScroll.prevTime = new Date().getTime();\n autoScroll.i = raf.request(autoScroll.scroll);\n },\n\n stop: function () {\n autoScroll.isScrolling = false;\n raf.cancel(autoScroll.i);\n },\n\n // scroll the window by the values in scroll.x/y\n scroll: function () {\n const options = autoScroll.interaction.target.options[autoScroll.interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(autoScroll.interaction.element);\n const now = new Date().getTime();\n // change in time in seconds\n const dt = (now - autoScroll.prevTime) / 1000;\n // displacement\n const s = options.speed * dt;\n\n if (s >= 1) {\n if (is.window(container)) {\n container.scrollBy(autoScroll.x * s, autoScroll.y * s);\n }\n else if (container) {\n container.scrollLeft += autoScroll.x * s;\n container.scrollTop += autoScroll.y * s;\n }\n\n autoScroll.prevTime = now;\n }\n\n if (autoScroll.isScrolling) {\n raf.cancel(autoScroll.i);\n autoScroll.i = raf.request(autoScroll.scroll);\n }\n },\n check: function (interactable, actionName) {\n const options = interactable.options;\n\n return options[actionName].autoScroll && options[actionName].autoScroll.enabled;\n },\n onInteractionMove: function ({ interaction, pointer }) {\n if (!(interaction.interacting()\n && autoScroll.check(interaction.target, interaction.prepared.name))) {\n return;\n }\n\n if (interaction.simulation) {\n autoScroll.x = autoScroll.y = 0;\n return;\n }\n\n let top;\n let right;\n let bottom;\n let left;\n\n const options = interaction.target.options[interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(interaction.element);\n\n if (is.window(container)) {\n left = pointer.clientX < autoScroll.margin;\n top = pointer.clientY < autoScroll.margin;\n right = pointer.clientX > container.innerWidth - autoScroll.margin;\n bottom = pointer.clientY > container.innerHeight - autoScroll.margin;\n }\n else {\n const rect = domUtils.getElementClientRect(container);\n\n left = pointer.clientX < rect.left + autoScroll.margin;\n top = pointer.clientY < rect.top + autoScroll.margin;\n right = pointer.clientX > rect.right - autoScroll.margin;\n bottom = pointer.clientY > rect.bottom - autoScroll.margin;\n }\n\n autoScroll.x = (right ? 1: left? -1: 0);\n autoScroll.y = (bottom? 1: top? -1: 0);\n\n if (!autoScroll.isScrolling) {\n // set the autoScroll properties to those of the target\n autoScroll.margin = options.margin;\n autoScroll.speed = options.speed;\n\n autoScroll.start(interaction);\n }\n },\n};\n\nInteraction.signals.on('stop-active', function () {\n autoScroll.stop();\n});\n\nInteraction.signals.on('action-move', autoScroll.onInteractionMove);\n\ndefaultOptions.perAction.autoScroll = autoScroll.defaults;\n\nmodule.exports = autoScroll;\n","const Interactable = require('../Interactable');\nconst actions = require('../actions/base');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.ignoreFrom\n [ method ]\n *\n * If the target of the `mousedown`, `pointerdown` or `touchstart`\n * event or any of it's parents match the given CSS selector or\n * Element, no drag/resize/gesture is started.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to not ignore any elements\n = (string | Element | object) The current ignoreFrom value or this Interactable\n **\n | interact(element, { ignoreFrom: document.getElementById('no-action') });\n | // or\n | interact(element).ignoreFrom('input, textarea, a');\n\\*/\nInteractable.prototype.ignoreFrom = function (newValue) {\n return this._backCompatOption('ignoreFrom', newValue);\n};\n\n/*\\\n * Interactable.allowFrom\n [ method ]\n *\n * A drag/resize/gesture is started only If the target of the\n * `mousedown`, `pointerdown` or `touchstart` event or any of it's\n * parents match the given CSS selector or Element.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to allow from any element\n = (string | Element | object) The current allowFrom value or this Interactable\n **\n | interact(element, { allowFrom: document.getElementById('drag-handle') });\n | // or\n | interact(element).allowFrom('.handle');\n\\*/\nInteractable.prototype.allowFrom = function (newValue) {\n return this._backCompatOption('allowFrom', newValue);\n};\n\nInteractable.prototype.testIgnore = function (ignoreFrom, interactableElement, element) {\n if (!ignoreFrom || !is.element(element)) { return false; }\n\n if (is.string(ignoreFrom)) {\n return domUtils.matchesUpTo(element, ignoreFrom, interactableElement);\n }\n else if (is.element(ignoreFrom)) {\n return domUtils.nodeContains(ignoreFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testAllow = function (allowFrom, interactableElement, element) {\n if (!allowFrom) { return true; }\n\n if (!is.element(element)) { return false; }\n\n if (is.string(allowFrom)) {\n return domUtils.matchesUpTo(element, allowFrom, interactableElement);\n }\n else if (is.element(allowFrom)) {\n return domUtils.nodeContains(allowFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testIgnoreAllow = function (options, interactableElement, eventTarget) {\n return (!this.testIgnore(options.ignoreFrom, interactableElement, eventTarget)\n && this.testAllow(options.allowFrom, interactableElement, eventTarget));\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (event.buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\n","const interact = require('../interact');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst actions = require('../actions/base');\nconst defaultOptions = require('../defaultOptions');\nconst browser = require('../utils/browser');\nconst scope = require('../scope');\nconst utils = require('../utils');\nconst signals = require('../utils/Signals').new();\n\nrequire('./InteractableMethods');\n\nconst autoStart = {\n signals,\n withinInteractionLimit,\n // Allow this many interactions to happen simultaneously\n maxInteractions: Infinity,\n defaults: {\n perAction: {\n manualStart: false,\n max: Infinity,\n maxPerElement: 1,\n allowFrom: null,\n ignoreFrom: null,\n },\n },\n setActionDefaults: function (action) {\n utils.extend(action.defaults, autoStart.defaults.perAction);\n },\n};\n\n// set cursor style on mousedown\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget }) {\n if (interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\n// set cursor style on mousemove\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget }) {\n if (!interaction.mouse\n || interaction.pointerIsDown\n || interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\nInteraction.signals.on('move', function (arg) {\n const { interaction, event } = arg;\n\n if (!interaction.pointerIsDown\n || interaction.interacting()\n || !interaction.pointerWasMoved\n || !interaction.prepared.name) {\n return;\n }\n\n signals.fire('before-start', arg);\n\n const target = interaction.target;\n\n if (interaction.prepared.name && target) {\n // check manualStart and interaction limit\n if (target.options[interaction.prepared.name].manualStart\n || !withinInteractionLimit(target, interaction.element, interaction.prepared)) {\n interaction.stop(event);\n }\n else {\n interaction.start(interaction.prepared, target, interaction.element);\n }\n }\n});\n\n// Check if the current target supports the action.\n// If so, return the validated action. Otherwise, return null\nfunction validateAction (action, interactable, element, eventTarget) {\n if (utils.is.object(action)\n && interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget)\n && interactable.options[action.name].enabled\n && withinInteractionLimit(interactable, element, action)) {\n return action;\n }\n\n return null;\n}\n\nfunction validateSelector (interaction, pointer, event, matches, matchElements, eventTarget) {\n for (let i = 0, len = matches.length; i < len; i++) {\n const match = matches[i];\n const matchElement = matchElements[i];\n const action = validateAction(match.getAction(pointer, event, interaction, matchElement),\n match,\n matchElement,\n eventTarget);\n\n if (action) {\n return {\n action,\n target: match,\n element: matchElement,\n };\n }\n }\n\n return {};\n}\n\nfunction getActionInfo (interaction, pointer, event, eventTarget) {\n let matches = [];\n let matchElements = [];\n\n let element = eventTarget;\n let action = null;\n\n function pushMatches (interactable, selector, context) {\n const elements = (browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined);\n\n if (utils.matchesSelector(element, selector, elements)) {\n\n matches.push(interactable);\n matchElements.push(element);\n }\n }\n\n while (utils.is.element(element)) {\n matches = [];\n matchElements = [];\n\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && (action = validateAction(elementInteractable.getAction(pointer, event, interaction, element, eventTarget),\n elementInteractable,\n element,\n eventTarget))\n && !elementInteractable.options[action.name].manualStart) {\n return {\n element,\n action,\n target: elementInteractable,\n };\n }\n else {\n scope.interactables.forEachSelector(pushMatches, element);\n\n const actionInfo = validateSelector(interaction, pointer, event, matches, matchElements, eventTarget);\n\n if (actionInfo.action\n && !actionInfo.target.options[actionInfo.action.name].manualStart) {\n return actionInfo;\n }\n }\n\n element = utils.parentNode(element);\n }\n\n return {};\n}\n\nfunction prepare (interaction, { action, target, element }) {\n action = action || {};\n\n if (interaction.target && interaction.target.options.styleCursor) {\n interaction.target._doc.documentElement.style.cursor = '';\n }\n\n interaction.target = target;\n interaction.element = element;\n utils.copyAction(interaction.prepared, action);\n\n if (target && target.options.styleCursor) {\n const cursor = action? actions[action.name].getCursor(action) : '';\n interaction.target._doc.documentElement.style.cursor = cursor;\n }\n\n signals.fire('prepared', { interaction: interaction });\n}\n\nInteraction.signals.on('stop', function ({ interaction }) {\n const target = interaction.target;\n\n if (target && target.options.styleCursor) {\n target._doc.documentElement.style.cursor = '';\n }\n});\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (utils.is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (utils.is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n const buttons = event.buttons || ({\n 0: 1,\n 1: 4,\n 3: 8,\n 4: 16,\n })[event.button];\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\nfunction withinInteractionLimit (interactable, element, action) {\n const options = interactable.options;\n const maxActions = options[action.name].max;\n const maxPerElement = options[action.name].maxPerElement;\n let activeInteractions = 0;\n let targetCount = 0;\n let targetElementCount = 0;\n\n // no actions if any of these values == 0\n if (!(maxActions && maxPerElement && autoStart.maxInteractions)) { return; }\n\n for (let i = 0, len = scope.interactions.length; i < len; i++) {\n const interaction = scope.interactions[i];\n const otherAction = interaction.prepared.name;\n\n if (!interaction.interacting()) { continue; }\n\n activeInteractions++;\n\n if (activeInteractions >= autoStart.maxInteractions) {\n return false;\n }\n\n if (interaction.target !== interactable) { continue; }\n\n targetCount += (otherAction === action.name)|0;\n\n if (targetCount >= maxActions) {\n return false;\n }\n\n if (interaction.element === element) {\n targetElementCount++;\n\n if (otherAction !== action.name || targetElementCount >= maxPerElement) {\n return false;\n }\n }\n }\n\n return autoStart.maxInteractions > 0;\n}\n\n/*\\\n * interact.maxInteractions\n [ method ]\n **\n * Returns or sets the maximum number of concurrent interactions allowed.\n * By default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables\n * and elements, you need to enable it in the draggable, resizable and\n * gesturable `'max'` and `'maxPerElement'` options.\n **\n - newValue (number) #optional Any number. newValue <= 0 means no interactions.\n\\*/\ninteract.maxInteractions = function (newValue) {\n if (utils.is.number(newValue)) {\n autoStart.maxInteractions = newValue;\n\n return this;\n }\n\n return autoStart.maxInteractions;\n};\n\nInteractable.settingsMethods.push('styleCursor');\nInteractable.settingsMethods.push('actionChecker');\nInteractable.settingsMethods.push('ignoreFrom');\nInteractable.settingsMethods.push('allowFrom');\n\ndefaultOptions.base.actionChecker = null;\ndefaultOptions.base.styleCursor = true;\n\nutils.extend(defaultOptions.perAction, autoStart.defaults.perAction);\n\nmodule.exports = autoStart;\n","const autoStart = require('./base');\nconst Interaction = require('../Interaction');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.delayTimer = null;\n});\n\nautoStart.signals.on('prepared', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.delayTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.target, interaction.element);\n }, delay);\n }\n});\n\nInteraction.signals.on('move', function ({ interaction, duplicate }) {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.delayTimer);\n }\n});\n\n// prevent regular down->move autoStart\nautoStart.signals.on('before-start', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.prepared.name = null;\n }\n});\n","const autoStart = require('./base');\nconst scope = require('../scope');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\n\nconst { matchesSelector, parentNode } = require('../utils/domUtils');\n\nautoStart.setActionDefaults(require('../actions/drag'));\n\nautoStart.signals.on('before-start', function ({ interaction, eventTarget, dx, dy }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // check if a drag is in the correct axis\n const absX = Math.abs(dx);\n const absY = Math.abs(dy);\n const options = interaction.target.options.drag;\n const startAxis = options.startAxis;\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy');\n\n interaction.prepared.axis = options.lockAxis === 'start'\n ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n : options.lockAxis;\n\n // if the movement isn't in the startAxis of the interactable\n if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) {\n // cancel the prepared action\n interaction.prepared.name = null;\n\n // then try to get a drag from another ineractable\n\n if (!interaction.prepared.name) {\n\n let element = eventTarget;\n\n const getDraggable = function (interactable, selector, context) {\n const elements = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n if (interactable === interaction.target) { return; }\n\n if (!options.manualStart\n && !interactable.testIgnoreAllow(options, element, eventTarget)\n && matchesSelector(element, selector, elements)) {\n\n const action = interactable.getAction(interaction.downPointer,\n interaction.downEvent,\n interaction,\n element);\n\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, interactable)\n && autoStart.validateAction(action, interactable, element, eventTarget)) {\n\n return interactable;\n }\n }\n };\n\n let action = null;\n\n // check all interactables\n while (is.element(element)) {\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && elementInteractable !== interaction.target\n && !elementInteractable.options.drag.manualStart) {\n\n action = elementInteractable.getAction(interaction.downPointer, interaction.downEvent, interaction, element);\n }\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, elementInteractable)) {\n\n interaction.prepared.name = 'drag';\n interaction.target = elementInteractable;\n interaction.element = element;\n break;\n }\n\n const selectorInteractable = scope.interactables.forEachSelector(getDraggable, element);\n\n if (selectorInteractable) {\n interaction.prepared.name = 'drag';\n interaction.target = selectorInteractable;\n interaction.element = element;\n break;\n }\n\n element = parentNode(element);\n }\n }\n }\n});\n\nfunction checkStartAxis (startAxis, interactable) {\n if (!interactable) { return false; }\n\n const thisAxis = interactable.options.drag.startAxis;\n\n return (startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis);\n}\n","require('./base').setActionDefaults(require('../actions/gesture'));\n","require('./base').setActionDefaults(require('../actions/resize'));\n","module.exports = {\n base: {\n accept : null,\n preventDefault: 'auto',\n deltaSource : 'page',\n },\n\n perAction: {\n origin: { x: 0, y: 0 },\n\n // only allow left button by default\n // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n mouseButtons: 1,\n\n inertia: {\n enabled : false,\n resistance : 10, // the lambda in exponential decay\n minSpeed : 100, // target speed must be above this for inertia to start\n endSpeed : 10, // the speed at which inertia is slow enough to stop\n allowResume : true, // allow resuming an action in inertia phase\n smoothEndDuration: 300, // animate to snap/restrict endOnly if there's no inertia\n },\n },\n};\n","/* browser entry point */\n\n// Legacy browser support\nrequire('./legacyBrowsers');\n\n// inertia\nrequire('./inertia');\n\n// modifiers\nrequire('./modifiers/snap');\nrequire('./modifiers/restrict');\n\n// pointerEvents\nrequire('./pointerEvents/base');\nrequire('./pointerEvents/holdRepeat');\nrequire('./pointerEvents/interactableTargets');\n\n// delay\nrequire('./autoStart/delay');\n\n// actions\nrequire('./actions/gesture');\nrequire('./actions/resize');\nrequire('./actions/drag');\nrequire('./actions/drop');\n\n// load these modifiers after resize is loaded\nrequire('./modifiers/snapSize');\nrequire('./modifiers/restrictEdges');\nrequire('./modifiers/restrictSize');\n\n// autoStart actions\nrequire('./autoStart/gesture');\nrequire('./autoStart/resize');\nrequire('./autoStart/drag');\n\n// Interactable preventDefault setting\nrequire('./interactablePreventDefault.js');\n\n// autoScroll\nrequire('./autoScroll');\n\n// export interact\nmodule.exports = require('./interact');\n","const InteractEvent = require('./InteractEvent');\nconst Interaction = require('./Interaction');\nconst modifiers = require('./modifiers');\nconst utils = require('./utils');\nconst animationFrame = require('./utils/raf');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.inertiaStatus = {\n active : false,\n smoothEnd : false,\n allowResume: false,\n\n startEvent: null,\n upCoords : {},\n\n xe: 0, ye: 0,\n sx: 0, sy: 0,\n\n t0: 0,\n vx0: 0, vys: 0,\n duration: 0,\n\n lambda_v0: 0,\n one_ve_v0: 0,\n i : null,\n };\n\n interaction.boundInertiaFrame = () => inertiaFrame .apply(interaction);\n interaction.boundSmoothEndFrame = () => smoothEndFrame.apply(interaction);\n});\n\nInteraction.signals.on('down', function ({ interaction, event, pointer, eventTarget }) {\n const status = interaction.inertiaStatus;\n\n // Check if the down event hits the current inertia target\n if (status.active) {\n let element = eventTarget;\n\n // climb up the DOM tree from the event target\n while (utils.is.element(element)) {\n\n // if interaction element is the current inertia target element\n if (element === interaction.element) {\n // stop inertia\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n\n // update pointers to the down event's coordinates\n interaction.updatePointer(pointer);\n utils.setCoords(interaction.curCoords, interaction.pointers);\n\n // fire appropriate signals\n const signalArg = { interaction };\n Interaction.signals.fire('before-action-move', signalArg);\n Interaction.signals.fire('action-resume' , signalArg);\n\n // fire a reume event\n const resumeEvent = new InteractEvent(interaction,\n event,\n interaction.prepared.name,\n 'inertiaresume',\n interaction.element);\n\n interaction.target.fire(resumeEvent);\n interaction.prevEvent = resumeEvent;\n modifiers.resetStatuses(interaction.modifierStatuses);\n\n utils.copyCoords(interaction.prevCoords, interaction.curCoords);\n break;\n }\n\n element = utils.parentNode(element);\n }\n }\n});\n\nInteraction.signals.on('up', function ({ interaction, event }) {\n const status = interaction.inertiaStatus;\n\n if (!interaction.interacting() || status.active) { return; }\n\n const target = interaction.target;\n const options = target && target.options;\n const inertiaOptions = options && interaction.prepared.name && options[interaction.prepared.name].inertia;\n\n const now = new Date().getTime();\n const statuses = {};\n const page = utils.extend({}, interaction.curCoords.page);\n const pointerSpeed = interaction.pointerDelta.client.speed;\n\n let smoothEnd = false;\n let modifierResult;\n\n // check if inertia should be started\n const inertiaPossible = (inertiaOptions && inertiaOptions.enabled\n && interaction.prepared.name !== 'gesture'\n && event !== status.startEvent);\n\n const inertia = (inertiaPossible\n && (now - interaction.curCoords.timeStamp) < 50\n && pointerSpeed > inertiaOptions.minSpeed\n && pointerSpeed > inertiaOptions.endSpeed);\n\n const modifierArg = {\n interaction,\n pageCoords: page,\n statuses,\n preEnd: true,\n requireEndOnly: true,\n };\n\n // smoothEnd\n if (inertiaPossible && !inertia) {\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n if (modifierResult.shouldMove && modifierResult.locked) {\n smoothEnd = true;\n }\n }\n\n if (!(inertia || smoothEnd)) { return; }\n\n utils.copyCoords(status.upCoords, interaction.curCoords);\n\n interaction.pointers[0] = status.startEvent =\n new InteractEvent(interaction, event, interaction.prepared.name, 'inertiastart', interaction.element);\n\n status.t0 = now;\n\n status.active = true;\n status.allowResume = inertiaOptions.allowResume;\n interaction.simulation = status;\n\n target.fire(status.startEvent);\n\n if (inertia) {\n status.vx0 = interaction.pointerDelta.client.vx;\n status.vy0 = interaction.pointerDelta.client.vy;\n status.v0 = pointerSpeed;\n\n calcInertia(interaction, status);\n\n utils.extend(page, interaction.curCoords.page);\n\n page.x += status.xe;\n page.y += status.ye;\n\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n status.modifiedXe += modifierResult.dx;\n status.modifiedYe += modifierResult.dy;\n\n status.i = animationFrame.request(interaction.boundInertiaFrame);\n }\n else {\n status.smoothEnd = true;\n status.xe = modifierResult.dx;\n status.ye = modifierResult.dy;\n\n status.sx = status.sy = 0;\n\n status.i = animationFrame.request(interaction.boundSmoothEndFrame);\n }\n});\n\nInteraction.signals.on('stop-active', function ({ interaction }) {\n const status = interaction.inertiaStatus;\n\n if (status.active) {\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n }\n});\n\nfunction calcInertia (interaction, status) {\n const inertiaOptions = interaction.target.options[interaction.prepared.name].inertia;\n const lambda = inertiaOptions.resistance;\n const inertiaDur = -Math.log(inertiaOptions.endSpeed / status.v0) / lambda;\n\n status.x0 = interaction.prevEvent.pageX;\n status.y0 = interaction.prevEvent.pageY;\n status.t0 = status.startEvent.timeStamp / 1000;\n status.sx = status.sy = 0;\n\n status.modifiedXe = status.xe = (status.vx0 - inertiaDur) / lambda;\n status.modifiedYe = status.ye = (status.vy0 - inertiaDur) / lambda;\n status.te = inertiaDur;\n\n status.lambda_v0 = lambda / status.v0;\n status.one_ve_v0 = 1 - inertiaOptions.endSpeed / status.v0;\n}\n\nfunction inertiaFrame () {\n updateInertiaCoords(this);\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n\n const status = this.inertiaStatus;\n const options = this.target.options[this.prepared.name].inertia;\n const lambda = options.resistance;\n const t = new Date().getTime() / 1000 - status.t0;\n\n if (t < status.te) {\n\n const progress = 1 - (Math.exp(-lambda * t) - status.lambda_v0) / status.one_ve_v0;\n\n if (status.modifiedXe === status.xe && status.modifiedYe === status.ye) {\n status.sx = status.xe * progress;\n status.sy = status.ye * progress;\n }\n else {\n const quadPoint = utils.getQuadraticCurvePoint(0, 0,\n status.xe,\n status.ye,\n status.modifiedXe,\n status.modifiedYe,\n progress);\n\n status.sx = quadPoint.x;\n status.sy = quadPoint.y;\n }\n\n this.doMove();\n\n status.i = animationFrame.request(this.boundInertiaFrame);\n }\n else {\n status.sx = status.modifiedXe;\n status.sy = status.modifiedYe;\n\n this.doMove();\n this.end(status.startEvent);\n status.active = false;\n this.simulation = null;\n }\n\n utils.copyCoords(this.prevCoords, this.curCoords);\n}\n\nfunction smoothEndFrame () {\n updateInertiaCoords(this);\n\n const status = this.inertiaStatus;\n const t = new Date().getTime() - status.t0;\n const duration = this.target.options[this.prepared.name].inertia.smoothEndDuration;\n\n if (t < duration) {\n status.sx = utils.easeOutQuad(t, 0, status.xe, duration);\n status.sy = utils.easeOutQuad(t, 0, status.ye, duration);\n\n this.pointerMove(status.startEvent, status.startEvent);\n\n status.i = animationFrame.request(this.boundSmoothEndFrame);\n }\n else {\n status.sx = status.xe;\n status.sy = status.ye;\n\n this.pointerMove(status.startEvent, status.startEvent);\n this.end(status.startEvent);\n\n status.smoothEnd =\n status.active = false;\n this.simulation = null;\n }\n}\n\nfunction updateInertiaCoords (interaction) {\n const status = interaction.inertiaStatus;\n\n // return if inertia isn't running\n if (!status.active) { return; }\n\n const pageUp = status.upCoords.page;\n const clientUp = status.upCoords.client;\n\n utils.setCoords(interaction.curCoords, [ {\n pageX : pageUp.x + status.sx,\n pageY : pageUp.y + status.sy,\n clientX: clientUp.x + status.sx,\n clientY: clientUp.y + status.sy,\n } ]);\n}\n","const browser = require('./utils/browser');\nconst events = require('./utils/events');\nconst utils = require('./utils');\nconst scope = require('./scope');\nconst Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\n\nconst globalEvents = {};\n\n/*\\\n * interact\n [ method ]\n *\n * The methods of this variable can be used to set elements as\n * interactables and also to change various default settings.\n *\n * Calling it as a function and passing an element or a valid CSS selector\n * string returns an Interactable object which has various methods to\n * configure it.\n *\n - element (Element | string) The HTML or SVG Element to interact with or CSS selector\n = (object) An @Interactable\n *\n > Usage\n | interact('#draggable').draggable(true);\n |\n | var rectables = interact('rect');\n | rectables\n | .gesturable(true)\n | .on('gesturemove', function (event) {\n | // ...\n | });\n\\*/\nfunction interact (element, options) {\n let interactable = scope.interactables.get(element, options);\n\n if (!interactable) {\n interactable = new Interactable(element, options);\n interactable.events.global = globalEvents;\n }\n\n return interactable;\n}\n\n/*\\\n * interact.isSet\n [ method ]\n *\n * Check if an element has been set\n - element (Element) The Element being searched for\n = (boolean) Indicates if the element or CSS selector was previously passed to interact\n\\*/\ninteract.isSet = function (element, options) {\n return scope.interactables.indexOfElement(element, options && options.context) !== -1;\n};\n\n/*\\\n * interact.on\n [ method ]\n *\n * Adds a global listener for an InteractEvent or adds a DOM event to\n * `document`\n *\n - type (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) interact\n\\*/\ninteract.on = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.on(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.on(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n // if it is an InteractEvent type, add listener to globalEvents\n if (utils.contains(Interactable.eventTypes, type)) {\n // if this type of event was never bound\n if (!globalEvents[type]) {\n globalEvents[type] = [listener];\n }\n else {\n globalEvents[type].push(listener);\n }\n }\n // If non InteractEvent type, addEventListener to document\n else {\n events.add(scope.document, type, listener, { options });\n }\n\n return interact;\n};\n\n/*\\\n * interact.off\n [ method ]\n *\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n - type (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) interact\n \\*/\ninteract.off = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.off(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.off(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n if (!utils.contains(Interactable.eventTypes, type)) {\n events.remove(scope.document, type, listener, options);\n }\n else {\n let index;\n\n if (type in globalEvents\n && (index = utils.indexOf(globalEvents[type], listener)) !== -1) {\n globalEvents[type].splice(index, 1);\n }\n }\n\n return interact;\n};\n\n/*\\\n * interact.debug\n [ method ]\n *\n * Returns an object which exposes internal data\n = (object) An object with properties that outline the current state and expose internal functions and variables\n\\*/\ninteract.debug = function () {\n return scope;\n};\n\n// expose the functions used to calculate multi-touch properties\ninteract.getPointerAverage = utils.pointerAverage;\ninteract.getTouchBBox = utils.touchBBox;\ninteract.getTouchDistance = utils.touchDistance;\ninteract.getTouchAngle = utils.touchAngle;\n\ninteract.getElementRect = utils.getElementRect;\ninteract.getElementClientRect = utils.getElementClientRect;\ninteract.matchesSelector = utils.matchesSelector;\ninteract.closest = utils.closest;\n\n/*\\\n * interact.supportsTouch\n [ method ]\n *\n = (boolean) Whether or not the browser supports touch input\n\\*/\ninteract.supportsTouch = function () {\n return browser.supportsTouch;\n};\n\n/*\\\n * interact.supportsPointerEvent\n [ method ]\n *\n = (boolean) Whether or not the browser supports PointerEvents\n\\*/\ninteract.supportsPointerEvent = function () {\n return browser.supportsPointerEvent;\n};\n\n/*\\\n * interact.stop\n [ method ]\n *\n * Cancels all interactions (end events are not fired)\n *\n - event (Event) An event on which to call preventDefault()\n = (object) interact\n\\*/\ninteract.stop = function (event) {\n for (let i = scope.interactions.length - 1; i >= 0; i--) {\n scope.interactions[i].stop(event);\n }\n\n return interact;\n};\n\n/*\\\n * interact.pointerMoveTolerance\n [ method ]\n * Returns or sets the distance the pointer must be moved before an action\n * sequence occurs. This also affects tolerance for tap events.\n *\n - newValue (number) #optional The movement from the start position must be greater than this value\n = (number | Interactable) The current setting or interact\n\\*/\ninteract.pointerMoveTolerance = function (newValue) {\n if (utils.is.number(newValue)) {\n Interaction.pointerMoveTolerance = newValue;\n\n return this;\n }\n\n return Interaction.pointerMoveTolerance;\n};\n\ninteract.addDocument = scope.addDocument;\ninteract.removeDocument = scope.removeDocument;\n\nscope.interact = interact;\n\nmodule.exports = interact;\n","const Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\nconst scope = require('./scope');\nconst is = require('./utils/is');\nconst events = require('./utils/events');\n\nconst { nodeContains, matchesSelector } = require('./utils/domUtils');\n\n/*\\\n * Interactable.preventDefault\n [ method ]\n *\n * Returns or sets whether to prevent the browser's default behaviour\n * in response to pointer events. Can be set to:\n * - `'always'` to always prevent\n * - `'never'` to never prevent\n * - `'auto'` to let interact.js try to determine what would be best\n *\n - newValue (string) #optional `true`, `false` or `'auto'`\n = (string | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.preventDefault = function (newValue) {\n if (/^(always|never|auto)$/.test(newValue)) {\n this.options.preventDefault = newValue;\n return this;\n }\n\n if (is.bool(newValue)) {\n this.options.preventDefault = newValue? 'always' : 'never';\n return this;\n }\n\n return this.options.preventDefault;\n};\n\nInteractable.prototype.checkAndPreventDefault = function (event) {\n const setting = this.options.preventDefault;\n\n if (setting === 'never') { return; }\n\n if (setting === 'always') {\n event.preventDefault();\n return;\n }\n\n // setting === 'auto'\n\n // don't preventDefault if the browser supports passiveEvents\n // CSS touch-action and user-selecct should be used instead\n if (events.supportsOptions) {\n return;\n }\n\n // don't preventDefault of pointerdown events\n if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) {\n return;\n }\n\n // don't preventDefault on editable elements\n if (is.element(event.target)\n && matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) {\n return;\n }\n\n event.preventDefault();\n};\n\nfunction onInteractionEvent ({ interaction, event }) {\n if (interaction.target) {\n interaction.target.checkAndPreventDefault(event);\n }\n}\n\nfor (const eventSignal of ['down', 'move', 'up', 'cancel']) {\n Interaction.signals.on(eventSignal, onInteractionEvent);\n}\n\n// prevent native HTML5 drag on interact.js target elements\nInteraction.docEvents.dragstart = function preventNativeDrag (event) {\n for (const interaction of scope.interactions) {\n\n if (interaction.element\n && (interaction.element === event.target\n || nodeContains(interaction.element, event.target))) {\n\n interaction.target.checkAndPreventDefault(event);\n return;\n }\n }\n};\n","const scope = require('./scope');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst iFinder = require('./utils/interactionFinder');\nconst pointerEvents = require('./pointerEvents/base');\n\nconst { window } = require('./utils/window');\n\nconst toString = Object.prototype.toString;\n\nif (!window.Array.isArray) {\n window.Array.isArray = function (obj) {\n return toString.call(obj) === '[object Array]';\n };\n}\n\nif (!String.prototype.trim) {\n String.prototype.trim = function () {\n return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n };\n}\n\n// http://www.quirksmode.org/dom/events/click.html\n// >Events leading to dblclick\n//\n// IE8 doesn't fire down event before dblclick.\n// This workaround tries to fire a tap and doubletap after dblclick\nfunction onIE8Dblclick (event) {\n const eventTarget = event.target;\n const interaction = iFinder.search(event, event.type, eventTarget);\n\n if (!interaction) { return; }\n\n if (interaction.prevTap\n && event.clientX === interaction.prevTap.clientX\n && event.clientY === interaction.prevTap.clientY\n && eventTarget === interaction.prevTap.target) {\n\n interaction.downTargets[0] = eventTarget;\n interaction.downTimes [0] = new Date().getTime();\n\n pointerEvents.fire({\n interaction,\n event,\n eventTarget,\n pointer: event,\n type: 'tap',\n });\n }\n}\n\nif (browser.isIE8) {\n const selectFix = function (event) {\n for (const interaction of scope.interactions) {\n if (interaction.interacting()) {\n interaction.target.checkAndPreventDefault(event);\n }\n }\n };\n\n const onDocIE8 = function onDocIE8 ({ doc, win }, signalName) {\n const eventMethod = signalName.indexOf('listen') === 0\n ? events.add : events.remove;\n\n // For IE's lack of Event#preventDefault\n eventMethod(doc, 'selectstart', selectFix);\n\n if (pointerEvents) {\n eventMethod(doc, 'dblclick', onIE8Dblclick);\n }\n };\n\n scope.signals.on('add-document' , onDocIE8);\n scope.signals.on('remove-document', onDocIE8);\n}\n\nmodule.exports = null;\n","const InteractEvent = require('../InteractEvent');\nconst Interaction = require('../Interaction');\nconst extend = require('../utils/extend');\n\nconst modifiers = {\n names: [],\n\n setOffsets: function (arg) {\n const { interaction, pageCoords: page } = arg;\n const { target, element, startOffset } = interaction;\n const rect = target.getRect(element);\n\n if (rect) {\n startOffset.left = page.x - rect.left;\n startOffset.top = page.y - rect.top;\n\n startOffset.right = rect.right - page.x;\n startOffset.bottom = rect.bottom - page.y;\n\n if (!('width' in rect)) { rect.width = rect.right - rect.left; }\n if (!('height' in rect)) { rect.height = rect.bottom - rect.top ; }\n }\n else {\n startOffset.left = startOffset.top = startOffset.right = startOffset.bottom = 0;\n }\n\n arg.rect = rect;\n arg.interactable = target;\n arg.element = element;\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n\n arg.options = target.options[interaction.prepared.name][modifierName];\n\n if (!arg.options) {\n continue;\n }\n\n interaction.modifierOffsets[modifierName] = modifiers[modifierName].setOffset(arg);\n }\n },\n\n setAll: function (arg) {\n const { interaction, statuses, preEnd, requireEndOnly } = arg;\n const coords = extend({}, arg.pageCoords);\n const result = {\n dx: 0,\n dy: 0,\n changed: false,\n locked: false,\n shouldMove: true,\n };\n\n for (const modifierName of modifiers.names) {\n const modifier = modifiers[modifierName];\n const options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!shouldDo(options, preEnd, requireEndOnly)) { continue; }\n\n arg.status = arg.status = statuses[modifierName];\n arg.options = options;\n arg.offset = arg.interaction.modifierOffsets[modifierName];\n\n modifier.set(arg);\n\n if (arg.status.locked) {\n coords.x += arg.status.dx;\n coords.y += arg.status.dy;\n\n result.dx += arg.status.dx;\n result.dy += arg.status.dy;\n\n result.locked = true;\n }\n }\n\n // a move should be fired if:\n // - there are no modifiers enabled,\n // - no modifiers are \"locked\" i.e. have changed the pointer's coordinates, or\n // - the locked coords have changed since the last pointer move\n result.shouldMove = !arg.status || !result.locked || arg.status.changed;\n\n return result;\n },\n\n resetStatuses: function (statuses) {\n for (const modifierName of modifiers.names) {\n const status = statuses[modifierName] || {};\n\n status.dx = status.dy = 0;\n status.modifiedX = status.modifiedY = NaN;\n status.locked = false;\n status.changed = true;\n\n statuses[modifierName] = status;\n }\n\n return statuses;\n },\n\n start: function ({ interaction }, signalName) {\n const arg = {\n interaction,\n pageCoords: (signalName === 'action-resume' ?\n interaction.curCoords : interaction.startCoords).page,\n startOffset: interaction.startOffset,\n statuses: interaction.modifierStatuses,\n preEnd: false,\n requireEndOnly: false,\n };\n\n modifiers.setOffsets(arg);\n modifiers.resetStatuses(arg.statuses);\n\n arg.pageCoords = extend({}, interaction.startCoords.page);\n interaction.modifierResult = modifiers.setAll(arg);\n },\n};\n\nInteraction.signals.on('new', function (interaction) {\n interaction.startOffset = { left: 0, right: 0, top: 0, bottom: 0 };\n interaction.modifierOffsets = {};\n interaction.modifierStatuses = modifiers.resetStatuses({});\n interaction.modifierResult = null;\n});\n\nInteraction.signals.on('action-start' , modifiers.start);\nInteraction.signals.on('action-resume', modifiers.start);\n\nInteraction.signals.on('before-action-move', function ({ interaction, preEnd, interactingBeforeMove }) {\n const modifierResult = modifiers.setAll({\n interaction,\n preEnd,\n pageCoords: interaction.curCoords.page,\n statuses: interaction.modifierStatuses,\n requireEndOnly: false,\n });\n\n // don't fire an action move if a modifier would keep the event in the same\n // cordinates as before\n if (!modifierResult.shouldMove && interactingBeforeMove) {\n interaction._dontFireMove = true;\n }\n\n interaction.modifierResult = modifierResult;\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n for (let i = 0; i < modifiers.names.length; i++) {\n const options = interaction.target.options[interaction.prepared.name][modifiers.names[i]];\n\n // if the endOnly option is true for any modifier\n if (shouldDo(options, true, true)) {\n // fire a move event at the modified coordinates\n interaction.doMove({ event, preEnd: true });\n break;\n }\n }\n});\n\nInteractEvent.signals.on('set-xy', function (arg) {\n const { iEvent, interaction } = arg;\n const modifierArg = extend({}, arg);\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n modifierArg.options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!modifierArg.options) {\n continue;\n }\n\n const modifier = modifiers[modifierName];\n\n modifierArg.status = interaction.modifierStatuses[modifierName];\n\n iEvent[modifierName] = modifier.modifyCoords(modifierArg);\n }\n});\n\nfunction shouldDo (options, preEnd, requireEndOnly) {\n return (options && options.enabled\n && (preEnd || !options.endOnly)\n && (!requireEndOnly || options.endOnly));\n}\n\nmodule.exports = modifiers;\n","const modifiers = require('./index');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst restrict = {\n defaults: {\n enabled : false,\n endOnly : false,\n restriction: null,\n elementRect: null,\n },\n\n setOffset: function ({ rect, startOffset, options }) {\n const elementRect = options && options.elementRect;\n const offset = {};\n\n if (rect && elementRect) {\n offset.left = startOffset.left - (rect.width * elementRect.left);\n offset.top = startOffset.top - (rect.height * elementRect.top);\n\n offset.right = startOffset.right - (rect.width * (1 - elementRect.right));\n offset.bottom = startOffset.bottom - (rect.height * (1 - elementRect.bottom));\n }\n else {\n offset.left = offset.top = offset.right = offset.bottom = 0;\n }\n\n return offset;\n },\n\n set: function ({ pageCoords, interaction, status, options }) {\n if (!options) { return status; }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n\n const restriction = getRestrictionRect(options.restriction, interaction, page);\n\n if (!restriction) { return status; }\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n const rect = restriction;\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n const offset = interaction.modifierOffsets.restrict;\n\n // object is assumed to have\n // x, y, width, height or\n // left, top, right, bottom\n if ('x' in restriction && 'y' in restriction) {\n modifiedX = Math.max(Math.min(rect.x + rect.width - offset.right , page.x), rect.x + offset.left);\n modifiedY = Math.max(Math.min(rect.y + rect.height - offset.bottom, page.y), rect.y + offset.top );\n }\n else {\n modifiedX = Math.max(Math.min(rect.right - offset.right , page.x), rect.left + offset.left);\n modifiedY = Math.max(Math.min(rect.bottom - offset.bottom, page.y), rect.top + offset.top );\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const elementRect = options && options.elementRect;\n\n if (options && options.enabled\n && !(phase === 'start' && elementRect && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n getRestrictionRect,\n};\n\nfunction getRestrictionRect (value, interaction, page) {\n if (utils.is.function(value)) {\n return utils.resolveRectLike(value, interaction.target, interaction.element, [page.x, page.y, interaction]);\n } else {\n return utils.resolveRectLike(value, interaction.target, interaction.element);\n }\n}\n\nmodifiers.restrict = restrict;\nmodifiers.names.push('restrict');\n\ndefaultOptions.perAction.restrict = restrict.defaults;\n\nmodule.exports = restrict;\n","// This module adds the options.resize.restrictEdges setting which sets min and\n// max for the top, left, bottom and right edges of the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictEdges: {\n// inner: { top: 200, left: 200, right: 400, bottom: 400 },\n// outer: { top: 0, left: 0, right: 600, bottom: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst { getRestrictionRect } = require('./restrict');\n\nconst noInner = { top: +Infinity, left: +Infinity, bottom: -Infinity, right: -Infinity };\nconst noOuter = { top: -Infinity, left: -Infinity, bottom: +Infinity, right: +Infinity };\n\nconst restrictEdges = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n offset: null,\n },\n\n setOffset: function ({ interaction, startOffset, options }) {\n if (!options) {\n return utils.extend({}, startOffset);\n }\n\n const offset = getRestrictionRect(options.offset, interaction, interaction.startCoords.page);\n\n if (offset) {\n return {\n top: startOffset.top + offset.y,\n left: startOffset.left + offset.x,\n bottom: startOffset.bottom + offset.y,\n right: startOffset.right + offset.x,\n };\n }\n\n return startOffset;\n },\n\n set: function ({ pageCoords, interaction, status, offset, options }) {\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n const inner = rectUtils.xywhToTlbr(getRestrictionRect(options.inner, interaction, page)) || noInner;\n const outer = rectUtils.xywhToTlbr(getRestrictionRect(options.outer, interaction, page)) || noOuter;\n\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n if (edges.top) {\n modifiedY = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top);\n }\n else if (edges.bottom) {\n modifiedY = Math.max(Math.min(outer.bottom - offset.bottom, page.y), inner.bottom - offset.bottom);\n }\n if (edges.left) {\n modifiedX = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left);\n }\n else if (edges.right) {\n modifiedX = Math.max(Math.min(outer.right - offset.right, page.x), inner.right - offset.right);\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n if (options && options.enabled\n && !(phase === 'start' && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n noInner,\n noOuter,\n getRestrictionRect,\n};\n\nmodifiers.restrictEdges = restrictEdges;\nmodifiers.names.push('restrictEdges');\n\ndefaultOptions.perAction.restrictEdges = restrictEdges.defaults;\nresize.defaults.restrictEdges = restrictEdges.defaults;\n\nmodule.exports = restrictEdges;\n","// This module adds the options.resize.restrictSize setting which sets min and\n// max width and height for the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictSize: {\n// min: { width: -600, height: -600 },\n// max: { width: 600, height: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst restrictEdges = require('./restrictEdges');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst noMin = { width: -Infinity, height: -Infinity };\nconst noMax = { width: +Infinity, height: +Infinity };\n\nconst restrictSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n },\n\n setOffset: function ({ interaction }) {\n return interaction.startOffset;\n },\n\n set: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const rect = rectUtils.xywhToTlbr(interaction.resizeRects.inverted);\n\n const minSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.min, interaction)) || noMin;\n const maxSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.max, interaction)) || noMax;\n\n arg.options = {\n enabled: options.enabled,\n endOnly: options.endOnly,\n inner: utils.extend({}, restrictEdges.noInner),\n outer: utils.extend({}, restrictEdges.noOuter),\n };\n\n if (edges.top) {\n arg.options.inner.top = rect.bottom - minSize.height;\n arg.options.outer.top = rect.bottom - maxSize.height;\n }\n else if (edges.bottom) {\n arg.options.inner.bottom = rect.top + minSize.height;\n arg.options.outer.bottom = rect.top + maxSize.height;\n }\n if (edges.left) {\n arg.options.inner.left = rect.right - minSize.width;\n arg.options.outer.left = rect.right - maxSize.width;\n }\n else if (edges.right) {\n arg.options.inner.right = rect.left + minSize.width;\n arg.options.outer.right = rect.left + maxSize.width;\n }\n\n restrictEdges.set(arg);\n },\n\n modifyCoords: restrictEdges.modifyCoords,\n};\n\nmodifiers.restrictSize = restrictSize;\nmodifiers.names.push('restrictSize');\n\ndefaultOptions.perAction.restrictSize = restrictSize.defaults;\nresize.defaults.restrictSize = restrictSize.defaults;\n\nmodule.exports = restrictSize;\n","const modifiers = require('./index');\nconst interact = require('../interact');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst snap = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n\n relativePoints: null,\n },\n\n setOffset: function ({ interaction, interactable, element, rect, startOffset, options }) {\n const offsets = [];\n const optionsOrigin = utils.rectToXY(utils.resolveRectLike(options.origin));\n const origin = optionsOrigin || utils.getOriginXY(interactable, element, interaction.prepared.name);\n options = options || interactable.options[interaction.prepared.name].snap || {};\n\n let snapOffset;\n\n if (options.offset === 'startCoords') {\n snapOffset = {\n x: interaction.startCoords.page.x - origin.x,\n y: interaction.startCoords.page.y - origin.y,\n };\n }\n else {\n const offsetRect = utils.resolveRectLike(options.offset, interactable, element, [interaction]);\n\n snapOffset = utils.rectToXY(offsetRect) || { x: 0, y: 0 };\n }\n\n if (rect && options.relativePoints && options.relativePoints.length) {\n for (const { x: relativeX, y: relativeY } of options.relativePoints) {\n offsets.push({\n x: startOffset.left - (rect.width * relativeX) + snapOffset.x,\n y: startOffset.top - (rect.height * relativeY) + snapOffset.y,\n });\n }\n }\n else {\n offsets.push(snapOffset);\n }\n\n return offsets;\n },\n\n set: function ({ interaction, pageCoords, status, options, offset: offsets }) {\n const targets = [];\n let target;\n let page;\n let i;\n\n if (status.useStatusXY) {\n page = { x: status.x, y: status.y };\n }\n else {\n const origin = utils.getOriginXY(interaction.target, interaction.element, interaction.prepared.name);\n\n page = utils.extend({}, pageCoords);\n\n page.x -= origin.x;\n page.y -= origin.y;\n }\n\n status.realX = page.x;\n status.realY = page.y;\n\n let len = options.targets? options.targets.length : 0;\n\n for (const { x: offsetX, y: offsetY } of offsets) {\n const relativeX = page.x - offsetX;\n const relativeY = page.y - offsetY;\n\n for (const snapTarget of options.targets) {\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n targets.push({\n x: utils.is.number(target.x) ? (target.x + offsetX) : relativeX,\n y: utils.is.number(target.y) ? (target.y + offsetY) : relativeY,\n\n range: utils.is.number(target.range)? target.range: options.range,\n });\n }\n }\n\n const closest = {\n target: null,\n inRange: false,\n distance: 0,\n range: 0,\n dx: 0,\n dy: 0,\n };\n\n for (i = 0, len = targets.length; i < len; i++) {\n target = targets[i];\n\n const range = target.range;\n const dx = target.x - page.x;\n const dy = target.y - page.y;\n const distance = utils.hypot(dx, dy);\n let inRange = distance <= range;\n\n // Infinite targets count as being out of range\n // compared to non infinite ones that are in range\n if (range === Infinity && closest.inRange && closest.range !== Infinity) {\n inRange = false;\n }\n\n if (!closest.target || (inRange\n // is the closest target in range?\n ? (closest.inRange && range !== Infinity\n // the pointer is relatively deeper in this target\n ? distance / range < closest.distance / closest.range\n // this target has Infinite range and the closest doesn't\n : (range === Infinity && closest.range !== Infinity)\n // OR this target is closer that the previous closest\n || distance < closest.distance)\n // The other is not in range and the pointer is closer to this target\n : (!closest.inRange && distance < closest.distance))) {\n\n closest.target = target;\n closest.distance = distance;\n closest.range = range;\n closest.inRange = inRange;\n closest.dx = dx;\n closest.dy = dy;\n\n status.range = range;\n }\n }\n\n let snapChanged;\n\n if (closest.target) {\n snapChanged = (status.modifiedX !== closest.target.x || status.modifiedY !== closest.target.y);\n\n status.modifiedX = closest.target.x;\n status.modifiedY = closest.target.y;\n }\n else {\n snapChanged = true;\n\n status.modifiedX = NaN;\n status.modifiedY = NaN;\n }\n\n status.dx = closest.dx;\n status.dy = closest.dy;\n\n status.changed = (snapChanged || (closest.inRange && !status.locked));\n status.locked = closest.inRange;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const relativePoints = options && options.relativePoints;\n\n if (options && options.enabled\n && !(phase === 'start' && relativePoints && relativePoints.length)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n }\n\n return {\n range : status.range,\n locked : status.locked,\n x : status.modifiedX,\n y : status.modifiedY,\n realX : status.realX,\n realY : status.realY,\n dx : status.dx,\n dy : status.dy,\n };\n }\n },\n};\n\ninteract.createSnapGrid = function (grid) {\n return function (x, y) {\n const limits = grid.limits || {\n left : -Infinity,\n right : Infinity,\n top : -Infinity,\n bottom: Infinity,\n };\n let offsetX = 0;\n let offsetY = 0;\n\n if (utils.is.object(grid.offset)) {\n offsetX = grid.offset.x;\n offsetY = grid.offset.y;\n }\n\n const gridx = Math.round((x - offsetX) / grid.x);\n const gridy = Math.round((y - offsetY) / grid.y);\n\n const newX = Math.max(limits.left, Math.min(limits.right , gridx * grid.x + offsetX));\n const newY = Math.max(limits.top , Math.min(limits.bottom, gridy * grid.y + offsetY));\n\n return {\n x: newX,\n y: newY,\n range: grid.range,\n };\n };\n};\n\nmodifiers.snap = snap;\nmodifiers.names.push('snap');\n\ndefaultOptions.perAction.snap = snap.defaults;\n\nmodule.exports = snap;\n","// This module allows snapping of the size of targets during resize\n// interactions.\n\nconst modifiers = require('./index');\nconst snap = require('./snap');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\nconst utils = require('../utils/');\n\nconst snapSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n },\n\n setOffset: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.edges;\n\n if (!edges) { return; }\n\n arg.options = {\n relativePoints: [{\n x: edges.left? 0 : 1,\n y: edges.top ? 0 : 1,\n }],\n origin: { x: 0, y: 0 },\n offset: 'self',\n range: options.range,\n };\n\n const offsets = snap.setOffset(arg);\n arg.options = options;\n\n return offsets;\n },\n\n set: function (arg) {\n const { interaction, options, offset, pageCoords } = arg;\n const page = utils.extend({}, pageCoords);\n const relativeX = page.x - offset[0].x;\n const relativeY = page.y - offset[0].y;\n\n arg.options = utils.extend({}, options);\n arg.options.targets = [];\n\n for (const snapTarget of options.targets) {\n let target;\n\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n if ('width' in target && 'height' in target) {\n target.x = target.width;\n target.y = target.height;\n }\n\n arg.options.targets.push(target);\n }\n\n snap.set(arg);\n },\n\n modifyCoords: function (arg) {\n const { options } = arg;\n\n arg.options = utils.extend({}, options);\n arg.options.enabled = options.enabled;\n arg.options.relativePoints = [null];\n\n snap.modifyCoords(arg);\n },\n};\n\nmodifiers.snapSize = snapSize;\nmodifiers.names.push('snapSize');\n\ndefaultOptions.perAction.snapSize = snapSize.defaults;\nresize.defaults.snapSize = snapSize.defaults;\n\nmodule.exports = snapSize;\n","const pointerUtils = require('../utils/pointerUtils');\n\nmodule.exports = class PointerEvent {\n constructor (type, pointer, event, eventTarget, interaction) {\n pointerUtils.pointerExtend(this, event);\n\n if (event !== pointer) {\n pointerUtils.pointerExtend(this, pointer);\n }\n\n this.interaction = interaction;\n\n this.timeStamp = new Date().getTime();\n this.originalEvent = event;\n this.type = type;\n this.pointerId = pointerUtils.getPointerId(pointer);\n this.pointerType = pointerUtils.getPointerType(pointer);\n this.target = eventTarget;\n this.currentTarget = null;\n\n if (type === 'tap') {\n const pointerIndex = interaction.getPointerIndex(pointer);\n this.dt = this.timeStamp - interaction.downTimes[pointerIndex];\n\n const interval = this.timeStamp - interaction.tapTime;\n\n this.double = !!(interaction.prevTap\n && interaction.prevTap.type !== 'doubletap'\n && interaction.prevTap.target === this.target\n && interval < 500);\n }\n else if (type === 'doubletap') {\n this.dt = pointer.timeStamp - interaction.tapTime;\n }\n }\n\n subtractOrigin ({ x: originX, y: originY }) {\n this.pageX -= originX;\n this.pageY -= originY;\n this.clientX -= originX;\n this.clientY -= originY;\n\n return this;\n }\n\n addOrigin ({ x: originX, y: originY }) {\n this.pageX += originX;\n this.pageY += originY;\n this.clientX += originX;\n this.clientY += originY;\n\n return this;\n }\n\n preventDefault () {\n this.originalEvent.preventDefault();\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n};\n","const PointerEvent = require('./PointerEvent');\nconst Interaction = require('../Interaction');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst defaults = require('../defaultOptions');\nconst signals = require('../utils/Signals').new();\nconst { filter } = require('../utils/arr');\n\nconst simpleSignals = [ 'down', 'up', 'cancel' ];\nconst simpleEvents = [ 'down', 'up', 'cancel' ];\n\nconst pointerEvents = {\n PointerEvent,\n fire,\n collectEventTargets,\n signals,\n defaults: {\n holdDuration: 600,\n ignoreFrom : null,\n allowFrom : null,\n origin : { x: 0, y: 0 },\n },\n types: [\n 'down',\n 'move',\n 'up',\n 'cancel',\n 'tap',\n 'doubletap',\n 'hold',\n ],\n};\n\nfunction fire (arg) {\n const {\n interaction, pointer, event, eventTarget,\n type = arg.pointerEvent.type,\n targets = collectEventTargets(arg),\n pointerEvent = new PointerEvent(type, pointer, event, eventTarget, interaction),\n } = arg;\n\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n targets,\n type,\n pointerEvent,\n };\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n\n for (const prop in target.props || {}) {\n pointerEvent[prop] = target.props[prop];\n }\n\n const origin = utils.getOriginXY(target.eventable, target.element);\n\n pointerEvent.subtractOrigin(origin);\n pointerEvent.eventable = target.eventable;\n pointerEvent.currentTarget = target.element;\n\n target.eventable.fire(pointerEvent);\n\n pointerEvent.addOrigin(origin);\n\n if (pointerEvent.immediatePropagationStopped\n || (pointerEvent.propagationStopped\n && (i + 1) < targets.length && targets[i + 1].element !== pointerEvent.currentTarget)) {\n break;\n }\n }\n\n signals.fire('fired', signalArg);\n\n if (type === 'tap') {\n // if pointerEvent should make a double tap, create and fire a doubletap\n // PointerEvent and use that as the prevTap\n const prevTap = pointerEvent.double\n ? fire({\n interaction, pointer, event, eventTarget,\n type: 'doubletap',\n })\n : pointerEvent;\n\n interaction.prevTap = prevTap;\n interaction.tapTime = prevTap.timeStamp;\n }\n\n return pointerEvent;\n}\n\nfunction collectEventTargets ({ interaction, pointer, event, eventTarget, type }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n // do not fire a tap event if the pointer was moved before being lifted\n if (type === 'tap' && (interaction.pointerWasMoved\n // or if the pointerup target is different to the pointerdown target\n || !(interaction.downTargets[pointerIndex] && interaction.downTargets[pointerIndex] === eventTarget))) {\n return [];\n }\n\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n path,\n targets: [],\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (type === 'hold') {\n signalArg.targets = filter(signalArg.targets, target =>\n target.eventable.options.holdDuration === interaction.holdTimers[pointerIndex].duration);\n }\n\n return signalArg.targets;\n}\n\nInteraction.signals.on('update-pointer-down', function ({ interaction, pointerIndex }) {\n interaction.holdTimers[pointerIndex] = { duration: Infinity, timeout: null };\n});\n\nInteraction.signals.on('remove-pointer', function ({ interaction, pointerIndex }) {\n interaction.holdTimers.splice(pointerIndex, 1);\n});\n\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget, duplicateMove }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n if (!duplicateMove && (!interaction.pointerIsDown || interaction.pointerWasMoved)) {\n if (interaction.pointerIsDown) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n\n fire({\n interaction, pointer, event, eventTarget,\n type: 'move',\n });\n }\n});\n\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget, pointerIndex }) {\n // copy event to be used in timeout for IE8\n const eventCopy = browser.isIE8? utils.extend({}, event) : event;\n\n const timer = interaction.holdTimers[pointerIndex];\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'hold',\n targets: [],\n path,\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (!signalArg.targets.length) { return; }\n\n let minDuration = Infinity;\n\n for (let i = 0; i < signalArg.targets.length; i++) {\n const target = signalArg.targets[i];\n const holdDuration = target.eventable.options.holdDuration;\n\n if (holdDuration < minDuration) {\n minDuration = holdDuration;\n }\n }\n\n timer.duration = minDuration;\n timer.timeout = setTimeout(function () {\n fire({\n interaction,\n eventTarget,\n pointer: browser.isIE8? eventCopy : pointer,\n event: eventCopy,\n type: 'hold',\n });\n }, minDuration);\n});\n\nInteraction.signals.on('up', ({ interaction, pointer, event, eventTarget }) => {\n if (!interaction.pointerWasMoved) {\n fire({ interaction, eventTarget, pointer, event, type: 'tap' });\n }\n});\n\n['up', 'cancel'].forEach(function (signalName) {\n Interaction.signals.on(signalName, function ({ interaction, pointerIndex }) {\n if (interaction.holdTimers[pointerIndex]) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n });\n});\n\nfunction createSignalListener (type) {\n return function ({ interaction, pointer, event, eventTarget }) {\n fire({ interaction, eventTarget, pointer, event, type });\n };\n}\n\nfor (let i = 0; i < simpleSignals.length; i++) {\n Interaction.signals.on(simpleSignals[i], createSignalListener(simpleEvents[i]));\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.prevTap = null; // the most recent tap event on this interaction\n interaction.tapTime = 0; // time of the most recent tap event\n interaction.holdTimers = []; // [{ duration, timeout }]\n});\n\ndefaults.pointerEvents = pointerEvents.defaults;\nmodule.exports = pointerEvents;\n","const pointerEvents = require('./base');\nconst Interaction = require('../Interaction');\n\npointerEvents.signals.on('new', onNew);\npointerEvents.signals.on('fired', onFired);\n\nfor (const signal of ['move', 'up', 'cancel', 'endall']) {\n Interaction.signals.on(signal, endHoldRepeat);\n}\n\nfunction onNew ({ pointerEvent }) {\n if (pointerEvent.type !== 'hold') { return; }\n\n pointerEvent.count = (pointerEvent.count || 0) + 1;\n}\n\nfunction onFired ({ interaction, pointerEvent, eventTarget, targets }) {\n if (pointerEvent.type !== 'hold' || !targets.length) { return; }\n\n // get the repeat interval from the first eventable\n const interval = targets[0].eventable.options.holdRepeatInterval;\n\n // don't repeat if the interval is 0 or less\n if (interval <= 0) { return; }\n\n // set a timeout to fire the holdrepeat event\n interaction.holdIntervalHandle = setTimeout(function () {\n pointerEvents.fire({\n interaction,\n eventTarget,\n type: 'hold',\n pointer: pointerEvent,\n event: pointerEvent,\n });\n }, interval);\n}\n\nfunction endHoldRepeat ({ interaction }) {\n // set the interaction's holdStopTime property\n // to stop further holdRepeat events\n if (interaction.holdIntervalHandle) {\n clearInterval(interaction.holdIntervalHandle);\n interaction.holdIntervalHandle = null;\n }\n}\n\n// don't repeat by default\npointerEvents.defaults.holdRepeatInterval = 0;\npointerEvents.types.push('holdrepeat');\n\nmodule.exports = {\n onNew,\n onFired,\n endHoldRepeat,\n};\n","const pointerEvents = require('./base');\nconst Interactable = require('../Interactable');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\nconst scope = require('../scope');\nconst extend = require('../utils/extend');\nconst { merge } = require('../utils/arr');\n\npointerEvents.signals.on('collect-targets', function ({ targets, element, type, eventTarget }) {\n function collectSelectors (interactable, selector, context) {\n const els = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && is.element(element)\n && domUtils.matchesSelector(element, selector, els)\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n const interactable = scope.interactables.get(element);\n\n if (interactable) {\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n scope.interactables.forEachSelector(collectSelectors, element);\n});\n\nInteractable.signals.on('new', function ({ interactable }) {\n interactable.events.getRect = function (element) {\n return interactable.getRect(element);\n };\n});\n\nInteractable.signals.on('set', function ({ interactable, options }) {\n extend(interactable.events.options, pointerEvents.defaults);\n extend(interactable.events.options, options);\n});\n\nmerge(Interactable.eventTypes, pointerEvents.types);\n\nInteractable.prototype.pointerEvents = function (options) {\n extend(this.events.options, options);\n\n return this;\n};\n\nconst __backCompatOption = Interactable.prototype._backCompatOption;\n\nInteractable.prototype._backCompatOption = function (optionName, newValue) {\n const ret = __backCompatOption.call(this, optionName, newValue);\n\n if (ret === this) {\n this.events.options[optionName] = newValue;\n }\n\n return ret;\n};\n\nInteractable.settingsMethods.push('pointerEvents');\n","const utils = require('./utils');\nconst events = require('./utils/events');\nconst signals = require('./utils/Signals').new();\n\nconst scope = {\n signals,\n events,\n utils,\n\n // main document\n document: require('./utils/domObjects').document,\n // all documents being listened to\n documents: [],\n\n addDocument: function (doc, win) {\n // do nothing if document is already known\n if (utils.contains(scope.documents, doc)) { return false; }\n\n win = win || scope.getWindow(doc);\n\n scope.documents.push(doc);\n events.documents.push(doc);\n\n // don't add an unload event for the main document\n // so that the page may be cached in browser history\n if (doc !== scope.document) {\n events.add(win, 'unload', scope.onWindowUnload);\n }\n\n signals.fire('add-document', { doc, win });\n },\n\n removeDocument: function (doc, win) {\n const index = utils.indexOf(scope.documents, doc);\n\n win = win || scope.getWindow(doc);\n\n events.remove(win, 'unload', scope.onWindowUnload);\n\n scope.documents.splice(index, 1);\n events.documents.splice(index, 1);\n\n signals.fire('remove-document', { win, doc });\n },\n\n onWindowUnload: function () {\n scope.removeDocument(this.document, this);\n },\n};\n\nmodule.exports = scope;\n","const { indexOf } = require('./arr');\n\nclass Signals {\n constructor () {\n this.listeners = {\n // signalName: [listeners],\n };\n }\n\n on (name, listener) {\n if (!this.listeners[name]) {\n this.listeners[name] = [listener];\n return;\n }\n\n this.listeners[name].push(listener);\n }\n\n off (name, listener) {\n if (!this.listeners[name]) { return; }\n\n const index = indexOf(this.listeners[name], listener);\n\n if (index !== -1) {\n this.listeners[name].splice(index, 1);\n }\n }\n\n fire (name, arg) {\n const targetListeners = this.listeners[name];\n\n if (!targetListeners) { return; }\n\n for (let i = 0; i < targetListeners.length; i++) {\n if (targetListeners[i](arg, name) === false) {\n return;\n }\n }\n }\n}\n\nSignals.new = function () {\n return new Signals();\n};\n\nmodule.exports = Signals;\n","function indexOf (array, target) {\n for (let i = 0, len = array.length; i < len; i++) {\n if (array[i] === target) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction contains (array, target) {\n return indexOf(array, target) !== -1;\n}\n\nfunction merge (target, source) {\n for (let i = 0; i < source.length; i++) {\n target.push(source[i]);\n }\n\n return target;\n}\n\nfunction filter (array, test) {\n const result = [];\n\n for (let i = 0; i < array.length; i++) {\n if (test(array[i])) {\n result.push(array[i]);\n }\n }\n\n return result;\n}\n\nmodule.exports = {\n indexOf,\n contains,\n merge,\n filter,\n};\n","const { window } = require('./window');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst Element = domObjects.Element;\nconst navigator = window.navigator;\n\nconst browser = {\n // Does the browser support touch input?\n supportsTouch: !!(('ontouchstart' in window) || is.function(window.DocumentTouch)\n && domObjects.document instanceof window.DocumentTouch),\n\n // Does the browser support PointerEvents\n supportsPointerEvent: !!domObjects.PointerEvent,\n\n isIE8: ('attachEvent' in window) && !('addEventListener' in window),\n\n // Opera Mobile must be handled differently\n isOperaMobile: (navigator.appName === 'Opera'\n && browser.supportsTouch\n && navigator.userAgent.match('Presto')),\n\n // scrolling doesn't change the result of getClientRects on iOS 7\n isIOS7: (/iP(hone|od|ad)/.test(navigator.platform)\n && /OS 7[^\\d]/.test(navigator.appVersion)),\n\n isIe9OrOlder: /MSIE (8|9)/.test(navigator.userAgent),\n\n // prefix matchesSelector\n prefixedMatchesSelector: 'matches' in Element.prototype\n ? 'matches': 'webkitMatchesSelector' in Element.prototype\n ? 'webkitMatchesSelector': 'mozMatchesSelector' in Element.prototype\n ? 'mozMatchesSelector': 'oMatchesSelector' in Element.prototype\n ? 'oMatchesSelector': 'msMatchesSelector',\n\n useMatchesSelectorPolyfill: false,\n\n pEventTypes: (domObjects.PointerEvent\n ? (domObjects.PointerEvent === window.MSPointerEvent\n ? {\n up: 'MSPointerUp',\n down: 'MSPointerDown',\n over: 'mouseover',\n out: 'mouseout',\n move: 'MSPointerMove',\n cancel: 'MSPointerCancel',\n }\n : {\n up: 'pointerup',\n down: 'pointerdown',\n over: 'pointerover',\n out: 'pointerout',\n move: 'pointermove',\n cancel: 'pointercancel',\n })\n : null),\n\n // because Webkit and Opera still use 'mousewheel' event type\n wheelEvent: 'onmousewheel' in domObjects.document? 'mousewheel': 'wheel',\n\n};\n\nbrowser.useMatchesSelectorPolyfill = !is.function(Element.prototype[browser.prefixedMatchesSelector]);\n\nmodule.exports = browser;\n","const domObjects = {};\nconst win = require('./window').window;\n\nfunction blank () {}\n\ndomObjects.document = win.document;\ndomObjects.DocumentFragment = win.DocumentFragment || blank;\ndomObjects.SVGElement = win.SVGElement || blank;\ndomObjects.SVGSVGElement = win.SVGSVGElement || blank;\ndomObjects.SVGElementInstance = win.SVGElementInstance || blank;\ndomObjects.Element = win.Element || blank;\ndomObjects.HTMLElement = win.HTMLElement || domObjects.Element;\n\ndomObjects.Event = win.Event;\ndomObjects.Touch = win.Touch || blank;\ndomObjects.PointerEvent = (win.PointerEvent || win.MSPointerEvent);\n\nmodule.exports = domObjects;\n","const win = require('./window');\nconst browser = require('./browser');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst domUtils = {\n nodeContains: function (parent, child) {\n while (child) {\n if (child === parent) {\n return true;\n }\n\n child = child.parentNode;\n }\n\n return false;\n },\n\n closest: function (element, selector) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) { return element; }\n\n element = domUtils.parentNode(element);\n }\n\n return null;\n },\n\n parentNode: function (node) {\n let parent = node.parentNode;\n\n if (is.docFrag(parent)) {\n // skip past #shado-root fragments\n while ((parent = parent.host) && is.docFrag(parent)) {\n continue;\n }\n\n return parent;\n }\n\n return parent;\n },\n\n // taken from http://tanalin.com/en/blog/2012/12/matches-selector-ie8/ and modified\n matchesSelectorPolyfill: browser.useMatchesSelectorPolyfill\n ? function (element, selector, elems) {\n elems = elems || element.parentNode.querySelectorAll(selector);\n\n for (let i = 0, len = elems.length; i < len; i++) {\n if (elems[i] === element) {\n return true;\n }\n }\n\n return false;\n }\n : null,\n\n matchesSelector: function (element, selector, nodeList) {\n if (browser.useMatchesSelectorPolyfill) {\n return domUtils.matchesSelectorPolyfill(element, selector, nodeList);\n }\n\n // remove /deep/ from selectors if shadowDOM polyfill is used\n if (win.window !== win.realWindow) {\n selector = selector.replace(/\\/deep\\//g, ' ');\n }\n\n return element[browser.prefixedMatchesSelector](selector);\n },\n\n // Test for the element that's \"above\" all other qualifiers\n indexOfDeepestElement: function (elements) {\n let deepestZoneParents = [];\n let dropzoneParents = [];\n let dropzone;\n let deepestZone = elements[0];\n let index = deepestZone? 0: -1;\n let parent;\n let child;\n let i;\n let n;\n\n for (i = 1; i < elements.length; i++) {\n dropzone = elements[i];\n\n // an element might belong to multiple selector dropzones\n if (!dropzone || dropzone === deepestZone) {\n continue;\n }\n\n if (!deepestZone) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n // check if the deepest or current are document.documentElement or document.rootElement\n // - if the current dropzone is, do nothing and continue\n if (dropzone.parentNode === dropzone.ownerDocument) {\n continue;\n }\n // - if deepest is, update with the current dropzone and continue to next\n else if (deepestZone.parentNode === dropzone.ownerDocument) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n if (!deepestZoneParents.length) {\n parent = deepestZone;\n while (parent.parentNode && parent.parentNode !== parent.ownerDocument) {\n deepestZoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n }\n\n // if this element is an svg element and the current deepest is\n // an HTMLElement\n if (deepestZone instanceof domObjects.HTMLElement\n && dropzone instanceof domObjects.SVGElement\n && !(dropzone instanceof domObjects.SVGSVGElement)) {\n\n if (dropzone === deepestZone.parentNode) {\n continue;\n }\n\n parent = dropzone.ownerSVGElement;\n }\n else {\n parent = dropzone;\n }\n\n dropzoneParents = [];\n\n while (parent.parentNode !== parent.ownerDocument) {\n dropzoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n\n n = 0;\n\n // get (position of last common ancestor) + 1\n while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) {\n n++;\n }\n\n const parents = [\n dropzoneParents[n - 1],\n dropzoneParents[n],\n deepestZoneParents[n],\n ];\n\n child = parents[0].lastChild;\n\n while (child) {\n if (child === parents[1]) {\n deepestZone = dropzone;\n index = i;\n deepestZoneParents = [];\n\n break;\n }\n else if (child === parents[2]) {\n break;\n }\n\n child = child.previousSibling;\n }\n }\n\n return index;\n },\n\n matchesUpTo: function (element, selector, limit) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) {\n return true;\n }\n\n element = domUtils.parentNode(element);\n\n if (element === limit) {\n return domUtils.matchesSelector(element, selector);\n }\n }\n\n return false;\n },\n\n getActualElement: function (element) {\n return (element instanceof domObjects.SVGElementInstance\n ? element.correspondingUseElement\n : element);\n },\n\n getScrollXY: function (relevantWindow) {\n relevantWindow = relevantWindow || win.window;\n return {\n x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft,\n y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop,\n };\n },\n\n getElementClientRect: function (element) {\n const clientRect = (element instanceof domObjects.SVGElement\n ? element.getBoundingClientRect()\n : element.getClientRects()[0]);\n\n return clientRect && {\n left : clientRect.left,\n right : clientRect.right,\n top : clientRect.top,\n bottom: clientRect.bottom,\n width : clientRect.width || clientRect.right - clientRect.left,\n height: clientRect.height || clientRect.bottom - clientRect.top,\n };\n },\n\n getElementRect: function (element) {\n const clientRect = domUtils.getElementClientRect(element);\n\n if (!browser.isIOS7 && clientRect) {\n const scroll = domUtils.getScrollXY(win.getWindow(element));\n\n clientRect.left += scroll.x;\n clientRect.right += scroll.x;\n clientRect.top += scroll.y;\n clientRect.bottom += scroll.y;\n }\n\n return clientRect;\n },\n\n getPath: function (element) {\n const path = [];\n\n while (element) {\n path.push(element);\n element = domUtils.parentNode(element);\n }\n\n return path;\n },\n\n trySelector: value => {\n if (!is.string(value)) { return false; }\n\n // an exception will be raised if it is invalid\n domObjects.document.querySelector(value);\n return true;\n },\n};\n\nmodule.exports = domUtils;\n","const is = require('./is');\nconst domUtils = require('./domUtils');\nconst pExtend = require('./pointerExtend');\n\nconst { window, getWindow } = require('./window');\nconst { indexOf, contains } = require('./arr');\n\nconst useAttachEvent = ('attachEvent' in window) && !('addEventListener' in window);\nconst addEvent = useAttachEvent? 'attachEvent': 'addEventListener';\nconst removeEvent = useAttachEvent? 'detachEvent': 'removeEventListener';\nconst on = useAttachEvent? 'on': '';\n\nconst elements = [];\nconst targets = [];\nconst attachedListeners = [];\n\n// {\n// type: {\n// selectors: ['selector', ...],\n// contexts : [document, ...],\n// listeners: [[listener, capture, passive], ...]\n// }\n// }\nconst delegatedEvents = {};\n\nconst documents = [];\n\nconst supportsOptions = !useAttachEvent && (() => {\n let supported = false;\n\n window.document.createElement('div').addEventListener('test', null, {\n get capture () { supported = true; },\n });\n\n return supported;\n})();\n\nfunction add (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n let elementIndex = indexOf(elements, element);\n let target = targets[elementIndex];\n\n if (!target) {\n target = {\n events: {},\n typeCount: 0,\n };\n\n elementIndex = elements.push(element) - 1;\n targets.push(target);\n\n attachedListeners.push(useAttachEvent\n ? {\n supplied: [],\n wrapped : [],\n useCount: [],\n }\n : null);\n }\n\n if (!target.events[type]) {\n target.events[type] = [];\n target.typeCount++;\n }\n\n if (!contains(target.events[type], listener)) {\n let ret;\n\n if (useAttachEvent) {\n const { supplied, wrapped, useCount } = attachedListeners[elementIndex];\n const listenerIndex = indexOf(supplied, listener);\n\n const wrappedListener = wrapped[listenerIndex] || function (event) {\n if (!event.immediatePropagationStopped) {\n event.target = event.srcElement;\n event.currentTarget = element;\n\n event.preventDefault = event.preventDefault || preventDef;\n event.stopPropagation = event.stopPropagation || stopProp;\n event.stopImmediatePropagation = event.stopImmediatePropagation || stopImmProp;\n\n if (/mouse|click/.test(event.type)) {\n event.pageX = event.clientX + getWindow(element).document.documentElement.scrollLeft;\n event.pageY = event.clientY + getWindow(element).document.documentElement.scrollTop;\n }\n\n listener(event);\n }\n };\n\n ret = element[addEvent](on + type, wrappedListener, !!options.capture);\n\n if (listenerIndex === -1) {\n supplied.push(listener);\n wrapped.push(wrappedListener);\n useCount.push(1);\n }\n else {\n useCount[listenerIndex]++;\n }\n }\n else {\n ret = element[addEvent](type, listener, supportsOptions? options : !!options.capture);\n }\n target.events[type].push(listener);\n\n return ret;\n }\n}\n\nfunction remove (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const elementIndex = indexOf(elements, element);\n const target = targets[elementIndex];\n\n if (!target || !target.events) {\n return;\n }\n\n let wrappedListener = listener;\n let listeners;\n let listenerIndex;\n\n if (useAttachEvent) {\n listeners = attachedListeners[elementIndex];\n listenerIndex = indexOf(listeners.supplied, listener);\n wrappedListener = listeners.wrapped[listenerIndex];\n }\n\n if (type === 'all') {\n for (type in target.events) {\n if (target.events.hasOwnProperty(type)) {\n remove(element, type, 'all');\n }\n }\n return;\n }\n\n if (target.events[type]) {\n const len = target.events[type].length;\n\n if (listener === 'all') {\n for (let i = 0; i < len; i++) {\n remove(element, type, target.events[type][i], options);\n }\n return;\n }\n else {\n for (let i = 0; i < len; i++) {\n if (target.events[type][i] === listener) {\n element[removeEvent](on + type, wrappedListener, supportsOptions? options : !!options.capture);\n target.events[type].splice(i, 1);\n\n if (useAttachEvent && listeners) {\n listeners.useCount[listenerIndex]--;\n if (listeners.useCount[listenerIndex] === 0) {\n listeners.supplied.splice(listenerIndex, 1);\n listeners.wrapped.splice(listenerIndex, 1);\n listeners.useCount.splice(listenerIndex, 1);\n }\n }\n\n break;\n }\n }\n }\n\n if (target.events[type] && target.events[type].length === 0) {\n target.events[type] = null;\n target.typeCount--;\n }\n }\n\n if (!target.typeCount) {\n targets.splice(elementIndex, 1);\n elements.splice(elementIndex, 1);\n attachedListeners.splice(elementIndex, 1);\n }\n}\n\nfunction addDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n if (!delegatedEvents[type]) {\n delegatedEvents[type] = {\n selectors: [],\n contexts : [],\n listeners: [],\n };\n\n // add delegate listener functions\n for (let i = 0; i < documents.length; i++) {\n add(documents[i], type, delegateListener);\n add(documents[i], type, delegateUseCapture, true);\n }\n }\n\n const delegated = delegatedEvents[type];\n let index;\n\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n break;\n }\n }\n\n if (index === -1) {\n index = delegated.selectors.length;\n\n delegated.selectors.push(selector);\n delegated.contexts .push(context);\n delegated.listeners.push([]);\n }\n\n // keep listener and capture and passive flags\n delegated.listeners[index].push([listener, !!options.capture, options.passive]);\n}\n\nfunction removeDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const delegated = delegatedEvents[type];\n let matchFound = false;\n let index;\n\n if (!delegated) { return; }\n\n // count from last index of delegated to 0\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n // look for matching selector and context Node\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n\n const listeners = delegated.listeners[index];\n\n // each item of the listeners array is an array: [function, capture, passive]\n for (let i = listeners.length - 1; i >= 0; i--) {\n const [fn, capture, passive] = listeners[i];\n\n // check if the listener functions and capture and passive flags match\n if (fn === listener && capture === !!options.capture && passive === options.passive) {\n // remove the listener from the array of listeners\n listeners.splice(i, 1);\n\n // if all listeners for this interactable have been removed\n // remove the interactable from the delegated arrays\n if (!listeners.length) {\n delegated.selectors.splice(index, 1);\n delegated.contexts .splice(index, 1);\n delegated.listeners.splice(index, 1);\n\n // remove delegate function from context\n remove(context, type, delegateListener);\n remove(context, type, delegateUseCapture, true);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegatedEvents[type] = null;\n }\n }\n\n // only remove one listener\n matchFound = true;\n break;\n }\n }\n\n if (matchFound) { break; }\n }\n }\n}\n\n// bound to the interactable context when a DOM event\n// listener is added to a selector interactable\nfunction delegateListener (event, optionalArg) {\n const options = getOptions(optionalArg);\n const fakeEvent = {};\n const delegated = delegatedEvents[event.type];\n const eventTarget = (domUtils.getActualElement(event.path\n ? event.path[0]\n : event.target));\n let element = eventTarget;\n\n // duplicate the event so that currentTarget can be changed\n pExtend(fakeEvent, event);\n\n fakeEvent.originalEvent = event;\n fakeEvent.preventDefault = preventOriginalDefault;\n\n // climb up document tree looking for selector matches\n while (is.element(element)) {\n for (let i = 0; i < delegated.selectors.length; i++) {\n const selector = delegated.selectors[i];\n const context = delegated.contexts[i];\n\n if (domUtils.matchesSelector(element, selector)\n && domUtils.nodeContains(context, eventTarget)\n && domUtils.nodeContains(context, element)) {\n\n const listeners = delegated.listeners[i];\n\n fakeEvent.currentTarget = element;\n\n for (let j = 0; j < listeners.length; j++) {\n const [fn, capture, passive] = listeners[j];\n\n if (capture === !!options.capture && passive === options.passive) {\n fn(fakeEvent);\n }\n }\n }\n }\n\n element = domUtils.parentNode(element);\n }\n}\n\nfunction delegateUseCapture (event) {\n return delegateListener.call(this, event, true);\n}\n\nfunction preventDef () {\n this.returnValue = false;\n}\n\nfunction preventOriginalDefault () {\n this.originalEvent.preventDefault();\n}\n\nfunction stopProp () {\n this.cancelBubble = true;\n}\n\nfunction stopImmProp () {\n this.cancelBubble = true;\n this.immediatePropagationStopped = true;\n}\n\nfunction getOptions (param) {\n return is.object(param)? param : { capture: param };\n}\n\nmodule.exports = {\n add,\n remove,\n\n addDelegate,\n removeDelegate,\n\n delegateListener,\n delegateUseCapture,\n delegatedEvents,\n documents,\n\n useAttachEvent,\n supportsOptions,\n\n _elements: elements,\n _targets: targets,\n _attachedListeners: attachedListeners,\n};\n","module.exports = function extend (dest, source) {\n for (const prop in source) {\n dest[prop] = source[prop];\n }\n return dest;\n};\n","const {\n resolveRectLike,\n rectToXY,\n} = require('./rect');\n\nmodule.exports = function (target, element, action) {\n const actionOptions = target.options[action];\n const actionOrigin = actionOptions && actionOptions.origin;\n const origin = actionOrigin || target.options.origin;\n\n const originRect = resolveRectLike(origin, target, element, [target && element]);\n\n return rectToXY(originRect) || { x: 0, y: 0 };\n};\n","module.exports = (x, y) => Math.sqrt(x * x + y * y);\n","const extend = require('./extend');\nconst win = require('./window');\n\nconst utils = {\n warnOnce: function (method, message) {\n let warned = false;\n\n return function () {\n if (!warned) {\n win.window.console.warn(message);\n warned = true;\n }\n\n return method.apply(this, arguments);\n };\n },\n\n // http://stackoverflow.com/a/5634528/2280888\n _getQBezierValue: function (t, p1, p2, p3) {\n const iT = 1 - t;\n return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3;\n },\n\n getQuadraticCurvePoint: function (startX, startY, cpX, cpY, endX, endY, position) {\n return {\n x: utils._getQBezierValue(position, startX, cpX, endX),\n y: utils._getQBezierValue(position, startY, cpY, endY),\n };\n },\n\n // http://gizma.com/easing/\n easeOutQuad: function (t, b, c, d) {\n t /= d;\n return -c * t*(t-2) + b;\n },\n\n copyAction: function (dest, src) {\n dest.name = src.name;\n dest.axis = src.axis;\n dest.edges = src.edges;\n\n return dest;\n },\n\n is : require('./is'),\n extend : extend,\n hypot : require('./hypot'),\n getOriginXY: require('./getOriginXY'),\n};\n\nextend(utils, require('./arr'));\nextend(utils, require('./domUtils'));\nextend(utils, require('./pointerUtils'));\nextend(utils, require('./rect'));\n\nmodule.exports = utils;\n","const scope = require('../scope');\nconst utils = require('./index');\n\nconst finder = {\n methodOrder: [ 'simulationResume', 'mouseOrPen', 'hasPointer', 'idle' ],\n\n search: function (pointer, eventType, eventTarget) {\n const pointerType = utils.getPointerType(pointer);\n const pointerId = utils.getPointerId(pointer);\n const details = { pointer, pointerId, pointerType, eventType, eventTarget };\n\n for (const method of finder.methodOrder) {\n const interaction = finder[method](details);\n\n if (interaction) {\n return interaction;\n }\n }\n },\n\n // try to resume simulation with a new pointer\n simulationResume: function ({ pointerType, eventType, eventTarget }) {\n if (!/down|start/i.test(eventType)) {\n return null;\n }\n\n for (const interaction of scope.interactions) {\n let element = eventTarget;\n\n if (interaction.simulation && interaction.simulation.allowResume\n && (interaction.pointerType === pointerType)) {\n while (element) {\n // if the element is the interaction element\n if (element === interaction.element) {\n return interaction;\n }\n element = utils.parentNode(element);\n }\n }\n }\n\n return null;\n },\n\n // if it's a mouse or pen interaction\n mouseOrPen: function ({ pointerId, pointerType, eventType }) {\n if (pointerType !== 'mouse' && pointerType !== 'pen') {\n return null;\n }\n\n let firstNonActive;\n\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType) {\n // if it's a down event, skip interactions with running simulations\n if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; }\n\n // if the interaction is active, return it immediately\n if (interaction.interacting()) {\n return interaction;\n }\n // otherwise save it and look for another active interaction\n else if (!firstNonActive) {\n firstNonActive = interaction;\n }\n }\n }\n\n // if no active mouse interaction was found use the first inactive mouse\n // interaction\n if (firstNonActive) {\n return firstNonActive;\n }\n\n // find any mouse or pen interaction.\n // ignore the interaction if the eventType is a *down, and a simulation\n // is active\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType && !(/down/i.test(eventType) && interaction.simulation)) {\n return interaction;\n }\n }\n\n return null;\n },\n\n // get interaction that has this pointer\n hasPointer: function ({ pointerId }) {\n for (const interaction of scope.interactions) {\n if (utils.contains(interaction.pointerIds, pointerId)) {\n return interaction;\n }\n }\n },\n\n // get first idle interaction with a matching pointerType\n idle: function ({ pointerType }) {\n for (const interaction of scope.interactions) {\n // if there's already a pointer held down\n if (interaction.pointerIds.length === 1) {\n const target = interaction.target;\n // don't add this pointer if there is a target interactable and it\n // isn't gesturable\n if (target && !target.options.gesture.enabled) {\n continue;\n }\n }\n // maximum of 2 pointers per interaction\n else if (interaction.pointerIds.length >= 2) {\n continue;\n }\n\n if (!interaction.interacting() && (pointerType === interaction.pointerType)) {\n return interaction;\n }\n }\n\n return null;\n },\n};\n\nmodule.exports = finder;\n","const win = require('./window');\nconst isWindow = require('./isWindow');\n\nconst is = {\n array : () => {},\n\n window : thing => thing === win.window || isWindow(thing),\n\n docFrag : thing => is.object(thing) && thing.nodeType === 11,\n\n object : thing => !!thing && (typeof thing === 'object'),\n\n function: thing => typeof thing === 'function',\n\n number : thing => typeof thing === 'number' ,\n\n bool : thing => typeof thing === 'boolean' ,\n\n string : thing => typeof thing === 'string' ,\n\n element: thing => {\n if (!thing || (typeof thing !== 'object')) { return false; }\n\n const _window = win.getWindow(thing) || win.window;\n\n return (/object|function/.test(typeof _window.Element)\n ? thing instanceof _window.Element //DOM2\n : thing.nodeType === 1 && typeof thing.nodeName === 'string');\n },\n};\n\nis.array = thing => (is.object(thing)\n && (typeof thing.length !== 'undefined')\n && is.function(thing.splice));\n\nmodule.exports = is;\n","module.exports = (thing) => !!(thing && thing.Window) && (thing instanceof thing.Window);\n","function pointerExtend (dest, source) {\n for (const prop in source) {\n const prefixedPropREs = module.exports.prefixedPropREs;\n let deprecated = false;\n\n // skip deprecated prefixed properties\n for (const vendor in prefixedPropREs) {\n if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) {\n deprecated = true;\n break;\n }\n }\n\n if (!deprecated && typeof source[prop] !== 'function') {\n dest[prop] = source[prop];\n }\n }\n return dest;\n}\n\npointerExtend.prefixedPropREs = {\n webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/,\n};\n\nmodule.exports = pointerExtend;\n","const hypot = require('./hypot');\nconst browser = require('./browser');\nconst dom = require('./domObjects');\nconst domUtils = require('./domUtils');\nconst domObjects = require('./domObjects');\nconst is = require('./is');\nconst pointerExtend = require('./pointerExtend');\n\nconst pointerUtils = {\n copyCoords: function (dest, src) {\n dest.page = dest.page || {};\n dest.page.x = src.page.x;\n dest.page.y = src.page.y;\n\n dest.client = dest.client || {};\n dest.client.x = src.client.x;\n dest.client.y = src.client.y;\n\n dest.timeStamp = src.timeStamp;\n },\n\n setCoordDeltas: function (targetObj, prev, cur) {\n targetObj.page.x = cur.page.x - prev.page.x;\n targetObj.page.y = cur.page.y - prev.page.y;\n targetObj.client.x = cur.client.x - prev.client.x;\n targetObj.client.y = cur.client.y - prev.client.y;\n targetObj.timeStamp = cur.timeStamp - prev.timeStamp;\n\n // set pointer velocity\n const dt = Math.max(targetObj.timeStamp / 1000, 0.001);\n\n targetObj.page.speed = hypot(targetObj.page.x, targetObj.page.y) / dt;\n targetObj.page.vx = targetObj.page.x / dt;\n targetObj.page.vy = targetObj.page.y / dt;\n\n targetObj.client.speed = hypot(targetObj.client.x, targetObj.page.y) / dt;\n targetObj.client.vx = targetObj.client.x / dt;\n targetObj.client.vy = targetObj.client.y / dt;\n },\n\n isNativePointer: function (pointer) {\n return (pointer instanceof dom.Event || pointer instanceof dom.Touch);\n },\n\n // Get specified X/Y coords for mouse or event.touches[0]\n getXY: function (type, pointer, xy) {\n xy = xy || {};\n type = type || 'page';\n\n xy.x = pointer[type + 'X'];\n xy.y = pointer[type + 'Y'];\n\n return xy;\n },\n\n getPageXY: function (pointer, page) {\n page = page || {};\n\n // Opera Mobile handles the viewport and scrolling oddly\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n pointerUtils.getXY('screen', pointer, page);\n\n page.x += window.scrollX;\n page.y += window.scrollY;\n }\n else {\n pointerUtils.getXY('page', pointer, page);\n }\n\n return page;\n },\n\n getClientXY: function (pointer, client) {\n client = client || {};\n\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n // Opera Mobile handles the viewport and scrolling oddly\n pointerUtils.getXY('screen', pointer, client);\n }\n else {\n pointerUtils.getXY('client', pointer, client);\n }\n\n return client;\n },\n\n getPointerId: function (pointer) {\n return is.number(pointer.pointerId)? pointer.pointerId : pointer.identifier;\n },\n\n setCoords: function (targetObj, pointers, timeStamp) {\n const pointer = (pointers.length > 1\n ? pointerUtils.pointerAverage(pointers)\n : pointers[0]);\n\n const tmpXY = {};\n\n pointerUtils.getPageXY(pointer, tmpXY);\n targetObj.page.x = tmpXY.x;\n targetObj.page.y = tmpXY.y;\n\n pointerUtils.getClientXY(pointer, tmpXY);\n targetObj.client.x = tmpXY.x;\n targetObj.client.y = tmpXY.y;\n\n targetObj.timeStamp = is.number(timeStamp) ? timeStamp :new Date().getTime();\n },\n\n pointerExtend: pointerExtend,\n\n getTouchPair: function (event) {\n const touches = [];\n\n // array of touches is supplied\n if (is.array(event)) {\n touches[0] = event[0];\n touches[1] = event[1];\n }\n // an event\n else {\n if (event.type === 'touchend') {\n if (event.touches.length === 1) {\n touches[0] = event.touches[0];\n touches[1] = event.changedTouches[0];\n }\n else if (event.touches.length === 0) {\n touches[0] = event.changedTouches[0];\n touches[1] = event.changedTouches[1];\n }\n }\n else {\n touches[0] = event.touches[0];\n touches[1] = event.touches[1];\n }\n }\n\n return touches;\n },\n\n pointerAverage: function (pointers) {\n const average = {\n pageX : 0,\n pageY : 0,\n clientX: 0,\n clientY: 0,\n screenX: 0,\n screenY: 0,\n };\n\n for (const pointer of pointers) {\n for (const prop in average) {\n average[prop] += pointer[prop];\n }\n }\n for (const prop in average) {\n average[prop] /= pointers.length;\n }\n\n return average;\n },\n\n touchBBox: function (event) {\n if (!event.length && !(event.touches && event.touches.length > 1)) {\n return;\n }\n\n const touches = pointerUtils.getTouchPair(event);\n const minX = Math.min(touches[0].pageX, touches[1].pageX);\n const minY = Math.min(touches[0].pageY, touches[1].pageY);\n const maxX = Math.max(touches[0].pageX, touches[1].pageX);\n const maxY = Math.max(touches[0].pageY, touches[1].pageY);\n\n return {\n x: minX,\n y: minY,\n left: minX,\n top: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n },\n\n touchDistance: function (event, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n\n\n const dx = touches[0][sourceX] - touches[1][sourceX];\n const dy = touches[0][sourceY] - touches[1][sourceY];\n\n return hypot(dx, dy);\n },\n\n touchAngle: function (event, prevAngle, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n const dx = touches[1][sourceX] - touches[0][sourceX];\n const dy = touches[1][sourceY] - touches[0][sourceY];\n const angle = 180 * Math.atan2(dy , dx) / Math.PI;\n\n return angle;\n },\n\n getPointerType: function (pointer) {\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : is.number(pointer.pointerType)\n ? [undefined, undefined,'touch', 'pen', 'mouse'][pointer.pointerType]\n // if the PointerEvent API isn't available, then the \"pointer\" must\n // be either a MouseEvent, TouchEvent, or Touch object\n : /touch/.test(pointer.type) || pointer instanceof domObjects.Touch\n ? 'touch'\n : 'mouse';\n },\n\n // [ event.target, event.currentTarget ]\n getEventTargets: function (event) {\n return [\n domUtils.getActualElement(event.path ? event.path[0] : event.target),\n domUtils.getActualElement(event.currentTarget),\n ];\n },\n};\n\nmodule.exports = pointerUtils;\n","const { window } = require('./window');\n\nconst vendors = ['ms', 'moz', 'webkit', 'o'];\nlet lastTime = 0;\nlet request;\nlet cancel;\n\nfor (let x = 0; x < vendors.length && !window.requestAnimationFrame; x++) {\n request = window[vendors[x] + 'RequestAnimationFrame'];\n cancel = window[vendors[x] +'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n}\n\nif (!request) {\n request = function (callback) {\n const currTime = new Date().getTime();\n const timeToCall = Math.max(0, 16 - (currTime - lastTime));\n const id = setTimeout(function () { callback(currTime + timeToCall); },\n timeToCall);\n\n lastTime = currTime + timeToCall;\n return id;\n };\n}\n\nif (!cancel) {\n cancel = function (id) {\n clearTimeout(id);\n };\n}\n\nmodule.exports = {\n request,\n cancel,\n};\n","const extend = require('./extend');\nconst is = require('./is');\nconst {\n closest,\n parentNode,\n getElementRect,\n} = require('./domUtils');\n\nconst rectUtils = {\n getStringOptionResult: function (value, interactable, element) {\n if (!is.string(value)) {\n return null;\n }\n\n if (value === 'parent') {\n value = parentNode(element);\n }\n else if (value === 'self') {\n value = interactable.getRect(element);\n }\n else {\n value = closest(element, value);\n }\n\n return value;\n },\n\n resolveRectLike: function (value, interactable, element, functionArgs) {\n value = rectUtils.getStringOptionResult(value, interactable, element) || value;\n\n if (is.function(value)) {\n value = value.apply(null, functionArgs);\n }\n\n if (is.element(value)) {\n value = getElementRect(value);\n }\n\n return value;\n },\n\n rectToXY: function (rect) {\n return rect && {\n x: 'x' in rect ? rect.x : rect.left,\n y: 'y' in rect ? rect.y : rect.top,\n };\n },\n\n xywhToTlbr: function (rect) {\n if (rect && !('left' in rect && 'top' in rect)) {\n rect = extend({}, rect);\n\n rect.left = rect.x || 0;\n rect.top = rect.y || 0;\n rect.right = rect.right || (rect.left + rect.width);\n rect.bottom = rect.bottom || (rect.top + rect.height);\n }\n\n return rect;\n },\n\n tlbrToXywh: function (rect) {\n if (rect && !('x' in rect && 'y' in rect)) {\n rect = extend({}, rect);\n\n rect.x = rect.left || 0;\n rect.top = rect.top || 0;\n rect.width = rect.width || (rect.right - rect.x);\n rect.height = rect.height || (rect.bottom - rect.y);\n }\n\n return rect;\n },\n};\n\nmodule.exports = rectUtils;\n","const win = module.exports;\nconst isWindow = require('./isWindow');\n\nfunction init (window) {\n // get wrapped window if using Shadow DOM polyfill\n\n win.realWindow = window;\n\n // create a TextNode\n const el = window.document.createTextNode('');\n\n // check if it's wrapped by a polyfill\n if (el.ownerDocument !== window.document\n && typeof window.wrap === 'function'\n && window.wrap(el) === el) {\n // use wrapped window\n window = window.wrap(window);\n }\n\n win.window = window;\n}\n\nif (typeof window === 'undefined') {\n win.window = undefined;\n win.realWindow = undefined;\n}\nelse {\n init(window);\n}\n\nwin.getWindow = function getWindow (node) {\n if (isWindow(node)) {\n return node;\n }\n\n const rootNode = (node.ownerDocument || node);\n\n return rootNode.defaultView || rootNode.parentWindow || win.window;\n};\n\nwin.init = init;\n"]} \ No newline at end of file diff --git a/dist/interact.min.js b/dist/interact.min.js index c0bb2476c..2d1f0fb62 100644 --- a/dist/interact.min.js +++ b/dist/interact.min.js @@ -1,6 +1,6 @@ -/* interact.js v1.3.0-alpha.3+sha.9595c40 | https://raw.github.com/taye/interact.js/master/LICENSE */ -!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var t;t="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,t.interact=e()}}(function(){return function e(t,n,r){function i(s,a){if(!n[s]){if(!t[s]){var l="function"==typeof require&&require;if(!a&&l)return l(s,!0);if(o)return o(s,!0);var c=new Error("Cannot find module '"+s+"'");throw c.code="MODULE_NOT_FOUND",c}var p=n[s]={exports:{}};t[s][0].call(p.exports,function(e){var n=t[s][1][e];return i(n||e)},p,p.exports,e,t,n,r)}return n[s].exports}for(var o="function"==typeof require&&require,s=0;s6&&void 0!==arguments[6]&&arguments[6];r(this,e);var f=t.target,v=(f&&f.options||s).deltaSource,g=o(f,p,l),h="start"===c,m="end"===c,y=h?t.startCoords:t.curCoords,x=t.prevEvent;p=p||t.element;var b=i({},y.page),w=i({},y.client);b.x-=g.x,b.y-=g.y,w.x-=g.x,w.y-=g.y,this.ctrlKey=n.ctrlKey,this.altKey=n.altKey,this.shiftKey=n.shiftKey,this.metaKey=n.metaKey,this.button=n.button,this.buttons=n.buttons,this.target=p,this.currentTarget=p,this.relatedTarget=u||null,this.preEnd=d,this.type=l+(c||""),this.interaction=t,this.interactable=f,this.t0=h?t.downTimes[t.downTimes.length-1]:x.t0;var E={interaction:t,event:n,action:l,phase:c,element:p,related:u,page:b,client:w,coords:y,starting:h,ending:m,deltaSource:v,iEvent:this};a.fire("set-xy",E),m?(this.pageX=x.pageX,this.pageY=x.pageY,this.clientX=x.clientX,this.clientY=x.clientY):(this.pageX=b.x,this.pageY=b.y,this.clientX=w.x,this.clientY=w.y),this.x0=t.startCoords.page.x-g.x,this.y0=t.startCoords.page.y-g.y,this.clientX0=t.startCoords.client.x-g.x,this.clientY0=t.startCoords.client.y-g.y,a.fire("set-delta",E),this.timeStamp=y.timeStamp,this.dt=t.pointerDelta.timeStamp,this.duration=this.timeStamp-this.t0,this.speed=t.pointerDelta[v].speed,this.velocityX=t.pointerDelta[v].vx,this.velocityY=t.pointerDelta[v].vy,this.swipe=m||"inertiastart"===c?this.getSwipe():null,a.fire("new",E)}return e.prototype.getSwipe=function(){var e=this.interaction;if(e.prevEvent.speed<600||this.timeStamp-e.prevEvent.timeStamp>150)return null;var t=180*Math.atan2(e.prevEvent.velocityY,e.prevEvent.velocityX)/Math.PI;t<0&&(t+=360);var n=112.5<=t&&t<247.5,r=202.5<=t&&t<337.5,i=!n&&(292.5<=t||t<67.5);return{up:r,down:!r&&22.5<=t&&t<157.5,left:n,right:i,angle:t,speed:e.prevEvent.speed,velocity:{x:e.prevEvent.velocityX,y:e.prevEvent.velocityY}}},e.prototype.preventDefault=function(){},e.prototype.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},e.prototype.stopPropagation=function(){this.propagationStopped=!0},e}();a.on("set-delta",function(e){var t=e.iEvent,n=e.interaction,r=e.starting,i=e.deltaSource,o=r?t:n.prevEvent;"client"===i?(t.dx=t.clientX-o.clientX,t.dy=t.clientY-o.clientY):(t.dx=t.pageX-o.pageX,t.dy=t.pageY-o.pageY)}),l.signals=a,t.exports=l},{"./defaultOptions":18,"./utils/Signals":35,"./utils/extend":41,"./utils/getOriginXY":42}],4:[function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=e("./utils/is"),o=e("./utils/events"),s=e("./utils/extend"),a=e("./actions/base"),l=e("./scope"),c=e("./Eventable"),p=e("./defaultOptions"),u=e("./utils/Signals").new(),d=e("./utils/domUtils"),f=d.getElementRect,v=d.nodeContains,g=d.trySelector,h=e("./utils/window"),m=h.getWindow,y=e("./utils/arr"),x=y.indexOf,b=y.contains,w=e("./utils/browser"),E=w.wheelEvent;l.interactables=[];var S=function(){function e(t,n){r(this,e),n=n||{},this.target=t,this.events=new c,this._context=n.context||l.document,this._win=m(g(t)?this._context:t),this._doc=this._win.document,u.fire("new",{target:t,options:n,interactable:this,win:this._win}),l.addDocument(this._doc,this._win),l.interactables.push(this),this.set(n)}return e.prototype.setOnEvents=function(e,t){var n="on"+e;return i.function(t.onstart)&&(this.events[n+"start"]=t.onstart),i.function(t.onmove)&&(this.events[n+"move"]=t.onmove),i.function(t.onend)&&(this.events[n+"end"]=t.onend),i.function(t.oninertiastart)&&(this.events[n+"inertiastart"]=t.oninertiastart),this},e.prototype.setPerAction=function(e,t){for(var n in t)n in p[e]&&(i.object(t[n])?(this.options[e][n]=s(this.options[e][n]||{},t[n]),i.object(p.perAction[n])&&"enabled"in p.perAction[n]&&(this.options[e][n].enabled=!1!==t[n].enabled)):i.bool(t[n])&&i.object(p.perAction[n])?this.options[e][n].enabled=t[n]:void 0!==t[n]&&(this.options[e][n]=t[n]))},e.prototype.getRect=function(e){return e=e||this.target,i.string(this.target)&&!i.element(e)&&(e=this._context.querySelector(this.target)),f(e)},e.prototype.rectChecker=function(e){return i.function(e)?(this.getRect=e,this):null===e?(delete this.options.getRect,this):this.getRect},e.prototype._backCompatOption=function(e,t){if(g(t)||i.object(t)){this.options[e]=t;for(var n=a.names,r=Array.isArray(n),o=0,n=r?n:n[Symbol.iterator]();;){var s;if(r){if(o>=n.length)break;s=n[o++]}else{if(o=n.next(),o.done)break;s=o.value}var l=s;this.options[l][e]=t}return this}return this.options[e]},e.prototype.origin=function(e){return this._backCompatOption("origin",e)},e.prototype.deltaSource=function(e){return"page"===e||"client"===e?(this.options.deltaSource=e,this):this.options.deltaSource},e.prototype.context=function(){return this._context},e.prototype.inContext=function(e){return this._context===e.ownerDocument||v(this._context,e)},e.prototype.fire=function(e){return this.events.fire(e),this},e.prototype._onOffMultiple=function(e,t,n,r){if(i.string(t)&&-1!==t.search(" ")&&(t=t.trim().split(/ +/)),i.array(t)){for(var o=0;o=l.length)break;f=l[d++]}else{if(d=l.next(),d.done)break;f=d.value}var v=f;this.options[v]=p.base[v],v in t&&this[v](t[v])}return u.fire("set",{options:t,interactable:this}),this},e.prototype.unset=function(){if(o.remove(this.target,"all"),i.string(this.target))for(var e in o.delegatedEvents){var t=o.delegatedEvents[e];t.selectors[0]===this.target&&t.contexts[0]===this._context&&(t.selectors.splice(0,1),t.contexts.splice(0,1),t.listeners.splice(0,1),t.selectors.length||(t[e]=null)),o.remove(this._context,e,o.delegateListener),o.remove(this._context,e,o.delegateUseCapture,!0)}else o.remove(this,"all");u.fire("unset",{interactable:this}),l.interactables.splice(x(l.interactables,this),1);for(var n=l.interactions||[],r=Array.isArray(n),s=0,n=r?n:n[Symbol.iterator]();;){var a;if(r){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var c=a;c.target===this&&c.interacting()&&c.stop()}return l.interact},e}();l.interactables.indexOfElement=function(e,t){t=t||l.document;for(var n=0;n=y.length)break;w=y[b++]}else{if(b=y.next(),b.done)break;w=b.value}var E=w,S=E[0],T=E[1];T._updateEventTargets(r,i),T[e](S,t,r,i)}}}function o(e){for(var t=0;te.pointerMoveTolerance);var a={pointer:t,pointerIndex:this.getPointerIndex(t),event:n,eventTarget:r,dx:o,dy:s,duplicate:i,interaction:this,interactingBeforeMove:this.interacting()};i||l.setCoordDeltas(this.pointerDelta,this.prevCoords,this.curCoords),d.fire("move",a),i||(this.interacting()&&this.doMove(a),this.pointerWasMoved&&l.copyCoords(this.prevCoords,this.curCoords))},e.prototype.doMove=function(e){e=l.extend({pointer:this.pointers[0],event:this.prevEvent,eventTarget:this._eventTarget,interaction:this},e||{}),d.fire("before-action-move",e),this._dontFireMove||d.fire("action-move",e),this._dontFireMove=!1},e.prototype.pointerUp=function(e,t,n,r){var i=this.getPointerIndex(e);d.fire(/cancel$/i.test(t.type)?"cancel":"up",{pointer:e,pointerIndex:i,event:t,eventTarget:n,curEventTarget:r,interaction:this}),this.simulation||this.end(t),this.pointerIsDown=!1,this.removePointer(e,t)},e.prototype.end=function(e){e=e||this.prevEvent,this.interacting()&&d.fire("action-end",{event:e,interaction:this}),this.stop()},e.prototype.currentAction=function(){return this._interacting?this.prepared.name:null},e.prototype.interacting=function(){return this._interacting},e.prototype.stop=function(){d.fire("stop",{interaction:this}),this._interacting&&(d.fire("stop-active",{interaction:this}),d.fire("stop-"+this.prepared.name,{interaction:this})),this.target=this.element=null,this._interacting=!1,this.prepared.name=this.prevEvent=null},e.prototype.getPointerIndex=function(e){return l.indexOf(this.pointerIds,l.getPointerId(e))},e.prototype.updatePointer=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:t&&/(down|start)$/i.test(t.type),r=l.getPointerId(e),i=this.getPointerIndex(e);return-1===i&&(i=this.pointerIds.length,this.pointerIds[i]=r),n&&d.fire("update-pointer-down",{pointer:e,event:t,down:n,pointerId:r,pointerIndex:i,interaction:this}),this.pointers[i]=e,i},e.prototype.removePointer=function(e,t){var n=l.getPointerId(e),r=this.mouse?0:l.indexOf(this.pointerIds,n);-1!==r&&(d.fire("remove-pointer",{pointer:e,event:t,pointerIndex:r,interaction:this}),this.pointers.splice(r,1),this.pointerIds.splice(r,1),this.downTargets.splice(r,1),this.downTimes.splice(r,1))},e.prototype._updateEventTargets=function(e,t){this._eventTarget=e,this._curEventTarget=t},e}(),m=0,y=v.length;m=i.length)break;a=i[s++]}else{if(s=i.next(),s.done)break;a=s.value}var l=a;if(l.options.drop.enabled){var c=l.options.drop.accept;if(!(p.is.element(c)&&c!==t||p.is.string(c)&&!p.matchesSelector(t,c)))for(var d=p.is.string(l.target)?l._context.querySelectorAll(l.target):[l.target],f=0;fo.left&&c.xo.top&&c.y=o.left&&v<=o.right&&g>=o.top&&g<=o.bottom}if(f&&p.is.number(a)){s=Math.max(0,Math.min(o.right,f.right)-Math.max(o.left,f.left))*Math.max(0,Math.min(o.bottom,f.bottom)-Math.max(o.top,f.top))/(f.width*f.height)>=a}return this.options.drop.checker&&(s=this.options.drop.checker(e,t,s,this,i,n,r)),s},v.signals.on("unset",function(e){e.interactable.dropzone(!1)}),v.settingsMethods.push("dropChecker"),g.signals.on("new",function(e){e.dropTarget=null,e.dropElement=null,e.prevDropTarget=null,e.prevDropElement=null,e.dropEvents=null,e.activeDrops={dropzones:[],elements:[],rects:[]}}),g.signals.on("stop",function(e){var t=e.interaction;t.dropTarget=t.dropElement=t.prevDropTarget=t.prevDropElement=null}),d.dynamicDrop=function(e){return p.is.bool(e)?(y=e,d):y},p.merge(v.eventTypes,["dragenter","dragleave","dropactivate","dropdeactivate","dropmove","drop"]),c.methodDict.drop="dropzone",h.drop=m.defaults,t.exports=m},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../interact":21,"../scope":34,"../utils":44,"./base":6}],9:[function(e,t,n){"use strict";var r=e("./base"),i=e("../utils"),o=e("../InteractEvent"),s=e("../Interactable"),a=e("../Interaction"),l=e("../defaultOptions"),c={defaults:{enabled:!1,origin:null,restrict:null},checker:function(e,t,n,r,i){return i.pointerIds.length>=2?{name:"gesture"}:null},getCursor:function(){return""}};o.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;"gesturestart"===t.type&&(t.ds=0,n.gesture.startDistance=n.gesture.prevDistance=t.distance,n.gesture.startAngle=n.gesture.prevAngle=t.angle,n.gesture.scale=1)}),o.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;"gesturemove"===t.type&&(t.ds=t.scale-n.gesture.scale,n.target.fire(t),n.gesture.prevAngle=t.angle,n.gesture.prevDistance=t.distance,t.scale===1/0||null===t.scale||void 0===t.scale||isNaN(t.scale)||(n.gesture.scale=t.scale))}),s.prototype.gesturable=function(e){return i.is.object(e)?(this.options.gesture.enabled=!1!==e.enabled,this.setPerAction("gesture",e),this.setOnEvents("gesture",e),this):i.is.bool(e)?(this.options.gesture.enabled=e,e||(this.ongesturestart=this.ongesturestart=this.ongestureend=null),this):this.options.gesture},o.signals.on("set-delta",function(e){var t=e.interaction,n=e.iEvent,r=e.action,s=e.event,a=e.starting,l=e.ending,c=e.deltaSource;if("gesture"===r){var p=t.pointers;n.touches=[p[0],p[1]],a?(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=1,n.ds=0,n.angle=i.touchAngle(p,void 0,c),n.da=0):l||s instanceof o?(n.distance=t.prevEvent.distance,n.box=t.prevEvent.box,n.scale=t.prevEvent.scale,n.ds=n.scale-1,n.angle=t.prevEvent.angle,n.da=n.angle-t.gesture.startAngle):(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=n.distance/t.gesture.startDistance,n.angle=i.touchAngle(p,t.gesture.prevAngle,c),n.ds=n.scale-t.gesture.prevScale,n.da=n.angle-t.gesture.prevAngle)}}),a.signals.on("new",function(e){e.gesture={start:{x:0,y:0},startDistance:0,prevDistance:0,distance:0,scale:1,startAngle:0,prevAngle:0}}),r.gesture=c,r.names.push("gesture"),i.merge(s.eventTypes,["gesturestart","gesturemove","gestureend"]),r.methodDict.gesture="gesturable",l.gesture=c.defaults,t.exports=c},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"./base":6}],10:[function(e,t,n){"use strict";function r(e,t,n,r,i,s,a){if(!t)return!1;if(!0===t){var l=o.is.number(s.width)?s.width:s.right-s.left,c=o.is.number(s.height)?s.height:s.bottom-s.top;if(l<0&&("left"===e?e="right":"right"===e&&(e="left")),c<0&&("top"===e?e="bottom":"bottom"===e&&(e="top")),"left"===e)return n.x<(l>=0?s.left:s.right)+a;if("top"===e)return n.y<(c>=0?s.top:s.bottom)+a;if("right"===e)return n.x>(l>=0?s.right:s.left)-a;if("bottom"===e)return n.y>(c>=0?s.bottom:s.top)-a}return!!o.is.element(r)&&(o.is.element(t)?t===r:o.matchesUpTo(r,t,i))}var i=e("./base"),o=e("../utils"),s=e("../utils/browser"),a=e("../InteractEvent"),l=e("../Interactable"),c=e("../Interaction"),p=e("../defaultOptions"),u=s.supportsTouch||s.supportsPointerEvent?20:10,d={defaults:{enabled:!1,mouseButtons:null,origin:null,snap:null,restrict:null,inertia:null,autoScroll:null,square:!1,preserveAspectRatio:!1,axis:"xy",margin:NaN,edges:null,invert:"none"},checker:function(e,t,n,i,s,a){if(!a)return null;var l=o.extend({},s.curCoords.page),c=n.options;if(c.resize.enabled){var p=c.resize,d={left:!1,right:!1,top:!1,bottom:!1};if(o.is.object(p.edges)){for(var f in d)d[f]=r(f,p.edges[f],l,s._eventTarget,i,a,p.margin||u);if(d.left=d.left&&!d.right,d.top=d.top&&!d.bottom,d.left||d.right||d.top||d.bottom)return{name:"resize",edges:d}}else{var v="y"!==c.resize.axis&&l.x>a.right-u,g="x"!==c.resize.axis&&l.y>a.bottom-u;if(v||g)return{name:"resize",axes:(v?"x":"")+(g?"y":"")}}}return null},cursors:s.isIe9OrOlder?{x:"e-resize",y:"s-resize",xy:"se-resize",top:"n-resize",left:"w-resize",bottom:"s-resize",right:"e-resize",topleft:"se-resize",bottomright:"se-resize",topright:"ne-resize",bottomleft:"ne-resize"}:{x:"ew-resize",y:"ns-resize",xy:"nwse-resize",top:"ns-resize",left:"ew-resize",bottom:"ns-resize",right:"ew-resize",topleft:"nwse-resize",bottomright:"nwse-resize",topright:"nesw-resize",bottomleft:"nesw-resize"},getCursor:function(e){if(e.axis)return d.cursors[e.name+e.axis];if(e.edges){for(var t="",n=["top","bottom","left","right"],r=0;r<4;r++)e.edges[n[r]]&&(t+=n[r]);return d.cursors[t]}}};a.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;if("resizestart"===t.type&&n.prepared.edges){var r=n.target.getRect(n.element),i=n.target.options.resize;if(i.square||i.preserveAspectRatio){var s=o.extend({},n.prepared.edges);s.top=s.top||s.left&&!s.bottom,s.left=s.left||s.top&&!s.right,s.bottom=s.bottom||s.right&&!s.top,s.right=s.right||s.bottom&&!s.left,n.prepared._linkedEdges=s}else n.prepared._linkedEdges=null;i.preserveAspectRatio&&(n.resizeStartAspectRatio=r.width/r.height),n.resizeRects={start:r,current:o.extend({},r),inverted:o.extend({},r),previous:o.extend({},r),delta:{left:0,right:0,width:0,top:0,bottom:0,height:0}},t.rect=n.resizeRects.inverted,t.deltaRect=n.resizeRects.delta}}),a.signals.on("new",function(e){var t=e.iEvent,n=e.phase,r=e.interaction;if("move"===n&&r.prepared.edges){var i=r.target.options.resize,s=i.invert,a="reposition"===s||"negate"===s,l=r.prepared.edges,c=r.resizeRects.start,p=r.resizeRects.current,u=r.resizeRects.inverted,d=r.resizeRects.delta,f=o.extend(r.resizeRects.previous,u),v=l,g=t.dx,h=t.dy;if(i.preserveAspectRatio||i.square){var m=i.preserveAspectRatio?r.resizeStartAspectRatio:1;l=r.prepared._linkedEdges,v.left&&v.bottom||v.right&&v.top?h=-g/m:v.left||v.right?h=g/m:(v.top||v.bottom)&&(g=h*m)}if(l.top&&(p.top+=h),l.bottom&&(p.bottom+=h),l.left&&(p.left+=g),l.right&&(p.right+=g),a){if(o.extend(u,p),"reposition"===s){var y=void 0;u.top>u.bottom&&(y=u.top,u.top=u.bottom,u.bottom=y),u.left>u.right&&(y=u.left,u.left=u.right,u.right=y)}}else u.top=Math.min(p.top,c.bottom),u.bottom=Math.max(p.bottom,c.top),u.left=Math.min(p.left,c.right),u.right=Math.max(p.right,c.left);u.width=u.right-u.left,u.height=u.bottom-u.top;for(var x in u)d[x]=u[x]-f[x];t.edges=r.prepared.edges,t.rect=u,t.deltaRect=d}}),l.prototype.resizable=function(e){return o.is.object(e)?(this.options.resize.enabled=!1!==e.enabled,this.setPerAction("resize",e),this.setOnEvents("resize",e),/^x$|^y$|^xy$/.test(e.axis)?this.options.resize.axis=e.axis:null===e.axis&&(this.options.resize.axis=p.resize.axis),o.is.bool(e.preserveAspectRatio)?this.options.resize.preserveAspectRatio=e.preserveAspectRatio:o.is.bool(e.square)&&(this.options.resize.square=e.square),this):o.is.bool(e)?(this.options.resize.enabled=e,e||(this.onresizestart=this.onresizestart=this.onresizeend=null),this):this.options.resize},c.signals.on("new",function(e){ -e.resizeAxes="xy"}),a.signals.on("set-delta",function(e){var t=e.interaction,n=e.iEvent;"resize"===e.action&&t.resizeAxes&&(t.target.options.resize.square?("y"===t.resizeAxes?n.dx=n.dy:n.dy=n.dx,n.axes="xy"):(n.axes=t.resizeAxes,"x"===t.resizeAxes?n.dy=0:"y"===t.resizeAxes&&(n.dx=0)))}),i.resize=d,i.names.push("resize"),o.merge(l.eventTypes,["resizestart","resizemove","resizeinertiastart","resizeinertiaresume","resizeend"]),i.methodDict.resize="resizable",p.resize=d.defaults,t.exports=d},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"../utils/browser":37,"./base":6}],11:[function(e,t,n){"use strict";var r=e("./utils/raf"),i=e("./utils/window").getWindow,o=e("./utils/is"),s=e("./utils/domUtils"),a=e("./Interaction"),l=e("./defaultOptions"),c={defaults:{enabled:!1,container:null,margin:60,speed:300},interaction:null,i:null,x:0,y:0,isScrolling:!1,prevTime:0,start:function(e){c.isScrolling=!0,r.cancel(c.i),c.interaction=e,c.prevTime=(new Date).getTime(),c.i=r.request(c.scroll)},stop:function(){c.isScrolling=!1,r.cancel(c.i)},scroll:function(){var e=c.interaction.target.options[c.interaction.prepared.name].autoScroll,t=e.container||i(c.interaction.element),n=(new Date).getTime(),s=(n-c.prevTime)/1e3,a=e.speed*s;a>=1&&(o.window(t)?t.scrollBy(c.x*a,c.y*a):t&&(t.scrollLeft+=c.x*a,t.scrollTop+=c.y*a),c.prevTime=n),c.isScrolling&&(r.cancel(c.i),c.i=r.request(c.scroll))},check:function(e,t){var n=e.options;return n[t].autoScroll&&n[t].autoScroll.enabled},onInteractionMove:function(e){var t=e.interaction,n=e.pointer;if(t.interacting()&&c.check(t.target,t.prepared.name)){if(t.simulation)return void(c.x=c.y=0);var r=void 0,a=void 0,l=void 0,p=void 0,u=t.target.options[t.prepared.name].autoScroll,d=u.container||i(t.element);if(o.window(d))p=n.clientXd.innerWidth-c.margin,l=n.clientY>d.innerHeight-c.margin;else{var f=s.getElementClientRect(d);p=n.clientXf.right-c.margin,l=n.clientY>f.bottom-c.margin}c.x=a?1:p?-1:0,c.y=l?1:r?-1:0,c.isScrolling||(c.margin=u.margin,c.speed=u.speed,c.start(t))}}};a.signals.on("stop-active",function(){c.stop()}),a.signals.on("action-move",c.onInteractionMove),l.perAction.autoScroll=c.defaults,t.exports=c},{"./Interaction":5,"./defaultOptions":18,"./utils/domUtils":39,"./utils/is":46,"./utils/raf":50,"./utils/window":52}],12:[function(e,t,n){"use strict";var r=e("../Interactable"),i=e("../actions/base"),o=e("../utils/is"),s=e("../utils/domUtils");r.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},r.prototype.ignoreFrom=function(e){return this._backCompatOption("ignoreFrom",e)},r.prototype.allowFrom=function(e){return this._backCompatOption("allowFrom",e)},r.prototype.testIgnore=function(e,t,n){return!(!e||!o.element(n))&&(o.string(e)?s.matchesUpTo(n,e,t):!!o.element(e)&&s.nodeContains(e,n))},r.prototype.testAllow=function(e,t,n){return!e||!!o.element(n)&&(o.string(e)?s.matchesUpTo(n,e,t):!!o.element(e)&&s.nodeContains(e,n))},r.prototype.testIgnoreAllow=function(e,t,n){return!this.testIgnore(e.ignoreFrom,t,n)&&this.testAllow(e.allowFrom,t,n)},r.prototype.actionChecker=function(e){return o.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},r.prototype.styleCursor=function(e){return o.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},r.prototype.defaultActionChecker=function(e,t,n,r){for(var o=this.getRect(r),s=null,a=i.names,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var u=p;if((!n.pointerIsDown||!n.mouse||0!=(t.buttons&this.options[u].mouseButtons))&&(s=i[u].checker(e,t,this,r,n,o)))return s}}},{"../Interactable":4,"../actions/base":6,"../utils/domUtils":39,"../utils/is":46}],13:[function(e,t,n){"use strict";function r(e,t,n,r){return g.is.object(e)&&t.testIgnoreAllow(t.options[e.name],n,r)&&t.options[e.name].enabled&&a(t,n,e)?e:null}function i(e,t,n,i,o,s){for(var a=0,l=i.length;a=m.maxInteractions)return!1;if(u.target===e){if((a+=d===n.name|0)>=i)return!1;if(u.element===t&&(l++,d!==n.name||l>=o))return!1}}}return m.maxInteractions>0}}var l=e("../interact"),c=e("../Interactable"),p=e("../Interaction"),u=e("../actions/base"),d=e("../defaultOptions"),f=e("../utils/browser"),v=e("../scope"),g=e("../utils"),h=e("../utils/Signals").new();e("./InteractableMethods");var m={signals:h,withinInteractionLimit:a,maxInteractions:1/0,defaults:{perAction:{manualStart:!1,max:1/0,maxPerElement:1,allowFrom:null,ignoreFrom:null}},setActionDefaults:function(e){g.extend(e.defaults,m.defaults.perAction)}};p.signals.on("down",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;if(!t.interacting()){s(t,o(t,n,r,i))}}),p.signals.on("move",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;if(t.mouse&&!t.pointerIsDown&&!t.interacting()){s(t,o(t,n,r,i))}}),p.signals.on("move",function(e){var t=e.interaction,n=e.event;if(t.pointerIsDown&&!t.interacting()&&t.pointerWasMoved&&t.prepared.name){h.fire("before-start",e);var r=t.target;t.prepared.name&&r&&(r.options[t.prepared.name].manualStart||!a(r,t.element,t.prepared)?t.stop(n):t.start(t.prepared,r,t.element))}}),p.signals.on("stop",function(e){var t=e.interaction,n=t.target;n&&n.options.styleCursor&&(n._doc.documentElement.style.cursor="")}),c.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},c.prototype.actionChecker=function(e){return g.is.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},c.prototype.styleCursor=function(e){return g.is.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},c.prototype.defaultActionChecker=function(e,t,n,r){for(var i=this.getRect(r),o=t.buttons||{0:1,1:4,3:8,4:16}[t.button],s=null,a=u.names,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var d=p;if((!n.pointerIsDown||!n.mouse||0!=(o&this.options[d].mouseButtons))&&(s=u[d].checker(e,t,this,r,n,i)))return s}},l.maxInteractions=function(e){return g.is.number(e)?(m.maxInteractions=e,this):m.maxInteractions},c.settingsMethods.push("styleCursor"),c.settingsMethods.push("actionChecker"),c.settingsMethods.push("ignoreFrom"),c.settingsMethods.push("allowFrom"),d.base.actionChecker=null,d.base.styleCursor=!0,g.extend(d.perAction,m.defaults.perAction),t.exports=m},{"../Interactable":4,"../Interaction":5,"../actions/base":6,"../defaultOptions":18,"../interact":21,"../scope":34,"../utils":44,"../utils/Signals":35,"../utils/browser":37,"./InteractableMethods":12}],14:[function(e,t,n){"use strict";var r=e("./base"),i=e("../Interaction");i.signals.on("new",function(e){e.delayTimer=null}),r.signals.on("prepared",function(e){var t=e.interaction,n=t.prepared.name;if(n){var r=t.target.options[n].delay;r>0&&(t.delayTimer=setTimeout(function(){t.start(t.prepared,t.target,t.element)},r))}}),i.signals.on("move",function(e){var t=e.interaction,n=e.duplicate;t.pointerWasMoved&&!n&&clearTimeout(t.delayTimer)}),r.signals.on("before-start",function(e){var t=e.interaction,n=t.prepared.name;if(n){t.target.options[n].delay>0&&(t.prepared.name=null)}})},{"../Interaction":5,"./base":13}],15:[function(e,t,n){"use strict";function r(e,t){if(!t)return!1;var n=t.options.drag.startAxis;return"xy"===e||"xy"===n||n===e}var i=e("./base"),o=e("../scope"),s=e("../utils/browser"),a=e("../utils/is"),l=e("../utils/domUtils"),c=l.matchesSelector,p=l.parentNode;i.setActionDefaults(e("../actions/drag")),i.signals.on("before-start",function(e){var t=e.interaction,n=e.eventTarget,l=e.dx,u=e.dy;if("drag"===t.prepared.name){var d=Math.abs(l),f=Math.abs(u),v=t.target.options.drag,g=v.startAxis,h=d>f?"x":dl.minSpeed&&g>l.endSpeed,b={interaction:t,pageCoords:v,statuses:f,preEnd:!0,requireEndOnly:!0};y&&!x&&(c.resetStatuses(f),m=c.setAll(b),m.shouldMove&&m.locked&&(h=!0)),(x||h)&&(p.copyCoords(i.upCoords,t.curCoords),t.pointers[0]=i.startEvent=new a(t,n,t.prepared.name,"inertiastart",t.element),i.t0=d,i.active=!0,i.allowResume=l.allowResume,t.simulation=i,o.fire(i.startEvent),x?(i.vx0=t.pointerDelta.client.vx,i.vy0=t.pointerDelta.client.vy,i.v0=g,r(t,i),p.extend(v,t.curCoords.page),v.x+=i.xe,v.y+=i.ye,c.resetStatuses(f),m=c.setAll(b),i.modifiedXe+=m.dx,i.modifiedYe+=m.dy,i.i=u.request(t.boundInertiaFrame)):(i.smoothEnd=!0,i.xe=m.dx,i.ye=m.dy,i.sx=i.sy=0,i.i=u.request(t.boundSmoothEndFrame)))}}),l.signals.on("stop-active",function(e){var t=e.interaction,n=t.inertiaStatus;n.active&&(u.cancel(n.i),n.active=!1,t.simulation=null)})},{"./InteractEvent":3,"./Interaction":5,"./modifiers":24,"./utils":44,"./utils/raf":50}],21:[function(e,t,n){"use strict";function r(e,t){var n=a.interactables.get(e,t);return n||(n=new l(e,t),n.events.global=p),n}var i=e("./utils/browser"),o=e("./utils/events"),s=e("./utils"),a=e("./scope"),l=e("./Interactable"),c=e("./Interaction"),p={};r.isSet=function(e,t){return-1!==a.interactables.indexOfElement(e,t&&t.context)},r.on=function(e,t,n){if(s.is.string(e)&&-1!==e.search(" ")&&(e=e.trim().split(/ +/)),s.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.on(f,t,n)}return r}if(s.is.object(e)){for(var v in e)r.on(v,e[v],t);return r}return s.contains(l.eventTypes,e)?p[e]?p[e].push(t):p[e]=[t]:o.add(a.document,e,t,{options:n}),r},r.off=function(e,t,n){if(s.is.string(e)&&-1!==e.search(" ")&&(e=e.trim().split(/ +/)),s.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.off(f,t,n)}return r}if(s.is.object(e)){for(var v in e)r.off(v,e[v],t);return r}if(s.contains(l.eventTypes,e)){var g=void 0;e in p&&-1!==(g=s.indexOf(p[e],t))&&p[e].splice(g,1)}else o.remove(a.document,e,t,n);return r},r.debug=function(){return a},r.getPointerAverage=s.pointerAverage,r.getTouchBBox=s.touchBBox,r.getTouchDistance=s.touchDistance,r.getTouchAngle=s.touchAngle,r.getElementRect=s.getElementRect,r.getElementClientRect=s.getElementClientRect,r.matchesSelector=s.matchesSelector,r.closest=s.closest,r.supportsTouch=function(){return i.supportsTouch},r.supportsPointerEvent=function(){return i.supportsPointerEvent},r.stop=function(e){for(var t=a.interactions.length-1;t>=0;t--)a.interactions[t].stop(e);return r},r.pointerMoveTolerance=function(e){return s.is.number(e)?(c.pointerMoveTolerance=e,this):c.pointerMoveTolerance},r.addDocument=a.addDocument,r.removeDocument=a.removeDocument,a.interact=r,t.exports=r},{"./Interactable":4,"./Interaction":5,"./scope":34,"./utils":44,"./utils/browser":37,"./utils/events":40}],22:[function(e,t,n){"use strict";function r(e){var t=e.interaction,n=e.event;t.target&&t.target.checkAndPreventDefault(n)}var i=e("./Interactable"),o=e("./Interaction"),s=e("./scope"),a=e("./utils/is"),l=e("./utils/events"),c=e("./utils/domUtils"),p=c.nodeContains,u=c.matchesSelector;i.prototype.preventDefault=function(e){return/^(always|never|auto)$/.test(e)?(this.options.preventDefault=e,this):a.bool(e)?(this.options.preventDefault=e?"always":"never",this):this.options.preventDefault},i.prototype.checkAndPreventDefault=function(e){var t=this.options.preventDefault;if("never"!==t)return"always"===t?void e.preventDefault():void(l.supportsOptions||/^(mouse|pointer|touch)*(down|start)/i.test(e.type)||a.element(e.target)&&u(e.target,"input,select,textarea,[contenteditable=true],[contenteditable=true] *")||e.preventDefault())};for(var d=["down","move","up","cancel"],f=0;f=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i;if(o.element&&(o.element===e.target||p(o.element,e.target)))return void o.target.checkAndPreventDefault(e)}}},{"./Interactable":4,"./Interaction":5,"./scope":34,"./utils/domUtils":39,"./utils/events":40,"./utils/is":46}],23:[function(e,t,n){"use strict";function r(e){var t=e.target,n=a.search(e,e.type,t);n&&n.prevTap&&e.clientX===n.prevTap.clientX&&e.clientY===n.prevTap.clientY&&t===n.prevTap.target&&(n.downTargets[0]=t,n.downTimes[0]=(new Date).getTime(),l.fire({interaction:n,event:e,eventTarget:t,pointer:e,type:"tap"}))}var i=e("./scope"),o=e("./utils/events"),s=e("./utils/browser"),a=e("./utils/interactionFinder"),l=e("./pointerEvents/base"),c=e("./utils/window"),p=c.window,u=Object.prototype.toString;if(p.Array.isArray||(p.Array.isArray=function(e){return"[object Array]"===u.call(e)}),String.prototype.trim||(String.prototype.trim=function(){return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")}),s.isIE8){var d=function(e){for(var t=i.interactions,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var o;if(n){if(r>=t.length)break;o=t[r++]}else{if(r=t.next(),r.done)break;o=r.value}var s=o;s.interacting()&&s.target.checkAndPreventDefault(e)}},f=function(e,t){var n=e.doc,i=(e.win,0===t.indexOf("listen")?o.add:o.remove);i(n,"selectstart",d),l&&i(n,"dblclick",r)};i.signals.on("add-document",f),i.signals.on("remove-document",f)}t.exports=null},{"./pointerEvents/base":31,"./scope":34,"./utils/browser":37,"./utils/events":40,"./utils/interactionFinder":45,"./utils/window":52}],24:[function(e,t,n){"use strict";function r(e,t,n){return e&&e.enabled&&(t||!e.endOnly)&&(!n||e.endOnly)}var i=e("../InteractEvent"),o=e("../Interaction"),s=e("../utils/extend"),a={names:[],setOffsets:function(e){var t=e.interaction,n=e.pageCoords,r=t.target,i=t.element,o=t.startOffset,s=r.getRect(i);s?(o.left=n.x-s.left,o.top=n.y-s.top,o.right=s.right-n.x,o.bottom=s.bottom-n.y,"width"in s||(s.width=s.right-s.left),"height"in s||(s.height=s.bottom-s.top)):o.left=o.top=o.right=o.bottom=0,e.rect=s,e.interactable=r,e.element=i;for(var l=0;l=p.length)break;f=p[d++]}else{if(d=p.next(),d.done)break;f=d.value}var v=f,g=a[v],h=t.target.options[t.prepared.name][v];r(h,i,o)&&(e.status=e.status=n[v],e.options=h,e.offset=e.interaction.modifierOffsets[v],g.set(e),e.status.locked&&(l.x+=e.status.dx,l.y+=e.status.dy,c.dx+=e.status.dx,c.dy+=e.status.dy,c.locked=!0))}return c.shouldMove=!e.status||!c.locked||e.status.changed,c},resetStatuses:function(e){for(var t=a.names,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var i;if(n){if(r>=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i,s=e[o]||{};s.dx=s.dy=0,s.modifiedX=s.modifiedY=NaN,s.locked=!1,s.changed=!0,e[o]=s}return e},start:function(e,t){var n=e.interaction,r={interaction:n,pageCoords:("action-resume"===t?n.curCoords:n.startCoords).page,startOffset:n.startOffset,statuses:n.modifierStatuses,preEnd:!1,requireEndOnly:!1};a.setOffsets(r),a.resetStatuses(r.statuses),r.pageCoords=s({},n.startCoords.page),n.modifierResult=a.setAll(r)}};o.signals.on("new",function(e){e.startOffset={left:0,right:0,top:0,bottom:0},e.modifierOffsets={},e.modifierStatuses=a.resetStatuses({}),e.modifierResult=null}),o.signals.on("action-start",a.start),o.signals.on("action-resume",a.start),o.signals.on("before-action-move",function(e){var t=e.interaction,n=e.preEnd,r=e.interactingBeforeMove,i=a.setAll({interaction:t,preEnd:n,pageCoords:t.curCoords.page,statuses:t.modifierStatuses,requireEndOnly:!1});!i.shouldMove&&r&&(t._dontFireMove=!0),t.modifierResult=i}),o.signals.on("action-end",function(e){for(var t=e.interaction,n=e.event,i=0;i=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}var m=h,y=m.x,x=m.y;l.push({x:s.left-i.width*y+u.x,y:s.top-i.height*x+u.y})}else l.push(u);return l},set:function(e){var t=e.interaction,n=e.pageCoords,r=e.status,i=e.options,s=e.offset,a=[],l=void 0,c=void 0,p=void 0;if(r.useStatusXY)c={x:r.x,y:r.y};else{var u=o.getOriginXY(t.target,t.element,t.prepared.name);c=o.extend({},n),c.x-=u.x,c.y-=u.y}r.realX=c.x,r.realY=c.y;for(var d=i.targets?i.targets.length:0,f=s,v=Array.isArray(f),g=0,f=v?f:f[Symbol.iterator]();;){var h;if(v){if(g>=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}for(var m=h,y=m.x,x=m.y,b=c.x-y,w=c.y-x,E=i.targets,S=Array.isArray(E),T=0,E=S?E:E[Symbol.iterator]();;){var C;if(S){if(T>=E.length)break;C=E[T++]}else{if(T=E.next(),T.done)break;C=T.value}var A=C;l=o.is.function(A)?A(b,w,t):A,l&&a.push({x:o.is.number(l.x)?l.x+y:b,y:o.is.number(l.y)?l.y+x:w,range:o.is.number(l.range)?l.range:i.range})}}var D={target:null,inRange:!1,distance:0,range:0,dx:0,dy:0};for(p=0,d=a.length;p=p.length)break;f=p[d++]}else{if(d=p.next(),d.done)break;f=d.value}var v=f,g=void 0;g=a.is.function(v)?v(l,c,t):v,g&&("width"in g&&"height"in g&&(g.x=g.width,g.y=g.height),e.options.targets.push(g))}i.set(e)},modifyCoords:function(e){var t=e.options;e.options=a.extend({},t), -e.options.enabled=t.enabled,e.options.relativePoints=[null],i.modifyCoords(e)}};r.snapSize=l,r.names.push("snapSize"),o.perAction.snapSize=l.defaults,s.defaults.snapSize=l.defaults,t.exports=l},{"../actions/resize":10,"../defaultOptions":18,"../utils/":44,"./index":24,"./snap":28}],30:[function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=e("../utils/pointerUtils");t.exports=function(){function e(t,n,o,s,a){if(r(this,e),i.pointerExtend(this,o),o!==n&&i.pointerExtend(this,n),this.interaction=a,this.timeStamp=(new Date).getTime(),this.originalEvent=o,this.type=t,this.pointerId=i.getPointerId(n),this.pointerType=i.getPointerType(n,a),this.target=s,this.currentTarget=null,"tap"===t){var l=a.getPointerIndex(n);this.dt=this.timeStamp-a.downTimes[l];var c=this.timeStamp-a.tapTime;this.double=!!(a.prevTap&&"doubletap"!==a.prevTap.type&&a.prevTap.target===this.target&&c<500)}else"doubletap"===t&&(this.dt=n.timeStamp-a.tapTime)}return e.prototype.subtractOrigin=function(e){var t=e.x,n=e.y;return this.pageX-=t,this.pageY-=n,this.clientX-=t,this.clientY-=n,this},e.prototype.addOrigin=function(e){var t=e.x,n=e.y;return this.pageX+=t,this.pageY+=n,this.clientX+=t,this.clientY+=n,this},e.prototype.preventDefault=function(){this.originalEvent.preventDefault()},e.prototype.stopPropagation=function(){this.propagationStopped=!0},e.prototype.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},e}()},{"../utils/pointerUtils":49}],31:[function(e,t,n){"use strict";function r(e){for(var t=e.interaction,n=e.pointer,s=e.event,l=e.eventTarget,c=e.type,u=void 0===c?e.pointerEvent.type:c,d=e.targets,f=void 0===d?i(e):d,v=e.pointerEvent,g=void 0===v?new o(u,n,s,l,t):v,h={interaction:t,pointer:n,event:s,eventTarget:l,targets:f,type:u,pointerEvent:g},m=0;m=u.length)break;g=u[v++]}else{if(v=u.next(),v.done)break;g=v.value}var h=g;c.element=h,p.fire("collect-targets",c)}return"hold"===o&&(c.targets=d(c.targets,function(e){return e.eventable.options.holdDuration===t.holdTimers[s].duration})),c.targets}var o=e("./PointerEvent"),s=e("../Interaction"),a=e("../utils"),l=e("../utils/browser"),c=e("../defaultOptions"),p=e("../utils/Signals").new(),u=e("../utils/arr"),d=u.filter,f=["down","up","cancel"],v=["down","up","cancel"],g={PointerEvent:o,fire:r,collectEventTargets:i,signals:p,defaults:{holdDuration:600,ignoreFrom:null,allowFrom:null,origin:{x:0,y:0}},types:["down","move","up","cancel","tap","doubletap","hold"]};s.signals.on("update-pointer-down",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers[n]={duration:1/0,timeout:null}}),s.signals.on("remove-pointer",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers.splice(n,1)}),s.signals.on("move",function(e){var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,s=e.duplicateMove,a=t.getPointerIndex(n);s||t.pointerIsDown&&!t.pointerWasMoved||(t.pointerIsDown&&clearTimeout(t.holdTimers[a].timeout),r({interaction:t,pointer:n,event:i,eventTarget:o,type:"move"}))}),s.signals.on("down",function(e){for(var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,s=e.pointerIndex,c=l.isIE8?a.extend({},i):i,u=t.holdTimers[s],d=a.getPath(o),f={interaction:t,pointer:n,event:i,eventTarget:o,type:"hold",targets:[],path:d,element:null},v=d,g=Array.isArray(v),h=0,v=g?v:v[Symbol.iterator]();;){var m;if(g){if(h>=v.length)break;m=v[h++]}else{if(h=v.next(),h.done)break;m=h.value}var y=m;f.element=y,p.fire("collect-targets",f)}if(f.targets.length){for(var x=1/0,b=0;b=0&&(p.selectors[u]!==e||p.contexts[u]!==t);u--);-1===u&&(u=p.selectors.length,p.selectors.push(e),p.contexts.push(t),p.listeners.push([])),p.listeners[u].push([i,!!s.capture,s.passive])}function s(e,t,n,r,o){var s=f(o),c=O[n],p=!1,u=void 0;if(c)for(u=c.selectors.length-1;u>=0;u--)if(c.selectors[u]===e&&c.contexts[u]===t){for(var d=c.listeners[u],v=d.length-1;v>=0;v--){var g=d[v],h=g[0],m=g[1],y=g[2];if(h===r&&m===!!s.capture&&y===s.passive){d.splice(v,1),d.length||(c.selectors.splice(u,1),c.contexts.splice(u,1),c.listeners.splice(u,1),i(t,n,a),i(t,n,l,!0),c.selectors.length||(O[n]=null)),p=!0;break}}if(p)break}}function a(e,t){var n=f(t),r={},i=O[e.type],o=g.getActualElement(e.path?e.path[0]:e.target),s=o;for(h(r,e),r.originalEvent=e,r.preventDefault=p;v.element(s);){for(var a=0;a=l.length)break;u=l[p++]}else{if(p=l.next(),p.done)break;u=p.value}var d=u,f=s[d](a);if(f)return f}},simulationResume:function(e){var t=e.mouseEvent,n=e.eventType,o=e.eventTarget;if(!/down|start/i.test(n))return null;for(var s=r.interactions,a=Array.isArray(s),l=0,s=a?s:s[Symbol.iterator]();;){var c;if(a){if(l>=s.length)break;c=s[l++]}else{if(l=s.next(),l.done)break;c=l.value}var p=c,u=o;if(p.simulation&&p.simulation.allowResume&&p.mouse===t)for(;u;){if(u===p.element)return p;u=i.parentNode(u)}}return null},mouse:function(e){var t=e.pointerId,n=e.mouseEvent,s=e.eventType;if(!n&&(o.supportsTouch||o.supportsPointerEvent))return null;for(var a=void 0,l=r.interactions,c=Array.isArray(l),p=0,l=c?l:l[Symbol.iterator]();;){var u;if(c){if(p>=l.length)break;u=l[p++]}else{if(p=l.next(),p.done)break;u=p.value}var d=u;if(d.mouse){if(d.simulation&&!i.contains(d.pointerIds,t))continue;if(d.interacting())return d;a||(a=d)}}if(a)return a;for(var f=r.interactions,v=Array.isArray(f),g=0,f=v?f:f[Symbol.iterator]();;){var h;if(v){if(g>=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}var m=h;if(m.mouse&&(!/down/.test(s)||!m.simulation))return m}return null},hasPointer:function(e){for(var t=e.pointerId,n=r.interactions,o=Array.isArray(n),s=0,n=o?n:n[Symbol.iterator]();;){var a;if(o){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var l=a;if(i.contains(l.pointerIds,t))return l}},idle:function(e){for(var t=e.mouseEvent,n=r.interactions,i=Array.isArray(n),o=0,n=i?n:n[Symbol.iterator]();;){var s;if(i){if(o>=n.length)break;s=n[o++]}else{if(o=n.next(),o.done)break;s=o.value}var a=s;if(1===a.pointerIds.length){var l=a.target;if(l&&!l.options.gesture.enabled)continue}else if(a.pointerIds.length>=2)continue;if(!a.interacting()&&t===a.mouse)return a}return null}};t.exports=s},{"../scope":34,"./browser":37,"./index":44}],46:[function(e,t,n){"use strict";var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},i=e("./window"),o=e("./isWindow"),s={array:function(){},window:function(e){return e===i.window||o(e)},docFrag:function(e){return s.object(e)&&11===e.nodeType},object:function(e){return!!e&&"object"===(void 0===e?"undefined":r(e))},function:function(e){return"function"==typeof e},number:function(e){return"number"==typeof e},bool:function(e){return"boolean"==typeof e},string:function(e){return"string"==typeof e},element:function(e){if(!e||"object"!==(void 0===e?"undefined":r(e)))return!1;var t=i.getWindow(e)||i.window;return/object|function/.test(r(t.Element))?e instanceof t.Element:1===e.nodeType&&"string"==typeof e.nodeName}};s.array=function(e){return s.object(e)&&void 0!==e.length&&s.function(e.splice)},t.exports=s},{"./isWindow":47,"./window":52}],47:[function(e,t,n){"use strict";t.exports=function(e){return!(!e||!e.Window)&&e instanceof e.Window}},{}],48:[function(e,t,n){"use strict";function r(e,n){for(var r in n){var i=t.exports.prefixedPropREs,o=!1;for(var s in i)if(0===r.indexOf(s)&&i[s].test(r)){o=!0;break}o||"function"==typeof n[r]||(e[r]=n[r])}return e}r.prefixedPropREs={webkit:/(Movement[XY]|Radius[XY]|RotationAngle|Force)$/},t.exports=r},{}],49:[function(e,t,n){"use strict";var r=e("./hypot"),i=e("./browser"),o=e("./domObjects"),s=e("./domUtils"),a=e("./is"),l=e("./pointerExtend"),c={copyCoords:function(e,t){e.page=e.page||{},e.page.x=t.page.x,e.page.y=t.page.y,e.client=e.client||{},e.client.x=t.client.x,e.client.y=t.client.y,e.timeStamp=t.timeStamp},setCoordDeltas:function(e,t,n){e.page.x=n.page.x-t.page.x,e.page.y=n.page.y-t.page.y,e.client.x=n.client.x-t.client.x,e.client.y=n.client.y-t.client.y,e.timeStamp=n.timeStamp-t.timeStamp;var i=Math.max(e.timeStamp/1e3,.001);e.page.speed=r(e.page.x,e.page.y)/i,e.page.vx=e.page.x/i,e.page.vy=e.page.y/i,e.client.speed=r(e.client.x,e.page.y)/i,e.client.vx=e.client.x/i,e.client.vy=e.client.y/i},isNativePointer:function(e){return e instanceof o.Event||e instanceof o.Touch},getXY:function(e,t,n){return n=n||{},e=e||"page",n.x=t[e+"X"],n.y=t[e+"Y"],n},getPageXY:function(e,t){return t=t||{},i.isOperaMobile&&c.isNativePointer(e)?(c.getXY("screen",e,t),t.x+=window.scrollX,t.y+=window.scrollY):c.getXY("page",e,t),t},getClientXY:function(e,t){return t=t||{},i.isOperaMobile&&c.isNativePointer(e)?c.getXY("screen",e,t):c.getXY("client",e,t),t},getPointerId:function(e){return a.number(e.pointerId)?e.pointerId:e.identifier},setCoords:function(e,t,n){var r=t.length>1?c.pointerAverage(t):t[0],i={};c.getPageXY(r,i),e.page.x=i.x,e.page.y=i.y,c.getClientXY(r,i),e.client.x=i.x,e.client.y=i.y,e.timeStamp=a.number(n)?n:(new Date).getTime()},pointerExtend:l,getTouchPair:function(e){var t=[];return a.array(e)?(t[0]=e[0],t[1]=e[1]):"touchend"===e.type?1===e.touches.length?(t[0]=e.touches[0],t[1]=e.changedTouches[0]):0===e.touches.length&&(t[0]=e.changedTouches[0],t[1]=e.changedTouches[1]):(t[0]=e.touches[0],t[1]=e.touches[1]),t},pointerAverage:function(e){for(var t={pageX:0,pageY:0,clientX:0,clientY:0,screenX:0,screenY:0},n=e,r=Array.isArray(n),i=0,n=r?n:n[Symbol.iterator]();;){var o;if(r){if(i>=n.length)break;o=n[i++]}else{if(i=n.next(),i.done)break;o=i.value}var s=o;for(var a in t)t[a]+=s[a]}for(var l in t)t[l]/=e.length;return t},touchBBox:function(e){if(e.length||e.touches&&e.touches.length>1){var t=c.getTouchPair(e),n=Math.min(t[0].pageX,t[1].pageX),r=Math.min(t[0].pageY,t[1].pageY);return{x:n,y:r,left:n,top:r,width:Math.max(t[0].pageX,t[1].pageX)-n,height:Math.max(t[0].pageY,t[1].pageY)-r}}},touchDistance:function(e,t){var n=t+"X",i=t+"Y",o=c.getTouchPair(e),s=o[0][n]-o[1][n],a=o[0][i]-o[1][i];return r(s,a)},touchAngle:function(e,t,n){var r=n+"X",i=n+"Y",o=c.getTouchPair(e),s=o[1][r]-o[0][r],a=o[1][i]-o[0][i];return 180*Math.atan2(a,s)/Math.PI},getPointerType:function(e,t){return t.mouse?"mouse":i.supportsPointerEvent?a.string(e.pointerType)?e.pointerType:[void 0,void 0,"touch","pen","mouse"][e.pointerType]:"touch"},getEventTargets:function(e){return[s.getActualElement(e.path?e.path[0]:e.target),s.getActualElement(e.currentTarget)]}};t.exports=c},{"./browser":37,"./domObjects":38,"./domUtils":39,"./hypot":43,"./is":46,"./pointerExtend":48}],50:[function(e,t,n){"use strict";for(var r=e("./window"),i=r.window,o=["ms","moz","webkit","o"],s=0,a=void 0,l=void 0,c=0;c6&&void 0!==arguments[6]&&arguments[6];r(this,e);var f=t.target,v=(f&&f.options||s).deltaSource,g=o(f,p,l),h="start"===c,m="end"===c,y=h?t.startCoords:t.curCoords,x=t.prevEvent;p=p||t.element;var b=i({},y.page),w=i({},y.client);b.x-=g.x,b.y-=g.y,w.x-=g.x,w.y-=g.y,this.ctrlKey=n.ctrlKey,this.altKey=n.altKey,this.shiftKey=n.shiftKey,this.metaKey=n.metaKey,this.button=n.button,this.buttons=n.buttons,this.target=p,this.currentTarget=p,this.relatedTarget=u||null,this.preEnd=d,this.type=l+(c||""),this.interaction=t,this.interactable=f,this.t0=h?t.downTimes[t.downTimes.length-1]:x.t0;var E={interaction:t,event:n,action:l,phase:c,element:p,related:u,page:b,client:w,coords:y,starting:h,ending:m,deltaSource:v,iEvent:this};a.fire("set-xy",E),m?(this.pageX=x.pageX,this.pageY=x.pageY,this.clientX=x.clientX,this.clientY=x.clientY):(this.pageX=b.x,this.pageY=b.y,this.clientX=w.x,this.clientY=w.y),this.x0=t.startCoords.page.x-g.x,this.y0=t.startCoords.page.y-g.y,this.clientX0=t.startCoords.client.x-g.x,this.clientY0=t.startCoords.client.y-g.y,a.fire("set-delta",E),this.timeStamp=y.timeStamp,this.dt=t.pointerDelta.timeStamp,this.duration=this.timeStamp-this.t0,this.speed=t.pointerDelta[v].speed,this.velocityX=t.pointerDelta[v].vx,this.velocityY=t.pointerDelta[v].vy,this.swipe=m||"inertiastart"===c?this.getSwipe():null,a.fire("new",E)}return e.prototype.getSwipe=function(){var e=this.interaction;if(e.prevEvent.speed<600||this.timeStamp-e.prevEvent.timeStamp>150)return null;var t=180*Math.atan2(e.prevEvent.velocityY,e.prevEvent.velocityX)/Math.PI;t<0&&(t+=360);var n=112.5<=t&&t<247.5,r=202.5<=t&&t<337.5,i=!n&&(292.5<=t||t<67.5);return{up:r,down:!r&&22.5<=t&&t<157.5,left:n,right:i,angle:t,speed:e.prevEvent.speed,velocity:{x:e.prevEvent.velocityX,y:e.prevEvent.velocityY}}},e.prototype.preventDefault=function(){},e.prototype.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},e.prototype.stopPropagation=function(){this.propagationStopped=!0},e}();a.on("set-delta",function(e){var t=e.iEvent,n=e.interaction,r=e.starting,i=e.deltaSource,o=r?t:n.prevEvent;"client"===i?(t.dx=t.clientX-o.clientX,t.dy=t.clientY-o.clientY):(t.dx=t.pageX-o.pageX,t.dy=t.pageY-o.pageY)}),l.signals=a,t.exports=l},{"./defaultOptions":18,"./utils/Signals":35,"./utils/extend":41,"./utils/getOriginXY":42}],4:[function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=e("./utils/is"),o=e("./utils/events"),s=e("./utils/extend"),a=e("./actions/base"),l=e("./scope"),c=e("./Eventable"),p=e("./defaultOptions"),u=e("./utils/Signals").new(),d=e("./utils/domUtils"),f=d.getElementRect,v=d.nodeContains,g=d.trySelector,h=e("./utils/window"),m=h.getWindow,y=e("./utils/arr"),x=y.indexOf,b=y.contains,w=e("./utils/browser"),E=w.wheelEvent;l.interactables=[];var S=function(){function e(t,n){r(this,e),n=n||{},this.target=t,this.events=new c,this._context=n.context||l.document,this._win=m(g(t)?this._context:t),this._doc=this._win.document,u.fire("new",{target:t,options:n,interactable:this,win:this._win}),l.addDocument(this._doc,this._win),l.interactables.push(this),this.set(n)}return e.prototype.setOnEvents=function(e,t){var n="on"+e;return i.function(t.onstart)&&(this.events[n+"start"]=t.onstart),i.function(t.onmove)&&(this.events[n+"move"]=t.onmove),i.function(t.onend)&&(this.events[n+"end"]=t.onend),i.function(t.oninertiastart)&&(this.events[n+"inertiastart"]=t.oninertiastart),this},e.prototype.setPerAction=function(e,t){for(var n in t)n in p[e]&&(i.object(t[n])?(this.options[e][n]=s(this.options[e][n]||{},t[n]),i.object(p.perAction[n])&&"enabled"in p.perAction[n]&&(this.options[e][n].enabled=!1!==t[n].enabled)):i.bool(t[n])&&i.object(p.perAction[n])?this.options[e][n].enabled=t[n]:void 0!==t[n]&&(this.options[e][n]=t[n]))},e.prototype.getRect=function(e){return e=e||this.target,i.string(this.target)&&!i.element(e)&&(e=this._context.querySelector(this.target)),f(e)},e.prototype.rectChecker=function(e){return i.function(e)?(this.getRect=e,this):null===e?(delete this.options.getRect,this):this.getRect},e.prototype._backCompatOption=function(e,t){if(g(t)||i.object(t)){this.options[e]=t;for(var n=a.names,r=Array.isArray(n),o=0,n=r?n:n[Symbol.iterator]();;){var s;if(r){if(o>=n.length)break;s=n[o++]}else{if(o=n.next(),o.done)break;s=o.value}var l=s;this.options[l][e]=t}return this}return this.options[e]},e.prototype.origin=function(e){return this._backCompatOption("origin",e)},e.prototype.deltaSource=function(e){return"page"===e||"client"===e?(this.options.deltaSource=e,this):this.options.deltaSource},e.prototype.context=function(){return this._context},e.prototype.inContext=function(e){return this._context===e.ownerDocument||v(this._context,e)},e.prototype.fire=function(e){return this.events.fire(e),this},e.prototype._onOffMultiple=function(e,t,n,r){if(i.string(t)&&-1!==t.search(" ")&&(t=t.trim().split(/ +/)),i.array(t)){for(var o=0;o=l.length)break;f=l[d++]}else{if(d=l.next(),d.done)break;f=d.value}var v=f;this.options[v]=p.base[v],v in t&&this[v](t[v])}return u.fire("set",{options:t,interactable:this}),this},e.prototype.unset=function(){if(o.remove(this.target,"all"),i.string(this.target))for(var e in o.delegatedEvents){var t=o.delegatedEvents[e];t.selectors[0]===this.target&&t.contexts[0]===this._context&&(t.selectors.splice(0,1),t.contexts.splice(0,1),t.listeners.splice(0,1),t.selectors.length||(t[e]=null)),o.remove(this._context,e,o.delegateListener),o.remove(this._context,e,o.delegateUseCapture,!0)}else o.remove(this,"all");u.fire("unset",{interactable:this}),l.interactables.splice(x(l.interactables,this),1);for(var n=l.interactions||[],r=Array.isArray(n),s=0,n=r?n:n[Symbol.iterator]();;){var a;if(r){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var c=a;c.target===this&&c.interacting()&&c.stop()}return l.interact},e}();l.interactables.indexOfElement=function(e,t){t=t||l.document;for(var n=0;n=x.length)break;E=x[w++]}else{if(w=x.next(),w.done)break;E=w.value}var S=E,T=S[0],C=S[1];C._updateEventTargets(i,o),C[e](T,t,i,o)}}}function o(e){for(var t=0;te.pointerMoveTolerance);var a={pointer:t,pointerIndex:this.getPointerIndex(t),event:n,eventTarget:r,dx:o,dy:s,duplicate:i,interaction:this,interactingBeforeMove:this.interacting()};i||l.setCoordDeltas(this.pointerDelta,this.prevCoords,this.curCoords),f.fire("move",a),i||(this.interacting()&&this.doMove(a),this.pointerWasMoved&&l.copyCoords(this.prevCoords,this.curCoords))},e.prototype.doMove=function(e){e=l.extend({pointer:this.pointers[0],event:this.prevEvent,eventTarget:this._eventTarget,interaction:this},e||{}),f.fire("before-action-move",e),this._dontFireMove||f.fire("action-move",e),this._dontFireMove=!1},e.prototype.pointerUp=function(e,t,n,r){var i=this.getPointerIndex(e);f.fire(/cancel$/i.test(t.type)?"cancel":"up",{pointer:e,pointerIndex:i,event:t,eventTarget:n,curEventTarget:r,interaction:this}),this.simulation||this.end(t),this.pointerIsDown=!1,this.removePointer(e,t)},e.prototype.end=function(e){e=e||this.prevEvent,this.interacting()&&f.fire("action-end",{event:e,interaction:this}),this.stop()},e.prototype.currentAction=function(){return this._interacting?this.prepared.name:null},e.prototype.interacting=function(){return this._interacting},e.prototype.stop=function(){f.fire("stop",{interaction:this}),this._interacting&&(f.fire("stop-active",{interaction:this}),f.fire("stop-"+this.prepared.name,{interaction:this})),this.target=this.element=null,this._interacting=!1,this.prepared.name=this.prevEvent=null},e.prototype.getPointerIndex=function(e){return"mouse"===this.pointerType||"pen"===this.pointerType?0:l.indexOf(this.pointerIds,l.getPointerId(e))},e.prototype.updatePointer=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:t&&/(down|start)$/i.test(t.type),r=l.getPointerId(e),i=this.getPointerIndex(e);return-1===i&&(i=this.pointerIds.length,this.pointerIds[i]=r),n&&f.fire("update-pointer-down",{pointer:e,event:t,down:n,pointerId:r,pointerIndex:i,interaction:this}),this.pointers[i]=e,i},e.prototype.removePointer=function(e,t){var n=this.getPointerIndex(e);-1!==n&&(f.fire("remove-pointer",{pointer:e,event:t,pointerIndex:n,interaction:this}),this.pointers.splice(n,1),this.pointerIds.splice(n,1),this.downTargets.splice(n,1),this.downTimes.splice(n,1))},e.prototype._updateEventTargets=function(e,t){this._eventTarget=e,this._curEventTarget=t},e}(),y=0,x=g.length;y=i.length)break;a=i[s++]}else{if(s=i.next(),s.done)break;a=s.value}var l=a;if(l.options.drop.enabled){var c=l.options.drop.accept;if(!(p.is.element(c)&&c!==t||p.is.string(c)&&!p.matchesSelector(t,c)))for(var d=p.is.string(l.target)?l._context.querySelectorAll(l.target):[l.target],f=0;fo.left&&c.xo.top&&c.y=o.left&&v<=o.right&&g>=o.top&&g<=o.bottom}if(f&&p.is.number(a)){s=Math.max(0,Math.min(o.right,f.right)-Math.max(o.left,f.left))*Math.max(0,Math.min(o.bottom,f.bottom)-Math.max(o.top,f.top))/(f.width*f.height)>=a}return this.options.drop.checker&&(s=this.options.drop.checker(e,t,s,this,i,n,r)),s},v.signals.on("unset",function(e){e.interactable.dropzone(!1)}),v.settingsMethods.push("dropChecker"),g.signals.on("new",function(e){e.dropTarget=null,e.dropElement=null,e.prevDropTarget=null,e.prevDropElement=null,e.dropEvents=null,e.activeDrops={dropzones:[],elements:[],rects:[]}}),g.signals.on("stop",function(e){var t=e.interaction;t.dropTarget=t.dropElement=t.prevDropTarget=t.prevDropElement=null}),d.dynamicDrop=function(e){return p.is.bool(e)?(y=e,d):y},p.merge(v.eventTypes,["dragenter","dragleave","dropactivate","dropdeactivate","dropmove","drop"]),c.methodDict.drop="dropzone",h.drop=m.defaults,t.exports=m},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../interact":21,"../scope":34,"../utils":44,"./base":6}],9:[function(e,t,n){"use strict";var r=e("./base"),i=e("../utils"),o=e("../InteractEvent"),s=e("../Interactable"),a=e("../Interaction"),l=e("../defaultOptions"),c={defaults:{enabled:!1,origin:null,restrict:null},checker:function(e,t,n,r,i){return i.pointerIds.length>=2?{name:"gesture"}:null},getCursor:function(){return""}};o.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;"gesturestart"===t.type&&(t.ds=0,n.gesture.startDistance=n.gesture.prevDistance=t.distance,n.gesture.startAngle=n.gesture.prevAngle=t.angle,n.gesture.scale=1)}),o.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;"gesturemove"===t.type&&(t.ds=t.scale-n.gesture.scale,n.target.fire(t),n.gesture.prevAngle=t.angle,n.gesture.prevDistance=t.distance,t.scale===1/0||null===t.scale||void 0===t.scale||isNaN(t.scale)||(n.gesture.scale=t.scale))}),s.prototype.gesturable=function(e){return i.is.object(e)?(this.options.gesture.enabled=!1!==e.enabled,this.setPerAction("gesture",e),this.setOnEvents("gesture",e),this):i.is.bool(e)?(this.options.gesture.enabled=e,e||(this.ongesturestart=this.ongesturestart=this.ongestureend=null),this):this.options.gesture},o.signals.on("set-delta",function(e){var t=e.interaction,n=e.iEvent,r=e.action,s=e.event,a=e.starting,l=e.ending,c=e.deltaSource;if("gesture"===r){var p=t.pointers;n.touches=[p[0],p[1]],a?(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=1,n.ds=0,n.angle=i.touchAngle(p,void 0,c),n.da=0):l||s instanceof o?(n.distance=t.prevEvent.distance,n.box=t.prevEvent.box,n.scale=t.prevEvent.scale,n.ds=n.scale-1,n.angle=t.prevEvent.angle,n.da=n.angle-t.gesture.startAngle):(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=n.distance/t.gesture.startDistance,n.angle=i.touchAngle(p,t.gesture.prevAngle,c),n.ds=n.scale-t.gesture.prevScale,n.da=n.angle-t.gesture.prevAngle)}}),a.signals.on("new",function(e){e.gesture={start:{x:0,y:0},startDistance:0,prevDistance:0,distance:0,scale:1,startAngle:0,prevAngle:0}}),r.gesture=c,r.names.push("gesture"),i.merge(s.eventTypes,["gesturestart","gesturemove","gestureend"]),r.methodDict.gesture="gesturable",l.gesture=c.defaults,t.exports=c},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"./base":6}],10:[function(e,t,n){"use strict";function r(e,t,n,r,i,s,a){if(!t)return!1;if(!0===t){var l=o.is.number(s.width)?s.width:s.right-s.left,c=o.is.number(s.height)?s.height:s.bottom-s.top;if(l<0&&("left"===e?e="right":"right"===e&&(e="left")),c<0&&("top"===e?e="bottom":"bottom"===e&&(e="top")),"left"===e)return n.x<(l>=0?s.left:s.right)+a;if("top"===e)return n.y<(c>=0?s.top:s.bottom)+a;if("right"===e)return n.x>(l>=0?s.right:s.left)-a;if("bottom"===e)return n.y>(c>=0?s.bottom:s.top)-a}return!!o.is.element(r)&&(o.is.element(t)?t===r:o.matchesUpTo(r,t,i))}var i=e("./base"),o=e("../utils"),s=e("../utils/browser"),a=e("../InteractEvent"),l=e("../Interactable"),c=e("../Interaction"),p=e("../defaultOptions"),u=s.supportsTouch||s.supportsPointerEvent?20:10,d={defaults:{enabled:!1,mouseButtons:null,origin:null,snap:null,restrict:null,inertia:null,autoScroll:null,square:!1,preserveAspectRatio:!1,axis:"xy",margin:NaN,edges:null,invert:"none"},checker:function(e,t,n,i,s,a){if(!a)return null;var l=o.extend({},s.curCoords.page),c=n.options;if(c.resize.enabled){var p=c.resize,d={left:!1,right:!1,top:!1,bottom:!1};if(o.is.object(p.edges)){for(var f in d)d[f]=r(f,p.edges[f],l,s._eventTarget,i,a,p.margin||u);if(d.left=d.left&&!d.right,d.top=d.top&&!d.bottom,d.left||d.right||d.top||d.bottom)return{name:"resize",edges:d}}else{var v="y"!==c.resize.axis&&l.x>a.right-u,g="x"!==c.resize.axis&&l.y>a.bottom-u;if(v||g)return{name:"resize",axes:(v?"x":"")+(g?"y":"")}}}return null},cursors:s.isIe9OrOlder?{x:"e-resize",y:"s-resize",xy:"se-resize",top:"n-resize",left:"w-resize",bottom:"s-resize",right:"e-resize",topleft:"se-resize",bottomright:"se-resize",topright:"ne-resize",bottomleft:"ne-resize"}:{x:"ew-resize",y:"ns-resize",xy:"nwse-resize",top:"ns-resize",left:"ew-resize",bottom:"ns-resize",right:"ew-resize",topleft:"nwse-resize",bottomright:"nwse-resize",topright:"nesw-resize",bottomleft:"nesw-resize"},getCursor:function(e){if(e.axis)return d.cursors[e.name+e.axis];if(e.edges){for(var t="",n=["top","bottom","left","right"],r=0;r<4;r++)e.edges[n[r]]&&(t+=n[r]);return d.cursors[t]}}};a.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;if("resizestart"===t.type&&n.prepared.edges){var r=n.target.getRect(n.element),i=n.target.options.resize;if(i.square||i.preserveAspectRatio){var s=o.extend({},n.prepared.edges);s.top=s.top||s.left&&!s.bottom,s.left=s.left||s.top&&!s.right,s.bottom=s.bottom||s.right&&!s.top,s.right=s.right||s.bottom&&!s.left,n.prepared._linkedEdges=s}else n.prepared._linkedEdges=null;i.preserveAspectRatio&&(n.resizeStartAspectRatio=r.width/r.height),n.resizeRects={start:r,current:o.extend({},r),inverted:o.extend({},r),previous:o.extend({},r),delta:{left:0,right:0,width:0,top:0,bottom:0,height:0}},t.rect=n.resizeRects.inverted,t.deltaRect=n.resizeRects.delta}}),a.signals.on("new",function(e){var t=e.iEvent,n=e.phase,r=e.interaction;if("move"===n&&r.prepared.edges){var i=r.target.options.resize,s=i.invert,a="reposition"===s||"negate"===s,l=r.prepared.edges,c=r.resizeRects.start,p=r.resizeRects.current,u=r.resizeRects.inverted,d=r.resizeRects.delta,f=o.extend(r.resizeRects.previous,u),v=l,g=t.dx,h=t.dy;if(i.preserveAspectRatio||i.square){var m=i.preserveAspectRatio?r.resizeStartAspectRatio:1;l=r.prepared._linkedEdges,v.left&&v.bottom||v.right&&v.top?h=-g/m:v.left||v.right?h=g/m:(v.top||v.bottom)&&(g=h*m)}if(l.top&&(p.top+=h),l.bottom&&(p.bottom+=h),l.left&&(p.left+=g),l.right&&(p.right+=g),a){if(o.extend(u,p),"reposition"===s){var y=void 0;u.top>u.bottom&&(y=u.top,u.top=u.bottom,u.bottom=y),u.left>u.right&&(y=u.left,u.left=u.right,u.right=y)}}else u.top=Math.min(p.top,c.bottom),u.bottom=Math.max(p.bottom,c.top),u.left=Math.min(p.left,c.right),u.right=Math.max(p.right,c.left);u.width=u.right-u.left,u.height=u.bottom-u.top;for(var x in u)d[x]=u[x]-f[x];t.edges=r.prepared.edges,t.rect=u,t.deltaRect=d}}),l.prototype.resizable=function(e){return o.is.object(e)?(this.options.resize.enabled=!1!==e.enabled,this.setPerAction("resize",e),this.setOnEvents("resize",e),/^x$|^y$|^xy$/.test(e.axis)?this.options.resize.axis=e.axis:null===e.axis&&(this.options.resize.axis=p.resize.axis),o.is.bool(e.preserveAspectRatio)?this.options.resize.preserveAspectRatio=e.preserveAspectRatio:o.is.bool(e.square)&&(this.options.resize.square=e.square),this):o.is.bool(e)?(this.options.resize.enabled=e, +e||(this.onresizestart=this.onresizestart=this.onresizeend=null),this):this.options.resize},c.signals.on("new",function(e){e.resizeAxes="xy"}),a.signals.on("set-delta",function(e){var t=e.interaction,n=e.iEvent;"resize"===e.action&&t.resizeAxes&&(t.target.options.resize.square?("y"===t.resizeAxes?n.dx=n.dy:n.dy=n.dx,n.axes="xy"):(n.axes=t.resizeAxes,"x"===t.resizeAxes?n.dy=0:"y"===t.resizeAxes&&(n.dx=0)))}),i.resize=d,i.names.push("resize"),o.merge(l.eventTypes,["resizestart","resizemove","resizeinertiastart","resizeinertiaresume","resizeend"]),i.methodDict.resize="resizable",p.resize=d.defaults,t.exports=d},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"../utils/browser":37,"./base":6}],11:[function(e,t,n){"use strict";var r=e("./utils/raf"),i=e("./utils/window").getWindow,o=e("./utils/is"),s=e("./utils/domUtils"),a=e("./Interaction"),l=e("./defaultOptions"),c={defaults:{enabled:!1,container:null,margin:60,speed:300},interaction:null,i:null,x:0,y:0,isScrolling:!1,prevTime:0,start:function(e){c.isScrolling=!0,r.cancel(c.i),c.interaction=e,c.prevTime=(new Date).getTime(),c.i=r.request(c.scroll)},stop:function(){c.isScrolling=!1,r.cancel(c.i)},scroll:function(){var e=c.interaction.target.options[c.interaction.prepared.name].autoScroll,t=e.container||i(c.interaction.element),n=(new Date).getTime(),s=(n-c.prevTime)/1e3,a=e.speed*s;a>=1&&(o.window(t)?t.scrollBy(c.x*a,c.y*a):t&&(t.scrollLeft+=c.x*a,t.scrollTop+=c.y*a),c.prevTime=n),c.isScrolling&&(r.cancel(c.i),c.i=r.request(c.scroll))},check:function(e,t){var n=e.options;return n[t].autoScroll&&n[t].autoScroll.enabled},onInteractionMove:function(e){var t=e.interaction,n=e.pointer;if(t.interacting()&&c.check(t.target,t.prepared.name)){if(t.simulation)return void(c.x=c.y=0);var r=void 0,a=void 0,l=void 0,p=void 0,u=t.target.options[t.prepared.name].autoScroll,d=u.container||i(t.element);if(o.window(d))p=n.clientXd.innerWidth-c.margin,l=n.clientY>d.innerHeight-c.margin;else{var f=s.getElementClientRect(d);p=n.clientXf.right-c.margin,l=n.clientY>f.bottom-c.margin}c.x=a?1:p?-1:0,c.y=l?1:r?-1:0,c.isScrolling||(c.margin=u.margin,c.speed=u.speed,c.start(t))}}};a.signals.on("stop-active",function(){c.stop()}),a.signals.on("action-move",c.onInteractionMove),l.perAction.autoScroll=c.defaults,t.exports=c},{"./Interaction":5,"./defaultOptions":18,"./utils/domUtils":39,"./utils/is":46,"./utils/raf":50,"./utils/window":52}],12:[function(e,t,n){"use strict";var r=e("../Interactable"),i=e("../actions/base"),o=e("../utils/is"),s=e("../utils/domUtils");r.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},r.prototype.ignoreFrom=function(e){return this._backCompatOption("ignoreFrom",e)},r.prototype.allowFrom=function(e){return this._backCompatOption("allowFrom",e)},r.prototype.testIgnore=function(e,t,n){return!(!e||!o.element(n))&&(o.string(e)?s.matchesUpTo(n,e,t):!!o.element(e)&&s.nodeContains(e,n))},r.prototype.testAllow=function(e,t,n){return!e||!!o.element(n)&&(o.string(e)?s.matchesUpTo(n,e,t):!!o.element(e)&&s.nodeContains(e,n))},r.prototype.testIgnoreAllow=function(e,t,n){return!this.testIgnore(e.ignoreFrom,t,n)&&this.testAllow(e.allowFrom,t,n)},r.prototype.actionChecker=function(e){return o.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},r.prototype.styleCursor=function(e){return o.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},r.prototype.defaultActionChecker=function(e,t,n,r){for(var o=this.getRect(r),s=null,a=i.names,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var u=p;if((!n.pointerIsDown||!n.mouse||0!=(t.buttons&this.options[u].mouseButtons))&&(s=i[u].checker(e,t,this,r,n,o)))return s}}},{"../Interactable":4,"../actions/base":6,"../utils/domUtils":39,"../utils/is":46}],13:[function(e,t,n){"use strict";function r(e,t,n,r){return g.is.object(e)&&t.testIgnoreAllow(t.options[e.name],n,r)&&t.options[e.name].enabled&&a(t,n,e)?e:null}function i(e,t,n,i,o,s){for(var a=0,l=i.length;a=m.maxInteractions)return!1;if(u.target===e){if((a+=d===n.name|0)>=i)return!1;if(u.element===t&&(l++,d!==n.name||l>=o))return!1}}}return m.maxInteractions>0}}var l=e("../interact"),c=e("../Interactable"),p=e("../Interaction"),u=e("../actions/base"),d=e("../defaultOptions"),f=e("../utils/browser"),v=e("../scope"),g=e("../utils"),h=e("../utils/Signals").new();e("./InteractableMethods");var m={signals:h,withinInteractionLimit:a,maxInteractions:1/0,defaults:{perAction:{manualStart:!1,max:1/0,maxPerElement:1,allowFrom:null,ignoreFrom:null}},setActionDefaults:function(e){g.extend(e.defaults,m.defaults.perAction)}};p.signals.on("down",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;if(!t.interacting()){s(t,o(t,n,r,i))}}),p.signals.on("move",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;if(t.mouse&&!t.pointerIsDown&&!t.interacting()){s(t,o(t,n,r,i))}}),p.signals.on("move",function(e){var t=e.interaction,n=e.event;if(t.pointerIsDown&&!t.interacting()&&t.pointerWasMoved&&t.prepared.name){h.fire("before-start",e);var r=t.target;t.prepared.name&&r&&(r.options[t.prepared.name].manualStart||!a(r,t.element,t.prepared)?t.stop(n):t.start(t.prepared,r,t.element))}}),p.signals.on("stop",function(e){var t=e.interaction,n=t.target;n&&n.options.styleCursor&&(n._doc.documentElement.style.cursor="")}),c.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},c.prototype.actionChecker=function(e){return g.is.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},c.prototype.styleCursor=function(e){return g.is.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},c.prototype.defaultActionChecker=function(e,t,n,r){for(var i=this.getRect(r),o=t.buttons||{0:1,1:4,3:8,4:16}[t.button],s=null,a=u.names,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var d=p;if((!n.pointerIsDown||!n.mouse||0!=(o&this.options[d].mouseButtons))&&(s=u[d].checker(e,t,this,r,n,i)))return s}},l.maxInteractions=function(e){return g.is.number(e)?(m.maxInteractions=e,this):m.maxInteractions},c.settingsMethods.push("styleCursor"),c.settingsMethods.push("actionChecker"),c.settingsMethods.push("ignoreFrom"),c.settingsMethods.push("allowFrom"),d.base.actionChecker=null,d.base.styleCursor=!0,g.extend(d.perAction,m.defaults.perAction),t.exports=m},{"../Interactable":4,"../Interaction":5,"../actions/base":6,"../defaultOptions":18,"../interact":21,"../scope":34,"../utils":44,"../utils/Signals":35,"../utils/browser":37,"./InteractableMethods":12}],14:[function(e,t,n){"use strict";var r=e("./base"),i=e("../Interaction");i.signals.on("new",function(e){e.delayTimer=null}),r.signals.on("prepared",function(e){var t=e.interaction,n=t.prepared.name;if(n){var r=t.target.options[n].delay;r>0&&(t.delayTimer=setTimeout(function(){t.start(t.prepared,t.target,t.element)},r))}}),i.signals.on("move",function(e){var t=e.interaction,n=e.duplicate;t.pointerWasMoved&&!n&&clearTimeout(t.delayTimer)}),r.signals.on("before-start",function(e){var t=e.interaction,n=t.prepared.name;if(n){t.target.options[n].delay>0&&(t.prepared.name=null)}})},{"../Interaction":5,"./base":13}],15:[function(e,t,n){"use strict";function r(e,t){if(!t)return!1;var n=t.options.drag.startAxis;return"xy"===e||"xy"===n||n===e}var i=e("./base"),o=e("../scope"),s=e("../utils/browser"),a=e("../utils/is"),l=e("../utils/domUtils"),c=l.matchesSelector,p=l.parentNode;i.setActionDefaults(e("../actions/drag")),i.signals.on("before-start",function(e){var t=e.interaction,n=e.eventTarget,l=e.dx,u=e.dy;if("drag"===t.prepared.name){var d=Math.abs(l),f=Math.abs(u),v=t.target.options.drag,g=v.startAxis,h=d>f?"x":dl.minSpeed&&g>l.endSpeed,b={interaction:t,pageCoords:v,statuses:f,preEnd:!0,requireEndOnly:!0};y&&!x&&(c.resetStatuses(f),m=c.setAll(b),m.shouldMove&&m.locked&&(h=!0)),(x||h)&&(p.copyCoords(i.upCoords,t.curCoords),t.pointers[0]=i.startEvent=new a(t,n,t.prepared.name,"inertiastart",t.element),i.t0=d,i.active=!0,i.allowResume=l.allowResume,t.simulation=i,o.fire(i.startEvent),x?(i.vx0=t.pointerDelta.client.vx,i.vy0=t.pointerDelta.client.vy,i.v0=g,r(t,i),p.extend(v,t.curCoords.page),v.x+=i.xe,v.y+=i.ye,c.resetStatuses(f),m=c.setAll(b),i.modifiedXe+=m.dx,i.modifiedYe+=m.dy,i.i=u.request(t.boundInertiaFrame)):(i.smoothEnd=!0,i.xe=m.dx,i.ye=m.dy,i.sx=i.sy=0,i.i=u.request(t.boundSmoothEndFrame)))}}),l.signals.on("stop-active",function(e){var t=e.interaction,n=t.inertiaStatus;n.active&&(u.cancel(n.i),n.active=!1,t.simulation=null)})},{"./InteractEvent":3,"./Interaction":5,"./modifiers":24,"./utils":44,"./utils/raf":50}],21:[function(e,t,n){"use strict";function r(e,t){var n=a.interactables.get(e,t);return n||(n=new l(e,t),n.events.global=p),n}var i=e("./utils/browser"),o=e("./utils/events"),s=e("./utils"),a=e("./scope"),l=e("./Interactable"),c=e("./Interaction"),p={};r.isSet=function(e,t){return-1!==a.interactables.indexOfElement(e,t&&t.context)},r.on=function(e,t,n){if(s.is.string(e)&&-1!==e.search(" ")&&(e=e.trim().split(/ +/)),s.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.on(f,t,n)}return r}if(s.is.object(e)){for(var v in e)r.on(v,e[v],t);return r}return s.contains(l.eventTypes,e)?p[e]?p[e].push(t):p[e]=[t]:o.add(a.document,e,t,{options:n}),r},r.off=function(e,t,n){if(s.is.string(e)&&-1!==e.search(" ")&&(e=e.trim().split(/ +/)),s.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.off(f,t,n)}return r}if(s.is.object(e)){for(var v in e)r.off(v,e[v],t);return r}if(s.contains(l.eventTypes,e)){var g=void 0;e in p&&-1!==(g=s.indexOf(p[e],t))&&p[e].splice(g,1)}else o.remove(a.document,e,t,n);return r},r.debug=function(){return a},r.getPointerAverage=s.pointerAverage,r.getTouchBBox=s.touchBBox,r.getTouchDistance=s.touchDistance,r.getTouchAngle=s.touchAngle,r.getElementRect=s.getElementRect,r.getElementClientRect=s.getElementClientRect,r.matchesSelector=s.matchesSelector,r.closest=s.closest,r.supportsTouch=function(){return i.supportsTouch},r.supportsPointerEvent=function(){return i.supportsPointerEvent},r.stop=function(e){for(var t=a.interactions.length-1;t>=0;t--)a.interactions[t].stop(e);return r},r.pointerMoveTolerance=function(e){return s.is.number(e)?(c.pointerMoveTolerance=e,this):c.pointerMoveTolerance},r.addDocument=a.addDocument,r.removeDocument=a.removeDocument,a.interact=r,t.exports=r},{"./Interactable":4,"./Interaction":5,"./scope":34,"./utils":44,"./utils/browser":37,"./utils/events":40}],22:[function(e,t,n){"use strict";function r(e){var t=e.interaction,n=e.event;t.target&&t.target.checkAndPreventDefault(n)}var i=e("./Interactable"),o=e("./Interaction"),s=e("./scope"),a=e("./utils/is"),l=e("./utils/events"),c=e("./utils/domUtils"),p=c.nodeContains,u=c.matchesSelector;i.prototype.preventDefault=function(e){return/^(always|never|auto)$/.test(e)?(this.options.preventDefault=e,this):a.bool(e)?(this.options.preventDefault=e?"always":"never",this):this.options.preventDefault},i.prototype.checkAndPreventDefault=function(e){var t=this.options.preventDefault;if("never"!==t)return"always"===t?void e.preventDefault():void(l.supportsOptions||/^(mouse|pointer|touch)*(down|start)/i.test(e.type)||a.element(e.target)&&u(e.target,"input,select,textarea,[contenteditable=true],[contenteditable=true] *")||e.preventDefault())};for(var d=["down","move","up","cancel"],f=0;f=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i;if(o.element&&(o.element===e.target||p(o.element,e.target)))return void o.target.checkAndPreventDefault(e)}}},{"./Interactable":4,"./Interaction":5,"./scope":34,"./utils/domUtils":39,"./utils/events":40,"./utils/is":46}],23:[function(e,t,n){"use strict";function r(e){var t=e.target,n=a.search(e,e.type,t);n&&n.prevTap&&e.clientX===n.prevTap.clientX&&e.clientY===n.prevTap.clientY&&t===n.prevTap.target&&(n.downTargets[0]=t,n.downTimes[0]=(new Date).getTime(),l.fire({interaction:n,event:e,eventTarget:t,pointer:e,type:"tap"}))}var i=e("./scope"),o=e("./utils/events"),s=e("./utils/browser"),a=e("./utils/interactionFinder"),l=e("./pointerEvents/base"),c=e("./utils/window"),p=c.window,u=Object.prototype.toString;if(p.Array.isArray||(p.Array.isArray=function(e){return"[object Array]"===u.call(e)}),String.prototype.trim||(String.prototype.trim=function(){return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")}),s.isIE8){var d=function(e){for(var t=i.interactions,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var o;if(n){if(r>=t.length)break;o=t[r++]}else{if(r=t.next(),r.done)break;o=r.value}var s=o;s.interacting()&&s.target.checkAndPreventDefault(e)}},f=function(e,t){var n=e.doc,i=(e.win,0===t.indexOf("listen")?o.add:o.remove);i(n,"selectstart",d),l&&i(n,"dblclick",r)};i.signals.on("add-document",f),i.signals.on("remove-document",f)}t.exports=null},{"./pointerEvents/base":31,"./scope":34,"./utils/browser":37,"./utils/events":40,"./utils/interactionFinder":45,"./utils/window":52}],24:[function(e,t,n){"use strict";function r(e,t,n){return e&&e.enabled&&(t||!e.endOnly)&&(!n||e.endOnly)}var i=e("../InteractEvent"),o=e("../Interaction"),s=e("../utils/extend"),a={names:[],setOffsets:function(e){var t=e.interaction,n=e.pageCoords,r=t.target,i=t.element,o=t.startOffset,s=r.getRect(i);s?(o.left=n.x-s.left,o.top=n.y-s.top,o.right=s.right-n.x,o.bottom=s.bottom-n.y,"width"in s||(s.width=s.right-s.left),"height"in s||(s.height=s.bottom-s.top)):o.left=o.top=o.right=o.bottom=0,e.rect=s,e.interactable=r,e.element=i;for(var l=0;l=p.length)break;f=p[d++]}else{if(d=p.next(),d.done)break;f=d.value}var v=f,g=a[v],h=t.target.options[t.prepared.name][v];r(h,i,o)&&(e.status=e.status=n[v],e.options=h,e.offset=e.interaction.modifierOffsets[v],g.set(e),e.status.locked&&(l.x+=e.status.dx,l.y+=e.status.dy,c.dx+=e.status.dx,c.dy+=e.status.dy,c.locked=!0))}return c.shouldMove=!e.status||!c.locked||e.status.changed,c},resetStatuses:function(e){for(var t=a.names,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var i;if(n){if(r>=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i,s=e[o]||{};s.dx=s.dy=0,s.modifiedX=s.modifiedY=NaN,s.locked=!1,s.changed=!0,e[o]=s}return e},start:function(e,t){var n=e.interaction,r={interaction:n,pageCoords:("action-resume"===t?n.curCoords:n.startCoords).page,startOffset:n.startOffset,statuses:n.modifierStatuses,preEnd:!1,requireEndOnly:!1};a.setOffsets(r),a.resetStatuses(r.statuses),r.pageCoords=s({},n.startCoords.page),n.modifierResult=a.setAll(r)}};o.signals.on("new",function(e){e.startOffset={left:0,right:0,top:0,bottom:0},e.modifierOffsets={},e.modifierStatuses=a.resetStatuses({}),e.modifierResult=null}),o.signals.on("action-start",a.start),o.signals.on("action-resume",a.start),o.signals.on("before-action-move",function(e){var t=e.interaction,n=e.preEnd,r=e.interactingBeforeMove,i=a.setAll({interaction:t,preEnd:n,pageCoords:t.curCoords.page,statuses:t.modifierStatuses,requireEndOnly:!1});!i.shouldMove&&r&&(t._dontFireMove=!0),t.modifierResult=i}),o.signals.on("action-end",function(e){for(var t=e.interaction,n=e.event,i=0;i=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}var m=h,y=m.x,x=m.y;l.push({x:s.left-i.width*y+u.x,y:s.top-i.height*x+u.y})}else l.push(u);return l},set:function(e){var t=e.interaction,n=e.pageCoords,r=e.status,i=e.options,s=e.offset,a=[],l=void 0,c=void 0,p=void 0;if(r.useStatusXY)c={x:r.x,y:r.y};else{var u=o.getOriginXY(t.target,t.element,t.prepared.name);c=o.extend({},n),c.x-=u.x,c.y-=u.y}r.realX=c.x,r.realY=c.y;for(var d=i.targets?i.targets.length:0,f=s,v=Array.isArray(f),g=0,f=v?f:f[Symbol.iterator]();;){var h;if(v){if(g>=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}for(var m=h,y=m.x,x=m.y,b=c.x-y,w=c.y-x,E=i.targets,S=Array.isArray(E),T=0,E=S?E:E[Symbol.iterator]();;){var C;if(S){if(T>=E.length)break;C=E[T++]}else{if(T=E.next(),T.done)break;C=T.value}var A=C;l=o.is.function(A)?A(b,w,t):A,l&&a.push({x:o.is.number(l.x)?l.x+y:b,y:o.is.number(l.y)?l.y+x:w,range:o.is.number(l.range)?l.range:i.range})}}var D={target:null,inRange:!1,distance:0,range:0,dx:0,dy:0};for(p=0,d=a.length;p=p.length)break;f=p[d++]}else{if(d=p.next(),d.done)break;f=d.value}var v=f,g=void 0;g=a.is.function(v)?v(l,c,t):v,g&&("width"in g&&"height"in g&&(g.x=g.width, +g.y=g.height),e.options.targets.push(g))}i.set(e)},modifyCoords:function(e){var t=e.options;e.options=a.extend({},t),e.options.enabled=t.enabled,e.options.relativePoints=[null],i.modifyCoords(e)}};r.snapSize=l,r.names.push("snapSize"),o.perAction.snapSize=l.defaults,s.defaults.snapSize=l.defaults,t.exports=l},{"../actions/resize":10,"../defaultOptions":18,"../utils/":44,"./index":24,"./snap":28}],30:[function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=e("../utils/pointerUtils");t.exports=function(){function e(t,n,o,s,a){if(r(this,e),i.pointerExtend(this,o),o!==n&&i.pointerExtend(this,n),this.interaction=a,this.timeStamp=(new Date).getTime(),this.originalEvent=o,this.type=t,this.pointerId=i.getPointerId(n),this.pointerType=i.getPointerType(n),this.target=s,this.currentTarget=null,"tap"===t){var l=a.getPointerIndex(n);this.dt=this.timeStamp-a.downTimes[l];var c=this.timeStamp-a.tapTime;this.double=!!(a.prevTap&&"doubletap"!==a.prevTap.type&&a.prevTap.target===this.target&&c<500)}else"doubletap"===t&&(this.dt=n.timeStamp-a.tapTime)}return e.prototype.subtractOrigin=function(e){var t=e.x,n=e.y;return this.pageX-=t,this.pageY-=n,this.clientX-=t,this.clientY-=n,this},e.prototype.addOrigin=function(e){var t=e.x,n=e.y;return this.pageX+=t,this.pageY+=n,this.clientX+=t,this.clientY+=n,this},e.prototype.preventDefault=function(){this.originalEvent.preventDefault()},e.prototype.stopPropagation=function(){this.propagationStopped=!0},e.prototype.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},e}()},{"../utils/pointerUtils":49}],31:[function(e,t,n){"use strict";function r(e){for(var t=e.interaction,n=e.pointer,s=e.event,l=e.eventTarget,c=e.type,u=void 0===c?e.pointerEvent.type:c,d=e.targets,f=void 0===d?i(e):d,v=e.pointerEvent,g=void 0===v?new o(u,n,s,l,t):v,h={interaction:t,pointer:n,event:s,eventTarget:l,targets:f,type:u,pointerEvent:g},m=0;m=u.length)break;g=u[v++]}else{if(v=u.next(),v.done)break;g=v.value}var h=g;c.element=h,p.fire("collect-targets",c)}return"hold"===o&&(c.targets=d(c.targets,function(e){return e.eventable.options.holdDuration===t.holdTimers[s].duration})),c.targets}var o=e("./PointerEvent"),s=e("../Interaction"),a=e("../utils"),l=e("../utils/browser"),c=e("../defaultOptions"),p=e("../utils/Signals").new(),u=e("../utils/arr"),d=u.filter,f=["down","up","cancel"],v=["down","up","cancel"],g={PointerEvent:o,fire:r,collectEventTargets:i,signals:p,defaults:{holdDuration:600,ignoreFrom:null,allowFrom:null,origin:{x:0,y:0}},types:["down","move","up","cancel","tap","doubletap","hold"]};s.signals.on("update-pointer-down",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers[n]={duration:1/0,timeout:null}}),s.signals.on("remove-pointer",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers.splice(n,1)}),s.signals.on("move",function(e){var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,s=e.duplicateMove,a=t.getPointerIndex(n);s||t.pointerIsDown&&!t.pointerWasMoved||(t.pointerIsDown&&clearTimeout(t.holdTimers[a].timeout),r({interaction:t,pointer:n,event:i,eventTarget:o,type:"move"}))}),s.signals.on("down",function(e){for(var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,s=e.pointerIndex,c=l.isIE8?a.extend({},i):i,u=t.holdTimers[s],d=a.getPath(o),f={interaction:t,pointer:n,event:i,eventTarget:o,type:"hold",targets:[],path:d,element:null},v=d,g=Array.isArray(v),h=0,v=g?v:v[Symbol.iterator]();;){var m;if(g){if(h>=v.length)break;m=v[h++]}else{if(h=v.next(),h.done)break;m=h.value}var y=m;f.element=y,p.fire("collect-targets",f)}if(f.targets.length){for(var x=1/0,b=0;b=0&&(p.selectors[u]!==e||p.contexts[u]!==t);u--);-1===u&&(u=p.selectors.length,p.selectors.push(e),p.contexts.push(t),p.listeners.push([])),p.listeners[u].push([i,!!s.capture,s.passive])}function s(e,t,n,r,o){var s=f(o),c=O[n],p=!1,u=void 0;if(c)for(u=c.selectors.length-1;u>=0;u--)if(c.selectors[u]===e&&c.contexts[u]===t){for(var d=c.listeners[u],v=d.length-1;v>=0;v--){var g=d[v],h=g[0],m=g[1],y=g[2];if(h===r&&m===!!s.capture&&y===s.passive){d.splice(v,1),d.length||(c.selectors.splice(u,1),c.contexts.splice(u,1),c.listeners.splice(u,1),i(t,n,a),i(t,n,l,!0),c.selectors.length||(O[n]=null)),p=!0;break}}if(p)break}}function a(e,t){var n=f(t),r={},i=O[e.type],o=g.getActualElement(e.path?e.path[0]:e.target),s=o;for(h(r,e),r.originalEvent=e,r.preventDefault=p;v.element(s);){for(var a=0;a=l.length)break;u=l[p++]}else{if(p=l.next(),p.done)break;u=p.value}var d=u,f=o[d](a);if(f)return f}},simulationResume:function(e){var t=e.pointerType,n=e.eventType,o=e.eventTarget;if(!/down|start/i.test(n))return null;for(var s=r.interactions,a=Array.isArray(s),l=0,s=a?s:s[Symbol.iterator]();;){var c;if(a){if(l>=s.length)break;c=s[l++]}else{if(l=s.next(),l.done)break;c=l.value}var p=c,u=o;if(p.simulation&&p.simulation.allowResume&&p.pointerType===t)for(;u;){if(u===p.element)return p;u=i.parentNode(u)}}return null},mouseOrPen:function(e){var t=e.pointerId,n=e.pointerType,o=e.eventType;if("mouse"!==n&&"pen"!==n)return null;for(var s=void 0,a=r.interactions,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var u=p;if(u.pointerType===n){if(u.simulation&&!i.contains(u.pointerIds,t))continue;if(u.interacting())return u;s||(s=u)}}if(s)return s;for(var d=r.interactions,f=Array.isArray(d),v=0,d=f?d:d[Symbol.iterator]();;){var g;if(f){if(v>=d.length)break;g=d[v++]}else{if(v=d.next(),v.done)break;g=v.value}var h=g;if(!(h.pointerType!==n||/down/i.test(o)&&h.simulation))return h}return null},hasPointer:function(e){for(var t=e.pointerId,n=r.interactions,o=Array.isArray(n),s=0,n=o?n:n[Symbol.iterator]();;){var a;if(o){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var l=a;if(i.contains(l.pointerIds,t))return l}},idle:function(e){for(var t=e.pointerType,n=r.interactions,i=Array.isArray(n),o=0,n=i?n:n[Symbol.iterator]();;){var s;if(i){if(o>=n.length)break;s=n[o++]}else{if(o=n.next(),o.done)break;s=o.value}var a=s;if(1===a.pointerIds.length){var l=a.target;if(l&&!l.options.gesture.enabled)continue}else if(a.pointerIds.length>=2)continue;if(!a.interacting()&&t===a.pointerType)return a}return null}};t.exports=o},{"../scope":34,"./index":44}],46:[function(e,t,n){"use strict";var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},i=e("./window"),o=e("./isWindow"),s={array:function(){},window:function(e){return e===i.window||o(e)},docFrag:function(e){return s.object(e)&&11===e.nodeType},object:function(e){return!!e&&"object"===(void 0===e?"undefined":r(e))},function:function(e){return"function"==typeof e},number:function(e){return"number"==typeof e},bool:function(e){return"boolean"==typeof e},string:function(e){return"string"==typeof e},element:function(e){if(!e||"object"!==(void 0===e?"undefined":r(e)))return!1;var t=i.getWindow(e)||i.window;return/object|function/.test(r(t.Element))?e instanceof t.Element:1===e.nodeType&&"string"==typeof e.nodeName}};s.array=function(e){return s.object(e)&&void 0!==e.length&&s.function(e.splice)},t.exports=s},{"./isWindow":47,"./window":52}],47:[function(e,t,n){"use strict";t.exports=function(e){return!(!e||!e.Window)&&e instanceof e.Window}},{}],48:[function(e,t,n){"use strict";function r(e,n){for(var r in n){var i=t.exports.prefixedPropREs,o=!1;for(var s in i)if(0===r.indexOf(s)&&i[s].test(r)){o=!0;break}o||"function"==typeof n[r]||(e[r]=n[r])}return e}r.prefixedPropREs={webkit:/(Movement[XY]|Radius[XY]|RotationAngle|Force)$/},t.exports=r},{}],49:[function(e,t,n){"use strict";var r=e("./hypot"),i=e("./browser"),o=e("./domObjects"),s=e("./domUtils"),a=e("./domObjects"),l=e("./is"),c=e("./pointerExtend"),p={copyCoords:function(e,t){e.page=e.page||{},e.page.x=t.page.x,e.page.y=t.page.y,e.client=e.client||{},e.client.x=t.client.x,e.client.y=t.client.y,e.timeStamp=t.timeStamp},setCoordDeltas:function(e,t,n){e.page.x=n.page.x-t.page.x,e.page.y=n.page.y-t.page.y,e.client.x=n.client.x-t.client.x,e.client.y=n.client.y-t.client.y,e.timeStamp=n.timeStamp-t.timeStamp;var i=Math.max(e.timeStamp/1e3,.001);e.page.speed=r(e.page.x,e.page.y)/i,e.page.vx=e.page.x/i,e.page.vy=e.page.y/i,e.client.speed=r(e.client.x,e.page.y)/i,e.client.vx=e.client.x/i,e.client.vy=e.client.y/i},isNativePointer:function(e){return e instanceof o.Event||e instanceof o.Touch},getXY:function(e,t,n){return n=n||{},e=e||"page",n.x=t[e+"X"],n.y=t[e+"Y"],n},getPageXY:function(e,t){return t=t||{},i.isOperaMobile&&p.isNativePointer(e)?(p.getXY("screen",e,t),t.x+=window.scrollX,t.y+=window.scrollY):p.getXY("page",e,t),t},getClientXY:function(e,t){return t=t||{},i.isOperaMobile&&p.isNativePointer(e)?p.getXY("screen",e,t):p.getXY("client",e,t),t},getPointerId:function(e){return l.number(e.pointerId)?e.pointerId:e.identifier},setCoords:function(e,t,n){var r=t.length>1?p.pointerAverage(t):t[0],i={};p.getPageXY(r,i),e.page.x=i.x,e.page.y=i.y,p.getClientXY(r,i),e.client.x=i.x,e.client.y=i.y,e.timeStamp=l.number(n)?n:(new Date).getTime()},pointerExtend:c,getTouchPair:function(e){var t=[];return l.array(e)?(t[0]=e[0],t[1]=e[1]):"touchend"===e.type?1===e.touches.length?(t[0]=e.touches[0],t[1]=e.changedTouches[0]):0===e.touches.length&&(t[0]=e.changedTouches[0],t[1]=e.changedTouches[1]):(t[0]=e.touches[0],t[1]=e.touches[1]),t},pointerAverage:function(e){for(var t={pageX:0,pageY:0,clientX:0,clientY:0,screenX:0,screenY:0},n=e,r=Array.isArray(n),i=0,n=r?n:n[Symbol.iterator]();;){var o;if(r){if(i>=n.length)break;o=n[i++]}else{if(i=n.next(),i.done)break;o=i.value}var s=o;for(var a in t)t[a]+=s[a]}for(var l in t)t[l]/=e.length;return t},touchBBox:function(e){if(e.length||e.touches&&e.touches.length>1){var t=p.getTouchPair(e),n=Math.min(t[0].pageX,t[1].pageX),r=Math.min(t[0].pageY,t[1].pageY);return{x:n,y:r,left:n,top:r,width:Math.max(t[0].pageX,t[1].pageX)-n,height:Math.max(t[0].pageY,t[1].pageY)-r}}},touchDistance:function(e,t){var n=t+"X",i=t+"Y",o=p.getTouchPair(e),s=o[0][n]-o[1][n],a=o[0][i]-o[1][i];return r(s,a)},touchAngle:function(e,t,n){var r=n+"X",i=n+"Y",o=p.getTouchPair(e),s=o[1][r]-o[0][r],a=o[1][i]-o[0][i];return 180*Math.atan2(a,s)/Math.PI},getPointerType:function(e){return l.string(e.pointerType)?e.pointerType:l.number(e.pointerType)?[void 0,void 0,"touch","pen","mouse"][e.pointerType]:/touch/.test(e.type)||e instanceof a.Touch?"touch":"mouse"},getEventTargets:function(e){return[s.getActualElement(e.path?e.path[0]:e.target),s.getActualElement(e.currentTarget)]}};t.exports=p},{"./browser":37,"./domObjects":38,"./domUtils":39,"./hypot":43,"./is":46,"./pointerExtend":48}],50:[function(e,t,n){"use strict";for(var r=e("./window"),i=r.window,o=["ms","moz","webkit","o"],s=0,a=void 0,l=void 0,c=0;c\n * Open source under the MIT License.\n * https://raw.github.com/taye/interact.js/master/LICENSE\n */\n","/*\n * In a (windowless) server environment this file exports a factory function\n * that takes the window to use.\n *\n * var interact = require('interact.js')(windowObject);\n *\n * See https://github.com/taye/interact.js/issues/187\n */\nif (typeof window === 'undefined') {\n module.exports = function (window) {\n require('./src/utils/window').init(window);\n\n return require('./src/index');\n };\n}\nelse {\n module.exports = require('./src/index');\n}\n","const { indexOf } = require('./utils/arr');\nconst extend = require('./utils/extend.js');\n\nfunction fireUntilImmediateStopped (event, listeners) {\n for (let i = 0, len = listeners.length; i < len && !event.immediatePropagationStopped; i++) {\n listeners[i](event);\n }\n}\n\nclass Eventable {\n\n constructor (options) {\n this.options = extend({}, options || {});\n }\n\n fire (event) {\n let listeners;\n const onEvent = 'on' + event.type;\n const global = this.global;\n\n // Interactable#on() listeners\n if ((listeners = this[event.type])) {\n fireUntilImmediateStopped(event, listeners);\n }\n\n // interactable.onevent listener\n if (this[onEvent]) {\n this[onEvent](event);\n }\n\n // interact.on() listeners\n if (!event.propagationStopped && global && (listeners = global[event.type])) {\n fireUntilImmediateStopped(event, listeners);\n }\n }\n\n on (eventType, listener) {\n // if this type of event was never bound\n if (this[eventType]) {\n this[eventType].push(listener);\n }\n else {\n this[eventType] = [listener];\n }\n }\n\n off (eventType, listener) {\n // if it is an action event type\n const eventList = this[eventType];\n const index = eventList? indexOf(eventList, listener) : -1;\n\n if (index !== -1) {\n eventList.splice(index, 1);\n }\n\n if (eventList && eventList.length === 0 || !listener) {\n this[eventType] = listener;\n }\n }\n}\n\nmodule.exports = Eventable;\n","const extend = require('./utils/extend');\nconst getOriginXY = require('./utils/getOriginXY');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nclass InteractEvent {\n constructor (interaction, event, action, phase, element, related, preEnd = false) {\n const target = interaction.target;\n const deltaSource = (target && target.options || defaults).deltaSource;\n const origin = getOriginXY(target, element, action);\n const starting = phase === 'start';\n const ending = phase === 'end';\n const coords = starting? interaction.startCoords : interaction.curCoords;\n const prevEvent = interaction.prevEvent;\n\n element = element || interaction.element;\n\n const page = extend({}, coords.page);\n const client = extend({}, coords.client);\n\n page.x -= origin.x;\n page.y -= origin.y;\n\n client.x -= origin.x;\n client.y -= origin.y;\n\n this.ctrlKey = event.ctrlKey;\n this.altKey = event.altKey;\n this.shiftKey = event.shiftKey;\n this.metaKey = event.metaKey;\n this.button = event.button;\n this.buttons = event.buttons;\n this.target = element;\n this.currentTarget = element;\n this.relatedTarget = related || null;\n this.preEnd = preEnd;\n this.type = action + (phase || '');\n this.interaction = interaction;\n this.interactable = target;\n\n this.t0 = starting ? interaction.downTimes[interaction.downTimes.length - 1]\n : prevEvent.t0;\n\n const signalArg = {\n interaction,\n event,\n action,\n phase,\n element,\n related,\n page,\n client,\n coords,\n starting,\n ending,\n deltaSource,\n iEvent: this,\n };\n\n signals.fire('set-xy', signalArg);\n\n if (ending) {\n // use previous coords when ending\n this.pageX = prevEvent.pageX;\n this.pageY = prevEvent.pageY;\n this.clientX = prevEvent.clientX;\n this.clientY = prevEvent.clientY;\n }\n else {\n this.pageX = page.x;\n this.pageY = page.y;\n this.clientX = client.x;\n this.clientY = client.y;\n }\n\n this.x0 = interaction.startCoords.page.x - origin.x;\n this.y0 = interaction.startCoords.page.y - origin.y;\n this.clientX0 = interaction.startCoords.client.x - origin.x;\n this.clientY0 = interaction.startCoords.client.y - origin.y;\n\n signals.fire('set-delta', signalArg);\n\n this.timeStamp = coords.timeStamp;\n this.dt = interaction.pointerDelta.timeStamp;\n this.duration = this.timeStamp - this.t0;\n\n // speed and velocity in pixels per second\n this.speed = interaction.pointerDelta[deltaSource].speed;\n this.velocityX = interaction.pointerDelta[deltaSource].vx;\n this.velocityY = interaction.pointerDelta[deltaSource].vy;\n\n this.swipe = (ending || phase === 'inertiastart')? this.getSwipe() : null;\n\n signals.fire('new', signalArg);\n }\n\n getSwipe () {\n const interaction = this.interaction;\n\n if (interaction.prevEvent.speed < 600\n || this.timeStamp - interaction.prevEvent.timeStamp > 150) {\n return null;\n }\n\n let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI;\n const overlap = 22.5;\n\n if (angle < 0) {\n angle += 360;\n }\n\n const left = 135 - overlap <= angle && angle < 225 + overlap;\n const up = 225 - overlap <= angle && angle < 315 + overlap;\n\n const right = !left && (315 - overlap <= angle || angle < 45 + overlap);\n const down = !up && 45 - overlap <= angle && angle < 135 + overlap;\n\n return {\n up,\n down,\n left,\n right,\n angle,\n speed: interaction.prevEvent.speed,\n velocity: {\n x: interaction.prevEvent.velocityX,\n y: interaction.prevEvent.velocityY,\n },\n };\n }\n\n preventDefault () {}\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n}\n\nsignals.on('set-delta', function ({ iEvent, interaction, starting, deltaSource }) {\n const prevEvent = starting? iEvent : interaction.prevEvent;\n\n if (deltaSource === 'client') {\n iEvent.dx = iEvent.clientX - prevEvent.clientX;\n iEvent.dy = iEvent.clientY - prevEvent.clientY;\n }\n else {\n iEvent.dx = iEvent.pageX - prevEvent.pageX;\n iEvent.dy = iEvent.pageY - prevEvent.pageY;\n }\n});\n\nInteractEvent.signals = signals;\n\nmodule.exports = InteractEvent;\n","const is = require('./utils/is');\nconst events = require('./utils/events');\nconst extend = require('./utils/extend');\nconst actions = require('./actions/base');\nconst scope = require('./scope');\nconst Eventable = require('./Eventable');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nconst {\n getElementRect,\n nodeContains,\n trySelector,\n} = require('./utils/domUtils');\nconst { getWindow } = require('./utils/window');\nconst { indexOf, contains } = require('./utils/arr');\nconst { wheelEvent } = require('./utils/browser');\n\n// all set interactables\nscope.interactables = [];\n\n/*\\\n * Interactable\n [ property ]\n **\n * Object type returned by @interact\n\\*/\nclass Interactable {\n constructor (target, options) {\n options = options || {};\n\n this.target = target;\n this.events = new Eventable();\n this._context = options.context || scope.document;\n this._win = getWindow(trySelector(target)? this._context : target);\n this._doc = this._win.document;\n\n signals.fire('new', {\n target,\n options,\n interactable: this,\n win: this._win,\n });\n\n scope.addDocument( this._doc, this._win );\n\n scope.interactables.push(this);\n\n this.set(options);\n }\n\n setOnEvents (action, phases) {\n const onAction = 'on' + action;\n\n if (is.function(phases.onstart) ) { this.events[onAction + 'start' ] = phases.onstart ; }\n if (is.function(phases.onmove) ) { this.events[onAction + 'move' ] = phases.onmove ; }\n if (is.function(phases.onend) ) { this.events[onAction + 'end' ] = phases.onend ; }\n if (is.function(phases.oninertiastart)) { this.events[onAction + 'inertiastart' ] = phases.oninertiastart ; }\n\n return this;\n }\n\n setPerAction (action, options) {\n // for all the default per-action options\n for (const option in options) {\n // if this option exists for this action\n if (option in defaults[action]) {\n // if the option in the options arg is an object value\n if (is.object(options[option])) {\n // duplicate the object\n this.options[action][option] = extend(this.options[action][option] || {}, options[option]);\n\n if (is.object(defaults.perAction[option]) && 'enabled' in defaults.perAction[option]) {\n this.options[action][option].enabled = options[option].enabled === false? false : true;\n }\n }\n else if (is.bool(options[option]) && is.object(defaults.perAction[option])) {\n this.options[action][option].enabled = options[option];\n }\n else if (options[option] !== undefined) {\n // or if it's not undefined, do a plain assignment\n this.options[action][option] = options[option];\n }\n }\n }\n }\n\n /*\\\n * Interactable.getRect\n [ method ]\n *\n * The default function to get an Interactables bounding rect. Can be\n * overridden using @Interactable.rectChecker.\n *\n - element (Element) #optional The element to measure.\n = (object) The object's bounding rectangle.\n o {\n o top : 0,\n o left : 0,\n o bottom: 0,\n o right : 0,\n o width : 0,\n o height: 0\n o }\n \\*/\n getRect (element) {\n element = element || this.target;\n\n if (is.string(this.target) && !(is.element(element))) {\n element = this._context.querySelector(this.target);\n }\n\n return getElementRect(element);\n }\n\n /*\\\n * Interactable.rectChecker\n [ method ]\n *\n * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n - checker (function) #optional A function which returns this Interactable's bounding rectangle. See @Interactable.getRect\n = (function | object) The checker function or this Interactable\n \\*/\n rectChecker (checker) {\n if (is.function(checker)) {\n this.getRect = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.getRect;\n\n return this;\n }\n\n return this.getRect;\n }\n\n _backCompatOption (optionName, newValue) {\n if (trySelector(newValue) || is.object(newValue)) {\n this.options[optionName] = newValue;\n\n for (const action of actions.names) {\n this.options[action][optionName] = newValue;\n }\n\n return this;\n }\n\n return this.options[optionName];\n }\n\n /*\\\n * Interactable.origin\n [ method ]\n *\n * Gets or sets the origin of the Interactable's element. The x and y\n * of the origin will be subtracted from action event coordinates.\n *\n - origin (object | string) #optional An object eg. { x: 0, y: 0 } or string 'parent', 'self' or any CSS selector\n * OR\n - origin (Element) #optional An HTML or SVG Element whose rect will be used\n **\n = (object) The current origin or this Interactable\n \\*/\n origin (newValue) {\n return this._backCompatOption('origin', newValue);\n }\n\n /*\\\n * Interactable.deltaSource\n [ method ]\n *\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n - newValue (string) #optional Use 'client' if you will be scrolling while interacting; Use 'page' if you want autoScroll to work\n = (string | object) The current deltaSource or this Interactable\n \\*/\n deltaSource (newValue) {\n if (newValue === 'page' || newValue === 'client') {\n this.options.deltaSource = newValue;\n\n return this;\n }\n\n return this.options.deltaSource;\n }\n\n /*\\\n * Interactable.context\n [ method ]\n *\n * Gets the selector context Node of the Interactable. The default is `window.document`.\n *\n = (Node) The context Node of this Interactable\n **\n \\*/\n context () {\n return this._context;\n }\n\n inContext (element) {\n return (this._context === element.ownerDocument\n || nodeContains(this._context, element));\n }\n\n /*\\\n * Interactable.fire\n [ method ]\n *\n * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n - iEvent (InteractEvent) The InteractEvent object to be fired on this Interactable\n = (Interactable) this Interactable\n \\*/\n fire (iEvent) {\n this.events.fire(iEvent);\n\n return this;\n }\n\n _onOffMultiple (method, eventType, listener, options) {\n if (is.string(eventType) && eventType.search(' ') !== -1) {\n eventType = eventType.trim().split(/ +/);\n }\n\n if (is.array(eventType)) {\n for (let i = 0; i < eventType.length; i++) {\n this[method](eventType[i], listener, options);\n }\n\n return true;\n }\n\n if (is.object(eventType)) {\n for (const prop in eventType) {\n this[method](prop, eventType[prop], listener);\n }\n\n return true;\n }\n }\n\n /*\\\n * Interactable.on\n [ method ]\n *\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n - eventType (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) This Interactable\n \\*/\n on (eventType, listener, options) {\n if (this._onOffMultiple('on', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.on(eventType, listener);\n }\n // delegated event for selector\n else if (is.string(this.target)) {\n events.addDelegate(this.target, this._context, eventType, listener, options);\n }\n else {\n events.add(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.off\n [ method ]\n *\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n - eventType (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) This Interactable\n \\*/\n off (eventType, listener, options) {\n if (this._onOffMultiple('off', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n // if it is an action event type\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.off(eventType, listener);\n }\n // delegated event\n else if (is.string(this.target)) {\n events.removeDelegate(this.target, this._context, eventType, listener, options);\n }\n // remove listener from this Interatable's element\n else {\n events.remove(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.set\n [ method ]\n *\n * Reset the options of this Interactable\n - options (object) The new settings to apply\n = (object) This Interactable\n \\*/\n set (options) {\n if (!is.object(options)) {\n options = {};\n }\n\n this.options = extend({}, defaults.base);\n\n const perActions = extend({}, defaults.perAction);\n\n for (const actionName in actions.methodDict) {\n const methodName = actions.methodDict[actionName];\n\n this.options[actionName] = extend({}, defaults[actionName]);\n\n this.setPerAction(actionName, perActions);\n\n this[methodName](options[actionName]);\n }\n\n for (const setting of Interactable.settingsMethods) {\n this.options[setting] = defaults.base[setting];\n\n if (setting in options) {\n this[setting](options[setting]);\n }\n }\n\n signals.fire('set', {\n options,\n interactable: this,\n });\n\n return this;\n }\n\n /*\\\n * Interactable.unset\n [ method ]\n *\n * Remove this interactable from the list of interactables and remove\n * it's action capabilities and event listeners\n *\n = (object) @interact\n \\*/\n unset () {\n events.remove(this.target, 'all');\n\n if (is.string(this.target)) {\n // remove delegated events\n for (const type in events.delegatedEvents) {\n const delegated = events.delegatedEvents[type];\n\n if (delegated.selectors[0] === this.target\n && delegated.contexts[0] === this._context) {\n\n delegated.selectors.splice(0, 1);\n delegated.contexts .splice(0, 1);\n delegated.listeners.splice(0, 1);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegated[type] = null;\n }\n }\n\n events.remove(this._context, type, events.delegateListener);\n events.remove(this._context, type, events.delegateUseCapture, true);\n }\n }\n else {\n events.remove(this, 'all');\n }\n\n signals.fire('unset', { interactable: this });\n\n scope.interactables.splice(indexOf(scope.interactables, this), 1);\n\n // Stop related interactions when an Interactable is unset\n for (const interaction of scope.interactions || []) {\n if (interaction.target === this && interaction.interacting()) {\n interaction.stop();\n }\n }\n\n return scope.interact;\n }\n}\n\nscope.interactables.indexOfElement = function indexOfElement (target, context) {\n context = context || scope.document;\n\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n if (interactable.target === target && interactable._context === context) {\n return i;\n }\n }\n return -1;\n};\n\nscope.interactables.get = function interactableGet (element, options, dontCheckInContext) {\n const ret = this[this.indexOfElement(element, options && options.context)];\n\n return ret && (is.string(element) || dontCheckInContext || ret.inContext(element))? ret : null;\n};\n\nscope.interactables.forEachSelector = function (callback, element) {\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n // skip non CSS selector targets and out of context elements\n if (!is.string(interactable.target)\n || (element && !interactable.inContext(element))) {\n continue;\n }\n\n const ret = callback(interactable, interactable.target, interactable._context, i, this);\n\n if (ret !== undefined) {\n return ret;\n }\n }\n};\n\n// all interact.js eventTypes\nInteractable.eventTypes = scope.eventTypes = [];\n\nInteractable.signals = signals;\n\nInteractable.settingsMethods = [ 'deltaSource', 'origin', 'preventDefault', 'rectChecker' ];\n\nmodule.exports = Interactable;\n","const scope = require('./scope');\nconst utils = require('./utils');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst finder = require('./utils/interactionFinder');\nconst signals = require('./utils/Signals').new();\n\nconst listeners = {};\nconst methodNames = [\n 'pointerDown', 'pointerMove', 'pointerUp',\n 'updatePointer', 'removePointer',\n];\n\n// for ignoring browser's simulated mouse events\nlet prevTouchTime = 0;\n\n// all active and idle interactions\nscope.interactions = [];\n\nclass Interaction {\n constructor () {\n this.target = null; // current interactable being interacted with\n this.element = null; // the target element of the interactable\n\n this.prepared = { // action that's ready to be fired on next move event\n name : null,\n axis : null,\n edges: null,\n };\n\n // keep track of added pointers\n this.pointers = [];\n this.pointerIds = [];\n this.downTargets = [];\n this.downTimes = [];\n\n // Previous native pointer move event coordinates\n this.prevCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n // current native pointer move event coordinates\n this.curCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Starting InteractEvent pointer coordinates\n this.startCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Change in coordinates and time of the pointer\n this.pointerDelta = {\n page : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n client : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n timeStamp: 0,\n };\n\n this.downEvent = null; // pointerdown/mousedown/touchstart event\n this.downPointer = {};\n\n this._eventTarget = null;\n this._curEventTarget = null;\n\n this.prevEvent = null; // previous action event\n\n this.pointerIsDown = false;\n this.pointerWasMoved = false;\n this._interacting = false;\n\n this.mouse = false;\n\n signals.fire('new', this);\n\n scope.interactions.push(this);\n }\n\n pointerDown (pointer, event, eventTarget) {\n const pointerIndex = this.updatePointer(pointer, event, true);\n\n signals.fire('down', {\n pointer,\n event,\n eventTarget,\n pointerIndex,\n interaction: this,\n });\n }\n\n /*\\\n * Interaction.start\n [ method ]\n *\n * Start an action with the given Interactable and Element as tartgets. The\n * action must be enabled for the target Interactable and an appropriate number\n * of pointers must be held down - 1 for drag/resize, 2 for gesture.\n *\n * Use it with `interactable.able({ manualStart: false })` to always\n * [start actions manually](https://github.com/taye/interact.js/issues/114)\n *\n - action (object) The action to be performed - drag, resize, etc.\n - target (Interactable) The Interactable to target\n - element (Element) The DOM Element to target\n = (object) interact\n **\n | interact(target)\n | .draggable({\n | // disable the default drag start by down->move\n | manualStart: true\n | })\n | // start dragging after the user holds the pointer down\n | .on('hold', function (event) {\n | var interaction = event.interaction;\n |\n | if (!interaction.interacting()) {\n | interaction.start({ name: 'drag' },\n | event.interactable,\n | event.currentTarget);\n | }\n | });\n \\*/\n start (action, target, element) {\n if (this.interacting()\n || !this.pointerIsDown\n || this.pointerIds.length < (action.name === 'gesture'? 2 : 1)) {\n return;\n }\n\n // if this interaction had been removed after stopping\n // add it back\n if (utils.indexOf(scope.interactions, this) === -1) {\n scope.interactions.push(this);\n }\n\n utils.copyAction(this.prepared, action);\n this.target = target;\n this.element = element;\n\n signals.fire('action-start', {\n interaction: this,\n event: this.downEvent,\n });\n }\n\n pointerMove (pointer, event, eventTarget) {\n if (!this.simulation) {\n this.updatePointer(pointer);\n utils.setCoords(this.curCoords, this.pointers);\n }\n\n const duplicateMove = (this.curCoords.page.x === this.prevCoords.page.x\n && this.curCoords.page.y === this.prevCoords.page.y\n && this.curCoords.client.x === this.prevCoords.client.x\n && this.curCoords.client.y === this.prevCoords.client.y);\n\n let dx;\n let dy;\n\n // register movement greater than pointerMoveTolerance\n if (this.pointerIsDown && !this.pointerWasMoved) {\n dx = this.curCoords.client.x - this.startCoords.client.x;\n dy = this.curCoords.client.y - this.startCoords.client.y;\n\n this.pointerWasMoved = utils.hypot(dx, dy) > Interaction.pointerMoveTolerance;\n }\n\n const signalArg = {\n pointer,\n pointerIndex: this.getPointerIndex(pointer),\n event,\n eventTarget,\n dx,\n dy,\n duplicate: duplicateMove,\n interaction: this,\n interactingBeforeMove: this.interacting(),\n };\n\n if (!duplicateMove) {\n // set pointer coordinate, time changes and speeds\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n }\n\n signals.fire('move', signalArg);\n\n if (!duplicateMove) {\n // if interacting, fire an 'action-move' signal etc\n if (this.interacting()) {\n this.doMove(signalArg);\n }\n\n if (this.pointerWasMoved) {\n utils.copyCoords(this.prevCoords, this.curCoords);\n }\n }\n }\n\n /*\\\n * Interaction.doMove\n [ method ]\n *\n * Force a move of the current action at the same coordinates. Useful if\n * snap/restrict has been changed and you want a movement with the new\n * settings.\n *\n **\n | interact(target)\n | .draggable(true)\n | .on('dragmove', function (event) {\n | if (someCondition) {\n | // change the snap settings\n | event.interactable.draggable({ snap: { targets: [] }});\n | // fire another move event with re-calculated snap\n | event.interaction.doMove();\n | }\n | });\n \\*/\n doMove (signalArg) {\n signalArg = utils.extend({\n pointer: this.pointers[0],\n event: this.prevEvent,\n eventTarget: this._eventTarget,\n interaction: this,\n }, signalArg || {});\n\n signals.fire('before-action-move', signalArg);\n\n if (!this._dontFireMove) {\n signals.fire('action-move', signalArg);\n }\n\n this._dontFireMove = false;\n }\n\n // End interact move events and stop auto-scroll unless simulation is running\n pointerUp (pointer, event, eventTarget, curEventTarget) {\n const pointerIndex = this.getPointerIndex(pointer);\n\n signals.fire(/cancel$/i.test(event.type)? 'cancel' : 'up', {\n pointer,\n pointerIndex,\n event,\n eventTarget,\n curEventTarget,\n interaction: this,\n });\n\n if (!this.simulation) {\n this.end(event);\n }\n\n this.pointerIsDown = false;\n this.removePointer(pointer, event);\n }\n\n /*\\\n * Interaction.end\n [ method ]\n *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n - event (PointerEvent) #optional\n **\n | interact(target)\n | .draggable(true)\n | .on('move', function (event) {\n | if (event.pageX > 1000) {\n | // end the current action\n | event.interaction.end();\n | // stop all further listeners from being called\n | event.stopImmediatePropagation();\n | }\n | });\n \\*/\n end (event) {\n event = event || this.prevEvent;\n\n if (this.interacting()) {\n signals.fire('action-end', {\n event,\n interaction: this,\n });\n }\n\n this.stop();\n }\n\n currentAction () {\n return this._interacting? this.prepared.name: null;\n }\n\n interacting () {\n return this._interacting;\n }\n\n stop () {\n signals.fire('stop', { interaction: this });\n\n if (this._interacting) {\n signals.fire('stop-active', { interaction: this });\n signals.fire('stop-' + this.prepared.name, { interaction: this });\n }\n\n this.target = this.element = null;\n\n this._interacting = false;\n this.prepared.name = this.prevEvent = null;\n }\n\n getPointerIndex (pointer) {\n return utils.indexOf(this.pointerIds, utils.getPointerId(pointer));\n }\n\n updatePointer (pointer, event, down = event && /(down|start)$/i.test(event.type)) {\n const id = utils.getPointerId(pointer);\n let index = this.getPointerIndex(pointer);\n\n if (index === -1) {\n index = this.pointerIds.length;\n this.pointerIds[index] = id;\n }\n\n if (down) {\n signals.fire('update-pointer-down', {\n pointer,\n event,\n down,\n pointerId: id,\n pointerIndex: index,\n interaction: this,\n });\n }\n\n this.pointers[index] = pointer;\n\n return index;\n }\n\n removePointer (pointer, event) {\n const id = utils.getPointerId(pointer);\n const index = this.mouse? 0 : utils.indexOf(this.pointerIds, id);\n\n if (index === -1) { return; }\n\n signals.fire('remove-pointer', {\n pointer,\n event,\n pointerIndex: index,\n interaction: this,\n });\n\n this.pointers .splice(index, 1);\n this.pointerIds .splice(index, 1);\n this.downTargets.splice(index, 1);\n this.downTimes .splice(index, 1);\n }\n\n _updateEventTargets (target, currentTarget) {\n this._eventTarget = target;\n this._curEventTarget = currentTarget;\n }\n}\n\nfor (let i = 0, len = methodNames.length; i < len; i++) {\n const method = methodNames[i];\n\n listeners[method] = doOnInteractions(method);\n}\n\nfunction doOnInteractions (method) {\n return (function (event) {\n const [eventTarget, curEventTarget] = utils.getEventTargets(event);\n const matches = []; // [ [pointer, interaction], ...]\n\n if (browser.supportsTouch && /touch/.test(event.type)) {\n prevTouchTime = new Date().getTime();\n\n for (let i = 0; i < event.changedTouches.length; i++) {\n const pointer = event.changedTouches[i];\n const interaction = finder.search(pointer, event.type, eventTarget);\n\n matches.push([pointer, interaction || new Interaction()]);\n }\n }\n else {\n let invalidPointer = false;\n\n if (!browser.supportsPointerEvent && /mouse/.test(event.type)) {\n // ignore mouse events while touch interactions are active\n for (let i = 0; i < scope.interactions.length && !invalidPointer; i++) {\n invalidPointer = !scope.interactions[i].mouse && scope.interactions[i].pointerIsDown;\n }\n\n // try to ignore mouse events that are simulated by the browser\n // after a touch event\n invalidPointer = invalidPointer\n || (new Date().getTime() - prevTouchTime < 500)\n // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated\n || event.timeStamp === 0;\n }\n\n if (!invalidPointer) {\n let interaction = finder.search(event, event.type, eventTarget);\n\n if (!interaction) {\n\n interaction = new Interaction();\n interaction.mouse = (/mouse/i.test(event.pointerType || event.type)\n // MSPointerEvent.MSPOINTER_TYPE_MOUSE\n || event.pointerType === 4\n || !event.pointerType);\n }\n\n matches.push([event, interaction]);\n }\n }\n\n for (const [pointer, interaction] of matches) {\n interaction._updateEventTargets(eventTarget, curEventTarget);\n interaction[method](pointer, event, eventTarget, curEventTarget);\n }\n });\n}\n\nfunction endAll (event) {\n for (let i = 0; i < scope.interactions.length; i++) {\n const interaction = scope.interactions[i];\n\n interaction.end(event);\n signals.fire('endall', { event, interaction });\n }\n}\n\nconst docEvents = { /* 'eventType': listenerFunc */ };\nconst pEventTypes = browser.pEventTypes;\n\nif (scope.PointerEvent) {\n docEvents[pEventTypes.down ] = listeners.pointerDown;\n docEvents[pEventTypes.move ] = listeners.pointerMove;\n docEvents[pEventTypes.up ] = listeners.pointerUp;\n docEvents[pEventTypes.cancel] = listeners.pointerUp;\n}\nelse {\n docEvents.mousedown = listeners.pointerDown;\n docEvents.mousemove = listeners.pointerMove;\n docEvents.mouseup = listeners.pointerUp;\n\n docEvents.touchstart = listeners.pointerDown;\n docEvents.touchmove = listeners.pointerMove;\n docEvents.touchend = listeners.pointerUp;\n docEvents.touchcancel = listeners.pointerUp;\n}\n\ndocEvents.blur = endAll;\n\nfunction onDocSignal ({ doc }, signalName) {\n const eventMethod = signalName.indexOf('add') === 0\n ? events.add : events.remove;\n\n // delegate event listener\n for (const eventType in scope.delegatedEvents) {\n eventMethod(doc, eventType, events.delegateListener);\n eventMethod(doc, eventType, events.delegateUseCapture, true);\n }\n\n for (const eventType in docEvents) {\n eventMethod(doc, eventType, docEvents[eventType]);\n }\n}\n\nsignals.on('update-pointer-down', ({ interaction, pointer, pointerId, pointerIndex, event, eventTarget, down }) => {\n interaction.pointerIds[pointerIndex] = pointerId;\n interaction.pointers[pointerIndex] = pointer;\n\n if (down) {\n interaction.pointerIsDown = true;\n }\n\n if (!interaction.interacting()) {\n utils.setCoords(interaction.startCoords, interaction.pointers);\n\n utils.copyCoords(interaction.curCoords , interaction.startCoords);\n utils.copyCoords(interaction.prevCoords, interaction.startCoords);\n\n interaction.downEvent = event;\n interaction.downTimes[pointerIndex] = interaction.curCoords.timeStamp;\n interaction.downTargets[pointerIndex] = eventTarget || event && utils.getEventTargets(event)[0];\n interaction.pointerWasMoved = false;\n\n utils.pointerExtend(interaction.downPointer, pointer);\n }\n});\n\nscope.signals.on('add-document' , onDocSignal);\nscope.signals.on('remove-document', onDocSignal);\n\nInteraction.pointerMoveTolerance = 1;\nInteraction.doOnInteractions = doOnInteractions;\nInteraction.endAll = endAll;\nInteraction.signals = signals;\nInteraction.docEvents = docEvents;\n\nscope.endAllInteractions = endAll;\n\nmodule.exports = Interaction;\n","const Interaction = require('../Interaction');\nconst InteractEvent = require('../InteractEvent');\n\nconst actions = {\n firePrepared,\n names: [],\n methodDict: {},\n};\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n interaction._interacting = true;\n firePrepared(interaction, event, 'start');\n});\n\nInteraction.signals.on('action-move', function ({ interaction, event, preEnd }) {\n firePrepared(interaction, event, 'move', preEnd);\n\n // if the action was ended in a listener\n if (!interaction.interacting()) { return false; }\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n firePrepared(interaction, event, 'end');\n});\n\nfunction firePrepared (interaction, event, phase, preEnd) {\n const actionName = interaction.prepared.name;\n\n const newEvent = new InteractEvent(interaction, event, actionName, phase, interaction.element, null, preEnd);\n\n interaction.target.fire(newEvent);\n interaction.prevEvent = newEvent;\n}\n\nmodule.exports = actions;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drag = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n startAxis : 'xy',\n lockAxis : 'xy',\n },\n\n checker: function (pointer, event, interactable) {\n const dragOptions = interactable.options.drag;\n\n return dragOptions.enabled\n ? { name: 'drag', axis: (dragOptions.lockAxis === 'start'\n ? dragOptions.startAxis\n : dragOptions.lockAxis)}\n : null;\n },\n\n getCursor: function () {\n return 'move';\n },\n};\n\nInteraction.signals.on('before-action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n interaction.curCoords.page.y = interaction.startCoords.page.y;\n interaction.curCoords.client.y = interaction.startCoords.client.y;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vx);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vx);\n interaction.pointerDelta.client.vy = 0;\n interaction.pointerDelta.page.vy = 0;\n }\n else if (axis === 'y') {\n interaction.curCoords.page.x = interaction.startCoords.page.x;\n interaction.curCoords.client.x = interaction.startCoords.client.x;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vy);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vy);\n interaction.pointerDelta.client.vx = 0;\n interaction.pointerDelta.page.vx = 0;\n }\n});\n\n// dragmove\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'dragmove') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n iEvent.pageY = interaction.startCoords.page.y;\n iEvent.clientY = interaction.startCoords.client.y;\n iEvent.dy = 0;\n }\n else if (axis === 'y') {\n iEvent.pageX = interaction.startCoords.page.x;\n iEvent.clientX = interaction.startCoords.client.x;\n iEvent.dx = 0;\n }\n});\n\n/*\\\n * Interactable.draggable\n [ method ]\n *\n * Gets or sets whether drag actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of drag events\n | var isDraggable = interact('ul li').draggable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on drag events (object makes the Interactable draggable)\n = (object) This Interactable\n | interact(element).draggable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // the axis in which the first movement must be\n | // for the drag sequence to start\n | // 'xy' by default - any direction\n | startAxis: 'x' || 'y' || 'xy',\n |\n | // 'xy' by default - don't restrict to one axis (move in any direction)\n | // 'x' or 'y' to restrict movement to either axis\n | // 'start' to restrict movement to the axis the drag started in\n | lockAxis: 'x' || 'y' || 'xy' || 'start',\n |\n | // max number of drags that can happen concurrently\n | // with elements of this Interactable. Infinity by default\n | max: Infinity,\n |\n | // max number of drags that can target the same element+Interactable\n | // 1 by default\n | maxPerElement: 2\n | });\n\\*/\nInteractable.prototype.draggable = function (options) {\n if (utils.is.object(options)) {\n this.options.drag.enabled = options.enabled === false? false: true;\n this.setPerAction('drag', options);\n this.setOnEvents('drag', options);\n\n if (/^(xy|x|y|start)$/.test(options.lockAxis)) {\n this.options.drag.lockAxis = options.lockAxis;\n }\n if (/^(xy|x|y)$/.test(options.startAxis)) {\n this.options.drag.startAxis = options.startAxis;\n }\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drag.enabled = options;\n\n if (!options) {\n this.ondragstart = this.ondragstart = this.ondragend = null;\n }\n\n return this;\n }\n\n return this.options.drag;\n};\n\nactions.drag = drag;\nactions.names.push('drag');\nutils.merge(Interactable.eventTypes, [\n 'dragstart',\n 'dragmove',\n 'draginertiastart',\n 'draginertiaresume',\n 'dragend',\n]);\nactions.methodDict.drag = 'draggable';\n\ndefaultOptions.drag = drag.defaults;\n\nmodule.exports = drag;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst scope = require('../scope');\nconst interact = require('../interact');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drop = {\n defaults: {\n enabled: false,\n accept : null,\n overlap: 'pointer',\n },\n};\n\nlet dynamicDrop = false;\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // reset active dropzones\n interaction.activeDrops.dropzones = [];\n interaction.activeDrops.elements = [];\n interaction.activeDrops.rects = [];\n\n interaction.dropEvents = null;\n\n if (!interaction.dynamicDrop) {\n setActiveDrops(interaction, interaction.element);\n }\n\n const dragEvent = interaction.prevEvent;\n const dropEvents = getDropEvents(interaction, event, dragEvent);\n\n if (dropEvents.activate) {\n fireActiveDrops(interaction, dropEvents.activate);\n }\n});\n\nInteractEvent.signals.on('new', function ({ interaction, iEvent, event }) {\n if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { return; }\n\n const draggableElement = interaction.element;\n const dragEvent = iEvent;\n const dropResult = getDrop(dragEvent, event, draggableElement);\n\n interaction.dropTarget = dropResult.dropzone;\n interaction.dropElement = dropResult.element;\n\n interaction.dropEvents = getDropEvents(interaction, event, dragEvent);\n});\n\nInteraction.signals.on('action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n fireDropEvents(interaction, interaction.dropEvents);\n});\n\nInteraction.signals.on('action-end', function ({ interaction }) {\n if (interaction.prepared.name === 'drag') {\n fireDropEvents(interaction, interaction.dropEvents);\n }\n});\n\nInteraction.signals.on('stop-drag', function ({ interaction }) {\n interaction.activeDrops.dropzones =\n interaction.activeDrops.elements =\n interaction.activeDrops.rects =\n interaction.dropEvents = null;\n});\n\nfunction collectDrops (interaction, element) {\n const drops = [];\n const elements = [];\n\n element = element || interaction.element;\n\n // collect all dropzones and their elements which qualify for a drop\n for (const current of scope.interactables) {\n if (!current.options.drop.enabled) { continue; }\n\n const accept = current.options.drop.accept;\n\n // test the draggable element against the dropzone's accept setting\n if ((utils.is.element(accept) && accept !== element)\n || (utils.is.string(accept)\n && !utils.matchesSelector(element, accept))) {\n\n continue;\n }\n\n // query for new elements if necessary\n const dropElements = utils.is.string(current.target)\n ? current._context.querySelectorAll(current.target)\n : [current.target];\n\n for (let i = 0; i < dropElements.length; i++) {\n const currentElement = dropElements[i];\n\n if (currentElement !== element) {\n drops.push(current);\n elements.push(currentElement);\n }\n }\n }\n\n return {\n elements,\n dropzones: drops,\n };\n}\n\nfunction fireActiveDrops (interaction, event) {\n let prevElement;\n\n // loop through all active dropzones and trigger event\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n const current = interaction.activeDrops.dropzones[i];\n const currentElement = interaction.activeDrops.elements [i];\n\n // prevent trigger of duplicate events on same element\n if (currentElement !== prevElement) {\n // set current element as event target\n event.target = currentElement;\n current.fire(event);\n }\n prevElement = currentElement;\n }\n}\n\n// Collect a new set of possible drops and save them in activeDrops.\n// setActiveDrops should always be called when a drag has just started or a\n// drag event happens while dynamicDrop is true\nfunction setActiveDrops (interaction, dragElement) {\n // get dropzones and their elements that could receive the draggable\n const possibleDrops = collectDrops(interaction, dragElement, true);\n\n interaction.activeDrops.dropzones = possibleDrops.dropzones;\n interaction.activeDrops.elements = possibleDrops.elements;\n interaction.activeDrops.rects = [];\n\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n interaction.activeDrops.rects[i] =\n interaction.activeDrops.dropzones[i].getRect(interaction.activeDrops.elements[i]);\n }\n}\n\nfunction getDrop (dragEvent, event, dragElement) {\n const interaction = dragEvent.interaction;\n const validDrops = [];\n\n if (dynamicDrop) {\n setActiveDrops(interaction, dragElement);\n }\n\n // collect all dropzones and their elements which qualify for a drop\n for (let j = 0; j < interaction.activeDrops.dropzones.length; j++) {\n const current = interaction.activeDrops.dropzones[j];\n const currentElement = interaction.activeDrops.elements [j];\n const rect = interaction.activeDrops.rects [j];\n\n validDrops.push(current.dropCheck(dragEvent, event, interaction.target, dragElement, currentElement, rect)\n ? currentElement\n : null);\n }\n\n // get the most appropriate dropzone based on DOM depth and order\n const dropIndex = utils.indexOfDeepestElement(validDrops);\n\n return {\n dropzone: interaction.activeDrops.dropzones[dropIndex] || null,\n element : interaction.activeDrops.elements [dropIndex] || null,\n };\n}\n\nfunction getDropEvents (interaction, pointerEvent, dragEvent) {\n const dropEvents = {\n enter : null,\n leave : null,\n activate : null,\n deactivate: null,\n move : null,\n drop : null,\n };\n\n const tmpl = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n };\n\n if (interaction.dropElement !== interaction.prevDropElement) {\n // if there was a prevDropTarget, create a dragleave event\n if (interaction.prevDropTarget) {\n dropEvents.leave = utils.extend({ type: 'dragleave' }, tmpl);\n\n dragEvent.dragLeave = dropEvents.leave.target = interaction.prevDropElement;\n dragEvent.prevDropzone = dropEvents.leave.dropzone = interaction.prevDropTarget;\n }\n // if the dropTarget is not null, create a dragenter event\n if (interaction.dropTarget) {\n dropEvents.enter = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n type : 'dragenter',\n };\n\n dragEvent.dragEnter = interaction.dropElement;\n dragEvent.dropzone = interaction.dropTarget;\n }\n }\n\n if (dragEvent.type === 'dragend' && interaction.dropTarget) {\n dropEvents.drop = utils.extend({ type: 'drop' }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n dragEvent.relatedTarget = interaction.dropElement;\n }\n if (dragEvent.type === 'dragstart') {\n dropEvents.activate = utils.extend({ type: 'dropactivate' }, tmpl);\n\n dropEvents.activate.target = null;\n dropEvents.activate.dropzone = null;\n }\n if (dragEvent.type === 'dragend') {\n dropEvents.deactivate = utils.extend({ type: 'dropdeactivate' }, tmpl);\n\n dropEvents.deactivate.target = null;\n dropEvents.deactivate.dropzone = null;\n }\n if (dragEvent.type === 'dragmove' && interaction.dropTarget) {\n dropEvents.move = utils.extend({\n dragmove : dragEvent,\n type : 'dropmove',\n }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n }\n\n return dropEvents;\n}\n\nfunction fireDropEvents (interaction, dropEvents) {\n if (dropEvents.leave) { interaction.prevDropTarget.fire(dropEvents.leave); }\n if (dropEvents.move ) { interaction.dropTarget.fire(dropEvents.move ); }\n if (dropEvents.enter) { interaction.dropTarget.fire(dropEvents.enter); }\n if (dropEvents.drop ) { interaction.dropTarget.fire(dropEvents.drop ); }\n if (dropEvents.deactivate) {\n fireActiveDrops(interaction, dropEvents.deactivate);\n }\n\n interaction.prevDropTarget = interaction.dropTarget;\n interaction.prevDropElement = interaction.dropElement;\n}\n\n/*\\\n * Interactable.dropzone\n [ method ]\n *\n * Returns or sets whether elements can be dropped onto this\n * Interactable to trigger drop events\n *\n * Dropzones can receive the following events:\n * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends\n * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone\n * - `dragmove` when a draggable that has entered the dropzone is moved\n * - `drop` when a draggable is dropped into this dropzone\n *\n * Use the `accept` option to allow only elements that match the given CSS\n * selector or element. The value can be:\n *\n * - **an Element** - only that element can be dropped into this dropzone.\n * - **a string**, - the element being dragged must match it as a CSS selector.\n * - **`null`** - accept options is cleared - it accepts any element.\n *\n * Use the `overlap` option to set how drops are checked for. The allowed\n * values are:\n *\n * - `'pointer'`, the pointer must be over the dropzone (default)\n * - `'center'`, the draggable element's center must be over the dropzone\n * - a number from 0-1 which is the `(intersection area) / (draggable area)`.\n * e.g. `0.5` for drop to happen when half of the area of the draggable is\n * over the dropzone\n *\n * Use the `checker` option to specify a function to check if a dragged\n * element is over this Interactable.\n *\n | interact(target)\n | .dropChecker(function(dragEvent, // related dragmove or dragend event\n | event, // TouchEvent/PointerEvent/MouseEvent\n | dropped, // bool result of the default checker\n | dropzone, // dropzone Interactable\n | dropElement, // dropzone elemnt\n | draggable, // draggable Interactable\n | draggableElement) {// draggable element\n |\n | return dropped && event.target.hasAttribute('allow-drop');\n | }\n *\n *\n - options (boolean | object | null) #optional The new value to be set.\n | interact('.drop').dropzone({\n | accept: '.can-drop' || document.getElementById('single-drop'),\n | overlap: 'pointer' || 'center' || zeroToOne\n | }\n = (boolean | object) The current setting or this Interactable\n\\*/\nInteractable.prototype.dropzone = function (options) {\n if (utils.is.object(options)) {\n this.options.drop.enabled = options.enabled === false? false: true;\n\n if (utils.is.function(options.ondrop) ) { this.events.ondrop = options.ondrop ; }\n if (utils.is.function(options.ondropactivate) ) { this.events.ondropactivate = options.ondropactivate ; }\n if (utils.is.function(options.ondropdeactivate)) { this.events.ondropdeactivate = options.ondropdeactivate; }\n if (utils.is.function(options.ondragenter) ) { this.events.ondragenter = options.ondragenter ; }\n if (utils.is.function(options.ondragleave) ) { this.events.ondragleave = options.ondragleave ; }\n if (utils.is.function(options.ondropmove) ) { this.events.ondropmove = options.ondropmove ; }\n\n if (/^(pointer|center)$/.test(options.overlap)) {\n this.options.drop.overlap = options.overlap;\n }\n else if (utils.is.number(options.overlap)) {\n this.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0);\n }\n if ('accept' in options) {\n this.options.drop.accept = options.accept;\n }\n if ('checker' in options) {\n this.options.drop.checker = options.checker;\n }\n\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drop.enabled = options;\n\n if (!options) {\n this.ondragenter = this.ondragleave = this.ondrop\n = this.ondropactivate = this.ondropdeactivate = null;\n }\n\n return this;\n }\n\n return this.options.drop;\n};\n\nInteractable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) {\n let dropped = false;\n\n // if the dropzone has no rect (eg. display: none)\n // call the custom dropChecker or just return false\n if (!(rect = rect || this.getRect(dropElement))) {\n return (this.options.drop.checker\n ? this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement)\n : false);\n }\n\n const dropOverlap = this.options.drop.overlap;\n\n if (dropOverlap === 'pointer') {\n const origin = utils.getOriginXY(draggable, draggableElement, 'drag');\n const page = utils.getPageXY(dragEvent);\n\n page.x += origin.x;\n page.y += origin.y;\n\n const horizontal = (page.x > rect.left) && (page.x < rect.right);\n const vertical = (page.y > rect.top ) && (page.y < rect.bottom);\n\n dropped = horizontal && vertical;\n }\n\n const dragRect = draggable.getRect(draggableElement);\n\n if (dragRect && dropOverlap === 'center') {\n const cx = dragRect.left + dragRect.width / 2;\n const cy = dragRect.top + dragRect.height / 2;\n\n dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom;\n }\n\n if (dragRect && utils.is.number(dropOverlap)) {\n const overlapArea = (Math.max(0, Math.min(rect.right , dragRect.right ) - Math.max(rect.left, dragRect.left))\n * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top , dragRect.top )));\n\n const overlapRatio = overlapArea / (dragRect.width * dragRect.height);\n\n dropped = overlapRatio >= dropOverlap;\n }\n\n if (this.options.drop.checker) {\n dropped = this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement);\n }\n\n return dropped;\n};\n\nInteractable.signals.on('unset', function ({ interactable }) {\n interactable.dropzone(false);\n});\n\nInteractable.settingsMethods.push('dropChecker');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.dropTarget = null; // the dropzone a drag target might be dropped into\n interaction.dropElement = null; // the element at the time of checking\n interaction.prevDropTarget = null; // the dropzone that was recently dragged away from\n interaction.prevDropElement = null; // the element at the time of checking\n interaction.dropEvents = null; // the dropEvents related to the current drag event\n\n interaction.activeDrops = {\n dropzones: [], // the dropzones that are mentioned below\n elements : [], // elements of dropzones that accept the target draggable\n rects : [], // the rects of the elements mentioned above\n };\n\n});\n\nInteraction.signals.on('stop', function ({ interaction }) {\n interaction.dropTarget = interaction.dropElement =\n interaction.prevDropTarget = interaction.prevDropElement = null;\n});\n\n/*\\\n * interact.dynamicDrop\n [ method ]\n *\n * Returns or sets whether the dimensions of dropzone elements are\n * calculated on every dragmove or only on dragstart for the default\n * dropChecker\n *\n - newValue (boolean) #optional True to check on each move. False to check only before start\n = (boolean | interact) The current setting or interact\n\\*/\ninteract.dynamicDrop = function (newValue) {\n if (utils.is.bool(newValue)) {\n //if (dragging && dynamicDrop !== newValue && !newValue) {\n //calcRects(dropzones);\n //}\n\n dynamicDrop = newValue;\n\n return interact;\n }\n return dynamicDrop;\n};\n\nutils.merge(Interactable.eventTypes, [\n 'dragenter',\n 'dragleave',\n 'dropactivate',\n 'dropdeactivate',\n 'dropmove',\n 'drop',\n]);\nactions.methodDict.drop = 'dropzone';\n\ndefaultOptions.drop = drop.defaults;\n\nmodule.exports = drop;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst gesture = {\n defaults: {\n enabled : false,\n origin : null,\n restrict: null,\n },\n\n checker: function (pointer, event, interactable, element, interaction) {\n if (interaction.pointerIds.length >= 2) {\n return { name: 'gesture' };\n }\n\n return null;\n },\n\n getCursor: function () {\n return '';\n },\n};\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturestart') { return; }\n iEvent.ds = 0;\n\n interaction.gesture.startDistance = interaction.gesture.prevDistance = iEvent.distance;\n interaction.gesture.startAngle = interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.scale = 1;\n});\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturemove') { return; }\n\n iEvent.ds = iEvent.scale - interaction.gesture.scale;\n\n interaction.target.fire(iEvent);\n\n interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.prevDistance = iEvent.distance;\n\n if (iEvent.scale !== Infinity\n && iEvent.scale !== null\n && iEvent.scale !== undefined\n && !isNaN(iEvent.scale)) {\n\n interaction.gesture.scale = iEvent.scale;\n }\n});\n\n/*\\\n * Interactable.gesturable\n [ method ]\n *\n * Gets or sets whether multitouch gestures can be performed on the\n * Interactable's element\n *\n = (boolean) Indicates if this can be the target of gesture events\n | var isGestureable = interact(element).gesturable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on gesture events (makes the Interactable gesturable)\n = (object) this Interactable\n | interact(element).gesturable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // limit multiple gestures.\n | // See the explanation in @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n\\*/\nInteractable.prototype.gesturable = function (options) {\n if (utils.is.object(options)) {\n this.options.gesture.enabled = options.enabled === false? false: true;\n this.setPerAction('gesture', options);\n this.setOnEvents('gesture', options);\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.gesture.enabled = options;\n\n if (!options) {\n this.ongesturestart = this.ongesturestart = this.ongestureend = null;\n }\n\n return this;\n }\n\n return this.options.gesture;\n};\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action, event, starting, ending, deltaSource }) {\n if (action !== 'gesture') { return; }\n\n const pointers = interaction.pointers;\n\n iEvent.touches = [pointers[0], pointers[1]];\n\n if (starting) {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = 1;\n iEvent.ds = 0;\n iEvent.angle = utils.touchAngle(pointers, undefined, deltaSource);\n iEvent.da = 0;\n }\n else if (ending || event instanceof InteractEvent) {\n iEvent.distance = interaction.prevEvent.distance;\n iEvent.box = interaction.prevEvent.box;\n iEvent.scale = interaction.prevEvent.scale;\n iEvent.ds = iEvent.scale - 1;\n iEvent.angle = interaction.prevEvent.angle;\n iEvent.da = iEvent.angle - interaction.gesture.startAngle;\n }\n else {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = iEvent.distance / interaction.gesture.startDistance;\n iEvent.angle = utils.touchAngle(pointers, interaction.gesture.prevAngle, deltaSource);\n\n iEvent.ds = iEvent.scale - interaction.gesture.prevScale;\n iEvent.da = iEvent.angle - interaction.gesture.prevAngle;\n }\n});\n\nInteraction.signals.on('new', function (interaction) {\n interaction.gesture = {\n start: { x: 0, y: 0 },\n\n startDistance: 0, // distance between two touches of touchStart\n prevDistance : 0,\n distance : 0,\n\n scale: 1, // gesture.distance / gesture.startDistance\n\n startAngle: 0, // angle of line joining two touches\n prevAngle : 0, // angle of the previous gesture event\n };\n});\n\nactions.gesture = gesture;\nactions.names.push('gesture');\nutils.merge(Interactable.eventTypes, [\n 'gesturestart',\n 'gesturemove',\n 'gestureend',\n]);\nactions.methodDict.gesture = 'gesturable';\n\ndefaultOptions.gesture = gesture.defaults;\n\nmodule.exports = gesture;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\n// Less Precision with touch input\nconst defaultMargin = browser.supportsTouch || browser.supportsPointerEvent? 20: 10;\n\nconst resize = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n square: false,\n preserveAspectRatio: false,\n axis: 'xy',\n\n // use default margin\n margin: NaN,\n\n // object with props left, right, top, bottom which are\n // true/false values to resize when the pointer is over that edge,\n // CSS selectors to match the handles for each direction\n // or the Elements for each handle\n edges: null,\n\n // a value of 'none' will limit the resize rect to a minimum of 0x0\n // 'negate' will alow the rect to have negative width/height\n // 'reposition' will keep the width/height positive by swapping\n // the top and bottom edges and/or swapping the left and right edges\n invert: 'none',\n },\n\n checker: function (pointer, event, interactable, element, interaction, rect) {\n if (!rect) { return null; }\n\n const page = utils.extend({}, interaction.curCoords.page);\n const options = interactable.options;\n\n if (options.resize.enabled) {\n const resizeOptions = options.resize;\n const resizeEdges = { left: false, right: false, top: false, bottom: false };\n\n // if using resize.edges\n if (utils.is.object(resizeOptions.edges)) {\n for (const edge in resizeEdges) {\n resizeEdges[edge] = checkResizeEdge(edge,\n resizeOptions.edges[edge],\n page,\n interaction._eventTarget,\n element,\n rect,\n resizeOptions.margin || defaultMargin);\n }\n\n resizeEdges.left = resizeEdges.left && !resizeEdges.right;\n resizeEdges.top = resizeEdges.top && !resizeEdges.bottom;\n\n if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) {\n return {\n name: 'resize',\n edges: resizeEdges,\n };\n }\n }\n else {\n const right = options.resize.axis !== 'y' && page.x > (rect.right - defaultMargin);\n const bottom = options.resize.axis !== 'x' && page.y > (rect.bottom - defaultMargin);\n\n if (right || bottom) {\n return {\n name: 'resize',\n axes: (right? 'x' : '') + (bottom? 'y' : ''),\n };\n }\n }\n }\n\n return null;\n },\n\n cursors: (browser.isIe9OrOlder ? {\n x : 'e-resize',\n y : 's-resize',\n xy: 'se-resize',\n\n top : 'n-resize',\n left : 'w-resize',\n bottom : 's-resize',\n right : 'e-resize',\n topleft : 'se-resize',\n bottomright: 'se-resize',\n topright : 'ne-resize',\n bottomleft : 'ne-resize',\n } : {\n x : 'ew-resize',\n y : 'ns-resize',\n xy: 'nwse-resize',\n\n top : 'ns-resize',\n left : 'ew-resize',\n bottom : 'ns-resize',\n right : 'ew-resize',\n topleft : 'nwse-resize',\n bottomright: 'nwse-resize',\n topright : 'nesw-resize',\n bottomleft : 'nesw-resize',\n }),\n\n getCursor: function (action) {\n if (action.axis) {\n return resize.cursors[action.name + action.axis];\n }\n else if (action.edges) {\n let cursorKey = '';\n const edgeNames = ['top', 'bottom', 'left', 'right'];\n\n for (let i = 0; i < 4; i++) {\n if (action.edges[edgeNames[i]]) {\n cursorKey += edgeNames[i];\n }\n }\n\n return resize.cursors[cursorKey];\n }\n },\n};\n\n// resizestart\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'resizestart' || !interaction.prepared.edges) {\n return;\n }\n\n const startRect = interaction.target.getRect(interaction.element);\n const resizeOptions = interaction.target.options.resize;\n\n /*\n * When using the `resizable.square` or `resizable.preserveAspectRatio` options, resizing from one edge\n * will affect another. E.g. with `resizable.square`, resizing to make the right edge larger will make\n * the bottom edge larger by the same amount. We call these 'linked' edges. Any linked edges will depend\n * on the active edges and the edge being interacted with.\n */\n if (resizeOptions.square || resizeOptions.preserveAspectRatio) {\n const linkedEdges = utils.extend({}, interaction.prepared.edges);\n\n linkedEdges.top = linkedEdges.top || (linkedEdges.left && !linkedEdges.bottom);\n linkedEdges.left = linkedEdges.left || (linkedEdges.top && !linkedEdges.right );\n linkedEdges.bottom = linkedEdges.bottom || (linkedEdges.right && !linkedEdges.top );\n linkedEdges.right = linkedEdges.right || (linkedEdges.bottom && !linkedEdges.left );\n\n interaction.prepared._linkedEdges = linkedEdges;\n }\n else {\n interaction.prepared._linkedEdges = null;\n }\n\n // if using `resizable.preserveAspectRatio` option, record aspect ratio at the start of the resize\n if (resizeOptions.preserveAspectRatio) {\n interaction.resizeStartAspectRatio = startRect.width / startRect.height;\n }\n\n interaction.resizeRects = {\n start : startRect,\n current : utils.extend({}, startRect),\n inverted : utils.extend({}, startRect),\n previous : utils.extend({}, startRect),\n delta : {\n left: 0, right : 0, width : 0,\n top : 0, bottom: 0, height: 0,\n },\n };\n\n iEvent.rect = interaction.resizeRects.inverted;\n iEvent.deltaRect = interaction.resizeRects.delta;\n});\n\n// resizemove\nInteractEvent.signals.on('new', function ({ iEvent, phase, interaction }) {\n if (phase !== 'move' || !interaction.prepared.edges) { return; }\n\n const resizeOptions = interaction.target.options.resize;\n const invert = resizeOptions.invert;\n const invertible = invert === 'reposition' || invert === 'negate';\n\n let edges = interaction.prepared.edges;\n\n const start = interaction.resizeRects.start;\n const current = interaction.resizeRects.current;\n const inverted = interaction.resizeRects.inverted;\n const delta = interaction.resizeRects.delta;\n const previous = utils.extend(interaction.resizeRects.previous, inverted);\n const originalEdges = edges;\n\n let dx = iEvent.dx;\n let dy = iEvent.dy;\n\n if (resizeOptions.preserveAspectRatio || resizeOptions.square) {\n // `resize.preserveAspectRatio` takes precedence over `resize.square`\n const startAspectRatio = resizeOptions.preserveAspectRatio\n ? interaction.resizeStartAspectRatio\n : 1;\n\n edges = interaction.prepared._linkedEdges;\n\n if ((originalEdges.left && originalEdges.bottom)\n || (originalEdges.right && originalEdges.top)) {\n dy = -dx / startAspectRatio;\n }\n else if (originalEdges.left || originalEdges.right ) { dy = dx / startAspectRatio; }\n else if (originalEdges.top || originalEdges.bottom) { dx = dy * startAspectRatio; }\n }\n\n // update the 'current' rect without modifications\n if (edges.top ) { current.top += dy; }\n if (edges.bottom) { current.bottom += dy; }\n if (edges.left ) { current.left += dx; }\n if (edges.right ) { current.right += dx; }\n\n if (invertible) {\n // if invertible, copy the current rect\n utils.extend(inverted, current);\n\n if (invert === 'reposition') {\n // swap edge values if necessary to keep width/height positive\n let swap;\n\n if (inverted.top > inverted.bottom) {\n swap = inverted.top;\n\n inverted.top = inverted.bottom;\n inverted.bottom = swap;\n }\n if (inverted.left > inverted.right) {\n swap = inverted.left;\n\n inverted.left = inverted.right;\n inverted.right = swap;\n }\n }\n }\n else {\n // if not invertible, restrict to minimum of 0x0 rect\n inverted.top = Math.min(current.top, start.bottom);\n inverted.bottom = Math.max(current.bottom, start.top);\n inverted.left = Math.min(current.left, start.right);\n inverted.right = Math.max(current.right, start.left);\n }\n\n inverted.width = inverted.right - inverted.left;\n inverted.height = inverted.bottom - inverted.top ;\n\n for (const edge in inverted) {\n delta[edge] = inverted[edge] - previous[edge];\n }\n\n iEvent.edges = interaction.prepared.edges;\n iEvent.rect = inverted;\n iEvent.deltaRect = delta;\n});\n\n/*\\\n * Interactable.resizable\n [ method ]\n *\n * Gets or sets whether resize actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of resize elements\n | var isResizeable = interact('input[type=text]').resizable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on resize events (object makes the Interactable resizable)\n = (object) This Interactable\n | interact(element).resizable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | edges: {\n | top : true, // Use pointer coords to check for resize.\n | left : false, // Disable resizing from left edge.\n | bottom: '.resize-s',// Resize if pointer target matches selector\n | right : handleEl // Resize if pointer target is the given Element\n | },\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height are adjusted at a 1:1 ratio.\n | square: false,\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height maintain the aspect ratio they had when resizing started.\n | preserveAspectRatio: false,\n |\n | // a value of 'none' will limit the resize rect to a minimum of 0x0\n | // 'negate' will allow the rect to have negative width/height\n | // 'reposition' will keep the width/height positive by swapping\n | // the top and bottom edges and/or swapping the left and right edges\n | invert: 'none' || 'negate' || 'reposition'\n |\n | // limit multiple resizes.\n | // See the explanation in the @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n \\*/\nInteractable.prototype.resizable = function (options) {\n if (utils.is.object(options)) {\n this.options.resize.enabled = options.enabled === false? false: true;\n this.setPerAction('resize', options);\n this.setOnEvents('resize', options);\n\n if (/^x$|^y$|^xy$/.test(options.axis)) {\n this.options.resize.axis = options.axis;\n }\n else if (options.axis === null) {\n this.options.resize.axis = defaultOptions.resize.axis;\n }\n\n if (utils.is.bool(options.preserveAspectRatio)) {\n this.options.resize.preserveAspectRatio = options.preserveAspectRatio;\n }\n else if (utils.is.bool(options.square)) {\n this.options.resize.square = options.square;\n }\n\n return this;\n }\n if (utils.is.bool(options)) {\n this.options.resize.enabled = options;\n\n if (!options) {\n this.onresizestart = this.onresizestart = this.onresizeend = null;\n }\n\n return this;\n }\n return this.options.resize;\n};\n\nfunction checkResizeEdge (name, value, page, element, interactableElement, rect, margin) {\n // false, '', undefined, null\n if (!value) { return false; }\n\n // true value, use pointer coords and element rect\n if (value === true) {\n // if dimensions are negative, \"switch\" edges\n const width = utils.is.number(rect.width )? rect.width : rect.right - rect.left;\n const height = utils.is.number(rect.height)? rect.height : rect.bottom - rect.top ;\n\n if (width < 0) {\n if (name === 'left' ) { name = 'right'; }\n else if (name === 'right') { name = 'left' ; }\n }\n if (height < 0) {\n if (name === 'top' ) { name = 'bottom'; }\n else if (name === 'bottom') { name = 'top' ; }\n }\n\n if (name === 'left' ) { return page.x < ((width >= 0? rect.left: rect.right ) + margin); }\n if (name === 'top' ) { return page.y < ((height >= 0? rect.top : rect.bottom) + margin); }\n\n if (name === 'right' ) { return page.x > ((width >= 0? rect.right : rect.left) - margin); }\n if (name === 'bottom') { return page.y > ((height >= 0? rect.bottom: rect.top ) - margin); }\n }\n\n // the remaining checks require an element\n if (!utils.is.element(element)) { return false; }\n\n return utils.is.element(value)\n // the value is an element to use as a resize handle\n ? value === element\n // otherwise check if element matches value as selector\n : utils.matchesUpTo(element, value, interactableElement);\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.resizeAxes = 'xy';\n});\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action }) {\n if (action !== 'resize' || !interaction.resizeAxes) { return; }\n\n const options = interaction.target.options;\n\n if (options.resize.square) {\n if (interaction.resizeAxes === 'y') {\n iEvent.dx = iEvent.dy;\n }\n else {\n iEvent.dy = iEvent.dx;\n }\n iEvent.axes = 'xy';\n }\n else {\n iEvent.axes = interaction.resizeAxes;\n\n if (interaction.resizeAxes === 'x') {\n iEvent.dy = 0;\n }\n else if (interaction.resizeAxes === 'y') {\n iEvent.dx = 0;\n }\n }\n});\n\nactions.resize = resize;\nactions.names.push('resize');\nutils.merge(Interactable.eventTypes, [\n 'resizestart',\n 'resizemove',\n 'resizeinertiastart',\n 'resizeinertiaresume',\n 'resizeend',\n]);\nactions.methodDict.resize = 'resizable';\n\ndefaultOptions.resize = resize.defaults;\n\nmodule.exports = resize;\n","const raf = require('./utils/raf');\nconst getWindow = require('./utils/window').getWindow;\nconst is = require('./utils/is');\nconst domUtils = require('./utils/domUtils');\nconst Interaction = require('./Interaction');\nconst defaultOptions = require('./defaultOptions');\n\nconst autoScroll = {\n defaults: {\n enabled : false,\n container: null, // the item that is scrolled (Window or HTMLElement)\n margin : 60,\n speed : 300, // the scroll speed in pixels per second\n },\n\n interaction: null,\n i: null, // the handle returned by window.setInterval\n x: 0, y: 0, // Direction each pulse is to scroll in\n\n isScrolling: false,\n prevTime: 0,\n\n start: function (interaction) {\n autoScroll.isScrolling = true;\n raf.cancel(autoScroll.i);\n\n autoScroll.interaction = interaction;\n autoScroll.prevTime = new Date().getTime();\n autoScroll.i = raf.request(autoScroll.scroll);\n },\n\n stop: function () {\n autoScroll.isScrolling = false;\n raf.cancel(autoScroll.i);\n },\n\n // scroll the window by the values in scroll.x/y\n scroll: function () {\n const options = autoScroll.interaction.target.options[autoScroll.interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(autoScroll.interaction.element);\n const now = new Date().getTime();\n // change in time in seconds\n const dt = (now - autoScroll.prevTime) / 1000;\n // displacement\n const s = options.speed * dt;\n\n if (s >= 1) {\n if (is.window(container)) {\n container.scrollBy(autoScroll.x * s, autoScroll.y * s);\n }\n else if (container) {\n container.scrollLeft += autoScroll.x * s;\n container.scrollTop += autoScroll.y * s;\n }\n\n autoScroll.prevTime = now;\n }\n\n if (autoScroll.isScrolling) {\n raf.cancel(autoScroll.i);\n autoScroll.i = raf.request(autoScroll.scroll);\n }\n },\n check: function (interactable, actionName) {\n const options = interactable.options;\n\n return options[actionName].autoScroll && options[actionName].autoScroll.enabled;\n },\n onInteractionMove: function ({ interaction, pointer }) {\n if (!(interaction.interacting()\n && autoScroll.check(interaction.target, interaction.prepared.name))) {\n return;\n }\n\n if (interaction.simulation) {\n autoScroll.x = autoScroll.y = 0;\n return;\n }\n\n let top;\n let right;\n let bottom;\n let left;\n\n const options = interaction.target.options[interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(interaction.element);\n\n if (is.window(container)) {\n left = pointer.clientX < autoScroll.margin;\n top = pointer.clientY < autoScroll.margin;\n right = pointer.clientX > container.innerWidth - autoScroll.margin;\n bottom = pointer.clientY > container.innerHeight - autoScroll.margin;\n }\n else {\n const rect = domUtils.getElementClientRect(container);\n\n left = pointer.clientX < rect.left + autoScroll.margin;\n top = pointer.clientY < rect.top + autoScroll.margin;\n right = pointer.clientX > rect.right - autoScroll.margin;\n bottom = pointer.clientY > rect.bottom - autoScroll.margin;\n }\n\n autoScroll.x = (right ? 1: left? -1: 0);\n autoScroll.y = (bottom? 1: top? -1: 0);\n\n if (!autoScroll.isScrolling) {\n // set the autoScroll properties to those of the target\n autoScroll.margin = options.margin;\n autoScroll.speed = options.speed;\n\n autoScroll.start(interaction);\n }\n },\n};\n\nInteraction.signals.on('stop-active', function () {\n autoScroll.stop();\n});\n\nInteraction.signals.on('action-move', autoScroll.onInteractionMove);\n\ndefaultOptions.perAction.autoScroll = autoScroll.defaults;\n\nmodule.exports = autoScroll;\n","const Interactable = require('../Interactable');\nconst actions = require('../actions/base');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.ignoreFrom\n [ method ]\n *\n * If the target of the `mousedown`, `pointerdown` or `touchstart`\n * event or any of it's parents match the given CSS selector or\n * Element, no drag/resize/gesture is started.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to not ignore any elements\n = (string | Element | object) The current ignoreFrom value or this Interactable\n **\n | interact(element, { ignoreFrom: document.getElementById('no-action') });\n | // or\n | interact(element).ignoreFrom('input, textarea, a');\n\\*/\nInteractable.prototype.ignoreFrom = function (newValue) {\n return this._backCompatOption('ignoreFrom', newValue);\n};\n\n/*\\\n * Interactable.allowFrom\n [ method ]\n *\n * A drag/resize/gesture is started only If the target of the\n * `mousedown`, `pointerdown` or `touchstart` event or any of it's\n * parents match the given CSS selector or Element.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to allow from any element\n = (string | Element | object) The current allowFrom value or this Interactable\n **\n | interact(element, { allowFrom: document.getElementById('drag-handle') });\n | // or\n | interact(element).allowFrom('.handle');\n\\*/\nInteractable.prototype.allowFrom = function (newValue) {\n return this._backCompatOption('allowFrom', newValue);\n};\n\nInteractable.prototype.testIgnore = function (ignoreFrom, interactableElement, element) {\n if (!ignoreFrom || !is.element(element)) { return false; }\n\n if (is.string(ignoreFrom)) {\n return domUtils.matchesUpTo(element, ignoreFrom, interactableElement);\n }\n else if (is.element(ignoreFrom)) {\n return domUtils.nodeContains(ignoreFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testAllow = function (allowFrom, interactableElement, element) {\n if (!allowFrom) { return true; }\n\n if (!is.element(element)) { return false; }\n\n if (is.string(allowFrom)) {\n return domUtils.matchesUpTo(element, allowFrom, interactableElement);\n }\n else if (is.element(allowFrom)) {\n return domUtils.nodeContains(allowFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testIgnoreAllow = function (options, interactableElement, eventTarget) {\n return (!this.testIgnore(options.ignoreFrom, interactableElement, eventTarget)\n && this.testAllow(options.allowFrom, interactableElement, eventTarget));\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (event.buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\n","const interact = require('../interact');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst actions = require('../actions/base');\nconst defaultOptions = require('../defaultOptions');\nconst browser = require('../utils/browser');\nconst scope = require('../scope');\nconst utils = require('../utils');\nconst signals = require('../utils/Signals').new();\n\nrequire('./InteractableMethods');\n\nconst autoStart = {\n signals,\n withinInteractionLimit,\n // Allow this many interactions to happen simultaneously\n maxInteractions: Infinity,\n defaults: {\n perAction: {\n manualStart: false,\n max: Infinity,\n maxPerElement: 1,\n allowFrom: null,\n ignoreFrom: null,\n },\n },\n setActionDefaults: function (action) {\n utils.extend(action.defaults, autoStart.defaults.perAction);\n },\n};\n\n// set cursor style on mousedown\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget }) {\n if (interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\n// set cursor style on mousemove\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget }) {\n if (!interaction.mouse\n || interaction.pointerIsDown\n || interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\nInteraction.signals.on('move', function (arg) {\n const { interaction, event } = arg;\n\n if (!interaction.pointerIsDown\n || interaction.interacting()\n || !interaction.pointerWasMoved\n || !interaction.prepared.name) {\n return;\n }\n\n signals.fire('before-start', arg);\n\n const target = interaction.target;\n\n if (interaction.prepared.name && target) {\n // check manualStart and interaction limit\n if (target.options[interaction.prepared.name].manualStart\n || !withinInteractionLimit(target, interaction.element, interaction.prepared)) {\n interaction.stop(event);\n }\n else {\n interaction.start(interaction.prepared, target, interaction.element);\n }\n }\n});\n\n// Check if the current target supports the action.\n// If so, return the validated action. Otherwise, return null\nfunction validateAction (action, interactable, element, eventTarget) {\n if (utils.is.object(action)\n && interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget)\n && interactable.options[action.name].enabled\n && withinInteractionLimit(interactable, element, action)) {\n return action;\n }\n\n return null;\n}\n\nfunction validateSelector (interaction, pointer, event, matches, matchElements, eventTarget) {\n for (let i = 0, len = matches.length; i < len; i++) {\n const match = matches[i];\n const matchElement = matchElements[i];\n const action = validateAction(match.getAction(pointer, event, interaction, matchElement),\n match,\n matchElement,\n eventTarget);\n\n if (action) {\n return {\n action,\n target: match,\n element: matchElement,\n };\n }\n }\n\n return {};\n}\n\nfunction getActionInfo (interaction, pointer, event, eventTarget) {\n let matches = [];\n let matchElements = [];\n\n let element = eventTarget;\n let action = null;\n\n function pushMatches (interactable, selector, context) {\n const elements = (browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined);\n\n if (utils.matchesSelector(element, selector, elements)) {\n\n matches.push(interactable);\n matchElements.push(element);\n }\n }\n\n while (utils.is.element(element)) {\n matches = [];\n matchElements = [];\n\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && (action = validateAction(elementInteractable.getAction(pointer, event, interaction, element, eventTarget),\n elementInteractable,\n element,\n eventTarget))\n && !elementInteractable.options[action.name].manualStart) {\n return {\n element,\n action,\n target: elementInteractable,\n };\n }\n else {\n scope.interactables.forEachSelector(pushMatches, element);\n\n const actionInfo = validateSelector(interaction, pointer, event, matches, matchElements, eventTarget);\n\n if (actionInfo.action\n && !actionInfo.target.options[actionInfo.action.name].manualStart) {\n return actionInfo;\n }\n }\n\n element = utils.parentNode(element);\n }\n\n return {};\n}\n\nfunction prepare (interaction, { action, target, element }) {\n action = action || {};\n\n if (interaction.target && interaction.target.options.styleCursor) {\n interaction.target._doc.documentElement.style.cursor = '';\n }\n\n interaction.target = target;\n interaction.element = element;\n utils.copyAction(interaction.prepared, action);\n\n if (target && target.options.styleCursor) {\n const cursor = action? actions[action.name].getCursor(action) : '';\n interaction.target._doc.documentElement.style.cursor = cursor;\n }\n\n signals.fire('prepared', { interaction: interaction });\n}\n\nInteraction.signals.on('stop', function ({ interaction }) {\n const target = interaction.target;\n\n if (target && target.options.styleCursor) {\n target._doc.documentElement.style.cursor = '';\n }\n});\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (utils.is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (utils.is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n const buttons = event.buttons || ({\n 0: 1,\n 1: 4,\n 3: 8,\n 4: 16,\n })[event.button];\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\nfunction withinInteractionLimit (interactable, element, action) {\n const options = interactable.options;\n const maxActions = options[action.name].max;\n const maxPerElement = options[action.name].maxPerElement;\n let activeInteractions = 0;\n let targetCount = 0;\n let targetElementCount = 0;\n\n // no actions if any of these values == 0\n if (!(maxActions && maxPerElement && autoStart.maxInteractions)) { return; }\n\n for (let i = 0, len = scope.interactions.length; i < len; i++) {\n const interaction = scope.interactions[i];\n const otherAction = interaction.prepared.name;\n\n if (!interaction.interacting()) { continue; }\n\n activeInteractions++;\n\n if (activeInteractions >= autoStart.maxInteractions) {\n return false;\n }\n\n if (interaction.target !== interactable) { continue; }\n\n targetCount += (otherAction === action.name)|0;\n\n if (targetCount >= maxActions) {\n return false;\n }\n\n if (interaction.element === element) {\n targetElementCount++;\n\n if (otherAction !== action.name || targetElementCount >= maxPerElement) {\n return false;\n }\n }\n }\n\n return autoStart.maxInteractions > 0;\n}\n\n/*\\\n * interact.maxInteractions\n [ method ]\n **\n * Returns or sets the maximum number of concurrent interactions allowed.\n * By default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables\n * and elements, you need to enable it in the draggable, resizable and\n * gesturable `'max'` and `'maxPerElement'` options.\n **\n - newValue (number) #optional Any number. newValue <= 0 means no interactions.\n\\*/\ninteract.maxInteractions = function (newValue) {\n if (utils.is.number(newValue)) {\n autoStart.maxInteractions = newValue;\n\n return this;\n }\n\n return autoStart.maxInteractions;\n};\n\nInteractable.settingsMethods.push('styleCursor');\nInteractable.settingsMethods.push('actionChecker');\nInteractable.settingsMethods.push('ignoreFrom');\nInteractable.settingsMethods.push('allowFrom');\n\ndefaultOptions.base.actionChecker = null;\ndefaultOptions.base.styleCursor = true;\n\nutils.extend(defaultOptions.perAction, autoStart.defaults.perAction);\n\nmodule.exports = autoStart;\n","const autoStart = require('./base');\nconst Interaction = require('../Interaction');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.delayTimer = null;\n});\n\nautoStart.signals.on('prepared', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.delayTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.target, interaction.element);\n }, delay);\n }\n});\n\nInteraction.signals.on('move', function ({ interaction, duplicate }) {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.delayTimer);\n }\n});\n\n// prevent regular down->move autoStart\nautoStart.signals.on('before-start', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.prepared.name = null;\n }\n});\n","const autoStart = require('./base');\nconst scope = require('../scope');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\n\nconst { matchesSelector, parentNode } = require('../utils/domUtils');\n\nautoStart.setActionDefaults(require('../actions/drag'));\n\nautoStart.signals.on('before-start', function ({ interaction, eventTarget, dx, dy }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // check if a drag is in the correct axis\n const absX = Math.abs(dx);\n const absY = Math.abs(dy);\n const options = interaction.target.options.drag;\n const startAxis = options.startAxis;\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy');\n\n interaction.prepared.axis = options.lockAxis === 'start'\n ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n : options.lockAxis;\n\n // if the movement isn't in the startAxis of the interactable\n if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) {\n // cancel the prepared action\n interaction.prepared.name = null;\n\n // then try to get a drag from another ineractable\n\n if (!interaction.prepared.name) {\n\n let element = eventTarget;\n\n const getDraggable = function (interactable, selector, context) {\n const elements = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n if (interactable === interaction.target) { return; }\n\n if (!options.manualStart\n && !interactable.testIgnoreAllow(options, element, eventTarget)\n && matchesSelector(element, selector, elements)) {\n\n const action = interactable.getAction(interaction.downPointer,\n interaction.downEvent,\n interaction,\n element);\n\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, interactable)\n && autoStart.validateAction(action, interactable, element, eventTarget)) {\n\n return interactable;\n }\n }\n };\n\n let action = null;\n\n // check all interactables\n while (is.element(element)) {\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && elementInteractable !== interaction.target\n && !elementInteractable.options.drag.manualStart) {\n\n action = elementInteractable.getAction(interaction.downPointer, interaction.downEvent, interaction, element);\n }\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, elementInteractable)) {\n\n interaction.prepared.name = 'drag';\n interaction.target = elementInteractable;\n interaction.element = element;\n break;\n }\n\n const selectorInteractable = scope.interactables.forEachSelector(getDraggable, element);\n\n if (selectorInteractable) {\n interaction.prepared.name = 'drag';\n interaction.target = selectorInteractable;\n interaction.element = element;\n break;\n }\n\n element = parentNode(element);\n }\n }\n }\n});\n\nfunction checkStartAxis (startAxis, interactable) {\n if (!interactable) { return false; }\n\n const thisAxis = interactable.options.drag.startAxis;\n\n return (startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis);\n}\n","require('./base').setActionDefaults(require('../actions/gesture'));\n","require('./base').setActionDefaults(require('../actions/resize'));\n","module.exports = {\n base: {\n accept : null,\n preventDefault: 'auto',\n deltaSource : 'page',\n },\n\n perAction: {\n origin: { x: 0, y: 0 },\n\n // only allow left button by default\n // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n mouseButtons: 1,\n\n inertia: {\n enabled : false,\n resistance : 10, // the lambda in exponential decay\n minSpeed : 100, // target speed must be above this for inertia to start\n endSpeed : 10, // the speed at which inertia is slow enough to stop\n allowResume : true, // allow resuming an action in inertia phase\n smoothEndDuration: 300, // animate to snap/restrict endOnly if there's no inertia\n },\n },\n};\n","/* browser entry point */\n\n// Legacy browser support\nrequire('./legacyBrowsers');\n\n// inertia\nrequire('./inertia');\n\n// modifiers\nrequire('./modifiers/snap');\nrequire('./modifiers/restrict');\n\n// pointerEvents\nrequire('./pointerEvents/base');\nrequire('./pointerEvents/holdRepeat');\nrequire('./pointerEvents/interactableTargets');\n\n// delay\nrequire('./autoStart/delay');\n\n// actions\nrequire('./actions/gesture');\nrequire('./actions/resize');\nrequire('./actions/drag');\nrequire('./actions/drop');\n\n// load these modifiers after resize is loaded\nrequire('./modifiers/snapSize');\nrequire('./modifiers/restrictEdges');\nrequire('./modifiers/restrictSize');\n\n// autoStart actions\nrequire('./autoStart/gesture');\nrequire('./autoStart/resize');\nrequire('./autoStart/drag');\n\n// Interactable preventDefault setting\nrequire('./interactablePreventDefault.js');\n\n// autoScroll\nrequire('./autoScroll');\n\n// export interact\nmodule.exports = require('./interact');\n","const InteractEvent = require('./InteractEvent');\nconst Interaction = require('./Interaction');\nconst modifiers = require('./modifiers');\nconst utils = require('./utils');\nconst animationFrame = require('./utils/raf');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.inertiaStatus = {\n active : false,\n smoothEnd : false,\n allowResume: false,\n\n startEvent: null,\n upCoords : {},\n\n xe: 0, ye: 0,\n sx: 0, sy: 0,\n\n t0: 0,\n vx0: 0, vys: 0,\n duration: 0,\n\n lambda_v0: 0,\n one_ve_v0: 0,\n i : null,\n };\n\n interaction.boundInertiaFrame = () => inertiaFrame .apply(interaction);\n interaction.boundSmoothEndFrame = () => smoothEndFrame.apply(interaction);\n});\n\nInteraction.signals.on('down', function ({ interaction, event, pointer, eventTarget }) {\n const status = interaction.inertiaStatus;\n\n // Check if the down event hits the current inertia target\n if (status.active) {\n let element = eventTarget;\n\n // climb up the DOM tree from the event target\n while (utils.is.element(element)) {\n\n // if interaction element is the current inertia target element\n if (element === interaction.element) {\n // stop inertia\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n\n // update pointers to the down event's coordinates\n interaction.updatePointer(pointer);\n utils.setCoords(interaction.curCoords, interaction.pointers);\n\n // fire appropriate signals\n const signalArg = { interaction };\n Interaction.signals.fire('before-action-move', signalArg);\n Interaction.signals.fire('action-resume' , signalArg);\n\n // fire a reume event\n const resumeEvent = new InteractEvent(interaction,\n event,\n interaction.prepared.name,\n 'inertiaresume',\n interaction.element);\n\n interaction.target.fire(resumeEvent);\n interaction.prevEvent = resumeEvent;\n modifiers.resetStatuses(interaction.modifierStatuses);\n\n utils.copyCoords(interaction.prevCoords, interaction.curCoords);\n break;\n }\n\n element = utils.parentNode(element);\n }\n }\n});\n\nInteraction.signals.on('up', function ({ interaction, event }) {\n const status = interaction.inertiaStatus;\n\n if (!interaction.interacting() || status.active) { return; }\n\n const target = interaction.target;\n const options = target && target.options;\n const inertiaOptions = options && interaction.prepared.name && options[interaction.prepared.name].inertia;\n\n const now = new Date().getTime();\n const statuses = {};\n const page = utils.extend({}, interaction.curCoords.page);\n const pointerSpeed = interaction.pointerDelta.client.speed;\n\n let smoothEnd = false;\n let modifierResult;\n\n // check if inertia should be started\n const inertiaPossible = (inertiaOptions && inertiaOptions.enabled\n && interaction.prepared.name !== 'gesture'\n && event !== status.startEvent);\n\n const inertia = (inertiaPossible\n && (now - interaction.curCoords.timeStamp) < 50\n && pointerSpeed > inertiaOptions.minSpeed\n && pointerSpeed > inertiaOptions.endSpeed);\n\n const modifierArg = {\n interaction,\n pageCoords: page,\n statuses,\n preEnd: true,\n requireEndOnly: true,\n };\n\n // smoothEnd\n if (inertiaPossible && !inertia) {\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n if (modifierResult.shouldMove && modifierResult.locked) {\n smoothEnd = true;\n }\n }\n\n if (!(inertia || smoothEnd)) { return; }\n\n utils.copyCoords(status.upCoords, interaction.curCoords);\n\n interaction.pointers[0] = status.startEvent =\n new InteractEvent(interaction, event, interaction.prepared.name, 'inertiastart', interaction.element);\n\n status.t0 = now;\n\n status.active = true;\n status.allowResume = inertiaOptions.allowResume;\n interaction.simulation = status;\n\n target.fire(status.startEvent);\n\n if (inertia) {\n status.vx0 = interaction.pointerDelta.client.vx;\n status.vy0 = interaction.pointerDelta.client.vy;\n status.v0 = pointerSpeed;\n\n calcInertia(interaction, status);\n\n utils.extend(page, interaction.curCoords.page);\n\n page.x += status.xe;\n page.y += status.ye;\n\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n status.modifiedXe += modifierResult.dx;\n status.modifiedYe += modifierResult.dy;\n\n status.i = animationFrame.request(interaction.boundInertiaFrame);\n }\n else {\n status.smoothEnd = true;\n status.xe = modifierResult.dx;\n status.ye = modifierResult.dy;\n\n status.sx = status.sy = 0;\n\n status.i = animationFrame.request(interaction.boundSmoothEndFrame);\n }\n});\n\nInteraction.signals.on('stop-active', function ({ interaction }) {\n const status = interaction.inertiaStatus;\n\n if (status.active) {\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n }\n});\n\nfunction calcInertia (interaction, status) {\n const inertiaOptions = interaction.target.options[interaction.prepared.name].inertia;\n const lambda = inertiaOptions.resistance;\n const inertiaDur = -Math.log(inertiaOptions.endSpeed / status.v0) / lambda;\n\n status.x0 = interaction.prevEvent.pageX;\n status.y0 = interaction.prevEvent.pageY;\n status.t0 = status.startEvent.timeStamp / 1000;\n status.sx = status.sy = 0;\n\n status.modifiedXe = status.xe = (status.vx0 - inertiaDur) / lambda;\n status.modifiedYe = status.ye = (status.vy0 - inertiaDur) / lambda;\n status.te = inertiaDur;\n\n status.lambda_v0 = lambda / status.v0;\n status.one_ve_v0 = 1 - inertiaOptions.endSpeed / status.v0;\n}\n\nfunction inertiaFrame () {\n updateInertiaCoords(this);\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n\n const status = this.inertiaStatus;\n const options = this.target.options[this.prepared.name].inertia;\n const lambda = options.resistance;\n const t = new Date().getTime() / 1000 - status.t0;\n\n if (t < status.te) {\n\n const progress = 1 - (Math.exp(-lambda * t) - status.lambda_v0) / status.one_ve_v0;\n\n if (status.modifiedXe === status.xe && status.modifiedYe === status.ye) {\n status.sx = status.xe * progress;\n status.sy = status.ye * progress;\n }\n else {\n const quadPoint = utils.getQuadraticCurvePoint(0, 0,\n status.xe,\n status.ye,\n status.modifiedXe,\n status.modifiedYe,\n progress);\n\n status.sx = quadPoint.x;\n status.sy = quadPoint.y;\n }\n\n this.doMove();\n\n status.i = animationFrame.request(this.boundInertiaFrame);\n }\n else {\n status.sx = status.modifiedXe;\n status.sy = status.modifiedYe;\n\n this.doMove();\n this.end(status.startEvent);\n status.active = false;\n this.simulation = null;\n }\n\n utils.copyCoords(this.prevCoords, this.curCoords);\n}\n\nfunction smoothEndFrame () {\n updateInertiaCoords(this);\n\n const status = this.inertiaStatus;\n const t = new Date().getTime() - status.t0;\n const duration = this.target.options[this.prepared.name].inertia.smoothEndDuration;\n\n if (t < duration) {\n status.sx = utils.easeOutQuad(t, 0, status.xe, duration);\n status.sy = utils.easeOutQuad(t, 0, status.ye, duration);\n\n this.pointerMove(status.startEvent, status.startEvent);\n\n status.i = animationFrame.request(this.boundSmoothEndFrame);\n }\n else {\n status.sx = status.xe;\n status.sy = status.ye;\n\n this.pointerMove(status.startEvent, status.startEvent);\n this.end(status.startEvent);\n\n status.smoothEnd =\n status.active = false;\n this.simulation = null;\n }\n}\n\nfunction updateInertiaCoords (interaction) {\n const status = interaction.inertiaStatus;\n\n // return if inertia isn't running\n if (!status.active) { return; }\n\n const pageUp = status.upCoords.page;\n const clientUp = status.upCoords.client;\n\n utils.setCoords(interaction.curCoords, [ {\n pageX : pageUp.x + status.sx,\n pageY : pageUp.y + status.sy,\n clientX: clientUp.x + status.sx,\n clientY: clientUp.y + status.sy,\n } ]);\n}\n","const browser = require('./utils/browser');\nconst events = require('./utils/events');\nconst utils = require('./utils');\nconst scope = require('./scope');\nconst Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\n\nconst globalEvents = {};\n\n/*\\\n * interact\n [ method ]\n *\n * The methods of this variable can be used to set elements as\n * interactables and also to change various default settings.\n *\n * Calling it as a function and passing an element or a valid CSS selector\n * string returns an Interactable object which has various methods to\n * configure it.\n *\n - element (Element | string) The HTML or SVG Element to interact with or CSS selector\n = (object) An @Interactable\n *\n > Usage\n | interact('#draggable').draggable(true);\n |\n | var rectables = interact('rect');\n | rectables\n | .gesturable(true)\n | .on('gesturemove', function (event) {\n | // ...\n | });\n\\*/\nfunction interact (element, options) {\n let interactable = scope.interactables.get(element, options);\n\n if (!interactable) {\n interactable = new Interactable(element, options);\n interactable.events.global = globalEvents;\n }\n\n return interactable;\n}\n\n/*\\\n * interact.isSet\n [ method ]\n *\n * Check if an element has been set\n - element (Element) The Element being searched for\n = (boolean) Indicates if the element or CSS selector was previously passed to interact\n\\*/\ninteract.isSet = function (element, options) {\n return scope.interactables.indexOfElement(element, options && options.context) !== -1;\n};\n\n/*\\\n * interact.on\n [ method ]\n *\n * Adds a global listener for an InteractEvent or adds a DOM event to\n * `document`\n *\n - type (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) interact\n\\*/\ninteract.on = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.on(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.on(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n // if it is an InteractEvent type, add listener to globalEvents\n if (utils.contains(Interactable.eventTypes, type)) {\n // if this type of event was never bound\n if (!globalEvents[type]) {\n globalEvents[type] = [listener];\n }\n else {\n globalEvents[type].push(listener);\n }\n }\n // If non InteractEvent type, addEventListener to document\n else {\n events.add(scope.document, type, listener, { options });\n }\n\n return interact;\n};\n\n/*\\\n * interact.off\n [ method ]\n *\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n - type (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) interact\n \\*/\ninteract.off = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.off(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.off(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n if (!utils.contains(Interactable.eventTypes, type)) {\n events.remove(scope.document, type, listener, options);\n }\n else {\n let index;\n\n if (type in globalEvents\n && (index = utils.indexOf(globalEvents[type], listener)) !== -1) {\n globalEvents[type].splice(index, 1);\n }\n }\n\n return interact;\n};\n\n/*\\\n * interact.debug\n [ method ]\n *\n * Returns an object which exposes internal data\n = (object) An object with properties that outline the current state and expose internal functions and variables\n\\*/\ninteract.debug = function () {\n return scope;\n};\n\n// expose the functions used to calculate multi-touch properties\ninteract.getPointerAverage = utils.pointerAverage;\ninteract.getTouchBBox = utils.touchBBox;\ninteract.getTouchDistance = utils.touchDistance;\ninteract.getTouchAngle = utils.touchAngle;\n\ninteract.getElementRect = utils.getElementRect;\ninteract.getElementClientRect = utils.getElementClientRect;\ninteract.matchesSelector = utils.matchesSelector;\ninteract.closest = utils.closest;\n\n/*\\\n * interact.supportsTouch\n [ method ]\n *\n = (boolean) Whether or not the browser supports touch input\n\\*/\ninteract.supportsTouch = function () {\n return browser.supportsTouch;\n};\n\n/*\\\n * interact.supportsPointerEvent\n [ method ]\n *\n = (boolean) Whether or not the browser supports PointerEvents\n\\*/\ninteract.supportsPointerEvent = function () {\n return browser.supportsPointerEvent;\n};\n\n/*\\\n * interact.stop\n [ method ]\n *\n * Cancels all interactions (end events are not fired)\n *\n - event (Event) An event on which to call preventDefault()\n = (object) interact\n\\*/\ninteract.stop = function (event) {\n for (let i = scope.interactions.length - 1; i >= 0; i--) {\n scope.interactions[i].stop(event);\n }\n\n return interact;\n};\n\n/*\\\n * interact.pointerMoveTolerance\n [ method ]\n * Returns or sets the distance the pointer must be moved before an action\n * sequence occurs. This also affects tolerance for tap events.\n *\n - newValue (number) #optional The movement from the start position must be greater than this value\n = (number | Interactable) The current setting or interact\n\\*/\ninteract.pointerMoveTolerance = function (newValue) {\n if (utils.is.number(newValue)) {\n Interaction.pointerMoveTolerance = newValue;\n\n return this;\n }\n\n return Interaction.pointerMoveTolerance;\n};\n\ninteract.addDocument = scope.addDocument;\ninteract.removeDocument = scope.removeDocument;\n\nscope.interact = interact;\n\nmodule.exports = interact;\n","const Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\nconst scope = require('./scope');\nconst is = require('./utils/is');\nconst events = require('./utils/events');\n\nconst { nodeContains, matchesSelector } = require('./utils/domUtils');\n\n/*\\\n * Interactable.preventDefault\n [ method ]\n *\n * Returns or sets whether to prevent the browser's default behaviour\n * in response to pointer events. Can be set to:\n * - `'always'` to always prevent\n * - `'never'` to never prevent\n * - `'auto'` to let interact.js try to determine what would be best\n *\n - newValue (string) #optional `true`, `false` or `'auto'`\n = (string | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.preventDefault = function (newValue) {\n if (/^(always|never|auto)$/.test(newValue)) {\n this.options.preventDefault = newValue;\n return this;\n }\n\n if (is.bool(newValue)) {\n this.options.preventDefault = newValue? 'always' : 'never';\n return this;\n }\n\n return this.options.preventDefault;\n};\n\nInteractable.prototype.checkAndPreventDefault = function (event) {\n const setting = this.options.preventDefault;\n\n if (setting === 'never') { return; }\n\n if (setting === 'always') {\n event.preventDefault();\n return;\n }\n\n // setting === 'auto'\n\n // don't preventDefault if the browser supports passiveEvents\n // CSS touch-action and user-selecct should be used instead\n if (events.supportsOptions) {\n return;\n }\n\n // don't preventDefault of pointerdown events\n if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) {\n return;\n }\n\n // don't preventDefault on editable elements\n if (is.element(event.target)\n && matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) {\n return;\n }\n\n event.preventDefault();\n};\n\nfunction onInteractionEvent ({ interaction, event }) {\n if (interaction.target) {\n interaction.target.checkAndPreventDefault(event);\n }\n}\n\nfor (const eventSignal of ['down', 'move', 'up', 'cancel']) {\n Interaction.signals.on(eventSignal, onInteractionEvent);\n}\n\n// prevent native HTML5 drag on interact.js target elements\nInteraction.docEvents.dragstart = function preventNativeDrag (event) {\n for (const interaction of scope.interactions) {\n\n if (interaction.element\n && (interaction.element === event.target\n || nodeContains(interaction.element, event.target))) {\n\n interaction.target.checkAndPreventDefault(event);\n return;\n }\n }\n};\n","const scope = require('./scope');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst iFinder = require('./utils/interactionFinder');\nconst pointerEvents = require('./pointerEvents/base');\n\nconst { window } = require('./utils/window');\n\nconst toString = Object.prototype.toString;\n\nif (!window.Array.isArray) {\n window.Array.isArray = function (obj) {\n return toString.call(obj) === '[object Array]';\n };\n}\n\nif (!String.prototype.trim) {\n String.prototype.trim = function () {\n return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n };\n}\n\n// http://www.quirksmode.org/dom/events/click.html\n// >Events leading to dblclick\n//\n// IE8 doesn't fire down event before dblclick.\n// This workaround tries to fire a tap and doubletap after dblclick\nfunction onIE8Dblclick (event) {\n const eventTarget = event.target;\n const interaction = iFinder.search(event, event.type, eventTarget);\n\n if (!interaction) { return; }\n\n if (interaction.prevTap\n && event.clientX === interaction.prevTap.clientX\n && event.clientY === interaction.prevTap.clientY\n && eventTarget === interaction.prevTap.target) {\n\n interaction.downTargets[0] = eventTarget;\n interaction.downTimes [0] = new Date().getTime();\n\n pointerEvents.fire({\n interaction,\n event,\n eventTarget,\n pointer: event,\n type: 'tap',\n });\n }\n}\n\nif (browser.isIE8) {\n const selectFix = function (event) {\n for (const interaction of scope.interactions) {\n if (interaction.interacting()) {\n interaction.target.checkAndPreventDefault(event);\n }\n }\n };\n\n const onDocIE8 = function onDocIE8 ({ doc, win }, signalName) {\n const eventMethod = signalName.indexOf('listen') === 0\n ? events.add : events.remove;\n\n // For IE's lack of Event#preventDefault\n eventMethod(doc, 'selectstart', selectFix);\n\n if (pointerEvents) {\n eventMethod(doc, 'dblclick', onIE8Dblclick);\n }\n };\n\n scope.signals.on('add-document' , onDocIE8);\n scope.signals.on('remove-document', onDocIE8);\n}\n\nmodule.exports = null;\n","const InteractEvent = require('../InteractEvent');\nconst Interaction = require('../Interaction');\nconst extend = require('../utils/extend');\n\nconst modifiers = {\n names: [],\n\n setOffsets: function (arg) {\n const { interaction, pageCoords: page } = arg;\n const { target, element, startOffset } = interaction;\n const rect = target.getRect(element);\n\n if (rect) {\n startOffset.left = page.x - rect.left;\n startOffset.top = page.y - rect.top;\n\n startOffset.right = rect.right - page.x;\n startOffset.bottom = rect.bottom - page.y;\n\n if (!('width' in rect)) { rect.width = rect.right - rect.left; }\n if (!('height' in rect)) { rect.height = rect.bottom - rect.top ; }\n }\n else {\n startOffset.left = startOffset.top = startOffset.right = startOffset.bottom = 0;\n }\n\n arg.rect = rect;\n arg.interactable = target;\n arg.element = element;\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n\n arg.options = target.options[interaction.prepared.name][modifierName];\n\n if (!arg.options) {\n continue;\n }\n\n interaction.modifierOffsets[modifierName] = modifiers[modifierName].setOffset(arg);\n }\n },\n\n setAll: function (arg) {\n const { interaction, statuses, preEnd, requireEndOnly } = arg;\n const coords = extend({}, arg.pageCoords);\n const result = {\n dx: 0,\n dy: 0,\n changed: false,\n locked: false,\n shouldMove: true,\n };\n\n for (const modifierName of modifiers.names) {\n const modifier = modifiers[modifierName];\n const options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!shouldDo(options, preEnd, requireEndOnly)) { continue; }\n\n arg.status = arg.status = statuses[modifierName];\n arg.options = options;\n arg.offset = arg.interaction.modifierOffsets[modifierName];\n\n modifier.set(arg);\n\n if (arg.status.locked) {\n coords.x += arg.status.dx;\n coords.y += arg.status.dy;\n\n result.dx += arg.status.dx;\n result.dy += arg.status.dy;\n\n result.locked = true;\n }\n }\n\n // a move should be fired if:\n // - there are no modifiers enabled,\n // - no modifiers are \"locked\" i.e. have changed the pointer's coordinates, or\n // - the locked coords have changed since the last pointer move\n result.shouldMove = !arg.status || !result.locked || arg.status.changed;\n\n return result;\n },\n\n resetStatuses: function (statuses) {\n for (const modifierName of modifiers.names) {\n const status = statuses[modifierName] || {};\n\n status.dx = status.dy = 0;\n status.modifiedX = status.modifiedY = NaN;\n status.locked = false;\n status.changed = true;\n\n statuses[modifierName] = status;\n }\n\n return statuses;\n },\n\n start: function ({ interaction }, signalName) {\n const arg = {\n interaction,\n pageCoords: (signalName === 'action-resume' ?\n interaction.curCoords : interaction.startCoords).page,\n startOffset: interaction.startOffset,\n statuses: interaction.modifierStatuses,\n preEnd: false,\n requireEndOnly: false,\n };\n\n modifiers.setOffsets(arg);\n modifiers.resetStatuses(arg.statuses);\n\n arg.pageCoords = extend({}, interaction.startCoords.page);\n interaction.modifierResult = modifiers.setAll(arg);\n },\n};\n\nInteraction.signals.on('new', function (interaction) {\n interaction.startOffset = { left: 0, right: 0, top: 0, bottom: 0 };\n interaction.modifierOffsets = {};\n interaction.modifierStatuses = modifiers.resetStatuses({});\n interaction.modifierResult = null;\n});\n\nInteraction.signals.on('action-start' , modifiers.start);\nInteraction.signals.on('action-resume', modifiers.start);\n\nInteraction.signals.on('before-action-move', function ({ interaction, preEnd, interactingBeforeMove }) {\n const modifierResult = modifiers.setAll({\n interaction,\n preEnd,\n pageCoords: interaction.curCoords.page,\n statuses: interaction.modifierStatuses,\n requireEndOnly: false,\n });\n\n // don't fire an action move if a modifier would keep the event in the same\n // cordinates as before\n if (!modifierResult.shouldMove && interactingBeforeMove) {\n interaction._dontFireMove = true;\n }\n\n interaction.modifierResult = modifierResult;\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n for (let i = 0; i < modifiers.names.length; i++) {\n const options = interaction.target.options[interaction.prepared.name][modifiers.names[i]];\n\n // if the endOnly option is true for any modifier\n if (shouldDo(options, true, true)) {\n // fire a move event at the modified coordinates\n interaction.doMove({ event, preEnd: true });\n break;\n }\n }\n});\n\nInteractEvent.signals.on('set-xy', function (arg) {\n const { iEvent, interaction } = arg;\n const modifierArg = extend({}, arg);\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n modifierArg.options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!modifierArg.options) {\n continue;\n }\n\n const modifier = modifiers[modifierName];\n\n modifierArg.status = interaction.modifierStatuses[modifierName];\n\n iEvent[modifierName] = modifier.modifyCoords(modifierArg);\n }\n});\n\nfunction shouldDo (options, preEnd, requireEndOnly) {\n return (options && options.enabled\n && (preEnd || !options.endOnly)\n && (!requireEndOnly || options.endOnly));\n}\n\nmodule.exports = modifiers;\n","const modifiers = require('./index');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst restrict = {\n defaults: {\n enabled : false,\n endOnly : false,\n restriction: null,\n elementRect: null,\n },\n\n setOffset: function ({ rect, startOffset, options }) {\n const elementRect = options && options.elementRect;\n const offset = {};\n\n if (rect && elementRect) {\n offset.left = startOffset.left - (rect.width * elementRect.left);\n offset.top = startOffset.top - (rect.height * elementRect.top);\n\n offset.right = startOffset.right - (rect.width * (1 - elementRect.right));\n offset.bottom = startOffset.bottom - (rect.height * (1 - elementRect.bottom));\n }\n else {\n offset.left = offset.top = offset.right = offset.bottom = 0;\n }\n\n return offset;\n },\n\n set: function ({ pageCoords, interaction, status, options }) {\n if (!options) { return status; }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n\n const restriction = getRestrictionRect(options.restriction, interaction, page);\n\n if (!restriction) { return status; }\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n const rect = restriction;\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n const offset = interaction.modifierOffsets.restrict;\n\n // object is assumed to have\n // x, y, width, height or\n // left, top, right, bottom\n if ('x' in restriction && 'y' in restriction) {\n modifiedX = Math.max(Math.min(rect.x + rect.width - offset.right , page.x), rect.x + offset.left);\n modifiedY = Math.max(Math.min(rect.y + rect.height - offset.bottom, page.y), rect.y + offset.top );\n }\n else {\n modifiedX = Math.max(Math.min(rect.right - offset.right , page.x), rect.left + offset.left);\n modifiedY = Math.max(Math.min(rect.bottom - offset.bottom, page.y), rect.top + offset.top );\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const elementRect = options && options.elementRect;\n\n if (options && options.enabled\n && !(phase === 'start' && elementRect && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n getRestrictionRect,\n};\n\nfunction getRestrictionRect (value, interaction, page) {\n if (utils.is.function(value)) {\n return utils.resolveRectLike(value, interaction.target, interaction.element, [page.x, page.y, interaction]);\n } else {\n return utils.resolveRectLike(value, interaction.target, interaction.element);\n }\n}\n\nmodifiers.restrict = restrict;\nmodifiers.names.push('restrict');\n\ndefaultOptions.perAction.restrict = restrict.defaults;\n\nmodule.exports = restrict;\n","// This module adds the options.resize.restrictEdges setting which sets min and\n// max for the top, left, bottom and right edges of the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictEdges: {\n// inner: { top: 200, left: 200, right: 400, bottom: 400 },\n// outer: { top: 0, left: 0, right: 600, bottom: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst { getRestrictionRect } = require('./restrict');\n\nconst noInner = { top: +Infinity, left: +Infinity, bottom: -Infinity, right: -Infinity };\nconst noOuter = { top: -Infinity, left: -Infinity, bottom: +Infinity, right: +Infinity };\n\nconst restrictEdges = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n offset: null,\n },\n\n setOffset: function ({ interaction, startOffset, options }) {\n if (!options) {\n return utils.extend({}, startOffset);\n }\n\n const offset = getRestrictionRect(options.offset, interaction, interaction.startCoords.page);\n\n if (offset) {\n return {\n top: startOffset.top + offset.y,\n left: startOffset.left + offset.x,\n bottom: startOffset.bottom + offset.y,\n right: startOffset.right + offset.x,\n };\n }\n\n return startOffset;\n },\n\n set: function ({ pageCoords, interaction, status, offset, options }) {\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n const inner = rectUtils.xywhToTlbr(getRestrictionRect(options.inner, interaction, page)) || noInner;\n const outer = rectUtils.xywhToTlbr(getRestrictionRect(options.outer, interaction, page)) || noOuter;\n\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n if (edges.top) {\n modifiedY = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top);\n }\n else if (edges.bottom) {\n modifiedY = Math.max(Math.min(outer.bottom - offset.bottom, page.y), inner.bottom - offset.bottom);\n }\n if (edges.left) {\n modifiedX = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left);\n }\n else if (edges.right) {\n modifiedX = Math.max(Math.min(outer.right - offset.right, page.x), inner.right - offset.right);\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n if (options && options.enabled\n && !(phase === 'start' && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n noInner,\n noOuter,\n getRestrictionRect,\n};\n\nmodifiers.restrictEdges = restrictEdges;\nmodifiers.names.push('restrictEdges');\n\ndefaultOptions.perAction.restrictEdges = restrictEdges.defaults;\nresize.defaults.restrictEdges = restrictEdges.defaults;\n\nmodule.exports = restrictEdges;\n","// This module adds the options.resize.restrictSize setting which sets min and\n// max width and height for the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictSize: {\n// min: { width: -600, height: -600 },\n// max: { width: 600, height: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst restrictEdges = require('./restrictEdges');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst noMin = { width: -Infinity, height: -Infinity };\nconst noMax = { width: +Infinity, height: +Infinity };\n\nconst restrictSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n },\n\n setOffset: function ({ interaction }) {\n return interaction.startOffset;\n },\n\n set: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const rect = rectUtils.xywhToTlbr(interaction.resizeRects.inverted);\n\n const minSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.min, interaction)) || noMin;\n const maxSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.max, interaction)) || noMax;\n\n arg.options = {\n enabled: options.enabled,\n endOnly: options.endOnly,\n inner: utils.extend({}, restrictEdges.noInner),\n outer: utils.extend({}, restrictEdges.noOuter),\n };\n\n if (edges.top) {\n arg.options.inner.top = rect.bottom - minSize.height;\n arg.options.outer.top = rect.bottom - maxSize.height;\n }\n else if (edges.bottom) {\n arg.options.inner.bottom = rect.top + minSize.height;\n arg.options.outer.bottom = rect.top + maxSize.height;\n }\n if (edges.left) {\n arg.options.inner.left = rect.right - minSize.width;\n arg.options.outer.left = rect.right - maxSize.width;\n }\n else if (edges.right) {\n arg.options.inner.right = rect.left + minSize.width;\n arg.options.outer.right = rect.left + maxSize.width;\n }\n\n restrictEdges.set(arg);\n },\n\n modifyCoords: restrictEdges.modifyCoords,\n};\n\nmodifiers.restrictSize = restrictSize;\nmodifiers.names.push('restrictSize');\n\ndefaultOptions.perAction.restrictSize = restrictSize.defaults;\nresize.defaults.restrictSize = restrictSize.defaults;\n\nmodule.exports = restrictSize;\n","const modifiers = require('./index');\nconst interact = require('../interact');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst snap = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n\n relativePoints: null,\n },\n\n setOffset: function ({ interaction, interactable, element, rect, startOffset, options }) {\n const offsets = [];\n const optionsOrigin = utils.rectToXY(utils.resolveRectLike(options.origin));\n const origin = optionsOrigin || utils.getOriginXY(interactable, element, interaction.prepared.name);\n options = options || interactable.options[interaction.prepared.name].snap || {};\n\n let snapOffset;\n\n if (options.offset === 'startCoords') {\n snapOffset = {\n x: interaction.startCoords.page.x - origin.x,\n y: interaction.startCoords.page.y - origin.y,\n };\n }\n else {\n const offsetRect = utils.resolveRectLike(options.offset, interactable, element, [interaction]);\n\n snapOffset = utils.rectToXY(offsetRect) || { x: 0, y: 0 };\n }\n\n if (rect && options.relativePoints && options.relativePoints.length) {\n for (const { x: relativeX, y: relativeY } of options.relativePoints) {\n offsets.push({\n x: startOffset.left - (rect.width * relativeX) + snapOffset.x,\n y: startOffset.top - (rect.height * relativeY) + snapOffset.y,\n });\n }\n }\n else {\n offsets.push(snapOffset);\n }\n\n return offsets;\n },\n\n set: function ({ interaction, pageCoords, status, options, offset: offsets }) {\n const targets = [];\n let target;\n let page;\n let i;\n\n if (status.useStatusXY) {\n page = { x: status.x, y: status.y };\n }\n else {\n const origin = utils.getOriginXY(interaction.target, interaction.element, interaction.prepared.name);\n\n page = utils.extend({}, pageCoords);\n\n page.x -= origin.x;\n page.y -= origin.y;\n }\n\n status.realX = page.x;\n status.realY = page.y;\n\n let len = options.targets? options.targets.length : 0;\n\n for (const { x: offsetX, y: offsetY } of offsets) {\n const relativeX = page.x - offsetX;\n const relativeY = page.y - offsetY;\n\n for (const snapTarget of options.targets) {\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n targets.push({\n x: utils.is.number(target.x) ? (target.x + offsetX) : relativeX,\n y: utils.is.number(target.y) ? (target.y + offsetY) : relativeY,\n\n range: utils.is.number(target.range)? target.range: options.range,\n });\n }\n }\n\n const closest = {\n target: null,\n inRange: false,\n distance: 0,\n range: 0,\n dx: 0,\n dy: 0,\n };\n\n for (i = 0, len = targets.length; i < len; i++) {\n target = targets[i];\n\n const range = target.range;\n const dx = target.x - page.x;\n const dy = target.y - page.y;\n const distance = utils.hypot(dx, dy);\n let inRange = distance <= range;\n\n // Infinite targets count as being out of range\n // compared to non infinite ones that are in range\n if (range === Infinity && closest.inRange && closest.range !== Infinity) {\n inRange = false;\n }\n\n if (!closest.target || (inRange\n // is the closest target in range?\n ? (closest.inRange && range !== Infinity\n // the pointer is relatively deeper in this target\n ? distance / range < closest.distance / closest.range\n // this target has Infinite range and the closest doesn't\n : (range === Infinity && closest.range !== Infinity)\n // OR this target is closer that the previous closest\n || distance < closest.distance)\n // The other is not in range and the pointer is closer to this target\n : (!closest.inRange && distance < closest.distance))) {\n\n closest.target = target;\n closest.distance = distance;\n closest.range = range;\n closest.inRange = inRange;\n closest.dx = dx;\n closest.dy = dy;\n\n status.range = range;\n }\n }\n\n let snapChanged;\n\n if (closest.target) {\n snapChanged = (status.modifiedX !== closest.target.x || status.modifiedY !== closest.target.y);\n\n status.modifiedX = closest.target.x;\n status.modifiedY = closest.target.y;\n }\n else {\n snapChanged = true;\n\n status.modifiedX = NaN;\n status.modifiedY = NaN;\n }\n\n status.dx = closest.dx;\n status.dy = closest.dy;\n\n status.changed = (snapChanged || (closest.inRange && !status.locked));\n status.locked = closest.inRange;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const relativePoints = options && options.relativePoints;\n\n if (options && options.enabled\n && !(phase === 'start' && relativePoints && relativePoints.length)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n }\n\n return {\n range : status.range,\n locked : status.locked,\n x : status.modifiedX,\n y : status.modifiedY,\n realX : status.realX,\n realY : status.realY,\n dx : status.dx,\n dy : status.dy,\n };\n }\n },\n};\n\ninteract.createSnapGrid = function (grid) {\n return function (x, y) {\n const limits = grid.limits || {\n left : -Infinity,\n right : Infinity,\n top : -Infinity,\n bottom: Infinity,\n };\n let offsetX = 0;\n let offsetY = 0;\n\n if (utils.is.object(grid.offset)) {\n offsetX = grid.offset.x;\n offsetY = grid.offset.y;\n }\n\n const gridx = Math.round((x - offsetX) / grid.x);\n const gridy = Math.round((y - offsetY) / grid.y);\n\n const newX = Math.max(limits.left, Math.min(limits.right , gridx * grid.x + offsetX));\n const newY = Math.max(limits.top , Math.min(limits.bottom, gridy * grid.y + offsetY));\n\n return {\n x: newX,\n y: newY,\n range: grid.range,\n };\n };\n};\n\nmodifiers.snap = snap;\nmodifiers.names.push('snap');\n\ndefaultOptions.perAction.snap = snap.defaults;\n\nmodule.exports = snap;\n","// This module allows snapping of the size of targets during resize\n// interactions.\n\nconst modifiers = require('./index');\nconst snap = require('./snap');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\nconst utils = require('../utils/');\n\nconst snapSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n },\n\n setOffset: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.edges;\n\n if (!edges) { return; }\n\n arg.options = {\n relativePoints: [{\n x: edges.left? 0 : 1,\n y: edges.top ? 0 : 1,\n }],\n origin: { x: 0, y: 0 },\n offset: 'self',\n range: options.range,\n };\n\n const offsets = snap.setOffset(arg);\n arg.options = options;\n\n return offsets;\n },\n\n set: function (arg) {\n const { interaction, options, offset, pageCoords } = arg;\n const page = utils.extend({}, pageCoords);\n const relativeX = page.x - offset[0].x;\n const relativeY = page.y - offset[0].y;\n\n arg.options = utils.extend({}, options);\n arg.options.targets = [];\n\n for (const snapTarget of options.targets) {\n let target;\n\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n if ('width' in target && 'height' in target) {\n target.x = target.width;\n target.y = target.height;\n }\n\n arg.options.targets.push(target);\n }\n\n snap.set(arg);\n },\n\n modifyCoords: function (arg) {\n const { options } = arg;\n\n arg.options = utils.extend({}, options);\n arg.options.enabled = options.enabled;\n arg.options.relativePoints = [null];\n\n snap.modifyCoords(arg);\n },\n};\n\nmodifiers.snapSize = snapSize;\nmodifiers.names.push('snapSize');\n\ndefaultOptions.perAction.snapSize = snapSize.defaults;\nresize.defaults.snapSize = snapSize.defaults;\n\nmodule.exports = snapSize;\n","const pointerUtils = require('../utils/pointerUtils');\n\nmodule.exports = class PointerEvent {\n constructor (type, pointer, event, eventTarget, interaction) {\n pointerUtils.pointerExtend(this, event);\n\n if (event !== pointer) {\n pointerUtils.pointerExtend(this, pointer);\n }\n\n this.interaction = interaction;\n\n this.timeStamp = new Date().getTime();\n this.originalEvent = event;\n this.type = type;\n this.pointerId = pointerUtils.getPointerId(pointer);\n this.pointerType = pointerUtils.getPointerType(pointer, interaction);\n this.target = eventTarget;\n this.currentTarget = null;\n\n if (type === 'tap') {\n const pointerIndex = interaction.getPointerIndex(pointer);\n this.dt = this.timeStamp - interaction.downTimes[pointerIndex];\n\n const interval = this.timeStamp - interaction.tapTime;\n\n this.double = !!(interaction.prevTap\n && interaction.prevTap.type !== 'doubletap'\n && interaction.prevTap.target === this.target\n && interval < 500);\n }\n else if (type === 'doubletap') {\n this.dt = pointer.timeStamp - interaction.tapTime;\n }\n }\n\n subtractOrigin ({ x: originX, y: originY }) {\n this.pageX -= originX;\n this.pageY -= originY;\n this.clientX -= originX;\n this.clientY -= originY;\n\n return this;\n }\n\n addOrigin ({ x: originX, y: originY }) {\n this.pageX += originX;\n this.pageY += originY;\n this.clientX += originX;\n this.clientY += originY;\n\n return this;\n }\n\n preventDefault () {\n this.originalEvent.preventDefault();\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n};\n","const PointerEvent = require('./PointerEvent');\nconst Interaction = require('../Interaction');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst defaults = require('../defaultOptions');\nconst signals = require('../utils/Signals').new();\nconst { filter } = require('../utils/arr');\n\nconst simpleSignals = [ 'down', 'up', 'cancel' ];\nconst simpleEvents = [ 'down', 'up', 'cancel' ];\n\nconst pointerEvents = {\n PointerEvent,\n fire,\n collectEventTargets,\n signals,\n defaults: {\n holdDuration: 600,\n ignoreFrom : null,\n allowFrom : null,\n origin : { x: 0, y: 0 },\n },\n types: [\n 'down',\n 'move',\n 'up',\n 'cancel',\n 'tap',\n 'doubletap',\n 'hold',\n ],\n};\n\nfunction fire (arg) {\n const {\n interaction, pointer, event, eventTarget,\n type = arg.pointerEvent.type,\n targets = collectEventTargets(arg),\n pointerEvent = new PointerEvent(type, pointer, event, eventTarget, interaction),\n } = arg;\n\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n targets,\n type,\n pointerEvent,\n };\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n\n for (const prop in target.props || {}) {\n pointerEvent[prop] = target.props[prop];\n }\n\n const origin = utils.getOriginXY(target.eventable, target.element);\n\n pointerEvent.subtractOrigin(origin);\n pointerEvent.eventable = target.eventable;\n pointerEvent.currentTarget = target.element;\n\n target.eventable.fire(pointerEvent);\n\n pointerEvent.addOrigin(origin);\n\n if (pointerEvent.immediatePropagationStopped\n || (pointerEvent.propagationStopped\n && (i + 1) < targets.length && targets[i + 1].element !== pointerEvent.currentTarget)) {\n break;\n }\n }\n\n signals.fire('fired', signalArg);\n\n if (type === 'tap') {\n // if pointerEvent should make a double tap, create and fire a doubletap\n // PointerEvent and use that as the prevTap\n const prevTap = pointerEvent.double\n ? fire({\n interaction, pointer, event, eventTarget,\n type: 'doubletap',\n })\n : pointerEvent;\n\n interaction.prevTap = prevTap;\n interaction.tapTime = prevTap.timeStamp;\n }\n\n return pointerEvent;\n}\n\nfunction collectEventTargets ({ interaction, pointer, event, eventTarget, type }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n // do not fire a tap event if the pointer was moved before being lifted\n if (type === 'tap' && (interaction.pointerWasMoved\n // or if the pointerup target is different to the pointerdown target\n || !(interaction.downTargets[pointerIndex] && interaction.downTargets[pointerIndex] === eventTarget))) {\n return [];\n }\n\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n path,\n targets: [],\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (type === 'hold') {\n signalArg.targets = filter(signalArg.targets, target =>\n target.eventable.options.holdDuration === interaction.holdTimers[pointerIndex].duration);\n }\n\n return signalArg.targets;\n}\n\nInteraction.signals.on('update-pointer-down', function ({ interaction, pointerIndex }) {\n interaction.holdTimers[pointerIndex] = { duration: Infinity, timeout: null };\n});\n\nInteraction.signals.on('remove-pointer', function ({ interaction, pointerIndex }) {\n interaction.holdTimers.splice(pointerIndex, 1);\n});\n\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget, duplicateMove }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n if (!duplicateMove && (!interaction.pointerIsDown || interaction.pointerWasMoved)) {\n if (interaction.pointerIsDown) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n\n fire({\n interaction, pointer, event, eventTarget,\n type: 'move',\n });\n }\n});\n\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget, pointerIndex }) {\n // copy event to be used in timeout for IE8\n const eventCopy = browser.isIE8? utils.extend({}, event) : event;\n\n const timer = interaction.holdTimers[pointerIndex];\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'hold',\n targets: [],\n path,\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (!signalArg.targets.length) { return; }\n\n let minDuration = Infinity;\n\n for (let i = 0; i < signalArg.targets.length; i++) {\n const target = signalArg.targets[i];\n const holdDuration = target.eventable.options.holdDuration;\n\n if (holdDuration < minDuration) {\n minDuration = holdDuration;\n }\n }\n\n timer.duration = minDuration;\n timer.timeout = setTimeout(function () {\n fire({\n interaction, eventCopy, eventTarget,\n pointer: browser.isIE8? eventCopy : pointer,\n type: 'hold',\n });\n }, minDuration);\n});\n\nInteraction.signals.on('up', ({ interaction, pointer, event, eventTarget }) => {\n if (!interaction.pointerWasMoved) {\n fire({ interaction, eventTarget, pointer, event, type: 'tap' });\n }\n});\n\n['up', 'cancel'].forEach(function (signalName) {\n Interaction.signals.on(signalName, function ({ interaction, pointerIndex }) {\n if (interaction.holdTimers[pointerIndex]) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n });\n});\n\nfunction createSignalListener (type) {\n return function ({ interaction, pointer, event, eventTarget }) {\n fire({ interaction, eventTarget, pointer, event, type });\n };\n}\n\nfor (let i = 0; i < simpleSignals.length; i++) {\n Interaction.signals.on(simpleSignals[i], createSignalListener(simpleEvents[i]));\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.prevTap = null; // the most recent tap event on this interaction\n interaction.tapTime = 0; // time of the most recent tap event\n interaction.holdTimers = []; // [{ duration, timeout }]\n});\n\ndefaults.pointerEvents = pointerEvents.defaults;\nmodule.exports = pointerEvents;\n","const pointerEvents = require('./base');\nconst Interaction = require('../Interaction');\n\npointerEvents.signals.on('new', onNew);\npointerEvents.signals.on('fired', onFired);\n\nfor (const signal of ['move', 'up', 'cancel', 'endall']) {\n Interaction.signals.on(signal, endHoldRepeat);\n}\n\nfunction onNew ({ pointerEvent }) {\n if (pointerEvent.type !== 'hold') { return; }\n\n pointerEvent.count = (pointerEvent.count || 0) + 1;\n}\n\nfunction onFired ({ interaction, pointerEvent, eventTarget, targets }) {\n if (pointerEvent.type !== 'hold' || !targets.length) { return; }\n\n // get the repeat interval from the first eventable\n const interval = targets[0].eventable.options.holdRepeatInterval;\n\n // don't repeat if the interval is 0 or less\n if (interval <= 0) { return; }\n\n // set a timeout to fire the holdrepeat event\n interaction.holdIntervalHandle = setTimeout(function () {\n pointerEvents.fire({\n interaction,\n eventTarget,\n type: 'hold',\n pointer: pointerEvent,\n event: pointerEvent,\n });\n }, interval);\n}\n\nfunction endHoldRepeat ({ interaction }) {\n // set the interaction's holdStopTime property\n // to stop further holdRepeat events\n if (interaction.holdIntervalHandle) {\n clearInterval(interaction.holdIntervalHandle);\n interaction.holdIntervalHandle = null;\n }\n}\n\n// don't repeat by default\npointerEvents.defaults.holdRepeatInterval = 0;\npointerEvents.types.push('holdrepeat');\n\nmodule.exports = {\n onNew,\n onFired,\n endHoldRepeat,\n};\n","const pointerEvents = require('./base');\nconst Interactable = require('../Interactable');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\nconst scope = require('../scope');\nconst extend = require('../utils/extend');\nconst { merge } = require('../utils/arr');\n\npointerEvents.signals.on('collect-targets', function ({ targets, element, type, eventTarget }) {\n function collectSelectors (interactable, selector, context) {\n const els = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && is.element(element)\n && domUtils.matchesSelector(element, selector, els)\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n const interactable = scope.interactables.get(element);\n\n if (interactable) {\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n scope.interactables.forEachSelector(collectSelectors, element);\n});\n\nInteractable.signals.on('new', function ({ interactable }) {\n interactable.events.getRect = function (element) {\n return interactable.getRect(element);\n };\n});\n\nInteractable.signals.on('set', function ({ interactable, options }) {\n extend(interactable.events.options, pointerEvents.defaults);\n extend(interactable.events.options, options);\n});\n\nmerge(Interactable.eventTypes, pointerEvents.types);\n\nInteractable.prototype.pointerEvents = function (options) {\n extend(this.events.options, options);\n\n return this;\n};\n\nconst __backCompatOption = Interactable.prototype._backCompatOption;\n\nInteractable.prototype._backCompatOption = function (optionName, newValue) {\n const ret = __backCompatOption.call(this, optionName, newValue);\n\n if (ret === this) {\n this.events.options[optionName] = newValue;\n }\n\n return ret;\n};\n\nInteractable.settingsMethods.push('pointerEvents');\n","const utils = require('./utils');\nconst events = require('./utils/events');\nconst signals = require('./utils/Signals').new();\n\nconst scope = {\n signals,\n events,\n utils,\n\n // main document\n document: require('./utils/domObjects').document,\n // all documents being listened to\n documents: [],\n\n addDocument: function (doc, win) {\n // do nothing if document is already known\n if (utils.contains(scope.documents, doc)) { return false; }\n\n win = win || scope.getWindow(doc);\n\n scope.documents.push(doc);\n events.documents.push(doc);\n\n // don't add an unload event for the main document\n // so that the page may be cached in browser history\n if (doc !== scope.document) {\n events.add(win, 'unload', scope.onWindowUnload);\n }\n\n signals.fire('add-document', { doc, win });\n },\n\n removeDocument: function (doc, win) {\n const index = utils.indexOf(scope.documents, doc);\n\n win = win || scope.getWindow(doc);\n\n events.remove(win, 'unload', scope.onWindowUnload);\n\n scope.documents.splice(index, 1);\n events.documents.splice(index, 1);\n\n signals.fire('remove-document', { win, doc });\n },\n\n onWindowUnload: function () {\n scope.removeDocument(this.document, this);\n },\n};\n\nmodule.exports = scope;\n","const { indexOf } = require('./arr');\n\nclass Signals {\n constructor () {\n this.listeners = {\n // signalName: [listeners],\n };\n }\n\n on (name, listener) {\n if (!this.listeners[name]) {\n this.listeners[name] = [listener];\n return;\n }\n\n this.listeners[name].push(listener);\n }\n\n off (name, listener) {\n if (!this.listeners[name]) { return; }\n\n const index = indexOf(this.listeners[name], listener);\n\n if (index !== -1) {\n this.listeners[name].splice(index, 1);\n }\n }\n\n fire (name, arg) {\n const targetListeners = this.listeners[name];\n\n if (!targetListeners) { return; }\n\n for (let i = 0; i < targetListeners.length; i++) {\n if (targetListeners[i](arg, name) === false) {\n return;\n }\n }\n }\n}\n\nSignals.new = function () {\n return new Signals();\n};\n\nmodule.exports = Signals;\n","function indexOf (array, target) {\n for (let i = 0, len = array.length; i < len; i++) {\n if (array[i] === target) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction contains (array, target) {\n return indexOf(array, target) !== -1;\n}\n\nfunction merge (target, source) {\n for (let i = 0; i < source.length; i++) {\n target.push(source[i]);\n }\n\n return target;\n}\n\nfunction filter (array, test) {\n const result = [];\n\n for (let i = 0; i < array.length; i++) {\n if (test(array[i])) {\n result.push(array[i]);\n }\n }\n\n return result;\n}\n\nmodule.exports = {\n indexOf,\n contains,\n merge,\n filter,\n};\n","const { window } = require('./window');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst Element = domObjects.Element;\nconst navigator = window.navigator;\n\nconst browser = {\n // Does the browser support touch input?\n supportsTouch: !!(('ontouchstart' in window) || is.function(window.DocumentTouch)\n && domObjects.document instanceof window.DocumentTouch),\n\n // Does the browser support PointerEvents\n supportsPointerEvent: !!domObjects.PointerEvent,\n\n isIE8: ('attachEvent' in window) && !('addEventListener' in window),\n\n // Opera Mobile must be handled differently\n isOperaMobile: (navigator.appName === 'Opera'\n && browser.supportsTouch\n && navigator.userAgent.match('Presto')),\n\n // scrolling doesn't change the result of getClientRects on iOS 7\n isIOS7: (/iP(hone|od|ad)/.test(navigator.platform)\n && /OS 7[^\\d]/.test(navigator.appVersion)),\n\n isIe9OrOlder: /MSIE (8|9)/.test(navigator.userAgent),\n\n // prefix matchesSelector\n prefixedMatchesSelector: 'matches' in Element.prototype\n ? 'matches': 'webkitMatchesSelector' in Element.prototype\n ? 'webkitMatchesSelector': 'mozMatchesSelector' in Element.prototype\n ? 'mozMatchesSelector': 'oMatchesSelector' in Element.prototype\n ? 'oMatchesSelector': 'msMatchesSelector',\n\n useMatchesSelectorPolyfill: false,\n\n pEventTypes: (domObjects.PointerEvent\n ? (domObjects.PointerEvent === window.MSPointerEvent\n ? {\n up: 'MSPointerUp',\n down: 'MSPointerDown',\n over: 'mouseover',\n out: 'mouseout',\n move: 'MSPointerMove',\n cancel: 'MSPointerCancel',\n }\n : {\n up: 'pointerup',\n down: 'pointerdown',\n over: 'pointerover',\n out: 'pointerout',\n move: 'pointermove',\n cancel: 'pointercancel',\n })\n : null),\n\n // because Webkit and Opera still use 'mousewheel' event type\n wheelEvent: 'onmousewheel' in domObjects.document? 'mousewheel': 'wheel',\n\n};\n\nbrowser.useMatchesSelectorPolyfill = !is.function(Element.prototype[browser.prefixedMatchesSelector]);\n\nmodule.exports = browser;\n","const domObjects = {};\nconst win = require('./window').window;\n\nfunction blank () {}\n\ndomObjects.document = win.document;\ndomObjects.DocumentFragment = win.DocumentFragment || blank;\ndomObjects.SVGElement = win.SVGElement || blank;\ndomObjects.SVGSVGElement = win.SVGSVGElement || blank;\ndomObjects.SVGElementInstance = win.SVGElementInstance || blank;\ndomObjects.Element = win.Element || blank;\ndomObjects.HTMLElement = win.HTMLElement || domObjects.Element;\n\ndomObjects.Event = win.Event;\ndomObjects.Touch = win.Touch || blank;\ndomObjects.PointerEvent = (win.PointerEvent || win.MSPointerEvent);\n\nmodule.exports = domObjects;\n","const win = require('./window');\nconst browser = require('./browser');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst domUtils = {\n nodeContains: function (parent, child) {\n while (child) {\n if (child === parent) {\n return true;\n }\n\n child = child.parentNode;\n }\n\n return false;\n },\n\n closest: function (element, selector) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) { return element; }\n\n element = domUtils.parentNode(element);\n }\n\n return null;\n },\n\n parentNode: function (node) {\n let parent = node.parentNode;\n\n if (is.docFrag(parent)) {\n // skip past #shado-root fragments\n while ((parent = parent.host) && is.docFrag(parent)) {\n continue;\n }\n\n return parent;\n }\n\n return parent;\n },\n\n // taken from http://tanalin.com/en/blog/2012/12/matches-selector-ie8/ and modified\n matchesSelectorPolyfill: browser.useMatchesSelectorPolyfill\n ? function (element, selector, elems) {\n elems = elems || element.parentNode.querySelectorAll(selector);\n\n for (let i = 0, len = elems.length; i < len; i++) {\n if (elems[i] === element) {\n return true;\n }\n }\n\n return false;\n }\n : null,\n\n matchesSelector: function (element, selector, nodeList) {\n if (browser.useMatchesSelectorPolyfill) {\n return domUtils.matchesSelectorPolyfill(element, selector, nodeList);\n }\n\n // remove /deep/ from selectors if shadowDOM polyfill is used\n if (win.window !== win.realWindow) {\n selector = selector.replace(/\\/deep\\//g, ' ');\n }\n\n return element[browser.prefixedMatchesSelector](selector);\n },\n\n // Test for the element that's \"above\" all other qualifiers\n indexOfDeepestElement: function (elements) {\n let deepestZoneParents = [];\n let dropzoneParents = [];\n let dropzone;\n let deepestZone = elements[0];\n let index = deepestZone? 0: -1;\n let parent;\n let child;\n let i;\n let n;\n\n for (i = 1; i < elements.length; i++) {\n dropzone = elements[i];\n\n // an element might belong to multiple selector dropzones\n if (!dropzone || dropzone === deepestZone) {\n continue;\n }\n\n if (!deepestZone) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n // check if the deepest or current are document.documentElement or document.rootElement\n // - if the current dropzone is, do nothing and continue\n if (dropzone.parentNode === dropzone.ownerDocument) {\n continue;\n }\n // - if deepest is, update with the current dropzone and continue to next\n else if (deepestZone.parentNode === dropzone.ownerDocument) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n if (!deepestZoneParents.length) {\n parent = deepestZone;\n while (parent.parentNode && parent.parentNode !== parent.ownerDocument) {\n deepestZoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n }\n\n // if this element is an svg element and the current deepest is\n // an HTMLElement\n if (deepestZone instanceof domObjects.HTMLElement\n && dropzone instanceof domObjects.SVGElement\n && !(dropzone instanceof domObjects.SVGSVGElement)) {\n\n if (dropzone === deepestZone.parentNode) {\n continue;\n }\n\n parent = dropzone.ownerSVGElement;\n }\n else {\n parent = dropzone;\n }\n\n dropzoneParents = [];\n\n while (parent.parentNode !== parent.ownerDocument) {\n dropzoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n\n n = 0;\n\n // get (position of last common ancestor) + 1\n while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) {\n n++;\n }\n\n const parents = [\n dropzoneParents[n - 1],\n dropzoneParents[n],\n deepestZoneParents[n],\n ];\n\n child = parents[0].lastChild;\n\n while (child) {\n if (child === parents[1]) {\n deepestZone = dropzone;\n index = i;\n deepestZoneParents = [];\n\n break;\n }\n else if (child === parents[2]) {\n break;\n }\n\n child = child.previousSibling;\n }\n }\n\n return index;\n },\n\n matchesUpTo: function (element, selector, limit) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) {\n return true;\n }\n\n element = domUtils.parentNode(element);\n\n if (element === limit) {\n return domUtils.matchesSelector(element, selector);\n }\n }\n\n return false;\n },\n\n getActualElement: function (element) {\n return (element instanceof domObjects.SVGElementInstance\n ? element.correspondingUseElement\n : element);\n },\n\n getScrollXY: function (relevantWindow) {\n relevantWindow = relevantWindow || win.window;\n return {\n x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft,\n y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop,\n };\n },\n\n getElementClientRect: function (element) {\n const clientRect = (element instanceof domObjects.SVGElement\n ? element.getBoundingClientRect()\n : element.getClientRects()[0]);\n\n return clientRect && {\n left : clientRect.left,\n right : clientRect.right,\n top : clientRect.top,\n bottom: clientRect.bottom,\n width : clientRect.width || clientRect.right - clientRect.left,\n height: clientRect.height || clientRect.bottom - clientRect.top,\n };\n },\n\n getElementRect: function (element) {\n const clientRect = domUtils.getElementClientRect(element);\n\n if (!browser.isIOS7 && clientRect) {\n const scroll = domUtils.getScrollXY(win.getWindow(element));\n\n clientRect.left += scroll.x;\n clientRect.right += scroll.x;\n clientRect.top += scroll.y;\n clientRect.bottom += scroll.y;\n }\n\n return clientRect;\n },\n\n getPath: function (element) {\n const path = [];\n\n while (element) {\n path.push(element);\n element = domUtils.parentNode(element);\n }\n\n return path;\n },\n\n trySelector: value => {\n if (!is.string(value)) { return false; }\n\n // an exception will be raised if it is invalid\n domObjects.document.querySelector(value);\n return true;\n },\n};\n\nmodule.exports = domUtils;\n","const is = require('./is');\nconst domUtils = require('./domUtils');\nconst pExtend = require('./pointerExtend');\n\nconst { window, getWindow } = require('./window');\nconst { indexOf, contains } = require('./arr');\n\nconst useAttachEvent = ('attachEvent' in window) && !('addEventListener' in window);\nconst addEvent = useAttachEvent? 'attachEvent': 'addEventListener';\nconst removeEvent = useAttachEvent? 'detachEvent': 'removeEventListener';\nconst on = useAttachEvent? 'on': '';\n\nconst elements = [];\nconst targets = [];\nconst attachedListeners = [];\n\n// {\n// type: {\n// selectors: ['selector', ...],\n// contexts : [document, ...],\n// listeners: [[listener, capture, passive], ...]\n// }\n// }\nconst delegatedEvents = {};\n\nconst documents = [];\n\nconst supportsOptions = !useAttachEvent && (() => {\n let supported = false;\n\n window.document.createElement('div').addEventListener('test', null, {\n get capture () { supported = true; },\n });\n\n return supported;\n})();\n\nfunction add (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n let elementIndex = indexOf(elements, element);\n let target = targets[elementIndex];\n\n if (!target) {\n target = {\n events: {},\n typeCount: 0,\n };\n\n elementIndex = elements.push(element) - 1;\n targets.push(target);\n\n attachedListeners.push(useAttachEvent\n ? {\n supplied: [],\n wrapped : [],\n useCount: [],\n }\n : null);\n }\n\n if (!target.events[type]) {\n target.events[type] = [];\n target.typeCount++;\n }\n\n if (!contains(target.events[type], listener)) {\n let ret;\n\n if (useAttachEvent) {\n const { supplied, wrapped, useCount } = attachedListeners[elementIndex];\n const listenerIndex = indexOf(supplied, listener);\n\n const wrappedListener = wrapped[listenerIndex] || function (event) {\n if (!event.immediatePropagationStopped) {\n event.target = event.srcElement;\n event.currentTarget = element;\n\n event.preventDefault = event.preventDefault || preventDef;\n event.stopPropagation = event.stopPropagation || stopProp;\n event.stopImmediatePropagation = event.stopImmediatePropagation || stopImmProp;\n\n if (/mouse|click/.test(event.type)) {\n event.pageX = event.clientX + getWindow(element).document.documentElement.scrollLeft;\n event.pageY = event.clientY + getWindow(element).document.documentElement.scrollTop;\n }\n\n listener(event);\n }\n };\n\n ret = element[addEvent](on + type, wrappedListener, !!options.capture);\n\n if (listenerIndex === -1) {\n supplied.push(listener);\n wrapped.push(wrappedListener);\n useCount.push(1);\n }\n else {\n useCount[listenerIndex]++;\n }\n }\n else {\n ret = element[addEvent](type, listener, supportsOptions? options : !!options.capture);\n }\n target.events[type].push(listener);\n\n return ret;\n }\n}\n\nfunction remove (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const elementIndex = indexOf(elements, element);\n const target = targets[elementIndex];\n\n if (!target || !target.events) {\n return;\n }\n\n let wrappedListener = listener;\n let listeners;\n let listenerIndex;\n\n if (useAttachEvent) {\n listeners = attachedListeners[elementIndex];\n listenerIndex = indexOf(listeners.supplied, listener);\n wrappedListener = listeners.wrapped[listenerIndex];\n }\n\n if (type === 'all') {\n for (type in target.events) {\n if (target.events.hasOwnProperty(type)) {\n remove(element, type, 'all');\n }\n }\n return;\n }\n\n if (target.events[type]) {\n const len = target.events[type].length;\n\n if (listener === 'all') {\n for (let i = 0; i < len; i++) {\n remove(element, type, target.events[type][i], options);\n }\n return;\n }\n else {\n for (let i = 0; i < len; i++) {\n if (target.events[type][i] === listener) {\n element[removeEvent](on + type, wrappedListener, supportsOptions? options : !!options.capture);\n target.events[type].splice(i, 1);\n\n if (useAttachEvent && listeners) {\n listeners.useCount[listenerIndex]--;\n if (listeners.useCount[listenerIndex] === 0) {\n listeners.supplied.splice(listenerIndex, 1);\n listeners.wrapped.splice(listenerIndex, 1);\n listeners.useCount.splice(listenerIndex, 1);\n }\n }\n\n break;\n }\n }\n }\n\n if (target.events[type] && target.events[type].length === 0) {\n target.events[type] = null;\n target.typeCount--;\n }\n }\n\n if (!target.typeCount) {\n targets.splice(elementIndex, 1);\n elements.splice(elementIndex, 1);\n attachedListeners.splice(elementIndex, 1);\n }\n}\n\nfunction addDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n if (!delegatedEvents[type]) {\n delegatedEvents[type] = {\n selectors: [],\n contexts : [],\n listeners: [],\n };\n\n // add delegate listener functions\n for (let i = 0; i < documents.length; i++) {\n add(documents[i], type, delegateListener);\n add(documents[i], type, delegateUseCapture, true);\n }\n }\n\n const delegated = delegatedEvents[type];\n let index;\n\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n break;\n }\n }\n\n if (index === -1) {\n index = delegated.selectors.length;\n\n delegated.selectors.push(selector);\n delegated.contexts .push(context);\n delegated.listeners.push([]);\n }\n\n // keep listener and capture and passive flags\n delegated.listeners[index].push([listener, !!options.capture, options.passive]);\n}\n\nfunction removeDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const delegated = delegatedEvents[type];\n let matchFound = false;\n let index;\n\n if (!delegated) { return; }\n\n // count from last index of delegated to 0\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n // look for matching selector and context Node\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n\n const listeners = delegated.listeners[index];\n\n // each item of the listeners array is an array: [function, capture, passive]\n for (let i = listeners.length - 1; i >= 0; i--) {\n const [fn, capture, passive] = listeners[i];\n\n // check if the listener functions and capture and passive flags match\n if (fn === listener && capture === !!options.capture && passive === options.passive) {\n // remove the listener from the array of listeners\n listeners.splice(i, 1);\n\n // if all listeners for this interactable have been removed\n // remove the interactable from the delegated arrays\n if (!listeners.length) {\n delegated.selectors.splice(index, 1);\n delegated.contexts .splice(index, 1);\n delegated.listeners.splice(index, 1);\n\n // remove delegate function from context\n remove(context, type, delegateListener);\n remove(context, type, delegateUseCapture, true);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegatedEvents[type] = null;\n }\n }\n\n // only remove one listener\n matchFound = true;\n break;\n }\n }\n\n if (matchFound) { break; }\n }\n }\n}\n\n// bound to the interactable context when a DOM event\n// listener is added to a selector interactable\nfunction delegateListener (event, optionalArg) {\n const options = getOptions(optionalArg);\n const fakeEvent = {};\n const delegated = delegatedEvents[event.type];\n const eventTarget = (domUtils.getActualElement(event.path\n ? event.path[0]\n : event.target));\n let element = eventTarget;\n\n // duplicate the event so that currentTarget can be changed\n pExtend(fakeEvent, event);\n\n fakeEvent.originalEvent = event;\n fakeEvent.preventDefault = preventOriginalDefault;\n\n // climb up document tree looking for selector matches\n while (is.element(element)) {\n for (let i = 0; i < delegated.selectors.length; i++) {\n const selector = delegated.selectors[i];\n const context = delegated.contexts[i];\n\n if (domUtils.matchesSelector(element, selector)\n && domUtils.nodeContains(context, eventTarget)\n && domUtils.nodeContains(context, element)) {\n\n const listeners = delegated.listeners[i];\n\n fakeEvent.currentTarget = element;\n\n for (let j = 0; j < listeners.length; j++) {\n const [fn, capture, passive] = listeners[j];\n\n if (capture === !!options.capture && passive === options.passive) {\n fn(fakeEvent);\n }\n }\n }\n }\n\n element = domUtils.parentNode(element);\n }\n}\n\nfunction delegateUseCapture (event) {\n return delegateListener.call(this, event, true);\n}\n\nfunction preventDef () {\n this.returnValue = false;\n}\n\nfunction preventOriginalDefault () {\n this.originalEvent.preventDefault();\n}\n\nfunction stopProp () {\n this.cancelBubble = true;\n}\n\nfunction stopImmProp () {\n this.cancelBubble = true;\n this.immediatePropagationStopped = true;\n}\n\nfunction getOptions (param) {\n return is.object(param)? param : { capture: param };\n}\n\nmodule.exports = {\n add,\n remove,\n\n addDelegate,\n removeDelegate,\n\n delegateListener,\n delegateUseCapture,\n delegatedEvents,\n documents,\n\n useAttachEvent,\n supportsOptions,\n\n _elements: elements,\n _targets: targets,\n _attachedListeners: attachedListeners,\n};\n","module.exports = function extend (dest, source) {\n for (const prop in source) {\n dest[prop] = source[prop];\n }\n return dest;\n};\n","const {\n resolveRectLike,\n rectToXY,\n} = require('./rect');\n\nmodule.exports = function (target, element, action) {\n const actionOptions = target.options[action];\n const actionOrigin = actionOptions && actionOptions.origin;\n const origin = actionOrigin || target.options.origin;\n\n const originRect = resolveRectLike(origin, target, element, [target && element]);\n\n return rectToXY(originRect) || { x: 0, y: 0 };\n};\n","module.exports = (x, y) => Math.sqrt(x * x + y * y);\n","const extend = require('./extend');\nconst win = require('./window');\n\nconst utils = {\n warnOnce: function (method, message) {\n let warned = false;\n\n return function () {\n if (!warned) {\n win.window.console.warn(message);\n warned = true;\n }\n\n return method.apply(this, arguments);\n };\n },\n\n // http://stackoverflow.com/a/5634528/2280888\n _getQBezierValue: function (t, p1, p2, p3) {\n const iT = 1 - t;\n return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3;\n },\n\n getQuadraticCurvePoint: function (startX, startY, cpX, cpY, endX, endY, position) {\n return {\n x: utils._getQBezierValue(position, startX, cpX, endX),\n y: utils._getQBezierValue(position, startY, cpY, endY),\n };\n },\n\n // http://gizma.com/easing/\n easeOutQuad: function (t, b, c, d) {\n t /= d;\n return -c * t*(t-2) + b;\n },\n\n copyAction: function (dest, src) {\n dest.name = src.name;\n dest.axis = src.axis;\n dest.edges = src.edges;\n\n return dest;\n },\n\n is : require('./is'),\n extend : extend,\n hypot : require('./hypot'),\n getOriginXY: require('./getOriginXY'),\n};\n\nextend(utils, require('./arr'));\nextend(utils, require('./domUtils'));\nextend(utils, require('./pointerUtils'));\nextend(utils, require('./rect'));\n\nmodule.exports = utils;\n","const scope = require('../scope');\nconst utils = require('./index');\nconst browser = require('./browser');\n\nconst finder = {\n methodOrder: [ 'simulationResume', 'mouse', 'hasPointer', 'idle' ],\n\n search: function (pointer, eventType, eventTarget) {\n const mouseEvent = (/mouse/i.test(pointer.pointerType || eventType)\n // MSPointerEvent.MSPOINTER_TYPE_MOUSE\n || pointer.pointerType === 4);\n const pointerId = utils.getPointerId(pointer);\n const details = { pointer, pointerId, mouseEvent, eventType, eventTarget };\n\n for (const method of finder.methodOrder) {\n const interaction = finder[method](details);\n\n if (interaction) {\n return interaction;\n }\n }\n },\n\n // try to resume simulation with a new pointer\n simulationResume: function ({ mouseEvent, eventType, eventTarget }) {\n if (!/down|start/i.test(eventType)) {\n return null;\n }\n\n for (const interaction of scope.interactions) {\n let element = eventTarget;\n\n if (interaction.simulation && interaction.simulation.allowResume\n && (interaction.mouse === mouseEvent)) {\n while (element) {\n // if the element is the interaction element\n if (element === interaction.element) {\n return interaction;\n }\n element = utils.parentNode(element);\n }\n }\n }\n\n return null;\n },\n\n // if it's a mouse interaction\n mouse: function ({ pointerId, mouseEvent, eventType }) {\n if (!mouseEvent && (browser.supportsTouch || browser.supportsPointerEvent)) {\n return null;\n }\n\n let firstNonActive;\n\n for (const interaction of scope.interactions) {\n if (interaction.mouse) {\n // if it's a down event, skip interactions with running simulations\n if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; }\n\n // if the interaction is active, return it immediately\n if (interaction.interacting()) {\n return interaction;\n }\n // otherwise save it and look for another active interaction\n else if (!firstNonActive) {\n firstNonActive = interaction;\n }\n }\n }\n\n // if no active mouse interaction was found use the first inactive mouse\n // interaction\n if (firstNonActive) {\n return firstNonActive;\n }\n\n // Find any interaction specifically for mouse.\n // ignore the interaction if the eventType is a mousedown, and a simulation\n // is active\n for (const interaction of scope.interactions) {\n if (interaction.mouse && !(/down/.test(eventType) && interaction.simulation)) {\n return interaction;\n }\n }\n\n return null;\n },\n\n // get interaction that has this pointer\n hasPointer: function ({ pointerId }) {\n for (const interaction of scope.interactions) {\n if (utils.contains(interaction.pointerIds, pointerId)) {\n return interaction;\n }\n }\n },\n\n // get first idle interaction\n idle: function ({ mouseEvent }) {\n for (const interaction of scope.interactions) {\n // if there's already a pointer held down\n if (interaction.pointerIds.length === 1) {\n const target = interaction.target;\n // don't add this pointer if there is a target interactable and it\n // isn't gesturable\n if (target && !target.options.gesture.enabled) {\n continue;\n }\n }\n // maximum of 2 pointers per interaction\n else if (interaction.pointerIds.length >= 2) {\n continue;\n }\n\n if (!interaction.interacting() && (mouseEvent === interaction.mouse)) {\n return interaction;\n }\n }\n\n return null;\n },\n};\n\nmodule.exports = finder;\n","const win = require('./window');\nconst isWindow = require('./isWindow');\n\nconst is = {\n array : () => {},\n\n window : thing => thing === win.window || isWindow(thing),\n\n docFrag : thing => is.object(thing) && thing.nodeType === 11,\n\n object : thing => !!thing && (typeof thing === 'object'),\n\n function: thing => typeof thing === 'function',\n\n number : thing => typeof thing === 'number' ,\n\n bool : thing => typeof thing === 'boolean' ,\n\n string : thing => typeof thing === 'string' ,\n\n element: thing => {\n if (!thing || (typeof thing !== 'object')) { return false; }\n\n const _window = win.getWindow(thing) || win.window;\n\n return (/object|function/.test(typeof _window.Element)\n ? thing instanceof _window.Element //DOM2\n : thing.nodeType === 1 && typeof thing.nodeName === 'string');\n },\n};\n\nis.array = thing => (is.object(thing)\n && (typeof thing.length !== 'undefined')\n && is.function(thing.splice));\n\nmodule.exports = is;\n","module.exports = (thing) => !!(thing && thing.Window) && (thing instanceof thing.Window);\n","function pointerExtend (dest, source) {\n for (const prop in source) {\n const prefixedPropREs = module.exports.prefixedPropREs;\n let deprecated = false;\n\n // skip deprecated prefixed properties\n for (const vendor in prefixedPropREs) {\n if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) {\n deprecated = true;\n break;\n }\n }\n\n if (!deprecated && typeof source[prop] !== 'function') {\n dest[prop] = source[prop];\n }\n }\n return dest;\n}\n\npointerExtend.prefixedPropREs = {\n webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/,\n};\n\nmodule.exports = pointerExtend;\n","const hypot = require('./hypot');\nconst browser = require('./browser');\nconst dom = require('./domObjects');\nconst domUtils = require('./domUtils');\nconst is = require('./is');\nconst pointerExtend = require('./pointerExtend');\n\nconst pointerUtils = {\n copyCoords: function (dest, src) {\n dest.page = dest.page || {};\n dest.page.x = src.page.x;\n dest.page.y = src.page.y;\n\n dest.client = dest.client || {};\n dest.client.x = src.client.x;\n dest.client.y = src.client.y;\n\n dest.timeStamp = src.timeStamp;\n },\n\n setCoordDeltas: function (targetObj, prev, cur) {\n targetObj.page.x = cur.page.x - prev.page.x;\n targetObj.page.y = cur.page.y - prev.page.y;\n targetObj.client.x = cur.client.x - prev.client.x;\n targetObj.client.y = cur.client.y - prev.client.y;\n targetObj.timeStamp = cur.timeStamp - prev.timeStamp;\n\n // set pointer velocity\n const dt = Math.max(targetObj.timeStamp / 1000, 0.001);\n\n targetObj.page.speed = hypot(targetObj.page.x, targetObj.page.y) / dt;\n targetObj.page.vx = targetObj.page.x / dt;\n targetObj.page.vy = targetObj.page.y / dt;\n\n targetObj.client.speed = hypot(targetObj.client.x, targetObj.page.y) / dt;\n targetObj.client.vx = targetObj.client.x / dt;\n targetObj.client.vy = targetObj.client.y / dt;\n },\n\n isNativePointer: function (pointer) {\n return (pointer instanceof dom.Event || pointer instanceof dom.Touch);\n },\n\n // Get specified X/Y coords for mouse or event.touches[0]\n getXY: function (type, pointer, xy) {\n xy = xy || {};\n type = type || 'page';\n\n xy.x = pointer[type + 'X'];\n xy.y = pointer[type + 'Y'];\n\n return xy;\n },\n\n getPageXY: function (pointer, page) {\n page = page || {};\n\n // Opera Mobile handles the viewport and scrolling oddly\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n pointerUtils.getXY('screen', pointer, page);\n\n page.x += window.scrollX;\n page.y += window.scrollY;\n }\n else {\n pointerUtils.getXY('page', pointer, page);\n }\n\n return page;\n },\n\n getClientXY: function (pointer, client) {\n client = client || {};\n\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n // Opera Mobile handles the viewport and scrolling oddly\n pointerUtils.getXY('screen', pointer, client);\n }\n else {\n pointerUtils.getXY('client', pointer, client);\n }\n\n return client;\n },\n\n getPointerId: function (pointer) {\n return is.number(pointer.pointerId)? pointer.pointerId : pointer.identifier;\n },\n\n setCoords: function (targetObj, pointers, timeStamp) {\n const pointer = (pointers.length > 1\n ? pointerUtils.pointerAverage(pointers)\n : pointers[0]);\n\n const tmpXY = {};\n\n pointerUtils.getPageXY(pointer, tmpXY);\n targetObj.page.x = tmpXY.x;\n targetObj.page.y = tmpXY.y;\n\n pointerUtils.getClientXY(pointer, tmpXY);\n targetObj.client.x = tmpXY.x;\n targetObj.client.y = tmpXY.y;\n\n targetObj.timeStamp = is.number(timeStamp) ? timeStamp :new Date().getTime();\n },\n\n pointerExtend: pointerExtend,\n\n getTouchPair: function (event) {\n const touches = [];\n\n // array of touches is supplied\n if (is.array(event)) {\n touches[0] = event[0];\n touches[1] = event[1];\n }\n // an event\n else {\n if (event.type === 'touchend') {\n if (event.touches.length === 1) {\n touches[0] = event.touches[0];\n touches[1] = event.changedTouches[0];\n }\n else if (event.touches.length === 0) {\n touches[0] = event.changedTouches[0];\n touches[1] = event.changedTouches[1];\n }\n }\n else {\n touches[0] = event.touches[0];\n touches[1] = event.touches[1];\n }\n }\n\n return touches;\n },\n\n pointerAverage: function (pointers) {\n const average = {\n pageX : 0,\n pageY : 0,\n clientX: 0,\n clientY: 0,\n screenX: 0,\n screenY: 0,\n };\n\n for (const pointer of pointers) {\n for (const prop in average) {\n average[prop] += pointer[prop];\n }\n }\n for (const prop in average) {\n average[prop] /= pointers.length;\n }\n\n return average;\n },\n\n touchBBox: function (event) {\n if (!event.length && !(event.touches && event.touches.length > 1)) {\n return;\n }\n\n const touches = pointerUtils.getTouchPair(event);\n const minX = Math.min(touches[0].pageX, touches[1].pageX);\n const minY = Math.min(touches[0].pageY, touches[1].pageY);\n const maxX = Math.max(touches[0].pageX, touches[1].pageX);\n const maxY = Math.max(touches[0].pageY, touches[1].pageY);\n\n return {\n x: minX,\n y: minY,\n left: minX,\n top: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n },\n\n touchDistance: function (event, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n\n\n const dx = touches[0][sourceX] - touches[1][sourceX];\n const dy = touches[0][sourceY] - touches[1][sourceY];\n\n return hypot(dx, dy);\n },\n\n touchAngle: function (event, prevAngle, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n const dx = touches[1][sourceX] - touches[0][sourceX];\n const dy = touches[1][sourceY] - touches[0][sourceY];\n const angle = 180 * Math.atan2(dy , dx) / Math.PI;\n\n return angle;\n },\n\n getPointerType: function (pointer, interaction) {\n // if the PointerEvent API isn't available, then the pointer must be ither\n // a MouseEvent or TouchEvent\n if (interaction.mouse) { return 'mouse'; }\n if (!browser.supportsPointerEvent) { return 'touch'; }\n\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : [undefined, undefined,'touch', 'pen', 'mouse'][pointer.pointerType];\n },\n\n // [ event.target, event.currentTarget ]\n getEventTargets: function (event) {\n return [\n domUtils.getActualElement(event.path ? event.path[0] : event.target),\n domUtils.getActualElement(event.currentTarget),\n ];\n },\n};\n\nmodule.exports = pointerUtils;\n","const { window } = require('./window');\n\nconst vendors = ['ms', 'moz', 'webkit', 'o'];\nlet lastTime = 0;\nlet request;\nlet cancel;\n\nfor (let x = 0; x < vendors.length && !window.requestAnimationFrame; x++) {\n request = window[vendors[x] + 'RequestAnimationFrame'];\n cancel = window[vendors[x] +'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n}\n\nif (!request) {\n request = function (callback) {\n const currTime = new Date().getTime();\n const timeToCall = Math.max(0, 16 - (currTime - lastTime));\n const id = setTimeout(function () { callback(currTime + timeToCall); },\n timeToCall);\n\n lastTime = currTime + timeToCall;\n return id;\n };\n}\n\nif (!cancel) {\n cancel = function (id) {\n clearTimeout(id);\n };\n}\n\nmodule.exports = {\n request,\n cancel,\n};\n","const extend = require('./extend');\nconst is = require('./is');\nconst {\n closest,\n parentNode,\n getElementRect,\n} = require('./domUtils');\n\nconst rectUtils = {\n getStringOptionResult: function (value, interactable, element) {\n if (!is.string(value)) {\n return null;\n }\n\n if (value === 'parent') {\n value = parentNode(element);\n }\n else if (value === 'self') {\n value = interactable.getRect(element);\n }\n else {\n value = closest(element, value);\n }\n\n return value;\n },\n\n resolveRectLike: function (value, interactable, element, functionArgs) {\n value = rectUtils.getStringOptionResult(value, interactable, element) || value;\n\n if (is.function(value)) {\n value = value.apply(null, functionArgs);\n }\n\n if (is.element(value)) {\n value = getElementRect(value);\n }\n\n return value;\n },\n\n rectToXY: function (rect) {\n return rect && {\n x: 'x' in rect ? rect.x : rect.left,\n y: 'y' in rect ? rect.y : rect.top,\n };\n },\n\n xywhToTlbr: function (rect) {\n if (rect && !('left' in rect && 'top' in rect)) {\n rect = extend({}, rect);\n\n rect.left = rect.x || 0;\n rect.top = rect.y || 0;\n rect.right = rect.right || (rect.left + rect.width);\n rect.bottom = rect.bottom || (rect.top + rect.height);\n }\n\n return rect;\n },\n\n tlbrToXywh: function (rect) {\n if (rect && !('x' in rect && 'y' in rect)) {\n rect = extend({}, rect);\n\n rect.x = rect.left || 0;\n rect.top = rect.top || 0;\n rect.width = rect.width || (rect.right - rect.x);\n rect.height = rect.height || (rect.bottom - rect.y);\n }\n\n return rect;\n },\n};\n\nmodule.exports = rectUtils;\n","const win = module.exports;\nconst isWindow = require('./isWindow');\n\nfunction init (window) {\n // get wrapped window if using Shadow DOM polyfill\n\n win.realWindow = window;\n\n // create a TextNode\n const el = window.document.createTextNode('');\n\n // check if it's wrapped by a polyfill\n if (el.ownerDocument !== window.document\n && typeof window.wrap === 'function'\n && window.wrap(el) === el) {\n // use wrapped window\n window = window.wrap(window);\n }\n\n win.window = window;\n}\n\nif (typeof window === 'undefined') {\n win.window = undefined;\n win.realWindow = undefined;\n}\nelse {\n init(window);\n}\n\nwin.getWindow = function getWindow (node) {\n if (isWindow(node)) {\n return node;\n }\n\n const rootNode = (node.ownerDocument || node);\n\n return rootNode.defaultView || rootNode.parentWindow || win.window;\n};\n\nwin.init = init;\n"]} \ No newline at end of file +{"version":3,"sources":["src/minHeader.js","src/header.js","index.js","src/Eventable.js","src/InteractEvent.js","src/Interactable.js","src/Interaction.js","src/actions/base.js","src/actions/drag.js","src/actions/drop.js","src/actions/gesture.js","src/actions/resize.js","src/autoScroll.js","src/autoStart/InteractableMethods.js","src/autoStart/base.js","src/autoStart/delay.js","src/autoStart/drag.js","src/autoStart/gesture.js","src/autoStart/resize.js","src/defaultOptions.js","src/index.js","src/inertia.js","src/interact.js","src/interactablePreventDefault.js","src/legacyBrowsers.js","src/modifiers/index.js","src/modifiers/restrict.js","src/modifiers/restrictEdges.js","src/modifiers/restrictSize.js","src/modifiers/snap.js","src/modifiers/snapSize.js","src/pointerEvents/PointerEvent.js","src/pointerEvents/base.js","src/pointerEvents/holdRepeat.js","src/pointerEvents/interactableTargets.js","src/scope.js","src/utils/Signals.js","src/utils/arr.js","src/utils/browser.js","src/utils/domObjects.js","src/utils/domUtils.js","src/utils/events.js","src/utils/extend.js","src/utils/getOriginXY.js","src/utils/hypot.js","src/utils/index.js","src/utils/interactionFinder.js","src/utils/is.js","src/utils/isWindow.js","src/utils/pointerExtend.js","src/utils/pointerUtils.js","src/utils/raf.js","src/utils/rect.js","src/utils/window.js"],"names":[],"mappings":"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","file":"interact.min.js","sourceRoot":"","sourcesContent":["/* interact.js v1.3.0-alpha.4+sha.7970416-dirty | https://raw.github.com/taye/interact.js/master/LICENSE */\n","/**\n * interact.js v1.3.0-alpha.4+sha.7970416-dirty\n *\n * Copyright (c) 2012-2017 Taye Adeyemi \n * Open source under the MIT License.\n * https://raw.github.com/taye/interact.js/master/LICENSE\n */\n","/*\n * In a (windowless) server environment this file exports a factory function\n * that takes the window to use.\n *\n * var interact = require('interact.js')(windowObject);\n *\n * See https://github.com/taye/interact.js/issues/187\n */\nif (typeof window === 'undefined') {\n module.exports = function (window) {\n require('./src/utils/window').init(window);\n\n return require('./src/index');\n };\n}\nelse {\n module.exports = require('./src/index');\n}\n","const { indexOf } = require('./utils/arr');\nconst extend = require('./utils/extend.js');\n\nfunction fireUntilImmediateStopped (event, listeners) {\n for (let i = 0, len = listeners.length; i < len && !event.immediatePropagationStopped; i++) {\n listeners[i](event);\n }\n}\n\nclass Eventable {\n\n constructor (options) {\n this.options = extend({}, options || {});\n }\n\n fire (event) {\n let listeners;\n const onEvent = 'on' + event.type;\n const global = this.global;\n\n // Interactable#on() listeners\n if ((listeners = this[event.type])) {\n fireUntilImmediateStopped(event, listeners);\n }\n\n // interactable.onevent listener\n if (this[onEvent]) {\n this[onEvent](event);\n }\n\n // interact.on() listeners\n if (!event.propagationStopped && global && (listeners = global[event.type])) {\n fireUntilImmediateStopped(event, listeners);\n }\n }\n\n on (eventType, listener) {\n // if this type of event was never bound\n if (this[eventType]) {\n this[eventType].push(listener);\n }\n else {\n this[eventType] = [listener];\n }\n }\n\n off (eventType, listener) {\n // if it is an action event type\n const eventList = this[eventType];\n const index = eventList? indexOf(eventList, listener) : -1;\n\n if (index !== -1) {\n eventList.splice(index, 1);\n }\n\n if (eventList && eventList.length === 0 || !listener) {\n this[eventType] = listener;\n }\n }\n}\n\nmodule.exports = Eventable;\n","const extend = require('./utils/extend');\nconst getOriginXY = require('./utils/getOriginXY');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nclass InteractEvent {\n constructor (interaction, event, action, phase, element, related, preEnd = false) {\n const target = interaction.target;\n const deltaSource = (target && target.options || defaults).deltaSource;\n const origin = getOriginXY(target, element, action);\n const starting = phase === 'start';\n const ending = phase === 'end';\n const coords = starting? interaction.startCoords : interaction.curCoords;\n const prevEvent = interaction.prevEvent;\n\n element = element || interaction.element;\n\n const page = extend({}, coords.page);\n const client = extend({}, coords.client);\n\n page.x -= origin.x;\n page.y -= origin.y;\n\n client.x -= origin.x;\n client.y -= origin.y;\n\n this.ctrlKey = event.ctrlKey;\n this.altKey = event.altKey;\n this.shiftKey = event.shiftKey;\n this.metaKey = event.metaKey;\n this.button = event.button;\n this.buttons = event.buttons;\n this.target = element;\n this.currentTarget = element;\n this.relatedTarget = related || null;\n this.preEnd = preEnd;\n this.type = action + (phase || '');\n this.interaction = interaction;\n this.interactable = target;\n\n this.t0 = starting ? interaction.downTimes[interaction.downTimes.length - 1]\n : prevEvent.t0;\n\n const signalArg = {\n interaction,\n event,\n action,\n phase,\n element,\n related,\n page,\n client,\n coords,\n starting,\n ending,\n deltaSource,\n iEvent: this,\n };\n\n signals.fire('set-xy', signalArg);\n\n if (ending) {\n // use previous coords when ending\n this.pageX = prevEvent.pageX;\n this.pageY = prevEvent.pageY;\n this.clientX = prevEvent.clientX;\n this.clientY = prevEvent.clientY;\n }\n else {\n this.pageX = page.x;\n this.pageY = page.y;\n this.clientX = client.x;\n this.clientY = client.y;\n }\n\n this.x0 = interaction.startCoords.page.x - origin.x;\n this.y0 = interaction.startCoords.page.y - origin.y;\n this.clientX0 = interaction.startCoords.client.x - origin.x;\n this.clientY0 = interaction.startCoords.client.y - origin.y;\n\n signals.fire('set-delta', signalArg);\n\n this.timeStamp = coords.timeStamp;\n this.dt = interaction.pointerDelta.timeStamp;\n this.duration = this.timeStamp - this.t0;\n\n // speed and velocity in pixels per second\n this.speed = interaction.pointerDelta[deltaSource].speed;\n this.velocityX = interaction.pointerDelta[deltaSource].vx;\n this.velocityY = interaction.pointerDelta[deltaSource].vy;\n\n this.swipe = (ending || phase === 'inertiastart')? this.getSwipe() : null;\n\n signals.fire('new', signalArg);\n }\n\n getSwipe () {\n const interaction = this.interaction;\n\n if (interaction.prevEvent.speed < 600\n || this.timeStamp - interaction.prevEvent.timeStamp > 150) {\n return null;\n }\n\n let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI;\n const overlap = 22.5;\n\n if (angle < 0) {\n angle += 360;\n }\n\n const left = 135 - overlap <= angle && angle < 225 + overlap;\n const up = 225 - overlap <= angle && angle < 315 + overlap;\n\n const right = !left && (315 - overlap <= angle || angle < 45 + overlap);\n const down = !up && 45 - overlap <= angle && angle < 135 + overlap;\n\n return {\n up,\n down,\n left,\n right,\n angle,\n speed: interaction.prevEvent.speed,\n velocity: {\n x: interaction.prevEvent.velocityX,\n y: interaction.prevEvent.velocityY,\n },\n };\n }\n\n preventDefault () {}\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n}\n\nsignals.on('set-delta', function ({ iEvent, interaction, starting, deltaSource }) {\n const prevEvent = starting? iEvent : interaction.prevEvent;\n\n if (deltaSource === 'client') {\n iEvent.dx = iEvent.clientX - prevEvent.clientX;\n iEvent.dy = iEvent.clientY - prevEvent.clientY;\n }\n else {\n iEvent.dx = iEvent.pageX - prevEvent.pageX;\n iEvent.dy = iEvent.pageY - prevEvent.pageY;\n }\n});\n\nInteractEvent.signals = signals;\n\nmodule.exports = InteractEvent;\n","const is = require('./utils/is');\nconst events = require('./utils/events');\nconst extend = require('./utils/extend');\nconst actions = require('./actions/base');\nconst scope = require('./scope');\nconst Eventable = require('./Eventable');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nconst {\n getElementRect,\n nodeContains,\n trySelector,\n} = require('./utils/domUtils');\nconst { getWindow } = require('./utils/window');\nconst { indexOf, contains } = require('./utils/arr');\nconst { wheelEvent } = require('./utils/browser');\n\n// all set interactables\nscope.interactables = [];\n\n/*\\\n * Interactable\n [ property ]\n **\n * Object type returned by @interact\n\\*/\nclass Interactable {\n constructor (target, options) {\n options = options || {};\n\n this.target = target;\n this.events = new Eventable();\n this._context = options.context || scope.document;\n this._win = getWindow(trySelector(target)? this._context : target);\n this._doc = this._win.document;\n\n signals.fire('new', {\n target,\n options,\n interactable: this,\n win: this._win,\n });\n\n scope.addDocument( this._doc, this._win );\n\n scope.interactables.push(this);\n\n this.set(options);\n }\n\n setOnEvents (action, phases) {\n const onAction = 'on' + action;\n\n if (is.function(phases.onstart) ) { this.events[onAction + 'start' ] = phases.onstart ; }\n if (is.function(phases.onmove) ) { this.events[onAction + 'move' ] = phases.onmove ; }\n if (is.function(phases.onend) ) { this.events[onAction + 'end' ] = phases.onend ; }\n if (is.function(phases.oninertiastart)) { this.events[onAction + 'inertiastart' ] = phases.oninertiastart ; }\n\n return this;\n }\n\n setPerAction (action, options) {\n // for all the default per-action options\n for (const option in options) {\n // if this option exists for this action\n if (option in defaults[action]) {\n // if the option in the options arg is an object value\n if (is.object(options[option])) {\n // duplicate the object\n this.options[action][option] = extend(this.options[action][option] || {}, options[option]);\n\n if (is.object(defaults.perAction[option]) && 'enabled' in defaults.perAction[option]) {\n this.options[action][option].enabled = options[option].enabled === false? false : true;\n }\n }\n else if (is.bool(options[option]) && is.object(defaults.perAction[option])) {\n this.options[action][option].enabled = options[option];\n }\n else if (options[option] !== undefined) {\n // or if it's not undefined, do a plain assignment\n this.options[action][option] = options[option];\n }\n }\n }\n }\n\n /*\\\n * Interactable.getRect\n [ method ]\n *\n * The default function to get an Interactables bounding rect. Can be\n * overridden using @Interactable.rectChecker.\n *\n - element (Element) #optional The element to measure.\n = (object) The object's bounding rectangle.\n o {\n o top : 0,\n o left : 0,\n o bottom: 0,\n o right : 0,\n o width : 0,\n o height: 0\n o }\n \\*/\n getRect (element) {\n element = element || this.target;\n\n if (is.string(this.target) && !(is.element(element))) {\n element = this._context.querySelector(this.target);\n }\n\n return getElementRect(element);\n }\n\n /*\\\n * Interactable.rectChecker\n [ method ]\n *\n * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n - checker (function) #optional A function which returns this Interactable's bounding rectangle. See @Interactable.getRect\n = (function | object) The checker function or this Interactable\n \\*/\n rectChecker (checker) {\n if (is.function(checker)) {\n this.getRect = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.getRect;\n\n return this;\n }\n\n return this.getRect;\n }\n\n _backCompatOption (optionName, newValue) {\n if (trySelector(newValue) || is.object(newValue)) {\n this.options[optionName] = newValue;\n\n for (const action of actions.names) {\n this.options[action][optionName] = newValue;\n }\n\n return this;\n }\n\n return this.options[optionName];\n }\n\n /*\\\n * Interactable.origin\n [ method ]\n *\n * Gets or sets the origin of the Interactable's element. The x and y\n * of the origin will be subtracted from action event coordinates.\n *\n - origin (object | string) #optional An object eg. { x: 0, y: 0 } or string 'parent', 'self' or any CSS selector\n * OR\n - origin (Element) #optional An HTML or SVG Element whose rect will be used\n **\n = (object) The current origin or this Interactable\n \\*/\n origin (newValue) {\n return this._backCompatOption('origin', newValue);\n }\n\n /*\\\n * Interactable.deltaSource\n [ method ]\n *\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n - newValue (string) #optional Use 'client' if you will be scrolling while interacting; Use 'page' if you want autoScroll to work\n = (string | object) The current deltaSource or this Interactable\n \\*/\n deltaSource (newValue) {\n if (newValue === 'page' || newValue === 'client') {\n this.options.deltaSource = newValue;\n\n return this;\n }\n\n return this.options.deltaSource;\n }\n\n /*\\\n * Interactable.context\n [ method ]\n *\n * Gets the selector context Node of the Interactable. The default is `window.document`.\n *\n = (Node) The context Node of this Interactable\n **\n \\*/\n context () {\n return this._context;\n }\n\n inContext (element) {\n return (this._context === element.ownerDocument\n || nodeContains(this._context, element));\n }\n\n /*\\\n * Interactable.fire\n [ method ]\n *\n * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n - iEvent (InteractEvent) The InteractEvent object to be fired on this Interactable\n = (Interactable) this Interactable\n \\*/\n fire (iEvent) {\n this.events.fire(iEvent);\n\n return this;\n }\n\n _onOffMultiple (method, eventType, listener, options) {\n if (is.string(eventType) && eventType.search(' ') !== -1) {\n eventType = eventType.trim().split(/ +/);\n }\n\n if (is.array(eventType)) {\n for (let i = 0; i < eventType.length; i++) {\n this[method](eventType[i], listener, options);\n }\n\n return true;\n }\n\n if (is.object(eventType)) {\n for (const prop in eventType) {\n this[method](prop, eventType[prop], listener);\n }\n\n return true;\n }\n }\n\n /*\\\n * Interactable.on\n [ method ]\n *\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n - eventType (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) This Interactable\n \\*/\n on (eventType, listener, options) {\n if (this._onOffMultiple('on', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.on(eventType, listener);\n }\n // delegated event for selector\n else if (is.string(this.target)) {\n events.addDelegate(this.target, this._context, eventType, listener, options);\n }\n else {\n events.add(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.off\n [ method ]\n *\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n - eventType (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) This Interactable\n \\*/\n off (eventType, listener, options) {\n if (this._onOffMultiple('off', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n // if it is an action event type\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.off(eventType, listener);\n }\n // delegated event\n else if (is.string(this.target)) {\n events.removeDelegate(this.target, this._context, eventType, listener, options);\n }\n // remove listener from this Interatable's element\n else {\n events.remove(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.set\n [ method ]\n *\n * Reset the options of this Interactable\n - options (object) The new settings to apply\n = (object) This Interactable\n \\*/\n set (options) {\n if (!is.object(options)) {\n options = {};\n }\n\n this.options = extend({}, defaults.base);\n\n const perActions = extend({}, defaults.perAction);\n\n for (const actionName in actions.methodDict) {\n const methodName = actions.methodDict[actionName];\n\n this.options[actionName] = extend({}, defaults[actionName]);\n\n this.setPerAction(actionName, perActions);\n\n this[methodName](options[actionName]);\n }\n\n for (const setting of Interactable.settingsMethods) {\n this.options[setting] = defaults.base[setting];\n\n if (setting in options) {\n this[setting](options[setting]);\n }\n }\n\n signals.fire('set', {\n options,\n interactable: this,\n });\n\n return this;\n }\n\n /*\\\n * Interactable.unset\n [ method ]\n *\n * Remove this interactable from the list of interactables and remove\n * it's action capabilities and event listeners\n *\n = (object) @interact\n \\*/\n unset () {\n events.remove(this.target, 'all');\n\n if (is.string(this.target)) {\n // remove delegated events\n for (const type in events.delegatedEvents) {\n const delegated = events.delegatedEvents[type];\n\n if (delegated.selectors[0] === this.target\n && delegated.contexts[0] === this._context) {\n\n delegated.selectors.splice(0, 1);\n delegated.contexts .splice(0, 1);\n delegated.listeners.splice(0, 1);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegated[type] = null;\n }\n }\n\n events.remove(this._context, type, events.delegateListener);\n events.remove(this._context, type, events.delegateUseCapture, true);\n }\n }\n else {\n events.remove(this, 'all');\n }\n\n signals.fire('unset', { interactable: this });\n\n scope.interactables.splice(indexOf(scope.interactables, this), 1);\n\n // Stop related interactions when an Interactable is unset\n for (const interaction of scope.interactions || []) {\n if (interaction.target === this && interaction.interacting()) {\n interaction.stop();\n }\n }\n\n return scope.interact;\n }\n}\n\nscope.interactables.indexOfElement = function indexOfElement (target, context) {\n context = context || scope.document;\n\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n if (interactable.target === target && interactable._context === context) {\n return i;\n }\n }\n return -1;\n};\n\nscope.interactables.get = function interactableGet (element, options, dontCheckInContext) {\n const ret = this[this.indexOfElement(element, options && options.context)];\n\n return ret && (is.string(element) || dontCheckInContext || ret.inContext(element))? ret : null;\n};\n\nscope.interactables.forEachSelector = function (callback, element) {\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n // skip non CSS selector targets and out of context elements\n if (!is.string(interactable.target)\n || (element && !interactable.inContext(element))) {\n continue;\n }\n\n const ret = callback(interactable, interactable.target, interactable._context, i, this);\n\n if (ret !== undefined) {\n return ret;\n }\n }\n};\n\n// all interact.js eventTypes\nInteractable.eventTypes = scope.eventTypes = [];\n\nInteractable.signals = signals;\n\nInteractable.settingsMethods = [ 'deltaSource', 'origin', 'preventDefault', 'rectChecker' ];\n\nmodule.exports = Interactable;\n","const scope = require('./scope');\nconst utils = require('./utils');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst domObjects = require('./utils/domObjects');\nconst finder = require('./utils/interactionFinder');\nconst signals = require('./utils/Signals').new();\n\nconst listeners = {};\nconst methodNames = [\n 'pointerDown', 'pointerMove', 'pointerUp',\n 'updatePointer', 'removePointer',\n];\n\n// for ignoring browser's simulated mouse events\nlet prevTouchTime = 0;\n\n// all active and idle interactions\nscope.interactions = [];\n\nclass Interaction {\n constructor ({ pointerType }) {\n this.target = null; // current interactable being interacted with\n this.element = null; // the target element of the interactable\n\n this.prepared = { // action that's ready to be fired on next move event\n name : null,\n axis : null,\n edges: null,\n };\n\n // keep track of added pointers\n this.pointers = [];\n this.pointerIds = [];\n this.downTargets = [];\n this.downTimes = [];\n\n // Previous native pointer move event coordinates\n this.prevCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n // current native pointer move event coordinates\n this.curCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Starting InteractEvent pointer coordinates\n this.startCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Change in coordinates and time of the pointer\n this.pointerDelta = {\n page : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n client : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n timeStamp: 0,\n };\n\n this.downEvent = null; // pointerdown/mousedown/touchstart event\n this.downPointer = {};\n\n this._eventTarget = null;\n this._curEventTarget = null;\n\n this.prevEvent = null; // previous action event\n\n this.pointerIsDown = false;\n this.pointerWasMoved = false;\n this._interacting = false;\n\n this.pointerType = pointerType;\n\n signals.fire('new', this);\n\n scope.interactions.push(this);\n }\n\n pointerDown (pointer, event, eventTarget) {\n const pointerIndex = this.updatePointer(pointer, event, true);\n\n signals.fire('down', {\n pointer,\n event,\n eventTarget,\n pointerIndex,\n interaction: this,\n });\n }\n\n /*\\\n * Interaction.start\n [ method ]\n *\n * Start an action with the given Interactable and Element as tartgets. The\n * action must be enabled for the target Interactable and an appropriate number\n * of pointers must be held down - 1 for drag/resize, 2 for gesture.\n *\n * Use it with `interactable.able({ manualStart: false })` to always\n * [start actions manually](https://github.com/taye/interact.js/issues/114)\n *\n - action (object) The action to be performed - drag, resize, etc.\n - target (Interactable) The Interactable to target\n - element (Element) The DOM Element to target\n = (object) interact\n **\n | interact(target)\n | .draggable({\n | // disable the default drag start by down->move\n | manualStart: true\n | })\n | // start dragging after the user holds the pointer down\n | .on('hold', function (event) {\n | var interaction = event.interaction;\n |\n | if (!interaction.interacting()) {\n | interaction.start({ name: 'drag' },\n | event.interactable,\n | event.currentTarget);\n | }\n | });\n \\*/\n start (action, target, element) {\n if (this.interacting()\n || !this.pointerIsDown\n || this.pointerIds.length < (action.name === 'gesture'? 2 : 1)) {\n return;\n }\n\n // if this interaction had been removed after stopping\n // add it back\n if (utils.indexOf(scope.interactions, this) === -1) {\n scope.interactions.push(this);\n }\n\n utils.copyAction(this.prepared, action);\n this.target = target;\n this.element = element;\n\n signals.fire('action-start', {\n interaction: this,\n event: this.downEvent,\n });\n }\n\n pointerMove (pointer, event, eventTarget) {\n if (!this.simulation) {\n this.updatePointer(pointer);\n utils.setCoords(this.curCoords, this.pointers);\n }\n\n const duplicateMove = (this.curCoords.page.x === this.prevCoords.page.x\n && this.curCoords.page.y === this.prevCoords.page.y\n && this.curCoords.client.x === this.prevCoords.client.x\n && this.curCoords.client.y === this.prevCoords.client.y);\n\n let dx;\n let dy;\n\n // register movement greater than pointerMoveTolerance\n if (this.pointerIsDown && !this.pointerWasMoved) {\n dx = this.curCoords.client.x - this.startCoords.client.x;\n dy = this.curCoords.client.y - this.startCoords.client.y;\n\n this.pointerWasMoved = utils.hypot(dx, dy) > Interaction.pointerMoveTolerance;\n }\n\n const signalArg = {\n pointer,\n pointerIndex: this.getPointerIndex(pointer),\n event,\n eventTarget,\n dx,\n dy,\n duplicate: duplicateMove,\n interaction: this,\n interactingBeforeMove: this.interacting(),\n };\n\n if (!duplicateMove) {\n // set pointer coordinate, time changes and speeds\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n }\n\n signals.fire('move', signalArg);\n\n if (!duplicateMove) {\n // if interacting, fire an 'action-move' signal etc\n if (this.interacting()) {\n this.doMove(signalArg);\n }\n\n if (this.pointerWasMoved) {\n utils.copyCoords(this.prevCoords, this.curCoords);\n }\n }\n }\n\n /*\\\n * Interaction.doMove\n [ method ]\n *\n * Force a move of the current action at the same coordinates. Useful if\n * snap/restrict has been changed and you want a movement with the new\n * settings.\n *\n **\n | interact(target)\n | .draggable(true)\n | .on('dragmove', function (event) {\n | if (someCondition) {\n | // change the snap settings\n | event.interactable.draggable({ snap: { targets: [] }});\n | // fire another move event with re-calculated snap\n | event.interaction.doMove();\n | }\n | });\n \\*/\n doMove (signalArg) {\n signalArg = utils.extend({\n pointer: this.pointers[0],\n event: this.prevEvent,\n eventTarget: this._eventTarget,\n interaction: this,\n }, signalArg || {});\n\n signals.fire('before-action-move', signalArg);\n\n if (!this._dontFireMove) {\n signals.fire('action-move', signalArg);\n }\n\n this._dontFireMove = false;\n }\n\n // End interact move events and stop auto-scroll unless simulation is running\n pointerUp (pointer, event, eventTarget, curEventTarget) {\n const pointerIndex = this.getPointerIndex(pointer);\n\n signals.fire(/cancel$/i.test(event.type)? 'cancel' : 'up', {\n pointer,\n pointerIndex,\n event,\n eventTarget,\n curEventTarget,\n interaction: this,\n });\n\n if (!this.simulation) {\n this.end(event);\n }\n\n this.pointerIsDown = false;\n this.removePointer(pointer, event);\n }\n\n /*\\\n * Interaction.end\n [ method ]\n *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n - event (PointerEvent) #optional\n **\n | interact(target)\n | .draggable(true)\n | .on('move', function (event) {\n | if (event.pageX > 1000) {\n | // end the current action\n | event.interaction.end();\n | // stop all further listeners from being called\n | event.stopImmediatePropagation();\n | }\n | });\n \\*/\n end (event) {\n event = event || this.prevEvent;\n\n if (this.interacting()) {\n signals.fire('action-end', {\n event,\n interaction: this,\n });\n }\n\n this.stop();\n }\n\n currentAction () {\n return this._interacting? this.prepared.name: null;\n }\n\n interacting () {\n return this._interacting;\n }\n\n stop () {\n signals.fire('stop', { interaction: this });\n\n if (this._interacting) {\n signals.fire('stop-active', { interaction: this });\n signals.fire('stop-' + this.prepared.name, { interaction: this });\n }\n\n this.target = this.element = null;\n\n this._interacting = false;\n this.prepared.name = this.prevEvent = null;\n }\n\n getPointerIndex (pointer) {\n // mouse and pen interactions may have only one pointer\n if (this.pointerType === 'mouse' || this.pointerType === 'pen') {\n return 0;\n }\n\n return utils.indexOf(this.pointerIds, utils.getPointerId(pointer));\n }\n\n updatePointer (pointer, event, down = event && /(down|start)$/i.test(event.type)) {\n const id = utils.getPointerId(pointer);\n let index = this.getPointerIndex(pointer);\n\n if (index === -1) {\n index = this.pointerIds.length;\n this.pointerIds[index] = id;\n }\n\n if (down) {\n signals.fire('update-pointer-down', {\n pointer,\n event,\n down,\n pointerId: id,\n pointerIndex: index,\n interaction: this,\n });\n }\n\n this.pointers[index] = pointer;\n\n return index;\n }\n\n removePointer (pointer, event) {\n const index = this.getPointerIndex(pointer);\n\n if (index === -1) { return; }\n\n signals.fire('remove-pointer', {\n pointer,\n event,\n pointerIndex: index,\n interaction: this,\n });\n\n this.pointers .splice(index, 1);\n this.pointerIds .splice(index, 1);\n this.downTargets.splice(index, 1);\n this.downTimes .splice(index, 1);\n }\n\n _updateEventTargets (target, currentTarget) {\n this._eventTarget = target;\n this._curEventTarget = currentTarget;\n }\n}\n\nfor (let i = 0, len = methodNames.length; i < len; i++) {\n const method = methodNames[i];\n\n listeners[method] = doOnInteractions(method);\n}\n\nfunction doOnInteractions (method) {\n return (function (event) {\n const pointerType = utils.getPointerType(event);\n const [eventTarget, curEventTarget] = utils.getEventTargets(event);\n const matches = []; // [ [pointer, interaction], ...]\n\n if (browser.supportsTouch && /touch/.test(event.type)) {\n prevTouchTime = new Date().getTime();\n\n for (let i = 0; i < event.changedTouches.length; i++) {\n const pointer = event.changedTouches[i];\n const interaction = finder.search(pointer, event.type, eventTarget);\n\n matches.push([pointer, interaction || new Interaction({ pointerType })]);\n }\n }\n else {\n let invalidPointer = false;\n\n if (!browser.supportsPointerEvent && /mouse/.test(event.type)) {\n // ignore mouse events while touch interactions are active\n for (let i = 0; i < scope.interactions.length && !invalidPointer; i++) {\n invalidPointer = scope.interactions[i].pointerType !== 'mouse' && scope.interactions[i].pointerIsDown;\n }\n\n // try to ignore mouse events that are simulated by the browser\n // after a touch event\n invalidPointer = invalidPointer\n || (new Date().getTime() - prevTouchTime < 500)\n // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated\n || event.timeStamp === 0;\n }\n\n if (!invalidPointer) {\n let interaction = finder.search(event, event.type, eventTarget);\n\n if (!interaction) {\n interaction = new Interaction({ pointerType });\n }\n\n matches.push([event, interaction]);\n }\n }\n\n for (const [pointer, interaction] of matches) {\n interaction._updateEventTargets(eventTarget, curEventTarget);\n interaction[method](pointer, event, eventTarget, curEventTarget);\n }\n });\n}\n\nfunction endAll (event) {\n for (let i = 0; i < scope.interactions.length; i++) {\n const interaction = scope.interactions[i];\n\n interaction.end(event);\n signals.fire('endall', { event, interaction });\n }\n}\n\nconst docEvents = { /* 'eventType': listenerFunc */ };\nconst pEventTypes = browser.pEventTypes;\n\nif (domObjects.PointerEvent) {\n docEvents[pEventTypes.down ] = listeners.pointerDown;\n docEvents[pEventTypes.move ] = listeners.pointerMove;\n docEvents[pEventTypes.up ] = listeners.pointerUp;\n docEvents[pEventTypes.cancel] = listeners.pointerUp;\n}\nelse {\n docEvents.mousedown = listeners.pointerDown;\n docEvents.mousemove = listeners.pointerMove;\n docEvents.mouseup = listeners.pointerUp;\n\n docEvents.touchstart = listeners.pointerDown;\n docEvents.touchmove = listeners.pointerMove;\n docEvents.touchend = listeners.pointerUp;\n docEvents.touchcancel = listeners.pointerUp;\n}\n\ndocEvents.blur = endAll;\n\nfunction onDocSignal ({ doc }, signalName) {\n const eventMethod = signalName.indexOf('add') === 0\n ? events.add : events.remove;\n\n // delegate event listener\n for (const eventType in scope.delegatedEvents) {\n eventMethod(doc, eventType, events.delegateListener);\n eventMethod(doc, eventType, events.delegateUseCapture, true);\n }\n\n for (const eventType in docEvents) {\n eventMethod(doc, eventType, docEvents[eventType]);\n }\n}\n\nsignals.on('update-pointer-down', ({ interaction, pointer, pointerId, pointerIndex, event, eventTarget, down }) => {\n interaction.pointerIds[pointerIndex] = pointerId;\n interaction.pointers[pointerIndex] = pointer;\n\n if (down) {\n interaction.pointerIsDown = true;\n }\n\n if (!interaction.interacting()) {\n utils.setCoords(interaction.startCoords, interaction.pointers);\n\n utils.copyCoords(interaction.curCoords , interaction.startCoords);\n utils.copyCoords(interaction.prevCoords, interaction.startCoords);\n\n interaction.downEvent = event;\n interaction.downTimes[pointerIndex] = interaction.curCoords.timeStamp;\n interaction.downTargets[pointerIndex] = eventTarget || event && utils.getEventTargets(event)[0];\n interaction.pointerWasMoved = false;\n\n utils.pointerExtend(interaction.downPointer, pointer);\n }\n});\n\nscope.signals.on('add-document' , onDocSignal);\nscope.signals.on('remove-document', onDocSignal);\n\nInteraction.pointerMoveTolerance = 1;\nInteraction.doOnInteractions = doOnInteractions;\nInteraction.endAll = endAll;\nInteraction.signals = signals;\nInteraction.docEvents = docEvents;\n\nscope.endAllInteractions = endAll;\n\nmodule.exports = Interaction;\n","const Interaction = require('../Interaction');\nconst InteractEvent = require('../InteractEvent');\n\nconst actions = {\n firePrepared,\n names: [],\n methodDict: {},\n};\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n interaction._interacting = true;\n firePrepared(interaction, event, 'start');\n});\n\nInteraction.signals.on('action-move', function ({ interaction, event, preEnd }) {\n firePrepared(interaction, event, 'move', preEnd);\n\n // if the action was ended in a listener\n if (!interaction.interacting()) { return false; }\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n firePrepared(interaction, event, 'end');\n});\n\nfunction firePrepared (interaction, event, phase, preEnd) {\n const actionName = interaction.prepared.name;\n\n const newEvent = new InteractEvent(interaction, event, actionName, phase, interaction.element, null, preEnd);\n\n interaction.target.fire(newEvent);\n interaction.prevEvent = newEvent;\n}\n\nmodule.exports = actions;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drag = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n startAxis : 'xy',\n lockAxis : 'xy',\n },\n\n checker: function (pointer, event, interactable) {\n const dragOptions = interactable.options.drag;\n\n return dragOptions.enabled\n ? { name: 'drag', axis: (dragOptions.lockAxis === 'start'\n ? dragOptions.startAxis\n : dragOptions.lockAxis)}\n : null;\n },\n\n getCursor: function () {\n return 'move';\n },\n};\n\nInteraction.signals.on('before-action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n interaction.curCoords.page.y = interaction.startCoords.page.y;\n interaction.curCoords.client.y = interaction.startCoords.client.y;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vx);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vx);\n interaction.pointerDelta.client.vy = 0;\n interaction.pointerDelta.page.vy = 0;\n }\n else if (axis === 'y') {\n interaction.curCoords.page.x = interaction.startCoords.page.x;\n interaction.curCoords.client.x = interaction.startCoords.client.x;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vy);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vy);\n interaction.pointerDelta.client.vx = 0;\n interaction.pointerDelta.page.vx = 0;\n }\n});\n\n// dragmove\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'dragmove') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n iEvent.pageY = interaction.startCoords.page.y;\n iEvent.clientY = interaction.startCoords.client.y;\n iEvent.dy = 0;\n }\n else if (axis === 'y') {\n iEvent.pageX = interaction.startCoords.page.x;\n iEvent.clientX = interaction.startCoords.client.x;\n iEvent.dx = 0;\n }\n});\n\n/*\\\n * Interactable.draggable\n [ method ]\n *\n * Gets or sets whether drag actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of drag events\n | var isDraggable = interact('ul li').draggable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on drag events (object makes the Interactable draggable)\n = (object) This Interactable\n | interact(element).draggable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // the axis in which the first movement must be\n | // for the drag sequence to start\n | // 'xy' by default - any direction\n | startAxis: 'x' || 'y' || 'xy',\n |\n | // 'xy' by default - don't restrict to one axis (move in any direction)\n | // 'x' or 'y' to restrict movement to either axis\n | // 'start' to restrict movement to the axis the drag started in\n | lockAxis: 'x' || 'y' || 'xy' || 'start',\n |\n | // max number of drags that can happen concurrently\n | // with elements of this Interactable. Infinity by default\n | max: Infinity,\n |\n | // max number of drags that can target the same element+Interactable\n | // 1 by default\n | maxPerElement: 2\n | });\n\\*/\nInteractable.prototype.draggable = function (options) {\n if (utils.is.object(options)) {\n this.options.drag.enabled = options.enabled === false? false: true;\n this.setPerAction('drag', options);\n this.setOnEvents('drag', options);\n\n if (/^(xy|x|y|start)$/.test(options.lockAxis)) {\n this.options.drag.lockAxis = options.lockAxis;\n }\n if (/^(xy|x|y)$/.test(options.startAxis)) {\n this.options.drag.startAxis = options.startAxis;\n }\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drag.enabled = options;\n\n if (!options) {\n this.ondragstart = this.ondragstart = this.ondragend = null;\n }\n\n return this;\n }\n\n return this.options.drag;\n};\n\nactions.drag = drag;\nactions.names.push('drag');\nutils.merge(Interactable.eventTypes, [\n 'dragstart',\n 'dragmove',\n 'draginertiastart',\n 'draginertiaresume',\n 'dragend',\n]);\nactions.methodDict.drag = 'draggable';\n\ndefaultOptions.drag = drag.defaults;\n\nmodule.exports = drag;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst scope = require('../scope');\nconst interact = require('../interact');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drop = {\n defaults: {\n enabled: false,\n accept : null,\n overlap: 'pointer',\n },\n};\n\nlet dynamicDrop = false;\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // reset active dropzones\n interaction.activeDrops.dropzones = [];\n interaction.activeDrops.elements = [];\n interaction.activeDrops.rects = [];\n\n interaction.dropEvents = null;\n\n if (!interaction.dynamicDrop) {\n setActiveDrops(interaction, interaction.element);\n }\n\n const dragEvent = interaction.prevEvent;\n const dropEvents = getDropEvents(interaction, event, dragEvent);\n\n if (dropEvents.activate) {\n fireActiveDrops(interaction, dropEvents.activate);\n }\n});\n\nInteractEvent.signals.on('new', function ({ interaction, iEvent, event }) {\n if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { return; }\n\n const draggableElement = interaction.element;\n const dragEvent = iEvent;\n const dropResult = getDrop(dragEvent, event, draggableElement);\n\n interaction.dropTarget = dropResult.dropzone;\n interaction.dropElement = dropResult.element;\n\n interaction.dropEvents = getDropEvents(interaction, event, dragEvent);\n});\n\nInteraction.signals.on('action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n fireDropEvents(interaction, interaction.dropEvents);\n});\n\nInteraction.signals.on('action-end', function ({ interaction }) {\n if (interaction.prepared.name === 'drag') {\n fireDropEvents(interaction, interaction.dropEvents);\n }\n});\n\nInteraction.signals.on('stop-drag', function ({ interaction }) {\n interaction.activeDrops.dropzones =\n interaction.activeDrops.elements =\n interaction.activeDrops.rects =\n interaction.dropEvents = null;\n});\n\nfunction collectDrops (interaction, element) {\n const drops = [];\n const elements = [];\n\n element = element || interaction.element;\n\n // collect all dropzones and their elements which qualify for a drop\n for (const current of scope.interactables) {\n if (!current.options.drop.enabled) { continue; }\n\n const accept = current.options.drop.accept;\n\n // test the draggable element against the dropzone's accept setting\n if ((utils.is.element(accept) && accept !== element)\n || (utils.is.string(accept)\n && !utils.matchesSelector(element, accept))) {\n\n continue;\n }\n\n // query for new elements if necessary\n const dropElements = utils.is.string(current.target)\n ? current._context.querySelectorAll(current.target)\n : [current.target];\n\n for (let i = 0; i < dropElements.length; i++) {\n const currentElement = dropElements[i];\n\n if (currentElement !== element) {\n drops.push(current);\n elements.push(currentElement);\n }\n }\n }\n\n return {\n elements,\n dropzones: drops,\n };\n}\n\nfunction fireActiveDrops (interaction, event) {\n let prevElement;\n\n // loop through all active dropzones and trigger event\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n const current = interaction.activeDrops.dropzones[i];\n const currentElement = interaction.activeDrops.elements [i];\n\n // prevent trigger of duplicate events on same element\n if (currentElement !== prevElement) {\n // set current element as event target\n event.target = currentElement;\n current.fire(event);\n }\n prevElement = currentElement;\n }\n}\n\n// Collect a new set of possible drops and save them in activeDrops.\n// setActiveDrops should always be called when a drag has just started or a\n// drag event happens while dynamicDrop is true\nfunction setActiveDrops (interaction, dragElement) {\n // get dropzones and their elements that could receive the draggable\n const possibleDrops = collectDrops(interaction, dragElement, true);\n\n interaction.activeDrops.dropzones = possibleDrops.dropzones;\n interaction.activeDrops.elements = possibleDrops.elements;\n interaction.activeDrops.rects = [];\n\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n interaction.activeDrops.rects[i] =\n interaction.activeDrops.dropzones[i].getRect(interaction.activeDrops.elements[i]);\n }\n}\n\nfunction getDrop (dragEvent, event, dragElement) {\n const interaction = dragEvent.interaction;\n const validDrops = [];\n\n if (dynamicDrop) {\n setActiveDrops(interaction, dragElement);\n }\n\n // collect all dropzones and their elements which qualify for a drop\n for (let j = 0; j < interaction.activeDrops.dropzones.length; j++) {\n const current = interaction.activeDrops.dropzones[j];\n const currentElement = interaction.activeDrops.elements [j];\n const rect = interaction.activeDrops.rects [j];\n\n validDrops.push(current.dropCheck(dragEvent, event, interaction.target, dragElement, currentElement, rect)\n ? currentElement\n : null);\n }\n\n // get the most appropriate dropzone based on DOM depth and order\n const dropIndex = utils.indexOfDeepestElement(validDrops);\n\n return {\n dropzone: interaction.activeDrops.dropzones[dropIndex] || null,\n element : interaction.activeDrops.elements [dropIndex] || null,\n };\n}\n\nfunction getDropEvents (interaction, pointerEvent, dragEvent) {\n const dropEvents = {\n enter : null,\n leave : null,\n activate : null,\n deactivate: null,\n move : null,\n drop : null,\n };\n\n const tmpl = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n };\n\n if (interaction.dropElement !== interaction.prevDropElement) {\n // if there was a prevDropTarget, create a dragleave event\n if (interaction.prevDropTarget) {\n dropEvents.leave = utils.extend({ type: 'dragleave' }, tmpl);\n\n dragEvent.dragLeave = dropEvents.leave.target = interaction.prevDropElement;\n dragEvent.prevDropzone = dropEvents.leave.dropzone = interaction.prevDropTarget;\n }\n // if the dropTarget is not null, create a dragenter event\n if (interaction.dropTarget) {\n dropEvents.enter = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n type : 'dragenter',\n };\n\n dragEvent.dragEnter = interaction.dropElement;\n dragEvent.dropzone = interaction.dropTarget;\n }\n }\n\n if (dragEvent.type === 'dragend' && interaction.dropTarget) {\n dropEvents.drop = utils.extend({ type: 'drop' }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n dragEvent.relatedTarget = interaction.dropElement;\n }\n if (dragEvent.type === 'dragstart') {\n dropEvents.activate = utils.extend({ type: 'dropactivate' }, tmpl);\n\n dropEvents.activate.target = null;\n dropEvents.activate.dropzone = null;\n }\n if (dragEvent.type === 'dragend') {\n dropEvents.deactivate = utils.extend({ type: 'dropdeactivate' }, tmpl);\n\n dropEvents.deactivate.target = null;\n dropEvents.deactivate.dropzone = null;\n }\n if (dragEvent.type === 'dragmove' && interaction.dropTarget) {\n dropEvents.move = utils.extend({\n dragmove : dragEvent,\n type : 'dropmove',\n }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n }\n\n return dropEvents;\n}\n\nfunction fireDropEvents (interaction, dropEvents) {\n if (dropEvents.leave) { interaction.prevDropTarget.fire(dropEvents.leave); }\n if (dropEvents.move ) { interaction.dropTarget.fire(dropEvents.move ); }\n if (dropEvents.enter) { interaction.dropTarget.fire(dropEvents.enter); }\n if (dropEvents.drop ) { interaction.dropTarget.fire(dropEvents.drop ); }\n if (dropEvents.deactivate) {\n fireActiveDrops(interaction, dropEvents.deactivate);\n }\n\n interaction.prevDropTarget = interaction.dropTarget;\n interaction.prevDropElement = interaction.dropElement;\n}\n\n/*\\\n * Interactable.dropzone\n [ method ]\n *\n * Returns or sets whether elements can be dropped onto this\n * Interactable to trigger drop events\n *\n * Dropzones can receive the following events:\n * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends\n * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone\n * - `dragmove` when a draggable that has entered the dropzone is moved\n * - `drop` when a draggable is dropped into this dropzone\n *\n * Use the `accept` option to allow only elements that match the given CSS\n * selector or element. The value can be:\n *\n * - **an Element** - only that element can be dropped into this dropzone.\n * - **a string**, - the element being dragged must match it as a CSS selector.\n * - **`null`** - accept options is cleared - it accepts any element.\n *\n * Use the `overlap` option to set how drops are checked for. The allowed\n * values are:\n *\n * - `'pointer'`, the pointer must be over the dropzone (default)\n * - `'center'`, the draggable element's center must be over the dropzone\n * - a number from 0-1 which is the `(intersection area) / (draggable area)`.\n * e.g. `0.5` for drop to happen when half of the area of the draggable is\n * over the dropzone\n *\n * Use the `checker` option to specify a function to check if a dragged\n * element is over this Interactable.\n *\n | interact(target)\n | .dropChecker(function(dragEvent, // related dragmove or dragend event\n | event, // TouchEvent/PointerEvent/MouseEvent\n | dropped, // bool result of the default checker\n | dropzone, // dropzone Interactable\n | dropElement, // dropzone elemnt\n | draggable, // draggable Interactable\n | draggableElement) {// draggable element\n |\n | return dropped && event.target.hasAttribute('allow-drop');\n | }\n *\n *\n - options (boolean | object | null) #optional The new value to be set.\n | interact('.drop').dropzone({\n | accept: '.can-drop' || document.getElementById('single-drop'),\n | overlap: 'pointer' || 'center' || zeroToOne\n | }\n = (boolean | object) The current setting or this Interactable\n\\*/\nInteractable.prototype.dropzone = function (options) {\n if (utils.is.object(options)) {\n this.options.drop.enabled = options.enabled === false? false: true;\n\n if (utils.is.function(options.ondrop) ) { this.events.ondrop = options.ondrop ; }\n if (utils.is.function(options.ondropactivate) ) { this.events.ondropactivate = options.ondropactivate ; }\n if (utils.is.function(options.ondropdeactivate)) { this.events.ondropdeactivate = options.ondropdeactivate; }\n if (utils.is.function(options.ondragenter) ) { this.events.ondragenter = options.ondragenter ; }\n if (utils.is.function(options.ondragleave) ) { this.events.ondragleave = options.ondragleave ; }\n if (utils.is.function(options.ondropmove) ) { this.events.ondropmove = options.ondropmove ; }\n\n if (/^(pointer|center)$/.test(options.overlap)) {\n this.options.drop.overlap = options.overlap;\n }\n else if (utils.is.number(options.overlap)) {\n this.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0);\n }\n if ('accept' in options) {\n this.options.drop.accept = options.accept;\n }\n if ('checker' in options) {\n this.options.drop.checker = options.checker;\n }\n\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drop.enabled = options;\n\n if (!options) {\n this.ondragenter = this.ondragleave = this.ondrop\n = this.ondropactivate = this.ondropdeactivate = null;\n }\n\n return this;\n }\n\n return this.options.drop;\n};\n\nInteractable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) {\n let dropped = false;\n\n // if the dropzone has no rect (eg. display: none)\n // call the custom dropChecker or just return false\n if (!(rect = rect || this.getRect(dropElement))) {\n return (this.options.drop.checker\n ? this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement)\n : false);\n }\n\n const dropOverlap = this.options.drop.overlap;\n\n if (dropOverlap === 'pointer') {\n const origin = utils.getOriginXY(draggable, draggableElement, 'drag');\n const page = utils.getPageXY(dragEvent);\n\n page.x += origin.x;\n page.y += origin.y;\n\n const horizontal = (page.x > rect.left) && (page.x < rect.right);\n const vertical = (page.y > rect.top ) && (page.y < rect.bottom);\n\n dropped = horizontal && vertical;\n }\n\n const dragRect = draggable.getRect(draggableElement);\n\n if (dragRect && dropOverlap === 'center') {\n const cx = dragRect.left + dragRect.width / 2;\n const cy = dragRect.top + dragRect.height / 2;\n\n dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom;\n }\n\n if (dragRect && utils.is.number(dropOverlap)) {\n const overlapArea = (Math.max(0, Math.min(rect.right , dragRect.right ) - Math.max(rect.left, dragRect.left))\n * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top , dragRect.top )));\n\n const overlapRatio = overlapArea / (dragRect.width * dragRect.height);\n\n dropped = overlapRatio >= dropOverlap;\n }\n\n if (this.options.drop.checker) {\n dropped = this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement);\n }\n\n return dropped;\n};\n\nInteractable.signals.on('unset', function ({ interactable }) {\n interactable.dropzone(false);\n});\n\nInteractable.settingsMethods.push('dropChecker');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.dropTarget = null; // the dropzone a drag target might be dropped into\n interaction.dropElement = null; // the element at the time of checking\n interaction.prevDropTarget = null; // the dropzone that was recently dragged away from\n interaction.prevDropElement = null; // the element at the time of checking\n interaction.dropEvents = null; // the dropEvents related to the current drag event\n\n interaction.activeDrops = {\n dropzones: [], // the dropzones that are mentioned below\n elements : [], // elements of dropzones that accept the target draggable\n rects : [], // the rects of the elements mentioned above\n };\n\n});\n\nInteraction.signals.on('stop', function ({ interaction }) {\n interaction.dropTarget = interaction.dropElement =\n interaction.prevDropTarget = interaction.prevDropElement = null;\n});\n\n/*\\\n * interact.dynamicDrop\n [ method ]\n *\n * Returns or sets whether the dimensions of dropzone elements are\n * calculated on every dragmove or only on dragstart for the default\n * dropChecker\n *\n - newValue (boolean) #optional True to check on each move. False to check only before start\n = (boolean | interact) The current setting or interact\n\\*/\ninteract.dynamicDrop = function (newValue) {\n if (utils.is.bool(newValue)) {\n //if (dragging && dynamicDrop !== newValue && !newValue) {\n //calcRects(dropzones);\n //}\n\n dynamicDrop = newValue;\n\n return interact;\n }\n return dynamicDrop;\n};\n\nutils.merge(Interactable.eventTypes, [\n 'dragenter',\n 'dragleave',\n 'dropactivate',\n 'dropdeactivate',\n 'dropmove',\n 'drop',\n]);\nactions.methodDict.drop = 'dropzone';\n\ndefaultOptions.drop = drop.defaults;\n\nmodule.exports = drop;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst gesture = {\n defaults: {\n enabled : false,\n origin : null,\n restrict: null,\n },\n\n checker: function (pointer, event, interactable, element, interaction) {\n if (interaction.pointerIds.length >= 2) {\n return { name: 'gesture' };\n }\n\n return null;\n },\n\n getCursor: function () {\n return '';\n },\n};\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturestart') { return; }\n iEvent.ds = 0;\n\n interaction.gesture.startDistance = interaction.gesture.prevDistance = iEvent.distance;\n interaction.gesture.startAngle = interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.scale = 1;\n});\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturemove') { return; }\n\n iEvent.ds = iEvent.scale - interaction.gesture.scale;\n\n interaction.target.fire(iEvent);\n\n interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.prevDistance = iEvent.distance;\n\n if (iEvent.scale !== Infinity\n && iEvent.scale !== null\n && iEvent.scale !== undefined\n && !isNaN(iEvent.scale)) {\n\n interaction.gesture.scale = iEvent.scale;\n }\n});\n\n/*\\\n * Interactable.gesturable\n [ method ]\n *\n * Gets or sets whether multitouch gestures can be performed on the\n * Interactable's element\n *\n = (boolean) Indicates if this can be the target of gesture events\n | var isGestureable = interact(element).gesturable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on gesture events (makes the Interactable gesturable)\n = (object) this Interactable\n | interact(element).gesturable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // limit multiple gestures.\n | // See the explanation in @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n\\*/\nInteractable.prototype.gesturable = function (options) {\n if (utils.is.object(options)) {\n this.options.gesture.enabled = options.enabled === false? false: true;\n this.setPerAction('gesture', options);\n this.setOnEvents('gesture', options);\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.gesture.enabled = options;\n\n if (!options) {\n this.ongesturestart = this.ongesturestart = this.ongestureend = null;\n }\n\n return this;\n }\n\n return this.options.gesture;\n};\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action, event, starting, ending, deltaSource }) {\n if (action !== 'gesture') { return; }\n\n const pointers = interaction.pointers;\n\n iEvent.touches = [pointers[0], pointers[1]];\n\n if (starting) {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = 1;\n iEvent.ds = 0;\n iEvent.angle = utils.touchAngle(pointers, undefined, deltaSource);\n iEvent.da = 0;\n }\n else if (ending || event instanceof InteractEvent) {\n iEvent.distance = interaction.prevEvent.distance;\n iEvent.box = interaction.prevEvent.box;\n iEvent.scale = interaction.prevEvent.scale;\n iEvent.ds = iEvent.scale - 1;\n iEvent.angle = interaction.prevEvent.angle;\n iEvent.da = iEvent.angle - interaction.gesture.startAngle;\n }\n else {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = iEvent.distance / interaction.gesture.startDistance;\n iEvent.angle = utils.touchAngle(pointers, interaction.gesture.prevAngle, deltaSource);\n\n iEvent.ds = iEvent.scale - interaction.gesture.prevScale;\n iEvent.da = iEvent.angle - interaction.gesture.prevAngle;\n }\n});\n\nInteraction.signals.on('new', function (interaction) {\n interaction.gesture = {\n start: { x: 0, y: 0 },\n\n startDistance: 0, // distance between two touches of touchStart\n prevDistance : 0,\n distance : 0,\n\n scale: 1, // gesture.distance / gesture.startDistance\n\n startAngle: 0, // angle of line joining two touches\n prevAngle : 0, // angle of the previous gesture event\n };\n});\n\nactions.gesture = gesture;\nactions.names.push('gesture');\nutils.merge(Interactable.eventTypes, [\n 'gesturestart',\n 'gesturemove',\n 'gestureend',\n]);\nactions.methodDict.gesture = 'gesturable';\n\ndefaultOptions.gesture = gesture.defaults;\n\nmodule.exports = gesture;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\n// Less Precision with touch input\nconst defaultMargin = browser.supportsTouch || browser.supportsPointerEvent? 20: 10;\n\nconst resize = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n square: false,\n preserveAspectRatio: false,\n axis: 'xy',\n\n // use default margin\n margin: NaN,\n\n // object with props left, right, top, bottom which are\n // true/false values to resize when the pointer is over that edge,\n // CSS selectors to match the handles for each direction\n // or the Elements for each handle\n edges: null,\n\n // a value of 'none' will limit the resize rect to a minimum of 0x0\n // 'negate' will alow the rect to have negative width/height\n // 'reposition' will keep the width/height positive by swapping\n // the top and bottom edges and/or swapping the left and right edges\n invert: 'none',\n },\n\n checker: function (pointer, event, interactable, element, interaction, rect) {\n if (!rect) { return null; }\n\n const page = utils.extend({}, interaction.curCoords.page);\n const options = interactable.options;\n\n if (options.resize.enabled) {\n const resizeOptions = options.resize;\n const resizeEdges = { left: false, right: false, top: false, bottom: false };\n\n // if using resize.edges\n if (utils.is.object(resizeOptions.edges)) {\n for (const edge in resizeEdges) {\n resizeEdges[edge] = checkResizeEdge(edge,\n resizeOptions.edges[edge],\n page,\n interaction._eventTarget,\n element,\n rect,\n resizeOptions.margin || defaultMargin);\n }\n\n resizeEdges.left = resizeEdges.left && !resizeEdges.right;\n resizeEdges.top = resizeEdges.top && !resizeEdges.bottom;\n\n if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) {\n return {\n name: 'resize',\n edges: resizeEdges,\n };\n }\n }\n else {\n const right = options.resize.axis !== 'y' && page.x > (rect.right - defaultMargin);\n const bottom = options.resize.axis !== 'x' && page.y > (rect.bottom - defaultMargin);\n\n if (right || bottom) {\n return {\n name: 'resize',\n axes: (right? 'x' : '') + (bottom? 'y' : ''),\n };\n }\n }\n }\n\n return null;\n },\n\n cursors: (browser.isIe9OrOlder ? {\n x : 'e-resize',\n y : 's-resize',\n xy: 'se-resize',\n\n top : 'n-resize',\n left : 'w-resize',\n bottom : 's-resize',\n right : 'e-resize',\n topleft : 'se-resize',\n bottomright: 'se-resize',\n topright : 'ne-resize',\n bottomleft : 'ne-resize',\n } : {\n x : 'ew-resize',\n y : 'ns-resize',\n xy: 'nwse-resize',\n\n top : 'ns-resize',\n left : 'ew-resize',\n bottom : 'ns-resize',\n right : 'ew-resize',\n topleft : 'nwse-resize',\n bottomright: 'nwse-resize',\n topright : 'nesw-resize',\n bottomleft : 'nesw-resize',\n }),\n\n getCursor: function (action) {\n if (action.axis) {\n return resize.cursors[action.name + action.axis];\n }\n else if (action.edges) {\n let cursorKey = '';\n const edgeNames = ['top', 'bottom', 'left', 'right'];\n\n for (let i = 0; i < 4; i++) {\n if (action.edges[edgeNames[i]]) {\n cursorKey += edgeNames[i];\n }\n }\n\n return resize.cursors[cursorKey];\n }\n },\n};\n\n// resizestart\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'resizestart' || !interaction.prepared.edges) {\n return;\n }\n\n const startRect = interaction.target.getRect(interaction.element);\n const resizeOptions = interaction.target.options.resize;\n\n /*\n * When using the `resizable.square` or `resizable.preserveAspectRatio` options, resizing from one edge\n * will affect another. E.g. with `resizable.square`, resizing to make the right edge larger will make\n * the bottom edge larger by the same amount. We call these 'linked' edges. Any linked edges will depend\n * on the active edges and the edge being interacted with.\n */\n if (resizeOptions.square || resizeOptions.preserveAspectRatio) {\n const linkedEdges = utils.extend({}, interaction.prepared.edges);\n\n linkedEdges.top = linkedEdges.top || (linkedEdges.left && !linkedEdges.bottom);\n linkedEdges.left = linkedEdges.left || (linkedEdges.top && !linkedEdges.right );\n linkedEdges.bottom = linkedEdges.bottom || (linkedEdges.right && !linkedEdges.top );\n linkedEdges.right = linkedEdges.right || (linkedEdges.bottom && !linkedEdges.left );\n\n interaction.prepared._linkedEdges = linkedEdges;\n }\n else {\n interaction.prepared._linkedEdges = null;\n }\n\n // if using `resizable.preserveAspectRatio` option, record aspect ratio at the start of the resize\n if (resizeOptions.preserveAspectRatio) {\n interaction.resizeStartAspectRatio = startRect.width / startRect.height;\n }\n\n interaction.resizeRects = {\n start : startRect,\n current : utils.extend({}, startRect),\n inverted : utils.extend({}, startRect),\n previous : utils.extend({}, startRect),\n delta : {\n left: 0, right : 0, width : 0,\n top : 0, bottom: 0, height: 0,\n },\n };\n\n iEvent.rect = interaction.resizeRects.inverted;\n iEvent.deltaRect = interaction.resizeRects.delta;\n});\n\n// resizemove\nInteractEvent.signals.on('new', function ({ iEvent, phase, interaction }) {\n if (phase !== 'move' || !interaction.prepared.edges) { return; }\n\n const resizeOptions = interaction.target.options.resize;\n const invert = resizeOptions.invert;\n const invertible = invert === 'reposition' || invert === 'negate';\n\n let edges = interaction.prepared.edges;\n\n const start = interaction.resizeRects.start;\n const current = interaction.resizeRects.current;\n const inverted = interaction.resizeRects.inverted;\n const delta = interaction.resizeRects.delta;\n const previous = utils.extend(interaction.resizeRects.previous, inverted);\n const originalEdges = edges;\n\n let dx = iEvent.dx;\n let dy = iEvent.dy;\n\n if (resizeOptions.preserveAspectRatio || resizeOptions.square) {\n // `resize.preserveAspectRatio` takes precedence over `resize.square`\n const startAspectRatio = resizeOptions.preserveAspectRatio\n ? interaction.resizeStartAspectRatio\n : 1;\n\n edges = interaction.prepared._linkedEdges;\n\n if ((originalEdges.left && originalEdges.bottom)\n || (originalEdges.right && originalEdges.top)) {\n dy = -dx / startAspectRatio;\n }\n else if (originalEdges.left || originalEdges.right ) { dy = dx / startAspectRatio; }\n else if (originalEdges.top || originalEdges.bottom) { dx = dy * startAspectRatio; }\n }\n\n // update the 'current' rect without modifications\n if (edges.top ) { current.top += dy; }\n if (edges.bottom) { current.bottom += dy; }\n if (edges.left ) { current.left += dx; }\n if (edges.right ) { current.right += dx; }\n\n if (invertible) {\n // if invertible, copy the current rect\n utils.extend(inverted, current);\n\n if (invert === 'reposition') {\n // swap edge values if necessary to keep width/height positive\n let swap;\n\n if (inverted.top > inverted.bottom) {\n swap = inverted.top;\n\n inverted.top = inverted.bottom;\n inverted.bottom = swap;\n }\n if (inverted.left > inverted.right) {\n swap = inverted.left;\n\n inverted.left = inverted.right;\n inverted.right = swap;\n }\n }\n }\n else {\n // if not invertible, restrict to minimum of 0x0 rect\n inverted.top = Math.min(current.top, start.bottom);\n inverted.bottom = Math.max(current.bottom, start.top);\n inverted.left = Math.min(current.left, start.right);\n inverted.right = Math.max(current.right, start.left);\n }\n\n inverted.width = inverted.right - inverted.left;\n inverted.height = inverted.bottom - inverted.top ;\n\n for (const edge in inverted) {\n delta[edge] = inverted[edge] - previous[edge];\n }\n\n iEvent.edges = interaction.prepared.edges;\n iEvent.rect = inverted;\n iEvent.deltaRect = delta;\n});\n\n/*\\\n * Interactable.resizable\n [ method ]\n *\n * Gets or sets whether resize actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of resize elements\n | var isResizeable = interact('input[type=text]').resizable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on resize events (object makes the Interactable resizable)\n = (object) This Interactable\n | interact(element).resizable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | edges: {\n | top : true, // Use pointer coords to check for resize.\n | left : false, // Disable resizing from left edge.\n | bottom: '.resize-s',// Resize if pointer target matches selector\n | right : handleEl // Resize if pointer target is the given Element\n | },\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height are adjusted at a 1:1 ratio.\n | square: false,\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height maintain the aspect ratio they had when resizing started.\n | preserveAspectRatio: false,\n |\n | // a value of 'none' will limit the resize rect to a minimum of 0x0\n | // 'negate' will allow the rect to have negative width/height\n | // 'reposition' will keep the width/height positive by swapping\n | // the top and bottom edges and/or swapping the left and right edges\n | invert: 'none' || 'negate' || 'reposition'\n |\n | // limit multiple resizes.\n | // See the explanation in the @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n \\*/\nInteractable.prototype.resizable = function (options) {\n if (utils.is.object(options)) {\n this.options.resize.enabled = options.enabled === false? false: true;\n this.setPerAction('resize', options);\n this.setOnEvents('resize', options);\n\n if (/^x$|^y$|^xy$/.test(options.axis)) {\n this.options.resize.axis = options.axis;\n }\n else if (options.axis === null) {\n this.options.resize.axis = defaultOptions.resize.axis;\n }\n\n if (utils.is.bool(options.preserveAspectRatio)) {\n this.options.resize.preserveAspectRatio = options.preserveAspectRatio;\n }\n else if (utils.is.bool(options.square)) {\n this.options.resize.square = options.square;\n }\n\n return this;\n }\n if (utils.is.bool(options)) {\n this.options.resize.enabled = options;\n\n if (!options) {\n this.onresizestart = this.onresizestart = this.onresizeend = null;\n }\n\n return this;\n }\n return this.options.resize;\n};\n\nfunction checkResizeEdge (name, value, page, element, interactableElement, rect, margin) {\n // false, '', undefined, null\n if (!value) { return false; }\n\n // true value, use pointer coords and element rect\n if (value === true) {\n // if dimensions are negative, \"switch\" edges\n const width = utils.is.number(rect.width )? rect.width : rect.right - rect.left;\n const height = utils.is.number(rect.height)? rect.height : rect.bottom - rect.top ;\n\n if (width < 0) {\n if (name === 'left' ) { name = 'right'; }\n else if (name === 'right') { name = 'left' ; }\n }\n if (height < 0) {\n if (name === 'top' ) { name = 'bottom'; }\n else if (name === 'bottom') { name = 'top' ; }\n }\n\n if (name === 'left' ) { return page.x < ((width >= 0? rect.left: rect.right ) + margin); }\n if (name === 'top' ) { return page.y < ((height >= 0? rect.top : rect.bottom) + margin); }\n\n if (name === 'right' ) { return page.x > ((width >= 0? rect.right : rect.left) - margin); }\n if (name === 'bottom') { return page.y > ((height >= 0? rect.bottom: rect.top ) - margin); }\n }\n\n // the remaining checks require an element\n if (!utils.is.element(element)) { return false; }\n\n return utils.is.element(value)\n // the value is an element to use as a resize handle\n ? value === element\n // otherwise check if element matches value as selector\n : utils.matchesUpTo(element, value, interactableElement);\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.resizeAxes = 'xy';\n});\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action }) {\n if (action !== 'resize' || !interaction.resizeAxes) { return; }\n\n const options = interaction.target.options;\n\n if (options.resize.square) {\n if (interaction.resizeAxes === 'y') {\n iEvent.dx = iEvent.dy;\n }\n else {\n iEvent.dy = iEvent.dx;\n }\n iEvent.axes = 'xy';\n }\n else {\n iEvent.axes = interaction.resizeAxes;\n\n if (interaction.resizeAxes === 'x') {\n iEvent.dy = 0;\n }\n else if (interaction.resizeAxes === 'y') {\n iEvent.dx = 0;\n }\n }\n});\n\nactions.resize = resize;\nactions.names.push('resize');\nutils.merge(Interactable.eventTypes, [\n 'resizestart',\n 'resizemove',\n 'resizeinertiastart',\n 'resizeinertiaresume',\n 'resizeend',\n]);\nactions.methodDict.resize = 'resizable';\n\ndefaultOptions.resize = resize.defaults;\n\nmodule.exports = resize;\n","const raf = require('./utils/raf');\nconst getWindow = require('./utils/window').getWindow;\nconst is = require('./utils/is');\nconst domUtils = require('./utils/domUtils');\nconst Interaction = require('./Interaction');\nconst defaultOptions = require('./defaultOptions');\n\nconst autoScroll = {\n defaults: {\n enabled : false,\n container: null, // the item that is scrolled (Window or HTMLElement)\n margin : 60,\n speed : 300, // the scroll speed in pixels per second\n },\n\n interaction: null,\n i: null, // the handle returned by window.setInterval\n x: 0, y: 0, // Direction each pulse is to scroll in\n\n isScrolling: false,\n prevTime: 0,\n\n start: function (interaction) {\n autoScroll.isScrolling = true;\n raf.cancel(autoScroll.i);\n\n autoScroll.interaction = interaction;\n autoScroll.prevTime = new Date().getTime();\n autoScroll.i = raf.request(autoScroll.scroll);\n },\n\n stop: function () {\n autoScroll.isScrolling = false;\n raf.cancel(autoScroll.i);\n },\n\n // scroll the window by the values in scroll.x/y\n scroll: function () {\n const options = autoScroll.interaction.target.options[autoScroll.interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(autoScroll.interaction.element);\n const now = new Date().getTime();\n // change in time in seconds\n const dt = (now - autoScroll.prevTime) / 1000;\n // displacement\n const s = options.speed * dt;\n\n if (s >= 1) {\n if (is.window(container)) {\n container.scrollBy(autoScroll.x * s, autoScroll.y * s);\n }\n else if (container) {\n container.scrollLeft += autoScroll.x * s;\n container.scrollTop += autoScroll.y * s;\n }\n\n autoScroll.prevTime = now;\n }\n\n if (autoScroll.isScrolling) {\n raf.cancel(autoScroll.i);\n autoScroll.i = raf.request(autoScroll.scroll);\n }\n },\n check: function (interactable, actionName) {\n const options = interactable.options;\n\n return options[actionName].autoScroll && options[actionName].autoScroll.enabled;\n },\n onInteractionMove: function ({ interaction, pointer }) {\n if (!(interaction.interacting()\n && autoScroll.check(interaction.target, interaction.prepared.name))) {\n return;\n }\n\n if (interaction.simulation) {\n autoScroll.x = autoScroll.y = 0;\n return;\n }\n\n let top;\n let right;\n let bottom;\n let left;\n\n const options = interaction.target.options[interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(interaction.element);\n\n if (is.window(container)) {\n left = pointer.clientX < autoScroll.margin;\n top = pointer.clientY < autoScroll.margin;\n right = pointer.clientX > container.innerWidth - autoScroll.margin;\n bottom = pointer.clientY > container.innerHeight - autoScroll.margin;\n }\n else {\n const rect = domUtils.getElementClientRect(container);\n\n left = pointer.clientX < rect.left + autoScroll.margin;\n top = pointer.clientY < rect.top + autoScroll.margin;\n right = pointer.clientX > rect.right - autoScroll.margin;\n bottom = pointer.clientY > rect.bottom - autoScroll.margin;\n }\n\n autoScroll.x = (right ? 1: left? -1: 0);\n autoScroll.y = (bottom? 1: top? -1: 0);\n\n if (!autoScroll.isScrolling) {\n // set the autoScroll properties to those of the target\n autoScroll.margin = options.margin;\n autoScroll.speed = options.speed;\n\n autoScroll.start(interaction);\n }\n },\n};\n\nInteraction.signals.on('stop-active', function () {\n autoScroll.stop();\n});\n\nInteraction.signals.on('action-move', autoScroll.onInteractionMove);\n\ndefaultOptions.perAction.autoScroll = autoScroll.defaults;\n\nmodule.exports = autoScroll;\n","const Interactable = require('../Interactable');\nconst actions = require('../actions/base');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.ignoreFrom\n [ method ]\n *\n * If the target of the `mousedown`, `pointerdown` or `touchstart`\n * event or any of it's parents match the given CSS selector or\n * Element, no drag/resize/gesture is started.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to not ignore any elements\n = (string | Element | object) The current ignoreFrom value or this Interactable\n **\n | interact(element, { ignoreFrom: document.getElementById('no-action') });\n | // or\n | interact(element).ignoreFrom('input, textarea, a');\n\\*/\nInteractable.prototype.ignoreFrom = function (newValue) {\n return this._backCompatOption('ignoreFrom', newValue);\n};\n\n/*\\\n * Interactable.allowFrom\n [ method ]\n *\n * A drag/resize/gesture is started only If the target of the\n * `mousedown`, `pointerdown` or `touchstart` event or any of it's\n * parents match the given CSS selector or Element.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to allow from any element\n = (string | Element | object) The current allowFrom value or this Interactable\n **\n | interact(element, { allowFrom: document.getElementById('drag-handle') });\n | // or\n | interact(element).allowFrom('.handle');\n\\*/\nInteractable.prototype.allowFrom = function (newValue) {\n return this._backCompatOption('allowFrom', newValue);\n};\n\nInteractable.prototype.testIgnore = function (ignoreFrom, interactableElement, element) {\n if (!ignoreFrom || !is.element(element)) { return false; }\n\n if (is.string(ignoreFrom)) {\n return domUtils.matchesUpTo(element, ignoreFrom, interactableElement);\n }\n else if (is.element(ignoreFrom)) {\n return domUtils.nodeContains(ignoreFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testAllow = function (allowFrom, interactableElement, element) {\n if (!allowFrom) { return true; }\n\n if (!is.element(element)) { return false; }\n\n if (is.string(allowFrom)) {\n return domUtils.matchesUpTo(element, allowFrom, interactableElement);\n }\n else if (is.element(allowFrom)) {\n return domUtils.nodeContains(allowFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testIgnoreAllow = function (options, interactableElement, eventTarget) {\n return (!this.testIgnore(options.ignoreFrom, interactableElement, eventTarget)\n && this.testAllow(options.allowFrom, interactableElement, eventTarget));\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (event.buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\n","const interact = require('../interact');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst actions = require('../actions/base');\nconst defaultOptions = require('../defaultOptions');\nconst browser = require('../utils/browser');\nconst scope = require('../scope');\nconst utils = require('../utils');\nconst signals = require('../utils/Signals').new();\n\nrequire('./InteractableMethods');\n\nconst autoStart = {\n signals,\n withinInteractionLimit,\n // Allow this many interactions to happen simultaneously\n maxInteractions: Infinity,\n defaults: {\n perAction: {\n manualStart: false,\n max: Infinity,\n maxPerElement: 1,\n allowFrom: null,\n ignoreFrom: null,\n },\n },\n setActionDefaults: function (action) {\n utils.extend(action.defaults, autoStart.defaults.perAction);\n },\n};\n\n// set cursor style on mousedown\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget }) {\n if (interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\n// set cursor style on mousemove\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget }) {\n if (!interaction.mouse\n || interaction.pointerIsDown\n || interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\nInteraction.signals.on('move', function (arg) {\n const { interaction, event } = arg;\n\n if (!interaction.pointerIsDown\n || interaction.interacting()\n || !interaction.pointerWasMoved\n || !interaction.prepared.name) {\n return;\n }\n\n signals.fire('before-start', arg);\n\n const target = interaction.target;\n\n if (interaction.prepared.name && target) {\n // check manualStart and interaction limit\n if (target.options[interaction.prepared.name].manualStart\n || !withinInteractionLimit(target, interaction.element, interaction.prepared)) {\n interaction.stop(event);\n }\n else {\n interaction.start(interaction.prepared, target, interaction.element);\n }\n }\n});\n\n// Check if the current target supports the action.\n// If so, return the validated action. Otherwise, return null\nfunction validateAction (action, interactable, element, eventTarget) {\n if (utils.is.object(action)\n && interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget)\n && interactable.options[action.name].enabled\n && withinInteractionLimit(interactable, element, action)) {\n return action;\n }\n\n return null;\n}\n\nfunction validateSelector (interaction, pointer, event, matches, matchElements, eventTarget) {\n for (let i = 0, len = matches.length; i < len; i++) {\n const match = matches[i];\n const matchElement = matchElements[i];\n const action = validateAction(match.getAction(pointer, event, interaction, matchElement),\n match,\n matchElement,\n eventTarget);\n\n if (action) {\n return {\n action,\n target: match,\n element: matchElement,\n };\n }\n }\n\n return {};\n}\n\nfunction getActionInfo (interaction, pointer, event, eventTarget) {\n let matches = [];\n let matchElements = [];\n\n let element = eventTarget;\n let action = null;\n\n function pushMatches (interactable, selector, context) {\n const elements = (browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined);\n\n if (utils.matchesSelector(element, selector, elements)) {\n\n matches.push(interactable);\n matchElements.push(element);\n }\n }\n\n while (utils.is.element(element)) {\n matches = [];\n matchElements = [];\n\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && (action = validateAction(elementInteractable.getAction(pointer, event, interaction, element, eventTarget),\n elementInteractable,\n element,\n eventTarget))\n && !elementInteractable.options[action.name].manualStart) {\n return {\n element,\n action,\n target: elementInteractable,\n };\n }\n else {\n scope.interactables.forEachSelector(pushMatches, element);\n\n const actionInfo = validateSelector(interaction, pointer, event, matches, matchElements, eventTarget);\n\n if (actionInfo.action\n && !actionInfo.target.options[actionInfo.action.name].manualStart) {\n return actionInfo;\n }\n }\n\n element = utils.parentNode(element);\n }\n\n return {};\n}\n\nfunction prepare (interaction, { action, target, element }) {\n action = action || {};\n\n if (interaction.target && interaction.target.options.styleCursor) {\n interaction.target._doc.documentElement.style.cursor = '';\n }\n\n interaction.target = target;\n interaction.element = element;\n utils.copyAction(interaction.prepared, action);\n\n if (target && target.options.styleCursor) {\n const cursor = action? actions[action.name].getCursor(action) : '';\n interaction.target._doc.documentElement.style.cursor = cursor;\n }\n\n signals.fire('prepared', { interaction: interaction });\n}\n\nInteraction.signals.on('stop', function ({ interaction }) {\n const target = interaction.target;\n\n if (target && target.options.styleCursor) {\n target._doc.documentElement.style.cursor = '';\n }\n});\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (utils.is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (utils.is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n const buttons = event.buttons || ({\n 0: 1,\n 1: 4,\n 3: 8,\n 4: 16,\n })[event.button];\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\nfunction withinInteractionLimit (interactable, element, action) {\n const options = interactable.options;\n const maxActions = options[action.name].max;\n const maxPerElement = options[action.name].maxPerElement;\n let activeInteractions = 0;\n let targetCount = 0;\n let targetElementCount = 0;\n\n // no actions if any of these values == 0\n if (!(maxActions && maxPerElement && autoStart.maxInteractions)) { return; }\n\n for (let i = 0, len = scope.interactions.length; i < len; i++) {\n const interaction = scope.interactions[i];\n const otherAction = interaction.prepared.name;\n\n if (!interaction.interacting()) { continue; }\n\n activeInteractions++;\n\n if (activeInteractions >= autoStart.maxInteractions) {\n return false;\n }\n\n if (interaction.target !== interactable) { continue; }\n\n targetCount += (otherAction === action.name)|0;\n\n if (targetCount >= maxActions) {\n return false;\n }\n\n if (interaction.element === element) {\n targetElementCount++;\n\n if (otherAction !== action.name || targetElementCount >= maxPerElement) {\n return false;\n }\n }\n }\n\n return autoStart.maxInteractions > 0;\n}\n\n/*\\\n * interact.maxInteractions\n [ method ]\n **\n * Returns or sets the maximum number of concurrent interactions allowed.\n * By default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables\n * and elements, you need to enable it in the draggable, resizable and\n * gesturable `'max'` and `'maxPerElement'` options.\n **\n - newValue (number) #optional Any number. newValue <= 0 means no interactions.\n\\*/\ninteract.maxInteractions = function (newValue) {\n if (utils.is.number(newValue)) {\n autoStart.maxInteractions = newValue;\n\n return this;\n }\n\n return autoStart.maxInteractions;\n};\n\nInteractable.settingsMethods.push('styleCursor');\nInteractable.settingsMethods.push('actionChecker');\nInteractable.settingsMethods.push('ignoreFrom');\nInteractable.settingsMethods.push('allowFrom');\n\ndefaultOptions.base.actionChecker = null;\ndefaultOptions.base.styleCursor = true;\n\nutils.extend(defaultOptions.perAction, autoStart.defaults.perAction);\n\nmodule.exports = autoStart;\n","const autoStart = require('./base');\nconst Interaction = require('../Interaction');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.delayTimer = null;\n});\n\nautoStart.signals.on('prepared', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.delayTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.target, interaction.element);\n }, delay);\n }\n});\n\nInteraction.signals.on('move', function ({ interaction, duplicate }) {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.delayTimer);\n }\n});\n\n// prevent regular down->move autoStart\nautoStart.signals.on('before-start', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.prepared.name = null;\n }\n});\n","const autoStart = require('./base');\nconst scope = require('../scope');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\n\nconst { matchesSelector, parentNode } = require('../utils/domUtils');\n\nautoStart.setActionDefaults(require('../actions/drag'));\n\nautoStart.signals.on('before-start', function ({ interaction, eventTarget, dx, dy }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // check if a drag is in the correct axis\n const absX = Math.abs(dx);\n const absY = Math.abs(dy);\n const options = interaction.target.options.drag;\n const startAxis = options.startAxis;\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy');\n\n interaction.prepared.axis = options.lockAxis === 'start'\n ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n : options.lockAxis;\n\n // if the movement isn't in the startAxis of the interactable\n if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) {\n // cancel the prepared action\n interaction.prepared.name = null;\n\n // then try to get a drag from another ineractable\n\n if (!interaction.prepared.name) {\n\n let element = eventTarget;\n\n const getDraggable = function (interactable, selector, context) {\n const elements = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n if (interactable === interaction.target) { return; }\n\n if (!options.manualStart\n && !interactable.testIgnoreAllow(options, element, eventTarget)\n && matchesSelector(element, selector, elements)) {\n\n const action = interactable.getAction(interaction.downPointer,\n interaction.downEvent,\n interaction,\n element);\n\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, interactable)\n && autoStart.validateAction(action, interactable, element, eventTarget)) {\n\n return interactable;\n }\n }\n };\n\n let action = null;\n\n // check all interactables\n while (is.element(element)) {\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && elementInteractable !== interaction.target\n && !elementInteractable.options.drag.manualStart) {\n\n action = elementInteractable.getAction(interaction.downPointer, interaction.downEvent, interaction, element);\n }\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, elementInteractable)) {\n\n interaction.prepared.name = 'drag';\n interaction.target = elementInteractable;\n interaction.element = element;\n break;\n }\n\n const selectorInteractable = scope.interactables.forEachSelector(getDraggable, element);\n\n if (selectorInteractable) {\n interaction.prepared.name = 'drag';\n interaction.target = selectorInteractable;\n interaction.element = element;\n break;\n }\n\n element = parentNode(element);\n }\n }\n }\n});\n\nfunction checkStartAxis (startAxis, interactable) {\n if (!interactable) { return false; }\n\n const thisAxis = interactable.options.drag.startAxis;\n\n return (startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis);\n}\n","require('./base').setActionDefaults(require('../actions/gesture'));\n","require('./base').setActionDefaults(require('../actions/resize'));\n","module.exports = {\n base: {\n accept : null,\n preventDefault: 'auto',\n deltaSource : 'page',\n },\n\n perAction: {\n origin: { x: 0, y: 0 },\n\n // only allow left button by default\n // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n mouseButtons: 1,\n\n inertia: {\n enabled : false,\n resistance : 10, // the lambda in exponential decay\n minSpeed : 100, // target speed must be above this for inertia to start\n endSpeed : 10, // the speed at which inertia is slow enough to stop\n allowResume : true, // allow resuming an action in inertia phase\n smoothEndDuration: 300, // animate to snap/restrict endOnly if there's no inertia\n },\n },\n};\n","/* browser entry point */\n\n// Legacy browser support\nrequire('./legacyBrowsers');\n\n// inertia\nrequire('./inertia');\n\n// modifiers\nrequire('./modifiers/snap');\nrequire('./modifiers/restrict');\n\n// pointerEvents\nrequire('./pointerEvents/base');\nrequire('./pointerEvents/holdRepeat');\nrequire('./pointerEvents/interactableTargets');\n\n// delay\nrequire('./autoStart/delay');\n\n// actions\nrequire('./actions/gesture');\nrequire('./actions/resize');\nrequire('./actions/drag');\nrequire('./actions/drop');\n\n// load these modifiers after resize is loaded\nrequire('./modifiers/snapSize');\nrequire('./modifiers/restrictEdges');\nrequire('./modifiers/restrictSize');\n\n// autoStart actions\nrequire('./autoStart/gesture');\nrequire('./autoStart/resize');\nrequire('./autoStart/drag');\n\n// Interactable preventDefault setting\nrequire('./interactablePreventDefault.js');\n\n// autoScroll\nrequire('./autoScroll');\n\n// export interact\nmodule.exports = require('./interact');\n","const InteractEvent = require('./InteractEvent');\nconst Interaction = require('./Interaction');\nconst modifiers = require('./modifiers');\nconst utils = require('./utils');\nconst animationFrame = require('./utils/raf');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.inertiaStatus = {\n active : false,\n smoothEnd : false,\n allowResume: false,\n\n startEvent: null,\n upCoords : {},\n\n xe: 0, ye: 0,\n sx: 0, sy: 0,\n\n t0: 0,\n vx0: 0, vys: 0,\n duration: 0,\n\n lambda_v0: 0,\n one_ve_v0: 0,\n i : null,\n };\n\n interaction.boundInertiaFrame = () => inertiaFrame .apply(interaction);\n interaction.boundSmoothEndFrame = () => smoothEndFrame.apply(interaction);\n});\n\nInteraction.signals.on('down', function ({ interaction, event, pointer, eventTarget }) {\n const status = interaction.inertiaStatus;\n\n // Check if the down event hits the current inertia target\n if (status.active) {\n let element = eventTarget;\n\n // climb up the DOM tree from the event target\n while (utils.is.element(element)) {\n\n // if interaction element is the current inertia target element\n if (element === interaction.element) {\n // stop inertia\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n\n // update pointers to the down event's coordinates\n interaction.updatePointer(pointer);\n utils.setCoords(interaction.curCoords, interaction.pointers);\n\n // fire appropriate signals\n const signalArg = { interaction };\n Interaction.signals.fire('before-action-move', signalArg);\n Interaction.signals.fire('action-resume' , signalArg);\n\n // fire a reume event\n const resumeEvent = new InteractEvent(interaction,\n event,\n interaction.prepared.name,\n 'inertiaresume',\n interaction.element);\n\n interaction.target.fire(resumeEvent);\n interaction.prevEvent = resumeEvent;\n modifiers.resetStatuses(interaction.modifierStatuses);\n\n utils.copyCoords(interaction.prevCoords, interaction.curCoords);\n break;\n }\n\n element = utils.parentNode(element);\n }\n }\n});\n\nInteraction.signals.on('up', function ({ interaction, event }) {\n const status = interaction.inertiaStatus;\n\n if (!interaction.interacting() || status.active) { return; }\n\n const target = interaction.target;\n const options = target && target.options;\n const inertiaOptions = options && interaction.prepared.name && options[interaction.prepared.name].inertia;\n\n const now = new Date().getTime();\n const statuses = {};\n const page = utils.extend({}, interaction.curCoords.page);\n const pointerSpeed = interaction.pointerDelta.client.speed;\n\n let smoothEnd = false;\n let modifierResult;\n\n // check if inertia should be started\n const inertiaPossible = (inertiaOptions && inertiaOptions.enabled\n && interaction.prepared.name !== 'gesture'\n && event !== status.startEvent);\n\n const inertia = (inertiaPossible\n && (now - interaction.curCoords.timeStamp) < 50\n && pointerSpeed > inertiaOptions.minSpeed\n && pointerSpeed > inertiaOptions.endSpeed);\n\n const modifierArg = {\n interaction,\n pageCoords: page,\n statuses,\n preEnd: true,\n requireEndOnly: true,\n };\n\n // smoothEnd\n if (inertiaPossible && !inertia) {\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n if (modifierResult.shouldMove && modifierResult.locked) {\n smoothEnd = true;\n }\n }\n\n if (!(inertia || smoothEnd)) { return; }\n\n utils.copyCoords(status.upCoords, interaction.curCoords);\n\n interaction.pointers[0] = status.startEvent =\n new InteractEvent(interaction, event, interaction.prepared.name, 'inertiastart', interaction.element);\n\n status.t0 = now;\n\n status.active = true;\n status.allowResume = inertiaOptions.allowResume;\n interaction.simulation = status;\n\n target.fire(status.startEvent);\n\n if (inertia) {\n status.vx0 = interaction.pointerDelta.client.vx;\n status.vy0 = interaction.pointerDelta.client.vy;\n status.v0 = pointerSpeed;\n\n calcInertia(interaction, status);\n\n utils.extend(page, interaction.curCoords.page);\n\n page.x += status.xe;\n page.y += status.ye;\n\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n status.modifiedXe += modifierResult.dx;\n status.modifiedYe += modifierResult.dy;\n\n status.i = animationFrame.request(interaction.boundInertiaFrame);\n }\n else {\n status.smoothEnd = true;\n status.xe = modifierResult.dx;\n status.ye = modifierResult.dy;\n\n status.sx = status.sy = 0;\n\n status.i = animationFrame.request(interaction.boundSmoothEndFrame);\n }\n});\n\nInteraction.signals.on('stop-active', function ({ interaction }) {\n const status = interaction.inertiaStatus;\n\n if (status.active) {\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n }\n});\n\nfunction calcInertia (interaction, status) {\n const inertiaOptions = interaction.target.options[interaction.prepared.name].inertia;\n const lambda = inertiaOptions.resistance;\n const inertiaDur = -Math.log(inertiaOptions.endSpeed / status.v0) / lambda;\n\n status.x0 = interaction.prevEvent.pageX;\n status.y0 = interaction.prevEvent.pageY;\n status.t0 = status.startEvent.timeStamp / 1000;\n status.sx = status.sy = 0;\n\n status.modifiedXe = status.xe = (status.vx0 - inertiaDur) / lambda;\n status.modifiedYe = status.ye = (status.vy0 - inertiaDur) / lambda;\n status.te = inertiaDur;\n\n status.lambda_v0 = lambda / status.v0;\n status.one_ve_v0 = 1 - inertiaOptions.endSpeed / status.v0;\n}\n\nfunction inertiaFrame () {\n updateInertiaCoords(this);\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n\n const status = this.inertiaStatus;\n const options = this.target.options[this.prepared.name].inertia;\n const lambda = options.resistance;\n const t = new Date().getTime() / 1000 - status.t0;\n\n if (t < status.te) {\n\n const progress = 1 - (Math.exp(-lambda * t) - status.lambda_v0) / status.one_ve_v0;\n\n if (status.modifiedXe === status.xe && status.modifiedYe === status.ye) {\n status.sx = status.xe * progress;\n status.sy = status.ye * progress;\n }\n else {\n const quadPoint = utils.getQuadraticCurvePoint(0, 0,\n status.xe,\n status.ye,\n status.modifiedXe,\n status.modifiedYe,\n progress);\n\n status.sx = quadPoint.x;\n status.sy = quadPoint.y;\n }\n\n this.doMove();\n\n status.i = animationFrame.request(this.boundInertiaFrame);\n }\n else {\n status.sx = status.modifiedXe;\n status.sy = status.modifiedYe;\n\n this.doMove();\n this.end(status.startEvent);\n status.active = false;\n this.simulation = null;\n }\n\n utils.copyCoords(this.prevCoords, this.curCoords);\n}\n\nfunction smoothEndFrame () {\n updateInertiaCoords(this);\n\n const status = this.inertiaStatus;\n const t = new Date().getTime() - status.t0;\n const duration = this.target.options[this.prepared.name].inertia.smoothEndDuration;\n\n if (t < duration) {\n status.sx = utils.easeOutQuad(t, 0, status.xe, duration);\n status.sy = utils.easeOutQuad(t, 0, status.ye, duration);\n\n this.pointerMove(status.startEvent, status.startEvent);\n\n status.i = animationFrame.request(this.boundSmoothEndFrame);\n }\n else {\n status.sx = status.xe;\n status.sy = status.ye;\n\n this.pointerMove(status.startEvent, status.startEvent);\n this.end(status.startEvent);\n\n status.smoothEnd =\n status.active = false;\n this.simulation = null;\n }\n}\n\nfunction updateInertiaCoords (interaction) {\n const status = interaction.inertiaStatus;\n\n // return if inertia isn't running\n if (!status.active) { return; }\n\n const pageUp = status.upCoords.page;\n const clientUp = status.upCoords.client;\n\n utils.setCoords(interaction.curCoords, [ {\n pageX : pageUp.x + status.sx,\n pageY : pageUp.y + status.sy,\n clientX: clientUp.x + status.sx,\n clientY: clientUp.y + status.sy,\n } ]);\n}\n","const browser = require('./utils/browser');\nconst events = require('./utils/events');\nconst utils = require('./utils');\nconst scope = require('./scope');\nconst Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\n\nconst globalEvents = {};\n\n/*\\\n * interact\n [ method ]\n *\n * The methods of this variable can be used to set elements as\n * interactables and also to change various default settings.\n *\n * Calling it as a function and passing an element or a valid CSS selector\n * string returns an Interactable object which has various methods to\n * configure it.\n *\n - element (Element | string) The HTML or SVG Element to interact with or CSS selector\n = (object) An @Interactable\n *\n > Usage\n | interact('#draggable').draggable(true);\n |\n | var rectables = interact('rect');\n | rectables\n | .gesturable(true)\n | .on('gesturemove', function (event) {\n | // ...\n | });\n\\*/\nfunction interact (element, options) {\n let interactable = scope.interactables.get(element, options);\n\n if (!interactable) {\n interactable = new Interactable(element, options);\n interactable.events.global = globalEvents;\n }\n\n return interactable;\n}\n\n/*\\\n * interact.isSet\n [ method ]\n *\n * Check if an element has been set\n - element (Element) The Element being searched for\n = (boolean) Indicates if the element or CSS selector was previously passed to interact\n\\*/\ninteract.isSet = function (element, options) {\n return scope.interactables.indexOfElement(element, options && options.context) !== -1;\n};\n\n/*\\\n * interact.on\n [ method ]\n *\n * Adds a global listener for an InteractEvent or adds a DOM event to\n * `document`\n *\n - type (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) interact\n\\*/\ninteract.on = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.on(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.on(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n // if it is an InteractEvent type, add listener to globalEvents\n if (utils.contains(Interactable.eventTypes, type)) {\n // if this type of event was never bound\n if (!globalEvents[type]) {\n globalEvents[type] = [listener];\n }\n else {\n globalEvents[type].push(listener);\n }\n }\n // If non InteractEvent type, addEventListener to document\n else {\n events.add(scope.document, type, listener, { options });\n }\n\n return interact;\n};\n\n/*\\\n * interact.off\n [ method ]\n *\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n - type (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) interact\n \\*/\ninteract.off = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.off(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.off(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n if (!utils.contains(Interactable.eventTypes, type)) {\n events.remove(scope.document, type, listener, options);\n }\n else {\n let index;\n\n if (type in globalEvents\n && (index = utils.indexOf(globalEvents[type], listener)) !== -1) {\n globalEvents[type].splice(index, 1);\n }\n }\n\n return interact;\n};\n\n/*\\\n * interact.debug\n [ method ]\n *\n * Returns an object which exposes internal data\n = (object) An object with properties that outline the current state and expose internal functions and variables\n\\*/\ninteract.debug = function () {\n return scope;\n};\n\n// expose the functions used to calculate multi-touch properties\ninteract.getPointerAverage = utils.pointerAverage;\ninteract.getTouchBBox = utils.touchBBox;\ninteract.getTouchDistance = utils.touchDistance;\ninteract.getTouchAngle = utils.touchAngle;\n\ninteract.getElementRect = utils.getElementRect;\ninteract.getElementClientRect = utils.getElementClientRect;\ninteract.matchesSelector = utils.matchesSelector;\ninteract.closest = utils.closest;\n\n/*\\\n * interact.supportsTouch\n [ method ]\n *\n = (boolean) Whether or not the browser supports touch input\n\\*/\ninteract.supportsTouch = function () {\n return browser.supportsTouch;\n};\n\n/*\\\n * interact.supportsPointerEvent\n [ method ]\n *\n = (boolean) Whether or not the browser supports PointerEvents\n\\*/\ninteract.supportsPointerEvent = function () {\n return browser.supportsPointerEvent;\n};\n\n/*\\\n * interact.stop\n [ method ]\n *\n * Cancels all interactions (end events are not fired)\n *\n - event (Event) An event on which to call preventDefault()\n = (object) interact\n\\*/\ninteract.stop = function (event) {\n for (let i = scope.interactions.length - 1; i >= 0; i--) {\n scope.interactions[i].stop(event);\n }\n\n return interact;\n};\n\n/*\\\n * interact.pointerMoveTolerance\n [ method ]\n * Returns or sets the distance the pointer must be moved before an action\n * sequence occurs. This also affects tolerance for tap events.\n *\n - newValue (number) #optional The movement from the start position must be greater than this value\n = (number | Interactable) The current setting or interact\n\\*/\ninteract.pointerMoveTolerance = function (newValue) {\n if (utils.is.number(newValue)) {\n Interaction.pointerMoveTolerance = newValue;\n\n return this;\n }\n\n return Interaction.pointerMoveTolerance;\n};\n\ninteract.addDocument = scope.addDocument;\ninteract.removeDocument = scope.removeDocument;\n\nscope.interact = interact;\n\nmodule.exports = interact;\n","const Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\nconst scope = require('./scope');\nconst is = require('./utils/is');\nconst events = require('./utils/events');\n\nconst { nodeContains, matchesSelector } = require('./utils/domUtils');\n\n/*\\\n * Interactable.preventDefault\n [ method ]\n *\n * Returns or sets whether to prevent the browser's default behaviour\n * in response to pointer events. Can be set to:\n * - `'always'` to always prevent\n * - `'never'` to never prevent\n * - `'auto'` to let interact.js try to determine what would be best\n *\n - newValue (string) #optional `true`, `false` or `'auto'`\n = (string | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.preventDefault = function (newValue) {\n if (/^(always|never|auto)$/.test(newValue)) {\n this.options.preventDefault = newValue;\n return this;\n }\n\n if (is.bool(newValue)) {\n this.options.preventDefault = newValue? 'always' : 'never';\n return this;\n }\n\n return this.options.preventDefault;\n};\n\nInteractable.prototype.checkAndPreventDefault = function (event) {\n const setting = this.options.preventDefault;\n\n if (setting === 'never') { return; }\n\n if (setting === 'always') {\n event.preventDefault();\n return;\n }\n\n // setting === 'auto'\n\n // don't preventDefault if the browser supports passiveEvents\n // CSS touch-action and user-selecct should be used instead\n if (events.supportsOptions) {\n return;\n }\n\n // don't preventDefault of pointerdown events\n if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) {\n return;\n }\n\n // don't preventDefault on editable elements\n if (is.element(event.target)\n && matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) {\n return;\n }\n\n event.preventDefault();\n};\n\nfunction onInteractionEvent ({ interaction, event }) {\n if (interaction.target) {\n interaction.target.checkAndPreventDefault(event);\n }\n}\n\nfor (const eventSignal of ['down', 'move', 'up', 'cancel']) {\n Interaction.signals.on(eventSignal, onInteractionEvent);\n}\n\n// prevent native HTML5 drag on interact.js target elements\nInteraction.docEvents.dragstart = function preventNativeDrag (event) {\n for (const interaction of scope.interactions) {\n\n if (interaction.element\n && (interaction.element === event.target\n || nodeContains(interaction.element, event.target))) {\n\n interaction.target.checkAndPreventDefault(event);\n return;\n }\n }\n};\n","const scope = require('./scope');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst iFinder = require('./utils/interactionFinder');\nconst pointerEvents = require('./pointerEvents/base');\n\nconst { window } = require('./utils/window');\n\nconst toString = Object.prototype.toString;\n\nif (!window.Array.isArray) {\n window.Array.isArray = function (obj) {\n return toString.call(obj) === '[object Array]';\n };\n}\n\nif (!String.prototype.trim) {\n String.prototype.trim = function () {\n return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n };\n}\n\n// http://www.quirksmode.org/dom/events/click.html\n// >Events leading to dblclick\n//\n// IE8 doesn't fire down event before dblclick.\n// This workaround tries to fire a tap and doubletap after dblclick\nfunction onIE8Dblclick (event) {\n const eventTarget = event.target;\n const interaction = iFinder.search(event, event.type, eventTarget);\n\n if (!interaction) { return; }\n\n if (interaction.prevTap\n && event.clientX === interaction.prevTap.clientX\n && event.clientY === interaction.prevTap.clientY\n && eventTarget === interaction.prevTap.target) {\n\n interaction.downTargets[0] = eventTarget;\n interaction.downTimes [0] = new Date().getTime();\n\n pointerEvents.fire({\n interaction,\n event,\n eventTarget,\n pointer: event,\n type: 'tap',\n });\n }\n}\n\nif (browser.isIE8) {\n const selectFix = function (event) {\n for (const interaction of scope.interactions) {\n if (interaction.interacting()) {\n interaction.target.checkAndPreventDefault(event);\n }\n }\n };\n\n const onDocIE8 = function onDocIE8 ({ doc, win }, signalName) {\n const eventMethod = signalName.indexOf('listen') === 0\n ? events.add : events.remove;\n\n // For IE's lack of Event#preventDefault\n eventMethod(doc, 'selectstart', selectFix);\n\n if (pointerEvents) {\n eventMethod(doc, 'dblclick', onIE8Dblclick);\n }\n };\n\n scope.signals.on('add-document' , onDocIE8);\n scope.signals.on('remove-document', onDocIE8);\n}\n\nmodule.exports = null;\n","const InteractEvent = require('../InteractEvent');\nconst Interaction = require('../Interaction');\nconst extend = require('../utils/extend');\n\nconst modifiers = {\n names: [],\n\n setOffsets: function (arg) {\n const { interaction, pageCoords: page } = arg;\n const { target, element, startOffset } = interaction;\n const rect = target.getRect(element);\n\n if (rect) {\n startOffset.left = page.x - rect.left;\n startOffset.top = page.y - rect.top;\n\n startOffset.right = rect.right - page.x;\n startOffset.bottom = rect.bottom - page.y;\n\n if (!('width' in rect)) { rect.width = rect.right - rect.left; }\n if (!('height' in rect)) { rect.height = rect.bottom - rect.top ; }\n }\n else {\n startOffset.left = startOffset.top = startOffset.right = startOffset.bottom = 0;\n }\n\n arg.rect = rect;\n arg.interactable = target;\n arg.element = element;\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n\n arg.options = target.options[interaction.prepared.name][modifierName];\n\n if (!arg.options) {\n continue;\n }\n\n interaction.modifierOffsets[modifierName] = modifiers[modifierName].setOffset(arg);\n }\n },\n\n setAll: function (arg) {\n const { interaction, statuses, preEnd, requireEndOnly } = arg;\n const coords = extend({}, arg.pageCoords);\n const result = {\n dx: 0,\n dy: 0,\n changed: false,\n locked: false,\n shouldMove: true,\n };\n\n for (const modifierName of modifiers.names) {\n const modifier = modifiers[modifierName];\n const options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!shouldDo(options, preEnd, requireEndOnly)) { continue; }\n\n arg.status = arg.status = statuses[modifierName];\n arg.options = options;\n arg.offset = arg.interaction.modifierOffsets[modifierName];\n\n modifier.set(arg);\n\n if (arg.status.locked) {\n coords.x += arg.status.dx;\n coords.y += arg.status.dy;\n\n result.dx += arg.status.dx;\n result.dy += arg.status.dy;\n\n result.locked = true;\n }\n }\n\n // a move should be fired if:\n // - there are no modifiers enabled,\n // - no modifiers are \"locked\" i.e. have changed the pointer's coordinates, or\n // - the locked coords have changed since the last pointer move\n result.shouldMove = !arg.status || !result.locked || arg.status.changed;\n\n return result;\n },\n\n resetStatuses: function (statuses) {\n for (const modifierName of modifiers.names) {\n const status = statuses[modifierName] || {};\n\n status.dx = status.dy = 0;\n status.modifiedX = status.modifiedY = NaN;\n status.locked = false;\n status.changed = true;\n\n statuses[modifierName] = status;\n }\n\n return statuses;\n },\n\n start: function ({ interaction }, signalName) {\n const arg = {\n interaction,\n pageCoords: (signalName === 'action-resume' ?\n interaction.curCoords : interaction.startCoords).page,\n startOffset: interaction.startOffset,\n statuses: interaction.modifierStatuses,\n preEnd: false,\n requireEndOnly: false,\n };\n\n modifiers.setOffsets(arg);\n modifiers.resetStatuses(arg.statuses);\n\n arg.pageCoords = extend({}, interaction.startCoords.page);\n interaction.modifierResult = modifiers.setAll(arg);\n },\n};\n\nInteraction.signals.on('new', function (interaction) {\n interaction.startOffset = { left: 0, right: 0, top: 0, bottom: 0 };\n interaction.modifierOffsets = {};\n interaction.modifierStatuses = modifiers.resetStatuses({});\n interaction.modifierResult = null;\n});\n\nInteraction.signals.on('action-start' , modifiers.start);\nInteraction.signals.on('action-resume', modifiers.start);\n\nInteraction.signals.on('before-action-move', function ({ interaction, preEnd, interactingBeforeMove }) {\n const modifierResult = modifiers.setAll({\n interaction,\n preEnd,\n pageCoords: interaction.curCoords.page,\n statuses: interaction.modifierStatuses,\n requireEndOnly: false,\n });\n\n // don't fire an action move if a modifier would keep the event in the same\n // cordinates as before\n if (!modifierResult.shouldMove && interactingBeforeMove) {\n interaction._dontFireMove = true;\n }\n\n interaction.modifierResult = modifierResult;\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n for (let i = 0; i < modifiers.names.length; i++) {\n const options = interaction.target.options[interaction.prepared.name][modifiers.names[i]];\n\n // if the endOnly option is true for any modifier\n if (shouldDo(options, true, true)) {\n // fire a move event at the modified coordinates\n interaction.doMove({ event, preEnd: true });\n break;\n }\n }\n});\n\nInteractEvent.signals.on('set-xy', function (arg) {\n const { iEvent, interaction } = arg;\n const modifierArg = extend({}, arg);\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n modifierArg.options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!modifierArg.options) {\n continue;\n }\n\n const modifier = modifiers[modifierName];\n\n modifierArg.status = interaction.modifierStatuses[modifierName];\n\n iEvent[modifierName] = modifier.modifyCoords(modifierArg);\n }\n});\n\nfunction shouldDo (options, preEnd, requireEndOnly) {\n return (options && options.enabled\n && (preEnd || !options.endOnly)\n && (!requireEndOnly || options.endOnly));\n}\n\nmodule.exports = modifiers;\n","const modifiers = require('./index');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst restrict = {\n defaults: {\n enabled : false,\n endOnly : false,\n restriction: null,\n elementRect: null,\n },\n\n setOffset: function ({ rect, startOffset, options }) {\n const elementRect = options && options.elementRect;\n const offset = {};\n\n if (rect && elementRect) {\n offset.left = startOffset.left - (rect.width * elementRect.left);\n offset.top = startOffset.top - (rect.height * elementRect.top);\n\n offset.right = startOffset.right - (rect.width * (1 - elementRect.right));\n offset.bottom = startOffset.bottom - (rect.height * (1 - elementRect.bottom));\n }\n else {\n offset.left = offset.top = offset.right = offset.bottom = 0;\n }\n\n return offset;\n },\n\n set: function ({ pageCoords, interaction, status, options }) {\n if (!options) { return status; }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n\n const restriction = getRestrictionRect(options.restriction, interaction, page);\n\n if (!restriction) { return status; }\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n const rect = restriction;\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n const offset = interaction.modifierOffsets.restrict;\n\n // object is assumed to have\n // x, y, width, height or\n // left, top, right, bottom\n if ('x' in restriction && 'y' in restriction) {\n modifiedX = Math.max(Math.min(rect.x + rect.width - offset.right , page.x), rect.x + offset.left);\n modifiedY = Math.max(Math.min(rect.y + rect.height - offset.bottom, page.y), rect.y + offset.top );\n }\n else {\n modifiedX = Math.max(Math.min(rect.right - offset.right , page.x), rect.left + offset.left);\n modifiedY = Math.max(Math.min(rect.bottom - offset.bottom, page.y), rect.top + offset.top );\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const elementRect = options && options.elementRect;\n\n if (options && options.enabled\n && !(phase === 'start' && elementRect && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n getRestrictionRect,\n};\n\nfunction getRestrictionRect (value, interaction, page) {\n if (utils.is.function(value)) {\n return utils.resolveRectLike(value, interaction.target, interaction.element, [page.x, page.y, interaction]);\n } else {\n return utils.resolveRectLike(value, interaction.target, interaction.element);\n }\n}\n\nmodifiers.restrict = restrict;\nmodifiers.names.push('restrict');\n\ndefaultOptions.perAction.restrict = restrict.defaults;\n\nmodule.exports = restrict;\n","// This module adds the options.resize.restrictEdges setting which sets min and\n// max for the top, left, bottom and right edges of the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictEdges: {\n// inner: { top: 200, left: 200, right: 400, bottom: 400 },\n// outer: { top: 0, left: 0, right: 600, bottom: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst { getRestrictionRect } = require('./restrict');\n\nconst noInner = { top: +Infinity, left: +Infinity, bottom: -Infinity, right: -Infinity };\nconst noOuter = { top: -Infinity, left: -Infinity, bottom: +Infinity, right: +Infinity };\n\nconst restrictEdges = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n offset: null,\n },\n\n setOffset: function ({ interaction, startOffset, options }) {\n if (!options) {\n return utils.extend({}, startOffset);\n }\n\n const offset = getRestrictionRect(options.offset, interaction, interaction.startCoords.page);\n\n if (offset) {\n return {\n top: startOffset.top + offset.y,\n left: startOffset.left + offset.x,\n bottom: startOffset.bottom + offset.y,\n right: startOffset.right + offset.x,\n };\n }\n\n return startOffset;\n },\n\n set: function ({ pageCoords, interaction, status, offset, options }) {\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n const inner = rectUtils.xywhToTlbr(getRestrictionRect(options.inner, interaction, page)) || noInner;\n const outer = rectUtils.xywhToTlbr(getRestrictionRect(options.outer, interaction, page)) || noOuter;\n\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n if (edges.top) {\n modifiedY = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top);\n }\n else if (edges.bottom) {\n modifiedY = Math.max(Math.min(outer.bottom - offset.bottom, page.y), inner.bottom - offset.bottom);\n }\n if (edges.left) {\n modifiedX = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left);\n }\n else if (edges.right) {\n modifiedX = Math.max(Math.min(outer.right - offset.right, page.x), inner.right - offset.right);\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n if (options && options.enabled\n && !(phase === 'start' && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n noInner,\n noOuter,\n getRestrictionRect,\n};\n\nmodifiers.restrictEdges = restrictEdges;\nmodifiers.names.push('restrictEdges');\n\ndefaultOptions.perAction.restrictEdges = restrictEdges.defaults;\nresize.defaults.restrictEdges = restrictEdges.defaults;\n\nmodule.exports = restrictEdges;\n","// This module adds the options.resize.restrictSize setting which sets min and\n// max width and height for the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictSize: {\n// min: { width: -600, height: -600 },\n// max: { width: 600, height: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst restrictEdges = require('./restrictEdges');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst noMin = { width: -Infinity, height: -Infinity };\nconst noMax = { width: +Infinity, height: +Infinity };\n\nconst restrictSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n },\n\n setOffset: function ({ interaction }) {\n return interaction.startOffset;\n },\n\n set: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const rect = rectUtils.xywhToTlbr(interaction.resizeRects.inverted);\n\n const minSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.min, interaction)) || noMin;\n const maxSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.max, interaction)) || noMax;\n\n arg.options = {\n enabled: options.enabled,\n endOnly: options.endOnly,\n inner: utils.extend({}, restrictEdges.noInner),\n outer: utils.extend({}, restrictEdges.noOuter),\n };\n\n if (edges.top) {\n arg.options.inner.top = rect.bottom - minSize.height;\n arg.options.outer.top = rect.bottom - maxSize.height;\n }\n else if (edges.bottom) {\n arg.options.inner.bottom = rect.top + minSize.height;\n arg.options.outer.bottom = rect.top + maxSize.height;\n }\n if (edges.left) {\n arg.options.inner.left = rect.right - minSize.width;\n arg.options.outer.left = rect.right - maxSize.width;\n }\n else if (edges.right) {\n arg.options.inner.right = rect.left + minSize.width;\n arg.options.outer.right = rect.left + maxSize.width;\n }\n\n restrictEdges.set(arg);\n },\n\n modifyCoords: restrictEdges.modifyCoords,\n};\n\nmodifiers.restrictSize = restrictSize;\nmodifiers.names.push('restrictSize');\n\ndefaultOptions.perAction.restrictSize = restrictSize.defaults;\nresize.defaults.restrictSize = restrictSize.defaults;\n\nmodule.exports = restrictSize;\n","const modifiers = require('./index');\nconst interact = require('../interact');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst snap = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n\n relativePoints: null,\n },\n\n setOffset: function ({ interaction, interactable, element, rect, startOffset, options }) {\n const offsets = [];\n const optionsOrigin = utils.rectToXY(utils.resolveRectLike(options.origin));\n const origin = optionsOrigin || utils.getOriginXY(interactable, element, interaction.prepared.name);\n options = options || interactable.options[interaction.prepared.name].snap || {};\n\n let snapOffset;\n\n if (options.offset === 'startCoords') {\n snapOffset = {\n x: interaction.startCoords.page.x - origin.x,\n y: interaction.startCoords.page.y - origin.y,\n };\n }\n else {\n const offsetRect = utils.resolveRectLike(options.offset, interactable, element, [interaction]);\n\n snapOffset = utils.rectToXY(offsetRect) || { x: 0, y: 0 };\n }\n\n if (rect && options.relativePoints && options.relativePoints.length) {\n for (const { x: relativeX, y: relativeY } of options.relativePoints) {\n offsets.push({\n x: startOffset.left - (rect.width * relativeX) + snapOffset.x,\n y: startOffset.top - (rect.height * relativeY) + snapOffset.y,\n });\n }\n }\n else {\n offsets.push(snapOffset);\n }\n\n return offsets;\n },\n\n set: function ({ interaction, pageCoords, status, options, offset: offsets }) {\n const targets = [];\n let target;\n let page;\n let i;\n\n if (status.useStatusXY) {\n page = { x: status.x, y: status.y };\n }\n else {\n const origin = utils.getOriginXY(interaction.target, interaction.element, interaction.prepared.name);\n\n page = utils.extend({}, pageCoords);\n\n page.x -= origin.x;\n page.y -= origin.y;\n }\n\n status.realX = page.x;\n status.realY = page.y;\n\n let len = options.targets? options.targets.length : 0;\n\n for (const { x: offsetX, y: offsetY } of offsets) {\n const relativeX = page.x - offsetX;\n const relativeY = page.y - offsetY;\n\n for (const snapTarget of options.targets) {\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n targets.push({\n x: utils.is.number(target.x) ? (target.x + offsetX) : relativeX,\n y: utils.is.number(target.y) ? (target.y + offsetY) : relativeY,\n\n range: utils.is.number(target.range)? target.range: options.range,\n });\n }\n }\n\n const closest = {\n target: null,\n inRange: false,\n distance: 0,\n range: 0,\n dx: 0,\n dy: 0,\n };\n\n for (i = 0, len = targets.length; i < len; i++) {\n target = targets[i];\n\n const range = target.range;\n const dx = target.x - page.x;\n const dy = target.y - page.y;\n const distance = utils.hypot(dx, dy);\n let inRange = distance <= range;\n\n // Infinite targets count as being out of range\n // compared to non infinite ones that are in range\n if (range === Infinity && closest.inRange && closest.range !== Infinity) {\n inRange = false;\n }\n\n if (!closest.target || (inRange\n // is the closest target in range?\n ? (closest.inRange && range !== Infinity\n // the pointer is relatively deeper in this target\n ? distance / range < closest.distance / closest.range\n // this target has Infinite range and the closest doesn't\n : (range === Infinity && closest.range !== Infinity)\n // OR this target is closer that the previous closest\n || distance < closest.distance)\n // The other is not in range and the pointer is closer to this target\n : (!closest.inRange && distance < closest.distance))) {\n\n closest.target = target;\n closest.distance = distance;\n closest.range = range;\n closest.inRange = inRange;\n closest.dx = dx;\n closest.dy = dy;\n\n status.range = range;\n }\n }\n\n let snapChanged;\n\n if (closest.target) {\n snapChanged = (status.modifiedX !== closest.target.x || status.modifiedY !== closest.target.y);\n\n status.modifiedX = closest.target.x;\n status.modifiedY = closest.target.y;\n }\n else {\n snapChanged = true;\n\n status.modifiedX = NaN;\n status.modifiedY = NaN;\n }\n\n status.dx = closest.dx;\n status.dy = closest.dy;\n\n status.changed = (snapChanged || (closest.inRange && !status.locked));\n status.locked = closest.inRange;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const relativePoints = options && options.relativePoints;\n\n if (options && options.enabled\n && !(phase === 'start' && relativePoints && relativePoints.length)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n }\n\n return {\n range : status.range,\n locked : status.locked,\n x : status.modifiedX,\n y : status.modifiedY,\n realX : status.realX,\n realY : status.realY,\n dx : status.dx,\n dy : status.dy,\n };\n }\n },\n};\n\ninteract.createSnapGrid = function (grid) {\n return function (x, y) {\n const limits = grid.limits || {\n left : -Infinity,\n right : Infinity,\n top : -Infinity,\n bottom: Infinity,\n };\n let offsetX = 0;\n let offsetY = 0;\n\n if (utils.is.object(grid.offset)) {\n offsetX = grid.offset.x;\n offsetY = grid.offset.y;\n }\n\n const gridx = Math.round((x - offsetX) / grid.x);\n const gridy = Math.round((y - offsetY) / grid.y);\n\n const newX = Math.max(limits.left, Math.min(limits.right , gridx * grid.x + offsetX));\n const newY = Math.max(limits.top , Math.min(limits.bottom, gridy * grid.y + offsetY));\n\n return {\n x: newX,\n y: newY,\n range: grid.range,\n };\n };\n};\n\nmodifiers.snap = snap;\nmodifiers.names.push('snap');\n\ndefaultOptions.perAction.snap = snap.defaults;\n\nmodule.exports = snap;\n","// This module allows snapping of the size of targets during resize\n// interactions.\n\nconst modifiers = require('./index');\nconst snap = require('./snap');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\nconst utils = require('../utils/');\n\nconst snapSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n },\n\n setOffset: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.edges;\n\n if (!edges) { return; }\n\n arg.options = {\n relativePoints: [{\n x: edges.left? 0 : 1,\n y: edges.top ? 0 : 1,\n }],\n origin: { x: 0, y: 0 },\n offset: 'self',\n range: options.range,\n };\n\n const offsets = snap.setOffset(arg);\n arg.options = options;\n\n return offsets;\n },\n\n set: function (arg) {\n const { interaction, options, offset, pageCoords } = arg;\n const page = utils.extend({}, pageCoords);\n const relativeX = page.x - offset[0].x;\n const relativeY = page.y - offset[0].y;\n\n arg.options = utils.extend({}, options);\n arg.options.targets = [];\n\n for (const snapTarget of options.targets) {\n let target;\n\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n if ('width' in target && 'height' in target) {\n target.x = target.width;\n target.y = target.height;\n }\n\n arg.options.targets.push(target);\n }\n\n snap.set(arg);\n },\n\n modifyCoords: function (arg) {\n const { options } = arg;\n\n arg.options = utils.extend({}, options);\n arg.options.enabled = options.enabled;\n arg.options.relativePoints = [null];\n\n snap.modifyCoords(arg);\n },\n};\n\nmodifiers.snapSize = snapSize;\nmodifiers.names.push('snapSize');\n\ndefaultOptions.perAction.snapSize = snapSize.defaults;\nresize.defaults.snapSize = snapSize.defaults;\n\nmodule.exports = snapSize;\n","const pointerUtils = require('../utils/pointerUtils');\n\nmodule.exports = class PointerEvent {\n constructor (type, pointer, event, eventTarget, interaction) {\n pointerUtils.pointerExtend(this, event);\n\n if (event !== pointer) {\n pointerUtils.pointerExtend(this, pointer);\n }\n\n this.interaction = interaction;\n\n this.timeStamp = new Date().getTime();\n this.originalEvent = event;\n this.type = type;\n this.pointerId = pointerUtils.getPointerId(pointer);\n this.pointerType = pointerUtils.getPointerType(pointer);\n this.target = eventTarget;\n this.currentTarget = null;\n\n if (type === 'tap') {\n const pointerIndex = interaction.getPointerIndex(pointer);\n this.dt = this.timeStamp - interaction.downTimes[pointerIndex];\n\n const interval = this.timeStamp - interaction.tapTime;\n\n this.double = !!(interaction.prevTap\n && interaction.prevTap.type !== 'doubletap'\n && interaction.prevTap.target === this.target\n && interval < 500);\n }\n else if (type === 'doubletap') {\n this.dt = pointer.timeStamp - interaction.tapTime;\n }\n }\n\n subtractOrigin ({ x: originX, y: originY }) {\n this.pageX -= originX;\n this.pageY -= originY;\n this.clientX -= originX;\n this.clientY -= originY;\n\n return this;\n }\n\n addOrigin ({ x: originX, y: originY }) {\n this.pageX += originX;\n this.pageY += originY;\n this.clientX += originX;\n this.clientY += originY;\n\n return this;\n }\n\n preventDefault () {\n this.originalEvent.preventDefault();\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n};\n","const PointerEvent = require('./PointerEvent');\nconst Interaction = require('../Interaction');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst defaults = require('../defaultOptions');\nconst signals = require('../utils/Signals').new();\nconst { filter } = require('../utils/arr');\n\nconst simpleSignals = [ 'down', 'up', 'cancel' ];\nconst simpleEvents = [ 'down', 'up', 'cancel' ];\n\nconst pointerEvents = {\n PointerEvent,\n fire,\n collectEventTargets,\n signals,\n defaults: {\n holdDuration: 600,\n ignoreFrom : null,\n allowFrom : null,\n origin : { x: 0, y: 0 },\n },\n types: [\n 'down',\n 'move',\n 'up',\n 'cancel',\n 'tap',\n 'doubletap',\n 'hold',\n ],\n};\n\nfunction fire (arg) {\n const {\n interaction, pointer, event, eventTarget,\n type = arg.pointerEvent.type,\n targets = collectEventTargets(arg),\n pointerEvent = new PointerEvent(type, pointer, event, eventTarget, interaction),\n } = arg;\n\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n targets,\n type,\n pointerEvent,\n };\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n\n for (const prop in target.props || {}) {\n pointerEvent[prop] = target.props[prop];\n }\n\n const origin = utils.getOriginXY(target.eventable, target.element);\n\n pointerEvent.subtractOrigin(origin);\n pointerEvent.eventable = target.eventable;\n pointerEvent.currentTarget = target.element;\n\n target.eventable.fire(pointerEvent);\n\n pointerEvent.addOrigin(origin);\n\n if (pointerEvent.immediatePropagationStopped\n || (pointerEvent.propagationStopped\n && (i + 1) < targets.length && targets[i + 1].element !== pointerEvent.currentTarget)) {\n break;\n }\n }\n\n signals.fire('fired', signalArg);\n\n if (type === 'tap') {\n // if pointerEvent should make a double tap, create and fire a doubletap\n // PointerEvent and use that as the prevTap\n const prevTap = pointerEvent.double\n ? fire({\n interaction, pointer, event, eventTarget,\n type: 'doubletap',\n })\n : pointerEvent;\n\n interaction.prevTap = prevTap;\n interaction.tapTime = prevTap.timeStamp;\n }\n\n return pointerEvent;\n}\n\nfunction collectEventTargets ({ interaction, pointer, event, eventTarget, type }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n // do not fire a tap event if the pointer was moved before being lifted\n if (type === 'tap' && (interaction.pointerWasMoved\n // or if the pointerup target is different to the pointerdown target\n || !(interaction.downTargets[pointerIndex] && interaction.downTargets[pointerIndex] === eventTarget))) {\n return [];\n }\n\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n path,\n targets: [],\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (type === 'hold') {\n signalArg.targets = filter(signalArg.targets, target =>\n target.eventable.options.holdDuration === interaction.holdTimers[pointerIndex].duration);\n }\n\n return signalArg.targets;\n}\n\nInteraction.signals.on('update-pointer-down', function ({ interaction, pointerIndex }) {\n interaction.holdTimers[pointerIndex] = { duration: Infinity, timeout: null };\n});\n\nInteraction.signals.on('remove-pointer', function ({ interaction, pointerIndex }) {\n interaction.holdTimers.splice(pointerIndex, 1);\n});\n\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget, duplicateMove }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n if (!duplicateMove && (!interaction.pointerIsDown || interaction.pointerWasMoved)) {\n if (interaction.pointerIsDown) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n\n fire({\n interaction, pointer, event, eventTarget,\n type: 'move',\n });\n }\n});\n\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget, pointerIndex }) {\n // copy event to be used in timeout for IE8\n const eventCopy = browser.isIE8? utils.extend({}, event) : event;\n\n const timer = interaction.holdTimers[pointerIndex];\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'hold',\n targets: [],\n path,\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (!signalArg.targets.length) { return; }\n\n let minDuration = Infinity;\n\n for (let i = 0; i < signalArg.targets.length; i++) {\n const target = signalArg.targets[i];\n const holdDuration = target.eventable.options.holdDuration;\n\n if (holdDuration < minDuration) {\n minDuration = holdDuration;\n }\n }\n\n timer.duration = minDuration;\n timer.timeout = setTimeout(function () {\n fire({\n interaction,\n eventTarget,\n pointer: browser.isIE8? eventCopy : pointer,\n event: eventCopy,\n type: 'hold',\n });\n }, minDuration);\n});\n\nInteraction.signals.on('up', ({ interaction, pointer, event, eventTarget }) => {\n if (!interaction.pointerWasMoved) {\n fire({ interaction, eventTarget, pointer, event, type: 'tap' });\n }\n});\n\n['up', 'cancel'].forEach(function (signalName) {\n Interaction.signals.on(signalName, function ({ interaction, pointerIndex }) {\n if (interaction.holdTimers[pointerIndex]) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n });\n});\n\nfunction createSignalListener (type) {\n return function ({ interaction, pointer, event, eventTarget }) {\n fire({ interaction, eventTarget, pointer, event, type });\n };\n}\n\nfor (let i = 0; i < simpleSignals.length; i++) {\n Interaction.signals.on(simpleSignals[i], createSignalListener(simpleEvents[i]));\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.prevTap = null; // the most recent tap event on this interaction\n interaction.tapTime = 0; // time of the most recent tap event\n interaction.holdTimers = []; // [{ duration, timeout }]\n});\n\ndefaults.pointerEvents = pointerEvents.defaults;\nmodule.exports = pointerEvents;\n","const pointerEvents = require('./base');\nconst Interaction = require('../Interaction');\n\npointerEvents.signals.on('new', onNew);\npointerEvents.signals.on('fired', onFired);\n\nfor (const signal of ['move', 'up', 'cancel', 'endall']) {\n Interaction.signals.on(signal, endHoldRepeat);\n}\n\nfunction onNew ({ pointerEvent }) {\n if (pointerEvent.type !== 'hold') { return; }\n\n pointerEvent.count = (pointerEvent.count || 0) + 1;\n}\n\nfunction onFired ({ interaction, pointerEvent, eventTarget, targets }) {\n if (pointerEvent.type !== 'hold' || !targets.length) { return; }\n\n // get the repeat interval from the first eventable\n const interval = targets[0].eventable.options.holdRepeatInterval;\n\n // don't repeat if the interval is 0 or less\n if (interval <= 0) { return; }\n\n // set a timeout to fire the holdrepeat event\n interaction.holdIntervalHandle = setTimeout(function () {\n pointerEvents.fire({\n interaction,\n eventTarget,\n type: 'hold',\n pointer: pointerEvent,\n event: pointerEvent,\n });\n }, interval);\n}\n\nfunction endHoldRepeat ({ interaction }) {\n // set the interaction's holdStopTime property\n // to stop further holdRepeat events\n if (interaction.holdIntervalHandle) {\n clearInterval(interaction.holdIntervalHandle);\n interaction.holdIntervalHandle = null;\n }\n}\n\n// don't repeat by default\npointerEvents.defaults.holdRepeatInterval = 0;\npointerEvents.types.push('holdrepeat');\n\nmodule.exports = {\n onNew,\n onFired,\n endHoldRepeat,\n};\n","const pointerEvents = require('./base');\nconst Interactable = require('../Interactable');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\nconst scope = require('../scope');\nconst extend = require('../utils/extend');\nconst { merge } = require('../utils/arr');\n\npointerEvents.signals.on('collect-targets', function ({ targets, element, type, eventTarget }) {\n function collectSelectors (interactable, selector, context) {\n const els = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && is.element(element)\n && domUtils.matchesSelector(element, selector, els)\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n const interactable = scope.interactables.get(element);\n\n if (interactable) {\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n scope.interactables.forEachSelector(collectSelectors, element);\n});\n\nInteractable.signals.on('new', function ({ interactable }) {\n interactable.events.getRect = function (element) {\n return interactable.getRect(element);\n };\n});\n\nInteractable.signals.on('set', function ({ interactable, options }) {\n extend(interactable.events.options, pointerEvents.defaults);\n extend(interactable.events.options, options);\n});\n\nmerge(Interactable.eventTypes, pointerEvents.types);\n\nInteractable.prototype.pointerEvents = function (options) {\n extend(this.events.options, options);\n\n return this;\n};\n\nconst __backCompatOption = Interactable.prototype._backCompatOption;\n\nInteractable.prototype._backCompatOption = function (optionName, newValue) {\n const ret = __backCompatOption.call(this, optionName, newValue);\n\n if (ret === this) {\n this.events.options[optionName] = newValue;\n }\n\n return ret;\n};\n\nInteractable.settingsMethods.push('pointerEvents');\n","const utils = require('./utils');\nconst events = require('./utils/events');\nconst signals = require('./utils/Signals').new();\n\nconst scope = {\n signals,\n events,\n utils,\n\n // main document\n document: require('./utils/domObjects').document,\n // all documents being listened to\n documents: [],\n\n addDocument: function (doc, win) {\n // do nothing if document is already known\n if (utils.contains(scope.documents, doc)) { return false; }\n\n win = win || scope.getWindow(doc);\n\n scope.documents.push(doc);\n events.documents.push(doc);\n\n // don't add an unload event for the main document\n // so that the page may be cached in browser history\n if (doc !== scope.document) {\n events.add(win, 'unload', scope.onWindowUnload);\n }\n\n signals.fire('add-document', { doc, win });\n },\n\n removeDocument: function (doc, win) {\n const index = utils.indexOf(scope.documents, doc);\n\n win = win || scope.getWindow(doc);\n\n events.remove(win, 'unload', scope.onWindowUnload);\n\n scope.documents.splice(index, 1);\n events.documents.splice(index, 1);\n\n signals.fire('remove-document', { win, doc });\n },\n\n onWindowUnload: function () {\n scope.removeDocument(this.document, this);\n },\n};\n\nmodule.exports = scope;\n","const { indexOf } = require('./arr');\n\nclass Signals {\n constructor () {\n this.listeners = {\n // signalName: [listeners],\n };\n }\n\n on (name, listener) {\n if (!this.listeners[name]) {\n this.listeners[name] = [listener];\n return;\n }\n\n this.listeners[name].push(listener);\n }\n\n off (name, listener) {\n if (!this.listeners[name]) { return; }\n\n const index = indexOf(this.listeners[name], listener);\n\n if (index !== -1) {\n this.listeners[name].splice(index, 1);\n }\n }\n\n fire (name, arg) {\n const targetListeners = this.listeners[name];\n\n if (!targetListeners) { return; }\n\n for (let i = 0; i < targetListeners.length; i++) {\n if (targetListeners[i](arg, name) === false) {\n return;\n }\n }\n }\n}\n\nSignals.new = function () {\n return new Signals();\n};\n\nmodule.exports = Signals;\n","function indexOf (array, target) {\n for (let i = 0, len = array.length; i < len; i++) {\n if (array[i] === target) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction contains (array, target) {\n return indexOf(array, target) !== -1;\n}\n\nfunction merge (target, source) {\n for (let i = 0; i < source.length; i++) {\n target.push(source[i]);\n }\n\n return target;\n}\n\nfunction filter (array, test) {\n const result = [];\n\n for (let i = 0; i < array.length; i++) {\n if (test(array[i])) {\n result.push(array[i]);\n }\n }\n\n return result;\n}\n\nmodule.exports = {\n indexOf,\n contains,\n merge,\n filter,\n};\n","const { window } = require('./window');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst Element = domObjects.Element;\nconst navigator = window.navigator;\n\nconst browser = {\n // Does the browser support touch input?\n supportsTouch: !!(('ontouchstart' in window) || is.function(window.DocumentTouch)\n && domObjects.document instanceof window.DocumentTouch),\n\n // Does the browser support PointerEvents\n supportsPointerEvent: !!domObjects.PointerEvent,\n\n isIE8: ('attachEvent' in window) && !('addEventListener' in window),\n\n // Opera Mobile must be handled differently\n isOperaMobile: (navigator.appName === 'Opera'\n && browser.supportsTouch\n && navigator.userAgent.match('Presto')),\n\n // scrolling doesn't change the result of getClientRects on iOS 7\n isIOS7: (/iP(hone|od|ad)/.test(navigator.platform)\n && /OS 7[^\\d]/.test(navigator.appVersion)),\n\n isIe9OrOlder: /MSIE (8|9)/.test(navigator.userAgent),\n\n // prefix matchesSelector\n prefixedMatchesSelector: 'matches' in Element.prototype\n ? 'matches': 'webkitMatchesSelector' in Element.prototype\n ? 'webkitMatchesSelector': 'mozMatchesSelector' in Element.prototype\n ? 'mozMatchesSelector': 'oMatchesSelector' in Element.prototype\n ? 'oMatchesSelector': 'msMatchesSelector',\n\n useMatchesSelectorPolyfill: false,\n\n pEventTypes: (domObjects.PointerEvent\n ? (domObjects.PointerEvent === window.MSPointerEvent\n ? {\n up: 'MSPointerUp',\n down: 'MSPointerDown',\n over: 'mouseover',\n out: 'mouseout',\n move: 'MSPointerMove',\n cancel: 'MSPointerCancel',\n }\n : {\n up: 'pointerup',\n down: 'pointerdown',\n over: 'pointerover',\n out: 'pointerout',\n move: 'pointermove',\n cancel: 'pointercancel',\n })\n : null),\n\n // because Webkit and Opera still use 'mousewheel' event type\n wheelEvent: 'onmousewheel' in domObjects.document? 'mousewheel': 'wheel',\n\n};\n\nbrowser.useMatchesSelectorPolyfill = !is.function(Element.prototype[browser.prefixedMatchesSelector]);\n\nmodule.exports = browser;\n","const domObjects = {};\nconst win = require('./window').window;\n\nfunction blank () {}\n\ndomObjects.document = win.document;\ndomObjects.DocumentFragment = win.DocumentFragment || blank;\ndomObjects.SVGElement = win.SVGElement || blank;\ndomObjects.SVGSVGElement = win.SVGSVGElement || blank;\ndomObjects.SVGElementInstance = win.SVGElementInstance || blank;\ndomObjects.Element = win.Element || blank;\ndomObjects.HTMLElement = win.HTMLElement || domObjects.Element;\n\ndomObjects.Event = win.Event;\ndomObjects.Touch = win.Touch || blank;\ndomObjects.PointerEvent = (win.PointerEvent || win.MSPointerEvent);\n\nmodule.exports = domObjects;\n","const win = require('./window');\nconst browser = require('./browser');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst domUtils = {\n nodeContains: function (parent, child) {\n while (child) {\n if (child === parent) {\n return true;\n }\n\n child = child.parentNode;\n }\n\n return false;\n },\n\n closest: function (element, selector) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) { return element; }\n\n element = domUtils.parentNode(element);\n }\n\n return null;\n },\n\n parentNode: function (node) {\n let parent = node.parentNode;\n\n if (is.docFrag(parent)) {\n // skip past #shado-root fragments\n while ((parent = parent.host) && is.docFrag(parent)) {\n continue;\n }\n\n return parent;\n }\n\n return parent;\n },\n\n // taken from http://tanalin.com/en/blog/2012/12/matches-selector-ie8/ and modified\n matchesSelectorPolyfill: browser.useMatchesSelectorPolyfill\n ? function (element, selector, elems) {\n elems = elems || element.parentNode.querySelectorAll(selector);\n\n for (let i = 0, len = elems.length; i < len; i++) {\n if (elems[i] === element) {\n return true;\n }\n }\n\n return false;\n }\n : null,\n\n matchesSelector: function (element, selector, nodeList) {\n if (browser.useMatchesSelectorPolyfill) {\n return domUtils.matchesSelectorPolyfill(element, selector, nodeList);\n }\n\n // remove /deep/ from selectors if shadowDOM polyfill is used\n if (win.window !== win.realWindow) {\n selector = selector.replace(/\\/deep\\//g, ' ');\n }\n\n return element[browser.prefixedMatchesSelector](selector);\n },\n\n // Test for the element that's \"above\" all other qualifiers\n indexOfDeepestElement: function (elements) {\n let deepestZoneParents = [];\n let dropzoneParents = [];\n let dropzone;\n let deepestZone = elements[0];\n let index = deepestZone? 0: -1;\n let parent;\n let child;\n let i;\n let n;\n\n for (i = 1; i < elements.length; i++) {\n dropzone = elements[i];\n\n // an element might belong to multiple selector dropzones\n if (!dropzone || dropzone === deepestZone) {\n continue;\n }\n\n if (!deepestZone) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n // check if the deepest or current are document.documentElement or document.rootElement\n // - if the current dropzone is, do nothing and continue\n if (dropzone.parentNode === dropzone.ownerDocument) {\n continue;\n }\n // - if deepest is, update with the current dropzone and continue to next\n else if (deepestZone.parentNode === dropzone.ownerDocument) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n if (!deepestZoneParents.length) {\n parent = deepestZone;\n while (parent.parentNode && parent.parentNode !== parent.ownerDocument) {\n deepestZoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n }\n\n // if this element is an svg element and the current deepest is\n // an HTMLElement\n if (deepestZone instanceof domObjects.HTMLElement\n && dropzone instanceof domObjects.SVGElement\n && !(dropzone instanceof domObjects.SVGSVGElement)) {\n\n if (dropzone === deepestZone.parentNode) {\n continue;\n }\n\n parent = dropzone.ownerSVGElement;\n }\n else {\n parent = dropzone;\n }\n\n dropzoneParents = [];\n\n while (parent.parentNode !== parent.ownerDocument) {\n dropzoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n\n n = 0;\n\n // get (position of last common ancestor) + 1\n while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) {\n n++;\n }\n\n const parents = [\n dropzoneParents[n - 1],\n dropzoneParents[n],\n deepestZoneParents[n],\n ];\n\n child = parents[0].lastChild;\n\n while (child) {\n if (child === parents[1]) {\n deepestZone = dropzone;\n index = i;\n deepestZoneParents = [];\n\n break;\n }\n else if (child === parents[2]) {\n break;\n }\n\n child = child.previousSibling;\n }\n }\n\n return index;\n },\n\n matchesUpTo: function (element, selector, limit) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) {\n return true;\n }\n\n element = domUtils.parentNode(element);\n\n if (element === limit) {\n return domUtils.matchesSelector(element, selector);\n }\n }\n\n return false;\n },\n\n getActualElement: function (element) {\n return (element instanceof domObjects.SVGElementInstance\n ? element.correspondingUseElement\n : element);\n },\n\n getScrollXY: function (relevantWindow) {\n relevantWindow = relevantWindow || win.window;\n return {\n x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft,\n y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop,\n };\n },\n\n getElementClientRect: function (element) {\n const clientRect = (element instanceof domObjects.SVGElement\n ? element.getBoundingClientRect()\n : element.getClientRects()[0]);\n\n return clientRect && {\n left : clientRect.left,\n right : clientRect.right,\n top : clientRect.top,\n bottom: clientRect.bottom,\n width : clientRect.width || clientRect.right - clientRect.left,\n height: clientRect.height || clientRect.bottom - clientRect.top,\n };\n },\n\n getElementRect: function (element) {\n const clientRect = domUtils.getElementClientRect(element);\n\n if (!browser.isIOS7 && clientRect) {\n const scroll = domUtils.getScrollXY(win.getWindow(element));\n\n clientRect.left += scroll.x;\n clientRect.right += scroll.x;\n clientRect.top += scroll.y;\n clientRect.bottom += scroll.y;\n }\n\n return clientRect;\n },\n\n getPath: function (element) {\n const path = [];\n\n while (element) {\n path.push(element);\n element = domUtils.parentNode(element);\n }\n\n return path;\n },\n\n trySelector: value => {\n if (!is.string(value)) { return false; }\n\n // an exception will be raised if it is invalid\n domObjects.document.querySelector(value);\n return true;\n },\n};\n\nmodule.exports = domUtils;\n","const is = require('./is');\nconst domUtils = require('./domUtils');\nconst pExtend = require('./pointerExtend');\n\nconst { window, getWindow } = require('./window');\nconst { indexOf, contains } = require('./arr');\n\nconst useAttachEvent = ('attachEvent' in window) && !('addEventListener' in window);\nconst addEvent = useAttachEvent? 'attachEvent': 'addEventListener';\nconst removeEvent = useAttachEvent? 'detachEvent': 'removeEventListener';\nconst on = useAttachEvent? 'on': '';\n\nconst elements = [];\nconst targets = [];\nconst attachedListeners = [];\n\n// {\n// type: {\n// selectors: ['selector', ...],\n// contexts : [document, ...],\n// listeners: [[listener, capture, passive], ...]\n// }\n// }\nconst delegatedEvents = {};\n\nconst documents = [];\n\nconst supportsOptions = !useAttachEvent && (() => {\n let supported = false;\n\n window.document.createElement('div').addEventListener('test', null, {\n get capture () { supported = true; },\n });\n\n return supported;\n})();\n\nfunction add (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n let elementIndex = indexOf(elements, element);\n let target = targets[elementIndex];\n\n if (!target) {\n target = {\n events: {},\n typeCount: 0,\n };\n\n elementIndex = elements.push(element) - 1;\n targets.push(target);\n\n attachedListeners.push(useAttachEvent\n ? {\n supplied: [],\n wrapped : [],\n useCount: [],\n }\n : null);\n }\n\n if (!target.events[type]) {\n target.events[type] = [];\n target.typeCount++;\n }\n\n if (!contains(target.events[type], listener)) {\n let ret;\n\n if (useAttachEvent) {\n const { supplied, wrapped, useCount } = attachedListeners[elementIndex];\n const listenerIndex = indexOf(supplied, listener);\n\n const wrappedListener = wrapped[listenerIndex] || function (event) {\n if (!event.immediatePropagationStopped) {\n event.target = event.srcElement;\n event.currentTarget = element;\n\n event.preventDefault = event.preventDefault || preventDef;\n event.stopPropagation = event.stopPropagation || stopProp;\n event.stopImmediatePropagation = event.stopImmediatePropagation || stopImmProp;\n\n if (/mouse|click/.test(event.type)) {\n event.pageX = event.clientX + getWindow(element).document.documentElement.scrollLeft;\n event.pageY = event.clientY + getWindow(element).document.documentElement.scrollTop;\n }\n\n listener(event);\n }\n };\n\n ret = element[addEvent](on + type, wrappedListener, !!options.capture);\n\n if (listenerIndex === -1) {\n supplied.push(listener);\n wrapped.push(wrappedListener);\n useCount.push(1);\n }\n else {\n useCount[listenerIndex]++;\n }\n }\n else {\n ret = element[addEvent](type, listener, supportsOptions? options : !!options.capture);\n }\n target.events[type].push(listener);\n\n return ret;\n }\n}\n\nfunction remove (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const elementIndex = indexOf(elements, element);\n const target = targets[elementIndex];\n\n if (!target || !target.events) {\n return;\n }\n\n let wrappedListener = listener;\n let listeners;\n let listenerIndex;\n\n if (useAttachEvent) {\n listeners = attachedListeners[elementIndex];\n listenerIndex = indexOf(listeners.supplied, listener);\n wrappedListener = listeners.wrapped[listenerIndex];\n }\n\n if (type === 'all') {\n for (type in target.events) {\n if (target.events.hasOwnProperty(type)) {\n remove(element, type, 'all');\n }\n }\n return;\n }\n\n if (target.events[type]) {\n const len = target.events[type].length;\n\n if (listener === 'all') {\n for (let i = 0; i < len; i++) {\n remove(element, type, target.events[type][i], options);\n }\n return;\n }\n else {\n for (let i = 0; i < len; i++) {\n if (target.events[type][i] === listener) {\n element[removeEvent](on + type, wrappedListener, supportsOptions? options : !!options.capture);\n target.events[type].splice(i, 1);\n\n if (useAttachEvent && listeners) {\n listeners.useCount[listenerIndex]--;\n if (listeners.useCount[listenerIndex] === 0) {\n listeners.supplied.splice(listenerIndex, 1);\n listeners.wrapped.splice(listenerIndex, 1);\n listeners.useCount.splice(listenerIndex, 1);\n }\n }\n\n break;\n }\n }\n }\n\n if (target.events[type] && target.events[type].length === 0) {\n target.events[type] = null;\n target.typeCount--;\n }\n }\n\n if (!target.typeCount) {\n targets.splice(elementIndex, 1);\n elements.splice(elementIndex, 1);\n attachedListeners.splice(elementIndex, 1);\n }\n}\n\nfunction addDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n if (!delegatedEvents[type]) {\n delegatedEvents[type] = {\n selectors: [],\n contexts : [],\n listeners: [],\n };\n\n // add delegate listener functions\n for (let i = 0; i < documents.length; i++) {\n add(documents[i], type, delegateListener);\n add(documents[i], type, delegateUseCapture, true);\n }\n }\n\n const delegated = delegatedEvents[type];\n let index;\n\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n break;\n }\n }\n\n if (index === -1) {\n index = delegated.selectors.length;\n\n delegated.selectors.push(selector);\n delegated.contexts .push(context);\n delegated.listeners.push([]);\n }\n\n // keep listener and capture and passive flags\n delegated.listeners[index].push([listener, !!options.capture, options.passive]);\n}\n\nfunction removeDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const delegated = delegatedEvents[type];\n let matchFound = false;\n let index;\n\n if (!delegated) { return; }\n\n // count from last index of delegated to 0\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n // look for matching selector and context Node\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n\n const listeners = delegated.listeners[index];\n\n // each item of the listeners array is an array: [function, capture, passive]\n for (let i = listeners.length - 1; i >= 0; i--) {\n const [fn, capture, passive] = listeners[i];\n\n // check if the listener functions and capture and passive flags match\n if (fn === listener && capture === !!options.capture && passive === options.passive) {\n // remove the listener from the array of listeners\n listeners.splice(i, 1);\n\n // if all listeners for this interactable have been removed\n // remove the interactable from the delegated arrays\n if (!listeners.length) {\n delegated.selectors.splice(index, 1);\n delegated.contexts .splice(index, 1);\n delegated.listeners.splice(index, 1);\n\n // remove delegate function from context\n remove(context, type, delegateListener);\n remove(context, type, delegateUseCapture, true);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegatedEvents[type] = null;\n }\n }\n\n // only remove one listener\n matchFound = true;\n break;\n }\n }\n\n if (matchFound) { break; }\n }\n }\n}\n\n// bound to the interactable context when a DOM event\n// listener is added to a selector interactable\nfunction delegateListener (event, optionalArg) {\n const options = getOptions(optionalArg);\n const fakeEvent = {};\n const delegated = delegatedEvents[event.type];\n const eventTarget = (domUtils.getActualElement(event.path\n ? event.path[0]\n : event.target));\n let element = eventTarget;\n\n // duplicate the event so that currentTarget can be changed\n pExtend(fakeEvent, event);\n\n fakeEvent.originalEvent = event;\n fakeEvent.preventDefault = preventOriginalDefault;\n\n // climb up document tree looking for selector matches\n while (is.element(element)) {\n for (let i = 0; i < delegated.selectors.length; i++) {\n const selector = delegated.selectors[i];\n const context = delegated.contexts[i];\n\n if (domUtils.matchesSelector(element, selector)\n && domUtils.nodeContains(context, eventTarget)\n && domUtils.nodeContains(context, element)) {\n\n const listeners = delegated.listeners[i];\n\n fakeEvent.currentTarget = element;\n\n for (let j = 0; j < listeners.length; j++) {\n const [fn, capture, passive] = listeners[j];\n\n if (capture === !!options.capture && passive === options.passive) {\n fn(fakeEvent);\n }\n }\n }\n }\n\n element = domUtils.parentNode(element);\n }\n}\n\nfunction delegateUseCapture (event) {\n return delegateListener.call(this, event, true);\n}\n\nfunction preventDef () {\n this.returnValue = false;\n}\n\nfunction preventOriginalDefault () {\n this.originalEvent.preventDefault();\n}\n\nfunction stopProp () {\n this.cancelBubble = true;\n}\n\nfunction stopImmProp () {\n this.cancelBubble = true;\n this.immediatePropagationStopped = true;\n}\n\nfunction getOptions (param) {\n return is.object(param)? param : { capture: param };\n}\n\nmodule.exports = {\n add,\n remove,\n\n addDelegate,\n removeDelegate,\n\n delegateListener,\n delegateUseCapture,\n delegatedEvents,\n documents,\n\n useAttachEvent,\n supportsOptions,\n\n _elements: elements,\n _targets: targets,\n _attachedListeners: attachedListeners,\n};\n","module.exports = function extend (dest, source) {\n for (const prop in source) {\n dest[prop] = source[prop];\n }\n return dest;\n};\n","const {\n resolveRectLike,\n rectToXY,\n} = require('./rect');\n\nmodule.exports = function (target, element, action) {\n const actionOptions = target.options[action];\n const actionOrigin = actionOptions && actionOptions.origin;\n const origin = actionOrigin || target.options.origin;\n\n const originRect = resolveRectLike(origin, target, element, [target && element]);\n\n return rectToXY(originRect) || { x: 0, y: 0 };\n};\n","module.exports = (x, y) => Math.sqrt(x * x + y * y);\n","const extend = require('./extend');\nconst win = require('./window');\n\nconst utils = {\n warnOnce: function (method, message) {\n let warned = false;\n\n return function () {\n if (!warned) {\n win.window.console.warn(message);\n warned = true;\n }\n\n return method.apply(this, arguments);\n };\n },\n\n // http://stackoverflow.com/a/5634528/2280888\n _getQBezierValue: function (t, p1, p2, p3) {\n const iT = 1 - t;\n return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3;\n },\n\n getQuadraticCurvePoint: function (startX, startY, cpX, cpY, endX, endY, position) {\n return {\n x: utils._getQBezierValue(position, startX, cpX, endX),\n y: utils._getQBezierValue(position, startY, cpY, endY),\n };\n },\n\n // http://gizma.com/easing/\n easeOutQuad: function (t, b, c, d) {\n t /= d;\n return -c * t*(t-2) + b;\n },\n\n copyAction: function (dest, src) {\n dest.name = src.name;\n dest.axis = src.axis;\n dest.edges = src.edges;\n\n return dest;\n },\n\n is : require('./is'),\n extend : extend,\n hypot : require('./hypot'),\n getOriginXY: require('./getOriginXY'),\n};\n\nextend(utils, require('./arr'));\nextend(utils, require('./domUtils'));\nextend(utils, require('./pointerUtils'));\nextend(utils, require('./rect'));\n\nmodule.exports = utils;\n","const scope = require('../scope');\nconst utils = require('./index');\n\nconst finder = {\n methodOrder: [ 'simulationResume', 'mouseOrPen', 'hasPointer', 'idle' ],\n\n search: function (pointer, eventType, eventTarget) {\n const pointerType = utils.getPointerType(pointer);\n const pointerId = utils.getPointerId(pointer);\n const details = { pointer, pointerId, pointerType, eventType, eventTarget };\n\n for (const method of finder.methodOrder) {\n const interaction = finder[method](details);\n\n if (interaction) {\n return interaction;\n }\n }\n },\n\n // try to resume simulation with a new pointer\n simulationResume: function ({ pointerType, eventType, eventTarget }) {\n if (!/down|start/i.test(eventType)) {\n return null;\n }\n\n for (const interaction of scope.interactions) {\n let element = eventTarget;\n\n if (interaction.simulation && interaction.simulation.allowResume\n && (interaction.pointerType === pointerType)) {\n while (element) {\n // if the element is the interaction element\n if (element === interaction.element) {\n return interaction;\n }\n element = utils.parentNode(element);\n }\n }\n }\n\n return null;\n },\n\n // if it's a mouse or pen interaction\n mouseOrPen: function ({ pointerId, pointerType, eventType }) {\n if (pointerType !== 'mouse' && pointerType !== 'pen') {\n return null;\n }\n\n let firstNonActive;\n\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType) {\n // if it's a down event, skip interactions with running simulations\n if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; }\n\n // if the interaction is active, return it immediately\n if (interaction.interacting()) {\n return interaction;\n }\n // otherwise save it and look for another active interaction\n else if (!firstNonActive) {\n firstNonActive = interaction;\n }\n }\n }\n\n // if no active mouse interaction was found use the first inactive mouse\n // interaction\n if (firstNonActive) {\n return firstNonActive;\n }\n\n // find any mouse or pen interaction.\n // ignore the interaction if the eventType is a *down, and a simulation\n // is active\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType && !(/down/i.test(eventType) && interaction.simulation)) {\n return interaction;\n }\n }\n\n return null;\n },\n\n // get interaction that has this pointer\n hasPointer: function ({ pointerId }) {\n for (const interaction of scope.interactions) {\n if (utils.contains(interaction.pointerIds, pointerId)) {\n return interaction;\n }\n }\n },\n\n // get first idle interaction with a matching pointerType\n idle: function ({ pointerType }) {\n for (const interaction of scope.interactions) {\n // if there's already a pointer held down\n if (interaction.pointerIds.length === 1) {\n const target = interaction.target;\n // don't add this pointer if there is a target interactable and it\n // isn't gesturable\n if (target && !target.options.gesture.enabled) {\n continue;\n }\n }\n // maximum of 2 pointers per interaction\n else if (interaction.pointerIds.length >= 2) {\n continue;\n }\n\n if (!interaction.interacting() && (pointerType === interaction.pointerType)) {\n return interaction;\n }\n }\n\n return null;\n },\n};\n\nmodule.exports = finder;\n","const win = require('./window');\nconst isWindow = require('./isWindow');\n\nconst is = {\n array : () => {},\n\n window : thing => thing === win.window || isWindow(thing),\n\n docFrag : thing => is.object(thing) && thing.nodeType === 11,\n\n object : thing => !!thing && (typeof thing === 'object'),\n\n function: thing => typeof thing === 'function',\n\n number : thing => typeof thing === 'number' ,\n\n bool : thing => typeof thing === 'boolean' ,\n\n string : thing => typeof thing === 'string' ,\n\n element: thing => {\n if (!thing || (typeof thing !== 'object')) { return false; }\n\n const _window = win.getWindow(thing) || win.window;\n\n return (/object|function/.test(typeof _window.Element)\n ? thing instanceof _window.Element //DOM2\n : thing.nodeType === 1 && typeof thing.nodeName === 'string');\n },\n};\n\nis.array = thing => (is.object(thing)\n && (typeof thing.length !== 'undefined')\n && is.function(thing.splice));\n\nmodule.exports = is;\n","module.exports = (thing) => !!(thing && thing.Window) && (thing instanceof thing.Window);\n","function pointerExtend (dest, source) {\n for (const prop in source) {\n const prefixedPropREs = module.exports.prefixedPropREs;\n let deprecated = false;\n\n // skip deprecated prefixed properties\n for (const vendor in prefixedPropREs) {\n if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) {\n deprecated = true;\n break;\n }\n }\n\n if (!deprecated && typeof source[prop] !== 'function') {\n dest[prop] = source[prop];\n }\n }\n return dest;\n}\n\npointerExtend.prefixedPropREs = {\n webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/,\n};\n\nmodule.exports = pointerExtend;\n","const hypot = require('./hypot');\nconst browser = require('./browser');\nconst dom = require('./domObjects');\nconst domUtils = require('./domUtils');\nconst domObjects = require('./domObjects');\nconst is = require('./is');\nconst pointerExtend = require('./pointerExtend');\n\nconst pointerUtils = {\n copyCoords: function (dest, src) {\n dest.page = dest.page || {};\n dest.page.x = src.page.x;\n dest.page.y = src.page.y;\n\n dest.client = dest.client || {};\n dest.client.x = src.client.x;\n dest.client.y = src.client.y;\n\n dest.timeStamp = src.timeStamp;\n },\n\n setCoordDeltas: function (targetObj, prev, cur) {\n targetObj.page.x = cur.page.x - prev.page.x;\n targetObj.page.y = cur.page.y - prev.page.y;\n targetObj.client.x = cur.client.x - prev.client.x;\n targetObj.client.y = cur.client.y - prev.client.y;\n targetObj.timeStamp = cur.timeStamp - prev.timeStamp;\n\n // set pointer velocity\n const dt = Math.max(targetObj.timeStamp / 1000, 0.001);\n\n targetObj.page.speed = hypot(targetObj.page.x, targetObj.page.y) / dt;\n targetObj.page.vx = targetObj.page.x / dt;\n targetObj.page.vy = targetObj.page.y / dt;\n\n targetObj.client.speed = hypot(targetObj.client.x, targetObj.page.y) / dt;\n targetObj.client.vx = targetObj.client.x / dt;\n targetObj.client.vy = targetObj.client.y / dt;\n },\n\n isNativePointer: function (pointer) {\n return (pointer instanceof dom.Event || pointer instanceof dom.Touch);\n },\n\n // Get specified X/Y coords for mouse or event.touches[0]\n getXY: function (type, pointer, xy) {\n xy = xy || {};\n type = type || 'page';\n\n xy.x = pointer[type + 'X'];\n xy.y = pointer[type + 'Y'];\n\n return xy;\n },\n\n getPageXY: function (pointer, page) {\n page = page || {};\n\n // Opera Mobile handles the viewport and scrolling oddly\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n pointerUtils.getXY('screen', pointer, page);\n\n page.x += window.scrollX;\n page.y += window.scrollY;\n }\n else {\n pointerUtils.getXY('page', pointer, page);\n }\n\n return page;\n },\n\n getClientXY: function (pointer, client) {\n client = client || {};\n\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n // Opera Mobile handles the viewport and scrolling oddly\n pointerUtils.getXY('screen', pointer, client);\n }\n else {\n pointerUtils.getXY('client', pointer, client);\n }\n\n return client;\n },\n\n getPointerId: function (pointer) {\n return is.number(pointer.pointerId)? pointer.pointerId : pointer.identifier;\n },\n\n setCoords: function (targetObj, pointers, timeStamp) {\n const pointer = (pointers.length > 1\n ? pointerUtils.pointerAverage(pointers)\n : pointers[0]);\n\n const tmpXY = {};\n\n pointerUtils.getPageXY(pointer, tmpXY);\n targetObj.page.x = tmpXY.x;\n targetObj.page.y = tmpXY.y;\n\n pointerUtils.getClientXY(pointer, tmpXY);\n targetObj.client.x = tmpXY.x;\n targetObj.client.y = tmpXY.y;\n\n targetObj.timeStamp = is.number(timeStamp) ? timeStamp :new Date().getTime();\n },\n\n pointerExtend: pointerExtend,\n\n getTouchPair: function (event) {\n const touches = [];\n\n // array of touches is supplied\n if (is.array(event)) {\n touches[0] = event[0];\n touches[1] = event[1];\n }\n // an event\n else {\n if (event.type === 'touchend') {\n if (event.touches.length === 1) {\n touches[0] = event.touches[0];\n touches[1] = event.changedTouches[0];\n }\n else if (event.touches.length === 0) {\n touches[0] = event.changedTouches[0];\n touches[1] = event.changedTouches[1];\n }\n }\n else {\n touches[0] = event.touches[0];\n touches[1] = event.touches[1];\n }\n }\n\n return touches;\n },\n\n pointerAverage: function (pointers) {\n const average = {\n pageX : 0,\n pageY : 0,\n clientX: 0,\n clientY: 0,\n screenX: 0,\n screenY: 0,\n };\n\n for (const pointer of pointers) {\n for (const prop in average) {\n average[prop] += pointer[prop];\n }\n }\n for (const prop in average) {\n average[prop] /= pointers.length;\n }\n\n return average;\n },\n\n touchBBox: function (event) {\n if (!event.length && !(event.touches && event.touches.length > 1)) {\n return;\n }\n\n const touches = pointerUtils.getTouchPair(event);\n const minX = Math.min(touches[0].pageX, touches[1].pageX);\n const minY = Math.min(touches[0].pageY, touches[1].pageY);\n const maxX = Math.max(touches[0].pageX, touches[1].pageX);\n const maxY = Math.max(touches[0].pageY, touches[1].pageY);\n\n return {\n x: minX,\n y: minY,\n left: minX,\n top: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n },\n\n touchDistance: function (event, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n\n\n const dx = touches[0][sourceX] - touches[1][sourceX];\n const dy = touches[0][sourceY] - touches[1][sourceY];\n\n return hypot(dx, dy);\n },\n\n touchAngle: function (event, prevAngle, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n const dx = touches[1][sourceX] - touches[0][sourceX];\n const dy = touches[1][sourceY] - touches[0][sourceY];\n const angle = 180 * Math.atan2(dy , dx) / Math.PI;\n\n return angle;\n },\n\n getPointerType: function (pointer) {\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : is.number(pointer.pointerType)\n ? [undefined, undefined,'touch', 'pen', 'mouse'][pointer.pointerType]\n // if the PointerEvent API isn't available, then the \"pointer\" must\n // be either a MouseEvent, TouchEvent, or Touch object\n : /touch/.test(pointer.type) || pointer instanceof domObjects.Touch\n ? 'touch'\n : 'mouse';\n },\n\n // [ event.target, event.currentTarget ]\n getEventTargets: function (event) {\n return [\n domUtils.getActualElement(event.path ? event.path[0] : event.target),\n domUtils.getActualElement(event.currentTarget),\n ];\n },\n};\n\nmodule.exports = pointerUtils;\n","const { window } = require('./window');\n\nconst vendors = ['ms', 'moz', 'webkit', 'o'];\nlet lastTime = 0;\nlet request;\nlet cancel;\n\nfor (let x = 0; x < vendors.length && !window.requestAnimationFrame; x++) {\n request = window[vendors[x] + 'RequestAnimationFrame'];\n cancel = window[vendors[x] +'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n}\n\nif (!request) {\n request = function (callback) {\n const currTime = new Date().getTime();\n const timeToCall = Math.max(0, 16 - (currTime - lastTime));\n const id = setTimeout(function () { callback(currTime + timeToCall); },\n timeToCall);\n\n lastTime = currTime + timeToCall;\n return id;\n };\n}\n\nif (!cancel) {\n cancel = function (id) {\n clearTimeout(id);\n };\n}\n\nmodule.exports = {\n request,\n cancel,\n};\n","const extend = require('./extend');\nconst is = require('./is');\nconst {\n closest,\n parentNode,\n getElementRect,\n} = require('./domUtils');\n\nconst rectUtils = {\n getStringOptionResult: function (value, interactable, element) {\n if (!is.string(value)) {\n return null;\n }\n\n if (value === 'parent') {\n value = parentNode(element);\n }\n else if (value === 'self') {\n value = interactable.getRect(element);\n }\n else {\n value = closest(element, value);\n }\n\n return value;\n },\n\n resolveRectLike: function (value, interactable, element, functionArgs) {\n value = rectUtils.getStringOptionResult(value, interactable, element) || value;\n\n if (is.function(value)) {\n value = value.apply(null, functionArgs);\n }\n\n if (is.element(value)) {\n value = getElementRect(value);\n }\n\n return value;\n },\n\n rectToXY: function (rect) {\n return rect && {\n x: 'x' in rect ? rect.x : rect.left,\n y: 'y' in rect ? rect.y : rect.top,\n };\n },\n\n xywhToTlbr: function (rect) {\n if (rect && !('left' in rect && 'top' in rect)) {\n rect = extend({}, rect);\n\n rect.left = rect.x || 0;\n rect.top = rect.y || 0;\n rect.right = rect.right || (rect.left + rect.width);\n rect.bottom = rect.bottom || (rect.top + rect.height);\n }\n\n return rect;\n },\n\n tlbrToXywh: function (rect) {\n if (rect && !('x' in rect && 'y' in rect)) {\n rect = extend({}, rect);\n\n rect.x = rect.left || 0;\n rect.top = rect.top || 0;\n rect.width = rect.width || (rect.right - rect.x);\n rect.height = rect.height || (rect.bottom - rect.y);\n }\n\n return rect;\n },\n};\n\nmodule.exports = rectUtils;\n","const win = module.exports;\nconst isWindow = require('./isWindow');\n\nfunction init (window) {\n // get wrapped window if using Shadow DOM polyfill\n\n win.realWindow = window;\n\n // create a TextNode\n const el = window.document.createTextNode('');\n\n // check if it's wrapped by a polyfill\n if (el.ownerDocument !== window.document\n && typeof window.wrap === 'function'\n && window.wrap(el) === el) {\n // use wrapped window\n window = window.wrap(window);\n }\n\n win.window = window;\n}\n\nif (typeof window === 'undefined') {\n win.window = undefined;\n win.realWindow = undefined;\n}\nelse {\n init(window);\n}\n\nwin.getWindow = function getWindow (node) {\n if (isWindow(node)) {\n return node;\n }\n\n const rootNode = (node.ownerDocument || node);\n\n return rootNode.defaultView || rootNode.parentWindow || win.window;\n};\n\nwin.init = init;\n"]} \ No newline at end of file diff --git a/package.json b/package.json index 76f3e9969..f39704e99 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "interactjs", - "version": "1.3.0-alpha.3+sha.9595c40", + "version": "1.3.0-alpha.4+sha.7970416", "repository": { "type": "git", "url": "https://github.com/taye/interact.js.git"
- Interactable.rectChecker([checker])⚓➭ + Interactable.rectChecker([checker])⚓➭ @@ -951,7 +951,7 @@ Parameters - Interactable.origin(…)⚓➭ + Interactable.origin(…)⚓➭ @@ -1041,7 +1041,7 @@ Parameters - Interactable.deltaSource([newValue])⚓➭ + Interactable.deltaSource([newValue])⚓➭ @@ -1104,7 +1104,7 @@ Parameters - Interactable.context()⚓➭ + Interactable.context()⚓➭ @@ -1146,7 +1146,7 @@ Interactable.context() - Interactable.fire(iEvent)⚓➭ + Interactable.fire(iEvent)⚓➭ @@ -1207,7 +1207,7 @@ Parameters - Interactable.on(eventType, listener, [options])⚓➭ + Interactable.on(eventType, listener, [options])⚓➭ @@ -1273,7 +1273,7 @@ Parameters - Interactable.off(eventType, listener, [options])⚓➭ + Interactable.off(eventType, listener, [options])⚓➭ @@ -1339,7 +1339,7 @@ Parameters - Interactable.set(options)⚓➭ + Interactable.set(options)⚓➭ @@ -1399,7 +1399,7 @@ Parameters - Interactable.unset()⚓➭ + Interactable.unset()⚓➭ @@ -1442,7 +1442,7 @@ Interactable.unset() - Interactable.actionChecker([checker])⚓➭ + Interactable.actionChecker([checker])⚓➭ @@ -1542,7 +1542,7 @@ Parameters - Interactable.styleCursor([newValue])⚓➭ + Interactable.styleCursor([newValue])⚓➭ @@ -1605,7 +1605,7 @@ Parameters - interact.maxInteractions([newValue])⚓➭ + interact.maxInteractions([newValue])⚓➭ @@ -1652,7 +1652,7 @@ Parameters - Interactable.preventDefault([newValue])⚓➭ + Interactable.preventDefault([newValue])⚓➭ @@ -1718,7 +1718,7 @@ Parameters - interact(element)⚓➭ + interact(element)⚓➭ @@ -1821,7 +1821,7 @@ Usage - interact.isSet(element)⚓➭ + interact.isSet(element)⚓➭ @@ -1881,7 +1881,7 @@ Parameters - interact.on(type, listener, [options])⚓➭ + interact.on(type, listener, [options])⚓➭ @@ -1948,7 +1948,7 @@ Parameters - interact.off(type, listener, [options])⚓➭ + interact.off(type, listener, [options])⚓➭ @@ -2014,7 +2014,7 @@ Parameters - interact.debug()⚓➭ + interact.debug()⚓➭ @@ -2056,7 +2056,7 @@ interact.debug() - interact.supportsTouch()⚓➭ + interact.supportsTouch()⚓➭ @@ -2097,7 +2097,7 @@ interact.supportsTouch() - interact.supportsPointerEvent()⚓➭ + interact.supportsPointerEvent()⚓➭ @@ -2138,7 +2138,7 @@ interact.supportsPointerEvent() - interact.stop(event)⚓➭ + interact.stop(event)⚓➭ @@ -2198,7 +2198,7 @@ Parameters - interact.pointerMoveTolerance([newValue])⚓➭ + interact.pointerMoveTolerance([newValue])⚓➭ @@ -2261,7 +2261,7 @@ Parameters - Interaction.start(action, target, element)⚓➭ + Interaction.start(action, target, element)⚓➭ @@ -2356,7 +2356,7 @@ Parameters - Interaction.doMove()⚓➭ + Interaction.doMove()⚓➭ @@ -2403,7 +2403,7 @@ Interaction.doMove() - Interaction.end([event])⚓➭ + Interaction.end([event])⚓➭ diff --git a/dist/interact.js b/dist/interact.js index e8ae35c3b..c78a3c751 100644 --- a/dist/interact.js +++ b/dist/interact.js @@ -1,5 +1,5 @@ /** - * interact.js v1.3.0-alpha.3+sha.9595c40 + * interact.js v1.3.0-alpha.4+sha.7970416-dirty * * Copyright (c) 2012-2017 Taye Adeyemi * Open source under the MIT License. @@ -816,6 +816,7 @@ var scope = require('./scope'); var utils = require('./utils'); var events = require('./utils/events'); var browser = require('./utils/browser'); +var domObjects = require('./utils/domObjects'); var finder = require('./utils/interactionFinder'); var signals = require('./utils/Signals').new(); @@ -829,7 +830,9 @@ var prevTouchTime = 0; scope.interactions = []; var Interaction = function () { - function Interaction() { + function Interaction(_ref) { + var pointerType = _ref.pointerType; + _classCallCheck(this, Interaction); this.target = null; // current interactable being interacted with @@ -886,7 +889,7 @@ var Interaction = function () { this.pointerWasMoved = false; this._interacting = false; - this.mouse = false; + this.pointerType = pointerType; signals.fire('new', this); @@ -1130,6 +1133,11 @@ var Interaction = function () { }; Interaction.prototype.getPointerIndex = function getPointerIndex(pointer) { + // mouse and pen interactions may have only one pointer + if (this.pointerType === 'mouse' || this.pointerType === 'pen') { + return 0; + } + return utils.indexOf(this.pointerIds, utils.getPointerId(pointer)); }; @@ -1161,8 +1169,7 @@ var Interaction = function () { }; Interaction.prototype.removePointer = function removePointer(pointer, event) { - var id = utils.getPointerId(pointer); - var index = this.mouse ? 0 : utils.indexOf(this.pointerIds, id); + var index = this.getPointerIndex(pointer); if (index === -1) { return; @@ -1197,6 +1204,8 @@ for (var i = 0, len = methodNames.length; i < len; i++) { function doOnInteractions(method) { return function (event) { + var pointerType = utils.getPointerType(event); + var _utils$getEventTarget = utils.getEventTargets(event), eventTarget = _utils$getEventTarget[0], curEventTarget = _utils$getEventTarget[1]; @@ -1210,7 +1219,7 @@ function doOnInteractions(method) { var pointer = event.changedTouches[_i]; var interaction = finder.search(pointer, event.type, eventTarget); - matches.push([pointer, interaction || new Interaction()]); + matches.push([pointer, interaction || new Interaction({ pointerType: pointerType })]); } } else { var invalidPointer = false; @@ -1218,7 +1227,7 @@ function doOnInteractions(method) { if (!browser.supportsPointerEvent && /mouse/.test(event.type)) { // ignore mouse events while touch interactions are active for (var _i2 = 0; _i2 < scope.interactions.length && !invalidPointer; _i2++) { - invalidPointer = !scope.interactions[_i2].mouse && scope.interactions[_i2].pointerIsDown; + invalidPointer = scope.interactions[_i2].pointerType !== 'mouse' && scope.interactions[_i2].pointerIsDown; } // try to ignore mouse events that are simulated by the browser @@ -1232,11 +1241,7 @@ function doOnInteractions(method) { var _interaction = finder.search(event, event.type, eventTarget); if (!_interaction) { - - _interaction = new Interaction(); - _interaction.mouse = /mouse/i.test(event.pointerType || event.type) - // MSPointerEvent.MSPOINTER_TYPE_MOUSE - || event.pointerType === 4 || !event.pointerType; + _interaction = new Interaction({ pointerType: pointerType }); } matches.push([event, _interaction]); @@ -1244,20 +1249,20 @@ function doOnInteractions(method) { } for (var _iterator = matches, _isArray = Array.isArray(_iterator), _i3 = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { - var _ref; + var _ref2; if (_isArray) { if (_i3 >= _iterator.length) break; - _ref = _iterator[_i3++]; + _ref2 = _iterator[_i3++]; } else { _i3 = _iterator.next(); if (_i3.done) break; - _ref = _i3.value; + _ref2 = _i3.value; } - var _ref2 = _ref, - _pointer = _ref2[0], - _interaction2 = _ref2[1]; + var _ref3 = _ref2, + _pointer = _ref3[0], + _interaction2 = _ref3[1]; _interaction2._updateEventTargets(eventTarget, curEventTarget); _interaction2[method](_pointer, event, eventTarget, curEventTarget); @@ -1277,7 +1282,7 @@ function endAll(event) { var docEvents = {/* 'eventType': listenerFunc */}; var pEventTypes = browser.pEventTypes; -if (scope.PointerEvent) { +if (domObjects.PointerEvent) { docEvents[pEventTypes.down] = listeners.pointerDown; docEvents[pEventTypes.move] = listeners.pointerMove; docEvents[pEventTypes.up] = listeners.pointerUp; @@ -1295,8 +1300,8 @@ if (scope.PointerEvent) { docEvents.blur = endAll; -function onDocSignal(_ref3, signalName) { - var doc = _ref3.doc; +function onDocSignal(_ref4, signalName) { + var doc = _ref4.doc; var eventMethod = signalName.indexOf('add') === 0 ? events.add : events.remove; @@ -1311,14 +1316,14 @@ function onDocSignal(_ref3, signalName) { } } -signals.on('update-pointer-down', function (_ref4) { - var interaction = _ref4.interaction, - pointer = _ref4.pointer, - pointerId = _ref4.pointerId, - pointerIndex = _ref4.pointerIndex, - event = _ref4.event, - eventTarget = _ref4.eventTarget, - down = _ref4.down; +signals.on('update-pointer-down', function (_ref5) { + var interaction = _ref5.interaction, + pointer = _ref5.pointer, + pointerId = _ref5.pointerId, + pointerIndex = _ref5.pointerIndex, + event = _ref5.event, + eventTarget = _ref5.eventTarget, + down = _ref5.down; interaction.pointerIds[pointerIndex] = pointerId; interaction.pointers[pointerIndex] = pointer; @@ -1355,7 +1360,7 @@ scope.endAllInteractions = endAll; module.exports = Interaction; -},{"./scope":34,"./utils":44,"./utils/Signals":35,"./utils/browser":37,"./utils/events":40,"./utils/interactionFinder":45}],6:[function(require,module,exports){ +},{"./scope":34,"./utils":44,"./utils/Signals":35,"./utils/browser":37,"./utils/domObjects":38,"./utils/events":40,"./utils/interactionFinder":45}],6:[function(require,module,exports){ 'use strict'; var Interaction = require('../Interaction'); @@ -5460,7 +5465,7 @@ module.exports = function () { this.originalEvent = event; this.type = type; this.pointerId = pointerUtils.getPointerId(pointer); - this.pointerType = pointerUtils.getPointerType(pointer, interaction); + this.pointerType = pointerUtils.getPointerType(pointer); this.target = eventTarget; this.currentTarget = null; @@ -5758,8 +5763,10 @@ Interaction.signals.on('down', function (_ref6) { timer.duration = minDuration; timer.timeout = setTimeout(function () { fire({ - interaction: interaction, eventCopy: eventCopy, eventTarget: eventTarget, + interaction: interaction, + eventTarget: eventTarget, pointer: browser.isIE8 ? eventCopy : pointer, + event: eventCopy, type: 'hold' }); }, minDuration); @@ -6946,17 +6953,14 @@ module.exports = utils; var scope = require('../scope'); var utils = require('./index'); -var browser = require('./browser'); var finder = { - methodOrder: ['simulationResume', 'mouse', 'hasPointer', 'idle'], + methodOrder: ['simulationResume', 'mouseOrPen', 'hasPointer', 'idle'], search: function search(pointer, eventType, eventTarget) { - var mouseEvent = /mouse/i.test(pointer.pointerType || eventType) - // MSPointerEvent.MSPOINTER_TYPE_MOUSE - || pointer.pointerType === 4; + var pointerType = utils.getPointerType(pointer); var pointerId = utils.getPointerId(pointer); - var details = { pointer: pointer, pointerId: pointerId, mouseEvent: mouseEvent, eventType: eventType, eventTarget: eventTarget }; + var details = { pointer: pointer, pointerId: pointerId, pointerType: pointerType, eventType: eventType, eventTarget: eventTarget }; for (var _iterator = finder.methodOrder, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { var _ref; @@ -6982,7 +6986,7 @@ var finder = { // try to resume simulation with a new pointer simulationResume: function simulationResume(_ref2) { - var mouseEvent = _ref2.mouseEvent, + var pointerType = _ref2.pointerType, eventType = _ref2.eventType, eventTarget = _ref2.eventTarget; @@ -7006,7 +7010,7 @@ var finder = { var element = eventTarget; - if (interaction.simulation && interaction.simulation.allowResume && interaction.mouse === mouseEvent) { + if (interaction.simulation && interaction.simulation.allowResume && interaction.pointerType === pointerType) { while (element) { // if the element is the interaction element if (element === interaction.element) { @@ -7020,13 +7024,13 @@ var finder = { return null; }, - // if it's a mouse interaction - mouse: function mouse(_ref4) { + // if it's a mouse or pen interaction + mouseOrPen: function mouseOrPen(_ref4) { var pointerId = _ref4.pointerId, - mouseEvent = _ref4.mouseEvent, + pointerType = _ref4.pointerType, eventType = _ref4.eventType; - if (!mouseEvent && (browser.supportsTouch || browser.supportsPointerEvent)) { + if (pointerType !== 'mouse' && pointerType !== 'pen') { return null; } @@ -7046,7 +7050,7 @@ var finder = { var interaction = _ref5; - if (interaction.mouse) { + if (interaction.pointerType === pointerType) { // if it's a down event, skip interactions with running simulations if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; @@ -7069,8 +7073,8 @@ var finder = { return firstNonActive; } - // Find any interaction specifically for mouse. - // ignore the interaction if the eventType is a mousedown, and a simulation + // find any mouse or pen interaction. + // ignore the interaction if the eventType is a *down, and a simulation // is active for (var _iterator4 = scope.interactions, _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) { var _ref6; @@ -7086,7 +7090,7 @@ var finder = { var _interaction = _ref6; - if (_interaction.mouse && !(/down/.test(eventType) && _interaction.simulation)) { + if (_interaction.pointerType === pointerType && !(/down/i.test(eventType) && _interaction.simulation)) { return _interaction; } } @@ -7118,9 +7122,9 @@ var finder = { } }, - // get first idle interaction + // get first idle interaction with a matching pointerType idle: function idle(_ref9) { - var mouseEvent = _ref9.mouseEvent; + var pointerType = _ref9.pointerType; for (var _iterator6 = scope.interactions, _isArray6 = Array.isArray(_iterator6), _i6 = 0, _iterator6 = _isArray6 ? _iterator6 : _iterator6[Symbol.iterator]();;) { var _ref10; @@ -7150,7 +7154,7 @@ var finder = { continue; } - if (!interaction.interacting() && mouseEvent === interaction.mouse) { + if (!interaction.interacting() && pointerType === interaction.pointerType) { return interaction; } } @@ -7161,7 +7165,7 @@ var finder = { module.exports = finder; -},{"../scope":34,"./browser":37,"./index":44}],46:[function(require,module,exports){ +},{"../scope":34,"./index":44}],46:[function(require,module,exports){ 'use strict'; var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; @@ -7262,6 +7266,7 @@ var hypot = require('./hypot'); var browser = require('./browser'); var dom = require('./domObjects'); var domUtils = require('./domUtils'); +var domObjects = require('./domObjects'); var is = require('./is'); var pointerExtend = require('./pointerExtend'); @@ -7468,17 +7473,11 @@ var pointerUtils = { return angle; }, - getPointerType: function getPointerType(pointer, interaction) { - // if the PointerEvent API isn't available, then the pointer must be ither - // a MouseEvent or TouchEvent - if (interaction.mouse) { - return 'mouse'; - } - if (!browser.supportsPointerEvent) { - return 'touch'; - } - - return is.string(pointer.pointerType) ? pointer.pointerType : [undefined, undefined, 'touch', 'pen', 'mouse'][pointer.pointerType]; + getPointerType: function getPointerType(pointer) { + return is.string(pointer.pointerType) ? pointer.pointerType : is.number(pointer.pointerType) ? [undefined, undefined, 'touch', 'pen', 'mouse'][pointer.pointerType] + // if the PointerEvent API isn't available, then the "pointer" must + // be either a MouseEvent, TouchEvent, or Touch object + : /touch/.test(pointer.type) || pointer instanceof domObjects.Touch ? 'touch' : 'mouse'; }, // [ event.target, event.currentTarget ] diff --git a/dist/interact.js.map b/dist/interact.js.map index 60832b766..4f3a62ba8 100644 --- a/dist/interact.js.map +++ b/dist/interact.js.map @@ -1 +1 @@ -{"version":3,"sources":["src/header.js","node_modules/browser-pack/_prelude.js","index.js","src/Eventable.js","src/InteractEvent.js","src/Interactable.js","src/Interaction.js","src/actions/base.js","src/actions/drag.js","src/actions/drop.js","src/actions/gesture.js","src/actions/resize.js","src/autoScroll.js","src/autoStart/InteractableMethods.js","src/autoStart/base.js","src/autoStart/delay.js","src/autoStart/drag.js","src/autoStart/gesture.js","src/autoStart/resize.js","src/defaultOptions.js","src/index.js","src/inertia.js","src/interact.js","src/interactablePreventDefault.js","src/legacyBrowsers.js","src/modifiers/index.js","src/modifiers/restrict.js","src/modifiers/restrictEdges.js","src/modifiers/restrictSize.js","src/modifiers/snap.js","src/modifiers/snapSize.js","src/pointerEvents/PointerEvent.js","src/pointerEvents/base.js","src/pointerEvents/holdRepeat.js","src/pointerEvents/interactableTargets.js","src/scope.js","src/utils/Signals.js","src/utils/arr.js","src/utils/browser.js","src/utils/domObjects.js","src/utils/domUtils.js","src/utils/events.js","src/utils/extend.js","src/utils/getOriginXY.js","src/utils/hypot.js","src/utils/index.js","src/utils/interactionFinder.js","src/utils/is.js","src/utils/isWindow.js","src/utils/pointerExtend.js","src/utils/pointerUtils.js","src/utils/raf.js","src/utils/rect.js","src/utils/window.js"],"names":[],"mappings":"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","file":"interact.js","sourceRoot":"","sourcesContent":["/**\n * interact.js v1.3.0-alpha.3+sha.9595c40\n *\n * Copyright (c) 2012-2017 Taye Adeyemi \n * Open source under the MIT License.\n * https://raw.github.com/taye/interact.js/master/LICENSE\n */\n","(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o 150) {\n return null;\n }\n\n let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI;\n const overlap = 22.5;\n\n if (angle < 0) {\n angle += 360;\n }\n\n const left = 135 - overlap <= angle && angle < 225 + overlap;\n const up = 225 - overlap <= angle && angle < 315 + overlap;\n\n const right = !left && (315 - overlap <= angle || angle < 45 + overlap);\n const down = !up && 45 - overlap <= angle && angle < 135 + overlap;\n\n return {\n up,\n down,\n left,\n right,\n angle,\n speed: interaction.prevEvent.speed,\n velocity: {\n x: interaction.prevEvent.velocityX,\n y: interaction.prevEvent.velocityY,\n },\n };\n }\n\n preventDefault () {}\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n}\n\nsignals.on('set-delta', function ({ iEvent, interaction, starting, deltaSource }) {\n const prevEvent = starting? iEvent : interaction.prevEvent;\n\n if (deltaSource === 'client') {\n iEvent.dx = iEvent.clientX - prevEvent.clientX;\n iEvent.dy = iEvent.clientY - prevEvent.clientY;\n }\n else {\n iEvent.dx = iEvent.pageX - prevEvent.pageX;\n iEvent.dy = iEvent.pageY - prevEvent.pageY;\n }\n});\n\nInteractEvent.signals = signals;\n\nmodule.exports = InteractEvent;\n","const is = require('./utils/is');\nconst events = require('./utils/events');\nconst extend = require('./utils/extend');\nconst actions = require('./actions/base');\nconst scope = require('./scope');\nconst Eventable = require('./Eventable');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nconst {\n getElementRect,\n nodeContains,\n trySelector,\n} = require('./utils/domUtils');\nconst { getWindow } = require('./utils/window');\nconst { indexOf, contains } = require('./utils/arr');\nconst { wheelEvent } = require('./utils/browser');\n\n// all set interactables\nscope.interactables = [];\n\n/*\\\n * Interactable\n [ property ]\n **\n * Object type returned by @interact\n\\*/\nclass Interactable {\n constructor (target, options) {\n options = options || {};\n\n this.target = target;\n this.events = new Eventable();\n this._context = options.context || scope.document;\n this._win = getWindow(trySelector(target)? this._context : target);\n this._doc = this._win.document;\n\n signals.fire('new', {\n target,\n options,\n interactable: this,\n win: this._win,\n });\n\n scope.addDocument( this._doc, this._win );\n\n scope.interactables.push(this);\n\n this.set(options);\n }\n\n setOnEvents (action, phases) {\n const onAction = 'on' + action;\n\n if (is.function(phases.onstart) ) { this.events[onAction + 'start' ] = phases.onstart ; }\n if (is.function(phases.onmove) ) { this.events[onAction + 'move' ] = phases.onmove ; }\n if (is.function(phases.onend) ) { this.events[onAction + 'end' ] = phases.onend ; }\n if (is.function(phases.oninertiastart)) { this.events[onAction + 'inertiastart' ] = phases.oninertiastart ; }\n\n return this;\n }\n\n setPerAction (action, options) {\n // for all the default per-action options\n for (const option in options) {\n // if this option exists for this action\n if (option in defaults[action]) {\n // if the option in the options arg is an object value\n if (is.object(options[option])) {\n // duplicate the object\n this.options[action][option] = extend(this.options[action][option] || {}, options[option]);\n\n if (is.object(defaults.perAction[option]) && 'enabled' in defaults.perAction[option]) {\n this.options[action][option].enabled = options[option].enabled === false? false : true;\n }\n }\n else if (is.bool(options[option]) && is.object(defaults.perAction[option])) {\n this.options[action][option].enabled = options[option];\n }\n else if (options[option] !== undefined) {\n // or if it's not undefined, do a plain assignment\n this.options[action][option] = options[option];\n }\n }\n }\n }\n\n /*\\\n * Interactable.getRect\n [ method ]\n *\n * The default function to get an Interactables bounding rect. Can be\n * overridden using @Interactable.rectChecker.\n *\n - element (Element) #optional The element to measure.\n = (object) The object's bounding rectangle.\n o {\n o top : 0,\n o left : 0,\n o bottom: 0,\n o right : 0,\n o width : 0,\n o height: 0\n o }\n \\*/\n getRect (element) {\n element = element || this.target;\n\n if (is.string(this.target) && !(is.element(element))) {\n element = this._context.querySelector(this.target);\n }\n\n return getElementRect(element);\n }\n\n /*\\\n * Interactable.rectChecker\n [ method ]\n *\n * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n - checker (function) #optional A function which returns this Interactable's bounding rectangle. See @Interactable.getRect\n = (function | object) The checker function or this Interactable\n \\*/\n rectChecker (checker) {\n if (is.function(checker)) {\n this.getRect = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.getRect;\n\n return this;\n }\n\n return this.getRect;\n }\n\n _backCompatOption (optionName, newValue) {\n if (trySelector(newValue) || is.object(newValue)) {\n this.options[optionName] = newValue;\n\n for (const action of actions.names) {\n this.options[action][optionName] = newValue;\n }\n\n return this;\n }\n\n return this.options[optionName];\n }\n\n /*\\\n * Interactable.origin\n [ method ]\n *\n * Gets or sets the origin of the Interactable's element. The x and y\n * of the origin will be subtracted from action event coordinates.\n *\n - origin (object | string) #optional An object eg. { x: 0, y: 0 } or string 'parent', 'self' or any CSS selector\n * OR\n - origin (Element) #optional An HTML or SVG Element whose rect will be used\n **\n = (object) The current origin or this Interactable\n \\*/\n origin (newValue) {\n return this._backCompatOption('origin', newValue);\n }\n\n /*\\\n * Interactable.deltaSource\n [ method ]\n *\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n - newValue (string) #optional Use 'client' if you will be scrolling while interacting; Use 'page' if you want autoScroll to work\n = (string | object) The current deltaSource or this Interactable\n \\*/\n deltaSource (newValue) {\n if (newValue === 'page' || newValue === 'client') {\n this.options.deltaSource = newValue;\n\n return this;\n }\n\n return this.options.deltaSource;\n }\n\n /*\\\n * Interactable.context\n [ method ]\n *\n * Gets the selector context Node of the Interactable. The default is `window.document`.\n *\n = (Node) The context Node of this Interactable\n **\n \\*/\n context () {\n return this._context;\n }\n\n inContext (element) {\n return (this._context === element.ownerDocument\n || nodeContains(this._context, element));\n }\n\n /*\\\n * Interactable.fire\n [ method ]\n *\n * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n - iEvent (InteractEvent) The InteractEvent object to be fired on this Interactable\n = (Interactable) this Interactable\n \\*/\n fire (iEvent) {\n this.events.fire(iEvent);\n\n return this;\n }\n\n _onOffMultiple (method, eventType, listener, options) {\n if (is.string(eventType) && eventType.search(' ') !== -1) {\n eventType = eventType.trim().split(/ +/);\n }\n\n if (is.array(eventType)) {\n for (let i = 0; i < eventType.length; i++) {\n this[method](eventType[i], listener, options);\n }\n\n return true;\n }\n\n if (is.object(eventType)) {\n for (const prop in eventType) {\n this[method](prop, eventType[prop], listener);\n }\n\n return true;\n }\n }\n\n /*\\\n * Interactable.on\n [ method ]\n *\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n - eventType (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) This Interactable\n \\*/\n on (eventType, listener, options) {\n if (this._onOffMultiple('on', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.on(eventType, listener);\n }\n // delegated event for selector\n else if (is.string(this.target)) {\n events.addDelegate(this.target, this._context, eventType, listener, options);\n }\n else {\n events.add(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.off\n [ method ]\n *\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n - eventType (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) This Interactable\n \\*/\n off (eventType, listener, options) {\n if (this._onOffMultiple('off', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n // if it is an action event type\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.off(eventType, listener);\n }\n // delegated event\n else if (is.string(this.target)) {\n events.removeDelegate(this.target, this._context, eventType, listener, options);\n }\n // remove listener from this Interatable's element\n else {\n events.remove(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.set\n [ method ]\n *\n * Reset the options of this Interactable\n - options (object) The new settings to apply\n = (object) This Interactable\n \\*/\n set (options) {\n if (!is.object(options)) {\n options = {};\n }\n\n this.options = extend({}, defaults.base);\n\n const perActions = extend({}, defaults.perAction);\n\n for (const actionName in actions.methodDict) {\n const methodName = actions.methodDict[actionName];\n\n this.options[actionName] = extend({}, defaults[actionName]);\n\n this.setPerAction(actionName, perActions);\n\n this[methodName](options[actionName]);\n }\n\n for (const setting of Interactable.settingsMethods) {\n this.options[setting] = defaults.base[setting];\n\n if (setting in options) {\n this[setting](options[setting]);\n }\n }\n\n signals.fire('set', {\n options,\n interactable: this,\n });\n\n return this;\n }\n\n /*\\\n * Interactable.unset\n [ method ]\n *\n * Remove this interactable from the list of interactables and remove\n * it's action capabilities and event listeners\n *\n = (object) @interact\n \\*/\n unset () {\n events.remove(this.target, 'all');\n\n if (is.string(this.target)) {\n // remove delegated events\n for (const type in events.delegatedEvents) {\n const delegated = events.delegatedEvents[type];\n\n if (delegated.selectors[0] === this.target\n && delegated.contexts[0] === this._context) {\n\n delegated.selectors.splice(0, 1);\n delegated.contexts .splice(0, 1);\n delegated.listeners.splice(0, 1);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegated[type] = null;\n }\n }\n\n events.remove(this._context, type, events.delegateListener);\n events.remove(this._context, type, events.delegateUseCapture, true);\n }\n }\n else {\n events.remove(this, 'all');\n }\n\n signals.fire('unset', { interactable: this });\n\n scope.interactables.splice(indexOf(scope.interactables, this), 1);\n\n // Stop related interactions when an Interactable is unset\n for (const interaction of scope.interactions || []) {\n if (interaction.target === this && interaction.interacting()) {\n interaction.stop();\n }\n }\n\n return scope.interact;\n }\n}\n\nscope.interactables.indexOfElement = function indexOfElement (target, context) {\n context = context || scope.document;\n\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n if (interactable.target === target && interactable._context === context) {\n return i;\n }\n }\n return -1;\n};\n\nscope.interactables.get = function interactableGet (element, options, dontCheckInContext) {\n const ret = this[this.indexOfElement(element, options && options.context)];\n\n return ret && (is.string(element) || dontCheckInContext || ret.inContext(element))? ret : null;\n};\n\nscope.interactables.forEachSelector = function (callback, element) {\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n // skip non CSS selector targets and out of context elements\n if (!is.string(interactable.target)\n || (element && !interactable.inContext(element))) {\n continue;\n }\n\n const ret = callback(interactable, interactable.target, interactable._context, i, this);\n\n if (ret !== undefined) {\n return ret;\n }\n }\n};\n\n// all interact.js eventTypes\nInteractable.eventTypes = scope.eventTypes = [];\n\nInteractable.signals = signals;\n\nInteractable.settingsMethods = [ 'deltaSource', 'origin', 'preventDefault', 'rectChecker' ];\n\nmodule.exports = Interactable;\n","const scope = require('./scope');\nconst utils = require('./utils');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst finder = require('./utils/interactionFinder');\nconst signals = require('./utils/Signals').new();\n\nconst listeners = {};\nconst methodNames = [\n 'pointerDown', 'pointerMove', 'pointerUp',\n 'updatePointer', 'removePointer',\n];\n\n// for ignoring browser's simulated mouse events\nlet prevTouchTime = 0;\n\n// all active and idle interactions\nscope.interactions = [];\n\nclass Interaction {\n constructor () {\n this.target = null; // current interactable being interacted with\n this.element = null; // the target element of the interactable\n\n this.prepared = { // action that's ready to be fired on next move event\n name : null,\n axis : null,\n edges: null,\n };\n\n // keep track of added pointers\n this.pointers = [];\n this.pointerIds = [];\n this.downTargets = [];\n this.downTimes = [];\n\n // Previous native pointer move event coordinates\n this.prevCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n // current native pointer move event coordinates\n this.curCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Starting InteractEvent pointer coordinates\n this.startCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Change in coordinates and time of the pointer\n this.pointerDelta = {\n page : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n client : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n timeStamp: 0,\n };\n\n this.downEvent = null; // pointerdown/mousedown/touchstart event\n this.downPointer = {};\n\n this._eventTarget = null;\n this._curEventTarget = null;\n\n this.prevEvent = null; // previous action event\n\n this.pointerIsDown = false;\n this.pointerWasMoved = false;\n this._interacting = false;\n\n this.mouse = false;\n\n signals.fire('new', this);\n\n scope.interactions.push(this);\n }\n\n pointerDown (pointer, event, eventTarget) {\n const pointerIndex = this.updatePointer(pointer, event, true);\n\n signals.fire('down', {\n pointer,\n event,\n eventTarget,\n pointerIndex,\n interaction: this,\n });\n }\n\n /*\\\n * Interaction.start\n [ method ]\n *\n * Start an action with the given Interactable and Element as tartgets. The\n * action must be enabled for the target Interactable and an appropriate number\n * of pointers must be held down - 1 for drag/resize, 2 for gesture.\n *\n * Use it with `interactable.able({ manualStart: false })` to always\n * [start actions manually](https://github.com/taye/interact.js/issues/114)\n *\n - action (object) The action to be performed - drag, resize, etc.\n - target (Interactable) The Interactable to target\n - element (Element) The DOM Element to target\n = (object) interact\n **\n | interact(target)\n | .draggable({\n | // disable the default drag start by down->move\n | manualStart: true\n | })\n | // start dragging after the user holds the pointer down\n | .on('hold', function (event) {\n | var interaction = event.interaction;\n |\n | if (!interaction.interacting()) {\n | interaction.start({ name: 'drag' },\n | event.interactable,\n | event.currentTarget);\n | }\n | });\n \\*/\n start (action, target, element) {\n if (this.interacting()\n || !this.pointerIsDown\n || this.pointerIds.length < (action.name === 'gesture'? 2 : 1)) {\n return;\n }\n\n // if this interaction had been removed after stopping\n // add it back\n if (utils.indexOf(scope.interactions, this) === -1) {\n scope.interactions.push(this);\n }\n\n utils.copyAction(this.prepared, action);\n this.target = target;\n this.element = element;\n\n signals.fire('action-start', {\n interaction: this,\n event: this.downEvent,\n });\n }\n\n pointerMove (pointer, event, eventTarget) {\n if (!this.simulation) {\n this.updatePointer(pointer);\n utils.setCoords(this.curCoords, this.pointers);\n }\n\n const duplicateMove = (this.curCoords.page.x === this.prevCoords.page.x\n && this.curCoords.page.y === this.prevCoords.page.y\n && this.curCoords.client.x === this.prevCoords.client.x\n && this.curCoords.client.y === this.prevCoords.client.y);\n\n let dx;\n let dy;\n\n // register movement greater than pointerMoveTolerance\n if (this.pointerIsDown && !this.pointerWasMoved) {\n dx = this.curCoords.client.x - this.startCoords.client.x;\n dy = this.curCoords.client.y - this.startCoords.client.y;\n\n this.pointerWasMoved = utils.hypot(dx, dy) > Interaction.pointerMoveTolerance;\n }\n\n const signalArg = {\n pointer,\n pointerIndex: this.getPointerIndex(pointer),\n event,\n eventTarget,\n dx,\n dy,\n duplicate: duplicateMove,\n interaction: this,\n interactingBeforeMove: this.interacting(),\n };\n\n if (!duplicateMove) {\n // set pointer coordinate, time changes and speeds\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n }\n\n signals.fire('move', signalArg);\n\n if (!duplicateMove) {\n // if interacting, fire an 'action-move' signal etc\n if (this.interacting()) {\n this.doMove(signalArg);\n }\n\n if (this.pointerWasMoved) {\n utils.copyCoords(this.prevCoords, this.curCoords);\n }\n }\n }\n\n /*\\\n * Interaction.doMove\n [ method ]\n *\n * Force a move of the current action at the same coordinates. Useful if\n * snap/restrict has been changed and you want a movement with the new\n * settings.\n *\n **\n | interact(target)\n | .draggable(true)\n | .on('dragmove', function (event) {\n | if (someCondition) {\n | // change the snap settings\n | event.interactable.draggable({ snap: { targets: [] }});\n | // fire another move event with re-calculated snap\n | event.interaction.doMove();\n | }\n | });\n \\*/\n doMove (signalArg) {\n signalArg = utils.extend({\n pointer: this.pointers[0],\n event: this.prevEvent,\n eventTarget: this._eventTarget,\n interaction: this,\n }, signalArg || {});\n\n signals.fire('before-action-move', signalArg);\n\n if (!this._dontFireMove) {\n signals.fire('action-move', signalArg);\n }\n\n this._dontFireMove = false;\n }\n\n // End interact move events and stop auto-scroll unless simulation is running\n pointerUp (pointer, event, eventTarget, curEventTarget) {\n const pointerIndex = this.getPointerIndex(pointer);\n\n signals.fire(/cancel$/i.test(event.type)? 'cancel' : 'up', {\n pointer,\n pointerIndex,\n event,\n eventTarget,\n curEventTarget,\n interaction: this,\n });\n\n if (!this.simulation) {\n this.end(event);\n }\n\n this.pointerIsDown = false;\n this.removePointer(pointer, event);\n }\n\n /*\\\n * Interaction.end\n [ method ]\n *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n - event (PointerEvent) #optional\n **\n | interact(target)\n | .draggable(true)\n | .on('move', function (event) {\n | if (event.pageX > 1000) {\n | // end the current action\n | event.interaction.end();\n | // stop all further listeners from being called\n | event.stopImmediatePropagation();\n | }\n | });\n \\*/\n end (event) {\n event = event || this.prevEvent;\n\n if (this.interacting()) {\n signals.fire('action-end', {\n event,\n interaction: this,\n });\n }\n\n this.stop();\n }\n\n currentAction () {\n return this._interacting? this.prepared.name: null;\n }\n\n interacting () {\n return this._interacting;\n }\n\n stop () {\n signals.fire('stop', { interaction: this });\n\n if (this._interacting) {\n signals.fire('stop-active', { interaction: this });\n signals.fire('stop-' + this.prepared.name, { interaction: this });\n }\n\n this.target = this.element = null;\n\n this._interacting = false;\n this.prepared.name = this.prevEvent = null;\n }\n\n getPointerIndex (pointer) {\n return utils.indexOf(this.pointerIds, utils.getPointerId(pointer));\n }\n\n updatePointer (pointer, event, down = event && /(down|start)$/i.test(event.type)) {\n const id = utils.getPointerId(pointer);\n let index = this.getPointerIndex(pointer);\n\n if (index === -1) {\n index = this.pointerIds.length;\n this.pointerIds[index] = id;\n }\n\n if (down) {\n signals.fire('update-pointer-down', {\n pointer,\n event,\n down,\n pointerId: id,\n pointerIndex: index,\n interaction: this,\n });\n }\n\n this.pointers[index] = pointer;\n\n return index;\n }\n\n removePointer (pointer, event) {\n const id = utils.getPointerId(pointer);\n const index = this.mouse? 0 : utils.indexOf(this.pointerIds, id);\n\n if (index === -1) { return; }\n\n signals.fire('remove-pointer', {\n pointer,\n event,\n pointerIndex: index,\n interaction: this,\n });\n\n this.pointers .splice(index, 1);\n this.pointerIds .splice(index, 1);\n this.downTargets.splice(index, 1);\n this.downTimes .splice(index, 1);\n }\n\n _updateEventTargets (target, currentTarget) {\n this._eventTarget = target;\n this._curEventTarget = currentTarget;\n }\n}\n\nfor (let i = 0, len = methodNames.length; i < len; i++) {\n const method = methodNames[i];\n\n listeners[method] = doOnInteractions(method);\n}\n\nfunction doOnInteractions (method) {\n return (function (event) {\n const [eventTarget, curEventTarget] = utils.getEventTargets(event);\n const matches = []; // [ [pointer, interaction], ...]\n\n if (browser.supportsTouch && /touch/.test(event.type)) {\n prevTouchTime = new Date().getTime();\n\n for (let i = 0; i < event.changedTouches.length; i++) {\n const pointer = event.changedTouches[i];\n const interaction = finder.search(pointer, event.type, eventTarget);\n\n matches.push([pointer, interaction || new Interaction()]);\n }\n }\n else {\n let invalidPointer = false;\n\n if (!browser.supportsPointerEvent && /mouse/.test(event.type)) {\n // ignore mouse events while touch interactions are active\n for (let i = 0; i < scope.interactions.length && !invalidPointer; i++) {\n invalidPointer = !scope.interactions[i].mouse && scope.interactions[i].pointerIsDown;\n }\n\n // try to ignore mouse events that are simulated by the browser\n // after a touch event\n invalidPointer = invalidPointer\n || (new Date().getTime() - prevTouchTime < 500)\n // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated\n || event.timeStamp === 0;\n }\n\n if (!invalidPointer) {\n let interaction = finder.search(event, event.type, eventTarget);\n\n if (!interaction) {\n\n interaction = new Interaction();\n interaction.mouse = (/mouse/i.test(event.pointerType || event.type)\n // MSPointerEvent.MSPOINTER_TYPE_MOUSE\n || event.pointerType === 4\n || !event.pointerType);\n }\n\n matches.push([event, interaction]);\n }\n }\n\n for (const [pointer, interaction] of matches) {\n interaction._updateEventTargets(eventTarget, curEventTarget);\n interaction[method](pointer, event, eventTarget, curEventTarget);\n }\n });\n}\n\nfunction endAll (event) {\n for (let i = 0; i < scope.interactions.length; i++) {\n const interaction = scope.interactions[i];\n\n interaction.end(event);\n signals.fire('endall', { event, interaction });\n }\n}\n\nconst docEvents = { /* 'eventType': listenerFunc */ };\nconst pEventTypes = browser.pEventTypes;\n\nif (scope.PointerEvent) {\n docEvents[pEventTypes.down ] = listeners.pointerDown;\n docEvents[pEventTypes.move ] = listeners.pointerMove;\n docEvents[pEventTypes.up ] = listeners.pointerUp;\n docEvents[pEventTypes.cancel] = listeners.pointerUp;\n}\nelse {\n docEvents.mousedown = listeners.pointerDown;\n docEvents.mousemove = listeners.pointerMove;\n docEvents.mouseup = listeners.pointerUp;\n\n docEvents.touchstart = listeners.pointerDown;\n docEvents.touchmove = listeners.pointerMove;\n docEvents.touchend = listeners.pointerUp;\n docEvents.touchcancel = listeners.pointerUp;\n}\n\ndocEvents.blur = endAll;\n\nfunction onDocSignal ({ doc }, signalName) {\n const eventMethod = signalName.indexOf('add') === 0\n ? events.add : events.remove;\n\n // delegate event listener\n for (const eventType in scope.delegatedEvents) {\n eventMethod(doc, eventType, events.delegateListener);\n eventMethod(doc, eventType, events.delegateUseCapture, true);\n }\n\n for (const eventType in docEvents) {\n eventMethod(doc, eventType, docEvents[eventType]);\n }\n}\n\nsignals.on('update-pointer-down', ({ interaction, pointer, pointerId, pointerIndex, event, eventTarget, down }) => {\n interaction.pointerIds[pointerIndex] = pointerId;\n interaction.pointers[pointerIndex] = pointer;\n\n if (down) {\n interaction.pointerIsDown = true;\n }\n\n if (!interaction.interacting()) {\n utils.setCoords(interaction.startCoords, interaction.pointers);\n\n utils.copyCoords(interaction.curCoords , interaction.startCoords);\n utils.copyCoords(interaction.prevCoords, interaction.startCoords);\n\n interaction.downEvent = event;\n interaction.downTimes[pointerIndex] = interaction.curCoords.timeStamp;\n interaction.downTargets[pointerIndex] = eventTarget || event && utils.getEventTargets(event)[0];\n interaction.pointerWasMoved = false;\n\n utils.pointerExtend(interaction.downPointer, pointer);\n }\n});\n\nscope.signals.on('add-document' , onDocSignal);\nscope.signals.on('remove-document', onDocSignal);\n\nInteraction.pointerMoveTolerance = 1;\nInteraction.doOnInteractions = doOnInteractions;\nInteraction.endAll = endAll;\nInteraction.signals = signals;\nInteraction.docEvents = docEvents;\n\nscope.endAllInteractions = endAll;\n\nmodule.exports = Interaction;\n","const Interaction = require('../Interaction');\nconst InteractEvent = require('../InteractEvent');\n\nconst actions = {\n firePrepared,\n names: [],\n methodDict: {},\n};\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n interaction._interacting = true;\n firePrepared(interaction, event, 'start');\n});\n\nInteraction.signals.on('action-move', function ({ interaction, event, preEnd }) {\n firePrepared(interaction, event, 'move', preEnd);\n\n // if the action was ended in a listener\n if (!interaction.interacting()) { return false; }\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n firePrepared(interaction, event, 'end');\n});\n\nfunction firePrepared (interaction, event, phase, preEnd) {\n const actionName = interaction.prepared.name;\n\n const newEvent = new InteractEvent(interaction, event, actionName, phase, interaction.element, null, preEnd);\n\n interaction.target.fire(newEvent);\n interaction.prevEvent = newEvent;\n}\n\nmodule.exports = actions;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drag = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n startAxis : 'xy',\n lockAxis : 'xy',\n },\n\n checker: function (pointer, event, interactable) {\n const dragOptions = interactable.options.drag;\n\n return dragOptions.enabled\n ? { name: 'drag', axis: (dragOptions.lockAxis === 'start'\n ? dragOptions.startAxis\n : dragOptions.lockAxis)}\n : null;\n },\n\n getCursor: function () {\n return 'move';\n },\n};\n\nInteraction.signals.on('before-action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n interaction.curCoords.page.y = interaction.startCoords.page.y;\n interaction.curCoords.client.y = interaction.startCoords.client.y;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vx);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vx);\n interaction.pointerDelta.client.vy = 0;\n interaction.pointerDelta.page.vy = 0;\n }\n else if (axis === 'y') {\n interaction.curCoords.page.x = interaction.startCoords.page.x;\n interaction.curCoords.client.x = interaction.startCoords.client.x;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vy);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vy);\n interaction.pointerDelta.client.vx = 0;\n interaction.pointerDelta.page.vx = 0;\n }\n});\n\n// dragmove\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'dragmove') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n iEvent.pageY = interaction.startCoords.page.y;\n iEvent.clientY = interaction.startCoords.client.y;\n iEvent.dy = 0;\n }\n else if (axis === 'y') {\n iEvent.pageX = interaction.startCoords.page.x;\n iEvent.clientX = interaction.startCoords.client.x;\n iEvent.dx = 0;\n }\n});\n\n/*\\\n * Interactable.draggable\n [ method ]\n *\n * Gets or sets whether drag actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of drag events\n | var isDraggable = interact('ul li').draggable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on drag events (object makes the Interactable draggable)\n = (object) This Interactable\n | interact(element).draggable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // the axis in which the first movement must be\n | // for the drag sequence to start\n | // 'xy' by default - any direction\n | startAxis: 'x' || 'y' || 'xy',\n |\n | // 'xy' by default - don't restrict to one axis (move in any direction)\n | // 'x' or 'y' to restrict movement to either axis\n | // 'start' to restrict movement to the axis the drag started in\n | lockAxis: 'x' || 'y' || 'xy' || 'start',\n |\n | // max number of drags that can happen concurrently\n | // with elements of this Interactable. Infinity by default\n | max: Infinity,\n |\n | // max number of drags that can target the same element+Interactable\n | // 1 by default\n | maxPerElement: 2\n | });\n\\*/\nInteractable.prototype.draggable = function (options) {\n if (utils.is.object(options)) {\n this.options.drag.enabled = options.enabled === false? false: true;\n this.setPerAction('drag', options);\n this.setOnEvents('drag', options);\n\n if (/^(xy|x|y|start)$/.test(options.lockAxis)) {\n this.options.drag.lockAxis = options.lockAxis;\n }\n if (/^(xy|x|y)$/.test(options.startAxis)) {\n this.options.drag.startAxis = options.startAxis;\n }\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drag.enabled = options;\n\n if (!options) {\n this.ondragstart = this.ondragstart = this.ondragend = null;\n }\n\n return this;\n }\n\n return this.options.drag;\n};\n\nactions.drag = drag;\nactions.names.push('drag');\nutils.merge(Interactable.eventTypes, [\n 'dragstart',\n 'dragmove',\n 'draginertiastart',\n 'draginertiaresume',\n 'dragend',\n]);\nactions.methodDict.drag = 'draggable';\n\ndefaultOptions.drag = drag.defaults;\n\nmodule.exports = drag;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst scope = require('../scope');\nconst interact = require('../interact');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drop = {\n defaults: {\n enabled: false,\n accept : null,\n overlap: 'pointer',\n },\n};\n\nlet dynamicDrop = false;\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // reset active dropzones\n interaction.activeDrops.dropzones = [];\n interaction.activeDrops.elements = [];\n interaction.activeDrops.rects = [];\n\n interaction.dropEvents = null;\n\n if (!interaction.dynamicDrop) {\n setActiveDrops(interaction, interaction.element);\n }\n\n const dragEvent = interaction.prevEvent;\n const dropEvents = getDropEvents(interaction, event, dragEvent);\n\n if (dropEvents.activate) {\n fireActiveDrops(interaction, dropEvents.activate);\n }\n});\n\nInteractEvent.signals.on('new', function ({ interaction, iEvent, event }) {\n if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { return; }\n\n const draggableElement = interaction.element;\n const dragEvent = iEvent;\n const dropResult = getDrop(dragEvent, event, draggableElement);\n\n interaction.dropTarget = dropResult.dropzone;\n interaction.dropElement = dropResult.element;\n\n interaction.dropEvents = getDropEvents(interaction, event, dragEvent);\n});\n\nInteraction.signals.on('action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n fireDropEvents(interaction, interaction.dropEvents);\n});\n\nInteraction.signals.on('action-end', function ({ interaction }) {\n if (interaction.prepared.name === 'drag') {\n fireDropEvents(interaction, interaction.dropEvents);\n }\n});\n\nInteraction.signals.on('stop-drag', function ({ interaction }) {\n interaction.activeDrops.dropzones =\n interaction.activeDrops.elements =\n interaction.activeDrops.rects =\n interaction.dropEvents = null;\n});\n\nfunction collectDrops (interaction, element) {\n const drops = [];\n const elements = [];\n\n element = element || interaction.element;\n\n // collect all dropzones and their elements which qualify for a drop\n for (const current of scope.interactables) {\n if (!current.options.drop.enabled) { continue; }\n\n const accept = current.options.drop.accept;\n\n // test the draggable element against the dropzone's accept setting\n if ((utils.is.element(accept) && accept !== element)\n || (utils.is.string(accept)\n && !utils.matchesSelector(element, accept))) {\n\n continue;\n }\n\n // query for new elements if necessary\n const dropElements = utils.is.string(current.target)\n ? current._context.querySelectorAll(current.target)\n : [current.target];\n\n for (let i = 0; i < dropElements.length; i++) {\n const currentElement = dropElements[i];\n\n if (currentElement !== element) {\n drops.push(current);\n elements.push(currentElement);\n }\n }\n }\n\n return {\n elements,\n dropzones: drops,\n };\n}\n\nfunction fireActiveDrops (interaction, event) {\n let prevElement;\n\n // loop through all active dropzones and trigger event\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n const current = interaction.activeDrops.dropzones[i];\n const currentElement = interaction.activeDrops.elements [i];\n\n // prevent trigger of duplicate events on same element\n if (currentElement !== prevElement) {\n // set current element as event target\n event.target = currentElement;\n current.fire(event);\n }\n prevElement = currentElement;\n }\n}\n\n// Collect a new set of possible drops and save them in activeDrops.\n// setActiveDrops should always be called when a drag has just started or a\n// drag event happens while dynamicDrop is true\nfunction setActiveDrops (interaction, dragElement) {\n // get dropzones and their elements that could receive the draggable\n const possibleDrops = collectDrops(interaction, dragElement, true);\n\n interaction.activeDrops.dropzones = possibleDrops.dropzones;\n interaction.activeDrops.elements = possibleDrops.elements;\n interaction.activeDrops.rects = [];\n\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n interaction.activeDrops.rects[i] =\n interaction.activeDrops.dropzones[i].getRect(interaction.activeDrops.elements[i]);\n }\n}\n\nfunction getDrop (dragEvent, event, dragElement) {\n const interaction = dragEvent.interaction;\n const validDrops = [];\n\n if (dynamicDrop) {\n setActiveDrops(interaction, dragElement);\n }\n\n // collect all dropzones and their elements which qualify for a drop\n for (let j = 0; j < interaction.activeDrops.dropzones.length; j++) {\n const current = interaction.activeDrops.dropzones[j];\n const currentElement = interaction.activeDrops.elements [j];\n const rect = interaction.activeDrops.rects [j];\n\n validDrops.push(current.dropCheck(dragEvent, event, interaction.target, dragElement, currentElement, rect)\n ? currentElement\n : null);\n }\n\n // get the most appropriate dropzone based on DOM depth and order\n const dropIndex = utils.indexOfDeepestElement(validDrops);\n\n return {\n dropzone: interaction.activeDrops.dropzones[dropIndex] || null,\n element : interaction.activeDrops.elements [dropIndex] || null,\n };\n}\n\nfunction getDropEvents (interaction, pointerEvent, dragEvent) {\n const dropEvents = {\n enter : null,\n leave : null,\n activate : null,\n deactivate: null,\n move : null,\n drop : null,\n };\n\n const tmpl = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n };\n\n if (interaction.dropElement !== interaction.prevDropElement) {\n // if there was a prevDropTarget, create a dragleave event\n if (interaction.prevDropTarget) {\n dropEvents.leave = utils.extend({ type: 'dragleave' }, tmpl);\n\n dragEvent.dragLeave = dropEvents.leave.target = interaction.prevDropElement;\n dragEvent.prevDropzone = dropEvents.leave.dropzone = interaction.prevDropTarget;\n }\n // if the dropTarget is not null, create a dragenter event\n if (interaction.dropTarget) {\n dropEvents.enter = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n type : 'dragenter',\n };\n\n dragEvent.dragEnter = interaction.dropElement;\n dragEvent.dropzone = interaction.dropTarget;\n }\n }\n\n if (dragEvent.type === 'dragend' && interaction.dropTarget) {\n dropEvents.drop = utils.extend({ type: 'drop' }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n dragEvent.relatedTarget = interaction.dropElement;\n }\n if (dragEvent.type === 'dragstart') {\n dropEvents.activate = utils.extend({ type: 'dropactivate' }, tmpl);\n\n dropEvents.activate.target = null;\n dropEvents.activate.dropzone = null;\n }\n if (dragEvent.type === 'dragend') {\n dropEvents.deactivate = utils.extend({ type: 'dropdeactivate' }, tmpl);\n\n dropEvents.deactivate.target = null;\n dropEvents.deactivate.dropzone = null;\n }\n if (dragEvent.type === 'dragmove' && interaction.dropTarget) {\n dropEvents.move = utils.extend({\n dragmove : dragEvent,\n type : 'dropmove',\n }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n }\n\n return dropEvents;\n}\n\nfunction fireDropEvents (interaction, dropEvents) {\n if (dropEvents.leave) { interaction.prevDropTarget.fire(dropEvents.leave); }\n if (dropEvents.move ) { interaction.dropTarget.fire(dropEvents.move ); }\n if (dropEvents.enter) { interaction.dropTarget.fire(dropEvents.enter); }\n if (dropEvents.drop ) { interaction.dropTarget.fire(dropEvents.drop ); }\n if (dropEvents.deactivate) {\n fireActiveDrops(interaction, dropEvents.deactivate);\n }\n\n interaction.prevDropTarget = interaction.dropTarget;\n interaction.prevDropElement = interaction.dropElement;\n}\n\n/*\\\n * Interactable.dropzone\n [ method ]\n *\n * Returns or sets whether elements can be dropped onto this\n * Interactable to trigger drop events\n *\n * Dropzones can receive the following events:\n * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends\n * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone\n * - `dragmove` when a draggable that has entered the dropzone is moved\n * - `drop` when a draggable is dropped into this dropzone\n *\n * Use the `accept` option to allow only elements that match the given CSS\n * selector or element. The value can be:\n *\n * - **an Element** - only that element can be dropped into this dropzone.\n * - **a string**, - the element being dragged must match it as a CSS selector.\n * - **`null`** - accept options is cleared - it accepts any element.\n *\n * Use the `overlap` option to set how drops are checked for. The allowed\n * values are:\n *\n * - `'pointer'`, the pointer must be over the dropzone (default)\n * - `'center'`, the draggable element's center must be over the dropzone\n * - a number from 0-1 which is the `(intersection area) / (draggable area)`.\n * e.g. `0.5` for drop to happen when half of the area of the draggable is\n * over the dropzone\n *\n * Use the `checker` option to specify a function to check if a dragged\n * element is over this Interactable.\n *\n | interact(target)\n | .dropChecker(function(dragEvent, // related dragmove or dragend event\n | event, // TouchEvent/PointerEvent/MouseEvent\n | dropped, // bool result of the default checker\n | dropzone, // dropzone Interactable\n | dropElement, // dropzone elemnt\n | draggable, // draggable Interactable\n | draggableElement) {// draggable element\n |\n | return dropped && event.target.hasAttribute('allow-drop');\n | }\n *\n *\n - options (boolean | object | null) #optional The new value to be set.\n | interact('.drop').dropzone({\n | accept: '.can-drop' || document.getElementById('single-drop'),\n | overlap: 'pointer' || 'center' || zeroToOne\n | }\n = (boolean | object) The current setting or this Interactable\n\\*/\nInteractable.prototype.dropzone = function (options) {\n if (utils.is.object(options)) {\n this.options.drop.enabled = options.enabled === false? false: true;\n\n if (utils.is.function(options.ondrop) ) { this.events.ondrop = options.ondrop ; }\n if (utils.is.function(options.ondropactivate) ) { this.events.ondropactivate = options.ondropactivate ; }\n if (utils.is.function(options.ondropdeactivate)) { this.events.ondropdeactivate = options.ondropdeactivate; }\n if (utils.is.function(options.ondragenter) ) { this.events.ondragenter = options.ondragenter ; }\n if (utils.is.function(options.ondragleave) ) { this.events.ondragleave = options.ondragleave ; }\n if (utils.is.function(options.ondropmove) ) { this.events.ondropmove = options.ondropmove ; }\n\n if (/^(pointer|center)$/.test(options.overlap)) {\n this.options.drop.overlap = options.overlap;\n }\n else if (utils.is.number(options.overlap)) {\n this.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0);\n }\n if ('accept' in options) {\n this.options.drop.accept = options.accept;\n }\n if ('checker' in options) {\n this.options.drop.checker = options.checker;\n }\n\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drop.enabled = options;\n\n if (!options) {\n this.ondragenter = this.ondragleave = this.ondrop\n = this.ondropactivate = this.ondropdeactivate = null;\n }\n\n return this;\n }\n\n return this.options.drop;\n};\n\nInteractable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) {\n let dropped = false;\n\n // if the dropzone has no rect (eg. display: none)\n // call the custom dropChecker or just return false\n if (!(rect = rect || this.getRect(dropElement))) {\n return (this.options.drop.checker\n ? this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement)\n : false);\n }\n\n const dropOverlap = this.options.drop.overlap;\n\n if (dropOverlap === 'pointer') {\n const origin = utils.getOriginXY(draggable, draggableElement, 'drag');\n const page = utils.getPageXY(dragEvent);\n\n page.x += origin.x;\n page.y += origin.y;\n\n const horizontal = (page.x > rect.left) && (page.x < rect.right);\n const vertical = (page.y > rect.top ) && (page.y < rect.bottom);\n\n dropped = horizontal && vertical;\n }\n\n const dragRect = draggable.getRect(draggableElement);\n\n if (dragRect && dropOverlap === 'center') {\n const cx = dragRect.left + dragRect.width / 2;\n const cy = dragRect.top + dragRect.height / 2;\n\n dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom;\n }\n\n if (dragRect && utils.is.number(dropOverlap)) {\n const overlapArea = (Math.max(0, Math.min(rect.right , dragRect.right ) - Math.max(rect.left, dragRect.left))\n * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top , dragRect.top )));\n\n const overlapRatio = overlapArea / (dragRect.width * dragRect.height);\n\n dropped = overlapRatio >= dropOverlap;\n }\n\n if (this.options.drop.checker) {\n dropped = this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement);\n }\n\n return dropped;\n};\n\nInteractable.signals.on('unset', function ({ interactable }) {\n interactable.dropzone(false);\n});\n\nInteractable.settingsMethods.push('dropChecker');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.dropTarget = null; // the dropzone a drag target might be dropped into\n interaction.dropElement = null; // the element at the time of checking\n interaction.prevDropTarget = null; // the dropzone that was recently dragged away from\n interaction.prevDropElement = null; // the element at the time of checking\n interaction.dropEvents = null; // the dropEvents related to the current drag event\n\n interaction.activeDrops = {\n dropzones: [], // the dropzones that are mentioned below\n elements : [], // elements of dropzones that accept the target draggable\n rects : [], // the rects of the elements mentioned above\n };\n\n});\n\nInteraction.signals.on('stop', function ({ interaction }) {\n interaction.dropTarget = interaction.dropElement =\n interaction.prevDropTarget = interaction.prevDropElement = null;\n});\n\n/*\\\n * interact.dynamicDrop\n [ method ]\n *\n * Returns or sets whether the dimensions of dropzone elements are\n * calculated on every dragmove or only on dragstart for the default\n * dropChecker\n *\n - newValue (boolean) #optional True to check on each move. False to check only before start\n = (boolean | interact) The current setting or interact\n\\*/\ninteract.dynamicDrop = function (newValue) {\n if (utils.is.bool(newValue)) {\n //if (dragging && dynamicDrop !== newValue && !newValue) {\n //calcRects(dropzones);\n //}\n\n dynamicDrop = newValue;\n\n return interact;\n }\n return dynamicDrop;\n};\n\nutils.merge(Interactable.eventTypes, [\n 'dragenter',\n 'dragleave',\n 'dropactivate',\n 'dropdeactivate',\n 'dropmove',\n 'drop',\n]);\nactions.methodDict.drop = 'dropzone';\n\ndefaultOptions.drop = drop.defaults;\n\nmodule.exports = drop;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst gesture = {\n defaults: {\n enabled : false,\n origin : null,\n restrict: null,\n },\n\n checker: function (pointer, event, interactable, element, interaction) {\n if (interaction.pointerIds.length >= 2) {\n return { name: 'gesture' };\n }\n\n return null;\n },\n\n getCursor: function () {\n return '';\n },\n};\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturestart') { return; }\n iEvent.ds = 0;\n\n interaction.gesture.startDistance = interaction.gesture.prevDistance = iEvent.distance;\n interaction.gesture.startAngle = interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.scale = 1;\n});\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturemove') { return; }\n\n iEvent.ds = iEvent.scale - interaction.gesture.scale;\n\n interaction.target.fire(iEvent);\n\n interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.prevDistance = iEvent.distance;\n\n if (iEvent.scale !== Infinity\n && iEvent.scale !== null\n && iEvent.scale !== undefined\n && !isNaN(iEvent.scale)) {\n\n interaction.gesture.scale = iEvent.scale;\n }\n});\n\n/*\\\n * Interactable.gesturable\n [ method ]\n *\n * Gets or sets whether multitouch gestures can be performed on the\n * Interactable's element\n *\n = (boolean) Indicates if this can be the target of gesture events\n | var isGestureable = interact(element).gesturable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on gesture events (makes the Interactable gesturable)\n = (object) this Interactable\n | interact(element).gesturable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // limit multiple gestures.\n | // See the explanation in @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n\\*/\nInteractable.prototype.gesturable = function (options) {\n if (utils.is.object(options)) {\n this.options.gesture.enabled = options.enabled === false? false: true;\n this.setPerAction('gesture', options);\n this.setOnEvents('gesture', options);\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.gesture.enabled = options;\n\n if (!options) {\n this.ongesturestart = this.ongesturestart = this.ongestureend = null;\n }\n\n return this;\n }\n\n return this.options.gesture;\n};\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action, event, starting, ending, deltaSource }) {\n if (action !== 'gesture') { return; }\n\n const pointers = interaction.pointers;\n\n iEvent.touches = [pointers[0], pointers[1]];\n\n if (starting) {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = 1;\n iEvent.ds = 0;\n iEvent.angle = utils.touchAngle(pointers, undefined, deltaSource);\n iEvent.da = 0;\n }\n else if (ending || event instanceof InteractEvent) {\n iEvent.distance = interaction.prevEvent.distance;\n iEvent.box = interaction.prevEvent.box;\n iEvent.scale = interaction.prevEvent.scale;\n iEvent.ds = iEvent.scale - 1;\n iEvent.angle = interaction.prevEvent.angle;\n iEvent.da = iEvent.angle - interaction.gesture.startAngle;\n }\n else {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = iEvent.distance / interaction.gesture.startDistance;\n iEvent.angle = utils.touchAngle(pointers, interaction.gesture.prevAngle, deltaSource);\n\n iEvent.ds = iEvent.scale - interaction.gesture.prevScale;\n iEvent.da = iEvent.angle - interaction.gesture.prevAngle;\n }\n});\n\nInteraction.signals.on('new', function (interaction) {\n interaction.gesture = {\n start: { x: 0, y: 0 },\n\n startDistance: 0, // distance between two touches of touchStart\n prevDistance : 0,\n distance : 0,\n\n scale: 1, // gesture.distance / gesture.startDistance\n\n startAngle: 0, // angle of line joining two touches\n prevAngle : 0, // angle of the previous gesture event\n };\n});\n\nactions.gesture = gesture;\nactions.names.push('gesture');\nutils.merge(Interactable.eventTypes, [\n 'gesturestart',\n 'gesturemove',\n 'gestureend',\n]);\nactions.methodDict.gesture = 'gesturable';\n\ndefaultOptions.gesture = gesture.defaults;\n\nmodule.exports = gesture;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\n// Less Precision with touch input\nconst defaultMargin = browser.supportsTouch || browser.supportsPointerEvent? 20: 10;\n\nconst resize = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n square: false,\n preserveAspectRatio: false,\n axis: 'xy',\n\n // use default margin\n margin: NaN,\n\n // object with props left, right, top, bottom which are\n // true/false values to resize when the pointer is over that edge,\n // CSS selectors to match the handles for each direction\n // or the Elements for each handle\n edges: null,\n\n // a value of 'none' will limit the resize rect to a minimum of 0x0\n // 'negate' will alow the rect to have negative width/height\n // 'reposition' will keep the width/height positive by swapping\n // the top and bottom edges and/or swapping the left and right edges\n invert: 'none',\n },\n\n checker: function (pointer, event, interactable, element, interaction, rect) {\n if (!rect) { return null; }\n\n const page = utils.extend({}, interaction.curCoords.page);\n const options = interactable.options;\n\n if (options.resize.enabled) {\n const resizeOptions = options.resize;\n const resizeEdges = { left: false, right: false, top: false, bottom: false };\n\n // if using resize.edges\n if (utils.is.object(resizeOptions.edges)) {\n for (const edge in resizeEdges) {\n resizeEdges[edge] = checkResizeEdge(edge,\n resizeOptions.edges[edge],\n page,\n interaction._eventTarget,\n element,\n rect,\n resizeOptions.margin || defaultMargin);\n }\n\n resizeEdges.left = resizeEdges.left && !resizeEdges.right;\n resizeEdges.top = resizeEdges.top && !resizeEdges.bottom;\n\n if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) {\n return {\n name: 'resize',\n edges: resizeEdges,\n };\n }\n }\n else {\n const right = options.resize.axis !== 'y' && page.x > (rect.right - defaultMargin);\n const bottom = options.resize.axis !== 'x' && page.y > (rect.bottom - defaultMargin);\n\n if (right || bottom) {\n return {\n name: 'resize',\n axes: (right? 'x' : '') + (bottom? 'y' : ''),\n };\n }\n }\n }\n\n return null;\n },\n\n cursors: (browser.isIe9OrOlder ? {\n x : 'e-resize',\n y : 's-resize',\n xy: 'se-resize',\n\n top : 'n-resize',\n left : 'w-resize',\n bottom : 's-resize',\n right : 'e-resize',\n topleft : 'se-resize',\n bottomright: 'se-resize',\n topright : 'ne-resize',\n bottomleft : 'ne-resize',\n } : {\n x : 'ew-resize',\n y : 'ns-resize',\n xy: 'nwse-resize',\n\n top : 'ns-resize',\n left : 'ew-resize',\n bottom : 'ns-resize',\n right : 'ew-resize',\n topleft : 'nwse-resize',\n bottomright: 'nwse-resize',\n topright : 'nesw-resize',\n bottomleft : 'nesw-resize',\n }),\n\n getCursor: function (action) {\n if (action.axis) {\n return resize.cursors[action.name + action.axis];\n }\n else if (action.edges) {\n let cursorKey = '';\n const edgeNames = ['top', 'bottom', 'left', 'right'];\n\n for (let i = 0; i < 4; i++) {\n if (action.edges[edgeNames[i]]) {\n cursorKey += edgeNames[i];\n }\n }\n\n return resize.cursors[cursorKey];\n }\n },\n};\n\n// resizestart\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'resizestart' || !interaction.prepared.edges) {\n return;\n }\n\n const startRect = interaction.target.getRect(interaction.element);\n const resizeOptions = interaction.target.options.resize;\n\n /*\n * When using the `resizable.square` or `resizable.preserveAspectRatio` options, resizing from one edge\n * will affect another. E.g. with `resizable.square`, resizing to make the right edge larger will make\n * the bottom edge larger by the same amount. We call these 'linked' edges. Any linked edges will depend\n * on the active edges and the edge being interacted with.\n */\n if (resizeOptions.square || resizeOptions.preserveAspectRatio) {\n const linkedEdges = utils.extend({}, interaction.prepared.edges);\n\n linkedEdges.top = linkedEdges.top || (linkedEdges.left && !linkedEdges.bottom);\n linkedEdges.left = linkedEdges.left || (linkedEdges.top && !linkedEdges.right );\n linkedEdges.bottom = linkedEdges.bottom || (linkedEdges.right && !linkedEdges.top );\n linkedEdges.right = linkedEdges.right || (linkedEdges.bottom && !linkedEdges.left );\n\n interaction.prepared._linkedEdges = linkedEdges;\n }\n else {\n interaction.prepared._linkedEdges = null;\n }\n\n // if using `resizable.preserveAspectRatio` option, record aspect ratio at the start of the resize\n if (resizeOptions.preserveAspectRatio) {\n interaction.resizeStartAspectRatio = startRect.width / startRect.height;\n }\n\n interaction.resizeRects = {\n start : startRect,\n current : utils.extend({}, startRect),\n inverted : utils.extend({}, startRect),\n previous : utils.extend({}, startRect),\n delta : {\n left: 0, right : 0, width : 0,\n top : 0, bottom: 0, height: 0,\n },\n };\n\n iEvent.rect = interaction.resizeRects.inverted;\n iEvent.deltaRect = interaction.resizeRects.delta;\n});\n\n// resizemove\nInteractEvent.signals.on('new', function ({ iEvent, phase, interaction }) {\n if (phase !== 'move' || !interaction.prepared.edges) { return; }\n\n const resizeOptions = interaction.target.options.resize;\n const invert = resizeOptions.invert;\n const invertible = invert === 'reposition' || invert === 'negate';\n\n let edges = interaction.prepared.edges;\n\n const start = interaction.resizeRects.start;\n const current = interaction.resizeRects.current;\n const inverted = interaction.resizeRects.inverted;\n const delta = interaction.resizeRects.delta;\n const previous = utils.extend(interaction.resizeRects.previous, inverted);\n const originalEdges = edges;\n\n let dx = iEvent.dx;\n let dy = iEvent.dy;\n\n if (resizeOptions.preserveAspectRatio || resizeOptions.square) {\n // `resize.preserveAspectRatio` takes precedence over `resize.square`\n const startAspectRatio = resizeOptions.preserveAspectRatio\n ? interaction.resizeStartAspectRatio\n : 1;\n\n edges = interaction.prepared._linkedEdges;\n\n if ((originalEdges.left && originalEdges.bottom)\n || (originalEdges.right && originalEdges.top)) {\n dy = -dx / startAspectRatio;\n }\n else if (originalEdges.left || originalEdges.right ) { dy = dx / startAspectRatio; }\n else if (originalEdges.top || originalEdges.bottom) { dx = dy * startAspectRatio; }\n }\n\n // update the 'current' rect without modifications\n if (edges.top ) { current.top += dy; }\n if (edges.bottom) { current.bottom += dy; }\n if (edges.left ) { current.left += dx; }\n if (edges.right ) { current.right += dx; }\n\n if (invertible) {\n // if invertible, copy the current rect\n utils.extend(inverted, current);\n\n if (invert === 'reposition') {\n // swap edge values if necessary to keep width/height positive\n let swap;\n\n if (inverted.top > inverted.bottom) {\n swap = inverted.top;\n\n inverted.top = inverted.bottom;\n inverted.bottom = swap;\n }\n if (inverted.left > inverted.right) {\n swap = inverted.left;\n\n inverted.left = inverted.right;\n inverted.right = swap;\n }\n }\n }\n else {\n // if not invertible, restrict to minimum of 0x0 rect\n inverted.top = Math.min(current.top, start.bottom);\n inverted.bottom = Math.max(current.bottom, start.top);\n inverted.left = Math.min(current.left, start.right);\n inverted.right = Math.max(current.right, start.left);\n }\n\n inverted.width = inverted.right - inverted.left;\n inverted.height = inverted.bottom - inverted.top ;\n\n for (const edge in inverted) {\n delta[edge] = inverted[edge] - previous[edge];\n }\n\n iEvent.edges = interaction.prepared.edges;\n iEvent.rect = inverted;\n iEvent.deltaRect = delta;\n});\n\n/*\\\n * Interactable.resizable\n [ method ]\n *\n * Gets or sets whether resize actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of resize elements\n | var isResizeable = interact('input[type=text]').resizable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on resize events (object makes the Interactable resizable)\n = (object) This Interactable\n | interact(element).resizable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | edges: {\n | top : true, // Use pointer coords to check for resize.\n | left : false, // Disable resizing from left edge.\n | bottom: '.resize-s',// Resize if pointer target matches selector\n | right : handleEl // Resize if pointer target is the given Element\n | },\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height are adjusted at a 1:1 ratio.\n | square: false,\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height maintain the aspect ratio they had when resizing started.\n | preserveAspectRatio: false,\n |\n | // a value of 'none' will limit the resize rect to a minimum of 0x0\n | // 'negate' will allow the rect to have negative width/height\n | // 'reposition' will keep the width/height positive by swapping\n | // the top and bottom edges and/or swapping the left and right edges\n | invert: 'none' || 'negate' || 'reposition'\n |\n | // limit multiple resizes.\n | // See the explanation in the @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n \\*/\nInteractable.prototype.resizable = function (options) {\n if (utils.is.object(options)) {\n this.options.resize.enabled = options.enabled === false? false: true;\n this.setPerAction('resize', options);\n this.setOnEvents('resize', options);\n\n if (/^x$|^y$|^xy$/.test(options.axis)) {\n this.options.resize.axis = options.axis;\n }\n else if (options.axis === null) {\n this.options.resize.axis = defaultOptions.resize.axis;\n }\n\n if (utils.is.bool(options.preserveAspectRatio)) {\n this.options.resize.preserveAspectRatio = options.preserveAspectRatio;\n }\n else if (utils.is.bool(options.square)) {\n this.options.resize.square = options.square;\n }\n\n return this;\n }\n if (utils.is.bool(options)) {\n this.options.resize.enabled = options;\n\n if (!options) {\n this.onresizestart = this.onresizestart = this.onresizeend = null;\n }\n\n return this;\n }\n return this.options.resize;\n};\n\nfunction checkResizeEdge (name, value, page, element, interactableElement, rect, margin) {\n // false, '', undefined, null\n if (!value) { return false; }\n\n // true value, use pointer coords and element rect\n if (value === true) {\n // if dimensions are negative, \"switch\" edges\n const width = utils.is.number(rect.width )? rect.width : rect.right - rect.left;\n const height = utils.is.number(rect.height)? rect.height : rect.bottom - rect.top ;\n\n if (width < 0) {\n if (name === 'left' ) { name = 'right'; }\n else if (name === 'right') { name = 'left' ; }\n }\n if (height < 0) {\n if (name === 'top' ) { name = 'bottom'; }\n else if (name === 'bottom') { name = 'top' ; }\n }\n\n if (name === 'left' ) { return page.x < ((width >= 0? rect.left: rect.right ) + margin); }\n if (name === 'top' ) { return page.y < ((height >= 0? rect.top : rect.bottom) + margin); }\n\n if (name === 'right' ) { return page.x > ((width >= 0? rect.right : rect.left) - margin); }\n if (name === 'bottom') { return page.y > ((height >= 0? rect.bottom: rect.top ) - margin); }\n }\n\n // the remaining checks require an element\n if (!utils.is.element(element)) { return false; }\n\n return utils.is.element(value)\n // the value is an element to use as a resize handle\n ? value === element\n // otherwise check if element matches value as selector\n : utils.matchesUpTo(element, value, interactableElement);\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.resizeAxes = 'xy';\n});\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action }) {\n if (action !== 'resize' || !interaction.resizeAxes) { return; }\n\n const options = interaction.target.options;\n\n if (options.resize.square) {\n if (interaction.resizeAxes === 'y') {\n iEvent.dx = iEvent.dy;\n }\n else {\n iEvent.dy = iEvent.dx;\n }\n iEvent.axes = 'xy';\n }\n else {\n iEvent.axes = interaction.resizeAxes;\n\n if (interaction.resizeAxes === 'x') {\n iEvent.dy = 0;\n }\n else if (interaction.resizeAxes === 'y') {\n iEvent.dx = 0;\n }\n }\n});\n\nactions.resize = resize;\nactions.names.push('resize');\nutils.merge(Interactable.eventTypes, [\n 'resizestart',\n 'resizemove',\n 'resizeinertiastart',\n 'resizeinertiaresume',\n 'resizeend',\n]);\nactions.methodDict.resize = 'resizable';\n\ndefaultOptions.resize = resize.defaults;\n\nmodule.exports = resize;\n","const raf = require('./utils/raf');\nconst getWindow = require('./utils/window').getWindow;\nconst is = require('./utils/is');\nconst domUtils = require('./utils/domUtils');\nconst Interaction = require('./Interaction');\nconst defaultOptions = require('./defaultOptions');\n\nconst autoScroll = {\n defaults: {\n enabled : false,\n container: null, // the item that is scrolled (Window or HTMLElement)\n margin : 60,\n speed : 300, // the scroll speed in pixels per second\n },\n\n interaction: null,\n i: null, // the handle returned by window.setInterval\n x: 0, y: 0, // Direction each pulse is to scroll in\n\n isScrolling: false,\n prevTime: 0,\n\n start: function (interaction) {\n autoScroll.isScrolling = true;\n raf.cancel(autoScroll.i);\n\n autoScroll.interaction = interaction;\n autoScroll.prevTime = new Date().getTime();\n autoScroll.i = raf.request(autoScroll.scroll);\n },\n\n stop: function () {\n autoScroll.isScrolling = false;\n raf.cancel(autoScroll.i);\n },\n\n // scroll the window by the values in scroll.x/y\n scroll: function () {\n const options = autoScroll.interaction.target.options[autoScroll.interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(autoScroll.interaction.element);\n const now = new Date().getTime();\n // change in time in seconds\n const dt = (now - autoScroll.prevTime) / 1000;\n // displacement\n const s = options.speed * dt;\n\n if (s >= 1) {\n if (is.window(container)) {\n container.scrollBy(autoScroll.x * s, autoScroll.y * s);\n }\n else if (container) {\n container.scrollLeft += autoScroll.x * s;\n container.scrollTop += autoScroll.y * s;\n }\n\n autoScroll.prevTime = now;\n }\n\n if (autoScroll.isScrolling) {\n raf.cancel(autoScroll.i);\n autoScroll.i = raf.request(autoScroll.scroll);\n }\n },\n check: function (interactable, actionName) {\n const options = interactable.options;\n\n return options[actionName].autoScroll && options[actionName].autoScroll.enabled;\n },\n onInteractionMove: function ({ interaction, pointer }) {\n if (!(interaction.interacting()\n && autoScroll.check(interaction.target, interaction.prepared.name))) {\n return;\n }\n\n if (interaction.simulation) {\n autoScroll.x = autoScroll.y = 0;\n return;\n }\n\n let top;\n let right;\n let bottom;\n let left;\n\n const options = interaction.target.options[interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(interaction.element);\n\n if (is.window(container)) {\n left = pointer.clientX < autoScroll.margin;\n top = pointer.clientY < autoScroll.margin;\n right = pointer.clientX > container.innerWidth - autoScroll.margin;\n bottom = pointer.clientY > container.innerHeight - autoScroll.margin;\n }\n else {\n const rect = domUtils.getElementClientRect(container);\n\n left = pointer.clientX < rect.left + autoScroll.margin;\n top = pointer.clientY < rect.top + autoScroll.margin;\n right = pointer.clientX > rect.right - autoScroll.margin;\n bottom = pointer.clientY > rect.bottom - autoScroll.margin;\n }\n\n autoScroll.x = (right ? 1: left? -1: 0);\n autoScroll.y = (bottom? 1: top? -1: 0);\n\n if (!autoScroll.isScrolling) {\n // set the autoScroll properties to those of the target\n autoScroll.margin = options.margin;\n autoScroll.speed = options.speed;\n\n autoScroll.start(interaction);\n }\n },\n};\n\nInteraction.signals.on('stop-active', function () {\n autoScroll.stop();\n});\n\nInteraction.signals.on('action-move', autoScroll.onInteractionMove);\n\ndefaultOptions.perAction.autoScroll = autoScroll.defaults;\n\nmodule.exports = autoScroll;\n","const Interactable = require('../Interactable');\nconst actions = require('../actions/base');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.ignoreFrom\n [ method ]\n *\n * If the target of the `mousedown`, `pointerdown` or `touchstart`\n * event or any of it's parents match the given CSS selector or\n * Element, no drag/resize/gesture is started.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to not ignore any elements\n = (string | Element | object) The current ignoreFrom value or this Interactable\n **\n | interact(element, { ignoreFrom: document.getElementById('no-action') });\n | // or\n | interact(element).ignoreFrom('input, textarea, a');\n\\*/\nInteractable.prototype.ignoreFrom = function (newValue) {\n return this._backCompatOption('ignoreFrom', newValue);\n};\n\n/*\\\n * Interactable.allowFrom\n [ method ]\n *\n * A drag/resize/gesture is started only If the target of the\n * `mousedown`, `pointerdown` or `touchstart` event or any of it's\n * parents match the given CSS selector or Element.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to allow from any element\n = (string | Element | object) The current allowFrom value or this Interactable\n **\n | interact(element, { allowFrom: document.getElementById('drag-handle') });\n | // or\n | interact(element).allowFrom('.handle');\n\\*/\nInteractable.prototype.allowFrom = function (newValue) {\n return this._backCompatOption('allowFrom', newValue);\n};\n\nInteractable.prototype.testIgnore = function (ignoreFrom, interactableElement, element) {\n if (!ignoreFrom || !is.element(element)) { return false; }\n\n if (is.string(ignoreFrom)) {\n return domUtils.matchesUpTo(element, ignoreFrom, interactableElement);\n }\n else if (is.element(ignoreFrom)) {\n return domUtils.nodeContains(ignoreFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testAllow = function (allowFrom, interactableElement, element) {\n if (!allowFrom) { return true; }\n\n if (!is.element(element)) { return false; }\n\n if (is.string(allowFrom)) {\n return domUtils.matchesUpTo(element, allowFrom, interactableElement);\n }\n else if (is.element(allowFrom)) {\n return domUtils.nodeContains(allowFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testIgnoreAllow = function (options, interactableElement, eventTarget) {\n return (!this.testIgnore(options.ignoreFrom, interactableElement, eventTarget)\n && this.testAllow(options.allowFrom, interactableElement, eventTarget));\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (event.buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\n","const interact = require('../interact');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst actions = require('../actions/base');\nconst defaultOptions = require('../defaultOptions');\nconst browser = require('../utils/browser');\nconst scope = require('../scope');\nconst utils = require('../utils');\nconst signals = require('../utils/Signals').new();\n\nrequire('./InteractableMethods');\n\nconst autoStart = {\n signals,\n withinInteractionLimit,\n // Allow this many interactions to happen simultaneously\n maxInteractions: Infinity,\n defaults: {\n perAction: {\n manualStart: false,\n max: Infinity,\n maxPerElement: 1,\n allowFrom: null,\n ignoreFrom: null,\n },\n },\n setActionDefaults: function (action) {\n utils.extend(action.defaults, autoStart.defaults.perAction);\n },\n};\n\n// set cursor style on mousedown\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget }) {\n if (interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\n// set cursor style on mousemove\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget }) {\n if (!interaction.mouse\n || interaction.pointerIsDown\n || interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\nInteraction.signals.on('move', function (arg) {\n const { interaction, event } = arg;\n\n if (!interaction.pointerIsDown\n || interaction.interacting()\n || !interaction.pointerWasMoved\n || !interaction.prepared.name) {\n return;\n }\n\n signals.fire('before-start', arg);\n\n const target = interaction.target;\n\n if (interaction.prepared.name && target) {\n // check manualStart and interaction limit\n if (target.options[interaction.prepared.name].manualStart\n || !withinInteractionLimit(target, interaction.element, interaction.prepared)) {\n interaction.stop(event);\n }\n else {\n interaction.start(interaction.prepared, target, interaction.element);\n }\n }\n});\n\n// Check if the current target supports the action.\n// If so, return the validated action. Otherwise, return null\nfunction validateAction (action, interactable, element, eventTarget) {\n if (utils.is.object(action)\n && interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget)\n && interactable.options[action.name].enabled\n && withinInteractionLimit(interactable, element, action)) {\n return action;\n }\n\n return null;\n}\n\nfunction validateSelector (interaction, pointer, event, matches, matchElements, eventTarget) {\n for (let i = 0, len = matches.length; i < len; i++) {\n const match = matches[i];\n const matchElement = matchElements[i];\n const action = validateAction(match.getAction(pointer, event, interaction, matchElement),\n match,\n matchElement,\n eventTarget);\n\n if (action) {\n return {\n action,\n target: match,\n element: matchElement,\n };\n }\n }\n\n return {};\n}\n\nfunction getActionInfo (interaction, pointer, event, eventTarget) {\n let matches = [];\n let matchElements = [];\n\n let element = eventTarget;\n let action = null;\n\n function pushMatches (interactable, selector, context) {\n const elements = (browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined);\n\n if (utils.matchesSelector(element, selector, elements)) {\n\n matches.push(interactable);\n matchElements.push(element);\n }\n }\n\n while (utils.is.element(element)) {\n matches = [];\n matchElements = [];\n\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && (action = validateAction(elementInteractable.getAction(pointer, event, interaction, element, eventTarget),\n elementInteractable,\n element,\n eventTarget))\n && !elementInteractable.options[action.name].manualStart) {\n return {\n element,\n action,\n target: elementInteractable,\n };\n }\n else {\n scope.interactables.forEachSelector(pushMatches, element);\n\n const actionInfo = validateSelector(interaction, pointer, event, matches, matchElements, eventTarget);\n\n if (actionInfo.action\n && !actionInfo.target.options[actionInfo.action.name].manualStart) {\n return actionInfo;\n }\n }\n\n element = utils.parentNode(element);\n }\n\n return {};\n}\n\nfunction prepare (interaction, { action, target, element }) {\n action = action || {};\n\n if (interaction.target && interaction.target.options.styleCursor) {\n interaction.target._doc.documentElement.style.cursor = '';\n }\n\n interaction.target = target;\n interaction.element = element;\n utils.copyAction(interaction.prepared, action);\n\n if (target && target.options.styleCursor) {\n const cursor = action? actions[action.name].getCursor(action) : '';\n interaction.target._doc.documentElement.style.cursor = cursor;\n }\n\n signals.fire('prepared', { interaction: interaction });\n}\n\nInteraction.signals.on('stop', function ({ interaction }) {\n const target = interaction.target;\n\n if (target && target.options.styleCursor) {\n target._doc.documentElement.style.cursor = '';\n }\n});\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (utils.is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (utils.is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n const buttons = event.buttons || ({\n 0: 1,\n 1: 4,\n 3: 8,\n 4: 16,\n })[event.button];\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\nfunction withinInteractionLimit (interactable, element, action) {\n const options = interactable.options;\n const maxActions = options[action.name].max;\n const maxPerElement = options[action.name].maxPerElement;\n let activeInteractions = 0;\n let targetCount = 0;\n let targetElementCount = 0;\n\n // no actions if any of these values == 0\n if (!(maxActions && maxPerElement && autoStart.maxInteractions)) { return; }\n\n for (let i = 0, len = scope.interactions.length; i < len; i++) {\n const interaction = scope.interactions[i];\n const otherAction = interaction.prepared.name;\n\n if (!interaction.interacting()) { continue; }\n\n activeInteractions++;\n\n if (activeInteractions >= autoStart.maxInteractions) {\n return false;\n }\n\n if (interaction.target !== interactable) { continue; }\n\n targetCount += (otherAction === action.name)|0;\n\n if (targetCount >= maxActions) {\n return false;\n }\n\n if (interaction.element === element) {\n targetElementCount++;\n\n if (otherAction !== action.name || targetElementCount >= maxPerElement) {\n return false;\n }\n }\n }\n\n return autoStart.maxInteractions > 0;\n}\n\n/*\\\n * interact.maxInteractions\n [ method ]\n **\n * Returns or sets the maximum number of concurrent interactions allowed.\n * By default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables\n * and elements, you need to enable it in the draggable, resizable and\n * gesturable `'max'` and `'maxPerElement'` options.\n **\n - newValue (number) #optional Any number. newValue <= 0 means no interactions.\n\\*/\ninteract.maxInteractions = function (newValue) {\n if (utils.is.number(newValue)) {\n autoStart.maxInteractions = newValue;\n\n return this;\n }\n\n return autoStart.maxInteractions;\n};\n\nInteractable.settingsMethods.push('styleCursor');\nInteractable.settingsMethods.push('actionChecker');\nInteractable.settingsMethods.push('ignoreFrom');\nInteractable.settingsMethods.push('allowFrom');\n\ndefaultOptions.base.actionChecker = null;\ndefaultOptions.base.styleCursor = true;\n\nutils.extend(defaultOptions.perAction, autoStart.defaults.perAction);\n\nmodule.exports = autoStart;\n","const autoStart = require('./base');\nconst Interaction = require('../Interaction');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.delayTimer = null;\n});\n\nautoStart.signals.on('prepared', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.delayTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.target, interaction.element);\n }, delay);\n }\n});\n\nInteraction.signals.on('move', function ({ interaction, duplicate }) {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.delayTimer);\n }\n});\n\n// prevent regular down->move autoStart\nautoStart.signals.on('before-start', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.prepared.name = null;\n }\n});\n","const autoStart = require('./base');\nconst scope = require('../scope');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\n\nconst { matchesSelector, parentNode } = require('../utils/domUtils');\n\nautoStart.setActionDefaults(require('../actions/drag'));\n\nautoStart.signals.on('before-start', function ({ interaction, eventTarget, dx, dy }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // check if a drag is in the correct axis\n const absX = Math.abs(dx);\n const absY = Math.abs(dy);\n const options = interaction.target.options.drag;\n const startAxis = options.startAxis;\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy');\n\n interaction.prepared.axis = options.lockAxis === 'start'\n ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n : options.lockAxis;\n\n // if the movement isn't in the startAxis of the interactable\n if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) {\n // cancel the prepared action\n interaction.prepared.name = null;\n\n // then try to get a drag from another ineractable\n\n if (!interaction.prepared.name) {\n\n let element = eventTarget;\n\n const getDraggable = function (interactable, selector, context) {\n const elements = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n if (interactable === interaction.target) { return; }\n\n if (!options.manualStart\n && !interactable.testIgnoreAllow(options, element, eventTarget)\n && matchesSelector(element, selector, elements)) {\n\n const action = interactable.getAction(interaction.downPointer,\n interaction.downEvent,\n interaction,\n element);\n\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, interactable)\n && autoStart.validateAction(action, interactable, element, eventTarget)) {\n\n return interactable;\n }\n }\n };\n\n let action = null;\n\n // check all interactables\n while (is.element(element)) {\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && elementInteractable !== interaction.target\n && !elementInteractable.options.drag.manualStart) {\n\n action = elementInteractable.getAction(interaction.downPointer, interaction.downEvent, interaction, element);\n }\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, elementInteractable)) {\n\n interaction.prepared.name = 'drag';\n interaction.target = elementInteractable;\n interaction.element = element;\n break;\n }\n\n const selectorInteractable = scope.interactables.forEachSelector(getDraggable, element);\n\n if (selectorInteractable) {\n interaction.prepared.name = 'drag';\n interaction.target = selectorInteractable;\n interaction.element = element;\n break;\n }\n\n element = parentNode(element);\n }\n }\n }\n});\n\nfunction checkStartAxis (startAxis, interactable) {\n if (!interactable) { return false; }\n\n const thisAxis = interactable.options.drag.startAxis;\n\n return (startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis);\n}\n","require('./base').setActionDefaults(require('../actions/gesture'));\n","require('./base').setActionDefaults(require('../actions/resize'));\n","module.exports = {\n base: {\n accept : null,\n preventDefault: 'auto',\n deltaSource : 'page',\n },\n\n perAction: {\n origin: { x: 0, y: 0 },\n\n // only allow left button by default\n // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n mouseButtons: 1,\n\n inertia: {\n enabled : false,\n resistance : 10, // the lambda in exponential decay\n minSpeed : 100, // target speed must be above this for inertia to start\n endSpeed : 10, // the speed at which inertia is slow enough to stop\n allowResume : true, // allow resuming an action in inertia phase\n smoothEndDuration: 300, // animate to snap/restrict endOnly if there's no inertia\n },\n },\n};\n","/* browser entry point */\n\n// Legacy browser support\nrequire('./legacyBrowsers');\n\n// inertia\nrequire('./inertia');\n\n// modifiers\nrequire('./modifiers/snap');\nrequire('./modifiers/restrict');\n\n// pointerEvents\nrequire('./pointerEvents/base');\nrequire('./pointerEvents/holdRepeat');\nrequire('./pointerEvents/interactableTargets');\n\n// delay\nrequire('./autoStart/delay');\n\n// actions\nrequire('./actions/gesture');\nrequire('./actions/resize');\nrequire('./actions/drag');\nrequire('./actions/drop');\n\n// load these modifiers after resize is loaded\nrequire('./modifiers/snapSize');\nrequire('./modifiers/restrictEdges');\nrequire('./modifiers/restrictSize');\n\n// autoStart actions\nrequire('./autoStart/gesture');\nrequire('./autoStart/resize');\nrequire('./autoStart/drag');\n\n// Interactable preventDefault setting\nrequire('./interactablePreventDefault.js');\n\n// autoScroll\nrequire('./autoScroll');\n\n// export interact\nmodule.exports = require('./interact');\n","const InteractEvent = require('./InteractEvent');\nconst Interaction = require('./Interaction');\nconst modifiers = require('./modifiers');\nconst utils = require('./utils');\nconst animationFrame = require('./utils/raf');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.inertiaStatus = {\n active : false,\n smoothEnd : false,\n allowResume: false,\n\n startEvent: null,\n upCoords : {},\n\n xe: 0, ye: 0,\n sx: 0, sy: 0,\n\n t0: 0,\n vx0: 0, vys: 0,\n duration: 0,\n\n lambda_v0: 0,\n one_ve_v0: 0,\n i : null,\n };\n\n interaction.boundInertiaFrame = () => inertiaFrame .apply(interaction);\n interaction.boundSmoothEndFrame = () => smoothEndFrame.apply(interaction);\n});\n\nInteraction.signals.on('down', function ({ interaction, event, pointer, eventTarget }) {\n const status = interaction.inertiaStatus;\n\n // Check if the down event hits the current inertia target\n if (status.active) {\n let element = eventTarget;\n\n // climb up the DOM tree from the event target\n while (utils.is.element(element)) {\n\n // if interaction element is the current inertia target element\n if (element === interaction.element) {\n // stop inertia\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n\n // update pointers to the down event's coordinates\n interaction.updatePointer(pointer);\n utils.setCoords(interaction.curCoords, interaction.pointers);\n\n // fire appropriate signals\n const signalArg = { interaction };\n Interaction.signals.fire('before-action-move', signalArg);\n Interaction.signals.fire('action-resume' , signalArg);\n\n // fire a reume event\n const resumeEvent = new InteractEvent(interaction,\n event,\n interaction.prepared.name,\n 'inertiaresume',\n interaction.element);\n\n interaction.target.fire(resumeEvent);\n interaction.prevEvent = resumeEvent;\n modifiers.resetStatuses(interaction.modifierStatuses);\n\n utils.copyCoords(interaction.prevCoords, interaction.curCoords);\n break;\n }\n\n element = utils.parentNode(element);\n }\n }\n});\n\nInteraction.signals.on('up', function ({ interaction, event }) {\n const status = interaction.inertiaStatus;\n\n if (!interaction.interacting() || status.active) { return; }\n\n const target = interaction.target;\n const options = target && target.options;\n const inertiaOptions = options && interaction.prepared.name && options[interaction.prepared.name].inertia;\n\n const now = new Date().getTime();\n const statuses = {};\n const page = utils.extend({}, interaction.curCoords.page);\n const pointerSpeed = interaction.pointerDelta.client.speed;\n\n let smoothEnd = false;\n let modifierResult;\n\n // check if inertia should be started\n const inertiaPossible = (inertiaOptions && inertiaOptions.enabled\n && interaction.prepared.name !== 'gesture'\n && event !== status.startEvent);\n\n const inertia = (inertiaPossible\n && (now - interaction.curCoords.timeStamp) < 50\n && pointerSpeed > inertiaOptions.minSpeed\n && pointerSpeed > inertiaOptions.endSpeed);\n\n const modifierArg = {\n interaction,\n pageCoords: page,\n statuses,\n preEnd: true,\n requireEndOnly: true,\n };\n\n // smoothEnd\n if (inertiaPossible && !inertia) {\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n if (modifierResult.shouldMove && modifierResult.locked) {\n smoothEnd = true;\n }\n }\n\n if (!(inertia || smoothEnd)) { return; }\n\n utils.copyCoords(status.upCoords, interaction.curCoords);\n\n interaction.pointers[0] = status.startEvent =\n new InteractEvent(interaction, event, interaction.prepared.name, 'inertiastart', interaction.element);\n\n status.t0 = now;\n\n status.active = true;\n status.allowResume = inertiaOptions.allowResume;\n interaction.simulation = status;\n\n target.fire(status.startEvent);\n\n if (inertia) {\n status.vx0 = interaction.pointerDelta.client.vx;\n status.vy0 = interaction.pointerDelta.client.vy;\n status.v0 = pointerSpeed;\n\n calcInertia(interaction, status);\n\n utils.extend(page, interaction.curCoords.page);\n\n page.x += status.xe;\n page.y += status.ye;\n\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n status.modifiedXe += modifierResult.dx;\n status.modifiedYe += modifierResult.dy;\n\n status.i = animationFrame.request(interaction.boundInertiaFrame);\n }\n else {\n status.smoothEnd = true;\n status.xe = modifierResult.dx;\n status.ye = modifierResult.dy;\n\n status.sx = status.sy = 0;\n\n status.i = animationFrame.request(interaction.boundSmoothEndFrame);\n }\n});\n\nInteraction.signals.on('stop-active', function ({ interaction }) {\n const status = interaction.inertiaStatus;\n\n if (status.active) {\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n }\n});\n\nfunction calcInertia (interaction, status) {\n const inertiaOptions = interaction.target.options[interaction.prepared.name].inertia;\n const lambda = inertiaOptions.resistance;\n const inertiaDur = -Math.log(inertiaOptions.endSpeed / status.v0) / lambda;\n\n status.x0 = interaction.prevEvent.pageX;\n status.y0 = interaction.prevEvent.pageY;\n status.t0 = status.startEvent.timeStamp / 1000;\n status.sx = status.sy = 0;\n\n status.modifiedXe = status.xe = (status.vx0 - inertiaDur) / lambda;\n status.modifiedYe = status.ye = (status.vy0 - inertiaDur) / lambda;\n status.te = inertiaDur;\n\n status.lambda_v0 = lambda / status.v0;\n status.one_ve_v0 = 1 - inertiaOptions.endSpeed / status.v0;\n}\n\nfunction inertiaFrame () {\n updateInertiaCoords(this);\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n\n const status = this.inertiaStatus;\n const options = this.target.options[this.prepared.name].inertia;\n const lambda = options.resistance;\n const t = new Date().getTime() / 1000 - status.t0;\n\n if (t < status.te) {\n\n const progress = 1 - (Math.exp(-lambda * t) - status.lambda_v0) / status.one_ve_v0;\n\n if (status.modifiedXe === status.xe && status.modifiedYe === status.ye) {\n status.sx = status.xe * progress;\n status.sy = status.ye * progress;\n }\n else {\n const quadPoint = utils.getQuadraticCurvePoint(0, 0,\n status.xe,\n status.ye,\n status.modifiedXe,\n status.modifiedYe,\n progress);\n\n status.sx = quadPoint.x;\n status.sy = quadPoint.y;\n }\n\n this.doMove();\n\n status.i = animationFrame.request(this.boundInertiaFrame);\n }\n else {\n status.sx = status.modifiedXe;\n status.sy = status.modifiedYe;\n\n this.doMove();\n this.end(status.startEvent);\n status.active = false;\n this.simulation = null;\n }\n\n utils.copyCoords(this.prevCoords, this.curCoords);\n}\n\nfunction smoothEndFrame () {\n updateInertiaCoords(this);\n\n const status = this.inertiaStatus;\n const t = new Date().getTime() - status.t0;\n const duration = this.target.options[this.prepared.name].inertia.smoothEndDuration;\n\n if (t < duration) {\n status.sx = utils.easeOutQuad(t, 0, status.xe, duration);\n status.sy = utils.easeOutQuad(t, 0, status.ye, duration);\n\n this.pointerMove(status.startEvent, status.startEvent);\n\n status.i = animationFrame.request(this.boundSmoothEndFrame);\n }\n else {\n status.sx = status.xe;\n status.sy = status.ye;\n\n this.pointerMove(status.startEvent, status.startEvent);\n this.end(status.startEvent);\n\n status.smoothEnd =\n status.active = false;\n this.simulation = null;\n }\n}\n\nfunction updateInertiaCoords (interaction) {\n const status = interaction.inertiaStatus;\n\n // return if inertia isn't running\n if (!status.active) { return; }\n\n const pageUp = status.upCoords.page;\n const clientUp = status.upCoords.client;\n\n utils.setCoords(interaction.curCoords, [ {\n pageX : pageUp.x + status.sx,\n pageY : pageUp.y + status.sy,\n clientX: clientUp.x + status.sx,\n clientY: clientUp.y + status.sy,\n } ]);\n}\n","const browser = require('./utils/browser');\nconst events = require('./utils/events');\nconst utils = require('./utils');\nconst scope = require('./scope');\nconst Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\n\nconst globalEvents = {};\n\n/*\\\n * interact\n [ method ]\n *\n * The methods of this variable can be used to set elements as\n * interactables and also to change various default settings.\n *\n * Calling it as a function and passing an element or a valid CSS selector\n * string returns an Interactable object which has various methods to\n * configure it.\n *\n - element (Element | string) The HTML or SVG Element to interact with or CSS selector\n = (object) An @Interactable\n *\n > Usage\n | interact('#draggable').draggable(true);\n |\n | var rectables = interact('rect');\n | rectables\n | .gesturable(true)\n | .on('gesturemove', function (event) {\n | // ...\n | });\n\\*/\nfunction interact (element, options) {\n let interactable = scope.interactables.get(element, options);\n\n if (!interactable) {\n interactable = new Interactable(element, options);\n interactable.events.global = globalEvents;\n }\n\n return interactable;\n}\n\n/*\\\n * interact.isSet\n [ method ]\n *\n * Check if an element has been set\n - element (Element) The Element being searched for\n = (boolean) Indicates if the element or CSS selector was previously passed to interact\n\\*/\ninteract.isSet = function (element, options) {\n return scope.interactables.indexOfElement(element, options && options.context) !== -1;\n};\n\n/*\\\n * interact.on\n [ method ]\n *\n * Adds a global listener for an InteractEvent or adds a DOM event to\n * `document`\n *\n - type (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) interact\n\\*/\ninteract.on = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.on(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.on(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n // if it is an InteractEvent type, add listener to globalEvents\n if (utils.contains(Interactable.eventTypes, type)) {\n // if this type of event was never bound\n if (!globalEvents[type]) {\n globalEvents[type] = [listener];\n }\n else {\n globalEvents[type].push(listener);\n }\n }\n // If non InteractEvent type, addEventListener to document\n else {\n events.add(scope.document, type, listener, { options });\n }\n\n return interact;\n};\n\n/*\\\n * interact.off\n [ method ]\n *\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n - type (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) interact\n \\*/\ninteract.off = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.off(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.off(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n if (!utils.contains(Interactable.eventTypes, type)) {\n events.remove(scope.document, type, listener, options);\n }\n else {\n let index;\n\n if (type in globalEvents\n && (index = utils.indexOf(globalEvents[type], listener)) !== -1) {\n globalEvents[type].splice(index, 1);\n }\n }\n\n return interact;\n};\n\n/*\\\n * interact.debug\n [ method ]\n *\n * Returns an object which exposes internal data\n = (object) An object with properties that outline the current state and expose internal functions and variables\n\\*/\ninteract.debug = function () {\n return scope;\n};\n\n// expose the functions used to calculate multi-touch properties\ninteract.getPointerAverage = utils.pointerAverage;\ninteract.getTouchBBox = utils.touchBBox;\ninteract.getTouchDistance = utils.touchDistance;\ninteract.getTouchAngle = utils.touchAngle;\n\ninteract.getElementRect = utils.getElementRect;\ninteract.getElementClientRect = utils.getElementClientRect;\ninteract.matchesSelector = utils.matchesSelector;\ninteract.closest = utils.closest;\n\n/*\\\n * interact.supportsTouch\n [ method ]\n *\n = (boolean) Whether or not the browser supports touch input\n\\*/\ninteract.supportsTouch = function () {\n return browser.supportsTouch;\n};\n\n/*\\\n * interact.supportsPointerEvent\n [ method ]\n *\n = (boolean) Whether or not the browser supports PointerEvents\n\\*/\ninteract.supportsPointerEvent = function () {\n return browser.supportsPointerEvent;\n};\n\n/*\\\n * interact.stop\n [ method ]\n *\n * Cancels all interactions (end events are not fired)\n *\n - event (Event) An event on which to call preventDefault()\n = (object) interact\n\\*/\ninteract.stop = function (event) {\n for (let i = scope.interactions.length - 1; i >= 0; i--) {\n scope.interactions[i].stop(event);\n }\n\n return interact;\n};\n\n/*\\\n * interact.pointerMoveTolerance\n [ method ]\n * Returns or sets the distance the pointer must be moved before an action\n * sequence occurs. This also affects tolerance for tap events.\n *\n - newValue (number) #optional The movement from the start position must be greater than this value\n = (number | Interactable) The current setting or interact\n\\*/\ninteract.pointerMoveTolerance = function (newValue) {\n if (utils.is.number(newValue)) {\n Interaction.pointerMoveTolerance = newValue;\n\n return this;\n }\n\n return Interaction.pointerMoveTolerance;\n};\n\ninteract.addDocument = scope.addDocument;\ninteract.removeDocument = scope.removeDocument;\n\nscope.interact = interact;\n\nmodule.exports = interact;\n","const Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\nconst scope = require('./scope');\nconst is = require('./utils/is');\nconst events = require('./utils/events');\n\nconst { nodeContains, matchesSelector } = require('./utils/domUtils');\n\n/*\\\n * Interactable.preventDefault\n [ method ]\n *\n * Returns or sets whether to prevent the browser's default behaviour\n * in response to pointer events. Can be set to:\n * - `'always'` to always prevent\n * - `'never'` to never prevent\n * - `'auto'` to let interact.js try to determine what would be best\n *\n - newValue (string) #optional `true`, `false` or `'auto'`\n = (string | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.preventDefault = function (newValue) {\n if (/^(always|never|auto)$/.test(newValue)) {\n this.options.preventDefault = newValue;\n return this;\n }\n\n if (is.bool(newValue)) {\n this.options.preventDefault = newValue? 'always' : 'never';\n return this;\n }\n\n return this.options.preventDefault;\n};\n\nInteractable.prototype.checkAndPreventDefault = function (event) {\n const setting = this.options.preventDefault;\n\n if (setting === 'never') { return; }\n\n if (setting === 'always') {\n event.preventDefault();\n return;\n }\n\n // setting === 'auto'\n\n // don't preventDefault if the browser supports passiveEvents\n // CSS touch-action and user-selecct should be used instead\n if (events.supportsOptions) {\n return;\n }\n\n // don't preventDefault of pointerdown events\n if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) {\n return;\n }\n\n // don't preventDefault on editable elements\n if (is.element(event.target)\n && matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) {\n return;\n }\n\n event.preventDefault();\n};\n\nfunction onInteractionEvent ({ interaction, event }) {\n if (interaction.target) {\n interaction.target.checkAndPreventDefault(event);\n }\n}\n\nfor (const eventSignal of ['down', 'move', 'up', 'cancel']) {\n Interaction.signals.on(eventSignal, onInteractionEvent);\n}\n\n// prevent native HTML5 drag on interact.js target elements\nInteraction.docEvents.dragstart = function preventNativeDrag (event) {\n for (const interaction of scope.interactions) {\n\n if (interaction.element\n && (interaction.element === event.target\n || nodeContains(interaction.element, event.target))) {\n\n interaction.target.checkAndPreventDefault(event);\n return;\n }\n }\n};\n","const scope = require('./scope');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst iFinder = require('./utils/interactionFinder');\nconst pointerEvents = require('./pointerEvents/base');\n\nconst { window } = require('./utils/window');\n\nconst toString = Object.prototype.toString;\n\nif (!window.Array.isArray) {\n window.Array.isArray = function (obj) {\n return toString.call(obj) === '[object Array]';\n };\n}\n\nif (!String.prototype.trim) {\n String.prototype.trim = function () {\n return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n };\n}\n\n// http://www.quirksmode.org/dom/events/click.html\n// >Events leading to dblclick\n//\n// IE8 doesn't fire down event before dblclick.\n// This workaround tries to fire a tap and doubletap after dblclick\nfunction onIE8Dblclick (event) {\n const eventTarget = event.target;\n const interaction = iFinder.search(event, event.type, eventTarget);\n\n if (!interaction) { return; }\n\n if (interaction.prevTap\n && event.clientX === interaction.prevTap.clientX\n && event.clientY === interaction.prevTap.clientY\n && eventTarget === interaction.prevTap.target) {\n\n interaction.downTargets[0] = eventTarget;\n interaction.downTimes [0] = new Date().getTime();\n\n pointerEvents.fire({\n interaction,\n event,\n eventTarget,\n pointer: event,\n type: 'tap',\n });\n }\n}\n\nif (browser.isIE8) {\n const selectFix = function (event) {\n for (const interaction of scope.interactions) {\n if (interaction.interacting()) {\n interaction.target.checkAndPreventDefault(event);\n }\n }\n };\n\n const onDocIE8 = function onDocIE8 ({ doc, win }, signalName) {\n const eventMethod = signalName.indexOf('listen') === 0\n ? events.add : events.remove;\n\n // For IE's lack of Event#preventDefault\n eventMethod(doc, 'selectstart', selectFix);\n\n if (pointerEvents) {\n eventMethod(doc, 'dblclick', onIE8Dblclick);\n }\n };\n\n scope.signals.on('add-document' , onDocIE8);\n scope.signals.on('remove-document', onDocIE8);\n}\n\nmodule.exports = null;\n","const InteractEvent = require('../InteractEvent');\nconst Interaction = require('../Interaction');\nconst extend = require('../utils/extend');\n\nconst modifiers = {\n names: [],\n\n setOffsets: function (arg) {\n const { interaction, pageCoords: page } = arg;\n const { target, element, startOffset } = interaction;\n const rect = target.getRect(element);\n\n if (rect) {\n startOffset.left = page.x - rect.left;\n startOffset.top = page.y - rect.top;\n\n startOffset.right = rect.right - page.x;\n startOffset.bottom = rect.bottom - page.y;\n\n if (!('width' in rect)) { rect.width = rect.right - rect.left; }\n if (!('height' in rect)) { rect.height = rect.bottom - rect.top ; }\n }\n else {\n startOffset.left = startOffset.top = startOffset.right = startOffset.bottom = 0;\n }\n\n arg.rect = rect;\n arg.interactable = target;\n arg.element = element;\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n\n arg.options = target.options[interaction.prepared.name][modifierName];\n\n if (!arg.options) {\n continue;\n }\n\n interaction.modifierOffsets[modifierName] = modifiers[modifierName].setOffset(arg);\n }\n },\n\n setAll: function (arg) {\n const { interaction, statuses, preEnd, requireEndOnly } = arg;\n const coords = extend({}, arg.pageCoords);\n const result = {\n dx: 0,\n dy: 0,\n changed: false,\n locked: false,\n shouldMove: true,\n };\n\n for (const modifierName of modifiers.names) {\n const modifier = modifiers[modifierName];\n const options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!shouldDo(options, preEnd, requireEndOnly)) { continue; }\n\n arg.status = arg.status = statuses[modifierName];\n arg.options = options;\n arg.offset = arg.interaction.modifierOffsets[modifierName];\n\n modifier.set(arg);\n\n if (arg.status.locked) {\n coords.x += arg.status.dx;\n coords.y += arg.status.dy;\n\n result.dx += arg.status.dx;\n result.dy += arg.status.dy;\n\n result.locked = true;\n }\n }\n\n // a move should be fired if:\n // - there are no modifiers enabled,\n // - no modifiers are \"locked\" i.e. have changed the pointer's coordinates, or\n // - the locked coords have changed since the last pointer move\n result.shouldMove = !arg.status || !result.locked || arg.status.changed;\n\n return result;\n },\n\n resetStatuses: function (statuses) {\n for (const modifierName of modifiers.names) {\n const status = statuses[modifierName] || {};\n\n status.dx = status.dy = 0;\n status.modifiedX = status.modifiedY = NaN;\n status.locked = false;\n status.changed = true;\n\n statuses[modifierName] = status;\n }\n\n return statuses;\n },\n\n start: function ({ interaction }, signalName) {\n const arg = {\n interaction,\n pageCoords: (signalName === 'action-resume' ?\n interaction.curCoords : interaction.startCoords).page,\n startOffset: interaction.startOffset,\n statuses: interaction.modifierStatuses,\n preEnd: false,\n requireEndOnly: false,\n };\n\n modifiers.setOffsets(arg);\n modifiers.resetStatuses(arg.statuses);\n\n arg.pageCoords = extend({}, interaction.startCoords.page);\n interaction.modifierResult = modifiers.setAll(arg);\n },\n};\n\nInteraction.signals.on('new', function (interaction) {\n interaction.startOffset = { left: 0, right: 0, top: 0, bottom: 0 };\n interaction.modifierOffsets = {};\n interaction.modifierStatuses = modifiers.resetStatuses({});\n interaction.modifierResult = null;\n});\n\nInteraction.signals.on('action-start' , modifiers.start);\nInteraction.signals.on('action-resume', modifiers.start);\n\nInteraction.signals.on('before-action-move', function ({ interaction, preEnd, interactingBeforeMove }) {\n const modifierResult = modifiers.setAll({\n interaction,\n preEnd,\n pageCoords: interaction.curCoords.page,\n statuses: interaction.modifierStatuses,\n requireEndOnly: false,\n });\n\n // don't fire an action move if a modifier would keep the event in the same\n // cordinates as before\n if (!modifierResult.shouldMove && interactingBeforeMove) {\n interaction._dontFireMove = true;\n }\n\n interaction.modifierResult = modifierResult;\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n for (let i = 0; i < modifiers.names.length; i++) {\n const options = interaction.target.options[interaction.prepared.name][modifiers.names[i]];\n\n // if the endOnly option is true for any modifier\n if (shouldDo(options, true, true)) {\n // fire a move event at the modified coordinates\n interaction.doMove({ event, preEnd: true });\n break;\n }\n }\n});\n\nInteractEvent.signals.on('set-xy', function (arg) {\n const { iEvent, interaction } = arg;\n const modifierArg = extend({}, arg);\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n modifierArg.options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!modifierArg.options) {\n continue;\n }\n\n const modifier = modifiers[modifierName];\n\n modifierArg.status = interaction.modifierStatuses[modifierName];\n\n iEvent[modifierName] = modifier.modifyCoords(modifierArg);\n }\n});\n\nfunction shouldDo (options, preEnd, requireEndOnly) {\n return (options && options.enabled\n && (preEnd || !options.endOnly)\n && (!requireEndOnly || options.endOnly));\n}\n\nmodule.exports = modifiers;\n","const modifiers = require('./index');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst restrict = {\n defaults: {\n enabled : false,\n endOnly : false,\n restriction: null,\n elementRect: null,\n },\n\n setOffset: function ({ rect, startOffset, options }) {\n const elementRect = options && options.elementRect;\n const offset = {};\n\n if (rect && elementRect) {\n offset.left = startOffset.left - (rect.width * elementRect.left);\n offset.top = startOffset.top - (rect.height * elementRect.top);\n\n offset.right = startOffset.right - (rect.width * (1 - elementRect.right));\n offset.bottom = startOffset.bottom - (rect.height * (1 - elementRect.bottom));\n }\n else {\n offset.left = offset.top = offset.right = offset.bottom = 0;\n }\n\n return offset;\n },\n\n set: function ({ pageCoords, interaction, status, options }) {\n if (!options) { return status; }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n\n const restriction = getRestrictionRect(options.restriction, interaction, page);\n\n if (!restriction) { return status; }\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n const rect = restriction;\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n const offset = interaction.modifierOffsets.restrict;\n\n // object is assumed to have\n // x, y, width, height or\n // left, top, right, bottom\n if ('x' in restriction && 'y' in restriction) {\n modifiedX = Math.max(Math.min(rect.x + rect.width - offset.right , page.x), rect.x + offset.left);\n modifiedY = Math.max(Math.min(rect.y + rect.height - offset.bottom, page.y), rect.y + offset.top );\n }\n else {\n modifiedX = Math.max(Math.min(rect.right - offset.right , page.x), rect.left + offset.left);\n modifiedY = Math.max(Math.min(rect.bottom - offset.bottom, page.y), rect.top + offset.top );\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const elementRect = options && options.elementRect;\n\n if (options && options.enabled\n && !(phase === 'start' && elementRect && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n getRestrictionRect,\n};\n\nfunction getRestrictionRect (value, interaction, page) {\n if (utils.is.function(value)) {\n return utils.resolveRectLike(value, interaction.target, interaction.element, [page.x, page.y, interaction]);\n } else {\n return utils.resolveRectLike(value, interaction.target, interaction.element);\n }\n}\n\nmodifiers.restrict = restrict;\nmodifiers.names.push('restrict');\n\ndefaultOptions.perAction.restrict = restrict.defaults;\n\nmodule.exports = restrict;\n","// This module adds the options.resize.restrictEdges setting which sets min and\n// max for the top, left, bottom and right edges of the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictEdges: {\n// inner: { top: 200, left: 200, right: 400, bottom: 400 },\n// outer: { top: 0, left: 0, right: 600, bottom: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst { getRestrictionRect } = require('./restrict');\n\nconst noInner = { top: +Infinity, left: +Infinity, bottom: -Infinity, right: -Infinity };\nconst noOuter = { top: -Infinity, left: -Infinity, bottom: +Infinity, right: +Infinity };\n\nconst restrictEdges = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n offset: null,\n },\n\n setOffset: function ({ interaction, startOffset, options }) {\n if (!options) {\n return utils.extend({}, startOffset);\n }\n\n const offset = getRestrictionRect(options.offset, interaction, interaction.startCoords.page);\n\n if (offset) {\n return {\n top: startOffset.top + offset.y,\n left: startOffset.left + offset.x,\n bottom: startOffset.bottom + offset.y,\n right: startOffset.right + offset.x,\n };\n }\n\n return startOffset;\n },\n\n set: function ({ pageCoords, interaction, status, offset, options }) {\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n const inner = rectUtils.xywhToTlbr(getRestrictionRect(options.inner, interaction, page)) || noInner;\n const outer = rectUtils.xywhToTlbr(getRestrictionRect(options.outer, interaction, page)) || noOuter;\n\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n if (edges.top) {\n modifiedY = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top);\n }\n else if (edges.bottom) {\n modifiedY = Math.max(Math.min(outer.bottom - offset.bottom, page.y), inner.bottom - offset.bottom);\n }\n if (edges.left) {\n modifiedX = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left);\n }\n else if (edges.right) {\n modifiedX = Math.max(Math.min(outer.right - offset.right, page.x), inner.right - offset.right);\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n if (options && options.enabled\n && !(phase === 'start' && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n noInner,\n noOuter,\n getRestrictionRect,\n};\n\nmodifiers.restrictEdges = restrictEdges;\nmodifiers.names.push('restrictEdges');\n\ndefaultOptions.perAction.restrictEdges = restrictEdges.defaults;\nresize.defaults.restrictEdges = restrictEdges.defaults;\n\nmodule.exports = restrictEdges;\n","// This module adds the options.resize.restrictSize setting which sets min and\n// max width and height for the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictSize: {\n// min: { width: -600, height: -600 },\n// max: { width: 600, height: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst restrictEdges = require('./restrictEdges');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst noMin = { width: -Infinity, height: -Infinity };\nconst noMax = { width: +Infinity, height: +Infinity };\n\nconst restrictSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n },\n\n setOffset: function ({ interaction }) {\n return interaction.startOffset;\n },\n\n set: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const rect = rectUtils.xywhToTlbr(interaction.resizeRects.inverted);\n\n const minSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.min, interaction)) || noMin;\n const maxSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.max, interaction)) || noMax;\n\n arg.options = {\n enabled: options.enabled,\n endOnly: options.endOnly,\n inner: utils.extend({}, restrictEdges.noInner),\n outer: utils.extend({}, restrictEdges.noOuter),\n };\n\n if (edges.top) {\n arg.options.inner.top = rect.bottom - minSize.height;\n arg.options.outer.top = rect.bottom - maxSize.height;\n }\n else if (edges.bottom) {\n arg.options.inner.bottom = rect.top + minSize.height;\n arg.options.outer.bottom = rect.top + maxSize.height;\n }\n if (edges.left) {\n arg.options.inner.left = rect.right - minSize.width;\n arg.options.outer.left = rect.right - maxSize.width;\n }\n else if (edges.right) {\n arg.options.inner.right = rect.left + minSize.width;\n arg.options.outer.right = rect.left + maxSize.width;\n }\n\n restrictEdges.set(arg);\n },\n\n modifyCoords: restrictEdges.modifyCoords,\n};\n\nmodifiers.restrictSize = restrictSize;\nmodifiers.names.push('restrictSize');\n\ndefaultOptions.perAction.restrictSize = restrictSize.defaults;\nresize.defaults.restrictSize = restrictSize.defaults;\n\nmodule.exports = restrictSize;\n","const modifiers = require('./index');\nconst interact = require('../interact');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst snap = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n\n relativePoints: null,\n },\n\n setOffset: function ({ interaction, interactable, element, rect, startOffset, options }) {\n const offsets = [];\n const optionsOrigin = utils.rectToXY(utils.resolveRectLike(options.origin));\n const origin = optionsOrigin || utils.getOriginXY(interactable, element, interaction.prepared.name);\n options = options || interactable.options[interaction.prepared.name].snap || {};\n\n let snapOffset;\n\n if (options.offset === 'startCoords') {\n snapOffset = {\n x: interaction.startCoords.page.x - origin.x,\n y: interaction.startCoords.page.y - origin.y,\n };\n }\n else {\n const offsetRect = utils.resolveRectLike(options.offset, interactable, element, [interaction]);\n\n snapOffset = utils.rectToXY(offsetRect) || { x: 0, y: 0 };\n }\n\n if (rect && options.relativePoints && options.relativePoints.length) {\n for (const { x: relativeX, y: relativeY } of options.relativePoints) {\n offsets.push({\n x: startOffset.left - (rect.width * relativeX) + snapOffset.x,\n y: startOffset.top - (rect.height * relativeY) + snapOffset.y,\n });\n }\n }\n else {\n offsets.push(snapOffset);\n }\n\n return offsets;\n },\n\n set: function ({ interaction, pageCoords, status, options, offset: offsets }) {\n const targets = [];\n let target;\n let page;\n let i;\n\n if (status.useStatusXY) {\n page = { x: status.x, y: status.y };\n }\n else {\n const origin = utils.getOriginXY(interaction.target, interaction.element, interaction.prepared.name);\n\n page = utils.extend({}, pageCoords);\n\n page.x -= origin.x;\n page.y -= origin.y;\n }\n\n status.realX = page.x;\n status.realY = page.y;\n\n let len = options.targets? options.targets.length : 0;\n\n for (const { x: offsetX, y: offsetY } of offsets) {\n const relativeX = page.x - offsetX;\n const relativeY = page.y - offsetY;\n\n for (const snapTarget of options.targets) {\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n targets.push({\n x: utils.is.number(target.x) ? (target.x + offsetX) : relativeX,\n y: utils.is.number(target.y) ? (target.y + offsetY) : relativeY,\n\n range: utils.is.number(target.range)? target.range: options.range,\n });\n }\n }\n\n const closest = {\n target: null,\n inRange: false,\n distance: 0,\n range: 0,\n dx: 0,\n dy: 0,\n };\n\n for (i = 0, len = targets.length; i < len; i++) {\n target = targets[i];\n\n const range = target.range;\n const dx = target.x - page.x;\n const dy = target.y - page.y;\n const distance = utils.hypot(dx, dy);\n let inRange = distance <= range;\n\n // Infinite targets count as being out of range\n // compared to non infinite ones that are in range\n if (range === Infinity && closest.inRange && closest.range !== Infinity) {\n inRange = false;\n }\n\n if (!closest.target || (inRange\n // is the closest target in range?\n ? (closest.inRange && range !== Infinity\n // the pointer is relatively deeper in this target\n ? distance / range < closest.distance / closest.range\n // this target has Infinite range and the closest doesn't\n : (range === Infinity && closest.range !== Infinity)\n // OR this target is closer that the previous closest\n || distance < closest.distance)\n // The other is not in range and the pointer is closer to this target\n : (!closest.inRange && distance < closest.distance))) {\n\n closest.target = target;\n closest.distance = distance;\n closest.range = range;\n closest.inRange = inRange;\n closest.dx = dx;\n closest.dy = dy;\n\n status.range = range;\n }\n }\n\n let snapChanged;\n\n if (closest.target) {\n snapChanged = (status.modifiedX !== closest.target.x || status.modifiedY !== closest.target.y);\n\n status.modifiedX = closest.target.x;\n status.modifiedY = closest.target.y;\n }\n else {\n snapChanged = true;\n\n status.modifiedX = NaN;\n status.modifiedY = NaN;\n }\n\n status.dx = closest.dx;\n status.dy = closest.dy;\n\n status.changed = (snapChanged || (closest.inRange && !status.locked));\n status.locked = closest.inRange;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const relativePoints = options && options.relativePoints;\n\n if (options && options.enabled\n && !(phase === 'start' && relativePoints && relativePoints.length)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n }\n\n return {\n range : status.range,\n locked : status.locked,\n x : status.modifiedX,\n y : status.modifiedY,\n realX : status.realX,\n realY : status.realY,\n dx : status.dx,\n dy : status.dy,\n };\n }\n },\n};\n\ninteract.createSnapGrid = function (grid) {\n return function (x, y) {\n const limits = grid.limits || {\n left : -Infinity,\n right : Infinity,\n top : -Infinity,\n bottom: Infinity,\n };\n let offsetX = 0;\n let offsetY = 0;\n\n if (utils.is.object(grid.offset)) {\n offsetX = grid.offset.x;\n offsetY = grid.offset.y;\n }\n\n const gridx = Math.round((x - offsetX) / grid.x);\n const gridy = Math.round((y - offsetY) / grid.y);\n\n const newX = Math.max(limits.left, Math.min(limits.right , gridx * grid.x + offsetX));\n const newY = Math.max(limits.top , Math.min(limits.bottom, gridy * grid.y + offsetY));\n\n return {\n x: newX,\n y: newY,\n range: grid.range,\n };\n };\n};\n\nmodifiers.snap = snap;\nmodifiers.names.push('snap');\n\ndefaultOptions.perAction.snap = snap.defaults;\n\nmodule.exports = snap;\n","// This module allows snapping of the size of targets during resize\n// interactions.\n\nconst modifiers = require('./index');\nconst snap = require('./snap');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\nconst utils = require('../utils/');\n\nconst snapSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n },\n\n setOffset: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.edges;\n\n if (!edges) { return; }\n\n arg.options = {\n relativePoints: [{\n x: edges.left? 0 : 1,\n y: edges.top ? 0 : 1,\n }],\n origin: { x: 0, y: 0 },\n offset: 'self',\n range: options.range,\n };\n\n const offsets = snap.setOffset(arg);\n arg.options = options;\n\n return offsets;\n },\n\n set: function (arg) {\n const { interaction, options, offset, pageCoords } = arg;\n const page = utils.extend({}, pageCoords);\n const relativeX = page.x - offset[0].x;\n const relativeY = page.y - offset[0].y;\n\n arg.options = utils.extend({}, options);\n arg.options.targets = [];\n\n for (const snapTarget of options.targets) {\n let target;\n\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n if ('width' in target && 'height' in target) {\n target.x = target.width;\n target.y = target.height;\n }\n\n arg.options.targets.push(target);\n }\n\n snap.set(arg);\n },\n\n modifyCoords: function (arg) {\n const { options } = arg;\n\n arg.options = utils.extend({}, options);\n arg.options.enabled = options.enabled;\n arg.options.relativePoints = [null];\n\n snap.modifyCoords(arg);\n },\n};\n\nmodifiers.snapSize = snapSize;\nmodifiers.names.push('snapSize');\n\ndefaultOptions.perAction.snapSize = snapSize.defaults;\nresize.defaults.snapSize = snapSize.defaults;\n\nmodule.exports = snapSize;\n","const pointerUtils = require('../utils/pointerUtils');\n\nmodule.exports = class PointerEvent {\n constructor (type, pointer, event, eventTarget, interaction) {\n pointerUtils.pointerExtend(this, event);\n\n if (event !== pointer) {\n pointerUtils.pointerExtend(this, pointer);\n }\n\n this.interaction = interaction;\n\n this.timeStamp = new Date().getTime();\n this.originalEvent = event;\n this.type = type;\n this.pointerId = pointerUtils.getPointerId(pointer);\n this.pointerType = pointerUtils.getPointerType(pointer, interaction);\n this.target = eventTarget;\n this.currentTarget = null;\n\n if (type === 'tap') {\n const pointerIndex = interaction.getPointerIndex(pointer);\n this.dt = this.timeStamp - interaction.downTimes[pointerIndex];\n\n const interval = this.timeStamp - interaction.tapTime;\n\n this.double = !!(interaction.prevTap\n && interaction.prevTap.type !== 'doubletap'\n && interaction.prevTap.target === this.target\n && interval < 500);\n }\n else if (type === 'doubletap') {\n this.dt = pointer.timeStamp - interaction.tapTime;\n }\n }\n\n subtractOrigin ({ x: originX, y: originY }) {\n this.pageX -= originX;\n this.pageY -= originY;\n this.clientX -= originX;\n this.clientY -= originY;\n\n return this;\n }\n\n addOrigin ({ x: originX, y: originY }) {\n this.pageX += originX;\n this.pageY += originY;\n this.clientX += originX;\n this.clientY += originY;\n\n return this;\n }\n\n preventDefault () {\n this.originalEvent.preventDefault();\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n};\n","const PointerEvent = require('./PointerEvent');\nconst Interaction = require('../Interaction');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst defaults = require('../defaultOptions');\nconst signals = require('../utils/Signals').new();\nconst { filter } = require('../utils/arr');\n\nconst simpleSignals = [ 'down', 'up', 'cancel' ];\nconst simpleEvents = [ 'down', 'up', 'cancel' ];\n\nconst pointerEvents = {\n PointerEvent,\n fire,\n collectEventTargets,\n signals,\n defaults: {\n holdDuration: 600,\n ignoreFrom : null,\n allowFrom : null,\n origin : { x: 0, y: 0 },\n },\n types: [\n 'down',\n 'move',\n 'up',\n 'cancel',\n 'tap',\n 'doubletap',\n 'hold',\n ],\n};\n\nfunction fire (arg) {\n const {\n interaction, pointer, event, eventTarget,\n type = arg.pointerEvent.type,\n targets = collectEventTargets(arg),\n pointerEvent = new PointerEvent(type, pointer, event, eventTarget, interaction),\n } = arg;\n\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n targets,\n type,\n pointerEvent,\n };\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n\n for (const prop in target.props || {}) {\n pointerEvent[prop] = target.props[prop];\n }\n\n const origin = utils.getOriginXY(target.eventable, target.element);\n\n pointerEvent.subtractOrigin(origin);\n pointerEvent.eventable = target.eventable;\n pointerEvent.currentTarget = target.element;\n\n target.eventable.fire(pointerEvent);\n\n pointerEvent.addOrigin(origin);\n\n if (pointerEvent.immediatePropagationStopped\n || (pointerEvent.propagationStopped\n && (i + 1) < targets.length && targets[i + 1].element !== pointerEvent.currentTarget)) {\n break;\n }\n }\n\n signals.fire('fired', signalArg);\n\n if (type === 'tap') {\n // if pointerEvent should make a double tap, create and fire a doubletap\n // PointerEvent and use that as the prevTap\n const prevTap = pointerEvent.double\n ? fire({\n interaction, pointer, event, eventTarget,\n type: 'doubletap',\n })\n : pointerEvent;\n\n interaction.prevTap = prevTap;\n interaction.tapTime = prevTap.timeStamp;\n }\n\n return pointerEvent;\n}\n\nfunction collectEventTargets ({ interaction, pointer, event, eventTarget, type }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n // do not fire a tap event if the pointer was moved before being lifted\n if (type === 'tap' && (interaction.pointerWasMoved\n // or if the pointerup target is different to the pointerdown target\n || !(interaction.downTargets[pointerIndex] && interaction.downTargets[pointerIndex] === eventTarget))) {\n return [];\n }\n\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n path,\n targets: [],\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (type === 'hold') {\n signalArg.targets = filter(signalArg.targets, target =>\n target.eventable.options.holdDuration === interaction.holdTimers[pointerIndex].duration);\n }\n\n return signalArg.targets;\n}\n\nInteraction.signals.on('update-pointer-down', function ({ interaction, pointerIndex }) {\n interaction.holdTimers[pointerIndex] = { duration: Infinity, timeout: null };\n});\n\nInteraction.signals.on('remove-pointer', function ({ interaction, pointerIndex }) {\n interaction.holdTimers.splice(pointerIndex, 1);\n});\n\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget, duplicateMove }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n if (!duplicateMove && (!interaction.pointerIsDown || interaction.pointerWasMoved)) {\n if (interaction.pointerIsDown) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n\n fire({\n interaction, pointer, event, eventTarget,\n type: 'move',\n });\n }\n});\n\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget, pointerIndex }) {\n // copy event to be used in timeout for IE8\n const eventCopy = browser.isIE8? utils.extend({}, event) : event;\n\n const timer = interaction.holdTimers[pointerIndex];\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'hold',\n targets: [],\n path,\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (!signalArg.targets.length) { return; }\n\n let minDuration = Infinity;\n\n for (let i = 0; i < signalArg.targets.length; i++) {\n const target = signalArg.targets[i];\n const holdDuration = target.eventable.options.holdDuration;\n\n if (holdDuration < minDuration) {\n minDuration = holdDuration;\n }\n }\n\n timer.duration = minDuration;\n timer.timeout = setTimeout(function () {\n fire({\n interaction, eventCopy, eventTarget,\n pointer: browser.isIE8? eventCopy : pointer,\n type: 'hold',\n });\n }, minDuration);\n});\n\nInteraction.signals.on('up', ({ interaction, pointer, event, eventTarget }) => {\n if (!interaction.pointerWasMoved) {\n fire({ interaction, eventTarget, pointer, event, type: 'tap' });\n }\n});\n\n['up', 'cancel'].forEach(function (signalName) {\n Interaction.signals.on(signalName, function ({ interaction, pointerIndex }) {\n if (interaction.holdTimers[pointerIndex]) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n });\n});\n\nfunction createSignalListener (type) {\n return function ({ interaction, pointer, event, eventTarget }) {\n fire({ interaction, eventTarget, pointer, event, type });\n };\n}\n\nfor (let i = 0; i < simpleSignals.length; i++) {\n Interaction.signals.on(simpleSignals[i], createSignalListener(simpleEvents[i]));\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.prevTap = null; // the most recent tap event on this interaction\n interaction.tapTime = 0; // time of the most recent tap event\n interaction.holdTimers = []; // [{ duration, timeout }]\n});\n\ndefaults.pointerEvents = pointerEvents.defaults;\nmodule.exports = pointerEvents;\n","const pointerEvents = require('./base');\nconst Interaction = require('../Interaction');\n\npointerEvents.signals.on('new', onNew);\npointerEvents.signals.on('fired', onFired);\n\nfor (const signal of ['move', 'up', 'cancel', 'endall']) {\n Interaction.signals.on(signal, endHoldRepeat);\n}\n\nfunction onNew ({ pointerEvent }) {\n if (pointerEvent.type !== 'hold') { return; }\n\n pointerEvent.count = (pointerEvent.count || 0) + 1;\n}\n\nfunction onFired ({ interaction, pointerEvent, eventTarget, targets }) {\n if (pointerEvent.type !== 'hold' || !targets.length) { return; }\n\n // get the repeat interval from the first eventable\n const interval = targets[0].eventable.options.holdRepeatInterval;\n\n // don't repeat if the interval is 0 or less\n if (interval <= 0) { return; }\n\n // set a timeout to fire the holdrepeat event\n interaction.holdIntervalHandle = setTimeout(function () {\n pointerEvents.fire({\n interaction,\n eventTarget,\n type: 'hold',\n pointer: pointerEvent,\n event: pointerEvent,\n });\n }, interval);\n}\n\nfunction endHoldRepeat ({ interaction }) {\n // set the interaction's holdStopTime property\n // to stop further holdRepeat events\n if (interaction.holdIntervalHandle) {\n clearInterval(interaction.holdIntervalHandle);\n interaction.holdIntervalHandle = null;\n }\n}\n\n// don't repeat by default\npointerEvents.defaults.holdRepeatInterval = 0;\npointerEvents.types.push('holdrepeat');\n\nmodule.exports = {\n onNew,\n onFired,\n endHoldRepeat,\n};\n","const pointerEvents = require('./base');\nconst Interactable = require('../Interactable');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\nconst scope = require('../scope');\nconst extend = require('../utils/extend');\nconst { merge } = require('../utils/arr');\n\npointerEvents.signals.on('collect-targets', function ({ targets, element, type, eventTarget }) {\n function collectSelectors (interactable, selector, context) {\n const els = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && is.element(element)\n && domUtils.matchesSelector(element, selector, els)\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n const interactable = scope.interactables.get(element);\n\n if (interactable) {\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n scope.interactables.forEachSelector(collectSelectors, element);\n});\n\nInteractable.signals.on('new', function ({ interactable }) {\n interactable.events.getRect = function (element) {\n return interactable.getRect(element);\n };\n});\n\nInteractable.signals.on('set', function ({ interactable, options }) {\n extend(interactable.events.options, pointerEvents.defaults);\n extend(interactable.events.options, options);\n});\n\nmerge(Interactable.eventTypes, pointerEvents.types);\n\nInteractable.prototype.pointerEvents = function (options) {\n extend(this.events.options, options);\n\n return this;\n};\n\nconst __backCompatOption = Interactable.prototype._backCompatOption;\n\nInteractable.prototype._backCompatOption = function (optionName, newValue) {\n const ret = __backCompatOption.call(this, optionName, newValue);\n\n if (ret === this) {\n this.events.options[optionName] = newValue;\n }\n\n return ret;\n};\n\nInteractable.settingsMethods.push('pointerEvents');\n","const utils = require('./utils');\nconst events = require('./utils/events');\nconst signals = require('./utils/Signals').new();\n\nconst scope = {\n signals,\n events,\n utils,\n\n // main document\n document: require('./utils/domObjects').document,\n // all documents being listened to\n documents: [],\n\n addDocument: function (doc, win) {\n // do nothing if document is already known\n if (utils.contains(scope.documents, doc)) { return false; }\n\n win = win || scope.getWindow(doc);\n\n scope.documents.push(doc);\n events.documents.push(doc);\n\n // don't add an unload event for the main document\n // so that the page may be cached in browser history\n if (doc !== scope.document) {\n events.add(win, 'unload', scope.onWindowUnload);\n }\n\n signals.fire('add-document', { doc, win });\n },\n\n removeDocument: function (doc, win) {\n const index = utils.indexOf(scope.documents, doc);\n\n win = win || scope.getWindow(doc);\n\n events.remove(win, 'unload', scope.onWindowUnload);\n\n scope.documents.splice(index, 1);\n events.documents.splice(index, 1);\n\n signals.fire('remove-document', { win, doc });\n },\n\n onWindowUnload: function () {\n scope.removeDocument(this.document, this);\n },\n};\n\nmodule.exports = scope;\n","const { indexOf } = require('./arr');\n\nclass Signals {\n constructor () {\n this.listeners = {\n // signalName: [listeners],\n };\n }\n\n on (name, listener) {\n if (!this.listeners[name]) {\n this.listeners[name] = [listener];\n return;\n }\n\n this.listeners[name].push(listener);\n }\n\n off (name, listener) {\n if (!this.listeners[name]) { return; }\n\n const index = indexOf(this.listeners[name], listener);\n\n if (index !== -1) {\n this.listeners[name].splice(index, 1);\n }\n }\n\n fire (name, arg) {\n const targetListeners = this.listeners[name];\n\n if (!targetListeners) { return; }\n\n for (let i = 0; i < targetListeners.length; i++) {\n if (targetListeners[i](arg, name) === false) {\n return;\n }\n }\n }\n}\n\nSignals.new = function () {\n return new Signals();\n};\n\nmodule.exports = Signals;\n","function indexOf (array, target) {\n for (let i = 0, len = array.length; i < len; i++) {\n if (array[i] === target) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction contains (array, target) {\n return indexOf(array, target) !== -1;\n}\n\nfunction merge (target, source) {\n for (let i = 0; i < source.length; i++) {\n target.push(source[i]);\n }\n\n return target;\n}\n\nfunction filter (array, test) {\n const result = [];\n\n for (let i = 0; i < array.length; i++) {\n if (test(array[i])) {\n result.push(array[i]);\n }\n }\n\n return result;\n}\n\nmodule.exports = {\n indexOf,\n contains,\n merge,\n filter,\n};\n","const { window } = require('./window');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst Element = domObjects.Element;\nconst navigator = window.navigator;\n\nconst browser = {\n // Does the browser support touch input?\n supportsTouch: !!(('ontouchstart' in window) || is.function(window.DocumentTouch)\n && domObjects.document instanceof window.DocumentTouch),\n\n // Does the browser support PointerEvents\n supportsPointerEvent: !!domObjects.PointerEvent,\n\n isIE8: ('attachEvent' in window) && !('addEventListener' in window),\n\n // Opera Mobile must be handled differently\n isOperaMobile: (navigator.appName === 'Opera'\n && browser.supportsTouch\n && navigator.userAgent.match('Presto')),\n\n // scrolling doesn't change the result of getClientRects on iOS 7\n isIOS7: (/iP(hone|od|ad)/.test(navigator.platform)\n && /OS 7[^\\d]/.test(navigator.appVersion)),\n\n isIe9OrOlder: /MSIE (8|9)/.test(navigator.userAgent),\n\n // prefix matchesSelector\n prefixedMatchesSelector: 'matches' in Element.prototype\n ? 'matches': 'webkitMatchesSelector' in Element.prototype\n ? 'webkitMatchesSelector': 'mozMatchesSelector' in Element.prototype\n ? 'mozMatchesSelector': 'oMatchesSelector' in Element.prototype\n ? 'oMatchesSelector': 'msMatchesSelector',\n\n useMatchesSelectorPolyfill: false,\n\n pEventTypes: (domObjects.PointerEvent\n ? (domObjects.PointerEvent === window.MSPointerEvent\n ? {\n up: 'MSPointerUp',\n down: 'MSPointerDown',\n over: 'mouseover',\n out: 'mouseout',\n move: 'MSPointerMove',\n cancel: 'MSPointerCancel',\n }\n : {\n up: 'pointerup',\n down: 'pointerdown',\n over: 'pointerover',\n out: 'pointerout',\n move: 'pointermove',\n cancel: 'pointercancel',\n })\n : null),\n\n // because Webkit and Opera still use 'mousewheel' event type\n wheelEvent: 'onmousewheel' in domObjects.document? 'mousewheel': 'wheel',\n\n};\n\nbrowser.useMatchesSelectorPolyfill = !is.function(Element.prototype[browser.prefixedMatchesSelector]);\n\nmodule.exports = browser;\n","const domObjects = {};\nconst win = require('./window').window;\n\nfunction blank () {}\n\ndomObjects.document = win.document;\ndomObjects.DocumentFragment = win.DocumentFragment || blank;\ndomObjects.SVGElement = win.SVGElement || blank;\ndomObjects.SVGSVGElement = win.SVGSVGElement || blank;\ndomObjects.SVGElementInstance = win.SVGElementInstance || blank;\ndomObjects.Element = win.Element || blank;\ndomObjects.HTMLElement = win.HTMLElement || domObjects.Element;\n\ndomObjects.Event = win.Event;\ndomObjects.Touch = win.Touch || blank;\ndomObjects.PointerEvent = (win.PointerEvent || win.MSPointerEvent);\n\nmodule.exports = domObjects;\n","const win = require('./window');\nconst browser = require('./browser');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst domUtils = {\n nodeContains: function (parent, child) {\n while (child) {\n if (child === parent) {\n return true;\n }\n\n child = child.parentNode;\n }\n\n return false;\n },\n\n closest: function (element, selector) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) { return element; }\n\n element = domUtils.parentNode(element);\n }\n\n return null;\n },\n\n parentNode: function (node) {\n let parent = node.parentNode;\n\n if (is.docFrag(parent)) {\n // skip past #shado-root fragments\n while ((parent = parent.host) && is.docFrag(parent)) {\n continue;\n }\n\n return parent;\n }\n\n return parent;\n },\n\n // taken from http://tanalin.com/en/blog/2012/12/matches-selector-ie8/ and modified\n matchesSelectorPolyfill: browser.useMatchesSelectorPolyfill\n ? function (element, selector, elems) {\n elems = elems || element.parentNode.querySelectorAll(selector);\n\n for (let i = 0, len = elems.length; i < len; i++) {\n if (elems[i] === element) {\n return true;\n }\n }\n\n return false;\n }\n : null,\n\n matchesSelector: function (element, selector, nodeList) {\n if (browser.useMatchesSelectorPolyfill) {\n return domUtils.matchesSelectorPolyfill(element, selector, nodeList);\n }\n\n // remove /deep/ from selectors if shadowDOM polyfill is used\n if (win.window !== win.realWindow) {\n selector = selector.replace(/\\/deep\\//g, ' ');\n }\n\n return element[browser.prefixedMatchesSelector](selector);\n },\n\n // Test for the element that's \"above\" all other qualifiers\n indexOfDeepestElement: function (elements) {\n let deepestZoneParents = [];\n let dropzoneParents = [];\n let dropzone;\n let deepestZone = elements[0];\n let index = deepestZone? 0: -1;\n let parent;\n let child;\n let i;\n let n;\n\n for (i = 1; i < elements.length; i++) {\n dropzone = elements[i];\n\n // an element might belong to multiple selector dropzones\n if (!dropzone || dropzone === deepestZone) {\n continue;\n }\n\n if (!deepestZone) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n // check if the deepest or current are document.documentElement or document.rootElement\n // - if the current dropzone is, do nothing and continue\n if (dropzone.parentNode === dropzone.ownerDocument) {\n continue;\n }\n // - if deepest is, update with the current dropzone and continue to next\n else if (deepestZone.parentNode === dropzone.ownerDocument) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n if (!deepestZoneParents.length) {\n parent = deepestZone;\n while (parent.parentNode && parent.parentNode !== parent.ownerDocument) {\n deepestZoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n }\n\n // if this element is an svg element and the current deepest is\n // an HTMLElement\n if (deepestZone instanceof domObjects.HTMLElement\n && dropzone instanceof domObjects.SVGElement\n && !(dropzone instanceof domObjects.SVGSVGElement)) {\n\n if (dropzone === deepestZone.parentNode) {\n continue;\n }\n\n parent = dropzone.ownerSVGElement;\n }\n else {\n parent = dropzone;\n }\n\n dropzoneParents = [];\n\n while (parent.parentNode !== parent.ownerDocument) {\n dropzoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n\n n = 0;\n\n // get (position of last common ancestor) + 1\n while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) {\n n++;\n }\n\n const parents = [\n dropzoneParents[n - 1],\n dropzoneParents[n],\n deepestZoneParents[n],\n ];\n\n child = parents[0].lastChild;\n\n while (child) {\n if (child === parents[1]) {\n deepestZone = dropzone;\n index = i;\n deepestZoneParents = [];\n\n break;\n }\n else if (child === parents[2]) {\n break;\n }\n\n child = child.previousSibling;\n }\n }\n\n return index;\n },\n\n matchesUpTo: function (element, selector, limit) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) {\n return true;\n }\n\n element = domUtils.parentNode(element);\n\n if (element === limit) {\n return domUtils.matchesSelector(element, selector);\n }\n }\n\n return false;\n },\n\n getActualElement: function (element) {\n return (element instanceof domObjects.SVGElementInstance\n ? element.correspondingUseElement\n : element);\n },\n\n getScrollXY: function (relevantWindow) {\n relevantWindow = relevantWindow || win.window;\n return {\n x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft,\n y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop,\n };\n },\n\n getElementClientRect: function (element) {\n const clientRect = (element instanceof domObjects.SVGElement\n ? element.getBoundingClientRect()\n : element.getClientRects()[0]);\n\n return clientRect && {\n left : clientRect.left,\n right : clientRect.right,\n top : clientRect.top,\n bottom: clientRect.bottom,\n width : clientRect.width || clientRect.right - clientRect.left,\n height: clientRect.height || clientRect.bottom - clientRect.top,\n };\n },\n\n getElementRect: function (element) {\n const clientRect = domUtils.getElementClientRect(element);\n\n if (!browser.isIOS7 && clientRect) {\n const scroll = domUtils.getScrollXY(win.getWindow(element));\n\n clientRect.left += scroll.x;\n clientRect.right += scroll.x;\n clientRect.top += scroll.y;\n clientRect.bottom += scroll.y;\n }\n\n return clientRect;\n },\n\n getPath: function (element) {\n const path = [];\n\n while (element) {\n path.push(element);\n element = domUtils.parentNode(element);\n }\n\n return path;\n },\n\n trySelector: value => {\n if (!is.string(value)) { return false; }\n\n // an exception will be raised if it is invalid\n domObjects.document.querySelector(value);\n return true;\n },\n};\n\nmodule.exports = domUtils;\n","const is = require('./is');\nconst domUtils = require('./domUtils');\nconst pExtend = require('./pointerExtend');\n\nconst { window, getWindow } = require('./window');\nconst { indexOf, contains } = require('./arr');\n\nconst useAttachEvent = ('attachEvent' in window) && !('addEventListener' in window);\nconst addEvent = useAttachEvent? 'attachEvent': 'addEventListener';\nconst removeEvent = useAttachEvent? 'detachEvent': 'removeEventListener';\nconst on = useAttachEvent? 'on': '';\n\nconst elements = [];\nconst targets = [];\nconst attachedListeners = [];\n\n// {\n// type: {\n// selectors: ['selector', ...],\n// contexts : [document, ...],\n// listeners: [[listener, capture, passive], ...]\n// }\n// }\nconst delegatedEvents = {};\n\nconst documents = [];\n\nconst supportsOptions = !useAttachEvent && (() => {\n let supported = false;\n\n window.document.createElement('div').addEventListener('test', null, {\n get capture () { supported = true; },\n });\n\n return supported;\n})();\n\nfunction add (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n let elementIndex = indexOf(elements, element);\n let target = targets[elementIndex];\n\n if (!target) {\n target = {\n events: {},\n typeCount: 0,\n };\n\n elementIndex = elements.push(element) - 1;\n targets.push(target);\n\n attachedListeners.push(useAttachEvent\n ? {\n supplied: [],\n wrapped : [],\n useCount: [],\n }\n : null);\n }\n\n if (!target.events[type]) {\n target.events[type] = [];\n target.typeCount++;\n }\n\n if (!contains(target.events[type], listener)) {\n let ret;\n\n if (useAttachEvent) {\n const { supplied, wrapped, useCount } = attachedListeners[elementIndex];\n const listenerIndex = indexOf(supplied, listener);\n\n const wrappedListener = wrapped[listenerIndex] || function (event) {\n if (!event.immediatePropagationStopped) {\n event.target = event.srcElement;\n event.currentTarget = element;\n\n event.preventDefault = event.preventDefault || preventDef;\n event.stopPropagation = event.stopPropagation || stopProp;\n event.stopImmediatePropagation = event.stopImmediatePropagation || stopImmProp;\n\n if (/mouse|click/.test(event.type)) {\n event.pageX = event.clientX + getWindow(element).document.documentElement.scrollLeft;\n event.pageY = event.clientY + getWindow(element).document.documentElement.scrollTop;\n }\n\n listener(event);\n }\n };\n\n ret = element[addEvent](on + type, wrappedListener, !!options.capture);\n\n if (listenerIndex === -1) {\n supplied.push(listener);\n wrapped.push(wrappedListener);\n useCount.push(1);\n }\n else {\n useCount[listenerIndex]++;\n }\n }\n else {\n ret = element[addEvent](type, listener, supportsOptions? options : !!options.capture);\n }\n target.events[type].push(listener);\n\n return ret;\n }\n}\n\nfunction remove (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const elementIndex = indexOf(elements, element);\n const target = targets[elementIndex];\n\n if (!target || !target.events) {\n return;\n }\n\n let wrappedListener = listener;\n let listeners;\n let listenerIndex;\n\n if (useAttachEvent) {\n listeners = attachedListeners[elementIndex];\n listenerIndex = indexOf(listeners.supplied, listener);\n wrappedListener = listeners.wrapped[listenerIndex];\n }\n\n if (type === 'all') {\n for (type in target.events) {\n if (target.events.hasOwnProperty(type)) {\n remove(element, type, 'all');\n }\n }\n return;\n }\n\n if (target.events[type]) {\n const len = target.events[type].length;\n\n if (listener === 'all') {\n for (let i = 0; i < len; i++) {\n remove(element, type, target.events[type][i], options);\n }\n return;\n }\n else {\n for (let i = 0; i < len; i++) {\n if (target.events[type][i] === listener) {\n element[removeEvent](on + type, wrappedListener, supportsOptions? options : !!options.capture);\n target.events[type].splice(i, 1);\n\n if (useAttachEvent && listeners) {\n listeners.useCount[listenerIndex]--;\n if (listeners.useCount[listenerIndex] === 0) {\n listeners.supplied.splice(listenerIndex, 1);\n listeners.wrapped.splice(listenerIndex, 1);\n listeners.useCount.splice(listenerIndex, 1);\n }\n }\n\n break;\n }\n }\n }\n\n if (target.events[type] && target.events[type].length === 0) {\n target.events[type] = null;\n target.typeCount--;\n }\n }\n\n if (!target.typeCount) {\n targets.splice(elementIndex, 1);\n elements.splice(elementIndex, 1);\n attachedListeners.splice(elementIndex, 1);\n }\n}\n\nfunction addDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n if (!delegatedEvents[type]) {\n delegatedEvents[type] = {\n selectors: [],\n contexts : [],\n listeners: [],\n };\n\n // add delegate listener functions\n for (let i = 0; i < documents.length; i++) {\n add(documents[i], type, delegateListener);\n add(documents[i], type, delegateUseCapture, true);\n }\n }\n\n const delegated = delegatedEvents[type];\n let index;\n\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n break;\n }\n }\n\n if (index === -1) {\n index = delegated.selectors.length;\n\n delegated.selectors.push(selector);\n delegated.contexts .push(context);\n delegated.listeners.push([]);\n }\n\n // keep listener and capture and passive flags\n delegated.listeners[index].push([listener, !!options.capture, options.passive]);\n}\n\nfunction removeDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const delegated = delegatedEvents[type];\n let matchFound = false;\n let index;\n\n if (!delegated) { return; }\n\n // count from last index of delegated to 0\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n // look for matching selector and context Node\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n\n const listeners = delegated.listeners[index];\n\n // each item of the listeners array is an array: [function, capture, passive]\n for (let i = listeners.length - 1; i >= 0; i--) {\n const [fn, capture, passive] = listeners[i];\n\n // check if the listener functions and capture and passive flags match\n if (fn === listener && capture === !!options.capture && passive === options.passive) {\n // remove the listener from the array of listeners\n listeners.splice(i, 1);\n\n // if all listeners for this interactable have been removed\n // remove the interactable from the delegated arrays\n if (!listeners.length) {\n delegated.selectors.splice(index, 1);\n delegated.contexts .splice(index, 1);\n delegated.listeners.splice(index, 1);\n\n // remove delegate function from context\n remove(context, type, delegateListener);\n remove(context, type, delegateUseCapture, true);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegatedEvents[type] = null;\n }\n }\n\n // only remove one listener\n matchFound = true;\n break;\n }\n }\n\n if (matchFound) { break; }\n }\n }\n}\n\n// bound to the interactable context when a DOM event\n// listener is added to a selector interactable\nfunction delegateListener (event, optionalArg) {\n const options = getOptions(optionalArg);\n const fakeEvent = {};\n const delegated = delegatedEvents[event.type];\n const eventTarget = (domUtils.getActualElement(event.path\n ? event.path[0]\n : event.target));\n let element = eventTarget;\n\n // duplicate the event so that currentTarget can be changed\n pExtend(fakeEvent, event);\n\n fakeEvent.originalEvent = event;\n fakeEvent.preventDefault = preventOriginalDefault;\n\n // climb up document tree looking for selector matches\n while (is.element(element)) {\n for (let i = 0; i < delegated.selectors.length; i++) {\n const selector = delegated.selectors[i];\n const context = delegated.contexts[i];\n\n if (domUtils.matchesSelector(element, selector)\n && domUtils.nodeContains(context, eventTarget)\n && domUtils.nodeContains(context, element)) {\n\n const listeners = delegated.listeners[i];\n\n fakeEvent.currentTarget = element;\n\n for (let j = 0; j < listeners.length; j++) {\n const [fn, capture, passive] = listeners[j];\n\n if (capture === !!options.capture && passive === options.passive) {\n fn(fakeEvent);\n }\n }\n }\n }\n\n element = domUtils.parentNode(element);\n }\n}\n\nfunction delegateUseCapture (event) {\n return delegateListener.call(this, event, true);\n}\n\nfunction preventDef () {\n this.returnValue = false;\n}\n\nfunction preventOriginalDefault () {\n this.originalEvent.preventDefault();\n}\n\nfunction stopProp () {\n this.cancelBubble = true;\n}\n\nfunction stopImmProp () {\n this.cancelBubble = true;\n this.immediatePropagationStopped = true;\n}\n\nfunction getOptions (param) {\n return is.object(param)? param : { capture: param };\n}\n\nmodule.exports = {\n add,\n remove,\n\n addDelegate,\n removeDelegate,\n\n delegateListener,\n delegateUseCapture,\n delegatedEvents,\n documents,\n\n useAttachEvent,\n supportsOptions,\n\n _elements: elements,\n _targets: targets,\n _attachedListeners: attachedListeners,\n};\n","module.exports = function extend (dest, source) {\n for (const prop in source) {\n dest[prop] = source[prop];\n }\n return dest;\n};\n","const {\n resolveRectLike,\n rectToXY,\n} = require('./rect');\n\nmodule.exports = function (target, element, action) {\n const actionOptions = target.options[action];\n const actionOrigin = actionOptions && actionOptions.origin;\n const origin = actionOrigin || target.options.origin;\n\n const originRect = resolveRectLike(origin, target, element, [target && element]);\n\n return rectToXY(originRect) || { x: 0, y: 0 };\n};\n","module.exports = (x, y) => Math.sqrt(x * x + y * y);\n","const extend = require('./extend');\nconst win = require('./window');\n\nconst utils = {\n warnOnce: function (method, message) {\n let warned = false;\n\n return function () {\n if (!warned) {\n win.window.console.warn(message);\n warned = true;\n }\n\n return method.apply(this, arguments);\n };\n },\n\n // http://stackoverflow.com/a/5634528/2280888\n _getQBezierValue: function (t, p1, p2, p3) {\n const iT = 1 - t;\n return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3;\n },\n\n getQuadraticCurvePoint: function (startX, startY, cpX, cpY, endX, endY, position) {\n return {\n x: utils._getQBezierValue(position, startX, cpX, endX),\n y: utils._getQBezierValue(position, startY, cpY, endY),\n };\n },\n\n // http://gizma.com/easing/\n easeOutQuad: function (t, b, c, d) {\n t /= d;\n return -c * t*(t-2) + b;\n },\n\n copyAction: function (dest, src) {\n dest.name = src.name;\n dest.axis = src.axis;\n dest.edges = src.edges;\n\n return dest;\n },\n\n is : require('./is'),\n extend : extend,\n hypot : require('./hypot'),\n getOriginXY: require('./getOriginXY'),\n};\n\nextend(utils, require('./arr'));\nextend(utils, require('./domUtils'));\nextend(utils, require('./pointerUtils'));\nextend(utils, require('./rect'));\n\nmodule.exports = utils;\n","const scope = require('../scope');\nconst utils = require('./index');\nconst browser = require('./browser');\n\nconst finder = {\n methodOrder: [ 'simulationResume', 'mouse', 'hasPointer', 'idle' ],\n\n search: function (pointer, eventType, eventTarget) {\n const mouseEvent = (/mouse/i.test(pointer.pointerType || eventType)\n // MSPointerEvent.MSPOINTER_TYPE_MOUSE\n || pointer.pointerType === 4);\n const pointerId = utils.getPointerId(pointer);\n const details = { pointer, pointerId, mouseEvent, eventType, eventTarget };\n\n for (const method of finder.methodOrder) {\n const interaction = finder[method](details);\n\n if (interaction) {\n return interaction;\n }\n }\n },\n\n // try to resume simulation with a new pointer\n simulationResume: function ({ mouseEvent, eventType, eventTarget }) {\n if (!/down|start/i.test(eventType)) {\n return null;\n }\n\n for (const interaction of scope.interactions) {\n let element = eventTarget;\n\n if (interaction.simulation && interaction.simulation.allowResume\n && (interaction.mouse === mouseEvent)) {\n while (element) {\n // if the element is the interaction element\n if (element === interaction.element) {\n return interaction;\n }\n element = utils.parentNode(element);\n }\n }\n }\n\n return null;\n },\n\n // if it's a mouse interaction\n mouse: function ({ pointerId, mouseEvent, eventType }) {\n if (!mouseEvent && (browser.supportsTouch || browser.supportsPointerEvent)) {\n return null;\n }\n\n let firstNonActive;\n\n for (const interaction of scope.interactions) {\n if (interaction.mouse) {\n // if it's a down event, skip interactions with running simulations\n if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; }\n\n // if the interaction is active, return it immediately\n if (interaction.interacting()) {\n return interaction;\n }\n // otherwise save it and look for another active interaction\n else if (!firstNonActive) {\n firstNonActive = interaction;\n }\n }\n }\n\n // if no active mouse interaction was found use the first inactive mouse\n // interaction\n if (firstNonActive) {\n return firstNonActive;\n }\n\n // Find any interaction specifically for mouse.\n // ignore the interaction if the eventType is a mousedown, and a simulation\n // is active\n for (const interaction of scope.interactions) {\n if (interaction.mouse && !(/down/.test(eventType) && interaction.simulation)) {\n return interaction;\n }\n }\n\n return null;\n },\n\n // get interaction that has this pointer\n hasPointer: function ({ pointerId }) {\n for (const interaction of scope.interactions) {\n if (utils.contains(interaction.pointerIds, pointerId)) {\n return interaction;\n }\n }\n },\n\n // get first idle interaction\n idle: function ({ mouseEvent }) {\n for (const interaction of scope.interactions) {\n // if there's already a pointer held down\n if (interaction.pointerIds.length === 1) {\n const target = interaction.target;\n // don't add this pointer if there is a target interactable and it\n // isn't gesturable\n if (target && !target.options.gesture.enabled) {\n continue;\n }\n }\n // maximum of 2 pointers per interaction\n else if (interaction.pointerIds.length >= 2) {\n continue;\n }\n\n if (!interaction.interacting() && (mouseEvent === interaction.mouse)) {\n return interaction;\n }\n }\n\n return null;\n },\n};\n\nmodule.exports = finder;\n","const win = require('./window');\nconst isWindow = require('./isWindow');\n\nconst is = {\n array : () => {},\n\n window : thing => thing === win.window || isWindow(thing),\n\n docFrag : thing => is.object(thing) && thing.nodeType === 11,\n\n object : thing => !!thing && (typeof thing === 'object'),\n\n function: thing => typeof thing === 'function',\n\n number : thing => typeof thing === 'number' ,\n\n bool : thing => typeof thing === 'boolean' ,\n\n string : thing => typeof thing === 'string' ,\n\n element: thing => {\n if (!thing || (typeof thing !== 'object')) { return false; }\n\n const _window = win.getWindow(thing) || win.window;\n\n return (/object|function/.test(typeof _window.Element)\n ? thing instanceof _window.Element //DOM2\n : thing.nodeType === 1 && typeof thing.nodeName === 'string');\n },\n};\n\nis.array = thing => (is.object(thing)\n && (typeof thing.length !== 'undefined')\n && is.function(thing.splice));\n\nmodule.exports = is;\n","module.exports = (thing) => !!(thing && thing.Window) && (thing instanceof thing.Window);\n","function pointerExtend (dest, source) {\n for (const prop in source) {\n const prefixedPropREs = module.exports.prefixedPropREs;\n let deprecated = false;\n\n // skip deprecated prefixed properties\n for (const vendor in prefixedPropREs) {\n if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) {\n deprecated = true;\n break;\n }\n }\n\n if (!deprecated && typeof source[prop] !== 'function') {\n dest[prop] = source[prop];\n }\n }\n return dest;\n}\n\npointerExtend.prefixedPropREs = {\n webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/,\n};\n\nmodule.exports = pointerExtend;\n","const hypot = require('./hypot');\nconst browser = require('./browser');\nconst dom = require('./domObjects');\nconst domUtils = require('./domUtils');\nconst is = require('./is');\nconst pointerExtend = require('./pointerExtend');\n\nconst pointerUtils = {\n copyCoords: function (dest, src) {\n dest.page = dest.page || {};\n dest.page.x = src.page.x;\n dest.page.y = src.page.y;\n\n dest.client = dest.client || {};\n dest.client.x = src.client.x;\n dest.client.y = src.client.y;\n\n dest.timeStamp = src.timeStamp;\n },\n\n setCoordDeltas: function (targetObj, prev, cur) {\n targetObj.page.x = cur.page.x - prev.page.x;\n targetObj.page.y = cur.page.y - prev.page.y;\n targetObj.client.x = cur.client.x - prev.client.x;\n targetObj.client.y = cur.client.y - prev.client.y;\n targetObj.timeStamp = cur.timeStamp - prev.timeStamp;\n\n // set pointer velocity\n const dt = Math.max(targetObj.timeStamp / 1000, 0.001);\n\n targetObj.page.speed = hypot(targetObj.page.x, targetObj.page.y) / dt;\n targetObj.page.vx = targetObj.page.x / dt;\n targetObj.page.vy = targetObj.page.y / dt;\n\n targetObj.client.speed = hypot(targetObj.client.x, targetObj.page.y) / dt;\n targetObj.client.vx = targetObj.client.x / dt;\n targetObj.client.vy = targetObj.client.y / dt;\n },\n\n isNativePointer: function (pointer) {\n return (pointer instanceof dom.Event || pointer instanceof dom.Touch);\n },\n\n // Get specified X/Y coords for mouse or event.touches[0]\n getXY: function (type, pointer, xy) {\n xy = xy || {};\n type = type || 'page';\n\n xy.x = pointer[type + 'X'];\n xy.y = pointer[type + 'Y'];\n\n return xy;\n },\n\n getPageXY: function (pointer, page) {\n page = page || {};\n\n // Opera Mobile handles the viewport and scrolling oddly\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n pointerUtils.getXY('screen', pointer, page);\n\n page.x += window.scrollX;\n page.y += window.scrollY;\n }\n else {\n pointerUtils.getXY('page', pointer, page);\n }\n\n return page;\n },\n\n getClientXY: function (pointer, client) {\n client = client || {};\n\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n // Opera Mobile handles the viewport and scrolling oddly\n pointerUtils.getXY('screen', pointer, client);\n }\n else {\n pointerUtils.getXY('client', pointer, client);\n }\n\n return client;\n },\n\n getPointerId: function (pointer) {\n return is.number(pointer.pointerId)? pointer.pointerId : pointer.identifier;\n },\n\n setCoords: function (targetObj, pointers, timeStamp) {\n const pointer = (pointers.length > 1\n ? pointerUtils.pointerAverage(pointers)\n : pointers[0]);\n\n const tmpXY = {};\n\n pointerUtils.getPageXY(pointer, tmpXY);\n targetObj.page.x = tmpXY.x;\n targetObj.page.y = tmpXY.y;\n\n pointerUtils.getClientXY(pointer, tmpXY);\n targetObj.client.x = tmpXY.x;\n targetObj.client.y = tmpXY.y;\n\n targetObj.timeStamp = is.number(timeStamp) ? timeStamp :new Date().getTime();\n },\n\n pointerExtend: pointerExtend,\n\n getTouchPair: function (event) {\n const touches = [];\n\n // array of touches is supplied\n if (is.array(event)) {\n touches[0] = event[0];\n touches[1] = event[1];\n }\n // an event\n else {\n if (event.type === 'touchend') {\n if (event.touches.length === 1) {\n touches[0] = event.touches[0];\n touches[1] = event.changedTouches[0];\n }\n else if (event.touches.length === 0) {\n touches[0] = event.changedTouches[0];\n touches[1] = event.changedTouches[1];\n }\n }\n else {\n touches[0] = event.touches[0];\n touches[1] = event.touches[1];\n }\n }\n\n return touches;\n },\n\n pointerAverage: function (pointers) {\n const average = {\n pageX : 0,\n pageY : 0,\n clientX: 0,\n clientY: 0,\n screenX: 0,\n screenY: 0,\n };\n\n for (const pointer of pointers) {\n for (const prop in average) {\n average[prop] += pointer[prop];\n }\n }\n for (const prop in average) {\n average[prop] /= pointers.length;\n }\n\n return average;\n },\n\n touchBBox: function (event) {\n if (!event.length && !(event.touches && event.touches.length > 1)) {\n return;\n }\n\n const touches = pointerUtils.getTouchPair(event);\n const minX = Math.min(touches[0].pageX, touches[1].pageX);\n const minY = Math.min(touches[0].pageY, touches[1].pageY);\n const maxX = Math.max(touches[0].pageX, touches[1].pageX);\n const maxY = Math.max(touches[0].pageY, touches[1].pageY);\n\n return {\n x: minX,\n y: minY,\n left: minX,\n top: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n },\n\n touchDistance: function (event, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n\n\n const dx = touches[0][sourceX] - touches[1][sourceX];\n const dy = touches[0][sourceY] - touches[1][sourceY];\n\n return hypot(dx, dy);\n },\n\n touchAngle: function (event, prevAngle, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n const dx = touches[1][sourceX] - touches[0][sourceX];\n const dy = touches[1][sourceY] - touches[0][sourceY];\n const angle = 180 * Math.atan2(dy , dx) / Math.PI;\n\n return angle;\n },\n\n getPointerType: function (pointer, interaction) {\n // if the PointerEvent API isn't available, then the pointer must be ither\n // a MouseEvent or TouchEvent\n if (interaction.mouse) { return 'mouse'; }\n if (!browser.supportsPointerEvent) { return 'touch'; }\n\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : [undefined, undefined,'touch', 'pen', 'mouse'][pointer.pointerType];\n },\n\n // [ event.target, event.currentTarget ]\n getEventTargets: function (event) {\n return [\n domUtils.getActualElement(event.path ? event.path[0] : event.target),\n domUtils.getActualElement(event.currentTarget),\n ];\n },\n};\n\nmodule.exports = pointerUtils;\n","const { window } = require('./window');\n\nconst vendors = ['ms', 'moz', 'webkit', 'o'];\nlet lastTime = 0;\nlet request;\nlet cancel;\n\nfor (let x = 0; x < vendors.length && !window.requestAnimationFrame; x++) {\n request = window[vendors[x] + 'RequestAnimationFrame'];\n cancel = window[vendors[x] +'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n}\n\nif (!request) {\n request = function (callback) {\n const currTime = new Date().getTime();\n const timeToCall = Math.max(0, 16 - (currTime - lastTime));\n const id = setTimeout(function () { callback(currTime + timeToCall); },\n timeToCall);\n\n lastTime = currTime + timeToCall;\n return id;\n };\n}\n\nif (!cancel) {\n cancel = function (id) {\n clearTimeout(id);\n };\n}\n\nmodule.exports = {\n request,\n cancel,\n};\n","const extend = require('./extend');\nconst is = require('./is');\nconst {\n closest,\n parentNode,\n getElementRect,\n} = require('./domUtils');\n\nconst rectUtils = {\n getStringOptionResult: function (value, interactable, element) {\n if (!is.string(value)) {\n return null;\n }\n\n if (value === 'parent') {\n value = parentNode(element);\n }\n else if (value === 'self') {\n value = interactable.getRect(element);\n }\n else {\n value = closest(element, value);\n }\n\n return value;\n },\n\n resolveRectLike: function (value, interactable, element, functionArgs) {\n value = rectUtils.getStringOptionResult(value, interactable, element) || value;\n\n if (is.function(value)) {\n value = value.apply(null, functionArgs);\n }\n\n if (is.element(value)) {\n value = getElementRect(value);\n }\n\n return value;\n },\n\n rectToXY: function (rect) {\n return rect && {\n x: 'x' in rect ? rect.x : rect.left,\n y: 'y' in rect ? rect.y : rect.top,\n };\n },\n\n xywhToTlbr: function (rect) {\n if (rect && !('left' in rect && 'top' in rect)) {\n rect = extend({}, rect);\n\n rect.left = rect.x || 0;\n rect.top = rect.y || 0;\n rect.right = rect.right || (rect.left + rect.width);\n rect.bottom = rect.bottom || (rect.top + rect.height);\n }\n\n return rect;\n },\n\n tlbrToXywh: function (rect) {\n if (rect && !('x' in rect && 'y' in rect)) {\n rect = extend({}, rect);\n\n rect.x = rect.left || 0;\n rect.top = rect.top || 0;\n rect.width = rect.width || (rect.right - rect.x);\n rect.height = rect.height || (rect.bottom - rect.y);\n }\n\n return rect;\n },\n};\n\nmodule.exports = rectUtils;\n","const win = module.exports;\nconst isWindow = require('./isWindow');\n\nfunction init (window) {\n // get wrapped window if using Shadow DOM polyfill\n\n win.realWindow = window;\n\n // create a TextNode\n const el = window.document.createTextNode('');\n\n // check if it's wrapped by a polyfill\n if (el.ownerDocument !== window.document\n && typeof window.wrap === 'function'\n && window.wrap(el) === el) {\n // use wrapped window\n window = window.wrap(window);\n }\n\n win.window = window;\n}\n\nif (typeof window === 'undefined') {\n win.window = undefined;\n win.realWindow = undefined;\n}\nelse {\n init(window);\n}\n\nwin.getWindow = function getWindow (node) {\n if (isWindow(node)) {\n return node;\n }\n\n const rootNode = (node.ownerDocument || node);\n\n return rootNode.defaultView || rootNode.parentWindow || win.window;\n};\n\nwin.init = init;\n"]} \ No newline at end of file +{"version":3,"sources":["src/header.js","node_modules/browser-pack/_prelude.js","index.js","src/Eventable.js","src/InteractEvent.js","src/Interactable.js","src/Interaction.js","src/actions/base.js","src/actions/drag.js","src/actions/drop.js","src/actions/gesture.js","src/actions/resize.js","src/autoScroll.js","src/autoStart/InteractableMethods.js","src/autoStart/base.js","src/autoStart/delay.js","src/autoStart/drag.js","src/autoStart/gesture.js","src/autoStart/resize.js","src/defaultOptions.js","src/index.js","src/inertia.js","src/interact.js","src/interactablePreventDefault.js","src/legacyBrowsers.js","src/modifiers/index.js","src/modifiers/restrict.js","src/modifiers/restrictEdges.js","src/modifiers/restrictSize.js","src/modifiers/snap.js","src/modifiers/snapSize.js","src/pointerEvents/PointerEvent.js","src/pointerEvents/base.js","src/pointerEvents/holdRepeat.js","src/pointerEvents/interactableTargets.js","src/scope.js","src/utils/Signals.js","src/utils/arr.js","src/utils/browser.js","src/utils/domObjects.js","src/utils/domUtils.js","src/utils/events.js","src/utils/extend.js","src/utils/getOriginXY.js","src/utils/hypot.js","src/utils/index.js","src/utils/interactionFinder.js","src/utils/is.js","src/utils/isWindow.js","src/utils/pointerExtend.js","src/utils/pointerUtils.js","src/utils/raf.js","src/utils/rect.js","src/utils/window.js"],"names":[],"mappings":"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","file":"interact.js","sourceRoot":"","sourcesContent":["/**\n * interact.js v1.3.0-alpha.4+sha.7970416-dirty\n *\n * Copyright (c) 2012-2017 Taye Adeyemi \n * Open source under the MIT License.\n * https://raw.github.com/taye/interact.js/master/LICENSE\n */\n","(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o 150) {\n return null;\n }\n\n let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI;\n const overlap = 22.5;\n\n if (angle < 0) {\n angle += 360;\n }\n\n const left = 135 - overlap <= angle && angle < 225 + overlap;\n const up = 225 - overlap <= angle && angle < 315 + overlap;\n\n const right = !left && (315 - overlap <= angle || angle < 45 + overlap);\n const down = !up && 45 - overlap <= angle && angle < 135 + overlap;\n\n return {\n up,\n down,\n left,\n right,\n angle,\n speed: interaction.prevEvent.speed,\n velocity: {\n x: interaction.prevEvent.velocityX,\n y: interaction.prevEvent.velocityY,\n },\n };\n }\n\n preventDefault () {}\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n}\n\nsignals.on('set-delta', function ({ iEvent, interaction, starting, deltaSource }) {\n const prevEvent = starting? iEvent : interaction.prevEvent;\n\n if (deltaSource === 'client') {\n iEvent.dx = iEvent.clientX - prevEvent.clientX;\n iEvent.dy = iEvent.clientY - prevEvent.clientY;\n }\n else {\n iEvent.dx = iEvent.pageX - prevEvent.pageX;\n iEvent.dy = iEvent.pageY - prevEvent.pageY;\n }\n});\n\nInteractEvent.signals = signals;\n\nmodule.exports = InteractEvent;\n","const is = require('./utils/is');\nconst events = require('./utils/events');\nconst extend = require('./utils/extend');\nconst actions = require('./actions/base');\nconst scope = require('./scope');\nconst Eventable = require('./Eventable');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nconst {\n getElementRect,\n nodeContains,\n trySelector,\n} = require('./utils/domUtils');\nconst { getWindow } = require('./utils/window');\nconst { indexOf, contains } = require('./utils/arr');\nconst { wheelEvent } = require('./utils/browser');\n\n// all set interactables\nscope.interactables = [];\n\n/*\\\n * Interactable\n [ property ]\n **\n * Object type returned by @interact\n\\*/\nclass Interactable {\n constructor (target, options) {\n options = options || {};\n\n this.target = target;\n this.events = new Eventable();\n this._context = options.context || scope.document;\n this._win = getWindow(trySelector(target)? this._context : target);\n this._doc = this._win.document;\n\n signals.fire('new', {\n target,\n options,\n interactable: this,\n win: this._win,\n });\n\n scope.addDocument( this._doc, this._win );\n\n scope.interactables.push(this);\n\n this.set(options);\n }\n\n setOnEvents (action, phases) {\n const onAction = 'on' + action;\n\n if (is.function(phases.onstart) ) { this.events[onAction + 'start' ] = phases.onstart ; }\n if (is.function(phases.onmove) ) { this.events[onAction + 'move' ] = phases.onmove ; }\n if (is.function(phases.onend) ) { this.events[onAction + 'end' ] = phases.onend ; }\n if (is.function(phases.oninertiastart)) { this.events[onAction + 'inertiastart' ] = phases.oninertiastart ; }\n\n return this;\n }\n\n setPerAction (action, options) {\n // for all the default per-action options\n for (const option in options) {\n // if this option exists for this action\n if (option in defaults[action]) {\n // if the option in the options arg is an object value\n if (is.object(options[option])) {\n // duplicate the object\n this.options[action][option] = extend(this.options[action][option] || {}, options[option]);\n\n if (is.object(defaults.perAction[option]) && 'enabled' in defaults.perAction[option]) {\n this.options[action][option].enabled = options[option].enabled === false? false : true;\n }\n }\n else if (is.bool(options[option]) && is.object(defaults.perAction[option])) {\n this.options[action][option].enabled = options[option];\n }\n else if (options[option] !== undefined) {\n // or if it's not undefined, do a plain assignment\n this.options[action][option] = options[option];\n }\n }\n }\n }\n\n /*\\\n * Interactable.getRect\n [ method ]\n *\n * The default function to get an Interactables bounding rect. Can be\n * overridden using @Interactable.rectChecker.\n *\n - element (Element) #optional The element to measure.\n = (object) The object's bounding rectangle.\n o {\n o top : 0,\n o left : 0,\n o bottom: 0,\n o right : 0,\n o width : 0,\n o height: 0\n o }\n \\*/\n getRect (element) {\n element = element || this.target;\n\n if (is.string(this.target) && !(is.element(element))) {\n element = this._context.querySelector(this.target);\n }\n\n return getElementRect(element);\n }\n\n /*\\\n * Interactable.rectChecker\n [ method ]\n *\n * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n - checker (function) #optional A function which returns this Interactable's bounding rectangle. See @Interactable.getRect\n = (function | object) The checker function or this Interactable\n \\*/\n rectChecker (checker) {\n if (is.function(checker)) {\n this.getRect = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.getRect;\n\n return this;\n }\n\n return this.getRect;\n }\n\n _backCompatOption (optionName, newValue) {\n if (trySelector(newValue) || is.object(newValue)) {\n this.options[optionName] = newValue;\n\n for (const action of actions.names) {\n this.options[action][optionName] = newValue;\n }\n\n return this;\n }\n\n return this.options[optionName];\n }\n\n /*\\\n * Interactable.origin\n [ method ]\n *\n * Gets or sets the origin of the Interactable's element. The x and y\n * of the origin will be subtracted from action event coordinates.\n *\n - origin (object | string) #optional An object eg. { x: 0, y: 0 } or string 'parent', 'self' or any CSS selector\n * OR\n - origin (Element) #optional An HTML or SVG Element whose rect will be used\n **\n = (object) The current origin or this Interactable\n \\*/\n origin (newValue) {\n return this._backCompatOption('origin', newValue);\n }\n\n /*\\\n * Interactable.deltaSource\n [ method ]\n *\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n - newValue (string) #optional Use 'client' if you will be scrolling while interacting; Use 'page' if you want autoScroll to work\n = (string | object) The current deltaSource or this Interactable\n \\*/\n deltaSource (newValue) {\n if (newValue === 'page' || newValue === 'client') {\n this.options.deltaSource = newValue;\n\n return this;\n }\n\n return this.options.deltaSource;\n }\n\n /*\\\n * Interactable.context\n [ method ]\n *\n * Gets the selector context Node of the Interactable. The default is `window.document`.\n *\n = (Node) The context Node of this Interactable\n **\n \\*/\n context () {\n return this._context;\n }\n\n inContext (element) {\n return (this._context === element.ownerDocument\n || nodeContains(this._context, element));\n }\n\n /*\\\n * Interactable.fire\n [ method ]\n *\n * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n - iEvent (InteractEvent) The InteractEvent object to be fired on this Interactable\n = (Interactable) this Interactable\n \\*/\n fire (iEvent) {\n this.events.fire(iEvent);\n\n return this;\n }\n\n _onOffMultiple (method, eventType, listener, options) {\n if (is.string(eventType) && eventType.search(' ') !== -1) {\n eventType = eventType.trim().split(/ +/);\n }\n\n if (is.array(eventType)) {\n for (let i = 0; i < eventType.length; i++) {\n this[method](eventType[i], listener, options);\n }\n\n return true;\n }\n\n if (is.object(eventType)) {\n for (const prop in eventType) {\n this[method](prop, eventType[prop], listener);\n }\n\n return true;\n }\n }\n\n /*\\\n * Interactable.on\n [ method ]\n *\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n - eventType (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) This Interactable\n \\*/\n on (eventType, listener, options) {\n if (this._onOffMultiple('on', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.on(eventType, listener);\n }\n // delegated event for selector\n else if (is.string(this.target)) {\n events.addDelegate(this.target, this._context, eventType, listener, options);\n }\n else {\n events.add(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.off\n [ method ]\n *\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n - eventType (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) This Interactable\n \\*/\n off (eventType, listener, options) {\n if (this._onOffMultiple('off', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n // if it is an action event type\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.off(eventType, listener);\n }\n // delegated event\n else if (is.string(this.target)) {\n events.removeDelegate(this.target, this._context, eventType, listener, options);\n }\n // remove listener from this Interatable's element\n else {\n events.remove(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.set\n [ method ]\n *\n * Reset the options of this Interactable\n - options (object) The new settings to apply\n = (object) This Interactable\n \\*/\n set (options) {\n if (!is.object(options)) {\n options = {};\n }\n\n this.options = extend({}, defaults.base);\n\n const perActions = extend({}, defaults.perAction);\n\n for (const actionName in actions.methodDict) {\n const methodName = actions.methodDict[actionName];\n\n this.options[actionName] = extend({}, defaults[actionName]);\n\n this.setPerAction(actionName, perActions);\n\n this[methodName](options[actionName]);\n }\n\n for (const setting of Interactable.settingsMethods) {\n this.options[setting] = defaults.base[setting];\n\n if (setting in options) {\n this[setting](options[setting]);\n }\n }\n\n signals.fire('set', {\n options,\n interactable: this,\n });\n\n return this;\n }\n\n /*\\\n * Interactable.unset\n [ method ]\n *\n * Remove this interactable from the list of interactables and remove\n * it's action capabilities and event listeners\n *\n = (object) @interact\n \\*/\n unset () {\n events.remove(this.target, 'all');\n\n if (is.string(this.target)) {\n // remove delegated events\n for (const type in events.delegatedEvents) {\n const delegated = events.delegatedEvents[type];\n\n if (delegated.selectors[0] === this.target\n && delegated.contexts[0] === this._context) {\n\n delegated.selectors.splice(0, 1);\n delegated.contexts .splice(0, 1);\n delegated.listeners.splice(0, 1);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegated[type] = null;\n }\n }\n\n events.remove(this._context, type, events.delegateListener);\n events.remove(this._context, type, events.delegateUseCapture, true);\n }\n }\n else {\n events.remove(this, 'all');\n }\n\n signals.fire('unset', { interactable: this });\n\n scope.interactables.splice(indexOf(scope.interactables, this), 1);\n\n // Stop related interactions when an Interactable is unset\n for (const interaction of scope.interactions || []) {\n if (interaction.target === this && interaction.interacting()) {\n interaction.stop();\n }\n }\n\n return scope.interact;\n }\n}\n\nscope.interactables.indexOfElement = function indexOfElement (target, context) {\n context = context || scope.document;\n\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n if (interactable.target === target && interactable._context === context) {\n return i;\n }\n }\n return -1;\n};\n\nscope.interactables.get = function interactableGet (element, options, dontCheckInContext) {\n const ret = this[this.indexOfElement(element, options && options.context)];\n\n return ret && (is.string(element) || dontCheckInContext || ret.inContext(element))? ret : null;\n};\n\nscope.interactables.forEachSelector = function (callback, element) {\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n // skip non CSS selector targets and out of context elements\n if (!is.string(interactable.target)\n || (element && !interactable.inContext(element))) {\n continue;\n }\n\n const ret = callback(interactable, interactable.target, interactable._context, i, this);\n\n if (ret !== undefined) {\n return ret;\n }\n }\n};\n\n// all interact.js eventTypes\nInteractable.eventTypes = scope.eventTypes = [];\n\nInteractable.signals = signals;\n\nInteractable.settingsMethods = [ 'deltaSource', 'origin', 'preventDefault', 'rectChecker' ];\n\nmodule.exports = Interactable;\n","const scope = require('./scope');\nconst utils = require('./utils');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst domObjects = require('./utils/domObjects');\nconst finder = require('./utils/interactionFinder');\nconst signals = require('./utils/Signals').new();\n\nconst listeners = {};\nconst methodNames = [\n 'pointerDown', 'pointerMove', 'pointerUp',\n 'updatePointer', 'removePointer',\n];\n\n// for ignoring browser's simulated mouse events\nlet prevTouchTime = 0;\n\n// all active and idle interactions\nscope.interactions = [];\n\nclass Interaction {\n constructor ({ pointerType }) {\n this.target = null; // current interactable being interacted with\n this.element = null; // the target element of the interactable\n\n this.prepared = { // action that's ready to be fired on next move event\n name : null,\n axis : null,\n edges: null,\n };\n\n // keep track of added pointers\n this.pointers = [];\n this.pointerIds = [];\n this.downTargets = [];\n this.downTimes = [];\n\n // Previous native pointer move event coordinates\n this.prevCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n // current native pointer move event coordinates\n this.curCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Starting InteractEvent pointer coordinates\n this.startCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Change in coordinates and time of the pointer\n this.pointerDelta = {\n page : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n client : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n timeStamp: 0,\n };\n\n this.downEvent = null; // pointerdown/mousedown/touchstart event\n this.downPointer = {};\n\n this._eventTarget = null;\n this._curEventTarget = null;\n\n this.prevEvent = null; // previous action event\n\n this.pointerIsDown = false;\n this.pointerWasMoved = false;\n this._interacting = false;\n\n this.pointerType = pointerType;\n\n signals.fire('new', this);\n\n scope.interactions.push(this);\n }\n\n pointerDown (pointer, event, eventTarget) {\n const pointerIndex = this.updatePointer(pointer, event, true);\n\n signals.fire('down', {\n pointer,\n event,\n eventTarget,\n pointerIndex,\n interaction: this,\n });\n }\n\n /*\\\n * Interaction.start\n [ method ]\n *\n * Start an action with the given Interactable and Element as tartgets. The\n * action must be enabled for the target Interactable and an appropriate number\n * of pointers must be held down - 1 for drag/resize, 2 for gesture.\n *\n * Use it with `interactable.able({ manualStart: false })` to always\n * [start actions manually](https://github.com/taye/interact.js/issues/114)\n *\n - action (object) The action to be performed - drag, resize, etc.\n - target (Interactable) The Interactable to target\n - element (Element) The DOM Element to target\n = (object) interact\n **\n | interact(target)\n | .draggable({\n | // disable the default drag start by down->move\n | manualStart: true\n | })\n | // start dragging after the user holds the pointer down\n | .on('hold', function (event) {\n | var interaction = event.interaction;\n |\n | if (!interaction.interacting()) {\n | interaction.start({ name: 'drag' },\n | event.interactable,\n | event.currentTarget);\n | }\n | });\n \\*/\n start (action, target, element) {\n if (this.interacting()\n || !this.pointerIsDown\n || this.pointerIds.length < (action.name === 'gesture'? 2 : 1)) {\n return;\n }\n\n // if this interaction had been removed after stopping\n // add it back\n if (utils.indexOf(scope.interactions, this) === -1) {\n scope.interactions.push(this);\n }\n\n utils.copyAction(this.prepared, action);\n this.target = target;\n this.element = element;\n\n signals.fire('action-start', {\n interaction: this,\n event: this.downEvent,\n });\n }\n\n pointerMove (pointer, event, eventTarget) {\n if (!this.simulation) {\n this.updatePointer(pointer);\n utils.setCoords(this.curCoords, this.pointers);\n }\n\n const duplicateMove = (this.curCoords.page.x === this.prevCoords.page.x\n && this.curCoords.page.y === this.prevCoords.page.y\n && this.curCoords.client.x === this.prevCoords.client.x\n && this.curCoords.client.y === this.prevCoords.client.y);\n\n let dx;\n let dy;\n\n // register movement greater than pointerMoveTolerance\n if (this.pointerIsDown && !this.pointerWasMoved) {\n dx = this.curCoords.client.x - this.startCoords.client.x;\n dy = this.curCoords.client.y - this.startCoords.client.y;\n\n this.pointerWasMoved = utils.hypot(dx, dy) > Interaction.pointerMoveTolerance;\n }\n\n const signalArg = {\n pointer,\n pointerIndex: this.getPointerIndex(pointer),\n event,\n eventTarget,\n dx,\n dy,\n duplicate: duplicateMove,\n interaction: this,\n interactingBeforeMove: this.interacting(),\n };\n\n if (!duplicateMove) {\n // set pointer coordinate, time changes and speeds\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n }\n\n signals.fire('move', signalArg);\n\n if (!duplicateMove) {\n // if interacting, fire an 'action-move' signal etc\n if (this.interacting()) {\n this.doMove(signalArg);\n }\n\n if (this.pointerWasMoved) {\n utils.copyCoords(this.prevCoords, this.curCoords);\n }\n }\n }\n\n /*\\\n * Interaction.doMove\n [ method ]\n *\n * Force a move of the current action at the same coordinates. Useful if\n * snap/restrict has been changed and you want a movement with the new\n * settings.\n *\n **\n | interact(target)\n | .draggable(true)\n | .on('dragmove', function (event) {\n | if (someCondition) {\n | // change the snap settings\n | event.interactable.draggable({ snap: { targets: [] }});\n | // fire another move event with re-calculated snap\n | event.interaction.doMove();\n | }\n | });\n \\*/\n doMove (signalArg) {\n signalArg = utils.extend({\n pointer: this.pointers[0],\n event: this.prevEvent,\n eventTarget: this._eventTarget,\n interaction: this,\n }, signalArg || {});\n\n signals.fire('before-action-move', signalArg);\n\n if (!this._dontFireMove) {\n signals.fire('action-move', signalArg);\n }\n\n this._dontFireMove = false;\n }\n\n // End interact move events and stop auto-scroll unless simulation is running\n pointerUp (pointer, event, eventTarget, curEventTarget) {\n const pointerIndex = this.getPointerIndex(pointer);\n\n signals.fire(/cancel$/i.test(event.type)? 'cancel' : 'up', {\n pointer,\n pointerIndex,\n event,\n eventTarget,\n curEventTarget,\n interaction: this,\n });\n\n if (!this.simulation) {\n this.end(event);\n }\n\n this.pointerIsDown = false;\n this.removePointer(pointer, event);\n }\n\n /*\\\n * Interaction.end\n [ method ]\n *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n - event (PointerEvent) #optional\n **\n | interact(target)\n | .draggable(true)\n | .on('move', function (event) {\n | if (event.pageX > 1000) {\n | // end the current action\n | event.interaction.end();\n | // stop all further listeners from being called\n | event.stopImmediatePropagation();\n | }\n | });\n \\*/\n end (event) {\n event = event || this.prevEvent;\n\n if (this.interacting()) {\n signals.fire('action-end', {\n event,\n interaction: this,\n });\n }\n\n this.stop();\n }\n\n currentAction () {\n return this._interacting? this.prepared.name: null;\n }\n\n interacting () {\n return this._interacting;\n }\n\n stop () {\n signals.fire('stop', { interaction: this });\n\n if (this._interacting) {\n signals.fire('stop-active', { interaction: this });\n signals.fire('stop-' + this.prepared.name, { interaction: this });\n }\n\n this.target = this.element = null;\n\n this._interacting = false;\n this.prepared.name = this.prevEvent = null;\n }\n\n getPointerIndex (pointer) {\n // mouse and pen interactions may have only one pointer\n if (this.pointerType === 'mouse' || this.pointerType === 'pen') {\n return 0;\n }\n\n return utils.indexOf(this.pointerIds, utils.getPointerId(pointer));\n }\n\n updatePointer (pointer, event, down = event && /(down|start)$/i.test(event.type)) {\n const id = utils.getPointerId(pointer);\n let index = this.getPointerIndex(pointer);\n\n if (index === -1) {\n index = this.pointerIds.length;\n this.pointerIds[index] = id;\n }\n\n if (down) {\n signals.fire('update-pointer-down', {\n pointer,\n event,\n down,\n pointerId: id,\n pointerIndex: index,\n interaction: this,\n });\n }\n\n this.pointers[index] = pointer;\n\n return index;\n }\n\n removePointer (pointer, event) {\n const index = this.getPointerIndex(pointer);\n\n if (index === -1) { return; }\n\n signals.fire('remove-pointer', {\n pointer,\n event,\n pointerIndex: index,\n interaction: this,\n });\n\n this.pointers .splice(index, 1);\n this.pointerIds .splice(index, 1);\n this.downTargets.splice(index, 1);\n this.downTimes .splice(index, 1);\n }\n\n _updateEventTargets (target, currentTarget) {\n this._eventTarget = target;\n this._curEventTarget = currentTarget;\n }\n}\n\nfor (let i = 0, len = methodNames.length; i < len; i++) {\n const method = methodNames[i];\n\n listeners[method] = doOnInteractions(method);\n}\n\nfunction doOnInteractions (method) {\n return (function (event) {\n const pointerType = utils.getPointerType(event);\n const [eventTarget, curEventTarget] = utils.getEventTargets(event);\n const matches = []; // [ [pointer, interaction], ...]\n\n if (browser.supportsTouch && /touch/.test(event.type)) {\n prevTouchTime = new Date().getTime();\n\n for (let i = 0; i < event.changedTouches.length; i++) {\n const pointer = event.changedTouches[i];\n const interaction = finder.search(pointer, event.type, eventTarget);\n\n matches.push([pointer, interaction || new Interaction({ pointerType })]);\n }\n }\n else {\n let invalidPointer = false;\n\n if (!browser.supportsPointerEvent && /mouse/.test(event.type)) {\n // ignore mouse events while touch interactions are active\n for (let i = 0; i < scope.interactions.length && !invalidPointer; i++) {\n invalidPointer = scope.interactions[i].pointerType !== 'mouse' && scope.interactions[i].pointerIsDown;\n }\n\n // try to ignore mouse events that are simulated by the browser\n // after a touch event\n invalidPointer = invalidPointer\n || (new Date().getTime() - prevTouchTime < 500)\n // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated\n || event.timeStamp === 0;\n }\n\n if (!invalidPointer) {\n let interaction = finder.search(event, event.type, eventTarget);\n\n if (!interaction) {\n interaction = new Interaction({ pointerType });\n }\n\n matches.push([event, interaction]);\n }\n }\n\n for (const [pointer, interaction] of matches) {\n interaction._updateEventTargets(eventTarget, curEventTarget);\n interaction[method](pointer, event, eventTarget, curEventTarget);\n }\n });\n}\n\nfunction endAll (event) {\n for (let i = 0; i < scope.interactions.length; i++) {\n const interaction = scope.interactions[i];\n\n interaction.end(event);\n signals.fire('endall', { event, interaction });\n }\n}\n\nconst docEvents = { /* 'eventType': listenerFunc */ };\nconst pEventTypes = browser.pEventTypes;\n\nif (domObjects.PointerEvent) {\n docEvents[pEventTypes.down ] = listeners.pointerDown;\n docEvents[pEventTypes.move ] = listeners.pointerMove;\n docEvents[pEventTypes.up ] = listeners.pointerUp;\n docEvents[pEventTypes.cancel] = listeners.pointerUp;\n}\nelse {\n docEvents.mousedown = listeners.pointerDown;\n docEvents.mousemove = listeners.pointerMove;\n docEvents.mouseup = listeners.pointerUp;\n\n docEvents.touchstart = listeners.pointerDown;\n docEvents.touchmove = listeners.pointerMove;\n docEvents.touchend = listeners.pointerUp;\n docEvents.touchcancel = listeners.pointerUp;\n}\n\ndocEvents.blur = endAll;\n\nfunction onDocSignal ({ doc }, signalName) {\n const eventMethod = signalName.indexOf('add') === 0\n ? events.add : events.remove;\n\n // delegate event listener\n for (const eventType in scope.delegatedEvents) {\n eventMethod(doc, eventType, events.delegateListener);\n eventMethod(doc, eventType, events.delegateUseCapture, true);\n }\n\n for (const eventType in docEvents) {\n eventMethod(doc, eventType, docEvents[eventType]);\n }\n}\n\nsignals.on('update-pointer-down', ({ interaction, pointer, pointerId, pointerIndex, event, eventTarget, down }) => {\n interaction.pointerIds[pointerIndex] = pointerId;\n interaction.pointers[pointerIndex] = pointer;\n\n if (down) {\n interaction.pointerIsDown = true;\n }\n\n if (!interaction.interacting()) {\n utils.setCoords(interaction.startCoords, interaction.pointers);\n\n utils.copyCoords(interaction.curCoords , interaction.startCoords);\n utils.copyCoords(interaction.prevCoords, interaction.startCoords);\n\n interaction.downEvent = event;\n interaction.downTimes[pointerIndex] = interaction.curCoords.timeStamp;\n interaction.downTargets[pointerIndex] = eventTarget || event && utils.getEventTargets(event)[0];\n interaction.pointerWasMoved = false;\n\n utils.pointerExtend(interaction.downPointer, pointer);\n }\n});\n\nscope.signals.on('add-document' , onDocSignal);\nscope.signals.on('remove-document', onDocSignal);\n\nInteraction.pointerMoveTolerance = 1;\nInteraction.doOnInteractions = doOnInteractions;\nInteraction.endAll = endAll;\nInteraction.signals = signals;\nInteraction.docEvents = docEvents;\n\nscope.endAllInteractions = endAll;\n\nmodule.exports = Interaction;\n","const Interaction = require('../Interaction');\nconst InteractEvent = require('../InteractEvent');\n\nconst actions = {\n firePrepared,\n names: [],\n methodDict: {},\n};\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n interaction._interacting = true;\n firePrepared(interaction, event, 'start');\n});\n\nInteraction.signals.on('action-move', function ({ interaction, event, preEnd }) {\n firePrepared(interaction, event, 'move', preEnd);\n\n // if the action was ended in a listener\n if (!interaction.interacting()) { return false; }\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n firePrepared(interaction, event, 'end');\n});\n\nfunction firePrepared (interaction, event, phase, preEnd) {\n const actionName = interaction.prepared.name;\n\n const newEvent = new InteractEvent(interaction, event, actionName, phase, interaction.element, null, preEnd);\n\n interaction.target.fire(newEvent);\n interaction.prevEvent = newEvent;\n}\n\nmodule.exports = actions;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drag = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n startAxis : 'xy',\n lockAxis : 'xy',\n },\n\n checker: function (pointer, event, interactable) {\n const dragOptions = interactable.options.drag;\n\n return dragOptions.enabled\n ? { name: 'drag', axis: (dragOptions.lockAxis === 'start'\n ? dragOptions.startAxis\n : dragOptions.lockAxis)}\n : null;\n },\n\n getCursor: function () {\n return 'move';\n },\n};\n\nInteraction.signals.on('before-action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n interaction.curCoords.page.y = interaction.startCoords.page.y;\n interaction.curCoords.client.y = interaction.startCoords.client.y;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vx);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vx);\n interaction.pointerDelta.client.vy = 0;\n interaction.pointerDelta.page.vy = 0;\n }\n else if (axis === 'y') {\n interaction.curCoords.page.x = interaction.startCoords.page.x;\n interaction.curCoords.client.x = interaction.startCoords.client.x;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vy);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vy);\n interaction.pointerDelta.client.vx = 0;\n interaction.pointerDelta.page.vx = 0;\n }\n});\n\n// dragmove\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'dragmove') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n iEvent.pageY = interaction.startCoords.page.y;\n iEvent.clientY = interaction.startCoords.client.y;\n iEvent.dy = 0;\n }\n else if (axis === 'y') {\n iEvent.pageX = interaction.startCoords.page.x;\n iEvent.clientX = interaction.startCoords.client.x;\n iEvent.dx = 0;\n }\n});\n\n/*\\\n * Interactable.draggable\n [ method ]\n *\n * Gets or sets whether drag actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of drag events\n | var isDraggable = interact('ul li').draggable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on drag events (object makes the Interactable draggable)\n = (object) This Interactable\n | interact(element).draggable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // the axis in which the first movement must be\n | // for the drag sequence to start\n | // 'xy' by default - any direction\n | startAxis: 'x' || 'y' || 'xy',\n |\n | // 'xy' by default - don't restrict to one axis (move in any direction)\n | // 'x' or 'y' to restrict movement to either axis\n | // 'start' to restrict movement to the axis the drag started in\n | lockAxis: 'x' || 'y' || 'xy' || 'start',\n |\n | // max number of drags that can happen concurrently\n | // with elements of this Interactable. Infinity by default\n | max: Infinity,\n |\n | // max number of drags that can target the same element+Interactable\n | // 1 by default\n | maxPerElement: 2\n | });\n\\*/\nInteractable.prototype.draggable = function (options) {\n if (utils.is.object(options)) {\n this.options.drag.enabled = options.enabled === false? false: true;\n this.setPerAction('drag', options);\n this.setOnEvents('drag', options);\n\n if (/^(xy|x|y|start)$/.test(options.lockAxis)) {\n this.options.drag.lockAxis = options.lockAxis;\n }\n if (/^(xy|x|y)$/.test(options.startAxis)) {\n this.options.drag.startAxis = options.startAxis;\n }\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drag.enabled = options;\n\n if (!options) {\n this.ondragstart = this.ondragstart = this.ondragend = null;\n }\n\n return this;\n }\n\n return this.options.drag;\n};\n\nactions.drag = drag;\nactions.names.push('drag');\nutils.merge(Interactable.eventTypes, [\n 'dragstart',\n 'dragmove',\n 'draginertiastart',\n 'draginertiaresume',\n 'dragend',\n]);\nactions.methodDict.drag = 'draggable';\n\ndefaultOptions.drag = drag.defaults;\n\nmodule.exports = drag;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst scope = require('../scope');\nconst interact = require('../interact');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drop = {\n defaults: {\n enabled: false,\n accept : null,\n overlap: 'pointer',\n },\n};\n\nlet dynamicDrop = false;\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // reset active dropzones\n interaction.activeDrops.dropzones = [];\n interaction.activeDrops.elements = [];\n interaction.activeDrops.rects = [];\n\n interaction.dropEvents = null;\n\n if (!interaction.dynamicDrop) {\n setActiveDrops(interaction, interaction.element);\n }\n\n const dragEvent = interaction.prevEvent;\n const dropEvents = getDropEvents(interaction, event, dragEvent);\n\n if (dropEvents.activate) {\n fireActiveDrops(interaction, dropEvents.activate);\n }\n});\n\nInteractEvent.signals.on('new', function ({ interaction, iEvent, event }) {\n if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { return; }\n\n const draggableElement = interaction.element;\n const dragEvent = iEvent;\n const dropResult = getDrop(dragEvent, event, draggableElement);\n\n interaction.dropTarget = dropResult.dropzone;\n interaction.dropElement = dropResult.element;\n\n interaction.dropEvents = getDropEvents(interaction, event, dragEvent);\n});\n\nInteraction.signals.on('action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n fireDropEvents(interaction, interaction.dropEvents);\n});\n\nInteraction.signals.on('action-end', function ({ interaction }) {\n if (interaction.prepared.name === 'drag') {\n fireDropEvents(interaction, interaction.dropEvents);\n }\n});\n\nInteraction.signals.on('stop-drag', function ({ interaction }) {\n interaction.activeDrops.dropzones =\n interaction.activeDrops.elements =\n interaction.activeDrops.rects =\n interaction.dropEvents = null;\n});\n\nfunction collectDrops (interaction, element) {\n const drops = [];\n const elements = [];\n\n element = element || interaction.element;\n\n // collect all dropzones and their elements which qualify for a drop\n for (const current of scope.interactables) {\n if (!current.options.drop.enabled) { continue; }\n\n const accept = current.options.drop.accept;\n\n // test the draggable element against the dropzone's accept setting\n if ((utils.is.element(accept) && accept !== element)\n || (utils.is.string(accept)\n && !utils.matchesSelector(element, accept))) {\n\n continue;\n }\n\n // query for new elements if necessary\n const dropElements = utils.is.string(current.target)\n ? current._context.querySelectorAll(current.target)\n : [current.target];\n\n for (let i = 0; i < dropElements.length; i++) {\n const currentElement = dropElements[i];\n\n if (currentElement !== element) {\n drops.push(current);\n elements.push(currentElement);\n }\n }\n }\n\n return {\n elements,\n dropzones: drops,\n };\n}\n\nfunction fireActiveDrops (interaction, event) {\n let prevElement;\n\n // loop through all active dropzones and trigger event\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n const current = interaction.activeDrops.dropzones[i];\n const currentElement = interaction.activeDrops.elements [i];\n\n // prevent trigger of duplicate events on same element\n if (currentElement !== prevElement) {\n // set current element as event target\n event.target = currentElement;\n current.fire(event);\n }\n prevElement = currentElement;\n }\n}\n\n// Collect a new set of possible drops and save them in activeDrops.\n// setActiveDrops should always be called when a drag has just started or a\n// drag event happens while dynamicDrop is true\nfunction setActiveDrops (interaction, dragElement) {\n // get dropzones and their elements that could receive the draggable\n const possibleDrops = collectDrops(interaction, dragElement, true);\n\n interaction.activeDrops.dropzones = possibleDrops.dropzones;\n interaction.activeDrops.elements = possibleDrops.elements;\n interaction.activeDrops.rects = [];\n\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n interaction.activeDrops.rects[i] =\n interaction.activeDrops.dropzones[i].getRect(interaction.activeDrops.elements[i]);\n }\n}\n\nfunction getDrop (dragEvent, event, dragElement) {\n const interaction = dragEvent.interaction;\n const validDrops = [];\n\n if (dynamicDrop) {\n setActiveDrops(interaction, dragElement);\n }\n\n // collect all dropzones and their elements which qualify for a drop\n for (let j = 0; j < interaction.activeDrops.dropzones.length; j++) {\n const current = interaction.activeDrops.dropzones[j];\n const currentElement = interaction.activeDrops.elements [j];\n const rect = interaction.activeDrops.rects [j];\n\n validDrops.push(current.dropCheck(dragEvent, event, interaction.target, dragElement, currentElement, rect)\n ? currentElement\n : null);\n }\n\n // get the most appropriate dropzone based on DOM depth and order\n const dropIndex = utils.indexOfDeepestElement(validDrops);\n\n return {\n dropzone: interaction.activeDrops.dropzones[dropIndex] || null,\n element : interaction.activeDrops.elements [dropIndex] || null,\n };\n}\n\nfunction getDropEvents (interaction, pointerEvent, dragEvent) {\n const dropEvents = {\n enter : null,\n leave : null,\n activate : null,\n deactivate: null,\n move : null,\n drop : null,\n };\n\n const tmpl = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n };\n\n if (interaction.dropElement !== interaction.prevDropElement) {\n // if there was a prevDropTarget, create a dragleave event\n if (interaction.prevDropTarget) {\n dropEvents.leave = utils.extend({ type: 'dragleave' }, tmpl);\n\n dragEvent.dragLeave = dropEvents.leave.target = interaction.prevDropElement;\n dragEvent.prevDropzone = dropEvents.leave.dropzone = interaction.prevDropTarget;\n }\n // if the dropTarget is not null, create a dragenter event\n if (interaction.dropTarget) {\n dropEvents.enter = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n type : 'dragenter',\n };\n\n dragEvent.dragEnter = interaction.dropElement;\n dragEvent.dropzone = interaction.dropTarget;\n }\n }\n\n if (dragEvent.type === 'dragend' && interaction.dropTarget) {\n dropEvents.drop = utils.extend({ type: 'drop' }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n dragEvent.relatedTarget = interaction.dropElement;\n }\n if (dragEvent.type === 'dragstart') {\n dropEvents.activate = utils.extend({ type: 'dropactivate' }, tmpl);\n\n dropEvents.activate.target = null;\n dropEvents.activate.dropzone = null;\n }\n if (dragEvent.type === 'dragend') {\n dropEvents.deactivate = utils.extend({ type: 'dropdeactivate' }, tmpl);\n\n dropEvents.deactivate.target = null;\n dropEvents.deactivate.dropzone = null;\n }\n if (dragEvent.type === 'dragmove' && interaction.dropTarget) {\n dropEvents.move = utils.extend({\n dragmove : dragEvent,\n type : 'dropmove',\n }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n }\n\n return dropEvents;\n}\n\nfunction fireDropEvents (interaction, dropEvents) {\n if (dropEvents.leave) { interaction.prevDropTarget.fire(dropEvents.leave); }\n if (dropEvents.move ) { interaction.dropTarget.fire(dropEvents.move ); }\n if (dropEvents.enter) { interaction.dropTarget.fire(dropEvents.enter); }\n if (dropEvents.drop ) { interaction.dropTarget.fire(dropEvents.drop ); }\n if (dropEvents.deactivate) {\n fireActiveDrops(interaction, dropEvents.deactivate);\n }\n\n interaction.prevDropTarget = interaction.dropTarget;\n interaction.prevDropElement = interaction.dropElement;\n}\n\n/*\\\n * Interactable.dropzone\n [ method ]\n *\n * Returns or sets whether elements can be dropped onto this\n * Interactable to trigger drop events\n *\n * Dropzones can receive the following events:\n * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends\n * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone\n * - `dragmove` when a draggable that has entered the dropzone is moved\n * - `drop` when a draggable is dropped into this dropzone\n *\n * Use the `accept` option to allow only elements that match the given CSS\n * selector or element. The value can be:\n *\n * - **an Element** - only that element can be dropped into this dropzone.\n * - **a string**, - the element being dragged must match it as a CSS selector.\n * - **`null`** - accept options is cleared - it accepts any element.\n *\n * Use the `overlap` option to set how drops are checked for. The allowed\n * values are:\n *\n * - `'pointer'`, the pointer must be over the dropzone (default)\n * - `'center'`, the draggable element's center must be over the dropzone\n * - a number from 0-1 which is the `(intersection area) / (draggable area)`.\n * e.g. `0.5` for drop to happen when half of the area of the draggable is\n * over the dropzone\n *\n * Use the `checker` option to specify a function to check if a dragged\n * element is over this Interactable.\n *\n | interact(target)\n | .dropChecker(function(dragEvent, // related dragmove or dragend event\n | event, // TouchEvent/PointerEvent/MouseEvent\n | dropped, // bool result of the default checker\n | dropzone, // dropzone Interactable\n | dropElement, // dropzone elemnt\n | draggable, // draggable Interactable\n | draggableElement) {// draggable element\n |\n | return dropped && event.target.hasAttribute('allow-drop');\n | }\n *\n *\n - options (boolean | object | null) #optional The new value to be set.\n | interact('.drop').dropzone({\n | accept: '.can-drop' || document.getElementById('single-drop'),\n | overlap: 'pointer' || 'center' || zeroToOne\n | }\n = (boolean | object) The current setting or this Interactable\n\\*/\nInteractable.prototype.dropzone = function (options) {\n if (utils.is.object(options)) {\n this.options.drop.enabled = options.enabled === false? false: true;\n\n if (utils.is.function(options.ondrop) ) { this.events.ondrop = options.ondrop ; }\n if (utils.is.function(options.ondropactivate) ) { this.events.ondropactivate = options.ondropactivate ; }\n if (utils.is.function(options.ondropdeactivate)) { this.events.ondropdeactivate = options.ondropdeactivate; }\n if (utils.is.function(options.ondragenter) ) { this.events.ondragenter = options.ondragenter ; }\n if (utils.is.function(options.ondragleave) ) { this.events.ondragleave = options.ondragleave ; }\n if (utils.is.function(options.ondropmove) ) { this.events.ondropmove = options.ondropmove ; }\n\n if (/^(pointer|center)$/.test(options.overlap)) {\n this.options.drop.overlap = options.overlap;\n }\n else if (utils.is.number(options.overlap)) {\n this.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0);\n }\n if ('accept' in options) {\n this.options.drop.accept = options.accept;\n }\n if ('checker' in options) {\n this.options.drop.checker = options.checker;\n }\n\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drop.enabled = options;\n\n if (!options) {\n this.ondragenter = this.ondragleave = this.ondrop\n = this.ondropactivate = this.ondropdeactivate = null;\n }\n\n return this;\n }\n\n return this.options.drop;\n};\n\nInteractable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) {\n let dropped = false;\n\n // if the dropzone has no rect (eg. display: none)\n // call the custom dropChecker or just return false\n if (!(rect = rect || this.getRect(dropElement))) {\n return (this.options.drop.checker\n ? this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement)\n : false);\n }\n\n const dropOverlap = this.options.drop.overlap;\n\n if (dropOverlap === 'pointer') {\n const origin = utils.getOriginXY(draggable, draggableElement, 'drag');\n const page = utils.getPageXY(dragEvent);\n\n page.x += origin.x;\n page.y += origin.y;\n\n const horizontal = (page.x > rect.left) && (page.x < rect.right);\n const vertical = (page.y > rect.top ) && (page.y < rect.bottom);\n\n dropped = horizontal && vertical;\n }\n\n const dragRect = draggable.getRect(draggableElement);\n\n if (dragRect && dropOverlap === 'center') {\n const cx = dragRect.left + dragRect.width / 2;\n const cy = dragRect.top + dragRect.height / 2;\n\n dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom;\n }\n\n if (dragRect && utils.is.number(dropOverlap)) {\n const overlapArea = (Math.max(0, Math.min(rect.right , dragRect.right ) - Math.max(rect.left, dragRect.left))\n * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top , dragRect.top )));\n\n const overlapRatio = overlapArea / (dragRect.width * dragRect.height);\n\n dropped = overlapRatio >= dropOverlap;\n }\n\n if (this.options.drop.checker) {\n dropped = this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement);\n }\n\n return dropped;\n};\n\nInteractable.signals.on('unset', function ({ interactable }) {\n interactable.dropzone(false);\n});\n\nInteractable.settingsMethods.push('dropChecker');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.dropTarget = null; // the dropzone a drag target might be dropped into\n interaction.dropElement = null; // the element at the time of checking\n interaction.prevDropTarget = null; // the dropzone that was recently dragged away from\n interaction.prevDropElement = null; // the element at the time of checking\n interaction.dropEvents = null; // the dropEvents related to the current drag event\n\n interaction.activeDrops = {\n dropzones: [], // the dropzones that are mentioned below\n elements : [], // elements of dropzones that accept the target draggable\n rects : [], // the rects of the elements mentioned above\n };\n\n});\n\nInteraction.signals.on('stop', function ({ interaction }) {\n interaction.dropTarget = interaction.dropElement =\n interaction.prevDropTarget = interaction.prevDropElement = null;\n});\n\n/*\\\n * interact.dynamicDrop\n [ method ]\n *\n * Returns or sets whether the dimensions of dropzone elements are\n * calculated on every dragmove or only on dragstart for the default\n * dropChecker\n *\n - newValue (boolean) #optional True to check on each move. False to check only before start\n = (boolean | interact) The current setting or interact\n\\*/\ninteract.dynamicDrop = function (newValue) {\n if (utils.is.bool(newValue)) {\n //if (dragging && dynamicDrop !== newValue && !newValue) {\n //calcRects(dropzones);\n //}\n\n dynamicDrop = newValue;\n\n return interact;\n }\n return dynamicDrop;\n};\n\nutils.merge(Interactable.eventTypes, [\n 'dragenter',\n 'dragleave',\n 'dropactivate',\n 'dropdeactivate',\n 'dropmove',\n 'drop',\n]);\nactions.methodDict.drop = 'dropzone';\n\ndefaultOptions.drop = drop.defaults;\n\nmodule.exports = drop;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst gesture = {\n defaults: {\n enabled : false,\n origin : null,\n restrict: null,\n },\n\n checker: function (pointer, event, interactable, element, interaction) {\n if (interaction.pointerIds.length >= 2) {\n return { name: 'gesture' };\n }\n\n return null;\n },\n\n getCursor: function () {\n return '';\n },\n};\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturestart') { return; }\n iEvent.ds = 0;\n\n interaction.gesture.startDistance = interaction.gesture.prevDistance = iEvent.distance;\n interaction.gesture.startAngle = interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.scale = 1;\n});\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturemove') { return; }\n\n iEvent.ds = iEvent.scale - interaction.gesture.scale;\n\n interaction.target.fire(iEvent);\n\n interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.prevDistance = iEvent.distance;\n\n if (iEvent.scale !== Infinity\n && iEvent.scale !== null\n && iEvent.scale !== undefined\n && !isNaN(iEvent.scale)) {\n\n interaction.gesture.scale = iEvent.scale;\n }\n});\n\n/*\\\n * Interactable.gesturable\n [ method ]\n *\n * Gets or sets whether multitouch gestures can be performed on the\n * Interactable's element\n *\n = (boolean) Indicates if this can be the target of gesture events\n | var isGestureable = interact(element).gesturable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on gesture events (makes the Interactable gesturable)\n = (object) this Interactable\n | interact(element).gesturable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // limit multiple gestures.\n | // See the explanation in @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n\\*/\nInteractable.prototype.gesturable = function (options) {\n if (utils.is.object(options)) {\n this.options.gesture.enabled = options.enabled === false? false: true;\n this.setPerAction('gesture', options);\n this.setOnEvents('gesture', options);\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.gesture.enabled = options;\n\n if (!options) {\n this.ongesturestart = this.ongesturestart = this.ongestureend = null;\n }\n\n return this;\n }\n\n return this.options.gesture;\n};\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action, event, starting, ending, deltaSource }) {\n if (action !== 'gesture') { return; }\n\n const pointers = interaction.pointers;\n\n iEvent.touches = [pointers[0], pointers[1]];\n\n if (starting) {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = 1;\n iEvent.ds = 0;\n iEvent.angle = utils.touchAngle(pointers, undefined, deltaSource);\n iEvent.da = 0;\n }\n else if (ending || event instanceof InteractEvent) {\n iEvent.distance = interaction.prevEvent.distance;\n iEvent.box = interaction.prevEvent.box;\n iEvent.scale = interaction.prevEvent.scale;\n iEvent.ds = iEvent.scale - 1;\n iEvent.angle = interaction.prevEvent.angle;\n iEvent.da = iEvent.angle - interaction.gesture.startAngle;\n }\n else {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = iEvent.distance / interaction.gesture.startDistance;\n iEvent.angle = utils.touchAngle(pointers, interaction.gesture.prevAngle, deltaSource);\n\n iEvent.ds = iEvent.scale - interaction.gesture.prevScale;\n iEvent.da = iEvent.angle - interaction.gesture.prevAngle;\n }\n});\n\nInteraction.signals.on('new', function (interaction) {\n interaction.gesture = {\n start: { x: 0, y: 0 },\n\n startDistance: 0, // distance between two touches of touchStart\n prevDistance : 0,\n distance : 0,\n\n scale: 1, // gesture.distance / gesture.startDistance\n\n startAngle: 0, // angle of line joining two touches\n prevAngle : 0, // angle of the previous gesture event\n };\n});\n\nactions.gesture = gesture;\nactions.names.push('gesture');\nutils.merge(Interactable.eventTypes, [\n 'gesturestart',\n 'gesturemove',\n 'gestureend',\n]);\nactions.methodDict.gesture = 'gesturable';\n\ndefaultOptions.gesture = gesture.defaults;\n\nmodule.exports = gesture;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\n// Less Precision with touch input\nconst defaultMargin = browser.supportsTouch || browser.supportsPointerEvent? 20: 10;\n\nconst resize = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n square: false,\n preserveAspectRatio: false,\n axis: 'xy',\n\n // use default margin\n margin: NaN,\n\n // object with props left, right, top, bottom which are\n // true/false values to resize when the pointer is over that edge,\n // CSS selectors to match the handles for each direction\n // or the Elements for each handle\n edges: null,\n\n // a value of 'none' will limit the resize rect to a minimum of 0x0\n // 'negate' will alow the rect to have negative width/height\n // 'reposition' will keep the width/height positive by swapping\n // the top and bottom edges and/or swapping the left and right edges\n invert: 'none',\n },\n\n checker: function (pointer, event, interactable, element, interaction, rect) {\n if (!rect) { return null; }\n\n const page = utils.extend({}, interaction.curCoords.page);\n const options = interactable.options;\n\n if (options.resize.enabled) {\n const resizeOptions = options.resize;\n const resizeEdges = { left: false, right: false, top: false, bottom: false };\n\n // if using resize.edges\n if (utils.is.object(resizeOptions.edges)) {\n for (const edge in resizeEdges) {\n resizeEdges[edge] = checkResizeEdge(edge,\n resizeOptions.edges[edge],\n page,\n interaction._eventTarget,\n element,\n rect,\n resizeOptions.margin || defaultMargin);\n }\n\n resizeEdges.left = resizeEdges.left && !resizeEdges.right;\n resizeEdges.top = resizeEdges.top && !resizeEdges.bottom;\n\n if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) {\n return {\n name: 'resize',\n edges: resizeEdges,\n };\n }\n }\n else {\n const right = options.resize.axis !== 'y' && page.x > (rect.right - defaultMargin);\n const bottom = options.resize.axis !== 'x' && page.y > (rect.bottom - defaultMargin);\n\n if (right || bottom) {\n return {\n name: 'resize',\n axes: (right? 'x' : '') + (bottom? 'y' : ''),\n };\n }\n }\n }\n\n return null;\n },\n\n cursors: (browser.isIe9OrOlder ? {\n x : 'e-resize',\n y : 's-resize',\n xy: 'se-resize',\n\n top : 'n-resize',\n left : 'w-resize',\n bottom : 's-resize',\n right : 'e-resize',\n topleft : 'se-resize',\n bottomright: 'se-resize',\n topright : 'ne-resize',\n bottomleft : 'ne-resize',\n } : {\n x : 'ew-resize',\n y : 'ns-resize',\n xy: 'nwse-resize',\n\n top : 'ns-resize',\n left : 'ew-resize',\n bottom : 'ns-resize',\n right : 'ew-resize',\n topleft : 'nwse-resize',\n bottomright: 'nwse-resize',\n topright : 'nesw-resize',\n bottomleft : 'nesw-resize',\n }),\n\n getCursor: function (action) {\n if (action.axis) {\n return resize.cursors[action.name + action.axis];\n }\n else if (action.edges) {\n let cursorKey = '';\n const edgeNames = ['top', 'bottom', 'left', 'right'];\n\n for (let i = 0; i < 4; i++) {\n if (action.edges[edgeNames[i]]) {\n cursorKey += edgeNames[i];\n }\n }\n\n return resize.cursors[cursorKey];\n }\n },\n};\n\n// resizestart\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'resizestart' || !interaction.prepared.edges) {\n return;\n }\n\n const startRect = interaction.target.getRect(interaction.element);\n const resizeOptions = interaction.target.options.resize;\n\n /*\n * When using the `resizable.square` or `resizable.preserveAspectRatio` options, resizing from one edge\n * will affect another. E.g. with `resizable.square`, resizing to make the right edge larger will make\n * the bottom edge larger by the same amount. We call these 'linked' edges. Any linked edges will depend\n * on the active edges and the edge being interacted with.\n */\n if (resizeOptions.square || resizeOptions.preserveAspectRatio) {\n const linkedEdges = utils.extend({}, interaction.prepared.edges);\n\n linkedEdges.top = linkedEdges.top || (linkedEdges.left && !linkedEdges.bottom);\n linkedEdges.left = linkedEdges.left || (linkedEdges.top && !linkedEdges.right );\n linkedEdges.bottom = linkedEdges.bottom || (linkedEdges.right && !linkedEdges.top );\n linkedEdges.right = linkedEdges.right || (linkedEdges.bottom && !linkedEdges.left );\n\n interaction.prepared._linkedEdges = linkedEdges;\n }\n else {\n interaction.prepared._linkedEdges = null;\n }\n\n // if using `resizable.preserveAspectRatio` option, record aspect ratio at the start of the resize\n if (resizeOptions.preserveAspectRatio) {\n interaction.resizeStartAspectRatio = startRect.width / startRect.height;\n }\n\n interaction.resizeRects = {\n start : startRect,\n current : utils.extend({}, startRect),\n inverted : utils.extend({}, startRect),\n previous : utils.extend({}, startRect),\n delta : {\n left: 0, right : 0, width : 0,\n top : 0, bottom: 0, height: 0,\n },\n };\n\n iEvent.rect = interaction.resizeRects.inverted;\n iEvent.deltaRect = interaction.resizeRects.delta;\n});\n\n// resizemove\nInteractEvent.signals.on('new', function ({ iEvent, phase, interaction }) {\n if (phase !== 'move' || !interaction.prepared.edges) { return; }\n\n const resizeOptions = interaction.target.options.resize;\n const invert = resizeOptions.invert;\n const invertible = invert === 'reposition' || invert === 'negate';\n\n let edges = interaction.prepared.edges;\n\n const start = interaction.resizeRects.start;\n const current = interaction.resizeRects.current;\n const inverted = interaction.resizeRects.inverted;\n const delta = interaction.resizeRects.delta;\n const previous = utils.extend(interaction.resizeRects.previous, inverted);\n const originalEdges = edges;\n\n let dx = iEvent.dx;\n let dy = iEvent.dy;\n\n if (resizeOptions.preserveAspectRatio || resizeOptions.square) {\n // `resize.preserveAspectRatio` takes precedence over `resize.square`\n const startAspectRatio = resizeOptions.preserveAspectRatio\n ? interaction.resizeStartAspectRatio\n : 1;\n\n edges = interaction.prepared._linkedEdges;\n\n if ((originalEdges.left && originalEdges.bottom)\n || (originalEdges.right && originalEdges.top)) {\n dy = -dx / startAspectRatio;\n }\n else if (originalEdges.left || originalEdges.right ) { dy = dx / startAspectRatio; }\n else if (originalEdges.top || originalEdges.bottom) { dx = dy * startAspectRatio; }\n }\n\n // update the 'current' rect without modifications\n if (edges.top ) { current.top += dy; }\n if (edges.bottom) { current.bottom += dy; }\n if (edges.left ) { current.left += dx; }\n if (edges.right ) { current.right += dx; }\n\n if (invertible) {\n // if invertible, copy the current rect\n utils.extend(inverted, current);\n\n if (invert === 'reposition') {\n // swap edge values if necessary to keep width/height positive\n let swap;\n\n if (inverted.top > inverted.bottom) {\n swap = inverted.top;\n\n inverted.top = inverted.bottom;\n inverted.bottom = swap;\n }\n if (inverted.left > inverted.right) {\n swap = inverted.left;\n\n inverted.left = inverted.right;\n inverted.right = swap;\n }\n }\n }\n else {\n // if not invertible, restrict to minimum of 0x0 rect\n inverted.top = Math.min(current.top, start.bottom);\n inverted.bottom = Math.max(current.bottom, start.top);\n inverted.left = Math.min(current.left, start.right);\n inverted.right = Math.max(current.right, start.left);\n }\n\n inverted.width = inverted.right - inverted.left;\n inverted.height = inverted.bottom - inverted.top ;\n\n for (const edge in inverted) {\n delta[edge] = inverted[edge] - previous[edge];\n }\n\n iEvent.edges = interaction.prepared.edges;\n iEvent.rect = inverted;\n iEvent.deltaRect = delta;\n});\n\n/*\\\n * Interactable.resizable\n [ method ]\n *\n * Gets or sets whether resize actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of resize elements\n | var isResizeable = interact('input[type=text]').resizable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on resize events (object makes the Interactable resizable)\n = (object) This Interactable\n | interact(element).resizable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | edges: {\n | top : true, // Use pointer coords to check for resize.\n | left : false, // Disable resizing from left edge.\n | bottom: '.resize-s',// Resize if pointer target matches selector\n | right : handleEl // Resize if pointer target is the given Element\n | },\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height are adjusted at a 1:1 ratio.\n | square: false,\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height maintain the aspect ratio they had when resizing started.\n | preserveAspectRatio: false,\n |\n | // a value of 'none' will limit the resize rect to a minimum of 0x0\n | // 'negate' will allow the rect to have negative width/height\n | // 'reposition' will keep the width/height positive by swapping\n | // the top and bottom edges and/or swapping the left and right edges\n | invert: 'none' || 'negate' || 'reposition'\n |\n | // limit multiple resizes.\n | // See the explanation in the @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n \\*/\nInteractable.prototype.resizable = function (options) {\n if (utils.is.object(options)) {\n this.options.resize.enabled = options.enabled === false? false: true;\n this.setPerAction('resize', options);\n this.setOnEvents('resize', options);\n\n if (/^x$|^y$|^xy$/.test(options.axis)) {\n this.options.resize.axis = options.axis;\n }\n else if (options.axis === null) {\n this.options.resize.axis = defaultOptions.resize.axis;\n }\n\n if (utils.is.bool(options.preserveAspectRatio)) {\n this.options.resize.preserveAspectRatio = options.preserveAspectRatio;\n }\n else if (utils.is.bool(options.square)) {\n this.options.resize.square = options.square;\n }\n\n return this;\n }\n if (utils.is.bool(options)) {\n this.options.resize.enabled = options;\n\n if (!options) {\n this.onresizestart = this.onresizestart = this.onresizeend = null;\n }\n\n return this;\n }\n return this.options.resize;\n};\n\nfunction checkResizeEdge (name, value, page, element, interactableElement, rect, margin) {\n // false, '', undefined, null\n if (!value) { return false; }\n\n // true value, use pointer coords and element rect\n if (value === true) {\n // if dimensions are negative, \"switch\" edges\n const width = utils.is.number(rect.width )? rect.width : rect.right - rect.left;\n const height = utils.is.number(rect.height)? rect.height : rect.bottom - rect.top ;\n\n if (width < 0) {\n if (name === 'left' ) { name = 'right'; }\n else if (name === 'right') { name = 'left' ; }\n }\n if (height < 0) {\n if (name === 'top' ) { name = 'bottom'; }\n else if (name === 'bottom') { name = 'top' ; }\n }\n\n if (name === 'left' ) { return page.x < ((width >= 0? rect.left: rect.right ) + margin); }\n if (name === 'top' ) { return page.y < ((height >= 0? rect.top : rect.bottom) + margin); }\n\n if (name === 'right' ) { return page.x > ((width >= 0? rect.right : rect.left) - margin); }\n if (name === 'bottom') { return page.y > ((height >= 0? rect.bottom: rect.top ) - margin); }\n }\n\n // the remaining checks require an element\n if (!utils.is.element(element)) { return false; }\n\n return utils.is.element(value)\n // the value is an element to use as a resize handle\n ? value === element\n // otherwise check if element matches value as selector\n : utils.matchesUpTo(element, value, interactableElement);\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.resizeAxes = 'xy';\n});\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action }) {\n if (action !== 'resize' || !interaction.resizeAxes) { return; }\n\n const options = interaction.target.options;\n\n if (options.resize.square) {\n if (interaction.resizeAxes === 'y') {\n iEvent.dx = iEvent.dy;\n }\n else {\n iEvent.dy = iEvent.dx;\n }\n iEvent.axes = 'xy';\n }\n else {\n iEvent.axes = interaction.resizeAxes;\n\n if (interaction.resizeAxes === 'x') {\n iEvent.dy = 0;\n }\n else if (interaction.resizeAxes === 'y') {\n iEvent.dx = 0;\n }\n }\n});\n\nactions.resize = resize;\nactions.names.push('resize');\nutils.merge(Interactable.eventTypes, [\n 'resizestart',\n 'resizemove',\n 'resizeinertiastart',\n 'resizeinertiaresume',\n 'resizeend',\n]);\nactions.methodDict.resize = 'resizable';\n\ndefaultOptions.resize = resize.defaults;\n\nmodule.exports = resize;\n","const raf = require('./utils/raf');\nconst getWindow = require('./utils/window').getWindow;\nconst is = require('./utils/is');\nconst domUtils = require('./utils/domUtils');\nconst Interaction = require('./Interaction');\nconst defaultOptions = require('./defaultOptions');\n\nconst autoScroll = {\n defaults: {\n enabled : false,\n container: null, // the item that is scrolled (Window or HTMLElement)\n margin : 60,\n speed : 300, // the scroll speed in pixels per second\n },\n\n interaction: null,\n i: null, // the handle returned by window.setInterval\n x: 0, y: 0, // Direction each pulse is to scroll in\n\n isScrolling: false,\n prevTime: 0,\n\n start: function (interaction) {\n autoScroll.isScrolling = true;\n raf.cancel(autoScroll.i);\n\n autoScroll.interaction = interaction;\n autoScroll.prevTime = new Date().getTime();\n autoScroll.i = raf.request(autoScroll.scroll);\n },\n\n stop: function () {\n autoScroll.isScrolling = false;\n raf.cancel(autoScroll.i);\n },\n\n // scroll the window by the values in scroll.x/y\n scroll: function () {\n const options = autoScroll.interaction.target.options[autoScroll.interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(autoScroll.interaction.element);\n const now = new Date().getTime();\n // change in time in seconds\n const dt = (now - autoScroll.prevTime) / 1000;\n // displacement\n const s = options.speed * dt;\n\n if (s >= 1) {\n if (is.window(container)) {\n container.scrollBy(autoScroll.x * s, autoScroll.y * s);\n }\n else if (container) {\n container.scrollLeft += autoScroll.x * s;\n container.scrollTop += autoScroll.y * s;\n }\n\n autoScroll.prevTime = now;\n }\n\n if (autoScroll.isScrolling) {\n raf.cancel(autoScroll.i);\n autoScroll.i = raf.request(autoScroll.scroll);\n }\n },\n check: function (interactable, actionName) {\n const options = interactable.options;\n\n return options[actionName].autoScroll && options[actionName].autoScroll.enabled;\n },\n onInteractionMove: function ({ interaction, pointer }) {\n if (!(interaction.interacting()\n && autoScroll.check(interaction.target, interaction.prepared.name))) {\n return;\n }\n\n if (interaction.simulation) {\n autoScroll.x = autoScroll.y = 0;\n return;\n }\n\n let top;\n let right;\n let bottom;\n let left;\n\n const options = interaction.target.options[interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(interaction.element);\n\n if (is.window(container)) {\n left = pointer.clientX < autoScroll.margin;\n top = pointer.clientY < autoScroll.margin;\n right = pointer.clientX > container.innerWidth - autoScroll.margin;\n bottom = pointer.clientY > container.innerHeight - autoScroll.margin;\n }\n else {\n const rect = domUtils.getElementClientRect(container);\n\n left = pointer.clientX < rect.left + autoScroll.margin;\n top = pointer.clientY < rect.top + autoScroll.margin;\n right = pointer.clientX > rect.right - autoScroll.margin;\n bottom = pointer.clientY > rect.bottom - autoScroll.margin;\n }\n\n autoScroll.x = (right ? 1: left? -1: 0);\n autoScroll.y = (bottom? 1: top? -1: 0);\n\n if (!autoScroll.isScrolling) {\n // set the autoScroll properties to those of the target\n autoScroll.margin = options.margin;\n autoScroll.speed = options.speed;\n\n autoScroll.start(interaction);\n }\n },\n};\n\nInteraction.signals.on('stop-active', function () {\n autoScroll.stop();\n});\n\nInteraction.signals.on('action-move', autoScroll.onInteractionMove);\n\ndefaultOptions.perAction.autoScroll = autoScroll.defaults;\n\nmodule.exports = autoScroll;\n","const Interactable = require('../Interactable');\nconst actions = require('../actions/base');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.ignoreFrom\n [ method ]\n *\n * If the target of the `mousedown`, `pointerdown` or `touchstart`\n * event or any of it's parents match the given CSS selector or\n * Element, no drag/resize/gesture is started.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to not ignore any elements\n = (string | Element | object) The current ignoreFrom value or this Interactable\n **\n | interact(element, { ignoreFrom: document.getElementById('no-action') });\n | // or\n | interact(element).ignoreFrom('input, textarea, a');\n\\*/\nInteractable.prototype.ignoreFrom = function (newValue) {\n return this._backCompatOption('ignoreFrom', newValue);\n};\n\n/*\\\n * Interactable.allowFrom\n [ method ]\n *\n * A drag/resize/gesture is started only If the target of the\n * `mousedown`, `pointerdown` or `touchstart` event or any of it's\n * parents match the given CSS selector or Element.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to allow from any element\n = (string | Element | object) The current allowFrom value or this Interactable\n **\n | interact(element, { allowFrom: document.getElementById('drag-handle') });\n | // or\n | interact(element).allowFrom('.handle');\n\\*/\nInteractable.prototype.allowFrom = function (newValue) {\n return this._backCompatOption('allowFrom', newValue);\n};\n\nInteractable.prototype.testIgnore = function (ignoreFrom, interactableElement, element) {\n if (!ignoreFrom || !is.element(element)) { return false; }\n\n if (is.string(ignoreFrom)) {\n return domUtils.matchesUpTo(element, ignoreFrom, interactableElement);\n }\n else if (is.element(ignoreFrom)) {\n return domUtils.nodeContains(ignoreFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testAllow = function (allowFrom, interactableElement, element) {\n if (!allowFrom) { return true; }\n\n if (!is.element(element)) { return false; }\n\n if (is.string(allowFrom)) {\n return domUtils.matchesUpTo(element, allowFrom, interactableElement);\n }\n else if (is.element(allowFrom)) {\n return domUtils.nodeContains(allowFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testIgnoreAllow = function (options, interactableElement, eventTarget) {\n return (!this.testIgnore(options.ignoreFrom, interactableElement, eventTarget)\n && this.testAllow(options.allowFrom, interactableElement, eventTarget));\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (event.buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\n","const interact = require('../interact');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst actions = require('../actions/base');\nconst defaultOptions = require('../defaultOptions');\nconst browser = require('../utils/browser');\nconst scope = require('../scope');\nconst utils = require('../utils');\nconst signals = require('../utils/Signals').new();\n\nrequire('./InteractableMethods');\n\nconst autoStart = {\n signals,\n withinInteractionLimit,\n // Allow this many interactions to happen simultaneously\n maxInteractions: Infinity,\n defaults: {\n perAction: {\n manualStart: false,\n max: Infinity,\n maxPerElement: 1,\n allowFrom: null,\n ignoreFrom: null,\n },\n },\n setActionDefaults: function (action) {\n utils.extend(action.defaults, autoStart.defaults.perAction);\n },\n};\n\n// set cursor style on mousedown\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget }) {\n if (interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\n// set cursor style on mousemove\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget }) {\n if (!interaction.mouse\n || interaction.pointerIsDown\n || interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\nInteraction.signals.on('move', function (arg) {\n const { interaction, event } = arg;\n\n if (!interaction.pointerIsDown\n || interaction.interacting()\n || !interaction.pointerWasMoved\n || !interaction.prepared.name) {\n return;\n }\n\n signals.fire('before-start', arg);\n\n const target = interaction.target;\n\n if (interaction.prepared.name && target) {\n // check manualStart and interaction limit\n if (target.options[interaction.prepared.name].manualStart\n || !withinInteractionLimit(target, interaction.element, interaction.prepared)) {\n interaction.stop(event);\n }\n else {\n interaction.start(interaction.prepared, target, interaction.element);\n }\n }\n});\n\n// Check if the current target supports the action.\n// If so, return the validated action. Otherwise, return null\nfunction validateAction (action, interactable, element, eventTarget) {\n if (utils.is.object(action)\n && interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget)\n && interactable.options[action.name].enabled\n && withinInteractionLimit(interactable, element, action)) {\n return action;\n }\n\n return null;\n}\n\nfunction validateSelector (interaction, pointer, event, matches, matchElements, eventTarget) {\n for (let i = 0, len = matches.length; i < len; i++) {\n const match = matches[i];\n const matchElement = matchElements[i];\n const action = validateAction(match.getAction(pointer, event, interaction, matchElement),\n match,\n matchElement,\n eventTarget);\n\n if (action) {\n return {\n action,\n target: match,\n element: matchElement,\n };\n }\n }\n\n return {};\n}\n\nfunction getActionInfo (interaction, pointer, event, eventTarget) {\n let matches = [];\n let matchElements = [];\n\n let element = eventTarget;\n let action = null;\n\n function pushMatches (interactable, selector, context) {\n const elements = (browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined);\n\n if (utils.matchesSelector(element, selector, elements)) {\n\n matches.push(interactable);\n matchElements.push(element);\n }\n }\n\n while (utils.is.element(element)) {\n matches = [];\n matchElements = [];\n\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && (action = validateAction(elementInteractable.getAction(pointer, event, interaction, element, eventTarget),\n elementInteractable,\n element,\n eventTarget))\n && !elementInteractable.options[action.name].manualStart) {\n return {\n element,\n action,\n target: elementInteractable,\n };\n }\n else {\n scope.interactables.forEachSelector(pushMatches, element);\n\n const actionInfo = validateSelector(interaction, pointer, event, matches, matchElements, eventTarget);\n\n if (actionInfo.action\n && !actionInfo.target.options[actionInfo.action.name].manualStart) {\n return actionInfo;\n }\n }\n\n element = utils.parentNode(element);\n }\n\n return {};\n}\n\nfunction prepare (interaction, { action, target, element }) {\n action = action || {};\n\n if (interaction.target && interaction.target.options.styleCursor) {\n interaction.target._doc.documentElement.style.cursor = '';\n }\n\n interaction.target = target;\n interaction.element = element;\n utils.copyAction(interaction.prepared, action);\n\n if (target && target.options.styleCursor) {\n const cursor = action? actions[action.name].getCursor(action) : '';\n interaction.target._doc.documentElement.style.cursor = cursor;\n }\n\n signals.fire('prepared', { interaction: interaction });\n}\n\nInteraction.signals.on('stop', function ({ interaction }) {\n const target = interaction.target;\n\n if (target && target.options.styleCursor) {\n target._doc.documentElement.style.cursor = '';\n }\n});\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (utils.is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (utils.is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n const buttons = event.buttons || ({\n 0: 1,\n 1: 4,\n 3: 8,\n 4: 16,\n })[event.button];\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\nfunction withinInteractionLimit (interactable, element, action) {\n const options = interactable.options;\n const maxActions = options[action.name].max;\n const maxPerElement = options[action.name].maxPerElement;\n let activeInteractions = 0;\n let targetCount = 0;\n let targetElementCount = 0;\n\n // no actions if any of these values == 0\n if (!(maxActions && maxPerElement && autoStart.maxInteractions)) { return; }\n\n for (let i = 0, len = scope.interactions.length; i < len; i++) {\n const interaction = scope.interactions[i];\n const otherAction = interaction.prepared.name;\n\n if (!interaction.interacting()) { continue; }\n\n activeInteractions++;\n\n if (activeInteractions >= autoStart.maxInteractions) {\n return false;\n }\n\n if (interaction.target !== interactable) { continue; }\n\n targetCount += (otherAction === action.name)|0;\n\n if (targetCount >= maxActions) {\n return false;\n }\n\n if (interaction.element === element) {\n targetElementCount++;\n\n if (otherAction !== action.name || targetElementCount >= maxPerElement) {\n return false;\n }\n }\n }\n\n return autoStart.maxInteractions > 0;\n}\n\n/*\\\n * interact.maxInteractions\n [ method ]\n **\n * Returns or sets the maximum number of concurrent interactions allowed.\n * By default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables\n * and elements, you need to enable it in the draggable, resizable and\n * gesturable `'max'` and `'maxPerElement'` options.\n **\n - newValue (number) #optional Any number. newValue <= 0 means no interactions.\n\\*/\ninteract.maxInteractions = function (newValue) {\n if (utils.is.number(newValue)) {\n autoStart.maxInteractions = newValue;\n\n return this;\n }\n\n return autoStart.maxInteractions;\n};\n\nInteractable.settingsMethods.push('styleCursor');\nInteractable.settingsMethods.push('actionChecker');\nInteractable.settingsMethods.push('ignoreFrom');\nInteractable.settingsMethods.push('allowFrom');\n\ndefaultOptions.base.actionChecker = null;\ndefaultOptions.base.styleCursor = true;\n\nutils.extend(defaultOptions.perAction, autoStart.defaults.perAction);\n\nmodule.exports = autoStart;\n","const autoStart = require('./base');\nconst Interaction = require('../Interaction');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.delayTimer = null;\n});\n\nautoStart.signals.on('prepared', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.delayTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.target, interaction.element);\n }, delay);\n }\n});\n\nInteraction.signals.on('move', function ({ interaction, duplicate }) {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.delayTimer);\n }\n});\n\n// prevent regular down->move autoStart\nautoStart.signals.on('before-start', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.prepared.name = null;\n }\n});\n","const autoStart = require('./base');\nconst scope = require('../scope');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\n\nconst { matchesSelector, parentNode } = require('../utils/domUtils');\n\nautoStart.setActionDefaults(require('../actions/drag'));\n\nautoStart.signals.on('before-start', function ({ interaction, eventTarget, dx, dy }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // check if a drag is in the correct axis\n const absX = Math.abs(dx);\n const absY = Math.abs(dy);\n const options = interaction.target.options.drag;\n const startAxis = options.startAxis;\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy');\n\n interaction.prepared.axis = options.lockAxis === 'start'\n ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n : options.lockAxis;\n\n // if the movement isn't in the startAxis of the interactable\n if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) {\n // cancel the prepared action\n interaction.prepared.name = null;\n\n // then try to get a drag from another ineractable\n\n if (!interaction.prepared.name) {\n\n let element = eventTarget;\n\n const getDraggable = function (interactable, selector, context) {\n const elements = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n if (interactable === interaction.target) { return; }\n\n if (!options.manualStart\n && !interactable.testIgnoreAllow(options, element, eventTarget)\n && matchesSelector(element, selector, elements)) {\n\n const action = interactable.getAction(interaction.downPointer,\n interaction.downEvent,\n interaction,\n element);\n\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, interactable)\n && autoStart.validateAction(action, interactable, element, eventTarget)) {\n\n return interactable;\n }\n }\n };\n\n let action = null;\n\n // check all interactables\n while (is.element(element)) {\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && elementInteractable !== interaction.target\n && !elementInteractable.options.drag.manualStart) {\n\n action = elementInteractable.getAction(interaction.downPointer, interaction.downEvent, interaction, element);\n }\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, elementInteractable)) {\n\n interaction.prepared.name = 'drag';\n interaction.target = elementInteractable;\n interaction.element = element;\n break;\n }\n\n const selectorInteractable = scope.interactables.forEachSelector(getDraggable, element);\n\n if (selectorInteractable) {\n interaction.prepared.name = 'drag';\n interaction.target = selectorInteractable;\n interaction.element = element;\n break;\n }\n\n element = parentNode(element);\n }\n }\n }\n});\n\nfunction checkStartAxis (startAxis, interactable) {\n if (!interactable) { return false; }\n\n const thisAxis = interactable.options.drag.startAxis;\n\n return (startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis);\n}\n","require('./base').setActionDefaults(require('../actions/gesture'));\n","require('./base').setActionDefaults(require('../actions/resize'));\n","module.exports = {\n base: {\n accept : null,\n preventDefault: 'auto',\n deltaSource : 'page',\n },\n\n perAction: {\n origin: { x: 0, y: 0 },\n\n // only allow left button by default\n // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n mouseButtons: 1,\n\n inertia: {\n enabled : false,\n resistance : 10, // the lambda in exponential decay\n minSpeed : 100, // target speed must be above this for inertia to start\n endSpeed : 10, // the speed at which inertia is slow enough to stop\n allowResume : true, // allow resuming an action in inertia phase\n smoothEndDuration: 300, // animate to snap/restrict endOnly if there's no inertia\n },\n },\n};\n","/* browser entry point */\n\n// Legacy browser support\nrequire('./legacyBrowsers');\n\n// inertia\nrequire('./inertia');\n\n// modifiers\nrequire('./modifiers/snap');\nrequire('./modifiers/restrict');\n\n// pointerEvents\nrequire('./pointerEvents/base');\nrequire('./pointerEvents/holdRepeat');\nrequire('./pointerEvents/interactableTargets');\n\n// delay\nrequire('./autoStart/delay');\n\n// actions\nrequire('./actions/gesture');\nrequire('./actions/resize');\nrequire('./actions/drag');\nrequire('./actions/drop');\n\n// load these modifiers after resize is loaded\nrequire('./modifiers/snapSize');\nrequire('./modifiers/restrictEdges');\nrequire('./modifiers/restrictSize');\n\n// autoStart actions\nrequire('./autoStart/gesture');\nrequire('./autoStart/resize');\nrequire('./autoStart/drag');\n\n// Interactable preventDefault setting\nrequire('./interactablePreventDefault.js');\n\n// autoScroll\nrequire('./autoScroll');\n\n// export interact\nmodule.exports = require('./interact');\n","const InteractEvent = require('./InteractEvent');\nconst Interaction = require('./Interaction');\nconst modifiers = require('./modifiers');\nconst utils = require('./utils');\nconst animationFrame = require('./utils/raf');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.inertiaStatus = {\n active : false,\n smoothEnd : false,\n allowResume: false,\n\n startEvent: null,\n upCoords : {},\n\n xe: 0, ye: 0,\n sx: 0, sy: 0,\n\n t0: 0,\n vx0: 0, vys: 0,\n duration: 0,\n\n lambda_v0: 0,\n one_ve_v0: 0,\n i : null,\n };\n\n interaction.boundInertiaFrame = () => inertiaFrame .apply(interaction);\n interaction.boundSmoothEndFrame = () => smoothEndFrame.apply(interaction);\n});\n\nInteraction.signals.on('down', function ({ interaction, event, pointer, eventTarget }) {\n const status = interaction.inertiaStatus;\n\n // Check if the down event hits the current inertia target\n if (status.active) {\n let element = eventTarget;\n\n // climb up the DOM tree from the event target\n while (utils.is.element(element)) {\n\n // if interaction element is the current inertia target element\n if (element === interaction.element) {\n // stop inertia\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n\n // update pointers to the down event's coordinates\n interaction.updatePointer(pointer);\n utils.setCoords(interaction.curCoords, interaction.pointers);\n\n // fire appropriate signals\n const signalArg = { interaction };\n Interaction.signals.fire('before-action-move', signalArg);\n Interaction.signals.fire('action-resume' , signalArg);\n\n // fire a reume event\n const resumeEvent = new InteractEvent(interaction,\n event,\n interaction.prepared.name,\n 'inertiaresume',\n interaction.element);\n\n interaction.target.fire(resumeEvent);\n interaction.prevEvent = resumeEvent;\n modifiers.resetStatuses(interaction.modifierStatuses);\n\n utils.copyCoords(interaction.prevCoords, interaction.curCoords);\n break;\n }\n\n element = utils.parentNode(element);\n }\n }\n});\n\nInteraction.signals.on('up', function ({ interaction, event }) {\n const status = interaction.inertiaStatus;\n\n if (!interaction.interacting() || status.active) { return; }\n\n const target = interaction.target;\n const options = target && target.options;\n const inertiaOptions = options && interaction.prepared.name && options[interaction.prepared.name].inertia;\n\n const now = new Date().getTime();\n const statuses = {};\n const page = utils.extend({}, interaction.curCoords.page);\n const pointerSpeed = interaction.pointerDelta.client.speed;\n\n let smoothEnd = false;\n let modifierResult;\n\n // check if inertia should be started\n const inertiaPossible = (inertiaOptions && inertiaOptions.enabled\n && interaction.prepared.name !== 'gesture'\n && event !== status.startEvent);\n\n const inertia = (inertiaPossible\n && (now - interaction.curCoords.timeStamp) < 50\n && pointerSpeed > inertiaOptions.minSpeed\n && pointerSpeed > inertiaOptions.endSpeed);\n\n const modifierArg = {\n interaction,\n pageCoords: page,\n statuses,\n preEnd: true,\n requireEndOnly: true,\n };\n\n // smoothEnd\n if (inertiaPossible && !inertia) {\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n if (modifierResult.shouldMove && modifierResult.locked) {\n smoothEnd = true;\n }\n }\n\n if (!(inertia || smoothEnd)) { return; }\n\n utils.copyCoords(status.upCoords, interaction.curCoords);\n\n interaction.pointers[0] = status.startEvent =\n new InteractEvent(interaction, event, interaction.prepared.name, 'inertiastart', interaction.element);\n\n status.t0 = now;\n\n status.active = true;\n status.allowResume = inertiaOptions.allowResume;\n interaction.simulation = status;\n\n target.fire(status.startEvent);\n\n if (inertia) {\n status.vx0 = interaction.pointerDelta.client.vx;\n status.vy0 = interaction.pointerDelta.client.vy;\n status.v0 = pointerSpeed;\n\n calcInertia(interaction, status);\n\n utils.extend(page, interaction.curCoords.page);\n\n page.x += status.xe;\n page.y += status.ye;\n\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n status.modifiedXe += modifierResult.dx;\n status.modifiedYe += modifierResult.dy;\n\n status.i = animationFrame.request(interaction.boundInertiaFrame);\n }\n else {\n status.smoothEnd = true;\n status.xe = modifierResult.dx;\n status.ye = modifierResult.dy;\n\n status.sx = status.sy = 0;\n\n status.i = animationFrame.request(interaction.boundSmoothEndFrame);\n }\n});\n\nInteraction.signals.on('stop-active', function ({ interaction }) {\n const status = interaction.inertiaStatus;\n\n if (status.active) {\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n }\n});\n\nfunction calcInertia (interaction, status) {\n const inertiaOptions = interaction.target.options[interaction.prepared.name].inertia;\n const lambda = inertiaOptions.resistance;\n const inertiaDur = -Math.log(inertiaOptions.endSpeed / status.v0) / lambda;\n\n status.x0 = interaction.prevEvent.pageX;\n status.y0 = interaction.prevEvent.pageY;\n status.t0 = status.startEvent.timeStamp / 1000;\n status.sx = status.sy = 0;\n\n status.modifiedXe = status.xe = (status.vx0 - inertiaDur) / lambda;\n status.modifiedYe = status.ye = (status.vy0 - inertiaDur) / lambda;\n status.te = inertiaDur;\n\n status.lambda_v0 = lambda / status.v0;\n status.one_ve_v0 = 1 - inertiaOptions.endSpeed / status.v0;\n}\n\nfunction inertiaFrame () {\n updateInertiaCoords(this);\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n\n const status = this.inertiaStatus;\n const options = this.target.options[this.prepared.name].inertia;\n const lambda = options.resistance;\n const t = new Date().getTime() / 1000 - status.t0;\n\n if (t < status.te) {\n\n const progress = 1 - (Math.exp(-lambda * t) - status.lambda_v0) / status.one_ve_v0;\n\n if (status.modifiedXe === status.xe && status.modifiedYe === status.ye) {\n status.sx = status.xe * progress;\n status.sy = status.ye * progress;\n }\n else {\n const quadPoint = utils.getQuadraticCurvePoint(0, 0,\n status.xe,\n status.ye,\n status.modifiedXe,\n status.modifiedYe,\n progress);\n\n status.sx = quadPoint.x;\n status.sy = quadPoint.y;\n }\n\n this.doMove();\n\n status.i = animationFrame.request(this.boundInertiaFrame);\n }\n else {\n status.sx = status.modifiedXe;\n status.sy = status.modifiedYe;\n\n this.doMove();\n this.end(status.startEvent);\n status.active = false;\n this.simulation = null;\n }\n\n utils.copyCoords(this.prevCoords, this.curCoords);\n}\n\nfunction smoothEndFrame () {\n updateInertiaCoords(this);\n\n const status = this.inertiaStatus;\n const t = new Date().getTime() - status.t0;\n const duration = this.target.options[this.prepared.name].inertia.smoothEndDuration;\n\n if (t < duration) {\n status.sx = utils.easeOutQuad(t, 0, status.xe, duration);\n status.sy = utils.easeOutQuad(t, 0, status.ye, duration);\n\n this.pointerMove(status.startEvent, status.startEvent);\n\n status.i = animationFrame.request(this.boundSmoothEndFrame);\n }\n else {\n status.sx = status.xe;\n status.sy = status.ye;\n\n this.pointerMove(status.startEvent, status.startEvent);\n this.end(status.startEvent);\n\n status.smoothEnd =\n status.active = false;\n this.simulation = null;\n }\n}\n\nfunction updateInertiaCoords (interaction) {\n const status = interaction.inertiaStatus;\n\n // return if inertia isn't running\n if (!status.active) { return; }\n\n const pageUp = status.upCoords.page;\n const clientUp = status.upCoords.client;\n\n utils.setCoords(interaction.curCoords, [ {\n pageX : pageUp.x + status.sx,\n pageY : pageUp.y + status.sy,\n clientX: clientUp.x + status.sx,\n clientY: clientUp.y + status.sy,\n } ]);\n}\n","const browser = require('./utils/browser');\nconst events = require('./utils/events');\nconst utils = require('./utils');\nconst scope = require('./scope');\nconst Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\n\nconst globalEvents = {};\n\n/*\\\n * interact\n [ method ]\n *\n * The methods of this variable can be used to set elements as\n * interactables and also to change various default settings.\n *\n * Calling it as a function and passing an element or a valid CSS selector\n * string returns an Interactable object which has various methods to\n * configure it.\n *\n - element (Element | string) The HTML or SVG Element to interact with or CSS selector\n = (object) An @Interactable\n *\n > Usage\n | interact('#draggable').draggable(true);\n |\n | var rectables = interact('rect');\n | rectables\n | .gesturable(true)\n | .on('gesturemove', function (event) {\n | // ...\n | });\n\\*/\nfunction interact (element, options) {\n let interactable = scope.interactables.get(element, options);\n\n if (!interactable) {\n interactable = new Interactable(element, options);\n interactable.events.global = globalEvents;\n }\n\n return interactable;\n}\n\n/*\\\n * interact.isSet\n [ method ]\n *\n * Check if an element has been set\n - element (Element) The Element being searched for\n = (boolean) Indicates if the element or CSS selector was previously passed to interact\n\\*/\ninteract.isSet = function (element, options) {\n return scope.interactables.indexOfElement(element, options && options.context) !== -1;\n};\n\n/*\\\n * interact.on\n [ method ]\n *\n * Adds a global listener for an InteractEvent or adds a DOM event to\n * `document`\n *\n - type (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) interact\n\\*/\ninteract.on = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.on(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.on(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n // if it is an InteractEvent type, add listener to globalEvents\n if (utils.contains(Interactable.eventTypes, type)) {\n // if this type of event was never bound\n if (!globalEvents[type]) {\n globalEvents[type] = [listener];\n }\n else {\n globalEvents[type].push(listener);\n }\n }\n // If non InteractEvent type, addEventListener to document\n else {\n events.add(scope.document, type, listener, { options });\n }\n\n return interact;\n};\n\n/*\\\n * interact.off\n [ method ]\n *\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n - type (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) interact\n \\*/\ninteract.off = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.off(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.off(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n if (!utils.contains(Interactable.eventTypes, type)) {\n events.remove(scope.document, type, listener, options);\n }\n else {\n let index;\n\n if (type in globalEvents\n && (index = utils.indexOf(globalEvents[type], listener)) !== -1) {\n globalEvents[type].splice(index, 1);\n }\n }\n\n return interact;\n};\n\n/*\\\n * interact.debug\n [ method ]\n *\n * Returns an object which exposes internal data\n = (object) An object with properties that outline the current state and expose internal functions and variables\n\\*/\ninteract.debug = function () {\n return scope;\n};\n\n// expose the functions used to calculate multi-touch properties\ninteract.getPointerAverage = utils.pointerAverage;\ninteract.getTouchBBox = utils.touchBBox;\ninteract.getTouchDistance = utils.touchDistance;\ninteract.getTouchAngle = utils.touchAngle;\n\ninteract.getElementRect = utils.getElementRect;\ninteract.getElementClientRect = utils.getElementClientRect;\ninteract.matchesSelector = utils.matchesSelector;\ninteract.closest = utils.closest;\n\n/*\\\n * interact.supportsTouch\n [ method ]\n *\n = (boolean) Whether or not the browser supports touch input\n\\*/\ninteract.supportsTouch = function () {\n return browser.supportsTouch;\n};\n\n/*\\\n * interact.supportsPointerEvent\n [ method ]\n *\n = (boolean) Whether or not the browser supports PointerEvents\n\\*/\ninteract.supportsPointerEvent = function () {\n return browser.supportsPointerEvent;\n};\n\n/*\\\n * interact.stop\n [ method ]\n *\n * Cancels all interactions (end events are not fired)\n *\n - event (Event) An event on which to call preventDefault()\n = (object) interact\n\\*/\ninteract.stop = function (event) {\n for (let i = scope.interactions.length - 1; i >= 0; i--) {\n scope.interactions[i].stop(event);\n }\n\n return interact;\n};\n\n/*\\\n * interact.pointerMoveTolerance\n [ method ]\n * Returns or sets the distance the pointer must be moved before an action\n * sequence occurs. This also affects tolerance for tap events.\n *\n - newValue (number) #optional The movement from the start position must be greater than this value\n = (number | Interactable) The current setting or interact\n\\*/\ninteract.pointerMoveTolerance = function (newValue) {\n if (utils.is.number(newValue)) {\n Interaction.pointerMoveTolerance = newValue;\n\n return this;\n }\n\n return Interaction.pointerMoveTolerance;\n};\n\ninteract.addDocument = scope.addDocument;\ninteract.removeDocument = scope.removeDocument;\n\nscope.interact = interact;\n\nmodule.exports = interact;\n","const Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\nconst scope = require('./scope');\nconst is = require('./utils/is');\nconst events = require('./utils/events');\n\nconst { nodeContains, matchesSelector } = require('./utils/domUtils');\n\n/*\\\n * Interactable.preventDefault\n [ method ]\n *\n * Returns or sets whether to prevent the browser's default behaviour\n * in response to pointer events. Can be set to:\n * - `'always'` to always prevent\n * - `'never'` to never prevent\n * - `'auto'` to let interact.js try to determine what would be best\n *\n - newValue (string) #optional `true`, `false` or `'auto'`\n = (string | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.preventDefault = function (newValue) {\n if (/^(always|never|auto)$/.test(newValue)) {\n this.options.preventDefault = newValue;\n return this;\n }\n\n if (is.bool(newValue)) {\n this.options.preventDefault = newValue? 'always' : 'never';\n return this;\n }\n\n return this.options.preventDefault;\n};\n\nInteractable.prototype.checkAndPreventDefault = function (event) {\n const setting = this.options.preventDefault;\n\n if (setting === 'never') { return; }\n\n if (setting === 'always') {\n event.preventDefault();\n return;\n }\n\n // setting === 'auto'\n\n // don't preventDefault if the browser supports passiveEvents\n // CSS touch-action and user-selecct should be used instead\n if (events.supportsOptions) {\n return;\n }\n\n // don't preventDefault of pointerdown events\n if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) {\n return;\n }\n\n // don't preventDefault on editable elements\n if (is.element(event.target)\n && matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) {\n return;\n }\n\n event.preventDefault();\n};\n\nfunction onInteractionEvent ({ interaction, event }) {\n if (interaction.target) {\n interaction.target.checkAndPreventDefault(event);\n }\n}\n\nfor (const eventSignal of ['down', 'move', 'up', 'cancel']) {\n Interaction.signals.on(eventSignal, onInteractionEvent);\n}\n\n// prevent native HTML5 drag on interact.js target elements\nInteraction.docEvents.dragstart = function preventNativeDrag (event) {\n for (const interaction of scope.interactions) {\n\n if (interaction.element\n && (interaction.element === event.target\n || nodeContains(interaction.element, event.target))) {\n\n interaction.target.checkAndPreventDefault(event);\n return;\n }\n }\n};\n","const scope = require('./scope');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst iFinder = require('./utils/interactionFinder');\nconst pointerEvents = require('./pointerEvents/base');\n\nconst { window } = require('./utils/window');\n\nconst toString = Object.prototype.toString;\n\nif (!window.Array.isArray) {\n window.Array.isArray = function (obj) {\n return toString.call(obj) === '[object Array]';\n };\n}\n\nif (!String.prototype.trim) {\n String.prototype.trim = function () {\n return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n };\n}\n\n// http://www.quirksmode.org/dom/events/click.html\n// >Events leading to dblclick\n//\n// IE8 doesn't fire down event before dblclick.\n// This workaround tries to fire a tap and doubletap after dblclick\nfunction onIE8Dblclick (event) {\n const eventTarget = event.target;\n const interaction = iFinder.search(event, event.type, eventTarget);\n\n if (!interaction) { return; }\n\n if (interaction.prevTap\n && event.clientX === interaction.prevTap.clientX\n && event.clientY === interaction.prevTap.clientY\n && eventTarget === interaction.prevTap.target) {\n\n interaction.downTargets[0] = eventTarget;\n interaction.downTimes [0] = new Date().getTime();\n\n pointerEvents.fire({\n interaction,\n event,\n eventTarget,\n pointer: event,\n type: 'tap',\n });\n }\n}\n\nif (browser.isIE8) {\n const selectFix = function (event) {\n for (const interaction of scope.interactions) {\n if (interaction.interacting()) {\n interaction.target.checkAndPreventDefault(event);\n }\n }\n };\n\n const onDocIE8 = function onDocIE8 ({ doc, win }, signalName) {\n const eventMethod = signalName.indexOf('listen') === 0\n ? events.add : events.remove;\n\n // For IE's lack of Event#preventDefault\n eventMethod(doc, 'selectstart', selectFix);\n\n if (pointerEvents) {\n eventMethod(doc, 'dblclick', onIE8Dblclick);\n }\n };\n\n scope.signals.on('add-document' , onDocIE8);\n scope.signals.on('remove-document', onDocIE8);\n}\n\nmodule.exports = null;\n","const InteractEvent = require('../InteractEvent');\nconst Interaction = require('../Interaction');\nconst extend = require('../utils/extend');\n\nconst modifiers = {\n names: [],\n\n setOffsets: function (arg) {\n const { interaction, pageCoords: page } = arg;\n const { target, element, startOffset } = interaction;\n const rect = target.getRect(element);\n\n if (rect) {\n startOffset.left = page.x - rect.left;\n startOffset.top = page.y - rect.top;\n\n startOffset.right = rect.right - page.x;\n startOffset.bottom = rect.bottom - page.y;\n\n if (!('width' in rect)) { rect.width = rect.right - rect.left; }\n if (!('height' in rect)) { rect.height = rect.bottom - rect.top ; }\n }\n else {\n startOffset.left = startOffset.top = startOffset.right = startOffset.bottom = 0;\n }\n\n arg.rect = rect;\n arg.interactable = target;\n arg.element = element;\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n\n arg.options = target.options[interaction.prepared.name][modifierName];\n\n if (!arg.options) {\n continue;\n }\n\n interaction.modifierOffsets[modifierName] = modifiers[modifierName].setOffset(arg);\n }\n },\n\n setAll: function (arg) {\n const { interaction, statuses, preEnd, requireEndOnly } = arg;\n const coords = extend({}, arg.pageCoords);\n const result = {\n dx: 0,\n dy: 0,\n changed: false,\n locked: false,\n shouldMove: true,\n };\n\n for (const modifierName of modifiers.names) {\n const modifier = modifiers[modifierName];\n const options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!shouldDo(options, preEnd, requireEndOnly)) { continue; }\n\n arg.status = arg.status = statuses[modifierName];\n arg.options = options;\n arg.offset = arg.interaction.modifierOffsets[modifierName];\n\n modifier.set(arg);\n\n if (arg.status.locked) {\n coords.x += arg.status.dx;\n coords.y += arg.status.dy;\n\n result.dx += arg.status.dx;\n result.dy += arg.status.dy;\n\n result.locked = true;\n }\n }\n\n // a move should be fired if:\n // - there are no modifiers enabled,\n // - no modifiers are \"locked\" i.e. have changed the pointer's coordinates, or\n // - the locked coords have changed since the last pointer move\n result.shouldMove = !arg.status || !result.locked || arg.status.changed;\n\n return result;\n },\n\n resetStatuses: function (statuses) {\n for (const modifierName of modifiers.names) {\n const status = statuses[modifierName] || {};\n\n status.dx = status.dy = 0;\n status.modifiedX = status.modifiedY = NaN;\n status.locked = false;\n status.changed = true;\n\n statuses[modifierName] = status;\n }\n\n return statuses;\n },\n\n start: function ({ interaction }, signalName) {\n const arg = {\n interaction,\n pageCoords: (signalName === 'action-resume' ?\n interaction.curCoords : interaction.startCoords).page,\n startOffset: interaction.startOffset,\n statuses: interaction.modifierStatuses,\n preEnd: false,\n requireEndOnly: false,\n };\n\n modifiers.setOffsets(arg);\n modifiers.resetStatuses(arg.statuses);\n\n arg.pageCoords = extend({}, interaction.startCoords.page);\n interaction.modifierResult = modifiers.setAll(arg);\n },\n};\n\nInteraction.signals.on('new', function (interaction) {\n interaction.startOffset = { left: 0, right: 0, top: 0, bottom: 0 };\n interaction.modifierOffsets = {};\n interaction.modifierStatuses = modifiers.resetStatuses({});\n interaction.modifierResult = null;\n});\n\nInteraction.signals.on('action-start' , modifiers.start);\nInteraction.signals.on('action-resume', modifiers.start);\n\nInteraction.signals.on('before-action-move', function ({ interaction, preEnd, interactingBeforeMove }) {\n const modifierResult = modifiers.setAll({\n interaction,\n preEnd,\n pageCoords: interaction.curCoords.page,\n statuses: interaction.modifierStatuses,\n requireEndOnly: false,\n });\n\n // don't fire an action move if a modifier would keep the event in the same\n // cordinates as before\n if (!modifierResult.shouldMove && interactingBeforeMove) {\n interaction._dontFireMove = true;\n }\n\n interaction.modifierResult = modifierResult;\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n for (let i = 0; i < modifiers.names.length; i++) {\n const options = interaction.target.options[interaction.prepared.name][modifiers.names[i]];\n\n // if the endOnly option is true for any modifier\n if (shouldDo(options, true, true)) {\n // fire a move event at the modified coordinates\n interaction.doMove({ event, preEnd: true });\n break;\n }\n }\n});\n\nInteractEvent.signals.on('set-xy', function (arg) {\n const { iEvent, interaction } = arg;\n const modifierArg = extend({}, arg);\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n modifierArg.options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!modifierArg.options) {\n continue;\n }\n\n const modifier = modifiers[modifierName];\n\n modifierArg.status = interaction.modifierStatuses[modifierName];\n\n iEvent[modifierName] = modifier.modifyCoords(modifierArg);\n }\n});\n\nfunction shouldDo (options, preEnd, requireEndOnly) {\n return (options && options.enabled\n && (preEnd || !options.endOnly)\n && (!requireEndOnly || options.endOnly));\n}\n\nmodule.exports = modifiers;\n","const modifiers = require('./index');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst restrict = {\n defaults: {\n enabled : false,\n endOnly : false,\n restriction: null,\n elementRect: null,\n },\n\n setOffset: function ({ rect, startOffset, options }) {\n const elementRect = options && options.elementRect;\n const offset = {};\n\n if (rect && elementRect) {\n offset.left = startOffset.left - (rect.width * elementRect.left);\n offset.top = startOffset.top - (rect.height * elementRect.top);\n\n offset.right = startOffset.right - (rect.width * (1 - elementRect.right));\n offset.bottom = startOffset.bottom - (rect.height * (1 - elementRect.bottom));\n }\n else {\n offset.left = offset.top = offset.right = offset.bottom = 0;\n }\n\n return offset;\n },\n\n set: function ({ pageCoords, interaction, status, options }) {\n if (!options) { return status; }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n\n const restriction = getRestrictionRect(options.restriction, interaction, page);\n\n if (!restriction) { return status; }\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n const rect = restriction;\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n const offset = interaction.modifierOffsets.restrict;\n\n // object is assumed to have\n // x, y, width, height or\n // left, top, right, bottom\n if ('x' in restriction && 'y' in restriction) {\n modifiedX = Math.max(Math.min(rect.x + rect.width - offset.right , page.x), rect.x + offset.left);\n modifiedY = Math.max(Math.min(rect.y + rect.height - offset.bottom, page.y), rect.y + offset.top );\n }\n else {\n modifiedX = Math.max(Math.min(rect.right - offset.right , page.x), rect.left + offset.left);\n modifiedY = Math.max(Math.min(rect.bottom - offset.bottom, page.y), rect.top + offset.top );\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const elementRect = options && options.elementRect;\n\n if (options && options.enabled\n && !(phase === 'start' && elementRect && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n getRestrictionRect,\n};\n\nfunction getRestrictionRect (value, interaction, page) {\n if (utils.is.function(value)) {\n return utils.resolveRectLike(value, interaction.target, interaction.element, [page.x, page.y, interaction]);\n } else {\n return utils.resolveRectLike(value, interaction.target, interaction.element);\n }\n}\n\nmodifiers.restrict = restrict;\nmodifiers.names.push('restrict');\n\ndefaultOptions.perAction.restrict = restrict.defaults;\n\nmodule.exports = restrict;\n","// This module adds the options.resize.restrictEdges setting which sets min and\n// max for the top, left, bottom and right edges of the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictEdges: {\n// inner: { top: 200, left: 200, right: 400, bottom: 400 },\n// outer: { top: 0, left: 0, right: 600, bottom: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst { getRestrictionRect } = require('./restrict');\n\nconst noInner = { top: +Infinity, left: +Infinity, bottom: -Infinity, right: -Infinity };\nconst noOuter = { top: -Infinity, left: -Infinity, bottom: +Infinity, right: +Infinity };\n\nconst restrictEdges = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n offset: null,\n },\n\n setOffset: function ({ interaction, startOffset, options }) {\n if (!options) {\n return utils.extend({}, startOffset);\n }\n\n const offset = getRestrictionRect(options.offset, interaction, interaction.startCoords.page);\n\n if (offset) {\n return {\n top: startOffset.top + offset.y,\n left: startOffset.left + offset.x,\n bottom: startOffset.bottom + offset.y,\n right: startOffset.right + offset.x,\n };\n }\n\n return startOffset;\n },\n\n set: function ({ pageCoords, interaction, status, offset, options }) {\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n const inner = rectUtils.xywhToTlbr(getRestrictionRect(options.inner, interaction, page)) || noInner;\n const outer = rectUtils.xywhToTlbr(getRestrictionRect(options.outer, interaction, page)) || noOuter;\n\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n if (edges.top) {\n modifiedY = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top);\n }\n else if (edges.bottom) {\n modifiedY = Math.max(Math.min(outer.bottom - offset.bottom, page.y), inner.bottom - offset.bottom);\n }\n if (edges.left) {\n modifiedX = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left);\n }\n else if (edges.right) {\n modifiedX = Math.max(Math.min(outer.right - offset.right, page.x), inner.right - offset.right);\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n if (options && options.enabled\n && !(phase === 'start' && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n noInner,\n noOuter,\n getRestrictionRect,\n};\n\nmodifiers.restrictEdges = restrictEdges;\nmodifiers.names.push('restrictEdges');\n\ndefaultOptions.perAction.restrictEdges = restrictEdges.defaults;\nresize.defaults.restrictEdges = restrictEdges.defaults;\n\nmodule.exports = restrictEdges;\n","// This module adds the options.resize.restrictSize setting which sets min and\n// max width and height for the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictSize: {\n// min: { width: -600, height: -600 },\n// max: { width: 600, height: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst restrictEdges = require('./restrictEdges');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst noMin = { width: -Infinity, height: -Infinity };\nconst noMax = { width: +Infinity, height: +Infinity };\n\nconst restrictSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n },\n\n setOffset: function ({ interaction }) {\n return interaction.startOffset;\n },\n\n set: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const rect = rectUtils.xywhToTlbr(interaction.resizeRects.inverted);\n\n const minSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.min, interaction)) || noMin;\n const maxSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.max, interaction)) || noMax;\n\n arg.options = {\n enabled: options.enabled,\n endOnly: options.endOnly,\n inner: utils.extend({}, restrictEdges.noInner),\n outer: utils.extend({}, restrictEdges.noOuter),\n };\n\n if (edges.top) {\n arg.options.inner.top = rect.bottom - minSize.height;\n arg.options.outer.top = rect.bottom - maxSize.height;\n }\n else if (edges.bottom) {\n arg.options.inner.bottom = rect.top + minSize.height;\n arg.options.outer.bottom = rect.top + maxSize.height;\n }\n if (edges.left) {\n arg.options.inner.left = rect.right - minSize.width;\n arg.options.outer.left = rect.right - maxSize.width;\n }\n else if (edges.right) {\n arg.options.inner.right = rect.left + minSize.width;\n arg.options.outer.right = rect.left + maxSize.width;\n }\n\n restrictEdges.set(arg);\n },\n\n modifyCoords: restrictEdges.modifyCoords,\n};\n\nmodifiers.restrictSize = restrictSize;\nmodifiers.names.push('restrictSize');\n\ndefaultOptions.perAction.restrictSize = restrictSize.defaults;\nresize.defaults.restrictSize = restrictSize.defaults;\n\nmodule.exports = restrictSize;\n","const modifiers = require('./index');\nconst interact = require('../interact');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst snap = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n\n relativePoints: null,\n },\n\n setOffset: function ({ interaction, interactable, element, rect, startOffset, options }) {\n const offsets = [];\n const optionsOrigin = utils.rectToXY(utils.resolveRectLike(options.origin));\n const origin = optionsOrigin || utils.getOriginXY(interactable, element, interaction.prepared.name);\n options = options || interactable.options[interaction.prepared.name].snap || {};\n\n let snapOffset;\n\n if (options.offset === 'startCoords') {\n snapOffset = {\n x: interaction.startCoords.page.x - origin.x,\n y: interaction.startCoords.page.y - origin.y,\n };\n }\n else {\n const offsetRect = utils.resolveRectLike(options.offset, interactable, element, [interaction]);\n\n snapOffset = utils.rectToXY(offsetRect) || { x: 0, y: 0 };\n }\n\n if (rect && options.relativePoints && options.relativePoints.length) {\n for (const { x: relativeX, y: relativeY } of options.relativePoints) {\n offsets.push({\n x: startOffset.left - (rect.width * relativeX) + snapOffset.x,\n y: startOffset.top - (rect.height * relativeY) + snapOffset.y,\n });\n }\n }\n else {\n offsets.push(snapOffset);\n }\n\n return offsets;\n },\n\n set: function ({ interaction, pageCoords, status, options, offset: offsets }) {\n const targets = [];\n let target;\n let page;\n let i;\n\n if (status.useStatusXY) {\n page = { x: status.x, y: status.y };\n }\n else {\n const origin = utils.getOriginXY(interaction.target, interaction.element, interaction.prepared.name);\n\n page = utils.extend({}, pageCoords);\n\n page.x -= origin.x;\n page.y -= origin.y;\n }\n\n status.realX = page.x;\n status.realY = page.y;\n\n let len = options.targets? options.targets.length : 0;\n\n for (const { x: offsetX, y: offsetY } of offsets) {\n const relativeX = page.x - offsetX;\n const relativeY = page.y - offsetY;\n\n for (const snapTarget of options.targets) {\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n targets.push({\n x: utils.is.number(target.x) ? (target.x + offsetX) : relativeX,\n y: utils.is.number(target.y) ? (target.y + offsetY) : relativeY,\n\n range: utils.is.number(target.range)? target.range: options.range,\n });\n }\n }\n\n const closest = {\n target: null,\n inRange: false,\n distance: 0,\n range: 0,\n dx: 0,\n dy: 0,\n };\n\n for (i = 0, len = targets.length; i < len; i++) {\n target = targets[i];\n\n const range = target.range;\n const dx = target.x - page.x;\n const dy = target.y - page.y;\n const distance = utils.hypot(dx, dy);\n let inRange = distance <= range;\n\n // Infinite targets count as being out of range\n // compared to non infinite ones that are in range\n if (range === Infinity && closest.inRange && closest.range !== Infinity) {\n inRange = false;\n }\n\n if (!closest.target || (inRange\n // is the closest target in range?\n ? (closest.inRange && range !== Infinity\n // the pointer is relatively deeper in this target\n ? distance / range < closest.distance / closest.range\n // this target has Infinite range and the closest doesn't\n : (range === Infinity && closest.range !== Infinity)\n // OR this target is closer that the previous closest\n || distance < closest.distance)\n // The other is not in range and the pointer is closer to this target\n : (!closest.inRange && distance < closest.distance))) {\n\n closest.target = target;\n closest.distance = distance;\n closest.range = range;\n closest.inRange = inRange;\n closest.dx = dx;\n closest.dy = dy;\n\n status.range = range;\n }\n }\n\n let snapChanged;\n\n if (closest.target) {\n snapChanged = (status.modifiedX !== closest.target.x || status.modifiedY !== closest.target.y);\n\n status.modifiedX = closest.target.x;\n status.modifiedY = closest.target.y;\n }\n else {\n snapChanged = true;\n\n status.modifiedX = NaN;\n status.modifiedY = NaN;\n }\n\n status.dx = closest.dx;\n status.dy = closest.dy;\n\n status.changed = (snapChanged || (closest.inRange && !status.locked));\n status.locked = closest.inRange;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const relativePoints = options && options.relativePoints;\n\n if (options && options.enabled\n && !(phase === 'start' && relativePoints && relativePoints.length)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n }\n\n return {\n range : status.range,\n locked : status.locked,\n x : status.modifiedX,\n y : status.modifiedY,\n realX : status.realX,\n realY : status.realY,\n dx : status.dx,\n dy : status.dy,\n };\n }\n },\n};\n\ninteract.createSnapGrid = function (grid) {\n return function (x, y) {\n const limits = grid.limits || {\n left : -Infinity,\n right : Infinity,\n top : -Infinity,\n bottom: Infinity,\n };\n let offsetX = 0;\n let offsetY = 0;\n\n if (utils.is.object(grid.offset)) {\n offsetX = grid.offset.x;\n offsetY = grid.offset.y;\n }\n\n const gridx = Math.round((x - offsetX) / grid.x);\n const gridy = Math.round((y - offsetY) / grid.y);\n\n const newX = Math.max(limits.left, Math.min(limits.right , gridx * grid.x + offsetX));\n const newY = Math.max(limits.top , Math.min(limits.bottom, gridy * grid.y + offsetY));\n\n return {\n x: newX,\n y: newY,\n range: grid.range,\n };\n };\n};\n\nmodifiers.snap = snap;\nmodifiers.names.push('snap');\n\ndefaultOptions.perAction.snap = snap.defaults;\n\nmodule.exports = snap;\n","// This module allows snapping of the size of targets during resize\n// interactions.\n\nconst modifiers = require('./index');\nconst snap = require('./snap');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\nconst utils = require('../utils/');\n\nconst snapSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n },\n\n setOffset: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.edges;\n\n if (!edges) { return; }\n\n arg.options = {\n relativePoints: [{\n x: edges.left? 0 : 1,\n y: edges.top ? 0 : 1,\n }],\n origin: { x: 0, y: 0 },\n offset: 'self',\n range: options.range,\n };\n\n const offsets = snap.setOffset(arg);\n arg.options = options;\n\n return offsets;\n },\n\n set: function (arg) {\n const { interaction, options, offset, pageCoords } = arg;\n const page = utils.extend({}, pageCoords);\n const relativeX = page.x - offset[0].x;\n const relativeY = page.y - offset[0].y;\n\n arg.options = utils.extend({}, options);\n arg.options.targets = [];\n\n for (const snapTarget of options.targets) {\n let target;\n\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n if ('width' in target && 'height' in target) {\n target.x = target.width;\n target.y = target.height;\n }\n\n arg.options.targets.push(target);\n }\n\n snap.set(arg);\n },\n\n modifyCoords: function (arg) {\n const { options } = arg;\n\n arg.options = utils.extend({}, options);\n arg.options.enabled = options.enabled;\n arg.options.relativePoints = [null];\n\n snap.modifyCoords(arg);\n },\n};\n\nmodifiers.snapSize = snapSize;\nmodifiers.names.push('snapSize');\n\ndefaultOptions.perAction.snapSize = snapSize.defaults;\nresize.defaults.snapSize = snapSize.defaults;\n\nmodule.exports = snapSize;\n","const pointerUtils = require('../utils/pointerUtils');\n\nmodule.exports = class PointerEvent {\n constructor (type, pointer, event, eventTarget, interaction) {\n pointerUtils.pointerExtend(this, event);\n\n if (event !== pointer) {\n pointerUtils.pointerExtend(this, pointer);\n }\n\n this.interaction = interaction;\n\n this.timeStamp = new Date().getTime();\n this.originalEvent = event;\n this.type = type;\n this.pointerId = pointerUtils.getPointerId(pointer);\n this.pointerType = pointerUtils.getPointerType(pointer);\n this.target = eventTarget;\n this.currentTarget = null;\n\n if (type === 'tap') {\n const pointerIndex = interaction.getPointerIndex(pointer);\n this.dt = this.timeStamp - interaction.downTimes[pointerIndex];\n\n const interval = this.timeStamp - interaction.tapTime;\n\n this.double = !!(interaction.prevTap\n && interaction.prevTap.type !== 'doubletap'\n && interaction.prevTap.target === this.target\n && interval < 500);\n }\n else if (type === 'doubletap') {\n this.dt = pointer.timeStamp - interaction.tapTime;\n }\n }\n\n subtractOrigin ({ x: originX, y: originY }) {\n this.pageX -= originX;\n this.pageY -= originY;\n this.clientX -= originX;\n this.clientY -= originY;\n\n return this;\n }\n\n addOrigin ({ x: originX, y: originY }) {\n this.pageX += originX;\n this.pageY += originY;\n this.clientX += originX;\n this.clientY += originY;\n\n return this;\n }\n\n preventDefault () {\n this.originalEvent.preventDefault();\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n};\n","const PointerEvent = require('./PointerEvent');\nconst Interaction = require('../Interaction');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst defaults = require('../defaultOptions');\nconst signals = require('../utils/Signals').new();\nconst { filter } = require('../utils/arr');\n\nconst simpleSignals = [ 'down', 'up', 'cancel' ];\nconst simpleEvents = [ 'down', 'up', 'cancel' ];\n\nconst pointerEvents = {\n PointerEvent,\n fire,\n collectEventTargets,\n signals,\n defaults: {\n holdDuration: 600,\n ignoreFrom : null,\n allowFrom : null,\n origin : { x: 0, y: 0 },\n },\n types: [\n 'down',\n 'move',\n 'up',\n 'cancel',\n 'tap',\n 'doubletap',\n 'hold',\n ],\n};\n\nfunction fire (arg) {\n const {\n interaction, pointer, event, eventTarget,\n type = arg.pointerEvent.type,\n targets = collectEventTargets(arg),\n pointerEvent = new PointerEvent(type, pointer, event, eventTarget, interaction),\n } = arg;\n\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n targets,\n type,\n pointerEvent,\n };\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n\n for (const prop in target.props || {}) {\n pointerEvent[prop] = target.props[prop];\n }\n\n const origin = utils.getOriginXY(target.eventable, target.element);\n\n pointerEvent.subtractOrigin(origin);\n pointerEvent.eventable = target.eventable;\n pointerEvent.currentTarget = target.element;\n\n target.eventable.fire(pointerEvent);\n\n pointerEvent.addOrigin(origin);\n\n if (pointerEvent.immediatePropagationStopped\n || (pointerEvent.propagationStopped\n && (i + 1) < targets.length && targets[i + 1].element !== pointerEvent.currentTarget)) {\n break;\n }\n }\n\n signals.fire('fired', signalArg);\n\n if (type === 'tap') {\n // if pointerEvent should make a double tap, create and fire a doubletap\n // PointerEvent and use that as the prevTap\n const prevTap = pointerEvent.double\n ? fire({\n interaction, pointer, event, eventTarget,\n type: 'doubletap',\n })\n : pointerEvent;\n\n interaction.prevTap = prevTap;\n interaction.tapTime = prevTap.timeStamp;\n }\n\n return pointerEvent;\n}\n\nfunction collectEventTargets ({ interaction, pointer, event, eventTarget, type }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n // do not fire a tap event if the pointer was moved before being lifted\n if (type === 'tap' && (interaction.pointerWasMoved\n // or if the pointerup target is different to the pointerdown target\n || !(interaction.downTargets[pointerIndex] && interaction.downTargets[pointerIndex] === eventTarget))) {\n return [];\n }\n\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n path,\n targets: [],\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (type === 'hold') {\n signalArg.targets = filter(signalArg.targets, target =>\n target.eventable.options.holdDuration === interaction.holdTimers[pointerIndex].duration);\n }\n\n return signalArg.targets;\n}\n\nInteraction.signals.on('update-pointer-down', function ({ interaction, pointerIndex }) {\n interaction.holdTimers[pointerIndex] = { duration: Infinity, timeout: null };\n});\n\nInteraction.signals.on('remove-pointer', function ({ interaction, pointerIndex }) {\n interaction.holdTimers.splice(pointerIndex, 1);\n});\n\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget, duplicateMove }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n if (!duplicateMove && (!interaction.pointerIsDown || interaction.pointerWasMoved)) {\n if (interaction.pointerIsDown) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n\n fire({\n interaction, pointer, event, eventTarget,\n type: 'move',\n });\n }\n});\n\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget, pointerIndex }) {\n // copy event to be used in timeout for IE8\n const eventCopy = browser.isIE8? utils.extend({}, event) : event;\n\n const timer = interaction.holdTimers[pointerIndex];\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'hold',\n targets: [],\n path,\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (!signalArg.targets.length) { return; }\n\n let minDuration = Infinity;\n\n for (let i = 0; i < signalArg.targets.length; i++) {\n const target = signalArg.targets[i];\n const holdDuration = target.eventable.options.holdDuration;\n\n if (holdDuration < minDuration) {\n minDuration = holdDuration;\n }\n }\n\n timer.duration = minDuration;\n timer.timeout = setTimeout(function () {\n fire({\n interaction,\n eventTarget,\n pointer: browser.isIE8? eventCopy : pointer,\n event: eventCopy,\n type: 'hold',\n });\n }, minDuration);\n});\n\nInteraction.signals.on('up', ({ interaction, pointer, event, eventTarget }) => {\n if (!interaction.pointerWasMoved) {\n fire({ interaction, eventTarget, pointer, event, type: 'tap' });\n }\n});\n\n['up', 'cancel'].forEach(function (signalName) {\n Interaction.signals.on(signalName, function ({ interaction, pointerIndex }) {\n if (interaction.holdTimers[pointerIndex]) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n });\n});\n\nfunction createSignalListener (type) {\n return function ({ interaction, pointer, event, eventTarget }) {\n fire({ interaction, eventTarget, pointer, event, type });\n };\n}\n\nfor (let i = 0; i < simpleSignals.length; i++) {\n Interaction.signals.on(simpleSignals[i], createSignalListener(simpleEvents[i]));\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.prevTap = null; // the most recent tap event on this interaction\n interaction.tapTime = 0; // time of the most recent tap event\n interaction.holdTimers = []; // [{ duration, timeout }]\n});\n\ndefaults.pointerEvents = pointerEvents.defaults;\nmodule.exports = pointerEvents;\n","const pointerEvents = require('./base');\nconst Interaction = require('../Interaction');\n\npointerEvents.signals.on('new', onNew);\npointerEvents.signals.on('fired', onFired);\n\nfor (const signal of ['move', 'up', 'cancel', 'endall']) {\n Interaction.signals.on(signal, endHoldRepeat);\n}\n\nfunction onNew ({ pointerEvent }) {\n if (pointerEvent.type !== 'hold') { return; }\n\n pointerEvent.count = (pointerEvent.count || 0) + 1;\n}\n\nfunction onFired ({ interaction, pointerEvent, eventTarget, targets }) {\n if (pointerEvent.type !== 'hold' || !targets.length) { return; }\n\n // get the repeat interval from the first eventable\n const interval = targets[0].eventable.options.holdRepeatInterval;\n\n // don't repeat if the interval is 0 or less\n if (interval <= 0) { return; }\n\n // set a timeout to fire the holdrepeat event\n interaction.holdIntervalHandle = setTimeout(function () {\n pointerEvents.fire({\n interaction,\n eventTarget,\n type: 'hold',\n pointer: pointerEvent,\n event: pointerEvent,\n });\n }, interval);\n}\n\nfunction endHoldRepeat ({ interaction }) {\n // set the interaction's holdStopTime property\n // to stop further holdRepeat events\n if (interaction.holdIntervalHandle) {\n clearInterval(interaction.holdIntervalHandle);\n interaction.holdIntervalHandle = null;\n }\n}\n\n// don't repeat by default\npointerEvents.defaults.holdRepeatInterval = 0;\npointerEvents.types.push('holdrepeat');\n\nmodule.exports = {\n onNew,\n onFired,\n endHoldRepeat,\n};\n","const pointerEvents = require('./base');\nconst Interactable = require('../Interactable');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\nconst scope = require('../scope');\nconst extend = require('../utils/extend');\nconst { merge } = require('../utils/arr');\n\npointerEvents.signals.on('collect-targets', function ({ targets, element, type, eventTarget }) {\n function collectSelectors (interactable, selector, context) {\n const els = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && is.element(element)\n && domUtils.matchesSelector(element, selector, els)\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n const interactable = scope.interactables.get(element);\n\n if (interactable) {\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n scope.interactables.forEachSelector(collectSelectors, element);\n});\n\nInteractable.signals.on('new', function ({ interactable }) {\n interactable.events.getRect = function (element) {\n return interactable.getRect(element);\n };\n});\n\nInteractable.signals.on('set', function ({ interactable, options }) {\n extend(interactable.events.options, pointerEvents.defaults);\n extend(interactable.events.options, options);\n});\n\nmerge(Interactable.eventTypes, pointerEvents.types);\n\nInteractable.prototype.pointerEvents = function (options) {\n extend(this.events.options, options);\n\n return this;\n};\n\nconst __backCompatOption = Interactable.prototype._backCompatOption;\n\nInteractable.prototype._backCompatOption = function (optionName, newValue) {\n const ret = __backCompatOption.call(this, optionName, newValue);\n\n if (ret === this) {\n this.events.options[optionName] = newValue;\n }\n\n return ret;\n};\n\nInteractable.settingsMethods.push('pointerEvents');\n","const utils = require('./utils');\nconst events = require('./utils/events');\nconst signals = require('./utils/Signals').new();\n\nconst scope = {\n signals,\n events,\n utils,\n\n // main document\n document: require('./utils/domObjects').document,\n // all documents being listened to\n documents: [],\n\n addDocument: function (doc, win) {\n // do nothing if document is already known\n if (utils.contains(scope.documents, doc)) { return false; }\n\n win = win || scope.getWindow(doc);\n\n scope.documents.push(doc);\n events.documents.push(doc);\n\n // don't add an unload event for the main document\n // so that the page may be cached in browser history\n if (doc !== scope.document) {\n events.add(win, 'unload', scope.onWindowUnload);\n }\n\n signals.fire('add-document', { doc, win });\n },\n\n removeDocument: function (doc, win) {\n const index = utils.indexOf(scope.documents, doc);\n\n win = win || scope.getWindow(doc);\n\n events.remove(win, 'unload', scope.onWindowUnload);\n\n scope.documents.splice(index, 1);\n events.documents.splice(index, 1);\n\n signals.fire('remove-document', { win, doc });\n },\n\n onWindowUnload: function () {\n scope.removeDocument(this.document, this);\n },\n};\n\nmodule.exports = scope;\n","const { indexOf } = require('./arr');\n\nclass Signals {\n constructor () {\n this.listeners = {\n // signalName: [listeners],\n };\n }\n\n on (name, listener) {\n if (!this.listeners[name]) {\n this.listeners[name] = [listener];\n return;\n }\n\n this.listeners[name].push(listener);\n }\n\n off (name, listener) {\n if (!this.listeners[name]) { return; }\n\n const index = indexOf(this.listeners[name], listener);\n\n if (index !== -1) {\n this.listeners[name].splice(index, 1);\n }\n }\n\n fire (name, arg) {\n const targetListeners = this.listeners[name];\n\n if (!targetListeners) { return; }\n\n for (let i = 0; i < targetListeners.length; i++) {\n if (targetListeners[i](arg, name) === false) {\n return;\n }\n }\n }\n}\n\nSignals.new = function () {\n return new Signals();\n};\n\nmodule.exports = Signals;\n","function indexOf (array, target) {\n for (let i = 0, len = array.length; i < len; i++) {\n if (array[i] === target) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction contains (array, target) {\n return indexOf(array, target) !== -1;\n}\n\nfunction merge (target, source) {\n for (let i = 0; i < source.length; i++) {\n target.push(source[i]);\n }\n\n return target;\n}\n\nfunction filter (array, test) {\n const result = [];\n\n for (let i = 0; i < array.length; i++) {\n if (test(array[i])) {\n result.push(array[i]);\n }\n }\n\n return result;\n}\n\nmodule.exports = {\n indexOf,\n contains,\n merge,\n filter,\n};\n","const { window } = require('./window');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst Element = domObjects.Element;\nconst navigator = window.navigator;\n\nconst browser = {\n // Does the browser support touch input?\n supportsTouch: !!(('ontouchstart' in window) || is.function(window.DocumentTouch)\n && domObjects.document instanceof window.DocumentTouch),\n\n // Does the browser support PointerEvents\n supportsPointerEvent: !!domObjects.PointerEvent,\n\n isIE8: ('attachEvent' in window) && !('addEventListener' in window),\n\n // Opera Mobile must be handled differently\n isOperaMobile: (navigator.appName === 'Opera'\n && browser.supportsTouch\n && navigator.userAgent.match('Presto')),\n\n // scrolling doesn't change the result of getClientRects on iOS 7\n isIOS7: (/iP(hone|od|ad)/.test(navigator.platform)\n && /OS 7[^\\d]/.test(navigator.appVersion)),\n\n isIe9OrOlder: /MSIE (8|9)/.test(navigator.userAgent),\n\n // prefix matchesSelector\n prefixedMatchesSelector: 'matches' in Element.prototype\n ? 'matches': 'webkitMatchesSelector' in Element.prototype\n ? 'webkitMatchesSelector': 'mozMatchesSelector' in Element.prototype\n ? 'mozMatchesSelector': 'oMatchesSelector' in Element.prototype\n ? 'oMatchesSelector': 'msMatchesSelector',\n\n useMatchesSelectorPolyfill: false,\n\n pEventTypes: (domObjects.PointerEvent\n ? (domObjects.PointerEvent === window.MSPointerEvent\n ? {\n up: 'MSPointerUp',\n down: 'MSPointerDown',\n over: 'mouseover',\n out: 'mouseout',\n move: 'MSPointerMove',\n cancel: 'MSPointerCancel',\n }\n : {\n up: 'pointerup',\n down: 'pointerdown',\n over: 'pointerover',\n out: 'pointerout',\n move: 'pointermove',\n cancel: 'pointercancel',\n })\n : null),\n\n // because Webkit and Opera still use 'mousewheel' event type\n wheelEvent: 'onmousewheel' in domObjects.document? 'mousewheel': 'wheel',\n\n};\n\nbrowser.useMatchesSelectorPolyfill = !is.function(Element.prototype[browser.prefixedMatchesSelector]);\n\nmodule.exports = browser;\n","const domObjects = {};\nconst win = require('./window').window;\n\nfunction blank () {}\n\ndomObjects.document = win.document;\ndomObjects.DocumentFragment = win.DocumentFragment || blank;\ndomObjects.SVGElement = win.SVGElement || blank;\ndomObjects.SVGSVGElement = win.SVGSVGElement || blank;\ndomObjects.SVGElementInstance = win.SVGElementInstance || blank;\ndomObjects.Element = win.Element || blank;\ndomObjects.HTMLElement = win.HTMLElement || domObjects.Element;\n\ndomObjects.Event = win.Event;\ndomObjects.Touch = win.Touch || blank;\ndomObjects.PointerEvent = (win.PointerEvent || win.MSPointerEvent);\n\nmodule.exports = domObjects;\n","const win = require('./window');\nconst browser = require('./browser');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst domUtils = {\n nodeContains: function (parent, child) {\n while (child) {\n if (child === parent) {\n return true;\n }\n\n child = child.parentNode;\n }\n\n return false;\n },\n\n closest: function (element, selector) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) { return element; }\n\n element = domUtils.parentNode(element);\n }\n\n return null;\n },\n\n parentNode: function (node) {\n let parent = node.parentNode;\n\n if (is.docFrag(parent)) {\n // skip past #shado-root fragments\n while ((parent = parent.host) && is.docFrag(parent)) {\n continue;\n }\n\n return parent;\n }\n\n return parent;\n },\n\n // taken from http://tanalin.com/en/blog/2012/12/matches-selector-ie8/ and modified\n matchesSelectorPolyfill: browser.useMatchesSelectorPolyfill\n ? function (element, selector, elems) {\n elems = elems || element.parentNode.querySelectorAll(selector);\n\n for (let i = 0, len = elems.length; i < len; i++) {\n if (elems[i] === element) {\n return true;\n }\n }\n\n return false;\n }\n : null,\n\n matchesSelector: function (element, selector, nodeList) {\n if (browser.useMatchesSelectorPolyfill) {\n return domUtils.matchesSelectorPolyfill(element, selector, nodeList);\n }\n\n // remove /deep/ from selectors if shadowDOM polyfill is used\n if (win.window !== win.realWindow) {\n selector = selector.replace(/\\/deep\\//g, ' ');\n }\n\n return element[browser.prefixedMatchesSelector](selector);\n },\n\n // Test for the element that's \"above\" all other qualifiers\n indexOfDeepestElement: function (elements) {\n let deepestZoneParents = [];\n let dropzoneParents = [];\n let dropzone;\n let deepestZone = elements[0];\n let index = deepestZone? 0: -1;\n let parent;\n let child;\n let i;\n let n;\n\n for (i = 1; i < elements.length; i++) {\n dropzone = elements[i];\n\n // an element might belong to multiple selector dropzones\n if (!dropzone || dropzone === deepestZone) {\n continue;\n }\n\n if (!deepestZone) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n // check if the deepest or current are document.documentElement or document.rootElement\n // - if the current dropzone is, do nothing and continue\n if (dropzone.parentNode === dropzone.ownerDocument) {\n continue;\n }\n // - if deepest is, update with the current dropzone and continue to next\n else if (deepestZone.parentNode === dropzone.ownerDocument) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n if (!deepestZoneParents.length) {\n parent = deepestZone;\n while (parent.parentNode && parent.parentNode !== parent.ownerDocument) {\n deepestZoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n }\n\n // if this element is an svg element and the current deepest is\n // an HTMLElement\n if (deepestZone instanceof domObjects.HTMLElement\n && dropzone instanceof domObjects.SVGElement\n && !(dropzone instanceof domObjects.SVGSVGElement)) {\n\n if (dropzone === deepestZone.parentNode) {\n continue;\n }\n\n parent = dropzone.ownerSVGElement;\n }\n else {\n parent = dropzone;\n }\n\n dropzoneParents = [];\n\n while (parent.parentNode !== parent.ownerDocument) {\n dropzoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n\n n = 0;\n\n // get (position of last common ancestor) + 1\n while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) {\n n++;\n }\n\n const parents = [\n dropzoneParents[n - 1],\n dropzoneParents[n],\n deepestZoneParents[n],\n ];\n\n child = parents[0].lastChild;\n\n while (child) {\n if (child === parents[1]) {\n deepestZone = dropzone;\n index = i;\n deepestZoneParents = [];\n\n break;\n }\n else if (child === parents[2]) {\n break;\n }\n\n child = child.previousSibling;\n }\n }\n\n return index;\n },\n\n matchesUpTo: function (element, selector, limit) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) {\n return true;\n }\n\n element = domUtils.parentNode(element);\n\n if (element === limit) {\n return domUtils.matchesSelector(element, selector);\n }\n }\n\n return false;\n },\n\n getActualElement: function (element) {\n return (element instanceof domObjects.SVGElementInstance\n ? element.correspondingUseElement\n : element);\n },\n\n getScrollXY: function (relevantWindow) {\n relevantWindow = relevantWindow || win.window;\n return {\n x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft,\n y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop,\n };\n },\n\n getElementClientRect: function (element) {\n const clientRect = (element instanceof domObjects.SVGElement\n ? element.getBoundingClientRect()\n : element.getClientRects()[0]);\n\n return clientRect && {\n left : clientRect.left,\n right : clientRect.right,\n top : clientRect.top,\n bottom: clientRect.bottom,\n width : clientRect.width || clientRect.right - clientRect.left,\n height: clientRect.height || clientRect.bottom - clientRect.top,\n };\n },\n\n getElementRect: function (element) {\n const clientRect = domUtils.getElementClientRect(element);\n\n if (!browser.isIOS7 && clientRect) {\n const scroll = domUtils.getScrollXY(win.getWindow(element));\n\n clientRect.left += scroll.x;\n clientRect.right += scroll.x;\n clientRect.top += scroll.y;\n clientRect.bottom += scroll.y;\n }\n\n return clientRect;\n },\n\n getPath: function (element) {\n const path = [];\n\n while (element) {\n path.push(element);\n element = domUtils.parentNode(element);\n }\n\n return path;\n },\n\n trySelector: value => {\n if (!is.string(value)) { return false; }\n\n // an exception will be raised if it is invalid\n domObjects.document.querySelector(value);\n return true;\n },\n};\n\nmodule.exports = domUtils;\n","const is = require('./is');\nconst domUtils = require('./domUtils');\nconst pExtend = require('./pointerExtend');\n\nconst { window, getWindow } = require('./window');\nconst { indexOf, contains } = require('./arr');\n\nconst useAttachEvent = ('attachEvent' in window) && !('addEventListener' in window);\nconst addEvent = useAttachEvent? 'attachEvent': 'addEventListener';\nconst removeEvent = useAttachEvent? 'detachEvent': 'removeEventListener';\nconst on = useAttachEvent? 'on': '';\n\nconst elements = [];\nconst targets = [];\nconst attachedListeners = [];\n\n// {\n// type: {\n// selectors: ['selector', ...],\n// contexts : [document, ...],\n// listeners: [[listener, capture, passive], ...]\n// }\n// }\nconst delegatedEvents = {};\n\nconst documents = [];\n\nconst supportsOptions = !useAttachEvent && (() => {\n let supported = false;\n\n window.document.createElement('div').addEventListener('test', null, {\n get capture () { supported = true; },\n });\n\n return supported;\n})();\n\nfunction add (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n let elementIndex = indexOf(elements, element);\n let target = targets[elementIndex];\n\n if (!target) {\n target = {\n events: {},\n typeCount: 0,\n };\n\n elementIndex = elements.push(element) - 1;\n targets.push(target);\n\n attachedListeners.push(useAttachEvent\n ? {\n supplied: [],\n wrapped : [],\n useCount: [],\n }\n : null);\n }\n\n if (!target.events[type]) {\n target.events[type] = [];\n target.typeCount++;\n }\n\n if (!contains(target.events[type], listener)) {\n let ret;\n\n if (useAttachEvent) {\n const { supplied, wrapped, useCount } = attachedListeners[elementIndex];\n const listenerIndex = indexOf(supplied, listener);\n\n const wrappedListener = wrapped[listenerIndex] || function (event) {\n if (!event.immediatePropagationStopped) {\n event.target = event.srcElement;\n event.currentTarget = element;\n\n event.preventDefault = event.preventDefault || preventDef;\n event.stopPropagation = event.stopPropagation || stopProp;\n event.stopImmediatePropagation = event.stopImmediatePropagation || stopImmProp;\n\n if (/mouse|click/.test(event.type)) {\n event.pageX = event.clientX + getWindow(element).document.documentElement.scrollLeft;\n event.pageY = event.clientY + getWindow(element).document.documentElement.scrollTop;\n }\n\n listener(event);\n }\n };\n\n ret = element[addEvent](on + type, wrappedListener, !!options.capture);\n\n if (listenerIndex === -1) {\n supplied.push(listener);\n wrapped.push(wrappedListener);\n useCount.push(1);\n }\n else {\n useCount[listenerIndex]++;\n }\n }\n else {\n ret = element[addEvent](type, listener, supportsOptions? options : !!options.capture);\n }\n target.events[type].push(listener);\n\n return ret;\n }\n}\n\nfunction remove (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const elementIndex = indexOf(elements, element);\n const target = targets[elementIndex];\n\n if (!target || !target.events) {\n return;\n }\n\n let wrappedListener = listener;\n let listeners;\n let listenerIndex;\n\n if (useAttachEvent) {\n listeners = attachedListeners[elementIndex];\n listenerIndex = indexOf(listeners.supplied, listener);\n wrappedListener = listeners.wrapped[listenerIndex];\n }\n\n if (type === 'all') {\n for (type in target.events) {\n if (target.events.hasOwnProperty(type)) {\n remove(element, type, 'all');\n }\n }\n return;\n }\n\n if (target.events[type]) {\n const len = target.events[type].length;\n\n if (listener === 'all') {\n for (let i = 0; i < len; i++) {\n remove(element, type, target.events[type][i], options);\n }\n return;\n }\n else {\n for (let i = 0; i < len; i++) {\n if (target.events[type][i] === listener) {\n element[removeEvent](on + type, wrappedListener, supportsOptions? options : !!options.capture);\n target.events[type].splice(i, 1);\n\n if (useAttachEvent && listeners) {\n listeners.useCount[listenerIndex]--;\n if (listeners.useCount[listenerIndex] === 0) {\n listeners.supplied.splice(listenerIndex, 1);\n listeners.wrapped.splice(listenerIndex, 1);\n listeners.useCount.splice(listenerIndex, 1);\n }\n }\n\n break;\n }\n }\n }\n\n if (target.events[type] && target.events[type].length === 0) {\n target.events[type] = null;\n target.typeCount--;\n }\n }\n\n if (!target.typeCount) {\n targets.splice(elementIndex, 1);\n elements.splice(elementIndex, 1);\n attachedListeners.splice(elementIndex, 1);\n }\n}\n\nfunction addDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n if (!delegatedEvents[type]) {\n delegatedEvents[type] = {\n selectors: [],\n contexts : [],\n listeners: [],\n };\n\n // add delegate listener functions\n for (let i = 0; i < documents.length; i++) {\n add(documents[i], type, delegateListener);\n add(documents[i], type, delegateUseCapture, true);\n }\n }\n\n const delegated = delegatedEvents[type];\n let index;\n\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n break;\n }\n }\n\n if (index === -1) {\n index = delegated.selectors.length;\n\n delegated.selectors.push(selector);\n delegated.contexts .push(context);\n delegated.listeners.push([]);\n }\n\n // keep listener and capture and passive flags\n delegated.listeners[index].push([listener, !!options.capture, options.passive]);\n}\n\nfunction removeDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const delegated = delegatedEvents[type];\n let matchFound = false;\n let index;\n\n if (!delegated) { return; }\n\n // count from last index of delegated to 0\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n // look for matching selector and context Node\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n\n const listeners = delegated.listeners[index];\n\n // each item of the listeners array is an array: [function, capture, passive]\n for (let i = listeners.length - 1; i >= 0; i--) {\n const [fn, capture, passive] = listeners[i];\n\n // check if the listener functions and capture and passive flags match\n if (fn === listener && capture === !!options.capture && passive === options.passive) {\n // remove the listener from the array of listeners\n listeners.splice(i, 1);\n\n // if all listeners for this interactable have been removed\n // remove the interactable from the delegated arrays\n if (!listeners.length) {\n delegated.selectors.splice(index, 1);\n delegated.contexts .splice(index, 1);\n delegated.listeners.splice(index, 1);\n\n // remove delegate function from context\n remove(context, type, delegateListener);\n remove(context, type, delegateUseCapture, true);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegatedEvents[type] = null;\n }\n }\n\n // only remove one listener\n matchFound = true;\n break;\n }\n }\n\n if (matchFound) { break; }\n }\n }\n}\n\n// bound to the interactable context when a DOM event\n// listener is added to a selector interactable\nfunction delegateListener (event, optionalArg) {\n const options = getOptions(optionalArg);\n const fakeEvent = {};\n const delegated = delegatedEvents[event.type];\n const eventTarget = (domUtils.getActualElement(event.path\n ? event.path[0]\n : event.target));\n let element = eventTarget;\n\n // duplicate the event so that currentTarget can be changed\n pExtend(fakeEvent, event);\n\n fakeEvent.originalEvent = event;\n fakeEvent.preventDefault = preventOriginalDefault;\n\n // climb up document tree looking for selector matches\n while (is.element(element)) {\n for (let i = 0; i < delegated.selectors.length; i++) {\n const selector = delegated.selectors[i];\n const context = delegated.contexts[i];\n\n if (domUtils.matchesSelector(element, selector)\n && domUtils.nodeContains(context, eventTarget)\n && domUtils.nodeContains(context, element)) {\n\n const listeners = delegated.listeners[i];\n\n fakeEvent.currentTarget = element;\n\n for (let j = 0; j < listeners.length; j++) {\n const [fn, capture, passive] = listeners[j];\n\n if (capture === !!options.capture && passive === options.passive) {\n fn(fakeEvent);\n }\n }\n }\n }\n\n element = domUtils.parentNode(element);\n }\n}\n\nfunction delegateUseCapture (event) {\n return delegateListener.call(this, event, true);\n}\n\nfunction preventDef () {\n this.returnValue = false;\n}\n\nfunction preventOriginalDefault () {\n this.originalEvent.preventDefault();\n}\n\nfunction stopProp () {\n this.cancelBubble = true;\n}\n\nfunction stopImmProp () {\n this.cancelBubble = true;\n this.immediatePropagationStopped = true;\n}\n\nfunction getOptions (param) {\n return is.object(param)? param : { capture: param };\n}\n\nmodule.exports = {\n add,\n remove,\n\n addDelegate,\n removeDelegate,\n\n delegateListener,\n delegateUseCapture,\n delegatedEvents,\n documents,\n\n useAttachEvent,\n supportsOptions,\n\n _elements: elements,\n _targets: targets,\n _attachedListeners: attachedListeners,\n};\n","module.exports = function extend (dest, source) {\n for (const prop in source) {\n dest[prop] = source[prop];\n }\n return dest;\n};\n","const {\n resolveRectLike,\n rectToXY,\n} = require('./rect');\n\nmodule.exports = function (target, element, action) {\n const actionOptions = target.options[action];\n const actionOrigin = actionOptions && actionOptions.origin;\n const origin = actionOrigin || target.options.origin;\n\n const originRect = resolveRectLike(origin, target, element, [target && element]);\n\n return rectToXY(originRect) || { x: 0, y: 0 };\n};\n","module.exports = (x, y) => Math.sqrt(x * x + y * y);\n","const extend = require('./extend');\nconst win = require('./window');\n\nconst utils = {\n warnOnce: function (method, message) {\n let warned = false;\n\n return function () {\n if (!warned) {\n win.window.console.warn(message);\n warned = true;\n }\n\n return method.apply(this, arguments);\n };\n },\n\n // http://stackoverflow.com/a/5634528/2280888\n _getQBezierValue: function (t, p1, p2, p3) {\n const iT = 1 - t;\n return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3;\n },\n\n getQuadraticCurvePoint: function (startX, startY, cpX, cpY, endX, endY, position) {\n return {\n x: utils._getQBezierValue(position, startX, cpX, endX),\n y: utils._getQBezierValue(position, startY, cpY, endY),\n };\n },\n\n // http://gizma.com/easing/\n easeOutQuad: function (t, b, c, d) {\n t /= d;\n return -c * t*(t-2) + b;\n },\n\n copyAction: function (dest, src) {\n dest.name = src.name;\n dest.axis = src.axis;\n dest.edges = src.edges;\n\n return dest;\n },\n\n is : require('./is'),\n extend : extend,\n hypot : require('./hypot'),\n getOriginXY: require('./getOriginXY'),\n};\n\nextend(utils, require('./arr'));\nextend(utils, require('./domUtils'));\nextend(utils, require('./pointerUtils'));\nextend(utils, require('./rect'));\n\nmodule.exports = utils;\n","const scope = require('../scope');\nconst utils = require('./index');\n\nconst finder = {\n methodOrder: [ 'simulationResume', 'mouseOrPen', 'hasPointer', 'idle' ],\n\n search: function (pointer, eventType, eventTarget) {\n const pointerType = utils.getPointerType(pointer);\n const pointerId = utils.getPointerId(pointer);\n const details = { pointer, pointerId, pointerType, eventType, eventTarget };\n\n for (const method of finder.methodOrder) {\n const interaction = finder[method](details);\n\n if (interaction) {\n return interaction;\n }\n }\n },\n\n // try to resume simulation with a new pointer\n simulationResume: function ({ pointerType, eventType, eventTarget }) {\n if (!/down|start/i.test(eventType)) {\n return null;\n }\n\n for (const interaction of scope.interactions) {\n let element = eventTarget;\n\n if (interaction.simulation && interaction.simulation.allowResume\n && (interaction.pointerType === pointerType)) {\n while (element) {\n // if the element is the interaction element\n if (element === interaction.element) {\n return interaction;\n }\n element = utils.parentNode(element);\n }\n }\n }\n\n return null;\n },\n\n // if it's a mouse or pen interaction\n mouseOrPen: function ({ pointerId, pointerType, eventType }) {\n if (pointerType !== 'mouse' && pointerType !== 'pen') {\n return null;\n }\n\n let firstNonActive;\n\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType) {\n // if it's a down event, skip interactions with running simulations\n if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; }\n\n // if the interaction is active, return it immediately\n if (interaction.interacting()) {\n return interaction;\n }\n // otherwise save it and look for another active interaction\n else if (!firstNonActive) {\n firstNonActive = interaction;\n }\n }\n }\n\n // if no active mouse interaction was found use the first inactive mouse\n // interaction\n if (firstNonActive) {\n return firstNonActive;\n }\n\n // find any mouse or pen interaction.\n // ignore the interaction if the eventType is a *down, and a simulation\n // is active\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType && !(/down/i.test(eventType) && interaction.simulation)) {\n return interaction;\n }\n }\n\n return null;\n },\n\n // get interaction that has this pointer\n hasPointer: function ({ pointerId }) {\n for (const interaction of scope.interactions) {\n if (utils.contains(interaction.pointerIds, pointerId)) {\n return interaction;\n }\n }\n },\n\n // get first idle interaction with a matching pointerType\n idle: function ({ pointerType }) {\n for (const interaction of scope.interactions) {\n // if there's already a pointer held down\n if (interaction.pointerIds.length === 1) {\n const target = interaction.target;\n // don't add this pointer if there is a target interactable and it\n // isn't gesturable\n if (target && !target.options.gesture.enabled) {\n continue;\n }\n }\n // maximum of 2 pointers per interaction\n else if (interaction.pointerIds.length >= 2) {\n continue;\n }\n\n if (!interaction.interacting() && (pointerType === interaction.pointerType)) {\n return interaction;\n }\n }\n\n return null;\n },\n};\n\nmodule.exports = finder;\n","const win = require('./window');\nconst isWindow = require('./isWindow');\n\nconst is = {\n array : () => {},\n\n window : thing => thing === win.window || isWindow(thing),\n\n docFrag : thing => is.object(thing) && thing.nodeType === 11,\n\n object : thing => !!thing && (typeof thing === 'object'),\n\n function: thing => typeof thing === 'function',\n\n number : thing => typeof thing === 'number' ,\n\n bool : thing => typeof thing === 'boolean' ,\n\n string : thing => typeof thing === 'string' ,\n\n element: thing => {\n if (!thing || (typeof thing !== 'object')) { return false; }\n\n const _window = win.getWindow(thing) || win.window;\n\n return (/object|function/.test(typeof _window.Element)\n ? thing instanceof _window.Element //DOM2\n : thing.nodeType === 1 && typeof thing.nodeName === 'string');\n },\n};\n\nis.array = thing => (is.object(thing)\n && (typeof thing.length !== 'undefined')\n && is.function(thing.splice));\n\nmodule.exports = is;\n","module.exports = (thing) => !!(thing && thing.Window) && (thing instanceof thing.Window);\n","function pointerExtend (dest, source) {\n for (const prop in source) {\n const prefixedPropREs = module.exports.prefixedPropREs;\n let deprecated = false;\n\n // skip deprecated prefixed properties\n for (const vendor in prefixedPropREs) {\n if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) {\n deprecated = true;\n break;\n }\n }\n\n if (!deprecated && typeof source[prop] !== 'function') {\n dest[prop] = source[prop];\n }\n }\n return dest;\n}\n\npointerExtend.prefixedPropREs = {\n webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/,\n};\n\nmodule.exports = pointerExtend;\n","const hypot = require('./hypot');\nconst browser = require('./browser');\nconst dom = require('./domObjects');\nconst domUtils = require('./domUtils');\nconst domObjects = require('./domObjects');\nconst is = require('./is');\nconst pointerExtend = require('./pointerExtend');\n\nconst pointerUtils = {\n copyCoords: function (dest, src) {\n dest.page = dest.page || {};\n dest.page.x = src.page.x;\n dest.page.y = src.page.y;\n\n dest.client = dest.client || {};\n dest.client.x = src.client.x;\n dest.client.y = src.client.y;\n\n dest.timeStamp = src.timeStamp;\n },\n\n setCoordDeltas: function (targetObj, prev, cur) {\n targetObj.page.x = cur.page.x - prev.page.x;\n targetObj.page.y = cur.page.y - prev.page.y;\n targetObj.client.x = cur.client.x - prev.client.x;\n targetObj.client.y = cur.client.y - prev.client.y;\n targetObj.timeStamp = cur.timeStamp - prev.timeStamp;\n\n // set pointer velocity\n const dt = Math.max(targetObj.timeStamp / 1000, 0.001);\n\n targetObj.page.speed = hypot(targetObj.page.x, targetObj.page.y) / dt;\n targetObj.page.vx = targetObj.page.x / dt;\n targetObj.page.vy = targetObj.page.y / dt;\n\n targetObj.client.speed = hypot(targetObj.client.x, targetObj.page.y) / dt;\n targetObj.client.vx = targetObj.client.x / dt;\n targetObj.client.vy = targetObj.client.y / dt;\n },\n\n isNativePointer: function (pointer) {\n return (pointer instanceof dom.Event || pointer instanceof dom.Touch);\n },\n\n // Get specified X/Y coords for mouse or event.touches[0]\n getXY: function (type, pointer, xy) {\n xy = xy || {};\n type = type || 'page';\n\n xy.x = pointer[type + 'X'];\n xy.y = pointer[type + 'Y'];\n\n return xy;\n },\n\n getPageXY: function (pointer, page) {\n page = page || {};\n\n // Opera Mobile handles the viewport and scrolling oddly\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n pointerUtils.getXY('screen', pointer, page);\n\n page.x += window.scrollX;\n page.y += window.scrollY;\n }\n else {\n pointerUtils.getXY('page', pointer, page);\n }\n\n return page;\n },\n\n getClientXY: function (pointer, client) {\n client = client || {};\n\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n // Opera Mobile handles the viewport and scrolling oddly\n pointerUtils.getXY('screen', pointer, client);\n }\n else {\n pointerUtils.getXY('client', pointer, client);\n }\n\n return client;\n },\n\n getPointerId: function (pointer) {\n return is.number(pointer.pointerId)? pointer.pointerId : pointer.identifier;\n },\n\n setCoords: function (targetObj, pointers, timeStamp) {\n const pointer = (pointers.length > 1\n ? pointerUtils.pointerAverage(pointers)\n : pointers[0]);\n\n const tmpXY = {};\n\n pointerUtils.getPageXY(pointer, tmpXY);\n targetObj.page.x = tmpXY.x;\n targetObj.page.y = tmpXY.y;\n\n pointerUtils.getClientXY(pointer, tmpXY);\n targetObj.client.x = tmpXY.x;\n targetObj.client.y = tmpXY.y;\n\n targetObj.timeStamp = is.number(timeStamp) ? timeStamp :new Date().getTime();\n },\n\n pointerExtend: pointerExtend,\n\n getTouchPair: function (event) {\n const touches = [];\n\n // array of touches is supplied\n if (is.array(event)) {\n touches[0] = event[0];\n touches[1] = event[1];\n }\n // an event\n else {\n if (event.type === 'touchend') {\n if (event.touches.length === 1) {\n touches[0] = event.touches[0];\n touches[1] = event.changedTouches[0];\n }\n else if (event.touches.length === 0) {\n touches[0] = event.changedTouches[0];\n touches[1] = event.changedTouches[1];\n }\n }\n else {\n touches[0] = event.touches[0];\n touches[1] = event.touches[1];\n }\n }\n\n return touches;\n },\n\n pointerAverage: function (pointers) {\n const average = {\n pageX : 0,\n pageY : 0,\n clientX: 0,\n clientY: 0,\n screenX: 0,\n screenY: 0,\n };\n\n for (const pointer of pointers) {\n for (const prop in average) {\n average[prop] += pointer[prop];\n }\n }\n for (const prop in average) {\n average[prop] /= pointers.length;\n }\n\n return average;\n },\n\n touchBBox: function (event) {\n if (!event.length && !(event.touches && event.touches.length > 1)) {\n return;\n }\n\n const touches = pointerUtils.getTouchPair(event);\n const minX = Math.min(touches[0].pageX, touches[1].pageX);\n const minY = Math.min(touches[0].pageY, touches[1].pageY);\n const maxX = Math.max(touches[0].pageX, touches[1].pageX);\n const maxY = Math.max(touches[0].pageY, touches[1].pageY);\n\n return {\n x: minX,\n y: minY,\n left: minX,\n top: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n },\n\n touchDistance: function (event, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n\n\n const dx = touches[0][sourceX] - touches[1][sourceX];\n const dy = touches[0][sourceY] - touches[1][sourceY];\n\n return hypot(dx, dy);\n },\n\n touchAngle: function (event, prevAngle, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n const dx = touches[1][sourceX] - touches[0][sourceX];\n const dy = touches[1][sourceY] - touches[0][sourceY];\n const angle = 180 * Math.atan2(dy , dx) / Math.PI;\n\n return angle;\n },\n\n getPointerType: function (pointer) {\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : is.number(pointer.pointerType)\n ? [undefined, undefined,'touch', 'pen', 'mouse'][pointer.pointerType]\n // if the PointerEvent API isn't available, then the \"pointer\" must\n // be either a MouseEvent, TouchEvent, or Touch object\n : /touch/.test(pointer.type) || pointer instanceof domObjects.Touch\n ? 'touch'\n : 'mouse';\n },\n\n // [ event.target, event.currentTarget ]\n getEventTargets: function (event) {\n return [\n domUtils.getActualElement(event.path ? event.path[0] : event.target),\n domUtils.getActualElement(event.currentTarget),\n ];\n },\n};\n\nmodule.exports = pointerUtils;\n","const { window } = require('./window');\n\nconst vendors = ['ms', 'moz', 'webkit', 'o'];\nlet lastTime = 0;\nlet request;\nlet cancel;\n\nfor (let x = 0; x < vendors.length && !window.requestAnimationFrame; x++) {\n request = window[vendors[x] + 'RequestAnimationFrame'];\n cancel = window[vendors[x] +'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n}\n\nif (!request) {\n request = function (callback) {\n const currTime = new Date().getTime();\n const timeToCall = Math.max(0, 16 - (currTime - lastTime));\n const id = setTimeout(function () { callback(currTime + timeToCall); },\n timeToCall);\n\n lastTime = currTime + timeToCall;\n return id;\n };\n}\n\nif (!cancel) {\n cancel = function (id) {\n clearTimeout(id);\n };\n}\n\nmodule.exports = {\n request,\n cancel,\n};\n","const extend = require('./extend');\nconst is = require('./is');\nconst {\n closest,\n parentNode,\n getElementRect,\n} = require('./domUtils');\n\nconst rectUtils = {\n getStringOptionResult: function (value, interactable, element) {\n if (!is.string(value)) {\n return null;\n }\n\n if (value === 'parent') {\n value = parentNode(element);\n }\n else if (value === 'self') {\n value = interactable.getRect(element);\n }\n else {\n value = closest(element, value);\n }\n\n return value;\n },\n\n resolveRectLike: function (value, interactable, element, functionArgs) {\n value = rectUtils.getStringOptionResult(value, interactable, element) || value;\n\n if (is.function(value)) {\n value = value.apply(null, functionArgs);\n }\n\n if (is.element(value)) {\n value = getElementRect(value);\n }\n\n return value;\n },\n\n rectToXY: function (rect) {\n return rect && {\n x: 'x' in rect ? rect.x : rect.left,\n y: 'y' in rect ? rect.y : rect.top,\n };\n },\n\n xywhToTlbr: function (rect) {\n if (rect && !('left' in rect && 'top' in rect)) {\n rect = extend({}, rect);\n\n rect.left = rect.x || 0;\n rect.top = rect.y || 0;\n rect.right = rect.right || (rect.left + rect.width);\n rect.bottom = rect.bottom || (rect.top + rect.height);\n }\n\n return rect;\n },\n\n tlbrToXywh: function (rect) {\n if (rect && !('x' in rect && 'y' in rect)) {\n rect = extend({}, rect);\n\n rect.x = rect.left || 0;\n rect.top = rect.top || 0;\n rect.width = rect.width || (rect.right - rect.x);\n rect.height = rect.height || (rect.bottom - rect.y);\n }\n\n return rect;\n },\n};\n\nmodule.exports = rectUtils;\n","const win = module.exports;\nconst isWindow = require('./isWindow');\n\nfunction init (window) {\n // get wrapped window if using Shadow DOM polyfill\n\n win.realWindow = window;\n\n // create a TextNode\n const el = window.document.createTextNode('');\n\n // check if it's wrapped by a polyfill\n if (el.ownerDocument !== window.document\n && typeof window.wrap === 'function'\n && window.wrap(el) === el) {\n // use wrapped window\n window = window.wrap(window);\n }\n\n win.window = window;\n}\n\nif (typeof window === 'undefined') {\n win.window = undefined;\n win.realWindow = undefined;\n}\nelse {\n init(window);\n}\n\nwin.getWindow = function getWindow (node) {\n if (isWindow(node)) {\n return node;\n }\n\n const rootNode = (node.ownerDocument || node);\n\n return rootNode.defaultView || rootNode.parentWindow || win.window;\n};\n\nwin.init = init;\n"]} \ No newline at end of file diff --git a/dist/interact.min.js b/dist/interact.min.js index c0bb2476c..2d1f0fb62 100644 --- a/dist/interact.min.js +++ b/dist/interact.min.js @@ -1,6 +1,6 @@ -/* interact.js v1.3.0-alpha.3+sha.9595c40 | https://raw.github.com/taye/interact.js/master/LICENSE */ -!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var t;t="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,t.interact=e()}}(function(){return function e(t,n,r){function i(s,a){if(!n[s]){if(!t[s]){var l="function"==typeof require&&require;if(!a&&l)return l(s,!0);if(o)return o(s,!0);var c=new Error("Cannot find module '"+s+"'");throw c.code="MODULE_NOT_FOUND",c}var p=n[s]={exports:{}};t[s][0].call(p.exports,function(e){var n=t[s][1][e];return i(n||e)},p,p.exports,e,t,n,r)}return n[s].exports}for(var o="function"==typeof require&&require,s=0;s6&&void 0!==arguments[6]&&arguments[6];r(this,e);var f=t.target,v=(f&&f.options||s).deltaSource,g=o(f,p,l),h="start"===c,m="end"===c,y=h?t.startCoords:t.curCoords,x=t.prevEvent;p=p||t.element;var b=i({},y.page),w=i({},y.client);b.x-=g.x,b.y-=g.y,w.x-=g.x,w.y-=g.y,this.ctrlKey=n.ctrlKey,this.altKey=n.altKey,this.shiftKey=n.shiftKey,this.metaKey=n.metaKey,this.button=n.button,this.buttons=n.buttons,this.target=p,this.currentTarget=p,this.relatedTarget=u||null,this.preEnd=d,this.type=l+(c||""),this.interaction=t,this.interactable=f,this.t0=h?t.downTimes[t.downTimes.length-1]:x.t0;var E={interaction:t,event:n,action:l,phase:c,element:p,related:u,page:b,client:w,coords:y,starting:h,ending:m,deltaSource:v,iEvent:this};a.fire("set-xy",E),m?(this.pageX=x.pageX,this.pageY=x.pageY,this.clientX=x.clientX,this.clientY=x.clientY):(this.pageX=b.x,this.pageY=b.y,this.clientX=w.x,this.clientY=w.y),this.x0=t.startCoords.page.x-g.x,this.y0=t.startCoords.page.y-g.y,this.clientX0=t.startCoords.client.x-g.x,this.clientY0=t.startCoords.client.y-g.y,a.fire("set-delta",E),this.timeStamp=y.timeStamp,this.dt=t.pointerDelta.timeStamp,this.duration=this.timeStamp-this.t0,this.speed=t.pointerDelta[v].speed,this.velocityX=t.pointerDelta[v].vx,this.velocityY=t.pointerDelta[v].vy,this.swipe=m||"inertiastart"===c?this.getSwipe():null,a.fire("new",E)}return e.prototype.getSwipe=function(){var e=this.interaction;if(e.prevEvent.speed<600||this.timeStamp-e.prevEvent.timeStamp>150)return null;var t=180*Math.atan2(e.prevEvent.velocityY,e.prevEvent.velocityX)/Math.PI;t<0&&(t+=360);var n=112.5<=t&&t<247.5,r=202.5<=t&&t<337.5,i=!n&&(292.5<=t||t<67.5);return{up:r,down:!r&&22.5<=t&&t<157.5,left:n,right:i,angle:t,speed:e.prevEvent.speed,velocity:{x:e.prevEvent.velocityX,y:e.prevEvent.velocityY}}},e.prototype.preventDefault=function(){},e.prototype.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},e.prototype.stopPropagation=function(){this.propagationStopped=!0},e}();a.on("set-delta",function(e){var t=e.iEvent,n=e.interaction,r=e.starting,i=e.deltaSource,o=r?t:n.prevEvent;"client"===i?(t.dx=t.clientX-o.clientX,t.dy=t.clientY-o.clientY):(t.dx=t.pageX-o.pageX,t.dy=t.pageY-o.pageY)}),l.signals=a,t.exports=l},{"./defaultOptions":18,"./utils/Signals":35,"./utils/extend":41,"./utils/getOriginXY":42}],4:[function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=e("./utils/is"),o=e("./utils/events"),s=e("./utils/extend"),a=e("./actions/base"),l=e("./scope"),c=e("./Eventable"),p=e("./defaultOptions"),u=e("./utils/Signals").new(),d=e("./utils/domUtils"),f=d.getElementRect,v=d.nodeContains,g=d.trySelector,h=e("./utils/window"),m=h.getWindow,y=e("./utils/arr"),x=y.indexOf,b=y.contains,w=e("./utils/browser"),E=w.wheelEvent;l.interactables=[];var S=function(){function e(t,n){r(this,e),n=n||{},this.target=t,this.events=new c,this._context=n.context||l.document,this._win=m(g(t)?this._context:t),this._doc=this._win.document,u.fire("new",{target:t,options:n,interactable:this,win:this._win}),l.addDocument(this._doc,this._win),l.interactables.push(this),this.set(n)}return e.prototype.setOnEvents=function(e,t){var n="on"+e;return i.function(t.onstart)&&(this.events[n+"start"]=t.onstart),i.function(t.onmove)&&(this.events[n+"move"]=t.onmove),i.function(t.onend)&&(this.events[n+"end"]=t.onend),i.function(t.oninertiastart)&&(this.events[n+"inertiastart"]=t.oninertiastart),this},e.prototype.setPerAction=function(e,t){for(var n in t)n in p[e]&&(i.object(t[n])?(this.options[e][n]=s(this.options[e][n]||{},t[n]),i.object(p.perAction[n])&&"enabled"in p.perAction[n]&&(this.options[e][n].enabled=!1!==t[n].enabled)):i.bool(t[n])&&i.object(p.perAction[n])?this.options[e][n].enabled=t[n]:void 0!==t[n]&&(this.options[e][n]=t[n]))},e.prototype.getRect=function(e){return e=e||this.target,i.string(this.target)&&!i.element(e)&&(e=this._context.querySelector(this.target)),f(e)},e.prototype.rectChecker=function(e){return i.function(e)?(this.getRect=e,this):null===e?(delete this.options.getRect,this):this.getRect},e.prototype._backCompatOption=function(e,t){if(g(t)||i.object(t)){this.options[e]=t;for(var n=a.names,r=Array.isArray(n),o=0,n=r?n:n[Symbol.iterator]();;){var s;if(r){if(o>=n.length)break;s=n[o++]}else{if(o=n.next(),o.done)break;s=o.value}var l=s;this.options[l][e]=t}return this}return this.options[e]},e.prototype.origin=function(e){return this._backCompatOption("origin",e)},e.prototype.deltaSource=function(e){return"page"===e||"client"===e?(this.options.deltaSource=e,this):this.options.deltaSource},e.prototype.context=function(){return this._context},e.prototype.inContext=function(e){return this._context===e.ownerDocument||v(this._context,e)},e.prototype.fire=function(e){return this.events.fire(e),this},e.prototype._onOffMultiple=function(e,t,n,r){if(i.string(t)&&-1!==t.search(" ")&&(t=t.trim().split(/ +/)),i.array(t)){for(var o=0;o=l.length)break;f=l[d++]}else{if(d=l.next(),d.done)break;f=d.value}var v=f;this.options[v]=p.base[v],v in t&&this[v](t[v])}return u.fire("set",{options:t,interactable:this}),this},e.prototype.unset=function(){if(o.remove(this.target,"all"),i.string(this.target))for(var e in o.delegatedEvents){var t=o.delegatedEvents[e];t.selectors[0]===this.target&&t.contexts[0]===this._context&&(t.selectors.splice(0,1),t.contexts.splice(0,1),t.listeners.splice(0,1),t.selectors.length||(t[e]=null)),o.remove(this._context,e,o.delegateListener),o.remove(this._context,e,o.delegateUseCapture,!0)}else o.remove(this,"all");u.fire("unset",{interactable:this}),l.interactables.splice(x(l.interactables,this),1);for(var n=l.interactions||[],r=Array.isArray(n),s=0,n=r?n:n[Symbol.iterator]();;){var a;if(r){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var c=a;c.target===this&&c.interacting()&&c.stop()}return l.interact},e}();l.interactables.indexOfElement=function(e,t){t=t||l.document;for(var n=0;n=y.length)break;w=y[b++]}else{if(b=y.next(),b.done)break;w=b.value}var E=w,S=E[0],T=E[1];T._updateEventTargets(r,i),T[e](S,t,r,i)}}}function o(e){for(var t=0;te.pointerMoveTolerance);var a={pointer:t,pointerIndex:this.getPointerIndex(t),event:n,eventTarget:r,dx:o,dy:s,duplicate:i,interaction:this,interactingBeforeMove:this.interacting()};i||l.setCoordDeltas(this.pointerDelta,this.prevCoords,this.curCoords),d.fire("move",a),i||(this.interacting()&&this.doMove(a),this.pointerWasMoved&&l.copyCoords(this.prevCoords,this.curCoords))},e.prototype.doMove=function(e){e=l.extend({pointer:this.pointers[0],event:this.prevEvent,eventTarget:this._eventTarget,interaction:this},e||{}),d.fire("before-action-move",e),this._dontFireMove||d.fire("action-move",e),this._dontFireMove=!1},e.prototype.pointerUp=function(e,t,n,r){var i=this.getPointerIndex(e);d.fire(/cancel$/i.test(t.type)?"cancel":"up",{pointer:e,pointerIndex:i,event:t,eventTarget:n,curEventTarget:r,interaction:this}),this.simulation||this.end(t),this.pointerIsDown=!1,this.removePointer(e,t)},e.prototype.end=function(e){e=e||this.prevEvent,this.interacting()&&d.fire("action-end",{event:e,interaction:this}),this.stop()},e.prototype.currentAction=function(){return this._interacting?this.prepared.name:null},e.prototype.interacting=function(){return this._interacting},e.prototype.stop=function(){d.fire("stop",{interaction:this}),this._interacting&&(d.fire("stop-active",{interaction:this}),d.fire("stop-"+this.prepared.name,{interaction:this})),this.target=this.element=null,this._interacting=!1,this.prepared.name=this.prevEvent=null},e.prototype.getPointerIndex=function(e){return l.indexOf(this.pointerIds,l.getPointerId(e))},e.prototype.updatePointer=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:t&&/(down|start)$/i.test(t.type),r=l.getPointerId(e),i=this.getPointerIndex(e);return-1===i&&(i=this.pointerIds.length,this.pointerIds[i]=r),n&&d.fire("update-pointer-down",{pointer:e,event:t,down:n,pointerId:r,pointerIndex:i,interaction:this}),this.pointers[i]=e,i},e.prototype.removePointer=function(e,t){var n=l.getPointerId(e),r=this.mouse?0:l.indexOf(this.pointerIds,n);-1!==r&&(d.fire("remove-pointer",{pointer:e,event:t,pointerIndex:r,interaction:this}),this.pointers.splice(r,1),this.pointerIds.splice(r,1),this.downTargets.splice(r,1),this.downTimes.splice(r,1))},e.prototype._updateEventTargets=function(e,t){this._eventTarget=e,this._curEventTarget=t},e}(),m=0,y=v.length;m=i.length)break;a=i[s++]}else{if(s=i.next(),s.done)break;a=s.value}var l=a;if(l.options.drop.enabled){var c=l.options.drop.accept;if(!(p.is.element(c)&&c!==t||p.is.string(c)&&!p.matchesSelector(t,c)))for(var d=p.is.string(l.target)?l._context.querySelectorAll(l.target):[l.target],f=0;fo.left&&c.xo.top&&c.y=o.left&&v<=o.right&&g>=o.top&&g<=o.bottom}if(f&&p.is.number(a)){s=Math.max(0,Math.min(o.right,f.right)-Math.max(o.left,f.left))*Math.max(0,Math.min(o.bottom,f.bottom)-Math.max(o.top,f.top))/(f.width*f.height)>=a}return this.options.drop.checker&&(s=this.options.drop.checker(e,t,s,this,i,n,r)),s},v.signals.on("unset",function(e){e.interactable.dropzone(!1)}),v.settingsMethods.push("dropChecker"),g.signals.on("new",function(e){e.dropTarget=null,e.dropElement=null,e.prevDropTarget=null,e.prevDropElement=null,e.dropEvents=null,e.activeDrops={dropzones:[],elements:[],rects:[]}}),g.signals.on("stop",function(e){var t=e.interaction;t.dropTarget=t.dropElement=t.prevDropTarget=t.prevDropElement=null}),d.dynamicDrop=function(e){return p.is.bool(e)?(y=e,d):y},p.merge(v.eventTypes,["dragenter","dragleave","dropactivate","dropdeactivate","dropmove","drop"]),c.methodDict.drop="dropzone",h.drop=m.defaults,t.exports=m},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../interact":21,"../scope":34,"../utils":44,"./base":6}],9:[function(e,t,n){"use strict";var r=e("./base"),i=e("../utils"),o=e("../InteractEvent"),s=e("../Interactable"),a=e("../Interaction"),l=e("../defaultOptions"),c={defaults:{enabled:!1,origin:null,restrict:null},checker:function(e,t,n,r,i){return i.pointerIds.length>=2?{name:"gesture"}:null},getCursor:function(){return""}};o.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;"gesturestart"===t.type&&(t.ds=0,n.gesture.startDistance=n.gesture.prevDistance=t.distance,n.gesture.startAngle=n.gesture.prevAngle=t.angle,n.gesture.scale=1)}),o.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;"gesturemove"===t.type&&(t.ds=t.scale-n.gesture.scale,n.target.fire(t),n.gesture.prevAngle=t.angle,n.gesture.prevDistance=t.distance,t.scale===1/0||null===t.scale||void 0===t.scale||isNaN(t.scale)||(n.gesture.scale=t.scale))}),s.prototype.gesturable=function(e){return i.is.object(e)?(this.options.gesture.enabled=!1!==e.enabled,this.setPerAction("gesture",e),this.setOnEvents("gesture",e),this):i.is.bool(e)?(this.options.gesture.enabled=e,e||(this.ongesturestart=this.ongesturestart=this.ongestureend=null),this):this.options.gesture},o.signals.on("set-delta",function(e){var t=e.interaction,n=e.iEvent,r=e.action,s=e.event,a=e.starting,l=e.ending,c=e.deltaSource;if("gesture"===r){var p=t.pointers;n.touches=[p[0],p[1]],a?(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=1,n.ds=0,n.angle=i.touchAngle(p,void 0,c),n.da=0):l||s instanceof o?(n.distance=t.prevEvent.distance,n.box=t.prevEvent.box,n.scale=t.prevEvent.scale,n.ds=n.scale-1,n.angle=t.prevEvent.angle,n.da=n.angle-t.gesture.startAngle):(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=n.distance/t.gesture.startDistance,n.angle=i.touchAngle(p,t.gesture.prevAngle,c),n.ds=n.scale-t.gesture.prevScale,n.da=n.angle-t.gesture.prevAngle)}}),a.signals.on("new",function(e){e.gesture={start:{x:0,y:0},startDistance:0,prevDistance:0,distance:0,scale:1,startAngle:0,prevAngle:0}}),r.gesture=c,r.names.push("gesture"),i.merge(s.eventTypes,["gesturestart","gesturemove","gestureend"]),r.methodDict.gesture="gesturable",l.gesture=c.defaults,t.exports=c},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"./base":6}],10:[function(e,t,n){"use strict";function r(e,t,n,r,i,s,a){if(!t)return!1;if(!0===t){var l=o.is.number(s.width)?s.width:s.right-s.left,c=o.is.number(s.height)?s.height:s.bottom-s.top;if(l<0&&("left"===e?e="right":"right"===e&&(e="left")),c<0&&("top"===e?e="bottom":"bottom"===e&&(e="top")),"left"===e)return n.x<(l>=0?s.left:s.right)+a;if("top"===e)return n.y<(c>=0?s.top:s.bottom)+a;if("right"===e)return n.x>(l>=0?s.right:s.left)-a;if("bottom"===e)return n.y>(c>=0?s.bottom:s.top)-a}return!!o.is.element(r)&&(o.is.element(t)?t===r:o.matchesUpTo(r,t,i))}var i=e("./base"),o=e("../utils"),s=e("../utils/browser"),a=e("../InteractEvent"),l=e("../Interactable"),c=e("../Interaction"),p=e("../defaultOptions"),u=s.supportsTouch||s.supportsPointerEvent?20:10,d={defaults:{enabled:!1,mouseButtons:null,origin:null,snap:null,restrict:null,inertia:null,autoScroll:null,square:!1,preserveAspectRatio:!1,axis:"xy",margin:NaN,edges:null,invert:"none"},checker:function(e,t,n,i,s,a){if(!a)return null;var l=o.extend({},s.curCoords.page),c=n.options;if(c.resize.enabled){var p=c.resize,d={left:!1,right:!1,top:!1,bottom:!1};if(o.is.object(p.edges)){for(var f in d)d[f]=r(f,p.edges[f],l,s._eventTarget,i,a,p.margin||u);if(d.left=d.left&&!d.right,d.top=d.top&&!d.bottom,d.left||d.right||d.top||d.bottom)return{name:"resize",edges:d}}else{var v="y"!==c.resize.axis&&l.x>a.right-u,g="x"!==c.resize.axis&&l.y>a.bottom-u;if(v||g)return{name:"resize",axes:(v?"x":"")+(g?"y":"")}}}return null},cursors:s.isIe9OrOlder?{x:"e-resize",y:"s-resize",xy:"se-resize",top:"n-resize",left:"w-resize",bottom:"s-resize",right:"e-resize",topleft:"se-resize",bottomright:"se-resize",topright:"ne-resize",bottomleft:"ne-resize"}:{x:"ew-resize",y:"ns-resize",xy:"nwse-resize",top:"ns-resize",left:"ew-resize",bottom:"ns-resize",right:"ew-resize",topleft:"nwse-resize",bottomright:"nwse-resize",topright:"nesw-resize",bottomleft:"nesw-resize"},getCursor:function(e){if(e.axis)return d.cursors[e.name+e.axis];if(e.edges){for(var t="",n=["top","bottom","left","right"],r=0;r<4;r++)e.edges[n[r]]&&(t+=n[r]);return d.cursors[t]}}};a.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;if("resizestart"===t.type&&n.prepared.edges){var r=n.target.getRect(n.element),i=n.target.options.resize;if(i.square||i.preserveAspectRatio){var s=o.extend({},n.prepared.edges);s.top=s.top||s.left&&!s.bottom,s.left=s.left||s.top&&!s.right,s.bottom=s.bottom||s.right&&!s.top,s.right=s.right||s.bottom&&!s.left,n.prepared._linkedEdges=s}else n.prepared._linkedEdges=null;i.preserveAspectRatio&&(n.resizeStartAspectRatio=r.width/r.height),n.resizeRects={start:r,current:o.extend({},r),inverted:o.extend({},r),previous:o.extend({},r),delta:{left:0,right:0,width:0,top:0,bottom:0,height:0}},t.rect=n.resizeRects.inverted,t.deltaRect=n.resizeRects.delta}}),a.signals.on("new",function(e){var t=e.iEvent,n=e.phase,r=e.interaction;if("move"===n&&r.prepared.edges){var i=r.target.options.resize,s=i.invert,a="reposition"===s||"negate"===s,l=r.prepared.edges,c=r.resizeRects.start,p=r.resizeRects.current,u=r.resizeRects.inverted,d=r.resizeRects.delta,f=o.extend(r.resizeRects.previous,u),v=l,g=t.dx,h=t.dy;if(i.preserveAspectRatio||i.square){var m=i.preserveAspectRatio?r.resizeStartAspectRatio:1;l=r.prepared._linkedEdges,v.left&&v.bottom||v.right&&v.top?h=-g/m:v.left||v.right?h=g/m:(v.top||v.bottom)&&(g=h*m)}if(l.top&&(p.top+=h),l.bottom&&(p.bottom+=h),l.left&&(p.left+=g),l.right&&(p.right+=g),a){if(o.extend(u,p),"reposition"===s){var y=void 0;u.top>u.bottom&&(y=u.top,u.top=u.bottom,u.bottom=y),u.left>u.right&&(y=u.left,u.left=u.right,u.right=y)}}else u.top=Math.min(p.top,c.bottom),u.bottom=Math.max(p.bottom,c.top),u.left=Math.min(p.left,c.right),u.right=Math.max(p.right,c.left);u.width=u.right-u.left,u.height=u.bottom-u.top;for(var x in u)d[x]=u[x]-f[x];t.edges=r.prepared.edges,t.rect=u,t.deltaRect=d}}),l.prototype.resizable=function(e){return o.is.object(e)?(this.options.resize.enabled=!1!==e.enabled,this.setPerAction("resize",e),this.setOnEvents("resize",e),/^x$|^y$|^xy$/.test(e.axis)?this.options.resize.axis=e.axis:null===e.axis&&(this.options.resize.axis=p.resize.axis),o.is.bool(e.preserveAspectRatio)?this.options.resize.preserveAspectRatio=e.preserveAspectRatio:o.is.bool(e.square)&&(this.options.resize.square=e.square),this):o.is.bool(e)?(this.options.resize.enabled=e,e||(this.onresizestart=this.onresizestart=this.onresizeend=null),this):this.options.resize},c.signals.on("new",function(e){ -e.resizeAxes="xy"}),a.signals.on("set-delta",function(e){var t=e.interaction,n=e.iEvent;"resize"===e.action&&t.resizeAxes&&(t.target.options.resize.square?("y"===t.resizeAxes?n.dx=n.dy:n.dy=n.dx,n.axes="xy"):(n.axes=t.resizeAxes,"x"===t.resizeAxes?n.dy=0:"y"===t.resizeAxes&&(n.dx=0)))}),i.resize=d,i.names.push("resize"),o.merge(l.eventTypes,["resizestart","resizemove","resizeinertiastart","resizeinertiaresume","resizeend"]),i.methodDict.resize="resizable",p.resize=d.defaults,t.exports=d},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"../utils/browser":37,"./base":6}],11:[function(e,t,n){"use strict";var r=e("./utils/raf"),i=e("./utils/window").getWindow,o=e("./utils/is"),s=e("./utils/domUtils"),a=e("./Interaction"),l=e("./defaultOptions"),c={defaults:{enabled:!1,container:null,margin:60,speed:300},interaction:null,i:null,x:0,y:0,isScrolling:!1,prevTime:0,start:function(e){c.isScrolling=!0,r.cancel(c.i),c.interaction=e,c.prevTime=(new Date).getTime(),c.i=r.request(c.scroll)},stop:function(){c.isScrolling=!1,r.cancel(c.i)},scroll:function(){var e=c.interaction.target.options[c.interaction.prepared.name].autoScroll,t=e.container||i(c.interaction.element),n=(new Date).getTime(),s=(n-c.prevTime)/1e3,a=e.speed*s;a>=1&&(o.window(t)?t.scrollBy(c.x*a,c.y*a):t&&(t.scrollLeft+=c.x*a,t.scrollTop+=c.y*a),c.prevTime=n),c.isScrolling&&(r.cancel(c.i),c.i=r.request(c.scroll))},check:function(e,t){var n=e.options;return n[t].autoScroll&&n[t].autoScroll.enabled},onInteractionMove:function(e){var t=e.interaction,n=e.pointer;if(t.interacting()&&c.check(t.target,t.prepared.name)){if(t.simulation)return void(c.x=c.y=0);var r=void 0,a=void 0,l=void 0,p=void 0,u=t.target.options[t.prepared.name].autoScroll,d=u.container||i(t.element);if(o.window(d))p=n.clientXd.innerWidth-c.margin,l=n.clientY>d.innerHeight-c.margin;else{var f=s.getElementClientRect(d);p=n.clientXf.right-c.margin,l=n.clientY>f.bottom-c.margin}c.x=a?1:p?-1:0,c.y=l?1:r?-1:0,c.isScrolling||(c.margin=u.margin,c.speed=u.speed,c.start(t))}}};a.signals.on("stop-active",function(){c.stop()}),a.signals.on("action-move",c.onInteractionMove),l.perAction.autoScroll=c.defaults,t.exports=c},{"./Interaction":5,"./defaultOptions":18,"./utils/domUtils":39,"./utils/is":46,"./utils/raf":50,"./utils/window":52}],12:[function(e,t,n){"use strict";var r=e("../Interactable"),i=e("../actions/base"),o=e("../utils/is"),s=e("../utils/domUtils");r.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},r.prototype.ignoreFrom=function(e){return this._backCompatOption("ignoreFrom",e)},r.prototype.allowFrom=function(e){return this._backCompatOption("allowFrom",e)},r.prototype.testIgnore=function(e,t,n){return!(!e||!o.element(n))&&(o.string(e)?s.matchesUpTo(n,e,t):!!o.element(e)&&s.nodeContains(e,n))},r.prototype.testAllow=function(e,t,n){return!e||!!o.element(n)&&(o.string(e)?s.matchesUpTo(n,e,t):!!o.element(e)&&s.nodeContains(e,n))},r.prototype.testIgnoreAllow=function(e,t,n){return!this.testIgnore(e.ignoreFrom,t,n)&&this.testAllow(e.allowFrom,t,n)},r.prototype.actionChecker=function(e){return o.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},r.prototype.styleCursor=function(e){return o.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},r.prototype.defaultActionChecker=function(e,t,n,r){for(var o=this.getRect(r),s=null,a=i.names,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var u=p;if((!n.pointerIsDown||!n.mouse||0!=(t.buttons&this.options[u].mouseButtons))&&(s=i[u].checker(e,t,this,r,n,o)))return s}}},{"../Interactable":4,"../actions/base":6,"../utils/domUtils":39,"../utils/is":46}],13:[function(e,t,n){"use strict";function r(e,t,n,r){return g.is.object(e)&&t.testIgnoreAllow(t.options[e.name],n,r)&&t.options[e.name].enabled&&a(t,n,e)?e:null}function i(e,t,n,i,o,s){for(var a=0,l=i.length;a=m.maxInteractions)return!1;if(u.target===e){if((a+=d===n.name|0)>=i)return!1;if(u.element===t&&(l++,d!==n.name||l>=o))return!1}}}return m.maxInteractions>0}}var l=e("../interact"),c=e("../Interactable"),p=e("../Interaction"),u=e("../actions/base"),d=e("../defaultOptions"),f=e("../utils/browser"),v=e("../scope"),g=e("../utils"),h=e("../utils/Signals").new();e("./InteractableMethods");var m={signals:h,withinInteractionLimit:a,maxInteractions:1/0,defaults:{perAction:{manualStart:!1,max:1/0,maxPerElement:1,allowFrom:null,ignoreFrom:null}},setActionDefaults:function(e){g.extend(e.defaults,m.defaults.perAction)}};p.signals.on("down",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;if(!t.interacting()){s(t,o(t,n,r,i))}}),p.signals.on("move",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;if(t.mouse&&!t.pointerIsDown&&!t.interacting()){s(t,o(t,n,r,i))}}),p.signals.on("move",function(e){var t=e.interaction,n=e.event;if(t.pointerIsDown&&!t.interacting()&&t.pointerWasMoved&&t.prepared.name){h.fire("before-start",e);var r=t.target;t.prepared.name&&r&&(r.options[t.prepared.name].manualStart||!a(r,t.element,t.prepared)?t.stop(n):t.start(t.prepared,r,t.element))}}),p.signals.on("stop",function(e){var t=e.interaction,n=t.target;n&&n.options.styleCursor&&(n._doc.documentElement.style.cursor="")}),c.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},c.prototype.actionChecker=function(e){return g.is.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},c.prototype.styleCursor=function(e){return g.is.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},c.prototype.defaultActionChecker=function(e,t,n,r){for(var i=this.getRect(r),o=t.buttons||{0:1,1:4,3:8,4:16}[t.button],s=null,a=u.names,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var d=p;if((!n.pointerIsDown||!n.mouse||0!=(o&this.options[d].mouseButtons))&&(s=u[d].checker(e,t,this,r,n,i)))return s}},l.maxInteractions=function(e){return g.is.number(e)?(m.maxInteractions=e,this):m.maxInteractions},c.settingsMethods.push("styleCursor"),c.settingsMethods.push("actionChecker"),c.settingsMethods.push("ignoreFrom"),c.settingsMethods.push("allowFrom"),d.base.actionChecker=null,d.base.styleCursor=!0,g.extend(d.perAction,m.defaults.perAction),t.exports=m},{"../Interactable":4,"../Interaction":5,"../actions/base":6,"../defaultOptions":18,"../interact":21,"../scope":34,"../utils":44,"../utils/Signals":35,"../utils/browser":37,"./InteractableMethods":12}],14:[function(e,t,n){"use strict";var r=e("./base"),i=e("../Interaction");i.signals.on("new",function(e){e.delayTimer=null}),r.signals.on("prepared",function(e){var t=e.interaction,n=t.prepared.name;if(n){var r=t.target.options[n].delay;r>0&&(t.delayTimer=setTimeout(function(){t.start(t.prepared,t.target,t.element)},r))}}),i.signals.on("move",function(e){var t=e.interaction,n=e.duplicate;t.pointerWasMoved&&!n&&clearTimeout(t.delayTimer)}),r.signals.on("before-start",function(e){var t=e.interaction,n=t.prepared.name;if(n){t.target.options[n].delay>0&&(t.prepared.name=null)}})},{"../Interaction":5,"./base":13}],15:[function(e,t,n){"use strict";function r(e,t){if(!t)return!1;var n=t.options.drag.startAxis;return"xy"===e||"xy"===n||n===e}var i=e("./base"),o=e("../scope"),s=e("../utils/browser"),a=e("../utils/is"),l=e("../utils/domUtils"),c=l.matchesSelector,p=l.parentNode;i.setActionDefaults(e("../actions/drag")),i.signals.on("before-start",function(e){var t=e.interaction,n=e.eventTarget,l=e.dx,u=e.dy;if("drag"===t.prepared.name){var d=Math.abs(l),f=Math.abs(u),v=t.target.options.drag,g=v.startAxis,h=d>f?"x":dl.minSpeed&&g>l.endSpeed,b={interaction:t,pageCoords:v,statuses:f,preEnd:!0,requireEndOnly:!0};y&&!x&&(c.resetStatuses(f),m=c.setAll(b),m.shouldMove&&m.locked&&(h=!0)),(x||h)&&(p.copyCoords(i.upCoords,t.curCoords),t.pointers[0]=i.startEvent=new a(t,n,t.prepared.name,"inertiastart",t.element),i.t0=d,i.active=!0,i.allowResume=l.allowResume,t.simulation=i,o.fire(i.startEvent),x?(i.vx0=t.pointerDelta.client.vx,i.vy0=t.pointerDelta.client.vy,i.v0=g,r(t,i),p.extend(v,t.curCoords.page),v.x+=i.xe,v.y+=i.ye,c.resetStatuses(f),m=c.setAll(b),i.modifiedXe+=m.dx,i.modifiedYe+=m.dy,i.i=u.request(t.boundInertiaFrame)):(i.smoothEnd=!0,i.xe=m.dx,i.ye=m.dy,i.sx=i.sy=0,i.i=u.request(t.boundSmoothEndFrame)))}}),l.signals.on("stop-active",function(e){var t=e.interaction,n=t.inertiaStatus;n.active&&(u.cancel(n.i),n.active=!1,t.simulation=null)})},{"./InteractEvent":3,"./Interaction":5,"./modifiers":24,"./utils":44,"./utils/raf":50}],21:[function(e,t,n){"use strict";function r(e,t){var n=a.interactables.get(e,t);return n||(n=new l(e,t),n.events.global=p),n}var i=e("./utils/browser"),o=e("./utils/events"),s=e("./utils"),a=e("./scope"),l=e("./Interactable"),c=e("./Interaction"),p={};r.isSet=function(e,t){return-1!==a.interactables.indexOfElement(e,t&&t.context)},r.on=function(e,t,n){if(s.is.string(e)&&-1!==e.search(" ")&&(e=e.trim().split(/ +/)),s.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.on(f,t,n)}return r}if(s.is.object(e)){for(var v in e)r.on(v,e[v],t);return r}return s.contains(l.eventTypes,e)?p[e]?p[e].push(t):p[e]=[t]:o.add(a.document,e,t,{options:n}),r},r.off=function(e,t,n){if(s.is.string(e)&&-1!==e.search(" ")&&(e=e.trim().split(/ +/)),s.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.off(f,t,n)}return r}if(s.is.object(e)){for(var v in e)r.off(v,e[v],t);return r}if(s.contains(l.eventTypes,e)){var g=void 0;e in p&&-1!==(g=s.indexOf(p[e],t))&&p[e].splice(g,1)}else o.remove(a.document,e,t,n);return r},r.debug=function(){return a},r.getPointerAverage=s.pointerAverage,r.getTouchBBox=s.touchBBox,r.getTouchDistance=s.touchDistance,r.getTouchAngle=s.touchAngle,r.getElementRect=s.getElementRect,r.getElementClientRect=s.getElementClientRect,r.matchesSelector=s.matchesSelector,r.closest=s.closest,r.supportsTouch=function(){return i.supportsTouch},r.supportsPointerEvent=function(){return i.supportsPointerEvent},r.stop=function(e){for(var t=a.interactions.length-1;t>=0;t--)a.interactions[t].stop(e);return r},r.pointerMoveTolerance=function(e){return s.is.number(e)?(c.pointerMoveTolerance=e,this):c.pointerMoveTolerance},r.addDocument=a.addDocument,r.removeDocument=a.removeDocument,a.interact=r,t.exports=r},{"./Interactable":4,"./Interaction":5,"./scope":34,"./utils":44,"./utils/browser":37,"./utils/events":40}],22:[function(e,t,n){"use strict";function r(e){var t=e.interaction,n=e.event;t.target&&t.target.checkAndPreventDefault(n)}var i=e("./Interactable"),o=e("./Interaction"),s=e("./scope"),a=e("./utils/is"),l=e("./utils/events"),c=e("./utils/domUtils"),p=c.nodeContains,u=c.matchesSelector;i.prototype.preventDefault=function(e){return/^(always|never|auto)$/.test(e)?(this.options.preventDefault=e,this):a.bool(e)?(this.options.preventDefault=e?"always":"never",this):this.options.preventDefault},i.prototype.checkAndPreventDefault=function(e){var t=this.options.preventDefault;if("never"!==t)return"always"===t?void e.preventDefault():void(l.supportsOptions||/^(mouse|pointer|touch)*(down|start)/i.test(e.type)||a.element(e.target)&&u(e.target,"input,select,textarea,[contenteditable=true],[contenteditable=true] *")||e.preventDefault())};for(var d=["down","move","up","cancel"],f=0;f=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i;if(o.element&&(o.element===e.target||p(o.element,e.target)))return void o.target.checkAndPreventDefault(e)}}},{"./Interactable":4,"./Interaction":5,"./scope":34,"./utils/domUtils":39,"./utils/events":40,"./utils/is":46}],23:[function(e,t,n){"use strict";function r(e){var t=e.target,n=a.search(e,e.type,t);n&&n.prevTap&&e.clientX===n.prevTap.clientX&&e.clientY===n.prevTap.clientY&&t===n.prevTap.target&&(n.downTargets[0]=t,n.downTimes[0]=(new Date).getTime(),l.fire({interaction:n,event:e,eventTarget:t,pointer:e,type:"tap"}))}var i=e("./scope"),o=e("./utils/events"),s=e("./utils/browser"),a=e("./utils/interactionFinder"),l=e("./pointerEvents/base"),c=e("./utils/window"),p=c.window,u=Object.prototype.toString;if(p.Array.isArray||(p.Array.isArray=function(e){return"[object Array]"===u.call(e)}),String.prototype.trim||(String.prototype.trim=function(){return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")}),s.isIE8){var d=function(e){for(var t=i.interactions,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var o;if(n){if(r>=t.length)break;o=t[r++]}else{if(r=t.next(),r.done)break;o=r.value}var s=o;s.interacting()&&s.target.checkAndPreventDefault(e)}},f=function(e,t){var n=e.doc,i=(e.win,0===t.indexOf("listen")?o.add:o.remove);i(n,"selectstart",d),l&&i(n,"dblclick",r)};i.signals.on("add-document",f),i.signals.on("remove-document",f)}t.exports=null},{"./pointerEvents/base":31,"./scope":34,"./utils/browser":37,"./utils/events":40,"./utils/interactionFinder":45,"./utils/window":52}],24:[function(e,t,n){"use strict";function r(e,t,n){return e&&e.enabled&&(t||!e.endOnly)&&(!n||e.endOnly)}var i=e("../InteractEvent"),o=e("../Interaction"),s=e("../utils/extend"),a={names:[],setOffsets:function(e){var t=e.interaction,n=e.pageCoords,r=t.target,i=t.element,o=t.startOffset,s=r.getRect(i);s?(o.left=n.x-s.left,o.top=n.y-s.top,o.right=s.right-n.x,o.bottom=s.bottom-n.y,"width"in s||(s.width=s.right-s.left),"height"in s||(s.height=s.bottom-s.top)):o.left=o.top=o.right=o.bottom=0,e.rect=s,e.interactable=r,e.element=i;for(var l=0;l=p.length)break;f=p[d++]}else{if(d=p.next(),d.done)break;f=d.value}var v=f,g=a[v],h=t.target.options[t.prepared.name][v];r(h,i,o)&&(e.status=e.status=n[v],e.options=h,e.offset=e.interaction.modifierOffsets[v],g.set(e),e.status.locked&&(l.x+=e.status.dx,l.y+=e.status.dy,c.dx+=e.status.dx,c.dy+=e.status.dy,c.locked=!0))}return c.shouldMove=!e.status||!c.locked||e.status.changed,c},resetStatuses:function(e){for(var t=a.names,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var i;if(n){if(r>=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i,s=e[o]||{};s.dx=s.dy=0,s.modifiedX=s.modifiedY=NaN,s.locked=!1,s.changed=!0,e[o]=s}return e},start:function(e,t){var n=e.interaction,r={interaction:n,pageCoords:("action-resume"===t?n.curCoords:n.startCoords).page,startOffset:n.startOffset,statuses:n.modifierStatuses,preEnd:!1,requireEndOnly:!1};a.setOffsets(r),a.resetStatuses(r.statuses),r.pageCoords=s({},n.startCoords.page),n.modifierResult=a.setAll(r)}};o.signals.on("new",function(e){e.startOffset={left:0,right:0,top:0,bottom:0},e.modifierOffsets={},e.modifierStatuses=a.resetStatuses({}),e.modifierResult=null}),o.signals.on("action-start",a.start),o.signals.on("action-resume",a.start),o.signals.on("before-action-move",function(e){var t=e.interaction,n=e.preEnd,r=e.interactingBeforeMove,i=a.setAll({interaction:t,preEnd:n,pageCoords:t.curCoords.page,statuses:t.modifierStatuses,requireEndOnly:!1});!i.shouldMove&&r&&(t._dontFireMove=!0),t.modifierResult=i}),o.signals.on("action-end",function(e){for(var t=e.interaction,n=e.event,i=0;i=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}var m=h,y=m.x,x=m.y;l.push({x:s.left-i.width*y+u.x,y:s.top-i.height*x+u.y})}else l.push(u);return l},set:function(e){var t=e.interaction,n=e.pageCoords,r=e.status,i=e.options,s=e.offset,a=[],l=void 0,c=void 0,p=void 0;if(r.useStatusXY)c={x:r.x,y:r.y};else{var u=o.getOriginXY(t.target,t.element,t.prepared.name);c=o.extend({},n),c.x-=u.x,c.y-=u.y}r.realX=c.x,r.realY=c.y;for(var d=i.targets?i.targets.length:0,f=s,v=Array.isArray(f),g=0,f=v?f:f[Symbol.iterator]();;){var h;if(v){if(g>=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}for(var m=h,y=m.x,x=m.y,b=c.x-y,w=c.y-x,E=i.targets,S=Array.isArray(E),T=0,E=S?E:E[Symbol.iterator]();;){var C;if(S){if(T>=E.length)break;C=E[T++]}else{if(T=E.next(),T.done)break;C=T.value}var A=C;l=o.is.function(A)?A(b,w,t):A,l&&a.push({x:o.is.number(l.x)?l.x+y:b,y:o.is.number(l.y)?l.y+x:w,range:o.is.number(l.range)?l.range:i.range})}}var D={target:null,inRange:!1,distance:0,range:0,dx:0,dy:0};for(p=0,d=a.length;p=p.length)break;f=p[d++]}else{if(d=p.next(),d.done)break;f=d.value}var v=f,g=void 0;g=a.is.function(v)?v(l,c,t):v,g&&("width"in g&&"height"in g&&(g.x=g.width,g.y=g.height),e.options.targets.push(g))}i.set(e)},modifyCoords:function(e){var t=e.options;e.options=a.extend({},t), -e.options.enabled=t.enabled,e.options.relativePoints=[null],i.modifyCoords(e)}};r.snapSize=l,r.names.push("snapSize"),o.perAction.snapSize=l.defaults,s.defaults.snapSize=l.defaults,t.exports=l},{"../actions/resize":10,"../defaultOptions":18,"../utils/":44,"./index":24,"./snap":28}],30:[function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=e("../utils/pointerUtils");t.exports=function(){function e(t,n,o,s,a){if(r(this,e),i.pointerExtend(this,o),o!==n&&i.pointerExtend(this,n),this.interaction=a,this.timeStamp=(new Date).getTime(),this.originalEvent=o,this.type=t,this.pointerId=i.getPointerId(n),this.pointerType=i.getPointerType(n,a),this.target=s,this.currentTarget=null,"tap"===t){var l=a.getPointerIndex(n);this.dt=this.timeStamp-a.downTimes[l];var c=this.timeStamp-a.tapTime;this.double=!!(a.prevTap&&"doubletap"!==a.prevTap.type&&a.prevTap.target===this.target&&c<500)}else"doubletap"===t&&(this.dt=n.timeStamp-a.tapTime)}return e.prototype.subtractOrigin=function(e){var t=e.x,n=e.y;return this.pageX-=t,this.pageY-=n,this.clientX-=t,this.clientY-=n,this},e.prototype.addOrigin=function(e){var t=e.x,n=e.y;return this.pageX+=t,this.pageY+=n,this.clientX+=t,this.clientY+=n,this},e.prototype.preventDefault=function(){this.originalEvent.preventDefault()},e.prototype.stopPropagation=function(){this.propagationStopped=!0},e.prototype.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},e}()},{"../utils/pointerUtils":49}],31:[function(e,t,n){"use strict";function r(e){for(var t=e.interaction,n=e.pointer,s=e.event,l=e.eventTarget,c=e.type,u=void 0===c?e.pointerEvent.type:c,d=e.targets,f=void 0===d?i(e):d,v=e.pointerEvent,g=void 0===v?new o(u,n,s,l,t):v,h={interaction:t,pointer:n,event:s,eventTarget:l,targets:f,type:u,pointerEvent:g},m=0;m=u.length)break;g=u[v++]}else{if(v=u.next(),v.done)break;g=v.value}var h=g;c.element=h,p.fire("collect-targets",c)}return"hold"===o&&(c.targets=d(c.targets,function(e){return e.eventable.options.holdDuration===t.holdTimers[s].duration})),c.targets}var o=e("./PointerEvent"),s=e("../Interaction"),a=e("../utils"),l=e("../utils/browser"),c=e("../defaultOptions"),p=e("../utils/Signals").new(),u=e("../utils/arr"),d=u.filter,f=["down","up","cancel"],v=["down","up","cancel"],g={PointerEvent:o,fire:r,collectEventTargets:i,signals:p,defaults:{holdDuration:600,ignoreFrom:null,allowFrom:null,origin:{x:0,y:0}},types:["down","move","up","cancel","tap","doubletap","hold"]};s.signals.on("update-pointer-down",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers[n]={duration:1/0,timeout:null}}),s.signals.on("remove-pointer",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers.splice(n,1)}),s.signals.on("move",function(e){var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,s=e.duplicateMove,a=t.getPointerIndex(n);s||t.pointerIsDown&&!t.pointerWasMoved||(t.pointerIsDown&&clearTimeout(t.holdTimers[a].timeout),r({interaction:t,pointer:n,event:i,eventTarget:o,type:"move"}))}),s.signals.on("down",function(e){for(var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,s=e.pointerIndex,c=l.isIE8?a.extend({},i):i,u=t.holdTimers[s],d=a.getPath(o),f={interaction:t,pointer:n,event:i,eventTarget:o,type:"hold",targets:[],path:d,element:null},v=d,g=Array.isArray(v),h=0,v=g?v:v[Symbol.iterator]();;){var m;if(g){if(h>=v.length)break;m=v[h++]}else{if(h=v.next(),h.done)break;m=h.value}var y=m;f.element=y,p.fire("collect-targets",f)}if(f.targets.length){for(var x=1/0,b=0;b=0&&(p.selectors[u]!==e||p.contexts[u]!==t);u--);-1===u&&(u=p.selectors.length,p.selectors.push(e),p.contexts.push(t),p.listeners.push([])),p.listeners[u].push([i,!!s.capture,s.passive])}function s(e,t,n,r,o){var s=f(o),c=O[n],p=!1,u=void 0;if(c)for(u=c.selectors.length-1;u>=0;u--)if(c.selectors[u]===e&&c.contexts[u]===t){for(var d=c.listeners[u],v=d.length-1;v>=0;v--){var g=d[v],h=g[0],m=g[1],y=g[2];if(h===r&&m===!!s.capture&&y===s.passive){d.splice(v,1),d.length||(c.selectors.splice(u,1),c.contexts.splice(u,1),c.listeners.splice(u,1),i(t,n,a),i(t,n,l,!0),c.selectors.length||(O[n]=null)),p=!0;break}}if(p)break}}function a(e,t){var n=f(t),r={},i=O[e.type],o=g.getActualElement(e.path?e.path[0]:e.target),s=o;for(h(r,e),r.originalEvent=e,r.preventDefault=p;v.element(s);){for(var a=0;a=l.length)break;u=l[p++]}else{if(p=l.next(),p.done)break;u=p.value}var d=u,f=s[d](a);if(f)return f}},simulationResume:function(e){var t=e.mouseEvent,n=e.eventType,o=e.eventTarget;if(!/down|start/i.test(n))return null;for(var s=r.interactions,a=Array.isArray(s),l=0,s=a?s:s[Symbol.iterator]();;){var c;if(a){if(l>=s.length)break;c=s[l++]}else{if(l=s.next(),l.done)break;c=l.value}var p=c,u=o;if(p.simulation&&p.simulation.allowResume&&p.mouse===t)for(;u;){if(u===p.element)return p;u=i.parentNode(u)}}return null},mouse:function(e){var t=e.pointerId,n=e.mouseEvent,s=e.eventType;if(!n&&(o.supportsTouch||o.supportsPointerEvent))return null;for(var a=void 0,l=r.interactions,c=Array.isArray(l),p=0,l=c?l:l[Symbol.iterator]();;){var u;if(c){if(p>=l.length)break;u=l[p++]}else{if(p=l.next(),p.done)break;u=p.value}var d=u;if(d.mouse){if(d.simulation&&!i.contains(d.pointerIds,t))continue;if(d.interacting())return d;a||(a=d)}}if(a)return a;for(var f=r.interactions,v=Array.isArray(f),g=0,f=v?f:f[Symbol.iterator]();;){var h;if(v){if(g>=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}var m=h;if(m.mouse&&(!/down/.test(s)||!m.simulation))return m}return null},hasPointer:function(e){for(var t=e.pointerId,n=r.interactions,o=Array.isArray(n),s=0,n=o?n:n[Symbol.iterator]();;){var a;if(o){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var l=a;if(i.contains(l.pointerIds,t))return l}},idle:function(e){for(var t=e.mouseEvent,n=r.interactions,i=Array.isArray(n),o=0,n=i?n:n[Symbol.iterator]();;){var s;if(i){if(o>=n.length)break;s=n[o++]}else{if(o=n.next(),o.done)break;s=o.value}var a=s;if(1===a.pointerIds.length){var l=a.target;if(l&&!l.options.gesture.enabled)continue}else if(a.pointerIds.length>=2)continue;if(!a.interacting()&&t===a.mouse)return a}return null}};t.exports=s},{"../scope":34,"./browser":37,"./index":44}],46:[function(e,t,n){"use strict";var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},i=e("./window"),o=e("./isWindow"),s={array:function(){},window:function(e){return e===i.window||o(e)},docFrag:function(e){return s.object(e)&&11===e.nodeType},object:function(e){return!!e&&"object"===(void 0===e?"undefined":r(e))},function:function(e){return"function"==typeof e},number:function(e){return"number"==typeof e},bool:function(e){return"boolean"==typeof e},string:function(e){return"string"==typeof e},element:function(e){if(!e||"object"!==(void 0===e?"undefined":r(e)))return!1;var t=i.getWindow(e)||i.window;return/object|function/.test(r(t.Element))?e instanceof t.Element:1===e.nodeType&&"string"==typeof e.nodeName}};s.array=function(e){return s.object(e)&&void 0!==e.length&&s.function(e.splice)},t.exports=s},{"./isWindow":47,"./window":52}],47:[function(e,t,n){"use strict";t.exports=function(e){return!(!e||!e.Window)&&e instanceof e.Window}},{}],48:[function(e,t,n){"use strict";function r(e,n){for(var r in n){var i=t.exports.prefixedPropREs,o=!1;for(var s in i)if(0===r.indexOf(s)&&i[s].test(r)){o=!0;break}o||"function"==typeof n[r]||(e[r]=n[r])}return e}r.prefixedPropREs={webkit:/(Movement[XY]|Radius[XY]|RotationAngle|Force)$/},t.exports=r},{}],49:[function(e,t,n){"use strict";var r=e("./hypot"),i=e("./browser"),o=e("./domObjects"),s=e("./domUtils"),a=e("./is"),l=e("./pointerExtend"),c={copyCoords:function(e,t){e.page=e.page||{},e.page.x=t.page.x,e.page.y=t.page.y,e.client=e.client||{},e.client.x=t.client.x,e.client.y=t.client.y,e.timeStamp=t.timeStamp},setCoordDeltas:function(e,t,n){e.page.x=n.page.x-t.page.x,e.page.y=n.page.y-t.page.y,e.client.x=n.client.x-t.client.x,e.client.y=n.client.y-t.client.y,e.timeStamp=n.timeStamp-t.timeStamp;var i=Math.max(e.timeStamp/1e3,.001);e.page.speed=r(e.page.x,e.page.y)/i,e.page.vx=e.page.x/i,e.page.vy=e.page.y/i,e.client.speed=r(e.client.x,e.page.y)/i,e.client.vx=e.client.x/i,e.client.vy=e.client.y/i},isNativePointer:function(e){return e instanceof o.Event||e instanceof o.Touch},getXY:function(e,t,n){return n=n||{},e=e||"page",n.x=t[e+"X"],n.y=t[e+"Y"],n},getPageXY:function(e,t){return t=t||{},i.isOperaMobile&&c.isNativePointer(e)?(c.getXY("screen",e,t),t.x+=window.scrollX,t.y+=window.scrollY):c.getXY("page",e,t),t},getClientXY:function(e,t){return t=t||{},i.isOperaMobile&&c.isNativePointer(e)?c.getXY("screen",e,t):c.getXY("client",e,t),t},getPointerId:function(e){return a.number(e.pointerId)?e.pointerId:e.identifier},setCoords:function(e,t,n){var r=t.length>1?c.pointerAverage(t):t[0],i={};c.getPageXY(r,i),e.page.x=i.x,e.page.y=i.y,c.getClientXY(r,i),e.client.x=i.x,e.client.y=i.y,e.timeStamp=a.number(n)?n:(new Date).getTime()},pointerExtend:l,getTouchPair:function(e){var t=[];return a.array(e)?(t[0]=e[0],t[1]=e[1]):"touchend"===e.type?1===e.touches.length?(t[0]=e.touches[0],t[1]=e.changedTouches[0]):0===e.touches.length&&(t[0]=e.changedTouches[0],t[1]=e.changedTouches[1]):(t[0]=e.touches[0],t[1]=e.touches[1]),t},pointerAverage:function(e){for(var t={pageX:0,pageY:0,clientX:0,clientY:0,screenX:0,screenY:0},n=e,r=Array.isArray(n),i=0,n=r?n:n[Symbol.iterator]();;){var o;if(r){if(i>=n.length)break;o=n[i++]}else{if(i=n.next(),i.done)break;o=i.value}var s=o;for(var a in t)t[a]+=s[a]}for(var l in t)t[l]/=e.length;return t},touchBBox:function(e){if(e.length||e.touches&&e.touches.length>1){var t=c.getTouchPair(e),n=Math.min(t[0].pageX,t[1].pageX),r=Math.min(t[0].pageY,t[1].pageY);return{x:n,y:r,left:n,top:r,width:Math.max(t[0].pageX,t[1].pageX)-n,height:Math.max(t[0].pageY,t[1].pageY)-r}}},touchDistance:function(e,t){var n=t+"X",i=t+"Y",o=c.getTouchPair(e),s=o[0][n]-o[1][n],a=o[0][i]-o[1][i];return r(s,a)},touchAngle:function(e,t,n){var r=n+"X",i=n+"Y",o=c.getTouchPair(e),s=o[1][r]-o[0][r],a=o[1][i]-o[0][i];return 180*Math.atan2(a,s)/Math.PI},getPointerType:function(e,t){return t.mouse?"mouse":i.supportsPointerEvent?a.string(e.pointerType)?e.pointerType:[void 0,void 0,"touch","pen","mouse"][e.pointerType]:"touch"},getEventTargets:function(e){return[s.getActualElement(e.path?e.path[0]:e.target),s.getActualElement(e.currentTarget)]}};t.exports=c},{"./browser":37,"./domObjects":38,"./domUtils":39,"./hypot":43,"./is":46,"./pointerExtend":48}],50:[function(e,t,n){"use strict";for(var r=e("./window"),i=r.window,o=["ms","moz","webkit","o"],s=0,a=void 0,l=void 0,c=0;c6&&void 0!==arguments[6]&&arguments[6];r(this,e);var f=t.target,v=(f&&f.options||s).deltaSource,g=o(f,p,l),h="start"===c,m="end"===c,y=h?t.startCoords:t.curCoords,x=t.prevEvent;p=p||t.element;var b=i({},y.page),w=i({},y.client);b.x-=g.x,b.y-=g.y,w.x-=g.x,w.y-=g.y,this.ctrlKey=n.ctrlKey,this.altKey=n.altKey,this.shiftKey=n.shiftKey,this.metaKey=n.metaKey,this.button=n.button,this.buttons=n.buttons,this.target=p,this.currentTarget=p,this.relatedTarget=u||null,this.preEnd=d,this.type=l+(c||""),this.interaction=t,this.interactable=f,this.t0=h?t.downTimes[t.downTimes.length-1]:x.t0;var E={interaction:t,event:n,action:l,phase:c,element:p,related:u,page:b,client:w,coords:y,starting:h,ending:m,deltaSource:v,iEvent:this};a.fire("set-xy",E),m?(this.pageX=x.pageX,this.pageY=x.pageY,this.clientX=x.clientX,this.clientY=x.clientY):(this.pageX=b.x,this.pageY=b.y,this.clientX=w.x,this.clientY=w.y),this.x0=t.startCoords.page.x-g.x,this.y0=t.startCoords.page.y-g.y,this.clientX0=t.startCoords.client.x-g.x,this.clientY0=t.startCoords.client.y-g.y,a.fire("set-delta",E),this.timeStamp=y.timeStamp,this.dt=t.pointerDelta.timeStamp,this.duration=this.timeStamp-this.t0,this.speed=t.pointerDelta[v].speed,this.velocityX=t.pointerDelta[v].vx,this.velocityY=t.pointerDelta[v].vy,this.swipe=m||"inertiastart"===c?this.getSwipe():null,a.fire("new",E)}return e.prototype.getSwipe=function(){var e=this.interaction;if(e.prevEvent.speed<600||this.timeStamp-e.prevEvent.timeStamp>150)return null;var t=180*Math.atan2(e.prevEvent.velocityY,e.prevEvent.velocityX)/Math.PI;t<0&&(t+=360);var n=112.5<=t&&t<247.5,r=202.5<=t&&t<337.5,i=!n&&(292.5<=t||t<67.5);return{up:r,down:!r&&22.5<=t&&t<157.5,left:n,right:i,angle:t,speed:e.prevEvent.speed,velocity:{x:e.prevEvent.velocityX,y:e.prevEvent.velocityY}}},e.prototype.preventDefault=function(){},e.prototype.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},e.prototype.stopPropagation=function(){this.propagationStopped=!0},e}();a.on("set-delta",function(e){var t=e.iEvent,n=e.interaction,r=e.starting,i=e.deltaSource,o=r?t:n.prevEvent;"client"===i?(t.dx=t.clientX-o.clientX,t.dy=t.clientY-o.clientY):(t.dx=t.pageX-o.pageX,t.dy=t.pageY-o.pageY)}),l.signals=a,t.exports=l},{"./defaultOptions":18,"./utils/Signals":35,"./utils/extend":41,"./utils/getOriginXY":42}],4:[function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=e("./utils/is"),o=e("./utils/events"),s=e("./utils/extend"),a=e("./actions/base"),l=e("./scope"),c=e("./Eventable"),p=e("./defaultOptions"),u=e("./utils/Signals").new(),d=e("./utils/domUtils"),f=d.getElementRect,v=d.nodeContains,g=d.trySelector,h=e("./utils/window"),m=h.getWindow,y=e("./utils/arr"),x=y.indexOf,b=y.contains,w=e("./utils/browser"),E=w.wheelEvent;l.interactables=[];var S=function(){function e(t,n){r(this,e),n=n||{},this.target=t,this.events=new c,this._context=n.context||l.document,this._win=m(g(t)?this._context:t),this._doc=this._win.document,u.fire("new",{target:t,options:n,interactable:this,win:this._win}),l.addDocument(this._doc,this._win),l.interactables.push(this),this.set(n)}return e.prototype.setOnEvents=function(e,t){var n="on"+e;return i.function(t.onstart)&&(this.events[n+"start"]=t.onstart),i.function(t.onmove)&&(this.events[n+"move"]=t.onmove),i.function(t.onend)&&(this.events[n+"end"]=t.onend),i.function(t.oninertiastart)&&(this.events[n+"inertiastart"]=t.oninertiastart),this},e.prototype.setPerAction=function(e,t){for(var n in t)n in p[e]&&(i.object(t[n])?(this.options[e][n]=s(this.options[e][n]||{},t[n]),i.object(p.perAction[n])&&"enabled"in p.perAction[n]&&(this.options[e][n].enabled=!1!==t[n].enabled)):i.bool(t[n])&&i.object(p.perAction[n])?this.options[e][n].enabled=t[n]:void 0!==t[n]&&(this.options[e][n]=t[n]))},e.prototype.getRect=function(e){return e=e||this.target,i.string(this.target)&&!i.element(e)&&(e=this._context.querySelector(this.target)),f(e)},e.prototype.rectChecker=function(e){return i.function(e)?(this.getRect=e,this):null===e?(delete this.options.getRect,this):this.getRect},e.prototype._backCompatOption=function(e,t){if(g(t)||i.object(t)){this.options[e]=t;for(var n=a.names,r=Array.isArray(n),o=0,n=r?n:n[Symbol.iterator]();;){var s;if(r){if(o>=n.length)break;s=n[o++]}else{if(o=n.next(),o.done)break;s=o.value}var l=s;this.options[l][e]=t}return this}return this.options[e]},e.prototype.origin=function(e){return this._backCompatOption("origin",e)},e.prototype.deltaSource=function(e){return"page"===e||"client"===e?(this.options.deltaSource=e,this):this.options.deltaSource},e.prototype.context=function(){return this._context},e.prototype.inContext=function(e){return this._context===e.ownerDocument||v(this._context,e)},e.prototype.fire=function(e){return this.events.fire(e),this},e.prototype._onOffMultiple=function(e,t,n,r){if(i.string(t)&&-1!==t.search(" ")&&(t=t.trim().split(/ +/)),i.array(t)){for(var o=0;o=l.length)break;f=l[d++]}else{if(d=l.next(),d.done)break;f=d.value}var v=f;this.options[v]=p.base[v],v in t&&this[v](t[v])}return u.fire("set",{options:t,interactable:this}),this},e.prototype.unset=function(){if(o.remove(this.target,"all"),i.string(this.target))for(var e in o.delegatedEvents){var t=o.delegatedEvents[e];t.selectors[0]===this.target&&t.contexts[0]===this._context&&(t.selectors.splice(0,1),t.contexts.splice(0,1),t.listeners.splice(0,1),t.selectors.length||(t[e]=null)),o.remove(this._context,e,o.delegateListener),o.remove(this._context,e,o.delegateUseCapture,!0)}else o.remove(this,"all");u.fire("unset",{interactable:this}),l.interactables.splice(x(l.interactables,this),1);for(var n=l.interactions||[],r=Array.isArray(n),s=0,n=r?n:n[Symbol.iterator]();;){var a;if(r){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var c=a;c.target===this&&c.interacting()&&c.stop()}return l.interact},e}();l.interactables.indexOfElement=function(e,t){t=t||l.document;for(var n=0;n=x.length)break;E=x[w++]}else{if(w=x.next(),w.done)break;E=w.value}var S=E,T=S[0],C=S[1];C._updateEventTargets(i,o),C[e](T,t,i,o)}}}function o(e){for(var t=0;te.pointerMoveTolerance);var a={pointer:t,pointerIndex:this.getPointerIndex(t),event:n,eventTarget:r,dx:o,dy:s,duplicate:i,interaction:this,interactingBeforeMove:this.interacting()};i||l.setCoordDeltas(this.pointerDelta,this.prevCoords,this.curCoords),f.fire("move",a),i||(this.interacting()&&this.doMove(a),this.pointerWasMoved&&l.copyCoords(this.prevCoords,this.curCoords))},e.prototype.doMove=function(e){e=l.extend({pointer:this.pointers[0],event:this.prevEvent,eventTarget:this._eventTarget,interaction:this},e||{}),f.fire("before-action-move",e),this._dontFireMove||f.fire("action-move",e),this._dontFireMove=!1},e.prototype.pointerUp=function(e,t,n,r){var i=this.getPointerIndex(e);f.fire(/cancel$/i.test(t.type)?"cancel":"up",{pointer:e,pointerIndex:i,event:t,eventTarget:n,curEventTarget:r,interaction:this}),this.simulation||this.end(t),this.pointerIsDown=!1,this.removePointer(e,t)},e.prototype.end=function(e){e=e||this.prevEvent,this.interacting()&&f.fire("action-end",{event:e,interaction:this}),this.stop()},e.prototype.currentAction=function(){return this._interacting?this.prepared.name:null},e.prototype.interacting=function(){return this._interacting},e.prototype.stop=function(){f.fire("stop",{interaction:this}),this._interacting&&(f.fire("stop-active",{interaction:this}),f.fire("stop-"+this.prepared.name,{interaction:this})),this.target=this.element=null,this._interacting=!1,this.prepared.name=this.prevEvent=null},e.prototype.getPointerIndex=function(e){return"mouse"===this.pointerType||"pen"===this.pointerType?0:l.indexOf(this.pointerIds,l.getPointerId(e))},e.prototype.updatePointer=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:t&&/(down|start)$/i.test(t.type),r=l.getPointerId(e),i=this.getPointerIndex(e);return-1===i&&(i=this.pointerIds.length,this.pointerIds[i]=r),n&&f.fire("update-pointer-down",{pointer:e,event:t,down:n,pointerId:r,pointerIndex:i,interaction:this}),this.pointers[i]=e,i},e.prototype.removePointer=function(e,t){var n=this.getPointerIndex(e);-1!==n&&(f.fire("remove-pointer",{pointer:e,event:t,pointerIndex:n,interaction:this}),this.pointers.splice(n,1),this.pointerIds.splice(n,1),this.downTargets.splice(n,1),this.downTimes.splice(n,1))},e.prototype._updateEventTargets=function(e,t){this._eventTarget=e,this._curEventTarget=t},e}(),y=0,x=g.length;y=i.length)break;a=i[s++]}else{if(s=i.next(),s.done)break;a=s.value}var l=a;if(l.options.drop.enabled){var c=l.options.drop.accept;if(!(p.is.element(c)&&c!==t||p.is.string(c)&&!p.matchesSelector(t,c)))for(var d=p.is.string(l.target)?l._context.querySelectorAll(l.target):[l.target],f=0;fo.left&&c.xo.top&&c.y=o.left&&v<=o.right&&g>=o.top&&g<=o.bottom}if(f&&p.is.number(a)){s=Math.max(0,Math.min(o.right,f.right)-Math.max(o.left,f.left))*Math.max(0,Math.min(o.bottom,f.bottom)-Math.max(o.top,f.top))/(f.width*f.height)>=a}return this.options.drop.checker&&(s=this.options.drop.checker(e,t,s,this,i,n,r)),s},v.signals.on("unset",function(e){e.interactable.dropzone(!1)}),v.settingsMethods.push("dropChecker"),g.signals.on("new",function(e){e.dropTarget=null,e.dropElement=null,e.prevDropTarget=null,e.prevDropElement=null,e.dropEvents=null,e.activeDrops={dropzones:[],elements:[],rects:[]}}),g.signals.on("stop",function(e){var t=e.interaction;t.dropTarget=t.dropElement=t.prevDropTarget=t.prevDropElement=null}),d.dynamicDrop=function(e){return p.is.bool(e)?(y=e,d):y},p.merge(v.eventTypes,["dragenter","dragleave","dropactivate","dropdeactivate","dropmove","drop"]),c.methodDict.drop="dropzone",h.drop=m.defaults,t.exports=m},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../interact":21,"../scope":34,"../utils":44,"./base":6}],9:[function(e,t,n){"use strict";var r=e("./base"),i=e("../utils"),o=e("../InteractEvent"),s=e("../Interactable"),a=e("../Interaction"),l=e("../defaultOptions"),c={defaults:{enabled:!1,origin:null,restrict:null},checker:function(e,t,n,r,i){return i.pointerIds.length>=2?{name:"gesture"}:null},getCursor:function(){return""}};o.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;"gesturestart"===t.type&&(t.ds=0,n.gesture.startDistance=n.gesture.prevDistance=t.distance,n.gesture.startAngle=n.gesture.prevAngle=t.angle,n.gesture.scale=1)}),o.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;"gesturemove"===t.type&&(t.ds=t.scale-n.gesture.scale,n.target.fire(t),n.gesture.prevAngle=t.angle,n.gesture.prevDistance=t.distance,t.scale===1/0||null===t.scale||void 0===t.scale||isNaN(t.scale)||(n.gesture.scale=t.scale))}),s.prototype.gesturable=function(e){return i.is.object(e)?(this.options.gesture.enabled=!1!==e.enabled,this.setPerAction("gesture",e),this.setOnEvents("gesture",e),this):i.is.bool(e)?(this.options.gesture.enabled=e,e||(this.ongesturestart=this.ongesturestart=this.ongestureend=null),this):this.options.gesture},o.signals.on("set-delta",function(e){var t=e.interaction,n=e.iEvent,r=e.action,s=e.event,a=e.starting,l=e.ending,c=e.deltaSource;if("gesture"===r){var p=t.pointers;n.touches=[p[0],p[1]],a?(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=1,n.ds=0,n.angle=i.touchAngle(p,void 0,c),n.da=0):l||s instanceof o?(n.distance=t.prevEvent.distance,n.box=t.prevEvent.box,n.scale=t.prevEvent.scale,n.ds=n.scale-1,n.angle=t.prevEvent.angle,n.da=n.angle-t.gesture.startAngle):(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=n.distance/t.gesture.startDistance,n.angle=i.touchAngle(p,t.gesture.prevAngle,c),n.ds=n.scale-t.gesture.prevScale,n.da=n.angle-t.gesture.prevAngle)}}),a.signals.on("new",function(e){e.gesture={start:{x:0,y:0},startDistance:0,prevDistance:0,distance:0,scale:1,startAngle:0,prevAngle:0}}),r.gesture=c,r.names.push("gesture"),i.merge(s.eventTypes,["gesturestart","gesturemove","gestureend"]),r.methodDict.gesture="gesturable",l.gesture=c.defaults,t.exports=c},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"./base":6}],10:[function(e,t,n){"use strict";function r(e,t,n,r,i,s,a){if(!t)return!1;if(!0===t){var l=o.is.number(s.width)?s.width:s.right-s.left,c=o.is.number(s.height)?s.height:s.bottom-s.top;if(l<0&&("left"===e?e="right":"right"===e&&(e="left")),c<0&&("top"===e?e="bottom":"bottom"===e&&(e="top")),"left"===e)return n.x<(l>=0?s.left:s.right)+a;if("top"===e)return n.y<(c>=0?s.top:s.bottom)+a;if("right"===e)return n.x>(l>=0?s.right:s.left)-a;if("bottom"===e)return n.y>(c>=0?s.bottom:s.top)-a}return!!o.is.element(r)&&(o.is.element(t)?t===r:o.matchesUpTo(r,t,i))}var i=e("./base"),o=e("../utils"),s=e("../utils/browser"),a=e("../InteractEvent"),l=e("../Interactable"),c=e("../Interaction"),p=e("../defaultOptions"),u=s.supportsTouch||s.supportsPointerEvent?20:10,d={defaults:{enabled:!1,mouseButtons:null,origin:null,snap:null,restrict:null,inertia:null,autoScroll:null,square:!1,preserveAspectRatio:!1,axis:"xy",margin:NaN,edges:null,invert:"none"},checker:function(e,t,n,i,s,a){if(!a)return null;var l=o.extend({},s.curCoords.page),c=n.options;if(c.resize.enabled){var p=c.resize,d={left:!1,right:!1,top:!1,bottom:!1};if(o.is.object(p.edges)){for(var f in d)d[f]=r(f,p.edges[f],l,s._eventTarget,i,a,p.margin||u);if(d.left=d.left&&!d.right,d.top=d.top&&!d.bottom,d.left||d.right||d.top||d.bottom)return{name:"resize",edges:d}}else{var v="y"!==c.resize.axis&&l.x>a.right-u,g="x"!==c.resize.axis&&l.y>a.bottom-u;if(v||g)return{name:"resize",axes:(v?"x":"")+(g?"y":"")}}}return null},cursors:s.isIe9OrOlder?{x:"e-resize",y:"s-resize",xy:"se-resize",top:"n-resize",left:"w-resize",bottom:"s-resize",right:"e-resize",topleft:"se-resize",bottomright:"se-resize",topright:"ne-resize",bottomleft:"ne-resize"}:{x:"ew-resize",y:"ns-resize",xy:"nwse-resize",top:"ns-resize",left:"ew-resize",bottom:"ns-resize",right:"ew-resize",topleft:"nwse-resize",bottomright:"nwse-resize",topright:"nesw-resize",bottomleft:"nesw-resize"},getCursor:function(e){if(e.axis)return d.cursors[e.name+e.axis];if(e.edges){for(var t="",n=["top","bottom","left","right"],r=0;r<4;r++)e.edges[n[r]]&&(t+=n[r]);return d.cursors[t]}}};a.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;if("resizestart"===t.type&&n.prepared.edges){var r=n.target.getRect(n.element),i=n.target.options.resize;if(i.square||i.preserveAspectRatio){var s=o.extend({},n.prepared.edges);s.top=s.top||s.left&&!s.bottom,s.left=s.left||s.top&&!s.right,s.bottom=s.bottom||s.right&&!s.top,s.right=s.right||s.bottom&&!s.left,n.prepared._linkedEdges=s}else n.prepared._linkedEdges=null;i.preserveAspectRatio&&(n.resizeStartAspectRatio=r.width/r.height),n.resizeRects={start:r,current:o.extend({},r),inverted:o.extend({},r),previous:o.extend({},r),delta:{left:0,right:0,width:0,top:0,bottom:0,height:0}},t.rect=n.resizeRects.inverted,t.deltaRect=n.resizeRects.delta}}),a.signals.on("new",function(e){var t=e.iEvent,n=e.phase,r=e.interaction;if("move"===n&&r.prepared.edges){var i=r.target.options.resize,s=i.invert,a="reposition"===s||"negate"===s,l=r.prepared.edges,c=r.resizeRects.start,p=r.resizeRects.current,u=r.resizeRects.inverted,d=r.resizeRects.delta,f=o.extend(r.resizeRects.previous,u),v=l,g=t.dx,h=t.dy;if(i.preserveAspectRatio||i.square){var m=i.preserveAspectRatio?r.resizeStartAspectRatio:1;l=r.prepared._linkedEdges,v.left&&v.bottom||v.right&&v.top?h=-g/m:v.left||v.right?h=g/m:(v.top||v.bottom)&&(g=h*m)}if(l.top&&(p.top+=h),l.bottom&&(p.bottom+=h),l.left&&(p.left+=g),l.right&&(p.right+=g),a){if(o.extend(u,p),"reposition"===s){var y=void 0;u.top>u.bottom&&(y=u.top,u.top=u.bottom,u.bottom=y),u.left>u.right&&(y=u.left,u.left=u.right,u.right=y)}}else u.top=Math.min(p.top,c.bottom),u.bottom=Math.max(p.bottom,c.top),u.left=Math.min(p.left,c.right),u.right=Math.max(p.right,c.left);u.width=u.right-u.left,u.height=u.bottom-u.top;for(var x in u)d[x]=u[x]-f[x];t.edges=r.prepared.edges,t.rect=u,t.deltaRect=d}}),l.prototype.resizable=function(e){return o.is.object(e)?(this.options.resize.enabled=!1!==e.enabled,this.setPerAction("resize",e),this.setOnEvents("resize",e),/^x$|^y$|^xy$/.test(e.axis)?this.options.resize.axis=e.axis:null===e.axis&&(this.options.resize.axis=p.resize.axis),o.is.bool(e.preserveAspectRatio)?this.options.resize.preserveAspectRatio=e.preserveAspectRatio:o.is.bool(e.square)&&(this.options.resize.square=e.square),this):o.is.bool(e)?(this.options.resize.enabled=e, +e||(this.onresizestart=this.onresizestart=this.onresizeend=null),this):this.options.resize},c.signals.on("new",function(e){e.resizeAxes="xy"}),a.signals.on("set-delta",function(e){var t=e.interaction,n=e.iEvent;"resize"===e.action&&t.resizeAxes&&(t.target.options.resize.square?("y"===t.resizeAxes?n.dx=n.dy:n.dy=n.dx,n.axes="xy"):(n.axes=t.resizeAxes,"x"===t.resizeAxes?n.dy=0:"y"===t.resizeAxes&&(n.dx=0)))}),i.resize=d,i.names.push("resize"),o.merge(l.eventTypes,["resizestart","resizemove","resizeinertiastart","resizeinertiaresume","resizeend"]),i.methodDict.resize="resizable",p.resize=d.defaults,t.exports=d},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"../utils/browser":37,"./base":6}],11:[function(e,t,n){"use strict";var r=e("./utils/raf"),i=e("./utils/window").getWindow,o=e("./utils/is"),s=e("./utils/domUtils"),a=e("./Interaction"),l=e("./defaultOptions"),c={defaults:{enabled:!1,container:null,margin:60,speed:300},interaction:null,i:null,x:0,y:0,isScrolling:!1,prevTime:0,start:function(e){c.isScrolling=!0,r.cancel(c.i),c.interaction=e,c.prevTime=(new Date).getTime(),c.i=r.request(c.scroll)},stop:function(){c.isScrolling=!1,r.cancel(c.i)},scroll:function(){var e=c.interaction.target.options[c.interaction.prepared.name].autoScroll,t=e.container||i(c.interaction.element),n=(new Date).getTime(),s=(n-c.prevTime)/1e3,a=e.speed*s;a>=1&&(o.window(t)?t.scrollBy(c.x*a,c.y*a):t&&(t.scrollLeft+=c.x*a,t.scrollTop+=c.y*a),c.prevTime=n),c.isScrolling&&(r.cancel(c.i),c.i=r.request(c.scroll))},check:function(e,t){var n=e.options;return n[t].autoScroll&&n[t].autoScroll.enabled},onInteractionMove:function(e){var t=e.interaction,n=e.pointer;if(t.interacting()&&c.check(t.target,t.prepared.name)){if(t.simulation)return void(c.x=c.y=0);var r=void 0,a=void 0,l=void 0,p=void 0,u=t.target.options[t.prepared.name].autoScroll,d=u.container||i(t.element);if(o.window(d))p=n.clientXd.innerWidth-c.margin,l=n.clientY>d.innerHeight-c.margin;else{var f=s.getElementClientRect(d);p=n.clientXf.right-c.margin,l=n.clientY>f.bottom-c.margin}c.x=a?1:p?-1:0,c.y=l?1:r?-1:0,c.isScrolling||(c.margin=u.margin,c.speed=u.speed,c.start(t))}}};a.signals.on("stop-active",function(){c.stop()}),a.signals.on("action-move",c.onInteractionMove),l.perAction.autoScroll=c.defaults,t.exports=c},{"./Interaction":5,"./defaultOptions":18,"./utils/domUtils":39,"./utils/is":46,"./utils/raf":50,"./utils/window":52}],12:[function(e,t,n){"use strict";var r=e("../Interactable"),i=e("../actions/base"),o=e("../utils/is"),s=e("../utils/domUtils");r.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},r.prototype.ignoreFrom=function(e){return this._backCompatOption("ignoreFrom",e)},r.prototype.allowFrom=function(e){return this._backCompatOption("allowFrom",e)},r.prototype.testIgnore=function(e,t,n){return!(!e||!o.element(n))&&(o.string(e)?s.matchesUpTo(n,e,t):!!o.element(e)&&s.nodeContains(e,n))},r.prototype.testAllow=function(e,t,n){return!e||!!o.element(n)&&(o.string(e)?s.matchesUpTo(n,e,t):!!o.element(e)&&s.nodeContains(e,n))},r.prototype.testIgnoreAllow=function(e,t,n){return!this.testIgnore(e.ignoreFrom,t,n)&&this.testAllow(e.allowFrom,t,n)},r.prototype.actionChecker=function(e){return o.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},r.prototype.styleCursor=function(e){return o.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},r.prototype.defaultActionChecker=function(e,t,n,r){for(var o=this.getRect(r),s=null,a=i.names,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var u=p;if((!n.pointerIsDown||!n.mouse||0!=(t.buttons&this.options[u].mouseButtons))&&(s=i[u].checker(e,t,this,r,n,o)))return s}}},{"../Interactable":4,"../actions/base":6,"../utils/domUtils":39,"../utils/is":46}],13:[function(e,t,n){"use strict";function r(e,t,n,r){return g.is.object(e)&&t.testIgnoreAllow(t.options[e.name],n,r)&&t.options[e.name].enabled&&a(t,n,e)?e:null}function i(e,t,n,i,o,s){for(var a=0,l=i.length;a=m.maxInteractions)return!1;if(u.target===e){if((a+=d===n.name|0)>=i)return!1;if(u.element===t&&(l++,d!==n.name||l>=o))return!1}}}return m.maxInteractions>0}}var l=e("../interact"),c=e("../Interactable"),p=e("../Interaction"),u=e("../actions/base"),d=e("../defaultOptions"),f=e("../utils/browser"),v=e("../scope"),g=e("../utils"),h=e("../utils/Signals").new();e("./InteractableMethods");var m={signals:h,withinInteractionLimit:a,maxInteractions:1/0,defaults:{perAction:{manualStart:!1,max:1/0,maxPerElement:1,allowFrom:null,ignoreFrom:null}},setActionDefaults:function(e){g.extend(e.defaults,m.defaults.perAction)}};p.signals.on("down",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;if(!t.interacting()){s(t,o(t,n,r,i))}}),p.signals.on("move",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;if(t.mouse&&!t.pointerIsDown&&!t.interacting()){s(t,o(t,n,r,i))}}),p.signals.on("move",function(e){var t=e.interaction,n=e.event;if(t.pointerIsDown&&!t.interacting()&&t.pointerWasMoved&&t.prepared.name){h.fire("before-start",e);var r=t.target;t.prepared.name&&r&&(r.options[t.prepared.name].manualStart||!a(r,t.element,t.prepared)?t.stop(n):t.start(t.prepared,r,t.element))}}),p.signals.on("stop",function(e){var t=e.interaction,n=t.target;n&&n.options.styleCursor&&(n._doc.documentElement.style.cursor="")}),c.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},c.prototype.actionChecker=function(e){return g.is.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},c.prototype.styleCursor=function(e){return g.is.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},c.prototype.defaultActionChecker=function(e,t,n,r){for(var i=this.getRect(r),o=t.buttons||{0:1,1:4,3:8,4:16}[t.button],s=null,a=u.names,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var d=p;if((!n.pointerIsDown||!n.mouse||0!=(o&this.options[d].mouseButtons))&&(s=u[d].checker(e,t,this,r,n,i)))return s}},l.maxInteractions=function(e){return g.is.number(e)?(m.maxInteractions=e,this):m.maxInteractions},c.settingsMethods.push("styleCursor"),c.settingsMethods.push("actionChecker"),c.settingsMethods.push("ignoreFrom"),c.settingsMethods.push("allowFrom"),d.base.actionChecker=null,d.base.styleCursor=!0,g.extend(d.perAction,m.defaults.perAction),t.exports=m},{"../Interactable":4,"../Interaction":5,"../actions/base":6,"../defaultOptions":18,"../interact":21,"../scope":34,"../utils":44,"../utils/Signals":35,"../utils/browser":37,"./InteractableMethods":12}],14:[function(e,t,n){"use strict";var r=e("./base"),i=e("../Interaction");i.signals.on("new",function(e){e.delayTimer=null}),r.signals.on("prepared",function(e){var t=e.interaction,n=t.prepared.name;if(n){var r=t.target.options[n].delay;r>0&&(t.delayTimer=setTimeout(function(){t.start(t.prepared,t.target,t.element)},r))}}),i.signals.on("move",function(e){var t=e.interaction,n=e.duplicate;t.pointerWasMoved&&!n&&clearTimeout(t.delayTimer)}),r.signals.on("before-start",function(e){var t=e.interaction,n=t.prepared.name;if(n){t.target.options[n].delay>0&&(t.prepared.name=null)}})},{"../Interaction":5,"./base":13}],15:[function(e,t,n){"use strict";function r(e,t){if(!t)return!1;var n=t.options.drag.startAxis;return"xy"===e||"xy"===n||n===e}var i=e("./base"),o=e("../scope"),s=e("../utils/browser"),a=e("../utils/is"),l=e("../utils/domUtils"),c=l.matchesSelector,p=l.parentNode;i.setActionDefaults(e("../actions/drag")),i.signals.on("before-start",function(e){var t=e.interaction,n=e.eventTarget,l=e.dx,u=e.dy;if("drag"===t.prepared.name){var d=Math.abs(l),f=Math.abs(u),v=t.target.options.drag,g=v.startAxis,h=d>f?"x":dl.minSpeed&&g>l.endSpeed,b={interaction:t,pageCoords:v,statuses:f,preEnd:!0,requireEndOnly:!0};y&&!x&&(c.resetStatuses(f),m=c.setAll(b),m.shouldMove&&m.locked&&(h=!0)),(x||h)&&(p.copyCoords(i.upCoords,t.curCoords),t.pointers[0]=i.startEvent=new a(t,n,t.prepared.name,"inertiastart",t.element),i.t0=d,i.active=!0,i.allowResume=l.allowResume,t.simulation=i,o.fire(i.startEvent),x?(i.vx0=t.pointerDelta.client.vx,i.vy0=t.pointerDelta.client.vy,i.v0=g,r(t,i),p.extend(v,t.curCoords.page),v.x+=i.xe,v.y+=i.ye,c.resetStatuses(f),m=c.setAll(b),i.modifiedXe+=m.dx,i.modifiedYe+=m.dy,i.i=u.request(t.boundInertiaFrame)):(i.smoothEnd=!0,i.xe=m.dx,i.ye=m.dy,i.sx=i.sy=0,i.i=u.request(t.boundSmoothEndFrame)))}}),l.signals.on("stop-active",function(e){var t=e.interaction,n=t.inertiaStatus;n.active&&(u.cancel(n.i),n.active=!1,t.simulation=null)})},{"./InteractEvent":3,"./Interaction":5,"./modifiers":24,"./utils":44,"./utils/raf":50}],21:[function(e,t,n){"use strict";function r(e,t){var n=a.interactables.get(e,t);return n||(n=new l(e,t),n.events.global=p),n}var i=e("./utils/browser"),o=e("./utils/events"),s=e("./utils"),a=e("./scope"),l=e("./Interactable"),c=e("./Interaction"),p={};r.isSet=function(e,t){return-1!==a.interactables.indexOfElement(e,t&&t.context)},r.on=function(e,t,n){if(s.is.string(e)&&-1!==e.search(" ")&&(e=e.trim().split(/ +/)),s.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.on(f,t,n)}return r}if(s.is.object(e)){for(var v in e)r.on(v,e[v],t);return r}return s.contains(l.eventTypes,e)?p[e]?p[e].push(t):p[e]=[t]:o.add(a.document,e,t,{options:n}),r},r.off=function(e,t,n){if(s.is.string(e)&&-1!==e.search(" ")&&(e=e.trim().split(/ +/)),s.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.off(f,t,n)}return r}if(s.is.object(e)){for(var v in e)r.off(v,e[v],t);return r}if(s.contains(l.eventTypes,e)){var g=void 0;e in p&&-1!==(g=s.indexOf(p[e],t))&&p[e].splice(g,1)}else o.remove(a.document,e,t,n);return r},r.debug=function(){return a},r.getPointerAverage=s.pointerAverage,r.getTouchBBox=s.touchBBox,r.getTouchDistance=s.touchDistance,r.getTouchAngle=s.touchAngle,r.getElementRect=s.getElementRect,r.getElementClientRect=s.getElementClientRect,r.matchesSelector=s.matchesSelector,r.closest=s.closest,r.supportsTouch=function(){return i.supportsTouch},r.supportsPointerEvent=function(){return i.supportsPointerEvent},r.stop=function(e){for(var t=a.interactions.length-1;t>=0;t--)a.interactions[t].stop(e);return r},r.pointerMoveTolerance=function(e){return s.is.number(e)?(c.pointerMoveTolerance=e,this):c.pointerMoveTolerance},r.addDocument=a.addDocument,r.removeDocument=a.removeDocument,a.interact=r,t.exports=r},{"./Interactable":4,"./Interaction":5,"./scope":34,"./utils":44,"./utils/browser":37,"./utils/events":40}],22:[function(e,t,n){"use strict";function r(e){var t=e.interaction,n=e.event;t.target&&t.target.checkAndPreventDefault(n)}var i=e("./Interactable"),o=e("./Interaction"),s=e("./scope"),a=e("./utils/is"),l=e("./utils/events"),c=e("./utils/domUtils"),p=c.nodeContains,u=c.matchesSelector;i.prototype.preventDefault=function(e){return/^(always|never|auto)$/.test(e)?(this.options.preventDefault=e,this):a.bool(e)?(this.options.preventDefault=e?"always":"never",this):this.options.preventDefault},i.prototype.checkAndPreventDefault=function(e){var t=this.options.preventDefault;if("never"!==t)return"always"===t?void e.preventDefault():void(l.supportsOptions||/^(mouse|pointer|touch)*(down|start)/i.test(e.type)||a.element(e.target)&&u(e.target,"input,select,textarea,[contenteditable=true],[contenteditable=true] *")||e.preventDefault())};for(var d=["down","move","up","cancel"],f=0;f=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i;if(o.element&&(o.element===e.target||p(o.element,e.target)))return void o.target.checkAndPreventDefault(e)}}},{"./Interactable":4,"./Interaction":5,"./scope":34,"./utils/domUtils":39,"./utils/events":40,"./utils/is":46}],23:[function(e,t,n){"use strict";function r(e){var t=e.target,n=a.search(e,e.type,t);n&&n.prevTap&&e.clientX===n.prevTap.clientX&&e.clientY===n.prevTap.clientY&&t===n.prevTap.target&&(n.downTargets[0]=t,n.downTimes[0]=(new Date).getTime(),l.fire({interaction:n,event:e,eventTarget:t,pointer:e,type:"tap"}))}var i=e("./scope"),o=e("./utils/events"),s=e("./utils/browser"),a=e("./utils/interactionFinder"),l=e("./pointerEvents/base"),c=e("./utils/window"),p=c.window,u=Object.prototype.toString;if(p.Array.isArray||(p.Array.isArray=function(e){return"[object Array]"===u.call(e)}),String.prototype.trim||(String.prototype.trim=function(){return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")}),s.isIE8){var d=function(e){for(var t=i.interactions,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var o;if(n){if(r>=t.length)break;o=t[r++]}else{if(r=t.next(),r.done)break;o=r.value}var s=o;s.interacting()&&s.target.checkAndPreventDefault(e)}},f=function(e,t){var n=e.doc,i=(e.win,0===t.indexOf("listen")?o.add:o.remove);i(n,"selectstart",d),l&&i(n,"dblclick",r)};i.signals.on("add-document",f),i.signals.on("remove-document",f)}t.exports=null},{"./pointerEvents/base":31,"./scope":34,"./utils/browser":37,"./utils/events":40,"./utils/interactionFinder":45,"./utils/window":52}],24:[function(e,t,n){"use strict";function r(e,t,n){return e&&e.enabled&&(t||!e.endOnly)&&(!n||e.endOnly)}var i=e("../InteractEvent"),o=e("../Interaction"),s=e("../utils/extend"),a={names:[],setOffsets:function(e){var t=e.interaction,n=e.pageCoords,r=t.target,i=t.element,o=t.startOffset,s=r.getRect(i);s?(o.left=n.x-s.left,o.top=n.y-s.top,o.right=s.right-n.x,o.bottom=s.bottom-n.y,"width"in s||(s.width=s.right-s.left),"height"in s||(s.height=s.bottom-s.top)):o.left=o.top=o.right=o.bottom=0,e.rect=s,e.interactable=r,e.element=i;for(var l=0;l=p.length)break;f=p[d++]}else{if(d=p.next(),d.done)break;f=d.value}var v=f,g=a[v],h=t.target.options[t.prepared.name][v];r(h,i,o)&&(e.status=e.status=n[v],e.options=h,e.offset=e.interaction.modifierOffsets[v],g.set(e),e.status.locked&&(l.x+=e.status.dx,l.y+=e.status.dy,c.dx+=e.status.dx,c.dy+=e.status.dy,c.locked=!0))}return c.shouldMove=!e.status||!c.locked||e.status.changed,c},resetStatuses:function(e){for(var t=a.names,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var i;if(n){if(r>=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i,s=e[o]||{};s.dx=s.dy=0,s.modifiedX=s.modifiedY=NaN,s.locked=!1,s.changed=!0,e[o]=s}return e},start:function(e,t){var n=e.interaction,r={interaction:n,pageCoords:("action-resume"===t?n.curCoords:n.startCoords).page,startOffset:n.startOffset,statuses:n.modifierStatuses,preEnd:!1,requireEndOnly:!1};a.setOffsets(r),a.resetStatuses(r.statuses),r.pageCoords=s({},n.startCoords.page),n.modifierResult=a.setAll(r)}};o.signals.on("new",function(e){e.startOffset={left:0,right:0,top:0,bottom:0},e.modifierOffsets={},e.modifierStatuses=a.resetStatuses({}),e.modifierResult=null}),o.signals.on("action-start",a.start),o.signals.on("action-resume",a.start),o.signals.on("before-action-move",function(e){var t=e.interaction,n=e.preEnd,r=e.interactingBeforeMove,i=a.setAll({interaction:t,preEnd:n,pageCoords:t.curCoords.page,statuses:t.modifierStatuses,requireEndOnly:!1});!i.shouldMove&&r&&(t._dontFireMove=!0),t.modifierResult=i}),o.signals.on("action-end",function(e){for(var t=e.interaction,n=e.event,i=0;i=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}var m=h,y=m.x,x=m.y;l.push({x:s.left-i.width*y+u.x,y:s.top-i.height*x+u.y})}else l.push(u);return l},set:function(e){var t=e.interaction,n=e.pageCoords,r=e.status,i=e.options,s=e.offset,a=[],l=void 0,c=void 0,p=void 0;if(r.useStatusXY)c={x:r.x,y:r.y};else{var u=o.getOriginXY(t.target,t.element,t.prepared.name);c=o.extend({},n),c.x-=u.x,c.y-=u.y}r.realX=c.x,r.realY=c.y;for(var d=i.targets?i.targets.length:0,f=s,v=Array.isArray(f),g=0,f=v?f:f[Symbol.iterator]();;){var h;if(v){if(g>=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}for(var m=h,y=m.x,x=m.y,b=c.x-y,w=c.y-x,E=i.targets,S=Array.isArray(E),T=0,E=S?E:E[Symbol.iterator]();;){var C;if(S){if(T>=E.length)break;C=E[T++]}else{if(T=E.next(),T.done)break;C=T.value}var A=C;l=o.is.function(A)?A(b,w,t):A,l&&a.push({x:o.is.number(l.x)?l.x+y:b,y:o.is.number(l.y)?l.y+x:w,range:o.is.number(l.range)?l.range:i.range})}}var D={target:null,inRange:!1,distance:0,range:0,dx:0,dy:0};for(p=0,d=a.length;p=p.length)break;f=p[d++]}else{if(d=p.next(),d.done)break;f=d.value}var v=f,g=void 0;g=a.is.function(v)?v(l,c,t):v,g&&("width"in g&&"height"in g&&(g.x=g.width, +g.y=g.height),e.options.targets.push(g))}i.set(e)},modifyCoords:function(e){var t=e.options;e.options=a.extend({},t),e.options.enabled=t.enabled,e.options.relativePoints=[null],i.modifyCoords(e)}};r.snapSize=l,r.names.push("snapSize"),o.perAction.snapSize=l.defaults,s.defaults.snapSize=l.defaults,t.exports=l},{"../actions/resize":10,"../defaultOptions":18,"../utils/":44,"./index":24,"./snap":28}],30:[function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=e("../utils/pointerUtils");t.exports=function(){function e(t,n,o,s,a){if(r(this,e),i.pointerExtend(this,o),o!==n&&i.pointerExtend(this,n),this.interaction=a,this.timeStamp=(new Date).getTime(),this.originalEvent=o,this.type=t,this.pointerId=i.getPointerId(n),this.pointerType=i.getPointerType(n),this.target=s,this.currentTarget=null,"tap"===t){var l=a.getPointerIndex(n);this.dt=this.timeStamp-a.downTimes[l];var c=this.timeStamp-a.tapTime;this.double=!!(a.prevTap&&"doubletap"!==a.prevTap.type&&a.prevTap.target===this.target&&c<500)}else"doubletap"===t&&(this.dt=n.timeStamp-a.tapTime)}return e.prototype.subtractOrigin=function(e){var t=e.x,n=e.y;return this.pageX-=t,this.pageY-=n,this.clientX-=t,this.clientY-=n,this},e.prototype.addOrigin=function(e){var t=e.x,n=e.y;return this.pageX+=t,this.pageY+=n,this.clientX+=t,this.clientY+=n,this},e.prototype.preventDefault=function(){this.originalEvent.preventDefault()},e.prototype.stopPropagation=function(){this.propagationStopped=!0},e.prototype.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},e}()},{"../utils/pointerUtils":49}],31:[function(e,t,n){"use strict";function r(e){for(var t=e.interaction,n=e.pointer,s=e.event,l=e.eventTarget,c=e.type,u=void 0===c?e.pointerEvent.type:c,d=e.targets,f=void 0===d?i(e):d,v=e.pointerEvent,g=void 0===v?new o(u,n,s,l,t):v,h={interaction:t,pointer:n,event:s,eventTarget:l,targets:f,type:u,pointerEvent:g},m=0;m=u.length)break;g=u[v++]}else{if(v=u.next(),v.done)break;g=v.value}var h=g;c.element=h,p.fire("collect-targets",c)}return"hold"===o&&(c.targets=d(c.targets,function(e){return e.eventable.options.holdDuration===t.holdTimers[s].duration})),c.targets}var o=e("./PointerEvent"),s=e("../Interaction"),a=e("../utils"),l=e("../utils/browser"),c=e("../defaultOptions"),p=e("../utils/Signals").new(),u=e("../utils/arr"),d=u.filter,f=["down","up","cancel"],v=["down","up","cancel"],g={PointerEvent:o,fire:r,collectEventTargets:i,signals:p,defaults:{holdDuration:600,ignoreFrom:null,allowFrom:null,origin:{x:0,y:0}},types:["down","move","up","cancel","tap","doubletap","hold"]};s.signals.on("update-pointer-down",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers[n]={duration:1/0,timeout:null}}),s.signals.on("remove-pointer",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers.splice(n,1)}),s.signals.on("move",function(e){var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,s=e.duplicateMove,a=t.getPointerIndex(n);s||t.pointerIsDown&&!t.pointerWasMoved||(t.pointerIsDown&&clearTimeout(t.holdTimers[a].timeout),r({interaction:t,pointer:n,event:i,eventTarget:o,type:"move"}))}),s.signals.on("down",function(e){for(var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,s=e.pointerIndex,c=l.isIE8?a.extend({},i):i,u=t.holdTimers[s],d=a.getPath(o),f={interaction:t,pointer:n,event:i,eventTarget:o,type:"hold",targets:[],path:d,element:null},v=d,g=Array.isArray(v),h=0,v=g?v:v[Symbol.iterator]();;){var m;if(g){if(h>=v.length)break;m=v[h++]}else{if(h=v.next(),h.done)break;m=h.value}var y=m;f.element=y,p.fire("collect-targets",f)}if(f.targets.length){for(var x=1/0,b=0;b=0&&(p.selectors[u]!==e||p.contexts[u]!==t);u--);-1===u&&(u=p.selectors.length,p.selectors.push(e),p.contexts.push(t),p.listeners.push([])),p.listeners[u].push([i,!!s.capture,s.passive])}function s(e,t,n,r,o){var s=f(o),c=O[n],p=!1,u=void 0;if(c)for(u=c.selectors.length-1;u>=0;u--)if(c.selectors[u]===e&&c.contexts[u]===t){for(var d=c.listeners[u],v=d.length-1;v>=0;v--){var g=d[v],h=g[0],m=g[1],y=g[2];if(h===r&&m===!!s.capture&&y===s.passive){d.splice(v,1),d.length||(c.selectors.splice(u,1),c.contexts.splice(u,1),c.listeners.splice(u,1),i(t,n,a),i(t,n,l,!0),c.selectors.length||(O[n]=null)),p=!0;break}}if(p)break}}function a(e,t){var n=f(t),r={},i=O[e.type],o=g.getActualElement(e.path?e.path[0]:e.target),s=o;for(h(r,e),r.originalEvent=e,r.preventDefault=p;v.element(s);){for(var a=0;a=l.length)break;u=l[p++]}else{if(p=l.next(),p.done)break;u=p.value}var d=u,f=o[d](a);if(f)return f}},simulationResume:function(e){var t=e.pointerType,n=e.eventType,o=e.eventTarget;if(!/down|start/i.test(n))return null;for(var s=r.interactions,a=Array.isArray(s),l=0,s=a?s:s[Symbol.iterator]();;){var c;if(a){if(l>=s.length)break;c=s[l++]}else{if(l=s.next(),l.done)break;c=l.value}var p=c,u=o;if(p.simulation&&p.simulation.allowResume&&p.pointerType===t)for(;u;){if(u===p.element)return p;u=i.parentNode(u)}}return null},mouseOrPen:function(e){var t=e.pointerId,n=e.pointerType,o=e.eventType;if("mouse"!==n&&"pen"!==n)return null;for(var s=void 0,a=r.interactions,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var u=p;if(u.pointerType===n){if(u.simulation&&!i.contains(u.pointerIds,t))continue;if(u.interacting())return u;s||(s=u)}}if(s)return s;for(var d=r.interactions,f=Array.isArray(d),v=0,d=f?d:d[Symbol.iterator]();;){var g;if(f){if(v>=d.length)break;g=d[v++]}else{if(v=d.next(),v.done)break;g=v.value}var h=g;if(!(h.pointerType!==n||/down/i.test(o)&&h.simulation))return h}return null},hasPointer:function(e){for(var t=e.pointerId,n=r.interactions,o=Array.isArray(n),s=0,n=o?n:n[Symbol.iterator]();;){var a;if(o){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var l=a;if(i.contains(l.pointerIds,t))return l}},idle:function(e){for(var t=e.pointerType,n=r.interactions,i=Array.isArray(n),o=0,n=i?n:n[Symbol.iterator]();;){var s;if(i){if(o>=n.length)break;s=n[o++]}else{if(o=n.next(),o.done)break;s=o.value}var a=s;if(1===a.pointerIds.length){var l=a.target;if(l&&!l.options.gesture.enabled)continue}else if(a.pointerIds.length>=2)continue;if(!a.interacting()&&t===a.pointerType)return a}return null}};t.exports=o},{"../scope":34,"./index":44}],46:[function(e,t,n){"use strict";var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},i=e("./window"),o=e("./isWindow"),s={array:function(){},window:function(e){return e===i.window||o(e)},docFrag:function(e){return s.object(e)&&11===e.nodeType},object:function(e){return!!e&&"object"===(void 0===e?"undefined":r(e))},function:function(e){return"function"==typeof e},number:function(e){return"number"==typeof e},bool:function(e){return"boolean"==typeof e},string:function(e){return"string"==typeof e},element:function(e){if(!e||"object"!==(void 0===e?"undefined":r(e)))return!1;var t=i.getWindow(e)||i.window;return/object|function/.test(r(t.Element))?e instanceof t.Element:1===e.nodeType&&"string"==typeof e.nodeName}};s.array=function(e){return s.object(e)&&void 0!==e.length&&s.function(e.splice)},t.exports=s},{"./isWindow":47,"./window":52}],47:[function(e,t,n){"use strict";t.exports=function(e){return!(!e||!e.Window)&&e instanceof e.Window}},{}],48:[function(e,t,n){"use strict";function r(e,n){for(var r in n){var i=t.exports.prefixedPropREs,o=!1;for(var s in i)if(0===r.indexOf(s)&&i[s].test(r)){o=!0;break}o||"function"==typeof n[r]||(e[r]=n[r])}return e}r.prefixedPropREs={webkit:/(Movement[XY]|Radius[XY]|RotationAngle|Force)$/},t.exports=r},{}],49:[function(e,t,n){"use strict";var r=e("./hypot"),i=e("./browser"),o=e("./domObjects"),s=e("./domUtils"),a=e("./domObjects"),l=e("./is"),c=e("./pointerExtend"),p={copyCoords:function(e,t){e.page=e.page||{},e.page.x=t.page.x,e.page.y=t.page.y,e.client=e.client||{},e.client.x=t.client.x,e.client.y=t.client.y,e.timeStamp=t.timeStamp},setCoordDeltas:function(e,t,n){e.page.x=n.page.x-t.page.x,e.page.y=n.page.y-t.page.y,e.client.x=n.client.x-t.client.x,e.client.y=n.client.y-t.client.y,e.timeStamp=n.timeStamp-t.timeStamp;var i=Math.max(e.timeStamp/1e3,.001);e.page.speed=r(e.page.x,e.page.y)/i,e.page.vx=e.page.x/i,e.page.vy=e.page.y/i,e.client.speed=r(e.client.x,e.page.y)/i,e.client.vx=e.client.x/i,e.client.vy=e.client.y/i},isNativePointer:function(e){return e instanceof o.Event||e instanceof o.Touch},getXY:function(e,t,n){return n=n||{},e=e||"page",n.x=t[e+"X"],n.y=t[e+"Y"],n},getPageXY:function(e,t){return t=t||{},i.isOperaMobile&&p.isNativePointer(e)?(p.getXY("screen",e,t),t.x+=window.scrollX,t.y+=window.scrollY):p.getXY("page",e,t),t},getClientXY:function(e,t){return t=t||{},i.isOperaMobile&&p.isNativePointer(e)?p.getXY("screen",e,t):p.getXY("client",e,t),t},getPointerId:function(e){return l.number(e.pointerId)?e.pointerId:e.identifier},setCoords:function(e,t,n){var r=t.length>1?p.pointerAverage(t):t[0],i={};p.getPageXY(r,i),e.page.x=i.x,e.page.y=i.y,p.getClientXY(r,i),e.client.x=i.x,e.client.y=i.y,e.timeStamp=l.number(n)?n:(new Date).getTime()},pointerExtend:c,getTouchPair:function(e){var t=[];return l.array(e)?(t[0]=e[0],t[1]=e[1]):"touchend"===e.type?1===e.touches.length?(t[0]=e.touches[0],t[1]=e.changedTouches[0]):0===e.touches.length&&(t[0]=e.changedTouches[0],t[1]=e.changedTouches[1]):(t[0]=e.touches[0],t[1]=e.touches[1]),t},pointerAverage:function(e){for(var t={pageX:0,pageY:0,clientX:0,clientY:0,screenX:0,screenY:0},n=e,r=Array.isArray(n),i=0,n=r?n:n[Symbol.iterator]();;){var o;if(r){if(i>=n.length)break;o=n[i++]}else{if(i=n.next(),i.done)break;o=i.value}var s=o;for(var a in t)t[a]+=s[a]}for(var l in t)t[l]/=e.length;return t},touchBBox:function(e){if(e.length||e.touches&&e.touches.length>1){var t=p.getTouchPair(e),n=Math.min(t[0].pageX,t[1].pageX),r=Math.min(t[0].pageY,t[1].pageY);return{x:n,y:r,left:n,top:r,width:Math.max(t[0].pageX,t[1].pageX)-n,height:Math.max(t[0].pageY,t[1].pageY)-r}}},touchDistance:function(e,t){var n=t+"X",i=t+"Y",o=p.getTouchPair(e),s=o[0][n]-o[1][n],a=o[0][i]-o[1][i];return r(s,a)},touchAngle:function(e,t,n){var r=n+"X",i=n+"Y",o=p.getTouchPair(e),s=o[1][r]-o[0][r],a=o[1][i]-o[0][i];return 180*Math.atan2(a,s)/Math.PI},getPointerType:function(e){return l.string(e.pointerType)?e.pointerType:l.number(e.pointerType)?[void 0,void 0,"touch","pen","mouse"][e.pointerType]:/touch/.test(e.type)||e instanceof a.Touch?"touch":"mouse"},getEventTargets:function(e){return[s.getActualElement(e.path?e.path[0]:e.target),s.getActualElement(e.currentTarget)]}};t.exports=p},{"./browser":37,"./domObjects":38,"./domUtils":39,"./hypot":43,"./is":46,"./pointerExtend":48}],50:[function(e,t,n){"use strict";for(var r=e("./window"),i=r.window,o=["ms","moz","webkit","o"],s=0,a=void 0,l=void 0,c=0;c\n * Open source under the MIT License.\n * https://raw.github.com/taye/interact.js/master/LICENSE\n */\n","/*\n * In a (windowless) server environment this file exports a factory function\n * that takes the window to use.\n *\n * var interact = require('interact.js')(windowObject);\n *\n * See https://github.com/taye/interact.js/issues/187\n */\nif (typeof window === 'undefined') {\n module.exports = function (window) {\n require('./src/utils/window').init(window);\n\n return require('./src/index');\n };\n}\nelse {\n module.exports = require('./src/index');\n}\n","const { indexOf } = require('./utils/arr');\nconst extend = require('./utils/extend.js');\n\nfunction fireUntilImmediateStopped (event, listeners) {\n for (let i = 0, len = listeners.length; i < len && !event.immediatePropagationStopped; i++) {\n listeners[i](event);\n }\n}\n\nclass Eventable {\n\n constructor (options) {\n this.options = extend({}, options || {});\n }\n\n fire (event) {\n let listeners;\n const onEvent = 'on' + event.type;\n const global = this.global;\n\n // Interactable#on() listeners\n if ((listeners = this[event.type])) {\n fireUntilImmediateStopped(event, listeners);\n }\n\n // interactable.onevent listener\n if (this[onEvent]) {\n this[onEvent](event);\n }\n\n // interact.on() listeners\n if (!event.propagationStopped && global && (listeners = global[event.type])) {\n fireUntilImmediateStopped(event, listeners);\n }\n }\n\n on (eventType, listener) {\n // if this type of event was never bound\n if (this[eventType]) {\n this[eventType].push(listener);\n }\n else {\n this[eventType] = [listener];\n }\n }\n\n off (eventType, listener) {\n // if it is an action event type\n const eventList = this[eventType];\n const index = eventList? indexOf(eventList, listener) : -1;\n\n if (index !== -1) {\n eventList.splice(index, 1);\n }\n\n if (eventList && eventList.length === 0 || !listener) {\n this[eventType] = listener;\n }\n }\n}\n\nmodule.exports = Eventable;\n","const extend = require('./utils/extend');\nconst getOriginXY = require('./utils/getOriginXY');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nclass InteractEvent {\n constructor (interaction, event, action, phase, element, related, preEnd = false) {\n const target = interaction.target;\n const deltaSource = (target && target.options || defaults).deltaSource;\n const origin = getOriginXY(target, element, action);\n const starting = phase === 'start';\n const ending = phase === 'end';\n const coords = starting? interaction.startCoords : interaction.curCoords;\n const prevEvent = interaction.prevEvent;\n\n element = element || interaction.element;\n\n const page = extend({}, coords.page);\n const client = extend({}, coords.client);\n\n page.x -= origin.x;\n page.y -= origin.y;\n\n client.x -= origin.x;\n client.y -= origin.y;\n\n this.ctrlKey = event.ctrlKey;\n this.altKey = event.altKey;\n this.shiftKey = event.shiftKey;\n this.metaKey = event.metaKey;\n this.button = event.button;\n this.buttons = event.buttons;\n this.target = element;\n this.currentTarget = element;\n this.relatedTarget = related || null;\n this.preEnd = preEnd;\n this.type = action + (phase || '');\n this.interaction = interaction;\n this.interactable = target;\n\n this.t0 = starting ? interaction.downTimes[interaction.downTimes.length - 1]\n : prevEvent.t0;\n\n const signalArg = {\n interaction,\n event,\n action,\n phase,\n element,\n related,\n page,\n client,\n coords,\n starting,\n ending,\n deltaSource,\n iEvent: this,\n };\n\n signals.fire('set-xy', signalArg);\n\n if (ending) {\n // use previous coords when ending\n this.pageX = prevEvent.pageX;\n this.pageY = prevEvent.pageY;\n this.clientX = prevEvent.clientX;\n this.clientY = prevEvent.clientY;\n }\n else {\n this.pageX = page.x;\n this.pageY = page.y;\n this.clientX = client.x;\n this.clientY = client.y;\n }\n\n this.x0 = interaction.startCoords.page.x - origin.x;\n this.y0 = interaction.startCoords.page.y - origin.y;\n this.clientX0 = interaction.startCoords.client.x - origin.x;\n this.clientY0 = interaction.startCoords.client.y - origin.y;\n\n signals.fire('set-delta', signalArg);\n\n this.timeStamp = coords.timeStamp;\n this.dt = interaction.pointerDelta.timeStamp;\n this.duration = this.timeStamp - this.t0;\n\n // speed and velocity in pixels per second\n this.speed = interaction.pointerDelta[deltaSource].speed;\n this.velocityX = interaction.pointerDelta[deltaSource].vx;\n this.velocityY = interaction.pointerDelta[deltaSource].vy;\n\n this.swipe = (ending || phase === 'inertiastart')? this.getSwipe() : null;\n\n signals.fire('new', signalArg);\n }\n\n getSwipe () {\n const interaction = this.interaction;\n\n if (interaction.prevEvent.speed < 600\n || this.timeStamp - interaction.prevEvent.timeStamp > 150) {\n return null;\n }\n\n let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI;\n const overlap = 22.5;\n\n if (angle < 0) {\n angle += 360;\n }\n\n const left = 135 - overlap <= angle && angle < 225 + overlap;\n const up = 225 - overlap <= angle && angle < 315 + overlap;\n\n const right = !left && (315 - overlap <= angle || angle < 45 + overlap);\n const down = !up && 45 - overlap <= angle && angle < 135 + overlap;\n\n return {\n up,\n down,\n left,\n right,\n angle,\n speed: interaction.prevEvent.speed,\n velocity: {\n x: interaction.prevEvent.velocityX,\n y: interaction.prevEvent.velocityY,\n },\n };\n }\n\n preventDefault () {}\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n}\n\nsignals.on('set-delta', function ({ iEvent, interaction, starting, deltaSource }) {\n const prevEvent = starting? iEvent : interaction.prevEvent;\n\n if (deltaSource === 'client') {\n iEvent.dx = iEvent.clientX - prevEvent.clientX;\n iEvent.dy = iEvent.clientY - prevEvent.clientY;\n }\n else {\n iEvent.dx = iEvent.pageX - prevEvent.pageX;\n iEvent.dy = iEvent.pageY - prevEvent.pageY;\n }\n});\n\nInteractEvent.signals = signals;\n\nmodule.exports = InteractEvent;\n","const is = require('./utils/is');\nconst events = require('./utils/events');\nconst extend = require('./utils/extend');\nconst actions = require('./actions/base');\nconst scope = require('./scope');\nconst Eventable = require('./Eventable');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nconst {\n getElementRect,\n nodeContains,\n trySelector,\n} = require('./utils/domUtils');\nconst { getWindow } = require('./utils/window');\nconst { indexOf, contains } = require('./utils/arr');\nconst { wheelEvent } = require('./utils/browser');\n\n// all set interactables\nscope.interactables = [];\n\n/*\\\n * Interactable\n [ property ]\n **\n * Object type returned by @interact\n\\*/\nclass Interactable {\n constructor (target, options) {\n options = options || {};\n\n this.target = target;\n this.events = new Eventable();\n this._context = options.context || scope.document;\n this._win = getWindow(trySelector(target)? this._context : target);\n this._doc = this._win.document;\n\n signals.fire('new', {\n target,\n options,\n interactable: this,\n win: this._win,\n });\n\n scope.addDocument( this._doc, this._win );\n\n scope.interactables.push(this);\n\n this.set(options);\n }\n\n setOnEvents (action, phases) {\n const onAction = 'on' + action;\n\n if (is.function(phases.onstart) ) { this.events[onAction + 'start' ] = phases.onstart ; }\n if (is.function(phases.onmove) ) { this.events[onAction + 'move' ] = phases.onmove ; }\n if (is.function(phases.onend) ) { this.events[onAction + 'end' ] = phases.onend ; }\n if (is.function(phases.oninertiastart)) { this.events[onAction + 'inertiastart' ] = phases.oninertiastart ; }\n\n return this;\n }\n\n setPerAction (action, options) {\n // for all the default per-action options\n for (const option in options) {\n // if this option exists for this action\n if (option in defaults[action]) {\n // if the option in the options arg is an object value\n if (is.object(options[option])) {\n // duplicate the object\n this.options[action][option] = extend(this.options[action][option] || {}, options[option]);\n\n if (is.object(defaults.perAction[option]) && 'enabled' in defaults.perAction[option]) {\n this.options[action][option].enabled = options[option].enabled === false? false : true;\n }\n }\n else if (is.bool(options[option]) && is.object(defaults.perAction[option])) {\n this.options[action][option].enabled = options[option];\n }\n else if (options[option] !== undefined) {\n // or if it's not undefined, do a plain assignment\n this.options[action][option] = options[option];\n }\n }\n }\n }\n\n /*\\\n * Interactable.getRect\n [ method ]\n *\n * The default function to get an Interactables bounding rect. Can be\n * overridden using @Interactable.rectChecker.\n *\n - element (Element) #optional The element to measure.\n = (object) The object's bounding rectangle.\n o {\n o top : 0,\n o left : 0,\n o bottom: 0,\n o right : 0,\n o width : 0,\n o height: 0\n o }\n \\*/\n getRect (element) {\n element = element || this.target;\n\n if (is.string(this.target) && !(is.element(element))) {\n element = this._context.querySelector(this.target);\n }\n\n return getElementRect(element);\n }\n\n /*\\\n * Interactable.rectChecker\n [ method ]\n *\n * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n - checker (function) #optional A function which returns this Interactable's bounding rectangle. See @Interactable.getRect\n = (function | object) The checker function or this Interactable\n \\*/\n rectChecker (checker) {\n if (is.function(checker)) {\n this.getRect = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.getRect;\n\n return this;\n }\n\n return this.getRect;\n }\n\n _backCompatOption (optionName, newValue) {\n if (trySelector(newValue) || is.object(newValue)) {\n this.options[optionName] = newValue;\n\n for (const action of actions.names) {\n this.options[action][optionName] = newValue;\n }\n\n return this;\n }\n\n return this.options[optionName];\n }\n\n /*\\\n * Interactable.origin\n [ method ]\n *\n * Gets or sets the origin of the Interactable's element. The x and y\n * of the origin will be subtracted from action event coordinates.\n *\n - origin (object | string) #optional An object eg. { x: 0, y: 0 } or string 'parent', 'self' or any CSS selector\n * OR\n - origin (Element) #optional An HTML or SVG Element whose rect will be used\n **\n = (object) The current origin or this Interactable\n \\*/\n origin (newValue) {\n return this._backCompatOption('origin', newValue);\n }\n\n /*\\\n * Interactable.deltaSource\n [ method ]\n *\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n - newValue (string) #optional Use 'client' if you will be scrolling while interacting; Use 'page' if you want autoScroll to work\n = (string | object) The current deltaSource or this Interactable\n \\*/\n deltaSource (newValue) {\n if (newValue === 'page' || newValue === 'client') {\n this.options.deltaSource = newValue;\n\n return this;\n }\n\n return this.options.deltaSource;\n }\n\n /*\\\n * Interactable.context\n [ method ]\n *\n * Gets the selector context Node of the Interactable. The default is `window.document`.\n *\n = (Node) The context Node of this Interactable\n **\n \\*/\n context () {\n return this._context;\n }\n\n inContext (element) {\n return (this._context === element.ownerDocument\n || nodeContains(this._context, element));\n }\n\n /*\\\n * Interactable.fire\n [ method ]\n *\n * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n - iEvent (InteractEvent) The InteractEvent object to be fired on this Interactable\n = (Interactable) this Interactable\n \\*/\n fire (iEvent) {\n this.events.fire(iEvent);\n\n return this;\n }\n\n _onOffMultiple (method, eventType, listener, options) {\n if (is.string(eventType) && eventType.search(' ') !== -1) {\n eventType = eventType.trim().split(/ +/);\n }\n\n if (is.array(eventType)) {\n for (let i = 0; i < eventType.length; i++) {\n this[method](eventType[i], listener, options);\n }\n\n return true;\n }\n\n if (is.object(eventType)) {\n for (const prop in eventType) {\n this[method](prop, eventType[prop], listener);\n }\n\n return true;\n }\n }\n\n /*\\\n * Interactable.on\n [ method ]\n *\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n - eventType (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) This Interactable\n \\*/\n on (eventType, listener, options) {\n if (this._onOffMultiple('on', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.on(eventType, listener);\n }\n // delegated event for selector\n else if (is.string(this.target)) {\n events.addDelegate(this.target, this._context, eventType, listener, options);\n }\n else {\n events.add(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.off\n [ method ]\n *\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n - eventType (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) This Interactable\n \\*/\n off (eventType, listener, options) {\n if (this._onOffMultiple('off', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n // if it is an action event type\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.off(eventType, listener);\n }\n // delegated event\n else if (is.string(this.target)) {\n events.removeDelegate(this.target, this._context, eventType, listener, options);\n }\n // remove listener from this Interatable's element\n else {\n events.remove(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.set\n [ method ]\n *\n * Reset the options of this Interactable\n - options (object) The new settings to apply\n = (object) This Interactable\n \\*/\n set (options) {\n if (!is.object(options)) {\n options = {};\n }\n\n this.options = extend({}, defaults.base);\n\n const perActions = extend({}, defaults.perAction);\n\n for (const actionName in actions.methodDict) {\n const methodName = actions.methodDict[actionName];\n\n this.options[actionName] = extend({}, defaults[actionName]);\n\n this.setPerAction(actionName, perActions);\n\n this[methodName](options[actionName]);\n }\n\n for (const setting of Interactable.settingsMethods) {\n this.options[setting] = defaults.base[setting];\n\n if (setting in options) {\n this[setting](options[setting]);\n }\n }\n\n signals.fire('set', {\n options,\n interactable: this,\n });\n\n return this;\n }\n\n /*\\\n * Interactable.unset\n [ method ]\n *\n * Remove this interactable from the list of interactables and remove\n * it's action capabilities and event listeners\n *\n = (object) @interact\n \\*/\n unset () {\n events.remove(this.target, 'all');\n\n if (is.string(this.target)) {\n // remove delegated events\n for (const type in events.delegatedEvents) {\n const delegated = events.delegatedEvents[type];\n\n if (delegated.selectors[0] === this.target\n && delegated.contexts[0] === this._context) {\n\n delegated.selectors.splice(0, 1);\n delegated.contexts .splice(0, 1);\n delegated.listeners.splice(0, 1);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegated[type] = null;\n }\n }\n\n events.remove(this._context, type, events.delegateListener);\n events.remove(this._context, type, events.delegateUseCapture, true);\n }\n }\n else {\n events.remove(this, 'all');\n }\n\n signals.fire('unset', { interactable: this });\n\n scope.interactables.splice(indexOf(scope.interactables, this), 1);\n\n // Stop related interactions when an Interactable is unset\n for (const interaction of scope.interactions || []) {\n if (interaction.target === this && interaction.interacting()) {\n interaction.stop();\n }\n }\n\n return scope.interact;\n }\n}\n\nscope.interactables.indexOfElement = function indexOfElement (target, context) {\n context = context || scope.document;\n\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n if (interactable.target === target && interactable._context === context) {\n return i;\n }\n }\n return -1;\n};\n\nscope.interactables.get = function interactableGet (element, options, dontCheckInContext) {\n const ret = this[this.indexOfElement(element, options && options.context)];\n\n return ret && (is.string(element) || dontCheckInContext || ret.inContext(element))? ret : null;\n};\n\nscope.interactables.forEachSelector = function (callback, element) {\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n // skip non CSS selector targets and out of context elements\n if (!is.string(interactable.target)\n || (element && !interactable.inContext(element))) {\n continue;\n }\n\n const ret = callback(interactable, interactable.target, interactable._context, i, this);\n\n if (ret !== undefined) {\n return ret;\n }\n }\n};\n\n// all interact.js eventTypes\nInteractable.eventTypes = scope.eventTypes = [];\n\nInteractable.signals = signals;\n\nInteractable.settingsMethods = [ 'deltaSource', 'origin', 'preventDefault', 'rectChecker' ];\n\nmodule.exports = Interactable;\n","const scope = require('./scope');\nconst utils = require('./utils');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst finder = require('./utils/interactionFinder');\nconst signals = require('./utils/Signals').new();\n\nconst listeners = {};\nconst methodNames = [\n 'pointerDown', 'pointerMove', 'pointerUp',\n 'updatePointer', 'removePointer',\n];\n\n// for ignoring browser's simulated mouse events\nlet prevTouchTime = 0;\n\n// all active and idle interactions\nscope.interactions = [];\n\nclass Interaction {\n constructor () {\n this.target = null; // current interactable being interacted with\n this.element = null; // the target element of the interactable\n\n this.prepared = { // action that's ready to be fired on next move event\n name : null,\n axis : null,\n edges: null,\n };\n\n // keep track of added pointers\n this.pointers = [];\n this.pointerIds = [];\n this.downTargets = [];\n this.downTimes = [];\n\n // Previous native pointer move event coordinates\n this.prevCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n // current native pointer move event coordinates\n this.curCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Starting InteractEvent pointer coordinates\n this.startCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Change in coordinates and time of the pointer\n this.pointerDelta = {\n page : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n client : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n timeStamp: 0,\n };\n\n this.downEvent = null; // pointerdown/mousedown/touchstart event\n this.downPointer = {};\n\n this._eventTarget = null;\n this._curEventTarget = null;\n\n this.prevEvent = null; // previous action event\n\n this.pointerIsDown = false;\n this.pointerWasMoved = false;\n this._interacting = false;\n\n this.mouse = false;\n\n signals.fire('new', this);\n\n scope.interactions.push(this);\n }\n\n pointerDown (pointer, event, eventTarget) {\n const pointerIndex = this.updatePointer(pointer, event, true);\n\n signals.fire('down', {\n pointer,\n event,\n eventTarget,\n pointerIndex,\n interaction: this,\n });\n }\n\n /*\\\n * Interaction.start\n [ method ]\n *\n * Start an action with the given Interactable and Element as tartgets. The\n * action must be enabled for the target Interactable and an appropriate number\n * of pointers must be held down - 1 for drag/resize, 2 for gesture.\n *\n * Use it with `interactable.able({ manualStart: false })` to always\n * [start actions manually](https://github.com/taye/interact.js/issues/114)\n *\n - action (object) The action to be performed - drag, resize, etc.\n - target (Interactable) The Interactable to target\n - element (Element) The DOM Element to target\n = (object) interact\n **\n | interact(target)\n | .draggable({\n | // disable the default drag start by down->move\n | manualStart: true\n | })\n | // start dragging after the user holds the pointer down\n | .on('hold', function (event) {\n | var interaction = event.interaction;\n |\n | if (!interaction.interacting()) {\n | interaction.start({ name: 'drag' },\n | event.interactable,\n | event.currentTarget);\n | }\n | });\n \\*/\n start (action, target, element) {\n if (this.interacting()\n || !this.pointerIsDown\n || this.pointerIds.length < (action.name === 'gesture'? 2 : 1)) {\n return;\n }\n\n // if this interaction had been removed after stopping\n // add it back\n if (utils.indexOf(scope.interactions, this) === -1) {\n scope.interactions.push(this);\n }\n\n utils.copyAction(this.prepared, action);\n this.target = target;\n this.element = element;\n\n signals.fire('action-start', {\n interaction: this,\n event: this.downEvent,\n });\n }\n\n pointerMove (pointer, event, eventTarget) {\n if (!this.simulation) {\n this.updatePointer(pointer);\n utils.setCoords(this.curCoords, this.pointers);\n }\n\n const duplicateMove = (this.curCoords.page.x === this.prevCoords.page.x\n && this.curCoords.page.y === this.prevCoords.page.y\n && this.curCoords.client.x === this.prevCoords.client.x\n && this.curCoords.client.y === this.prevCoords.client.y);\n\n let dx;\n let dy;\n\n // register movement greater than pointerMoveTolerance\n if (this.pointerIsDown && !this.pointerWasMoved) {\n dx = this.curCoords.client.x - this.startCoords.client.x;\n dy = this.curCoords.client.y - this.startCoords.client.y;\n\n this.pointerWasMoved = utils.hypot(dx, dy) > Interaction.pointerMoveTolerance;\n }\n\n const signalArg = {\n pointer,\n pointerIndex: this.getPointerIndex(pointer),\n event,\n eventTarget,\n dx,\n dy,\n duplicate: duplicateMove,\n interaction: this,\n interactingBeforeMove: this.interacting(),\n };\n\n if (!duplicateMove) {\n // set pointer coordinate, time changes and speeds\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n }\n\n signals.fire('move', signalArg);\n\n if (!duplicateMove) {\n // if interacting, fire an 'action-move' signal etc\n if (this.interacting()) {\n this.doMove(signalArg);\n }\n\n if (this.pointerWasMoved) {\n utils.copyCoords(this.prevCoords, this.curCoords);\n }\n }\n }\n\n /*\\\n * Interaction.doMove\n [ method ]\n *\n * Force a move of the current action at the same coordinates. Useful if\n * snap/restrict has been changed and you want a movement with the new\n * settings.\n *\n **\n | interact(target)\n | .draggable(true)\n | .on('dragmove', function (event) {\n | if (someCondition) {\n | // change the snap settings\n | event.interactable.draggable({ snap: { targets: [] }});\n | // fire another move event with re-calculated snap\n | event.interaction.doMove();\n | }\n | });\n \\*/\n doMove (signalArg) {\n signalArg = utils.extend({\n pointer: this.pointers[0],\n event: this.prevEvent,\n eventTarget: this._eventTarget,\n interaction: this,\n }, signalArg || {});\n\n signals.fire('before-action-move', signalArg);\n\n if (!this._dontFireMove) {\n signals.fire('action-move', signalArg);\n }\n\n this._dontFireMove = false;\n }\n\n // End interact move events and stop auto-scroll unless simulation is running\n pointerUp (pointer, event, eventTarget, curEventTarget) {\n const pointerIndex = this.getPointerIndex(pointer);\n\n signals.fire(/cancel$/i.test(event.type)? 'cancel' : 'up', {\n pointer,\n pointerIndex,\n event,\n eventTarget,\n curEventTarget,\n interaction: this,\n });\n\n if (!this.simulation) {\n this.end(event);\n }\n\n this.pointerIsDown = false;\n this.removePointer(pointer, event);\n }\n\n /*\\\n * Interaction.end\n [ method ]\n *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n - event (PointerEvent) #optional\n **\n | interact(target)\n | .draggable(true)\n | .on('move', function (event) {\n | if (event.pageX > 1000) {\n | // end the current action\n | event.interaction.end();\n | // stop all further listeners from being called\n | event.stopImmediatePropagation();\n | }\n | });\n \\*/\n end (event) {\n event = event || this.prevEvent;\n\n if (this.interacting()) {\n signals.fire('action-end', {\n event,\n interaction: this,\n });\n }\n\n this.stop();\n }\n\n currentAction () {\n return this._interacting? this.prepared.name: null;\n }\n\n interacting () {\n return this._interacting;\n }\n\n stop () {\n signals.fire('stop', { interaction: this });\n\n if (this._interacting) {\n signals.fire('stop-active', { interaction: this });\n signals.fire('stop-' + this.prepared.name, { interaction: this });\n }\n\n this.target = this.element = null;\n\n this._interacting = false;\n this.prepared.name = this.prevEvent = null;\n }\n\n getPointerIndex (pointer) {\n return utils.indexOf(this.pointerIds, utils.getPointerId(pointer));\n }\n\n updatePointer (pointer, event, down = event && /(down|start)$/i.test(event.type)) {\n const id = utils.getPointerId(pointer);\n let index = this.getPointerIndex(pointer);\n\n if (index === -1) {\n index = this.pointerIds.length;\n this.pointerIds[index] = id;\n }\n\n if (down) {\n signals.fire('update-pointer-down', {\n pointer,\n event,\n down,\n pointerId: id,\n pointerIndex: index,\n interaction: this,\n });\n }\n\n this.pointers[index] = pointer;\n\n return index;\n }\n\n removePointer (pointer, event) {\n const id = utils.getPointerId(pointer);\n const index = this.mouse? 0 : utils.indexOf(this.pointerIds, id);\n\n if (index === -1) { return; }\n\n signals.fire('remove-pointer', {\n pointer,\n event,\n pointerIndex: index,\n interaction: this,\n });\n\n this.pointers .splice(index, 1);\n this.pointerIds .splice(index, 1);\n this.downTargets.splice(index, 1);\n this.downTimes .splice(index, 1);\n }\n\n _updateEventTargets (target, currentTarget) {\n this._eventTarget = target;\n this._curEventTarget = currentTarget;\n }\n}\n\nfor (let i = 0, len = methodNames.length; i < len; i++) {\n const method = methodNames[i];\n\n listeners[method] = doOnInteractions(method);\n}\n\nfunction doOnInteractions (method) {\n return (function (event) {\n const [eventTarget, curEventTarget] = utils.getEventTargets(event);\n const matches = []; // [ [pointer, interaction], ...]\n\n if (browser.supportsTouch && /touch/.test(event.type)) {\n prevTouchTime = new Date().getTime();\n\n for (let i = 0; i < event.changedTouches.length; i++) {\n const pointer = event.changedTouches[i];\n const interaction = finder.search(pointer, event.type, eventTarget);\n\n matches.push([pointer, interaction || new Interaction()]);\n }\n }\n else {\n let invalidPointer = false;\n\n if (!browser.supportsPointerEvent && /mouse/.test(event.type)) {\n // ignore mouse events while touch interactions are active\n for (let i = 0; i < scope.interactions.length && !invalidPointer; i++) {\n invalidPointer = !scope.interactions[i].mouse && scope.interactions[i].pointerIsDown;\n }\n\n // try to ignore mouse events that are simulated by the browser\n // after a touch event\n invalidPointer = invalidPointer\n || (new Date().getTime() - prevTouchTime < 500)\n // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated\n || event.timeStamp === 0;\n }\n\n if (!invalidPointer) {\n let interaction = finder.search(event, event.type, eventTarget);\n\n if (!interaction) {\n\n interaction = new Interaction();\n interaction.mouse = (/mouse/i.test(event.pointerType || event.type)\n // MSPointerEvent.MSPOINTER_TYPE_MOUSE\n || event.pointerType === 4\n || !event.pointerType);\n }\n\n matches.push([event, interaction]);\n }\n }\n\n for (const [pointer, interaction] of matches) {\n interaction._updateEventTargets(eventTarget, curEventTarget);\n interaction[method](pointer, event, eventTarget, curEventTarget);\n }\n });\n}\n\nfunction endAll (event) {\n for (let i = 0; i < scope.interactions.length; i++) {\n const interaction = scope.interactions[i];\n\n interaction.end(event);\n signals.fire('endall', { event, interaction });\n }\n}\n\nconst docEvents = { /* 'eventType': listenerFunc */ };\nconst pEventTypes = browser.pEventTypes;\n\nif (scope.PointerEvent) {\n docEvents[pEventTypes.down ] = listeners.pointerDown;\n docEvents[pEventTypes.move ] = listeners.pointerMove;\n docEvents[pEventTypes.up ] = listeners.pointerUp;\n docEvents[pEventTypes.cancel] = listeners.pointerUp;\n}\nelse {\n docEvents.mousedown = listeners.pointerDown;\n docEvents.mousemove = listeners.pointerMove;\n docEvents.mouseup = listeners.pointerUp;\n\n docEvents.touchstart = listeners.pointerDown;\n docEvents.touchmove = listeners.pointerMove;\n docEvents.touchend = listeners.pointerUp;\n docEvents.touchcancel = listeners.pointerUp;\n}\n\ndocEvents.blur = endAll;\n\nfunction onDocSignal ({ doc }, signalName) {\n const eventMethod = signalName.indexOf('add') === 0\n ? events.add : events.remove;\n\n // delegate event listener\n for (const eventType in scope.delegatedEvents) {\n eventMethod(doc, eventType, events.delegateListener);\n eventMethod(doc, eventType, events.delegateUseCapture, true);\n }\n\n for (const eventType in docEvents) {\n eventMethod(doc, eventType, docEvents[eventType]);\n }\n}\n\nsignals.on('update-pointer-down', ({ interaction, pointer, pointerId, pointerIndex, event, eventTarget, down }) => {\n interaction.pointerIds[pointerIndex] = pointerId;\n interaction.pointers[pointerIndex] = pointer;\n\n if (down) {\n interaction.pointerIsDown = true;\n }\n\n if (!interaction.interacting()) {\n utils.setCoords(interaction.startCoords, interaction.pointers);\n\n utils.copyCoords(interaction.curCoords , interaction.startCoords);\n utils.copyCoords(interaction.prevCoords, interaction.startCoords);\n\n interaction.downEvent = event;\n interaction.downTimes[pointerIndex] = interaction.curCoords.timeStamp;\n interaction.downTargets[pointerIndex] = eventTarget || event && utils.getEventTargets(event)[0];\n interaction.pointerWasMoved = false;\n\n utils.pointerExtend(interaction.downPointer, pointer);\n }\n});\n\nscope.signals.on('add-document' , onDocSignal);\nscope.signals.on('remove-document', onDocSignal);\n\nInteraction.pointerMoveTolerance = 1;\nInteraction.doOnInteractions = doOnInteractions;\nInteraction.endAll = endAll;\nInteraction.signals = signals;\nInteraction.docEvents = docEvents;\n\nscope.endAllInteractions = endAll;\n\nmodule.exports = Interaction;\n","const Interaction = require('../Interaction');\nconst InteractEvent = require('../InteractEvent');\n\nconst actions = {\n firePrepared,\n names: [],\n methodDict: {},\n};\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n interaction._interacting = true;\n firePrepared(interaction, event, 'start');\n});\n\nInteraction.signals.on('action-move', function ({ interaction, event, preEnd }) {\n firePrepared(interaction, event, 'move', preEnd);\n\n // if the action was ended in a listener\n if (!interaction.interacting()) { return false; }\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n firePrepared(interaction, event, 'end');\n});\n\nfunction firePrepared (interaction, event, phase, preEnd) {\n const actionName = interaction.prepared.name;\n\n const newEvent = new InteractEvent(interaction, event, actionName, phase, interaction.element, null, preEnd);\n\n interaction.target.fire(newEvent);\n interaction.prevEvent = newEvent;\n}\n\nmodule.exports = actions;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drag = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n startAxis : 'xy',\n lockAxis : 'xy',\n },\n\n checker: function (pointer, event, interactable) {\n const dragOptions = interactable.options.drag;\n\n return dragOptions.enabled\n ? { name: 'drag', axis: (dragOptions.lockAxis === 'start'\n ? dragOptions.startAxis\n : dragOptions.lockAxis)}\n : null;\n },\n\n getCursor: function () {\n return 'move';\n },\n};\n\nInteraction.signals.on('before-action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n interaction.curCoords.page.y = interaction.startCoords.page.y;\n interaction.curCoords.client.y = interaction.startCoords.client.y;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vx);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vx);\n interaction.pointerDelta.client.vy = 0;\n interaction.pointerDelta.page.vy = 0;\n }\n else if (axis === 'y') {\n interaction.curCoords.page.x = interaction.startCoords.page.x;\n interaction.curCoords.client.x = interaction.startCoords.client.x;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vy);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vy);\n interaction.pointerDelta.client.vx = 0;\n interaction.pointerDelta.page.vx = 0;\n }\n});\n\n// dragmove\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'dragmove') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n iEvent.pageY = interaction.startCoords.page.y;\n iEvent.clientY = interaction.startCoords.client.y;\n iEvent.dy = 0;\n }\n else if (axis === 'y') {\n iEvent.pageX = interaction.startCoords.page.x;\n iEvent.clientX = interaction.startCoords.client.x;\n iEvent.dx = 0;\n }\n});\n\n/*\\\n * Interactable.draggable\n [ method ]\n *\n * Gets or sets whether drag actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of drag events\n | var isDraggable = interact('ul li').draggable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on drag events (object makes the Interactable draggable)\n = (object) This Interactable\n | interact(element).draggable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // the axis in which the first movement must be\n | // for the drag sequence to start\n | // 'xy' by default - any direction\n | startAxis: 'x' || 'y' || 'xy',\n |\n | // 'xy' by default - don't restrict to one axis (move in any direction)\n | // 'x' or 'y' to restrict movement to either axis\n | // 'start' to restrict movement to the axis the drag started in\n | lockAxis: 'x' || 'y' || 'xy' || 'start',\n |\n | // max number of drags that can happen concurrently\n | // with elements of this Interactable. Infinity by default\n | max: Infinity,\n |\n | // max number of drags that can target the same element+Interactable\n | // 1 by default\n | maxPerElement: 2\n | });\n\\*/\nInteractable.prototype.draggable = function (options) {\n if (utils.is.object(options)) {\n this.options.drag.enabled = options.enabled === false? false: true;\n this.setPerAction('drag', options);\n this.setOnEvents('drag', options);\n\n if (/^(xy|x|y|start)$/.test(options.lockAxis)) {\n this.options.drag.lockAxis = options.lockAxis;\n }\n if (/^(xy|x|y)$/.test(options.startAxis)) {\n this.options.drag.startAxis = options.startAxis;\n }\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drag.enabled = options;\n\n if (!options) {\n this.ondragstart = this.ondragstart = this.ondragend = null;\n }\n\n return this;\n }\n\n return this.options.drag;\n};\n\nactions.drag = drag;\nactions.names.push('drag');\nutils.merge(Interactable.eventTypes, [\n 'dragstart',\n 'dragmove',\n 'draginertiastart',\n 'draginertiaresume',\n 'dragend',\n]);\nactions.methodDict.drag = 'draggable';\n\ndefaultOptions.drag = drag.defaults;\n\nmodule.exports = drag;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst scope = require('../scope');\nconst interact = require('../interact');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drop = {\n defaults: {\n enabled: false,\n accept : null,\n overlap: 'pointer',\n },\n};\n\nlet dynamicDrop = false;\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // reset active dropzones\n interaction.activeDrops.dropzones = [];\n interaction.activeDrops.elements = [];\n interaction.activeDrops.rects = [];\n\n interaction.dropEvents = null;\n\n if (!interaction.dynamicDrop) {\n setActiveDrops(interaction, interaction.element);\n }\n\n const dragEvent = interaction.prevEvent;\n const dropEvents = getDropEvents(interaction, event, dragEvent);\n\n if (dropEvents.activate) {\n fireActiveDrops(interaction, dropEvents.activate);\n }\n});\n\nInteractEvent.signals.on('new', function ({ interaction, iEvent, event }) {\n if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { return; }\n\n const draggableElement = interaction.element;\n const dragEvent = iEvent;\n const dropResult = getDrop(dragEvent, event, draggableElement);\n\n interaction.dropTarget = dropResult.dropzone;\n interaction.dropElement = dropResult.element;\n\n interaction.dropEvents = getDropEvents(interaction, event, dragEvent);\n});\n\nInteraction.signals.on('action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n fireDropEvents(interaction, interaction.dropEvents);\n});\n\nInteraction.signals.on('action-end', function ({ interaction }) {\n if (interaction.prepared.name === 'drag') {\n fireDropEvents(interaction, interaction.dropEvents);\n }\n});\n\nInteraction.signals.on('stop-drag', function ({ interaction }) {\n interaction.activeDrops.dropzones =\n interaction.activeDrops.elements =\n interaction.activeDrops.rects =\n interaction.dropEvents = null;\n});\n\nfunction collectDrops (interaction, element) {\n const drops = [];\n const elements = [];\n\n element = element || interaction.element;\n\n // collect all dropzones and their elements which qualify for a drop\n for (const current of scope.interactables) {\n if (!current.options.drop.enabled) { continue; }\n\n const accept = current.options.drop.accept;\n\n // test the draggable element against the dropzone's accept setting\n if ((utils.is.element(accept) && accept !== element)\n || (utils.is.string(accept)\n && !utils.matchesSelector(element, accept))) {\n\n continue;\n }\n\n // query for new elements if necessary\n const dropElements = utils.is.string(current.target)\n ? current._context.querySelectorAll(current.target)\n : [current.target];\n\n for (let i = 0; i < dropElements.length; i++) {\n const currentElement = dropElements[i];\n\n if (currentElement !== element) {\n drops.push(current);\n elements.push(currentElement);\n }\n }\n }\n\n return {\n elements,\n dropzones: drops,\n };\n}\n\nfunction fireActiveDrops (interaction, event) {\n let prevElement;\n\n // loop through all active dropzones and trigger event\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n const current = interaction.activeDrops.dropzones[i];\n const currentElement = interaction.activeDrops.elements [i];\n\n // prevent trigger of duplicate events on same element\n if (currentElement !== prevElement) {\n // set current element as event target\n event.target = currentElement;\n current.fire(event);\n }\n prevElement = currentElement;\n }\n}\n\n// Collect a new set of possible drops and save them in activeDrops.\n// setActiveDrops should always be called when a drag has just started or a\n// drag event happens while dynamicDrop is true\nfunction setActiveDrops (interaction, dragElement) {\n // get dropzones and their elements that could receive the draggable\n const possibleDrops = collectDrops(interaction, dragElement, true);\n\n interaction.activeDrops.dropzones = possibleDrops.dropzones;\n interaction.activeDrops.elements = possibleDrops.elements;\n interaction.activeDrops.rects = [];\n\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n interaction.activeDrops.rects[i] =\n interaction.activeDrops.dropzones[i].getRect(interaction.activeDrops.elements[i]);\n }\n}\n\nfunction getDrop (dragEvent, event, dragElement) {\n const interaction = dragEvent.interaction;\n const validDrops = [];\n\n if (dynamicDrop) {\n setActiveDrops(interaction, dragElement);\n }\n\n // collect all dropzones and their elements which qualify for a drop\n for (let j = 0; j < interaction.activeDrops.dropzones.length; j++) {\n const current = interaction.activeDrops.dropzones[j];\n const currentElement = interaction.activeDrops.elements [j];\n const rect = interaction.activeDrops.rects [j];\n\n validDrops.push(current.dropCheck(dragEvent, event, interaction.target, dragElement, currentElement, rect)\n ? currentElement\n : null);\n }\n\n // get the most appropriate dropzone based on DOM depth and order\n const dropIndex = utils.indexOfDeepestElement(validDrops);\n\n return {\n dropzone: interaction.activeDrops.dropzones[dropIndex] || null,\n element : interaction.activeDrops.elements [dropIndex] || null,\n };\n}\n\nfunction getDropEvents (interaction, pointerEvent, dragEvent) {\n const dropEvents = {\n enter : null,\n leave : null,\n activate : null,\n deactivate: null,\n move : null,\n drop : null,\n };\n\n const tmpl = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n };\n\n if (interaction.dropElement !== interaction.prevDropElement) {\n // if there was a prevDropTarget, create a dragleave event\n if (interaction.prevDropTarget) {\n dropEvents.leave = utils.extend({ type: 'dragleave' }, tmpl);\n\n dragEvent.dragLeave = dropEvents.leave.target = interaction.prevDropElement;\n dragEvent.prevDropzone = dropEvents.leave.dropzone = interaction.prevDropTarget;\n }\n // if the dropTarget is not null, create a dragenter event\n if (interaction.dropTarget) {\n dropEvents.enter = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n type : 'dragenter',\n };\n\n dragEvent.dragEnter = interaction.dropElement;\n dragEvent.dropzone = interaction.dropTarget;\n }\n }\n\n if (dragEvent.type === 'dragend' && interaction.dropTarget) {\n dropEvents.drop = utils.extend({ type: 'drop' }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n dragEvent.relatedTarget = interaction.dropElement;\n }\n if (dragEvent.type === 'dragstart') {\n dropEvents.activate = utils.extend({ type: 'dropactivate' }, tmpl);\n\n dropEvents.activate.target = null;\n dropEvents.activate.dropzone = null;\n }\n if (dragEvent.type === 'dragend') {\n dropEvents.deactivate = utils.extend({ type: 'dropdeactivate' }, tmpl);\n\n dropEvents.deactivate.target = null;\n dropEvents.deactivate.dropzone = null;\n }\n if (dragEvent.type === 'dragmove' && interaction.dropTarget) {\n dropEvents.move = utils.extend({\n dragmove : dragEvent,\n type : 'dropmove',\n }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n }\n\n return dropEvents;\n}\n\nfunction fireDropEvents (interaction, dropEvents) {\n if (dropEvents.leave) { interaction.prevDropTarget.fire(dropEvents.leave); }\n if (dropEvents.move ) { interaction.dropTarget.fire(dropEvents.move ); }\n if (dropEvents.enter) { interaction.dropTarget.fire(dropEvents.enter); }\n if (dropEvents.drop ) { interaction.dropTarget.fire(dropEvents.drop ); }\n if (dropEvents.deactivate) {\n fireActiveDrops(interaction, dropEvents.deactivate);\n }\n\n interaction.prevDropTarget = interaction.dropTarget;\n interaction.prevDropElement = interaction.dropElement;\n}\n\n/*\\\n * Interactable.dropzone\n [ method ]\n *\n * Returns or sets whether elements can be dropped onto this\n * Interactable to trigger drop events\n *\n * Dropzones can receive the following events:\n * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends\n * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone\n * - `dragmove` when a draggable that has entered the dropzone is moved\n * - `drop` when a draggable is dropped into this dropzone\n *\n * Use the `accept` option to allow only elements that match the given CSS\n * selector or element. The value can be:\n *\n * - **an Element** - only that element can be dropped into this dropzone.\n * - **a string**, - the element being dragged must match it as a CSS selector.\n * - **`null`** - accept options is cleared - it accepts any element.\n *\n * Use the `overlap` option to set how drops are checked for. The allowed\n * values are:\n *\n * - `'pointer'`, the pointer must be over the dropzone (default)\n * - `'center'`, the draggable element's center must be over the dropzone\n * - a number from 0-1 which is the `(intersection area) / (draggable area)`.\n * e.g. `0.5` for drop to happen when half of the area of the draggable is\n * over the dropzone\n *\n * Use the `checker` option to specify a function to check if a dragged\n * element is over this Interactable.\n *\n | interact(target)\n | .dropChecker(function(dragEvent, // related dragmove or dragend event\n | event, // TouchEvent/PointerEvent/MouseEvent\n | dropped, // bool result of the default checker\n | dropzone, // dropzone Interactable\n | dropElement, // dropzone elemnt\n | draggable, // draggable Interactable\n | draggableElement) {// draggable element\n |\n | return dropped && event.target.hasAttribute('allow-drop');\n | }\n *\n *\n - options (boolean | object | null) #optional The new value to be set.\n | interact('.drop').dropzone({\n | accept: '.can-drop' || document.getElementById('single-drop'),\n | overlap: 'pointer' || 'center' || zeroToOne\n | }\n = (boolean | object) The current setting or this Interactable\n\\*/\nInteractable.prototype.dropzone = function (options) {\n if (utils.is.object(options)) {\n this.options.drop.enabled = options.enabled === false? false: true;\n\n if (utils.is.function(options.ondrop) ) { this.events.ondrop = options.ondrop ; }\n if (utils.is.function(options.ondropactivate) ) { this.events.ondropactivate = options.ondropactivate ; }\n if (utils.is.function(options.ondropdeactivate)) { this.events.ondropdeactivate = options.ondropdeactivate; }\n if (utils.is.function(options.ondragenter) ) { this.events.ondragenter = options.ondragenter ; }\n if (utils.is.function(options.ondragleave) ) { this.events.ondragleave = options.ondragleave ; }\n if (utils.is.function(options.ondropmove) ) { this.events.ondropmove = options.ondropmove ; }\n\n if (/^(pointer|center)$/.test(options.overlap)) {\n this.options.drop.overlap = options.overlap;\n }\n else if (utils.is.number(options.overlap)) {\n this.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0);\n }\n if ('accept' in options) {\n this.options.drop.accept = options.accept;\n }\n if ('checker' in options) {\n this.options.drop.checker = options.checker;\n }\n\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drop.enabled = options;\n\n if (!options) {\n this.ondragenter = this.ondragleave = this.ondrop\n = this.ondropactivate = this.ondropdeactivate = null;\n }\n\n return this;\n }\n\n return this.options.drop;\n};\n\nInteractable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) {\n let dropped = false;\n\n // if the dropzone has no rect (eg. display: none)\n // call the custom dropChecker or just return false\n if (!(rect = rect || this.getRect(dropElement))) {\n return (this.options.drop.checker\n ? this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement)\n : false);\n }\n\n const dropOverlap = this.options.drop.overlap;\n\n if (dropOverlap === 'pointer') {\n const origin = utils.getOriginXY(draggable, draggableElement, 'drag');\n const page = utils.getPageXY(dragEvent);\n\n page.x += origin.x;\n page.y += origin.y;\n\n const horizontal = (page.x > rect.left) && (page.x < rect.right);\n const vertical = (page.y > rect.top ) && (page.y < rect.bottom);\n\n dropped = horizontal && vertical;\n }\n\n const dragRect = draggable.getRect(draggableElement);\n\n if (dragRect && dropOverlap === 'center') {\n const cx = dragRect.left + dragRect.width / 2;\n const cy = dragRect.top + dragRect.height / 2;\n\n dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom;\n }\n\n if (dragRect && utils.is.number(dropOverlap)) {\n const overlapArea = (Math.max(0, Math.min(rect.right , dragRect.right ) - Math.max(rect.left, dragRect.left))\n * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top , dragRect.top )));\n\n const overlapRatio = overlapArea / (dragRect.width * dragRect.height);\n\n dropped = overlapRatio >= dropOverlap;\n }\n\n if (this.options.drop.checker) {\n dropped = this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement);\n }\n\n return dropped;\n};\n\nInteractable.signals.on('unset', function ({ interactable }) {\n interactable.dropzone(false);\n});\n\nInteractable.settingsMethods.push('dropChecker');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.dropTarget = null; // the dropzone a drag target might be dropped into\n interaction.dropElement = null; // the element at the time of checking\n interaction.prevDropTarget = null; // the dropzone that was recently dragged away from\n interaction.prevDropElement = null; // the element at the time of checking\n interaction.dropEvents = null; // the dropEvents related to the current drag event\n\n interaction.activeDrops = {\n dropzones: [], // the dropzones that are mentioned below\n elements : [], // elements of dropzones that accept the target draggable\n rects : [], // the rects of the elements mentioned above\n };\n\n});\n\nInteraction.signals.on('stop', function ({ interaction }) {\n interaction.dropTarget = interaction.dropElement =\n interaction.prevDropTarget = interaction.prevDropElement = null;\n});\n\n/*\\\n * interact.dynamicDrop\n [ method ]\n *\n * Returns or sets whether the dimensions of dropzone elements are\n * calculated on every dragmove or only on dragstart for the default\n * dropChecker\n *\n - newValue (boolean) #optional True to check on each move. False to check only before start\n = (boolean | interact) The current setting or interact\n\\*/\ninteract.dynamicDrop = function (newValue) {\n if (utils.is.bool(newValue)) {\n //if (dragging && dynamicDrop !== newValue && !newValue) {\n //calcRects(dropzones);\n //}\n\n dynamicDrop = newValue;\n\n return interact;\n }\n return dynamicDrop;\n};\n\nutils.merge(Interactable.eventTypes, [\n 'dragenter',\n 'dragleave',\n 'dropactivate',\n 'dropdeactivate',\n 'dropmove',\n 'drop',\n]);\nactions.methodDict.drop = 'dropzone';\n\ndefaultOptions.drop = drop.defaults;\n\nmodule.exports = drop;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst gesture = {\n defaults: {\n enabled : false,\n origin : null,\n restrict: null,\n },\n\n checker: function (pointer, event, interactable, element, interaction) {\n if (interaction.pointerIds.length >= 2) {\n return { name: 'gesture' };\n }\n\n return null;\n },\n\n getCursor: function () {\n return '';\n },\n};\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturestart') { return; }\n iEvent.ds = 0;\n\n interaction.gesture.startDistance = interaction.gesture.prevDistance = iEvent.distance;\n interaction.gesture.startAngle = interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.scale = 1;\n});\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturemove') { return; }\n\n iEvent.ds = iEvent.scale - interaction.gesture.scale;\n\n interaction.target.fire(iEvent);\n\n interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.prevDistance = iEvent.distance;\n\n if (iEvent.scale !== Infinity\n && iEvent.scale !== null\n && iEvent.scale !== undefined\n && !isNaN(iEvent.scale)) {\n\n interaction.gesture.scale = iEvent.scale;\n }\n});\n\n/*\\\n * Interactable.gesturable\n [ method ]\n *\n * Gets or sets whether multitouch gestures can be performed on the\n * Interactable's element\n *\n = (boolean) Indicates if this can be the target of gesture events\n | var isGestureable = interact(element).gesturable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on gesture events (makes the Interactable gesturable)\n = (object) this Interactable\n | interact(element).gesturable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // limit multiple gestures.\n | // See the explanation in @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n\\*/\nInteractable.prototype.gesturable = function (options) {\n if (utils.is.object(options)) {\n this.options.gesture.enabled = options.enabled === false? false: true;\n this.setPerAction('gesture', options);\n this.setOnEvents('gesture', options);\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.gesture.enabled = options;\n\n if (!options) {\n this.ongesturestart = this.ongesturestart = this.ongestureend = null;\n }\n\n return this;\n }\n\n return this.options.gesture;\n};\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action, event, starting, ending, deltaSource }) {\n if (action !== 'gesture') { return; }\n\n const pointers = interaction.pointers;\n\n iEvent.touches = [pointers[0], pointers[1]];\n\n if (starting) {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = 1;\n iEvent.ds = 0;\n iEvent.angle = utils.touchAngle(pointers, undefined, deltaSource);\n iEvent.da = 0;\n }\n else if (ending || event instanceof InteractEvent) {\n iEvent.distance = interaction.prevEvent.distance;\n iEvent.box = interaction.prevEvent.box;\n iEvent.scale = interaction.prevEvent.scale;\n iEvent.ds = iEvent.scale - 1;\n iEvent.angle = interaction.prevEvent.angle;\n iEvent.da = iEvent.angle - interaction.gesture.startAngle;\n }\n else {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = iEvent.distance / interaction.gesture.startDistance;\n iEvent.angle = utils.touchAngle(pointers, interaction.gesture.prevAngle, deltaSource);\n\n iEvent.ds = iEvent.scale - interaction.gesture.prevScale;\n iEvent.da = iEvent.angle - interaction.gesture.prevAngle;\n }\n});\n\nInteraction.signals.on('new', function (interaction) {\n interaction.gesture = {\n start: { x: 0, y: 0 },\n\n startDistance: 0, // distance between two touches of touchStart\n prevDistance : 0,\n distance : 0,\n\n scale: 1, // gesture.distance / gesture.startDistance\n\n startAngle: 0, // angle of line joining two touches\n prevAngle : 0, // angle of the previous gesture event\n };\n});\n\nactions.gesture = gesture;\nactions.names.push('gesture');\nutils.merge(Interactable.eventTypes, [\n 'gesturestart',\n 'gesturemove',\n 'gestureend',\n]);\nactions.methodDict.gesture = 'gesturable';\n\ndefaultOptions.gesture = gesture.defaults;\n\nmodule.exports = gesture;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\n// Less Precision with touch input\nconst defaultMargin = browser.supportsTouch || browser.supportsPointerEvent? 20: 10;\n\nconst resize = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n square: false,\n preserveAspectRatio: false,\n axis: 'xy',\n\n // use default margin\n margin: NaN,\n\n // object with props left, right, top, bottom which are\n // true/false values to resize when the pointer is over that edge,\n // CSS selectors to match the handles for each direction\n // or the Elements for each handle\n edges: null,\n\n // a value of 'none' will limit the resize rect to a minimum of 0x0\n // 'negate' will alow the rect to have negative width/height\n // 'reposition' will keep the width/height positive by swapping\n // the top and bottom edges and/or swapping the left and right edges\n invert: 'none',\n },\n\n checker: function (pointer, event, interactable, element, interaction, rect) {\n if (!rect) { return null; }\n\n const page = utils.extend({}, interaction.curCoords.page);\n const options = interactable.options;\n\n if (options.resize.enabled) {\n const resizeOptions = options.resize;\n const resizeEdges = { left: false, right: false, top: false, bottom: false };\n\n // if using resize.edges\n if (utils.is.object(resizeOptions.edges)) {\n for (const edge in resizeEdges) {\n resizeEdges[edge] = checkResizeEdge(edge,\n resizeOptions.edges[edge],\n page,\n interaction._eventTarget,\n element,\n rect,\n resizeOptions.margin || defaultMargin);\n }\n\n resizeEdges.left = resizeEdges.left && !resizeEdges.right;\n resizeEdges.top = resizeEdges.top && !resizeEdges.bottom;\n\n if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) {\n return {\n name: 'resize',\n edges: resizeEdges,\n };\n }\n }\n else {\n const right = options.resize.axis !== 'y' && page.x > (rect.right - defaultMargin);\n const bottom = options.resize.axis !== 'x' && page.y > (rect.bottom - defaultMargin);\n\n if (right || bottom) {\n return {\n name: 'resize',\n axes: (right? 'x' : '') + (bottom? 'y' : ''),\n };\n }\n }\n }\n\n return null;\n },\n\n cursors: (browser.isIe9OrOlder ? {\n x : 'e-resize',\n y : 's-resize',\n xy: 'se-resize',\n\n top : 'n-resize',\n left : 'w-resize',\n bottom : 's-resize',\n right : 'e-resize',\n topleft : 'se-resize',\n bottomright: 'se-resize',\n topright : 'ne-resize',\n bottomleft : 'ne-resize',\n } : {\n x : 'ew-resize',\n y : 'ns-resize',\n xy: 'nwse-resize',\n\n top : 'ns-resize',\n left : 'ew-resize',\n bottom : 'ns-resize',\n right : 'ew-resize',\n topleft : 'nwse-resize',\n bottomright: 'nwse-resize',\n topright : 'nesw-resize',\n bottomleft : 'nesw-resize',\n }),\n\n getCursor: function (action) {\n if (action.axis) {\n return resize.cursors[action.name + action.axis];\n }\n else if (action.edges) {\n let cursorKey = '';\n const edgeNames = ['top', 'bottom', 'left', 'right'];\n\n for (let i = 0; i < 4; i++) {\n if (action.edges[edgeNames[i]]) {\n cursorKey += edgeNames[i];\n }\n }\n\n return resize.cursors[cursorKey];\n }\n },\n};\n\n// resizestart\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'resizestart' || !interaction.prepared.edges) {\n return;\n }\n\n const startRect = interaction.target.getRect(interaction.element);\n const resizeOptions = interaction.target.options.resize;\n\n /*\n * When using the `resizable.square` or `resizable.preserveAspectRatio` options, resizing from one edge\n * will affect another. E.g. with `resizable.square`, resizing to make the right edge larger will make\n * the bottom edge larger by the same amount. We call these 'linked' edges. Any linked edges will depend\n * on the active edges and the edge being interacted with.\n */\n if (resizeOptions.square || resizeOptions.preserveAspectRatio) {\n const linkedEdges = utils.extend({}, interaction.prepared.edges);\n\n linkedEdges.top = linkedEdges.top || (linkedEdges.left && !linkedEdges.bottom);\n linkedEdges.left = linkedEdges.left || (linkedEdges.top && !linkedEdges.right );\n linkedEdges.bottom = linkedEdges.bottom || (linkedEdges.right && !linkedEdges.top );\n linkedEdges.right = linkedEdges.right || (linkedEdges.bottom && !linkedEdges.left );\n\n interaction.prepared._linkedEdges = linkedEdges;\n }\n else {\n interaction.prepared._linkedEdges = null;\n }\n\n // if using `resizable.preserveAspectRatio` option, record aspect ratio at the start of the resize\n if (resizeOptions.preserveAspectRatio) {\n interaction.resizeStartAspectRatio = startRect.width / startRect.height;\n }\n\n interaction.resizeRects = {\n start : startRect,\n current : utils.extend({}, startRect),\n inverted : utils.extend({}, startRect),\n previous : utils.extend({}, startRect),\n delta : {\n left: 0, right : 0, width : 0,\n top : 0, bottom: 0, height: 0,\n },\n };\n\n iEvent.rect = interaction.resizeRects.inverted;\n iEvent.deltaRect = interaction.resizeRects.delta;\n});\n\n// resizemove\nInteractEvent.signals.on('new', function ({ iEvent, phase, interaction }) {\n if (phase !== 'move' || !interaction.prepared.edges) { return; }\n\n const resizeOptions = interaction.target.options.resize;\n const invert = resizeOptions.invert;\n const invertible = invert === 'reposition' || invert === 'negate';\n\n let edges = interaction.prepared.edges;\n\n const start = interaction.resizeRects.start;\n const current = interaction.resizeRects.current;\n const inverted = interaction.resizeRects.inverted;\n const delta = interaction.resizeRects.delta;\n const previous = utils.extend(interaction.resizeRects.previous, inverted);\n const originalEdges = edges;\n\n let dx = iEvent.dx;\n let dy = iEvent.dy;\n\n if (resizeOptions.preserveAspectRatio || resizeOptions.square) {\n // `resize.preserveAspectRatio` takes precedence over `resize.square`\n const startAspectRatio = resizeOptions.preserveAspectRatio\n ? interaction.resizeStartAspectRatio\n : 1;\n\n edges = interaction.prepared._linkedEdges;\n\n if ((originalEdges.left && originalEdges.bottom)\n || (originalEdges.right && originalEdges.top)) {\n dy = -dx / startAspectRatio;\n }\n else if (originalEdges.left || originalEdges.right ) { dy = dx / startAspectRatio; }\n else if (originalEdges.top || originalEdges.bottom) { dx = dy * startAspectRatio; }\n }\n\n // update the 'current' rect without modifications\n if (edges.top ) { current.top += dy; }\n if (edges.bottom) { current.bottom += dy; }\n if (edges.left ) { current.left += dx; }\n if (edges.right ) { current.right += dx; }\n\n if (invertible) {\n // if invertible, copy the current rect\n utils.extend(inverted, current);\n\n if (invert === 'reposition') {\n // swap edge values if necessary to keep width/height positive\n let swap;\n\n if (inverted.top > inverted.bottom) {\n swap = inverted.top;\n\n inverted.top = inverted.bottom;\n inverted.bottom = swap;\n }\n if (inverted.left > inverted.right) {\n swap = inverted.left;\n\n inverted.left = inverted.right;\n inverted.right = swap;\n }\n }\n }\n else {\n // if not invertible, restrict to minimum of 0x0 rect\n inverted.top = Math.min(current.top, start.bottom);\n inverted.bottom = Math.max(current.bottom, start.top);\n inverted.left = Math.min(current.left, start.right);\n inverted.right = Math.max(current.right, start.left);\n }\n\n inverted.width = inverted.right - inverted.left;\n inverted.height = inverted.bottom - inverted.top ;\n\n for (const edge in inverted) {\n delta[edge] = inverted[edge] - previous[edge];\n }\n\n iEvent.edges = interaction.prepared.edges;\n iEvent.rect = inverted;\n iEvent.deltaRect = delta;\n});\n\n/*\\\n * Interactable.resizable\n [ method ]\n *\n * Gets or sets whether resize actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of resize elements\n | var isResizeable = interact('input[type=text]').resizable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on resize events (object makes the Interactable resizable)\n = (object) This Interactable\n | interact(element).resizable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | edges: {\n | top : true, // Use pointer coords to check for resize.\n | left : false, // Disable resizing from left edge.\n | bottom: '.resize-s',// Resize if pointer target matches selector\n | right : handleEl // Resize if pointer target is the given Element\n | },\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height are adjusted at a 1:1 ratio.\n | square: false,\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height maintain the aspect ratio they had when resizing started.\n | preserveAspectRatio: false,\n |\n | // a value of 'none' will limit the resize rect to a minimum of 0x0\n | // 'negate' will allow the rect to have negative width/height\n | // 'reposition' will keep the width/height positive by swapping\n | // the top and bottom edges and/or swapping the left and right edges\n | invert: 'none' || 'negate' || 'reposition'\n |\n | // limit multiple resizes.\n | // See the explanation in the @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n \\*/\nInteractable.prototype.resizable = function (options) {\n if (utils.is.object(options)) {\n this.options.resize.enabled = options.enabled === false? false: true;\n this.setPerAction('resize', options);\n this.setOnEvents('resize', options);\n\n if (/^x$|^y$|^xy$/.test(options.axis)) {\n this.options.resize.axis = options.axis;\n }\n else if (options.axis === null) {\n this.options.resize.axis = defaultOptions.resize.axis;\n }\n\n if (utils.is.bool(options.preserveAspectRatio)) {\n this.options.resize.preserveAspectRatio = options.preserveAspectRatio;\n }\n else if (utils.is.bool(options.square)) {\n this.options.resize.square = options.square;\n }\n\n return this;\n }\n if (utils.is.bool(options)) {\n this.options.resize.enabled = options;\n\n if (!options) {\n this.onresizestart = this.onresizestart = this.onresizeend = null;\n }\n\n return this;\n }\n return this.options.resize;\n};\n\nfunction checkResizeEdge (name, value, page, element, interactableElement, rect, margin) {\n // false, '', undefined, null\n if (!value) { return false; }\n\n // true value, use pointer coords and element rect\n if (value === true) {\n // if dimensions are negative, \"switch\" edges\n const width = utils.is.number(rect.width )? rect.width : rect.right - rect.left;\n const height = utils.is.number(rect.height)? rect.height : rect.bottom - rect.top ;\n\n if (width < 0) {\n if (name === 'left' ) { name = 'right'; }\n else if (name === 'right') { name = 'left' ; }\n }\n if (height < 0) {\n if (name === 'top' ) { name = 'bottom'; }\n else if (name === 'bottom') { name = 'top' ; }\n }\n\n if (name === 'left' ) { return page.x < ((width >= 0? rect.left: rect.right ) + margin); }\n if (name === 'top' ) { return page.y < ((height >= 0? rect.top : rect.bottom) + margin); }\n\n if (name === 'right' ) { return page.x > ((width >= 0? rect.right : rect.left) - margin); }\n if (name === 'bottom') { return page.y > ((height >= 0? rect.bottom: rect.top ) - margin); }\n }\n\n // the remaining checks require an element\n if (!utils.is.element(element)) { return false; }\n\n return utils.is.element(value)\n // the value is an element to use as a resize handle\n ? value === element\n // otherwise check if element matches value as selector\n : utils.matchesUpTo(element, value, interactableElement);\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.resizeAxes = 'xy';\n});\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action }) {\n if (action !== 'resize' || !interaction.resizeAxes) { return; }\n\n const options = interaction.target.options;\n\n if (options.resize.square) {\n if (interaction.resizeAxes === 'y') {\n iEvent.dx = iEvent.dy;\n }\n else {\n iEvent.dy = iEvent.dx;\n }\n iEvent.axes = 'xy';\n }\n else {\n iEvent.axes = interaction.resizeAxes;\n\n if (interaction.resizeAxes === 'x') {\n iEvent.dy = 0;\n }\n else if (interaction.resizeAxes === 'y') {\n iEvent.dx = 0;\n }\n }\n});\n\nactions.resize = resize;\nactions.names.push('resize');\nutils.merge(Interactable.eventTypes, [\n 'resizestart',\n 'resizemove',\n 'resizeinertiastart',\n 'resizeinertiaresume',\n 'resizeend',\n]);\nactions.methodDict.resize = 'resizable';\n\ndefaultOptions.resize = resize.defaults;\n\nmodule.exports = resize;\n","const raf = require('./utils/raf');\nconst getWindow = require('./utils/window').getWindow;\nconst is = require('./utils/is');\nconst domUtils = require('./utils/domUtils');\nconst Interaction = require('./Interaction');\nconst defaultOptions = require('./defaultOptions');\n\nconst autoScroll = {\n defaults: {\n enabled : false,\n container: null, // the item that is scrolled (Window or HTMLElement)\n margin : 60,\n speed : 300, // the scroll speed in pixels per second\n },\n\n interaction: null,\n i: null, // the handle returned by window.setInterval\n x: 0, y: 0, // Direction each pulse is to scroll in\n\n isScrolling: false,\n prevTime: 0,\n\n start: function (interaction) {\n autoScroll.isScrolling = true;\n raf.cancel(autoScroll.i);\n\n autoScroll.interaction = interaction;\n autoScroll.prevTime = new Date().getTime();\n autoScroll.i = raf.request(autoScroll.scroll);\n },\n\n stop: function () {\n autoScroll.isScrolling = false;\n raf.cancel(autoScroll.i);\n },\n\n // scroll the window by the values in scroll.x/y\n scroll: function () {\n const options = autoScroll.interaction.target.options[autoScroll.interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(autoScroll.interaction.element);\n const now = new Date().getTime();\n // change in time in seconds\n const dt = (now - autoScroll.prevTime) / 1000;\n // displacement\n const s = options.speed * dt;\n\n if (s >= 1) {\n if (is.window(container)) {\n container.scrollBy(autoScroll.x * s, autoScroll.y * s);\n }\n else if (container) {\n container.scrollLeft += autoScroll.x * s;\n container.scrollTop += autoScroll.y * s;\n }\n\n autoScroll.prevTime = now;\n }\n\n if (autoScroll.isScrolling) {\n raf.cancel(autoScroll.i);\n autoScroll.i = raf.request(autoScroll.scroll);\n }\n },\n check: function (interactable, actionName) {\n const options = interactable.options;\n\n return options[actionName].autoScroll && options[actionName].autoScroll.enabled;\n },\n onInteractionMove: function ({ interaction, pointer }) {\n if (!(interaction.interacting()\n && autoScroll.check(interaction.target, interaction.prepared.name))) {\n return;\n }\n\n if (interaction.simulation) {\n autoScroll.x = autoScroll.y = 0;\n return;\n }\n\n let top;\n let right;\n let bottom;\n let left;\n\n const options = interaction.target.options[interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(interaction.element);\n\n if (is.window(container)) {\n left = pointer.clientX < autoScroll.margin;\n top = pointer.clientY < autoScroll.margin;\n right = pointer.clientX > container.innerWidth - autoScroll.margin;\n bottom = pointer.clientY > container.innerHeight - autoScroll.margin;\n }\n else {\n const rect = domUtils.getElementClientRect(container);\n\n left = pointer.clientX < rect.left + autoScroll.margin;\n top = pointer.clientY < rect.top + autoScroll.margin;\n right = pointer.clientX > rect.right - autoScroll.margin;\n bottom = pointer.clientY > rect.bottom - autoScroll.margin;\n }\n\n autoScroll.x = (right ? 1: left? -1: 0);\n autoScroll.y = (bottom? 1: top? -1: 0);\n\n if (!autoScroll.isScrolling) {\n // set the autoScroll properties to those of the target\n autoScroll.margin = options.margin;\n autoScroll.speed = options.speed;\n\n autoScroll.start(interaction);\n }\n },\n};\n\nInteraction.signals.on('stop-active', function () {\n autoScroll.stop();\n});\n\nInteraction.signals.on('action-move', autoScroll.onInteractionMove);\n\ndefaultOptions.perAction.autoScroll = autoScroll.defaults;\n\nmodule.exports = autoScroll;\n","const Interactable = require('../Interactable');\nconst actions = require('../actions/base');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.ignoreFrom\n [ method ]\n *\n * If the target of the `mousedown`, `pointerdown` or `touchstart`\n * event or any of it's parents match the given CSS selector or\n * Element, no drag/resize/gesture is started.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to not ignore any elements\n = (string | Element | object) The current ignoreFrom value or this Interactable\n **\n | interact(element, { ignoreFrom: document.getElementById('no-action') });\n | // or\n | interact(element).ignoreFrom('input, textarea, a');\n\\*/\nInteractable.prototype.ignoreFrom = function (newValue) {\n return this._backCompatOption('ignoreFrom', newValue);\n};\n\n/*\\\n * Interactable.allowFrom\n [ method ]\n *\n * A drag/resize/gesture is started only If the target of the\n * `mousedown`, `pointerdown` or `touchstart` event or any of it's\n * parents match the given CSS selector or Element.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to allow from any element\n = (string | Element | object) The current allowFrom value or this Interactable\n **\n | interact(element, { allowFrom: document.getElementById('drag-handle') });\n | // or\n | interact(element).allowFrom('.handle');\n\\*/\nInteractable.prototype.allowFrom = function (newValue) {\n return this._backCompatOption('allowFrom', newValue);\n};\n\nInteractable.prototype.testIgnore = function (ignoreFrom, interactableElement, element) {\n if (!ignoreFrom || !is.element(element)) { return false; }\n\n if (is.string(ignoreFrom)) {\n return domUtils.matchesUpTo(element, ignoreFrom, interactableElement);\n }\n else if (is.element(ignoreFrom)) {\n return domUtils.nodeContains(ignoreFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testAllow = function (allowFrom, interactableElement, element) {\n if (!allowFrom) { return true; }\n\n if (!is.element(element)) { return false; }\n\n if (is.string(allowFrom)) {\n return domUtils.matchesUpTo(element, allowFrom, interactableElement);\n }\n else if (is.element(allowFrom)) {\n return domUtils.nodeContains(allowFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testIgnoreAllow = function (options, interactableElement, eventTarget) {\n return (!this.testIgnore(options.ignoreFrom, interactableElement, eventTarget)\n && this.testAllow(options.allowFrom, interactableElement, eventTarget));\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (event.buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\n","const interact = require('../interact');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst actions = require('../actions/base');\nconst defaultOptions = require('../defaultOptions');\nconst browser = require('../utils/browser');\nconst scope = require('../scope');\nconst utils = require('../utils');\nconst signals = require('../utils/Signals').new();\n\nrequire('./InteractableMethods');\n\nconst autoStart = {\n signals,\n withinInteractionLimit,\n // Allow this many interactions to happen simultaneously\n maxInteractions: Infinity,\n defaults: {\n perAction: {\n manualStart: false,\n max: Infinity,\n maxPerElement: 1,\n allowFrom: null,\n ignoreFrom: null,\n },\n },\n setActionDefaults: function (action) {\n utils.extend(action.defaults, autoStart.defaults.perAction);\n },\n};\n\n// set cursor style on mousedown\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget }) {\n if (interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\n// set cursor style on mousemove\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget }) {\n if (!interaction.mouse\n || interaction.pointerIsDown\n || interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\nInteraction.signals.on('move', function (arg) {\n const { interaction, event } = arg;\n\n if (!interaction.pointerIsDown\n || interaction.interacting()\n || !interaction.pointerWasMoved\n || !interaction.prepared.name) {\n return;\n }\n\n signals.fire('before-start', arg);\n\n const target = interaction.target;\n\n if (interaction.prepared.name && target) {\n // check manualStart and interaction limit\n if (target.options[interaction.prepared.name].manualStart\n || !withinInteractionLimit(target, interaction.element, interaction.prepared)) {\n interaction.stop(event);\n }\n else {\n interaction.start(interaction.prepared, target, interaction.element);\n }\n }\n});\n\n// Check if the current target supports the action.\n// If so, return the validated action. Otherwise, return null\nfunction validateAction (action, interactable, element, eventTarget) {\n if (utils.is.object(action)\n && interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget)\n && interactable.options[action.name].enabled\n && withinInteractionLimit(interactable, element, action)) {\n return action;\n }\n\n return null;\n}\n\nfunction validateSelector (interaction, pointer, event, matches, matchElements, eventTarget) {\n for (let i = 0, len = matches.length; i < len; i++) {\n const match = matches[i];\n const matchElement = matchElements[i];\n const action = validateAction(match.getAction(pointer, event, interaction, matchElement),\n match,\n matchElement,\n eventTarget);\n\n if (action) {\n return {\n action,\n target: match,\n element: matchElement,\n };\n }\n }\n\n return {};\n}\n\nfunction getActionInfo (interaction, pointer, event, eventTarget) {\n let matches = [];\n let matchElements = [];\n\n let element = eventTarget;\n let action = null;\n\n function pushMatches (interactable, selector, context) {\n const elements = (browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined);\n\n if (utils.matchesSelector(element, selector, elements)) {\n\n matches.push(interactable);\n matchElements.push(element);\n }\n }\n\n while (utils.is.element(element)) {\n matches = [];\n matchElements = [];\n\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && (action = validateAction(elementInteractable.getAction(pointer, event, interaction, element, eventTarget),\n elementInteractable,\n element,\n eventTarget))\n && !elementInteractable.options[action.name].manualStart) {\n return {\n element,\n action,\n target: elementInteractable,\n };\n }\n else {\n scope.interactables.forEachSelector(pushMatches, element);\n\n const actionInfo = validateSelector(interaction, pointer, event, matches, matchElements, eventTarget);\n\n if (actionInfo.action\n && !actionInfo.target.options[actionInfo.action.name].manualStart) {\n return actionInfo;\n }\n }\n\n element = utils.parentNode(element);\n }\n\n return {};\n}\n\nfunction prepare (interaction, { action, target, element }) {\n action = action || {};\n\n if (interaction.target && interaction.target.options.styleCursor) {\n interaction.target._doc.documentElement.style.cursor = '';\n }\n\n interaction.target = target;\n interaction.element = element;\n utils.copyAction(interaction.prepared, action);\n\n if (target && target.options.styleCursor) {\n const cursor = action? actions[action.name].getCursor(action) : '';\n interaction.target._doc.documentElement.style.cursor = cursor;\n }\n\n signals.fire('prepared', { interaction: interaction });\n}\n\nInteraction.signals.on('stop', function ({ interaction }) {\n const target = interaction.target;\n\n if (target && target.options.styleCursor) {\n target._doc.documentElement.style.cursor = '';\n }\n});\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (utils.is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (utils.is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n const buttons = event.buttons || ({\n 0: 1,\n 1: 4,\n 3: 8,\n 4: 16,\n })[event.button];\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\nfunction withinInteractionLimit (interactable, element, action) {\n const options = interactable.options;\n const maxActions = options[action.name].max;\n const maxPerElement = options[action.name].maxPerElement;\n let activeInteractions = 0;\n let targetCount = 0;\n let targetElementCount = 0;\n\n // no actions if any of these values == 0\n if (!(maxActions && maxPerElement && autoStart.maxInteractions)) { return; }\n\n for (let i = 0, len = scope.interactions.length; i < len; i++) {\n const interaction = scope.interactions[i];\n const otherAction = interaction.prepared.name;\n\n if (!interaction.interacting()) { continue; }\n\n activeInteractions++;\n\n if (activeInteractions >= autoStart.maxInteractions) {\n return false;\n }\n\n if (interaction.target !== interactable) { continue; }\n\n targetCount += (otherAction === action.name)|0;\n\n if (targetCount >= maxActions) {\n return false;\n }\n\n if (interaction.element === element) {\n targetElementCount++;\n\n if (otherAction !== action.name || targetElementCount >= maxPerElement) {\n return false;\n }\n }\n }\n\n return autoStart.maxInteractions > 0;\n}\n\n/*\\\n * interact.maxInteractions\n [ method ]\n **\n * Returns or sets the maximum number of concurrent interactions allowed.\n * By default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables\n * and elements, you need to enable it in the draggable, resizable and\n * gesturable `'max'` and `'maxPerElement'` options.\n **\n - newValue (number) #optional Any number. newValue <= 0 means no interactions.\n\\*/\ninteract.maxInteractions = function (newValue) {\n if (utils.is.number(newValue)) {\n autoStart.maxInteractions = newValue;\n\n return this;\n }\n\n return autoStart.maxInteractions;\n};\n\nInteractable.settingsMethods.push('styleCursor');\nInteractable.settingsMethods.push('actionChecker');\nInteractable.settingsMethods.push('ignoreFrom');\nInteractable.settingsMethods.push('allowFrom');\n\ndefaultOptions.base.actionChecker = null;\ndefaultOptions.base.styleCursor = true;\n\nutils.extend(defaultOptions.perAction, autoStart.defaults.perAction);\n\nmodule.exports = autoStart;\n","const autoStart = require('./base');\nconst Interaction = require('../Interaction');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.delayTimer = null;\n});\n\nautoStart.signals.on('prepared', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.delayTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.target, interaction.element);\n }, delay);\n }\n});\n\nInteraction.signals.on('move', function ({ interaction, duplicate }) {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.delayTimer);\n }\n});\n\n// prevent regular down->move autoStart\nautoStart.signals.on('before-start', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.prepared.name = null;\n }\n});\n","const autoStart = require('./base');\nconst scope = require('../scope');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\n\nconst { matchesSelector, parentNode } = require('../utils/domUtils');\n\nautoStart.setActionDefaults(require('../actions/drag'));\n\nautoStart.signals.on('before-start', function ({ interaction, eventTarget, dx, dy }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // check if a drag is in the correct axis\n const absX = Math.abs(dx);\n const absY = Math.abs(dy);\n const options = interaction.target.options.drag;\n const startAxis = options.startAxis;\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy');\n\n interaction.prepared.axis = options.lockAxis === 'start'\n ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n : options.lockAxis;\n\n // if the movement isn't in the startAxis of the interactable\n if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) {\n // cancel the prepared action\n interaction.prepared.name = null;\n\n // then try to get a drag from another ineractable\n\n if (!interaction.prepared.name) {\n\n let element = eventTarget;\n\n const getDraggable = function (interactable, selector, context) {\n const elements = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n if (interactable === interaction.target) { return; }\n\n if (!options.manualStart\n && !interactable.testIgnoreAllow(options, element, eventTarget)\n && matchesSelector(element, selector, elements)) {\n\n const action = interactable.getAction(interaction.downPointer,\n interaction.downEvent,\n interaction,\n element);\n\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, interactable)\n && autoStart.validateAction(action, interactable, element, eventTarget)) {\n\n return interactable;\n }\n }\n };\n\n let action = null;\n\n // check all interactables\n while (is.element(element)) {\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && elementInteractable !== interaction.target\n && !elementInteractable.options.drag.manualStart) {\n\n action = elementInteractable.getAction(interaction.downPointer, interaction.downEvent, interaction, element);\n }\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, elementInteractable)) {\n\n interaction.prepared.name = 'drag';\n interaction.target = elementInteractable;\n interaction.element = element;\n break;\n }\n\n const selectorInteractable = scope.interactables.forEachSelector(getDraggable, element);\n\n if (selectorInteractable) {\n interaction.prepared.name = 'drag';\n interaction.target = selectorInteractable;\n interaction.element = element;\n break;\n }\n\n element = parentNode(element);\n }\n }\n }\n});\n\nfunction checkStartAxis (startAxis, interactable) {\n if (!interactable) { return false; }\n\n const thisAxis = interactable.options.drag.startAxis;\n\n return (startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis);\n}\n","require('./base').setActionDefaults(require('../actions/gesture'));\n","require('./base').setActionDefaults(require('../actions/resize'));\n","module.exports = {\n base: {\n accept : null,\n preventDefault: 'auto',\n deltaSource : 'page',\n },\n\n perAction: {\n origin: { x: 0, y: 0 },\n\n // only allow left button by default\n // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n mouseButtons: 1,\n\n inertia: {\n enabled : false,\n resistance : 10, // the lambda in exponential decay\n minSpeed : 100, // target speed must be above this for inertia to start\n endSpeed : 10, // the speed at which inertia is slow enough to stop\n allowResume : true, // allow resuming an action in inertia phase\n smoothEndDuration: 300, // animate to snap/restrict endOnly if there's no inertia\n },\n },\n};\n","/* browser entry point */\n\n// Legacy browser support\nrequire('./legacyBrowsers');\n\n// inertia\nrequire('./inertia');\n\n// modifiers\nrequire('./modifiers/snap');\nrequire('./modifiers/restrict');\n\n// pointerEvents\nrequire('./pointerEvents/base');\nrequire('./pointerEvents/holdRepeat');\nrequire('./pointerEvents/interactableTargets');\n\n// delay\nrequire('./autoStart/delay');\n\n// actions\nrequire('./actions/gesture');\nrequire('./actions/resize');\nrequire('./actions/drag');\nrequire('./actions/drop');\n\n// load these modifiers after resize is loaded\nrequire('./modifiers/snapSize');\nrequire('./modifiers/restrictEdges');\nrequire('./modifiers/restrictSize');\n\n// autoStart actions\nrequire('./autoStart/gesture');\nrequire('./autoStart/resize');\nrequire('./autoStart/drag');\n\n// Interactable preventDefault setting\nrequire('./interactablePreventDefault.js');\n\n// autoScroll\nrequire('./autoScroll');\n\n// export interact\nmodule.exports = require('./interact');\n","const InteractEvent = require('./InteractEvent');\nconst Interaction = require('./Interaction');\nconst modifiers = require('./modifiers');\nconst utils = require('./utils');\nconst animationFrame = require('./utils/raf');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.inertiaStatus = {\n active : false,\n smoothEnd : false,\n allowResume: false,\n\n startEvent: null,\n upCoords : {},\n\n xe: 0, ye: 0,\n sx: 0, sy: 0,\n\n t0: 0,\n vx0: 0, vys: 0,\n duration: 0,\n\n lambda_v0: 0,\n one_ve_v0: 0,\n i : null,\n };\n\n interaction.boundInertiaFrame = () => inertiaFrame .apply(interaction);\n interaction.boundSmoothEndFrame = () => smoothEndFrame.apply(interaction);\n});\n\nInteraction.signals.on('down', function ({ interaction, event, pointer, eventTarget }) {\n const status = interaction.inertiaStatus;\n\n // Check if the down event hits the current inertia target\n if (status.active) {\n let element = eventTarget;\n\n // climb up the DOM tree from the event target\n while (utils.is.element(element)) {\n\n // if interaction element is the current inertia target element\n if (element === interaction.element) {\n // stop inertia\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n\n // update pointers to the down event's coordinates\n interaction.updatePointer(pointer);\n utils.setCoords(interaction.curCoords, interaction.pointers);\n\n // fire appropriate signals\n const signalArg = { interaction };\n Interaction.signals.fire('before-action-move', signalArg);\n Interaction.signals.fire('action-resume' , signalArg);\n\n // fire a reume event\n const resumeEvent = new InteractEvent(interaction,\n event,\n interaction.prepared.name,\n 'inertiaresume',\n interaction.element);\n\n interaction.target.fire(resumeEvent);\n interaction.prevEvent = resumeEvent;\n modifiers.resetStatuses(interaction.modifierStatuses);\n\n utils.copyCoords(interaction.prevCoords, interaction.curCoords);\n break;\n }\n\n element = utils.parentNode(element);\n }\n }\n});\n\nInteraction.signals.on('up', function ({ interaction, event }) {\n const status = interaction.inertiaStatus;\n\n if (!interaction.interacting() || status.active) { return; }\n\n const target = interaction.target;\n const options = target && target.options;\n const inertiaOptions = options && interaction.prepared.name && options[interaction.prepared.name].inertia;\n\n const now = new Date().getTime();\n const statuses = {};\n const page = utils.extend({}, interaction.curCoords.page);\n const pointerSpeed = interaction.pointerDelta.client.speed;\n\n let smoothEnd = false;\n let modifierResult;\n\n // check if inertia should be started\n const inertiaPossible = (inertiaOptions && inertiaOptions.enabled\n && interaction.prepared.name !== 'gesture'\n && event !== status.startEvent);\n\n const inertia = (inertiaPossible\n && (now - interaction.curCoords.timeStamp) < 50\n && pointerSpeed > inertiaOptions.minSpeed\n && pointerSpeed > inertiaOptions.endSpeed);\n\n const modifierArg = {\n interaction,\n pageCoords: page,\n statuses,\n preEnd: true,\n requireEndOnly: true,\n };\n\n // smoothEnd\n if (inertiaPossible && !inertia) {\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n if (modifierResult.shouldMove && modifierResult.locked) {\n smoothEnd = true;\n }\n }\n\n if (!(inertia || smoothEnd)) { return; }\n\n utils.copyCoords(status.upCoords, interaction.curCoords);\n\n interaction.pointers[0] = status.startEvent =\n new InteractEvent(interaction, event, interaction.prepared.name, 'inertiastart', interaction.element);\n\n status.t0 = now;\n\n status.active = true;\n status.allowResume = inertiaOptions.allowResume;\n interaction.simulation = status;\n\n target.fire(status.startEvent);\n\n if (inertia) {\n status.vx0 = interaction.pointerDelta.client.vx;\n status.vy0 = interaction.pointerDelta.client.vy;\n status.v0 = pointerSpeed;\n\n calcInertia(interaction, status);\n\n utils.extend(page, interaction.curCoords.page);\n\n page.x += status.xe;\n page.y += status.ye;\n\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n status.modifiedXe += modifierResult.dx;\n status.modifiedYe += modifierResult.dy;\n\n status.i = animationFrame.request(interaction.boundInertiaFrame);\n }\n else {\n status.smoothEnd = true;\n status.xe = modifierResult.dx;\n status.ye = modifierResult.dy;\n\n status.sx = status.sy = 0;\n\n status.i = animationFrame.request(interaction.boundSmoothEndFrame);\n }\n});\n\nInteraction.signals.on('stop-active', function ({ interaction }) {\n const status = interaction.inertiaStatus;\n\n if (status.active) {\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n }\n});\n\nfunction calcInertia (interaction, status) {\n const inertiaOptions = interaction.target.options[interaction.prepared.name].inertia;\n const lambda = inertiaOptions.resistance;\n const inertiaDur = -Math.log(inertiaOptions.endSpeed / status.v0) / lambda;\n\n status.x0 = interaction.prevEvent.pageX;\n status.y0 = interaction.prevEvent.pageY;\n status.t0 = status.startEvent.timeStamp / 1000;\n status.sx = status.sy = 0;\n\n status.modifiedXe = status.xe = (status.vx0 - inertiaDur) / lambda;\n status.modifiedYe = status.ye = (status.vy0 - inertiaDur) / lambda;\n status.te = inertiaDur;\n\n status.lambda_v0 = lambda / status.v0;\n status.one_ve_v0 = 1 - inertiaOptions.endSpeed / status.v0;\n}\n\nfunction inertiaFrame () {\n updateInertiaCoords(this);\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n\n const status = this.inertiaStatus;\n const options = this.target.options[this.prepared.name].inertia;\n const lambda = options.resistance;\n const t = new Date().getTime() / 1000 - status.t0;\n\n if (t < status.te) {\n\n const progress = 1 - (Math.exp(-lambda * t) - status.lambda_v0) / status.one_ve_v0;\n\n if (status.modifiedXe === status.xe && status.modifiedYe === status.ye) {\n status.sx = status.xe * progress;\n status.sy = status.ye * progress;\n }\n else {\n const quadPoint = utils.getQuadraticCurvePoint(0, 0,\n status.xe,\n status.ye,\n status.modifiedXe,\n status.modifiedYe,\n progress);\n\n status.sx = quadPoint.x;\n status.sy = quadPoint.y;\n }\n\n this.doMove();\n\n status.i = animationFrame.request(this.boundInertiaFrame);\n }\n else {\n status.sx = status.modifiedXe;\n status.sy = status.modifiedYe;\n\n this.doMove();\n this.end(status.startEvent);\n status.active = false;\n this.simulation = null;\n }\n\n utils.copyCoords(this.prevCoords, this.curCoords);\n}\n\nfunction smoothEndFrame () {\n updateInertiaCoords(this);\n\n const status = this.inertiaStatus;\n const t = new Date().getTime() - status.t0;\n const duration = this.target.options[this.prepared.name].inertia.smoothEndDuration;\n\n if (t < duration) {\n status.sx = utils.easeOutQuad(t, 0, status.xe, duration);\n status.sy = utils.easeOutQuad(t, 0, status.ye, duration);\n\n this.pointerMove(status.startEvent, status.startEvent);\n\n status.i = animationFrame.request(this.boundSmoothEndFrame);\n }\n else {\n status.sx = status.xe;\n status.sy = status.ye;\n\n this.pointerMove(status.startEvent, status.startEvent);\n this.end(status.startEvent);\n\n status.smoothEnd =\n status.active = false;\n this.simulation = null;\n }\n}\n\nfunction updateInertiaCoords (interaction) {\n const status = interaction.inertiaStatus;\n\n // return if inertia isn't running\n if (!status.active) { return; }\n\n const pageUp = status.upCoords.page;\n const clientUp = status.upCoords.client;\n\n utils.setCoords(interaction.curCoords, [ {\n pageX : pageUp.x + status.sx,\n pageY : pageUp.y + status.sy,\n clientX: clientUp.x + status.sx,\n clientY: clientUp.y + status.sy,\n } ]);\n}\n","const browser = require('./utils/browser');\nconst events = require('./utils/events');\nconst utils = require('./utils');\nconst scope = require('./scope');\nconst Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\n\nconst globalEvents = {};\n\n/*\\\n * interact\n [ method ]\n *\n * The methods of this variable can be used to set elements as\n * interactables and also to change various default settings.\n *\n * Calling it as a function and passing an element or a valid CSS selector\n * string returns an Interactable object which has various methods to\n * configure it.\n *\n - element (Element | string) The HTML or SVG Element to interact with or CSS selector\n = (object) An @Interactable\n *\n > Usage\n | interact('#draggable').draggable(true);\n |\n | var rectables = interact('rect');\n | rectables\n | .gesturable(true)\n | .on('gesturemove', function (event) {\n | // ...\n | });\n\\*/\nfunction interact (element, options) {\n let interactable = scope.interactables.get(element, options);\n\n if (!interactable) {\n interactable = new Interactable(element, options);\n interactable.events.global = globalEvents;\n }\n\n return interactable;\n}\n\n/*\\\n * interact.isSet\n [ method ]\n *\n * Check if an element has been set\n - element (Element) The Element being searched for\n = (boolean) Indicates if the element or CSS selector was previously passed to interact\n\\*/\ninteract.isSet = function (element, options) {\n return scope.interactables.indexOfElement(element, options && options.context) !== -1;\n};\n\n/*\\\n * interact.on\n [ method ]\n *\n * Adds a global listener for an InteractEvent or adds a DOM event to\n * `document`\n *\n - type (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) interact\n\\*/\ninteract.on = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.on(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.on(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n // if it is an InteractEvent type, add listener to globalEvents\n if (utils.contains(Interactable.eventTypes, type)) {\n // if this type of event was never bound\n if (!globalEvents[type]) {\n globalEvents[type] = [listener];\n }\n else {\n globalEvents[type].push(listener);\n }\n }\n // If non InteractEvent type, addEventListener to document\n else {\n events.add(scope.document, type, listener, { options });\n }\n\n return interact;\n};\n\n/*\\\n * interact.off\n [ method ]\n *\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n - type (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) interact\n \\*/\ninteract.off = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.off(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.off(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n if (!utils.contains(Interactable.eventTypes, type)) {\n events.remove(scope.document, type, listener, options);\n }\n else {\n let index;\n\n if (type in globalEvents\n && (index = utils.indexOf(globalEvents[type], listener)) !== -1) {\n globalEvents[type].splice(index, 1);\n }\n }\n\n return interact;\n};\n\n/*\\\n * interact.debug\n [ method ]\n *\n * Returns an object which exposes internal data\n = (object) An object with properties that outline the current state and expose internal functions and variables\n\\*/\ninteract.debug = function () {\n return scope;\n};\n\n// expose the functions used to calculate multi-touch properties\ninteract.getPointerAverage = utils.pointerAverage;\ninteract.getTouchBBox = utils.touchBBox;\ninteract.getTouchDistance = utils.touchDistance;\ninteract.getTouchAngle = utils.touchAngle;\n\ninteract.getElementRect = utils.getElementRect;\ninteract.getElementClientRect = utils.getElementClientRect;\ninteract.matchesSelector = utils.matchesSelector;\ninteract.closest = utils.closest;\n\n/*\\\n * interact.supportsTouch\n [ method ]\n *\n = (boolean) Whether or not the browser supports touch input\n\\*/\ninteract.supportsTouch = function () {\n return browser.supportsTouch;\n};\n\n/*\\\n * interact.supportsPointerEvent\n [ method ]\n *\n = (boolean) Whether or not the browser supports PointerEvents\n\\*/\ninteract.supportsPointerEvent = function () {\n return browser.supportsPointerEvent;\n};\n\n/*\\\n * interact.stop\n [ method ]\n *\n * Cancels all interactions (end events are not fired)\n *\n - event (Event) An event on which to call preventDefault()\n = (object) interact\n\\*/\ninteract.stop = function (event) {\n for (let i = scope.interactions.length - 1; i >= 0; i--) {\n scope.interactions[i].stop(event);\n }\n\n return interact;\n};\n\n/*\\\n * interact.pointerMoveTolerance\n [ method ]\n * Returns or sets the distance the pointer must be moved before an action\n * sequence occurs. This also affects tolerance for tap events.\n *\n - newValue (number) #optional The movement from the start position must be greater than this value\n = (number | Interactable) The current setting or interact\n\\*/\ninteract.pointerMoveTolerance = function (newValue) {\n if (utils.is.number(newValue)) {\n Interaction.pointerMoveTolerance = newValue;\n\n return this;\n }\n\n return Interaction.pointerMoveTolerance;\n};\n\ninteract.addDocument = scope.addDocument;\ninteract.removeDocument = scope.removeDocument;\n\nscope.interact = interact;\n\nmodule.exports = interact;\n","const Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\nconst scope = require('./scope');\nconst is = require('./utils/is');\nconst events = require('./utils/events');\n\nconst { nodeContains, matchesSelector } = require('./utils/domUtils');\n\n/*\\\n * Interactable.preventDefault\n [ method ]\n *\n * Returns or sets whether to prevent the browser's default behaviour\n * in response to pointer events. Can be set to:\n * - `'always'` to always prevent\n * - `'never'` to never prevent\n * - `'auto'` to let interact.js try to determine what would be best\n *\n - newValue (string) #optional `true`, `false` or `'auto'`\n = (string | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.preventDefault = function (newValue) {\n if (/^(always|never|auto)$/.test(newValue)) {\n this.options.preventDefault = newValue;\n return this;\n }\n\n if (is.bool(newValue)) {\n this.options.preventDefault = newValue? 'always' : 'never';\n return this;\n }\n\n return this.options.preventDefault;\n};\n\nInteractable.prototype.checkAndPreventDefault = function (event) {\n const setting = this.options.preventDefault;\n\n if (setting === 'never') { return; }\n\n if (setting === 'always') {\n event.preventDefault();\n return;\n }\n\n // setting === 'auto'\n\n // don't preventDefault if the browser supports passiveEvents\n // CSS touch-action and user-selecct should be used instead\n if (events.supportsOptions) {\n return;\n }\n\n // don't preventDefault of pointerdown events\n if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) {\n return;\n }\n\n // don't preventDefault on editable elements\n if (is.element(event.target)\n && matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) {\n return;\n }\n\n event.preventDefault();\n};\n\nfunction onInteractionEvent ({ interaction, event }) {\n if (interaction.target) {\n interaction.target.checkAndPreventDefault(event);\n }\n}\n\nfor (const eventSignal of ['down', 'move', 'up', 'cancel']) {\n Interaction.signals.on(eventSignal, onInteractionEvent);\n}\n\n// prevent native HTML5 drag on interact.js target elements\nInteraction.docEvents.dragstart = function preventNativeDrag (event) {\n for (const interaction of scope.interactions) {\n\n if (interaction.element\n && (interaction.element === event.target\n || nodeContains(interaction.element, event.target))) {\n\n interaction.target.checkAndPreventDefault(event);\n return;\n }\n }\n};\n","const scope = require('./scope');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst iFinder = require('./utils/interactionFinder');\nconst pointerEvents = require('./pointerEvents/base');\n\nconst { window } = require('./utils/window');\n\nconst toString = Object.prototype.toString;\n\nif (!window.Array.isArray) {\n window.Array.isArray = function (obj) {\n return toString.call(obj) === '[object Array]';\n };\n}\n\nif (!String.prototype.trim) {\n String.prototype.trim = function () {\n return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n };\n}\n\n// http://www.quirksmode.org/dom/events/click.html\n// >Events leading to dblclick\n//\n// IE8 doesn't fire down event before dblclick.\n// This workaround tries to fire a tap and doubletap after dblclick\nfunction onIE8Dblclick (event) {\n const eventTarget = event.target;\n const interaction = iFinder.search(event, event.type, eventTarget);\n\n if (!interaction) { return; }\n\n if (interaction.prevTap\n && event.clientX === interaction.prevTap.clientX\n && event.clientY === interaction.prevTap.clientY\n && eventTarget === interaction.prevTap.target) {\n\n interaction.downTargets[0] = eventTarget;\n interaction.downTimes [0] = new Date().getTime();\n\n pointerEvents.fire({\n interaction,\n event,\n eventTarget,\n pointer: event,\n type: 'tap',\n });\n }\n}\n\nif (browser.isIE8) {\n const selectFix = function (event) {\n for (const interaction of scope.interactions) {\n if (interaction.interacting()) {\n interaction.target.checkAndPreventDefault(event);\n }\n }\n };\n\n const onDocIE8 = function onDocIE8 ({ doc, win }, signalName) {\n const eventMethod = signalName.indexOf('listen') === 0\n ? events.add : events.remove;\n\n // For IE's lack of Event#preventDefault\n eventMethod(doc, 'selectstart', selectFix);\n\n if (pointerEvents) {\n eventMethod(doc, 'dblclick', onIE8Dblclick);\n }\n };\n\n scope.signals.on('add-document' , onDocIE8);\n scope.signals.on('remove-document', onDocIE8);\n}\n\nmodule.exports = null;\n","const InteractEvent = require('../InteractEvent');\nconst Interaction = require('../Interaction');\nconst extend = require('../utils/extend');\n\nconst modifiers = {\n names: [],\n\n setOffsets: function (arg) {\n const { interaction, pageCoords: page } = arg;\n const { target, element, startOffset } = interaction;\n const rect = target.getRect(element);\n\n if (rect) {\n startOffset.left = page.x - rect.left;\n startOffset.top = page.y - rect.top;\n\n startOffset.right = rect.right - page.x;\n startOffset.bottom = rect.bottom - page.y;\n\n if (!('width' in rect)) { rect.width = rect.right - rect.left; }\n if (!('height' in rect)) { rect.height = rect.bottom - rect.top ; }\n }\n else {\n startOffset.left = startOffset.top = startOffset.right = startOffset.bottom = 0;\n }\n\n arg.rect = rect;\n arg.interactable = target;\n arg.element = element;\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n\n arg.options = target.options[interaction.prepared.name][modifierName];\n\n if (!arg.options) {\n continue;\n }\n\n interaction.modifierOffsets[modifierName] = modifiers[modifierName].setOffset(arg);\n }\n },\n\n setAll: function (arg) {\n const { interaction, statuses, preEnd, requireEndOnly } = arg;\n const coords = extend({}, arg.pageCoords);\n const result = {\n dx: 0,\n dy: 0,\n changed: false,\n locked: false,\n shouldMove: true,\n };\n\n for (const modifierName of modifiers.names) {\n const modifier = modifiers[modifierName];\n const options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!shouldDo(options, preEnd, requireEndOnly)) { continue; }\n\n arg.status = arg.status = statuses[modifierName];\n arg.options = options;\n arg.offset = arg.interaction.modifierOffsets[modifierName];\n\n modifier.set(arg);\n\n if (arg.status.locked) {\n coords.x += arg.status.dx;\n coords.y += arg.status.dy;\n\n result.dx += arg.status.dx;\n result.dy += arg.status.dy;\n\n result.locked = true;\n }\n }\n\n // a move should be fired if:\n // - there are no modifiers enabled,\n // - no modifiers are \"locked\" i.e. have changed the pointer's coordinates, or\n // - the locked coords have changed since the last pointer move\n result.shouldMove = !arg.status || !result.locked || arg.status.changed;\n\n return result;\n },\n\n resetStatuses: function (statuses) {\n for (const modifierName of modifiers.names) {\n const status = statuses[modifierName] || {};\n\n status.dx = status.dy = 0;\n status.modifiedX = status.modifiedY = NaN;\n status.locked = false;\n status.changed = true;\n\n statuses[modifierName] = status;\n }\n\n return statuses;\n },\n\n start: function ({ interaction }, signalName) {\n const arg = {\n interaction,\n pageCoords: (signalName === 'action-resume' ?\n interaction.curCoords : interaction.startCoords).page,\n startOffset: interaction.startOffset,\n statuses: interaction.modifierStatuses,\n preEnd: false,\n requireEndOnly: false,\n };\n\n modifiers.setOffsets(arg);\n modifiers.resetStatuses(arg.statuses);\n\n arg.pageCoords = extend({}, interaction.startCoords.page);\n interaction.modifierResult = modifiers.setAll(arg);\n },\n};\n\nInteraction.signals.on('new', function (interaction) {\n interaction.startOffset = { left: 0, right: 0, top: 0, bottom: 0 };\n interaction.modifierOffsets = {};\n interaction.modifierStatuses = modifiers.resetStatuses({});\n interaction.modifierResult = null;\n});\n\nInteraction.signals.on('action-start' , modifiers.start);\nInteraction.signals.on('action-resume', modifiers.start);\n\nInteraction.signals.on('before-action-move', function ({ interaction, preEnd, interactingBeforeMove }) {\n const modifierResult = modifiers.setAll({\n interaction,\n preEnd,\n pageCoords: interaction.curCoords.page,\n statuses: interaction.modifierStatuses,\n requireEndOnly: false,\n });\n\n // don't fire an action move if a modifier would keep the event in the same\n // cordinates as before\n if (!modifierResult.shouldMove && interactingBeforeMove) {\n interaction._dontFireMove = true;\n }\n\n interaction.modifierResult = modifierResult;\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n for (let i = 0; i < modifiers.names.length; i++) {\n const options = interaction.target.options[interaction.prepared.name][modifiers.names[i]];\n\n // if the endOnly option is true for any modifier\n if (shouldDo(options, true, true)) {\n // fire a move event at the modified coordinates\n interaction.doMove({ event, preEnd: true });\n break;\n }\n }\n});\n\nInteractEvent.signals.on('set-xy', function (arg) {\n const { iEvent, interaction } = arg;\n const modifierArg = extend({}, arg);\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n modifierArg.options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!modifierArg.options) {\n continue;\n }\n\n const modifier = modifiers[modifierName];\n\n modifierArg.status = interaction.modifierStatuses[modifierName];\n\n iEvent[modifierName] = modifier.modifyCoords(modifierArg);\n }\n});\n\nfunction shouldDo (options, preEnd, requireEndOnly) {\n return (options && options.enabled\n && (preEnd || !options.endOnly)\n && (!requireEndOnly || options.endOnly));\n}\n\nmodule.exports = modifiers;\n","const modifiers = require('./index');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst restrict = {\n defaults: {\n enabled : false,\n endOnly : false,\n restriction: null,\n elementRect: null,\n },\n\n setOffset: function ({ rect, startOffset, options }) {\n const elementRect = options && options.elementRect;\n const offset = {};\n\n if (rect && elementRect) {\n offset.left = startOffset.left - (rect.width * elementRect.left);\n offset.top = startOffset.top - (rect.height * elementRect.top);\n\n offset.right = startOffset.right - (rect.width * (1 - elementRect.right));\n offset.bottom = startOffset.bottom - (rect.height * (1 - elementRect.bottom));\n }\n else {\n offset.left = offset.top = offset.right = offset.bottom = 0;\n }\n\n return offset;\n },\n\n set: function ({ pageCoords, interaction, status, options }) {\n if (!options) { return status; }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n\n const restriction = getRestrictionRect(options.restriction, interaction, page);\n\n if (!restriction) { return status; }\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n const rect = restriction;\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n const offset = interaction.modifierOffsets.restrict;\n\n // object is assumed to have\n // x, y, width, height or\n // left, top, right, bottom\n if ('x' in restriction && 'y' in restriction) {\n modifiedX = Math.max(Math.min(rect.x + rect.width - offset.right , page.x), rect.x + offset.left);\n modifiedY = Math.max(Math.min(rect.y + rect.height - offset.bottom, page.y), rect.y + offset.top );\n }\n else {\n modifiedX = Math.max(Math.min(rect.right - offset.right , page.x), rect.left + offset.left);\n modifiedY = Math.max(Math.min(rect.bottom - offset.bottom, page.y), rect.top + offset.top );\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const elementRect = options && options.elementRect;\n\n if (options && options.enabled\n && !(phase === 'start' && elementRect && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n getRestrictionRect,\n};\n\nfunction getRestrictionRect (value, interaction, page) {\n if (utils.is.function(value)) {\n return utils.resolveRectLike(value, interaction.target, interaction.element, [page.x, page.y, interaction]);\n } else {\n return utils.resolveRectLike(value, interaction.target, interaction.element);\n }\n}\n\nmodifiers.restrict = restrict;\nmodifiers.names.push('restrict');\n\ndefaultOptions.perAction.restrict = restrict.defaults;\n\nmodule.exports = restrict;\n","// This module adds the options.resize.restrictEdges setting which sets min and\n// max for the top, left, bottom and right edges of the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictEdges: {\n// inner: { top: 200, left: 200, right: 400, bottom: 400 },\n// outer: { top: 0, left: 0, right: 600, bottom: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst { getRestrictionRect } = require('./restrict');\n\nconst noInner = { top: +Infinity, left: +Infinity, bottom: -Infinity, right: -Infinity };\nconst noOuter = { top: -Infinity, left: -Infinity, bottom: +Infinity, right: +Infinity };\n\nconst restrictEdges = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n offset: null,\n },\n\n setOffset: function ({ interaction, startOffset, options }) {\n if (!options) {\n return utils.extend({}, startOffset);\n }\n\n const offset = getRestrictionRect(options.offset, interaction, interaction.startCoords.page);\n\n if (offset) {\n return {\n top: startOffset.top + offset.y,\n left: startOffset.left + offset.x,\n bottom: startOffset.bottom + offset.y,\n right: startOffset.right + offset.x,\n };\n }\n\n return startOffset;\n },\n\n set: function ({ pageCoords, interaction, status, offset, options }) {\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n const inner = rectUtils.xywhToTlbr(getRestrictionRect(options.inner, interaction, page)) || noInner;\n const outer = rectUtils.xywhToTlbr(getRestrictionRect(options.outer, interaction, page)) || noOuter;\n\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n if (edges.top) {\n modifiedY = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top);\n }\n else if (edges.bottom) {\n modifiedY = Math.max(Math.min(outer.bottom - offset.bottom, page.y), inner.bottom - offset.bottom);\n }\n if (edges.left) {\n modifiedX = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left);\n }\n else if (edges.right) {\n modifiedX = Math.max(Math.min(outer.right - offset.right, page.x), inner.right - offset.right);\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n if (options && options.enabled\n && !(phase === 'start' && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n noInner,\n noOuter,\n getRestrictionRect,\n};\n\nmodifiers.restrictEdges = restrictEdges;\nmodifiers.names.push('restrictEdges');\n\ndefaultOptions.perAction.restrictEdges = restrictEdges.defaults;\nresize.defaults.restrictEdges = restrictEdges.defaults;\n\nmodule.exports = restrictEdges;\n","// This module adds the options.resize.restrictSize setting which sets min and\n// max width and height for the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictSize: {\n// min: { width: -600, height: -600 },\n// max: { width: 600, height: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst restrictEdges = require('./restrictEdges');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst noMin = { width: -Infinity, height: -Infinity };\nconst noMax = { width: +Infinity, height: +Infinity };\n\nconst restrictSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n },\n\n setOffset: function ({ interaction }) {\n return interaction.startOffset;\n },\n\n set: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const rect = rectUtils.xywhToTlbr(interaction.resizeRects.inverted);\n\n const minSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.min, interaction)) || noMin;\n const maxSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.max, interaction)) || noMax;\n\n arg.options = {\n enabled: options.enabled,\n endOnly: options.endOnly,\n inner: utils.extend({}, restrictEdges.noInner),\n outer: utils.extend({}, restrictEdges.noOuter),\n };\n\n if (edges.top) {\n arg.options.inner.top = rect.bottom - minSize.height;\n arg.options.outer.top = rect.bottom - maxSize.height;\n }\n else if (edges.bottom) {\n arg.options.inner.bottom = rect.top + minSize.height;\n arg.options.outer.bottom = rect.top + maxSize.height;\n }\n if (edges.left) {\n arg.options.inner.left = rect.right - minSize.width;\n arg.options.outer.left = rect.right - maxSize.width;\n }\n else if (edges.right) {\n arg.options.inner.right = rect.left + minSize.width;\n arg.options.outer.right = rect.left + maxSize.width;\n }\n\n restrictEdges.set(arg);\n },\n\n modifyCoords: restrictEdges.modifyCoords,\n};\n\nmodifiers.restrictSize = restrictSize;\nmodifiers.names.push('restrictSize');\n\ndefaultOptions.perAction.restrictSize = restrictSize.defaults;\nresize.defaults.restrictSize = restrictSize.defaults;\n\nmodule.exports = restrictSize;\n","const modifiers = require('./index');\nconst interact = require('../interact');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst snap = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n\n relativePoints: null,\n },\n\n setOffset: function ({ interaction, interactable, element, rect, startOffset, options }) {\n const offsets = [];\n const optionsOrigin = utils.rectToXY(utils.resolveRectLike(options.origin));\n const origin = optionsOrigin || utils.getOriginXY(interactable, element, interaction.prepared.name);\n options = options || interactable.options[interaction.prepared.name].snap || {};\n\n let snapOffset;\n\n if (options.offset === 'startCoords') {\n snapOffset = {\n x: interaction.startCoords.page.x - origin.x,\n y: interaction.startCoords.page.y - origin.y,\n };\n }\n else {\n const offsetRect = utils.resolveRectLike(options.offset, interactable, element, [interaction]);\n\n snapOffset = utils.rectToXY(offsetRect) || { x: 0, y: 0 };\n }\n\n if (rect && options.relativePoints && options.relativePoints.length) {\n for (const { x: relativeX, y: relativeY } of options.relativePoints) {\n offsets.push({\n x: startOffset.left - (rect.width * relativeX) + snapOffset.x,\n y: startOffset.top - (rect.height * relativeY) + snapOffset.y,\n });\n }\n }\n else {\n offsets.push(snapOffset);\n }\n\n return offsets;\n },\n\n set: function ({ interaction, pageCoords, status, options, offset: offsets }) {\n const targets = [];\n let target;\n let page;\n let i;\n\n if (status.useStatusXY) {\n page = { x: status.x, y: status.y };\n }\n else {\n const origin = utils.getOriginXY(interaction.target, interaction.element, interaction.prepared.name);\n\n page = utils.extend({}, pageCoords);\n\n page.x -= origin.x;\n page.y -= origin.y;\n }\n\n status.realX = page.x;\n status.realY = page.y;\n\n let len = options.targets? options.targets.length : 0;\n\n for (const { x: offsetX, y: offsetY } of offsets) {\n const relativeX = page.x - offsetX;\n const relativeY = page.y - offsetY;\n\n for (const snapTarget of options.targets) {\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n targets.push({\n x: utils.is.number(target.x) ? (target.x + offsetX) : relativeX,\n y: utils.is.number(target.y) ? (target.y + offsetY) : relativeY,\n\n range: utils.is.number(target.range)? target.range: options.range,\n });\n }\n }\n\n const closest = {\n target: null,\n inRange: false,\n distance: 0,\n range: 0,\n dx: 0,\n dy: 0,\n };\n\n for (i = 0, len = targets.length; i < len; i++) {\n target = targets[i];\n\n const range = target.range;\n const dx = target.x - page.x;\n const dy = target.y - page.y;\n const distance = utils.hypot(dx, dy);\n let inRange = distance <= range;\n\n // Infinite targets count as being out of range\n // compared to non infinite ones that are in range\n if (range === Infinity && closest.inRange && closest.range !== Infinity) {\n inRange = false;\n }\n\n if (!closest.target || (inRange\n // is the closest target in range?\n ? (closest.inRange && range !== Infinity\n // the pointer is relatively deeper in this target\n ? distance / range < closest.distance / closest.range\n // this target has Infinite range and the closest doesn't\n : (range === Infinity && closest.range !== Infinity)\n // OR this target is closer that the previous closest\n || distance < closest.distance)\n // The other is not in range and the pointer is closer to this target\n : (!closest.inRange && distance < closest.distance))) {\n\n closest.target = target;\n closest.distance = distance;\n closest.range = range;\n closest.inRange = inRange;\n closest.dx = dx;\n closest.dy = dy;\n\n status.range = range;\n }\n }\n\n let snapChanged;\n\n if (closest.target) {\n snapChanged = (status.modifiedX !== closest.target.x || status.modifiedY !== closest.target.y);\n\n status.modifiedX = closest.target.x;\n status.modifiedY = closest.target.y;\n }\n else {\n snapChanged = true;\n\n status.modifiedX = NaN;\n status.modifiedY = NaN;\n }\n\n status.dx = closest.dx;\n status.dy = closest.dy;\n\n status.changed = (snapChanged || (closest.inRange && !status.locked));\n status.locked = closest.inRange;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const relativePoints = options && options.relativePoints;\n\n if (options && options.enabled\n && !(phase === 'start' && relativePoints && relativePoints.length)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n }\n\n return {\n range : status.range,\n locked : status.locked,\n x : status.modifiedX,\n y : status.modifiedY,\n realX : status.realX,\n realY : status.realY,\n dx : status.dx,\n dy : status.dy,\n };\n }\n },\n};\n\ninteract.createSnapGrid = function (grid) {\n return function (x, y) {\n const limits = grid.limits || {\n left : -Infinity,\n right : Infinity,\n top : -Infinity,\n bottom: Infinity,\n };\n let offsetX = 0;\n let offsetY = 0;\n\n if (utils.is.object(grid.offset)) {\n offsetX = grid.offset.x;\n offsetY = grid.offset.y;\n }\n\n const gridx = Math.round((x - offsetX) / grid.x);\n const gridy = Math.round((y - offsetY) / grid.y);\n\n const newX = Math.max(limits.left, Math.min(limits.right , gridx * grid.x + offsetX));\n const newY = Math.max(limits.top , Math.min(limits.bottom, gridy * grid.y + offsetY));\n\n return {\n x: newX,\n y: newY,\n range: grid.range,\n };\n };\n};\n\nmodifiers.snap = snap;\nmodifiers.names.push('snap');\n\ndefaultOptions.perAction.snap = snap.defaults;\n\nmodule.exports = snap;\n","// This module allows snapping of the size of targets during resize\n// interactions.\n\nconst modifiers = require('./index');\nconst snap = require('./snap');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\nconst utils = require('../utils/');\n\nconst snapSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n },\n\n setOffset: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.edges;\n\n if (!edges) { return; }\n\n arg.options = {\n relativePoints: [{\n x: edges.left? 0 : 1,\n y: edges.top ? 0 : 1,\n }],\n origin: { x: 0, y: 0 },\n offset: 'self',\n range: options.range,\n };\n\n const offsets = snap.setOffset(arg);\n arg.options = options;\n\n return offsets;\n },\n\n set: function (arg) {\n const { interaction, options, offset, pageCoords } = arg;\n const page = utils.extend({}, pageCoords);\n const relativeX = page.x - offset[0].x;\n const relativeY = page.y - offset[0].y;\n\n arg.options = utils.extend({}, options);\n arg.options.targets = [];\n\n for (const snapTarget of options.targets) {\n let target;\n\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n if ('width' in target && 'height' in target) {\n target.x = target.width;\n target.y = target.height;\n }\n\n arg.options.targets.push(target);\n }\n\n snap.set(arg);\n },\n\n modifyCoords: function (arg) {\n const { options } = arg;\n\n arg.options = utils.extend({}, options);\n arg.options.enabled = options.enabled;\n arg.options.relativePoints = [null];\n\n snap.modifyCoords(arg);\n },\n};\n\nmodifiers.snapSize = snapSize;\nmodifiers.names.push('snapSize');\n\ndefaultOptions.perAction.snapSize = snapSize.defaults;\nresize.defaults.snapSize = snapSize.defaults;\n\nmodule.exports = snapSize;\n","const pointerUtils = require('../utils/pointerUtils');\n\nmodule.exports = class PointerEvent {\n constructor (type, pointer, event, eventTarget, interaction) {\n pointerUtils.pointerExtend(this, event);\n\n if (event !== pointer) {\n pointerUtils.pointerExtend(this, pointer);\n }\n\n this.interaction = interaction;\n\n this.timeStamp = new Date().getTime();\n this.originalEvent = event;\n this.type = type;\n this.pointerId = pointerUtils.getPointerId(pointer);\n this.pointerType = pointerUtils.getPointerType(pointer, interaction);\n this.target = eventTarget;\n this.currentTarget = null;\n\n if (type === 'tap') {\n const pointerIndex = interaction.getPointerIndex(pointer);\n this.dt = this.timeStamp - interaction.downTimes[pointerIndex];\n\n const interval = this.timeStamp - interaction.tapTime;\n\n this.double = !!(interaction.prevTap\n && interaction.prevTap.type !== 'doubletap'\n && interaction.prevTap.target === this.target\n && interval < 500);\n }\n else if (type === 'doubletap') {\n this.dt = pointer.timeStamp - interaction.tapTime;\n }\n }\n\n subtractOrigin ({ x: originX, y: originY }) {\n this.pageX -= originX;\n this.pageY -= originY;\n this.clientX -= originX;\n this.clientY -= originY;\n\n return this;\n }\n\n addOrigin ({ x: originX, y: originY }) {\n this.pageX += originX;\n this.pageY += originY;\n this.clientX += originX;\n this.clientY += originY;\n\n return this;\n }\n\n preventDefault () {\n this.originalEvent.preventDefault();\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n};\n","const PointerEvent = require('./PointerEvent');\nconst Interaction = require('../Interaction');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst defaults = require('../defaultOptions');\nconst signals = require('../utils/Signals').new();\nconst { filter } = require('../utils/arr');\n\nconst simpleSignals = [ 'down', 'up', 'cancel' ];\nconst simpleEvents = [ 'down', 'up', 'cancel' ];\n\nconst pointerEvents = {\n PointerEvent,\n fire,\n collectEventTargets,\n signals,\n defaults: {\n holdDuration: 600,\n ignoreFrom : null,\n allowFrom : null,\n origin : { x: 0, y: 0 },\n },\n types: [\n 'down',\n 'move',\n 'up',\n 'cancel',\n 'tap',\n 'doubletap',\n 'hold',\n ],\n};\n\nfunction fire (arg) {\n const {\n interaction, pointer, event, eventTarget,\n type = arg.pointerEvent.type,\n targets = collectEventTargets(arg),\n pointerEvent = new PointerEvent(type, pointer, event, eventTarget, interaction),\n } = arg;\n\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n targets,\n type,\n pointerEvent,\n };\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n\n for (const prop in target.props || {}) {\n pointerEvent[prop] = target.props[prop];\n }\n\n const origin = utils.getOriginXY(target.eventable, target.element);\n\n pointerEvent.subtractOrigin(origin);\n pointerEvent.eventable = target.eventable;\n pointerEvent.currentTarget = target.element;\n\n target.eventable.fire(pointerEvent);\n\n pointerEvent.addOrigin(origin);\n\n if (pointerEvent.immediatePropagationStopped\n || (pointerEvent.propagationStopped\n && (i + 1) < targets.length && targets[i + 1].element !== pointerEvent.currentTarget)) {\n break;\n }\n }\n\n signals.fire('fired', signalArg);\n\n if (type === 'tap') {\n // if pointerEvent should make a double tap, create and fire a doubletap\n // PointerEvent and use that as the prevTap\n const prevTap = pointerEvent.double\n ? fire({\n interaction, pointer, event, eventTarget,\n type: 'doubletap',\n })\n : pointerEvent;\n\n interaction.prevTap = prevTap;\n interaction.tapTime = prevTap.timeStamp;\n }\n\n return pointerEvent;\n}\n\nfunction collectEventTargets ({ interaction, pointer, event, eventTarget, type }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n // do not fire a tap event if the pointer was moved before being lifted\n if (type === 'tap' && (interaction.pointerWasMoved\n // or if the pointerup target is different to the pointerdown target\n || !(interaction.downTargets[pointerIndex] && interaction.downTargets[pointerIndex] === eventTarget))) {\n return [];\n }\n\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n path,\n targets: [],\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (type === 'hold') {\n signalArg.targets = filter(signalArg.targets, target =>\n target.eventable.options.holdDuration === interaction.holdTimers[pointerIndex].duration);\n }\n\n return signalArg.targets;\n}\n\nInteraction.signals.on('update-pointer-down', function ({ interaction, pointerIndex }) {\n interaction.holdTimers[pointerIndex] = { duration: Infinity, timeout: null };\n});\n\nInteraction.signals.on('remove-pointer', function ({ interaction, pointerIndex }) {\n interaction.holdTimers.splice(pointerIndex, 1);\n});\n\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget, duplicateMove }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n if (!duplicateMove && (!interaction.pointerIsDown || interaction.pointerWasMoved)) {\n if (interaction.pointerIsDown) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n\n fire({\n interaction, pointer, event, eventTarget,\n type: 'move',\n });\n }\n});\n\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget, pointerIndex }) {\n // copy event to be used in timeout for IE8\n const eventCopy = browser.isIE8? utils.extend({}, event) : event;\n\n const timer = interaction.holdTimers[pointerIndex];\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'hold',\n targets: [],\n path,\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (!signalArg.targets.length) { return; }\n\n let minDuration = Infinity;\n\n for (let i = 0; i < signalArg.targets.length; i++) {\n const target = signalArg.targets[i];\n const holdDuration = target.eventable.options.holdDuration;\n\n if (holdDuration < minDuration) {\n minDuration = holdDuration;\n }\n }\n\n timer.duration = minDuration;\n timer.timeout = setTimeout(function () {\n fire({\n interaction, eventCopy, eventTarget,\n pointer: browser.isIE8? eventCopy : pointer,\n type: 'hold',\n });\n }, minDuration);\n});\n\nInteraction.signals.on('up', ({ interaction, pointer, event, eventTarget }) => {\n if (!interaction.pointerWasMoved) {\n fire({ interaction, eventTarget, pointer, event, type: 'tap' });\n }\n});\n\n['up', 'cancel'].forEach(function (signalName) {\n Interaction.signals.on(signalName, function ({ interaction, pointerIndex }) {\n if (interaction.holdTimers[pointerIndex]) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n });\n});\n\nfunction createSignalListener (type) {\n return function ({ interaction, pointer, event, eventTarget }) {\n fire({ interaction, eventTarget, pointer, event, type });\n };\n}\n\nfor (let i = 0; i < simpleSignals.length; i++) {\n Interaction.signals.on(simpleSignals[i], createSignalListener(simpleEvents[i]));\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.prevTap = null; // the most recent tap event on this interaction\n interaction.tapTime = 0; // time of the most recent tap event\n interaction.holdTimers = []; // [{ duration, timeout }]\n});\n\ndefaults.pointerEvents = pointerEvents.defaults;\nmodule.exports = pointerEvents;\n","const pointerEvents = require('./base');\nconst Interaction = require('../Interaction');\n\npointerEvents.signals.on('new', onNew);\npointerEvents.signals.on('fired', onFired);\n\nfor (const signal of ['move', 'up', 'cancel', 'endall']) {\n Interaction.signals.on(signal, endHoldRepeat);\n}\n\nfunction onNew ({ pointerEvent }) {\n if (pointerEvent.type !== 'hold') { return; }\n\n pointerEvent.count = (pointerEvent.count || 0) + 1;\n}\n\nfunction onFired ({ interaction, pointerEvent, eventTarget, targets }) {\n if (pointerEvent.type !== 'hold' || !targets.length) { return; }\n\n // get the repeat interval from the first eventable\n const interval = targets[0].eventable.options.holdRepeatInterval;\n\n // don't repeat if the interval is 0 or less\n if (interval <= 0) { return; }\n\n // set a timeout to fire the holdrepeat event\n interaction.holdIntervalHandle = setTimeout(function () {\n pointerEvents.fire({\n interaction,\n eventTarget,\n type: 'hold',\n pointer: pointerEvent,\n event: pointerEvent,\n });\n }, interval);\n}\n\nfunction endHoldRepeat ({ interaction }) {\n // set the interaction's holdStopTime property\n // to stop further holdRepeat events\n if (interaction.holdIntervalHandle) {\n clearInterval(interaction.holdIntervalHandle);\n interaction.holdIntervalHandle = null;\n }\n}\n\n// don't repeat by default\npointerEvents.defaults.holdRepeatInterval = 0;\npointerEvents.types.push('holdrepeat');\n\nmodule.exports = {\n onNew,\n onFired,\n endHoldRepeat,\n};\n","const pointerEvents = require('./base');\nconst Interactable = require('../Interactable');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\nconst scope = require('../scope');\nconst extend = require('../utils/extend');\nconst { merge } = require('../utils/arr');\n\npointerEvents.signals.on('collect-targets', function ({ targets, element, type, eventTarget }) {\n function collectSelectors (interactable, selector, context) {\n const els = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && is.element(element)\n && domUtils.matchesSelector(element, selector, els)\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n const interactable = scope.interactables.get(element);\n\n if (interactable) {\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n scope.interactables.forEachSelector(collectSelectors, element);\n});\n\nInteractable.signals.on('new', function ({ interactable }) {\n interactable.events.getRect = function (element) {\n return interactable.getRect(element);\n };\n});\n\nInteractable.signals.on('set', function ({ interactable, options }) {\n extend(interactable.events.options, pointerEvents.defaults);\n extend(interactable.events.options, options);\n});\n\nmerge(Interactable.eventTypes, pointerEvents.types);\n\nInteractable.prototype.pointerEvents = function (options) {\n extend(this.events.options, options);\n\n return this;\n};\n\nconst __backCompatOption = Interactable.prototype._backCompatOption;\n\nInteractable.prototype._backCompatOption = function (optionName, newValue) {\n const ret = __backCompatOption.call(this, optionName, newValue);\n\n if (ret === this) {\n this.events.options[optionName] = newValue;\n }\n\n return ret;\n};\n\nInteractable.settingsMethods.push('pointerEvents');\n","const utils = require('./utils');\nconst events = require('./utils/events');\nconst signals = require('./utils/Signals').new();\n\nconst scope = {\n signals,\n events,\n utils,\n\n // main document\n document: require('./utils/domObjects').document,\n // all documents being listened to\n documents: [],\n\n addDocument: function (doc, win) {\n // do nothing if document is already known\n if (utils.contains(scope.documents, doc)) { return false; }\n\n win = win || scope.getWindow(doc);\n\n scope.documents.push(doc);\n events.documents.push(doc);\n\n // don't add an unload event for the main document\n // so that the page may be cached in browser history\n if (doc !== scope.document) {\n events.add(win, 'unload', scope.onWindowUnload);\n }\n\n signals.fire('add-document', { doc, win });\n },\n\n removeDocument: function (doc, win) {\n const index = utils.indexOf(scope.documents, doc);\n\n win = win || scope.getWindow(doc);\n\n events.remove(win, 'unload', scope.onWindowUnload);\n\n scope.documents.splice(index, 1);\n events.documents.splice(index, 1);\n\n signals.fire('remove-document', { win, doc });\n },\n\n onWindowUnload: function () {\n scope.removeDocument(this.document, this);\n },\n};\n\nmodule.exports = scope;\n","const { indexOf } = require('./arr');\n\nclass Signals {\n constructor () {\n this.listeners = {\n // signalName: [listeners],\n };\n }\n\n on (name, listener) {\n if (!this.listeners[name]) {\n this.listeners[name] = [listener];\n return;\n }\n\n this.listeners[name].push(listener);\n }\n\n off (name, listener) {\n if (!this.listeners[name]) { return; }\n\n const index = indexOf(this.listeners[name], listener);\n\n if (index !== -1) {\n this.listeners[name].splice(index, 1);\n }\n }\n\n fire (name, arg) {\n const targetListeners = this.listeners[name];\n\n if (!targetListeners) { return; }\n\n for (let i = 0; i < targetListeners.length; i++) {\n if (targetListeners[i](arg, name) === false) {\n return;\n }\n }\n }\n}\n\nSignals.new = function () {\n return new Signals();\n};\n\nmodule.exports = Signals;\n","function indexOf (array, target) {\n for (let i = 0, len = array.length; i < len; i++) {\n if (array[i] === target) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction contains (array, target) {\n return indexOf(array, target) !== -1;\n}\n\nfunction merge (target, source) {\n for (let i = 0; i < source.length; i++) {\n target.push(source[i]);\n }\n\n return target;\n}\n\nfunction filter (array, test) {\n const result = [];\n\n for (let i = 0; i < array.length; i++) {\n if (test(array[i])) {\n result.push(array[i]);\n }\n }\n\n return result;\n}\n\nmodule.exports = {\n indexOf,\n contains,\n merge,\n filter,\n};\n","const { window } = require('./window');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst Element = domObjects.Element;\nconst navigator = window.navigator;\n\nconst browser = {\n // Does the browser support touch input?\n supportsTouch: !!(('ontouchstart' in window) || is.function(window.DocumentTouch)\n && domObjects.document instanceof window.DocumentTouch),\n\n // Does the browser support PointerEvents\n supportsPointerEvent: !!domObjects.PointerEvent,\n\n isIE8: ('attachEvent' in window) && !('addEventListener' in window),\n\n // Opera Mobile must be handled differently\n isOperaMobile: (navigator.appName === 'Opera'\n && browser.supportsTouch\n && navigator.userAgent.match('Presto')),\n\n // scrolling doesn't change the result of getClientRects on iOS 7\n isIOS7: (/iP(hone|od|ad)/.test(navigator.platform)\n && /OS 7[^\\d]/.test(navigator.appVersion)),\n\n isIe9OrOlder: /MSIE (8|9)/.test(navigator.userAgent),\n\n // prefix matchesSelector\n prefixedMatchesSelector: 'matches' in Element.prototype\n ? 'matches': 'webkitMatchesSelector' in Element.prototype\n ? 'webkitMatchesSelector': 'mozMatchesSelector' in Element.prototype\n ? 'mozMatchesSelector': 'oMatchesSelector' in Element.prototype\n ? 'oMatchesSelector': 'msMatchesSelector',\n\n useMatchesSelectorPolyfill: false,\n\n pEventTypes: (domObjects.PointerEvent\n ? (domObjects.PointerEvent === window.MSPointerEvent\n ? {\n up: 'MSPointerUp',\n down: 'MSPointerDown',\n over: 'mouseover',\n out: 'mouseout',\n move: 'MSPointerMove',\n cancel: 'MSPointerCancel',\n }\n : {\n up: 'pointerup',\n down: 'pointerdown',\n over: 'pointerover',\n out: 'pointerout',\n move: 'pointermove',\n cancel: 'pointercancel',\n })\n : null),\n\n // because Webkit and Opera still use 'mousewheel' event type\n wheelEvent: 'onmousewheel' in domObjects.document? 'mousewheel': 'wheel',\n\n};\n\nbrowser.useMatchesSelectorPolyfill = !is.function(Element.prototype[browser.prefixedMatchesSelector]);\n\nmodule.exports = browser;\n","const domObjects = {};\nconst win = require('./window').window;\n\nfunction blank () {}\n\ndomObjects.document = win.document;\ndomObjects.DocumentFragment = win.DocumentFragment || blank;\ndomObjects.SVGElement = win.SVGElement || blank;\ndomObjects.SVGSVGElement = win.SVGSVGElement || blank;\ndomObjects.SVGElementInstance = win.SVGElementInstance || blank;\ndomObjects.Element = win.Element || blank;\ndomObjects.HTMLElement = win.HTMLElement || domObjects.Element;\n\ndomObjects.Event = win.Event;\ndomObjects.Touch = win.Touch || blank;\ndomObjects.PointerEvent = (win.PointerEvent || win.MSPointerEvent);\n\nmodule.exports = domObjects;\n","const win = require('./window');\nconst browser = require('./browser');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst domUtils = {\n nodeContains: function (parent, child) {\n while (child) {\n if (child === parent) {\n return true;\n }\n\n child = child.parentNode;\n }\n\n return false;\n },\n\n closest: function (element, selector) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) { return element; }\n\n element = domUtils.parentNode(element);\n }\n\n return null;\n },\n\n parentNode: function (node) {\n let parent = node.parentNode;\n\n if (is.docFrag(parent)) {\n // skip past #shado-root fragments\n while ((parent = parent.host) && is.docFrag(parent)) {\n continue;\n }\n\n return parent;\n }\n\n return parent;\n },\n\n // taken from http://tanalin.com/en/blog/2012/12/matches-selector-ie8/ and modified\n matchesSelectorPolyfill: browser.useMatchesSelectorPolyfill\n ? function (element, selector, elems) {\n elems = elems || element.parentNode.querySelectorAll(selector);\n\n for (let i = 0, len = elems.length; i < len; i++) {\n if (elems[i] === element) {\n return true;\n }\n }\n\n return false;\n }\n : null,\n\n matchesSelector: function (element, selector, nodeList) {\n if (browser.useMatchesSelectorPolyfill) {\n return domUtils.matchesSelectorPolyfill(element, selector, nodeList);\n }\n\n // remove /deep/ from selectors if shadowDOM polyfill is used\n if (win.window !== win.realWindow) {\n selector = selector.replace(/\\/deep\\//g, ' ');\n }\n\n return element[browser.prefixedMatchesSelector](selector);\n },\n\n // Test for the element that's \"above\" all other qualifiers\n indexOfDeepestElement: function (elements) {\n let deepestZoneParents = [];\n let dropzoneParents = [];\n let dropzone;\n let deepestZone = elements[0];\n let index = deepestZone? 0: -1;\n let parent;\n let child;\n let i;\n let n;\n\n for (i = 1; i < elements.length; i++) {\n dropzone = elements[i];\n\n // an element might belong to multiple selector dropzones\n if (!dropzone || dropzone === deepestZone) {\n continue;\n }\n\n if (!deepestZone) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n // check if the deepest or current are document.documentElement or document.rootElement\n // - if the current dropzone is, do nothing and continue\n if (dropzone.parentNode === dropzone.ownerDocument) {\n continue;\n }\n // - if deepest is, update with the current dropzone and continue to next\n else if (deepestZone.parentNode === dropzone.ownerDocument) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n if (!deepestZoneParents.length) {\n parent = deepestZone;\n while (parent.parentNode && parent.parentNode !== parent.ownerDocument) {\n deepestZoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n }\n\n // if this element is an svg element and the current deepest is\n // an HTMLElement\n if (deepestZone instanceof domObjects.HTMLElement\n && dropzone instanceof domObjects.SVGElement\n && !(dropzone instanceof domObjects.SVGSVGElement)) {\n\n if (dropzone === deepestZone.parentNode) {\n continue;\n }\n\n parent = dropzone.ownerSVGElement;\n }\n else {\n parent = dropzone;\n }\n\n dropzoneParents = [];\n\n while (parent.parentNode !== parent.ownerDocument) {\n dropzoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n\n n = 0;\n\n // get (position of last common ancestor) + 1\n while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) {\n n++;\n }\n\n const parents = [\n dropzoneParents[n - 1],\n dropzoneParents[n],\n deepestZoneParents[n],\n ];\n\n child = parents[0].lastChild;\n\n while (child) {\n if (child === parents[1]) {\n deepestZone = dropzone;\n index = i;\n deepestZoneParents = [];\n\n break;\n }\n else if (child === parents[2]) {\n break;\n }\n\n child = child.previousSibling;\n }\n }\n\n return index;\n },\n\n matchesUpTo: function (element, selector, limit) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) {\n return true;\n }\n\n element = domUtils.parentNode(element);\n\n if (element === limit) {\n return domUtils.matchesSelector(element, selector);\n }\n }\n\n return false;\n },\n\n getActualElement: function (element) {\n return (element instanceof domObjects.SVGElementInstance\n ? element.correspondingUseElement\n : element);\n },\n\n getScrollXY: function (relevantWindow) {\n relevantWindow = relevantWindow || win.window;\n return {\n x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft,\n y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop,\n };\n },\n\n getElementClientRect: function (element) {\n const clientRect = (element instanceof domObjects.SVGElement\n ? element.getBoundingClientRect()\n : element.getClientRects()[0]);\n\n return clientRect && {\n left : clientRect.left,\n right : clientRect.right,\n top : clientRect.top,\n bottom: clientRect.bottom,\n width : clientRect.width || clientRect.right - clientRect.left,\n height: clientRect.height || clientRect.bottom - clientRect.top,\n };\n },\n\n getElementRect: function (element) {\n const clientRect = domUtils.getElementClientRect(element);\n\n if (!browser.isIOS7 && clientRect) {\n const scroll = domUtils.getScrollXY(win.getWindow(element));\n\n clientRect.left += scroll.x;\n clientRect.right += scroll.x;\n clientRect.top += scroll.y;\n clientRect.bottom += scroll.y;\n }\n\n return clientRect;\n },\n\n getPath: function (element) {\n const path = [];\n\n while (element) {\n path.push(element);\n element = domUtils.parentNode(element);\n }\n\n return path;\n },\n\n trySelector: value => {\n if (!is.string(value)) { return false; }\n\n // an exception will be raised if it is invalid\n domObjects.document.querySelector(value);\n return true;\n },\n};\n\nmodule.exports = domUtils;\n","const is = require('./is');\nconst domUtils = require('./domUtils');\nconst pExtend = require('./pointerExtend');\n\nconst { window, getWindow } = require('./window');\nconst { indexOf, contains } = require('./arr');\n\nconst useAttachEvent = ('attachEvent' in window) && !('addEventListener' in window);\nconst addEvent = useAttachEvent? 'attachEvent': 'addEventListener';\nconst removeEvent = useAttachEvent? 'detachEvent': 'removeEventListener';\nconst on = useAttachEvent? 'on': '';\n\nconst elements = [];\nconst targets = [];\nconst attachedListeners = [];\n\n// {\n// type: {\n// selectors: ['selector', ...],\n// contexts : [document, ...],\n// listeners: [[listener, capture, passive], ...]\n// }\n// }\nconst delegatedEvents = {};\n\nconst documents = [];\n\nconst supportsOptions = !useAttachEvent && (() => {\n let supported = false;\n\n window.document.createElement('div').addEventListener('test', null, {\n get capture () { supported = true; },\n });\n\n return supported;\n})();\n\nfunction add (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n let elementIndex = indexOf(elements, element);\n let target = targets[elementIndex];\n\n if (!target) {\n target = {\n events: {},\n typeCount: 0,\n };\n\n elementIndex = elements.push(element) - 1;\n targets.push(target);\n\n attachedListeners.push(useAttachEvent\n ? {\n supplied: [],\n wrapped : [],\n useCount: [],\n }\n : null);\n }\n\n if (!target.events[type]) {\n target.events[type] = [];\n target.typeCount++;\n }\n\n if (!contains(target.events[type], listener)) {\n let ret;\n\n if (useAttachEvent) {\n const { supplied, wrapped, useCount } = attachedListeners[elementIndex];\n const listenerIndex = indexOf(supplied, listener);\n\n const wrappedListener = wrapped[listenerIndex] || function (event) {\n if (!event.immediatePropagationStopped) {\n event.target = event.srcElement;\n event.currentTarget = element;\n\n event.preventDefault = event.preventDefault || preventDef;\n event.stopPropagation = event.stopPropagation || stopProp;\n event.stopImmediatePropagation = event.stopImmediatePropagation || stopImmProp;\n\n if (/mouse|click/.test(event.type)) {\n event.pageX = event.clientX + getWindow(element).document.documentElement.scrollLeft;\n event.pageY = event.clientY + getWindow(element).document.documentElement.scrollTop;\n }\n\n listener(event);\n }\n };\n\n ret = element[addEvent](on + type, wrappedListener, !!options.capture);\n\n if (listenerIndex === -1) {\n supplied.push(listener);\n wrapped.push(wrappedListener);\n useCount.push(1);\n }\n else {\n useCount[listenerIndex]++;\n }\n }\n else {\n ret = element[addEvent](type, listener, supportsOptions? options : !!options.capture);\n }\n target.events[type].push(listener);\n\n return ret;\n }\n}\n\nfunction remove (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const elementIndex = indexOf(elements, element);\n const target = targets[elementIndex];\n\n if (!target || !target.events) {\n return;\n }\n\n let wrappedListener = listener;\n let listeners;\n let listenerIndex;\n\n if (useAttachEvent) {\n listeners = attachedListeners[elementIndex];\n listenerIndex = indexOf(listeners.supplied, listener);\n wrappedListener = listeners.wrapped[listenerIndex];\n }\n\n if (type === 'all') {\n for (type in target.events) {\n if (target.events.hasOwnProperty(type)) {\n remove(element, type, 'all');\n }\n }\n return;\n }\n\n if (target.events[type]) {\n const len = target.events[type].length;\n\n if (listener === 'all') {\n for (let i = 0; i < len; i++) {\n remove(element, type, target.events[type][i], options);\n }\n return;\n }\n else {\n for (let i = 0; i < len; i++) {\n if (target.events[type][i] === listener) {\n element[removeEvent](on + type, wrappedListener, supportsOptions? options : !!options.capture);\n target.events[type].splice(i, 1);\n\n if (useAttachEvent && listeners) {\n listeners.useCount[listenerIndex]--;\n if (listeners.useCount[listenerIndex] === 0) {\n listeners.supplied.splice(listenerIndex, 1);\n listeners.wrapped.splice(listenerIndex, 1);\n listeners.useCount.splice(listenerIndex, 1);\n }\n }\n\n break;\n }\n }\n }\n\n if (target.events[type] && target.events[type].length === 0) {\n target.events[type] = null;\n target.typeCount--;\n }\n }\n\n if (!target.typeCount) {\n targets.splice(elementIndex, 1);\n elements.splice(elementIndex, 1);\n attachedListeners.splice(elementIndex, 1);\n }\n}\n\nfunction addDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n if (!delegatedEvents[type]) {\n delegatedEvents[type] = {\n selectors: [],\n contexts : [],\n listeners: [],\n };\n\n // add delegate listener functions\n for (let i = 0; i < documents.length; i++) {\n add(documents[i], type, delegateListener);\n add(documents[i], type, delegateUseCapture, true);\n }\n }\n\n const delegated = delegatedEvents[type];\n let index;\n\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n break;\n }\n }\n\n if (index === -1) {\n index = delegated.selectors.length;\n\n delegated.selectors.push(selector);\n delegated.contexts .push(context);\n delegated.listeners.push([]);\n }\n\n // keep listener and capture and passive flags\n delegated.listeners[index].push([listener, !!options.capture, options.passive]);\n}\n\nfunction removeDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const delegated = delegatedEvents[type];\n let matchFound = false;\n let index;\n\n if (!delegated) { return; }\n\n // count from last index of delegated to 0\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n // look for matching selector and context Node\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n\n const listeners = delegated.listeners[index];\n\n // each item of the listeners array is an array: [function, capture, passive]\n for (let i = listeners.length - 1; i >= 0; i--) {\n const [fn, capture, passive] = listeners[i];\n\n // check if the listener functions and capture and passive flags match\n if (fn === listener && capture === !!options.capture && passive === options.passive) {\n // remove the listener from the array of listeners\n listeners.splice(i, 1);\n\n // if all listeners for this interactable have been removed\n // remove the interactable from the delegated arrays\n if (!listeners.length) {\n delegated.selectors.splice(index, 1);\n delegated.contexts .splice(index, 1);\n delegated.listeners.splice(index, 1);\n\n // remove delegate function from context\n remove(context, type, delegateListener);\n remove(context, type, delegateUseCapture, true);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegatedEvents[type] = null;\n }\n }\n\n // only remove one listener\n matchFound = true;\n break;\n }\n }\n\n if (matchFound) { break; }\n }\n }\n}\n\n// bound to the interactable context when a DOM event\n// listener is added to a selector interactable\nfunction delegateListener (event, optionalArg) {\n const options = getOptions(optionalArg);\n const fakeEvent = {};\n const delegated = delegatedEvents[event.type];\n const eventTarget = (domUtils.getActualElement(event.path\n ? event.path[0]\n : event.target));\n let element = eventTarget;\n\n // duplicate the event so that currentTarget can be changed\n pExtend(fakeEvent, event);\n\n fakeEvent.originalEvent = event;\n fakeEvent.preventDefault = preventOriginalDefault;\n\n // climb up document tree looking for selector matches\n while (is.element(element)) {\n for (let i = 0; i < delegated.selectors.length; i++) {\n const selector = delegated.selectors[i];\n const context = delegated.contexts[i];\n\n if (domUtils.matchesSelector(element, selector)\n && domUtils.nodeContains(context, eventTarget)\n && domUtils.nodeContains(context, element)) {\n\n const listeners = delegated.listeners[i];\n\n fakeEvent.currentTarget = element;\n\n for (let j = 0; j < listeners.length; j++) {\n const [fn, capture, passive] = listeners[j];\n\n if (capture === !!options.capture && passive === options.passive) {\n fn(fakeEvent);\n }\n }\n }\n }\n\n element = domUtils.parentNode(element);\n }\n}\n\nfunction delegateUseCapture (event) {\n return delegateListener.call(this, event, true);\n}\n\nfunction preventDef () {\n this.returnValue = false;\n}\n\nfunction preventOriginalDefault () {\n this.originalEvent.preventDefault();\n}\n\nfunction stopProp () {\n this.cancelBubble = true;\n}\n\nfunction stopImmProp () {\n this.cancelBubble = true;\n this.immediatePropagationStopped = true;\n}\n\nfunction getOptions (param) {\n return is.object(param)? param : { capture: param };\n}\n\nmodule.exports = {\n add,\n remove,\n\n addDelegate,\n removeDelegate,\n\n delegateListener,\n delegateUseCapture,\n delegatedEvents,\n documents,\n\n useAttachEvent,\n supportsOptions,\n\n _elements: elements,\n _targets: targets,\n _attachedListeners: attachedListeners,\n};\n","module.exports = function extend (dest, source) {\n for (const prop in source) {\n dest[prop] = source[prop];\n }\n return dest;\n};\n","const {\n resolveRectLike,\n rectToXY,\n} = require('./rect');\n\nmodule.exports = function (target, element, action) {\n const actionOptions = target.options[action];\n const actionOrigin = actionOptions && actionOptions.origin;\n const origin = actionOrigin || target.options.origin;\n\n const originRect = resolveRectLike(origin, target, element, [target && element]);\n\n return rectToXY(originRect) || { x: 0, y: 0 };\n};\n","module.exports = (x, y) => Math.sqrt(x * x + y * y);\n","const extend = require('./extend');\nconst win = require('./window');\n\nconst utils = {\n warnOnce: function (method, message) {\n let warned = false;\n\n return function () {\n if (!warned) {\n win.window.console.warn(message);\n warned = true;\n }\n\n return method.apply(this, arguments);\n };\n },\n\n // http://stackoverflow.com/a/5634528/2280888\n _getQBezierValue: function (t, p1, p2, p3) {\n const iT = 1 - t;\n return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3;\n },\n\n getQuadraticCurvePoint: function (startX, startY, cpX, cpY, endX, endY, position) {\n return {\n x: utils._getQBezierValue(position, startX, cpX, endX),\n y: utils._getQBezierValue(position, startY, cpY, endY),\n };\n },\n\n // http://gizma.com/easing/\n easeOutQuad: function (t, b, c, d) {\n t /= d;\n return -c * t*(t-2) + b;\n },\n\n copyAction: function (dest, src) {\n dest.name = src.name;\n dest.axis = src.axis;\n dest.edges = src.edges;\n\n return dest;\n },\n\n is : require('./is'),\n extend : extend,\n hypot : require('./hypot'),\n getOriginXY: require('./getOriginXY'),\n};\n\nextend(utils, require('./arr'));\nextend(utils, require('./domUtils'));\nextend(utils, require('./pointerUtils'));\nextend(utils, require('./rect'));\n\nmodule.exports = utils;\n","const scope = require('../scope');\nconst utils = require('./index');\nconst browser = require('./browser');\n\nconst finder = {\n methodOrder: [ 'simulationResume', 'mouse', 'hasPointer', 'idle' ],\n\n search: function (pointer, eventType, eventTarget) {\n const mouseEvent = (/mouse/i.test(pointer.pointerType || eventType)\n // MSPointerEvent.MSPOINTER_TYPE_MOUSE\n || pointer.pointerType === 4);\n const pointerId = utils.getPointerId(pointer);\n const details = { pointer, pointerId, mouseEvent, eventType, eventTarget };\n\n for (const method of finder.methodOrder) {\n const interaction = finder[method](details);\n\n if (interaction) {\n return interaction;\n }\n }\n },\n\n // try to resume simulation with a new pointer\n simulationResume: function ({ mouseEvent, eventType, eventTarget }) {\n if (!/down|start/i.test(eventType)) {\n return null;\n }\n\n for (const interaction of scope.interactions) {\n let element = eventTarget;\n\n if (interaction.simulation && interaction.simulation.allowResume\n && (interaction.mouse === mouseEvent)) {\n while (element) {\n // if the element is the interaction element\n if (element === interaction.element) {\n return interaction;\n }\n element = utils.parentNode(element);\n }\n }\n }\n\n return null;\n },\n\n // if it's a mouse interaction\n mouse: function ({ pointerId, mouseEvent, eventType }) {\n if (!mouseEvent && (browser.supportsTouch || browser.supportsPointerEvent)) {\n return null;\n }\n\n let firstNonActive;\n\n for (const interaction of scope.interactions) {\n if (interaction.mouse) {\n // if it's a down event, skip interactions with running simulations\n if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; }\n\n // if the interaction is active, return it immediately\n if (interaction.interacting()) {\n return interaction;\n }\n // otherwise save it and look for another active interaction\n else if (!firstNonActive) {\n firstNonActive = interaction;\n }\n }\n }\n\n // if no active mouse interaction was found use the first inactive mouse\n // interaction\n if (firstNonActive) {\n return firstNonActive;\n }\n\n // Find any interaction specifically for mouse.\n // ignore the interaction if the eventType is a mousedown, and a simulation\n // is active\n for (const interaction of scope.interactions) {\n if (interaction.mouse && !(/down/.test(eventType) && interaction.simulation)) {\n return interaction;\n }\n }\n\n return null;\n },\n\n // get interaction that has this pointer\n hasPointer: function ({ pointerId }) {\n for (const interaction of scope.interactions) {\n if (utils.contains(interaction.pointerIds, pointerId)) {\n return interaction;\n }\n }\n },\n\n // get first idle interaction\n idle: function ({ mouseEvent }) {\n for (const interaction of scope.interactions) {\n // if there's already a pointer held down\n if (interaction.pointerIds.length === 1) {\n const target = interaction.target;\n // don't add this pointer if there is a target interactable and it\n // isn't gesturable\n if (target && !target.options.gesture.enabled) {\n continue;\n }\n }\n // maximum of 2 pointers per interaction\n else if (interaction.pointerIds.length >= 2) {\n continue;\n }\n\n if (!interaction.interacting() && (mouseEvent === interaction.mouse)) {\n return interaction;\n }\n }\n\n return null;\n },\n};\n\nmodule.exports = finder;\n","const win = require('./window');\nconst isWindow = require('./isWindow');\n\nconst is = {\n array : () => {},\n\n window : thing => thing === win.window || isWindow(thing),\n\n docFrag : thing => is.object(thing) && thing.nodeType === 11,\n\n object : thing => !!thing && (typeof thing === 'object'),\n\n function: thing => typeof thing === 'function',\n\n number : thing => typeof thing === 'number' ,\n\n bool : thing => typeof thing === 'boolean' ,\n\n string : thing => typeof thing === 'string' ,\n\n element: thing => {\n if (!thing || (typeof thing !== 'object')) { return false; }\n\n const _window = win.getWindow(thing) || win.window;\n\n return (/object|function/.test(typeof _window.Element)\n ? thing instanceof _window.Element //DOM2\n : thing.nodeType === 1 && typeof thing.nodeName === 'string');\n },\n};\n\nis.array = thing => (is.object(thing)\n && (typeof thing.length !== 'undefined')\n && is.function(thing.splice));\n\nmodule.exports = is;\n","module.exports = (thing) => !!(thing && thing.Window) && (thing instanceof thing.Window);\n","function pointerExtend (dest, source) {\n for (const prop in source) {\n const prefixedPropREs = module.exports.prefixedPropREs;\n let deprecated = false;\n\n // skip deprecated prefixed properties\n for (const vendor in prefixedPropREs) {\n if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) {\n deprecated = true;\n break;\n }\n }\n\n if (!deprecated && typeof source[prop] !== 'function') {\n dest[prop] = source[prop];\n }\n }\n return dest;\n}\n\npointerExtend.prefixedPropREs = {\n webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/,\n};\n\nmodule.exports = pointerExtend;\n","const hypot = require('./hypot');\nconst browser = require('./browser');\nconst dom = require('./domObjects');\nconst domUtils = require('./domUtils');\nconst is = require('./is');\nconst pointerExtend = require('./pointerExtend');\n\nconst pointerUtils = {\n copyCoords: function (dest, src) {\n dest.page = dest.page || {};\n dest.page.x = src.page.x;\n dest.page.y = src.page.y;\n\n dest.client = dest.client || {};\n dest.client.x = src.client.x;\n dest.client.y = src.client.y;\n\n dest.timeStamp = src.timeStamp;\n },\n\n setCoordDeltas: function (targetObj, prev, cur) {\n targetObj.page.x = cur.page.x - prev.page.x;\n targetObj.page.y = cur.page.y - prev.page.y;\n targetObj.client.x = cur.client.x - prev.client.x;\n targetObj.client.y = cur.client.y - prev.client.y;\n targetObj.timeStamp = cur.timeStamp - prev.timeStamp;\n\n // set pointer velocity\n const dt = Math.max(targetObj.timeStamp / 1000, 0.001);\n\n targetObj.page.speed = hypot(targetObj.page.x, targetObj.page.y) / dt;\n targetObj.page.vx = targetObj.page.x / dt;\n targetObj.page.vy = targetObj.page.y / dt;\n\n targetObj.client.speed = hypot(targetObj.client.x, targetObj.page.y) / dt;\n targetObj.client.vx = targetObj.client.x / dt;\n targetObj.client.vy = targetObj.client.y / dt;\n },\n\n isNativePointer: function (pointer) {\n return (pointer instanceof dom.Event || pointer instanceof dom.Touch);\n },\n\n // Get specified X/Y coords for mouse or event.touches[0]\n getXY: function (type, pointer, xy) {\n xy = xy || {};\n type = type || 'page';\n\n xy.x = pointer[type + 'X'];\n xy.y = pointer[type + 'Y'];\n\n return xy;\n },\n\n getPageXY: function (pointer, page) {\n page = page || {};\n\n // Opera Mobile handles the viewport and scrolling oddly\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n pointerUtils.getXY('screen', pointer, page);\n\n page.x += window.scrollX;\n page.y += window.scrollY;\n }\n else {\n pointerUtils.getXY('page', pointer, page);\n }\n\n return page;\n },\n\n getClientXY: function (pointer, client) {\n client = client || {};\n\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n // Opera Mobile handles the viewport and scrolling oddly\n pointerUtils.getXY('screen', pointer, client);\n }\n else {\n pointerUtils.getXY('client', pointer, client);\n }\n\n return client;\n },\n\n getPointerId: function (pointer) {\n return is.number(pointer.pointerId)? pointer.pointerId : pointer.identifier;\n },\n\n setCoords: function (targetObj, pointers, timeStamp) {\n const pointer = (pointers.length > 1\n ? pointerUtils.pointerAverage(pointers)\n : pointers[0]);\n\n const tmpXY = {};\n\n pointerUtils.getPageXY(pointer, tmpXY);\n targetObj.page.x = tmpXY.x;\n targetObj.page.y = tmpXY.y;\n\n pointerUtils.getClientXY(pointer, tmpXY);\n targetObj.client.x = tmpXY.x;\n targetObj.client.y = tmpXY.y;\n\n targetObj.timeStamp = is.number(timeStamp) ? timeStamp :new Date().getTime();\n },\n\n pointerExtend: pointerExtend,\n\n getTouchPair: function (event) {\n const touches = [];\n\n // array of touches is supplied\n if (is.array(event)) {\n touches[0] = event[0];\n touches[1] = event[1];\n }\n // an event\n else {\n if (event.type === 'touchend') {\n if (event.touches.length === 1) {\n touches[0] = event.touches[0];\n touches[1] = event.changedTouches[0];\n }\n else if (event.touches.length === 0) {\n touches[0] = event.changedTouches[0];\n touches[1] = event.changedTouches[1];\n }\n }\n else {\n touches[0] = event.touches[0];\n touches[1] = event.touches[1];\n }\n }\n\n return touches;\n },\n\n pointerAverage: function (pointers) {\n const average = {\n pageX : 0,\n pageY : 0,\n clientX: 0,\n clientY: 0,\n screenX: 0,\n screenY: 0,\n };\n\n for (const pointer of pointers) {\n for (const prop in average) {\n average[prop] += pointer[prop];\n }\n }\n for (const prop in average) {\n average[prop] /= pointers.length;\n }\n\n return average;\n },\n\n touchBBox: function (event) {\n if (!event.length && !(event.touches && event.touches.length > 1)) {\n return;\n }\n\n const touches = pointerUtils.getTouchPair(event);\n const minX = Math.min(touches[0].pageX, touches[1].pageX);\n const minY = Math.min(touches[0].pageY, touches[1].pageY);\n const maxX = Math.max(touches[0].pageX, touches[1].pageX);\n const maxY = Math.max(touches[0].pageY, touches[1].pageY);\n\n return {\n x: minX,\n y: minY,\n left: minX,\n top: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n },\n\n touchDistance: function (event, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n\n\n const dx = touches[0][sourceX] - touches[1][sourceX];\n const dy = touches[0][sourceY] - touches[1][sourceY];\n\n return hypot(dx, dy);\n },\n\n touchAngle: function (event, prevAngle, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n const dx = touches[1][sourceX] - touches[0][sourceX];\n const dy = touches[1][sourceY] - touches[0][sourceY];\n const angle = 180 * Math.atan2(dy , dx) / Math.PI;\n\n return angle;\n },\n\n getPointerType: function (pointer, interaction) {\n // if the PointerEvent API isn't available, then the pointer must be ither\n // a MouseEvent or TouchEvent\n if (interaction.mouse) { return 'mouse'; }\n if (!browser.supportsPointerEvent) { return 'touch'; }\n\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : [undefined, undefined,'touch', 'pen', 'mouse'][pointer.pointerType];\n },\n\n // [ event.target, event.currentTarget ]\n getEventTargets: function (event) {\n return [\n domUtils.getActualElement(event.path ? event.path[0] : event.target),\n domUtils.getActualElement(event.currentTarget),\n ];\n },\n};\n\nmodule.exports = pointerUtils;\n","const { window } = require('./window');\n\nconst vendors = ['ms', 'moz', 'webkit', 'o'];\nlet lastTime = 0;\nlet request;\nlet cancel;\n\nfor (let x = 0; x < vendors.length && !window.requestAnimationFrame; x++) {\n request = window[vendors[x] + 'RequestAnimationFrame'];\n cancel = window[vendors[x] +'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n}\n\nif (!request) {\n request = function (callback) {\n const currTime = new Date().getTime();\n const timeToCall = Math.max(0, 16 - (currTime - lastTime));\n const id = setTimeout(function () { callback(currTime + timeToCall); },\n timeToCall);\n\n lastTime = currTime + timeToCall;\n return id;\n };\n}\n\nif (!cancel) {\n cancel = function (id) {\n clearTimeout(id);\n };\n}\n\nmodule.exports = {\n request,\n cancel,\n};\n","const extend = require('./extend');\nconst is = require('./is');\nconst {\n closest,\n parentNode,\n getElementRect,\n} = require('./domUtils');\n\nconst rectUtils = {\n getStringOptionResult: function (value, interactable, element) {\n if (!is.string(value)) {\n return null;\n }\n\n if (value === 'parent') {\n value = parentNode(element);\n }\n else if (value === 'self') {\n value = interactable.getRect(element);\n }\n else {\n value = closest(element, value);\n }\n\n return value;\n },\n\n resolveRectLike: function (value, interactable, element, functionArgs) {\n value = rectUtils.getStringOptionResult(value, interactable, element) || value;\n\n if (is.function(value)) {\n value = value.apply(null, functionArgs);\n }\n\n if (is.element(value)) {\n value = getElementRect(value);\n }\n\n return value;\n },\n\n rectToXY: function (rect) {\n return rect && {\n x: 'x' in rect ? rect.x : rect.left,\n y: 'y' in rect ? rect.y : rect.top,\n };\n },\n\n xywhToTlbr: function (rect) {\n if (rect && !('left' in rect && 'top' in rect)) {\n rect = extend({}, rect);\n\n rect.left = rect.x || 0;\n rect.top = rect.y || 0;\n rect.right = rect.right || (rect.left + rect.width);\n rect.bottom = rect.bottom || (rect.top + rect.height);\n }\n\n return rect;\n },\n\n tlbrToXywh: function (rect) {\n if (rect && !('x' in rect && 'y' in rect)) {\n rect = extend({}, rect);\n\n rect.x = rect.left || 0;\n rect.top = rect.top || 0;\n rect.width = rect.width || (rect.right - rect.x);\n rect.height = rect.height || (rect.bottom - rect.y);\n }\n\n return rect;\n },\n};\n\nmodule.exports = rectUtils;\n","const win = module.exports;\nconst isWindow = require('./isWindow');\n\nfunction init (window) {\n // get wrapped window if using Shadow DOM polyfill\n\n win.realWindow = window;\n\n // create a TextNode\n const el = window.document.createTextNode('');\n\n // check if it's wrapped by a polyfill\n if (el.ownerDocument !== window.document\n && typeof window.wrap === 'function'\n && window.wrap(el) === el) {\n // use wrapped window\n window = window.wrap(window);\n }\n\n win.window = window;\n}\n\nif (typeof window === 'undefined') {\n win.window = undefined;\n win.realWindow = undefined;\n}\nelse {\n init(window);\n}\n\nwin.getWindow = function getWindow (node) {\n if (isWindow(node)) {\n return node;\n }\n\n const rootNode = (node.ownerDocument || node);\n\n return rootNode.defaultView || rootNode.parentWindow || win.window;\n};\n\nwin.init = init;\n"]} \ No newline at end of file +{"version":3,"sources":["src/minHeader.js","src/header.js","index.js","src/Eventable.js","src/InteractEvent.js","src/Interactable.js","src/Interaction.js","src/actions/base.js","src/actions/drag.js","src/actions/drop.js","src/actions/gesture.js","src/actions/resize.js","src/autoScroll.js","src/autoStart/InteractableMethods.js","src/autoStart/base.js","src/autoStart/delay.js","src/autoStart/drag.js","src/autoStart/gesture.js","src/autoStart/resize.js","src/defaultOptions.js","src/index.js","src/inertia.js","src/interact.js","src/interactablePreventDefault.js","src/legacyBrowsers.js","src/modifiers/index.js","src/modifiers/restrict.js","src/modifiers/restrictEdges.js","src/modifiers/restrictSize.js","src/modifiers/snap.js","src/modifiers/snapSize.js","src/pointerEvents/PointerEvent.js","src/pointerEvents/base.js","src/pointerEvents/holdRepeat.js","src/pointerEvents/interactableTargets.js","src/scope.js","src/utils/Signals.js","src/utils/arr.js","src/utils/browser.js","src/utils/domObjects.js","src/utils/domUtils.js","src/utils/events.js","src/utils/extend.js","src/utils/getOriginXY.js","src/utils/hypot.js","src/utils/index.js","src/utils/interactionFinder.js","src/utils/is.js","src/utils/isWindow.js","src/utils/pointerExtend.js","src/utils/pointerUtils.js","src/utils/raf.js","src/utils/rect.js","src/utils/window.js"],"names":[],"mappings":"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","file":"interact.min.js","sourceRoot":"","sourcesContent":["/* interact.js v1.3.0-alpha.4+sha.7970416-dirty | https://raw.github.com/taye/interact.js/master/LICENSE */\n","/**\n * interact.js v1.3.0-alpha.4+sha.7970416-dirty\n *\n * Copyright (c) 2012-2017 Taye Adeyemi \n * Open source under the MIT License.\n * https://raw.github.com/taye/interact.js/master/LICENSE\n */\n","/*\n * In a (windowless) server environment this file exports a factory function\n * that takes the window to use.\n *\n * var interact = require('interact.js')(windowObject);\n *\n * See https://github.com/taye/interact.js/issues/187\n */\nif (typeof window === 'undefined') {\n module.exports = function (window) {\n require('./src/utils/window').init(window);\n\n return require('./src/index');\n };\n}\nelse {\n module.exports = require('./src/index');\n}\n","const { indexOf } = require('./utils/arr');\nconst extend = require('./utils/extend.js');\n\nfunction fireUntilImmediateStopped (event, listeners) {\n for (let i = 0, len = listeners.length; i < len && !event.immediatePropagationStopped; i++) {\n listeners[i](event);\n }\n}\n\nclass Eventable {\n\n constructor (options) {\n this.options = extend({}, options || {});\n }\n\n fire (event) {\n let listeners;\n const onEvent = 'on' + event.type;\n const global = this.global;\n\n // Interactable#on() listeners\n if ((listeners = this[event.type])) {\n fireUntilImmediateStopped(event, listeners);\n }\n\n // interactable.onevent listener\n if (this[onEvent]) {\n this[onEvent](event);\n }\n\n // interact.on() listeners\n if (!event.propagationStopped && global && (listeners = global[event.type])) {\n fireUntilImmediateStopped(event, listeners);\n }\n }\n\n on (eventType, listener) {\n // if this type of event was never bound\n if (this[eventType]) {\n this[eventType].push(listener);\n }\n else {\n this[eventType] = [listener];\n }\n }\n\n off (eventType, listener) {\n // if it is an action event type\n const eventList = this[eventType];\n const index = eventList? indexOf(eventList, listener) : -1;\n\n if (index !== -1) {\n eventList.splice(index, 1);\n }\n\n if (eventList && eventList.length === 0 || !listener) {\n this[eventType] = listener;\n }\n }\n}\n\nmodule.exports = Eventable;\n","const extend = require('./utils/extend');\nconst getOriginXY = require('./utils/getOriginXY');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nclass InteractEvent {\n constructor (interaction, event, action, phase, element, related, preEnd = false) {\n const target = interaction.target;\n const deltaSource = (target && target.options || defaults).deltaSource;\n const origin = getOriginXY(target, element, action);\n const starting = phase === 'start';\n const ending = phase === 'end';\n const coords = starting? interaction.startCoords : interaction.curCoords;\n const prevEvent = interaction.prevEvent;\n\n element = element || interaction.element;\n\n const page = extend({}, coords.page);\n const client = extend({}, coords.client);\n\n page.x -= origin.x;\n page.y -= origin.y;\n\n client.x -= origin.x;\n client.y -= origin.y;\n\n this.ctrlKey = event.ctrlKey;\n this.altKey = event.altKey;\n this.shiftKey = event.shiftKey;\n this.metaKey = event.metaKey;\n this.button = event.button;\n this.buttons = event.buttons;\n this.target = element;\n this.currentTarget = element;\n this.relatedTarget = related || null;\n this.preEnd = preEnd;\n this.type = action + (phase || '');\n this.interaction = interaction;\n this.interactable = target;\n\n this.t0 = starting ? interaction.downTimes[interaction.downTimes.length - 1]\n : prevEvent.t0;\n\n const signalArg = {\n interaction,\n event,\n action,\n phase,\n element,\n related,\n page,\n client,\n coords,\n starting,\n ending,\n deltaSource,\n iEvent: this,\n };\n\n signals.fire('set-xy', signalArg);\n\n if (ending) {\n // use previous coords when ending\n this.pageX = prevEvent.pageX;\n this.pageY = prevEvent.pageY;\n this.clientX = prevEvent.clientX;\n this.clientY = prevEvent.clientY;\n }\n else {\n this.pageX = page.x;\n this.pageY = page.y;\n this.clientX = client.x;\n this.clientY = client.y;\n }\n\n this.x0 = interaction.startCoords.page.x - origin.x;\n this.y0 = interaction.startCoords.page.y - origin.y;\n this.clientX0 = interaction.startCoords.client.x - origin.x;\n this.clientY0 = interaction.startCoords.client.y - origin.y;\n\n signals.fire('set-delta', signalArg);\n\n this.timeStamp = coords.timeStamp;\n this.dt = interaction.pointerDelta.timeStamp;\n this.duration = this.timeStamp - this.t0;\n\n // speed and velocity in pixels per second\n this.speed = interaction.pointerDelta[deltaSource].speed;\n this.velocityX = interaction.pointerDelta[deltaSource].vx;\n this.velocityY = interaction.pointerDelta[deltaSource].vy;\n\n this.swipe = (ending || phase === 'inertiastart')? this.getSwipe() : null;\n\n signals.fire('new', signalArg);\n }\n\n getSwipe () {\n const interaction = this.interaction;\n\n if (interaction.prevEvent.speed < 600\n || this.timeStamp - interaction.prevEvent.timeStamp > 150) {\n return null;\n }\n\n let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI;\n const overlap = 22.5;\n\n if (angle < 0) {\n angle += 360;\n }\n\n const left = 135 - overlap <= angle && angle < 225 + overlap;\n const up = 225 - overlap <= angle && angle < 315 + overlap;\n\n const right = !left && (315 - overlap <= angle || angle < 45 + overlap);\n const down = !up && 45 - overlap <= angle && angle < 135 + overlap;\n\n return {\n up,\n down,\n left,\n right,\n angle,\n speed: interaction.prevEvent.speed,\n velocity: {\n x: interaction.prevEvent.velocityX,\n y: interaction.prevEvent.velocityY,\n },\n };\n }\n\n preventDefault () {}\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n}\n\nsignals.on('set-delta', function ({ iEvent, interaction, starting, deltaSource }) {\n const prevEvent = starting? iEvent : interaction.prevEvent;\n\n if (deltaSource === 'client') {\n iEvent.dx = iEvent.clientX - prevEvent.clientX;\n iEvent.dy = iEvent.clientY - prevEvent.clientY;\n }\n else {\n iEvent.dx = iEvent.pageX - prevEvent.pageX;\n iEvent.dy = iEvent.pageY - prevEvent.pageY;\n }\n});\n\nInteractEvent.signals = signals;\n\nmodule.exports = InteractEvent;\n","const is = require('./utils/is');\nconst events = require('./utils/events');\nconst extend = require('./utils/extend');\nconst actions = require('./actions/base');\nconst scope = require('./scope');\nconst Eventable = require('./Eventable');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nconst {\n getElementRect,\n nodeContains,\n trySelector,\n} = require('./utils/domUtils');\nconst { getWindow } = require('./utils/window');\nconst { indexOf, contains } = require('./utils/arr');\nconst { wheelEvent } = require('./utils/browser');\n\n// all set interactables\nscope.interactables = [];\n\n/*\\\n * Interactable\n [ property ]\n **\n * Object type returned by @interact\n\\*/\nclass Interactable {\n constructor (target, options) {\n options = options || {};\n\n this.target = target;\n this.events = new Eventable();\n this._context = options.context || scope.document;\n this._win = getWindow(trySelector(target)? this._context : target);\n this._doc = this._win.document;\n\n signals.fire('new', {\n target,\n options,\n interactable: this,\n win: this._win,\n });\n\n scope.addDocument( this._doc, this._win );\n\n scope.interactables.push(this);\n\n this.set(options);\n }\n\n setOnEvents (action, phases) {\n const onAction = 'on' + action;\n\n if (is.function(phases.onstart) ) { this.events[onAction + 'start' ] = phases.onstart ; }\n if (is.function(phases.onmove) ) { this.events[onAction + 'move' ] = phases.onmove ; }\n if (is.function(phases.onend) ) { this.events[onAction + 'end' ] = phases.onend ; }\n if (is.function(phases.oninertiastart)) { this.events[onAction + 'inertiastart' ] = phases.oninertiastart ; }\n\n return this;\n }\n\n setPerAction (action, options) {\n // for all the default per-action options\n for (const option in options) {\n // if this option exists for this action\n if (option in defaults[action]) {\n // if the option in the options arg is an object value\n if (is.object(options[option])) {\n // duplicate the object\n this.options[action][option] = extend(this.options[action][option] || {}, options[option]);\n\n if (is.object(defaults.perAction[option]) && 'enabled' in defaults.perAction[option]) {\n this.options[action][option].enabled = options[option].enabled === false? false : true;\n }\n }\n else if (is.bool(options[option]) && is.object(defaults.perAction[option])) {\n this.options[action][option].enabled = options[option];\n }\n else if (options[option] !== undefined) {\n // or if it's not undefined, do a plain assignment\n this.options[action][option] = options[option];\n }\n }\n }\n }\n\n /*\\\n * Interactable.getRect\n [ method ]\n *\n * The default function to get an Interactables bounding rect. Can be\n * overridden using @Interactable.rectChecker.\n *\n - element (Element) #optional The element to measure.\n = (object) The object's bounding rectangle.\n o {\n o top : 0,\n o left : 0,\n o bottom: 0,\n o right : 0,\n o width : 0,\n o height: 0\n o }\n \\*/\n getRect (element) {\n element = element || this.target;\n\n if (is.string(this.target) && !(is.element(element))) {\n element = this._context.querySelector(this.target);\n }\n\n return getElementRect(element);\n }\n\n /*\\\n * Interactable.rectChecker\n [ method ]\n *\n * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n - checker (function) #optional A function which returns this Interactable's bounding rectangle. See @Interactable.getRect\n = (function | object) The checker function or this Interactable\n \\*/\n rectChecker (checker) {\n if (is.function(checker)) {\n this.getRect = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.getRect;\n\n return this;\n }\n\n return this.getRect;\n }\n\n _backCompatOption (optionName, newValue) {\n if (trySelector(newValue) || is.object(newValue)) {\n this.options[optionName] = newValue;\n\n for (const action of actions.names) {\n this.options[action][optionName] = newValue;\n }\n\n return this;\n }\n\n return this.options[optionName];\n }\n\n /*\\\n * Interactable.origin\n [ method ]\n *\n * Gets or sets the origin of the Interactable's element. The x and y\n * of the origin will be subtracted from action event coordinates.\n *\n - origin (object | string) #optional An object eg. { x: 0, y: 0 } or string 'parent', 'self' or any CSS selector\n * OR\n - origin (Element) #optional An HTML or SVG Element whose rect will be used\n **\n = (object) The current origin or this Interactable\n \\*/\n origin (newValue) {\n return this._backCompatOption('origin', newValue);\n }\n\n /*\\\n * Interactable.deltaSource\n [ method ]\n *\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n - newValue (string) #optional Use 'client' if you will be scrolling while interacting; Use 'page' if you want autoScroll to work\n = (string | object) The current deltaSource or this Interactable\n \\*/\n deltaSource (newValue) {\n if (newValue === 'page' || newValue === 'client') {\n this.options.deltaSource = newValue;\n\n return this;\n }\n\n return this.options.deltaSource;\n }\n\n /*\\\n * Interactable.context\n [ method ]\n *\n * Gets the selector context Node of the Interactable. The default is `window.document`.\n *\n = (Node) The context Node of this Interactable\n **\n \\*/\n context () {\n return this._context;\n }\n\n inContext (element) {\n return (this._context === element.ownerDocument\n || nodeContains(this._context, element));\n }\n\n /*\\\n * Interactable.fire\n [ method ]\n *\n * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n - iEvent (InteractEvent) The InteractEvent object to be fired on this Interactable\n = (Interactable) this Interactable\n \\*/\n fire (iEvent) {\n this.events.fire(iEvent);\n\n return this;\n }\n\n _onOffMultiple (method, eventType, listener, options) {\n if (is.string(eventType) && eventType.search(' ') !== -1) {\n eventType = eventType.trim().split(/ +/);\n }\n\n if (is.array(eventType)) {\n for (let i = 0; i < eventType.length; i++) {\n this[method](eventType[i], listener, options);\n }\n\n return true;\n }\n\n if (is.object(eventType)) {\n for (const prop in eventType) {\n this[method](prop, eventType[prop], listener);\n }\n\n return true;\n }\n }\n\n /*\\\n * Interactable.on\n [ method ]\n *\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n - eventType (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) This Interactable\n \\*/\n on (eventType, listener, options) {\n if (this._onOffMultiple('on', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.on(eventType, listener);\n }\n // delegated event for selector\n else if (is.string(this.target)) {\n events.addDelegate(this.target, this._context, eventType, listener, options);\n }\n else {\n events.add(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.off\n [ method ]\n *\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n - eventType (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) This Interactable\n \\*/\n off (eventType, listener, options) {\n if (this._onOffMultiple('off', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n // if it is an action event type\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.off(eventType, listener);\n }\n // delegated event\n else if (is.string(this.target)) {\n events.removeDelegate(this.target, this._context, eventType, listener, options);\n }\n // remove listener from this Interatable's element\n else {\n events.remove(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.set\n [ method ]\n *\n * Reset the options of this Interactable\n - options (object) The new settings to apply\n = (object) This Interactable\n \\*/\n set (options) {\n if (!is.object(options)) {\n options = {};\n }\n\n this.options = extend({}, defaults.base);\n\n const perActions = extend({}, defaults.perAction);\n\n for (const actionName in actions.methodDict) {\n const methodName = actions.methodDict[actionName];\n\n this.options[actionName] = extend({}, defaults[actionName]);\n\n this.setPerAction(actionName, perActions);\n\n this[methodName](options[actionName]);\n }\n\n for (const setting of Interactable.settingsMethods) {\n this.options[setting] = defaults.base[setting];\n\n if (setting in options) {\n this[setting](options[setting]);\n }\n }\n\n signals.fire('set', {\n options,\n interactable: this,\n });\n\n return this;\n }\n\n /*\\\n * Interactable.unset\n [ method ]\n *\n * Remove this interactable from the list of interactables and remove\n * it's action capabilities and event listeners\n *\n = (object) @interact\n \\*/\n unset () {\n events.remove(this.target, 'all');\n\n if (is.string(this.target)) {\n // remove delegated events\n for (const type in events.delegatedEvents) {\n const delegated = events.delegatedEvents[type];\n\n if (delegated.selectors[0] === this.target\n && delegated.contexts[0] === this._context) {\n\n delegated.selectors.splice(0, 1);\n delegated.contexts .splice(0, 1);\n delegated.listeners.splice(0, 1);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegated[type] = null;\n }\n }\n\n events.remove(this._context, type, events.delegateListener);\n events.remove(this._context, type, events.delegateUseCapture, true);\n }\n }\n else {\n events.remove(this, 'all');\n }\n\n signals.fire('unset', { interactable: this });\n\n scope.interactables.splice(indexOf(scope.interactables, this), 1);\n\n // Stop related interactions when an Interactable is unset\n for (const interaction of scope.interactions || []) {\n if (interaction.target === this && interaction.interacting()) {\n interaction.stop();\n }\n }\n\n return scope.interact;\n }\n}\n\nscope.interactables.indexOfElement = function indexOfElement (target, context) {\n context = context || scope.document;\n\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n if (interactable.target === target && interactable._context === context) {\n return i;\n }\n }\n return -1;\n};\n\nscope.interactables.get = function interactableGet (element, options, dontCheckInContext) {\n const ret = this[this.indexOfElement(element, options && options.context)];\n\n return ret && (is.string(element) || dontCheckInContext || ret.inContext(element))? ret : null;\n};\n\nscope.interactables.forEachSelector = function (callback, element) {\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n // skip non CSS selector targets and out of context elements\n if (!is.string(interactable.target)\n || (element && !interactable.inContext(element))) {\n continue;\n }\n\n const ret = callback(interactable, interactable.target, interactable._context, i, this);\n\n if (ret !== undefined) {\n return ret;\n }\n }\n};\n\n// all interact.js eventTypes\nInteractable.eventTypes = scope.eventTypes = [];\n\nInteractable.signals = signals;\n\nInteractable.settingsMethods = [ 'deltaSource', 'origin', 'preventDefault', 'rectChecker' ];\n\nmodule.exports = Interactable;\n","const scope = require('./scope');\nconst utils = require('./utils');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst domObjects = require('./utils/domObjects');\nconst finder = require('./utils/interactionFinder');\nconst signals = require('./utils/Signals').new();\n\nconst listeners = {};\nconst methodNames = [\n 'pointerDown', 'pointerMove', 'pointerUp',\n 'updatePointer', 'removePointer',\n];\n\n// for ignoring browser's simulated mouse events\nlet prevTouchTime = 0;\n\n// all active and idle interactions\nscope.interactions = [];\n\nclass Interaction {\n constructor ({ pointerType }) {\n this.target = null; // current interactable being interacted with\n this.element = null; // the target element of the interactable\n\n this.prepared = { // action that's ready to be fired on next move event\n name : null,\n axis : null,\n edges: null,\n };\n\n // keep track of added pointers\n this.pointers = [];\n this.pointerIds = [];\n this.downTargets = [];\n this.downTimes = [];\n\n // Previous native pointer move event coordinates\n this.prevCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n // current native pointer move event coordinates\n this.curCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Starting InteractEvent pointer coordinates\n this.startCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Change in coordinates and time of the pointer\n this.pointerDelta = {\n page : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n client : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n timeStamp: 0,\n };\n\n this.downEvent = null; // pointerdown/mousedown/touchstart event\n this.downPointer = {};\n\n this._eventTarget = null;\n this._curEventTarget = null;\n\n this.prevEvent = null; // previous action event\n\n this.pointerIsDown = false;\n this.pointerWasMoved = false;\n this._interacting = false;\n\n this.pointerType = pointerType;\n\n signals.fire('new', this);\n\n scope.interactions.push(this);\n }\n\n pointerDown (pointer, event, eventTarget) {\n const pointerIndex = this.updatePointer(pointer, event, true);\n\n signals.fire('down', {\n pointer,\n event,\n eventTarget,\n pointerIndex,\n interaction: this,\n });\n }\n\n /*\\\n * Interaction.start\n [ method ]\n *\n * Start an action with the given Interactable and Element as tartgets. The\n * action must be enabled for the target Interactable and an appropriate number\n * of pointers must be held down - 1 for drag/resize, 2 for gesture.\n *\n * Use it with `interactable.able({ manualStart: false })` to always\n * [start actions manually](https://github.com/taye/interact.js/issues/114)\n *\n - action (object) The action to be performed - drag, resize, etc.\n - target (Interactable) The Interactable to target\n - element (Element) The DOM Element to target\n = (object) interact\n **\n | interact(target)\n | .draggable({\n | // disable the default drag start by down->move\n | manualStart: true\n | })\n | // start dragging after the user holds the pointer down\n | .on('hold', function (event) {\n | var interaction = event.interaction;\n |\n | if (!interaction.interacting()) {\n | interaction.start({ name: 'drag' },\n | event.interactable,\n | event.currentTarget);\n | }\n | });\n \\*/\n start (action, target, element) {\n if (this.interacting()\n || !this.pointerIsDown\n || this.pointerIds.length < (action.name === 'gesture'? 2 : 1)) {\n return;\n }\n\n // if this interaction had been removed after stopping\n // add it back\n if (utils.indexOf(scope.interactions, this) === -1) {\n scope.interactions.push(this);\n }\n\n utils.copyAction(this.prepared, action);\n this.target = target;\n this.element = element;\n\n signals.fire('action-start', {\n interaction: this,\n event: this.downEvent,\n });\n }\n\n pointerMove (pointer, event, eventTarget) {\n if (!this.simulation) {\n this.updatePointer(pointer);\n utils.setCoords(this.curCoords, this.pointers);\n }\n\n const duplicateMove = (this.curCoords.page.x === this.prevCoords.page.x\n && this.curCoords.page.y === this.prevCoords.page.y\n && this.curCoords.client.x === this.prevCoords.client.x\n && this.curCoords.client.y === this.prevCoords.client.y);\n\n let dx;\n let dy;\n\n // register movement greater than pointerMoveTolerance\n if (this.pointerIsDown && !this.pointerWasMoved) {\n dx = this.curCoords.client.x - this.startCoords.client.x;\n dy = this.curCoords.client.y - this.startCoords.client.y;\n\n this.pointerWasMoved = utils.hypot(dx, dy) > Interaction.pointerMoveTolerance;\n }\n\n const signalArg = {\n pointer,\n pointerIndex: this.getPointerIndex(pointer),\n event,\n eventTarget,\n dx,\n dy,\n duplicate: duplicateMove,\n interaction: this,\n interactingBeforeMove: this.interacting(),\n };\n\n if (!duplicateMove) {\n // set pointer coordinate, time changes and speeds\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n }\n\n signals.fire('move', signalArg);\n\n if (!duplicateMove) {\n // if interacting, fire an 'action-move' signal etc\n if (this.interacting()) {\n this.doMove(signalArg);\n }\n\n if (this.pointerWasMoved) {\n utils.copyCoords(this.prevCoords, this.curCoords);\n }\n }\n }\n\n /*\\\n * Interaction.doMove\n [ method ]\n *\n * Force a move of the current action at the same coordinates. Useful if\n * snap/restrict has been changed and you want a movement with the new\n * settings.\n *\n **\n | interact(target)\n | .draggable(true)\n | .on('dragmove', function (event) {\n | if (someCondition) {\n | // change the snap settings\n | event.interactable.draggable({ snap: { targets: [] }});\n | // fire another move event with re-calculated snap\n | event.interaction.doMove();\n | }\n | });\n \\*/\n doMove (signalArg) {\n signalArg = utils.extend({\n pointer: this.pointers[0],\n event: this.prevEvent,\n eventTarget: this._eventTarget,\n interaction: this,\n }, signalArg || {});\n\n signals.fire('before-action-move', signalArg);\n\n if (!this._dontFireMove) {\n signals.fire('action-move', signalArg);\n }\n\n this._dontFireMove = false;\n }\n\n // End interact move events and stop auto-scroll unless simulation is running\n pointerUp (pointer, event, eventTarget, curEventTarget) {\n const pointerIndex = this.getPointerIndex(pointer);\n\n signals.fire(/cancel$/i.test(event.type)? 'cancel' : 'up', {\n pointer,\n pointerIndex,\n event,\n eventTarget,\n curEventTarget,\n interaction: this,\n });\n\n if (!this.simulation) {\n this.end(event);\n }\n\n this.pointerIsDown = false;\n this.removePointer(pointer, event);\n }\n\n /*\\\n * Interaction.end\n [ method ]\n *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n - event (PointerEvent) #optional\n **\n | interact(target)\n | .draggable(true)\n | .on('move', function (event) {\n | if (event.pageX > 1000) {\n | // end the current action\n | event.interaction.end();\n | // stop all further listeners from being called\n | event.stopImmediatePropagation();\n | }\n | });\n \\*/\n end (event) {\n event = event || this.prevEvent;\n\n if (this.interacting()) {\n signals.fire('action-end', {\n event,\n interaction: this,\n });\n }\n\n this.stop();\n }\n\n currentAction () {\n return this._interacting? this.prepared.name: null;\n }\n\n interacting () {\n return this._interacting;\n }\n\n stop () {\n signals.fire('stop', { interaction: this });\n\n if (this._interacting) {\n signals.fire('stop-active', { interaction: this });\n signals.fire('stop-' + this.prepared.name, { interaction: this });\n }\n\n this.target = this.element = null;\n\n this._interacting = false;\n this.prepared.name = this.prevEvent = null;\n }\n\n getPointerIndex (pointer) {\n // mouse and pen interactions may have only one pointer\n if (this.pointerType === 'mouse' || this.pointerType === 'pen') {\n return 0;\n }\n\n return utils.indexOf(this.pointerIds, utils.getPointerId(pointer));\n }\n\n updatePointer (pointer, event, down = event && /(down|start)$/i.test(event.type)) {\n const id = utils.getPointerId(pointer);\n let index = this.getPointerIndex(pointer);\n\n if (index === -1) {\n index = this.pointerIds.length;\n this.pointerIds[index] = id;\n }\n\n if (down) {\n signals.fire('update-pointer-down', {\n pointer,\n event,\n down,\n pointerId: id,\n pointerIndex: index,\n interaction: this,\n });\n }\n\n this.pointers[index] = pointer;\n\n return index;\n }\n\n removePointer (pointer, event) {\n const index = this.getPointerIndex(pointer);\n\n if (index === -1) { return; }\n\n signals.fire('remove-pointer', {\n pointer,\n event,\n pointerIndex: index,\n interaction: this,\n });\n\n this.pointers .splice(index, 1);\n this.pointerIds .splice(index, 1);\n this.downTargets.splice(index, 1);\n this.downTimes .splice(index, 1);\n }\n\n _updateEventTargets (target, currentTarget) {\n this._eventTarget = target;\n this._curEventTarget = currentTarget;\n }\n}\n\nfor (let i = 0, len = methodNames.length; i < len; i++) {\n const method = methodNames[i];\n\n listeners[method] = doOnInteractions(method);\n}\n\nfunction doOnInteractions (method) {\n return (function (event) {\n const pointerType = utils.getPointerType(event);\n const [eventTarget, curEventTarget] = utils.getEventTargets(event);\n const matches = []; // [ [pointer, interaction], ...]\n\n if (browser.supportsTouch && /touch/.test(event.type)) {\n prevTouchTime = new Date().getTime();\n\n for (let i = 0; i < event.changedTouches.length; i++) {\n const pointer = event.changedTouches[i];\n const interaction = finder.search(pointer, event.type, eventTarget);\n\n matches.push([pointer, interaction || new Interaction({ pointerType })]);\n }\n }\n else {\n let invalidPointer = false;\n\n if (!browser.supportsPointerEvent && /mouse/.test(event.type)) {\n // ignore mouse events while touch interactions are active\n for (let i = 0; i < scope.interactions.length && !invalidPointer; i++) {\n invalidPointer = scope.interactions[i].pointerType !== 'mouse' && scope.interactions[i].pointerIsDown;\n }\n\n // try to ignore mouse events that are simulated by the browser\n // after a touch event\n invalidPointer = invalidPointer\n || (new Date().getTime() - prevTouchTime < 500)\n // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated\n || event.timeStamp === 0;\n }\n\n if (!invalidPointer) {\n let interaction = finder.search(event, event.type, eventTarget);\n\n if (!interaction) {\n interaction = new Interaction({ pointerType });\n }\n\n matches.push([event, interaction]);\n }\n }\n\n for (const [pointer, interaction] of matches) {\n interaction._updateEventTargets(eventTarget, curEventTarget);\n interaction[method](pointer, event, eventTarget, curEventTarget);\n }\n });\n}\n\nfunction endAll (event) {\n for (let i = 0; i < scope.interactions.length; i++) {\n const interaction = scope.interactions[i];\n\n interaction.end(event);\n signals.fire('endall', { event, interaction });\n }\n}\n\nconst docEvents = { /* 'eventType': listenerFunc */ };\nconst pEventTypes = browser.pEventTypes;\n\nif (domObjects.PointerEvent) {\n docEvents[pEventTypes.down ] = listeners.pointerDown;\n docEvents[pEventTypes.move ] = listeners.pointerMove;\n docEvents[pEventTypes.up ] = listeners.pointerUp;\n docEvents[pEventTypes.cancel] = listeners.pointerUp;\n}\nelse {\n docEvents.mousedown = listeners.pointerDown;\n docEvents.mousemove = listeners.pointerMove;\n docEvents.mouseup = listeners.pointerUp;\n\n docEvents.touchstart = listeners.pointerDown;\n docEvents.touchmove = listeners.pointerMove;\n docEvents.touchend = listeners.pointerUp;\n docEvents.touchcancel = listeners.pointerUp;\n}\n\ndocEvents.blur = endAll;\n\nfunction onDocSignal ({ doc }, signalName) {\n const eventMethod = signalName.indexOf('add') === 0\n ? events.add : events.remove;\n\n // delegate event listener\n for (const eventType in scope.delegatedEvents) {\n eventMethod(doc, eventType, events.delegateListener);\n eventMethod(doc, eventType, events.delegateUseCapture, true);\n }\n\n for (const eventType in docEvents) {\n eventMethod(doc, eventType, docEvents[eventType]);\n }\n}\n\nsignals.on('update-pointer-down', ({ interaction, pointer, pointerId, pointerIndex, event, eventTarget, down }) => {\n interaction.pointerIds[pointerIndex] = pointerId;\n interaction.pointers[pointerIndex] = pointer;\n\n if (down) {\n interaction.pointerIsDown = true;\n }\n\n if (!interaction.interacting()) {\n utils.setCoords(interaction.startCoords, interaction.pointers);\n\n utils.copyCoords(interaction.curCoords , interaction.startCoords);\n utils.copyCoords(interaction.prevCoords, interaction.startCoords);\n\n interaction.downEvent = event;\n interaction.downTimes[pointerIndex] = interaction.curCoords.timeStamp;\n interaction.downTargets[pointerIndex] = eventTarget || event && utils.getEventTargets(event)[0];\n interaction.pointerWasMoved = false;\n\n utils.pointerExtend(interaction.downPointer, pointer);\n }\n});\n\nscope.signals.on('add-document' , onDocSignal);\nscope.signals.on('remove-document', onDocSignal);\n\nInteraction.pointerMoveTolerance = 1;\nInteraction.doOnInteractions = doOnInteractions;\nInteraction.endAll = endAll;\nInteraction.signals = signals;\nInteraction.docEvents = docEvents;\n\nscope.endAllInteractions = endAll;\n\nmodule.exports = Interaction;\n","const Interaction = require('../Interaction');\nconst InteractEvent = require('../InteractEvent');\n\nconst actions = {\n firePrepared,\n names: [],\n methodDict: {},\n};\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n interaction._interacting = true;\n firePrepared(interaction, event, 'start');\n});\n\nInteraction.signals.on('action-move', function ({ interaction, event, preEnd }) {\n firePrepared(interaction, event, 'move', preEnd);\n\n // if the action was ended in a listener\n if (!interaction.interacting()) { return false; }\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n firePrepared(interaction, event, 'end');\n});\n\nfunction firePrepared (interaction, event, phase, preEnd) {\n const actionName = interaction.prepared.name;\n\n const newEvent = new InteractEvent(interaction, event, actionName, phase, interaction.element, null, preEnd);\n\n interaction.target.fire(newEvent);\n interaction.prevEvent = newEvent;\n}\n\nmodule.exports = actions;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drag = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n startAxis : 'xy',\n lockAxis : 'xy',\n },\n\n checker: function (pointer, event, interactable) {\n const dragOptions = interactable.options.drag;\n\n return dragOptions.enabled\n ? { name: 'drag', axis: (dragOptions.lockAxis === 'start'\n ? dragOptions.startAxis\n : dragOptions.lockAxis)}\n : null;\n },\n\n getCursor: function () {\n return 'move';\n },\n};\n\nInteraction.signals.on('before-action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n interaction.curCoords.page.y = interaction.startCoords.page.y;\n interaction.curCoords.client.y = interaction.startCoords.client.y;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vx);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vx);\n interaction.pointerDelta.client.vy = 0;\n interaction.pointerDelta.page.vy = 0;\n }\n else if (axis === 'y') {\n interaction.curCoords.page.x = interaction.startCoords.page.x;\n interaction.curCoords.client.x = interaction.startCoords.client.x;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vy);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vy);\n interaction.pointerDelta.client.vx = 0;\n interaction.pointerDelta.page.vx = 0;\n }\n});\n\n// dragmove\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'dragmove') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n iEvent.pageY = interaction.startCoords.page.y;\n iEvent.clientY = interaction.startCoords.client.y;\n iEvent.dy = 0;\n }\n else if (axis === 'y') {\n iEvent.pageX = interaction.startCoords.page.x;\n iEvent.clientX = interaction.startCoords.client.x;\n iEvent.dx = 0;\n }\n});\n\n/*\\\n * Interactable.draggable\n [ method ]\n *\n * Gets or sets whether drag actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of drag events\n | var isDraggable = interact('ul li').draggable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on drag events (object makes the Interactable draggable)\n = (object) This Interactable\n | interact(element).draggable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // the axis in which the first movement must be\n | // for the drag sequence to start\n | // 'xy' by default - any direction\n | startAxis: 'x' || 'y' || 'xy',\n |\n | // 'xy' by default - don't restrict to one axis (move in any direction)\n | // 'x' or 'y' to restrict movement to either axis\n | // 'start' to restrict movement to the axis the drag started in\n | lockAxis: 'x' || 'y' || 'xy' || 'start',\n |\n | // max number of drags that can happen concurrently\n | // with elements of this Interactable. Infinity by default\n | max: Infinity,\n |\n | // max number of drags that can target the same element+Interactable\n | // 1 by default\n | maxPerElement: 2\n | });\n\\*/\nInteractable.prototype.draggable = function (options) {\n if (utils.is.object(options)) {\n this.options.drag.enabled = options.enabled === false? false: true;\n this.setPerAction('drag', options);\n this.setOnEvents('drag', options);\n\n if (/^(xy|x|y|start)$/.test(options.lockAxis)) {\n this.options.drag.lockAxis = options.lockAxis;\n }\n if (/^(xy|x|y)$/.test(options.startAxis)) {\n this.options.drag.startAxis = options.startAxis;\n }\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drag.enabled = options;\n\n if (!options) {\n this.ondragstart = this.ondragstart = this.ondragend = null;\n }\n\n return this;\n }\n\n return this.options.drag;\n};\n\nactions.drag = drag;\nactions.names.push('drag');\nutils.merge(Interactable.eventTypes, [\n 'dragstart',\n 'dragmove',\n 'draginertiastart',\n 'draginertiaresume',\n 'dragend',\n]);\nactions.methodDict.drag = 'draggable';\n\ndefaultOptions.drag = drag.defaults;\n\nmodule.exports = drag;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst scope = require('../scope');\nconst interact = require('../interact');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drop = {\n defaults: {\n enabled: false,\n accept : null,\n overlap: 'pointer',\n },\n};\n\nlet dynamicDrop = false;\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // reset active dropzones\n interaction.activeDrops.dropzones = [];\n interaction.activeDrops.elements = [];\n interaction.activeDrops.rects = [];\n\n interaction.dropEvents = null;\n\n if (!interaction.dynamicDrop) {\n setActiveDrops(interaction, interaction.element);\n }\n\n const dragEvent = interaction.prevEvent;\n const dropEvents = getDropEvents(interaction, event, dragEvent);\n\n if (dropEvents.activate) {\n fireActiveDrops(interaction, dropEvents.activate);\n }\n});\n\nInteractEvent.signals.on('new', function ({ interaction, iEvent, event }) {\n if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { return; }\n\n const draggableElement = interaction.element;\n const dragEvent = iEvent;\n const dropResult = getDrop(dragEvent, event, draggableElement);\n\n interaction.dropTarget = dropResult.dropzone;\n interaction.dropElement = dropResult.element;\n\n interaction.dropEvents = getDropEvents(interaction, event, dragEvent);\n});\n\nInteraction.signals.on('action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n fireDropEvents(interaction, interaction.dropEvents);\n});\n\nInteraction.signals.on('action-end', function ({ interaction }) {\n if (interaction.prepared.name === 'drag') {\n fireDropEvents(interaction, interaction.dropEvents);\n }\n});\n\nInteraction.signals.on('stop-drag', function ({ interaction }) {\n interaction.activeDrops.dropzones =\n interaction.activeDrops.elements =\n interaction.activeDrops.rects =\n interaction.dropEvents = null;\n});\n\nfunction collectDrops (interaction, element) {\n const drops = [];\n const elements = [];\n\n element = element || interaction.element;\n\n // collect all dropzones and their elements which qualify for a drop\n for (const current of scope.interactables) {\n if (!current.options.drop.enabled) { continue; }\n\n const accept = current.options.drop.accept;\n\n // test the draggable element against the dropzone's accept setting\n if ((utils.is.element(accept) && accept !== element)\n || (utils.is.string(accept)\n && !utils.matchesSelector(element, accept))) {\n\n continue;\n }\n\n // query for new elements if necessary\n const dropElements = utils.is.string(current.target)\n ? current._context.querySelectorAll(current.target)\n : [current.target];\n\n for (let i = 0; i < dropElements.length; i++) {\n const currentElement = dropElements[i];\n\n if (currentElement !== element) {\n drops.push(current);\n elements.push(currentElement);\n }\n }\n }\n\n return {\n elements,\n dropzones: drops,\n };\n}\n\nfunction fireActiveDrops (interaction, event) {\n let prevElement;\n\n // loop through all active dropzones and trigger event\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n const current = interaction.activeDrops.dropzones[i];\n const currentElement = interaction.activeDrops.elements [i];\n\n // prevent trigger of duplicate events on same element\n if (currentElement !== prevElement) {\n // set current element as event target\n event.target = currentElement;\n current.fire(event);\n }\n prevElement = currentElement;\n }\n}\n\n// Collect a new set of possible drops and save them in activeDrops.\n// setActiveDrops should always be called when a drag has just started or a\n// drag event happens while dynamicDrop is true\nfunction setActiveDrops (interaction, dragElement) {\n // get dropzones and their elements that could receive the draggable\n const possibleDrops = collectDrops(interaction, dragElement, true);\n\n interaction.activeDrops.dropzones = possibleDrops.dropzones;\n interaction.activeDrops.elements = possibleDrops.elements;\n interaction.activeDrops.rects = [];\n\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n interaction.activeDrops.rects[i] =\n interaction.activeDrops.dropzones[i].getRect(interaction.activeDrops.elements[i]);\n }\n}\n\nfunction getDrop (dragEvent, event, dragElement) {\n const interaction = dragEvent.interaction;\n const validDrops = [];\n\n if (dynamicDrop) {\n setActiveDrops(interaction, dragElement);\n }\n\n // collect all dropzones and their elements which qualify for a drop\n for (let j = 0; j < interaction.activeDrops.dropzones.length; j++) {\n const current = interaction.activeDrops.dropzones[j];\n const currentElement = interaction.activeDrops.elements [j];\n const rect = interaction.activeDrops.rects [j];\n\n validDrops.push(current.dropCheck(dragEvent, event, interaction.target, dragElement, currentElement, rect)\n ? currentElement\n : null);\n }\n\n // get the most appropriate dropzone based on DOM depth and order\n const dropIndex = utils.indexOfDeepestElement(validDrops);\n\n return {\n dropzone: interaction.activeDrops.dropzones[dropIndex] || null,\n element : interaction.activeDrops.elements [dropIndex] || null,\n };\n}\n\nfunction getDropEvents (interaction, pointerEvent, dragEvent) {\n const dropEvents = {\n enter : null,\n leave : null,\n activate : null,\n deactivate: null,\n move : null,\n drop : null,\n };\n\n const tmpl = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n };\n\n if (interaction.dropElement !== interaction.prevDropElement) {\n // if there was a prevDropTarget, create a dragleave event\n if (interaction.prevDropTarget) {\n dropEvents.leave = utils.extend({ type: 'dragleave' }, tmpl);\n\n dragEvent.dragLeave = dropEvents.leave.target = interaction.prevDropElement;\n dragEvent.prevDropzone = dropEvents.leave.dropzone = interaction.prevDropTarget;\n }\n // if the dropTarget is not null, create a dragenter event\n if (interaction.dropTarget) {\n dropEvents.enter = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n type : 'dragenter',\n };\n\n dragEvent.dragEnter = interaction.dropElement;\n dragEvent.dropzone = interaction.dropTarget;\n }\n }\n\n if (dragEvent.type === 'dragend' && interaction.dropTarget) {\n dropEvents.drop = utils.extend({ type: 'drop' }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n dragEvent.relatedTarget = interaction.dropElement;\n }\n if (dragEvent.type === 'dragstart') {\n dropEvents.activate = utils.extend({ type: 'dropactivate' }, tmpl);\n\n dropEvents.activate.target = null;\n dropEvents.activate.dropzone = null;\n }\n if (dragEvent.type === 'dragend') {\n dropEvents.deactivate = utils.extend({ type: 'dropdeactivate' }, tmpl);\n\n dropEvents.deactivate.target = null;\n dropEvents.deactivate.dropzone = null;\n }\n if (dragEvent.type === 'dragmove' && interaction.dropTarget) {\n dropEvents.move = utils.extend({\n dragmove : dragEvent,\n type : 'dropmove',\n }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n }\n\n return dropEvents;\n}\n\nfunction fireDropEvents (interaction, dropEvents) {\n if (dropEvents.leave) { interaction.prevDropTarget.fire(dropEvents.leave); }\n if (dropEvents.move ) { interaction.dropTarget.fire(dropEvents.move ); }\n if (dropEvents.enter) { interaction.dropTarget.fire(dropEvents.enter); }\n if (dropEvents.drop ) { interaction.dropTarget.fire(dropEvents.drop ); }\n if (dropEvents.deactivate) {\n fireActiveDrops(interaction, dropEvents.deactivate);\n }\n\n interaction.prevDropTarget = interaction.dropTarget;\n interaction.prevDropElement = interaction.dropElement;\n}\n\n/*\\\n * Interactable.dropzone\n [ method ]\n *\n * Returns or sets whether elements can be dropped onto this\n * Interactable to trigger drop events\n *\n * Dropzones can receive the following events:\n * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends\n * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone\n * - `dragmove` when a draggable that has entered the dropzone is moved\n * - `drop` when a draggable is dropped into this dropzone\n *\n * Use the `accept` option to allow only elements that match the given CSS\n * selector or element. The value can be:\n *\n * - **an Element** - only that element can be dropped into this dropzone.\n * - **a string**, - the element being dragged must match it as a CSS selector.\n * - **`null`** - accept options is cleared - it accepts any element.\n *\n * Use the `overlap` option to set how drops are checked for. The allowed\n * values are:\n *\n * - `'pointer'`, the pointer must be over the dropzone (default)\n * - `'center'`, the draggable element's center must be over the dropzone\n * - a number from 0-1 which is the `(intersection area) / (draggable area)`.\n * e.g. `0.5` for drop to happen when half of the area of the draggable is\n * over the dropzone\n *\n * Use the `checker` option to specify a function to check if a dragged\n * element is over this Interactable.\n *\n | interact(target)\n | .dropChecker(function(dragEvent, // related dragmove or dragend event\n | event, // TouchEvent/PointerEvent/MouseEvent\n | dropped, // bool result of the default checker\n | dropzone, // dropzone Interactable\n | dropElement, // dropzone elemnt\n | draggable, // draggable Interactable\n | draggableElement) {// draggable element\n |\n | return dropped && event.target.hasAttribute('allow-drop');\n | }\n *\n *\n - options (boolean | object | null) #optional The new value to be set.\n | interact('.drop').dropzone({\n | accept: '.can-drop' || document.getElementById('single-drop'),\n | overlap: 'pointer' || 'center' || zeroToOne\n | }\n = (boolean | object) The current setting or this Interactable\n\\*/\nInteractable.prototype.dropzone = function (options) {\n if (utils.is.object(options)) {\n this.options.drop.enabled = options.enabled === false? false: true;\n\n if (utils.is.function(options.ondrop) ) { this.events.ondrop = options.ondrop ; }\n if (utils.is.function(options.ondropactivate) ) { this.events.ondropactivate = options.ondropactivate ; }\n if (utils.is.function(options.ondropdeactivate)) { this.events.ondropdeactivate = options.ondropdeactivate; }\n if (utils.is.function(options.ondragenter) ) { this.events.ondragenter = options.ondragenter ; }\n if (utils.is.function(options.ondragleave) ) { this.events.ondragleave = options.ondragleave ; }\n if (utils.is.function(options.ondropmove) ) { this.events.ondropmove = options.ondropmove ; }\n\n if (/^(pointer|center)$/.test(options.overlap)) {\n this.options.drop.overlap = options.overlap;\n }\n else if (utils.is.number(options.overlap)) {\n this.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0);\n }\n if ('accept' in options) {\n this.options.drop.accept = options.accept;\n }\n if ('checker' in options) {\n this.options.drop.checker = options.checker;\n }\n\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drop.enabled = options;\n\n if (!options) {\n this.ondragenter = this.ondragleave = this.ondrop\n = this.ondropactivate = this.ondropdeactivate = null;\n }\n\n return this;\n }\n\n return this.options.drop;\n};\n\nInteractable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) {\n let dropped = false;\n\n // if the dropzone has no rect (eg. display: none)\n // call the custom dropChecker or just return false\n if (!(rect = rect || this.getRect(dropElement))) {\n return (this.options.drop.checker\n ? this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement)\n : false);\n }\n\n const dropOverlap = this.options.drop.overlap;\n\n if (dropOverlap === 'pointer') {\n const origin = utils.getOriginXY(draggable, draggableElement, 'drag');\n const page = utils.getPageXY(dragEvent);\n\n page.x += origin.x;\n page.y += origin.y;\n\n const horizontal = (page.x > rect.left) && (page.x < rect.right);\n const vertical = (page.y > rect.top ) && (page.y < rect.bottom);\n\n dropped = horizontal && vertical;\n }\n\n const dragRect = draggable.getRect(draggableElement);\n\n if (dragRect && dropOverlap === 'center') {\n const cx = dragRect.left + dragRect.width / 2;\n const cy = dragRect.top + dragRect.height / 2;\n\n dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom;\n }\n\n if (dragRect && utils.is.number(dropOverlap)) {\n const overlapArea = (Math.max(0, Math.min(rect.right , dragRect.right ) - Math.max(rect.left, dragRect.left))\n * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top , dragRect.top )));\n\n const overlapRatio = overlapArea / (dragRect.width * dragRect.height);\n\n dropped = overlapRatio >= dropOverlap;\n }\n\n if (this.options.drop.checker) {\n dropped = this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement);\n }\n\n return dropped;\n};\n\nInteractable.signals.on('unset', function ({ interactable }) {\n interactable.dropzone(false);\n});\n\nInteractable.settingsMethods.push('dropChecker');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.dropTarget = null; // the dropzone a drag target might be dropped into\n interaction.dropElement = null; // the element at the time of checking\n interaction.prevDropTarget = null; // the dropzone that was recently dragged away from\n interaction.prevDropElement = null; // the element at the time of checking\n interaction.dropEvents = null; // the dropEvents related to the current drag event\n\n interaction.activeDrops = {\n dropzones: [], // the dropzones that are mentioned below\n elements : [], // elements of dropzones that accept the target draggable\n rects : [], // the rects of the elements mentioned above\n };\n\n});\n\nInteraction.signals.on('stop', function ({ interaction }) {\n interaction.dropTarget = interaction.dropElement =\n interaction.prevDropTarget = interaction.prevDropElement = null;\n});\n\n/*\\\n * interact.dynamicDrop\n [ method ]\n *\n * Returns or sets whether the dimensions of dropzone elements are\n * calculated on every dragmove or only on dragstart for the default\n * dropChecker\n *\n - newValue (boolean) #optional True to check on each move. False to check only before start\n = (boolean | interact) The current setting or interact\n\\*/\ninteract.dynamicDrop = function (newValue) {\n if (utils.is.bool(newValue)) {\n //if (dragging && dynamicDrop !== newValue && !newValue) {\n //calcRects(dropzones);\n //}\n\n dynamicDrop = newValue;\n\n return interact;\n }\n return dynamicDrop;\n};\n\nutils.merge(Interactable.eventTypes, [\n 'dragenter',\n 'dragleave',\n 'dropactivate',\n 'dropdeactivate',\n 'dropmove',\n 'drop',\n]);\nactions.methodDict.drop = 'dropzone';\n\ndefaultOptions.drop = drop.defaults;\n\nmodule.exports = drop;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst gesture = {\n defaults: {\n enabled : false,\n origin : null,\n restrict: null,\n },\n\n checker: function (pointer, event, interactable, element, interaction) {\n if (interaction.pointerIds.length >= 2) {\n return { name: 'gesture' };\n }\n\n return null;\n },\n\n getCursor: function () {\n return '';\n },\n};\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturestart') { return; }\n iEvent.ds = 0;\n\n interaction.gesture.startDistance = interaction.gesture.prevDistance = iEvent.distance;\n interaction.gesture.startAngle = interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.scale = 1;\n});\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturemove') { return; }\n\n iEvent.ds = iEvent.scale - interaction.gesture.scale;\n\n interaction.target.fire(iEvent);\n\n interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.prevDistance = iEvent.distance;\n\n if (iEvent.scale !== Infinity\n && iEvent.scale !== null\n && iEvent.scale !== undefined\n && !isNaN(iEvent.scale)) {\n\n interaction.gesture.scale = iEvent.scale;\n }\n});\n\n/*\\\n * Interactable.gesturable\n [ method ]\n *\n * Gets or sets whether multitouch gestures can be performed on the\n * Interactable's element\n *\n = (boolean) Indicates if this can be the target of gesture events\n | var isGestureable = interact(element).gesturable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on gesture events (makes the Interactable gesturable)\n = (object) this Interactable\n | interact(element).gesturable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // limit multiple gestures.\n | // See the explanation in @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n\\*/\nInteractable.prototype.gesturable = function (options) {\n if (utils.is.object(options)) {\n this.options.gesture.enabled = options.enabled === false? false: true;\n this.setPerAction('gesture', options);\n this.setOnEvents('gesture', options);\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.gesture.enabled = options;\n\n if (!options) {\n this.ongesturestart = this.ongesturestart = this.ongestureend = null;\n }\n\n return this;\n }\n\n return this.options.gesture;\n};\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action, event, starting, ending, deltaSource }) {\n if (action !== 'gesture') { return; }\n\n const pointers = interaction.pointers;\n\n iEvent.touches = [pointers[0], pointers[1]];\n\n if (starting) {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = 1;\n iEvent.ds = 0;\n iEvent.angle = utils.touchAngle(pointers, undefined, deltaSource);\n iEvent.da = 0;\n }\n else if (ending || event instanceof InteractEvent) {\n iEvent.distance = interaction.prevEvent.distance;\n iEvent.box = interaction.prevEvent.box;\n iEvent.scale = interaction.prevEvent.scale;\n iEvent.ds = iEvent.scale - 1;\n iEvent.angle = interaction.prevEvent.angle;\n iEvent.da = iEvent.angle - interaction.gesture.startAngle;\n }\n else {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = iEvent.distance / interaction.gesture.startDistance;\n iEvent.angle = utils.touchAngle(pointers, interaction.gesture.prevAngle, deltaSource);\n\n iEvent.ds = iEvent.scale - interaction.gesture.prevScale;\n iEvent.da = iEvent.angle - interaction.gesture.prevAngle;\n }\n});\n\nInteraction.signals.on('new', function (interaction) {\n interaction.gesture = {\n start: { x: 0, y: 0 },\n\n startDistance: 0, // distance between two touches of touchStart\n prevDistance : 0,\n distance : 0,\n\n scale: 1, // gesture.distance / gesture.startDistance\n\n startAngle: 0, // angle of line joining two touches\n prevAngle : 0, // angle of the previous gesture event\n };\n});\n\nactions.gesture = gesture;\nactions.names.push('gesture');\nutils.merge(Interactable.eventTypes, [\n 'gesturestart',\n 'gesturemove',\n 'gestureend',\n]);\nactions.methodDict.gesture = 'gesturable';\n\ndefaultOptions.gesture = gesture.defaults;\n\nmodule.exports = gesture;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\n// Less Precision with touch input\nconst defaultMargin = browser.supportsTouch || browser.supportsPointerEvent? 20: 10;\n\nconst resize = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n square: false,\n preserveAspectRatio: false,\n axis: 'xy',\n\n // use default margin\n margin: NaN,\n\n // object with props left, right, top, bottom which are\n // true/false values to resize when the pointer is over that edge,\n // CSS selectors to match the handles for each direction\n // or the Elements for each handle\n edges: null,\n\n // a value of 'none' will limit the resize rect to a minimum of 0x0\n // 'negate' will alow the rect to have negative width/height\n // 'reposition' will keep the width/height positive by swapping\n // the top and bottom edges and/or swapping the left and right edges\n invert: 'none',\n },\n\n checker: function (pointer, event, interactable, element, interaction, rect) {\n if (!rect) { return null; }\n\n const page = utils.extend({}, interaction.curCoords.page);\n const options = interactable.options;\n\n if (options.resize.enabled) {\n const resizeOptions = options.resize;\n const resizeEdges = { left: false, right: false, top: false, bottom: false };\n\n // if using resize.edges\n if (utils.is.object(resizeOptions.edges)) {\n for (const edge in resizeEdges) {\n resizeEdges[edge] = checkResizeEdge(edge,\n resizeOptions.edges[edge],\n page,\n interaction._eventTarget,\n element,\n rect,\n resizeOptions.margin || defaultMargin);\n }\n\n resizeEdges.left = resizeEdges.left && !resizeEdges.right;\n resizeEdges.top = resizeEdges.top && !resizeEdges.bottom;\n\n if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) {\n return {\n name: 'resize',\n edges: resizeEdges,\n };\n }\n }\n else {\n const right = options.resize.axis !== 'y' && page.x > (rect.right - defaultMargin);\n const bottom = options.resize.axis !== 'x' && page.y > (rect.bottom - defaultMargin);\n\n if (right || bottom) {\n return {\n name: 'resize',\n axes: (right? 'x' : '') + (bottom? 'y' : ''),\n };\n }\n }\n }\n\n return null;\n },\n\n cursors: (browser.isIe9OrOlder ? {\n x : 'e-resize',\n y : 's-resize',\n xy: 'se-resize',\n\n top : 'n-resize',\n left : 'w-resize',\n bottom : 's-resize',\n right : 'e-resize',\n topleft : 'se-resize',\n bottomright: 'se-resize',\n topright : 'ne-resize',\n bottomleft : 'ne-resize',\n } : {\n x : 'ew-resize',\n y : 'ns-resize',\n xy: 'nwse-resize',\n\n top : 'ns-resize',\n left : 'ew-resize',\n bottom : 'ns-resize',\n right : 'ew-resize',\n topleft : 'nwse-resize',\n bottomright: 'nwse-resize',\n topright : 'nesw-resize',\n bottomleft : 'nesw-resize',\n }),\n\n getCursor: function (action) {\n if (action.axis) {\n return resize.cursors[action.name + action.axis];\n }\n else if (action.edges) {\n let cursorKey = '';\n const edgeNames = ['top', 'bottom', 'left', 'right'];\n\n for (let i = 0; i < 4; i++) {\n if (action.edges[edgeNames[i]]) {\n cursorKey += edgeNames[i];\n }\n }\n\n return resize.cursors[cursorKey];\n }\n },\n};\n\n// resizestart\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'resizestart' || !interaction.prepared.edges) {\n return;\n }\n\n const startRect = interaction.target.getRect(interaction.element);\n const resizeOptions = interaction.target.options.resize;\n\n /*\n * When using the `resizable.square` or `resizable.preserveAspectRatio` options, resizing from one edge\n * will affect another. E.g. with `resizable.square`, resizing to make the right edge larger will make\n * the bottom edge larger by the same amount. We call these 'linked' edges. Any linked edges will depend\n * on the active edges and the edge being interacted with.\n */\n if (resizeOptions.square || resizeOptions.preserveAspectRatio) {\n const linkedEdges = utils.extend({}, interaction.prepared.edges);\n\n linkedEdges.top = linkedEdges.top || (linkedEdges.left && !linkedEdges.bottom);\n linkedEdges.left = linkedEdges.left || (linkedEdges.top && !linkedEdges.right );\n linkedEdges.bottom = linkedEdges.bottom || (linkedEdges.right && !linkedEdges.top );\n linkedEdges.right = linkedEdges.right || (linkedEdges.bottom && !linkedEdges.left );\n\n interaction.prepared._linkedEdges = linkedEdges;\n }\n else {\n interaction.prepared._linkedEdges = null;\n }\n\n // if using `resizable.preserveAspectRatio` option, record aspect ratio at the start of the resize\n if (resizeOptions.preserveAspectRatio) {\n interaction.resizeStartAspectRatio = startRect.width / startRect.height;\n }\n\n interaction.resizeRects = {\n start : startRect,\n current : utils.extend({}, startRect),\n inverted : utils.extend({}, startRect),\n previous : utils.extend({}, startRect),\n delta : {\n left: 0, right : 0, width : 0,\n top : 0, bottom: 0, height: 0,\n },\n };\n\n iEvent.rect = interaction.resizeRects.inverted;\n iEvent.deltaRect = interaction.resizeRects.delta;\n});\n\n// resizemove\nInteractEvent.signals.on('new', function ({ iEvent, phase, interaction }) {\n if (phase !== 'move' || !interaction.prepared.edges) { return; }\n\n const resizeOptions = interaction.target.options.resize;\n const invert = resizeOptions.invert;\n const invertible = invert === 'reposition' || invert === 'negate';\n\n let edges = interaction.prepared.edges;\n\n const start = interaction.resizeRects.start;\n const current = interaction.resizeRects.current;\n const inverted = interaction.resizeRects.inverted;\n const delta = interaction.resizeRects.delta;\n const previous = utils.extend(interaction.resizeRects.previous, inverted);\n const originalEdges = edges;\n\n let dx = iEvent.dx;\n let dy = iEvent.dy;\n\n if (resizeOptions.preserveAspectRatio || resizeOptions.square) {\n // `resize.preserveAspectRatio` takes precedence over `resize.square`\n const startAspectRatio = resizeOptions.preserveAspectRatio\n ? interaction.resizeStartAspectRatio\n : 1;\n\n edges = interaction.prepared._linkedEdges;\n\n if ((originalEdges.left && originalEdges.bottom)\n || (originalEdges.right && originalEdges.top)) {\n dy = -dx / startAspectRatio;\n }\n else if (originalEdges.left || originalEdges.right ) { dy = dx / startAspectRatio; }\n else if (originalEdges.top || originalEdges.bottom) { dx = dy * startAspectRatio; }\n }\n\n // update the 'current' rect without modifications\n if (edges.top ) { current.top += dy; }\n if (edges.bottom) { current.bottom += dy; }\n if (edges.left ) { current.left += dx; }\n if (edges.right ) { current.right += dx; }\n\n if (invertible) {\n // if invertible, copy the current rect\n utils.extend(inverted, current);\n\n if (invert === 'reposition') {\n // swap edge values if necessary to keep width/height positive\n let swap;\n\n if (inverted.top > inverted.bottom) {\n swap = inverted.top;\n\n inverted.top = inverted.bottom;\n inverted.bottom = swap;\n }\n if (inverted.left > inverted.right) {\n swap = inverted.left;\n\n inverted.left = inverted.right;\n inverted.right = swap;\n }\n }\n }\n else {\n // if not invertible, restrict to minimum of 0x0 rect\n inverted.top = Math.min(current.top, start.bottom);\n inverted.bottom = Math.max(current.bottom, start.top);\n inverted.left = Math.min(current.left, start.right);\n inverted.right = Math.max(current.right, start.left);\n }\n\n inverted.width = inverted.right - inverted.left;\n inverted.height = inverted.bottom - inverted.top ;\n\n for (const edge in inverted) {\n delta[edge] = inverted[edge] - previous[edge];\n }\n\n iEvent.edges = interaction.prepared.edges;\n iEvent.rect = inverted;\n iEvent.deltaRect = delta;\n});\n\n/*\\\n * Interactable.resizable\n [ method ]\n *\n * Gets or sets whether resize actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of resize elements\n | var isResizeable = interact('input[type=text]').resizable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on resize events (object makes the Interactable resizable)\n = (object) This Interactable\n | interact(element).resizable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | edges: {\n | top : true, // Use pointer coords to check for resize.\n | left : false, // Disable resizing from left edge.\n | bottom: '.resize-s',// Resize if pointer target matches selector\n | right : handleEl // Resize if pointer target is the given Element\n | },\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height are adjusted at a 1:1 ratio.\n | square: false,\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height maintain the aspect ratio they had when resizing started.\n | preserveAspectRatio: false,\n |\n | // a value of 'none' will limit the resize rect to a minimum of 0x0\n | // 'negate' will allow the rect to have negative width/height\n | // 'reposition' will keep the width/height positive by swapping\n | // the top and bottom edges and/or swapping the left and right edges\n | invert: 'none' || 'negate' || 'reposition'\n |\n | // limit multiple resizes.\n | // See the explanation in the @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n \\*/\nInteractable.prototype.resizable = function (options) {\n if (utils.is.object(options)) {\n this.options.resize.enabled = options.enabled === false? false: true;\n this.setPerAction('resize', options);\n this.setOnEvents('resize', options);\n\n if (/^x$|^y$|^xy$/.test(options.axis)) {\n this.options.resize.axis = options.axis;\n }\n else if (options.axis === null) {\n this.options.resize.axis = defaultOptions.resize.axis;\n }\n\n if (utils.is.bool(options.preserveAspectRatio)) {\n this.options.resize.preserveAspectRatio = options.preserveAspectRatio;\n }\n else if (utils.is.bool(options.square)) {\n this.options.resize.square = options.square;\n }\n\n return this;\n }\n if (utils.is.bool(options)) {\n this.options.resize.enabled = options;\n\n if (!options) {\n this.onresizestart = this.onresizestart = this.onresizeend = null;\n }\n\n return this;\n }\n return this.options.resize;\n};\n\nfunction checkResizeEdge (name, value, page, element, interactableElement, rect, margin) {\n // false, '', undefined, null\n if (!value) { return false; }\n\n // true value, use pointer coords and element rect\n if (value === true) {\n // if dimensions are negative, \"switch\" edges\n const width = utils.is.number(rect.width )? rect.width : rect.right - rect.left;\n const height = utils.is.number(rect.height)? rect.height : rect.bottom - rect.top ;\n\n if (width < 0) {\n if (name === 'left' ) { name = 'right'; }\n else if (name === 'right') { name = 'left' ; }\n }\n if (height < 0) {\n if (name === 'top' ) { name = 'bottom'; }\n else if (name === 'bottom') { name = 'top' ; }\n }\n\n if (name === 'left' ) { return page.x < ((width >= 0? rect.left: rect.right ) + margin); }\n if (name === 'top' ) { return page.y < ((height >= 0? rect.top : rect.bottom) + margin); }\n\n if (name === 'right' ) { return page.x > ((width >= 0? rect.right : rect.left) - margin); }\n if (name === 'bottom') { return page.y > ((height >= 0? rect.bottom: rect.top ) - margin); }\n }\n\n // the remaining checks require an element\n if (!utils.is.element(element)) { return false; }\n\n return utils.is.element(value)\n // the value is an element to use as a resize handle\n ? value === element\n // otherwise check if element matches value as selector\n : utils.matchesUpTo(element, value, interactableElement);\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.resizeAxes = 'xy';\n});\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action }) {\n if (action !== 'resize' || !interaction.resizeAxes) { return; }\n\n const options = interaction.target.options;\n\n if (options.resize.square) {\n if (interaction.resizeAxes === 'y') {\n iEvent.dx = iEvent.dy;\n }\n else {\n iEvent.dy = iEvent.dx;\n }\n iEvent.axes = 'xy';\n }\n else {\n iEvent.axes = interaction.resizeAxes;\n\n if (interaction.resizeAxes === 'x') {\n iEvent.dy = 0;\n }\n else if (interaction.resizeAxes === 'y') {\n iEvent.dx = 0;\n }\n }\n});\n\nactions.resize = resize;\nactions.names.push('resize');\nutils.merge(Interactable.eventTypes, [\n 'resizestart',\n 'resizemove',\n 'resizeinertiastart',\n 'resizeinertiaresume',\n 'resizeend',\n]);\nactions.methodDict.resize = 'resizable';\n\ndefaultOptions.resize = resize.defaults;\n\nmodule.exports = resize;\n","const raf = require('./utils/raf');\nconst getWindow = require('./utils/window').getWindow;\nconst is = require('./utils/is');\nconst domUtils = require('./utils/domUtils');\nconst Interaction = require('./Interaction');\nconst defaultOptions = require('./defaultOptions');\n\nconst autoScroll = {\n defaults: {\n enabled : false,\n container: null, // the item that is scrolled (Window or HTMLElement)\n margin : 60,\n speed : 300, // the scroll speed in pixels per second\n },\n\n interaction: null,\n i: null, // the handle returned by window.setInterval\n x: 0, y: 0, // Direction each pulse is to scroll in\n\n isScrolling: false,\n prevTime: 0,\n\n start: function (interaction) {\n autoScroll.isScrolling = true;\n raf.cancel(autoScroll.i);\n\n autoScroll.interaction = interaction;\n autoScroll.prevTime = new Date().getTime();\n autoScroll.i = raf.request(autoScroll.scroll);\n },\n\n stop: function () {\n autoScroll.isScrolling = false;\n raf.cancel(autoScroll.i);\n },\n\n // scroll the window by the values in scroll.x/y\n scroll: function () {\n const options = autoScroll.interaction.target.options[autoScroll.interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(autoScroll.interaction.element);\n const now = new Date().getTime();\n // change in time in seconds\n const dt = (now - autoScroll.prevTime) / 1000;\n // displacement\n const s = options.speed * dt;\n\n if (s >= 1) {\n if (is.window(container)) {\n container.scrollBy(autoScroll.x * s, autoScroll.y * s);\n }\n else if (container) {\n container.scrollLeft += autoScroll.x * s;\n container.scrollTop += autoScroll.y * s;\n }\n\n autoScroll.prevTime = now;\n }\n\n if (autoScroll.isScrolling) {\n raf.cancel(autoScroll.i);\n autoScroll.i = raf.request(autoScroll.scroll);\n }\n },\n check: function (interactable, actionName) {\n const options = interactable.options;\n\n return options[actionName].autoScroll && options[actionName].autoScroll.enabled;\n },\n onInteractionMove: function ({ interaction, pointer }) {\n if (!(interaction.interacting()\n && autoScroll.check(interaction.target, interaction.prepared.name))) {\n return;\n }\n\n if (interaction.simulation) {\n autoScroll.x = autoScroll.y = 0;\n return;\n }\n\n let top;\n let right;\n let bottom;\n let left;\n\n const options = interaction.target.options[interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(interaction.element);\n\n if (is.window(container)) {\n left = pointer.clientX < autoScroll.margin;\n top = pointer.clientY < autoScroll.margin;\n right = pointer.clientX > container.innerWidth - autoScroll.margin;\n bottom = pointer.clientY > container.innerHeight - autoScroll.margin;\n }\n else {\n const rect = domUtils.getElementClientRect(container);\n\n left = pointer.clientX < rect.left + autoScroll.margin;\n top = pointer.clientY < rect.top + autoScroll.margin;\n right = pointer.clientX > rect.right - autoScroll.margin;\n bottom = pointer.clientY > rect.bottom - autoScroll.margin;\n }\n\n autoScroll.x = (right ? 1: left? -1: 0);\n autoScroll.y = (bottom? 1: top? -1: 0);\n\n if (!autoScroll.isScrolling) {\n // set the autoScroll properties to those of the target\n autoScroll.margin = options.margin;\n autoScroll.speed = options.speed;\n\n autoScroll.start(interaction);\n }\n },\n};\n\nInteraction.signals.on('stop-active', function () {\n autoScroll.stop();\n});\n\nInteraction.signals.on('action-move', autoScroll.onInteractionMove);\n\ndefaultOptions.perAction.autoScroll = autoScroll.defaults;\n\nmodule.exports = autoScroll;\n","const Interactable = require('../Interactable');\nconst actions = require('../actions/base');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.ignoreFrom\n [ method ]\n *\n * If the target of the `mousedown`, `pointerdown` or `touchstart`\n * event or any of it's parents match the given CSS selector or\n * Element, no drag/resize/gesture is started.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to not ignore any elements\n = (string | Element | object) The current ignoreFrom value or this Interactable\n **\n | interact(element, { ignoreFrom: document.getElementById('no-action') });\n | // or\n | interact(element).ignoreFrom('input, textarea, a');\n\\*/\nInteractable.prototype.ignoreFrom = function (newValue) {\n return this._backCompatOption('ignoreFrom', newValue);\n};\n\n/*\\\n * Interactable.allowFrom\n [ method ]\n *\n * A drag/resize/gesture is started only If the target of the\n * `mousedown`, `pointerdown` or `touchstart` event or any of it's\n * parents match the given CSS selector or Element.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to allow from any element\n = (string | Element | object) The current allowFrom value or this Interactable\n **\n | interact(element, { allowFrom: document.getElementById('drag-handle') });\n | // or\n | interact(element).allowFrom('.handle');\n\\*/\nInteractable.prototype.allowFrom = function (newValue) {\n return this._backCompatOption('allowFrom', newValue);\n};\n\nInteractable.prototype.testIgnore = function (ignoreFrom, interactableElement, element) {\n if (!ignoreFrom || !is.element(element)) { return false; }\n\n if (is.string(ignoreFrom)) {\n return domUtils.matchesUpTo(element, ignoreFrom, interactableElement);\n }\n else if (is.element(ignoreFrom)) {\n return domUtils.nodeContains(ignoreFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testAllow = function (allowFrom, interactableElement, element) {\n if (!allowFrom) { return true; }\n\n if (!is.element(element)) { return false; }\n\n if (is.string(allowFrom)) {\n return domUtils.matchesUpTo(element, allowFrom, interactableElement);\n }\n else if (is.element(allowFrom)) {\n return domUtils.nodeContains(allowFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testIgnoreAllow = function (options, interactableElement, eventTarget) {\n return (!this.testIgnore(options.ignoreFrom, interactableElement, eventTarget)\n && this.testAllow(options.allowFrom, interactableElement, eventTarget));\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (event.buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\n","const interact = require('../interact');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst actions = require('../actions/base');\nconst defaultOptions = require('../defaultOptions');\nconst browser = require('../utils/browser');\nconst scope = require('../scope');\nconst utils = require('../utils');\nconst signals = require('../utils/Signals').new();\n\nrequire('./InteractableMethods');\n\nconst autoStart = {\n signals,\n withinInteractionLimit,\n // Allow this many interactions to happen simultaneously\n maxInteractions: Infinity,\n defaults: {\n perAction: {\n manualStart: false,\n max: Infinity,\n maxPerElement: 1,\n allowFrom: null,\n ignoreFrom: null,\n },\n },\n setActionDefaults: function (action) {\n utils.extend(action.defaults, autoStart.defaults.perAction);\n },\n};\n\n// set cursor style on mousedown\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget }) {\n if (interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\n// set cursor style on mousemove\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget }) {\n if (!interaction.mouse\n || interaction.pointerIsDown\n || interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\nInteraction.signals.on('move', function (arg) {\n const { interaction, event } = arg;\n\n if (!interaction.pointerIsDown\n || interaction.interacting()\n || !interaction.pointerWasMoved\n || !interaction.prepared.name) {\n return;\n }\n\n signals.fire('before-start', arg);\n\n const target = interaction.target;\n\n if (interaction.prepared.name && target) {\n // check manualStart and interaction limit\n if (target.options[interaction.prepared.name].manualStart\n || !withinInteractionLimit(target, interaction.element, interaction.prepared)) {\n interaction.stop(event);\n }\n else {\n interaction.start(interaction.prepared, target, interaction.element);\n }\n }\n});\n\n// Check if the current target supports the action.\n// If so, return the validated action. Otherwise, return null\nfunction validateAction (action, interactable, element, eventTarget) {\n if (utils.is.object(action)\n && interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget)\n && interactable.options[action.name].enabled\n && withinInteractionLimit(interactable, element, action)) {\n return action;\n }\n\n return null;\n}\n\nfunction validateSelector (interaction, pointer, event, matches, matchElements, eventTarget) {\n for (let i = 0, len = matches.length; i < len; i++) {\n const match = matches[i];\n const matchElement = matchElements[i];\n const action = validateAction(match.getAction(pointer, event, interaction, matchElement),\n match,\n matchElement,\n eventTarget);\n\n if (action) {\n return {\n action,\n target: match,\n element: matchElement,\n };\n }\n }\n\n return {};\n}\n\nfunction getActionInfo (interaction, pointer, event, eventTarget) {\n let matches = [];\n let matchElements = [];\n\n let element = eventTarget;\n let action = null;\n\n function pushMatches (interactable, selector, context) {\n const elements = (browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined);\n\n if (utils.matchesSelector(element, selector, elements)) {\n\n matches.push(interactable);\n matchElements.push(element);\n }\n }\n\n while (utils.is.element(element)) {\n matches = [];\n matchElements = [];\n\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && (action = validateAction(elementInteractable.getAction(pointer, event, interaction, element, eventTarget),\n elementInteractable,\n element,\n eventTarget))\n && !elementInteractable.options[action.name].manualStart) {\n return {\n element,\n action,\n target: elementInteractable,\n };\n }\n else {\n scope.interactables.forEachSelector(pushMatches, element);\n\n const actionInfo = validateSelector(interaction, pointer, event, matches, matchElements, eventTarget);\n\n if (actionInfo.action\n && !actionInfo.target.options[actionInfo.action.name].manualStart) {\n return actionInfo;\n }\n }\n\n element = utils.parentNode(element);\n }\n\n return {};\n}\n\nfunction prepare (interaction, { action, target, element }) {\n action = action || {};\n\n if (interaction.target && interaction.target.options.styleCursor) {\n interaction.target._doc.documentElement.style.cursor = '';\n }\n\n interaction.target = target;\n interaction.element = element;\n utils.copyAction(interaction.prepared, action);\n\n if (target && target.options.styleCursor) {\n const cursor = action? actions[action.name].getCursor(action) : '';\n interaction.target._doc.documentElement.style.cursor = cursor;\n }\n\n signals.fire('prepared', { interaction: interaction });\n}\n\nInteraction.signals.on('stop', function ({ interaction }) {\n const target = interaction.target;\n\n if (target && target.options.styleCursor) {\n target._doc.documentElement.style.cursor = '';\n }\n});\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (utils.is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (utils.is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n const buttons = event.buttons || ({\n 0: 1,\n 1: 4,\n 3: 8,\n 4: 16,\n })[event.button];\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\nfunction withinInteractionLimit (interactable, element, action) {\n const options = interactable.options;\n const maxActions = options[action.name].max;\n const maxPerElement = options[action.name].maxPerElement;\n let activeInteractions = 0;\n let targetCount = 0;\n let targetElementCount = 0;\n\n // no actions if any of these values == 0\n if (!(maxActions && maxPerElement && autoStart.maxInteractions)) { return; }\n\n for (let i = 0, len = scope.interactions.length; i < len; i++) {\n const interaction = scope.interactions[i];\n const otherAction = interaction.prepared.name;\n\n if (!interaction.interacting()) { continue; }\n\n activeInteractions++;\n\n if (activeInteractions >= autoStart.maxInteractions) {\n return false;\n }\n\n if (interaction.target !== interactable) { continue; }\n\n targetCount += (otherAction === action.name)|0;\n\n if (targetCount >= maxActions) {\n return false;\n }\n\n if (interaction.element === element) {\n targetElementCount++;\n\n if (otherAction !== action.name || targetElementCount >= maxPerElement) {\n return false;\n }\n }\n }\n\n return autoStart.maxInteractions > 0;\n}\n\n/*\\\n * interact.maxInteractions\n [ method ]\n **\n * Returns or sets the maximum number of concurrent interactions allowed.\n * By default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables\n * and elements, you need to enable it in the draggable, resizable and\n * gesturable `'max'` and `'maxPerElement'` options.\n **\n - newValue (number) #optional Any number. newValue <= 0 means no interactions.\n\\*/\ninteract.maxInteractions = function (newValue) {\n if (utils.is.number(newValue)) {\n autoStart.maxInteractions = newValue;\n\n return this;\n }\n\n return autoStart.maxInteractions;\n};\n\nInteractable.settingsMethods.push('styleCursor');\nInteractable.settingsMethods.push('actionChecker');\nInteractable.settingsMethods.push('ignoreFrom');\nInteractable.settingsMethods.push('allowFrom');\n\ndefaultOptions.base.actionChecker = null;\ndefaultOptions.base.styleCursor = true;\n\nutils.extend(defaultOptions.perAction, autoStart.defaults.perAction);\n\nmodule.exports = autoStart;\n","const autoStart = require('./base');\nconst Interaction = require('../Interaction');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.delayTimer = null;\n});\n\nautoStart.signals.on('prepared', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.delayTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.target, interaction.element);\n }, delay);\n }\n});\n\nInteraction.signals.on('move', function ({ interaction, duplicate }) {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.delayTimer);\n }\n});\n\n// prevent regular down->move autoStart\nautoStart.signals.on('before-start', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.prepared.name = null;\n }\n});\n","const autoStart = require('./base');\nconst scope = require('../scope');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\n\nconst { matchesSelector, parentNode } = require('../utils/domUtils');\n\nautoStart.setActionDefaults(require('../actions/drag'));\n\nautoStart.signals.on('before-start', function ({ interaction, eventTarget, dx, dy }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // check if a drag is in the correct axis\n const absX = Math.abs(dx);\n const absY = Math.abs(dy);\n const options = interaction.target.options.drag;\n const startAxis = options.startAxis;\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy');\n\n interaction.prepared.axis = options.lockAxis === 'start'\n ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n : options.lockAxis;\n\n // if the movement isn't in the startAxis of the interactable\n if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) {\n // cancel the prepared action\n interaction.prepared.name = null;\n\n // then try to get a drag from another ineractable\n\n if (!interaction.prepared.name) {\n\n let element = eventTarget;\n\n const getDraggable = function (interactable, selector, context) {\n const elements = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n if (interactable === interaction.target) { return; }\n\n if (!options.manualStart\n && !interactable.testIgnoreAllow(options, element, eventTarget)\n && matchesSelector(element, selector, elements)) {\n\n const action = interactable.getAction(interaction.downPointer,\n interaction.downEvent,\n interaction,\n element);\n\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, interactable)\n && autoStart.validateAction(action, interactable, element, eventTarget)) {\n\n return interactable;\n }\n }\n };\n\n let action = null;\n\n // check all interactables\n while (is.element(element)) {\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && elementInteractable !== interaction.target\n && !elementInteractable.options.drag.manualStart) {\n\n action = elementInteractable.getAction(interaction.downPointer, interaction.downEvent, interaction, element);\n }\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, elementInteractable)) {\n\n interaction.prepared.name = 'drag';\n interaction.target = elementInteractable;\n interaction.element = element;\n break;\n }\n\n const selectorInteractable = scope.interactables.forEachSelector(getDraggable, element);\n\n if (selectorInteractable) {\n interaction.prepared.name = 'drag';\n interaction.target = selectorInteractable;\n interaction.element = element;\n break;\n }\n\n element = parentNode(element);\n }\n }\n }\n});\n\nfunction checkStartAxis (startAxis, interactable) {\n if (!interactable) { return false; }\n\n const thisAxis = interactable.options.drag.startAxis;\n\n return (startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis);\n}\n","require('./base').setActionDefaults(require('../actions/gesture'));\n","require('./base').setActionDefaults(require('../actions/resize'));\n","module.exports = {\n base: {\n accept : null,\n preventDefault: 'auto',\n deltaSource : 'page',\n },\n\n perAction: {\n origin: { x: 0, y: 0 },\n\n // only allow left button by default\n // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n mouseButtons: 1,\n\n inertia: {\n enabled : false,\n resistance : 10, // the lambda in exponential decay\n minSpeed : 100, // target speed must be above this for inertia to start\n endSpeed : 10, // the speed at which inertia is slow enough to stop\n allowResume : true, // allow resuming an action in inertia phase\n smoothEndDuration: 300, // animate to snap/restrict endOnly if there's no inertia\n },\n },\n};\n","/* browser entry point */\n\n// Legacy browser support\nrequire('./legacyBrowsers');\n\n// inertia\nrequire('./inertia');\n\n// modifiers\nrequire('./modifiers/snap');\nrequire('./modifiers/restrict');\n\n// pointerEvents\nrequire('./pointerEvents/base');\nrequire('./pointerEvents/holdRepeat');\nrequire('./pointerEvents/interactableTargets');\n\n// delay\nrequire('./autoStart/delay');\n\n// actions\nrequire('./actions/gesture');\nrequire('./actions/resize');\nrequire('./actions/drag');\nrequire('./actions/drop');\n\n// load these modifiers after resize is loaded\nrequire('./modifiers/snapSize');\nrequire('./modifiers/restrictEdges');\nrequire('./modifiers/restrictSize');\n\n// autoStart actions\nrequire('./autoStart/gesture');\nrequire('./autoStart/resize');\nrequire('./autoStart/drag');\n\n// Interactable preventDefault setting\nrequire('./interactablePreventDefault.js');\n\n// autoScroll\nrequire('./autoScroll');\n\n// export interact\nmodule.exports = require('./interact');\n","const InteractEvent = require('./InteractEvent');\nconst Interaction = require('./Interaction');\nconst modifiers = require('./modifiers');\nconst utils = require('./utils');\nconst animationFrame = require('./utils/raf');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.inertiaStatus = {\n active : false,\n smoothEnd : false,\n allowResume: false,\n\n startEvent: null,\n upCoords : {},\n\n xe: 0, ye: 0,\n sx: 0, sy: 0,\n\n t0: 0,\n vx0: 0, vys: 0,\n duration: 0,\n\n lambda_v0: 0,\n one_ve_v0: 0,\n i : null,\n };\n\n interaction.boundInertiaFrame = () => inertiaFrame .apply(interaction);\n interaction.boundSmoothEndFrame = () => smoothEndFrame.apply(interaction);\n});\n\nInteraction.signals.on('down', function ({ interaction, event, pointer, eventTarget }) {\n const status = interaction.inertiaStatus;\n\n // Check if the down event hits the current inertia target\n if (status.active) {\n let element = eventTarget;\n\n // climb up the DOM tree from the event target\n while (utils.is.element(element)) {\n\n // if interaction element is the current inertia target element\n if (element === interaction.element) {\n // stop inertia\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n\n // update pointers to the down event's coordinates\n interaction.updatePointer(pointer);\n utils.setCoords(interaction.curCoords, interaction.pointers);\n\n // fire appropriate signals\n const signalArg = { interaction };\n Interaction.signals.fire('before-action-move', signalArg);\n Interaction.signals.fire('action-resume' , signalArg);\n\n // fire a reume event\n const resumeEvent = new InteractEvent(interaction,\n event,\n interaction.prepared.name,\n 'inertiaresume',\n interaction.element);\n\n interaction.target.fire(resumeEvent);\n interaction.prevEvent = resumeEvent;\n modifiers.resetStatuses(interaction.modifierStatuses);\n\n utils.copyCoords(interaction.prevCoords, interaction.curCoords);\n break;\n }\n\n element = utils.parentNode(element);\n }\n }\n});\n\nInteraction.signals.on('up', function ({ interaction, event }) {\n const status = interaction.inertiaStatus;\n\n if (!interaction.interacting() || status.active) { return; }\n\n const target = interaction.target;\n const options = target && target.options;\n const inertiaOptions = options && interaction.prepared.name && options[interaction.prepared.name].inertia;\n\n const now = new Date().getTime();\n const statuses = {};\n const page = utils.extend({}, interaction.curCoords.page);\n const pointerSpeed = interaction.pointerDelta.client.speed;\n\n let smoothEnd = false;\n let modifierResult;\n\n // check if inertia should be started\n const inertiaPossible = (inertiaOptions && inertiaOptions.enabled\n && interaction.prepared.name !== 'gesture'\n && event !== status.startEvent);\n\n const inertia = (inertiaPossible\n && (now - interaction.curCoords.timeStamp) < 50\n && pointerSpeed > inertiaOptions.minSpeed\n && pointerSpeed > inertiaOptions.endSpeed);\n\n const modifierArg = {\n interaction,\n pageCoords: page,\n statuses,\n preEnd: true,\n requireEndOnly: true,\n };\n\n // smoothEnd\n if (inertiaPossible && !inertia) {\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n if (modifierResult.shouldMove && modifierResult.locked) {\n smoothEnd = true;\n }\n }\n\n if (!(inertia || smoothEnd)) { return; }\n\n utils.copyCoords(status.upCoords, interaction.curCoords);\n\n interaction.pointers[0] = status.startEvent =\n new InteractEvent(interaction, event, interaction.prepared.name, 'inertiastart', interaction.element);\n\n status.t0 = now;\n\n status.active = true;\n status.allowResume = inertiaOptions.allowResume;\n interaction.simulation = status;\n\n target.fire(status.startEvent);\n\n if (inertia) {\n status.vx0 = interaction.pointerDelta.client.vx;\n status.vy0 = interaction.pointerDelta.client.vy;\n status.v0 = pointerSpeed;\n\n calcInertia(interaction, status);\n\n utils.extend(page, interaction.curCoords.page);\n\n page.x += status.xe;\n page.y += status.ye;\n\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n status.modifiedXe += modifierResult.dx;\n status.modifiedYe += modifierResult.dy;\n\n status.i = animationFrame.request(interaction.boundInertiaFrame);\n }\n else {\n status.smoothEnd = true;\n status.xe = modifierResult.dx;\n status.ye = modifierResult.dy;\n\n status.sx = status.sy = 0;\n\n status.i = animationFrame.request(interaction.boundSmoothEndFrame);\n }\n});\n\nInteraction.signals.on('stop-active', function ({ interaction }) {\n const status = interaction.inertiaStatus;\n\n if (status.active) {\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n }\n});\n\nfunction calcInertia (interaction, status) {\n const inertiaOptions = interaction.target.options[interaction.prepared.name].inertia;\n const lambda = inertiaOptions.resistance;\n const inertiaDur = -Math.log(inertiaOptions.endSpeed / status.v0) / lambda;\n\n status.x0 = interaction.prevEvent.pageX;\n status.y0 = interaction.prevEvent.pageY;\n status.t0 = status.startEvent.timeStamp / 1000;\n status.sx = status.sy = 0;\n\n status.modifiedXe = status.xe = (status.vx0 - inertiaDur) / lambda;\n status.modifiedYe = status.ye = (status.vy0 - inertiaDur) / lambda;\n status.te = inertiaDur;\n\n status.lambda_v0 = lambda / status.v0;\n status.one_ve_v0 = 1 - inertiaOptions.endSpeed / status.v0;\n}\n\nfunction inertiaFrame () {\n updateInertiaCoords(this);\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n\n const status = this.inertiaStatus;\n const options = this.target.options[this.prepared.name].inertia;\n const lambda = options.resistance;\n const t = new Date().getTime() / 1000 - status.t0;\n\n if (t < status.te) {\n\n const progress = 1 - (Math.exp(-lambda * t) - status.lambda_v0) / status.one_ve_v0;\n\n if (status.modifiedXe === status.xe && status.modifiedYe === status.ye) {\n status.sx = status.xe * progress;\n status.sy = status.ye * progress;\n }\n else {\n const quadPoint = utils.getQuadraticCurvePoint(0, 0,\n status.xe,\n status.ye,\n status.modifiedXe,\n status.modifiedYe,\n progress);\n\n status.sx = quadPoint.x;\n status.sy = quadPoint.y;\n }\n\n this.doMove();\n\n status.i = animationFrame.request(this.boundInertiaFrame);\n }\n else {\n status.sx = status.modifiedXe;\n status.sy = status.modifiedYe;\n\n this.doMove();\n this.end(status.startEvent);\n status.active = false;\n this.simulation = null;\n }\n\n utils.copyCoords(this.prevCoords, this.curCoords);\n}\n\nfunction smoothEndFrame () {\n updateInertiaCoords(this);\n\n const status = this.inertiaStatus;\n const t = new Date().getTime() - status.t0;\n const duration = this.target.options[this.prepared.name].inertia.smoothEndDuration;\n\n if (t < duration) {\n status.sx = utils.easeOutQuad(t, 0, status.xe, duration);\n status.sy = utils.easeOutQuad(t, 0, status.ye, duration);\n\n this.pointerMove(status.startEvent, status.startEvent);\n\n status.i = animationFrame.request(this.boundSmoothEndFrame);\n }\n else {\n status.sx = status.xe;\n status.sy = status.ye;\n\n this.pointerMove(status.startEvent, status.startEvent);\n this.end(status.startEvent);\n\n status.smoothEnd =\n status.active = false;\n this.simulation = null;\n }\n}\n\nfunction updateInertiaCoords (interaction) {\n const status = interaction.inertiaStatus;\n\n // return if inertia isn't running\n if (!status.active) { return; }\n\n const pageUp = status.upCoords.page;\n const clientUp = status.upCoords.client;\n\n utils.setCoords(interaction.curCoords, [ {\n pageX : pageUp.x + status.sx,\n pageY : pageUp.y + status.sy,\n clientX: clientUp.x + status.sx,\n clientY: clientUp.y + status.sy,\n } ]);\n}\n","const browser = require('./utils/browser');\nconst events = require('./utils/events');\nconst utils = require('./utils');\nconst scope = require('./scope');\nconst Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\n\nconst globalEvents = {};\n\n/*\\\n * interact\n [ method ]\n *\n * The methods of this variable can be used to set elements as\n * interactables and also to change various default settings.\n *\n * Calling it as a function and passing an element or a valid CSS selector\n * string returns an Interactable object which has various methods to\n * configure it.\n *\n - element (Element | string) The HTML or SVG Element to interact with or CSS selector\n = (object) An @Interactable\n *\n > Usage\n | interact('#draggable').draggable(true);\n |\n | var rectables = interact('rect');\n | rectables\n | .gesturable(true)\n | .on('gesturemove', function (event) {\n | // ...\n | });\n\\*/\nfunction interact (element, options) {\n let interactable = scope.interactables.get(element, options);\n\n if (!interactable) {\n interactable = new Interactable(element, options);\n interactable.events.global = globalEvents;\n }\n\n return interactable;\n}\n\n/*\\\n * interact.isSet\n [ method ]\n *\n * Check if an element has been set\n - element (Element) The Element being searched for\n = (boolean) Indicates if the element or CSS selector was previously passed to interact\n\\*/\ninteract.isSet = function (element, options) {\n return scope.interactables.indexOfElement(element, options && options.context) !== -1;\n};\n\n/*\\\n * interact.on\n [ method ]\n *\n * Adds a global listener for an InteractEvent or adds a DOM event to\n * `document`\n *\n - type (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) interact\n\\*/\ninteract.on = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.on(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.on(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n // if it is an InteractEvent type, add listener to globalEvents\n if (utils.contains(Interactable.eventTypes, type)) {\n // if this type of event was never bound\n if (!globalEvents[type]) {\n globalEvents[type] = [listener];\n }\n else {\n globalEvents[type].push(listener);\n }\n }\n // If non InteractEvent type, addEventListener to document\n else {\n events.add(scope.document, type, listener, { options });\n }\n\n return interact;\n};\n\n/*\\\n * interact.off\n [ method ]\n *\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n - type (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) interact\n \\*/\ninteract.off = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.off(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.off(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n if (!utils.contains(Interactable.eventTypes, type)) {\n events.remove(scope.document, type, listener, options);\n }\n else {\n let index;\n\n if (type in globalEvents\n && (index = utils.indexOf(globalEvents[type], listener)) !== -1) {\n globalEvents[type].splice(index, 1);\n }\n }\n\n return interact;\n};\n\n/*\\\n * interact.debug\n [ method ]\n *\n * Returns an object which exposes internal data\n = (object) An object with properties that outline the current state and expose internal functions and variables\n\\*/\ninteract.debug = function () {\n return scope;\n};\n\n// expose the functions used to calculate multi-touch properties\ninteract.getPointerAverage = utils.pointerAverage;\ninteract.getTouchBBox = utils.touchBBox;\ninteract.getTouchDistance = utils.touchDistance;\ninteract.getTouchAngle = utils.touchAngle;\n\ninteract.getElementRect = utils.getElementRect;\ninteract.getElementClientRect = utils.getElementClientRect;\ninteract.matchesSelector = utils.matchesSelector;\ninteract.closest = utils.closest;\n\n/*\\\n * interact.supportsTouch\n [ method ]\n *\n = (boolean) Whether or not the browser supports touch input\n\\*/\ninteract.supportsTouch = function () {\n return browser.supportsTouch;\n};\n\n/*\\\n * interact.supportsPointerEvent\n [ method ]\n *\n = (boolean) Whether or not the browser supports PointerEvents\n\\*/\ninteract.supportsPointerEvent = function () {\n return browser.supportsPointerEvent;\n};\n\n/*\\\n * interact.stop\n [ method ]\n *\n * Cancels all interactions (end events are not fired)\n *\n - event (Event) An event on which to call preventDefault()\n = (object) interact\n\\*/\ninteract.stop = function (event) {\n for (let i = scope.interactions.length - 1; i >= 0; i--) {\n scope.interactions[i].stop(event);\n }\n\n return interact;\n};\n\n/*\\\n * interact.pointerMoveTolerance\n [ method ]\n * Returns or sets the distance the pointer must be moved before an action\n * sequence occurs. This also affects tolerance for tap events.\n *\n - newValue (number) #optional The movement from the start position must be greater than this value\n = (number | Interactable) The current setting or interact\n\\*/\ninteract.pointerMoveTolerance = function (newValue) {\n if (utils.is.number(newValue)) {\n Interaction.pointerMoveTolerance = newValue;\n\n return this;\n }\n\n return Interaction.pointerMoveTolerance;\n};\n\ninteract.addDocument = scope.addDocument;\ninteract.removeDocument = scope.removeDocument;\n\nscope.interact = interact;\n\nmodule.exports = interact;\n","const Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\nconst scope = require('./scope');\nconst is = require('./utils/is');\nconst events = require('./utils/events');\n\nconst { nodeContains, matchesSelector } = require('./utils/domUtils');\n\n/*\\\n * Interactable.preventDefault\n [ method ]\n *\n * Returns or sets whether to prevent the browser's default behaviour\n * in response to pointer events. Can be set to:\n * - `'always'` to always prevent\n * - `'never'` to never prevent\n * - `'auto'` to let interact.js try to determine what would be best\n *\n - newValue (string) #optional `true`, `false` or `'auto'`\n = (string | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.preventDefault = function (newValue) {\n if (/^(always|never|auto)$/.test(newValue)) {\n this.options.preventDefault = newValue;\n return this;\n }\n\n if (is.bool(newValue)) {\n this.options.preventDefault = newValue? 'always' : 'never';\n return this;\n }\n\n return this.options.preventDefault;\n};\n\nInteractable.prototype.checkAndPreventDefault = function (event) {\n const setting = this.options.preventDefault;\n\n if (setting === 'never') { return; }\n\n if (setting === 'always') {\n event.preventDefault();\n return;\n }\n\n // setting === 'auto'\n\n // don't preventDefault if the browser supports passiveEvents\n // CSS touch-action and user-selecct should be used instead\n if (events.supportsOptions) {\n return;\n }\n\n // don't preventDefault of pointerdown events\n if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) {\n return;\n }\n\n // don't preventDefault on editable elements\n if (is.element(event.target)\n && matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) {\n return;\n }\n\n event.preventDefault();\n};\n\nfunction onInteractionEvent ({ interaction, event }) {\n if (interaction.target) {\n interaction.target.checkAndPreventDefault(event);\n }\n}\n\nfor (const eventSignal of ['down', 'move', 'up', 'cancel']) {\n Interaction.signals.on(eventSignal, onInteractionEvent);\n}\n\n// prevent native HTML5 drag on interact.js target elements\nInteraction.docEvents.dragstart = function preventNativeDrag (event) {\n for (const interaction of scope.interactions) {\n\n if (interaction.element\n && (interaction.element === event.target\n || nodeContains(interaction.element, event.target))) {\n\n interaction.target.checkAndPreventDefault(event);\n return;\n }\n }\n};\n","const scope = require('./scope');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst iFinder = require('./utils/interactionFinder');\nconst pointerEvents = require('./pointerEvents/base');\n\nconst { window } = require('./utils/window');\n\nconst toString = Object.prototype.toString;\n\nif (!window.Array.isArray) {\n window.Array.isArray = function (obj) {\n return toString.call(obj) === '[object Array]';\n };\n}\n\nif (!String.prototype.trim) {\n String.prototype.trim = function () {\n return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n };\n}\n\n// http://www.quirksmode.org/dom/events/click.html\n// >Events leading to dblclick\n//\n// IE8 doesn't fire down event before dblclick.\n// This workaround tries to fire a tap and doubletap after dblclick\nfunction onIE8Dblclick (event) {\n const eventTarget = event.target;\n const interaction = iFinder.search(event, event.type, eventTarget);\n\n if (!interaction) { return; }\n\n if (interaction.prevTap\n && event.clientX === interaction.prevTap.clientX\n && event.clientY === interaction.prevTap.clientY\n && eventTarget === interaction.prevTap.target) {\n\n interaction.downTargets[0] = eventTarget;\n interaction.downTimes [0] = new Date().getTime();\n\n pointerEvents.fire({\n interaction,\n event,\n eventTarget,\n pointer: event,\n type: 'tap',\n });\n }\n}\n\nif (browser.isIE8) {\n const selectFix = function (event) {\n for (const interaction of scope.interactions) {\n if (interaction.interacting()) {\n interaction.target.checkAndPreventDefault(event);\n }\n }\n };\n\n const onDocIE8 = function onDocIE8 ({ doc, win }, signalName) {\n const eventMethod = signalName.indexOf('listen') === 0\n ? events.add : events.remove;\n\n // For IE's lack of Event#preventDefault\n eventMethod(doc, 'selectstart', selectFix);\n\n if (pointerEvents) {\n eventMethod(doc, 'dblclick', onIE8Dblclick);\n }\n };\n\n scope.signals.on('add-document' , onDocIE8);\n scope.signals.on('remove-document', onDocIE8);\n}\n\nmodule.exports = null;\n","const InteractEvent = require('../InteractEvent');\nconst Interaction = require('../Interaction');\nconst extend = require('../utils/extend');\n\nconst modifiers = {\n names: [],\n\n setOffsets: function (arg) {\n const { interaction, pageCoords: page } = arg;\n const { target, element, startOffset } = interaction;\n const rect = target.getRect(element);\n\n if (rect) {\n startOffset.left = page.x - rect.left;\n startOffset.top = page.y - rect.top;\n\n startOffset.right = rect.right - page.x;\n startOffset.bottom = rect.bottom - page.y;\n\n if (!('width' in rect)) { rect.width = rect.right - rect.left; }\n if (!('height' in rect)) { rect.height = rect.bottom - rect.top ; }\n }\n else {\n startOffset.left = startOffset.top = startOffset.right = startOffset.bottom = 0;\n }\n\n arg.rect = rect;\n arg.interactable = target;\n arg.element = element;\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n\n arg.options = target.options[interaction.prepared.name][modifierName];\n\n if (!arg.options) {\n continue;\n }\n\n interaction.modifierOffsets[modifierName] = modifiers[modifierName].setOffset(arg);\n }\n },\n\n setAll: function (arg) {\n const { interaction, statuses, preEnd, requireEndOnly } = arg;\n const coords = extend({}, arg.pageCoords);\n const result = {\n dx: 0,\n dy: 0,\n changed: false,\n locked: false,\n shouldMove: true,\n };\n\n for (const modifierName of modifiers.names) {\n const modifier = modifiers[modifierName];\n const options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!shouldDo(options, preEnd, requireEndOnly)) { continue; }\n\n arg.status = arg.status = statuses[modifierName];\n arg.options = options;\n arg.offset = arg.interaction.modifierOffsets[modifierName];\n\n modifier.set(arg);\n\n if (arg.status.locked) {\n coords.x += arg.status.dx;\n coords.y += arg.status.dy;\n\n result.dx += arg.status.dx;\n result.dy += arg.status.dy;\n\n result.locked = true;\n }\n }\n\n // a move should be fired if:\n // - there are no modifiers enabled,\n // - no modifiers are \"locked\" i.e. have changed the pointer's coordinates, or\n // - the locked coords have changed since the last pointer move\n result.shouldMove = !arg.status || !result.locked || arg.status.changed;\n\n return result;\n },\n\n resetStatuses: function (statuses) {\n for (const modifierName of modifiers.names) {\n const status = statuses[modifierName] || {};\n\n status.dx = status.dy = 0;\n status.modifiedX = status.modifiedY = NaN;\n status.locked = false;\n status.changed = true;\n\n statuses[modifierName] = status;\n }\n\n return statuses;\n },\n\n start: function ({ interaction }, signalName) {\n const arg = {\n interaction,\n pageCoords: (signalName === 'action-resume' ?\n interaction.curCoords : interaction.startCoords).page,\n startOffset: interaction.startOffset,\n statuses: interaction.modifierStatuses,\n preEnd: false,\n requireEndOnly: false,\n };\n\n modifiers.setOffsets(arg);\n modifiers.resetStatuses(arg.statuses);\n\n arg.pageCoords = extend({}, interaction.startCoords.page);\n interaction.modifierResult = modifiers.setAll(arg);\n },\n};\n\nInteraction.signals.on('new', function (interaction) {\n interaction.startOffset = { left: 0, right: 0, top: 0, bottom: 0 };\n interaction.modifierOffsets = {};\n interaction.modifierStatuses = modifiers.resetStatuses({});\n interaction.modifierResult = null;\n});\n\nInteraction.signals.on('action-start' , modifiers.start);\nInteraction.signals.on('action-resume', modifiers.start);\n\nInteraction.signals.on('before-action-move', function ({ interaction, preEnd, interactingBeforeMove }) {\n const modifierResult = modifiers.setAll({\n interaction,\n preEnd,\n pageCoords: interaction.curCoords.page,\n statuses: interaction.modifierStatuses,\n requireEndOnly: false,\n });\n\n // don't fire an action move if a modifier would keep the event in the same\n // cordinates as before\n if (!modifierResult.shouldMove && interactingBeforeMove) {\n interaction._dontFireMove = true;\n }\n\n interaction.modifierResult = modifierResult;\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n for (let i = 0; i < modifiers.names.length; i++) {\n const options = interaction.target.options[interaction.prepared.name][modifiers.names[i]];\n\n // if the endOnly option is true for any modifier\n if (shouldDo(options, true, true)) {\n // fire a move event at the modified coordinates\n interaction.doMove({ event, preEnd: true });\n break;\n }\n }\n});\n\nInteractEvent.signals.on('set-xy', function (arg) {\n const { iEvent, interaction } = arg;\n const modifierArg = extend({}, arg);\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n modifierArg.options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!modifierArg.options) {\n continue;\n }\n\n const modifier = modifiers[modifierName];\n\n modifierArg.status = interaction.modifierStatuses[modifierName];\n\n iEvent[modifierName] = modifier.modifyCoords(modifierArg);\n }\n});\n\nfunction shouldDo (options, preEnd, requireEndOnly) {\n return (options && options.enabled\n && (preEnd || !options.endOnly)\n && (!requireEndOnly || options.endOnly));\n}\n\nmodule.exports = modifiers;\n","const modifiers = require('./index');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst restrict = {\n defaults: {\n enabled : false,\n endOnly : false,\n restriction: null,\n elementRect: null,\n },\n\n setOffset: function ({ rect, startOffset, options }) {\n const elementRect = options && options.elementRect;\n const offset = {};\n\n if (rect && elementRect) {\n offset.left = startOffset.left - (rect.width * elementRect.left);\n offset.top = startOffset.top - (rect.height * elementRect.top);\n\n offset.right = startOffset.right - (rect.width * (1 - elementRect.right));\n offset.bottom = startOffset.bottom - (rect.height * (1 - elementRect.bottom));\n }\n else {\n offset.left = offset.top = offset.right = offset.bottom = 0;\n }\n\n return offset;\n },\n\n set: function ({ pageCoords, interaction, status, options }) {\n if (!options) { return status; }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n\n const restriction = getRestrictionRect(options.restriction, interaction, page);\n\n if (!restriction) { return status; }\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n const rect = restriction;\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n const offset = interaction.modifierOffsets.restrict;\n\n // object is assumed to have\n // x, y, width, height or\n // left, top, right, bottom\n if ('x' in restriction && 'y' in restriction) {\n modifiedX = Math.max(Math.min(rect.x + rect.width - offset.right , page.x), rect.x + offset.left);\n modifiedY = Math.max(Math.min(rect.y + rect.height - offset.bottom, page.y), rect.y + offset.top );\n }\n else {\n modifiedX = Math.max(Math.min(rect.right - offset.right , page.x), rect.left + offset.left);\n modifiedY = Math.max(Math.min(rect.bottom - offset.bottom, page.y), rect.top + offset.top );\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const elementRect = options && options.elementRect;\n\n if (options && options.enabled\n && !(phase === 'start' && elementRect && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n getRestrictionRect,\n};\n\nfunction getRestrictionRect (value, interaction, page) {\n if (utils.is.function(value)) {\n return utils.resolveRectLike(value, interaction.target, interaction.element, [page.x, page.y, interaction]);\n } else {\n return utils.resolveRectLike(value, interaction.target, interaction.element);\n }\n}\n\nmodifiers.restrict = restrict;\nmodifiers.names.push('restrict');\n\ndefaultOptions.perAction.restrict = restrict.defaults;\n\nmodule.exports = restrict;\n","// This module adds the options.resize.restrictEdges setting which sets min and\n// max for the top, left, bottom and right edges of the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictEdges: {\n// inner: { top: 200, left: 200, right: 400, bottom: 400 },\n// outer: { top: 0, left: 0, right: 600, bottom: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst { getRestrictionRect } = require('./restrict');\n\nconst noInner = { top: +Infinity, left: +Infinity, bottom: -Infinity, right: -Infinity };\nconst noOuter = { top: -Infinity, left: -Infinity, bottom: +Infinity, right: +Infinity };\n\nconst restrictEdges = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n offset: null,\n },\n\n setOffset: function ({ interaction, startOffset, options }) {\n if (!options) {\n return utils.extend({}, startOffset);\n }\n\n const offset = getRestrictionRect(options.offset, interaction, interaction.startCoords.page);\n\n if (offset) {\n return {\n top: startOffset.top + offset.y,\n left: startOffset.left + offset.x,\n bottom: startOffset.bottom + offset.y,\n right: startOffset.right + offset.x,\n };\n }\n\n return startOffset;\n },\n\n set: function ({ pageCoords, interaction, status, offset, options }) {\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n const inner = rectUtils.xywhToTlbr(getRestrictionRect(options.inner, interaction, page)) || noInner;\n const outer = rectUtils.xywhToTlbr(getRestrictionRect(options.outer, interaction, page)) || noOuter;\n\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n if (edges.top) {\n modifiedY = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top);\n }\n else if (edges.bottom) {\n modifiedY = Math.max(Math.min(outer.bottom - offset.bottom, page.y), inner.bottom - offset.bottom);\n }\n if (edges.left) {\n modifiedX = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left);\n }\n else if (edges.right) {\n modifiedX = Math.max(Math.min(outer.right - offset.right, page.x), inner.right - offset.right);\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n if (options && options.enabled\n && !(phase === 'start' && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n noInner,\n noOuter,\n getRestrictionRect,\n};\n\nmodifiers.restrictEdges = restrictEdges;\nmodifiers.names.push('restrictEdges');\n\ndefaultOptions.perAction.restrictEdges = restrictEdges.defaults;\nresize.defaults.restrictEdges = restrictEdges.defaults;\n\nmodule.exports = restrictEdges;\n","// This module adds the options.resize.restrictSize setting which sets min and\n// max width and height for the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictSize: {\n// min: { width: -600, height: -600 },\n// max: { width: 600, height: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst restrictEdges = require('./restrictEdges');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst noMin = { width: -Infinity, height: -Infinity };\nconst noMax = { width: +Infinity, height: +Infinity };\n\nconst restrictSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n },\n\n setOffset: function ({ interaction }) {\n return interaction.startOffset;\n },\n\n set: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const rect = rectUtils.xywhToTlbr(interaction.resizeRects.inverted);\n\n const minSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.min, interaction)) || noMin;\n const maxSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.max, interaction)) || noMax;\n\n arg.options = {\n enabled: options.enabled,\n endOnly: options.endOnly,\n inner: utils.extend({}, restrictEdges.noInner),\n outer: utils.extend({}, restrictEdges.noOuter),\n };\n\n if (edges.top) {\n arg.options.inner.top = rect.bottom - minSize.height;\n arg.options.outer.top = rect.bottom - maxSize.height;\n }\n else if (edges.bottom) {\n arg.options.inner.bottom = rect.top + minSize.height;\n arg.options.outer.bottom = rect.top + maxSize.height;\n }\n if (edges.left) {\n arg.options.inner.left = rect.right - minSize.width;\n arg.options.outer.left = rect.right - maxSize.width;\n }\n else if (edges.right) {\n arg.options.inner.right = rect.left + minSize.width;\n arg.options.outer.right = rect.left + maxSize.width;\n }\n\n restrictEdges.set(arg);\n },\n\n modifyCoords: restrictEdges.modifyCoords,\n};\n\nmodifiers.restrictSize = restrictSize;\nmodifiers.names.push('restrictSize');\n\ndefaultOptions.perAction.restrictSize = restrictSize.defaults;\nresize.defaults.restrictSize = restrictSize.defaults;\n\nmodule.exports = restrictSize;\n","const modifiers = require('./index');\nconst interact = require('../interact');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst snap = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n\n relativePoints: null,\n },\n\n setOffset: function ({ interaction, interactable, element, rect, startOffset, options }) {\n const offsets = [];\n const optionsOrigin = utils.rectToXY(utils.resolveRectLike(options.origin));\n const origin = optionsOrigin || utils.getOriginXY(interactable, element, interaction.prepared.name);\n options = options || interactable.options[interaction.prepared.name].snap || {};\n\n let snapOffset;\n\n if (options.offset === 'startCoords') {\n snapOffset = {\n x: interaction.startCoords.page.x - origin.x,\n y: interaction.startCoords.page.y - origin.y,\n };\n }\n else {\n const offsetRect = utils.resolveRectLike(options.offset, interactable, element, [interaction]);\n\n snapOffset = utils.rectToXY(offsetRect) || { x: 0, y: 0 };\n }\n\n if (rect && options.relativePoints && options.relativePoints.length) {\n for (const { x: relativeX, y: relativeY } of options.relativePoints) {\n offsets.push({\n x: startOffset.left - (rect.width * relativeX) + snapOffset.x,\n y: startOffset.top - (rect.height * relativeY) + snapOffset.y,\n });\n }\n }\n else {\n offsets.push(snapOffset);\n }\n\n return offsets;\n },\n\n set: function ({ interaction, pageCoords, status, options, offset: offsets }) {\n const targets = [];\n let target;\n let page;\n let i;\n\n if (status.useStatusXY) {\n page = { x: status.x, y: status.y };\n }\n else {\n const origin = utils.getOriginXY(interaction.target, interaction.element, interaction.prepared.name);\n\n page = utils.extend({}, pageCoords);\n\n page.x -= origin.x;\n page.y -= origin.y;\n }\n\n status.realX = page.x;\n status.realY = page.y;\n\n let len = options.targets? options.targets.length : 0;\n\n for (const { x: offsetX, y: offsetY } of offsets) {\n const relativeX = page.x - offsetX;\n const relativeY = page.y - offsetY;\n\n for (const snapTarget of options.targets) {\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n targets.push({\n x: utils.is.number(target.x) ? (target.x + offsetX) : relativeX,\n y: utils.is.number(target.y) ? (target.y + offsetY) : relativeY,\n\n range: utils.is.number(target.range)? target.range: options.range,\n });\n }\n }\n\n const closest = {\n target: null,\n inRange: false,\n distance: 0,\n range: 0,\n dx: 0,\n dy: 0,\n };\n\n for (i = 0, len = targets.length; i < len; i++) {\n target = targets[i];\n\n const range = target.range;\n const dx = target.x - page.x;\n const dy = target.y - page.y;\n const distance = utils.hypot(dx, dy);\n let inRange = distance <= range;\n\n // Infinite targets count as being out of range\n // compared to non infinite ones that are in range\n if (range === Infinity && closest.inRange && closest.range !== Infinity) {\n inRange = false;\n }\n\n if (!closest.target || (inRange\n // is the closest target in range?\n ? (closest.inRange && range !== Infinity\n // the pointer is relatively deeper in this target\n ? distance / range < closest.distance / closest.range\n // this target has Infinite range and the closest doesn't\n : (range === Infinity && closest.range !== Infinity)\n // OR this target is closer that the previous closest\n || distance < closest.distance)\n // The other is not in range and the pointer is closer to this target\n : (!closest.inRange && distance < closest.distance))) {\n\n closest.target = target;\n closest.distance = distance;\n closest.range = range;\n closest.inRange = inRange;\n closest.dx = dx;\n closest.dy = dy;\n\n status.range = range;\n }\n }\n\n let snapChanged;\n\n if (closest.target) {\n snapChanged = (status.modifiedX !== closest.target.x || status.modifiedY !== closest.target.y);\n\n status.modifiedX = closest.target.x;\n status.modifiedY = closest.target.y;\n }\n else {\n snapChanged = true;\n\n status.modifiedX = NaN;\n status.modifiedY = NaN;\n }\n\n status.dx = closest.dx;\n status.dy = closest.dy;\n\n status.changed = (snapChanged || (closest.inRange && !status.locked));\n status.locked = closest.inRange;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const relativePoints = options && options.relativePoints;\n\n if (options && options.enabled\n && !(phase === 'start' && relativePoints && relativePoints.length)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n }\n\n return {\n range : status.range,\n locked : status.locked,\n x : status.modifiedX,\n y : status.modifiedY,\n realX : status.realX,\n realY : status.realY,\n dx : status.dx,\n dy : status.dy,\n };\n }\n },\n};\n\ninteract.createSnapGrid = function (grid) {\n return function (x, y) {\n const limits = grid.limits || {\n left : -Infinity,\n right : Infinity,\n top : -Infinity,\n bottom: Infinity,\n };\n let offsetX = 0;\n let offsetY = 0;\n\n if (utils.is.object(grid.offset)) {\n offsetX = grid.offset.x;\n offsetY = grid.offset.y;\n }\n\n const gridx = Math.round((x - offsetX) / grid.x);\n const gridy = Math.round((y - offsetY) / grid.y);\n\n const newX = Math.max(limits.left, Math.min(limits.right , gridx * grid.x + offsetX));\n const newY = Math.max(limits.top , Math.min(limits.bottom, gridy * grid.y + offsetY));\n\n return {\n x: newX,\n y: newY,\n range: grid.range,\n };\n };\n};\n\nmodifiers.snap = snap;\nmodifiers.names.push('snap');\n\ndefaultOptions.perAction.snap = snap.defaults;\n\nmodule.exports = snap;\n","// This module allows snapping of the size of targets during resize\n// interactions.\n\nconst modifiers = require('./index');\nconst snap = require('./snap');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\nconst utils = require('../utils/');\n\nconst snapSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n },\n\n setOffset: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.edges;\n\n if (!edges) { return; }\n\n arg.options = {\n relativePoints: [{\n x: edges.left? 0 : 1,\n y: edges.top ? 0 : 1,\n }],\n origin: { x: 0, y: 0 },\n offset: 'self',\n range: options.range,\n };\n\n const offsets = snap.setOffset(arg);\n arg.options = options;\n\n return offsets;\n },\n\n set: function (arg) {\n const { interaction, options, offset, pageCoords } = arg;\n const page = utils.extend({}, pageCoords);\n const relativeX = page.x - offset[0].x;\n const relativeY = page.y - offset[0].y;\n\n arg.options = utils.extend({}, options);\n arg.options.targets = [];\n\n for (const snapTarget of options.targets) {\n let target;\n\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n if ('width' in target && 'height' in target) {\n target.x = target.width;\n target.y = target.height;\n }\n\n arg.options.targets.push(target);\n }\n\n snap.set(arg);\n },\n\n modifyCoords: function (arg) {\n const { options } = arg;\n\n arg.options = utils.extend({}, options);\n arg.options.enabled = options.enabled;\n arg.options.relativePoints = [null];\n\n snap.modifyCoords(arg);\n },\n};\n\nmodifiers.snapSize = snapSize;\nmodifiers.names.push('snapSize');\n\ndefaultOptions.perAction.snapSize = snapSize.defaults;\nresize.defaults.snapSize = snapSize.defaults;\n\nmodule.exports = snapSize;\n","const pointerUtils = require('../utils/pointerUtils');\n\nmodule.exports = class PointerEvent {\n constructor (type, pointer, event, eventTarget, interaction) {\n pointerUtils.pointerExtend(this, event);\n\n if (event !== pointer) {\n pointerUtils.pointerExtend(this, pointer);\n }\n\n this.interaction = interaction;\n\n this.timeStamp = new Date().getTime();\n this.originalEvent = event;\n this.type = type;\n this.pointerId = pointerUtils.getPointerId(pointer);\n this.pointerType = pointerUtils.getPointerType(pointer);\n this.target = eventTarget;\n this.currentTarget = null;\n\n if (type === 'tap') {\n const pointerIndex = interaction.getPointerIndex(pointer);\n this.dt = this.timeStamp - interaction.downTimes[pointerIndex];\n\n const interval = this.timeStamp - interaction.tapTime;\n\n this.double = !!(interaction.prevTap\n && interaction.prevTap.type !== 'doubletap'\n && interaction.prevTap.target === this.target\n && interval < 500);\n }\n else if (type === 'doubletap') {\n this.dt = pointer.timeStamp - interaction.tapTime;\n }\n }\n\n subtractOrigin ({ x: originX, y: originY }) {\n this.pageX -= originX;\n this.pageY -= originY;\n this.clientX -= originX;\n this.clientY -= originY;\n\n return this;\n }\n\n addOrigin ({ x: originX, y: originY }) {\n this.pageX += originX;\n this.pageY += originY;\n this.clientX += originX;\n this.clientY += originY;\n\n return this;\n }\n\n preventDefault () {\n this.originalEvent.preventDefault();\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n};\n","const PointerEvent = require('./PointerEvent');\nconst Interaction = require('../Interaction');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst defaults = require('../defaultOptions');\nconst signals = require('../utils/Signals').new();\nconst { filter } = require('../utils/arr');\n\nconst simpleSignals = [ 'down', 'up', 'cancel' ];\nconst simpleEvents = [ 'down', 'up', 'cancel' ];\n\nconst pointerEvents = {\n PointerEvent,\n fire,\n collectEventTargets,\n signals,\n defaults: {\n holdDuration: 600,\n ignoreFrom : null,\n allowFrom : null,\n origin : { x: 0, y: 0 },\n },\n types: [\n 'down',\n 'move',\n 'up',\n 'cancel',\n 'tap',\n 'doubletap',\n 'hold',\n ],\n};\n\nfunction fire (arg) {\n const {\n interaction, pointer, event, eventTarget,\n type = arg.pointerEvent.type,\n targets = collectEventTargets(arg),\n pointerEvent = new PointerEvent(type, pointer, event, eventTarget, interaction),\n } = arg;\n\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n targets,\n type,\n pointerEvent,\n };\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n\n for (const prop in target.props || {}) {\n pointerEvent[prop] = target.props[prop];\n }\n\n const origin = utils.getOriginXY(target.eventable, target.element);\n\n pointerEvent.subtractOrigin(origin);\n pointerEvent.eventable = target.eventable;\n pointerEvent.currentTarget = target.element;\n\n target.eventable.fire(pointerEvent);\n\n pointerEvent.addOrigin(origin);\n\n if (pointerEvent.immediatePropagationStopped\n || (pointerEvent.propagationStopped\n && (i + 1) < targets.length && targets[i + 1].element !== pointerEvent.currentTarget)) {\n break;\n }\n }\n\n signals.fire('fired', signalArg);\n\n if (type === 'tap') {\n // if pointerEvent should make a double tap, create and fire a doubletap\n // PointerEvent and use that as the prevTap\n const prevTap = pointerEvent.double\n ? fire({\n interaction, pointer, event, eventTarget,\n type: 'doubletap',\n })\n : pointerEvent;\n\n interaction.prevTap = prevTap;\n interaction.tapTime = prevTap.timeStamp;\n }\n\n return pointerEvent;\n}\n\nfunction collectEventTargets ({ interaction, pointer, event, eventTarget, type }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n // do not fire a tap event if the pointer was moved before being lifted\n if (type === 'tap' && (interaction.pointerWasMoved\n // or if the pointerup target is different to the pointerdown target\n || !(interaction.downTargets[pointerIndex] && interaction.downTargets[pointerIndex] === eventTarget))) {\n return [];\n }\n\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n path,\n targets: [],\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (type === 'hold') {\n signalArg.targets = filter(signalArg.targets, target =>\n target.eventable.options.holdDuration === interaction.holdTimers[pointerIndex].duration);\n }\n\n return signalArg.targets;\n}\n\nInteraction.signals.on('update-pointer-down', function ({ interaction, pointerIndex }) {\n interaction.holdTimers[pointerIndex] = { duration: Infinity, timeout: null };\n});\n\nInteraction.signals.on('remove-pointer', function ({ interaction, pointerIndex }) {\n interaction.holdTimers.splice(pointerIndex, 1);\n});\n\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget, duplicateMove }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n if (!duplicateMove && (!interaction.pointerIsDown || interaction.pointerWasMoved)) {\n if (interaction.pointerIsDown) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n\n fire({\n interaction, pointer, event, eventTarget,\n type: 'move',\n });\n }\n});\n\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget, pointerIndex }) {\n // copy event to be used in timeout for IE8\n const eventCopy = browser.isIE8? utils.extend({}, event) : event;\n\n const timer = interaction.holdTimers[pointerIndex];\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'hold',\n targets: [],\n path,\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (!signalArg.targets.length) { return; }\n\n let minDuration = Infinity;\n\n for (let i = 0; i < signalArg.targets.length; i++) {\n const target = signalArg.targets[i];\n const holdDuration = target.eventable.options.holdDuration;\n\n if (holdDuration < minDuration) {\n minDuration = holdDuration;\n }\n }\n\n timer.duration = minDuration;\n timer.timeout = setTimeout(function () {\n fire({\n interaction,\n eventTarget,\n pointer: browser.isIE8? eventCopy : pointer,\n event: eventCopy,\n type: 'hold',\n });\n }, minDuration);\n});\n\nInteraction.signals.on('up', ({ interaction, pointer, event, eventTarget }) => {\n if (!interaction.pointerWasMoved) {\n fire({ interaction, eventTarget, pointer, event, type: 'tap' });\n }\n});\n\n['up', 'cancel'].forEach(function (signalName) {\n Interaction.signals.on(signalName, function ({ interaction, pointerIndex }) {\n if (interaction.holdTimers[pointerIndex]) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n });\n});\n\nfunction createSignalListener (type) {\n return function ({ interaction, pointer, event, eventTarget }) {\n fire({ interaction, eventTarget, pointer, event, type });\n };\n}\n\nfor (let i = 0; i < simpleSignals.length; i++) {\n Interaction.signals.on(simpleSignals[i], createSignalListener(simpleEvents[i]));\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.prevTap = null; // the most recent tap event on this interaction\n interaction.tapTime = 0; // time of the most recent tap event\n interaction.holdTimers = []; // [{ duration, timeout }]\n});\n\ndefaults.pointerEvents = pointerEvents.defaults;\nmodule.exports = pointerEvents;\n","const pointerEvents = require('./base');\nconst Interaction = require('../Interaction');\n\npointerEvents.signals.on('new', onNew);\npointerEvents.signals.on('fired', onFired);\n\nfor (const signal of ['move', 'up', 'cancel', 'endall']) {\n Interaction.signals.on(signal, endHoldRepeat);\n}\n\nfunction onNew ({ pointerEvent }) {\n if (pointerEvent.type !== 'hold') { return; }\n\n pointerEvent.count = (pointerEvent.count || 0) + 1;\n}\n\nfunction onFired ({ interaction, pointerEvent, eventTarget, targets }) {\n if (pointerEvent.type !== 'hold' || !targets.length) { return; }\n\n // get the repeat interval from the first eventable\n const interval = targets[0].eventable.options.holdRepeatInterval;\n\n // don't repeat if the interval is 0 or less\n if (interval <= 0) { return; }\n\n // set a timeout to fire the holdrepeat event\n interaction.holdIntervalHandle = setTimeout(function () {\n pointerEvents.fire({\n interaction,\n eventTarget,\n type: 'hold',\n pointer: pointerEvent,\n event: pointerEvent,\n });\n }, interval);\n}\n\nfunction endHoldRepeat ({ interaction }) {\n // set the interaction's holdStopTime property\n // to stop further holdRepeat events\n if (interaction.holdIntervalHandle) {\n clearInterval(interaction.holdIntervalHandle);\n interaction.holdIntervalHandle = null;\n }\n}\n\n// don't repeat by default\npointerEvents.defaults.holdRepeatInterval = 0;\npointerEvents.types.push('holdrepeat');\n\nmodule.exports = {\n onNew,\n onFired,\n endHoldRepeat,\n};\n","const pointerEvents = require('./base');\nconst Interactable = require('../Interactable');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\nconst scope = require('../scope');\nconst extend = require('../utils/extend');\nconst { merge } = require('../utils/arr');\n\npointerEvents.signals.on('collect-targets', function ({ targets, element, type, eventTarget }) {\n function collectSelectors (interactable, selector, context) {\n const els = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && is.element(element)\n && domUtils.matchesSelector(element, selector, els)\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n const interactable = scope.interactables.get(element);\n\n if (interactable) {\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n scope.interactables.forEachSelector(collectSelectors, element);\n});\n\nInteractable.signals.on('new', function ({ interactable }) {\n interactable.events.getRect = function (element) {\n return interactable.getRect(element);\n };\n});\n\nInteractable.signals.on('set', function ({ interactable, options }) {\n extend(interactable.events.options, pointerEvents.defaults);\n extend(interactable.events.options, options);\n});\n\nmerge(Interactable.eventTypes, pointerEvents.types);\n\nInteractable.prototype.pointerEvents = function (options) {\n extend(this.events.options, options);\n\n return this;\n};\n\nconst __backCompatOption = Interactable.prototype._backCompatOption;\n\nInteractable.prototype._backCompatOption = function (optionName, newValue) {\n const ret = __backCompatOption.call(this, optionName, newValue);\n\n if (ret === this) {\n this.events.options[optionName] = newValue;\n }\n\n return ret;\n};\n\nInteractable.settingsMethods.push('pointerEvents');\n","const utils = require('./utils');\nconst events = require('./utils/events');\nconst signals = require('./utils/Signals').new();\n\nconst scope = {\n signals,\n events,\n utils,\n\n // main document\n document: require('./utils/domObjects').document,\n // all documents being listened to\n documents: [],\n\n addDocument: function (doc, win) {\n // do nothing if document is already known\n if (utils.contains(scope.documents, doc)) { return false; }\n\n win = win || scope.getWindow(doc);\n\n scope.documents.push(doc);\n events.documents.push(doc);\n\n // don't add an unload event for the main document\n // so that the page may be cached in browser history\n if (doc !== scope.document) {\n events.add(win, 'unload', scope.onWindowUnload);\n }\n\n signals.fire('add-document', { doc, win });\n },\n\n removeDocument: function (doc, win) {\n const index = utils.indexOf(scope.documents, doc);\n\n win = win || scope.getWindow(doc);\n\n events.remove(win, 'unload', scope.onWindowUnload);\n\n scope.documents.splice(index, 1);\n events.documents.splice(index, 1);\n\n signals.fire('remove-document', { win, doc });\n },\n\n onWindowUnload: function () {\n scope.removeDocument(this.document, this);\n },\n};\n\nmodule.exports = scope;\n","const { indexOf } = require('./arr');\n\nclass Signals {\n constructor () {\n this.listeners = {\n // signalName: [listeners],\n };\n }\n\n on (name, listener) {\n if (!this.listeners[name]) {\n this.listeners[name] = [listener];\n return;\n }\n\n this.listeners[name].push(listener);\n }\n\n off (name, listener) {\n if (!this.listeners[name]) { return; }\n\n const index = indexOf(this.listeners[name], listener);\n\n if (index !== -1) {\n this.listeners[name].splice(index, 1);\n }\n }\n\n fire (name, arg) {\n const targetListeners = this.listeners[name];\n\n if (!targetListeners) { return; }\n\n for (let i = 0; i < targetListeners.length; i++) {\n if (targetListeners[i](arg, name) === false) {\n return;\n }\n }\n }\n}\n\nSignals.new = function () {\n return new Signals();\n};\n\nmodule.exports = Signals;\n","function indexOf (array, target) {\n for (let i = 0, len = array.length; i < len; i++) {\n if (array[i] === target) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction contains (array, target) {\n return indexOf(array, target) !== -1;\n}\n\nfunction merge (target, source) {\n for (let i = 0; i < source.length; i++) {\n target.push(source[i]);\n }\n\n return target;\n}\n\nfunction filter (array, test) {\n const result = [];\n\n for (let i = 0; i < array.length; i++) {\n if (test(array[i])) {\n result.push(array[i]);\n }\n }\n\n return result;\n}\n\nmodule.exports = {\n indexOf,\n contains,\n merge,\n filter,\n};\n","const { window } = require('./window');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst Element = domObjects.Element;\nconst navigator = window.navigator;\n\nconst browser = {\n // Does the browser support touch input?\n supportsTouch: !!(('ontouchstart' in window) || is.function(window.DocumentTouch)\n && domObjects.document instanceof window.DocumentTouch),\n\n // Does the browser support PointerEvents\n supportsPointerEvent: !!domObjects.PointerEvent,\n\n isIE8: ('attachEvent' in window) && !('addEventListener' in window),\n\n // Opera Mobile must be handled differently\n isOperaMobile: (navigator.appName === 'Opera'\n && browser.supportsTouch\n && navigator.userAgent.match('Presto')),\n\n // scrolling doesn't change the result of getClientRects on iOS 7\n isIOS7: (/iP(hone|od|ad)/.test(navigator.platform)\n && /OS 7[^\\d]/.test(navigator.appVersion)),\n\n isIe9OrOlder: /MSIE (8|9)/.test(navigator.userAgent),\n\n // prefix matchesSelector\n prefixedMatchesSelector: 'matches' in Element.prototype\n ? 'matches': 'webkitMatchesSelector' in Element.prototype\n ? 'webkitMatchesSelector': 'mozMatchesSelector' in Element.prototype\n ? 'mozMatchesSelector': 'oMatchesSelector' in Element.prototype\n ? 'oMatchesSelector': 'msMatchesSelector',\n\n useMatchesSelectorPolyfill: false,\n\n pEventTypes: (domObjects.PointerEvent\n ? (domObjects.PointerEvent === window.MSPointerEvent\n ? {\n up: 'MSPointerUp',\n down: 'MSPointerDown',\n over: 'mouseover',\n out: 'mouseout',\n move: 'MSPointerMove',\n cancel: 'MSPointerCancel',\n }\n : {\n up: 'pointerup',\n down: 'pointerdown',\n over: 'pointerover',\n out: 'pointerout',\n move: 'pointermove',\n cancel: 'pointercancel',\n })\n : null),\n\n // because Webkit and Opera still use 'mousewheel' event type\n wheelEvent: 'onmousewheel' in domObjects.document? 'mousewheel': 'wheel',\n\n};\n\nbrowser.useMatchesSelectorPolyfill = !is.function(Element.prototype[browser.prefixedMatchesSelector]);\n\nmodule.exports = browser;\n","const domObjects = {};\nconst win = require('./window').window;\n\nfunction blank () {}\n\ndomObjects.document = win.document;\ndomObjects.DocumentFragment = win.DocumentFragment || blank;\ndomObjects.SVGElement = win.SVGElement || blank;\ndomObjects.SVGSVGElement = win.SVGSVGElement || blank;\ndomObjects.SVGElementInstance = win.SVGElementInstance || blank;\ndomObjects.Element = win.Element || blank;\ndomObjects.HTMLElement = win.HTMLElement || domObjects.Element;\n\ndomObjects.Event = win.Event;\ndomObjects.Touch = win.Touch || blank;\ndomObjects.PointerEvent = (win.PointerEvent || win.MSPointerEvent);\n\nmodule.exports = domObjects;\n","const win = require('./window');\nconst browser = require('./browser');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst domUtils = {\n nodeContains: function (parent, child) {\n while (child) {\n if (child === parent) {\n return true;\n }\n\n child = child.parentNode;\n }\n\n return false;\n },\n\n closest: function (element, selector) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) { return element; }\n\n element = domUtils.parentNode(element);\n }\n\n return null;\n },\n\n parentNode: function (node) {\n let parent = node.parentNode;\n\n if (is.docFrag(parent)) {\n // skip past #shado-root fragments\n while ((parent = parent.host) && is.docFrag(parent)) {\n continue;\n }\n\n return parent;\n }\n\n return parent;\n },\n\n // taken from http://tanalin.com/en/blog/2012/12/matches-selector-ie8/ and modified\n matchesSelectorPolyfill: browser.useMatchesSelectorPolyfill\n ? function (element, selector, elems) {\n elems = elems || element.parentNode.querySelectorAll(selector);\n\n for (let i = 0, len = elems.length; i < len; i++) {\n if (elems[i] === element) {\n return true;\n }\n }\n\n return false;\n }\n : null,\n\n matchesSelector: function (element, selector, nodeList) {\n if (browser.useMatchesSelectorPolyfill) {\n return domUtils.matchesSelectorPolyfill(element, selector, nodeList);\n }\n\n // remove /deep/ from selectors if shadowDOM polyfill is used\n if (win.window !== win.realWindow) {\n selector = selector.replace(/\\/deep\\//g, ' ');\n }\n\n return element[browser.prefixedMatchesSelector](selector);\n },\n\n // Test for the element that's \"above\" all other qualifiers\n indexOfDeepestElement: function (elements) {\n let deepestZoneParents = [];\n let dropzoneParents = [];\n let dropzone;\n let deepestZone = elements[0];\n let index = deepestZone? 0: -1;\n let parent;\n let child;\n let i;\n let n;\n\n for (i = 1; i < elements.length; i++) {\n dropzone = elements[i];\n\n // an element might belong to multiple selector dropzones\n if (!dropzone || dropzone === deepestZone) {\n continue;\n }\n\n if (!deepestZone) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n // check if the deepest or current are document.documentElement or document.rootElement\n // - if the current dropzone is, do nothing and continue\n if (dropzone.parentNode === dropzone.ownerDocument) {\n continue;\n }\n // - if deepest is, update with the current dropzone and continue to next\n else if (deepestZone.parentNode === dropzone.ownerDocument) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n if (!deepestZoneParents.length) {\n parent = deepestZone;\n while (parent.parentNode && parent.parentNode !== parent.ownerDocument) {\n deepestZoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n }\n\n // if this element is an svg element and the current deepest is\n // an HTMLElement\n if (deepestZone instanceof domObjects.HTMLElement\n && dropzone instanceof domObjects.SVGElement\n && !(dropzone instanceof domObjects.SVGSVGElement)) {\n\n if (dropzone === deepestZone.parentNode) {\n continue;\n }\n\n parent = dropzone.ownerSVGElement;\n }\n else {\n parent = dropzone;\n }\n\n dropzoneParents = [];\n\n while (parent.parentNode !== parent.ownerDocument) {\n dropzoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n\n n = 0;\n\n // get (position of last common ancestor) + 1\n while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) {\n n++;\n }\n\n const parents = [\n dropzoneParents[n - 1],\n dropzoneParents[n],\n deepestZoneParents[n],\n ];\n\n child = parents[0].lastChild;\n\n while (child) {\n if (child === parents[1]) {\n deepestZone = dropzone;\n index = i;\n deepestZoneParents = [];\n\n break;\n }\n else if (child === parents[2]) {\n break;\n }\n\n child = child.previousSibling;\n }\n }\n\n return index;\n },\n\n matchesUpTo: function (element, selector, limit) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) {\n return true;\n }\n\n element = domUtils.parentNode(element);\n\n if (element === limit) {\n return domUtils.matchesSelector(element, selector);\n }\n }\n\n return false;\n },\n\n getActualElement: function (element) {\n return (element instanceof domObjects.SVGElementInstance\n ? element.correspondingUseElement\n : element);\n },\n\n getScrollXY: function (relevantWindow) {\n relevantWindow = relevantWindow || win.window;\n return {\n x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft,\n y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop,\n };\n },\n\n getElementClientRect: function (element) {\n const clientRect = (element instanceof domObjects.SVGElement\n ? element.getBoundingClientRect()\n : element.getClientRects()[0]);\n\n return clientRect && {\n left : clientRect.left,\n right : clientRect.right,\n top : clientRect.top,\n bottom: clientRect.bottom,\n width : clientRect.width || clientRect.right - clientRect.left,\n height: clientRect.height || clientRect.bottom - clientRect.top,\n };\n },\n\n getElementRect: function (element) {\n const clientRect = domUtils.getElementClientRect(element);\n\n if (!browser.isIOS7 && clientRect) {\n const scroll = domUtils.getScrollXY(win.getWindow(element));\n\n clientRect.left += scroll.x;\n clientRect.right += scroll.x;\n clientRect.top += scroll.y;\n clientRect.bottom += scroll.y;\n }\n\n return clientRect;\n },\n\n getPath: function (element) {\n const path = [];\n\n while (element) {\n path.push(element);\n element = domUtils.parentNode(element);\n }\n\n return path;\n },\n\n trySelector: value => {\n if (!is.string(value)) { return false; }\n\n // an exception will be raised if it is invalid\n domObjects.document.querySelector(value);\n return true;\n },\n};\n\nmodule.exports = domUtils;\n","const is = require('./is');\nconst domUtils = require('./domUtils');\nconst pExtend = require('./pointerExtend');\n\nconst { window, getWindow } = require('./window');\nconst { indexOf, contains } = require('./arr');\n\nconst useAttachEvent = ('attachEvent' in window) && !('addEventListener' in window);\nconst addEvent = useAttachEvent? 'attachEvent': 'addEventListener';\nconst removeEvent = useAttachEvent? 'detachEvent': 'removeEventListener';\nconst on = useAttachEvent? 'on': '';\n\nconst elements = [];\nconst targets = [];\nconst attachedListeners = [];\n\n// {\n// type: {\n// selectors: ['selector', ...],\n// contexts : [document, ...],\n// listeners: [[listener, capture, passive], ...]\n// }\n// }\nconst delegatedEvents = {};\n\nconst documents = [];\n\nconst supportsOptions = !useAttachEvent && (() => {\n let supported = false;\n\n window.document.createElement('div').addEventListener('test', null, {\n get capture () { supported = true; },\n });\n\n return supported;\n})();\n\nfunction add (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n let elementIndex = indexOf(elements, element);\n let target = targets[elementIndex];\n\n if (!target) {\n target = {\n events: {},\n typeCount: 0,\n };\n\n elementIndex = elements.push(element) - 1;\n targets.push(target);\n\n attachedListeners.push(useAttachEvent\n ? {\n supplied: [],\n wrapped : [],\n useCount: [],\n }\n : null);\n }\n\n if (!target.events[type]) {\n target.events[type] = [];\n target.typeCount++;\n }\n\n if (!contains(target.events[type], listener)) {\n let ret;\n\n if (useAttachEvent) {\n const { supplied, wrapped, useCount } = attachedListeners[elementIndex];\n const listenerIndex = indexOf(supplied, listener);\n\n const wrappedListener = wrapped[listenerIndex] || function (event) {\n if (!event.immediatePropagationStopped) {\n event.target = event.srcElement;\n event.currentTarget = element;\n\n event.preventDefault = event.preventDefault || preventDef;\n event.stopPropagation = event.stopPropagation || stopProp;\n event.stopImmediatePropagation = event.stopImmediatePropagation || stopImmProp;\n\n if (/mouse|click/.test(event.type)) {\n event.pageX = event.clientX + getWindow(element).document.documentElement.scrollLeft;\n event.pageY = event.clientY + getWindow(element).document.documentElement.scrollTop;\n }\n\n listener(event);\n }\n };\n\n ret = element[addEvent](on + type, wrappedListener, !!options.capture);\n\n if (listenerIndex === -1) {\n supplied.push(listener);\n wrapped.push(wrappedListener);\n useCount.push(1);\n }\n else {\n useCount[listenerIndex]++;\n }\n }\n else {\n ret = element[addEvent](type, listener, supportsOptions? options : !!options.capture);\n }\n target.events[type].push(listener);\n\n return ret;\n }\n}\n\nfunction remove (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const elementIndex = indexOf(elements, element);\n const target = targets[elementIndex];\n\n if (!target || !target.events) {\n return;\n }\n\n let wrappedListener = listener;\n let listeners;\n let listenerIndex;\n\n if (useAttachEvent) {\n listeners = attachedListeners[elementIndex];\n listenerIndex = indexOf(listeners.supplied, listener);\n wrappedListener = listeners.wrapped[listenerIndex];\n }\n\n if (type === 'all') {\n for (type in target.events) {\n if (target.events.hasOwnProperty(type)) {\n remove(element, type, 'all');\n }\n }\n return;\n }\n\n if (target.events[type]) {\n const len = target.events[type].length;\n\n if (listener === 'all') {\n for (let i = 0; i < len; i++) {\n remove(element, type, target.events[type][i], options);\n }\n return;\n }\n else {\n for (let i = 0; i < len; i++) {\n if (target.events[type][i] === listener) {\n element[removeEvent](on + type, wrappedListener, supportsOptions? options : !!options.capture);\n target.events[type].splice(i, 1);\n\n if (useAttachEvent && listeners) {\n listeners.useCount[listenerIndex]--;\n if (listeners.useCount[listenerIndex] === 0) {\n listeners.supplied.splice(listenerIndex, 1);\n listeners.wrapped.splice(listenerIndex, 1);\n listeners.useCount.splice(listenerIndex, 1);\n }\n }\n\n break;\n }\n }\n }\n\n if (target.events[type] && target.events[type].length === 0) {\n target.events[type] = null;\n target.typeCount--;\n }\n }\n\n if (!target.typeCount) {\n targets.splice(elementIndex, 1);\n elements.splice(elementIndex, 1);\n attachedListeners.splice(elementIndex, 1);\n }\n}\n\nfunction addDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n if (!delegatedEvents[type]) {\n delegatedEvents[type] = {\n selectors: [],\n contexts : [],\n listeners: [],\n };\n\n // add delegate listener functions\n for (let i = 0; i < documents.length; i++) {\n add(documents[i], type, delegateListener);\n add(documents[i], type, delegateUseCapture, true);\n }\n }\n\n const delegated = delegatedEvents[type];\n let index;\n\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n break;\n }\n }\n\n if (index === -1) {\n index = delegated.selectors.length;\n\n delegated.selectors.push(selector);\n delegated.contexts .push(context);\n delegated.listeners.push([]);\n }\n\n // keep listener and capture and passive flags\n delegated.listeners[index].push([listener, !!options.capture, options.passive]);\n}\n\nfunction removeDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const delegated = delegatedEvents[type];\n let matchFound = false;\n let index;\n\n if (!delegated) { return; }\n\n // count from last index of delegated to 0\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n // look for matching selector and context Node\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n\n const listeners = delegated.listeners[index];\n\n // each item of the listeners array is an array: [function, capture, passive]\n for (let i = listeners.length - 1; i >= 0; i--) {\n const [fn, capture, passive] = listeners[i];\n\n // check if the listener functions and capture and passive flags match\n if (fn === listener && capture === !!options.capture && passive === options.passive) {\n // remove the listener from the array of listeners\n listeners.splice(i, 1);\n\n // if all listeners for this interactable have been removed\n // remove the interactable from the delegated arrays\n if (!listeners.length) {\n delegated.selectors.splice(index, 1);\n delegated.contexts .splice(index, 1);\n delegated.listeners.splice(index, 1);\n\n // remove delegate function from context\n remove(context, type, delegateListener);\n remove(context, type, delegateUseCapture, true);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegatedEvents[type] = null;\n }\n }\n\n // only remove one listener\n matchFound = true;\n break;\n }\n }\n\n if (matchFound) { break; }\n }\n }\n}\n\n// bound to the interactable context when a DOM event\n// listener is added to a selector interactable\nfunction delegateListener (event, optionalArg) {\n const options = getOptions(optionalArg);\n const fakeEvent = {};\n const delegated = delegatedEvents[event.type];\n const eventTarget = (domUtils.getActualElement(event.path\n ? event.path[0]\n : event.target));\n let element = eventTarget;\n\n // duplicate the event so that currentTarget can be changed\n pExtend(fakeEvent, event);\n\n fakeEvent.originalEvent = event;\n fakeEvent.preventDefault = preventOriginalDefault;\n\n // climb up document tree looking for selector matches\n while (is.element(element)) {\n for (let i = 0; i < delegated.selectors.length; i++) {\n const selector = delegated.selectors[i];\n const context = delegated.contexts[i];\n\n if (domUtils.matchesSelector(element, selector)\n && domUtils.nodeContains(context, eventTarget)\n && domUtils.nodeContains(context, element)) {\n\n const listeners = delegated.listeners[i];\n\n fakeEvent.currentTarget = element;\n\n for (let j = 0; j < listeners.length; j++) {\n const [fn, capture, passive] = listeners[j];\n\n if (capture === !!options.capture && passive === options.passive) {\n fn(fakeEvent);\n }\n }\n }\n }\n\n element = domUtils.parentNode(element);\n }\n}\n\nfunction delegateUseCapture (event) {\n return delegateListener.call(this, event, true);\n}\n\nfunction preventDef () {\n this.returnValue = false;\n}\n\nfunction preventOriginalDefault () {\n this.originalEvent.preventDefault();\n}\n\nfunction stopProp () {\n this.cancelBubble = true;\n}\n\nfunction stopImmProp () {\n this.cancelBubble = true;\n this.immediatePropagationStopped = true;\n}\n\nfunction getOptions (param) {\n return is.object(param)? param : { capture: param };\n}\n\nmodule.exports = {\n add,\n remove,\n\n addDelegate,\n removeDelegate,\n\n delegateListener,\n delegateUseCapture,\n delegatedEvents,\n documents,\n\n useAttachEvent,\n supportsOptions,\n\n _elements: elements,\n _targets: targets,\n _attachedListeners: attachedListeners,\n};\n","module.exports = function extend (dest, source) {\n for (const prop in source) {\n dest[prop] = source[prop];\n }\n return dest;\n};\n","const {\n resolveRectLike,\n rectToXY,\n} = require('./rect');\n\nmodule.exports = function (target, element, action) {\n const actionOptions = target.options[action];\n const actionOrigin = actionOptions && actionOptions.origin;\n const origin = actionOrigin || target.options.origin;\n\n const originRect = resolveRectLike(origin, target, element, [target && element]);\n\n return rectToXY(originRect) || { x: 0, y: 0 };\n};\n","module.exports = (x, y) => Math.sqrt(x * x + y * y);\n","const extend = require('./extend');\nconst win = require('./window');\n\nconst utils = {\n warnOnce: function (method, message) {\n let warned = false;\n\n return function () {\n if (!warned) {\n win.window.console.warn(message);\n warned = true;\n }\n\n return method.apply(this, arguments);\n };\n },\n\n // http://stackoverflow.com/a/5634528/2280888\n _getQBezierValue: function (t, p1, p2, p3) {\n const iT = 1 - t;\n return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3;\n },\n\n getQuadraticCurvePoint: function (startX, startY, cpX, cpY, endX, endY, position) {\n return {\n x: utils._getQBezierValue(position, startX, cpX, endX),\n y: utils._getQBezierValue(position, startY, cpY, endY),\n };\n },\n\n // http://gizma.com/easing/\n easeOutQuad: function (t, b, c, d) {\n t /= d;\n return -c * t*(t-2) + b;\n },\n\n copyAction: function (dest, src) {\n dest.name = src.name;\n dest.axis = src.axis;\n dest.edges = src.edges;\n\n return dest;\n },\n\n is : require('./is'),\n extend : extend,\n hypot : require('./hypot'),\n getOriginXY: require('./getOriginXY'),\n};\n\nextend(utils, require('./arr'));\nextend(utils, require('./domUtils'));\nextend(utils, require('./pointerUtils'));\nextend(utils, require('./rect'));\n\nmodule.exports = utils;\n","const scope = require('../scope');\nconst utils = require('./index');\n\nconst finder = {\n methodOrder: [ 'simulationResume', 'mouseOrPen', 'hasPointer', 'idle' ],\n\n search: function (pointer, eventType, eventTarget) {\n const pointerType = utils.getPointerType(pointer);\n const pointerId = utils.getPointerId(pointer);\n const details = { pointer, pointerId, pointerType, eventType, eventTarget };\n\n for (const method of finder.methodOrder) {\n const interaction = finder[method](details);\n\n if (interaction) {\n return interaction;\n }\n }\n },\n\n // try to resume simulation with a new pointer\n simulationResume: function ({ pointerType, eventType, eventTarget }) {\n if (!/down|start/i.test(eventType)) {\n return null;\n }\n\n for (const interaction of scope.interactions) {\n let element = eventTarget;\n\n if (interaction.simulation && interaction.simulation.allowResume\n && (interaction.pointerType === pointerType)) {\n while (element) {\n // if the element is the interaction element\n if (element === interaction.element) {\n return interaction;\n }\n element = utils.parentNode(element);\n }\n }\n }\n\n return null;\n },\n\n // if it's a mouse or pen interaction\n mouseOrPen: function ({ pointerId, pointerType, eventType }) {\n if (pointerType !== 'mouse' && pointerType !== 'pen') {\n return null;\n }\n\n let firstNonActive;\n\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType) {\n // if it's a down event, skip interactions with running simulations\n if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; }\n\n // if the interaction is active, return it immediately\n if (interaction.interacting()) {\n return interaction;\n }\n // otherwise save it and look for another active interaction\n else if (!firstNonActive) {\n firstNonActive = interaction;\n }\n }\n }\n\n // if no active mouse interaction was found use the first inactive mouse\n // interaction\n if (firstNonActive) {\n return firstNonActive;\n }\n\n // find any mouse or pen interaction.\n // ignore the interaction if the eventType is a *down, and a simulation\n // is active\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType && !(/down/i.test(eventType) && interaction.simulation)) {\n return interaction;\n }\n }\n\n return null;\n },\n\n // get interaction that has this pointer\n hasPointer: function ({ pointerId }) {\n for (const interaction of scope.interactions) {\n if (utils.contains(interaction.pointerIds, pointerId)) {\n return interaction;\n }\n }\n },\n\n // get first idle interaction with a matching pointerType\n idle: function ({ pointerType }) {\n for (const interaction of scope.interactions) {\n // if there's already a pointer held down\n if (interaction.pointerIds.length === 1) {\n const target = interaction.target;\n // don't add this pointer if there is a target interactable and it\n // isn't gesturable\n if (target && !target.options.gesture.enabled) {\n continue;\n }\n }\n // maximum of 2 pointers per interaction\n else if (interaction.pointerIds.length >= 2) {\n continue;\n }\n\n if (!interaction.interacting() && (pointerType === interaction.pointerType)) {\n return interaction;\n }\n }\n\n return null;\n },\n};\n\nmodule.exports = finder;\n","const win = require('./window');\nconst isWindow = require('./isWindow');\n\nconst is = {\n array : () => {},\n\n window : thing => thing === win.window || isWindow(thing),\n\n docFrag : thing => is.object(thing) && thing.nodeType === 11,\n\n object : thing => !!thing && (typeof thing === 'object'),\n\n function: thing => typeof thing === 'function',\n\n number : thing => typeof thing === 'number' ,\n\n bool : thing => typeof thing === 'boolean' ,\n\n string : thing => typeof thing === 'string' ,\n\n element: thing => {\n if (!thing || (typeof thing !== 'object')) { return false; }\n\n const _window = win.getWindow(thing) || win.window;\n\n return (/object|function/.test(typeof _window.Element)\n ? thing instanceof _window.Element //DOM2\n : thing.nodeType === 1 && typeof thing.nodeName === 'string');\n },\n};\n\nis.array = thing => (is.object(thing)\n && (typeof thing.length !== 'undefined')\n && is.function(thing.splice));\n\nmodule.exports = is;\n","module.exports = (thing) => !!(thing && thing.Window) && (thing instanceof thing.Window);\n","function pointerExtend (dest, source) {\n for (const prop in source) {\n const prefixedPropREs = module.exports.prefixedPropREs;\n let deprecated = false;\n\n // skip deprecated prefixed properties\n for (const vendor in prefixedPropREs) {\n if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) {\n deprecated = true;\n break;\n }\n }\n\n if (!deprecated && typeof source[prop] !== 'function') {\n dest[prop] = source[prop];\n }\n }\n return dest;\n}\n\npointerExtend.prefixedPropREs = {\n webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/,\n};\n\nmodule.exports = pointerExtend;\n","const hypot = require('./hypot');\nconst browser = require('./browser');\nconst dom = require('./domObjects');\nconst domUtils = require('./domUtils');\nconst domObjects = require('./domObjects');\nconst is = require('./is');\nconst pointerExtend = require('./pointerExtend');\n\nconst pointerUtils = {\n copyCoords: function (dest, src) {\n dest.page = dest.page || {};\n dest.page.x = src.page.x;\n dest.page.y = src.page.y;\n\n dest.client = dest.client || {};\n dest.client.x = src.client.x;\n dest.client.y = src.client.y;\n\n dest.timeStamp = src.timeStamp;\n },\n\n setCoordDeltas: function (targetObj, prev, cur) {\n targetObj.page.x = cur.page.x - prev.page.x;\n targetObj.page.y = cur.page.y - prev.page.y;\n targetObj.client.x = cur.client.x - prev.client.x;\n targetObj.client.y = cur.client.y - prev.client.y;\n targetObj.timeStamp = cur.timeStamp - prev.timeStamp;\n\n // set pointer velocity\n const dt = Math.max(targetObj.timeStamp / 1000, 0.001);\n\n targetObj.page.speed = hypot(targetObj.page.x, targetObj.page.y) / dt;\n targetObj.page.vx = targetObj.page.x / dt;\n targetObj.page.vy = targetObj.page.y / dt;\n\n targetObj.client.speed = hypot(targetObj.client.x, targetObj.page.y) / dt;\n targetObj.client.vx = targetObj.client.x / dt;\n targetObj.client.vy = targetObj.client.y / dt;\n },\n\n isNativePointer: function (pointer) {\n return (pointer instanceof dom.Event || pointer instanceof dom.Touch);\n },\n\n // Get specified X/Y coords for mouse or event.touches[0]\n getXY: function (type, pointer, xy) {\n xy = xy || {};\n type = type || 'page';\n\n xy.x = pointer[type + 'X'];\n xy.y = pointer[type + 'Y'];\n\n return xy;\n },\n\n getPageXY: function (pointer, page) {\n page = page || {};\n\n // Opera Mobile handles the viewport and scrolling oddly\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n pointerUtils.getXY('screen', pointer, page);\n\n page.x += window.scrollX;\n page.y += window.scrollY;\n }\n else {\n pointerUtils.getXY('page', pointer, page);\n }\n\n return page;\n },\n\n getClientXY: function (pointer, client) {\n client = client || {};\n\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n // Opera Mobile handles the viewport and scrolling oddly\n pointerUtils.getXY('screen', pointer, client);\n }\n else {\n pointerUtils.getXY('client', pointer, client);\n }\n\n return client;\n },\n\n getPointerId: function (pointer) {\n return is.number(pointer.pointerId)? pointer.pointerId : pointer.identifier;\n },\n\n setCoords: function (targetObj, pointers, timeStamp) {\n const pointer = (pointers.length > 1\n ? pointerUtils.pointerAverage(pointers)\n : pointers[0]);\n\n const tmpXY = {};\n\n pointerUtils.getPageXY(pointer, tmpXY);\n targetObj.page.x = tmpXY.x;\n targetObj.page.y = tmpXY.y;\n\n pointerUtils.getClientXY(pointer, tmpXY);\n targetObj.client.x = tmpXY.x;\n targetObj.client.y = tmpXY.y;\n\n targetObj.timeStamp = is.number(timeStamp) ? timeStamp :new Date().getTime();\n },\n\n pointerExtend: pointerExtend,\n\n getTouchPair: function (event) {\n const touches = [];\n\n // array of touches is supplied\n if (is.array(event)) {\n touches[0] = event[0];\n touches[1] = event[1];\n }\n // an event\n else {\n if (event.type === 'touchend') {\n if (event.touches.length === 1) {\n touches[0] = event.touches[0];\n touches[1] = event.changedTouches[0];\n }\n else if (event.touches.length === 0) {\n touches[0] = event.changedTouches[0];\n touches[1] = event.changedTouches[1];\n }\n }\n else {\n touches[0] = event.touches[0];\n touches[1] = event.touches[1];\n }\n }\n\n return touches;\n },\n\n pointerAverage: function (pointers) {\n const average = {\n pageX : 0,\n pageY : 0,\n clientX: 0,\n clientY: 0,\n screenX: 0,\n screenY: 0,\n };\n\n for (const pointer of pointers) {\n for (const prop in average) {\n average[prop] += pointer[prop];\n }\n }\n for (const prop in average) {\n average[prop] /= pointers.length;\n }\n\n return average;\n },\n\n touchBBox: function (event) {\n if (!event.length && !(event.touches && event.touches.length > 1)) {\n return;\n }\n\n const touches = pointerUtils.getTouchPair(event);\n const minX = Math.min(touches[0].pageX, touches[1].pageX);\n const minY = Math.min(touches[0].pageY, touches[1].pageY);\n const maxX = Math.max(touches[0].pageX, touches[1].pageX);\n const maxY = Math.max(touches[0].pageY, touches[1].pageY);\n\n return {\n x: minX,\n y: minY,\n left: minX,\n top: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n },\n\n touchDistance: function (event, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n\n\n const dx = touches[0][sourceX] - touches[1][sourceX];\n const dy = touches[0][sourceY] - touches[1][sourceY];\n\n return hypot(dx, dy);\n },\n\n touchAngle: function (event, prevAngle, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n const dx = touches[1][sourceX] - touches[0][sourceX];\n const dy = touches[1][sourceY] - touches[0][sourceY];\n const angle = 180 * Math.atan2(dy , dx) / Math.PI;\n\n return angle;\n },\n\n getPointerType: function (pointer) {\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : is.number(pointer.pointerType)\n ? [undefined, undefined,'touch', 'pen', 'mouse'][pointer.pointerType]\n // if the PointerEvent API isn't available, then the \"pointer\" must\n // be either a MouseEvent, TouchEvent, or Touch object\n : /touch/.test(pointer.type) || pointer instanceof domObjects.Touch\n ? 'touch'\n : 'mouse';\n },\n\n // [ event.target, event.currentTarget ]\n getEventTargets: function (event) {\n return [\n domUtils.getActualElement(event.path ? event.path[0] : event.target),\n domUtils.getActualElement(event.currentTarget),\n ];\n },\n};\n\nmodule.exports = pointerUtils;\n","const { window } = require('./window');\n\nconst vendors = ['ms', 'moz', 'webkit', 'o'];\nlet lastTime = 0;\nlet request;\nlet cancel;\n\nfor (let x = 0; x < vendors.length && !window.requestAnimationFrame; x++) {\n request = window[vendors[x] + 'RequestAnimationFrame'];\n cancel = window[vendors[x] +'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n}\n\nif (!request) {\n request = function (callback) {\n const currTime = new Date().getTime();\n const timeToCall = Math.max(0, 16 - (currTime - lastTime));\n const id = setTimeout(function () { callback(currTime + timeToCall); },\n timeToCall);\n\n lastTime = currTime + timeToCall;\n return id;\n };\n}\n\nif (!cancel) {\n cancel = function (id) {\n clearTimeout(id);\n };\n}\n\nmodule.exports = {\n request,\n cancel,\n};\n","const extend = require('./extend');\nconst is = require('./is');\nconst {\n closest,\n parentNode,\n getElementRect,\n} = require('./domUtils');\n\nconst rectUtils = {\n getStringOptionResult: function (value, interactable, element) {\n if (!is.string(value)) {\n return null;\n }\n\n if (value === 'parent') {\n value = parentNode(element);\n }\n else if (value === 'self') {\n value = interactable.getRect(element);\n }\n else {\n value = closest(element, value);\n }\n\n return value;\n },\n\n resolveRectLike: function (value, interactable, element, functionArgs) {\n value = rectUtils.getStringOptionResult(value, interactable, element) || value;\n\n if (is.function(value)) {\n value = value.apply(null, functionArgs);\n }\n\n if (is.element(value)) {\n value = getElementRect(value);\n }\n\n return value;\n },\n\n rectToXY: function (rect) {\n return rect && {\n x: 'x' in rect ? rect.x : rect.left,\n y: 'y' in rect ? rect.y : rect.top,\n };\n },\n\n xywhToTlbr: function (rect) {\n if (rect && !('left' in rect && 'top' in rect)) {\n rect = extend({}, rect);\n\n rect.left = rect.x || 0;\n rect.top = rect.y || 0;\n rect.right = rect.right || (rect.left + rect.width);\n rect.bottom = rect.bottom || (rect.top + rect.height);\n }\n\n return rect;\n },\n\n tlbrToXywh: function (rect) {\n if (rect && !('x' in rect && 'y' in rect)) {\n rect = extend({}, rect);\n\n rect.x = rect.left || 0;\n rect.top = rect.top || 0;\n rect.width = rect.width || (rect.right - rect.x);\n rect.height = rect.height || (rect.bottom - rect.y);\n }\n\n return rect;\n },\n};\n\nmodule.exports = rectUtils;\n","const win = module.exports;\nconst isWindow = require('./isWindow');\n\nfunction init (window) {\n // get wrapped window if using Shadow DOM polyfill\n\n win.realWindow = window;\n\n // create a TextNode\n const el = window.document.createTextNode('');\n\n // check if it's wrapped by a polyfill\n if (el.ownerDocument !== window.document\n && typeof window.wrap === 'function'\n && window.wrap(el) === el) {\n // use wrapped window\n window = window.wrap(window);\n }\n\n win.window = window;\n}\n\nif (typeof window === 'undefined') {\n win.window = undefined;\n win.realWindow = undefined;\n}\nelse {\n init(window);\n}\n\nwin.getWindow = function getWindow (node) {\n if (isWindow(node)) {\n return node;\n }\n\n const rootNode = (node.ownerDocument || node);\n\n return rootNode.defaultView || rootNode.parentWindow || win.window;\n};\n\nwin.init = init;\n"]} \ No newline at end of file diff --git a/package.json b/package.json index 76f3e9969..f39704e99 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "interactjs", - "version": "1.3.0-alpha.3+sha.9595c40", + "version": "1.3.0-alpha.4+sha.7970416", "repository": { "type": "git", "url": "https://github.com/taye/interact.js.git"
- Interactable.origin(…)⚓➭ + Interactable.origin(…)⚓➭ @@ -1041,7 +1041,7 @@ Parameters - Interactable.deltaSource([newValue])⚓➭ + Interactable.deltaSource([newValue])⚓➭ @@ -1104,7 +1104,7 @@ Parameters - Interactable.context()⚓➭ + Interactable.context()⚓➭ @@ -1146,7 +1146,7 @@ Interactable.context() - Interactable.fire(iEvent)⚓➭ + Interactable.fire(iEvent)⚓➭ @@ -1207,7 +1207,7 @@ Parameters - Interactable.on(eventType, listener, [options])⚓➭ + Interactable.on(eventType, listener, [options])⚓➭ @@ -1273,7 +1273,7 @@ Parameters - Interactable.off(eventType, listener, [options])⚓➭ + Interactable.off(eventType, listener, [options])⚓➭ @@ -1339,7 +1339,7 @@ Parameters - Interactable.set(options)⚓➭ + Interactable.set(options)⚓➭ @@ -1399,7 +1399,7 @@ Parameters - Interactable.unset()⚓➭ + Interactable.unset()⚓➭ @@ -1442,7 +1442,7 @@ Interactable.unset() - Interactable.actionChecker([checker])⚓➭ + Interactable.actionChecker([checker])⚓➭ @@ -1542,7 +1542,7 @@ Parameters - Interactable.styleCursor([newValue])⚓➭ + Interactable.styleCursor([newValue])⚓➭ @@ -1605,7 +1605,7 @@ Parameters - interact.maxInteractions([newValue])⚓➭ + interact.maxInteractions([newValue])⚓➭ @@ -1652,7 +1652,7 @@ Parameters - Interactable.preventDefault([newValue])⚓➭ + Interactable.preventDefault([newValue])⚓➭ @@ -1718,7 +1718,7 @@ Parameters - interact(element)⚓➭ + interact(element)⚓➭ @@ -1821,7 +1821,7 @@ Usage - interact.isSet(element)⚓➭ + interact.isSet(element)⚓➭ @@ -1881,7 +1881,7 @@ Parameters - interact.on(type, listener, [options])⚓➭ + interact.on(type, listener, [options])⚓➭ @@ -1948,7 +1948,7 @@ Parameters - interact.off(type, listener, [options])⚓➭ + interact.off(type, listener, [options])⚓➭ @@ -2014,7 +2014,7 @@ Parameters - interact.debug()⚓➭ + interact.debug()⚓➭ @@ -2056,7 +2056,7 @@ interact.debug() - interact.supportsTouch()⚓➭ + interact.supportsTouch()⚓➭ @@ -2097,7 +2097,7 @@ interact.supportsTouch() - interact.supportsPointerEvent()⚓➭ + interact.supportsPointerEvent()⚓➭ @@ -2138,7 +2138,7 @@ interact.supportsPointerEvent() - interact.stop(event)⚓➭ + interact.stop(event)⚓➭ @@ -2198,7 +2198,7 @@ Parameters - interact.pointerMoveTolerance([newValue])⚓➭ + interact.pointerMoveTolerance([newValue])⚓➭ @@ -2261,7 +2261,7 @@ Parameters - Interaction.start(action, target, element)⚓➭ + Interaction.start(action, target, element)⚓➭ @@ -2356,7 +2356,7 @@ Parameters - Interaction.doMove()⚓➭ + Interaction.doMove()⚓➭ @@ -2403,7 +2403,7 @@ Interaction.doMove() - Interaction.end([event])⚓➭ + Interaction.end([event])⚓➭ diff --git a/dist/interact.js b/dist/interact.js index e8ae35c3b..c78a3c751 100644 --- a/dist/interact.js +++ b/dist/interact.js @@ -1,5 +1,5 @@ /** - * interact.js v1.3.0-alpha.3+sha.9595c40 + * interact.js v1.3.0-alpha.4+sha.7970416-dirty * * Copyright (c) 2012-2017 Taye Adeyemi * Open source under the MIT License. @@ -816,6 +816,7 @@ var scope = require('./scope'); var utils = require('./utils'); var events = require('./utils/events'); var browser = require('./utils/browser'); +var domObjects = require('./utils/domObjects'); var finder = require('./utils/interactionFinder'); var signals = require('./utils/Signals').new(); @@ -829,7 +830,9 @@ var prevTouchTime = 0; scope.interactions = []; var Interaction = function () { - function Interaction() { + function Interaction(_ref) { + var pointerType = _ref.pointerType; + _classCallCheck(this, Interaction); this.target = null; // current interactable being interacted with @@ -886,7 +889,7 @@ var Interaction = function () { this.pointerWasMoved = false; this._interacting = false; - this.mouse = false; + this.pointerType = pointerType; signals.fire('new', this); @@ -1130,6 +1133,11 @@ var Interaction = function () { }; Interaction.prototype.getPointerIndex = function getPointerIndex(pointer) { + // mouse and pen interactions may have only one pointer + if (this.pointerType === 'mouse' || this.pointerType === 'pen') { + return 0; + } + return utils.indexOf(this.pointerIds, utils.getPointerId(pointer)); }; @@ -1161,8 +1169,7 @@ var Interaction = function () { }; Interaction.prototype.removePointer = function removePointer(pointer, event) { - var id = utils.getPointerId(pointer); - var index = this.mouse ? 0 : utils.indexOf(this.pointerIds, id); + var index = this.getPointerIndex(pointer); if (index === -1) { return; @@ -1197,6 +1204,8 @@ for (var i = 0, len = methodNames.length; i < len; i++) { function doOnInteractions(method) { return function (event) { + var pointerType = utils.getPointerType(event); + var _utils$getEventTarget = utils.getEventTargets(event), eventTarget = _utils$getEventTarget[0], curEventTarget = _utils$getEventTarget[1]; @@ -1210,7 +1219,7 @@ function doOnInteractions(method) { var pointer = event.changedTouches[_i]; var interaction = finder.search(pointer, event.type, eventTarget); - matches.push([pointer, interaction || new Interaction()]); + matches.push([pointer, interaction || new Interaction({ pointerType: pointerType })]); } } else { var invalidPointer = false; @@ -1218,7 +1227,7 @@ function doOnInteractions(method) { if (!browser.supportsPointerEvent && /mouse/.test(event.type)) { // ignore mouse events while touch interactions are active for (var _i2 = 0; _i2 < scope.interactions.length && !invalidPointer; _i2++) { - invalidPointer = !scope.interactions[_i2].mouse && scope.interactions[_i2].pointerIsDown; + invalidPointer = scope.interactions[_i2].pointerType !== 'mouse' && scope.interactions[_i2].pointerIsDown; } // try to ignore mouse events that are simulated by the browser @@ -1232,11 +1241,7 @@ function doOnInteractions(method) { var _interaction = finder.search(event, event.type, eventTarget); if (!_interaction) { - - _interaction = new Interaction(); - _interaction.mouse = /mouse/i.test(event.pointerType || event.type) - // MSPointerEvent.MSPOINTER_TYPE_MOUSE - || event.pointerType === 4 || !event.pointerType; + _interaction = new Interaction({ pointerType: pointerType }); } matches.push([event, _interaction]); @@ -1244,20 +1249,20 @@ function doOnInteractions(method) { } for (var _iterator = matches, _isArray = Array.isArray(_iterator), _i3 = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { - var _ref; + var _ref2; if (_isArray) { if (_i3 >= _iterator.length) break; - _ref = _iterator[_i3++]; + _ref2 = _iterator[_i3++]; } else { _i3 = _iterator.next(); if (_i3.done) break; - _ref = _i3.value; + _ref2 = _i3.value; } - var _ref2 = _ref, - _pointer = _ref2[0], - _interaction2 = _ref2[1]; + var _ref3 = _ref2, + _pointer = _ref3[0], + _interaction2 = _ref3[1]; _interaction2._updateEventTargets(eventTarget, curEventTarget); _interaction2[method](_pointer, event, eventTarget, curEventTarget); @@ -1277,7 +1282,7 @@ function endAll(event) { var docEvents = {/* 'eventType': listenerFunc */}; var pEventTypes = browser.pEventTypes; -if (scope.PointerEvent) { +if (domObjects.PointerEvent) { docEvents[pEventTypes.down] = listeners.pointerDown; docEvents[pEventTypes.move] = listeners.pointerMove; docEvents[pEventTypes.up] = listeners.pointerUp; @@ -1295,8 +1300,8 @@ if (scope.PointerEvent) { docEvents.blur = endAll; -function onDocSignal(_ref3, signalName) { - var doc = _ref3.doc; +function onDocSignal(_ref4, signalName) { + var doc = _ref4.doc; var eventMethod = signalName.indexOf('add') === 0 ? events.add : events.remove; @@ -1311,14 +1316,14 @@ function onDocSignal(_ref3, signalName) { } } -signals.on('update-pointer-down', function (_ref4) { - var interaction = _ref4.interaction, - pointer = _ref4.pointer, - pointerId = _ref4.pointerId, - pointerIndex = _ref4.pointerIndex, - event = _ref4.event, - eventTarget = _ref4.eventTarget, - down = _ref4.down; +signals.on('update-pointer-down', function (_ref5) { + var interaction = _ref5.interaction, + pointer = _ref5.pointer, + pointerId = _ref5.pointerId, + pointerIndex = _ref5.pointerIndex, + event = _ref5.event, + eventTarget = _ref5.eventTarget, + down = _ref5.down; interaction.pointerIds[pointerIndex] = pointerId; interaction.pointers[pointerIndex] = pointer; @@ -1355,7 +1360,7 @@ scope.endAllInteractions = endAll; module.exports = Interaction; -},{"./scope":34,"./utils":44,"./utils/Signals":35,"./utils/browser":37,"./utils/events":40,"./utils/interactionFinder":45}],6:[function(require,module,exports){ +},{"./scope":34,"./utils":44,"./utils/Signals":35,"./utils/browser":37,"./utils/domObjects":38,"./utils/events":40,"./utils/interactionFinder":45}],6:[function(require,module,exports){ 'use strict'; var Interaction = require('../Interaction'); @@ -5460,7 +5465,7 @@ module.exports = function () { this.originalEvent = event; this.type = type; this.pointerId = pointerUtils.getPointerId(pointer); - this.pointerType = pointerUtils.getPointerType(pointer, interaction); + this.pointerType = pointerUtils.getPointerType(pointer); this.target = eventTarget; this.currentTarget = null; @@ -5758,8 +5763,10 @@ Interaction.signals.on('down', function (_ref6) { timer.duration = minDuration; timer.timeout = setTimeout(function () { fire({ - interaction: interaction, eventCopy: eventCopy, eventTarget: eventTarget, + interaction: interaction, + eventTarget: eventTarget, pointer: browser.isIE8 ? eventCopy : pointer, + event: eventCopy, type: 'hold' }); }, minDuration); @@ -6946,17 +6953,14 @@ module.exports = utils; var scope = require('../scope'); var utils = require('./index'); -var browser = require('./browser'); var finder = { - methodOrder: ['simulationResume', 'mouse', 'hasPointer', 'idle'], + methodOrder: ['simulationResume', 'mouseOrPen', 'hasPointer', 'idle'], search: function search(pointer, eventType, eventTarget) { - var mouseEvent = /mouse/i.test(pointer.pointerType || eventType) - // MSPointerEvent.MSPOINTER_TYPE_MOUSE - || pointer.pointerType === 4; + var pointerType = utils.getPointerType(pointer); var pointerId = utils.getPointerId(pointer); - var details = { pointer: pointer, pointerId: pointerId, mouseEvent: mouseEvent, eventType: eventType, eventTarget: eventTarget }; + var details = { pointer: pointer, pointerId: pointerId, pointerType: pointerType, eventType: eventType, eventTarget: eventTarget }; for (var _iterator = finder.methodOrder, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { var _ref; @@ -6982,7 +6986,7 @@ var finder = { // try to resume simulation with a new pointer simulationResume: function simulationResume(_ref2) { - var mouseEvent = _ref2.mouseEvent, + var pointerType = _ref2.pointerType, eventType = _ref2.eventType, eventTarget = _ref2.eventTarget; @@ -7006,7 +7010,7 @@ var finder = { var element = eventTarget; - if (interaction.simulation && interaction.simulation.allowResume && interaction.mouse === mouseEvent) { + if (interaction.simulation && interaction.simulation.allowResume && interaction.pointerType === pointerType) { while (element) { // if the element is the interaction element if (element === interaction.element) { @@ -7020,13 +7024,13 @@ var finder = { return null; }, - // if it's a mouse interaction - mouse: function mouse(_ref4) { + // if it's a mouse or pen interaction + mouseOrPen: function mouseOrPen(_ref4) { var pointerId = _ref4.pointerId, - mouseEvent = _ref4.mouseEvent, + pointerType = _ref4.pointerType, eventType = _ref4.eventType; - if (!mouseEvent && (browser.supportsTouch || browser.supportsPointerEvent)) { + if (pointerType !== 'mouse' && pointerType !== 'pen') { return null; } @@ -7046,7 +7050,7 @@ var finder = { var interaction = _ref5; - if (interaction.mouse) { + if (interaction.pointerType === pointerType) { // if it's a down event, skip interactions with running simulations if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; @@ -7069,8 +7073,8 @@ var finder = { return firstNonActive; } - // Find any interaction specifically for mouse. - // ignore the interaction if the eventType is a mousedown, and a simulation + // find any mouse or pen interaction. + // ignore the interaction if the eventType is a *down, and a simulation // is active for (var _iterator4 = scope.interactions, _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) { var _ref6; @@ -7086,7 +7090,7 @@ var finder = { var _interaction = _ref6; - if (_interaction.mouse && !(/down/.test(eventType) && _interaction.simulation)) { + if (_interaction.pointerType === pointerType && !(/down/i.test(eventType) && _interaction.simulation)) { return _interaction; } } @@ -7118,9 +7122,9 @@ var finder = { } }, - // get first idle interaction + // get first idle interaction with a matching pointerType idle: function idle(_ref9) { - var mouseEvent = _ref9.mouseEvent; + var pointerType = _ref9.pointerType; for (var _iterator6 = scope.interactions, _isArray6 = Array.isArray(_iterator6), _i6 = 0, _iterator6 = _isArray6 ? _iterator6 : _iterator6[Symbol.iterator]();;) { var _ref10; @@ -7150,7 +7154,7 @@ var finder = { continue; } - if (!interaction.interacting() && mouseEvent === interaction.mouse) { + if (!interaction.interacting() && pointerType === interaction.pointerType) { return interaction; } } @@ -7161,7 +7165,7 @@ var finder = { module.exports = finder; -},{"../scope":34,"./browser":37,"./index":44}],46:[function(require,module,exports){ +},{"../scope":34,"./index":44}],46:[function(require,module,exports){ 'use strict'; var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; @@ -7262,6 +7266,7 @@ var hypot = require('./hypot'); var browser = require('./browser'); var dom = require('./domObjects'); var domUtils = require('./domUtils'); +var domObjects = require('./domObjects'); var is = require('./is'); var pointerExtend = require('./pointerExtend'); @@ -7468,17 +7473,11 @@ var pointerUtils = { return angle; }, - getPointerType: function getPointerType(pointer, interaction) { - // if the PointerEvent API isn't available, then the pointer must be ither - // a MouseEvent or TouchEvent - if (interaction.mouse) { - return 'mouse'; - } - if (!browser.supportsPointerEvent) { - return 'touch'; - } - - return is.string(pointer.pointerType) ? pointer.pointerType : [undefined, undefined, 'touch', 'pen', 'mouse'][pointer.pointerType]; + getPointerType: function getPointerType(pointer) { + return is.string(pointer.pointerType) ? pointer.pointerType : is.number(pointer.pointerType) ? [undefined, undefined, 'touch', 'pen', 'mouse'][pointer.pointerType] + // if the PointerEvent API isn't available, then the "pointer" must + // be either a MouseEvent, TouchEvent, or Touch object + : /touch/.test(pointer.type) || pointer instanceof domObjects.Touch ? 'touch' : 'mouse'; }, // [ event.target, event.currentTarget ] diff --git a/dist/interact.js.map b/dist/interact.js.map index 60832b766..4f3a62ba8 100644 --- a/dist/interact.js.map +++ b/dist/interact.js.map @@ -1 +1 @@ -{"version":3,"sources":["src/header.js","node_modules/browser-pack/_prelude.js","index.js","src/Eventable.js","src/InteractEvent.js","src/Interactable.js","src/Interaction.js","src/actions/base.js","src/actions/drag.js","src/actions/drop.js","src/actions/gesture.js","src/actions/resize.js","src/autoScroll.js","src/autoStart/InteractableMethods.js","src/autoStart/base.js","src/autoStart/delay.js","src/autoStart/drag.js","src/autoStart/gesture.js","src/autoStart/resize.js","src/defaultOptions.js","src/index.js","src/inertia.js","src/interact.js","src/interactablePreventDefault.js","src/legacyBrowsers.js","src/modifiers/index.js","src/modifiers/restrict.js","src/modifiers/restrictEdges.js","src/modifiers/restrictSize.js","src/modifiers/snap.js","src/modifiers/snapSize.js","src/pointerEvents/PointerEvent.js","src/pointerEvents/base.js","src/pointerEvents/holdRepeat.js","src/pointerEvents/interactableTargets.js","src/scope.js","src/utils/Signals.js","src/utils/arr.js","src/utils/browser.js","src/utils/domObjects.js","src/utils/domUtils.js","src/utils/events.js","src/utils/extend.js","src/utils/getOriginXY.js","src/utils/hypot.js","src/utils/index.js","src/utils/interactionFinder.js","src/utils/is.js","src/utils/isWindow.js","src/utils/pointerExtend.js","src/utils/pointerUtils.js","src/utils/raf.js","src/utils/rect.js","src/utils/window.js"],"names":[],"mappings":"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","file":"interact.js","sourceRoot":"","sourcesContent":["/**\n * interact.js v1.3.0-alpha.3+sha.9595c40\n *\n * Copyright (c) 2012-2017 Taye Adeyemi \n * Open source under the MIT License.\n * https://raw.github.com/taye/interact.js/master/LICENSE\n */\n","(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o 150) {\n return null;\n }\n\n let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI;\n const overlap = 22.5;\n\n if (angle < 0) {\n angle += 360;\n }\n\n const left = 135 - overlap <= angle && angle < 225 + overlap;\n const up = 225 - overlap <= angle && angle < 315 + overlap;\n\n const right = !left && (315 - overlap <= angle || angle < 45 + overlap);\n const down = !up && 45 - overlap <= angle && angle < 135 + overlap;\n\n return {\n up,\n down,\n left,\n right,\n angle,\n speed: interaction.prevEvent.speed,\n velocity: {\n x: interaction.prevEvent.velocityX,\n y: interaction.prevEvent.velocityY,\n },\n };\n }\n\n preventDefault () {}\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n}\n\nsignals.on('set-delta', function ({ iEvent, interaction, starting, deltaSource }) {\n const prevEvent = starting? iEvent : interaction.prevEvent;\n\n if (deltaSource === 'client') {\n iEvent.dx = iEvent.clientX - prevEvent.clientX;\n iEvent.dy = iEvent.clientY - prevEvent.clientY;\n }\n else {\n iEvent.dx = iEvent.pageX - prevEvent.pageX;\n iEvent.dy = iEvent.pageY - prevEvent.pageY;\n }\n});\n\nInteractEvent.signals = signals;\n\nmodule.exports = InteractEvent;\n","const is = require('./utils/is');\nconst events = require('./utils/events');\nconst extend = require('./utils/extend');\nconst actions = require('./actions/base');\nconst scope = require('./scope');\nconst Eventable = require('./Eventable');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nconst {\n getElementRect,\n nodeContains,\n trySelector,\n} = require('./utils/domUtils');\nconst { getWindow } = require('./utils/window');\nconst { indexOf, contains } = require('./utils/arr');\nconst { wheelEvent } = require('./utils/browser');\n\n// all set interactables\nscope.interactables = [];\n\n/*\\\n * Interactable\n [ property ]\n **\n * Object type returned by @interact\n\\*/\nclass Interactable {\n constructor (target, options) {\n options = options || {};\n\n this.target = target;\n this.events = new Eventable();\n this._context = options.context || scope.document;\n this._win = getWindow(trySelector(target)? this._context : target);\n this._doc = this._win.document;\n\n signals.fire('new', {\n target,\n options,\n interactable: this,\n win: this._win,\n });\n\n scope.addDocument( this._doc, this._win );\n\n scope.interactables.push(this);\n\n this.set(options);\n }\n\n setOnEvents (action, phases) {\n const onAction = 'on' + action;\n\n if (is.function(phases.onstart) ) { this.events[onAction + 'start' ] = phases.onstart ; }\n if (is.function(phases.onmove) ) { this.events[onAction + 'move' ] = phases.onmove ; }\n if (is.function(phases.onend) ) { this.events[onAction + 'end' ] = phases.onend ; }\n if (is.function(phases.oninertiastart)) { this.events[onAction + 'inertiastart' ] = phases.oninertiastart ; }\n\n return this;\n }\n\n setPerAction (action, options) {\n // for all the default per-action options\n for (const option in options) {\n // if this option exists for this action\n if (option in defaults[action]) {\n // if the option in the options arg is an object value\n if (is.object(options[option])) {\n // duplicate the object\n this.options[action][option] = extend(this.options[action][option] || {}, options[option]);\n\n if (is.object(defaults.perAction[option]) && 'enabled' in defaults.perAction[option]) {\n this.options[action][option].enabled = options[option].enabled === false? false : true;\n }\n }\n else if (is.bool(options[option]) && is.object(defaults.perAction[option])) {\n this.options[action][option].enabled = options[option];\n }\n else if (options[option] !== undefined) {\n // or if it's not undefined, do a plain assignment\n this.options[action][option] = options[option];\n }\n }\n }\n }\n\n /*\\\n * Interactable.getRect\n [ method ]\n *\n * The default function to get an Interactables bounding rect. Can be\n * overridden using @Interactable.rectChecker.\n *\n - element (Element) #optional The element to measure.\n = (object) The object's bounding rectangle.\n o {\n o top : 0,\n o left : 0,\n o bottom: 0,\n o right : 0,\n o width : 0,\n o height: 0\n o }\n \\*/\n getRect (element) {\n element = element || this.target;\n\n if (is.string(this.target) && !(is.element(element))) {\n element = this._context.querySelector(this.target);\n }\n\n return getElementRect(element);\n }\n\n /*\\\n * Interactable.rectChecker\n [ method ]\n *\n * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n - checker (function) #optional A function which returns this Interactable's bounding rectangle. See @Interactable.getRect\n = (function | object) The checker function or this Interactable\n \\*/\n rectChecker (checker) {\n if (is.function(checker)) {\n this.getRect = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.getRect;\n\n return this;\n }\n\n return this.getRect;\n }\n\n _backCompatOption (optionName, newValue) {\n if (trySelector(newValue) || is.object(newValue)) {\n this.options[optionName] = newValue;\n\n for (const action of actions.names) {\n this.options[action][optionName] = newValue;\n }\n\n return this;\n }\n\n return this.options[optionName];\n }\n\n /*\\\n * Interactable.origin\n [ method ]\n *\n * Gets or sets the origin of the Interactable's element. The x and y\n * of the origin will be subtracted from action event coordinates.\n *\n - origin (object | string) #optional An object eg. { x: 0, y: 0 } or string 'parent', 'self' or any CSS selector\n * OR\n - origin (Element) #optional An HTML or SVG Element whose rect will be used\n **\n = (object) The current origin or this Interactable\n \\*/\n origin (newValue) {\n return this._backCompatOption('origin', newValue);\n }\n\n /*\\\n * Interactable.deltaSource\n [ method ]\n *\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n - newValue (string) #optional Use 'client' if you will be scrolling while interacting; Use 'page' if you want autoScroll to work\n = (string | object) The current deltaSource or this Interactable\n \\*/\n deltaSource (newValue) {\n if (newValue === 'page' || newValue === 'client') {\n this.options.deltaSource = newValue;\n\n return this;\n }\n\n return this.options.deltaSource;\n }\n\n /*\\\n * Interactable.context\n [ method ]\n *\n * Gets the selector context Node of the Interactable. The default is `window.document`.\n *\n = (Node) The context Node of this Interactable\n **\n \\*/\n context () {\n return this._context;\n }\n\n inContext (element) {\n return (this._context === element.ownerDocument\n || nodeContains(this._context, element));\n }\n\n /*\\\n * Interactable.fire\n [ method ]\n *\n * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n - iEvent (InteractEvent) The InteractEvent object to be fired on this Interactable\n = (Interactable) this Interactable\n \\*/\n fire (iEvent) {\n this.events.fire(iEvent);\n\n return this;\n }\n\n _onOffMultiple (method, eventType, listener, options) {\n if (is.string(eventType) && eventType.search(' ') !== -1) {\n eventType = eventType.trim().split(/ +/);\n }\n\n if (is.array(eventType)) {\n for (let i = 0; i < eventType.length; i++) {\n this[method](eventType[i], listener, options);\n }\n\n return true;\n }\n\n if (is.object(eventType)) {\n for (const prop in eventType) {\n this[method](prop, eventType[prop], listener);\n }\n\n return true;\n }\n }\n\n /*\\\n * Interactable.on\n [ method ]\n *\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n - eventType (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) This Interactable\n \\*/\n on (eventType, listener, options) {\n if (this._onOffMultiple('on', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.on(eventType, listener);\n }\n // delegated event for selector\n else if (is.string(this.target)) {\n events.addDelegate(this.target, this._context, eventType, listener, options);\n }\n else {\n events.add(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.off\n [ method ]\n *\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n - eventType (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) This Interactable\n \\*/\n off (eventType, listener, options) {\n if (this._onOffMultiple('off', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n // if it is an action event type\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.off(eventType, listener);\n }\n // delegated event\n else if (is.string(this.target)) {\n events.removeDelegate(this.target, this._context, eventType, listener, options);\n }\n // remove listener from this Interatable's element\n else {\n events.remove(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.set\n [ method ]\n *\n * Reset the options of this Interactable\n - options (object) The new settings to apply\n = (object) This Interactable\n \\*/\n set (options) {\n if (!is.object(options)) {\n options = {};\n }\n\n this.options = extend({}, defaults.base);\n\n const perActions = extend({}, defaults.perAction);\n\n for (const actionName in actions.methodDict) {\n const methodName = actions.methodDict[actionName];\n\n this.options[actionName] = extend({}, defaults[actionName]);\n\n this.setPerAction(actionName, perActions);\n\n this[methodName](options[actionName]);\n }\n\n for (const setting of Interactable.settingsMethods) {\n this.options[setting] = defaults.base[setting];\n\n if (setting in options) {\n this[setting](options[setting]);\n }\n }\n\n signals.fire('set', {\n options,\n interactable: this,\n });\n\n return this;\n }\n\n /*\\\n * Interactable.unset\n [ method ]\n *\n * Remove this interactable from the list of interactables and remove\n * it's action capabilities and event listeners\n *\n = (object) @interact\n \\*/\n unset () {\n events.remove(this.target, 'all');\n\n if (is.string(this.target)) {\n // remove delegated events\n for (const type in events.delegatedEvents) {\n const delegated = events.delegatedEvents[type];\n\n if (delegated.selectors[0] === this.target\n && delegated.contexts[0] === this._context) {\n\n delegated.selectors.splice(0, 1);\n delegated.contexts .splice(0, 1);\n delegated.listeners.splice(0, 1);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegated[type] = null;\n }\n }\n\n events.remove(this._context, type, events.delegateListener);\n events.remove(this._context, type, events.delegateUseCapture, true);\n }\n }\n else {\n events.remove(this, 'all');\n }\n\n signals.fire('unset', { interactable: this });\n\n scope.interactables.splice(indexOf(scope.interactables, this), 1);\n\n // Stop related interactions when an Interactable is unset\n for (const interaction of scope.interactions || []) {\n if (interaction.target === this && interaction.interacting()) {\n interaction.stop();\n }\n }\n\n return scope.interact;\n }\n}\n\nscope.interactables.indexOfElement = function indexOfElement (target, context) {\n context = context || scope.document;\n\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n if (interactable.target === target && interactable._context === context) {\n return i;\n }\n }\n return -1;\n};\n\nscope.interactables.get = function interactableGet (element, options, dontCheckInContext) {\n const ret = this[this.indexOfElement(element, options && options.context)];\n\n return ret && (is.string(element) || dontCheckInContext || ret.inContext(element))? ret : null;\n};\n\nscope.interactables.forEachSelector = function (callback, element) {\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n // skip non CSS selector targets and out of context elements\n if (!is.string(interactable.target)\n || (element && !interactable.inContext(element))) {\n continue;\n }\n\n const ret = callback(interactable, interactable.target, interactable._context, i, this);\n\n if (ret !== undefined) {\n return ret;\n }\n }\n};\n\n// all interact.js eventTypes\nInteractable.eventTypes = scope.eventTypes = [];\n\nInteractable.signals = signals;\n\nInteractable.settingsMethods = [ 'deltaSource', 'origin', 'preventDefault', 'rectChecker' ];\n\nmodule.exports = Interactable;\n","const scope = require('./scope');\nconst utils = require('./utils');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst finder = require('./utils/interactionFinder');\nconst signals = require('./utils/Signals').new();\n\nconst listeners = {};\nconst methodNames = [\n 'pointerDown', 'pointerMove', 'pointerUp',\n 'updatePointer', 'removePointer',\n];\n\n// for ignoring browser's simulated mouse events\nlet prevTouchTime = 0;\n\n// all active and idle interactions\nscope.interactions = [];\n\nclass Interaction {\n constructor () {\n this.target = null; // current interactable being interacted with\n this.element = null; // the target element of the interactable\n\n this.prepared = { // action that's ready to be fired on next move event\n name : null,\n axis : null,\n edges: null,\n };\n\n // keep track of added pointers\n this.pointers = [];\n this.pointerIds = [];\n this.downTargets = [];\n this.downTimes = [];\n\n // Previous native pointer move event coordinates\n this.prevCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n // current native pointer move event coordinates\n this.curCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Starting InteractEvent pointer coordinates\n this.startCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Change in coordinates and time of the pointer\n this.pointerDelta = {\n page : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n client : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n timeStamp: 0,\n };\n\n this.downEvent = null; // pointerdown/mousedown/touchstart event\n this.downPointer = {};\n\n this._eventTarget = null;\n this._curEventTarget = null;\n\n this.prevEvent = null; // previous action event\n\n this.pointerIsDown = false;\n this.pointerWasMoved = false;\n this._interacting = false;\n\n this.mouse = false;\n\n signals.fire('new', this);\n\n scope.interactions.push(this);\n }\n\n pointerDown (pointer, event, eventTarget) {\n const pointerIndex = this.updatePointer(pointer, event, true);\n\n signals.fire('down', {\n pointer,\n event,\n eventTarget,\n pointerIndex,\n interaction: this,\n });\n }\n\n /*\\\n * Interaction.start\n [ method ]\n *\n * Start an action with the given Interactable and Element as tartgets. The\n * action must be enabled for the target Interactable and an appropriate number\n * of pointers must be held down - 1 for drag/resize, 2 for gesture.\n *\n * Use it with `interactable.able({ manualStart: false })` to always\n * [start actions manually](https://github.com/taye/interact.js/issues/114)\n *\n - action (object) The action to be performed - drag, resize, etc.\n - target (Interactable) The Interactable to target\n - element (Element) The DOM Element to target\n = (object) interact\n **\n | interact(target)\n | .draggable({\n | // disable the default drag start by down->move\n | manualStart: true\n | })\n | // start dragging after the user holds the pointer down\n | .on('hold', function (event) {\n | var interaction = event.interaction;\n |\n | if (!interaction.interacting()) {\n | interaction.start({ name: 'drag' },\n | event.interactable,\n | event.currentTarget);\n | }\n | });\n \\*/\n start (action, target, element) {\n if (this.interacting()\n || !this.pointerIsDown\n || this.pointerIds.length < (action.name === 'gesture'? 2 : 1)) {\n return;\n }\n\n // if this interaction had been removed after stopping\n // add it back\n if (utils.indexOf(scope.interactions, this) === -1) {\n scope.interactions.push(this);\n }\n\n utils.copyAction(this.prepared, action);\n this.target = target;\n this.element = element;\n\n signals.fire('action-start', {\n interaction: this,\n event: this.downEvent,\n });\n }\n\n pointerMove (pointer, event, eventTarget) {\n if (!this.simulation) {\n this.updatePointer(pointer);\n utils.setCoords(this.curCoords, this.pointers);\n }\n\n const duplicateMove = (this.curCoords.page.x === this.prevCoords.page.x\n && this.curCoords.page.y === this.prevCoords.page.y\n && this.curCoords.client.x === this.prevCoords.client.x\n && this.curCoords.client.y === this.prevCoords.client.y);\n\n let dx;\n let dy;\n\n // register movement greater than pointerMoveTolerance\n if (this.pointerIsDown && !this.pointerWasMoved) {\n dx = this.curCoords.client.x - this.startCoords.client.x;\n dy = this.curCoords.client.y - this.startCoords.client.y;\n\n this.pointerWasMoved = utils.hypot(dx, dy) > Interaction.pointerMoveTolerance;\n }\n\n const signalArg = {\n pointer,\n pointerIndex: this.getPointerIndex(pointer),\n event,\n eventTarget,\n dx,\n dy,\n duplicate: duplicateMove,\n interaction: this,\n interactingBeforeMove: this.interacting(),\n };\n\n if (!duplicateMove) {\n // set pointer coordinate, time changes and speeds\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n }\n\n signals.fire('move', signalArg);\n\n if (!duplicateMove) {\n // if interacting, fire an 'action-move' signal etc\n if (this.interacting()) {\n this.doMove(signalArg);\n }\n\n if (this.pointerWasMoved) {\n utils.copyCoords(this.prevCoords, this.curCoords);\n }\n }\n }\n\n /*\\\n * Interaction.doMove\n [ method ]\n *\n * Force a move of the current action at the same coordinates. Useful if\n * snap/restrict has been changed and you want a movement with the new\n * settings.\n *\n **\n | interact(target)\n | .draggable(true)\n | .on('dragmove', function (event) {\n | if (someCondition) {\n | // change the snap settings\n | event.interactable.draggable({ snap: { targets: [] }});\n | // fire another move event with re-calculated snap\n | event.interaction.doMove();\n | }\n | });\n \\*/\n doMove (signalArg) {\n signalArg = utils.extend({\n pointer: this.pointers[0],\n event: this.prevEvent,\n eventTarget: this._eventTarget,\n interaction: this,\n }, signalArg || {});\n\n signals.fire('before-action-move', signalArg);\n\n if (!this._dontFireMove) {\n signals.fire('action-move', signalArg);\n }\n\n this._dontFireMove = false;\n }\n\n // End interact move events and stop auto-scroll unless simulation is running\n pointerUp (pointer, event, eventTarget, curEventTarget) {\n const pointerIndex = this.getPointerIndex(pointer);\n\n signals.fire(/cancel$/i.test(event.type)? 'cancel' : 'up', {\n pointer,\n pointerIndex,\n event,\n eventTarget,\n curEventTarget,\n interaction: this,\n });\n\n if (!this.simulation) {\n this.end(event);\n }\n\n this.pointerIsDown = false;\n this.removePointer(pointer, event);\n }\n\n /*\\\n * Interaction.end\n [ method ]\n *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n - event (PointerEvent) #optional\n **\n | interact(target)\n | .draggable(true)\n | .on('move', function (event) {\n | if (event.pageX > 1000) {\n | // end the current action\n | event.interaction.end();\n | // stop all further listeners from being called\n | event.stopImmediatePropagation();\n | }\n | });\n \\*/\n end (event) {\n event = event || this.prevEvent;\n\n if (this.interacting()) {\n signals.fire('action-end', {\n event,\n interaction: this,\n });\n }\n\n this.stop();\n }\n\n currentAction () {\n return this._interacting? this.prepared.name: null;\n }\n\n interacting () {\n return this._interacting;\n }\n\n stop () {\n signals.fire('stop', { interaction: this });\n\n if (this._interacting) {\n signals.fire('stop-active', { interaction: this });\n signals.fire('stop-' + this.prepared.name, { interaction: this });\n }\n\n this.target = this.element = null;\n\n this._interacting = false;\n this.prepared.name = this.prevEvent = null;\n }\n\n getPointerIndex (pointer) {\n return utils.indexOf(this.pointerIds, utils.getPointerId(pointer));\n }\n\n updatePointer (pointer, event, down = event && /(down|start)$/i.test(event.type)) {\n const id = utils.getPointerId(pointer);\n let index = this.getPointerIndex(pointer);\n\n if (index === -1) {\n index = this.pointerIds.length;\n this.pointerIds[index] = id;\n }\n\n if (down) {\n signals.fire('update-pointer-down', {\n pointer,\n event,\n down,\n pointerId: id,\n pointerIndex: index,\n interaction: this,\n });\n }\n\n this.pointers[index] = pointer;\n\n return index;\n }\n\n removePointer (pointer, event) {\n const id = utils.getPointerId(pointer);\n const index = this.mouse? 0 : utils.indexOf(this.pointerIds, id);\n\n if (index === -1) { return; }\n\n signals.fire('remove-pointer', {\n pointer,\n event,\n pointerIndex: index,\n interaction: this,\n });\n\n this.pointers .splice(index, 1);\n this.pointerIds .splice(index, 1);\n this.downTargets.splice(index, 1);\n this.downTimes .splice(index, 1);\n }\n\n _updateEventTargets (target, currentTarget) {\n this._eventTarget = target;\n this._curEventTarget = currentTarget;\n }\n}\n\nfor (let i = 0, len = methodNames.length; i < len; i++) {\n const method = methodNames[i];\n\n listeners[method] = doOnInteractions(method);\n}\n\nfunction doOnInteractions (method) {\n return (function (event) {\n const [eventTarget, curEventTarget] = utils.getEventTargets(event);\n const matches = []; // [ [pointer, interaction], ...]\n\n if (browser.supportsTouch && /touch/.test(event.type)) {\n prevTouchTime = new Date().getTime();\n\n for (let i = 0; i < event.changedTouches.length; i++) {\n const pointer = event.changedTouches[i];\n const interaction = finder.search(pointer, event.type, eventTarget);\n\n matches.push([pointer, interaction || new Interaction()]);\n }\n }\n else {\n let invalidPointer = false;\n\n if (!browser.supportsPointerEvent && /mouse/.test(event.type)) {\n // ignore mouse events while touch interactions are active\n for (let i = 0; i < scope.interactions.length && !invalidPointer; i++) {\n invalidPointer = !scope.interactions[i].mouse && scope.interactions[i].pointerIsDown;\n }\n\n // try to ignore mouse events that are simulated by the browser\n // after a touch event\n invalidPointer = invalidPointer\n || (new Date().getTime() - prevTouchTime < 500)\n // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated\n || event.timeStamp === 0;\n }\n\n if (!invalidPointer) {\n let interaction = finder.search(event, event.type, eventTarget);\n\n if (!interaction) {\n\n interaction = new Interaction();\n interaction.mouse = (/mouse/i.test(event.pointerType || event.type)\n // MSPointerEvent.MSPOINTER_TYPE_MOUSE\n || event.pointerType === 4\n || !event.pointerType);\n }\n\n matches.push([event, interaction]);\n }\n }\n\n for (const [pointer, interaction] of matches) {\n interaction._updateEventTargets(eventTarget, curEventTarget);\n interaction[method](pointer, event, eventTarget, curEventTarget);\n }\n });\n}\n\nfunction endAll (event) {\n for (let i = 0; i < scope.interactions.length; i++) {\n const interaction = scope.interactions[i];\n\n interaction.end(event);\n signals.fire('endall', { event, interaction });\n }\n}\n\nconst docEvents = { /* 'eventType': listenerFunc */ };\nconst pEventTypes = browser.pEventTypes;\n\nif (scope.PointerEvent) {\n docEvents[pEventTypes.down ] = listeners.pointerDown;\n docEvents[pEventTypes.move ] = listeners.pointerMove;\n docEvents[pEventTypes.up ] = listeners.pointerUp;\n docEvents[pEventTypes.cancel] = listeners.pointerUp;\n}\nelse {\n docEvents.mousedown = listeners.pointerDown;\n docEvents.mousemove = listeners.pointerMove;\n docEvents.mouseup = listeners.pointerUp;\n\n docEvents.touchstart = listeners.pointerDown;\n docEvents.touchmove = listeners.pointerMove;\n docEvents.touchend = listeners.pointerUp;\n docEvents.touchcancel = listeners.pointerUp;\n}\n\ndocEvents.blur = endAll;\n\nfunction onDocSignal ({ doc }, signalName) {\n const eventMethod = signalName.indexOf('add') === 0\n ? events.add : events.remove;\n\n // delegate event listener\n for (const eventType in scope.delegatedEvents) {\n eventMethod(doc, eventType, events.delegateListener);\n eventMethod(doc, eventType, events.delegateUseCapture, true);\n }\n\n for (const eventType in docEvents) {\n eventMethod(doc, eventType, docEvents[eventType]);\n }\n}\n\nsignals.on('update-pointer-down', ({ interaction, pointer, pointerId, pointerIndex, event, eventTarget, down }) => {\n interaction.pointerIds[pointerIndex] = pointerId;\n interaction.pointers[pointerIndex] = pointer;\n\n if (down) {\n interaction.pointerIsDown = true;\n }\n\n if (!interaction.interacting()) {\n utils.setCoords(interaction.startCoords, interaction.pointers);\n\n utils.copyCoords(interaction.curCoords , interaction.startCoords);\n utils.copyCoords(interaction.prevCoords, interaction.startCoords);\n\n interaction.downEvent = event;\n interaction.downTimes[pointerIndex] = interaction.curCoords.timeStamp;\n interaction.downTargets[pointerIndex] = eventTarget || event && utils.getEventTargets(event)[0];\n interaction.pointerWasMoved = false;\n\n utils.pointerExtend(interaction.downPointer, pointer);\n }\n});\n\nscope.signals.on('add-document' , onDocSignal);\nscope.signals.on('remove-document', onDocSignal);\n\nInteraction.pointerMoveTolerance = 1;\nInteraction.doOnInteractions = doOnInteractions;\nInteraction.endAll = endAll;\nInteraction.signals = signals;\nInteraction.docEvents = docEvents;\n\nscope.endAllInteractions = endAll;\n\nmodule.exports = Interaction;\n","const Interaction = require('../Interaction');\nconst InteractEvent = require('../InteractEvent');\n\nconst actions = {\n firePrepared,\n names: [],\n methodDict: {},\n};\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n interaction._interacting = true;\n firePrepared(interaction, event, 'start');\n});\n\nInteraction.signals.on('action-move', function ({ interaction, event, preEnd }) {\n firePrepared(interaction, event, 'move', preEnd);\n\n // if the action was ended in a listener\n if (!interaction.interacting()) { return false; }\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n firePrepared(interaction, event, 'end');\n});\n\nfunction firePrepared (interaction, event, phase, preEnd) {\n const actionName = interaction.prepared.name;\n\n const newEvent = new InteractEvent(interaction, event, actionName, phase, interaction.element, null, preEnd);\n\n interaction.target.fire(newEvent);\n interaction.prevEvent = newEvent;\n}\n\nmodule.exports = actions;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drag = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n startAxis : 'xy',\n lockAxis : 'xy',\n },\n\n checker: function (pointer, event, interactable) {\n const dragOptions = interactable.options.drag;\n\n return dragOptions.enabled\n ? { name: 'drag', axis: (dragOptions.lockAxis === 'start'\n ? dragOptions.startAxis\n : dragOptions.lockAxis)}\n : null;\n },\n\n getCursor: function () {\n return 'move';\n },\n};\n\nInteraction.signals.on('before-action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n interaction.curCoords.page.y = interaction.startCoords.page.y;\n interaction.curCoords.client.y = interaction.startCoords.client.y;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vx);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vx);\n interaction.pointerDelta.client.vy = 0;\n interaction.pointerDelta.page.vy = 0;\n }\n else if (axis === 'y') {\n interaction.curCoords.page.x = interaction.startCoords.page.x;\n interaction.curCoords.client.x = interaction.startCoords.client.x;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vy);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vy);\n interaction.pointerDelta.client.vx = 0;\n interaction.pointerDelta.page.vx = 0;\n }\n});\n\n// dragmove\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'dragmove') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n iEvent.pageY = interaction.startCoords.page.y;\n iEvent.clientY = interaction.startCoords.client.y;\n iEvent.dy = 0;\n }\n else if (axis === 'y') {\n iEvent.pageX = interaction.startCoords.page.x;\n iEvent.clientX = interaction.startCoords.client.x;\n iEvent.dx = 0;\n }\n});\n\n/*\\\n * Interactable.draggable\n [ method ]\n *\n * Gets or sets whether drag actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of drag events\n | var isDraggable = interact('ul li').draggable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on drag events (object makes the Interactable draggable)\n = (object) This Interactable\n | interact(element).draggable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // the axis in which the first movement must be\n | // for the drag sequence to start\n | // 'xy' by default - any direction\n | startAxis: 'x' || 'y' || 'xy',\n |\n | // 'xy' by default - don't restrict to one axis (move in any direction)\n | // 'x' or 'y' to restrict movement to either axis\n | // 'start' to restrict movement to the axis the drag started in\n | lockAxis: 'x' || 'y' || 'xy' || 'start',\n |\n | // max number of drags that can happen concurrently\n | // with elements of this Interactable. Infinity by default\n | max: Infinity,\n |\n | // max number of drags that can target the same element+Interactable\n | // 1 by default\n | maxPerElement: 2\n | });\n\\*/\nInteractable.prototype.draggable = function (options) {\n if (utils.is.object(options)) {\n this.options.drag.enabled = options.enabled === false? false: true;\n this.setPerAction('drag', options);\n this.setOnEvents('drag', options);\n\n if (/^(xy|x|y|start)$/.test(options.lockAxis)) {\n this.options.drag.lockAxis = options.lockAxis;\n }\n if (/^(xy|x|y)$/.test(options.startAxis)) {\n this.options.drag.startAxis = options.startAxis;\n }\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drag.enabled = options;\n\n if (!options) {\n this.ondragstart = this.ondragstart = this.ondragend = null;\n }\n\n return this;\n }\n\n return this.options.drag;\n};\n\nactions.drag = drag;\nactions.names.push('drag');\nutils.merge(Interactable.eventTypes, [\n 'dragstart',\n 'dragmove',\n 'draginertiastart',\n 'draginertiaresume',\n 'dragend',\n]);\nactions.methodDict.drag = 'draggable';\n\ndefaultOptions.drag = drag.defaults;\n\nmodule.exports = drag;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst scope = require('../scope');\nconst interact = require('../interact');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drop = {\n defaults: {\n enabled: false,\n accept : null,\n overlap: 'pointer',\n },\n};\n\nlet dynamicDrop = false;\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // reset active dropzones\n interaction.activeDrops.dropzones = [];\n interaction.activeDrops.elements = [];\n interaction.activeDrops.rects = [];\n\n interaction.dropEvents = null;\n\n if (!interaction.dynamicDrop) {\n setActiveDrops(interaction, interaction.element);\n }\n\n const dragEvent = interaction.prevEvent;\n const dropEvents = getDropEvents(interaction, event, dragEvent);\n\n if (dropEvents.activate) {\n fireActiveDrops(interaction, dropEvents.activate);\n }\n});\n\nInteractEvent.signals.on('new', function ({ interaction, iEvent, event }) {\n if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { return; }\n\n const draggableElement = interaction.element;\n const dragEvent = iEvent;\n const dropResult = getDrop(dragEvent, event, draggableElement);\n\n interaction.dropTarget = dropResult.dropzone;\n interaction.dropElement = dropResult.element;\n\n interaction.dropEvents = getDropEvents(interaction, event, dragEvent);\n});\n\nInteraction.signals.on('action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n fireDropEvents(interaction, interaction.dropEvents);\n});\n\nInteraction.signals.on('action-end', function ({ interaction }) {\n if (interaction.prepared.name === 'drag') {\n fireDropEvents(interaction, interaction.dropEvents);\n }\n});\n\nInteraction.signals.on('stop-drag', function ({ interaction }) {\n interaction.activeDrops.dropzones =\n interaction.activeDrops.elements =\n interaction.activeDrops.rects =\n interaction.dropEvents = null;\n});\n\nfunction collectDrops (interaction, element) {\n const drops = [];\n const elements = [];\n\n element = element || interaction.element;\n\n // collect all dropzones and their elements which qualify for a drop\n for (const current of scope.interactables) {\n if (!current.options.drop.enabled) { continue; }\n\n const accept = current.options.drop.accept;\n\n // test the draggable element against the dropzone's accept setting\n if ((utils.is.element(accept) && accept !== element)\n || (utils.is.string(accept)\n && !utils.matchesSelector(element, accept))) {\n\n continue;\n }\n\n // query for new elements if necessary\n const dropElements = utils.is.string(current.target)\n ? current._context.querySelectorAll(current.target)\n : [current.target];\n\n for (let i = 0; i < dropElements.length; i++) {\n const currentElement = dropElements[i];\n\n if (currentElement !== element) {\n drops.push(current);\n elements.push(currentElement);\n }\n }\n }\n\n return {\n elements,\n dropzones: drops,\n };\n}\n\nfunction fireActiveDrops (interaction, event) {\n let prevElement;\n\n // loop through all active dropzones and trigger event\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n const current = interaction.activeDrops.dropzones[i];\n const currentElement = interaction.activeDrops.elements [i];\n\n // prevent trigger of duplicate events on same element\n if (currentElement !== prevElement) {\n // set current element as event target\n event.target = currentElement;\n current.fire(event);\n }\n prevElement = currentElement;\n }\n}\n\n// Collect a new set of possible drops and save them in activeDrops.\n// setActiveDrops should always be called when a drag has just started or a\n// drag event happens while dynamicDrop is true\nfunction setActiveDrops (interaction, dragElement) {\n // get dropzones and their elements that could receive the draggable\n const possibleDrops = collectDrops(interaction, dragElement, true);\n\n interaction.activeDrops.dropzones = possibleDrops.dropzones;\n interaction.activeDrops.elements = possibleDrops.elements;\n interaction.activeDrops.rects = [];\n\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n interaction.activeDrops.rects[i] =\n interaction.activeDrops.dropzones[i].getRect(interaction.activeDrops.elements[i]);\n }\n}\n\nfunction getDrop (dragEvent, event, dragElement) {\n const interaction = dragEvent.interaction;\n const validDrops = [];\n\n if (dynamicDrop) {\n setActiveDrops(interaction, dragElement);\n }\n\n // collect all dropzones and their elements which qualify for a drop\n for (let j = 0; j < interaction.activeDrops.dropzones.length; j++) {\n const current = interaction.activeDrops.dropzones[j];\n const currentElement = interaction.activeDrops.elements [j];\n const rect = interaction.activeDrops.rects [j];\n\n validDrops.push(current.dropCheck(dragEvent, event, interaction.target, dragElement, currentElement, rect)\n ? currentElement\n : null);\n }\n\n // get the most appropriate dropzone based on DOM depth and order\n const dropIndex = utils.indexOfDeepestElement(validDrops);\n\n return {\n dropzone: interaction.activeDrops.dropzones[dropIndex] || null,\n element : interaction.activeDrops.elements [dropIndex] || null,\n };\n}\n\nfunction getDropEvents (interaction, pointerEvent, dragEvent) {\n const dropEvents = {\n enter : null,\n leave : null,\n activate : null,\n deactivate: null,\n move : null,\n drop : null,\n };\n\n const tmpl = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n };\n\n if (interaction.dropElement !== interaction.prevDropElement) {\n // if there was a prevDropTarget, create a dragleave event\n if (interaction.prevDropTarget) {\n dropEvents.leave = utils.extend({ type: 'dragleave' }, tmpl);\n\n dragEvent.dragLeave = dropEvents.leave.target = interaction.prevDropElement;\n dragEvent.prevDropzone = dropEvents.leave.dropzone = interaction.prevDropTarget;\n }\n // if the dropTarget is not null, create a dragenter event\n if (interaction.dropTarget) {\n dropEvents.enter = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n type : 'dragenter',\n };\n\n dragEvent.dragEnter = interaction.dropElement;\n dragEvent.dropzone = interaction.dropTarget;\n }\n }\n\n if (dragEvent.type === 'dragend' && interaction.dropTarget) {\n dropEvents.drop = utils.extend({ type: 'drop' }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n dragEvent.relatedTarget = interaction.dropElement;\n }\n if (dragEvent.type === 'dragstart') {\n dropEvents.activate = utils.extend({ type: 'dropactivate' }, tmpl);\n\n dropEvents.activate.target = null;\n dropEvents.activate.dropzone = null;\n }\n if (dragEvent.type === 'dragend') {\n dropEvents.deactivate = utils.extend({ type: 'dropdeactivate' }, tmpl);\n\n dropEvents.deactivate.target = null;\n dropEvents.deactivate.dropzone = null;\n }\n if (dragEvent.type === 'dragmove' && interaction.dropTarget) {\n dropEvents.move = utils.extend({\n dragmove : dragEvent,\n type : 'dropmove',\n }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n }\n\n return dropEvents;\n}\n\nfunction fireDropEvents (interaction, dropEvents) {\n if (dropEvents.leave) { interaction.prevDropTarget.fire(dropEvents.leave); }\n if (dropEvents.move ) { interaction.dropTarget.fire(dropEvents.move ); }\n if (dropEvents.enter) { interaction.dropTarget.fire(dropEvents.enter); }\n if (dropEvents.drop ) { interaction.dropTarget.fire(dropEvents.drop ); }\n if (dropEvents.deactivate) {\n fireActiveDrops(interaction, dropEvents.deactivate);\n }\n\n interaction.prevDropTarget = interaction.dropTarget;\n interaction.prevDropElement = interaction.dropElement;\n}\n\n/*\\\n * Interactable.dropzone\n [ method ]\n *\n * Returns or sets whether elements can be dropped onto this\n * Interactable to trigger drop events\n *\n * Dropzones can receive the following events:\n * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends\n * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone\n * - `dragmove` when a draggable that has entered the dropzone is moved\n * - `drop` when a draggable is dropped into this dropzone\n *\n * Use the `accept` option to allow only elements that match the given CSS\n * selector or element. The value can be:\n *\n * - **an Element** - only that element can be dropped into this dropzone.\n * - **a string**, - the element being dragged must match it as a CSS selector.\n * - **`null`** - accept options is cleared - it accepts any element.\n *\n * Use the `overlap` option to set how drops are checked for. The allowed\n * values are:\n *\n * - `'pointer'`, the pointer must be over the dropzone (default)\n * - `'center'`, the draggable element's center must be over the dropzone\n * - a number from 0-1 which is the `(intersection area) / (draggable area)`.\n * e.g. `0.5` for drop to happen when half of the area of the draggable is\n * over the dropzone\n *\n * Use the `checker` option to specify a function to check if a dragged\n * element is over this Interactable.\n *\n | interact(target)\n | .dropChecker(function(dragEvent, // related dragmove or dragend event\n | event, // TouchEvent/PointerEvent/MouseEvent\n | dropped, // bool result of the default checker\n | dropzone, // dropzone Interactable\n | dropElement, // dropzone elemnt\n | draggable, // draggable Interactable\n | draggableElement) {// draggable element\n |\n | return dropped && event.target.hasAttribute('allow-drop');\n | }\n *\n *\n - options (boolean | object | null) #optional The new value to be set.\n | interact('.drop').dropzone({\n | accept: '.can-drop' || document.getElementById('single-drop'),\n | overlap: 'pointer' || 'center' || zeroToOne\n | }\n = (boolean | object) The current setting or this Interactable\n\\*/\nInteractable.prototype.dropzone = function (options) {\n if (utils.is.object(options)) {\n this.options.drop.enabled = options.enabled === false? false: true;\n\n if (utils.is.function(options.ondrop) ) { this.events.ondrop = options.ondrop ; }\n if (utils.is.function(options.ondropactivate) ) { this.events.ondropactivate = options.ondropactivate ; }\n if (utils.is.function(options.ondropdeactivate)) { this.events.ondropdeactivate = options.ondropdeactivate; }\n if (utils.is.function(options.ondragenter) ) { this.events.ondragenter = options.ondragenter ; }\n if (utils.is.function(options.ondragleave) ) { this.events.ondragleave = options.ondragleave ; }\n if (utils.is.function(options.ondropmove) ) { this.events.ondropmove = options.ondropmove ; }\n\n if (/^(pointer|center)$/.test(options.overlap)) {\n this.options.drop.overlap = options.overlap;\n }\n else if (utils.is.number(options.overlap)) {\n this.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0);\n }\n if ('accept' in options) {\n this.options.drop.accept = options.accept;\n }\n if ('checker' in options) {\n this.options.drop.checker = options.checker;\n }\n\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drop.enabled = options;\n\n if (!options) {\n this.ondragenter = this.ondragleave = this.ondrop\n = this.ondropactivate = this.ondropdeactivate = null;\n }\n\n return this;\n }\n\n return this.options.drop;\n};\n\nInteractable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) {\n let dropped = false;\n\n // if the dropzone has no rect (eg. display: none)\n // call the custom dropChecker or just return false\n if (!(rect = rect || this.getRect(dropElement))) {\n return (this.options.drop.checker\n ? this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement)\n : false);\n }\n\n const dropOverlap = this.options.drop.overlap;\n\n if (dropOverlap === 'pointer') {\n const origin = utils.getOriginXY(draggable, draggableElement, 'drag');\n const page = utils.getPageXY(dragEvent);\n\n page.x += origin.x;\n page.y += origin.y;\n\n const horizontal = (page.x > rect.left) && (page.x < rect.right);\n const vertical = (page.y > rect.top ) && (page.y < rect.bottom);\n\n dropped = horizontal && vertical;\n }\n\n const dragRect = draggable.getRect(draggableElement);\n\n if (dragRect && dropOverlap === 'center') {\n const cx = dragRect.left + dragRect.width / 2;\n const cy = dragRect.top + dragRect.height / 2;\n\n dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom;\n }\n\n if (dragRect && utils.is.number(dropOverlap)) {\n const overlapArea = (Math.max(0, Math.min(rect.right , dragRect.right ) - Math.max(rect.left, dragRect.left))\n * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top , dragRect.top )));\n\n const overlapRatio = overlapArea / (dragRect.width * dragRect.height);\n\n dropped = overlapRatio >= dropOverlap;\n }\n\n if (this.options.drop.checker) {\n dropped = this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement);\n }\n\n return dropped;\n};\n\nInteractable.signals.on('unset', function ({ interactable }) {\n interactable.dropzone(false);\n});\n\nInteractable.settingsMethods.push('dropChecker');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.dropTarget = null; // the dropzone a drag target might be dropped into\n interaction.dropElement = null; // the element at the time of checking\n interaction.prevDropTarget = null; // the dropzone that was recently dragged away from\n interaction.prevDropElement = null; // the element at the time of checking\n interaction.dropEvents = null; // the dropEvents related to the current drag event\n\n interaction.activeDrops = {\n dropzones: [], // the dropzones that are mentioned below\n elements : [], // elements of dropzones that accept the target draggable\n rects : [], // the rects of the elements mentioned above\n };\n\n});\n\nInteraction.signals.on('stop', function ({ interaction }) {\n interaction.dropTarget = interaction.dropElement =\n interaction.prevDropTarget = interaction.prevDropElement = null;\n});\n\n/*\\\n * interact.dynamicDrop\n [ method ]\n *\n * Returns or sets whether the dimensions of dropzone elements are\n * calculated on every dragmove or only on dragstart for the default\n * dropChecker\n *\n - newValue (boolean) #optional True to check on each move. False to check only before start\n = (boolean | interact) The current setting or interact\n\\*/\ninteract.dynamicDrop = function (newValue) {\n if (utils.is.bool(newValue)) {\n //if (dragging && dynamicDrop !== newValue && !newValue) {\n //calcRects(dropzones);\n //}\n\n dynamicDrop = newValue;\n\n return interact;\n }\n return dynamicDrop;\n};\n\nutils.merge(Interactable.eventTypes, [\n 'dragenter',\n 'dragleave',\n 'dropactivate',\n 'dropdeactivate',\n 'dropmove',\n 'drop',\n]);\nactions.methodDict.drop = 'dropzone';\n\ndefaultOptions.drop = drop.defaults;\n\nmodule.exports = drop;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst gesture = {\n defaults: {\n enabled : false,\n origin : null,\n restrict: null,\n },\n\n checker: function (pointer, event, interactable, element, interaction) {\n if (interaction.pointerIds.length >= 2) {\n return { name: 'gesture' };\n }\n\n return null;\n },\n\n getCursor: function () {\n return '';\n },\n};\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturestart') { return; }\n iEvent.ds = 0;\n\n interaction.gesture.startDistance = interaction.gesture.prevDistance = iEvent.distance;\n interaction.gesture.startAngle = interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.scale = 1;\n});\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturemove') { return; }\n\n iEvent.ds = iEvent.scale - interaction.gesture.scale;\n\n interaction.target.fire(iEvent);\n\n interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.prevDistance = iEvent.distance;\n\n if (iEvent.scale !== Infinity\n && iEvent.scale !== null\n && iEvent.scale !== undefined\n && !isNaN(iEvent.scale)) {\n\n interaction.gesture.scale = iEvent.scale;\n }\n});\n\n/*\\\n * Interactable.gesturable\n [ method ]\n *\n * Gets or sets whether multitouch gestures can be performed on the\n * Interactable's element\n *\n = (boolean) Indicates if this can be the target of gesture events\n | var isGestureable = interact(element).gesturable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on gesture events (makes the Interactable gesturable)\n = (object) this Interactable\n | interact(element).gesturable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // limit multiple gestures.\n | // See the explanation in @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n\\*/\nInteractable.prototype.gesturable = function (options) {\n if (utils.is.object(options)) {\n this.options.gesture.enabled = options.enabled === false? false: true;\n this.setPerAction('gesture', options);\n this.setOnEvents('gesture', options);\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.gesture.enabled = options;\n\n if (!options) {\n this.ongesturestart = this.ongesturestart = this.ongestureend = null;\n }\n\n return this;\n }\n\n return this.options.gesture;\n};\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action, event, starting, ending, deltaSource }) {\n if (action !== 'gesture') { return; }\n\n const pointers = interaction.pointers;\n\n iEvent.touches = [pointers[0], pointers[1]];\n\n if (starting) {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = 1;\n iEvent.ds = 0;\n iEvent.angle = utils.touchAngle(pointers, undefined, deltaSource);\n iEvent.da = 0;\n }\n else if (ending || event instanceof InteractEvent) {\n iEvent.distance = interaction.prevEvent.distance;\n iEvent.box = interaction.prevEvent.box;\n iEvent.scale = interaction.prevEvent.scale;\n iEvent.ds = iEvent.scale - 1;\n iEvent.angle = interaction.prevEvent.angle;\n iEvent.da = iEvent.angle - interaction.gesture.startAngle;\n }\n else {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = iEvent.distance / interaction.gesture.startDistance;\n iEvent.angle = utils.touchAngle(pointers, interaction.gesture.prevAngle, deltaSource);\n\n iEvent.ds = iEvent.scale - interaction.gesture.prevScale;\n iEvent.da = iEvent.angle - interaction.gesture.prevAngle;\n }\n});\n\nInteraction.signals.on('new', function (interaction) {\n interaction.gesture = {\n start: { x: 0, y: 0 },\n\n startDistance: 0, // distance between two touches of touchStart\n prevDistance : 0,\n distance : 0,\n\n scale: 1, // gesture.distance / gesture.startDistance\n\n startAngle: 0, // angle of line joining two touches\n prevAngle : 0, // angle of the previous gesture event\n };\n});\n\nactions.gesture = gesture;\nactions.names.push('gesture');\nutils.merge(Interactable.eventTypes, [\n 'gesturestart',\n 'gesturemove',\n 'gestureend',\n]);\nactions.methodDict.gesture = 'gesturable';\n\ndefaultOptions.gesture = gesture.defaults;\n\nmodule.exports = gesture;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\n// Less Precision with touch input\nconst defaultMargin = browser.supportsTouch || browser.supportsPointerEvent? 20: 10;\n\nconst resize = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n square: false,\n preserveAspectRatio: false,\n axis: 'xy',\n\n // use default margin\n margin: NaN,\n\n // object with props left, right, top, bottom which are\n // true/false values to resize when the pointer is over that edge,\n // CSS selectors to match the handles for each direction\n // or the Elements for each handle\n edges: null,\n\n // a value of 'none' will limit the resize rect to a minimum of 0x0\n // 'negate' will alow the rect to have negative width/height\n // 'reposition' will keep the width/height positive by swapping\n // the top and bottom edges and/or swapping the left and right edges\n invert: 'none',\n },\n\n checker: function (pointer, event, interactable, element, interaction, rect) {\n if (!rect) { return null; }\n\n const page = utils.extend({}, interaction.curCoords.page);\n const options = interactable.options;\n\n if (options.resize.enabled) {\n const resizeOptions = options.resize;\n const resizeEdges = { left: false, right: false, top: false, bottom: false };\n\n // if using resize.edges\n if (utils.is.object(resizeOptions.edges)) {\n for (const edge in resizeEdges) {\n resizeEdges[edge] = checkResizeEdge(edge,\n resizeOptions.edges[edge],\n page,\n interaction._eventTarget,\n element,\n rect,\n resizeOptions.margin || defaultMargin);\n }\n\n resizeEdges.left = resizeEdges.left && !resizeEdges.right;\n resizeEdges.top = resizeEdges.top && !resizeEdges.bottom;\n\n if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) {\n return {\n name: 'resize',\n edges: resizeEdges,\n };\n }\n }\n else {\n const right = options.resize.axis !== 'y' && page.x > (rect.right - defaultMargin);\n const bottom = options.resize.axis !== 'x' && page.y > (rect.bottom - defaultMargin);\n\n if (right || bottom) {\n return {\n name: 'resize',\n axes: (right? 'x' : '') + (bottom? 'y' : ''),\n };\n }\n }\n }\n\n return null;\n },\n\n cursors: (browser.isIe9OrOlder ? {\n x : 'e-resize',\n y : 's-resize',\n xy: 'se-resize',\n\n top : 'n-resize',\n left : 'w-resize',\n bottom : 's-resize',\n right : 'e-resize',\n topleft : 'se-resize',\n bottomright: 'se-resize',\n topright : 'ne-resize',\n bottomleft : 'ne-resize',\n } : {\n x : 'ew-resize',\n y : 'ns-resize',\n xy: 'nwse-resize',\n\n top : 'ns-resize',\n left : 'ew-resize',\n bottom : 'ns-resize',\n right : 'ew-resize',\n topleft : 'nwse-resize',\n bottomright: 'nwse-resize',\n topright : 'nesw-resize',\n bottomleft : 'nesw-resize',\n }),\n\n getCursor: function (action) {\n if (action.axis) {\n return resize.cursors[action.name + action.axis];\n }\n else if (action.edges) {\n let cursorKey = '';\n const edgeNames = ['top', 'bottom', 'left', 'right'];\n\n for (let i = 0; i < 4; i++) {\n if (action.edges[edgeNames[i]]) {\n cursorKey += edgeNames[i];\n }\n }\n\n return resize.cursors[cursorKey];\n }\n },\n};\n\n// resizestart\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'resizestart' || !interaction.prepared.edges) {\n return;\n }\n\n const startRect = interaction.target.getRect(interaction.element);\n const resizeOptions = interaction.target.options.resize;\n\n /*\n * When using the `resizable.square` or `resizable.preserveAspectRatio` options, resizing from one edge\n * will affect another. E.g. with `resizable.square`, resizing to make the right edge larger will make\n * the bottom edge larger by the same amount. We call these 'linked' edges. Any linked edges will depend\n * on the active edges and the edge being interacted with.\n */\n if (resizeOptions.square || resizeOptions.preserveAspectRatio) {\n const linkedEdges = utils.extend({}, interaction.prepared.edges);\n\n linkedEdges.top = linkedEdges.top || (linkedEdges.left && !linkedEdges.bottom);\n linkedEdges.left = linkedEdges.left || (linkedEdges.top && !linkedEdges.right );\n linkedEdges.bottom = linkedEdges.bottom || (linkedEdges.right && !linkedEdges.top );\n linkedEdges.right = linkedEdges.right || (linkedEdges.bottom && !linkedEdges.left );\n\n interaction.prepared._linkedEdges = linkedEdges;\n }\n else {\n interaction.prepared._linkedEdges = null;\n }\n\n // if using `resizable.preserveAspectRatio` option, record aspect ratio at the start of the resize\n if (resizeOptions.preserveAspectRatio) {\n interaction.resizeStartAspectRatio = startRect.width / startRect.height;\n }\n\n interaction.resizeRects = {\n start : startRect,\n current : utils.extend({}, startRect),\n inverted : utils.extend({}, startRect),\n previous : utils.extend({}, startRect),\n delta : {\n left: 0, right : 0, width : 0,\n top : 0, bottom: 0, height: 0,\n },\n };\n\n iEvent.rect = interaction.resizeRects.inverted;\n iEvent.deltaRect = interaction.resizeRects.delta;\n});\n\n// resizemove\nInteractEvent.signals.on('new', function ({ iEvent, phase, interaction }) {\n if (phase !== 'move' || !interaction.prepared.edges) { return; }\n\n const resizeOptions = interaction.target.options.resize;\n const invert = resizeOptions.invert;\n const invertible = invert === 'reposition' || invert === 'negate';\n\n let edges = interaction.prepared.edges;\n\n const start = interaction.resizeRects.start;\n const current = interaction.resizeRects.current;\n const inverted = interaction.resizeRects.inverted;\n const delta = interaction.resizeRects.delta;\n const previous = utils.extend(interaction.resizeRects.previous, inverted);\n const originalEdges = edges;\n\n let dx = iEvent.dx;\n let dy = iEvent.dy;\n\n if (resizeOptions.preserveAspectRatio || resizeOptions.square) {\n // `resize.preserveAspectRatio` takes precedence over `resize.square`\n const startAspectRatio = resizeOptions.preserveAspectRatio\n ? interaction.resizeStartAspectRatio\n : 1;\n\n edges = interaction.prepared._linkedEdges;\n\n if ((originalEdges.left && originalEdges.bottom)\n || (originalEdges.right && originalEdges.top)) {\n dy = -dx / startAspectRatio;\n }\n else if (originalEdges.left || originalEdges.right ) { dy = dx / startAspectRatio; }\n else if (originalEdges.top || originalEdges.bottom) { dx = dy * startAspectRatio; }\n }\n\n // update the 'current' rect without modifications\n if (edges.top ) { current.top += dy; }\n if (edges.bottom) { current.bottom += dy; }\n if (edges.left ) { current.left += dx; }\n if (edges.right ) { current.right += dx; }\n\n if (invertible) {\n // if invertible, copy the current rect\n utils.extend(inverted, current);\n\n if (invert === 'reposition') {\n // swap edge values if necessary to keep width/height positive\n let swap;\n\n if (inverted.top > inverted.bottom) {\n swap = inverted.top;\n\n inverted.top = inverted.bottom;\n inverted.bottom = swap;\n }\n if (inverted.left > inverted.right) {\n swap = inverted.left;\n\n inverted.left = inverted.right;\n inverted.right = swap;\n }\n }\n }\n else {\n // if not invertible, restrict to minimum of 0x0 rect\n inverted.top = Math.min(current.top, start.bottom);\n inverted.bottom = Math.max(current.bottom, start.top);\n inverted.left = Math.min(current.left, start.right);\n inverted.right = Math.max(current.right, start.left);\n }\n\n inverted.width = inverted.right - inverted.left;\n inverted.height = inverted.bottom - inverted.top ;\n\n for (const edge in inverted) {\n delta[edge] = inverted[edge] - previous[edge];\n }\n\n iEvent.edges = interaction.prepared.edges;\n iEvent.rect = inverted;\n iEvent.deltaRect = delta;\n});\n\n/*\\\n * Interactable.resizable\n [ method ]\n *\n * Gets or sets whether resize actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of resize elements\n | var isResizeable = interact('input[type=text]').resizable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on resize events (object makes the Interactable resizable)\n = (object) This Interactable\n | interact(element).resizable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | edges: {\n | top : true, // Use pointer coords to check for resize.\n | left : false, // Disable resizing from left edge.\n | bottom: '.resize-s',// Resize if pointer target matches selector\n | right : handleEl // Resize if pointer target is the given Element\n | },\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height are adjusted at a 1:1 ratio.\n | square: false,\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height maintain the aspect ratio they had when resizing started.\n | preserveAspectRatio: false,\n |\n | // a value of 'none' will limit the resize rect to a minimum of 0x0\n | // 'negate' will allow the rect to have negative width/height\n | // 'reposition' will keep the width/height positive by swapping\n | // the top and bottom edges and/or swapping the left and right edges\n | invert: 'none' || 'negate' || 'reposition'\n |\n | // limit multiple resizes.\n | // See the explanation in the @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n \\*/\nInteractable.prototype.resizable = function (options) {\n if (utils.is.object(options)) {\n this.options.resize.enabled = options.enabled === false? false: true;\n this.setPerAction('resize', options);\n this.setOnEvents('resize', options);\n\n if (/^x$|^y$|^xy$/.test(options.axis)) {\n this.options.resize.axis = options.axis;\n }\n else if (options.axis === null) {\n this.options.resize.axis = defaultOptions.resize.axis;\n }\n\n if (utils.is.bool(options.preserveAspectRatio)) {\n this.options.resize.preserveAspectRatio = options.preserveAspectRatio;\n }\n else if (utils.is.bool(options.square)) {\n this.options.resize.square = options.square;\n }\n\n return this;\n }\n if (utils.is.bool(options)) {\n this.options.resize.enabled = options;\n\n if (!options) {\n this.onresizestart = this.onresizestart = this.onresizeend = null;\n }\n\n return this;\n }\n return this.options.resize;\n};\n\nfunction checkResizeEdge (name, value, page, element, interactableElement, rect, margin) {\n // false, '', undefined, null\n if (!value) { return false; }\n\n // true value, use pointer coords and element rect\n if (value === true) {\n // if dimensions are negative, \"switch\" edges\n const width = utils.is.number(rect.width )? rect.width : rect.right - rect.left;\n const height = utils.is.number(rect.height)? rect.height : rect.bottom - rect.top ;\n\n if (width < 0) {\n if (name === 'left' ) { name = 'right'; }\n else if (name === 'right') { name = 'left' ; }\n }\n if (height < 0) {\n if (name === 'top' ) { name = 'bottom'; }\n else if (name === 'bottom') { name = 'top' ; }\n }\n\n if (name === 'left' ) { return page.x < ((width >= 0? rect.left: rect.right ) + margin); }\n if (name === 'top' ) { return page.y < ((height >= 0? rect.top : rect.bottom) + margin); }\n\n if (name === 'right' ) { return page.x > ((width >= 0? rect.right : rect.left) - margin); }\n if (name === 'bottom') { return page.y > ((height >= 0? rect.bottom: rect.top ) - margin); }\n }\n\n // the remaining checks require an element\n if (!utils.is.element(element)) { return false; }\n\n return utils.is.element(value)\n // the value is an element to use as a resize handle\n ? value === element\n // otherwise check if element matches value as selector\n : utils.matchesUpTo(element, value, interactableElement);\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.resizeAxes = 'xy';\n});\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action }) {\n if (action !== 'resize' || !interaction.resizeAxes) { return; }\n\n const options = interaction.target.options;\n\n if (options.resize.square) {\n if (interaction.resizeAxes === 'y') {\n iEvent.dx = iEvent.dy;\n }\n else {\n iEvent.dy = iEvent.dx;\n }\n iEvent.axes = 'xy';\n }\n else {\n iEvent.axes = interaction.resizeAxes;\n\n if (interaction.resizeAxes === 'x') {\n iEvent.dy = 0;\n }\n else if (interaction.resizeAxes === 'y') {\n iEvent.dx = 0;\n }\n }\n});\n\nactions.resize = resize;\nactions.names.push('resize');\nutils.merge(Interactable.eventTypes, [\n 'resizestart',\n 'resizemove',\n 'resizeinertiastart',\n 'resizeinertiaresume',\n 'resizeend',\n]);\nactions.methodDict.resize = 'resizable';\n\ndefaultOptions.resize = resize.defaults;\n\nmodule.exports = resize;\n","const raf = require('./utils/raf');\nconst getWindow = require('./utils/window').getWindow;\nconst is = require('./utils/is');\nconst domUtils = require('./utils/domUtils');\nconst Interaction = require('./Interaction');\nconst defaultOptions = require('./defaultOptions');\n\nconst autoScroll = {\n defaults: {\n enabled : false,\n container: null, // the item that is scrolled (Window or HTMLElement)\n margin : 60,\n speed : 300, // the scroll speed in pixels per second\n },\n\n interaction: null,\n i: null, // the handle returned by window.setInterval\n x: 0, y: 0, // Direction each pulse is to scroll in\n\n isScrolling: false,\n prevTime: 0,\n\n start: function (interaction) {\n autoScroll.isScrolling = true;\n raf.cancel(autoScroll.i);\n\n autoScroll.interaction = interaction;\n autoScroll.prevTime = new Date().getTime();\n autoScroll.i = raf.request(autoScroll.scroll);\n },\n\n stop: function () {\n autoScroll.isScrolling = false;\n raf.cancel(autoScroll.i);\n },\n\n // scroll the window by the values in scroll.x/y\n scroll: function () {\n const options = autoScroll.interaction.target.options[autoScroll.interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(autoScroll.interaction.element);\n const now = new Date().getTime();\n // change in time in seconds\n const dt = (now - autoScroll.prevTime) / 1000;\n // displacement\n const s = options.speed * dt;\n\n if (s >= 1) {\n if (is.window(container)) {\n container.scrollBy(autoScroll.x * s, autoScroll.y * s);\n }\n else if (container) {\n container.scrollLeft += autoScroll.x * s;\n container.scrollTop += autoScroll.y * s;\n }\n\n autoScroll.prevTime = now;\n }\n\n if (autoScroll.isScrolling) {\n raf.cancel(autoScroll.i);\n autoScroll.i = raf.request(autoScroll.scroll);\n }\n },\n check: function (interactable, actionName) {\n const options = interactable.options;\n\n return options[actionName].autoScroll && options[actionName].autoScroll.enabled;\n },\n onInteractionMove: function ({ interaction, pointer }) {\n if (!(interaction.interacting()\n && autoScroll.check(interaction.target, interaction.prepared.name))) {\n return;\n }\n\n if (interaction.simulation) {\n autoScroll.x = autoScroll.y = 0;\n return;\n }\n\n let top;\n let right;\n let bottom;\n let left;\n\n const options = interaction.target.options[interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(interaction.element);\n\n if (is.window(container)) {\n left = pointer.clientX < autoScroll.margin;\n top = pointer.clientY < autoScroll.margin;\n right = pointer.clientX > container.innerWidth - autoScroll.margin;\n bottom = pointer.clientY > container.innerHeight - autoScroll.margin;\n }\n else {\n const rect = domUtils.getElementClientRect(container);\n\n left = pointer.clientX < rect.left + autoScroll.margin;\n top = pointer.clientY < rect.top + autoScroll.margin;\n right = pointer.clientX > rect.right - autoScroll.margin;\n bottom = pointer.clientY > rect.bottom - autoScroll.margin;\n }\n\n autoScroll.x = (right ? 1: left? -1: 0);\n autoScroll.y = (bottom? 1: top? -1: 0);\n\n if (!autoScroll.isScrolling) {\n // set the autoScroll properties to those of the target\n autoScroll.margin = options.margin;\n autoScroll.speed = options.speed;\n\n autoScroll.start(interaction);\n }\n },\n};\n\nInteraction.signals.on('stop-active', function () {\n autoScroll.stop();\n});\n\nInteraction.signals.on('action-move', autoScroll.onInteractionMove);\n\ndefaultOptions.perAction.autoScroll = autoScroll.defaults;\n\nmodule.exports = autoScroll;\n","const Interactable = require('../Interactable');\nconst actions = require('../actions/base');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.ignoreFrom\n [ method ]\n *\n * If the target of the `mousedown`, `pointerdown` or `touchstart`\n * event or any of it's parents match the given CSS selector or\n * Element, no drag/resize/gesture is started.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to not ignore any elements\n = (string | Element | object) The current ignoreFrom value or this Interactable\n **\n | interact(element, { ignoreFrom: document.getElementById('no-action') });\n | // or\n | interact(element).ignoreFrom('input, textarea, a');\n\\*/\nInteractable.prototype.ignoreFrom = function (newValue) {\n return this._backCompatOption('ignoreFrom', newValue);\n};\n\n/*\\\n * Interactable.allowFrom\n [ method ]\n *\n * A drag/resize/gesture is started only If the target of the\n * `mousedown`, `pointerdown` or `touchstart` event or any of it's\n * parents match the given CSS selector or Element.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to allow from any element\n = (string | Element | object) The current allowFrom value or this Interactable\n **\n | interact(element, { allowFrom: document.getElementById('drag-handle') });\n | // or\n | interact(element).allowFrom('.handle');\n\\*/\nInteractable.prototype.allowFrom = function (newValue) {\n return this._backCompatOption('allowFrom', newValue);\n};\n\nInteractable.prototype.testIgnore = function (ignoreFrom, interactableElement, element) {\n if (!ignoreFrom || !is.element(element)) { return false; }\n\n if (is.string(ignoreFrom)) {\n return domUtils.matchesUpTo(element, ignoreFrom, interactableElement);\n }\n else if (is.element(ignoreFrom)) {\n return domUtils.nodeContains(ignoreFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testAllow = function (allowFrom, interactableElement, element) {\n if (!allowFrom) { return true; }\n\n if (!is.element(element)) { return false; }\n\n if (is.string(allowFrom)) {\n return domUtils.matchesUpTo(element, allowFrom, interactableElement);\n }\n else if (is.element(allowFrom)) {\n return domUtils.nodeContains(allowFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testIgnoreAllow = function (options, interactableElement, eventTarget) {\n return (!this.testIgnore(options.ignoreFrom, interactableElement, eventTarget)\n && this.testAllow(options.allowFrom, interactableElement, eventTarget));\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (event.buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\n","const interact = require('../interact');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst actions = require('../actions/base');\nconst defaultOptions = require('../defaultOptions');\nconst browser = require('../utils/browser');\nconst scope = require('../scope');\nconst utils = require('../utils');\nconst signals = require('../utils/Signals').new();\n\nrequire('./InteractableMethods');\n\nconst autoStart = {\n signals,\n withinInteractionLimit,\n // Allow this many interactions to happen simultaneously\n maxInteractions: Infinity,\n defaults: {\n perAction: {\n manualStart: false,\n max: Infinity,\n maxPerElement: 1,\n allowFrom: null,\n ignoreFrom: null,\n },\n },\n setActionDefaults: function (action) {\n utils.extend(action.defaults, autoStart.defaults.perAction);\n },\n};\n\n// set cursor style on mousedown\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget }) {\n if (interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\n// set cursor style on mousemove\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget }) {\n if (!interaction.mouse\n || interaction.pointerIsDown\n || interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\nInteraction.signals.on('move', function (arg) {\n const { interaction, event } = arg;\n\n if (!interaction.pointerIsDown\n || interaction.interacting()\n || !interaction.pointerWasMoved\n || !interaction.prepared.name) {\n return;\n }\n\n signals.fire('before-start', arg);\n\n const target = interaction.target;\n\n if (interaction.prepared.name && target) {\n // check manualStart and interaction limit\n if (target.options[interaction.prepared.name].manualStart\n || !withinInteractionLimit(target, interaction.element, interaction.prepared)) {\n interaction.stop(event);\n }\n else {\n interaction.start(interaction.prepared, target, interaction.element);\n }\n }\n});\n\n// Check if the current target supports the action.\n// If so, return the validated action. Otherwise, return null\nfunction validateAction (action, interactable, element, eventTarget) {\n if (utils.is.object(action)\n && interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget)\n && interactable.options[action.name].enabled\n && withinInteractionLimit(interactable, element, action)) {\n return action;\n }\n\n return null;\n}\n\nfunction validateSelector (interaction, pointer, event, matches, matchElements, eventTarget) {\n for (let i = 0, len = matches.length; i < len; i++) {\n const match = matches[i];\n const matchElement = matchElements[i];\n const action = validateAction(match.getAction(pointer, event, interaction, matchElement),\n match,\n matchElement,\n eventTarget);\n\n if (action) {\n return {\n action,\n target: match,\n element: matchElement,\n };\n }\n }\n\n return {};\n}\n\nfunction getActionInfo (interaction, pointer, event, eventTarget) {\n let matches = [];\n let matchElements = [];\n\n let element = eventTarget;\n let action = null;\n\n function pushMatches (interactable, selector, context) {\n const elements = (browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined);\n\n if (utils.matchesSelector(element, selector, elements)) {\n\n matches.push(interactable);\n matchElements.push(element);\n }\n }\n\n while (utils.is.element(element)) {\n matches = [];\n matchElements = [];\n\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && (action = validateAction(elementInteractable.getAction(pointer, event, interaction, element, eventTarget),\n elementInteractable,\n element,\n eventTarget))\n && !elementInteractable.options[action.name].manualStart) {\n return {\n element,\n action,\n target: elementInteractable,\n };\n }\n else {\n scope.interactables.forEachSelector(pushMatches, element);\n\n const actionInfo = validateSelector(interaction, pointer, event, matches, matchElements, eventTarget);\n\n if (actionInfo.action\n && !actionInfo.target.options[actionInfo.action.name].manualStart) {\n return actionInfo;\n }\n }\n\n element = utils.parentNode(element);\n }\n\n return {};\n}\n\nfunction prepare (interaction, { action, target, element }) {\n action = action || {};\n\n if (interaction.target && interaction.target.options.styleCursor) {\n interaction.target._doc.documentElement.style.cursor = '';\n }\n\n interaction.target = target;\n interaction.element = element;\n utils.copyAction(interaction.prepared, action);\n\n if (target && target.options.styleCursor) {\n const cursor = action? actions[action.name].getCursor(action) : '';\n interaction.target._doc.documentElement.style.cursor = cursor;\n }\n\n signals.fire('prepared', { interaction: interaction });\n}\n\nInteraction.signals.on('stop', function ({ interaction }) {\n const target = interaction.target;\n\n if (target && target.options.styleCursor) {\n target._doc.documentElement.style.cursor = '';\n }\n});\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (utils.is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (utils.is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n const buttons = event.buttons || ({\n 0: 1,\n 1: 4,\n 3: 8,\n 4: 16,\n })[event.button];\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\nfunction withinInteractionLimit (interactable, element, action) {\n const options = interactable.options;\n const maxActions = options[action.name].max;\n const maxPerElement = options[action.name].maxPerElement;\n let activeInteractions = 0;\n let targetCount = 0;\n let targetElementCount = 0;\n\n // no actions if any of these values == 0\n if (!(maxActions && maxPerElement && autoStart.maxInteractions)) { return; }\n\n for (let i = 0, len = scope.interactions.length; i < len; i++) {\n const interaction = scope.interactions[i];\n const otherAction = interaction.prepared.name;\n\n if (!interaction.interacting()) { continue; }\n\n activeInteractions++;\n\n if (activeInteractions >= autoStart.maxInteractions) {\n return false;\n }\n\n if (interaction.target !== interactable) { continue; }\n\n targetCount += (otherAction === action.name)|0;\n\n if (targetCount >= maxActions) {\n return false;\n }\n\n if (interaction.element === element) {\n targetElementCount++;\n\n if (otherAction !== action.name || targetElementCount >= maxPerElement) {\n return false;\n }\n }\n }\n\n return autoStart.maxInteractions > 0;\n}\n\n/*\\\n * interact.maxInteractions\n [ method ]\n **\n * Returns or sets the maximum number of concurrent interactions allowed.\n * By default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables\n * and elements, you need to enable it in the draggable, resizable and\n * gesturable `'max'` and `'maxPerElement'` options.\n **\n - newValue (number) #optional Any number. newValue <= 0 means no interactions.\n\\*/\ninteract.maxInteractions = function (newValue) {\n if (utils.is.number(newValue)) {\n autoStart.maxInteractions = newValue;\n\n return this;\n }\n\n return autoStart.maxInteractions;\n};\n\nInteractable.settingsMethods.push('styleCursor');\nInteractable.settingsMethods.push('actionChecker');\nInteractable.settingsMethods.push('ignoreFrom');\nInteractable.settingsMethods.push('allowFrom');\n\ndefaultOptions.base.actionChecker = null;\ndefaultOptions.base.styleCursor = true;\n\nutils.extend(defaultOptions.perAction, autoStart.defaults.perAction);\n\nmodule.exports = autoStart;\n","const autoStart = require('./base');\nconst Interaction = require('../Interaction');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.delayTimer = null;\n});\n\nautoStart.signals.on('prepared', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.delayTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.target, interaction.element);\n }, delay);\n }\n});\n\nInteraction.signals.on('move', function ({ interaction, duplicate }) {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.delayTimer);\n }\n});\n\n// prevent regular down->move autoStart\nautoStart.signals.on('before-start', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.prepared.name = null;\n }\n});\n","const autoStart = require('./base');\nconst scope = require('../scope');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\n\nconst { matchesSelector, parentNode } = require('../utils/domUtils');\n\nautoStart.setActionDefaults(require('../actions/drag'));\n\nautoStart.signals.on('before-start', function ({ interaction, eventTarget, dx, dy }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // check if a drag is in the correct axis\n const absX = Math.abs(dx);\n const absY = Math.abs(dy);\n const options = interaction.target.options.drag;\n const startAxis = options.startAxis;\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy');\n\n interaction.prepared.axis = options.lockAxis === 'start'\n ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n : options.lockAxis;\n\n // if the movement isn't in the startAxis of the interactable\n if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) {\n // cancel the prepared action\n interaction.prepared.name = null;\n\n // then try to get a drag from another ineractable\n\n if (!interaction.prepared.name) {\n\n let element = eventTarget;\n\n const getDraggable = function (interactable, selector, context) {\n const elements = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n if (interactable === interaction.target) { return; }\n\n if (!options.manualStart\n && !interactable.testIgnoreAllow(options, element, eventTarget)\n && matchesSelector(element, selector, elements)) {\n\n const action = interactable.getAction(interaction.downPointer,\n interaction.downEvent,\n interaction,\n element);\n\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, interactable)\n && autoStart.validateAction(action, interactable, element, eventTarget)) {\n\n return interactable;\n }\n }\n };\n\n let action = null;\n\n // check all interactables\n while (is.element(element)) {\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && elementInteractable !== interaction.target\n && !elementInteractable.options.drag.manualStart) {\n\n action = elementInteractable.getAction(interaction.downPointer, interaction.downEvent, interaction, element);\n }\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, elementInteractable)) {\n\n interaction.prepared.name = 'drag';\n interaction.target = elementInteractable;\n interaction.element = element;\n break;\n }\n\n const selectorInteractable = scope.interactables.forEachSelector(getDraggable, element);\n\n if (selectorInteractable) {\n interaction.prepared.name = 'drag';\n interaction.target = selectorInteractable;\n interaction.element = element;\n break;\n }\n\n element = parentNode(element);\n }\n }\n }\n});\n\nfunction checkStartAxis (startAxis, interactable) {\n if (!interactable) { return false; }\n\n const thisAxis = interactable.options.drag.startAxis;\n\n return (startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis);\n}\n","require('./base').setActionDefaults(require('../actions/gesture'));\n","require('./base').setActionDefaults(require('../actions/resize'));\n","module.exports = {\n base: {\n accept : null,\n preventDefault: 'auto',\n deltaSource : 'page',\n },\n\n perAction: {\n origin: { x: 0, y: 0 },\n\n // only allow left button by default\n // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n mouseButtons: 1,\n\n inertia: {\n enabled : false,\n resistance : 10, // the lambda in exponential decay\n minSpeed : 100, // target speed must be above this for inertia to start\n endSpeed : 10, // the speed at which inertia is slow enough to stop\n allowResume : true, // allow resuming an action in inertia phase\n smoothEndDuration: 300, // animate to snap/restrict endOnly if there's no inertia\n },\n },\n};\n","/* browser entry point */\n\n// Legacy browser support\nrequire('./legacyBrowsers');\n\n// inertia\nrequire('./inertia');\n\n// modifiers\nrequire('./modifiers/snap');\nrequire('./modifiers/restrict');\n\n// pointerEvents\nrequire('./pointerEvents/base');\nrequire('./pointerEvents/holdRepeat');\nrequire('./pointerEvents/interactableTargets');\n\n// delay\nrequire('./autoStart/delay');\n\n// actions\nrequire('./actions/gesture');\nrequire('./actions/resize');\nrequire('./actions/drag');\nrequire('./actions/drop');\n\n// load these modifiers after resize is loaded\nrequire('./modifiers/snapSize');\nrequire('./modifiers/restrictEdges');\nrequire('./modifiers/restrictSize');\n\n// autoStart actions\nrequire('./autoStart/gesture');\nrequire('./autoStart/resize');\nrequire('./autoStart/drag');\n\n// Interactable preventDefault setting\nrequire('./interactablePreventDefault.js');\n\n// autoScroll\nrequire('./autoScroll');\n\n// export interact\nmodule.exports = require('./interact');\n","const InteractEvent = require('./InteractEvent');\nconst Interaction = require('./Interaction');\nconst modifiers = require('./modifiers');\nconst utils = require('./utils');\nconst animationFrame = require('./utils/raf');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.inertiaStatus = {\n active : false,\n smoothEnd : false,\n allowResume: false,\n\n startEvent: null,\n upCoords : {},\n\n xe: 0, ye: 0,\n sx: 0, sy: 0,\n\n t0: 0,\n vx0: 0, vys: 0,\n duration: 0,\n\n lambda_v0: 0,\n one_ve_v0: 0,\n i : null,\n };\n\n interaction.boundInertiaFrame = () => inertiaFrame .apply(interaction);\n interaction.boundSmoothEndFrame = () => smoothEndFrame.apply(interaction);\n});\n\nInteraction.signals.on('down', function ({ interaction, event, pointer, eventTarget }) {\n const status = interaction.inertiaStatus;\n\n // Check if the down event hits the current inertia target\n if (status.active) {\n let element = eventTarget;\n\n // climb up the DOM tree from the event target\n while (utils.is.element(element)) {\n\n // if interaction element is the current inertia target element\n if (element === interaction.element) {\n // stop inertia\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n\n // update pointers to the down event's coordinates\n interaction.updatePointer(pointer);\n utils.setCoords(interaction.curCoords, interaction.pointers);\n\n // fire appropriate signals\n const signalArg = { interaction };\n Interaction.signals.fire('before-action-move', signalArg);\n Interaction.signals.fire('action-resume' , signalArg);\n\n // fire a reume event\n const resumeEvent = new InteractEvent(interaction,\n event,\n interaction.prepared.name,\n 'inertiaresume',\n interaction.element);\n\n interaction.target.fire(resumeEvent);\n interaction.prevEvent = resumeEvent;\n modifiers.resetStatuses(interaction.modifierStatuses);\n\n utils.copyCoords(interaction.prevCoords, interaction.curCoords);\n break;\n }\n\n element = utils.parentNode(element);\n }\n }\n});\n\nInteraction.signals.on('up', function ({ interaction, event }) {\n const status = interaction.inertiaStatus;\n\n if (!interaction.interacting() || status.active) { return; }\n\n const target = interaction.target;\n const options = target && target.options;\n const inertiaOptions = options && interaction.prepared.name && options[interaction.prepared.name].inertia;\n\n const now = new Date().getTime();\n const statuses = {};\n const page = utils.extend({}, interaction.curCoords.page);\n const pointerSpeed = interaction.pointerDelta.client.speed;\n\n let smoothEnd = false;\n let modifierResult;\n\n // check if inertia should be started\n const inertiaPossible = (inertiaOptions && inertiaOptions.enabled\n && interaction.prepared.name !== 'gesture'\n && event !== status.startEvent);\n\n const inertia = (inertiaPossible\n && (now - interaction.curCoords.timeStamp) < 50\n && pointerSpeed > inertiaOptions.minSpeed\n && pointerSpeed > inertiaOptions.endSpeed);\n\n const modifierArg = {\n interaction,\n pageCoords: page,\n statuses,\n preEnd: true,\n requireEndOnly: true,\n };\n\n // smoothEnd\n if (inertiaPossible && !inertia) {\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n if (modifierResult.shouldMove && modifierResult.locked) {\n smoothEnd = true;\n }\n }\n\n if (!(inertia || smoothEnd)) { return; }\n\n utils.copyCoords(status.upCoords, interaction.curCoords);\n\n interaction.pointers[0] = status.startEvent =\n new InteractEvent(interaction, event, interaction.prepared.name, 'inertiastart', interaction.element);\n\n status.t0 = now;\n\n status.active = true;\n status.allowResume = inertiaOptions.allowResume;\n interaction.simulation = status;\n\n target.fire(status.startEvent);\n\n if (inertia) {\n status.vx0 = interaction.pointerDelta.client.vx;\n status.vy0 = interaction.pointerDelta.client.vy;\n status.v0 = pointerSpeed;\n\n calcInertia(interaction, status);\n\n utils.extend(page, interaction.curCoords.page);\n\n page.x += status.xe;\n page.y += status.ye;\n\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n status.modifiedXe += modifierResult.dx;\n status.modifiedYe += modifierResult.dy;\n\n status.i = animationFrame.request(interaction.boundInertiaFrame);\n }\n else {\n status.smoothEnd = true;\n status.xe = modifierResult.dx;\n status.ye = modifierResult.dy;\n\n status.sx = status.sy = 0;\n\n status.i = animationFrame.request(interaction.boundSmoothEndFrame);\n }\n});\n\nInteraction.signals.on('stop-active', function ({ interaction }) {\n const status = interaction.inertiaStatus;\n\n if (status.active) {\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n }\n});\n\nfunction calcInertia (interaction, status) {\n const inertiaOptions = interaction.target.options[interaction.prepared.name].inertia;\n const lambda = inertiaOptions.resistance;\n const inertiaDur = -Math.log(inertiaOptions.endSpeed / status.v0) / lambda;\n\n status.x0 = interaction.prevEvent.pageX;\n status.y0 = interaction.prevEvent.pageY;\n status.t0 = status.startEvent.timeStamp / 1000;\n status.sx = status.sy = 0;\n\n status.modifiedXe = status.xe = (status.vx0 - inertiaDur) / lambda;\n status.modifiedYe = status.ye = (status.vy0 - inertiaDur) / lambda;\n status.te = inertiaDur;\n\n status.lambda_v0 = lambda / status.v0;\n status.one_ve_v0 = 1 - inertiaOptions.endSpeed / status.v0;\n}\n\nfunction inertiaFrame () {\n updateInertiaCoords(this);\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n\n const status = this.inertiaStatus;\n const options = this.target.options[this.prepared.name].inertia;\n const lambda = options.resistance;\n const t = new Date().getTime() / 1000 - status.t0;\n\n if (t < status.te) {\n\n const progress = 1 - (Math.exp(-lambda * t) - status.lambda_v0) / status.one_ve_v0;\n\n if (status.modifiedXe === status.xe && status.modifiedYe === status.ye) {\n status.sx = status.xe * progress;\n status.sy = status.ye * progress;\n }\n else {\n const quadPoint = utils.getQuadraticCurvePoint(0, 0,\n status.xe,\n status.ye,\n status.modifiedXe,\n status.modifiedYe,\n progress);\n\n status.sx = quadPoint.x;\n status.sy = quadPoint.y;\n }\n\n this.doMove();\n\n status.i = animationFrame.request(this.boundInertiaFrame);\n }\n else {\n status.sx = status.modifiedXe;\n status.sy = status.modifiedYe;\n\n this.doMove();\n this.end(status.startEvent);\n status.active = false;\n this.simulation = null;\n }\n\n utils.copyCoords(this.prevCoords, this.curCoords);\n}\n\nfunction smoothEndFrame () {\n updateInertiaCoords(this);\n\n const status = this.inertiaStatus;\n const t = new Date().getTime() - status.t0;\n const duration = this.target.options[this.prepared.name].inertia.smoothEndDuration;\n\n if (t < duration) {\n status.sx = utils.easeOutQuad(t, 0, status.xe, duration);\n status.sy = utils.easeOutQuad(t, 0, status.ye, duration);\n\n this.pointerMove(status.startEvent, status.startEvent);\n\n status.i = animationFrame.request(this.boundSmoothEndFrame);\n }\n else {\n status.sx = status.xe;\n status.sy = status.ye;\n\n this.pointerMove(status.startEvent, status.startEvent);\n this.end(status.startEvent);\n\n status.smoothEnd =\n status.active = false;\n this.simulation = null;\n }\n}\n\nfunction updateInertiaCoords (interaction) {\n const status = interaction.inertiaStatus;\n\n // return if inertia isn't running\n if (!status.active) { return; }\n\n const pageUp = status.upCoords.page;\n const clientUp = status.upCoords.client;\n\n utils.setCoords(interaction.curCoords, [ {\n pageX : pageUp.x + status.sx,\n pageY : pageUp.y + status.sy,\n clientX: clientUp.x + status.sx,\n clientY: clientUp.y + status.sy,\n } ]);\n}\n","const browser = require('./utils/browser');\nconst events = require('./utils/events');\nconst utils = require('./utils');\nconst scope = require('./scope');\nconst Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\n\nconst globalEvents = {};\n\n/*\\\n * interact\n [ method ]\n *\n * The methods of this variable can be used to set elements as\n * interactables and also to change various default settings.\n *\n * Calling it as a function and passing an element or a valid CSS selector\n * string returns an Interactable object which has various methods to\n * configure it.\n *\n - element (Element | string) The HTML or SVG Element to interact with or CSS selector\n = (object) An @Interactable\n *\n > Usage\n | interact('#draggable').draggable(true);\n |\n | var rectables = interact('rect');\n | rectables\n | .gesturable(true)\n | .on('gesturemove', function (event) {\n | // ...\n | });\n\\*/\nfunction interact (element, options) {\n let interactable = scope.interactables.get(element, options);\n\n if (!interactable) {\n interactable = new Interactable(element, options);\n interactable.events.global = globalEvents;\n }\n\n return interactable;\n}\n\n/*\\\n * interact.isSet\n [ method ]\n *\n * Check if an element has been set\n - element (Element) The Element being searched for\n = (boolean) Indicates if the element or CSS selector was previously passed to interact\n\\*/\ninteract.isSet = function (element, options) {\n return scope.interactables.indexOfElement(element, options && options.context) !== -1;\n};\n\n/*\\\n * interact.on\n [ method ]\n *\n * Adds a global listener for an InteractEvent or adds a DOM event to\n * `document`\n *\n - type (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) interact\n\\*/\ninteract.on = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.on(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.on(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n // if it is an InteractEvent type, add listener to globalEvents\n if (utils.contains(Interactable.eventTypes, type)) {\n // if this type of event was never bound\n if (!globalEvents[type]) {\n globalEvents[type] = [listener];\n }\n else {\n globalEvents[type].push(listener);\n }\n }\n // If non InteractEvent type, addEventListener to document\n else {\n events.add(scope.document, type, listener, { options });\n }\n\n return interact;\n};\n\n/*\\\n * interact.off\n [ method ]\n *\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n - type (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) interact\n \\*/\ninteract.off = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.off(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.off(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n if (!utils.contains(Interactable.eventTypes, type)) {\n events.remove(scope.document, type, listener, options);\n }\n else {\n let index;\n\n if (type in globalEvents\n && (index = utils.indexOf(globalEvents[type], listener)) !== -1) {\n globalEvents[type].splice(index, 1);\n }\n }\n\n return interact;\n};\n\n/*\\\n * interact.debug\n [ method ]\n *\n * Returns an object which exposes internal data\n = (object) An object with properties that outline the current state and expose internal functions and variables\n\\*/\ninteract.debug = function () {\n return scope;\n};\n\n// expose the functions used to calculate multi-touch properties\ninteract.getPointerAverage = utils.pointerAverage;\ninteract.getTouchBBox = utils.touchBBox;\ninteract.getTouchDistance = utils.touchDistance;\ninteract.getTouchAngle = utils.touchAngle;\n\ninteract.getElementRect = utils.getElementRect;\ninteract.getElementClientRect = utils.getElementClientRect;\ninteract.matchesSelector = utils.matchesSelector;\ninteract.closest = utils.closest;\n\n/*\\\n * interact.supportsTouch\n [ method ]\n *\n = (boolean) Whether or not the browser supports touch input\n\\*/\ninteract.supportsTouch = function () {\n return browser.supportsTouch;\n};\n\n/*\\\n * interact.supportsPointerEvent\n [ method ]\n *\n = (boolean) Whether or not the browser supports PointerEvents\n\\*/\ninteract.supportsPointerEvent = function () {\n return browser.supportsPointerEvent;\n};\n\n/*\\\n * interact.stop\n [ method ]\n *\n * Cancels all interactions (end events are not fired)\n *\n - event (Event) An event on which to call preventDefault()\n = (object) interact\n\\*/\ninteract.stop = function (event) {\n for (let i = scope.interactions.length - 1; i >= 0; i--) {\n scope.interactions[i].stop(event);\n }\n\n return interact;\n};\n\n/*\\\n * interact.pointerMoveTolerance\n [ method ]\n * Returns or sets the distance the pointer must be moved before an action\n * sequence occurs. This also affects tolerance for tap events.\n *\n - newValue (number) #optional The movement from the start position must be greater than this value\n = (number | Interactable) The current setting or interact\n\\*/\ninteract.pointerMoveTolerance = function (newValue) {\n if (utils.is.number(newValue)) {\n Interaction.pointerMoveTolerance = newValue;\n\n return this;\n }\n\n return Interaction.pointerMoveTolerance;\n};\n\ninteract.addDocument = scope.addDocument;\ninteract.removeDocument = scope.removeDocument;\n\nscope.interact = interact;\n\nmodule.exports = interact;\n","const Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\nconst scope = require('./scope');\nconst is = require('./utils/is');\nconst events = require('./utils/events');\n\nconst { nodeContains, matchesSelector } = require('./utils/domUtils');\n\n/*\\\n * Interactable.preventDefault\n [ method ]\n *\n * Returns or sets whether to prevent the browser's default behaviour\n * in response to pointer events. Can be set to:\n * - `'always'` to always prevent\n * - `'never'` to never prevent\n * - `'auto'` to let interact.js try to determine what would be best\n *\n - newValue (string) #optional `true`, `false` or `'auto'`\n = (string | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.preventDefault = function (newValue) {\n if (/^(always|never|auto)$/.test(newValue)) {\n this.options.preventDefault = newValue;\n return this;\n }\n\n if (is.bool(newValue)) {\n this.options.preventDefault = newValue? 'always' : 'never';\n return this;\n }\n\n return this.options.preventDefault;\n};\n\nInteractable.prototype.checkAndPreventDefault = function (event) {\n const setting = this.options.preventDefault;\n\n if (setting === 'never') { return; }\n\n if (setting === 'always') {\n event.preventDefault();\n return;\n }\n\n // setting === 'auto'\n\n // don't preventDefault if the browser supports passiveEvents\n // CSS touch-action and user-selecct should be used instead\n if (events.supportsOptions) {\n return;\n }\n\n // don't preventDefault of pointerdown events\n if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) {\n return;\n }\n\n // don't preventDefault on editable elements\n if (is.element(event.target)\n && matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) {\n return;\n }\n\n event.preventDefault();\n};\n\nfunction onInteractionEvent ({ interaction, event }) {\n if (interaction.target) {\n interaction.target.checkAndPreventDefault(event);\n }\n}\n\nfor (const eventSignal of ['down', 'move', 'up', 'cancel']) {\n Interaction.signals.on(eventSignal, onInteractionEvent);\n}\n\n// prevent native HTML5 drag on interact.js target elements\nInteraction.docEvents.dragstart = function preventNativeDrag (event) {\n for (const interaction of scope.interactions) {\n\n if (interaction.element\n && (interaction.element === event.target\n || nodeContains(interaction.element, event.target))) {\n\n interaction.target.checkAndPreventDefault(event);\n return;\n }\n }\n};\n","const scope = require('./scope');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst iFinder = require('./utils/interactionFinder');\nconst pointerEvents = require('./pointerEvents/base');\n\nconst { window } = require('./utils/window');\n\nconst toString = Object.prototype.toString;\n\nif (!window.Array.isArray) {\n window.Array.isArray = function (obj) {\n return toString.call(obj) === '[object Array]';\n };\n}\n\nif (!String.prototype.trim) {\n String.prototype.trim = function () {\n return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n };\n}\n\n// http://www.quirksmode.org/dom/events/click.html\n// >Events leading to dblclick\n//\n// IE8 doesn't fire down event before dblclick.\n// This workaround tries to fire a tap and doubletap after dblclick\nfunction onIE8Dblclick (event) {\n const eventTarget = event.target;\n const interaction = iFinder.search(event, event.type, eventTarget);\n\n if (!interaction) { return; }\n\n if (interaction.prevTap\n && event.clientX === interaction.prevTap.clientX\n && event.clientY === interaction.prevTap.clientY\n && eventTarget === interaction.prevTap.target) {\n\n interaction.downTargets[0] = eventTarget;\n interaction.downTimes [0] = new Date().getTime();\n\n pointerEvents.fire({\n interaction,\n event,\n eventTarget,\n pointer: event,\n type: 'tap',\n });\n }\n}\n\nif (browser.isIE8) {\n const selectFix = function (event) {\n for (const interaction of scope.interactions) {\n if (interaction.interacting()) {\n interaction.target.checkAndPreventDefault(event);\n }\n }\n };\n\n const onDocIE8 = function onDocIE8 ({ doc, win }, signalName) {\n const eventMethod = signalName.indexOf('listen') === 0\n ? events.add : events.remove;\n\n // For IE's lack of Event#preventDefault\n eventMethod(doc, 'selectstart', selectFix);\n\n if (pointerEvents) {\n eventMethod(doc, 'dblclick', onIE8Dblclick);\n }\n };\n\n scope.signals.on('add-document' , onDocIE8);\n scope.signals.on('remove-document', onDocIE8);\n}\n\nmodule.exports = null;\n","const InteractEvent = require('../InteractEvent');\nconst Interaction = require('../Interaction');\nconst extend = require('../utils/extend');\n\nconst modifiers = {\n names: [],\n\n setOffsets: function (arg) {\n const { interaction, pageCoords: page } = arg;\n const { target, element, startOffset } = interaction;\n const rect = target.getRect(element);\n\n if (rect) {\n startOffset.left = page.x - rect.left;\n startOffset.top = page.y - rect.top;\n\n startOffset.right = rect.right - page.x;\n startOffset.bottom = rect.bottom - page.y;\n\n if (!('width' in rect)) { rect.width = rect.right - rect.left; }\n if (!('height' in rect)) { rect.height = rect.bottom - rect.top ; }\n }\n else {\n startOffset.left = startOffset.top = startOffset.right = startOffset.bottom = 0;\n }\n\n arg.rect = rect;\n arg.interactable = target;\n arg.element = element;\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n\n arg.options = target.options[interaction.prepared.name][modifierName];\n\n if (!arg.options) {\n continue;\n }\n\n interaction.modifierOffsets[modifierName] = modifiers[modifierName].setOffset(arg);\n }\n },\n\n setAll: function (arg) {\n const { interaction, statuses, preEnd, requireEndOnly } = arg;\n const coords = extend({}, arg.pageCoords);\n const result = {\n dx: 0,\n dy: 0,\n changed: false,\n locked: false,\n shouldMove: true,\n };\n\n for (const modifierName of modifiers.names) {\n const modifier = modifiers[modifierName];\n const options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!shouldDo(options, preEnd, requireEndOnly)) { continue; }\n\n arg.status = arg.status = statuses[modifierName];\n arg.options = options;\n arg.offset = arg.interaction.modifierOffsets[modifierName];\n\n modifier.set(arg);\n\n if (arg.status.locked) {\n coords.x += arg.status.dx;\n coords.y += arg.status.dy;\n\n result.dx += arg.status.dx;\n result.dy += arg.status.dy;\n\n result.locked = true;\n }\n }\n\n // a move should be fired if:\n // - there are no modifiers enabled,\n // - no modifiers are \"locked\" i.e. have changed the pointer's coordinates, or\n // - the locked coords have changed since the last pointer move\n result.shouldMove = !arg.status || !result.locked || arg.status.changed;\n\n return result;\n },\n\n resetStatuses: function (statuses) {\n for (const modifierName of modifiers.names) {\n const status = statuses[modifierName] || {};\n\n status.dx = status.dy = 0;\n status.modifiedX = status.modifiedY = NaN;\n status.locked = false;\n status.changed = true;\n\n statuses[modifierName] = status;\n }\n\n return statuses;\n },\n\n start: function ({ interaction }, signalName) {\n const arg = {\n interaction,\n pageCoords: (signalName === 'action-resume' ?\n interaction.curCoords : interaction.startCoords).page,\n startOffset: interaction.startOffset,\n statuses: interaction.modifierStatuses,\n preEnd: false,\n requireEndOnly: false,\n };\n\n modifiers.setOffsets(arg);\n modifiers.resetStatuses(arg.statuses);\n\n arg.pageCoords = extend({}, interaction.startCoords.page);\n interaction.modifierResult = modifiers.setAll(arg);\n },\n};\n\nInteraction.signals.on('new', function (interaction) {\n interaction.startOffset = { left: 0, right: 0, top: 0, bottom: 0 };\n interaction.modifierOffsets = {};\n interaction.modifierStatuses = modifiers.resetStatuses({});\n interaction.modifierResult = null;\n});\n\nInteraction.signals.on('action-start' , modifiers.start);\nInteraction.signals.on('action-resume', modifiers.start);\n\nInteraction.signals.on('before-action-move', function ({ interaction, preEnd, interactingBeforeMove }) {\n const modifierResult = modifiers.setAll({\n interaction,\n preEnd,\n pageCoords: interaction.curCoords.page,\n statuses: interaction.modifierStatuses,\n requireEndOnly: false,\n });\n\n // don't fire an action move if a modifier would keep the event in the same\n // cordinates as before\n if (!modifierResult.shouldMove && interactingBeforeMove) {\n interaction._dontFireMove = true;\n }\n\n interaction.modifierResult = modifierResult;\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n for (let i = 0; i < modifiers.names.length; i++) {\n const options = interaction.target.options[interaction.prepared.name][modifiers.names[i]];\n\n // if the endOnly option is true for any modifier\n if (shouldDo(options, true, true)) {\n // fire a move event at the modified coordinates\n interaction.doMove({ event, preEnd: true });\n break;\n }\n }\n});\n\nInteractEvent.signals.on('set-xy', function (arg) {\n const { iEvent, interaction } = arg;\n const modifierArg = extend({}, arg);\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n modifierArg.options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!modifierArg.options) {\n continue;\n }\n\n const modifier = modifiers[modifierName];\n\n modifierArg.status = interaction.modifierStatuses[modifierName];\n\n iEvent[modifierName] = modifier.modifyCoords(modifierArg);\n }\n});\n\nfunction shouldDo (options, preEnd, requireEndOnly) {\n return (options && options.enabled\n && (preEnd || !options.endOnly)\n && (!requireEndOnly || options.endOnly));\n}\n\nmodule.exports = modifiers;\n","const modifiers = require('./index');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst restrict = {\n defaults: {\n enabled : false,\n endOnly : false,\n restriction: null,\n elementRect: null,\n },\n\n setOffset: function ({ rect, startOffset, options }) {\n const elementRect = options && options.elementRect;\n const offset = {};\n\n if (rect && elementRect) {\n offset.left = startOffset.left - (rect.width * elementRect.left);\n offset.top = startOffset.top - (rect.height * elementRect.top);\n\n offset.right = startOffset.right - (rect.width * (1 - elementRect.right));\n offset.bottom = startOffset.bottom - (rect.height * (1 - elementRect.bottom));\n }\n else {\n offset.left = offset.top = offset.right = offset.bottom = 0;\n }\n\n return offset;\n },\n\n set: function ({ pageCoords, interaction, status, options }) {\n if (!options) { return status; }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n\n const restriction = getRestrictionRect(options.restriction, interaction, page);\n\n if (!restriction) { return status; }\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n const rect = restriction;\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n const offset = interaction.modifierOffsets.restrict;\n\n // object is assumed to have\n // x, y, width, height or\n // left, top, right, bottom\n if ('x' in restriction && 'y' in restriction) {\n modifiedX = Math.max(Math.min(rect.x + rect.width - offset.right , page.x), rect.x + offset.left);\n modifiedY = Math.max(Math.min(rect.y + rect.height - offset.bottom, page.y), rect.y + offset.top );\n }\n else {\n modifiedX = Math.max(Math.min(rect.right - offset.right , page.x), rect.left + offset.left);\n modifiedY = Math.max(Math.min(rect.bottom - offset.bottom, page.y), rect.top + offset.top );\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const elementRect = options && options.elementRect;\n\n if (options && options.enabled\n && !(phase === 'start' && elementRect && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n getRestrictionRect,\n};\n\nfunction getRestrictionRect (value, interaction, page) {\n if (utils.is.function(value)) {\n return utils.resolveRectLike(value, interaction.target, interaction.element, [page.x, page.y, interaction]);\n } else {\n return utils.resolveRectLike(value, interaction.target, interaction.element);\n }\n}\n\nmodifiers.restrict = restrict;\nmodifiers.names.push('restrict');\n\ndefaultOptions.perAction.restrict = restrict.defaults;\n\nmodule.exports = restrict;\n","// This module adds the options.resize.restrictEdges setting which sets min and\n// max for the top, left, bottom and right edges of the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictEdges: {\n// inner: { top: 200, left: 200, right: 400, bottom: 400 },\n// outer: { top: 0, left: 0, right: 600, bottom: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst { getRestrictionRect } = require('./restrict');\n\nconst noInner = { top: +Infinity, left: +Infinity, bottom: -Infinity, right: -Infinity };\nconst noOuter = { top: -Infinity, left: -Infinity, bottom: +Infinity, right: +Infinity };\n\nconst restrictEdges = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n offset: null,\n },\n\n setOffset: function ({ interaction, startOffset, options }) {\n if (!options) {\n return utils.extend({}, startOffset);\n }\n\n const offset = getRestrictionRect(options.offset, interaction, interaction.startCoords.page);\n\n if (offset) {\n return {\n top: startOffset.top + offset.y,\n left: startOffset.left + offset.x,\n bottom: startOffset.bottom + offset.y,\n right: startOffset.right + offset.x,\n };\n }\n\n return startOffset;\n },\n\n set: function ({ pageCoords, interaction, status, offset, options }) {\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n const inner = rectUtils.xywhToTlbr(getRestrictionRect(options.inner, interaction, page)) || noInner;\n const outer = rectUtils.xywhToTlbr(getRestrictionRect(options.outer, interaction, page)) || noOuter;\n\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n if (edges.top) {\n modifiedY = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top);\n }\n else if (edges.bottom) {\n modifiedY = Math.max(Math.min(outer.bottom - offset.bottom, page.y), inner.bottom - offset.bottom);\n }\n if (edges.left) {\n modifiedX = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left);\n }\n else if (edges.right) {\n modifiedX = Math.max(Math.min(outer.right - offset.right, page.x), inner.right - offset.right);\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n if (options && options.enabled\n && !(phase === 'start' && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n noInner,\n noOuter,\n getRestrictionRect,\n};\n\nmodifiers.restrictEdges = restrictEdges;\nmodifiers.names.push('restrictEdges');\n\ndefaultOptions.perAction.restrictEdges = restrictEdges.defaults;\nresize.defaults.restrictEdges = restrictEdges.defaults;\n\nmodule.exports = restrictEdges;\n","// This module adds the options.resize.restrictSize setting which sets min and\n// max width and height for the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictSize: {\n// min: { width: -600, height: -600 },\n// max: { width: 600, height: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst restrictEdges = require('./restrictEdges');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst noMin = { width: -Infinity, height: -Infinity };\nconst noMax = { width: +Infinity, height: +Infinity };\n\nconst restrictSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n },\n\n setOffset: function ({ interaction }) {\n return interaction.startOffset;\n },\n\n set: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const rect = rectUtils.xywhToTlbr(interaction.resizeRects.inverted);\n\n const minSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.min, interaction)) || noMin;\n const maxSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.max, interaction)) || noMax;\n\n arg.options = {\n enabled: options.enabled,\n endOnly: options.endOnly,\n inner: utils.extend({}, restrictEdges.noInner),\n outer: utils.extend({}, restrictEdges.noOuter),\n };\n\n if (edges.top) {\n arg.options.inner.top = rect.bottom - minSize.height;\n arg.options.outer.top = rect.bottom - maxSize.height;\n }\n else if (edges.bottom) {\n arg.options.inner.bottom = rect.top + minSize.height;\n arg.options.outer.bottom = rect.top + maxSize.height;\n }\n if (edges.left) {\n arg.options.inner.left = rect.right - minSize.width;\n arg.options.outer.left = rect.right - maxSize.width;\n }\n else if (edges.right) {\n arg.options.inner.right = rect.left + minSize.width;\n arg.options.outer.right = rect.left + maxSize.width;\n }\n\n restrictEdges.set(arg);\n },\n\n modifyCoords: restrictEdges.modifyCoords,\n};\n\nmodifiers.restrictSize = restrictSize;\nmodifiers.names.push('restrictSize');\n\ndefaultOptions.perAction.restrictSize = restrictSize.defaults;\nresize.defaults.restrictSize = restrictSize.defaults;\n\nmodule.exports = restrictSize;\n","const modifiers = require('./index');\nconst interact = require('../interact');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst snap = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n\n relativePoints: null,\n },\n\n setOffset: function ({ interaction, interactable, element, rect, startOffset, options }) {\n const offsets = [];\n const optionsOrigin = utils.rectToXY(utils.resolveRectLike(options.origin));\n const origin = optionsOrigin || utils.getOriginXY(interactable, element, interaction.prepared.name);\n options = options || interactable.options[interaction.prepared.name].snap || {};\n\n let snapOffset;\n\n if (options.offset === 'startCoords') {\n snapOffset = {\n x: interaction.startCoords.page.x - origin.x,\n y: interaction.startCoords.page.y - origin.y,\n };\n }\n else {\n const offsetRect = utils.resolveRectLike(options.offset, interactable, element, [interaction]);\n\n snapOffset = utils.rectToXY(offsetRect) || { x: 0, y: 0 };\n }\n\n if (rect && options.relativePoints && options.relativePoints.length) {\n for (const { x: relativeX, y: relativeY } of options.relativePoints) {\n offsets.push({\n x: startOffset.left - (rect.width * relativeX) + snapOffset.x,\n y: startOffset.top - (rect.height * relativeY) + snapOffset.y,\n });\n }\n }\n else {\n offsets.push(snapOffset);\n }\n\n return offsets;\n },\n\n set: function ({ interaction, pageCoords, status, options, offset: offsets }) {\n const targets = [];\n let target;\n let page;\n let i;\n\n if (status.useStatusXY) {\n page = { x: status.x, y: status.y };\n }\n else {\n const origin = utils.getOriginXY(interaction.target, interaction.element, interaction.prepared.name);\n\n page = utils.extend({}, pageCoords);\n\n page.x -= origin.x;\n page.y -= origin.y;\n }\n\n status.realX = page.x;\n status.realY = page.y;\n\n let len = options.targets? options.targets.length : 0;\n\n for (const { x: offsetX, y: offsetY } of offsets) {\n const relativeX = page.x - offsetX;\n const relativeY = page.y - offsetY;\n\n for (const snapTarget of options.targets) {\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n targets.push({\n x: utils.is.number(target.x) ? (target.x + offsetX) : relativeX,\n y: utils.is.number(target.y) ? (target.y + offsetY) : relativeY,\n\n range: utils.is.number(target.range)? target.range: options.range,\n });\n }\n }\n\n const closest = {\n target: null,\n inRange: false,\n distance: 0,\n range: 0,\n dx: 0,\n dy: 0,\n };\n\n for (i = 0, len = targets.length; i < len; i++) {\n target = targets[i];\n\n const range = target.range;\n const dx = target.x - page.x;\n const dy = target.y - page.y;\n const distance = utils.hypot(dx, dy);\n let inRange = distance <= range;\n\n // Infinite targets count as being out of range\n // compared to non infinite ones that are in range\n if (range === Infinity && closest.inRange && closest.range !== Infinity) {\n inRange = false;\n }\n\n if (!closest.target || (inRange\n // is the closest target in range?\n ? (closest.inRange && range !== Infinity\n // the pointer is relatively deeper in this target\n ? distance / range < closest.distance / closest.range\n // this target has Infinite range and the closest doesn't\n : (range === Infinity && closest.range !== Infinity)\n // OR this target is closer that the previous closest\n || distance < closest.distance)\n // The other is not in range and the pointer is closer to this target\n : (!closest.inRange && distance < closest.distance))) {\n\n closest.target = target;\n closest.distance = distance;\n closest.range = range;\n closest.inRange = inRange;\n closest.dx = dx;\n closest.dy = dy;\n\n status.range = range;\n }\n }\n\n let snapChanged;\n\n if (closest.target) {\n snapChanged = (status.modifiedX !== closest.target.x || status.modifiedY !== closest.target.y);\n\n status.modifiedX = closest.target.x;\n status.modifiedY = closest.target.y;\n }\n else {\n snapChanged = true;\n\n status.modifiedX = NaN;\n status.modifiedY = NaN;\n }\n\n status.dx = closest.dx;\n status.dy = closest.dy;\n\n status.changed = (snapChanged || (closest.inRange && !status.locked));\n status.locked = closest.inRange;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const relativePoints = options && options.relativePoints;\n\n if (options && options.enabled\n && !(phase === 'start' && relativePoints && relativePoints.length)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n }\n\n return {\n range : status.range,\n locked : status.locked,\n x : status.modifiedX,\n y : status.modifiedY,\n realX : status.realX,\n realY : status.realY,\n dx : status.dx,\n dy : status.dy,\n };\n }\n },\n};\n\ninteract.createSnapGrid = function (grid) {\n return function (x, y) {\n const limits = grid.limits || {\n left : -Infinity,\n right : Infinity,\n top : -Infinity,\n bottom: Infinity,\n };\n let offsetX = 0;\n let offsetY = 0;\n\n if (utils.is.object(grid.offset)) {\n offsetX = grid.offset.x;\n offsetY = grid.offset.y;\n }\n\n const gridx = Math.round((x - offsetX) / grid.x);\n const gridy = Math.round((y - offsetY) / grid.y);\n\n const newX = Math.max(limits.left, Math.min(limits.right , gridx * grid.x + offsetX));\n const newY = Math.max(limits.top , Math.min(limits.bottom, gridy * grid.y + offsetY));\n\n return {\n x: newX,\n y: newY,\n range: grid.range,\n };\n };\n};\n\nmodifiers.snap = snap;\nmodifiers.names.push('snap');\n\ndefaultOptions.perAction.snap = snap.defaults;\n\nmodule.exports = snap;\n","// This module allows snapping of the size of targets during resize\n// interactions.\n\nconst modifiers = require('./index');\nconst snap = require('./snap');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\nconst utils = require('../utils/');\n\nconst snapSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n },\n\n setOffset: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.edges;\n\n if (!edges) { return; }\n\n arg.options = {\n relativePoints: [{\n x: edges.left? 0 : 1,\n y: edges.top ? 0 : 1,\n }],\n origin: { x: 0, y: 0 },\n offset: 'self',\n range: options.range,\n };\n\n const offsets = snap.setOffset(arg);\n arg.options = options;\n\n return offsets;\n },\n\n set: function (arg) {\n const { interaction, options, offset, pageCoords } = arg;\n const page = utils.extend({}, pageCoords);\n const relativeX = page.x - offset[0].x;\n const relativeY = page.y - offset[0].y;\n\n arg.options = utils.extend({}, options);\n arg.options.targets = [];\n\n for (const snapTarget of options.targets) {\n let target;\n\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n if ('width' in target && 'height' in target) {\n target.x = target.width;\n target.y = target.height;\n }\n\n arg.options.targets.push(target);\n }\n\n snap.set(arg);\n },\n\n modifyCoords: function (arg) {\n const { options } = arg;\n\n arg.options = utils.extend({}, options);\n arg.options.enabled = options.enabled;\n arg.options.relativePoints = [null];\n\n snap.modifyCoords(arg);\n },\n};\n\nmodifiers.snapSize = snapSize;\nmodifiers.names.push('snapSize');\n\ndefaultOptions.perAction.snapSize = snapSize.defaults;\nresize.defaults.snapSize = snapSize.defaults;\n\nmodule.exports = snapSize;\n","const pointerUtils = require('../utils/pointerUtils');\n\nmodule.exports = class PointerEvent {\n constructor (type, pointer, event, eventTarget, interaction) {\n pointerUtils.pointerExtend(this, event);\n\n if (event !== pointer) {\n pointerUtils.pointerExtend(this, pointer);\n }\n\n this.interaction = interaction;\n\n this.timeStamp = new Date().getTime();\n this.originalEvent = event;\n this.type = type;\n this.pointerId = pointerUtils.getPointerId(pointer);\n this.pointerType = pointerUtils.getPointerType(pointer, interaction);\n this.target = eventTarget;\n this.currentTarget = null;\n\n if (type === 'tap') {\n const pointerIndex = interaction.getPointerIndex(pointer);\n this.dt = this.timeStamp - interaction.downTimes[pointerIndex];\n\n const interval = this.timeStamp - interaction.tapTime;\n\n this.double = !!(interaction.prevTap\n && interaction.prevTap.type !== 'doubletap'\n && interaction.prevTap.target === this.target\n && interval < 500);\n }\n else if (type === 'doubletap') {\n this.dt = pointer.timeStamp - interaction.tapTime;\n }\n }\n\n subtractOrigin ({ x: originX, y: originY }) {\n this.pageX -= originX;\n this.pageY -= originY;\n this.clientX -= originX;\n this.clientY -= originY;\n\n return this;\n }\n\n addOrigin ({ x: originX, y: originY }) {\n this.pageX += originX;\n this.pageY += originY;\n this.clientX += originX;\n this.clientY += originY;\n\n return this;\n }\n\n preventDefault () {\n this.originalEvent.preventDefault();\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n};\n","const PointerEvent = require('./PointerEvent');\nconst Interaction = require('../Interaction');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst defaults = require('../defaultOptions');\nconst signals = require('../utils/Signals').new();\nconst { filter } = require('../utils/arr');\n\nconst simpleSignals = [ 'down', 'up', 'cancel' ];\nconst simpleEvents = [ 'down', 'up', 'cancel' ];\n\nconst pointerEvents = {\n PointerEvent,\n fire,\n collectEventTargets,\n signals,\n defaults: {\n holdDuration: 600,\n ignoreFrom : null,\n allowFrom : null,\n origin : { x: 0, y: 0 },\n },\n types: [\n 'down',\n 'move',\n 'up',\n 'cancel',\n 'tap',\n 'doubletap',\n 'hold',\n ],\n};\n\nfunction fire (arg) {\n const {\n interaction, pointer, event, eventTarget,\n type = arg.pointerEvent.type,\n targets = collectEventTargets(arg),\n pointerEvent = new PointerEvent(type, pointer, event, eventTarget, interaction),\n } = arg;\n\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n targets,\n type,\n pointerEvent,\n };\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n\n for (const prop in target.props || {}) {\n pointerEvent[prop] = target.props[prop];\n }\n\n const origin = utils.getOriginXY(target.eventable, target.element);\n\n pointerEvent.subtractOrigin(origin);\n pointerEvent.eventable = target.eventable;\n pointerEvent.currentTarget = target.element;\n\n target.eventable.fire(pointerEvent);\n\n pointerEvent.addOrigin(origin);\n\n if (pointerEvent.immediatePropagationStopped\n || (pointerEvent.propagationStopped\n && (i + 1) < targets.length && targets[i + 1].element !== pointerEvent.currentTarget)) {\n break;\n }\n }\n\n signals.fire('fired', signalArg);\n\n if (type === 'tap') {\n // if pointerEvent should make a double tap, create and fire a doubletap\n // PointerEvent and use that as the prevTap\n const prevTap = pointerEvent.double\n ? fire({\n interaction, pointer, event, eventTarget,\n type: 'doubletap',\n })\n : pointerEvent;\n\n interaction.prevTap = prevTap;\n interaction.tapTime = prevTap.timeStamp;\n }\n\n return pointerEvent;\n}\n\nfunction collectEventTargets ({ interaction, pointer, event, eventTarget, type }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n // do not fire a tap event if the pointer was moved before being lifted\n if (type === 'tap' && (interaction.pointerWasMoved\n // or if the pointerup target is different to the pointerdown target\n || !(interaction.downTargets[pointerIndex] && interaction.downTargets[pointerIndex] === eventTarget))) {\n return [];\n }\n\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n path,\n targets: [],\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (type === 'hold') {\n signalArg.targets = filter(signalArg.targets, target =>\n target.eventable.options.holdDuration === interaction.holdTimers[pointerIndex].duration);\n }\n\n return signalArg.targets;\n}\n\nInteraction.signals.on('update-pointer-down', function ({ interaction, pointerIndex }) {\n interaction.holdTimers[pointerIndex] = { duration: Infinity, timeout: null };\n});\n\nInteraction.signals.on('remove-pointer', function ({ interaction, pointerIndex }) {\n interaction.holdTimers.splice(pointerIndex, 1);\n});\n\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget, duplicateMove }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n if (!duplicateMove && (!interaction.pointerIsDown || interaction.pointerWasMoved)) {\n if (interaction.pointerIsDown) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n\n fire({\n interaction, pointer, event, eventTarget,\n type: 'move',\n });\n }\n});\n\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget, pointerIndex }) {\n // copy event to be used in timeout for IE8\n const eventCopy = browser.isIE8? utils.extend({}, event) : event;\n\n const timer = interaction.holdTimers[pointerIndex];\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'hold',\n targets: [],\n path,\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (!signalArg.targets.length) { return; }\n\n let minDuration = Infinity;\n\n for (let i = 0; i < signalArg.targets.length; i++) {\n const target = signalArg.targets[i];\n const holdDuration = target.eventable.options.holdDuration;\n\n if (holdDuration < minDuration) {\n minDuration = holdDuration;\n }\n }\n\n timer.duration = minDuration;\n timer.timeout = setTimeout(function () {\n fire({\n interaction, eventCopy, eventTarget,\n pointer: browser.isIE8? eventCopy : pointer,\n type: 'hold',\n });\n }, minDuration);\n});\n\nInteraction.signals.on('up', ({ interaction, pointer, event, eventTarget }) => {\n if (!interaction.pointerWasMoved) {\n fire({ interaction, eventTarget, pointer, event, type: 'tap' });\n }\n});\n\n['up', 'cancel'].forEach(function (signalName) {\n Interaction.signals.on(signalName, function ({ interaction, pointerIndex }) {\n if (interaction.holdTimers[pointerIndex]) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n });\n});\n\nfunction createSignalListener (type) {\n return function ({ interaction, pointer, event, eventTarget }) {\n fire({ interaction, eventTarget, pointer, event, type });\n };\n}\n\nfor (let i = 0; i < simpleSignals.length; i++) {\n Interaction.signals.on(simpleSignals[i], createSignalListener(simpleEvents[i]));\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.prevTap = null; // the most recent tap event on this interaction\n interaction.tapTime = 0; // time of the most recent tap event\n interaction.holdTimers = []; // [{ duration, timeout }]\n});\n\ndefaults.pointerEvents = pointerEvents.defaults;\nmodule.exports = pointerEvents;\n","const pointerEvents = require('./base');\nconst Interaction = require('../Interaction');\n\npointerEvents.signals.on('new', onNew);\npointerEvents.signals.on('fired', onFired);\n\nfor (const signal of ['move', 'up', 'cancel', 'endall']) {\n Interaction.signals.on(signal, endHoldRepeat);\n}\n\nfunction onNew ({ pointerEvent }) {\n if (pointerEvent.type !== 'hold') { return; }\n\n pointerEvent.count = (pointerEvent.count || 0) + 1;\n}\n\nfunction onFired ({ interaction, pointerEvent, eventTarget, targets }) {\n if (pointerEvent.type !== 'hold' || !targets.length) { return; }\n\n // get the repeat interval from the first eventable\n const interval = targets[0].eventable.options.holdRepeatInterval;\n\n // don't repeat if the interval is 0 or less\n if (interval <= 0) { return; }\n\n // set a timeout to fire the holdrepeat event\n interaction.holdIntervalHandle = setTimeout(function () {\n pointerEvents.fire({\n interaction,\n eventTarget,\n type: 'hold',\n pointer: pointerEvent,\n event: pointerEvent,\n });\n }, interval);\n}\n\nfunction endHoldRepeat ({ interaction }) {\n // set the interaction's holdStopTime property\n // to stop further holdRepeat events\n if (interaction.holdIntervalHandle) {\n clearInterval(interaction.holdIntervalHandle);\n interaction.holdIntervalHandle = null;\n }\n}\n\n// don't repeat by default\npointerEvents.defaults.holdRepeatInterval = 0;\npointerEvents.types.push('holdrepeat');\n\nmodule.exports = {\n onNew,\n onFired,\n endHoldRepeat,\n};\n","const pointerEvents = require('./base');\nconst Interactable = require('../Interactable');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\nconst scope = require('../scope');\nconst extend = require('../utils/extend');\nconst { merge } = require('../utils/arr');\n\npointerEvents.signals.on('collect-targets', function ({ targets, element, type, eventTarget }) {\n function collectSelectors (interactable, selector, context) {\n const els = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && is.element(element)\n && domUtils.matchesSelector(element, selector, els)\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n const interactable = scope.interactables.get(element);\n\n if (interactable) {\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n scope.interactables.forEachSelector(collectSelectors, element);\n});\n\nInteractable.signals.on('new', function ({ interactable }) {\n interactable.events.getRect = function (element) {\n return interactable.getRect(element);\n };\n});\n\nInteractable.signals.on('set', function ({ interactable, options }) {\n extend(interactable.events.options, pointerEvents.defaults);\n extend(interactable.events.options, options);\n});\n\nmerge(Interactable.eventTypes, pointerEvents.types);\n\nInteractable.prototype.pointerEvents = function (options) {\n extend(this.events.options, options);\n\n return this;\n};\n\nconst __backCompatOption = Interactable.prototype._backCompatOption;\n\nInteractable.prototype._backCompatOption = function (optionName, newValue) {\n const ret = __backCompatOption.call(this, optionName, newValue);\n\n if (ret === this) {\n this.events.options[optionName] = newValue;\n }\n\n return ret;\n};\n\nInteractable.settingsMethods.push('pointerEvents');\n","const utils = require('./utils');\nconst events = require('./utils/events');\nconst signals = require('./utils/Signals').new();\n\nconst scope = {\n signals,\n events,\n utils,\n\n // main document\n document: require('./utils/domObjects').document,\n // all documents being listened to\n documents: [],\n\n addDocument: function (doc, win) {\n // do nothing if document is already known\n if (utils.contains(scope.documents, doc)) { return false; }\n\n win = win || scope.getWindow(doc);\n\n scope.documents.push(doc);\n events.documents.push(doc);\n\n // don't add an unload event for the main document\n // so that the page may be cached in browser history\n if (doc !== scope.document) {\n events.add(win, 'unload', scope.onWindowUnload);\n }\n\n signals.fire('add-document', { doc, win });\n },\n\n removeDocument: function (doc, win) {\n const index = utils.indexOf(scope.documents, doc);\n\n win = win || scope.getWindow(doc);\n\n events.remove(win, 'unload', scope.onWindowUnload);\n\n scope.documents.splice(index, 1);\n events.documents.splice(index, 1);\n\n signals.fire('remove-document', { win, doc });\n },\n\n onWindowUnload: function () {\n scope.removeDocument(this.document, this);\n },\n};\n\nmodule.exports = scope;\n","const { indexOf } = require('./arr');\n\nclass Signals {\n constructor () {\n this.listeners = {\n // signalName: [listeners],\n };\n }\n\n on (name, listener) {\n if (!this.listeners[name]) {\n this.listeners[name] = [listener];\n return;\n }\n\n this.listeners[name].push(listener);\n }\n\n off (name, listener) {\n if (!this.listeners[name]) { return; }\n\n const index = indexOf(this.listeners[name], listener);\n\n if (index !== -1) {\n this.listeners[name].splice(index, 1);\n }\n }\n\n fire (name, arg) {\n const targetListeners = this.listeners[name];\n\n if (!targetListeners) { return; }\n\n for (let i = 0; i < targetListeners.length; i++) {\n if (targetListeners[i](arg, name) === false) {\n return;\n }\n }\n }\n}\n\nSignals.new = function () {\n return new Signals();\n};\n\nmodule.exports = Signals;\n","function indexOf (array, target) {\n for (let i = 0, len = array.length; i < len; i++) {\n if (array[i] === target) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction contains (array, target) {\n return indexOf(array, target) !== -1;\n}\n\nfunction merge (target, source) {\n for (let i = 0; i < source.length; i++) {\n target.push(source[i]);\n }\n\n return target;\n}\n\nfunction filter (array, test) {\n const result = [];\n\n for (let i = 0; i < array.length; i++) {\n if (test(array[i])) {\n result.push(array[i]);\n }\n }\n\n return result;\n}\n\nmodule.exports = {\n indexOf,\n contains,\n merge,\n filter,\n};\n","const { window } = require('./window');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst Element = domObjects.Element;\nconst navigator = window.navigator;\n\nconst browser = {\n // Does the browser support touch input?\n supportsTouch: !!(('ontouchstart' in window) || is.function(window.DocumentTouch)\n && domObjects.document instanceof window.DocumentTouch),\n\n // Does the browser support PointerEvents\n supportsPointerEvent: !!domObjects.PointerEvent,\n\n isIE8: ('attachEvent' in window) && !('addEventListener' in window),\n\n // Opera Mobile must be handled differently\n isOperaMobile: (navigator.appName === 'Opera'\n && browser.supportsTouch\n && navigator.userAgent.match('Presto')),\n\n // scrolling doesn't change the result of getClientRects on iOS 7\n isIOS7: (/iP(hone|od|ad)/.test(navigator.platform)\n && /OS 7[^\\d]/.test(navigator.appVersion)),\n\n isIe9OrOlder: /MSIE (8|9)/.test(navigator.userAgent),\n\n // prefix matchesSelector\n prefixedMatchesSelector: 'matches' in Element.prototype\n ? 'matches': 'webkitMatchesSelector' in Element.prototype\n ? 'webkitMatchesSelector': 'mozMatchesSelector' in Element.prototype\n ? 'mozMatchesSelector': 'oMatchesSelector' in Element.prototype\n ? 'oMatchesSelector': 'msMatchesSelector',\n\n useMatchesSelectorPolyfill: false,\n\n pEventTypes: (domObjects.PointerEvent\n ? (domObjects.PointerEvent === window.MSPointerEvent\n ? {\n up: 'MSPointerUp',\n down: 'MSPointerDown',\n over: 'mouseover',\n out: 'mouseout',\n move: 'MSPointerMove',\n cancel: 'MSPointerCancel',\n }\n : {\n up: 'pointerup',\n down: 'pointerdown',\n over: 'pointerover',\n out: 'pointerout',\n move: 'pointermove',\n cancel: 'pointercancel',\n })\n : null),\n\n // because Webkit and Opera still use 'mousewheel' event type\n wheelEvent: 'onmousewheel' in domObjects.document? 'mousewheel': 'wheel',\n\n};\n\nbrowser.useMatchesSelectorPolyfill = !is.function(Element.prototype[browser.prefixedMatchesSelector]);\n\nmodule.exports = browser;\n","const domObjects = {};\nconst win = require('./window').window;\n\nfunction blank () {}\n\ndomObjects.document = win.document;\ndomObjects.DocumentFragment = win.DocumentFragment || blank;\ndomObjects.SVGElement = win.SVGElement || blank;\ndomObjects.SVGSVGElement = win.SVGSVGElement || blank;\ndomObjects.SVGElementInstance = win.SVGElementInstance || blank;\ndomObjects.Element = win.Element || blank;\ndomObjects.HTMLElement = win.HTMLElement || domObjects.Element;\n\ndomObjects.Event = win.Event;\ndomObjects.Touch = win.Touch || blank;\ndomObjects.PointerEvent = (win.PointerEvent || win.MSPointerEvent);\n\nmodule.exports = domObjects;\n","const win = require('./window');\nconst browser = require('./browser');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst domUtils = {\n nodeContains: function (parent, child) {\n while (child) {\n if (child === parent) {\n return true;\n }\n\n child = child.parentNode;\n }\n\n return false;\n },\n\n closest: function (element, selector) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) { return element; }\n\n element = domUtils.parentNode(element);\n }\n\n return null;\n },\n\n parentNode: function (node) {\n let parent = node.parentNode;\n\n if (is.docFrag(parent)) {\n // skip past #shado-root fragments\n while ((parent = parent.host) && is.docFrag(parent)) {\n continue;\n }\n\n return parent;\n }\n\n return parent;\n },\n\n // taken from http://tanalin.com/en/blog/2012/12/matches-selector-ie8/ and modified\n matchesSelectorPolyfill: browser.useMatchesSelectorPolyfill\n ? function (element, selector, elems) {\n elems = elems || element.parentNode.querySelectorAll(selector);\n\n for (let i = 0, len = elems.length; i < len; i++) {\n if (elems[i] === element) {\n return true;\n }\n }\n\n return false;\n }\n : null,\n\n matchesSelector: function (element, selector, nodeList) {\n if (browser.useMatchesSelectorPolyfill) {\n return domUtils.matchesSelectorPolyfill(element, selector, nodeList);\n }\n\n // remove /deep/ from selectors if shadowDOM polyfill is used\n if (win.window !== win.realWindow) {\n selector = selector.replace(/\\/deep\\//g, ' ');\n }\n\n return element[browser.prefixedMatchesSelector](selector);\n },\n\n // Test for the element that's \"above\" all other qualifiers\n indexOfDeepestElement: function (elements) {\n let deepestZoneParents = [];\n let dropzoneParents = [];\n let dropzone;\n let deepestZone = elements[0];\n let index = deepestZone? 0: -1;\n let parent;\n let child;\n let i;\n let n;\n\n for (i = 1; i < elements.length; i++) {\n dropzone = elements[i];\n\n // an element might belong to multiple selector dropzones\n if (!dropzone || dropzone === deepestZone) {\n continue;\n }\n\n if (!deepestZone) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n // check if the deepest or current are document.documentElement or document.rootElement\n // - if the current dropzone is, do nothing and continue\n if (dropzone.parentNode === dropzone.ownerDocument) {\n continue;\n }\n // - if deepest is, update with the current dropzone and continue to next\n else if (deepestZone.parentNode === dropzone.ownerDocument) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n if (!deepestZoneParents.length) {\n parent = deepestZone;\n while (parent.parentNode && parent.parentNode !== parent.ownerDocument) {\n deepestZoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n }\n\n // if this element is an svg element and the current deepest is\n // an HTMLElement\n if (deepestZone instanceof domObjects.HTMLElement\n && dropzone instanceof domObjects.SVGElement\n && !(dropzone instanceof domObjects.SVGSVGElement)) {\n\n if (dropzone === deepestZone.parentNode) {\n continue;\n }\n\n parent = dropzone.ownerSVGElement;\n }\n else {\n parent = dropzone;\n }\n\n dropzoneParents = [];\n\n while (parent.parentNode !== parent.ownerDocument) {\n dropzoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n\n n = 0;\n\n // get (position of last common ancestor) + 1\n while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) {\n n++;\n }\n\n const parents = [\n dropzoneParents[n - 1],\n dropzoneParents[n],\n deepestZoneParents[n],\n ];\n\n child = parents[0].lastChild;\n\n while (child) {\n if (child === parents[1]) {\n deepestZone = dropzone;\n index = i;\n deepestZoneParents = [];\n\n break;\n }\n else if (child === parents[2]) {\n break;\n }\n\n child = child.previousSibling;\n }\n }\n\n return index;\n },\n\n matchesUpTo: function (element, selector, limit) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) {\n return true;\n }\n\n element = domUtils.parentNode(element);\n\n if (element === limit) {\n return domUtils.matchesSelector(element, selector);\n }\n }\n\n return false;\n },\n\n getActualElement: function (element) {\n return (element instanceof domObjects.SVGElementInstance\n ? element.correspondingUseElement\n : element);\n },\n\n getScrollXY: function (relevantWindow) {\n relevantWindow = relevantWindow || win.window;\n return {\n x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft,\n y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop,\n };\n },\n\n getElementClientRect: function (element) {\n const clientRect = (element instanceof domObjects.SVGElement\n ? element.getBoundingClientRect()\n : element.getClientRects()[0]);\n\n return clientRect && {\n left : clientRect.left,\n right : clientRect.right,\n top : clientRect.top,\n bottom: clientRect.bottom,\n width : clientRect.width || clientRect.right - clientRect.left,\n height: clientRect.height || clientRect.bottom - clientRect.top,\n };\n },\n\n getElementRect: function (element) {\n const clientRect = domUtils.getElementClientRect(element);\n\n if (!browser.isIOS7 && clientRect) {\n const scroll = domUtils.getScrollXY(win.getWindow(element));\n\n clientRect.left += scroll.x;\n clientRect.right += scroll.x;\n clientRect.top += scroll.y;\n clientRect.bottom += scroll.y;\n }\n\n return clientRect;\n },\n\n getPath: function (element) {\n const path = [];\n\n while (element) {\n path.push(element);\n element = domUtils.parentNode(element);\n }\n\n return path;\n },\n\n trySelector: value => {\n if (!is.string(value)) { return false; }\n\n // an exception will be raised if it is invalid\n domObjects.document.querySelector(value);\n return true;\n },\n};\n\nmodule.exports = domUtils;\n","const is = require('./is');\nconst domUtils = require('./domUtils');\nconst pExtend = require('./pointerExtend');\n\nconst { window, getWindow } = require('./window');\nconst { indexOf, contains } = require('./arr');\n\nconst useAttachEvent = ('attachEvent' in window) && !('addEventListener' in window);\nconst addEvent = useAttachEvent? 'attachEvent': 'addEventListener';\nconst removeEvent = useAttachEvent? 'detachEvent': 'removeEventListener';\nconst on = useAttachEvent? 'on': '';\n\nconst elements = [];\nconst targets = [];\nconst attachedListeners = [];\n\n// {\n// type: {\n// selectors: ['selector', ...],\n// contexts : [document, ...],\n// listeners: [[listener, capture, passive], ...]\n// }\n// }\nconst delegatedEvents = {};\n\nconst documents = [];\n\nconst supportsOptions = !useAttachEvent && (() => {\n let supported = false;\n\n window.document.createElement('div').addEventListener('test', null, {\n get capture () { supported = true; },\n });\n\n return supported;\n})();\n\nfunction add (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n let elementIndex = indexOf(elements, element);\n let target = targets[elementIndex];\n\n if (!target) {\n target = {\n events: {},\n typeCount: 0,\n };\n\n elementIndex = elements.push(element) - 1;\n targets.push(target);\n\n attachedListeners.push(useAttachEvent\n ? {\n supplied: [],\n wrapped : [],\n useCount: [],\n }\n : null);\n }\n\n if (!target.events[type]) {\n target.events[type] = [];\n target.typeCount++;\n }\n\n if (!contains(target.events[type], listener)) {\n let ret;\n\n if (useAttachEvent) {\n const { supplied, wrapped, useCount } = attachedListeners[elementIndex];\n const listenerIndex = indexOf(supplied, listener);\n\n const wrappedListener = wrapped[listenerIndex] || function (event) {\n if (!event.immediatePropagationStopped) {\n event.target = event.srcElement;\n event.currentTarget = element;\n\n event.preventDefault = event.preventDefault || preventDef;\n event.stopPropagation = event.stopPropagation || stopProp;\n event.stopImmediatePropagation = event.stopImmediatePropagation || stopImmProp;\n\n if (/mouse|click/.test(event.type)) {\n event.pageX = event.clientX + getWindow(element).document.documentElement.scrollLeft;\n event.pageY = event.clientY + getWindow(element).document.documentElement.scrollTop;\n }\n\n listener(event);\n }\n };\n\n ret = element[addEvent](on + type, wrappedListener, !!options.capture);\n\n if (listenerIndex === -1) {\n supplied.push(listener);\n wrapped.push(wrappedListener);\n useCount.push(1);\n }\n else {\n useCount[listenerIndex]++;\n }\n }\n else {\n ret = element[addEvent](type, listener, supportsOptions? options : !!options.capture);\n }\n target.events[type].push(listener);\n\n return ret;\n }\n}\n\nfunction remove (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const elementIndex = indexOf(elements, element);\n const target = targets[elementIndex];\n\n if (!target || !target.events) {\n return;\n }\n\n let wrappedListener = listener;\n let listeners;\n let listenerIndex;\n\n if (useAttachEvent) {\n listeners = attachedListeners[elementIndex];\n listenerIndex = indexOf(listeners.supplied, listener);\n wrappedListener = listeners.wrapped[listenerIndex];\n }\n\n if (type === 'all') {\n for (type in target.events) {\n if (target.events.hasOwnProperty(type)) {\n remove(element, type, 'all');\n }\n }\n return;\n }\n\n if (target.events[type]) {\n const len = target.events[type].length;\n\n if (listener === 'all') {\n for (let i = 0; i < len; i++) {\n remove(element, type, target.events[type][i], options);\n }\n return;\n }\n else {\n for (let i = 0; i < len; i++) {\n if (target.events[type][i] === listener) {\n element[removeEvent](on + type, wrappedListener, supportsOptions? options : !!options.capture);\n target.events[type].splice(i, 1);\n\n if (useAttachEvent && listeners) {\n listeners.useCount[listenerIndex]--;\n if (listeners.useCount[listenerIndex] === 0) {\n listeners.supplied.splice(listenerIndex, 1);\n listeners.wrapped.splice(listenerIndex, 1);\n listeners.useCount.splice(listenerIndex, 1);\n }\n }\n\n break;\n }\n }\n }\n\n if (target.events[type] && target.events[type].length === 0) {\n target.events[type] = null;\n target.typeCount--;\n }\n }\n\n if (!target.typeCount) {\n targets.splice(elementIndex, 1);\n elements.splice(elementIndex, 1);\n attachedListeners.splice(elementIndex, 1);\n }\n}\n\nfunction addDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n if (!delegatedEvents[type]) {\n delegatedEvents[type] = {\n selectors: [],\n contexts : [],\n listeners: [],\n };\n\n // add delegate listener functions\n for (let i = 0; i < documents.length; i++) {\n add(documents[i], type, delegateListener);\n add(documents[i], type, delegateUseCapture, true);\n }\n }\n\n const delegated = delegatedEvents[type];\n let index;\n\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n break;\n }\n }\n\n if (index === -1) {\n index = delegated.selectors.length;\n\n delegated.selectors.push(selector);\n delegated.contexts .push(context);\n delegated.listeners.push([]);\n }\n\n // keep listener and capture and passive flags\n delegated.listeners[index].push([listener, !!options.capture, options.passive]);\n}\n\nfunction removeDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const delegated = delegatedEvents[type];\n let matchFound = false;\n let index;\n\n if (!delegated) { return; }\n\n // count from last index of delegated to 0\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n // look for matching selector and context Node\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n\n const listeners = delegated.listeners[index];\n\n // each item of the listeners array is an array: [function, capture, passive]\n for (let i = listeners.length - 1; i >= 0; i--) {\n const [fn, capture, passive] = listeners[i];\n\n // check if the listener functions and capture and passive flags match\n if (fn === listener && capture === !!options.capture && passive === options.passive) {\n // remove the listener from the array of listeners\n listeners.splice(i, 1);\n\n // if all listeners for this interactable have been removed\n // remove the interactable from the delegated arrays\n if (!listeners.length) {\n delegated.selectors.splice(index, 1);\n delegated.contexts .splice(index, 1);\n delegated.listeners.splice(index, 1);\n\n // remove delegate function from context\n remove(context, type, delegateListener);\n remove(context, type, delegateUseCapture, true);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegatedEvents[type] = null;\n }\n }\n\n // only remove one listener\n matchFound = true;\n break;\n }\n }\n\n if (matchFound) { break; }\n }\n }\n}\n\n// bound to the interactable context when a DOM event\n// listener is added to a selector interactable\nfunction delegateListener (event, optionalArg) {\n const options = getOptions(optionalArg);\n const fakeEvent = {};\n const delegated = delegatedEvents[event.type];\n const eventTarget = (domUtils.getActualElement(event.path\n ? event.path[0]\n : event.target));\n let element = eventTarget;\n\n // duplicate the event so that currentTarget can be changed\n pExtend(fakeEvent, event);\n\n fakeEvent.originalEvent = event;\n fakeEvent.preventDefault = preventOriginalDefault;\n\n // climb up document tree looking for selector matches\n while (is.element(element)) {\n for (let i = 0; i < delegated.selectors.length; i++) {\n const selector = delegated.selectors[i];\n const context = delegated.contexts[i];\n\n if (domUtils.matchesSelector(element, selector)\n && domUtils.nodeContains(context, eventTarget)\n && domUtils.nodeContains(context, element)) {\n\n const listeners = delegated.listeners[i];\n\n fakeEvent.currentTarget = element;\n\n for (let j = 0; j < listeners.length; j++) {\n const [fn, capture, passive] = listeners[j];\n\n if (capture === !!options.capture && passive === options.passive) {\n fn(fakeEvent);\n }\n }\n }\n }\n\n element = domUtils.parentNode(element);\n }\n}\n\nfunction delegateUseCapture (event) {\n return delegateListener.call(this, event, true);\n}\n\nfunction preventDef () {\n this.returnValue = false;\n}\n\nfunction preventOriginalDefault () {\n this.originalEvent.preventDefault();\n}\n\nfunction stopProp () {\n this.cancelBubble = true;\n}\n\nfunction stopImmProp () {\n this.cancelBubble = true;\n this.immediatePropagationStopped = true;\n}\n\nfunction getOptions (param) {\n return is.object(param)? param : { capture: param };\n}\n\nmodule.exports = {\n add,\n remove,\n\n addDelegate,\n removeDelegate,\n\n delegateListener,\n delegateUseCapture,\n delegatedEvents,\n documents,\n\n useAttachEvent,\n supportsOptions,\n\n _elements: elements,\n _targets: targets,\n _attachedListeners: attachedListeners,\n};\n","module.exports = function extend (dest, source) {\n for (const prop in source) {\n dest[prop] = source[prop];\n }\n return dest;\n};\n","const {\n resolveRectLike,\n rectToXY,\n} = require('./rect');\n\nmodule.exports = function (target, element, action) {\n const actionOptions = target.options[action];\n const actionOrigin = actionOptions && actionOptions.origin;\n const origin = actionOrigin || target.options.origin;\n\n const originRect = resolveRectLike(origin, target, element, [target && element]);\n\n return rectToXY(originRect) || { x: 0, y: 0 };\n};\n","module.exports = (x, y) => Math.sqrt(x * x + y * y);\n","const extend = require('./extend');\nconst win = require('./window');\n\nconst utils = {\n warnOnce: function (method, message) {\n let warned = false;\n\n return function () {\n if (!warned) {\n win.window.console.warn(message);\n warned = true;\n }\n\n return method.apply(this, arguments);\n };\n },\n\n // http://stackoverflow.com/a/5634528/2280888\n _getQBezierValue: function (t, p1, p2, p3) {\n const iT = 1 - t;\n return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3;\n },\n\n getQuadraticCurvePoint: function (startX, startY, cpX, cpY, endX, endY, position) {\n return {\n x: utils._getQBezierValue(position, startX, cpX, endX),\n y: utils._getQBezierValue(position, startY, cpY, endY),\n };\n },\n\n // http://gizma.com/easing/\n easeOutQuad: function (t, b, c, d) {\n t /= d;\n return -c * t*(t-2) + b;\n },\n\n copyAction: function (dest, src) {\n dest.name = src.name;\n dest.axis = src.axis;\n dest.edges = src.edges;\n\n return dest;\n },\n\n is : require('./is'),\n extend : extend,\n hypot : require('./hypot'),\n getOriginXY: require('./getOriginXY'),\n};\n\nextend(utils, require('./arr'));\nextend(utils, require('./domUtils'));\nextend(utils, require('./pointerUtils'));\nextend(utils, require('./rect'));\n\nmodule.exports = utils;\n","const scope = require('../scope');\nconst utils = require('./index');\nconst browser = require('./browser');\n\nconst finder = {\n methodOrder: [ 'simulationResume', 'mouse', 'hasPointer', 'idle' ],\n\n search: function (pointer, eventType, eventTarget) {\n const mouseEvent = (/mouse/i.test(pointer.pointerType || eventType)\n // MSPointerEvent.MSPOINTER_TYPE_MOUSE\n || pointer.pointerType === 4);\n const pointerId = utils.getPointerId(pointer);\n const details = { pointer, pointerId, mouseEvent, eventType, eventTarget };\n\n for (const method of finder.methodOrder) {\n const interaction = finder[method](details);\n\n if (interaction) {\n return interaction;\n }\n }\n },\n\n // try to resume simulation with a new pointer\n simulationResume: function ({ mouseEvent, eventType, eventTarget }) {\n if (!/down|start/i.test(eventType)) {\n return null;\n }\n\n for (const interaction of scope.interactions) {\n let element = eventTarget;\n\n if (interaction.simulation && interaction.simulation.allowResume\n && (interaction.mouse === mouseEvent)) {\n while (element) {\n // if the element is the interaction element\n if (element === interaction.element) {\n return interaction;\n }\n element = utils.parentNode(element);\n }\n }\n }\n\n return null;\n },\n\n // if it's a mouse interaction\n mouse: function ({ pointerId, mouseEvent, eventType }) {\n if (!mouseEvent && (browser.supportsTouch || browser.supportsPointerEvent)) {\n return null;\n }\n\n let firstNonActive;\n\n for (const interaction of scope.interactions) {\n if (interaction.mouse) {\n // if it's a down event, skip interactions with running simulations\n if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; }\n\n // if the interaction is active, return it immediately\n if (interaction.interacting()) {\n return interaction;\n }\n // otherwise save it and look for another active interaction\n else if (!firstNonActive) {\n firstNonActive = interaction;\n }\n }\n }\n\n // if no active mouse interaction was found use the first inactive mouse\n // interaction\n if (firstNonActive) {\n return firstNonActive;\n }\n\n // Find any interaction specifically for mouse.\n // ignore the interaction if the eventType is a mousedown, and a simulation\n // is active\n for (const interaction of scope.interactions) {\n if (interaction.mouse && !(/down/.test(eventType) && interaction.simulation)) {\n return interaction;\n }\n }\n\n return null;\n },\n\n // get interaction that has this pointer\n hasPointer: function ({ pointerId }) {\n for (const interaction of scope.interactions) {\n if (utils.contains(interaction.pointerIds, pointerId)) {\n return interaction;\n }\n }\n },\n\n // get first idle interaction\n idle: function ({ mouseEvent }) {\n for (const interaction of scope.interactions) {\n // if there's already a pointer held down\n if (interaction.pointerIds.length === 1) {\n const target = interaction.target;\n // don't add this pointer if there is a target interactable and it\n // isn't gesturable\n if (target && !target.options.gesture.enabled) {\n continue;\n }\n }\n // maximum of 2 pointers per interaction\n else if (interaction.pointerIds.length >= 2) {\n continue;\n }\n\n if (!interaction.interacting() && (mouseEvent === interaction.mouse)) {\n return interaction;\n }\n }\n\n return null;\n },\n};\n\nmodule.exports = finder;\n","const win = require('./window');\nconst isWindow = require('./isWindow');\n\nconst is = {\n array : () => {},\n\n window : thing => thing === win.window || isWindow(thing),\n\n docFrag : thing => is.object(thing) && thing.nodeType === 11,\n\n object : thing => !!thing && (typeof thing === 'object'),\n\n function: thing => typeof thing === 'function',\n\n number : thing => typeof thing === 'number' ,\n\n bool : thing => typeof thing === 'boolean' ,\n\n string : thing => typeof thing === 'string' ,\n\n element: thing => {\n if (!thing || (typeof thing !== 'object')) { return false; }\n\n const _window = win.getWindow(thing) || win.window;\n\n return (/object|function/.test(typeof _window.Element)\n ? thing instanceof _window.Element //DOM2\n : thing.nodeType === 1 && typeof thing.nodeName === 'string');\n },\n};\n\nis.array = thing => (is.object(thing)\n && (typeof thing.length !== 'undefined')\n && is.function(thing.splice));\n\nmodule.exports = is;\n","module.exports = (thing) => !!(thing && thing.Window) && (thing instanceof thing.Window);\n","function pointerExtend (dest, source) {\n for (const prop in source) {\n const prefixedPropREs = module.exports.prefixedPropREs;\n let deprecated = false;\n\n // skip deprecated prefixed properties\n for (const vendor in prefixedPropREs) {\n if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) {\n deprecated = true;\n break;\n }\n }\n\n if (!deprecated && typeof source[prop] !== 'function') {\n dest[prop] = source[prop];\n }\n }\n return dest;\n}\n\npointerExtend.prefixedPropREs = {\n webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/,\n};\n\nmodule.exports = pointerExtend;\n","const hypot = require('./hypot');\nconst browser = require('./browser');\nconst dom = require('./domObjects');\nconst domUtils = require('./domUtils');\nconst is = require('./is');\nconst pointerExtend = require('./pointerExtend');\n\nconst pointerUtils = {\n copyCoords: function (dest, src) {\n dest.page = dest.page || {};\n dest.page.x = src.page.x;\n dest.page.y = src.page.y;\n\n dest.client = dest.client || {};\n dest.client.x = src.client.x;\n dest.client.y = src.client.y;\n\n dest.timeStamp = src.timeStamp;\n },\n\n setCoordDeltas: function (targetObj, prev, cur) {\n targetObj.page.x = cur.page.x - prev.page.x;\n targetObj.page.y = cur.page.y - prev.page.y;\n targetObj.client.x = cur.client.x - prev.client.x;\n targetObj.client.y = cur.client.y - prev.client.y;\n targetObj.timeStamp = cur.timeStamp - prev.timeStamp;\n\n // set pointer velocity\n const dt = Math.max(targetObj.timeStamp / 1000, 0.001);\n\n targetObj.page.speed = hypot(targetObj.page.x, targetObj.page.y) / dt;\n targetObj.page.vx = targetObj.page.x / dt;\n targetObj.page.vy = targetObj.page.y / dt;\n\n targetObj.client.speed = hypot(targetObj.client.x, targetObj.page.y) / dt;\n targetObj.client.vx = targetObj.client.x / dt;\n targetObj.client.vy = targetObj.client.y / dt;\n },\n\n isNativePointer: function (pointer) {\n return (pointer instanceof dom.Event || pointer instanceof dom.Touch);\n },\n\n // Get specified X/Y coords for mouse or event.touches[0]\n getXY: function (type, pointer, xy) {\n xy = xy || {};\n type = type || 'page';\n\n xy.x = pointer[type + 'X'];\n xy.y = pointer[type + 'Y'];\n\n return xy;\n },\n\n getPageXY: function (pointer, page) {\n page = page || {};\n\n // Opera Mobile handles the viewport and scrolling oddly\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n pointerUtils.getXY('screen', pointer, page);\n\n page.x += window.scrollX;\n page.y += window.scrollY;\n }\n else {\n pointerUtils.getXY('page', pointer, page);\n }\n\n return page;\n },\n\n getClientXY: function (pointer, client) {\n client = client || {};\n\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n // Opera Mobile handles the viewport and scrolling oddly\n pointerUtils.getXY('screen', pointer, client);\n }\n else {\n pointerUtils.getXY('client', pointer, client);\n }\n\n return client;\n },\n\n getPointerId: function (pointer) {\n return is.number(pointer.pointerId)? pointer.pointerId : pointer.identifier;\n },\n\n setCoords: function (targetObj, pointers, timeStamp) {\n const pointer = (pointers.length > 1\n ? pointerUtils.pointerAverage(pointers)\n : pointers[0]);\n\n const tmpXY = {};\n\n pointerUtils.getPageXY(pointer, tmpXY);\n targetObj.page.x = tmpXY.x;\n targetObj.page.y = tmpXY.y;\n\n pointerUtils.getClientXY(pointer, tmpXY);\n targetObj.client.x = tmpXY.x;\n targetObj.client.y = tmpXY.y;\n\n targetObj.timeStamp = is.number(timeStamp) ? timeStamp :new Date().getTime();\n },\n\n pointerExtend: pointerExtend,\n\n getTouchPair: function (event) {\n const touches = [];\n\n // array of touches is supplied\n if (is.array(event)) {\n touches[0] = event[0];\n touches[1] = event[1];\n }\n // an event\n else {\n if (event.type === 'touchend') {\n if (event.touches.length === 1) {\n touches[0] = event.touches[0];\n touches[1] = event.changedTouches[0];\n }\n else if (event.touches.length === 0) {\n touches[0] = event.changedTouches[0];\n touches[1] = event.changedTouches[1];\n }\n }\n else {\n touches[0] = event.touches[0];\n touches[1] = event.touches[1];\n }\n }\n\n return touches;\n },\n\n pointerAverage: function (pointers) {\n const average = {\n pageX : 0,\n pageY : 0,\n clientX: 0,\n clientY: 0,\n screenX: 0,\n screenY: 0,\n };\n\n for (const pointer of pointers) {\n for (const prop in average) {\n average[prop] += pointer[prop];\n }\n }\n for (const prop in average) {\n average[prop] /= pointers.length;\n }\n\n return average;\n },\n\n touchBBox: function (event) {\n if (!event.length && !(event.touches && event.touches.length > 1)) {\n return;\n }\n\n const touches = pointerUtils.getTouchPair(event);\n const minX = Math.min(touches[0].pageX, touches[1].pageX);\n const minY = Math.min(touches[0].pageY, touches[1].pageY);\n const maxX = Math.max(touches[0].pageX, touches[1].pageX);\n const maxY = Math.max(touches[0].pageY, touches[1].pageY);\n\n return {\n x: minX,\n y: minY,\n left: minX,\n top: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n },\n\n touchDistance: function (event, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n\n\n const dx = touches[0][sourceX] - touches[1][sourceX];\n const dy = touches[0][sourceY] - touches[1][sourceY];\n\n return hypot(dx, dy);\n },\n\n touchAngle: function (event, prevAngle, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n const dx = touches[1][sourceX] - touches[0][sourceX];\n const dy = touches[1][sourceY] - touches[0][sourceY];\n const angle = 180 * Math.atan2(dy , dx) / Math.PI;\n\n return angle;\n },\n\n getPointerType: function (pointer, interaction) {\n // if the PointerEvent API isn't available, then the pointer must be ither\n // a MouseEvent or TouchEvent\n if (interaction.mouse) { return 'mouse'; }\n if (!browser.supportsPointerEvent) { return 'touch'; }\n\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : [undefined, undefined,'touch', 'pen', 'mouse'][pointer.pointerType];\n },\n\n // [ event.target, event.currentTarget ]\n getEventTargets: function (event) {\n return [\n domUtils.getActualElement(event.path ? event.path[0] : event.target),\n domUtils.getActualElement(event.currentTarget),\n ];\n },\n};\n\nmodule.exports = pointerUtils;\n","const { window } = require('./window');\n\nconst vendors = ['ms', 'moz', 'webkit', 'o'];\nlet lastTime = 0;\nlet request;\nlet cancel;\n\nfor (let x = 0; x < vendors.length && !window.requestAnimationFrame; x++) {\n request = window[vendors[x] + 'RequestAnimationFrame'];\n cancel = window[vendors[x] +'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n}\n\nif (!request) {\n request = function (callback) {\n const currTime = new Date().getTime();\n const timeToCall = Math.max(0, 16 - (currTime - lastTime));\n const id = setTimeout(function () { callback(currTime + timeToCall); },\n timeToCall);\n\n lastTime = currTime + timeToCall;\n return id;\n };\n}\n\nif (!cancel) {\n cancel = function (id) {\n clearTimeout(id);\n };\n}\n\nmodule.exports = {\n request,\n cancel,\n};\n","const extend = require('./extend');\nconst is = require('./is');\nconst {\n closest,\n parentNode,\n getElementRect,\n} = require('./domUtils');\n\nconst rectUtils = {\n getStringOptionResult: function (value, interactable, element) {\n if (!is.string(value)) {\n return null;\n }\n\n if (value === 'parent') {\n value = parentNode(element);\n }\n else if (value === 'self') {\n value = interactable.getRect(element);\n }\n else {\n value = closest(element, value);\n }\n\n return value;\n },\n\n resolveRectLike: function (value, interactable, element, functionArgs) {\n value = rectUtils.getStringOptionResult(value, interactable, element) || value;\n\n if (is.function(value)) {\n value = value.apply(null, functionArgs);\n }\n\n if (is.element(value)) {\n value = getElementRect(value);\n }\n\n return value;\n },\n\n rectToXY: function (rect) {\n return rect && {\n x: 'x' in rect ? rect.x : rect.left,\n y: 'y' in rect ? rect.y : rect.top,\n };\n },\n\n xywhToTlbr: function (rect) {\n if (rect && !('left' in rect && 'top' in rect)) {\n rect = extend({}, rect);\n\n rect.left = rect.x || 0;\n rect.top = rect.y || 0;\n rect.right = rect.right || (rect.left + rect.width);\n rect.bottom = rect.bottom || (rect.top + rect.height);\n }\n\n return rect;\n },\n\n tlbrToXywh: function (rect) {\n if (rect && !('x' in rect && 'y' in rect)) {\n rect = extend({}, rect);\n\n rect.x = rect.left || 0;\n rect.top = rect.top || 0;\n rect.width = rect.width || (rect.right - rect.x);\n rect.height = rect.height || (rect.bottom - rect.y);\n }\n\n return rect;\n },\n};\n\nmodule.exports = rectUtils;\n","const win = module.exports;\nconst isWindow = require('./isWindow');\n\nfunction init (window) {\n // get wrapped window if using Shadow DOM polyfill\n\n win.realWindow = window;\n\n // create a TextNode\n const el = window.document.createTextNode('');\n\n // check if it's wrapped by a polyfill\n if (el.ownerDocument !== window.document\n && typeof window.wrap === 'function'\n && window.wrap(el) === el) {\n // use wrapped window\n window = window.wrap(window);\n }\n\n win.window = window;\n}\n\nif (typeof window === 'undefined') {\n win.window = undefined;\n win.realWindow = undefined;\n}\nelse {\n init(window);\n}\n\nwin.getWindow = function getWindow (node) {\n if (isWindow(node)) {\n return node;\n }\n\n const rootNode = (node.ownerDocument || node);\n\n return rootNode.defaultView || rootNode.parentWindow || win.window;\n};\n\nwin.init = init;\n"]} \ No newline at end of file +{"version":3,"sources":["src/header.js","node_modules/browser-pack/_prelude.js","index.js","src/Eventable.js","src/InteractEvent.js","src/Interactable.js","src/Interaction.js","src/actions/base.js","src/actions/drag.js","src/actions/drop.js","src/actions/gesture.js","src/actions/resize.js","src/autoScroll.js","src/autoStart/InteractableMethods.js","src/autoStart/base.js","src/autoStart/delay.js","src/autoStart/drag.js","src/autoStart/gesture.js","src/autoStart/resize.js","src/defaultOptions.js","src/index.js","src/inertia.js","src/interact.js","src/interactablePreventDefault.js","src/legacyBrowsers.js","src/modifiers/index.js","src/modifiers/restrict.js","src/modifiers/restrictEdges.js","src/modifiers/restrictSize.js","src/modifiers/snap.js","src/modifiers/snapSize.js","src/pointerEvents/PointerEvent.js","src/pointerEvents/base.js","src/pointerEvents/holdRepeat.js","src/pointerEvents/interactableTargets.js","src/scope.js","src/utils/Signals.js","src/utils/arr.js","src/utils/browser.js","src/utils/domObjects.js","src/utils/domUtils.js","src/utils/events.js","src/utils/extend.js","src/utils/getOriginXY.js","src/utils/hypot.js","src/utils/index.js","src/utils/interactionFinder.js","src/utils/is.js","src/utils/isWindow.js","src/utils/pointerExtend.js","src/utils/pointerUtils.js","src/utils/raf.js","src/utils/rect.js","src/utils/window.js"],"names":[],"mappings":"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","file":"interact.js","sourceRoot":"","sourcesContent":["/**\n * interact.js v1.3.0-alpha.4+sha.7970416-dirty\n *\n * Copyright (c) 2012-2017 Taye Adeyemi \n * Open source under the MIT License.\n * https://raw.github.com/taye/interact.js/master/LICENSE\n */\n","(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o 150) {\n return null;\n }\n\n let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI;\n const overlap = 22.5;\n\n if (angle < 0) {\n angle += 360;\n }\n\n const left = 135 - overlap <= angle && angle < 225 + overlap;\n const up = 225 - overlap <= angle && angle < 315 + overlap;\n\n const right = !left && (315 - overlap <= angle || angle < 45 + overlap);\n const down = !up && 45 - overlap <= angle && angle < 135 + overlap;\n\n return {\n up,\n down,\n left,\n right,\n angle,\n speed: interaction.prevEvent.speed,\n velocity: {\n x: interaction.prevEvent.velocityX,\n y: interaction.prevEvent.velocityY,\n },\n };\n }\n\n preventDefault () {}\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n}\n\nsignals.on('set-delta', function ({ iEvent, interaction, starting, deltaSource }) {\n const prevEvent = starting? iEvent : interaction.prevEvent;\n\n if (deltaSource === 'client') {\n iEvent.dx = iEvent.clientX - prevEvent.clientX;\n iEvent.dy = iEvent.clientY - prevEvent.clientY;\n }\n else {\n iEvent.dx = iEvent.pageX - prevEvent.pageX;\n iEvent.dy = iEvent.pageY - prevEvent.pageY;\n }\n});\n\nInteractEvent.signals = signals;\n\nmodule.exports = InteractEvent;\n","const is = require('./utils/is');\nconst events = require('./utils/events');\nconst extend = require('./utils/extend');\nconst actions = require('./actions/base');\nconst scope = require('./scope');\nconst Eventable = require('./Eventable');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nconst {\n getElementRect,\n nodeContains,\n trySelector,\n} = require('./utils/domUtils');\nconst { getWindow } = require('./utils/window');\nconst { indexOf, contains } = require('./utils/arr');\nconst { wheelEvent } = require('./utils/browser');\n\n// all set interactables\nscope.interactables = [];\n\n/*\\\n * Interactable\n [ property ]\n **\n * Object type returned by @interact\n\\*/\nclass Interactable {\n constructor (target, options) {\n options = options || {};\n\n this.target = target;\n this.events = new Eventable();\n this._context = options.context || scope.document;\n this._win = getWindow(trySelector(target)? this._context : target);\n this._doc = this._win.document;\n\n signals.fire('new', {\n target,\n options,\n interactable: this,\n win: this._win,\n });\n\n scope.addDocument( this._doc, this._win );\n\n scope.interactables.push(this);\n\n this.set(options);\n }\n\n setOnEvents (action, phases) {\n const onAction = 'on' + action;\n\n if (is.function(phases.onstart) ) { this.events[onAction + 'start' ] = phases.onstart ; }\n if (is.function(phases.onmove) ) { this.events[onAction + 'move' ] = phases.onmove ; }\n if (is.function(phases.onend) ) { this.events[onAction + 'end' ] = phases.onend ; }\n if (is.function(phases.oninertiastart)) { this.events[onAction + 'inertiastart' ] = phases.oninertiastart ; }\n\n return this;\n }\n\n setPerAction (action, options) {\n // for all the default per-action options\n for (const option in options) {\n // if this option exists for this action\n if (option in defaults[action]) {\n // if the option in the options arg is an object value\n if (is.object(options[option])) {\n // duplicate the object\n this.options[action][option] = extend(this.options[action][option] || {}, options[option]);\n\n if (is.object(defaults.perAction[option]) && 'enabled' in defaults.perAction[option]) {\n this.options[action][option].enabled = options[option].enabled === false? false : true;\n }\n }\n else if (is.bool(options[option]) && is.object(defaults.perAction[option])) {\n this.options[action][option].enabled = options[option];\n }\n else if (options[option] !== undefined) {\n // or if it's not undefined, do a plain assignment\n this.options[action][option] = options[option];\n }\n }\n }\n }\n\n /*\\\n * Interactable.getRect\n [ method ]\n *\n * The default function to get an Interactables bounding rect. Can be\n * overridden using @Interactable.rectChecker.\n *\n - element (Element) #optional The element to measure.\n = (object) The object's bounding rectangle.\n o {\n o top : 0,\n o left : 0,\n o bottom: 0,\n o right : 0,\n o width : 0,\n o height: 0\n o }\n \\*/\n getRect (element) {\n element = element || this.target;\n\n if (is.string(this.target) && !(is.element(element))) {\n element = this._context.querySelector(this.target);\n }\n\n return getElementRect(element);\n }\n\n /*\\\n * Interactable.rectChecker\n [ method ]\n *\n * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n - checker (function) #optional A function which returns this Interactable's bounding rectangle. See @Interactable.getRect\n = (function | object) The checker function or this Interactable\n \\*/\n rectChecker (checker) {\n if (is.function(checker)) {\n this.getRect = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.getRect;\n\n return this;\n }\n\n return this.getRect;\n }\n\n _backCompatOption (optionName, newValue) {\n if (trySelector(newValue) || is.object(newValue)) {\n this.options[optionName] = newValue;\n\n for (const action of actions.names) {\n this.options[action][optionName] = newValue;\n }\n\n return this;\n }\n\n return this.options[optionName];\n }\n\n /*\\\n * Interactable.origin\n [ method ]\n *\n * Gets or sets the origin of the Interactable's element. The x and y\n * of the origin will be subtracted from action event coordinates.\n *\n - origin (object | string) #optional An object eg. { x: 0, y: 0 } or string 'parent', 'self' or any CSS selector\n * OR\n - origin (Element) #optional An HTML or SVG Element whose rect will be used\n **\n = (object) The current origin or this Interactable\n \\*/\n origin (newValue) {\n return this._backCompatOption('origin', newValue);\n }\n\n /*\\\n * Interactable.deltaSource\n [ method ]\n *\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n - newValue (string) #optional Use 'client' if you will be scrolling while interacting; Use 'page' if you want autoScroll to work\n = (string | object) The current deltaSource or this Interactable\n \\*/\n deltaSource (newValue) {\n if (newValue === 'page' || newValue === 'client') {\n this.options.deltaSource = newValue;\n\n return this;\n }\n\n return this.options.deltaSource;\n }\n\n /*\\\n * Interactable.context\n [ method ]\n *\n * Gets the selector context Node of the Interactable. The default is `window.document`.\n *\n = (Node) The context Node of this Interactable\n **\n \\*/\n context () {\n return this._context;\n }\n\n inContext (element) {\n return (this._context === element.ownerDocument\n || nodeContains(this._context, element));\n }\n\n /*\\\n * Interactable.fire\n [ method ]\n *\n * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n - iEvent (InteractEvent) The InteractEvent object to be fired on this Interactable\n = (Interactable) this Interactable\n \\*/\n fire (iEvent) {\n this.events.fire(iEvent);\n\n return this;\n }\n\n _onOffMultiple (method, eventType, listener, options) {\n if (is.string(eventType) && eventType.search(' ') !== -1) {\n eventType = eventType.trim().split(/ +/);\n }\n\n if (is.array(eventType)) {\n for (let i = 0; i < eventType.length; i++) {\n this[method](eventType[i], listener, options);\n }\n\n return true;\n }\n\n if (is.object(eventType)) {\n for (const prop in eventType) {\n this[method](prop, eventType[prop], listener);\n }\n\n return true;\n }\n }\n\n /*\\\n * Interactable.on\n [ method ]\n *\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n - eventType (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) This Interactable\n \\*/\n on (eventType, listener, options) {\n if (this._onOffMultiple('on', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.on(eventType, listener);\n }\n // delegated event for selector\n else if (is.string(this.target)) {\n events.addDelegate(this.target, this._context, eventType, listener, options);\n }\n else {\n events.add(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.off\n [ method ]\n *\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n - eventType (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) This Interactable\n \\*/\n off (eventType, listener, options) {\n if (this._onOffMultiple('off', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n // if it is an action event type\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.off(eventType, listener);\n }\n // delegated event\n else if (is.string(this.target)) {\n events.removeDelegate(this.target, this._context, eventType, listener, options);\n }\n // remove listener from this Interatable's element\n else {\n events.remove(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.set\n [ method ]\n *\n * Reset the options of this Interactable\n - options (object) The new settings to apply\n = (object) This Interactable\n \\*/\n set (options) {\n if (!is.object(options)) {\n options = {};\n }\n\n this.options = extend({}, defaults.base);\n\n const perActions = extend({}, defaults.perAction);\n\n for (const actionName in actions.methodDict) {\n const methodName = actions.methodDict[actionName];\n\n this.options[actionName] = extend({}, defaults[actionName]);\n\n this.setPerAction(actionName, perActions);\n\n this[methodName](options[actionName]);\n }\n\n for (const setting of Interactable.settingsMethods) {\n this.options[setting] = defaults.base[setting];\n\n if (setting in options) {\n this[setting](options[setting]);\n }\n }\n\n signals.fire('set', {\n options,\n interactable: this,\n });\n\n return this;\n }\n\n /*\\\n * Interactable.unset\n [ method ]\n *\n * Remove this interactable from the list of interactables and remove\n * it's action capabilities and event listeners\n *\n = (object) @interact\n \\*/\n unset () {\n events.remove(this.target, 'all');\n\n if (is.string(this.target)) {\n // remove delegated events\n for (const type in events.delegatedEvents) {\n const delegated = events.delegatedEvents[type];\n\n if (delegated.selectors[0] === this.target\n && delegated.contexts[0] === this._context) {\n\n delegated.selectors.splice(0, 1);\n delegated.contexts .splice(0, 1);\n delegated.listeners.splice(0, 1);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegated[type] = null;\n }\n }\n\n events.remove(this._context, type, events.delegateListener);\n events.remove(this._context, type, events.delegateUseCapture, true);\n }\n }\n else {\n events.remove(this, 'all');\n }\n\n signals.fire('unset', { interactable: this });\n\n scope.interactables.splice(indexOf(scope.interactables, this), 1);\n\n // Stop related interactions when an Interactable is unset\n for (const interaction of scope.interactions || []) {\n if (interaction.target === this && interaction.interacting()) {\n interaction.stop();\n }\n }\n\n return scope.interact;\n }\n}\n\nscope.interactables.indexOfElement = function indexOfElement (target, context) {\n context = context || scope.document;\n\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n if (interactable.target === target && interactable._context === context) {\n return i;\n }\n }\n return -1;\n};\n\nscope.interactables.get = function interactableGet (element, options, dontCheckInContext) {\n const ret = this[this.indexOfElement(element, options && options.context)];\n\n return ret && (is.string(element) || dontCheckInContext || ret.inContext(element))? ret : null;\n};\n\nscope.interactables.forEachSelector = function (callback, element) {\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n // skip non CSS selector targets and out of context elements\n if (!is.string(interactable.target)\n || (element && !interactable.inContext(element))) {\n continue;\n }\n\n const ret = callback(interactable, interactable.target, interactable._context, i, this);\n\n if (ret !== undefined) {\n return ret;\n }\n }\n};\n\n// all interact.js eventTypes\nInteractable.eventTypes = scope.eventTypes = [];\n\nInteractable.signals = signals;\n\nInteractable.settingsMethods = [ 'deltaSource', 'origin', 'preventDefault', 'rectChecker' ];\n\nmodule.exports = Interactable;\n","const scope = require('./scope');\nconst utils = require('./utils');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst domObjects = require('./utils/domObjects');\nconst finder = require('./utils/interactionFinder');\nconst signals = require('./utils/Signals').new();\n\nconst listeners = {};\nconst methodNames = [\n 'pointerDown', 'pointerMove', 'pointerUp',\n 'updatePointer', 'removePointer',\n];\n\n// for ignoring browser's simulated mouse events\nlet prevTouchTime = 0;\n\n// all active and idle interactions\nscope.interactions = [];\n\nclass Interaction {\n constructor ({ pointerType }) {\n this.target = null; // current interactable being interacted with\n this.element = null; // the target element of the interactable\n\n this.prepared = { // action that's ready to be fired on next move event\n name : null,\n axis : null,\n edges: null,\n };\n\n // keep track of added pointers\n this.pointers = [];\n this.pointerIds = [];\n this.downTargets = [];\n this.downTimes = [];\n\n // Previous native pointer move event coordinates\n this.prevCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n // current native pointer move event coordinates\n this.curCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Starting InteractEvent pointer coordinates\n this.startCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Change in coordinates and time of the pointer\n this.pointerDelta = {\n page : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n client : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n timeStamp: 0,\n };\n\n this.downEvent = null; // pointerdown/mousedown/touchstart event\n this.downPointer = {};\n\n this._eventTarget = null;\n this._curEventTarget = null;\n\n this.prevEvent = null; // previous action event\n\n this.pointerIsDown = false;\n this.pointerWasMoved = false;\n this._interacting = false;\n\n this.pointerType = pointerType;\n\n signals.fire('new', this);\n\n scope.interactions.push(this);\n }\n\n pointerDown (pointer, event, eventTarget) {\n const pointerIndex = this.updatePointer(pointer, event, true);\n\n signals.fire('down', {\n pointer,\n event,\n eventTarget,\n pointerIndex,\n interaction: this,\n });\n }\n\n /*\\\n * Interaction.start\n [ method ]\n *\n * Start an action with the given Interactable and Element as tartgets. The\n * action must be enabled for the target Interactable and an appropriate number\n * of pointers must be held down - 1 for drag/resize, 2 for gesture.\n *\n * Use it with `interactable.able({ manualStart: false })` to always\n * [start actions manually](https://github.com/taye/interact.js/issues/114)\n *\n - action (object) The action to be performed - drag, resize, etc.\n - target (Interactable) The Interactable to target\n - element (Element) The DOM Element to target\n = (object) interact\n **\n | interact(target)\n | .draggable({\n | // disable the default drag start by down->move\n | manualStart: true\n | })\n | // start dragging after the user holds the pointer down\n | .on('hold', function (event) {\n | var interaction = event.interaction;\n |\n | if (!interaction.interacting()) {\n | interaction.start({ name: 'drag' },\n | event.interactable,\n | event.currentTarget);\n | }\n | });\n \\*/\n start (action, target, element) {\n if (this.interacting()\n || !this.pointerIsDown\n || this.pointerIds.length < (action.name === 'gesture'? 2 : 1)) {\n return;\n }\n\n // if this interaction had been removed after stopping\n // add it back\n if (utils.indexOf(scope.interactions, this) === -1) {\n scope.interactions.push(this);\n }\n\n utils.copyAction(this.prepared, action);\n this.target = target;\n this.element = element;\n\n signals.fire('action-start', {\n interaction: this,\n event: this.downEvent,\n });\n }\n\n pointerMove (pointer, event, eventTarget) {\n if (!this.simulation) {\n this.updatePointer(pointer);\n utils.setCoords(this.curCoords, this.pointers);\n }\n\n const duplicateMove = (this.curCoords.page.x === this.prevCoords.page.x\n && this.curCoords.page.y === this.prevCoords.page.y\n && this.curCoords.client.x === this.prevCoords.client.x\n && this.curCoords.client.y === this.prevCoords.client.y);\n\n let dx;\n let dy;\n\n // register movement greater than pointerMoveTolerance\n if (this.pointerIsDown && !this.pointerWasMoved) {\n dx = this.curCoords.client.x - this.startCoords.client.x;\n dy = this.curCoords.client.y - this.startCoords.client.y;\n\n this.pointerWasMoved = utils.hypot(dx, dy) > Interaction.pointerMoveTolerance;\n }\n\n const signalArg = {\n pointer,\n pointerIndex: this.getPointerIndex(pointer),\n event,\n eventTarget,\n dx,\n dy,\n duplicate: duplicateMove,\n interaction: this,\n interactingBeforeMove: this.interacting(),\n };\n\n if (!duplicateMove) {\n // set pointer coordinate, time changes and speeds\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n }\n\n signals.fire('move', signalArg);\n\n if (!duplicateMove) {\n // if interacting, fire an 'action-move' signal etc\n if (this.interacting()) {\n this.doMove(signalArg);\n }\n\n if (this.pointerWasMoved) {\n utils.copyCoords(this.prevCoords, this.curCoords);\n }\n }\n }\n\n /*\\\n * Interaction.doMove\n [ method ]\n *\n * Force a move of the current action at the same coordinates. Useful if\n * snap/restrict has been changed and you want a movement with the new\n * settings.\n *\n **\n | interact(target)\n | .draggable(true)\n | .on('dragmove', function (event) {\n | if (someCondition) {\n | // change the snap settings\n | event.interactable.draggable({ snap: { targets: [] }});\n | // fire another move event with re-calculated snap\n | event.interaction.doMove();\n | }\n | });\n \\*/\n doMove (signalArg) {\n signalArg = utils.extend({\n pointer: this.pointers[0],\n event: this.prevEvent,\n eventTarget: this._eventTarget,\n interaction: this,\n }, signalArg || {});\n\n signals.fire('before-action-move', signalArg);\n\n if (!this._dontFireMove) {\n signals.fire('action-move', signalArg);\n }\n\n this._dontFireMove = false;\n }\n\n // End interact move events and stop auto-scroll unless simulation is running\n pointerUp (pointer, event, eventTarget, curEventTarget) {\n const pointerIndex = this.getPointerIndex(pointer);\n\n signals.fire(/cancel$/i.test(event.type)? 'cancel' : 'up', {\n pointer,\n pointerIndex,\n event,\n eventTarget,\n curEventTarget,\n interaction: this,\n });\n\n if (!this.simulation) {\n this.end(event);\n }\n\n this.pointerIsDown = false;\n this.removePointer(pointer, event);\n }\n\n /*\\\n * Interaction.end\n [ method ]\n *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n - event (PointerEvent) #optional\n **\n | interact(target)\n | .draggable(true)\n | .on('move', function (event) {\n | if (event.pageX > 1000) {\n | // end the current action\n | event.interaction.end();\n | // stop all further listeners from being called\n | event.stopImmediatePropagation();\n | }\n | });\n \\*/\n end (event) {\n event = event || this.prevEvent;\n\n if (this.interacting()) {\n signals.fire('action-end', {\n event,\n interaction: this,\n });\n }\n\n this.stop();\n }\n\n currentAction () {\n return this._interacting? this.prepared.name: null;\n }\n\n interacting () {\n return this._interacting;\n }\n\n stop () {\n signals.fire('stop', { interaction: this });\n\n if (this._interacting) {\n signals.fire('stop-active', { interaction: this });\n signals.fire('stop-' + this.prepared.name, { interaction: this });\n }\n\n this.target = this.element = null;\n\n this._interacting = false;\n this.prepared.name = this.prevEvent = null;\n }\n\n getPointerIndex (pointer) {\n // mouse and pen interactions may have only one pointer\n if (this.pointerType === 'mouse' || this.pointerType === 'pen') {\n return 0;\n }\n\n return utils.indexOf(this.pointerIds, utils.getPointerId(pointer));\n }\n\n updatePointer (pointer, event, down = event && /(down|start)$/i.test(event.type)) {\n const id = utils.getPointerId(pointer);\n let index = this.getPointerIndex(pointer);\n\n if (index === -1) {\n index = this.pointerIds.length;\n this.pointerIds[index] = id;\n }\n\n if (down) {\n signals.fire('update-pointer-down', {\n pointer,\n event,\n down,\n pointerId: id,\n pointerIndex: index,\n interaction: this,\n });\n }\n\n this.pointers[index] = pointer;\n\n return index;\n }\n\n removePointer (pointer, event) {\n const index = this.getPointerIndex(pointer);\n\n if (index === -1) { return; }\n\n signals.fire('remove-pointer', {\n pointer,\n event,\n pointerIndex: index,\n interaction: this,\n });\n\n this.pointers .splice(index, 1);\n this.pointerIds .splice(index, 1);\n this.downTargets.splice(index, 1);\n this.downTimes .splice(index, 1);\n }\n\n _updateEventTargets (target, currentTarget) {\n this._eventTarget = target;\n this._curEventTarget = currentTarget;\n }\n}\n\nfor (let i = 0, len = methodNames.length; i < len; i++) {\n const method = methodNames[i];\n\n listeners[method] = doOnInteractions(method);\n}\n\nfunction doOnInteractions (method) {\n return (function (event) {\n const pointerType = utils.getPointerType(event);\n const [eventTarget, curEventTarget] = utils.getEventTargets(event);\n const matches = []; // [ [pointer, interaction], ...]\n\n if (browser.supportsTouch && /touch/.test(event.type)) {\n prevTouchTime = new Date().getTime();\n\n for (let i = 0; i < event.changedTouches.length; i++) {\n const pointer = event.changedTouches[i];\n const interaction = finder.search(pointer, event.type, eventTarget);\n\n matches.push([pointer, interaction || new Interaction({ pointerType })]);\n }\n }\n else {\n let invalidPointer = false;\n\n if (!browser.supportsPointerEvent && /mouse/.test(event.type)) {\n // ignore mouse events while touch interactions are active\n for (let i = 0; i < scope.interactions.length && !invalidPointer; i++) {\n invalidPointer = scope.interactions[i].pointerType !== 'mouse' && scope.interactions[i].pointerIsDown;\n }\n\n // try to ignore mouse events that are simulated by the browser\n // after a touch event\n invalidPointer = invalidPointer\n || (new Date().getTime() - prevTouchTime < 500)\n // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated\n || event.timeStamp === 0;\n }\n\n if (!invalidPointer) {\n let interaction = finder.search(event, event.type, eventTarget);\n\n if (!interaction) {\n interaction = new Interaction({ pointerType });\n }\n\n matches.push([event, interaction]);\n }\n }\n\n for (const [pointer, interaction] of matches) {\n interaction._updateEventTargets(eventTarget, curEventTarget);\n interaction[method](pointer, event, eventTarget, curEventTarget);\n }\n });\n}\n\nfunction endAll (event) {\n for (let i = 0; i < scope.interactions.length; i++) {\n const interaction = scope.interactions[i];\n\n interaction.end(event);\n signals.fire('endall', { event, interaction });\n }\n}\n\nconst docEvents = { /* 'eventType': listenerFunc */ };\nconst pEventTypes = browser.pEventTypes;\n\nif (domObjects.PointerEvent) {\n docEvents[pEventTypes.down ] = listeners.pointerDown;\n docEvents[pEventTypes.move ] = listeners.pointerMove;\n docEvents[pEventTypes.up ] = listeners.pointerUp;\n docEvents[pEventTypes.cancel] = listeners.pointerUp;\n}\nelse {\n docEvents.mousedown = listeners.pointerDown;\n docEvents.mousemove = listeners.pointerMove;\n docEvents.mouseup = listeners.pointerUp;\n\n docEvents.touchstart = listeners.pointerDown;\n docEvents.touchmove = listeners.pointerMove;\n docEvents.touchend = listeners.pointerUp;\n docEvents.touchcancel = listeners.pointerUp;\n}\n\ndocEvents.blur = endAll;\n\nfunction onDocSignal ({ doc }, signalName) {\n const eventMethod = signalName.indexOf('add') === 0\n ? events.add : events.remove;\n\n // delegate event listener\n for (const eventType in scope.delegatedEvents) {\n eventMethod(doc, eventType, events.delegateListener);\n eventMethod(doc, eventType, events.delegateUseCapture, true);\n }\n\n for (const eventType in docEvents) {\n eventMethod(doc, eventType, docEvents[eventType]);\n }\n}\n\nsignals.on('update-pointer-down', ({ interaction, pointer, pointerId, pointerIndex, event, eventTarget, down }) => {\n interaction.pointerIds[pointerIndex] = pointerId;\n interaction.pointers[pointerIndex] = pointer;\n\n if (down) {\n interaction.pointerIsDown = true;\n }\n\n if (!interaction.interacting()) {\n utils.setCoords(interaction.startCoords, interaction.pointers);\n\n utils.copyCoords(interaction.curCoords , interaction.startCoords);\n utils.copyCoords(interaction.prevCoords, interaction.startCoords);\n\n interaction.downEvent = event;\n interaction.downTimes[pointerIndex] = interaction.curCoords.timeStamp;\n interaction.downTargets[pointerIndex] = eventTarget || event && utils.getEventTargets(event)[0];\n interaction.pointerWasMoved = false;\n\n utils.pointerExtend(interaction.downPointer, pointer);\n }\n});\n\nscope.signals.on('add-document' , onDocSignal);\nscope.signals.on('remove-document', onDocSignal);\n\nInteraction.pointerMoveTolerance = 1;\nInteraction.doOnInteractions = doOnInteractions;\nInteraction.endAll = endAll;\nInteraction.signals = signals;\nInteraction.docEvents = docEvents;\n\nscope.endAllInteractions = endAll;\n\nmodule.exports = Interaction;\n","const Interaction = require('../Interaction');\nconst InteractEvent = require('../InteractEvent');\n\nconst actions = {\n firePrepared,\n names: [],\n methodDict: {},\n};\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n interaction._interacting = true;\n firePrepared(interaction, event, 'start');\n});\n\nInteraction.signals.on('action-move', function ({ interaction, event, preEnd }) {\n firePrepared(interaction, event, 'move', preEnd);\n\n // if the action was ended in a listener\n if (!interaction.interacting()) { return false; }\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n firePrepared(interaction, event, 'end');\n});\n\nfunction firePrepared (interaction, event, phase, preEnd) {\n const actionName = interaction.prepared.name;\n\n const newEvent = new InteractEvent(interaction, event, actionName, phase, interaction.element, null, preEnd);\n\n interaction.target.fire(newEvent);\n interaction.prevEvent = newEvent;\n}\n\nmodule.exports = actions;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drag = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n startAxis : 'xy',\n lockAxis : 'xy',\n },\n\n checker: function (pointer, event, interactable) {\n const dragOptions = interactable.options.drag;\n\n return dragOptions.enabled\n ? { name: 'drag', axis: (dragOptions.lockAxis === 'start'\n ? dragOptions.startAxis\n : dragOptions.lockAxis)}\n : null;\n },\n\n getCursor: function () {\n return 'move';\n },\n};\n\nInteraction.signals.on('before-action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n interaction.curCoords.page.y = interaction.startCoords.page.y;\n interaction.curCoords.client.y = interaction.startCoords.client.y;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vx);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vx);\n interaction.pointerDelta.client.vy = 0;\n interaction.pointerDelta.page.vy = 0;\n }\n else if (axis === 'y') {\n interaction.curCoords.page.x = interaction.startCoords.page.x;\n interaction.curCoords.client.x = interaction.startCoords.client.x;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vy);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vy);\n interaction.pointerDelta.client.vx = 0;\n interaction.pointerDelta.page.vx = 0;\n }\n});\n\n// dragmove\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'dragmove') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n iEvent.pageY = interaction.startCoords.page.y;\n iEvent.clientY = interaction.startCoords.client.y;\n iEvent.dy = 0;\n }\n else if (axis === 'y') {\n iEvent.pageX = interaction.startCoords.page.x;\n iEvent.clientX = interaction.startCoords.client.x;\n iEvent.dx = 0;\n }\n});\n\n/*\\\n * Interactable.draggable\n [ method ]\n *\n * Gets or sets whether drag actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of drag events\n | var isDraggable = interact('ul li').draggable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on drag events (object makes the Interactable draggable)\n = (object) This Interactable\n | interact(element).draggable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // the axis in which the first movement must be\n | // for the drag sequence to start\n | // 'xy' by default - any direction\n | startAxis: 'x' || 'y' || 'xy',\n |\n | // 'xy' by default - don't restrict to one axis (move in any direction)\n | // 'x' or 'y' to restrict movement to either axis\n | // 'start' to restrict movement to the axis the drag started in\n | lockAxis: 'x' || 'y' || 'xy' || 'start',\n |\n | // max number of drags that can happen concurrently\n | // with elements of this Interactable. Infinity by default\n | max: Infinity,\n |\n | // max number of drags that can target the same element+Interactable\n | // 1 by default\n | maxPerElement: 2\n | });\n\\*/\nInteractable.prototype.draggable = function (options) {\n if (utils.is.object(options)) {\n this.options.drag.enabled = options.enabled === false? false: true;\n this.setPerAction('drag', options);\n this.setOnEvents('drag', options);\n\n if (/^(xy|x|y|start)$/.test(options.lockAxis)) {\n this.options.drag.lockAxis = options.lockAxis;\n }\n if (/^(xy|x|y)$/.test(options.startAxis)) {\n this.options.drag.startAxis = options.startAxis;\n }\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drag.enabled = options;\n\n if (!options) {\n this.ondragstart = this.ondragstart = this.ondragend = null;\n }\n\n return this;\n }\n\n return this.options.drag;\n};\n\nactions.drag = drag;\nactions.names.push('drag');\nutils.merge(Interactable.eventTypes, [\n 'dragstart',\n 'dragmove',\n 'draginertiastart',\n 'draginertiaresume',\n 'dragend',\n]);\nactions.methodDict.drag = 'draggable';\n\ndefaultOptions.drag = drag.defaults;\n\nmodule.exports = drag;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst scope = require('../scope');\nconst interact = require('../interact');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drop = {\n defaults: {\n enabled: false,\n accept : null,\n overlap: 'pointer',\n },\n};\n\nlet dynamicDrop = false;\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // reset active dropzones\n interaction.activeDrops.dropzones = [];\n interaction.activeDrops.elements = [];\n interaction.activeDrops.rects = [];\n\n interaction.dropEvents = null;\n\n if (!interaction.dynamicDrop) {\n setActiveDrops(interaction, interaction.element);\n }\n\n const dragEvent = interaction.prevEvent;\n const dropEvents = getDropEvents(interaction, event, dragEvent);\n\n if (dropEvents.activate) {\n fireActiveDrops(interaction, dropEvents.activate);\n }\n});\n\nInteractEvent.signals.on('new', function ({ interaction, iEvent, event }) {\n if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { return; }\n\n const draggableElement = interaction.element;\n const dragEvent = iEvent;\n const dropResult = getDrop(dragEvent, event, draggableElement);\n\n interaction.dropTarget = dropResult.dropzone;\n interaction.dropElement = dropResult.element;\n\n interaction.dropEvents = getDropEvents(interaction, event, dragEvent);\n});\n\nInteraction.signals.on('action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n fireDropEvents(interaction, interaction.dropEvents);\n});\n\nInteraction.signals.on('action-end', function ({ interaction }) {\n if (interaction.prepared.name === 'drag') {\n fireDropEvents(interaction, interaction.dropEvents);\n }\n});\n\nInteraction.signals.on('stop-drag', function ({ interaction }) {\n interaction.activeDrops.dropzones =\n interaction.activeDrops.elements =\n interaction.activeDrops.rects =\n interaction.dropEvents = null;\n});\n\nfunction collectDrops (interaction, element) {\n const drops = [];\n const elements = [];\n\n element = element || interaction.element;\n\n // collect all dropzones and their elements which qualify for a drop\n for (const current of scope.interactables) {\n if (!current.options.drop.enabled) { continue; }\n\n const accept = current.options.drop.accept;\n\n // test the draggable element against the dropzone's accept setting\n if ((utils.is.element(accept) && accept !== element)\n || (utils.is.string(accept)\n && !utils.matchesSelector(element, accept))) {\n\n continue;\n }\n\n // query for new elements if necessary\n const dropElements = utils.is.string(current.target)\n ? current._context.querySelectorAll(current.target)\n : [current.target];\n\n for (let i = 0; i < dropElements.length; i++) {\n const currentElement = dropElements[i];\n\n if (currentElement !== element) {\n drops.push(current);\n elements.push(currentElement);\n }\n }\n }\n\n return {\n elements,\n dropzones: drops,\n };\n}\n\nfunction fireActiveDrops (interaction, event) {\n let prevElement;\n\n // loop through all active dropzones and trigger event\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n const current = interaction.activeDrops.dropzones[i];\n const currentElement = interaction.activeDrops.elements [i];\n\n // prevent trigger of duplicate events on same element\n if (currentElement !== prevElement) {\n // set current element as event target\n event.target = currentElement;\n current.fire(event);\n }\n prevElement = currentElement;\n }\n}\n\n// Collect a new set of possible drops and save them in activeDrops.\n// setActiveDrops should always be called when a drag has just started or a\n// drag event happens while dynamicDrop is true\nfunction setActiveDrops (interaction, dragElement) {\n // get dropzones and their elements that could receive the draggable\n const possibleDrops = collectDrops(interaction, dragElement, true);\n\n interaction.activeDrops.dropzones = possibleDrops.dropzones;\n interaction.activeDrops.elements = possibleDrops.elements;\n interaction.activeDrops.rects = [];\n\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n interaction.activeDrops.rects[i] =\n interaction.activeDrops.dropzones[i].getRect(interaction.activeDrops.elements[i]);\n }\n}\n\nfunction getDrop (dragEvent, event, dragElement) {\n const interaction = dragEvent.interaction;\n const validDrops = [];\n\n if (dynamicDrop) {\n setActiveDrops(interaction, dragElement);\n }\n\n // collect all dropzones and their elements which qualify for a drop\n for (let j = 0; j < interaction.activeDrops.dropzones.length; j++) {\n const current = interaction.activeDrops.dropzones[j];\n const currentElement = interaction.activeDrops.elements [j];\n const rect = interaction.activeDrops.rects [j];\n\n validDrops.push(current.dropCheck(dragEvent, event, interaction.target, dragElement, currentElement, rect)\n ? currentElement\n : null);\n }\n\n // get the most appropriate dropzone based on DOM depth and order\n const dropIndex = utils.indexOfDeepestElement(validDrops);\n\n return {\n dropzone: interaction.activeDrops.dropzones[dropIndex] || null,\n element : interaction.activeDrops.elements [dropIndex] || null,\n };\n}\n\nfunction getDropEvents (interaction, pointerEvent, dragEvent) {\n const dropEvents = {\n enter : null,\n leave : null,\n activate : null,\n deactivate: null,\n move : null,\n drop : null,\n };\n\n const tmpl = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n };\n\n if (interaction.dropElement !== interaction.prevDropElement) {\n // if there was a prevDropTarget, create a dragleave event\n if (interaction.prevDropTarget) {\n dropEvents.leave = utils.extend({ type: 'dragleave' }, tmpl);\n\n dragEvent.dragLeave = dropEvents.leave.target = interaction.prevDropElement;\n dragEvent.prevDropzone = dropEvents.leave.dropzone = interaction.prevDropTarget;\n }\n // if the dropTarget is not null, create a dragenter event\n if (interaction.dropTarget) {\n dropEvents.enter = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n type : 'dragenter',\n };\n\n dragEvent.dragEnter = interaction.dropElement;\n dragEvent.dropzone = interaction.dropTarget;\n }\n }\n\n if (dragEvent.type === 'dragend' && interaction.dropTarget) {\n dropEvents.drop = utils.extend({ type: 'drop' }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n dragEvent.relatedTarget = interaction.dropElement;\n }\n if (dragEvent.type === 'dragstart') {\n dropEvents.activate = utils.extend({ type: 'dropactivate' }, tmpl);\n\n dropEvents.activate.target = null;\n dropEvents.activate.dropzone = null;\n }\n if (dragEvent.type === 'dragend') {\n dropEvents.deactivate = utils.extend({ type: 'dropdeactivate' }, tmpl);\n\n dropEvents.deactivate.target = null;\n dropEvents.deactivate.dropzone = null;\n }\n if (dragEvent.type === 'dragmove' && interaction.dropTarget) {\n dropEvents.move = utils.extend({\n dragmove : dragEvent,\n type : 'dropmove',\n }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n }\n\n return dropEvents;\n}\n\nfunction fireDropEvents (interaction, dropEvents) {\n if (dropEvents.leave) { interaction.prevDropTarget.fire(dropEvents.leave); }\n if (dropEvents.move ) { interaction.dropTarget.fire(dropEvents.move ); }\n if (dropEvents.enter) { interaction.dropTarget.fire(dropEvents.enter); }\n if (dropEvents.drop ) { interaction.dropTarget.fire(dropEvents.drop ); }\n if (dropEvents.deactivate) {\n fireActiveDrops(interaction, dropEvents.deactivate);\n }\n\n interaction.prevDropTarget = interaction.dropTarget;\n interaction.prevDropElement = interaction.dropElement;\n}\n\n/*\\\n * Interactable.dropzone\n [ method ]\n *\n * Returns or sets whether elements can be dropped onto this\n * Interactable to trigger drop events\n *\n * Dropzones can receive the following events:\n * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends\n * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone\n * - `dragmove` when a draggable that has entered the dropzone is moved\n * - `drop` when a draggable is dropped into this dropzone\n *\n * Use the `accept` option to allow only elements that match the given CSS\n * selector or element. The value can be:\n *\n * - **an Element** - only that element can be dropped into this dropzone.\n * - **a string**, - the element being dragged must match it as a CSS selector.\n * - **`null`** - accept options is cleared - it accepts any element.\n *\n * Use the `overlap` option to set how drops are checked for. The allowed\n * values are:\n *\n * - `'pointer'`, the pointer must be over the dropzone (default)\n * - `'center'`, the draggable element's center must be over the dropzone\n * - a number from 0-1 which is the `(intersection area) / (draggable area)`.\n * e.g. `0.5` for drop to happen when half of the area of the draggable is\n * over the dropzone\n *\n * Use the `checker` option to specify a function to check if a dragged\n * element is over this Interactable.\n *\n | interact(target)\n | .dropChecker(function(dragEvent, // related dragmove or dragend event\n | event, // TouchEvent/PointerEvent/MouseEvent\n | dropped, // bool result of the default checker\n | dropzone, // dropzone Interactable\n | dropElement, // dropzone elemnt\n | draggable, // draggable Interactable\n | draggableElement) {// draggable element\n |\n | return dropped && event.target.hasAttribute('allow-drop');\n | }\n *\n *\n - options (boolean | object | null) #optional The new value to be set.\n | interact('.drop').dropzone({\n | accept: '.can-drop' || document.getElementById('single-drop'),\n | overlap: 'pointer' || 'center' || zeroToOne\n | }\n = (boolean | object) The current setting or this Interactable\n\\*/\nInteractable.prototype.dropzone = function (options) {\n if (utils.is.object(options)) {\n this.options.drop.enabled = options.enabled === false? false: true;\n\n if (utils.is.function(options.ondrop) ) { this.events.ondrop = options.ondrop ; }\n if (utils.is.function(options.ondropactivate) ) { this.events.ondropactivate = options.ondropactivate ; }\n if (utils.is.function(options.ondropdeactivate)) { this.events.ondropdeactivate = options.ondropdeactivate; }\n if (utils.is.function(options.ondragenter) ) { this.events.ondragenter = options.ondragenter ; }\n if (utils.is.function(options.ondragleave) ) { this.events.ondragleave = options.ondragleave ; }\n if (utils.is.function(options.ondropmove) ) { this.events.ondropmove = options.ondropmove ; }\n\n if (/^(pointer|center)$/.test(options.overlap)) {\n this.options.drop.overlap = options.overlap;\n }\n else if (utils.is.number(options.overlap)) {\n this.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0);\n }\n if ('accept' in options) {\n this.options.drop.accept = options.accept;\n }\n if ('checker' in options) {\n this.options.drop.checker = options.checker;\n }\n\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drop.enabled = options;\n\n if (!options) {\n this.ondragenter = this.ondragleave = this.ondrop\n = this.ondropactivate = this.ondropdeactivate = null;\n }\n\n return this;\n }\n\n return this.options.drop;\n};\n\nInteractable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) {\n let dropped = false;\n\n // if the dropzone has no rect (eg. display: none)\n // call the custom dropChecker or just return false\n if (!(rect = rect || this.getRect(dropElement))) {\n return (this.options.drop.checker\n ? this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement)\n : false);\n }\n\n const dropOverlap = this.options.drop.overlap;\n\n if (dropOverlap === 'pointer') {\n const origin = utils.getOriginXY(draggable, draggableElement, 'drag');\n const page = utils.getPageXY(dragEvent);\n\n page.x += origin.x;\n page.y += origin.y;\n\n const horizontal = (page.x > rect.left) && (page.x < rect.right);\n const vertical = (page.y > rect.top ) && (page.y < rect.bottom);\n\n dropped = horizontal && vertical;\n }\n\n const dragRect = draggable.getRect(draggableElement);\n\n if (dragRect && dropOverlap === 'center') {\n const cx = dragRect.left + dragRect.width / 2;\n const cy = dragRect.top + dragRect.height / 2;\n\n dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom;\n }\n\n if (dragRect && utils.is.number(dropOverlap)) {\n const overlapArea = (Math.max(0, Math.min(rect.right , dragRect.right ) - Math.max(rect.left, dragRect.left))\n * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top , dragRect.top )));\n\n const overlapRatio = overlapArea / (dragRect.width * dragRect.height);\n\n dropped = overlapRatio >= dropOverlap;\n }\n\n if (this.options.drop.checker) {\n dropped = this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement);\n }\n\n return dropped;\n};\n\nInteractable.signals.on('unset', function ({ interactable }) {\n interactable.dropzone(false);\n});\n\nInteractable.settingsMethods.push('dropChecker');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.dropTarget = null; // the dropzone a drag target might be dropped into\n interaction.dropElement = null; // the element at the time of checking\n interaction.prevDropTarget = null; // the dropzone that was recently dragged away from\n interaction.prevDropElement = null; // the element at the time of checking\n interaction.dropEvents = null; // the dropEvents related to the current drag event\n\n interaction.activeDrops = {\n dropzones: [], // the dropzones that are mentioned below\n elements : [], // elements of dropzones that accept the target draggable\n rects : [], // the rects of the elements mentioned above\n };\n\n});\n\nInteraction.signals.on('stop', function ({ interaction }) {\n interaction.dropTarget = interaction.dropElement =\n interaction.prevDropTarget = interaction.prevDropElement = null;\n});\n\n/*\\\n * interact.dynamicDrop\n [ method ]\n *\n * Returns or sets whether the dimensions of dropzone elements are\n * calculated on every dragmove or only on dragstart for the default\n * dropChecker\n *\n - newValue (boolean) #optional True to check on each move. False to check only before start\n = (boolean | interact) The current setting or interact\n\\*/\ninteract.dynamicDrop = function (newValue) {\n if (utils.is.bool(newValue)) {\n //if (dragging && dynamicDrop !== newValue && !newValue) {\n //calcRects(dropzones);\n //}\n\n dynamicDrop = newValue;\n\n return interact;\n }\n return dynamicDrop;\n};\n\nutils.merge(Interactable.eventTypes, [\n 'dragenter',\n 'dragleave',\n 'dropactivate',\n 'dropdeactivate',\n 'dropmove',\n 'drop',\n]);\nactions.methodDict.drop = 'dropzone';\n\ndefaultOptions.drop = drop.defaults;\n\nmodule.exports = drop;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst gesture = {\n defaults: {\n enabled : false,\n origin : null,\n restrict: null,\n },\n\n checker: function (pointer, event, interactable, element, interaction) {\n if (interaction.pointerIds.length >= 2) {\n return { name: 'gesture' };\n }\n\n return null;\n },\n\n getCursor: function () {\n return '';\n },\n};\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturestart') { return; }\n iEvent.ds = 0;\n\n interaction.gesture.startDistance = interaction.gesture.prevDistance = iEvent.distance;\n interaction.gesture.startAngle = interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.scale = 1;\n});\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturemove') { return; }\n\n iEvent.ds = iEvent.scale - interaction.gesture.scale;\n\n interaction.target.fire(iEvent);\n\n interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.prevDistance = iEvent.distance;\n\n if (iEvent.scale !== Infinity\n && iEvent.scale !== null\n && iEvent.scale !== undefined\n && !isNaN(iEvent.scale)) {\n\n interaction.gesture.scale = iEvent.scale;\n }\n});\n\n/*\\\n * Interactable.gesturable\n [ method ]\n *\n * Gets or sets whether multitouch gestures can be performed on the\n * Interactable's element\n *\n = (boolean) Indicates if this can be the target of gesture events\n | var isGestureable = interact(element).gesturable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on gesture events (makes the Interactable gesturable)\n = (object) this Interactable\n | interact(element).gesturable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // limit multiple gestures.\n | // See the explanation in @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n\\*/\nInteractable.prototype.gesturable = function (options) {\n if (utils.is.object(options)) {\n this.options.gesture.enabled = options.enabled === false? false: true;\n this.setPerAction('gesture', options);\n this.setOnEvents('gesture', options);\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.gesture.enabled = options;\n\n if (!options) {\n this.ongesturestart = this.ongesturestart = this.ongestureend = null;\n }\n\n return this;\n }\n\n return this.options.gesture;\n};\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action, event, starting, ending, deltaSource }) {\n if (action !== 'gesture') { return; }\n\n const pointers = interaction.pointers;\n\n iEvent.touches = [pointers[0], pointers[1]];\n\n if (starting) {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = 1;\n iEvent.ds = 0;\n iEvent.angle = utils.touchAngle(pointers, undefined, deltaSource);\n iEvent.da = 0;\n }\n else if (ending || event instanceof InteractEvent) {\n iEvent.distance = interaction.prevEvent.distance;\n iEvent.box = interaction.prevEvent.box;\n iEvent.scale = interaction.prevEvent.scale;\n iEvent.ds = iEvent.scale - 1;\n iEvent.angle = interaction.prevEvent.angle;\n iEvent.da = iEvent.angle - interaction.gesture.startAngle;\n }\n else {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = iEvent.distance / interaction.gesture.startDistance;\n iEvent.angle = utils.touchAngle(pointers, interaction.gesture.prevAngle, deltaSource);\n\n iEvent.ds = iEvent.scale - interaction.gesture.prevScale;\n iEvent.da = iEvent.angle - interaction.gesture.prevAngle;\n }\n});\n\nInteraction.signals.on('new', function (interaction) {\n interaction.gesture = {\n start: { x: 0, y: 0 },\n\n startDistance: 0, // distance between two touches of touchStart\n prevDistance : 0,\n distance : 0,\n\n scale: 1, // gesture.distance / gesture.startDistance\n\n startAngle: 0, // angle of line joining two touches\n prevAngle : 0, // angle of the previous gesture event\n };\n});\n\nactions.gesture = gesture;\nactions.names.push('gesture');\nutils.merge(Interactable.eventTypes, [\n 'gesturestart',\n 'gesturemove',\n 'gestureend',\n]);\nactions.methodDict.gesture = 'gesturable';\n\ndefaultOptions.gesture = gesture.defaults;\n\nmodule.exports = gesture;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\n// Less Precision with touch input\nconst defaultMargin = browser.supportsTouch || browser.supportsPointerEvent? 20: 10;\n\nconst resize = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n square: false,\n preserveAspectRatio: false,\n axis: 'xy',\n\n // use default margin\n margin: NaN,\n\n // object with props left, right, top, bottom which are\n // true/false values to resize when the pointer is over that edge,\n // CSS selectors to match the handles for each direction\n // or the Elements for each handle\n edges: null,\n\n // a value of 'none' will limit the resize rect to a minimum of 0x0\n // 'negate' will alow the rect to have negative width/height\n // 'reposition' will keep the width/height positive by swapping\n // the top and bottom edges and/or swapping the left and right edges\n invert: 'none',\n },\n\n checker: function (pointer, event, interactable, element, interaction, rect) {\n if (!rect) { return null; }\n\n const page = utils.extend({}, interaction.curCoords.page);\n const options = interactable.options;\n\n if (options.resize.enabled) {\n const resizeOptions = options.resize;\n const resizeEdges = { left: false, right: false, top: false, bottom: false };\n\n // if using resize.edges\n if (utils.is.object(resizeOptions.edges)) {\n for (const edge in resizeEdges) {\n resizeEdges[edge] = checkResizeEdge(edge,\n resizeOptions.edges[edge],\n page,\n interaction._eventTarget,\n element,\n rect,\n resizeOptions.margin || defaultMargin);\n }\n\n resizeEdges.left = resizeEdges.left && !resizeEdges.right;\n resizeEdges.top = resizeEdges.top && !resizeEdges.bottom;\n\n if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) {\n return {\n name: 'resize',\n edges: resizeEdges,\n };\n }\n }\n else {\n const right = options.resize.axis !== 'y' && page.x > (rect.right - defaultMargin);\n const bottom = options.resize.axis !== 'x' && page.y > (rect.bottom - defaultMargin);\n\n if (right || bottom) {\n return {\n name: 'resize',\n axes: (right? 'x' : '') + (bottom? 'y' : ''),\n };\n }\n }\n }\n\n return null;\n },\n\n cursors: (browser.isIe9OrOlder ? {\n x : 'e-resize',\n y : 's-resize',\n xy: 'se-resize',\n\n top : 'n-resize',\n left : 'w-resize',\n bottom : 's-resize',\n right : 'e-resize',\n topleft : 'se-resize',\n bottomright: 'se-resize',\n topright : 'ne-resize',\n bottomleft : 'ne-resize',\n } : {\n x : 'ew-resize',\n y : 'ns-resize',\n xy: 'nwse-resize',\n\n top : 'ns-resize',\n left : 'ew-resize',\n bottom : 'ns-resize',\n right : 'ew-resize',\n topleft : 'nwse-resize',\n bottomright: 'nwse-resize',\n topright : 'nesw-resize',\n bottomleft : 'nesw-resize',\n }),\n\n getCursor: function (action) {\n if (action.axis) {\n return resize.cursors[action.name + action.axis];\n }\n else if (action.edges) {\n let cursorKey = '';\n const edgeNames = ['top', 'bottom', 'left', 'right'];\n\n for (let i = 0; i < 4; i++) {\n if (action.edges[edgeNames[i]]) {\n cursorKey += edgeNames[i];\n }\n }\n\n return resize.cursors[cursorKey];\n }\n },\n};\n\n// resizestart\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'resizestart' || !interaction.prepared.edges) {\n return;\n }\n\n const startRect = interaction.target.getRect(interaction.element);\n const resizeOptions = interaction.target.options.resize;\n\n /*\n * When using the `resizable.square` or `resizable.preserveAspectRatio` options, resizing from one edge\n * will affect another. E.g. with `resizable.square`, resizing to make the right edge larger will make\n * the bottom edge larger by the same amount. We call these 'linked' edges. Any linked edges will depend\n * on the active edges and the edge being interacted with.\n */\n if (resizeOptions.square || resizeOptions.preserveAspectRatio) {\n const linkedEdges = utils.extend({}, interaction.prepared.edges);\n\n linkedEdges.top = linkedEdges.top || (linkedEdges.left && !linkedEdges.bottom);\n linkedEdges.left = linkedEdges.left || (linkedEdges.top && !linkedEdges.right );\n linkedEdges.bottom = linkedEdges.bottom || (linkedEdges.right && !linkedEdges.top );\n linkedEdges.right = linkedEdges.right || (linkedEdges.bottom && !linkedEdges.left );\n\n interaction.prepared._linkedEdges = linkedEdges;\n }\n else {\n interaction.prepared._linkedEdges = null;\n }\n\n // if using `resizable.preserveAspectRatio` option, record aspect ratio at the start of the resize\n if (resizeOptions.preserveAspectRatio) {\n interaction.resizeStartAspectRatio = startRect.width / startRect.height;\n }\n\n interaction.resizeRects = {\n start : startRect,\n current : utils.extend({}, startRect),\n inverted : utils.extend({}, startRect),\n previous : utils.extend({}, startRect),\n delta : {\n left: 0, right : 0, width : 0,\n top : 0, bottom: 0, height: 0,\n },\n };\n\n iEvent.rect = interaction.resizeRects.inverted;\n iEvent.deltaRect = interaction.resizeRects.delta;\n});\n\n// resizemove\nInteractEvent.signals.on('new', function ({ iEvent, phase, interaction }) {\n if (phase !== 'move' || !interaction.prepared.edges) { return; }\n\n const resizeOptions = interaction.target.options.resize;\n const invert = resizeOptions.invert;\n const invertible = invert === 'reposition' || invert === 'negate';\n\n let edges = interaction.prepared.edges;\n\n const start = interaction.resizeRects.start;\n const current = interaction.resizeRects.current;\n const inverted = interaction.resizeRects.inverted;\n const delta = interaction.resizeRects.delta;\n const previous = utils.extend(interaction.resizeRects.previous, inverted);\n const originalEdges = edges;\n\n let dx = iEvent.dx;\n let dy = iEvent.dy;\n\n if (resizeOptions.preserveAspectRatio || resizeOptions.square) {\n // `resize.preserveAspectRatio` takes precedence over `resize.square`\n const startAspectRatio = resizeOptions.preserveAspectRatio\n ? interaction.resizeStartAspectRatio\n : 1;\n\n edges = interaction.prepared._linkedEdges;\n\n if ((originalEdges.left && originalEdges.bottom)\n || (originalEdges.right && originalEdges.top)) {\n dy = -dx / startAspectRatio;\n }\n else if (originalEdges.left || originalEdges.right ) { dy = dx / startAspectRatio; }\n else if (originalEdges.top || originalEdges.bottom) { dx = dy * startAspectRatio; }\n }\n\n // update the 'current' rect without modifications\n if (edges.top ) { current.top += dy; }\n if (edges.bottom) { current.bottom += dy; }\n if (edges.left ) { current.left += dx; }\n if (edges.right ) { current.right += dx; }\n\n if (invertible) {\n // if invertible, copy the current rect\n utils.extend(inverted, current);\n\n if (invert === 'reposition') {\n // swap edge values if necessary to keep width/height positive\n let swap;\n\n if (inverted.top > inverted.bottom) {\n swap = inverted.top;\n\n inverted.top = inverted.bottom;\n inverted.bottom = swap;\n }\n if (inverted.left > inverted.right) {\n swap = inverted.left;\n\n inverted.left = inverted.right;\n inverted.right = swap;\n }\n }\n }\n else {\n // if not invertible, restrict to minimum of 0x0 rect\n inverted.top = Math.min(current.top, start.bottom);\n inverted.bottom = Math.max(current.bottom, start.top);\n inverted.left = Math.min(current.left, start.right);\n inverted.right = Math.max(current.right, start.left);\n }\n\n inverted.width = inverted.right - inverted.left;\n inverted.height = inverted.bottom - inverted.top ;\n\n for (const edge in inverted) {\n delta[edge] = inverted[edge] - previous[edge];\n }\n\n iEvent.edges = interaction.prepared.edges;\n iEvent.rect = inverted;\n iEvent.deltaRect = delta;\n});\n\n/*\\\n * Interactable.resizable\n [ method ]\n *\n * Gets or sets whether resize actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of resize elements\n | var isResizeable = interact('input[type=text]').resizable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on resize events (object makes the Interactable resizable)\n = (object) This Interactable\n | interact(element).resizable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | edges: {\n | top : true, // Use pointer coords to check for resize.\n | left : false, // Disable resizing from left edge.\n | bottom: '.resize-s',// Resize if pointer target matches selector\n | right : handleEl // Resize if pointer target is the given Element\n | },\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height are adjusted at a 1:1 ratio.\n | square: false,\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height maintain the aspect ratio they had when resizing started.\n | preserveAspectRatio: false,\n |\n | // a value of 'none' will limit the resize rect to a minimum of 0x0\n | // 'negate' will allow the rect to have negative width/height\n | // 'reposition' will keep the width/height positive by swapping\n | // the top and bottom edges and/or swapping the left and right edges\n | invert: 'none' || 'negate' || 'reposition'\n |\n | // limit multiple resizes.\n | // See the explanation in the @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n \\*/\nInteractable.prototype.resizable = function (options) {\n if (utils.is.object(options)) {\n this.options.resize.enabled = options.enabled === false? false: true;\n this.setPerAction('resize', options);\n this.setOnEvents('resize', options);\n\n if (/^x$|^y$|^xy$/.test(options.axis)) {\n this.options.resize.axis = options.axis;\n }\n else if (options.axis === null) {\n this.options.resize.axis = defaultOptions.resize.axis;\n }\n\n if (utils.is.bool(options.preserveAspectRatio)) {\n this.options.resize.preserveAspectRatio = options.preserveAspectRatio;\n }\n else if (utils.is.bool(options.square)) {\n this.options.resize.square = options.square;\n }\n\n return this;\n }\n if (utils.is.bool(options)) {\n this.options.resize.enabled = options;\n\n if (!options) {\n this.onresizestart = this.onresizestart = this.onresizeend = null;\n }\n\n return this;\n }\n return this.options.resize;\n};\n\nfunction checkResizeEdge (name, value, page, element, interactableElement, rect, margin) {\n // false, '', undefined, null\n if (!value) { return false; }\n\n // true value, use pointer coords and element rect\n if (value === true) {\n // if dimensions are negative, \"switch\" edges\n const width = utils.is.number(rect.width )? rect.width : rect.right - rect.left;\n const height = utils.is.number(rect.height)? rect.height : rect.bottom - rect.top ;\n\n if (width < 0) {\n if (name === 'left' ) { name = 'right'; }\n else if (name === 'right') { name = 'left' ; }\n }\n if (height < 0) {\n if (name === 'top' ) { name = 'bottom'; }\n else if (name === 'bottom') { name = 'top' ; }\n }\n\n if (name === 'left' ) { return page.x < ((width >= 0? rect.left: rect.right ) + margin); }\n if (name === 'top' ) { return page.y < ((height >= 0? rect.top : rect.bottom) + margin); }\n\n if (name === 'right' ) { return page.x > ((width >= 0? rect.right : rect.left) - margin); }\n if (name === 'bottom') { return page.y > ((height >= 0? rect.bottom: rect.top ) - margin); }\n }\n\n // the remaining checks require an element\n if (!utils.is.element(element)) { return false; }\n\n return utils.is.element(value)\n // the value is an element to use as a resize handle\n ? value === element\n // otherwise check if element matches value as selector\n : utils.matchesUpTo(element, value, interactableElement);\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.resizeAxes = 'xy';\n});\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action }) {\n if (action !== 'resize' || !interaction.resizeAxes) { return; }\n\n const options = interaction.target.options;\n\n if (options.resize.square) {\n if (interaction.resizeAxes === 'y') {\n iEvent.dx = iEvent.dy;\n }\n else {\n iEvent.dy = iEvent.dx;\n }\n iEvent.axes = 'xy';\n }\n else {\n iEvent.axes = interaction.resizeAxes;\n\n if (interaction.resizeAxes === 'x') {\n iEvent.dy = 0;\n }\n else if (interaction.resizeAxes === 'y') {\n iEvent.dx = 0;\n }\n }\n});\n\nactions.resize = resize;\nactions.names.push('resize');\nutils.merge(Interactable.eventTypes, [\n 'resizestart',\n 'resizemove',\n 'resizeinertiastart',\n 'resizeinertiaresume',\n 'resizeend',\n]);\nactions.methodDict.resize = 'resizable';\n\ndefaultOptions.resize = resize.defaults;\n\nmodule.exports = resize;\n","const raf = require('./utils/raf');\nconst getWindow = require('./utils/window').getWindow;\nconst is = require('./utils/is');\nconst domUtils = require('./utils/domUtils');\nconst Interaction = require('./Interaction');\nconst defaultOptions = require('./defaultOptions');\n\nconst autoScroll = {\n defaults: {\n enabled : false,\n container: null, // the item that is scrolled (Window or HTMLElement)\n margin : 60,\n speed : 300, // the scroll speed in pixels per second\n },\n\n interaction: null,\n i: null, // the handle returned by window.setInterval\n x: 0, y: 0, // Direction each pulse is to scroll in\n\n isScrolling: false,\n prevTime: 0,\n\n start: function (interaction) {\n autoScroll.isScrolling = true;\n raf.cancel(autoScroll.i);\n\n autoScroll.interaction = interaction;\n autoScroll.prevTime = new Date().getTime();\n autoScroll.i = raf.request(autoScroll.scroll);\n },\n\n stop: function () {\n autoScroll.isScrolling = false;\n raf.cancel(autoScroll.i);\n },\n\n // scroll the window by the values in scroll.x/y\n scroll: function () {\n const options = autoScroll.interaction.target.options[autoScroll.interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(autoScroll.interaction.element);\n const now = new Date().getTime();\n // change in time in seconds\n const dt = (now - autoScroll.prevTime) / 1000;\n // displacement\n const s = options.speed * dt;\n\n if (s >= 1) {\n if (is.window(container)) {\n container.scrollBy(autoScroll.x * s, autoScroll.y * s);\n }\n else if (container) {\n container.scrollLeft += autoScroll.x * s;\n container.scrollTop += autoScroll.y * s;\n }\n\n autoScroll.prevTime = now;\n }\n\n if (autoScroll.isScrolling) {\n raf.cancel(autoScroll.i);\n autoScroll.i = raf.request(autoScroll.scroll);\n }\n },\n check: function (interactable, actionName) {\n const options = interactable.options;\n\n return options[actionName].autoScroll && options[actionName].autoScroll.enabled;\n },\n onInteractionMove: function ({ interaction, pointer }) {\n if (!(interaction.interacting()\n && autoScroll.check(interaction.target, interaction.prepared.name))) {\n return;\n }\n\n if (interaction.simulation) {\n autoScroll.x = autoScroll.y = 0;\n return;\n }\n\n let top;\n let right;\n let bottom;\n let left;\n\n const options = interaction.target.options[interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(interaction.element);\n\n if (is.window(container)) {\n left = pointer.clientX < autoScroll.margin;\n top = pointer.clientY < autoScroll.margin;\n right = pointer.clientX > container.innerWidth - autoScroll.margin;\n bottom = pointer.clientY > container.innerHeight - autoScroll.margin;\n }\n else {\n const rect = domUtils.getElementClientRect(container);\n\n left = pointer.clientX < rect.left + autoScroll.margin;\n top = pointer.clientY < rect.top + autoScroll.margin;\n right = pointer.clientX > rect.right - autoScroll.margin;\n bottom = pointer.clientY > rect.bottom - autoScroll.margin;\n }\n\n autoScroll.x = (right ? 1: left? -1: 0);\n autoScroll.y = (bottom? 1: top? -1: 0);\n\n if (!autoScroll.isScrolling) {\n // set the autoScroll properties to those of the target\n autoScroll.margin = options.margin;\n autoScroll.speed = options.speed;\n\n autoScroll.start(interaction);\n }\n },\n};\n\nInteraction.signals.on('stop-active', function () {\n autoScroll.stop();\n});\n\nInteraction.signals.on('action-move', autoScroll.onInteractionMove);\n\ndefaultOptions.perAction.autoScroll = autoScroll.defaults;\n\nmodule.exports = autoScroll;\n","const Interactable = require('../Interactable');\nconst actions = require('../actions/base');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.ignoreFrom\n [ method ]\n *\n * If the target of the `mousedown`, `pointerdown` or `touchstart`\n * event or any of it's parents match the given CSS selector or\n * Element, no drag/resize/gesture is started.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to not ignore any elements\n = (string | Element | object) The current ignoreFrom value or this Interactable\n **\n | interact(element, { ignoreFrom: document.getElementById('no-action') });\n | // or\n | interact(element).ignoreFrom('input, textarea, a');\n\\*/\nInteractable.prototype.ignoreFrom = function (newValue) {\n return this._backCompatOption('ignoreFrom', newValue);\n};\n\n/*\\\n * Interactable.allowFrom\n [ method ]\n *\n * A drag/resize/gesture is started only If the target of the\n * `mousedown`, `pointerdown` or `touchstart` event or any of it's\n * parents match the given CSS selector or Element.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to allow from any element\n = (string | Element | object) The current allowFrom value or this Interactable\n **\n | interact(element, { allowFrom: document.getElementById('drag-handle') });\n | // or\n | interact(element).allowFrom('.handle');\n\\*/\nInteractable.prototype.allowFrom = function (newValue) {\n return this._backCompatOption('allowFrom', newValue);\n};\n\nInteractable.prototype.testIgnore = function (ignoreFrom, interactableElement, element) {\n if (!ignoreFrom || !is.element(element)) { return false; }\n\n if (is.string(ignoreFrom)) {\n return domUtils.matchesUpTo(element, ignoreFrom, interactableElement);\n }\n else if (is.element(ignoreFrom)) {\n return domUtils.nodeContains(ignoreFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testAllow = function (allowFrom, interactableElement, element) {\n if (!allowFrom) { return true; }\n\n if (!is.element(element)) { return false; }\n\n if (is.string(allowFrom)) {\n return domUtils.matchesUpTo(element, allowFrom, interactableElement);\n }\n else if (is.element(allowFrom)) {\n return domUtils.nodeContains(allowFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testIgnoreAllow = function (options, interactableElement, eventTarget) {\n return (!this.testIgnore(options.ignoreFrom, interactableElement, eventTarget)\n && this.testAllow(options.allowFrom, interactableElement, eventTarget));\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (event.buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\n","const interact = require('../interact');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst actions = require('../actions/base');\nconst defaultOptions = require('../defaultOptions');\nconst browser = require('../utils/browser');\nconst scope = require('../scope');\nconst utils = require('../utils');\nconst signals = require('../utils/Signals').new();\n\nrequire('./InteractableMethods');\n\nconst autoStart = {\n signals,\n withinInteractionLimit,\n // Allow this many interactions to happen simultaneously\n maxInteractions: Infinity,\n defaults: {\n perAction: {\n manualStart: false,\n max: Infinity,\n maxPerElement: 1,\n allowFrom: null,\n ignoreFrom: null,\n },\n },\n setActionDefaults: function (action) {\n utils.extend(action.defaults, autoStart.defaults.perAction);\n },\n};\n\n// set cursor style on mousedown\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget }) {\n if (interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\n// set cursor style on mousemove\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget }) {\n if (!interaction.mouse\n || interaction.pointerIsDown\n || interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\nInteraction.signals.on('move', function (arg) {\n const { interaction, event } = arg;\n\n if (!interaction.pointerIsDown\n || interaction.interacting()\n || !interaction.pointerWasMoved\n || !interaction.prepared.name) {\n return;\n }\n\n signals.fire('before-start', arg);\n\n const target = interaction.target;\n\n if (interaction.prepared.name && target) {\n // check manualStart and interaction limit\n if (target.options[interaction.prepared.name].manualStart\n || !withinInteractionLimit(target, interaction.element, interaction.prepared)) {\n interaction.stop(event);\n }\n else {\n interaction.start(interaction.prepared, target, interaction.element);\n }\n }\n});\n\n// Check if the current target supports the action.\n// If so, return the validated action. Otherwise, return null\nfunction validateAction (action, interactable, element, eventTarget) {\n if (utils.is.object(action)\n && interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget)\n && interactable.options[action.name].enabled\n && withinInteractionLimit(interactable, element, action)) {\n return action;\n }\n\n return null;\n}\n\nfunction validateSelector (interaction, pointer, event, matches, matchElements, eventTarget) {\n for (let i = 0, len = matches.length; i < len; i++) {\n const match = matches[i];\n const matchElement = matchElements[i];\n const action = validateAction(match.getAction(pointer, event, interaction, matchElement),\n match,\n matchElement,\n eventTarget);\n\n if (action) {\n return {\n action,\n target: match,\n element: matchElement,\n };\n }\n }\n\n return {};\n}\n\nfunction getActionInfo (interaction, pointer, event, eventTarget) {\n let matches = [];\n let matchElements = [];\n\n let element = eventTarget;\n let action = null;\n\n function pushMatches (interactable, selector, context) {\n const elements = (browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined);\n\n if (utils.matchesSelector(element, selector, elements)) {\n\n matches.push(interactable);\n matchElements.push(element);\n }\n }\n\n while (utils.is.element(element)) {\n matches = [];\n matchElements = [];\n\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && (action = validateAction(elementInteractable.getAction(pointer, event, interaction, element, eventTarget),\n elementInteractable,\n element,\n eventTarget))\n && !elementInteractable.options[action.name].manualStart) {\n return {\n element,\n action,\n target: elementInteractable,\n };\n }\n else {\n scope.interactables.forEachSelector(pushMatches, element);\n\n const actionInfo = validateSelector(interaction, pointer, event, matches, matchElements, eventTarget);\n\n if (actionInfo.action\n && !actionInfo.target.options[actionInfo.action.name].manualStart) {\n return actionInfo;\n }\n }\n\n element = utils.parentNode(element);\n }\n\n return {};\n}\n\nfunction prepare (interaction, { action, target, element }) {\n action = action || {};\n\n if (interaction.target && interaction.target.options.styleCursor) {\n interaction.target._doc.documentElement.style.cursor = '';\n }\n\n interaction.target = target;\n interaction.element = element;\n utils.copyAction(interaction.prepared, action);\n\n if (target && target.options.styleCursor) {\n const cursor = action? actions[action.name].getCursor(action) : '';\n interaction.target._doc.documentElement.style.cursor = cursor;\n }\n\n signals.fire('prepared', { interaction: interaction });\n}\n\nInteraction.signals.on('stop', function ({ interaction }) {\n const target = interaction.target;\n\n if (target && target.options.styleCursor) {\n target._doc.documentElement.style.cursor = '';\n }\n});\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (utils.is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (utils.is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n const buttons = event.buttons || ({\n 0: 1,\n 1: 4,\n 3: 8,\n 4: 16,\n })[event.button];\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\nfunction withinInteractionLimit (interactable, element, action) {\n const options = interactable.options;\n const maxActions = options[action.name].max;\n const maxPerElement = options[action.name].maxPerElement;\n let activeInteractions = 0;\n let targetCount = 0;\n let targetElementCount = 0;\n\n // no actions if any of these values == 0\n if (!(maxActions && maxPerElement && autoStart.maxInteractions)) { return; }\n\n for (let i = 0, len = scope.interactions.length; i < len; i++) {\n const interaction = scope.interactions[i];\n const otherAction = interaction.prepared.name;\n\n if (!interaction.interacting()) { continue; }\n\n activeInteractions++;\n\n if (activeInteractions >= autoStart.maxInteractions) {\n return false;\n }\n\n if (interaction.target !== interactable) { continue; }\n\n targetCount += (otherAction === action.name)|0;\n\n if (targetCount >= maxActions) {\n return false;\n }\n\n if (interaction.element === element) {\n targetElementCount++;\n\n if (otherAction !== action.name || targetElementCount >= maxPerElement) {\n return false;\n }\n }\n }\n\n return autoStart.maxInteractions > 0;\n}\n\n/*\\\n * interact.maxInteractions\n [ method ]\n **\n * Returns or sets the maximum number of concurrent interactions allowed.\n * By default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables\n * and elements, you need to enable it in the draggable, resizable and\n * gesturable `'max'` and `'maxPerElement'` options.\n **\n - newValue (number) #optional Any number. newValue <= 0 means no interactions.\n\\*/\ninteract.maxInteractions = function (newValue) {\n if (utils.is.number(newValue)) {\n autoStart.maxInteractions = newValue;\n\n return this;\n }\n\n return autoStart.maxInteractions;\n};\n\nInteractable.settingsMethods.push('styleCursor');\nInteractable.settingsMethods.push('actionChecker');\nInteractable.settingsMethods.push('ignoreFrom');\nInteractable.settingsMethods.push('allowFrom');\n\ndefaultOptions.base.actionChecker = null;\ndefaultOptions.base.styleCursor = true;\n\nutils.extend(defaultOptions.perAction, autoStart.defaults.perAction);\n\nmodule.exports = autoStart;\n","const autoStart = require('./base');\nconst Interaction = require('../Interaction');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.delayTimer = null;\n});\n\nautoStart.signals.on('prepared', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.delayTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.target, interaction.element);\n }, delay);\n }\n});\n\nInteraction.signals.on('move', function ({ interaction, duplicate }) {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.delayTimer);\n }\n});\n\n// prevent regular down->move autoStart\nautoStart.signals.on('before-start', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.prepared.name = null;\n }\n});\n","const autoStart = require('./base');\nconst scope = require('../scope');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\n\nconst { matchesSelector, parentNode } = require('../utils/domUtils');\n\nautoStart.setActionDefaults(require('../actions/drag'));\n\nautoStart.signals.on('before-start', function ({ interaction, eventTarget, dx, dy }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // check if a drag is in the correct axis\n const absX = Math.abs(dx);\n const absY = Math.abs(dy);\n const options = interaction.target.options.drag;\n const startAxis = options.startAxis;\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy');\n\n interaction.prepared.axis = options.lockAxis === 'start'\n ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n : options.lockAxis;\n\n // if the movement isn't in the startAxis of the interactable\n if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) {\n // cancel the prepared action\n interaction.prepared.name = null;\n\n // then try to get a drag from another ineractable\n\n if (!interaction.prepared.name) {\n\n let element = eventTarget;\n\n const getDraggable = function (interactable, selector, context) {\n const elements = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n if (interactable === interaction.target) { return; }\n\n if (!options.manualStart\n && !interactable.testIgnoreAllow(options, element, eventTarget)\n && matchesSelector(element, selector, elements)) {\n\n const action = interactable.getAction(interaction.downPointer,\n interaction.downEvent,\n interaction,\n element);\n\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, interactable)\n && autoStart.validateAction(action, interactable, element, eventTarget)) {\n\n return interactable;\n }\n }\n };\n\n let action = null;\n\n // check all interactables\n while (is.element(element)) {\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && elementInteractable !== interaction.target\n && !elementInteractable.options.drag.manualStart) {\n\n action = elementInteractable.getAction(interaction.downPointer, interaction.downEvent, interaction, element);\n }\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, elementInteractable)) {\n\n interaction.prepared.name = 'drag';\n interaction.target = elementInteractable;\n interaction.element = element;\n break;\n }\n\n const selectorInteractable = scope.interactables.forEachSelector(getDraggable, element);\n\n if (selectorInteractable) {\n interaction.prepared.name = 'drag';\n interaction.target = selectorInteractable;\n interaction.element = element;\n break;\n }\n\n element = parentNode(element);\n }\n }\n }\n});\n\nfunction checkStartAxis (startAxis, interactable) {\n if (!interactable) { return false; }\n\n const thisAxis = interactable.options.drag.startAxis;\n\n return (startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis);\n}\n","require('./base').setActionDefaults(require('../actions/gesture'));\n","require('./base').setActionDefaults(require('../actions/resize'));\n","module.exports = {\n base: {\n accept : null,\n preventDefault: 'auto',\n deltaSource : 'page',\n },\n\n perAction: {\n origin: { x: 0, y: 0 },\n\n // only allow left button by default\n // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n mouseButtons: 1,\n\n inertia: {\n enabled : false,\n resistance : 10, // the lambda in exponential decay\n minSpeed : 100, // target speed must be above this for inertia to start\n endSpeed : 10, // the speed at which inertia is slow enough to stop\n allowResume : true, // allow resuming an action in inertia phase\n smoothEndDuration: 300, // animate to snap/restrict endOnly if there's no inertia\n },\n },\n};\n","/* browser entry point */\n\n// Legacy browser support\nrequire('./legacyBrowsers');\n\n// inertia\nrequire('./inertia');\n\n// modifiers\nrequire('./modifiers/snap');\nrequire('./modifiers/restrict');\n\n// pointerEvents\nrequire('./pointerEvents/base');\nrequire('./pointerEvents/holdRepeat');\nrequire('./pointerEvents/interactableTargets');\n\n// delay\nrequire('./autoStart/delay');\n\n// actions\nrequire('./actions/gesture');\nrequire('./actions/resize');\nrequire('./actions/drag');\nrequire('./actions/drop');\n\n// load these modifiers after resize is loaded\nrequire('./modifiers/snapSize');\nrequire('./modifiers/restrictEdges');\nrequire('./modifiers/restrictSize');\n\n// autoStart actions\nrequire('./autoStart/gesture');\nrequire('./autoStart/resize');\nrequire('./autoStart/drag');\n\n// Interactable preventDefault setting\nrequire('./interactablePreventDefault.js');\n\n// autoScroll\nrequire('./autoScroll');\n\n// export interact\nmodule.exports = require('./interact');\n","const InteractEvent = require('./InteractEvent');\nconst Interaction = require('./Interaction');\nconst modifiers = require('./modifiers');\nconst utils = require('./utils');\nconst animationFrame = require('./utils/raf');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.inertiaStatus = {\n active : false,\n smoothEnd : false,\n allowResume: false,\n\n startEvent: null,\n upCoords : {},\n\n xe: 0, ye: 0,\n sx: 0, sy: 0,\n\n t0: 0,\n vx0: 0, vys: 0,\n duration: 0,\n\n lambda_v0: 0,\n one_ve_v0: 0,\n i : null,\n };\n\n interaction.boundInertiaFrame = () => inertiaFrame .apply(interaction);\n interaction.boundSmoothEndFrame = () => smoothEndFrame.apply(interaction);\n});\n\nInteraction.signals.on('down', function ({ interaction, event, pointer, eventTarget }) {\n const status = interaction.inertiaStatus;\n\n // Check if the down event hits the current inertia target\n if (status.active) {\n let element = eventTarget;\n\n // climb up the DOM tree from the event target\n while (utils.is.element(element)) {\n\n // if interaction element is the current inertia target element\n if (element === interaction.element) {\n // stop inertia\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n\n // update pointers to the down event's coordinates\n interaction.updatePointer(pointer);\n utils.setCoords(interaction.curCoords, interaction.pointers);\n\n // fire appropriate signals\n const signalArg = { interaction };\n Interaction.signals.fire('before-action-move', signalArg);\n Interaction.signals.fire('action-resume' , signalArg);\n\n // fire a reume event\n const resumeEvent = new InteractEvent(interaction,\n event,\n interaction.prepared.name,\n 'inertiaresume',\n interaction.element);\n\n interaction.target.fire(resumeEvent);\n interaction.prevEvent = resumeEvent;\n modifiers.resetStatuses(interaction.modifierStatuses);\n\n utils.copyCoords(interaction.prevCoords, interaction.curCoords);\n break;\n }\n\n element = utils.parentNode(element);\n }\n }\n});\n\nInteraction.signals.on('up', function ({ interaction, event }) {\n const status = interaction.inertiaStatus;\n\n if (!interaction.interacting() || status.active) { return; }\n\n const target = interaction.target;\n const options = target && target.options;\n const inertiaOptions = options && interaction.prepared.name && options[interaction.prepared.name].inertia;\n\n const now = new Date().getTime();\n const statuses = {};\n const page = utils.extend({}, interaction.curCoords.page);\n const pointerSpeed = interaction.pointerDelta.client.speed;\n\n let smoothEnd = false;\n let modifierResult;\n\n // check if inertia should be started\n const inertiaPossible = (inertiaOptions && inertiaOptions.enabled\n && interaction.prepared.name !== 'gesture'\n && event !== status.startEvent);\n\n const inertia = (inertiaPossible\n && (now - interaction.curCoords.timeStamp) < 50\n && pointerSpeed > inertiaOptions.minSpeed\n && pointerSpeed > inertiaOptions.endSpeed);\n\n const modifierArg = {\n interaction,\n pageCoords: page,\n statuses,\n preEnd: true,\n requireEndOnly: true,\n };\n\n // smoothEnd\n if (inertiaPossible && !inertia) {\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n if (modifierResult.shouldMove && modifierResult.locked) {\n smoothEnd = true;\n }\n }\n\n if (!(inertia || smoothEnd)) { return; }\n\n utils.copyCoords(status.upCoords, interaction.curCoords);\n\n interaction.pointers[0] = status.startEvent =\n new InteractEvent(interaction, event, interaction.prepared.name, 'inertiastart', interaction.element);\n\n status.t0 = now;\n\n status.active = true;\n status.allowResume = inertiaOptions.allowResume;\n interaction.simulation = status;\n\n target.fire(status.startEvent);\n\n if (inertia) {\n status.vx0 = interaction.pointerDelta.client.vx;\n status.vy0 = interaction.pointerDelta.client.vy;\n status.v0 = pointerSpeed;\n\n calcInertia(interaction, status);\n\n utils.extend(page, interaction.curCoords.page);\n\n page.x += status.xe;\n page.y += status.ye;\n\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n status.modifiedXe += modifierResult.dx;\n status.modifiedYe += modifierResult.dy;\n\n status.i = animationFrame.request(interaction.boundInertiaFrame);\n }\n else {\n status.smoothEnd = true;\n status.xe = modifierResult.dx;\n status.ye = modifierResult.dy;\n\n status.sx = status.sy = 0;\n\n status.i = animationFrame.request(interaction.boundSmoothEndFrame);\n }\n});\n\nInteraction.signals.on('stop-active', function ({ interaction }) {\n const status = interaction.inertiaStatus;\n\n if (status.active) {\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n }\n});\n\nfunction calcInertia (interaction, status) {\n const inertiaOptions = interaction.target.options[interaction.prepared.name].inertia;\n const lambda = inertiaOptions.resistance;\n const inertiaDur = -Math.log(inertiaOptions.endSpeed / status.v0) / lambda;\n\n status.x0 = interaction.prevEvent.pageX;\n status.y0 = interaction.prevEvent.pageY;\n status.t0 = status.startEvent.timeStamp / 1000;\n status.sx = status.sy = 0;\n\n status.modifiedXe = status.xe = (status.vx0 - inertiaDur) / lambda;\n status.modifiedYe = status.ye = (status.vy0 - inertiaDur) / lambda;\n status.te = inertiaDur;\n\n status.lambda_v0 = lambda / status.v0;\n status.one_ve_v0 = 1 - inertiaOptions.endSpeed / status.v0;\n}\n\nfunction inertiaFrame () {\n updateInertiaCoords(this);\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n\n const status = this.inertiaStatus;\n const options = this.target.options[this.prepared.name].inertia;\n const lambda = options.resistance;\n const t = new Date().getTime() / 1000 - status.t0;\n\n if (t < status.te) {\n\n const progress = 1 - (Math.exp(-lambda * t) - status.lambda_v0) / status.one_ve_v0;\n\n if (status.modifiedXe === status.xe && status.modifiedYe === status.ye) {\n status.sx = status.xe * progress;\n status.sy = status.ye * progress;\n }\n else {\n const quadPoint = utils.getQuadraticCurvePoint(0, 0,\n status.xe,\n status.ye,\n status.modifiedXe,\n status.modifiedYe,\n progress);\n\n status.sx = quadPoint.x;\n status.sy = quadPoint.y;\n }\n\n this.doMove();\n\n status.i = animationFrame.request(this.boundInertiaFrame);\n }\n else {\n status.sx = status.modifiedXe;\n status.sy = status.modifiedYe;\n\n this.doMove();\n this.end(status.startEvent);\n status.active = false;\n this.simulation = null;\n }\n\n utils.copyCoords(this.prevCoords, this.curCoords);\n}\n\nfunction smoothEndFrame () {\n updateInertiaCoords(this);\n\n const status = this.inertiaStatus;\n const t = new Date().getTime() - status.t0;\n const duration = this.target.options[this.prepared.name].inertia.smoothEndDuration;\n\n if (t < duration) {\n status.sx = utils.easeOutQuad(t, 0, status.xe, duration);\n status.sy = utils.easeOutQuad(t, 0, status.ye, duration);\n\n this.pointerMove(status.startEvent, status.startEvent);\n\n status.i = animationFrame.request(this.boundSmoothEndFrame);\n }\n else {\n status.sx = status.xe;\n status.sy = status.ye;\n\n this.pointerMove(status.startEvent, status.startEvent);\n this.end(status.startEvent);\n\n status.smoothEnd =\n status.active = false;\n this.simulation = null;\n }\n}\n\nfunction updateInertiaCoords (interaction) {\n const status = interaction.inertiaStatus;\n\n // return if inertia isn't running\n if (!status.active) { return; }\n\n const pageUp = status.upCoords.page;\n const clientUp = status.upCoords.client;\n\n utils.setCoords(interaction.curCoords, [ {\n pageX : pageUp.x + status.sx,\n pageY : pageUp.y + status.sy,\n clientX: clientUp.x + status.sx,\n clientY: clientUp.y + status.sy,\n } ]);\n}\n","const browser = require('./utils/browser');\nconst events = require('./utils/events');\nconst utils = require('./utils');\nconst scope = require('./scope');\nconst Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\n\nconst globalEvents = {};\n\n/*\\\n * interact\n [ method ]\n *\n * The methods of this variable can be used to set elements as\n * interactables and also to change various default settings.\n *\n * Calling it as a function and passing an element or a valid CSS selector\n * string returns an Interactable object which has various methods to\n * configure it.\n *\n - element (Element | string) The HTML or SVG Element to interact with or CSS selector\n = (object) An @Interactable\n *\n > Usage\n | interact('#draggable').draggable(true);\n |\n | var rectables = interact('rect');\n | rectables\n | .gesturable(true)\n | .on('gesturemove', function (event) {\n | // ...\n | });\n\\*/\nfunction interact (element, options) {\n let interactable = scope.interactables.get(element, options);\n\n if (!interactable) {\n interactable = new Interactable(element, options);\n interactable.events.global = globalEvents;\n }\n\n return interactable;\n}\n\n/*\\\n * interact.isSet\n [ method ]\n *\n * Check if an element has been set\n - element (Element) The Element being searched for\n = (boolean) Indicates if the element or CSS selector was previously passed to interact\n\\*/\ninteract.isSet = function (element, options) {\n return scope.interactables.indexOfElement(element, options && options.context) !== -1;\n};\n\n/*\\\n * interact.on\n [ method ]\n *\n * Adds a global listener for an InteractEvent or adds a DOM event to\n * `document`\n *\n - type (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) interact\n\\*/\ninteract.on = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.on(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.on(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n // if it is an InteractEvent type, add listener to globalEvents\n if (utils.contains(Interactable.eventTypes, type)) {\n // if this type of event was never bound\n if (!globalEvents[type]) {\n globalEvents[type] = [listener];\n }\n else {\n globalEvents[type].push(listener);\n }\n }\n // If non InteractEvent type, addEventListener to document\n else {\n events.add(scope.document, type, listener, { options });\n }\n\n return interact;\n};\n\n/*\\\n * interact.off\n [ method ]\n *\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n - type (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) interact\n \\*/\ninteract.off = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.off(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.off(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n if (!utils.contains(Interactable.eventTypes, type)) {\n events.remove(scope.document, type, listener, options);\n }\n else {\n let index;\n\n if (type in globalEvents\n && (index = utils.indexOf(globalEvents[type], listener)) !== -1) {\n globalEvents[type].splice(index, 1);\n }\n }\n\n return interact;\n};\n\n/*\\\n * interact.debug\n [ method ]\n *\n * Returns an object which exposes internal data\n = (object) An object with properties that outline the current state and expose internal functions and variables\n\\*/\ninteract.debug = function () {\n return scope;\n};\n\n// expose the functions used to calculate multi-touch properties\ninteract.getPointerAverage = utils.pointerAverage;\ninteract.getTouchBBox = utils.touchBBox;\ninteract.getTouchDistance = utils.touchDistance;\ninteract.getTouchAngle = utils.touchAngle;\n\ninteract.getElementRect = utils.getElementRect;\ninteract.getElementClientRect = utils.getElementClientRect;\ninteract.matchesSelector = utils.matchesSelector;\ninteract.closest = utils.closest;\n\n/*\\\n * interact.supportsTouch\n [ method ]\n *\n = (boolean) Whether or not the browser supports touch input\n\\*/\ninteract.supportsTouch = function () {\n return browser.supportsTouch;\n};\n\n/*\\\n * interact.supportsPointerEvent\n [ method ]\n *\n = (boolean) Whether or not the browser supports PointerEvents\n\\*/\ninteract.supportsPointerEvent = function () {\n return browser.supportsPointerEvent;\n};\n\n/*\\\n * interact.stop\n [ method ]\n *\n * Cancels all interactions (end events are not fired)\n *\n - event (Event) An event on which to call preventDefault()\n = (object) interact\n\\*/\ninteract.stop = function (event) {\n for (let i = scope.interactions.length - 1; i >= 0; i--) {\n scope.interactions[i].stop(event);\n }\n\n return interact;\n};\n\n/*\\\n * interact.pointerMoveTolerance\n [ method ]\n * Returns or sets the distance the pointer must be moved before an action\n * sequence occurs. This also affects tolerance for tap events.\n *\n - newValue (number) #optional The movement from the start position must be greater than this value\n = (number | Interactable) The current setting or interact\n\\*/\ninteract.pointerMoveTolerance = function (newValue) {\n if (utils.is.number(newValue)) {\n Interaction.pointerMoveTolerance = newValue;\n\n return this;\n }\n\n return Interaction.pointerMoveTolerance;\n};\n\ninteract.addDocument = scope.addDocument;\ninteract.removeDocument = scope.removeDocument;\n\nscope.interact = interact;\n\nmodule.exports = interact;\n","const Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\nconst scope = require('./scope');\nconst is = require('./utils/is');\nconst events = require('./utils/events');\n\nconst { nodeContains, matchesSelector } = require('./utils/domUtils');\n\n/*\\\n * Interactable.preventDefault\n [ method ]\n *\n * Returns or sets whether to prevent the browser's default behaviour\n * in response to pointer events. Can be set to:\n * - `'always'` to always prevent\n * - `'never'` to never prevent\n * - `'auto'` to let interact.js try to determine what would be best\n *\n - newValue (string) #optional `true`, `false` or `'auto'`\n = (string | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.preventDefault = function (newValue) {\n if (/^(always|never|auto)$/.test(newValue)) {\n this.options.preventDefault = newValue;\n return this;\n }\n\n if (is.bool(newValue)) {\n this.options.preventDefault = newValue? 'always' : 'never';\n return this;\n }\n\n return this.options.preventDefault;\n};\n\nInteractable.prototype.checkAndPreventDefault = function (event) {\n const setting = this.options.preventDefault;\n\n if (setting === 'never') { return; }\n\n if (setting === 'always') {\n event.preventDefault();\n return;\n }\n\n // setting === 'auto'\n\n // don't preventDefault if the browser supports passiveEvents\n // CSS touch-action and user-selecct should be used instead\n if (events.supportsOptions) {\n return;\n }\n\n // don't preventDefault of pointerdown events\n if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) {\n return;\n }\n\n // don't preventDefault on editable elements\n if (is.element(event.target)\n && matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) {\n return;\n }\n\n event.preventDefault();\n};\n\nfunction onInteractionEvent ({ interaction, event }) {\n if (interaction.target) {\n interaction.target.checkAndPreventDefault(event);\n }\n}\n\nfor (const eventSignal of ['down', 'move', 'up', 'cancel']) {\n Interaction.signals.on(eventSignal, onInteractionEvent);\n}\n\n// prevent native HTML5 drag on interact.js target elements\nInteraction.docEvents.dragstart = function preventNativeDrag (event) {\n for (const interaction of scope.interactions) {\n\n if (interaction.element\n && (interaction.element === event.target\n || nodeContains(interaction.element, event.target))) {\n\n interaction.target.checkAndPreventDefault(event);\n return;\n }\n }\n};\n","const scope = require('./scope');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst iFinder = require('./utils/interactionFinder');\nconst pointerEvents = require('./pointerEvents/base');\n\nconst { window } = require('./utils/window');\n\nconst toString = Object.prototype.toString;\n\nif (!window.Array.isArray) {\n window.Array.isArray = function (obj) {\n return toString.call(obj) === '[object Array]';\n };\n}\n\nif (!String.prototype.trim) {\n String.prototype.trim = function () {\n return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n };\n}\n\n// http://www.quirksmode.org/dom/events/click.html\n// >Events leading to dblclick\n//\n// IE8 doesn't fire down event before dblclick.\n// This workaround tries to fire a tap and doubletap after dblclick\nfunction onIE8Dblclick (event) {\n const eventTarget = event.target;\n const interaction = iFinder.search(event, event.type, eventTarget);\n\n if (!interaction) { return; }\n\n if (interaction.prevTap\n && event.clientX === interaction.prevTap.clientX\n && event.clientY === interaction.prevTap.clientY\n && eventTarget === interaction.prevTap.target) {\n\n interaction.downTargets[0] = eventTarget;\n interaction.downTimes [0] = new Date().getTime();\n\n pointerEvents.fire({\n interaction,\n event,\n eventTarget,\n pointer: event,\n type: 'tap',\n });\n }\n}\n\nif (browser.isIE8) {\n const selectFix = function (event) {\n for (const interaction of scope.interactions) {\n if (interaction.interacting()) {\n interaction.target.checkAndPreventDefault(event);\n }\n }\n };\n\n const onDocIE8 = function onDocIE8 ({ doc, win }, signalName) {\n const eventMethod = signalName.indexOf('listen') === 0\n ? events.add : events.remove;\n\n // For IE's lack of Event#preventDefault\n eventMethod(doc, 'selectstart', selectFix);\n\n if (pointerEvents) {\n eventMethod(doc, 'dblclick', onIE8Dblclick);\n }\n };\n\n scope.signals.on('add-document' , onDocIE8);\n scope.signals.on('remove-document', onDocIE8);\n}\n\nmodule.exports = null;\n","const InteractEvent = require('../InteractEvent');\nconst Interaction = require('../Interaction');\nconst extend = require('../utils/extend');\n\nconst modifiers = {\n names: [],\n\n setOffsets: function (arg) {\n const { interaction, pageCoords: page } = arg;\n const { target, element, startOffset } = interaction;\n const rect = target.getRect(element);\n\n if (rect) {\n startOffset.left = page.x - rect.left;\n startOffset.top = page.y - rect.top;\n\n startOffset.right = rect.right - page.x;\n startOffset.bottom = rect.bottom - page.y;\n\n if (!('width' in rect)) { rect.width = rect.right - rect.left; }\n if (!('height' in rect)) { rect.height = rect.bottom - rect.top ; }\n }\n else {\n startOffset.left = startOffset.top = startOffset.right = startOffset.bottom = 0;\n }\n\n arg.rect = rect;\n arg.interactable = target;\n arg.element = element;\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n\n arg.options = target.options[interaction.prepared.name][modifierName];\n\n if (!arg.options) {\n continue;\n }\n\n interaction.modifierOffsets[modifierName] = modifiers[modifierName].setOffset(arg);\n }\n },\n\n setAll: function (arg) {\n const { interaction, statuses, preEnd, requireEndOnly } = arg;\n const coords = extend({}, arg.pageCoords);\n const result = {\n dx: 0,\n dy: 0,\n changed: false,\n locked: false,\n shouldMove: true,\n };\n\n for (const modifierName of modifiers.names) {\n const modifier = modifiers[modifierName];\n const options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!shouldDo(options, preEnd, requireEndOnly)) { continue; }\n\n arg.status = arg.status = statuses[modifierName];\n arg.options = options;\n arg.offset = arg.interaction.modifierOffsets[modifierName];\n\n modifier.set(arg);\n\n if (arg.status.locked) {\n coords.x += arg.status.dx;\n coords.y += arg.status.dy;\n\n result.dx += arg.status.dx;\n result.dy += arg.status.dy;\n\n result.locked = true;\n }\n }\n\n // a move should be fired if:\n // - there are no modifiers enabled,\n // - no modifiers are \"locked\" i.e. have changed the pointer's coordinates, or\n // - the locked coords have changed since the last pointer move\n result.shouldMove = !arg.status || !result.locked || arg.status.changed;\n\n return result;\n },\n\n resetStatuses: function (statuses) {\n for (const modifierName of modifiers.names) {\n const status = statuses[modifierName] || {};\n\n status.dx = status.dy = 0;\n status.modifiedX = status.modifiedY = NaN;\n status.locked = false;\n status.changed = true;\n\n statuses[modifierName] = status;\n }\n\n return statuses;\n },\n\n start: function ({ interaction }, signalName) {\n const arg = {\n interaction,\n pageCoords: (signalName === 'action-resume' ?\n interaction.curCoords : interaction.startCoords).page,\n startOffset: interaction.startOffset,\n statuses: interaction.modifierStatuses,\n preEnd: false,\n requireEndOnly: false,\n };\n\n modifiers.setOffsets(arg);\n modifiers.resetStatuses(arg.statuses);\n\n arg.pageCoords = extend({}, interaction.startCoords.page);\n interaction.modifierResult = modifiers.setAll(arg);\n },\n};\n\nInteraction.signals.on('new', function (interaction) {\n interaction.startOffset = { left: 0, right: 0, top: 0, bottom: 0 };\n interaction.modifierOffsets = {};\n interaction.modifierStatuses = modifiers.resetStatuses({});\n interaction.modifierResult = null;\n});\n\nInteraction.signals.on('action-start' , modifiers.start);\nInteraction.signals.on('action-resume', modifiers.start);\n\nInteraction.signals.on('before-action-move', function ({ interaction, preEnd, interactingBeforeMove }) {\n const modifierResult = modifiers.setAll({\n interaction,\n preEnd,\n pageCoords: interaction.curCoords.page,\n statuses: interaction.modifierStatuses,\n requireEndOnly: false,\n });\n\n // don't fire an action move if a modifier would keep the event in the same\n // cordinates as before\n if (!modifierResult.shouldMove && interactingBeforeMove) {\n interaction._dontFireMove = true;\n }\n\n interaction.modifierResult = modifierResult;\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n for (let i = 0; i < modifiers.names.length; i++) {\n const options = interaction.target.options[interaction.prepared.name][modifiers.names[i]];\n\n // if the endOnly option is true for any modifier\n if (shouldDo(options, true, true)) {\n // fire a move event at the modified coordinates\n interaction.doMove({ event, preEnd: true });\n break;\n }\n }\n});\n\nInteractEvent.signals.on('set-xy', function (arg) {\n const { iEvent, interaction } = arg;\n const modifierArg = extend({}, arg);\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n modifierArg.options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!modifierArg.options) {\n continue;\n }\n\n const modifier = modifiers[modifierName];\n\n modifierArg.status = interaction.modifierStatuses[modifierName];\n\n iEvent[modifierName] = modifier.modifyCoords(modifierArg);\n }\n});\n\nfunction shouldDo (options, preEnd, requireEndOnly) {\n return (options && options.enabled\n && (preEnd || !options.endOnly)\n && (!requireEndOnly || options.endOnly));\n}\n\nmodule.exports = modifiers;\n","const modifiers = require('./index');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst restrict = {\n defaults: {\n enabled : false,\n endOnly : false,\n restriction: null,\n elementRect: null,\n },\n\n setOffset: function ({ rect, startOffset, options }) {\n const elementRect = options && options.elementRect;\n const offset = {};\n\n if (rect && elementRect) {\n offset.left = startOffset.left - (rect.width * elementRect.left);\n offset.top = startOffset.top - (rect.height * elementRect.top);\n\n offset.right = startOffset.right - (rect.width * (1 - elementRect.right));\n offset.bottom = startOffset.bottom - (rect.height * (1 - elementRect.bottom));\n }\n else {\n offset.left = offset.top = offset.right = offset.bottom = 0;\n }\n\n return offset;\n },\n\n set: function ({ pageCoords, interaction, status, options }) {\n if (!options) { return status; }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n\n const restriction = getRestrictionRect(options.restriction, interaction, page);\n\n if (!restriction) { return status; }\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n const rect = restriction;\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n const offset = interaction.modifierOffsets.restrict;\n\n // object is assumed to have\n // x, y, width, height or\n // left, top, right, bottom\n if ('x' in restriction && 'y' in restriction) {\n modifiedX = Math.max(Math.min(rect.x + rect.width - offset.right , page.x), rect.x + offset.left);\n modifiedY = Math.max(Math.min(rect.y + rect.height - offset.bottom, page.y), rect.y + offset.top );\n }\n else {\n modifiedX = Math.max(Math.min(rect.right - offset.right , page.x), rect.left + offset.left);\n modifiedY = Math.max(Math.min(rect.bottom - offset.bottom, page.y), rect.top + offset.top );\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const elementRect = options && options.elementRect;\n\n if (options && options.enabled\n && !(phase === 'start' && elementRect && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n getRestrictionRect,\n};\n\nfunction getRestrictionRect (value, interaction, page) {\n if (utils.is.function(value)) {\n return utils.resolveRectLike(value, interaction.target, interaction.element, [page.x, page.y, interaction]);\n } else {\n return utils.resolveRectLike(value, interaction.target, interaction.element);\n }\n}\n\nmodifiers.restrict = restrict;\nmodifiers.names.push('restrict');\n\ndefaultOptions.perAction.restrict = restrict.defaults;\n\nmodule.exports = restrict;\n","// This module adds the options.resize.restrictEdges setting which sets min and\n// max for the top, left, bottom and right edges of the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictEdges: {\n// inner: { top: 200, left: 200, right: 400, bottom: 400 },\n// outer: { top: 0, left: 0, right: 600, bottom: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst { getRestrictionRect } = require('./restrict');\n\nconst noInner = { top: +Infinity, left: +Infinity, bottom: -Infinity, right: -Infinity };\nconst noOuter = { top: -Infinity, left: -Infinity, bottom: +Infinity, right: +Infinity };\n\nconst restrictEdges = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n offset: null,\n },\n\n setOffset: function ({ interaction, startOffset, options }) {\n if (!options) {\n return utils.extend({}, startOffset);\n }\n\n const offset = getRestrictionRect(options.offset, interaction, interaction.startCoords.page);\n\n if (offset) {\n return {\n top: startOffset.top + offset.y,\n left: startOffset.left + offset.x,\n bottom: startOffset.bottom + offset.y,\n right: startOffset.right + offset.x,\n };\n }\n\n return startOffset;\n },\n\n set: function ({ pageCoords, interaction, status, offset, options }) {\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n const inner = rectUtils.xywhToTlbr(getRestrictionRect(options.inner, interaction, page)) || noInner;\n const outer = rectUtils.xywhToTlbr(getRestrictionRect(options.outer, interaction, page)) || noOuter;\n\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n if (edges.top) {\n modifiedY = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top);\n }\n else if (edges.bottom) {\n modifiedY = Math.max(Math.min(outer.bottom - offset.bottom, page.y), inner.bottom - offset.bottom);\n }\n if (edges.left) {\n modifiedX = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left);\n }\n else if (edges.right) {\n modifiedX = Math.max(Math.min(outer.right - offset.right, page.x), inner.right - offset.right);\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n if (options && options.enabled\n && !(phase === 'start' && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n noInner,\n noOuter,\n getRestrictionRect,\n};\n\nmodifiers.restrictEdges = restrictEdges;\nmodifiers.names.push('restrictEdges');\n\ndefaultOptions.perAction.restrictEdges = restrictEdges.defaults;\nresize.defaults.restrictEdges = restrictEdges.defaults;\n\nmodule.exports = restrictEdges;\n","// This module adds the options.resize.restrictSize setting which sets min and\n// max width and height for the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictSize: {\n// min: { width: -600, height: -600 },\n// max: { width: 600, height: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst restrictEdges = require('./restrictEdges');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst noMin = { width: -Infinity, height: -Infinity };\nconst noMax = { width: +Infinity, height: +Infinity };\n\nconst restrictSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n },\n\n setOffset: function ({ interaction }) {\n return interaction.startOffset;\n },\n\n set: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const rect = rectUtils.xywhToTlbr(interaction.resizeRects.inverted);\n\n const minSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.min, interaction)) || noMin;\n const maxSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.max, interaction)) || noMax;\n\n arg.options = {\n enabled: options.enabled,\n endOnly: options.endOnly,\n inner: utils.extend({}, restrictEdges.noInner),\n outer: utils.extend({}, restrictEdges.noOuter),\n };\n\n if (edges.top) {\n arg.options.inner.top = rect.bottom - minSize.height;\n arg.options.outer.top = rect.bottom - maxSize.height;\n }\n else if (edges.bottom) {\n arg.options.inner.bottom = rect.top + minSize.height;\n arg.options.outer.bottom = rect.top + maxSize.height;\n }\n if (edges.left) {\n arg.options.inner.left = rect.right - minSize.width;\n arg.options.outer.left = rect.right - maxSize.width;\n }\n else if (edges.right) {\n arg.options.inner.right = rect.left + minSize.width;\n arg.options.outer.right = rect.left + maxSize.width;\n }\n\n restrictEdges.set(arg);\n },\n\n modifyCoords: restrictEdges.modifyCoords,\n};\n\nmodifiers.restrictSize = restrictSize;\nmodifiers.names.push('restrictSize');\n\ndefaultOptions.perAction.restrictSize = restrictSize.defaults;\nresize.defaults.restrictSize = restrictSize.defaults;\n\nmodule.exports = restrictSize;\n","const modifiers = require('./index');\nconst interact = require('../interact');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst snap = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n\n relativePoints: null,\n },\n\n setOffset: function ({ interaction, interactable, element, rect, startOffset, options }) {\n const offsets = [];\n const optionsOrigin = utils.rectToXY(utils.resolveRectLike(options.origin));\n const origin = optionsOrigin || utils.getOriginXY(interactable, element, interaction.prepared.name);\n options = options || interactable.options[interaction.prepared.name].snap || {};\n\n let snapOffset;\n\n if (options.offset === 'startCoords') {\n snapOffset = {\n x: interaction.startCoords.page.x - origin.x,\n y: interaction.startCoords.page.y - origin.y,\n };\n }\n else {\n const offsetRect = utils.resolveRectLike(options.offset, interactable, element, [interaction]);\n\n snapOffset = utils.rectToXY(offsetRect) || { x: 0, y: 0 };\n }\n\n if (rect && options.relativePoints && options.relativePoints.length) {\n for (const { x: relativeX, y: relativeY } of options.relativePoints) {\n offsets.push({\n x: startOffset.left - (rect.width * relativeX) + snapOffset.x,\n y: startOffset.top - (rect.height * relativeY) + snapOffset.y,\n });\n }\n }\n else {\n offsets.push(snapOffset);\n }\n\n return offsets;\n },\n\n set: function ({ interaction, pageCoords, status, options, offset: offsets }) {\n const targets = [];\n let target;\n let page;\n let i;\n\n if (status.useStatusXY) {\n page = { x: status.x, y: status.y };\n }\n else {\n const origin = utils.getOriginXY(interaction.target, interaction.element, interaction.prepared.name);\n\n page = utils.extend({}, pageCoords);\n\n page.x -= origin.x;\n page.y -= origin.y;\n }\n\n status.realX = page.x;\n status.realY = page.y;\n\n let len = options.targets? options.targets.length : 0;\n\n for (const { x: offsetX, y: offsetY } of offsets) {\n const relativeX = page.x - offsetX;\n const relativeY = page.y - offsetY;\n\n for (const snapTarget of options.targets) {\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n targets.push({\n x: utils.is.number(target.x) ? (target.x + offsetX) : relativeX,\n y: utils.is.number(target.y) ? (target.y + offsetY) : relativeY,\n\n range: utils.is.number(target.range)? target.range: options.range,\n });\n }\n }\n\n const closest = {\n target: null,\n inRange: false,\n distance: 0,\n range: 0,\n dx: 0,\n dy: 0,\n };\n\n for (i = 0, len = targets.length; i < len; i++) {\n target = targets[i];\n\n const range = target.range;\n const dx = target.x - page.x;\n const dy = target.y - page.y;\n const distance = utils.hypot(dx, dy);\n let inRange = distance <= range;\n\n // Infinite targets count as being out of range\n // compared to non infinite ones that are in range\n if (range === Infinity && closest.inRange && closest.range !== Infinity) {\n inRange = false;\n }\n\n if (!closest.target || (inRange\n // is the closest target in range?\n ? (closest.inRange && range !== Infinity\n // the pointer is relatively deeper in this target\n ? distance / range < closest.distance / closest.range\n // this target has Infinite range and the closest doesn't\n : (range === Infinity && closest.range !== Infinity)\n // OR this target is closer that the previous closest\n || distance < closest.distance)\n // The other is not in range and the pointer is closer to this target\n : (!closest.inRange && distance < closest.distance))) {\n\n closest.target = target;\n closest.distance = distance;\n closest.range = range;\n closest.inRange = inRange;\n closest.dx = dx;\n closest.dy = dy;\n\n status.range = range;\n }\n }\n\n let snapChanged;\n\n if (closest.target) {\n snapChanged = (status.modifiedX !== closest.target.x || status.modifiedY !== closest.target.y);\n\n status.modifiedX = closest.target.x;\n status.modifiedY = closest.target.y;\n }\n else {\n snapChanged = true;\n\n status.modifiedX = NaN;\n status.modifiedY = NaN;\n }\n\n status.dx = closest.dx;\n status.dy = closest.dy;\n\n status.changed = (snapChanged || (closest.inRange && !status.locked));\n status.locked = closest.inRange;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const relativePoints = options && options.relativePoints;\n\n if (options && options.enabled\n && !(phase === 'start' && relativePoints && relativePoints.length)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n }\n\n return {\n range : status.range,\n locked : status.locked,\n x : status.modifiedX,\n y : status.modifiedY,\n realX : status.realX,\n realY : status.realY,\n dx : status.dx,\n dy : status.dy,\n };\n }\n },\n};\n\ninteract.createSnapGrid = function (grid) {\n return function (x, y) {\n const limits = grid.limits || {\n left : -Infinity,\n right : Infinity,\n top : -Infinity,\n bottom: Infinity,\n };\n let offsetX = 0;\n let offsetY = 0;\n\n if (utils.is.object(grid.offset)) {\n offsetX = grid.offset.x;\n offsetY = grid.offset.y;\n }\n\n const gridx = Math.round((x - offsetX) / grid.x);\n const gridy = Math.round((y - offsetY) / grid.y);\n\n const newX = Math.max(limits.left, Math.min(limits.right , gridx * grid.x + offsetX));\n const newY = Math.max(limits.top , Math.min(limits.bottom, gridy * grid.y + offsetY));\n\n return {\n x: newX,\n y: newY,\n range: grid.range,\n };\n };\n};\n\nmodifiers.snap = snap;\nmodifiers.names.push('snap');\n\ndefaultOptions.perAction.snap = snap.defaults;\n\nmodule.exports = snap;\n","// This module allows snapping of the size of targets during resize\n// interactions.\n\nconst modifiers = require('./index');\nconst snap = require('./snap');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\nconst utils = require('../utils/');\n\nconst snapSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n },\n\n setOffset: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.edges;\n\n if (!edges) { return; }\n\n arg.options = {\n relativePoints: [{\n x: edges.left? 0 : 1,\n y: edges.top ? 0 : 1,\n }],\n origin: { x: 0, y: 0 },\n offset: 'self',\n range: options.range,\n };\n\n const offsets = snap.setOffset(arg);\n arg.options = options;\n\n return offsets;\n },\n\n set: function (arg) {\n const { interaction, options, offset, pageCoords } = arg;\n const page = utils.extend({}, pageCoords);\n const relativeX = page.x - offset[0].x;\n const relativeY = page.y - offset[0].y;\n\n arg.options = utils.extend({}, options);\n arg.options.targets = [];\n\n for (const snapTarget of options.targets) {\n let target;\n\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n if ('width' in target && 'height' in target) {\n target.x = target.width;\n target.y = target.height;\n }\n\n arg.options.targets.push(target);\n }\n\n snap.set(arg);\n },\n\n modifyCoords: function (arg) {\n const { options } = arg;\n\n arg.options = utils.extend({}, options);\n arg.options.enabled = options.enabled;\n arg.options.relativePoints = [null];\n\n snap.modifyCoords(arg);\n },\n};\n\nmodifiers.snapSize = snapSize;\nmodifiers.names.push('snapSize');\n\ndefaultOptions.perAction.snapSize = snapSize.defaults;\nresize.defaults.snapSize = snapSize.defaults;\n\nmodule.exports = snapSize;\n","const pointerUtils = require('../utils/pointerUtils');\n\nmodule.exports = class PointerEvent {\n constructor (type, pointer, event, eventTarget, interaction) {\n pointerUtils.pointerExtend(this, event);\n\n if (event !== pointer) {\n pointerUtils.pointerExtend(this, pointer);\n }\n\n this.interaction = interaction;\n\n this.timeStamp = new Date().getTime();\n this.originalEvent = event;\n this.type = type;\n this.pointerId = pointerUtils.getPointerId(pointer);\n this.pointerType = pointerUtils.getPointerType(pointer);\n this.target = eventTarget;\n this.currentTarget = null;\n\n if (type === 'tap') {\n const pointerIndex = interaction.getPointerIndex(pointer);\n this.dt = this.timeStamp - interaction.downTimes[pointerIndex];\n\n const interval = this.timeStamp - interaction.tapTime;\n\n this.double = !!(interaction.prevTap\n && interaction.prevTap.type !== 'doubletap'\n && interaction.prevTap.target === this.target\n && interval < 500);\n }\n else if (type === 'doubletap') {\n this.dt = pointer.timeStamp - interaction.tapTime;\n }\n }\n\n subtractOrigin ({ x: originX, y: originY }) {\n this.pageX -= originX;\n this.pageY -= originY;\n this.clientX -= originX;\n this.clientY -= originY;\n\n return this;\n }\n\n addOrigin ({ x: originX, y: originY }) {\n this.pageX += originX;\n this.pageY += originY;\n this.clientX += originX;\n this.clientY += originY;\n\n return this;\n }\n\n preventDefault () {\n this.originalEvent.preventDefault();\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n};\n","const PointerEvent = require('./PointerEvent');\nconst Interaction = require('../Interaction');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst defaults = require('../defaultOptions');\nconst signals = require('../utils/Signals').new();\nconst { filter } = require('../utils/arr');\n\nconst simpleSignals = [ 'down', 'up', 'cancel' ];\nconst simpleEvents = [ 'down', 'up', 'cancel' ];\n\nconst pointerEvents = {\n PointerEvent,\n fire,\n collectEventTargets,\n signals,\n defaults: {\n holdDuration: 600,\n ignoreFrom : null,\n allowFrom : null,\n origin : { x: 0, y: 0 },\n },\n types: [\n 'down',\n 'move',\n 'up',\n 'cancel',\n 'tap',\n 'doubletap',\n 'hold',\n ],\n};\n\nfunction fire (arg) {\n const {\n interaction, pointer, event, eventTarget,\n type = arg.pointerEvent.type,\n targets = collectEventTargets(arg),\n pointerEvent = new PointerEvent(type, pointer, event, eventTarget, interaction),\n } = arg;\n\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n targets,\n type,\n pointerEvent,\n };\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n\n for (const prop in target.props || {}) {\n pointerEvent[prop] = target.props[prop];\n }\n\n const origin = utils.getOriginXY(target.eventable, target.element);\n\n pointerEvent.subtractOrigin(origin);\n pointerEvent.eventable = target.eventable;\n pointerEvent.currentTarget = target.element;\n\n target.eventable.fire(pointerEvent);\n\n pointerEvent.addOrigin(origin);\n\n if (pointerEvent.immediatePropagationStopped\n || (pointerEvent.propagationStopped\n && (i + 1) < targets.length && targets[i + 1].element !== pointerEvent.currentTarget)) {\n break;\n }\n }\n\n signals.fire('fired', signalArg);\n\n if (type === 'tap') {\n // if pointerEvent should make a double tap, create and fire a doubletap\n // PointerEvent and use that as the prevTap\n const prevTap = pointerEvent.double\n ? fire({\n interaction, pointer, event, eventTarget,\n type: 'doubletap',\n })\n : pointerEvent;\n\n interaction.prevTap = prevTap;\n interaction.tapTime = prevTap.timeStamp;\n }\n\n return pointerEvent;\n}\n\nfunction collectEventTargets ({ interaction, pointer, event, eventTarget, type }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n // do not fire a tap event if the pointer was moved before being lifted\n if (type === 'tap' && (interaction.pointerWasMoved\n // or if the pointerup target is different to the pointerdown target\n || !(interaction.downTargets[pointerIndex] && interaction.downTargets[pointerIndex] === eventTarget))) {\n return [];\n }\n\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n path,\n targets: [],\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (type === 'hold') {\n signalArg.targets = filter(signalArg.targets, target =>\n target.eventable.options.holdDuration === interaction.holdTimers[pointerIndex].duration);\n }\n\n return signalArg.targets;\n}\n\nInteraction.signals.on('update-pointer-down', function ({ interaction, pointerIndex }) {\n interaction.holdTimers[pointerIndex] = { duration: Infinity, timeout: null };\n});\n\nInteraction.signals.on('remove-pointer', function ({ interaction, pointerIndex }) {\n interaction.holdTimers.splice(pointerIndex, 1);\n});\n\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget, duplicateMove }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n if (!duplicateMove && (!interaction.pointerIsDown || interaction.pointerWasMoved)) {\n if (interaction.pointerIsDown) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n\n fire({\n interaction, pointer, event, eventTarget,\n type: 'move',\n });\n }\n});\n\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget, pointerIndex }) {\n // copy event to be used in timeout for IE8\n const eventCopy = browser.isIE8? utils.extend({}, event) : event;\n\n const timer = interaction.holdTimers[pointerIndex];\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'hold',\n targets: [],\n path,\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (!signalArg.targets.length) { return; }\n\n let minDuration = Infinity;\n\n for (let i = 0; i < signalArg.targets.length; i++) {\n const target = signalArg.targets[i];\n const holdDuration = target.eventable.options.holdDuration;\n\n if (holdDuration < minDuration) {\n minDuration = holdDuration;\n }\n }\n\n timer.duration = minDuration;\n timer.timeout = setTimeout(function () {\n fire({\n interaction,\n eventTarget,\n pointer: browser.isIE8? eventCopy : pointer,\n event: eventCopy,\n type: 'hold',\n });\n }, minDuration);\n});\n\nInteraction.signals.on('up', ({ interaction, pointer, event, eventTarget }) => {\n if (!interaction.pointerWasMoved) {\n fire({ interaction, eventTarget, pointer, event, type: 'tap' });\n }\n});\n\n['up', 'cancel'].forEach(function (signalName) {\n Interaction.signals.on(signalName, function ({ interaction, pointerIndex }) {\n if (interaction.holdTimers[pointerIndex]) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n });\n});\n\nfunction createSignalListener (type) {\n return function ({ interaction, pointer, event, eventTarget }) {\n fire({ interaction, eventTarget, pointer, event, type });\n };\n}\n\nfor (let i = 0; i < simpleSignals.length; i++) {\n Interaction.signals.on(simpleSignals[i], createSignalListener(simpleEvents[i]));\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.prevTap = null; // the most recent tap event on this interaction\n interaction.tapTime = 0; // time of the most recent tap event\n interaction.holdTimers = []; // [{ duration, timeout }]\n});\n\ndefaults.pointerEvents = pointerEvents.defaults;\nmodule.exports = pointerEvents;\n","const pointerEvents = require('./base');\nconst Interaction = require('../Interaction');\n\npointerEvents.signals.on('new', onNew);\npointerEvents.signals.on('fired', onFired);\n\nfor (const signal of ['move', 'up', 'cancel', 'endall']) {\n Interaction.signals.on(signal, endHoldRepeat);\n}\n\nfunction onNew ({ pointerEvent }) {\n if (pointerEvent.type !== 'hold') { return; }\n\n pointerEvent.count = (pointerEvent.count || 0) + 1;\n}\n\nfunction onFired ({ interaction, pointerEvent, eventTarget, targets }) {\n if (pointerEvent.type !== 'hold' || !targets.length) { return; }\n\n // get the repeat interval from the first eventable\n const interval = targets[0].eventable.options.holdRepeatInterval;\n\n // don't repeat if the interval is 0 or less\n if (interval <= 0) { return; }\n\n // set a timeout to fire the holdrepeat event\n interaction.holdIntervalHandle = setTimeout(function () {\n pointerEvents.fire({\n interaction,\n eventTarget,\n type: 'hold',\n pointer: pointerEvent,\n event: pointerEvent,\n });\n }, interval);\n}\n\nfunction endHoldRepeat ({ interaction }) {\n // set the interaction's holdStopTime property\n // to stop further holdRepeat events\n if (interaction.holdIntervalHandle) {\n clearInterval(interaction.holdIntervalHandle);\n interaction.holdIntervalHandle = null;\n }\n}\n\n// don't repeat by default\npointerEvents.defaults.holdRepeatInterval = 0;\npointerEvents.types.push('holdrepeat');\n\nmodule.exports = {\n onNew,\n onFired,\n endHoldRepeat,\n};\n","const pointerEvents = require('./base');\nconst Interactable = require('../Interactable');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\nconst scope = require('../scope');\nconst extend = require('../utils/extend');\nconst { merge } = require('../utils/arr');\n\npointerEvents.signals.on('collect-targets', function ({ targets, element, type, eventTarget }) {\n function collectSelectors (interactable, selector, context) {\n const els = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && is.element(element)\n && domUtils.matchesSelector(element, selector, els)\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n const interactable = scope.interactables.get(element);\n\n if (interactable) {\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n scope.interactables.forEachSelector(collectSelectors, element);\n});\n\nInteractable.signals.on('new', function ({ interactable }) {\n interactable.events.getRect = function (element) {\n return interactable.getRect(element);\n };\n});\n\nInteractable.signals.on('set', function ({ interactable, options }) {\n extend(interactable.events.options, pointerEvents.defaults);\n extend(interactable.events.options, options);\n});\n\nmerge(Interactable.eventTypes, pointerEvents.types);\n\nInteractable.prototype.pointerEvents = function (options) {\n extend(this.events.options, options);\n\n return this;\n};\n\nconst __backCompatOption = Interactable.prototype._backCompatOption;\n\nInteractable.prototype._backCompatOption = function (optionName, newValue) {\n const ret = __backCompatOption.call(this, optionName, newValue);\n\n if (ret === this) {\n this.events.options[optionName] = newValue;\n }\n\n return ret;\n};\n\nInteractable.settingsMethods.push('pointerEvents');\n","const utils = require('./utils');\nconst events = require('./utils/events');\nconst signals = require('./utils/Signals').new();\n\nconst scope = {\n signals,\n events,\n utils,\n\n // main document\n document: require('./utils/domObjects').document,\n // all documents being listened to\n documents: [],\n\n addDocument: function (doc, win) {\n // do nothing if document is already known\n if (utils.contains(scope.documents, doc)) { return false; }\n\n win = win || scope.getWindow(doc);\n\n scope.documents.push(doc);\n events.documents.push(doc);\n\n // don't add an unload event for the main document\n // so that the page may be cached in browser history\n if (doc !== scope.document) {\n events.add(win, 'unload', scope.onWindowUnload);\n }\n\n signals.fire('add-document', { doc, win });\n },\n\n removeDocument: function (doc, win) {\n const index = utils.indexOf(scope.documents, doc);\n\n win = win || scope.getWindow(doc);\n\n events.remove(win, 'unload', scope.onWindowUnload);\n\n scope.documents.splice(index, 1);\n events.documents.splice(index, 1);\n\n signals.fire('remove-document', { win, doc });\n },\n\n onWindowUnload: function () {\n scope.removeDocument(this.document, this);\n },\n};\n\nmodule.exports = scope;\n","const { indexOf } = require('./arr');\n\nclass Signals {\n constructor () {\n this.listeners = {\n // signalName: [listeners],\n };\n }\n\n on (name, listener) {\n if (!this.listeners[name]) {\n this.listeners[name] = [listener];\n return;\n }\n\n this.listeners[name].push(listener);\n }\n\n off (name, listener) {\n if (!this.listeners[name]) { return; }\n\n const index = indexOf(this.listeners[name], listener);\n\n if (index !== -1) {\n this.listeners[name].splice(index, 1);\n }\n }\n\n fire (name, arg) {\n const targetListeners = this.listeners[name];\n\n if (!targetListeners) { return; }\n\n for (let i = 0; i < targetListeners.length; i++) {\n if (targetListeners[i](arg, name) === false) {\n return;\n }\n }\n }\n}\n\nSignals.new = function () {\n return new Signals();\n};\n\nmodule.exports = Signals;\n","function indexOf (array, target) {\n for (let i = 0, len = array.length; i < len; i++) {\n if (array[i] === target) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction contains (array, target) {\n return indexOf(array, target) !== -1;\n}\n\nfunction merge (target, source) {\n for (let i = 0; i < source.length; i++) {\n target.push(source[i]);\n }\n\n return target;\n}\n\nfunction filter (array, test) {\n const result = [];\n\n for (let i = 0; i < array.length; i++) {\n if (test(array[i])) {\n result.push(array[i]);\n }\n }\n\n return result;\n}\n\nmodule.exports = {\n indexOf,\n contains,\n merge,\n filter,\n};\n","const { window } = require('./window');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst Element = domObjects.Element;\nconst navigator = window.navigator;\n\nconst browser = {\n // Does the browser support touch input?\n supportsTouch: !!(('ontouchstart' in window) || is.function(window.DocumentTouch)\n && domObjects.document instanceof window.DocumentTouch),\n\n // Does the browser support PointerEvents\n supportsPointerEvent: !!domObjects.PointerEvent,\n\n isIE8: ('attachEvent' in window) && !('addEventListener' in window),\n\n // Opera Mobile must be handled differently\n isOperaMobile: (navigator.appName === 'Opera'\n && browser.supportsTouch\n && navigator.userAgent.match('Presto')),\n\n // scrolling doesn't change the result of getClientRects on iOS 7\n isIOS7: (/iP(hone|od|ad)/.test(navigator.platform)\n && /OS 7[^\\d]/.test(navigator.appVersion)),\n\n isIe9OrOlder: /MSIE (8|9)/.test(navigator.userAgent),\n\n // prefix matchesSelector\n prefixedMatchesSelector: 'matches' in Element.prototype\n ? 'matches': 'webkitMatchesSelector' in Element.prototype\n ? 'webkitMatchesSelector': 'mozMatchesSelector' in Element.prototype\n ? 'mozMatchesSelector': 'oMatchesSelector' in Element.prototype\n ? 'oMatchesSelector': 'msMatchesSelector',\n\n useMatchesSelectorPolyfill: false,\n\n pEventTypes: (domObjects.PointerEvent\n ? (domObjects.PointerEvent === window.MSPointerEvent\n ? {\n up: 'MSPointerUp',\n down: 'MSPointerDown',\n over: 'mouseover',\n out: 'mouseout',\n move: 'MSPointerMove',\n cancel: 'MSPointerCancel',\n }\n : {\n up: 'pointerup',\n down: 'pointerdown',\n over: 'pointerover',\n out: 'pointerout',\n move: 'pointermove',\n cancel: 'pointercancel',\n })\n : null),\n\n // because Webkit and Opera still use 'mousewheel' event type\n wheelEvent: 'onmousewheel' in domObjects.document? 'mousewheel': 'wheel',\n\n};\n\nbrowser.useMatchesSelectorPolyfill = !is.function(Element.prototype[browser.prefixedMatchesSelector]);\n\nmodule.exports = browser;\n","const domObjects = {};\nconst win = require('./window').window;\n\nfunction blank () {}\n\ndomObjects.document = win.document;\ndomObjects.DocumentFragment = win.DocumentFragment || blank;\ndomObjects.SVGElement = win.SVGElement || blank;\ndomObjects.SVGSVGElement = win.SVGSVGElement || blank;\ndomObjects.SVGElementInstance = win.SVGElementInstance || blank;\ndomObjects.Element = win.Element || blank;\ndomObjects.HTMLElement = win.HTMLElement || domObjects.Element;\n\ndomObjects.Event = win.Event;\ndomObjects.Touch = win.Touch || blank;\ndomObjects.PointerEvent = (win.PointerEvent || win.MSPointerEvent);\n\nmodule.exports = domObjects;\n","const win = require('./window');\nconst browser = require('./browser');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst domUtils = {\n nodeContains: function (parent, child) {\n while (child) {\n if (child === parent) {\n return true;\n }\n\n child = child.parentNode;\n }\n\n return false;\n },\n\n closest: function (element, selector) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) { return element; }\n\n element = domUtils.parentNode(element);\n }\n\n return null;\n },\n\n parentNode: function (node) {\n let parent = node.parentNode;\n\n if (is.docFrag(parent)) {\n // skip past #shado-root fragments\n while ((parent = parent.host) && is.docFrag(parent)) {\n continue;\n }\n\n return parent;\n }\n\n return parent;\n },\n\n // taken from http://tanalin.com/en/blog/2012/12/matches-selector-ie8/ and modified\n matchesSelectorPolyfill: browser.useMatchesSelectorPolyfill\n ? function (element, selector, elems) {\n elems = elems || element.parentNode.querySelectorAll(selector);\n\n for (let i = 0, len = elems.length; i < len; i++) {\n if (elems[i] === element) {\n return true;\n }\n }\n\n return false;\n }\n : null,\n\n matchesSelector: function (element, selector, nodeList) {\n if (browser.useMatchesSelectorPolyfill) {\n return domUtils.matchesSelectorPolyfill(element, selector, nodeList);\n }\n\n // remove /deep/ from selectors if shadowDOM polyfill is used\n if (win.window !== win.realWindow) {\n selector = selector.replace(/\\/deep\\//g, ' ');\n }\n\n return element[browser.prefixedMatchesSelector](selector);\n },\n\n // Test for the element that's \"above\" all other qualifiers\n indexOfDeepestElement: function (elements) {\n let deepestZoneParents = [];\n let dropzoneParents = [];\n let dropzone;\n let deepestZone = elements[0];\n let index = deepestZone? 0: -1;\n let parent;\n let child;\n let i;\n let n;\n\n for (i = 1; i < elements.length; i++) {\n dropzone = elements[i];\n\n // an element might belong to multiple selector dropzones\n if (!dropzone || dropzone === deepestZone) {\n continue;\n }\n\n if (!deepestZone) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n // check if the deepest or current are document.documentElement or document.rootElement\n // - if the current dropzone is, do nothing and continue\n if (dropzone.parentNode === dropzone.ownerDocument) {\n continue;\n }\n // - if deepest is, update with the current dropzone and continue to next\n else if (deepestZone.parentNode === dropzone.ownerDocument) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n if (!deepestZoneParents.length) {\n parent = deepestZone;\n while (parent.parentNode && parent.parentNode !== parent.ownerDocument) {\n deepestZoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n }\n\n // if this element is an svg element and the current deepest is\n // an HTMLElement\n if (deepestZone instanceof domObjects.HTMLElement\n && dropzone instanceof domObjects.SVGElement\n && !(dropzone instanceof domObjects.SVGSVGElement)) {\n\n if (dropzone === deepestZone.parentNode) {\n continue;\n }\n\n parent = dropzone.ownerSVGElement;\n }\n else {\n parent = dropzone;\n }\n\n dropzoneParents = [];\n\n while (parent.parentNode !== parent.ownerDocument) {\n dropzoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n\n n = 0;\n\n // get (position of last common ancestor) + 1\n while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) {\n n++;\n }\n\n const parents = [\n dropzoneParents[n - 1],\n dropzoneParents[n],\n deepestZoneParents[n],\n ];\n\n child = parents[0].lastChild;\n\n while (child) {\n if (child === parents[1]) {\n deepestZone = dropzone;\n index = i;\n deepestZoneParents = [];\n\n break;\n }\n else if (child === parents[2]) {\n break;\n }\n\n child = child.previousSibling;\n }\n }\n\n return index;\n },\n\n matchesUpTo: function (element, selector, limit) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) {\n return true;\n }\n\n element = domUtils.parentNode(element);\n\n if (element === limit) {\n return domUtils.matchesSelector(element, selector);\n }\n }\n\n return false;\n },\n\n getActualElement: function (element) {\n return (element instanceof domObjects.SVGElementInstance\n ? element.correspondingUseElement\n : element);\n },\n\n getScrollXY: function (relevantWindow) {\n relevantWindow = relevantWindow || win.window;\n return {\n x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft,\n y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop,\n };\n },\n\n getElementClientRect: function (element) {\n const clientRect = (element instanceof domObjects.SVGElement\n ? element.getBoundingClientRect()\n : element.getClientRects()[0]);\n\n return clientRect && {\n left : clientRect.left,\n right : clientRect.right,\n top : clientRect.top,\n bottom: clientRect.bottom,\n width : clientRect.width || clientRect.right - clientRect.left,\n height: clientRect.height || clientRect.bottom - clientRect.top,\n };\n },\n\n getElementRect: function (element) {\n const clientRect = domUtils.getElementClientRect(element);\n\n if (!browser.isIOS7 && clientRect) {\n const scroll = domUtils.getScrollXY(win.getWindow(element));\n\n clientRect.left += scroll.x;\n clientRect.right += scroll.x;\n clientRect.top += scroll.y;\n clientRect.bottom += scroll.y;\n }\n\n return clientRect;\n },\n\n getPath: function (element) {\n const path = [];\n\n while (element) {\n path.push(element);\n element = domUtils.parentNode(element);\n }\n\n return path;\n },\n\n trySelector: value => {\n if (!is.string(value)) { return false; }\n\n // an exception will be raised if it is invalid\n domObjects.document.querySelector(value);\n return true;\n },\n};\n\nmodule.exports = domUtils;\n","const is = require('./is');\nconst domUtils = require('./domUtils');\nconst pExtend = require('./pointerExtend');\n\nconst { window, getWindow } = require('./window');\nconst { indexOf, contains } = require('./arr');\n\nconst useAttachEvent = ('attachEvent' in window) && !('addEventListener' in window);\nconst addEvent = useAttachEvent? 'attachEvent': 'addEventListener';\nconst removeEvent = useAttachEvent? 'detachEvent': 'removeEventListener';\nconst on = useAttachEvent? 'on': '';\n\nconst elements = [];\nconst targets = [];\nconst attachedListeners = [];\n\n// {\n// type: {\n// selectors: ['selector', ...],\n// contexts : [document, ...],\n// listeners: [[listener, capture, passive], ...]\n// }\n// }\nconst delegatedEvents = {};\n\nconst documents = [];\n\nconst supportsOptions = !useAttachEvent && (() => {\n let supported = false;\n\n window.document.createElement('div').addEventListener('test', null, {\n get capture () { supported = true; },\n });\n\n return supported;\n})();\n\nfunction add (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n let elementIndex = indexOf(elements, element);\n let target = targets[elementIndex];\n\n if (!target) {\n target = {\n events: {},\n typeCount: 0,\n };\n\n elementIndex = elements.push(element) - 1;\n targets.push(target);\n\n attachedListeners.push(useAttachEvent\n ? {\n supplied: [],\n wrapped : [],\n useCount: [],\n }\n : null);\n }\n\n if (!target.events[type]) {\n target.events[type] = [];\n target.typeCount++;\n }\n\n if (!contains(target.events[type], listener)) {\n let ret;\n\n if (useAttachEvent) {\n const { supplied, wrapped, useCount } = attachedListeners[elementIndex];\n const listenerIndex = indexOf(supplied, listener);\n\n const wrappedListener = wrapped[listenerIndex] || function (event) {\n if (!event.immediatePropagationStopped) {\n event.target = event.srcElement;\n event.currentTarget = element;\n\n event.preventDefault = event.preventDefault || preventDef;\n event.stopPropagation = event.stopPropagation || stopProp;\n event.stopImmediatePropagation = event.stopImmediatePropagation || stopImmProp;\n\n if (/mouse|click/.test(event.type)) {\n event.pageX = event.clientX + getWindow(element).document.documentElement.scrollLeft;\n event.pageY = event.clientY + getWindow(element).document.documentElement.scrollTop;\n }\n\n listener(event);\n }\n };\n\n ret = element[addEvent](on + type, wrappedListener, !!options.capture);\n\n if (listenerIndex === -1) {\n supplied.push(listener);\n wrapped.push(wrappedListener);\n useCount.push(1);\n }\n else {\n useCount[listenerIndex]++;\n }\n }\n else {\n ret = element[addEvent](type, listener, supportsOptions? options : !!options.capture);\n }\n target.events[type].push(listener);\n\n return ret;\n }\n}\n\nfunction remove (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const elementIndex = indexOf(elements, element);\n const target = targets[elementIndex];\n\n if (!target || !target.events) {\n return;\n }\n\n let wrappedListener = listener;\n let listeners;\n let listenerIndex;\n\n if (useAttachEvent) {\n listeners = attachedListeners[elementIndex];\n listenerIndex = indexOf(listeners.supplied, listener);\n wrappedListener = listeners.wrapped[listenerIndex];\n }\n\n if (type === 'all') {\n for (type in target.events) {\n if (target.events.hasOwnProperty(type)) {\n remove(element, type, 'all');\n }\n }\n return;\n }\n\n if (target.events[type]) {\n const len = target.events[type].length;\n\n if (listener === 'all') {\n for (let i = 0; i < len; i++) {\n remove(element, type, target.events[type][i], options);\n }\n return;\n }\n else {\n for (let i = 0; i < len; i++) {\n if (target.events[type][i] === listener) {\n element[removeEvent](on + type, wrappedListener, supportsOptions? options : !!options.capture);\n target.events[type].splice(i, 1);\n\n if (useAttachEvent && listeners) {\n listeners.useCount[listenerIndex]--;\n if (listeners.useCount[listenerIndex] === 0) {\n listeners.supplied.splice(listenerIndex, 1);\n listeners.wrapped.splice(listenerIndex, 1);\n listeners.useCount.splice(listenerIndex, 1);\n }\n }\n\n break;\n }\n }\n }\n\n if (target.events[type] && target.events[type].length === 0) {\n target.events[type] = null;\n target.typeCount--;\n }\n }\n\n if (!target.typeCount) {\n targets.splice(elementIndex, 1);\n elements.splice(elementIndex, 1);\n attachedListeners.splice(elementIndex, 1);\n }\n}\n\nfunction addDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n if (!delegatedEvents[type]) {\n delegatedEvents[type] = {\n selectors: [],\n contexts : [],\n listeners: [],\n };\n\n // add delegate listener functions\n for (let i = 0; i < documents.length; i++) {\n add(documents[i], type, delegateListener);\n add(documents[i], type, delegateUseCapture, true);\n }\n }\n\n const delegated = delegatedEvents[type];\n let index;\n\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n break;\n }\n }\n\n if (index === -1) {\n index = delegated.selectors.length;\n\n delegated.selectors.push(selector);\n delegated.contexts .push(context);\n delegated.listeners.push([]);\n }\n\n // keep listener and capture and passive flags\n delegated.listeners[index].push([listener, !!options.capture, options.passive]);\n}\n\nfunction removeDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const delegated = delegatedEvents[type];\n let matchFound = false;\n let index;\n\n if (!delegated) { return; }\n\n // count from last index of delegated to 0\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n // look for matching selector and context Node\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n\n const listeners = delegated.listeners[index];\n\n // each item of the listeners array is an array: [function, capture, passive]\n for (let i = listeners.length - 1; i >= 0; i--) {\n const [fn, capture, passive] = listeners[i];\n\n // check if the listener functions and capture and passive flags match\n if (fn === listener && capture === !!options.capture && passive === options.passive) {\n // remove the listener from the array of listeners\n listeners.splice(i, 1);\n\n // if all listeners for this interactable have been removed\n // remove the interactable from the delegated arrays\n if (!listeners.length) {\n delegated.selectors.splice(index, 1);\n delegated.contexts .splice(index, 1);\n delegated.listeners.splice(index, 1);\n\n // remove delegate function from context\n remove(context, type, delegateListener);\n remove(context, type, delegateUseCapture, true);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegatedEvents[type] = null;\n }\n }\n\n // only remove one listener\n matchFound = true;\n break;\n }\n }\n\n if (matchFound) { break; }\n }\n }\n}\n\n// bound to the interactable context when a DOM event\n// listener is added to a selector interactable\nfunction delegateListener (event, optionalArg) {\n const options = getOptions(optionalArg);\n const fakeEvent = {};\n const delegated = delegatedEvents[event.type];\n const eventTarget = (domUtils.getActualElement(event.path\n ? event.path[0]\n : event.target));\n let element = eventTarget;\n\n // duplicate the event so that currentTarget can be changed\n pExtend(fakeEvent, event);\n\n fakeEvent.originalEvent = event;\n fakeEvent.preventDefault = preventOriginalDefault;\n\n // climb up document tree looking for selector matches\n while (is.element(element)) {\n for (let i = 0; i < delegated.selectors.length; i++) {\n const selector = delegated.selectors[i];\n const context = delegated.contexts[i];\n\n if (domUtils.matchesSelector(element, selector)\n && domUtils.nodeContains(context, eventTarget)\n && domUtils.nodeContains(context, element)) {\n\n const listeners = delegated.listeners[i];\n\n fakeEvent.currentTarget = element;\n\n for (let j = 0; j < listeners.length; j++) {\n const [fn, capture, passive] = listeners[j];\n\n if (capture === !!options.capture && passive === options.passive) {\n fn(fakeEvent);\n }\n }\n }\n }\n\n element = domUtils.parentNode(element);\n }\n}\n\nfunction delegateUseCapture (event) {\n return delegateListener.call(this, event, true);\n}\n\nfunction preventDef () {\n this.returnValue = false;\n}\n\nfunction preventOriginalDefault () {\n this.originalEvent.preventDefault();\n}\n\nfunction stopProp () {\n this.cancelBubble = true;\n}\n\nfunction stopImmProp () {\n this.cancelBubble = true;\n this.immediatePropagationStopped = true;\n}\n\nfunction getOptions (param) {\n return is.object(param)? param : { capture: param };\n}\n\nmodule.exports = {\n add,\n remove,\n\n addDelegate,\n removeDelegate,\n\n delegateListener,\n delegateUseCapture,\n delegatedEvents,\n documents,\n\n useAttachEvent,\n supportsOptions,\n\n _elements: elements,\n _targets: targets,\n _attachedListeners: attachedListeners,\n};\n","module.exports = function extend (dest, source) {\n for (const prop in source) {\n dest[prop] = source[prop];\n }\n return dest;\n};\n","const {\n resolveRectLike,\n rectToXY,\n} = require('./rect');\n\nmodule.exports = function (target, element, action) {\n const actionOptions = target.options[action];\n const actionOrigin = actionOptions && actionOptions.origin;\n const origin = actionOrigin || target.options.origin;\n\n const originRect = resolveRectLike(origin, target, element, [target && element]);\n\n return rectToXY(originRect) || { x: 0, y: 0 };\n};\n","module.exports = (x, y) => Math.sqrt(x * x + y * y);\n","const extend = require('./extend');\nconst win = require('./window');\n\nconst utils = {\n warnOnce: function (method, message) {\n let warned = false;\n\n return function () {\n if (!warned) {\n win.window.console.warn(message);\n warned = true;\n }\n\n return method.apply(this, arguments);\n };\n },\n\n // http://stackoverflow.com/a/5634528/2280888\n _getQBezierValue: function (t, p1, p2, p3) {\n const iT = 1 - t;\n return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3;\n },\n\n getQuadraticCurvePoint: function (startX, startY, cpX, cpY, endX, endY, position) {\n return {\n x: utils._getQBezierValue(position, startX, cpX, endX),\n y: utils._getQBezierValue(position, startY, cpY, endY),\n };\n },\n\n // http://gizma.com/easing/\n easeOutQuad: function (t, b, c, d) {\n t /= d;\n return -c * t*(t-2) + b;\n },\n\n copyAction: function (dest, src) {\n dest.name = src.name;\n dest.axis = src.axis;\n dest.edges = src.edges;\n\n return dest;\n },\n\n is : require('./is'),\n extend : extend,\n hypot : require('./hypot'),\n getOriginXY: require('./getOriginXY'),\n};\n\nextend(utils, require('./arr'));\nextend(utils, require('./domUtils'));\nextend(utils, require('./pointerUtils'));\nextend(utils, require('./rect'));\n\nmodule.exports = utils;\n","const scope = require('../scope');\nconst utils = require('./index');\n\nconst finder = {\n methodOrder: [ 'simulationResume', 'mouseOrPen', 'hasPointer', 'idle' ],\n\n search: function (pointer, eventType, eventTarget) {\n const pointerType = utils.getPointerType(pointer);\n const pointerId = utils.getPointerId(pointer);\n const details = { pointer, pointerId, pointerType, eventType, eventTarget };\n\n for (const method of finder.methodOrder) {\n const interaction = finder[method](details);\n\n if (interaction) {\n return interaction;\n }\n }\n },\n\n // try to resume simulation with a new pointer\n simulationResume: function ({ pointerType, eventType, eventTarget }) {\n if (!/down|start/i.test(eventType)) {\n return null;\n }\n\n for (const interaction of scope.interactions) {\n let element = eventTarget;\n\n if (interaction.simulation && interaction.simulation.allowResume\n && (interaction.pointerType === pointerType)) {\n while (element) {\n // if the element is the interaction element\n if (element === interaction.element) {\n return interaction;\n }\n element = utils.parentNode(element);\n }\n }\n }\n\n return null;\n },\n\n // if it's a mouse or pen interaction\n mouseOrPen: function ({ pointerId, pointerType, eventType }) {\n if (pointerType !== 'mouse' && pointerType !== 'pen') {\n return null;\n }\n\n let firstNonActive;\n\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType) {\n // if it's a down event, skip interactions with running simulations\n if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; }\n\n // if the interaction is active, return it immediately\n if (interaction.interacting()) {\n return interaction;\n }\n // otherwise save it and look for another active interaction\n else if (!firstNonActive) {\n firstNonActive = interaction;\n }\n }\n }\n\n // if no active mouse interaction was found use the first inactive mouse\n // interaction\n if (firstNonActive) {\n return firstNonActive;\n }\n\n // find any mouse or pen interaction.\n // ignore the interaction if the eventType is a *down, and a simulation\n // is active\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType && !(/down/i.test(eventType) && interaction.simulation)) {\n return interaction;\n }\n }\n\n return null;\n },\n\n // get interaction that has this pointer\n hasPointer: function ({ pointerId }) {\n for (const interaction of scope.interactions) {\n if (utils.contains(interaction.pointerIds, pointerId)) {\n return interaction;\n }\n }\n },\n\n // get first idle interaction with a matching pointerType\n idle: function ({ pointerType }) {\n for (const interaction of scope.interactions) {\n // if there's already a pointer held down\n if (interaction.pointerIds.length === 1) {\n const target = interaction.target;\n // don't add this pointer if there is a target interactable and it\n // isn't gesturable\n if (target && !target.options.gesture.enabled) {\n continue;\n }\n }\n // maximum of 2 pointers per interaction\n else if (interaction.pointerIds.length >= 2) {\n continue;\n }\n\n if (!interaction.interacting() && (pointerType === interaction.pointerType)) {\n return interaction;\n }\n }\n\n return null;\n },\n};\n\nmodule.exports = finder;\n","const win = require('./window');\nconst isWindow = require('./isWindow');\n\nconst is = {\n array : () => {},\n\n window : thing => thing === win.window || isWindow(thing),\n\n docFrag : thing => is.object(thing) && thing.nodeType === 11,\n\n object : thing => !!thing && (typeof thing === 'object'),\n\n function: thing => typeof thing === 'function',\n\n number : thing => typeof thing === 'number' ,\n\n bool : thing => typeof thing === 'boolean' ,\n\n string : thing => typeof thing === 'string' ,\n\n element: thing => {\n if (!thing || (typeof thing !== 'object')) { return false; }\n\n const _window = win.getWindow(thing) || win.window;\n\n return (/object|function/.test(typeof _window.Element)\n ? thing instanceof _window.Element //DOM2\n : thing.nodeType === 1 && typeof thing.nodeName === 'string');\n },\n};\n\nis.array = thing => (is.object(thing)\n && (typeof thing.length !== 'undefined')\n && is.function(thing.splice));\n\nmodule.exports = is;\n","module.exports = (thing) => !!(thing && thing.Window) && (thing instanceof thing.Window);\n","function pointerExtend (dest, source) {\n for (const prop in source) {\n const prefixedPropREs = module.exports.prefixedPropREs;\n let deprecated = false;\n\n // skip deprecated prefixed properties\n for (const vendor in prefixedPropREs) {\n if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) {\n deprecated = true;\n break;\n }\n }\n\n if (!deprecated && typeof source[prop] !== 'function') {\n dest[prop] = source[prop];\n }\n }\n return dest;\n}\n\npointerExtend.prefixedPropREs = {\n webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/,\n};\n\nmodule.exports = pointerExtend;\n","const hypot = require('./hypot');\nconst browser = require('./browser');\nconst dom = require('./domObjects');\nconst domUtils = require('./domUtils');\nconst domObjects = require('./domObjects');\nconst is = require('./is');\nconst pointerExtend = require('./pointerExtend');\n\nconst pointerUtils = {\n copyCoords: function (dest, src) {\n dest.page = dest.page || {};\n dest.page.x = src.page.x;\n dest.page.y = src.page.y;\n\n dest.client = dest.client || {};\n dest.client.x = src.client.x;\n dest.client.y = src.client.y;\n\n dest.timeStamp = src.timeStamp;\n },\n\n setCoordDeltas: function (targetObj, prev, cur) {\n targetObj.page.x = cur.page.x - prev.page.x;\n targetObj.page.y = cur.page.y - prev.page.y;\n targetObj.client.x = cur.client.x - prev.client.x;\n targetObj.client.y = cur.client.y - prev.client.y;\n targetObj.timeStamp = cur.timeStamp - prev.timeStamp;\n\n // set pointer velocity\n const dt = Math.max(targetObj.timeStamp / 1000, 0.001);\n\n targetObj.page.speed = hypot(targetObj.page.x, targetObj.page.y) / dt;\n targetObj.page.vx = targetObj.page.x / dt;\n targetObj.page.vy = targetObj.page.y / dt;\n\n targetObj.client.speed = hypot(targetObj.client.x, targetObj.page.y) / dt;\n targetObj.client.vx = targetObj.client.x / dt;\n targetObj.client.vy = targetObj.client.y / dt;\n },\n\n isNativePointer: function (pointer) {\n return (pointer instanceof dom.Event || pointer instanceof dom.Touch);\n },\n\n // Get specified X/Y coords for mouse or event.touches[0]\n getXY: function (type, pointer, xy) {\n xy = xy || {};\n type = type || 'page';\n\n xy.x = pointer[type + 'X'];\n xy.y = pointer[type + 'Y'];\n\n return xy;\n },\n\n getPageXY: function (pointer, page) {\n page = page || {};\n\n // Opera Mobile handles the viewport and scrolling oddly\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n pointerUtils.getXY('screen', pointer, page);\n\n page.x += window.scrollX;\n page.y += window.scrollY;\n }\n else {\n pointerUtils.getXY('page', pointer, page);\n }\n\n return page;\n },\n\n getClientXY: function (pointer, client) {\n client = client || {};\n\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n // Opera Mobile handles the viewport and scrolling oddly\n pointerUtils.getXY('screen', pointer, client);\n }\n else {\n pointerUtils.getXY('client', pointer, client);\n }\n\n return client;\n },\n\n getPointerId: function (pointer) {\n return is.number(pointer.pointerId)? pointer.pointerId : pointer.identifier;\n },\n\n setCoords: function (targetObj, pointers, timeStamp) {\n const pointer = (pointers.length > 1\n ? pointerUtils.pointerAverage(pointers)\n : pointers[0]);\n\n const tmpXY = {};\n\n pointerUtils.getPageXY(pointer, tmpXY);\n targetObj.page.x = tmpXY.x;\n targetObj.page.y = tmpXY.y;\n\n pointerUtils.getClientXY(pointer, tmpXY);\n targetObj.client.x = tmpXY.x;\n targetObj.client.y = tmpXY.y;\n\n targetObj.timeStamp = is.number(timeStamp) ? timeStamp :new Date().getTime();\n },\n\n pointerExtend: pointerExtend,\n\n getTouchPair: function (event) {\n const touches = [];\n\n // array of touches is supplied\n if (is.array(event)) {\n touches[0] = event[0];\n touches[1] = event[1];\n }\n // an event\n else {\n if (event.type === 'touchend') {\n if (event.touches.length === 1) {\n touches[0] = event.touches[0];\n touches[1] = event.changedTouches[0];\n }\n else if (event.touches.length === 0) {\n touches[0] = event.changedTouches[0];\n touches[1] = event.changedTouches[1];\n }\n }\n else {\n touches[0] = event.touches[0];\n touches[1] = event.touches[1];\n }\n }\n\n return touches;\n },\n\n pointerAverage: function (pointers) {\n const average = {\n pageX : 0,\n pageY : 0,\n clientX: 0,\n clientY: 0,\n screenX: 0,\n screenY: 0,\n };\n\n for (const pointer of pointers) {\n for (const prop in average) {\n average[prop] += pointer[prop];\n }\n }\n for (const prop in average) {\n average[prop] /= pointers.length;\n }\n\n return average;\n },\n\n touchBBox: function (event) {\n if (!event.length && !(event.touches && event.touches.length > 1)) {\n return;\n }\n\n const touches = pointerUtils.getTouchPair(event);\n const minX = Math.min(touches[0].pageX, touches[1].pageX);\n const minY = Math.min(touches[0].pageY, touches[1].pageY);\n const maxX = Math.max(touches[0].pageX, touches[1].pageX);\n const maxY = Math.max(touches[0].pageY, touches[1].pageY);\n\n return {\n x: minX,\n y: minY,\n left: minX,\n top: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n },\n\n touchDistance: function (event, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n\n\n const dx = touches[0][sourceX] - touches[1][sourceX];\n const dy = touches[0][sourceY] - touches[1][sourceY];\n\n return hypot(dx, dy);\n },\n\n touchAngle: function (event, prevAngle, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n const dx = touches[1][sourceX] - touches[0][sourceX];\n const dy = touches[1][sourceY] - touches[0][sourceY];\n const angle = 180 * Math.atan2(dy , dx) / Math.PI;\n\n return angle;\n },\n\n getPointerType: function (pointer) {\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : is.number(pointer.pointerType)\n ? [undefined, undefined,'touch', 'pen', 'mouse'][pointer.pointerType]\n // if the PointerEvent API isn't available, then the \"pointer\" must\n // be either a MouseEvent, TouchEvent, or Touch object\n : /touch/.test(pointer.type) || pointer instanceof domObjects.Touch\n ? 'touch'\n : 'mouse';\n },\n\n // [ event.target, event.currentTarget ]\n getEventTargets: function (event) {\n return [\n domUtils.getActualElement(event.path ? event.path[0] : event.target),\n domUtils.getActualElement(event.currentTarget),\n ];\n },\n};\n\nmodule.exports = pointerUtils;\n","const { window } = require('./window');\n\nconst vendors = ['ms', 'moz', 'webkit', 'o'];\nlet lastTime = 0;\nlet request;\nlet cancel;\n\nfor (let x = 0; x < vendors.length && !window.requestAnimationFrame; x++) {\n request = window[vendors[x] + 'RequestAnimationFrame'];\n cancel = window[vendors[x] +'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n}\n\nif (!request) {\n request = function (callback) {\n const currTime = new Date().getTime();\n const timeToCall = Math.max(0, 16 - (currTime - lastTime));\n const id = setTimeout(function () { callback(currTime + timeToCall); },\n timeToCall);\n\n lastTime = currTime + timeToCall;\n return id;\n };\n}\n\nif (!cancel) {\n cancel = function (id) {\n clearTimeout(id);\n };\n}\n\nmodule.exports = {\n request,\n cancel,\n};\n","const extend = require('./extend');\nconst is = require('./is');\nconst {\n closest,\n parentNode,\n getElementRect,\n} = require('./domUtils');\n\nconst rectUtils = {\n getStringOptionResult: function (value, interactable, element) {\n if (!is.string(value)) {\n return null;\n }\n\n if (value === 'parent') {\n value = parentNode(element);\n }\n else if (value === 'self') {\n value = interactable.getRect(element);\n }\n else {\n value = closest(element, value);\n }\n\n return value;\n },\n\n resolveRectLike: function (value, interactable, element, functionArgs) {\n value = rectUtils.getStringOptionResult(value, interactable, element) || value;\n\n if (is.function(value)) {\n value = value.apply(null, functionArgs);\n }\n\n if (is.element(value)) {\n value = getElementRect(value);\n }\n\n return value;\n },\n\n rectToXY: function (rect) {\n return rect && {\n x: 'x' in rect ? rect.x : rect.left,\n y: 'y' in rect ? rect.y : rect.top,\n };\n },\n\n xywhToTlbr: function (rect) {\n if (rect && !('left' in rect && 'top' in rect)) {\n rect = extend({}, rect);\n\n rect.left = rect.x || 0;\n rect.top = rect.y || 0;\n rect.right = rect.right || (rect.left + rect.width);\n rect.bottom = rect.bottom || (rect.top + rect.height);\n }\n\n return rect;\n },\n\n tlbrToXywh: function (rect) {\n if (rect && !('x' in rect && 'y' in rect)) {\n rect = extend({}, rect);\n\n rect.x = rect.left || 0;\n rect.top = rect.top || 0;\n rect.width = rect.width || (rect.right - rect.x);\n rect.height = rect.height || (rect.bottom - rect.y);\n }\n\n return rect;\n },\n};\n\nmodule.exports = rectUtils;\n","const win = module.exports;\nconst isWindow = require('./isWindow');\n\nfunction init (window) {\n // get wrapped window if using Shadow DOM polyfill\n\n win.realWindow = window;\n\n // create a TextNode\n const el = window.document.createTextNode('');\n\n // check if it's wrapped by a polyfill\n if (el.ownerDocument !== window.document\n && typeof window.wrap === 'function'\n && window.wrap(el) === el) {\n // use wrapped window\n window = window.wrap(window);\n }\n\n win.window = window;\n}\n\nif (typeof window === 'undefined') {\n win.window = undefined;\n win.realWindow = undefined;\n}\nelse {\n init(window);\n}\n\nwin.getWindow = function getWindow (node) {\n if (isWindow(node)) {\n return node;\n }\n\n const rootNode = (node.ownerDocument || node);\n\n return rootNode.defaultView || rootNode.parentWindow || win.window;\n};\n\nwin.init = init;\n"]} \ No newline at end of file diff --git a/dist/interact.min.js b/dist/interact.min.js index c0bb2476c..2d1f0fb62 100644 --- a/dist/interact.min.js +++ b/dist/interact.min.js @@ -1,6 +1,6 @@ -/* interact.js v1.3.0-alpha.3+sha.9595c40 | https://raw.github.com/taye/interact.js/master/LICENSE */ -!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var t;t="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,t.interact=e()}}(function(){return function e(t,n,r){function i(s,a){if(!n[s]){if(!t[s]){var l="function"==typeof require&&require;if(!a&&l)return l(s,!0);if(o)return o(s,!0);var c=new Error("Cannot find module '"+s+"'");throw c.code="MODULE_NOT_FOUND",c}var p=n[s]={exports:{}};t[s][0].call(p.exports,function(e){var n=t[s][1][e];return i(n||e)},p,p.exports,e,t,n,r)}return n[s].exports}for(var o="function"==typeof require&&require,s=0;s6&&void 0!==arguments[6]&&arguments[6];r(this,e);var f=t.target,v=(f&&f.options||s).deltaSource,g=o(f,p,l),h="start"===c,m="end"===c,y=h?t.startCoords:t.curCoords,x=t.prevEvent;p=p||t.element;var b=i({},y.page),w=i({},y.client);b.x-=g.x,b.y-=g.y,w.x-=g.x,w.y-=g.y,this.ctrlKey=n.ctrlKey,this.altKey=n.altKey,this.shiftKey=n.shiftKey,this.metaKey=n.metaKey,this.button=n.button,this.buttons=n.buttons,this.target=p,this.currentTarget=p,this.relatedTarget=u||null,this.preEnd=d,this.type=l+(c||""),this.interaction=t,this.interactable=f,this.t0=h?t.downTimes[t.downTimes.length-1]:x.t0;var E={interaction:t,event:n,action:l,phase:c,element:p,related:u,page:b,client:w,coords:y,starting:h,ending:m,deltaSource:v,iEvent:this};a.fire("set-xy",E),m?(this.pageX=x.pageX,this.pageY=x.pageY,this.clientX=x.clientX,this.clientY=x.clientY):(this.pageX=b.x,this.pageY=b.y,this.clientX=w.x,this.clientY=w.y),this.x0=t.startCoords.page.x-g.x,this.y0=t.startCoords.page.y-g.y,this.clientX0=t.startCoords.client.x-g.x,this.clientY0=t.startCoords.client.y-g.y,a.fire("set-delta",E),this.timeStamp=y.timeStamp,this.dt=t.pointerDelta.timeStamp,this.duration=this.timeStamp-this.t0,this.speed=t.pointerDelta[v].speed,this.velocityX=t.pointerDelta[v].vx,this.velocityY=t.pointerDelta[v].vy,this.swipe=m||"inertiastart"===c?this.getSwipe():null,a.fire("new",E)}return e.prototype.getSwipe=function(){var e=this.interaction;if(e.prevEvent.speed<600||this.timeStamp-e.prevEvent.timeStamp>150)return null;var t=180*Math.atan2(e.prevEvent.velocityY,e.prevEvent.velocityX)/Math.PI;t<0&&(t+=360);var n=112.5<=t&&t<247.5,r=202.5<=t&&t<337.5,i=!n&&(292.5<=t||t<67.5);return{up:r,down:!r&&22.5<=t&&t<157.5,left:n,right:i,angle:t,speed:e.prevEvent.speed,velocity:{x:e.prevEvent.velocityX,y:e.prevEvent.velocityY}}},e.prototype.preventDefault=function(){},e.prototype.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},e.prototype.stopPropagation=function(){this.propagationStopped=!0},e}();a.on("set-delta",function(e){var t=e.iEvent,n=e.interaction,r=e.starting,i=e.deltaSource,o=r?t:n.prevEvent;"client"===i?(t.dx=t.clientX-o.clientX,t.dy=t.clientY-o.clientY):(t.dx=t.pageX-o.pageX,t.dy=t.pageY-o.pageY)}),l.signals=a,t.exports=l},{"./defaultOptions":18,"./utils/Signals":35,"./utils/extend":41,"./utils/getOriginXY":42}],4:[function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=e("./utils/is"),o=e("./utils/events"),s=e("./utils/extend"),a=e("./actions/base"),l=e("./scope"),c=e("./Eventable"),p=e("./defaultOptions"),u=e("./utils/Signals").new(),d=e("./utils/domUtils"),f=d.getElementRect,v=d.nodeContains,g=d.trySelector,h=e("./utils/window"),m=h.getWindow,y=e("./utils/arr"),x=y.indexOf,b=y.contains,w=e("./utils/browser"),E=w.wheelEvent;l.interactables=[];var S=function(){function e(t,n){r(this,e),n=n||{},this.target=t,this.events=new c,this._context=n.context||l.document,this._win=m(g(t)?this._context:t),this._doc=this._win.document,u.fire("new",{target:t,options:n,interactable:this,win:this._win}),l.addDocument(this._doc,this._win),l.interactables.push(this),this.set(n)}return e.prototype.setOnEvents=function(e,t){var n="on"+e;return i.function(t.onstart)&&(this.events[n+"start"]=t.onstart),i.function(t.onmove)&&(this.events[n+"move"]=t.onmove),i.function(t.onend)&&(this.events[n+"end"]=t.onend),i.function(t.oninertiastart)&&(this.events[n+"inertiastart"]=t.oninertiastart),this},e.prototype.setPerAction=function(e,t){for(var n in t)n in p[e]&&(i.object(t[n])?(this.options[e][n]=s(this.options[e][n]||{},t[n]),i.object(p.perAction[n])&&"enabled"in p.perAction[n]&&(this.options[e][n].enabled=!1!==t[n].enabled)):i.bool(t[n])&&i.object(p.perAction[n])?this.options[e][n].enabled=t[n]:void 0!==t[n]&&(this.options[e][n]=t[n]))},e.prototype.getRect=function(e){return e=e||this.target,i.string(this.target)&&!i.element(e)&&(e=this._context.querySelector(this.target)),f(e)},e.prototype.rectChecker=function(e){return i.function(e)?(this.getRect=e,this):null===e?(delete this.options.getRect,this):this.getRect},e.prototype._backCompatOption=function(e,t){if(g(t)||i.object(t)){this.options[e]=t;for(var n=a.names,r=Array.isArray(n),o=0,n=r?n:n[Symbol.iterator]();;){var s;if(r){if(o>=n.length)break;s=n[o++]}else{if(o=n.next(),o.done)break;s=o.value}var l=s;this.options[l][e]=t}return this}return this.options[e]},e.prototype.origin=function(e){return this._backCompatOption("origin",e)},e.prototype.deltaSource=function(e){return"page"===e||"client"===e?(this.options.deltaSource=e,this):this.options.deltaSource},e.prototype.context=function(){return this._context},e.prototype.inContext=function(e){return this._context===e.ownerDocument||v(this._context,e)},e.prototype.fire=function(e){return this.events.fire(e),this},e.prototype._onOffMultiple=function(e,t,n,r){if(i.string(t)&&-1!==t.search(" ")&&(t=t.trim().split(/ +/)),i.array(t)){for(var o=0;o=l.length)break;f=l[d++]}else{if(d=l.next(),d.done)break;f=d.value}var v=f;this.options[v]=p.base[v],v in t&&this[v](t[v])}return u.fire("set",{options:t,interactable:this}),this},e.prototype.unset=function(){if(o.remove(this.target,"all"),i.string(this.target))for(var e in o.delegatedEvents){var t=o.delegatedEvents[e];t.selectors[0]===this.target&&t.contexts[0]===this._context&&(t.selectors.splice(0,1),t.contexts.splice(0,1),t.listeners.splice(0,1),t.selectors.length||(t[e]=null)),o.remove(this._context,e,o.delegateListener),o.remove(this._context,e,o.delegateUseCapture,!0)}else o.remove(this,"all");u.fire("unset",{interactable:this}),l.interactables.splice(x(l.interactables,this),1);for(var n=l.interactions||[],r=Array.isArray(n),s=0,n=r?n:n[Symbol.iterator]();;){var a;if(r){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var c=a;c.target===this&&c.interacting()&&c.stop()}return l.interact},e}();l.interactables.indexOfElement=function(e,t){t=t||l.document;for(var n=0;n=y.length)break;w=y[b++]}else{if(b=y.next(),b.done)break;w=b.value}var E=w,S=E[0],T=E[1];T._updateEventTargets(r,i),T[e](S,t,r,i)}}}function o(e){for(var t=0;te.pointerMoveTolerance);var a={pointer:t,pointerIndex:this.getPointerIndex(t),event:n,eventTarget:r,dx:o,dy:s,duplicate:i,interaction:this,interactingBeforeMove:this.interacting()};i||l.setCoordDeltas(this.pointerDelta,this.prevCoords,this.curCoords),d.fire("move",a),i||(this.interacting()&&this.doMove(a),this.pointerWasMoved&&l.copyCoords(this.prevCoords,this.curCoords))},e.prototype.doMove=function(e){e=l.extend({pointer:this.pointers[0],event:this.prevEvent,eventTarget:this._eventTarget,interaction:this},e||{}),d.fire("before-action-move",e),this._dontFireMove||d.fire("action-move",e),this._dontFireMove=!1},e.prototype.pointerUp=function(e,t,n,r){var i=this.getPointerIndex(e);d.fire(/cancel$/i.test(t.type)?"cancel":"up",{pointer:e,pointerIndex:i,event:t,eventTarget:n,curEventTarget:r,interaction:this}),this.simulation||this.end(t),this.pointerIsDown=!1,this.removePointer(e,t)},e.prototype.end=function(e){e=e||this.prevEvent,this.interacting()&&d.fire("action-end",{event:e,interaction:this}),this.stop()},e.prototype.currentAction=function(){return this._interacting?this.prepared.name:null},e.prototype.interacting=function(){return this._interacting},e.prototype.stop=function(){d.fire("stop",{interaction:this}),this._interacting&&(d.fire("stop-active",{interaction:this}),d.fire("stop-"+this.prepared.name,{interaction:this})),this.target=this.element=null,this._interacting=!1,this.prepared.name=this.prevEvent=null},e.prototype.getPointerIndex=function(e){return l.indexOf(this.pointerIds,l.getPointerId(e))},e.prototype.updatePointer=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:t&&/(down|start)$/i.test(t.type),r=l.getPointerId(e),i=this.getPointerIndex(e);return-1===i&&(i=this.pointerIds.length,this.pointerIds[i]=r),n&&d.fire("update-pointer-down",{pointer:e,event:t,down:n,pointerId:r,pointerIndex:i,interaction:this}),this.pointers[i]=e,i},e.prototype.removePointer=function(e,t){var n=l.getPointerId(e),r=this.mouse?0:l.indexOf(this.pointerIds,n);-1!==r&&(d.fire("remove-pointer",{pointer:e,event:t,pointerIndex:r,interaction:this}),this.pointers.splice(r,1),this.pointerIds.splice(r,1),this.downTargets.splice(r,1),this.downTimes.splice(r,1))},e.prototype._updateEventTargets=function(e,t){this._eventTarget=e,this._curEventTarget=t},e}(),m=0,y=v.length;m=i.length)break;a=i[s++]}else{if(s=i.next(),s.done)break;a=s.value}var l=a;if(l.options.drop.enabled){var c=l.options.drop.accept;if(!(p.is.element(c)&&c!==t||p.is.string(c)&&!p.matchesSelector(t,c)))for(var d=p.is.string(l.target)?l._context.querySelectorAll(l.target):[l.target],f=0;fo.left&&c.xo.top&&c.y=o.left&&v<=o.right&&g>=o.top&&g<=o.bottom}if(f&&p.is.number(a)){s=Math.max(0,Math.min(o.right,f.right)-Math.max(o.left,f.left))*Math.max(0,Math.min(o.bottom,f.bottom)-Math.max(o.top,f.top))/(f.width*f.height)>=a}return this.options.drop.checker&&(s=this.options.drop.checker(e,t,s,this,i,n,r)),s},v.signals.on("unset",function(e){e.interactable.dropzone(!1)}),v.settingsMethods.push("dropChecker"),g.signals.on("new",function(e){e.dropTarget=null,e.dropElement=null,e.prevDropTarget=null,e.prevDropElement=null,e.dropEvents=null,e.activeDrops={dropzones:[],elements:[],rects:[]}}),g.signals.on("stop",function(e){var t=e.interaction;t.dropTarget=t.dropElement=t.prevDropTarget=t.prevDropElement=null}),d.dynamicDrop=function(e){return p.is.bool(e)?(y=e,d):y},p.merge(v.eventTypes,["dragenter","dragleave","dropactivate","dropdeactivate","dropmove","drop"]),c.methodDict.drop="dropzone",h.drop=m.defaults,t.exports=m},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../interact":21,"../scope":34,"../utils":44,"./base":6}],9:[function(e,t,n){"use strict";var r=e("./base"),i=e("../utils"),o=e("../InteractEvent"),s=e("../Interactable"),a=e("../Interaction"),l=e("../defaultOptions"),c={defaults:{enabled:!1,origin:null,restrict:null},checker:function(e,t,n,r,i){return i.pointerIds.length>=2?{name:"gesture"}:null},getCursor:function(){return""}};o.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;"gesturestart"===t.type&&(t.ds=0,n.gesture.startDistance=n.gesture.prevDistance=t.distance,n.gesture.startAngle=n.gesture.prevAngle=t.angle,n.gesture.scale=1)}),o.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;"gesturemove"===t.type&&(t.ds=t.scale-n.gesture.scale,n.target.fire(t),n.gesture.prevAngle=t.angle,n.gesture.prevDistance=t.distance,t.scale===1/0||null===t.scale||void 0===t.scale||isNaN(t.scale)||(n.gesture.scale=t.scale))}),s.prototype.gesturable=function(e){return i.is.object(e)?(this.options.gesture.enabled=!1!==e.enabled,this.setPerAction("gesture",e),this.setOnEvents("gesture",e),this):i.is.bool(e)?(this.options.gesture.enabled=e,e||(this.ongesturestart=this.ongesturestart=this.ongestureend=null),this):this.options.gesture},o.signals.on("set-delta",function(e){var t=e.interaction,n=e.iEvent,r=e.action,s=e.event,a=e.starting,l=e.ending,c=e.deltaSource;if("gesture"===r){var p=t.pointers;n.touches=[p[0],p[1]],a?(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=1,n.ds=0,n.angle=i.touchAngle(p,void 0,c),n.da=0):l||s instanceof o?(n.distance=t.prevEvent.distance,n.box=t.prevEvent.box,n.scale=t.prevEvent.scale,n.ds=n.scale-1,n.angle=t.prevEvent.angle,n.da=n.angle-t.gesture.startAngle):(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=n.distance/t.gesture.startDistance,n.angle=i.touchAngle(p,t.gesture.prevAngle,c),n.ds=n.scale-t.gesture.prevScale,n.da=n.angle-t.gesture.prevAngle)}}),a.signals.on("new",function(e){e.gesture={start:{x:0,y:0},startDistance:0,prevDistance:0,distance:0,scale:1,startAngle:0,prevAngle:0}}),r.gesture=c,r.names.push("gesture"),i.merge(s.eventTypes,["gesturestart","gesturemove","gestureend"]),r.methodDict.gesture="gesturable",l.gesture=c.defaults,t.exports=c},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"./base":6}],10:[function(e,t,n){"use strict";function r(e,t,n,r,i,s,a){if(!t)return!1;if(!0===t){var l=o.is.number(s.width)?s.width:s.right-s.left,c=o.is.number(s.height)?s.height:s.bottom-s.top;if(l<0&&("left"===e?e="right":"right"===e&&(e="left")),c<0&&("top"===e?e="bottom":"bottom"===e&&(e="top")),"left"===e)return n.x<(l>=0?s.left:s.right)+a;if("top"===e)return n.y<(c>=0?s.top:s.bottom)+a;if("right"===e)return n.x>(l>=0?s.right:s.left)-a;if("bottom"===e)return n.y>(c>=0?s.bottom:s.top)-a}return!!o.is.element(r)&&(o.is.element(t)?t===r:o.matchesUpTo(r,t,i))}var i=e("./base"),o=e("../utils"),s=e("../utils/browser"),a=e("../InteractEvent"),l=e("../Interactable"),c=e("../Interaction"),p=e("../defaultOptions"),u=s.supportsTouch||s.supportsPointerEvent?20:10,d={defaults:{enabled:!1,mouseButtons:null,origin:null,snap:null,restrict:null,inertia:null,autoScroll:null,square:!1,preserveAspectRatio:!1,axis:"xy",margin:NaN,edges:null,invert:"none"},checker:function(e,t,n,i,s,a){if(!a)return null;var l=o.extend({},s.curCoords.page),c=n.options;if(c.resize.enabled){var p=c.resize,d={left:!1,right:!1,top:!1,bottom:!1};if(o.is.object(p.edges)){for(var f in d)d[f]=r(f,p.edges[f],l,s._eventTarget,i,a,p.margin||u);if(d.left=d.left&&!d.right,d.top=d.top&&!d.bottom,d.left||d.right||d.top||d.bottom)return{name:"resize",edges:d}}else{var v="y"!==c.resize.axis&&l.x>a.right-u,g="x"!==c.resize.axis&&l.y>a.bottom-u;if(v||g)return{name:"resize",axes:(v?"x":"")+(g?"y":"")}}}return null},cursors:s.isIe9OrOlder?{x:"e-resize",y:"s-resize",xy:"se-resize",top:"n-resize",left:"w-resize",bottom:"s-resize",right:"e-resize",topleft:"se-resize",bottomright:"se-resize",topright:"ne-resize",bottomleft:"ne-resize"}:{x:"ew-resize",y:"ns-resize",xy:"nwse-resize",top:"ns-resize",left:"ew-resize",bottom:"ns-resize",right:"ew-resize",topleft:"nwse-resize",bottomright:"nwse-resize",topright:"nesw-resize",bottomleft:"nesw-resize"},getCursor:function(e){if(e.axis)return d.cursors[e.name+e.axis];if(e.edges){for(var t="",n=["top","bottom","left","right"],r=0;r<4;r++)e.edges[n[r]]&&(t+=n[r]);return d.cursors[t]}}};a.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;if("resizestart"===t.type&&n.prepared.edges){var r=n.target.getRect(n.element),i=n.target.options.resize;if(i.square||i.preserveAspectRatio){var s=o.extend({},n.prepared.edges);s.top=s.top||s.left&&!s.bottom,s.left=s.left||s.top&&!s.right,s.bottom=s.bottom||s.right&&!s.top,s.right=s.right||s.bottom&&!s.left,n.prepared._linkedEdges=s}else n.prepared._linkedEdges=null;i.preserveAspectRatio&&(n.resizeStartAspectRatio=r.width/r.height),n.resizeRects={start:r,current:o.extend({},r),inverted:o.extend({},r),previous:o.extend({},r),delta:{left:0,right:0,width:0,top:0,bottom:0,height:0}},t.rect=n.resizeRects.inverted,t.deltaRect=n.resizeRects.delta}}),a.signals.on("new",function(e){var t=e.iEvent,n=e.phase,r=e.interaction;if("move"===n&&r.prepared.edges){var i=r.target.options.resize,s=i.invert,a="reposition"===s||"negate"===s,l=r.prepared.edges,c=r.resizeRects.start,p=r.resizeRects.current,u=r.resizeRects.inverted,d=r.resizeRects.delta,f=o.extend(r.resizeRects.previous,u),v=l,g=t.dx,h=t.dy;if(i.preserveAspectRatio||i.square){var m=i.preserveAspectRatio?r.resizeStartAspectRatio:1;l=r.prepared._linkedEdges,v.left&&v.bottom||v.right&&v.top?h=-g/m:v.left||v.right?h=g/m:(v.top||v.bottom)&&(g=h*m)}if(l.top&&(p.top+=h),l.bottom&&(p.bottom+=h),l.left&&(p.left+=g),l.right&&(p.right+=g),a){if(o.extend(u,p),"reposition"===s){var y=void 0;u.top>u.bottom&&(y=u.top,u.top=u.bottom,u.bottom=y),u.left>u.right&&(y=u.left,u.left=u.right,u.right=y)}}else u.top=Math.min(p.top,c.bottom),u.bottom=Math.max(p.bottom,c.top),u.left=Math.min(p.left,c.right),u.right=Math.max(p.right,c.left);u.width=u.right-u.left,u.height=u.bottom-u.top;for(var x in u)d[x]=u[x]-f[x];t.edges=r.prepared.edges,t.rect=u,t.deltaRect=d}}),l.prototype.resizable=function(e){return o.is.object(e)?(this.options.resize.enabled=!1!==e.enabled,this.setPerAction("resize",e),this.setOnEvents("resize",e),/^x$|^y$|^xy$/.test(e.axis)?this.options.resize.axis=e.axis:null===e.axis&&(this.options.resize.axis=p.resize.axis),o.is.bool(e.preserveAspectRatio)?this.options.resize.preserveAspectRatio=e.preserveAspectRatio:o.is.bool(e.square)&&(this.options.resize.square=e.square),this):o.is.bool(e)?(this.options.resize.enabled=e,e||(this.onresizestart=this.onresizestart=this.onresizeend=null),this):this.options.resize},c.signals.on("new",function(e){ -e.resizeAxes="xy"}),a.signals.on("set-delta",function(e){var t=e.interaction,n=e.iEvent;"resize"===e.action&&t.resizeAxes&&(t.target.options.resize.square?("y"===t.resizeAxes?n.dx=n.dy:n.dy=n.dx,n.axes="xy"):(n.axes=t.resizeAxes,"x"===t.resizeAxes?n.dy=0:"y"===t.resizeAxes&&(n.dx=0)))}),i.resize=d,i.names.push("resize"),o.merge(l.eventTypes,["resizestart","resizemove","resizeinertiastart","resizeinertiaresume","resizeend"]),i.methodDict.resize="resizable",p.resize=d.defaults,t.exports=d},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"../utils/browser":37,"./base":6}],11:[function(e,t,n){"use strict";var r=e("./utils/raf"),i=e("./utils/window").getWindow,o=e("./utils/is"),s=e("./utils/domUtils"),a=e("./Interaction"),l=e("./defaultOptions"),c={defaults:{enabled:!1,container:null,margin:60,speed:300},interaction:null,i:null,x:0,y:0,isScrolling:!1,prevTime:0,start:function(e){c.isScrolling=!0,r.cancel(c.i),c.interaction=e,c.prevTime=(new Date).getTime(),c.i=r.request(c.scroll)},stop:function(){c.isScrolling=!1,r.cancel(c.i)},scroll:function(){var e=c.interaction.target.options[c.interaction.prepared.name].autoScroll,t=e.container||i(c.interaction.element),n=(new Date).getTime(),s=(n-c.prevTime)/1e3,a=e.speed*s;a>=1&&(o.window(t)?t.scrollBy(c.x*a,c.y*a):t&&(t.scrollLeft+=c.x*a,t.scrollTop+=c.y*a),c.prevTime=n),c.isScrolling&&(r.cancel(c.i),c.i=r.request(c.scroll))},check:function(e,t){var n=e.options;return n[t].autoScroll&&n[t].autoScroll.enabled},onInteractionMove:function(e){var t=e.interaction,n=e.pointer;if(t.interacting()&&c.check(t.target,t.prepared.name)){if(t.simulation)return void(c.x=c.y=0);var r=void 0,a=void 0,l=void 0,p=void 0,u=t.target.options[t.prepared.name].autoScroll,d=u.container||i(t.element);if(o.window(d))p=n.clientXd.innerWidth-c.margin,l=n.clientY>d.innerHeight-c.margin;else{var f=s.getElementClientRect(d);p=n.clientXf.right-c.margin,l=n.clientY>f.bottom-c.margin}c.x=a?1:p?-1:0,c.y=l?1:r?-1:0,c.isScrolling||(c.margin=u.margin,c.speed=u.speed,c.start(t))}}};a.signals.on("stop-active",function(){c.stop()}),a.signals.on("action-move",c.onInteractionMove),l.perAction.autoScroll=c.defaults,t.exports=c},{"./Interaction":5,"./defaultOptions":18,"./utils/domUtils":39,"./utils/is":46,"./utils/raf":50,"./utils/window":52}],12:[function(e,t,n){"use strict";var r=e("../Interactable"),i=e("../actions/base"),o=e("../utils/is"),s=e("../utils/domUtils");r.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},r.prototype.ignoreFrom=function(e){return this._backCompatOption("ignoreFrom",e)},r.prototype.allowFrom=function(e){return this._backCompatOption("allowFrom",e)},r.prototype.testIgnore=function(e,t,n){return!(!e||!o.element(n))&&(o.string(e)?s.matchesUpTo(n,e,t):!!o.element(e)&&s.nodeContains(e,n))},r.prototype.testAllow=function(e,t,n){return!e||!!o.element(n)&&(o.string(e)?s.matchesUpTo(n,e,t):!!o.element(e)&&s.nodeContains(e,n))},r.prototype.testIgnoreAllow=function(e,t,n){return!this.testIgnore(e.ignoreFrom,t,n)&&this.testAllow(e.allowFrom,t,n)},r.prototype.actionChecker=function(e){return o.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},r.prototype.styleCursor=function(e){return o.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},r.prototype.defaultActionChecker=function(e,t,n,r){for(var o=this.getRect(r),s=null,a=i.names,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var u=p;if((!n.pointerIsDown||!n.mouse||0!=(t.buttons&this.options[u].mouseButtons))&&(s=i[u].checker(e,t,this,r,n,o)))return s}}},{"../Interactable":4,"../actions/base":6,"../utils/domUtils":39,"../utils/is":46}],13:[function(e,t,n){"use strict";function r(e,t,n,r){return g.is.object(e)&&t.testIgnoreAllow(t.options[e.name],n,r)&&t.options[e.name].enabled&&a(t,n,e)?e:null}function i(e,t,n,i,o,s){for(var a=0,l=i.length;a=m.maxInteractions)return!1;if(u.target===e){if((a+=d===n.name|0)>=i)return!1;if(u.element===t&&(l++,d!==n.name||l>=o))return!1}}}return m.maxInteractions>0}}var l=e("../interact"),c=e("../Interactable"),p=e("../Interaction"),u=e("../actions/base"),d=e("../defaultOptions"),f=e("../utils/browser"),v=e("../scope"),g=e("../utils"),h=e("../utils/Signals").new();e("./InteractableMethods");var m={signals:h,withinInteractionLimit:a,maxInteractions:1/0,defaults:{perAction:{manualStart:!1,max:1/0,maxPerElement:1,allowFrom:null,ignoreFrom:null}},setActionDefaults:function(e){g.extend(e.defaults,m.defaults.perAction)}};p.signals.on("down",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;if(!t.interacting()){s(t,o(t,n,r,i))}}),p.signals.on("move",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;if(t.mouse&&!t.pointerIsDown&&!t.interacting()){s(t,o(t,n,r,i))}}),p.signals.on("move",function(e){var t=e.interaction,n=e.event;if(t.pointerIsDown&&!t.interacting()&&t.pointerWasMoved&&t.prepared.name){h.fire("before-start",e);var r=t.target;t.prepared.name&&r&&(r.options[t.prepared.name].manualStart||!a(r,t.element,t.prepared)?t.stop(n):t.start(t.prepared,r,t.element))}}),p.signals.on("stop",function(e){var t=e.interaction,n=t.target;n&&n.options.styleCursor&&(n._doc.documentElement.style.cursor="")}),c.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},c.prototype.actionChecker=function(e){return g.is.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},c.prototype.styleCursor=function(e){return g.is.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},c.prototype.defaultActionChecker=function(e,t,n,r){for(var i=this.getRect(r),o=t.buttons||{0:1,1:4,3:8,4:16}[t.button],s=null,a=u.names,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var d=p;if((!n.pointerIsDown||!n.mouse||0!=(o&this.options[d].mouseButtons))&&(s=u[d].checker(e,t,this,r,n,i)))return s}},l.maxInteractions=function(e){return g.is.number(e)?(m.maxInteractions=e,this):m.maxInteractions},c.settingsMethods.push("styleCursor"),c.settingsMethods.push("actionChecker"),c.settingsMethods.push("ignoreFrom"),c.settingsMethods.push("allowFrom"),d.base.actionChecker=null,d.base.styleCursor=!0,g.extend(d.perAction,m.defaults.perAction),t.exports=m},{"../Interactable":4,"../Interaction":5,"../actions/base":6,"../defaultOptions":18,"../interact":21,"../scope":34,"../utils":44,"../utils/Signals":35,"../utils/browser":37,"./InteractableMethods":12}],14:[function(e,t,n){"use strict";var r=e("./base"),i=e("../Interaction");i.signals.on("new",function(e){e.delayTimer=null}),r.signals.on("prepared",function(e){var t=e.interaction,n=t.prepared.name;if(n){var r=t.target.options[n].delay;r>0&&(t.delayTimer=setTimeout(function(){t.start(t.prepared,t.target,t.element)},r))}}),i.signals.on("move",function(e){var t=e.interaction,n=e.duplicate;t.pointerWasMoved&&!n&&clearTimeout(t.delayTimer)}),r.signals.on("before-start",function(e){var t=e.interaction,n=t.prepared.name;if(n){t.target.options[n].delay>0&&(t.prepared.name=null)}})},{"../Interaction":5,"./base":13}],15:[function(e,t,n){"use strict";function r(e,t){if(!t)return!1;var n=t.options.drag.startAxis;return"xy"===e||"xy"===n||n===e}var i=e("./base"),o=e("../scope"),s=e("../utils/browser"),a=e("../utils/is"),l=e("../utils/domUtils"),c=l.matchesSelector,p=l.parentNode;i.setActionDefaults(e("../actions/drag")),i.signals.on("before-start",function(e){var t=e.interaction,n=e.eventTarget,l=e.dx,u=e.dy;if("drag"===t.prepared.name){var d=Math.abs(l),f=Math.abs(u),v=t.target.options.drag,g=v.startAxis,h=d>f?"x":dl.minSpeed&&g>l.endSpeed,b={interaction:t,pageCoords:v,statuses:f,preEnd:!0,requireEndOnly:!0};y&&!x&&(c.resetStatuses(f),m=c.setAll(b),m.shouldMove&&m.locked&&(h=!0)),(x||h)&&(p.copyCoords(i.upCoords,t.curCoords),t.pointers[0]=i.startEvent=new a(t,n,t.prepared.name,"inertiastart",t.element),i.t0=d,i.active=!0,i.allowResume=l.allowResume,t.simulation=i,o.fire(i.startEvent),x?(i.vx0=t.pointerDelta.client.vx,i.vy0=t.pointerDelta.client.vy,i.v0=g,r(t,i),p.extend(v,t.curCoords.page),v.x+=i.xe,v.y+=i.ye,c.resetStatuses(f),m=c.setAll(b),i.modifiedXe+=m.dx,i.modifiedYe+=m.dy,i.i=u.request(t.boundInertiaFrame)):(i.smoothEnd=!0,i.xe=m.dx,i.ye=m.dy,i.sx=i.sy=0,i.i=u.request(t.boundSmoothEndFrame)))}}),l.signals.on("stop-active",function(e){var t=e.interaction,n=t.inertiaStatus;n.active&&(u.cancel(n.i),n.active=!1,t.simulation=null)})},{"./InteractEvent":3,"./Interaction":5,"./modifiers":24,"./utils":44,"./utils/raf":50}],21:[function(e,t,n){"use strict";function r(e,t){var n=a.interactables.get(e,t);return n||(n=new l(e,t),n.events.global=p),n}var i=e("./utils/browser"),o=e("./utils/events"),s=e("./utils"),a=e("./scope"),l=e("./Interactable"),c=e("./Interaction"),p={};r.isSet=function(e,t){return-1!==a.interactables.indexOfElement(e,t&&t.context)},r.on=function(e,t,n){if(s.is.string(e)&&-1!==e.search(" ")&&(e=e.trim().split(/ +/)),s.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.on(f,t,n)}return r}if(s.is.object(e)){for(var v in e)r.on(v,e[v],t);return r}return s.contains(l.eventTypes,e)?p[e]?p[e].push(t):p[e]=[t]:o.add(a.document,e,t,{options:n}),r},r.off=function(e,t,n){if(s.is.string(e)&&-1!==e.search(" ")&&(e=e.trim().split(/ +/)),s.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.off(f,t,n)}return r}if(s.is.object(e)){for(var v in e)r.off(v,e[v],t);return r}if(s.contains(l.eventTypes,e)){var g=void 0;e in p&&-1!==(g=s.indexOf(p[e],t))&&p[e].splice(g,1)}else o.remove(a.document,e,t,n);return r},r.debug=function(){return a},r.getPointerAverage=s.pointerAverage,r.getTouchBBox=s.touchBBox,r.getTouchDistance=s.touchDistance,r.getTouchAngle=s.touchAngle,r.getElementRect=s.getElementRect,r.getElementClientRect=s.getElementClientRect,r.matchesSelector=s.matchesSelector,r.closest=s.closest,r.supportsTouch=function(){return i.supportsTouch},r.supportsPointerEvent=function(){return i.supportsPointerEvent},r.stop=function(e){for(var t=a.interactions.length-1;t>=0;t--)a.interactions[t].stop(e);return r},r.pointerMoveTolerance=function(e){return s.is.number(e)?(c.pointerMoveTolerance=e,this):c.pointerMoveTolerance},r.addDocument=a.addDocument,r.removeDocument=a.removeDocument,a.interact=r,t.exports=r},{"./Interactable":4,"./Interaction":5,"./scope":34,"./utils":44,"./utils/browser":37,"./utils/events":40}],22:[function(e,t,n){"use strict";function r(e){var t=e.interaction,n=e.event;t.target&&t.target.checkAndPreventDefault(n)}var i=e("./Interactable"),o=e("./Interaction"),s=e("./scope"),a=e("./utils/is"),l=e("./utils/events"),c=e("./utils/domUtils"),p=c.nodeContains,u=c.matchesSelector;i.prototype.preventDefault=function(e){return/^(always|never|auto)$/.test(e)?(this.options.preventDefault=e,this):a.bool(e)?(this.options.preventDefault=e?"always":"never",this):this.options.preventDefault},i.prototype.checkAndPreventDefault=function(e){var t=this.options.preventDefault;if("never"!==t)return"always"===t?void e.preventDefault():void(l.supportsOptions||/^(mouse|pointer|touch)*(down|start)/i.test(e.type)||a.element(e.target)&&u(e.target,"input,select,textarea,[contenteditable=true],[contenteditable=true] *")||e.preventDefault())};for(var d=["down","move","up","cancel"],f=0;f=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i;if(o.element&&(o.element===e.target||p(o.element,e.target)))return void o.target.checkAndPreventDefault(e)}}},{"./Interactable":4,"./Interaction":5,"./scope":34,"./utils/domUtils":39,"./utils/events":40,"./utils/is":46}],23:[function(e,t,n){"use strict";function r(e){var t=e.target,n=a.search(e,e.type,t);n&&n.prevTap&&e.clientX===n.prevTap.clientX&&e.clientY===n.prevTap.clientY&&t===n.prevTap.target&&(n.downTargets[0]=t,n.downTimes[0]=(new Date).getTime(),l.fire({interaction:n,event:e,eventTarget:t,pointer:e,type:"tap"}))}var i=e("./scope"),o=e("./utils/events"),s=e("./utils/browser"),a=e("./utils/interactionFinder"),l=e("./pointerEvents/base"),c=e("./utils/window"),p=c.window,u=Object.prototype.toString;if(p.Array.isArray||(p.Array.isArray=function(e){return"[object Array]"===u.call(e)}),String.prototype.trim||(String.prototype.trim=function(){return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")}),s.isIE8){var d=function(e){for(var t=i.interactions,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var o;if(n){if(r>=t.length)break;o=t[r++]}else{if(r=t.next(),r.done)break;o=r.value}var s=o;s.interacting()&&s.target.checkAndPreventDefault(e)}},f=function(e,t){var n=e.doc,i=(e.win,0===t.indexOf("listen")?o.add:o.remove);i(n,"selectstart",d),l&&i(n,"dblclick",r)};i.signals.on("add-document",f),i.signals.on("remove-document",f)}t.exports=null},{"./pointerEvents/base":31,"./scope":34,"./utils/browser":37,"./utils/events":40,"./utils/interactionFinder":45,"./utils/window":52}],24:[function(e,t,n){"use strict";function r(e,t,n){return e&&e.enabled&&(t||!e.endOnly)&&(!n||e.endOnly)}var i=e("../InteractEvent"),o=e("../Interaction"),s=e("../utils/extend"),a={names:[],setOffsets:function(e){var t=e.interaction,n=e.pageCoords,r=t.target,i=t.element,o=t.startOffset,s=r.getRect(i);s?(o.left=n.x-s.left,o.top=n.y-s.top,o.right=s.right-n.x,o.bottom=s.bottom-n.y,"width"in s||(s.width=s.right-s.left),"height"in s||(s.height=s.bottom-s.top)):o.left=o.top=o.right=o.bottom=0,e.rect=s,e.interactable=r,e.element=i;for(var l=0;l=p.length)break;f=p[d++]}else{if(d=p.next(),d.done)break;f=d.value}var v=f,g=a[v],h=t.target.options[t.prepared.name][v];r(h,i,o)&&(e.status=e.status=n[v],e.options=h,e.offset=e.interaction.modifierOffsets[v],g.set(e),e.status.locked&&(l.x+=e.status.dx,l.y+=e.status.dy,c.dx+=e.status.dx,c.dy+=e.status.dy,c.locked=!0))}return c.shouldMove=!e.status||!c.locked||e.status.changed,c},resetStatuses:function(e){for(var t=a.names,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var i;if(n){if(r>=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i,s=e[o]||{};s.dx=s.dy=0,s.modifiedX=s.modifiedY=NaN,s.locked=!1,s.changed=!0,e[o]=s}return e},start:function(e,t){var n=e.interaction,r={interaction:n,pageCoords:("action-resume"===t?n.curCoords:n.startCoords).page,startOffset:n.startOffset,statuses:n.modifierStatuses,preEnd:!1,requireEndOnly:!1};a.setOffsets(r),a.resetStatuses(r.statuses),r.pageCoords=s({},n.startCoords.page),n.modifierResult=a.setAll(r)}};o.signals.on("new",function(e){e.startOffset={left:0,right:0,top:0,bottom:0},e.modifierOffsets={},e.modifierStatuses=a.resetStatuses({}),e.modifierResult=null}),o.signals.on("action-start",a.start),o.signals.on("action-resume",a.start),o.signals.on("before-action-move",function(e){var t=e.interaction,n=e.preEnd,r=e.interactingBeforeMove,i=a.setAll({interaction:t,preEnd:n,pageCoords:t.curCoords.page,statuses:t.modifierStatuses,requireEndOnly:!1});!i.shouldMove&&r&&(t._dontFireMove=!0),t.modifierResult=i}),o.signals.on("action-end",function(e){for(var t=e.interaction,n=e.event,i=0;i=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}var m=h,y=m.x,x=m.y;l.push({x:s.left-i.width*y+u.x,y:s.top-i.height*x+u.y})}else l.push(u);return l},set:function(e){var t=e.interaction,n=e.pageCoords,r=e.status,i=e.options,s=e.offset,a=[],l=void 0,c=void 0,p=void 0;if(r.useStatusXY)c={x:r.x,y:r.y};else{var u=o.getOriginXY(t.target,t.element,t.prepared.name);c=o.extend({},n),c.x-=u.x,c.y-=u.y}r.realX=c.x,r.realY=c.y;for(var d=i.targets?i.targets.length:0,f=s,v=Array.isArray(f),g=0,f=v?f:f[Symbol.iterator]();;){var h;if(v){if(g>=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}for(var m=h,y=m.x,x=m.y,b=c.x-y,w=c.y-x,E=i.targets,S=Array.isArray(E),T=0,E=S?E:E[Symbol.iterator]();;){var C;if(S){if(T>=E.length)break;C=E[T++]}else{if(T=E.next(),T.done)break;C=T.value}var A=C;l=o.is.function(A)?A(b,w,t):A,l&&a.push({x:o.is.number(l.x)?l.x+y:b,y:o.is.number(l.y)?l.y+x:w,range:o.is.number(l.range)?l.range:i.range})}}var D={target:null,inRange:!1,distance:0,range:0,dx:0,dy:0};for(p=0,d=a.length;p=p.length)break;f=p[d++]}else{if(d=p.next(),d.done)break;f=d.value}var v=f,g=void 0;g=a.is.function(v)?v(l,c,t):v,g&&("width"in g&&"height"in g&&(g.x=g.width,g.y=g.height),e.options.targets.push(g))}i.set(e)},modifyCoords:function(e){var t=e.options;e.options=a.extend({},t), -e.options.enabled=t.enabled,e.options.relativePoints=[null],i.modifyCoords(e)}};r.snapSize=l,r.names.push("snapSize"),o.perAction.snapSize=l.defaults,s.defaults.snapSize=l.defaults,t.exports=l},{"../actions/resize":10,"../defaultOptions":18,"../utils/":44,"./index":24,"./snap":28}],30:[function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=e("../utils/pointerUtils");t.exports=function(){function e(t,n,o,s,a){if(r(this,e),i.pointerExtend(this,o),o!==n&&i.pointerExtend(this,n),this.interaction=a,this.timeStamp=(new Date).getTime(),this.originalEvent=o,this.type=t,this.pointerId=i.getPointerId(n),this.pointerType=i.getPointerType(n,a),this.target=s,this.currentTarget=null,"tap"===t){var l=a.getPointerIndex(n);this.dt=this.timeStamp-a.downTimes[l];var c=this.timeStamp-a.tapTime;this.double=!!(a.prevTap&&"doubletap"!==a.prevTap.type&&a.prevTap.target===this.target&&c<500)}else"doubletap"===t&&(this.dt=n.timeStamp-a.tapTime)}return e.prototype.subtractOrigin=function(e){var t=e.x,n=e.y;return this.pageX-=t,this.pageY-=n,this.clientX-=t,this.clientY-=n,this},e.prototype.addOrigin=function(e){var t=e.x,n=e.y;return this.pageX+=t,this.pageY+=n,this.clientX+=t,this.clientY+=n,this},e.prototype.preventDefault=function(){this.originalEvent.preventDefault()},e.prototype.stopPropagation=function(){this.propagationStopped=!0},e.prototype.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},e}()},{"../utils/pointerUtils":49}],31:[function(e,t,n){"use strict";function r(e){for(var t=e.interaction,n=e.pointer,s=e.event,l=e.eventTarget,c=e.type,u=void 0===c?e.pointerEvent.type:c,d=e.targets,f=void 0===d?i(e):d,v=e.pointerEvent,g=void 0===v?new o(u,n,s,l,t):v,h={interaction:t,pointer:n,event:s,eventTarget:l,targets:f,type:u,pointerEvent:g},m=0;m=u.length)break;g=u[v++]}else{if(v=u.next(),v.done)break;g=v.value}var h=g;c.element=h,p.fire("collect-targets",c)}return"hold"===o&&(c.targets=d(c.targets,function(e){return e.eventable.options.holdDuration===t.holdTimers[s].duration})),c.targets}var o=e("./PointerEvent"),s=e("../Interaction"),a=e("../utils"),l=e("../utils/browser"),c=e("../defaultOptions"),p=e("../utils/Signals").new(),u=e("../utils/arr"),d=u.filter,f=["down","up","cancel"],v=["down","up","cancel"],g={PointerEvent:o,fire:r,collectEventTargets:i,signals:p,defaults:{holdDuration:600,ignoreFrom:null,allowFrom:null,origin:{x:0,y:0}},types:["down","move","up","cancel","tap","doubletap","hold"]};s.signals.on("update-pointer-down",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers[n]={duration:1/0,timeout:null}}),s.signals.on("remove-pointer",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers.splice(n,1)}),s.signals.on("move",function(e){var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,s=e.duplicateMove,a=t.getPointerIndex(n);s||t.pointerIsDown&&!t.pointerWasMoved||(t.pointerIsDown&&clearTimeout(t.holdTimers[a].timeout),r({interaction:t,pointer:n,event:i,eventTarget:o,type:"move"}))}),s.signals.on("down",function(e){for(var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,s=e.pointerIndex,c=l.isIE8?a.extend({},i):i,u=t.holdTimers[s],d=a.getPath(o),f={interaction:t,pointer:n,event:i,eventTarget:o,type:"hold",targets:[],path:d,element:null},v=d,g=Array.isArray(v),h=0,v=g?v:v[Symbol.iterator]();;){var m;if(g){if(h>=v.length)break;m=v[h++]}else{if(h=v.next(),h.done)break;m=h.value}var y=m;f.element=y,p.fire("collect-targets",f)}if(f.targets.length){for(var x=1/0,b=0;b=0&&(p.selectors[u]!==e||p.contexts[u]!==t);u--);-1===u&&(u=p.selectors.length,p.selectors.push(e),p.contexts.push(t),p.listeners.push([])),p.listeners[u].push([i,!!s.capture,s.passive])}function s(e,t,n,r,o){var s=f(o),c=O[n],p=!1,u=void 0;if(c)for(u=c.selectors.length-1;u>=0;u--)if(c.selectors[u]===e&&c.contexts[u]===t){for(var d=c.listeners[u],v=d.length-1;v>=0;v--){var g=d[v],h=g[0],m=g[1],y=g[2];if(h===r&&m===!!s.capture&&y===s.passive){d.splice(v,1),d.length||(c.selectors.splice(u,1),c.contexts.splice(u,1),c.listeners.splice(u,1),i(t,n,a),i(t,n,l,!0),c.selectors.length||(O[n]=null)),p=!0;break}}if(p)break}}function a(e,t){var n=f(t),r={},i=O[e.type],o=g.getActualElement(e.path?e.path[0]:e.target),s=o;for(h(r,e),r.originalEvent=e,r.preventDefault=p;v.element(s);){for(var a=0;a=l.length)break;u=l[p++]}else{if(p=l.next(),p.done)break;u=p.value}var d=u,f=s[d](a);if(f)return f}},simulationResume:function(e){var t=e.mouseEvent,n=e.eventType,o=e.eventTarget;if(!/down|start/i.test(n))return null;for(var s=r.interactions,a=Array.isArray(s),l=0,s=a?s:s[Symbol.iterator]();;){var c;if(a){if(l>=s.length)break;c=s[l++]}else{if(l=s.next(),l.done)break;c=l.value}var p=c,u=o;if(p.simulation&&p.simulation.allowResume&&p.mouse===t)for(;u;){if(u===p.element)return p;u=i.parentNode(u)}}return null},mouse:function(e){var t=e.pointerId,n=e.mouseEvent,s=e.eventType;if(!n&&(o.supportsTouch||o.supportsPointerEvent))return null;for(var a=void 0,l=r.interactions,c=Array.isArray(l),p=0,l=c?l:l[Symbol.iterator]();;){var u;if(c){if(p>=l.length)break;u=l[p++]}else{if(p=l.next(),p.done)break;u=p.value}var d=u;if(d.mouse){if(d.simulation&&!i.contains(d.pointerIds,t))continue;if(d.interacting())return d;a||(a=d)}}if(a)return a;for(var f=r.interactions,v=Array.isArray(f),g=0,f=v?f:f[Symbol.iterator]();;){var h;if(v){if(g>=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}var m=h;if(m.mouse&&(!/down/.test(s)||!m.simulation))return m}return null},hasPointer:function(e){for(var t=e.pointerId,n=r.interactions,o=Array.isArray(n),s=0,n=o?n:n[Symbol.iterator]();;){var a;if(o){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var l=a;if(i.contains(l.pointerIds,t))return l}},idle:function(e){for(var t=e.mouseEvent,n=r.interactions,i=Array.isArray(n),o=0,n=i?n:n[Symbol.iterator]();;){var s;if(i){if(o>=n.length)break;s=n[o++]}else{if(o=n.next(),o.done)break;s=o.value}var a=s;if(1===a.pointerIds.length){var l=a.target;if(l&&!l.options.gesture.enabled)continue}else if(a.pointerIds.length>=2)continue;if(!a.interacting()&&t===a.mouse)return a}return null}};t.exports=s},{"../scope":34,"./browser":37,"./index":44}],46:[function(e,t,n){"use strict";var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},i=e("./window"),o=e("./isWindow"),s={array:function(){},window:function(e){return e===i.window||o(e)},docFrag:function(e){return s.object(e)&&11===e.nodeType},object:function(e){return!!e&&"object"===(void 0===e?"undefined":r(e))},function:function(e){return"function"==typeof e},number:function(e){return"number"==typeof e},bool:function(e){return"boolean"==typeof e},string:function(e){return"string"==typeof e},element:function(e){if(!e||"object"!==(void 0===e?"undefined":r(e)))return!1;var t=i.getWindow(e)||i.window;return/object|function/.test(r(t.Element))?e instanceof t.Element:1===e.nodeType&&"string"==typeof e.nodeName}};s.array=function(e){return s.object(e)&&void 0!==e.length&&s.function(e.splice)},t.exports=s},{"./isWindow":47,"./window":52}],47:[function(e,t,n){"use strict";t.exports=function(e){return!(!e||!e.Window)&&e instanceof e.Window}},{}],48:[function(e,t,n){"use strict";function r(e,n){for(var r in n){var i=t.exports.prefixedPropREs,o=!1;for(var s in i)if(0===r.indexOf(s)&&i[s].test(r)){o=!0;break}o||"function"==typeof n[r]||(e[r]=n[r])}return e}r.prefixedPropREs={webkit:/(Movement[XY]|Radius[XY]|RotationAngle|Force)$/},t.exports=r},{}],49:[function(e,t,n){"use strict";var r=e("./hypot"),i=e("./browser"),o=e("./domObjects"),s=e("./domUtils"),a=e("./is"),l=e("./pointerExtend"),c={copyCoords:function(e,t){e.page=e.page||{},e.page.x=t.page.x,e.page.y=t.page.y,e.client=e.client||{},e.client.x=t.client.x,e.client.y=t.client.y,e.timeStamp=t.timeStamp},setCoordDeltas:function(e,t,n){e.page.x=n.page.x-t.page.x,e.page.y=n.page.y-t.page.y,e.client.x=n.client.x-t.client.x,e.client.y=n.client.y-t.client.y,e.timeStamp=n.timeStamp-t.timeStamp;var i=Math.max(e.timeStamp/1e3,.001);e.page.speed=r(e.page.x,e.page.y)/i,e.page.vx=e.page.x/i,e.page.vy=e.page.y/i,e.client.speed=r(e.client.x,e.page.y)/i,e.client.vx=e.client.x/i,e.client.vy=e.client.y/i},isNativePointer:function(e){return e instanceof o.Event||e instanceof o.Touch},getXY:function(e,t,n){return n=n||{},e=e||"page",n.x=t[e+"X"],n.y=t[e+"Y"],n},getPageXY:function(e,t){return t=t||{},i.isOperaMobile&&c.isNativePointer(e)?(c.getXY("screen",e,t),t.x+=window.scrollX,t.y+=window.scrollY):c.getXY("page",e,t),t},getClientXY:function(e,t){return t=t||{},i.isOperaMobile&&c.isNativePointer(e)?c.getXY("screen",e,t):c.getXY("client",e,t),t},getPointerId:function(e){return a.number(e.pointerId)?e.pointerId:e.identifier},setCoords:function(e,t,n){var r=t.length>1?c.pointerAverage(t):t[0],i={};c.getPageXY(r,i),e.page.x=i.x,e.page.y=i.y,c.getClientXY(r,i),e.client.x=i.x,e.client.y=i.y,e.timeStamp=a.number(n)?n:(new Date).getTime()},pointerExtend:l,getTouchPair:function(e){var t=[];return a.array(e)?(t[0]=e[0],t[1]=e[1]):"touchend"===e.type?1===e.touches.length?(t[0]=e.touches[0],t[1]=e.changedTouches[0]):0===e.touches.length&&(t[0]=e.changedTouches[0],t[1]=e.changedTouches[1]):(t[0]=e.touches[0],t[1]=e.touches[1]),t},pointerAverage:function(e){for(var t={pageX:0,pageY:0,clientX:0,clientY:0,screenX:0,screenY:0},n=e,r=Array.isArray(n),i=0,n=r?n:n[Symbol.iterator]();;){var o;if(r){if(i>=n.length)break;o=n[i++]}else{if(i=n.next(),i.done)break;o=i.value}var s=o;for(var a in t)t[a]+=s[a]}for(var l in t)t[l]/=e.length;return t},touchBBox:function(e){if(e.length||e.touches&&e.touches.length>1){var t=c.getTouchPair(e),n=Math.min(t[0].pageX,t[1].pageX),r=Math.min(t[0].pageY,t[1].pageY);return{x:n,y:r,left:n,top:r,width:Math.max(t[0].pageX,t[1].pageX)-n,height:Math.max(t[0].pageY,t[1].pageY)-r}}},touchDistance:function(e,t){var n=t+"X",i=t+"Y",o=c.getTouchPair(e),s=o[0][n]-o[1][n],a=o[0][i]-o[1][i];return r(s,a)},touchAngle:function(e,t,n){var r=n+"X",i=n+"Y",o=c.getTouchPair(e),s=o[1][r]-o[0][r],a=o[1][i]-o[0][i];return 180*Math.atan2(a,s)/Math.PI},getPointerType:function(e,t){return t.mouse?"mouse":i.supportsPointerEvent?a.string(e.pointerType)?e.pointerType:[void 0,void 0,"touch","pen","mouse"][e.pointerType]:"touch"},getEventTargets:function(e){return[s.getActualElement(e.path?e.path[0]:e.target),s.getActualElement(e.currentTarget)]}};t.exports=c},{"./browser":37,"./domObjects":38,"./domUtils":39,"./hypot":43,"./is":46,"./pointerExtend":48}],50:[function(e,t,n){"use strict";for(var r=e("./window"),i=r.window,o=["ms","moz","webkit","o"],s=0,a=void 0,l=void 0,c=0;c6&&void 0!==arguments[6]&&arguments[6];r(this,e);var f=t.target,v=(f&&f.options||s).deltaSource,g=o(f,p,l),h="start"===c,m="end"===c,y=h?t.startCoords:t.curCoords,x=t.prevEvent;p=p||t.element;var b=i({},y.page),w=i({},y.client);b.x-=g.x,b.y-=g.y,w.x-=g.x,w.y-=g.y,this.ctrlKey=n.ctrlKey,this.altKey=n.altKey,this.shiftKey=n.shiftKey,this.metaKey=n.metaKey,this.button=n.button,this.buttons=n.buttons,this.target=p,this.currentTarget=p,this.relatedTarget=u||null,this.preEnd=d,this.type=l+(c||""),this.interaction=t,this.interactable=f,this.t0=h?t.downTimes[t.downTimes.length-1]:x.t0;var E={interaction:t,event:n,action:l,phase:c,element:p,related:u,page:b,client:w,coords:y,starting:h,ending:m,deltaSource:v,iEvent:this};a.fire("set-xy",E),m?(this.pageX=x.pageX,this.pageY=x.pageY,this.clientX=x.clientX,this.clientY=x.clientY):(this.pageX=b.x,this.pageY=b.y,this.clientX=w.x,this.clientY=w.y),this.x0=t.startCoords.page.x-g.x,this.y0=t.startCoords.page.y-g.y,this.clientX0=t.startCoords.client.x-g.x,this.clientY0=t.startCoords.client.y-g.y,a.fire("set-delta",E),this.timeStamp=y.timeStamp,this.dt=t.pointerDelta.timeStamp,this.duration=this.timeStamp-this.t0,this.speed=t.pointerDelta[v].speed,this.velocityX=t.pointerDelta[v].vx,this.velocityY=t.pointerDelta[v].vy,this.swipe=m||"inertiastart"===c?this.getSwipe():null,a.fire("new",E)}return e.prototype.getSwipe=function(){var e=this.interaction;if(e.prevEvent.speed<600||this.timeStamp-e.prevEvent.timeStamp>150)return null;var t=180*Math.atan2(e.prevEvent.velocityY,e.prevEvent.velocityX)/Math.PI;t<0&&(t+=360);var n=112.5<=t&&t<247.5,r=202.5<=t&&t<337.5,i=!n&&(292.5<=t||t<67.5);return{up:r,down:!r&&22.5<=t&&t<157.5,left:n,right:i,angle:t,speed:e.prevEvent.speed,velocity:{x:e.prevEvent.velocityX,y:e.prevEvent.velocityY}}},e.prototype.preventDefault=function(){},e.prototype.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},e.prototype.stopPropagation=function(){this.propagationStopped=!0},e}();a.on("set-delta",function(e){var t=e.iEvent,n=e.interaction,r=e.starting,i=e.deltaSource,o=r?t:n.prevEvent;"client"===i?(t.dx=t.clientX-o.clientX,t.dy=t.clientY-o.clientY):(t.dx=t.pageX-o.pageX,t.dy=t.pageY-o.pageY)}),l.signals=a,t.exports=l},{"./defaultOptions":18,"./utils/Signals":35,"./utils/extend":41,"./utils/getOriginXY":42}],4:[function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=e("./utils/is"),o=e("./utils/events"),s=e("./utils/extend"),a=e("./actions/base"),l=e("./scope"),c=e("./Eventable"),p=e("./defaultOptions"),u=e("./utils/Signals").new(),d=e("./utils/domUtils"),f=d.getElementRect,v=d.nodeContains,g=d.trySelector,h=e("./utils/window"),m=h.getWindow,y=e("./utils/arr"),x=y.indexOf,b=y.contains,w=e("./utils/browser"),E=w.wheelEvent;l.interactables=[];var S=function(){function e(t,n){r(this,e),n=n||{},this.target=t,this.events=new c,this._context=n.context||l.document,this._win=m(g(t)?this._context:t),this._doc=this._win.document,u.fire("new",{target:t,options:n,interactable:this,win:this._win}),l.addDocument(this._doc,this._win),l.interactables.push(this),this.set(n)}return e.prototype.setOnEvents=function(e,t){var n="on"+e;return i.function(t.onstart)&&(this.events[n+"start"]=t.onstart),i.function(t.onmove)&&(this.events[n+"move"]=t.onmove),i.function(t.onend)&&(this.events[n+"end"]=t.onend),i.function(t.oninertiastart)&&(this.events[n+"inertiastart"]=t.oninertiastart),this},e.prototype.setPerAction=function(e,t){for(var n in t)n in p[e]&&(i.object(t[n])?(this.options[e][n]=s(this.options[e][n]||{},t[n]),i.object(p.perAction[n])&&"enabled"in p.perAction[n]&&(this.options[e][n].enabled=!1!==t[n].enabled)):i.bool(t[n])&&i.object(p.perAction[n])?this.options[e][n].enabled=t[n]:void 0!==t[n]&&(this.options[e][n]=t[n]))},e.prototype.getRect=function(e){return e=e||this.target,i.string(this.target)&&!i.element(e)&&(e=this._context.querySelector(this.target)),f(e)},e.prototype.rectChecker=function(e){return i.function(e)?(this.getRect=e,this):null===e?(delete this.options.getRect,this):this.getRect},e.prototype._backCompatOption=function(e,t){if(g(t)||i.object(t)){this.options[e]=t;for(var n=a.names,r=Array.isArray(n),o=0,n=r?n:n[Symbol.iterator]();;){var s;if(r){if(o>=n.length)break;s=n[o++]}else{if(o=n.next(),o.done)break;s=o.value}var l=s;this.options[l][e]=t}return this}return this.options[e]},e.prototype.origin=function(e){return this._backCompatOption("origin",e)},e.prototype.deltaSource=function(e){return"page"===e||"client"===e?(this.options.deltaSource=e,this):this.options.deltaSource},e.prototype.context=function(){return this._context},e.prototype.inContext=function(e){return this._context===e.ownerDocument||v(this._context,e)},e.prototype.fire=function(e){return this.events.fire(e),this},e.prototype._onOffMultiple=function(e,t,n,r){if(i.string(t)&&-1!==t.search(" ")&&(t=t.trim().split(/ +/)),i.array(t)){for(var o=0;o=l.length)break;f=l[d++]}else{if(d=l.next(),d.done)break;f=d.value}var v=f;this.options[v]=p.base[v],v in t&&this[v](t[v])}return u.fire("set",{options:t,interactable:this}),this},e.prototype.unset=function(){if(o.remove(this.target,"all"),i.string(this.target))for(var e in o.delegatedEvents){var t=o.delegatedEvents[e];t.selectors[0]===this.target&&t.contexts[0]===this._context&&(t.selectors.splice(0,1),t.contexts.splice(0,1),t.listeners.splice(0,1),t.selectors.length||(t[e]=null)),o.remove(this._context,e,o.delegateListener),o.remove(this._context,e,o.delegateUseCapture,!0)}else o.remove(this,"all");u.fire("unset",{interactable:this}),l.interactables.splice(x(l.interactables,this),1);for(var n=l.interactions||[],r=Array.isArray(n),s=0,n=r?n:n[Symbol.iterator]();;){var a;if(r){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var c=a;c.target===this&&c.interacting()&&c.stop()}return l.interact},e}();l.interactables.indexOfElement=function(e,t){t=t||l.document;for(var n=0;n=x.length)break;E=x[w++]}else{if(w=x.next(),w.done)break;E=w.value}var S=E,T=S[0],C=S[1];C._updateEventTargets(i,o),C[e](T,t,i,o)}}}function o(e){for(var t=0;te.pointerMoveTolerance);var a={pointer:t,pointerIndex:this.getPointerIndex(t),event:n,eventTarget:r,dx:o,dy:s,duplicate:i,interaction:this,interactingBeforeMove:this.interacting()};i||l.setCoordDeltas(this.pointerDelta,this.prevCoords,this.curCoords),f.fire("move",a),i||(this.interacting()&&this.doMove(a),this.pointerWasMoved&&l.copyCoords(this.prevCoords,this.curCoords))},e.prototype.doMove=function(e){e=l.extend({pointer:this.pointers[0],event:this.prevEvent,eventTarget:this._eventTarget,interaction:this},e||{}),f.fire("before-action-move",e),this._dontFireMove||f.fire("action-move",e),this._dontFireMove=!1},e.prototype.pointerUp=function(e,t,n,r){var i=this.getPointerIndex(e);f.fire(/cancel$/i.test(t.type)?"cancel":"up",{pointer:e,pointerIndex:i,event:t,eventTarget:n,curEventTarget:r,interaction:this}),this.simulation||this.end(t),this.pointerIsDown=!1,this.removePointer(e,t)},e.prototype.end=function(e){e=e||this.prevEvent,this.interacting()&&f.fire("action-end",{event:e,interaction:this}),this.stop()},e.prototype.currentAction=function(){return this._interacting?this.prepared.name:null},e.prototype.interacting=function(){return this._interacting},e.prototype.stop=function(){f.fire("stop",{interaction:this}),this._interacting&&(f.fire("stop-active",{interaction:this}),f.fire("stop-"+this.prepared.name,{interaction:this})),this.target=this.element=null,this._interacting=!1,this.prepared.name=this.prevEvent=null},e.prototype.getPointerIndex=function(e){return"mouse"===this.pointerType||"pen"===this.pointerType?0:l.indexOf(this.pointerIds,l.getPointerId(e))},e.prototype.updatePointer=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:t&&/(down|start)$/i.test(t.type),r=l.getPointerId(e),i=this.getPointerIndex(e);return-1===i&&(i=this.pointerIds.length,this.pointerIds[i]=r),n&&f.fire("update-pointer-down",{pointer:e,event:t,down:n,pointerId:r,pointerIndex:i,interaction:this}),this.pointers[i]=e,i},e.prototype.removePointer=function(e,t){var n=this.getPointerIndex(e);-1!==n&&(f.fire("remove-pointer",{pointer:e,event:t,pointerIndex:n,interaction:this}),this.pointers.splice(n,1),this.pointerIds.splice(n,1),this.downTargets.splice(n,1),this.downTimes.splice(n,1))},e.prototype._updateEventTargets=function(e,t){this._eventTarget=e,this._curEventTarget=t},e}(),y=0,x=g.length;y=i.length)break;a=i[s++]}else{if(s=i.next(),s.done)break;a=s.value}var l=a;if(l.options.drop.enabled){var c=l.options.drop.accept;if(!(p.is.element(c)&&c!==t||p.is.string(c)&&!p.matchesSelector(t,c)))for(var d=p.is.string(l.target)?l._context.querySelectorAll(l.target):[l.target],f=0;fo.left&&c.xo.top&&c.y=o.left&&v<=o.right&&g>=o.top&&g<=o.bottom}if(f&&p.is.number(a)){s=Math.max(0,Math.min(o.right,f.right)-Math.max(o.left,f.left))*Math.max(0,Math.min(o.bottom,f.bottom)-Math.max(o.top,f.top))/(f.width*f.height)>=a}return this.options.drop.checker&&(s=this.options.drop.checker(e,t,s,this,i,n,r)),s},v.signals.on("unset",function(e){e.interactable.dropzone(!1)}),v.settingsMethods.push("dropChecker"),g.signals.on("new",function(e){e.dropTarget=null,e.dropElement=null,e.prevDropTarget=null,e.prevDropElement=null,e.dropEvents=null,e.activeDrops={dropzones:[],elements:[],rects:[]}}),g.signals.on("stop",function(e){var t=e.interaction;t.dropTarget=t.dropElement=t.prevDropTarget=t.prevDropElement=null}),d.dynamicDrop=function(e){return p.is.bool(e)?(y=e,d):y},p.merge(v.eventTypes,["dragenter","dragleave","dropactivate","dropdeactivate","dropmove","drop"]),c.methodDict.drop="dropzone",h.drop=m.defaults,t.exports=m},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../interact":21,"../scope":34,"../utils":44,"./base":6}],9:[function(e,t,n){"use strict";var r=e("./base"),i=e("../utils"),o=e("../InteractEvent"),s=e("../Interactable"),a=e("../Interaction"),l=e("../defaultOptions"),c={defaults:{enabled:!1,origin:null,restrict:null},checker:function(e,t,n,r,i){return i.pointerIds.length>=2?{name:"gesture"}:null},getCursor:function(){return""}};o.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;"gesturestart"===t.type&&(t.ds=0,n.gesture.startDistance=n.gesture.prevDistance=t.distance,n.gesture.startAngle=n.gesture.prevAngle=t.angle,n.gesture.scale=1)}),o.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;"gesturemove"===t.type&&(t.ds=t.scale-n.gesture.scale,n.target.fire(t),n.gesture.prevAngle=t.angle,n.gesture.prevDistance=t.distance,t.scale===1/0||null===t.scale||void 0===t.scale||isNaN(t.scale)||(n.gesture.scale=t.scale))}),s.prototype.gesturable=function(e){return i.is.object(e)?(this.options.gesture.enabled=!1!==e.enabled,this.setPerAction("gesture",e),this.setOnEvents("gesture",e),this):i.is.bool(e)?(this.options.gesture.enabled=e,e||(this.ongesturestart=this.ongesturestart=this.ongestureend=null),this):this.options.gesture},o.signals.on("set-delta",function(e){var t=e.interaction,n=e.iEvent,r=e.action,s=e.event,a=e.starting,l=e.ending,c=e.deltaSource;if("gesture"===r){var p=t.pointers;n.touches=[p[0],p[1]],a?(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=1,n.ds=0,n.angle=i.touchAngle(p,void 0,c),n.da=0):l||s instanceof o?(n.distance=t.prevEvent.distance,n.box=t.prevEvent.box,n.scale=t.prevEvent.scale,n.ds=n.scale-1,n.angle=t.prevEvent.angle,n.da=n.angle-t.gesture.startAngle):(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=n.distance/t.gesture.startDistance,n.angle=i.touchAngle(p,t.gesture.prevAngle,c),n.ds=n.scale-t.gesture.prevScale,n.da=n.angle-t.gesture.prevAngle)}}),a.signals.on("new",function(e){e.gesture={start:{x:0,y:0},startDistance:0,prevDistance:0,distance:0,scale:1,startAngle:0,prevAngle:0}}),r.gesture=c,r.names.push("gesture"),i.merge(s.eventTypes,["gesturestart","gesturemove","gestureend"]),r.methodDict.gesture="gesturable",l.gesture=c.defaults,t.exports=c},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"./base":6}],10:[function(e,t,n){"use strict";function r(e,t,n,r,i,s,a){if(!t)return!1;if(!0===t){var l=o.is.number(s.width)?s.width:s.right-s.left,c=o.is.number(s.height)?s.height:s.bottom-s.top;if(l<0&&("left"===e?e="right":"right"===e&&(e="left")),c<0&&("top"===e?e="bottom":"bottom"===e&&(e="top")),"left"===e)return n.x<(l>=0?s.left:s.right)+a;if("top"===e)return n.y<(c>=0?s.top:s.bottom)+a;if("right"===e)return n.x>(l>=0?s.right:s.left)-a;if("bottom"===e)return n.y>(c>=0?s.bottom:s.top)-a}return!!o.is.element(r)&&(o.is.element(t)?t===r:o.matchesUpTo(r,t,i))}var i=e("./base"),o=e("../utils"),s=e("../utils/browser"),a=e("../InteractEvent"),l=e("../Interactable"),c=e("../Interaction"),p=e("../defaultOptions"),u=s.supportsTouch||s.supportsPointerEvent?20:10,d={defaults:{enabled:!1,mouseButtons:null,origin:null,snap:null,restrict:null,inertia:null,autoScroll:null,square:!1,preserveAspectRatio:!1,axis:"xy",margin:NaN,edges:null,invert:"none"},checker:function(e,t,n,i,s,a){if(!a)return null;var l=o.extend({},s.curCoords.page),c=n.options;if(c.resize.enabled){var p=c.resize,d={left:!1,right:!1,top:!1,bottom:!1};if(o.is.object(p.edges)){for(var f in d)d[f]=r(f,p.edges[f],l,s._eventTarget,i,a,p.margin||u);if(d.left=d.left&&!d.right,d.top=d.top&&!d.bottom,d.left||d.right||d.top||d.bottom)return{name:"resize",edges:d}}else{var v="y"!==c.resize.axis&&l.x>a.right-u,g="x"!==c.resize.axis&&l.y>a.bottom-u;if(v||g)return{name:"resize",axes:(v?"x":"")+(g?"y":"")}}}return null},cursors:s.isIe9OrOlder?{x:"e-resize",y:"s-resize",xy:"se-resize",top:"n-resize",left:"w-resize",bottom:"s-resize",right:"e-resize",topleft:"se-resize",bottomright:"se-resize",topright:"ne-resize",bottomleft:"ne-resize"}:{x:"ew-resize",y:"ns-resize",xy:"nwse-resize",top:"ns-resize",left:"ew-resize",bottom:"ns-resize",right:"ew-resize",topleft:"nwse-resize",bottomright:"nwse-resize",topright:"nesw-resize",bottomleft:"nesw-resize"},getCursor:function(e){if(e.axis)return d.cursors[e.name+e.axis];if(e.edges){for(var t="",n=["top","bottom","left","right"],r=0;r<4;r++)e.edges[n[r]]&&(t+=n[r]);return d.cursors[t]}}};a.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;if("resizestart"===t.type&&n.prepared.edges){var r=n.target.getRect(n.element),i=n.target.options.resize;if(i.square||i.preserveAspectRatio){var s=o.extend({},n.prepared.edges);s.top=s.top||s.left&&!s.bottom,s.left=s.left||s.top&&!s.right,s.bottom=s.bottom||s.right&&!s.top,s.right=s.right||s.bottom&&!s.left,n.prepared._linkedEdges=s}else n.prepared._linkedEdges=null;i.preserveAspectRatio&&(n.resizeStartAspectRatio=r.width/r.height),n.resizeRects={start:r,current:o.extend({},r),inverted:o.extend({},r),previous:o.extend({},r),delta:{left:0,right:0,width:0,top:0,bottom:0,height:0}},t.rect=n.resizeRects.inverted,t.deltaRect=n.resizeRects.delta}}),a.signals.on("new",function(e){var t=e.iEvent,n=e.phase,r=e.interaction;if("move"===n&&r.prepared.edges){var i=r.target.options.resize,s=i.invert,a="reposition"===s||"negate"===s,l=r.prepared.edges,c=r.resizeRects.start,p=r.resizeRects.current,u=r.resizeRects.inverted,d=r.resizeRects.delta,f=o.extend(r.resizeRects.previous,u),v=l,g=t.dx,h=t.dy;if(i.preserveAspectRatio||i.square){var m=i.preserveAspectRatio?r.resizeStartAspectRatio:1;l=r.prepared._linkedEdges,v.left&&v.bottom||v.right&&v.top?h=-g/m:v.left||v.right?h=g/m:(v.top||v.bottom)&&(g=h*m)}if(l.top&&(p.top+=h),l.bottom&&(p.bottom+=h),l.left&&(p.left+=g),l.right&&(p.right+=g),a){if(o.extend(u,p),"reposition"===s){var y=void 0;u.top>u.bottom&&(y=u.top,u.top=u.bottom,u.bottom=y),u.left>u.right&&(y=u.left,u.left=u.right,u.right=y)}}else u.top=Math.min(p.top,c.bottom),u.bottom=Math.max(p.bottom,c.top),u.left=Math.min(p.left,c.right),u.right=Math.max(p.right,c.left);u.width=u.right-u.left,u.height=u.bottom-u.top;for(var x in u)d[x]=u[x]-f[x];t.edges=r.prepared.edges,t.rect=u,t.deltaRect=d}}),l.prototype.resizable=function(e){return o.is.object(e)?(this.options.resize.enabled=!1!==e.enabled,this.setPerAction("resize",e),this.setOnEvents("resize",e),/^x$|^y$|^xy$/.test(e.axis)?this.options.resize.axis=e.axis:null===e.axis&&(this.options.resize.axis=p.resize.axis),o.is.bool(e.preserveAspectRatio)?this.options.resize.preserveAspectRatio=e.preserveAspectRatio:o.is.bool(e.square)&&(this.options.resize.square=e.square),this):o.is.bool(e)?(this.options.resize.enabled=e, +e||(this.onresizestart=this.onresizestart=this.onresizeend=null),this):this.options.resize},c.signals.on("new",function(e){e.resizeAxes="xy"}),a.signals.on("set-delta",function(e){var t=e.interaction,n=e.iEvent;"resize"===e.action&&t.resizeAxes&&(t.target.options.resize.square?("y"===t.resizeAxes?n.dx=n.dy:n.dy=n.dx,n.axes="xy"):(n.axes=t.resizeAxes,"x"===t.resizeAxes?n.dy=0:"y"===t.resizeAxes&&(n.dx=0)))}),i.resize=d,i.names.push("resize"),o.merge(l.eventTypes,["resizestart","resizemove","resizeinertiastart","resizeinertiaresume","resizeend"]),i.methodDict.resize="resizable",p.resize=d.defaults,t.exports=d},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"../utils/browser":37,"./base":6}],11:[function(e,t,n){"use strict";var r=e("./utils/raf"),i=e("./utils/window").getWindow,o=e("./utils/is"),s=e("./utils/domUtils"),a=e("./Interaction"),l=e("./defaultOptions"),c={defaults:{enabled:!1,container:null,margin:60,speed:300},interaction:null,i:null,x:0,y:0,isScrolling:!1,prevTime:0,start:function(e){c.isScrolling=!0,r.cancel(c.i),c.interaction=e,c.prevTime=(new Date).getTime(),c.i=r.request(c.scroll)},stop:function(){c.isScrolling=!1,r.cancel(c.i)},scroll:function(){var e=c.interaction.target.options[c.interaction.prepared.name].autoScroll,t=e.container||i(c.interaction.element),n=(new Date).getTime(),s=(n-c.prevTime)/1e3,a=e.speed*s;a>=1&&(o.window(t)?t.scrollBy(c.x*a,c.y*a):t&&(t.scrollLeft+=c.x*a,t.scrollTop+=c.y*a),c.prevTime=n),c.isScrolling&&(r.cancel(c.i),c.i=r.request(c.scroll))},check:function(e,t){var n=e.options;return n[t].autoScroll&&n[t].autoScroll.enabled},onInteractionMove:function(e){var t=e.interaction,n=e.pointer;if(t.interacting()&&c.check(t.target,t.prepared.name)){if(t.simulation)return void(c.x=c.y=0);var r=void 0,a=void 0,l=void 0,p=void 0,u=t.target.options[t.prepared.name].autoScroll,d=u.container||i(t.element);if(o.window(d))p=n.clientXd.innerWidth-c.margin,l=n.clientY>d.innerHeight-c.margin;else{var f=s.getElementClientRect(d);p=n.clientXf.right-c.margin,l=n.clientY>f.bottom-c.margin}c.x=a?1:p?-1:0,c.y=l?1:r?-1:0,c.isScrolling||(c.margin=u.margin,c.speed=u.speed,c.start(t))}}};a.signals.on("stop-active",function(){c.stop()}),a.signals.on("action-move",c.onInteractionMove),l.perAction.autoScroll=c.defaults,t.exports=c},{"./Interaction":5,"./defaultOptions":18,"./utils/domUtils":39,"./utils/is":46,"./utils/raf":50,"./utils/window":52}],12:[function(e,t,n){"use strict";var r=e("../Interactable"),i=e("../actions/base"),o=e("../utils/is"),s=e("../utils/domUtils");r.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},r.prototype.ignoreFrom=function(e){return this._backCompatOption("ignoreFrom",e)},r.prototype.allowFrom=function(e){return this._backCompatOption("allowFrom",e)},r.prototype.testIgnore=function(e,t,n){return!(!e||!o.element(n))&&(o.string(e)?s.matchesUpTo(n,e,t):!!o.element(e)&&s.nodeContains(e,n))},r.prototype.testAllow=function(e,t,n){return!e||!!o.element(n)&&(o.string(e)?s.matchesUpTo(n,e,t):!!o.element(e)&&s.nodeContains(e,n))},r.prototype.testIgnoreAllow=function(e,t,n){return!this.testIgnore(e.ignoreFrom,t,n)&&this.testAllow(e.allowFrom,t,n)},r.prototype.actionChecker=function(e){return o.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},r.prototype.styleCursor=function(e){return o.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},r.prototype.defaultActionChecker=function(e,t,n,r){for(var o=this.getRect(r),s=null,a=i.names,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var u=p;if((!n.pointerIsDown||!n.mouse||0!=(t.buttons&this.options[u].mouseButtons))&&(s=i[u].checker(e,t,this,r,n,o)))return s}}},{"../Interactable":4,"../actions/base":6,"../utils/domUtils":39,"../utils/is":46}],13:[function(e,t,n){"use strict";function r(e,t,n,r){return g.is.object(e)&&t.testIgnoreAllow(t.options[e.name],n,r)&&t.options[e.name].enabled&&a(t,n,e)?e:null}function i(e,t,n,i,o,s){for(var a=0,l=i.length;a=m.maxInteractions)return!1;if(u.target===e){if((a+=d===n.name|0)>=i)return!1;if(u.element===t&&(l++,d!==n.name||l>=o))return!1}}}return m.maxInteractions>0}}var l=e("../interact"),c=e("../Interactable"),p=e("../Interaction"),u=e("../actions/base"),d=e("../defaultOptions"),f=e("../utils/browser"),v=e("../scope"),g=e("../utils"),h=e("../utils/Signals").new();e("./InteractableMethods");var m={signals:h,withinInteractionLimit:a,maxInteractions:1/0,defaults:{perAction:{manualStart:!1,max:1/0,maxPerElement:1,allowFrom:null,ignoreFrom:null}},setActionDefaults:function(e){g.extend(e.defaults,m.defaults.perAction)}};p.signals.on("down",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;if(!t.interacting()){s(t,o(t,n,r,i))}}),p.signals.on("move",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;if(t.mouse&&!t.pointerIsDown&&!t.interacting()){s(t,o(t,n,r,i))}}),p.signals.on("move",function(e){var t=e.interaction,n=e.event;if(t.pointerIsDown&&!t.interacting()&&t.pointerWasMoved&&t.prepared.name){h.fire("before-start",e);var r=t.target;t.prepared.name&&r&&(r.options[t.prepared.name].manualStart||!a(r,t.element,t.prepared)?t.stop(n):t.start(t.prepared,r,t.element))}}),p.signals.on("stop",function(e){var t=e.interaction,n=t.target;n&&n.options.styleCursor&&(n._doc.documentElement.style.cursor="")}),c.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},c.prototype.actionChecker=function(e){return g.is.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},c.prototype.styleCursor=function(e){return g.is.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},c.prototype.defaultActionChecker=function(e,t,n,r){for(var i=this.getRect(r),o=t.buttons||{0:1,1:4,3:8,4:16}[t.button],s=null,a=u.names,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var d=p;if((!n.pointerIsDown||!n.mouse||0!=(o&this.options[d].mouseButtons))&&(s=u[d].checker(e,t,this,r,n,i)))return s}},l.maxInteractions=function(e){return g.is.number(e)?(m.maxInteractions=e,this):m.maxInteractions},c.settingsMethods.push("styleCursor"),c.settingsMethods.push("actionChecker"),c.settingsMethods.push("ignoreFrom"),c.settingsMethods.push("allowFrom"),d.base.actionChecker=null,d.base.styleCursor=!0,g.extend(d.perAction,m.defaults.perAction),t.exports=m},{"../Interactable":4,"../Interaction":5,"../actions/base":6,"../defaultOptions":18,"../interact":21,"../scope":34,"../utils":44,"../utils/Signals":35,"../utils/browser":37,"./InteractableMethods":12}],14:[function(e,t,n){"use strict";var r=e("./base"),i=e("../Interaction");i.signals.on("new",function(e){e.delayTimer=null}),r.signals.on("prepared",function(e){var t=e.interaction,n=t.prepared.name;if(n){var r=t.target.options[n].delay;r>0&&(t.delayTimer=setTimeout(function(){t.start(t.prepared,t.target,t.element)},r))}}),i.signals.on("move",function(e){var t=e.interaction,n=e.duplicate;t.pointerWasMoved&&!n&&clearTimeout(t.delayTimer)}),r.signals.on("before-start",function(e){var t=e.interaction,n=t.prepared.name;if(n){t.target.options[n].delay>0&&(t.prepared.name=null)}})},{"../Interaction":5,"./base":13}],15:[function(e,t,n){"use strict";function r(e,t){if(!t)return!1;var n=t.options.drag.startAxis;return"xy"===e||"xy"===n||n===e}var i=e("./base"),o=e("../scope"),s=e("../utils/browser"),a=e("../utils/is"),l=e("../utils/domUtils"),c=l.matchesSelector,p=l.parentNode;i.setActionDefaults(e("../actions/drag")),i.signals.on("before-start",function(e){var t=e.interaction,n=e.eventTarget,l=e.dx,u=e.dy;if("drag"===t.prepared.name){var d=Math.abs(l),f=Math.abs(u),v=t.target.options.drag,g=v.startAxis,h=d>f?"x":dl.minSpeed&&g>l.endSpeed,b={interaction:t,pageCoords:v,statuses:f,preEnd:!0,requireEndOnly:!0};y&&!x&&(c.resetStatuses(f),m=c.setAll(b),m.shouldMove&&m.locked&&(h=!0)),(x||h)&&(p.copyCoords(i.upCoords,t.curCoords),t.pointers[0]=i.startEvent=new a(t,n,t.prepared.name,"inertiastart",t.element),i.t0=d,i.active=!0,i.allowResume=l.allowResume,t.simulation=i,o.fire(i.startEvent),x?(i.vx0=t.pointerDelta.client.vx,i.vy0=t.pointerDelta.client.vy,i.v0=g,r(t,i),p.extend(v,t.curCoords.page),v.x+=i.xe,v.y+=i.ye,c.resetStatuses(f),m=c.setAll(b),i.modifiedXe+=m.dx,i.modifiedYe+=m.dy,i.i=u.request(t.boundInertiaFrame)):(i.smoothEnd=!0,i.xe=m.dx,i.ye=m.dy,i.sx=i.sy=0,i.i=u.request(t.boundSmoothEndFrame)))}}),l.signals.on("stop-active",function(e){var t=e.interaction,n=t.inertiaStatus;n.active&&(u.cancel(n.i),n.active=!1,t.simulation=null)})},{"./InteractEvent":3,"./Interaction":5,"./modifiers":24,"./utils":44,"./utils/raf":50}],21:[function(e,t,n){"use strict";function r(e,t){var n=a.interactables.get(e,t);return n||(n=new l(e,t),n.events.global=p),n}var i=e("./utils/browser"),o=e("./utils/events"),s=e("./utils"),a=e("./scope"),l=e("./Interactable"),c=e("./Interaction"),p={};r.isSet=function(e,t){return-1!==a.interactables.indexOfElement(e,t&&t.context)},r.on=function(e,t,n){if(s.is.string(e)&&-1!==e.search(" ")&&(e=e.trim().split(/ +/)),s.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.on(f,t,n)}return r}if(s.is.object(e)){for(var v in e)r.on(v,e[v],t);return r}return s.contains(l.eventTypes,e)?p[e]?p[e].push(t):p[e]=[t]:o.add(a.document,e,t,{options:n}),r},r.off=function(e,t,n){if(s.is.string(e)&&-1!==e.search(" ")&&(e=e.trim().split(/ +/)),s.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.off(f,t,n)}return r}if(s.is.object(e)){for(var v in e)r.off(v,e[v],t);return r}if(s.contains(l.eventTypes,e)){var g=void 0;e in p&&-1!==(g=s.indexOf(p[e],t))&&p[e].splice(g,1)}else o.remove(a.document,e,t,n);return r},r.debug=function(){return a},r.getPointerAverage=s.pointerAverage,r.getTouchBBox=s.touchBBox,r.getTouchDistance=s.touchDistance,r.getTouchAngle=s.touchAngle,r.getElementRect=s.getElementRect,r.getElementClientRect=s.getElementClientRect,r.matchesSelector=s.matchesSelector,r.closest=s.closest,r.supportsTouch=function(){return i.supportsTouch},r.supportsPointerEvent=function(){return i.supportsPointerEvent},r.stop=function(e){for(var t=a.interactions.length-1;t>=0;t--)a.interactions[t].stop(e);return r},r.pointerMoveTolerance=function(e){return s.is.number(e)?(c.pointerMoveTolerance=e,this):c.pointerMoveTolerance},r.addDocument=a.addDocument,r.removeDocument=a.removeDocument,a.interact=r,t.exports=r},{"./Interactable":4,"./Interaction":5,"./scope":34,"./utils":44,"./utils/browser":37,"./utils/events":40}],22:[function(e,t,n){"use strict";function r(e){var t=e.interaction,n=e.event;t.target&&t.target.checkAndPreventDefault(n)}var i=e("./Interactable"),o=e("./Interaction"),s=e("./scope"),a=e("./utils/is"),l=e("./utils/events"),c=e("./utils/domUtils"),p=c.nodeContains,u=c.matchesSelector;i.prototype.preventDefault=function(e){return/^(always|never|auto)$/.test(e)?(this.options.preventDefault=e,this):a.bool(e)?(this.options.preventDefault=e?"always":"never",this):this.options.preventDefault},i.prototype.checkAndPreventDefault=function(e){var t=this.options.preventDefault;if("never"!==t)return"always"===t?void e.preventDefault():void(l.supportsOptions||/^(mouse|pointer|touch)*(down|start)/i.test(e.type)||a.element(e.target)&&u(e.target,"input,select,textarea,[contenteditable=true],[contenteditable=true] *")||e.preventDefault())};for(var d=["down","move","up","cancel"],f=0;f=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i;if(o.element&&(o.element===e.target||p(o.element,e.target)))return void o.target.checkAndPreventDefault(e)}}},{"./Interactable":4,"./Interaction":5,"./scope":34,"./utils/domUtils":39,"./utils/events":40,"./utils/is":46}],23:[function(e,t,n){"use strict";function r(e){var t=e.target,n=a.search(e,e.type,t);n&&n.prevTap&&e.clientX===n.prevTap.clientX&&e.clientY===n.prevTap.clientY&&t===n.prevTap.target&&(n.downTargets[0]=t,n.downTimes[0]=(new Date).getTime(),l.fire({interaction:n,event:e,eventTarget:t,pointer:e,type:"tap"}))}var i=e("./scope"),o=e("./utils/events"),s=e("./utils/browser"),a=e("./utils/interactionFinder"),l=e("./pointerEvents/base"),c=e("./utils/window"),p=c.window,u=Object.prototype.toString;if(p.Array.isArray||(p.Array.isArray=function(e){return"[object Array]"===u.call(e)}),String.prototype.trim||(String.prototype.trim=function(){return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")}),s.isIE8){var d=function(e){for(var t=i.interactions,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var o;if(n){if(r>=t.length)break;o=t[r++]}else{if(r=t.next(),r.done)break;o=r.value}var s=o;s.interacting()&&s.target.checkAndPreventDefault(e)}},f=function(e,t){var n=e.doc,i=(e.win,0===t.indexOf("listen")?o.add:o.remove);i(n,"selectstart",d),l&&i(n,"dblclick",r)};i.signals.on("add-document",f),i.signals.on("remove-document",f)}t.exports=null},{"./pointerEvents/base":31,"./scope":34,"./utils/browser":37,"./utils/events":40,"./utils/interactionFinder":45,"./utils/window":52}],24:[function(e,t,n){"use strict";function r(e,t,n){return e&&e.enabled&&(t||!e.endOnly)&&(!n||e.endOnly)}var i=e("../InteractEvent"),o=e("../Interaction"),s=e("../utils/extend"),a={names:[],setOffsets:function(e){var t=e.interaction,n=e.pageCoords,r=t.target,i=t.element,o=t.startOffset,s=r.getRect(i);s?(o.left=n.x-s.left,o.top=n.y-s.top,o.right=s.right-n.x,o.bottom=s.bottom-n.y,"width"in s||(s.width=s.right-s.left),"height"in s||(s.height=s.bottom-s.top)):o.left=o.top=o.right=o.bottom=0,e.rect=s,e.interactable=r,e.element=i;for(var l=0;l=p.length)break;f=p[d++]}else{if(d=p.next(),d.done)break;f=d.value}var v=f,g=a[v],h=t.target.options[t.prepared.name][v];r(h,i,o)&&(e.status=e.status=n[v],e.options=h,e.offset=e.interaction.modifierOffsets[v],g.set(e),e.status.locked&&(l.x+=e.status.dx,l.y+=e.status.dy,c.dx+=e.status.dx,c.dy+=e.status.dy,c.locked=!0))}return c.shouldMove=!e.status||!c.locked||e.status.changed,c},resetStatuses:function(e){for(var t=a.names,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var i;if(n){if(r>=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i,s=e[o]||{};s.dx=s.dy=0,s.modifiedX=s.modifiedY=NaN,s.locked=!1,s.changed=!0,e[o]=s}return e},start:function(e,t){var n=e.interaction,r={interaction:n,pageCoords:("action-resume"===t?n.curCoords:n.startCoords).page,startOffset:n.startOffset,statuses:n.modifierStatuses,preEnd:!1,requireEndOnly:!1};a.setOffsets(r),a.resetStatuses(r.statuses),r.pageCoords=s({},n.startCoords.page),n.modifierResult=a.setAll(r)}};o.signals.on("new",function(e){e.startOffset={left:0,right:0,top:0,bottom:0},e.modifierOffsets={},e.modifierStatuses=a.resetStatuses({}),e.modifierResult=null}),o.signals.on("action-start",a.start),o.signals.on("action-resume",a.start),o.signals.on("before-action-move",function(e){var t=e.interaction,n=e.preEnd,r=e.interactingBeforeMove,i=a.setAll({interaction:t,preEnd:n,pageCoords:t.curCoords.page,statuses:t.modifierStatuses,requireEndOnly:!1});!i.shouldMove&&r&&(t._dontFireMove=!0),t.modifierResult=i}),o.signals.on("action-end",function(e){for(var t=e.interaction,n=e.event,i=0;i=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}var m=h,y=m.x,x=m.y;l.push({x:s.left-i.width*y+u.x,y:s.top-i.height*x+u.y})}else l.push(u);return l},set:function(e){var t=e.interaction,n=e.pageCoords,r=e.status,i=e.options,s=e.offset,a=[],l=void 0,c=void 0,p=void 0;if(r.useStatusXY)c={x:r.x,y:r.y};else{var u=o.getOriginXY(t.target,t.element,t.prepared.name);c=o.extend({},n),c.x-=u.x,c.y-=u.y}r.realX=c.x,r.realY=c.y;for(var d=i.targets?i.targets.length:0,f=s,v=Array.isArray(f),g=0,f=v?f:f[Symbol.iterator]();;){var h;if(v){if(g>=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}for(var m=h,y=m.x,x=m.y,b=c.x-y,w=c.y-x,E=i.targets,S=Array.isArray(E),T=0,E=S?E:E[Symbol.iterator]();;){var C;if(S){if(T>=E.length)break;C=E[T++]}else{if(T=E.next(),T.done)break;C=T.value}var A=C;l=o.is.function(A)?A(b,w,t):A,l&&a.push({x:o.is.number(l.x)?l.x+y:b,y:o.is.number(l.y)?l.y+x:w,range:o.is.number(l.range)?l.range:i.range})}}var D={target:null,inRange:!1,distance:0,range:0,dx:0,dy:0};for(p=0,d=a.length;p=p.length)break;f=p[d++]}else{if(d=p.next(),d.done)break;f=d.value}var v=f,g=void 0;g=a.is.function(v)?v(l,c,t):v,g&&("width"in g&&"height"in g&&(g.x=g.width, +g.y=g.height),e.options.targets.push(g))}i.set(e)},modifyCoords:function(e){var t=e.options;e.options=a.extend({},t),e.options.enabled=t.enabled,e.options.relativePoints=[null],i.modifyCoords(e)}};r.snapSize=l,r.names.push("snapSize"),o.perAction.snapSize=l.defaults,s.defaults.snapSize=l.defaults,t.exports=l},{"../actions/resize":10,"../defaultOptions":18,"../utils/":44,"./index":24,"./snap":28}],30:[function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=e("../utils/pointerUtils");t.exports=function(){function e(t,n,o,s,a){if(r(this,e),i.pointerExtend(this,o),o!==n&&i.pointerExtend(this,n),this.interaction=a,this.timeStamp=(new Date).getTime(),this.originalEvent=o,this.type=t,this.pointerId=i.getPointerId(n),this.pointerType=i.getPointerType(n),this.target=s,this.currentTarget=null,"tap"===t){var l=a.getPointerIndex(n);this.dt=this.timeStamp-a.downTimes[l];var c=this.timeStamp-a.tapTime;this.double=!!(a.prevTap&&"doubletap"!==a.prevTap.type&&a.prevTap.target===this.target&&c<500)}else"doubletap"===t&&(this.dt=n.timeStamp-a.tapTime)}return e.prototype.subtractOrigin=function(e){var t=e.x,n=e.y;return this.pageX-=t,this.pageY-=n,this.clientX-=t,this.clientY-=n,this},e.prototype.addOrigin=function(e){var t=e.x,n=e.y;return this.pageX+=t,this.pageY+=n,this.clientX+=t,this.clientY+=n,this},e.prototype.preventDefault=function(){this.originalEvent.preventDefault()},e.prototype.stopPropagation=function(){this.propagationStopped=!0},e.prototype.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},e}()},{"../utils/pointerUtils":49}],31:[function(e,t,n){"use strict";function r(e){for(var t=e.interaction,n=e.pointer,s=e.event,l=e.eventTarget,c=e.type,u=void 0===c?e.pointerEvent.type:c,d=e.targets,f=void 0===d?i(e):d,v=e.pointerEvent,g=void 0===v?new o(u,n,s,l,t):v,h={interaction:t,pointer:n,event:s,eventTarget:l,targets:f,type:u,pointerEvent:g},m=0;m=u.length)break;g=u[v++]}else{if(v=u.next(),v.done)break;g=v.value}var h=g;c.element=h,p.fire("collect-targets",c)}return"hold"===o&&(c.targets=d(c.targets,function(e){return e.eventable.options.holdDuration===t.holdTimers[s].duration})),c.targets}var o=e("./PointerEvent"),s=e("../Interaction"),a=e("../utils"),l=e("../utils/browser"),c=e("../defaultOptions"),p=e("../utils/Signals").new(),u=e("../utils/arr"),d=u.filter,f=["down","up","cancel"],v=["down","up","cancel"],g={PointerEvent:o,fire:r,collectEventTargets:i,signals:p,defaults:{holdDuration:600,ignoreFrom:null,allowFrom:null,origin:{x:0,y:0}},types:["down","move","up","cancel","tap","doubletap","hold"]};s.signals.on("update-pointer-down",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers[n]={duration:1/0,timeout:null}}),s.signals.on("remove-pointer",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers.splice(n,1)}),s.signals.on("move",function(e){var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,s=e.duplicateMove,a=t.getPointerIndex(n);s||t.pointerIsDown&&!t.pointerWasMoved||(t.pointerIsDown&&clearTimeout(t.holdTimers[a].timeout),r({interaction:t,pointer:n,event:i,eventTarget:o,type:"move"}))}),s.signals.on("down",function(e){for(var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,s=e.pointerIndex,c=l.isIE8?a.extend({},i):i,u=t.holdTimers[s],d=a.getPath(o),f={interaction:t,pointer:n,event:i,eventTarget:o,type:"hold",targets:[],path:d,element:null},v=d,g=Array.isArray(v),h=0,v=g?v:v[Symbol.iterator]();;){var m;if(g){if(h>=v.length)break;m=v[h++]}else{if(h=v.next(),h.done)break;m=h.value}var y=m;f.element=y,p.fire("collect-targets",f)}if(f.targets.length){for(var x=1/0,b=0;b=0&&(p.selectors[u]!==e||p.contexts[u]!==t);u--);-1===u&&(u=p.selectors.length,p.selectors.push(e),p.contexts.push(t),p.listeners.push([])),p.listeners[u].push([i,!!s.capture,s.passive])}function s(e,t,n,r,o){var s=f(o),c=O[n],p=!1,u=void 0;if(c)for(u=c.selectors.length-1;u>=0;u--)if(c.selectors[u]===e&&c.contexts[u]===t){for(var d=c.listeners[u],v=d.length-1;v>=0;v--){var g=d[v],h=g[0],m=g[1],y=g[2];if(h===r&&m===!!s.capture&&y===s.passive){d.splice(v,1),d.length||(c.selectors.splice(u,1),c.contexts.splice(u,1),c.listeners.splice(u,1),i(t,n,a),i(t,n,l,!0),c.selectors.length||(O[n]=null)),p=!0;break}}if(p)break}}function a(e,t){var n=f(t),r={},i=O[e.type],o=g.getActualElement(e.path?e.path[0]:e.target),s=o;for(h(r,e),r.originalEvent=e,r.preventDefault=p;v.element(s);){for(var a=0;a=l.length)break;u=l[p++]}else{if(p=l.next(),p.done)break;u=p.value}var d=u,f=o[d](a);if(f)return f}},simulationResume:function(e){var t=e.pointerType,n=e.eventType,o=e.eventTarget;if(!/down|start/i.test(n))return null;for(var s=r.interactions,a=Array.isArray(s),l=0,s=a?s:s[Symbol.iterator]();;){var c;if(a){if(l>=s.length)break;c=s[l++]}else{if(l=s.next(),l.done)break;c=l.value}var p=c,u=o;if(p.simulation&&p.simulation.allowResume&&p.pointerType===t)for(;u;){if(u===p.element)return p;u=i.parentNode(u)}}return null},mouseOrPen:function(e){var t=e.pointerId,n=e.pointerType,o=e.eventType;if("mouse"!==n&&"pen"!==n)return null;for(var s=void 0,a=r.interactions,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var u=p;if(u.pointerType===n){if(u.simulation&&!i.contains(u.pointerIds,t))continue;if(u.interacting())return u;s||(s=u)}}if(s)return s;for(var d=r.interactions,f=Array.isArray(d),v=0,d=f?d:d[Symbol.iterator]();;){var g;if(f){if(v>=d.length)break;g=d[v++]}else{if(v=d.next(),v.done)break;g=v.value}var h=g;if(!(h.pointerType!==n||/down/i.test(o)&&h.simulation))return h}return null},hasPointer:function(e){for(var t=e.pointerId,n=r.interactions,o=Array.isArray(n),s=0,n=o?n:n[Symbol.iterator]();;){var a;if(o){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var l=a;if(i.contains(l.pointerIds,t))return l}},idle:function(e){for(var t=e.pointerType,n=r.interactions,i=Array.isArray(n),o=0,n=i?n:n[Symbol.iterator]();;){var s;if(i){if(o>=n.length)break;s=n[o++]}else{if(o=n.next(),o.done)break;s=o.value}var a=s;if(1===a.pointerIds.length){var l=a.target;if(l&&!l.options.gesture.enabled)continue}else if(a.pointerIds.length>=2)continue;if(!a.interacting()&&t===a.pointerType)return a}return null}};t.exports=o},{"../scope":34,"./index":44}],46:[function(e,t,n){"use strict";var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},i=e("./window"),o=e("./isWindow"),s={array:function(){},window:function(e){return e===i.window||o(e)},docFrag:function(e){return s.object(e)&&11===e.nodeType},object:function(e){return!!e&&"object"===(void 0===e?"undefined":r(e))},function:function(e){return"function"==typeof e},number:function(e){return"number"==typeof e},bool:function(e){return"boolean"==typeof e},string:function(e){return"string"==typeof e},element:function(e){if(!e||"object"!==(void 0===e?"undefined":r(e)))return!1;var t=i.getWindow(e)||i.window;return/object|function/.test(r(t.Element))?e instanceof t.Element:1===e.nodeType&&"string"==typeof e.nodeName}};s.array=function(e){return s.object(e)&&void 0!==e.length&&s.function(e.splice)},t.exports=s},{"./isWindow":47,"./window":52}],47:[function(e,t,n){"use strict";t.exports=function(e){return!(!e||!e.Window)&&e instanceof e.Window}},{}],48:[function(e,t,n){"use strict";function r(e,n){for(var r in n){var i=t.exports.prefixedPropREs,o=!1;for(var s in i)if(0===r.indexOf(s)&&i[s].test(r)){o=!0;break}o||"function"==typeof n[r]||(e[r]=n[r])}return e}r.prefixedPropREs={webkit:/(Movement[XY]|Radius[XY]|RotationAngle|Force)$/},t.exports=r},{}],49:[function(e,t,n){"use strict";var r=e("./hypot"),i=e("./browser"),o=e("./domObjects"),s=e("./domUtils"),a=e("./domObjects"),l=e("./is"),c=e("./pointerExtend"),p={copyCoords:function(e,t){e.page=e.page||{},e.page.x=t.page.x,e.page.y=t.page.y,e.client=e.client||{},e.client.x=t.client.x,e.client.y=t.client.y,e.timeStamp=t.timeStamp},setCoordDeltas:function(e,t,n){e.page.x=n.page.x-t.page.x,e.page.y=n.page.y-t.page.y,e.client.x=n.client.x-t.client.x,e.client.y=n.client.y-t.client.y,e.timeStamp=n.timeStamp-t.timeStamp;var i=Math.max(e.timeStamp/1e3,.001);e.page.speed=r(e.page.x,e.page.y)/i,e.page.vx=e.page.x/i,e.page.vy=e.page.y/i,e.client.speed=r(e.client.x,e.page.y)/i,e.client.vx=e.client.x/i,e.client.vy=e.client.y/i},isNativePointer:function(e){return e instanceof o.Event||e instanceof o.Touch},getXY:function(e,t,n){return n=n||{},e=e||"page",n.x=t[e+"X"],n.y=t[e+"Y"],n},getPageXY:function(e,t){return t=t||{},i.isOperaMobile&&p.isNativePointer(e)?(p.getXY("screen",e,t),t.x+=window.scrollX,t.y+=window.scrollY):p.getXY("page",e,t),t},getClientXY:function(e,t){return t=t||{},i.isOperaMobile&&p.isNativePointer(e)?p.getXY("screen",e,t):p.getXY("client",e,t),t},getPointerId:function(e){return l.number(e.pointerId)?e.pointerId:e.identifier},setCoords:function(e,t,n){var r=t.length>1?p.pointerAverage(t):t[0],i={};p.getPageXY(r,i),e.page.x=i.x,e.page.y=i.y,p.getClientXY(r,i),e.client.x=i.x,e.client.y=i.y,e.timeStamp=l.number(n)?n:(new Date).getTime()},pointerExtend:c,getTouchPair:function(e){var t=[];return l.array(e)?(t[0]=e[0],t[1]=e[1]):"touchend"===e.type?1===e.touches.length?(t[0]=e.touches[0],t[1]=e.changedTouches[0]):0===e.touches.length&&(t[0]=e.changedTouches[0],t[1]=e.changedTouches[1]):(t[0]=e.touches[0],t[1]=e.touches[1]),t},pointerAverage:function(e){for(var t={pageX:0,pageY:0,clientX:0,clientY:0,screenX:0,screenY:0},n=e,r=Array.isArray(n),i=0,n=r?n:n[Symbol.iterator]();;){var o;if(r){if(i>=n.length)break;o=n[i++]}else{if(i=n.next(),i.done)break;o=i.value}var s=o;for(var a in t)t[a]+=s[a]}for(var l in t)t[l]/=e.length;return t},touchBBox:function(e){if(e.length||e.touches&&e.touches.length>1){var t=p.getTouchPair(e),n=Math.min(t[0].pageX,t[1].pageX),r=Math.min(t[0].pageY,t[1].pageY);return{x:n,y:r,left:n,top:r,width:Math.max(t[0].pageX,t[1].pageX)-n,height:Math.max(t[0].pageY,t[1].pageY)-r}}},touchDistance:function(e,t){var n=t+"X",i=t+"Y",o=p.getTouchPair(e),s=o[0][n]-o[1][n],a=o[0][i]-o[1][i];return r(s,a)},touchAngle:function(e,t,n){var r=n+"X",i=n+"Y",o=p.getTouchPair(e),s=o[1][r]-o[0][r],a=o[1][i]-o[0][i];return 180*Math.atan2(a,s)/Math.PI},getPointerType:function(e){return l.string(e.pointerType)?e.pointerType:l.number(e.pointerType)?[void 0,void 0,"touch","pen","mouse"][e.pointerType]:/touch/.test(e.type)||e instanceof a.Touch?"touch":"mouse"},getEventTargets:function(e){return[s.getActualElement(e.path?e.path[0]:e.target),s.getActualElement(e.currentTarget)]}};t.exports=p},{"./browser":37,"./domObjects":38,"./domUtils":39,"./hypot":43,"./is":46,"./pointerExtend":48}],50:[function(e,t,n){"use strict";for(var r=e("./window"),i=r.window,o=["ms","moz","webkit","o"],s=0,a=void 0,l=void 0,c=0;c\n * Open source under the MIT License.\n * https://raw.github.com/taye/interact.js/master/LICENSE\n */\n","/*\n * In a (windowless) server environment this file exports a factory function\n * that takes the window to use.\n *\n * var interact = require('interact.js')(windowObject);\n *\n * See https://github.com/taye/interact.js/issues/187\n */\nif (typeof window === 'undefined') {\n module.exports = function (window) {\n require('./src/utils/window').init(window);\n\n return require('./src/index');\n };\n}\nelse {\n module.exports = require('./src/index');\n}\n","const { indexOf } = require('./utils/arr');\nconst extend = require('./utils/extend.js');\n\nfunction fireUntilImmediateStopped (event, listeners) {\n for (let i = 0, len = listeners.length; i < len && !event.immediatePropagationStopped; i++) {\n listeners[i](event);\n }\n}\n\nclass Eventable {\n\n constructor (options) {\n this.options = extend({}, options || {});\n }\n\n fire (event) {\n let listeners;\n const onEvent = 'on' + event.type;\n const global = this.global;\n\n // Interactable#on() listeners\n if ((listeners = this[event.type])) {\n fireUntilImmediateStopped(event, listeners);\n }\n\n // interactable.onevent listener\n if (this[onEvent]) {\n this[onEvent](event);\n }\n\n // interact.on() listeners\n if (!event.propagationStopped && global && (listeners = global[event.type])) {\n fireUntilImmediateStopped(event, listeners);\n }\n }\n\n on (eventType, listener) {\n // if this type of event was never bound\n if (this[eventType]) {\n this[eventType].push(listener);\n }\n else {\n this[eventType] = [listener];\n }\n }\n\n off (eventType, listener) {\n // if it is an action event type\n const eventList = this[eventType];\n const index = eventList? indexOf(eventList, listener) : -1;\n\n if (index !== -1) {\n eventList.splice(index, 1);\n }\n\n if (eventList && eventList.length === 0 || !listener) {\n this[eventType] = listener;\n }\n }\n}\n\nmodule.exports = Eventable;\n","const extend = require('./utils/extend');\nconst getOriginXY = require('./utils/getOriginXY');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nclass InteractEvent {\n constructor (interaction, event, action, phase, element, related, preEnd = false) {\n const target = interaction.target;\n const deltaSource = (target && target.options || defaults).deltaSource;\n const origin = getOriginXY(target, element, action);\n const starting = phase === 'start';\n const ending = phase === 'end';\n const coords = starting? interaction.startCoords : interaction.curCoords;\n const prevEvent = interaction.prevEvent;\n\n element = element || interaction.element;\n\n const page = extend({}, coords.page);\n const client = extend({}, coords.client);\n\n page.x -= origin.x;\n page.y -= origin.y;\n\n client.x -= origin.x;\n client.y -= origin.y;\n\n this.ctrlKey = event.ctrlKey;\n this.altKey = event.altKey;\n this.shiftKey = event.shiftKey;\n this.metaKey = event.metaKey;\n this.button = event.button;\n this.buttons = event.buttons;\n this.target = element;\n this.currentTarget = element;\n this.relatedTarget = related || null;\n this.preEnd = preEnd;\n this.type = action + (phase || '');\n this.interaction = interaction;\n this.interactable = target;\n\n this.t0 = starting ? interaction.downTimes[interaction.downTimes.length - 1]\n : prevEvent.t0;\n\n const signalArg = {\n interaction,\n event,\n action,\n phase,\n element,\n related,\n page,\n client,\n coords,\n starting,\n ending,\n deltaSource,\n iEvent: this,\n };\n\n signals.fire('set-xy', signalArg);\n\n if (ending) {\n // use previous coords when ending\n this.pageX = prevEvent.pageX;\n this.pageY = prevEvent.pageY;\n this.clientX = prevEvent.clientX;\n this.clientY = prevEvent.clientY;\n }\n else {\n this.pageX = page.x;\n this.pageY = page.y;\n this.clientX = client.x;\n this.clientY = client.y;\n }\n\n this.x0 = interaction.startCoords.page.x - origin.x;\n this.y0 = interaction.startCoords.page.y - origin.y;\n this.clientX0 = interaction.startCoords.client.x - origin.x;\n this.clientY0 = interaction.startCoords.client.y - origin.y;\n\n signals.fire('set-delta', signalArg);\n\n this.timeStamp = coords.timeStamp;\n this.dt = interaction.pointerDelta.timeStamp;\n this.duration = this.timeStamp - this.t0;\n\n // speed and velocity in pixels per second\n this.speed = interaction.pointerDelta[deltaSource].speed;\n this.velocityX = interaction.pointerDelta[deltaSource].vx;\n this.velocityY = interaction.pointerDelta[deltaSource].vy;\n\n this.swipe = (ending || phase === 'inertiastart')? this.getSwipe() : null;\n\n signals.fire('new', signalArg);\n }\n\n getSwipe () {\n const interaction = this.interaction;\n\n if (interaction.prevEvent.speed < 600\n || this.timeStamp - interaction.prevEvent.timeStamp > 150) {\n return null;\n }\n\n let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI;\n const overlap = 22.5;\n\n if (angle < 0) {\n angle += 360;\n }\n\n const left = 135 - overlap <= angle && angle < 225 + overlap;\n const up = 225 - overlap <= angle && angle < 315 + overlap;\n\n const right = !left && (315 - overlap <= angle || angle < 45 + overlap);\n const down = !up && 45 - overlap <= angle && angle < 135 + overlap;\n\n return {\n up,\n down,\n left,\n right,\n angle,\n speed: interaction.prevEvent.speed,\n velocity: {\n x: interaction.prevEvent.velocityX,\n y: interaction.prevEvent.velocityY,\n },\n };\n }\n\n preventDefault () {}\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n}\n\nsignals.on('set-delta', function ({ iEvent, interaction, starting, deltaSource }) {\n const prevEvent = starting? iEvent : interaction.prevEvent;\n\n if (deltaSource === 'client') {\n iEvent.dx = iEvent.clientX - prevEvent.clientX;\n iEvent.dy = iEvent.clientY - prevEvent.clientY;\n }\n else {\n iEvent.dx = iEvent.pageX - prevEvent.pageX;\n iEvent.dy = iEvent.pageY - prevEvent.pageY;\n }\n});\n\nInteractEvent.signals = signals;\n\nmodule.exports = InteractEvent;\n","const is = require('./utils/is');\nconst events = require('./utils/events');\nconst extend = require('./utils/extend');\nconst actions = require('./actions/base');\nconst scope = require('./scope');\nconst Eventable = require('./Eventable');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nconst {\n getElementRect,\n nodeContains,\n trySelector,\n} = require('./utils/domUtils');\nconst { getWindow } = require('./utils/window');\nconst { indexOf, contains } = require('./utils/arr');\nconst { wheelEvent } = require('./utils/browser');\n\n// all set interactables\nscope.interactables = [];\n\n/*\\\n * Interactable\n [ property ]\n **\n * Object type returned by @interact\n\\*/\nclass Interactable {\n constructor (target, options) {\n options = options || {};\n\n this.target = target;\n this.events = new Eventable();\n this._context = options.context || scope.document;\n this._win = getWindow(trySelector(target)? this._context : target);\n this._doc = this._win.document;\n\n signals.fire('new', {\n target,\n options,\n interactable: this,\n win: this._win,\n });\n\n scope.addDocument( this._doc, this._win );\n\n scope.interactables.push(this);\n\n this.set(options);\n }\n\n setOnEvents (action, phases) {\n const onAction = 'on' + action;\n\n if (is.function(phases.onstart) ) { this.events[onAction + 'start' ] = phases.onstart ; }\n if (is.function(phases.onmove) ) { this.events[onAction + 'move' ] = phases.onmove ; }\n if (is.function(phases.onend) ) { this.events[onAction + 'end' ] = phases.onend ; }\n if (is.function(phases.oninertiastart)) { this.events[onAction + 'inertiastart' ] = phases.oninertiastart ; }\n\n return this;\n }\n\n setPerAction (action, options) {\n // for all the default per-action options\n for (const option in options) {\n // if this option exists for this action\n if (option in defaults[action]) {\n // if the option in the options arg is an object value\n if (is.object(options[option])) {\n // duplicate the object\n this.options[action][option] = extend(this.options[action][option] || {}, options[option]);\n\n if (is.object(defaults.perAction[option]) && 'enabled' in defaults.perAction[option]) {\n this.options[action][option].enabled = options[option].enabled === false? false : true;\n }\n }\n else if (is.bool(options[option]) && is.object(defaults.perAction[option])) {\n this.options[action][option].enabled = options[option];\n }\n else if (options[option] !== undefined) {\n // or if it's not undefined, do a plain assignment\n this.options[action][option] = options[option];\n }\n }\n }\n }\n\n /*\\\n * Interactable.getRect\n [ method ]\n *\n * The default function to get an Interactables bounding rect. Can be\n * overridden using @Interactable.rectChecker.\n *\n - element (Element) #optional The element to measure.\n = (object) The object's bounding rectangle.\n o {\n o top : 0,\n o left : 0,\n o bottom: 0,\n o right : 0,\n o width : 0,\n o height: 0\n o }\n \\*/\n getRect (element) {\n element = element || this.target;\n\n if (is.string(this.target) && !(is.element(element))) {\n element = this._context.querySelector(this.target);\n }\n\n return getElementRect(element);\n }\n\n /*\\\n * Interactable.rectChecker\n [ method ]\n *\n * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n - checker (function) #optional A function which returns this Interactable's bounding rectangle. See @Interactable.getRect\n = (function | object) The checker function or this Interactable\n \\*/\n rectChecker (checker) {\n if (is.function(checker)) {\n this.getRect = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.getRect;\n\n return this;\n }\n\n return this.getRect;\n }\n\n _backCompatOption (optionName, newValue) {\n if (trySelector(newValue) || is.object(newValue)) {\n this.options[optionName] = newValue;\n\n for (const action of actions.names) {\n this.options[action][optionName] = newValue;\n }\n\n return this;\n }\n\n return this.options[optionName];\n }\n\n /*\\\n * Interactable.origin\n [ method ]\n *\n * Gets or sets the origin of the Interactable's element. The x and y\n * of the origin will be subtracted from action event coordinates.\n *\n - origin (object | string) #optional An object eg. { x: 0, y: 0 } or string 'parent', 'self' or any CSS selector\n * OR\n - origin (Element) #optional An HTML or SVG Element whose rect will be used\n **\n = (object) The current origin or this Interactable\n \\*/\n origin (newValue) {\n return this._backCompatOption('origin', newValue);\n }\n\n /*\\\n * Interactable.deltaSource\n [ method ]\n *\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n - newValue (string) #optional Use 'client' if you will be scrolling while interacting; Use 'page' if you want autoScroll to work\n = (string | object) The current deltaSource or this Interactable\n \\*/\n deltaSource (newValue) {\n if (newValue === 'page' || newValue === 'client') {\n this.options.deltaSource = newValue;\n\n return this;\n }\n\n return this.options.deltaSource;\n }\n\n /*\\\n * Interactable.context\n [ method ]\n *\n * Gets the selector context Node of the Interactable. The default is `window.document`.\n *\n = (Node) The context Node of this Interactable\n **\n \\*/\n context () {\n return this._context;\n }\n\n inContext (element) {\n return (this._context === element.ownerDocument\n || nodeContains(this._context, element));\n }\n\n /*\\\n * Interactable.fire\n [ method ]\n *\n * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n - iEvent (InteractEvent) The InteractEvent object to be fired on this Interactable\n = (Interactable) this Interactable\n \\*/\n fire (iEvent) {\n this.events.fire(iEvent);\n\n return this;\n }\n\n _onOffMultiple (method, eventType, listener, options) {\n if (is.string(eventType) && eventType.search(' ') !== -1) {\n eventType = eventType.trim().split(/ +/);\n }\n\n if (is.array(eventType)) {\n for (let i = 0; i < eventType.length; i++) {\n this[method](eventType[i], listener, options);\n }\n\n return true;\n }\n\n if (is.object(eventType)) {\n for (const prop in eventType) {\n this[method](prop, eventType[prop], listener);\n }\n\n return true;\n }\n }\n\n /*\\\n * Interactable.on\n [ method ]\n *\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n - eventType (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) This Interactable\n \\*/\n on (eventType, listener, options) {\n if (this._onOffMultiple('on', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.on(eventType, listener);\n }\n // delegated event for selector\n else if (is.string(this.target)) {\n events.addDelegate(this.target, this._context, eventType, listener, options);\n }\n else {\n events.add(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.off\n [ method ]\n *\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n - eventType (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) This Interactable\n \\*/\n off (eventType, listener, options) {\n if (this._onOffMultiple('off', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n // if it is an action event type\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.off(eventType, listener);\n }\n // delegated event\n else if (is.string(this.target)) {\n events.removeDelegate(this.target, this._context, eventType, listener, options);\n }\n // remove listener from this Interatable's element\n else {\n events.remove(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.set\n [ method ]\n *\n * Reset the options of this Interactable\n - options (object) The new settings to apply\n = (object) This Interactable\n \\*/\n set (options) {\n if (!is.object(options)) {\n options = {};\n }\n\n this.options = extend({}, defaults.base);\n\n const perActions = extend({}, defaults.perAction);\n\n for (const actionName in actions.methodDict) {\n const methodName = actions.methodDict[actionName];\n\n this.options[actionName] = extend({}, defaults[actionName]);\n\n this.setPerAction(actionName, perActions);\n\n this[methodName](options[actionName]);\n }\n\n for (const setting of Interactable.settingsMethods) {\n this.options[setting] = defaults.base[setting];\n\n if (setting in options) {\n this[setting](options[setting]);\n }\n }\n\n signals.fire('set', {\n options,\n interactable: this,\n });\n\n return this;\n }\n\n /*\\\n * Interactable.unset\n [ method ]\n *\n * Remove this interactable from the list of interactables and remove\n * it's action capabilities and event listeners\n *\n = (object) @interact\n \\*/\n unset () {\n events.remove(this.target, 'all');\n\n if (is.string(this.target)) {\n // remove delegated events\n for (const type in events.delegatedEvents) {\n const delegated = events.delegatedEvents[type];\n\n if (delegated.selectors[0] === this.target\n && delegated.contexts[0] === this._context) {\n\n delegated.selectors.splice(0, 1);\n delegated.contexts .splice(0, 1);\n delegated.listeners.splice(0, 1);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegated[type] = null;\n }\n }\n\n events.remove(this._context, type, events.delegateListener);\n events.remove(this._context, type, events.delegateUseCapture, true);\n }\n }\n else {\n events.remove(this, 'all');\n }\n\n signals.fire('unset', { interactable: this });\n\n scope.interactables.splice(indexOf(scope.interactables, this), 1);\n\n // Stop related interactions when an Interactable is unset\n for (const interaction of scope.interactions || []) {\n if (interaction.target === this && interaction.interacting()) {\n interaction.stop();\n }\n }\n\n return scope.interact;\n }\n}\n\nscope.interactables.indexOfElement = function indexOfElement (target, context) {\n context = context || scope.document;\n\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n if (interactable.target === target && interactable._context === context) {\n return i;\n }\n }\n return -1;\n};\n\nscope.interactables.get = function interactableGet (element, options, dontCheckInContext) {\n const ret = this[this.indexOfElement(element, options && options.context)];\n\n return ret && (is.string(element) || dontCheckInContext || ret.inContext(element))? ret : null;\n};\n\nscope.interactables.forEachSelector = function (callback, element) {\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n // skip non CSS selector targets and out of context elements\n if (!is.string(interactable.target)\n || (element && !interactable.inContext(element))) {\n continue;\n }\n\n const ret = callback(interactable, interactable.target, interactable._context, i, this);\n\n if (ret !== undefined) {\n return ret;\n }\n }\n};\n\n// all interact.js eventTypes\nInteractable.eventTypes = scope.eventTypes = [];\n\nInteractable.signals = signals;\n\nInteractable.settingsMethods = [ 'deltaSource', 'origin', 'preventDefault', 'rectChecker' ];\n\nmodule.exports = Interactable;\n","const scope = require('./scope');\nconst utils = require('./utils');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst finder = require('./utils/interactionFinder');\nconst signals = require('./utils/Signals').new();\n\nconst listeners = {};\nconst methodNames = [\n 'pointerDown', 'pointerMove', 'pointerUp',\n 'updatePointer', 'removePointer',\n];\n\n// for ignoring browser's simulated mouse events\nlet prevTouchTime = 0;\n\n// all active and idle interactions\nscope.interactions = [];\n\nclass Interaction {\n constructor () {\n this.target = null; // current interactable being interacted with\n this.element = null; // the target element of the interactable\n\n this.prepared = { // action that's ready to be fired on next move event\n name : null,\n axis : null,\n edges: null,\n };\n\n // keep track of added pointers\n this.pointers = [];\n this.pointerIds = [];\n this.downTargets = [];\n this.downTimes = [];\n\n // Previous native pointer move event coordinates\n this.prevCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n // current native pointer move event coordinates\n this.curCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Starting InteractEvent pointer coordinates\n this.startCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Change in coordinates and time of the pointer\n this.pointerDelta = {\n page : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n client : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n timeStamp: 0,\n };\n\n this.downEvent = null; // pointerdown/mousedown/touchstart event\n this.downPointer = {};\n\n this._eventTarget = null;\n this._curEventTarget = null;\n\n this.prevEvent = null; // previous action event\n\n this.pointerIsDown = false;\n this.pointerWasMoved = false;\n this._interacting = false;\n\n this.mouse = false;\n\n signals.fire('new', this);\n\n scope.interactions.push(this);\n }\n\n pointerDown (pointer, event, eventTarget) {\n const pointerIndex = this.updatePointer(pointer, event, true);\n\n signals.fire('down', {\n pointer,\n event,\n eventTarget,\n pointerIndex,\n interaction: this,\n });\n }\n\n /*\\\n * Interaction.start\n [ method ]\n *\n * Start an action with the given Interactable and Element as tartgets. The\n * action must be enabled for the target Interactable and an appropriate number\n * of pointers must be held down - 1 for drag/resize, 2 for gesture.\n *\n * Use it with `interactable.able({ manualStart: false })` to always\n * [start actions manually](https://github.com/taye/interact.js/issues/114)\n *\n - action (object) The action to be performed - drag, resize, etc.\n - target (Interactable) The Interactable to target\n - element (Element) The DOM Element to target\n = (object) interact\n **\n | interact(target)\n | .draggable({\n | // disable the default drag start by down->move\n | manualStart: true\n | })\n | // start dragging after the user holds the pointer down\n | .on('hold', function (event) {\n | var interaction = event.interaction;\n |\n | if (!interaction.interacting()) {\n | interaction.start({ name: 'drag' },\n | event.interactable,\n | event.currentTarget);\n | }\n | });\n \\*/\n start (action, target, element) {\n if (this.interacting()\n || !this.pointerIsDown\n || this.pointerIds.length < (action.name === 'gesture'? 2 : 1)) {\n return;\n }\n\n // if this interaction had been removed after stopping\n // add it back\n if (utils.indexOf(scope.interactions, this) === -1) {\n scope.interactions.push(this);\n }\n\n utils.copyAction(this.prepared, action);\n this.target = target;\n this.element = element;\n\n signals.fire('action-start', {\n interaction: this,\n event: this.downEvent,\n });\n }\n\n pointerMove (pointer, event, eventTarget) {\n if (!this.simulation) {\n this.updatePointer(pointer);\n utils.setCoords(this.curCoords, this.pointers);\n }\n\n const duplicateMove = (this.curCoords.page.x === this.prevCoords.page.x\n && this.curCoords.page.y === this.prevCoords.page.y\n && this.curCoords.client.x === this.prevCoords.client.x\n && this.curCoords.client.y === this.prevCoords.client.y);\n\n let dx;\n let dy;\n\n // register movement greater than pointerMoveTolerance\n if (this.pointerIsDown && !this.pointerWasMoved) {\n dx = this.curCoords.client.x - this.startCoords.client.x;\n dy = this.curCoords.client.y - this.startCoords.client.y;\n\n this.pointerWasMoved = utils.hypot(dx, dy) > Interaction.pointerMoveTolerance;\n }\n\n const signalArg = {\n pointer,\n pointerIndex: this.getPointerIndex(pointer),\n event,\n eventTarget,\n dx,\n dy,\n duplicate: duplicateMove,\n interaction: this,\n interactingBeforeMove: this.interacting(),\n };\n\n if (!duplicateMove) {\n // set pointer coordinate, time changes and speeds\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n }\n\n signals.fire('move', signalArg);\n\n if (!duplicateMove) {\n // if interacting, fire an 'action-move' signal etc\n if (this.interacting()) {\n this.doMove(signalArg);\n }\n\n if (this.pointerWasMoved) {\n utils.copyCoords(this.prevCoords, this.curCoords);\n }\n }\n }\n\n /*\\\n * Interaction.doMove\n [ method ]\n *\n * Force a move of the current action at the same coordinates. Useful if\n * snap/restrict has been changed and you want a movement with the new\n * settings.\n *\n **\n | interact(target)\n | .draggable(true)\n | .on('dragmove', function (event) {\n | if (someCondition) {\n | // change the snap settings\n | event.interactable.draggable({ snap: { targets: [] }});\n | // fire another move event with re-calculated snap\n | event.interaction.doMove();\n | }\n | });\n \\*/\n doMove (signalArg) {\n signalArg = utils.extend({\n pointer: this.pointers[0],\n event: this.prevEvent,\n eventTarget: this._eventTarget,\n interaction: this,\n }, signalArg || {});\n\n signals.fire('before-action-move', signalArg);\n\n if (!this._dontFireMove) {\n signals.fire('action-move', signalArg);\n }\n\n this._dontFireMove = false;\n }\n\n // End interact move events and stop auto-scroll unless simulation is running\n pointerUp (pointer, event, eventTarget, curEventTarget) {\n const pointerIndex = this.getPointerIndex(pointer);\n\n signals.fire(/cancel$/i.test(event.type)? 'cancel' : 'up', {\n pointer,\n pointerIndex,\n event,\n eventTarget,\n curEventTarget,\n interaction: this,\n });\n\n if (!this.simulation) {\n this.end(event);\n }\n\n this.pointerIsDown = false;\n this.removePointer(pointer, event);\n }\n\n /*\\\n * Interaction.end\n [ method ]\n *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n - event (PointerEvent) #optional\n **\n | interact(target)\n | .draggable(true)\n | .on('move', function (event) {\n | if (event.pageX > 1000) {\n | // end the current action\n | event.interaction.end();\n | // stop all further listeners from being called\n | event.stopImmediatePropagation();\n | }\n | });\n \\*/\n end (event) {\n event = event || this.prevEvent;\n\n if (this.interacting()) {\n signals.fire('action-end', {\n event,\n interaction: this,\n });\n }\n\n this.stop();\n }\n\n currentAction () {\n return this._interacting? this.prepared.name: null;\n }\n\n interacting () {\n return this._interacting;\n }\n\n stop () {\n signals.fire('stop', { interaction: this });\n\n if (this._interacting) {\n signals.fire('stop-active', { interaction: this });\n signals.fire('stop-' + this.prepared.name, { interaction: this });\n }\n\n this.target = this.element = null;\n\n this._interacting = false;\n this.prepared.name = this.prevEvent = null;\n }\n\n getPointerIndex (pointer) {\n return utils.indexOf(this.pointerIds, utils.getPointerId(pointer));\n }\n\n updatePointer (pointer, event, down = event && /(down|start)$/i.test(event.type)) {\n const id = utils.getPointerId(pointer);\n let index = this.getPointerIndex(pointer);\n\n if (index === -1) {\n index = this.pointerIds.length;\n this.pointerIds[index] = id;\n }\n\n if (down) {\n signals.fire('update-pointer-down', {\n pointer,\n event,\n down,\n pointerId: id,\n pointerIndex: index,\n interaction: this,\n });\n }\n\n this.pointers[index] = pointer;\n\n return index;\n }\n\n removePointer (pointer, event) {\n const id = utils.getPointerId(pointer);\n const index = this.mouse? 0 : utils.indexOf(this.pointerIds, id);\n\n if (index === -1) { return; }\n\n signals.fire('remove-pointer', {\n pointer,\n event,\n pointerIndex: index,\n interaction: this,\n });\n\n this.pointers .splice(index, 1);\n this.pointerIds .splice(index, 1);\n this.downTargets.splice(index, 1);\n this.downTimes .splice(index, 1);\n }\n\n _updateEventTargets (target, currentTarget) {\n this._eventTarget = target;\n this._curEventTarget = currentTarget;\n }\n}\n\nfor (let i = 0, len = methodNames.length; i < len; i++) {\n const method = methodNames[i];\n\n listeners[method] = doOnInteractions(method);\n}\n\nfunction doOnInteractions (method) {\n return (function (event) {\n const [eventTarget, curEventTarget] = utils.getEventTargets(event);\n const matches = []; // [ [pointer, interaction], ...]\n\n if (browser.supportsTouch && /touch/.test(event.type)) {\n prevTouchTime = new Date().getTime();\n\n for (let i = 0; i < event.changedTouches.length; i++) {\n const pointer = event.changedTouches[i];\n const interaction = finder.search(pointer, event.type, eventTarget);\n\n matches.push([pointer, interaction || new Interaction()]);\n }\n }\n else {\n let invalidPointer = false;\n\n if (!browser.supportsPointerEvent && /mouse/.test(event.type)) {\n // ignore mouse events while touch interactions are active\n for (let i = 0; i < scope.interactions.length && !invalidPointer; i++) {\n invalidPointer = !scope.interactions[i].mouse && scope.interactions[i].pointerIsDown;\n }\n\n // try to ignore mouse events that are simulated by the browser\n // after a touch event\n invalidPointer = invalidPointer\n || (new Date().getTime() - prevTouchTime < 500)\n // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated\n || event.timeStamp === 0;\n }\n\n if (!invalidPointer) {\n let interaction = finder.search(event, event.type, eventTarget);\n\n if (!interaction) {\n\n interaction = new Interaction();\n interaction.mouse = (/mouse/i.test(event.pointerType || event.type)\n // MSPointerEvent.MSPOINTER_TYPE_MOUSE\n || event.pointerType === 4\n || !event.pointerType);\n }\n\n matches.push([event, interaction]);\n }\n }\n\n for (const [pointer, interaction] of matches) {\n interaction._updateEventTargets(eventTarget, curEventTarget);\n interaction[method](pointer, event, eventTarget, curEventTarget);\n }\n });\n}\n\nfunction endAll (event) {\n for (let i = 0; i < scope.interactions.length; i++) {\n const interaction = scope.interactions[i];\n\n interaction.end(event);\n signals.fire('endall', { event, interaction });\n }\n}\n\nconst docEvents = { /* 'eventType': listenerFunc */ };\nconst pEventTypes = browser.pEventTypes;\n\nif (scope.PointerEvent) {\n docEvents[pEventTypes.down ] = listeners.pointerDown;\n docEvents[pEventTypes.move ] = listeners.pointerMove;\n docEvents[pEventTypes.up ] = listeners.pointerUp;\n docEvents[pEventTypes.cancel] = listeners.pointerUp;\n}\nelse {\n docEvents.mousedown = listeners.pointerDown;\n docEvents.mousemove = listeners.pointerMove;\n docEvents.mouseup = listeners.pointerUp;\n\n docEvents.touchstart = listeners.pointerDown;\n docEvents.touchmove = listeners.pointerMove;\n docEvents.touchend = listeners.pointerUp;\n docEvents.touchcancel = listeners.pointerUp;\n}\n\ndocEvents.blur = endAll;\n\nfunction onDocSignal ({ doc }, signalName) {\n const eventMethod = signalName.indexOf('add') === 0\n ? events.add : events.remove;\n\n // delegate event listener\n for (const eventType in scope.delegatedEvents) {\n eventMethod(doc, eventType, events.delegateListener);\n eventMethod(doc, eventType, events.delegateUseCapture, true);\n }\n\n for (const eventType in docEvents) {\n eventMethod(doc, eventType, docEvents[eventType]);\n }\n}\n\nsignals.on('update-pointer-down', ({ interaction, pointer, pointerId, pointerIndex, event, eventTarget, down }) => {\n interaction.pointerIds[pointerIndex] = pointerId;\n interaction.pointers[pointerIndex] = pointer;\n\n if (down) {\n interaction.pointerIsDown = true;\n }\n\n if (!interaction.interacting()) {\n utils.setCoords(interaction.startCoords, interaction.pointers);\n\n utils.copyCoords(interaction.curCoords , interaction.startCoords);\n utils.copyCoords(interaction.prevCoords, interaction.startCoords);\n\n interaction.downEvent = event;\n interaction.downTimes[pointerIndex] = interaction.curCoords.timeStamp;\n interaction.downTargets[pointerIndex] = eventTarget || event && utils.getEventTargets(event)[0];\n interaction.pointerWasMoved = false;\n\n utils.pointerExtend(interaction.downPointer, pointer);\n }\n});\n\nscope.signals.on('add-document' , onDocSignal);\nscope.signals.on('remove-document', onDocSignal);\n\nInteraction.pointerMoveTolerance = 1;\nInteraction.doOnInteractions = doOnInteractions;\nInteraction.endAll = endAll;\nInteraction.signals = signals;\nInteraction.docEvents = docEvents;\n\nscope.endAllInteractions = endAll;\n\nmodule.exports = Interaction;\n","const Interaction = require('../Interaction');\nconst InteractEvent = require('../InteractEvent');\n\nconst actions = {\n firePrepared,\n names: [],\n methodDict: {},\n};\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n interaction._interacting = true;\n firePrepared(interaction, event, 'start');\n});\n\nInteraction.signals.on('action-move', function ({ interaction, event, preEnd }) {\n firePrepared(interaction, event, 'move', preEnd);\n\n // if the action was ended in a listener\n if (!interaction.interacting()) { return false; }\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n firePrepared(interaction, event, 'end');\n});\n\nfunction firePrepared (interaction, event, phase, preEnd) {\n const actionName = interaction.prepared.name;\n\n const newEvent = new InteractEvent(interaction, event, actionName, phase, interaction.element, null, preEnd);\n\n interaction.target.fire(newEvent);\n interaction.prevEvent = newEvent;\n}\n\nmodule.exports = actions;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drag = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n startAxis : 'xy',\n lockAxis : 'xy',\n },\n\n checker: function (pointer, event, interactable) {\n const dragOptions = interactable.options.drag;\n\n return dragOptions.enabled\n ? { name: 'drag', axis: (dragOptions.lockAxis === 'start'\n ? dragOptions.startAxis\n : dragOptions.lockAxis)}\n : null;\n },\n\n getCursor: function () {\n return 'move';\n },\n};\n\nInteraction.signals.on('before-action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n interaction.curCoords.page.y = interaction.startCoords.page.y;\n interaction.curCoords.client.y = interaction.startCoords.client.y;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vx);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vx);\n interaction.pointerDelta.client.vy = 0;\n interaction.pointerDelta.page.vy = 0;\n }\n else if (axis === 'y') {\n interaction.curCoords.page.x = interaction.startCoords.page.x;\n interaction.curCoords.client.x = interaction.startCoords.client.x;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vy);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vy);\n interaction.pointerDelta.client.vx = 0;\n interaction.pointerDelta.page.vx = 0;\n }\n});\n\n// dragmove\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'dragmove') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n iEvent.pageY = interaction.startCoords.page.y;\n iEvent.clientY = interaction.startCoords.client.y;\n iEvent.dy = 0;\n }\n else if (axis === 'y') {\n iEvent.pageX = interaction.startCoords.page.x;\n iEvent.clientX = interaction.startCoords.client.x;\n iEvent.dx = 0;\n }\n});\n\n/*\\\n * Interactable.draggable\n [ method ]\n *\n * Gets or sets whether drag actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of drag events\n | var isDraggable = interact('ul li').draggable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on drag events (object makes the Interactable draggable)\n = (object) This Interactable\n | interact(element).draggable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // the axis in which the first movement must be\n | // for the drag sequence to start\n | // 'xy' by default - any direction\n | startAxis: 'x' || 'y' || 'xy',\n |\n | // 'xy' by default - don't restrict to one axis (move in any direction)\n | // 'x' or 'y' to restrict movement to either axis\n | // 'start' to restrict movement to the axis the drag started in\n | lockAxis: 'x' || 'y' || 'xy' || 'start',\n |\n | // max number of drags that can happen concurrently\n | // with elements of this Interactable. Infinity by default\n | max: Infinity,\n |\n | // max number of drags that can target the same element+Interactable\n | // 1 by default\n | maxPerElement: 2\n | });\n\\*/\nInteractable.prototype.draggable = function (options) {\n if (utils.is.object(options)) {\n this.options.drag.enabled = options.enabled === false? false: true;\n this.setPerAction('drag', options);\n this.setOnEvents('drag', options);\n\n if (/^(xy|x|y|start)$/.test(options.lockAxis)) {\n this.options.drag.lockAxis = options.lockAxis;\n }\n if (/^(xy|x|y)$/.test(options.startAxis)) {\n this.options.drag.startAxis = options.startAxis;\n }\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drag.enabled = options;\n\n if (!options) {\n this.ondragstart = this.ondragstart = this.ondragend = null;\n }\n\n return this;\n }\n\n return this.options.drag;\n};\n\nactions.drag = drag;\nactions.names.push('drag');\nutils.merge(Interactable.eventTypes, [\n 'dragstart',\n 'dragmove',\n 'draginertiastart',\n 'draginertiaresume',\n 'dragend',\n]);\nactions.methodDict.drag = 'draggable';\n\ndefaultOptions.drag = drag.defaults;\n\nmodule.exports = drag;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst scope = require('../scope');\nconst interact = require('../interact');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drop = {\n defaults: {\n enabled: false,\n accept : null,\n overlap: 'pointer',\n },\n};\n\nlet dynamicDrop = false;\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // reset active dropzones\n interaction.activeDrops.dropzones = [];\n interaction.activeDrops.elements = [];\n interaction.activeDrops.rects = [];\n\n interaction.dropEvents = null;\n\n if (!interaction.dynamicDrop) {\n setActiveDrops(interaction, interaction.element);\n }\n\n const dragEvent = interaction.prevEvent;\n const dropEvents = getDropEvents(interaction, event, dragEvent);\n\n if (dropEvents.activate) {\n fireActiveDrops(interaction, dropEvents.activate);\n }\n});\n\nInteractEvent.signals.on('new', function ({ interaction, iEvent, event }) {\n if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { return; }\n\n const draggableElement = interaction.element;\n const dragEvent = iEvent;\n const dropResult = getDrop(dragEvent, event, draggableElement);\n\n interaction.dropTarget = dropResult.dropzone;\n interaction.dropElement = dropResult.element;\n\n interaction.dropEvents = getDropEvents(interaction, event, dragEvent);\n});\n\nInteraction.signals.on('action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n fireDropEvents(interaction, interaction.dropEvents);\n});\n\nInteraction.signals.on('action-end', function ({ interaction }) {\n if (interaction.prepared.name === 'drag') {\n fireDropEvents(interaction, interaction.dropEvents);\n }\n});\n\nInteraction.signals.on('stop-drag', function ({ interaction }) {\n interaction.activeDrops.dropzones =\n interaction.activeDrops.elements =\n interaction.activeDrops.rects =\n interaction.dropEvents = null;\n});\n\nfunction collectDrops (interaction, element) {\n const drops = [];\n const elements = [];\n\n element = element || interaction.element;\n\n // collect all dropzones and their elements which qualify for a drop\n for (const current of scope.interactables) {\n if (!current.options.drop.enabled) { continue; }\n\n const accept = current.options.drop.accept;\n\n // test the draggable element against the dropzone's accept setting\n if ((utils.is.element(accept) && accept !== element)\n || (utils.is.string(accept)\n && !utils.matchesSelector(element, accept))) {\n\n continue;\n }\n\n // query for new elements if necessary\n const dropElements = utils.is.string(current.target)\n ? current._context.querySelectorAll(current.target)\n : [current.target];\n\n for (let i = 0; i < dropElements.length; i++) {\n const currentElement = dropElements[i];\n\n if (currentElement !== element) {\n drops.push(current);\n elements.push(currentElement);\n }\n }\n }\n\n return {\n elements,\n dropzones: drops,\n };\n}\n\nfunction fireActiveDrops (interaction, event) {\n let prevElement;\n\n // loop through all active dropzones and trigger event\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n const current = interaction.activeDrops.dropzones[i];\n const currentElement = interaction.activeDrops.elements [i];\n\n // prevent trigger of duplicate events on same element\n if (currentElement !== prevElement) {\n // set current element as event target\n event.target = currentElement;\n current.fire(event);\n }\n prevElement = currentElement;\n }\n}\n\n// Collect a new set of possible drops and save them in activeDrops.\n// setActiveDrops should always be called when a drag has just started or a\n// drag event happens while dynamicDrop is true\nfunction setActiveDrops (interaction, dragElement) {\n // get dropzones and their elements that could receive the draggable\n const possibleDrops = collectDrops(interaction, dragElement, true);\n\n interaction.activeDrops.dropzones = possibleDrops.dropzones;\n interaction.activeDrops.elements = possibleDrops.elements;\n interaction.activeDrops.rects = [];\n\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n interaction.activeDrops.rects[i] =\n interaction.activeDrops.dropzones[i].getRect(interaction.activeDrops.elements[i]);\n }\n}\n\nfunction getDrop (dragEvent, event, dragElement) {\n const interaction = dragEvent.interaction;\n const validDrops = [];\n\n if (dynamicDrop) {\n setActiveDrops(interaction, dragElement);\n }\n\n // collect all dropzones and their elements which qualify for a drop\n for (let j = 0; j < interaction.activeDrops.dropzones.length; j++) {\n const current = interaction.activeDrops.dropzones[j];\n const currentElement = interaction.activeDrops.elements [j];\n const rect = interaction.activeDrops.rects [j];\n\n validDrops.push(current.dropCheck(dragEvent, event, interaction.target, dragElement, currentElement, rect)\n ? currentElement\n : null);\n }\n\n // get the most appropriate dropzone based on DOM depth and order\n const dropIndex = utils.indexOfDeepestElement(validDrops);\n\n return {\n dropzone: interaction.activeDrops.dropzones[dropIndex] || null,\n element : interaction.activeDrops.elements [dropIndex] || null,\n };\n}\n\nfunction getDropEvents (interaction, pointerEvent, dragEvent) {\n const dropEvents = {\n enter : null,\n leave : null,\n activate : null,\n deactivate: null,\n move : null,\n drop : null,\n };\n\n const tmpl = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n };\n\n if (interaction.dropElement !== interaction.prevDropElement) {\n // if there was a prevDropTarget, create a dragleave event\n if (interaction.prevDropTarget) {\n dropEvents.leave = utils.extend({ type: 'dragleave' }, tmpl);\n\n dragEvent.dragLeave = dropEvents.leave.target = interaction.prevDropElement;\n dragEvent.prevDropzone = dropEvents.leave.dropzone = interaction.prevDropTarget;\n }\n // if the dropTarget is not null, create a dragenter event\n if (interaction.dropTarget) {\n dropEvents.enter = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n type : 'dragenter',\n };\n\n dragEvent.dragEnter = interaction.dropElement;\n dragEvent.dropzone = interaction.dropTarget;\n }\n }\n\n if (dragEvent.type === 'dragend' && interaction.dropTarget) {\n dropEvents.drop = utils.extend({ type: 'drop' }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n dragEvent.relatedTarget = interaction.dropElement;\n }\n if (dragEvent.type === 'dragstart') {\n dropEvents.activate = utils.extend({ type: 'dropactivate' }, tmpl);\n\n dropEvents.activate.target = null;\n dropEvents.activate.dropzone = null;\n }\n if (dragEvent.type === 'dragend') {\n dropEvents.deactivate = utils.extend({ type: 'dropdeactivate' }, tmpl);\n\n dropEvents.deactivate.target = null;\n dropEvents.deactivate.dropzone = null;\n }\n if (dragEvent.type === 'dragmove' && interaction.dropTarget) {\n dropEvents.move = utils.extend({\n dragmove : dragEvent,\n type : 'dropmove',\n }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n }\n\n return dropEvents;\n}\n\nfunction fireDropEvents (interaction, dropEvents) {\n if (dropEvents.leave) { interaction.prevDropTarget.fire(dropEvents.leave); }\n if (dropEvents.move ) { interaction.dropTarget.fire(dropEvents.move ); }\n if (dropEvents.enter) { interaction.dropTarget.fire(dropEvents.enter); }\n if (dropEvents.drop ) { interaction.dropTarget.fire(dropEvents.drop ); }\n if (dropEvents.deactivate) {\n fireActiveDrops(interaction, dropEvents.deactivate);\n }\n\n interaction.prevDropTarget = interaction.dropTarget;\n interaction.prevDropElement = interaction.dropElement;\n}\n\n/*\\\n * Interactable.dropzone\n [ method ]\n *\n * Returns or sets whether elements can be dropped onto this\n * Interactable to trigger drop events\n *\n * Dropzones can receive the following events:\n * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends\n * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone\n * - `dragmove` when a draggable that has entered the dropzone is moved\n * - `drop` when a draggable is dropped into this dropzone\n *\n * Use the `accept` option to allow only elements that match the given CSS\n * selector or element. The value can be:\n *\n * - **an Element** - only that element can be dropped into this dropzone.\n * - **a string**, - the element being dragged must match it as a CSS selector.\n * - **`null`** - accept options is cleared - it accepts any element.\n *\n * Use the `overlap` option to set how drops are checked for. The allowed\n * values are:\n *\n * - `'pointer'`, the pointer must be over the dropzone (default)\n * - `'center'`, the draggable element's center must be over the dropzone\n * - a number from 0-1 which is the `(intersection area) / (draggable area)`.\n * e.g. `0.5` for drop to happen when half of the area of the draggable is\n * over the dropzone\n *\n * Use the `checker` option to specify a function to check if a dragged\n * element is over this Interactable.\n *\n | interact(target)\n | .dropChecker(function(dragEvent, // related dragmove or dragend event\n | event, // TouchEvent/PointerEvent/MouseEvent\n | dropped, // bool result of the default checker\n | dropzone, // dropzone Interactable\n | dropElement, // dropzone elemnt\n | draggable, // draggable Interactable\n | draggableElement) {// draggable element\n |\n | return dropped && event.target.hasAttribute('allow-drop');\n | }\n *\n *\n - options (boolean | object | null) #optional The new value to be set.\n | interact('.drop').dropzone({\n | accept: '.can-drop' || document.getElementById('single-drop'),\n | overlap: 'pointer' || 'center' || zeroToOne\n | }\n = (boolean | object) The current setting or this Interactable\n\\*/\nInteractable.prototype.dropzone = function (options) {\n if (utils.is.object(options)) {\n this.options.drop.enabled = options.enabled === false? false: true;\n\n if (utils.is.function(options.ondrop) ) { this.events.ondrop = options.ondrop ; }\n if (utils.is.function(options.ondropactivate) ) { this.events.ondropactivate = options.ondropactivate ; }\n if (utils.is.function(options.ondropdeactivate)) { this.events.ondropdeactivate = options.ondropdeactivate; }\n if (utils.is.function(options.ondragenter) ) { this.events.ondragenter = options.ondragenter ; }\n if (utils.is.function(options.ondragleave) ) { this.events.ondragleave = options.ondragleave ; }\n if (utils.is.function(options.ondropmove) ) { this.events.ondropmove = options.ondropmove ; }\n\n if (/^(pointer|center)$/.test(options.overlap)) {\n this.options.drop.overlap = options.overlap;\n }\n else if (utils.is.number(options.overlap)) {\n this.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0);\n }\n if ('accept' in options) {\n this.options.drop.accept = options.accept;\n }\n if ('checker' in options) {\n this.options.drop.checker = options.checker;\n }\n\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drop.enabled = options;\n\n if (!options) {\n this.ondragenter = this.ondragleave = this.ondrop\n = this.ondropactivate = this.ondropdeactivate = null;\n }\n\n return this;\n }\n\n return this.options.drop;\n};\n\nInteractable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) {\n let dropped = false;\n\n // if the dropzone has no rect (eg. display: none)\n // call the custom dropChecker or just return false\n if (!(rect = rect || this.getRect(dropElement))) {\n return (this.options.drop.checker\n ? this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement)\n : false);\n }\n\n const dropOverlap = this.options.drop.overlap;\n\n if (dropOverlap === 'pointer') {\n const origin = utils.getOriginXY(draggable, draggableElement, 'drag');\n const page = utils.getPageXY(dragEvent);\n\n page.x += origin.x;\n page.y += origin.y;\n\n const horizontal = (page.x > rect.left) && (page.x < rect.right);\n const vertical = (page.y > rect.top ) && (page.y < rect.bottom);\n\n dropped = horizontal && vertical;\n }\n\n const dragRect = draggable.getRect(draggableElement);\n\n if (dragRect && dropOverlap === 'center') {\n const cx = dragRect.left + dragRect.width / 2;\n const cy = dragRect.top + dragRect.height / 2;\n\n dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom;\n }\n\n if (dragRect && utils.is.number(dropOverlap)) {\n const overlapArea = (Math.max(0, Math.min(rect.right , dragRect.right ) - Math.max(rect.left, dragRect.left))\n * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top , dragRect.top )));\n\n const overlapRatio = overlapArea / (dragRect.width * dragRect.height);\n\n dropped = overlapRatio >= dropOverlap;\n }\n\n if (this.options.drop.checker) {\n dropped = this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement);\n }\n\n return dropped;\n};\n\nInteractable.signals.on('unset', function ({ interactable }) {\n interactable.dropzone(false);\n});\n\nInteractable.settingsMethods.push('dropChecker');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.dropTarget = null; // the dropzone a drag target might be dropped into\n interaction.dropElement = null; // the element at the time of checking\n interaction.prevDropTarget = null; // the dropzone that was recently dragged away from\n interaction.prevDropElement = null; // the element at the time of checking\n interaction.dropEvents = null; // the dropEvents related to the current drag event\n\n interaction.activeDrops = {\n dropzones: [], // the dropzones that are mentioned below\n elements : [], // elements of dropzones that accept the target draggable\n rects : [], // the rects of the elements mentioned above\n };\n\n});\n\nInteraction.signals.on('stop', function ({ interaction }) {\n interaction.dropTarget = interaction.dropElement =\n interaction.prevDropTarget = interaction.prevDropElement = null;\n});\n\n/*\\\n * interact.dynamicDrop\n [ method ]\n *\n * Returns or sets whether the dimensions of dropzone elements are\n * calculated on every dragmove or only on dragstart for the default\n * dropChecker\n *\n - newValue (boolean) #optional True to check on each move. False to check only before start\n = (boolean | interact) The current setting or interact\n\\*/\ninteract.dynamicDrop = function (newValue) {\n if (utils.is.bool(newValue)) {\n //if (dragging && dynamicDrop !== newValue && !newValue) {\n //calcRects(dropzones);\n //}\n\n dynamicDrop = newValue;\n\n return interact;\n }\n return dynamicDrop;\n};\n\nutils.merge(Interactable.eventTypes, [\n 'dragenter',\n 'dragleave',\n 'dropactivate',\n 'dropdeactivate',\n 'dropmove',\n 'drop',\n]);\nactions.methodDict.drop = 'dropzone';\n\ndefaultOptions.drop = drop.defaults;\n\nmodule.exports = drop;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst gesture = {\n defaults: {\n enabled : false,\n origin : null,\n restrict: null,\n },\n\n checker: function (pointer, event, interactable, element, interaction) {\n if (interaction.pointerIds.length >= 2) {\n return { name: 'gesture' };\n }\n\n return null;\n },\n\n getCursor: function () {\n return '';\n },\n};\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturestart') { return; }\n iEvent.ds = 0;\n\n interaction.gesture.startDistance = interaction.gesture.prevDistance = iEvent.distance;\n interaction.gesture.startAngle = interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.scale = 1;\n});\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturemove') { return; }\n\n iEvent.ds = iEvent.scale - interaction.gesture.scale;\n\n interaction.target.fire(iEvent);\n\n interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.prevDistance = iEvent.distance;\n\n if (iEvent.scale !== Infinity\n && iEvent.scale !== null\n && iEvent.scale !== undefined\n && !isNaN(iEvent.scale)) {\n\n interaction.gesture.scale = iEvent.scale;\n }\n});\n\n/*\\\n * Interactable.gesturable\n [ method ]\n *\n * Gets or sets whether multitouch gestures can be performed on the\n * Interactable's element\n *\n = (boolean) Indicates if this can be the target of gesture events\n | var isGestureable = interact(element).gesturable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on gesture events (makes the Interactable gesturable)\n = (object) this Interactable\n | interact(element).gesturable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // limit multiple gestures.\n | // See the explanation in @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n\\*/\nInteractable.prototype.gesturable = function (options) {\n if (utils.is.object(options)) {\n this.options.gesture.enabled = options.enabled === false? false: true;\n this.setPerAction('gesture', options);\n this.setOnEvents('gesture', options);\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.gesture.enabled = options;\n\n if (!options) {\n this.ongesturestart = this.ongesturestart = this.ongestureend = null;\n }\n\n return this;\n }\n\n return this.options.gesture;\n};\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action, event, starting, ending, deltaSource }) {\n if (action !== 'gesture') { return; }\n\n const pointers = interaction.pointers;\n\n iEvent.touches = [pointers[0], pointers[1]];\n\n if (starting) {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = 1;\n iEvent.ds = 0;\n iEvent.angle = utils.touchAngle(pointers, undefined, deltaSource);\n iEvent.da = 0;\n }\n else if (ending || event instanceof InteractEvent) {\n iEvent.distance = interaction.prevEvent.distance;\n iEvent.box = interaction.prevEvent.box;\n iEvent.scale = interaction.prevEvent.scale;\n iEvent.ds = iEvent.scale - 1;\n iEvent.angle = interaction.prevEvent.angle;\n iEvent.da = iEvent.angle - interaction.gesture.startAngle;\n }\n else {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = iEvent.distance / interaction.gesture.startDistance;\n iEvent.angle = utils.touchAngle(pointers, interaction.gesture.prevAngle, deltaSource);\n\n iEvent.ds = iEvent.scale - interaction.gesture.prevScale;\n iEvent.da = iEvent.angle - interaction.gesture.prevAngle;\n }\n});\n\nInteraction.signals.on('new', function (interaction) {\n interaction.gesture = {\n start: { x: 0, y: 0 },\n\n startDistance: 0, // distance between two touches of touchStart\n prevDistance : 0,\n distance : 0,\n\n scale: 1, // gesture.distance / gesture.startDistance\n\n startAngle: 0, // angle of line joining two touches\n prevAngle : 0, // angle of the previous gesture event\n };\n});\n\nactions.gesture = gesture;\nactions.names.push('gesture');\nutils.merge(Interactable.eventTypes, [\n 'gesturestart',\n 'gesturemove',\n 'gestureend',\n]);\nactions.methodDict.gesture = 'gesturable';\n\ndefaultOptions.gesture = gesture.defaults;\n\nmodule.exports = gesture;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\n// Less Precision with touch input\nconst defaultMargin = browser.supportsTouch || browser.supportsPointerEvent? 20: 10;\n\nconst resize = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n square: false,\n preserveAspectRatio: false,\n axis: 'xy',\n\n // use default margin\n margin: NaN,\n\n // object with props left, right, top, bottom which are\n // true/false values to resize when the pointer is over that edge,\n // CSS selectors to match the handles for each direction\n // or the Elements for each handle\n edges: null,\n\n // a value of 'none' will limit the resize rect to a minimum of 0x0\n // 'negate' will alow the rect to have negative width/height\n // 'reposition' will keep the width/height positive by swapping\n // the top and bottom edges and/or swapping the left and right edges\n invert: 'none',\n },\n\n checker: function (pointer, event, interactable, element, interaction, rect) {\n if (!rect) { return null; }\n\n const page = utils.extend({}, interaction.curCoords.page);\n const options = interactable.options;\n\n if (options.resize.enabled) {\n const resizeOptions = options.resize;\n const resizeEdges = { left: false, right: false, top: false, bottom: false };\n\n // if using resize.edges\n if (utils.is.object(resizeOptions.edges)) {\n for (const edge in resizeEdges) {\n resizeEdges[edge] = checkResizeEdge(edge,\n resizeOptions.edges[edge],\n page,\n interaction._eventTarget,\n element,\n rect,\n resizeOptions.margin || defaultMargin);\n }\n\n resizeEdges.left = resizeEdges.left && !resizeEdges.right;\n resizeEdges.top = resizeEdges.top && !resizeEdges.bottom;\n\n if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) {\n return {\n name: 'resize',\n edges: resizeEdges,\n };\n }\n }\n else {\n const right = options.resize.axis !== 'y' && page.x > (rect.right - defaultMargin);\n const bottom = options.resize.axis !== 'x' && page.y > (rect.bottom - defaultMargin);\n\n if (right || bottom) {\n return {\n name: 'resize',\n axes: (right? 'x' : '') + (bottom? 'y' : ''),\n };\n }\n }\n }\n\n return null;\n },\n\n cursors: (browser.isIe9OrOlder ? {\n x : 'e-resize',\n y : 's-resize',\n xy: 'se-resize',\n\n top : 'n-resize',\n left : 'w-resize',\n bottom : 's-resize',\n right : 'e-resize',\n topleft : 'se-resize',\n bottomright: 'se-resize',\n topright : 'ne-resize',\n bottomleft : 'ne-resize',\n } : {\n x : 'ew-resize',\n y : 'ns-resize',\n xy: 'nwse-resize',\n\n top : 'ns-resize',\n left : 'ew-resize',\n bottom : 'ns-resize',\n right : 'ew-resize',\n topleft : 'nwse-resize',\n bottomright: 'nwse-resize',\n topright : 'nesw-resize',\n bottomleft : 'nesw-resize',\n }),\n\n getCursor: function (action) {\n if (action.axis) {\n return resize.cursors[action.name + action.axis];\n }\n else if (action.edges) {\n let cursorKey = '';\n const edgeNames = ['top', 'bottom', 'left', 'right'];\n\n for (let i = 0; i < 4; i++) {\n if (action.edges[edgeNames[i]]) {\n cursorKey += edgeNames[i];\n }\n }\n\n return resize.cursors[cursorKey];\n }\n },\n};\n\n// resizestart\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'resizestart' || !interaction.prepared.edges) {\n return;\n }\n\n const startRect = interaction.target.getRect(interaction.element);\n const resizeOptions = interaction.target.options.resize;\n\n /*\n * When using the `resizable.square` or `resizable.preserveAspectRatio` options, resizing from one edge\n * will affect another. E.g. with `resizable.square`, resizing to make the right edge larger will make\n * the bottom edge larger by the same amount. We call these 'linked' edges. Any linked edges will depend\n * on the active edges and the edge being interacted with.\n */\n if (resizeOptions.square || resizeOptions.preserveAspectRatio) {\n const linkedEdges = utils.extend({}, interaction.prepared.edges);\n\n linkedEdges.top = linkedEdges.top || (linkedEdges.left && !linkedEdges.bottom);\n linkedEdges.left = linkedEdges.left || (linkedEdges.top && !linkedEdges.right );\n linkedEdges.bottom = linkedEdges.bottom || (linkedEdges.right && !linkedEdges.top );\n linkedEdges.right = linkedEdges.right || (linkedEdges.bottom && !linkedEdges.left );\n\n interaction.prepared._linkedEdges = linkedEdges;\n }\n else {\n interaction.prepared._linkedEdges = null;\n }\n\n // if using `resizable.preserveAspectRatio` option, record aspect ratio at the start of the resize\n if (resizeOptions.preserveAspectRatio) {\n interaction.resizeStartAspectRatio = startRect.width / startRect.height;\n }\n\n interaction.resizeRects = {\n start : startRect,\n current : utils.extend({}, startRect),\n inverted : utils.extend({}, startRect),\n previous : utils.extend({}, startRect),\n delta : {\n left: 0, right : 0, width : 0,\n top : 0, bottom: 0, height: 0,\n },\n };\n\n iEvent.rect = interaction.resizeRects.inverted;\n iEvent.deltaRect = interaction.resizeRects.delta;\n});\n\n// resizemove\nInteractEvent.signals.on('new', function ({ iEvent, phase, interaction }) {\n if (phase !== 'move' || !interaction.prepared.edges) { return; }\n\n const resizeOptions = interaction.target.options.resize;\n const invert = resizeOptions.invert;\n const invertible = invert === 'reposition' || invert === 'negate';\n\n let edges = interaction.prepared.edges;\n\n const start = interaction.resizeRects.start;\n const current = interaction.resizeRects.current;\n const inverted = interaction.resizeRects.inverted;\n const delta = interaction.resizeRects.delta;\n const previous = utils.extend(interaction.resizeRects.previous, inverted);\n const originalEdges = edges;\n\n let dx = iEvent.dx;\n let dy = iEvent.dy;\n\n if (resizeOptions.preserveAspectRatio || resizeOptions.square) {\n // `resize.preserveAspectRatio` takes precedence over `resize.square`\n const startAspectRatio = resizeOptions.preserveAspectRatio\n ? interaction.resizeStartAspectRatio\n : 1;\n\n edges = interaction.prepared._linkedEdges;\n\n if ((originalEdges.left && originalEdges.bottom)\n || (originalEdges.right && originalEdges.top)) {\n dy = -dx / startAspectRatio;\n }\n else if (originalEdges.left || originalEdges.right ) { dy = dx / startAspectRatio; }\n else if (originalEdges.top || originalEdges.bottom) { dx = dy * startAspectRatio; }\n }\n\n // update the 'current' rect without modifications\n if (edges.top ) { current.top += dy; }\n if (edges.bottom) { current.bottom += dy; }\n if (edges.left ) { current.left += dx; }\n if (edges.right ) { current.right += dx; }\n\n if (invertible) {\n // if invertible, copy the current rect\n utils.extend(inverted, current);\n\n if (invert === 'reposition') {\n // swap edge values if necessary to keep width/height positive\n let swap;\n\n if (inverted.top > inverted.bottom) {\n swap = inverted.top;\n\n inverted.top = inverted.bottom;\n inverted.bottom = swap;\n }\n if (inverted.left > inverted.right) {\n swap = inverted.left;\n\n inverted.left = inverted.right;\n inverted.right = swap;\n }\n }\n }\n else {\n // if not invertible, restrict to minimum of 0x0 rect\n inverted.top = Math.min(current.top, start.bottom);\n inverted.bottom = Math.max(current.bottom, start.top);\n inverted.left = Math.min(current.left, start.right);\n inverted.right = Math.max(current.right, start.left);\n }\n\n inverted.width = inverted.right - inverted.left;\n inverted.height = inverted.bottom - inverted.top ;\n\n for (const edge in inverted) {\n delta[edge] = inverted[edge] - previous[edge];\n }\n\n iEvent.edges = interaction.prepared.edges;\n iEvent.rect = inverted;\n iEvent.deltaRect = delta;\n});\n\n/*\\\n * Interactable.resizable\n [ method ]\n *\n * Gets or sets whether resize actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of resize elements\n | var isResizeable = interact('input[type=text]').resizable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on resize events (object makes the Interactable resizable)\n = (object) This Interactable\n | interact(element).resizable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | edges: {\n | top : true, // Use pointer coords to check for resize.\n | left : false, // Disable resizing from left edge.\n | bottom: '.resize-s',// Resize if pointer target matches selector\n | right : handleEl // Resize if pointer target is the given Element\n | },\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height are adjusted at a 1:1 ratio.\n | square: false,\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height maintain the aspect ratio they had when resizing started.\n | preserveAspectRatio: false,\n |\n | // a value of 'none' will limit the resize rect to a minimum of 0x0\n | // 'negate' will allow the rect to have negative width/height\n | // 'reposition' will keep the width/height positive by swapping\n | // the top and bottom edges and/or swapping the left and right edges\n | invert: 'none' || 'negate' || 'reposition'\n |\n | // limit multiple resizes.\n | // See the explanation in the @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n \\*/\nInteractable.prototype.resizable = function (options) {\n if (utils.is.object(options)) {\n this.options.resize.enabled = options.enabled === false? false: true;\n this.setPerAction('resize', options);\n this.setOnEvents('resize', options);\n\n if (/^x$|^y$|^xy$/.test(options.axis)) {\n this.options.resize.axis = options.axis;\n }\n else if (options.axis === null) {\n this.options.resize.axis = defaultOptions.resize.axis;\n }\n\n if (utils.is.bool(options.preserveAspectRatio)) {\n this.options.resize.preserveAspectRatio = options.preserveAspectRatio;\n }\n else if (utils.is.bool(options.square)) {\n this.options.resize.square = options.square;\n }\n\n return this;\n }\n if (utils.is.bool(options)) {\n this.options.resize.enabled = options;\n\n if (!options) {\n this.onresizestart = this.onresizestart = this.onresizeend = null;\n }\n\n return this;\n }\n return this.options.resize;\n};\n\nfunction checkResizeEdge (name, value, page, element, interactableElement, rect, margin) {\n // false, '', undefined, null\n if (!value) { return false; }\n\n // true value, use pointer coords and element rect\n if (value === true) {\n // if dimensions are negative, \"switch\" edges\n const width = utils.is.number(rect.width )? rect.width : rect.right - rect.left;\n const height = utils.is.number(rect.height)? rect.height : rect.bottom - rect.top ;\n\n if (width < 0) {\n if (name === 'left' ) { name = 'right'; }\n else if (name === 'right') { name = 'left' ; }\n }\n if (height < 0) {\n if (name === 'top' ) { name = 'bottom'; }\n else if (name === 'bottom') { name = 'top' ; }\n }\n\n if (name === 'left' ) { return page.x < ((width >= 0? rect.left: rect.right ) + margin); }\n if (name === 'top' ) { return page.y < ((height >= 0? rect.top : rect.bottom) + margin); }\n\n if (name === 'right' ) { return page.x > ((width >= 0? rect.right : rect.left) - margin); }\n if (name === 'bottom') { return page.y > ((height >= 0? rect.bottom: rect.top ) - margin); }\n }\n\n // the remaining checks require an element\n if (!utils.is.element(element)) { return false; }\n\n return utils.is.element(value)\n // the value is an element to use as a resize handle\n ? value === element\n // otherwise check if element matches value as selector\n : utils.matchesUpTo(element, value, interactableElement);\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.resizeAxes = 'xy';\n});\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action }) {\n if (action !== 'resize' || !interaction.resizeAxes) { return; }\n\n const options = interaction.target.options;\n\n if (options.resize.square) {\n if (interaction.resizeAxes === 'y') {\n iEvent.dx = iEvent.dy;\n }\n else {\n iEvent.dy = iEvent.dx;\n }\n iEvent.axes = 'xy';\n }\n else {\n iEvent.axes = interaction.resizeAxes;\n\n if (interaction.resizeAxes === 'x') {\n iEvent.dy = 0;\n }\n else if (interaction.resizeAxes === 'y') {\n iEvent.dx = 0;\n }\n }\n});\n\nactions.resize = resize;\nactions.names.push('resize');\nutils.merge(Interactable.eventTypes, [\n 'resizestart',\n 'resizemove',\n 'resizeinertiastart',\n 'resizeinertiaresume',\n 'resizeend',\n]);\nactions.methodDict.resize = 'resizable';\n\ndefaultOptions.resize = resize.defaults;\n\nmodule.exports = resize;\n","const raf = require('./utils/raf');\nconst getWindow = require('./utils/window').getWindow;\nconst is = require('./utils/is');\nconst domUtils = require('./utils/domUtils');\nconst Interaction = require('./Interaction');\nconst defaultOptions = require('./defaultOptions');\n\nconst autoScroll = {\n defaults: {\n enabled : false,\n container: null, // the item that is scrolled (Window or HTMLElement)\n margin : 60,\n speed : 300, // the scroll speed in pixels per second\n },\n\n interaction: null,\n i: null, // the handle returned by window.setInterval\n x: 0, y: 0, // Direction each pulse is to scroll in\n\n isScrolling: false,\n prevTime: 0,\n\n start: function (interaction) {\n autoScroll.isScrolling = true;\n raf.cancel(autoScroll.i);\n\n autoScroll.interaction = interaction;\n autoScroll.prevTime = new Date().getTime();\n autoScroll.i = raf.request(autoScroll.scroll);\n },\n\n stop: function () {\n autoScroll.isScrolling = false;\n raf.cancel(autoScroll.i);\n },\n\n // scroll the window by the values in scroll.x/y\n scroll: function () {\n const options = autoScroll.interaction.target.options[autoScroll.interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(autoScroll.interaction.element);\n const now = new Date().getTime();\n // change in time in seconds\n const dt = (now - autoScroll.prevTime) / 1000;\n // displacement\n const s = options.speed * dt;\n\n if (s >= 1) {\n if (is.window(container)) {\n container.scrollBy(autoScroll.x * s, autoScroll.y * s);\n }\n else if (container) {\n container.scrollLeft += autoScroll.x * s;\n container.scrollTop += autoScroll.y * s;\n }\n\n autoScroll.prevTime = now;\n }\n\n if (autoScroll.isScrolling) {\n raf.cancel(autoScroll.i);\n autoScroll.i = raf.request(autoScroll.scroll);\n }\n },\n check: function (interactable, actionName) {\n const options = interactable.options;\n\n return options[actionName].autoScroll && options[actionName].autoScroll.enabled;\n },\n onInteractionMove: function ({ interaction, pointer }) {\n if (!(interaction.interacting()\n && autoScroll.check(interaction.target, interaction.prepared.name))) {\n return;\n }\n\n if (interaction.simulation) {\n autoScroll.x = autoScroll.y = 0;\n return;\n }\n\n let top;\n let right;\n let bottom;\n let left;\n\n const options = interaction.target.options[interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(interaction.element);\n\n if (is.window(container)) {\n left = pointer.clientX < autoScroll.margin;\n top = pointer.clientY < autoScroll.margin;\n right = pointer.clientX > container.innerWidth - autoScroll.margin;\n bottom = pointer.clientY > container.innerHeight - autoScroll.margin;\n }\n else {\n const rect = domUtils.getElementClientRect(container);\n\n left = pointer.clientX < rect.left + autoScroll.margin;\n top = pointer.clientY < rect.top + autoScroll.margin;\n right = pointer.clientX > rect.right - autoScroll.margin;\n bottom = pointer.clientY > rect.bottom - autoScroll.margin;\n }\n\n autoScroll.x = (right ? 1: left? -1: 0);\n autoScroll.y = (bottom? 1: top? -1: 0);\n\n if (!autoScroll.isScrolling) {\n // set the autoScroll properties to those of the target\n autoScroll.margin = options.margin;\n autoScroll.speed = options.speed;\n\n autoScroll.start(interaction);\n }\n },\n};\n\nInteraction.signals.on('stop-active', function () {\n autoScroll.stop();\n});\n\nInteraction.signals.on('action-move', autoScroll.onInteractionMove);\n\ndefaultOptions.perAction.autoScroll = autoScroll.defaults;\n\nmodule.exports = autoScroll;\n","const Interactable = require('../Interactable');\nconst actions = require('../actions/base');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.ignoreFrom\n [ method ]\n *\n * If the target of the `mousedown`, `pointerdown` or `touchstart`\n * event or any of it's parents match the given CSS selector or\n * Element, no drag/resize/gesture is started.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to not ignore any elements\n = (string | Element | object) The current ignoreFrom value or this Interactable\n **\n | interact(element, { ignoreFrom: document.getElementById('no-action') });\n | // or\n | interact(element).ignoreFrom('input, textarea, a');\n\\*/\nInteractable.prototype.ignoreFrom = function (newValue) {\n return this._backCompatOption('ignoreFrom', newValue);\n};\n\n/*\\\n * Interactable.allowFrom\n [ method ]\n *\n * A drag/resize/gesture is started only If the target of the\n * `mousedown`, `pointerdown` or `touchstart` event or any of it's\n * parents match the given CSS selector or Element.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to allow from any element\n = (string | Element | object) The current allowFrom value or this Interactable\n **\n | interact(element, { allowFrom: document.getElementById('drag-handle') });\n | // or\n | interact(element).allowFrom('.handle');\n\\*/\nInteractable.prototype.allowFrom = function (newValue) {\n return this._backCompatOption('allowFrom', newValue);\n};\n\nInteractable.prototype.testIgnore = function (ignoreFrom, interactableElement, element) {\n if (!ignoreFrom || !is.element(element)) { return false; }\n\n if (is.string(ignoreFrom)) {\n return domUtils.matchesUpTo(element, ignoreFrom, interactableElement);\n }\n else if (is.element(ignoreFrom)) {\n return domUtils.nodeContains(ignoreFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testAllow = function (allowFrom, interactableElement, element) {\n if (!allowFrom) { return true; }\n\n if (!is.element(element)) { return false; }\n\n if (is.string(allowFrom)) {\n return domUtils.matchesUpTo(element, allowFrom, interactableElement);\n }\n else if (is.element(allowFrom)) {\n return domUtils.nodeContains(allowFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testIgnoreAllow = function (options, interactableElement, eventTarget) {\n return (!this.testIgnore(options.ignoreFrom, interactableElement, eventTarget)\n && this.testAllow(options.allowFrom, interactableElement, eventTarget));\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (event.buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\n","const interact = require('../interact');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst actions = require('../actions/base');\nconst defaultOptions = require('../defaultOptions');\nconst browser = require('../utils/browser');\nconst scope = require('../scope');\nconst utils = require('../utils');\nconst signals = require('../utils/Signals').new();\n\nrequire('./InteractableMethods');\n\nconst autoStart = {\n signals,\n withinInteractionLimit,\n // Allow this many interactions to happen simultaneously\n maxInteractions: Infinity,\n defaults: {\n perAction: {\n manualStart: false,\n max: Infinity,\n maxPerElement: 1,\n allowFrom: null,\n ignoreFrom: null,\n },\n },\n setActionDefaults: function (action) {\n utils.extend(action.defaults, autoStart.defaults.perAction);\n },\n};\n\n// set cursor style on mousedown\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget }) {\n if (interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\n// set cursor style on mousemove\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget }) {\n if (!interaction.mouse\n || interaction.pointerIsDown\n || interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\nInteraction.signals.on('move', function (arg) {\n const { interaction, event } = arg;\n\n if (!interaction.pointerIsDown\n || interaction.interacting()\n || !interaction.pointerWasMoved\n || !interaction.prepared.name) {\n return;\n }\n\n signals.fire('before-start', arg);\n\n const target = interaction.target;\n\n if (interaction.prepared.name && target) {\n // check manualStart and interaction limit\n if (target.options[interaction.prepared.name].manualStart\n || !withinInteractionLimit(target, interaction.element, interaction.prepared)) {\n interaction.stop(event);\n }\n else {\n interaction.start(interaction.prepared, target, interaction.element);\n }\n }\n});\n\n// Check if the current target supports the action.\n// If so, return the validated action. Otherwise, return null\nfunction validateAction (action, interactable, element, eventTarget) {\n if (utils.is.object(action)\n && interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget)\n && interactable.options[action.name].enabled\n && withinInteractionLimit(interactable, element, action)) {\n return action;\n }\n\n return null;\n}\n\nfunction validateSelector (interaction, pointer, event, matches, matchElements, eventTarget) {\n for (let i = 0, len = matches.length; i < len; i++) {\n const match = matches[i];\n const matchElement = matchElements[i];\n const action = validateAction(match.getAction(pointer, event, interaction, matchElement),\n match,\n matchElement,\n eventTarget);\n\n if (action) {\n return {\n action,\n target: match,\n element: matchElement,\n };\n }\n }\n\n return {};\n}\n\nfunction getActionInfo (interaction, pointer, event, eventTarget) {\n let matches = [];\n let matchElements = [];\n\n let element = eventTarget;\n let action = null;\n\n function pushMatches (interactable, selector, context) {\n const elements = (browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined);\n\n if (utils.matchesSelector(element, selector, elements)) {\n\n matches.push(interactable);\n matchElements.push(element);\n }\n }\n\n while (utils.is.element(element)) {\n matches = [];\n matchElements = [];\n\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && (action = validateAction(elementInteractable.getAction(pointer, event, interaction, element, eventTarget),\n elementInteractable,\n element,\n eventTarget))\n && !elementInteractable.options[action.name].manualStart) {\n return {\n element,\n action,\n target: elementInteractable,\n };\n }\n else {\n scope.interactables.forEachSelector(pushMatches, element);\n\n const actionInfo = validateSelector(interaction, pointer, event, matches, matchElements, eventTarget);\n\n if (actionInfo.action\n && !actionInfo.target.options[actionInfo.action.name].manualStart) {\n return actionInfo;\n }\n }\n\n element = utils.parentNode(element);\n }\n\n return {};\n}\n\nfunction prepare (interaction, { action, target, element }) {\n action = action || {};\n\n if (interaction.target && interaction.target.options.styleCursor) {\n interaction.target._doc.documentElement.style.cursor = '';\n }\n\n interaction.target = target;\n interaction.element = element;\n utils.copyAction(interaction.prepared, action);\n\n if (target && target.options.styleCursor) {\n const cursor = action? actions[action.name].getCursor(action) : '';\n interaction.target._doc.documentElement.style.cursor = cursor;\n }\n\n signals.fire('prepared', { interaction: interaction });\n}\n\nInteraction.signals.on('stop', function ({ interaction }) {\n const target = interaction.target;\n\n if (target && target.options.styleCursor) {\n target._doc.documentElement.style.cursor = '';\n }\n});\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (utils.is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (utils.is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n const buttons = event.buttons || ({\n 0: 1,\n 1: 4,\n 3: 8,\n 4: 16,\n })[event.button];\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\nfunction withinInteractionLimit (interactable, element, action) {\n const options = interactable.options;\n const maxActions = options[action.name].max;\n const maxPerElement = options[action.name].maxPerElement;\n let activeInteractions = 0;\n let targetCount = 0;\n let targetElementCount = 0;\n\n // no actions if any of these values == 0\n if (!(maxActions && maxPerElement && autoStart.maxInteractions)) { return; }\n\n for (let i = 0, len = scope.interactions.length; i < len; i++) {\n const interaction = scope.interactions[i];\n const otherAction = interaction.prepared.name;\n\n if (!interaction.interacting()) { continue; }\n\n activeInteractions++;\n\n if (activeInteractions >= autoStart.maxInteractions) {\n return false;\n }\n\n if (interaction.target !== interactable) { continue; }\n\n targetCount += (otherAction === action.name)|0;\n\n if (targetCount >= maxActions) {\n return false;\n }\n\n if (interaction.element === element) {\n targetElementCount++;\n\n if (otherAction !== action.name || targetElementCount >= maxPerElement) {\n return false;\n }\n }\n }\n\n return autoStart.maxInteractions > 0;\n}\n\n/*\\\n * interact.maxInteractions\n [ method ]\n **\n * Returns or sets the maximum number of concurrent interactions allowed.\n * By default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables\n * and elements, you need to enable it in the draggable, resizable and\n * gesturable `'max'` and `'maxPerElement'` options.\n **\n - newValue (number) #optional Any number. newValue <= 0 means no interactions.\n\\*/\ninteract.maxInteractions = function (newValue) {\n if (utils.is.number(newValue)) {\n autoStart.maxInteractions = newValue;\n\n return this;\n }\n\n return autoStart.maxInteractions;\n};\n\nInteractable.settingsMethods.push('styleCursor');\nInteractable.settingsMethods.push('actionChecker');\nInteractable.settingsMethods.push('ignoreFrom');\nInteractable.settingsMethods.push('allowFrom');\n\ndefaultOptions.base.actionChecker = null;\ndefaultOptions.base.styleCursor = true;\n\nutils.extend(defaultOptions.perAction, autoStart.defaults.perAction);\n\nmodule.exports = autoStart;\n","const autoStart = require('./base');\nconst Interaction = require('../Interaction');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.delayTimer = null;\n});\n\nautoStart.signals.on('prepared', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.delayTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.target, interaction.element);\n }, delay);\n }\n});\n\nInteraction.signals.on('move', function ({ interaction, duplicate }) {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.delayTimer);\n }\n});\n\n// prevent regular down->move autoStart\nautoStart.signals.on('before-start', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.prepared.name = null;\n }\n});\n","const autoStart = require('./base');\nconst scope = require('../scope');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\n\nconst { matchesSelector, parentNode } = require('../utils/domUtils');\n\nautoStart.setActionDefaults(require('../actions/drag'));\n\nautoStart.signals.on('before-start', function ({ interaction, eventTarget, dx, dy }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // check if a drag is in the correct axis\n const absX = Math.abs(dx);\n const absY = Math.abs(dy);\n const options = interaction.target.options.drag;\n const startAxis = options.startAxis;\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy');\n\n interaction.prepared.axis = options.lockAxis === 'start'\n ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n : options.lockAxis;\n\n // if the movement isn't in the startAxis of the interactable\n if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) {\n // cancel the prepared action\n interaction.prepared.name = null;\n\n // then try to get a drag from another ineractable\n\n if (!interaction.prepared.name) {\n\n let element = eventTarget;\n\n const getDraggable = function (interactable, selector, context) {\n const elements = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n if (interactable === interaction.target) { return; }\n\n if (!options.manualStart\n && !interactable.testIgnoreAllow(options, element, eventTarget)\n && matchesSelector(element, selector, elements)) {\n\n const action = interactable.getAction(interaction.downPointer,\n interaction.downEvent,\n interaction,\n element);\n\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, interactable)\n && autoStart.validateAction(action, interactable, element, eventTarget)) {\n\n return interactable;\n }\n }\n };\n\n let action = null;\n\n // check all interactables\n while (is.element(element)) {\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && elementInteractable !== interaction.target\n && !elementInteractable.options.drag.manualStart) {\n\n action = elementInteractable.getAction(interaction.downPointer, interaction.downEvent, interaction, element);\n }\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, elementInteractable)) {\n\n interaction.prepared.name = 'drag';\n interaction.target = elementInteractable;\n interaction.element = element;\n break;\n }\n\n const selectorInteractable = scope.interactables.forEachSelector(getDraggable, element);\n\n if (selectorInteractable) {\n interaction.prepared.name = 'drag';\n interaction.target = selectorInteractable;\n interaction.element = element;\n break;\n }\n\n element = parentNode(element);\n }\n }\n }\n});\n\nfunction checkStartAxis (startAxis, interactable) {\n if (!interactable) { return false; }\n\n const thisAxis = interactable.options.drag.startAxis;\n\n return (startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis);\n}\n","require('./base').setActionDefaults(require('../actions/gesture'));\n","require('./base').setActionDefaults(require('../actions/resize'));\n","module.exports = {\n base: {\n accept : null,\n preventDefault: 'auto',\n deltaSource : 'page',\n },\n\n perAction: {\n origin: { x: 0, y: 0 },\n\n // only allow left button by default\n // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n mouseButtons: 1,\n\n inertia: {\n enabled : false,\n resistance : 10, // the lambda in exponential decay\n minSpeed : 100, // target speed must be above this for inertia to start\n endSpeed : 10, // the speed at which inertia is slow enough to stop\n allowResume : true, // allow resuming an action in inertia phase\n smoothEndDuration: 300, // animate to snap/restrict endOnly if there's no inertia\n },\n },\n};\n","/* browser entry point */\n\n// Legacy browser support\nrequire('./legacyBrowsers');\n\n// inertia\nrequire('./inertia');\n\n// modifiers\nrequire('./modifiers/snap');\nrequire('./modifiers/restrict');\n\n// pointerEvents\nrequire('./pointerEvents/base');\nrequire('./pointerEvents/holdRepeat');\nrequire('./pointerEvents/interactableTargets');\n\n// delay\nrequire('./autoStart/delay');\n\n// actions\nrequire('./actions/gesture');\nrequire('./actions/resize');\nrequire('./actions/drag');\nrequire('./actions/drop');\n\n// load these modifiers after resize is loaded\nrequire('./modifiers/snapSize');\nrequire('./modifiers/restrictEdges');\nrequire('./modifiers/restrictSize');\n\n// autoStart actions\nrequire('./autoStart/gesture');\nrequire('./autoStart/resize');\nrequire('./autoStart/drag');\n\n// Interactable preventDefault setting\nrequire('./interactablePreventDefault.js');\n\n// autoScroll\nrequire('./autoScroll');\n\n// export interact\nmodule.exports = require('./interact');\n","const InteractEvent = require('./InteractEvent');\nconst Interaction = require('./Interaction');\nconst modifiers = require('./modifiers');\nconst utils = require('./utils');\nconst animationFrame = require('./utils/raf');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.inertiaStatus = {\n active : false,\n smoothEnd : false,\n allowResume: false,\n\n startEvent: null,\n upCoords : {},\n\n xe: 0, ye: 0,\n sx: 0, sy: 0,\n\n t0: 0,\n vx0: 0, vys: 0,\n duration: 0,\n\n lambda_v0: 0,\n one_ve_v0: 0,\n i : null,\n };\n\n interaction.boundInertiaFrame = () => inertiaFrame .apply(interaction);\n interaction.boundSmoothEndFrame = () => smoothEndFrame.apply(interaction);\n});\n\nInteraction.signals.on('down', function ({ interaction, event, pointer, eventTarget }) {\n const status = interaction.inertiaStatus;\n\n // Check if the down event hits the current inertia target\n if (status.active) {\n let element = eventTarget;\n\n // climb up the DOM tree from the event target\n while (utils.is.element(element)) {\n\n // if interaction element is the current inertia target element\n if (element === interaction.element) {\n // stop inertia\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n\n // update pointers to the down event's coordinates\n interaction.updatePointer(pointer);\n utils.setCoords(interaction.curCoords, interaction.pointers);\n\n // fire appropriate signals\n const signalArg = { interaction };\n Interaction.signals.fire('before-action-move', signalArg);\n Interaction.signals.fire('action-resume' , signalArg);\n\n // fire a reume event\n const resumeEvent = new InteractEvent(interaction,\n event,\n interaction.prepared.name,\n 'inertiaresume',\n interaction.element);\n\n interaction.target.fire(resumeEvent);\n interaction.prevEvent = resumeEvent;\n modifiers.resetStatuses(interaction.modifierStatuses);\n\n utils.copyCoords(interaction.prevCoords, interaction.curCoords);\n break;\n }\n\n element = utils.parentNode(element);\n }\n }\n});\n\nInteraction.signals.on('up', function ({ interaction, event }) {\n const status = interaction.inertiaStatus;\n\n if (!interaction.interacting() || status.active) { return; }\n\n const target = interaction.target;\n const options = target && target.options;\n const inertiaOptions = options && interaction.prepared.name && options[interaction.prepared.name].inertia;\n\n const now = new Date().getTime();\n const statuses = {};\n const page = utils.extend({}, interaction.curCoords.page);\n const pointerSpeed = interaction.pointerDelta.client.speed;\n\n let smoothEnd = false;\n let modifierResult;\n\n // check if inertia should be started\n const inertiaPossible = (inertiaOptions && inertiaOptions.enabled\n && interaction.prepared.name !== 'gesture'\n && event !== status.startEvent);\n\n const inertia = (inertiaPossible\n && (now - interaction.curCoords.timeStamp) < 50\n && pointerSpeed > inertiaOptions.minSpeed\n && pointerSpeed > inertiaOptions.endSpeed);\n\n const modifierArg = {\n interaction,\n pageCoords: page,\n statuses,\n preEnd: true,\n requireEndOnly: true,\n };\n\n // smoothEnd\n if (inertiaPossible && !inertia) {\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n if (modifierResult.shouldMove && modifierResult.locked) {\n smoothEnd = true;\n }\n }\n\n if (!(inertia || smoothEnd)) { return; }\n\n utils.copyCoords(status.upCoords, interaction.curCoords);\n\n interaction.pointers[0] = status.startEvent =\n new InteractEvent(interaction, event, interaction.prepared.name, 'inertiastart', interaction.element);\n\n status.t0 = now;\n\n status.active = true;\n status.allowResume = inertiaOptions.allowResume;\n interaction.simulation = status;\n\n target.fire(status.startEvent);\n\n if (inertia) {\n status.vx0 = interaction.pointerDelta.client.vx;\n status.vy0 = interaction.pointerDelta.client.vy;\n status.v0 = pointerSpeed;\n\n calcInertia(interaction, status);\n\n utils.extend(page, interaction.curCoords.page);\n\n page.x += status.xe;\n page.y += status.ye;\n\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n status.modifiedXe += modifierResult.dx;\n status.modifiedYe += modifierResult.dy;\n\n status.i = animationFrame.request(interaction.boundInertiaFrame);\n }\n else {\n status.smoothEnd = true;\n status.xe = modifierResult.dx;\n status.ye = modifierResult.dy;\n\n status.sx = status.sy = 0;\n\n status.i = animationFrame.request(interaction.boundSmoothEndFrame);\n }\n});\n\nInteraction.signals.on('stop-active', function ({ interaction }) {\n const status = interaction.inertiaStatus;\n\n if (status.active) {\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n }\n});\n\nfunction calcInertia (interaction, status) {\n const inertiaOptions = interaction.target.options[interaction.prepared.name].inertia;\n const lambda = inertiaOptions.resistance;\n const inertiaDur = -Math.log(inertiaOptions.endSpeed / status.v0) / lambda;\n\n status.x0 = interaction.prevEvent.pageX;\n status.y0 = interaction.prevEvent.pageY;\n status.t0 = status.startEvent.timeStamp / 1000;\n status.sx = status.sy = 0;\n\n status.modifiedXe = status.xe = (status.vx0 - inertiaDur) / lambda;\n status.modifiedYe = status.ye = (status.vy0 - inertiaDur) / lambda;\n status.te = inertiaDur;\n\n status.lambda_v0 = lambda / status.v0;\n status.one_ve_v0 = 1 - inertiaOptions.endSpeed / status.v0;\n}\n\nfunction inertiaFrame () {\n updateInertiaCoords(this);\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n\n const status = this.inertiaStatus;\n const options = this.target.options[this.prepared.name].inertia;\n const lambda = options.resistance;\n const t = new Date().getTime() / 1000 - status.t0;\n\n if (t < status.te) {\n\n const progress = 1 - (Math.exp(-lambda * t) - status.lambda_v0) / status.one_ve_v0;\n\n if (status.modifiedXe === status.xe && status.modifiedYe === status.ye) {\n status.sx = status.xe * progress;\n status.sy = status.ye * progress;\n }\n else {\n const quadPoint = utils.getQuadraticCurvePoint(0, 0,\n status.xe,\n status.ye,\n status.modifiedXe,\n status.modifiedYe,\n progress);\n\n status.sx = quadPoint.x;\n status.sy = quadPoint.y;\n }\n\n this.doMove();\n\n status.i = animationFrame.request(this.boundInertiaFrame);\n }\n else {\n status.sx = status.modifiedXe;\n status.sy = status.modifiedYe;\n\n this.doMove();\n this.end(status.startEvent);\n status.active = false;\n this.simulation = null;\n }\n\n utils.copyCoords(this.prevCoords, this.curCoords);\n}\n\nfunction smoothEndFrame () {\n updateInertiaCoords(this);\n\n const status = this.inertiaStatus;\n const t = new Date().getTime() - status.t0;\n const duration = this.target.options[this.prepared.name].inertia.smoothEndDuration;\n\n if (t < duration) {\n status.sx = utils.easeOutQuad(t, 0, status.xe, duration);\n status.sy = utils.easeOutQuad(t, 0, status.ye, duration);\n\n this.pointerMove(status.startEvent, status.startEvent);\n\n status.i = animationFrame.request(this.boundSmoothEndFrame);\n }\n else {\n status.sx = status.xe;\n status.sy = status.ye;\n\n this.pointerMove(status.startEvent, status.startEvent);\n this.end(status.startEvent);\n\n status.smoothEnd =\n status.active = false;\n this.simulation = null;\n }\n}\n\nfunction updateInertiaCoords (interaction) {\n const status = interaction.inertiaStatus;\n\n // return if inertia isn't running\n if (!status.active) { return; }\n\n const pageUp = status.upCoords.page;\n const clientUp = status.upCoords.client;\n\n utils.setCoords(interaction.curCoords, [ {\n pageX : pageUp.x + status.sx,\n pageY : pageUp.y + status.sy,\n clientX: clientUp.x + status.sx,\n clientY: clientUp.y + status.sy,\n } ]);\n}\n","const browser = require('./utils/browser');\nconst events = require('./utils/events');\nconst utils = require('./utils');\nconst scope = require('./scope');\nconst Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\n\nconst globalEvents = {};\n\n/*\\\n * interact\n [ method ]\n *\n * The methods of this variable can be used to set elements as\n * interactables and also to change various default settings.\n *\n * Calling it as a function and passing an element or a valid CSS selector\n * string returns an Interactable object which has various methods to\n * configure it.\n *\n - element (Element | string) The HTML or SVG Element to interact with or CSS selector\n = (object) An @Interactable\n *\n > Usage\n | interact('#draggable').draggable(true);\n |\n | var rectables = interact('rect');\n | rectables\n | .gesturable(true)\n | .on('gesturemove', function (event) {\n | // ...\n | });\n\\*/\nfunction interact (element, options) {\n let interactable = scope.interactables.get(element, options);\n\n if (!interactable) {\n interactable = new Interactable(element, options);\n interactable.events.global = globalEvents;\n }\n\n return interactable;\n}\n\n/*\\\n * interact.isSet\n [ method ]\n *\n * Check if an element has been set\n - element (Element) The Element being searched for\n = (boolean) Indicates if the element or CSS selector was previously passed to interact\n\\*/\ninteract.isSet = function (element, options) {\n return scope.interactables.indexOfElement(element, options && options.context) !== -1;\n};\n\n/*\\\n * interact.on\n [ method ]\n *\n * Adds a global listener for an InteractEvent or adds a DOM event to\n * `document`\n *\n - type (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) interact\n\\*/\ninteract.on = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.on(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.on(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n // if it is an InteractEvent type, add listener to globalEvents\n if (utils.contains(Interactable.eventTypes, type)) {\n // if this type of event was never bound\n if (!globalEvents[type]) {\n globalEvents[type] = [listener];\n }\n else {\n globalEvents[type].push(listener);\n }\n }\n // If non InteractEvent type, addEventListener to document\n else {\n events.add(scope.document, type, listener, { options });\n }\n\n return interact;\n};\n\n/*\\\n * interact.off\n [ method ]\n *\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n - type (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) interact\n \\*/\ninteract.off = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.off(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.off(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n if (!utils.contains(Interactable.eventTypes, type)) {\n events.remove(scope.document, type, listener, options);\n }\n else {\n let index;\n\n if (type in globalEvents\n && (index = utils.indexOf(globalEvents[type], listener)) !== -1) {\n globalEvents[type].splice(index, 1);\n }\n }\n\n return interact;\n};\n\n/*\\\n * interact.debug\n [ method ]\n *\n * Returns an object which exposes internal data\n = (object) An object with properties that outline the current state and expose internal functions and variables\n\\*/\ninteract.debug = function () {\n return scope;\n};\n\n// expose the functions used to calculate multi-touch properties\ninteract.getPointerAverage = utils.pointerAverage;\ninteract.getTouchBBox = utils.touchBBox;\ninteract.getTouchDistance = utils.touchDistance;\ninteract.getTouchAngle = utils.touchAngle;\n\ninteract.getElementRect = utils.getElementRect;\ninteract.getElementClientRect = utils.getElementClientRect;\ninteract.matchesSelector = utils.matchesSelector;\ninteract.closest = utils.closest;\n\n/*\\\n * interact.supportsTouch\n [ method ]\n *\n = (boolean) Whether or not the browser supports touch input\n\\*/\ninteract.supportsTouch = function () {\n return browser.supportsTouch;\n};\n\n/*\\\n * interact.supportsPointerEvent\n [ method ]\n *\n = (boolean) Whether or not the browser supports PointerEvents\n\\*/\ninteract.supportsPointerEvent = function () {\n return browser.supportsPointerEvent;\n};\n\n/*\\\n * interact.stop\n [ method ]\n *\n * Cancels all interactions (end events are not fired)\n *\n - event (Event) An event on which to call preventDefault()\n = (object) interact\n\\*/\ninteract.stop = function (event) {\n for (let i = scope.interactions.length - 1; i >= 0; i--) {\n scope.interactions[i].stop(event);\n }\n\n return interact;\n};\n\n/*\\\n * interact.pointerMoveTolerance\n [ method ]\n * Returns or sets the distance the pointer must be moved before an action\n * sequence occurs. This also affects tolerance for tap events.\n *\n - newValue (number) #optional The movement from the start position must be greater than this value\n = (number | Interactable) The current setting or interact\n\\*/\ninteract.pointerMoveTolerance = function (newValue) {\n if (utils.is.number(newValue)) {\n Interaction.pointerMoveTolerance = newValue;\n\n return this;\n }\n\n return Interaction.pointerMoveTolerance;\n};\n\ninteract.addDocument = scope.addDocument;\ninteract.removeDocument = scope.removeDocument;\n\nscope.interact = interact;\n\nmodule.exports = interact;\n","const Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\nconst scope = require('./scope');\nconst is = require('./utils/is');\nconst events = require('./utils/events');\n\nconst { nodeContains, matchesSelector } = require('./utils/domUtils');\n\n/*\\\n * Interactable.preventDefault\n [ method ]\n *\n * Returns or sets whether to prevent the browser's default behaviour\n * in response to pointer events. Can be set to:\n * - `'always'` to always prevent\n * - `'never'` to never prevent\n * - `'auto'` to let interact.js try to determine what would be best\n *\n - newValue (string) #optional `true`, `false` or `'auto'`\n = (string | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.preventDefault = function (newValue) {\n if (/^(always|never|auto)$/.test(newValue)) {\n this.options.preventDefault = newValue;\n return this;\n }\n\n if (is.bool(newValue)) {\n this.options.preventDefault = newValue? 'always' : 'never';\n return this;\n }\n\n return this.options.preventDefault;\n};\n\nInteractable.prototype.checkAndPreventDefault = function (event) {\n const setting = this.options.preventDefault;\n\n if (setting === 'never') { return; }\n\n if (setting === 'always') {\n event.preventDefault();\n return;\n }\n\n // setting === 'auto'\n\n // don't preventDefault if the browser supports passiveEvents\n // CSS touch-action and user-selecct should be used instead\n if (events.supportsOptions) {\n return;\n }\n\n // don't preventDefault of pointerdown events\n if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) {\n return;\n }\n\n // don't preventDefault on editable elements\n if (is.element(event.target)\n && matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) {\n return;\n }\n\n event.preventDefault();\n};\n\nfunction onInteractionEvent ({ interaction, event }) {\n if (interaction.target) {\n interaction.target.checkAndPreventDefault(event);\n }\n}\n\nfor (const eventSignal of ['down', 'move', 'up', 'cancel']) {\n Interaction.signals.on(eventSignal, onInteractionEvent);\n}\n\n// prevent native HTML5 drag on interact.js target elements\nInteraction.docEvents.dragstart = function preventNativeDrag (event) {\n for (const interaction of scope.interactions) {\n\n if (interaction.element\n && (interaction.element === event.target\n || nodeContains(interaction.element, event.target))) {\n\n interaction.target.checkAndPreventDefault(event);\n return;\n }\n }\n};\n","const scope = require('./scope');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst iFinder = require('./utils/interactionFinder');\nconst pointerEvents = require('./pointerEvents/base');\n\nconst { window } = require('./utils/window');\n\nconst toString = Object.prototype.toString;\n\nif (!window.Array.isArray) {\n window.Array.isArray = function (obj) {\n return toString.call(obj) === '[object Array]';\n };\n}\n\nif (!String.prototype.trim) {\n String.prototype.trim = function () {\n return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n };\n}\n\n// http://www.quirksmode.org/dom/events/click.html\n// >Events leading to dblclick\n//\n// IE8 doesn't fire down event before dblclick.\n// This workaround tries to fire a tap and doubletap after dblclick\nfunction onIE8Dblclick (event) {\n const eventTarget = event.target;\n const interaction = iFinder.search(event, event.type, eventTarget);\n\n if (!interaction) { return; }\n\n if (interaction.prevTap\n && event.clientX === interaction.prevTap.clientX\n && event.clientY === interaction.prevTap.clientY\n && eventTarget === interaction.prevTap.target) {\n\n interaction.downTargets[0] = eventTarget;\n interaction.downTimes [0] = new Date().getTime();\n\n pointerEvents.fire({\n interaction,\n event,\n eventTarget,\n pointer: event,\n type: 'tap',\n });\n }\n}\n\nif (browser.isIE8) {\n const selectFix = function (event) {\n for (const interaction of scope.interactions) {\n if (interaction.interacting()) {\n interaction.target.checkAndPreventDefault(event);\n }\n }\n };\n\n const onDocIE8 = function onDocIE8 ({ doc, win }, signalName) {\n const eventMethod = signalName.indexOf('listen') === 0\n ? events.add : events.remove;\n\n // For IE's lack of Event#preventDefault\n eventMethod(doc, 'selectstart', selectFix);\n\n if (pointerEvents) {\n eventMethod(doc, 'dblclick', onIE8Dblclick);\n }\n };\n\n scope.signals.on('add-document' , onDocIE8);\n scope.signals.on('remove-document', onDocIE8);\n}\n\nmodule.exports = null;\n","const InteractEvent = require('../InteractEvent');\nconst Interaction = require('../Interaction');\nconst extend = require('../utils/extend');\n\nconst modifiers = {\n names: [],\n\n setOffsets: function (arg) {\n const { interaction, pageCoords: page } = arg;\n const { target, element, startOffset } = interaction;\n const rect = target.getRect(element);\n\n if (rect) {\n startOffset.left = page.x - rect.left;\n startOffset.top = page.y - rect.top;\n\n startOffset.right = rect.right - page.x;\n startOffset.bottom = rect.bottom - page.y;\n\n if (!('width' in rect)) { rect.width = rect.right - rect.left; }\n if (!('height' in rect)) { rect.height = rect.bottom - rect.top ; }\n }\n else {\n startOffset.left = startOffset.top = startOffset.right = startOffset.bottom = 0;\n }\n\n arg.rect = rect;\n arg.interactable = target;\n arg.element = element;\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n\n arg.options = target.options[interaction.prepared.name][modifierName];\n\n if (!arg.options) {\n continue;\n }\n\n interaction.modifierOffsets[modifierName] = modifiers[modifierName].setOffset(arg);\n }\n },\n\n setAll: function (arg) {\n const { interaction, statuses, preEnd, requireEndOnly } = arg;\n const coords = extend({}, arg.pageCoords);\n const result = {\n dx: 0,\n dy: 0,\n changed: false,\n locked: false,\n shouldMove: true,\n };\n\n for (const modifierName of modifiers.names) {\n const modifier = modifiers[modifierName];\n const options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!shouldDo(options, preEnd, requireEndOnly)) { continue; }\n\n arg.status = arg.status = statuses[modifierName];\n arg.options = options;\n arg.offset = arg.interaction.modifierOffsets[modifierName];\n\n modifier.set(arg);\n\n if (arg.status.locked) {\n coords.x += arg.status.dx;\n coords.y += arg.status.dy;\n\n result.dx += arg.status.dx;\n result.dy += arg.status.dy;\n\n result.locked = true;\n }\n }\n\n // a move should be fired if:\n // - there are no modifiers enabled,\n // - no modifiers are \"locked\" i.e. have changed the pointer's coordinates, or\n // - the locked coords have changed since the last pointer move\n result.shouldMove = !arg.status || !result.locked || arg.status.changed;\n\n return result;\n },\n\n resetStatuses: function (statuses) {\n for (const modifierName of modifiers.names) {\n const status = statuses[modifierName] || {};\n\n status.dx = status.dy = 0;\n status.modifiedX = status.modifiedY = NaN;\n status.locked = false;\n status.changed = true;\n\n statuses[modifierName] = status;\n }\n\n return statuses;\n },\n\n start: function ({ interaction }, signalName) {\n const arg = {\n interaction,\n pageCoords: (signalName === 'action-resume' ?\n interaction.curCoords : interaction.startCoords).page,\n startOffset: interaction.startOffset,\n statuses: interaction.modifierStatuses,\n preEnd: false,\n requireEndOnly: false,\n };\n\n modifiers.setOffsets(arg);\n modifiers.resetStatuses(arg.statuses);\n\n arg.pageCoords = extend({}, interaction.startCoords.page);\n interaction.modifierResult = modifiers.setAll(arg);\n },\n};\n\nInteraction.signals.on('new', function (interaction) {\n interaction.startOffset = { left: 0, right: 0, top: 0, bottom: 0 };\n interaction.modifierOffsets = {};\n interaction.modifierStatuses = modifiers.resetStatuses({});\n interaction.modifierResult = null;\n});\n\nInteraction.signals.on('action-start' , modifiers.start);\nInteraction.signals.on('action-resume', modifiers.start);\n\nInteraction.signals.on('before-action-move', function ({ interaction, preEnd, interactingBeforeMove }) {\n const modifierResult = modifiers.setAll({\n interaction,\n preEnd,\n pageCoords: interaction.curCoords.page,\n statuses: interaction.modifierStatuses,\n requireEndOnly: false,\n });\n\n // don't fire an action move if a modifier would keep the event in the same\n // cordinates as before\n if (!modifierResult.shouldMove && interactingBeforeMove) {\n interaction._dontFireMove = true;\n }\n\n interaction.modifierResult = modifierResult;\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n for (let i = 0; i < modifiers.names.length; i++) {\n const options = interaction.target.options[interaction.prepared.name][modifiers.names[i]];\n\n // if the endOnly option is true for any modifier\n if (shouldDo(options, true, true)) {\n // fire a move event at the modified coordinates\n interaction.doMove({ event, preEnd: true });\n break;\n }\n }\n});\n\nInteractEvent.signals.on('set-xy', function (arg) {\n const { iEvent, interaction } = arg;\n const modifierArg = extend({}, arg);\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n modifierArg.options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!modifierArg.options) {\n continue;\n }\n\n const modifier = modifiers[modifierName];\n\n modifierArg.status = interaction.modifierStatuses[modifierName];\n\n iEvent[modifierName] = modifier.modifyCoords(modifierArg);\n }\n});\n\nfunction shouldDo (options, preEnd, requireEndOnly) {\n return (options && options.enabled\n && (preEnd || !options.endOnly)\n && (!requireEndOnly || options.endOnly));\n}\n\nmodule.exports = modifiers;\n","const modifiers = require('./index');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst restrict = {\n defaults: {\n enabled : false,\n endOnly : false,\n restriction: null,\n elementRect: null,\n },\n\n setOffset: function ({ rect, startOffset, options }) {\n const elementRect = options && options.elementRect;\n const offset = {};\n\n if (rect && elementRect) {\n offset.left = startOffset.left - (rect.width * elementRect.left);\n offset.top = startOffset.top - (rect.height * elementRect.top);\n\n offset.right = startOffset.right - (rect.width * (1 - elementRect.right));\n offset.bottom = startOffset.bottom - (rect.height * (1 - elementRect.bottom));\n }\n else {\n offset.left = offset.top = offset.right = offset.bottom = 0;\n }\n\n return offset;\n },\n\n set: function ({ pageCoords, interaction, status, options }) {\n if (!options) { return status; }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n\n const restriction = getRestrictionRect(options.restriction, interaction, page);\n\n if (!restriction) { return status; }\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n const rect = restriction;\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n const offset = interaction.modifierOffsets.restrict;\n\n // object is assumed to have\n // x, y, width, height or\n // left, top, right, bottom\n if ('x' in restriction && 'y' in restriction) {\n modifiedX = Math.max(Math.min(rect.x + rect.width - offset.right , page.x), rect.x + offset.left);\n modifiedY = Math.max(Math.min(rect.y + rect.height - offset.bottom, page.y), rect.y + offset.top );\n }\n else {\n modifiedX = Math.max(Math.min(rect.right - offset.right , page.x), rect.left + offset.left);\n modifiedY = Math.max(Math.min(rect.bottom - offset.bottom, page.y), rect.top + offset.top );\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const elementRect = options && options.elementRect;\n\n if (options && options.enabled\n && !(phase === 'start' && elementRect && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n getRestrictionRect,\n};\n\nfunction getRestrictionRect (value, interaction, page) {\n if (utils.is.function(value)) {\n return utils.resolveRectLike(value, interaction.target, interaction.element, [page.x, page.y, interaction]);\n } else {\n return utils.resolveRectLike(value, interaction.target, interaction.element);\n }\n}\n\nmodifiers.restrict = restrict;\nmodifiers.names.push('restrict');\n\ndefaultOptions.perAction.restrict = restrict.defaults;\n\nmodule.exports = restrict;\n","// This module adds the options.resize.restrictEdges setting which sets min and\n// max for the top, left, bottom and right edges of the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictEdges: {\n// inner: { top: 200, left: 200, right: 400, bottom: 400 },\n// outer: { top: 0, left: 0, right: 600, bottom: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst { getRestrictionRect } = require('./restrict');\n\nconst noInner = { top: +Infinity, left: +Infinity, bottom: -Infinity, right: -Infinity };\nconst noOuter = { top: -Infinity, left: -Infinity, bottom: +Infinity, right: +Infinity };\n\nconst restrictEdges = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n offset: null,\n },\n\n setOffset: function ({ interaction, startOffset, options }) {\n if (!options) {\n return utils.extend({}, startOffset);\n }\n\n const offset = getRestrictionRect(options.offset, interaction, interaction.startCoords.page);\n\n if (offset) {\n return {\n top: startOffset.top + offset.y,\n left: startOffset.left + offset.x,\n bottom: startOffset.bottom + offset.y,\n right: startOffset.right + offset.x,\n };\n }\n\n return startOffset;\n },\n\n set: function ({ pageCoords, interaction, status, offset, options }) {\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n const inner = rectUtils.xywhToTlbr(getRestrictionRect(options.inner, interaction, page)) || noInner;\n const outer = rectUtils.xywhToTlbr(getRestrictionRect(options.outer, interaction, page)) || noOuter;\n\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n if (edges.top) {\n modifiedY = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top);\n }\n else if (edges.bottom) {\n modifiedY = Math.max(Math.min(outer.bottom - offset.bottom, page.y), inner.bottom - offset.bottom);\n }\n if (edges.left) {\n modifiedX = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left);\n }\n else if (edges.right) {\n modifiedX = Math.max(Math.min(outer.right - offset.right, page.x), inner.right - offset.right);\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n if (options && options.enabled\n && !(phase === 'start' && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n noInner,\n noOuter,\n getRestrictionRect,\n};\n\nmodifiers.restrictEdges = restrictEdges;\nmodifiers.names.push('restrictEdges');\n\ndefaultOptions.perAction.restrictEdges = restrictEdges.defaults;\nresize.defaults.restrictEdges = restrictEdges.defaults;\n\nmodule.exports = restrictEdges;\n","// This module adds the options.resize.restrictSize setting which sets min and\n// max width and height for the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictSize: {\n// min: { width: -600, height: -600 },\n// max: { width: 600, height: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst restrictEdges = require('./restrictEdges');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst noMin = { width: -Infinity, height: -Infinity };\nconst noMax = { width: +Infinity, height: +Infinity };\n\nconst restrictSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n },\n\n setOffset: function ({ interaction }) {\n return interaction.startOffset;\n },\n\n set: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const rect = rectUtils.xywhToTlbr(interaction.resizeRects.inverted);\n\n const minSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.min, interaction)) || noMin;\n const maxSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.max, interaction)) || noMax;\n\n arg.options = {\n enabled: options.enabled,\n endOnly: options.endOnly,\n inner: utils.extend({}, restrictEdges.noInner),\n outer: utils.extend({}, restrictEdges.noOuter),\n };\n\n if (edges.top) {\n arg.options.inner.top = rect.bottom - minSize.height;\n arg.options.outer.top = rect.bottom - maxSize.height;\n }\n else if (edges.bottom) {\n arg.options.inner.bottom = rect.top + minSize.height;\n arg.options.outer.bottom = rect.top + maxSize.height;\n }\n if (edges.left) {\n arg.options.inner.left = rect.right - minSize.width;\n arg.options.outer.left = rect.right - maxSize.width;\n }\n else if (edges.right) {\n arg.options.inner.right = rect.left + minSize.width;\n arg.options.outer.right = rect.left + maxSize.width;\n }\n\n restrictEdges.set(arg);\n },\n\n modifyCoords: restrictEdges.modifyCoords,\n};\n\nmodifiers.restrictSize = restrictSize;\nmodifiers.names.push('restrictSize');\n\ndefaultOptions.perAction.restrictSize = restrictSize.defaults;\nresize.defaults.restrictSize = restrictSize.defaults;\n\nmodule.exports = restrictSize;\n","const modifiers = require('./index');\nconst interact = require('../interact');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst snap = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n\n relativePoints: null,\n },\n\n setOffset: function ({ interaction, interactable, element, rect, startOffset, options }) {\n const offsets = [];\n const optionsOrigin = utils.rectToXY(utils.resolveRectLike(options.origin));\n const origin = optionsOrigin || utils.getOriginXY(interactable, element, interaction.prepared.name);\n options = options || interactable.options[interaction.prepared.name].snap || {};\n\n let snapOffset;\n\n if (options.offset === 'startCoords') {\n snapOffset = {\n x: interaction.startCoords.page.x - origin.x,\n y: interaction.startCoords.page.y - origin.y,\n };\n }\n else {\n const offsetRect = utils.resolveRectLike(options.offset, interactable, element, [interaction]);\n\n snapOffset = utils.rectToXY(offsetRect) || { x: 0, y: 0 };\n }\n\n if (rect && options.relativePoints && options.relativePoints.length) {\n for (const { x: relativeX, y: relativeY } of options.relativePoints) {\n offsets.push({\n x: startOffset.left - (rect.width * relativeX) + snapOffset.x,\n y: startOffset.top - (rect.height * relativeY) + snapOffset.y,\n });\n }\n }\n else {\n offsets.push(snapOffset);\n }\n\n return offsets;\n },\n\n set: function ({ interaction, pageCoords, status, options, offset: offsets }) {\n const targets = [];\n let target;\n let page;\n let i;\n\n if (status.useStatusXY) {\n page = { x: status.x, y: status.y };\n }\n else {\n const origin = utils.getOriginXY(interaction.target, interaction.element, interaction.prepared.name);\n\n page = utils.extend({}, pageCoords);\n\n page.x -= origin.x;\n page.y -= origin.y;\n }\n\n status.realX = page.x;\n status.realY = page.y;\n\n let len = options.targets? options.targets.length : 0;\n\n for (const { x: offsetX, y: offsetY } of offsets) {\n const relativeX = page.x - offsetX;\n const relativeY = page.y - offsetY;\n\n for (const snapTarget of options.targets) {\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n targets.push({\n x: utils.is.number(target.x) ? (target.x + offsetX) : relativeX,\n y: utils.is.number(target.y) ? (target.y + offsetY) : relativeY,\n\n range: utils.is.number(target.range)? target.range: options.range,\n });\n }\n }\n\n const closest = {\n target: null,\n inRange: false,\n distance: 0,\n range: 0,\n dx: 0,\n dy: 0,\n };\n\n for (i = 0, len = targets.length; i < len; i++) {\n target = targets[i];\n\n const range = target.range;\n const dx = target.x - page.x;\n const dy = target.y - page.y;\n const distance = utils.hypot(dx, dy);\n let inRange = distance <= range;\n\n // Infinite targets count as being out of range\n // compared to non infinite ones that are in range\n if (range === Infinity && closest.inRange && closest.range !== Infinity) {\n inRange = false;\n }\n\n if (!closest.target || (inRange\n // is the closest target in range?\n ? (closest.inRange && range !== Infinity\n // the pointer is relatively deeper in this target\n ? distance / range < closest.distance / closest.range\n // this target has Infinite range and the closest doesn't\n : (range === Infinity && closest.range !== Infinity)\n // OR this target is closer that the previous closest\n || distance < closest.distance)\n // The other is not in range and the pointer is closer to this target\n : (!closest.inRange && distance < closest.distance))) {\n\n closest.target = target;\n closest.distance = distance;\n closest.range = range;\n closest.inRange = inRange;\n closest.dx = dx;\n closest.dy = dy;\n\n status.range = range;\n }\n }\n\n let snapChanged;\n\n if (closest.target) {\n snapChanged = (status.modifiedX !== closest.target.x || status.modifiedY !== closest.target.y);\n\n status.modifiedX = closest.target.x;\n status.modifiedY = closest.target.y;\n }\n else {\n snapChanged = true;\n\n status.modifiedX = NaN;\n status.modifiedY = NaN;\n }\n\n status.dx = closest.dx;\n status.dy = closest.dy;\n\n status.changed = (snapChanged || (closest.inRange && !status.locked));\n status.locked = closest.inRange;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const relativePoints = options && options.relativePoints;\n\n if (options && options.enabled\n && !(phase === 'start' && relativePoints && relativePoints.length)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n }\n\n return {\n range : status.range,\n locked : status.locked,\n x : status.modifiedX,\n y : status.modifiedY,\n realX : status.realX,\n realY : status.realY,\n dx : status.dx,\n dy : status.dy,\n };\n }\n },\n};\n\ninteract.createSnapGrid = function (grid) {\n return function (x, y) {\n const limits = grid.limits || {\n left : -Infinity,\n right : Infinity,\n top : -Infinity,\n bottom: Infinity,\n };\n let offsetX = 0;\n let offsetY = 0;\n\n if (utils.is.object(grid.offset)) {\n offsetX = grid.offset.x;\n offsetY = grid.offset.y;\n }\n\n const gridx = Math.round((x - offsetX) / grid.x);\n const gridy = Math.round((y - offsetY) / grid.y);\n\n const newX = Math.max(limits.left, Math.min(limits.right , gridx * grid.x + offsetX));\n const newY = Math.max(limits.top , Math.min(limits.bottom, gridy * grid.y + offsetY));\n\n return {\n x: newX,\n y: newY,\n range: grid.range,\n };\n };\n};\n\nmodifiers.snap = snap;\nmodifiers.names.push('snap');\n\ndefaultOptions.perAction.snap = snap.defaults;\n\nmodule.exports = snap;\n","// This module allows snapping of the size of targets during resize\n// interactions.\n\nconst modifiers = require('./index');\nconst snap = require('./snap');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\nconst utils = require('../utils/');\n\nconst snapSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n },\n\n setOffset: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.edges;\n\n if (!edges) { return; }\n\n arg.options = {\n relativePoints: [{\n x: edges.left? 0 : 1,\n y: edges.top ? 0 : 1,\n }],\n origin: { x: 0, y: 0 },\n offset: 'self',\n range: options.range,\n };\n\n const offsets = snap.setOffset(arg);\n arg.options = options;\n\n return offsets;\n },\n\n set: function (arg) {\n const { interaction, options, offset, pageCoords } = arg;\n const page = utils.extend({}, pageCoords);\n const relativeX = page.x - offset[0].x;\n const relativeY = page.y - offset[0].y;\n\n arg.options = utils.extend({}, options);\n arg.options.targets = [];\n\n for (const snapTarget of options.targets) {\n let target;\n\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n if ('width' in target && 'height' in target) {\n target.x = target.width;\n target.y = target.height;\n }\n\n arg.options.targets.push(target);\n }\n\n snap.set(arg);\n },\n\n modifyCoords: function (arg) {\n const { options } = arg;\n\n arg.options = utils.extend({}, options);\n arg.options.enabled = options.enabled;\n arg.options.relativePoints = [null];\n\n snap.modifyCoords(arg);\n },\n};\n\nmodifiers.snapSize = snapSize;\nmodifiers.names.push('snapSize');\n\ndefaultOptions.perAction.snapSize = snapSize.defaults;\nresize.defaults.snapSize = snapSize.defaults;\n\nmodule.exports = snapSize;\n","const pointerUtils = require('../utils/pointerUtils');\n\nmodule.exports = class PointerEvent {\n constructor (type, pointer, event, eventTarget, interaction) {\n pointerUtils.pointerExtend(this, event);\n\n if (event !== pointer) {\n pointerUtils.pointerExtend(this, pointer);\n }\n\n this.interaction = interaction;\n\n this.timeStamp = new Date().getTime();\n this.originalEvent = event;\n this.type = type;\n this.pointerId = pointerUtils.getPointerId(pointer);\n this.pointerType = pointerUtils.getPointerType(pointer, interaction);\n this.target = eventTarget;\n this.currentTarget = null;\n\n if (type === 'tap') {\n const pointerIndex = interaction.getPointerIndex(pointer);\n this.dt = this.timeStamp - interaction.downTimes[pointerIndex];\n\n const interval = this.timeStamp - interaction.tapTime;\n\n this.double = !!(interaction.prevTap\n && interaction.prevTap.type !== 'doubletap'\n && interaction.prevTap.target === this.target\n && interval < 500);\n }\n else if (type === 'doubletap') {\n this.dt = pointer.timeStamp - interaction.tapTime;\n }\n }\n\n subtractOrigin ({ x: originX, y: originY }) {\n this.pageX -= originX;\n this.pageY -= originY;\n this.clientX -= originX;\n this.clientY -= originY;\n\n return this;\n }\n\n addOrigin ({ x: originX, y: originY }) {\n this.pageX += originX;\n this.pageY += originY;\n this.clientX += originX;\n this.clientY += originY;\n\n return this;\n }\n\n preventDefault () {\n this.originalEvent.preventDefault();\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n};\n","const PointerEvent = require('./PointerEvent');\nconst Interaction = require('../Interaction');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst defaults = require('../defaultOptions');\nconst signals = require('../utils/Signals').new();\nconst { filter } = require('../utils/arr');\n\nconst simpleSignals = [ 'down', 'up', 'cancel' ];\nconst simpleEvents = [ 'down', 'up', 'cancel' ];\n\nconst pointerEvents = {\n PointerEvent,\n fire,\n collectEventTargets,\n signals,\n defaults: {\n holdDuration: 600,\n ignoreFrom : null,\n allowFrom : null,\n origin : { x: 0, y: 0 },\n },\n types: [\n 'down',\n 'move',\n 'up',\n 'cancel',\n 'tap',\n 'doubletap',\n 'hold',\n ],\n};\n\nfunction fire (arg) {\n const {\n interaction, pointer, event, eventTarget,\n type = arg.pointerEvent.type,\n targets = collectEventTargets(arg),\n pointerEvent = new PointerEvent(type, pointer, event, eventTarget, interaction),\n } = arg;\n\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n targets,\n type,\n pointerEvent,\n };\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n\n for (const prop in target.props || {}) {\n pointerEvent[prop] = target.props[prop];\n }\n\n const origin = utils.getOriginXY(target.eventable, target.element);\n\n pointerEvent.subtractOrigin(origin);\n pointerEvent.eventable = target.eventable;\n pointerEvent.currentTarget = target.element;\n\n target.eventable.fire(pointerEvent);\n\n pointerEvent.addOrigin(origin);\n\n if (pointerEvent.immediatePropagationStopped\n || (pointerEvent.propagationStopped\n && (i + 1) < targets.length && targets[i + 1].element !== pointerEvent.currentTarget)) {\n break;\n }\n }\n\n signals.fire('fired', signalArg);\n\n if (type === 'tap') {\n // if pointerEvent should make a double tap, create and fire a doubletap\n // PointerEvent and use that as the prevTap\n const prevTap = pointerEvent.double\n ? fire({\n interaction, pointer, event, eventTarget,\n type: 'doubletap',\n })\n : pointerEvent;\n\n interaction.prevTap = prevTap;\n interaction.tapTime = prevTap.timeStamp;\n }\n\n return pointerEvent;\n}\n\nfunction collectEventTargets ({ interaction, pointer, event, eventTarget, type }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n // do not fire a tap event if the pointer was moved before being lifted\n if (type === 'tap' && (interaction.pointerWasMoved\n // or if the pointerup target is different to the pointerdown target\n || !(interaction.downTargets[pointerIndex] && interaction.downTargets[pointerIndex] === eventTarget))) {\n return [];\n }\n\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n path,\n targets: [],\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (type === 'hold') {\n signalArg.targets = filter(signalArg.targets, target =>\n target.eventable.options.holdDuration === interaction.holdTimers[pointerIndex].duration);\n }\n\n return signalArg.targets;\n}\n\nInteraction.signals.on('update-pointer-down', function ({ interaction, pointerIndex }) {\n interaction.holdTimers[pointerIndex] = { duration: Infinity, timeout: null };\n});\n\nInteraction.signals.on('remove-pointer', function ({ interaction, pointerIndex }) {\n interaction.holdTimers.splice(pointerIndex, 1);\n});\n\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget, duplicateMove }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n if (!duplicateMove && (!interaction.pointerIsDown || interaction.pointerWasMoved)) {\n if (interaction.pointerIsDown) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n\n fire({\n interaction, pointer, event, eventTarget,\n type: 'move',\n });\n }\n});\n\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget, pointerIndex }) {\n // copy event to be used in timeout for IE8\n const eventCopy = browser.isIE8? utils.extend({}, event) : event;\n\n const timer = interaction.holdTimers[pointerIndex];\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'hold',\n targets: [],\n path,\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (!signalArg.targets.length) { return; }\n\n let minDuration = Infinity;\n\n for (let i = 0; i < signalArg.targets.length; i++) {\n const target = signalArg.targets[i];\n const holdDuration = target.eventable.options.holdDuration;\n\n if (holdDuration < minDuration) {\n minDuration = holdDuration;\n }\n }\n\n timer.duration = minDuration;\n timer.timeout = setTimeout(function () {\n fire({\n interaction, eventCopy, eventTarget,\n pointer: browser.isIE8? eventCopy : pointer,\n type: 'hold',\n });\n }, minDuration);\n});\n\nInteraction.signals.on('up', ({ interaction, pointer, event, eventTarget }) => {\n if (!interaction.pointerWasMoved) {\n fire({ interaction, eventTarget, pointer, event, type: 'tap' });\n }\n});\n\n['up', 'cancel'].forEach(function (signalName) {\n Interaction.signals.on(signalName, function ({ interaction, pointerIndex }) {\n if (interaction.holdTimers[pointerIndex]) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n });\n});\n\nfunction createSignalListener (type) {\n return function ({ interaction, pointer, event, eventTarget }) {\n fire({ interaction, eventTarget, pointer, event, type });\n };\n}\n\nfor (let i = 0; i < simpleSignals.length; i++) {\n Interaction.signals.on(simpleSignals[i], createSignalListener(simpleEvents[i]));\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.prevTap = null; // the most recent tap event on this interaction\n interaction.tapTime = 0; // time of the most recent tap event\n interaction.holdTimers = []; // [{ duration, timeout }]\n});\n\ndefaults.pointerEvents = pointerEvents.defaults;\nmodule.exports = pointerEvents;\n","const pointerEvents = require('./base');\nconst Interaction = require('../Interaction');\n\npointerEvents.signals.on('new', onNew);\npointerEvents.signals.on('fired', onFired);\n\nfor (const signal of ['move', 'up', 'cancel', 'endall']) {\n Interaction.signals.on(signal, endHoldRepeat);\n}\n\nfunction onNew ({ pointerEvent }) {\n if (pointerEvent.type !== 'hold') { return; }\n\n pointerEvent.count = (pointerEvent.count || 0) + 1;\n}\n\nfunction onFired ({ interaction, pointerEvent, eventTarget, targets }) {\n if (pointerEvent.type !== 'hold' || !targets.length) { return; }\n\n // get the repeat interval from the first eventable\n const interval = targets[0].eventable.options.holdRepeatInterval;\n\n // don't repeat if the interval is 0 or less\n if (interval <= 0) { return; }\n\n // set a timeout to fire the holdrepeat event\n interaction.holdIntervalHandle = setTimeout(function () {\n pointerEvents.fire({\n interaction,\n eventTarget,\n type: 'hold',\n pointer: pointerEvent,\n event: pointerEvent,\n });\n }, interval);\n}\n\nfunction endHoldRepeat ({ interaction }) {\n // set the interaction's holdStopTime property\n // to stop further holdRepeat events\n if (interaction.holdIntervalHandle) {\n clearInterval(interaction.holdIntervalHandle);\n interaction.holdIntervalHandle = null;\n }\n}\n\n// don't repeat by default\npointerEvents.defaults.holdRepeatInterval = 0;\npointerEvents.types.push('holdrepeat');\n\nmodule.exports = {\n onNew,\n onFired,\n endHoldRepeat,\n};\n","const pointerEvents = require('./base');\nconst Interactable = require('../Interactable');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\nconst scope = require('../scope');\nconst extend = require('../utils/extend');\nconst { merge } = require('../utils/arr');\n\npointerEvents.signals.on('collect-targets', function ({ targets, element, type, eventTarget }) {\n function collectSelectors (interactable, selector, context) {\n const els = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && is.element(element)\n && domUtils.matchesSelector(element, selector, els)\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n const interactable = scope.interactables.get(element);\n\n if (interactable) {\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n scope.interactables.forEachSelector(collectSelectors, element);\n});\n\nInteractable.signals.on('new', function ({ interactable }) {\n interactable.events.getRect = function (element) {\n return interactable.getRect(element);\n };\n});\n\nInteractable.signals.on('set', function ({ interactable, options }) {\n extend(interactable.events.options, pointerEvents.defaults);\n extend(interactable.events.options, options);\n});\n\nmerge(Interactable.eventTypes, pointerEvents.types);\n\nInteractable.prototype.pointerEvents = function (options) {\n extend(this.events.options, options);\n\n return this;\n};\n\nconst __backCompatOption = Interactable.prototype._backCompatOption;\n\nInteractable.prototype._backCompatOption = function (optionName, newValue) {\n const ret = __backCompatOption.call(this, optionName, newValue);\n\n if (ret === this) {\n this.events.options[optionName] = newValue;\n }\n\n return ret;\n};\n\nInteractable.settingsMethods.push('pointerEvents');\n","const utils = require('./utils');\nconst events = require('./utils/events');\nconst signals = require('./utils/Signals').new();\n\nconst scope = {\n signals,\n events,\n utils,\n\n // main document\n document: require('./utils/domObjects').document,\n // all documents being listened to\n documents: [],\n\n addDocument: function (doc, win) {\n // do nothing if document is already known\n if (utils.contains(scope.documents, doc)) { return false; }\n\n win = win || scope.getWindow(doc);\n\n scope.documents.push(doc);\n events.documents.push(doc);\n\n // don't add an unload event for the main document\n // so that the page may be cached in browser history\n if (doc !== scope.document) {\n events.add(win, 'unload', scope.onWindowUnload);\n }\n\n signals.fire('add-document', { doc, win });\n },\n\n removeDocument: function (doc, win) {\n const index = utils.indexOf(scope.documents, doc);\n\n win = win || scope.getWindow(doc);\n\n events.remove(win, 'unload', scope.onWindowUnload);\n\n scope.documents.splice(index, 1);\n events.documents.splice(index, 1);\n\n signals.fire('remove-document', { win, doc });\n },\n\n onWindowUnload: function () {\n scope.removeDocument(this.document, this);\n },\n};\n\nmodule.exports = scope;\n","const { indexOf } = require('./arr');\n\nclass Signals {\n constructor () {\n this.listeners = {\n // signalName: [listeners],\n };\n }\n\n on (name, listener) {\n if (!this.listeners[name]) {\n this.listeners[name] = [listener];\n return;\n }\n\n this.listeners[name].push(listener);\n }\n\n off (name, listener) {\n if (!this.listeners[name]) { return; }\n\n const index = indexOf(this.listeners[name], listener);\n\n if (index !== -1) {\n this.listeners[name].splice(index, 1);\n }\n }\n\n fire (name, arg) {\n const targetListeners = this.listeners[name];\n\n if (!targetListeners) { return; }\n\n for (let i = 0; i < targetListeners.length; i++) {\n if (targetListeners[i](arg, name) === false) {\n return;\n }\n }\n }\n}\n\nSignals.new = function () {\n return new Signals();\n};\n\nmodule.exports = Signals;\n","function indexOf (array, target) {\n for (let i = 0, len = array.length; i < len; i++) {\n if (array[i] === target) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction contains (array, target) {\n return indexOf(array, target) !== -1;\n}\n\nfunction merge (target, source) {\n for (let i = 0; i < source.length; i++) {\n target.push(source[i]);\n }\n\n return target;\n}\n\nfunction filter (array, test) {\n const result = [];\n\n for (let i = 0; i < array.length; i++) {\n if (test(array[i])) {\n result.push(array[i]);\n }\n }\n\n return result;\n}\n\nmodule.exports = {\n indexOf,\n contains,\n merge,\n filter,\n};\n","const { window } = require('./window');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst Element = domObjects.Element;\nconst navigator = window.navigator;\n\nconst browser = {\n // Does the browser support touch input?\n supportsTouch: !!(('ontouchstart' in window) || is.function(window.DocumentTouch)\n && domObjects.document instanceof window.DocumentTouch),\n\n // Does the browser support PointerEvents\n supportsPointerEvent: !!domObjects.PointerEvent,\n\n isIE8: ('attachEvent' in window) && !('addEventListener' in window),\n\n // Opera Mobile must be handled differently\n isOperaMobile: (navigator.appName === 'Opera'\n && browser.supportsTouch\n && navigator.userAgent.match('Presto')),\n\n // scrolling doesn't change the result of getClientRects on iOS 7\n isIOS7: (/iP(hone|od|ad)/.test(navigator.platform)\n && /OS 7[^\\d]/.test(navigator.appVersion)),\n\n isIe9OrOlder: /MSIE (8|9)/.test(navigator.userAgent),\n\n // prefix matchesSelector\n prefixedMatchesSelector: 'matches' in Element.prototype\n ? 'matches': 'webkitMatchesSelector' in Element.prototype\n ? 'webkitMatchesSelector': 'mozMatchesSelector' in Element.prototype\n ? 'mozMatchesSelector': 'oMatchesSelector' in Element.prototype\n ? 'oMatchesSelector': 'msMatchesSelector',\n\n useMatchesSelectorPolyfill: false,\n\n pEventTypes: (domObjects.PointerEvent\n ? (domObjects.PointerEvent === window.MSPointerEvent\n ? {\n up: 'MSPointerUp',\n down: 'MSPointerDown',\n over: 'mouseover',\n out: 'mouseout',\n move: 'MSPointerMove',\n cancel: 'MSPointerCancel',\n }\n : {\n up: 'pointerup',\n down: 'pointerdown',\n over: 'pointerover',\n out: 'pointerout',\n move: 'pointermove',\n cancel: 'pointercancel',\n })\n : null),\n\n // because Webkit and Opera still use 'mousewheel' event type\n wheelEvent: 'onmousewheel' in domObjects.document? 'mousewheel': 'wheel',\n\n};\n\nbrowser.useMatchesSelectorPolyfill = !is.function(Element.prototype[browser.prefixedMatchesSelector]);\n\nmodule.exports = browser;\n","const domObjects = {};\nconst win = require('./window').window;\n\nfunction blank () {}\n\ndomObjects.document = win.document;\ndomObjects.DocumentFragment = win.DocumentFragment || blank;\ndomObjects.SVGElement = win.SVGElement || blank;\ndomObjects.SVGSVGElement = win.SVGSVGElement || blank;\ndomObjects.SVGElementInstance = win.SVGElementInstance || blank;\ndomObjects.Element = win.Element || blank;\ndomObjects.HTMLElement = win.HTMLElement || domObjects.Element;\n\ndomObjects.Event = win.Event;\ndomObjects.Touch = win.Touch || blank;\ndomObjects.PointerEvent = (win.PointerEvent || win.MSPointerEvent);\n\nmodule.exports = domObjects;\n","const win = require('./window');\nconst browser = require('./browser');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst domUtils = {\n nodeContains: function (parent, child) {\n while (child) {\n if (child === parent) {\n return true;\n }\n\n child = child.parentNode;\n }\n\n return false;\n },\n\n closest: function (element, selector) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) { return element; }\n\n element = domUtils.parentNode(element);\n }\n\n return null;\n },\n\n parentNode: function (node) {\n let parent = node.parentNode;\n\n if (is.docFrag(parent)) {\n // skip past #shado-root fragments\n while ((parent = parent.host) && is.docFrag(parent)) {\n continue;\n }\n\n return parent;\n }\n\n return parent;\n },\n\n // taken from http://tanalin.com/en/blog/2012/12/matches-selector-ie8/ and modified\n matchesSelectorPolyfill: browser.useMatchesSelectorPolyfill\n ? function (element, selector, elems) {\n elems = elems || element.parentNode.querySelectorAll(selector);\n\n for (let i = 0, len = elems.length; i < len; i++) {\n if (elems[i] === element) {\n return true;\n }\n }\n\n return false;\n }\n : null,\n\n matchesSelector: function (element, selector, nodeList) {\n if (browser.useMatchesSelectorPolyfill) {\n return domUtils.matchesSelectorPolyfill(element, selector, nodeList);\n }\n\n // remove /deep/ from selectors if shadowDOM polyfill is used\n if (win.window !== win.realWindow) {\n selector = selector.replace(/\\/deep\\//g, ' ');\n }\n\n return element[browser.prefixedMatchesSelector](selector);\n },\n\n // Test for the element that's \"above\" all other qualifiers\n indexOfDeepestElement: function (elements) {\n let deepestZoneParents = [];\n let dropzoneParents = [];\n let dropzone;\n let deepestZone = elements[0];\n let index = deepestZone? 0: -1;\n let parent;\n let child;\n let i;\n let n;\n\n for (i = 1; i < elements.length; i++) {\n dropzone = elements[i];\n\n // an element might belong to multiple selector dropzones\n if (!dropzone || dropzone === deepestZone) {\n continue;\n }\n\n if (!deepestZone) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n // check if the deepest or current are document.documentElement or document.rootElement\n // - if the current dropzone is, do nothing and continue\n if (dropzone.parentNode === dropzone.ownerDocument) {\n continue;\n }\n // - if deepest is, update with the current dropzone and continue to next\n else if (deepestZone.parentNode === dropzone.ownerDocument) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n if (!deepestZoneParents.length) {\n parent = deepestZone;\n while (parent.parentNode && parent.parentNode !== parent.ownerDocument) {\n deepestZoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n }\n\n // if this element is an svg element and the current deepest is\n // an HTMLElement\n if (deepestZone instanceof domObjects.HTMLElement\n && dropzone instanceof domObjects.SVGElement\n && !(dropzone instanceof domObjects.SVGSVGElement)) {\n\n if (dropzone === deepestZone.parentNode) {\n continue;\n }\n\n parent = dropzone.ownerSVGElement;\n }\n else {\n parent = dropzone;\n }\n\n dropzoneParents = [];\n\n while (parent.parentNode !== parent.ownerDocument) {\n dropzoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n\n n = 0;\n\n // get (position of last common ancestor) + 1\n while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) {\n n++;\n }\n\n const parents = [\n dropzoneParents[n - 1],\n dropzoneParents[n],\n deepestZoneParents[n],\n ];\n\n child = parents[0].lastChild;\n\n while (child) {\n if (child === parents[1]) {\n deepestZone = dropzone;\n index = i;\n deepestZoneParents = [];\n\n break;\n }\n else if (child === parents[2]) {\n break;\n }\n\n child = child.previousSibling;\n }\n }\n\n return index;\n },\n\n matchesUpTo: function (element, selector, limit) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) {\n return true;\n }\n\n element = domUtils.parentNode(element);\n\n if (element === limit) {\n return domUtils.matchesSelector(element, selector);\n }\n }\n\n return false;\n },\n\n getActualElement: function (element) {\n return (element instanceof domObjects.SVGElementInstance\n ? element.correspondingUseElement\n : element);\n },\n\n getScrollXY: function (relevantWindow) {\n relevantWindow = relevantWindow || win.window;\n return {\n x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft,\n y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop,\n };\n },\n\n getElementClientRect: function (element) {\n const clientRect = (element instanceof domObjects.SVGElement\n ? element.getBoundingClientRect()\n : element.getClientRects()[0]);\n\n return clientRect && {\n left : clientRect.left,\n right : clientRect.right,\n top : clientRect.top,\n bottom: clientRect.bottom,\n width : clientRect.width || clientRect.right - clientRect.left,\n height: clientRect.height || clientRect.bottom - clientRect.top,\n };\n },\n\n getElementRect: function (element) {\n const clientRect = domUtils.getElementClientRect(element);\n\n if (!browser.isIOS7 && clientRect) {\n const scroll = domUtils.getScrollXY(win.getWindow(element));\n\n clientRect.left += scroll.x;\n clientRect.right += scroll.x;\n clientRect.top += scroll.y;\n clientRect.bottom += scroll.y;\n }\n\n return clientRect;\n },\n\n getPath: function (element) {\n const path = [];\n\n while (element) {\n path.push(element);\n element = domUtils.parentNode(element);\n }\n\n return path;\n },\n\n trySelector: value => {\n if (!is.string(value)) { return false; }\n\n // an exception will be raised if it is invalid\n domObjects.document.querySelector(value);\n return true;\n },\n};\n\nmodule.exports = domUtils;\n","const is = require('./is');\nconst domUtils = require('./domUtils');\nconst pExtend = require('./pointerExtend');\n\nconst { window, getWindow } = require('./window');\nconst { indexOf, contains } = require('./arr');\n\nconst useAttachEvent = ('attachEvent' in window) && !('addEventListener' in window);\nconst addEvent = useAttachEvent? 'attachEvent': 'addEventListener';\nconst removeEvent = useAttachEvent? 'detachEvent': 'removeEventListener';\nconst on = useAttachEvent? 'on': '';\n\nconst elements = [];\nconst targets = [];\nconst attachedListeners = [];\n\n// {\n// type: {\n// selectors: ['selector', ...],\n// contexts : [document, ...],\n// listeners: [[listener, capture, passive], ...]\n// }\n// }\nconst delegatedEvents = {};\n\nconst documents = [];\n\nconst supportsOptions = !useAttachEvent && (() => {\n let supported = false;\n\n window.document.createElement('div').addEventListener('test', null, {\n get capture () { supported = true; },\n });\n\n return supported;\n})();\n\nfunction add (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n let elementIndex = indexOf(elements, element);\n let target = targets[elementIndex];\n\n if (!target) {\n target = {\n events: {},\n typeCount: 0,\n };\n\n elementIndex = elements.push(element) - 1;\n targets.push(target);\n\n attachedListeners.push(useAttachEvent\n ? {\n supplied: [],\n wrapped : [],\n useCount: [],\n }\n : null);\n }\n\n if (!target.events[type]) {\n target.events[type] = [];\n target.typeCount++;\n }\n\n if (!contains(target.events[type], listener)) {\n let ret;\n\n if (useAttachEvent) {\n const { supplied, wrapped, useCount } = attachedListeners[elementIndex];\n const listenerIndex = indexOf(supplied, listener);\n\n const wrappedListener = wrapped[listenerIndex] || function (event) {\n if (!event.immediatePropagationStopped) {\n event.target = event.srcElement;\n event.currentTarget = element;\n\n event.preventDefault = event.preventDefault || preventDef;\n event.stopPropagation = event.stopPropagation || stopProp;\n event.stopImmediatePropagation = event.stopImmediatePropagation || stopImmProp;\n\n if (/mouse|click/.test(event.type)) {\n event.pageX = event.clientX + getWindow(element).document.documentElement.scrollLeft;\n event.pageY = event.clientY + getWindow(element).document.documentElement.scrollTop;\n }\n\n listener(event);\n }\n };\n\n ret = element[addEvent](on + type, wrappedListener, !!options.capture);\n\n if (listenerIndex === -1) {\n supplied.push(listener);\n wrapped.push(wrappedListener);\n useCount.push(1);\n }\n else {\n useCount[listenerIndex]++;\n }\n }\n else {\n ret = element[addEvent](type, listener, supportsOptions? options : !!options.capture);\n }\n target.events[type].push(listener);\n\n return ret;\n }\n}\n\nfunction remove (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const elementIndex = indexOf(elements, element);\n const target = targets[elementIndex];\n\n if (!target || !target.events) {\n return;\n }\n\n let wrappedListener = listener;\n let listeners;\n let listenerIndex;\n\n if (useAttachEvent) {\n listeners = attachedListeners[elementIndex];\n listenerIndex = indexOf(listeners.supplied, listener);\n wrappedListener = listeners.wrapped[listenerIndex];\n }\n\n if (type === 'all') {\n for (type in target.events) {\n if (target.events.hasOwnProperty(type)) {\n remove(element, type, 'all');\n }\n }\n return;\n }\n\n if (target.events[type]) {\n const len = target.events[type].length;\n\n if (listener === 'all') {\n for (let i = 0; i < len; i++) {\n remove(element, type, target.events[type][i], options);\n }\n return;\n }\n else {\n for (let i = 0; i < len; i++) {\n if (target.events[type][i] === listener) {\n element[removeEvent](on + type, wrappedListener, supportsOptions? options : !!options.capture);\n target.events[type].splice(i, 1);\n\n if (useAttachEvent && listeners) {\n listeners.useCount[listenerIndex]--;\n if (listeners.useCount[listenerIndex] === 0) {\n listeners.supplied.splice(listenerIndex, 1);\n listeners.wrapped.splice(listenerIndex, 1);\n listeners.useCount.splice(listenerIndex, 1);\n }\n }\n\n break;\n }\n }\n }\n\n if (target.events[type] && target.events[type].length === 0) {\n target.events[type] = null;\n target.typeCount--;\n }\n }\n\n if (!target.typeCount) {\n targets.splice(elementIndex, 1);\n elements.splice(elementIndex, 1);\n attachedListeners.splice(elementIndex, 1);\n }\n}\n\nfunction addDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n if (!delegatedEvents[type]) {\n delegatedEvents[type] = {\n selectors: [],\n contexts : [],\n listeners: [],\n };\n\n // add delegate listener functions\n for (let i = 0; i < documents.length; i++) {\n add(documents[i], type, delegateListener);\n add(documents[i], type, delegateUseCapture, true);\n }\n }\n\n const delegated = delegatedEvents[type];\n let index;\n\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n break;\n }\n }\n\n if (index === -1) {\n index = delegated.selectors.length;\n\n delegated.selectors.push(selector);\n delegated.contexts .push(context);\n delegated.listeners.push([]);\n }\n\n // keep listener and capture and passive flags\n delegated.listeners[index].push([listener, !!options.capture, options.passive]);\n}\n\nfunction removeDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const delegated = delegatedEvents[type];\n let matchFound = false;\n let index;\n\n if (!delegated) { return; }\n\n // count from last index of delegated to 0\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n // look for matching selector and context Node\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n\n const listeners = delegated.listeners[index];\n\n // each item of the listeners array is an array: [function, capture, passive]\n for (let i = listeners.length - 1; i >= 0; i--) {\n const [fn, capture, passive] = listeners[i];\n\n // check if the listener functions and capture and passive flags match\n if (fn === listener && capture === !!options.capture && passive === options.passive) {\n // remove the listener from the array of listeners\n listeners.splice(i, 1);\n\n // if all listeners for this interactable have been removed\n // remove the interactable from the delegated arrays\n if (!listeners.length) {\n delegated.selectors.splice(index, 1);\n delegated.contexts .splice(index, 1);\n delegated.listeners.splice(index, 1);\n\n // remove delegate function from context\n remove(context, type, delegateListener);\n remove(context, type, delegateUseCapture, true);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegatedEvents[type] = null;\n }\n }\n\n // only remove one listener\n matchFound = true;\n break;\n }\n }\n\n if (matchFound) { break; }\n }\n }\n}\n\n// bound to the interactable context when a DOM event\n// listener is added to a selector interactable\nfunction delegateListener (event, optionalArg) {\n const options = getOptions(optionalArg);\n const fakeEvent = {};\n const delegated = delegatedEvents[event.type];\n const eventTarget = (domUtils.getActualElement(event.path\n ? event.path[0]\n : event.target));\n let element = eventTarget;\n\n // duplicate the event so that currentTarget can be changed\n pExtend(fakeEvent, event);\n\n fakeEvent.originalEvent = event;\n fakeEvent.preventDefault = preventOriginalDefault;\n\n // climb up document tree looking for selector matches\n while (is.element(element)) {\n for (let i = 0; i < delegated.selectors.length; i++) {\n const selector = delegated.selectors[i];\n const context = delegated.contexts[i];\n\n if (domUtils.matchesSelector(element, selector)\n && domUtils.nodeContains(context, eventTarget)\n && domUtils.nodeContains(context, element)) {\n\n const listeners = delegated.listeners[i];\n\n fakeEvent.currentTarget = element;\n\n for (let j = 0; j < listeners.length; j++) {\n const [fn, capture, passive] = listeners[j];\n\n if (capture === !!options.capture && passive === options.passive) {\n fn(fakeEvent);\n }\n }\n }\n }\n\n element = domUtils.parentNode(element);\n }\n}\n\nfunction delegateUseCapture (event) {\n return delegateListener.call(this, event, true);\n}\n\nfunction preventDef () {\n this.returnValue = false;\n}\n\nfunction preventOriginalDefault () {\n this.originalEvent.preventDefault();\n}\n\nfunction stopProp () {\n this.cancelBubble = true;\n}\n\nfunction stopImmProp () {\n this.cancelBubble = true;\n this.immediatePropagationStopped = true;\n}\n\nfunction getOptions (param) {\n return is.object(param)? param : { capture: param };\n}\n\nmodule.exports = {\n add,\n remove,\n\n addDelegate,\n removeDelegate,\n\n delegateListener,\n delegateUseCapture,\n delegatedEvents,\n documents,\n\n useAttachEvent,\n supportsOptions,\n\n _elements: elements,\n _targets: targets,\n _attachedListeners: attachedListeners,\n};\n","module.exports = function extend (dest, source) {\n for (const prop in source) {\n dest[prop] = source[prop];\n }\n return dest;\n};\n","const {\n resolveRectLike,\n rectToXY,\n} = require('./rect');\n\nmodule.exports = function (target, element, action) {\n const actionOptions = target.options[action];\n const actionOrigin = actionOptions && actionOptions.origin;\n const origin = actionOrigin || target.options.origin;\n\n const originRect = resolveRectLike(origin, target, element, [target && element]);\n\n return rectToXY(originRect) || { x: 0, y: 0 };\n};\n","module.exports = (x, y) => Math.sqrt(x * x + y * y);\n","const extend = require('./extend');\nconst win = require('./window');\n\nconst utils = {\n warnOnce: function (method, message) {\n let warned = false;\n\n return function () {\n if (!warned) {\n win.window.console.warn(message);\n warned = true;\n }\n\n return method.apply(this, arguments);\n };\n },\n\n // http://stackoverflow.com/a/5634528/2280888\n _getQBezierValue: function (t, p1, p2, p3) {\n const iT = 1 - t;\n return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3;\n },\n\n getQuadraticCurvePoint: function (startX, startY, cpX, cpY, endX, endY, position) {\n return {\n x: utils._getQBezierValue(position, startX, cpX, endX),\n y: utils._getQBezierValue(position, startY, cpY, endY),\n };\n },\n\n // http://gizma.com/easing/\n easeOutQuad: function (t, b, c, d) {\n t /= d;\n return -c * t*(t-2) + b;\n },\n\n copyAction: function (dest, src) {\n dest.name = src.name;\n dest.axis = src.axis;\n dest.edges = src.edges;\n\n return dest;\n },\n\n is : require('./is'),\n extend : extend,\n hypot : require('./hypot'),\n getOriginXY: require('./getOriginXY'),\n};\n\nextend(utils, require('./arr'));\nextend(utils, require('./domUtils'));\nextend(utils, require('./pointerUtils'));\nextend(utils, require('./rect'));\n\nmodule.exports = utils;\n","const scope = require('../scope');\nconst utils = require('./index');\nconst browser = require('./browser');\n\nconst finder = {\n methodOrder: [ 'simulationResume', 'mouse', 'hasPointer', 'idle' ],\n\n search: function (pointer, eventType, eventTarget) {\n const mouseEvent = (/mouse/i.test(pointer.pointerType || eventType)\n // MSPointerEvent.MSPOINTER_TYPE_MOUSE\n || pointer.pointerType === 4);\n const pointerId = utils.getPointerId(pointer);\n const details = { pointer, pointerId, mouseEvent, eventType, eventTarget };\n\n for (const method of finder.methodOrder) {\n const interaction = finder[method](details);\n\n if (interaction) {\n return interaction;\n }\n }\n },\n\n // try to resume simulation with a new pointer\n simulationResume: function ({ mouseEvent, eventType, eventTarget }) {\n if (!/down|start/i.test(eventType)) {\n return null;\n }\n\n for (const interaction of scope.interactions) {\n let element = eventTarget;\n\n if (interaction.simulation && interaction.simulation.allowResume\n && (interaction.mouse === mouseEvent)) {\n while (element) {\n // if the element is the interaction element\n if (element === interaction.element) {\n return interaction;\n }\n element = utils.parentNode(element);\n }\n }\n }\n\n return null;\n },\n\n // if it's a mouse interaction\n mouse: function ({ pointerId, mouseEvent, eventType }) {\n if (!mouseEvent && (browser.supportsTouch || browser.supportsPointerEvent)) {\n return null;\n }\n\n let firstNonActive;\n\n for (const interaction of scope.interactions) {\n if (interaction.mouse) {\n // if it's a down event, skip interactions with running simulations\n if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; }\n\n // if the interaction is active, return it immediately\n if (interaction.interacting()) {\n return interaction;\n }\n // otherwise save it and look for another active interaction\n else if (!firstNonActive) {\n firstNonActive = interaction;\n }\n }\n }\n\n // if no active mouse interaction was found use the first inactive mouse\n // interaction\n if (firstNonActive) {\n return firstNonActive;\n }\n\n // Find any interaction specifically for mouse.\n // ignore the interaction if the eventType is a mousedown, and a simulation\n // is active\n for (const interaction of scope.interactions) {\n if (interaction.mouse && !(/down/.test(eventType) && interaction.simulation)) {\n return interaction;\n }\n }\n\n return null;\n },\n\n // get interaction that has this pointer\n hasPointer: function ({ pointerId }) {\n for (const interaction of scope.interactions) {\n if (utils.contains(interaction.pointerIds, pointerId)) {\n return interaction;\n }\n }\n },\n\n // get first idle interaction\n idle: function ({ mouseEvent }) {\n for (const interaction of scope.interactions) {\n // if there's already a pointer held down\n if (interaction.pointerIds.length === 1) {\n const target = interaction.target;\n // don't add this pointer if there is a target interactable and it\n // isn't gesturable\n if (target && !target.options.gesture.enabled) {\n continue;\n }\n }\n // maximum of 2 pointers per interaction\n else if (interaction.pointerIds.length >= 2) {\n continue;\n }\n\n if (!interaction.interacting() && (mouseEvent === interaction.mouse)) {\n return interaction;\n }\n }\n\n return null;\n },\n};\n\nmodule.exports = finder;\n","const win = require('./window');\nconst isWindow = require('./isWindow');\n\nconst is = {\n array : () => {},\n\n window : thing => thing === win.window || isWindow(thing),\n\n docFrag : thing => is.object(thing) && thing.nodeType === 11,\n\n object : thing => !!thing && (typeof thing === 'object'),\n\n function: thing => typeof thing === 'function',\n\n number : thing => typeof thing === 'number' ,\n\n bool : thing => typeof thing === 'boolean' ,\n\n string : thing => typeof thing === 'string' ,\n\n element: thing => {\n if (!thing || (typeof thing !== 'object')) { return false; }\n\n const _window = win.getWindow(thing) || win.window;\n\n return (/object|function/.test(typeof _window.Element)\n ? thing instanceof _window.Element //DOM2\n : thing.nodeType === 1 && typeof thing.nodeName === 'string');\n },\n};\n\nis.array = thing => (is.object(thing)\n && (typeof thing.length !== 'undefined')\n && is.function(thing.splice));\n\nmodule.exports = is;\n","module.exports = (thing) => !!(thing && thing.Window) && (thing instanceof thing.Window);\n","function pointerExtend (dest, source) {\n for (const prop in source) {\n const prefixedPropREs = module.exports.prefixedPropREs;\n let deprecated = false;\n\n // skip deprecated prefixed properties\n for (const vendor in prefixedPropREs) {\n if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) {\n deprecated = true;\n break;\n }\n }\n\n if (!deprecated && typeof source[prop] !== 'function') {\n dest[prop] = source[prop];\n }\n }\n return dest;\n}\n\npointerExtend.prefixedPropREs = {\n webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/,\n};\n\nmodule.exports = pointerExtend;\n","const hypot = require('./hypot');\nconst browser = require('./browser');\nconst dom = require('./domObjects');\nconst domUtils = require('./domUtils');\nconst is = require('./is');\nconst pointerExtend = require('./pointerExtend');\n\nconst pointerUtils = {\n copyCoords: function (dest, src) {\n dest.page = dest.page || {};\n dest.page.x = src.page.x;\n dest.page.y = src.page.y;\n\n dest.client = dest.client || {};\n dest.client.x = src.client.x;\n dest.client.y = src.client.y;\n\n dest.timeStamp = src.timeStamp;\n },\n\n setCoordDeltas: function (targetObj, prev, cur) {\n targetObj.page.x = cur.page.x - prev.page.x;\n targetObj.page.y = cur.page.y - prev.page.y;\n targetObj.client.x = cur.client.x - prev.client.x;\n targetObj.client.y = cur.client.y - prev.client.y;\n targetObj.timeStamp = cur.timeStamp - prev.timeStamp;\n\n // set pointer velocity\n const dt = Math.max(targetObj.timeStamp / 1000, 0.001);\n\n targetObj.page.speed = hypot(targetObj.page.x, targetObj.page.y) / dt;\n targetObj.page.vx = targetObj.page.x / dt;\n targetObj.page.vy = targetObj.page.y / dt;\n\n targetObj.client.speed = hypot(targetObj.client.x, targetObj.page.y) / dt;\n targetObj.client.vx = targetObj.client.x / dt;\n targetObj.client.vy = targetObj.client.y / dt;\n },\n\n isNativePointer: function (pointer) {\n return (pointer instanceof dom.Event || pointer instanceof dom.Touch);\n },\n\n // Get specified X/Y coords for mouse or event.touches[0]\n getXY: function (type, pointer, xy) {\n xy = xy || {};\n type = type || 'page';\n\n xy.x = pointer[type + 'X'];\n xy.y = pointer[type + 'Y'];\n\n return xy;\n },\n\n getPageXY: function (pointer, page) {\n page = page || {};\n\n // Opera Mobile handles the viewport and scrolling oddly\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n pointerUtils.getXY('screen', pointer, page);\n\n page.x += window.scrollX;\n page.y += window.scrollY;\n }\n else {\n pointerUtils.getXY('page', pointer, page);\n }\n\n return page;\n },\n\n getClientXY: function (pointer, client) {\n client = client || {};\n\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n // Opera Mobile handles the viewport and scrolling oddly\n pointerUtils.getXY('screen', pointer, client);\n }\n else {\n pointerUtils.getXY('client', pointer, client);\n }\n\n return client;\n },\n\n getPointerId: function (pointer) {\n return is.number(pointer.pointerId)? pointer.pointerId : pointer.identifier;\n },\n\n setCoords: function (targetObj, pointers, timeStamp) {\n const pointer = (pointers.length > 1\n ? pointerUtils.pointerAverage(pointers)\n : pointers[0]);\n\n const tmpXY = {};\n\n pointerUtils.getPageXY(pointer, tmpXY);\n targetObj.page.x = tmpXY.x;\n targetObj.page.y = tmpXY.y;\n\n pointerUtils.getClientXY(pointer, tmpXY);\n targetObj.client.x = tmpXY.x;\n targetObj.client.y = tmpXY.y;\n\n targetObj.timeStamp = is.number(timeStamp) ? timeStamp :new Date().getTime();\n },\n\n pointerExtend: pointerExtend,\n\n getTouchPair: function (event) {\n const touches = [];\n\n // array of touches is supplied\n if (is.array(event)) {\n touches[0] = event[0];\n touches[1] = event[1];\n }\n // an event\n else {\n if (event.type === 'touchend') {\n if (event.touches.length === 1) {\n touches[0] = event.touches[0];\n touches[1] = event.changedTouches[0];\n }\n else if (event.touches.length === 0) {\n touches[0] = event.changedTouches[0];\n touches[1] = event.changedTouches[1];\n }\n }\n else {\n touches[0] = event.touches[0];\n touches[1] = event.touches[1];\n }\n }\n\n return touches;\n },\n\n pointerAverage: function (pointers) {\n const average = {\n pageX : 0,\n pageY : 0,\n clientX: 0,\n clientY: 0,\n screenX: 0,\n screenY: 0,\n };\n\n for (const pointer of pointers) {\n for (const prop in average) {\n average[prop] += pointer[prop];\n }\n }\n for (const prop in average) {\n average[prop] /= pointers.length;\n }\n\n return average;\n },\n\n touchBBox: function (event) {\n if (!event.length && !(event.touches && event.touches.length > 1)) {\n return;\n }\n\n const touches = pointerUtils.getTouchPair(event);\n const minX = Math.min(touches[0].pageX, touches[1].pageX);\n const minY = Math.min(touches[0].pageY, touches[1].pageY);\n const maxX = Math.max(touches[0].pageX, touches[1].pageX);\n const maxY = Math.max(touches[0].pageY, touches[1].pageY);\n\n return {\n x: minX,\n y: minY,\n left: minX,\n top: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n },\n\n touchDistance: function (event, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n\n\n const dx = touches[0][sourceX] - touches[1][sourceX];\n const dy = touches[0][sourceY] - touches[1][sourceY];\n\n return hypot(dx, dy);\n },\n\n touchAngle: function (event, prevAngle, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n const dx = touches[1][sourceX] - touches[0][sourceX];\n const dy = touches[1][sourceY] - touches[0][sourceY];\n const angle = 180 * Math.atan2(dy , dx) / Math.PI;\n\n return angle;\n },\n\n getPointerType: function (pointer, interaction) {\n // if the PointerEvent API isn't available, then the pointer must be ither\n // a MouseEvent or TouchEvent\n if (interaction.mouse) { return 'mouse'; }\n if (!browser.supportsPointerEvent) { return 'touch'; }\n\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : [undefined, undefined,'touch', 'pen', 'mouse'][pointer.pointerType];\n },\n\n // [ event.target, event.currentTarget ]\n getEventTargets: function (event) {\n return [\n domUtils.getActualElement(event.path ? event.path[0] : event.target),\n domUtils.getActualElement(event.currentTarget),\n ];\n },\n};\n\nmodule.exports = pointerUtils;\n","const { window } = require('./window');\n\nconst vendors = ['ms', 'moz', 'webkit', 'o'];\nlet lastTime = 0;\nlet request;\nlet cancel;\n\nfor (let x = 0; x < vendors.length && !window.requestAnimationFrame; x++) {\n request = window[vendors[x] + 'RequestAnimationFrame'];\n cancel = window[vendors[x] +'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n}\n\nif (!request) {\n request = function (callback) {\n const currTime = new Date().getTime();\n const timeToCall = Math.max(0, 16 - (currTime - lastTime));\n const id = setTimeout(function () { callback(currTime + timeToCall); },\n timeToCall);\n\n lastTime = currTime + timeToCall;\n return id;\n };\n}\n\nif (!cancel) {\n cancel = function (id) {\n clearTimeout(id);\n };\n}\n\nmodule.exports = {\n request,\n cancel,\n};\n","const extend = require('./extend');\nconst is = require('./is');\nconst {\n closest,\n parentNode,\n getElementRect,\n} = require('./domUtils');\n\nconst rectUtils = {\n getStringOptionResult: function (value, interactable, element) {\n if (!is.string(value)) {\n return null;\n }\n\n if (value === 'parent') {\n value = parentNode(element);\n }\n else if (value === 'self') {\n value = interactable.getRect(element);\n }\n else {\n value = closest(element, value);\n }\n\n return value;\n },\n\n resolveRectLike: function (value, interactable, element, functionArgs) {\n value = rectUtils.getStringOptionResult(value, interactable, element) || value;\n\n if (is.function(value)) {\n value = value.apply(null, functionArgs);\n }\n\n if (is.element(value)) {\n value = getElementRect(value);\n }\n\n return value;\n },\n\n rectToXY: function (rect) {\n return rect && {\n x: 'x' in rect ? rect.x : rect.left,\n y: 'y' in rect ? rect.y : rect.top,\n };\n },\n\n xywhToTlbr: function (rect) {\n if (rect && !('left' in rect && 'top' in rect)) {\n rect = extend({}, rect);\n\n rect.left = rect.x || 0;\n rect.top = rect.y || 0;\n rect.right = rect.right || (rect.left + rect.width);\n rect.bottom = rect.bottom || (rect.top + rect.height);\n }\n\n return rect;\n },\n\n tlbrToXywh: function (rect) {\n if (rect && !('x' in rect && 'y' in rect)) {\n rect = extend({}, rect);\n\n rect.x = rect.left || 0;\n rect.top = rect.top || 0;\n rect.width = rect.width || (rect.right - rect.x);\n rect.height = rect.height || (rect.bottom - rect.y);\n }\n\n return rect;\n },\n};\n\nmodule.exports = rectUtils;\n","const win = module.exports;\nconst isWindow = require('./isWindow');\n\nfunction init (window) {\n // get wrapped window if using Shadow DOM polyfill\n\n win.realWindow = window;\n\n // create a TextNode\n const el = window.document.createTextNode('');\n\n // check if it's wrapped by a polyfill\n if (el.ownerDocument !== window.document\n && typeof window.wrap === 'function'\n && window.wrap(el) === el) {\n // use wrapped window\n window = window.wrap(window);\n }\n\n win.window = window;\n}\n\nif (typeof window === 'undefined') {\n win.window = undefined;\n win.realWindow = undefined;\n}\nelse {\n init(window);\n}\n\nwin.getWindow = function getWindow (node) {\n if (isWindow(node)) {\n return node;\n }\n\n const rootNode = (node.ownerDocument || node);\n\n return rootNode.defaultView || rootNode.parentWindow || win.window;\n};\n\nwin.init = init;\n"]} \ No newline at end of file +{"version":3,"sources":["src/minHeader.js","src/header.js","index.js","src/Eventable.js","src/InteractEvent.js","src/Interactable.js","src/Interaction.js","src/actions/base.js","src/actions/drag.js","src/actions/drop.js","src/actions/gesture.js","src/actions/resize.js","src/autoScroll.js","src/autoStart/InteractableMethods.js","src/autoStart/base.js","src/autoStart/delay.js","src/autoStart/drag.js","src/autoStart/gesture.js","src/autoStart/resize.js","src/defaultOptions.js","src/index.js","src/inertia.js","src/interact.js","src/interactablePreventDefault.js","src/legacyBrowsers.js","src/modifiers/index.js","src/modifiers/restrict.js","src/modifiers/restrictEdges.js","src/modifiers/restrictSize.js","src/modifiers/snap.js","src/modifiers/snapSize.js","src/pointerEvents/PointerEvent.js","src/pointerEvents/base.js","src/pointerEvents/holdRepeat.js","src/pointerEvents/interactableTargets.js","src/scope.js","src/utils/Signals.js","src/utils/arr.js","src/utils/browser.js","src/utils/domObjects.js","src/utils/domUtils.js","src/utils/events.js","src/utils/extend.js","src/utils/getOriginXY.js","src/utils/hypot.js","src/utils/index.js","src/utils/interactionFinder.js","src/utils/is.js","src/utils/isWindow.js","src/utils/pointerExtend.js","src/utils/pointerUtils.js","src/utils/raf.js","src/utils/rect.js","src/utils/window.js"],"names":[],"mappings":"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","file":"interact.min.js","sourceRoot":"","sourcesContent":["/* interact.js v1.3.0-alpha.4+sha.7970416-dirty | https://raw.github.com/taye/interact.js/master/LICENSE */\n","/**\n * interact.js v1.3.0-alpha.4+sha.7970416-dirty\n *\n * Copyright (c) 2012-2017 Taye Adeyemi \n * Open source under the MIT License.\n * https://raw.github.com/taye/interact.js/master/LICENSE\n */\n","/*\n * In a (windowless) server environment this file exports a factory function\n * that takes the window to use.\n *\n * var interact = require('interact.js')(windowObject);\n *\n * See https://github.com/taye/interact.js/issues/187\n */\nif (typeof window === 'undefined') {\n module.exports = function (window) {\n require('./src/utils/window').init(window);\n\n return require('./src/index');\n };\n}\nelse {\n module.exports = require('./src/index');\n}\n","const { indexOf } = require('./utils/arr');\nconst extend = require('./utils/extend.js');\n\nfunction fireUntilImmediateStopped (event, listeners) {\n for (let i = 0, len = listeners.length; i < len && !event.immediatePropagationStopped; i++) {\n listeners[i](event);\n }\n}\n\nclass Eventable {\n\n constructor (options) {\n this.options = extend({}, options || {});\n }\n\n fire (event) {\n let listeners;\n const onEvent = 'on' + event.type;\n const global = this.global;\n\n // Interactable#on() listeners\n if ((listeners = this[event.type])) {\n fireUntilImmediateStopped(event, listeners);\n }\n\n // interactable.onevent listener\n if (this[onEvent]) {\n this[onEvent](event);\n }\n\n // interact.on() listeners\n if (!event.propagationStopped && global && (listeners = global[event.type])) {\n fireUntilImmediateStopped(event, listeners);\n }\n }\n\n on (eventType, listener) {\n // if this type of event was never bound\n if (this[eventType]) {\n this[eventType].push(listener);\n }\n else {\n this[eventType] = [listener];\n }\n }\n\n off (eventType, listener) {\n // if it is an action event type\n const eventList = this[eventType];\n const index = eventList? indexOf(eventList, listener) : -1;\n\n if (index !== -1) {\n eventList.splice(index, 1);\n }\n\n if (eventList && eventList.length === 0 || !listener) {\n this[eventType] = listener;\n }\n }\n}\n\nmodule.exports = Eventable;\n","const extend = require('./utils/extend');\nconst getOriginXY = require('./utils/getOriginXY');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nclass InteractEvent {\n constructor (interaction, event, action, phase, element, related, preEnd = false) {\n const target = interaction.target;\n const deltaSource = (target && target.options || defaults).deltaSource;\n const origin = getOriginXY(target, element, action);\n const starting = phase === 'start';\n const ending = phase === 'end';\n const coords = starting? interaction.startCoords : interaction.curCoords;\n const prevEvent = interaction.prevEvent;\n\n element = element || interaction.element;\n\n const page = extend({}, coords.page);\n const client = extend({}, coords.client);\n\n page.x -= origin.x;\n page.y -= origin.y;\n\n client.x -= origin.x;\n client.y -= origin.y;\n\n this.ctrlKey = event.ctrlKey;\n this.altKey = event.altKey;\n this.shiftKey = event.shiftKey;\n this.metaKey = event.metaKey;\n this.button = event.button;\n this.buttons = event.buttons;\n this.target = element;\n this.currentTarget = element;\n this.relatedTarget = related || null;\n this.preEnd = preEnd;\n this.type = action + (phase || '');\n this.interaction = interaction;\n this.interactable = target;\n\n this.t0 = starting ? interaction.downTimes[interaction.downTimes.length - 1]\n : prevEvent.t0;\n\n const signalArg = {\n interaction,\n event,\n action,\n phase,\n element,\n related,\n page,\n client,\n coords,\n starting,\n ending,\n deltaSource,\n iEvent: this,\n };\n\n signals.fire('set-xy', signalArg);\n\n if (ending) {\n // use previous coords when ending\n this.pageX = prevEvent.pageX;\n this.pageY = prevEvent.pageY;\n this.clientX = prevEvent.clientX;\n this.clientY = prevEvent.clientY;\n }\n else {\n this.pageX = page.x;\n this.pageY = page.y;\n this.clientX = client.x;\n this.clientY = client.y;\n }\n\n this.x0 = interaction.startCoords.page.x - origin.x;\n this.y0 = interaction.startCoords.page.y - origin.y;\n this.clientX0 = interaction.startCoords.client.x - origin.x;\n this.clientY0 = interaction.startCoords.client.y - origin.y;\n\n signals.fire('set-delta', signalArg);\n\n this.timeStamp = coords.timeStamp;\n this.dt = interaction.pointerDelta.timeStamp;\n this.duration = this.timeStamp - this.t0;\n\n // speed and velocity in pixels per second\n this.speed = interaction.pointerDelta[deltaSource].speed;\n this.velocityX = interaction.pointerDelta[deltaSource].vx;\n this.velocityY = interaction.pointerDelta[deltaSource].vy;\n\n this.swipe = (ending || phase === 'inertiastart')? this.getSwipe() : null;\n\n signals.fire('new', signalArg);\n }\n\n getSwipe () {\n const interaction = this.interaction;\n\n if (interaction.prevEvent.speed < 600\n || this.timeStamp - interaction.prevEvent.timeStamp > 150) {\n return null;\n }\n\n let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI;\n const overlap = 22.5;\n\n if (angle < 0) {\n angle += 360;\n }\n\n const left = 135 - overlap <= angle && angle < 225 + overlap;\n const up = 225 - overlap <= angle && angle < 315 + overlap;\n\n const right = !left && (315 - overlap <= angle || angle < 45 + overlap);\n const down = !up && 45 - overlap <= angle && angle < 135 + overlap;\n\n return {\n up,\n down,\n left,\n right,\n angle,\n speed: interaction.prevEvent.speed,\n velocity: {\n x: interaction.prevEvent.velocityX,\n y: interaction.prevEvent.velocityY,\n },\n };\n }\n\n preventDefault () {}\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n}\n\nsignals.on('set-delta', function ({ iEvent, interaction, starting, deltaSource }) {\n const prevEvent = starting? iEvent : interaction.prevEvent;\n\n if (deltaSource === 'client') {\n iEvent.dx = iEvent.clientX - prevEvent.clientX;\n iEvent.dy = iEvent.clientY - prevEvent.clientY;\n }\n else {\n iEvent.dx = iEvent.pageX - prevEvent.pageX;\n iEvent.dy = iEvent.pageY - prevEvent.pageY;\n }\n});\n\nInteractEvent.signals = signals;\n\nmodule.exports = InteractEvent;\n","const is = require('./utils/is');\nconst events = require('./utils/events');\nconst extend = require('./utils/extend');\nconst actions = require('./actions/base');\nconst scope = require('./scope');\nconst Eventable = require('./Eventable');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nconst {\n getElementRect,\n nodeContains,\n trySelector,\n} = require('./utils/domUtils');\nconst { getWindow } = require('./utils/window');\nconst { indexOf, contains } = require('./utils/arr');\nconst { wheelEvent } = require('./utils/browser');\n\n// all set interactables\nscope.interactables = [];\n\n/*\\\n * Interactable\n [ property ]\n **\n * Object type returned by @interact\n\\*/\nclass Interactable {\n constructor (target, options) {\n options = options || {};\n\n this.target = target;\n this.events = new Eventable();\n this._context = options.context || scope.document;\n this._win = getWindow(trySelector(target)? this._context : target);\n this._doc = this._win.document;\n\n signals.fire('new', {\n target,\n options,\n interactable: this,\n win: this._win,\n });\n\n scope.addDocument( this._doc, this._win );\n\n scope.interactables.push(this);\n\n this.set(options);\n }\n\n setOnEvents (action, phases) {\n const onAction = 'on' + action;\n\n if (is.function(phases.onstart) ) { this.events[onAction + 'start' ] = phases.onstart ; }\n if (is.function(phases.onmove) ) { this.events[onAction + 'move' ] = phases.onmove ; }\n if (is.function(phases.onend) ) { this.events[onAction + 'end' ] = phases.onend ; }\n if (is.function(phases.oninertiastart)) { this.events[onAction + 'inertiastart' ] = phases.oninertiastart ; }\n\n return this;\n }\n\n setPerAction (action, options) {\n // for all the default per-action options\n for (const option in options) {\n // if this option exists for this action\n if (option in defaults[action]) {\n // if the option in the options arg is an object value\n if (is.object(options[option])) {\n // duplicate the object\n this.options[action][option] = extend(this.options[action][option] || {}, options[option]);\n\n if (is.object(defaults.perAction[option]) && 'enabled' in defaults.perAction[option]) {\n this.options[action][option].enabled = options[option].enabled === false? false : true;\n }\n }\n else if (is.bool(options[option]) && is.object(defaults.perAction[option])) {\n this.options[action][option].enabled = options[option];\n }\n else if (options[option] !== undefined) {\n // or if it's not undefined, do a plain assignment\n this.options[action][option] = options[option];\n }\n }\n }\n }\n\n /*\\\n * Interactable.getRect\n [ method ]\n *\n * The default function to get an Interactables bounding rect. Can be\n * overridden using @Interactable.rectChecker.\n *\n - element (Element) #optional The element to measure.\n = (object) The object's bounding rectangle.\n o {\n o top : 0,\n o left : 0,\n o bottom: 0,\n o right : 0,\n o width : 0,\n o height: 0\n o }\n \\*/\n getRect (element) {\n element = element || this.target;\n\n if (is.string(this.target) && !(is.element(element))) {\n element = this._context.querySelector(this.target);\n }\n\n return getElementRect(element);\n }\n\n /*\\\n * Interactable.rectChecker\n [ method ]\n *\n * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n - checker (function) #optional A function which returns this Interactable's bounding rectangle. See @Interactable.getRect\n = (function | object) The checker function or this Interactable\n \\*/\n rectChecker (checker) {\n if (is.function(checker)) {\n this.getRect = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.getRect;\n\n return this;\n }\n\n return this.getRect;\n }\n\n _backCompatOption (optionName, newValue) {\n if (trySelector(newValue) || is.object(newValue)) {\n this.options[optionName] = newValue;\n\n for (const action of actions.names) {\n this.options[action][optionName] = newValue;\n }\n\n return this;\n }\n\n return this.options[optionName];\n }\n\n /*\\\n * Interactable.origin\n [ method ]\n *\n * Gets or sets the origin of the Interactable's element. The x and y\n * of the origin will be subtracted from action event coordinates.\n *\n - origin (object | string) #optional An object eg. { x: 0, y: 0 } or string 'parent', 'self' or any CSS selector\n * OR\n - origin (Element) #optional An HTML or SVG Element whose rect will be used\n **\n = (object) The current origin or this Interactable\n \\*/\n origin (newValue) {\n return this._backCompatOption('origin', newValue);\n }\n\n /*\\\n * Interactable.deltaSource\n [ method ]\n *\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n - newValue (string) #optional Use 'client' if you will be scrolling while interacting; Use 'page' if you want autoScroll to work\n = (string | object) The current deltaSource or this Interactable\n \\*/\n deltaSource (newValue) {\n if (newValue === 'page' || newValue === 'client') {\n this.options.deltaSource = newValue;\n\n return this;\n }\n\n return this.options.deltaSource;\n }\n\n /*\\\n * Interactable.context\n [ method ]\n *\n * Gets the selector context Node of the Interactable. The default is `window.document`.\n *\n = (Node) The context Node of this Interactable\n **\n \\*/\n context () {\n return this._context;\n }\n\n inContext (element) {\n return (this._context === element.ownerDocument\n || nodeContains(this._context, element));\n }\n\n /*\\\n * Interactable.fire\n [ method ]\n *\n * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n - iEvent (InteractEvent) The InteractEvent object to be fired on this Interactable\n = (Interactable) this Interactable\n \\*/\n fire (iEvent) {\n this.events.fire(iEvent);\n\n return this;\n }\n\n _onOffMultiple (method, eventType, listener, options) {\n if (is.string(eventType) && eventType.search(' ') !== -1) {\n eventType = eventType.trim().split(/ +/);\n }\n\n if (is.array(eventType)) {\n for (let i = 0; i < eventType.length; i++) {\n this[method](eventType[i], listener, options);\n }\n\n return true;\n }\n\n if (is.object(eventType)) {\n for (const prop in eventType) {\n this[method](prop, eventType[prop], listener);\n }\n\n return true;\n }\n }\n\n /*\\\n * Interactable.on\n [ method ]\n *\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n - eventType (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) This Interactable\n \\*/\n on (eventType, listener, options) {\n if (this._onOffMultiple('on', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.on(eventType, listener);\n }\n // delegated event for selector\n else if (is.string(this.target)) {\n events.addDelegate(this.target, this._context, eventType, listener, options);\n }\n else {\n events.add(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.off\n [ method ]\n *\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n - eventType (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) This Interactable\n \\*/\n off (eventType, listener, options) {\n if (this._onOffMultiple('off', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n // if it is an action event type\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.off(eventType, listener);\n }\n // delegated event\n else if (is.string(this.target)) {\n events.removeDelegate(this.target, this._context, eventType, listener, options);\n }\n // remove listener from this Interatable's element\n else {\n events.remove(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.set\n [ method ]\n *\n * Reset the options of this Interactable\n - options (object) The new settings to apply\n = (object) This Interactable\n \\*/\n set (options) {\n if (!is.object(options)) {\n options = {};\n }\n\n this.options = extend({}, defaults.base);\n\n const perActions = extend({}, defaults.perAction);\n\n for (const actionName in actions.methodDict) {\n const methodName = actions.methodDict[actionName];\n\n this.options[actionName] = extend({}, defaults[actionName]);\n\n this.setPerAction(actionName, perActions);\n\n this[methodName](options[actionName]);\n }\n\n for (const setting of Interactable.settingsMethods) {\n this.options[setting] = defaults.base[setting];\n\n if (setting in options) {\n this[setting](options[setting]);\n }\n }\n\n signals.fire('set', {\n options,\n interactable: this,\n });\n\n return this;\n }\n\n /*\\\n * Interactable.unset\n [ method ]\n *\n * Remove this interactable from the list of interactables and remove\n * it's action capabilities and event listeners\n *\n = (object) @interact\n \\*/\n unset () {\n events.remove(this.target, 'all');\n\n if (is.string(this.target)) {\n // remove delegated events\n for (const type in events.delegatedEvents) {\n const delegated = events.delegatedEvents[type];\n\n if (delegated.selectors[0] === this.target\n && delegated.contexts[0] === this._context) {\n\n delegated.selectors.splice(0, 1);\n delegated.contexts .splice(0, 1);\n delegated.listeners.splice(0, 1);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegated[type] = null;\n }\n }\n\n events.remove(this._context, type, events.delegateListener);\n events.remove(this._context, type, events.delegateUseCapture, true);\n }\n }\n else {\n events.remove(this, 'all');\n }\n\n signals.fire('unset', { interactable: this });\n\n scope.interactables.splice(indexOf(scope.interactables, this), 1);\n\n // Stop related interactions when an Interactable is unset\n for (const interaction of scope.interactions || []) {\n if (interaction.target === this && interaction.interacting()) {\n interaction.stop();\n }\n }\n\n return scope.interact;\n }\n}\n\nscope.interactables.indexOfElement = function indexOfElement (target, context) {\n context = context || scope.document;\n\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n if (interactable.target === target && interactable._context === context) {\n return i;\n }\n }\n return -1;\n};\n\nscope.interactables.get = function interactableGet (element, options, dontCheckInContext) {\n const ret = this[this.indexOfElement(element, options && options.context)];\n\n return ret && (is.string(element) || dontCheckInContext || ret.inContext(element))? ret : null;\n};\n\nscope.interactables.forEachSelector = function (callback, element) {\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n // skip non CSS selector targets and out of context elements\n if (!is.string(interactable.target)\n || (element && !interactable.inContext(element))) {\n continue;\n }\n\n const ret = callback(interactable, interactable.target, interactable._context, i, this);\n\n if (ret !== undefined) {\n return ret;\n }\n }\n};\n\n// all interact.js eventTypes\nInteractable.eventTypes = scope.eventTypes = [];\n\nInteractable.signals = signals;\n\nInteractable.settingsMethods = [ 'deltaSource', 'origin', 'preventDefault', 'rectChecker' ];\n\nmodule.exports = Interactable;\n","const scope = require('./scope');\nconst utils = require('./utils');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst domObjects = require('./utils/domObjects');\nconst finder = require('./utils/interactionFinder');\nconst signals = require('./utils/Signals').new();\n\nconst listeners = {};\nconst methodNames = [\n 'pointerDown', 'pointerMove', 'pointerUp',\n 'updatePointer', 'removePointer',\n];\n\n// for ignoring browser's simulated mouse events\nlet prevTouchTime = 0;\n\n// all active and idle interactions\nscope.interactions = [];\n\nclass Interaction {\n constructor ({ pointerType }) {\n this.target = null; // current interactable being interacted with\n this.element = null; // the target element of the interactable\n\n this.prepared = { // action that's ready to be fired on next move event\n name : null,\n axis : null,\n edges: null,\n };\n\n // keep track of added pointers\n this.pointers = [];\n this.pointerIds = [];\n this.downTargets = [];\n this.downTimes = [];\n\n // Previous native pointer move event coordinates\n this.prevCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n // current native pointer move event coordinates\n this.curCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Starting InteractEvent pointer coordinates\n this.startCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Change in coordinates and time of the pointer\n this.pointerDelta = {\n page : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n client : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n timeStamp: 0,\n };\n\n this.downEvent = null; // pointerdown/mousedown/touchstart event\n this.downPointer = {};\n\n this._eventTarget = null;\n this._curEventTarget = null;\n\n this.prevEvent = null; // previous action event\n\n this.pointerIsDown = false;\n this.pointerWasMoved = false;\n this._interacting = false;\n\n this.pointerType = pointerType;\n\n signals.fire('new', this);\n\n scope.interactions.push(this);\n }\n\n pointerDown (pointer, event, eventTarget) {\n const pointerIndex = this.updatePointer(pointer, event, true);\n\n signals.fire('down', {\n pointer,\n event,\n eventTarget,\n pointerIndex,\n interaction: this,\n });\n }\n\n /*\\\n * Interaction.start\n [ method ]\n *\n * Start an action with the given Interactable and Element as tartgets. The\n * action must be enabled for the target Interactable and an appropriate number\n * of pointers must be held down - 1 for drag/resize, 2 for gesture.\n *\n * Use it with `interactable.able({ manualStart: false })` to always\n * [start actions manually](https://github.com/taye/interact.js/issues/114)\n *\n - action (object) The action to be performed - drag, resize, etc.\n - target (Interactable) The Interactable to target\n - element (Element) The DOM Element to target\n = (object) interact\n **\n | interact(target)\n | .draggable({\n | // disable the default drag start by down->move\n | manualStart: true\n | })\n | // start dragging after the user holds the pointer down\n | .on('hold', function (event) {\n | var interaction = event.interaction;\n |\n | if (!interaction.interacting()) {\n | interaction.start({ name: 'drag' },\n | event.interactable,\n | event.currentTarget);\n | }\n | });\n \\*/\n start (action, target, element) {\n if (this.interacting()\n || !this.pointerIsDown\n || this.pointerIds.length < (action.name === 'gesture'? 2 : 1)) {\n return;\n }\n\n // if this interaction had been removed after stopping\n // add it back\n if (utils.indexOf(scope.interactions, this) === -1) {\n scope.interactions.push(this);\n }\n\n utils.copyAction(this.prepared, action);\n this.target = target;\n this.element = element;\n\n signals.fire('action-start', {\n interaction: this,\n event: this.downEvent,\n });\n }\n\n pointerMove (pointer, event, eventTarget) {\n if (!this.simulation) {\n this.updatePointer(pointer);\n utils.setCoords(this.curCoords, this.pointers);\n }\n\n const duplicateMove = (this.curCoords.page.x === this.prevCoords.page.x\n && this.curCoords.page.y === this.prevCoords.page.y\n && this.curCoords.client.x === this.prevCoords.client.x\n && this.curCoords.client.y === this.prevCoords.client.y);\n\n let dx;\n let dy;\n\n // register movement greater than pointerMoveTolerance\n if (this.pointerIsDown && !this.pointerWasMoved) {\n dx = this.curCoords.client.x - this.startCoords.client.x;\n dy = this.curCoords.client.y - this.startCoords.client.y;\n\n this.pointerWasMoved = utils.hypot(dx, dy) > Interaction.pointerMoveTolerance;\n }\n\n const signalArg = {\n pointer,\n pointerIndex: this.getPointerIndex(pointer),\n event,\n eventTarget,\n dx,\n dy,\n duplicate: duplicateMove,\n interaction: this,\n interactingBeforeMove: this.interacting(),\n };\n\n if (!duplicateMove) {\n // set pointer coordinate, time changes and speeds\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n }\n\n signals.fire('move', signalArg);\n\n if (!duplicateMove) {\n // if interacting, fire an 'action-move' signal etc\n if (this.interacting()) {\n this.doMove(signalArg);\n }\n\n if (this.pointerWasMoved) {\n utils.copyCoords(this.prevCoords, this.curCoords);\n }\n }\n }\n\n /*\\\n * Interaction.doMove\n [ method ]\n *\n * Force a move of the current action at the same coordinates. Useful if\n * snap/restrict has been changed and you want a movement with the new\n * settings.\n *\n **\n | interact(target)\n | .draggable(true)\n | .on('dragmove', function (event) {\n | if (someCondition) {\n | // change the snap settings\n | event.interactable.draggable({ snap: { targets: [] }});\n | // fire another move event with re-calculated snap\n | event.interaction.doMove();\n | }\n | });\n \\*/\n doMove (signalArg) {\n signalArg = utils.extend({\n pointer: this.pointers[0],\n event: this.prevEvent,\n eventTarget: this._eventTarget,\n interaction: this,\n }, signalArg || {});\n\n signals.fire('before-action-move', signalArg);\n\n if (!this._dontFireMove) {\n signals.fire('action-move', signalArg);\n }\n\n this._dontFireMove = false;\n }\n\n // End interact move events and stop auto-scroll unless simulation is running\n pointerUp (pointer, event, eventTarget, curEventTarget) {\n const pointerIndex = this.getPointerIndex(pointer);\n\n signals.fire(/cancel$/i.test(event.type)? 'cancel' : 'up', {\n pointer,\n pointerIndex,\n event,\n eventTarget,\n curEventTarget,\n interaction: this,\n });\n\n if (!this.simulation) {\n this.end(event);\n }\n\n this.pointerIsDown = false;\n this.removePointer(pointer, event);\n }\n\n /*\\\n * Interaction.end\n [ method ]\n *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n - event (PointerEvent) #optional\n **\n | interact(target)\n | .draggable(true)\n | .on('move', function (event) {\n | if (event.pageX > 1000) {\n | // end the current action\n | event.interaction.end();\n | // stop all further listeners from being called\n | event.stopImmediatePropagation();\n | }\n | });\n \\*/\n end (event) {\n event = event || this.prevEvent;\n\n if (this.interacting()) {\n signals.fire('action-end', {\n event,\n interaction: this,\n });\n }\n\n this.stop();\n }\n\n currentAction () {\n return this._interacting? this.prepared.name: null;\n }\n\n interacting () {\n return this._interacting;\n }\n\n stop () {\n signals.fire('stop', { interaction: this });\n\n if (this._interacting) {\n signals.fire('stop-active', { interaction: this });\n signals.fire('stop-' + this.prepared.name, { interaction: this });\n }\n\n this.target = this.element = null;\n\n this._interacting = false;\n this.prepared.name = this.prevEvent = null;\n }\n\n getPointerIndex (pointer) {\n // mouse and pen interactions may have only one pointer\n if (this.pointerType === 'mouse' || this.pointerType === 'pen') {\n return 0;\n }\n\n return utils.indexOf(this.pointerIds, utils.getPointerId(pointer));\n }\n\n updatePointer (pointer, event, down = event && /(down|start)$/i.test(event.type)) {\n const id = utils.getPointerId(pointer);\n let index = this.getPointerIndex(pointer);\n\n if (index === -1) {\n index = this.pointerIds.length;\n this.pointerIds[index] = id;\n }\n\n if (down) {\n signals.fire('update-pointer-down', {\n pointer,\n event,\n down,\n pointerId: id,\n pointerIndex: index,\n interaction: this,\n });\n }\n\n this.pointers[index] = pointer;\n\n return index;\n }\n\n removePointer (pointer, event) {\n const index = this.getPointerIndex(pointer);\n\n if (index === -1) { return; }\n\n signals.fire('remove-pointer', {\n pointer,\n event,\n pointerIndex: index,\n interaction: this,\n });\n\n this.pointers .splice(index, 1);\n this.pointerIds .splice(index, 1);\n this.downTargets.splice(index, 1);\n this.downTimes .splice(index, 1);\n }\n\n _updateEventTargets (target, currentTarget) {\n this._eventTarget = target;\n this._curEventTarget = currentTarget;\n }\n}\n\nfor (let i = 0, len = methodNames.length; i < len; i++) {\n const method = methodNames[i];\n\n listeners[method] = doOnInteractions(method);\n}\n\nfunction doOnInteractions (method) {\n return (function (event) {\n const pointerType = utils.getPointerType(event);\n const [eventTarget, curEventTarget] = utils.getEventTargets(event);\n const matches = []; // [ [pointer, interaction], ...]\n\n if (browser.supportsTouch && /touch/.test(event.type)) {\n prevTouchTime = new Date().getTime();\n\n for (let i = 0; i < event.changedTouches.length; i++) {\n const pointer = event.changedTouches[i];\n const interaction = finder.search(pointer, event.type, eventTarget);\n\n matches.push([pointer, interaction || new Interaction({ pointerType })]);\n }\n }\n else {\n let invalidPointer = false;\n\n if (!browser.supportsPointerEvent && /mouse/.test(event.type)) {\n // ignore mouse events while touch interactions are active\n for (let i = 0; i < scope.interactions.length && !invalidPointer; i++) {\n invalidPointer = scope.interactions[i].pointerType !== 'mouse' && scope.interactions[i].pointerIsDown;\n }\n\n // try to ignore mouse events that are simulated by the browser\n // after a touch event\n invalidPointer = invalidPointer\n || (new Date().getTime() - prevTouchTime < 500)\n // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated\n || event.timeStamp === 0;\n }\n\n if (!invalidPointer) {\n let interaction = finder.search(event, event.type, eventTarget);\n\n if (!interaction) {\n interaction = new Interaction({ pointerType });\n }\n\n matches.push([event, interaction]);\n }\n }\n\n for (const [pointer, interaction] of matches) {\n interaction._updateEventTargets(eventTarget, curEventTarget);\n interaction[method](pointer, event, eventTarget, curEventTarget);\n }\n });\n}\n\nfunction endAll (event) {\n for (let i = 0; i < scope.interactions.length; i++) {\n const interaction = scope.interactions[i];\n\n interaction.end(event);\n signals.fire('endall', { event, interaction });\n }\n}\n\nconst docEvents = { /* 'eventType': listenerFunc */ };\nconst pEventTypes = browser.pEventTypes;\n\nif (domObjects.PointerEvent) {\n docEvents[pEventTypes.down ] = listeners.pointerDown;\n docEvents[pEventTypes.move ] = listeners.pointerMove;\n docEvents[pEventTypes.up ] = listeners.pointerUp;\n docEvents[pEventTypes.cancel] = listeners.pointerUp;\n}\nelse {\n docEvents.mousedown = listeners.pointerDown;\n docEvents.mousemove = listeners.pointerMove;\n docEvents.mouseup = listeners.pointerUp;\n\n docEvents.touchstart = listeners.pointerDown;\n docEvents.touchmove = listeners.pointerMove;\n docEvents.touchend = listeners.pointerUp;\n docEvents.touchcancel = listeners.pointerUp;\n}\n\ndocEvents.blur = endAll;\n\nfunction onDocSignal ({ doc }, signalName) {\n const eventMethod = signalName.indexOf('add') === 0\n ? events.add : events.remove;\n\n // delegate event listener\n for (const eventType in scope.delegatedEvents) {\n eventMethod(doc, eventType, events.delegateListener);\n eventMethod(doc, eventType, events.delegateUseCapture, true);\n }\n\n for (const eventType in docEvents) {\n eventMethod(doc, eventType, docEvents[eventType]);\n }\n}\n\nsignals.on('update-pointer-down', ({ interaction, pointer, pointerId, pointerIndex, event, eventTarget, down }) => {\n interaction.pointerIds[pointerIndex] = pointerId;\n interaction.pointers[pointerIndex] = pointer;\n\n if (down) {\n interaction.pointerIsDown = true;\n }\n\n if (!interaction.interacting()) {\n utils.setCoords(interaction.startCoords, interaction.pointers);\n\n utils.copyCoords(interaction.curCoords , interaction.startCoords);\n utils.copyCoords(interaction.prevCoords, interaction.startCoords);\n\n interaction.downEvent = event;\n interaction.downTimes[pointerIndex] = interaction.curCoords.timeStamp;\n interaction.downTargets[pointerIndex] = eventTarget || event && utils.getEventTargets(event)[0];\n interaction.pointerWasMoved = false;\n\n utils.pointerExtend(interaction.downPointer, pointer);\n }\n});\n\nscope.signals.on('add-document' , onDocSignal);\nscope.signals.on('remove-document', onDocSignal);\n\nInteraction.pointerMoveTolerance = 1;\nInteraction.doOnInteractions = doOnInteractions;\nInteraction.endAll = endAll;\nInteraction.signals = signals;\nInteraction.docEvents = docEvents;\n\nscope.endAllInteractions = endAll;\n\nmodule.exports = Interaction;\n","const Interaction = require('../Interaction');\nconst InteractEvent = require('../InteractEvent');\n\nconst actions = {\n firePrepared,\n names: [],\n methodDict: {},\n};\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n interaction._interacting = true;\n firePrepared(interaction, event, 'start');\n});\n\nInteraction.signals.on('action-move', function ({ interaction, event, preEnd }) {\n firePrepared(interaction, event, 'move', preEnd);\n\n // if the action was ended in a listener\n if (!interaction.interacting()) { return false; }\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n firePrepared(interaction, event, 'end');\n});\n\nfunction firePrepared (interaction, event, phase, preEnd) {\n const actionName = interaction.prepared.name;\n\n const newEvent = new InteractEvent(interaction, event, actionName, phase, interaction.element, null, preEnd);\n\n interaction.target.fire(newEvent);\n interaction.prevEvent = newEvent;\n}\n\nmodule.exports = actions;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drag = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n startAxis : 'xy',\n lockAxis : 'xy',\n },\n\n checker: function (pointer, event, interactable) {\n const dragOptions = interactable.options.drag;\n\n return dragOptions.enabled\n ? { name: 'drag', axis: (dragOptions.lockAxis === 'start'\n ? dragOptions.startAxis\n : dragOptions.lockAxis)}\n : null;\n },\n\n getCursor: function () {\n return 'move';\n },\n};\n\nInteraction.signals.on('before-action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n interaction.curCoords.page.y = interaction.startCoords.page.y;\n interaction.curCoords.client.y = interaction.startCoords.client.y;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vx);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vx);\n interaction.pointerDelta.client.vy = 0;\n interaction.pointerDelta.page.vy = 0;\n }\n else if (axis === 'y') {\n interaction.curCoords.page.x = interaction.startCoords.page.x;\n interaction.curCoords.client.x = interaction.startCoords.client.x;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vy);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vy);\n interaction.pointerDelta.client.vx = 0;\n interaction.pointerDelta.page.vx = 0;\n }\n});\n\n// dragmove\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'dragmove') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n iEvent.pageY = interaction.startCoords.page.y;\n iEvent.clientY = interaction.startCoords.client.y;\n iEvent.dy = 0;\n }\n else if (axis === 'y') {\n iEvent.pageX = interaction.startCoords.page.x;\n iEvent.clientX = interaction.startCoords.client.x;\n iEvent.dx = 0;\n }\n});\n\n/*\\\n * Interactable.draggable\n [ method ]\n *\n * Gets or sets whether drag actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of drag events\n | var isDraggable = interact('ul li').draggable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on drag events (object makes the Interactable draggable)\n = (object) This Interactable\n | interact(element).draggable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // the axis in which the first movement must be\n | // for the drag sequence to start\n | // 'xy' by default - any direction\n | startAxis: 'x' || 'y' || 'xy',\n |\n | // 'xy' by default - don't restrict to one axis (move in any direction)\n | // 'x' or 'y' to restrict movement to either axis\n | // 'start' to restrict movement to the axis the drag started in\n | lockAxis: 'x' || 'y' || 'xy' || 'start',\n |\n | // max number of drags that can happen concurrently\n | // with elements of this Interactable. Infinity by default\n | max: Infinity,\n |\n | // max number of drags that can target the same element+Interactable\n | // 1 by default\n | maxPerElement: 2\n | });\n\\*/\nInteractable.prototype.draggable = function (options) {\n if (utils.is.object(options)) {\n this.options.drag.enabled = options.enabled === false? false: true;\n this.setPerAction('drag', options);\n this.setOnEvents('drag', options);\n\n if (/^(xy|x|y|start)$/.test(options.lockAxis)) {\n this.options.drag.lockAxis = options.lockAxis;\n }\n if (/^(xy|x|y)$/.test(options.startAxis)) {\n this.options.drag.startAxis = options.startAxis;\n }\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drag.enabled = options;\n\n if (!options) {\n this.ondragstart = this.ondragstart = this.ondragend = null;\n }\n\n return this;\n }\n\n return this.options.drag;\n};\n\nactions.drag = drag;\nactions.names.push('drag');\nutils.merge(Interactable.eventTypes, [\n 'dragstart',\n 'dragmove',\n 'draginertiastart',\n 'draginertiaresume',\n 'dragend',\n]);\nactions.methodDict.drag = 'draggable';\n\ndefaultOptions.drag = drag.defaults;\n\nmodule.exports = drag;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst scope = require('../scope');\nconst interact = require('../interact');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drop = {\n defaults: {\n enabled: false,\n accept : null,\n overlap: 'pointer',\n },\n};\n\nlet dynamicDrop = false;\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // reset active dropzones\n interaction.activeDrops.dropzones = [];\n interaction.activeDrops.elements = [];\n interaction.activeDrops.rects = [];\n\n interaction.dropEvents = null;\n\n if (!interaction.dynamicDrop) {\n setActiveDrops(interaction, interaction.element);\n }\n\n const dragEvent = interaction.prevEvent;\n const dropEvents = getDropEvents(interaction, event, dragEvent);\n\n if (dropEvents.activate) {\n fireActiveDrops(interaction, dropEvents.activate);\n }\n});\n\nInteractEvent.signals.on('new', function ({ interaction, iEvent, event }) {\n if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { return; }\n\n const draggableElement = interaction.element;\n const dragEvent = iEvent;\n const dropResult = getDrop(dragEvent, event, draggableElement);\n\n interaction.dropTarget = dropResult.dropzone;\n interaction.dropElement = dropResult.element;\n\n interaction.dropEvents = getDropEvents(interaction, event, dragEvent);\n});\n\nInteraction.signals.on('action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n fireDropEvents(interaction, interaction.dropEvents);\n});\n\nInteraction.signals.on('action-end', function ({ interaction }) {\n if (interaction.prepared.name === 'drag') {\n fireDropEvents(interaction, interaction.dropEvents);\n }\n});\n\nInteraction.signals.on('stop-drag', function ({ interaction }) {\n interaction.activeDrops.dropzones =\n interaction.activeDrops.elements =\n interaction.activeDrops.rects =\n interaction.dropEvents = null;\n});\n\nfunction collectDrops (interaction, element) {\n const drops = [];\n const elements = [];\n\n element = element || interaction.element;\n\n // collect all dropzones and their elements which qualify for a drop\n for (const current of scope.interactables) {\n if (!current.options.drop.enabled) { continue; }\n\n const accept = current.options.drop.accept;\n\n // test the draggable element against the dropzone's accept setting\n if ((utils.is.element(accept) && accept !== element)\n || (utils.is.string(accept)\n && !utils.matchesSelector(element, accept))) {\n\n continue;\n }\n\n // query for new elements if necessary\n const dropElements = utils.is.string(current.target)\n ? current._context.querySelectorAll(current.target)\n : [current.target];\n\n for (let i = 0; i < dropElements.length; i++) {\n const currentElement = dropElements[i];\n\n if (currentElement !== element) {\n drops.push(current);\n elements.push(currentElement);\n }\n }\n }\n\n return {\n elements,\n dropzones: drops,\n };\n}\n\nfunction fireActiveDrops (interaction, event) {\n let prevElement;\n\n // loop through all active dropzones and trigger event\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n const current = interaction.activeDrops.dropzones[i];\n const currentElement = interaction.activeDrops.elements [i];\n\n // prevent trigger of duplicate events on same element\n if (currentElement !== prevElement) {\n // set current element as event target\n event.target = currentElement;\n current.fire(event);\n }\n prevElement = currentElement;\n }\n}\n\n// Collect a new set of possible drops and save them in activeDrops.\n// setActiveDrops should always be called when a drag has just started or a\n// drag event happens while dynamicDrop is true\nfunction setActiveDrops (interaction, dragElement) {\n // get dropzones and their elements that could receive the draggable\n const possibleDrops = collectDrops(interaction, dragElement, true);\n\n interaction.activeDrops.dropzones = possibleDrops.dropzones;\n interaction.activeDrops.elements = possibleDrops.elements;\n interaction.activeDrops.rects = [];\n\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n interaction.activeDrops.rects[i] =\n interaction.activeDrops.dropzones[i].getRect(interaction.activeDrops.elements[i]);\n }\n}\n\nfunction getDrop (dragEvent, event, dragElement) {\n const interaction = dragEvent.interaction;\n const validDrops = [];\n\n if (dynamicDrop) {\n setActiveDrops(interaction, dragElement);\n }\n\n // collect all dropzones and their elements which qualify for a drop\n for (let j = 0; j < interaction.activeDrops.dropzones.length; j++) {\n const current = interaction.activeDrops.dropzones[j];\n const currentElement = interaction.activeDrops.elements [j];\n const rect = interaction.activeDrops.rects [j];\n\n validDrops.push(current.dropCheck(dragEvent, event, interaction.target, dragElement, currentElement, rect)\n ? currentElement\n : null);\n }\n\n // get the most appropriate dropzone based on DOM depth and order\n const dropIndex = utils.indexOfDeepestElement(validDrops);\n\n return {\n dropzone: interaction.activeDrops.dropzones[dropIndex] || null,\n element : interaction.activeDrops.elements [dropIndex] || null,\n };\n}\n\nfunction getDropEvents (interaction, pointerEvent, dragEvent) {\n const dropEvents = {\n enter : null,\n leave : null,\n activate : null,\n deactivate: null,\n move : null,\n drop : null,\n };\n\n const tmpl = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n };\n\n if (interaction.dropElement !== interaction.prevDropElement) {\n // if there was a prevDropTarget, create a dragleave event\n if (interaction.prevDropTarget) {\n dropEvents.leave = utils.extend({ type: 'dragleave' }, tmpl);\n\n dragEvent.dragLeave = dropEvents.leave.target = interaction.prevDropElement;\n dragEvent.prevDropzone = dropEvents.leave.dropzone = interaction.prevDropTarget;\n }\n // if the dropTarget is not null, create a dragenter event\n if (interaction.dropTarget) {\n dropEvents.enter = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n type : 'dragenter',\n };\n\n dragEvent.dragEnter = interaction.dropElement;\n dragEvent.dropzone = interaction.dropTarget;\n }\n }\n\n if (dragEvent.type === 'dragend' && interaction.dropTarget) {\n dropEvents.drop = utils.extend({ type: 'drop' }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n dragEvent.relatedTarget = interaction.dropElement;\n }\n if (dragEvent.type === 'dragstart') {\n dropEvents.activate = utils.extend({ type: 'dropactivate' }, tmpl);\n\n dropEvents.activate.target = null;\n dropEvents.activate.dropzone = null;\n }\n if (dragEvent.type === 'dragend') {\n dropEvents.deactivate = utils.extend({ type: 'dropdeactivate' }, tmpl);\n\n dropEvents.deactivate.target = null;\n dropEvents.deactivate.dropzone = null;\n }\n if (dragEvent.type === 'dragmove' && interaction.dropTarget) {\n dropEvents.move = utils.extend({\n dragmove : dragEvent,\n type : 'dropmove',\n }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n }\n\n return dropEvents;\n}\n\nfunction fireDropEvents (interaction, dropEvents) {\n if (dropEvents.leave) { interaction.prevDropTarget.fire(dropEvents.leave); }\n if (dropEvents.move ) { interaction.dropTarget.fire(dropEvents.move ); }\n if (dropEvents.enter) { interaction.dropTarget.fire(dropEvents.enter); }\n if (dropEvents.drop ) { interaction.dropTarget.fire(dropEvents.drop ); }\n if (dropEvents.deactivate) {\n fireActiveDrops(interaction, dropEvents.deactivate);\n }\n\n interaction.prevDropTarget = interaction.dropTarget;\n interaction.prevDropElement = interaction.dropElement;\n}\n\n/*\\\n * Interactable.dropzone\n [ method ]\n *\n * Returns or sets whether elements can be dropped onto this\n * Interactable to trigger drop events\n *\n * Dropzones can receive the following events:\n * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends\n * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone\n * - `dragmove` when a draggable that has entered the dropzone is moved\n * - `drop` when a draggable is dropped into this dropzone\n *\n * Use the `accept` option to allow only elements that match the given CSS\n * selector or element. The value can be:\n *\n * - **an Element** - only that element can be dropped into this dropzone.\n * - **a string**, - the element being dragged must match it as a CSS selector.\n * - **`null`** - accept options is cleared - it accepts any element.\n *\n * Use the `overlap` option to set how drops are checked for. The allowed\n * values are:\n *\n * - `'pointer'`, the pointer must be over the dropzone (default)\n * - `'center'`, the draggable element's center must be over the dropzone\n * - a number from 0-1 which is the `(intersection area) / (draggable area)`.\n * e.g. `0.5` for drop to happen when half of the area of the draggable is\n * over the dropzone\n *\n * Use the `checker` option to specify a function to check if a dragged\n * element is over this Interactable.\n *\n | interact(target)\n | .dropChecker(function(dragEvent, // related dragmove or dragend event\n | event, // TouchEvent/PointerEvent/MouseEvent\n | dropped, // bool result of the default checker\n | dropzone, // dropzone Interactable\n | dropElement, // dropzone elemnt\n | draggable, // draggable Interactable\n | draggableElement) {// draggable element\n |\n | return dropped && event.target.hasAttribute('allow-drop');\n | }\n *\n *\n - options (boolean | object | null) #optional The new value to be set.\n | interact('.drop').dropzone({\n | accept: '.can-drop' || document.getElementById('single-drop'),\n | overlap: 'pointer' || 'center' || zeroToOne\n | }\n = (boolean | object) The current setting or this Interactable\n\\*/\nInteractable.prototype.dropzone = function (options) {\n if (utils.is.object(options)) {\n this.options.drop.enabled = options.enabled === false? false: true;\n\n if (utils.is.function(options.ondrop) ) { this.events.ondrop = options.ondrop ; }\n if (utils.is.function(options.ondropactivate) ) { this.events.ondropactivate = options.ondropactivate ; }\n if (utils.is.function(options.ondropdeactivate)) { this.events.ondropdeactivate = options.ondropdeactivate; }\n if (utils.is.function(options.ondragenter) ) { this.events.ondragenter = options.ondragenter ; }\n if (utils.is.function(options.ondragleave) ) { this.events.ondragleave = options.ondragleave ; }\n if (utils.is.function(options.ondropmove) ) { this.events.ondropmove = options.ondropmove ; }\n\n if (/^(pointer|center)$/.test(options.overlap)) {\n this.options.drop.overlap = options.overlap;\n }\n else if (utils.is.number(options.overlap)) {\n this.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0);\n }\n if ('accept' in options) {\n this.options.drop.accept = options.accept;\n }\n if ('checker' in options) {\n this.options.drop.checker = options.checker;\n }\n\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drop.enabled = options;\n\n if (!options) {\n this.ondragenter = this.ondragleave = this.ondrop\n = this.ondropactivate = this.ondropdeactivate = null;\n }\n\n return this;\n }\n\n return this.options.drop;\n};\n\nInteractable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) {\n let dropped = false;\n\n // if the dropzone has no rect (eg. display: none)\n // call the custom dropChecker or just return false\n if (!(rect = rect || this.getRect(dropElement))) {\n return (this.options.drop.checker\n ? this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement)\n : false);\n }\n\n const dropOverlap = this.options.drop.overlap;\n\n if (dropOverlap === 'pointer') {\n const origin = utils.getOriginXY(draggable, draggableElement, 'drag');\n const page = utils.getPageXY(dragEvent);\n\n page.x += origin.x;\n page.y += origin.y;\n\n const horizontal = (page.x > rect.left) && (page.x < rect.right);\n const vertical = (page.y > rect.top ) && (page.y < rect.bottom);\n\n dropped = horizontal && vertical;\n }\n\n const dragRect = draggable.getRect(draggableElement);\n\n if (dragRect && dropOverlap === 'center') {\n const cx = dragRect.left + dragRect.width / 2;\n const cy = dragRect.top + dragRect.height / 2;\n\n dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom;\n }\n\n if (dragRect && utils.is.number(dropOverlap)) {\n const overlapArea = (Math.max(0, Math.min(rect.right , dragRect.right ) - Math.max(rect.left, dragRect.left))\n * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top , dragRect.top )));\n\n const overlapRatio = overlapArea / (dragRect.width * dragRect.height);\n\n dropped = overlapRatio >= dropOverlap;\n }\n\n if (this.options.drop.checker) {\n dropped = this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement);\n }\n\n return dropped;\n};\n\nInteractable.signals.on('unset', function ({ interactable }) {\n interactable.dropzone(false);\n});\n\nInteractable.settingsMethods.push('dropChecker');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.dropTarget = null; // the dropzone a drag target might be dropped into\n interaction.dropElement = null; // the element at the time of checking\n interaction.prevDropTarget = null; // the dropzone that was recently dragged away from\n interaction.prevDropElement = null; // the element at the time of checking\n interaction.dropEvents = null; // the dropEvents related to the current drag event\n\n interaction.activeDrops = {\n dropzones: [], // the dropzones that are mentioned below\n elements : [], // elements of dropzones that accept the target draggable\n rects : [], // the rects of the elements mentioned above\n };\n\n});\n\nInteraction.signals.on('stop', function ({ interaction }) {\n interaction.dropTarget = interaction.dropElement =\n interaction.prevDropTarget = interaction.prevDropElement = null;\n});\n\n/*\\\n * interact.dynamicDrop\n [ method ]\n *\n * Returns or sets whether the dimensions of dropzone elements are\n * calculated on every dragmove or only on dragstart for the default\n * dropChecker\n *\n - newValue (boolean) #optional True to check on each move. False to check only before start\n = (boolean | interact) The current setting or interact\n\\*/\ninteract.dynamicDrop = function (newValue) {\n if (utils.is.bool(newValue)) {\n //if (dragging && dynamicDrop !== newValue && !newValue) {\n //calcRects(dropzones);\n //}\n\n dynamicDrop = newValue;\n\n return interact;\n }\n return dynamicDrop;\n};\n\nutils.merge(Interactable.eventTypes, [\n 'dragenter',\n 'dragleave',\n 'dropactivate',\n 'dropdeactivate',\n 'dropmove',\n 'drop',\n]);\nactions.methodDict.drop = 'dropzone';\n\ndefaultOptions.drop = drop.defaults;\n\nmodule.exports = drop;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst gesture = {\n defaults: {\n enabled : false,\n origin : null,\n restrict: null,\n },\n\n checker: function (pointer, event, interactable, element, interaction) {\n if (interaction.pointerIds.length >= 2) {\n return { name: 'gesture' };\n }\n\n return null;\n },\n\n getCursor: function () {\n return '';\n },\n};\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturestart') { return; }\n iEvent.ds = 0;\n\n interaction.gesture.startDistance = interaction.gesture.prevDistance = iEvent.distance;\n interaction.gesture.startAngle = interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.scale = 1;\n});\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturemove') { return; }\n\n iEvent.ds = iEvent.scale - interaction.gesture.scale;\n\n interaction.target.fire(iEvent);\n\n interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.prevDistance = iEvent.distance;\n\n if (iEvent.scale !== Infinity\n && iEvent.scale !== null\n && iEvent.scale !== undefined\n && !isNaN(iEvent.scale)) {\n\n interaction.gesture.scale = iEvent.scale;\n }\n});\n\n/*\\\n * Interactable.gesturable\n [ method ]\n *\n * Gets or sets whether multitouch gestures can be performed on the\n * Interactable's element\n *\n = (boolean) Indicates if this can be the target of gesture events\n | var isGestureable = interact(element).gesturable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on gesture events (makes the Interactable gesturable)\n = (object) this Interactable\n | interact(element).gesturable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // limit multiple gestures.\n | // See the explanation in @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n\\*/\nInteractable.prototype.gesturable = function (options) {\n if (utils.is.object(options)) {\n this.options.gesture.enabled = options.enabled === false? false: true;\n this.setPerAction('gesture', options);\n this.setOnEvents('gesture', options);\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.gesture.enabled = options;\n\n if (!options) {\n this.ongesturestart = this.ongesturestart = this.ongestureend = null;\n }\n\n return this;\n }\n\n return this.options.gesture;\n};\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action, event, starting, ending, deltaSource }) {\n if (action !== 'gesture') { return; }\n\n const pointers = interaction.pointers;\n\n iEvent.touches = [pointers[0], pointers[1]];\n\n if (starting) {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = 1;\n iEvent.ds = 0;\n iEvent.angle = utils.touchAngle(pointers, undefined, deltaSource);\n iEvent.da = 0;\n }\n else if (ending || event instanceof InteractEvent) {\n iEvent.distance = interaction.prevEvent.distance;\n iEvent.box = interaction.prevEvent.box;\n iEvent.scale = interaction.prevEvent.scale;\n iEvent.ds = iEvent.scale - 1;\n iEvent.angle = interaction.prevEvent.angle;\n iEvent.da = iEvent.angle - interaction.gesture.startAngle;\n }\n else {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = iEvent.distance / interaction.gesture.startDistance;\n iEvent.angle = utils.touchAngle(pointers, interaction.gesture.prevAngle, deltaSource);\n\n iEvent.ds = iEvent.scale - interaction.gesture.prevScale;\n iEvent.da = iEvent.angle - interaction.gesture.prevAngle;\n }\n});\n\nInteraction.signals.on('new', function (interaction) {\n interaction.gesture = {\n start: { x: 0, y: 0 },\n\n startDistance: 0, // distance between two touches of touchStart\n prevDistance : 0,\n distance : 0,\n\n scale: 1, // gesture.distance / gesture.startDistance\n\n startAngle: 0, // angle of line joining two touches\n prevAngle : 0, // angle of the previous gesture event\n };\n});\n\nactions.gesture = gesture;\nactions.names.push('gesture');\nutils.merge(Interactable.eventTypes, [\n 'gesturestart',\n 'gesturemove',\n 'gestureend',\n]);\nactions.methodDict.gesture = 'gesturable';\n\ndefaultOptions.gesture = gesture.defaults;\n\nmodule.exports = gesture;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\n// Less Precision with touch input\nconst defaultMargin = browser.supportsTouch || browser.supportsPointerEvent? 20: 10;\n\nconst resize = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n square: false,\n preserveAspectRatio: false,\n axis: 'xy',\n\n // use default margin\n margin: NaN,\n\n // object with props left, right, top, bottom which are\n // true/false values to resize when the pointer is over that edge,\n // CSS selectors to match the handles for each direction\n // or the Elements for each handle\n edges: null,\n\n // a value of 'none' will limit the resize rect to a minimum of 0x0\n // 'negate' will alow the rect to have negative width/height\n // 'reposition' will keep the width/height positive by swapping\n // the top and bottom edges and/or swapping the left and right edges\n invert: 'none',\n },\n\n checker: function (pointer, event, interactable, element, interaction, rect) {\n if (!rect) { return null; }\n\n const page = utils.extend({}, interaction.curCoords.page);\n const options = interactable.options;\n\n if (options.resize.enabled) {\n const resizeOptions = options.resize;\n const resizeEdges = { left: false, right: false, top: false, bottom: false };\n\n // if using resize.edges\n if (utils.is.object(resizeOptions.edges)) {\n for (const edge in resizeEdges) {\n resizeEdges[edge] = checkResizeEdge(edge,\n resizeOptions.edges[edge],\n page,\n interaction._eventTarget,\n element,\n rect,\n resizeOptions.margin || defaultMargin);\n }\n\n resizeEdges.left = resizeEdges.left && !resizeEdges.right;\n resizeEdges.top = resizeEdges.top && !resizeEdges.bottom;\n\n if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) {\n return {\n name: 'resize',\n edges: resizeEdges,\n };\n }\n }\n else {\n const right = options.resize.axis !== 'y' && page.x > (rect.right - defaultMargin);\n const bottom = options.resize.axis !== 'x' && page.y > (rect.bottom - defaultMargin);\n\n if (right || bottom) {\n return {\n name: 'resize',\n axes: (right? 'x' : '') + (bottom? 'y' : ''),\n };\n }\n }\n }\n\n return null;\n },\n\n cursors: (browser.isIe9OrOlder ? {\n x : 'e-resize',\n y : 's-resize',\n xy: 'se-resize',\n\n top : 'n-resize',\n left : 'w-resize',\n bottom : 's-resize',\n right : 'e-resize',\n topleft : 'se-resize',\n bottomright: 'se-resize',\n topright : 'ne-resize',\n bottomleft : 'ne-resize',\n } : {\n x : 'ew-resize',\n y : 'ns-resize',\n xy: 'nwse-resize',\n\n top : 'ns-resize',\n left : 'ew-resize',\n bottom : 'ns-resize',\n right : 'ew-resize',\n topleft : 'nwse-resize',\n bottomright: 'nwse-resize',\n topright : 'nesw-resize',\n bottomleft : 'nesw-resize',\n }),\n\n getCursor: function (action) {\n if (action.axis) {\n return resize.cursors[action.name + action.axis];\n }\n else if (action.edges) {\n let cursorKey = '';\n const edgeNames = ['top', 'bottom', 'left', 'right'];\n\n for (let i = 0; i < 4; i++) {\n if (action.edges[edgeNames[i]]) {\n cursorKey += edgeNames[i];\n }\n }\n\n return resize.cursors[cursorKey];\n }\n },\n};\n\n// resizestart\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'resizestart' || !interaction.prepared.edges) {\n return;\n }\n\n const startRect = interaction.target.getRect(interaction.element);\n const resizeOptions = interaction.target.options.resize;\n\n /*\n * When using the `resizable.square` or `resizable.preserveAspectRatio` options, resizing from one edge\n * will affect another. E.g. with `resizable.square`, resizing to make the right edge larger will make\n * the bottom edge larger by the same amount. We call these 'linked' edges. Any linked edges will depend\n * on the active edges and the edge being interacted with.\n */\n if (resizeOptions.square || resizeOptions.preserveAspectRatio) {\n const linkedEdges = utils.extend({}, interaction.prepared.edges);\n\n linkedEdges.top = linkedEdges.top || (linkedEdges.left && !linkedEdges.bottom);\n linkedEdges.left = linkedEdges.left || (linkedEdges.top && !linkedEdges.right );\n linkedEdges.bottom = linkedEdges.bottom || (linkedEdges.right && !linkedEdges.top );\n linkedEdges.right = linkedEdges.right || (linkedEdges.bottom && !linkedEdges.left );\n\n interaction.prepared._linkedEdges = linkedEdges;\n }\n else {\n interaction.prepared._linkedEdges = null;\n }\n\n // if using `resizable.preserveAspectRatio` option, record aspect ratio at the start of the resize\n if (resizeOptions.preserveAspectRatio) {\n interaction.resizeStartAspectRatio = startRect.width / startRect.height;\n }\n\n interaction.resizeRects = {\n start : startRect,\n current : utils.extend({}, startRect),\n inverted : utils.extend({}, startRect),\n previous : utils.extend({}, startRect),\n delta : {\n left: 0, right : 0, width : 0,\n top : 0, bottom: 0, height: 0,\n },\n };\n\n iEvent.rect = interaction.resizeRects.inverted;\n iEvent.deltaRect = interaction.resizeRects.delta;\n});\n\n// resizemove\nInteractEvent.signals.on('new', function ({ iEvent, phase, interaction }) {\n if (phase !== 'move' || !interaction.prepared.edges) { return; }\n\n const resizeOptions = interaction.target.options.resize;\n const invert = resizeOptions.invert;\n const invertible = invert === 'reposition' || invert === 'negate';\n\n let edges = interaction.prepared.edges;\n\n const start = interaction.resizeRects.start;\n const current = interaction.resizeRects.current;\n const inverted = interaction.resizeRects.inverted;\n const delta = interaction.resizeRects.delta;\n const previous = utils.extend(interaction.resizeRects.previous, inverted);\n const originalEdges = edges;\n\n let dx = iEvent.dx;\n let dy = iEvent.dy;\n\n if (resizeOptions.preserveAspectRatio || resizeOptions.square) {\n // `resize.preserveAspectRatio` takes precedence over `resize.square`\n const startAspectRatio = resizeOptions.preserveAspectRatio\n ? interaction.resizeStartAspectRatio\n : 1;\n\n edges = interaction.prepared._linkedEdges;\n\n if ((originalEdges.left && originalEdges.bottom)\n || (originalEdges.right && originalEdges.top)) {\n dy = -dx / startAspectRatio;\n }\n else if (originalEdges.left || originalEdges.right ) { dy = dx / startAspectRatio; }\n else if (originalEdges.top || originalEdges.bottom) { dx = dy * startAspectRatio; }\n }\n\n // update the 'current' rect without modifications\n if (edges.top ) { current.top += dy; }\n if (edges.bottom) { current.bottom += dy; }\n if (edges.left ) { current.left += dx; }\n if (edges.right ) { current.right += dx; }\n\n if (invertible) {\n // if invertible, copy the current rect\n utils.extend(inverted, current);\n\n if (invert === 'reposition') {\n // swap edge values if necessary to keep width/height positive\n let swap;\n\n if (inverted.top > inverted.bottom) {\n swap = inverted.top;\n\n inverted.top = inverted.bottom;\n inverted.bottom = swap;\n }\n if (inverted.left > inverted.right) {\n swap = inverted.left;\n\n inverted.left = inverted.right;\n inverted.right = swap;\n }\n }\n }\n else {\n // if not invertible, restrict to minimum of 0x0 rect\n inverted.top = Math.min(current.top, start.bottom);\n inverted.bottom = Math.max(current.bottom, start.top);\n inverted.left = Math.min(current.left, start.right);\n inverted.right = Math.max(current.right, start.left);\n }\n\n inverted.width = inverted.right - inverted.left;\n inverted.height = inverted.bottom - inverted.top ;\n\n for (const edge in inverted) {\n delta[edge] = inverted[edge] - previous[edge];\n }\n\n iEvent.edges = interaction.prepared.edges;\n iEvent.rect = inverted;\n iEvent.deltaRect = delta;\n});\n\n/*\\\n * Interactable.resizable\n [ method ]\n *\n * Gets or sets whether resize actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of resize elements\n | var isResizeable = interact('input[type=text]').resizable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on resize events (object makes the Interactable resizable)\n = (object) This Interactable\n | interact(element).resizable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | edges: {\n | top : true, // Use pointer coords to check for resize.\n | left : false, // Disable resizing from left edge.\n | bottom: '.resize-s',// Resize if pointer target matches selector\n | right : handleEl // Resize if pointer target is the given Element\n | },\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height are adjusted at a 1:1 ratio.\n | square: false,\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height maintain the aspect ratio they had when resizing started.\n | preserveAspectRatio: false,\n |\n | // a value of 'none' will limit the resize rect to a minimum of 0x0\n | // 'negate' will allow the rect to have negative width/height\n | // 'reposition' will keep the width/height positive by swapping\n | // the top and bottom edges and/or swapping the left and right edges\n | invert: 'none' || 'negate' || 'reposition'\n |\n | // limit multiple resizes.\n | // See the explanation in the @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n \\*/\nInteractable.prototype.resizable = function (options) {\n if (utils.is.object(options)) {\n this.options.resize.enabled = options.enabled === false? false: true;\n this.setPerAction('resize', options);\n this.setOnEvents('resize', options);\n\n if (/^x$|^y$|^xy$/.test(options.axis)) {\n this.options.resize.axis = options.axis;\n }\n else if (options.axis === null) {\n this.options.resize.axis = defaultOptions.resize.axis;\n }\n\n if (utils.is.bool(options.preserveAspectRatio)) {\n this.options.resize.preserveAspectRatio = options.preserveAspectRatio;\n }\n else if (utils.is.bool(options.square)) {\n this.options.resize.square = options.square;\n }\n\n return this;\n }\n if (utils.is.bool(options)) {\n this.options.resize.enabled = options;\n\n if (!options) {\n this.onresizestart = this.onresizestart = this.onresizeend = null;\n }\n\n return this;\n }\n return this.options.resize;\n};\n\nfunction checkResizeEdge (name, value, page, element, interactableElement, rect, margin) {\n // false, '', undefined, null\n if (!value) { return false; }\n\n // true value, use pointer coords and element rect\n if (value === true) {\n // if dimensions are negative, \"switch\" edges\n const width = utils.is.number(rect.width )? rect.width : rect.right - rect.left;\n const height = utils.is.number(rect.height)? rect.height : rect.bottom - rect.top ;\n\n if (width < 0) {\n if (name === 'left' ) { name = 'right'; }\n else if (name === 'right') { name = 'left' ; }\n }\n if (height < 0) {\n if (name === 'top' ) { name = 'bottom'; }\n else if (name === 'bottom') { name = 'top' ; }\n }\n\n if (name === 'left' ) { return page.x < ((width >= 0? rect.left: rect.right ) + margin); }\n if (name === 'top' ) { return page.y < ((height >= 0? rect.top : rect.bottom) + margin); }\n\n if (name === 'right' ) { return page.x > ((width >= 0? rect.right : rect.left) - margin); }\n if (name === 'bottom') { return page.y > ((height >= 0? rect.bottom: rect.top ) - margin); }\n }\n\n // the remaining checks require an element\n if (!utils.is.element(element)) { return false; }\n\n return utils.is.element(value)\n // the value is an element to use as a resize handle\n ? value === element\n // otherwise check if element matches value as selector\n : utils.matchesUpTo(element, value, interactableElement);\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.resizeAxes = 'xy';\n});\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action }) {\n if (action !== 'resize' || !interaction.resizeAxes) { return; }\n\n const options = interaction.target.options;\n\n if (options.resize.square) {\n if (interaction.resizeAxes === 'y') {\n iEvent.dx = iEvent.dy;\n }\n else {\n iEvent.dy = iEvent.dx;\n }\n iEvent.axes = 'xy';\n }\n else {\n iEvent.axes = interaction.resizeAxes;\n\n if (interaction.resizeAxes === 'x') {\n iEvent.dy = 0;\n }\n else if (interaction.resizeAxes === 'y') {\n iEvent.dx = 0;\n }\n }\n});\n\nactions.resize = resize;\nactions.names.push('resize');\nutils.merge(Interactable.eventTypes, [\n 'resizestart',\n 'resizemove',\n 'resizeinertiastart',\n 'resizeinertiaresume',\n 'resizeend',\n]);\nactions.methodDict.resize = 'resizable';\n\ndefaultOptions.resize = resize.defaults;\n\nmodule.exports = resize;\n","const raf = require('./utils/raf');\nconst getWindow = require('./utils/window').getWindow;\nconst is = require('./utils/is');\nconst domUtils = require('./utils/domUtils');\nconst Interaction = require('./Interaction');\nconst defaultOptions = require('./defaultOptions');\n\nconst autoScroll = {\n defaults: {\n enabled : false,\n container: null, // the item that is scrolled (Window or HTMLElement)\n margin : 60,\n speed : 300, // the scroll speed in pixels per second\n },\n\n interaction: null,\n i: null, // the handle returned by window.setInterval\n x: 0, y: 0, // Direction each pulse is to scroll in\n\n isScrolling: false,\n prevTime: 0,\n\n start: function (interaction) {\n autoScroll.isScrolling = true;\n raf.cancel(autoScroll.i);\n\n autoScroll.interaction = interaction;\n autoScroll.prevTime = new Date().getTime();\n autoScroll.i = raf.request(autoScroll.scroll);\n },\n\n stop: function () {\n autoScroll.isScrolling = false;\n raf.cancel(autoScroll.i);\n },\n\n // scroll the window by the values in scroll.x/y\n scroll: function () {\n const options = autoScroll.interaction.target.options[autoScroll.interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(autoScroll.interaction.element);\n const now = new Date().getTime();\n // change in time in seconds\n const dt = (now - autoScroll.prevTime) / 1000;\n // displacement\n const s = options.speed * dt;\n\n if (s >= 1) {\n if (is.window(container)) {\n container.scrollBy(autoScroll.x * s, autoScroll.y * s);\n }\n else if (container) {\n container.scrollLeft += autoScroll.x * s;\n container.scrollTop += autoScroll.y * s;\n }\n\n autoScroll.prevTime = now;\n }\n\n if (autoScroll.isScrolling) {\n raf.cancel(autoScroll.i);\n autoScroll.i = raf.request(autoScroll.scroll);\n }\n },\n check: function (interactable, actionName) {\n const options = interactable.options;\n\n return options[actionName].autoScroll && options[actionName].autoScroll.enabled;\n },\n onInteractionMove: function ({ interaction, pointer }) {\n if (!(interaction.interacting()\n && autoScroll.check(interaction.target, interaction.prepared.name))) {\n return;\n }\n\n if (interaction.simulation) {\n autoScroll.x = autoScroll.y = 0;\n return;\n }\n\n let top;\n let right;\n let bottom;\n let left;\n\n const options = interaction.target.options[interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(interaction.element);\n\n if (is.window(container)) {\n left = pointer.clientX < autoScroll.margin;\n top = pointer.clientY < autoScroll.margin;\n right = pointer.clientX > container.innerWidth - autoScroll.margin;\n bottom = pointer.clientY > container.innerHeight - autoScroll.margin;\n }\n else {\n const rect = domUtils.getElementClientRect(container);\n\n left = pointer.clientX < rect.left + autoScroll.margin;\n top = pointer.clientY < rect.top + autoScroll.margin;\n right = pointer.clientX > rect.right - autoScroll.margin;\n bottom = pointer.clientY > rect.bottom - autoScroll.margin;\n }\n\n autoScroll.x = (right ? 1: left? -1: 0);\n autoScroll.y = (bottom? 1: top? -1: 0);\n\n if (!autoScroll.isScrolling) {\n // set the autoScroll properties to those of the target\n autoScroll.margin = options.margin;\n autoScroll.speed = options.speed;\n\n autoScroll.start(interaction);\n }\n },\n};\n\nInteraction.signals.on('stop-active', function () {\n autoScroll.stop();\n});\n\nInteraction.signals.on('action-move', autoScroll.onInteractionMove);\n\ndefaultOptions.perAction.autoScroll = autoScroll.defaults;\n\nmodule.exports = autoScroll;\n","const Interactable = require('../Interactable');\nconst actions = require('../actions/base');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.ignoreFrom\n [ method ]\n *\n * If the target of the `mousedown`, `pointerdown` or `touchstart`\n * event or any of it's parents match the given CSS selector or\n * Element, no drag/resize/gesture is started.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to not ignore any elements\n = (string | Element | object) The current ignoreFrom value or this Interactable\n **\n | interact(element, { ignoreFrom: document.getElementById('no-action') });\n | // or\n | interact(element).ignoreFrom('input, textarea, a');\n\\*/\nInteractable.prototype.ignoreFrom = function (newValue) {\n return this._backCompatOption('ignoreFrom', newValue);\n};\n\n/*\\\n * Interactable.allowFrom\n [ method ]\n *\n * A drag/resize/gesture is started only If the target of the\n * `mousedown`, `pointerdown` or `touchstart` event or any of it's\n * parents match the given CSS selector or Element.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to allow from any element\n = (string | Element | object) The current allowFrom value or this Interactable\n **\n | interact(element, { allowFrom: document.getElementById('drag-handle') });\n | // or\n | interact(element).allowFrom('.handle');\n\\*/\nInteractable.prototype.allowFrom = function (newValue) {\n return this._backCompatOption('allowFrom', newValue);\n};\n\nInteractable.prototype.testIgnore = function (ignoreFrom, interactableElement, element) {\n if (!ignoreFrom || !is.element(element)) { return false; }\n\n if (is.string(ignoreFrom)) {\n return domUtils.matchesUpTo(element, ignoreFrom, interactableElement);\n }\n else if (is.element(ignoreFrom)) {\n return domUtils.nodeContains(ignoreFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testAllow = function (allowFrom, interactableElement, element) {\n if (!allowFrom) { return true; }\n\n if (!is.element(element)) { return false; }\n\n if (is.string(allowFrom)) {\n return domUtils.matchesUpTo(element, allowFrom, interactableElement);\n }\n else if (is.element(allowFrom)) {\n return domUtils.nodeContains(allowFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testIgnoreAllow = function (options, interactableElement, eventTarget) {\n return (!this.testIgnore(options.ignoreFrom, interactableElement, eventTarget)\n && this.testAllow(options.allowFrom, interactableElement, eventTarget));\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (event.buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\n","const interact = require('../interact');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst actions = require('../actions/base');\nconst defaultOptions = require('../defaultOptions');\nconst browser = require('../utils/browser');\nconst scope = require('../scope');\nconst utils = require('../utils');\nconst signals = require('../utils/Signals').new();\n\nrequire('./InteractableMethods');\n\nconst autoStart = {\n signals,\n withinInteractionLimit,\n // Allow this many interactions to happen simultaneously\n maxInteractions: Infinity,\n defaults: {\n perAction: {\n manualStart: false,\n max: Infinity,\n maxPerElement: 1,\n allowFrom: null,\n ignoreFrom: null,\n },\n },\n setActionDefaults: function (action) {\n utils.extend(action.defaults, autoStart.defaults.perAction);\n },\n};\n\n// set cursor style on mousedown\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget }) {\n if (interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\n// set cursor style on mousemove\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget }) {\n if (!interaction.mouse\n || interaction.pointerIsDown\n || interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\nInteraction.signals.on('move', function (arg) {\n const { interaction, event } = arg;\n\n if (!interaction.pointerIsDown\n || interaction.interacting()\n || !interaction.pointerWasMoved\n || !interaction.prepared.name) {\n return;\n }\n\n signals.fire('before-start', arg);\n\n const target = interaction.target;\n\n if (interaction.prepared.name && target) {\n // check manualStart and interaction limit\n if (target.options[interaction.prepared.name].manualStart\n || !withinInteractionLimit(target, interaction.element, interaction.prepared)) {\n interaction.stop(event);\n }\n else {\n interaction.start(interaction.prepared, target, interaction.element);\n }\n }\n});\n\n// Check if the current target supports the action.\n// If so, return the validated action. Otherwise, return null\nfunction validateAction (action, interactable, element, eventTarget) {\n if (utils.is.object(action)\n && interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget)\n && interactable.options[action.name].enabled\n && withinInteractionLimit(interactable, element, action)) {\n return action;\n }\n\n return null;\n}\n\nfunction validateSelector (interaction, pointer, event, matches, matchElements, eventTarget) {\n for (let i = 0, len = matches.length; i < len; i++) {\n const match = matches[i];\n const matchElement = matchElements[i];\n const action = validateAction(match.getAction(pointer, event, interaction, matchElement),\n match,\n matchElement,\n eventTarget);\n\n if (action) {\n return {\n action,\n target: match,\n element: matchElement,\n };\n }\n }\n\n return {};\n}\n\nfunction getActionInfo (interaction, pointer, event, eventTarget) {\n let matches = [];\n let matchElements = [];\n\n let element = eventTarget;\n let action = null;\n\n function pushMatches (interactable, selector, context) {\n const elements = (browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined);\n\n if (utils.matchesSelector(element, selector, elements)) {\n\n matches.push(interactable);\n matchElements.push(element);\n }\n }\n\n while (utils.is.element(element)) {\n matches = [];\n matchElements = [];\n\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && (action = validateAction(elementInteractable.getAction(pointer, event, interaction, element, eventTarget),\n elementInteractable,\n element,\n eventTarget))\n && !elementInteractable.options[action.name].manualStart) {\n return {\n element,\n action,\n target: elementInteractable,\n };\n }\n else {\n scope.interactables.forEachSelector(pushMatches, element);\n\n const actionInfo = validateSelector(interaction, pointer, event, matches, matchElements, eventTarget);\n\n if (actionInfo.action\n && !actionInfo.target.options[actionInfo.action.name].manualStart) {\n return actionInfo;\n }\n }\n\n element = utils.parentNode(element);\n }\n\n return {};\n}\n\nfunction prepare (interaction, { action, target, element }) {\n action = action || {};\n\n if (interaction.target && interaction.target.options.styleCursor) {\n interaction.target._doc.documentElement.style.cursor = '';\n }\n\n interaction.target = target;\n interaction.element = element;\n utils.copyAction(interaction.prepared, action);\n\n if (target && target.options.styleCursor) {\n const cursor = action? actions[action.name].getCursor(action) : '';\n interaction.target._doc.documentElement.style.cursor = cursor;\n }\n\n signals.fire('prepared', { interaction: interaction });\n}\n\nInteraction.signals.on('stop', function ({ interaction }) {\n const target = interaction.target;\n\n if (target && target.options.styleCursor) {\n target._doc.documentElement.style.cursor = '';\n }\n});\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (utils.is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (utils.is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n const buttons = event.buttons || ({\n 0: 1,\n 1: 4,\n 3: 8,\n 4: 16,\n })[event.button];\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\nfunction withinInteractionLimit (interactable, element, action) {\n const options = interactable.options;\n const maxActions = options[action.name].max;\n const maxPerElement = options[action.name].maxPerElement;\n let activeInteractions = 0;\n let targetCount = 0;\n let targetElementCount = 0;\n\n // no actions if any of these values == 0\n if (!(maxActions && maxPerElement && autoStart.maxInteractions)) { return; }\n\n for (let i = 0, len = scope.interactions.length; i < len; i++) {\n const interaction = scope.interactions[i];\n const otherAction = interaction.prepared.name;\n\n if (!interaction.interacting()) { continue; }\n\n activeInteractions++;\n\n if (activeInteractions >= autoStart.maxInteractions) {\n return false;\n }\n\n if (interaction.target !== interactable) { continue; }\n\n targetCount += (otherAction === action.name)|0;\n\n if (targetCount >= maxActions) {\n return false;\n }\n\n if (interaction.element === element) {\n targetElementCount++;\n\n if (otherAction !== action.name || targetElementCount >= maxPerElement) {\n return false;\n }\n }\n }\n\n return autoStart.maxInteractions > 0;\n}\n\n/*\\\n * interact.maxInteractions\n [ method ]\n **\n * Returns or sets the maximum number of concurrent interactions allowed.\n * By default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables\n * and elements, you need to enable it in the draggable, resizable and\n * gesturable `'max'` and `'maxPerElement'` options.\n **\n - newValue (number) #optional Any number. newValue <= 0 means no interactions.\n\\*/\ninteract.maxInteractions = function (newValue) {\n if (utils.is.number(newValue)) {\n autoStart.maxInteractions = newValue;\n\n return this;\n }\n\n return autoStart.maxInteractions;\n};\n\nInteractable.settingsMethods.push('styleCursor');\nInteractable.settingsMethods.push('actionChecker');\nInteractable.settingsMethods.push('ignoreFrom');\nInteractable.settingsMethods.push('allowFrom');\n\ndefaultOptions.base.actionChecker = null;\ndefaultOptions.base.styleCursor = true;\n\nutils.extend(defaultOptions.perAction, autoStart.defaults.perAction);\n\nmodule.exports = autoStart;\n","const autoStart = require('./base');\nconst Interaction = require('../Interaction');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.delayTimer = null;\n});\n\nautoStart.signals.on('prepared', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.delayTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.target, interaction.element);\n }, delay);\n }\n});\n\nInteraction.signals.on('move', function ({ interaction, duplicate }) {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.delayTimer);\n }\n});\n\n// prevent regular down->move autoStart\nautoStart.signals.on('before-start', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.prepared.name = null;\n }\n});\n","const autoStart = require('./base');\nconst scope = require('../scope');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\n\nconst { matchesSelector, parentNode } = require('../utils/domUtils');\n\nautoStart.setActionDefaults(require('../actions/drag'));\n\nautoStart.signals.on('before-start', function ({ interaction, eventTarget, dx, dy }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // check if a drag is in the correct axis\n const absX = Math.abs(dx);\n const absY = Math.abs(dy);\n const options = interaction.target.options.drag;\n const startAxis = options.startAxis;\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy');\n\n interaction.prepared.axis = options.lockAxis === 'start'\n ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n : options.lockAxis;\n\n // if the movement isn't in the startAxis of the interactable\n if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) {\n // cancel the prepared action\n interaction.prepared.name = null;\n\n // then try to get a drag from another ineractable\n\n if (!interaction.prepared.name) {\n\n let element = eventTarget;\n\n const getDraggable = function (interactable, selector, context) {\n const elements = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n if (interactable === interaction.target) { return; }\n\n if (!options.manualStart\n && !interactable.testIgnoreAllow(options, element, eventTarget)\n && matchesSelector(element, selector, elements)) {\n\n const action = interactable.getAction(interaction.downPointer,\n interaction.downEvent,\n interaction,\n element);\n\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, interactable)\n && autoStart.validateAction(action, interactable, element, eventTarget)) {\n\n return interactable;\n }\n }\n };\n\n let action = null;\n\n // check all interactables\n while (is.element(element)) {\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && elementInteractable !== interaction.target\n && !elementInteractable.options.drag.manualStart) {\n\n action = elementInteractable.getAction(interaction.downPointer, interaction.downEvent, interaction, element);\n }\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, elementInteractable)) {\n\n interaction.prepared.name = 'drag';\n interaction.target = elementInteractable;\n interaction.element = element;\n break;\n }\n\n const selectorInteractable = scope.interactables.forEachSelector(getDraggable, element);\n\n if (selectorInteractable) {\n interaction.prepared.name = 'drag';\n interaction.target = selectorInteractable;\n interaction.element = element;\n break;\n }\n\n element = parentNode(element);\n }\n }\n }\n});\n\nfunction checkStartAxis (startAxis, interactable) {\n if (!interactable) { return false; }\n\n const thisAxis = interactable.options.drag.startAxis;\n\n return (startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis);\n}\n","require('./base').setActionDefaults(require('../actions/gesture'));\n","require('./base').setActionDefaults(require('../actions/resize'));\n","module.exports = {\n base: {\n accept : null,\n preventDefault: 'auto',\n deltaSource : 'page',\n },\n\n perAction: {\n origin: { x: 0, y: 0 },\n\n // only allow left button by default\n // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n mouseButtons: 1,\n\n inertia: {\n enabled : false,\n resistance : 10, // the lambda in exponential decay\n minSpeed : 100, // target speed must be above this for inertia to start\n endSpeed : 10, // the speed at which inertia is slow enough to stop\n allowResume : true, // allow resuming an action in inertia phase\n smoothEndDuration: 300, // animate to snap/restrict endOnly if there's no inertia\n },\n },\n};\n","/* browser entry point */\n\n// Legacy browser support\nrequire('./legacyBrowsers');\n\n// inertia\nrequire('./inertia');\n\n// modifiers\nrequire('./modifiers/snap');\nrequire('./modifiers/restrict');\n\n// pointerEvents\nrequire('./pointerEvents/base');\nrequire('./pointerEvents/holdRepeat');\nrequire('./pointerEvents/interactableTargets');\n\n// delay\nrequire('./autoStart/delay');\n\n// actions\nrequire('./actions/gesture');\nrequire('./actions/resize');\nrequire('./actions/drag');\nrequire('./actions/drop');\n\n// load these modifiers after resize is loaded\nrequire('./modifiers/snapSize');\nrequire('./modifiers/restrictEdges');\nrequire('./modifiers/restrictSize');\n\n// autoStart actions\nrequire('./autoStart/gesture');\nrequire('./autoStart/resize');\nrequire('./autoStart/drag');\n\n// Interactable preventDefault setting\nrequire('./interactablePreventDefault.js');\n\n// autoScroll\nrequire('./autoScroll');\n\n// export interact\nmodule.exports = require('./interact');\n","const InteractEvent = require('./InteractEvent');\nconst Interaction = require('./Interaction');\nconst modifiers = require('./modifiers');\nconst utils = require('./utils');\nconst animationFrame = require('./utils/raf');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.inertiaStatus = {\n active : false,\n smoothEnd : false,\n allowResume: false,\n\n startEvent: null,\n upCoords : {},\n\n xe: 0, ye: 0,\n sx: 0, sy: 0,\n\n t0: 0,\n vx0: 0, vys: 0,\n duration: 0,\n\n lambda_v0: 0,\n one_ve_v0: 0,\n i : null,\n };\n\n interaction.boundInertiaFrame = () => inertiaFrame .apply(interaction);\n interaction.boundSmoothEndFrame = () => smoothEndFrame.apply(interaction);\n});\n\nInteraction.signals.on('down', function ({ interaction, event, pointer, eventTarget }) {\n const status = interaction.inertiaStatus;\n\n // Check if the down event hits the current inertia target\n if (status.active) {\n let element = eventTarget;\n\n // climb up the DOM tree from the event target\n while (utils.is.element(element)) {\n\n // if interaction element is the current inertia target element\n if (element === interaction.element) {\n // stop inertia\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n\n // update pointers to the down event's coordinates\n interaction.updatePointer(pointer);\n utils.setCoords(interaction.curCoords, interaction.pointers);\n\n // fire appropriate signals\n const signalArg = { interaction };\n Interaction.signals.fire('before-action-move', signalArg);\n Interaction.signals.fire('action-resume' , signalArg);\n\n // fire a reume event\n const resumeEvent = new InteractEvent(interaction,\n event,\n interaction.prepared.name,\n 'inertiaresume',\n interaction.element);\n\n interaction.target.fire(resumeEvent);\n interaction.prevEvent = resumeEvent;\n modifiers.resetStatuses(interaction.modifierStatuses);\n\n utils.copyCoords(interaction.prevCoords, interaction.curCoords);\n break;\n }\n\n element = utils.parentNode(element);\n }\n }\n});\n\nInteraction.signals.on('up', function ({ interaction, event }) {\n const status = interaction.inertiaStatus;\n\n if (!interaction.interacting() || status.active) { return; }\n\n const target = interaction.target;\n const options = target && target.options;\n const inertiaOptions = options && interaction.prepared.name && options[interaction.prepared.name].inertia;\n\n const now = new Date().getTime();\n const statuses = {};\n const page = utils.extend({}, interaction.curCoords.page);\n const pointerSpeed = interaction.pointerDelta.client.speed;\n\n let smoothEnd = false;\n let modifierResult;\n\n // check if inertia should be started\n const inertiaPossible = (inertiaOptions && inertiaOptions.enabled\n && interaction.prepared.name !== 'gesture'\n && event !== status.startEvent);\n\n const inertia = (inertiaPossible\n && (now - interaction.curCoords.timeStamp) < 50\n && pointerSpeed > inertiaOptions.minSpeed\n && pointerSpeed > inertiaOptions.endSpeed);\n\n const modifierArg = {\n interaction,\n pageCoords: page,\n statuses,\n preEnd: true,\n requireEndOnly: true,\n };\n\n // smoothEnd\n if (inertiaPossible && !inertia) {\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n if (modifierResult.shouldMove && modifierResult.locked) {\n smoothEnd = true;\n }\n }\n\n if (!(inertia || smoothEnd)) { return; }\n\n utils.copyCoords(status.upCoords, interaction.curCoords);\n\n interaction.pointers[0] = status.startEvent =\n new InteractEvent(interaction, event, interaction.prepared.name, 'inertiastart', interaction.element);\n\n status.t0 = now;\n\n status.active = true;\n status.allowResume = inertiaOptions.allowResume;\n interaction.simulation = status;\n\n target.fire(status.startEvent);\n\n if (inertia) {\n status.vx0 = interaction.pointerDelta.client.vx;\n status.vy0 = interaction.pointerDelta.client.vy;\n status.v0 = pointerSpeed;\n\n calcInertia(interaction, status);\n\n utils.extend(page, interaction.curCoords.page);\n\n page.x += status.xe;\n page.y += status.ye;\n\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n status.modifiedXe += modifierResult.dx;\n status.modifiedYe += modifierResult.dy;\n\n status.i = animationFrame.request(interaction.boundInertiaFrame);\n }\n else {\n status.smoothEnd = true;\n status.xe = modifierResult.dx;\n status.ye = modifierResult.dy;\n\n status.sx = status.sy = 0;\n\n status.i = animationFrame.request(interaction.boundSmoothEndFrame);\n }\n});\n\nInteraction.signals.on('stop-active', function ({ interaction }) {\n const status = interaction.inertiaStatus;\n\n if (status.active) {\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n }\n});\n\nfunction calcInertia (interaction, status) {\n const inertiaOptions = interaction.target.options[interaction.prepared.name].inertia;\n const lambda = inertiaOptions.resistance;\n const inertiaDur = -Math.log(inertiaOptions.endSpeed / status.v0) / lambda;\n\n status.x0 = interaction.prevEvent.pageX;\n status.y0 = interaction.prevEvent.pageY;\n status.t0 = status.startEvent.timeStamp / 1000;\n status.sx = status.sy = 0;\n\n status.modifiedXe = status.xe = (status.vx0 - inertiaDur) / lambda;\n status.modifiedYe = status.ye = (status.vy0 - inertiaDur) / lambda;\n status.te = inertiaDur;\n\n status.lambda_v0 = lambda / status.v0;\n status.one_ve_v0 = 1 - inertiaOptions.endSpeed / status.v0;\n}\n\nfunction inertiaFrame () {\n updateInertiaCoords(this);\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n\n const status = this.inertiaStatus;\n const options = this.target.options[this.prepared.name].inertia;\n const lambda = options.resistance;\n const t = new Date().getTime() / 1000 - status.t0;\n\n if (t < status.te) {\n\n const progress = 1 - (Math.exp(-lambda * t) - status.lambda_v0) / status.one_ve_v0;\n\n if (status.modifiedXe === status.xe && status.modifiedYe === status.ye) {\n status.sx = status.xe * progress;\n status.sy = status.ye * progress;\n }\n else {\n const quadPoint = utils.getQuadraticCurvePoint(0, 0,\n status.xe,\n status.ye,\n status.modifiedXe,\n status.modifiedYe,\n progress);\n\n status.sx = quadPoint.x;\n status.sy = quadPoint.y;\n }\n\n this.doMove();\n\n status.i = animationFrame.request(this.boundInertiaFrame);\n }\n else {\n status.sx = status.modifiedXe;\n status.sy = status.modifiedYe;\n\n this.doMove();\n this.end(status.startEvent);\n status.active = false;\n this.simulation = null;\n }\n\n utils.copyCoords(this.prevCoords, this.curCoords);\n}\n\nfunction smoothEndFrame () {\n updateInertiaCoords(this);\n\n const status = this.inertiaStatus;\n const t = new Date().getTime() - status.t0;\n const duration = this.target.options[this.prepared.name].inertia.smoothEndDuration;\n\n if (t < duration) {\n status.sx = utils.easeOutQuad(t, 0, status.xe, duration);\n status.sy = utils.easeOutQuad(t, 0, status.ye, duration);\n\n this.pointerMove(status.startEvent, status.startEvent);\n\n status.i = animationFrame.request(this.boundSmoothEndFrame);\n }\n else {\n status.sx = status.xe;\n status.sy = status.ye;\n\n this.pointerMove(status.startEvent, status.startEvent);\n this.end(status.startEvent);\n\n status.smoothEnd =\n status.active = false;\n this.simulation = null;\n }\n}\n\nfunction updateInertiaCoords (interaction) {\n const status = interaction.inertiaStatus;\n\n // return if inertia isn't running\n if (!status.active) { return; }\n\n const pageUp = status.upCoords.page;\n const clientUp = status.upCoords.client;\n\n utils.setCoords(interaction.curCoords, [ {\n pageX : pageUp.x + status.sx,\n pageY : pageUp.y + status.sy,\n clientX: clientUp.x + status.sx,\n clientY: clientUp.y + status.sy,\n } ]);\n}\n","const browser = require('./utils/browser');\nconst events = require('./utils/events');\nconst utils = require('./utils');\nconst scope = require('./scope');\nconst Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\n\nconst globalEvents = {};\n\n/*\\\n * interact\n [ method ]\n *\n * The methods of this variable can be used to set elements as\n * interactables and also to change various default settings.\n *\n * Calling it as a function and passing an element or a valid CSS selector\n * string returns an Interactable object which has various methods to\n * configure it.\n *\n - element (Element | string) The HTML or SVG Element to interact with or CSS selector\n = (object) An @Interactable\n *\n > Usage\n | interact('#draggable').draggable(true);\n |\n | var rectables = interact('rect');\n | rectables\n | .gesturable(true)\n | .on('gesturemove', function (event) {\n | // ...\n | });\n\\*/\nfunction interact (element, options) {\n let interactable = scope.interactables.get(element, options);\n\n if (!interactable) {\n interactable = new Interactable(element, options);\n interactable.events.global = globalEvents;\n }\n\n return interactable;\n}\n\n/*\\\n * interact.isSet\n [ method ]\n *\n * Check if an element has been set\n - element (Element) The Element being searched for\n = (boolean) Indicates if the element or CSS selector was previously passed to interact\n\\*/\ninteract.isSet = function (element, options) {\n return scope.interactables.indexOfElement(element, options && options.context) !== -1;\n};\n\n/*\\\n * interact.on\n [ method ]\n *\n * Adds a global listener for an InteractEvent or adds a DOM event to\n * `document`\n *\n - type (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) interact\n\\*/\ninteract.on = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.on(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.on(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n // if it is an InteractEvent type, add listener to globalEvents\n if (utils.contains(Interactable.eventTypes, type)) {\n // if this type of event was never bound\n if (!globalEvents[type]) {\n globalEvents[type] = [listener];\n }\n else {\n globalEvents[type].push(listener);\n }\n }\n // If non InteractEvent type, addEventListener to document\n else {\n events.add(scope.document, type, listener, { options });\n }\n\n return interact;\n};\n\n/*\\\n * interact.off\n [ method ]\n *\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n - type (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) interact\n \\*/\ninteract.off = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.off(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.off(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n if (!utils.contains(Interactable.eventTypes, type)) {\n events.remove(scope.document, type, listener, options);\n }\n else {\n let index;\n\n if (type in globalEvents\n && (index = utils.indexOf(globalEvents[type], listener)) !== -1) {\n globalEvents[type].splice(index, 1);\n }\n }\n\n return interact;\n};\n\n/*\\\n * interact.debug\n [ method ]\n *\n * Returns an object which exposes internal data\n = (object) An object with properties that outline the current state and expose internal functions and variables\n\\*/\ninteract.debug = function () {\n return scope;\n};\n\n// expose the functions used to calculate multi-touch properties\ninteract.getPointerAverage = utils.pointerAverage;\ninteract.getTouchBBox = utils.touchBBox;\ninteract.getTouchDistance = utils.touchDistance;\ninteract.getTouchAngle = utils.touchAngle;\n\ninteract.getElementRect = utils.getElementRect;\ninteract.getElementClientRect = utils.getElementClientRect;\ninteract.matchesSelector = utils.matchesSelector;\ninteract.closest = utils.closest;\n\n/*\\\n * interact.supportsTouch\n [ method ]\n *\n = (boolean) Whether or not the browser supports touch input\n\\*/\ninteract.supportsTouch = function () {\n return browser.supportsTouch;\n};\n\n/*\\\n * interact.supportsPointerEvent\n [ method ]\n *\n = (boolean) Whether or not the browser supports PointerEvents\n\\*/\ninteract.supportsPointerEvent = function () {\n return browser.supportsPointerEvent;\n};\n\n/*\\\n * interact.stop\n [ method ]\n *\n * Cancels all interactions (end events are not fired)\n *\n - event (Event) An event on which to call preventDefault()\n = (object) interact\n\\*/\ninteract.stop = function (event) {\n for (let i = scope.interactions.length - 1; i >= 0; i--) {\n scope.interactions[i].stop(event);\n }\n\n return interact;\n};\n\n/*\\\n * interact.pointerMoveTolerance\n [ method ]\n * Returns or sets the distance the pointer must be moved before an action\n * sequence occurs. This also affects tolerance for tap events.\n *\n - newValue (number) #optional The movement from the start position must be greater than this value\n = (number | Interactable) The current setting or interact\n\\*/\ninteract.pointerMoveTolerance = function (newValue) {\n if (utils.is.number(newValue)) {\n Interaction.pointerMoveTolerance = newValue;\n\n return this;\n }\n\n return Interaction.pointerMoveTolerance;\n};\n\ninteract.addDocument = scope.addDocument;\ninteract.removeDocument = scope.removeDocument;\n\nscope.interact = interact;\n\nmodule.exports = interact;\n","const Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\nconst scope = require('./scope');\nconst is = require('./utils/is');\nconst events = require('./utils/events');\n\nconst { nodeContains, matchesSelector } = require('./utils/domUtils');\n\n/*\\\n * Interactable.preventDefault\n [ method ]\n *\n * Returns or sets whether to prevent the browser's default behaviour\n * in response to pointer events. Can be set to:\n * - `'always'` to always prevent\n * - `'never'` to never prevent\n * - `'auto'` to let interact.js try to determine what would be best\n *\n - newValue (string) #optional `true`, `false` or `'auto'`\n = (string | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.preventDefault = function (newValue) {\n if (/^(always|never|auto)$/.test(newValue)) {\n this.options.preventDefault = newValue;\n return this;\n }\n\n if (is.bool(newValue)) {\n this.options.preventDefault = newValue? 'always' : 'never';\n return this;\n }\n\n return this.options.preventDefault;\n};\n\nInteractable.prototype.checkAndPreventDefault = function (event) {\n const setting = this.options.preventDefault;\n\n if (setting === 'never') { return; }\n\n if (setting === 'always') {\n event.preventDefault();\n return;\n }\n\n // setting === 'auto'\n\n // don't preventDefault if the browser supports passiveEvents\n // CSS touch-action and user-selecct should be used instead\n if (events.supportsOptions) {\n return;\n }\n\n // don't preventDefault of pointerdown events\n if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) {\n return;\n }\n\n // don't preventDefault on editable elements\n if (is.element(event.target)\n && matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) {\n return;\n }\n\n event.preventDefault();\n};\n\nfunction onInteractionEvent ({ interaction, event }) {\n if (interaction.target) {\n interaction.target.checkAndPreventDefault(event);\n }\n}\n\nfor (const eventSignal of ['down', 'move', 'up', 'cancel']) {\n Interaction.signals.on(eventSignal, onInteractionEvent);\n}\n\n// prevent native HTML5 drag on interact.js target elements\nInteraction.docEvents.dragstart = function preventNativeDrag (event) {\n for (const interaction of scope.interactions) {\n\n if (interaction.element\n && (interaction.element === event.target\n || nodeContains(interaction.element, event.target))) {\n\n interaction.target.checkAndPreventDefault(event);\n return;\n }\n }\n};\n","const scope = require('./scope');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst iFinder = require('./utils/interactionFinder');\nconst pointerEvents = require('./pointerEvents/base');\n\nconst { window } = require('./utils/window');\n\nconst toString = Object.prototype.toString;\n\nif (!window.Array.isArray) {\n window.Array.isArray = function (obj) {\n return toString.call(obj) === '[object Array]';\n };\n}\n\nif (!String.prototype.trim) {\n String.prototype.trim = function () {\n return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n };\n}\n\n// http://www.quirksmode.org/dom/events/click.html\n// >Events leading to dblclick\n//\n// IE8 doesn't fire down event before dblclick.\n// This workaround tries to fire a tap and doubletap after dblclick\nfunction onIE8Dblclick (event) {\n const eventTarget = event.target;\n const interaction = iFinder.search(event, event.type, eventTarget);\n\n if (!interaction) { return; }\n\n if (interaction.prevTap\n && event.clientX === interaction.prevTap.clientX\n && event.clientY === interaction.prevTap.clientY\n && eventTarget === interaction.prevTap.target) {\n\n interaction.downTargets[0] = eventTarget;\n interaction.downTimes [0] = new Date().getTime();\n\n pointerEvents.fire({\n interaction,\n event,\n eventTarget,\n pointer: event,\n type: 'tap',\n });\n }\n}\n\nif (browser.isIE8) {\n const selectFix = function (event) {\n for (const interaction of scope.interactions) {\n if (interaction.interacting()) {\n interaction.target.checkAndPreventDefault(event);\n }\n }\n };\n\n const onDocIE8 = function onDocIE8 ({ doc, win }, signalName) {\n const eventMethod = signalName.indexOf('listen') === 0\n ? events.add : events.remove;\n\n // For IE's lack of Event#preventDefault\n eventMethod(doc, 'selectstart', selectFix);\n\n if (pointerEvents) {\n eventMethod(doc, 'dblclick', onIE8Dblclick);\n }\n };\n\n scope.signals.on('add-document' , onDocIE8);\n scope.signals.on('remove-document', onDocIE8);\n}\n\nmodule.exports = null;\n","const InteractEvent = require('../InteractEvent');\nconst Interaction = require('../Interaction');\nconst extend = require('../utils/extend');\n\nconst modifiers = {\n names: [],\n\n setOffsets: function (arg) {\n const { interaction, pageCoords: page } = arg;\n const { target, element, startOffset } = interaction;\n const rect = target.getRect(element);\n\n if (rect) {\n startOffset.left = page.x - rect.left;\n startOffset.top = page.y - rect.top;\n\n startOffset.right = rect.right - page.x;\n startOffset.bottom = rect.bottom - page.y;\n\n if (!('width' in rect)) { rect.width = rect.right - rect.left; }\n if (!('height' in rect)) { rect.height = rect.bottom - rect.top ; }\n }\n else {\n startOffset.left = startOffset.top = startOffset.right = startOffset.bottom = 0;\n }\n\n arg.rect = rect;\n arg.interactable = target;\n arg.element = element;\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n\n arg.options = target.options[interaction.prepared.name][modifierName];\n\n if (!arg.options) {\n continue;\n }\n\n interaction.modifierOffsets[modifierName] = modifiers[modifierName].setOffset(arg);\n }\n },\n\n setAll: function (arg) {\n const { interaction, statuses, preEnd, requireEndOnly } = arg;\n const coords = extend({}, arg.pageCoords);\n const result = {\n dx: 0,\n dy: 0,\n changed: false,\n locked: false,\n shouldMove: true,\n };\n\n for (const modifierName of modifiers.names) {\n const modifier = modifiers[modifierName];\n const options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!shouldDo(options, preEnd, requireEndOnly)) { continue; }\n\n arg.status = arg.status = statuses[modifierName];\n arg.options = options;\n arg.offset = arg.interaction.modifierOffsets[modifierName];\n\n modifier.set(arg);\n\n if (arg.status.locked) {\n coords.x += arg.status.dx;\n coords.y += arg.status.dy;\n\n result.dx += arg.status.dx;\n result.dy += arg.status.dy;\n\n result.locked = true;\n }\n }\n\n // a move should be fired if:\n // - there are no modifiers enabled,\n // - no modifiers are \"locked\" i.e. have changed the pointer's coordinates, or\n // - the locked coords have changed since the last pointer move\n result.shouldMove = !arg.status || !result.locked || arg.status.changed;\n\n return result;\n },\n\n resetStatuses: function (statuses) {\n for (const modifierName of modifiers.names) {\n const status = statuses[modifierName] || {};\n\n status.dx = status.dy = 0;\n status.modifiedX = status.modifiedY = NaN;\n status.locked = false;\n status.changed = true;\n\n statuses[modifierName] = status;\n }\n\n return statuses;\n },\n\n start: function ({ interaction }, signalName) {\n const arg = {\n interaction,\n pageCoords: (signalName === 'action-resume' ?\n interaction.curCoords : interaction.startCoords).page,\n startOffset: interaction.startOffset,\n statuses: interaction.modifierStatuses,\n preEnd: false,\n requireEndOnly: false,\n };\n\n modifiers.setOffsets(arg);\n modifiers.resetStatuses(arg.statuses);\n\n arg.pageCoords = extend({}, interaction.startCoords.page);\n interaction.modifierResult = modifiers.setAll(arg);\n },\n};\n\nInteraction.signals.on('new', function (interaction) {\n interaction.startOffset = { left: 0, right: 0, top: 0, bottom: 0 };\n interaction.modifierOffsets = {};\n interaction.modifierStatuses = modifiers.resetStatuses({});\n interaction.modifierResult = null;\n});\n\nInteraction.signals.on('action-start' , modifiers.start);\nInteraction.signals.on('action-resume', modifiers.start);\n\nInteraction.signals.on('before-action-move', function ({ interaction, preEnd, interactingBeforeMove }) {\n const modifierResult = modifiers.setAll({\n interaction,\n preEnd,\n pageCoords: interaction.curCoords.page,\n statuses: interaction.modifierStatuses,\n requireEndOnly: false,\n });\n\n // don't fire an action move if a modifier would keep the event in the same\n // cordinates as before\n if (!modifierResult.shouldMove && interactingBeforeMove) {\n interaction._dontFireMove = true;\n }\n\n interaction.modifierResult = modifierResult;\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n for (let i = 0; i < modifiers.names.length; i++) {\n const options = interaction.target.options[interaction.prepared.name][modifiers.names[i]];\n\n // if the endOnly option is true for any modifier\n if (shouldDo(options, true, true)) {\n // fire a move event at the modified coordinates\n interaction.doMove({ event, preEnd: true });\n break;\n }\n }\n});\n\nInteractEvent.signals.on('set-xy', function (arg) {\n const { iEvent, interaction } = arg;\n const modifierArg = extend({}, arg);\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n modifierArg.options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!modifierArg.options) {\n continue;\n }\n\n const modifier = modifiers[modifierName];\n\n modifierArg.status = interaction.modifierStatuses[modifierName];\n\n iEvent[modifierName] = modifier.modifyCoords(modifierArg);\n }\n});\n\nfunction shouldDo (options, preEnd, requireEndOnly) {\n return (options && options.enabled\n && (preEnd || !options.endOnly)\n && (!requireEndOnly || options.endOnly));\n}\n\nmodule.exports = modifiers;\n","const modifiers = require('./index');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst restrict = {\n defaults: {\n enabled : false,\n endOnly : false,\n restriction: null,\n elementRect: null,\n },\n\n setOffset: function ({ rect, startOffset, options }) {\n const elementRect = options && options.elementRect;\n const offset = {};\n\n if (rect && elementRect) {\n offset.left = startOffset.left - (rect.width * elementRect.left);\n offset.top = startOffset.top - (rect.height * elementRect.top);\n\n offset.right = startOffset.right - (rect.width * (1 - elementRect.right));\n offset.bottom = startOffset.bottom - (rect.height * (1 - elementRect.bottom));\n }\n else {\n offset.left = offset.top = offset.right = offset.bottom = 0;\n }\n\n return offset;\n },\n\n set: function ({ pageCoords, interaction, status, options }) {\n if (!options) { return status; }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n\n const restriction = getRestrictionRect(options.restriction, interaction, page);\n\n if (!restriction) { return status; }\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n const rect = restriction;\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n const offset = interaction.modifierOffsets.restrict;\n\n // object is assumed to have\n // x, y, width, height or\n // left, top, right, bottom\n if ('x' in restriction && 'y' in restriction) {\n modifiedX = Math.max(Math.min(rect.x + rect.width - offset.right , page.x), rect.x + offset.left);\n modifiedY = Math.max(Math.min(rect.y + rect.height - offset.bottom, page.y), rect.y + offset.top );\n }\n else {\n modifiedX = Math.max(Math.min(rect.right - offset.right , page.x), rect.left + offset.left);\n modifiedY = Math.max(Math.min(rect.bottom - offset.bottom, page.y), rect.top + offset.top );\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const elementRect = options && options.elementRect;\n\n if (options && options.enabled\n && !(phase === 'start' && elementRect && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n getRestrictionRect,\n};\n\nfunction getRestrictionRect (value, interaction, page) {\n if (utils.is.function(value)) {\n return utils.resolveRectLike(value, interaction.target, interaction.element, [page.x, page.y, interaction]);\n } else {\n return utils.resolveRectLike(value, interaction.target, interaction.element);\n }\n}\n\nmodifiers.restrict = restrict;\nmodifiers.names.push('restrict');\n\ndefaultOptions.perAction.restrict = restrict.defaults;\n\nmodule.exports = restrict;\n","// This module adds the options.resize.restrictEdges setting which sets min and\n// max for the top, left, bottom and right edges of the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictEdges: {\n// inner: { top: 200, left: 200, right: 400, bottom: 400 },\n// outer: { top: 0, left: 0, right: 600, bottom: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst { getRestrictionRect } = require('./restrict');\n\nconst noInner = { top: +Infinity, left: +Infinity, bottom: -Infinity, right: -Infinity };\nconst noOuter = { top: -Infinity, left: -Infinity, bottom: +Infinity, right: +Infinity };\n\nconst restrictEdges = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n offset: null,\n },\n\n setOffset: function ({ interaction, startOffset, options }) {\n if (!options) {\n return utils.extend({}, startOffset);\n }\n\n const offset = getRestrictionRect(options.offset, interaction, interaction.startCoords.page);\n\n if (offset) {\n return {\n top: startOffset.top + offset.y,\n left: startOffset.left + offset.x,\n bottom: startOffset.bottom + offset.y,\n right: startOffset.right + offset.x,\n };\n }\n\n return startOffset;\n },\n\n set: function ({ pageCoords, interaction, status, offset, options }) {\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n const inner = rectUtils.xywhToTlbr(getRestrictionRect(options.inner, interaction, page)) || noInner;\n const outer = rectUtils.xywhToTlbr(getRestrictionRect(options.outer, interaction, page)) || noOuter;\n\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n if (edges.top) {\n modifiedY = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top);\n }\n else if (edges.bottom) {\n modifiedY = Math.max(Math.min(outer.bottom - offset.bottom, page.y), inner.bottom - offset.bottom);\n }\n if (edges.left) {\n modifiedX = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left);\n }\n else if (edges.right) {\n modifiedX = Math.max(Math.min(outer.right - offset.right, page.x), inner.right - offset.right);\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n if (options && options.enabled\n && !(phase === 'start' && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n noInner,\n noOuter,\n getRestrictionRect,\n};\n\nmodifiers.restrictEdges = restrictEdges;\nmodifiers.names.push('restrictEdges');\n\ndefaultOptions.perAction.restrictEdges = restrictEdges.defaults;\nresize.defaults.restrictEdges = restrictEdges.defaults;\n\nmodule.exports = restrictEdges;\n","// This module adds the options.resize.restrictSize setting which sets min and\n// max width and height for the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictSize: {\n// min: { width: -600, height: -600 },\n// max: { width: 600, height: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst restrictEdges = require('./restrictEdges');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst noMin = { width: -Infinity, height: -Infinity };\nconst noMax = { width: +Infinity, height: +Infinity };\n\nconst restrictSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n },\n\n setOffset: function ({ interaction }) {\n return interaction.startOffset;\n },\n\n set: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const rect = rectUtils.xywhToTlbr(interaction.resizeRects.inverted);\n\n const minSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.min, interaction)) || noMin;\n const maxSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.max, interaction)) || noMax;\n\n arg.options = {\n enabled: options.enabled,\n endOnly: options.endOnly,\n inner: utils.extend({}, restrictEdges.noInner),\n outer: utils.extend({}, restrictEdges.noOuter),\n };\n\n if (edges.top) {\n arg.options.inner.top = rect.bottom - minSize.height;\n arg.options.outer.top = rect.bottom - maxSize.height;\n }\n else if (edges.bottom) {\n arg.options.inner.bottom = rect.top + minSize.height;\n arg.options.outer.bottom = rect.top + maxSize.height;\n }\n if (edges.left) {\n arg.options.inner.left = rect.right - minSize.width;\n arg.options.outer.left = rect.right - maxSize.width;\n }\n else if (edges.right) {\n arg.options.inner.right = rect.left + minSize.width;\n arg.options.outer.right = rect.left + maxSize.width;\n }\n\n restrictEdges.set(arg);\n },\n\n modifyCoords: restrictEdges.modifyCoords,\n};\n\nmodifiers.restrictSize = restrictSize;\nmodifiers.names.push('restrictSize');\n\ndefaultOptions.perAction.restrictSize = restrictSize.defaults;\nresize.defaults.restrictSize = restrictSize.defaults;\n\nmodule.exports = restrictSize;\n","const modifiers = require('./index');\nconst interact = require('../interact');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst snap = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n\n relativePoints: null,\n },\n\n setOffset: function ({ interaction, interactable, element, rect, startOffset, options }) {\n const offsets = [];\n const optionsOrigin = utils.rectToXY(utils.resolveRectLike(options.origin));\n const origin = optionsOrigin || utils.getOriginXY(interactable, element, interaction.prepared.name);\n options = options || interactable.options[interaction.prepared.name].snap || {};\n\n let snapOffset;\n\n if (options.offset === 'startCoords') {\n snapOffset = {\n x: interaction.startCoords.page.x - origin.x,\n y: interaction.startCoords.page.y - origin.y,\n };\n }\n else {\n const offsetRect = utils.resolveRectLike(options.offset, interactable, element, [interaction]);\n\n snapOffset = utils.rectToXY(offsetRect) || { x: 0, y: 0 };\n }\n\n if (rect && options.relativePoints && options.relativePoints.length) {\n for (const { x: relativeX, y: relativeY } of options.relativePoints) {\n offsets.push({\n x: startOffset.left - (rect.width * relativeX) + snapOffset.x,\n y: startOffset.top - (rect.height * relativeY) + snapOffset.y,\n });\n }\n }\n else {\n offsets.push(snapOffset);\n }\n\n return offsets;\n },\n\n set: function ({ interaction, pageCoords, status, options, offset: offsets }) {\n const targets = [];\n let target;\n let page;\n let i;\n\n if (status.useStatusXY) {\n page = { x: status.x, y: status.y };\n }\n else {\n const origin = utils.getOriginXY(interaction.target, interaction.element, interaction.prepared.name);\n\n page = utils.extend({}, pageCoords);\n\n page.x -= origin.x;\n page.y -= origin.y;\n }\n\n status.realX = page.x;\n status.realY = page.y;\n\n let len = options.targets? options.targets.length : 0;\n\n for (const { x: offsetX, y: offsetY } of offsets) {\n const relativeX = page.x - offsetX;\n const relativeY = page.y - offsetY;\n\n for (const snapTarget of options.targets) {\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n targets.push({\n x: utils.is.number(target.x) ? (target.x + offsetX) : relativeX,\n y: utils.is.number(target.y) ? (target.y + offsetY) : relativeY,\n\n range: utils.is.number(target.range)? target.range: options.range,\n });\n }\n }\n\n const closest = {\n target: null,\n inRange: false,\n distance: 0,\n range: 0,\n dx: 0,\n dy: 0,\n };\n\n for (i = 0, len = targets.length; i < len; i++) {\n target = targets[i];\n\n const range = target.range;\n const dx = target.x - page.x;\n const dy = target.y - page.y;\n const distance = utils.hypot(dx, dy);\n let inRange = distance <= range;\n\n // Infinite targets count as being out of range\n // compared to non infinite ones that are in range\n if (range === Infinity && closest.inRange && closest.range !== Infinity) {\n inRange = false;\n }\n\n if (!closest.target || (inRange\n // is the closest target in range?\n ? (closest.inRange && range !== Infinity\n // the pointer is relatively deeper in this target\n ? distance / range < closest.distance / closest.range\n // this target has Infinite range and the closest doesn't\n : (range === Infinity && closest.range !== Infinity)\n // OR this target is closer that the previous closest\n || distance < closest.distance)\n // The other is not in range and the pointer is closer to this target\n : (!closest.inRange && distance < closest.distance))) {\n\n closest.target = target;\n closest.distance = distance;\n closest.range = range;\n closest.inRange = inRange;\n closest.dx = dx;\n closest.dy = dy;\n\n status.range = range;\n }\n }\n\n let snapChanged;\n\n if (closest.target) {\n snapChanged = (status.modifiedX !== closest.target.x || status.modifiedY !== closest.target.y);\n\n status.modifiedX = closest.target.x;\n status.modifiedY = closest.target.y;\n }\n else {\n snapChanged = true;\n\n status.modifiedX = NaN;\n status.modifiedY = NaN;\n }\n\n status.dx = closest.dx;\n status.dy = closest.dy;\n\n status.changed = (snapChanged || (closest.inRange && !status.locked));\n status.locked = closest.inRange;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const relativePoints = options && options.relativePoints;\n\n if (options && options.enabled\n && !(phase === 'start' && relativePoints && relativePoints.length)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n }\n\n return {\n range : status.range,\n locked : status.locked,\n x : status.modifiedX,\n y : status.modifiedY,\n realX : status.realX,\n realY : status.realY,\n dx : status.dx,\n dy : status.dy,\n };\n }\n },\n};\n\ninteract.createSnapGrid = function (grid) {\n return function (x, y) {\n const limits = grid.limits || {\n left : -Infinity,\n right : Infinity,\n top : -Infinity,\n bottom: Infinity,\n };\n let offsetX = 0;\n let offsetY = 0;\n\n if (utils.is.object(grid.offset)) {\n offsetX = grid.offset.x;\n offsetY = grid.offset.y;\n }\n\n const gridx = Math.round((x - offsetX) / grid.x);\n const gridy = Math.round((y - offsetY) / grid.y);\n\n const newX = Math.max(limits.left, Math.min(limits.right , gridx * grid.x + offsetX));\n const newY = Math.max(limits.top , Math.min(limits.bottom, gridy * grid.y + offsetY));\n\n return {\n x: newX,\n y: newY,\n range: grid.range,\n };\n };\n};\n\nmodifiers.snap = snap;\nmodifiers.names.push('snap');\n\ndefaultOptions.perAction.snap = snap.defaults;\n\nmodule.exports = snap;\n","// This module allows snapping of the size of targets during resize\n// interactions.\n\nconst modifiers = require('./index');\nconst snap = require('./snap');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\nconst utils = require('../utils/');\n\nconst snapSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n },\n\n setOffset: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.edges;\n\n if (!edges) { return; }\n\n arg.options = {\n relativePoints: [{\n x: edges.left? 0 : 1,\n y: edges.top ? 0 : 1,\n }],\n origin: { x: 0, y: 0 },\n offset: 'self',\n range: options.range,\n };\n\n const offsets = snap.setOffset(arg);\n arg.options = options;\n\n return offsets;\n },\n\n set: function (arg) {\n const { interaction, options, offset, pageCoords } = arg;\n const page = utils.extend({}, pageCoords);\n const relativeX = page.x - offset[0].x;\n const relativeY = page.y - offset[0].y;\n\n arg.options = utils.extend({}, options);\n arg.options.targets = [];\n\n for (const snapTarget of options.targets) {\n let target;\n\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n if ('width' in target && 'height' in target) {\n target.x = target.width;\n target.y = target.height;\n }\n\n arg.options.targets.push(target);\n }\n\n snap.set(arg);\n },\n\n modifyCoords: function (arg) {\n const { options } = arg;\n\n arg.options = utils.extend({}, options);\n arg.options.enabled = options.enabled;\n arg.options.relativePoints = [null];\n\n snap.modifyCoords(arg);\n },\n};\n\nmodifiers.snapSize = snapSize;\nmodifiers.names.push('snapSize');\n\ndefaultOptions.perAction.snapSize = snapSize.defaults;\nresize.defaults.snapSize = snapSize.defaults;\n\nmodule.exports = snapSize;\n","const pointerUtils = require('../utils/pointerUtils');\n\nmodule.exports = class PointerEvent {\n constructor (type, pointer, event, eventTarget, interaction) {\n pointerUtils.pointerExtend(this, event);\n\n if (event !== pointer) {\n pointerUtils.pointerExtend(this, pointer);\n }\n\n this.interaction = interaction;\n\n this.timeStamp = new Date().getTime();\n this.originalEvent = event;\n this.type = type;\n this.pointerId = pointerUtils.getPointerId(pointer);\n this.pointerType = pointerUtils.getPointerType(pointer);\n this.target = eventTarget;\n this.currentTarget = null;\n\n if (type === 'tap') {\n const pointerIndex = interaction.getPointerIndex(pointer);\n this.dt = this.timeStamp - interaction.downTimes[pointerIndex];\n\n const interval = this.timeStamp - interaction.tapTime;\n\n this.double = !!(interaction.prevTap\n && interaction.prevTap.type !== 'doubletap'\n && interaction.prevTap.target === this.target\n && interval < 500);\n }\n else if (type === 'doubletap') {\n this.dt = pointer.timeStamp - interaction.tapTime;\n }\n }\n\n subtractOrigin ({ x: originX, y: originY }) {\n this.pageX -= originX;\n this.pageY -= originY;\n this.clientX -= originX;\n this.clientY -= originY;\n\n return this;\n }\n\n addOrigin ({ x: originX, y: originY }) {\n this.pageX += originX;\n this.pageY += originY;\n this.clientX += originX;\n this.clientY += originY;\n\n return this;\n }\n\n preventDefault () {\n this.originalEvent.preventDefault();\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n};\n","const PointerEvent = require('./PointerEvent');\nconst Interaction = require('../Interaction');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst defaults = require('../defaultOptions');\nconst signals = require('../utils/Signals').new();\nconst { filter } = require('../utils/arr');\n\nconst simpleSignals = [ 'down', 'up', 'cancel' ];\nconst simpleEvents = [ 'down', 'up', 'cancel' ];\n\nconst pointerEvents = {\n PointerEvent,\n fire,\n collectEventTargets,\n signals,\n defaults: {\n holdDuration: 600,\n ignoreFrom : null,\n allowFrom : null,\n origin : { x: 0, y: 0 },\n },\n types: [\n 'down',\n 'move',\n 'up',\n 'cancel',\n 'tap',\n 'doubletap',\n 'hold',\n ],\n};\n\nfunction fire (arg) {\n const {\n interaction, pointer, event, eventTarget,\n type = arg.pointerEvent.type,\n targets = collectEventTargets(arg),\n pointerEvent = new PointerEvent(type, pointer, event, eventTarget, interaction),\n } = arg;\n\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n targets,\n type,\n pointerEvent,\n };\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n\n for (const prop in target.props || {}) {\n pointerEvent[prop] = target.props[prop];\n }\n\n const origin = utils.getOriginXY(target.eventable, target.element);\n\n pointerEvent.subtractOrigin(origin);\n pointerEvent.eventable = target.eventable;\n pointerEvent.currentTarget = target.element;\n\n target.eventable.fire(pointerEvent);\n\n pointerEvent.addOrigin(origin);\n\n if (pointerEvent.immediatePropagationStopped\n || (pointerEvent.propagationStopped\n && (i + 1) < targets.length && targets[i + 1].element !== pointerEvent.currentTarget)) {\n break;\n }\n }\n\n signals.fire('fired', signalArg);\n\n if (type === 'tap') {\n // if pointerEvent should make a double tap, create and fire a doubletap\n // PointerEvent and use that as the prevTap\n const prevTap = pointerEvent.double\n ? fire({\n interaction, pointer, event, eventTarget,\n type: 'doubletap',\n })\n : pointerEvent;\n\n interaction.prevTap = prevTap;\n interaction.tapTime = prevTap.timeStamp;\n }\n\n return pointerEvent;\n}\n\nfunction collectEventTargets ({ interaction, pointer, event, eventTarget, type }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n // do not fire a tap event if the pointer was moved before being lifted\n if (type === 'tap' && (interaction.pointerWasMoved\n // or if the pointerup target is different to the pointerdown target\n || !(interaction.downTargets[pointerIndex] && interaction.downTargets[pointerIndex] === eventTarget))) {\n return [];\n }\n\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n path,\n targets: [],\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (type === 'hold') {\n signalArg.targets = filter(signalArg.targets, target =>\n target.eventable.options.holdDuration === interaction.holdTimers[pointerIndex].duration);\n }\n\n return signalArg.targets;\n}\n\nInteraction.signals.on('update-pointer-down', function ({ interaction, pointerIndex }) {\n interaction.holdTimers[pointerIndex] = { duration: Infinity, timeout: null };\n});\n\nInteraction.signals.on('remove-pointer', function ({ interaction, pointerIndex }) {\n interaction.holdTimers.splice(pointerIndex, 1);\n});\n\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget, duplicateMove }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n if (!duplicateMove && (!interaction.pointerIsDown || interaction.pointerWasMoved)) {\n if (interaction.pointerIsDown) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n\n fire({\n interaction, pointer, event, eventTarget,\n type: 'move',\n });\n }\n});\n\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget, pointerIndex }) {\n // copy event to be used in timeout for IE8\n const eventCopy = browser.isIE8? utils.extend({}, event) : event;\n\n const timer = interaction.holdTimers[pointerIndex];\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'hold',\n targets: [],\n path,\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (!signalArg.targets.length) { return; }\n\n let minDuration = Infinity;\n\n for (let i = 0; i < signalArg.targets.length; i++) {\n const target = signalArg.targets[i];\n const holdDuration = target.eventable.options.holdDuration;\n\n if (holdDuration < minDuration) {\n minDuration = holdDuration;\n }\n }\n\n timer.duration = minDuration;\n timer.timeout = setTimeout(function () {\n fire({\n interaction,\n eventTarget,\n pointer: browser.isIE8? eventCopy : pointer,\n event: eventCopy,\n type: 'hold',\n });\n }, minDuration);\n});\n\nInteraction.signals.on('up', ({ interaction, pointer, event, eventTarget }) => {\n if (!interaction.pointerWasMoved) {\n fire({ interaction, eventTarget, pointer, event, type: 'tap' });\n }\n});\n\n['up', 'cancel'].forEach(function (signalName) {\n Interaction.signals.on(signalName, function ({ interaction, pointerIndex }) {\n if (interaction.holdTimers[pointerIndex]) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n });\n});\n\nfunction createSignalListener (type) {\n return function ({ interaction, pointer, event, eventTarget }) {\n fire({ interaction, eventTarget, pointer, event, type });\n };\n}\n\nfor (let i = 0; i < simpleSignals.length; i++) {\n Interaction.signals.on(simpleSignals[i], createSignalListener(simpleEvents[i]));\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.prevTap = null; // the most recent tap event on this interaction\n interaction.tapTime = 0; // time of the most recent tap event\n interaction.holdTimers = []; // [{ duration, timeout }]\n});\n\ndefaults.pointerEvents = pointerEvents.defaults;\nmodule.exports = pointerEvents;\n","const pointerEvents = require('./base');\nconst Interaction = require('../Interaction');\n\npointerEvents.signals.on('new', onNew);\npointerEvents.signals.on('fired', onFired);\n\nfor (const signal of ['move', 'up', 'cancel', 'endall']) {\n Interaction.signals.on(signal, endHoldRepeat);\n}\n\nfunction onNew ({ pointerEvent }) {\n if (pointerEvent.type !== 'hold') { return; }\n\n pointerEvent.count = (pointerEvent.count || 0) + 1;\n}\n\nfunction onFired ({ interaction, pointerEvent, eventTarget, targets }) {\n if (pointerEvent.type !== 'hold' || !targets.length) { return; }\n\n // get the repeat interval from the first eventable\n const interval = targets[0].eventable.options.holdRepeatInterval;\n\n // don't repeat if the interval is 0 or less\n if (interval <= 0) { return; }\n\n // set a timeout to fire the holdrepeat event\n interaction.holdIntervalHandle = setTimeout(function () {\n pointerEvents.fire({\n interaction,\n eventTarget,\n type: 'hold',\n pointer: pointerEvent,\n event: pointerEvent,\n });\n }, interval);\n}\n\nfunction endHoldRepeat ({ interaction }) {\n // set the interaction's holdStopTime property\n // to stop further holdRepeat events\n if (interaction.holdIntervalHandle) {\n clearInterval(interaction.holdIntervalHandle);\n interaction.holdIntervalHandle = null;\n }\n}\n\n// don't repeat by default\npointerEvents.defaults.holdRepeatInterval = 0;\npointerEvents.types.push('holdrepeat');\n\nmodule.exports = {\n onNew,\n onFired,\n endHoldRepeat,\n};\n","const pointerEvents = require('./base');\nconst Interactable = require('../Interactable');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\nconst scope = require('../scope');\nconst extend = require('../utils/extend');\nconst { merge } = require('../utils/arr');\n\npointerEvents.signals.on('collect-targets', function ({ targets, element, type, eventTarget }) {\n function collectSelectors (interactable, selector, context) {\n const els = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && is.element(element)\n && domUtils.matchesSelector(element, selector, els)\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n const interactable = scope.interactables.get(element);\n\n if (interactable) {\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n scope.interactables.forEachSelector(collectSelectors, element);\n});\n\nInteractable.signals.on('new', function ({ interactable }) {\n interactable.events.getRect = function (element) {\n return interactable.getRect(element);\n };\n});\n\nInteractable.signals.on('set', function ({ interactable, options }) {\n extend(interactable.events.options, pointerEvents.defaults);\n extend(interactable.events.options, options);\n});\n\nmerge(Interactable.eventTypes, pointerEvents.types);\n\nInteractable.prototype.pointerEvents = function (options) {\n extend(this.events.options, options);\n\n return this;\n};\n\nconst __backCompatOption = Interactable.prototype._backCompatOption;\n\nInteractable.prototype._backCompatOption = function (optionName, newValue) {\n const ret = __backCompatOption.call(this, optionName, newValue);\n\n if (ret === this) {\n this.events.options[optionName] = newValue;\n }\n\n return ret;\n};\n\nInteractable.settingsMethods.push('pointerEvents');\n","const utils = require('./utils');\nconst events = require('./utils/events');\nconst signals = require('./utils/Signals').new();\n\nconst scope = {\n signals,\n events,\n utils,\n\n // main document\n document: require('./utils/domObjects').document,\n // all documents being listened to\n documents: [],\n\n addDocument: function (doc, win) {\n // do nothing if document is already known\n if (utils.contains(scope.documents, doc)) { return false; }\n\n win = win || scope.getWindow(doc);\n\n scope.documents.push(doc);\n events.documents.push(doc);\n\n // don't add an unload event for the main document\n // so that the page may be cached in browser history\n if (doc !== scope.document) {\n events.add(win, 'unload', scope.onWindowUnload);\n }\n\n signals.fire('add-document', { doc, win });\n },\n\n removeDocument: function (doc, win) {\n const index = utils.indexOf(scope.documents, doc);\n\n win = win || scope.getWindow(doc);\n\n events.remove(win, 'unload', scope.onWindowUnload);\n\n scope.documents.splice(index, 1);\n events.documents.splice(index, 1);\n\n signals.fire('remove-document', { win, doc });\n },\n\n onWindowUnload: function () {\n scope.removeDocument(this.document, this);\n },\n};\n\nmodule.exports = scope;\n","const { indexOf } = require('./arr');\n\nclass Signals {\n constructor () {\n this.listeners = {\n // signalName: [listeners],\n };\n }\n\n on (name, listener) {\n if (!this.listeners[name]) {\n this.listeners[name] = [listener];\n return;\n }\n\n this.listeners[name].push(listener);\n }\n\n off (name, listener) {\n if (!this.listeners[name]) { return; }\n\n const index = indexOf(this.listeners[name], listener);\n\n if (index !== -1) {\n this.listeners[name].splice(index, 1);\n }\n }\n\n fire (name, arg) {\n const targetListeners = this.listeners[name];\n\n if (!targetListeners) { return; }\n\n for (let i = 0; i < targetListeners.length; i++) {\n if (targetListeners[i](arg, name) === false) {\n return;\n }\n }\n }\n}\n\nSignals.new = function () {\n return new Signals();\n};\n\nmodule.exports = Signals;\n","function indexOf (array, target) {\n for (let i = 0, len = array.length; i < len; i++) {\n if (array[i] === target) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction contains (array, target) {\n return indexOf(array, target) !== -1;\n}\n\nfunction merge (target, source) {\n for (let i = 0; i < source.length; i++) {\n target.push(source[i]);\n }\n\n return target;\n}\n\nfunction filter (array, test) {\n const result = [];\n\n for (let i = 0; i < array.length; i++) {\n if (test(array[i])) {\n result.push(array[i]);\n }\n }\n\n return result;\n}\n\nmodule.exports = {\n indexOf,\n contains,\n merge,\n filter,\n};\n","const { window } = require('./window');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst Element = domObjects.Element;\nconst navigator = window.navigator;\n\nconst browser = {\n // Does the browser support touch input?\n supportsTouch: !!(('ontouchstart' in window) || is.function(window.DocumentTouch)\n && domObjects.document instanceof window.DocumentTouch),\n\n // Does the browser support PointerEvents\n supportsPointerEvent: !!domObjects.PointerEvent,\n\n isIE8: ('attachEvent' in window) && !('addEventListener' in window),\n\n // Opera Mobile must be handled differently\n isOperaMobile: (navigator.appName === 'Opera'\n && browser.supportsTouch\n && navigator.userAgent.match('Presto')),\n\n // scrolling doesn't change the result of getClientRects on iOS 7\n isIOS7: (/iP(hone|od|ad)/.test(navigator.platform)\n && /OS 7[^\\d]/.test(navigator.appVersion)),\n\n isIe9OrOlder: /MSIE (8|9)/.test(navigator.userAgent),\n\n // prefix matchesSelector\n prefixedMatchesSelector: 'matches' in Element.prototype\n ? 'matches': 'webkitMatchesSelector' in Element.prototype\n ? 'webkitMatchesSelector': 'mozMatchesSelector' in Element.prototype\n ? 'mozMatchesSelector': 'oMatchesSelector' in Element.prototype\n ? 'oMatchesSelector': 'msMatchesSelector',\n\n useMatchesSelectorPolyfill: false,\n\n pEventTypes: (domObjects.PointerEvent\n ? (domObjects.PointerEvent === window.MSPointerEvent\n ? {\n up: 'MSPointerUp',\n down: 'MSPointerDown',\n over: 'mouseover',\n out: 'mouseout',\n move: 'MSPointerMove',\n cancel: 'MSPointerCancel',\n }\n : {\n up: 'pointerup',\n down: 'pointerdown',\n over: 'pointerover',\n out: 'pointerout',\n move: 'pointermove',\n cancel: 'pointercancel',\n })\n : null),\n\n // because Webkit and Opera still use 'mousewheel' event type\n wheelEvent: 'onmousewheel' in domObjects.document? 'mousewheel': 'wheel',\n\n};\n\nbrowser.useMatchesSelectorPolyfill = !is.function(Element.prototype[browser.prefixedMatchesSelector]);\n\nmodule.exports = browser;\n","const domObjects = {};\nconst win = require('./window').window;\n\nfunction blank () {}\n\ndomObjects.document = win.document;\ndomObjects.DocumentFragment = win.DocumentFragment || blank;\ndomObjects.SVGElement = win.SVGElement || blank;\ndomObjects.SVGSVGElement = win.SVGSVGElement || blank;\ndomObjects.SVGElementInstance = win.SVGElementInstance || blank;\ndomObjects.Element = win.Element || blank;\ndomObjects.HTMLElement = win.HTMLElement || domObjects.Element;\n\ndomObjects.Event = win.Event;\ndomObjects.Touch = win.Touch || blank;\ndomObjects.PointerEvent = (win.PointerEvent || win.MSPointerEvent);\n\nmodule.exports = domObjects;\n","const win = require('./window');\nconst browser = require('./browser');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst domUtils = {\n nodeContains: function (parent, child) {\n while (child) {\n if (child === parent) {\n return true;\n }\n\n child = child.parentNode;\n }\n\n return false;\n },\n\n closest: function (element, selector) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) { return element; }\n\n element = domUtils.parentNode(element);\n }\n\n return null;\n },\n\n parentNode: function (node) {\n let parent = node.parentNode;\n\n if (is.docFrag(parent)) {\n // skip past #shado-root fragments\n while ((parent = parent.host) && is.docFrag(parent)) {\n continue;\n }\n\n return parent;\n }\n\n return parent;\n },\n\n // taken from http://tanalin.com/en/blog/2012/12/matches-selector-ie8/ and modified\n matchesSelectorPolyfill: browser.useMatchesSelectorPolyfill\n ? function (element, selector, elems) {\n elems = elems || element.parentNode.querySelectorAll(selector);\n\n for (let i = 0, len = elems.length; i < len; i++) {\n if (elems[i] === element) {\n return true;\n }\n }\n\n return false;\n }\n : null,\n\n matchesSelector: function (element, selector, nodeList) {\n if (browser.useMatchesSelectorPolyfill) {\n return domUtils.matchesSelectorPolyfill(element, selector, nodeList);\n }\n\n // remove /deep/ from selectors if shadowDOM polyfill is used\n if (win.window !== win.realWindow) {\n selector = selector.replace(/\\/deep\\//g, ' ');\n }\n\n return element[browser.prefixedMatchesSelector](selector);\n },\n\n // Test for the element that's \"above\" all other qualifiers\n indexOfDeepestElement: function (elements) {\n let deepestZoneParents = [];\n let dropzoneParents = [];\n let dropzone;\n let deepestZone = elements[0];\n let index = deepestZone? 0: -1;\n let parent;\n let child;\n let i;\n let n;\n\n for (i = 1; i < elements.length; i++) {\n dropzone = elements[i];\n\n // an element might belong to multiple selector dropzones\n if (!dropzone || dropzone === deepestZone) {\n continue;\n }\n\n if (!deepestZone) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n // check if the deepest or current are document.documentElement or document.rootElement\n // - if the current dropzone is, do nothing and continue\n if (dropzone.parentNode === dropzone.ownerDocument) {\n continue;\n }\n // - if deepest is, update with the current dropzone and continue to next\n else if (deepestZone.parentNode === dropzone.ownerDocument) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n if (!deepestZoneParents.length) {\n parent = deepestZone;\n while (parent.parentNode && parent.parentNode !== parent.ownerDocument) {\n deepestZoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n }\n\n // if this element is an svg element and the current deepest is\n // an HTMLElement\n if (deepestZone instanceof domObjects.HTMLElement\n && dropzone instanceof domObjects.SVGElement\n && !(dropzone instanceof domObjects.SVGSVGElement)) {\n\n if (dropzone === deepestZone.parentNode) {\n continue;\n }\n\n parent = dropzone.ownerSVGElement;\n }\n else {\n parent = dropzone;\n }\n\n dropzoneParents = [];\n\n while (parent.parentNode !== parent.ownerDocument) {\n dropzoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n\n n = 0;\n\n // get (position of last common ancestor) + 1\n while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) {\n n++;\n }\n\n const parents = [\n dropzoneParents[n - 1],\n dropzoneParents[n],\n deepestZoneParents[n],\n ];\n\n child = parents[0].lastChild;\n\n while (child) {\n if (child === parents[1]) {\n deepestZone = dropzone;\n index = i;\n deepestZoneParents = [];\n\n break;\n }\n else if (child === parents[2]) {\n break;\n }\n\n child = child.previousSibling;\n }\n }\n\n return index;\n },\n\n matchesUpTo: function (element, selector, limit) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) {\n return true;\n }\n\n element = domUtils.parentNode(element);\n\n if (element === limit) {\n return domUtils.matchesSelector(element, selector);\n }\n }\n\n return false;\n },\n\n getActualElement: function (element) {\n return (element instanceof domObjects.SVGElementInstance\n ? element.correspondingUseElement\n : element);\n },\n\n getScrollXY: function (relevantWindow) {\n relevantWindow = relevantWindow || win.window;\n return {\n x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft,\n y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop,\n };\n },\n\n getElementClientRect: function (element) {\n const clientRect = (element instanceof domObjects.SVGElement\n ? element.getBoundingClientRect()\n : element.getClientRects()[0]);\n\n return clientRect && {\n left : clientRect.left,\n right : clientRect.right,\n top : clientRect.top,\n bottom: clientRect.bottom,\n width : clientRect.width || clientRect.right - clientRect.left,\n height: clientRect.height || clientRect.bottom - clientRect.top,\n };\n },\n\n getElementRect: function (element) {\n const clientRect = domUtils.getElementClientRect(element);\n\n if (!browser.isIOS7 && clientRect) {\n const scroll = domUtils.getScrollXY(win.getWindow(element));\n\n clientRect.left += scroll.x;\n clientRect.right += scroll.x;\n clientRect.top += scroll.y;\n clientRect.bottom += scroll.y;\n }\n\n return clientRect;\n },\n\n getPath: function (element) {\n const path = [];\n\n while (element) {\n path.push(element);\n element = domUtils.parentNode(element);\n }\n\n return path;\n },\n\n trySelector: value => {\n if (!is.string(value)) { return false; }\n\n // an exception will be raised if it is invalid\n domObjects.document.querySelector(value);\n return true;\n },\n};\n\nmodule.exports = domUtils;\n","const is = require('./is');\nconst domUtils = require('./domUtils');\nconst pExtend = require('./pointerExtend');\n\nconst { window, getWindow } = require('./window');\nconst { indexOf, contains } = require('./arr');\n\nconst useAttachEvent = ('attachEvent' in window) && !('addEventListener' in window);\nconst addEvent = useAttachEvent? 'attachEvent': 'addEventListener';\nconst removeEvent = useAttachEvent? 'detachEvent': 'removeEventListener';\nconst on = useAttachEvent? 'on': '';\n\nconst elements = [];\nconst targets = [];\nconst attachedListeners = [];\n\n// {\n// type: {\n// selectors: ['selector', ...],\n// contexts : [document, ...],\n// listeners: [[listener, capture, passive], ...]\n// }\n// }\nconst delegatedEvents = {};\n\nconst documents = [];\n\nconst supportsOptions = !useAttachEvent && (() => {\n let supported = false;\n\n window.document.createElement('div').addEventListener('test', null, {\n get capture () { supported = true; },\n });\n\n return supported;\n})();\n\nfunction add (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n let elementIndex = indexOf(elements, element);\n let target = targets[elementIndex];\n\n if (!target) {\n target = {\n events: {},\n typeCount: 0,\n };\n\n elementIndex = elements.push(element) - 1;\n targets.push(target);\n\n attachedListeners.push(useAttachEvent\n ? {\n supplied: [],\n wrapped : [],\n useCount: [],\n }\n : null);\n }\n\n if (!target.events[type]) {\n target.events[type] = [];\n target.typeCount++;\n }\n\n if (!contains(target.events[type], listener)) {\n let ret;\n\n if (useAttachEvent) {\n const { supplied, wrapped, useCount } = attachedListeners[elementIndex];\n const listenerIndex = indexOf(supplied, listener);\n\n const wrappedListener = wrapped[listenerIndex] || function (event) {\n if (!event.immediatePropagationStopped) {\n event.target = event.srcElement;\n event.currentTarget = element;\n\n event.preventDefault = event.preventDefault || preventDef;\n event.stopPropagation = event.stopPropagation || stopProp;\n event.stopImmediatePropagation = event.stopImmediatePropagation || stopImmProp;\n\n if (/mouse|click/.test(event.type)) {\n event.pageX = event.clientX + getWindow(element).document.documentElement.scrollLeft;\n event.pageY = event.clientY + getWindow(element).document.documentElement.scrollTop;\n }\n\n listener(event);\n }\n };\n\n ret = element[addEvent](on + type, wrappedListener, !!options.capture);\n\n if (listenerIndex === -1) {\n supplied.push(listener);\n wrapped.push(wrappedListener);\n useCount.push(1);\n }\n else {\n useCount[listenerIndex]++;\n }\n }\n else {\n ret = element[addEvent](type, listener, supportsOptions? options : !!options.capture);\n }\n target.events[type].push(listener);\n\n return ret;\n }\n}\n\nfunction remove (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const elementIndex = indexOf(elements, element);\n const target = targets[elementIndex];\n\n if (!target || !target.events) {\n return;\n }\n\n let wrappedListener = listener;\n let listeners;\n let listenerIndex;\n\n if (useAttachEvent) {\n listeners = attachedListeners[elementIndex];\n listenerIndex = indexOf(listeners.supplied, listener);\n wrappedListener = listeners.wrapped[listenerIndex];\n }\n\n if (type === 'all') {\n for (type in target.events) {\n if (target.events.hasOwnProperty(type)) {\n remove(element, type, 'all');\n }\n }\n return;\n }\n\n if (target.events[type]) {\n const len = target.events[type].length;\n\n if (listener === 'all') {\n for (let i = 0; i < len; i++) {\n remove(element, type, target.events[type][i], options);\n }\n return;\n }\n else {\n for (let i = 0; i < len; i++) {\n if (target.events[type][i] === listener) {\n element[removeEvent](on + type, wrappedListener, supportsOptions? options : !!options.capture);\n target.events[type].splice(i, 1);\n\n if (useAttachEvent && listeners) {\n listeners.useCount[listenerIndex]--;\n if (listeners.useCount[listenerIndex] === 0) {\n listeners.supplied.splice(listenerIndex, 1);\n listeners.wrapped.splice(listenerIndex, 1);\n listeners.useCount.splice(listenerIndex, 1);\n }\n }\n\n break;\n }\n }\n }\n\n if (target.events[type] && target.events[type].length === 0) {\n target.events[type] = null;\n target.typeCount--;\n }\n }\n\n if (!target.typeCount) {\n targets.splice(elementIndex, 1);\n elements.splice(elementIndex, 1);\n attachedListeners.splice(elementIndex, 1);\n }\n}\n\nfunction addDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n if (!delegatedEvents[type]) {\n delegatedEvents[type] = {\n selectors: [],\n contexts : [],\n listeners: [],\n };\n\n // add delegate listener functions\n for (let i = 0; i < documents.length; i++) {\n add(documents[i], type, delegateListener);\n add(documents[i], type, delegateUseCapture, true);\n }\n }\n\n const delegated = delegatedEvents[type];\n let index;\n\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n break;\n }\n }\n\n if (index === -1) {\n index = delegated.selectors.length;\n\n delegated.selectors.push(selector);\n delegated.contexts .push(context);\n delegated.listeners.push([]);\n }\n\n // keep listener and capture and passive flags\n delegated.listeners[index].push([listener, !!options.capture, options.passive]);\n}\n\nfunction removeDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const delegated = delegatedEvents[type];\n let matchFound = false;\n let index;\n\n if (!delegated) { return; }\n\n // count from last index of delegated to 0\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n // look for matching selector and context Node\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n\n const listeners = delegated.listeners[index];\n\n // each item of the listeners array is an array: [function, capture, passive]\n for (let i = listeners.length - 1; i >= 0; i--) {\n const [fn, capture, passive] = listeners[i];\n\n // check if the listener functions and capture and passive flags match\n if (fn === listener && capture === !!options.capture && passive === options.passive) {\n // remove the listener from the array of listeners\n listeners.splice(i, 1);\n\n // if all listeners for this interactable have been removed\n // remove the interactable from the delegated arrays\n if (!listeners.length) {\n delegated.selectors.splice(index, 1);\n delegated.contexts .splice(index, 1);\n delegated.listeners.splice(index, 1);\n\n // remove delegate function from context\n remove(context, type, delegateListener);\n remove(context, type, delegateUseCapture, true);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegatedEvents[type] = null;\n }\n }\n\n // only remove one listener\n matchFound = true;\n break;\n }\n }\n\n if (matchFound) { break; }\n }\n }\n}\n\n// bound to the interactable context when a DOM event\n// listener is added to a selector interactable\nfunction delegateListener (event, optionalArg) {\n const options = getOptions(optionalArg);\n const fakeEvent = {};\n const delegated = delegatedEvents[event.type];\n const eventTarget = (domUtils.getActualElement(event.path\n ? event.path[0]\n : event.target));\n let element = eventTarget;\n\n // duplicate the event so that currentTarget can be changed\n pExtend(fakeEvent, event);\n\n fakeEvent.originalEvent = event;\n fakeEvent.preventDefault = preventOriginalDefault;\n\n // climb up document tree looking for selector matches\n while (is.element(element)) {\n for (let i = 0; i < delegated.selectors.length; i++) {\n const selector = delegated.selectors[i];\n const context = delegated.contexts[i];\n\n if (domUtils.matchesSelector(element, selector)\n && domUtils.nodeContains(context, eventTarget)\n && domUtils.nodeContains(context, element)) {\n\n const listeners = delegated.listeners[i];\n\n fakeEvent.currentTarget = element;\n\n for (let j = 0; j < listeners.length; j++) {\n const [fn, capture, passive] = listeners[j];\n\n if (capture === !!options.capture && passive === options.passive) {\n fn(fakeEvent);\n }\n }\n }\n }\n\n element = domUtils.parentNode(element);\n }\n}\n\nfunction delegateUseCapture (event) {\n return delegateListener.call(this, event, true);\n}\n\nfunction preventDef () {\n this.returnValue = false;\n}\n\nfunction preventOriginalDefault () {\n this.originalEvent.preventDefault();\n}\n\nfunction stopProp () {\n this.cancelBubble = true;\n}\n\nfunction stopImmProp () {\n this.cancelBubble = true;\n this.immediatePropagationStopped = true;\n}\n\nfunction getOptions (param) {\n return is.object(param)? param : { capture: param };\n}\n\nmodule.exports = {\n add,\n remove,\n\n addDelegate,\n removeDelegate,\n\n delegateListener,\n delegateUseCapture,\n delegatedEvents,\n documents,\n\n useAttachEvent,\n supportsOptions,\n\n _elements: elements,\n _targets: targets,\n _attachedListeners: attachedListeners,\n};\n","module.exports = function extend (dest, source) {\n for (const prop in source) {\n dest[prop] = source[prop];\n }\n return dest;\n};\n","const {\n resolveRectLike,\n rectToXY,\n} = require('./rect');\n\nmodule.exports = function (target, element, action) {\n const actionOptions = target.options[action];\n const actionOrigin = actionOptions && actionOptions.origin;\n const origin = actionOrigin || target.options.origin;\n\n const originRect = resolveRectLike(origin, target, element, [target && element]);\n\n return rectToXY(originRect) || { x: 0, y: 0 };\n};\n","module.exports = (x, y) => Math.sqrt(x * x + y * y);\n","const extend = require('./extend');\nconst win = require('./window');\n\nconst utils = {\n warnOnce: function (method, message) {\n let warned = false;\n\n return function () {\n if (!warned) {\n win.window.console.warn(message);\n warned = true;\n }\n\n return method.apply(this, arguments);\n };\n },\n\n // http://stackoverflow.com/a/5634528/2280888\n _getQBezierValue: function (t, p1, p2, p3) {\n const iT = 1 - t;\n return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3;\n },\n\n getQuadraticCurvePoint: function (startX, startY, cpX, cpY, endX, endY, position) {\n return {\n x: utils._getQBezierValue(position, startX, cpX, endX),\n y: utils._getQBezierValue(position, startY, cpY, endY),\n };\n },\n\n // http://gizma.com/easing/\n easeOutQuad: function (t, b, c, d) {\n t /= d;\n return -c * t*(t-2) + b;\n },\n\n copyAction: function (dest, src) {\n dest.name = src.name;\n dest.axis = src.axis;\n dest.edges = src.edges;\n\n return dest;\n },\n\n is : require('./is'),\n extend : extend,\n hypot : require('./hypot'),\n getOriginXY: require('./getOriginXY'),\n};\n\nextend(utils, require('./arr'));\nextend(utils, require('./domUtils'));\nextend(utils, require('./pointerUtils'));\nextend(utils, require('./rect'));\n\nmodule.exports = utils;\n","const scope = require('../scope');\nconst utils = require('./index');\n\nconst finder = {\n methodOrder: [ 'simulationResume', 'mouseOrPen', 'hasPointer', 'idle' ],\n\n search: function (pointer, eventType, eventTarget) {\n const pointerType = utils.getPointerType(pointer);\n const pointerId = utils.getPointerId(pointer);\n const details = { pointer, pointerId, pointerType, eventType, eventTarget };\n\n for (const method of finder.methodOrder) {\n const interaction = finder[method](details);\n\n if (interaction) {\n return interaction;\n }\n }\n },\n\n // try to resume simulation with a new pointer\n simulationResume: function ({ pointerType, eventType, eventTarget }) {\n if (!/down|start/i.test(eventType)) {\n return null;\n }\n\n for (const interaction of scope.interactions) {\n let element = eventTarget;\n\n if (interaction.simulation && interaction.simulation.allowResume\n && (interaction.pointerType === pointerType)) {\n while (element) {\n // if the element is the interaction element\n if (element === interaction.element) {\n return interaction;\n }\n element = utils.parentNode(element);\n }\n }\n }\n\n return null;\n },\n\n // if it's a mouse or pen interaction\n mouseOrPen: function ({ pointerId, pointerType, eventType }) {\n if (pointerType !== 'mouse' && pointerType !== 'pen') {\n return null;\n }\n\n let firstNonActive;\n\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType) {\n // if it's a down event, skip interactions with running simulations\n if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; }\n\n // if the interaction is active, return it immediately\n if (interaction.interacting()) {\n return interaction;\n }\n // otherwise save it and look for another active interaction\n else if (!firstNonActive) {\n firstNonActive = interaction;\n }\n }\n }\n\n // if no active mouse interaction was found use the first inactive mouse\n // interaction\n if (firstNonActive) {\n return firstNonActive;\n }\n\n // find any mouse or pen interaction.\n // ignore the interaction if the eventType is a *down, and a simulation\n // is active\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType && !(/down/i.test(eventType) && interaction.simulation)) {\n return interaction;\n }\n }\n\n return null;\n },\n\n // get interaction that has this pointer\n hasPointer: function ({ pointerId }) {\n for (const interaction of scope.interactions) {\n if (utils.contains(interaction.pointerIds, pointerId)) {\n return interaction;\n }\n }\n },\n\n // get first idle interaction with a matching pointerType\n idle: function ({ pointerType }) {\n for (const interaction of scope.interactions) {\n // if there's already a pointer held down\n if (interaction.pointerIds.length === 1) {\n const target = interaction.target;\n // don't add this pointer if there is a target interactable and it\n // isn't gesturable\n if (target && !target.options.gesture.enabled) {\n continue;\n }\n }\n // maximum of 2 pointers per interaction\n else if (interaction.pointerIds.length >= 2) {\n continue;\n }\n\n if (!interaction.interacting() && (pointerType === interaction.pointerType)) {\n return interaction;\n }\n }\n\n return null;\n },\n};\n\nmodule.exports = finder;\n","const win = require('./window');\nconst isWindow = require('./isWindow');\n\nconst is = {\n array : () => {},\n\n window : thing => thing === win.window || isWindow(thing),\n\n docFrag : thing => is.object(thing) && thing.nodeType === 11,\n\n object : thing => !!thing && (typeof thing === 'object'),\n\n function: thing => typeof thing === 'function',\n\n number : thing => typeof thing === 'number' ,\n\n bool : thing => typeof thing === 'boolean' ,\n\n string : thing => typeof thing === 'string' ,\n\n element: thing => {\n if (!thing || (typeof thing !== 'object')) { return false; }\n\n const _window = win.getWindow(thing) || win.window;\n\n return (/object|function/.test(typeof _window.Element)\n ? thing instanceof _window.Element //DOM2\n : thing.nodeType === 1 && typeof thing.nodeName === 'string');\n },\n};\n\nis.array = thing => (is.object(thing)\n && (typeof thing.length !== 'undefined')\n && is.function(thing.splice));\n\nmodule.exports = is;\n","module.exports = (thing) => !!(thing && thing.Window) && (thing instanceof thing.Window);\n","function pointerExtend (dest, source) {\n for (const prop in source) {\n const prefixedPropREs = module.exports.prefixedPropREs;\n let deprecated = false;\n\n // skip deprecated prefixed properties\n for (const vendor in prefixedPropREs) {\n if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) {\n deprecated = true;\n break;\n }\n }\n\n if (!deprecated && typeof source[prop] !== 'function') {\n dest[prop] = source[prop];\n }\n }\n return dest;\n}\n\npointerExtend.prefixedPropREs = {\n webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/,\n};\n\nmodule.exports = pointerExtend;\n","const hypot = require('./hypot');\nconst browser = require('./browser');\nconst dom = require('./domObjects');\nconst domUtils = require('./domUtils');\nconst domObjects = require('./domObjects');\nconst is = require('./is');\nconst pointerExtend = require('./pointerExtend');\n\nconst pointerUtils = {\n copyCoords: function (dest, src) {\n dest.page = dest.page || {};\n dest.page.x = src.page.x;\n dest.page.y = src.page.y;\n\n dest.client = dest.client || {};\n dest.client.x = src.client.x;\n dest.client.y = src.client.y;\n\n dest.timeStamp = src.timeStamp;\n },\n\n setCoordDeltas: function (targetObj, prev, cur) {\n targetObj.page.x = cur.page.x - prev.page.x;\n targetObj.page.y = cur.page.y - prev.page.y;\n targetObj.client.x = cur.client.x - prev.client.x;\n targetObj.client.y = cur.client.y - prev.client.y;\n targetObj.timeStamp = cur.timeStamp - prev.timeStamp;\n\n // set pointer velocity\n const dt = Math.max(targetObj.timeStamp / 1000, 0.001);\n\n targetObj.page.speed = hypot(targetObj.page.x, targetObj.page.y) / dt;\n targetObj.page.vx = targetObj.page.x / dt;\n targetObj.page.vy = targetObj.page.y / dt;\n\n targetObj.client.speed = hypot(targetObj.client.x, targetObj.page.y) / dt;\n targetObj.client.vx = targetObj.client.x / dt;\n targetObj.client.vy = targetObj.client.y / dt;\n },\n\n isNativePointer: function (pointer) {\n return (pointer instanceof dom.Event || pointer instanceof dom.Touch);\n },\n\n // Get specified X/Y coords for mouse or event.touches[0]\n getXY: function (type, pointer, xy) {\n xy = xy || {};\n type = type || 'page';\n\n xy.x = pointer[type + 'X'];\n xy.y = pointer[type + 'Y'];\n\n return xy;\n },\n\n getPageXY: function (pointer, page) {\n page = page || {};\n\n // Opera Mobile handles the viewport and scrolling oddly\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n pointerUtils.getXY('screen', pointer, page);\n\n page.x += window.scrollX;\n page.y += window.scrollY;\n }\n else {\n pointerUtils.getXY('page', pointer, page);\n }\n\n return page;\n },\n\n getClientXY: function (pointer, client) {\n client = client || {};\n\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n // Opera Mobile handles the viewport and scrolling oddly\n pointerUtils.getXY('screen', pointer, client);\n }\n else {\n pointerUtils.getXY('client', pointer, client);\n }\n\n return client;\n },\n\n getPointerId: function (pointer) {\n return is.number(pointer.pointerId)? pointer.pointerId : pointer.identifier;\n },\n\n setCoords: function (targetObj, pointers, timeStamp) {\n const pointer = (pointers.length > 1\n ? pointerUtils.pointerAverage(pointers)\n : pointers[0]);\n\n const tmpXY = {};\n\n pointerUtils.getPageXY(pointer, tmpXY);\n targetObj.page.x = tmpXY.x;\n targetObj.page.y = tmpXY.y;\n\n pointerUtils.getClientXY(pointer, tmpXY);\n targetObj.client.x = tmpXY.x;\n targetObj.client.y = tmpXY.y;\n\n targetObj.timeStamp = is.number(timeStamp) ? timeStamp :new Date().getTime();\n },\n\n pointerExtend: pointerExtend,\n\n getTouchPair: function (event) {\n const touches = [];\n\n // array of touches is supplied\n if (is.array(event)) {\n touches[0] = event[0];\n touches[1] = event[1];\n }\n // an event\n else {\n if (event.type === 'touchend') {\n if (event.touches.length === 1) {\n touches[0] = event.touches[0];\n touches[1] = event.changedTouches[0];\n }\n else if (event.touches.length === 0) {\n touches[0] = event.changedTouches[0];\n touches[1] = event.changedTouches[1];\n }\n }\n else {\n touches[0] = event.touches[0];\n touches[1] = event.touches[1];\n }\n }\n\n return touches;\n },\n\n pointerAverage: function (pointers) {\n const average = {\n pageX : 0,\n pageY : 0,\n clientX: 0,\n clientY: 0,\n screenX: 0,\n screenY: 0,\n };\n\n for (const pointer of pointers) {\n for (const prop in average) {\n average[prop] += pointer[prop];\n }\n }\n for (const prop in average) {\n average[prop] /= pointers.length;\n }\n\n return average;\n },\n\n touchBBox: function (event) {\n if (!event.length && !(event.touches && event.touches.length > 1)) {\n return;\n }\n\n const touches = pointerUtils.getTouchPair(event);\n const minX = Math.min(touches[0].pageX, touches[1].pageX);\n const minY = Math.min(touches[0].pageY, touches[1].pageY);\n const maxX = Math.max(touches[0].pageX, touches[1].pageX);\n const maxY = Math.max(touches[0].pageY, touches[1].pageY);\n\n return {\n x: minX,\n y: minY,\n left: minX,\n top: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n },\n\n touchDistance: function (event, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n\n\n const dx = touches[0][sourceX] - touches[1][sourceX];\n const dy = touches[0][sourceY] - touches[1][sourceY];\n\n return hypot(dx, dy);\n },\n\n touchAngle: function (event, prevAngle, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n const dx = touches[1][sourceX] - touches[0][sourceX];\n const dy = touches[1][sourceY] - touches[0][sourceY];\n const angle = 180 * Math.atan2(dy , dx) / Math.PI;\n\n return angle;\n },\n\n getPointerType: function (pointer) {\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : is.number(pointer.pointerType)\n ? [undefined, undefined,'touch', 'pen', 'mouse'][pointer.pointerType]\n // if the PointerEvent API isn't available, then the \"pointer\" must\n // be either a MouseEvent, TouchEvent, or Touch object\n : /touch/.test(pointer.type) || pointer instanceof domObjects.Touch\n ? 'touch'\n : 'mouse';\n },\n\n // [ event.target, event.currentTarget ]\n getEventTargets: function (event) {\n return [\n domUtils.getActualElement(event.path ? event.path[0] : event.target),\n domUtils.getActualElement(event.currentTarget),\n ];\n },\n};\n\nmodule.exports = pointerUtils;\n","const { window } = require('./window');\n\nconst vendors = ['ms', 'moz', 'webkit', 'o'];\nlet lastTime = 0;\nlet request;\nlet cancel;\n\nfor (let x = 0; x < vendors.length && !window.requestAnimationFrame; x++) {\n request = window[vendors[x] + 'RequestAnimationFrame'];\n cancel = window[vendors[x] +'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n}\n\nif (!request) {\n request = function (callback) {\n const currTime = new Date().getTime();\n const timeToCall = Math.max(0, 16 - (currTime - lastTime));\n const id = setTimeout(function () { callback(currTime + timeToCall); },\n timeToCall);\n\n lastTime = currTime + timeToCall;\n return id;\n };\n}\n\nif (!cancel) {\n cancel = function (id) {\n clearTimeout(id);\n };\n}\n\nmodule.exports = {\n request,\n cancel,\n};\n","const extend = require('./extend');\nconst is = require('./is');\nconst {\n closest,\n parentNode,\n getElementRect,\n} = require('./domUtils');\n\nconst rectUtils = {\n getStringOptionResult: function (value, interactable, element) {\n if (!is.string(value)) {\n return null;\n }\n\n if (value === 'parent') {\n value = parentNode(element);\n }\n else if (value === 'self') {\n value = interactable.getRect(element);\n }\n else {\n value = closest(element, value);\n }\n\n return value;\n },\n\n resolveRectLike: function (value, interactable, element, functionArgs) {\n value = rectUtils.getStringOptionResult(value, interactable, element) || value;\n\n if (is.function(value)) {\n value = value.apply(null, functionArgs);\n }\n\n if (is.element(value)) {\n value = getElementRect(value);\n }\n\n return value;\n },\n\n rectToXY: function (rect) {\n return rect && {\n x: 'x' in rect ? rect.x : rect.left,\n y: 'y' in rect ? rect.y : rect.top,\n };\n },\n\n xywhToTlbr: function (rect) {\n if (rect && !('left' in rect && 'top' in rect)) {\n rect = extend({}, rect);\n\n rect.left = rect.x || 0;\n rect.top = rect.y || 0;\n rect.right = rect.right || (rect.left + rect.width);\n rect.bottom = rect.bottom || (rect.top + rect.height);\n }\n\n return rect;\n },\n\n tlbrToXywh: function (rect) {\n if (rect && !('x' in rect && 'y' in rect)) {\n rect = extend({}, rect);\n\n rect.x = rect.left || 0;\n rect.top = rect.top || 0;\n rect.width = rect.width || (rect.right - rect.x);\n rect.height = rect.height || (rect.bottom - rect.y);\n }\n\n return rect;\n },\n};\n\nmodule.exports = rectUtils;\n","const win = module.exports;\nconst isWindow = require('./isWindow');\n\nfunction init (window) {\n // get wrapped window if using Shadow DOM polyfill\n\n win.realWindow = window;\n\n // create a TextNode\n const el = window.document.createTextNode('');\n\n // check if it's wrapped by a polyfill\n if (el.ownerDocument !== window.document\n && typeof window.wrap === 'function'\n && window.wrap(el) === el) {\n // use wrapped window\n window = window.wrap(window);\n }\n\n win.window = window;\n}\n\nif (typeof window === 'undefined') {\n win.window = undefined;\n win.realWindow = undefined;\n}\nelse {\n init(window);\n}\n\nwin.getWindow = function getWindow (node) {\n if (isWindow(node)) {\n return node;\n }\n\n const rootNode = (node.ownerDocument || node);\n\n return rootNode.defaultView || rootNode.parentWindow || win.window;\n};\n\nwin.init = init;\n"]} \ No newline at end of file diff --git a/package.json b/package.json index 76f3e9969..f39704e99 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "interactjs", - "version": "1.3.0-alpha.3+sha.9595c40", + "version": "1.3.0-alpha.4+sha.7970416", "repository": { "type": "git", "url": "https://github.com/taye/interact.js.git"
- Interactable.deltaSource([newValue])⚓➭ + Interactable.deltaSource([newValue])⚓➭ @@ -1104,7 +1104,7 @@ Parameters - Interactable.context()⚓➭ + Interactable.context()⚓➭ @@ -1146,7 +1146,7 @@ Interactable.context() - Interactable.fire(iEvent)⚓➭ + Interactable.fire(iEvent)⚓➭ @@ -1207,7 +1207,7 @@ Parameters - Interactable.on(eventType, listener, [options])⚓➭ + Interactable.on(eventType, listener, [options])⚓➭ @@ -1273,7 +1273,7 @@ Parameters - Interactable.off(eventType, listener, [options])⚓➭ + Interactable.off(eventType, listener, [options])⚓➭ @@ -1339,7 +1339,7 @@ Parameters - Interactable.set(options)⚓➭ + Interactable.set(options)⚓➭ @@ -1399,7 +1399,7 @@ Parameters - Interactable.unset()⚓➭ + Interactable.unset()⚓➭ @@ -1442,7 +1442,7 @@ Interactable.unset() - Interactable.actionChecker([checker])⚓➭ + Interactable.actionChecker([checker])⚓➭ @@ -1542,7 +1542,7 @@ Parameters - Interactable.styleCursor([newValue])⚓➭ + Interactable.styleCursor([newValue])⚓➭ @@ -1605,7 +1605,7 @@ Parameters - interact.maxInteractions([newValue])⚓➭ + interact.maxInteractions([newValue])⚓➭ @@ -1652,7 +1652,7 @@ Parameters - Interactable.preventDefault([newValue])⚓➭ + Interactable.preventDefault([newValue])⚓➭ @@ -1718,7 +1718,7 @@ Parameters - interact(element)⚓➭ + interact(element)⚓➭ @@ -1821,7 +1821,7 @@ Usage - interact.isSet(element)⚓➭ + interact.isSet(element)⚓➭ @@ -1881,7 +1881,7 @@ Parameters - interact.on(type, listener, [options])⚓➭ + interact.on(type, listener, [options])⚓➭ @@ -1948,7 +1948,7 @@ Parameters - interact.off(type, listener, [options])⚓➭ + interact.off(type, listener, [options])⚓➭ @@ -2014,7 +2014,7 @@ Parameters - interact.debug()⚓➭ + interact.debug()⚓➭ @@ -2056,7 +2056,7 @@ interact.debug() - interact.supportsTouch()⚓➭ + interact.supportsTouch()⚓➭ @@ -2097,7 +2097,7 @@ interact.supportsTouch() - interact.supportsPointerEvent()⚓➭ + interact.supportsPointerEvent()⚓➭ @@ -2138,7 +2138,7 @@ interact.supportsPointerEvent() - interact.stop(event)⚓➭ + interact.stop(event)⚓➭ @@ -2198,7 +2198,7 @@ Parameters - interact.pointerMoveTolerance([newValue])⚓➭ + interact.pointerMoveTolerance([newValue])⚓➭ @@ -2261,7 +2261,7 @@ Parameters - Interaction.start(action, target, element)⚓➭ + Interaction.start(action, target, element)⚓➭ @@ -2356,7 +2356,7 @@ Parameters - Interaction.doMove()⚓➭ + Interaction.doMove()⚓➭ @@ -2403,7 +2403,7 @@ Interaction.doMove() - Interaction.end([event])⚓➭ + Interaction.end([event])⚓➭ diff --git a/dist/interact.js b/dist/interact.js index e8ae35c3b..c78a3c751 100644 --- a/dist/interact.js +++ b/dist/interact.js @@ -1,5 +1,5 @@ /** - * interact.js v1.3.0-alpha.3+sha.9595c40 + * interact.js v1.3.0-alpha.4+sha.7970416-dirty * * Copyright (c) 2012-2017 Taye Adeyemi * Open source under the MIT License. @@ -816,6 +816,7 @@ var scope = require('./scope'); var utils = require('./utils'); var events = require('./utils/events'); var browser = require('./utils/browser'); +var domObjects = require('./utils/domObjects'); var finder = require('./utils/interactionFinder'); var signals = require('./utils/Signals').new(); @@ -829,7 +830,9 @@ var prevTouchTime = 0; scope.interactions = []; var Interaction = function () { - function Interaction() { + function Interaction(_ref) { + var pointerType = _ref.pointerType; + _classCallCheck(this, Interaction); this.target = null; // current interactable being interacted with @@ -886,7 +889,7 @@ var Interaction = function () { this.pointerWasMoved = false; this._interacting = false; - this.mouse = false; + this.pointerType = pointerType; signals.fire('new', this); @@ -1130,6 +1133,11 @@ var Interaction = function () { }; Interaction.prototype.getPointerIndex = function getPointerIndex(pointer) { + // mouse and pen interactions may have only one pointer + if (this.pointerType === 'mouse' || this.pointerType === 'pen') { + return 0; + } + return utils.indexOf(this.pointerIds, utils.getPointerId(pointer)); }; @@ -1161,8 +1169,7 @@ var Interaction = function () { }; Interaction.prototype.removePointer = function removePointer(pointer, event) { - var id = utils.getPointerId(pointer); - var index = this.mouse ? 0 : utils.indexOf(this.pointerIds, id); + var index = this.getPointerIndex(pointer); if (index === -1) { return; @@ -1197,6 +1204,8 @@ for (var i = 0, len = methodNames.length; i < len; i++) { function doOnInteractions(method) { return function (event) { + var pointerType = utils.getPointerType(event); + var _utils$getEventTarget = utils.getEventTargets(event), eventTarget = _utils$getEventTarget[0], curEventTarget = _utils$getEventTarget[1]; @@ -1210,7 +1219,7 @@ function doOnInteractions(method) { var pointer = event.changedTouches[_i]; var interaction = finder.search(pointer, event.type, eventTarget); - matches.push([pointer, interaction || new Interaction()]); + matches.push([pointer, interaction || new Interaction({ pointerType: pointerType })]); } } else { var invalidPointer = false; @@ -1218,7 +1227,7 @@ function doOnInteractions(method) { if (!browser.supportsPointerEvent && /mouse/.test(event.type)) { // ignore mouse events while touch interactions are active for (var _i2 = 0; _i2 < scope.interactions.length && !invalidPointer; _i2++) { - invalidPointer = !scope.interactions[_i2].mouse && scope.interactions[_i2].pointerIsDown; + invalidPointer = scope.interactions[_i2].pointerType !== 'mouse' && scope.interactions[_i2].pointerIsDown; } // try to ignore mouse events that are simulated by the browser @@ -1232,11 +1241,7 @@ function doOnInteractions(method) { var _interaction = finder.search(event, event.type, eventTarget); if (!_interaction) { - - _interaction = new Interaction(); - _interaction.mouse = /mouse/i.test(event.pointerType || event.type) - // MSPointerEvent.MSPOINTER_TYPE_MOUSE - || event.pointerType === 4 || !event.pointerType; + _interaction = new Interaction({ pointerType: pointerType }); } matches.push([event, _interaction]); @@ -1244,20 +1249,20 @@ function doOnInteractions(method) { } for (var _iterator = matches, _isArray = Array.isArray(_iterator), _i3 = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { - var _ref; + var _ref2; if (_isArray) { if (_i3 >= _iterator.length) break; - _ref = _iterator[_i3++]; + _ref2 = _iterator[_i3++]; } else { _i3 = _iterator.next(); if (_i3.done) break; - _ref = _i3.value; + _ref2 = _i3.value; } - var _ref2 = _ref, - _pointer = _ref2[0], - _interaction2 = _ref2[1]; + var _ref3 = _ref2, + _pointer = _ref3[0], + _interaction2 = _ref3[1]; _interaction2._updateEventTargets(eventTarget, curEventTarget); _interaction2[method](_pointer, event, eventTarget, curEventTarget); @@ -1277,7 +1282,7 @@ function endAll(event) { var docEvents = {/* 'eventType': listenerFunc */}; var pEventTypes = browser.pEventTypes; -if (scope.PointerEvent) { +if (domObjects.PointerEvent) { docEvents[pEventTypes.down] = listeners.pointerDown; docEvents[pEventTypes.move] = listeners.pointerMove; docEvents[pEventTypes.up] = listeners.pointerUp; @@ -1295,8 +1300,8 @@ if (scope.PointerEvent) { docEvents.blur = endAll; -function onDocSignal(_ref3, signalName) { - var doc = _ref3.doc; +function onDocSignal(_ref4, signalName) { + var doc = _ref4.doc; var eventMethod = signalName.indexOf('add') === 0 ? events.add : events.remove; @@ -1311,14 +1316,14 @@ function onDocSignal(_ref3, signalName) { } } -signals.on('update-pointer-down', function (_ref4) { - var interaction = _ref4.interaction, - pointer = _ref4.pointer, - pointerId = _ref4.pointerId, - pointerIndex = _ref4.pointerIndex, - event = _ref4.event, - eventTarget = _ref4.eventTarget, - down = _ref4.down; +signals.on('update-pointer-down', function (_ref5) { + var interaction = _ref5.interaction, + pointer = _ref5.pointer, + pointerId = _ref5.pointerId, + pointerIndex = _ref5.pointerIndex, + event = _ref5.event, + eventTarget = _ref5.eventTarget, + down = _ref5.down; interaction.pointerIds[pointerIndex] = pointerId; interaction.pointers[pointerIndex] = pointer; @@ -1355,7 +1360,7 @@ scope.endAllInteractions = endAll; module.exports = Interaction; -},{"./scope":34,"./utils":44,"./utils/Signals":35,"./utils/browser":37,"./utils/events":40,"./utils/interactionFinder":45}],6:[function(require,module,exports){ +},{"./scope":34,"./utils":44,"./utils/Signals":35,"./utils/browser":37,"./utils/domObjects":38,"./utils/events":40,"./utils/interactionFinder":45}],6:[function(require,module,exports){ 'use strict'; var Interaction = require('../Interaction'); @@ -5460,7 +5465,7 @@ module.exports = function () { this.originalEvent = event; this.type = type; this.pointerId = pointerUtils.getPointerId(pointer); - this.pointerType = pointerUtils.getPointerType(pointer, interaction); + this.pointerType = pointerUtils.getPointerType(pointer); this.target = eventTarget; this.currentTarget = null; @@ -5758,8 +5763,10 @@ Interaction.signals.on('down', function (_ref6) { timer.duration = minDuration; timer.timeout = setTimeout(function () { fire({ - interaction: interaction, eventCopy: eventCopy, eventTarget: eventTarget, + interaction: interaction, + eventTarget: eventTarget, pointer: browser.isIE8 ? eventCopy : pointer, + event: eventCopy, type: 'hold' }); }, minDuration); @@ -6946,17 +6953,14 @@ module.exports = utils; var scope = require('../scope'); var utils = require('./index'); -var browser = require('./browser'); var finder = { - methodOrder: ['simulationResume', 'mouse', 'hasPointer', 'idle'], + methodOrder: ['simulationResume', 'mouseOrPen', 'hasPointer', 'idle'], search: function search(pointer, eventType, eventTarget) { - var mouseEvent = /mouse/i.test(pointer.pointerType || eventType) - // MSPointerEvent.MSPOINTER_TYPE_MOUSE - || pointer.pointerType === 4; + var pointerType = utils.getPointerType(pointer); var pointerId = utils.getPointerId(pointer); - var details = { pointer: pointer, pointerId: pointerId, mouseEvent: mouseEvent, eventType: eventType, eventTarget: eventTarget }; + var details = { pointer: pointer, pointerId: pointerId, pointerType: pointerType, eventType: eventType, eventTarget: eventTarget }; for (var _iterator = finder.methodOrder, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { var _ref; @@ -6982,7 +6986,7 @@ var finder = { // try to resume simulation with a new pointer simulationResume: function simulationResume(_ref2) { - var mouseEvent = _ref2.mouseEvent, + var pointerType = _ref2.pointerType, eventType = _ref2.eventType, eventTarget = _ref2.eventTarget; @@ -7006,7 +7010,7 @@ var finder = { var element = eventTarget; - if (interaction.simulation && interaction.simulation.allowResume && interaction.mouse === mouseEvent) { + if (interaction.simulation && interaction.simulation.allowResume && interaction.pointerType === pointerType) { while (element) { // if the element is the interaction element if (element === interaction.element) { @@ -7020,13 +7024,13 @@ var finder = { return null; }, - // if it's a mouse interaction - mouse: function mouse(_ref4) { + // if it's a mouse or pen interaction + mouseOrPen: function mouseOrPen(_ref4) { var pointerId = _ref4.pointerId, - mouseEvent = _ref4.mouseEvent, + pointerType = _ref4.pointerType, eventType = _ref4.eventType; - if (!mouseEvent && (browser.supportsTouch || browser.supportsPointerEvent)) { + if (pointerType !== 'mouse' && pointerType !== 'pen') { return null; } @@ -7046,7 +7050,7 @@ var finder = { var interaction = _ref5; - if (interaction.mouse) { + if (interaction.pointerType === pointerType) { // if it's a down event, skip interactions with running simulations if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; @@ -7069,8 +7073,8 @@ var finder = { return firstNonActive; } - // Find any interaction specifically for mouse. - // ignore the interaction if the eventType is a mousedown, and a simulation + // find any mouse or pen interaction. + // ignore the interaction if the eventType is a *down, and a simulation // is active for (var _iterator4 = scope.interactions, _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) { var _ref6; @@ -7086,7 +7090,7 @@ var finder = { var _interaction = _ref6; - if (_interaction.mouse && !(/down/.test(eventType) && _interaction.simulation)) { + if (_interaction.pointerType === pointerType && !(/down/i.test(eventType) && _interaction.simulation)) { return _interaction; } } @@ -7118,9 +7122,9 @@ var finder = { } }, - // get first idle interaction + // get first idle interaction with a matching pointerType idle: function idle(_ref9) { - var mouseEvent = _ref9.mouseEvent; + var pointerType = _ref9.pointerType; for (var _iterator6 = scope.interactions, _isArray6 = Array.isArray(_iterator6), _i6 = 0, _iterator6 = _isArray6 ? _iterator6 : _iterator6[Symbol.iterator]();;) { var _ref10; @@ -7150,7 +7154,7 @@ var finder = { continue; } - if (!interaction.interacting() && mouseEvent === interaction.mouse) { + if (!interaction.interacting() && pointerType === interaction.pointerType) { return interaction; } } @@ -7161,7 +7165,7 @@ var finder = { module.exports = finder; -},{"../scope":34,"./browser":37,"./index":44}],46:[function(require,module,exports){ +},{"../scope":34,"./index":44}],46:[function(require,module,exports){ 'use strict'; var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; @@ -7262,6 +7266,7 @@ var hypot = require('./hypot'); var browser = require('./browser'); var dom = require('./domObjects'); var domUtils = require('./domUtils'); +var domObjects = require('./domObjects'); var is = require('./is'); var pointerExtend = require('./pointerExtend'); @@ -7468,17 +7473,11 @@ var pointerUtils = { return angle; }, - getPointerType: function getPointerType(pointer, interaction) { - // if the PointerEvent API isn't available, then the pointer must be ither - // a MouseEvent or TouchEvent - if (interaction.mouse) { - return 'mouse'; - } - if (!browser.supportsPointerEvent) { - return 'touch'; - } - - return is.string(pointer.pointerType) ? pointer.pointerType : [undefined, undefined, 'touch', 'pen', 'mouse'][pointer.pointerType]; + getPointerType: function getPointerType(pointer) { + return is.string(pointer.pointerType) ? pointer.pointerType : is.number(pointer.pointerType) ? [undefined, undefined, 'touch', 'pen', 'mouse'][pointer.pointerType] + // if the PointerEvent API isn't available, then the "pointer" must + // be either a MouseEvent, TouchEvent, or Touch object + : /touch/.test(pointer.type) || pointer instanceof domObjects.Touch ? 'touch' : 'mouse'; }, // [ event.target, event.currentTarget ] diff --git a/dist/interact.js.map b/dist/interact.js.map index 60832b766..4f3a62ba8 100644 --- a/dist/interact.js.map +++ b/dist/interact.js.map @@ -1 +1 @@ -{"version":3,"sources":["src/header.js","node_modules/browser-pack/_prelude.js","index.js","src/Eventable.js","src/InteractEvent.js","src/Interactable.js","src/Interaction.js","src/actions/base.js","src/actions/drag.js","src/actions/drop.js","src/actions/gesture.js","src/actions/resize.js","src/autoScroll.js","src/autoStart/InteractableMethods.js","src/autoStart/base.js","src/autoStart/delay.js","src/autoStart/drag.js","src/autoStart/gesture.js","src/autoStart/resize.js","src/defaultOptions.js","src/index.js","src/inertia.js","src/interact.js","src/interactablePreventDefault.js","src/legacyBrowsers.js","src/modifiers/index.js","src/modifiers/restrict.js","src/modifiers/restrictEdges.js","src/modifiers/restrictSize.js","src/modifiers/snap.js","src/modifiers/snapSize.js","src/pointerEvents/PointerEvent.js","src/pointerEvents/base.js","src/pointerEvents/holdRepeat.js","src/pointerEvents/interactableTargets.js","src/scope.js","src/utils/Signals.js","src/utils/arr.js","src/utils/browser.js","src/utils/domObjects.js","src/utils/domUtils.js","src/utils/events.js","src/utils/extend.js","src/utils/getOriginXY.js","src/utils/hypot.js","src/utils/index.js","src/utils/interactionFinder.js","src/utils/is.js","src/utils/isWindow.js","src/utils/pointerExtend.js","src/utils/pointerUtils.js","src/utils/raf.js","src/utils/rect.js","src/utils/window.js"],"names":[],"mappings":"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","file":"interact.js","sourceRoot":"","sourcesContent":["/**\n * interact.js v1.3.0-alpha.3+sha.9595c40\n *\n * Copyright (c) 2012-2017 Taye Adeyemi \n * Open source under the MIT License.\n * https://raw.github.com/taye/interact.js/master/LICENSE\n */\n","(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o 150) {\n return null;\n }\n\n let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI;\n const overlap = 22.5;\n\n if (angle < 0) {\n angle += 360;\n }\n\n const left = 135 - overlap <= angle && angle < 225 + overlap;\n const up = 225 - overlap <= angle && angle < 315 + overlap;\n\n const right = !left && (315 - overlap <= angle || angle < 45 + overlap);\n const down = !up && 45 - overlap <= angle && angle < 135 + overlap;\n\n return {\n up,\n down,\n left,\n right,\n angle,\n speed: interaction.prevEvent.speed,\n velocity: {\n x: interaction.prevEvent.velocityX,\n y: interaction.prevEvent.velocityY,\n },\n };\n }\n\n preventDefault () {}\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n}\n\nsignals.on('set-delta', function ({ iEvent, interaction, starting, deltaSource }) {\n const prevEvent = starting? iEvent : interaction.prevEvent;\n\n if (deltaSource === 'client') {\n iEvent.dx = iEvent.clientX - prevEvent.clientX;\n iEvent.dy = iEvent.clientY - prevEvent.clientY;\n }\n else {\n iEvent.dx = iEvent.pageX - prevEvent.pageX;\n iEvent.dy = iEvent.pageY - prevEvent.pageY;\n }\n});\n\nInteractEvent.signals = signals;\n\nmodule.exports = InteractEvent;\n","const is = require('./utils/is');\nconst events = require('./utils/events');\nconst extend = require('./utils/extend');\nconst actions = require('./actions/base');\nconst scope = require('./scope');\nconst Eventable = require('./Eventable');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nconst {\n getElementRect,\n nodeContains,\n trySelector,\n} = require('./utils/domUtils');\nconst { getWindow } = require('./utils/window');\nconst { indexOf, contains } = require('./utils/arr');\nconst { wheelEvent } = require('./utils/browser');\n\n// all set interactables\nscope.interactables = [];\n\n/*\\\n * Interactable\n [ property ]\n **\n * Object type returned by @interact\n\\*/\nclass Interactable {\n constructor (target, options) {\n options = options || {};\n\n this.target = target;\n this.events = new Eventable();\n this._context = options.context || scope.document;\n this._win = getWindow(trySelector(target)? this._context : target);\n this._doc = this._win.document;\n\n signals.fire('new', {\n target,\n options,\n interactable: this,\n win: this._win,\n });\n\n scope.addDocument( this._doc, this._win );\n\n scope.interactables.push(this);\n\n this.set(options);\n }\n\n setOnEvents (action, phases) {\n const onAction = 'on' + action;\n\n if (is.function(phases.onstart) ) { this.events[onAction + 'start' ] = phases.onstart ; }\n if (is.function(phases.onmove) ) { this.events[onAction + 'move' ] = phases.onmove ; }\n if (is.function(phases.onend) ) { this.events[onAction + 'end' ] = phases.onend ; }\n if (is.function(phases.oninertiastart)) { this.events[onAction + 'inertiastart' ] = phases.oninertiastart ; }\n\n return this;\n }\n\n setPerAction (action, options) {\n // for all the default per-action options\n for (const option in options) {\n // if this option exists for this action\n if (option in defaults[action]) {\n // if the option in the options arg is an object value\n if (is.object(options[option])) {\n // duplicate the object\n this.options[action][option] = extend(this.options[action][option] || {}, options[option]);\n\n if (is.object(defaults.perAction[option]) && 'enabled' in defaults.perAction[option]) {\n this.options[action][option].enabled = options[option].enabled === false? false : true;\n }\n }\n else if (is.bool(options[option]) && is.object(defaults.perAction[option])) {\n this.options[action][option].enabled = options[option];\n }\n else if (options[option] !== undefined) {\n // or if it's not undefined, do a plain assignment\n this.options[action][option] = options[option];\n }\n }\n }\n }\n\n /*\\\n * Interactable.getRect\n [ method ]\n *\n * The default function to get an Interactables bounding rect. Can be\n * overridden using @Interactable.rectChecker.\n *\n - element (Element) #optional The element to measure.\n = (object) The object's bounding rectangle.\n o {\n o top : 0,\n o left : 0,\n o bottom: 0,\n o right : 0,\n o width : 0,\n o height: 0\n o }\n \\*/\n getRect (element) {\n element = element || this.target;\n\n if (is.string(this.target) && !(is.element(element))) {\n element = this._context.querySelector(this.target);\n }\n\n return getElementRect(element);\n }\n\n /*\\\n * Interactable.rectChecker\n [ method ]\n *\n * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n - checker (function) #optional A function which returns this Interactable's bounding rectangle. See @Interactable.getRect\n = (function | object) The checker function or this Interactable\n \\*/\n rectChecker (checker) {\n if (is.function(checker)) {\n this.getRect = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.getRect;\n\n return this;\n }\n\n return this.getRect;\n }\n\n _backCompatOption (optionName, newValue) {\n if (trySelector(newValue) || is.object(newValue)) {\n this.options[optionName] = newValue;\n\n for (const action of actions.names) {\n this.options[action][optionName] = newValue;\n }\n\n return this;\n }\n\n return this.options[optionName];\n }\n\n /*\\\n * Interactable.origin\n [ method ]\n *\n * Gets or sets the origin of the Interactable's element. The x and y\n * of the origin will be subtracted from action event coordinates.\n *\n - origin (object | string) #optional An object eg. { x: 0, y: 0 } or string 'parent', 'self' or any CSS selector\n * OR\n - origin (Element) #optional An HTML or SVG Element whose rect will be used\n **\n = (object) The current origin or this Interactable\n \\*/\n origin (newValue) {\n return this._backCompatOption('origin', newValue);\n }\n\n /*\\\n * Interactable.deltaSource\n [ method ]\n *\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n - newValue (string) #optional Use 'client' if you will be scrolling while interacting; Use 'page' if you want autoScroll to work\n = (string | object) The current deltaSource or this Interactable\n \\*/\n deltaSource (newValue) {\n if (newValue === 'page' || newValue === 'client') {\n this.options.deltaSource = newValue;\n\n return this;\n }\n\n return this.options.deltaSource;\n }\n\n /*\\\n * Interactable.context\n [ method ]\n *\n * Gets the selector context Node of the Interactable. The default is `window.document`.\n *\n = (Node) The context Node of this Interactable\n **\n \\*/\n context () {\n return this._context;\n }\n\n inContext (element) {\n return (this._context === element.ownerDocument\n || nodeContains(this._context, element));\n }\n\n /*\\\n * Interactable.fire\n [ method ]\n *\n * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n - iEvent (InteractEvent) The InteractEvent object to be fired on this Interactable\n = (Interactable) this Interactable\n \\*/\n fire (iEvent) {\n this.events.fire(iEvent);\n\n return this;\n }\n\n _onOffMultiple (method, eventType, listener, options) {\n if (is.string(eventType) && eventType.search(' ') !== -1) {\n eventType = eventType.trim().split(/ +/);\n }\n\n if (is.array(eventType)) {\n for (let i = 0; i < eventType.length; i++) {\n this[method](eventType[i], listener, options);\n }\n\n return true;\n }\n\n if (is.object(eventType)) {\n for (const prop in eventType) {\n this[method](prop, eventType[prop], listener);\n }\n\n return true;\n }\n }\n\n /*\\\n * Interactable.on\n [ method ]\n *\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n - eventType (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) This Interactable\n \\*/\n on (eventType, listener, options) {\n if (this._onOffMultiple('on', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.on(eventType, listener);\n }\n // delegated event for selector\n else if (is.string(this.target)) {\n events.addDelegate(this.target, this._context, eventType, listener, options);\n }\n else {\n events.add(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.off\n [ method ]\n *\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n - eventType (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) This Interactable\n \\*/\n off (eventType, listener, options) {\n if (this._onOffMultiple('off', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n // if it is an action event type\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.off(eventType, listener);\n }\n // delegated event\n else if (is.string(this.target)) {\n events.removeDelegate(this.target, this._context, eventType, listener, options);\n }\n // remove listener from this Interatable's element\n else {\n events.remove(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.set\n [ method ]\n *\n * Reset the options of this Interactable\n - options (object) The new settings to apply\n = (object) This Interactable\n \\*/\n set (options) {\n if (!is.object(options)) {\n options = {};\n }\n\n this.options = extend({}, defaults.base);\n\n const perActions = extend({}, defaults.perAction);\n\n for (const actionName in actions.methodDict) {\n const methodName = actions.methodDict[actionName];\n\n this.options[actionName] = extend({}, defaults[actionName]);\n\n this.setPerAction(actionName, perActions);\n\n this[methodName](options[actionName]);\n }\n\n for (const setting of Interactable.settingsMethods) {\n this.options[setting] = defaults.base[setting];\n\n if (setting in options) {\n this[setting](options[setting]);\n }\n }\n\n signals.fire('set', {\n options,\n interactable: this,\n });\n\n return this;\n }\n\n /*\\\n * Interactable.unset\n [ method ]\n *\n * Remove this interactable from the list of interactables and remove\n * it's action capabilities and event listeners\n *\n = (object) @interact\n \\*/\n unset () {\n events.remove(this.target, 'all');\n\n if (is.string(this.target)) {\n // remove delegated events\n for (const type in events.delegatedEvents) {\n const delegated = events.delegatedEvents[type];\n\n if (delegated.selectors[0] === this.target\n && delegated.contexts[0] === this._context) {\n\n delegated.selectors.splice(0, 1);\n delegated.contexts .splice(0, 1);\n delegated.listeners.splice(0, 1);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegated[type] = null;\n }\n }\n\n events.remove(this._context, type, events.delegateListener);\n events.remove(this._context, type, events.delegateUseCapture, true);\n }\n }\n else {\n events.remove(this, 'all');\n }\n\n signals.fire('unset', { interactable: this });\n\n scope.interactables.splice(indexOf(scope.interactables, this), 1);\n\n // Stop related interactions when an Interactable is unset\n for (const interaction of scope.interactions || []) {\n if (interaction.target === this && interaction.interacting()) {\n interaction.stop();\n }\n }\n\n return scope.interact;\n }\n}\n\nscope.interactables.indexOfElement = function indexOfElement (target, context) {\n context = context || scope.document;\n\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n if (interactable.target === target && interactable._context === context) {\n return i;\n }\n }\n return -1;\n};\n\nscope.interactables.get = function interactableGet (element, options, dontCheckInContext) {\n const ret = this[this.indexOfElement(element, options && options.context)];\n\n return ret && (is.string(element) || dontCheckInContext || ret.inContext(element))? ret : null;\n};\n\nscope.interactables.forEachSelector = function (callback, element) {\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n // skip non CSS selector targets and out of context elements\n if (!is.string(interactable.target)\n || (element && !interactable.inContext(element))) {\n continue;\n }\n\n const ret = callback(interactable, interactable.target, interactable._context, i, this);\n\n if (ret !== undefined) {\n return ret;\n }\n }\n};\n\n// all interact.js eventTypes\nInteractable.eventTypes = scope.eventTypes = [];\n\nInteractable.signals = signals;\n\nInteractable.settingsMethods = [ 'deltaSource', 'origin', 'preventDefault', 'rectChecker' ];\n\nmodule.exports = Interactable;\n","const scope = require('./scope');\nconst utils = require('./utils');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst finder = require('./utils/interactionFinder');\nconst signals = require('./utils/Signals').new();\n\nconst listeners = {};\nconst methodNames = [\n 'pointerDown', 'pointerMove', 'pointerUp',\n 'updatePointer', 'removePointer',\n];\n\n// for ignoring browser's simulated mouse events\nlet prevTouchTime = 0;\n\n// all active and idle interactions\nscope.interactions = [];\n\nclass Interaction {\n constructor () {\n this.target = null; // current interactable being interacted with\n this.element = null; // the target element of the interactable\n\n this.prepared = { // action that's ready to be fired on next move event\n name : null,\n axis : null,\n edges: null,\n };\n\n // keep track of added pointers\n this.pointers = [];\n this.pointerIds = [];\n this.downTargets = [];\n this.downTimes = [];\n\n // Previous native pointer move event coordinates\n this.prevCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n // current native pointer move event coordinates\n this.curCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Starting InteractEvent pointer coordinates\n this.startCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Change in coordinates and time of the pointer\n this.pointerDelta = {\n page : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n client : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n timeStamp: 0,\n };\n\n this.downEvent = null; // pointerdown/mousedown/touchstart event\n this.downPointer = {};\n\n this._eventTarget = null;\n this._curEventTarget = null;\n\n this.prevEvent = null; // previous action event\n\n this.pointerIsDown = false;\n this.pointerWasMoved = false;\n this._interacting = false;\n\n this.mouse = false;\n\n signals.fire('new', this);\n\n scope.interactions.push(this);\n }\n\n pointerDown (pointer, event, eventTarget) {\n const pointerIndex = this.updatePointer(pointer, event, true);\n\n signals.fire('down', {\n pointer,\n event,\n eventTarget,\n pointerIndex,\n interaction: this,\n });\n }\n\n /*\\\n * Interaction.start\n [ method ]\n *\n * Start an action with the given Interactable and Element as tartgets. The\n * action must be enabled for the target Interactable and an appropriate number\n * of pointers must be held down - 1 for drag/resize, 2 for gesture.\n *\n * Use it with `interactable.able({ manualStart: false })` to always\n * [start actions manually](https://github.com/taye/interact.js/issues/114)\n *\n - action (object) The action to be performed - drag, resize, etc.\n - target (Interactable) The Interactable to target\n - element (Element) The DOM Element to target\n = (object) interact\n **\n | interact(target)\n | .draggable({\n | // disable the default drag start by down->move\n | manualStart: true\n | })\n | // start dragging after the user holds the pointer down\n | .on('hold', function (event) {\n | var interaction = event.interaction;\n |\n | if (!interaction.interacting()) {\n | interaction.start({ name: 'drag' },\n | event.interactable,\n | event.currentTarget);\n | }\n | });\n \\*/\n start (action, target, element) {\n if (this.interacting()\n || !this.pointerIsDown\n || this.pointerIds.length < (action.name === 'gesture'? 2 : 1)) {\n return;\n }\n\n // if this interaction had been removed after stopping\n // add it back\n if (utils.indexOf(scope.interactions, this) === -1) {\n scope.interactions.push(this);\n }\n\n utils.copyAction(this.prepared, action);\n this.target = target;\n this.element = element;\n\n signals.fire('action-start', {\n interaction: this,\n event: this.downEvent,\n });\n }\n\n pointerMove (pointer, event, eventTarget) {\n if (!this.simulation) {\n this.updatePointer(pointer);\n utils.setCoords(this.curCoords, this.pointers);\n }\n\n const duplicateMove = (this.curCoords.page.x === this.prevCoords.page.x\n && this.curCoords.page.y === this.prevCoords.page.y\n && this.curCoords.client.x === this.prevCoords.client.x\n && this.curCoords.client.y === this.prevCoords.client.y);\n\n let dx;\n let dy;\n\n // register movement greater than pointerMoveTolerance\n if (this.pointerIsDown && !this.pointerWasMoved) {\n dx = this.curCoords.client.x - this.startCoords.client.x;\n dy = this.curCoords.client.y - this.startCoords.client.y;\n\n this.pointerWasMoved = utils.hypot(dx, dy) > Interaction.pointerMoveTolerance;\n }\n\n const signalArg = {\n pointer,\n pointerIndex: this.getPointerIndex(pointer),\n event,\n eventTarget,\n dx,\n dy,\n duplicate: duplicateMove,\n interaction: this,\n interactingBeforeMove: this.interacting(),\n };\n\n if (!duplicateMove) {\n // set pointer coordinate, time changes and speeds\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n }\n\n signals.fire('move', signalArg);\n\n if (!duplicateMove) {\n // if interacting, fire an 'action-move' signal etc\n if (this.interacting()) {\n this.doMove(signalArg);\n }\n\n if (this.pointerWasMoved) {\n utils.copyCoords(this.prevCoords, this.curCoords);\n }\n }\n }\n\n /*\\\n * Interaction.doMove\n [ method ]\n *\n * Force a move of the current action at the same coordinates. Useful if\n * snap/restrict has been changed and you want a movement with the new\n * settings.\n *\n **\n | interact(target)\n | .draggable(true)\n | .on('dragmove', function (event) {\n | if (someCondition) {\n | // change the snap settings\n | event.interactable.draggable({ snap: { targets: [] }});\n | // fire another move event with re-calculated snap\n | event.interaction.doMove();\n | }\n | });\n \\*/\n doMove (signalArg) {\n signalArg = utils.extend({\n pointer: this.pointers[0],\n event: this.prevEvent,\n eventTarget: this._eventTarget,\n interaction: this,\n }, signalArg || {});\n\n signals.fire('before-action-move', signalArg);\n\n if (!this._dontFireMove) {\n signals.fire('action-move', signalArg);\n }\n\n this._dontFireMove = false;\n }\n\n // End interact move events and stop auto-scroll unless simulation is running\n pointerUp (pointer, event, eventTarget, curEventTarget) {\n const pointerIndex = this.getPointerIndex(pointer);\n\n signals.fire(/cancel$/i.test(event.type)? 'cancel' : 'up', {\n pointer,\n pointerIndex,\n event,\n eventTarget,\n curEventTarget,\n interaction: this,\n });\n\n if (!this.simulation) {\n this.end(event);\n }\n\n this.pointerIsDown = false;\n this.removePointer(pointer, event);\n }\n\n /*\\\n * Interaction.end\n [ method ]\n *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n - event (PointerEvent) #optional\n **\n | interact(target)\n | .draggable(true)\n | .on('move', function (event) {\n | if (event.pageX > 1000) {\n | // end the current action\n | event.interaction.end();\n | // stop all further listeners from being called\n | event.stopImmediatePropagation();\n | }\n | });\n \\*/\n end (event) {\n event = event || this.prevEvent;\n\n if (this.interacting()) {\n signals.fire('action-end', {\n event,\n interaction: this,\n });\n }\n\n this.stop();\n }\n\n currentAction () {\n return this._interacting? this.prepared.name: null;\n }\n\n interacting () {\n return this._interacting;\n }\n\n stop () {\n signals.fire('stop', { interaction: this });\n\n if (this._interacting) {\n signals.fire('stop-active', { interaction: this });\n signals.fire('stop-' + this.prepared.name, { interaction: this });\n }\n\n this.target = this.element = null;\n\n this._interacting = false;\n this.prepared.name = this.prevEvent = null;\n }\n\n getPointerIndex (pointer) {\n return utils.indexOf(this.pointerIds, utils.getPointerId(pointer));\n }\n\n updatePointer (pointer, event, down = event && /(down|start)$/i.test(event.type)) {\n const id = utils.getPointerId(pointer);\n let index = this.getPointerIndex(pointer);\n\n if (index === -1) {\n index = this.pointerIds.length;\n this.pointerIds[index] = id;\n }\n\n if (down) {\n signals.fire('update-pointer-down', {\n pointer,\n event,\n down,\n pointerId: id,\n pointerIndex: index,\n interaction: this,\n });\n }\n\n this.pointers[index] = pointer;\n\n return index;\n }\n\n removePointer (pointer, event) {\n const id = utils.getPointerId(pointer);\n const index = this.mouse? 0 : utils.indexOf(this.pointerIds, id);\n\n if (index === -1) { return; }\n\n signals.fire('remove-pointer', {\n pointer,\n event,\n pointerIndex: index,\n interaction: this,\n });\n\n this.pointers .splice(index, 1);\n this.pointerIds .splice(index, 1);\n this.downTargets.splice(index, 1);\n this.downTimes .splice(index, 1);\n }\n\n _updateEventTargets (target, currentTarget) {\n this._eventTarget = target;\n this._curEventTarget = currentTarget;\n }\n}\n\nfor (let i = 0, len = methodNames.length; i < len; i++) {\n const method = methodNames[i];\n\n listeners[method] = doOnInteractions(method);\n}\n\nfunction doOnInteractions (method) {\n return (function (event) {\n const [eventTarget, curEventTarget] = utils.getEventTargets(event);\n const matches = []; // [ [pointer, interaction], ...]\n\n if (browser.supportsTouch && /touch/.test(event.type)) {\n prevTouchTime = new Date().getTime();\n\n for (let i = 0; i < event.changedTouches.length; i++) {\n const pointer = event.changedTouches[i];\n const interaction = finder.search(pointer, event.type, eventTarget);\n\n matches.push([pointer, interaction || new Interaction()]);\n }\n }\n else {\n let invalidPointer = false;\n\n if (!browser.supportsPointerEvent && /mouse/.test(event.type)) {\n // ignore mouse events while touch interactions are active\n for (let i = 0; i < scope.interactions.length && !invalidPointer; i++) {\n invalidPointer = !scope.interactions[i].mouse && scope.interactions[i].pointerIsDown;\n }\n\n // try to ignore mouse events that are simulated by the browser\n // after a touch event\n invalidPointer = invalidPointer\n || (new Date().getTime() - prevTouchTime < 500)\n // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated\n || event.timeStamp === 0;\n }\n\n if (!invalidPointer) {\n let interaction = finder.search(event, event.type, eventTarget);\n\n if (!interaction) {\n\n interaction = new Interaction();\n interaction.mouse = (/mouse/i.test(event.pointerType || event.type)\n // MSPointerEvent.MSPOINTER_TYPE_MOUSE\n || event.pointerType === 4\n || !event.pointerType);\n }\n\n matches.push([event, interaction]);\n }\n }\n\n for (const [pointer, interaction] of matches) {\n interaction._updateEventTargets(eventTarget, curEventTarget);\n interaction[method](pointer, event, eventTarget, curEventTarget);\n }\n });\n}\n\nfunction endAll (event) {\n for (let i = 0; i < scope.interactions.length; i++) {\n const interaction = scope.interactions[i];\n\n interaction.end(event);\n signals.fire('endall', { event, interaction });\n }\n}\n\nconst docEvents = { /* 'eventType': listenerFunc */ };\nconst pEventTypes = browser.pEventTypes;\n\nif (scope.PointerEvent) {\n docEvents[pEventTypes.down ] = listeners.pointerDown;\n docEvents[pEventTypes.move ] = listeners.pointerMove;\n docEvents[pEventTypes.up ] = listeners.pointerUp;\n docEvents[pEventTypes.cancel] = listeners.pointerUp;\n}\nelse {\n docEvents.mousedown = listeners.pointerDown;\n docEvents.mousemove = listeners.pointerMove;\n docEvents.mouseup = listeners.pointerUp;\n\n docEvents.touchstart = listeners.pointerDown;\n docEvents.touchmove = listeners.pointerMove;\n docEvents.touchend = listeners.pointerUp;\n docEvents.touchcancel = listeners.pointerUp;\n}\n\ndocEvents.blur = endAll;\n\nfunction onDocSignal ({ doc }, signalName) {\n const eventMethod = signalName.indexOf('add') === 0\n ? events.add : events.remove;\n\n // delegate event listener\n for (const eventType in scope.delegatedEvents) {\n eventMethod(doc, eventType, events.delegateListener);\n eventMethod(doc, eventType, events.delegateUseCapture, true);\n }\n\n for (const eventType in docEvents) {\n eventMethod(doc, eventType, docEvents[eventType]);\n }\n}\n\nsignals.on('update-pointer-down', ({ interaction, pointer, pointerId, pointerIndex, event, eventTarget, down }) => {\n interaction.pointerIds[pointerIndex] = pointerId;\n interaction.pointers[pointerIndex] = pointer;\n\n if (down) {\n interaction.pointerIsDown = true;\n }\n\n if (!interaction.interacting()) {\n utils.setCoords(interaction.startCoords, interaction.pointers);\n\n utils.copyCoords(interaction.curCoords , interaction.startCoords);\n utils.copyCoords(interaction.prevCoords, interaction.startCoords);\n\n interaction.downEvent = event;\n interaction.downTimes[pointerIndex] = interaction.curCoords.timeStamp;\n interaction.downTargets[pointerIndex] = eventTarget || event && utils.getEventTargets(event)[0];\n interaction.pointerWasMoved = false;\n\n utils.pointerExtend(interaction.downPointer, pointer);\n }\n});\n\nscope.signals.on('add-document' , onDocSignal);\nscope.signals.on('remove-document', onDocSignal);\n\nInteraction.pointerMoveTolerance = 1;\nInteraction.doOnInteractions = doOnInteractions;\nInteraction.endAll = endAll;\nInteraction.signals = signals;\nInteraction.docEvents = docEvents;\n\nscope.endAllInteractions = endAll;\n\nmodule.exports = Interaction;\n","const Interaction = require('../Interaction');\nconst InteractEvent = require('../InteractEvent');\n\nconst actions = {\n firePrepared,\n names: [],\n methodDict: {},\n};\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n interaction._interacting = true;\n firePrepared(interaction, event, 'start');\n});\n\nInteraction.signals.on('action-move', function ({ interaction, event, preEnd }) {\n firePrepared(interaction, event, 'move', preEnd);\n\n // if the action was ended in a listener\n if (!interaction.interacting()) { return false; }\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n firePrepared(interaction, event, 'end');\n});\n\nfunction firePrepared (interaction, event, phase, preEnd) {\n const actionName = interaction.prepared.name;\n\n const newEvent = new InteractEvent(interaction, event, actionName, phase, interaction.element, null, preEnd);\n\n interaction.target.fire(newEvent);\n interaction.prevEvent = newEvent;\n}\n\nmodule.exports = actions;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drag = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n startAxis : 'xy',\n lockAxis : 'xy',\n },\n\n checker: function (pointer, event, interactable) {\n const dragOptions = interactable.options.drag;\n\n return dragOptions.enabled\n ? { name: 'drag', axis: (dragOptions.lockAxis === 'start'\n ? dragOptions.startAxis\n : dragOptions.lockAxis)}\n : null;\n },\n\n getCursor: function () {\n return 'move';\n },\n};\n\nInteraction.signals.on('before-action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n interaction.curCoords.page.y = interaction.startCoords.page.y;\n interaction.curCoords.client.y = interaction.startCoords.client.y;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vx);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vx);\n interaction.pointerDelta.client.vy = 0;\n interaction.pointerDelta.page.vy = 0;\n }\n else if (axis === 'y') {\n interaction.curCoords.page.x = interaction.startCoords.page.x;\n interaction.curCoords.client.x = interaction.startCoords.client.x;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vy);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vy);\n interaction.pointerDelta.client.vx = 0;\n interaction.pointerDelta.page.vx = 0;\n }\n});\n\n// dragmove\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'dragmove') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n iEvent.pageY = interaction.startCoords.page.y;\n iEvent.clientY = interaction.startCoords.client.y;\n iEvent.dy = 0;\n }\n else if (axis === 'y') {\n iEvent.pageX = interaction.startCoords.page.x;\n iEvent.clientX = interaction.startCoords.client.x;\n iEvent.dx = 0;\n }\n});\n\n/*\\\n * Interactable.draggable\n [ method ]\n *\n * Gets or sets whether drag actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of drag events\n | var isDraggable = interact('ul li').draggable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on drag events (object makes the Interactable draggable)\n = (object) This Interactable\n | interact(element).draggable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // the axis in which the first movement must be\n | // for the drag sequence to start\n | // 'xy' by default - any direction\n | startAxis: 'x' || 'y' || 'xy',\n |\n | // 'xy' by default - don't restrict to one axis (move in any direction)\n | // 'x' or 'y' to restrict movement to either axis\n | // 'start' to restrict movement to the axis the drag started in\n | lockAxis: 'x' || 'y' || 'xy' || 'start',\n |\n | // max number of drags that can happen concurrently\n | // with elements of this Interactable. Infinity by default\n | max: Infinity,\n |\n | // max number of drags that can target the same element+Interactable\n | // 1 by default\n | maxPerElement: 2\n | });\n\\*/\nInteractable.prototype.draggable = function (options) {\n if (utils.is.object(options)) {\n this.options.drag.enabled = options.enabled === false? false: true;\n this.setPerAction('drag', options);\n this.setOnEvents('drag', options);\n\n if (/^(xy|x|y|start)$/.test(options.lockAxis)) {\n this.options.drag.lockAxis = options.lockAxis;\n }\n if (/^(xy|x|y)$/.test(options.startAxis)) {\n this.options.drag.startAxis = options.startAxis;\n }\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drag.enabled = options;\n\n if (!options) {\n this.ondragstart = this.ondragstart = this.ondragend = null;\n }\n\n return this;\n }\n\n return this.options.drag;\n};\n\nactions.drag = drag;\nactions.names.push('drag');\nutils.merge(Interactable.eventTypes, [\n 'dragstart',\n 'dragmove',\n 'draginertiastart',\n 'draginertiaresume',\n 'dragend',\n]);\nactions.methodDict.drag = 'draggable';\n\ndefaultOptions.drag = drag.defaults;\n\nmodule.exports = drag;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst scope = require('../scope');\nconst interact = require('../interact');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drop = {\n defaults: {\n enabled: false,\n accept : null,\n overlap: 'pointer',\n },\n};\n\nlet dynamicDrop = false;\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // reset active dropzones\n interaction.activeDrops.dropzones = [];\n interaction.activeDrops.elements = [];\n interaction.activeDrops.rects = [];\n\n interaction.dropEvents = null;\n\n if (!interaction.dynamicDrop) {\n setActiveDrops(interaction, interaction.element);\n }\n\n const dragEvent = interaction.prevEvent;\n const dropEvents = getDropEvents(interaction, event, dragEvent);\n\n if (dropEvents.activate) {\n fireActiveDrops(interaction, dropEvents.activate);\n }\n});\n\nInteractEvent.signals.on('new', function ({ interaction, iEvent, event }) {\n if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { return; }\n\n const draggableElement = interaction.element;\n const dragEvent = iEvent;\n const dropResult = getDrop(dragEvent, event, draggableElement);\n\n interaction.dropTarget = dropResult.dropzone;\n interaction.dropElement = dropResult.element;\n\n interaction.dropEvents = getDropEvents(interaction, event, dragEvent);\n});\n\nInteraction.signals.on('action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n fireDropEvents(interaction, interaction.dropEvents);\n});\n\nInteraction.signals.on('action-end', function ({ interaction }) {\n if (interaction.prepared.name === 'drag') {\n fireDropEvents(interaction, interaction.dropEvents);\n }\n});\n\nInteraction.signals.on('stop-drag', function ({ interaction }) {\n interaction.activeDrops.dropzones =\n interaction.activeDrops.elements =\n interaction.activeDrops.rects =\n interaction.dropEvents = null;\n});\n\nfunction collectDrops (interaction, element) {\n const drops = [];\n const elements = [];\n\n element = element || interaction.element;\n\n // collect all dropzones and their elements which qualify for a drop\n for (const current of scope.interactables) {\n if (!current.options.drop.enabled) { continue; }\n\n const accept = current.options.drop.accept;\n\n // test the draggable element against the dropzone's accept setting\n if ((utils.is.element(accept) && accept !== element)\n || (utils.is.string(accept)\n && !utils.matchesSelector(element, accept))) {\n\n continue;\n }\n\n // query for new elements if necessary\n const dropElements = utils.is.string(current.target)\n ? current._context.querySelectorAll(current.target)\n : [current.target];\n\n for (let i = 0; i < dropElements.length; i++) {\n const currentElement = dropElements[i];\n\n if (currentElement !== element) {\n drops.push(current);\n elements.push(currentElement);\n }\n }\n }\n\n return {\n elements,\n dropzones: drops,\n };\n}\n\nfunction fireActiveDrops (interaction, event) {\n let prevElement;\n\n // loop through all active dropzones and trigger event\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n const current = interaction.activeDrops.dropzones[i];\n const currentElement = interaction.activeDrops.elements [i];\n\n // prevent trigger of duplicate events on same element\n if (currentElement !== prevElement) {\n // set current element as event target\n event.target = currentElement;\n current.fire(event);\n }\n prevElement = currentElement;\n }\n}\n\n// Collect a new set of possible drops and save them in activeDrops.\n// setActiveDrops should always be called when a drag has just started or a\n// drag event happens while dynamicDrop is true\nfunction setActiveDrops (interaction, dragElement) {\n // get dropzones and their elements that could receive the draggable\n const possibleDrops = collectDrops(interaction, dragElement, true);\n\n interaction.activeDrops.dropzones = possibleDrops.dropzones;\n interaction.activeDrops.elements = possibleDrops.elements;\n interaction.activeDrops.rects = [];\n\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n interaction.activeDrops.rects[i] =\n interaction.activeDrops.dropzones[i].getRect(interaction.activeDrops.elements[i]);\n }\n}\n\nfunction getDrop (dragEvent, event, dragElement) {\n const interaction = dragEvent.interaction;\n const validDrops = [];\n\n if (dynamicDrop) {\n setActiveDrops(interaction, dragElement);\n }\n\n // collect all dropzones and their elements which qualify for a drop\n for (let j = 0; j < interaction.activeDrops.dropzones.length; j++) {\n const current = interaction.activeDrops.dropzones[j];\n const currentElement = interaction.activeDrops.elements [j];\n const rect = interaction.activeDrops.rects [j];\n\n validDrops.push(current.dropCheck(dragEvent, event, interaction.target, dragElement, currentElement, rect)\n ? currentElement\n : null);\n }\n\n // get the most appropriate dropzone based on DOM depth and order\n const dropIndex = utils.indexOfDeepestElement(validDrops);\n\n return {\n dropzone: interaction.activeDrops.dropzones[dropIndex] || null,\n element : interaction.activeDrops.elements [dropIndex] || null,\n };\n}\n\nfunction getDropEvents (interaction, pointerEvent, dragEvent) {\n const dropEvents = {\n enter : null,\n leave : null,\n activate : null,\n deactivate: null,\n move : null,\n drop : null,\n };\n\n const tmpl = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n };\n\n if (interaction.dropElement !== interaction.prevDropElement) {\n // if there was a prevDropTarget, create a dragleave event\n if (interaction.prevDropTarget) {\n dropEvents.leave = utils.extend({ type: 'dragleave' }, tmpl);\n\n dragEvent.dragLeave = dropEvents.leave.target = interaction.prevDropElement;\n dragEvent.prevDropzone = dropEvents.leave.dropzone = interaction.prevDropTarget;\n }\n // if the dropTarget is not null, create a dragenter event\n if (interaction.dropTarget) {\n dropEvents.enter = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n type : 'dragenter',\n };\n\n dragEvent.dragEnter = interaction.dropElement;\n dragEvent.dropzone = interaction.dropTarget;\n }\n }\n\n if (dragEvent.type === 'dragend' && interaction.dropTarget) {\n dropEvents.drop = utils.extend({ type: 'drop' }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n dragEvent.relatedTarget = interaction.dropElement;\n }\n if (dragEvent.type === 'dragstart') {\n dropEvents.activate = utils.extend({ type: 'dropactivate' }, tmpl);\n\n dropEvents.activate.target = null;\n dropEvents.activate.dropzone = null;\n }\n if (dragEvent.type === 'dragend') {\n dropEvents.deactivate = utils.extend({ type: 'dropdeactivate' }, tmpl);\n\n dropEvents.deactivate.target = null;\n dropEvents.deactivate.dropzone = null;\n }\n if (dragEvent.type === 'dragmove' && interaction.dropTarget) {\n dropEvents.move = utils.extend({\n dragmove : dragEvent,\n type : 'dropmove',\n }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n }\n\n return dropEvents;\n}\n\nfunction fireDropEvents (interaction, dropEvents) {\n if (dropEvents.leave) { interaction.prevDropTarget.fire(dropEvents.leave); }\n if (dropEvents.move ) { interaction.dropTarget.fire(dropEvents.move ); }\n if (dropEvents.enter) { interaction.dropTarget.fire(dropEvents.enter); }\n if (dropEvents.drop ) { interaction.dropTarget.fire(dropEvents.drop ); }\n if (dropEvents.deactivate) {\n fireActiveDrops(interaction, dropEvents.deactivate);\n }\n\n interaction.prevDropTarget = interaction.dropTarget;\n interaction.prevDropElement = interaction.dropElement;\n}\n\n/*\\\n * Interactable.dropzone\n [ method ]\n *\n * Returns or sets whether elements can be dropped onto this\n * Interactable to trigger drop events\n *\n * Dropzones can receive the following events:\n * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends\n * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone\n * - `dragmove` when a draggable that has entered the dropzone is moved\n * - `drop` when a draggable is dropped into this dropzone\n *\n * Use the `accept` option to allow only elements that match the given CSS\n * selector or element. The value can be:\n *\n * - **an Element** - only that element can be dropped into this dropzone.\n * - **a string**, - the element being dragged must match it as a CSS selector.\n * - **`null`** - accept options is cleared - it accepts any element.\n *\n * Use the `overlap` option to set how drops are checked for. The allowed\n * values are:\n *\n * - `'pointer'`, the pointer must be over the dropzone (default)\n * - `'center'`, the draggable element's center must be over the dropzone\n * - a number from 0-1 which is the `(intersection area) / (draggable area)`.\n * e.g. `0.5` for drop to happen when half of the area of the draggable is\n * over the dropzone\n *\n * Use the `checker` option to specify a function to check if a dragged\n * element is over this Interactable.\n *\n | interact(target)\n | .dropChecker(function(dragEvent, // related dragmove or dragend event\n | event, // TouchEvent/PointerEvent/MouseEvent\n | dropped, // bool result of the default checker\n | dropzone, // dropzone Interactable\n | dropElement, // dropzone elemnt\n | draggable, // draggable Interactable\n | draggableElement) {// draggable element\n |\n | return dropped && event.target.hasAttribute('allow-drop');\n | }\n *\n *\n - options (boolean | object | null) #optional The new value to be set.\n | interact('.drop').dropzone({\n | accept: '.can-drop' || document.getElementById('single-drop'),\n | overlap: 'pointer' || 'center' || zeroToOne\n | }\n = (boolean | object) The current setting or this Interactable\n\\*/\nInteractable.prototype.dropzone = function (options) {\n if (utils.is.object(options)) {\n this.options.drop.enabled = options.enabled === false? false: true;\n\n if (utils.is.function(options.ondrop) ) { this.events.ondrop = options.ondrop ; }\n if (utils.is.function(options.ondropactivate) ) { this.events.ondropactivate = options.ondropactivate ; }\n if (utils.is.function(options.ondropdeactivate)) { this.events.ondropdeactivate = options.ondropdeactivate; }\n if (utils.is.function(options.ondragenter) ) { this.events.ondragenter = options.ondragenter ; }\n if (utils.is.function(options.ondragleave) ) { this.events.ondragleave = options.ondragleave ; }\n if (utils.is.function(options.ondropmove) ) { this.events.ondropmove = options.ondropmove ; }\n\n if (/^(pointer|center)$/.test(options.overlap)) {\n this.options.drop.overlap = options.overlap;\n }\n else if (utils.is.number(options.overlap)) {\n this.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0);\n }\n if ('accept' in options) {\n this.options.drop.accept = options.accept;\n }\n if ('checker' in options) {\n this.options.drop.checker = options.checker;\n }\n\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drop.enabled = options;\n\n if (!options) {\n this.ondragenter = this.ondragleave = this.ondrop\n = this.ondropactivate = this.ondropdeactivate = null;\n }\n\n return this;\n }\n\n return this.options.drop;\n};\n\nInteractable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) {\n let dropped = false;\n\n // if the dropzone has no rect (eg. display: none)\n // call the custom dropChecker or just return false\n if (!(rect = rect || this.getRect(dropElement))) {\n return (this.options.drop.checker\n ? this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement)\n : false);\n }\n\n const dropOverlap = this.options.drop.overlap;\n\n if (dropOverlap === 'pointer') {\n const origin = utils.getOriginXY(draggable, draggableElement, 'drag');\n const page = utils.getPageXY(dragEvent);\n\n page.x += origin.x;\n page.y += origin.y;\n\n const horizontal = (page.x > rect.left) && (page.x < rect.right);\n const vertical = (page.y > rect.top ) && (page.y < rect.bottom);\n\n dropped = horizontal && vertical;\n }\n\n const dragRect = draggable.getRect(draggableElement);\n\n if (dragRect && dropOverlap === 'center') {\n const cx = dragRect.left + dragRect.width / 2;\n const cy = dragRect.top + dragRect.height / 2;\n\n dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom;\n }\n\n if (dragRect && utils.is.number(dropOverlap)) {\n const overlapArea = (Math.max(0, Math.min(rect.right , dragRect.right ) - Math.max(rect.left, dragRect.left))\n * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top , dragRect.top )));\n\n const overlapRatio = overlapArea / (dragRect.width * dragRect.height);\n\n dropped = overlapRatio >= dropOverlap;\n }\n\n if (this.options.drop.checker) {\n dropped = this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement);\n }\n\n return dropped;\n};\n\nInteractable.signals.on('unset', function ({ interactable }) {\n interactable.dropzone(false);\n});\n\nInteractable.settingsMethods.push('dropChecker');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.dropTarget = null; // the dropzone a drag target might be dropped into\n interaction.dropElement = null; // the element at the time of checking\n interaction.prevDropTarget = null; // the dropzone that was recently dragged away from\n interaction.prevDropElement = null; // the element at the time of checking\n interaction.dropEvents = null; // the dropEvents related to the current drag event\n\n interaction.activeDrops = {\n dropzones: [], // the dropzones that are mentioned below\n elements : [], // elements of dropzones that accept the target draggable\n rects : [], // the rects of the elements mentioned above\n };\n\n});\n\nInteraction.signals.on('stop', function ({ interaction }) {\n interaction.dropTarget = interaction.dropElement =\n interaction.prevDropTarget = interaction.prevDropElement = null;\n});\n\n/*\\\n * interact.dynamicDrop\n [ method ]\n *\n * Returns or sets whether the dimensions of dropzone elements are\n * calculated on every dragmove or only on dragstart for the default\n * dropChecker\n *\n - newValue (boolean) #optional True to check on each move. False to check only before start\n = (boolean | interact) The current setting or interact\n\\*/\ninteract.dynamicDrop = function (newValue) {\n if (utils.is.bool(newValue)) {\n //if (dragging && dynamicDrop !== newValue && !newValue) {\n //calcRects(dropzones);\n //}\n\n dynamicDrop = newValue;\n\n return interact;\n }\n return dynamicDrop;\n};\n\nutils.merge(Interactable.eventTypes, [\n 'dragenter',\n 'dragleave',\n 'dropactivate',\n 'dropdeactivate',\n 'dropmove',\n 'drop',\n]);\nactions.methodDict.drop = 'dropzone';\n\ndefaultOptions.drop = drop.defaults;\n\nmodule.exports = drop;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst gesture = {\n defaults: {\n enabled : false,\n origin : null,\n restrict: null,\n },\n\n checker: function (pointer, event, interactable, element, interaction) {\n if (interaction.pointerIds.length >= 2) {\n return { name: 'gesture' };\n }\n\n return null;\n },\n\n getCursor: function () {\n return '';\n },\n};\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturestart') { return; }\n iEvent.ds = 0;\n\n interaction.gesture.startDistance = interaction.gesture.prevDistance = iEvent.distance;\n interaction.gesture.startAngle = interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.scale = 1;\n});\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturemove') { return; }\n\n iEvent.ds = iEvent.scale - interaction.gesture.scale;\n\n interaction.target.fire(iEvent);\n\n interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.prevDistance = iEvent.distance;\n\n if (iEvent.scale !== Infinity\n && iEvent.scale !== null\n && iEvent.scale !== undefined\n && !isNaN(iEvent.scale)) {\n\n interaction.gesture.scale = iEvent.scale;\n }\n});\n\n/*\\\n * Interactable.gesturable\n [ method ]\n *\n * Gets or sets whether multitouch gestures can be performed on the\n * Interactable's element\n *\n = (boolean) Indicates if this can be the target of gesture events\n | var isGestureable = interact(element).gesturable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on gesture events (makes the Interactable gesturable)\n = (object) this Interactable\n | interact(element).gesturable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // limit multiple gestures.\n | // See the explanation in @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n\\*/\nInteractable.prototype.gesturable = function (options) {\n if (utils.is.object(options)) {\n this.options.gesture.enabled = options.enabled === false? false: true;\n this.setPerAction('gesture', options);\n this.setOnEvents('gesture', options);\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.gesture.enabled = options;\n\n if (!options) {\n this.ongesturestart = this.ongesturestart = this.ongestureend = null;\n }\n\n return this;\n }\n\n return this.options.gesture;\n};\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action, event, starting, ending, deltaSource }) {\n if (action !== 'gesture') { return; }\n\n const pointers = interaction.pointers;\n\n iEvent.touches = [pointers[0], pointers[1]];\n\n if (starting) {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = 1;\n iEvent.ds = 0;\n iEvent.angle = utils.touchAngle(pointers, undefined, deltaSource);\n iEvent.da = 0;\n }\n else if (ending || event instanceof InteractEvent) {\n iEvent.distance = interaction.prevEvent.distance;\n iEvent.box = interaction.prevEvent.box;\n iEvent.scale = interaction.prevEvent.scale;\n iEvent.ds = iEvent.scale - 1;\n iEvent.angle = interaction.prevEvent.angle;\n iEvent.da = iEvent.angle - interaction.gesture.startAngle;\n }\n else {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = iEvent.distance / interaction.gesture.startDistance;\n iEvent.angle = utils.touchAngle(pointers, interaction.gesture.prevAngle, deltaSource);\n\n iEvent.ds = iEvent.scale - interaction.gesture.prevScale;\n iEvent.da = iEvent.angle - interaction.gesture.prevAngle;\n }\n});\n\nInteraction.signals.on('new', function (interaction) {\n interaction.gesture = {\n start: { x: 0, y: 0 },\n\n startDistance: 0, // distance between two touches of touchStart\n prevDistance : 0,\n distance : 0,\n\n scale: 1, // gesture.distance / gesture.startDistance\n\n startAngle: 0, // angle of line joining two touches\n prevAngle : 0, // angle of the previous gesture event\n };\n});\n\nactions.gesture = gesture;\nactions.names.push('gesture');\nutils.merge(Interactable.eventTypes, [\n 'gesturestart',\n 'gesturemove',\n 'gestureend',\n]);\nactions.methodDict.gesture = 'gesturable';\n\ndefaultOptions.gesture = gesture.defaults;\n\nmodule.exports = gesture;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\n// Less Precision with touch input\nconst defaultMargin = browser.supportsTouch || browser.supportsPointerEvent? 20: 10;\n\nconst resize = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n square: false,\n preserveAspectRatio: false,\n axis: 'xy',\n\n // use default margin\n margin: NaN,\n\n // object with props left, right, top, bottom which are\n // true/false values to resize when the pointer is over that edge,\n // CSS selectors to match the handles for each direction\n // or the Elements for each handle\n edges: null,\n\n // a value of 'none' will limit the resize rect to a minimum of 0x0\n // 'negate' will alow the rect to have negative width/height\n // 'reposition' will keep the width/height positive by swapping\n // the top and bottom edges and/or swapping the left and right edges\n invert: 'none',\n },\n\n checker: function (pointer, event, interactable, element, interaction, rect) {\n if (!rect) { return null; }\n\n const page = utils.extend({}, interaction.curCoords.page);\n const options = interactable.options;\n\n if (options.resize.enabled) {\n const resizeOptions = options.resize;\n const resizeEdges = { left: false, right: false, top: false, bottom: false };\n\n // if using resize.edges\n if (utils.is.object(resizeOptions.edges)) {\n for (const edge in resizeEdges) {\n resizeEdges[edge] = checkResizeEdge(edge,\n resizeOptions.edges[edge],\n page,\n interaction._eventTarget,\n element,\n rect,\n resizeOptions.margin || defaultMargin);\n }\n\n resizeEdges.left = resizeEdges.left && !resizeEdges.right;\n resizeEdges.top = resizeEdges.top && !resizeEdges.bottom;\n\n if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) {\n return {\n name: 'resize',\n edges: resizeEdges,\n };\n }\n }\n else {\n const right = options.resize.axis !== 'y' && page.x > (rect.right - defaultMargin);\n const bottom = options.resize.axis !== 'x' && page.y > (rect.bottom - defaultMargin);\n\n if (right || bottom) {\n return {\n name: 'resize',\n axes: (right? 'x' : '') + (bottom? 'y' : ''),\n };\n }\n }\n }\n\n return null;\n },\n\n cursors: (browser.isIe9OrOlder ? {\n x : 'e-resize',\n y : 's-resize',\n xy: 'se-resize',\n\n top : 'n-resize',\n left : 'w-resize',\n bottom : 's-resize',\n right : 'e-resize',\n topleft : 'se-resize',\n bottomright: 'se-resize',\n topright : 'ne-resize',\n bottomleft : 'ne-resize',\n } : {\n x : 'ew-resize',\n y : 'ns-resize',\n xy: 'nwse-resize',\n\n top : 'ns-resize',\n left : 'ew-resize',\n bottom : 'ns-resize',\n right : 'ew-resize',\n topleft : 'nwse-resize',\n bottomright: 'nwse-resize',\n topright : 'nesw-resize',\n bottomleft : 'nesw-resize',\n }),\n\n getCursor: function (action) {\n if (action.axis) {\n return resize.cursors[action.name + action.axis];\n }\n else if (action.edges) {\n let cursorKey = '';\n const edgeNames = ['top', 'bottom', 'left', 'right'];\n\n for (let i = 0; i < 4; i++) {\n if (action.edges[edgeNames[i]]) {\n cursorKey += edgeNames[i];\n }\n }\n\n return resize.cursors[cursorKey];\n }\n },\n};\n\n// resizestart\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'resizestart' || !interaction.prepared.edges) {\n return;\n }\n\n const startRect = interaction.target.getRect(interaction.element);\n const resizeOptions = interaction.target.options.resize;\n\n /*\n * When using the `resizable.square` or `resizable.preserveAspectRatio` options, resizing from one edge\n * will affect another. E.g. with `resizable.square`, resizing to make the right edge larger will make\n * the bottom edge larger by the same amount. We call these 'linked' edges. Any linked edges will depend\n * on the active edges and the edge being interacted with.\n */\n if (resizeOptions.square || resizeOptions.preserveAspectRatio) {\n const linkedEdges = utils.extend({}, interaction.prepared.edges);\n\n linkedEdges.top = linkedEdges.top || (linkedEdges.left && !linkedEdges.bottom);\n linkedEdges.left = linkedEdges.left || (linkedEdges.top && !linkedEdges.right );\n linkedEdges.bottom = linkedEdges.bottom || (linkedEdges.right && !linkedEdges.top );\n linkedEdges.right = linkedEdges.right || (linkedEdges.bottom && !linkedEdges.left );\n\n interaction.prepared._linkedEdges = linkedEdges;\n }\n else {\n interaction.prepared._linkedEdges = null;\n }\n\n // if using `resizable.preserveAspectRatio` option, record aspect ratio at the start of the resize\n if (resizeOptions.preserveAspectRatio) {\n interaction.resizeStartAspectRatio = startRect.width / startRect.height;\n }\n\n interaction.resizeRects = {\n start : startRect,\n current : utils.extend({}, startRect),\n inverted : utils.extend({}, startRect),\n previous : utils.extend({}, startRect),\n delta : {\n left: 0, right : 0, width : 0,\n top : 0, bottom: 0, height: 0,\n },\n };\n\n iEvent.rect = interaction.resizeRects.inverted;\n iEvent.deltaRect = interaction.resizeRects.delta;\n});\n\n// resizemove\nInteractEvent.signals.on('new', function ({ iEvent, phase, interaction }) {\n if (phase !== 'move' || !interaction.prepared.edges) { return; }\n\n const resizeOptions = interaction.target.options.resize;\n const invert = resizeOptions.invert;\n const invertible = invert === 'reposition' || invert === 'negate';\n\n let edges = interaction.prepared.edges;\n\n const start = interaction.resizeRects.start;\n const current = interaction.resizeRects.current;\n const inverted = interaction.resizeRects.inverted;\n const delta = interaction.resizeRects.delta;\n const previous = utils.extend(interaction.resizeRects.previous, inverted);\n const originalEdges = edges;\n\n let dx = iEvent.dx;\n let dy = iEvent.dy;\n\n if (resizeOptions.preserveAspectRatio || resizeOptions.square) {\n // `resize.preserveAspectRatio` takes precedence over `resize.square`\n const startAspectRatio = resizeOptions.preserveAspectRatio\n ? interaction.resizeStartAspectRatio\n : 1;\n\n edges = interaction.prepared._linkedEdges;\n\n if ((originalEdges.left && originalEdges.bottom)\n || (originalEdges.right && originalEdges.top)) {\n dy = -dx / startAspectRatio;\n }\n else if (originalEdges.left || originalEdges.right ) { dy = dx / startAspectRatio; }\n else if (originalEdges.top || originalEdges.bottom) { dx = dy * startAspectRatio; }\n }\n\n // update the 'current' rect without modifications\n if (edges.top ) { current.top += dy; }\n if (edges.bottom) { current.bottom += dy; }\n if (edges.left ) { current.left += dx; }\n if (edges.right ) { current.right += dx; }\n\n if (invertible) {\n // if invertible, copy the current rect\n utils.extend(inverted, current);\n\n if (invert === 'reposition') {\n // swap edge values if necessary to keep width/height positive\n let swap;\n\n if (inverted.top > inverted.bottom) {\n swap = inverted.top;\n\n inverted.top = inverted.bottom;\n inverted.bottom = swap;\n }\n if (inverted.left > inverted.right) {\n swap = inverted.left;\n\n inverted.left = inverted.right;\n inverted.right = swap;\n }\n }\n }\n else {\n // if not invertible, restrict to minimum of 0x0 rect\n inverted.top = Math.min(current.top, start.bottom);\n inverted.bottom = Math.max(current.bottom, start.top);\n inverted.left = Math.min(current.left, start.right);\n inverted.right = Math.max(current.right, start.left);\n }\n\n inverted.width = inverted.right - inverted.left;\n inverted.height = inverted.bottom - inverted.top ;\n\n for (const edge in inverted) {\n delta[edge] = inverted[edge] - previous[edge];\n }\n\n iEvent.edges = interaction.prepared.edges;\n iEvent.rect = inverted;\n iEvent.deltaRect = delta;\n});\n\n/*\\\n * Interactable.resizable\n [ method ]\n *\n * Gets or sets whether resize actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of resize elements\n | var isResizeable = interact('input[type=text]').resizable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on resize events (object makes the Interactable resizable)\n = (object) This Interactable\n | interact(element).resizable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | edges: {\n | top : true, // Use pointer coords to check for resize.\n | left : false, // Disable resizing from left edge.\n | bottom: '.resize-s',// Resize if pointer target matches selector\n | right : handleEl // Resize if pointer target is the given Element\n | },\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height are adjusted at a 1:1 ratio.\n | square: false,\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height maintain the aspect ratio they had when resizing started.\n | preserveAspectRatio: false,\n |\n | // a value of 'none' will limit the resize rect to a minimum of 0x0\n | // 'negate' will allow the rect to have negative width/height\n | // 'reposition' will keep the width/height positive by swapping\n | // the top and bottom edges and/or swapping the left and right edges\n | invert: 'none' || 'negate' || 'reposition'\n |\n | // limit multiple resizes.\n | // See the explanation in the @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n \\*/\nInteractable.prototype.resizable = function (options) {\n if (utils.is.object(options)) {\n this.options.resize.enabled = options.enabled === false? false: true;\n this.setPerAction('resize', options);\n this.setOnEvents('resize', options);\n\n if (/^x$|^y$|^xy$/.test(options.axis)) {\n this.options.resize.axis = options.axis;\n }\n else if (options.axis === null) {\n this.options.resize.axis = defaultOptions.resize.axis;\n }\n\n if (utils.is.bool(options.preserveAspectRatio)) {\n this.options.resize.preserveAspectRatio = options.preserveAspectRatio;\n }\n else if (utils.is.bool(options.square)) {\n this.options.resize.square = options.square;\n }\n\n return this;\n }\n if (utils.is.bool(options)) {\n this.options.resize.enabled = options;\n\n if (!options) {\n this.onresizestart = this.onresizestart = this.onresizeend = null;\n }\n\n return this;\n }\n return this.options.resize;\n};\n\nfunction checkResizeEdge (name, value, page, element, interactableElement, rect, margin) {\n // false, '', undefined, null\n if (!value) { return false; }\n\n // true value, use pointer coords and element rect\n if (value === true) {\n // if dimensions are negative, \"switch\" edges\n const width = utils.is.number(rect.width )? rect.width : rect.right - rect.left;\n const height = utils.is.number(rect.height)? rect.height : rect.bottom - rect.top ;\n\n if (width < 0) {\n if (name === 'left' ) { name = 'right'; }\n else if (name === 'right') { name = 'left' ; }\n }\n if (height < 0) {\n if (name === 'top' ) { name = 'bottom'; }\n else if (name === 'bottom') { name = 'top' ; }\n }\n\n if (name === 'left' ) { return page.x < ((width >= 0? rect.left: rect.right ) + margin); }\n if (name === 'top' ) { return page.y < ((height >= 0? rect.top : rect.bottom) + margin); }\n\n if (name === 'right' ) { return page.x > ((width >= 0? rect.right : rect.left) - margin); }\n if (name === 'bottom') { return page.y > ((height >= 0? rect.bottom: rect.top ) - margin); }\n }\n\n // the remaining checks require an element\n if (!utils.is.element(element)) { return false; }\n\n return utils.is.element(value)\n // the value is an element to use as a resize handle\n ? value === element\n // otherwise check if element matches value as selector\n : utils.matchesUpTo(element, value, interactableElement);\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.resizeAxes = 'xy';\n});\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action }) {\n if (action !== 'resize' || !interaction.resizeAxes) { return; }\n\n const options = interaction.target.options;\n\n if (options.resize.square) {\n if (interaction.resizeAxes === 'y') {\n iEvent.dx = iEvent.dy;\n }\n else {\n iEvent.dy = iEvent.dx;\n }\n iEvent.axes = 'xy';\n }\n else {\n iEvent.axes = interaction.resizeAxes;\n\n if (interaction.resizeAxes === 'x') {\n iEvent.dy = 0;\n }\n else if (interaction.resizeAxes === 'y') {\n iEvent.dx = 0;\n }\n }\n});\n\nactions.resize = resize;\nactions.names.push('resize');\nutils.merge(Interactable.eventTypes, [\n 'resizestart',\n 'resizemove',\n 'resizeinertiastart',\n 'resizeinertiaresume',\n 'resizeend',\n]);\nactions.methodDict.resize = 'resizable';\n\ndefaultOptions.resize = resize.defaults;\n\nmodule.exports = resize;\n","const raf = require('./utils/raf');\nconst getWindow = require('./utils/window').getWindow;\nconst is = require('./utils/is');\nconst domUtils = require('./utils/domUtils');\nconst Interaction = require('./Interaction');\nconst defaultOptions = require('./defaultOptions');\n\nconst autoScroll = {\n defaults: {\n enabled : false,\n container: null, // the item that is scrolled (Window or HTMLElement)\n margin : 60,\n speed : 300, // the scroll speed in pixels per second\n },\n\n interaction: null,\n i: null, // the handle returned by window.setInterval\n x: 0, y: 0, // Direction each pulse is to scroll in\n\n isScrolling: false,\n prevTime: 0,\n\n start: function (interaction) {\n autoScroll.isScrolling = true;\n raf.cancel(autoScroll.i);\n\n autoScroll.interaction = interaction;\n autoScroll.prevTime = new Date().getTime();\n autoScroll.i = raf.request(autoScroll.scroll);\n },\n\n stop: function () {\n autoScroll.isScrolling = false;\n raf.cancel(autoScroll.i);\n },\n\n // scroll the window by the values in scroll.x/y\n scroll: function () {\n const options = autoScroll.interaction.target.options[autoScroll.interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(autoScroll.interaction.element);\n const now = new Date().getTime();\n // change in time in seconds\n const dt = (now - autoScroll.prevTime) / 1000;\n // displacement\n const s = options.speed * dt;\n\n if (s >= 1) {\n if (is.window(container)) {\n container.scrollBy(autoScroll.x * s, autoScroll.y * s);\n }\n else if (container) {\n container.scrollLeft += autoScroll.x * s;\n container.scrollTop += autoScroll.y * s;\n }\n\n autoScroll.prevTime = now;\n }\n\n if (autoScroll.isScrolling) {\n raf.cancel(autoScroll.i);\n autoScroll.i = raf.request(autoScroll.scroll);\n }\n },\n check: function (interactable, actionName) {\n const options = interactable.options;\n\n return options[actionName].autoScroll && options[actionName].autoScroll.enabled;\n },\n onInteractionMove: function ({ interaction, pointer }) {\n if (!(interaction.interacting()\n && autoScroll.check(interaction.target, interaction.prepared.name))) {\n return;\n }\n\n if (interaction.simulation) {\n autoScroll.x = autoScroll.y = 0;\n return;\n }\n\n let top;\n let right;\n let bottom;\n let left;\n\n const options = interaction.target.options[interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(interaction.element);\n\n if (is.window(container)) {\n left = pointer.clientX < autoScroll.margin;\n top = pointer.clientY < autoScroll.margin;\n right = pointer.clientX > container.innerWidth - autoScroll.margin;\n bottom = pointer.clientY > container.innerHeight - autoScroll.margin;\n }\n else {\n const rect = domUtils.getElementClientRect(container);\n\n left = pointer.clientX < rect.left + autoScroll.margin;\n top = pointer.clientY < rect.top + autoScroll.margin;\n right = pointer.clientX > rect.right - autoScroll.margin;\n bottom = pointer.clientY > rect.bottom - autoScroll.margin;\n }\n\n autoScroll.x = (right ? 1: left? -1: 0);\n autoScroll.y = (bottom? 1: top? -1: 0);\n\n if (!autoScroll.isScrolling) {\n // set the autoScroll properties to those of the target\n autoScroll.margin = options.margin;\n autoScroll.speed = options.speed;\n\n autoScroll.start(interaction);\n }\n },\n};\n\nInteraction.signals.on('stop-active', function () {\n autoScroll.stop();\n});\n\nInteraction.signals.on('action-move', autoScroll.onInteractionMove);\n\ndefaultOptions.perAction.autoScroll = autoScroll.defaults;\n\nmodule.exports = autoScroll;\n","const Interactable = require('../Interactable');\nconst actions = require('../actions/base');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.ignoreFrom\n [ method ]\n *\n * If the target of the `mousedown`, `pointerdown` or `touchstart`\n * event or any of it's parents match the given CSS selector or\n * Element, no drag/resize/gesture is started.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to not ignore any elements\n = (string | Element | object) The current ignoreFrom value or this Interactable\n **\n | interact(element, { ignoreFrom: document.getElementById('no-action') });\n | // or\n | interact(element).ignoreFrom('input, textarea, a');\n\\*/\nInteractable.prototype.ignoreFrom = function (newValue) {\n return this._backCompatOption('ignoreFrom', newValue);\n};\n\n/*\\\n * Interactable.allowFrom\n [ method ]\n *\n * A drag/resize/gesture is started only If the target of the\n * `mousedown`, `pointerdown` or `touchstart` event or any of it's\n * parents match the given CSS selector or Element.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to allow from any element\n = (string | Element | object) The current allowFrom value or this Interactable\n **\n | interact(element, { allowFrom: document.getElementById('drag-handle') });\n | // or\n | interact(element).allowFrom('.handle');\n\\*/\nInteractable.prototype.allowFrom = function (newValue) {\n return this._backCompatOption('allowFrom', newValue);\n};\n\nInteractable.prototype.testIgnore = function (ignoreFrom, interactableElement, element) {\n if (!ignoreFrom || !is.element(element)) { return false; }\n\n if (is.string(ignoreFrom)) {\n return domUtils.matchesUpTo(element, ignoreFrom, interactableElement);\n }\n else if (is.element(ignoreFrom)) {\n return domUtils.nodeContains(ignoreFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testAllow = function (allowFrom, interactableElement, element) {\n if (!allowFrom) { return true; }\n\n if (!is.element(element)) { return false; }\n\n if (is.string(allowFrom)) {\n return domUtils.matchesUpTo(element, allowFrom, interactableElement);\n }\n else if (is.element(allowFrom)) {\n return domUtils.nodeContains(allowFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testIgnoreAllow = function (options, interactableElement, eventTarget) {\n return (!this.testIgnore(options.ignoreFrom, interactableElement, eventTarget)\n && this.testAllow(options.allowFrom, interactableElement, eventTarget));\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (event.buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\n","const interact = require('../interact');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst actions = require('../actions/base');\nconst defaultOptions = require('../defaultOptions');\nconst browser = require('../utils/browser');\nconst scope = require('../scope');\nconst utils = require('../utils');\nconst signals = require('../utils/Signals').new();\n\nrequire('./InteractableMethods');\n\nconst autoStart = {\n signals,\n withinInteractionLimit,\n // Allow this many interactions to happen simultaneously\n maxInteractions: Infinity,\n defaults: {\n perAction: {\n manualStart: false,\n max: Infinity,\n maxPerElement: 1,\n allowFrom: null,\n ignoreFrom: null,\n },\n },\n setActionDefaults: function (action) {\n utils.extend(action.defaults, autoStart.defaults.perAction);\n },\n};\n\n// set cursor style on mousedown\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget }) {\n if (interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\n// set cursor style on mousemove\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget }) {\n if (!interaction.mouse\n || interaction.pointerIsDown\n || interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\nInteraction.signals.on('move', function (arg) {\n const { interaction, event } = arg;\n\n if (!interaction.pointerIsDown\n || interaction.interacting()\n || !interaction.pointerWasMoved\n || !interaction.prepared.name) {\n return;\n }\n\n signals.fire('before-start', arg);\n\n const target = interaction.target;\n\n if (interaction.prepared.name && target) {\n // check manualStart and interaction limit\n if (target.options[interaction.prepared.name].manualStart\n || !withinInteractionLimit(target, interaction.element, interaction.prepared)) {\n interaction.stop(event);\n }\n else {\n interaction.start(interaction.prepared, target, interaction.element);\n }\n }\n});\n\n// Check if the current target supports the action.\n// If so, return the validated action. Otherwise, return null\nfunction validateAction (action, interactable, element, eventTarget) {\n if (utils.is.object(action)\n && interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget)\n && interactable.options[action.name].enabled\n && withinInteractionLimit(interactable, element, action)) {\n return action;\n }\n\n return null;\n}\n\nfunction validateSelector (interaction, pointer, event, matches, matchElements, eventTarget) {\n for (let i = 0, len = matches.length; i < len; i++) {\n const match = matches[i];\n const matchElement = matchElements[i];\n const action = validateAction(match.getAction(pointer, event, interaction, matchElement),\n match,\n matchElement,\n eventTarget);\n\n if (action) {\n return {\n action,\n target: match,\n element: matchElement,\n };\n }\n }\n\n return {};\n}\n\nfunction getActionInfo (interaction, pointer, event, eventTarget) {\n let matches = [];\n let matchElements = [];\n\n let element = eventTarget;\n let action = null;\n\n function pushMatches (interactable, selector, context) {\n const elements = (browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined);\n\n if (utils.matchesSelector(element, selector, elements)) {\n\n matches.push(interactable);\n matchElements.push(element);\n }\n }\n\n while (utils.is.element(element)) {\n matches = [];\n matchElements = [];\n\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && (action = validateAction(elementInteractable.getAction(pointer, event, interaction, element, eventTarget),\n elementInteractable,\n element,\n eventTarget))\n && !elementInteractable.options[action.name].manualStart) {\n return {\n element,\n action,\n target: elementInteractable,\n };\n }\n else {\n scope.interactables.forEachSelector(pushMatches, element);\n\n const actionInfo = validateSelector(interaction, pointer, event, matches, matchElements, eventTarget);\n\n if (actionInfo.action\n && !actionInfo.target.options[actionInfo.action.name].manualStart) {\n return actionInfo;\n }\n }\n\n element = utils.parentNode(element);\n }\n\n return {};\n}\n\nfunction prepare (interaction, { action, target, element }) {\n action = action || {};\n\n if (interaction.target && interaction.target.options.styleCursor) {\n interaction.target._doc.documentElement.style.cursor = '';\n }\n\n interaction.target = target;\n interaction.element = element;\n utils.copyAction(interaction.prepared, action);\n\n if (target && target.options.styleCursor) {\n const cursor = action? actions[action.name].getCursor(action) : '';\n interaction.target._doc.documentElement.style.cursor = cursor;\n }\n\n signals.fire('prepared', { interaction: interaction });\n}\n\nInteraction.signals.on('stop', function ({ interaction }) {\n const target = interaction.target;\n\n if (target && target.options.styleCursor) {\n target._doc.documentElement.style.cursor = '';\n }\n});\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (utils.is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (utils.is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n const buttons = event.buttons || ({\n 0: 1,\n 1: 4,\n 3: 8,\n 4: 16,\n })[event.button];\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\nfunction withinInteractionLimit (interactable, element, action) {\n const options = interactable.options;\n const maxActions = options[action.name].max;\n const maxPerElement = options[action.name].maxPerElement;\n let activeInteractions = 0;\n let targetCount = 0;\n let targetElementCount = 0;\n\n // no actions if any of these values == 0\n if (!(maxActions && maxPerElement && autoStart.maxInteractions)) { return; }\n\n for (let i = 0, len = scope.interactions.length; i < len; i++) {\n const interaction = scope.interactions[i];\n const otherAction = interaction.prepared.name;\n\n if (!interaction.interacting()) { continue; }\n\n activeInteractions++;\n\n if (activeInteractions >= autoStart.maxInteractions) {\n return false;\n }\n\n if (interaction.target !== interactable) { continue; }\n\n targetCount += (otherAction === action.name)|0;\n\n if (targetCount >= maxActions) {\n return false;\n }\n\n if (interaction.element === element) {\n targetElementCount++;\n\n if (otherAction !== action.name || targetElementCount >= maxPerElement) {\n return false;\n }\n }\n }\n\n return autoStart.maxInteractions > 0;\n}\n\n/*\\\n * interact.maxInteractions\n [ method ]\n **\n * Returns or sets the maximum number of concurrent interactions allowed.\n * By default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables\n * and elements, you need to enable it in the draggable, resizable and\n * gesturable `'max'` and `'maxPerElement'` options.\n **\n - newValue (number) #optional Any number. newValue <= 0 means no interactions.\n\\*/\ninteract.maxInteractions = function (newValue) {\n if (utils.is.number(newValue)) {\n autoStart.maxInteractions = newValue;\n\n return this;\n }\n\n return autoStart.maxInteractions;\n};\n\nInteractable.settingsMethods.push('styleCursor');\nInteractable.settingsMethods.push('actionChecker');\nInteractable.settingsMethods.push('ignoreFrom');\nInteractable.settingsMethods.push('allowFrom');\n\ndefaultOptions.base.actionChecker = null;\ndefaultOptions.base.styleCursor = true;\n\nutils.extend(defaultOptions.perAction, autoStart.defaults.perAction);\n\nmodule.exports = autoStart;\n","const autoStart = require('./base');\nconst Interaction = require('../Interaction');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.delayTimer = null;\n});\n\nautoStart.signals.on('prepared', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.delayTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.target, interaction.element);\n }, delay);\n }\n});\n\nInteraction.signals.on('move', function ({ interaction, duplicate }) {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.delayTimer);\n }\n});\n\n// prevent regular down->move autoStart\nautoStart.signals.on('before-start', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.prepared.name = null;\n }\n});\n","const autoStart = require('./base');\nconst scope = require('../scope');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\n\nconst { matchesSelector, parentNode } = require('../utils/domUtils');\n\nautoStart.setActionDefaults(require('../actions/drag'));\n\nautoStart.signals.on('before-start', function ({ interaction, eventTarget, dx, dy }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // check if a drag is in the correct axis\n const absX = Math.abs(dx);\n const absY = Math.abs(dy);\n const options = interaction.target.options.drag;\n const startAxis = options.startAxis;\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy');\n\n interaction.prepared.axis = options.lockAxis === 'start'\n ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n : options.lockAxis;\n\n // if the movement isn't in the startAxis of the interactable\n if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) {\n // cancel the prepared action\n interaction.prepared.name = null;\n\n // then try to get a drag from another ineractable\n\n if (!interaction.prepared.name) {\n\n let element = eventTarget;\n\n const getDraggable = function (interactable, selector, context) {\n const elements = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n if (interactable === interaction.target) { return; }\n\n if (!options.manualStart\n && !interactable.testIgnoreAllow(options, element, eventTarget)\n && matchesSelector(element, selector, elements)) {\n\n const action = interactable.getAction(interaction.downPointer,\n interaction.downEvent,\n interaction,\n element);\n\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, interactable)\n && autoStart.validateAction(action, interactable, element, eventTarget)) {\n\n return interactable;\n }\n }\n };\n\n let action = null;\n\n // check all interactables\n while (is.element(element)) {\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && elementInteractable !== interaction.target\n && !elementInteractable.options.drag.manualStart) {\n\n action = elementInteractable.getAction(interaction.downPointer, interaction.downEvent, interaction, element);\n }\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, elementInteractable)) {\n\n interaction.prepared.name = 'drag';\n interaction.target = elementInteractable;\n interaction.element = element;\n break;\n }\n\n const selectorInteractable = scope.interactables.forEachSelector(getDraggable, element);\n\n if (selectorInteractable) {\n interaction.prepared.name = 'drag';\n interaction.target = selectorInteractable;\n interaction.element = element;\n break;\n }\n\n element = parentNode(element);\n }\n }\n }\n});\n\nfunction checkStartAxis (startAxis, interactable) {\n if (!interactable) { return false; }\n\n const thisAxis = interactable.options.drag.startAxis;\n\n return (startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis);\n}\n","require('./base').setActionDefaults(require('../actions/gesture'));\n","require('./base').setActionDefaults(require('../actions/resize'));\n","module.exports = {\n base: {\n accept : null,\n preventDefault: 'auto',\n deltaSource : 'page',\n },\n\n perAction: {\n origin: { x: 0, y: 0 },\n\n // only allow left button by default\n // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n mouseButtons: 1,\n\n inertia: {\n enabled : false,\n resistance : 10, // the lambda in exponential decay\n minSpeed : 100, // target speed must be above this for inertia to start\n endSpeed : 10, // the speed at which inertia is slow enough to stop\n allowResume : true, // allow resuming an action in inertia phase\n smoothEndDuration: 300, // animate to snap/restrict endOnly if there's no inertia\n },\n },\n};\n","/* browser entry point */\n\n// Legacy browser support\nrequire('./legacyBrowsers');\n\n// inertia\nrequire('./inertia');\n\n// modifiers\nrequire('./modifiers/snap');\nrequire('./modifiers/restrict');\n\n// pointerEvents\nrequire('./pointerEvents/base');\nrequire('./pointerEvents/holdRepeat');\nrequire('./pointerEvents/interactableTargets');\n\n// delay\nrequire('./autoStart/delay');\n\n// actions\nrequire('./actions/gesture');\nrequire('./actions/resize');\nrequire('./actions/drag');\nrequire('./actions/drop');\n\n// load these modifiers after resize is loaded\nrequire('./modifiers/snapSize');\nrequire('./modifiers/restrictEdges');\nrequire('./modifiers/restrictSize');\n\n// autoStart actions\nrequire('./autoStart/gesture');\nrequire('./autoStart/resize');\nrequire('./autoStart/drag');\n\n// Interactable preventDefault setting\nrequire('./interactablePreventDefault.js');\n\n// autoScroll\nrequire('./autoScroll');\n\n// export interact\nmodule.exports = require('./interact');\n","const InteractEvent = require('./InteractEvent');\nconst Interaction = require('./Interaction');\nconst modifiers = require('./modifiers');\nconst utils = require('./utils');\nconst animationFrame = require('./utils/raf');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.inertiaStatus = {\n active : false,\n smoothEnd : false,\n allowResume: false,\n\n startEvent: null,\n upCoords : {},\n\n xe: 0, ye: 0,\n sx: 0, sy: 0,\n\n t0: 0,\n vx0: 0, vys: 0,\n duration: 0,\n\n lambda_v0: 0,\n one_ve_v0: 0,\n i : null,\n };\n\n interaction.boundInertiaFrame = () => inertiaFrame .apply(interaction);\n interaction.boundSmoothEndFrame = () => smoothEndFrame.apply(interaction);\n});\n\nInteraction.signals.on('down', function ({ interaction, event, pointer, eventTarget }) {\n const status = interaction.inertiaStatus;\n\n // Check if the down event hits the current inertia target\n if (status.active) {\n let element = eventTarget;\n\n // climb up the DOM tree from the event target\n while (utils.is.element(element)) {\n\n // if interaction element is the current inertia target element\n if (element === interaction.element) {\n // stop inertia\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n\n // update pointers to the down event's coordinates\n interaction.updatePointer(pointer);\n utils.setCoords(interaction.curCoords, interaction.pointers);\n\n // fire appropriate signals\n const signalArg = { interaction };\n Interaction.signals.fire('before-action-move', signalArg);\n Interaction.signals.fire('action-resume' , signalArg);\n\n // fire a reume event\n const resumeEvent = new InteractEvent(interaction,\n event,\n interaction.prepared.name,\n 'inertiaresume',\n interaction.element);\n\n interaction.target.fire(resumeEvent);\n interaction.prevEvent = resumeEvent;\n modifiers.resetStatuses(interaction.modifierStatuses);\n\n utils.copyCoords(interaction.prevCoords, interaction.curCoords);\n break;\n }\n\n element = utils.parentNode(element);\n }\n }\n});\n\nInteraction.signals.on('up', function ({ interaction, event }) {\n const status = interaction.inertiaStatus;\n\n if (!interaction.interacting() || status.active) { return; }\n\n const target = interaction.target;\n const options = target && target.options;\n const inertiaOptions = options && interaction.prepared.name && options[interaction.prepared.name].inertia;\n\n const now = new Date().getTime();\n const statuses = {};\n const page = utils.extend({}, interaction.curCoords.page);\n const pointerSpeed = interaction.pointerDelta.client.speed;\n\n let smoothEnd = false;\n let modifierResult;\n\n // check if inertia should be started\n const inertiaPossible = (inertiaOptions && inertiaOptions.enabled\n && interaction.prepared.name !== 'gesture'\n && event !== status.startEvent);\n\n const inertia = (inertiaPossible\n && (now - interaction.curCoords.timeStamp) < 50\n && pointerSpeed > inertiaOptions.minSpeed\n && pointerSpeed > inertiaOptions.endSpeed);\n\n const modifierArg = {\n interaction,\n pageCoords: page,\n statuses,\n preEnd: true,\n requireEndOnly: true,\n };\n\n // smoothEnd\n if (inertiaPossible && !inertia) {\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n if (modifierResult.shouldMove && modifierResult.locked) {\n smoothEnd = true;\n }\n }\n\n if (!(inertia || smoothEnd)) { return; }\n\n utils.copyCoords(status.upCoords, interaction.curCoords);\n\n interaction.pointers[0] = status.startEvent =\n new InteractEvent(interaction, event, interaction.prepared.name, 'inertiastart', interaction.element);\n\n status.t0 = now;\n\n status.active = true;\n status.allowResume = inertiaOptions.allowResume;\n interaction.simulation = status;\n\n target.fire(status.startEvent);\n\n if (inertia) {\n status.vx0 = interaction.pointerDelta.client.vx;\n status.vy0 = interaction.pointerDelta.client.vy;\n status.v0 = pointerSpeed;\n\n calcInertia(interaction, status);\n\n utils.extend(page, interaction.curCoords.page);\n\n page.x += status.xe;\n page.y += status.ye;\n\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n status.modifiedXe += modifierResult.dx;\n status.modifiedYe += modifierResult.dy;\n\n status.i = animationFrame.request(interaction.boundInertiaFrame);\n }\n else {\n status.smoothEnd = true;\n status.xe = modifierResult.dx;\n status.ye = modifierResult.dy;\n\n status.sx = status.sy = 0;\n\n status.i = animationFrame.request(interaction.boundSmoothEndFrame);\n }\n});\n\nInteraction.signals.on('stop-active', function ({ interaction }) {\n const status = interaction.inertiaStatus;\n\n if (status.active) {\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n }\n});\n\nfunction calcInertia (interaction, status) {\n const inertiaOptions = interaction.target.options[interaction.prepared.name].inertia;\n const lambda = inertiaOptions.resistance;\n const inertiaDur = -Math.log(inertiaOptions.endSpeed / status.v0) / lambda;\n\n status.x0 = interaction.prevEvent.pageX;\n status.y0 = interaction.prevEvent.pageY;\n status.t0 = status.startEvent.timeStamp / 1000;\n status.sx = status.sy = 0;\n\n status.modifiedXe = status.xe = (status.vx0 - inertiaDur) / lambda;\n status.modifiedYe = status.ye = (status.vy0 - inertiaDur) / lambda;\n status.te = inertiaDur;\n\n status.lambda_v0 = lambda / status.v0;\n status.one_ve_v0 = 1 - inertiaOptions.endSpeed / status.v0;\n}\n\nfunction inertiaFrame () {\n updateInertiaCoords(this);\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n\n const status = this.inertiaStatus;\n const options = this.target.options[this.prepared.name].inertia;\n const lambda = options.resistance;\n const t = new Date().getTime() / 1000 - status.t0;\n\n if (t < status.te) {\n\n const progress = 1 - (Math.exp(-lambda * t) - status.lambda_v0) / status.one_ve_v0;\n\n if (status.modifiedXe === status.xe && status.modifiedYe === status.ye) {\n status.sx = status.xe * progress;\n status.sy = status.ye * progress;\n }\n else {\n const quadPoint = utils.getQuadraticCurvePoint(0, 0,\n status.xe,\n status.ye,\n status.modifiedXe,\n status.modifiedYe,\n progress);\n\n status.sx = quadPoint.x;\n status.sy = quadPoint.y;\n }\n\n this.doMove();\n\n status.i = animationFrame.request(this.boundInertiaFrame);\n }\n else {\n status.sx = status.modifiedXe;\n status.sy = status.modifiedYe;\n\n this.doMove();\n this.end(status.startEvent);\n status.active = false;\n this.simulation = null;\n }\n\n utils.copyCoords(this.prevCoords, this.curCoords);\n}\n\nfunction smoothEndFrame () {\n updateInertiaCoords(this);\n\n const status = this.inertiaStatus;\n const t = new Date().getTime() - status.t0;\n const duration = this.target.options[this.prepared.name].inertia.smoothEndDuration;\n\n if (t < duration) {\n status.sx = utils.easeOutQuad(t, 0, status.xe, duration);\n status.sy = utils.easeOutQuad(t, 0, status.ye, duration);\n\n this.pointerMove(status.startEvent, status.startEvent);\n\n status.i = animationFrame.request(this.boundSmoothEndFrame);\n }\n else {\n status.sx = status.xe;\n status.sy = status.ye;\n\n this.pointerMove(status.startEvent, status.startEvent);\n this.end(status.startEvent);\n\n status.smoothEnd =\n status.active = false;\n this.simulation = null;\n }\n}\n\nfunction updateInertiaCoords (interaction) {\n const status = interaction.inertiaStatus;\n\n // return if inertia isn't running\n if (!status.active) { return; }\n\n const pageUp = status.upCoords.page;\n const clientUp = status.upCoords.client;\n\n utils.setCoords(interaction.curCoords, [ {\n pageX : pageUp.x + status.sx,\n pageY : pageUp.y + status.sy,\n clientX: clientUp.x + status.sx,\n clientY: clientUp.y + status.sy,\n } ]);\n}\n","const browser = require('./utils/browser');\nconst events = require('./utils/events');\nconst utils = require('./utils');\nconst scope = require('./scope');\nconst Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\n\nconst globalEvents = {};\n\n/*\\\n * interact\n [ method ]\n *\n * The methods of this variable can be used to set elements as\n * interactables and also to change various default settings.\n *\n * Calling it as a function and passing an element or a valid CSS selector\n * string returns an Interactable object which has various methods to\n * configure it.\n *\n - element (Element | string) The HTML or SVG Element to interact with or CSS selector\n = (object) An @Interactable\n *\n > Usage\n | interact('#draggable').draggable(true);\n |\n | var rectables = interact('rect');\n | rectables\n | .gesturable(true)\n | .on('gesturemove', function (event) {\n | // ...\n | });\n\\*/\nfunction interact (element, options) {\n let interactable = scope.interactables.get(element, options);\n\n if (!interactable) {\n interactable = new Interactable(element, options);\n interactable.events.global = globalEvents;\n }\n\n return interactable;\n}\n\n/*\\\n * interact.isSet\n [ method ]\n *\n * Check if an element has been set\n - element (Element) The Element being searched for\n = (boolean) Indicates if the element or CSS selector was previously passed to interact\n\\*/\ninteract.isSet = function (element, options) {\n return scope.interactables.indexOfElement(element, options && options.context) !== -1;\n};\n\n/*\\\n * interact.on\n [ method ]\n *\n * Adds a global listener for an InteractEvent or adds a DOM event to\n * `document`\n *\n - type (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) interact\n\\*/\ninteract.on = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.on(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.on(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n // if it is an InteractEvent type, add listener to globalEvents\n if (utils.contains(Interactable.eventTypes, type)) {\n // if this type of event was never bound\n if (!globalEvents[type]) {\n globalEvents[type] = [listener];\n }\n else {\n globalEvents[type].push(listener);\n }\n }\n // If non InteractEvent type, addEventListener to document\n else {\n events.add(scope.document, type, listener, { options });\n }\n\n return interact;\n};\n\n/*\\\n * interact.off\n [ method ]\n *\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n - type (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) interact\n \\*/\ninteract.off = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.off(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.off(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n if (!utils.contains(Interactable.eventTypes, type)) {\n events.remove(scope.document, type, listener, options);\n }\n else {\n let index;\n\n if (type in globalEvents\n && (index = utils.indexOf(globalEvents[type], listener)) !== -1) {\n globalEvents[type].splice(index, 1);\n }\n }\n\n return interact;\n};\n\n/*\\\n * interact.debug\n [ method ]\n *\n * Returns an object which exposes internal data\n = (object) An object with properties that outline the current state and expose internal functions and variables\n\\*/\ninteract.debug = function () {\n return scope;\n};\n\n// expose the functions used to calculate multi-touch properties\ninteract.getPointerAverage = utils.pointerAverage;\ninteract.getTouchBBox = utils.touchBBox;\ninteract.getTouchDistance = utils.touchDistance;\ninteract.getTouchAngle = utils.touchAngle;\n\ninteract.getElementRect = utils.getElementRect;\ninteract.getElementClientRect = utils.getElementClientRect;\ninteract.matchesSelector = utils.matchesSelector;\ninteract.closest = utils.closest;\n\n/*\\\n * interact.supportsTouch\n [ method ]\n *\n = (boolean) Whether or not the browser supports touch input\n\\*/\ninteract.supportsTouch = function () {\n return browser.supportsTouch;\n};\n\n/*\\\n * interact.supportsPointerEvent\n [ method ]\n *\n = (boolean) Whether or not the browser supports PointerEvents\n\\*/\ninteract.supportsPointerEvent = function () {\n return browser.supportsPointerEvent;\n};\n\n/*\\\n * interact.stop\n [ method ]\n *\n * Cancels all interactions (end events are not fired)\n *\n - event (Event) An event on which to call preventDefault()\n = (object) interact\n\\*/\ninteract.stop = function (event) {\n for (let i = scope.interactions.length - 1; i >= 0; i--) {\n scope.interactions[i].stop(event);\n }\n\n return interact;\n};\n\n/*\\\n * interact.pointerMoveTolerance\n [ method ]\n * Returns or sets the distance the pointer must be moved before an action\n * sequence occurs. This also affects tolerance for tap events.\n *\n - newValue (number) #optional The movement from the start position must be greater than this value\n = (number | Interactable) The current setting or interact\n\\*/\ninteract.pointerMoveTolerance = function (newValue) {\n if (utils.is.number(newValue)) {\n Interaction.pointerMoveTolerance = newValue;\n\n return this;\n }\n\n return Interaction.pointerMoveTolerance;\n};\n\ninteract.addDocument = scope.addDocument;\ninteract.removeDocument = scope.removeDocument;\n\nscope.interact = interact;\n\nmodule.exports = interact;\n","const Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\nconst scope = require('./scope');\nconst is = require('./utils/is');\nconst events = require('./utils/events');\n\nconst { nodeContains, matchesSelector } = require('./utils/domUtils');\n\n/*\\\n * Interactable.preventDefault\n [ method ]\n *\n * Returns or sets whether to prevent the browser's default behaviour\n * in response to pointer events. Can be set to:\n * - `'always'` to always prevent\n * - `'never'` to never prevent\n * - `'auto'` to let interact.js try to determine what would be best\n *\n - newValue (string) #optional `true`, `false` or `'auto'`\n = (string | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.preventDefault = function (newValue) {\n if (/^(always|never|auto)$/.test(newValue)) {\n this.options.preventDefault = newValue;\n return this;\n }\n\n if (is.bool(newValue)) {\n this.options.preventDefault = newValue? 'always' : 'never';\n return this;\n }\n\n return this.options.preventDefault;\n};\n\nInteractable.prototype.checkAndPreventDefault = function (event) {\n const setting = this.options.preventDefault;\n\n if (setting === 'never') { return; }\n\n if (setting === 'always') {\n event.preventDefault();\n return;\n }\n\n // setting === 'auto'\n\n // don't preventDefault if the browser supports passiveEvents\n // CSS touch-action and user-selecct should be used instead\n if (events.supportsOptions) {\n return;\n }\n\n // don't preventDefault of pointerdown events\n if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) {\n return;\n }\n\n // don't preventDefault on editable elements\n if (is.element(event.target)\n && matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) {\n return;\n }\n\n event.preventDefault();\n};\n\nfunction onInteractionEvent ({ interaction, event }) {\n if (interaction.target) {\n interaction.target.checkAndPreventDefault(event);\n }\n}\n\nfor (const eventSignal of ['down', 'move', 'up', 'cancel']) {\n Interaction.signals.on(eventSignal, onInteractionEvent);\n}\n\n// prevent native HTML5 drag on interact.js target elements\nInteraction.docEvents.dragstart = function preventNativeDrag (event) {\n for (const interaction of scope.interactions) {\n\n if (interaction.element\n && (interaction.element === event.target\n || nodeContains(interaction.element, event.target))) {\n\n interaction.target.checkAndPreventDefault(event);\n return;\n }\n }\n};\n","const scope = require('./scope');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst iFinder = require('./utils/interactionFinder');\nconst pointerEvents = require('./pointerEvents/base');\n\nconst { window } = require('./utils/window');\n\nconst toString = Object.prototype.toString;\n\nif (!window.Array.isArray) {\n window.Array.isArray = function (obj) {\n return toString.call(obj) === '[object Array]';\n };\n}\n\nif (!String.prototype.trim) {\n String.prototype.trim = function () {\n return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n };\n}\n\n// http://www.quirksmode.org/dom/events/click.html\n// >Events leading to dblclick\n//\n// IE8 doesn't fire down event before dblclick.\n// This workaround tries to fire a tap and doubletap after dblclick\nfunction onIE8Dblclick (event) {\n const eventTarget = event.target;\n const interaction = iFinder.search(event, event.type, eventTarget);\n\n if (!interaction) { return; }\n\n if (interaction.prevTap\n && event.clientX === interaction.prevTap.clientX\n && event.clientY === interaction.prevTap.clientY\n && eventTarget === interaction.prevTap.target) {\n\n interaction.downTargets[0] = eventTarget;\n interaction.downTimes [0] = new Date().getTime();\n\n pointerEvents.fire({\n interaction,\n event,\n eventTarget,\n pointer: event,\n type: 'tap',\n });\n }\n}\n\nif (browser.isIE8) {\n const selectFix = function (event) {\n for (const interaction of scope.interactions) {\n if (interaction.interacting()) {\n interaction.target.checkAndPreventDefault(event);\n }\n }\n };\n\n const onDocIE8 = function onDocIE8 ({ doc, win }, signalName) {\n const eventMethod = signalName.indexOf('listen') === 0\n ? events.add : events.remove;\n\n // For IE's lack of Event#preventDefault\n eventMethod(doc, 'selectstart', selectFix);\n\n if (pointerEvents) {\n eventMethod(doc, 'dblclick', onIE8Dblclick);\n }\n };\n\n scope.signals.on('add-document' , onDocIE8);\n scope.signals.on('remove-document', onDocIE8);\n}\n\nmodule.exports = null;\n","const InteractEvent = require('../InteractEvent');\nconst Interaction = require('../Interaction');\nconst extend = require('../utils/extend');\n\nconst modifiers = {\n names: [],\n\n setOffsets: function (arg) {\n const { interaction, pageCoords: page } = arg;\n const { target, element, startOffset } = interaction;\n const rect = target.getRect(element);\n\n if (rect) {\n startOffset.left = page.x - rect.left;\n startOffset.top = page.y - rect.top;\n\n startOffset.right = rect.right - page.x;\n startOffset.bottom = rect.bottom - page.y;\n\n if (!('width' in rect)) { rect.width = rect.right - rect.left; }\n if (!('height' in rect)) { rect.height = rect.bottom - rect.top ; }\n }\n else {\n startOffset.left = startOffset.top = startOffset.right = startOffset.bottom = 0;\n }\n\n arg.rect = rect;\n arg.interactable = target;\n arg.element = element;\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n\n arg.options = target.options[interaction.prepared.name][modifierName];\n\n if (!arg.options) {\n continue;\n }\n\n interaction.modifierOffsets[modifierName] = modifiers[modifierName].setOffset(arg);\n }\n },\n\n setAll: function (arg) {\n const { interaction, statuses, preEnd, requireEndOnly } = arg;\n const coords = extend({}, arg.pageCoords);\n const result = {\n dx: 0,\n dy: 0,\n changed: false,\n locked: false,\n shouldMove: true,\n };\n\n for (const modifierName of modifiers.names) {\n const modifier = modifiers[modifierName];\n const options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!shouldDo(options, preEnd, requireEndOnly)) { continue; }\n\n arg.status = arg.status = statuses[modifierName];\n arg.options = options;\n arg.offset = arg.interaction.modifierOffsets[modifierName];\n\n modifier.set(arg);\n\n if (arg.status.locked) {\n coords.x += arg.status.dx;\n coords.y += arg.status.dy;\n\n result.dx += arg.status.dx;\n result.dy += arg.status.dy;\n\n result.locked = true;\n }\n }\n\n // a move should be fired if:\n // - there are no modifiers enabled,\n // - no modifiers are \"locked\" i.e. have changed the pointer's coordinates, or\n // - the locked coords have changed since the last pointer move\n result.shouldMove = !arg.status || !result.locked || arg.status.changed;\n\n return result;\n },\n\n resetStatuses: function (statuses) {\n for (const modifierName of modifiers.names) {\n const status = statuses[modifierName] || {};\n\n status.dx = status.dy = 0;\n status.modifiedX = status.modifiedY = NaN;\n status.locked = false;\n status.changed = true;\n\n statuses[modifierName] = status;\n }\n\n return statuses;\n },\n\n start: function ({ interaction }, signalName) {\n const arg = {\n interaction,\n pageCoords: (signalName === 'action-resume' ?\n interaction.curCoords : interaction.startCoords).page,\n startOffset: interaction.startOffset,\n statuses: interaction.modifierStatuses,\n preEnd: false,\n requireEndOnly: false,\n };\n\n modifiers.setOffsets(arg);\n modifiers.resetStatuses(arg.statuses);\n\n arg.pageCoords = extend({}, interaction.startCoords.page);\n interaction.modifierResult = modifiers.setAll(arg);\n },\n};\n\nInteraction.signals.on('new', function (interaction) {\n interaction.startOffset = { left: 0, right: 0, top: 0, bottom: 0 };\n interaction.modifierOffsets = {};\n interaction.modifierStatuses = modifiers.resetStatuses({});\n interaction.modifierResult = null;\n});\n\nInteraction.signals.on('action-start' , modifiers.start);\nInteraction.signals.on('action-resume', modifiers.start);\n\nInteraction.signals.on('before-action-move', function ({ interaction, preEnd, interactingBeforeMove }) {\n const modifierResult = modifiers.setAll({\n interaction,\n preEnd,\n pageCoords: interaction.curCoords.page,\n statuses: interaction.modifierStatuses,\n requireEndOnly: false,\n });\n\n // don't fire an action move if a modifier would keep the event in the same\n // cordinates as before\n if (!modifierResult.shouldMove && interactingBeforeMove) {\n interaction._dontFireMove = true;\n }\n\n interaction.modifierResult = modifierResult;\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n for (let i = 0; i < modifiers.names.length; i++) {\n const options = interaction.target.options[interaction.prepared.name][modifiers.names[i]];\n\n // if the endOnly option is true for any modifier\n if (shouldDo(options, true, true)) {\n // fire a move event at the modified coordinates\n interaction.doMove({ event, preEnd: true });\n break;\n }\n }\n});\n\nInteractEvent.signals.on('set-xy', function (arg) {\n const { iEvent, interaction } = arg;\n const modifierArg = extend({}, arg);\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n modifierArg.options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!modifierArg.options) {\n continue;\n }\n\n const modifier = modifiers[modifierName];\n\n modifierArg.status = interaction.modifierStatuses[modifierName];\n\n iEvent[modifierName] = modifier.modifyCoords(modifierArg);\n }\n});\n\nfunction shouldDo (options, preEnd, requireEndOnly) {\n return (options && options.enabled\n && (preEnd || !options.endOnly)\n && (!requireEndOnly || options.endOnly));\n}\n\nmodule.exports = modifiers;\n","const modifiers = require('./index');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst restrict = {\n defaults: {\n enabled : false,\n endOnly : false,\n restriction: null,\n elementRect: null,\n },\n\n setOffset: function ({ rect, startOffset, options }) {\n const elementRect = options && options.elementRect;\n const offset = {};\n\n if (rect && elementRect) {\n offset.left = startOffset.left - (rect.width * elementRect.left);\n offset.top = startOffset.top - (rect.height * elementRect.top);\n\n offset.right = startOffset.right - (rect.width * (1 - elementRect.right));\n offset.bottom = startOffset.bottom - (rect.height * (1 - elementRect.bottom));\n }\n else {\n offset.left = offset.top = offset.right = offset.bottom = 0;\n }\n\n return offset;\n },\n\n set: function ({ pageCoords, interaction, status, options }) {\n if (!options) { return status; }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n\n const restriction = getRestrictionRect(options.restriction, interaction, page);\n\n if (!restriction) { return status; }\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n const rect = restriction;\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n const offset = interaction.modifierOffsets.restrict;\n\n // object is assumed to have\n // x, y, width, height or\n // left, top, right, bottom\n if ('x' in restriction && 'y' in restriction) {\n modifiedX = Math.max(Math.min(rect.x + rect.width - offset.right , page.x), rect.x + offset.left);\n modifiedY = Math.max(Math.min(rect.y + rect.height - offset.bottom, page.y), rect.y + offset.top );\n }\n else {\n modifiedX = Math.max(Math.min(rect.right - offset.right , page.x), rect.left + offset.left);\n modifiedY = Math.max(Math.min(rect.bottom - offset.bottom, page.y), rect.top + offset.top );\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const elementRect = options && options.elementRect;\n\n if (options && options.enabled\n && !(phase === 'start' && elementRect && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n getRestrictionRect,\n};\n\nfunction getRestrictionRect (value, interaction, page) {\n if (utils.is.function(value)) {\n return utils.resolveRectLike(value, interaction.target, interaction.element, [page.x, page.y, interaction]);\n } else {\n return utils.resolveRectLike(value, interaction.target, interaction.element);\n }\n}\n\nmodifiers.restrict = restrict;\nmodifiers.names.push('restrict');\n\ndefaultOptions.perAction.restrict = restrict.defaults;\n\nmodule.exports = restrict;\n","// This module adds the options.resize.restrictEdges setting which sets min and\n// max for the top, left, bottom and right edges of the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictEdges: {\n// inner: { top: 200, left: 200, right: 400, bottom: 400 },\n// outer: { top: 0, left: 0, right: 600, bottom: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst { getRestrictionRect } = require('./restrict');\n\nconst noInner = { top: +Infinity, left: +Infinity, bottom: -Infinity, right: -Infinity };\nconst noOuter = { top: -Infinity, left: -Infinity, bottom: +Infinity, right: +Infinity };\n\nconst restrictEdges = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n offset: null,\n },\n\n setOffset: function ({ interaction, startOffset, options }) {\n if (!options) {\n return utils.extend({}, startOffset);\n }\n\n const offset = getRestrictionRect(options.offset, interaction, interaction.startCoords.page);\n\n if (offset) {\n return {\n top: startOffset.top + offset.y,\n left: startOffset.left + offset.x,\n bottom: startOffset.bottom + offset.y,\n right: startOffset.right + offset.x,\n };\n }\n\n return startOffset;\n },\n\n set: function ({ pageCoords, interaction, status, offset, options }) {\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n const inner = rectUtils.xywhToTlbr(getRestrictionRect(options.inner, interaction, page)) || noInner;\n const outer = rectUtils.xywhToTlbr(getRestrictionRect(options.outer, interaction, page)) || noOuter;\n\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n if (edges.top) {\n modifiedY = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top);\n }\n else if (edges.bottom) {\n modifiedY = Math.max(Math.min(outer.bottom - offset.bottom, page.y), inner.bottom - offset.bottom);\n }\n if (edges.left) {\n modifiedX = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left);\n }\n else if (edges.right) {\n modifiedX = Math.max(Math.min(outer.right - offset.right, page.x), inner.right - offset.right);\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n if (options && options.enabled\n && !(phase === 'start' && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n noInner,\n noOuter,\n getRestrictionRect,\n};\n\nmodifiers.restrictEdges = restrictEdges;\nmodifiers.names.push('restrictEdges');\n\ndefaultOptions.perAction.restrictEdges = restrictEdges.defaults;\nresize.defaults.restrictEdges = restrictEdges.defaults;\n\nmodule.exports = restrictEdges;\n","// This module adds the options.resize.restrictSize setting which sets min and\n// max width and height for the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictSize: {\n// min: { width: -600, height: -600 },\n// max: { width: 600, height: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst restrictEdges = require('./restrictEdges');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst noMin = { width: -Infinity, height: -Infinity };\nconst noMax = { width: +Infinity, height: +Infinity };\n\nconst restrictSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n },\n\n setOffset: function ({ interaction }) {\n return interaction.startOffset;\n },\n\n set: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const rect = rectUtils.xywhToTlbr(interaction.resizeRects.inverted);\n\n const minSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.min, interaction)) || noMin;\n const maxSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.max, interaction)) || noMax;\n\n arg.options = {\n enabled: options.enabled,\n endOnly: options.endOnly,\n inner: utils.extend({}, restrictEdges.noInner),\n outer: utils.extend({}, restrictEdges.noOuter),\n };\n\n if (edges.top) {\n arg.options.inner.top = rect.bottom - minSize.height;\n arg.options.outer.top = rect.bottom - maxSize.height;\n }\n else if (edges.bottom) {\n arg.options.inner.bottom = rect.top + minSize.height;\n arg.options.outer.bottom = rect.top + maxSize.height;\n }\n if (edges.left) {\n arg.options.inner.left = rect.right - minSize.width;\n arg.options.outer.left = rect.right - maxSize.width;\n }\n else if (edges.right) {\n arg.options.inner.right = rect.left + minSize.width;\n arg.options.outer.right = rect.left + maxSize.width;\n }\n\n restrictEdges.set(arg);\n },\n\n modifyCoords: restrictEdges.modifyCoords,\n};\n\nmodifiers.restrictSize = restrictSize;\nmodifiers.names.push('restrictSize');\n\ndefaultOptions.perAction.restrictSize = restrictSize.defaults;\nresize.defaults.restrictSize = restrictSize.defaults;\n\nmodule.exports = restrictSize;\n","const modifiers = require('./index');\nconst interact = require('../interact');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst snap = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n\n relativePoints: null,\n },\n\n setOffset: function ({ interaction, interactable, element, rect, startOffset, options }) {\n const offsets = [];\n const optionsOrigin = utils.rectToXY(utils.resolveRectLike(options.origin));\n const origin = optionsOrigin || utils.getOriginXY(interactable, element, interaction.prepared.name);\n options = options || interactable.options[interaction.prepared.name].snap || {};\n\n let snapOffset;\n\n if (options.offset === 'startCoords') {\n snapOffset = {\n x: interaction.startCoords.page.x - origin.x,\n y: interaction.startCoords.page.y - origin.y,\n };\n }\n else {\n const offsetRect = utils.resolveRectLike(options.offset, interactable, element, [interaction]);\n\n snapOffset = utils.rectToXY(offsetRect) || { x: 0, y: 0 };\n }\n\n if (rect && options.relativePoints && options.relativePoints.length) {\n for (const { x: relativeX, y: relativeY } of options.relativePoints) {\n offsets.push({\n x: startOffset.left - (rect.width * relativeX) + snapOffset.x,\n y: startOffset.top - (rect.height * relativeY) + snapOffset.y,\n });\n }\n }\n else {\n offsets.push(snapOffset);\n }\n\n return offsets;\n },\n\n set: function ({ interaction, pageCoords, status, options, offset: offsets }) {\n const targets = [];\n let target;\n let page;\n let i;\n\n if (status.useStatusXY) {\n page = { x: status.x, y: status.y };\n }\n else {\n const origin = utils.getOriginXY(interaction.target, interaction.element, interaction.prepared.name);\n\n page = utils.extend({}, pageCoords);\n\n page.x -= origin.x;\n page.y -= origin.y;\n }\n\n status.realX = page.x;\n status.realY = page.y;\n\n let len = options.targets? options.targets.length : 0;\n\n for (const { x: offsetX, y: offsetY } of offsets) {\n const relativeX = page.x - offsetX;\n const relativeY = page.y - offsetY;\n\n for (const snapTarget of options.targets) {\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n targets.push({\n x: utils.is.number(target.x) ? (target.x + offsetX) : relativeX,\n y: utils.is.number(target.y) ? (target.y + offsetY) : relativeY,\n\n range: utils.is.number(target.range)? target.range: options.range,\n });\n }\n }\n\n const closest = {\n target: null,\n inRange: false,\n distance: 0,\n range: 0,\n dx: 0,\n dy: 0,\n };\n\n for (i = 0, len = targets.length; i < len; i++) {\n target = targets[i];\n\n const range = target.range;\n const dx = target.x - page.x;\n const dy = target.y - page.y;\n const distance = utils.hypot(dx, dy);\n let inRange = distance <= range;\n\n // Infinite targets count as being out of range\n // compared to non infinite ones that are in range\n if (range === Infinity && closest.inRange && closest.range !== Infinity) {\n inRange = false;\n }\n\n if (!closest.target || (inRange\n // is the closest target in range?\n ? (closest.inRange && range !== Infinity\n // the pointer is relatively deeper in this target\n ? distance / range < closest.distance / closest.range\n // this target has Infinite range and the closest doesn't\n : (range === Infinity && closest.range !== Infinity)\n // OR this target is closer that the previous closest\n || distance < closest.distance)\n // The other is not in range and the pointer is closer to this target\n : (!closest.inRange && distance < closest.distance))) {\n\n closest.target = target;\n closest.distance = distance;\n closest.range = range;\n closest.inRange = inRange;\n closest.dx = dx;\n closest.dy = dy;\n\n status.range = range;\n }\n }\n\n let snapChanged;\n\n if (closest.target) {\n snapChanged = (status.modifiedX !== closest.target.x || status.modifiedY !== closest.target.y);\n\n status.modifiedX = closest.target.x;\n status.modifiedY = closest.target.y;\n }\n else {\n snapChanged = true;\n\n status.modifiedX = NaN;\n status.modifiedY = NaN;\n }\n\n status.dx = closest.dx;\n status.dy = closest.dy;\n\n status.changed = (snapChanged || (closest.inRange && !status.locked));\n status.locked = closest.inRange;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const relativePoints = options && options.relativePoints;\n\n if (options && options.enabled\n && !(phase === 'start' && relativePoints && relativePoints.length)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n }\n\n return {\n range : status.range,\n locked : status.locked,\n x : status.modifiedX,\n y : status.modifiedY,\n realX : status.realX,\n realY : status.realY,\n dx : status.dx,\n dy : status.dy,\n };\n }\n },\n};\n\ninteract.createSnapGrid = function (grid) {\n return function (x, y) {\n const limits = grid.limits || {\n left : -Infinity,\n right : Infinity,\n top : -Infinity,\n bottom: Infinity,\n };\n let offsetX = 0;\n let offsetY = 0;\n\n if (utils.is.object(grid.offset)) {\n offsetX = grid.offset.x;\n offsetY = grid.offset.y;\n }\n\n const gridx = Math.round((x - offsetX) / grid.x);\n const gridy = Math.round((y - offsetY) / grid.y);\n\n const newX = Math.max(limits.left, Math.min(limits.right , gridx * grid.x + offsetX));\n const newY = Math.max(limits.top , Math.min(limits.bottom, gridy * grid.y + offsetY));\n\n return {\n x: newX,\n y: newY,\n range: grid.range,\n };\n };\n};\n\nmodifiers.snap = snap;\nmodifiers.names.push('snap');\n\ndefaultOptions.perAction.snap = snap.defaults;\n\nmodule.exports = snap;\n","// This module allows snapping of the size of targets during resize\n// interactions.\n\nconst modifiers = require('./index');\nconst snap = require('./snap');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\nconst utils = require('../utils/');\n\nconst snapSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n },\n\n setOffset: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.edges;\n\n if (!edges) { return; }\n\n arg.options = {\n relativePoints: [{\n x: edges.left? 0 : 1,\n y: edges.top ? 0 : 1,\n }],\n origin: { x: 0, y: 0 },\n offset: 'self',\n range: options.range,\n };\n\n const offsets = snap.setOffset(arg);\n arg.options = options;\n\n return offsets;\n },\n\n set: function (arg) {\n const { interaction, options, offset, pageCoords } = arg;\n const page = utils.extend({}, pageCoords);\n const relativeX = page.x - offset[0].x;\n const relativeY = page.y - offset[0].y;\n\n arg.options = utils.extend({}, options);\n arg.options.targets = [];\n\n for (const snapTarget of options.targets) {\n let target;\n\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n if ('width' in target && 'height' in target) {\n target.x = target.width;\n target.y = target.height;\n }\n\n arg.options.targets.push(target);\n }\n\n snap.set(arg);\n },\n\n modifyCoords: function (arg) {\n const { options } = arg;\n\n arg.options = utils.extend({}, options);\n arg.options.enabled = options.enabled;\n arg.options.relativePoints = [null];\n\n snap.modifyCoords(arg);\n },\n};\n\nmodifiers.snapSize = snapSize;\nmodifiers.names.push('snapSize');\n\ndefaultOptions.perAction.snapSize = snapSize.defaults;\nresize.defaults.snapSize = snapSize.defaults;\n\nmodule.exports = snapSize;\n","const pointerUtils = require('../utils/pointerUtils');\n\nmodule.exports = class PointerEvent {\n constructor (type, pointer, event, eventTarget, interaction) {\n pointerUtils.pointerExtend(this, event);\n\n if (event !== pointer) {\n pointerUtils.pointerExtend(this, pointer);\n }\n\n this.interaction = interaction;\n\n this.timeStamp = new Date().getTime();\n this.originalEvent = event;\n this.type = type;\n this.pointerId = pointerUtils.getPointerId(pointer);\n this.pointerType = pointerUtils.getPointerType(pointer, interaction);\n this.target = eventTarget;\n this.currentTarget = null;\n\n if (type === 'tap') {\n const pointerIndex = interaction.getPointerIndex(pointer);\n this.dt = this.timeStamp - interaction.downTimes[pointerIndex];\n\n const interval = this.timeStamp - interaction.tapTime;\n\n this.double = !!(interaction.prevTap\n && interaction.prevTap.type !== 'doubletap'\n && interaction.prevTap.target === this.target\n && interval < 500);\n }\n else if (type === 'doubletap') {\n this.dt = pointer.timeStamp - interaction.tapTime;\n }\n }\n\n subtractOrigin ({ x: originX, y: originY }) {\n this.pageX -= originX;\n this.pageY -= originY;\n this.clientX -= originX;\n this.clientY -= originY;\n\n return this;\n }\n\n addOrigin ({ x: originX, y: originY }) {\n this.pageX += originX;\n this.pageY += originY;\n this.clientX += originX;\n this.clientY += originY;\n\n return this;\n }\n\n preventDefault () {\n this.originalEvent.preventDefault();\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n};\n","const PointerEvent = require('./PointerEvent');\nconst Interaction = require('../Interaction');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst defaults = require('../defaultOptions');\nconst signals = require('../utils/Signals').new();\nconst { filter } = require('../utils/arr');\n\nconst simpleSignals = [ 'down', 'up', 'cancel' ];\nconst simpleEvents = [ 'down', 'up', 'cancel' ];\n\nconst pointerEvents = {\n PointerEvent,\n fire,\n collectEventTargets,\n signals,\n defaults: {\n holdDuration: 600,\n ignoreFrom : null,\n allowFrom : null,\n origin : { x: 0, y: 0 },\n },\n types: [\n 'down',\n 'move',\n 'up',\n 'cancel',\n 'tap',\n 'doubletap',\n 'hold',\n ],\n};\n\nfunction fire (arg) {\n const {\n interaction, pointer, event, eventTarget,\n type = arg.pointerEvent.type,\n targets = collectEventTargets(arg),\n pointerEvent = new PointerEvent(type, pointer, event, eventTarget, interaction),\n } = arg;\n\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n targets,\n type,\n pointerEvent,\n };\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n\n for (const prop in target.props || {}) {\n pointerEvent[prop] = target.props[prop];\n }\n\n const origin = utils.getOriginXY(target.eventable, target.element);\n\n pointerEvent.subtractOrigin(origin);\n pointerEvent.eventable = target.eventable;\n pointerEvent.currentTarget = target.element;\n\n target.eventable.fire(pointerEvent);\n\n pointerEvent.addOrigin(origin);\n\n if (pointerEvent.immediatePropagationStopped\n || (pointerEvent.propagationStopped\n && (i + 1) < targets.length && targets[i + 1].element !== pointerEvent.currentTarget)) {\n break;\n }\n }\n\n signals.fire('fired', signalArg);\n\n if (type === 'tap') {\n // if pointerEvent should make a double tap, create and fire a doubletap\n // PointerEvent and use that as the prevTap\n const prevTap = pointerEvent.double\n ? fire({\n interaction, pointer, event, eventTarget,\n type: 'doubletap',\n })\n : pointerEvent;\n\n interaction.prevTap = prevTap;\n interaction.tapTime = prevTap.timeStamp;\n }\n\n return pointerEvent;\n}\n\nfunction collectEventTargets ({ interaction, pointer, event, eventTarget, type }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n // do not fire a tap event if the pointer was moved before being lifted\n if (type === 'tap' && (interaction.pointerWasMoved\n // or if the pointerup target is different to the pointerdown target\n || !(interaction.downTargets[pointerIndex] && interaction.downTargets[pointerIndex] === eventTarget))) {\n return [];\n }\n\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n path,\n targets: [],\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (type === 'hold') {\n signalArg.targets = filter(signalArg.targets, target =>\n target.eventable.options.holdDuration === interaction.holdTimers[pointerIndex].duration);\n }\n\n return signalArg.targets;\n}\n\nInteraction.signals.on('update-pointer-down', function ({ interaction, pointerIndex }) {\n interaction.holdTimers[pointerIndex] = { duration: Infinity, timeout: null };\n});\n\nInteraction.signals.on('remove-pointer', function ({ interaction, pointerIndex }) {\n interaction.holdTimers.splice(pointerIndex, 1);\n});\n\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget, duplicateMove }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n if (!duplicateMove && (!interaction.pointerIsDown || interaction.pointerWasMoved)) {\n if (interaction.pointerIsDown) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n\n fire({\n interaction, pointer, event, eventTarget,\n type: 'move',\n });\n }\n});\n\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget, pointerIndex }) {\n // copy event to be used in timeout for IE8\n const eventCopy = browser.isIE8? utils.extend({}, event) : event;\n\n const timer = interaction.holdTimers[pointerIndex];\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'hold',\n targets: [],\n path,\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (!signalArg.targets.length) { return; }\n\n let minDuration = Infinity;\n\n for (let i = 0; i < signalArg.targets.length; i++) {\n const target = signalArg.targets[i];\n const holdDuration = target.eventable.options.holdDuration;\n\n if (holdDuration < minDuration) {\n minDuration = holdDuration;\n }\n }\n\n timer.duration = minDuration;\n timer.timeout = setTimeout(function () {\n fire({\n interaction, eventCopy, eventTarget,\n pointer: browser.isIE8? eventCopy : pointer,\n type: 'hold',\n });\n }, minDuration);\n});\n\nInteraction.signals.on('up', ({ interaction, pointer, event, eventTarget }) => {\n if (!interaction.pointerWasMoved) {\n fire({ interaction, eventTarget, pointer, event, type: 'tap' });\n }\n});\n\n['up', 'cancel'].forEach(function (signalName) {\n Interaction.signals.on(signalName, function ({ interaction, pointerIndex }) {\n if (interaction.holdTimers[pointerIndex]) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n });\n});\n\nfunction createSignalListener (type) {\n return function ({ interaction, pointer, event, eventTarget }) {\n fire({ interaction, eventTarget, pointer, event, type });\n };\n}\n\nfor (let i = 0; i < simpleSignals.length; i++) {\n Interaction.signals.on(simpleSignals[i], createSignalListener(simpleEvents[i]));\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.prevTap = null; // the most recent tap event on this interaction\n interaction.tapTime = 0; // time of the most recent tap event\n interaction.holdTimers = []; // [{ duration, timeout }]\n});\n\ndefaults.pointerEvents = pointerEvents.defaults;\nmodule.exports = pointerEvents;\n","const pointerEvents = require('./base');\nconst Interaction = require('../Interaction');\n\npointerEvents.signals.on('new', onNew);\npointerEvents.signals.on('fired', onFired);\n\nfor (const signal of ['move', 'up', 'cancel', 'endall']) {\n Interaction.signals.on(signal, endHoldRepeat);\n}\n\nfunction onNew ({ pointerEvent }) {\n if (pointerEvent.type !== 'hold') { return; }\n\n pointerEvent.count = (pointerEvent.count || 0) + 1;\n}\n\nfunction onFired ({ interaction, pointerEvent, eventTarget, targets }) {\n if (pointerEvent.type !== 'hold' || !targets.length) { return; }\n\n // get the repeat interval from the first eventable\n const interval = targets[0].eventable.options.holdRepeatInterval;\n\n // don't repeat if the interval is 0 or less\n if (interval <= 0) { return; }\n\n // set a timeout to fire the holdrepeat event\n interaction.holdIntervalHandle = setTimeout(function () {\n pointerEvents.fire({\n interaction,\n eventTarget,\n type: 'hold',\n pointer: pointerEvent,\n event: pointerEvent,\n });\n }, interval);\n}\n\nfunction endHoldRepeat ({ interaction }) {\n // set the interaction's holdStopTime property\n // to stop further holdRepeat events\n if (interaction.holdIntervalHandle) {\n clearInterval(interaction.holdIntervalHandle);\n interaction.holdIntervalHandle = null;\n }\n}\n\n// don't repeat by default\npointerEvents.defaults.holdRepeatInterval = 0;\npointerEvents.types.push('holdrepeat');\n\nmodule.exports = {\n onNew,\n onFired,\n endHoldRepeat,\n};\n","const pointerEvents = require('./base');\nconst Interactable = require('../Interactable');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\nconst scope = require('../scope');\nconst extend = require('../utils/extend');\nconst { merge } = require('../utils/arr');\n\npointerEvents.signals.on('collect-targets', function ({ targets, element, type, eventTarget }) {\n function collectSelectors (interactable, selector, context) {\n const els = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && is.element(element)\n && domUtils.matchesSelector(element, selector, els)\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n const interactable = scope.interactables.get(element);\n\n if (interactable) {\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n scope.interactables.forEachSelector(collectSelectors, element);\n});\n\nInteractable.signals.on('new', function ({ interactable }) {\n interactable.events.getRect = function (element) {\n return interactable.getRect(element);\n };\n});\n\nInteractable.signals.on('set', function ({ interactable, options }) {\n extend(interactable.events.options, pointerEvents.defaults);\n extend(interactable.events.options, options);\n});\n\nmerge(Interactable.eventTypes, pointerEvents.types);\n\nInteractable.prototype.pointerEvents = function (options) {\n extend(this.events.options, options);\n\n return this;\n};\n\nconst __backCompatOption = Interactable.prototype._backCompatOption;\n\nInteractable.prototype._backCompatOption = function (optionName, newValue) {\n const ret = __backCompatOption.call(this, optionName, newValue);\n\n if (ret === this) {\n this.events.options[optionName] = newValue;\n }\n\n return ret;\n};\n\nInteractable.settingsMethods.push('pointerEvents');\n","const utils = require('./utils');\nconst events = require('./utils/events');\nconst signals = require('./utils/Signals').new();\n\nconst scope = {\n signals,\n events,\n utils,\n\n // main document\n document: require('./utils/domObjects').document,\n // all documents being listened to\n documents: [],\n\n addDocument: function (doc, win) {\n // do nothing if document is already known\n if (utils.contains(scope.documents, doc)) { return false; }\n\n win = win || scope.getWindow(doc);\n\n scope.documents.push(doc);\n events.documents.push(doc);\n\n // don't add an unload event for the main document\n // so that the page may be cached in browser history\n if (doc !== scope.document) {\n events.add(win, 'unload', scope.onWindowUnload);\n }\n\n signals.fire('add-document', { doc, win });\n },\n\n removeDocument: function (doc, win) {\n const index = utils.indexOf(scope.documents, doc);\n\n win = win || scope.getWindow(doc);\n\n events.remove(win, 'unload', scope.onWindowUnload);\n\n scope.documents.splice(index, 1);\n events.documents.splice(index, 1);\n\n signals.fire('remove-document', { win, doc });\n },\n\n onWindowUnload: function () {\n scope.removeDocument(this.document, this);\n },\n};\n\nmodule.exports = scope;\n","const { indexOf } = require('./arr');\n\nclass Signals {\n constructor () {\n this.listeners = {\n // signalName: [listeners],\n };\n }\n\n on (name, listener) {\n if (!this.listeners[name]) {\n this.listeners[name] = [listener];\n return;\n }\n\n this.listeners[name].push(listener);\n }\n\n off (name, listener) {\n if (!this.listeners[name]) { return; }\n\n const index = indexOf(this.listeners[name], listener);\n\n if (index !== -1) {\n this.listeners[name].splice(index, 1);\n }\n }\n\n fire (name, arg) {\n const targetListeners = this.listeners[name];\n\n if (!targetListeners) { return; }\n\n for (let i = 0; i < targetListeners.length; i++) {\n if (targetListeners[i](arg, name) === false) {\n return;\n }\n }\n }\n}\n\nSignals.new = function () {\n return new Signals();\n};\n\nmodule.exports = Signals;\n","function indexOf (array, target) {\n for (let i = 0, len = array.length; i < len; i++) {\n if (array[i] === target) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction contains (array, target) {\n return indexOf(array, target) !== -1;\n}\n\nfunction merge (target, source) {\n for (let i = 0; i < source.length; i++) {\n target.push(source[i]);\n }\n\n return target;\n}\n\nfunction filter (array, test) {\n const result = [];\n\n for (let i = 0; i < array.length; i++) {\n if (test(array[i])) {\n result.push(array[i]);\n }\n }\n\n return result;\n}\n\nmodule.exports = {\n indexOf,\n contains,\n merge,\n filter,\n};\n","const { window } = require('./window');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst Element = domObjects.Element;\nconst navigator = window.navigator;\n\nconst browser = {\n // Does the browser support touch input?\n supportsTouch: !!(('ontouchstart' in window) || is.function(window.DocumentTouch)\n && domObjects.document instanceof window.DocumentTouch),\n\n // Does the browser support PointerEvents\n supportsPointerEvent: !!domObjects.PointerEvent,\n\n isIE8: ('attachEvent' in window) && !('addEventListener' in window),\n\n // Opera Mobile must be handled differently\n isOperaMobile: (navigator.appName === 'Opera'\n && browser.supportsTouch\n && navigator.userAgent.match('Presto')),\n\n // scrolling doesn't change the result of getClientRects on iOS 7\n isIOS7: (/iP(hone|od|ad)/.test(navigator.platform)\n && /OS 7[^\\d]/.test(navigator.appVersion)),\n\n isIe9OrOlder: /MSIE (8|9)/.test(navigator.userAgent),\n\n // prefix matchesSelector\n prefixedMatchesSelector: 'matches' in Element.prototype\n ? 'matches': 'webkitMatchesSelector' in Element.prototype\n ? 'webkitMatchesSelector': 'mozMatchesSelector' in Element.prototype\n ? 'mozMatchesSelector': 'oMatchesSelector' in Element.prototype\n ? 'oMatchesSelector': 'msMatchesSelector',\n\n useMatchesSelectorPolyfill: false,\n\n pEventTypes: (domObjects.PointerEvent\n ? (domObjects.PointerEvent === window.MSPointerEvent\n ? {\n up: 'MSPointerUp',\n down: 'MSPointerDown',\n over: 'mouseover',\n out: 'mouseout',\n move: 'MSPointerMove',\n cancel: 'MSPointerCancel',\n }\n : {\n up: 'pointerup',\n down: 'pointerdown',\n over: 'pointerover',\n out: 'pointerout',\n move: 'pointermove',\n cancel: 'pointercancel',\n })\n : null),\n\n // because Webkit and Opera still use 'mousewheel' event type\n wheelEvent: 'onmousewheel' in domObjects.document? 'mousewheel': 'wheel',\n\n};\n\nbrowser.useMatchesSelectorPolyfill = !is.function(Element.prototype[browser.prefixedMatchesSelector]);\n\nmodule.exports = browser;\n","const domObjects = {};\nconst win = require('./window').window;\n\nfunction blank () {}\n\ndomObjects.document = win.document;\ndomObjects.DocumentFragment = win.DocumentFragment || blank;\ndomObjects.SVGElement = win.SVGElement || blank;\ndomObjects.SVGSVGElement = win.SVGSVGElement || blank;\ndomObjects.SVGElementInstance = win.SVGElementInstance || blank;\ndomObjects.Element = win.Element || blank;\ndomObjects.HTMLElement = win.HTMLElement || domObjects.Element;\n\ndomObjects.Event = win.Event;\ndomObjects.Touch = win.Touch || blank;\ndomObjects.PointerEvent = (win.PointerEvent || win.MSPointerEvent);\n\nmodule.exports = domObjects;\n","const win = require('./window');\nconst browser = require('./browser');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst domUtils = {\n nodeContains: function (parent, child) {\n while (child) {\n if (child === parent) {\n return true;\n }\n\n child = child.parentNode;\n }\n\n return false;\n },\n\n closest: function (element, selector) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) { return element; }\n\n element = domUtils.parentNode(element);\n }\n\n return null;\n },\n\n parentNode: function (node) {\n let parent = node.parentNode;\n\n if (is.docFrag(parent)) {\n // skip past #shado-root fragments\n while ((parent = parent.host) && is.docFrag(parent)) {\n continue;\n }\n\n return parent;\n }\n\n return parent;\n },\n\n // taken from http://tanalin.com/en/blog/2012/12/matches-selector-ie8/ and modified\n matchesSelectorPolyfill: browser.useMatchesSelectorPolyfill\n ? function (element, selector, elems) {\n elems = elems || element.parentNode.querySelectorAll(selector);\n\n for (let i = 0, len = elems.length; i < len; i++) {\n if (elems[i] === element) {\n return true;\n }\n }\n\n return false;\n }\n : null,\n\n matchesSelector: function (element, selector, nodeList) {\n if (browser.useMatchesSelectorPolyfill) {\n return domUtils.matchesSelectorPolyfill(element, selector, nodeList);\n }\n\n // remove /deep/ from selectors if shadowDOM polyfill is used\n if (win.window !== win.realWindow) {\n selector = selector.replace(/\\/deep\\//g, ' ');\n }\n\n return element[browser.prefixedMatchesSelector](selector);\n },\n\n // Test for the element that's \"above\" all other qualifiers\n indexOfDeepestElement: function (elements) {\n let deepestZoneParents = [];\n let dropzoneParents = [];\n let dropzone;\n let deepestZone = elements[0];\n let index = deepestZone? 0: -1;\n let parent;\n let child;\n let i;\n let n;\n\n for (i = 1; i < elements.length; i++) {\n dropzone = elements[i];\n\n // an element might belong to multiple selector dropzones\n if (!dropzone || dropzone === deepestZone) {\n continue;\n }\n\n if (!deepestZone) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n // check if the deepest or current are document.documentElement or document.rootElement\n // - if the current dropzone is, do nothing and continue\n if (dropzone.parentNode === dropzone.ownerDocument) {\n continue;\n }\n // - if deepest is, update with the current dropzone and continue to next\n else if (deepestZone.parentNode === dropzone.ownerDocument) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n if (!deepestZoneParents.length) {\n parent = deepestZone;\n while (parent.parentNode && parent.parentNode !== parent.ownerDocument) {\n deepestZoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n }\n\n // if this element is an svg element and the current deepest is\n // an HTMLElement\n if (deepestZone instanceof domObjects.HTMLElement\n && dropzone instanceof domObjects.SVGElement\n && !(dropzone instanceof domObjects.SVGSVGElement)) {\n\n if (dropzone === deepestZone.parentNode) {\n continue;\n }\n\n parent = dropzone.ownerSVGElement;\n }\n else {\n parent = dropzone;\n }\n\n dropzoneParents = [];\n\n while (parent.parentNode !== parent.ownerDocument) {\n dropzoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n\n n = 0;\n\n // get (position of last common ancestor) + 1\n while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) {\n n++;\n }\n\n const parents = [\n dropzoneParents[n - 1],\n dropzoneParents[n],\n deepestZoneParents[n],\n ];\n\n child = parents[0].lastChild;\n\n while (child) {\n if (child === parents[1]) {\n deepestZone = dropzone;\n index = i;\n deepestZoneParents = [];\n\n break;\n }\n else if (child === parents[2]) {\n break;\n }\n\n child = child.previousSibling;\n }\n }\n\n return index;\n },\n\n matchesUpTo: function (element, selector, limit) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) {\n return true;\n }\n\n element = domUtils.parentNode(element);\n\n if (element === limit) {\n return domUtils.matchesSelector(element, selector);\n }\n }\n\n return false;\n },\n\n getActualElement: function (element) {\n return (element instanceof domObjects.SVGElementInstance\n ? element.correspondingUseElement\n : element);\n },\n\n getScrollXY: function (relevantWindow) {\n relevantWindow = relevantWindow || win.window;\n return {\n x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft,\n y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop,\n };\n },\n\n getElementClientRect: function (element) {\n const clientRect = (element instanceof domObjects.SVGElement\n ? element.getBoundingClientRect()\n : element.getClientRects()[0]);\n\n return clientRect && {\n left : clientRect.left,\n right : clientRect.right,\n top : clientRect.top,\n bottom: clientRect.bottom,\n width : clientRect.width || clientRect.right - clientRect.left,\n height: clientRect.height || clientRect.bottom - clientRect.top,\n };\n },\n\n getElementRect: function (element) {\n const clientRect = domUtils.getElementClientRect(element);\n\n if (!browser.isIOS7 && clientRect) {\n const scroll = domUtils.getScrollXY(win.getWindow(element));\n\n clientRect.left += scroll.x;\n clientRect.right += scroll.x;\n clientRect.top += scroll.y;\n clientRect.bottom += scroll.y;\n }\n\n return clientRect;\n },\n\n getPath: function (element) {\n const path = [];\n\n while (element) {\n path.push(element);\n element = domUtils.parentNode(element);\n }\n\n return path;\n },\n\n trySelector: value => {\n if (!is.string(value)) { return false; }\n\n // an exception will be raised if it is invalid\n domObjects.document.querySelector(value);\n return true;\n },\n};\n\nmodule.exports = domUtils;\n","const is = require('./is');\nconst domUtils = require('./domUtils');\nconst pExtend = require('./pointerExtend');\n\nconst { window, getWindow } = require('./window');\nconst { indexOf, contains } = require('./arr');\n\nconst useAttachEvent = ('attachEvent' in window) && !('addEventListener' in window);\nconst addEvent = useAttachEvent? 'attachEvent': 'addEventListener';\nconst removeEvent = useAttachEvent? 'detachEvent': 'removeEventListener';\nconst on = useAttachEvent? 'on': '';\n\nconst elements = [];\nconst targets = [];\nconst attachedListeners = [];\n\n// {\n// type: {\n// selectors: ['selector', ...],\n// contexts : [document, ...],\n// listeners: [[listener, capture, passive], ...]\n// }\n// }\nconst delegatedEvents = {};\n\nconst documents = [];\n\nconst supportsOptions = !useAttachEvent && (() => {\n let supported = false;\n\n window.document.createElement('div').addEventListener('test', null, {\n get capture () { supported = true; },\n });\n\n return supported;\n})();\n\nfunction add (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n let elementIndex = indexOf(elements, element);\n let target = targets[elementIndex];\n\n if (!target) {\n target = {\n events: {},\n typeCount: 0,\n };\n\n elementIndex = elements.push(element) - 1;\n targets.push(target);\n\n attachedListeners.push(useAttachEvent\n ? {\n supplied: [],\n wrapped : [],\n useCount: [],\n }\n : null);\n }\n\n if (!target.events[type]) {\n target.events[type] = [];\n target.typeCount++;\n }\n\n if (!contains(target.events[type], listener)) {\n let ret;\n\n if (useAttachEvent) {\n const { supplied, wrapped, useCount } = attachedListeners[elementIndex];\n const listenerIndex = indexOf(supplied, listener);\n\n const wrappedListener = wrapped[listenerIndex] || function (event) {\n if (!event.immediatePropagationStopped) {\n event.target = event.srcElement;\n event.currentTarget = element;\n\n event.preventDefault = event.preventDefault || preventDef;\n event.stopPropagation = event.stopPropagation || stopProp;\n event.stopImmediatePropagation = event.stopImmediatePropagation || stopImmProp;\n\n if (/mouse|click/.test(event.type)) {\n event.pageX = event.clientX + getWindow(element).document.documentElement.scrollLeft;\n event.pageY = event.clientY + getWindow(element).document.documentElement.scrollTop;\n }\n\n listener(event);\n }\n };\n\n ret = element[addEvent](on + type, wrappedListener, !!options.capture);\n\n if (listenerIndex === -1) {\n supplied.push(listener);\n wrapped.push(wrappedListener);\n useCount.push(1);\n }\n else {\n useCount[listenerIndex]++;\n }\n }\n else {\n ret = element[addEvent](type, listener, supportsOptions? options : !!options.capture);\n }\n target.events[type].push(listener);\n\n return ret;\n }\n}\n\nfunction remove (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const elementIndex = indexOf(elements, element);\n const target = targets[elementIndex];\n\n if (!target || !target.events) {\n return;\n }\n\n let wrappedListener = listener;\n let listeners;\n let listenerIndex;\n\n if (useAttachEvent) {\n listeners = attachedListeners[elementIndex];\n listenerIndex = indexOf(listeners.supplied, listener);\n wrappedListener = listeners.wrapped[listenerIndex];\n }\n\n if (type === 'all') {\n for (type in target.events) {\n if (target.events.hasOwnProperty(type)) {\n remove(element, type, 'all');\n }\n }\n return;\n }\n\n if (target.events[type]) {\n const len = target.events[type].length;\n\n if (listener === 'all') {\n for (let i = 0; i < len; i++) {\n remove(element, type, target.events[type][i], options);\n }\n return;\n }\n else {\n for (let i = 0; i < len; i++) {\n if (target.events[type][i] === listener) {\n element[removeEvent](on + type, wrappedListener, supportsOptions? options : !!options.capture);\n target.events[type].splice(i, 1);\n\n if (useAttachEvent && listeners) {\n listeners.useCount[listenerIndex]--;\n if (listeners.useCount[listenerIndex] === 0) {\n listeners.supplied.splice(listenerIndex, 1);\n listeners.wrapped.splice(listenerIndex, 1);\n listeners.useCount.splice(listenerIndex, 1);\n }\n }\n\n break;\n }\n }\n }\n\n if (target.events[type] && target.events[type].length === 0) {\n target.events[type] = null;\n target.typeCount--;\n }\n }\n\n if (!target.typeCount) {\n targets.splice(elementIndex, 1);\n elements.splice(elementIndex, 1);\n attachedListeners.splice(elementIndex, 1);\n }\n}\n\nfunction addDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n if (!delegatedEvents[type]) {\n delegatedEvents[type] = {\n selectors: [],\n contexts : [],\n listeners: [],\n };\n\n // add delegate listener functions\n for (let i = 0; i < documents.length; i++) {\n add(documents[i], type, delegateListener);\n add(documents[i], type, delegateUseCapture, true);\n }\n }\n\n const delegated = delegatedEvents[type];\n let index;\n\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n break;\n }\n }\n\n if (index === -1) {\n index = delegated.selectors.length;\n\n delegated.selectors.push(selector);\n delegated.contexts .push(context);\n delegated.listeners.push([]);\n }\n\n // keep listener and capture and passive flags\n delegated.listeners[index].push([listener, !!options.capture, options.passive]);\n}\n\nfunction removeDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const delegated = delegatedEvents[type];\n let matchFound = false;\n let index;\n\n if (!delegated) { return; }\n\n // count from last index of delegated to 0\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n // look for matching selector and context Node\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n\n const listeners = delegated.listeners[index];\n\n // each item of the listeners array is an array: [function, capture, passive]\n for (let i = listeners.length - 1; i >= 0; i--) {\n const [fn, capture, passive] = listeners[i];\n\n // check if the listener functions and capture and passive flags match\n if (fn === listener && capture === !!options.capture && passive === options.passive) {\n // remove the listener from the array of listeners\n listeners.splice(i, 1);\n\n // if all listeners for this interactable have been removed\n // remove the interactable from the delegated arrays\n if (!listeners.length) {\n delegated.selectors.splice(index, 1);\n delegated.contexts .splice(index, 1);\n delegated.listeners.splice(index, 1);\n\n // remove delegate function from context\n remove(context, type, delegateListener);\n remove(context, type, delegateUseCapture, true);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegatedEvents[type] = null;\n }\n }\n\n // only remove one listener\n matchFound = true;\n break;\n }\n }\n\n if (matchFound) { break; }\n }\n }\n}\n\n// bound to the interactable context when a DOM event\n// listener is added to a selector interactable\nfunction delegateListener (event, optionalArg) {\n const options = getOptions(optionalArg);\n const fakeEvent = {};\n const delegated = delegatedEvents[event.type];\n const eventTarget = (domUtils.getActualElement(event.path\n ? event.path[0]\n : event.target));\n let element = eventTarget;\n\n // duplicate the event so that currentTarget can be changed\n pExtend(fakeEvent, event);\n\n fakeEvent.originalEvent = event;\n fakeEvent.preventDefault = preventOriginalDefault;\n\n // climb up document tree looking for selector matches\n while (is.element(element)) {\n for (let i = 0; i < delegated.selectors.length; i++) {\n const selector = delegated.selectors[i];\n const context = delegated.contexts[i];\n\n if (domUtils.matchesSelector(element, selector)\n && domUtils.nodeContains(context, eventTarget)\n && domUtils.nodeContains(context, element)) {\n\n const listeners = delegated.listeners[i];\n\n fakeEvent.currentTarget = element;\n\n for (let j = 0; j < listeners.length; j++) {\n const [fn, capture, passive] = listeners[j];\n\n if (capture === !!options.capture && passive === options.passive) {\n fn(fakeEvent);\n }\n }\n }\n }\n\n element = domUtils.parentNode(element);\n }\n}\n\nfunction delegateUseCapture (event) {\n return delegateListener.call(this, event, true);\n}\n\nfunction preventDef () {\n this.returnValue = false;\n}\n\nfunction preventOriginalDefault () {\n this.originalEvent.preventDefault();\n}\n\nfunction stopProp () {\n this.cancelBubble = true;\n}\n\nfunction stopImmProp () {\n this.cancelBubble = true;\n this.immediatePropagationStopped = true;\n}\n\nfunction getOptions (param) {\n return is.object(param)? param : { capture: param };\n}\n\nmodule.exports = {\n add,\n remove,\n\n addDelegate,\n removeDelegate,\n\n delegateListener,\n delegateUseCapture,\n delegatedEvents,\n documents,\n\n useAttachEvent,\n supportsOptions,\n\n _elements: elements,\n _targets: targets,\n _attachedListeners: attachedListeners,\n};\n","module.exports = function extend (dest, source) {\n for (const prop in source) {\n dest[prop] = source[prop];\n }\n return dest;\n};\n","const {\n resolveRectLike,\n rectToXY,\n} = require('./rect');\n\nmodule.exports = function (target, element, action) {\n const actionOptions = target.options[action];\n const actionOrigin = actionOptions && actionOptions.origin;\n const origin = actionOrigin || target.options.origin;\n\n const originRect = resolveRectLike(origin, target, element, [target && element]);\n\n return rectToXY(originRect) || { x: 0, y: 0 };\n};\n","module.exports = (x, y) => Math.sqrt(x * x + y * y);\n","const extend = require('./extend');\nconst win = require('./window');\n\nconst utils = {\n warnOnce: function (method, message) {\n let warned = false;\n\n return function () {\n if (!warned) {\n win.window.console.warn(message);\n warned = true;\n }\n\n return method.apply(this, arguments);\n };\n },\n\n // http://stackoverflow.com/a/5634528/2280888\n _getQBezierValue: function (t, p1, p2, p3) {\n const iT = 1 - t;\n return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3;\n },\n\n getQuadraticCurvePoint: function (startX, startY, cpX, cpY, endX, endY, position) {\n return {\n x: utils._getQBezierValue(position, startX, cpX, endX),\n y: utils._getQBezierValue(position, startY, cpY, endY),\n };\n },\n\n // http://gizma.com/easing/\n easeOutQuad: function (t, b, c, d) {\n t /= d;\n return -c * t*(t-2) + b;\n },\n\n copyAction: function (dest, src) {\n dest.name = src.name;\n dest.axis = src.axis;\n dest.edges = src.edges;\n\n return dest;\n },\n\n is : require('./is'),\n extend : extend,\n hypot : require('./hypot'),\n getOriginXY: require('./getOriginXY'),\n};\n\nextend(utils, require('./arr'));\nextend(utils, require('./domUtils'));\nextend(utils, require('./pointerUtils'));\nextend(utils, require('./rect'));\n\nmodule.exports = utils;\n","const scope = require('../scope');\nconst utils = require('./index');\nconst browser = require('./browser');\n\nconst finder = {\n methodOrder: [ 'simulationResume', 'mouse', 'hasPointer', 'idle' ],\n\n search: function (pointer, eventType, eventTarget) {\n const mouseEvent = (/mouse/i.test(pointer.pointerType || eventType)\n // MSPointerEvent.MSPOINTER_TYPE_MOUSE\n || pointer.pointerType === 4);\n const pointerId = utils.getPointerId(pointer);\n const details = { pointer, pointerId, mouseEvent, eventType, eventTarget };\n\n for (const method of finder.methodOrder) {\n const interaction = finder[method](details);\n\n if (interaction) {\n return interaction;\n }\n }\n },\n\n // try to resume simulation with a new pointer\n simulationResume: function ({ mouseEvent, eventType, eventTarget }) {\n if (!/down|start/i.test(eventType)) {\n return null;\n }\n\n for (const interaction of scope.interactions) {\n let element = eventTarget;\n\n if (interaction.simulation && interaction.simulation.allowResume\n && (interaction.mouse === mouseEvent)) {\n while (element) {\n // if the element is the interaction element\n if (element === interaction.element) {\n return interaction;\n }\n element = utils.parentNode(element);\n }\n }\n }\n\n return null;\n },\n\n // if it's a mouse interaction\n mouse: function ({ pointerId, mouseEvent, eventType }) {\n if (!mouseEvent && (browser.supportsTouch || browser.supportsPointerEvent)) {\n return null;\n }\n\n let firstNonActive;\n\n for (const interaction of scope.interactions) {\n if (interaction.mouse) {\n // if it's a down event, skip interactions with running simulations\n if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; }\n\n // if the interaction is active, return it immediately\n if (interaction.interacting()) {\n return interaction;\n }\n // otherwise save it and look for another active interaction\n else if (!firstNonActive) {\n firstNonActive = interaction;\n }\n }\n }\n\n // if no active mouse interaction was found use the first inactive mouse\n // interaction\n if (firstNonActive) {\n return firstNonActive;\n }\n\n // Find any interaction specifically for mouse.\n // ignore the interaction if the eventType is a mousedown, and a simulation\n // is active\n for (const interaction of scope.interactions) {\n if (interaction.mouse && !(/down/.test(eventType) && interaction.simulation)) {\n return interaction;\n }\n }\n\n return null;\n },\n\n // get interaction that has this pointer\n hasPointer: function ({ pointerId }) {\n for (const interaction of scope.interactions) {\n if (utils.contains(interaction.pointerIds, pointerId)) {\n return interaction;\n }\n }\n },\n\n // get first idle interaction\n idle: function ({ mouseEvent }) {\n for (const interaction of scope.interactions) {\n // if there's already a pointer held down\n if (interaction.pointerIds.length === 1) {\n const target = interaction.target;\n // don't add this pointer if there is a target interactable and it\n // isn't gesturable\n if (target && !target.options.gesture.enabled) {\n continue;\n }\n }\n // maximum of 2 pointers per interaction\n else if (interaction.pointerIds.length >= 2) {\n continue;\n }\n\n if (!interaction.interacting() && (mouseEvent === interaction.mouse)) {\n return interaction;\n }\n }\n\n return null;\n },\n};\n\nmodule.exports = finder;\n","const win = require('./window');\nconst isWindow = require('./isWindow');\n\nconst is = {\n array : () => {},\n\n window : thing => thing === win.window || isWindow(thing),\n\n docFrag : thing => is.object(thing) && thing.nodeType === 11,\n\n object : thing => !!thing && (typeof thing === 'object'),\n\n function: thing => typeof thing === 'function',\n\n number : thing => typeof thing === 'number' ,\n\n bool : thing => typeof thing === 'boolean' ,\n\n string : thing => typeof thing === 'string' ,\n\n element: thing => {\n if (!thing || (typeof thing !== 'object')) { return false; }\n\n const _window = win.getWindow(thing) || win.window;\n\n return (/object|function/.test(typeof _window.Element)\n ? thing instanceof _window.Element //DOM2\n : thing.nodeType === 1 && typeof thing.nodeName === 'string');\n },\n};\n\nis.array = thing => (is.object(thing)\n && (typeof thing.length !== 'undefined')\n && is.function(thing.splice));\n\nmodule.exports = is;\n","module.exports = (thing) => !!(thing && thing.Window) && (thing instanceof thing.Window);\n","function pointerExtend (dest, source) {\n for (const prop in source) {\n const prefixedPropREs = module.exports.prefixedPropREs;\n let deprecated = false;\n\n // skip deprecated prefixed properties\n for (const vendor in prefixedPropREs) {\n if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) {\n deprecated = true;\n break;\n }\n }\n\n if (!deprecated && typeof source[prop] !== 'function') {\n dest[prop] = source[prop];\n }\n }\n return dest;\n}\n\npointerExtend.prefixedPropREs = {\n webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/,\n};\n\nmodule.exports = pointerExtend;\n","const hypot = require('./hypot');\nconst browser = require('./browser');\nconst dom = require('./domObjects');\nconst domUtils = require('./domUtils');\nconst is = require('./is');\nconst pointerExtend = require('./pointerExtend');\n\nconst pointerUtils = {\n copyCoords: function (dest, src) {\n dest.page = dest.page || {};\n dest.page.x = src.page.x;\n dest.page.y = src.page.y;\n\n dest.client = dest.client || {};\n dest.client.x = src.client.x;\n dest.client.y = src.client.y;\n\n dest.timeStamp = src.timeStamp;\n },\n\n setCoordDeltas: function (targetObj, prev, cur) {\n targetObj.page.x = cur.page.x - prev.page.x;\n targetObj.page.y = cur.page.y - prev.page.y;\n targetObj.client.x = cur.client.x - prev.client.x;\n targetObj.client.y = cur.client.y - prev.client.y;\n targetObj.timeStamp = cur.timeStamp - prev.timeStamp;\n\n // set pointer velocity\n const dt = Math.max(targetObj.timeStamp / 1000, 0.001);\n\n targetObj.page.speed = hypot(targetObj.page.x, targetObj.page.y) / dt;\n targetObj.page.vx = targetObj.page.x / dt;\n targetObj.page.vy = targetObj.page.y / dt;\n\n targetObj.client.speed = hypot(targetObj.client.x, targetObj.page.y) / dt;\n targetObj.client.vx = targetObj.client.x / dt;\n targetObj.client.vy = targetObj.client.y / dt;\n },\n\n isNativePointer: function (pointer) {\n return (pointer instanceof dom.Event || pointer instanceof dom.Touch);\n },\n\n // Get specified X/Y coords for mouse or event.touches[0]\n getXY: function (type, pointer, xy) {\n xy = xy || {};\n type = type || 'page';\n\n xy.x = pointer[type + 'X'];\n xy.y = pointer[type + 'Y'];\n\n return xy;\n },\n\n getPageXY: function (pointer, page) {\n page = page || {};\n\n // Opera Mobile handles the viewport and scrolling oddly\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n pointerUtils.getXY('screen', pointer, page);\n\n page.x += window.scrollX;\n page.y += window.scrollY;\n }\n else {\n pointerUtils.getXY('page', pointer, page);\n }\n\n return page;\n },\n\n getClientXY: function (pointer, client) {\n client = client || {};\n\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n // Opera Mobile handles the viewport and scrolling oddly\n pointerUtils.getXY('screen', pointer, client);\n }\n else {\n pointerUtils.getXY('client', pointer, client);\n }\n\n return client;\n },\n\n getPointerId: function (pointer) {\n return is.number(pointer.pointerId)? pointer.pointerId : pointer.identifier;\n },\n\n setCoords: function (targetObj, pointers, timeStamp) {\n const pointer = (pointers.length > 1\n ? pointerUtils.pointerAverage(pointers)\n : pointers[0]);\n\n const tmpXY = {};\n\n pointerUtils.getPageXY(pointer, tmpXY);\n targetObj.page.x = tmpXY.x;\n targetObj.page.y = tmpXY.y;\n\n pointerUtils.getClientXY(pointer, tmpXY);\n targetObj.client.x = tmpXY.x;\n targetObj.client.y = tmpXY.y;\n\n targetObj.timeStamp = is.number(timeStamp) ? timeStamp :new Date().getTime();\n },\n\n pointerExtend: pointerExtend,\n\n getTouchPair: function (event) {\n const touches = [];\n\n // array of touches is supplied\n if (is.array(event)) {\n touches[0] = event[0];\n touches[1] = event[1];\n }\n // an event\n else {\n if (event.type === 'touchend') {\n if (event.touches.length === 1) {\n touches[0] = event.touches[0];\n touches[1] = event.changedTouches[0];\n }\n else if (event.touches.length === 0) {\n touches[0] = event.changedTouches[0];\n touches[1] = event.changedTouches[1];\n }\n }\n else {\n touches[0] = event.touches[0];\n touches[1] = event.touches[1];\n }\n }\n\n return touches;\n },\n\n pointerAverage: function (pointers) {\n const average = {\n pageX : 0,\n pageY : 0,\n clientX: 0,\n clientY: 0,\n screenX: 0,\n screenY: 0,\n };\n\n for (const pointer of pointers) {\n for (const prop in average) {\n average[prop] += pointer[prop];\n }\n }\n for (const prop in average) {\n average[prop] /= pointers.length;\n }\n\n return average;\n },\n\n touchBBox: function (event) {\n if (!event.length && !(event.touches && event.touches.length > 1)) {\n return;\n }\n\n const touches = pointerUtils.getTouchPair(event);\n const minX = Math.min(touches[0].pageX, touches[1].pageX);\n const minY = Math.min(touches[0].pageY, touches[1].pageY);\n const maxX = Math.max(touches[0].pageX, touches[1].pageX);\n const maxY = Math.max(touches[0].pageY, touches[1].pageY);\n\n return {\n x: minX,\n y: minY,\n left: minX,\n top: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n },\n\n touchDistance: function (event, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n\n\n const dx = touches[0][sourceX] - touches[1][sourceX];\n const dy = touches[0][sourceY] - touches[1][sourceY];\n\n return hypot(dx, dy);\n },\n\n touchAngle: function (event, prevAngle, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n const dx = touches[1][sourceX] - touches[0][sourceX];\n const dy = touches[1][sourceY] - touches[0][sourceY];\n const angle = 180 * Math.atan2(dy , dx) / Math.PI;\n\n return angle;\n },\n\n getPointerType: function (pointer, interaction) {\n // if the PointerEvent API isn't available, then the pointer must be ither\n // a MouseEvent or TouchEvent\n if (interaction.mouse) { return 'mouse'; }\n if (!browser.supportsPointerEvent) { return 'touch'; }\n\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : [undefined, undefined,'touch', 'pen', 'mouse'][pointer.pointerType];\n },\n\n // [ event.target, event.currentTarget ]\n getEventTargets: function (event) {\n return [\n domUtils.getActualElement(event.path ? event.path[0] : event.target),\n domUtils.getActualElement(event.currentTarget),\n ];\n },\n};\n\nmodule.exports = pointerUtils;\n","const { window } = require('./window');\n\nconst vendors = ['ms', 'moz', 'webkit', 'o'];\nlet lastTime = 0;\nlet request;\nlet cancel;\n\nfor (let x = 0; x < vendors.length && !window.requestAnimationFrame; x++) {\n request = window[vendors[x] + 'RequestAnimationFrame'];\n cancel = window[vendors[x] +'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n}\n\nif (!request) {\n request = function (callback) {\n const currTime = new Date().getTime();\n const timeToCall = Math.max(0, 16 - (currTime - lastTime));\n const id = setTimeout(function () { callback(currTime + timeToCall); },\n timeToCall);\n\n lastTime = currTime + timeToCall;\n return id;\n };\n}\n\nif (!cancel) {\n cancel = function (id) {\n clearTimeout(id);\n };\n}\n\nmodule.exports = {\n request,\n cancel,\n};\n","const extend = require('./extend');\nconst is = require('./is');\nconst {\n closest,\n parentNode,\n getElementRect,\n} = require('./domUtils');\n\nconst rectUtils = {\n getStringOptionResult: function (value, interactable, element) {\n if (!is.string(value)) {\n return null;\n }\n\n if (value === 'parent') {\n value = parentNode(element);\n }\n else if (value === 'self') {\n value = interactable.getRect(element);\n }\n else {\n value = closest(element, value);\n }\n\n return value;\n },\n\n resolveRectLike: function (value, interactable, element, functionArgs) {\n value = rectUtils.getStringOptionResult(value, interactable, element) || value;\n\n if (is.function(value)) {\n value = value.apply(null, functionArgs);\n }\n\n if (is.element(value)) {\n value = getElementRect(value);\n }\n\n return value;\n },\n\n rectToXY: function (rect) {\n return rect && {\n x: 'x' in rect ? rect.x : rect.left,\n y: 'y' in rect ? rect.y : rect.top,\n };\n },\n\n xywhToTlbr: function (rect) {\n if (rect && !('left' in rect && 'top' in rect)) {\n rect = extend({}, rect);\n\n rect.left = rect.x || 0;\n rect.top = rect.y || 0;\n rect.right = rect.right || (rect.left + rect.width);\n rect.bottom = rect.bottom || (rect.top + rect.height);\n }\n\n return rect;\n },\n\n tlbrToXywh: function (rect) {\n if (rect && !('x' in rect && 'y' in rect)) {\n rect = extend({}, rect);\n\n rect.x = rect.left || 0;\n rect.top = rect.top || 0;\n rect.width = rect.width || (rect.right - rect.x);\n rect.height = rect.height || (rect.bottom - rect.y);\n }\n\n return rect;\n },\n};\n\nmodule.exports = rectUtils;\n","const win = module.exports;\nconst isWindow = require('./isWindow');\n\nfunction init (window) {\n // get wrapped window if using Shadow DOM polyfill\n\n win.realWindow = window;\n\n // create a TextNode\n const el = window.document.createTextNode('');\n\n // check if it's wrapped by a polyfill\n if (el.ownerDocument !== window.document\n && typeof window.wrap === 'function'\n && window.wrap(el) === el) {\n // use wrapped window\n window = window.wrap(window);\n }\n\n win.window = window;\n}\n\nif (typeof window === 'undefined') {\n win.window = undefined;\n win.realWindow = undefined;\n}\nelse {\n init(window);\n}\n\nwin.getWindow = function getWindow (node) {\n if (isWindow(node)) {\n return node;\n }\n\n const rootNode = (node.ownerDocument || node);\n\n return rootNode.defaultView || rootNode.parentWindow || win.window;\n};\n\nwin.init = init;\n"]} \ No newline at end of file +{"version":3,"sources":["src/header.js","node_modules/browser-pack/_prelude.js","index.js","src/Eventable.js","src/InteractEvent.js","src/Interactable.js","src/Interaction.js","src/actions/base.js","src/actions/drag.js","src/actions/drop.js","src/actions/gesture.js","src/actions/resize.js","src/autoScroll.js","src/autoStart/InteractableMethods.js","src/autoStart/base.js","src/autoStart/delay.js","src/autoStart/drag.js","src/autoStart/gesture.js","src/autoStart/resize.js","src/defaultOptions.js","src/index.js","src/inertia.js","src/interact.js","src/interactablePreventDefault.js","src/legacyBrowsers.js","src/modifiers/index.js","src/modifiers/restrict.js","src/modifiers/restrictEdges.js","src/modifiers/restrictSize.js","src/modifiers/snap.js","src/modifiers/snapSize.js","src/pointerEvents/PointerEvent.js","src/pointerEvents/base.js","src/pointerEvents/holdRepeat.js","src/pointerEvents/interactableTargets.js","src/scope.js","src/utils/Signals.js","src/utils/arr.js","src/utils/browser.js","src/utils/domObjects.js","src/utils/domUtils.js","src/utils/events.js","src/utils/extend.js","src/utils/getOriginXY.js","src/utils/hypot.js","src/utils/index.js","src/utils/interactionFinder.js","src/utils/is.js","src/utils/isWindow.js","src/utils/pointerExtend.js","src/utils/pointerUtils.js","src/utils/raf.js","src/utils/rect.js","src/utils/window.js"],"names":[],"mappings":"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","file":"interact.js","sourceRoot":"","sourcesContent":["/**\n * interact.js v1.3.0-alpha.4+sha.7970416-dirty\n *\n * Copyright (c) 2012-2017 Taye Adeyemi \n * Open source under the MIT License.\n * https://raw.github.com/taye/interact.js/master/LICENSE\n */\n","(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o 150) {\n return null;\n }\n\n let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI;\n const overlap = 22.5;\n\n if (angle < 0) {\n angle += 360;\n }\n\n const left = 135 - overlap <= angle && angle < 225 + overlap;\n const up = 225 - overlap <= angle && angle < 315 + overlap;\n\n const right = !left && (315 - overlap <= angle || angle < 45 + overlap);\n const down = !up && 45 - overlap <= angle && angle < 135 + overlap;\n\n return {\n up,\n down,\n left,\n right,\n angle,\n speed: interaction.prevEvent.speed,\n velocity: {\n x: interaction.prevEvent.velocityX,\n y: interaction.prevEvent.velocityY,\n },\n };\n }\n\n preventDefault () {}\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n}\n\nsignals.on('set-delta', function ({ iEvent, interaction, starting, deltaSource }) {\n const prevEvent = starting? iEvent : interaction.prevEvent;\n\n if (deltaSource === 'client') {\n iEvent.dx = iEvent.clientX - prevEvent.clientX;\n iEvent.dy = iEvent.clientY - prevEvent.clientY;\n }\n else {\n iEvent.dx = iEvent.pageX - prevEvent.pageX;\n iEvent.dy = iEvent.pageY - prevEvent.pageY;\n }\n});\n\nInteractEvent.signals = signals;\n\nmodule.exports = InteractEvent;\n","const is = require('./utils/is');\nconst events = require('./utils/events');\nconst extend = require('./utils/extend');\nconst actions = require('./actions/base');\nconst scope = require('./scope');\nconst Eventable = require('./Eventable');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nconst {\n getElementRect,\n nodeContains,\n trySelector,\n} = require('./utils/domUtils');\nconst { getWindow } = require('./utils/window');\nconst { indexOf, contains } = require('./utils/arr');\nconst { wheelEvent } = require('./utils/browser');\n\n// all set interactables\nscope.interactables = [];\n\n/*\\\n * Interactable\n [ property ]\n **\n * Object type returned by @interact\n\\*/\nclass Interactable {\n constructor (target, options) {\n options = options || {};\n\n this.target = target;\n this.events = new Eventable();\n this._context = options.context || scope.document;\n this._win = getWindow(trySelector(target)? this._context : target);\n this._doc = this._win.document;\n\n signals.fire('new', {\n target,\n options,\n interactable: this,\n win: this._win,\n });\n\n scope.addDocument( this._doc, this._win );\n\n scope.interactables.push(this);\n\n this.set(options);\n }\n\n setOnEvents (action, phases) {\n const onAction = 'on' + action;\n\n if (is.function(phases.onstart) ) { this.events[onAction + 'start' ] = phases.onstart ; }\n if (is.function(phases.onmove) ) { this.events[onAction + 'move' ] = phases.onmove ; }\n if (is.function(phases.onend) ) { this.events[onAction + 'end' ] = phases.onend ; }\n if (is.function(phases.oninertiastart)) { this.events[onAction + 'inertiastart' ] = phases.oninertiastart ; }\n\n return this;\n }\n\n setPerAction (action, options) {\n // for all the default per-action options\n for (const option in options) {\n // if this option exists for this action\n if (option in defaults[action]) {\n // if the option in the options arg is an object value\n if (is.object(options[option])) {\n // duplicate the object\n this.options[action][option] = extend(this.options[action][option] || {}, options[option]);\n\n if (is.object(defaults.perAction[option]) && 'enabled' in defaults.perAction[option]) {\n this.options[action][option].enabled = options[option].enabled === false? false : true;\n }\n }\n else if (is.bool(options[option]) && is.object(defaults.perAction[option])) {\n this.options[action][option].enabled = options[option];\n }\n else if (options[option] !== undefined) {\n // or if it's not undefined, do a plain assignment\n this.options[action][option] = options[option];\n }\n }\n }\n }\n\n /*\\\n * Interactable.getRect\n [ method ]\n *\n * The default function to get an Interactables bounding rect. Can be\n * overridden using @Interactable.rectChecker.\n *\n - element (Element) #optional The element to measure.\n = (object) The object's bounding rectangle.\n o {\n o top : 0,\n o left : 0,\n o bottom: 0,\n o right : 0,\n o width : 0,\n o height: 0\n o }\n \\*/\n getRect (element) {\n element = element || this.target;\n\n if (is.string(this.target) && !(is.element(element))) {\n element = this._context.querySelector(this.target);\n }\n\n return getElementRect(element);\n }\n\n /*\\\n * Interactable.rectChecker\n [ method ]\n *\n * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n - checker (function) #optional A function which returns this Interactable's bounding rectangle. See @Interactable.getRect\n = (function | object) The checker function or this Interactable\n \\*/\n rectChecker (checker) {\n if (is.function(checker)) {\n this.getRect = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.getRect;\n\n return this;\n }\n\n return this.getRect;\n }\n\n _backCompatOption (optionName, newValue) {\n if (trySelector(newValue) || is.object(newValue)) {\n this.options[optionName] = newValue;\n\n for (const action of actions.names) {\n this.options[action][optionName] = newValue;\n }\n\n return this;\n }\n\n return this.options[optionName];\n }\n\n /*\\\n * Interactable.origin\n [ method ]\n *\n * Gets or sets the origin of the Interactable's element. The x and y\n * of the origin will be subtracted from action event coordinates.\n *\n - origin (object | string) #optional An object eg. { x: 0, y: 0 } or string 'parent', 'self' or any CSS selector\n * OR\n - origin (Element) #optional An HTML or SVG Element whose rect will be used\n **\n = (object) The current origin or this Interactable\n \\*/\n origin (newValue) {\n return this._backCompatOption('origin', newValue);\n }\n\n /*\\\n * Interactable.deltaSource\n [ method ]\n *\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n - newValue (string) #optional Use 'client' if you will be scrolling while interacting; Use 'page' if you want autoScroll to work\n = (string | object) The current deltaSource or this Interactable\n \\*/\n deltaSource (newValue) {\n if (newValue === 'page' || newValue === 'client') {\n this.options.deltaSource = newValue;\n\n return this;\n }\n\n return this.options.deltaSource;\n }\n\n /*\\\n * Interactable.context\n [ method ]\n *\n * Gets the selector context Node of the Interactable. The default is `window.document`.\n *\n = (Node) The context Node of this Interactable\n **\n \\*/\n context () {\n return this._context;\n }\n\n inContext (element) {\n return (this._context === element.ownerDocument\n || nodeContains(this._context, element));\n }\n\n /*\\\n * Interactable.fire\n [ method ]\n *\n * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n - iEvent (InteractEvent) The InteractEvent object to be fired on this Interactable\n = (Interactable) this Interactable\n \\*/\n fire (iEvent) {\n this.events.fire(iEvent);\n\n return this;\n }\n\n _onOffMultiple (method, eventType, listener, options) {\n if (is.string(eventType) && eventType.search(' ') !== -1) {\n eventType = eventType.trim().split(/ +/);\n }\n\n if (is.array(eventType)) {\n for (let i = 0; i < eventType.length; i++) {\n this[method](eventType[i], listener, options);\n }\n\n return true;\n }\n\n if (is.object(eventType)) {\n for (const prop in eventType) {\n this[method](prop, eventType[prop], listener);\n }\n\n return true;\n }\n }\n\n /*\\\n * Interactable.on\n [ method ]\n *\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n - eventType (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) This Interactable\n \\*/\n on (eventType, listener, options) {\n if (this._onOffMultiple('on', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.on(eventType, listener);\n }\n // delegated event for selector\n else if (is.string(this.target)) {\n events.addDelegate(this.target, this._context, eventType, listener, options);\n }\n else {\n events.add(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.off\n [ method ]\n *\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n - eventType (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) This Interactable\n \\*/\n off (eventType, listener, options) {\n if (this._onOffMultiple('off', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n // if it is an action event type\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.off(eventType, listener);\n }\n // delegated event\n else if (is.string(this.target)) {\n events.removeDelegate(this.target, this._context, eventType, listener, options);\n }\n // remove listener from this Interatable's element\n else {\n events.remove(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.set\n [ method ]\n *\n * Reset the options of this Interactable\n - options (object) The new settings to apply\n = (object) This Interactable\n \\*/\n set (options) {\n if (!is.object(options)) {\n options = {};\n }\n\n this.options = extend({}, defaults.base);\n\n const perActions = extend({}, defaults.perAction);\n\n for (const actionName in actions.methodDict) {\n const methodName = actions.methodDict[actionName];\n\n this.options[actionName] = extend({}, defaults[actionName]);\n\n this.setPerAction(actionName, perActions);\n\n this[methodName](options[actionName]);\n }\n\n for (const setting of Interactable.settingsMethods) {\n this.options[setting] = defaults.base[setting];\n\n if (setting in options) {\n this[setting](options[setting]);\n }\n }\n\n signals.fire('set', {\n options,\n interactable: this,\n });\n\n return this;\n }\n\n /*\\\n * Interactable.unset\n [ method ]\n *\n * Remove this interactable from the list of interactables and remove\n * it's action capabilities and event listeners\n *\n = (object) @interact\n \\*/\n unset () {\n events.remove(this.target, 'all');\n\n if (is.string(this.target)) {\n // remove delegated events\n for (const type in events.delegatedEvents) {\n const delegated = events.delegatedEvents[type];\n\n if (delegated.selectors[0] === this.target\n && delegated.contexts[0] === this._context) {\n\n delegated.selectors.splice(0, 1);\n delegated.contexts .splice(0, 1);\n delegated.listeners.splice(0, 1);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegated[type] = null;\n }\n }\n\n events.remove(this._context, type, events.delegateListener);\n events.remove(this._context, type, events.delegateUseCapture, true);\n }\n }\n else {\n events.remove(this, 'all');\n }\n\n signals.fire('unset', { interactable: this });\n\n scope.interactables.splice(indexOf(scope.interactables, this), 1);\n\n // Stop related interactions when an Interactable is unset\n for (const interaction of scope.interactions || []) {\n if (interaction.target === this && interaction.interacting()) {\n interaction.stop();\n }\n }\n\n return scope.interact;\n }\n}\n\nscope.interactables.indexOfElement = function indexOfElement (target, context) {\n context = context || scope.document;\n\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n if (interactable.target === target && interactable._context === context) {\n return i;\n }\n }\n return -1;\n};\n\nscope.interactables.get = function interactableGet (element, options, dontCheckInContext) {\n const ret = this[this.indexOfElement(element, options && options.context)];\n\n return ret && (is.string(element) || dontCheckInContext || ret.inContext(element))? ret : null;\n};\n\nscope.interactables.forEachSelector = function (callback, element) {\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n // skip non CSS selector targets and out of context elements\n if (!is.string(interactable.target)\n || (element && !interactable.inContext(element))) {\n continue;\n }\n\n const ret = callback(interactable, interactable.target, interactable._context, i, this);\n\n if (ret !== undefined) {\n return ret;\n }\n }\n};\n\n// all interact.js eventTypes\nInteractable.eventTypes = scope.eventTypes = [];\n\nInteractable.signals = signals;\n\nInteractable.settingsMethods = [ 'deltaSource', 'origin', 'preventDefault', 'rectChecker' ];\n\nmodule.exports = Interactable;\n","const scope = require('./scope');\nconst utils = require('./utils');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst domObjects = require('./utils/domObjects');\nconst finder = require('./utils/interactionFinder');\nconst signals = require('./utils/Signals').new();\n\nconst listeners = {};\nconst methodNames = [\n 'pointerDown', 'pointerMove', 'pointerUp',\n 'updatePointer', 'removePointer',\n];\n\n// for ignoring browser's simulated mouse events\nlet prevTouchTime = 0;\n\n// all active and idle interactions\nscope.interactions = [];\n\nclass Interaction {\n constructor ({ pointerType }) {\n this.target = null; // current interactable being interacted with\n this.element = null; // the target element of the interactable\n\n this.prepared = { // action that's ready to be fired on next move event\n name : null,\n axis : null,\n edges: null,\n };\n\n // keep track of added pointers\n this.pointers = [];\n this.pointerIds = [];\n this.downTargets = [];\n this.downTimes = [];\n\n // Previous native pointer move event coordinates\n this.prevCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n // current native pointer move event coordinates\n this.curCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Starting InteractEvent pointer coordinates\n this.startCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Change in coordinates and time of the pointer\n this.pointerDelta = {\n page : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n client : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n timeStamp: 0,\n };\n\n this.downEvent = null; // pointerdown/mousedown/touchstart event\n this.downPointer = {};\n\n this._eventTarget = null;\n this._curEventTarget = null;\n\n this.prevEvent = null; // previous action event\n\n this.pointerIsDown = false;\n this.pointerWasMoved = false;\n this._interacting = false;\n\n this.pointerType = pointerType;\n\n signals.fire('new', this);\n\n scope.interactions.push(this);\n }\n\n pointerDown (pointer, event, eventTarget) {\n const pointerIndex = this.updatePointer(pointer, event, true);\n\n signals.fire('down', {\n pointer,\n event,\n eventTarget,\n pointerIndex,\n interaction: this,\n });\n }\n\n /*\\\n * Interaction.start\n [ method ]\n *\n * Start an action with the given Interactable and Element as tartgets. The\n * action must be enabled for the target Interactable and an appropriate number\n * of pointers must be held down - 1 for drag/resize, 2 for gesture.\n *\n * Use it with `interactable.able({ manualStart: false })` to always\n * [start actions manually](https://github.com/taye/interact.js/issues/114)\n *\n - action (object) The action to be performed - drag, resize, etc.\n - target (Interactable) The Interactable to target\n - element (Element) The DOM Element to target\n = (object) interact\n **\n | interact(target)\n | .draggable({\n | // disable the default drag start by down->move\n | manualStart: true\n | })\n | // start dragging after the user holds the pointer down\n | .on('hold', function (event) {\n | var interaction = event.interaction;\n |\n | if (!interaction.interacting()) {\n | interaction.start({ name: 'drag' },\n | event.interactable,\n | event.currentTarget);\n | }\n | });\n \\*/\n start (action, target, element) {\n if (this.interacting()\n || !this.pointerIsDown\n || this.pointerIds.length < (action.name === 'gesture'? 2 : 1)) {\n return;\n }\n\n // if this interaction had been removed after stopping\n // add it back\n if (utils.indexOf(scope.interactions, this) === -1) {\n scope.interactions.push(this);\n }\n\n utils.copyAction(this.prepared, action);\n this.target = target;\n this.element = element;\n\n signals.fire('action-start', {\n interaction: this,\n event: this.downEvent,\n });\n }\n\n pointerMove (pointer, event, eventTarget) {\n if (!this.simulation) {\n this.updatePointer(pointer);\n utils.setCoords(this.curCoords, this.pointers);\n }\n\n const duplicateMove = (this.curCoords.page.x === this.prevCoords.page.x\n && this.curCoords.page.y === this.prevCoords.page.y\n && this.curCoords.client.x === this.prevCoords.client.x\n && this.curCoords.client.y === this.prevCoords.client.y);\n\n let dx;\n let dy;\n\n // register movement greater than pointerMoveTolerance\n if (this.pointerIsDown && !this.pointerWasMoved) {\n dx = this.curCoords.client.x - this.startCoords.client.x;\n dy = this.curCoords.client.y - this.startCoords.client.y;\n\n this.pointerWasMoved = utils.hypot(dx, dy) > Interaction.pointerMoveTolerance;\n }\n\n const signalArg = {\n pointer,\n pointerIndex: this.getPointerIndex(pointer),\n event,\n eventTarget,\n dx,\n dy,\n duplicate: duplicateMove,\n interaction: this,\n interactingBeforeMove: this.interacting(),\n };\n\n if (!duplicateMove) {\n // set pointer coordinate, time changes and speeds\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n }\n\n signals.fire('move', signalArg);\n\n if (!duplicateMove) {\n // if interacting, fire an 'action-move' signal etc\n if (this.interacting()) {\n this.doMove(signalArg);\n }\n\n if (this.pointerWasMoved) {\n utils.copyCoords(this.prevCoords, this.curCoords);\n }\n }\n }\n\n /*\\\n * Interaction.doMove\n [ method ]\n *\n * Force a move of the current action at the same coordinates. Useful if\n * snap/restrict has been changed and you want a movement with the new\n * settings.\n *\n **\n | interact(target)\n | .draggable(true)\n | .on('dragmove', function (event) {\n | if (someCondition) {\n | // change the snap settings\n | event.interactable.draggable({ snap: { targets: [] }});\n | // fire another move event with re-calculated snap\n | event.interaction.doMove();\n | }\n | });\n \\*/\n doMove (signalArg) {\n signalArg = utils.extend({\n pointer: this.pointers[0],\n event: this.prevEvent,\n eventTarget: this._eventTarget,\n interaction: this,\n }, signalArg || {});\n\n signals.fire('before-action-move', signalArg);\n\n if (!this._dontFireMove) {\n signals.fire('action-move', signalArg);\n }\n\n this._dontFireMove = false;\n }\n\n // End interact move events and stop auto-scroll unless simulation is running\n pointerUp (pointer, event, eventTarget, curEventTarget) {\n const pointerIndex = this.getPointerIndex(pointer);\n\n signals.fire(/cancel$/i.test(event.type)? 'cancel' : 'up', {\n pointer,\n pointerIndex,\n event,\n eventTarget,\n curEventTarget,\n interaction: this,\n });\n\n if (!this.simulation) {\n this.end(event);\n }\n\n this.pointerIsDown = false;\n this.removePointer(pointer, event);\n }\n\n /*\\\n * Interaction.end\n [ method ]\n *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n - event (PointerEvent) #optional\n **\n | interact(target)\n | .draggable(true)\n | .on('move', function (event) {\n | if (event.pageX > 1000) {\n | // end the current action\n | event.interaction.end();\n | // stop all further listeners from being called\n | event.stopImmediatePropagation();\n | }\n | });\n \\*/\n end (event) {\n event = event || this.prevEvent;\n\n if (this.interacting()) {\n signals.fire('action-end', {\n event,\n interaction: this,\n });\n }\n\n this.stop();\n }\n\n currentAction () {\n return this._interacting? this.prepared.name: null;\n }\n\n interacting () {\n return this._interacting;\n }\n\n stop () {\n signals.fire('stop', { interaction: this });\n\n if (this._interacting) {\n signals.fire('stop-active', { interaction: this });\n signals.fire('stop-' + this.prepared.name, { interaction: this });\n }\n\n this.target = this.element = null;\n\n this._interacting = false;\n this.prepared.name = this.prevEvent = null;\n }\n\n getPointerIndex (pointer) {\n // mouse and pen interactions may have only one pointer\n if (this.pointerType === 'mouse' || this.pointerType === 'pen') {\n return 0;\n }\n\n return utils.indexOf(this.pointerIds, utils.getPointerId(pointer));\n }\n\n updatePointer (pointer, event, down = event && /(down|start)$/i.test(event.type)) {\n const id = utils.getPointerId(pointer);\n let index = this.getPointerIndex(pointer);\n\n if (index === -1) {\n index = this.pointerIds.length;\n this.pointerIds[index] = id;\n }\n\n if (down) {\n signals.fire('update-pointer-down', {\n pointer,\n event,\n down,\n pointerId: id,\n pointerIndex: index,\n interaction: this,\n });\n }\n\n this.pointers[index] = pointer;\n\n return index;\n }\n\n removePointer (pointer, event) {\n const index = this.getPointerIndex(pointer);\n\n if (index === -1) { return; }\n\n signals.fire('remove-pointer', {\n pointer,\n event,\n pointerIndex: index,\n interaction: this,\n });\n\n this.pointers .splice(index, 1);\n this.pointerIds .splice(index, 1);\n this.downTargets.splice(index, 1);\n this.downTimes .splice(index, 1);\n }\n\n _updateEventTargets (target, currentTarget) {\n this._eventTarget = target;\n this._curEventTarget = currentTarget;\n }\n}\n\nfor (let i = 0, len = methodNames.length; i < len; i++) {\n const method = methodNames[i];\n\n listeners[method] = doOnInteractions(method);\n}\n\nfunction doOnInteractions (method) {\n return (function (event) {\n const pointerType = utils.getPointerType(event);\n const [eventTarget, curEventTarget] = utils.getEventTargets(event);\n const matches = []; // [ [pointer, interaction], ...]\n\n if (browser.supportsTouch && /touch/.test(event.type)) {\n prevTouchTime = new Date().getTime();\n\n for (let i = 0; i < event.changedTouches.length; i++) {\n const pointer = event.changedTouches[i];\n const interaction = finder.search(pointer, event.type, eventTarget);\n\n matches.push([pointer, interaction || new Interaction({ pointerType })]);\n }\n }\n else {\n let invalidPointer = false;\n\n if (!browser.supportsPointerEvent && /mouse/.test(event.type)) {\n // ignore mouse events while touch interactions are active\n for (let i = 0; i < scope.interactions.length && !invalidPointer; i++) {\n invalidPointer = scope.interactions[i].pointerType !== 'mouse' && scope.interactions[i].pointerIsDown;\n }\n\n // try to ignore mouse events that are simulated by the browser\n // after a touch event\n invalidPointer = invalidPointer\n || (new Date().getTime() - prevTouchTime < 500)\n // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated\n || event.timeStamp === 0;\n }\n\n if (!invalidPointer) {\n let interaction = finder.search(event, event.type, eventTarget);\n\n if (!interaction) {\n interaction = new Interaction({ pointerType });\n }\n\n matches.push([event, interaction]);\n }\n }\n\n for (const [pointer, interaction] of matches) {\n interaction._updateEventTargets(eventTarget, curEventTarget);\n interaction[method](pointer, event, eventTarget, curEventTarget);\n }\n });\n}\n\nfunction endAll (event) {\n for (let i = 0; i < scope.interactions.length; i++) {\n const interaction = scope.interactions[i];\n\n interaction.end(event);\n signals.fire('endall', { event, interaction });\n }\n}\n\nconst docEvents = { /* 'eventType': listenerFunc */ };\nconst pEventTypes = browser.pEventTypes;\n\nif (domObjects.PointerEvent) {\n docEvents[pEventTypes.down ] = listeners.pointerDown;\n docEvents[pEventTypes.move ] = listeners.pointerMove;\n docEvents[pEventTypes.up ] = listeners.pointerUp;\n docEvents[pEventTypes.cancel] = listeners.pointerUp;\n}\nelse {\n docEvents.mousedown = listeners.pointerDown;\n docEvents.mousemove = listeners.pointerMove;\n docEvents.mouseup = listeners.pointerUp;\n\n docEvents.touchstart = listeners.pointerDown;\n docEvents.touchmove = listeners.pointerMove;\n docEvents.touchend = listeners.pointerUp;\n docEvents.touchcancel = listeners.pointerUp;\n}\n\ndocEvents.blur = endAll;\n\nfunction onDocSignal ({ doc }, signalName) {\n const eventMethod = signalName.indexOf('add') === 0\n ? events.add : events.remove;\n\n // delegate event listener\n for (const eventType in scope.delegatedEvents) {\n eventMethod(doc, eventType, events.delegateListener);\n eventMethod(doc, eventType, events.delegateUseCapture, true);\n }\n\n for (const eventType in docEvents) {\n eventMethod(doc, eventType, docEvents[eventType]);\n }\n}\n\nsignals.on('update-pointer-down', ({ interaction, pointer, pointerId, pointerIndex, event, eventTarget, down }) => {\n interaction.pointerIds[pointerIndex] = pointerId;\n interaction.pointers[pointerIndex] = pointer;\n\n if (down) {\n interaction.pointerIsDown = true;\n }\n\n if (!interaction.interacting()) {\n utils.setCoords(interaction.startCoords, interaction.pointers);\n\n utils.copyCoords(interaction.curCoords , interaction.startCoords);\n utils.copyCoords(interaction.prevCoords, interaction.startCoords);\n\n interaction.downEvent = event;\n interaction.downTimes[pointerIndex] = interaction.curCoords.timeStamp;\n interaction.downTargets[pointerIndex] = eventTarget || event && utils.getEventTargets(event)[0];\n interaction.pointerWasMoved = false;\n\n utils.pointerExtend(interaction.downPointer, pointer);\n }\n});\n\nscope.signals.on('add-document' , onDocSignal);\nscope.signals.on('remove-document', onDocSignal);\n\nInteraction.pointerMoveTolerance = 1;\nInteraction.doOnInteractions = doOnInteractions;\nInteraction.endAll = endAll;\nInteraction.signals = signals;\nInteraction.docEvents = docEvents;\n\nscope.endAllInteractions = endAll;\n\nmodule.exports = Interaction;\n","const Interaction = require('../Interaction');\nconst InteractEvent = require('../InteractEvent');\n\nconst actions = {\n firePrepared,\n names: [],\n methodDict: {},\n};\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n interaction._interacting = true;\n firePrepared(interaction, event, 'start');\n});\n\nInteraction.signals.on('action-move', function ({ interaction, event, preEnd }) {\n firePrepared(interaction, event, 'move', preEnd);\n\n // if the action was ended in a listener\n if (!interaction.interacting()) { return false; }\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n firePrepared(interaction, event, 'end');\n});\n\nfunction firePrepared (interaction, event, phase, preEnd) {\n const actionName = interaction.prepared.name;\n\n const newEvent = new InteractEvent(interaction, event, actionName, phase, interaction.element, null, preEnd);\n\n interaction.target.fire(newEvent);\n interaction.prevEvent = newEvent;\n}\n\nmodule.exports = actions;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drag = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n startAxis : 'xy',\n lockAxis : 'xy',\n },\n\n checker: function (pointer, event, interactable) {\n const dragOptions = interactable.options.drag;\n\n return dragOptions.enabled\n ? { name: 'drag', axis: (dragOptions.lockAxis === 'start'\n ? dragOptions.startAxis\n : dragOptions.lockAxis)}\n : null;\n },\n\n getCursor: function () {\n return 'move';\n },\n};\n\nInteraction.signals.on('before-action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n interaction.curCoords.page.y = interaction.startCoords.page.y;\n interaction.curCoords.client.y = interaction.startCoords.client.y;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vx);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vx);\n interaction.pointerDelta.client.vy = 0;\n interaction.pointerDelta.page.vy = 0;\n }\n else if (axis === 'y') {\n interaction.curCoords.page.x = interaction.startCoords.page.x;\n interaction.curCoords.client.x = interaction.startCoords.client.x;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vy);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vy);\n interaction.pointerDelta.client.vx = 0;\n interaction.pointerDelta.page.vx = 0;\n }\n});\n\n// dragmove\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'dragmove') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n iEvent.pageY = interaction.startCoords.page.y;\n iEvent.clientY = interaction.startCoords.client.y;\n iEvent.dy = 0;\n }\n else if (axis === 'y') {\n iEvent.pageX = interaction.startCoords.page.x;\n iEvent.clientX = interaction.startCoords.client.x;\n iEvent.dx = 0;\n }\n});\n\n/*\\\n * Interactable.draggable\n [ method ]\n *\n * Gets or sets whether drag actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of drag events\n | var isDraggable = interact('ul li').draggable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on drag events (object makes the Interactable draggable)\n = (object) This Interactable\n | interact(element).draggable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // the axis in which the first movement must be\n | // for the drag sequence to start\n | // 'xy' by default - any direction\n | startAxis: 'x' || 'y' || 'xy',\n |\n | // 'xy' by default - don't restrict to one axis (move in any direction)\n | // 'x' or 'y' to restrict movement to either axis\n | // 'start' to restrict movement to the axis the drag started in\n | lockAxis: 'x' || 'y' || 'xy' || 'start',\n |\n | // max number of drags that can happen concurrently\n | // with elements of this Interactable. Infinity by default\n | max: Infinity,\n |\n | // max number of drags that can target the same element+Interactable\n | // 1 by default\n | maxPerElement: 2\n | });\n\\*/\nInteractable.prototype.draggable = function (options) {\n if (utils.is.object(options)) {\n this.options.drag.enabled = options.enabled === false? false: true;\n this.setPerAction('drag', options);\n this.setOnEvents('drag', options);\n\n if (/^(xy|x|y|start)$/.test(options.lockAxis)) {\n this.options.drag.lockAxis = options.lockAxis;\n }\n if (/^(xy|x|y)$/.test(options.startAxis)) {\n this.options.drag.startAxis = options.startAxis;\n }\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drag.enabled = options;\n\n if (!options) {\n this.ondragstart = this.ondragstart = this.ondragend = null;\n }\n\n return this;\n }\n\n return this.options.drag;\n};\n\nactions.drag = drag;\nactions.names.push('drag');\nutils.merge(Interactable.eventTypes, [\n 'dragstart',\n 'dragmove',\n 'draginertiastart',\n 'draginertiaresume',\n 'dragend',\n]);\nactions.methodDict.drag = 'draggable';\n\ndefaultOptions.drag = drag.defaults;\n\nmodule.exports = drag;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst scope = require('../scope');\nconst interact = require('../interact');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drop = {\n defaults: {\n enabled: false,\n accept : null,\n overlap: 'pointer',\n },\n};\n\nlet dynamicDrop = false;\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // reset active dropzones\n interaction.activeDrops.dropzones = [];\n interaction.activeDrops.elements = [];\n interaction.activeDrops.rects = [];\n\n interaction.dropEvents = null;\n\n if (!interaction.dynamicDrop) {\n setActiveDrops(interaction, interaction.element);\n }\n\n const dragEvent = interaction.prevEvent;\n const dropEvents = getDropEvents(interaction, event, dragEvent);\n\n if (dropEvents.activate) {\n fireActiveDrops(interaction, dropEvents.activate);\n }\n});\n\nInteractEvent.signals.on('new', function ({ interaction, iEvent, event }) {\n if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { return; }\n\n const draggableElement = interaction.element;\n const dragEvent = iEvent;\n const dropResult = getDrop(dragEvent, event, draggableElement);\n\n interaction.dropTarget = dropResult.dropzone;\n interaction.dropElement = dropResult.element;\n\n interaction.dropEvents = getDropEvents(interaction, event, dragEvent);\n});\n\nInteraction.signals.on('action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n fireDropEvents(interaction, interaction.dropEvents);\n});\n\nInteraction.signals.on('action-end', function ({ interaction }) {\n if (interaction.prepared.name === 'drag') {\n fireDropEvents(interaction, interaction.dropEvents);\n }\n});\n\nInteraction.signals.on('stop-drag', function ({ interaction }) {\n interaction.activeDrops.dropzones =\n interaction.activeDrops.elements =\n interaction.activeDrops.rects =\n interaction.dropEvents = null;\n});\n\nfunction collectDrops (interaction, element) {\n const drops = [];\n const elements = [];\n\n element = element || interaction.element;\n\n // collect all dropzones and their elements which qualify for a drop\n for (const current of scope.interactables) {\n if (!current.options.drop.enabled) { continue; }\n\n const accept = current.options.drop.accept;\n\n // test the draggable element against the dropzone's accept setting\n if ((utils.is.element(accept) && accept !== element)\n || (utils.is.string(accept)\n && !utils.matchesSelector(element, accept))) {\n\n continue;\n }\n\n // query for new elements if necessary\n const dropElements = utils.is.string(current.target)\n ? current._context.querySelectorAll(current.target)\n : [current.target];\n\n for (let i = 0; i < dropElements.length; i++) {\n const currentElement = dropElements[i];\n\n if (currentElement !== element) {\n drops.push(current);\n elements.push(currentElement);\n }\n }\n }\n\n return {\n elements,\n dropzones: drops,\n };\n}\n\nfunction fireActiveDrops (interaction, event) {\n let prevElement;\n\n // loop through all active dropzones and trigger event\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n const current = interaction.activeDrops.dropzones[i];\n const currentElement = interaction.activeDrops.elements [i];\n\n // prevent trigger of duplicate events on same element\n if (currentElement !== prevElement) {\n // set current element as event target\n event.target = currentElement;\n current.fire(event);\n }\n prevElement = currentElement;\n }\n}\n\n// Collect a new set of possible drops and save them in activeDrops.\n// setActiveDrops should always be called when a drag has just started or a\n// drag event happens while dynamicDrop is true\nfunction setActiveDrops (interaction, dragElement) {\n // get dropzones and their elements that could receive the draggable\n const possibleDrops = collectDrops(interaction, dragElement, true);\n\n interaction.activeDrops.dropzones = possibleDrops.dropzones;\n interaction.activeDrops.elements = possibleDrops.elements;\n interaction.activeDrops.rects = [];\n\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n interaction.activeDrops.rects[i] =\n interaction.activeDrops.dropzones[i].getRect(interaction.activeDrops.elements[i]);\n }\n}\n\nfunction getDrop (dragEvent, event, dragElement) {\n const interaction = dragEvent.interaction;\n const validDrops = [];\n\n if (dynamicDrop) {\n setActiveDrops(interaction, dragElement);\n }\n\n // collect all dropzones and their elements which qualify for a drop\n for (let j = 0; j < interaction.activeDrops.dropzones.length; j++) {\n const current = interaction.activeDrops.dropzones[j];\n const currentElement = interaction.activeDrops.elements [j];\n const rect = interaction.activeDrops.rects [j];\n\n validDrops.push(current.dropCheck(dragEvent, event, interaction.target, dragElement, currentElement, rect)\n ? currentElement\n : null);\n }\n\n // get the most appropriate dropzone based on DOM depth and order\n const dropIndex = utils.indexOfDeepestElement(validDrops);\n\n return {\n dropzone: interaction.activeDrops.dropzones[dropIndex] || null,\n element : interaction.activeDrops.elements [dropIndex] || null,\n };\n}\n\nfunction getDropEvents (interaction, pointerEvent, dragEvent) {\n const dropEvents = {\n enter : null,\n leave : null,\n activate : null,\n deactivate: null,\n move : null,\n drop : null,\n };\n\n const tmpl = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n };\n\n if (interaction.dropElement !== interaction.prevDropElement) {\n // if there was a prevDropTarget, create a dragleave event\n if (interaction.prevDropTarget) {\n dropEvents.leave = utils.extend({ type: 'dragleave' }, tmpl);\n\n dragEvent.dragLeave = dropEvents.leave.target = interaction.prevDropElement;\n dragEvent.prevDropzone = dropEvents.leave.dropzone = interaction.prevDropTarget;\n }\n // if the dropTarget is not null, create a dragenter event\n if (interaction.dropTarget) {\n dropEvents.enter = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n type : 'dragenter',\n };\n\n dragEvent.dragEnter = interaction.dropElement;\n dragEvent.dropzone = interaction.dropTarget;\n }\n }\n\n if (dragEvent.type === 'dragend' && interaction.dropTarget) {\n dropEvents.drop = utils.extend({ type: 'drop' }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n dragEvent.relatedTarget = interaction.dropElement;\n }\n if (dragEvent.type === 'dragstart') {\n dropEvents.activate = utils.extend({ type: 'dropactivate' }, tmpl);\n\n dropEvents.activate.target = null;\n dropEvents.activate.dropzone = null;\n }\n if (dragEvent.type === 'dragend') {\n dropEvents.deactivate = utils.extend({ type: 'dropdeactivate' }, tmpl);\n\n dropEvents.deactivate.target = null;\n dropEvents.deactivate.dropzone = null;\n }\n if (dragEvent.type === 'dragmove' && interaction.dropTarget) {\n dropEvents.move = utils.extend({\n dragmove : dragEvent,\n type : 'dropmove',\n }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n }\n\n return dropEvents;\n}\n\nfunction fireDropEvents (interaction, dropEvents) {\n if (dropEvents.leave) { interaction.prevDropTarget.fire(dropEvents.leave); }\n if (dropEvents.move ) { interaction.dropTarget.fire(dropEvents.move ); }\n if (dropEvents.enter) { interaction.dropTarget.fire(dropEvents.enter); }\n if (dropEvents.drop ) { interaction.dropTarget.fire(dropEvents.drop ); }\n if (dropEvents.deactivate) {\n fireActiveDrops(interaction, dropEvents.deactivate);\n }\n\n interaction.prevDropTarget = interaction.dropTarget;\n interaction.prevDropElement = interaction.dropElement;\n}\n\n/*\\\n * Interactable.dropzone\n [ method ]\n *\n * Returns or sets whether elements can be dropped onto this\n * Interactable to trigger drop events\n *\n * Dropzones can receive the following events:\n * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends\n * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone\n * - `dragmove` when a draggable that has entered the dropzone is moved\n * - `drop` when a draggable is dropped into this dropzone\n *\n * Use the `accept` option to allow only elements that match the given CSS\n * selector or element. The value can be:\n *\n * - **an Element** - only that element can be dropped into this dropzone.\n * - **a string**, - the element being dragged must match it as a CSS selector.\n * - **`null`** - accept options is cleared - it accepts any element.\n *\n * Use the `overlap` option to set how drops are checked for. The allowed\n * values are:\n *\n * - `'pointer'`, the pointer must be over the dropzone (default)\n * - `'center'`, the draggable element's center must be over the dropzone\n * - a number from 0-1 which is the `(intersection area) / (draggable area)`.\n * e.g. `0.5` for drop to happen when half of the area of the draggable is\n * over the dropzone\n *\n * Use the `checker` option to specify a function to check if a dragged\n * element is over this Interactable.\n *\n | interact(target)\n | .dropChecker(function(dragEvent, // related dragmove or dragend event\n | event, // TouchEvent/PointerEvent/MouseEvent\n | dropped, // bool result of the default checker\n | dropzone, // dropzone Interactable\n | dropElement, // dropzone elemnt\n | draggable, // draggable Interactable\n | draggableElement) {// draggable element\n |\n | return dropped && event.target.hasAttribute('allow-drop');\n | }\n *\n *\n - options (boolean | object | null) #optional The new value to be set.\n | interact('.drop').dropzone({\n | accept: '.can-drop' || document.getElementById('single-drop'),\n | overlap: 'pointer' || 'center' || zeroToOne\n | }\n = (boolean | object) The current setting or this Interactable\n\\*/\nInteractable.prototype.dropzone = function (options) {\n if (utils.is.object(options)) {\n this.options.drop.enabled = options.enabled === false? false: true;\n\n if (utils.is.function(options.ondrop) ) { this.events.ondrop = options.ondrop ; }\n if (utils.is.function(options.ondropactivate) ) { this.events.ondropactivate = options.ondropactivate ; }\n if (utils.is.function(options.ondropdeactivate)) { this.events.ondropdeactivate = options.ondropdeactivate; }\n if (utils.is.function(options.ondragenter) ) { this.events.ondragenter = options.ondragenter ; }\n if (utils.is.function(options.ondragleave) ) { this.events.ondragleave = options.ondragleave ; }\n if (utils.is.function(options.ondropmove) ) { this.events.ondropmove = options.ondropmove ; }\n\n if (/^(pointer|center)$/.test(options.overlap)) {\n this.options.drop.overlap = options.overlap;\n }\n else if (utils.is.number(options.overlap)) {\n this.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0);\n }\n if ('accept' in options) {\n this.options.drop.accept = options.accept;\n }\n if ('checker' in options) {\n this.options.drop.checker = options.checker;\n }\n\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drop.enabled = options;\n\n if (!options) {\n this.ondragenter = this.ondragleave = this.ondrop\n = this.ondropactivate = this.ondropdeactivate = null;\n }\n\n return this;\n }\n\n return this.options.drop;\n};\n\nInteractable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) {\n let dropped = false;\n\n // if the dropzone has no rect (eg. display: none)\n // call the custom dropChecker or just return false\n if (!(rect = rect || this.getRect(dropElement))) {\n return (this.options.drop.checker\n ? this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement)\n : false);\n }\n\n const dropOverlap = this.options.drop.overlap;\n\n if (dropOverlap === 'pointer') {\n const origin = utils.getOriginXY(draggable, draggableElement, 'drag');\n const page = utils.getPageXY(dragEvent);\n\n page.x += origin.x;\n page.y += origin.y;\n\n const horizontal = (page.x > rect.left) && (page.x < rect.right);\n const vertical = (page.y > rect.top ) && (page.y < rect.bottom);\n\n dropped = horizontal && vertical;\n }\n\n const dragRect = draggable.getRect(draggableElement);\n\n if (dragRect && dropOverlap === 'center') {\n const cx = dragRect.left + dragRect.width / 2;\n const cy = dragRect.top + dragRect.height / 2;\n\n dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom;\n }\n\n if (dragRect && utils.is.number(dropOverlap)) {\n const overlapArea = (Math.max(0, Math.min(rect.right , dragRect.right ) - Math.max(rect.left, dragRect.left))\n * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top , dragRect.top )));\n\n const overlapRatio = overlapArea / (dragRect.width * dragRect.height);\n\n dropped = overlapRatio >= dropOverlap;\n }\n\n if (this.options.drop.checker) {\n dropped = this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement);\n }\n\n return dropped;\n};\n\nInteractable.signals.on('unset', function ({ interactable }) {\n interactable.dropzone(false);\n});\n\nInteractable.settingsMethods.push('dropChecker');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.dropTarget = null; // the dropzone a drag target might be dropped into\n interaction.dropElement = null; // the element at the time of checking\n interaction.prevDropTarget = null; // the dropzone that was recently dragged away from\n interaction.prevDropElement = null; // the element at the time of checking\n interaction.dropEvents = null; // the dropEvents related to the current drag event\n\n interaction.activeDrops = {\n dropzones: [], // the dropzones that are mentioned below\n elements : [], // elements of dropzones that accept the target draggable\n rects : [], // the rects of the elements mentioned above\n };\n\n});\n\nInteraction.signals.on('stop', function ({ interaction }) {\n interaction.dropTarget = interaction.dropElement =\n interaction.prevDropTarget = interaction.prevDropElement = null;\n});\n\n/*\\\n * interact.dynamicDrop\n [ method ]\n *\n * Returns or sets whether the dimensions of dropzone elements are\n * calculated on every dragmove or only on dragstart for the default\n * dropChecker\n *\n - newValue (boolean) #optional True to check on each move. False to check only before start\n = (boolean | interact) The current setting or interact\n\\*/\ninteract.dynamicDrop = function (newValue) {\n if (utils.is.bool(newValue)) {\n //if (dragging && dynamicDrop !== newValue && !newValue) {\n //calcRects(dropzones);\n //}\n\n dynamicDrop = newValue;\n\n return interact;\n }\n return dynamicDrop;\n};\n\nutils.merge(Interactable.eventTypes, [\n 'dragenter',\n 'dragleave',\n 'dropactivate',\n 'dropdeactivate',\n 'dropmove',\n 'drop',\n]);\nactions.methodDict.drop = 'dropzone';\n\ndefaultOptions.drop = drop.defaults;\n\nmodule.exports = drop;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst gesture = {\n defaults: {\n enabled : false,\n origin : null,\n restrict: null,\n },\n\n checker: function (pointer, event, interactable, element, interaction) {\n if (interaction.pointerIds.length >= 2) {\n return { name: 'gesture' };\n }\n\n return null;\n },\n\n getCursor: function () {\n return '';\n },\n};\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturestart') { return; }\n iEvent.ds = 0;\n\n interaction.gesture.startDistance = interaction.gesture.prevDistance = iEvent.distance;\n interaction.gesture.startAngle = interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.scale = 1;\n});\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturemove') { return; }\n\n iEvent.ds = iEvent.scale - interaction.gesture.scale;\n\n interaction.target.fire(iEvent);\n\n interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.prevDistance = iEvent.distance;\n\n if (iEvent.scale !== Infinity\n && iEvent.scale !== null\n && iEvent.scale !== undefined\n && !isNaN(iEvent.scale)) {\n\n interaction.gesture.scale = iEvent.scale;\n }\n});\n\n/*\\\n * Interactable.gesturable\n [ method ]\n *\n * Gets or sets whether multitouch gestures can be performed on the\n * Interactable's element\n *\n = (boolean) Indicates if this can be the target of gesture events\n | var isGestureable = interact(element).gesturable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on gesture events (makes the Interactable gesturable)\n = (object) this Interactable\n | interact(element).gesturable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // limit multiple gestures.\n | // See the explanation in @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n\\*/\nInteractable.prototype.gesturable = function (options) {\n if (utils.is.object(options)) {\n this.options.gesture.enabled = options.enabled === false? false: true;\n this.setPerAction('gesture', options);\n this.setOnEvents('gesture', options);\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.gesture.enabled = options;\n\n if (!options) {\n this.ongesturestart = this.ongesturestart = this.ongestureend = null;\n }\n\n return this;\n }\n\n return this.options.gesture;\n};\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action, event, starting, ending, deltaSource }) {\n if (action !== 'gesture') { return; }\n\n const pointers = interaction.pointers;\n\n iEvent.touches = [pointers[0], pointers[1]];\n\n if (starting) {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = 1;\n iEvent.ds = 0;\n iEvent.angle = utils.touchAngle(pointers, undefined, deltaSource);\n iEvent.da = 0;\n }\n else if (ending || event instanceof InteractEvent) {\n iEvent.distance = interaction.prevEvent.distance;\n iEvent.box = interaction.prevEvent.box;\n iEvent.scale = interaction.prevEvent.scale;\n iEvent.ds = iEvent.scale - 1;\n iEvent.angle = interaction.prevEvent.angle;\n iEvent.da = iEvent.angle - interaction.gesture.startAngle;\n }\n else {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = iEvent.distance / interaction.gesture.startDistance;\n iEvent.angle = utils.touchAngle(pointers, interaction.gesture.prevAngle, deltaSource);\n\n iEvent.ds = iEvent.scale - interaction.gesture.prevScale;\n iEvent.da = iEvent.angle - interaction.gesture.prevAngle;\n }\n});\n\nInteraction.signals.on('new', function (interaction) {\n interaction.gesture = {\n start: { x: 0, y: 0 },\n\n startDistance: 0, // distance between two touches of touchStart\n prevDistance : 0,\n distance : 0,\n\n scale: 1, // gesture.distance / gesture.startDistance\n\n startAngle: 0, // angle of line joining two touches\n prevAngle : 0, // angle of the previous gesture event\n };\n});\n\nactions.gesture = gesture;\nactions.names.push('gesture');\nutils.merge(Interactable.eventTypes, [\n 'gesturestart',\n 'gesturemove',\n 'gestureend',\n]);\nactions.methodDict.gesture = 'gesturable';\n\ndefaultOptions.gesture = gesture.defaults;\n\nmodule.exports = gesture;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\n// Less Precision with touch input\nconst defaultMargin = browser.supportsTouch || browser.supportsPointerEvent? 20: 10;\n\nconst resize = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n square: false,\n preserveAspectRatio: false,\n axis: 'xy',\n\n // use default margin\n margin: NaN,\n\n // object with props left, right, top, bottom which are\n // true/false values to resize when the pointer is over that edge,\n // CSS selectors to match the handles for each direction\n // or the Elements for each handle\n edges: null,\n\n // a value of 'none' will limit the resize rect to a minimum of 0x0\n // 'negate' will alow the rect to have negative width/height\n // 'reposition' will keep the width/height positive by swapping\n // the top and bottom edges and/or swapping the left and right edges\n invert: 'none',\n },\n\n checker: function (pointer, event, interactable, element, interaction, rect) {\n if (!rect) { return null; }\n\n const page = utils.extend({}, interaction.curCoords.page);\n const options = interactable.options;\n\n if (options.resize.enabled) {\n const resizeOptions = options.resize;\n const resizeEdges = { left: false, right: false, top: false, bottom: false };\n\n // if using resize.edges\n if (utils.is.object(resizeOptions.edges)) {\n for (const edge in resizeEdges) {\n resizeEdges[edge] = checkResizeEdge(edge,\n resizeOptions.edges[edge],\n page,\n interaction._eventTarget,\n element,\n rect,\n resizeOptions.margin || defaultMargin);\n }\n\n resizeEdges.left = resizeEdges.left && !resizeEdges.right;\n resizeEdges.top = resizeEdges.top && !resizeEdges.bottom;\n\n if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) {\n return {\n name: 'resize',\n edges: resizeEdges,\n };\n }\n }\n else {\n const right = options.resize.axis !== 'y' && page.x > (rect.right - defaultMargin);\n const bottom = options.resize.axis !== 'x' && page.y > (rect.bottom - defaultMargin);\n\n if (right || bottom) {\n return {\n name: 'resize',\n axes: (right? 'x' : '') + (bottom? 'y' : ''),\n };\n }\n }\n }\n\n return null;\n },\n\n cursors: (browser.isIe9OrOlder ? {\n x : 'e-resize',\n y : 's-resize',\n xy: 'se-resize',\n\n top : 'n-resize',\n left : 'w-resize',\n bottom : 's-resize',\n right : 'e-resize',\n topleft : 'se-resize',\n bottomright: 'se-resize',\n topright : 'ne-resize',\n bottomleft : 'ne-resize',\n } : {\n x : 'ew-resize',\n y : 'ns-resize',\n xy: 'nwse-resize',\n\n top : 'ns-resize',\n left : 'ew-resize',\n bottom : 'ns-resize',\n right : 'ew-resize',\n topleft : 'nwse-resize',\n bottomright: 'nwse-resize',\n topright : 'nesw-resize',\n bottomleft : 'nesw-resize',\n }),\n\n getCursor: function (action) {\n if (action.axis) {\n return resize.cursors[action.name + action.axis];\n }\n else if (action.edges) {\n let cursorKey = '';\n const edgeNames = ['top', 'bottom', 'left', 'right'];\n\n for (let i = 0; i < 4; i++) {\n if (action.edges[edgeNames[i]]) {\n cursorKey += edgeNames[i];\n }\n }\n\n return resize.cursors[cursorKey];\n }\n },\n};\n\n// resizestart\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'resizestart' || !interaction.prepared.edges) {\n return;\n }\n\n const startRect = interaction.target.getRect(interaction.element);\n const resizeOptions = interaction.target.options.resize;\n\n /*\n * When using the `resizable.square` or `resizable.preserveAspectRatio` options, resizing from one edge\n * will affect another. E.g. with `resizable.square`, resizing to make the right edge larger will make\n * the bottom edge larger by the same amount. We call these 'linked' edges. Any linked edges will depend\n * on the active edges and the edge being interacted with.\n */\n if (resizeOptions.square || resizeOptions.preserveAspectRatio) {\n const linkedEdges = utils.extend({}, interaction.prepared.edges);\n\n linkedEdges.top = linkedEdges.top || (linkedEdges.left && !linkedEdges.bottom);\n linkedEdges.left = linkedEdges.left || (linkedEdges.top && !linkedEdges.right );\n linkedEdges.bottom = linkedEdges.bottom || (linkedEdges.right && !linkedEdges.top );\n linkedEdges.right = linkedEdges.right || (linkedEdges.bottom && !linkedEdges.left );\n\n interaction.prepared._linkedEdges = linkedEdges;\n }\n else {\n interaction.prepared._linkedEdges = null;\n }\n\n // if using `resizable.preserveAspectRatio` option, record aspect ratio at the start of the resize\n if (resizeOptions.preserveAspectRatio) {\n interaction.resizeStartAspectRatio = startRect.width / startRect.height;\n }\n\n interaction.resizeRects = {\n start : startRect,\n current : utils.extend({}, startRect),\n inverted : utils.extend({}, startRect),\n previous : utils.extend({}, startRect),\n delta : {\n left: 0, right : 0, width : 0,\n top : 0, bottom: 0, height: 0,\n },\n };\n\n iEvent.rect = interaction.resizeRects.inverted;\n iEvent.deltaRect = interaction.resizeRects.delta;\n});\n\n// resizemove\nInteractEvent.signals.on('new', function ({ iEvent, phase, interaction }) {\n if (phase !== 'move' || !interaction.prepared.edges) { return; }\n\n const resizeOptions = interaction.target.options.resize;\n const invert = resizeOptions.invert;\n const invertible = invert === 'reposition' || invert === 'negate';\n\n let edges = interaction.prepared.edges;\n\n const start = interaction.resizeRects.start;\n const current = interaction.resizeRects.current;\n const inverted = interaction.resizeRects.inverted;\n const delta = interaction.resizeRects.delta;\n const previous = utils.extend(interaction.resizeRects.previous, inverted);\n const originalEdges = edges;\n\n let dx = iEvent.dx;\n let dy = iEvent.dy;\n\n if (resizeOptions.preserveAspectRatio || resizeOptions.square) {\n // `resize.preserveAspectRatio` takes precedence over `resize.square`\n const startAspectRatio = resizeOptions.preserveAspectRatio\n ? interaction.resizeStartAspectRatio\n : 1;\n\n edges = interaction.prepared._linkedEdges;\n\n if ((originalEdges.left && originalEdges.bottom)\n || (originalEdges.right && originalEdges.top)) {\n dy = -dx / startAspectRatio;\n }\n else if (originalEdges.left || originalEdges.right ) { dy = dx / startAspectRatio; }\n else if (originalEdges.top || originalEdges.bottom) { dx = dy * startAspectRatio; }\n }\n\n // update the 'current' rect without modifications\n if (edges.top ) { current.top += dy; }\n if (edges.bottom) { current.bottom += dy; }\n if (edges.left ) { current.left += dx; }\n if (edges.right ) { current.right += dx; }\n\n if (invertible) {\n // if invertible, copy the current rect\n utils.extend(inverted, current);\n\n if (invert === 'reposition') {\n // swap edge values if necessary to keep width/height positive\n let swap;\n\n if (inverted.top > inverted.bottom) {\n swap = inverted.top;\n\n inverted.top = inverted.bottom;\n inverted.bottom = swap;\n }\n if (inverted.left > inverted.right) {\n swap = inverted.left;\n\n inverted.left = inverted.right;\n inverted.right = swap;\n }\n }\n }\n else {\n // if not invertible, restrict to minimum of 0x0 rect\n inverted.top = Math.min(current.top, start.bottom);\n inverted.bottom = Math.max(current.bottom, start.top);\n inverted.left = Math.min(current.left, start.right);\n inverted.right = Math.max(current.right, start.left);\n }\n\n inverted.width = inverted.right - inverted.left;\n inverted.height = inverted.bottom - inverted.top ;\n\n for (const edge in inverted) {\n delta[edge] = inverted[edge] - previous[edge];\n }\n\n iEvent.edges = interaction.prepared.edges;\n iEvent.rect = inverted;\n iEvent.deltaRect = delta;\n});\n\n/*\\\n * Interactable.resizable\n [ method ]\n *\n * Gets or sets whether resize actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of resize elements\n | var isResizeable = interact('input[type=text]').resizable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on resize events (object makes the Interactable resizable)\n = (object) This Interactable\n | interact(element).resizable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | edges: {\n | top : true, // Use pointer coords to check for resize.\n | left : false, // Disable resizing from left edge.\n | bottom: '.resize-s',// Resize if pointer target matches selector\n | right : handleEl // Resize if pointer target is the given Element\n | },\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height are adjusted at a 1:1 ratio.\n | square: false,\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height maintain the aspect ratio they had when resizing started.\n | preserveAspectRatio: false,\n |\n | // a value of 'none' will limit the resize rect to a minimum of 0x0\n | // 'negate' will allow the rect to have negative width/height\n | // 'reposition' will keep the width/height positive by swapping\n | // the top and bottom edges and/or swapping the left and right edges\n | invert: 'none' || 'negate' || 'reposition'\n |\n | // limit multiple resizes.\n | // See the explanation in the @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n \\*/\nInteractable.prototype.resizable = function (options) {\n if (utils.is.object(options)) {\n this.options.resize.enabled = options.enabled === false? false: true;\n this.setPerAction('resize', options);\n this.setOnEvents('resize', options);\n\n if (/^x$|^y$|^xy$/.test(options.axis)) {\n this.options.resize.axis = options.axis;\n }\n else if (options.axis === null) {\n this.options.resize.axis = defaultOptions.resize.axis;\n }\n\n if (utils.is.bool(options.preserveAspectRatio)) {\n this.options.resize.preserveAspectRatio = options.preserveAspectRatio;\n }\n else if (utils.is.bool(options.square)) {\n this.options.resize.square = options.square;\n }\n\n return this;\n }\n if (utils.is.bool(options)) {\n this.options.resize.enabled = options;\n\n if (!options) {\n this.onresizestart = this.onresizestart = this.onresizeend = null;\n }\n\n return this;\n }\n return this.options.resize;\n};\n\nfunction checkResizeEdge (name, value, page, element, interactableElement, rect, margin) {\n // false, '', undefined, null\n if (!value) { return false; }\n\n // true value, use pointer coords and element rect\n if (value === true) {\n // if dimensions are negative, \"switch\" edges\n const width = utils.is.number(rect.width )? rect.width : rect.right - rect.left;\n const height = utils.is.number(rect.height)? rect.height : rect.bottom - rect.top ;\n\n if (width < 0) {\n if (name === 'left' ) { name = 'right'; }\n else if (name === 'right') { name = 'left' ; }\n }\n if (height < 0) {\n if (name === 'top' ) { name = 'bottom'; }\n else if (name === 'bottom') { name = 'top' ; }\n }\n\n if (name === 'left' ) { return page.x < ((width >= 0? rect.left: rect.right ) + margin); }\n if (name === 'top' ) { return page.y < ((height >= 0? rect.top : rect.bottom) + margin); }\n\n if (name === 'right' ) { return page.x > ((width >= 0? rect.right : rect.left) - margin); }\n if (name === 'bottom') { return page.y > ((height >= 0? rect.bottom: rect.top ) - margin); }\n }\n\n // the remaining checks require an element\n if (!utils.is.element(element)) { return false; }\n\n return utils.is.element(value)\n // the value is an element to use as a resize handle\n ? value === element\n // otherwise check if element matches value as selector\n : utils.matchesUpTo(element, value, interactableElement);\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.resizeAxes = 'xy';\n});\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action }) {\n if (action !== 'resize' || !interaction.resizeAxes) { return; }\n\n const options = interaction.target.options;\n\n if (options.resize.square) {\n if (interaction.resizeAxes === 'y') {\n iEvent.dx = iEvent.dy;\n }\n else {\n iEvent.dy = iEvent.dx;\n }\n iEvent.axes = 'xy';\n }\n else {\n iEvent.axes = interaction.resizeAxes;\n\n if (interaction.resizeAxes === 'x') {\n iEvent.dy = 0;\n }\n else if (interaction.resizeAxes === 'y') {\n iEvent.dx = 0;\n }\n }\n});\n\nactions.resize = resize;\nactions.names.push('resize');\nutils.merge(Interactable.eventTypes, [\n 'resizestart',\n 'resizemove',\n 'resizeinertiastart',\n 'resizeinertiaresume',\n 'resizeend',\n]);\nactions.methodDict.resize = 'resizable';\n\ndefaultOptions.resize = resize.defaults;\n\nmodule.exports = resize;\n","const raf = require('./utils/raf');\nconst getWindow = require('./utils/window').getWindow;\nconst is = require('./utils/is');\nconst domUtils = require('./utils/domUtils');\nconst Interaction = require('./Interaction');\nconst defaultOptions = require('./defaultOptions');\n\nconst autoScroll = {\n defaults: {\n enabled : false,\n container: null, // the item that is scrolled (Window or HTMLElement)\n margin : 60,\n speed : 300, // the scroll speed in pixels per second\n },\n\n interaction: null,\n i: null, // the handle returned by window.setInterval\n x: 0, y: 0, // Direction each pulse is to scroll in\n\n isScrolling: false,\n prevTime: 0,\n\n start: function (interaction) {\n autoScroll.isScrolling = true;\n raf.cancel(autoScroll.i);\n\n autoScroll.interaction = interaction;\n autoScroll.prevTime = new Date().getTime();\n autoScroll.i = raf.request(autoScroll.scroll);\n },\n\n stop: function () {\n autoScroll.isScrolling = false;\n raf.cancel(autoScroll.i);\n },\n\n // scroll the window by the values in scroll.x/y\n scroll: function () {\n const options = autoScroll.interaction.target.options[autoScroll.interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(autoScroll.interaction.element);\n const now = new Date().getTime();\n // change in time in seconds\n const dt = (now - autoScroll.prevTime) / 1000;\n // displacement\n const s = options.speed * dt;\n\n if (s >= 1) {\n if (is.window(container)) {\n container.scrollBy(autoScroll.x * s, autoScroll.y * s);\n }\n else if (container) {\n container.scrollLeft += autoScroll.x * s;\n container.scrollTop += autoScroll.y * s;\n }\n\n autoScroll.prevTime = now;\n }\n\n if (autoScroll.isScrolling) {\n raf.cancel(autoScroll.i);\n autoScroll.i = raf.request(autoScroll.scroll);\n }\n },\n check: function (interactable, actionName) {\n const options = interactable.options;\n\n return options[actionName].autoScroll && options[actionName].autoScroll.enabled;\n },\n onInteractionMove: function ({ interaction, pointer }) {\n if (!(interaction.interacting()\n && autoScroll.check(interaction.target, interaction.prepared.name))) {\n return;\n }\n\n if (interaction.simulation) {\n autoScroll.x = autoScroll.y = 0;\n return;\n }\n\n let top;\n let right;\n let bottom;\n let left;\n\n const options = interaction.target.options[interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(interaction.element);\n\n if (is.window(container)) {\n left = pointer.clientX < autoScroll.margin;\n top = pointer.clientY < autoScroll.margin;\n right = pointer.clientX > container.innerWidth - autoScroll.margin;\n bottom = pointer.clientY > container.innerHeight - autoScroll.margin;\n }\n else {\n const rect = domUtils.getElementClientRect(container);\n\n left = pointer.clientX < rect.left + autoScroll.margin;\n top = pointer.clientY < rect.top + autoScroll.margin;\n right = pointer.clientX > rect.right - autoScroll.margin;\n bottom = pointer.clientY > rect.bottom - autoScroll.margin;\n }\n\n autoScroll.x = (right ? 1: left? -1: 0);\n autoScroll.y = (bottom? 1: top? -1: 0);\n\n if (!autoScroll.isScrolling) {\n // set the autoScroll properties to those of the target\n autoScroll.margin = options.margin;\n autoScroll.speed = options.speed;\n\n autoScroll.start(interaction);\n }\n },\n};\n\nInteraction.signals.on('stop-active', function () {\n autoScroll.stop();\n});\n\nInteraction.signals.on('action-move', autoScroll.onInteractionMove);\n\ndefaultOptions.perAction.autoScroll = autoScroll.defaults;\n\nmodule.exports = autoScroll;\n","const Interactable = require('../Interactable');\nconst actions = require('../actions/base');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.ignoreFrom\n [ method ]\n *\n * If the target of the `mousedown`, `pointerdown` or `touchstart`\n * event or any of it's parents match the given CSS selector or\n * Element, no drag/resize/gesture is started.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to not ignore any elements\n = (string | Element | object) The current ignoreFrom value or this Interactable\n **\n | interact(element, { ignoreFrom: document.getElementById('no-action') });\n | // or\n | interact(element).ignoreFrom('input, textarea, a');\n\\*/\nInteractable.prototype.ignoreFrom = function (newValue) {\n return this._backCompatOption('ignoreFrom', newValue);\n};\n\n/*\\\n * Interactable.allowFrom\n [ method ]\n *\n * A drag/resize/gesture is started only If the target of the\n * `mousedown`, `pointerdown` or `touchstart` event or any of it's\n * parents match the given CSS selector or Element.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to allow from any element\n = (string | Element | object) The current allowFrom value or this Interactable\n **\n | interact(element, { allowFrom: document.getElementById('drag-handle') });\n | // or\n | interact(element).allowFrom('.handle');\n\\*/\nInteractable.prototype.allowFrom = function (newValue) {\n return this._backCompatOption('allowFrom', newValue);\n};\n\nInteractable.prototype.testIgnore = function (ignoreFrom, interactableElement, element) {\n if (!ignoreFrom || !is.element(element)) { return false; }\n\n if (is.string(ignoreFrom)) {\n return domUtils.matchesUpTo(element, ignoreFrom, interactableElement);\n }\n else if (is.element(ignoreFrom)) {\n return domUtils.nodeContains(ignoreFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testAllow = function (allowFrom, interactableElement, element) {\n if (!allowFrom) { return true; }\n\n if (!is.element(element)) { return false; }\n\n if (is.string(allowFrom)) {\n return domUtils.matchesUpTo(element, allowFrom, interactableElement);\n }\n else if (is.element(allowFrom)) {\n return domUtils.nodeContains(allowFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testIgnoreAllow = function (options, interactableElement, eventTarget) {\n return (!this.testIgnore(options.ignoreFrom, interactableElement, eventTarget)\n && this.testAllow(options.allowFrom, interactableElement, eventTarget));\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (event.buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\n","const interact = require('../interact');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst actions = require('../actions/base');\nconst defaultOptions = require('../defaultOptions');\nconst browser = require('../utils/browser');\nconst scope = require('../scope');\nconst utils = require('../utils');\nconst signals = require('../utils/Signals').new();\n\nrequire('./InteractableMethods');\n\nconst autoStart = {\n signals,\n withinInteractionLimit,\n // Allow this many interactions to happen simultaneously\n maxInteractions: Infinity,\n defaults: {\n perAction: {\n manualStart: false,\n max: Infinity,\n maxPerElement: 1,\n allowFrom: null,\n ignoreFrom: null,\n },\n },\n setActionDefaults: function (action) {\n utils.extend(action.defaults, autoStart.defaults.perAction);\n },\n};\n\n// set cursor style on mousedown\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget }) {\n if (interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\n// set cursor style on mousemove\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget }) {\n if (!interaction.mouse\n || interaction.pointerIsDown\n || interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\nInteraction.signals.on('move', function (arg) {\n const { interaction, event } = arg;\n\n if (!interaction.pointerIsDown\n || interaction.interacting()\n || !interaction.pointerWasMoved\n || !interaction.prepared.name) {\n return;\n }\n\n signals.fire('before-start', arg);\n\n const target = interaction.target;\n\n if (interaction.prepared.name && target) {\n // check manualStart and interaction limit\n if (target.options[interaction.prepared.name].manualStart\n || !withinInteractionLimit(target, interaction.element, interaction.prepared)) {\n interaction.stop(event);\n }\n else {\n interaction.start(interaction.prepared, target, interaction.element);\n }\n }\n});\n\n// Check if the current target supports the action.\n// If so, return the validated action. Otherwise, return null\nfunction validateAction (action, interactable, element, eventTarget) {\n if (utils.is.object(action)\n && interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget)\n && interactable.options[action.name].enabled\n && withinInteractionLimit(interactable, element, action)) {\n return action;\n }\n\n return null;\n}\n\nfunction validateSelector (interaction, pointer, event, matches, matchElements, eventTarget) {\n for (let i = 0, len = matches.length; i < len; i++) {\n const match = matches[i];\n const matchElement = matchElements[i];\n const action = validateAction(match.getAction(pointer, event, interaction, matchElement),\n match,\n matchElement,\n eventTarget);\n\n if (action) {\n return {\n action,\n target: match,\n element: matchElement,\n };\n }\n }\n\n return {};\n}\n\nfunction getActionInfo (interaction, pointer, event, eventTarget) {\n let matches = [];\n let matchElements = [];\n\n let element = eventTarget;\n let action = null;\n\n function pushMatches (interactable, selector, context) {\n const elements = (browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined);\n\n if (utils.matchesSelector(element, selector, elements)) {\n\n matches.push(interactable);\n matchElements.push(element);\n }\n }\n\n while (utils.is.element(element)) {\n matches = [];\n matchElements = [];\n\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && (action = validateAction(elementInteractable.getAction(pointer, event, interaction, element, eventTarget),\n elementInteractable,\n element,\n eventTarget))\n && !elementInteractable.options[action.name].manualStart) {\n return {\n element,\n action,\n target: elementInteractable,\n };\n }\n else {\n scope.interactables.forEachSelector(pushMatches, element);\n\n const actionInfo = validateSelector(interaction, pointer, event, matches, matchElements, eventTarget);\n\n if (actionInfo.action\n && !actionInfo.target.options[actionInfo.action.name].manualStart) {\n return actionInfo;\n }\n }\n\n element = utils.parentNode(element);\n }\n\n return {};\n}\n\nfunction prepare (interaction, { action, target, element }) {\n action = action || {};\n\n if (interaction.target && interaction.target.options.styleCursor) {\n interaction.target._doc.documentElement.style.cursor = '';\n }\n\n interaction.target = target;\n interaction.element = element;\n utils.copyAction(interaction.prepared, action);\n\n if (target && target.options.styleCursor) {\n const cursor = action? actions[action.name].getCursor(action) : '';\n interaction.target._doc.documentElement.style.cursor = cursor;\n }\n\n signals.fire('prepared', { interaction: interaction });\n}\n\nInteraction.signals.on('stop', function ({ interaction }) {\n const target = interaction.target;\n\n if (target && target.options.styleCursor) {\n target._doc.documentElement.style.cursor = '';\n }\n});\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (utils.is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (utils.is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n const buttons = event.buttons || ({\n 0: 1,\n 1: 4,\n 3: 8,\n 4: 16,\n })[event.button];\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\nfunction withinInteractionLimit (interactable, element, action) {\n const options = interactable.options;\n const maxActions = options[action.name].max;\n const maxPerElement = options[action.name].maxPerElement;\n let activeInteractions = 0;\n let targetCount = 0;\n let targetElementCount = 0;\n\n // no actions if any of these values == 0\n if (!(maxActions && maxPerElement && autoStart.maxInteractions)) { return; }\n\n for (let i = 0, len = scope.interactions.length; i < len; i++) {\n const interaction = scope.interactions[i];\n const otherAction = interaction.prepared.name;\n\n if (!interaction.interacting()) { continue; }\n\n activeInteractions++;\n\n if (activeInteractions >= autoStart.maxInteractions) {\n return false;\n }\n\n if (interaction.target !== interactable) { continue; }\n\n targetCount += (otherAction === action.name)|0;\n\n if (targetCount >= maxActions) {\n return false;\n }\n\n if (interaction.element === element) {\n targetElementCount++;\n\n if (otherAction !== action.name || targetElementCount >= maxPerElement) {\n return false;\n }\n }\n }\n\n return autoStart.maxInteractions > 0;\n}\n\n/*\\\n * interact.maxInteractions\n [ method ]\n **\n * Returns or sets the maximum number of concurrent interactions allowed.\n * By default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables\n * and elements, you need to enable it in the draggable, resizable and\n * gesturable `'max'` and `'maxPerElement'` options.\n **\n - newValue (number) #optional Any number. newValue <= 0 means no interactions.\n\\*/\ninteract.maxInteractions = function (newValue) {\n if (utils.is.number(newValue)) {\n autoStart.maxInteractions = newValue;\n\n return this;\n }\n\n return autoStart.maxInteractions;\n};\n\nInteractable.settingsMethods.push('styleCursor');\nInteractable.settingsMethods.push('actionChecker');\nInteractable.settingsMethods.push('ignoreFrom');\nInteractable.settingsMethods.push('allowFrom');\n\ndefaultOptions.base.actionChecker = null;\ndefaultOptions.base.styleCursor = true;\n\nutils.extend(defaultOptions.perAction, autoStart.defaults.perAction);\n\nmodule.exports = autoStart;\n","const autoStart = require('./base');\nconst Interaction = require('../Interaction');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.delayTimer = null;\n});\n\nautoStart.signals.on('prepared', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.delayTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.target, interaction.element);\n }, delay);\n }\n});\n\nInteraction.signals.on('move', function ({ interaction, duplicate }) {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.delayTimer);\n }\n});\n\n// prevent regular down->move autoStart\nautoStart.signals.on('before-start', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.prepared.name = null;\n }\n});\n","const autoStart = require('./base');\nconst scope = require('../scope');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\n\nconst { matchesSelector, parentNode } = require('../utils/domUtils');\n\nautoStart.setActionDefaults(require('../actions/drag'));\n\nautoStart.signals.on('before-start', function ({ interaction, eventTarget, dx, dy }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // check if a drag is in the correct axis\n const absX = Math.abs(dx);\n const absY = Math.abs(dy);\n const options = interaction.target.options.drag;\n const startAxis = options.startAxis;\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy');\n\n interaction.prepared.axis = options.lockAxis === 'start'\n ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n : options.lockAxis;\n\n // if the movement isn't in the startAxis of the interactable\n if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) {\n // cancel the prepared action\n interaction.prepared.name = null;\n\n // then try to get a drag from another ineractable\n\n if (!interaction.prepared.name) {\n\n let element = eventTarget;\n\n const getDraggable = function (interactable, selector, context) {\n const elements = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n if (interactable === interaction.target) { return; }\n\n if (!options.manualStart\n && !interactable.testIgnoreAllow(options, element, eventTarget)\n && matchesSelector(element, selector, elements)) {\n\n const action = interactable.getAction(interaction.downPointer,\n interaction.downEvent,\n interaction,\n element);\n\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, interactable)\n && autoStart.validateAction(action, interactable, element, eventTarget)) {\n\n return interactable;\n }\n }\n };\n\n let action = null;\n\n // check all interactables\n while (is.element(element)) {\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && elementInteractable !== interaction.target\n && !elementInteractable.options.drag.manualStart) {\n\n action = elementInteractable.getAction(interaction.downPointer, interaction.downEvent, interaction, element);\n }\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, elementInteractable)) {\n\n interaction.prepared.name = 'drag';\n interaction.target = elementInteractable;\n interaction.element = element;\n break;\n }\n\n const selectorInteractable = scope.interactables.forEachSelector(getDraggable, element);\n\n if (selectorInteractable) {\n interaction.prepared.name = 'drag';\n interaction.target = selectorInteractable;\n interaction.element = element;\n break;\n }\n\n element = parentNode(element);\n }\n }\n }\n});\n\nfunction checkStartAxis (startAxis, interactable) {\n if (!interactable) { return false; }\n\n const thisAxis = interactable.options.drag.startAxis;\n\n return (startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis);\n}\n","require('./base').setActionDefaults(require('../actions/gesture'));\n","require('./base').setActionDefaults(require('../actions/resize'));\n","module.exports = {\n base: {\n accept : null,\n preventDefault: 'auto',\n deltaSource : 'page',\n },\n\n perAction: {\n origin: { x: 0, y: 0 },\n\n // only allow left button by default\n // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n mouseButtons: 1,\n\n inertia: {\n enabled : false,\n resistance : 10, // the lambda in exponential decay\n minSpeed : 100, // target speed must be above this for inertia to start\n endSpeed : 10, // the speed at which inertia is slow enough to stop\n allowResume : true, // allow resuming an action in inertia phase\n smoothEndDuration: 300, // animate to snap/restrict endOnly if there's no inertia\n },\n },\n};\n","/* browser entry point */\n\n// Legacy browser support\nrequire('./legacyBrowsers');\n\n// inertia\nrequire('./inertia');\n\n// modifiers\nrequire('./modifiers/snap');\nrequire('./modifiers/restrict');\n\n// pointerEvents\nrequire('./pointerEvents/base');\nrequire('./pointerEvents/holdRepeat');\nrequire('./pointerEvents/interactableTargets');\n\n// delay\nrequire('./autoStart/delay');\n\n// actions\nrequire('./actions/gesture');\nrequire('./actions/resize');\nrequire('./actions/drag');\nrequire('./actions/drop');\n\n// load these modifiers after resize is loaded\nrequire('./modifiers/snapSize');\nrequire('./modifiers/restrictEdges');\nrequire('./modifiers/restrictSize');\n\n// autoStart actions\nrequire('./autoStart/gesture');\nrequire('./autoStart/resize');\nrequire('./autoStart/drag');\n\n// Interactable preventDefault setting\nrequire('./interactablePreventDefault.js');\n\n// autoScroll\nrequire('./autoScroll');\n\n// export interact\nmodule.exports = require('./interact');\n","const InteractEvent = require('./InteractEvent');\nconst Interaction = require('./Interaction');\nconst modifiers = require('./modifiers');\nconst utils = require('./utils');\nconst animationFrame = require('./utils/raf');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.inertiaStatus = {\n active : false,\n smoothEnd : false,\n allowResume: false,\n\n startEvent: null,\n upCoords : {},\n\n xe: 0, ye: 0,\n sx: 0, sy: 0,\n\n t0: 0,\n vx0: 0, vys: 0,\n duration: 0,\n\n lambda_v0: 0,\n one_ve_v0: 0,\n i : null,\n };\n\n interaction.boundInertiaFrame = () => inertiaFrame .apply(interaction);\n interaction.boundSmoothEndFrame = () => smoothEndFrame.apply(interaction);\n});\n\nInteraction.signals.on('down', function ({ interaction, event, pointer, eventTarget }) {\n const status = interaction.inertiaStatus;\n\n // Check if the down event hits the current inertia target\n if (status.active) {\n let element = eventTarget;\n\n // climb up the DOM tree from the event target\n while (utils.is.element(element)) {\n\n // if interaction element is the current inertia target element\n if (element === interaction.element) {\n // stop inertia\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n\n // update pointers to the down event's coordinates\n interaction.updatePointer(pointer);\n utils.setCoords(interaction.curCoords, interaction.pointers);\n\n // fire appropriate signals\n const signalArg = { interaction };\n Interaction.signals.fire('before-action-move', signalArg);\n Interaction.signals.fire('action-resume' , signalArg);\n\n // fire a reume event\n const resumeEvent = new InteractEvent(interaction,\n event,\n interaction.prepared.name,\n 'inertiaresume',\n interaction.element);\n\n interaction.target.fire(resumeEvent);\n interaction.prevEvent = resumeEvent;\n modifiers.resetStatuses(interaction.modifierStatuses);\n\n utils.copyCoords(interaction.prevCoords, interaction.curCoords);\n break;\n }\n\n element = utils.parentNode(element);\n }\n }\n});\n\nInteraction.signals.on('up', function ({ interaction, event }) {\n const status = interaction.inertiaStatus;\n\n if (!interaction.interacting() || status.active) { return; }\n\n const target = interaction.target;\n const options = target && target.options;\n const inertiaOptions = options && interaction.prepared.name && options[interaction.prepared.name].inertia;\n\n const now = new Date().getTime();\n const statuses = {};\n const page = utils.extend({}, interaction.curCoords.page);\n const pointerSpeed = interaction.pointerDelta.client.speed;\n\n let smoothEnd = false;\n let modifierResult;\n\n // check if inertia should be started\n const inertiaPossible = (inertiaOptions && inertiaOptions.enabled\n && interaction.prepared.name !== 'gesture'\n && event !== status.startEvent);\n\n const inertia = (inertiaPossible\n && (now - interaction.curCoords.timeStamp) < 50\n && pointerSpeed > inertiaOptions.minSpeed\n && pointerSpeed > inertiaOptions.endSpeed);\n\n const modifierArg = {\n interaction,\n pageCoords: page,\n statuses,\n preEnd: true,\n requireEndOnly: true,\n };\n\n // smoothEnd\n if (inertiaPossible && !inertia) {\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n if (modifierResult.shouldMove && modifierResult.locked) {\n smoothEnd = true;\n }\n }\n\n if (!(inertia || smoothEnd)) { return; }\n\n utils.copyCoords(status.upCoords, interaction.curCoords);\n\n interaction.pointers[0] = status.startEvent =\n new InteractEvent(interaction, event, interaction.prepared.name, 'inertiastart', interaction.element);\n\n status.t0 = now;\n\n status.active = true;\n status.allowResume = inertiaOptions.allowResume;\n interaction.simulation = status;\n\n target.fire(status.startEvent);\n\n if (inertia) {\n status.vx0 = interaction.pointerDelta.client.vx;\n status.vy0 = interaction.pointerDelta.client.vy;\n status.v0 = pointerSpeed;\n\n calcInertia(interaction, status);\n\n utils.extend(page, interaction.curCoords.page);\n\n page.x += status.xe;\n page.y += status.ye;\n\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n status.modifiedXe += modifierResult.dx;\n status.modifiedYe += modifierResult.dy;\n\n status.i = animationFrame.request(interaction.boundInertiaFrame);\n }\n else {\n status.smoothEnd = true;\n status.xe = modifierResult.dx;\n status.ye = modifierResult.dy;\n\n status.sx = status.sy = 0;\n\n status.i = animationFrame.request(interaction.boundSmoothEndFrame);\n }\n});\n\nInteraction.signals.on('stop-active', function ({ interaction }) {\n const status = interaction.inertiaStatus;\n\n if (status.active) {\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n }\n});\n\nfunction calcInertia (interaction, status) {\n const inertiaOptions = interaction.target.options[interaction.prepared.name].inertia;\n const lambda = inertiaOptions.resistance;\n const inertiaDur = -Math.log(inertiaOptions.endSpeed / status.v0) / lambda;\n\n status.x0 = interaction.prevEvent.pageX;\n status.y0 = interaction.prevEvent.pageY;\n status.t0 = status.startEvent.timeStamp / 1000;\n status.sx = status.sy = 0;\n\n status.modifiedXe = status.xe = (status.vx0 - inertiaDur) / lambda;\n status.modifiedYe = status.ye = (status.vy0 - inertiaDur) / lambda;\n status.te = inertiaDur;\n\n status.lambda_v0 = lambda / status.v0;\n status.one_ve_v0 = 1 - inertiaOptions.endSpeed / status.v0;\n}\n\nfunction inertiaFrame () {\n updateInertiaCoords(this);\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n\n const status = this.inertiaStatus;\n const options = this.target.options[this.prepared.name].inertia;\n const lambda = options.resistance;\n const t = new Date().getTime() / 1000 - status.t0;\n\n if (t < status.te) {\n\n const progress = 1 - (Math.exp(-lambda * t) - status.lambda_v0) / status.one_ve_v0;\n\n if (status.modifiedXe === status.xe && status.modifiedYe === status.ye) {\n status.sx = status.xe * progress;\n status.sy = status.ye * progress;\n }\n else {\n const quadPoint = utils.getQuadraticCurvePoint(0, 0,\n status.xe,\n status.ye,\n status.modifiedXe,\n status.modifiedYe,\n progress);\n\n status.sx = quadPoint.x;\n status.sy = quadPoint.y;\n }\n\n this.doMove();\n\n status.i = animationFrame.request(this.boundInertiaFrame);\n }\n else {\n status.sx = status.modifiedXe;\n status.sy = status.modifiedYe;\n\n this.doMove();\n this.end(status.startEvent);\n status.active = false;\n this.simulation = null;\n }\n\n utils.copyCoords(this.prevCoords, this.curCoords);\n}\n\nfunction smoothEndFrame () {\n updateInertiaCoords(this);\n\n const status = this.inertiaStatus;\n const t = new Date().getTime() - status.t0;\n const duration = this.target.options[this.prepared.name].inertia.smoothEndDuration;\n\n if (t < duration) {\n status.sx = utils.easeOutQuad(t, 0, status.xe, duration);\n status.sy = utils.easeOutQuad(t, 0, status.ye, duration);\n\n this.pointerMove(status.startEvent, status.startEvent);\n\n status.i = animationFrame.request(this.boundSmoothEndFrame);\n }\n else {\n status.sx = status.xe;\n status.sy = status.ye;\n\n this.pointerMove(status.startEvent, status.startEvent);\n this.end(status.startEvent);\n\n status.smoothEnd =\n status.active = false;\n this.simulation = null;\n }\n}\n\nfunction updateInertiaCoords (interaction) {\n const status = interaction.inertiaStatus;\n\n // return if inertia isn't running\n if (!status.active) { return; }\n\n const pageUp = status.upCoords.page;\n const clientUp = status.upCoords.client;\n\n utils.setCoords(interaction.curCoords, [ {\n pageX : pageUp.x + status.sx,\n pageY : pageUp.y + status.sy,\n clientX: clientUp.x + status.sx,\n clientY: clientUp.y + status.sy,\n } ]);\n}\n","const browser = require('./utils/browser');\nconst events = require('./utils/events');\nconst utils = require('./utils');\nconst scope = require('./scope');\nconst Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\n\nconst globalEvents = {};\n\n/*\\\n * interact\n [ method ]\n *\n * The methods of this variable can be used to set elements as\n * interactables and also to change various default settings.\n *\n * Calling it as a function and passing an element or a valid CSS selector\n * string returns an Interactable object which has various methods to\n * configure it.\n *\n - element (Element | string) The HTML or SVG Element to interact with or CSS selector\n = (object) An @Interactable\n *\n > Usage\n | interact('#draggable').draggable(true);\n |\n | var rectables = interact('rect');\n | rectables\n | .gesturable(true)\n | .on('gesturemove', function (event) {\n | // ...\n | });\n\\*/\nfunction interact (element, options) {\n let interactable = scope.interactables.get(element, options);\n\n if (!interactable) {\n interactable = new Interactable(element, options);\n interactable.events.global = globalEvents;\n }\n\n return interactable;\n}\n\n/*\\\n * interact.isSet\n [ method ]\n *\n * Check if an element has been set\n - element (Element) The Element being searched for\n = (boolean) Indicates if the element or CSS selector was previously passed to interact\n\\*/\ninteract.isSet = function (element, options) {\n return scope.interactables.indexOfElement(element, options && options.context) !== -1;\n};\n\n/*\\\n * interact.on\n [ method ]\n *\n * Adds a global listener for an InteractEvent or adds a DOM event to\n * `document`\n *\n - type (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) interact\n\\*/\ninteract.on = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.on(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.on(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n // if it is an InteractEvent type, add listener to globalEvents\n if (utils.contains(Interactable.eventTypes, type)) {\n // if this type of event was never bound\n if (!globalEvents[type]) {\n globalEvents[type] = [listener];\n }\n else {\n globalEvents[type].push(listener);\n }\n }\n // If non InteractEvent type, addEventListener to document\n else {\n events.add(scope.document, type, listener, { options });\n }\n\n return interact;\n};\n\n/*\\\n * interact.off\n [ method ]\n *\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n - type (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) interact\n \\*/\ninteract.off = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.off(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.off(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n if (!utils.contains(Interactable.eventTypes, type)) {\n events.remove(scope.document, type, listener, options);\n }\n else {\n let index;\n\n if (type in globalEvents\n && (index = utils.indexOf(globalEvents[type], listener)) !== -1) {\n globalEvents[type].splice(index, 1);\n }\n }\n\n return interact;\n};\n\n/*\\\n * interact.debug\n [ method ]\n *\n * Returns an object which exposes internal data\n = (object) An object with properties that outline the current state and expose internal functions and variables\n\\*/\ninteract.debug = function () {\n return scope;\n};\n\n// expose the functions used to calculate multi-touch properties\ninteract.getPointerAverage = utils.pointerAverage;\ninteract.getTouchBBox = utils.touchBBox;\ninteract.getTouchDistance = utils.touchDistance;\ninteract.getTouchAngle = utils.touchAngle;\n\ninteract.getElementRect = utils.getElementRect;\ninteract.getElementClientRect = utils.getElementClientRect;\ninteract.matchesSelector = utils.matchesSelector;\ninteract.closest = utils.closest;\n\n/*\\\n * interact.supportsTouch\n [ method ]\n *\n = (boolean) Whether or not the browser supports touch input\n\\*/\ninteract.supportsTouch = function () {\n return browser.supportsTouch;\n};\n\n/*\\\n * interact.supportsPointerEvent\n [ method ]\n *\n = (boolean) Whether or not the browser supports PointerEvents\n\\*/\ninteract.supportsPointerEvent = function () {\n return browser.supportsPointerEvent;\n};\n\n/*\\\n * interact.stop\n [ method ]\n *\n * Cancels all interactions (end events are not fired)\n *\n - event (Event) An event on which to call preventDefault()\n = (object) interact\n\\*/\ninteract.stop = function (event) {\n for (let i = scope.interactions.length - 1; i >= 0; i--) {\n scope.interactions[i].stop(event);\n }\n\n return interact;\n};\n\n/*\\\n * interact.pointerMoveTolerance\n [ method ]\n * Returns or sets the distance the pointer must be moved before an action\n * sequence occurs. This also affects tolerance for tap events.\n *\n - newValue (number) #optional The movement from the start position must be greater than this value\n = (number | Interactable) The current setting or interact\n\\*/\ninteract.pointerMoveTolerance = function (newValue) {\n if (utils.is.number(newValue)) {\n Interaction.pointerMoveTolerance = newValue;\n\n return this;\n }\n\n return Interaction.pointerMoveTolerance;\n};\n\ninteract.addDocument = scope.addDocument;\ninteract.removeDocument = scope.removeDocument;\n\nscope.interact = interact;\n\nmodule.exports = interact;\n","const Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\nconst scope = require('./scope');\nconst is = require('./utils/is');\nconst events = require('./utils/events');\n\nconst { nodeContains, matchesSelector } = require('./utils/domUtils');\n\n/*\\\n * Interactable.preventDefault\n [ method ]\n *\n * Returns or sets whether to prevent the browser's default behaviour\n * in response to pointer events. Can be set to:\n * - `'always'` to always prevent\n * - `'never'` to never prevent\n * - `'auto'` to let interact.js try to determine what would be best\n *\n - newValue (string) #optional `true`, `false` or `'auto'`\n = (string | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.preventDefault = function (newValue) {\n if (/^(always|never|auto)$/.test(newValue)) {\n this.options.preventDefault = newValue;\n return this;\n }\n\n if (is.bool(newValue)) {\n this.options.preventDefault = newValue? 'always' : 'never';\n return this;\n }\n\n return this.options.preventDefault;\n};\n\nInteractable.prototype.checkAndPreventDefault = function (event) {\n const setting = this.options.preventDefault;\n\n if (setting === 'never') { return; }\n\n if (setting === 'always') {\n event.preventDefault();\n return;\n }\n\n // setting === 'auto'\n\n // don't preventDefault if the browser supports passiveEvents\n // CSS touch-action and user-selecct should be used instead\n if (events.supportsOptions) {\n return;\n }\n\n // don't preventDefault of pointerdown events\n if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) {\n return;\n }\n\n // don't preventDefault on editable elements\n if (is.element(event.target)\n && matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) {\n return;\n }\n\n event.preventDefault();\n};\n\nfunction onInteractionEvent ({ interaction, event }) {\n if (interaction.target) {\n interaction.target.checkAndPreventDefault(event);\n }\n}\n\nfor (const eventSignal of ['down', 'move', 'up', 'cancel']) {\n Interaction.signals.on(eventSignal, onInteractionEvent);\n}\n\n// prevent native HTML5 drag on interact.js target elements\nInteraction.docEvents.dragstart = function preventNativeDrag (event) {\n for (const interaction of scope.interactions) {\n\n if (interaction.element\n && (interaction.element === event.target\n || nodeContains(interaction.element, event.target))) {\n\n interaction.target.checkAndPreventDefault(event);\n return;\n }\n }\n};\n","const scope = require('./scope');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst iFinder = require('./utils/interactionFinder');\nconst pointerEvents = require('./pointerEvents/base');\n\nconst { window } = require('./utils/window');\n\nconst toString = Object.prototype.toString;\n\nif (!window.Array.isArray) {\n window.Array.isArray = function (obj) {\n return toString.call(obj) === '[object Array]';\n };\n}\n\nif (!String.prototype.trim) {\n String.prototype.trim = function () {\n return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n };\n}\n\n// http://www.quirksmode.org/dom/events/click.html\n// >Events leading to dblclick\n//\n// IE8 doesn't fire down event before dblclick.\n// This workaround tries to fire a tap and doubletap after dblclick\nfunction onIE8Dblclick (event) {\n const eventTarget = event.target;\n const interaction = iFinder.search(event, event.type, eventTarget);\n\n if (!interaction) { return; }\n\n if (interaction.prevTap\n && event.clientX === interaction.prevTap.clientX\n && event.clientY === interaction.prevTap.clientY\n && eventTarget === interaction.prevTap.target) {\n\n interaction.downTargets[0] = eventTarget;\n interaction.downTimes [0] = new Date().getTime();\n\n pointerEvents.fire({\n interaction,\n event,\n eventTarget,\n pointer: event,\n type: 'tap',\n });\n }\n}\n\nif (browser.isIE8) {\n const selectFix = function (event) {\n for (const interaction of scope.interactions) {\n if (interaction.interacting()) {\n interaction.target.checkAndPreventDefault(event);\n }\n }\n };\n\n const onDocIE8 = function onDocIE8 ({ doc, win }, signalName) {\n const eventMethod = signalName.indexOf('listen') === 0\n ? events.add : events.remove;\n\n // For IE's lack of Event#preventDefault\n eventMethod(doc, 'selectstart', selectFix);\n\n if (pointerEvents) {\n eventMethod(doc, 'dblclick', onIE8Dblclick);\n }\n };\n\n scope.signals.on('add-document' , onDocIE8);\n scope.signals.on('remove-document', onDocIE8);\n}\n\nmodule.exports = null;\n","const InteractEvent = require('../InteractEvent');\nconst Interaction = require('../Interaction');\nconst extend = require('../utils/extend');\n\nconst modifiers = {\n names: [],\n\n setOffsets: function (arg) {\n const { interaction, pageCoords: page } = arg;\n const { target, element, startOffset } = interaction;\n const rect = target.getRect(element);\n\n if (rect) {\n startOffset.left = page.x - rect.left;\n startOffset.top = page.y - rect.top;\n\n startOffset.right = rect.right - page.x;\n startOffset.bottom = rect.bottom - page.y;\n\n if (!('width' in rect)) { rect.width = rect.right - rect.left; }\n if (!('height' in rect)) { rect.height = rect.bottom - rect.top ; }\n }\n else {\n startOffset.left = startOffset.top = startOffset.right = startOffset.bottom = 0;\n }\n\n arg.rect = rect;\n arg.interactable = target;\n arg.element = element;\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n\n arg.options = target.options[interaction.prepared.name][modifierName];\n\n if (!arg.options) {\n continue;\n }\n\n interaction.modifierOffsets[modifierName] = modifiers[modifierName].setOffset(arg);\n }\n },\n\n setAll: function (arg) {\n const { interaction, statuses, preEnd, requireEndOnly } = arg;\n const coords = extend({}, arg.pageCoords);\n const result = {\n dx: 0,\n dy: 0,\n changed: false,\n locked: false,\n shouldMove: true,\n };\n\n for (const modifierName of modifiers.names) {\n const modifier = modifiers[modifierName];\n const options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!shouldDo(options, preEnd, requireEndOnly)) { continue; }\n\n arg.status = arg.status = statuses[modifierName];\n arg.options = options;\n arg.offset = arg.interaction.modifierOffsets[modifierName];\n\n modifier.set(arg);\n\n if (arg.status.locked) {\n coords.x += arg.status.dx;\n coords.y += arg.status.dy;\n\n result.dx += arg.status.dx;\n result.dy += arg.status.dy;\n\n result.locked = true;\n }\n }\n\n // a move should be fired if:\n // - there are no modifiers enabled,\n // - no modifiers are \"locked\" i.e. have changed the pointer's coordinates, or\n // - the locked coords have changed since the last pointer move\n result.shouldMove = !arg.status || !result.locked || arg.status.changed;\n\n return result;\n },\n\n resetStatuses: function (statuses) {\n for (const modifierName of modifiers.names) {\n const status = statuses[modifierName] || {};\n\n status.dx = status.dy = 0;\n status.modifiedX = status.modifiedY = NaN;\n status.locked = false;\n status.changed = true;\n\n statuses[modifierName] = status;\n }\n\n return statuses;\n },\n\n start: function ({ interaction }, signalName) {\n const arg = {\n interaction,\n pageCoords: (signalName === 'action-resume' ?\n interaction.curCoords : interaction.startCoords).page,\n startOffset: interaction.startOffset,\n statuses: interaction.modifierStatuses,\n preEnd: false,\n requireEndOnly: false,\n };\n\n modifiers.setOffsets(arg);\n modifiers.resetStatuses(arg.statuses);\n\n arg.pageCoords = extend({}, interaction.startCoords.page);\n interaction.modifierResult = modifiers.setAll(arg);\n },\n};\n\nInteraction.signals.on('new', function (interaction) {\n interaction.startOffset = { left: 0, right: 0, top: 0, bottom: 0 };\n interaction.modifierOffsets = {};\n interaction.modifierStatuses = modifiers.resetStatuses({});\n interaction.modifierResult = null;\n});\n\nInteraction.signals.on('action-start' , modifiers.start);\nInteraction.signals.on('action-resume', modifiers.start);\n\nInteraction.signals.on('before-action-move', function ({ interaction, preEnd, interactingBeforeMove }) {\n const modifierResult = modifiers.setAll({\n interaction,\n preEnd,\n pageCoords: interaction.curCoords.page,\n statuses: interaction.modifierStatuses,\n requireEndOnly: false,\n });\n\n // don't fire an action move if a modifier would keep the event in the same\n // cordinates as before\n if (!modifierResult.shouldMove && interactingBeforeMove) {\n interaction._dontFireMove = true;\n }\n\n interaction.modifierResult = modifierResult;\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n for (let i = 0; i < modifiers.names.length; i++) {\n const options = interaction.target.options[interaction.prepared.name][modifiers.names[i]];\n\n // if the endOnly option is true for any modifier\n if (shouldDo(options, true, true)) {\n // fire a move event at the modified coordinates\n interaction.doMove({ event, preEnd: true });\n break;\n }\n }\n});\n\nInteractEvent.signals.on('set-xy', function (arg) {\n const { iEvent, interaction } = arg;\n const modifierArg = extend({}, arg);\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n modifierArg.options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!modifierArg.options) {\n continue;\n }\n\n const modifier = modifiers[modifierName];\n\n modifierArg.status = interaction.modifierStatuses[modifierName];\n\n iEvent[modifierName] = modifier.modifyCoords(modifierArg);\n }\n});\n\nfunction shouldDo (options, preEnd, requireEndOnly) {\n return (options && options.enabled\n && (preEnd || !options.endOnly)\n && (!requireEndOnly || options.endOnly));\n}\n\nmodule.exports = modifiers;\n","const modifiers = require('./index');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst restrict = {\n defaults: {\n enabled : false,\n endOnly : false,\n restriction: null,\n elementRect: null,\n },\n\n setOffset: function ({ rect, startOffset, options }) {\n const elementRect = options && options.elementRect;\n const offset = {};\n\n if (rect && elementRect) {\n offset.left = startOffset.left - (rect.width * elementRect.left);\n offset.top = startOffset.top - (rect.height * elementRect.top);\n\n offset.right = startOffset.right - (rect.width * (1 - elementRect.right));\n offset.bottom = startOffset.bottom - (rect.height * (1 - elementRect.bottom));\n }\n else {\n offset.left = offset.top = offset.right = offset.bottom = 0;\n }\n\n return offset;\n },\n\n set: function ({ pageCoords, interaction, status, options }) {\n if (!options) { return status; }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n\n const restriction = getRestrictionRect(options.restriction, interaction, page);\n\n if (!restriction) { return status; }\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n const rect = restriction;\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n const offset = interaction.modifierOffsets.restrict;\n\n // object is assumed to have\n // x, y, width, height or\n // left, top, right, bottom\n if ('x' in restriction && 'y' in restriction) {\n modifiedX = Math.max(Math.min(rect.x + rect.width - offset.right , page.x), rect.x + offset.left);\n modifiedY = Math.max(Math.min(rect.y + rect.height - offset.bottom, page.y), rect.y + offset.top );\n }\n else {\n modifiedX = Math.max(Math.min(rect.right - offset.right , page.x), rect.left + offset.left);\n modifiedY = Math.max(Math.min(rect.bottom - offset.bottom, page.y), rect.top + offset.top );\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const elementRect = options && options.elementRect;\n\n if (options && options.enabled\n && !(phase === 'start' && elementRect && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n getRestrictionRect,\n};\n\nfunction getRestrictionRect (value, interaction, page) {\n if (utils.is.function(value)) {\n return utils.resolveRectLike(value, interaction.target, interaction.element, [page.x, page.y, interaction]);\n } else {\n return utils.resolveRectLike(value, interaction.target, interaction.element);\n }\n}\n\nmodifiers.restrict = restrict;\nmodifiers.names.push('restrict');\n\ndefaultOptions.perAction.restrict = restrict.defaults;\n\nmodule.exports = restrict;\n","// This module adds the options.resize.restrictEdges setting which sets min and\n// max for the top, left, bottom and right edges of the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictEdges: {\n// inner: { top: 200, left: 200, right: 400, bottom: 400 },\n// outer: { top: 0, left: 0, right: 600, bottom: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst { getRestrictionRect } = require('./restrict');\n\nconst noInner = { top: +Infinity, left: +Infinity, bottom: -Infinity, right: -Infinity };\nconst noOuter = { top: -Infinity, left: -Infinity, bottom: +Infinity, right: +Infinity };\n\nconst restrictEdges = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n offset: null,\n },\n\n setOffset: function ({ interaction, startOffset, options }) {\n if (!options) {\n return utils.extend({}, startOffset);\n }\n\n const offset = getRestrictionRect(options.offset, interaction, interaction.startCoords.page);\n\n if (offset) {\n return {\n top: startOffset.top + offset.y,\n left: startOffset.left + offset.x,\n bottom: startOffset.bottom + offset.y,\n right: startOffset.right + offset.x,\n };\n }\n\n return startOffset;\n },\n\n set: function ({ pageCoords, interaction, status, offset, options }) {\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n const inner = rectUtils.xywhToTlbr(getRestrictionRect(options.inner, interaction, page)) || noInner;\n const outer = rectUtils.xywhToTlbr(getRestrictionRect(options.outer, interaction, page)) || noOuter;\n\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n if (edges.top) {\n modifiedY = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top);\n }\n else if (edges.bottom) {\n modifiedY = Math.max(Math.min(outer.bottom - offset.bottom, page.y), inner.bottom - offset.bottom);\n }\n if (edges.left) {\n modifiedX = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left);\n }\n else if (edges.right) {\n modifiedX = Math.max(Math.min(outer.right - offset.right, page.x), inner.right - offset.right);\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n if (options && options.enabled\n && !(phase === 'start' && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n noInner,\n noOuter,\n getRestrictionRect,\n};\n\nmodifiers.restrictEdges = restrictEdges;\nmodifiers.names.push('restrictEdges');\n\ndefaultOptions.perAction.restrictEdges = restrictEdges.defaults;\nresize.defaults.restrictEdges = restrictEdges.defaults;\n\nmodule.exports = restrictEdges;\n","// This module adds the options.resize.restrictSize setting which sets min and\n// max width and height for the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictSize: {\n// min: { width: -600, height: -600 },\n// max: { width: 600, height: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst restrictEdges = require('./restrictEdges');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst noMin = { width: -Infinity, height: -Infinity };\nconst noMax = { width: +Infinity, height: +Infinity };\n\nconst restrictSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n },\n\n setOffset: function ({ interaction }) {\n return interaction.startOffset;\n },\n\n set: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const rect = rectUtils.xywhToTlbr(interaction.resizeRects.inverted);\n\n const minSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.min, interaction)) || noMin;\n const maxSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.max, interaction)) || noMax;\n\n arg.options = {\n enabled: options.enabled,\n endOnly: options.endOnly,\n inner: utils.extend({}, restrictEdges.noInner),\n outer: utils.extend({}, restrictEdges.noOuter),\n };\n\n if (edges.top) {\n arg.options.inner.top = rect.bottom - minSize.height;\n arg.options.outer.top = rect.bottom - maxSize.height;\n }\n else if (edges.bottom) {\n arg.options.inner.bottom = rect.top + minSize.height;\n arg.options.outer.bottom = rect.top + maxSize.height;\n }\n if (edges.left) {\n arg.options.inner.left = rect.right - minSize.width;\n arg.options.outer.left = rect.right - maxSize.width;\n }\n else if (edges.right) {\n arg.options.inner.right = rect.left + minSize.width;\n arg.options.outer.right = rect.left + maxSize.width;\n }\n\n restrictEdges.set(arg);\n },\n\n modifyCoords: restrictEdges.modifyCoords,\n};\n\nmodifiers.restrictSize = restrictSize;\nmodifiers.names.push('restrictSize');\n\ndefaultOptions.perAction.restrictSize = restrictSize.defaults;\nresize.defaults.restrictSize = restrictSize.defaults;\n\nmodule.exports = restrictSize;\n","const modifiers = require('./index');\nconst interact = require('../interact');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst snap = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n\n relativePoints: null,\n },\n\n setOffset: function ({ interaction, interactable, element, rect, startOffset, options }) {\n const offsets = [];\n const optionsOrigin = utils.rectToXY(utils.resolveRectLike(options.origin));\n const origin = optionsOrigin || utils.getOriginXY(interactable, element, interaction.prepared.name);\n options = options || interactable.options[interaction.prepared.name].snap || {};\n\n let snapOffset;\n\n if (options.offset === 'startCoords') {\n snapOffset = {\n x: interaction.startCoords.page.x - origin.x,\n y: interaction.startCoords.page.y - origin.y,\n };\n }\n else {\n const offsetRect = utils.resolveRectLike(options.offset, interactable, element, [interaction]);\n\n snapOffset = utils.rectToXY(offsetRect) || { x: 0, y: 0 };\n }\n\n if (rect && options.relativePoints && options.relativePoints.length) {\n for (const { x: relativeX, y: relativeY } of options.relativePoints) {\n offsets.push({\n x: startOffset.left - (rect.width * relativeX) + snapOffset.x,\n y: startOffset.top - (rect.height * relativeY) + snapOffset.y,\n });\n }\n }\n else {\n offsets.push(snapOffset);\n }\n\n return offsets;\n },\n\n set: function ({ interaction, pageCoords, status, options, offset: offsets }) {\n const targets = [];\n let target;\n let page;\n let i;\n\n if (status.useStatusXY) {\n page = { x: status.x, y: status.y };\n }\n else {\n const origin = utils.getOriginXY(interaction.target, interaction.element, interaction.prepared.name);\n\n page = utils.extend({}, pageCoords);\n\n page.x -= origin.x;\n page.y -= origin.y;\n }\n\n status.realX = page.x;\n status.realY = page.y;\n\n let len = options.targets? options.targets.length : 0;\n\n for (const { x: offsetX, y: offsetY } of offsets) {\n const relativeX = page.x - offsetX;\n const relativeY = page.y - offsetY;\n\n for (const snapTarget of options.targets) {\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n targets.push({\n x: utils.is.number(target.x) ? (target.x + offsetX) : relativeX,\n y: utils.is.number(target.y) ? (target.y + offsetY) : relativeY,\n\n range: utils.is.number(target.range)? target.range: options.range,\n });\n }\n }\n\n const closest = {\n target: null,\n inRange: false,\n distance: 0,\n range: 0,\n dx: 0,\n dy: 0,\n };\n\n for (i = 0, len = targets.length; i < len; i++) {\n target = targets[i];\n\n const range = target.range;\n const dx = target.x - page.x;\n const dy = target.y - page.y;\n const distance = utils.hypot(dx, dy);\n let inRange = distance <= range;\n\n // Infinite targets count as being out of range\n // compared to non infinite ones that are in range\n if (range === Infinity && closest.inRange && closest.range !== Infinity) {\n inRange = false;\n }\n\n if (!closest.target || (inRange\n // is the closest target in range?\n ? (closest.inRange && range !== Infinity\n // the pointer is relatively deeper in this target\n ? distance / range < closest.distance / closest.range\n // this target has Infinite range and the closest doesn't\n : (range === Infinity && closest.range !== Infinity)\n // OR this target is closer that the previous closest\n || distance < closest.distance)\n // The other is not in range and the pointer is closer to this target\n : (!closest.inRange && distance < closest.distance))) {\n\n closest.target = target;\n closest.distance = distance;\n closest.range = range;\n closest.inRange = inRange;\n closest.dx = dx;\n closest.dy = dy;\n\n status.range = range;\n }\n }\n\n let snapChanged;\n\n if (closest.target) {\n snapChanged = (status.modifiedX !== closest.target.x || status.modifiedY !== closest.target.y);\n\n status.modifiedX = closest.target.x;\n status.modifiedY = closest.target.y;\n }\n else {\n snapChanged = true;\n\n status.modifiedX = NaN;\n status.modifiedY = NaN;\n }\n\n status.dx = closest.dx;\n status.dy = closest.dy;\n\n status.changed = (snapChanged || (closest.inRange && !status.locked));\n status.locked = closest.inRange;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const relativePoints = options && options.relativePoints;\n\n if (options && options.enabled\n && !(phase === 'start' && relativePoints && relativePoints.length)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n }\n\n return {\n range : status.range,\n locked : status.locked,\n x : status.modifiedX,\n y : status.modifiedY,\n realX : status.realX,\n realY : status.realY,\n dx : status.dx,\n dy : status.dy,\n };\n }\n },\n};\n\ninteract.createSnapGrid = function (grid) {\n return function (x, y) {\n const limits = grid.limits || {\n left : -Infinity,\n right : Infinity,\n top : -Infinity,\n bottom: Infinity,\n };\n let offsetX = 0;\n let offsetY = 0;\n\n if (utils.is.object(grid.offset)) {\n offsetX = grid.offset.x;\n offsetY = grid.offset.y;\n }\n\n const gridx = Math.round((x - offsetX) / grid.x);\n const gridy = Math.round((y - offsetY) / grid.y);\n\n const newX = Math.max(limits.left, Math.min(limits.right , gridx * grid.x + offsetX));\n const newY = Math.max(limits.top , Math.min(limits.bottom, gridy * grid.y + offsetY));\n\n return {\n x: newX,\n y: newY,\n range: grid.range,\n };\n };\n};\n\nmodifiers.snap = snap;\nmodifiers.names.push('snap');\n\ndefaultOptions.perAction.snap = snap.defaults;\n\nmodule.exports = snap;\n","// This module allows snapping of the size of targets during resize\n// interactions.\n\nconst modifiers = require('./index');\nconst snap = require('./snap');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\nconst utils = require('../utils/');\n\nconst snapSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n },\n\n setOffset: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.edges;\n\n if (!edges) { return; }\n\n arg.options = {\n relativePoints: [{\n x: edges.left? 0 : 1,\n y: edges.top ? 0 : 1,\n }],\n origin: { x: 0, y: 0 },\n offset: 'self',\n range: options.range,\n };\n\n const offsets = snap.setOffset(arg);\n arg.options = options;\n\n return offsets;\n },\n\n set: function (arg) {\n const { interaction, options, offset, pageCoords } = arg;\n const page = utils.extend({}, pageCoords);\n const relativeX = page.x - offset[0].x;\n const relativeY = page.y - offset[0].y;\n\n arg.options = utils.extend({}, options);\n arg.options.targets = [];\n\n for (const snapTarget of options.targets) {\n let target;\n\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n if ('width' in target && 'height' in target) {\n target.x = target.width;\n target.y = target.height;\n }\n\n arg.options.targets.push(target);\n }\n\n snap.set(arg);\n },\n\n modifyCoords: function (arg) {\n const { options } = arg;\n\n arg.options = utils.extend({}, options);\n arg.options.enabled = options.enabled;\n arg.options.relativePoints = [null];\n\n snap.modifyCoords(arg);\n },\n};\n\nmodifiers.snapSize = snapSize;\nmodifiers.names.push('snapSize');\n\ndefaultOptions.perAction.snapSize = snapSize.defaults;\nresize.defaults.snapSize = snapSize.defaults;\n\nmodule.exports = snapSize;\n","const pointerUtils = require('../utils/pointerUtils');\n\nmodule.exports = class PointerEvent {\n constructor (type, pointer, event, eventTarget, interaction) {\n pointerUtils.pointerExtend(this, event);\n\n if (event !== pointer) {\n pointerUtils.pointerExtend(this, pointer);\n }\n\n this.interaction = interaction;\n\n this.timeStamp = new Date().getTime();\n this.originalEvent = event;\n this.type = type;\n this.pointerId = pointerUtils.getPointerId(pointer);\n this.pointerType = pointerUtils.getPointerType(pointer);\n this.target = eventTarget;\n this.currentTarget = null;\n\n if (type === 'tap') {\n const pointerIndex = interaction.getPointerIndex(pointer);\n this.dt = this.timeStamp - interaction.downTimes[pointerIndex];\n\n const interval = this.timeStamp - interaction.tapTime;\n\n this.double = !!(interaction.prevTap\n && interaction.prevTap.type !== 'doubletap'\n && interaction.prevTap.target === this.target\n && interval < 500);\n }\n else if (type === 'doubletap') {\n this.dt = pointer.timeStamp - interaction.tapTime;\n }\n }\n\n subtractOrigin ({ x: originX, y: originY }) {\n this.pageX -= originX;\n this.pageY -= originY;\n this.clientX -= originX;\n this.clientY -= originY;\n\n return this;\n }\n\n addOrigin ({ x: originX, y: originY }) {\n this.pageX += originX;\n this.pageY += originY;\n this.clientX += originX;\n this.clientY += originY;\n\n return this;\n }\n\n preventDefault () {\n this.originalEvent.preventDefault();\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n};\n","const PointerEvent = require('./PointerEvent');\nconst Interaction = require('../Interaction');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst defaults = require('../defaultOptions');\nconst signals = require('../utils/Signals').new();\nconst { filter } = require('../utils/arr');\n\nconst simpleSignals = [ 'down', 'up', 'cancel' ];\nconst simpleEvents = [ 'down', 'up', 'cancel' ];\n\nconst pointerEvents = {\n PointerEvent,\n fire,\n collectEventTargets,\n signals,\n defaults: {\n holdDuration: 600,\n ignoreFrom : null,\n allowFrom : null,\n origin : { x: 0, y: 0 },\n },\n types: [\n 'down',\n 'move',\n 'up',\n 'cancel',\n 'tap',\n 'doubletap',\n 'hold',\n ],\n};\n\nfunction fire (arg) {\n const {\n interaction, pointer, event, eventTarget,\n type = arg.pointerEvent.type,\n targets = collectEventTargets(arg),\n pointerEvent = new PointerEvent(type, pointer, event, eventTarget, interaction),\n } = arg;\n\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n targets,\n type,\n pointerEvent,\n };\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n\n for (const prop in target.props || {}) {\n pointerEvent[prop] = target.props[prop];\n }\n\n const origin = utils.getOriginXY(target.eventable, target.element);\n\n pointerEvent.subtractOrigin(origin);\n pointerEvent.eventable = target.eventable;\n pointerEvent.currentTarget = target.element;\n\n target.eventable.fire(pointerEvent);\n\n pointerEvent.addOrigin(origin);\n\n if (pointerEvent.immediatePropagationStopped\n || (pointerEvent.propagationStopped\n && (i + 1) < targets.length && targets[i + 1].element !== pointerEvent.currentTarget)) {\n break;\n }\n }\n\n signals.fire('fired', signalArg);\n\n if (type === 'tap') {\n // if pointerEvent should make a double tap, create and fire a doubletap\n // PointerEvent and use that as the prevTap\n const prevTap = pointerEvent.double\n ? fire({\n interaction, pointer, event, eventTarget,\n type: 'doubletap',\n })\n : pointerEvent;\n\n interaction.prevTap = prevTap;\n interaction.tapTime = prevTap.timeStamp;\n }\n\n return pointerEvent;\n}\n\nfunction collectEventTargets ({ interaction, pointer, event, eventTarget, type }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n // do not fire a tap event if the pointer was moved before being lifted\n if (type === 'tap' && (interaction.pointerWasMoved\n // or if the pointerup target is different to the pointerdown target\n || !(interaction.downTargets[pointerIndex] && interaction.downTargets[pointerIndex] === eventTarget))) {\n return [];\n }\n\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n path,\n targets: [],\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (type === 'hold') {\n signalArg.targets = filter(signalArg.targets, target =>\n target.eventable.options.holdDuration === interaction.holdTimers[pointerIndex].duration);\n }\n\n return signalArg.targets;\n}\n\nInteraction.signals.on('update-pointer-down', function ({ interaction, pointerIndex }) {\n interaction.holdTimers[pointerIndex] = { duration: Infinity, timeout: null };\n});\n\nInteraction.signals.on('remove-pointer', function ({ interaction, pointerIndex }) {\n interaction.holdTimers.splice(pointerIndex, 1);\n});\n\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget, duplicateMove }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n if (!duplicateMove && (!interaction.pointerIsDown || interaction.pointerWasMoved)) {\n if (interaction.pointerIsDown) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n\n fire({\n interaction, pointer, event, eventTarget,\n type: 'move',\n });\n }\n});\n\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget, pointerIndex }) {\n // copy event to be used in timeout for IE8\n const eventCopy = browser.isIE8? utils.extend({}, event) : event;\n\n const timer = interaction.holdTimers[pointerIndex];\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'hold',\n targets: [],\n path,\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (!signalArg.targets.length) { return; }\n\n let minDuration = Infinity;\n\n for (let i = 0; i < signalArg.targets.length; i++) {\n const target = signalArg.targets[i];\n const holdDuration = target.eventable.options.holdDuration;\n\n if (holdDuration < minDuration) {\n minDuration = holdDuration;\n }\n }\n\n timer.duration = minDuration;\n timer.timeout = setTimeout(function () {\n fire({\n interaction,\n eventTarget,\n pointer: browser.isIE8? eventCopy : pointer,\n event: eventCopy,\n type: 'hold',\n });\n }, minDuration);\n});\n\nInteraction.signals.on('up', ({ interaction, pointer, event, eventTarget }) => {\n if (!interaction.pointerWasMoved) {\n fire({ interaction, eventTarget, pointer, event, type: 'tap' });\n }\n});\n\n['up', 'cancel'].forEach(function (signalName) {\n Interaction.signals.on(signalName, function ({ interaction, pointerIndex }) {\n if (interaction.holdTimers[pointerIndex]) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n });\n});\n\nfunction createSignalListener (type) {\n return function ({ interaction, pointer, event, eventTarget }) {\n fire({ interaction, eventTarget, pointer, event, type });\n };\n}\n\nfor (let i = 0; i < simpleSignals.length; i++) {\n Interaction.signals.on(simpleSignals[i], createSignalListener(simpleEvents[i]));\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.prevTap = null; // the most recent tap event on this interaction\n interaction.tapTime = 0; // time of the most recent tap event\n interaction.holdTimers = []; // [{ duration, timeout }]\n});\n\ndefaults.pointerEvents = pointerEvents.defaults;\nmodule.exports = pointerEvents;\n","const pointerEvents = require('./base');\nconst Interaction = require('../Interaction');\n\npointerEvents.signals.on('new', onNew);\npointerEvents.signals.on('fired', onFired);\n\nfor (const signal of ['move', 'up', 'cancel', 'endall']) {\n Interaction.signals.on(signal, endHoldRepeat);\n}\n\nfunction onNew ({ pointerEvent }) {\n if (pointerEvent.type !== 'hold') { return; }\n\n pointerEvent.count = (pointerEvent.count || 0) + 1;\n}\n\nfunction onFired ({ interaction, pointerEvent, eventTarget, targets }) {\n if (pointerEvent.type !== 'hold' || !targets.length) { return; }\n\n // get the repeat interval from the first eventable\n const interval = targets[0].eventable.options.holdRepeatInterval;\n\n // don't repeat if the interval is 0 or less\n if (interval <= 0) { return; }\n\n // set a timeout to fire the holdrepeat event\n interaction.holdIntervalHandle = setTimeout(function () {\n pointerEvents.fire({\n interaction,\n eventTarget,\n type: 'hold',\n pointer: pointerEvent,\n event: pointerEvent,\n });\n }, interval);\n}\n\nfunction endHoldRepeat ({ interaction }) {\n // set the interaction's holdStopTime property\n // to stop further holdRepeat events\n if (interaction.holdIntervalHandle) {\n clearInterval(interaction.holdIntervalHandle);\n interaction.holdIntervalHandle = null;\n }\n}\n\n// don't repeat by default\npointerEvents.defaults.holdRepeatInterval = 0;\npointerEvents.types.push('holdrepeat');\n\nmodule.exports = {\n onNew,\n onFired,\n endHoldRepeat,\n};\n","const pointerEvents = require('./base');\nconst Interactable = require('../Interactable');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\nconst scope = require('../scope');\nconst extend = require('../utils/extend');\nconst { merge } = require('../utils/arr');\n\npointerEvents.signals.on('collect-targets', function ({ targets, element, type, eventTarget }) {\n function collectSelectors (interactable, selector, context) {\n const els = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && is.element(element)\n && domUtils.matchesSelector(element, selector, els)\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n const interactable = scope.interactables.get(element);\n\n if (interactable) {\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n scope.interactables.forEachSelector(collectSelectors, element);\n});\n\nInteractable.signals.on('new', function ({ interactable }) {\n interactable.events.getRect = function (element) {\n return interactable.getRect(element);\n };\n});\n\nInteractable.signals.on('set', function ({ interactable, options }) {\n extend(interactable.events.options, pointerEvents.defaults);\n extend(interactable.events.options, options);\n});\n\nmerge(Interactable.eventTypes, pointerEvents.types);\n\nInteractable.prototype.pointerEvents = function (options) {\n extend(this.events.options, options);\n\n return this;\n};\n\nconst __backCompatOption = Interactable.prototype._backCompatOption;\n\nInteractable.prototype._backCompatOption = function (optionName, newValue) {\n const ret = __backCompatOption.call(this, optionName, newValue);\n\n if (ret === this) {\n this.events.options[optionName] = newValue;\n }\n\n return ret;\n};\n\nInteractable.settingsMethods.push('pointerEvents');\n","const utils = require('./utils');\nconst events = require('./utils/events');\nconst signals = require('./utils/Signals').new();\n\nconst scope = {\n signals,\n events,\n utils,\n\n // main document\n document: require('./utils/domObjects').document,\n // all documents being listened to\n documents: [],\n\n addDocument: function (doc, win) {\n // do nothing if document is already known\n if (utils.contains(scope.documents, doc)) { return false; }\n\n win = win || scope.getWindow(doc);\n\n scope.documents.push(doc);\n events.documents.push(doc);\n\n // don't add an unload event for the main document\n // so that the page may be cached in browser history\n if (doc !== scope.document) {\n events.add(win, 'unload', scope.onWindowUnload);\n }\n\n signals.fire('add-document', { doc, win });\n },\n\n removeDocument: function (doc, win) {\n const index = utils.indexOf(scope.documents, doc);\n\n win = win || scope.getWindow(doc);\n\n events.remove(win, 'unload', scope.onWindowUnload);\n\n scope.documents.splice(index, 1);\n events.documents.splice(index, 1);\n\n signals.fire('remove-document', { win, doc });\n },\n\n onWindowUnload: function () {\n scope.removeDocument(this.document, this);\n },\n};\n\nmodule.exports = scope;\n","const { indexOf } = require('./arr');\n\nclass Signals {\n constructor () {\n this.listeners = {\n // signalName: [listeners],\n };\n }\n\n on (name, listener) {\n if (!this.listeners[name]) {\n this.listeners[name] = [listener];\n return;\n }\n\n this.listeners[name].push(listener);\n }\n\n off (name, listener) {\n if (!this.listeners[name]) { return; }\n\n const index = indexOf(this.listeners[name], listener);\n\n if (index !== -1) {\n this.listeners[name].splice(index, 1);\n }\n }\n\n fire (name, arg) {\n const targetListeners = this.listeners[name];\n\n if (!targetListeners) { return; }\n\n for (let i = 0; i < targetListeners.length; i++) {\n if (targetListeners[i](arg, name) === false) {\n return;\n }\n }\n }\n}\n\nSignals.new = function () {\n return new Signals();\n};\n\nmodule.exports = Signals;\n","function indexOf (array, target) {\n for (let i = 0, len = array.length; i < len; i++) {\n if (array[i] === target) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction contains (array, target) {\n return indexOf(array, target) !== -1;\n}\n\nfunction merge (target, source) {\n for (let i = 0; i < source.length; i++) {\n target.push(source[i]);\n }\n\n return target;\n}\n\nfunction filter (array, test) {\n const result = [];\n\n for (let i = 0; i < array.length; i++) {\n if (test(array[i])) {\n result.push(array[i]);\n }\n }\n\n return result;\n}\n\nmodule.exports = {\n indexOf,\n contains,\n merge,\n filter,\n};\n","const { window } = require('./window');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst Element = domObjects.Element;\nconst navigator = window.navigator;\n\nconst browser = {\n // Does the browser support touch input?\n supportsTouch: !!(('ontouchstart' in window) || is.function(window.DocumentTouch)\n && domObjects.document instanceof window.DocumentTouch),\n\n // Does the browser support PointerEvents\n supportsPointerEvent: !!domObjects.PointerEvent,\n\n isIE8: ('attachEvent' in window) && !('addEventListener' in window),\n\n // Opera Mobile must be handled differently\n isOperaMobile: (navigator.appName === 'Opera'\n && browser.supportsTouch\n && navigator.userAgent.match('Presto')),\n\n // scrolling doesn't change the result of getClientRects on iOS 7\n isIOS7: (/iP(hone|od|ad)/.test(navigator.platform)\n && /OS 7[^\\d]/.test(navigator.appVersion)),\n\n isIe9OrOlder: /MSIE (8|9)/.test(navigator.userAgent),\n\n // prefix matchesSelector\n prefixedMatchesSelector: 'matches' in Element.prototype\n ? 'matches': 'webkitMatchesSelector' in Element.prototype\n ? 'webkitMatchesSelector': 'mozMatchesSelector' in Element.prototype\n ? 'mozMatchesSelector': 'oMatchesSelector' in Element.prototype\n ? 'oMatchesSelector': 'msMatchesSelector',\n\n useMatchesSelectorPolyfill: false,\n\n pEventTypes: (domObjects.PointerEvent\n ? (domObjects.PointerEvent === window.MSPointerEvent\n ? {\n up: 'MSPointerUp',\n down: 'MSPointerDown',\n over: 'mouseover',\n out: 'mouseout',\n move: 'MSPointerMove',\n cancel: 'MSPointerCancel',\n }\n : {\n up: 'pointerup',\n down: 'pointerdown',\n over: 'pointerover',\n out: 'pointerout',\n move: 'pointermove',\n cancel: 'pointercancel',\n })\n : null),\n\n // because Webkit and Opera still use 'mousewheel' event type\n wheelEvent: 'onmousewheel' in domObjects.document? 'mousewheel': 'wheel',\n\n};\n\nbrowser.useMatchesSelectorPolyfill = !is.function(Element.prototype[browser.prefixedMatchesSelector]);\n\nmodule.exports = browser;\n","const domObjects = {};\nconst win = require('./window').window;\n\nfunction blank () {}\n\ndomObjects.document = win.document;\ndomObjects.DocumentFragment = win.DocumentFragment || blank;\ndomObjects.SVGElement = win.SVGElement || blank;\ndomObjects.SVGSVGElement = win.SVGSVGElement || blank;\ndomObjects.SVGElementInstance = win.SVGElementInstance || blank;\ndomObjects.Element = win.Element || blank;\ndomObjects.HTMLElement = win.HTMLElement || domObjects.Element;\n\ndomObjects.Event = win.Event;\ndomObjects.Touch = win.Touch || blank;\ndomObjects.PointerEvent = (win.PointerEvent || win.MSPointerEvent);\n\nmodule.exports = domObjects;\n","const win = require('./window');\nconst browser = require('./browser');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst domUtils = {\n nodeContains: function (parent, child) {\n while (child) {\n if (child === parent) {\n return true;\n }\n\n child = child.parentNode;\n }\n\n return false;\n },\n\n closest: function (element, selector) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) { return element; }\n\n element = domUtils.parentNode(element);\n }\n\n return null;\n },\n\n parentNode: function (node) {\n let parent = node.parentNode;\n\n if (is.docFrag(parent)) {\n // skip past #shado-root fragments\n while ((parent = parent.host) && is.docFrag(parent)) {\n continue;\n }\n\n return parent;\n }\n\n return parent;\n },\n\n // taken from http://tanalin.com/en/blog/2012/12/matches-selector-ie8/ and modified\n matchesSelectorPolyfill: browser.useMatchesSelectorPolyfill\n ? function (element, selector, elems) {\n elems = elems || element.parentNode.querySelectorAll(selector);\n\n for (let i = 0, len = elems.length; i < len; i++) {\n if (elems[i] === element) {\n return true;\n }\n }\n\n return false;\n }\n : null,\n\n matchesSelector: function (element, selector, nodeList) {\n if (browser.useMatchesSelectorPolyfill) {\n return domUtils.matchesSelectorPolyfill(element, selector, nodeList);\n }\n\n // remove /deep/ from selectors if shadowDOM polyfill is used\n if (win.window !== win.realWindow) {\n selector = selector.replace(/\\/deep\\//g, ' ');\n }\n\n return element[browser.prefixedMatchesSelector](selector);\n },\n\n // Test for the element that's \"above\" all other qualifiers\n indexOfDeepestElement: function (elements) {\n let deepestZoneParents = [];\n let dropzoneParents = [];\n let dropzone;\n let deepestZone = elements[0];\n let index = deepestZone? 0: -1;\n let parent;\n let child;\n let i;\n let n;\n\n for (i = 1; i < elements.length; i++) {\n dropzone = elements[i];\n\n // an element might belong to multiple selector dropzones\n if (!dropzone || dropzone === deepestZone) {\n continue;\n }\n\n if (!deepestZone) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n // check if the deepest or current are document.documentElement or document.rootElement\n // - if the current dropzone is, do nothing and continue\n if (dropzone.parentNode === dropzone.ownerDocument) {\n continue;\n }\n // - if deepest is, update with the current dropzone and continue to next\n else if (deepestZone.parentNode === dropzone.ownerDocument) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n if (!deepestZoneParents.length) {\n parent = deepestZone;\n while (parent.parentNode && parent.parentNode !== parent.ownerDocument) {\n deepestZoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n }\n\n // if this element is an svg element and the current deepest is\n // an HTMLElement\n if (deepestZone instanceof domObjects.HTMLElement\n && dropzone instanceof domObjects.SVGElement\n && !(dropzone instanceof domObjects.SVGSVGElement)) {\n\n if (dropzone === deepestZone.parentNode) {\n continue;\n }\n\n parent = dropzone.ownerSVGElement;\n }\n else {\n parent = dropzone;\n }\n\n dropzoneParents = [];\n\n while (parent.parentNode !== parent.ownerDocument) {\n dropzoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n\n n = 0;\n\n // get (position of last common ancestor) + 1\n while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) {\n n++;\n }\n\n const parents = [\n dropzoneParents[n - 1],\n dropzoneParents[n],\n deepestZoneParents[n],\n ];\n\n child = parents[0].lastChild;\n\n while (child) {\n if (child === parents[1]) {\n deepestZone = dropzone;\n index = i;\n deepestZoneParents = [];\n\n break;\n }\n else if (child === parents[2]) {\n break;\n }\n\n child = child.previousSibling;\n }\n }\n\n return index;\n },\n\n matchesUpTo: function (element, selector, limit) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) {\n return true;\n }\n\n element = domUtils.parentNode(element);\n\n if (element === limit) {\n return domUtils.matchesSelector(element, selector);\n }\n }\n\n return false;\n },\n\n getActualElement: function (element) {\n return (element instanceof domObjects.SVGElementInstance\n ? element.correspondingUseElement\n : element);\n },\n\n getScrollXY: function (relevantWindow) {\n relevantWindow = relevantWindow || win.window;\n return {\n x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft,\n y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop,\n };\n },\n\n getElementClientRect: function (element) {\n const clientRect = (element instanceof domObjects.SVGElement\n ? element.getBoundingClientRect()\n : element.getClientRects()[0]);\n\n return clientRect && {\n left : clientRect.left,\n right : clientRect.right,\n top : clientRect.top,\n bottom: clientRect.bottom,\n width : clientRect.width || clientRect.right - clientRect.left,\n height: clientRect.height || clientRect.bottom - clientRect.top,\n };\n },\n\n getElementRect: function (element) {\n const clientRect = domUtils.getElementClientRect(element);\n\n if (!browser.isIOS7 && clientRect) {\n const scroll = domUtils.getScrollXY(win.getWindow(element));\n\n clientRect.left += scroll.x;\n clientRect.right += scroll.x;\n clientRect.top += scroll.y;\n clientRect.bottom += scroll.y;\n }\n\n return clientRect;\n },\n\n getPath: function (element) {\n const path = [];\n\n while (element) {\n path.push(element);\n element = domUtils.parentNode(element);\n }\n\n return path;\n },\n\n trySelector: value => {\n if (!is.string(value)) { return false; }\n\n // an exception will be raised if it is invalid\n domObjects.document.querySelector(value);\n return true;\n },\n};\n\nmodule.exports = domUtils;\n","const is = require('./is');\nconst domUtils = require('./domUtils');\nconst pExtend = require('./pointerExtend');\n\nconst { window, getWindow } = require('./window');\nconst { indexOf, contains } = require('./arr');\n\nconst useAttachEvent = ('attachEvent' in window) && !('addEventListener' in window);\nconst addEvent = useAttachEvent? 'attachEvent': 'addEventListener';\nconst removeEvent = useAttachEvent? 'detachEvent': 'removeEventListener';\nconst on = useAttachEvent? 'on': '';\n\nconst elements = [];\nconst targets = [];\nconst attachedListeners = [];\n\n// {\n// type: {\n// selectors: ['selector', ...],\n// contexts : [document, ...],\n// listeners: [[listener, capture, passive], ...]\n// }\n// }\nconst delegatedEvents = {};\n\nconst documents = [];\n\nconst supportsOptions = !useAttachEvent && (() => {\n let supported = false;\n\n window.document.createElement('div').addEventListener('test', null, {\n get capture () { supported = true; },\n });\n\n return supported;\n})();\n\nfunction add (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n let elementIndex = indexOf(elements, element);\n let target = targets[elementIndex];\n\n if (!target) {\n target = {\n events: {},\n typeCount: 0,\n };\n\n elementIndex = elements.push(element) - 1;\n targets.push(target);\n\n attachedListeners.push(useAttachEvent\n ? {\n supplied: [],\n wrapped : [],\n useCount: [],\n }\n : null);\n }\n\n if (!target.events[type]) {\n target.events[type] = [];\n target.typeCount++;\n }\n\n if (!contains(target.events[type], listener)) {\n let ret;\n\n if (useAttachEvent) {\n const { supplied, wrapped, useCount } = attachedListeners[elementIndex];\n const listenerIndex = indexOf(supplied, listener);\n\n const wrappedListener = wrapped[listenerIndex] || function (event) {\n if (!event.immediatePropagationStopped) {\n event.target = event.srcElement;\n event.currentTarget = element;\n\n event.preventDefault = event.preventDefault || preventDef;\n event.stopPropagation = event.stopPropagation || stopProp;\n event.stopImmediatePropagation = event.stopImmediatePropagation || stopImmProp;\n\n if (/mouse|click/.test(event.type)) {\n event.pageX = event.clientX + getWindow(element).document.documentElement.scrollLeft;\n event.pageY = event.clientY + getWindow(element).document.documentElement.scrollTop;\n }\n\n listener(event);\n }\n };\n\n ret = element[addEvent](on + type, wrappedListener, !!options.capture);\n\n if (listenerIndex === -1) {\n supplied.push(listener);\n wrapped.push(wrappedListener);\n useCount.push(1);\n }\n else {\n useCount[listenerIndex]++;\n }\n }\n else {\n ret = element[addEvent](type, listener, supportsOptions? options : !!options.capture);\n }\n target.events[type].push(listener);\n\n return ret;\n }\n}\n\nfunction remove (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const elementIndex = indexOf(elements, element);\n const target = targets[elementIndex];\n\n if (!target || !target.events) {\n return;\n }\n\n let wrappedListener = listener;\n let listeners;\n let listenerIndex;\n\n if (useAttachEvent) {\n listeners = attachedListeners[elementIndex];\n listenerIndex = indexOf(listeners.supplied, listener);\n wrappedListener = listeners.wrapped[listenerIndex];\n }\n\n if (type === 'all') {\n for (type in target.events) {\n if (target.events.hasOwnProperty(type)) {\n remove(element, type, 'all');\n }\n }\n return;\n }\n\n if (target.events[type]) {\n const len = target.events[type].length;\n\n if (listener === 'all') {\n for (let i = 0; i < len; i++) {\n remove(element, type, target.events[type][i], options);\n }\n return;\n }\n else {\n for (let i = 0; i < len; i++) {\n if (target.events[type][i] === listener) {\n element[removeEvent](on + type, wrappedListener, supportsOptions? options : !!options.capture);\n target.events[type].splice(i, 1);\n\n if (useAttachEvent && listeners) {\n listeners.useCount[listenerIndex]--;\n if (listeners.useCount[listenerIndex] === 0) {\n listeners.supplied.splice(listenerIndex, 1);\n listeners.wrapped.splice(listenerIndex, 1);\n listeners.useCount.splice(listenerIndex, 1);\n }\n }\n\n break;\n }\n }\n }\n\n if (target.events[type] && target.events[type].length === 0) {\n target.events[type] = null;\n target.typeCount--;\n }\n }\n\n if (!target.typeCount) {\n targets.splice(elementIndex, 1);\n elements.splice(elementIndex, 1);\n attachedListeners.splice(elementIndex, 1);\n }\n}\n\nfunction addDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n if (!delegatedEvents[type]) {\n delegatedEvents[type] = {\n selectors: [],\n contexts : [],\n listeners: [],\n };\n\n // add delegate listener functions\n for (let i = 0; i < documents.length; i++) {\n add(documents[i], type, delegateListener);\n add(documents[i], type, delegateUseCapture, true);\n }\n }\n\n const delegated = delegatedEvents[type];\n let index;\n\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n break;\n }\n }\n\n if (index === -1) {\n index = delegated.selectors.length;\n\n delegated.selectors.push(selector);\n delegated.contexts .push(context);\n delegated.listeners.push([]);\n }\n\n // keep listener and capture and passive flags\n delegated.listeners[index].push([listener, !!options.capture, options.passive]);\n}\n\nfunction removeDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const delegated = delegatedEvents[type];\n let matchFound = false;\n let index;\n\n if (!delegated) { return; }\n\n // count from last index of delegated to 0\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n // look for matching selector and context Node\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n\n const listeners = delegated.listeners[index];\n\n // each item of the listeners array is an array: [function, capture, passive]\n for (let i = listeners.length - 1; i >= 0; i--) {\n const [fn, capture, passive] = listeners[i];\n\n // check if the listener functions and capture and passive flags match\n if (fn === listener && capture === !!options.capture && passive === options.passive) {\n // remove the listener from the array of listeners\n listeners.splice(i, 1);\n\n // if all listeners for this interactable have been removed\n // remove the interactable from the delegated arrays\n if (!listeners.length) {\n delegated.selectors.splice(index, 1);\n delegated.contexts .splice(index, 1);\n delegated.listeners.splice(index, 1);\n\n // remove delegate function from context\n remove(context, type, delegateListener);\n remove(context, type, delegateUseCapture, true);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegatedEvents[type] = null;\n }\n }\n\n // only remove one listener\n matchFound = true;\n break;\n }\n }\n\n if (matchFound) { break; }\n }\n }\n}\n\n// bound to the interactable context when a DOM event\n// listener is added to a selector interactable\nfunction delegateListener (event, optionalArg) {\n const options = getOptions(optionalArg);\n const fakeEvent = {};\n const delegated = delegatedEvents[event.type];\n const eventTarget = (domUtils.getActualElement(event.path\n ? event.path[0]\n : event.target));\n let element = eventTarget;\n\n // duplicate the event so that currentTarget can be changed\n pExtend(fakeEvent, event);\n\n fakeEvent.originalEvent = event;\n fakeEvent.preventDefault = preventOriginalDefault;\n\n // climb up document tree looking for selector matches\n while (is.element(element)) {\n for (let i = 0; i < delegated.selectors.length; i++) {\n const selector = delegated.selectors[i];\n const context = delegated.contexts[i];\n\n if (domUtils.matchesSelector(element, selector)\n && domUtils.nodeContains(context, eventTarget)\n && domUtils.nodeContains(context, element)) {\n\n const listeners = delegated.listeners[i];\n\n fakeEvent.currentTarget = element;\n\n for (let j = 0; j < listeners.length; j++) {\n const [fn, capture, passive] = listeners[j];\n\n if (capture === !!options.capture && passive === options.passive) {\n fn(fakeEvent);\n }\n }\n }\n }\n\n element = domUtils.parentNode(element);\n }\n}\n\nfunction delegateUseCapture (event) {\n return delegateListener.call(this, event, true);\n}\n\nfunction preventDef () {\n this.returnValue = false;\n}\n\nfunction preventOriginalDefault () {\n this.originalEvent.preventDefault();\n}\n\nfunction stopProp () {\n this.cancelBubble = true;\n}\n\nfunction stopImmProp () {\n this.cancelBubble = true;\n this.immediatePropagationStopped = true;\n}\n\nfunction getOptions (param) {\n return is.object(param)? param : { capture: param };\n}\n\nmodule.exports = {\n add,\n remove,\n\n addDelegate,\n removeDelegate,\n\n delegateListener,\n delegateUseCapture,\n delegatedEvents,\n documents,\n\n useAttachEvent,\n supportsOptions,\n\n _elements: elements,\n _targets: targets,\n _attachedListeners: attachedListeners,\n};\n","module.exports = function extend (dest, source) {\n for (const prop in source) {\n dest[prop] = source[prop];\n }\n return dest;\n};\n","const {\n resolveRectLike,\n rectToXY,\n} = require('./rect');\n\nmodule.exports = function (target, element, action) {\n const actionOptions = target.options[action];\n const actionOrigin = actionOptions && actionOptions.origin;\n const origin = actionOrigin || target.options.origin;\n\n const originRect = resolveRectLike(origin, target, element, [target && element]);\n\n return rectToXY(originRect) || { x: 0, y: 0 };\n};\n","module.exports = (x, y) => Math.sqrt(x * x + y * y);\n","const extend = require('./extend');\nconst win = require('./window');\n\nconst utils = {\n warnOnce: function (method, message) {\n let warned = false;\n\n return function () {\n if (!warned) {\n win.window.console.warn(message);\n warned = true;\n }\n\n return method.apply(this, arguments);\n };\n },\n\n // http://stackoverflow.com/a/5634528/2280888\n _getQBezierValue: function (t, p1, p2, p3) {\n const iT = 1 - t;\n return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3;\n },\n\n getQuadraticCurvePoint: function (startX, startY, cpX, cpY, endX, endY, position) {\n return {\n x: utils._getQBezierValue(position, startX, cpX, endX),\n y: utils._getQBezierValue(position, startY, cpY, endY),\n };\n },\n\n // http://gizma.com/easing/\n easeOutQuad: function (t, b, c, d) {\n t /= d;\n return -c * t*(t-2) + b;\n },\n\n copyAction: function (dest, src) {\n dest.name = src.name;\n dest.axis = src.axis;\n dest.edges = src.edges;\n\n return dest;\n },\n\n is : require('./is'),\n extend : extend,\n hypot : require('./hypot'),\n getOriginXY: require('./getOriginXY'),\n};\n\nextend(utils, require('./arr'));\nextend(utils, require('./domUtils'));\nextend(utils, require('./pointerUtils'));\nextend(utils, require('./rect'));\n\nmodule.exports = utils;\n","const scope = require('../scope');\nconst utils = require('./index');\n\nconst finder = {\n methodOrder: [ 'simulationResume', 'mouseOrPen', 'hasPointer', 'idle' ],\n\n search: function (pointer, eventType, eventTarget) {\n const pointerType = utils.getPointerType(pointer);\n const pointerId = utils.getPointerId(pointer);\n const details = { pointer, pointerId, pointerType, eventType, eventTarget };\n\n for (const method of finder.methodOrder) {\n const interaction = finder[method](details);\n\n if (interaction) {\n return interaction;\n }\n }\n },\n\n // try to resume simulation with a new pointer\n simulationResume: function ({ pointerType, eventType, eventTarget }) {\n if (!/down|start/i.test(eventType)) {\n return null;\n }\n\n for (const interaction of scope.interactions) {\n let element = eventTarget;\n\n if (interaction.simulation && interaction.simulation.allowResume\n && (interaction.pointerType === pointerType)) {\n while (element) {\n // if the element is the interaction element\n if (element === interaction.element) {\n return interaction;\n }\n element = utils.parentNode(element);\n }\n }\n }\n\n return null;\n },\n\n // if it's a mouse or pen interaction\n mouseOrPen: function ({ pointerId, pointerType, eventType }) {\n if (pointerType !== 'mouse' && pointerType !== 'pen') {\n return null;\n }\n\n let firstNonActive;\n\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType) {\n // if it's a down event, skip interactions with running simulations\n if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; }\n\n // if the interaction is active, return it immediately\n if (interaction.interacting()) {\n return interaction;\n }\n // otherwise save it and look for another active interaction\n else if (!firstNonActive) {\n firstNonActive = interaction;\n }\n }\n }\n\n // if no active mouse interaction was found use the first inactive mouse\n // interaction\n if (firstNonActive) {\n return firstNonActive;\n }\n\n // find any mouse or pen interaction.\n // ignore the interaction if the eventType is a *down, and a simulation\n // is active\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType && !(/down/i.test(eventType) && interaction.simulation)) {\n return interaction;\n }\n }\n\n return null;\n },\n\n // get interaction that has this pointer\n hasPointer: function ({ pointerId }) {\n for (const interaction of scope.interactions) {\n if (utils.contains(interaction.pointerIds, pointerId)) {\n return interaction;\n }\n }\n },\n\n // get first idle interaction with a matching pointerType\n idle: function ({ pointerType }) {\n for (const interaction of scope.interactions) {\n // if there's already a pointer held down\n if (interaction.pointerIds.length === 1) {\n const target = interaction.target;\n // don't add this pointer if there is a target interactable and it\n // isn't gesturable\n if (target && !target.options.gesture.enabled) {\n continue;\n }\n }\n // maximum of 2 pointers per interaction\n else if (interaction.pointerIds.length >= 2) {\n continue;\n }\n\n if (!interaction.interacting() && (pointerType === interaction.pointerType)) {\n return interaction;\n }\n }\n\n return null;\n },\n};\n\nmodule.exports = finder;\n","const win = require('./window');\nconst isWindow = require('./isWindow');\n\nconst is = {\n array : () => {},\n\n window : thing => thing === win.window || isWindow(thing),\n\n docFrag : thing => is.object(thing) && thing.nodeType === 11,\n\n object : thing => !!thing && (typeof thing === 'object'),\n\n function: thing => typeof thing === 'function',\n\n number : thing => typeof thing === 'number' ,\n\n bool : thing => typeof thing === 'boolean' ,\n\n string : thing => typeof thing === 'string' ,\n\n element: thing => {\n if (!thing || (typeof thing !== 'object')) { return false; }\n\n const _window = win.getWindow(thing) || win.window;\n\n return (/object|function/.test(typeof _window.Element)\n ? thing instanceof _window.Element //DOM2\n : thing.nodeType === 1 && typeof thing.nodeName === 'string');\n },\n};\n\nis.array = thing => (is.object(thing)\n && (typeof thing.length !== 'undefined')\n && is.function(thing.splice));\n\nmodule.exports = is;\n","module.exports = (thing) => !!(thing && thing.Window) && (thing instanceof thing.Window);\n","function pointerExtend (dest, source) {\n for (const prop in source) {\n const prefixedPropREs = module.exports.prefixedPropREs;\n let deprecated = false;\n\n // skip deprecated prefixed properties\n for (const vendor in prefixedPropREs) {\n if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) {\n deprecated = true;\n break;\n }\n }\n\n if (!deprecated && typeof source[prop] !== 'function') {\n dest[prop] = source[prop];\n }\n }\n return dest;\n}\n\npointerExtend.prefixedPropREs = {\n webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/,\n};\n\nmodule.exports = pointerExtend;\n","const hypot = require('./hypot');\nconst browser = require('./browser');\nconst dom = require('./domObjects');\nconst domUtils = require('./domUtils');\nconst domObjects = require('./domObjects');\nconst is = require('./is');\nconst pointerExtend = require('./pointerExtend');\n\nconst pointerUtils = {\n copyCoords: function (dest, src) {\n dest.page = dest.page || {};\n dest.page.x = src.page.x;\n dest.page.y = src.page.y;\n\n dest.client = dest.client || {};\n dest.client.x = src.client.x;\n dest.client.y = src.client.y;\n\n dest.timeStamp = src.timeStamp;\n },\n\n setCoordDeltas: function (targetObj, prev, cur) {\n targetObj.page.x = cur.page.x - prev.page.x;\n targetObj.page.y = cur.page.y - prev.page.y;\n targetObj.client.x = cur.client.x - prev.client.x;\n targetObj.client.y = cur.client.y - prev.client.y;\n targetObj.timeStamp = cur.timeStamp - prev.timeStamp;\n\n // set pointer velocity\n const dt = Math.max(targetObj.timeStamp / 1000, 0.001);\n\n targetObj.page.speed = hypot(targetObj.page.x, targetObj.page.y) / dt;\n targetObj.page.vx = targetObj.page.x / dt;\n targetObj.page.vy = targetObj.page.y / dt;\n\n targetObj.client.speed = hypot(targetObj.client.x, targetObj.page.y) / dt;\n targetObj.client.vx = targetObj.client.x / dt;\n targetObj.client.vy = targetObj.client.y / dt;\n },\n\n isNativePointer: function (pointer) {\n return (pointer instanceof dom.Event || pointer instanceof dom.Touch);\n },\n\n // Get specified X/Y coords for mouse or event.touches[0]\n getXY: function (type, pointer, xy) {\n xy = xy || {};\n type = type || 'page';\n\n xy.x = pointer[type + 'X'];\n xy.y = pointer[type + 'Y'];\n\n return xy;\n },\n\n getPageXY: function (pointer, page) {\n page = page || {};\n\n // Opera Mobile handles the viewport and scrolling oddly\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n pointerUtils.getXY('screen', pointer, page);\n\n page.x += window.scrollX;\n page.y += window.scrollY;\n }\n else {\n pointerUtils.getXY('page', pointer, page);\n }\n\n return page;\n },\n\n getClientXY: function (pointer, client) {\n client = client || {};\n\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n // Opera Mobile handles the viewport and scrolling oddly\n pointerUtils.getXY('screen', pointer, client);\n }\n else {\n pointerUtils.getXY('client', pointer, client);\n }\n\n return client;\n },\n\n getPointerId: function (pointer) {\n return is.number(pointer.pointerId)? pointer.pointerId : pointer.identifier;\n },\n\n setCoords: function (targetObj, pointers, timeStamp) {\n const pointer = (pointers.length > 1\n ? pointerUtils.pointerAverage(pointers)\n : pointers[0]);\n\n const tmpXY = {};\n\n pointerUtils.getPageXY(pointer, tmpXY);\n targetObj.page.x = tmpXY.x;\n targetObj.page.y = tmpXY.y;\n\n pointerUtils.getClientXY(pointer, tmpXY);\n targetObj.client.x = tmpXY.x;\n targetObj.client.y = tmpXY.y;\n\n targetObj.timeStamp = is.number(timeStamp) ? timeStamp :new Date().getTime();\n },\n\n pointerExtend: pointerExtend,\n\n getTouchPair: function (event) {\n const touches = [];\n\n // array of touches is supplied\n if (is.array(event)) {\n touches[0] = event[0];\n touches[1] = event[1];\n }\n // an event\n else {\n if (event.type === 'touchend') {\n if (event.touches.length === 1) {\n touches[0] = event.touches[0];\n touches[1] = event.changedTouches[0];\n }\n else if (event.touches.length === 0) {\n touches[0] = event.changedTouches[0];\n touches[1] = event.changedTouches[1];\n }\n }\n else {\n touches[0] = event.touches[0];\n touches[1] = event.touches[1];\n }\n }\n\n return touches;\n },\n\n pointerAverage: function (pointers) {\n const average = {\n pageX : 0,\n pageY : 0,\n clientX: 0,\n clientY: 0,\n screenX: 0,\n screenY: 0,\n };\n\n for (const pointer of pointers) {\n for (const prop in average) {\n average[prop] += pointer[prop];\n }\n }\n for (const prop in average) {\n average[prop] /= pointers.length;\n }\n\n return average;\n },\n\n touchBBox: function (event) {\n if (!event.length && !(event.touches && event.touches.length > 1)) {\n return;\n }\n\n const touches = pointerUtils.getTouchPair(event);\n const minX = Math.min(touches[0].pageX, touches[1].pageX);\n const minY = Math.min(touches[0].pageY, touches[1].pageY);\n const maxX = Math.max(touches[0].pageX, touches[1].pageX);\n const maxY = Math.max(touches[0].pageY, touches[1].pageY);\n\n return {\n x: minX,\n y: minY,\n left: minX,\n top: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n },\n\n touchDistance: function (event, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n\n\n const dx = touches[0][sourceX] - touches[1][sourceX];\n const dy = touches[0][sourceY] - touches[1][sourceY];\n\n return hypot(dx, dy);\n },\n\n touchAngle: function (event, prevAngle, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n const dx = touches[1][sourceX] - touches[0][sourceX];\n const dy = touches[1][sourceY] - touches[0][sourceY];\n const angle = 180 * Math.atan2(dy , dx) / Math.PI;\n\n return angle;\n },\n\n getPointerType: function (pointer) {\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : is.number(pointer.pointerType)\n ? [undefined, undefined,'touch', 'pen', 'mouse'][pointer.pointerType]\n // if the PointerEvent API isn't available, then the \"pointer\" must\n // be either a MouseEvent, TouchEvent, or Touch object\n : /touch/.test(pointer.type) || pointer instanceof domObjects.Touch\n ? 'touch'\n : 'mouse';\n },\n\n // [ event.target, event.currentTarget ]\n getEventTargets: function (event) {\n return [\n domUtils.getActualElement(event.path ? event.path[0] : event.target),\n domUtils.getActualElement(event.currentTarget),\n ];\n },\n};\n\nmodule.exports = pointerUtils;\n","const { window } = require('./window');\n\nconst vendors = ['ms', 'moz', 'webkit', 'o'];\nlet lastTime = 0;\nlet request;\nlet cancel;\n\nfor (let x = 0; x < vendors.length && !window.requestAnimationFrame; x++) {\n request = window[vendors[x] + 'RequestAnimationFrame'];\n cancel = window[vendors[x] +'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n}\n\nif (!request) {\n request = function (callback) {\n const currTime = new Date().getTime();\n const timeToCall = Math.max(0, 16 - (currTime - lastTime));\n const id = setTimeout(function () { callback(currTime + timeToCall); },\n timeToCall);\n\n lastTime = currTime + timeToCall;\n return id;\n };\n}\n\nif (!cancel) {\n cancel = function (id) {\n clearTimeout(id);\n };\n}\n\nmodule.exports = {\n request,\n cancel,\n};\n","const extend = require('./extend');\nconst is = require('./is');\nconst {\n closest,\n parentNode,\n getElementRect,\n} = require('./domUtils');\n\nconst rectUtils = {\n getStringOptionResult: function (value, interactable, element) {\n if (!is.string(value)) {\n return null;\n }\n\n if (value === 'parent') {\n value = parentNode(element);\n }\n else if (value === 'self') {\n value = interactable.getRect(element);\n }\n else {\n value = closest(element, value);\n }\n\n return value;\n },\n\n resolveRectLike: function (value, interactable, element, functionArgs) {\n value = rectUtils.getStringOptionResult(value, interactable, element) || value;\n\n if (is.function(value)) {\n value = value.apply(null, functionArgs);\n }\n\n if (is.element(value)) {\n value = getElementRect(value);\n }\n\n return value;\n },\n\n rectToXY: function (rect) {\n return rect && {\n x: 'x' in rect ? rect.x : rect.left,\n y: 'y' in rect ? rect.y : rect.top,\n };\n },\n\n xywhToTlbr: function (rect) {\n if (rect && !('left' in rect && 'top' in rect)) {\n rect = extend({}, rect);\n\n rect.left = rect.x || 0;\n rect.top = rect.y || 0;\n rect.right = rect.right || (rect.left + rect.width);\n rect.bottom = rect.bottom || (rect.top + rect.height);\n }\n\n return rect;\n },\n\n tlbrToXywh: function (rect) {\n if (rect && !('x' in rect && 'y' in rect)) {\n rect = extend({}, rect);\n\n rect.x = rect.left || 0;\n rect.top = rect.top || 0;\n rect.width = rect.width || (rect.right - rect.x);\n rect.height = rect.height || (rect.bottom - rect.y);\n }\n\n return rect;\n },\n};\n\nmodule.exports = rectUtils;\n","const win = module.exports;\nconst isWindow = require('./isWindow');\n\nfunction init (window) {\n // get wrapped window if using Shadow DOM polyfill\n\n win.realWindow = window;\n\n // create a TextNode\n const el = window.document.createTextNode('');\n\n // check if it's wrapped by a polyfill\n if (el.ownerDocument !== window.document\n && typeof window.wrap === 'function'\n && window.wrap(el) === el) {\n // use wrapped window\n window = window.wrap(window);\n }\n\n win.window = window;\n}\n\nif (typeof window === 'undefined') {\n win.window = undefined;\n win.realWindow = undefined;\n}\nelse {\n init(window);\n}\n\nwin.getWindow = function getWindow (node) {\n if (isWindow(node)) {\n return node;\n }\n\n const rootNode = (node.ownerDocument || node);\n\n return rootNode.defaultView || rootNode.parentWindow || win.window;\n};\n\nwin.init = init;\n"]} \ No newline at end of file diff --git a/dist/interact.min.js b/dist/interact.min.js index c0bb2476c..2d1f0fb62 100644 --- a/dist/interact.min.js +++ b/dist/interact.min.js @@ -1,6 +1,6 @@ -/* interact.js v1.3.0-alpha.3+sha.9595c40 | https://raw.github.com/taye/interact.js/master/LICENSE */ -!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var t;t="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,t.interact=e()}}(function(){return function e(t,n,r){function i(s,a){if(!n[s]){if(!t[s]){var l="function"==typeof require&&require;if(!a&&l)return l(s,!0);if(o)return o(s,!0);var c=new Error("Cannot find module '"+s+"'");throw c.code="MODULE_NOT_FOUND",c}var p=n[s]={exports:{}};t[s][0].call(p.exports,function(e){var n=t[s][1][e];return i(n||e)},p,p.exports,e,t,n,r)}return n[s].exports}for(var o="function"==typeof require&&require,s=0;s6&&void 0!==arguments[6]&&arguments[6];r(this,e);var f=t.target,v=(f&&f.options||s).deltaSource,g=o(f,p,l),h="start"===c,m="end"===c,y=h?t.startCoords:t.curCoords,x=t.prevEvent;p=p||t.element;var b=i({},y.page),w=i({},y.client);b.x-=g.x,b.y-=g.y,w.x-=g.x,w.y-=g.y,this.ctrlKey=n.ctrlKey,this.altKey=n.altKey,this.shiftKey=n.shiftKey,this.metaKey=n.metaKey,this.button=n.button,this.buttons=n.buttons,this.target=p,this.currentTarget=p,this.relatedTarget=u||null,this.preEnd=d,this.type=l+(c||""),this.interaction=t,this.interactable=f,this.t0=h?t.downTimes[t.downTimes.length-1]:x.t0;var E={interaction:t,event:n,action:l,phase:c,element:p,related:u,page:b,client:w,coords:y,starting:h,ending:m,deltaSource:v,iEvent:this};a.fire("set-xy",E),m?(this.pageX=x.pageX,this.pageY=x.pageY,this.clientX=x.clientX,this.clientY=x.clientY):(this.pageX=b.x,this.pageY=b.y,this.clientX=w.x,this.clientY=w.y),this.x0=t.startCoords.page.x-g.x,this.y0=t.startCoords.page.y-g.y,this.clientX0=t.startCoords.client.x-g.x,this.clientY0=t.startCoords.client.y-g.y,a.fire("set-delta",E),this.timeStamp=y.timeStamp,this.dt=t.pointerDelta.timeStamp,this.duration=this.timeStamp-this.t0,this.speed=t.pointerDelta[v].speed,this.velocityX=t.pointerDelta[v].vx,this.velocityY=t.pointerDelta[v].vy,this.swipe=m||"inertiastart"===c?this.getSwipe():null,a.fire("new",E)}return e.prototype.getSwipe=function(){var e=this.interaction;if(e.prevEvent.speed<600||this.timeStamp-e.prevEvent.timeStamp>150)return null;var t=180*Math.atan2(e.prevEvent.velocityY,e.prevEvent.velocityX)/Math.PI;t<0&&(t+=360);var n=112.5<=t&&t<247.5,r=202.5<=t&&t<337.5,i=!n&&(292.5<=t||t<67.5);return{up:r,down:!r&&22.5<=t&&t<157.5,left:n,right:i,angle:t,speed:e.prevEvent.speed,velocity:{x:e.prevEvent.velocityX,y:e.prevEvent.velocityY}}},e.prototype.preventDefault=function(){},e.prototype.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},e.prototype.stopPropagation=function(){this.propagationStopped=!0},e}();a.on("set-delta",function(e){var t=e.iEvent,n=e.interaction,r=e.starting,i=e.deltaSource,o=r?t:n.prevEvent;"client"===i?(t.dx=t.clientX-o.clientX,t.dy=t.clientY-o.clientY):(t.dx=t.pageX-o.pageX,t.dy=t.pageY-o.pageY)}),l.signals=a,t.exports=l},{"./defaultOptions":18,"./utils/Signals":35,"./utils/extend":41,"./utils/getOriginXY":42}],4:[function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=e("./utils/is"),o=e("./utils/events"),s=e("./utils/extend"),a=e("./actions/base"),l=e("./scope"),c=e("./Eventable"),p=e("./defaultOptions"),u=e("./utils/Signals").new(),d=e("./utils/domUtils"),f=d.getElementRect,v=d.nodeContains,g=d.trySelector,h=e("./utils/window"),m=h.getWindow,y=e("./utils/arr"),x=y.indexOf,b=y.contains,w=e("./utils/browser"),E=w.wheelEvent;l.interactables=[];var S=function(){function e(t,n){r(this,e),n=n||{},this.target=t,this.events=new c,this._context=n.context||l.document,this._win=m(g(t)?this._context:t),this._doc=this._win.document,u.fire("new",{target:t,options:n,interactable:this,win:this._win}),l.addDocument(this._doc,this._win),l.interactables.push(this),this.set(n)}return e.prototype.setOnEvents=function(e,t){var n="on"+e;return i.function(t.onstart)&&(this.events[n+"start"]=t.onstart),i.function(t.onmove)&&(this.events[n+"move"]=t.onmove),i.function(t.onend)&&(this.events[n+"end"]=t.onend),i.function(t.oninertiastart)&&(this.events[n+"inertiastart"]=t.oninertiastart),this},e.prototype.setPerAction=function(e,t){for(var n in t)n in p[e]&&(i.object(t[n])?(this.options[e][n]=s(this.options[e][n]||{},t[n]),i.object(p.perAction[n])&&"enabled"in p.perAction[n]&&(this.options[e][n].enabled=!1!==t[n].enabled)):i.bool(t[n])&&i.object(p.perAction[n])?this.options[e][n].enabled=t[n]:void 0!==t[n]&&(this.options[e][n]=t[n]))},e.prototype.getRect=function(e){return e=e||this.target,i.string(this.target)&&!i.element(e)&&(e=this._context.querySelector(this.target)),f(e)},e.prototype.rectChecker=function(e){return i.function(e)?(this.getRect=e,this):null===e?(delete this.options.getRect,this):this.getRect},e.prototype._backCompatOption=function(e,t){if(g(t)||i.object(t)){this.options[e]=t;for(var n=a.names,r=Array.isArray(n),o=0,n=r?n:n[Symbol.iterator]();;){var s;if(r){if(o>=n.length)break;s=n[o++]}else{if(o=n.next(),o.done)break;s=o.value}var l=s;this.options[l][e]=t}return this}return this.options[e]},e.prototype.origin=function(e){return this._backCompatOption("origin",e)},e.prototype.deltaSource=function(e){return"page"===e||"client"===e?(this.options.deltaSource=e,this):this.options.deltaSource},e.prototype.context=function(){return this._context},e.prototype.inContext=function(e){return this._context===e.ownerDocument||v(this._context,e)},e.prototype.fire=function(e){return this.events.fire(e),this},e.prototype._onOffMultiple=function(e,t,n,r){if(i.string(t)&&-1!==t.search(" ")&&(t=t.trim().split(/ +/)),i.array(t)){for(var o=0;o=l.length)break;f=l[d++]}else{if(d=l.next(),d.done)break;f=d.value}var v=f;this.options[v]=p.base[v],v in t&&this[v](t[v])}return u.fire("set",{options:t,interactable:this}),this},e.prototype.unset=function(){if(o.remove(this.target,"all"),i.string(this.target))for(var e in o.delegatedEvents){var t=o.delegatedEvents[e];t.selectors[0]===this.target&&t.contexts[0]===this._context&&(t.selectors.splice(0,1),t.contexts.splice(0,1),t.listeners.splice(0,1),t.selectors.length||(t[e]=null)),o.remove(this._context,e,o.delegateListener),o.remove(this._context,e,o.delegateUseCapture,!0)}else o.remove(this,"all");u.fire("unset",{interactable:this}),l.interactables.splice(x(l.interactables,this),1);for(var n=l.interactions||[],r=Array.isArray(n),s=0,n=r?n:n[Symbol.iterator]();;){var a;if(r){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var c=a;c.target===this&&c.interacting()&&c.stop()}return l.interact},e}();l.interactables.indexOfElement=function(e,t){t=t||l.document;for(var n=0;n=y.length)break;w=y[b++]}else{if(b=y.next(),b.done)break;w=b.value}var E=w,S=E[0],T=E[1];T._updateEventTargets(r,i),T[e](S,t,r,i)}}}function o(e){for(var t=0;te.pointerMoveTolerance);var a={pointer:t,pointerIndex:this.getPointerIndex(t),event:n,eventTarget:r,dx:o,dy:s,duplicate:i,interaction:this,interactingBeforeMove:this.interacting()};i||l.setCoordDeltas(this.pointerDelta,this.prevCoords,this.curCoords),d.fire("move",a),i||(this.interacting()&&this.doMove(a),this.pointerWasMoved&&l.copyCoords(this.prevCoords,this.curCoords))},e.prototype.doMove=function(e){e=l.extend({pointer:this.pointers[0],event:this.prevEvent,eventTarget:this._eventTarget,interaction:this},e||{}),d.fire("before-action-move",e),this._dontFireMove||d.fire("action-move",e),this._dontFireMove=!1},e.prototype.pointerUp=function(e,t,n,r){var i=this.getPointerIndex(e);d.fire(/cancel$/i.test(t.type)?"cancel":"up",{pointer:e,pointerIndex:i,event:t,eventTarget:n,curEventTarget:r,interaction:this}),this.simulation||this.end(t),this.pointerIsDown=!1,this.removePointer(e,t)},e.prototype.end=function(e){e=e||this.prevEvent,this.interacting()&&d.fire("action-end",{event:e,interaction:this}),this.stop()},e.prototype.currentAction=function(){return this._interacting?this.prepared.name:null},e.prototype.interacting=function(){return this._interacting},e.prototype.stop=function(){d.fire("stop",{interaction:this}),this._interacting&&(d.fire("stop-active",{interaction:this}),d.fire("stop-"+this.prepared.name,{interaction:this})),this.target=this.element=null,this._interacting=!1,this.prepared.name=this.prevEvent=null},e.prototype.getPointerIndex=function(e){return l.indexOf(this.pointerIds,l.getPointerId(e))},e.prototype.updatePointer=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:t&&/(down|start)$/i.test(t.type),r=l.getPointerId(e),i=this.getPointerIndex(e);return-1===i&&(i=this.pointerIds.length,this.pointerIds[i]=r),n&&d.fire("update-pointer-down",{pointer:e,event:t,down:n,pointerId:r,pointerIndex:i,interaction:this}),this.pointers[i]=e,i},e.prototype.removePointer=function(e,t){var n=l.getPointerId(e),r=this.mouse?0:l.indexOf(this.pointerIds,n);-1!==r&&(d.fire("remove-pointer",{pointer:e,event:t,pointerIndex:r,interaction:this}),this.pointers.splice(r,1),this.pointerIds.splice(r,1),this.downTargets.splice(r,1),this.downTimes.splice(r,1))},e.prototype._updateEventTargets=function(e,t){this._eventTarget=e,this._curEventTarget=t},e}(),m=0,y=v.length;m=i.length)break;a=i[s++]}else{if(s=i.next(),s.done)break;a=s.value}var l=a;if(l.options.drop.enabled){var c=l.options.drop.accept;if(!(p.is.element(c)&&c!==t||p.is.string(c)&&!p.matchesSelector(t,c)))for(var d=p.is.string(l.target)?l._context.querySelectorAll(l.target):[l.target],f=0;fo.left&&c.xo.top&&c.y=o.left&&v<=o.right&&g>=o.top&&g<=o.bottom}if(f&&p.is.number(a)){s=Math.max(0,Math.min(o.right,f.right)-Math.max(o.left,f.left))*Math.max(0,Math.min(o.bottom,f.bottom)-Math.max(o.top,f.top))/(f.width*f.height)>=a}return this.options.drop.checker&&(s=this.options.drop.checker(e,t,s,this,i,n,r)),s},v.signals.on("unset",function(e){e.interactable.dropzone(!1)}),v.settingsMethods.push("dropChecker"),g.signals.on("new",function(e){e.dropTarget=null,e.dropElement=null,e.prevDropTarget=null,e.prevDropElement=null,e.dropEvents=null,e.activeDrops={dropzones:[],elements:[],rects:[]}}),g.signals.on("stop",function(e){var t=e.interaction;t.dropTarget=t.dropElement=t.prevDropTarget=t.prevDropElement=null}),d.dynamicDrop=function(e){return p.is.bool(e)?(y=e,d):y},p.merge(v.eventTypes,["dragenter","dragleave","dropactivate","dropdeactivate","dropmove","drop"]),c.methodDict.drop="dropzone",h.drop=m.defaults,t.exports=m},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../interact":21,"../scope":34,"../utils":44,"./base":6}],9:[function(e,t,n){"use strict";var r=e("./base"),i=e("../utils"),o=e("../InteractEvent"),s=e("../Interactable"),a=e("../Interaction"),l=e("../defaultOptions"),c={defaults:{enabled:!1,origin:null,restrict:null},checker:function(e,t,n,r,i){return i.pointerIds.length>=2?{name:"gesture"}:null},getCursor:function(){return""}};o.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;"gesturestart"===t.type&&(t.ds=0,n.gesture.startDistance=n.gesture.prevDistance=t.distance,n.gesture.startAngle=n.gesture.prevAngle=t.angle,n.gesture.scale=1)}),o.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;"gesturemove"===t.type&&(t.ds=t.scale-n.gesture.scale,n.target.fire(t),n.gesture.prevAngle=t.angle,n.gesture.prevDistance=t.distance,t.scale===1/0||null===t.scale||void 0===t.scale||isNaN(t.scale)||(n.gesture.scale=t.scale))}),s.prototype.gesturable=function(e){return i.is.object(e)?(this.options.gesture.enabled=!1!==e.enabled,this.setPerAction("gesture",e),this.setOnEvents("gesture",e),this):i.is.bool(e)?(this.options.gesture.enabled=e,e||(this.ongesturestart=this.ongesturestart=this.ongestureend=null),this):this.options.gesture},o.signals.on("set-delta",function(e){var t=e.interaction,n=e.iEvent,r=e.action,s=e.event,a=e.starting,l=e.ending,c=e.deltaSource;if("gesture"===r){var p=t.pointers;n.touches=[p[0],p[1]],a?(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=1,n.ds=0,n.angle=i.touchAngle(p,void 0,c),n.da=0):l||s instanceof o?(n.distance=t.prevEvent.distance,n.box=t.prevEvent.box,n.scale=t.prevEvent.scale,n.ds=n.scale-1,n.angle=t.prevEvent.angle,n.da=n.angle-t.gesture.startAngle):(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=n.distance/t.gesture.startDistance,n.angle=i.touchAngle(p,t.gesture.prevAngle,c),n.ds=n.scale-t.gesture.prevScale,n.da=n.angle-t.gesture.prevAngle)}}),a.signals.on("new",function(e){e.gesture={start:{x:0,y:0},startDistance:0,prevDistance:0,distance:0,scale:1,startAngle:0,prevAngle:0}}),r.gesture=c,r.names.push("gesture"),i.merge(s.eventTypes,["gesturestart","gesturemove","gestureend"]),r.methodDict.gesture="gesturable",l.gesture=c.defaults,t.exports=c},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"./base":6}],10:[function(e,t,n){"use strict";function r(e,t,n,r,i,s,a){if(!t)return!1;if(!0===t){var l=o.is.number(s.width)?s.width:s.right-s.left,c=o.is.number(s.height)?s.height:s.bottom-s.top;if(l<0&&("left"===e?e="right":"right"===e&&(e="left")),c<0&&("top"===e?e="bottom":"bottom"===e&&(e="top")),"left"===e)return n.x<(l>=0?s.left:s.right)+a;if("top"===e)return n.y<(c>=0?s.top:s.bottom)+a;if("right"===e)return n.x>(l>=0?s.right:s.left)-a;if("bottom"===e)return n.y>(c>=0?s.bottom:s.top)-a}return!!o.is.element(r)&&(o.is.element(t)?t===r:o.matchesUpTo(r,t,i))}var i=e("./base"),o=e("../utils"),s=e("../utils/browser"),a=e("../InteractEvent"),l=e("../Interactable"),c=e("../Interaction"),p=e("../defaultOptions"),u=s.supportsTouch||s.supportsPointerEvent?20:10,d={defaults:{enabled:!1,mouseButtons:null,origin:null,snap:null,restrict:null,inertia:null,autoScroll:null,square:!1,preserveAspectRatio:!1,axis:"xy",margin:NaN,edges:null,invert:"none"},checker:function(e,t,n,i,s,a){if(!a)return null;var l=o.extend({},s.curCoords.page),c=n.options;if(c.resize.enabled){var p=c.resize,d={left:!1,right:!1,top:!1,bottom:!1};if(o.is.object(p.edges)){for(var f in d)d[f]=r(f,p.edges[f],l,s._eventTarget,i,a,p.margin||u);if(d.left=d.left&&!d.right,d.top=d.top&&!d.bottom,d.left||d.right||d.top||d.bottom)return{name:"resize",edges:d}}else{var v="y"!==c.resize.axis&&l.x>a.right-u,g="x"!==c.resize.axis&&l.y>a.bottom-u;if(v||g)return{name:"resize",axes:(v?"x":"")+(g?"y":"")}}}return null},cursors:s.isIe9OrOlder?{x:"e-resize",y:"s-resize",xy:"se-resize",top:"n-resize",left:"w-resize",bottom:"s-resize",right:"e-resize",topleft:"se-resize",bottomright:"se-resize",topright:"ne-resize",bottomleft:"ne-resize"}:{x:"ew-resize",y:"ns-resize",xy:"nwse-resize",top:"ns-resize",left:"ew-resize",bottom:"ns-resize",right:"ew-resize",topleft:"nwse-resize",bottomright:"nwse-resize",topright:"nesw-resize",bottomleft:"nesw-resize"},getCursor:function(e){if(e.axis)return d.cursors[e.name+e.axis];if(e.edges){for(var t="",n=["top","bottom","left","right"],r=0;r<4;r++)e.edges[n[r]]&&(t+=n[r]);return d.cursors[t]}}};a.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;if("resizestart"===t.type&&n.prepared.edges){var r=n.target.getRect(n.element),i=n.target.options.resize;if(i.square||i.preserveAspectRatio){var s=o.extend({},n.prepared.edges);s.top=s.top||s.left&&!s.bottom,s.left=s.left||s.top&&!s.right,s.bottom=s.bottom||s.right&&!s.top,s.right=s.right||s.bottom&&!s.left,n.prepared._linkedEdges=s}else n.prepared._linkedEdges=null;i.preserveAspectRatio&&(n.resizeStartAspectRatio=r.width/r.height),n.resizeRects={start:r,current:o.extend({},r),inverted:o.extend({},r),previous:o.extend({},r),delta:{left:0,right:0,width:0,top:0,bottom:0,height:0}},t.rect=n.resizeRects.inverted,t.deltaRect=n.resizeRects.delta}}),a.signals.on("new",function(e){var t=e.iEvent,n=e.phase,r=e.interaction;if("move"===n&&r.prepared.edges){var i=r.target.options.resize,s=i.invert,a="reposition"===s||"negate"===s,l=r.prepared.edges,c=r.resizeRects.start,p=r.resizeRects.current,u=r.resizeRects.inverted,d=r.resizeRects.delta,f=o.extend(r.resizeRects.previous,u),v=l,g=t.dx,h=t.dy;if(i.preserveAspectRatio||i.square){var m=i.preserveAspectRatio?r.resizeStartAspectRatio:1;l=r.prepared._linkedEdges,v.left&&v.bottom||v.right&&v.top?h=-g/m:v.left||v.right?h=g/m:(v.top||v.bottom)&&(g=h*m)}if(l.top&&(p.top+=h),l.bottom&&(p.bottom+=h),l.left&&(p.left+=g),l.right&&(p.right+=g),a){if(o.extend(u,p),"reposition"===s){var y=void 0;u.top>u.bottom&&(y=u.top,u.top=u.bottom,u.bottom=y),u.left>u.right&&(y=u.left,u.left=u.right,u.right=y)}}else u.top=Math.min(p.top,c.bottom),u.bottom=Math.max(p.bottom,c.top),u.left=Math.min(p.left,c.right),u.right=Math.max(p.right,c.left);u.width=u.right-u.left,u.height=u.bottom-u.top;for(var x in u)d[x]=u[x]-f[x];t.edges=r.prepared.edges,t.rect=u,t.deltaRect=d}}),l.prototype.resizable=function(e){return o.is.object(e)?(this.options.resize.enabled=!1!==e.enabled,this.setPerAction("resize",e),this.setOnEvents("resize",e),/^x$|^y$|^xy$/.test(e.axis)?this.options.resize.axis=e.axis:null===e.axis&&(this.options.resize.axis=p.resize.axis),o.is.bool(e.preserveAspectRatio)?this.options.resize.preserveAspectRatio=e.preserveAspectRatio:o.is.bool(e.square)&&(this.options.resize.square=e.square),this):o.is.bool(e)?(this.options.resize.enabled=e,e||(this.onresizestart=this.onresizestart=this.onresizeend=null),this):this.options.resize},c.signals.on("new",function(e){ -e.resizeAxes="xy"}),a.signals.on("set-delta",function(e){var t=e.interaction,n=e.iEvent;"resize"===e.action&&t.resizeAxes&&(t.target.options.resize.square?("y"===t.resizeAxes?n.dx=n.dy:n.dy=n.dx,n.axes="xy"):(n.axes=t.resizeAxes,"x"===t.resizeAxes?n.dy=0:"y"===t.resizeAxes&&(n.dx=0)))}),i.resize=d,i.names.push("resize"),o.merge(l.eventTypes,["resizestart","resizemove","resizeinertiastart","resizeinertiaresume","resizeend"]),i.methodDict.resize="resizable",p.resize=d.defaults,t.exports=d},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"../utils/browser":37,"./base":6}],11:[function(e,t,n){"use strict";var r=e("./utils/raf"),i=e("./utils/window").getWindow,o=e("./utils/is"),s=e("./utils/domUtils"),a=e("./Interaction"),l=e("./defaultOptions"),c={defaults:{enabled:!1,container:null,margin:60,speed:300},interaction:null,i:null,x:0,y:0,isScrolling:!1,prevTime:0,start:function(e){c.isScrolling=!0,r.cancel(c.i),c.interaction=e,c.prevTime=(new Date).getTime(),c.i=r.request(c.scroll)},stop:function(){c.isScrolling=!1,r.cancel(c.i)},scroll:function(){var e=c.interaction.target.options[c.interaction.prepared.name].autoScroll,t=e.container||i(c.interaction.element),n=(new Date).getTime(),s=(n-c.prevTime)/1e3,a=e.speed*s;a>=1&&(o.window(t)?t.scrollBy(c.x*a,c.y*a):t&&(t.scrollLeft+=c.x*a,t.scrollTop+=c.y*a),c.prevTime=n),c.isScrolling&&(r.cancel(c.i),c.i=r.request(c.scroll))},check:function(e,t){var n=e.options;return n[t].autoScroll&&n[t].autoScroll.enabled},onInteractionMove:function(e){var t=e.interaction,n=e.pointer;if(t.interacting()&&c.check(t.target,t.prepared.name)){if(t.simulation)return void(c.x=c.y=0);var r=void 0,a=void 0,l=void 0,p=void 0,u=t.target.options[t.prepared.name].autoScroll,d=u.container||i(t.element);if(o.window(d))p=n.clientXd.innerWidth-c.margin,l=n.clientY>d.innerHeight-c.margin;else{var f=s.getElementClientRect(d);p=n.clientXf.right-c.margin,l=n.clientY>f.bottom-c.margin}c.x=a?1:p?-1:0,c.y=l?1:r?-1:0,c.isScrolling||(c.margin=u.margin,c.speed=u.speed,c.start(t))}}};a.signals.on("stop-active",function(){c.stop()}),a.signals.on("action-move",c.onInteractionMove),l.perAction.autoScroll=c.defaults,t.exports=c},{"./Interaction":5,"./defaultOptions":18,"./utils/domUtils":39,"./utils/is":46,"./utils/raf":50,"./utils/window":52}],12:[function(e,t,n){"use strict";var r=e("../Interactable"),i=e("../actions/base"),o=e("../utils/is"),s=e("../utils/domUtils");r.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},r.prototype.ignoreFrom=function(e){return this._backCompatOption("ignoreFrom",e)},r.prototype.allowFrom=function(e){return this._backCompatOption("allowFrom",e)},r.prototype.testIgnore=function(e,t,n){return!(!e||!o.element(n))&&(o.string(e)?s.matchesUpTo(n,e,t):!!o.element(e)&&s.nodeContains(e,n))},r.prototype.testAllow=function(e,t,n){return!e||!!o.element(n)&&(o.string(e)?s.matchesUpTo(n,e,t):!!o.element(e)&&s.nodeContains(e,n))},r.prototype.testIgnoreAllow=function(e,t,n){return!this.testIgnore(e.ignoreFrom,t,n)&&this.testAllow(e.allowFrom,t,n)},r.prototype.actionChecker=function(e){return o.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},r.prototype.styleCursor=function(e){return o.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},r.prototype.defaultActionChecker=function(e,t,n,r){for(var o=this.getRect(r),s=null,a=i.names,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var u=p;if((!n.pointerIsDown||!n.mouse||0!=(t.buttons&this.options[u].mouseButtons))&&(s=i[u].checker(e,t,this,r,n,o)))return s}}},{"../Interactable":4,"../actions/base":6,"../utils/domUtils":39,"../utils/is":46}],13:[function(e,t,n){"use strict";function r(e,t,n,r){return g.is.object(e)&&t.testIgnoreAllow(t.options[e.name],n,r)&&t.options[e.name].enabled&&a(t,n,e)?e:null}function i(e,t,n,i,o,s){for(var a=0,l=i.length;a=m.maxInteractions)return!1;if(u.target===e){if((a+=d===n.name|0)>=i)return!1;if(u.element===t&&(l++,d!==n.name||l>=o))return!1}}}return m.maxInteractions>0}}var l=e("../interact"),c=e("../Interactable"),p=e("../Interaction"),u=e("../actions/base"),d=e("../defaultOptions"),f=e("../utils/browser"),v=e("../scope"),g=e("../utils"),h=e("../utils/Signals").new();e("./InteractableMethods");var m={signals:h,withinInteractionLimit:a,maxInteractions:1/0,defaults:{perAction:{manualStart:!1,max:1/0,maxPerElement:1,allowFrom:null,ignoreFrom:null}},setActionDefaults:function(e){g.extend(e.defaults,m.defaults.perAction)}};p.signals.on("down",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;if(!t.interacting()){s(t,o(t,n,r,i))}}),p.signals.on("move",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;if(t.mouse&&!t.pointerIsDown&&!t.interacting()){s(t,o(t,n,r,i))}}),p.signals.on("move",function(e){var t=e.interaction,n=e.event;if(t.pointerIsDown&&!t.interacting()&&t.pointerWasMoved&&t.prepared.name){h.fire("before-start",e);var r=t.target;t.prepared.name&&r&&(r.options[t.prepared.name].manualStart||!a(r,t.element,t.prepared)?t.stop(n):t.start(t.prepared,r,t.element))}}),p.signals.on("stop",function(e){var t=e.interaction,n=t.target;n&&n.options.styleCursor&&(n._doc.documentElement.style.cursor="")}),c.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},c.prototype.actionChecker=function(e){return g.is.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},c.prototype.styleCursor=function(e){return g.is.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},c.prototype.defaultActionChecker=function(e,t,n,r){for(var i=this.getRect(r),o=t.buttons||{0:1,1:4,3:8,4:16}[t.button],s=null,a=u.names,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var d=p;if((!n.pointerIsDown||!n.mouse||0!=(o&this.options[d].mouseButtons))&&(s=u[d].checker(e,t,this,r,n,i)))return s}},l.maxInteractions=function(e){return g.is.number(e)?(m.maxInteractions=e,this):m.maxInteractions},c.settingsMethods.push("styleCursor"),c.settingsMethods.push("actionChecker"),c.settingsMethods.push("ignoreFrom"),c.settingsMethods.push("allowFrom"),d.base.actionChecker=null,d.base.styleCursor=!0,g.extend(d.perAction,m.defaults.perAction),t.exports=m},{"../Interactable":4,"../Interaction":5,"../actions/base":6,"../defaultOptions":18,"../interact":21,"../scope":34,"../utils":44,"../utils/Signals":35,"../utils/browser":37,"./InteractableMethods":12}],14:[function(e,t,n){"use strict";var r=e("./base"),i=e("../Interaction");i.signals.on("new",function(e){e.delayTimer=null}),r.signals.on("prepared",function(e){var t=e.interaction,n=t.prepared.name;if(n){var r=t.target.options[n].delay;r>0&&(t.delayTimer=setTimeout(function(){t.start(t.prepared,t.target,t.element)},r))}}),i.signals.on("move",function(e){var t=e.interaction,n=e.duplicate;t.pointerWasMoved&&!n&&clearTimeout(t.delayTimer)}),r.signals.on("before-start",function(e){var t=e.interaction,n=t.prepared.name;if(n){t.target.options[n].delay>0&&(t.prepared.name=null)}})},{"../Interaction":5,"./base":13}],15:[function(e,t,n){"use strict";function r(e,t){if(!t)return!1;var n=t.options.drag.startAxis;return"xy"===e||"xy"===n||n===e}var i=e("./base"),o=e("../scope"),s=e("../utils/browser"),a=e("../utils/is"),l=e("../utils/domUtils"),c=l.matchesSelector,p=l.parentNode;i.setActionDefaults(e("../actions/drag")),i.signals.on("before-start",function(e){var t=e.interaction,n=e.eventTarget,l=e.dx,u=e.dy;if("drag"===t.prepared.name){var d=Math.abs(l),f=Math.abs(u),v=t.target.options.drag,g=v.startAxis,h=d>f?"x":dl.minSpeed&&g>l.endSpeed,b={interaction:t,pageCoords:v,statuses:f,preEnd:!0,requireEndOnly:!0};y&&!x&&(c.resetStatuses(f),m=c.setAll(b),m.shouldMove&&m.locked&&(h=!0)),(x||h)&&(p.copyCoords(i.upCoords,t.curCoords),t.pointers[0]=i.startEvent=new a(t,n,t.prepared.name,"inertiastart",t.element),i.t0=d,i.active=!0,i.allowResume=l.allowResume,t.simulation=i,o.fire(i.startEvent),x?(i.vx0=t.pointerDelta.client.vx,i.vy0=t.pointerDelta.client.vy,i.v0=g,r(t,i),p.extend(v,t.curCoords.page),v.x+=i.xe,v.y+=i.ye,c.resetStatuses(f),m=c.setAll(b),i.modifiedXe+=m.dx,i.modifiedYe+=m.dy,i.i=u.request(t.boundInertiaFrame)):(i.smoothEnd=!0,i.xe=m.dx,i.ye=m.dy,i.sx=i.sy=0,i.i=u.request(t.boundSmoothEndFrame)))}}),l.signals.on("stop-active",function(e){var t=e.interaction,n=t.inertiaStatus;n.active&&(u.cancel(n.i),n.active=!1,t.simulation=null)})},{"./InteractEvent":3,"./Interaction":5,"./modifiers":24,"./utils":44,"./utils/raf":50}],21:[function(e,t,n){"use strict";function r(e,t){var n=a.interactables.get(e,t);return n||(n=new l(e,t),n.events.global=p),n}var i=e("./utils/browser"),o=e("./utils/events"),s=e("./utils"),a=e("./scope"),l=e("./Interactable"),c=e("./Interaction"),p={};r.isSet=function(e,t){return-1!==a.interactables.indexOfElement(e,t&&t.context)},r.on=function(e,t,n){if(s.is.string(e)&&-1!==e.search(" ")&&(e=e.trim().split(/ +/)),s.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.on(f,t,n)}return r}if(s.is.object(e)){for(var v in e)r.on(v,e[v],t);return r}return s.contains(l.eventTypes,e)?p[e]?p[e].push(t):p[e]=[t]:o.add(a.document,e,t,{options:n}),r},r.off=function(e,t,n){if(s.is.string(e)&&-1!==e.search(" ")&&(e=e.trim().split(/ +/)),s.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.off(f,t,n)}return r}if(s.is.object(e)){for(var v in e)r.off(v,e[v],t);return r}if(s.contains(l.eventTypes,e)){var g=void 0;e in p&&-1!==(g=s.indexOf(p[e],t))&&p[e].splice(g,1)}else o.remove(a.document,e,t,n);return r},r.debug=function(){return a},r.getPointerAverage=s.pointerAverage,r.getTouchBBox=s.touchBBox,r.getTouchDistance=s.touchDistance,r.getTouchAngle=s.touchAngle,r.getElementRect=s.getElementRect,r.getElementClientRect=s.getElementClientRect,r.matchesSelector=s.matchesSelector,r.closest=s.closest,r.supportsTouch=function(){return i.supportsTouch},r.supportsPointerEvent=function(){return i.supportsPointerEvent},r.stop=function(e){for(var t=a.interactions.length-1;t>=0;t--)a.interactions[t].stop(e);return r},r.pointerMoveTolerance=function(e){return s.is.number(e)?(c.pointerMoveTolerance=e,this):c.pointerMoveTolerance},r.addDocument=a.addDocument,r.removeDocument=a.removeDocument,a.interact=r,t.exports=r},{"./Interactable":4,"./Interaction":5,"./scope":34,"./utils":44,"./utils/browser":37,"./utils/events":40}],22:[function(e,t,n){"use strict";function r(e){var t=e.interaction,n=e.event;t.target&&t.target.checkAndPreventDefault(n)}var i=e("./Interactable"),o=e("./Interaction"),s=e("./scope"),a=e("./utils/is"),l=e("./utils/events"),c=e("./utils/domUtils"),p=c.nodeContains,u=c.matchesSelector;i.prototype.preventDefault=function(e){return/^(always|never|auto)$/.test(e)?(this.options.preventDefault=e,this):a.bool(e)?(this.options.preventDefault=e?"always":"never",this):this.options.preventDefault},i.prototype.checkAndPreventDefault=function(e){var t=this.options.preventDefault;if("never"!==t)return"always"===t?void e.preventDefault():void(l.supportsOptions||/^(mouse|pointer|touch)*(down|start)/i.test(e.type)||a.element(e.target)&&u(e.target,"input,select,textarea,[contenteditable=true],[contenteditable=true] *")||e.preventDefault())};for(var d=["down","move","up","cancel"],f=0;f=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i;if(o.element&&(o.element===e.target||p(o.element,e.target)))return void o.target.checkAndPreventDefault(e)}}},{"./Interactable":4,"./Interaction":5,"./scope":34,"./utils/domUtils":39,"./utils/events":40,"./utils/is":46}],23:[function(e,t,n){"use strict";function r(e){var t=e.target,n=a.search(e,e.type,t);n&&n.prevTap&&e.clientX===n.prevTap.clientX&&e.clientY===n.prevTap.clientY&&t===n.prevTap.target&&(n.downTargets[0]=t,n.downTimes[0]=(new Date).getTime(),l.fire({interaction:n,event:e,eventTarget:t,pointer:e,type:"tap"}))}var i=e("./scope"),o=e("./utils/events"),s=e("./utils/browser"),a=e("./utils/interactionFinder"),l=e("./pointerEvents/base"),c=e("./utils/window"),p=c.window,u=Object.prototype.toString;if(p.Array.isArray||(p.Array.isArray=function(e){return"[object Array]"===u.call(e)}),String.prototype.trim||(String.prototype.trim=function(){return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")}),s.isIE8){var d=function(e){for(var t=i.interactions,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var o;if(n){if(r>=t.length)break;o=t[r++]}else{if(r=t.next(),r.done)break;o=r.value}var s=o;s.interacting()&&s.target.checkAndPreventDefault(e)}},f=function(e,t){var n=e.doc,i=(e.win,0===t.indexOf("listen")?o.add:o.remove);i(n,"selectstart",d),l&&i(n,"dblclick",r)};i.signals.on("add-document",f),i.signals.on("remove-document",f)}t.exports=null},{"./pointerEvents/base":31,"./scope":34,"./utils/browser":37,"./utils/events":40,"./utils/interactionFinder":45,"./utils/window":52}],24:[function(e,t,n){"use strict";function r(e,t,n){return e&&e.enabled&&(t||!e.endOnly)&&(!n||e.endOnly)}var i=e("../InteractEvent"),o=e("../Interaction"),s=e("../utils/extend"),a={names:[],setOffsets:function(e){var t=e.interaction,n=e.pageCoords,r=t.target,i=t.element,o=t.startOffset,s=r.getRect(i);s?(o.left=n.x-s.left,o.top=n.y-s.top,o.right=s.right-n.x,o.bottom=s.bottom-n.y,"width"in s||(s.width=s.right-s.left),"height"in s||(s.height=s.bottom-s.top)):o.left=o.top=o.right=o.bottom=0,e.rect=s,e.interactable=r,e.element=i;for(var l=0;l=p.length)break;f=p[d++]}else{if(d=p.next(),d.done)break;f=d.value}var v=f,g=a[v],h=t.target.options[t.prepared.name][v];r(h,i,o)&&(e.status=e.status=n[v],e.options=h,e.offset=e.interaction.modifierOffsets[v],g.set(e),e.status.locked&&(l.x+=e.status.dx,l.y+=e.status.dy,c.dx+=e.status.dx,c.dy+=e.status.dy,c.locked=!0))}return c.shouldMove=!e.status||!c.locked||e.status.changed,c},resetStatuses:function(e){for(var t=a.names,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var i;if(n){if(r>=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i,s=e[o]||{};s.dx=s.dy=0,s.modifiedX=s.modifiedY=NaN,s.locked=!1,s.changed=!0,e[o]=s}return e},start:function(e,t){var n=e.interaction,r={interaction:n,pageCoords:("action-resume"===t?n.curCoords:n.startCoords).page,startOffset:n.startOffset,statuses:n.modifierStatuses,preEnd:!1,requireEndOnly:!1};a.setOffsets(r),a.resetStatuses(r.statuses),r.pageCoords=s({},n.startCoords.page),n.modifierResult=a.setAll(r)}};o.signals.on("new",function(e){e.startOffset={left:0,right:0,top:0,bottom:0},e.modifierOffsets={},e.modifierStatuses=a.resetStatuses({}),e.modifierResult=null}),o.signals.on("action-start",a.start),o.signals.on("action-resume",a.start),o.signals.on("before-action-move",function(e){var t=e.interaction,n=e.preEnd,r=e.interactingBeforeMove,i=a.setAll({interaction:t,preEnd:n,pageCoords:t.curCoords.page,statuses:t.modifierStatuses,requireEndOnly:!1});!i.shouldMove&&r&&(t._dontFireMove=!0),t.modifierResult=i}),o.signals.on("action-end",function(e){for(var t=e.interaction,n=e.event,i=0;i=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}var m=h,y=m.x,x=m.y;l.push({x:s.left-i.width*y+u.x,y:s.top-i.height*x+u.y})}else l.push(u);return l},set:function(e){var t=e.interaction,n=e.pageCoords,r=e.status,i=e.options,s=e.offset,a=[],l=void 0,c=void 0,p=void 0;if(r.useStatusXY)c={x:r.x,y:r.y};else{var u=o.getOriginXY(t.target,t.element,t.prepared.name);c=o.extend({},n),c.x-=u.x,c.y-=u.y}r.realX=c.x,r.realY=c.y;for(var d=i.targets?i.targets.length:0,f=s,v=Array.isArray(f),g=0,f=v?f:f[Symbol.iterator]();;){var h;if(v){if(g>=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}for(var m=h,y=m.x,x=m.y,b=c.x-y,w=c.y-x,E=i.targets,S=Array.isArray(E),T=0,E=S?E:E[Symbol.iterator]();;){var C;if(S){if(T>=E.length)break;C=E[T++]}else{if(T=E.next(),T.done)break;C=T.value}var A=C;l=o.is.function(A)?A(b,w,t):A,l&&a.push({x:o.is.number(l.x)?l.x+y:b,y:o.is.number(l.y)?l.y+x:w,range:o.is.number(l.range)?l.range:i.range})}}var D={target:null,inRange:!1,distance:0,range:0,dx:0,dy:0};for(p=0,d=a.length;p=p.length)break;f=p[d++]}else{if(d=p.next(),d.done)break;f=d.value}var v=f,g=void 0;g=a.is.function(v)?v(l,c,t):v,g&&("width"in g&&"height"in g&&(g.x=g.width,g.y=g.height),e.options.targets.push(g))}i.set(e)},modifyCoords:function(e){var t=e.options;e.options=a.extend({},t), -e.options.enabled=t.enabled,e.options.relativePoints=[null],i.modifyCoords(e)}};r.snapSize=l,r.names.push("snapSize"),o.perAction.snapSize=l.defaults,s.defaults.snapSize=l.defaults,t.exports=l},{"../actions/resize":10,"../defaultOptions":18,"../utils/":44,"./index":24,"./snap":28}],30:[function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=e("../utils/pointerUtils");t.exports=function(){function e(t,n,o,s,a){if(r(this,e),i.pointerExtend(this,o),o!==n&&i.pointerExtend(this,n),this.interaction=a,this.timeStamp=(new Date).getTime(),this.originalEvent=o,this.type=t,this.pointerId=i.getPointerId(n),this.pointerType=i.getPointerType(n,a),this.target=s,this.currentTarget=null,"tap"===t){var l=a.getPointerIndex(n);this.dt=this.timeStamp-a.downTimes[l];var c=this.timeStamp-a.tapTime;this.double=!!(a.prevTap&&"doubletap"!==a.prevTap.type&&a.prevTap.target===this.target&&c<500)}else"doubletap"===t&&(this.dt=n.timeStamp-a.tapTime)}return e.prototype.subtractOrigin=function(e){var t=e.x,n=e.y;return this.pageX-=t,this.pageY-=n,this.clientX-=t,this.clientY-=n,this},e.prototype.addOrigin=function(e){var t=e.x,n=e.y;return this.pageX+=t,this.pageY+=n,this.clientX+=t,this.clientY+=n,this},e.prototype.preventDefault=function(){this.originalEvent.preventDefault()},e.prototype.stopPropagation=function(){this.propagationStopped=!0},e.prototype.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},e}()},{"../utils/pointerUtils":49}],31:[function(e,t,n){"use strict";function r(e){for(var t=e.interaction,n=e.pointer,s=e.event,l=e.eventTarget,c=e.type,u=void 0===c?e.pointerEvent.type:c,d=e.targets,f=void 0===d?i(e):d,v=e.pointerEvent,g=void 0===v?new o(u,n,s,l,t):v,h={interaction:t,pointer:n,event:s,eventTarget:l,targets:f,type:u,pointerEvent:g},m=0;m=u.length)break;g=u[v++]}else{if(v=u.next(),v.done)break;g=v.value}var h=g;c.element=h,p.fire("collect-targets",c)}return"hold"===o&&(c.targets=d(c.targets,function(e){return e.eventable.options.holdDuration===t.holdTimers[s].duration})),c.targets}var o=e("./PointerEvent"),s=e("../Interaction"),a=e("../utils"),l=e("../utils/browser"),c=e("../defaultOptions"),p=e("../utils/Signals").new(),u=e("../utils/arr"),d=u.filter,f=["down","up","cancel"],v=["down","up","cancel"],g={PointerEvent:o,fire:r,collectEventTargets:i,signals:p,defaults:{holdDuration:600,ignoreFrom:null,allowFrom:null,origin:{x:0,y:0}},types:["down","move","up","cancel","tap","doubletap","hold"]};s.signals.on("update-pointer-down",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers[n]={duration:1/0,timeout:null}}),s.signals.on("remove-pointer",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers.splice(n,1)}),s.signals.on("move",function(e){var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,s=e.duplicateMove,a=t.getPointerIndex(n);s||t.pointerIsDown&&!t.pointerWasMoved||(t.pointerIsDown&&clearTimeout(t.holdTimers[a].timeout),r({interaction:t,pointer:n,event:i,eventTarget:o,type:"move"}))}),s.signals.on("down",function(e){for(var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,s=e.pointerIndex,c=l.isIE8?a.extend({},i):i,u=t.holdTimers[s],d=a.getPath(o),f={interaction:t,pointer:n,event:i,eventTarget:o,type:"hold",targets:[],path:d,element:null},v=d,g=Array.isArray(v),h=0,v=g?v:v[Symbol.iterator]();;){var m;if(g){if(h>=v.length)break;m=v[h++]}else{if(h=v.next(),h.done)break;m=h.value}var y=m;f.element=y,p.fire("collect-targets",f)}if(f.targets.length){for(var x=1/0,b=0;b=0&&(p.selectors[u]!==e||p.contexts[u]!==t);u--);-1===u&&(u=p.selectors.length,p.selectors.push(e),p.contexts.push(t),p.listeners.push([])),p.listeners[u].push([i,!!s.capture,s.passive])}function s(e,t,n,r,o){var s=f(o),c=O[n],p=!1,u=void 0;if(c)for(u=c.selectors.length-1;u>=0;u--)if(c.selectors[u]===e&&c.contexts[u]===t){for(var d=c.listeners[u],v=d.length-1;v>=0;v--){var g=d[v],h=g[0],m=g[1],y=g[2];if(h===r&&m===!!s.capture&&y===s.passive){d.splice(v,1),d.length||(c.selectors.splice(u,1),c.contexts.splice(u,1),c.listeners.splice(u,1),i(t,n,a),i(t,n,l,!0),c.selectors.length||(O[n]=null)),p=!0;break}}if(p)break}}function a(e,t){var n=f(t),r={},i=O[e.type],o=g.getActualElement(e.path?e.path[0]:e.target),s=o;for(h(r,e),r.originalEvent=e,r.preventDefault=p;v.element(s);){for(var a=0;a=l.length)break;u=l[p++]}else{if(p=l.next(),p.done)break;u=p.value}var d=u,f=s[d](a);if(f)return f}},simulationResume:function(e){var t=e.mouseEvent,n=e.eventType,o=e.eventTarget;if(!/down|start/i.test(n))return null;for(var s=r.interactions,a=Array.isArray(s),l=0,s=a?s:s[Symbol.iterator]();;){var c;if(a){if(l>=s.length)break;c=s[l++]}else{if(l=s.next(),l.done)break;c=l.value}var p=c,u=o;if(p.simulation&&p.simulation.allowResume&&p.mouse===t)for(;u;){if(u===p.element)return p;u=i.parentNode(u)}}return null},mouse:function(e){var t=e.pointerId,n=e.mouseEvent,s=e.eventType;if(!n&&(o.supportsTouch||o.supportsPointerEvent))return null;for(var a=void 0,l=r.interactions,c=Array.isArray(l),p=0,l=c?l:l[Symbol.iterator]();;){var u;if(c){if(p>=l.length)break;u=l[p++]}else{if(p=l.next(),p.done)break;u=p.value}var d=u;if(d.mouse){if(d.simulation&&!i.contains(d.pointerIds,t))continue;if(d.interacting())return d;a||(a=d)}}if(a)return a;for(var f=r.interactions,v=Array.isArray(f),g=0,f=v?f:f[Symbol.iterator]();;){var h;if(v){if(g>=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}var m=h;if(m.mouse&&(!/down/.test(s)||!m.simulation))return m}return null},hasPointer:function(e){for(var t=e.pointerId,n=r.interactions,o=Array.isArray(n),s=0,n=o?n:n[Symbol.iterator]();;){var a;if(o){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var l=a;if(i.contains(l.pointerIds,t))return l}},idle:function(e){for(var t=e.mouseEvent,n=r.interactions,i=Array.isArray(n),o=0,n=i?n:n[Symbol.iterator]();;){var s;if(i){if(o>=n.length)break;s=n[o++]}else{if(o=n.next(),o.done)break;s=o.value}var a=s;if(1===a.pointerIds.length){var l=a.target;if(l&&!l.options.gesture.enabled)continue}else if(a.pointerIds.length>=2)continue;if(!a.interacting()&&t===a.mouse)return a}return null}};t.exports=s},{"../scope":34,"./browser":37,"./index":44}],46:[function(e,t,n){"use strict";var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},i=e("./window"),o=e("./isWindow"),s={array:function(){},window:function(e){return e===i.window||o(e)},docFrag:function(e){return s.object(e)&&11===e.nodeType},object:function(e){return!!e&&"object"===(void 0===e?"undefined":r(e))},function:function(e){return"function"==typeof e},number:function(e){return"number"==typeof e},bool:function(e){return"boolean"==typeof e},string:function(e){return"string"==typeof e},element:function(e){if(!e||"object"!==(void 0===e?"undefined":r(e)))return!1;var t=i.getWindow(e)||i.window;return/object|function/.test(r(t.Element))?e instanceof t.Element:1===e.nodeType&&"string"==typeof e.nodeName}};s.array=function(e){return s.object(e)&&void 0!==e.length&&s.function(e.splice)},t.exports=s},{"./isWindow":47,"./window":52}],47:[function(e,t,n){"use strict";t.exports=function(e){return!(!e||!e.Window)&&e instanceof e.Window}},{}],48:[function(e,t,n){"use strict";function r(e,n){for(var r in n){var i=t.exports.prefixedPropREs,o=!1;for(var s in i)if(0===r.indexOf(s)&&i[s].test(r)){o=!0;break}o||"function"==typeof n[r]||(e[r]=n[r])}return e}r.prefixedPropREs={webkit:/(Movement[XY]|Radius[XY]|RotationAngle|Force)$/},t.exports=r},{}],49:[function(e,t,n){"use strict";var r=e("./hypot"),i=e("./browser"),o=e("./domObjects"),s=e("./domUtils"),a=e("./is"),l=e("./pointerExtend"),c={copyCoords:function(e,t){e.page=e.page||{},e.page.x=t.page.x,e.page.y=t.page.y,e.client=e.client||{},e.client.x=t.client.x,e.client.y=t.client.y,e.timeStamp=t.timeStamp},setCoordDeltas:function(e,t,n){e.page.x=n.page.x-t.page.x,e.page.y=n.page.y-t.page.y,e.client.x=n.client.x-t.client.x,e.client.y=n.client.y-t.client.y,e.timeStamp=n.timeStamp-t.timeStamp;var i=Math.max(e.timeStamp/1e3,.001);e.page.speed=r(e.page.x,e.page.y)/i,e.page.vx=e.page.x/i,e.page.vy=e.page.y/i,e.client.speed=r(e.client.x,e.page.y)/i,e.client.vx=e.client.x/i,e.client.vy=e.client.y/i},isNativePointer:function(e){return e instanceof o.Event||e instanceof o.Touch},getXY:function(e,t,n){return n=n||{},e=e||"page",n.x=t[e+"X"],n.y=t[e+"Y"],n},getPageXY:function(e,t){return t=t||{},i.isOperaMobile&&c.isNativePointer(e)?(c.getXY("screen",e,t),t.x+=window.scrollX,t.y+=window.scrollY):c.getXY("page",e,t),t},getClientXY:function(e,t){return t=t||{},i.isOperaMobile&&c.isNativePointer(e)?c.getXY("screen",e,t):c.getXY("client",e,t),t},getPointerId:function(e){return a.number(e.pointerId)?e.pointerId:e.identifier},setCoords:function(e,t,n){var r=t.length>1?c.pointerAverage(t):t[0],i={};c.getPageXY(r,i),e.page.x=i.x,e.page.y=i.y,c.getClientXY(r,i),e.client.x=i.x,e.client.y=i.y,e.timeStamp=a.number(n)?n:(new Date).getTime()},pointerExtend:l,getTouchPair:function(e){var t=[];return a.array(e)?(t[0]=e[0],t[1]=e[1]):"touchend"===e.type?1===e.touches.length?(t[0]=e.touches[0],t[1]=e.changedTouches[0]):0===e.touches.length&&(t[0]=e.changedTouches[0],t[1]=e.changedTouches[1]):(t[0]=e.touches[0],t[1]=e.touches[1]),t},pointerAverage:function(e){for(var t={pageX:0,pageY:0,clientX:0,clientY:0,screenX:0,screenY:0},n=e,r=Array.isArray(n),i=0,n=r?n:n[Symbol.iterator]();;){var o;if(r){if(i>=n.length)break;o=n[i++]}else{if(i=n.next(),i.done)break;o=i.value}var s=o;for(var a in t)t[a]+=s[a]}for(var l in t)t[l]/=e.length;return t},touchBBox:function(e){if(e.length||e.touches&&e.touches.length>1){var t=c.getTouchPair(e),n=Math.min(t[0].pageX,t[1].pageX),r=Math.min(t[0].pageY,t[1].pageY);return{x:n,y:r,left:n,top:r,width:Math.max(t[0].pageX,t[1].pageX)-n,height:Math.max(t[0].pageY,t[1].pageY)-r}}},touchDistance:function(e,t){var n=t+"X",i=t+"Y",o=c.getTouchPair(e),s=o[0][n]-o[1][n],a=o[0][i]-o[1][i];return r(s,a)},touchAngle:function(e,t,n){var r=n+"X",i=n+"Y",o=c.getTouchPair(e),s=o[1][r]-o[0][r],a=o[1][i]-o[0][i];return 180*Math.atan2(a,s)/Math.PI},getPointerType:function(e,t){return t.mouse?"mouse":i.supportsPointerEvent?a.string(e.pointerType)?e.pointerType:[void 0,void 0,"touch","pen","mouse"][e.pointerType]:"touch"},getEventTargets:function(e){return[s.getActualElement(e.path?e.path[0]:e.target),s.getActualElement(e.currentTarget)]}};t.exports=c},{"./browser":37,"./domObjects":38,"./domUtils":39,"./hypot":43,"./is":46,"./pointerExtend":48}],50:[function(e,t,n){"use strict";for(var r=e("./window"),i=r.window,o=["ms","moz","webkit","o"],s=0,a=void 0,l=void 0,c=0;c6&&void 0!==arguments[6]&&arguments[6];r(this,e);var f=t.target,v=(f&&f.options||s).deltaSource,g=o(f,p,l),h="start"===c,m="end"===c,y=h?t.startCoords:t.curCoords,x=t.prevEvent;p=p||t.element;var b=i({},y.page),w=i({},y.client);b.x-=g.x,b.y-=g.y,w.x-=g.x,w.y-=g.y,this.ctrlKey=n.ctrlKey,this.altKey=n.altKey,this.shiftKey=n.shiftKey,this.metaKey=n.metaKey,this.button=n.button,this.buttons=n.buttons,this.target=p,this.currentTarget=p,this.relatedTarget=u||null,this.preEnd=d,this.type=l+(c||""),this.interaction=t,this.interactable=f,this.t0=h?t.downTimes[t.downTimes.length-1]:x.t0;var E={interaction:t,event:n,action:l,phase:c,element:p,related:u,page:b,client:w,coords:y,starting:h,ending:m,deltaSource:v,iEvent:this};a.fire("set-xy",E),m?(this.pageX=x.pageX,this.pageY=x.pageY,this.clientX=x.clientX,this.clientY=x.clientY):(this.pageX=b.x,this.pageY=b.y,this.clientX=w.x,this.clientY=w.y),this.x0=t.startCoords.page.x-g.x,this.y0=t.startCoords.page.y-g.y,this.clientX0=t.startCoords.client.x-g.x,this.clientY0=t.startCoords.client.y-g.y,a.fire("set-delta",E),this.timeStamp=y.timeStamp,this.dt=t.pointerDelta.timeStamp,this.duration=this.timeStamp-this.t0,this.speed=t.pointerDelta[v].speed,this.velocityX=t.pointerDelta[v].vx,this.velocityY=t.pointerDelta[v].vy,this.swipe=m||"inertiastart"===c?this.getSwipe():null,a.fire("new",E)}return e.prototype.getSwipe=function(){var e=this.interaction;if(e.prevEvent.speed<600||this.timeStamp-e.prevEvent.timeStamp>150)return null;var t=180*Math.atan2(e.prevEvent.velocityY,e.prevEvent.velocityX)/Math.PI;t<0&&(t+=360);var n=112.5<=t&&t<247.5,r=202.5<=t&&t<337.5,i=!n&&(292.5<=t||t<67.5);return{up:r,down:!r&&22.5<=t&&t<157.5,left:n,right:i,angle:t,speed:e.prevEvent.speed,velocity:{x:e.prevEvent.velocityX,y:e.prevEvent.velocityY}}},e.prototype.preventDefault=function(){},e.prototype.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},e.prototype.stopPropagation=function(){this.propagationStopped=!0},e}();a.on("set-delta",function(e){var t=e.iEvent,n=e.interaction,r=e.starting,i=e.deltaSource,o=r?t:n.prevEvent;"client"===i?(t.dx=t.clientX-o.clientX,t.dy=t.clientY-o.clientY):(t.dx=t.pageX-o.pageX,t.dy=t.pageY-o.pageY)}),l.signals=a,t.exports=l},{"./defaultOptions":18,"./utils/Signals":35,"./utils/extend":41,"./utils/getOriginXY":42}],4:[function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=e("./utils/is"),o=e("./utils/events"),s=e("./utils/extend"),a=e("./actions/base"),l=e("./scope"),c=e("./Eventable"),p=e("./defaultOptions"),u=e("./utils/Signals").new(),d=e("./utils/domUtils"),f=d.getElementRect,v=d.nodeContains,g=d.trySelector,h=e("./utils/window"),m=h.getWindow,y=e("./utils/arr"),x=y.indexOf,b=y.contains,w=e("./utils/browser"),E=w.wheelEvent;l.interactables=[];var S=function(){function e(t,n){r(this,e),n=n||{},this.target=t,this.events=new c,this._context=n.context||l.document,this._win=m(g(t)?this._context:t),this._doc=this._win.document,u.fire("new",{target:t,options:n,interactable:this,win:this._win}),l.addDocument(this._doc,this._win),l.interactables.push(this),this.set(n)}return e.prototype.setOnEvents=function(e,t){var n="on"+e;return i.function(t.onstart)&&(this.events[n+"start"]=t.onstart),i.function(t.onmove)&&(this.events[n+"move"]=t.onmove),i.function(t.onend)&&(this.events[n+"end"]=t.onend),i.function(t.oninertiastart)&&(this.events[n+"inertiastart"]=t.oninertiastart),this},e.prototype.setPerAction=function(e,t){for(var n in t)n in p[e]&&(i.object(t[n])?(this.options[e][n]=s(this.options[e][n]||{},t[n]),i.object(p.perAction[n])&&"enabled"in p.perAction[n]&&(this.options[e][n].enabled=!1!==t[n].enabled)):i.bool(t[n])&&i.object(p.perAction[n])?this.options[e][n].enabled=t[n]:void 0!==t[n]&&(this.options[e][n]=t[n]))},e.prototype.getRect=function(e){return e=e||this.target,i.string(this.target)&&!i.element(e)&&(e=this._context.querySelector(this.target)),f(e)},e.prototype.rectChecker=function(e){return i.function(e)?(this.getRect=e,this):null===e?(delete this.options.getRect,this):this.getRect},e.prototype._backCompatOption=function(e,t){if(g(t)||i.object(t)){this.options[e]=t;for(var n=a.names,r=Array.isArray(n),o=0,n=r?n:n[Symbol.iterator]();;){var s;if(r){if(o>=n.length)break;s=n[o++]}else{if(o=n.next(),o.done)break;s=o.value}var l=s;this.options[l][e]=t}return this}return this.options[e]},e.prototype.origin=function(e){return this._backCompatOption("origin",e)},e.prototype.deltaSource=function(e){return"page"===e||"client"===e?(this.options.deltaSource=e,this):this.options.deltaSource},e.prototype.context=function(){return this._context},e.prototype.inContext=function(e){return this._context===e.ownerDocument||v(this._context,e)},e.prototype.fire=function(e){return this.events.fire(e),this},e.prototype._onOffMultiple=function(e,t,n,r){if(i.string(t)&&-1!==t.search(" ")&&(t=t.trim().split(/ +/)),i.array(t)){for(var o=0;o=l.length)break;f=l[d++]}else{if(d=l.next(),d.done)break;f=d.value}var v=f;this.options[v]=p.base[v],v in t&&this[v](t[v])}return u.fire("set",{options:t,interactable:this}),this},e.prototype.unset=function(){if(o.remove(this.target,"all"),i.string(this.target))for(var e in o.delegatedEvents){var t=o.delegatedEvents[e];t.selectors[0]===this.target&&t.contexts[0]===this._context&&(t.selectors.splice(0,1),t.contexts.splice(0,1),t.listeners.splice(0,1),t.selectors.length||(t[e]=null)),o.remove(this._context,e,o.delegateListener),o.remove(this._context,e,o.delegateUseCapture,!0)}else o.remove(this,"all");u.fire("unset",{interactable:this}),l.interactables.splice(x(l.interactables,this),1);for(var n=l.interactions||[],r=Array.isArray(n),s=0,n=r?n:n[Symbol.iterator]();;){var a;if(r){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var c=a;c.target===this&&c.interacting()&&c.stop()}return l.interact},e}();l.interactables.indexOfElement=function(e,t){t=t||l.document;for(var n=0;n=x.length)break;E=x[w++]}else{if(w=x.next(),w.done)break;E=w.value}var S=E,T=S[0],C=S[1];C._updateEventTargets(i,o),C[e](T,t,i,o)}}}function o(e){for(var t=0;te.pointerMoveTolerance);var a={pointer:t,pointerIndex:this.getPointerIndex(t),event:n,eventTarget:r,dx:o,dy:s,duplicate:i,interaction:this,interactingBeforeMove:this.interacting()};i||l.setCoordDeltas(this.pointerDelta,this.prevCoords,this.curCoords),f.fire("move",a),i||(this.interacting()&&this.doMove(a),this.pointerWasMoved&&l.copyCoords(this.prevCoords,this.curCoords))},e.prototype.doMove=function(e){e=l.extend({pointer:this.pointers[0],event:this.prevEvent,eventTarget:this._eventTarget,interaction:this},e||{}),f.fire("before-action-move",e),this._dontFireMove||f.fire("action-move",e),this._dontFireMove=!1},e.prototype.pointerUp=function(e,t,n,r){var i=this.getPointerIndex(e);f.fire(/cancel$/i.test(t.type)?"cancel":"up",{pointer:e,pointerIndex:i,event:t,eventTarget:n,curEventTarget:r,interaction:this}),this.simulation||this.end(t),this.pointerIsDown=!1,this.removePointer(e,t)},e.prototype.end=function(e){e=e||this.prevEvent,this.interacting()&&f.fire("action-end",{event:e,interaction:this}),this.stop()},e.prototype.currentAction=function(){return this._interacting?this.prepared.name:null},e.prototype.interacting=function(){return this._interacting},e.prototype.stop=function(){f.fire("stop",{interaction:this}),this._interacting&&(f.fire("stop-active",{interaction:this}),f.fire("stop-"+this.prepared.name,{interaction:this})),this.target=this.element=null,this._interacting=!1,this.prepared.name=this.prevEvent=null},e.prototype.getPointerIndex=function(e){return"mouse"===this.pointerType||"pen"===this.pointerType?0:l.indexOf(this.pointerIds,l.getPointerId(e))},e.prototype.updatePointer=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:t&&/(down|start)$/i.test(t.type),r=l.getPointerId(e),i=this.getPointerIndex(e);return-1===i&&(i=this.pointerIds.length,this.pointerIds[i]=r),n&&f.fire("update-pointer-down",{pointer:e,event:t,down:n,pointerId:r,pointerIndex:i,interaction:this}),this.pointers[i]=e,i},e.prototype.removePointer=function(e,t){var n=this.getPointerIndex(e);-1!==n&&(f.fire("remove-pointer",{pointer:e,event:t,pointerIndex:n,interaction:this}),this.pointers.splice(n,1),this.pointerIds.splice(n,1),this.downTargets.splice(n,1),this.downTimes.splice(n,1))},e.prototype._updateEventTargets=function(e,t){this._eventTarget=e,this._curEventTarget=t},e}(),y=0,x=g.length;y=i.length)break;a=i[s++]}else{if(s=i.next(),s.done)break;a=s.value}var l=a;if(l.options.drop.enabled){var c=l.options.drop.accept;if(!(p.is.element(c)&&c!==t||p.is.string(c)&&!p.matchesSelector(t,c)))for(var d=p.is.string(l.target)?l._context.querySelectorAll(l.target):[l.target],f=0;fo.left&&c.xo.top&&c.y=o.left&&v<=o.right&&g>=o.top&&g<=o.bottom}if(f&&p.is.number(a)){s=Math.max(0,Math.min(o.right,f.right)-Math.max(o.left,f.left))*Math.max(0,Math.min(o.bottom,f.bottom)-Math.max(o.top,f.top))/(f.width*f.height)>=a}return this.options.drop.checker&&(s=this.options.drop.checker(e,t,s,this,i,n,r)),s},v.signals.on("unset",function(e){e.interactable.dropzone(!1)}),v.settingsMethods.push("dropChecker"),g.signals.on("new",function(e){e.dropTarget=null,e.dropElement=null,e.prevDropTarget=null,e.prevDropElement=null,e.dropEvents=null,e.activeDrops={dropzones:[],elements:[],rects:[]}}),g.signals.on("stop",function(e){var t=e.interaction;t.dropTarget=t.dropElement=t.prevDropTarget=t.prevDropElement=null}),d.dynamicDrop=function(e){return p.is.bool(e)?(y=e,d):y},p.merge(v.eventTypes,["dragenter","dragleave","dropactivate","dropdeactivate","dropmove","drop"]),c.methodDict.drop="dropzone",h.drop=m.defaults,t.exports=m},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../interact":21,"../scope":34,"../utils":44,"./base":6}],9:[function(e,t,n){"use strict";var r=e("./base"),i=e("../utils"),o=e("../InteractEvent"),s=e("../Interactable"),a=e("../Interaction"),l=e("../defaultOptions"),c={defaults:{enabled:!1,origin:null,restrict:null},checker:function(e,t,n,r,i){return i.pointerIds.length>=2?{name:"gesture"}:null},getCursor:function(){return""}};o.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;"gesturestart"===t.type&&(t.ds=0,n.gesture.startDistance=n.gesture.prevDistance=t.distance,n.gesture.startAngle=n.gesture.prevAngle=t.angle,n.gesture.scale=1)}),o.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;"gesturemove"===t.type&&(t.ds=t.scale-n.gesture.scale,n.target.fire(t),n.gesture.prevAngle=t.angle,n.gesture.prevDistance=t.distance,t.scale===1/0||null===t.scale||void 0===t.scale||isNaN(t.scale)||(n.gesture.scale=t.scale))}),s.prototype.gesturable=function(e){return i.is.object(e)?(this.options.gesture.enabled=!1!==e.enabled,this.setPerAction("gesture",e),this.setOnEvents("gesture",e),this):i.is.bool(e)?(this.options.gesture.enabled=e,e||(this.ongesturestart=this.ongesturestart=this.ongestureend=null),this):this.options.gesture},o.signals.on("set-delta",function(e){var t=e.interaction,n=e.iEvent,r=e.action,s=e.event,a=e.starting,l=e.ending,c=e.deltaSource;if("gesture"===r){var p=t.pointers;n.touches=[p[0],p[1]],a?(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=1,n.ds=0,n.angle=i.touchAngle(p,void 0,c),n.da=0):l||s instanceof o?(n.distance=t.prevEvent.distance,n.box=t.prevEvent.box,n.scale=t.prevEvent.scale,n.ds=n.scale-1,n.angle=t.prevEvent.angle,n.da=n.angle-t.gesture.startAngle):(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=n.distance/t.gesture.startDistance,n.angle=i.touchAngle(p,t.gesture.prevAngle,c),n.ds=n.scale-t.gesture.prevScale,n.da=n.angle-t.gesture.prevAngle)}}),a.signals.on("new",function(e){e.gesture={start:{x:0,y:0},startDistance:0,prevDistance:0,distance:0,scale:1,startAngle:0,prevAngle:0}}),r.gesture=c,r.names.push("gesture"),i.merge(s.eventTypes,["gesturestart","gesturemove","gestureend"]),r.methodDict.gesture="gesturable",l.gesture=c.defaults,t.exports=c},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"./base":6}],10:[function(e,t,n){"use strict";function r(e,t,n,r,i,s,a){if(!t)return!1;if(!0===t){var l=o.is.number(s.width)?s.width:s.right-s.left,c=o.is.number(s.height)?s.height:s.bottom-s.top;if(l<0&&("left"===e?e="right":"right"===e&&(e="left")),c<0&&("top"===e?e="bottom":"bottom"===e&&(e="top")),"left"===e)return n.x<(l>=0?s.left:s.right)+a;if("top"===e)return n.y<(c>=0?s.top:s.bottom)+a;if("right"===e)return n.x>(l>=0?s.right:s.left)-a;if("bottom"===e)return n.y>(c>=0?s.bottom:s.top)-a}return!!o.is.element(r)&&(o.is.element(t)?t===r:o.matchesUpTo(r,t,i))}var i=e("./base"),o=e("../utils"),s=e("../utils/browser"),a=e("../InteractEvent"),l=e("../Interactable"),c=e("../Interaction"),p=e("../defaultOptions"),u=s.supportsTouch||s.supportsPointerEvent?20:10,d={defaults:{enabled:!1,mouseButtons:null,origin:null,snap:null,restrict:null,inertia:null,autoScroll:null,square:!1,preserveAspectRatio:!1,axis:"xy",margin:NaN,edges:null,invert:"none"},checker:function(e,t,n,i,s,a){if(!a)return null;var l=o.extend({},s.curCoords.page),c=n.options;if(c.resize.enabled){var p=c.resize,d={left:!1,right:!1,top:!1,bottom:!1};if(o.is.object(p.edges)){for(var f in d)d[f]=r(f,p.edges[f],l,s._eventTarget,i,a,p.margin||u);if(d.left=d.left&&!d.right,d.top=d.top&&!d.bottom,d.left||d.right||d.top||d.bottom)return{name:"resize",edges:d}}else{var v="y"!==c.resize.axis&&l.x>a.right-u,g="x"!==c.resize.axis&&l.y>a.bottom-u;if(v||g)return{name:"resize",axes:(v?"x":"")+(g?"y":"")}}}return null},cursors:s.isIe9OrOlder?{x:"e-resize",y:"s-resize",xy:"se-resize",top:"n-resize",left:"w-resize",bottom:"s-resize",right:"e-resize",topleft:"se-resize",bottomright:"se-resize",topright:"ne-resize",bottomleft:"ne-resize"}:{x:"ew-resize",y:"ns-resize",xy:"nwse-resize",top:"ns-resize",left:"ew-resize",bottom:"ns-resize",right:"ew-resize",topleft:"nwse-resize",bottomright:"nwse-resize",topright:"nesw-resize",bottomleft:"nesw-resize"},getCursor:function(e){if(e.axis)return d.cursors[e.name+e.axis];if(e.edges){for(var t="",n=["top","bottom","left","right"],r=0;r<4;r++)e.edges[n[r]]&&(t+=n[r]);return d.cursors[t]}}};a.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;if("resizestart"===t.type&&n.prepared.edges){var r=n.target.getRect(n.element),i=n.target.options.resize;if(i.square||i.preserveAspectRatio){var s=o.extend({},n.prepared.edges);s.top=s.top||s.left&&!s.bottom,s.left=s.left||s.top&&!s.right,s.bottom=s.bottom||s.right&&!s.top,s.right=s.right||s.bottom&&!s.left,n.prepared._linkedEdges=s}else n.prepared._linkedEdges=null;i.preserveAspectRatio&&(n.resizeStartAspectRatio=r.width/r.height),n.resizeRects={start:r,current:o.extend({},r),inverted:o.extend({},r),previous:o.extend({},r),delta:{left:0,right:0,width:0,top:0,bottom:0,height:0}},t.rect=n.resizeRects.inverted,t.deltaRect=n.resizeRects.delta}}),a.signals.on("new",function(e){var t=e.iEvent,n=e.phase,r=e.interaction;if("move"===n&&r.prepared.edges){var i=r.target.options.resize,s=i.invert,a="reposition"===s||"negate"===s,l=r.prepared.edges,c=r.resizeRects.start,p=r.resizeRects.current,u=r.resizeRects.inverted,d=r.resizeRects.delta,f=o.extend(r.resizeRects.previous,u),v=l,g=t.dx,h=t.dy;if(i.preserveAspectRatio||i.square){var m=i.preserveAspectRatio?r.resizeStartAspectRatio:1;l=r.prepared._linkedEdges,v.left&&v.bottom||v.right&&v.top?h=-g/m:v.left||v.right?h=g/m:(v.top||v.bottom)&&(g=h*m)}if(l.top&&(p.top+=h),l.bottom&&(p.bottom+=h),l.left&&(p.left+=g),l.right&&(p.right+=g),a){if(o.extend(u,p),"reposition"===s){var y=void 0;u.top>u.bottom&&(y=u.top,u.top=u.bottom,u.bottom=y),u.left>u.right&&(y=u.left,u.left=u.right,u.right=y)}}else u.top=Math.min(p.top,c.bottom),u.bottom=Math.max(p.bottom,c.top),u.left=Math.min(p.left,c.right),u.right=Math.max(p.right,c.left);u.width=u.right-u.left,u.height=u.bottom-u.top;for(var x in u)d[x]=u[x]-f[x];t.edges=r.prepared.edges,t.rect=u,t.deltaRect=d}}),l.prototype.resizable=function(e){return o.is.object(e)?(this.options.resize.enabled=!1!==e.enabled,this.setPerAction("resize",e),this.setOnEvents("resize",e),/^x$|^y$|^xy$/.test(e.axis)?this.options.resize.axis=e.axis:null===e.axis&&(this.options.resize.axis=p.resize.axis),o.is.bool(e.preserveAspectRatio)?this.options.resize.preserveAspectRatio=e.preserveAspectRatio:o.is.bool(e.square)&&(this.options.resize.square=e.square),this):o.is.bool(e)?(this.options.resize.enabled=e, +e||(this.onresizestart=this.onresizestart=this.onresizeend=null),this):this.options.resize},c.signals.on("new",function(e){e.resizeAxes="xy"}),a.signals.on("set-delta",function(e){var t=e.interaction,n=e.iEvent;"resize"===e.action&&t.resizeAxes&&(t.target.options.resize.square?("y"===t.resizeAxes?n.dx=n.dy:n.dy=n.dx,n.axes="xy"):(n.axes=t.resizeAxes,"x"===t.resizeAxes?n.dy=0:"y"===t.resizeAxes&&(n.dx=0)))}),i.resize=d,i.names.push("resize"),o.merge(l.eventTypes,["resizestart","resizemove","resizeinertiastart","resizeinertiaresume","resizeend"]),i.methodDict.resize="resizable",p.resize=d.defaults,t.exports=d},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"../utils/browser":37,"./base":6}],11:[function(e,t,n){"use strict";var r=e("./utils/raf"),i=e("./utils/window").getWindow,o=e("./utils/is"),s=e("./utils/domUtils"),a=e("./Interaction"),l=e("./defaultOptions"),c={defaults:{enabled:!1,container:null,margin:60,speed:300},interaction:null,i:null,x:0,y:0,isScrolling:!1,prevTime:0,start:function(e){c.isScrolling=!0,r.cancel(c.i),c.interaction=e,c.prevTime=(new Date).getTime(),c.i=r.request(c.scroll)},stop:function(){c.isScrolling=!1,r.cancel(c.i)},scroll:function(){var e=c.interaction.target.options[c.interaction.prepared.name].autoScroll,t=e.container||i(c.interaction.element),n=(new Date).getTime(),s=(n-c.prevTime)/1e3,a=e.speed*s;a>=1&&(o.window(t)?t.scrollBy(c.x*a,c.y*a):t&&(t.scrollLeft+=c.x*a,t.scrollTop+=c.y*a),c.prevTime=n),c.isScrolling&&(r.cancel(c.i),c.i=r.request(c.scroll))},check:function(e,t){var n=e.options;return n[t].autoScroll&&n[t].autoScroll.enabled},onInteractionMove:function(e){var t=e.interaction,n=e.pointer;if(t.interacting()&&c.check(t.target,t.prepared.name)){if(t.simulation)return void(c.x=c.y=0);var r=void 0,a=void 0,l=void 0,p=void 0,u=t.target.options[t.prepared.name].autoScroll,d=u.container||i(t.element);if(o.window(d))p=n.clientXd.innerWidth-c.margin,l=n.clientY>d.innerHeight-c.margin;else{var f=s.getElementClientRect(d);p=n.clientXf.right-c.margin,l=n.clientY>f.bottom-c.margin}c.x=a?1:p?-1:0,c.y=l?1:r?-1:0,c.isScrolling||(c.margin=u.margin,c.speed=u.speed,c.start(t))}}};a.signals.on("stop-active",function(){c.stop()}),a.signals.on("action-move",c.onInteractionMove),l.perAction.autoScroll=c.defaults,t.exports=c},{"./Interaction":5,"./defaultOptions":18,"./utils/domUtils":39,"./utils/is":46,"./utils/raf":50,"./utils/window":52}],12:[function(e,t,n){"use strict";var r=e("../Interactable"),i=e("../actions/base"),o=e("../utils/is"),s=e("../utils/domUtils");r.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},r.prototype.ignoreFrom=function(e){return this._backCompatOption("ignoreFrom",e)},r.prototype.allowFrom=function(e){return this._backCompatOption("allowFrom",e)},r.prototype.testIgnore=function(e,t,n){return!(!e||!o.element(n))&&(o.string(e)?s.matchesUpTo(n,e,t):!!o.element(e)&&s.nodeContains(e,n))},r.prototype.testAllow=function(e,t,n){return!e||!!o.element(n)&&(o.string(e)?s.matchesUpTo(n,e,t):!!o.element(e)&&s.nodeContains(e,n))},r.prototype.testIgnoreAllow=function(e,t,n){return!this.testIgnore(e.ignoreFrom,t,n)&&this.testAllow(e.allowFrom,t,n)},r.prototype.actionChecker=function(e){return o.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},r.prototype.styleCursor=function(e){return o.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},r.prototype.defaultActionChecker=function(e,t,n,r){for(var o=this.getRect(r),s=null,a=i.names,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var u=p;if((!n.pointerIsDown||!n.mouse||0!=(t.buttons&this.options[u].mouseButtons))&&(s=i[u].checker(e,t,this,r,n,o)))return s}}},{"../Interactable":4,"../actions/base":6,"../utils/domUtils":39,"../utils/is":46}],13:[function(e,t,n){"use strict";function r(e,t,n,r){return g.is.object(e)&&t.testIgnoreAllow(t.options[e.name],n,r)&&t.options[e.name].enabled&&a(t,n,e)?e:null}function i(e,t,n,i,o,s){for(var a=0,l=i.length;a=m.maxInteractions)return!1;if(u.target===e){if((a+=d===n.name|0)>=i)return!1;if(u.element===t&&(l++,d!==n.name||l>=o))return!1}}}return m.maxInteractions>0}}var l=e("../interact"),c=e("../Interactable"),p=e("../Interaction"),u=e("../actions/base"),d=e("../defaultOptions"),f=e("../utils/browser"),v=e("../scope"),g=e("../utils"),h=e("../utils/Signals").new();e("./InteractableMethods");var m={signals:h,withinInteractionLimit:a,maxInteractions:1/0,defaults:{perAction:{manualStart:!1,max:1/0,maxPerElement:1,allowFrom:null,ignoreFrom:null}},setActionDefaults:function(e){g.extend(e.defaults,m.defaults.perAction)}};p.signals.on("down",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;if(!t.interacting()){s(t,o(t,n,r,i))}}),p.signals.on("move",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;if(t.mouse&&!t.pointerIsDown&&!t.interacting()){s(t,o(t,n,r,i))}}),p.signals.on("move",function(e){var t=e.interaction,n=e.event;if(t.pointerIsDown&&!t.interacting()&&t.pointerWasMoved&&t.prepared.name){h.fire("before-start",e);var r=t.target;t.prepared.name&&r&&(r.options[t.prepared.name].manualStart||!a(r,t.element,t.prepared)?t.stop(n):t.start(t.prepared,r,t.element))}}),p.signals.on("stop",function(e){var t=e.interaction,n=t.target;n&&n.options.styleCursor&&(n._doc.documentElement.style.cursor="")}),c.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},c.prototype.actionChecker=function(e){return g.is.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},c.prototype.styleCursor=function(e){return g.is.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},c.prototype.defaultActionChecker=function(e,t,n,r){for(var i=this.getRect(r),o=t.buttons||{0:1,1:4,3:8,4:16}[t.button],s=null,a=u.names,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var d=p;if((!n.pointerIsDown||!n.mouse||0!=(o&this.options[d].mouseButtons))&&(s=u[d].checker(e,t,this,r,n,i)))return s}},l.maxInteractions=function(e){return g.is.number(e)?(m.maxInteractions=e,this):m.maxInteractions},c.settingsMethods.push("styleCursor"),c.settingsMethods.push("actionChecker"),c.settingsMethods.push("ignoreFrom"),c.settingsMethods.push("allowFrom"),d.base.actionChecker=null,d.base.styleCursor=!0,g.extend(d.perAction,m.defaults.perAction),t.exports=m},{"../Interactable":4,"../Interaction":5,"../actions/base":6,"../defaultOptions":18,"../interact":21,"../scope":34,"../utils":44,"../utils/Signals":35,"../utils/browser":37,"./InteractableMethods":12}],14:[function(e,t,n){"use strict";var r=e("./base"),i=e("../Interaction");i.signals.on("new",function(e){e.delayTimer=null}),r.signals.on("prepared",function(e){var t=e.interaction,n=t.prepared.name;if(n){var r=t.target.options[n].delay;r>0&&(t.delayTimer=setTimeout(function(){t.start(t.prepared,t.target,t.element)},r))}}),i.signals.on("move",function(e){var t=e.interaction,n=e.duplicate;t.pointerWasMoved&&!n&&clearTimeout(t.delayTimer)}),r.signals.on("before-start",function(e){var t=e.interaction,n=t.prepared.name;if(n){t.target.options[n].delay>0&&(t.prepared.name=null)}})},{"../Interaction":5,"./base":13}],15:[function(e,t,n){"use strict";function r(e,t){if(!t)return!1;var n=t.options.drag.startAxis;return"xy"===e||"xy"===n||n===e}var i=e("./base"),o=e("../scope"),s=e("../utils/browser"),a=e("../utils/is"),l=e("../utils/domUtils"),c=l.matchesSelector,p=l.parentNode;i.setActionDefaults(e("../actions/drag")),i.signals.on("before-start",function(e){var t=e.interaction,n=e.eventTarget,l=e.dx,u=e.dy;if("drag"===t.prepared.name){var d=Math.abs(l),f=Math.abs(u),v=t.target.options.drag,g=v.startAxis,h=d>f?"x":dl.minSpeed&&g>l.endSpeed,b={interaction:t,pageCoords:v,statuses:f,preEnd:!0,requireEndOnly:!0};y&&!x&&(c.resetStatuses(f),m=c.setAll(b),m.shouldMove&&m.locked&&(h=!0)),(x||h)&&(p.copyCoords(i.upCoords,t.curCoords),t.pointers[0]=i.startEvent=new a(t,n,t.prepared.name,"inertiastart",t.element),i.t0=d,i.active=!0,i.allowResume=l.allowResume,t.simulation=i,o.fire(i.startEvent),x?(i.vx0=t.pointerDelta.client.vx,i.vy0=t.pointerDelta.client.vy,i.v0=g,r(t,i),p.extend(v,t.curCoords.page),v.x+=i.xe,v.y+=i.ye,c.resetStatuses(f),m=c.setAll(b),i.modifiedXe+=m.dx,i.modifiedYe+=m.dy,i.i=u.request(t.boundInertiaFrame)):(i.smoothEnd=!0,i.xe=m.dx,i.ye=m.dy,i.sx=i.sy=0,i.i=u.request(t.boundSmoothEndFrame)))}}),l.signals.on("stop-active",function(e){var t=e.interaction,n=t.inertiaStatus;n.active&&(u.cancel(n.i),n.active=!1,t.simulation=null)})},{"./InteractEvent":3,"./Interaction":5,"./modifiers":24,"./utils":44,"./utils/raf":50}],21:[function(e,t,n){"use strict";function r(e,t){var n=a.interactables.get(e,t);return n||(n=new l(e,t),n.events.global=p),n}var i=e("./utils/browser"),o=e("./utils/events"),s=e("./utils"),a=e("./scope"),l=e("./Interactable"),c=e("./Interaction"),p={};r.isSet=function(e,t){return-1!==a.interactables.indexOfElement(e,t&&t.context)},r.on=function(e,t,n){if(s.is.string(e)&&-1!==e.search(" ")&&(e=e.trim().split(/ +/)),s.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.on(f,t,n)}return r}if(s.is.object(e)){for(var v in e)r.on(v,e[v],t);return r}return s.contains(l.eventTypes,e)?p[e]?p[e].push(t):p[e]=[t]:o.add(a.document,e,t,{options:n}),r},r.off=function(e,t,n){if(s.is.string(e)&&-1!==e.search(" ")&&(e=e.trim().split(/ +/)),s.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.off(f,t,n)}return r}if(s.is.object(e)){for(var v in e)r.off(v,e[v],t);return r}if(s.contains(l.eventTypes,e)){var g=void 0;e in p&&-1!==(g=s.indexOf(p[e],t))&&p[e].splice(g,1)}else o.remove(a.document,e,t,n);return r},r.debug=function(){return a},r.getPointerAverage=s.pointerAverage,r.getTouchBBox=s.touchBBox,r.getTouchDistance=s.touchDistance,r.getTouchAngle=s.touchAngle,r.getElementRect=s.getElementRect,r.getElementClientRect=s.getElementClientRect,r.matchesSelector=s.matchesSelector,r.closest=s.closest,r.supportsTouch=function(){return i.supportsTouch},r.supportsPointerEvent=function(){return i.supportsPointerEvent},r.stop=function(e){for(var t=a.interactions.length-1;t>=0;t--)a.interactions[t].stop(e);return r},r.pointerMoveTolerance=function(e){return s.is.number(e)?(c.pointerMoveTolerance=e,this):c.pointerMoveTolerance},r.addDocument=a.addDocument,r.removeDocument=a.removeDocument,a.interact=r,t.exports=r},{"./Interactable":4,"./Interaction":5,"./scope":34,"./utils":44,"./utils/browser":37,"./utils/events":40}],22:[function(e,t,n){"use strict";function r(e){var t=e.interaction,n=e.event;t.target&&t.target.checkAndPreventDefault(n)}var i=e("./Interactable"),o=e("./Interaction"),s=e("./scope"),a=e("./utils/is"),l=e("./utils/events"),c=e("./utils/domUtils"),p=c.nodeContains,u=c.matchesSelector;i.prototype.preventDefault=function(e){return/^(always|never|auto)$/.test(e)?(this.options.preventDefault=e,this):a.bool(e)?(this.options.preventDefault=e?"always":"never",this):this.options.preventDefault},i.prototype.checkAndPreventDefault=function(e){var t=this.options.preventDefault;if("never"!==t)return"always"===t?void e.preventDefault():void(l.supportsOptions||/^(mouse|pointer|touch)*(down|start)/i.test(e.type)||a.element(e.target)&&u(e.target,"input,select,textarea,[contenteditable=true],[contenteditable=true] *")||e.preventDefault())};for(var d=["down","move","up","cancel"],f=0;f=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i;if(o.element&&(o.element===e.target||p(o.element,e.target)))return void o.target.checkAndPreventDefault(e)}}},{"./Interactable":4,"./Interaction":5,"./scope":34,"./utils/domUtils":39,"./utils/events":40,"./utils/is":46}],23:[function(e,t,n){"use strict";function r(e){var t=e.target,n=a.search(e,e.type,t);n&&n.prevTap&&e.clientX===n.prevTap.clientX&&e.clientY===n.prevTap.clientY&&t===n.prevTap.target&&(n.downTargets[0]=t,n.downTimes[0]=(new Date).getTime(),l.fire({interaction:n,event:e,eventTarget:t,pointer:e,type:"tap"}))}var i=e("./scope"),o=e("./utils/events"),s=e("./utils/browser"),a=e("./utils/interactionFinder"),l=e("./pointerEvents/base"),c=e("./utils/window"),p=c.window,u=Object.prototype.toString;if(p.Array.isArray||(p.Array.isArray=function(e){return"[object Array]"===u.call(e)}),String.prototype.trim||(String.prototype.trim=function(){return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")}),s.isIE8){var d=function(e){for(var t=i.interactions,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var o;if(n){if(r>=t.length)break;o=t[r++]}else{if(r=t.next(),r.done)break;o=r.value}var s=o;s.interacting()&&s.target.checkAndPreventDefault(e)}},f=function(e,t){var n=e.doc,i=(e.win,0===t.indexOf("listen")?o.add:o.remove);i(n,"selectstart",d),l&&i(n,"dblclick",r)};i.signals.on("add-document",f),i.signals.on("remove-document",f)}t.exports=null},{"./pointerEvents/base":31,"./scope":34,"./utils/browser":37,"./utils/events":40,"./utils/interactionFinder":45,"./utils/window":52}],24:[function(e,t,n){"use strict";function r(e,t,n){return e&&e.enabled&&(t||!e.endOnly)&&(!n||e.endOnly)}var i=e("../InteractEvent"),o=e("../Interaction"),s=e("../utils/extend"),a={names:[],setOffsets:function(e){var t=e.interaction,n=e.pageCoords,r=t.target,i=t.element,o=t.startOffset,s=r.getRect(i);s?(o.left=n.x-s.left,o.top=n.y-s.top,o.right=s.right-n.x,o.bottom=s.bottom-n.y,"width"in s||(s.width=s.right-s.left),"height"in s||(s.height=s.bottom-s.top)):o.left=o.top=o.right=o.bottom=0,e.rect=s,e.interactable=r,e.element=i;for(var l=0;l=p.length)break;f=p[d++]}else{if(d=p.next(),d.done)break;f=d.value}var v=f,g=a[v],h=t.target.options[t.prepared.name][v];r(h,i,o)&&(e.status=e.status=n[v],e.options=h,e.offset=e.interaction.modifierOffsets[v],g.set(e),e.status.locked&&(l.x+=e.status.dx,l.y+=e.status.dy,c.dx+=e.status.dx,c.dy+=e.status.dy,c.locked=!0))}return c.shouldMove=!e.status||!c.locked||e.status.changed,c},resetStatuses:function(e){for(var t=a.names,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var i;if(n){if(r>=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i,s=e[o]||{};s.dx=s.dy=0,s.modifiedX=s.modifiedY=NaN,s.locked=!1,s.changed=!0,e[o]=s}return e},start:function(e,t){var n=e.interaction,r={interaction:n,pageCoords:("action-resume"===t?n.curCoords:n.startCoords).page,startOffset:n.startOffset,statuses:n.modifierStatuses,preEnd:!1,requireEndOnly:!1};a.setOffsets(r),a.resetStatuses(r.statuses),r.pageCoords=s({},n.startCoords.page),n.modifierResult=a.setAll(r)}};o.signals.on("new",function(e){e.startOffset={left:0,right:0,top:0,bottom:0},e.modifierOffsets={},e.modifierStatuses=a.resetStatuses({}),e.modifierResult=null}),o.signals.on("action-start",a.start),o.signals.on("action-resume",a.start),o.signals.on("before-action-move",function(e){var t=e.interaction,n=e.preEnd,r=e.interactingBeforeMove,i=a.setAll({interaction:t,preEnd:n,pageCoords:t.curCoords.page,statuses:t.modifierStatuses,requireEndOnly:!1});!i.shouldMove&&r&&(t._dontFireMove=!0),t.modifierResult=i}),o.signals.on("action-end",function(e){for(var t=e.interaction,n=e.event,i=0;i=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}var m=h,y=m.x,x=m.y;l.push({x:s.left-i.width*y+u.x,y:s.top-i.height*x+u.y})}else l.push(u);return l},set:function(e){var t=e.interaction,n=e.pageCoords,r=e.status,i=e.options,s=e.offset,a=[],l=void 0,c=void 0,p=void 0;if(r.useStatusXY)c={x:r.x,y:r.y};else{var u=o.getOriginXY(t.target,t.element,t.prepared.name);c=o.extend({},n),c.x-=u.x,c.y-=u.y}r.realX=c.x,r.realY=c.y;for(var d=i.targets?i.targets.length:0,f=s,v=Array.isArray(f),g=0,f=v?f:f[Symbol.iterator]();;){var h;if(v){if(g>=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}for(var m=h,y=m.x,x=m.y,b=c.x-y,w=c.y-x,E=i.targets,S=Array.isArray(E),T=0,E=S?E:E[Symbol.iterator]();;){var C;if(S){if(T>=E.length)break;C=E[T++]}else{if(T=E.next(),T.done)break;C=T.value}var A=C;l=o.is.function(A)?A(b,w,t):A,l&&a.push({x:o.is.number(l.x)?l.x+y:b,y:o.is.number(l.y)?l.y+x:w,range:o.is.number(l.range)?l.range:i.range})}}var D={target:null,inRange:!1,distance:0,range:0,dx:0,dy:0};for(p=0,d=a.length;p=p.length)break;f=p[d++]}else{if(d=p.next(),d.done)break;f=d.value}var v=f,g=void 0;g=a.is.function(v)?v(l,c,t):v,g&&("width"in g&&"height"in g&&(g.x=g.width, +g.y=g.height),e.options.targets.push(g))}i.set(e)},modifyCoords:function(e){var t=e.options;e.options=a.extend({},t),e.options.enabled=t.enabled,e.options.relativePoints=[null],i.modifyCoords(e)}};r.snapSize=l,r.names.push("snapSize"),o.perAction.snapSize=l.defaults,s.defaults.snapSize=l.defaults,t.exports=l},{"../actions/resize":10,"../defaultOptions":18,"../utils/":44,"./index":24,"./snap":28}],30:[function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=e("../utils/pointerUtils");t.exports=function(){function e(t,n,o,s,a){if(r(this,e),i.pointerExtend(this,o),o!==n&&i.pointerExtend(this,n),this.interaction=a,this.timeStamp=(new Date).getTime(),this.originalEvent=o,this.type=t,this.pointerId=i.getPointerId(n),this.pointerType=i.getPointerType(n),this.target=s,this.currentTarget=null,"tap"===t){var l=a.getPointerIndex(n);this.dt=this.timeStamp-a.downTimes[l];var c=this.timeStamp-a.tapTime;this.double=!!(a.prevTap&&"doubletap"!==a.prevTap.type&&a.prevTap.target===this.target&&c<500)}else"doubletap"===t&&(this.dt=n.timeStamp-a.tapTime)}return e.prototype.subtractOrigin=function(e){var t=e.x,n=e.y;return this.pageX-=t,this.pageY-=n,this.clientX-=t,this.clientY-=n,this},e.prototype.addOrigin=function(e){var t=e.x,n=e.y;return this.pageX+=t,this.pageY+=n,this.clientX+=t,this.clientY+=n,this},e.prototype.preventDefault=function(){this.originalEvent.preventDefault()},e.prototype.stopPropagation=function(){this.propagationStopped=!0},e.prototype.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},e}()},{"../utils/pointerUtils":49}],31:[function(e,t,n){"use strict";function r(e){for(var t=e.interaction,n=e.pointer,s=e.event,l=e.eventTarget,c=e.type,u=void 0===c?e.pointerEvent.type:c,d=e.targets,f=void 0===d?i(e):d,v=e.pointerEvent,g=void 0===v?new o(u,n,s,l,t):v,h={interaction:t,pointer:n,event:s,eventTarget:l,targets:f,type:u,pointerEvent:g},m=0;m=u.length)break;g=u[v++]}else{if(v=u.next(),v.done)break;g=v.value}var h=g;c.element=h,p.fire("collect-targets",c)}return"hold"===o&&(c.targets=d(c.targets,function(e){return e.eventable.options.holdDuration===t.holdTimers[s].duration})),c.targets}var o=e("./PointerEvent"),s=e("../Interaction"),a=e("../utils"),l=e("../utils/browser"),c=e("../defaultOptions"),p=e("../utils/Signals").new(),u=e("../utils/arr"),d=u.filter,f=["down","up","cancel"],v=["down","up","cancel"],g={PointerEvent:o,fire:r,collectEventTargets:i,signals:p,defaults:{holdDuration:600,ignoreFrom:null,allowFrom:null,origin:{x:0,y:0}},types:["down","move","up","cancel","tap","doubletap","hold"]};s.signals.on("update-pointer-down",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers[n]={duration:1/0,timeout:null}}),s.signals.on("remove-pointer",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers.splice(n,1)}),s.signals.on("move",function(e){var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,s=e.duplicateMove,a=t.getPointerIndex(n);s||t.pointerIsDown&&!t.pointerWasMoved||(t.pointerIsDown&&clearTimeout(t.holdTimers[a].timeout),r({interaction:t,pointer:n,event:i,eventTarget:o,type:"move"}))}),s.signals.on("down",function(e){for(var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,s=e.pointerIndex,c=l.isIE8?a.extend({},i):i,u=t.holdTimers[s],d=a.getPath(o),f={interaction:t,pointer:n,event:i,eventTarget:o,type:"hold",targets:[],path:d,element:null},v=d,g=Array.isArray(v),h=0,v=g?v:v[Symbol.iterator]();;){var m;if(g){if(h>=v.length)break;m=v[h++]}else{if(h=v.next(),h.done)break;m=h.value}var y=m;f.element=y,p.fire("collect-targets",f)}if(f.targets.length){for(var x=1/0,b=0;b=0&&(p.selectors[u]!==e||p.contexts[u]!==t);u--);-1===u&&(u=p.selectors.length,p.selectors.push(e),p.contexts.push(t),p.listeners.push([])),p.listeners[u].push([i,!!s.capture,s.passive])}function s(e,t,n,r,o){var s=f(o),c=O[n],p=!1,u=void 0;if(c)for(u=c.selectors.length-1;u>=0;u--)if(c.selectors[u]===e&&c.contexts[u]===t){for(var d=c.listeners[u],v=d.length-1;v>=0;v--){var g=d[v],h=g[0],m=g[1],y=g[2];if(h===r&&m===!!s.capture&&y===s.passive){d.splice(v,1),d.length||(c.selectors.splice(u,1),c.contexts.splice(u,1),c.listeners.splice(u,1),i(t,n,a),i(t,n,l,!0),c.selectors.length||(O[n]=null)),p=!0;break}}if(p)break}}function a(e,t){var n=f(t),r={},i=O[e.type],o=g.getActualElement(e.path?e.path[0]:e.target),s=o;for(h(r,e),r.originalEvent=e,r.preventDefault=p;v.element(s);){for(var a=0;a=l.length)break;u=l[p++]}else{if(p=l.next(),p.done)break;u=p.value}var d=u,f=o[d](a);if(f)return f}},simulationResume:function(e){var t=e.pointerType,n=e.eventType,o=e.eventTarget;if(!/down|start/i.test(n))return null;for(var s=r.interactions,a=Array.isArray(s),l=0,s=a?s:s[Symbol.iterator]();;){var c;if(a){if(l>=s.length)break;c=s[l++]}else{if(l=s.next(),l.done)break;c=l.value}var p=c,u=o;if(p.simulation&&p.simulation.allowResume&&p.pointerType===t)for(;u;){if(u===p.element)return p;u=i.parentNode(u)}}return null},mouseOrPen:function(e){var t=e.pointerId,n=e.pointerType,o=e.eventType;if("mouse"!==n&&"pen"!==n)return null;for(var s=void 0,a=r.interactions,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var u=p;if(u.pointerType===n){if(u.simulation&&!i.contains(u.pointerIds,t))continue;if(u.interacting())return u;s||(s=u)}}if(s)return s;for(var d=r.interactions,f=Array.isArray(d),v=0,d=f?d:d[Symbol.iterator]();;){var g;if(f){if(v>=d.length)break;g=d[v++]}else{if(v=d.next(),v.done)break;g=v.value}var h=g;if(!(h.pointerType!==n||/down/i.test(o)&&h.simulation))return h}return null},hasPointer:function(e){for(var t=e.pointerId,n=r.interactions,o=Array.isArray(n),s=0,n=o?n:n[Symbol.iterator]();;){var a;if(o){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var l=a;if(i.contains(l.pointerIds,t))return l}},idle:function(e){for(var t=e.pointerType,n=r.interactions,i=Array.isArray(n),o=0,n=i?n:n[Symbol.iterator]();;){var s;if(i){if(o>=n.length)break;s=n[o++]}else{if(o=n.next(),o.done)break;s=o.value}var a=s;if(1===a.pointerIds.length){var l=a.target;if(l&&!l.options.gesture.enabled)continue}else if(a.pointerIds.length>=2)continue;if(!a.interacting()&&t===a.pointerType)return a}return null}};t.exports=o},{"../scope":34,"./index":44}],46:[function(e,t,n){"use strict";var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},i=e("./window"),o=e("./isWindow"),s={array:function(){},window:function(e){return e===i.window||o(e)},docFrag:function(e){return s.object(e)&&11===e.nodeType},object:function(e){return!!e&&"object"===(void 0===e?"undefined":r(e))},function:function(e){return"function"==typeof e},number:function(e){return"number"==typeof e},bool:function(e){return"boolean"==typeof e},string:function(e){return"string"==typeof e},element:function(e){if(!e||"object"!==(void 0===e?"undefined":r(e)))return!1;var t=i.getWindow(e)||i.window;return/object|function/.test(r(t.Element))?e instanceof t.Element:1===e.nodeType&&"string"==typeof e.nodeName}};s.array=function(e){return s.object(e)&&void 0!==e.length&&s.function(e.splice)},t.exports=s},{"./isWindow":47,"./window":52}],47:[function(e,t,n){"use strict";t.exports=function(e){return!(!e||!e.Window)&&e instanceof e.Window}},{}],48:[function(e,t,n){"use strict";function r(e,n){for(var r in n){var i=t.exports.prefixedPropREs,o=!1;for(var s in i)if(0===r.indexOf(s)&&i[s].test(r)){o=!0;break}o||"function"==typeof n[r]||(e[r]=n[r])}return e}r.prefixedPropREs={webkit:/(Movement[XY]|Radius[XY]|RotationAngle|Force)$/},t.exports=r},{}],49:[function(e,t,n){"use strict";var r=e("./hypot"),i=e("./browser"),o=e("./domObjects"),s=e("./domUtils"),a=e("./domObjects"),l=e("./is"),c=e("./pointerExtend"),p={copyCoords:function(e,t){e.page=e.page||{},e.page.x=t.page.x,e.page.y=t.page.y,e.client=e.client||{},e.client.x=t.client.x,e.client.y=t.client.y,e.timeStamp=t.timeStamp},setCoordDeltas:function(e,t,n){e.page.x=n.page.x-t.page.x,e.page.y=n.page.y-t.page.y,e.client.x=n.client.x-t.client.x,e.client.y=n.client.y-t.client.y,e.timeStamp=n.timeStamp-t.timeStamp;var i=Math.max(e.timeStamp/1e3,.001);e.page.speed=r(e.page.x,e.page.y)/i,e.page.vx=e.page.x/i,e.page.vy=e.page.y/i,e.client.speed=r(e.client.x,e.page.y)/i,e.client.vx=e.client.x/i,e.client.vy=e.client.y/i},isNativePointer:function(e){return e instanceof o.Event||e instanceof o.Touch},getXY:function(e,t,n){return n=n||{},e=e||"page",n.x=t[e+"X"],n.y=t[e+"Y"],n},getPageXY:function(e,t){return t=t||{},i.isOperaMobile&&p.isNativePointer(e)?(p.getXY("screen",e,t),t.x+=window.scrollX,t.y+=window.scrollY):p.getXY("page",e,t),t},getClientXY:function(e,t){return t=t||{},i.isOperaMobile&&p.isNativePointer(e)?p.getXY("screen",e,t):p.getXY("client",e,t),t},getPointerId:function(e){return l.number(e.pointerId)?e.pointerId:e.identifier},setCoords:function(e,t,n){var r=t.length>1?p.pointerAverage(t):t[0],i={};p.getPageXY(r,i),e.page.x=i.x,e.page.y=i.y,p.getClientXY(r,i),e.client.x=i.x,e.client.y=i.y,e.timeStamp=l.number(n)?n:(new Date).getTime()},pointerExtend:c,getTouchPair:function(e){var t=[];return l.array(e)?(t[0]=e[0],t[1]=e[1]):"touchend"===e.type?1===e.touches.length?(t[0]=e.touches[0],t[1]=e.changedTouches[0]):0===e.touches.length&&(t[0]=e.changedTouches[0],t[1]=e.changedTouches[1]):(t[0]=e.touches[0],t[1]=e.touches[1]),t},pointerAverage:function(e){for(var t={pageX:0,pageY:0,clientX:0,clientY:0,screenX:0,screenY:0},n=e,r=Array.isArray(n),i=0,n=r?n:n[Symbol.iterator]();;){var o;if(r){if(i>=n.length)break;o=n[i++]}else{if(i=n.next(),i.done)break;o=i.value}var s=o;for(var a in t)t[a]+=s[a]}for(var l in t)t[l]/=e.length;return t},touchBBox:function(e){if(e.length||e.touches&&e.touches.length>1){var t=p.getTouchPair(e),n=Math.min(t[0].pageX,t[1].pageX),r=Math.min(t[0].pageY,t[1].pageY);return{x:n,y:r,left:n,top:r,width:Math.max(t[0].pageX,t[1].pageX)-n,height:Math.max(t[0].pageY,t[1].pageY)-r}}},touchDistance:function(e,t){var n=t+"X",i=t+"Y",o=p.getTouchPair(e),s=o[0][n]-o[1][n],a=o[0][i]-o[1][i];return r(s,a)},touchAngle:function(e,t,n){var r=n+"X",i=n+"Y",o=p.getTouchPair(e),s=o[1][r]-o[0][r],a=o[1][i]-o[0][i];return 180*Math.atan2(a,s)/Math.PI},getPointerType:function(e){return l.string(e.pointerType)?e.pointerType:l.number(e.pointerType)?[void 0,void 0,"touch","pen","mouse"][e.pointerType]:/touch/.test(e.type)||e instanceof a.Touch?"touch":"mouse"},getEventTargets:function(e){return[s.getActualElement(e.path?e.path[0]:e.target),s.getActualElement(e.currentTarget)]}};t.exports=p},{"./browser":37,"./domObjects":38,"./domUtils":39,"./hypot":43,"./is":46,"./pointerExtend":48}],50:[function(e,t,n){"use strict";for(var r=e("./window"),i=r.window,o=["ms","moz","webkit","o"],s=0,a=void 0,l=void 0,c=0;c\n * Open source under the MIT License.\n * https://raw.github.com/taye/interact.js/master/LICENSE\n */\n","/*\n * In a (windowless) server environment this file exports a factory function\n * that takes the window to use.\n *\n * var interact = require('interact.js')(windowObject);\n *\n * See https://github.com/taye/interact.js/issues/187\n */\nif (typeof window === 'undefined') {\n module.exports = function (window) {\n require('./src/utils/window').init(window);\n\n return require('./src/index');\n };\n}\nelse {\n module.exports = require('./src/index');\n}\n","const { indexOf } = require('./utils/arr');\nconst extend = require('./utils/extend.js');\n\nfunction fireUntilImmediateStopped (event, listeners) {\n for (let i = 0, len = listeners.length; i < len && !event.immediatePropagationStopped; i++) {\n listeners[i](event);\n }\n}\n\nclass Eventable {\n\n constructor (options) {\n this.options = extend({}, options || {});\n }\n\n fire (event) {\n let listeners;\n const onEvent = 'on' + event.type;\n const global = this.global;\n\n // Interactable#on() listeners\n if ((listeners = this[event.type])) {\n fireUntilImmediateStopped(event, listeners);\n }\n\n // interactable.onevent listener\n if (this[onEvent]) {\n this[onEvent](event);\n }\n\n // interact.on() listeners\n if (!event.propagationStopped && global && (listeners = global[event.type])) {\n fireUntilImmediateStopped(event, listeners);\n }\n }\n\n on (eventType, listener) {\n // if this type of event was never bound\n if (this[eventType]) {\n this[eventType].push(listener);\n }\n else {\n this[eventType] = [listener];\n }\n }\n\n off (eventType, listener) {\n // if it is an action event type\n const eventList = this[eventType];\n const index = eventList? indexOf(eventList, listener) : -1;\n\n if (index !== -1) {\n eventList.splice(index, 1);\n }\n\n if (eventList && eventList.length === 0 || !listener) {\n this[eventType] = listener;\n }\n }\n}\n\nmodule.exports = Eventable;\n","const extend = require('./utils/extend');\nconst getOriginXY = require('./utils/getOriginXY');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nclass InteractEvent {\n constructor (interaction, event, action, phase, element, related, preEnd = false) {\n const target = interaction.target;\n const deltaSource = (target && target.options || defaults).deltaSource;\n const origin = getOriginXY(target, element, action);\n const starting = phase === 'start';\n const ending = phase === 'end';\n const coords = starting? interaction.startCoords : interaction.curCoords;\n const prevEvent = interaction.prevEvent;\n\n element = element || interaction.element;\n\n const page = extend({}, coords.page);\n const client = extend({}, coords.client);\n\n page.x -= origin.x;\n page.y -= origin.y;\n\n client.x -= origin.x;\n client.y -= origin.y;\n\n this.ctrlKey = event.ctrlKey;\n this.altKey = event.altKey;\n this.shiftKey = event.shiftKey;\n this.metaKey = event.metaKey;\n this.button = event.button;\n this.buttons = event.buttons;\n this.target = element;\n this.currentTarget = element;\n this.relatedTarget = related || null;\n this.preEnd = preEnd;\n this.type = action + (phase || '');\n this.interaction = interaction;\n this.interactable = target;\n\n this.t0 = starting ? interaction.downTimes[interaction.downTimes.length - 1]\n : prevEvent.t0;\n\n const signalArg = {\n interaction,\n event,\n action,\n phase,\n element,\n related,\n page,\n client,\n coords,\n starting,\n ending,\n deltaSource,\n iEvent: this,\n };\n\n signals.fire('set-xy', signalArg);\n\n if (ending) {\n // use previous coords when ending\n this.pageX = prevEvent.pageX;\n this.pageY = prevEvent.pageY;\n this.clientX = prevEvent.clientX;\n this.clientY = prevEvent.clientY;\n }\n else {\n this.pageX = page.x;\n this.pageY = page.y;\n this.clientX = client.x;\n this.clientY = client.y;\n }\n\n this.x0 = interaction.startCoords.page.x - origin.x;\n this.y0 = interaction.startCoords.page.y - origin.y;\n this.clientX0 = interaction.startCoords.client.x - origin.x;\n this.clientY0 = interaction.startCoords.client.y - origin.y;\n\n signals.fire('set-delta', signalArg);\n\n this.timeStamp = coords.timeStamp;\n this.dt = interaction.pointerDelta.timeStamp;\n this.duration = this.timeStamp - this.t0;\n\n // speed and velocity in pixels per second\n this.speed = interaction.pointerDelta[deltaSource].speed;\n this.velocityX = interaction.pointerDelta[deltaSource].vx;\n this.velocityY = interaction.pointerDelta[deltaSource].vy;\n\n this.swipe = (ending || phase === 'inertiastart')? this.getSwipe() : null;\n\n signals.fire('new', signalArg);\n }\n\n getSwipe () {\n const interaction = this.interaction;\n\n if (interaction.prevEvent.speed < 600\n || this.timeStamp - interaction.prevEvent.timeStamp > 150) {\n return null;\n }\n\n let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI;\n const overlap = 22.5;\n\n if (angle < 0) {\n angle += 360;\n }\n\n const left = 135 - overlap <= angle && angle < 225 + overlap;\n const up = 225 - overlap <= angle && angle < 315 + overlap;\n\n const right = !left && (315 - overlap <= angle || angle < 45 + overlap);\n const down = !up && 45 - overlap <= angle && angle < 135 + overlap;\n\n return {\n up,\n down,\n left,\n right,\n angle,\n speed: interaction.prevEvent.speed,\n velocity: {\n x: interaction.prevEvent.velocityX,\n y: interaction.prevEvent.velocityY,\n },\n };\n }\n\n preventDefault () {}\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n}\n\nsignals.on('set-delta', function ({ iEvent, interaction, starting, deltaSource }) {\n const prevEvent = starting? iEvent : interaction.prevEvent;\n\n if (deltaSource === 'client') {\n iEvent.dx = iEvent.clientX - prevEvent.clientX;\n iEvent.dy = iEvent.clientY - prevEvent.clientY;\n }\n else {\n iEvent.dx = iEvent.pageX - prevEvent.pageX;\n iEvent.dy = iEvent.pageY - prevEvent.pageY;\n }\n});\n\nInteractEvent.signals = signals;\n\nmodule.exports = InteractEvent;\n","const is = require('./utils/is');\nconst events = require('./utils/events');\nconst extend = require('./utils/extend');\nconst actions = require('./actions/base');\nconst scope = require('./scope');\nconst Eventable = require('./Eventable');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nconst {\n getElementRect,\n nodeContains,\n trySelector,\n} = require('./utils/domUtils');\nconst { getWindow } = require('./utils/window');\nconst { indexOf, contains } = require('./utils/arr');\nconst { wheelEvent } = require('./utils/browser');\n\n// all set interactables\nscope.interactables = [];\n\n/*\\\n * Interactable\n [ property ]\n **\n * Object type returned by @interact\n\\*/\nclass Interactable {\n constructor (target, options) {\n options = options || {};\n\n this.target = target;\n this.events = new Eventable();\n this._context = options.context || scope.document;\n this._win = getWindow(trySelector(target)? this._context : target);\n this._doc = this._win.document;\n\n signals.fire('new', {\n target,\n options,\n interactable: this,\n win: this._win,\n });\n\n scope.addDocument( this._doc, this._win );\n\n scope.interactables.push(this);\n\n this.set(options);\n }\n\n setOnEvents (action, phases) {\n const onAction = 'on' + action;\n\n if (is.function(phases.onstart) ) { this.events[onAction + 'start' ] = phases.onstart ; }\n if (is.function(phases.onmove) ) { this.events[onAction + 'move' ] = phases.onmove ; }\n if (is.function(phases.onend) ) { this.events[onAction + 'end' ] = phases.onend ; }\n if (is.function(phases.oninertiastart)) { this.events[onAction + 'inertiastart' ] = phases.oninertiastart ; }\n\n return this;\n }\n\n setPerAction (action, options) {\n // for all the default per-action options\n for (const option in options) {\n // if this option exists for this action\n if (option in defaults[action]) {\n // if the option in the options arg is an object value\n if (is.object(options[option])) {\n // duplicate the object\n this.options[action][option] = extend(this.options[action][option] || {}, options[option]);\n\n if (is.object(defaults.perAction[option]) && 'enabled' in defaults.perAction[option]) {\n this.options[action][option].enabled = options[option].enabled === false? false : true;\n }\n }\n else if (is.bool(options[option]) && is.object(defaults.perAction[option])) {\n this.options[action][option].enabled = options[option];\n }\n else if (options[option] !== undefined) {\n // or if it's not undefined, do a plain assignment\n this.options[action][option] = options[option];\n }\n }\n }\n }\n\n /*\\\n * Interactable.getRect\n [ method ]\n *\n * The default function to get an Interactables bounding rect. Can be\n * overridden using @Interactable.rectChecker.\n *\n - element (Element) #optional The element to measure.\n = (object) The object's bounding rectangle.\n o {\n o top : 0,\n o left : 0,\n o bottom: 0,\n o right : 0,\n o width : 0,\n o height: 0\n o }\n \\*/\n getRect (element) {\n element = element || this.target;\n\n if (is.string(this.target) && !(is.element(element))) {\n element = this._context.querySelector(this.target);\n }\n\n return getElementRect(element);\n }\n\n /*\\\n * Interactable.rectChecker\n [ method ]\n *\n * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n - checker (function) #optional A function which returns this Interactable's bounding rectangle. See @Interactable.getRect\n = (function | object) The checker function or this Interactable\n \\*/\n rectChecker (checker) {\n if (is.function(checker)) {\n this.getRect = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.getRect;\n\n return this;\n }\n\n return this.getRect;\n }\n\n _backCompatOption (optionName, newValue) {\n if (trySelector(newValue) || is.object(newValue)) {\n this.options[optionName] = newValue;\n\n for (const action of actions.names) {\n this.options[action][optionName] = newValue;\n }\n\n return this;\n }\n\n return this.options[optionName];\n }\n\n /*\\\n * Interactable.origin\n [ method ]\n *\n * Gets or sets the origin of the Interactable's element. The x and y\n * of the origin will be subtracted from action event coordinates.\n *\n - origin (object | string) #optional An object eg. { x: 0, y: 0 } or string 'parent', 'self' or any CSS selector\n * OR\n - origin (Element) #optional An HTML or SVG Element whose rect will be used\n **\n = (object) The current origin or this Interactable\n \\*/\n origin (newValue) {\n return this._backCompatOption('origin', newValue);\n }\n\n /*\\\n * Interactable.deltaSource\n [ method ]\n *\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n - newValue (string) #optional Use 'client' if you will be scrolling while interacting; Use 'page' if you want autoScroll to work\n = (string | object) The current deltaSource or this Interactable\n \\*/\n deltaSource (newValue) {\n if (newValue === 'page' || newValue === 'client') {\n this.options.deltaSource = newValue;\n\n return this;\n }\n\n return this.options.deltaSource;\n }\n\n /*\\\n * Interactable.context\n [ method ]\n *\n * Gets the selector context Node of the Interactable. The default is `window.document`.\n *\n = (Node) The context Node of this Interactable\n **\n \\*/\n context () {\n return this._context;\n }\n\n inContext (element) {\n return (this._context === element.ownerDocument\n || nodeContains(this._context, element));\n }\n\n /*\\\n * Interactable.fire\n [ method ]\n *\n * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n - iEvent (InteractEvent) The InteractEvent object to be fired on this Interactable\n = (Interactable) this Interactable\n \\*/\n fire (iEvent) {\n this.events.fire(iEvent);\n\n return this;\n }\n\n _onOffMultiple (method, eventType, listener, options) {\n if (is.string(eventType) && eventType.search(' ') !== -1) {\n eventType = eventType.trim().split(/ +/);\n }\n\n if (is.array(eventType)) {\n for (let i = 0; i < eventType.length; i++) {\n this[method](eventType[i], listener, options);\n }\n\n return true;\n }\n\n if (is.object(eventType)) {\n for (const prop in eventType) {\n this[method](prop, eventType[prop], listener);\n }\n\n return true;\n }\n }\n\n /*\\\n * Interactable.on\n [ method ]\n *\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n - eventType (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) This Interactable\n \\*/\n on (eventType, listener, options) {\n if (this._onOffMultiple('on', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.on(eventType, listener);\n }\n // delegated event for selector\n else if (is.string(this.target)) {\n events.addDelegate(this.target, this._context, eventType, listener, options);\n }\n else {\n events.add(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.off\n [ method ]\n *\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n - eventType (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) This Interactable\n \\*/\n off (eventType, listener, options) {\n if (this._onOffMultiple('off', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n // if it is an action event type\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.off(eventType, listener);\n }\n // delegated event\n else if (is.string(this.target)) {\n events.removeDelegate(this.target, this._context, eventType, listener, options);\n }\n // remove listener from this Interatable's element\n else {\n events.remove(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.set\n [ method ]\n *\n * Reset the options of this Interactable\n - options (object) The new settings to apply\n = (object) This Interactable\n \\*/\n set (options) {\n if (!is.object(options)) {\n options = {};\n }\n\n this.options = extend({}, defaults.base);\n\n const perActions = extend({}, defaults.perAction);\n\n for (const actionName in actions.methodDict) {\n const methodName = actions.methodDict[actionName];\n\n this.options[actionName] = extend({}, defaults[actionName]);\n\n this.setPerAction(actionName, perActions);\n\n this[methodName](options[actionName]);\n }\n\n for (const setting of Interactable.settingsMethods) {\n this.options[setting] = defaults.base[setting];\n\n if (setting in options) {\n this[setting](options[setting]);\n }\n }\n\n signals.fire('set', {\n options,\n interactable: this,\n });\n\n return this;\n }\n\n /*\\\n * Interactable.unset\n [ method ]\n *\n * Remove this interactable from the list of interactables and remove\n * it's action capabilities and event listeners\n *\n = (object) @interact\n \\*/\n unset () {\n events.remove(this.target, 'all');\n\n if (is.string(this.target)) {\n // remove delegated events\n for (const type in events.delegatedEvents) {\n const delegated = events.delegatedEvents[type];\n\n if (delegated.selectors[0] === this.target\n && delegated.contexts[0] === this._context) {\n\n delegated.selectors.splice(0, 1);\n delegated.contexts .splice(0, 1);\n delegated.listeners.splice(0, 1);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegated[type] = null;\n }\n }\n\n events.remove(this._context, type, events.delegateListener);\n events.remove(this._context, type, events.delegateUseCapture, true);\n }\n }\n else {\n events.remove(this, 'all');\n }\n\n signals.fire('unset', { interactable: this });\n\n scope.interactables.splice(indexOf(scope.interactables, this), 1);\n\n // Stop related interactions when an Interactable is unset\n for (const interaction of scope.interactions || []) {\n if (interaction.target === this && interaction.interacting()) {\n interaction.stop();\n }\n }\n\n return scope.interact;\n }\n}\n\nscope.interactables.indexOfElement = function indexOfElement (target, context) {\n context = context || scope.document;\n\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n if (interactable.target === target && interactable._context === context) {\n return i;\n }\n }\n return -1;\n};\n\nscope.interactables.get = function interactableGet (element, options, dontCheckInContext) {\n const ret = this[this.indexOfElement(element, options && options.context)];\n\n return ret && (is.string(element) || dontCheckInContext || ret.inContext(element))? ret : null;\n};\n\nscope.interactables.forEachSelector = function (callback, element) {\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n // skip non CSS selector targets and out of context elements\n if (!is.string(interactable.target)\n || (element && !interactable.inContext(element))) {\n continue;\n }\n\n const ret = callback(interactable, interactable.target, interactable._context, i, this);\n\n if (ret !== undefined) {\n return ret;\n }\n }\n};\n\n// all interact.js eventTypes\nInteractable.eventTypes = scope.eventTypes = [];\n\nInteractable.signals = signals;\n\nInteractable.settingsMethods = [ 'deltaSource', 'origin', 'preventDefault', 'rectChecker' ];\n\nmodule.exports = Interactable;\n","const scope = require('./scope');\nconst utils = require('./utils');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst finder = require('./utils/interactionFinder');\nconst signals = require('./utils/Signals').new();\n\nconst listeners = {};\nconst methodNames = [\n 'pointerDown', 'pointerMove', 'pointerUp',\n 'updatePointer', 'removePointer',\n];\n\n// for ignoring browser's simulated mouse events\nlet prevTouchTime = 0;\n\n// all active and idle interactions\nscope.interactions = [];\n\nclass Interaction {\n constructor () {\n this.target = null; // current interactable being interacted with\n this.element = null; // the target element of the interactable\n\n this.prepared = { // action that's ready to be fired on next move event\n name : null,\n axis : null,\n edges: null,\n };\n\n // keep track of added pointers\n this.pointers = [];\n this.pointerIds = [];\n this.downTargets = [];\n this.downTimes = [];\n\n // Previous native pointer move event coordinates\n this.prevCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n // current native pointer move event coordinates\n this.curCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Starting InteractEvent pointer coordinates\n this.startCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Change in coordinates and time of the pointer\n this.pointerDelta = {\n page : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n client : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n timeStamp: 0,\n };\n\n this.downEvent = null; // pointerdown/mousedown/touchstart event\n this.downPointer = {};\n\n this._eventTarget = null;\n this._curEventTarget = null;\n\n this.prevEvent = null; // previous action event\n\n this.pointerIsDown = false;\n this.pointerWasMoved = false;\n this._interacting = false;\n\n this.mouse = false;\n\n signals.fire('new', this);\n\n scope.interactions.push(this);\n }\n\n pointerDown (pointer, event, eventTarget) {\n const pointerIndex = this.updatePointer(pointer, event, true);\n\n signals.fire('down', {\n pointer,\n event,\n eventTarget,\n pointerIndex,\n interaction: this,\n });\n }\n\n /*\\\n * Interaction.start\n [ method ]\n *\n * Start an action with the given Interactable and Element as tartgets. The\n * action must be enabled for the target Interactable and an appropriate number\n * of pointers must be held down - 1 for drag/resize, 2 for gesture.\n *\n * Use it with `interactable.able({ manualStart: false })` to always\n * [start actions manually](https://github.com/taye/interact.js/issues/114)\n *\n - action (object) The action to be performed - drag, resize, etc.\n - target (Interactable) The Interactable to target\n - element (Element) The DOM Element to target\n = (object) interact\n **\n | interact(target)\n | .draggable({\n | // disable the default drag start by down->move\n | manualStart: true\n | })\n | // start dragging after the user holds the pointer down\n | .on('hold', function (event) {\n | var interaction = event.interaction;\n |\n | if (!interaction.interacting()) {\n | interaction.start({ name: 'drag' },\n | event.interactable,\n | event.currentTarget);\n | }\n | });\n \\*/\n start (action, target, element) {\n if (this.interacting()\n || !this.pointerIsDown\n || this.pointerIds.length < (action.name === 'gesture'? 2 : 1)) {\n return;\n }\n\n // if this interaction had been removed after stopping\n // add it back\n if (utils.indexOf(scope.interactions, this) === -1) {\n scope.interactions.push(this);\n }\n\n utils.copyAction(this.prepared, action);\n this.target = target;\n this.element = element;\n\n signals.fire('action-start', {\n interaction: this,\n event: this.downEvent,\n });\n }\n\n pointerMove (pointer, event, eventTarget) {\n if (!this.simulation) {\n this.updatePointer(pointer);\n utils.setCoords(this.curCoords, this.pointers);\n }\n\n const duplicateMove = (this.curCoords.page.x === this.prevCoords.page.x\n && this.curCoords.page.y === this.prevCoords.page.y\n && this.curCoords.client.x === this.prevCoords.client.x\n && this.curCoords.client.y === this.prevCoords.client.y);\n\n let dx;\n let dy;\n\n // register movement greater than pointerMoveTolerance\n if (this.pointerIsDown && !this.pointerWasMoved) {\n dx = this.curCoords.client.x - this.startCoords.client.x;\n dy = this.curCoords.client.y - this.startCoords.client.y;\n\n this.pointerWasMoved = utils.hypot(dx, dy) > Interaction.pointerMoveTolerance;\n }\n\n const signalArg = {\n pointer,\n pointerIndex: this.getPointerIndex(pointer),\n event,\n eventTarget,\n dx,\n dy,\n duplicate: duplicateMove,\n interaction: this,\n interactingBeforeMove: this.interacting(),\n };\n\n if (!duplicateMove) {\n // set pointer coordinate, time changes and speeds\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n }\n\n signals.fire('move', signalArg);\n\n if (!duplicateMove) {\n // if interacting, fire an 'action-move' signal etc\n if (this.interacting()) {\n this.doMove(signalArg);\n }\n\n if (this.pointerWasMoved) {\n utils.copyCoords(this.prevCoords, this.curCoords);\n }\n }\n }\n\n /*\\\n * Interaction.doMove\n [ method ]\n *\n * Force a move of the current action at the same coordinates. Useful if\n * snap/restrict has been changed and you want a movement with the new\n * settings.\n *\n **\n | interact(target)\n | .draggable(true)\n | .on('dragmove', function (event) {\n | if (someCondition) {\n | // change the snap settings\n | event.interactable.draggable({ snap: { targets: [] }});\n | // fire another move event with re-calculated snap\n | event.interaction.doMove();\n | }\n | });\n \\*/\n doMove (signalArg) {\n signalArg = utils.extend({\n pointer: this.pointers[0],\n event: this.prevEvent,\n eventTarget: this._eventTarget,\n interaction: this,\n }, signalArg || {});\n\n signals.fire('before-action-move', signalArg);\n\n if (!this._dontFireMove) {\n signals.fire('action-move', signalArg);\n }\n\n this._dontFireMove = false;\n }\n\n // End interact move events and stop auto-scroll unless simulation is running\n pointerUp (pointer, event, eventTarget, curEventTarget) {\n const pointerIndex = this.getPointerIndex(pointer);\n\n signals.fire(/cancel$/i.test(event.type)? 'cancel' : 'up', {\n pointer,\n pointerIndex,\n event,\n eventTarget,\n curEventTarget,\n interaction: this,\n });\n\n if (!this.simulation) {\n this.end(event);\n }\n\n this.pointerIsDown = false;\n this.removePointer(pointer, event);\n }\n\n /*\\\n * Interaction.end\n [ method ]\n *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n - event (PointerEvent) #optional\n **\n | interact(target)\n | .draggable(true)\n | .on('move', function (event) {\n | if (event.pageX > 1000) {\n | // end the current action\n | event.interaction.end();\n | // stop all further listeners from being called\n | event.stopImmediatePropagation();\n | }\n | });\n \\*/\n end (event) {\n event = event || this.prevEvent;\n\n if (this.interacting()) {\n signals.fire('action-end', {\n event,\n interaction: this,\n });\n }\n\n this.stop();\n }\n\n currentAction () {\n return this._interacting? this.prepared.name: null;\n }\n\n interacting () {\n return this._interacting;\n }\n\n stop () {\n signals.fire('stop', { interaction: this });\n\n if (this._interacting) {\n signals.fire('stop-active', { interaction: this });\n signals.fire('stop-' + this.prepared.name, { interaction: this });\n }\n\n this.target = this.element = null;\n\n this._interacting = false;\n this.prepared.name = this.prevEvent = null;\n }\n\n getPointerIndex (pointer) {\n return utils.indexOf(this.pointerIds, utils.getPointerId(pointer));\n }\n\n updatePointer (pointer, event, down = event && /(down|start)$/i.test(event.type)) {\n const id = utils.getPointerId(pointer);\n let index = this.getPointerIndex(pointer);\n\n if (index === -1) {\n index = this.pointerIds.length;\n this.pointerIds[index] = id;\n }\n\n if (down) {\n signals.fire('update-pointer-down', {\n pointer,\n event,\n down,\n pointerId: id,\n pointerIndex: index,\n interaction: this,\n });\n }\n\n this.pointers[index] = pointer;\n\n return index;\n }\n\n removePointer (pointer, event) {\n const id = utils.getPointerId(pointer);\n const index = this.mouse? 0 : utils.indexOf(this.pointerIds, id);\n\n if (index === -1) { return; }\n\n signals.fire('remove-pointer', {\n pointer,\n event,\n pointerIndex: index,\n interaction: this,\n });\n\n this.pointers .splice(index, 1);\n this.pointerIds .splice(index, 1);\n this.downTargets.splice(index, 1);\n this.downTimes .splice(index, 1);\n }\n\n _updateEventTargets (target, currentTarget) {\n this._eventTarget = target;\n this._curEventTarget = currentTarget;\n }\n}\n\nfor (let i = 0, len = methodNames.length; i < len; i++) {\n const method = methodNames[i];\n\n listeners[method] = doOnInteractions(method);\n}\n\nfunction doOnInteractions (method) {\n return (function (event) {\n const [eventTarget, curEventTarget] = utils.getEventTargets(event);\n const matches = []; // [ [pointer, interaction], ...]\n\n if (browser.supportsTouch && /touch/.test(event.type)) {\n prevTouchTime = new Date().getTime();\n\n for (let i = 0; i < event.changedTouches.length; i++) {\n const pointer = event.changedTouches[i];\n const interaction = finder.search(pointer, event.type, eventTarget);\n\n matches.push([pointer, interaction || new Interaction()]);\n }\n }\n else {\n let invalidPointer = false;\n\n if (!browser.supportsPointerEvent && /mouse/.test(event.type)) {\n // ignore mouse events while touch interactions are active\n for (let i = 0; i < scope.interactions.length && !invalidPointer; i++) {\n invalidPointer = !scope.interactions[i].mouse && scope.interactions[i].pointerIsDown;\n }\n\n // try to ignore mouse events that are simulated by the browser\n // after a touch event\n invalidPointer = invalidPointer\n || (new Date().getTime() - prevTouchTime < 500)\n // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated\n || event.timeStamp === 0;\n }\n\n if (!invalidPointer) {\n let interaction = finder.search(event, event.type, eventTarget);\n\n if (!interaction) {\n\n interaction = new Interaction();\n interaction.mouse = (/mouse/i.test(event.pointerType || event.type)\n // MSPointerEvent.MSPOINTER_TYPE_MOUSE\n || event.pointerType === 4\n || !event.pointerType);\n }\n\n matches.push([event, interaction]);\n }\n }\n\n for (const [pointer, interaction] of matches) {\n interaction._updateEventTargets(eventTarget, curEventTarget);\n interaction[method](pointer, event, eventTarget, curEventTarget);\n }\n });\n}\n\nfunction endAll (event) {\n for (let i = 0; i < scope.interactions.length; i++) {\n const interaction = scope.interactions[i];\n\n interaction.end(event);\n signals.fire('endall', { event, interaction });\n }\n}\n\nconst docEvents = { /* 'eventType': listenerFunc */ };\nconst pEventTypes = browser.pEventTypes;\n\nif (scope.PointerEvent) {\n docEvents[pEventTypes.down ] = listeners.pointerDown;\n docEvents[pEventTypes.move ] = listeners.pointerMove;\n docEvents[pEventTypes.up ] = listeners.pointerUp;\n docEvents[pEventTypes.cancel] = listeners.pointerUp;\n}\nelse {\n docEvents.mousedown = listeners.pointerDown;\n docEvents.mousemove = listeners.pointerMove;\n docEvents.mouseup = listeners.pointerUp;\n\n docEvents.touchstart = listeners.pointerDown;\n docEvents.touchmove = listeners.pointerMove;\n docEvents.touchend = listeners.pointerUp;\n docEvents.touchcancel = listeners.pointerUp;\n}\n\ndocEvents.blur = endAll;\n\nfunction onDocSignal ({ doc }, signalName) {\n const eventMethod = signalName.indexOf('add') === 0\n ? events.add : events.remove;\n\n // delegate event listener\n for (const eventType in scope.delegatedEvents) {\n eventMethod(doc, eventType, events.delegateListener);\n eventMethod(doc, eventType, events.delegateUseCapture, true);\n }\n\n for (const eventType in docEvents) {\n eventMethod(doc, eventType, docEvents[eventType]);\n }\n}\n\nsignals.on('update-pointer-down', ({ interaction, pointer, pointerId, pointerIndex, event, eventTarget, down }) => {\n interaction.pointerIds[pointerIndex] = pointerId;\n interaction.pointers[pointerIndex] = pointer;\n\n if (down) {\n interaction.pointerIsDown = true;\n }\n\n if (!interaction.interacting()) {\n utils.setCoords(interaction.startCoords, interaction.pointers);\n\n utils.copyCoords(interaction.curCoords , interaction.startCoords);\n utils.copyCoords(interaction.prevCoords, interaction.startCoords);\n\n interaction.downEvent = event;\n interaction.downTimes[pointerIndex] = interaction.curCoords.timeStamp;\n interaction.downTargets[pointerIndex] = eventTarget || event && utils.getEventTargets(event)[0];\n interaction.pointerWasMoved = false;\n\n utils.pointerExtend(interaction.downPointer, pointer);\n }\n});\n\nscope.signals.on('add-document' , onDocSignal);\nscope.signals.on('remove-document', onDocSignal);\n\nInteraction.pointerMoveTolerance = 1;\nInteraction.doOnInteractions = doOnInteractions;\nInteraction.endAll = endAll;\nInteraction.signals = signals;\nInteraction.docEvents = docEvents;\n\nscope.endAllInteractions = endAll;\n\nmodule.exports = Interaction;\n","const Interaction = require('../Interaction');\nconst InteractEvent = require('../InteractEvent');\n\nconst actions = {\n firePrepared,\n names: [],\n methodDict: {},\n};\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n interaction._interacting = true;\n firePrepared(interaction, event, 'start');\n});\n\nInteraction.signals.on('action-move', function ({ interaction, event, preEnd }) {\n firePrepared(interaction, event, 'move', preEnd);\n\n // if the action was ended in a listener\n if (!interaction.interacting()) { return false; }\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n firePrepared(interaction, event, 'end');\n});\n\nfunction firePrepared (interaction, event, phase, preEnd) {\n const actionName = interaction.prepared.name;\n\n const newEvent = new InteractEvent(interaction, event, actionName, phase, interaction.element, null, preEnd);\n\n interaction.target.fire(newEvent);\n interaction.prevEvent = newEvent;\n}\n\nmodule.exports = actions;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drag = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n startAxis : 'xy',\n lockAxis : 'xy',\n },\n\n checker: function (pointer, event, interactable) {\n const dragOptions = interactable.options.drag;\n\n return dragOptions.enabled\n ? { name: 'drag', axis: (dragOptions.lockAxis === 'start'\n ? dragOptions.startAxis\n : dragOptions.lockAxis)}\n : null;\n },\n\n getCursor: function () {\n return 'move';\n },\n};\n\nInteraction.signals.on('before-action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n interaction.curCoords.page.y = interaction.startCoords.page.y;\n interaction.curCoords.client.y = interaction.startCoords.client.y;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vx);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vx);\n interaction.pointerDelta.client.vy = 0;\n interaction.pointerDelta.page.vy = 0;\n }\n else if (axis === 'y') {\n interaction.curCoords.page.x = interaction.startCoords.page.x;\n interaction.curCoords.client.x = interaction.startCoords.client.x;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vy);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vy);\n interaction.pointerDelta.client.vx = 0;\n interaction.pointerDelta.page.vx = 0;\n }\n});\n\n// dragmove\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'dragmove') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n iEvent.pageY = interaction.startCoords.page.y;\n iEvent.clientY = interaction.startCoords.client.y;\n iEvent.dy = 0;\n }\n else if (axis === 'y') {\n iEvent.pageX = interaction.startCoords.page.x;\n iEvent.clientX = interaction.startCoords.client.x;\n iEvent.dx = 0;\n }\n});\n\n/*\\\n * Interactable.draggable\n [ method ]\n *\n * Gets or sets whether drag actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of drag events\n | var isDraggable = interact('ul li').draggable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on drag events (object makes the Interactable draggable)\n = (object) This Interactable\n | interact(element).draggable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // the axis in which the first movement must be\n | // for the drag sequence to start\n | // 'xy' by default - any direction\n | startAxis: 'x' || 'y' || 'xy',\n |\n | // 'xy' by default - don't restrict to one axis (move in any direction)\n | // 'x' or 'y' to restrict movement to either axis\n | // 'start' to restrict movement to the axis the drag started in\n | lockAxis: 'x' || 'y' || 'xy' || 'start',\n |\n | // max number of drags that can happen concurrently\n | // with elements of this Interactable. Infinity by default\n | max: Infinity,\n |\n | // max number of drags that can target the same element+Interactable\n | // 1 by default\n | maxPerElement: 2\n | });\n\\*/\nInteractable.prototype.draggable = function (options) {\n if (utils.is.object(options)) {\n this.options.drag.enabled = options.enabled === false? false: true;\n this.setPerAction('drag', options);\n this.setOnEvents('drag', options);\n\n if (/^(xy|x|y|start)$/.test(options.lockAxis)) {\n this.options.drag.lockAxis = options.lockAxis;\n }\n if (/^(xy|x|y)$/.test(options.startAxis)) {\n this.options.drag.startAxis = options.startAxis;\n }\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drag.enabled = options;\n\n if (!options) {\n this.ondragstart = this.ondragstart = this.ondragend = null;\n }\n\n return this;\n }\n\n return this.options.drag;\n};\n\nactions.drag = drag;\nactions.names.push('drag');\nutils.merge(Interactable.eventTypes, [\n 'dragstart',\n 'dragmove',\n 'draginertiastart',\n 'draginertiaresume',\n 'dragend',\n]);\nactions.methodDict.drag = 'draggable';\n\ndefaultOptions.drag = drag.defaults;\n\nmodule.exports = drag;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst scope = require('../scope');\nconst interact = require('../interact');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drop = {\n defaults: {\n enabled: false,\n accept : null,\n overlap: 'pointer',\n },\n};\n\nlet dynamicDrop = false;\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // reset active dropzones\n interaction.activeDrops.dropzones = [];\n interaction.activeDrops.elements = [];\n interaction.activeDrops.rects = [];\n\n interaction.dropEvents = null;\n\n if (!interaction.dynamicDrop) {\n setActiveDrops(interaction, interaction.element);\n }\n\n const dragEvent = interaction.prevEvent;\n const dropEvents = getDropEvents(interaction, event, dragEvent);\n\n if (dropEvents.activate) {\n fireActiveDrops(interaction, dropEvents.activate);\n }\n});\n\nInteractEvent.signals.on('new', function ({ interaction, iEvent, event }) {\n if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { return; }\n\n const draggableElement = interaction.element;\n const dragEvent = iEvent;\n const dropResult = getDrop(dragEvent, event, draggableElement);\n\n interaction.dropTarget = dropResult.dropzone;\n interaction.dropElement = dropResult.element;\n\n interaction.dropEvents = getDropEvents(interaction, event, dragEvent);\n});\n\nInteraction.signals.on('action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n fireDropEvents(interaction, interaction.dropEvents);\n});\n\nInteraction.signals.on('action-end', function ({ interaction }) {\n if (interaction.prepared.name === 'drag') {\n fireDropEvents(interaction, interaction.dropEvents);\n }\n});\n\nInteraction.signals.on('stop-drag', function ({ interaction }) {\n interaction.activeDrops.dropzones =\n interaction.activeDrops.elements =\n interaction.activeDrops.rects =\n interaction.dropEvents = null;\n});\n\nfunction collectDrops (interaction, element) {\n const drops = [];\n const elements = [];\n\n element = element || interaction.element;\n\n // collect all dropzones and their elements which qualify for a drop\n for (const current of scope.interactables) {\n if (!current.options.drop.enabled) { continue; }\n\n const accept = current.options.drop.accept;\n\n // test the draggable element against the dropzone's accept setting\n if ((utils.is.element(accept) && accept !== element)\n || (utils.is.string(accept)\n && !utils.matchesSelector(element, accept))) {\n\n continue;\n }\n\n // query for new elements if necessary\n const dropElements = utils.is.string(current.target)\n ? current._context.querySelectorAll(current.target)\n : [current.target];\n\n for (let i = 0; i < dropElements.length; i++) {\n const currentElement = dropElements[i];\n\n if (currentElement !== element) {\n drops.push(current);\n elements.push(currentElement);\n }\n }\n }\n\n return {\n elements,\n dropzones: drops,\n };\n}\n\nfunction fireActiveDrops (interaction, event) {\n let prevElement;\n\n // loop through all active dropzones and trigger event\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n const current = interaction.activeDrops.dropzones[i];\n const currentElement = interaction.activeDrops.elements [i];\n\n // prevent trigger of duplicate events on same element\n if (currentElement !== prevElement) {\n // set current element as event target\n event.target = currentElement;\n current.fire(event);\n }\n prevElement = currentElement;\n }\n}\n\n// Collect a new set of possible drops and save them in activeDrops.\n// setActiveDrops should always be called when a drag has just started or a\n// drag event happens while dynamicDrop is true\nfunction setActiveDrops (interaction, dragElement) {\n // get dropzones and their elements that could receive the draggable\n const possibleDrops = collectDrops(interaction, dragElement, true);\n\n interaction.activeDrops.dropzones = possibleDrops.dropzones;\n interaction.activeDrops.elements = possibleDrops.elements;\n interaction.activeDrops.rects = [];\n\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n interaction.activeDrops.rects[i] =\n interaction.activeDrops.dropzones[i].getRect(interaction.activeDrops.elements[i]);\n }\n}\n\nfunction getDrop (dragEvent, event, dragElement) {\n const interaction = dragEvent.interaction;\n const validDrops = [];\n\n if (dynamicDrop) {\n setActiveDrops(interaction, dragElement);\n }\n\n // collect all dropzones and their elements which qualify for a drop\n for (let j = 0; j < interaction.activeDrops.dropzones.length; j++) {\n const current = interaction.activeDrops.dropzones[j];\n const currentElement = interaction.activeDrops.elements [j];\n const rect = interaction.activeDrops.rects [j];\n\n validDrops.push(current.dropCheck(dragEvent, event, interaction.target, dragElement, currentElement, rect)\n ? currentElement\n : null);\n }\n\n // get the most appropriate dropzone based on DOM depth and order\n const dropIndex = utils.indexOfDeepestElement(validDrops);\n\n return {\n dropzone: interaction.activeDrops.dropzones[dropIndex] || null,\n element : interaction.activeDrops.elements [dropIndex] || null,\n };\n}\n\nfunction getDropEvents (interaction, pointerEvent, dragEvent) {\n const dropEvents = {\n enter : null,\n leave : null,\n activate : null,\n deactivate: null,\n move : null,\n drop : null,\n };\n\n const tmpl = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n };\n\n if (interaction.dropElement !== interaction.prevDropElement) {\n // if there was a prevDropTarget, create a dragleave event\n if (interaction.prevDropTarget) {\n dropEvents.leave = utils.extend({ type: 'dragleave' }, tmpl);\n\n dragEvent.dragLeave = dropEvents.leave.target = interaction.prevDropElement;\n dragEvent.prevDropzone = dropEvents.leave.dropzone = interaction.prevDropTarget;\n }\n // if the dropTarget is not null, create a dragenter event\n if (interaction.dropTarget) {\n dropEvents.enter = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n type : 'dragenter',\n };\n\n dragEvent.dragEnter = interaction.dropElement;\n dragEvent.dropzone = interaction.dropTarget;\n }\n }\n\n if (dragEvent.type === 'dragend' && interaction.dropTarget) {\n dropEvents.drop = utils.extend({ type: 'drop' }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n dragEvent.relatedTarget = interaction.dropElement;\n }\n if (dragEvent.type === 'dragstart') {\n dropEvents.activate = utils.extend({ type: 'dropactivate' }, tmpl);\n\n dropEvents.activate.target = null;\n dropEvents.activate.dropzone = null;\n }\n if (dragEvent.type === 'dragend') {\n dropEvents.deactivate = utils.extend({ type: 'dropdeactivate' }, tmpl);\n\n dropEvents.deactivate.target = null;\n dropEvents.deactivate.dropzone = null;\n }\n if (dragEvent.type === 'dragmove' && interaction.dropTarget) {\n dropEvents.move = utils.extend({\n dragmove : dragEvent,\n type : 'dropmove',\n }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n }\n\n return dropEvents;\n}\n\nfunction fireDropEvents (interaction, dropEvents) {\n if (dropEvents.leave) { interaction.prevDropTarget.fire(dropEvents.leave); }\n if (dropEvents.move ) { interaction.dropTarget.fire(dropEvents.move ); }\n if (dropEvents.enter) { interaction.dropTarget.fire(dropEvents.enter); }\n if (dropEvents.drop ) { interaction.dropTarget.fire(dropEvents.drop ); }\n if (dropEvents.deactivate) {\n fireActiveDrops(interaction, dropEvents.deactivate);\n }\n\n interaction.prevDropTarget = interaction.dropTarget;\n interaction.prevDropElement = interaction.dropElement;\n}\n\n/*\\\n * Interactable.dropzone\n [ method ]\n *\n * Returns or sets whether elements can be dropped onto this\n * Interactable to trigger drop events\n *\n * Dropzones can receive the following events:\n * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends\n * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone\n * - `dragmove` when a draggable that has entered the dropzone is moved\n * - `drop` when a draggable is dropped into this dropzone\n *\n * Use the `accept` option to allow only elements that match the given CSS\n * selector or element. The value can be:\n *\n * - **an Element** - only that element can be dropped into this dropzone.\n * - **a string**, - the element being dragged must match it as a CSS selector.\n * - **`null`** - accept options is cleared - it accepts any element.\n *\n * Use the `overlap` option to set how drops are checked for. The allowed\n * values are:\n *\n * - `'pointer'`, the pointer must be over the dropzone (default)\n * - `'center'`, the draggable element's center must be over the dropzone\n * - a number from 0-1 which is the `(intersection area) / (draggable area)`.\n * e.g. `0.5` for drop to happen when half of the area of the draggable is\n * over the dropzone\n *\n * Use the `checker` option to specify a function to check if a dragged\n * element is over this Interactable.\n *\n | interact(target)\n | .dropChecker(function(dragEvent, // related dragmove or dragend event\n | event, // TouchEvent/PointerEvent/MouseEvent\n | dropped, // bool result of the default checker\n | dropzone, // dropzone Interactable\n | dropElement, // dropzone elemnt\n | draggable, // draggable Interactable\n | draggableElement) {// draggable element\n |\n | return dropped && event.target.hasAttribute('allow-drop');\n | }\n *\n *\n - options (boolean | object | null) #optional The new value to be set.\n | interact('.drop').dropzone({\n | accept: '.can-drop' || document.getElementById('single-drop'),\n | overlap: 'pointer' || 'center' || zeroToOne\n | }\n = (boolean | object) The current setting or this Interactable\n\\*/\nInteractable.prototype.dropzone = function (options) {\n if (utils.is.object(options)) {\n this.options.drop.enabled = options.enabled === false? false: true;\n\n if (utils.is.function(options.ondrop) ) { this.events.ondrop = options.ondrop ; }\n if (utils.is.function(options.ondropactivate) ) { this.events.ondropactivate = options.ondropactivate ; }\n if (utils.is.function(options.ondropdeactivate)) { this.events.ondropdeactivate = options.ondropdeactivate; }\n if (utils.is.function(options.ondragenter) ) { this.events.ondragenter = options.ondragenter ; }\n if (utils.is.function(options.ondragleave) ) { this.events.ondragleave = options.ondragleave ; }\n if (utils.is.function(options.ondropmove) ) { this.events.ondropmove = options.ondropmove ; }\n\n if (/^(pointer|center)$/.test(options.overlap)) {\n this.options.drop.overlap = options.overlap;\n }\n else if (utils.is.number(options.overlap)) {\n this.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0);\n }\n if ('accept' in options) {\n this.options.drop.accept = options.accept;\n }\n if ('checker' in options) {\n this.options.drop.checker = options.checker;\n }\n\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drop.enabled = options;\n\n if (!options) {\n this.ondragenter = this.ondragleave = this.ondrop\n = this.ondropactivate = this.ondropdeactivate = null;\n }\n\n return this;\n }\n\n return this.options.drop;\n};\n\nInteractable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) {\n let dropped = false;\n\n // if the dropzone has no rect (eg. display: none)\n // call the custom dropChecker or just return false\n if (!(rect = rect || this.getRect(dropElement))) {\n return (this.options.drop.checker\n ? this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement)\n : false);\n }\n\n const dropOverlap = this.options.drop.overlap;\n\n if (dropOverlap === 'pointer') {\n const origin = utils.getOriginXY(draggable, draggableElement, 'drag');\n const page = utils.getPageXY(dragEvent);\n\n page.x += origin.x;\n page.y += origin.y;\n\n const horizontal = (page.x > rect.left) && (page.x < rect.right);\n const vertical = (page.y > rect.top ) && (page.y < rect.bottom);\n\n dropped = horizontal && vertical;\n }\n\n const dragRect = draggable.getRect(draggableElement);\n\n if (dragRect && dropOverlap === 'center') {\n const cx = dragRect.left + dragRect.width / 2;\n const cy = dragRect.top + dragRect.height / 2;\n\n dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom;\n }\n\n if (dragRect && utils.is.number(dropOverlap)) {\n const overlapArea = (Math.max(0, Math.min(rect.right , dragRect.right ) - Math.max(rect.left, dragRect.left))\n * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top , dragRect.top )));\n\n const overlapRatio = overlapArea / (dragRect.width * dragRect.height);\n\n dropped = overlapRatio >= dropOverlap;\n }\n\n if (this.options.drop.checker) {\n dropped = this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement);\n }\n\n return dropped;\n};\n\nInteractable.signals.on('unset', function ({ interactable }) {\n interactable.dropzone(false);\n});\n\nInteractable.settingsMethods.push('dropChecker');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.dropTarget = null; // the dropzone a drag target might be dropped into\n interaction.dropElement = null; // the element at the time of checking\n interaction.prevDropTarget = null; // the dropzone that was recently dragged away from\n interaction.prevDropElement = null; // the element at the time of checking\n interaction.dropEvents = null; // the dropEvents related to the current drag event\n\n interaction.activeDrops = {\n dropzones: [], // the dropzones that are mentioned below\n elements : [], // elements of dropzones that accept the target draggable\n rects : [], // the rects of the elements mentioned above\n };\n\n});\n\nInteraction.signals.on('stop', function ({ interaction }) {\n interaction.dropTarget = interaction.dropElement =\n interaction.prevDropTarget = interaction.prevDropElement = null;\n});\n\n/*\\\n * interact.dynamicDrop\n [ method ]\n *\n * Returns or sets whether the dimensions of dropzone elements are\n * calculated on every dragmove or only on dragstart for the default\n * dropChecker\n *\n - newValue (boolean) #optional True to check on each move. False to check only before start\n = (boolean | interact) The current setting or interact\n\\*/\ninteract.dynamicDrop = function (newValue) {\n if (utils.is.bool(newValue)) {\n //if (dragging && dynamicDrop !== newValue && !newValue) {\n //calcRects(dropzones);\n //}\n\n dynamicDrop = newValue;\n\n return interact;\n }\n return dynamicDrop;\n};\n\nutils.merge(Interactable.eventTypes, [\n 'dragenter',\n 'dragleave',\n 'dropactivate',\n 'dropdeactivate',\n 'dropmove',\n 'drop',\n]);\nactions.methodDict.drop = 'dropzone';\n\ndefaultOptions.drop = drop.defaults;\n\nmodule.exports = drop;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst gesture = {\n defaults: {\n enabled : false,\n origin : null,\n restrict: null,\n },\n\n checker: function (pointer, event, interactable, element, interaction) {\n if (interaction.pointerIds.length >= 2) {\n return { name: 'gesture' };\n }\n\n return null;\n },\n\n getCursor: function () {\n return '';\n },\n};\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturestart') { return; }\n iEvent.ds = 0;\n\n interaction.gesture.startDistance = interaction.gesture.prevDistance = iEvent.distance;\n interaction.gesture.startAngle = interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.scale = 1;\n});\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturemove') { return; }\n\n iEvent.ds = iEvent.scale - interaction.gesture.scale;\n\n interaction.target.fire(iEvent);\n\n interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.prevDistance = iEvent.distance;\n\n if (iEvent.scale !== Infinity\n && iEvent.scale !== null\n && iEvent.scale !== undefined\n && !isNaN(iEvent.scale)) {\n\n interaction.gesture.scale = iEvent.scale;\n }\n});\n\n/*\\\n * Interactable.gesturable\n [ method ]\n *\n * Gets or sets whether multitouch gestures can be performed on the\n * Interactable's element\n *\n = (boolean) Indicates if this can be the target of gesture events\n | var isGestureable = interact(element).gesturable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on gesture events (makes the Interactable gesturable)\n = (object) this Interactable\n | interact(element).gesturable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // limit multiple gestures.\n | // See the explanation in @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n\\*/\nInteractable.prototype.gesturable = function (options) {\n if (utils.is.object(options)) {\n this.options.gesture.enabled = options.enabled === false? false: true;\n this.setPerAction('gesture', options);\n this.setOnEvents('gesture', options);\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.gesture.enabled = options;\n\n if (!options) {\n this.ongesturestart = this.ongesturestart = this.ongestureend = null;\n }\n\n return this;\n }\n\n return this.options.gesture;\n};\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action, event, starting, ending, deltaSource }) {\n if (action !== 'gesture') { return; }\n\n const pointers = interaction.pointers;\n\n iEvent.touches = [pointers[0], pointers[1]];\n\n if (starting) {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = 1;\n iEvent.ds = 0;\n iEvent.angle = utils.touchAngle(pointers, undefined, deltaSource);\n iEvent.da = 0;\n }\n else if (ending || event instanceof InteractEvent) {\n iEvent.distance = interaction.prevEvent.distance;\n iEvent.box = interaction.prevEvent.box;\n iEvent.scale = interaction.prevEvent.scale;\n iEvent.ds = iEvent.scale - 1;\n iEvent.angle = interaction.prevEvent.angle;\n iEvent.da = iEvent.angle - interaction.gesture.startAngle;\n }\n else {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = iEvent.distance / interaction.gesture.startDistance;\n iEvent.angle = utils.touchAngle(pointers, interaction.gesture.prevAngle, deltaSource);\n\n iEvent.ds = iEvent.scale - interaction.gesture.prevScale;\n iEvent.da = iEvent.angle - interaction.gesture.prevAngle;\n }\n});\n\nInteraction.signals.on('new', function (interaction) {\n interaction.gesture = {\n start: { x: 0, y: 0 },\n\n startDistance: 0, // distance between two touches of touchStart\n prevDistance : 0,\n distance : 0,\n\n scale: 1, // gesture.distance / gesture.startDistance\n\n startAngle: 0, // angle of line joining two touches\n prevAngle : 0, // angle of the previous gesture event\n };\n});\n\nactions.gesture = gesture;\nactions.names.push('gesture');\nutils.merge(Interactable.eventTypes, [\n 'gesturestart',\n 'gesturemove',\n 'gestureend',\n]);\nactions.methodDict.gesture = 'gesturable';\n\ndefaultOptions.gesture = gesture.defaults;\n\nmodule.exports = gesture;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\n// Less Precision with touch input\nconst defaultMargin = browser.supportsTouch || browser.supportsPointerEvent? 20: 10;\n\nconst resize = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n square: false,\n preserveAspectRatio: false,\n axis: 'xy',\n\n // use default margin\n margin: NaN,\n\n // object with props left, right, top, bottom which are\n // true/false values to resize when the pointer is over that edge,\n // CSS selectors to match the handles for each direction\n // or the Elements for each handle\n edges: null,\n\n // a value of 'none' will limit the resize rect to a minimum of 0x0\n // 'negate' will alow the rect to have negative width/height\n // 'reposition' will keep the width/height positive by swapping\n // the top and bottom edges and/or swapping the left and right edges\n invert: 'none',\n },\n\n checker: function (pointer, event, interactable, element, interaction, rect) {\n if (!rect) { return null; }\n\n const page = utils.extend({}, interaction.curCoords.page);\n const options = interactable.options;\n\n if (options.resize.enabled) {\n const resizeOptions = options.resize;\n const resizeEdges = { left: false, right: false, top: false, bottom: false };\n\n // if using resize.edges\n if (utils.is.object(resizeOptions.edges)) {\n for (const edge in resizeEdges) {\n resizeEdges[edge] = checkResizeEdge(edge,\n resizeOptions.edges[edge],\n page,\n interaction._eventTarget,\n element,\n rect,\n resizeOptions.margin || defaultMargin);\n }\n\n resizeEdges.left = resizeEdges.left && !resizeEdges.right;\n resizeEdges.top = resizeEdges.top && !resizeEdges.bottom;\n\n if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) {\n return {\n name: 'resize',\n edges: resizeEdges,\n };\n }\n }\n else {\n const right = options.resize.axis !== 'y' && page.x > (rect.right - defaultMargin);\n const bottom = options.resize.axis !== 'x' && page.y > (rect.bottom - defaultMargin);\n\n if (right || bottom) {\n return {\n name: 'resize',\n axes: (right? 'x' : '') + (bottom? 'y' : ''),\n };\n }\n }\n }\n\n return null;\n },\n\n cursors: (browser.isIe9OrOlder ? {\n x : 'e-resize',\n y : 's-resize',\n xy: 'se-resize',\n\n top : 'n-resize',\n left : 'w-resize',\n bottom : 's-resize',\n right : 'e-resize',\n topleft : 'se-resize',\n bottomright: 'se-resize',\n topright : 'ne-resize',\n bottomleft : 'ne-resize',\n } : {\n x : 'ew-resize',\n y : 'ns-resize',\n xy: 'nwse-resize',\n\n top : 'ns-resize',\n left : 'ew-resize',\n bottom : 'ns-resize',\n right : 'ew-resize',\n topleft : 'nwse-resize',\n bottomright: 'nwse-resize',\n topright : 'nesw-resize',\n bottomleft : 'nesw-resize',\n }),\n\n getCursor: function (action) {\n if (action.axis) {\n return resize.cursors[action.name + action.axis];\n }\n else if (action.edges) {\n let cursorKey = '';\n const edgeNames = ['top', 'bottom', 'left', 'right'];\n\n for (let i = 0; i < 4; i++) {\n if (action.edges[edgeNames[i]]) {\n cursorKey += edgeNames[i];\n }\n }\n\n return resize.cursors[cursorKey];\n }\n },\n};\n\n// resizestart\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'resizestart' || !interaction.prepared.edges) {\n return;\n }\n\n const startRect = interaction.target.getRect(interaction.element);\n const resizeOptions = interaction.target.options.resize;\n\n /*\n * When using the `resizable.square` or `resizable.preserveAspectRatio` options, resizing from one edge\n * will affect another. E.g. with `resizable.square`, resizing to make the right edge larger will make\n * the bottom edge larger by the same amount. We call these 'linked' edges. Any linked edges will depend\n * on the active edges and the edge being interacted with.\n */\n if (resizeOptions.square || resizeOptions.preserveAspectRatio) {\n const linkedEdges = utils.extend({}, interaction.prepared.edges);\n\n linkedEdges.top = linkedEdges.top || (linkedEdges.left && !linkedEdges.bottom);\n linkedEdges.left = linkedEdges.left || (linkedEdges.top && !linkedEdges.right );\n linkedEdges.bottom = linkedEdges.bottom || (linkedEdges.right && !linkedEdges.top );\n linkedEdges.right = linkedEdges.right || (linkedEdges.bottom && !linkedEdges.left );\n\n interaction.prepared._linkedEdges = linkedEdges;\n }\n else {\n interaction.prepared._linkedEdges = null;\n }\n\n // if using `resizable.preserveAspectRatio` option, record aspect ratio at the start of the resize\n if (resizeOptions.preserveAspectRatio) {\n interaction.resizeStartAspectRatio = startRect.width / startRect.height;\n }\n\n interaction.resizeRects = {\n start : startRect,\n current : utils.extend({}, startRect),\n inverted : utils.extend({}, startRect),\n previous : utils.extend({}, startRect),\n delta : {\n left: 0, right : 0, width : 0,\n top : 0, bottom: 0, height: 0,\n },\n };\n\n iEvent.rect = interaction.resizeRects.inverted;\n iEvent.deltaRect = interaction.resizeRects.delta;\n});\n\n// resizemove\nInteractEvent.signals.on('new', function ({ iEvent, phase, interaction }) {\n if (phase !== 'move' || !interaction.prepared.edges) { return; }\n\n const resizeOptions = interaction.target.options.resize;\n const invert = resizeOptions.invert;\n const invertible = invert === 'reposition' || invert === 'negate';\n\n let edges = interaction.prepared.edges;\n\n const start = interaction.resizeRects.start;\n const current = interaction.resizeRects.current;\n const inverted = interaction.resizeRects.inverted;\n const delta = interaction.resizeRects.delta;\n const previous = utils.extend(interaction.resizeRects.previous, inverted);\n const originalEdges = edges;\n\n let dx = iEvent.dx;\n let dy = iEvent.dy;\n\n if (resizeOptions.preserveAspectRatio || resizeOptions.square) {\n // `resize.preserveAspectRatio` takes precedence over `resize.square`\n const startAspectRatio = resizeOptions.preserveAspectRatio\n ? interaction.resizeStartAspectRatio\n : 1;\n\n edges = interaction.prepared._linkedEdges;\n\n if ((originalEdges.left && originalEdges.bottom)\n || (originalEdges.right && originalEdges.top)) {\n dy = -dx / startAspectRatio;\n }\n else if (originalEdges.left || originalEdges.right ) { dy = dx / startAspectRatio; }\n else if (originalEdges.top || originalEdges.bottom) { dx = dy * startAspectRatio; }\n }\n\n // update the 'current' rect without modifications\n if (edges.top ) { current.top += dy; }\n if (edges.bottom) { current.bottom += dy; }\n if (edges.left ) { current.left += dx; }\n if (edges.right ) { current.right += dx; }\n\n if (invertible) {\n // if invertible, copy the current rect\n utils.extend(inverted, current);\n\n if (invert === 'reposition') {\n // swap edge values if necessary to keep width/height positive\n let swap;\n\n if (inverted.top > inverted.bottom) {\n swap = inverted.top;\n\n inverted.top = inverted.bottom;\n inverted.bottom = swap;\n }\n if (inverted.left > inverted.right) {\n swap = inverted.left;\n\n inverted.left = inverted.right;\n inverted.right = swap;\n }\n }\n }\n else {\n // if not invertible, restrict to minimum of 0x0 rect\n inverted.top = Math.min(current.top, start.bottom);\n inverted.bottom = Math.max(current.bottom, start.top);\n inverted.left = Math.min(current.left, start.right);\n inverted.right = Math.max(current.right, start.left);\n }\n\n inverted.width = inverted.right - inverted.left;\n inverted.height = inverted.bottom - inverted.top ;\n\n for (const edge in inverted) {\n delta[edge] = inverted[edge] - previous[edge];\n }\n\n iEvent.edges = interaction.prepared.edges;\n iEvent.rect = inverted;\n iEvent.deltaRect = delta;\n});\n\n/*\\\n * Interactable.resizable\n [ method ]\n *\n * Gets or sets whether resize actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of resize elements\n | var isResizeable = interact('input[type=text]').resizable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on resize events (object makes the Interactable resizable)\n = (object) This Interactable\n | interact(element).resizable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | edges: {\n | top : true, // Use pointer coords to check for resize.\n | left : false, // Disable resizing from left edge.\n | bottom: '.resize-s',// Resize if pointer target matches selector\n | right : handleEl // Resize if pointer target is the given Element\n | },\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height are adjusted at a 1:1 ratio.\n | square: false,\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height maintain the aspect ratio they had when resizing started.\n | preserveAspectRatio: false,\n |\n | // a value of 'none' will limit the resize rect to a minimum of 0x0\n | // 'negate' will allow the rect to have negative width/height\n | // 'reposition' will keep the width/height positive by swapping\n | // the top and bottom edges and/or swapping the left and right edges\n | invert: 'none' || 'negate' || 'reposition'\n |\n | // limit multiple resizes.\n | // See the explanation in the @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n \\*/\nInteractable.prototype.resizable = function (options) {\n if (utils.is.object(options)) {\n this.options.resize.enabled = options.enabled === false? false: true;\n this.setPerAction('resize', options);\n this.setOnEvents('resize', options);\n\n if (/^x$|^y$|^xy$/.test(options.axis)) {\n this.options.resize.axis = options.axis;\n }\n else if (options.axis === null) {\n this.options.resize.axis = defaultOptions.resize.axis;\n }\n\n if (utils.is.bool(options.preserveAspectRatio)) {\n this.options.resize.preserveAspectRatio = options.preserveAspectRatio;\n }\n else if (utils.is.bool(options.square)) {\n this.options.resize.square = options.square;\n }\n\n return this;\n }\n if (utils.is.bool(options)) {\n this.options.resize.enabled = options;\n\n if (!options) {\n this.onresizestart = this.onresizestart = this.onresizeend = null;\n }\n\n return this;\n }\n return this.options.resize;\n};\n\nfunction checkResizeEdge (name, value, page, element, interactableElement, rect, margin) {\n // false, '', undefined, null\n if (!value) { return false; }\n\n // true value, use pointer coords and element rect\n if (value === true) {\n // if dimensions are negative, \"switch\" edges\n const width = utils.is.number(rect.width )? rect.width : rect.right - rect.left;\n const height = utils.is.number(rect.height)? rect.height : rect.bottom - rect.top ;\n\n if (width < 0) {\n if (name === 'left' ) { name = 'right'; }\n else if (name === 'right') { name = 'left' ; }\n }\n if (height < 0) {\n if (name === 'top' ) { name = 'bottom'; }\n else if (name === 'bottom') { name = 'top' ; }\n }\n\n if (name === 'left' ) { return page.x < ((width >= 0? rect.left: rect.right ) + margin); }\n if (name === 'top' ) { return page.y < ((height >= 0? rect.top : rect.bottom) + margin); }\n\n if (name === 'right' ) { return page.x > ((width >= 0? rect.right : rect.left) - margin); }\n if (name === 'bottom') { return page.y > ((height >= 0? rect.bottom: rect.top ) - margin); }\n }\n\n // the remaining checks require an element\n if (!utils.is.element(element)) { return false; }\n\n return utils.is.element(value)\n // the value is an element to use as a resize handle\n ? value === element\n // otherwise check if element matches value as selector\n : utils.matchesUpTo(element, value, interactableElement);\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.resizeAxes = 'xy';\n});\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action }) {\n if (action !== 'resize' || !interaction.resizeAxes) { return; }\n\n const options = interaction.target.options;\n\n if (options.resize.square) {\n if (interaction.resizeAxes === 'y') {\n iEvent.dx = iEvent.dy;\n }\n else {\n iEvent.dy = iEvent.dx;\n }\n iEvent.axes = 'xy';\n }\n else {\n iEvent.axes = interaction.resizeAxes;\n\n if (interaction.resizeAxes === 'x') {\n iEvent.dy = 0;\n }\n else if (interaction.resizeAxes === 'y') {\n iEvent.dx = 0;\n }\n }\n});\n\nactions.resize = resize;\nactions.names.push('resize');\nutils.merge(Interactable.eventTypes, [\n 'resizestart',\n 'resizemove',\n 'resizeinertiastart',\n 'resizeinertiaresume',\n 'resizeend',\n]);\nactions.methodDict.resize = 'resizable';\n\ndefaultOptions.resize = resize.defaults;\n\nmodule.exports = resize;\n","const raf = require('./utils/raf');\nconst getWindow = require('./utils/window').getWindow;\nconst is = require('./utils/is');\nconst domUtils = require('./utils/domUtils');\nconst Interaction = require('./Interaction');\nconst defaultOptions = require('./defaultOptions');\n\nconst autoScroll = {\n defaults: {\n enabled : false,\n container: null, // the item that is scrolled (Window or HTMLElement)\n margin : 60,\n speed : 300, // the scroll speed in pixels per second\n },\n\n interaction: null,\n i: null, // the handle returned by window.setInterval\n x: 0, y: 0, // Direction each pulse is to scroll in\n\n isScrolling: false,\n prevTime: 0,\n\n start: function (interaction) {\n autoScroll.isScrolling = true;\n raf.cancel(autoScroll.i);\n\n autoScroll.interaction = interaction;\n autoScroll.prevTime = new Date().getTime();\n autoScroll.i = raf.request(autoScroll.scroll);\n },\n\n stop: function () {\n autoScroll.isScrolling = false;\n raf.cancel(autoScroll.i);\n },\n\n // scroll the window by the values in scroll.x/y\n scroll: function () {\n const options = autoScroll.interaction.target.options[autoScroll.interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(autoScroll.interaction.element);\n const now = new Date().getTime();\n // change in time in seconds\n const dt = (now - autoScroll.prevTime) / 1000;\n // displacement\n const s = options.speed * dt;\n\n if (s >= 1) {\n if (is.window(container)) {\n container.scrollBy(autoScroll.x * s, autoScroll.y * s);\n }\n else if (container) {\n container.scrollLeft += autoScroll.x * s;\n container.scrollTop += autoScroll.y * s;\n }\n\n autoScroll.prevTime = now;\n }\n\n if (autoScroll.isScrolling) {\n raf.cancel(autoScroll.i);\n autoScroll.i = raf.request(autoScroll.scroll);\n }\n },\n check: function (interactable, actionName) {\n const options = interactable.options;\n\n return options[actionName].autoScroll && options[actionName].autoScroll.enabled;\n },\n onInteractionMove: function ({ interaction, pointer }) {\n if (!(interaction.interacting()\n && autoScroll.check(interaction.target, interaction.prepared.name))) {\n return;\n }\n\n if (interaction.simulation) {\n autoScroll.x = autoScroll.y = 0;\n return;\n }\n\n let top;\n let right;\n let bottom;\n let left;\n\n const options = interaction.target.options[interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(interaction.element);\n\n if (is.window(container)) {\n left = pointer.clientX < autoScroll.margin;\n top = pointer.clientY < autoScroll.margin;\n right = pointer.clientX > container.innerWidth - autoScroll.margin;\n bottom = pointer.clientY > container.innerHeight - autoScroll.margin;\n }\n else {\n const rect = domUtils.getElementClientRect(container);\n\n left = pointer.clientX < rect.left + autoScroll.margin;\n top = pointer.clientY < rect.top + autoScroll.margin;\n right = pointer.clientX > rect.right - autoScroll.margin;\n bottom = pointer.clientY > rect.bottom - autoScroll.margin;\n }\n\n autoScroll.x = (right ? 1: left? -1: 0);\n autoScroll.y = (bottom? 1: top? -1: 0);\n\n if (!autoScroll.isScrolling) {\n // set the autoScroll properties to those of the target\n autoScroll.margin = options.margin;\n autoScroll.speed = options.speed;\n\n autoScroll.start(interaction);\n }\n },\n};\n\nInteraction.signals.on('stop-active', function () {\n autoScroll.stop();\n});\n\nInteraction.signals.on('action-move', autoScroll.onInteractionMove);\n\ndefaultOptions.perAction.autoScroll = autoScroll.defaults;\n\nmodule.exports = autoScroll;\n","const Interactable = require('../Interactable');\nconst actions = require('../actions/base');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.ignoreFrom\n [ method ]\n *\n * If the target of the `mousedown`, `pointerdown` or `touchstart`\n * event or any of it's parents match the given CSS selector or\n * Element, no drag/resize/gesture is started.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to not ignore any elements\n = (string | Element | object) The current ignoreFrom value or this Interactable\n **\n | interact(element, { ignoreFrom: document.getElementById('no-action') });\n | // or\n | interact(element).ignoreFrom('input, textarea, a');\n\\*/\nInteractable.prototype.ignoreFrom = function (newValue) {\n return this._backCompatOption('ignoreFrom', newValue);\n};\n\n/*\\\n * Interactable.allowFrom\n [ method ]\n *\n * A drag/resize/gesture is started only If the target of the\n * `mousedown`, `pointerdown` or `touchstart` event or any of it's\n * parents match the given CSS selector or Element.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to allow from any element\n = (string | Element | object) The current allowFrom value or this Interactable\n **\n | interact(element, { allowFrom: document.getElementById('drag-handle') });\n | // or\n | interact(element).allowFrom('.handle');\n\\*/\nInteractable.prototype.allowFrom = function (newValue) {\n return this._backCompatOption('allowFrom', newValue);\n};\n\nInteractable.prototype.testIgnore = function (ignoreFrom, interactableElement, element) {\n if (!ignoreFrom || !is.element(element)) { return false; }\n\n if (is.string(ignoreFrom)) {\n return domUtils.matchesUpTo(element, ignoreFrom, interactableElement);\n }\n else if (is.element(ignoreFrom)) {\n return domUtils.nodeContains(ignoreFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testAllow = function (allowFrom, interactableElement, element) {\n if (!allowFrom) { return true; }\n\n if (!is.element(element)) { return false; }\n\n if (is.string(allowFrom)) {\n return domUtils.matchesUpTo(element, allowFrom, interactableElement);\n }\n else if (is.element(allowFrom)) {\n return domUtils.nodeContains(allowFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testIgnoreAllow = function (options, interactableElement, eventTarget) {\n return (!this.testIgnore(options.ignoreFrom, interactableElement, eventTarget)\n && this.testAllow(options.allowFrom, interactableElement, eventTarget));\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (event.buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\n","const interact = require('../interact');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst actions = require('../actions/base');\nconst defaultOptions = require('../defaultOptions');\nconst browser = require('../utils/browser');\nconst scope = require('../scope');\nconst utils = require('../utils');\nconst signals = require('../utils/Signals').new();\n\nrequire('./InteractableMethods');\n\nconst autoStart = {\n signals,\n withinInteractionLimit,\n // Allow this many interactions to happen simultaneously\n maxInteractions: Infinity,\n defaults: {\n perAction: {\n manualStart: false,\n max: Infinity,\n maxPerElement: 1,\n allowFrom: null,\n ignoreFrom: null,\n },\n },\n setActionDefaults: function (action) {\n utils.extend(action.defaults, autoStart.defaults.perAction);\n },\n};\n\n// set cursor style on mousedown\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget }) {\n if (interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\n// set cursor style on mousemove\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget }) {\n if (!interaction.mouse\n || interaction.pointerIsDown\n || interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\nInteraction.signals.on('move', function (arg) {\n const { interaction, event } = arg;\n\n if (!interaction.pointerIsDown\n || interaction.interacting()\n || !interaction.pointerWasMoved\n || !interaction.prepared.name) {\n return;\n }\n\n signals.fire('before-start', arg);\n\n const target = interaction.target;\n\n if (interaction.prepared.name && target) {\n // check manualStart and interaction limit\n if (target.options[interaction.prepared.name].manualStart\n || !withinInteractionLimit(target, interaction.element, interaction.prepared)) {\n interaction.stop(event);\n }\n else {\n interaction.start(interaction.prepared, target, interaction.element);\n }\n }\n});\n\n// Check if the current target supports the action.\n// If so, return the validated action. Otherwise, return null\nfunction validateAction (action, interactable, element, eventTarget) {\n if (utils.is.object(action)\n && interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget)\n && interactable.options[action.name].enabled\n && withinInteractionLimit(interactable, element, action)) {\n return action;\n }\n\n return null;\n}\n\nfunction validateSelector (interaction, pointer, event, matches, matchElements, eventTarget) {\n for (let i = 0, len = matches.length; i < len; i++) {\n const match = matches[i];\n const matchElement = matchElements[i];\n const action = validateAction(match.getAction(pointer, event, interaction, matchElement),\n match,\n matchElement,\n eventTarget);\n\n if (action) {\n return {\n action,\n target: match,\n element: matchElement,\n };\n }\n }\n\n return {};\n}\n\nfunction getActionInfo (interaction, pointer, event, eventTarget) {\n let matches = [];\n let matchElements = [];\n\n let element = eventTarget;\n let action = null;\n\n function pushMatches (interactable, selector, context) {\n const elements = (browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined);\n\n if (utils.matchesSelector(element, selector, elements)) {\n\n matches.push(interactable);\n matchElements.push(element);\n }\n }\n\n while (utils.is.element(element)) {\n matches = [];\n matchElements = [];\n\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && (action = validateAction(elementInteractable.getAction(pointer, event, interaction, element, eventTarget),\n elementInteractable,\n element,\n eventTarget))\n && !elementInteractable.options[action.name].manualStart) {\n return {\n element,\n action,\n target: elementInteractable,\n };\n }\n else {\n scope.interactables.forEachSelector(pushMatches, element);\n\n const actionInfo = validateSelector(interaction, pointer, event, matches, matchElements, eventTarget);\n\n if (actionInfo.action\n && !actionInfo.target.options[actionInfo.action.name].manualStart) {\n return actionInfo;\n }\n }\n\n element = utils.parentNode(element);\n }\n\n return {};\n}\n\nfunction prepare (interaction, { action, target, element }) {\n action = action || {};\n\n if (interaction.target && interaction.target.options.styleCursor) {\n interaction.target._doc.documentElement.style.cursor = '';\n }\n\n interaction.target = target;\n interaction.element = element;\n utils.copyAction(interaction.prepared, action);\n\n if (target && target.options.styleCursor) {\n const cursor = action? actions[action.name].getCursor(action) : '';\n interaction.target._doc.documentElement.style.cursor = cursor;\n }\n\n signals.fire('prepared', { interaction: interaction });\n}\n\nInteraction.signals.on('stop', function ({ interaction }) {\n const target = interaction.target;\n\n if (target && target.options.styleCursor) {\n target._doc.documentElement.style.cursor = '';\n }\n});\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (utils.is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (utils.is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n const buttons = event.buttons || ({\n 0: 1,\n 1: 4,\n 3: 8,\n 4: 16,\n })[event.button];\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\nfunction withinInteractionLimit (interactable, element, action) {\n const options = interactable.options;\n const maxActions = options[action.name].max;\n const maxPerElement = options[action.name].maxPerElement;\n let activeInteractions = 0;\n let targetCount = 0;\n let targetElementCount = 0;\n\n // no actions if any of these values == 0\n if (!(maxActions && maxPerElement && autoStart.maxInteractions)) { return; }\n\n for (let i = 0, len = scope.interactions.length; i < len; i++) {\n const interaction = scope.interactions[i];\n const otherAction = interaction.prepared.name;\n\n if (!interaction.interacting()) { continue; }\n\n activeInteractions++;\n\n if (activeInteractions >= autoStart.maxInteractions) {\n return false;\n }\n\n if (interaction.target !== interactable) { continue; }\n\n targetCount += (otherAction === action.name)|0;\n\n if (targetCount >= maxActions) {\n return false;\n }\n\n if (interaction.element === element) {\n targetElementCount++;\n\n if (otherAction !== action.name || targetElementCount >= maxPerElement) {\n return false;\n }\n }\n }\n\n return autoStart.maxInteractions > 0;\n}\n\n/*\\\n * interact.maxInteractions\n [ method ]\n **\n * Returns or sets the maximum number of concurrent interactions allowed.\n * By default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables\n * and elements, you need to enable it in the draggable, resizable and\n * gesturable `'max'` and `'maxPerElement'` options.\n **\n - newValue (number) #optional Any number. newValue <= 0 means no interactions.\n\\*/\ninteract.maxInteractions = function (newValue) {\n if (utils.is.number(newValue)) {\n autoStart.maxInteractions = newValue;\n\n return this;\n }\n\n return autoStart.maxInteractions;\n};\n\nInteractable.settingsMethods.push('styleCursor');\nInteractable.settingsMethods.push('actionChecker');\nInteractable.settingsMethods.push('ignoreFrom');\nInteractable.settingsMethods.push('allowFrom');\n\ndefaultOptions.base.actionChecker = null;\ndefaultOptions.base.styleCursor = true;\n\nutils.extend(defaultOptions.perAction, autoStart.defaults.perAction);\n\nmodule.exports = autoStart;\n","const autoStart = require('./base');\nconst Interaction = require('../Interaction');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.delayTimer = null;\n});\n\nautoStart.signals.on('prepared', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.delayTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.target, interaction.element);\n }, delay);\n }\n});\n\nInteraction.signals.on('move', function ({ interaction, duplicate }) {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.delayTimer);\n }\n});\n\n// prevent regular down->move autoStart\nautoStart.signals.on('before-start', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.prepared.name = null;\n }\n});\n","const autoStart = require('./base');\nconst scope = require('../scope');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\n\nconst { matchesSelector, parentNode } = require('../utils/domUtils');\n\nautoStart.setActionDefaults(require('../actions/drag'));\n\nautoStart.signals.on('before-start', function ({ interaction, eventTarget, dx, dy }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // check if a drag is in the correct axis\n const absX = Math.abs(dx);\n const absY = Math.abs(dy);\n const options = interaction.target.options.drag;\n const startAxis = options.startAxis;\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy');\n\n interaction.prepared.axis = options.lockAxis === 'start'\n ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n : options.lockAxis;\n\n // if the movement isn't in the startAxis of the interactable\n if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) {\n // cancel the prepared action\n interaction.prepared.name = null;\n\n // then try to get a drag from another ineractable\n\n if (!interaction.prepared.name) {\n\n let element = eventTarget;\n\n const getDraggable = function (interactable, selector, context) {\n const elements = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n if (interactable === interaction.target) { return; }\n\n if (!options.manualStart\n && !interactable.testIgnoreAllow(options, element, eventTarget)\n && matchesSelector(element, selector, elements)) {\n\n const action = interactable.getAction(interaction.downPointer,\n interaction.downEvent,\n interaction,\n element);\n\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, interactable)\n && autoStart.validateAction(action, interactable, element, eventTarget)) {\n\n return interactable;\n }\n }\n };\n\n let action = null;\n\n // check all interactables\n while (is.element(element)) {\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && elementInteractable !== interaction.target\n && !elementInteractable.options.drag.manualStart) {\n\n action = elementInteractable.getAction(interaction.downPointer, interaction.downEvent, interaction, element);\n }\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, elementInteractable)) {\n\n interaction.prepared.name = 'drag';\n interaction.target = elementInteractable;\n interaction.element = element;\n break;\n }\n\n const selectorInteractable = scope.interactables.forEachSelector(getDraggable, element);\n\n if (selectorInteractable) {\n interaction.prepared.name = 'drag';\n interaction.target = selectorInteractable;\n interaction.element = element;\n break;\n }\n\n element = parentNode(element);\n }\n }\n }\n});\n\nfunction checkStartAxis (startAxis, interactable) {\n if (!interactable) { return false; }\n\n const thisAxis = interactable.options.drag.startAxis;\n\n return (startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis);\n}\n","require('./base').setActionDefaults(require('../actions/gesture'));\n","require('./base').setActionDefaults(require('../actions/resize'));\n","module.exports = {\n base: {\n accept : null,\n preventDefault: 'auto',\n deltaSource : 'page',\n },\n\n perAction: {\n origin: { x: 0, y: 0 },\n\n // only allow left button by default\n // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n mouseButtons: 1,\n\n inertia: {\n enabled : false,\n resistance : 10, // the lambda in exponential decay\n minSpeed : 100, // target speed must be above this for inertia to start\n endSpeed : 10, // the speed at which inertia is slow enough to stop\n allowResume : true, // allow resuming an action in inertia phase\n smoothEndDuration: 300, // animate to snap/restrict endOnly if there's no inertia\n },\n },\n};\n","/* browser entry point */\n\n// Legacy browser support\nrequire('./legacyBrowsers');\n\n// inertia\nrequire('./inertia');\n\n// modifiers\nrequire('./modifiers/snap');\nrequire('./modifiers/restrict');\n\n// pointerEvents\nrequire('./pointerEvents/base');\nrequire('./pointerEvents/holdRepeat');\nrequire('./pointerEvents/interactableTargets');\n\n// delay\nrequire('./autoStart/delay');\n\n// actions\nrequire('./actions/gesture');\nrequire('./actions/resize');\nrequire('./actions/drag');\nrequire('./actions/drop');\n\n// load these modifiers after resize is loaded\nrequire('./modifiers/snapSize');\nrequire('./modifiers/restrictEdges');\nrequire('./modifiers/restrictSize');\n\n// autoStart actions\nrequire('./autoStart/gesture');\nrequire('./autoStart/resize');\nrequire('./autoStart/drag');\n\n// Interactable preventDefault setting\nrequire('./interactablePreventDefault.js');\n\n// autoScroll\nrequire('./autoScroll');\n\n// export interact\nmodule.exports = require('./interact');\n","const InteractEvent = require('./InteractEvent');\nconst Interaction = require('./Interaction');\nconst modifiers = require('./modifiers');\nconst utils = require('./utils');\nconst animationFrame = require('./utils/raf');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.inertiaStatus = {\n active : false,\n smoothEnd : false,\n allowResume: false,\n\n startEvent: null,\n upCoords : {},\n\n xe: 0, ye: 0,\n sx: 0, sy: 0,\n\n t0: 0,\n vx0: 0, vys: 0,\n duration: 0,\n\n lambda_v0: 0,\n one_ve_v0: 0,\n i : null,\n };\n\n interaction.boundInertiaFrame = () => inertiaFrame .apply(interaction);\n interaction.boundSmoothEndFrame = () => smoothEndFrame.apply(interaction);\n});\n\nInteraction.signals.on('down', function ({ interaction, event, pointer, eventTarget }) {\n const status = interaction.inertiaStatus;\n\n // Check if the down event hits the current inertia target\n if (status.active) {\n let element = eventTarget;\n\n // climb up the DOM tree from the event target\n while (utils.is.element(element)) {\n\n // if interaction element is the current inertia target element\n if (element === interaction.element) {\n // stop inertia\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n\n // update pointers to the down event's coordinates\n interaction.updatePointer(pointer);\n utils.setCoords(interaction.curCoords, interaction.pointers);\n\n // fire appropriate signals\n const signalArg = { interaction };\n Interaction.signals.fire('before-action-move', signalArg);\n Interaction.signals.fire('action-resume' , signalArg);\n\n // fire a reume event\n const resumeEvent = new InteractEvent(interaction,\n event,\n interaction.prepared.name,\n 'inertiaresume',\n interaction.element);\n\n interaction.target.fire(resumeEvent);\n interaction.prevEvent = resumeEvent;\n modifiers.resetStatuses(interaction.modifierStatuses);\n\n utils.copyCoords(interaction.prevCoords, interaction.curCoords);\n break;\n }\n\n element = utils.parentNode(element);\n }\n }\n});\n\nInteraction.signals.on('up', function ({ interaction, event }) {\n const status = interaction.inertiaStatus;\n\n if (!interaction.interacting() || status.active) { return; }\n\n const target = interaction.target;\n const options = target && target.options;\n const inertiaOptions = options && interaction.prepared.name && options[interaction.prepared.name].inertia;\n\n const now = new Date().getTime();\n const statuses = {};\n const page = utils.extend({}, interaction.curCoords.page);\n const pointerSpeed = interaction.pointerDelta.client.speed;\n\n let smoothEnd = false;\n let modifierResult;\n\n // check if inertia should be started\n const inertiaPossible = (inertiaOptions && inertiaOptions.enabled\n && interaction.prepared.name !== 'gesture'\n && event !== status.startEvent);\n\n const inertia = (inertiaPossible\n && (now - interaction.curCoords.timeStamp) < 50\n && pointerSpeed > inertiaOptions.minSpeed\n && pointerSpeed > inertiaOptions.endSpeed);\n\n const modifierArg = {\n interaction,\n pageCoords: page,\n statuses,\n preEnd: true,\n requireEndOnly: true,\n };\n\n // smoothEnd\n if (inertiaPossible && !inertia) {\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n if (modifierResult.shouldMove && modifierResult.locked) {\n smoothEnd = true;\n }\n }\n\n if (!(inertia || smoothEnd)) { return; }\n\n utils.copyCoords(status.upCoords, interaction.curCoords);\n\n interaction.pointers[0] = status.startEvent =\n new InteractEvent(interaction, event, interaction.prepared.name, 'inertiastart', interaction.element);\n\n status.t0 = now;\n\n status.active = true;\n status.allowResume = inertiaOptions.allowResume;\n interaction.simulation = status;\n\n target.fire(status.startEvent);\n\n if (inertia) {\n status.vx0 = interaction.pointerDelta.client.vx;\n status.vy0 = interaction.pointerDelta.client.vy;\n status.v0 = pointerSpeed;\n\n calcInertia(interaction, status);\n\n utils.extend(page, interaction.curCoords.page);\n\n page.x += status.xe;\n page.y += status.ye;\n\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n status.modifiedXe += modifierResult.dx;\n status.modifiedYe += modifierResult.dy;\n\n status.i = animationFrame.request(interaction.boundInertiaFrame);\n }\n else {\n status.smoothEnd = true;\n status.xe = modifierResult.dx;\n status.ye = modifierResult.dy;\n\n status.sx = status.sy = 0;\n\n status.i = animationFrame.request(interaction.boundSmoothEndFrame);\n }\n});\n\nInteraction.signals.on('stop-active', function ({ interaction }) {\n const status = interaction.inertiaStatus;\n\n if (status.active) {\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n }\n});\n\nfunction calcInertia (interaction, status) {\n const inertiaOptions = interaction.target.options[interaction.prepared.name].inertia;\n const lambda = inertiaOptions.resistance;\n const inertiaDur = -Math.log(inertiaOptions.endSpeed / status.v0) / lambda;\n\n status.x0 = interaction.prevEvent.pageX;\n status.y0 = interaction.prevEvent.pageY;\n status.t0 = status.startEvent.timeStamp / 1000;\n status.sx = status.sy = 0;\n\n status.modifiedXe = status.xe = (status.vx0 - inertiaDur) / lambda;\n status.modifiedYe = status.ye = (status.vy0 - inertiaDur) / lambda;\n status.te = inertiaDur;\n\n status.lambda_v0 = lambda / status.v0;\n status.one_ve_v0 = 1 - inertiaOptions.endSpeed / status.v0;\n}\n\nfunction inertiaFrame () {\n updateInertiaCoords(this);\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n\n const status = this.inertiaStatus;\n const options = this.target.options[this.prepared.name].inertia;\n const lambda = options.resistance;\n const t = new Date().getTime() / 1000 - status.t0;\n\n if (t < status.te) {\n\n const progress = 1 - (Math.exp(-lambda * t) - status.lambda_v0) / status.one_ve_v0;\n\n if (status.modifiedXe === status.xe && status.modifiedYe === status.ye) {\n status.sx = status.xe * progress;\n status.sy = status.ye * progress;\n }\n else {\n const quadPoint = utils.getQuadraticCurvePoint(0, 0,\n status.xe,\n status.ye,\n status.modifiedXe,\n status.modifiedYe,\n progress);\n\n status.sx = quadPoint.x;\n status.sy = quadPoint.y;\n }\n\n this.doMove();\n\n status.i = animationFrame.request(this.boundInertiaFrame);\n }\n else {\n status.sx = status.modifiedXe;\n status.sy = status.modifiedYe;\n\n this.doMove();\n this.end(status.startEvent);\n status.active = false;\n this.simulation = null;\n }\n\n utils.copyCoords(this.prevCoords, this.curCoords);\n}\n\nfunction smoothEndFrame () {\n updateInertiaCoords(this);\n\n const status = this.inertiaStatus;\n const t = new Date().getTime() - status.t0;\n const duration = this.target.options[this.prepared.name].inertia.smoothEndDuration;\n\n if (t < duration) {\n status.sx = utils.easeOutQuad(t, 0, status.xe, duration);\n status.sy = utils.easeOutQuad(t, 0, status.ye, duration);\n\n this.pointerMove(status.startEvent, status.startEvent);\n\n status.i = animationFrame.request(this.boundSmoothEndFrame);\n }\n else {\n status.sx = status.xe;\n status.sy = status.ye;\n\n this.pointerMove(status.startEvent, status.startEvent);\n this.end(status.startEvent);\n\n status.smoothEnd =\n status.active = false;\n this.simulation = null;\n }\n}\n\nfunction updateInertiaCoords (interaction) {\n const status = interaction.inertiaStatus;\n\n // return if inertia isn't running\n if (!status.active) { return; }\n\n const pageUp = status.upCoords.page;\n const clientUp = status.upCoords.client;\n\n utils.setCoords(interaction.curCoords, [ {\n pageX : pageUp.x + status.sx,\n pageY : pageUp.y + status.sy,\n clientX: clientUp.x + status.sx,\n clientY: clientUp.y + status.sy,\n } ]);\n}\n","const browser = require('./utils/browser');\nconst events = require('./utils/events');\nconst utils = require('./utils');\nconst scope = require('./scope');\nconst Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\n\nconst globalEvents = {};\n\n/*\\\n * interact\n [ method ]\n *\n * The methods of this variable can be used to set elements as\n * interactables and also to change various default settings.\n *\n * Calling it as a function and passing an element or a valid CSS selector\n * string returns an Interactable object which has various methods to\n * configure it.\n *\n - element (Element | string) The HTML or SVG Element to interact with or CSS selector\n = (object) An @Interactable\n *\n > Usage\n | interact('#draggable').draggable(true);\n |\n | var rectables = interact('rect');\n | rectables\n | .gesturable(true)\n | .on('gesturemove', function (event) {\n | // ...\n | });\n\\*/\nfunction interact (element, options) {\n let interactable = scope.interactables.get(element, options);\n\n if (!interactable) {\n interactable = new Interactable(element, options);\n interactable.events.global = globalEvents;\n }\n\n return interactable;\n}\n\n/*\\\n * interact.isSet\n [ method ]\n *\n * Check if an element has been set\n - element (Element) The Element being searched for\n = (boolean) Indicates if the element or CSS selector was previously passed to interact\n\\*/\ninteract.isSet = function (element, options) {\n return scope.interactables.indexOfElement(element, options && options.context) !== -1;\n};\n\n/*\\\n * interact.on\n [ method ]\n *\n * Adds a global listener for an InteractEvent or adds a DOM event to\n * `document`\n *\n - type (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) interact\n\\*/\ninteract.on = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.on(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.on(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n // if it is an InteractEvent type, add listener to globalEvents\n if (utils.contains(Interactable.eventTypes, type)) {\n // if this type of event was never bound\n if (!globalEvents[type]) {\n globalEvents[type] = [listener];\n }\n else {\n globalEvents[type].push(listener);\n }\n }\n // If non InteractEvent type, addEventListener to document\n else {\n events.add(scope.document, type, listener, { options });\n }\n\n return interact;\n};\n\n/*\\\n * interact.off\n [ method ]\n *\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n - type (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) interact\n \\*/\ninteract.off = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.off(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.off(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n if (!utils.contains(Interactable.eventTypes, type)) {\n events.remove(scope.document, type, listener, options);\n }\n else {\n let index;\n\n if (type in globalEvents\n && (index = utils.indexOf(globalEvents[type], listener)) !== -1) {\n globalEvents[type].splice(index, 1);\n }\n }\n\n return interact;\n};\n\n/*\\\n * interact.debug\n [ method ]\n *\n * Returns an object which exposes internal data\n = (object) An object with properties that outline the current state and expose internal functions and variables\n\\*/\ninteract.debug = function () {\n return scope;\n};\n\n// expose the functions used to calculate multi-touch properties\ninteract.getPointerAverage = utils.pointerAverage;\ninteract.getTouchBBox = utils.touchBBox;\ninteract.getTouchDistance = utils.touchDistance;\ninteract.getTouchAngle = utils.touchAngle;\n\ninteract.getElementRect = utils.getElementRect;\ninteract.getElementClientRect = utils.getElementClientRect;\ninteract.matchesSelector = utils.matchesSelector;\ninteract.closest = utils.closest;\n\n/*\\\n * interact.supportsTouch\n [ method ]\n *\n = (boolean) Whether or not the browser supports touch input\n\\*/\ninteract.supportsTouch = function () {\n return browser.supportsTouch;\n};\n\n/*\\\n * interact.supportsPointerEvent\n [ method ]\n *\n = (boolean) Whether or not the browser supports PointerEvents\n\\*/\ninteract.supportsPointerEvent = function () {\n return browser.supportsPointerEvent;\n};\n\n/*\\\n * interact.stop\n [ method ]\n *\n * Cancels all interactions (end events are not fired)\n *\n - event (Event) An event on which to call preventDefault()\n = (object) interact\n\\*/\ninteract.stop = function (event) {\n for (let i = scope.interactions.length - 1; i >= 0; i--) {\n scope.interactions[i].stop(event);\n }\n\n return interact;\n};\n\n/*\\\n * interact.pointerMoveTolerance\n [ method ]\n * Returns or sets the distance the pointer must be moved before an action\n * sequence occurs. This also affects tolerance for tap events.\n *\n - newValue (number) #optional The movement from the start position must be greater than this value\n = (number | Interactable) The current setting or interact\n\\*/\ninteract.pointerMoveTolerance = function (newValue) {\n if (utils.is.number(newValue)) {\n Interaction.pointerMoveTolerance = newValue;\n\n return this;\n }\n\n return Interaction.pointerMoveTolerance;\n};\n\ninteract.addDocument = scope.addDocument;\ninteract.removeDocument = scope.removeDocument;\n\nscope.interact = interact;\n\nmodule.exports = interact;\n","const Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\nconst scope = require('./scope');\nconst is = require('./utils/is');\nconst events = require('./utils/events');\n\nconst { nodeContains, matchesSelector } = require('./utils/domUtils');\n\n/*\\\n * Interactable.preventDefault\n [ method ]\n *\n * Returns or sets whether to prevent the browser's default behaviour\n * in response to pointer events. Can be set to:\n * - `'always'` to always prevent\n * - `'never'` to never prevent\n * - `'auto'` to let interact.js try to determine what would be best\n *\n - newValue (string) #optional `true`, `false` or `'auto'`\n = (string | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.preventDefault = function (newValue) {\n if (/^(always|never|auto)$/.test(newValue)) {\n this.options.preventDefault = newValue;\n return this;\n }\n\n if (is.bool(newValue)) {\n this.options.preventDefault = newValue? 'always' : 'never';\n return this;\n }\n\n return this.options.preventDefault;\n};\n\nInteractable.prototype.checkAndPreventDefault = function (event) {\n const setting = this.options.preventDefault;\n\n if (setting === 'never') { return; }\n\n if (setting === 'always') {\n event.preventDefault();\n return;\n }\n\n // setting === 'auto'\n\n // don't preventDefault if the browser supports passiveEvents\n // CSS touch-action and user-selecct should be used instead\n if (events.supportsOptions) {\n return;\n }\n\n // don't preventDefault of pointerdown events\n if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) {\n return;\n }\n\n // don't preventDefault on editable elements\n if (is.element(event.target)\n && matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) {\n return;\n }\n\n event.preventDefault();\n};\n\nfunction onInteractionEvent ({ interaction, event }) {\n if (interaction.target) {\n interaction.target.checkAndPreventDefault(event);\n }\n}\n\nfor (const eventSignal of ['down', 'move', 'up', 'cancel']) {\n Interaction.signals.on(eventSignal, onInteractionEvent);\n}\n\n// prevent native HTML5 drag on interact.js target elements\nInteraction.docEvents.dragstart = function preventNativeDrag (event) {\n for (const interaction of scope.interactions) {\n\n if (interaction.element\n && (interaction.element === event.target\n || nodeContains(interaction.element, event.target))) {\n\n interaction.target.checkAndPreventDefault(event);\n return;\n }\n }\n};\n","const scope = require('./scope');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst iFinder = require('./utils/interactionFinder');\nconst pointerEvents = require('./pointerEvents/base');\n\nconst { window } = require('./utils/window');\n\nconst toString = Object.prototype.toString;\n\nif (!window.Array.isArray) {\n window.Array.isArray = function (obj) {\n return toString.call(obj) === '[object Array]';\n };\n}\n\nif (!String.prototype.trim) {\n String.prototype.trim = function () {\n return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n };\n}\n\n// http://www.quirksmode.org/dom/events/click.html\n// >Events leading to dblclick\n//\n// IE8 doesn't fire down event before dblclick.\n// This workaround tries to fire a tap and doubletap after dblclick\nfunction onIE8Dblclick (event) {\n const eventTarget = event.target;\n const interaction = iFinder.search(event, event.type, eventTarget);\n\n if (!interaction) { return; }\n\n if (interaction.prevTap\n && event.clientX === interaction.prevTap.clientX\n && event.clientY === interaction.prevTap.clientY\n && eventTarget === interaction.prevTap.target) {\n\n interaction.downTargets[0] = eventTarget;\n interaction.downTimes [0] = new Date().getTime();\n\n pointerEvents.fire({\n interaction,\n event,\n eventTarget,\n pointer: event,\n type: 'tap',\n });\n }\n}\n\nif (browser.isIE8) {\n const selectFix = function (event) {\n for (const interaction of scope.interactions) {\n if (interaction.interacting()) {\n interaction.target.checkAndPreventDefault(event);\n }\n }\n };\n\n const onDocIE8 = function onDocIE8 ({ doc, win }, signalName) {\n const eventMethod = signalName.indexOf('listen') === 0\n ? events.add : events.remove;\n\n // For IE's lack of Event#preventDefault\n eventMethod(doc, 'selectstart', selectFix);\n\n if (pointerEvents) {\n eventMethod(doc, 'dblclick', onIE8Dblclick);\n }\n };\n\n scope.signals.on('add-document' , onDocIE8);\n scope.signals.on('remove-document', onDocIE8);\n}\n\nmodule.exports = null;\n","const InteractEvent = require('../InteractEvent');\nconst Interaction = require('../Interaction');\nconst extend = require('../utils/extend');\n\nconst modifiers = {\n names: [],\n\n setOffsets: function (arg) {\n const { interaction, pageCoords: page } = arg;\n const { target, element, startOffset } = interaction;\n const rect = target.getRect(element);\n\n if (rect) {\n startOffset.left = page.x - rect.left;\n startOffset.top = page.y - rect.top;\n\n startOffset.right = rect.right - page.x;\n startOffset.bottom = rect.bottom - page.y;\n\n if (!('width' in rect)) { rect.width = rect.right - rect.left; }\n if (!('height' in rect)) { rect.height = rect.bottom - rect.top ; }\n }\n else {\n startOffset.left = startOffset.top = startOffset.right = startOffset.bottom = 0;\n }\n\n arg.rect = rect;\n arg.interactable = target;\n arg.element = element;\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n\n arg.options = target.options[interaction.prepared.name][modifierName];\n\n if (!arg.options) {\n continue;\n }\n\n interaction.modifierOffsets[modifierName] = modifiers[modifierName].setOffset(arg);\n }\n },\n\n setAll: function (arg) {\n const { interaction, statuses, preEnd, requireEndOnly } = arg;\n const coords = extend({}, arg.pageCoords);\n const result = {\n dx: 0,\n dy: 0,\n changed: false,\n locked: false,\n shouldMove: true,\n };\n\n for (const modifierName of modifiers.names) {\n const modifier = modifiers[modifierName];\n const options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!shouldDo(options, preEnd, requireEndOnly)) { continue; }\n\n arg.status = arg.status = statuses[modifierName];\n arg.options = options;\n arg.offset = arg.interaction.modifierOffsets[modifierName];\n\n modifier.set(arg);\n\n if (arg.status.locked) {\n coords.x += arg.status.dx;\n coords.y += arg.status.dy;\n\n result.dx += arg.status.dx;\n result.dy += arg.status.dy;\n\n result.locked = true;\n }\n }\n\n // a move should be fired if:\n // - there are no modifiers enabled,\n // - no modifiers are \"locked\" i.e. have changed the pointer's coordinates, or\n // - the locked coords have changed since the last pointer move\n result.shouldMove = !arg.status || !result.locked || arg.status.changed;\n\n return result;\n },\n\n resetStatuses: function (statuses) {\n for (const modifierName of modifiers.names) {\n const status = statuses[modifierName] || {};\n\n status.dx = status.dy = 0;\n status.modifiedX = status.modifiedY = NaN;\n status.locked = false;\n status.changed = true;\n\n statuses[modifierName] = status;\n }\n\n return statuses;\n },\n\n start: function ({ interaction }, signalName) {\n const arg = {\n interaction,\n pageCoords: (signalName === 'action-resume' ?\n interaction.curCoords : interaction.startCoords).page,\n startOffset: interaction.startOffset,\n statuses: interaction.modifierStatuses,\n preEnd: false,\n requireEndOnly: false,\n };\n\n modifiers.setOffsets(arg);\n modifiers.resetStatuses(arg.statuses);\n\n arg.pageCoords = extend({}, interaction.startCoords.page);\n interaction.modifierResult = modifiers.setAll(arg);\n },\n};\n\nInteraction.signals.on('new', function (interaction) {\n interaction.startOffset = { left: 0, right: 0, top: 0, bottom: 0 };\n interaction.modifierOffsets = {};\n interaction.modifierStatuses = modifiers.resetStatuses({});\n interaction.modifierResult = null;\n});\n\nInteraction.signals.on('action-start' , modifiers.start);\nInteraction.signals.on('action-resume', modifiers.start);\n\nInteraction.signals.on('before-action-move', function ({ interaction, preEnd, interactingBeforeMove }) {\n const modifierResult = modifiers.setAll({\n interaction,\n preEnd,\n pageCoords: interaction.curCoords.page,\n statuses: interaction.modifierStatuses,\n requireEndOnly: false,\n });\n\n // don't fire an action move if a modifier would keep the event in the same\n // cordinates as before\n if (!modifierResult.shouldMove && interactingBeforeMove) {\n interaction._dontFireMove = true;\n }\n\n interaction.modifierResult = modifierResult;\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n for (let i = 0; i < modifiers.names.length; i++) {\n const options = interaction.target.options[interaction.prepared.name][modifiers.names[i]];\n\n // if the endOnly option is true for any modifier\n if (shouldDo(options, true, true)) {\n // fire a move event at the modified coordinates\n interaction.doMove({ event, preEnd: true });\n break;\n }\n }\n});\n\nInteractEvent.signals.on('set-xy', function (arg) {\n const { iEvent, interaction } = arg;\n const modifierArg = extend({}, arg);\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n modifierArg.options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!modifierArg.options) {\n continue;\n }\n\n const modifier = modifiers[modifierName];\n\n modifierArg.status = interaction.modifierStatuses[modifierName];\n\n iEvent[modifierName] = modifier.modifyCoords(modifierArg);\n }\n});\n\nfunction shouldDo (options, preEnd, requireEndOnly) {\n return (options && options.enabled\n && (preEnd || !options.endOnly)\n && (!requireEndOnly || options.endOnly));\n}\n\nmodule.exports = modifiers;\n","const modifiers = require('./index');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst restrict = {\n defaults: {\n enabled : false,\n endOnly : false,\n restriction: null,\n elementRect: null,\n },\n\n setOffset: function ({ rect, startOffset, options }) {\n const elementRect = options && options.elementRect;\n const offset = {};\n\n if (rect && elementRect) {\n offset.left = startOffset.left - (rect.width * elementRect.left);\n offset.top = startOffset.top - (rect.height * elementRect.top);\n\n offset.right = startOffset.right - (rect.width * (1 - elementRect.right));\n offset.bottom = startOffset.bottom - (rect.height * (1 - elementRect.bottom));\n }\n else {\n offset.left = offset.top = offset.right = offset.bottom = 0;\n }\n\n return offset;\n },\n\n set: function ({ pageCoords, interaction, status, options }) {\n if (!options) { return status; }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n\n const restriction = getRestrictionRect(options.restriction, interaction, page);\n\n if (!restriction) { return status; }\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n const rect = restriction;\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n const offset = interaction.modifierOffsets.restrict;\n\n // object is assumed to have\n // x, y, width, height or\n // left, top, right, bottom\n if ('x' in restriction && 'y' in restriction) {\n modifiedX = Math.max(Math.min(rect.x + rect.width - offset.right , page.x), rect.x + offset.left);\n modifiedY = Math.max(Math.min(rect.y + rect.height - offset.bottom, page.y), rect.y + offset.top );\n }\n else {\n modifiedX = Math.max(Math.min(rect.right - offset.right , page.x), rect.left + offset.left);\n modifiedY = Math.max(Math.min(rect.bottom - offset.bottom, page.y), rect.top + offset.top );\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const elementRect = options && options.elementRect;\n\n if (options && options.enabled\n && !(phase === 'start' && elementRect && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n getRestrictionRect,\n};\n\nfunction getRestrictionRect (value, interaction, page) {\n if (utils.is.function(value)) {\n return utils.resolveRectLike(value, interaction.target, interaction.element, [page.x, page.y, interaction]);\n } else {\n return utils.resolveRectLike(value, interaction.target, interaction.element);\n }\n}\n\nmodifiers.restrict = restrict;\nmodifiers.names.push('restrict');\n\ndefaultOptions.perAction.restrict = restrict.defaults;\n\nmodule.exports = restrict;\n","// This module adds the options.resize.restrictEdges setting which sets min and\n// max for the top, left, bottom and right edges of the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictEdges: {\n// inner: { top: 200, left: 200, right: 400, bottom: 400 },\n// outer: { top: 0, left: 0, right: 600, bottom: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst { getRestrictionRect } = require('./restrict');\n\nconst noInner = { top: +Infinity, left: +Infinity, bottom: -Infinity, right: -Infinity };\nconst noOuter = { top: -Infinity, left: -Infinity, bottom: +Infinity, right: +Infinity };\n\nconst restrictEdges = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n offset: null,\n },\n\n setOffset: function ({ interaction, startOffset, options }) {\n if (!options) {\n return utils.extend({}, startOffset);\n }\n\n const offset = getRestrictionRect(options.offset, interaction, interaction.startCoords.page);\n\n if (offset) {\n return {\n top: startOffset.top + offset.y,\n left: startOffset.left + offset.x,\n bottom: startOffset.bottom + offset.y,\n right: startOffset.right + offset.x,\n };\n }\n\n return startOffset;\n },\n\n set: function ({ pageCoords, interaction, status, offset, options }) {\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n const inner = rectUtils.xywhToTlbr(getRestrictionRect(options.inner, interaction, page)) || noInner;\n const outer = rectUtils.xywhToTlbr(getRestrictionRect(options.outer, interaction, page)) || noOuter;\n\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n if (edges.top) {\n modifiedY = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top);\n }\n else if (edges.bottom) {\n modifiedY = Math.max(Math.min(outer.bottom - offset.bottom, page.y), inner.bottom - offset.bottom);\n }\n if (edges.left) {\n modifiedX = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left);\n }\n else if (edges.right) {\n modifiedX = Math.max(Math.min(outer.right - offset.right, page.x), inner.right - offset.right);\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n if (options && options.enabled\n && !(phase === 'start' && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n noInner,\n noOuter,\n getRestrictionRect,\n};\n\nmodifiers.restrictEdges = restrictEdges;\nmodifiers.names.push('restrictEdges');\n\ndefaultOptions.perAction.restrictEdges = restrictEdges.defaults;\nresize.defaults.restrictEdges = restrictEdges.defaults;\n\nmodule.exports = restrictEdges;\n","// This module adds the options.resize.restrictSize setting which sets min and\n// max width and height for the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictSize: {\n// min: { width: -600, height: -600 },\n// max: { width: 600, height: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst restrictEdges = require('./restrictEdges');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst noMin = { width: -Infinity, height: -Infinity };\nconst noMax = { width: +Infinity, height: +Infinity };\n\nconst restrictSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n },\n\n setOffset: function ({ interaction }) {\n return interaction.startOffset;\n },\n\n set: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const rect = rectUtils.xywhToTlbr(interaction.resizeRects.inverted);\n\n const minSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.min, interaction)) || noMin;\n const maxSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.max, interaction)) || noMax;\n\n arg.options = {\n enabled: options.enabled,\n endOnly: options.endOnly,\n inner: utils.extend({}, restrictEdges.noInner),\n outer: utils.extend({}, restrictEdges.noOuter),\n };\n\n if (edges.top) {\n arg.options.inner.top = rect.bottom - minSize.height;\n arg.options.outer.top = rect.bottom - maxSize.height;\n }\n else if (edges.bottom) {\n arg.options.inner.bottom = rect.top + minSize.height;\n arg.options.outer.bottom = rect.top + maxSize.height;\n }\n if (edges.left) {\n arg.options.inner.left = rect.right - minSize.width;\n arg.options.outer.left = rect.right - maxSize.width;\n }\n else if (edges.right) {\n arg.options.inner.right = rect.left + minSize.width;\n arg.options.outer.right = rect.left + maxSize.width;\n }\n\n restrictEdges.set(arg);\n },\n\n modifyCoords: restrictEdges.modifyCoords,\n};\n\nmodifiers.restrictSize = restrictSize;\nmodifiers.names.push('restrictSize');\n\ndefaultOptions.perAction.restrictSize = restrictSize.defaults;\nresize.defaults.restrictSize = restrictSize.defaults;\n\nmodule.exports = restrictSize;\n","const modifiers = require('./index');\nconst interact = require('../interact');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst snap = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n\n relativePoints: null,\n },\n\n setOffset: function ({ interaction, interactable, element, rect, startOffset, options }) {\n const offsets = [];\n const optionsOrigin = utils.rectToXY(utils.resolveRectLike(options.origin));\n const origin = optionsOrigin || utils.getOriginXY(interactable, element, interaction.prepared.name);\n options = options || interactable.options[interaction.prepared.name].snap || {};\n\n let snapOffset;\n\n if (options.offset === 'startCoords') {\n snapOffset = {\n x: interaction.startCoords.page.x - origin.x,\n y: interaction.startCoords.page.y - origin.y,\n };\n }\n else {\n const offsetRect = utils.resolveRectLike(options.offset, interactable, element, [interaction]);\n\n snapOffset = utils.rectToXY(offsetRect) || { x: 0, y: 0 };\n }\n\n if (rect && options.relativePoints && options.relativePoints.length) {\n for (const { x: relativeX, y: relativeY } of options.relativePoints) {\n offsets.push({\n x: startOffset.left - (rect.width * relativeX) + snapOffset.x,\n y: startOffset.top - (rect.height * relativeY) + snapOffset.y,\n });\n }\n }\n else {\n offsets.push(snapOffset);\n }\n\n return offsets;\n },\n\n set: function ({ interaction, pageCoords, status, options, offset: offsets }) {\n const targets = [];\n let target;\n let page;\n let i;\n\n if (status.useStatusXY) {\n page = { x: status.x, y: status.y };\n }\n else {\n const origin = utils.getOriginXY(interaction.target, interaction.element, interaction.prepared.name);\n\n page = utils.extend({}, pageCoords);\n\n page.x -= origin.x;\n page.y -= origin.y;\n }\n\n status.realX = page.x;\n status.realY = page.y;\n\n let len = options.targets? options.targets.length : 0;\n\n for (const { x: offsetX, y: offsetY } of offsets) {\n const relativeX = page.x - offsetX;\n const relativeY = page.y - offsetY;\n\n for (const snapTarget of options.targets) {\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n targets.push({\n x: utils.is.number(target.x) ? (target.x + offsetX) : relativeX,\n y: utils.is.number(target.y) ? (target.y + offsetY) : relativeY,\n\n range: utils.is.number(target.range)? target.range: options.range,\n });\n }\n }\n\n const closest = {\n target: null,\n inRange: false,\n distance: 0,\n range: 0,\n dx: 0,\n dy: 0,\n };\n\n for (i = 0, len = targets.length; i < len; i++) {\n target = targets[i];\n\n const range = target.range;\n const dx = target.x - page.x;\n const dy = target.y - page.y;\n const distance = utils.hypot(dx, dy);\n let inRange = distance <= range;\n\n // Infinite targets count as being out of range\n // compared to non infinite ones that are in range\n if (range === Infinity && closest.inRange && closest.range !== Infinity) {\n inRange = false;\n }\n\n if (!closest.target || (inRange\n // is the closest target in range?\n ? (closest.inRange && range !== Infinity\n // the pointer is relatively deeper in this target\n ? distance / range < closest.distance / closest.range\n // this target has Infinite range and the closest doesn't\n : (range === Infinity && closest.range !== Infinity)\n // OR this target is closer that the previous closest\n || distance < closest.distance)\n // The other is not in range and the pointer is closer to this target\n : (!closest.inRange && distance < closest.distance))) {\n\n closest.target = target;\n closest.distance = distance;\n closest.range = range;\n closest.inRange = inRange;\n closest.dx = dx;\n closest.dy = dy;\n\n status.range = range;\n }\n }\n\n let snapChanged;\n\n if (closest.target) {\n snapChanged = (status.modifiedX !== closest.target.x || status.modifiedY !== closest.target.y);\n\n status.modifiedX = closest.target.x;\n status.modifiedY = closest.target.y;\n }\n else {\n snapChanged = true;\n\n status.modifiedX = NaN;\n status.modifiedY = NaN;\n }\n\n status.dx = closest.dx;\n status.dy = closest.dy;\n\n status.changed = (snapChanged || (closest.inRange && !status.locked));\n status.locked = closest.inRange;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const relativePoints = options && options.relativePoints;\n\n if (options && options.enabled\n && !(phase === 'start' && relativePoints && relativePoints.length)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n }\n\n return {\n range : status.range,\n locked : status.locked,\n x : status.modifiedX,\n y : status.modifiedY,\n realX : status.realX,\n realY : status.realY,\n dx : status.dx,\n dy : status.dy,\n };\n }\n },\n};\n\ninteract.createSnapGrid = function (grid) {\n return function (x, y) {\n const limits = grid.limits || {\n left : -Infinity,\n right : Infinity,\n top : -Infinity,\n bottom: Infinity,\n };\n let offsetX = 0;\n let offsetY = 0;\n\n if (utils.is.object(grid.offset)) {\n offsetX = grid.offset.x;\n offsetY = grid.offset.y;\n }\n\n const gridx = Math.round((x - offsetX) / grid.x);\n const gridy = Math.round((y - offsetY) / grid.y);\n\n const newX = Math.max(limits.left, Math.min(limits.right , gridx * grid.x + offsetX));\n const newY = Math.max(limits.top , Math.min(limits.bottom, gridy * grid.y + offsetY));\n\n return {\n x: newX,\n y: newY,\n range: grid.range,\n };\n };\n};\n\nmodifiers.snap = snap;\nmodifiers.names.push('snap');\n\ndefaultOptions.perAction.snap = snap.defaults;\n\nmodule.exports = snap;\n","// This module allows snapping of the size of targets during resize\n// interactions.\n\nconst modifiers = require('./index');\nconst snap = require('./snap');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\nconst utils = require('../utils/');\n\nconst snapSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n },\n\n setOffset: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.edges;\n\n if (!edges) { return; }\n\n arg.options = {\n relativePoints: [{\n x: edges.left? 0 : 1,\n y: edges.top ? 0 : 1,\n }],\n origin: { x: 0, y: 0 },\n offset: 'self',\n range: options.range,\n };\n\n const offsets = snap.setOffset(arg);\n arg.options = options;\n\n return offsets;\n },\n\n set: function (arg) {\n const { interaction, options, offset, pageCoords } = arg;\n const page = utils.extend({}, pageCoords);\n const relativeX = page.x - offset[0].x;\n const relativeY = page.y - offset[0].y;\n\n arg.options = utils.extend({}, options);\n arg.options.targets = [];\n\n for (const snapTarget of options.targets) {\n let target;\n\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n if ('width' in target && 'height' in target) {\n target.x = target.width;\n target.y = target.height;\n }\n\n arg.options.targets.push(target);\n }\n\n snap.set(arg);\n },\n\n modifyCoords: function (arg) {\n const { options } = arg;\n\n arg.options = utils.extend({}, options);\n arg.options.enabled = options.enabled;\n arg.options.relativePoints = [null];\n\n snap.modifyCoords(arg);\n },\n};\n\nmodifiers.snapSize = snapSize;\nmodifiers.names.push('snapSize');\n\ndefaultOptions.perAction.snapSize = snapSize.defaults;\nresize.defaults.snapSize = snapSize.defaults;\n\nmodule.exports = snapSize;\n","const pointerUtils = require('../utils/pointerUtils');\n\nmodule.exports = class PointerEvent {\n constructor (type, pointer, event, eventTarget, interaction) {\n pointerUtils.pointerExtend(this, event);\n\n if (event !== pointer) {\n pointerUtils.pointerExtend(this, pointer);\n }\n\n this.interaction = interaction;\n\n this.timeStamp = new Date().getTime();\n this.originalEvent = event;\n this.type = type;\n this.pointerId = pointerUtils.getPointerId(pointer);\n this.pointerType = pointerUtils.getPointerType(pointer, interaction);\n this.target = eventTarget;\n this.currentTarget = null;\n\n if (type === 'tap') {\n const pointerIndex = interaction.getPointerIndex(pointer);\n this.dt = this.timeStamp - interaction.downTimes[pointerIndex];\n\n const interval = this.timeStamp - interaction.tapTime;\n\n this.double = !!(interaction.prevTap\n && interaction.prevTap.type !== 'doubletap'\n && interaction.prevTap.target === this.target\n && interval < 500);\n }\n else if (type === 'doubletap') {\n this.dt = pointer.timeStamp - interaction.tapTime;\n }\n }\n\n subtractOrigin ({ x: originX, y: originY }) {\n this.pageX -= originX;\n this.pageY -= originY;\n this.clientX -= originX;\n this.clientY -= originY;\n\n return this;\n }\n\n addOrigin ({ x: originX, y: originY }) {\n this.pageX += originX;\n this.pageY += originY;\n this.clientX += originX;\n this.clientY += originY;\n\n return this;\n }\n\n preventDefault () {\n this.originalEvent.preventDefault();\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n};\n","const PointerEvent = require('./PointerEvent');\nconst Interaction = require('../Interaction');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst defaults = require('../defaultOptions');\nconst signals = require('../utils/Signals').new();\nconst { filter } = require('../utils/arr');\n\nconst simpleSignals = [ 'down', 'up', 'cancel' ];\nconst simpleEvents = [ 'down', 'up', 'cancel' ];\n\nconst pointerEvents = {\n PointerEvent,\n fire,\n collectEventTargets,\n signals,\n defaults: {\n holdDuration: 600,\n ignoreFrom : null,\n allowFrom : null,\n origin : { x: 0, y: 0 },\n },\n types: [\n 'down',\n 'move',\n 'up',\n 'cancel',\n 'tap',\n 'doubletap',\n 'hold',\n ],\n};\n\nfunction fire (arg) {\n const {\n interaction, pointer, event, eventTarget,\n type = arg.pointerEvent.type,\n targets = collectEventTargets(arg),\n pointerEvent = new PointerEvent(type, pointer, event, eventTarget, interaction),\n } = arg;\n\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n targets,\n type,\n pointerEvent,\n };\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n\n for (const prop in target.props || {}) {\n pointerEvent[prop] = target.props[prop];\n }\n\n const origin = utils.getOriginXY(target.eventable, target.element);\n\n pointerEvent.subtractOrigin(origin);\n pointerEvent.eventable = target.eventable;\n pointerEvent.currentTarget = target.element;\n\n target.eventable.fire(pointerEvent);\n\n pointerEvent.addOrigin(origin);\n\n if (pointerEvent.immediatePropagationStopped\n || (pointerEvent.propagationStopped\n && (i + 1) < targets.length && targets[i + 1].element !== pointerEvent.currentTarget)) {\n break;\n }\n }\n\n signals.fire('fired', signalArg);\n\n if (type === 'tap') {\n // if pointerEvent should make a double tap, create and fire a doubletap\n // PointerEvent and use that as the prevTap\n const prevTap = pointerEvent.double\n ? fire({\n interaction, pointer, event, eventTarget,\n type: 'doubletap',\n })\n : pointerEvent;\n\n interaction.prevTap = prevTap;\n interaction.tapTime = prevTap.timeStamp;\n }\n\n return pointerEvent;\n}\n\nfunction collectEventTargets ({ interaction, pointer, event, eventTarget, type }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n // do not fire a tap event if the pointer was moved before being lifted\n if (type === 'tap' && (interaction.pointerWasMoved\n // or if the pointerup target is different to the pointerdown target\n || !(interaction.downTargets[pointerIndex] && interaction.downTargets[pointerIndex] === eventTarget))) {\n return [];\n }\n\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n path,\n targets: [],\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (type === 'hold') {\n signalArg.targets = filter(signalArg.targets, target =>\n target.eventable.options.holdDuration === interaction.holdTimers[pointerIndex].duration);\n }\n\n return signalArg.targets;\n}\n\nInteraction.signals.on('update-pointer-down', function ({ interaction, pointerIndex }) {\n interaction.holdTimers[pointerIndex] = { duration: Infinity, timeout: null };\n});\n\nInteraction.signals.on('remove-pointer', function ({ interaction, pointerIndex }) {\n interaction.holdTimers.splice(pointerIndex, 1);\n});\n\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget, duplicateMove }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n if (!duplicateMove && (!interaction.pointerIsDown || interaction.pointerWasMoved)) {\n if (interaction.pointerIsDown) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n\n fire({\n interaction, pointer, event, eventTarget,\n type: 'move',\n });\n }\n});\n\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget, pointerIndex }) {\n // copy event to be used in timeout for IE8\n const eventCopy = browser.isIE8? utils.extend({}, event) : event;\n\n const timer = interaction.holdTimers[pointerIndex];\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'hold',\n targets: [],\n path,\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (!signalArg.targets.length) { return; }\n\n let minDuration = Infinity;\n\n for (let i = 0; i < signalArg.targets.length; i++) {\n const target = signalArg.targets[i];\n const holdDuration = target.eventable.options.holdDuration;\n\n if (holdDuration < minDuration) {\n minDuration = holdDuration;\n }\n }\n\n timer.duration = minDuration;\n timer.timeout = setTimeout(function () {\n fire({\n interaction, eventCopy, eventTarget,\n pointer: browser.isIE8? eventCopy : pointer,\n type: 'hold',\n });\n }, minDuration);\n});\n\nInteraction.signals.on('up', ({ interaction, pointer, event, eventTarget }) => {\n if (!interaction.pointerWasMoved) {\n fire({ interaction, eventTarget, pointer, event, type: 'tap' });\n }\n});\n\n['up', 'cancel'].forEach(function (signalName) {\n Interaction.signals.on(signalName, function ({ interaction, pointerIndex }) {\n if (interaction.holdTimers[pointerIndex]) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n });\n});\n\nfunction createSignalListener (type) {\n return function ({ interaction, pointer, event, eventTarget }) {\n fire({ interaction, eventTarget, pointer, event, type });\n };\n}\n\nfor (let i = 0; i < simpleSignals.length; i++) {\n Interaction.signals.on(simpleSignals[i], createSignalListener(simpleEvents[i]));\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.prevTap = null; // the most recent tap event on this interaction\n interaction.tapTime = 0; // time of the most recent tap event\n interaction.holdTimers = []; // [{ duration, timeout }]\n});\n\ndefaults.pointerEvents = pointerEvents.defaults;\nmodule.exports = pointerEvents;\n","const pointerEvents = require('./base');\nconst Interaction = require('../Interaction');\n\npointerEvents.signals.on('new', onNew);\npointerEvents.signals.on('fired', onFired);\n\nfor (const signal of ['move', 'up', 'cancel', 'endall']) {\n Interaction.signals.on(signal, endHoldRepeat);\n}\n\nfunction onNew ({ pointerEvent }) {\n if (pointerEvent.type !== 'hold') { return; }\n\n pointerEvent.count = (pointerEvent.count || 0) + 1;\n}\n\nfunction onFired ({ interaction, pointerEvent, eventTarget, targets }) {\n if (pointerEvent.type !== 'hold' || !targets.length) { return; }\n\n // get the repeat interval from the first eventable\n const interval = targets[0].eventable.options.holdRepeatInterval;\n\n // don't repeat if the interval is 0 or less\n if (interval <= 0) { return; }\n\n // set a timeout to fire the holdrepeat event\n interaction.holdIntervalHandle = setTimeout(function () {\n pointerEvents.fire({\n interaction,\n eventTarget,\n type: 'hold',\n pointer: pointerEvent,\n event: pointerEvent,\n });\n }, interval);\n}\n\nfunction endHoldRepeat ({ interaction }) {\n // set the interaction's holdStopTime property\n // to stop further holdRepeat events\n if (interaction.holdIntervalHandle) {\n clearInterval(interaction.holdIntervalHandle);\n interaction.holdIntervalHandle = null;\n }\n}\n\n// don't repeat by default\npointerEvents.defaults.holdRepeatInterval = 0;\npointerEvents.types.push('holdrepeat');\n\nmodule.exports = {\n onNew,\n onFired,\n endHoldRepeat,\n};\n","const pointerEvents = require('./base');\nconst Interactable = require('../Interactable');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\nconst scope = require('../scope');\nconst extend = require('../utils/extend');\nconst { merge } = require('../utils/arr');\n\npointerEvents.signals.on('collect-targets', function ({ targets, element, type, eventTarget }) {\n function collectSelectors (interactable, selector, context) {\n const els = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && is.element(element)\n && domUtils.matchesSelector(element, selector, els)\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n const interactable = scope.interactables.get(element);\n\n if (interactable) {\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n scope.interactables.forEachSelector(collectSelectors, element);\n});\n\nInteractable.signals.on('new', function ({ interactable }) {\n interactable.events.getRect = function (element) {\n return interactable.getRect(element);\n };\n});\n\nInteractable.signals.on('set', function ({ interactable, options }) {\n extend(interactable.events.options, pointerEvents.defaults);\n extend(interactable.events.options, options);\n});\n\nmerge(Interactable.eventTypes, pointerEvents.types);\n\nInteractable.prototype.pointerEvents = function (options) {\n extend(this.events.options, options);\n\n return this;\n};\n\nconst __backCompatOption = Interactable.prototype._backCompatOption;\n\nInteractable.prototype._backCompatOption = function (optionName, newValue) {\n const ret = __backCompatOption.call(this, optionName, newValue);\n\n if (ret === this) {\n this.events.options[optionName] = newValue;\n }\n\n return ret;\n};\n\nInteractable.settingsMethods.push('pointerEvents');\n","const utils = require('./utils');\nconst events = require('./utils/events');\nconst signals = require('./utils/Signals').new();\n\nconst scope = {\n signals,\n events,\n utils,\n\n // main document\n document: require('./utils/domObjects').document,\n // all documents being listened to\n documents: [],\n\n addDocument: function (doc, win) {\n // do nothing if document is already known\n if (utils.contains(scope.documents, doc)) { return false; }\n\n win = win || scope.getWindow(doc);\n\n scope.documents.push(doc);\n events.documents.push(doc);\n\n // don't add an unload event for the main document\n // so that the page may be cached in browser history\n if (doc !== scope.document) {\n events.add(win, 'unload', scope.onWindowUnload);\n }\n\n signals.fire('add-document', { doc, win });\n },\n\n removeDocument: function (doc, win) {\n const index = utils.indexOf(scope.documents, doc);\n\n win = win || scope.getWindow(doc);\n\n events.remove(win, 'unload', scope.onWindowUnload);\n\n scope.documents.splice(index, 1);\n events.documents.splice(index, 1);\n\n signals.fire('remove-document', { win, doc });\n },\n\n onWindowUnload: function () {\n scope.removeDocument(this.document, this);\n },\n};\n\nmodule.exports = scope;\n","const { indexOf } = require('./arr');\n\nclass Signals {\n constructor () {\n this.listeners = {\n // signalName: [listeners],\n };\n }\n\n on (name, listener) {\n if (!this.listeners[name]) {\n this.listeners[name] = [listener];\n return;\n }\n\n this.listeners[name].push(listener);\n }\n\n off (name, listener) {\n if (!this.listeners[name]) { return; }\n\n const index = indexOf(this.listeners[name], listener);\n\n if (index !== -1) {\n this.listeners[name].splice(index, 1);\n }\n }\n\n fire (name, arg) {\n const targetListeners = this.listeners[name];\n\n if (!targetListeners) { return; }\n\n for (let i = 0; i < targetListeners.length; i++) {\n if (targetListeners[i](arg, name) === false) {\n return;\n }\n }\n }\n}\n\nSignals.new = function () {\n return new Signals();\n};\n\nmodule.exports = Signals;\n","function indexOf (array, target) {\n for (let i = 0, len = array.length; i < len; i++) {\n if (array[i] === target) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction contains (array, target) {\n return indexOf(array, target) !== -1;\n}\n\nfunction merge (target, source) {\n for (let i = 0; i < source.length; i++) {\n target.push(source[i]);\n }\n\n return target;\n}\n\nfunction filter (array, test) {\n const result = [];\n\n for (let i = 0; i < array.length; i++) {\n if (test(array[i])) {\n result.push(array[i]);\n }\n }\n\n return result;\n}\n\nmodule.exports = {\n indexOf,\n contains,\n merge,\n filter,\n};\n","const { window } = require('./window');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst Element = domObjects.Element;\nconst navigator = window.navigator;\n\nconst browser = {\n // Does the browser support touch input?\n supportsTouch: !!(('ontouchstart' in window) || is.function(window.DocumentTouch)\n && domObjects.document instanceof window.DocumentTouch),\n\n // Does the browser support PointerEvents\n supportsPointerEvent: !!domObjects.PointerEvent,\n\n isIE8: ('attachEvent' in window) && !('addEventListener' in window),\n\n // Opera Mobile must be handled differently\n isOperaMobile: (navigator.appName === 'Opera'\n && browser.supportsTouch\n && navigator.userAgent.match('Presto')),\n\n // scrolling doesn't change the result of getClientRects on iOS 7\n isIOS7: (/iP(hone|od|ad)/.test(navigator.platform)\n && /OS 7[^\\d]/.test(navigator.appVersion)),\n\n isIe9OrOlder: /MSIE (8|9)/.test(navigator.userAgent),\n\n // prefix matchesSelector\n prefixedMatchesSelector: 'matches' in Element.prototype\n ? 'matches': 'webkitMatchesSelector' in Element.prototype\n ? 'webkitMatchesSelector': 'mozMatchesSelector' in Element.prototype\n ? 'mozMatchesSelector': 'oMatchesSelector' in Element.prototype\n ? 'oMatchesSelector': 'msMatchesSelector',\n\n useMatchesSelectorPolyfill: false,\n\n pEventTypes: (domObjects.PointerEvent\n ? (domObjects.PointerEvent === window.MSPointerEvent\n ? {\n up: 'MSPointerUp',\n down: 'MSPointerDown',\n over: 'mouseover',\n out: 'mouseout',\n move: 'MSPointerMove',\n cancel: 'MSPointerCancel',\n }\n : {\n up: 'pointerup',\n down: 'pointerdown',\n over: 'pointerover',\n out: 'pointerout',\n move: 'pointermove',\n cancel: 'pointercancel',\n })\n : null),\n\n // because Webkit and Opera still use 'mousewheel' event type\n wheelEvent: 'onmousewheel' in domObjects.document? 'mousewheel': 'wheel',\n\n};\n\nbrowser.useMatchesSelectorPolyfill = !is.function(Element.prototype[browser.prefixedMatchesSelector]);\n\nmodule.exports = browser;\n","const domObjects = {};\nconst win = require('./window').window;\n\nfunction blank () {}\n\ndomObjects.document = win.document;\ndomObjects.DocumentFragment = win.DocumentFragment || blank;\ndomObjects.SVGElement = win.SVGElement || blank;\ndomObjects.SVGSVGElement = win.SVGSVGElement || blank;\ndomObjects.SVGElementInstance = win.SVGElementInstance || blank;\ndomObjects.Element = win.Element || blank;\ndomObjects.HTMLElement = win.HTMLElement || domObjects.Element;\n\ndomObjects.Event = win.Event;\ndomObjects.Touch = win.Touch || blank;\ndomObjects.PointerEvent = (win.PointerEvent || win.MSPointerEvent);\n\nmodule.exports = domObjects;\n","const win = require('./window');\nconst browser = require('./browser');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst domUtils = {\n nodeContains: function (parent, child) {\n while (child) {\n if (child === parent) {\n return true;\n }\n\n child = child.parentNode;\n }\n\n return false;\n },\n\n closest: function (element, selector) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) { return element; }\n\n element = domUtils.parentNode(element);\n }\n\n return null;\n },\n\n parentNode: function (node) {\n let parent = node.parentNode;\n\n if (is.docFrag(parent)) {\n // skip past #shado-root fragments\n while ((parent = parent.host) && is.docFrag(parent)) {\n continue;\n }\n\n return parent;\n }\n\n return parent;\n },\n\n // taken from http://tanalin.com/en/blog/2012/12/matches-selector-ie8/ and modified\n matchesSelectorPolyfill: browser.useMatchesSelectorPolyfill\n ? function (element, selector, elems) {\n elems = elems || element.parentNode.querySelectorAll(selector);\n\n for (let i = 0, len = elems.length; i < len; i++) {\n if (elems[i] === element) {\n return true;\n }\n }\n\n return false;\n }\n : null,\n\n matchesSelector: function (element, selector, nodeList) {\n if (browser.useMatchesSelectorPolyfill) {\n return domUtils.matchesSelectorPolyfill(element, selector, nodeList);\n }\n\n // remove /deep/ from selectors if shadowDOM polyfill is used\n if (win.window !== win.realWindow) {\n selector = selector.replace(/\\/deep\\//g, ' ');\n }\n\n return element[browser.prefixedMatchesSelector](selector);\n },\n\n // Test for the element that's \"above\" all other qualifiers\n indexOfDeepestElement: function (elements) {\n let deepestZoneParents = [];\n let dropzoneParents = [];\n let dropzone;\n let deepestZone = elements[0];\n let index = deepestZone? 0: -1;\n let parent;\n let child;\n let i;\n let n;\n\n for (i = 1; i < elements.length; i++) {\n dropzone = elements[i];\n\n // an element might belong to multiple selector dropzones\n if (!dropzone || dropzone === deepestZone) {\n continue;\n }\n\n if (!deepestZone) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n // check if the deepest or current are document.documentElement or document.rootElement\n // - if the current dropzone is, do nothing and continue\n if (dropzone.parentNode === dropzone.ownerDocument) {\n continue;\n }\n // - if deepest is, update with the current dropzone and continue to next\n else if (deepestZone.parentNode === dropzone.ownerDocument) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n if (!deepestZoneParents.length) {\n parent = deepestZone;\n while (parent.parentNode && parent.parentNode !== parent.ownerDocument) {\n deepestZoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n }\n\n // if this element is an svg element and the current deepest is\n // an HTMLElement\n if (deepestZone instanceof domObjects.HTMLElement\n && dropzone instanceof domObjects.SVGElement\n && !(dropzone instanceof domObjects.SVGSVGElement)) {\n\n if (dropzone === deepestZone.parentNode) {\n continue;\n }\n\n parent = dropzone.ownerSVGElement;\n }\n else {\n parent = dropzone;\n }\n\n dropzoneParents = [];\n\n while (parent.parentNode !== parent.ownerDocument) {\n dropzoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n\n n = 0;\n\n // get (position of last common ancestor) + 1\n while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) {\n n++;\n }\n\n const parents = [\n dropzoneParents[n - 1],\n dropzoneParents[n],\n deepestZoneParents[n],\n ];\n\n child = parents[0].lastChild;\n\n while (child) {\n if (child === parents[1]) {\n deepestZone = dropzone;\n index = i;\n deepestZoneParents = [];\n\n break;\n }\n else if (child === parents[2]) {\n break;\n }\n\n child = child.previousSibling;\n }\n }\n\n return index;\n },\n\n matchesUpTo: function (element, selector, limit) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) {\n return true;\n }\n\n element = domUtils.parentNode(element);\n\n if (element === limit) {\n return domUtils.matchesSelector(element, selector);\n }\n }\n\n return false;\n },\n\n getActualElement: function (element) {\n return (element instanceof domObjects.SVGElementInstance\n ? element.correspondingUseElement\n : element);\n },\n\n getScrollXY: function (relevantWindow) {\n relevantWindow = relevantWindow || win.window;\n return {\n x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft,\n y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop,\n };\n },\n\n getElementClientRect: function (element) {\n const clientRect = (element instanceof domObjects.SVGElement\n ? element.getBoundingClientRect()\n : element.getClientRects()[0]);\n\n return clientRect && {\n left : clientRect.left,\n right : clientRect.right,\n top : clientRect.top,\n bottom: clientRect.bottom,\n width : clientRect.width || clientRect.right - clientRect.left,\n height: clientRect.height || clientRect.bottom - clientRect.top,\n };\n },\n\n getElementRect: function (element) {\n const clientRect = domUtils.getElementClientRect(element);\n\n if (!browser.isIOS7 && clientRect) {\n const scroll = domUtils.getScrollXY(win.getWindow(element));\n\n clientRect.left += scroll.x;\n clientRect.right += scroll.x;\n clientRect.top += scroll.y;\n clientRect.bottom += scroll.y;\n }\n\n return clientRect;\n },\n\n getPath: function (element) {\n const path = [];\n\n while (element) {\n path.push(element);\n element = domUtils.parentNode(element);\n }\n\n return path;\n },\n\n trySelector: value => {\n if (!is.string(value)) { return false; }\n\n // an exception will be raised if it is invalid\n domObjects.document.querySelector(value);\n return true;\n },\n};\n\nmodule.exports = domUtils;\n","const is = require('./is');\nconst domUtils = require('./domUtils');\nconst pExtend = require('./pointerExtend');\n\nconst { window, getWindow } = require('./window');\nconst { indexOf, contains } = require('./arr');\n\nconst useAttachEvent = ('attachEvent' in window) && !('addEventListener' in window);\nconst addEvent = useAttachEvent? 'attachEvent': 'addEventListener';\nconst removeEvent = useAttachEvent? 'detachEvent': 'removeEventListener';\nconst on = useAttachEvent? 'on': '';\n\nconst elements = [];\nconst targets = [];\nconst attachedListeners = [];\n\n// {\n// type: {\n// selectors: ['selector', ...],\n// contexts : [document, ...],\n// listeners: [[listener, capture, passive], ...]\n// }\n// }\nconst delegatedEvents = {};\n\nconst documents = [];\n\nconst supportsOptions = !useAttachEvent && (() => {\n let supported = false;\n\n window.document.createElement('div').addEventListener('test', null, {\n get capture () { supported = true; },\n });\n\n return supported;\n})();\n\nfunction add (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n let elementIndex = indexOf(elements, element);\n let target = targets[elementIndex];\n\n if (!target) {\n target = {\n events: {},\n typeCount: 0,\n };\n\n elementIndex = elements.push(element) - 1;\n targets.push(target);\n\n attachedListeners.push(useAttachEvent\n ? {\n supplied: [],\n wrapped : [],\n useCount: [],\n }\n : null);\n }\n\n if (!target.events[type]) {\n target.events[type] = [];\n target.typeCount++;\n }\n\n if (!contains(target.events[type], listener)) {\n let ret;\n\n if (useAttachEvent) {\n const { supplied, wrapped, useCount } = attachedListeners[elementIndex];\n const listenerIndex = indexOf(supplied, listener);\n\n const wrappedListener = wrapped[listenerIndex] || function (event) {\n if (!event.immediatePropagationStopped) {\n event.target = event.srcElement;\n event.currentTarget = element;\n\n event.preventDefault = event.preventDefault || preventDef;\n event.stopPropagation = event.stopPropagation || stopProp;\n event.stopImmediatePropagation = event.stopImmediatePropagation || stopImmProp;\n\n if (/mouse|click/.test(event.type)) {\n event.pageX = event.clientX + getWindow(element).document.documentElement.scrollLeft;\n event.pageY = event.clientY + getWindow(element).document.documentElement.scrollTop;\n }\n\n listener(event);\n }\n };\n\n ret = element[addEvent](on + type, wrappedListener, !!options.capture);\n\n if (listenerIndex === -1) {\n supplied.push(listener);\n wrapped.push(wrappedListener);\n useCount.push(1);\n }\n else {\n useCount[listenerIndex]++;\n }\n }\n else {\n ret = element[addEvent](type, listener, supportsOptions? options : !!options.capture);\n }\n target.events[type].push(listener);\n\n return ret;\n }\n}\n\nfunction remove (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const elementIndex = indexOf(elements, element);\n const target = targets[elementIndex];\n\n if (!target || !target.events) {\n return;\n }\n\n let wrappedListener = listener;\n let listeners;\n let listenerIndex;\n\n if (useAttachEvent) {\n listeners = attachedListeners[elementIndex];\n listenerIndex = indexOf(listeners.supplied, listener);\n wrappedListener = listeners.wrapped[listenerIndex];\n }\n\n if (type === 'all') {\n for (type in target.events) {\n if (target.events.hasOwnProperty(type)) {\n remove(element, type, 'all');\n }\n }\n return;\n }\n\n if (target.events[type]) {\n const len = target.events[type].length;\n\n if (listener === 'all') {\n for (let i = 0; i < len; i++) {\n remove(element, type, target.events[type][i], options);\n }\n return;\n }\n else {\n for (let i = 0; i < len; i++) {\n if (target.events[type][i] === listener) {\n element[removeEvent](on + type, wrappedListener, supportsOptions? options : !!options.capture);\n target.events[type].splice(i, 1);\n\n if (useAttachEvent && listeners) {\n listeners.useCount[listenerIndex]--;\n if (listeners.useCount[listenerIndex] === 0) {\n listeners.supplied.splice(listenerIndex, 1);\n listeners.wrapped.splice(listenerIndex, 1);\n listeners.useCount.splice(listenerIndex, 1);\n }\n }\n\n break;\n }\n }\n }\n\n if (target.events[type] && target.events[type].length === 0) {\n target.events[type] = null;\n target.typeCount--;\n }\n }\n\n if (!target.typeCount) {\n targets.splice(elementIndex, 1);\n elements.splice(elementIndex, 1);\n attachedListeners.splice(elementIndex, 1);\n }\n}\n\nfunction addDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n if (!delegatedEvents[type]) {\n delegatedEvents[type] = {\n selectors: [],\n contexts : [],\n listeners: [],\n };\n\n // add delegate listener functions\n for (let i = 0; i < documents.length; i++) {\n add(documents[i], type, delegateListener);\n add(documents[i], type, delegateUseCapture, true);\n }\n }\n\n const delegated = delegatedEvents[type];\n let index;\n\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n break;\n }\n }\n\n if (index === -1) {\n index = delegated.selectors.length;\n\n delegated.selectors.push(selector);\n delegated.contexts .push(context);\n delegated.listeners.push([]);\n }\n\n // keep listener and capture and passive flags\n delegated.listeners[index].push([listener, !!options.capture, options.passive]);\n}\n\nfunction removeDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const delegated = delegatedEvents[type];\n let matchFound = false;\n let index;\n\n if (!delegated) { return; }\n\n // count from last index of delegated to 0\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n // look for matching selector and context Node\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n\n const listeners = delegated.listeners[index];\n\n // each item of the listeners array is an array: [function, capture, passive]\n for (let i = listeners.length - 1; i >= 0; i--) {\n const [fn, capture, passive] = listeners[i];\n\n // check if the listener functions and capture and passive flags match\n if (fn === listener && capture === !!options.capture && passive === options.passive) {\n // remove the listener from the array of listeners\n listeners.splice(i, 1);\n\n // if all listeners for this interactable have been removed\n // remove the interactable from the delegated arrays\n if (!listeners.length) {\n delegated.selectors.splice(index, 1);\n delegated.contexts .splice(index, 1);\n delegated.listeners.splice(index, 1);\n\n // remove delegate function from context\n remove(context, type, delegateListener);\n remove(context, type, delegateUseCapture, true);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegatedEvents[type] = null;\n }\n }\n\n // only remove one listener\n matchFound = true;\n break;\n }\n }\n\n if (matchFound) { break; }\n }\n }\n}\n\n// bound to the interactable context when a DOM event\n// listener is added to a selector interactable\nfunction delegateListener (event, optionalArg) {\n const options = getOptions(optionalArg);\n const fakeEvent = {};\n const delegated = delegatedEvents[event.type];\n const eventTarget = (domUtils.getActualElement(event.path\n ? event.path[0]\n : event.target));\n let element = eventTarget;\n\n // duplicate the event so that currentTarget can be changed\n pExtend(fakeEvent, event);\n\n fakeEvent.originalEvent = event;\n fakeEvent.preventDefault = preventOriginalDefault;\n\n // climb up document tree looking for selector matches\n while (is.element(element)) {\n for (let i = 0; i < delegated.selectors.length; i++) {\n const selector = delegated.selectors[i];\n const context = delegated.contexts[i];\n\n if (domUtils.matchesSelector(element, selector)\n && domUtils.nodeContains(context, eventTarget)\n && domUtils.nodeContains(context, element)) {\n\n const listeners = delegated.listeners[i];\n\n fakeEvent.currentTarget = element;\n\n for (let j = 0; j < listeners.length; j++) {\n const [fn, capture, passive] = listeners[j];\n\n if (capture === !!options.capture && passive === options.passive) {\n fn(fakeEvent);\n }\n }\n }\n }\n\n element = domUtils.parentNode(element);\n }\n}\n\nfunction delegateUseCapture (event) {\n return delegateListener.call(this, event, true);\n}\n\nfunction preventDef () {\n this.returnValue = false;\n}\n\nfunction preventOriginalDefault () {\n this.originalEvent.preventDefault();\n}\n\nfunction stopProp () {\n this.cancelBubble = true;\n}\n\nfunction stopImmProp () {\n this.cancelBubble = true;\n this.immediatePropagationStopped = true;\n}\n\nfunction getOptions (param) {\n return is.object(param)? param : { capture: param };\n}\n\nmodule.exports = {\n add,\n remove,\n\n addDelegate,\n removeDelegate,\n\n delegateListener,\n delegateUseCapture,\n delegatedEvents,\n documents,\n\n useAttachEvent,\n supportsOptions,\n\n _elements: elements,\n _targets: targets,\n _attachedListeners: attachedListeners,\n};\n","module.exports = function extend (dest, source) {\n for (const prop in source) {\n dest[prop] = source[prop];\n }\n return dest;\n};\n","const {\n resolveRectLike,\n rectToXY,\n} = require('./rect');\n\nmodule.exports = function (target, element, action) {\n const actionOptions = target.options[action];\n const actionOrigin = actionOptions && actionOptions.origin;\n const origin = actionOrigin || target.options.origin;\n\n const originRect = resolveRectLike(origin, target, element, [target && element]);\n\n return rectToXY(originRect) || { x: 0, y: 0 };\n};\n","module.exports = (x, y) => Math.sqrt(x * x + y * y);\n","const extend = require('./extend');\nconst win = require('./window');\n\nconst utils = {\n warnOnce: function (method, message) {\n let warned = false;\n\n return function () {\n if (!warned) {\n win.window.console.warn(message);\n warned = true;\n }\n\n return method.apply(this, arguments);\n };\n },\n\n // http://stackoverflow.com/a/5634528/2280888\n _getQBezierValue: function (t, p1, p2, p3) {\n const iT = 1 - t;\n return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3;\n },\n\n getQuadraticCurvePoint: function (startX, startY, cpX, cpY, endX, endY, position) {\n return {\n x: utils._getQBezierValue(position, startX, cpX, endX),\n y: utils._getQBezierValue(position, startY, cpY, endY),\n };\n },\n\n // http://gizma.com/easing/\n easeOutQuad: function (t, b, c, d) {\n t /= d;\n return -c * t*(t-2) + b;\n },\n\n copyAction: function (dest, src) {\n dest.name = src.name;\n dest.axis = src.axis;\n dest.edges = src.edges;\n\n return dest;\n },\n\n is : require('./is'),\n extend : extend,\n hypot : require('./hypot'),\n getOriginXY: require('./getOriginXY'),\n};\n\nextend(utils, require('./arr'));\nextend(utils, require('./domUtils'));\nextend(utils, require('./pointerUtils'));\nextend(utils, require('./rect'));\n\nmodule.exports = utils;\n","const scope = require('../scope');\nconst utils = require('./index');\nconst browser = require('./browser');\n\nconst finder = {\n methodOrder: [ 'simulationResume', 'mouse', 'hasPointer', 'idle' ],\n\n search: function (pointer, eventType, eventTarget) {\n const mouseEvent = (/mouse/i.test(pointer.pointerType || eventType)\n // MSPointerEvent.MSPOINTER_TYPE_MOUSE\n || pointer.pointerType === 4);\n const pointerId = utils.getPointerId(pointer);\n const details = { pointer, pointerId, mouseEvent, eventType, eventTarget };\n\n for (const method of finder.methodOrder) {\n const interaction = finder[method](details);\n\n if (interaction) {\n return interaction;\n }\n }\n },\n\n // try to resume simulation with a new pointer\n simulationResume: function ({ mouseEvent, eventType, eventTarget }) {\n if (!/down|start/i.test(eventType)) {\n return null;\n }\n\n for (const interaction of scope.interactions) {\n let element = eventTarget;\n\n if (interaction.simulation && interaction.simulation.allowResume\n && (interaction.mouse === mouseEvent)) {\n while (element) {\n // if the element is the interaction element\n if (element === interaction.element) {\n return interaction;\n }\n element = utils.parentNode(element);\n }\n }\n }\n\n return null;\n },\n\n // if it's a mouse interaction\n mouse: function ({ pointerId, mouseEvent, eventType }) {\n if (!mouseEvent && (browser.supportsTouch || browser.supportsPointerEvent)) {\n return null;\n }\n\n let firstNonActive;\n\n for (const interaction of scope.interactions) {\n if (interaction.mouse) {\n // if it's a down event, skip interactions with running simulations\n if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; }\n\n // if the interaction is active, return it immediately\n if (interaction.interacting()) {\n return interaction;\n }\n // otherwise save it and look for another active interaction\n else if (!firstNonActive) {\n firstNonActive = interaction;\n }\n }\n }\n\n // if no active mouse interaction was found use the first inactive mouse\n // interaction\n if (firstNonActive) {\n return firstNonActive;\n }\n\n // Find any interaction specifically for mouse.\n // ignore the interaction if the eventType is a mousedown, and a simulation\n // is active\n for (const interaction of scope.interactions) {\n if (interaction.mouse && !(/down/.test(eventType) && interaction.simulation)) {\n return interaction;\n }\n }\n\n return null;\n },\n\n // get interaction that has this pointer\n hasPointer: function ({ pointerId }) {\n for (const interaction of scope.interactions) {\n if (utils.contains(interaction.pointerIds, pointerId)) {\n return interaction;\n }\n }\n },\n\n // get first idle interaction\n idle: function ({ mouseEvent }) {\n for (const interaction of scope.interactions) {\n // if there's already a pointer held down\n if (interaction.pointerIds.length === 1) {\n const target = interaction.target;\n // don't add this pointer if there is a target interactable and it\n // isn't gesturable\n if (target && !target.options.gesture.enabled) {\n continue;\n }\n }\n // maximum of 2 pointers per interaction\n else if (interaction.pointerIds.length >= 2) {\n continue;\n }\n\n if (!interaction.interacting() && (mouseEvent === interaction.mouse)) {\n return interaction;\n }\n }\n\n return null;\n },\n};\n\nmodule.exports = finder;\n","const win = require('./window');\nconst isWindow = require('./isWindow');\n\nconst is = {\n array : () => {},\n\n window : thing => thing === win.window || isWindow(thing),\n\n docFrag : thing => is.object(thing) && thing.nodeType === 11,\n\n object : thing => !!thing && (typeof thing === 'object'),\n\n function: thing => typeof thing === 'function',\n\n number : thing => typeof thing === 'number' ,\n\n bool : thing => typeof thing === 'boolean' ,\n\n string : thing => typeof thing === 'string' ,\n\n element: thing => {\n if (!thing || (typeof thing !== 'object')) { return false; }\n\n const _window = win.getWindow(thing) || win.window;\n\n return (/object|function/.test(typeof _window.Element)\n ? thing instanceof _window.Element //DOM2\n : thing.nodeType === 1 && typeof thing.nodeName === 'string');\n },\n};\n\nis.array = thing => (is.object(thing)\n && (typeof thing.length !== 'undefined')\n && is.function(thing.splice));\n\nmodule.exports = is;\n","module.exports = (thing) => !!(thing && thing.Window) && (thing instanceof thing.Window);\n","function pointerExtend (dest, source) {\n for (const prop in source) {\n const prefixedPropREs = module.exports.prefixedPropREs;\n let deprecated = false;\n\n // skip deprecated prefixed properties\n for (const vendor in prefixedPropREs) {\n if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) {\n deprecated = true;\n break;\n }\n }\n\n if (!deprecated && typeof source[prop] !== 'function') {\n dest[prop] = source[prop];\n }\n }\n return dest;\n}\n\npointerExtend.prefixedPropREs = {\n webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/,\n};\n\nmodule.exports = pointerExtend;\n","const hypot = require('./hypot');\nconst browser = require('./browser');\nconst dom = require('./domObjects');\nconst domUtils = require('./domUtils');\nconst is = require('./is');\nconst pointerExtend = require('./pointerExtend');\n\nconst pointerUtils = {\n copyCoords: function (dest, src) {\n dest.page = dest.page || {};\n dest.page.x = src.page.x;\n dest.page.y = src.page.y;\n\n dest.client = dest.client || {};\n dest.client.x = src.client.x;\n dest.client.y = src.client.y;\n\n dest.timeStamp = src.timeStamp;\n },\n\n setCoordDeltas: function (targetObj, prev, cur) {\n targetObj.page.x = cur.page.x - prev.page.x;\n targetObj.page.y = cur.page.y - prev.page.y;\n targetObj.client.x = cur.client.x - prev.client.x;\n targetObj.client.y = cur.client.y - prev.client.y;\n targetObj.timeStamp = cur.timeStamp - prev.timeStamp;\n\n // set pointer velocity\n const dt = Math.max(targetObj.timeStamp / 1000, 0.001);\n\n targetObj.page.speed = hypot(targetObj.page.x, targetObj.page.y) / dt;\n targetObj.page.vx = targetObj.page.x / dt;\n targetObj.page.vy = targetObj.page.y / dt;\n\n targetObj.client.speed = hypot(targetObj.client.x, targetObj.page.y) / dt;\n targetObj.client.vx = targetObj.client.x / dt;\n targetObj.client.vy = targetObj.client.y / dt;\n },\n\n isNativePointer: function (pointer) {\n return (pointer instanceof dom.Event || pointer instanceof dom.Touch);\n },\n\n // Get specified X/Y coords for mouse or event.touches[0]\n getXY: function (type, pointer, xy) {\n xy = xy || {};\n type = type || 'page';\n\n xy.x = pointer[type + 'X'];\n xy.y = pointer[type + 'Y'];\n\n return xy;\n },\n\n getPageXY: function (pointer, page) {\n page = page || {};\n\n // Opera Mobile handles the viewport and scrolling oddly\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n pointerUtils.getXY('screen', pointer, page);\n\n page.x += window.scrollX;\n page.y += window.scrollY;\n }\n else {\n pointerUtils.getXY('page', pointer, page);\n }\n\n return page;\n },\n\n getClientXY: function (pointer, client) {\n client = client || {};\n\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n // Opera Mobile handles the viewport and scrolling oddly\n pointerUtils.getXY('screen', pointer, client);\n }\n else {\n pointerUtils.getXY('client', pointer, client);\n }\n\n return client;\n },\n\n getPointerId: function (pointer) {\n return is.number(pointer.pointerId)? pointer.pointerId : pointer.identifier;\n },\n\n setCoords: function (targetObj, pointers, timeStamp) {\n const pointer = (pointers.length > 1\n ? pointerUtils.pointerAverage(pointers)\n : pointers[0]);\n\n const tmpXY = {};\n\n pointerUtils.getPageXY(pointer, tmpXY);\n targetObj.page.x = tmpXY.x;\n targetObj.page.y = tmpXY.y;\n\n pointerUtils.getClientXY(pointer, tmpXY);\n targetObj.client.x = tmpXY.x;\n targetObj.client.y = tmpXY.y;\n\n targetObj.timeStamp = is.number(timeStamp) ? timeStamp :new Date().getTime();\n },\n\n pointerExtend: pointerExtend,\n\n getTouchPair: function (event) {\n const touches = [];\n\n // array of touches is supplied\n if (is.array(event)) {\n touches[0] = event[0];\n touches[1] = event[1];\n }\n // an event\n else {\n if (event.type === 'touchend') {\n if (event.touches.length === 1) {\n touches[0] = event.touches[0];\n touches[1] = event.changedTouches[0];\n }\n else if (event.touches.length === 0) {\n touches[0] = event.changedTouches[0];\n touches[1] = event.changedTouches[1];\n }\n }\n else {\n touches[0] = event.touches[0];\n touches[1] = event.touches[1];\n }\n }\n\n return touches;\n },\n\n pointerAverage: function (pointers) {\n const average = {\n pageX : 0,\n pageY : 0,\n clientX: 0,\n clientY: 0,\n screenX: 0,\n screenY: 0,\n };\n\n for (const pointer of pointers) {\n for (const prop in average) {\n average[prop] += pointer[prop];\n }\n }\n for (const prop in average) {\n average[prop] /= pointers.length;\n }\n\n return average;\n },\n\n touchBBox: function (event) {\n if (!event.length && !(event.touches && event.touches.length > 1)) {\n return;\n }\n\n const touches = pointerUtils.getTouchPair(event);\n const minX = Math.min(touches[0].pageX, touches[1].pageX);\n const minY = Math.min(touches[0].pageY, touches[1].pageY);\n const maxX = Math.max(touches[0].pageX, touches[1].pageX);\n const maxY = Math.max(touches[0].pageY, touches[1].pageY);\n\n return {\n x: minX,\n y: minY,\n left: minX,\n top: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n },\n\n touchDistance: function (event, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n\n\n const dx = touches[0][sourceX] - touches[1][sourceX];\n const dy = touches[0][sourceY] - touches[1][sourceY];\n\n return hypot(dx, dy);\n },\n\n touchAngle: function (event, prevAngle, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n const dx = touches[1][sourceX] - touches[0][sourceX];\n const dy = touches[1][sourceY] - touches[0][sourceY];\n const angle = 180 * Math.atan2(dy , dx) / Math.PI;\n\n return angle;\n },\n\n getPointerType: function (pointer, interaction) {\n // if the PointerEvent API isn't available, then the pointer must be ither\n // a MouseEvent or TouchEvent\n if (interaction.mouse) { return 'mouse'; }\n if (!browser.supportsPointerEvent) { return 'touch'; }\n\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : [undefined, undefined,'touch', 'pen', 'mouse'][pointer.pointerType];\n },\n\n // [ event.target, event.currentTarget ]\n getEventTargets: function (event) {\n return [\n domUtils.getActualElement(event.path ? event.path[0] : event.target),\n domUtils.getActualElement(event.currentTarget),\n ];\n },\n};\n\nmodule.exports = pointerUtils;\n","const { window } = require('./window');\n\nconst vendors = ['ms', 'moz', 'webkit', 'o'];\nlet lastTime = 0;\nlet request;\nlet cancel;\n\nfor (let x = 0; x < vendors.length && !window.requestAnimationFrame; x++) {\n request = window[vendors[x] + 'RequestAnimationFrame'];\n cancel = window[vendors[x] +'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n}\n\nif (!request) {\n request = function (callback) {\n const currTime = new Date().getTime();\n const timeToCall = Math.max(0, 16 - (currTime - lastTime));\n const id = setTimeout(function () { callback(currTime + timeToCall); },\n timeToCall);\n\n lastTime = currTime + timeToCall;\n return id;\n };\n}\n\nif (!cancel) {\n cancel = function (id) {\n clearTimeout(id);\n };\n}\n\nmodule.exports = {\n request,\n cancel,\n};\n","const extend = require('./extend');\nconst is = require('./is');\nconst {\n closest,\n parentNode,\n getElementRect,\n} = require('./domUtils');\n\nconst rectUtils = {\n getStringOptionResult: function (value, interactable, element) {\n if (!is.string(value)) {\n return null;\n }\n\n if (value === 'parent') {\n value = parentNode(element);\n }\n else if (value === 'self') {\n value = interactable.getRect(element);\n }\n else {\n value = closest(element, value);\n }\n\n return value;\n },\n\n resolveRectLike: function (value, interactable, element, functionArgs) {\n value = rectUtils.getStringOptionResult(value, interactable, element) || value;\n\n if (is.function(value)) {\n value = value.apply(null, functionArgs);\n }\n\n if (is.element(value)) {\n value = getElementRect(value);\n }\n\n return value;\n },\n\n rectToXY: function (rect) {\n return rect && {\n x: 'x' in rect ? rect.x : rect.left,\n y: 'y' in rect ? rect.y : rect.top,\n };\n },\n\n xywhToTlbr: function (rect) {\n if (rect && !('left' in rect && 'top' in rect)) {\n rect = extend({}, rect);\n\n rect.left = rect.x || 0;\n rect.top = rect.y || 0;\n rect.right = rect.right || (rect.left + rect.width);\n rect.bottom = rect.bottom || (rect.top + rect.height);\n }\n\n return rect;\n },\n\n tlbrToXywh: function (rect) {\n if (rect && !('x' in rect && 'y' in rect)) {\n rect = extend({}, rect);\n\n rect.x = rect.left || 0;\n rect.top = rect.top || 0;\n rect.width = rect.width || (rect.right - rect.x);\n rect.height = rect.height || (rect.bottom - rect.y);\n }\n\n return rect;\n },\n};\n\nmodule.exports = rectUtils;\n","const win = module.exports;\nconst isWindow = require('./isWindow');\n\nfunction init (window) {\n // get wrapped window if using Shadow DOM polyfill\n\n win.realWindow = window;\n\n // create a TextNode\n const el = window.document.createTextNode('');\n\n // check if it's wrapped by a polyfill\n if (el.ownerDocument !== window.document\n && typeof window.wrap === 'function'\n && window.wrap(el) === el) {\n // use wrapped window\n window = window.wrap(window);\n }\n\n win.window = window;\n}\n\nif (typeof window === 'undefined') {\n win.window = undefined;\n win.realWindow = undefined;\n}\nelse {\n init(window);\n}\n\nwin.getWindow = function getWindow (node) {\n if (isWindow(node)) {\n return node;\n }\n\n const rootNode = (node.ownerDocument || node);\n\n return rootNode.defaultView || rootNode.parentWindow || win.window;\n};\n\nwin.init = init;\n"]} \ No newline at end of file +{"version":3,"sources":["src/minHeader.js","src/header.js","index.js","src/Eventable.js","src/InteractEvent.js","src/Interactable.js","src/Interaction.js","src/actions/base.js","src/actions/drag.js","src/actions/drop.js","src/actions/gesture.js","src/actions/resize.js","src/autoScroll.js","src/autoStart/InteractableMethods.js","src/autoStart/base.js","src/autoStart/delay.js","src/autoStart/drag.js","src/autoStart/gesture.js","src/autoStart/resize.js","src/defaultOptions.js","src/index.js","src/inertia.js","src/interact.js","src/interactablePreventDefault.js","src/legacyBrowsers.js","src/modifiers/index.js","src/modifiers/restrict.js","src/modifiers/restrictEdges.js","src/modifiers/restrictSize.js","src/modifiers/snap.js","src/modifiers/snapSize.js","src/pointerEvents/PointerEvent.js","src/pointerEvents/base.js","src/pointerEvents/holdRepeat.js","src/pointerEvents/interactableTargets.js","src/scope.js","src/utils/Signals.js","src/utils/arr.js","src/utils/browser.js","src/utils/domObjects.js","src/utils/domUtils.js","src/utils/events.js","src/utils/extend.js","src/utils/getOriginXY.js","src/utils/hypot.js","src/utils/index.js","src/utils/interactionFinder.js","src/utils/is.js","src/utils/isWindow.js","src/utils/pointerExtend.js","src/utils/pointerUtils.js","src/utils/raf.js","src/utils/rect.js","src/utils/window.js"],"names":[],"mappings":"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","file":"interact.min.js","sourceRoot":"","sourcesContent":["/* interact.js v1.3.0-alpha.4+sha.7970416-dirty | https://raw.github.com/taye/interact.js/master/LICENSE */\n","/**\n * interact.js v1.3.0-alpha.4+sha.7970416-dirty\n *\n * Copyright (c) 2012-2017 Taye Adeyemi \n * Open source under the MIT License.\n * https://raw.github.com/taye/interact.js/master/LICENSE\n */\n","/*\n * In a (windowless) server environment this file exports a factory function\n * that takes the window to use.\n *\n * var interact = require('interact.js')(windowObject);\n *\n * See https://github.com/taye/interact.js/issues/187\n */\nif (typeof window === 'undefined') {\n module.exports = function (window) {\n require('./src/utils/window').init(window);\n\n return require('./src/index');\n };\n}\nelse {\n module.exports = require('./src/index');\n}\n","const { indexOf } = require('./utils/arr');\nconst extend = require('./utils/extend.js');\n\nfunction fireUntilImmediateStopped (event, listeners) {\n for (let i = 0, len = listeners.length; i < len && !event.immediatePropagationStopped; i++) {\n listeners[i](event);\n }\n}\n\nclass Eventable {\n\n constructor (options) {\n this.options = extend({}, options || {});\n }\n\n fire (event) {\n let listeners;\n const onEvent = 'on' + event.type;\n const global = this.global;\n\n // Interactable#on() listeners\n if ((listeners = this[event.type])) {\n fireUntilImmediateStopped(event, listeners);\n }\n\n // interactable.onevent listener\n if (this[onEvent]) {\n this[onEvent](event);\n }\n\n // interact.on() listeners\n if (!event.propagationStopped && global && (listeners = global[event.type])) {\n fireUntilImmediateStopped(event, listeners);\n }\n }\n\n on (eventType, listener) {\n // if this type of event was never bound\n if (this[eventType]) {\n this[eventType].push(listener);\n }\n else {\n this[eventType] = [listener];\n }\n }\n\n off (eventType, listener) {\n // if it is an action event type\n const eventList = this[eventType];\n const index = eventList? indexOf(eventList, listener) : -1;\n\n if (index !== -1) {\n eventList.splice(index, 1);\n }\n\n if (eventList && eventList.length === 0 || !listener) {\n this[eventType] = listener;\n }\n }\n}\n\nmodule.exports = Eventable;\n","const extend = require('./utils/extend');\nconst getOriginXY = require('./utils/getOriginXY');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nclass InteractEvent {\n constructor (interaction, event, action, phase, element, related, preEnd = false) {\n const target = interaction.target;\n const deltaSource = (target && target.options || defaults).deltaSource;\n const origin = getOriginXY(target, element, action);\n const starting = phase === 'start';\n const ending = phase === 'end';\n const coords = starting? interaction.startCoords : interaction.curCoords;\n const prevEvent = interaction.prevEvent;\n\n element = element || interaction.element;\n\n const page = extend({}, coords.page);\n const client = extend({}, coords.client);\n\n page.x -= origin.x;\n page.y -= origin.y;\n\n client.x -= origin.x;\n client.y -= origin.y;\n\n this.ctrlKey = event.ctrlKey;\n this.altKey = event.altKey;\n this.shiftKey = event.shiftKey;\n this.metaKey = event.metaKey;\n this.button = event.button;\n this.buttons = event.buttons;\n this.target = element;\n this.currentTarget = element;\n this.relatedTarget = related || null;\n this.preEnd = preEnd;\n this.type = action + (phase || '');\n this.interaction = interaction;\n this.interactable = target;\n\n this.t0 = starting ? interaction.downTimes[interaction.downTimes.length - 1]\n : prevEvent.t0;\n\n const signalArg = {\n interaction,\n event,\n action,\n phase,\n element,\n related,\n page,\n client,\n coords,\n starting,\n ending,\n deltaSource,\n iEvent: this,\n };\n\n signals.fire('set-xy', signalArg);\n\n if (ending) {\n // use previous coords when ending\n this.pageX = prevEvent.pageX;\n this.pageY = prevEvent.pageY;\n this.clientX = prevEvent.clientX;\n this.clientY = prevEvent.clientY;\n }\n else {\n this.pageX = page.x;\n this.pageY = page.y;\n this.clientX = client.x;\n this.clientY = client.y;\n }\n\n this.x0 = interaction.startCoords.page.x - origin.x;\n this.y0 = interaction.startCoords.page.y - origin.y;\n this.clientX0 = interaction.startCoords.client.x - origin.x;\n this.clientY0 = interaction.startCoords.client.y - origin.y;\n\n signals.fire('set-delta', signalArg);\n\n this.timeStamp = coords.timeStamp;\n this.dt = interaction.pointerDelta.timeStamp;\n this.duration = this.timeStamp - this.t0;\n\n // speed and velocity in pixels per second\n this.speed = interaction.pointerDelta[deltaSource].speed;\n this.velocityX = interaction.pointerDelta[deltaSource].vx;\n this.velocityY = interaction.pointerDelta[deltaSource].vy;\n\n this.swipe = (ending || phase === 'inertiastart')? this.getSwipe() : null;\n\n signals.fire('new', signalArg);\n }\n\n getSwipe () {\n const interaction = this.interaction;\n\n if (interaction.prevEvent.speed < 600\n || this.timeStamp - interaction.prevEvent.timeStamp > 150) {\n return null;\n }\n\n let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI;\n const overlap = 22.5;\n\n if (angle < 0) {\n angle += 360;\n }\n\n const left = 135 - overlap <= angle && angle < 225 + overlap;\n const up = 225 - overlap <= angle && angle < 315 + overlap;\n\n const right = !left && (315 - overlap <= angle || angle < 45 + overlap);\n const down = !up && 45 - overlap <= angle && angle < 135 + overlap;\n\n return {\n up,\n down,\n left,\n right,\n angle,\n speed: interaction.prevEvent.speed,\n velocity: {\n x: interaction.prevEvent.velocityX,\n y: interaction.prevEvent.velocityY,\n },\n };\n }\n\n preventDefault () {}\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n}\n\nsignals.on('set-delta', function ({ iEvent, interaction, starting, deltaSource }) {\n const prevEvent = starting? iEvent : interaction.prevEvent;\n\n if (deltaSource === 'client') {\n iEvent.dx = iEvent.clientX - prevEvent.clientX;\n iEvent.dy = iEvent.clientY - prevEvent.clientY;\n }\n else {\n iEvent.dx = iEvent.pageX - prevEvent.pageX;\n iEvent.dy = iEvent.pageY - prevEvent.pageY;\n }\n});\n\nInteractEvent.signals = signals;\n\nmodule.exports = InteractEvent;\n","const is = require('./utils/is');\nconst events = require('./utils/events');\nconst extend = require('./utils/extend');\nconst actions = require('./actions/base');\nconst scope = require('./scope');\nconst Eventable = require('./Eventable');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nconst {\n getElementRect,\n nodeContains,\n trySelector,\n} = require('./utils/domUtils');\nconst { getWindow } = require('./utils/window');\nconst { indexOf, contains } = require('./utils/arr');\nconst { wheelEvent } = require('./utils/browser');\n\n// all set interactables\nscope.interactables = [];\n\n/*\\\n * Interactable\n [ property ]\n **\n * Object type returned by @interact\n\\*/\nclass Interactable {\n constructor (target, options) {\n options = options || {};\n\n this.target = target;\n this.events = new Eventable();\n this._context = options.context || scope.document;\n this._win = getWindow(trySelector(target)? this._context : target);\n this._doc = this._win.document;\n\n signals.fire('new', {\n target,\n options,\n interactable: this,\n win: this._win,\n });\n\n scope.addDocument( this._doc, this._win );\n\n scope.interactables.push(this);\n\n this.set(options);\n }\n\n setOnEvents (action, phases) {\n const onAction = 'on' + action;\n\n if (is.function(phases.onstart) ) { this.events[onAction + 'start' ] = phases.onstart ; }\n if (is.function(phases.onmove) ) { this.events[onAction + 'move' ] = phases.onmove ; }\n if (is.function(phases.onend) ) { this.events[onAction + 'end' ] = phases.onend ; }\n if (is.function(phases.oninertiastart)) { this.events[onAction + 'inertiastart' ] = phases.oninertiastart ; }\n\n return this;\n }\n\n setPerAction (action, options) {\n // for all the default per-action options\n for (const option in options) {\n // if this option exists for this action\n if (option in defaults[action]) {\n // if the option in the options arg is an object value\n if (is.object(options[option])) {\n // duplicate the object\n this.options[action][option] = extend(this.options[action][option] || {}, options[option]);\n\n if (is.object(defaults.perAction[option]) && 'enabled' in defaults.perAction[option]) {\n this.options[action][option].enabled = options[option].enabled === false? false : true;\n }\n }\n else if (is.bool(options[option]) && is.object(defaults.perAction[option])) {\n this.options[action][option].enabled = options[option];\n }\n else if (options[option] !== undefined) {\n // or if it's not undefined, do a plain assignment\n this.options[action][option] = options[option];\n }\n }\n }\n }\n\n /*\\\n * Interactable.getRect\n [ method ]\n *\n * The default function to get an Interactables bounding rect. Can be\n * overridden using @Interactable.rectChecker.\n *\n - element (Element) #optional The element to measure.\n = (object) The object's bounding rectangle.\n o {\n o top : 0,\n o left : 0,\n o bottom: 0,\n o right : 0,\n o width : 0,\n o height: 0\n o }\n \\*/\n getRect (element) {\n element = element || this.target;\n\n if (is.string(this.target) && !(is.element(element))) {\n element = this._context.querySelector(this.target);\n }\n\n return getElementRect(element);\n }\n\n /*\\\n * Interactable.rectChecker\n [ method ]\n *\n * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n - checker (function) #optional A function which returns this Interactable's bounding rectangle. See @Interactable.getRect\n = (function | object) The checker function or this Interactable\n \\*/\n rectChecker (checker) {\n if (is.function(checker)) {\n this.getRect = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.getRect;\n\n return this;\n }\n\n return this.getRect;\n }\n\n _backCompatOption (optionName, newValue) {\n if (trySelector(newValue) || is.object(newValue)) {\n this.options[optionName] = newValue;\n\n for (const action of actions.names) {\n this.options[action][optionName] = newValue;\n }\n\n return this;\n }\n\n return this.options[optionName];\n }\n\n /*\\\n * Interactable.origin\n [ method ]\n *\n * Gets or sets the origin of the Interactable's element. The x and y\n * of the origin will be subtracted from action event coordinates.\n *\n - origin (object | string) #optional An object eg. { x: 0, y: 0 } or string 'parent', 'self' or any CSS selector\n * OR\n - origin (Element) #optional An HTML or SVG Element whose rect will be used\n **\n = (object) The current origin or this Interactable\n \\*/\n origin (newValue) {\n return this._backCompatOption('origin', newValue);\n }\n\n /*\\\n * Interactable.deltaSource\n [ method ]\n *\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n - newValue (string) #optional Use 'client' if you will be scrolling while interacting; Use 'page' if you want autoScroll to work\n = (string | object) The current deltaSource or this Interactable\n \\*/\n deltaSource (newValue) {\n if (newValue === 'page' || newValue === 'client') {\n this.options.deltaSource = newValue;\n\n return this;\n }\n\n return this.options.deltaSource;\n }\n\n /*\\\n * Interactable.context\n [ method ]\n *\n * Gets the selector context Node of the Interactable. The default is `window.document`.\n *\n = (Node) The context Node of this Interactable\n **\n \\*/\n context () {\n return this._context;\n }\n\n inContext (element) {\n return (this._context === element.ownerDocument\n || nodeContains(this._context, element));\n }\n\n /*\\\n * Interactable.fire\n [ method ]\n *\n * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n - iEvent (InteractEvent) The InteractEvent object to be fired on this Interactable\n = (Interactable) this Interactable\n \\*/\n fire (iEvent) {\n this.events.fire(iEvent);\n\n return this;\n }\n\n _onOffMultiple (method, eventType, listener, options) {\n if (is.string(eventType) && eventType.search(' ') !== -1) {\n eventType = eventType.trim().split(/ +/);\n }\n\n if (is.array(eventType)) {\n for (let i = 0; i < eventType.length; i++) {\n this[method](eventType[i], listener, options);\n }\n\n return true;\n }\n\n if (is.object(eventType)) {\n for (const prop in eventType) {\n this[method](prop, eventType[prop], listener);\n }\n\n return true;\n }\n }\n\n /*\\\n * Interactable.on\n [ method ]\n *\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n - eventType (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) This Interactable\n \\*/\n on (eventType, listener, options) {\n if (this._onOffMultiple('on', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.on(eventType, listener);\n }\n // delegated event for selector\n else if (is.string(this.target)) {\n events.addDelegate(this.target, this._context, eventType, listener, options);\n }\n else {\n events.add(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.off\n [ method ]\n *\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n - eventType (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) This Interactable\n \\*/\n off (eventType, listener, options) {\n if (this._onOffMultiple('off', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n // if it is an action event type\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.off(eventType, listener);\n }\n // delegated event\n else if (is.string(this.target)) {\n events.removeDelegate(this.target, this._context, eventType, listener, options);\n }\n // remove listener from this Interatable's element\n else {\n events.remove(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.set\n [ method ]\n *\n * Reset the options of this Interactable\n - options (object) The new settings to apply\n = (object) This Interactable\n \\*/\n set (options) {\n if (!is.object(options)) {\n options = {};\n }\n\n this.options = extend({}, defaults.base);\n\n const perActions = extend({}, defaults.perAction);\n\n for (const actionName in actions.methodDict) {\n const methodName = actions.methodDict[actionName];\n\n this.options[actionName] = extend({}, defaults[actionName]);\n\n this.setPerAction(actionName, perActions);\n\n this[methodName](options[actionName]);\n }\n\n for (const setting of Interactable.settingsMethods) {\n this.options[setting] = defaults.base[setting];\n\n if (setting in options) {\n this[setting](options[setting]);\n }\n }\n\n signals.fire('set', {\n options,\n interactable: this,\n });\n\n return this;\n }\n\n /*\\\n * Interactable.unset\n [ method ]\n *\n * Remove this interactable from the list of interactables and remove\n * it's action capabilities and event listeners\n *\n = (object) @interact\n \\*/\n unset () {\n events.remove(this.target, 'all');\n\n if (is.string(this.target)) {\n // remove delegated events\n for (const type in events.delegatedEvents) {\n const delegated = events.delegatedEvents[type];\n\n if (delegated.selectors[0] === this.target\n && delegated.contexts[0] === this._context) {\n\n delegated.selectors.splice(0, 1);\n delegated.contexts .splice(0, 1);\n delegated.listeners.splice(0, 1);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegated[type] = null;\n }\n }\n\n events.remove(this._context, type, events.delegateListener);\n events.remove(this._context, type, events.delegateUseCapture, true);\n }\n }\n else {\n events.remove(this, 'all');\n }\n\n signals.fire('unset', { interactable: this });\n\n scope.interactables.splice(indexOf(scope.interactables, this), 1);\n\n // Stop related interactions when an Interactable is unset\n for (const interaction of scope.interactions || []) {\n if (interaction.target === this && interaction.interacting()) {\n interaction.stop();\n }\n }\n\n return scope.interact;\n }\n}\n\nscope.interactables.indexOfElement = function indexOfElement (target, context) {\n context = context || scope.document;\n\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n if (interactable.target === target && interactable._context === context) {\n return i;\n }\n }\n return -1;\n};\n\nscope.interactables.get = function interactableGet (element, options, dontCheckInContext) {\n const ret = this[this.indexOfElement(element, options && options.context)];\n\n return ret && (is.string(element) || dontCheckInContext || ret.inContext(element))? ret : null;\n};\n\nscope.interactables.forEachSelector = function (callback, element) {\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n // skip non CSS selector targets and out of context elements\n if (!is.string(interactable.target)\n || (element && !interactable.inContext(element))) {\n continue;\n }\n\n const ret = callback(interactable, interactable.target, interactable._context, i, this);\n\n if (ret !== undefined) {\n return ret;\n }\n }\n};\n\n// all interact.js eventTypes\nInteractable.eventTypes = scope.eventTypes = [];\n\nInteractable.signals = signals;\n\nInteractable.settingsMethods = [ 'deltaSource', 'origin', 'preventDefault', 'rectChecker' ];\n\nmodule.exports = Interactable;\n","const scope = require('./scope');\nconst utils = require('./utils');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst domObjects = require('./utils/domObjects');\nconst finder = require('./utils/interactionFinder');\nconst signals = require('./utils/Signals').new();\n\nconst listeners = {};\nconst methodNames = [\n 'pointerDown', 'pointerMove', 'pointerUp',\n 'updatePointer', 'removePointer',\n];\n\n// for ignoring browser's simulated mouse events\nlet prevTouchTime = 0;\n\n// all active and idle interactions\nscope.interactions = [];\n\nclass Interaction {\n constructor ({ pointerType }) {\n this.target = null; // current interactable being interacted with\n this.element = null; // the target element of the interactable\n\n this.prepared = { // action that's ready to be fired on next move event\n name : null,\n axis : null,\n edges: null,\n };\n\n // keep track of added pointers\n this.pointers = [];\n this.pointerIds = [];\n this.downTargets = [];\n this.downTimes = [];\n\n // Previous native pointer move event coordinates\n this.prevCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n // current native pointer move event coordinates\n this.curCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Starting InteractEvent pointer coordinates\n this.startCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Change in coordinates and time of the pointer\n this.pointerDelta = {\n page : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n client : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n timeStamp: 0,\n };\n\n this.downEvent = null; // pointerdown/mousedown/touchstart event\n this.downPointer = {};\n\n this._eventTarget = null;\n this._curEventTarget = null;\n\n this.prevEvent = null; // previous action event\n\n this.pointerIsDown = false;\n this.pointerWasMoved = false;\n this._interacting = false;\n\n this.pointerType = pointerType;\n\n signals.fire('new', this);\n\n scope.interactions.push(this);\n }\n\n pointerDown (pointer, event, eventTarget) {\n const pointerIndex = this.updatePointer(pointer, event, true);\n\n signals.fire('down', {\n pointer,\n event,\n eventTarget,\n pointerIndex,\n interaction: this,\n });\n }\n\n /*\\\n * Interaction.start\n [ method ]\n *\n * Start an action with the given Interactable and Element as tartgets. The\n * action must be enabled for the target Interactable and an appropriate number\n * of pointers must be held down - 1 for drag/resize, 2 for gesture.\n *\n * Use it with `interactable.able({ manualStart: false })` to always\n * [start actions manually](https://github.com/taye/interact.js/issues/114)\n *\n - action (object) The action to be performed - drag, resize, etc.\n - target (Interactable) The Interactable to target\n - element (Element) The DOM Element to target\n = (object) interact\n **\n | interact(target)\n | .draggable({\n | // disable the default drag start by down->move\n | manualStart: true\n | })\n | // start dragging after the user holds the pointer down\n | .on('hold', function (event) {\n | var interaction = event.interaction;\n |\n | if (!interaction.interacting()) {\n | interaction.start({ name: 'drag' },\n | event.interactable,\n | event.currentTarget);\n | }\n | });\n \\*/\n start (action, target, element) {\n if (this.interacting()\n || !this.pointerIsDown\n || this.pointerIds.length < (action.name === 'gesture'? 2 : 1)) {\n return;\n }\n\n // if this interaction had been removed after stopping\n // add it back\n if (utils.indexOf(scope.interactions, this) === -1) {\n scope.interactions.push(this);\n }\n\n utils.copyAction(this.prepared, action);\n this.target = target;\n this.element = element;\n\n signals.fire('action-start', {\n interaction: this,\n event: this.downEvent,\n });\n }\n\n pointerMove (pointer, event, eventTarget) {\n if (!this.simulation) {\n this.updatePointer(pointer);\n utils.setCoords(this.curCoords, this.pointers);\n }\n\n const duplicateMove = (this.curCoords.page.x === this.prevCoords.page.x\n && this.curCoords.page.y === this.prevCoords.page.y\n && this.curCoords.client.x === this.prevCoords.client.x\n && this.curCoords.client.y === this.prevCoords.client.y);\n\n let dx;\n let dy;\n\n // register movement greater than pointerMoveTolerance\n if (this.pointerIsDown && !this.pointerWasMoved) {\n dx = this.curCoords.client.x - this.startCoords.client.x;\n dy = this.curCoords.client.y - this.startCoords.client.y;\n\n this.pointerWasMoved = utils.hypot(dx, dy) > Interaction.pointerMoveTolerance;\n }\n\n const signalArg = {\n pointer,\n pointerIndex: this.getPointerIndex(pointer),\n event,\n eventTarget,\n dx,\n dy,\n duplicate: duplicateMove,\n interaction: this,\n interactingBeforeMove: this.interacting(),\n };\n\n if (!duplicateMove) {\n // set pointer coordinate, time changes and speeds\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n }\n\n signals.fire('move', signalArg);\n\n if (!duplicateMove) {\n // if interacting, fire an 'action-move' signal etc\n if (this.interacting()) {\n this.doMove(signalArg);\n }\n\n if (this.pointerWasMoved) {\n utils.copyCoords(this.prevCoords, this.curCoords);\n }\n }\n }\n\n /*\\\n * Interaction.doMove\n [ method ]\n *\n * Force a move of the current action at the same coordinates. Useful if\n * snap/restrict has been changed and you want a movement with the new\n * settings.\n *\n **\n | interact(target)\n | .draggable(true)\n | .on('dragmove', function (event) {\n | if (someCondition) {\n | // change the snap settings\n | event.interactable.draggable({ snap: { targets: [] }});\n | // fire another move event with re-calculated snap\n | event.interaction.doMove();\n | }\n | });\n \\*/\n doMove (signalArg) {\n signalArg = utils.extend({\n pointer: this.pointers[0],\n event: this.prevEvent,\n eventTarget: this._eventTarget,\n interaction: this,\n }, signalArg || {});\n\n signals.fire('before-action-move', signalArg);\n\n if (!this._dontFireMove) {\n signals.fire('action-move', signalArg);\n }\n\n this._dontFireMove = false;\n }\n\n // End interact move events and stop auto-scroll unless simulation is running\n pointerUp (pointer, event, eventTarget, curEventTarget) {\n const pointerIndex = this.getPointerIndex(pointer);\n\n signals.fire(/cancel$/i.test(event.type)? 'cancel' : 'up', {\n pointer,\n pointerIndex,\n event,\n eventTarget,\n curEventTarget,\n interaction: this,\n });\n\n if (!this.simulation) {\n this.end(event);\n }\n\n this.pointerIsDown = false;\n this.removePointer(pointer, event);\n }\n\n /*\\\n * Interaction.end\n [ method ]\n *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n - event (PointerEvent) #optional\n **\n | interact(target)\n | .draggable(true)\n | .on('move', function (event) {\n | if (event.pageX > 1000) {\n | // end the current action\n | event.interaction.end();\n | // stop all further listeners from being called\n | event.stopImmediatePropagation();\n | }\n | });\n \\*/\n end (event) {\n event = event || this.prevEvent;\n\n if (this.interacting()) {\n signals.fire('action-end', {\n event,\n interaction: this,\n });\n }\n\n this.stop();\n }\n\n currentAction () {\n return this._interacting? this.prepared.name: null;\n }\n\n interacting () {\n return this._interacting;\n }\n\n stop () {\n signals.fire('stop', { interaction: this });\n\n if (this._interacting) {\n signals.fire('stop-active', { interaction: this });\n signals.fire('stop-' + this.prepared.name, { interaction: this });\n }\n\n this.target = this.element = null;\n\n this._interacting = false;\n this.prepared.name = this.prevEvent = null;\n }\n\n getPointerIndex (pointer) {\n // mouse and pen interactions may have only one pointer\n if (this.pointerType === 'mouse' || this.pointerType === 'pen') {\n return 0;\n }\n\n return utils.indexOf(this.pointerIds, utils.getPointerId(pointer));\n }\n\n updatePointer (pointer, event, down = event && /(down|start)$/i.test(event.type)) {\n const id = utils.getPointerId(pointer);\n let index = this.getPointerIndex(pointer);\n\n if (index === -1) {\n index = this.pointerIds.length;\n this.pointerIds[index] = id;\n }\n\n if (down) {\n signals.fire('update-pointer-down', {\n pointer,\n event,\n down,\n pointerId: id,\n pointerIndex: index,\n interaction: this,\n });\n }\n\n this.pointers[index] = pointer;\n\n return index;\n }\n\n removePointer (pointer, event) {\n const index = this.getPointerIndex(pointer);\n\n if (index === -1) { return; }\n\n signals.fire('remove-pointer', {\n pointer,\n event,\n pointerIndex: index,\n interaction: this,\n });\n\n this.pointers .splice(index, 1);\n this.pointerIds .splice(index, 1);\n this.downTargets.splice(index, 1);\n this.downTimes .splice(index, 1);\n }\n\n _updateEventTargets (target, currentTarget) {\n this._eventTarget = target;\n this._curEventTarget = currentTarget;\n }\n}\n\nfor (let i = 0, len = methodNames.length; i < len; i++) {\n const method = methodNames[i];\n\n listeners[method] = doOnInteractions(method);\n}\n\nfunction doOnInteractions (method) {\n return (function (event) {\n const pointerType = utils.getPointerType(event);\n const [eventTarget, curEventTarget] = utils.getEventTargets(event);\n const matches = []; // [ [pointer, interaction], ...]\n\n if (browser.supportsTouch && /touch/.test(event.type)) {\n prevTouchTime = new Date().getTime();\n\n for (let i = 0; i < event.changedTouches.length; i++) {\n const pointer = event.changedTouches[i];\n const interaction = finder.search(pointer, event.type, eventTarget);\n\n matches.push([pointer, interaction || new Interaction({ pointerType })]);\n }\n }\n else {\n let invalidPointer = false;\n\n if (!browser.supportsPointerEvent && /mouse/.test(event.type)) {\n // ignore mouse events while touch interactions are active\n for (let i = 0; i < scope.interactions.length && !invalidPointer; i++) {\n invalidPointer = scope.interactions[i].pointerType !== 'mouse' && scope.interactions[i].pointerIsDown;\n }\n\n // try to ignore mouse events that are simulated by the browser\n // after a touch event\n invalidPointer = invalidPointer\n || (new Date().getTime() - prevTouchTime < 500)\n // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated\n || event.timeStamp === 0;\n }\n\n if (!invalidPointer) {\n let interaction = finder.search(event, event.type, eventTarget);\n\n if (!interaction) {\n interaction = new Interaction({ pointerType });\n }\n\n matches.push([event, interaction]);\n }\n }\n\n for (const [pointer, interaction] of matches) {\n interaction._updateEventTargets(eventTarget, curEventTarget);\n interaction[method](pointer, event, eventTarget, curEventTarget);\n }\n });\n}\n\nfunction endAll (event) {\n for (let i = 0; i < scope.interactions.length; i++) {\n const interaction = scope.interactions[i];\n\n interaction.end(event);\n signals.fire('endall', { event, interaction });\n }\n}\n\nconst docEvents = { /* 'eventType': listenerFunc */ };\nconst pEventTypes = browser.pEventTypes;\n\nif (domObjects.PointerEvent) {\n docEvents[pEventTypes.down ] = listeners.pointerDown;\n docEvents[pEventTypes.move ] = listeners.pointerMove;\n docEvents[pEventTypes.up ] = listeners.pointerUp;\n docEvents[pEventTypes.cancel] = listeners.pointerUp;\n}\nelse {\n docEvents.mousedown = listeners.pointerDown;\n docEvents.mousemove = listeners.pointerMove;\n docEvents.mouseup = listeners.pointerUp;\n\n docEvents.touchstart = listeners.pointerDown;\n docEvents.touchmove = listeners.pointerMove;\n docEvents.touchend = listeners.pointerUp;\n docEvents.touchcancel = listeners.pointerUp;\n}\n\ndocEvents.blur = endAll;\n\nfunction onDocSignal ({ doc }, signalName) {\n const eventMethod = signalName.indexOf('add') === 0\n ? events.add : events.remove;\n\n // delegate event listener\n for (const eventType in scope.delegatedEvents) {\n eventMethod(doc, eventType, events.delegateListener);\n eventMethod(doc, eventType, events.delegateUseCapture, true);\n }\n\n for (const eventType in docEvents) {\n eventMethod(doc, eventType, docEvents[eventType]);\n }\n}\n\nsignals.on('update-pointer-down', ({ interaction, pointer, pointerId, pointerIndex, event, eventTarget, down }) => {\n interaction.pointerIds[pointerIndex] = pointerId;\n interaction.pointers[pointerIndex] = pointer;\n\n if (down) {\n interaction.pointerIsDown = true;\n }\n\n if (!interaction.interacting()) {\n utils.setCoords(interaction.startCoords, interaction.pointers);\n\n utils.copyCoords(interaction.curCoords , interaction.startCoords);\n utils.copyCoords(interaction.prevCoords, interaction.startCoords);\n\n interaction.downEvent = event;\n interaction.downTimes[pointerIndex] = interaction.curCoords.timeStamp;\n interaction.downTargets[pointerIndex] = eventTarget || event && utils.getEventTargets(event)[0];\n interaction.pointerWasMoved = false;\n\n utils.pointerExtend(interaction.downPointer, pointer);\n }\n});\n\nscope.signals.on('add-document' , onDocSignal);\nscope.signals.on('remove-document', onDocSignal);\n\nInteraction.pointerMoveTolerance = 1;\nInteraction.doOnInteractions = doOnInteractions;\nInteraction.endAll = endAll;\nInteraction.signals = signals;\nInteraction.docEvents = docEvents;\n\nscope.endAllInteractions = endAll;\n\nmodule.exports = Interaction;\n","const Interaction = require('../Interaction');\nconst InteractEvent = require('../InteractEvent');\n\nconst actions = {\n firePrepared,\n names: [],\n methodDict: {},\n};\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n interaction._interacting = true;\n firePrepared(interaction, event, 'start');\n});\n\nInteraction.signals.on('action-move', function ({ interaction, event, preEnd }) {\n firePrepared(interaction, event, 'move', preEnd);\n\n // if the action was ended in a listener\n if (!interaction.interacting()) { return false; }\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n firePrepared(interaction, event, 'end');\n});\n\nfunction firePrepared (interaction, event, phase, preEnd) {\n const actionName = interaction.prepared.name;\n\n const newEvent = new InteractEvent(interaction, event, actionName, phase, interaction.element, null, preEnd);\n\n interaction.target.fire(newEvent);\n interaction.prevEvent = newEvent;\n}\n\nmodule.exports = actions;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drag = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n startAxis : 'xy',\n lockAxis : 'xy',\n },\n\n checker: function (pointer, event, interactable) {\n const dragOptions = interactable.options.drag;\n\n return dragOptions.enabled\n ? { name: 'drag', axis: (dragOptions.lockAxis === 'start'\n ? dragOptions.startAxis\n : dragOptions.lockAxis)}\n : null;\n },\n\n getCursor: function () {\n return 'move';\n },\n};\n\nInteraction.signals.on('before-action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n interaction.curCoords.page.y = interaction.startCoords.page.y;\n interaction.curCoords.client.y = interaction.startCoords.client.y;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vx);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vx);\n interaction.pointerDelta.client.vy = 0;\n interaction.pointerDelta.page.vy = 0;\n }\n else if (axis === 'y') {\n interaction.curCoords.page.x = interaction.startCoords.page.x;\n interaction.curCoords.client.x = interaction.startCoords.client.x;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vy);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vy);\n interaction.pointerDelta.client.vx = 0;\n interaction.pointerDelta.page.vx = 0;\n }\n});\n\n// dragmove\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'dragmove') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n iEvent.pageY = interaction.startCoords.page.y;\n iEvent.clientY = interaction.startCoords.client.y;\n iEvent.dy = 0;\n }\n else if (axis === 'y') {\n iEvent.pageX = interaction.startCoords.page.x;\n iEvent.clientX = interaction.startCoords.client.x;\n iEvent.dx = 0;\n }\n});\n\n/*\\\n * Interactable.draggable\n [ method ]\n *\n * Gets or sets whether drag actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of drag events\n | var isDraggable = interact('ul li').draggable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on drag events (object makes the Interactable draggable)\n = (object) This Interactable\n | interact(element).draggable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // the axis in which the first movement must be\n | // for the drag sequence to start\n | // 'xy' by default - any direction\n | startAxis: 'x' || 'y' || 'xy',\n |\n | // 'xy' by default - don't restrict to one axis (move in any direction)\n | // 'x' or 'y' to restrict movement to either axis\n | // 'start' to restrict movement to the axis the drag started in\n | lockAxis: 'x' || 'y' || 'xy' || 'start',\n |\n | // max number of drags that can happen concurrently\n | // with elements of this Interactable. Infinity by default\n | max: Infinity,\n |\n | // max number of drags that can target the same element+Interactable\n | // 1 by default\n | maxPerElement: 2\n | });\n\\*/\nInteractable.prototype.draggable = function (options) {\n if (utils.is.object(options)) {\n this.options.drag.enabled = options.enabled === false? false: true;\n this.setPerAction('drag', options);\n this.setOnEvents('drag', options);\n\n if (/^(xy|x|y|start)$/.test(options.lockAxis)) {\n this.options.drag.lockAxis = options.lockAxis;\n }\n if (/^(xy|x|y)$/.test(options.startAxis)) {\n this.options.drag.startAxis = options.startAxis;\n }\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drag.enabled = options;\n\n if (!options) {\n this.ondragstart = this.ondragstart = this.ondragend = null;\n }\n\n return this;\n }\n\n return this.options.drag;\n};\n\nactions.drag = drag;\nactions.names.push('drag');\nutils.merge(Interactable.eventTypes, [\n 'dragstart',\n 'dragmove',\n 'draginertiastart',\n 'draginertiaresume',\n 'dragend',\n]);\nactions.methodDict.drag = 'draggable';\n\ndefaultOptions.drag = drag.defaults;\n\nmodule.exports = drag;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst scope = require('../scope');\nconst interact = require('../interact');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drop = {\n defaults: {\n enabled: false,\n accept : null,\n overlap: 'pointer',\n },\n};\n\nlet dynamicDrop = false;\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // reset active dropzones\n interaction.activeDrops.dropzones = [];\n interaction.activeDrops.elements = [];\n interaction.activeDrops.rects = [];\n\n interaction.dropEvents = null;\n\n if (!interaction.dynamicDrop) {\n setActiveDrops(interaction, interaction.element);\n }\n\n const dragEvent = interaction.prevEvent;\n const dropEvents = getDropEvents(interaction, event, dragEvent);\n\n if (dropEvents.activate) {\n fireActiveDrops(interaction, dropEvents.activate);\n }\n});\n\nInteractEvent.signals.on('new', function ({ interaction, iEvent, event }) {\n if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { return; }\n\n const draggableElement = interaction.element;\n const dragEvent = iEvent;\n const dropResult = getDrop(dragEvent, event, draggableElement);\n\n interaction.dropTarget = dropResult.dropzone;\n interaction.dropElement = dropResult.element;\n\n interaction.dropEvents = getDropEvents(interaction, event, dragEvent);\n});\n\nInteraction.signals.on('action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n fireDropEvents(interaction, interaction.dropEvents);\n});\n\nInteraction.signals.on('action-end', function ({ interaction }) {\n if (interaction.prepared.name === 'drag') {\n fireDropEvents(interaction, interaction.dropEvents);\n }\n});\n\nInteraction.signals.on('stop-drag', function ({ interaction }) {\n interaction.activeDrops.dropzones =\n interaction.activeDrops.elements =\n interaction.activeDrops.rects =\n interaction.dropEvents = null;\n});\n\nfunction collectDrops (interaction, element) {\n const drops = [];\n const elements = [];\n\n element = element || interaction.element;\n\n // collect all dropzones and their elements which qualify for a drop\n for (const current of scope.interactables) {\n if (!current.options.drop.enabled) { continue; }\n\n const accept = current.options.drop.accept;\n\n // test the draggable element against the dropzone's accept setting\n if ((utils.is.element(accept) && accept !== element)\n || (utils.is.string(accept)\n && !utils.matchesSelector(element, accept))) {\n\n continue;\n }\n\n // query for new elements if necessary\n const dropElements = utils.is.string(current.target)\n ? current._context.querySelectorAll(current.target)\n : [current.target];\n\n for (let i = 0; i < dropElements.length; i++) {\n const currentElement = dropElements[i];\n\n if (currentElement !== element) {\n drops.push(current);\n elements.push(currentElement);\n }\n }\n }\n\n return {\n elements,\n dropzones: drops,\n };\n}\n\nfunction fireActiveDrops (interaction, event) {\n let prevElement;\n\n // loop through all active dropzones and trigger event\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n const current = interaction.activeDrops.dropzones[i];\n const currentElement = interaction.activeDrops.elements [i];\n\n // prevent trigger of duplicate events on same element\n if (currentElement !== prevElement) {\n // set current element as event target\n event.target = currentElement;\n current.fire(event);\n }\n prevElement = currentElement;\n }\n}\n\n// Collect a new set of possible drops and save them in activeDrops.\n// setActiveDrops should always be called when a drag has just started or a\n// drag event happens while dynamicDrop is true\nfunction setActiveDrops (interaction, dragElement) {\n // get dropzones and their elements that could receive the draggable\n const possibleDrops = collectDrops(interaction, dragElement, true);\n\n interaction.activeDrops.dropzones = possibleDrops.dropzones;\n interaction.activeDrops.elements = possibleDrops.elements;\n interaction.activeDrops.rects = [];\n\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n interaction.activeDrops.rects[i] =\n interaction.activeDrops.dropzones[i].getRect(interaction.activeDrops.elements[i]);\n }\n}\n\nfunction getDrop (dragEvent, event, dragElement) {\n const interaction = dragEvent.interaction;\n const validDrops = [];\n\n if (dynamicDrop) {\n setActiveDrops(interaction, dragElement);\n }\n\n // collect all dropzones and their elements which qualify for a drop\n for (let j = 0; j < interaction.activeDrops.dropzones.length; j++) {\n const current = interaction.activeDrops.dropzones[j];\n const currentElement = interaction.activeDrops.elements [j];\n const rect = interaction.activeDrops.rects [j];\n\n validDrops.push(current.dropCheck(dragEvent, event, interaction.target, dragElement, currentElement, rect)\n ? currentElement\n : null);\n }\n\n // get the most appropriate dropzone based on DOM depth and order\n const dropIndex = utils.indexOfDeepestElement(validDrops);\n\n return {\n dropzone: interaction.activeDrops.dropzones[dropIndex] || null,\n element : interaction.activeDrops.elements [dropIndex] || null,\n };\n}\n\nfunction getDropEvents (interaction, pointerEvent, dragEvent) {\n const dropEvents = {\n enter : null,\n leave : null,\n activate : null,\n deactivate: null,\n move : null,\n drop : null,\n };\n\n const tmpl = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n };\n\n if (interaction.dropElement !== interaction.prevDropElement) {\n // if there was a prevDropTarget, create a dragleave event\n if (interaction.prevDropTarget) {\n dropEvents.leave = utils.extend({ type: 'dragleave' }, tmpl);\n\n dragEvent.dragLeave = dropEvents.leave.target = interaction.prevDropElement;\n dragEvent.prevDropzone = dropEvents.leave.dropzone = interaction.prevDropTarget;\n }\n // if the dropTarget is not null, create a dragenter event\n if (interaction.dropTarget) {\n dropEvents.enter = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n type : 'dragenter',\n };\n\n dragEvent.dragEnter = interaction.dropElement;\n dragEvent.dropzone = interaction.dropTarget;\n }\n }\n\n if (dragEvent.type === 'dragend' && interaction.dropTarget) {\n dropEvents.drop = utils.extend({ type: 'drop' }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n dragEvent.relatedTarget = interaction.dropElement;\n }\n if (dragEvent.type === 'dragstart') {\n dropEvents.activate = utils.extend({ type: 'dropactivate' }, tmpl);\n\n dropEvents.activate.target = null;\n dropEvents.activate.dropzone = null;\n }\n if (dragEvent.type === 'dragend') {\n dropEvents.deactivate = utils.extend({ type: 'dropdeactivate' }, tmpl);\n\n dropEvents.deactivate.target = null;\n dropEvents.deactivate.dropzone = null;\n }\n if (dragEvent.type === 'dragmove' && interaction.dropTarget) {\n dropEvents.move = utils.extend({\n dragmove : dragEvent,\n type : 'dropmove',\n }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n }\n\n return dropEvents;\n}\n\nfunction fireDropEvents (interaction, dropEvents) {\n if (dropEvents.leave) { interaction.prevDropTarget.fire(dropEvents.leave); }\n if (dropEvents.move ) { interaction.dropTarget.fire(dropEvents.move ); }\n if (dropEvents.enter) { interaction.dropTarget.fire(dropEvents.enter); }\n if (dropEvents.drop ) { interaction.dropTarget.fire(dropEvents.drop ); }\n if (dropEvents.deactivate) {\n fireActiveDrops(interaction, dropEvents.deactivate);\n }\n\n interaction.prevDropTarget = interaction.dropTarget;\n interaction.prevDropElement = interaction.dropElement;\n}\n\n/*\\\n * Interactable.dropzone\n [ method ]\n *\n * Returns or sets whether elements can be dropped onto this\n * Interactable to trigger drop events\n *\n * Dropzones can receive the following events:\n * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends\n * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone\n * - `dragmove` when a draggable that has entered the dropzone is moved\n * - `drop` when a draggable is dropped into this dropzone\n *\n * Use the `accept` option to allow only elements that match the given CSS\n * selector or element. The value can be:\n *\n * - **an Element** - only that element can be dropped into this dropzone.\n * - **a string**, - the element being dragged must match it as a CSS selector.\n * - **`null`** - accept options is cleared - it accepts any element.\n *\n * Use the `overlap` option to set how drops are checked for. The allowed\n * values are:\n *\n * - `'pointer'`, the pointer must be over the dropzone (default)\n * - `'center'`, the draggable element's center must be over the dropzone\n * - a number from 0-1 which is the `(intersection area) / (draggable area)`.\n * e.g. `0.5` for drop to happen when half of the area of the draggable is\n * over the dropzone\n *\n * Use the `checker` option to specify a function to check if a dragged\n * element is over this Interactable.\n *\n | interact(target)\n | .dropChecker(function(dragEvent, // related dragmove or dragend event\n | event, // TouchEvent/PointerEvent/MouseEvent\n | dropped, // bool result of the default checker\n | dropzone, // dropzone Interactable\n | dropElement, // dropzone elemnt\n | draggable, // draggable Interactable\n | draggableElement) {// draggable element\n |\n | return dropped && event.target.hasAttribute('allow-drop');\n | }\n *\n *\n - options (boolean | object | null) #optional The new value to be set.\n | interact('.drop').dropzone({\n | accept: '.can-drop' || document.getElementById('single-drop'),\n | overlap: 'pointer' || 'center' || zeroToOne\n | }\n = (boolean | object) The current setting or this Interactable\n\\*/\nInteractable.prototype.dropzone = function (options) {\n if (utils.is.object(options)) {\n this.options.drop.enabled = options.enabled === false? false: true;\n\n if (utils.is.function(options.ondrop) ) { this.events.ondrop = options.ondrop ; }\n if (utils.is.function(options.ondropactivate) ) { this.events.ondropactivate = options.ondropactivate ; }\n if (utils.is.function(options.ondropdeactivate)) { this.events.ondropdeactivate = options.ondropdeactivate; }\n if (utils.is.function(options.ondragenter) ) { this.events.ondragenter = options.ondragenter ; }\n if (utils.is.function(options.ondragleave) ) { this.events.ondragleave = options.ondragleave ; }\n if (utils.is.function(options.ondropmove) ) { this.events.ondropmove = options.ondropmove ; }\n\n if (/^(pointer|center)$/.test(options.overlap)) {\n this.options.drop.overlap = options.overlap;\n }\n else if (utils.is.number(options.overlap)) {\n this.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0);\n }\n if ('accept' in options) {\n this.options.drop.accept = options.accept;\n }\n if ('checker' in options) {\n this.options.drop.checker = options.checker;\n }\n\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drop.enabled = options;\n\n if (!options) {\n this.ondragenter = this.ondragleave = this.ondrop\n = this.ondropactivate = this.ondropdeactivate = null;\n }\n\n return this;\n }\n\n return this.options.drop;\n};\n\nInteractable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) {\n let dropped = false;\n\n // if the dropzone has no rect (eg. display: none)\n // call the custom dropChecker or just return false\n if (!(rect = rect || this.getRect(dropElement))) {\n return (this.options.drop.checker\n ? this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement)\n : false);\n }\n\n const dropOverlap = this.options.drop.overlap;\n\n if (dropOverlap === 'pointer') {\n const origin = utils.getOriginXY(draggable, draggableElement, 'drag');\n const page = utils.getPageXY(dragEvent);\n\n page.x += origin.x;\n page.y += origin.y;\n\n const horizontal = (page.x > rect.left) && (page.x < rect.right);\n const vertical = (page.y > rect.top ) && (page.y < rect.bottom);\n\n dropped = horizontal && vertical;\n }\n\n const dragRect = draggable.getRect(draggableElement);\n\n if (dragRect && dropOverlap === 'center') {\n const cx = dragRect.left + dragRect.width / 2;\n const cy = dragRect.top + dragRect.height / 2;\n\n dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom;\n }\n\n if (dragRect && utils.is.number(dropOverlap)) {\n const overlapArea = (Math.max(0, Math.min(rect.right , dragRect.right ) - Math.max(rect.left, dragRect.left))\n * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top , dragRect.top )));\n\n const overlapRatio = overlapArea / (dragRect.width * dragRect.height);\n\n dropped = overlapRatio >= dropOverlap;\n }\n\n if (this.options.drop.checker) {\n dropped = this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement);\n }\n\n return dropped;\n};\n\nInteractable.signals.on('unset', function ({ interactable }) {\n interactable.dropzone(false);\n});\n\nInteractable.settingsMethods.push('dropChecker');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.dropTarget = null; // the dropzone a drag target might be dropped into\n interaction.dropElement = null; // the element at the time of checking\n interaction.prevDropTarget = null; // the dropzone that was recently dragged away from\n interaction.prevDropElement = null; // the element at the time of checking\n interaction.dropEvents = null; // the dropEvents related to the current drag event\n\n interaction.activeDrops = {\n dropzones: [], // the dropzones that are mentioned below\n elements : [], // elements of dropzones that accept the target draggable\n rects : [], // the rects of the elements mentioned above\n };\n\n});\n\nInteraction.signals.on('stop', function ({ interaction }) {\n interaction.dropTarget = interaction.dropElement =\n interaction.prevDropTarget = interaction.prevDropElement = null;\n});\n\n/*\\\n * interact.dynamicDrop\n [ method ]\n *\n * Returns or sets whether the dimensions of dropzone elements are\n * calculated on every dragmove or only on dragstart for the default\n * dropChecker\n *\n - newValue (boolean) #optional True to check on each move. False to check only before start\n = (boolean | interact) The current setting or interact\n\\*/\ninteract.dynamicDrop = function (newValue) {\n if (utils.is.bool(newValue)) {\n //if (dragging && dynamicDrop !== newValue && !newValue) {\n //calcRects(dropzones);\n //}\n\n dynamicDrop = newValue;\n\n return interact;\n }\n return dynamicDrop;\n};\n\nutils.merge(Interactable.eventTypes, [\n 'dragenter',\n 'dragleave',\n 'dropactivate',\n 'dropdeactivate',\n 'dropmove',\n 'drop',\n]);\nactions.methodDict.drop = 'dropzone';\n\ndefaultOptions.drop = drop.defaults;\n\nmodule.exports = drop;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst gesture = {\n defaults: {\n enabled : false,\n origin : null,\n restrict: null,\n },\n\n checker: function (pointer, event, interactable, element, interaction) {\n if (interaction.pointerIds.length >= 2) {\n return { name: 'gesture' };\n }\n\n return null;\n },\n\n getCursor: function () {\n return '';\n },\n};\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturestart') { return; }\n iEvent.ds = 0;\n\n interaction.gesture.startDistance = interaction.gesture.prevDistance = iEvent.distance;\n interaction.gesture.startAngle = interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.scale = 1;\n});\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturemove') { return; }\n\n iEvent.ds = iEvent.scale - interaction.gesture.scale;\n\n interaction.target.fire(iEvent);\n\n interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.prevDistance = iEvent.distance;\n\n if (iEvent.scale !== Infinity\n && iEvent.scale !== null\n && iEvent.scale !== undefined\n && !isNaN(iEvent.scale)) {\n\n interaction.gesture.scale = iEvent.scale;\n }\n});\n\n/*\\\n * Interactable.gesturable\n [ method ]\n *\n * Gets or sets whether multitouch gestures can be performed on the\n * Interactable's element\n *\n = (boolean) Indicates if this can be the target of gesture events\n | var isGestureable = interact(element).gesturable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on gesture events (makes the Interactable gesturable)\n = (object) this Interactable\n | interact(element).gesturable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // limit multiple gestures.\n | // See the explanation in @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n\\*/\nInteractable.prototype.gesturable = function (options) {\n if (utils.is.object(options)) {\n this.options.gesture.enabled = options.enabled === false? false: true;\n this.setPerAction('gesture', options);\n this.setOnEvents('gesture', options);\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.gesture.enabled = options;\n\n if (!options) {\n this.ongesturestart = this.ongesturestart = this.ongestureend = null;\n }\n\n return this;\n }\n\n return this.options.gesture;\n};\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action, event, starting, ending, deltaSource }) {\n if (action !== 'gesture') { return; }\n\n const pointers = interaction.pointers;\n\n iEvent.touches = [pointers[0], pointers[1]];\n\n if (starting) {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = 1;\n iEvent.ds = 0;\n iEvent.angle = utils.touchAngle(pointers, undefined, deltaSource);\n iEvent.da = 0;\n }\n else if (ending || event instanceof InteractEvent) {\n iEvent.distance = interaction.prevEvent.distance;\n iEvent.box = interaction.prevEvent.box;\n iEvent.scale = interaction.prevEvent.scale;\n iEvent.ds = iEvent.scale - 1;\n iEvent.angle = interaction.prevEvent.angle;\n iEvent.da = iEvent.angle - interaction.gesture.startAngle;\n }\n else {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = iEvent.distance / interaction.gesture.startDistance;\n iEvent.angle = utils.touchAngle(pointers, interaction.gesture.prevAngle, deltaSource);\n\n iEvent.ds = iEvent.scale - interaction.gesture.prevScale;\n iEvent.da = iEvent.angle - interaction.gesture.prevAngle;\n }\n});\n\nInteraction.signals.on('new', function (interaction) {\n interaction.gesture = {\n start: { x: 0, y: 0 },\n\n startDistance: 0, // distance between two touches of touchStart\n prevDistance : 0,\n distance : 0,\n\n scale: 1, // gesture.distance / gesture.startDistance\n\n startAngle: 0, // angle of line joining two touches\n prevAngle : 0, // angle of the previous gesture event\n };\n});\n\nactions.gesture = gesture;\nactions.names.push('gesture');\nutils.merge(Interactable.eventTypes, [\n 'gesturestart',\n 'gesturemove',\n 'gestureend',\n]);\nactions.methodDict.gesture = 'gesturable';\n\ndefaultOptions.gesture = gesture.defaults;\n\nmodule.exports = gesture;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\n// Less Precision with touch input\nconst defaultMargin = browser.supportsTouch || browser.supportsPointerEvent? 20: 10;\n\nconst resize = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n square: false,\n preserveAspectRatio: false,\n axis: 'xy',\n\n // use default margin\n margin: NaN,\n\n // object with props left, right, top, bottom which are\n // true/false values to resize when the pointer is over that edge,\n // CSS selectors to match the handles for each direction\n // or the Elements for each handle\n edges: null,\n\n // a value of 'none' will limit the resize rect to a minimum of 0x0\n // 'negate' will alow the rect to have negative width/height\n // 'reposition' will keep the width/height positive by swapping\n // the top and bottom edges and/or swapping the left and right edges\n invert: 'none',\n },\n\n checker: function (pointer, event, interactable, element, interaction, rect) {\n if (!rect) { return null; }\n\n const page = utils.extend({}, interaction.curCoords.page);\n const options = interactable.options;\n\n if (options.resize.enabled) {\n const resizeOptions = options.resize;\n const resizeEdges = { left: false, right: false, top: false, bottom: false };\n\n // if using resize.edges\n if (utils.is.object(resizeOptions.edges)) {\n for (const edge in resizeEdges) {\n resizeEdges[edge] = checkResizeEdge(edge,\n resizeOptions.edges[edge],\n page,\n interaction._eventTarget,\n element,\n rect,\n resizeOptions.margin || defaultMargin);\n }\n\n resizeEdges.left = resizeEdges.left && !resizeEdges.right;\n resizeEdges.top = resizeEdges.top && !resizeEdges.bottom;\n\n if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) {\n return {\n name: 'resize',\n edges: resizeEdges,\n };\n }\n }\n else {\n const right = options.resize.axis !== 'y' && page.x > (rect.right - defaultMargin);\n const bottom = options.resize.axis !== 'x' && page.y > (rect.bottom - defaultMargin);\n\n if (right || bottom) {\n return {\n name: 'resize',\n axes: (right? 'x' : '') + (bottom? 'y' : ''),\n };\n }\n }\n }\n\n return null;\n },\n\n cursors: (browser.isIe9OrOlder ? {\n x : 'e-resize',\n y : 's-resize',\n xy: 'se-resize',\n\n top : 'n-resize',\n left : 'w-resize',\n bottom : 's-resize',\n right : 'e-resize',\n topleft : 'se-resize',\n bottomright: 'se-resize',\n topright : 'ne-resize',\n bottomleft : 'ne-resize',\n } : {\n x : 'ew-resize',\n y : 'ns-resize',\n xy: 'nwse-resize',\n\n top : 'ns-resize',\n left : 'ew-resize',\n bottom : 'ns-resize',\n right : 'ew-resize',\n topleft : 'nwse-resize',\n bottomright: 'nwse-resize',\n topright : 'nesw-resize',\n bottomleft : 'nesw-resize',\n }),\n\n getCursor: function (action) {\n if (action.axis) {\n return resize.cursors[action.name + action.axis];\n }\n else if (action.edges) {\n let cursorKey = '';\n const edgeNames = ['top', 'bottom', 'left', 'right'];\n\n for (let i = 0; i < 4; i++) {\n if (action.edges[edgeNames[i]]) {\n cursorKey += edgeNames[i];\n }\n }\n\n return resize.cursors[cursorKey];\n }\n },\n};\n\n// resizestart\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'resizestart' || !interaction.prepared.edges) {\n return;\n }\n\n const startRect = interaction.target.getRect(interaction.element);\n const resizeOptions = interaction.target.options.resize;\n\n /*\n * When using the `resizable.square` or `resizable.preserveAspectRatio` options, resizing from one edge\n * will affect another. E.g. with `resizable.square`, resizing to make the right edge larger will make\n * the bottom edge larger by the same amount. We call these 'linked' edges. Any linked edges will depend\n * on the active edges and the edge being interacted with.\n */\n if (resizeOptions.square || resizeOptions.preserveAspectRatio) {\n const linkedEdges = utils.extend({}, interaction.prepared.edges);\n\n linkedEdges.top = linkedEdges.top || (linkedEdges.left && !linkedEdges.bottom);\n linkedEdges.left = linkedEdges.left || (linkedEdges.top && !linkedEdges.right );\n linkedEdges.bottom = linkedEdges.bottom || (linkedEdges.right && !linkedEdges.top );\n linkedEdges.right = linkedEdges.right || (linkedEdges.bottom && !linkedEdges.left );\n\n interaction.prepared._linkedEdges = linkedEdges;\n }\n else {\n interaction.prepared._linkedEdges = null;\n }\n\n // if using `resizable.preserveAspectRatio` option, record aspect ratio at the start of the resize\n if (resizeOptions.preserveAspectRatio) {\n interaction.resizeStartAspectRatio = startRect.width / startRect.height;\n }\n\n interaction.resizeRects = {\n start : startRect,\n current : utils.extend({}, startRect),\n inverted : utils.extend({}, startRect),\n previous : utils.extend({}, startRect),\n delta : {\n left: 0, right : 0, width : 0,\n top : 0, bottom: 0, height: 0,\n },\n };\n\n iEvent.rect = interaction.resizeRects.inverted;\n iEvent.deltaRect = interaction.resizeRects.delta;\n});\n\n// resizemove\nInteractEvent.signals.on('new', function ({ iEvent, phase, interaction }) {\n if (phase !== 'move' || !interaction.prepared.edges) { return; }\n\n const resizeOptions = interaction.target.options.resize;\n const invert = resizeOptions.invert;\n const invertible = invert === 'reposition' || invert === 'negate';\n\n let edges = interaction.prepared.edges;\n\n const start = interaction.resizeRects.start;\n const current = interaction.resizeRects.current;\n const inverted = interaction.resizeRects.inverted;\n const delta = interaction.resizeRects.delta;\n const previous = utils.extend(interaction.resizeRects.previous, inverted);\n const originalEdges = edges;\n\n let dx = iEvent.dx;\n let dy = iEvent.dy;\n\n if (resizeOptions.preserveAspectRatio || resizeOptions.square) {\n // `resize.preserveAspectRatio` takes precedence over `resize.square`\n const startAspectRatio = resizeOptions.preserveAspectRatio\n ? interaction.resizeStartAspectRatio\n : 1;\n\n edges = interaction.prepared._linkedEdges;\n\n if ((originalEdges.left && originalEdges.bottom)\n || (originalEdges.right && originalEdges.top)) {\n dy = -dx / startAspectRatio;\n }\n else if (originalEdges.left || originalEdges.right ) { dy = dx / startAspectRatio; }\n else if (originalEdges.top || originalEdges.bottom) { dx = dy * startAspectRatio; }\n }\n\n // update the 'current' rect without modifications\n if (edges.top ) { current.top += dy; }\n if (edges.bottom) { current.bottom += dy; }\n if (edges.left ) { current.left += dx; }\n if (edges.right ) { current.right += dx; }\n\n if (invertible) {\n // if invertible, copy the current rect\n utils.extend(inverted, current);\n\n if (invert === 'reposition') {\n // swap edge values if necessary to keep width/height positive\n let swap;\n\n if (inverted.top > inverted.bottom) {\n swap = inverted.top;\n\n inverted.top = inverted.bottom;\n inverted.bottom = swap;\n }\n if (inverted.left > inverted.right) {\n swap = inverted.left;\n\n inverted.left = inverted.right;\n inverted.right = swap;\n }\n }\n }\n else {\n // if not invertible, restrict to minimum of 0x0 rect\n inverted.top = Math.min(current.top, start.bottom);\n inverted.bottom = Math.max(current.bottom, start.top);\n inverted.left = Math.min(current.left, start.right);\n inverted.right = Math.max(current.right, start.left);\n }\n\n inverted.width = inverted.right - inverted.left;\n inverted.height = inverted.bottom - inverted.top ;\n\n for (const edge in inverted) {\n delta[edge] = inverted[edge] - previous[edge];\n }\n\n iEvent.edges = interaction.prepared.edges;\n iEvent.rect = inverted;\n iEvent.deltaRect = delta;\n});\n\n/*\\\n * Interactable.resizable\n [ method ]\n *\n * Gets or sets whether resize actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of resize elements\n | var isResizeable = interact('input[type=text]').resizable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on resize events (object makes the Interactable resizable)\n = (object) This Interactable\n | interact(element).resizable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | edges: {\n | top : true, // Use pointer coords to check for resize.\n | left : false, // Disable resizing from left edge.\n | bottom: '.resize-s',// Resize if pointer target matches selector\n | right : handleEl // Resize if pointer target is the given Element\n | },\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height are adjusted at a 1:1 ratio.\n | square: false,\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height maintain the aspect ratio they had when resizing started.\n | preserveAspectRatio: false,\n |\n | // a value of 'none' will limit the resize rect to a minimum of 0x0\n | // 'negate' will allow the rect to have negative width/height\n | // 'reposition' will keep the width/height positive by swapping\n | // the top and bottom edges and/or swapping the left and right edges\n | invert: 'none' || 'negate' || 'reposition'\n |\n | // limit multiple resizes.\n | // See the explanation in the @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n \\*/\nInteractable.prototype.resizable = function (options) {\n if (utils.is.object(options)) {\n this.options.resize.enabled = options.enabled === false? false: true;\n this.setPerAction('resize', options);\n this.setOnEvents('resize', options);\n\n if (/^x$|^y$|^xy$/.test(options.axis)) {\n this.options.resize.axis = options.axis;\n }\n else if (options.axis === null) {\n this.options.resize.axis = defaultOptions.resize.axis;\n }\n\n if (utils.is.bool(options.preserveAspectRatio)) {\n this.options.resize.preserveAspectRatio = options.preserveAspectRatio;\n }\n else if (utils.is.bool(options.square)) {\n this.options.resize.square = options.square;\n }\n\n return this;\n }\n if (utils.is.bool(options)) {\n this.options.resize.enabled = options;\n\n if (!options) {\n this.onresizestart = this.onresizestart = this.onresizeend = null;\n }\n\n return this;\n }\n return this.options.resize;\n};\n\nfunction checkResizeEdge (name, value, page, element, interactableElement, rect, margin) {\n // false, '', undefined, null\n if (!value) { return false; }\n\n // true value, use pointer coords and element rect\n if (value === true) {\n // if dimensions are negative, \"switch\" edges\n const width = utils.is.number(rect.width )? rect.width : rect.right - rect.left;\n const height = utils.is.number(rect.height)? rect.height : rect.bottom - rect.top ;\n\n if (width < 0) {\n if (name === 'left' ) { name = 'right'; }\n else if (name === 'right') { name = 'left' ; }\n }\n if (height < 0) {\n if (name === 'top' ) { name = 'bottom'; }\n else if (name === 'bottom') { name = 'top' ; }\n }\n\n if (name === 'left' ) { return page.x < ((width >= 0? rect.left: rect.right ) + margin); }\n if (name === 'top' ) { return page.y < ((height >= 0? rect.top : rect.bottom) + margin); }\n\n if (name === 'right' ) { return page.x > ((width >= 0? rect.right : rect.left) - margin); }\n if (name === 'bottom') { return page.y > ((height >= 0? rect.bottom: rect.top ) - margin); }\n }\n\n // the remaining checks require an element\n if (!utils.is.element(element)) { return false; }\n\n return utils.is.element(value)\n // the value is an element to use as a resize handle\n ? value === element\n // otherwise check if element matches value as selector\n : utils.matchesUpTo(element, value, interactableElement);\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.resizeAxes = 'xy';\n});\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action }) {\n if (action !== 'resize' || !interaction.resizeAxes) { return; }\n\n const options = interaction.target.options;\n\n if (options.resize.square) {\n if (interaction.resizeAxes === 'y') {\n iEvent.dx = iEvent.dy;\n }\n else {\n iEvent.dy = iEvent.dx;\n }\n iEvent.axes = 'xy';\n }\n else {\n iEvent.axes = interaction.resizeAxes;\n\n if (interaction.resizeAxes === 'x') {\n iEvent.dy = 0;\n }\n else if (interaction.resizeAxes === 'y') {\n iEvent.dx = 0;\n }\n }\n});\n\nactions.resize = resize;\nactions.names.push('resize');\nutils.merge(Interactable.eventTypes, [\n 'resizestart',\n 'resizemove',\n 'resizeinertiastart',\n 'resizeinertiaresume',\n 'resizeend',\n]);\nactions.methodDict.resize = 'resizable';\n\ndefaultOptions.resize = resize.defaults;\n\nmodule.exports = resize;\n","const raf = require('./utils/raf');\nconst getWindow = require('./utils/window').getWindow;\nconst is = require('./utils/is');\nconst domUtils = require('./utils/domUtils');\nconst Interaction = require('./Interaction');\nconst defaultOptions = require('./defaultOptions');\n\nconst autoScroll = {\n defaults: {\n enabled : false,\n container: null, // the item that is scrolled (Window or HTMLElement)\n margin : 60,\n speed : 300, // the scroll speed in pixels per second\n },\n\n interaction: null,\n i: null, // the handle returned by window.setInterval\n x: 0, y: 0, // Direction each pulse is to scroll in\n\n isScrolling: false,\n prevTime: 0,\n\n start: function (interaction) {\n autoScroll.isScrolling = true;\n raf.cancel(autoScroll.i);\n\n autoScroll.interaction = interaction;\n autoScroll.prevTime = new Date().getTime();\n autoScroll.i = raf.request(autoScroll.scroll);\n },\n\n stop: function () {\n autoScroll.isScrolling = false;\n raf.cancel(autoScroll.i);\n },\n\n // scroll the window by the values in scroll.x/y\n scroll: function () {\n const options = autoScroll.interaction.target.options[autoScroll.interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(autoScroll.interaction.element);\n const now = new Date().getTime();\n // change in time in seconds\n const dt = (now - autoScroll.prevTime) / 1000;\n // displacement\n const s = options.speed * dt;\n\n if (s >= 1) {\n if (is.window(container)) {\n container.scrollBy(autoScroll.x * s, autoScroll.y * s);\n }\n else if (container) {\n container.scrollLeft += autoScroll.x * s;\n container.scrollTop += autoScroll.y * s;\n }\n\n autoScroll.prevTime = now;\n }\n\n if (autoScroll.isScrolling) {\n raf.cancel(autoScroll.i);\n autoScroll.i = raf.request(autoScroll.scroll);\n }\n },\n check: function (interactable, actionName) {\n const options = interactable.options;\n\n return options[actionName].autoScroll && options[actionName].autoScroll.enabled;\n },\n onInteractionMove: function ({ interaction, pointer }) {\n if (!(interaction.interacting()\n && autoScroll.check(interaction.target, interaction.prepared.name))) {\n return;\n }\n\n if (interaction.simulation) {\n autoScroll.x = autoScroll.y = 0;\n return;\n }\n\n let top;\n let right;\n let bottom;\n let left;\n\n const options = interaction.target.options[interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(interaction.element);\n\n if (is.window(container)) {\n left = pointer.clientX < autoScroll.margin;\n top = pointer.clientY < autoScroll.margin;\n right = pointer.clientX > container.innerWidth - autoScroll.margin;\n bottom = pointer.clientY > container.innerHeight - autoScroll.margin;\n }\n else {\n const rect = domUtils.getElementClientRect(container);\n\n left = pointer.clientX < rect.left + autoScroll.margin;\n top = pointer.clientY < rect.top + autoScroll.margin;\n right = pointer.clientX > rect.right - autoScroll.margin;\n bottom = pointer.clientY > rect.bottom - autoScroll.margin;\n }\n\n autoScroll.x = (right ? 1: left? -1: 0);\n autoScroll.y = (bottom? 1: top? -1: 0);\n\n if (!autoScroll.isScrolling) {\n // set the autoScroll properties to those of the target\n autoScroll.margin = options.margin;\n autoScroll.speed = options.speed;\n\n autoScroll.start(interaction);\n }\n },\n};\n\nInteraction.signals.on('stop-active', function () {\n autoScroll.stop();\n});\n\nInteraction.signals.on('action-move', autoScroll.onInteractionMove);\n\ndefaultOptions.perAction.autoScroll = autoScroll.defaults;\n\nmodule.exports = autoScroll;\n","const Interactable = require('../Interactable');\nconst actions = require('../actions/base');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.ignoreFrom\n [ method ]\n *\n * If the target of the `mousedown`, `pointerdown` or `touchstart`\n * event or any of it's parents match the given CSS selector or\n * Element, no drag/resize/gesture is started.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to not ignore any elements\n = (string | Element | object) The current ignoreFrom value or this Interactable\n **\n | interact(element, { ignoreFrom: document.getElementById('no-action') });\n | // or\n | interact(element).ignoreFrom('input, textarea, a');\n\\*/\nInteractable.prototype.ignoreFrom = function (newValue) {\n return this._backCompatOption('ignoreFrom', newValue);\n};\n\n/*\\\n * Interactable.allowFrom\n [ method ]\n *\n * A drag/resize/gesture is started only If the target of the\n * `mousedown`, `pointerdown` or `touchstart` event or any of it's\n * parents match the given CSS selector or Element.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to allow from any element\n = (string | Element | object) The current allowFrom value or this Interactable\n **\n | interact(element, { allowFrom: document.getElementById('drag-handle') });\n | // or\n | interact(element).allowFrom('.handle');\n\\*/\nInteractable.prototype.allowFrom = function (newValue) {\n return this._backCompatOption('allowFrom', newValue);\n};\n\nInteractable.prototype.testIgnore = function (ignoreFrom, interactableElement, element) {\n if (!ignoreFrom || !is.element(element)) { return false; }\n\n if (is.string(ignoreFrom)) {\n return domUtils.matchesUpTo(element, ignoreFrom, interactableElement);\n }\n else if (is.element(ignoreFrom)) {\n return domUtils.nodeContains(ignoreFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testAllow = function (allowFrom, interactableElement, element) {\n if (!allowFrom) { return true; }\n\n if (!is.element(element)) { return false; }\n\n if (is.string(allowFrom)) {\n return domUtils.matchesUpTo(element, allowFrom, interactableElement);\n }\n else if (is.element(allowFrom)) {\n return domUtils.nodeContains(allowFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testIgnoreAllow = function (options, interactableElement, eventTarget) {\n return (!this.testIgnore(options.ignoreFrom, interactableElement, eventTarget)\n && this.testAllow(options.allowFrom, interactableElement, eventTarget));\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (event.buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\n","const interact = require('../interact');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst actions = require('../actions/base');\nconst defaultOptions = require('../defaultOptions');\nconst browser = require('../utils/browser');\nconst scope = require('../scope');\nconst utils = require('../utils');\nconst signals = require('../utils/Signals').new();\n\nrequire('./InteractableMethods');\n\nconst autoStart = {\n signals,\n withinInteractionLimit,\n // Allow this many interactions to happen simultaneously\n maxInteractions: Infinity,\n defaults: {\n perAction: {\n manualStart: false,\n max: Infinity,\n maxPerElement: 1,\n allowFrom: null,\n ignoreFrom: null,\n },\n },\n setActionDefaults: function (action) {\n utils.extend(action.defaults, autoStart.defaults.perAction);\n },\n};\n\n// set cursor style on mousedown\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget }) {\n if (interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\n// set cursor style on mousemove\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget }) {\n if (!interaction.mouse\n || interaction.pointerIsDown\n || interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\nInteraction.signals.on('move', function (arg) {\n const { interaction, event } = arg;\n\n if (!interaction.pointerIsDown\n || interaction.interacting()\n || !interaction.pointerWasMoved\n || !interaction.prepared.name) {\n return;\n }\n\n signals.fire('before-start', arg);\n\n const target = interaction.target;\n\n if (interaction.prepared.name && target) {\n // check manualStart and interaction limit\n if (target.options[interaction.prepared.name].manualStart\n || !withinInteractionLimit(target, interaction.element, interaction.prepared)) {\n interaction.stop(event);\n }\n else {\n interaction.start(interaction.prepared, target, interaction.element);\n }\n }\n});\n\n// Check if the current target supports the action.\n// If so, return the validated action. Otherwise, return null\nfunction validateAction (action, interactable, element, eventTarget) {\n if (utils.is.object(action)\n && interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget)\n && interactable.options[action.name].enabled\n && withinInteractionLimit(interactable, element, action)) {\n return action;\n }\n\n return null;\n}\n\nfunction validateSelector (interaction, pointer, event, matches, matchElements, eventTarget) {\n for (let i = 0, len = matches.length; i < len; i++) {\n const match = matches[i];\n const matchElement = matchElements[i];\n const action = validateAction(match.getAction(pointer, event, interaction, matchElement),\n match,\n matchElement,\n eventTarget);\n\n if (action) {\n return {\n action,\n target: match,\n element: matchElement,\n };\n }\n }\n\n return {};\n}\n\nfunction getActionInfo (interaction, pointer, event, eventTarget) {\n let matches = [];\n let matchElements = [];\n\n let element = eventTarget;\n let action = null;\n\n function pushMatches (interactable, selector, context) {\n const elements = (browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined);\n\n if (utils.matchesSelector(element, selector, elements)) {\n\n matches.push(interactable);\n matchElements.push(element);\n }\n }\n\n while (utils.is.element(element)) {\n matches = [];\n matchElements = [];\n\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && (action = validateAction(elementInteractable.getAction(pointer, event, interaction, element, eventTarget),\n elementInteractable,\n element,\n eventTarget))\n && !elementInteractable.options[action.name].manualStart) {\n return {\n element,\n action,\n target: elementInteractable,\n };\n }\n else {\n scope.interactables.forEachSelector(pushMatches, element);\n\n const actionInfo = validateSelector(interaction, pointer, event, matches, matchElements, eventTarget);\n\n if (actionInfo.action\n && !actionInfo.target.options[actionInfo.action.name].manualStart) {\n return actionInfo;\n }\n }\n\n element = utils.parentNode(element);\n }\n\n return {};\n}\n\nfunction prepare (interaction, { action, target, element }) {\n action = action || {};\n\n if (interaction.target && interaction.target.options.styleCursor) {\n interaction.target._doc.documentElement.style.cursor = '';\n }\n\n interaction.target = target;\n interaction.element = element;\n utils.copyAction(interaction.prepared, action);\n\n if (target && target.options.styleCursor) {\n const cursor = action? actions[action.name].getCursor(action) : '';\n interaction.target._doc.documentElement.style.cursor = cursor;\n }\n\n signals.fire('prepared', { interaction: interaction });\n}\n\nInteraction.signals.on('stop', function ({ interaction }) {\n const target = interaction.target;\n\n if (target && target.options.styleCursor) {\n target._doc.documentElement.style.cursor = '';\n }\n});\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (utils.is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (utils.is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n const buttons = event.buttons || ({\n 0: 1,\n 1: 4,\n 3: 8,\n 4: 16,\n })[event.button];\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\nfunction withinInteractionLimit (interactable, element, action) {\n const options = interactable.options;\n const maxActions = options[action.name].max;\n const maxPerElement = options[action.name].maxPerElement;\n let activeInteractions = 0;\n let targetCount = 0;\n let targetElementCount = 0;\n\n // no actions if any of these values == 0\n if (!(maxActions && maxPerElement && autoStart.maxInteractions)) { return; }\n\n for (let i = 0, len = scope.interactions.length; i < len; i++) {\n const interaction = scope.interactions[i];\n const otherAction = interaction.prepared.name;\n\n if (!interaction.interacting()) { continue; }\n\n activeInteractions++;\n\n if (activeInteractions >= autoStart.maxInteractions) {\n return false;\n }\n\n if (interaction.target !== interactable) { continue; }\n\n targetCount += (otherAction === action.name)|0;\n\n if (targetCount >= maxActions) {\n return false;\n }\n\n if (interaction.element === element) {\n targetElementCount++;\n\n if (otherAction !== action.name || targetElementCount >= maxPerElement) {\n return false;\n }\n }\n }\n\n return autoStart.maxInteractions > 0;\n}\n\n/*\\\n * interact.maxInteractions\n [ method ]\n **\n * Returns or sets the maximum number of concurrent interactions allowed.\n * By default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables\n * and elements, you need to enable it in the draggable, resizable and\n * gesturable `'max'` and `'maxPerElement'` options.\n **\n - newValue (number) #optional Any number. newValue <= 0 means no interactions.\n\\*/\ninteract.maxInteractions = function (newValue) {\n if (utils.is.number(newValue)) {\n autoStart.maxInteractions = newValue;\n\n return this;\n }\n\n return autoStart.maxInteractions;\n};\n\nInteractable.settingsMethods.push('styleCursor');\nInteractable.settingsMethods.push('actionChecker');\nInteractable.settingsMethods.push('ignoreFrom');\nInteractable.settingsMethods.push('allowFrom');\n\ndefaultOptions.base.actionChecker = null;\ndefaultOptions.base.styleCursor = true;\n\nutils.extend(defaultOptions.perAction, autoStart.defaults.perAction);\n\nmodule.exports = autoStart;\n","const autoStart = require('./base');\nconst Interaction = require('../Interaction');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.delayTimer = null;\n});\n\nautoStart.signals.on('prepared', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.delayTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.target, interaction.element);\n }, delay);\n }\n});\n\nInteraction.signals.on('move', function ({ interaction, duplicate }) {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.delayTimer);\n }\n});\n\n// prevent regular down->move autoStart\nautoStart.signals.on('before-start', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.prepared.name = null;\n }\n});\n","const autoStart = require('./base');\nconst scope = require('../scope');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\n\nconst { matchesSelector, parentNode } = require('../utils/domUtils');\n\nautoStart.setActionDefaults(require('../actions/drag'));\n\nautoStart.signals.on('before-start', function ({ interaction, eventTarget, dx, dy }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // check if a drag is in the correct axis\n const absX = Math.abs(dx);\n const absY = Math.abs(dy);\n const options = interaction.target.options.drag;\n const startAxis = options.startAxis;\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy');\n\n interaction.prepared.axis = options.lockAxis === 'start'\n ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n : options.lockAxis;\n\n // if the movement isn't in the startAxis of the interactable\n if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) {\n // cancel the prepared action\n interaction.prepared.name = null;\n\n // then try to get a drag from another ineractable\n\n if (!interaction.prepared.name) {\n\n let element = eventTarget;\n\n const getDraggable = function (interactable, selector, context) {\n const elements = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n if (interactable === interaction.target) { return; }\n\n if (!options.manualStart\n && !interactable.testIgnoreAllow(options, element, eventTarget)\n && matchesSelector(element, selector, elements)) {\n\n const action = interactable.getAction(interaction.downPointer,\n interaction.downEvent,\n interaction,\n element);\n\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, interactable)\n && autoStart.validateAction(action, interactable, element, eventTarget)) {\n\n return interactable;\n }\n }\n };\n\n let action = null;\n\n // check all interactables\n while (is.element(element)) {\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && elementInteractable !== interaction.target\n && !elementInteractable.options.drag.manualStart) {\n\n action = elementInteractable.getAction(interaction.downPointer, interaction.downEvent, interaction, element);\n }\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, elementInteractable)) {\n\n interaction.prepared.name = 'drag';\n interaction.target = elementInteractable;\n interaction.element = element;\n break;\n }\n\n const selectorInteractable = scope.interactables.forEachSelector(getDraggable, element);\n\n if (selectorInteractable) {\n interaction.prepared.name = 'drag';\n interaction.target = selectorInteractable;\n interaction.element = element;\n break;\n }\n\n element = parentNode(element);\n }\n }\n }\n});\n\nfunction checkStartAxis (startAxis, interactable) {\n if (!interactable) { return false; }\n\n const thisAxis = interactable.options.drag.startAxis;\n\n return (startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis);\n}\n","require('./base').setActionDefaults(require('../actions/gesture'));\n","require('./base').setActionDefaults(require('../actions/resize'));\n","module.exports = {\n base: {\n accept : null,\n preventDefault: 'auto',\n deltaSource : 'page',\n },\n\n perAction: {\n origin: { x: 0, y: 0 },\n\n // only allow left button by default\n // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n mouseButtons: 1,\n\n inertia: {\n enabled : false,\n resistance : 10, // the lambda in exponential decay\n minSpeed : 100, // target speed must be above this for inertia to start\n endSpeed : 10, // the speed at which inertia is slow enough to stop\n allowResume : true, // allow resuming an action in inertia phase\n smoothEndDuration: 300, // animate to snap/restrict endOnly if there's no inertia\n },\n },\n};\n","/* browser entry point */\n\n// Legacy browser support\nrequire('./legacyBrowsers');\n\n// inertia\nrequire('./inertia');\n\n// modifiers\nrequire('./modifiers/snap');\nrequire('./modifiers/restrict');\n\n// pointerEvents\nrequire('./pointerEvents/base');\nrequire('./pointerEvents/holdRepeat');\nrequire('./pointerEvents/interactableTargets');\n\n// delay\nrequire('./autoStart/delay');\n\n// actions\nrequire('./actions/gesture');\nrequire('./actions/resize');\nrequire('./actions/drag');\nrequire('./actions/drop');\n\n// load these modifiers after resize is loaded\nrequire('./modifiers/snapSize');\nrequire('./modifiers/restrictEdges');\nrequire('./modifiers/restrictSize');\n\n// autoStart actions\nrequire('./autoStart/gesture');\nrequire('./autoStart/resize');\nrequire('./autoStart/drag');\n\n// Interactable preventDefault setting\nrequire('./interactablePreventDefault.js');\n\n// autoScroll\nrequire('./autoScroll');\n\n// export interact\nmodule.exports = require('./interact');\n","const InteractEvent = require('./InteractEvent');\nconst Interaction = require('./Interaction');\nconst modifiers = require('./modifiers');\nconst utils = require('./utils');\nconst animationFrame = require('./utils/raf');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.inertiaStatus = {\n active : false,\n smoothEnd : false,\n allowResume: false,\n\n startEvent: null,\n upCoords : {},\n\n xe: 0, ye: 0,\n sx: 0, sy: 0,\n\n t0: 0,\n vx0: 0, vys: 0,\n duration: 0,\n\n lambda_v0: 0,\n one_ve_v0: 0,\n i : null,\n };\n\n interaction.boundInertiaFrame = () => inertiaFrame .apply(interaction);\n interaction.boundSmoothEndFrame = () => smoothEndFrame.apply(interaction);\n});\n\nInteraction.signals.on('down', function ({ interaction, event, pointer, eventTarget }) {\n const status = interaction.inertiaStatus;\n\n // Check if the down event hits the current inertia target\n if (status.active) {\n let element = eventTarget;\n\n // climb up the DOM tree from the event target\n while (utils.is.element(element)) {\n\n // if interaction element is the current inertia target element\n if (element === interaction.element) {\n // stop inertia\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n\n // update pointers to the down event's coordinates\n interaction.updatePointer(pointer);\n utils.setCoords(interaction.curCoords, interaction.pointers);\n\n // fire appropriate signals\n const signalArg = { interaction };\n Interaction.signals.fire('before-action-move', signalArg);\n Interaction.signals.fire('action-resume' , signalArg);\n\n // fire a reume event\n const resumeEvent = new InteractEvent(interaction,\n event,\n interaction.prepared.name,\n 'inertiaresume',\n interaction.element);\n\n interaction.target.fire(resumeEvent);\n interaction.prevEvent = resumeEvent;\n modifiers.resetStatuses(interaction.modifierStatuses);\n\n utils.copyCoords(interaction.prevCoords, interaction.curCoords);\n break;\n }\n\n element = utils.parentNode(element);\n }\n }\n});\n\nInteraction.signals.on('up', function ({ interaction, event }) {\n const status = interaction.inertiaStatus;\n\n if (!interaction.interacting() || status.active) { return; }\n\n const target = interaction.target;\n const options = target && target.options;\n const inertiaOptions = options && interaction.prepared.name && options[interaction.prepared.name].inertia;\n\n const now = new Date().getTime();\n const statuses = {};\n const page = utils.extend({}, interaction.curCoords.page);\n const pointerSpeed = interaction.pointerDelta.client.speed;\n\n let smoothEnd = false;\n let modifierResult;\n\n // check if inertia should be started\n const inertiaPossible = (inertiaOptions && inertiaOptions.enabled\n && interaction.prepared.name !== 'gesture'\n && event !== status.startEvent);\n\n const inertia = (inertiaPossible\n && (now - interaction.curCoords.timeStamp) < 50\n && pointerSpeed > inertiaOptions.minSpeed\n && pointerSpeed > inertiaOptions.endSpeed);\n\n const modifierArg = {\n interaction,\n pageCoords: page,\n statuses,\n preEnd: true,\n requireEndOnly: true,\n };\n\n // smoothEnd\n if (inertiaPossible && !inertia) {\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n if (modifierResult.shouldMove && modifierResult.locked) {\n smoothEnd = true;\n }\n }\n\n if (!(inertia || smoothEnd)) { return; }\n\n utils.copyCoords(status.upCoords, interaction.curCoords);\n\n interaction.pointers[0] = status.startEvent =\n new InteractEvent(interaction, event, interaction.prepared.name, 'inertiastart', interaction.element);\n\n status.t0 = now;\n\n status.active = true;\n status.allowResume = inertiaOptions.allowResume;\n interaction.simulation = status;\n\n target.fire(status.startEvent);\n\n if (inertia) {\n status.vx0 = interaction.pointerDelta.client.vx;\n status.vy0 = interaction.pointerDelta.client.vy;\n status.v0 = pointerSpeed;\n\n calcInertia(interaction, status);\n\n utils.extend(page, interaction.curCoords.page);\n\n page.x += status.xe;\n page.y += status.ye;\n\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n status.modifiedXe += modifierResult.dx;\n status.modifiedYe += modifierResult.dy;\n\n status.i = animationFrame.request(interaction.boundInertiaFrame);\n }\n else {\n status.smoothEnd = true;\n status.xe = modifierResult.dx;\n status.ye = modifierResult.dy;\n\n status.sx = status.sy = 0;\n\n status.i = animationFrame.request(interaction.boundSmoothEndFrame);\n }\n});\n\nInteraction.signals.on('stop-active', function ({ interaction }) {\n const status = interaction.inertiaStatus;\n\n if (status.active) {\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n }\n});\n\nfunction calcInertia (interaction, status) {\n const inertiaOptions = interaction.target.options[interaction.prepared.name].inertia;\n const lambda = inertiaOptions.resistance;\n const inertiaDur = -Math.log(inertiaOptions.endSpeed / status.v0) / lambda;\n\n status.x0 = interaction.prevEvent.pageX;\n status.y0 = interaction.prevEvent.pageY;\n status.t0 = status.startEvent.timeStamp / 1000;\n status.sx = status.sy = 0;\n\n status.modifiedXe = status.xe = (status.vx0 - inertiaDur) / lambda;\n status.modifiedYe = status.ye = (status.vy0 - inertiaDur) / lambda;\n status.te = inertiaDur;\n\n status.lambda_v0 = lambda / status.v0;\n status.one_ve_v0 = 1 - inertiaOptions.endSpeed / status.v0;\n}\n\nfunction inertiaFrame () {\n updateInertiaCoords(this);\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n\n const status = this.inertiaStatus;\n const options = this.target.options[this.prepared.name].inertia;\n const lambda = options.resistance;\n const t = new Date().getTime() / 1000 - status.t0;\n\n if (t < status.te) {\n\n const progress = 1 - (Math.exp(-lambda * t) - status.lambda_v0) / status.one_ve_v0;\n\n if (status.modifiedXe === status.xe && status.modifiedYe === status.ye) {\n status.sx = status.xe * progress;\n status.sy = status.ye * progress;\n }\n else {\n const quadPoint = utils.getQuadraticCurvePoint(0, 0,\n status.xe,\n status.ye,\n status.modifiedXe,\n status.modifiedYe,\n progress);\n\n status.sx = quadPoint.x;\n status.sy = quadPoint.y;\n }\n\n this.doMove();\n\n status.i = animationFrame.request(this.boundInertiaFrame);\n }\n else {\n status.sx = status.modifiedXe;\n status.sy = status.modifiedYe;\n\n this.doMove();\n this.end(status.startEvent);\n status.active = false;\n this.simulation = null;\n }\n\n utils.copyCoords(this.prevCoords, this.curCoords);\n}\n\nfunction smoothEndFrame () {\n updateInertiaCoords(this);\n\n const status = this.inertiaStatus;\n const t = new Date().getTime() - status.t0;\n const duration = this.target.options[this.prepared.name].inertia.smoothEndDuration;\n\n if (t < duration) {\n status.sx = utils.easeOutQuad(t, 0, status.xe, duration);\n status.sy = utils.easeOutQuad(t, 0, status.ye, duration);\n\n this.pointerMove(status.startEvent, status.startEvent);\n\n status.i = animationFrame.request(this.boundSmoothEndFrame);\n }\n else {\n status.sx = status.xe;\n status.sy = status.ye;\n\n this.pointerMove(status.startEvent, status.startEvent);\n this.end(status.startEvent);\n\n status.smoothEnd =\n status.active = false;\n this.simulation = null;\n }\n}\n\nfunction updateInertiaCoords (interaction) {\n const status = interaction.inertiaStatus;\n\n // return if inertia isn't running\n if (!status.active) { return; }\n\n const pageUp = status.upCoords.page;\n const clientUp = status.upCoords.client;\n\n utils.setCoords(interaction.curCoords, [ {\n pageX : pageUp.x + status.sx,\n pageY : pageUp.y + status.sy,\n clientX: clientUp.x + status.sx,\n clientY: clientUp.y + status.sy,\n } ]);\n}\n","const browser = require('./utils/browser');\nconst events = require('./utils/events');\nconst utils = require('./utils');\nconst scope = require('./scope');\nconst Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\n\nconst globalEvents = {};\n\n/*\\\n * interact\n [ method ]\n *\n * The methods of this variable can be used to set elements as\n * interactables and also to change various default settings.\n *\n * Calling it as a function and passing an element or a valid CSS selector\n * string returns an Interactable object which has various methods to\n * configure it.\n *\n - element (Element | string) The HTML or SVG Element to interact with or CSS selector\n = (object) An @Interactable\n *\n > Usage\n | interact('#draggable').draggable(true);\n |\n | var rectables = interact('rect');\n | rectables\n | .gesturable(true)\n | .on('gesturemove', function (event) {\n | // ...\n | });\n\\*/\nfunction interact (element, options) {\n let interactable = scope.interactables.get(element, options);\n\n if (!interactable) {\n interactable = new Interactable(element, options);\n interactable.events.global = globalEvents;\n }\n\n return interactable;\n}\n\n/*\\\n * interact.isSet\n [ method ]\n *\n * Check if an element has been set\n - element (Element) The Element being searched for\n = (boolean) Indicates if the element or CSS selector was previously passed to interact\n\\*/\ninteract.isSet = function (element, options) {\n return scope.interactables.indexOfElement(element, options && options.context) !== -1;\n};\n\n/*\\\n * interact.on\n [ method ]\n *\n * Adds a global listener for an InteractEvent or adds a DOM event to\n * `document`\n *\n - type (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) interact\n\\*/\ninteract.on = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.on(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.on(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n // if it is an InteractEvent type, add listener to globalEvents\n if (utils.contains(Interactable.eventTypes, type)) {\n // if this type of event was never bound\n if (!globalEvents[type]) {\n globalEvents[type] = [listener];\n }\n else {\n globalEvents[type].push(listener);\n }\n }\n // If non InteractEvent type, addEventListener to document\n else {\n events.add(scope.document, type, listener, { options });\n }\n\n return interact;\n};\n\n/*\\\n * interact.off\n [ method ]\n *\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n - type (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) interact\n \\*/\ninteract.off = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.off(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.off(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n if (!utils.contains(Interactable.eventTypes, type)) {\n events.remove(scope.document, type, listener, options);\n }\n else {\n let index;\n\n if (type in globalEvents\n && (index = utils.indexOf(globalEvents[type], listener)) !== -1) {\n globalEvents[type].splice(index, 1);\n }\n }\n\n return interact;\n};\n\n/*\\\n * interact.debug\n [ method ]\n *\n * Returns an object which exposes internal data\n = (object) An object with properties that outline the current state and expose internal functions and variables\n\\*/\ninteract.debug = function () {\n return scope;\n};\n\n// expose the functions used to calculate multi-touch properties\ninteract.getPointerAverage = utils.pointerAverage;\ninteract.getTouchBBox = utils.touchBBox;\ninteract.getTouchDistance = utils.touchDistance;\ninteract.getTouchAngle = utils.touchAngle;\n\ninteract.getElementRect = utils.getElementRect;\ninteract.getElementClientRect = utils.getElementClientRect;\ninteract.matchesSelector = utils.matchesSelector;\ninteract.closest = utils.closest;\n\n/*\\\n * interact.supportsTouch\n [ method ]\n *\n = (boolean) Whether or not the browser supports touch input\n\\*/\ninteract.supportsTouch = function () {\n return browser.supportsTouch;\n};\n\n/*\\\n * interact.supportsPointerEvent\n [ method ]\n *\n = (boolean) Whether or not the browser supports PointerEvents\n\\*/\ninteract.supportsPointerEvent = function () {\n return browser.supportsPointerEvent;\n};\n\n/*\\\n * interact.stop\n [ method ]\n *\n * Cancels all interactions (end events are not fired)\n *\n - event (Event) An event on which to call preventDefault()\n = (object) interact\n\\*/\ninteract.stop = function (event) {\n for (let i = scope.interactions.length - 1; i >= 0; i--) {\n scope.interactions[i].stop(event);\n }\n\n return interact;\n};\n\n/*\\\n * interact.pointerMoveTolerance\n [ method ]\n * Returns or sets the distance the pointer must be moved before an action\n * sequence occurs. This also affects tolerance for tap events.\n *\n - newValue (number) #optional The movement from the start position must be greater than this value\n = (number | Interactable) The current setting or interact\n\\*/\ninteract.pointerMoveTolerance = function (newValue) {\n if (utils.is.number(newValue)) {\n Interaction.pointerMoveTolerance = newValue;\n\n return this;\n }\n\n return Interaction.pointerMoveTolerance;\n};\n\ninteract.addDocument = scope.addDocument;\ninteract.removeDocument = scope.removeDocument;\n\nscope.interact = interact;\n\nmodule.exports = interact;\n","const Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\nconst scope = require('./scope');\nconst is = require('./utils/is');\nconst events = require('./utils/events');\n\nconst { nodeContains, matchesSelector } = require('./utils/domUtils');\n\n/*\\\n * Interactable.preventDefault\n [ method ]\n *\n * Returns or sets whether to prevent the browser's default behaviour\n * in response to pointer events. Can be set to:\n * - `'always'` to always prevent\n * - `'never'` to never prevent\n * - `'auto'` to let interact.js try to determine what would be best\n *\n - newValue (string) #optional `true`, `false` or `'auto'`\n = (string | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.preventDefault = function (newValue) {\n if (/^(always|never|auto)$/.test(newValue)) {\n this.options.preventDefault = newValue;\n return this;\n }\n\n if (is.bool(newValue)) {\n this.options.preventDefault = newValue? 'always' : 'never';\n return this;\n }\n\n return this.options.preventDefault;\n};\n\nInteractable.prototype.checkAndPreventDefault = function (event) {\n const setting = this.options.preventDefault;\n\n if (setting === 'never') { return; }\n\n if (setting === 'always') {\n event.preventDefault();\n return;\n }\n\n // setting === 'auto'\n\n // don't preventDefault if the browser supports passiveEvents\n // CSS touch-action and user-selecct should be used instead\n if (events.supportsOptions) {\n return;\n }\n\n // don't preventDefault of pointerdown events\n if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) {\n return;\n }\n\n // don't preventDefault on editable elements\n if (is.element(event.target)\n && matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) {\n return;\n }\n\n event.preventDefault();\n};\n\nfunction onInteractionEvent ({ interaction, event }) {\n if (interaction.target) {\n interaction.target.checkAndPreventDefault(event);\n }\n}\n\nfor (const eventSignal of ['down', 'move', 'up', 'cancel']) {\n Interaction.signals.on(eventSignal, onInteractionEvent);\n}\n\n// prevent native HTML5 drag on interact.js target elements\nInteraction.docEvents.dragstart = function preventNativeDrag (event) {\n for (const interaction of scope.interactions) {\n\n if (interaction.element\n && (interaction.element === event.target\n || nodeContains(interaction.element, event.target))) {\n\n interaction.target.checkAndPreventDefault(event);\n return;\n }\n }\n};\n","const scope = require('./scope');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst iFinder = require('./utils/interactionFinder');\nconst pointerEvents = require('./pointerEvents/base');\n\nconst { window } = require('./utils/window');\n\nconst toString = Object.prototype.toString;\n\nif (!window.Array.isArray) {\n window.Array.isArray = function (obj) {\n return toString.call(obj) === '[object Array]';\n };\n}\n\nif (!String.prototype.trim) {\n String.prototype.trim = function () {\n return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n };\n}\n\n// http://www.quirksmode.org/dom/events/click.html\n// >Events leading to dblclick\n//\n// IE8 doesn't fire down event before dblclick.\n// This workaround tries to fire a tap and doubletap after dblclick\nfunction onIE8Dblclick (event) {\n const eventTarget = event.target;\n const interaction = iFinder.search(event, event.type, eventTarget);\n\n if (!interaction) { return; }\n\n if (interaction.prevTap\n && event.clientX === interaction.prevTap.clientX\n && event.clientY === interaction.prevTap.clientY\n && eventTarget === interaction.prevTap.target) {\n\n interaction.downTargets[0] = eventTarget;\n interaction.downTimes [0] = new Date().getTime();\n\n pointerEvents.fire({\n interaction,\n event,\n eventTarget,\n pointer: event,\n type: 'tap',\n });\n }\n}\n\nif (browser.isIE8) {\n const selectFix = function (event) {\n for (const interaction of scope.interactions) {\n if (interaction.interacting()) {\n interaction.target.checkAndPreventDefault(event);\n }\n }\n };\n\n const onDocIE8 = function onDocIE8 ({ doc, win }, signalName) {\n const eventMethod = signalName.indexOf('listen') === 0\n ? events.add : events.remove;\n\n // For IE's lack of Event#preventDefault\n eventMethod(doc, 'selectstart', selectFix);\n\n if (pointerEvents) {\n eventMethod(doc, 'dblclick', onIE8Dblclick);\n }\n };\n\n scope.signals.on('add-document' , onDocIE8);\n scope.signals.on('remove-document', onDocIE8);\n}\n\nmodule.exports = null;\n","const InteractEvent = require('../InteractEvent');\nconst Interaction = require('../Interaction');\nconst extend = require('../utils/extend');\n\nconst modifiers = {\n names: [],\n\n setOffsets: function (arg) {\n const { interaction, pageCoords: page } = arg;\n const { target, element, startOffset } = interaction;\n const rect = target.getRect(element);\n\n if (rect) {\n startOffset.left = page.x - rect.left;\n startOffset.top = page.y - rect.top;\n\n startOffset.right = rect.right - page.x;\n startOffset.bottom = rect.bottom - page.y;\n\n if (!('width' in rect)) { rect.width = rect.right - rect.left; }\n if (!('height' in rect)) { rect.height = rect.bottom - rect.top ; }\n }\n else {\n startOffset.left = startOffset.top = startOffset.right = startOffset.bottom = 0;\n }\n\n arg.rect = rect;\n arg.interactable = target;\n arg.element = element;\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n\n arg.options = target.options[interaction.prepared.name][modifierName];\n\n if (!arg.options) {\n continue;\n }\n\n interaction.modifierOffsets[modifierName] = modifiers[modifierName].setOffset(arg);\n }\n },\n\n setAll: function (arg) {\n const { interaction, statuses, preEnd, requireEndOnly } = arg;\n const coords = extend({}, arg.pageCoords);\n const result = {\n dx: 0,\n dy: 0,\n changed: false,\n locked: false,\n shouldMove: true,\n };\n\n for (const modifierName of modifiers.names) {\n const modifier = modifiers[modifierName];\n const options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!shouldDo(options, preEnd, requireEndOnly)) { continue; }\n\n arg.status = arg.status = statuses[modifierName];\n arg.options = options;\n arg.offset = arg.interaction.modifierOffsets[modifierName];\n\n modifier.set(arg);\n\n if (arg.status.locked) {\n coords.x += arg.status.dx;\n coords.y += arg.status.dy;\n\n result.dx += arg.status.dx;\n result.dy += arg.status.dy;\n\n result.locked = true;\n }\n }\n\n // a move should be fired if:\n // - there are no modifiers enabled,\n // - no modifiers are \"locked\" i.e. have changed the pointer's coordinates, or\n // - the locked coords have changed since the last pointer move\n result.shouldMove = !arg.status || !result.locked || arg.status.changed;\n\n return result;\n },\n\n resetStatuses: function (statuses) {\n for (const modifierName of modifiers.names) {\n const status = statuses[modifierName] || {};\n\n status.dx = status.dy = 0;\n status.modifiedX = status.modifiedY = NaN;\n status.locked = false;\n status.changed = true;\n\n statuses[modifierName] = status;\n }\n\n return statuses;\n },\n\n start: function ({ interaction }, signalName) {\n const arg = {\n interaction,\n pageCoords: (signalName === 'action-resume' ?\n interaction.curCoords : interaction.startCoords).page,\n startOffset: interaction.startOffset,\n statuses: interaction.modifierStatuses,\n preEnd: false,\n requireEndOnly: false,\n };\n\n modifiers.setOffsets(arg);\n modifiers.resetStatuses(arg.statuses);\n\n arg.pageCoords = extend({}, interaction.startCoords.page);\n interaction.modifierResult = modifiers.setAll(arg);\n },\n};\n\nInteraction.signals.on('new', function (interaction) {\n interaction.startOffset = { left: 0, right: 0, top: 0, bottom: 0 };\n interaction.modifierOffsets = {};\n interaction.modifierStatuses = modifiers.resetStatuses({});\n interaction.modifierResult = null;\n});\n\nInteraction.signals.on('action-start' , modifiers.start);\nInteraction.signals.on('action-resume', modifiers.start);\n\nInteraction.signals.on('before-action-move', function ({ interaction, preEnd, interactingBeforeMove }) {\n const modifierResult = modifiers.setAll({\n interaction,\n preEnd,\n pageCoords: interaction.curCoords.page,\n statuses: interaction.modifierStatuses,\n requireEndOnly: false,\n });\n\n // don't fire an action move if a modifier would keep the event in the same\n // cordinates as before\n if (!modifierResult.shouldMove && interactingBeforeMove) {\n interaction._dontFireMove = true;\n }\n\n interaction.modifierResult = modifierResult;\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n for (let i = 0; i < modifiers.names.length; i++) {\n const options = interaction.target.options[interaction.prepared.name][modifiers.names[i]];\n\n // if the endOnly option is true for any modifier\n if (shouldDo(options, true, true)) {\n // fire a move event at the modified coordinates\n interaction.doMove({ event, preEnd: true });\n break;\n }\n }\n});\n\nInteractEvent.signals.on('set-xy', function (arg) {\n const { iEvent, interaction } = arg;\n const modifierArg = extend({}, arg);\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n modifierArg.options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!modifierArg.options) {\n continue;\n }\n\n const modifier = modifiers[modifierName];\n\n modifierArg.status = interaction.modifierStatuses[modifierName];\n\n iEvent[modifierName] = modifier.modifyCoords(modifierArg);\n }\n});\n\nfunction shouldDo (options, preEnd, requireEndOnly) {\n return (options && options.enabled\n && (preEnd || !options.endOnly)\n && (!requireEndOnly || options.endOnly));\n}\n\nmodule.exports = modifiers;\n","const modifiers = require('./index');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst restrict = {\n defaults: {\n enabled : false,\n endOnly : false,\n restriction: null,\n elementRect: null,\n },\n\n setOffset: function ({ rect, startOffset, options }) {\n const elementRect = options && options.elementRect;\n const offset = {};\n\n if (rect && elementRect) {\n offset.left = startOffset.left - (rect.width * elementRect.left);\n offset.top = startOffset.top - (rect.height * elementRect.top);\n\n offset.right = startOffset.right - (rect.width * (1 - elementRect.right));\n offset.bottom = startOffset.bottom - (rect.height * (1 - elementRect.bottom));\n }\n else {\n offset.left = offset.top = offset.right = offset.bottom = 0;\n }\n\n return offset;\n },\n\n set: function ({ pageCoords, interaction, status, options }) {\n if (!options) { return status; }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n\n const restriction = getRestrictionRect(options.restriction, interaction, page);\n\n if (!restriction) { return status; }\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n const rect = restriction;\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n const offset = interaction.modifierOffsets.restrict;\n\n // object is assumed to have\n // x, y, width, height or\n // left, top, right, bottom\n if ('x' in restriction && 'y' in restriction) {\n modifiedX = Math.max(Math.min(rect.x + rect.width - offset.right , page.x), rect.x + offset.left);\n modifiedY = Math.max(Math.min(rect.y + rect.height - offset.bottom, page.y), rect.y + offset.top );\n }\n else {\n modifiedX = Math.max(Math.min(rect.right - offset.right , page.x), rect.left + offset.left);\n modifiedY = Math.max(Math.min(rect.bottom - offset.bottom, page.y), rect.top + offset.top );\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const elementRect = options && options.elementRect;\n\n if (options && options.enabled\n && !(phase === 'start' && elementRect && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n getRestrictionRect,\n};\n\nfunction getRestrictionRect (value, interaction, page) {\n if (utils.is.function(value)) {\n return utils.resolveRectLike(value, interaction.target, interaction.element, [page.x, page.y, interaction]);\n } else {\n return utils.resolveRectLike(value, interaction.target, interaction.element);\n }\n}\n\nmodifiers.restrict = restrict;\nmodifiers.names.push('restrict');\n\ndefaultOptions.perAction.restrict = restrict.defaults;\n\nmodule.exports = restrict;\n","// This module adds the options.resize.restrictEdges setting which sets min and\n// max for the top, left, bottom and right edges of the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictEdges: {\n// inner: { top: 200, left: 200, right: 400, bottom: 400 },\n// outer: { top: 0, left: 0, right: 600, bottom: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst { getRestrictionRect } = require('./restrict');\n\nconst noInner = { top: +Infinity, left: +Infinity, bottom: -Infinity, right: -Infinity };\nconst noOuter = { top: -Infinity, left: -Infinity, bottom: +Infinity, right: +Infinity };\n\nconst restrictEdges = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n offset: null,\n },\n\n setOffset: function ({ interaction, startOffset, options }) {\n if (!options) {\n return utils.extend({}, startOffset);\n }\n\n const offset = getRestrictionRect(options.offset, interaction, interaction.startCoords.page);\n\n if (offset) {\n return {\n top: startOffset.top + offset.y,\n left: startOffset.left + offset.x,\n bottom: startOffset.bottom + offset.y,\n right: startOffset.right + offset.x,\n };\n }\n\n return startOffset;\n },\n\n set: function ({ pageCoords, interaction, status, offset, options }) {\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n const inner = rectUtils.xywhToTlbr(getRestrictionRect(options.inner, interaction, page)) || noInner;\n const outer = rectUtils.xywhToTlbr(getRestrictionRect(options.outer, interaction, page)) || noOuter;\n\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n if (edges.top) {\n modifiedY = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top);\n }\n else if (edges.bottom) {\n modifiedY = Math.max(Math.min(outer.bottom - offset.bottom, page.y), inner.bottom - offset.bottom);\n }\n if (edges.left) {\n modifiedX = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left);\n }\n else if (edges.right) {\n modifiedX = Math.max(Math.min(outer.right - offset.right, page.x), inner.right - offset.right);\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n if (options && options.enabled\n && !(phase === 'start' && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n noInner,\n noOuter,\n getRestrictionRect,\n};\n\nmodifiers.restrictEdges = restrictEdges;\nmodifiers.names.push('restrictEdges');\n\ndefaultOptions.perAction.restrictEdges = restrictEdges.defaults;\nresize.defaults.restrictEdges = restrictEdges.defaults;\n\nmodule.exports = restrictEdges;\n","// This module adds the options.resize.restrictSize setting which sets min and\n// max width and height for the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictSize: {\n// min: { width: -600, height: -600 },\n// max: { width: 600, height: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst restrictEdges = require('./restrictEdges');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst noMin = { width: -Infinity, height: -Infinity };\nconst noMax = { width: +Infinity, height: +Infinity };\n\nconst restrictSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n },\n\n setOffset: function ({ interaction }) {\n return interaction.startOffset;\n },\n\n set: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const rect = rectUtils.xywhToTlbr(interaction.resizeRects.inverted);\n\n const minSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.min, interaction)) || noMin;\n const maxSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.max, interaction)) || noMax;\n\n arg.options = {\n enabled: options.enabled,\n endOnly: options.endOnly,\n inner: utils.extend({}, restrictEdges.noInner),\n outer: utils.extend({}, restrictEdges.noOuter),\n };\n\n if (edges.top) {\n arg.options.inner.top = rect.bottom - minSize.height;\n arg.options.outer.top = rect.bottom - maxSize.height;\n }\n else if (edges.bottom) {\n arg.options.inner.bottom = rect.top + minSize.height;\n arg.options.outer.bottom = rect.top + maxSize.height;\n }\n if (edges.left) {\n arg.options.inner.left = rect.right - minSize.width;\n arg.options.outer.left = rect.right - maxSize.width;\n }\n else if (edges.right) {\n arg.options.inner.right = rect.left + minSize.width;\n arg.options.outer.right = rect.left + maxSize.width;\n }\n\n restrictEdges.set(arg);\n },\n\n modifyCoords: restrictEdges.modifyCoords,\n};\n\nmodifiers.restrictSize = restrictSize;\nmodifiers.names.push('restrictSize');\n\ndefaultOptions.perAction.restrictSize = restrictSize.defaults;\nresize.defaults.restrictSize = restrictSize.defaults;\n\nmodule.exports = restrictSize;\n","const modifiers = require('./index');\nconst interact = require('../interact');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst snap = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n\n relativePoints: null,\n },\n\n setOffset: function ({ interaction, interactable, element, rect, startOffset, options }) {\n const offsets = [];\n const optionsOrigin = utils.rectToXY(utils.resolveRectLike(options.origin));\n const origin = optionsOrigin || utils.getOriginXY(interactable, element, interaction.prepared.name);\n options = options || interactable.options[interaction.prepared.name].snap || {};\n\n let snapOffset;\n\n if (options.offset === 'startCoords') {\n snapOffset = {\n x: interaction.startCoords.page.x - origin.x,\n y: interaction.startCoords.page.y - origin.y,\n };\n }\n else {\n const offsetRect = utils.resolveRectLike(options.offset, interactable, element, [interaction]);\n\n snapOffset = utils.rectToXY(offsetRect) || { x: 0, y: 0 };\n }\n\n if (rect && options.relativePoints && options.relativePoints.length) {\n for (const { x: relativeX, y: relativeY } of options.relativePoints) {\n offsets.push({\n x: startOffset.left - (rect.width * relativeX) + snapOffset.x,\n y: startOffset.top - (rect.height * relativeY) + snapOffset.y,\n });\n }\n }\n else {\n offsets.push(snapOffset);\n }\n\n return offsets;\n },\n\n set: function ({ interaction, pageCoords, status, options, offset: offsets }) {\n const targets = [];\n let target;\n let page;\n let i;\n\n if (status.useStatusXY) {\n page = { x: status.x, y: status.y };\n }\n else {\n const origin = utils.getOriginXY(interaction.target, interaction.element, interaction.prepared.name);\n\n page = utils.extend({}, pageCoords);\n\n page.x -= origin.x;\n page.y -= origin.y;\n }\n\n status.realX = page.x;\n status.realY = page.y;\n\n let len = options.targets? options.targets.length : 0;\n\n for (const { x: offsetX, y: offsetY } of offsets) {\n const relativeX = page.x - offsetX;\n const relativeY = page.y - offsetY;\n\n for (const snapTarget of options.targets) {\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n targets.push({\n x: utils.is.number(target.x) ? (target.x + offsetX) : relativeX,\n y: utils.is.number(target.y) ? (target.y + offsetY) : relativeY,\n\n range: utils.is.number(target.range)? target.range: options.range,\n });\n }\n }\n\n const closest = {\n target: null,\n inRange: false,\n distance: 0,\n range: 0,\n dx: 0,\n dy: 0,\n };\n\n for (i = 0, len = targets.length; i < len; i++) {\n target = targets[i];\n\n const range = target.range;\n const dx = target.x - page.x;\n const dy = target.y - page.y;\n const distance = utils.hypot(dx, dy);\n let inRange = distance <= range;\n\n // Infinite targets count as being out of range\n // compared to non infinite ones that are in range\n if (range === Infinity && closest.inRange && closest.range !== Infinity) {\n inRange = false;\n }\n\n if (!closest.target || (inRange\n // is the closest target in range?\n ? (closest.inRange && range !== Infinity\n // the pointer is relatively deeper in this target\n ? distance / range < closest.distance / closest.range\n // this target has Infinite range and the closest doesn't\n : (range === Infinity && closest.range !== Infinity)\n // OR this target is closer that the previous closest\n || distance < closest.distance)\n // The other is not in range and the pointer is closer to this target\n : (!closest.inRange && distance < closest.distance))) {\n\n closest.target = target;\n closest.distance = distance;\n closest.range = range;\n closest.inRange = inRange;\n closest.dx = dx;\n closest.dy = dy;\n\n status.range = range;\n }\n }\n\n let snapChanged;\n\n if (closest.target) {\n snapChanged = (status.modifiedX !== closest.target.x || status.modifiedY !== closest.target.y);\n\n status.modifiedX = closest.target.x;\n status.modifiedY = closest.target.y;\n }\n else {\n snapChanged = true;\n\n status.modifiedX = NaN;\n status.modifiedY = NaN;\n }\n\n status.dx = closest.dx;\n status.dy = closest.dy;\n\n status.changed = (snapChanged || (closest.inRange && !status.locked));\n status.locked = closest.inRange;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const relativePoints = options && options.relativePoints;\n\n if (options && options.enabled\n && !(phase === 'start' && relativePoints && relativePoints.length)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n }\n\n return {\n range : status.range,\n locked : status.locked,\n x : status.modifiedX,\n y : status.modifiedY,\n realX : status.realX,\n realY : status.realY,\n dx : status.dx,\n dy : status.dy,\n };\n }\n },\n};\n\ninteract.createSnapGrid = function (grid) {\n return function (x, y) {\n const limits = grid.limits || {\n left : -Infinity,\n right : Infinity,\n top : -Infinity,\n bottom: Infinity,\n };\n let offsetX = 0;\n let offsetY = 0;\n\n if (utils.is.object(grid.offset)) {\n offsetX = grid.offset.x;\n offsetY = grid.offset.y;\n }\n\n const gridx = Math.round((x - offsetX) / grid.x);\n const gridy = Math.round((y - offsetY) / grid.y);\n\n const newX = Math.max(limits.left, Math.min(limits.right , gridx * grid.x + offsetX));\n const newY = Math.max(limits.top , Math.min(limits.bottom, gridy * grid.y + offsetY));\n\n return {\n x: newX,\n y: newY,\n range: grid.range,\n };\n };\n};\n\nmodifiers.snap = snap;\nmodifiers.names.push('snap');\n\ndefaultOptions.perAction.snap = snap.defaults;\n\nmodule.exports = snap;\n","// This module allows snapping of the size of targets during resize\n// interactions.\n\nconst modifiers = require('./index');\nconst snap = require('./snap');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\nconst utils = require('../utils/');\n\nconst snapSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n },\n\n setOffset: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.edges;\n\n if (!edges) { return; }\n\n arg.options = {\n relativePoints: [{\n x: edges.left? 0 : 1,\n y: edges.top ? 0 : 1,\n }],\n origin: { x: 0, y: 0 },\n offset: 'self',\n range: options.range,\n };\n\n const offsets = snap.setOffset(arg);\n arg.options = options;\n\n return offsets;\n },\n\n set: function (arg) {\n const { interaction, options, offset, pageCoords } = arg;\n const page = utils.extend({}, pageCoords);\n const relativeX = page.x - offset[0].x;\n const relativeY = page.y - offset[0].y;\n\n arg.options = utils.extend({}, options);\n arg.options.targets = [];\n\n for (const snapTarget of options.targets) {\n let target;\n\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n if ('width' in target && 'height' in target) {\n target.x = target.width;\n target.y = target.height;\n }\n\n arg.options.targets.push(target);\n }\n\n snap.set(arg);\n },\n\n modifyCoords: function (arg) {\n const { options } = arg;\n\n arg.options = utils.extend({}, options);\n arg.options.enabled = options.enabled;\n arg.options.relativePoints = [null];\n\n snap.modifyCoords(arg);\n },\n};\n\nmodifiers.snapSize = snapSize;\nmodifiers.names.push('snapSize');\n\ndefaultOptions.perAction.snapSize = snapSize.defaults;\nresize.defaults.snapSize = snapSize.defaults;\n\nmodule.exports = snapSize;\n","const pointerUtils = require('../utils/pointerUtils');\n\nmodule.exports = class PointerEvent {\n constructor (type, pointer, event, eventTarget, interaction) {\n pointerUtils.pointerExtend(this, event);\n\n if (event !== pointer) {\n pointerUtils.pointerExtend(this, pointer);\n }\n\n this.interaction = interaction;\n\n this.timeStamp = new Date().getTime();\n this.originalEvent = event;\n this.type = type;\n this.pointerId = pointerUtils.getPointerId(pointer);\n this.pointerType = pointerUtils.getPointerType(pointer);\n this.target = eventTarget;\n this.currentTarget = null;\n\n if (type === 'tap') {\n const pointerIndex = interaction.getPointerIndex(pointer);\n this.dt = this.timeStamp - interaction.downTimes[pointerIndex];\n\n const interval = this.timeStamp - interaction.tapTime;\n\n this.double = !!(interaction.prevTap\n && interaction.prevTap.type !== 'doubletap'\n && interaction.prevTap.target === this.target\n && interval < 500);\n }\n else if (type === 'doubletap') {\n this.dt = pointer.timeStamp - interaction.tapTime;\n }\n }\n\n subtractOrigin ({ x: originX, y: originY }) {\n this.pageX -= originX;\n this.pageY -= originY;\n this.clientX -= originX;\n this.clientY -= originY;\n\n return this;\n }\n\n addOrigin ({ x: originX, y: originY }) {\n this.pageX += originX;\n this.pageY += originY;\n this.clientX += originX;\n this.clientY += originY;\n\n return this;\n }\n\n preventDefault () {\n this.originalEvent.preventDefault();\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n};\n","const PointerEvent = require('./PointerEvent');\nconst Interaction = require('../Interaction');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst defaults = require('../defaultOptions');\nconst signals = require('../utils/Signals').new();\nconst { filter } = require('../utils/arr');\n\nconst simpleSignals = [ 'down', 'up', 'cancel' ];\nconst simpleEvents = [ 'down', 'up', 'cancel' ];\n\nconst pointerEvents = {\n PointerEvent,\n fire,\n collectEventTargets,\n signals,\n defaults: {\n holdDuration: 600,\n ignoreFrom : null,\n allowFrom : null,\n origin : { x: 0, y: 0 },\n },\n types: [\n 'down',\n 'move',\n 'up',\n 'cancel',\n 'tap',\n 'doubletap',\n 'hold',\n ],\n};\n\nfunction fire (arg) {\n const {\n interaction, pointer, event, eventTarget,\n type = arg.pointerEvent.type,\n targets = collectEventTargets(arg),\n pointerEvent = new PointerEvent(type, pointer, event, eventTarget, interaction),\n } = arg;\n\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n targets,\n type,\n pointerEvent,\n };\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n\n for (const prop in target.props || {}) {\n pointerEvent[prop] = target.props[prop];\n }\n\n const origin = utils.getOriginXY(target.eventable, target.element);\n\n pointerEvent.subtractOrigin(origin);\n pointerEvent.eventable = target.eventable;\n pointerEvent.currentTarget = target.element;\n\n target.eventable.fire(pointerEvent);\n\n pointerEvent.addOrigin(origin);\n\n if (pointerEvent.immediatePropagationStopped\n || (pointerEvent.propagationStopped\n && (i + 1) < targets.length && targets[i + 1].element !== pointerEvent.currentTarget)) {\n break;\n }\n }\n\n signals.fire('fired', signalArg);\n\n if (type === 'tap') {\n // if pointerEvent should make a double tap, create and fire a doubletap\n // PointerEvent and use that as the prevTap\n const prevTap = pointerEvent.double\n ? fire({\n interaction, pointer, event, eventTarget,\n type: 'doubletap',\n })\n : pointerEvent;\n\n interaction.prevTap = prevTap;\n interaction.tapTime = prevTap.timeStamp;\n }\n\n return pointerEvent;\n}\n\nfunction collectEventTargets ({ interaction, pointer, event, eventTarget, type }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n // do not fire a tap event if the pointer was moved before being lifted\n if (type === 'tap' && (interaction.pointerWasMoved\n // or if the pointerup target is different to the pointerdown target\n || !(interaction.downTargets[pointerIndex] && interaction.downTargets[pointerIndex] === eventTarget))) {\n return [];\n }\n\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n path,\n targets: [],\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (type === 'hold') {\n signalArg.targets = filter(signalArg.targets, target =>\n target.eventable.options.holdDuration === interaction.holdTimers[pointerIndex].duration);\n }\n\n return signalArg.targets;\n}\n\nInteraction.signals.on('update-pointer-down', function ({ interaction, pointerIndex }) {\n interaction.holdTimers[pointerIndex] = { duration: Infinity, timeout: null };\n});\n\nInteraction.signals.on('remove-pointer', function ({ interaction, pointerIndex }) {\n interaction.holdTimers.splice(pointerIndex, 1);\n});\n\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget, duplicateMove }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n if (!duplicateMove && (!interaction.pointerIsDown || interaction.pointerWasMoved)) {\n if (interaction.pointerIsDown) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n\n fire({\n interaction, pointer, event, eventTarget,\n type: 'move',\n });\n }\n});\n\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget, pointerIndex }) {\n // copy event to be used in timeout for IE8\n const eventCopy = browser.isIE8? utils.extend({}, event) : event;\n\n const timer = interaction.holdTimers[pointerIndex];\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'hold',\n targets: [],\n path,\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (!signalArg.targets.length) { return; }\n\n let minDuration = Infinity;\n\n for (let i = 0; i < signalArg.targets.length; i++) {\n const target = signalArg.targets[i];\n const holdDuration = target.eventable.options.holdDuration;\n\n if (holdDuration < minDuration) {\n minDuration = holdDuration;\n }\n }\n\n timer.duration = minDuration;\n timer.timeout = setTimeout(function () {\n fire({\n interaction,\n eventTarget,\n pointer: browser.isIE8? eventCopy : pointer,\n event: eventCopy,\n type: 'hold',\n });\n }, minDuration);\n});\n\nInteraction.signals.on('up', ({ interaction, pointer, event, eventTarget }) => {\n if (!interaction.pointerWasMoved) {\n fire({ interaction, eventTarget, pointer, event, type: 'tap' });\n }\n});\n\n['up', 'cancel'].forEach(function (signalName) {\n Interaction.signals.on(signalName, function ({ interaction, pointerIndex }) {\n if (interaction.holdTimers[pointerIndex]) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n });\n});\n\nfunction createSignalListener (type) {\n return function ({ interaction, pointer, event, eventTarget }) {\n fire({ interaction, eventTarget, pointer, event, type });\n };\n}\n\nfor (let i = 0; i < simpleSignals.length; i++) {\n Interaction.signals.on(simpleSignals[i], createSignalListener(simpleEvents[i]));\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.prevTap = null; // the most recent tap event on this interaction\n interaction.tapTime = 0; // time of the most recent tap event\n interaction.holdTimers = []; // [{ duration, timeout }]\n});\n\ndefaults.pointerEvents = pointerEvents.defaults;\nmodule.exports = pointerEvents;\n","const pointerEvents = require('./base');\nconst Interaction = require('../Interaction');\n\npointerEvents.signals.on('new', onNew);\npointerEvents.signals.on('fired', onFired);\n\nfor (const signal of ['move', 'up', 'cancel', 'endall']) {\n Interaction.signals.on(signal, endHoldRepeat);\n}\n\nfunction onNew ({ pointerEvent }) {\n if (pointerEvent.type !== 'hold') { return; }\n\n pointerEvent.count = (pointerEvent.count || 0) + 1;\n}\n\nfunction onFired ({ interaction, pointerEvent, eventTarget, targets }) {\n if (pointerEvent.type !== 'hold' || !targets.length) { return; }\n\n // get the repeat interval from the first eventable\n const interval = targets[0].eventable.options.holdRepeatInterval;\n\n // don't repeat if the interval is 0 or less\n if (interval <= 0) { return; }\n\n // set a timeout to fire the holdrepeat event\n interaction.holdIntervalHandle = setTimeout(function () {\n pointerEvents.fire({\n interaction,\n eventTarget,\n type: 'hold',\n pointer: pointerEvent,\n event: pointerEvent,\n });\n }, interval);\n}\n\nfunction endHoldRepeat ({ interaction }) {\n // set the interaction's holdStopTime property\n // to stop further holdRepeat events\n if (interaction.holdIntervalHandle) {\n clearInterval(interaction.holdIntervalHandle);\n interaction.holdIntervalHandle = null;\n }\n}\n\n// don't repeat by default\npointerEvents.defaults.holdRepeatInterval = 0;\npointerEvents.types.push('holdrepeat');\n\nmodule.exports = {\n onNew,\n onFired,\n endHoldRepeat,\n};\n","const pointerEvents = require('./base');\nconst Interactable = require('../Interactable');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\nconst scope = require('../scope');\nconst extend = require('../utils/extend');\nconst { merge } = require('../utils/arr');\n\npointerEvents.signals.on('collect-targets', function ({ targets, element, type, eventTarget }) {\n function collectSelectors (interactable, selector, context) {\n const els = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && is.element(element)\n && domUtils.matchesSelector(element, selector, els)\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n const interactable = scope.interactables.get(element);\n\n if (interactable) {\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n scope.interactables.forEachSelector(collectSelectors, element);\n});\n\nInteractable.signals.on('new', function ({ interactable }) {\n interactable.events.getRect = function (element) {\n return interactable.getRect(element);\n };\n});\n\nInteractable.signals.on('set', function ({ interactable, options }) {\n extend(interactable.events.options, pointerEvents.defaults);\n extend(interactable.events.options, options);\n});\n\nmerge(Interactable.eventTypes, pointerEvents.types);\n\nInteractable.prototype.pointerEvents = function (options) {\n extend(this.events.options, options);\n\n return this;\n};\n\nconst __backCompatOption = Interactable.prototype._backCompatOption;\n\nInteractable.prototype._backCompatOption = function (optionName, newValue) {\n const ret = __backCompatOption.call(this, optionName, newValue);\n\n if (ret === this) {\n this.events.options[optionName] = newValue;\n }\n\n return ret;\n};\n\nInteractable.settingsMethods.push('pointerEvents');\n","const utils = require('./utils');\nconst events = require('./utils/events');\nconst signals = require('./utils/Signals').new();\n\nconst scope = {\n signals,\n events,\n utils,\n\n // main document\n document: require('./utils/domObjects').document,\n // all documents being listened to\n documents: [],\n\n addDocument: function (doc, win) {\n // do nothing if document is already known\n if (utils.contains(scope.documents, doc)) { return false; }\n\n win = win || scope.getWindow(doc);\n\n scope.documents.push(doc);\n events.documents.push(doc);\n\n // don't add an unload event for the main document\n // so that the page may be cached in browser history\n if (doc !== scope.document) {\n events.add(win, 'unload', scope.onWindowUnload);\n }\n\n signals.fire('add-document', { doc, win });\n },\n\n removeDocument: function (doc, win) {\n const index = utils.indexOf(scope.documents, doc);\n\n win = win || scope.getWindow(doc);\n\n events.remove(win, 'unload', scope.onWindowUnload);\n\n scope.documents.splice(index, 1);\n events.documents.splice(index, 1);\n\n signals.fire('remove-document', { win, doc });\n },\n\n onWindowUnload: function () {\n scope.removeDocument(this.document, this);\n },\n};\n\nmodule.exports = scope;\n","const { indexOf } = require('./arr');\n\nclass Signals {\n constructor () {\n this.listeners = {\n // signalName: [listeners],\n };\n }\n\n on (name, listener) {\n if (!this.listeners[name]) {\n this.listeners[name] = [listener];\n return;\n }\n\n this.listeners[name].push(listener);\n }\n\n off (name, listener) {\n if (!this.listeners[name]) { return; }\n\n const index = indexOf(this.listeners[name], listener);\n\n if (index !== -1) {\n this.listeners[name].splice(index, 1);\n }\n }\n\n fire (name, arg) {\n const targetListeners = this.listeners[name];\n\n if (!targetListeners) { return; }\n\n for (let i = 0; i < targetListeners.length; i++) {\n if (targetListeners[i](arg, name) === false) {\n return;\n }\n }\n }\n}\n\nSignals.new = function () {\n return new Signals();\n};\n\nmodule.exports = Signals;\n","function indexOf (array, target) {\n for (let i = 0, len = array.length; i < len; i++) {\n if (array[i] === target) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction contains (array, target) {\n return indexOf(array, target) !== -1;\n}\n\nfunction merge (target, source) {\n for (let i = 0; i < source.length; i++) {\n target.push(source[i]);\n }\n\n return target;\n}\n\nfunction filter (array, test) {\n const result = [];\n\n for (let i = 0; i < array.length; i++) {\n if (test(array[i])) {\n result.push(array[i]);\n }\n }\n\n return result;\n}\n\nmodule.exports = {\n indexOf,\n contains,\n merge,\n filter,\n};\n","const { window } = require('./window');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst Element = domObjects.Element;\nconst navigator = window.navigator;\n\nconst browser = {\n // Does the browser support touch input?\n supportsTouch: !!(('ontouchstart' in window) || is.function(window.DocumentTouch)\n && domObjects.document instanceof window.DocumentTouch),\n\n // Does the browser support PointerEvents\n supportsPointerEvent: !!domObjects.PointerEvent,\n\n isIE8: ('attachEvent' in window) && !('addEventListener' in window),\n\n // Opera Mobile must be handled differently\n isOperaMobile: (navigator.appName === 'Opera'\n && browser.supportsTouch\n && navigator.userAgent.match('Presto')),\n\n // scrolling doesn't change the result of getClientRects on iOS 7\n isIOS7: (/iP(hone|od|ad)/.test(navigator.platform)\n && /OS 7[^\\d]/.test(navigator.appVersion)),\n\n isIe9OrOlder: /MSIE (8|9)/.test(navigator.userAgent),\n\n // prefix matchesSelector\n prefixedMatchesSelector: 'matches' in Element.prototype\n ? 'matches': 'webkitMatchesSelector' in Element.prototype\n ? 'webkitMatchesSelector': 'mozMatchesSelector' in Element.prototype\n ? 'mozMatchesSelector': 'oMatchesSelector' in Element.prototype\n ? 'oMatchesSelector': 'msMatchesSelector',\n\n useMatchesSelectorPolyfill: false,\n\n pEventTypes: (domObjects.PointerEvent\n ? (domObjects.PointerEvent === window.MSPointerEvent\n ? {\n up: 'MSPointerUp',\n down: 'MSPointerDown',\n over: 'mouseover',\n out: 'mouseout',\n move: 'MSPointerMove',\n cancel: 'MSPointerCancel',\n }\n : {\n up: 'pointerup',\n down: 'pointerdown',\n over: 'pointerover',\n out: 'pointerout',\n move: 'pointermove',\n cancel: 'pointercancel',\n })\n : null),\n\n // because Webkit and Opera still use 'mousewheel' event type\n wheelEvent: 'onmousewheel' in domObjects.document? 'mousewheel': 'wheel',\n\n};\n\nbrowser.useMatchesSelectorPolyfill = !is.function(Element.prototype[browser.prefixedMatchesSelector]);\n\nmodule.exports = browser;\n","const domObjects = {};\nconst win = require('./window').window;\n\nfunction blank () {}\n\ndomObjects.document = win.document;\ndomObjects.DocumentFragment = win.DocumentFragment || blank;\ndomObjects.SVGElement = win.SVGElement || blank;\ndomObjects.SVGSVGElement = win.SVGSVGElement || blank;\ndomObjects.SVGElementInstance = win.SVGElementInstance || blank;\ndomObjects.Element = win.Element || blank;\ndomObjects.HTMLElement = win.HTMLElement || domObjects.Element;\n\ndomObjects.Event = win.Event;\ndomObjects.Touch = win.Touch || blank;\ndomObjects.PointerEvent = (win.PointerEvent || win.MSPointerEvent);\n\nmodule.exports = domObjects;\n","const win = require('./window');\nconst browser = require('./browser');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst domUtils = {\n nodeContains: function (parent, child) {\n while (child) {\n if (child === parent) {\n return true;\n }\n\n child = child.parentNode;\n }\n\n return false;\n },\n\n closest: function (element, selector) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) { return element; }\n\n element = domUtils.parentNode(element);\n }\n\n return null;\n },\n\n parentNode: function (node) {\n let parent = node.parentNode;\n\n if (is.docFrag(parent)) {\n // skip past #shado-root fragments\n while ((parent = parent.host) && is.docFrag(parent)) {\n continue;\n }\n\n return parent;\n }\n\n return parent;\n },\n\n // taken from http://tanalin.com/en/blog/2012/12/matches-selector-ie8/ and modified\n matchesSelectorPolyfill: browser.useMatchesSelectorPolyfill\n ? function (element, selector, elems) {\n elems = elems || element.parentNode.querySelectorAll(selector);\n\n for (let i = 0, len = elems.length; i < len; i++) {\n if (elems[i] === element) {\n return true;\n }\n }\n\n return false;\n }\n : null,\n\n matchesSelector: function (element, selector, nodeList) {\n if (browser.useMatchesSelectorPolyfill) {\n return domUtils.matchesSelectorPolyfill(element, selector, nodeList);\n }\n\n // remove /deep/ from selectors if shadowDOM polyfill is used\n if (win.window !== win.realWindow) {\n selector = selector.replace(/\\/deep\\//g, ' ');\n }\n\n return element[browser.prefixedMatchesSelector](selector);\n },\n\n // Test for the element that's \"above\" all other qualifiers\n indexOfDeepestElement: function (elements) {\n let deepestZoneParents = [];\n let dropzoneParents = [];\n let dropzone;\n let deepestZone = elements[0];\n let index = deepestZone? 0: -1;\n let parent;\n let child;\n let i;\n let n;\n\n for (i = 1; i < elements.length; i++) {\n dropzone = elements[i];\n\n // an element might belong to multiple selector dropzones\n if (!dropzone || dropzone === deepestZone) {\n continue;\n }\n\n if (!deepestZone) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n // check if the deepest or current are document.documentElement or document.rootElement\n // - if the current dropzone is, do nothing and continue\n if (dropzone.parentNode === dropzone.ownerDocument) {\n continue;\n }\n // - if deepest is, update with the current dropzone and continue to next\n else if (deepestZone.parentNode === dropzone.ownerDocument) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n if (!deepestZoneParents.length) {\n parent = deepestZone;\n while (parent.parentNode && parent.parentNode !== parent.ownerDocument) {\n deepestZoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n }\n\n // if this element is an svg element and the current deepest is\n // an HTMLElement\n if (deepestZone instanceof domObjects.HTMLElement\n && dropzone instanceof domObjects.SVGElement\n && !(dropzone instanceof domObjects.SVGSVGElement)) {\n\n if (dropzone === deepestZone.parentNode) {\n continue;\n }\n\n parent = dropzone.ownerSVGElement;\n }\n else {\n parent = dropzone;\n }\n\n dropzoneParents = [];\n\n while (parent.parentNode !== parent.ownerDocument) {\n dropzoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n\n n = 0;\n\n // get (position of last common ancestor) + 1\n while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) {\n n++;\n }\n\n const parents = [\n dropzoneParents[n - 1],\n dropzoneParents[n],\n deepestZoneParents[n],\n ];\n\n child = parents[0].lastChild;\n\n while (child) {\n if (child === parents[1]) {\n deepestZone = dropzone;\n index = i;\n deepestZoneParents = [];\n\n break;\n }\n else if (child === parents[2]) {\n break;\n }\n\n child = child.previousSibling;\n }\n }\n\n return index;\n },\n\n matchesUpTo: function (element, selector, limit) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) {\n return true;\n }\n\n element = domUtils.parentNode(element);\n\n if (element === limit) {\n return domUtils.matchesSelector(element, selector);\n }\n }\n\n return false;\n },\n\n getActualElement: function (element) {\n return (element instanceof domObjects.SVGElementInstance\n ? element.correspondingUseElement\n : element);\n },\n\n getScrollXY: function (relevantWindow) {\n relevantWindow = relevantWindow || win.window;\n return {\n x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft,\n y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop,\n };\n },\n\n getElementClientRect: function (element) {\n const clientRect = (element instanceof domObjects.SVGElement\n ? element.getBoundingClientRect()\n : element.getClientRects()[0]);\n\n return clientRect && {\n left : clientRect.left,\n right : clientRect.right,\n top : clientRect.top,\n bottom: clientRect.bottom,\n width : clientRect.width || clientRect.right - clientRect.left,\n height: clientRect.height || clientRect.bottom - clientRect.top,\n };\n },\n\n getElementRect: function (element) {\n const clientRect = domUtils.getElementClientRect(element);\n\n if (!browser.isIOS7 && clientRect) {\n const scroll = domUtils.getScrollXY(win.getWindow(element));\n\n clientRect.left += scroll.x;\n clientRect.right += scroll.x;\n clientRect.top += scroll.y;\n clientRect.bottom += scroll.y;\n }\n\n return clientRect;\n },\n\n getPath: function (element) {\n const path = [];\n\n while (element) {\n path.push(element);\n element = domUtils.parentNode(element);\n }\n\n return path;\n },\n\n trySelector: value => {\n if (!is.string(value)) { return false; }\n\n // an exception will be raised if it is invalid\n domObjects.document.querySelector(value);\n return true;\n },\n};\n\nmodule.exports = domUtils;\n","const is = require('./is');\nconst domUtils = require('./domUtils');\nconst pExtend = require('./pointerExtend');\n\nconst { window, getWindow } = require('./window');\nconst { indexOf, contains } = require('./arr');\n\nconst useAttachEvent = ('attachEvent' in window) && !('addEventListener' in window);\nconst addEvent = useAttachEvent? 'attachEvent': 'addEventListener';\nconst removeEvent = useAttachEvent? 'detachEvent': 'removeEventListener';\nconst on = useAttachEvent? 'on': '';\n\nconst elements = [];\nconst targets = [];\nconst attachedListeners = [];\n\n// {\n// type: {\n// selectors: ['selector', ...],\n// contexts : [document, ...],\n// listeners: [[listener, capture, passive], ...]\n// }\n// }\nconst delegatedEvents = {};\n\nconst documents = [];\n\nconst supportsOptions = !useAttachEvent && (() => {\n let supported = false;\n\n window.document.createElement('div').addEventListener('test', null, {\n get capture () { supported = true; },\n });\n\n return supported;\n})();\n\nfunction add (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n let elementIndex = indexOf(elements, element);\n let target = targets[elementIndex];\n\n if (!target) {\n target = {\n events: {},\n typeCount: 0,\n };\n\n elementIndex = elements.push(element) - 1;\n targets.push(target);\n\n attachedListeners.push(useAttachEvent\n ? {\n supplied: [],\n wrapped : [],\n useCount: [],\n }\n : null);\n }\n\n if (!target.events[type]) {\n target.events[type] = [];\n target.typeCount++;\n }\n\n if (!contains(target.events[type], listener)) {\n let ret;\n\n if (useAttachEvent) {\n const { supplied, wrapped, useCount } = attachedListeners[elementIndex];\n const listenerIndex = indexOf(supplied, listener);\n\n const wrappedListener = wrapped[listenerIndex] || function (event) {\n if (!event.immediatePropagationStopped) {\n event.target = event.srcElement;\n event.currentTarget = element;\n\n event.preventDefault = event.preventDefault || preventDef;\n event.stopPropagation = event.stopPropagation || stopProp;\n event.stopImmediatePropagation = event.stopImmediatePropagation || stopImmProp;\n\n if (/mouse|click/.test(event.type)) {\n event.pageX = event.clientX + getWindow(element).document.documentElement.scrollLeft;\n event.pageY = event.clientY + getWindow(element).document.documentElement.scrollTop;\n }\n\n listener(event);\n }\n };\n\n ret = element[addEvent](on + type, wrappedListener, !!options.capture);\n\n if (listenerIndex === -1) {\n supplied.push(listener);\n wrapped.push(wrappedListener);\n useCount.push(1);\n }\n else {\n useCount[listenerIndex]++;\n }\n }\n else {\n ret = element[addEvent](type, listener, supportsOptions? options : !!options.capture);\n }\n target.events[type].push(listener);\n\n return ret;\n }\n}\n\nfunction remove (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const elementIndex = indexOf(elements, element);\n const target = targets[elementIndex];\n\n if (!target || !target.events) {\n return;\n }\n\n let wrappedListener = listener;\n let listeners;\n let listenerIndex;\n\n if (useAttachEvent) {\n listeners = attachedListeners[elementIndex];\n listenerIndex = indexOf(listeners.supplied, listener);\n wrappedListener = listeners.wrapped[listenerIndex];\n }\n\n if (type === 'all') {\n for (type in target.events) {\n if (target.events.hasOwnProperty(type)) {\n remove(element, type, 'all');\n }\n }\n return;\n }\n\n if (target.events[type]) {\n const len = target.events[type].length;\n\n if (listener === 'all') {\n for (let i = 0; i < len; i++) {\n remove(element, type, target.events[type][i], options);\n }\n return;\n }\n else {\n for (let i = 0; i < len; i++) {\n if (target.events[type][i] === listener) {\n element[removeEvent](on + type, wrappedListener, supportsOptions? options : !!options.capture);\n target.events[type].splice(i, 1);\n\n if (useAttachEvent && listeners) {\n listeners.useCount[listenerIndex]--;\n if (listeners.useCount[listenerIndex] === 0) {\n listeners.supplied.splice(listenerIndex, 1);\n listeners.wrapped.splice(listenerIndex, 1);\n listeners.useCount.splice(listenerIndex, 1);\n }\n }\n\n break;\n }\n }\n }\n\n if (target.events[type] && target.events[type].length === 0) {\n target.events[type] = null;\n target.typeCount--;\n }\n }\n\n if (!target.typeCount) {\n targets.splice(elementIndex, 1);\n elements.splice(elementIndex, 1);\n attachedListeners.splice(elementIndex, 1);\n }\n}\n\nfunction addDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n if (!delegatedEvents[type]) {\n delegatedEvents[type] = {\n selectors: [],\n contexts : [],\n listeners: [],\n };\n\n // add delegate listener functions\n for (let i = 0; i < documents.length; i++) {\n add(documents[i], type, delegateListener);\n add(documents[i], type, delegateUseCapture, true);\n }\n }\n\n const delegated = delegatedEvents[type];\n let index;\n\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n break;\n }\n }\n\n if (index === -1) {\n index = delegated.selectors.length;\n\n delegated.selectors.push(selector);\n delegated.contexts .push(context);\n delegated.listeners.push([]);\n }\n\n // keep listener and capture and passive flags\n delegated.listeners[index].push([listener, !!options.capture, options.passive]);\n}\n\nfunction removeDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const delegated = delegatedEvents[type];\n let matchFound = false;\n let index;\n\n if (!delegated) { return; }\n\n // count from last index of delegated to 0\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n // look for matching selector and context Node\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n\n const listeners = delegated.listeners[index];\n\n // each item of the listeners array is an array: [function, capture, passive]\n for (let i = listeners.length - 1; i >= 0; i--) {\n const [fn, capture, passive] = listeners[i];\n\n // check if the listener functions and capture and passive flags match\n if (fn === listener && capture === !!options.capture && passive === options.passive) {\n // remove the listener from the array of listeners\n listeners.splice(i, 1);\n\n // if all listeners for this interactable have been removed\n // remove the interactable from the delegated arrays\n if (!listeners.length) {\n delegated.selectors.splice(index, 1);\n delegated.contexts .splice(index, 1);\n delegated.listeners.splice(index, 1);\n\n // remove delegate function from context\n remove(context, type, delegateListener);\n remove(context, type, delegateUseCapture, true);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegatedEvents[type] = null;\n }\n }\n\n // only remove one listener\n matchFound = true;\n break;\n }\n }\n\n if (matchFound) { break; }\n }\n }\n}\n\n// bound to the interactable context when a DOM event\n// listener is added to a selector interactable\nfunction delegateListener (event, optionalArg) {\n const options = getOptions(optionalArg);\n const fakeEvent = {};\n const delegated = delegatedEvents[event.type];\n const eventTarget = (domUtils.getActualElement(event.path\n ? event.path[0]\n : event.target));\n let element = eventTarget;\n\n // duplicate the event so that currentTarget can be changed\n pExtend(fakeEvent, event);\n\n fakeEvent.originalEvent = event;\n fakeEvent.preventDefault = preventOriginalDefault;\n\n // climb up document tree looking for selector matches\n while (is.element(element)) {\n for (let i = 0; i < delegated.selectors.length; i++) {\n const selector = delegated.selectors[i];\n const context = delegated.contexts[i];\n\n if (domUtils.matchesSelector(element, selector)\n && domUtils.nodeContains(context, eventTarget)\n && domUtils.nodeContains(context, element)) {\n\n const listeners = delegated.listeners[i];\n\n fakeEvent.currentTarget = element;\n\n for (let j = 0; j < listeners.length; j++) {\n const [fn, capture, passive] = listeners[j];\n\n if (capture === !!options.capture && passive === options.passive) {\n fn(fakeEvent);\n }\n }\n }\n }\n\n element = domUtils.parentNode(element);\n }\n}\n\nfunction delegateUseCapture (event) {\n return delegateListener.call(this, event, true);\n}\n\nfunction preventDef () {\n this.returnValue = false;\n}\n\nfunction preventOriginalDefault () {\n this.originalEvent.preventDefault();\n}\n\nfunction stopProp () {\n this.cancelBubble = true;\n}\n\nfunction stopImmProp () {\n this.cancelBubble = true;\n this.immediatePropagationStopped = true;\n}\n\nfunction getOptions (param) {\n return is.object(param)? param : { capture: param };\n}\n\nmodule.exports = {\n add,\n remove,\n\n addDelegate,\n removeDelegate,\n\n delegateListener,\n delegateUseCapture,\n delegatedEvents,\n documents,\n\n useAttachEvent,\n supportsOptions,\n\n _elements: elements,\n _targets: targets,\n _attachedListeners: attachedListeners,\n};\n","module.exports = function extend (dest, source) {\n for (const prop in source) {\n dest[prop] = source[prop];\n }\n return dest;\n};\n","const {\n resolveRectLike,\n rectToXY,\n} = require('./rect');\n\nmodule.exports = function (target, element, action) {\n const actionOptions = target.options[action];\n const actionOrigin = actionOptions && actionOptions.origin;\n const origin = actionOrigin || target.options.origin;\n\n const originRect = resolveRectLike(origin, target, element, [target && element]);\n\n return rectToXY(originRect) || { x: 0, y: 0 };\n};\n","module.exports = (x, y) => Math.sqrt(x * x + y * y);\n","const extend = require('./extend');\nconst win = require('./window');\n\nconst utils = {\n warnOnce: function (method, message) {\n let warned = false;\n\n return function () {\n if (!warned) {\n win.window.console.warn(message);\n warned = true;\n }\n\n return method.apply(this, arguments);\n };\n },\n\n // http://stackoverflow.com/a/5634528/2280888\n _getQBezierValue: function (t, p1, p2, p3) {\n const iT = 1 - t;\n return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3;\n },\n\n getQuadraticCurvePoint: function (startX, startY, cpX, cpY, endX, endY, position) {\n return {\n x: utils._getQBezierValue(position, startX, cpX, endX),\n y: utils._getQBezierValue(position, startY, cpY, endY),\n };\n },\n\n // http://gizma.com/easing/\n easeOutQuad: function (t, b, c, d) {\n t /= d;\n return -c * t*(t-2) + b;\n },\n\n copyAction: function (dest, src) {\n dest.name = src.name;\n dest.axis = src.axis;\n dest.edges = src.edges;\n\n return dest;\n },\n\n is : require('./is'),\n extend : extend,\n hypot : require('./hypot'),\n getOriginXY: require('./getOriginXY'),\n};\n\nextend(utils, require('./arr'));\nextend(utils, require('./domUtils'));\nextend(utils, require('./pointerUtils'));\nextend(utils, require('./rect'));\n\nmodule.exports = utils;\n","const scope = require('../scope');\nconst utils = require('./index');\n\nconst finder = {\n methodOrder: [ 'simulationResume', 'mouseOrPen', 'hasPointer', 'idle' ],\n\n search: function (pointer, eventType, eventTarget) {\n const pointerType = utils.getPointerType(pointer);\n const pointerId = utils.getPointerId(pointer);\n const details = { pointer, pointerId, pointerType, eventType, eventTarget };\n\n for (const method of finder.methodOrder) {\n const interaction = finder[method](details);\n\n if (interaction) {\n return interaction;\n }\n }\n },\n\n // try to resume simulation with a new pointer\n simulationResume: function ({ pointerType, eventType, eventTarget }) {\n if (!/down|start/i.test(eventType)) {\n return null;\n }\n\n for (const interaction of scope.interactions) {\n let element = eventTarget;\n\n if (interaction.simulation && interaction.simulation.allowResume\n && (interaction.pointerType === pointerType)) {\n while (element) {\n // if the element is the interaction element\n if (element === interaction.element) {\n return interaction;\n }\n element = utils.parentNode(element);\n }\n }\n }\n\n return null;\n },\n\n // if it's a mouse or pen interaction\n mouseOrPen: function ({ pointerId, pointerType, eventType }) {\n if (pointerType !== 'mouse' && pointerType !== 'pen') {\n return null;\n }\n\n let firstNonActive;\n\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType) {\n // if it's a down event, skip interactions with running simulations\n if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; }\n\n // if the interaction is active, return it immediately\n if (interaction.interacting()) {\n return interaction;\n }\n // otherwise save it and look for another active interaction\n else if (!firstNonActive) {\n firstNonActive = interaction;\n }\n }\n }\n\n // if no active mouse interaction was found use the first inactive mouse\n // interaction\n if (firstNonActive) {\n return firstNonActive;\n }\n\n // find any mouse or pen interaction.\n // ignore the interaction if the eventType is a *down, and a simulation\n // is active\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType && !(/down/i.test(eventType) && interaction.simulation)) {\n return interaction;\n }\n }\n\n return null;\n },\n\n // get interaction that has this pointer\n hasPointer: function ({ pointerId }) {\n for (const interaction of scope.interactions) {\n if (utils.contains(interaction.pointerIds, pointerId)) {\n return interaction;\n }\n }\n },\n\n // get first idle interaction with a matching pointerType\n idle: function ({ pointerType }) {\n for (const interaction of scope.interactions) {\n // if there's already a pointer held down\n if (interaction.pointerIds.length === 1) {\n const target = interaction.target;\n // don't add this pointer if there is a target interactable and it\n // isn't gesturable\n if (target && !target.options.gesture.enabled) {\n continue;\n }\n }\n // maximum of 2 pointers per interaction\n else if (interaction.pointerIds.length >= 2) {\n continue;\n }\n\n if (!interaction.interacting() && (pointerType === interaction.pointerType)) {\n return interaction;\n }\n }\n\n return null;\n },\n};\n\nmodule.exports = finder;\n","const win = require('./window');\nconst isWindow = require('./isWindow');\n\nconst is = {\n array : () => {},\n\n window : thing => thing === win.window || isWindow(thing),\n\n docFrag : thing => is.object(thing) && thing.nodeType === 11,\n\n object : thing => !!thing && (typeof thing === 'object'),\n\n function: thing => typeof thing === 'function',\n\n number : thing => typeof thing === 'number' ,\n\n bool : thing => typeof thing === 'boolean' ,\n\n string : thing => typeof thing === 'string' ,\n\n element: thing => {\n if (!thing || (typeof thing !== 'object')) { return false; }\n\n const _window = win.getWindow(thing) || win.window;\n\n return (/object|function/.test(typeof _window.Element)\n ? thing instanceof _window.Element //DOM2\n : thing.nodeType === 1 && typeof thing.nodeName === 'string');\n },\n};\n\nis.array = thing => (is.object(thing)\n && (typeof thing.length !== 'undefined')\n && is.function(thing.splice));\n\nmodule.exports = is;\n","module.exports = (thing) => !!(thing && thing.Window) && (thing instanceof thing.Window);\n","function pointerExtend (dest, source) {\n for (const prop in source) {\n const prefixedPropREs = module.exports.prefixedPropREs;\n let deprecated = false;\n\n // skip deprecated prefixed properties\n for (const vendor in prefixedPropREs) {\n if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) {\n deprecated = true;\n break;\n }\n }\n\n if (!deprecated && typeof source[prop] !== 'function') {\n dest[prop] = source[prop];\n }\n }\n return dest;\n}\n\npointerExtend.prefixedPropREs = {\n webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/,\n};\n\nmodule.exports = pointerExtend;\n","const hypot = require('./hypot');\nconst browser = require('./browser');\nconst dom = require('./domObjects');\nconst domUtils = require('./domUtils');\nconst domObjects = require('./domObjects');\nconst is = require('./is');\nconst pointerExtend = require('./pointerExtend');\n\nconst pointerUtils = {\n copyCoords: function (dest, src) {\n dest.page = dest.page || {};\n dest.page.x = src.page.x;\n dest.page.y = src.page.y;\n\n dest.client = dest.client || {};\n dest.client.x = src.client.x;\n dest.client.y = src.client.y;\n\n dest.timeStamp = src.timeStamp;\n },\n\n setCoordDeltas: function (targetObj, prev, cur) {\n targetObj.page.x = cur.page.x - prev.page.x;\n targetObj.page.y = cur.page.y - prev.page.y;\n targetObj.client.x = cur.client.x - prev.client.x;\n targetObj.client.y = cur.client.y - prev.client.y;\n targetObj.timeStamp = cur.timeStamp - prev.timeStamp;\n\n // set pointer velocity\n const dt = Math.max(targetObj.timeStamp / 1000, 0.001);\n\n targetObj.page.speed = hypot(targetObj.page.x, targetObj.page.y) / dt;\n targetObj.page.vx = targetObj.page.x / dt;\n targetObj.page.vy = targetObj.page.y / dt;\n\n targetObj.client.speed = hypot(targetObj.client.x, targetObj.page.y) / dt;\n targetObj.client.vx = targetObj.client.x / dt;\n targetObj.client.vy = targetObj.client.y / dt;\n },\n\n isNativePointer: function (pointer) {\n return (pointer instanceof dom.Event || pointer instanceof dom.Touch);\n },\n\n // Get specified X/Y coords for mouse or event.touches[0]\n getXY: function (type, pointer, xy) {\n xy = xy || {};\n type = type || 'page';\n\n xy.x = pointer[type + 'X'];\n xy.y = pointer[type + 'Y'];\n\n return xy;\n },\n\n getPageXY: function (pointer, page) {\n page = page || {};\n\n // Opera Mobile handles the viewport and scrolling oddly\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n pointerUtils.getXY('screen', pointer, page);\n\n page.x += window.scrollX;\n page.y += window.scrollY;\n }\n else {\n pointerUtils.getXY('page', pointer, page);\n }\n\n return page;\n },\n\n getClientXY: function (pointer, client) {\n client = client || {};\n\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n // Opera Mobile handles the viewport and scrolling oddly\n pointerUtils.getXY('screen', pointer, client);\n }\n else {\n pointerUtils.getXY('client', pointer, client);\n }\n\n return client;\n },\n\n getPointerId: function (pointer) {\n return is.number(pointer.pointerId)? pointer.pointerId : pointer.identifier;\n },\n\n setCoords: function (targetObj, pointers, timeStamp) {\n const pointer = (pointers.length > 1\n ? pointerUtils.pointerAverage(pointers)\n : pointers[0]);\n\n const tmpXY = {};\n\n pointerUtils.getPageXY(pointer, tmpXY);\n targetObj.page.x = tmpXY.x;\n targetObj.page.y = tmpXY.y;\n\n pointerUtils.getClientXY(pointer, tmpXY);\n targetObj.client.x = tmpXY.x;\n targetObj.client.y = tmpXY.y;\n\n targetObj.timeStamp = is.number(timeStamp) ? timeStamp :new Date().getTime();\n },\n\n pointerExtend: pointerExtend,\n\n getTouchPair: function (event) {\n const touches = [];\n\n // array of touches is supplied\n if (is.array(event)) {\n touches[0] = event[0];\n touches[1] = event[1];\n }\n // an event\n else {\n if (event.type === 'touchend') {\n if (event.touches.length === 1) {\n touches[0] = event.touches[0];\n touches[1] = event.changedTouches[0];\n }\n else if (event.touches.length === 0) {\n touches[0] = event.changedTouches[0];\n touches[1] = event.changedTouches[1];\n }\n }\n else {\n touches[0] = event.touches[0];\n touches[1] = event.touches[1];\n }\n }\n\n return touches;\n },\n\n pointerAverage: function (pointers) {\n const average = {\n pageX : 0,\n pageY : 0,\n clientX: 0,\n clientY: 0,\n screenX: 0,\n screenY: 0,\n };\n\n for (const pointer of pointers) {\n for (const prop in average) {\n average[prop] += pointer[prop];\n }\n }\n for (const prop in average) {\n average[prop] /= pointers.length;\n }\n\n return average;\n },\n\n touchBBox: function (event) {\n if (!event.length && !(event.touches && event.touches.length > 1)) {\n return;\n }\n\n const touches = pointerUtils.getTouchPair(event);\n const minX = Math.min(touches[0].pageX, touches[1].pageX);\n const minY = Math.min(touches[0].pageY, touches[1].pageY);\n const maxX = Math.max(touches[0].pageX, touches[1].pageX);\n const maxY = Math.max(touches[0].pageY, touches[1].pageY);\n\n return {\n x: minX,\n y: minY,\n left: minX,\n top: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n },\n\n touchDistance: function (event, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n\n\n const dx = touches[0][sourceX] - touches[1][sourceX];\n const dy = touches[0][sourceY] - touches[1][sourceY];\n\n return hypot(dx, dy);\n },\n\n touchAngle: function (event, prevAngle, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n const dx = touches[1][sourceX] - touches[0][sourceX];\n const dy = touches[1][sourceY] - touches[0][sourceY];\n const angle = 180 * Math.atan2(dy , dx) / Math.PI;\n\n return angle;\n },\n\n getPointerType: function (pointer) {\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : is.number(pointer.pointerType)\n ? [undefined, undefined,'touch', 'pen', 'mouse'][pointer.pointerType]\n // if the PointerEvent API isn't available, then the \"pointer\" must\n // be either a MouseEvent, TouchEvent, or Touch object\n : /touch/.test(pointer.type) || pointer instanceof domObjects.Touch\n ? 'touch'\n : 'mouse';\n },\n\n // [ event.target, event.currentTarget ]\n getEventTargets: function (event) {\n return [\n domUtils.getActualElement(event.path ? event.path[0] : event.target),\n domUtils.getActualElement(event.currentTarget),\n ];\n },\n};\n\nmodule.exports = pointerUtils;\n","const { window } = require('./window');\n\nconst vendors = ['ms', 'moz', 'webkit', 'o'];\nlet lastTime = 0;\nlet request;\nlet cancel;\n\nfor (let x = 0; x < vendors.length && !window.requestAnimationFrame; x++) {\n request = window[vendors[x] + 'RequestAnimationFrame'];\n cancel = window[vendors[x] +'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n}\n\nif (!request) {\n request = function (callback) {\n const currTime = new Date().getTime();\n const timeToCall = Math.max(0, 16 - (currTime - lastTime));\n const id = setTimeout(function () { callback(currTime + timeToCall); },\n timeToCall);\n\n lastTime = currTime + timeToCall;\n return id;\n };\n}\n\nif (!cancel) {\n cancel = function (id) {\n clearTimeout(id);\n };\n}\n\nmodule.exports = {\n request,\n cancel,\n};\n","const extend = require('./extend');\nconst is = require('./is');\nconst {\n closest,\n parentNode,\n getElementRect,\n} = require('./domUtils');\n\nconst rectUtils = {\n getStringOptionResult: function (value, interactable, element) {\n if (!is.string(value)) {\n return null;\n }\n\n if (value === 'parent') {\n value = parentNode(element);\n }\n else if (value === 'self') {\n value = interactable.getRect(element);\n }\n else {\n value = closest(element, value);\n }\n\n return value;\n },\n\n resolveRectLike: function (value, interactable, element, functionArgs) {\n value = rectUtils.getStringOptionResult(value, interactable, element) || value;\n\n if (is.function(value)) {\n value = value.apply(null, functionArgs);\n }\n\n if (is.element(value)) {\n value = getElementRect(value);\n }\n\n return value;\n },\n\n rectToXY: function (rect) {\n return rect && {\n x: 'x' in rect ? rect.x : rect.left,\n y: 'y' in rect ? rect.y : rect.top,\n };\n },\n\n xywhToTlbr: function (rect) {\n if (rect && !('left' in rect && 'top' in rect)) {\n rect = extend({}, rect);\n\n rect.left = rect.x || 0;\n rect.top = rect.y || 0;\n rect.right = rect.right || (rect.left + rect.width);\n rect.bottom = rect.bottom || (rect.top + rect.height);\n }\n\n return rect;\n },\n\n tlbrToXywh: function (rect) {\n if (rect && !('x' in rect && 'y' in rect)) {\n rect = extend({}, rect);\n\n rect.x = rect.left || 0;\n rect.top = rect.top || 0;\n rect.width = rect.width || (rect.right - rect.x);\n rect.height = rect.height || (rect.bottom - rect.y);\n }\n\n return rect;\n },\n};\n\nmodule.exports = rectUtils;\n","const win = module.exports;\nconst isWindow = require('./isWindow');\n\nfunction init (window) {\n // get wrapped window if using Shadow DOM polyfill\n\n win.realWindow = window;\n\n // create a TextNode\n const el = window.document.createTextNode('');\n\n // check if it's wrapped by a polyfill\n if (el.ownerDocument !== window.document\n && typeof window.wrap === 'function'\n && window.wrap(el) === el) {\n // use wrapped window\n window = window.wrap(window);\n }\n\n win.window = window;\n}\n\nif (typeof window === 'undefined') {\n win.window = undefined;\n win.realWindow = undefined;\n}\nelse {\n init(window);\n}\n\nwin.getWindow = function getWindow (node) {\n if (isWindow(node)) {\n return node;\n }\n\n const rootNode = (node.ownerDocument || node);\n\n return rootNode.defaultView || rootNode.parentWindow || win.window;\n};\n\nwin.init = init;\n"]} \ No newline at end of file diff --git a/package.json b/package.json index 76f3e9969..f39704e99 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "interactjs", - "version": "1.3.0-alpha.3+sha.9595c40", + "version": "1.3.0-alpha.4+sha.7970416", "repository": { "type": "git", "url": "https://github.com/taye/interact.js.git"
- Interactable.context()⚓➭ + Interactable.context()⚓➭ @@ -1146,7 +1146,7 @@ Interactable.context() - Interactable.fire(iEvent)⚓➭ + Interactable.fire(iEvent)⚓➭ @@ -1207,7 +1207,7 @@ Parameters - Interactable.on(eventType, listener, [options])⚓➭ + Interactable.on(eventType, listener, [options])⚓➭ @@ -1273,7 +1273,7 @@ Parameters - Interactable.off(eventType, listener, [options])⚓➭ + Interactable.off(eventType, listener, [options])⚓➭ @@ -1339,7 +1339,7 @@ Parameters - Interactable.set(options)⚓➭ + Interactable.set(options)⚓➭ @@ -1399,7 +1399,7 @@ Parameters - Interactable.unset()⚓➭ + Interactable.unset()⚓➭ @@ -1442,7 +1442,7 @@ Interactable.unset() - Interactable.actionChecker([checker])⚓➭ + Interactable.actionChecker([checker])⚓➭ @@ -1542,7 +1542,7 @@ Parameters - Interactable.styleCursor([newValue])⚓➭ + Interactable.styleCursor([newValue])⚓➭ @@ -1605,7 +1605,7 @@ Parameters - interact.maxInteractions([newValue])⚓➭ + interact.maxInteractions([newValue])⚓➭ @@ -1652,7 +1652,7 @@ Parameters - Interactable.preventDefault([newValue])⚓➭ + Interactable.preventDefault([newValue])⚓➭ @@ -1718,7 +1718,7 @@ Parameters - interact(element)⚓➭ + interact(element)⚓➭ @@ -1821,7 +1821,7 @@ Usage - interact.isSet(element)⚓➭ + interact.isSet(element)⚓➭ @@ -1881,7 +1881,7 @@ Parameters - interact.on(type, listener, [options])⚓➭ + interact.on(type, listener, [options])⚓➭ @@ -1948,7 +1948,7 @@ Parameters - interact.off(type, listener, [options])⚓➭ + interact.off(type, listener, [options])⚓➭ @@ -2014,7 +2014,7 @@ Parameters - interact.debug()⚓➭ + interact.debug()⚓➭ @@ -2056,7 +2056,7 @@ interact.debug() - interact.supportsTouch()⚓➭ + interact.supportsTouch()⚓➭ @@ -2097,7 +2097,7 @@ interact.supportsTouch() - interact.supportsPointerEvent()⚓➭ + interact.supportsPointerEvent()⚓➭ @@ -2138,7 +2138,7 @@ interact.supportsPointerEvent() - interact.stop(event)⚓➭ + interact.stop(event)⚓➭ @@ -2198,7 +2198,7 @@ Parameters - interact.pointerMoveTolerance([newValue])⚓➭ + interact.pointerMoveTolerance([newValue])⚓➭ @@ -2261,7 +2261,7 @@ Parameters - Interaction.start(action, target, element)⚓➭ + Interaction.start(action, target, element)⚓➭ @@ -2356,7 +2356,7 @@ Parameters - Interaction.doMove()⚓➭ + Interaction.doMove()⚓➭ @@ -2403,7 +2403,7 @@ Interaction.doMove() - Interaction.end([event])⚓➭ + Interaction.end([event])⚓➭ diff --git a/dist/interact.js b/dist/interact.js index e8ae35c3b..c78a3c751 100644 --- a/dist/interact.js +++ b/dist/interact.js @@ -1,5 +1,5 @@ /** - * interact.js v1.3.0-alpha.3+sha.9595c40 + * interact.js v1.3.0-alpha.4+sha.7970416-dirty * * Copyright (c) 2012-2017 Taye Adeyemi * Open source under the MIT License. @@ -816,6 +816,7 @@ var scope = require('./scope'); var utils = require('./utils'); var events = require('./utils/events'); var browser = require('./utils/browser'); +var domObjects = require('./utils/domObjects'); var finder = require('./utils/interactionFinder'); var signals = require('./utils/Signals').new(); @@ -829,7 +830,9 @@ var prevTouchTime = 0; scope.interactions = []; var Interaction = function () { - function Interaction() { + function Interaction(_ref) { + var pointerType = _ref.pointerType; + _classCallCheck(this, Interaction); this.target = null; // current interactable being interacted with @@ -886,7 +889,7 @@ var Interaction = function () { this.pointerWasMoved = false; this._interacting = false; - this.mouse = false; + this.pointerType = pointerType; signals.fire('new', this); @@ -1130,6 +1133,11 @@ var Interaction = function () { }; Interaction.prototype.getPointerIndex = function getPointerIndex(pointer) { + // mouse and pen interactions may have only one pointer + if (this.pointerType === 'mouse' || this.pointerType === 'pen') { + return 0; + } + return utils.indexOf(this.pointerIds, utils.getPointerId(pointer)); }; @@ -1161,8 +1169,7 @@ var Interaction = function () { }; Interaction.prototype.removePointer = function removePointer(pointer, event) { - var id = utils.getPointerId(pointer); - var index = this.mouse ? 0 : utils.indexOf(this.pointerIds, id); + var index = this.getPointerIndex(pointer); if (index === -1) { return; @@ -1197,6 +1204,8 @@ for (var i = 0, len = methodNames.length; i < len; i++) { function doOnInteractions(method) { return function (event) { + var pointerType = utils.getPointerType(event); + var _utils$getEventTarget = utils.getEventTargets(event), eventTarget = _utils$getEventTarget[0], curEventTarget = _utils$getEventTarget[1]; @@ -1210,7 +1219,7 @@ function doOnInteractions(method) { var pointer = event.changedTouches[_i]; var interaction = finder.search(pointer, event.type, eventTarget); - matches.push([pointer, interaction || new Interaction()]); + matches.push([pointer, interaction || new Interaction({ pointerType: pointerType })]); } } else { var invalidPointer = false; @@ -1218,7 +1227,7 @@ function doOnInteractions(method) { if (!browser.supportsPointerEvent && /mouse/.test(event.type)) { // ignore mouse events while touch interactions are active for (var _i2 = 0; _i2 < scope.interactions.length && !invalidPointer; _i2++) { - invalidPointer = !scope.interactions[_i2].mouse && scope.interactions[_i2].pointerIsDown; + invalidPointer = scope.interactions[_i2].pointerType !== 'mouse' && scope.interactions[_i2].pointerIsDown; } // try to ignore mouse events that are simulated by the browser @@ -1232,11 +1241,7 @@ function doOnInteractions(method) { var _interaction = finder.search(event, event.type, eventTarget); if (!_interaction) { - - _interaction = new Interaction(); - _interaction.mouse = /mouse/i.test(event.pointerType || event.type) - // MSPointerEvent.MSPOINTER_TYPE_MOUSE - || event.pointerType === 4 || !event.pointerType; + _interaction = new Interaction({ pointerType: pointerType }); } matches.push([event, _interaction]); @@ -1244,20 +1249,20 @@ function doOnInteractions(method) { } for (var _iterator = matches, _isArray = Array.isArray(_iterator), _i3 = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { - var _ref; + var _ref2; if (_isArray) { if (_i3 >= _iterator.length) break; - _ref = _iterator[_i3++]; + _ref2 = _iterator[_i3++]; } else { _i3 = _iterator.next(); if (_i3.done) break; - _ref = _i3.value; + _ref2 = _i3.value; } - var _ref2 = _ref, - _pointer = _ref2[0], - _interaction2 = _ref2[1]; + var _ref3 = _ref2, + _pointer = _ref3[0], + _interaction2 = _ref3[1]; _interaction2._updateEventTargets(eventTarget, curEventTarget); _interaction2[method](_pointer, event, eventTarget, curEventTarget); @@ -1277,7 +1282,7 @@ function endAll(event) { var docEvents = {/* 'eventType': listenerFunc */}; var pEventTypes = browser.pEventTypes; -if (scope.PointerEvent) { +if (domObjects.PointerEvent) { docEvents[pEventTypes.down] = listeners.pointerDown; docEvents[pEventTypes.move] = listeners.pointerMove; docEvents[pEventTypes.up] = listeners.pointerUp; @@ -1295,8 +1300,8 @@ if (scope.PointerEvent) { docEvents.blur = endAll; -function onDocSignal(_ref3, signalName) { - var doc = _ref3.doc; +function onDocSignal(_ref4, signalName) { + var doc = _ref4.doc; var eventMethod = signalName.indexOf('add') === 0 ? events.add : events.remove; @@ -1311,14 +1316,14 @@ function onDocSignal(_ref3, signalName) { } } -signals.on('update-pointer-down', function (_ref4) { - var interaction = _ref4.interaction, - pointer = _ref4.pointer, - pointerId = _ref4.pointerId, - pointerIndex = _ref4.pointerIndex, - event = _ref4.event, - eventTarget = _ref4.eventTarget, - down = _ref4.down; +signals.on('update-pointer-down', function (_ref5) { + var interaction = _ref5.interaction, + pointer = _ref5.pointer, + pointerId = _ref5.pointerId, + pointerIndex = _ref5.pointerIndex, + event = _ref5.event, + eventTarget = _ref5.eventTarget, + down = _ref5.down; interaction.pointerIds[pointerIndex] = pointerId; interaction.pointers[pointerIndex] = pointer; @@ -1355,7 +1360,7 @@ scope.endAllInteractions = endAll; module.exports = Interaction; -},{"./scope":34,"./utils":44,"./utils/Signals":35,"./utils/browser":37,"./utils/events":40,"./utils/interactionFinder":45}],6:[function(require,module,exports){ +},{"./scope":34,"./utils":44,"./utils/Signals":35,"./utils/browser":37,"./utils/domObjects":38,"./utils/events":40,"./utils/interactionFinder":45}],6:[function(require,module,exports){ 'use strict'; var Interaction = require('../Interaction'); @@ -5460,7 +5465,7 @@ module.exports = function () { this.originalEvent = event; this.type = type; this.pointerId = pointerUtils.getPointerId(pointer); - this.pointerType = pointerUtils.getPointerType(pointer, interaction); + this.pointerType = pointerUtils.getPointerType(pointer); this.target = eventTarget; this.currentTarget = null; @@ -5758,8 +5763,10 @@ Interaction.signals.on('down', function (_ref6) { timer.duration = minDuration; timer.timeout = setTimeout(function () { fire({ - interaction: interaction, eventCopy: eventCopy, eventTarget: eventTarget, + interaction: interaction, + eventTarget: eventTarget, pointer: browser.isIE8 ? eventCopy : pointer, + event: eventCopy, type: 'hold' }); }, minDuration); @@ -6946,17 +6953,14 @@ module.exports = utils; var scope = require('../scope'); var utils = require('./index'); -var browser = require('./browser'); var finder = { - methodOrder: ['simulationResume', 'mouse', 'hasPointer', 'idle'], + methodOrder: ['simulationResume', 'mouseOrPen', 'hasPointer', 'idle'], search: function search(pointer, eventType, eventTarget) { - var mouseEvent = /mouse/i.test(pointer.pointerType || eventType) - // MSPointerEvent.MSPOINTER_TYPE_MOUSE - || pointer.pointerType === 4; + var pointerType = utils.getPointerType(pointer); var pointerId = utils.getPointerId(pointer); - var details = { pointer: pointer, pointerId: pointerId, mouseEvent: mouseEvent, eventType: eventType, eventTarget: eventTarget }; + var details = { pointer: pointer, pointerId: pointerId, pointerType: pointerType, eventType: eventType, eventTarget: eventTarget }; for (var _iterator = finder.methodOrder, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { var _ref; @@ -6982,7 +6986,7 @@ var finder = { // try to resume simulation with a new pointer simulationResume: function simulationResume(_ref2) { - var mouseEvent = _ref2.mouseEvent, + var pointerType = _ref2.pointerType, eventType = _ref2.eventType, eventTarget = _ref2.eventTarget; @@ -7006,7 +7010,7 @@ var finder = { var element = eventTarget; - if (interaction.simulation && interaction.simulation.allowResume && interaction.mouse === mouseEvent) { + if (interaction.simulation && interaction.simulation.allowResume && interaction.pointerType === pointerType) { while (element) { // if the element is the interaction element if (element === interaction.element) { @@ -7020,13 +7024,13 @@ var finder = { return null; }, - // if it's a mouse interaction - mouse: function mouse(_ref4) { + // if it's a mouse or pen interaction + mouseOrPen: function mouseOrPen(_ref4) { var pointerId = _ref4.pointerId, - mouseEvent = _ref4.mouseEvent, + pointerType = _ref4.pointerType, eventType = _ref4.eventType; - if (!mouseEvent && (browser.supportsTouch || browser.supportsPointerEvent)) { + if (pointerType !== 'mouse' && pointerType !== 'pen') { return null; } @@ -7046,7 +7050,7 @@ var finder = { var interaction = _ref5; - if (interaction.mouse) { + if (interaction.pointerType === pointerType) { // if it's a down event, skip interactions with running simulations if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; @@ -7069,8 +7073,8 @@ var finder = { return firstNonActive; } - // Find any interaction specifically for mouse. - // ignore the interaction if the eventType is a mousedown, and a simulation + // find any mouse or pen interaction. + // ignore the interaction if the eventType is a *down, and a simulation // is active for (var _iterator4 = scope.interactions, _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) { var _ref6; @@ -7086,7 +7090,7 @@ var finder = { var _interaction = _ref6; - if (_interaction.mouse && !(/down/.test(eventType) && _interaction.simulation)) { + if (_interaction.pointerType === pointerType && !(/down/i.test(eventType) && _interaction.simulation)) { return _interaction; } } @@ -7118,9 +7122,9 @@ var finder = { } }, - // get first idle interaction + // get first idle interaction with a matching pointerType idle: function idle(_ref9) { - var mouseEvent = _ref9.mouseEvent; + var pointerType = _ref9.pointerType; for (var _iterator6 = scope.interactions, _isArray6 = Array.isArray(_iterator6), _i6 = 0, _iterator6 = _isArray6 ? _iterator6 : _iterator6[Symbol.iterator]();;) { var _ref10; @@ -7150,7 +7154,7 @@ var finder = { continue; } - if (!interaction.interacting() && mouseEvent === interaction.mouse) { + if (!interaction.interacting() && pointerType === interaction.pointerType) { return interaction; } } @@ -7161,7 +7165,7 @@ var finder = { module.exports = finder; -},{"../scope":34,"./browser":37,"./index":44}],46:[function(require,module,exports){ +},{"../scope":34,"./index":44}],46:[function(require,module,exports){ 'use strict'; var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; @@ -7262,6 +7266,7 @@ var hypot = require('./hypot'); var browser = require('./browser'); var dom = require('./domObjects'); var domUtils = require('./domUtils'); +var domObjects = require('./domObjects'); var is = require('./is'); var pointerExtend = require('./pointerExtend'); @@ -7468,17 +7473,11 @@ var pointerUtils = { return angle; }, - getPointerType: function getPointerType(pointer, interaction) { - // if the PointerEvent API isn't available, then the pointer must be ither - // a MouseEvent or TouchEvent - if (interaction.mouse) { - return 'mouse'; - } - if (!browser.supportsPointerEvent) { - return 'touch'; - } - - return is.string(pointer.pointerType) ? pointer.pointerType : [undefined, undefined, 'touch', 'pen', 'mouse'][pointer.pointerType]; + getPointerType: function getPointerType(pointer) { + return is.string(pointer.pointerType) ? pointer.pointerType : is.number(pointer.pointerType) ? [undefined, undefined, 'touch', 'pen', 'mouse'][pointer.pointerType] + // if the PointerEvent API isn't available, then the "pointer" must + // be either a MouseEvent, TouchEvent, or Touch object + : /touch/.test(pointer.type) || pointer instanceof domObjects.Touch ? 'touch' : 'mouse'; }, // [ event.target, event.currentTarget ] diff --git a/dist/interact.js.map b/dist/interact.js.map index 60832b766..4f3a62ba8 100644 --- a/dist/interact.js.map +++ b/dist/interact.js.map @@ -1 +1 @@ -{"version":3,"sources":["src/header.js","node_modules/browser-pack/_prelude.js","index.js","src/Eventable.js","src/InteractEvent.js","src/Interactable.js","src/Interaction.js","src/actions/base.js","src/actions/drag.js","src/actions/drop.js","src/actions/gesture.js","src/actions/resize.js","src/autoScroll.js","src/autoStart/InteractableMethods.js","src/autoStart/base.js","src/autoStart/delay.js","src/autoStart/drag.js","src/autoStart/gesture.js","src/autoStart/resize.js","src/defaultOptions.js","src/index.js","src/inertia.js","src/interact.js","src/interactablePreventDefault.js","src/legacyBrowsers.js","src/modifiers/index.js","src/modifiers/restrict.js","src/modifiers/restrictEdges.js","src/modifiers/restrictSize.js","src/modifiers/snap.js","src/modifiers/snapSize.js","src/pointerEvents/PointerEvent.js","src/pointerEvents/base.js","src/pointerEvents/holdRepeat.js","src/pointerEvents/interactableTargets.js","src/scope.js","src/utils/Signals.js","src/utils/arr.js","src/utils/browser.js","src/utils/domObjects.js","src/utils/domUtils.js","src/utils/events.js","src/utils/extend.js","src/utils/getOriginXY.js","src/utils/hypot.js","src/utils/index.js","src/utils/interactionFinder.js","src/utils/is.js","src/utils/isWindow.js","src/utils/pointerExtend.js","src/utils/pointerUtils.js","src/utils/raf.js","src/utils/rect.js","src/utils/window.js"],"names":[],"mappings":"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","file":"interact.js","sourceRoot":"","sourcesContent":["/**\n * interact.js v1.3.0-alpha.3+sha.9595c40\n *\n * Copyright (c) 2012-2017 Taye Adeyemi \n * Open source under the MIT License.\n * https://raw.github.com/taye/interact.js/master/LICENSE\n */\n","(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o 150) {\n return null;\n }\n\n let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI;\n const overlap = 22.5;\n\n if (angle < 0) {\n angle += 360;\n }\n\n const left = 135 - overlap <= angle && angle < 225 + overlap;\n const up = 225 - overlap <= angle && angle < 315 + overlap;\n\n const right = !left && (315 - overlap <= angle || angle < 45 + overlap);\n const down = !up && 45 - overlap <= angle && angle < 135 + overlap;\n\n return {\n up,\n down,\n left,\n right,\n angle,\n speed: interaction.prevEvent.speed,\n velocity: {\n x: interaction.prevEvent.velocityX,\n y: interaction.prevEvent.velocityY,\n },\n };\n }\n\n preventDefault () {}\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n}\n\nsignals.on('set-delta', function ({ iEvent, interaction, starting, deltaSource }) {\n const prevEvent = starting? iEvent : interaction.prevEvent;\n\n if (deltaSource === 'client') {\n iEvent.dx = iEvent.clientX - prevEvent.clientX;\n iEvent.dy = iEvent.clientY - prevEvent.clientY;\n }\n else {\n iEvent.dx = iEvent.pageX - prevEvent.pageX;\n iEvent.dy = iEvent.pageY - prevEvent.pageY;\n }\n});\n\nInteractEvent.signals = signals;\n\nmodule.exports = InteractEvent;\n","const is = require('./utils/is');\nconst events = require('./utils/events');\nconst extend = require('./utils/extend');\nconst actions = require('./actions/base');\nconst scope = require('./scope');\nconst Eventable = require('./Eventable');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nconst {\n getElementRect,\n nodeContains,\n trySelector,\n} = require('./utils/domUtils');\nconst { getWindow } = require('./utils/window');\nconst { indexOf, contains } = require('./utils/arr');\nconst { wheelEvent } = require('./utils/browser');\n\n// all set interactables\nscope.interactables = [];\n\n/*\\\n * Interactable\n [ property ]\n **\n * Object type returned by @interact\n\\*/\nclass Interactable {\n constructor (target, options) {\n options = options || {};\n\n this.target = target;\n this.events = new Eventable();\n this._context = options.context || scope.document;\n this._win = getWindow(trySelector(target)? this._context : target);\n this._doc = this._win.document;\n\n signals.fire('new', {\n target,\n options,\n interactable: this,\n win: this._win,\n });\n\n scope.addDocument( this._doc, this._win );\n\n scope.interactables.push(this);\n\n this.set(options);\n }\n\n setOnEvents (action, phases) {\n const onAction = 'on' + action;\n\n if (is.function(phases.onstart) ) { this.events[onAction + 'start' ] = phases.onstart ; }\n if (is.function(phases.onmove) ) { this.events[onAction + 'move' ] = phases.onmove ; }\n if (is.function(phases.onend) ) { this.events[onAction + 'end' ] = phases.onend ; }\n if (is.function(phases.oninertiastart)) { this.events[onAction + 'inertiastart' ] = phases.oninertiastart ; }\n\n return this;\n }\n\n setPerAction (action, options) {\n // for all the default per-action options\n for (const option in options) {\n // if this option exists for this action\n if (option in defaults[action]) {\n // if the option in the options arg is an object value\n if (is.object(options[option])) {\n // duplicate the object\n this.options[action][option] = extend(this.options[action][option] || {}, options[option]);\n\n if (is.object(defaults.perAction[option]) && 'enabled' in defaults.perAction[option]) {\n this.options[action][option].enabled = options[option].enabled === false? false : true;\n }\n }\n else if (is.bool(options[option]) && is.object(defaults.perAction[option])) {\n this.options[action][option].enabled = options[option];\n }\n else if (options[option] !== undefined) {\n // or if it's not undefined, do a plain assignment\n this.options[action][option] = options[option];\n }\n }\n }\n }\n\n /*\\\n * Interactable.getRect\n [ method ]\n *\n * The default function to get an Interactables bounding rect. Can be\n * overridden using @Interactable.rectChecker.\n *\n - element (Element) #optional The element to measure.\n = (object) The object's bounding rectangle.\n o {\n o top : 0,\n o left : 0,\n o bottom: 0,\n o right : 0,\n o width : 0,\n o height: 0\n o }\n \\*/\n getRect (element) {\n element = element || this.target;\n\n if (is.string(this.target) && !(is.element(element))) {\n element = this._context.querySelector(this.target);\n }\n\n return getElementRect(element);\n }\n\n /*\\\n * Interactable.rectChecker\n [ method ]\n *\n * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n - checker (function) #optional A function which returns this Interactable's bounding rectangle. See @Interactable.getRect\n = (function | object) The checker function or this Interactable\n \\*/\n rectChecker (checker) {\n if (is.function(checker)) {\n this.getRect = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.getRect;\n\n return this;\n }\n\n return this.getRect;\n }\n\n _backCompatOption (optionName, newValue) {\n if (trySelector(newValue) || is.object(newValue)) {\n this.options[optionName] = newValue;\n\n for (const action of actions.names) {\n this.options[action][optionName] = newValue;\n }\n\n return this;\n }\n\n return this.options[optionName];\n }\n\n /*\\\n * Interactable.origin\n [ method ]\n *\n * Gets or sets the origin of the Interactable's element. The x and y\n * of the origin will be subtracted from action event coordinates.\n *\n - origin (object | string) #optional An object eg. { x: 0, y: 0 } or string 'parent', 'self' or any CSS selector\n * OR\n - origin (Element) #optional An HTML or SVG Element whose rect will be used\n **\n = (object) The current origin or this Interactable\n \\*/\n origin (newValue) {\n return this._backCompatOption('origin', newValue);\n }\n\n /*\\\n * Interactable.deltaSource\n [ method ]\n *\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n - newValue (string) #optional Use 'client' if you will be scrolling while interacting; Use 'page' if you want autoScroll to work\n = (string | object) The current deltaSource or this Interactable\n \\*/\n deltaSource (newValue) {\n if (newValue === 'page' || newValue === 'client') {\n this.options.deltaSource = newValue;\n\n return this;\n }\n\n return this.options.deltaSource;\n }\n\n /*\\\n * Interactable.context\n [ method ]\n *\n * Gets the selector context Node of the Interactable. The default is `window.document`.\n *\n = (Node) The context Node of this Interactable\n **\n \\*/\n context () {\n return this._context;\n }\n\n inContext (element) {\n return (this._context === element.ownerDocument\n || nodeContains(this._context, element));\n }\n\n /*\\\n * Interactable.fire\n [ method ]\n *\n * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n - iEvent (InteractEvent) The InteractEvent object to be fired on this Interactable\n = (Interactable) this Interactable\n \\*/\n fire (iEvent) {\n this.events.fire(iEvent);\n\n return this;\n }\n\n _onOffMultiple (method, eventType, listener, options) {\n if (is.string(eventType) && eventType.search(' ') !== -1) {\n eventType = eventType.trim().split(/ +/);\n }\n\n if (is.array(eventType)) {\n for (let i = 0; i < eventType.length; i++) {\n this[method](eventType[i], listener, options);\n }\n\n return true;\n }\n\n if (is.object(eventType)) {\n for (const prop in eventType) {\n this[method](prop, eventType[prop], listener);\n }\n\n return true;\n }\n }\n\n /*\\\n * Interactable.on\n [ method ]\n *\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n - eventType (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) This Interactable\n \\*/\n on (eventType, listener, options) {\n if (this._onOffMultiple('on', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.on(eventType, listener);\n }\n // delegated event for selector\n else if (is.string(this.target)) {\n events.addDelegate(this.target, this._context, eventType, listener, options);\n }\n else {\n events.add(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.off\n [ method ]\n *\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n - eventType (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) This Interactable\n \\*/\n off (eventType, listener, options) {\n if (this._onOffMultiple('off', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n // if it is an action event type\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.off(eventType, listener);\n }\n // delegated event\n else if (is.string(this.target)) {\n events.removeDelegate(this.target, this._context, eventType, listener, options);\n }\n // remove listener from this Interatable's element\n else {\n events.remove(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.set\n [ method ]\n *\n * Reset the options of this Interactable\n - options (object) The new settings to apply\n = (object) This Interactable\n \\*/\n set (options) {\n if (!is.object(options)) {\n options = {};\n }\n\n this.options = extend({}, defaults.base);\n\n const perActions = extend({}, defaults.perAction);\n\n for (const actionName in actions.methodDict) {\n const methodName = actions.methodDict[actionName];\n\n this.options[actionName] = extend({}, defaults[actionName]);\n\n this.setPerAction(actionName, perActions);\n\n this[methodName](options[actionName]);\n }\n\n for (const setting of Interactable.settingsMethods) {\n this.options[setting] = defaults.base[setting];\n\n if (setting in options) {\n this[setting](options[setting]);\n }\n }\n\n signals.fire('set', {\n options,\n interactable: this,\n });\n\n return this;\n }\n\n /*\\\n * Interactable.unset\n [ method ]\n *\n * Remove this interactable from the list of interactables and remove\n * it's action capabilities and event listeners\n *\n = (object) @interact\n \\*/\n unset () {\n events.remove(this.target, 'all');\n\n if (is.string(this.target)) {\n // remove delegated events\n for (const type in events.delegatedEvents) {\n const delegated = events.delegatedEvents[type];\n\n if (delegated.selectors[0] === this.target\n && delegated.contexts[0] === this._context) {\n\n delegated.selectors.splice(0, 1);\n delegated.contexts .splice(0, 1);\n delegated.listeners.splice(0, 1);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegated[type] = null;\n }\n }\n\n events.remove(this._context, type, events.delegateListener);\n events.remove(this._context, type, events.delegateUseCapture, true);\n }\n }\n else {\n events.remove(this, 'all');\n }\n\n signals.fire('unset', { interactable: this });\n\n scope.interactables.splice(indexOf(scope.interactables, this), 1);\n\n // Stop related interactions when an Interactable is unset\n for (const interaction of scope.interactions || []) {\n if (interaction.target === this && interaction.interacting()) {\n interaction.stop();\n }\n }\n\n return scope.interact;\n }\n}\n\nscope.interactables.indexOfElement = function indexOfElement (target, context) {\n context = context || scope.document;\n\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n if (interactable.target === target && interactable._context === context) {\n return i;\n }\n }\n return -1;\n};\n\nscope.interactables.get = function interactableGet (element, options, dontCheckInContext) {\n const ret = this[this.indexOfElement(element, options && options.context)];\n\n return ret && (is.string(element) || dontCheckInContext || ret.inContext(element))? ret : null;\n};\n\nscope.interactables.forEachSelector = function (callback, element) {\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n // skip non CSS selector targets and out of context elements\n if (!is.string(interactable.target)\n || (element && !interactable.inContext(element))) {\n continue;\n }\n\n const ret = callback(interactable, interactable.target, interactable._context, i, this);\n\n if (ret !== undefined) {\n return ret;\n }\n }\n};\n\n// all interact.js eventTypes\nInteractable.eventTypes = scope.eventTypes = [];\n\nInteractable.signals = signals;\n\nInteractable.settingsMethods = [ 'deltaSource', 'origin', 'preventDefault', 'rectChecker' ];\n\nmodule.exports = Interactable;\n","const scope = require('./scope');\nconst utils = require('./utils');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst finder = require('./utils/interactionFinder');\nconst signals = require('./utils/Signals').new();\n\nconst listeners = {};\nconst methodNames = [\n 'pointerDown', 'pointerMove', 'pointerUp',\n 'updatePointer', 'removePointer',\n];\n\n// for ignoring browser's simulated mouse events\nlet prevTouchTime = 0;\n\n// all active and idle interactions\nscope.interactions = [];\n\nclass Interaction {\n constructor () {\n this.target = null; // current interactable being interacted with\n this.element = null; // the target element of the interactable\n\n this.prepared = { // action that's ready to be fired on next move event\n name : null,\n axis : null,\n edges: null,\n };\n\n // keep track of added pointers\n this.pointers = [];\n this.pointerIds = [];\n this.downTargets = [];\n this.downTimes = [];\n\n // Previous native pointer move event coordinates\n this.prevCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n // current native pointer move event coordinates\n this.curCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Starting InteractEvent pointer coordinates\n this.startCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Change in coordinates and time of the pointer\n this.pointerDelta = {\n page : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n client : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n timeStamp: 0,\n };\n\n this.downEvent = null; // pointerdown/mousedown/touchstart event\n this.downPointer = {};\n\n this._eventTarget = null;\n this._curEventTarget = null;\n\n this.prevEvent = null; // previous action event\n\n this.pointerIsDown = false;\n this.pointerWasMoved = false;\n this._interacting = false;\n\n this.mouse = false;\n\n signals.fire('new', this);\n\n scope.interactions.push(this);\n }\n\n pointerDown (pointer, event, eventTarget) {\n const pointerIndex = this.updatePointer(pointer, event, true);\n\n signals.fire('down', {\n pointer,\n event,\n eventTarget,\n pointerIndex,\n interaction: this,\n });\n }\n\n /*\\\n * Interaction.start\n [ method ]\n *\n * Start an action with the given Interactable and Element as tartgets. The\n * action must be enabled for the target Interactable and an appropriate number\n * of pointers must be held down - 1 for drag/resize, 2 for gesture.\n *\n * Use it with `interactable.able({ manualStart: false })` to always\n * [start actions manually](https://github.com/taye/interact.js/issues/114)\n *\n - action (object) The action to be performed - drag, resize, etc.\n - target (Interactable) The Interactable to target\n - element (Element) The DOM Element to target\n = (object) interact\n **\n | interact(target)\n | .draggable({\n | // disable the default drag start by down->move\n | manualStart: true\n | })\n | // start dragging after the user holds the pointer down\n | .on('hold', function (event) {\n | var interaction = event.interaction;\n |\n | if (!interaction.interacting()) {\n | interaction.start({ name: 'drag' },\n | event.interactable,\n | event.currentTarget);\n | }\n | });\n \\*/\n start (action, target, element) {\n if (this.interacting()\n || !this.pointerIsDown\n || this.pointerIds.length < (action.name === 'gesture'? 2 : 1)) {\n return;\n }\n\n // if this interaction had been removed after stopping\n // add it back\n if (utils.indexOf(scope.interactions, this) === -1) {\n scope.interactions.push(this);\n }\n\n utils.copyAction(this.prepared, action);\n this.target = target;\n this.element = element;\n\n signals.fire('action-start', {\n interaction: this,\n event: this.downEvent,\n });\n }\n\n pointerMove (pointer, event, eventTarget) {\n if (!this.simulation) {\n this.updatePointer(pointer);\n utils.setCoords(this.curCoords, this.pointers);\n }\n\n const duplicateMove = (this.curCoords.page.x === this.prevCoords.page.x\n && this.curCoords.page.y === this.prevCoords.page.y\n && this.curCoords.client.x === this.prevCoords.client.x\n && this.curCoords.client.y === this.prevCoords.client.y);\n\n let dx;\n let dy;\n\n // register movement greater than pointerMoveTolerance\n if (this.pointerIsDown && !this.pointerWasMoved) {\n dx = this.curCoords.client.x - this.startCoords.client.x;\n dy = this.curCoords.client.y - this.startCoords.client.y;\n\n this.pointerWasMoved = utils.hypot(dx, dy) > Interaction.pointerMoveTolerance;\n }\n\n const signalArg = {\n pointer,\n pointerIndex: this.getPointerIndex(pointer),\n event,\n eventTarget,\n dx,\n dy,\n duplicate: duplicateMove,\n interaction: this,\n interactingBeforeMove: this.interacting(),\n };\n\n if (!duplicateMove) {\n // set pointer coordinate, time changes and speeds\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n }\n\n signals.fire('move', signalArg);\n\n if (!duplicateMove) {\n // if interacting, fire an 'action-move' signal etc\n if (this.interacting()) {\n this.doMove(signalArg);\n }\n\n if (this.pointerWasMoved) {\n utils.copyCoords(this.prevCoords, this.curCoords);\n }\n }\n }\n\n /*\\\n * Interaction.doMove\n [ method ]\n *\n * Force a move of the current action at the same coordinates. Useful if\n * snap/restrict has been changed and you want a movement with the new\n * settings.\n *\n **\n | interact(target)\n | .draggable(true)\n | .on('dragmove', function (event) {\n | if (someCondition) {\n | // change the snap settings\n | event.interactable.draggable({ snap: { targets: [] }});\n | // fire another move event with re-calculated snap\n | event.interaction.doMove();\n | }\n | });\n \\*/\n doMove (signalArg) {\n signalArg = utils.extend({\n pointer: this.pointers[0],\n event: this.prevEvent,\n eventTarget: this._eventTarget,\n interaction: this,\n }, signalArg || {});\n\n signals.fire('before-action-move', signalArg);\n\n if (!this._dontFireMove) {\n signals.fire('action-move', signalArg);\n }\n\n this._dontFireMove = false;\n }\n\n // End interact move events and stop auto-scroll unless simulation is running\n pointerUp (pointer, event, eventTarget, curEventTarget) {\n const pointerIndex = this.getPointerIndex(pointer);\n\n signals.fire(/cancel$/i.test(event.type)? 'cancel' : 'up', {\n pointer,\n pointerIndex,\n event,\n eventTarget,\n curEventTarget,\n interaction: this,\n });\n\n if (!this.simulation) {\n this.end(event);\n }\n\n this.pointerIsDown = false;\n this.removePointer(pointer, event);\n }\n\n /*\\\n * Interaction.end\n [ method ]\n *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n - event (PointerEvent) #optional\n **\n | interact(target)\n | .draggable(true)\n | .on('move', function (event) {\n | if (event.pageX > 1000) {\n | // end the current action\n | event.interaction.end();\n | // stop all further listeners from being called\n | event.stopImmediatePropagation();\n | }\n | });\n \\*/\n end (event) {\n event = event || this.prevEvent;\n\n if (this.interacting()) {\n signals.fire('action-end', {\n event,\n interaction: this,\n });\n }\n\n this.stop();\n }\n\n currentAction () {\n return this._interacting? this.prepared.name: null;\n }\n\n interacting () {\n return this._interacting;\n }\n\n stop () {\n signals.fire('stop', { interaction: this });\n\n if (this._interacting) {\n signals.fire('stop-active', { interaction: this });\n signals.fire('stop-' + this.prepared.name, { interaction: this });\n }\n\n this.target = this.element = null;\n\n this._interacting = false;\n this.prepared.name = this.prevEvent = null;\n }\n\n getPointerIndex (pointer) {\n return utils.indexOf(this.pointerIds, utils.getPointerId(pointer));\n }\n\n updatePointer (pointer, event, down = event && /(down|start)$/i.test(event.type)) {\n const id = utils.getPointerId(pointer);\n let index = this.getPointerIndex(pointer);\n\n if (index === -1) {\n index = this.pointerIds.length;\n this.pointerIds[index] = id;\n }\n\n if (down) {\n signals.fire('update-pointer-down', {\n pointer,\n event,\n down,\n pointerId: id,\n pointerIndex: index,\n interaction: this,\n });\n }\n\n this.pointers[index] = pointer;\n\n return index;\n }\n\n removePointer (pointer, event) {\n const id = utils.getPointerId(pointer);\n const index = this.mouse? 0 : utils.indexOf(this.pointerIds, id);\n\n if (index === -1) { return; }\n\n signals.fire('remove-pointer', {\n pointer,\n event,\n pointerIndex: index,\n interaction: this,\n });\n\n this.pointers .splice(index, 1);\n this.pointerIds .splice(index, 1);\n this.downTargets.splice(index, 1);\n this.downTimes .splice(index, 1);\n }\n\n _updateEventTargets (target, currentTarget) {\n this._eventTarget = target;\n this._curEventTarget = currentTarget;\n }\n}\n\nfor (let i = 0, len = methodNames.length; i < len; i++) {\n const method = methodNames[i];\n\n listeners[method] = doOnInteractions(method);\n}\n\nfunction doOnInteractions (method) {\n return (function (event) {\n const [eventTarget, curEventTarget] = utils.getEventTargets(event);\n const matches = []; // [ [pointer, interaction], ...]\n\n if (browser.supportsTouch && /touch/.test(event.type)) {\n prevTouchTime = new Date().getTime();\n\n for (let i = 0; i < event.changedTouches.length; i++) {\n const pointer = event.changedTouches[i];\n const interaction = finder.search(pointer, event.type, eventTarget);\n\n matches.push([pointer, interaction || new Interaction()]);\n }\n }\n else {\n let invalidPointer = false;\n\n if (!browser.supportsPointerEvent && /mouse/.test(event.type)) {\n // ignore mouse events while touch interactions are active\n for (let i = 0; i < scope.interactions.length && !invalidPointer; i++) {\n invalidPointer = !scope.interactions[i].mouse && scope.interactions[i].pointerIsDown;\n }\n\n // try to ignore mouse events that are simulated by the browser\n // after a touch event\n invalidPointer = invalidPointer\n || (new Date().getTime() - prevTouchTime < 500)\n // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated\n || event.timeStamp === 0;\n }\n\n if (!invalidPointer) {\n let interaction = finder.search(event, event.type, eventTarget);\n\n if (!interaction) {\n\n interaction = new Interaction();\n interaction.mouse = (/mouse/i.test(event.pointerType || event.type)\n // MSPointerEvent.MSPOINTER_TYPE_MOUSE\n || event.pointerType === 4\n || !event.pointerType);\n }\n\n matches.push([event, interaction]);\n }\n }\n\n for (const [pointer, interaction] of matches) {\n interaction._updateEventTargets(eventTarget, curEventTarget);\n interaction[method](pointer, event, eventTarget, curEventTarget);\n }\n });\n}\n\nfunction endAll (event) {\n for (let i = 0; i < scope.interactions.length; i++) {\n const interaction = scope.interactions[i];\n\n interaction.end(event);\n signals.fire('endall', { event, interaction });\n }\n}\n\nconst docEvents = { /* 'eventType': listenerFunc */ };\nconst pEventTypes = browser.pEventTypes;\n\nif (scope.PointerEvent) {\n docEvents[pEventTypes.down ] = listeners.pointerDown;\n docEvents[pEventTypes.move ] = listeners.pointerMove;\n docEvents[pEventTypes.up ] = listeners.pointerUp;\n docEvents[pEventTypes.cancel] = listeners.pointerUp;\n}\nelse {\n docEvents.mousedown = listeners.pointerDown;\n docEvents.mousemove = listeners.pointerMove;\n docEvents.mouseup = listeners.pointerUp;\n\n docEvents.touchstart = listeners.pointerDown;\n docEvents.touchmove = listeners.pointerMove;\n docEvents.touchend = listeners.pointerUp;\n docEvents.touchcancel = listeners.pointerUp;\n}\n\ndocEvents.blur = endAll;\n\nfunction onDocSignal ({ doc }, signalName) {\n const eventMethod = signalName.indexOf('add') === 0\n ? events.add : events.remove;\n\n // delegate event listener\n for (const eventType in scope.delegatedEvents) {\n eventMethod(doc, eventType, events.delegateListener);\n eventMethod(doc, eventType, events.delegateUseCapture, true);\n }\n\n for (const eventType in docEvents) {\n eventMethod(doc, eventType, docEvents[eventType]);\n }\n}\n\nsignals.on('update-pointer-down', ({ interaction, pointer, pointerId, pointerIndex, event, eventTarget, down }) => {\n interaction.pointerIds[pointerIndex] = pointerId;\n interaction.pointers[pointerIndex] = pointer;\n\n if (down) {\n interaction.pointerIsDown = true;\n }\n\n if (!interaction.interacting()) {\n utils.setCoords(interaction.startCoords, interaction.pointers);\n\n utils.copyCoords(interaction.curCoords , interaction.startCoords);\n utils.copyCoords(interaction.prevCoords, interaction.startCoords);\n\n interaction.downEvent = event;\n interaction.downTimes[pointerIndex] = interaction.curCoords.timeStamp;\n interaction.downTargets[pointerIndex] = eventTarget || event && utils.getEventTargets(event)[0];\n interaction.pointerWasMoved = false;\n\n utils.pointerExtend(interaction.downPointer, pointer);\n }\n});\n\nscope.signals.on('add-document' , onDocSignal);\nscope.signals.on('remove-document', onDocSignal);\n\nInteraction.pointerMoveTolerance = 1;\nInteraction.doOnInteractions = doOnInteractions;\nInteraction.endAll = endAll;\nInteraction.signals = signals;\nInteraction.docEvents = docEvents;\n\nscope.endAllInteractions = endAll;\n\nmodule.exports = Interaction;\n","const Interaction = require('../Interaction');\nconst InteractEvent = require('../InteractEvent');\n\nconst actions = {\n firePrepared,\n names: [],\n methodDict: {},\n};\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n interaction._interacting = true;\n firePrepared(interaction, event, 'start');\n});\n\nInteraction.signals.on('action-move', function ({ interaction, event, preEnd }) {\n firePrepared(interaction, event, 'move', preEnd);\n\n // if the action was ended in a listener\n if (!interaction.interacting()) { return false; }\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n firePrepared(interaction, event, 'end');\n});\n\nfunction firePrepared (interaction, event, phase, preEnd) {\n const actionName = interaction.prepared.name;\n\n const newEvent = new InteractEvent(interaction, event, actionName, phase, interaction.element, null, preEnd);\n\n interaction.target.fire(newEvent);\n interaction.prevEvent = newEvent;\n}\n\nmodule.exports = actions;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drag = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n startAxis : 'xy',\n lockAxis : 'xy',\n },\n\n checker: function (pointer, event, interactable) {\n const dragOptions = interactable.options.drag;\n\n return dragOptions.enabled\n ? { name: 'drag', axis: (dragOptions.lockAxis === 'start'\n ? dragOptions.startAxis\n : dragOptions.lockAxis)}\n : null;\n },\n\n getCursor: function () {\n return 'move';\n },\n};\n\nInteraction.signals.on('before-action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n interaction.curCoords.page.y = interaction.startCoords.page.y;\n interaction.curCoords.client.y = interaction.startCoords.client.y;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vx);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vx);\n interaction.pointerDelta.client.vy = 0;\n interaction.pointerDelta.page.vy = 0;\n }\n else if (axis === 'y') {\n interaction.curCoords.page.x = interaction.startCoords.page.x;\n interaction.curCoords.client.x = interaction.startCoords.client.x;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vy);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vy);\n interaction.pointerDelta.client.vx = 0;\n interaction.pointerDelta.page.vx = 0;\n }\n});\n\n// dragmove\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'dragmove') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n iEvent.pageY = interaction.startCoords.page.y;\n iEvent.clientY = interaction.startCoords.client.y;\n iEvent.dy = 0;\n }\n else if (axis === 'y') {\n iEvent.pageX = interaction.startCoords.page.x;\n iEvent.clientX = interaction.startCoords.client.x;\n iEvent.dx = 0;\n }\n});\n\n/*\\\n * Interactable.draggable\n [ method ]\n *\n * Gets or sets whether drag actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of drag events\n | var isDraggable = interact('ul li').draggable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on drag events (object makes the Interactable draggable)\n = (object) This Interactable\n | interact(element).draggable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // the axis in which the first movement must be\n | // for the drag sequence to start\n | // 'xy' by default - any direction\n | startAxis: 'x' || 'y' || 'xy',\n |\n | // 'xy' by default - don't restrict to one axis (move in any direction)\n | // 'x' or 'y' to restrict movement to either axis\n | // 'start' to restrict movement to the axis the drag started in\n | lockAxis: 'x' || 'y' || 'xy' || 'start',\n |\n | // max number of drags that can happen concurrently\n | // with elements of this Interactable. Infinity by default\n | max: Infinity,\n |\n | // max number of drags that can target the same element+Interactable\n | // 1 by default\n | maxPerElement: 2\n | });\n\\*/\nInteractable.prototype.draggable = function (options) {\n if (utils.is.object(options)) {\n this.options.drag.enabled = options.enabled === false? false: true;\n this.setPerAction('drag', options);\n this.setOnEvents('drag', options);\n\n if (/^(xy|x|y|start)$/.test(options.lockAxis)) {\n this.options.drag.lockAxis = options.lockAxis;\n }\n if (/^(xy|x|y)$/.test(options.startAxis)) {\n this.options.drag.startAxis = options.startAxis;\n }\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drag.enabled = options;\n\n if (!options) {\n this.ondragstart = this.ondragstart = this.ondragend = null;\n }\n\n return this;\n }\n\n return this.options.drag;\n};\n\nactions.drag = drag;\nactions.names.push('drag');\nutils.merge(Interactable.eventTypes, [\n 'dragstart',\n 'dragmove',\n 'draginertiastart',\n 'draginertiaresume',\n 'dragend',\n]);\nactions.methodDict.drag = 'draggable';\n\ndefaultOptions.drag = drag.defaults;\n\nmodule.exports = drag;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst scope = require('../scope');\nconst interact = require('../interact');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drop = {\n defaults: {\n enabled: false,\n accept : null,\n overlap: 'pointer',\n },\n};\n\nlet dynamicDrop = false;\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // reset active dropzones\n interaction.activeDrops.dropzones = [];\n interaction.activeDrops.elements = [];\n interaction.activeDrops.rects = [];\n\n interaction.dropEvents = null;\n\n if (!interaction.dynamicDrop) {\n setActiveDrops(interaction, interaction.element);\n }\n\n const dragEvent = interaction.prevEvent;\n const dropEvents = getDropEvents(interaction, event, dragEvent);\n\n if (dropEvents.activate) {\n fireActiveDrops(interaction, dropEvents.activate);\n }\n});\n\nInteractEvent.signals.on('new', function ({ interaction, iEvent, event }) {\n if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { return; }\n\n const draggableElement = interaction.element;\n const dragEvent = iEvent;\n const dropResult = getDrop(dragEvent, event, draggableElement);\n\n interaction.dropTarget = dropResult.dropzone;\n interaction.dropElement = dropResult.element;\n\n interaction.dropEvents = getDropEvents(interaction, event, dragEvent);\n});\n\nInteraction.signals.on('action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n fireDropEvents(interaction, interaction.dropEvents);\n});\n\nInteraction.signals.on('action-end', function ({ interaction }) {\n if (interaction.prepared.name === 'drag') {\n fireDropEvents(interaction, interaction.dropEvents);\n }\n});\n\nInteraction.signals.on('stop-drag', function ({ interaction }) {\n interaction.activeDrops.dropzones =\n interaction.activeDrops.elements =\n interaction.activeDrops.rects =\n interaction.dropEvents = null;\n});\n\nfunction collectDrops (interaction, element) {\n const drops = [];\n const elements = [];\n\n element = element || interaction.element;\n\n // collect all dropzones and their elements which qualify for a drop\n for (const current of scope.interactables) {\n if (!current.options.drop.enabled) { continue; }\n\n const accept = current.options.drop.accept;\n\n // test the draggable element against the dropzone's accept setting\n if ((utils.is.element(accept) && accept !== element)\n || (utils.is.string(accept)\n && !utils.matchesSelector(element, accept))) {\n\n continue;\n }\n\n // query for new elements if necessary\n const dropElements = utils.is.string(current.target)\n ? current._context.querySelectorAll(current.target)\n : [current.target];\n\n for (let i = 0; i < dropElements.length; i++) {\n const currentElement = dropElements[i];\n\n if (currentElement !== element) {\n drops.push(current);\n elements.push(currentElement);\n }\n }\n }\n\n return {\n elements,\n dropzones: drops,\n };\n}\n\nfunction fireActiveDrops (interaction, event) {\n let prevElement;\n\n // loop through all active dropzones and trigger event\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n const current = interaction.activeDrops.dropzones[i];\n const currentElement = interaction.activeDrops.elements [i];\n\n // prevent trigger of duplicate events on same element\n if (currentElement !== prevElement) {\n // set current element as event target\n event.target = currentElement;\n current.fire(event);\n }\n prevElement = currentElement;\n }\n}\n\n// Collect a new set of possible drops and save them in activeDrops.\n// setActiveDrops should always be called when a drag has just started or a\n// drag event happens while dynamicDrop is true\nfunction setActiveDrops (interaction, dragElement) {\n // get dropzones and their elements that could receive the draggable\n const possibleDrops = collectDrops(interaction, dragElement, true);\n\n interaction.activeDrops.dropzones = possibleDrops.dropzones;\n interaction.activeDrops.elements = possibleDrops.elements;\n interaction.activeDrops.rects = [];\n\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n interaction.activeDrops.rects[i] =\n interaction.activeDrops.dropzones[i].getRect(interaction.activeDrops.elements[i]);\n }\n}\n\nfunction getDrop (dragEvent, event, dragElement) {\n const interaction = dragEvent.interaction;\n const validDrops = [];\n\n if (dynamicDrop) {\n setActiveDrops(interaction, dragElement);\n }\n\n // collect all dropzones and their elements which qualify for a drop\n for (let j = 0; j < interaction.activeDrops.dropzones.length; j++) {\n const current = interaction.activeDrops.dropzones[j];\n const currentElement = interaction.activeDrops.elements [j];\n const rect = interaction.activeDrops.rects [j];\n\n validDrops.push(current.dropCheck(dragEvent, event, interaction.target, dragElement, currentElement, rect)\n ? currentElement\n : null);\n }\n\n // get the most appropriate dropzone based on DOM depth and order\n const dropIndex = utils.indexOfDeepestElement(validDrops);\n\n return {\n dropzone: interaction.activeDrops.dropzones[dropIndex] || null,\n element : interaction.activeDrops.elements [dropIndex] || null,\n };\n}\n\nfunction getDropEvents (interaction, pointerEvent, dragEvent) {\n const dropEvents = {\n enter : null,\n leave : null,\n activate : null,\n deactivate: null,\n move : null,\n drop : null,\n };\n\n const tmpl = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n };\n\n if (interaction.dropElement !== interaction.prevDropElement) {\n // if there was a prevDropTarget, create a dragleave event\n if (interaction.prevDropTarget) {\n dropEvents.leave = utils.extend({ type: 'dragleave' }, tmpl);\n\n dragEvent.dragLeave = dropEvents.leave.target = interaction.prevDropElement;\n dragEvent.prevDropzone = dropEvents.leave.dropzone = interaction.prevDropTarget;\n }\n // if the dropTarget is not null, create a dragenter event\n if (interaction.dropTarget) {\n dropEvents.enter = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n type : 'dragenter',\n };\n\n dragEvent.dragEnter = interaction.dropElement;\n dragEvent.dropzone = interaction.dropTarget;\n }\n }\n\n if (dragEvent.type === 'dragend' && interaction.dropTarget) {\n dropEvents.drop = utils.extend({ type: 'drop' }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n dragEvent.relatedTarget = interaction.dropElement;\n }\n if (dragEvent.type === 'dragstart') {\n dropEvents.activate = utils.extend({ type: 'dropactivate' }, tmpl);\n\n dropEvents.activate.target = null;\n dropEvents.activate.dropzone = null;\n }\n if (dragEvent.type === 'dragend') {\n dropEvents.deactivate = utils.extend({ type: 'dropdeactivate' }, tmpl);\n\n dropEvents.deactivate.target = null;\n dropEvents.deactivate.dropzone = null;\n }\n if (dragEvent.type === 'dragmove' && interaction.dropTarget) {\n dropEvents.move = utils.extend({\n dragmove : dragEvent,\n type : 'dropmove',\n }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n }\n\n return dropEvents;\n}\n\nfunction fireDropEvents (interaction, dropEvents) {\n if (dropEvents.leave) { interaction.prevDropTarget.fire(dropEvents.leave); }\n if (dropEvents.move ) { interaction.dropTarget.fire(dropEvents.move ); }\n if (dropEvents.enter) { interaction.dropTarget.fire(dropEvents.enter); }\n if (dropEvents.drop ) { interaction.dropTarget.fire(dropEvents.drop ); }\n if (dropEvents.deactivate) {\n fireActiveDrops(interaction, dropEvents.deactivate);\n }\n\n interaction.prevDropTarget = interaction.dropTarget;\n interaction.prevDropElement = interaction.dropElement;\n}\n\n/*\\\n * Interactable.dropzone\n [ method ]\n *\n * Returns or sets whether elements can be dropped onto this\n * Interactable to trigger drop events\n *\n * Dropzones can receive the following events:\n * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends\n * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone\n * - `dragmove` when a draggable that has entered the dropzone is moved\n * - `drop` when a draggable is dropped into this dropzone\n *\n * Use the `accept` option to allow only elements that match the given CSS\n * selector or element. The value can be:\n *\n * - **an Element** - only that element can be dropped into this dropzone.\n * - **a string**, - the element being dragged must match it as a CSS selector.\n * - **`null`** - accept options is cleared - it accepts any element.\n *\n * Use the `overlap` option to set how drops are checked for. The allowed\n * values are:\n *\n * - `'pointer'`, the pointer must be over the dropzone (default)\n * - `'center'`, the draggable element's center must be over the dropzone\n * - a number from 0-1 which is the `(intersection area) / (draggable area)`.\n * e.g. `0.5` for drop to happen when half of the area of the draggable is\n * over the dropzone\n *\n * Use the `checker` option to specify a function to check if a dragged\n * element is over this Interactable.\n *\n | interact(target)\n | .dropChecker(function(dragEvent, // related dragmove or dragend event\n | event, // TouchEvent/PointerEvent/MouseEvent\n | dropped, // bool result of the default checker\n | dropzone, // dropzone Interactable\n | dropElement, // dropzone elemnt\n | draggable, // draggable Interactable\n | draggableElement) {// draggable element\n |\n | return dropped && event.target.hasAttribute('allow-drop');\n | }\n *\n *\n - options (boolean | object | null) #optional The new value to be set.\n | interact('.drop').dropzone({\n | accept: '.can-drop' || document.getElementById('single-drop'),\n | overlap: 'pointer' || 'center' || zeroToOne\n | }\n = (boolean | object) The current setting or this Interactable\n\\*/\nInteractable.prototype.dropzone = function (options) {\n if (utils.is.object(options)) {\n this.options.drop.enabled = options.enabled === false? false: true;\n\n if (utils.is.function(options.ondrop) ) { this.events.ondrop = options.ondrop ; }\n if (utils.is.function(options.ondropactivate) ) { this.events.ondropactivate = options.ondropactivate ; }\n if (utils.is.function(options.ondropdeactivate)) { this.events.ondropdeactivate = options.ondropdeactivate; }\n if (utils.is.function(options.ondragenter) ) { this.events.ondragenter = options.ondragenter ; }\n if (utils.is.function(options.ondragleave) ) { this.events.ondragleave = options.ondragleave ; }\n if (utils.is.function(options.ondropmove) ) { this.events.ondropmove = options.ondropmove ; }\n\n if (/^(pointer|center)$/.test(options.overlap)) {\n this.options.drop.overlap = options.overlap;\n }\n else if (utils.is.number(options.overlap)) {\n this.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0);\n }\n if ('accept' in options) {\n this.options.drop.accept = options.accept;\n }\n if ('checker' in options) {\n this.options.drop.checker = options.checker;\n }\n\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drop.enabled = options;\n\n if (!options) {\n this.ondragenter = this.ondragleave = this.ondrop\n = this.ondropactivate = this.ondropdeactivate = null;\n }\n\n return this;\n }\n\n return this.options.drop;\n};\n\nInteractable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) {\n let dropped = false;\n\n // if the dropzone has no rect (eg. display: none)\n // call the custom dropChecker or just return false\n if (!(rect = rect || this.getRect(dropElement))) {\n return (this.options.drop.checker\n ? this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement)\n : false);\n }\n\n const dropOverlap = this.options.drop.overlap;\n\n if (dropOverlap === 'pointer') {\n const origin = utils.getOriginXY(draggable, draggableElement, 'drag');\n const page = utils.getPageXY(dragEvent);\n\n page.x += origin.x;\n page.y += origin.y;\n\n const horizontal = (page.x > rect.left) && (page.x < rect.right);\n const vertical = (page.y > rect.top ) && (page.y < rect.bottom);\n\n dropped = horizontal && vertical;\n }\n\n const dragRect = draggable.getRect(draggableElement);\n\n if (dragRect && dropOverlap === 'center') {\n const cx = dragRect.left + dragRect.width / 2;\n const cy = dragRect.top + dragRect.height / 2;\n\n dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom;\n }\n\n if (dragRect && utils.is.number(dropOverlap)) {\n const overlapArea = (Math.max(0, Math.min(rect.right , dragRect.right ) - Math.max(rect.left, dragRect.left))\n * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top , dragRect.top )));\n\n const overlapRatio = overlapArea / (dragRect.width * dragRect.height);\n\n dropped = overlapRatio >= dropOverlap;\n }\n\n if (this.options.drop.checker) {\n dropped = this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement);\n }\n\n return dropped;\n};\n\nInteractable.signals.on('unset', function ({ interactable }) {\n interactable.dropzone(false);\n});\n\nInteractable.settingsMethods.push('dropChecker');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.dropTarget = null; // the dropzone a drag target might be dropped into\n interaction.dropElement = null; // the element at the time of checking\n interaction.prevDropTarget = null; // the dropzone that was recently dragged away from\n interaction.prevDropElement = null; // the element at the time of checking\n interaction.dropEvents = null; // the dropEvents related to the current drag event\n\n interaction.activeDrops = {\n dropzones: [], // the dropzones that are mentioned below\n elements : [], // elements of dropzones that accept the target draggable\n rects : [], // the rects of the elements mentioned above\n };\n\n});\n\nInteraction.signals.on('stop', function ({ interaction }) {\n interaction.dropTarget = interaction.dropElement =\n interaction.prevDropTarget = interaction.prevDropElement = null;\n});\n\n/*\\\n * interact.dynamicDrop\n [ method ]\n *\n * Returns or sets whether the dimensions of dropzone elements are\n * calculated on every dragmove or only on dragstart for the default\n * dropChecker\n *\n - newValue (boolean) #optional True to check on each move. False to check only before start\n = (boolean | interact) The current setting or interact\n\\*/\ninteract.dynamicDrop = function (newValue) {\n if (utils.is.bool(newValue)) {\n //if (dragging && dynamicDrop !== newValue && !newValue) {\n //calcRects(dropzones);\n //}\n\n dynamicDrop = newValue;\n\n return interact;\n }\n return dynamicDrop;\n};\n\nutils.merge(Interactable.eventTypes, [\n 'dragenter',\n 'dragleave',\n 'dropactivate',\n 'dropdeactivate',\n 'dropmove',\n 'drop',\n]);\nactions.methodDict.drop = 'dropzone';\n\ndefaultOptions.drop = drop.defaults;\n\nmodule.exports = drop;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst gesture = {\n defaults: {\n enabled : false,\n origin : null,\n restrict: null,\n },\n\n checker: function (pointer, event, interactable, element, interaction) {\n if (interaction.pointerIds.length >= 2) {\n return { name: 'gesture' };\n }\n\n return null;\n },\n\n getCursor: function () {\n return '';\n },\n};\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturestart') { return; }\n iEvent.ds = 0;\n\n interaction.gesture.startDistance = interaction.gesture.prevDistance = iEvent.distance;\n interaction.gesture.startAngle = interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.scale = 1;\n});\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturemove') { return; }\n\n iEvent.ds = iEvent.scale - interaction.gesture.scale;\n\n interaction.target.fire(iEvent);\n\n interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.prevDistance = iEvent.distance;\n\n if (iEvent.scale !== Infinity\n && iEvent.scale !== null\n && iEvent.scale !== undefined\n && !isNaN(iEvent.scale)) {\n\n interaction.gesture.scale = iEvent.scale;\n }\n});\n\n/*\\\n * Interactable.gesturable\n [ method ]\n *\n * Gets or sets whether multitouch gestures can be performed on the\n * Interactable's element\n *\n = (boolean) Indicates if this can be the target of gesture events\n | var isGestureable = interact(element).gesturable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on gesture events (makes the Interactable gesturable)\n = (object) this Interactable\n | interact(element).gesturable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // limit multiple gestures.\n | // See the explanation in @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n\\*/\nInteractable.prototype.gesturable = function (options) {\n if (utils.is.object(options)) {\n this.options.gesture.enabled = options.enabled === false? false: true;\n this.setPerAction('gesture', options);\n this.setOnEvents('gesture', options);\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.gesture.enabled = options;\n\n if (!options) {\n this.ongesturestart = this.ongesturestart = this.ongestureend = null;\n }\n\n return this;\n }\n\n return this.options.gesture;\n};\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action, event, starting, ending, deltaSource }) {\n if (action !== 'gesture') { return; }\n\n const pointers = interaction.pointers;\n\n iEvent.touches = [pointers[0], pointers[1]];\n\n if (starting) {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = 1;\n iEvent.ds = 0;\n iEvent.angle = utils.touchAngle(pointers, undefined, deltaSource);\n iEvent.da = 0;\n }\n else if (ending || event instanceof InteractEvent) {\n iEvent.distance = interaction.prevEvent.distance;\n iEvent.box = interaction.prevEvent.box;\n iEvent.scale = interaction.prevEvent.scale;\n iEvent.ds = iEvent.scale - 1;\n iEvent.angle = interaction.prevEvent.angle;\n iEvent.da = iEvent.angle - interaction.gesture.startAngle;\n }\n else {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = iEvent.distance / interaction.gesture.startDistance;\n iEvent.angle = utils.touchAngle(pointers, interaction.gesture.prevAngle, deltaSource);\n\n iEvent.ds = iEvent.scale - interaction.gesture.prevScale;\n iEvent.da = iEvent.angle - interaction.gesture.prevAngle;\n }\n});\n\nInteraction.signals.on('new', function (interaction) {\n interaction.gesture = {\n start: { x: 0, y: 0 },\n\n startDistance: 0, // distance between two touches of touchStart\n prevDistance : 0,\n distance : 0,\n\n scale: 1, // gesture.distance / gesture.startDistance\n\n startAngle: 0, // angle of line joining two touches\n prevAngle : 0, // angle of the previous gesture event\n };\n});\n\nactions.gesture = gesture;\nactions.names.push('gesture');\nutils.merge(Interactable.eventTypes, [\n 'gesturestart',\n 'gesturemove',\n 'gestureend',\n]);\nactions.methodDict.gesture = 'gesturable';\n\ndefaultOptions.gesture = gesture.defaults;\n\nmodule.exports = gesture;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\n// Less Precision with touch input\nconst defaultMargin = browser.supportsTouch || browser.supportsPointerEvent? 20: 10;\n\nconst resize = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n square: false,\n preserveAspectRatio: false,\n axis: 'xy',\n\n // use default margin\n margin: NaN,\n\n // object with props left, right, top, bottom which are\n // true/false values to resize when the pointer is over that edge,\n // CSS selectors to match the handles for each direction\n // or the Elements for each handle\n edges: null,\n\n // a value of 'none' will limit the resize rect to a minimum of 0x0\n // 'negate' will alow the rect to have negative width/height\n // 'reposition' will keep the width/height positive by swapping\n // the top and bottom edges and/or swapping the left and right edges\n invert: 'none',\n },\n\n checker: function (pointer, event, interactable, element, interaction, rect) {\n if (!rect) { return null; }\n\n const page = utils.extend({}, interaction.curCoords.page);\n const options = interactable.options;\n\n if (options.resize.enabled) {\n const resizeOptions = options.resize;\n const resizeEdges = { left: false, right: false, top: false, bottom: false };\n\n // if using resize.edges\n if (utils.is.object(resizeOptions.edges)) {\n for (const edge in resizeEdges) {\n resizeEdges[edge] = checkResizeEdge(edge,\n resizeOptions.edges[edge],\n page,\n interaction._eventTarget,\n element,\n rect,\n resizeOptions.margin || defaultMargin);\n }\n\n resizeEdges.left = resizeEdges.left && !resizeEdges.right;\n resizeEdges.top = resizeEdges.top && !resizeEdges.bottom;\n\n if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) {\n return {\n name: 'resize',\n edges: resizeEdges,\n };\n }\n }\n else {\n const right = options.resize.axis !== 'y' && page.x > (rect.right - defaultMargin);\n const bottom = options.resize.axis !== 'x' && page.y > (rect.bottom - defaultMargin);\n\n if (right || bottom) {\n return {\n name: 'resize',\n axes: (right? 'x' : '') + (bottom? 'y' : ''),\n };\n }\n }\n }\n\n return null;\n },\n\n cursors: (browser.isIe9OrOlder ? {\n x : 'e-resize',\n y : 's-resize',\n xy: 'se-resize',\n\n top : 'n-resize',\n left : 'w-resize',\n bottom : 's-resize',\n right : 'e-resize',\n topleft : 'se-resize',\n bottomright: 'se-resize',\n topright : 'ne-resize',\n bottomleft : 'ne-resize',\n } : {\n x : 'ew-resize',\n y : 'ns-resize',\n xy: 'nwse-resize',\n\n top : 'ns-resize',\n left : 'ew-resize',\n bottom : 'ns-resize',\n right : 'ew-resize',\n topleft : 'nwse-resize',\n bottomright: 'nwse-resize',\n topright : 'nesw-resize',\n bottomleft : 'nesw-resize',\n }),\n\n getCursor: function (action) {\n if (action.axis) {\n return resize.cursors[action.name + action.axis];\n }\n else if (action.edges) {\n let cursorKey = '';\n const edgeNames = ['top', 'bottom', 'left', 'right'];\n\n for (let i = 0; i < 4; i++) {\n if (action.edges[edgeNames[i]]) {\n cursorKey += edgeNames[i];\n }\n }\n\n return resize.cursors[cursorKey];\n }\n },\n};\n\n// resizestart\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'resizestart' || !interaction.prepared.edges) {\n return;\n }\n\n const startRect = interaction.target.getRect(interaction.element);\n const resizeOptions = interaction.target.options.resize;\n\n /*\n * When using the `resizable.square` or `resizable.preserveAspectRatio` options, resizing from one edge\n * will affect another. E.g. with `resizable.square`, resizing to make the right edge larger will make\n * the bottom edge larger by the same amount. We call these 'linked' edges. Any linked edges will depend\n * on the active edges and the edge being interacted with.\n */\n if (resizeOptions.square || resizeOptions.preserveAspectRatio) {\n const linkedEdges = utils.extend({}, interaction.prepared.edges);\n\n linkedEdges.top = linkedEdges.top || (linkedEdges.left && !linkedEdges.bottom);\n linkedEdges.left = linkedEdges.left || (linkedEdges.top && !linkedEdges.right );\n linkedEdges.bottom = linkedEdges.bottom || (linkedEdges.right && !linkedEdges.top );\n linkedEdges.right = linkedEdges.right || (linkedEdges.bottom && !linkedEdges.left );\n\n interaction.prepared._linkedEdges = linkedEdges;\n }\n else {\n interaction.prepared._linkedEdges = null;\n }\n\n // if using `resizable.preserveAspectRatio` option, record aspect ratio at the start of the resize\n if (resizeOptions.preserveAspectRatio) {\n interaction.resizeStartAspectRatio = startRect.width / startRect.height;\n }\n\n interaction.resizeRects = {\n start : startRect,\n current : utils.extend({}, startRect),\n inverted : utils.extend({}, startRect),\n previous : utils.extend({}, startRect),\n delta : {\n left: 0, right : 0, width : 0,\n top : 0, bottom: 0, height: 0,\n },\n };\n\n iEvent.rect = interaction.resizeRects.inverted;\n iEvent.deltaRect = interaction.resizeRects.delta;\n});\n\n// resizemove\nInteractEvent.signals.on('new', function ({ iEvent, phase, interaction }) {\n if (phase !== 'move' || !interaction.prepared.edges) { return; }\n\n const resizeOptions = interaction.target.options.resize;\n const invert = resizeOptions.invert;\n const invertible = invert === 'reposition' || invert === 'negate';\n\n let edges = interaction.prepared.edges;\n\n const start = interaction.resizeRects.start;\n const current = interaction.resizeRects.current;\n const inverted = interaction.resizeRects.inverted;\n const delta = interaction.resizeRects.delta;\n const previous = utils.extend(interaction.resizeRects.previous, inverted);\n const originalEdges = edges;\n\n let dx = iEvent.dx;\n let dy = iEvent.dy;\n\n if (resizeOptions.preserveAspectRatio || resizeOptions.square) {\n // `resize.preserveAspectRatio` takes precedence over `resize.square`\n const startAspectRatio = resizeOptions.preserveAspectRatio\n ? interaction.resizeStartAspectRatio\n : 1;\n\n edges = interaction.prepared._linkedEdges;\n\n if ((originalEdges.left && originalEdges.bottom)\n || (originalEdges.right && originalEdges.top)) {\n dy = -dx / startAspectRatio;\n }\n else if (originalEdges.left || originalEdges.right ) { dy = dx / startAspectRatio; }\n else if (originalEdges.top || originalEdges.bottom) { dx = dy * startAspectRatio; }\n }\n\n // update the 'current' rect without modifications\n if (edges.top ) { current.top += dy; }\n if (edges.bottom) { current.bottom += dy; }\n if (edges.left ) { current.left += dx; }\n if (edges.right ) { current.right += dx; }\n\n if (invertible) {\n // if invertible, copy the current rect\n utils.extend(inverted, current);\n\n if (invert === 'reposition') {\n // swap edge values if necessary to keep width/height positive\n let swap;\n\n if (inverted.top > inverted.bottom) {\n swap = inverted.top;\n\n inverted.top = inverted.bottom;\n inverted.bottom = swap;\n }\n if (inverted.left > inverted.right) {\n swap = inverted.left;\n\n inverted.left = inverted.right;\n inverted.right = swap;\n }\n }\n }\n else {\n // if not invertible, restrict to minimum of 0x0 rect\n inverted.top = Math.min(current.top, start.bottom);\n inverted.bottom = Math.max(current.bottom, start.top);\n inverted.left = Math.min(current.left, start.right);\n inverted.right = Math.max(current.right, start.left);\n }\n\n inverted.width = inverted.right - inverted.left;\n inverted.height = inverted.bottom - inverted.top ;\n\n for (const edge in inverted) {\n delta[edge] = inverted[edge] - previous[edge];\n }\n\n iEvent.edges = interaction.prepared.edges;\n iEvent.rect = inverted;\n iEvent.deltaRect = delta;\n});\n\n/*\\\n * Interactable.resizable\n [ method ]\n *\n * Gets or sets whether resize actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of resize elements\n | var isResizeable = interact('input[type=text]').resizable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on resize events (object makes the Interactable resizable)\n = (object) This Interactable\n | interact(element).resizable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | edges: {\n | top : true, // Use pointer coords to check for resize.\n | left : false, // Disable resizing from left edge.\n | bottom: '.resize-s',// Resize if pointer target matches selector\n | right : handleEl // Resize if pointer target is the given Element\n | },\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height are adjusted at a 1:1 ratio.\n | square: false,\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height maintain the aspect ratio they had when resizing started.\n | preserveAspectRatio: false,\n |\n | // a value of 'none' will limit the resize rect to a minimum of 0x0\n | // 'negate' will allow the rect to have negative width/height\n | // 'reposition' will keep the width/height positive by swapping\n | // the top and bottom edges and/or swapping the left and right edges\n | invert: 'none' || 'negate' || 'reposition'\n |\n | // limit multiple resizes.\n | // See the explanation in the @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n \\*/\nInteractable.prototype.resizable = function (options) {\n if (utils.is.object(options)) {\n this.options.resize.enabled = options.enabled === false? false: true;\n this.setPerAction('resize', options);\n this.setOnEvents('resize', options);\n\n if (/^x$|^y$|^xy$/.test(options.axis)) {\n this.options.resize.axis = options.axis;\n }\n else if (options.axis === null) {\n this.options.resize.axis = defaultOptions.resize.axis;\n }\n\n if (utils.is.bool(options.preserveAspectRatio)) {\n this.options.resize.preserveAspectRatio = options.preserveAspectRatio;\n }\n else if (utils.is.bool(options.square)) {\n this.options.resize.square = options.square;\n }\n\n return this;\n }\n if (utils.is.bool(options)) {\n this.options.resize.enabled = options;\n\n if (!options) {\n this.onresizestart = this.onresizestart = this.onresizeend = null;\n }\n\n return this;\n }\n return this.options.resize;\n};\n\nfunction checkResizeEdge (name, value, page, element, interactableElement, rect, margin) {\n // false, '', undefined, null\n if (!value) { return false; }\n\n // true value, use pointer coords and element rect\n if (value === true) {\n // if dimensions are negative, \"switch\" edges\n const width = utils.is.number(rect.width )? rect.width : rect.right - rect.left;\n const height = utils.is.number(rect.height)? rect.height : rect.bottom - rect.top ;\n\n if (width < 0) {\n if (name === 'left' ) { name = 'right'; }\n else if (name === 'right') { name = 'left' ; }\n }\n if (height < 0) {\n if (name === 'top' ) { name = 'bottom'; }\n else if (name === 'bottom') { name = 'top' ; }\n }\n\n if (name === 'left' ) { return page.x < ((width >= 0? rect.left: rect.right ) + margin); }\n if (name === 'top' ) { return page.y < ((height >= 0? rect.top : rect.bottom) + margin); }\n\n if (name === 'right' ) { return page.x > ((width >= 0? rect.right : rect.left) - margin); }\n if (name === 'bottom') { return page.y > ((height >= 0? rect.bottom: rect.top ) - margin); }\n }\n\n // the remaining checks require an element\n if (!utils.is.element(element)) { return false; }\n\n return utils.is.element(value)\n // the value is an element to use as a resize handle\n ? value === element\n // otherwise check if element matches value as selector\n : utils.matchesUpTo(element, value, interactableElement);\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.resizeAxes = 'xy';\n});\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action }) {\n if (action !== 'resize' || !interaction.resizeAxes) { return; }\n\n const options = interaction.target.options;\n\n if (options.resize.square) {\n if (interaction.resizeAxes === 'y') {\n iEvent.dx = iEvent.dy;\n }\n else {\n iEvent.dy = iEvent.dx;\n }\n iEvent.axes = 'xy';\n }\n else {\n iEvent.axes = interaction.resizeAxes;\n\n if (interaction.resizeAxes === 'x') {\n iEvent.dy = 0;\n }\n else if (interaction.resizeAxes === 'y') {\n iEvent.dx = 0;\n }\n }\n});\n\nactions.resize = resize;\nactions.names.push('resize');\nutils.merge(Interactable.eventTypes, [\n 'resizestart',\n 'resizemove',\n 'resizeinertiastart',\n 'resizeinertiaresume',\n 'resizeend',\n]);\nactions.methodDict.resize = 'resizable';\n\ndefaultOptions.resize = resize.defaults;\n\nmodule.exports = resize;\n","const raf = require('./utils/raf');\nconst getWindow = require('./utils/window').getWindow;\nconst is = require('./utils/is');\nconst domUtils = require('./utils/domUtils');\nconst Interaction = require('./Interaction');\nconst defaultOptions = require('./defaultOptions');\n\nconst autoScroll = {\n defaults: {\n enabled : false,\n container: null, // the item that is scrolled (Window or HTMLElement)\n margin : 60,\n speed : 300, // the scroll speed in pixels per second\n },\n\n interaction: null,\n i: null, // the handle returned by window.setInterval\n x: 0, y: 0, // Direction each pulse is to scroll in\n\n isScrolling: false,\n prevTime: 0,\n\n start: function (interaction) {\n autoScroll.isScrolling = true;\n raf.cancel(autoScroll.i);\n\n autoScroll.interaction = interaction;\n autoScroll.prevTime = new Date().getTime();\n autoScroll.i = raf.request(autoScroll.scroll);\n },\n\n stop: function () {\n autoScroll.isScrolling = false;\n raf.cancel(autoScroll.i);\n },\n\n // scroll the window by the values in scroll.x/y\n scroll: function () {\n const options = autoScroll.interaction.target.options[autoScroll.interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(autoScroll.interaction.element);\n const now = new Date().getTime();\n // change in time in seconds\n const dt = (now - autoScroll.prevTime) / 1000;\n // displacement\n const s = options.speed * dt;\n\n if (s >= 1) {\n if (is.window(container)) {\n container.scrollBy(autoScroll.x * s, autoScroll.y * s);\n }\n else if (container) {\n container.scrollLeft += autoScroll.x * s;\n container.scrollTop += autoScroll.y * s;\n }\n\n autoScroll.prevTime = now;\n }\n\n if (autoScroll.isScrolling) {\n raf.cancel(autoScroll.i);\n autoScroll.i = raf.request(autoScroll.scroll);\n }\n },\n check: function (interactable, actionName) {\n const options = interactable.options;\n\n return options[actionName].autoScroll && options[actionName].autoScroll.enabled;\n },\n onInteractionMove: function ({ interaction, pointer }) {\n if (!(interaction.interacting()\n && autoScroll.check(interaction.target, interaction.prepared.name))) {\n return;\n }\n\n if (interaction.simulation) {\n autoScroll.x = autoScroll.y = 0;\n return;\n }\n\n let top;\n let right;\n let bottom;\n let left;\n\n const options = interaction.target.options[interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(interaction.element);\n\n if (is.window(container)) {\n left = pointer.clientX < autoScroll.margin;\n top = pointer.clientY < autoScroll.margin;\n right = pointer.clientX > container.innerWidth - autoScroll.margin;\n bottom = pointer.clientY > container.innerHeight - autoScroll.margin;\n }\n else {\n const rect = domUtils.getElementClientRect(container);\n\n left = pointer.clientX < rect.left + autoScroll.margin;\n top = pointer.clientY < rect.top + autoScroll.margin;\n right = pointer.clientX > rect.right - autoScroll.margin;\n bottom = pointer.clientY > rect.bottom - autoScroll.margin;\n }\n\n autoScroll.x = (right ? 1: left? -1: 0);\n autoScroll.y = (bottom? 1: top? -1: 0);\n\n if (!autoScroll.isScrolling) {\n // set the autoScroll properties to those of the target\n autoScroll.margin = options.margin;\n autoScroll.speed = options.speed;\n\n autoScroll.start(interaction);\n }\n },\n};\n\nInteraction.signals.on('stop-active', function () {\n autoScroll.stop();\n});\n\nInteraction.signals.on('action-move', autoScroll.onInteractionMove);\n\ndefaultOptions.perAction.autoScroll = autoScroll.defaults;\n\nmodule.exports = autoScroll;\n","const Interactable = require('../Interactable');\nconst actions = require('../actions/base');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.ignoreFrom\n [ method ]\n *\n * If the target of the `mousedown`, `pointerdown` or `touchstart`\n * event or any of it's parents match the given CSS selector or\n * Element, no drag/resize/gesture is started.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to not ignore any elements\n = (string | Element | object) The current ignoreFrom value or this Interactable\n **\n | interact(element, { ignoreFrom: document.getElementById('no-action') });\n | // or\n | interact(element).ignoreFrom('input, textarea, a');\n\\*/\nInteractable.prototype.ignoreFrom = function (newValue) {\n return this._backCompatOption('ignoreFrom', newValue);\n};\n\n/*\\\n * Interactable.allowFrom\n [ method ]\n *\n * A drag/resize/gesture is started only If the target of the\n * `mousedown`, `pointerdown` or `touchstart` event or any of it's\n * parents match the given CSS selector or Element.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to allow from any element\n = (string | Element | object) The current allowFrom value or this Interactable\n **\n | interact(element, { allowFrom: document.getElementById('drag-handle') });\n | // or\n | interact(element).allowFrom('.handle');\n\\*/\nInteractable.prototype.allowFrom = function (newValue) {\n return this._backCompatOption('allowFrom', newValue);\n};\n\nInteractable.prototype.testIgnore = function (ignoreFrom, interactableElement, element) {\n if (!ignoreFrom || !is.element(element)) { return false; }\n\n if (is.string(ignoreFrom)) {\n return domUtils.matchesUpTo(element, ignoreFrom, interactableElement);\n }\n else if (is.element(ignoreFrom)) {\n return domUtils.nodeContains(ignoreFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testAllow = function (allowFrom, interactableElement, element) {\n if (!allowFrom) { return true; }\n\n if (!is.element(element)) { return false; }\n\n if (is.string(allowFrom)) {\n return domUtils.matchesUpTo(element, allowFrom, interactableElement);\n }\n else if (is.element(allowFrom)) {\n return domUtils.nodeContains(allowFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testIgnoreAllow = function (options, interactableElement, eventTarget) {\n return (!this.testIgnore(options.ignoreFrom, interactableElement, eventTarget)\n && this.testAllow(options.allowFrom, interactableElement, eventTarget));\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (event.buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\n","const interact = require('../interact');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst actions = require('../actions/base');\nconst defaultOptions = require('../defaultOptions');\nconst browser = require('../utils/browser');\nconst scope = require('../scope');\nconst utils = require('../utils');\nconst signals = require('../utils/Signals').new();\n\nrequire('./InteractableMethods');\n\nconst autoStart = {\n signals,\n withinInteractionLimit,\n // Allow this many interactions to happen simultaneously\n maxInteractions: Infinity,\n defaults: {\n perAction: {\n manualStart: false,\n max: Infinity,\n maxPerElement: 1,\n allowFrom: null,\n ignoreFrom: null,\n },\n },\n setActionDefaults: function (action) {\n utils.extend(action.defaults, autoStart.defaults.perAction);\n },\n};\n\n// set cursor style on mousedown\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget }) {\n if (interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\n// set cursor style on mousemove\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget }) {\n if (!interaction.mouse\n || interaction.pointerIsDown\n || interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\nInteraction.signals.on('move', function (arg) {\n const { interaction, event } = arg;\n\n if (!interaction.pointerIsDown\n || interaction.interacting()\n || !interaction.pointerWasMoved\n || !interaction.prepared.name) {\n return;\n }\n\n signals.fire('before-start', arg);\n\n const target = interaction.target;\n\n if (interaction.prepared.name && target) {\n // check manualStart and interaction limit\n if (target.options[interaction.prepared.name].manualStart\n || !withinInteractionLimit(target, interaction.element, interaction.prepared)) {\n interaction.stop(event);\n }\n else {\n interaction.start(interaction.prepared, target, interaction.element);\n }\n }\n});\n\n// Check if the current target supports the action.\n// If so, return the validated action. Otherwise, return null\nfunction validateAction (action, interactable, element, eventTarget) {\n if (utils.is.object(action)\n && interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget)\n && interactable.options[action.name].enabled\n && withinInteractionLimit(interactable, element, action)) {\n return action;\n }\n\n return null;\n}\n\nfunction validateSelector (interaction, pointer, event, matches, matchElements, eventTarget) {\n for (let i = 0, len = matches.length; i < len; i++) {\n const match = matches[i];\n const matchElement = matchElements[i];\n const action = validateAction(match.getAction(pointer, event, interaction, matchElement),\n match,\n matchElement,\n eventTarget);\n\n if (action) {\n return {\n action,\n target: match,\n element: matchElement,\n };\n }\n }\n\n return {};\n}\n\nfunction getActionInfo (interaction, pointer, event, eventTarget) {\n let matches = [];\n let matchElements = [];\n\n let element = eventTarget;\n let action = null;\n\n function pushMatches (interactable, selector, context) {\n const elements = (browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined);\n\n if (utils.matchesSelector(element, selector, elements)) {\n\n matches.push(interactable);\n matchElements.push(element);\n }\n }\n\n while (utils.is.element(element)) {\n matches = [];\n matchElements = [];\n\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && (action = validateAction(elementInteractable.getAction(pointer, event, interaction, element, eventTarget),\n elementInteractable,\n element,\n eventTarget))\n && !elementInteractable.options[action.name].manualStart) {\n return {\n element,\n action,\n target: elementInteractable,\n };\n }\n else {\n scope.interactables.forEachSelector(pushMatches, element);\n\n const actionInfo = validateSelector(interaction, pointer, event, matches, matchElements, eventTarget);\n\n if (actionInfo.action\n && !actionInfo.target.options[actionInfo.action.name].manualStart) {\n return actionInfo;\n }\n }\n\n element = utils.parentNode(element);\n }\n\n return {};\n}\n\nfunction prepare (interaction, { action, target, element }) {\n action = action || {};\n\n if (interaction.target && interaction.target.options.styleCursor) {\n interaction.target._doc.documentElement.style.cursor = '';\n }\n\n interaction.target = target;\n interaction.element = element;\n utils.copyAction(interaction.prepared, action);\n\n if (target && target.options.styleCursor) {\n const cursor = action? actions[action.name].getCursor(action) : '';\n interaction.target._doc.documentElement.style.cursor = cursor;\n }\n\n signals.fire('prepared', { interaction: interaction });\n}\n\nInteraction.signals.on('stop', function ({ interaction }) {\n const target = interaction.target;\n\n if (target && target.options.styleCursor) {\n target._doc.documentElement.style.cursor = '';\n }\n});\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (utils.is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (utils.is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n const buttons = event.buttons || ({\n 0: 1,\n 1: 4,\n 3: 8,\n 4: 16,\n })[event.button];\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\nfunction withinInteractionLimit (interactable, element, action) {\n const options = interactable.options;\n const maxActions = options[action.name].max;\n const maxPerElement = options[action.name].maxPerElement;\n let activeInteractions = 0;\n let targetCount = 0;\n let targetElementCount = 0;\n\n // no actions if any of these values == 0\n if (!(maxActions && maxPerElement && autoStart.maxInteractions)) { return; }\n\n for (let i = 0, len = scope.interactions.length; i < len; i++) {\n const interaction = scope.interactions[i];\n const otherAction = interaction.prepared.name;\n\n if (!interaction.interacting()) { continue; }\n\n activeInteractions++;\n\n if (activeInteractions >= autoStart.maxInteractions) {\n return false;\n }\n\n if (interaction.target !== interactable) { continue; }\n\n targetCount += (otherAction === action.name)|0;\n\n if (targetCount >= maxActions) {\n return false;\n }\n\n if (interaction.element === element) {\n targetElementCount++;\n\n if (otherAction !== action.name || targetElementCount >= maxPerElement) {\n return false;\n }\n }\n }\n\n return autoStart.maxInteractions > 0;\n}\n\n/*\\\n * interact.maxInteractions\n [ method ]\n **\n * Returns or sets the maximum number of concurrent interactions allowed.\n * By default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables\n * and elements, you need to enable it in the draggable, resizable and\n * gesturable `'max'` and `'maxPerElement'` options.\n **\n - newValue (number) #optional Any number. newValue <= 0 means no interactions.\n\\*/\ninteract.maxInteractions = function (newValue) {\n if (utils.is.number(newValue)) {\n autoStart.maxInteractions = newValue;\n\n return this;\n }\n\n return autoStart.maxInteractions;\n};\n\nInteractable.settingsMethods.push('styleCursor');\nInteractable.settingsMethods.push('actionChecker');\nInteractable.settingsMethods.push('ignoreFrom');\nInteractable.settingsMethods.push('allowFrom');\n\ndefaultOptions.base.actionChecker = null;\ndefaultOptions.base.styleCursor = true;\n\nutils.extend(defaultOptions.perAction, autoStart.defaults.perAction);\n\nmodule.exports = autoStart;\n","const autoStart = require('./base');\nconst Interaction = require('../Interaction');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.delayTimer = null;\n});\n\nautoStart.signals.on('prepared', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.delayTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.target, interaction.element);\n }, delay);\n }\n});\n\nInteraction.signals.on('move', function ({ interaction, duplicate }) {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.delayTimer);\n }\n});\n\n// prevent regular down->move autoStart\nautoStart.signals.on('before-start', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.prepared.name = null;\n }\n});\n","const autoStart = require('./base');\nconst scope = require('../scope');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\n\nconst { matchesSelector, parentNode } = require('../utils/domUtils');\n\nautoStart.setActionDefaults(require('../actions/drag'));\n\nautoStart.signals.on('before-start', function ({ interaction, eventTarget, dx, dy }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // check if a drag is in the correct axis\n const absX = Math.abs(dx);\n const absY = Math.abs(dy);\n const options = interaction.target.options.drag;\n const startAxis = options.startAxis;\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy');\n\n interaction.prepared.axis = options.lockAxis === 'start'\n ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n : options.lockAxis;\n\n // if the movement isn't in the startAxis of the interactable\n if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) {\n // cancel the prepared action\n interaction.prepared.name = null;\n\n // then try to get a drag from another ineractable\n\n if (!interaction.prepared.name) {\n\n let element = eventTarget;\n\n const getDraggable = function (interactable, selector, context) {\n const elements = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n if (interactable === interaction.target) { return; }\n\n if (!options.manualStart\n && !interactable.testIgnoreAllow(options, element, eventTarget)\n && matchesSelector(element, selector, elements)) {\n\n const action = interactable.getAction(interaction.downPointer,\n interaction.downEvent,\n interaction,\n element);\n\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, interactable)\n && autoStart.validateAction(action, interactable, element, eventTarget)) {\n\n return interactable;\n }\n }\n };\n\n let action = null;\n\n // check all interactables\n while (is.element(element)) {\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && elementInteractable !== interaction.target\n && !elementInteractable.options.drag.manualStart) {\n\n action = elementInteractable.getAction(interaction.downPointer, interaction.downEvent, interaction, element);\n }\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, elementInteractable)) {\n\n interaction.prepared.name = 'drag';\n interaction.target = elementInteractable;\n interaction.element = element;\n break;\n }\n\n const selectorInteractable = scope.interactables.forEachSelector(getDraggable, element);\n\n if (selectorInteractable) {\n interaction.prepared.name = 'drag';\n interaction.target = selectorInteractable;\n interaction.element = element;\n break;\n }\n\n element = parentNode(element);\n }\n }\n }\n});\n\nfunction checkStartAxis (startAxis, interactable) {\n if (!interactable) { return false; }\n\n const thisAxis = interactable.options.drag.startAxis;\n\n return (startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis);\n}\n","require('./base').setActionDefaults(require('../actions/gesture'));\n","require('./base').setActionDefaults(require('../actions/resize'));\n","module.exports = {\n base: {\n accept : null,\n preventDefault: 'auto',\n deltaSource : 'page',\n },\n\n perAction: {\n origin: { x: 0, y: 0 },\n\n // only allow left button by default\n // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n mouseButtons: 1,\n\n inertia: {\n enabled : false,\n resistance : 10, // the lambda in exponential decay\n minSpeed : 100, // target speed must be above this for inertia to start\n endSpeed : 10, // the speed at which inertia is slow enough to stop\n allowResume : true, // allow resuming an action in inertia phase\n smoothEndDuration: 300, // animate to snap/restrict endOnly if there's no inertia\n },\n },\n};\n","/* browser entry point */\n\n// Legacy browser support\nrequire('./legacyBrowsers');\n\n// inertia\nrequire('./inertia');\n\n// modifiers\nrequire('./modifiers/snap');\nrequire('./modifiers/restrict');\n\n// pointerEvents\nrequire('./pointerEvents/base');\nrequire('./pointerEvents/holdRepeat');\nrequire('./pointerEvents/interactableTargets');\n\n// delay\nrequire('./autoStart/delay');\n\n// actions\nrequire('./actions/gesture');\nrequire('./actions/resize');\nrequire('./actions/drag');\nrequire('./actions/drop');\n\n// load these modifiers after resize is loaded\nrequire('./modifiers/snapSize');\nrequire('./modifiers/restrictEdges');\nrequire('./modifiers/restrictSize');\n\n// autoStart actions\nrequire('./autoStart/gesture');\nrequire('./autoStart/resize');\nrequire('./autoStart/drag');\n\n// Interactable preventDefault setting\nrequire('./interactablePreventDefault.js');\n\n// autoScroll\nrequire('./autoScroll');\n\n// export interact\nmodule.exports = require('./interact');\n","const InteractEvent = require('./InteractEvent');\nconst Interaction = require('./Interaction');\nconst modifiers = require('./modifiers');\nconst utils = require('./utils');\nconst animationFrame = require('./utils/raf');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.inertiaStatus = {\n active : false,\n smoothEnd : false,\n allowResume: false,\n\n startEvent: null,\n upCoords : {},\n\n xe: 0, ye: 0,\n sx: 0, sy: 0,\n\n t0: 0,\n vx0: 0, vys: 0,\n duration: 0,\n\n lambda_v0: 0,\n one_ve_v0: 0,\n i : null,\n };\n\n interaction.boundInertiaFrame = () => inertiaFrame .apply(interaction);\n interaction.boundSmoothEndFrame = () => smoothEndFrame.apply(interaction);\n});\n\nInteraction.signals.on('down', function ({ interaction, event, pointer, eventTarget }) {\n const status = interaction.inertiaStatus;\n\n // Check if the down event hits the current inertia target\n if (status.active) {\n let element = eventTarget;\n\n // climb up the DOM tree from the event target\n while (utils.is.element(element)) {\n\n // if interaction element is the current inertia target element\n if (element === interaction.element) {\n // stop inertia\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n\n // update pointers to the down event's coordinates\n interaction.updatePointer(pointer);\n utils.setCoords(interaction.curCoords, interaction.pointers);\n\n // fire appropriate signals\n const signalArg = { interaction };\n Interaction.signals.fire('before-action-move', signalArg);\n Interaction.signals.fire('action-resume' , signalArg);\n\n // fire a reume event\n const resumeEvent = new InteractEvent(interaction,\n event,\n interaction.prepared.name,\n 'inertiaresume',\n interaction.element);\n\n interaction.target.fire(resumeEvent);\n interaction.prevEvent = resumeEvent;\n modifiers.resetStatuses(interaction.modifierStatuses);\n\n utils.copyCoords(interaction.prevCoords, interaction.curCoords);\n break;\n }\n\n element = utils.parentNode(element);\n }\n }\n});\n\nInteraction.signals.on('up', function ({ interaction, event }) {\n const status = interaction.inertiaStatus;\n\n if (!interaction.interacting() || status.active) { return; }\n\n const target = interaction.target;\n const options = target && target.options;\n const inertiaOptions = options && interaction.prepared.name && options[interaction.prepared.name].inertia;\n\n const now = new Date().getTime();\n const statuses = {};\n const page = utils.extend({}, interaction.curCoords.page);\n const pointerSpeed = interaction.pointerDelta.client.speed;\n\n let smoothEnd = false;\n let modifierResult;\n\n // check if inertia should be started\n const inertiaPossible = (inertiaOptions && inertiaOptions.enabled\n && interaction.prepared.name !== 'gesture'\n && event !== status.startEvent);\n\n const inertia = (inertiaPossible\n && (now - interaction.curCoords.timeStamp) < 50\n && pointerSpeed > inertiaOptions.minSpeed\n && pointerSpeed > inertiaOptions.endSpeed);\n\n const modifierArg = {\n interaction,\n pageCoords: page,\n statuses,\n preEnd: true,\n requireEndOnly: true,\n };\n\n // smoothEnd\n if (inertiaPossible && !inertia) {\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n if (modifierResult.shouldMove && modifierResult.locked) {\n smoothEnd = true;\n }\n }\n\n if (!(inertia || smoothEnd)) { return; }\n\n utils.copyCoords(status.upCoords, interaction.curCoords);\n\n interaction.pointers[0] = status.startEvent =\n new InteractEvent(interaction, event, interaction.prepared.name, 'inertiastart', interaction.element);\n\n status.t0 = now;\n\n status.active = true;\n status.allowResume = inertiaOptions.allowResume;\n interaction.simulation = status;\n\n target.fire(status.startEvent);\n\n if (inertia) {\n status.vx0 = interaction.pointerDelta.client.vx;\n status.vy0 = interaction.pointerDelta.client.vy;\n status.v0 = pointerSpeed;\n\n calcInertia(interaction, status);\n\n utils.extend(page, interaction.curCoords.page);\n\n page.x += status.xe;\n page.y += status.ye;\n\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n status.modifiedXe += modifierResult.dx;\n status.modifiedYe += modifierResult.dy;\n\n status.i = animationFrame.request(interaction.boundInertiaFrame);\n }\n else {\n status.smoothEnd = true;\n status.xe = modifierResult.dx;\n status.ye = modifierResult.dy;\n\n status.sx = status.sy = 0;\n\n status.i = animationFrame.request(interaction.boundSmoothEndFrame);\n }\n});\n\nInteraction.signals.on('stop-active', function ({ interaction }) {\n const status = interaction.inertiaStatus;\n\n if (status.active) {\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n }\n});\n\nfunction calcInertia (interaction, status) {\n const inertiaOptions = interaction.target.options[interaction.prepared.name].inertia;\n const lambda = inertiaOptions.resistance;\n const inertiaDur = -Math.log(inertiaOptions.endSpeed / status.v0) / lambda;\n\n status.x0 = interaction.prevEvent.pageX;\n status.y0 = interaction.prevEvent.pageY;\n status.t0 = status.startEvent.timeStamp / 1000;\n status.sx = status.sy = 0;\n\n status.modifiedXe = status.xe = (status.vx0 - inertiaDur) / lambda;\n status.modifiedYe = status.ye = (status.vy0 - inertiaDur) / lambda;\n status.te = inertiaDur;\n\n status.lambda_v0 = lambda / status.v0;\n status.one_ve_v0 = 1 - inertiaOptions.endSpeed / status.v0;\n}\n\nfunction inertiaFrame () {\n updateInertiaCoords(this);\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n\n const status = this.inertiaStatus;\n const options = this.target.options[this.prepared.name].inertia;\n const lambda = options.resistance;\n const t = new Date().getTime() / 1000 - status.t0;\n\n if (t < status.te) {\n\n const progress = 1 - (Math.exp(-lambda * t) - status.lambda_v0) / status.one_ve_v0;\n\n if (status.modifiedXe === status.xe && status.modifiedYe === status.ye) {\n status.sx = status.xe * progress;\n status.sy = status.ye * progress;\n }\n else {\n const quadPoint = utils.getQuadraticCurvePoint(0, 0,\n status.xe,\n status.ye,\n status.modifiedXe,\n status.modifiedYe,\n progress);\n\n status.sx = quadPoint.x;\n status.sy = quadPoint.y;\n }\n\n this.doMove();\n\n status.i = animationFrame.request(this.boundInertiaFrame);\n }\n else {\n status.sx = status.modifiedXe;\n status.sy = status.modifiedYe;\n\n this.doMove();\n this.end(status.startEvent);\n status.active = false;\n this.simulation = null;\n }\n\n utils.copyCoords(this.prevCoords, this.curCoords);\n}\n\nfunction smoothEndFrame () {\n updateInertiaCoords(this);\n\n const status = this.inertiaStatus;\n const t = new Date().getTime() - status.t0;\n const duration = this.target.options[this.prepared.name].inertia.smoothEndDuration;\n\n if (t < duration) {\n status.sx = utils.easeOutQuad(t, 0, status.xe, duration);\n status.sy = utils.easeOutQuad(t, 0, status.ye, duration);\n\n this.pointerMove(status.startEvent, status.startEvent);\n\n status.i = animationFrame.request(this.boundSmoothEndFrame);\n }\n else {\n status.sx = status.xe;\n status.sy = status.ye;\n\n this.pointerMove(status.startEvent, status.startEvent);\n this.end(status.startEvent);\n\n status.smoothEnd =\n status.active = false;\n this.simulation = null;\n }\n}\n\nfunction updateInertiaCoords (interaction) {\n const status = interaction.inertiaStatus;\n\n // return if inertia isn't running\n if (!status.active) { return; }\n\n const pageUp = status.upCoords.page;\n const clientUp = status.upCoords.client;\n\n utils.setCoords(interaction.curCoords, [ {\n pageX : pageUp.x + status.sx,\n pageY : pageUp.y + status.sy,\n clientX: clientUp.x + status.sx,\n clientY: clientUp.y + status.sy,\n } ]);\n}\n","const browser = require('./utils/browser');\nconst events = require('./utils/events');\nconst utils = require('./utils');\nconst scope = require('./scope');\nconst Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\n\nconst globalEvents = {};\n\n/*\\\n * interact\n [ method ]\n *\n * The methods of this variable can be used to set elements as\n * interactables and also to change various default settings.\n *\n * Calling it as a function and passing an element or a valid CSS selector\n * string returns an Interactable object which has various methods to\n * configure it.\n *\n - element (Element | string) The HTML or SVG Element to interact with or CSS selector\n = (object) An @Interactable\n *\n > Usage\n | interact('#draggable').draggable(true);\n |\n | var rectables = interact('rect');\n | rectables\n | .gesturable(true)\n | .on('gesturemove', function (event) {\n | // ...\n | });\n\\*/\nfunction interact (element, options) {\n let interactable = scope.interactables.get(element, options);\n\n if (!interactable) {\n interactable = new Interactable(element, options);\n interactable.events.global = globalEvents;\n }\n\n return interactable;\n}\n\n/*\\\n * interact.isSet\n [ method ]\n *\n * Check if an element has been set\n - element (Element) The Element being searched for\n = (boolean) Indicates if the element or CSS selector was previously passed to interact\n\\*/\ninteract.isSet = function (element, options) {\n return scope.interactables.indexOfElement(element, options && options.context) !== -1;\n};\n\n/*\\\n * interact.on\n [ method ]\n *\n * Adds a global listener for an InteractEvent or adds a DOM event to\n * `document`\n *\n - type (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) interact\n\\*/\ninteract.on = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.on(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.on(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n // if it is an InteractEvent type, add listener to globalEvents\n if (utils.contains(Interactable.eventTypes, type)) {\n // if this type of event was never bound\n if (!globalEvents[type]) {\n globalEvents[type] = [listener];\n }\n else {\n globalEvents[type].push(listener);\n }\n }\n // If non InteractEvent type, addEventListener to document\n else {\n events.add(scope.document, type, listener, { options });\n }\n\n return interact;\n};\n\n/*\\\n * interact.off\n [ method ]\n *\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n - type (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) interact\n \\*/\ninteract.off = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.off(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.off(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n if (!utils.contains(Interactable.eventTypes, type)) {\n events.remove(scope.document, type, listener, options);\n }\n else {\n let index;\n\n if (type in globalEvents\n && (index = utils.indexOf(globalEvents[type], listener)) !== -1) {\n globalEvents[type].splice(index, 1);\n }\n }\n\n return interact;\n};\n\n/*\\\n * interact.debug\n [ method ]\n *\n * Returns an object which exposes internal data\n = (object) An object with properties that outline the current state and expose internal functions and variables\n\\*/\ninteract.debug = function () {\n return scope;\n};\n\n// expose the functions used to calculate multi-touch properties\ninteract.getPointerAverage = utils.pointerAverage;\ninteract.getTouchBBox = utils.touchBBox;\ninteract.getTouchDistance = utils.touchDistance;\ninteract.getTouchAngle = utils.touchAngle;\n\ninteract.getElementRect = utils.getElementRect;\ninteract.getElementClientRect = utils.getElementClientRect;\ninteract.matchesSelector = utils.matchesSelector;\ninteract.closest = utils.closest;\n\n/*\\\n * interact.supportsTouch\n [ method ]\n *\n = (boolean) Whether or not the browser supports touch input\n\\*/\ninteract.supportsTouch = function () {\n return browser.supportsTouch;\n};\n\n/*\\\n * interact.supportsPointerEvent\n [ method ]\n *\n = (boolean) Whether or not the browser supports PointerEvents\n\\*/\ninteract.supportsPointerEvent = function () {\n return browser.supportsPointerEvent;\n};\n\n/*\\\n * interact.stop\n [ method ]\n *\n * Cancels all interactions (end events are not fired)\n *\n - event (Event) An event on which to call preventDefault()\n = (object) interact\n\\*/\ninteract.stop = function (event) {\n for (let i = scope.interactions.length - 1; i >= 0; i--) {\n scope.interactions[i].stop(event);\n }\n\n return interact;\n};\n\n/*\\\n * interact.pointerMoveTolerance\n [ method ]\n * Returns or sets the distance the pointer must be moved before an action\n * sequence occurs. This also affects tolerance for tap events.\n *\n - newValue (number) #optional The movement from the start position must be greater than this value\n = (number | Interactable) The current setting or interact\n\\*/\ninteract.pointerMoveTolerance = function (newValue) {\n if (utils.is.number(newValue)) {\n Interaction.pointerMoveTolerance = newValue;\n\n return this;\n }\n\n return Interaction.pointerMoveTolerance;\n};\n\ninteract.addDocument = scope.addDocument;\ninteract.removeDocument = scope.removeDocument;\n\nscope.interact = interact;\n\nmodule.exports = interact;\n","const Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\nconst scope = require('./scope');\nconst is = require('./utils/is');\nconst events = require('./utils/events');\n\nconst { nodeContains, matchesSelector } = require('./utils/domUtils');\n\n/*\\\n * Interactable.preventDefault\n [ method ]\n *\n * Returns or sets whether to prevent the browser's default behaviour\n * in response to pointer events. Can be set to:\n * - `'always'` to always prevent\n * - `'never'` to never prevent\n * - `'auto'` to let interact.js try to determine what would be best\n *\n - newValue (string) #optional `true`, `false` or `'auto'`\n = (string | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.preventDefault = function (newValue) {\n if (/^(always|never|auto)$/.test(newValue)) {\n this.options.preventDefault = newValue;\n return this;\n }\n\n if (is.bool(newValue)) {\n this.options.preventDefault = newValue? 'always' : 'never';\n return this;\n }\n\n return this.options.preventDefault;\n};\n\nInteractable.prototype.checkAndPreventDefault = function (event) {\n const setting = this.options.preventDefault;\n\n if (setting === 'never') { return; }\n\n if (setting === 'always') {\n event.preventDefault();\n return;\n }\n\n // setting === 'auto'\n\n // don't preventDefault if the browser supports passiveEvents\n // CSS touch-action and user-selecct should be used instead\n if (events.supportsOptions) {\n return;\n }\n\n // don't preventDefault of pointerdown events\n if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) {\n return;\n }\n\n // don't preventDefault on editable elements\n if (is.element(event.target)\n && matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) {\n return;\n }\n\n event.preventDefault();\n};\n\nfunction onInteractionEvent ({ interaction, event }) {\n if (interaction.target) {\n interaction.target.checkAndPreventDefault(event);\n }\n}\n\nfor (const eventSignal of ['down', 'move', 'up', 'cancel']) {\n Interaction.signals.on(eventSignal, onInteractionEvent);\n}\n\n// prevent native HTML5 drag on interact.js target elements\nInteraction.docEvents.dragstart = function preventNativeDrag (event) {\n for (const interaction of scope.interactions) {\n\n if (interaction.element\n && (interaction.element === event.target\n || nodeContains(interaction.element, event.target))) {\n\n interaction.target.checkAndPreventDefault(event);\n return;\n }\n }\n};\n","const scope = require('./scope');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst iFinder = require('./utils/interactionFinder');\nconst pointerEvents = require('./pointerEvents/base');\n\nconst { window } = require('./utils/window');\n\nconst toString = Object.prototype.toString;\n\nif (!window.Array.isArray) {\n window.Array.isArray = function (obj) {\n return toString.call(obj) === '[object Array]';\n };\n}\n\nif (!String.prototype.trim) {\n String.prototype.trim = function () {\n return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n };\n}\n\n// http://www.quirksmode.org/dom/events/click.html\n// >Events leading to dblclick\n//\n// IE8 doesn't fire down event before dblclick.\n// This workaround tries to fire a tap and doubletap after dblclick\nfunction onIE8Dblclick (event) {\n const eventTarget = event.target;\n const interaction = iFinder.search(event, event.type, eventTarget);\n\n if (!interaction) { return; }\n\n if (interaction.prevTap\n && event.clientX === interaction.prevTap.clientX\n && event.clientY === interaction.prevTap.clientY\n && eventTarget === interaction.prevTap.target) {\n\n interaction.downTargets[0] = eventTarget;\n interaction.downTimes [0] = new Date().getTime();\n\n pointerEvents.fire({\n interaction,\n event,\n eventTarget,\n pointer: event,\n type: 'tap',\n });\n }\n}\n\nif (browser.isIE8) {\n const selectFix = function (event) {\n for (const interaction of scope.interactions) {\n if (interaction.interacting()) {\n interaction.target.checkAndPreventDefault(event);\n }\n }\n };\n\n const onDocIE8 = function onDocIE8 ({ doc, win }, signalName) {\n const eventMethod = signalName.indexOf('listen') === 0\n ? events.add : events.remove;\n\n // For IE's lack of Event#preventDefault\n eventMethod(doc, 'selectstart', selectFix);\n\n if (pointerEvents) {\n eventMethod(doc, 'dblclick', onIE8Dblclick);\n }\n };\n\n scope.signals.on('add-document' , onDocIE8);\n scope.signals.on('remove-document', onDocIE8);\n}\n\nmodule.exports = null;\n","const InteractEvent = require('../InteractEvent');\nconst Interaction = require('../Interaction');\nconst extend = require('../utils/extend');\n\nconst modifiers = {\n names: [],\n\n setOffsets: function (arg) {\n const { interaction, pageCoords: page } = arg;\n const { target, element, startOffset } = interaction;\n const rect = target.getRect(element);\n\n if (rect) {\n startOffset.left = page.x - rect.left;\n startOffset.top = page.y - rect.top;\n\n startOffset.right = rect.right - page.x;\n startOffset.bottom = rect.bottom - page.y;\n\n if (!('width' in rect)) { rect.width = rect.right - rect.left; }\n if (!('height' in rect)) { rect.height = rect.bottom - rect.top ; }\n }\n else {\n startOffset.left = startOffset.top = startOffset.right = startOffset.bottom = 0;\n }\n\n arg.rect = rect;\n arg.interactable = target;\n arg.element = element;\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n\n arg.options = target.options[interaction.prepared.name][modifierName];\n\n if (!arg.options) {\n continue;\n }\n\n interaction.modifierOffsets[modifierName] = modifiers[modifierName].setOffset(arg);\n }\n },\n\n setAll: function (arg) {\n const { interaction, statuses, preEnd, requireEndOnly } = arg;\n const coords = extend({}, arg.pageCoords);\n const result = {\n dx: 0,\n dy: 0,\n changed: false,\n locked: false,\n shouldMove: true,\n };\n\n for (const modifierName of modifiers.names) {\n const modifier = modifiers[modifierName];\n const options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!shouldDo(options, preEnd, requireEndOnly)) { continue; }\n\n arg.status = arg.status = statuses[modifierName];\n arg.options = options;\n arg.offset = arg.interaction.modifierOffsets[modifierName];\n\n modifier.set(arg);\n\n if (arg.status.locked) {\n coords.x += arg.status.dx;\n coords.y += arg.status.dy;\n\n result.dx += arg.status.dx;\n result.dy += arg.status.dy;\n\n result.locked = true;\n }\n }\n\n // a move should be fired if:\n // - there are no modifiers enabled,\n // - no modifiers are \"locked\" i.e. have changed the pointer's coordinates, or\n // - the locked coords have changed since the last pointer move\n result.shouldMove = !arg.status || !result.locked || arg.status.changed;\n\n return result;\n },\n\n resetStatuses: function (statuses) {\n for (const modifierName of modifiers.names) {\n const status = statuses[modifierName] || {};\n\n status.dx = status.dy = 0;\n status.modifiedX = status.modifiedY = NaN;\n status.locked = false;\n status.changed = true;\n\n statuses[modifierName] = status;\n }\n\n return statuses;\n },\n\n start: function ({ interaction }, signalName) {\n const arg = {\n interaction,\n pageCoords: (signalName === 'action-resume' ?\n interaction.curCoords : interaction.startCoords).page,\n startOffset: interaction.startOffset,\n statuses: interaction.modifierStatuses,\n preEnd: false,\n requireEndOnly: false,\n };\n\n modifiers.setOffsets(arg);\n modifiers.resetStatuses(arg.statuses);\n\n arg.pageCoords = extend({}, interaction.startCoords.page);\n interaction.modifierResult = modifiers.setAll(arg);\n },\n};\n\nInteraction.signals.on('new', function (interaction) {\n interaction.startOffset = { left: 0, right: 0, top: 0, bottom: 0 };\n interaction.modifierOffsets = {};\n interaction.modifierStatuses = modifiers.resetStatuses({});\n interaction.modifierResult = null;\n});\n\nInteraction.signals.on('action-start' , modifiers.start);\nInteraction.signals.on('action-resume', modifiers.start);\n\nInteraction.signals.on('before-action-move', function ({ interaction, preEnd, interactingBeforeMove }) {\n const modifierResult = modifiers.setAll({\n interaction,\n preEnd,\n pageCoords: interaction.curCoords.page,\n statuses: interaction.modifierStatuses,\n requireEndOnly: false,\n });\n\n // don't fire an action move if a modifier would keep the event in the same\n // cordinates as before\n if (!modifierResult.shouldMove && interactingBeforeMove) {\n interaction._dontFireMove = true;\n }\n\n interaction.modifierResult = modifierResult;\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n for (let i = 0; i < modifiers.names.length; i++) {\n const options = interaction.target.options[interaction.prepared.name][modifiers.names[i]];\n\n // if the endOnly option is true for any modifier\n if (shouldDo(options, true, true)) {\n // fire a move event at the modified coordinates\n interaction.doMove({ event, preEnd: true });\n break;\n }\n }\n});\n\nInteractEvent.signals.on('set-xy', function (arg) {\n const { iEvent, interaction } = arg;\n const modifierArg = extend({}, arg);\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n modifierArg.options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!modifierArg.options) {\n continue;\n }\n\n const modifier = modifiers[modifierName];\n\n modifierArg.status = interaction.modifierStatuses[modifierName];\n\n iEvent[modifierName] = modifier.modifyCoords(modifierArg);\n }\n});\n\nfunction shouldDo (options, preEnd, requireEndOnly) {\n return (options && options.enabled\n && (preEnd || !options.endOnly)\n && (!requireEndOnly || options.endOnly));\n}\n\nmodule.exports = modifiers;\n","const modifiers = require('./index');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst restrict = {\n defaults: {\n enabled : false,\n endOnly : false,\n restriction: null,\n elementRect: null,\n },\n\n setOffset: function ({ rect, startOffset, options }) {\n const elementRect = options && options.elementRect;\n const offset = {};\n\n if (rect && elementRect) {\n offset.left = startOffset.left - (rect.width * elementRect.left);\n offset.top = startOffset.top - (rect.height * elementRect.top);\n\n offset.right = startOffset.right - (rect.width * (1 - elementRect.right));\n offset.bottom = startOffset.bottom - (rect.height * (1 - elementRect.bottom));\n }\n else {\n offset.left = offset.top = offset.right = offset.bottom = 0;\n }\n\n return offset;\n },\n\n set: function ({ pageCoords, interaction, status, options }) {\n if (!options) { return status; }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n\n const restriction = getRestrictionRect(options.restriction, interaction, page);\n\n if (!restriction) { return status; }\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n const rect = restriction;\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n const offset = interaction.modifierOffsets.restrict;\n\n // object is assumed to have\n // x, y, width, height or\n // left, top, right, bottom\n if ('x' in restriction && 'y' in restriction) {\n modifiedX = Math.max(Math.min(rect.x + rect.width - offset.right , page.x), rect.x + offset.left);\n modifiedY = Math.max(Math.min(rect.y + rect.height - offset.bottom, page.y), rect.y + offset.top );\n }\n else {\n modifiedX = Math.max(Math.min(rect.right - offset.right , page.x), rect.left + offset.left);\n modifiedY = Math.max(Math.min(rect.bottom - offset.bottom, page.y), rect.top + offset.top );\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const elementRect = options && options.elementRect;\n\n if (options && options.enabled\n && !(phase === 'start' && elementRect && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n getRestrictionRect,\n};\n\nfunction getRestrictionRect (value, interaction, page) {\n if (utils.is.function(value)) {\n return utils.resolveRectLike(value, interaction.target, interaction.element, [page.x, page.y, interaction]);\n } else {\n return utils.resolveRectLike(value, interaction.target, interaction.element);\n }\n}\n\nmodifiers.restrict = restrict;\nmodifiers.names.push('restrict');\n\ndefaultOptions.perAction.restrict = restrict.defaults;\n\nmodule.exports = restrict;\n","// This module adds the options.resize.restrictEdges setting which sets min and\n// max for the top, left, bottom and right edges of the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictEdges: {\n// inner: { top: 200, left: 200, right: 400, bottom: 400 },\n// outer: { top: 0, left: 0, right: 600, bottom: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst { getRestrictionRect } = require('./restrict');\n\nconst noInner = { top: +Infinity, left: +Infinity, bottom: -Infinity, right: -Infinity };\nconst noOuter = { top: -Infinity, left: -Infinity, bottom: +Infinity, right: +Infinity };\n\nconst restrictEdges = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n offset: null,\n },\n\n setOffset: function ({ interaction, startOffset, options }) {\n if (!options) {\n return utils.extend({}, startOffset);\n }\n\n const offset = getRestrictionRect(options.offset, interaction, interaction.startCoords.page);\n\n if (offset) {\n return {\n top: startOffset.top + offset.y,\n left: startOffset.left + offset.x,\n bottom: startOffset.bottom + offset.y,\n right: startOffset.right + offset.x,\n };\n }\n\n return startOffset;\n },\n\n set: function ({ pageCoords, interaction, status, offset, options }) {\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n const inner = rectUtils.xywhToTlbr(getRestrictionRect(options.inner, interaction, page)) || noInner;\n const outer = rectUtils.xywhToTlbr(getRestrictionRect(options.outer, interaction, page)) || noOuter;\n\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n if (edges.top) {\n modifiedY = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top);\n }\n else if (edges.bottom) {\n modifiedY = Math.max(Math.min(outer.bottom - offset.bottom, page.y), inner.bottom - offset.bottom);\n }\n if (edges.left) {\n modifiedX = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left);\n }\n else if (edges.right) {\n modifiedX = Math.max(Math.min(outer.right - offset.right, page.x), inner.right - offset.right);\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n if (options && options.enabled\n && !(phase === 'start' && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n noInner,\n noOuter,\n getRestrictionRect,\n};\n\nmodifiers.restrictEdges = restrictEdges;\nmodifiers.names.push('restrictEdges');\n\ndefaultOptions.perAction.restrictEdges = restrictEdges.defaults;\nresize.defaults.restrictEdges = restrictEdges.defaults;\n\nmodule.exports = restrictEdges;\n","// This module adds the options.resize.restrictSize setting which sets min and\n// max width and height for the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictSize: {\n// min: { width: -600, height: -600 },\n// max: { width: 600, height: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst restrictEdges = require('./restrictEdges');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst noMin = { width: -Infinity, height: -Infinity };\nconst noMax = { width: +Infinity, height: +Infinity };\n\nconst restrictSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n },\n\n setOffset: function ({ interaction }) {\n return interaction.startOffset;\n },\n\n set: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const rect = rectUtils.xywhToTlbr(interaction.resizeRects.inverted);\n\n const minSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.min, interaction)) || noMin;\n const maxSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.max, interaction)) || noMax;\n\n arg.options = {\n enabled: options.enabled,\n endOnly: options.endOnly,\n inner: utils.extend({}, restrictEdges.noInner),\n outer: utils.extend({}, restrictEdges.noOuter),\n };\n\n if (edges.top) {\n arg.options.inner.top = rect.bottom - minSize.height;\n arg.options.outer.top = rect.bottom - maxSize.height;\n }\n else if (edges.bottom) {\n arg.options.inner.bottom = rect.top + minSize.height;\n arg.options.outer.bottom = rect.top + maxSize.height;\n }\n if (edges.left) {\n arg.options.inner.left = rect.right - minSize.width;\n arg.options.outer.left = rect.right - maxSize.width;\n }\n else if (edges.right) {\n arg.options.inner.right = rect.left + minSize.width;\n arg.options.outer.right = rect.left + maxSize.width;\n }\n\n restrictEdges.set(arg);\n },\n\n modifyCoords: restrictEdges.modifyCoords,\n};\n\nmodifiers.restrictSize = restrictSize;\nmodifiers.names.push('restrictSize');\n\ndefaultOptions.perAction.restrictSize = restrictSize.defaults;\nresize.defaults.restrictSize = restrictSize.defaults;\n\nmodule.exports = restrictSize;\n","const modifiers = require('./index');\nconst interact = require('../interact');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst snap = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n\n relativePoints: null,\n },\n\n setOffset: function ({ interaction, interactable, element, rect, startOffset, options }) {\n const offsets = [];\n const optionsOrigin = utils.rectToXY(utils.resolveRectLike(options.origin));\n const origin = optionsOrigin || utils.getOriginXY(interactable, element, interaction.prepared.name);\n options = options || interactable.options[interaction.prepared.name].snap || {};\n\n let snapOffset;\n\n if (options.offset === 'startCoords') {\n snapOffset = {\n x: interaction.startCoords.page.x - origin.x,\n y: interaction.startCoords.page.y - origin.y,\n };\n }\n else {\n const offsetRect = utils.resolveRectLike(options.offset, interactable, element, [interaction]);\n\n snapOffset = utils.rectToXY(offsetRect) || { x: 0, y: 0 };\n }\n\n if (rect && options.relativePoints && options.relativePoints.length) {\n for (const { x: relativeX, y: relativeY } of options.relativePoints) {\n offsets.push({\n x: startOffset.left - (rect.width * relativeX) + snapOffset.x,\n y: startOffset.top - (rect.height * relativeY) + snapOffset.y,\n });\n }\n }\n else {\n offsets.push(snapOffset);\n }\n\n return offsets;\n },\n\n set: function ({ interaction, pageCoords, status, options, offset: offsets }) {\n const targets = [];\n let target;\n let page;\n let i;\n\n if (status.useStatusXY) {\n page = { x: status.x, y: status.y };\n }\n else {\n const origin = utils.getOriginXY(interaction.target, interaction.element, interaction.prepared.name);\n\n page = utils.extend({}, pageCoords);\n\n page.x -= origin.x;\n page.y -= origin.y;\n }\n\n status.realX = page.x;\n status.realY = page.y;\n\n let len = options.targets? options.targets.length : 0;\n\n for (const { x: offsetX, y: offsetY } of offsets) {\n const relativeX = page.x - offsetX;\n const relativeY = page.y - offsetY;\n\n for (const snapTarget of options.targets) {\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n targets.push({\n x: utils.is.number(target.x) ? (target.x + offsetX) : relativeX,\n y: utils.is.number(target.y) ? (target.y + offsetY) : relativeY,\n\n range: utils.is.number(target.range)? target.range: options.range,\n });\n }\n }\n\n const closest = {\n target: null,\n inRange: false,\n distance: 0,\n range: 0,\n dx: 0,\n dy: 0,\n };\n\n for (i = 0, len = targets.length; i < len; i++) {\n target = targets[i];\n\n const range = target.range;\n const dx = target.x - page.x;\n const dy = target.y - page.y;\n const distance = utils.hypot(dx, dy);\n let inRange = distance <= range;\n\n // Infinite targets count as being out of range\n // compared to non infinite ones that are in range\n if (range === Infinity && closest.inRange && closest.range !== Infinity) {\n inRange = false;\n }\n\n if (!closest.target || (inRange\n // is the closest target in range?\n ? (closest.inRange && range !== Infinity\n // the pointer is relatively deeper in this target\n ? distance / range < closest.distance / closest.range\n // this target has Infinite range and the closest doesn't\n : (range === Infinity && closest.range !== Infinity)\n // OR this target is closer that the previous closest\n || distance < closest.distance)\n // The other is not in range and the pointer is closer to this target\n : (!closest.inRange && distance < closest.distance))) {\n\n closest.target = target;\n closest.distance = distance;\n closest.range = range;\n closest.inRange = inRange;\n closest.dx = dx;\n closest.dy = dy;\n\n status.range = range;\n }\n }\n\n let snapChanged;\n\n if (closest.target) {\n snapChanged = (status.modifiedX !== closest.target.x || status.modifiedY !== closest.target.y);\n\n status.modifiedX = closest.target.x;\n status.modifiedY = closest.target.y;\n }\n else {\n snapChanged = true;\n\n status.modifiedX = NaN;\n status.modifiedY = NaN;\n }\n\n status.dx = closest.dx;\n status.dy = closest.dy;\n\n status.changed = (snapChanged || (closest.inRange && !status.locked));\n status.locked = closest.inRange;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const relativePoints = options && options.relativePoints;\n\n if (options && options.enabled\n && !(phase === 'start' && relativePoints && relativePoints.length)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n }\n\n return {\n range : status.range,\n locked : status.locked,\n x : status.modifiedX,\n y : status.modifiedY,\n realX : status.realX,\n realY : status.realY,\n dx : status.dx,\n dy : status.dy,\n };\n }\n },\n};\n\ninteract.createSnapGrid = function (grid) {\n return function (x, y) {\n const limits = grid.limits || {\n left : -Infinity,\n right : Infinity,\n top : -Infinity,\n bottom: Infinity,\n };\n let offsetX = 0;\n let offsetY = 0;\n\n if (utils.is.object(grid.offset)) {\n offsetX = grid.offset.x;\n offsetY = grid.offset.y;\n }\n\n const gridx = Math.round((x - offsetX) / grid.x);\n const gridy = Math.round((y - offsetY) / grid.y);\n\n const newX = Math.max(limits.left, Math.min(limits.right , gridx * grid.x + offsetX));\n const newY = Math.max(limits.top , Math.min(limits.bottom, gridy * grid.y + offsetY));\n\n return {\n x: newX,\n y: newY,\n range: grid.range,\n };\n };\n};\n\nmodifiers.snap = snap;\nmodifiers.names.push('snap');\n\ndefaultOptions.perAction.snap = snap.defaults;\n\nmodule.exports = snap;\n","// This module allows snapping of the size of targets during resize\n// interactions.\n\nconst modifiers = require('./index');\nconst snap = require('./snap');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\nconst utils = require('../utils/');\n\nconst snapSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n },\n\n setOffset: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.edges;\n\n if (!edges) { return; }\n\n arg.options = {\n relativePoints: [{\n x: edges.left? 0 : 1,\n y: edges.top ? 0 : 1,\n }],\n origin: { x: 0, y: 0 },\n offset: 'self',\n range: options.range,\n };\n\n const offsets = snap.setOffset(arg);\n arg.options = options;\n\n return offsets;\n },\n\n set: function (arg) {\n const { interaction, options, offset, pageCoords } = arg;\n const page = utils.extend({}, pageCoords);\n const relativeX = page.x - offset[0].x;\n const relativeY = page.y - offset[0].y;\n\n arg.options = utils.extend({}, options);\n arg.options.targets = [];\n\n for (const snapTarget of options.targets) {\n let target;\n\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n if ('width' in target && 'height' in target) {\n target.x = target.width;\n target.y = target.height;\n }\n\n arg.options.targets.push(target);\n }\n\n snap.set(arg);\n },\n\n modifyCoords: function (arg) {\n const { options } = arg;\n\n arg.options = utils.extend({}, options);\n arg.options.enabled = options.enabled;\n arg.options.relativePoints = [null];\n\n snap.modifyCoords(arg);\n },\n};\n\nmodifiers.snapSize = snapSize;\nmodifiers.names.push('snapSize');\n\ndefaultOptions.perAction.snapSize = snapSize.defaults;\nresize.defaults.snapSize = snapSize.defaults;\n\nmodule.exports = snapSize;\n","const pointerUtils = require('../utils/pointerUtils');\n\nmodule.exports = class PointerEvent {\n constructor (type, pointer, event, eventTarget, interaction) {\n pointerUtils.pointerExtend(this, event);\n\n if (event !== pointer) {\n pointerUtils.pointerExtend(this, pointer);\n }\n\n this.interaction = interaction;\n\n this.timeStamp = new Date().getTime();\n this.originalEvent = event;\n this.type = type;\n this.pointerId = pointerUtils.getPointerId(pointer);\n this.pointerType = pointerUtils.getPointerType(pointer, interaction);\n this.target = eventTarget;\n this.currentTarget = null;\n\n if (type === 'tap') {\n const pointerIndex = interaction.getPointerIndex(pointer);\n this.dt = this.timeStamp - interaction.downTimes[pointerIndex];\n\n const interval = this.timeStamp - interaction.tapTime;\n\n this.double = !!(interaction.prevTap\n && interaction.prevTap.type !== 'doubletap'\n && interaction.prevTap.target === this.target\n && interval < 500);\n }\n else if (type === 'doubletap') {\n this.dt = pointer.timeStamp - interaction.tapTime;\n }\n }\n\n subtractOrigin ({ x: originX, y: originY }) {\n this.pageX -= originX;\n this.pageY -= originY;\n this.clientX -= originX;\n this.clientY -= originY;\n\n return this;\n }\n\n addOrigin ({ x: originX, y: originY }) {\n this.pageX += originX;\n this.pageY += originY;\n this.clientX += originX;\n this.clientY += originY;\n\n return this;\n }\n\n preventDefault () {\n this.originalEvent.preventDefault();\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n};\n","const PointerEvent = require('./PointerEvent');\nconst Interaction = require('../Interaction');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst defaults = require('../defaultOptions');\nconst signals = require('../utils/Signals').new();\nconst { filter } = require('../utils/arr');\n\nconst simpleSignals = [ 'down', 'up', 'cancel' ];\nconst simpleEvents = [ 'down', 'up', 'cancel' ];\n\nconst pointerEvents = {\n PointerEvent,\n fire,\n collectEventTargets,\n signals,\n defaults: {\n holdDuration: 600,\n ignoreFrom : null,\n allowFrom : null,\n origin : { x: 0, y: 0 },\n },\n types: [\n 'down',\n 'move',\n 'up',\n 'cancel',\n 'tap',\n 'doubletap',\n 'hold',\n ],\n};\n\nfunction fire (arg) {\n const {\n interaction, pointer, event, eventTarget,\n type = arg.pointerEvent.type,\n targets = collectEventTargets(arg),\n pointerEvent = new PointerEvent(type, pointer, event, eventTarget, interaction),\n } = arg;\n\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n targets,\n type,\n pointerEvent,\n };\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n\n for (const prop in target.props || {}) {\n pointerEvent[prop] = target.props[prop];\n }\n\n const origin = utils.getOriginXY(target.eventable, target.element);\n\n pointerEvent.subtractOrigin(origin);\n pointerEvent.eventable = target.eventable;\n pointerEvent.currentTarget = target.element;\n\n target.eventable.fire(pointerEvent);\n\n pointerEvent.addOrigin(origin);\n\n if (pointerEvent.immediatePropagationStopped\n || (pointerEvent.propagationStopped\n && (i + 1) < targets.length && targets[i + 1].element !== pointerEvent.currentTarget)) {\n break;\n }\n }\n\n signals.fire('fired', signalArg);\n\n if (type === 'tap') {\n // if pointerEvent should make a double tap, create and fire a doubletap\n // PointerEvent and use that as the prevTap\n const prevTap = pointerEvent.double\n ? fire({\n interaction, pointer, event, eventTarget,\n type: 'doubletap',\n })\n : pointerEvent;\n\n interaction.prevTap = prevTap;\n interaction.tapTime = prevTap.timeStamp;\n }\n\n return pointerEvent;\n}\n\nfunction collectEventTargets ({ interaction, pointer, event, eventTarget, type }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n // do not fire a tap event if the pointer was moved before being lifted\n if (type === 'tap' && (interaction.pointerWasMoved\n // or if the pointerup target is different to the pointerdown target\n || !(interaction.downTargets[pointerIndex] && interaction.downTargets[pointerIndex] === eventTarget))) {\n return [];\n }\n\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n path,\n targets: [],\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (type === 'hold') {\n signalArg.targets = filter(signalArg.targets, target =>\n target.eventable.options.holdDuration === interaction.holdTimers[pointerIndex].duration);\n }\n\n return signalArg.targets;\n}\n\nInteraction.signals.on('update-pointer-down', function ({ interaction, pointerIndex }) {\n interaction.holdTimers[pointerIndex] = { duration: Infinity, timeout: null };\n});\n\nInteraction.signals.on('remove-pointer', function ({ interaction, pointerIndex }) {\n interaction.holdTimers.splice(pointerIndex, 1);\n});\n\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget, duplicateMove }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n if (!duplicateMove && (!interaction.pointerIsDown || interaction.pointerWasMoved)) {\n if (interaction.pointerIsDown) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n\n fire({\n interaction, pointer, event, eventTarget,\n type: 'move',\n });\n }\n});\n\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget, pointerIndex }) {\n // copy event to be used in timeout for IE8\n const eventCopy = browser.isIE8? utils.extend({}, event) : event;\n\n const timer = interaction.holdTimers[pointerIndex];\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'hold',\n targets: [],\n path,\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (!signalArg.targets.length) { return; }\n\n let minDuration = Infinity;\n\n for (let i = 0; i < signalArg.targets.length; i++) {\n const target = signalArg.targets[i];\n const holdDuration = target.eventable.options.holdDuration;\n\n if (holdDuration < minDuration) {\n minDuration = holdDuration;\n }\n }\n\n timer.duration = minDuration;\n timer.timeout = setTimeout(function () {\n fire({\n interaction, eventCopy, eventTarget,\n pointer: browser.isIE8? eventCopy : pointer,\n type: 'hold',\n });\n }, minDuration);\n});\n\nInteraction.signals.on('up', ({ interaction, pointer, event, eventTarget }) => {\n if (!interaction.pointerWasMoved) {\n fire({ interaction, eventTarget, pointer, event, type: 'tap' });\n }\n});\n\n['up', 'cancel'].forEach(function (signalName) {\n Interaction.signals.on(signalName, function ({ interaction, pointerIndex }) {\n if (interaction.holdTimers[pointerIndex]) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n });\n});\n\nfunction createSignalListener (type) {\n return function ({ interaction, pointer, event, eventTarget }) {\n fire({ interaction, eventTarget, pointer, event, type });\n };\n}\n\nfor (let i = 0; i < simpleSignals.length; i++) {\n Interaction.signals.on(simpleSignals[i], createSignalListener(simpleEvents[i]));\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.prevTap = null; // the most recent tap event on this interaction\n interaction.tapTime = 0; // time of the most recent tap event\n interaction.holdTimers = []; // [{ duration, timeout }]\n});\n\ndefaults.pointerEvents = pointerEvents.defaults;\nmodule.exports = pointerEvents;\n","const pointerEvents = require('./base');\nconst Interaction = require('../Interaction');\n\npointerEvents.signals.on('new', onNew);\npointerEvents.signals.on('fired', onFired);\n\nfor (const signal of ['move', 'up', 'cancel', 'endall']) {\n Interaction.signals.on(signal, endHoldRepeat);\n}\n\nfunction onNew ({ pointerEvent }) {\n if (pointerEvent.type !== 'hold') { return; }\n\n pointerEvent.count = (pointerEvent.count || 0) + 1;\n}\n\nfunction onFired ({ interaction, pointerEvent, eventTarget, targets }) {\n if (pointerEvent.type !== 'hold' || !targets.length) { return; }\n\n // get the repeat interval from the first eventable\n const interval = targets[0].eventable.options.holdRepeatInterval;\n\n // don't repeat if the interval is 0 or less\n if (interval <= 0) { return; }\n\n // set a timeout to fire the holdrepeat event\n interaction.holdIntervalHandle = setTimeout(function () {\n pointerEvents.fire({\n interaction,\n eventTarget,\n type: 'hold',\n pointer: pointerEvent,\n event: pointerEvent,\n });\n }, interval);\n}\n\nfunction endHoldRepeat ({ interaction }) {\n // set the interaction's holdStopTime property\n // to stop further holdRepeat events\n if (interaction.holdIntervalHandle) {\n clearInterval(interaction.holdIntervalHandle);\n interaction.holdIntervalHandle = null;\n }\n}\n\n// don't repeat by default\npointerEvents.defaults.holdRepeatInterval = 0;\npointerEvents.types.push('holdrepeat');\n\nmodule.exports = {\n onNew,\n onFired,\n endHoldRepeat,\n};\n","const pointerEvents = require('./base');\nconst Interactable = require('../Interactable');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\nconst scope = require('../scope');\nconst extend = require('../utils/extend');\nconst { merge } = require('../utils/arr');\n\npointerEvents.signals.on('collect-targets', function ({ targets, element, type, eventTarget }) {\n function collectSelectors (interactable, selector, context) {\n const els = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && is.element(element)\n && domUtils.matchesSelector(element, selector, els)\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n const interactable = scope.interactables.get(element);\n\n if (interactable) {\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n scope.interactables.forEachSelector(collectSelectors, element);\n});\n\nInteractable.signals.on('new', function ({ interactable }) {\n interactable.events.getRect = function (element) {\n return interactable.getRect(element);\n };\n});\n\nInteractable.signals.on('set', function ({ interactable, options }) {\n extend(interactable.events.options, pointerEvents.defaults);\n extend(interactable.events.options, options);\n});\n\nmerge(Interactable.eventTypes, pointerEvents.types);\n\nInteractable.prototype.pointerEvents = function (options) {\n extend(this.events.options, options);\n\n return this;\n};\n\nconst __backCompatOption = Interactable.prototype._backCompatOption;\n\nInteractable.prototype._backCompatOption = function (optionName, newValue) {\n const ret = __backCompatOption.call(this, optionName, newValue);\n\n if (ret === this) {\n this.events.options[optionName] = newValue;\n }\n\n return ret;\n};\n\nInteractable.settingsMethods.push('pointerEvents');\n","const utils = require('./utils');\nconst events = require('./utils/events');\nconst signals = require('./utils/Signals').new();\n\nconst scope = {\n signals,\n events,\n utils,\n\n // main document\n document: require('./utils/domObjects').document,\n // all documents being listened to\n documents: [],\n\n addDocument: function (doc, win) {\n // do nothing if document is already known\n if (utils.contains(scope.documents, doc)) { return false; }\n\n win = win || scope.getWindow(doc);\n\n scope.documents.push(doc);\n events.documents.push(doc);\n\n // don't add an unload event for the main document\n // so that the page may be cached in browser history\n if (doc !== scope.document) {\n events.add(win, 'unload', scope.onWindowUnload);\n }\n\n signals.fire('add-document', { doc, win });\n },\n\n removeDocument: function (doc, win) {\n const index = utils.indexOf(scope.documents, doc);\n\n win = win || scope.getWindow(doc);\n\n events.remove(win, 'unload', scope.onWindowUnload);\n\n scope.documents.splice(index, 1);\n events.documents.splice(index, 1);\n\n signals.fire('remove-document', { win, doc });\n },\n\n onWindowUnload: function () {\n scope.removeDocument(this.document, this);\n },\n};\n\nmodule.exports = scope;\n","const { indexOf } = require('./arr');\n\nclass Signals {\n constructor () {\n this.listeners = {\n // signalName: [listeners],\n };\n }\n\n on (name, listener) {\n if (!this.listeners[name]) {\n this.listeners[name] = [listener];\n return;\n }\n\n this.listeners[name].push(listener);\n }\n\n off (name, listener) {\n if (!this.listeners[name]) { return; }\n\n const index = indexOf(this.listeners[name], listener);\n\n if (index !== -1) {\n this.listeners[name].splice(index, 1);\n }\n }\n\n fire (name, arg) {\n const targetListeners = this.listeners[name];\n\n if (!targetListeners) { return; }\n\n for (let i = 0; i < targetListeners.length; i++) {\n if (targetListeners[i](arg, name) === false) {\n return;\n }\n }\n }\n}\n\nSignals.new = function () {\n return new Signals();\n};\n\nmodule.exports = Signals;\n","function indexOf (array, target) {\n for (let i = 0, len = array.length; i < len; i++) {\n if (array[i] === target) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction contains (array, target) {\n return indexOf(array, target) !== -1;\n}\n\nfunction merge (target, source) {\n for (let i = 0; i < source.length; i++) {\n target.push(source[i]);\n }\n\n return target;\n}\n\nfunction filter (array, test) {\n const result = [];\n\n for (let i = 0; i < array.length; i++) {\n if (test(array[i])) {\n result.push(array[i]);\n }\n }\n\n return result;\n}\n\nmodule.exports = {\n indexOf,\n contains,\n merge,\n filter,\n};\n","const { window } = require('./window');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst Element = domObjects.Element;\nconst navigator = window.navigator;\n\nconst browser = {\n // Does the browser support touch input?\n supportsTouch: !!(('ontouchstart' in window) || is.function(window.DocumentTouch)\n && domObjects.document instanceof window.DocumentTouch),\n\n // Does the browser support PointerEvents\n supportsPointerEvent: !!domObjects.PointerEvent,\n\n isIE8: ('attachEvent' in window) && !('addEventListener' in window),\n\n // Opera Mobile must be handled differently\n isOperaMobile: (navigator.appName === 'Opera'\n && browser.supportsTouch\n && navigator.userAgent.match('Presto')),\n\n // scrolling doesn't change the result of getClientRects on iOS 7\n isIOS7: (/iP(hone|od|ad)/.test(navigator.platform)\n && /OS 7[^\\d]/.test(navigator.appVersion)),\n\n isIe9OrOlder: /MSIE (8|9)/.test(navigator.userAgent),\n\n // prefix matchesSelector\n prefixedMatchesSelector: 'matches' in Element.prototype\n ? 'matches': 'webkitMatchesSelector' in Element.prototype\n ? 'webkitMatchesSelector': 'mozMatchesSelector' in Element.prototype\n ? 'mozMatchesSelector': 'oMatchesSelector' in Element.prototype\n ? 'oMatchesSelector': 'msMatchesSelector',\n\n useMatchesSelectorPolyfill: false,\n\n pEventTypes: (domObjects.PointerEvent\n ? (domObjects.PointerEvent === window.MSPointerEvent\n ? {\n up: 'MSPointerUp',\n down: 'MSPointerDown',\n over: 'mouseover',\n out: 'mouseout',\n move: 'MSPointerMove',\n cancel: 'MSPointerCancel',\n }\n : {\n up: 'pointerup',\n down: 'pointerdown',\n over: 'pointerover',\n out: 'pointerout',\n move: 'pointermove',\n cancel: 'pointercancel',\n })\n : null),\n\n // because Webkit and Opera still use 'mousewheel' event type\n wheelEvent: 'onmousewheel' in domObjects.document? 'mousewheel': 'wheel',\n\n};\n\nbrowser.useMatchesSelectorPolyfill = !is.function(Element.prototype[browser.prefixedMatchesSelector]);\n\nmodule.exports = browser;\n","const domObjects = {};\nconst win = require('./window').window;\n\nfunction blank () {}\n\ndomObjects.document = win.document;\ndomObjects.DocumentFragment = win.DocumentFragment || blank;\ndomObjects.SVGElement = win.SVGElement || blank;\ndomObjects.SVGSVGElement = win.SVGSVGElement || blank;\ndomObjects.SVGElementInstance = win.SVGElementInstance || blank;\ndomObjects.Element = win.Element || blank;\ndomObjects.HTMLElement = win.HTMLElement || domObjects.Element;\n\ndomObjects.Event = win.Event;\ndomObjects.Touch = win.Touch || blank;\ndomObjects.PointerEvent = (win.PointerEvent || win.MSPointerEvent);\n\nmodule.exports = domObjects;\n","const win = require('./window');\nconst browser = require('./browser');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst domUtils = {\n nodeContains: function (parent, child) {\n while (child) {\n if (child === parent) {\n return true;\n }\n\n child = child.parentNode;\n }\n\n return false;\n },\n\n closest: function (element, selector) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) { return element; }\n\n element = domUtils.parentNode(element);\n }\n\n return null;\n },\n\n parentNode: function (node) {\n let parent = node.parentNode;\n\n if (is.docFrag(parent)) {\n // skip past #shado-root fragments\n while ((parent = parent.host) && is.docFrag(parent)) {\n continue;\n }\n\n return parent;\n }\n\n return parent;\n },\n\n // taken from http://tanalin.com/en/blog/2012/12/matches-selector-ie8/ and modified\n matchesSelectorPolyfill: browser.useMatchesSelectorPolyfill\n ? function (element, selector, elems) {\n elems = elems || element.parentNode.querySelectorAll(selector);\n\n for (let i = 0, len = elems.length; i < len; i++) {\n if (elems[i] === element) {\n return true;\n }\n }\n\n return false;\n }\n : null,\n\n matchesSelector: function (element, selector, nodeList) {\n if (browser.useMatchesSelectorPolyfill) {\n return domUtils.matchesSelectorPolyfill(element, selector, nodeList);\n }\n\n // remove /deep/ from selectors if shadowDOM polyfill is used\n if (win.window !== win.realWindow) {\n selector = selector.replace(/\\/deep\\//g, ' ');\n }\n\n return element[browser.prefixedMatchesSelector](selector);\n },\n\n // Test for the element that's \"above\" all other qualifiers\n indexOfDeepestElement: function (elements) {\n let deepestZoneParents = [];\n let dropzoneParents = [];\n let dropzone;\n let deepestZone = elements[0];\n let index = deepestZone? 0: -1;\n let parent;\n let child;\n let i;\n let n;\n\n for (i = 1; i < elements.length; i++) {\n dropzone = elements[i];\n\n // an element might belong to multiple selector dropzones\n if (!dropzone || dropzone === deepestZone) {\n continue;\n }\n\n if (!deepestZone) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n // check if the deepest or current are document.documentElement or document.rootElement\n // - if the current dropzone is, do nothing and continue\n if (dropzone.parentNode === dropzone.ownerDocument) {\n continue;\n }\n // - if deepest is, update with the current dropzone and continue to next\n else if (deepestZone.parentNode === dropzone.ownerDocument) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n if (!deepestZoneParents.length) {\n parent = deepestZone;\n while (parent.parentNode && parent.parentNode !== parent.ownerDocument) {\n deepestZoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n }\n\n // if this element is an svg element and the current deepest is\n // an HTMLElement\n if (deepestZone instanceof domObjects.HTMLElement\n && dropzone instanceof domObjects.SVGElement\n && !(dropzone instanceof domObjects.SVGSVGElement)) {\n\n if (dropzone === deepestZone.parentNode) {\n continue;\n }\n\n parent = dropzone.ownerSVGElement;\n }\n else {\n parent = dropzone;\n }\n\n dropzoneParents = [];\n\n while (parent.parentNode !== parent.ownerDocument) {\n dropzoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n\n n = 0;\n\n // get (position of last common ancestor) + 1\n while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) {\n n++;\n }\n\n const parents = [\n dropzoneParents[n - 1],\n dropzoneParents[n],\n deepestZoneParents[n],\n ];\n\n child = parents[0].lastChild;\n\n while (child) {\n if (child === parents[1]) {\n deepestZone = dropzone;\n index = i;\n deepestZoneParents = [];\n\n break;\n }\n else if (child === parents[2]) {\n break;\n }\n\n child = child.previousSibling;\n }\n }\n\n return index;\n },\n\n matchesUpTo: function (element, selector, limit) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) {\n return true;\n }\n\n element = domUtils.parentNode(element);\n\n if (element === limit) {\n return domUtils.matchesSelector(element, selector);\n }\n }\n\n return false;\n },\n\n getActualElement: function (element) {\n return (element instanceof domObjects.SVGElementInstance\n ? element.correspondingUseElement\n : element);\n },\n\n getScrollXY: function (relevantWindow) {\n relevantWindow = relevantWindow || win.window;\n return {\n x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft,\n y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop,\n };\n },\n\n getElementClientRect: function (element) {\n const clientRect = (element instanceof domObjects.SVGElement\n ? element.getBoundingClientRect()\n : element.getClientRects()[0]);\n\n return clientRect && {\n left : clientRect.left,\n right : clientRect.right,\n top : clientRect.top,\n bottom: clientRect.bottom,\n width : clientRect.width || clientRect.right - clientRect.left,\n height: clientRect.height || clientRect.bottom - clientRect.top,\n };\n },\n\n getElementRect: function (element) {\n const clientRect = domUtils.getElementClientRect(element);\n\n if (!browser.isIOS7 && clientRect) {\n const scroll = domUtils.getScrollXY(win.getWindow(element));\n\n clientRect.left += scroll.x;\n clientRect.right += scroll.x;\n clientRect.top += scroll.y;\n clientRect.bottom += scroll.y;\n }\n\n return clientRect;\n },\n\n getPath: function (element) {\n const path = [];\n\n while (element) {\n path.push(element);\n element = domUtils.parentNode(element);\n }\n\n return path;\n },\n\n trySelector: value => {\n if (!is.string(value)) { return false; }\n\n // an exception will be raised if it is invalid\n domObjects.document.querySelector(value);\n return true;\n },\n};\n\nmodule.exports = domUtils;\n","const is = require('./is');\nconst domUtils = require('./domUtils');\nconst pExtend = require('./pointerExtend');\n\nconst { window, getWindow } = require('./window');\nconst { indexOf, contains } = require('./arr');\n\nconst useAttachEvent = ('attachEvent' in window) && !('addEventListener' in window);\nconst addEvent = useAttachEvent? 'attachEvent': 'addEventListener';\nconst removeEvent = useAttachEvent? 'detachEvent': 'removeEventListener';\nconst on = useAttachEvent? 'on': '';\n\nconst elements = [];\nconst targets = [];\nconst attachedListeners = [];\n\n// {\n// type: {\n// selectors: ['selector', ...],\n// contexts : [document, ...],\n// listeners: [[listener, capture, passive], ...]\n// }\n// }\nconst delegatedEvents = {};\n\nconst documents = [];\n\nconst supportsOptions = !useAttachEvent && (() => {\n let supported = false;\n\n window.document.createElement('div').addEventListener('test', null, {\n get capture () { supported = true; },\n });\n\n return supported;\n})();\n\nfunction add (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n let elementIndex = indexOf(elements, element);\n let target = targets[elementIndex];\n\n if (!target) {\n target = {\n events: {},\n typeCount: 0,\n };\n\n elementIndex = elements.push(element) - 1;\n targets.push(target);\n\n attachedListeners.push(useAttachEvent\n ? {\n supplied: [],\n wrapped : [],\n useCount: [],\n }\n : null);\n }\n\n if (!target.events[type]) {\n target.events[type] = [];\n target.typeCount++;\n }\n\n if (!contains(target.events[type], listener)) {\n let ret;\n\n if (useAttachEvent) {\n const { supplied, wrapped, useCount } = attachedListeners[elementIndex];\n const listenerIndex = indexOf(supplied, listener);\n\n const wrappedListener = wrapped[listenerIndex] || function (event) {\n if (!event.immediatePropagationStopped) {\n event.target = event.srcElement;\n event.currentTarget = element;\n\n event.preventDefault = event.preventDefault || preventDef;\n event.stopPropagation = event.stopPropagation || stopProp;\n event.stopImmediatePropagation = event.stopImmediatePropagation || stopImmProp;\n\n if (/mouse|click/.test(event.type)) {\n event.pageX = event.clientX + getWindow(element).document.documentElement.scrollLeft;\n event.pageY = event.clientY + getWindow(element).document.documentElement.scrollTop;\n }\n\n listener(event);\n }\n };\n\n ret = element[addEvent](on + type, wrappedListener, !!options.capture);\n\n if (listenerIndex === -1) {\n supplied.push(listener);\n wrapped.push(wrappedListener);\n useCount.push(1);\n }\n else {\n useCount[listenerIndex]++;\n }\n }\n else {\n ret = element[addEvent](type, listener, supportsOptions? options : !!options.capture);\n }\n target.events[type].push(listener);\n\n return ret;\n }\n}\n\nfunction remove (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const elementIndex = indexOf(elements, element);\n const target = targets[elementIndex];\n\n if (!target || !target.events) {\n return;\n }\n\n let wrappedListener = listener;\n let listeners;\n let listenerIndex;\n\n if (useAttachEvent) {\n listeners = attachedListeners[elementIndex];\n listenerIndex = indexOf(listeners.supplied, listener);\n wrappedListener = listeners.wrapped[listenerIndex];\n }\n\n if (type === 'all') {\n for (type in target.events) {\n if (target.events.hasOwnProperty(type)) {\n remove(element, type, 'all');\n }\n }\n return;\n }\n\n if (target.events[type]) {\n const len = target.events[type].length;\n\n if (listener === 'all') {\n for (let i = 0; i < len; i++) {\n remove(element, type, target.events[type][i], options);\n }\n return;\n }\n else {\n for (let i = 0; i < len; i++) {\n if (target.events[type][i] === listener) {\n element[removeEvent](on + type, wrappedListener, supportsOptions? options : !!options.capture);\n target.events[type].splice(i, 1);\n\n if (useAttachEvent && listeners) {\n listeners.useCount[listenerIndex]--;\n if (listeners.useCount[listenerIndex] === 0) {\n listeners.supplied.splice(listenerIndex, 1);\n listeners.wrapped.splice(listenerIndex, 1);\n listeners.useCount.splice(listenerIndex, 1);\n }\n }\n\n break;\n }\n }\n }\n\n if (target.events[type] && target.events[type].length === 0) {\n target.events[type] = null;\n target.typeCount--;\n }\n }\n\n if (!target.typeCount) {\n targets.splice(elementIndex, 1);\n elements.splice(elementIndex, 1);\n attachedListeners.splice(elementIndex, 1);\n }\n}\n\nfunction addDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n if (!delegatedEvents[type]) {\n delegatedEvents[type] = {\n selectors: [],\n contexts : [],\n listeners: [],\n };\n\n // add delegate listener functions\n for (let i = 0; i < documents.length; i++) {\n add(documents[i], type, delegateListener);\n add(documents[i], type, delegateUseCapture, true);\n }\n }\n\n const delegated = delegatedEvents[type];\n let index;\n\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n break;\n }\n }\n\n if (index === -1) {\n index = delegated.selectors.length;\n\n delegated.selectors.push(selector);\n delegated.contexts .push(context);\n delegated.listeners.push([]);\n }\n\n // keep listener and capture and passive flags\n delegated.listeners[index].push([listener, !!options.capture, options.passive]);\n}\n\nfunction removeDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const delegated = delegatedEvents[type];\n let matchFound = false;\n let index;\n\n if (!delegated) { return; }\n\n // count from last index of delegated to 0\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n // look for matching selector and context Node\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n\n const listeners = delegated.listeners[index];\n\n // each item of the listeners array is an array: [function, capture, passive]\n for (let i = listeners.length - 1; i >= 0; i--) {\n const [fn, capture, passive] = listeners[i];\n\n // check if the listener functions and capture and passive flags match\n if (fn === listener && capture === !!options.capture && passive === options.passive) {\n // remove the listener from the array of listeners\n listeners.splice(i, 1);\n\n // if all listeners for this interactable have been removed\n // remove the interactable from the delegated arrays\n if (!listeners.length) {\n delegated.selectors.splice(index, 1);\n delegated.contexts .splice(index, 1);\n delegated.listeners.splice(index, 1);\n\n // remove delegate function from context\n remove(context, type, delegateListener);\n remove(context, type, delegateUseCapture, true);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegatedEvents[type] = null;\n }\n }\n\n // only remove one listener\n matchFound = true;\n break;\n }\n }\n\n if (matchFound) { break; }\n }\n }\n}\n\n// bound to the interactable context when a DOM event\n// listener is added to a selector interactable\nfunction delegateListener (event, optionalArg) {\n const options = getOptions(optionalArg);\n const fakeEvent = {};\n const delegated = delegatedEvents[event.type];\n const eventTarget = (domUtils.getActualElement(event.path\n ? event.path[0]\n : event.target));\n let element = eventTarget;\n\n // duplicate the event so that currentTarget can be changed\n pExtend(fakeEvent, event);\n\n fakeEvent.originalEvent = event;\n fakeEvent.preventDefault = preventOriginalDefault;\n\n // climb up document tree looking for selector matches\n while (is.element(element)) {\n for (let i = 0; i < delegated.selectors.length; i++) {\n const selector = delegated.selectors[i];\n const context = delegated.contexts[i];\n\n if (domUtils.matchesSelector(element, selector)\n && domUtils.nodeContains(context, eventTarget)\n && domUtils.nodeContains(context, element)) {\n\n const listeners = delegated.listeners[i];\n\n fakeEvent.currentTarget = element;\n\n for (let j = 0; j < listeners.length; j++) {\n const [fn, capture, passive] = listeners[j];\n\n if (capture === !!options.capture && passive === options.passive) {\n fn(fakeEvent);\n }\n }\n }\n }\n\n element = domUtils.parentNode(element);\n }\n}\n\nfunction delegateUseCapture (event) {\n return delegateListener.call(this, event, true);\n}\n\nfunction preventDef () {\n this.returnValue = false;\n}\n\nfunction preventOriginalDefault () {\n this.originalEvent.preventDefault();\n}\n\nfunction stopProp () {\n this.cancelBubble = true;\n}\n\nfunction stopImmProp () {\n this.cancelBubble = true;\n this.immediatePropagationStopped = true;\n}\n\nfunction getOptions (param) {\n return is.object(param)? param : { capture: param };\n}\n\nmodule.exports = {\n add,\n remove,\n\n addDelegate,\n removeDelegate,\n\n delegateListener,\n delegateUseCapture,\n delegatedEvents,\n documents,\n\n useAttachEvent,\n supportsOptions,\n\n _elements: elements,\n _targets: targets,\n _attachedListeners: attachedListeners,\n};\n","module.exports = function extend (dest, source) {\n for (const prop in source) {\n dest[prop] = source[prop];\n }\n return dest;\n};\n","const {\n resolveRectLike,\n rectToXY,\n} = require('./rect');\n\nmodule.exports = function (target, element, action) {\n const actionOptions = target.options[action];\n const actionOrigin = actionOptions && actionOptions.origin;\n const origin = actionOrigin || target.options.origin;\n\n const originRect = resolveRectLike(origin, target, element, [target && element]);\n\n return rectToXY(originRect) || { x: 0, y: 0 };\n};\n","module.exports = (x, y) => Math.sqrt(x * x + y * y);\n","const extend = require('./extend');\nconst win = require('./window');\n\nconst utils = {\n warnOnce: function (method, message) {\n let warned = false;\n\n return function () {\n if (!warned) {\n win.window.console.warn(message);\n warned = true;\n }\n\n return method.apply(this, arguments);\n };\n },\n\n // http://stackoverflow.com/a/5634528/2280888\n _getQBezierValue: function (t, p1, p2, p3) {\n const iT = 1 - t;\n return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3;\n },\n\n getQuadraticCurvePoint: function (startX, startY, cpX, cpY, endX, endY, position) {\n return {\n x: utils._getQBezierValue(position, startX, cpX, endX),\n y: utils._getQBezierValue(position, startY, cpY, endY),\n };\n },\n\n // http://gizma.com/easing/\n easeOutQuad: function (t, b, c, d) {\n t /= d;\n return -c * t*(t-2) + b;\n },\n\n copyAction: function (dest, src) {\n dest.name = src.name;\n dest.axis = src.axis;\n dest.edges = src.edges;\n\n return dest;\n },\n\n is : require('./is'),\n extend : extend,\n hypot : require('./hypot'),\n getOriginXY: require('./getOriginXY'),\n};\n\nextend(utils, require('./arr'));\nextend(utils, require('./domUtils'));\nextend(utils, require('./pointerUtils'));\nextend(utils, require('./rect'));\n\nmodule.exports = utils;\n","const scope = require('../scope');\nconst utils = require('./index');\nconst browser = require('./browser');\n\nconst finder = {\n methodOrder: [ 'simulationResume', 'mouse', 'hasPointer', 'idle' ],\n\n search: function (pointer, eventType, eventTarget) {\n const mouseEvent = (/mouse/i.test(pointer.pointerType || eventType)\n // MSPointerEvent.MSPOINTER_TYPE_MOUSE\n || pointer.pointerType === 4);\n const pointerId = utils.getPointerId(pointer);\n const details = { pointer, pointerId, mouseEvent, eventType, eventTarget };\n\n for (const method of finder.methodOrder) {\n const interaction = finder[method](details);\n\n if (interaction) {\n return interaction;\n }\n }\n },\n\n // try to resume simulation with a new pointer\n simulationResume: function ({ mouseEvent, eventType, eventTarget }) {\n if (!/down|start/i.test(eventType)) {\n return null;\n }\n\n for (const interaction of scope.interactions) {\n let element = eventTarget;\n\n if (interaction.simulation && interaction.simulation.allowResume\n && (interaction.mouse === mouseEvent)) {\n while (element) {\n // if the element is the interaction element\n if (element === interaction.element) {\n return interaction;\n }\n element = utils.parentNode(element);\n }\n }\n }\n\n return null;\n },\n\n // if it's a mouse interaction\n mouse: function ({ pointerId, mouseEvent, eventType }) {\n if (!mouseEvent && (browser.supportsTouch || browser.supportsPointerEvent)) {\n return null;\n }\n\n let firstNonActive;\n\n for (const interaction of scope.interactions) {\n if (interaction.mouse) {\n // if it's a down event, skip interactions with running simulations\n if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; }\n\n // if the interaction is active, return it immediately\n if (interaction.interacting()) {\n return interaction;\n }\n // otherwise save it and look for another active interaction\n else if (!firstNonActive) {\n firstNonActive = interaction;\n }\n }\n }\n\n // if no active mouse interaction was found use the first inactive mouse\n // interaction\n if (firstNonActive) {\n return firstNonActive;\n }\n\n // Find any interaction specifically for mouse.\n // ignore the interaction if the eventType is a mousedown, and a simulation\n // is active\n for (const interaction of scope.interactions) {\n if (interaction.mouse && !(/down/.test(eventType) && interaction.simulation)) {\n return interaction;\n }\n }\n\n return null;\n },\n\n // get interaction that has this pointer\n hasPointer: function ({ pointerId }) {\n for (const interaction of scope.interactions) {\n if (utils.contains(interaction.pointerIds, pointerId)) {\n return interaction;\n }\n }\n },\n\n // get first idle interaction\n idle: function ({ mouseEvent }) {\n for (const interaction of scope.interactions) {\n // if there's already a pointer held down\n if (interaction.pointerIds.length === 1) {\n const target = interaction.target;\n // don't add this pointer if there is a target interactable and it\n // isn't gesturable\n if (target && !target.options.gesture.enabled) {\n continue;\n }\n }\n // maximum of 2 pointers per interaction\n else if (interaction.pointerIds.length >= 2) {\n continue;\n }\n\n if (!interaction.interacting() && (mouseEvent === interaction.mouse)) {\n return interaction;\n }\n }\n\n return null;\n },\n};\n\nmodule.exports = finder;\n","const win = require('./window');\nconst isWindow = require('./isWindow');\n\nconst is = {\n array : () => {},\n\n window : thing => thing === win.window || isWindow(thing),\n\n docFrag : thing => is.object(thing) && thing.nodeType === 11,\n\n object : thing => !!thing && (typeof thing === 'object'),\n\n function: thing => typeof thing === 'function',\n\n number : thing => typeof thing === 'number' ,\n\n bool : thing => typeof thing === 'boolean' ,\n\n string : thing => typeof thing === 'string' ,\n\n element: thing => {\n if (!thing || (typeof thing !== 'object')) { return false; }\n\n const _window = win.getWindow(thing) || win.window;\n\n return (/object|function/.test(typeof _window.Element)\n ? thing instanceof _window.Element //DOM2\n : thing.nodeType === 1 && typeof thing.nodeName === 'string');\n },\n};\n\nis.array = thing => (is.object(thing)\n && (typeof thing.length !== 'undefined')\n && is.function(thing.splice));\n\nmodule.exports = is;\n","module.exports = (thing) => !!(thing && thing.Window) && (thing instanceof thing.Window);\n","function pointerExtend (dest, source) {\n for (const prop in source) {\n const prefixedPropREs = module.exports.prefixedPropREs;\n let deprecated = false;\n\n // skip deprecated prefixed properties\n for (const vendor in prefixedPropREs) {\n if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) {\n deprecated = true;\n break;\n }\n }\n\n if (!deprecated && typeof source[prop] !== 'function') {\n dest[prop] = source[prop];\n }\n }\n return dest;\n}\n\npointerExtend.prefixedPropREs = {\n webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/,\n};\n\nmodule.exports = pointerExtend;\n","const hypot = require('./hypot');\nconst browser = require('./browser');\nconst dom = require('./domObjects');\nconst domUtils = require('./domUtils');\nconst is = require('./is');\nconst pointerExtend = require('./pointerExtend');\n\nconst pointerUtils = {\n copyCoords: function (dest, src) {\n dest.page = dest.page || {};\n dest.page.x = src.page.x;\n dest.page.y = src.page.y;\n\n dest.client = dest.client || {};\n dest.client.x = src.client.x;\n dest.client.y = src.client.y;\n\n dest.timeStamp = src.timeStamp;\n },\n\n setCoordDeltas: function (targetObj, prev, cur) {\n targetObj.page.x = cur.page.x - prev.page.x;\n targetObj.page.y = cur.page.y - prev.page.y;\n targetObj.client.x = cur.client.x - prev.client.x;\n targetObj.client.y = cur.client.y - prev.client.y;\n targetObj.timeStamp = cur.timeStamp - prev.timeStamp;\n\n // set pointer velocity\n const dt = Math.max(targetObj.timeStamp / 1000, 0.001);\n\n targetObj.page.speed = hypot(targetObj.page.x, targetObj.page.y) / dt;\n targetObj.page.vx = targetObj.page.x / dt;\n targetObj.page.vy = targetObj.page.y / dt;\n\n targetObj.client.speed = hypot(targetObj.client.x, targetObj.page.y) / dt;\n targetObj.client.vx = targetObj.client.x / dt;\n targetObj.client.vy = targetObj.client.y / dt;\n },\n\n isNativePointer: function (pointer) {\n return (pointer instanceof dom.Event || pointer instanceof dom.Touch);\n },\n\n // Get specified X/Y coords for mouse or event.touches[0]\n getXY: function (type, pointer, xy) {\n xy = xy || {};\n type = type || 'page';\n\n xy.x = pointer[type + 'X'];\n xy.y = pointer[type + 'Y'];\n\n return xy;\n },\n\n getPageXY: function (pointer, page) {\n page = page || {};\n\n // Opera Mobile handles the viewport and scrolling oddly\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n pointerUtils.getXY('screen', pointer, page);\n\n page.x += window.scrollX;\n page.y += window.scrollY;\n }\n else {\n pointerUtils.getXY('page', pointer, page);\n }\n\n return page;\n },\n\n getClientXY: function (pointer, client) {\n client = client || {};\n\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n // Opera Mobile handles the viewport and scrolling oddly\n pointerUtils.getXY('screen', pointer, client);\n }\n else {\n pointerUtils.getXY('client', pointer, client);\n }\n\n return client;\n },\n\n getPointerId: function (pointer) {\n return is.number(pointer.pointerId)? pointer.pointerId : pointer.identifier;\n },\n\n setCoords: function (targetObj, pointers, timeStamp) {\n const pointer = (pointers.length > 1\n ? pointerUtils.pointerAverage(pointers)\n : pointers[0]);\n\n const tmpXY = {};\n\n pointerUtils.getPageXY(pointer, tmpXY);\n targetObj.page.x = tmpXY.x;\n targetObj.page.y = tmpXY.y;\n\n pointerUtils.getClientXY(pointer, tmpXY);\n targetObj.client.x = tmpXY.x;\n targetObj.client.y = tmpXY.y;\n\n targetObj.timeStamp = is.number(timeStamp) ? timeStamp :new Date().getTime();\n },\n\n pointerExtend: pointerExtend,\n\n getTouchPair: function (event) {\n const touches = [];\n\n // array of touches is supplied\n if (is.array(event)) {\n touches[0] = event[0];\n touches[1] = event[1];\n }\n // an event\n else {\n if (event.type === 'touchend') {\n if (event.touches.length === 1) {\n touches[0] = event.touches[0];\n touches[1] = event.changedTouches[0];\n }\n else if (event.touches.length === 0) {\n touches[0] = event.changedTouches[0];\n touches[1] = event.changedTouches[1];\n }\n }\n else {\n touches[0] = event.touches[0];\n touches[1] = event.touches[1];\n }\n }\n\n return touches;\n },\n\n pointerAverage: function (pointers) {\n const average = {\n pageX : 0,\n pageY : 0,\n clientX: 0,\n clientY: 0,\n screenX: 0,\n screenY: 0,\n };\n\n for (const pointer of pointers) {\n for (const prop in average) {\n average[prop] += pointer[prop];\n }\n }\n for (const prop in average) {\n average[prop] /= pointers.length;\n }\n\n return average;\n },\n\n touchBBox: function (event) {\n if (!event.length && !(event.touches && event.touches.length > 1)) {\n return;\n }\n\n const touches = pointerUtils.getTouchPair(event);\n const minX = Math.min(touches[0].pageX, touches[1].pageX);\n const minY = Math.min(touches[0].pageY, touches[1].pageY);\n const maxX = Math.max(touches[0].pageX, touches[1].pageX);\n const maxY = Math.max(touches[0].pageY, touches[1].pageY);\n\n return {\n x: minX,\n y: minY,\n left: minX,\n top: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n },\n\n touchDistance: function (event, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n\n\n const dx = touches[0][sourceX] - touches[1][sourceX];\n const dy = touches[0][sourceY] - touches[1][sourceY];\n\n return hypot(dx, dy);\n },\n\n touchAngle: function (event, prevAngle, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n const dx = touches[1][sourceX] - touches[0][sourceX];\n const dy = touches[1][sourceY] - touches[0][sourceY];\n const angle = 180 * Math.atan2(dy , dx) / Math.PI;\n\n return angle;\n },\n\n getPointerType: function (pointer, interaction) {\n // if the PointerEvent API isn't available, then the pointer must be ither\n // a MouseEvent or TouchEvent\n if (interaction.mouse) { return 'mouse'; }\n if (!browser.supportsPointerEvent) { return 'touch'; }\n\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : [undefined, undefined,'touch', 'pen', 'mouse'][pointer.pointerType];\n },\n\n // [ event.target, event.currentTarget ]\n getEventTargets: function (event) {\n return [\n domUtils.getActualElement(event.path ? event.path[0] : event.target),\n domUtils.getActualElement(event.currentTarget),\n ];\n },\n};\n\nmodule.exports = pointerUtils;\n","const { window } = require('./window');\n\nconst vendors = ['ms', 'moz', 'webkit', 'o'];\nlet lastTime = 0;\nlet request;\nlet cancel;\n\nfor (let x = 0; x < vendors.length && !window.requestAnimationFrame; x++) {\n request = window[vendors[x] + 'RequestAnimationFrame'];\n cancel = window[vendors[x] +'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n}\n\nif (!request) {\n request = function (callback) {\n const currTime = new Date().getTime();\n const timeToCall = Math.max(0, 16 - (currTime - lastTime));\n const id = setTimeout(function () { callback(currTime + timeToCall); },\n timeToCall);\n\n lastTime = currTime + timeToCall;\n return id;\n };\n}\n\nif (!cancel) {\n cancel = function (id) {\n clearTimeout(id);\n };\n}\n\nmodule.exports = {\n request,\n cancel,\n};\n","const extend = require('./extend');\nconst is = require('./is');\nconst {\n closest,\n parentNode,\n getElementRect,\n} = require('./domUtils');\n\nconst rectUtils = {\n getStringOptionResult: function (value, interactable, element) {\n if (!is.string(value)) {\n return null;\n }\n\n if (value === 'parent') {\n value = parentNode(element);\n }\n else if (value === 'self') {\n value = interactable.getRect(element);\n }\n else {\n value = closest(element, value);\n }\n\n return value;\n },\n\n resolveRectLike: function (value, interactable, element, functionArgs) {\n value = rectUtils.getStringOptionResult(value, interactable, element) || value;\n\n if (is.function(value)) {\n value = value.apply(null, functionArgs);\n }\n\n if (is.element(value)) {\n value = getElementRect(value);\n }\n\n return value;\n },\n\n rectToXY: function (rect) {\n return rect && {\n x: 'x' in rect ? rect.x : rect.left,\n y: 'y' in rect ? rect.y : rect.top,\n };\n },\n\n xywhToTlbr: function (rect) {\n if (rect && !('left' in rect && 'top' in rect)) {\n rect = extend({}, rect);\n\n rect.left = rect.x || 0;\n rect.top = rect.y || 0;\n rect.right = rect.right || (rect.left + rect.width);\n rect.bottom = rect.bottom || (rect.top + rect.height);\n }\n\n return rect;\n },\n\n tlbrToXywh: function (rect) {\n if (rect && !('x' in rect && 'y' in rect)) {\n rect = extend({}, rect);\n\n rect.x = rect.left || 0;\n rect.top = rect.top || 0;\n rect.width = rect.width || (rect.right - rect.x);\n rect.height = rect.height || (rect.bottom - rect.y);\n }\n\n return rect;\n },\n};\n\nmodule.exports = rectUtils;\n","const win = module.exports;\nconst isWindow = require('./isWindow');\n\nfunction init (window) {\n // get wrapped window if using Shadow DOM polyfill\n\n win.realWindow = window;\n\n // create a TextNode\n const el = window.document.createTextNode('');\n\n // check if it's wrapped by a polyfill\n if (el.ownerDocument !== window.document\n && typeof window.wrap === 'function'\n && window.wrap(el) === el) {\n // use wrapped window\n window = window.wrap(window);\n }\n\n win.window = window;\n}\n\nif (typeof window === 'undefined') {\n win.window = undefined;\n win.realWindow = undefined;\n}\nelse {\n init(window);\n}\n\nwin.getWindow = function getWindow (node) {\n if (isWindow(node)) {\n return node;\n }\n\n const rootNode = (node.ownerDocument || node);\n\n return rootNode.defaultView || rootNode.parentWindow || win.window;\n};\n\nwin.init = init;\n"]} \ No newline at end of file +{"version":3,"sources":["src/header.js","node_modules/browser-pack/_prelude.js","index.js","src/Eventable.js","src/InteractEvent.js","src/Interactable.js","src/Interaction.js","src/actions/base.js","src/actions/drag.js","src/actions/drop.js","src/actions/gesture.js","src/actions/resize.js","src/autoScroll.js","src/autoStart/InteractableMethods.js","src/autoStart/base.js","src/autoStart/delay.js","src/autoStart/drag.js","src/autoStart/gesture.js","src/autoStart/resize.js","src/defaultOptions.js","src/index.js","src/inertia.js","src/interact.js","src/interactablePreventDefault.js","src/legacyBrowsers.js","src/modifiers/index.js","src/modifiers/restrict.js","src/modifiers/restrictEdges.js","src/modifiers/restrictSize.js","src/modifiers/snap.js","src/modifiers/snapSize.js","src/pointerEvents/PointerEvent.js","src/pointerEvents/base.js","src/pointerEvents/holdRepeat.js","src/pointerEvents/interactableTargets.js","src/scope.js","src/utils/Signals.js","src/utils/arr.js","src/utils/browser.js","src/utils/domObjects.js","src/utils/domUtils.js","src/utils/events.js","src/utils/extend.js","src/utils/getOriginXY.js","src/utils/hypot.js","src/utils/index.js","src/utils/interactionFinder.js","src/utils/is.js","src/utils/isWindow.js","src/utils/pointerExtend.js","src/utils/pointerUtils.js","src/utils/raf.js","src/utils/rect.js","src/utils/window.js"],"names":[],"mappings":"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","file":"interact.js","sourceRoot":"","sourcesContent":["/**\n * interact.js v1.3.0-alpha.4+sha.7970416-dirty\n *\n * Copyright (c) 2012-2017 Taye Adeyemi \n * Open source under the MIT License.\n * https://raw.github.com/taye/interact.js/master/LICENSE\n */\n","(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o 150) {\n return null;\n }\n\n let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI;\n const overlap = 22.5;\n\n if (angle < 0) {\n angle += 360;\n }\n\n const left = 135 - overlap <= angle && angle < 225 + overlap;\n const up = 225 - overlap <= angle && angle < 315 + overlap;\n\n const right = !left && (315 - overlap <= angle || angle < 45 + overlap);\n const down = !up && 45 - overlap <= angle && angle < 135 + overlap;\n\n return {\n up,\n down,\n left,\n right,\n angle,\n speed: interaction.prevEvent.speed,\n velocity: {\n x: interaction.prevEvent.velocityX,\n y: interaction.prevEvent.velocityY,\n },\n };\n }\n\n preventDefault () {}\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n}\n\nsignals.on('set-delta', function ({ iEvent, interaction, starting, deltaSource }) {\n const prevEvent = starting? iEvent : interaction.prevEvent;\n\n if (deltaSource === 'client') {\n iEvent.dx = iEvent.clientX - prevEvent.clientX;\n iEvent.dy = iEvent.clientY - prevEvent.clientY;\n }\n else {\n iEvent.dx = iEvent.pageX - prevEvent.pageX;\n iEvent.dy = iEvent.pageY - prevEvent.pageY;\n }\n});\n\nInteractEvent.signals = signals;\n\nmodule.exports = InteractEvent;\n","const is = require('./utils/is');\nconst events = require('./utils/events');\nconst extend = require('./utils/extend');\nconst actions = require('./actions/base');\nconst scope = require('./scope');\nconst Eventable = require('./Eventable');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nconst {\n getElementRect,\n nodeContains,\n trySelector,\n} = require('./utils/domUtils');\nconst { getWindow } = require('./utils/window');\nconst { indexOf, contains } = require('./utils/arr');\nconst { wheelEvent } = require('./utils/browser');\n\n// all set interactables\nscope.interactables = [];\n\n/*\\\n * Interactable\n [ property ]\n **\n * Object type returned by @interact\n\\*/\nclass Interactable {\n constructor (target, options) {\n options = options || {};\n\n this.target = target;\n this.events = new Eventable();\n this._context = options.context || scope.document;\n this._win = getWindow(trySelector(target)? this._context : target);\n this._doc = this._win.document;\n\n signals.fire('new', {\n target,\n options,\n interactable: this,\n win: this._win,\n });\n\n scope.addDocument( this._doc, this._win );\n\n scope.interactables.push(this);\n\n this.set(options);\n }\n\n setOnEvents (action, phases) {\n const onAction = 'on' + action;\n\n if (is.function(phases.onstart) ) { this.events[onAction + 'start' ] = phases.onstart ; }\n if (is.function(phases.onmove) ) { this.events[onAction + 'move' ] = phases.onmove ; }\n if (is.function(phases.onend) ) { this.events[onAction + 'end' ] = phases.onend ; }\n if (is.function(phases.oninertiastart)) { this.events[onAction + 'inertiastart' ] = phases.oninertiastart ; }\n\n return this;\n }\n\n setPerAction (action, options) {\n // for all the default per-action options\n for (const option in options) {\n // if this option exists for this action\n if (option in defaults[action]) {\n // if the option in the options arg is an object value\n if (is.object(options[option])) {\n // duplicate the object\n this.options[action][option] = extend(this.options[action][option] || {}, options[option]);\n\n if (is.object(defaults.perAction[option]) && 'enabled' in defaults.perAction[option]) {\n this.options[action][option].enabled = options[option].enabled === false? false : true;\n }\n }\n else if (is.bool(options[option]) && is.object(defaults.perAction[option])) {\n this.options[action][option].enabled = options[option];\n }\n else if (options[option] !== undefined) {\n // or if it's not undefined, do a plain assignment\n this.options[action][option] = options[option];\n }\n }\n }\n }\n\n /*\\\n * Interactable.getRect\n [ method ]\n *\n * The default function to get an Interactables bounding rect. Can be\n * overridden using @Interactable.rectChecker.\n *\n - element (Element) #optional The element to measure.\n = (object) The object's bounding rectangle.\n o {\n o top : 0,\n o left : 0,\n o bottom: 0,\n o right : 0,\n o width : 0,\n o height: 0\n o }\n \\*/\n getRect (element) {\n element = element || this.target;\n\n if (is.string(this.target) && !(is.element(element))) {\n element = this._context.querySelector(this.target);\n }\n\n return getElementRect(element);\n }\n\n /*\\\n * Interactable.rectChecker\n [ method ]\n *\n * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n - checker (function) #optional A function which returns this Interactable's bounding rectangle. See @Interactable.getRect\n = (function | object) The checker function or this Interactable\n \\*/\n rectChecker (checker) {\n if (is.function(checker)) {\n this.getRect = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.getRect;\n\n return this;\n }\n\n return this.getRect;\n }\n\n _backCompatOption (optionName, newValue) {\n if (trySelector(newValue) || is.object(newValue)) {\n this.options[optionName] = newValue;\n\n for (const action of actions.names) {\n this.options[action][optionName] = newValue;\n }\n\n return this;\n }\n\n return this.options[optionName];\n }\n\n /*\\\n * Interactable.origin\n [ method ]\n *\n * Gets or sets the origin of the Interactable's element. The x and y\n * of the origin will be subtracted from action event coordinates.\n *\n - origin (object | string) #optional An object eg. { x: 0, y: 0 } or string 'parent', 'self' or any CSS selector\n * OR\n - origin (Element) #optional An HTML or SVG Element whose rect will be used\n **\n = (object) The current origin or this Interactable\n \\*/\n origin (newValue) {\n return this._backCompatOption('origin', newValue);\n }\n\n /*\\\n * Interactable.deltaSource\n [ method ]\n *\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n - newValue (string) #optional Use 'client' if you will be scrolling while interacting; Use 'page' if you want autoScroll to work\n = (string | object) The current deltaSource or this Interactable\n \\*/\n deltaSource (newValue) {\n if (newValue === 'page' || newValue === 'client') {\n this.options.deltaSource = newValue;\n\n return this;\n }\n\n return this.options.deltaSource;\n }\n\n /*\\\n * Interactable.context\n [ method ]\n *\n * Gets the selector context Node of the Interactable. The default is `window.document`.\n *\n = (Node) The context Node of this Interactable\n **\n \\*/\n context () {\n return this._context;\n }\n\n inContext (element) {\n return (this._context === element.ownerDocument\n || nodeContains(this._context, element));\n }\n\n /*\\\n * Interactable.fire\n [ method ]\n *\n * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n - iEvent (InteractEvent) The InteractEvent object to be fired on this Interactable\n = (Interactable) this Interactable\n \\*/\n fire (iEvent) {\n this.events.fire(iEvent);\n\n return this;\n }\n\n _onOffMultiple (method, eventType, listener, options) {\n if (is.string(eventType) && eventType.search(' ') !== -1) {\n eventType = eventType.trim().split(/ +/);\n }\n\n if (is.array(eventType)) {\n for (let i = 0; i < eventType.length; i++) {\n this[method](eventType[i], listener, options);\n }\n\n return true;\n }\n\n if (is.object(eventType)) {\n for (const prop in eventType) {\n this[method](prop, eventType[prop], listener);\n }\n\n return true;\n }\n }\n\n /*\\\n * Interactable.on\n [ method ]\n *\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n - eventType (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) This Interactable\n \\*/\n on (eventType, listener, options) {\n if (this._onOffMultiple('on', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.on(eventType, listener);\n }\n // delegated event for selector\n else if (is.string(this.target)) {\n events.addDelegate(this.target, this._context, eventType, listener, options);\n }\n else {\n events.add(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.off\n [ method ]\n *\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n - eventType (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) This Interactable\n \\*/\n off (eventType, listener, options) {\n if (this._onOffMultiple('off', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n // if it is an action event type\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.off(eventType, listener);\n }\n // delegated event\n else if (is.string(this.target)) {\n events.removeDelegate(this.target, this._context, eventType, listener, options);\n }\n // remove listener from this Interatable's element\n else {\n events.remove(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.set\n [ method ]\n *\n * Reset the options of this Interactable\n - options (object) The new settings to apply\n = (object) This Interactable\n \\*/\n set (options) {\n if (!is.object(options)) {\n options = {};\n }\n\n this.options = extend({}, defaults.base);\n\n const perActions = extend({}, defaults.perAction);\n\n for (const actionName in actions.methodDict) {\n const methodName = actions.methodDict[actionName];\n\n this.options[actionName] = extend({}, defaults[actionName]);\n\n this.setPerAction(actionName, perActions);\n\n this[methodName](options[actionName]);\n }\n\n for (const setting of Interactable.settingsMethods) {\n this.options[setting] = defaults.base[setting];\n\n if (setting in options) {\n this[setting](options[setting]);\n }\n }\n\n signals.fire('set', {\n options,\n interactable: this,\n });\n\n return this;\n }\n\n /*\\\n * Interactable.unset\n [ method ]\n *\n * Remove this interactable from the list of interactables and remove\n * it's action capabilities and event listeners\n *\n = (object) @interact\n \\*/\n unset () {\n events.remove(this.target, 'all');\n\n if (is.string(this.target)) {\n // remove delegated events\n for (const type in events.delegatedEvents) {\n const delegated = events.delegatedEvents[type];\n\n if (delegated.selectors[0] === this.target\n && delegated.contexts[0] === this._context) {\n\n delegated.selectors.splice(0, 1);\n delegated.contexts .splice(0, 1);\n delegated.listeners.splice(0, 1);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegated[type] = null;\n }\n }\n\n events.remove(this._context, type, events.delegateListener);\n events.remove(this._context, type, events.delegateUseCapture, true);\n }\n }\n else {\n events.remove(this, 'all');\n }\n\n signals.fire('unset', { interactable: this });\n\n scope.interactables.splice(indexOf(scope.interactables, this), 1);\n\n // Stop related interactions when an Interactable is unset\n for (const interaction of scope.interactions || []) {\n if (interaction.target === this && interaction.interacting()) {\n interaction.stop();\n }\n }\n\n return scope.interact;\n }\n}\n\nscope.interactables.indexOfElement = function indexOfElement (target, context) {\n context = context || scope.document;\n\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n if (interactable.target === target && interactable._context === context) {\n return i;\n }\n }\n return -1;\n};\n\nscope.interactables.get = function interactableGet (element, options, dontCheckInContext) {\n const ret = this[this.indexOfElement(element, options && options.context)];\n\n return ret && (is.string(element) || dontCheckInContext || ret.inContext(element))? ret : null;\n};\n\nscope.interactables.forEachSelector = function (callback, element) {\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n // skip non CSS selector targets and out of context elements\n if (!is.string(interactable.target)\n || (element && !interactable.inContext(element))) {\n continue;\n }\n\n const ret = callback(interactable, interactable.target, interactable._context, i, this);\n\n if (ret !== undefined) {\n return ret;\n }\n }\n};\n\n// all interact.js eventTypes\nInteractable.eventTypes = scope.eventTypes = [];\n\nInteractable.signals = signals;\n\nInteractable.settingsMethods = [ 'deltaSource', 'origin', 'preventDefault', 'rectChecker' ];\n\nmodule.exports = Interactable;\n","const scope = require('./scope');\nconst utils = require('./utils');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst domObjects = require('./utils/domObjects');\nconst finder = require('./utils/interactionFinder');\nconst signals = require('./utils/Signals').new();\n\nconst listeners = {};\nconst methodNames = [\n 'pointerDown', 'pointerMove', 'pointerUp',\n 'updatePointer', 'removePointer',\n];\n\n// for ignoring browser's simulated mouse events\nlet prevTouchTime = 0;\n\n// all active and idle interactions\nscope.interactions = [];\n\nclass Interaction {\n constructor ({ pointerType }) {\n this.target = null; // current interactable being interacted with\n this.element = null; // the target element of the interactable\n\n this.prepared = { // action that's ready to be fired on next move event\n name : null,\n axis : null,\n edges: null,\n };\n\n // keep track of added pointers\n this.pointers = [];\n this.pointerIds = [];\n this.downTargets = [];\n this.downTimes = [];\n\n // Previous native pointer move event coordinates\n this.prevCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n // current native pointer move event coordinates\n this.curCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Starting InteractEvent pointer coordinates\n this.startCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Change in coordinates and time of the pointer\n this.pointerDelta = {\n page : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n client : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n timeStamp: 0,\n };\n\n this.downEvent = null; // pointerdown/mousedown/touchstart event\n this.downPointer = {};\n\n this._eventTarget = null;\n this._curEventTarget = null;\n\n this.prevEvent = null; // previous action event\n\n this.pointerIsDown = false;\n this.pointerWasMoved = false;\n this._interacting = false;\n\n this.pointerType = pointerType;\n\n signals.fire('new', this);\n\n scope.interactions.push(this);\n }\n\n pointerDown (pointer, event, eventTarget) {\n const pointerIndex = this.updatePointer(pointer, event, true);\n\n signals.fire('down', {\n pointer,\n event,\n eventTarget,\n pointerIndex,\n interaction: this,\n });\n }\n\n /*\\\n * Interaction.start\n [ method ]\n *\n * Start an action with the given Interactable and Element as tartgets. The\n * action must be enabled for the target Interactable and an appropriate number\n * of pointers must be held down - 1 for drag/resize, 2 for gesture.\n *\n * Use it with `interactable.able({ manualStart: false })` to always\n * [start actions manually](https://github.com/taye/interact.js/issues/114)\n *\n - action (object) The action to be performed - drag, resize, etc.\n - target (Interactable) The Interactable to target\n - element (Element) The DOM Element to target\n = (object) interact\n **\n | interact(target)\n | .draggable({\n | // disable the default drag start by down->move\n | manualStart: true\n | })\n | // start dragging after the user holds the pointer down\n | .on('hold', function (event) {\n | var interaction = event.interaction;\n |\n | if (!interaction.interacting()) {\n | interaction.start({ name: 'drag' },\n | event.interactable,\n | event.currentTarget);\n | }\n | });\n \\*/\n start (action, target, element) {\n if (this.interacting()\n || !this.pointerIsDown\n || this.pointerIds.length < (action.name === 'gesture'? 2 : 1)) {\n return;\n }\n\n // if this interaction had been removed after stopping\n // add it back\n if (utils.indexOf(scope.interactions, this) === -1) {\n scope.interactions.push(this);\n }\n\n utils.copyAction(this.prepared, action);\n this.target = target;\n this.element = element;\n\n signals.fire('action-start', {\n interaction: this,\n event: this.downEvent,\n });\n }\n\n pointerMove (pointer, event, eventTarget) {\n if (!this.simulation) {\n this.updatePointer(pointer);\n utils.setCoords(this.curCoords, this.pointers);\n }\n\n const duplicateMove = (this.curCoords.page.x === this.prevCoords.page.x\n && this.curCoords.page.y === this.prevCoords.page.y\n && this.curCoords.client.x === this.prevCoords.client.x\n && this.curCoords.client.y === this.prevCoords.client.y);\n\n let dx;\n let dy;\n\n // register movement greater than pointerMoveTolerance\n if (this.pointerIsDown && !this.pointerWasMoved) {\n dx = this.curCoords.client.x - this.startCoords.client.x;\n dy = this.curCoords.client.y - this.startCoords.client.y;\n\n this.pointerWasMoved = utils.hypot(dx, dy) > Interaction.pointerMoveTolerance;\n }\n\n const signalArg = {\n pointer,\n pointerIndex: this.getPointerIndex(pointer),\n event,\n eventTarget,\n dx,\n dy,\n duplicate: duplicateMove,\n interaction: this,\n interactingBeforeMove: this.interacting(),\n };\n\n if (!duplicateMove) {\n // set pointer coordinate, time changes and speeds\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n }\n\n signals.fire('move', signalArg);\n\n if (!duplicateMove) {\n // if interacting, fire an 'action-move' signal etc\n if (this.interacting()) {\n this.doMove(signalArg);\n }\n\n if (this.pointerWasMoved) {\n utils.copyCoords(this.prevCoords, this.curCoords);\n }\n }\n }\n\n /*\\\n * Interaction.doMove\n [ method ]\n *\n * Force a move of the current action at the same coordinates. Useful if\n * snap/restrict has been changed and you want a movement with the new\n * settings.\n *\n **\n | interact(target)\n | .draggable(true)\n | .on('dragmove', function (event) {\n | if (someCondition) {\n | // change the snap settings\n | event.interactable.draggable({ snap: { targets: [] }});\n | // fire another move event with re-calculated snap\n | event.interaction.doMove();\n | }\n | });\n \\*/\n doMove (signalArg) {\n signalArg = utils.extend({\n pointer: this.pointers[0],\n event: this.prevEvent,\n eventTarget: this._eventTarget,\n interaction: this,\n }, signalArg || {});\n\n signals.fire('before-action-move', signalArg);\n\n if (!this._dontFireMove) {\n signals.fire('action-move', signalArg);\n }\n\n this._dontFireMove = false;\n }\n\n // End interact move events and stop auto-scroll unless simulation is running\n pointerUp (pointer, event, eventTarget, curEventTarget) {\n const pointerIndex = this.getPointerIndex(pointer);\n\n signals.fire(/cancel$/i.test(event.type)? 'cancel' : 'up', {\n pointer,\n pointerIndex,\n event,\n eventTarget,\n curEventTarget,\n interaction: this,\n });\n\n if (!this.simulation) {\n this.end(event);\n }\n\n this.pointerIsDown = false;\n this.removePointer(pointer, event);\n }\n\n /*\\\n * Interaction.end\n [ method ]\n *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n - event (PointerEvent) #optional\n **\n | interact(target)\n | .draggable(true)\n | .on('move', function (event) {\n | if (event.pageX > 1000) {\n | // end the current action\n | event.interaction.end();\n | // stop all further listeners from being called\n | event.stopImmediatePropagation();\n | }\n | });\n \\*/\n end (event) {\n event = event || this.prevEvent;\n\n if (this.interacting()) {\n signals.fire('action-end', {\n event,\n interaction: this,\n });\n }\n\n this.stop();\n }\n\n currentAction () {\n return this._interacting? this.prepared.name: null;\n }\n\n interacting () {\n return this._interacting;\n }\n\n stop () {\n signals.fire('stop', { interaction: this });\n\n if (this._interacting) {\n signals.fire('stop-active', { interaction: this });\n signals.fire('stop-' + this.prepared.name, { interaction: this });\n }\n\n this.target = this.element = null;\n\n this._interacting = false;\n this.prepared.name = this.prevEvent = null;\n }\n\n getPointerIndex (pointer) {\n // mouse and pen interactions may have only one pointer\n if (this.pointerType === 'mouse' || this.pointerType === 'pen') {\n return 0;\n }\n\n return utils.indexOf(this.pointerIds, utils.getPointerId(pointer));\n }\n\n updatePointer (pointer, event, down = event && /(down|start)$/i.test(event.type)) {\n const id = utils.getPointerId(pointer);\n let index = this.getPointerIndex(pointer);\n\n if (index === -1) {\n index = this.pointerIds.length;\n this.pointerIds[index] = id;\n }\n\n if (down) {\n signals.fire('update-pointer-down', {\n pointer,\n event,\n down,\n pointerId: id,\n pointerIndex: index,\n interaction: this,\n });\n }\n\n this.pointers[index] = pointer;\n\n return index;\n }\n\n removePointer (pointer, event) {\n const index = this.getPointerIndex(pointer);\n\n if (index === -1) { return; }\n\n signals.fire('remove-pointer', {\n pointer,\n event,\n pointerIndex: index,\n interaction: this,\n });\n\n this.pointers .splice(index, 1);\n this.pointerIds .splice(index, 1);\n this.downTargets.splice(index, 1);\n this.downTimes .splice(index, 1);\n }\n\n _updateEventTargets (target, currentTarget) {\n this._eventTarget = target;\n this._curEventTarget = currentTarget;\n }\n}\n\nfor (let i = 0, len = methodNames.length; i < len; i++) {\n const method = methodNames[i];\n\n listeners[method] = doOnInteractions(method);\n}\n\nfunction doOnInteractions (method) {\n return (function (event) {\n const pointerType = utils.getPointerType(event);\n const [eventTarget, curEventTarget] = utils.getEventTargets(event);\n const matches = []; // [ [pointer, interaction], ...]\n\n if (browser.supportsTouch && /touch/.test(event.type)) {\n prevTouchTime = new Date().getTime();\n\n for (let i = 0; i < event.changedTouches.length; i++) {\n const pointer = event.changedTouches[i];\n const interaction = finder.search(pointer, event.type, eventTarget);\n\n matches.push([pointer, interaction || new Interaction({ pointerType })]);\n }\n }\n else {\n let invalidPointer = false;\n\n if (!browser.supportsPointerEvent && /mouse/.test(event.type)) {\n // ignore mouse events while touch interactions are active\n for (let i = 0; i < scope.interactions.length && !invalidPointer; i++) {\n invalidPointer = scope.interactions[i].pointerType !== 'mouse' && scope.interactions[i].pointerIsDown;\n }\n\n // try to ignore mouse events that are simulated by the browser\n // after a touch event\n invalidPointer = invalidPointer\n || (new Date().getTime() - prevTouchTime < 500)\n // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated\n || event.timeStamp === 0;\n }\n\n if (!invalidPointer) {\n let interaction = finder.search(event, event.type, eventTarget);\n\n if (!interaction) {\n interaction = new Interaction({ pointerType });\n }\n\n matches.push([event, interaction]);\n }\n }\n\n for (const [pointer, interaction] of matches) {\n interaction._updateEventTargets(eventTarget, curEventTarget);\n interaction[method](pointer, event, eventTarget, curEventTarget);\n }\n });\n}\n\nfunction endAll (event) {\n for (let i = 0; i < scope.interactions.length; i++) {\n const interaction = scope.interactions[i];\n\n interaction.end(event);\n signals.fire('endall', { event, interaction });\n }\n}\n\nconst docEvents = { /* 'eventType': listenerFunc */ };\nconst pEventTypes = browser.pEventTypes;\n\nif (domObjects.PointerEvent) {\n docEvents[pEventTypes.down ] = listeners.pointerDown;\n docEvents[pEventTypes.move ] = listeners.pointerMove;\n docEvents[pEventTypes.up ] = listeners.pointerUp;\n docEvents[pEventTypes.cancel] = listeners.pointerUp;\n}\nelse {\n docEvents.mousedown = listeners.pointerDown;\n docEvents.mousemove = listeners.pointerMove;\n docEvents.mouseup = listeners.pointerUp;\n\n docEvents.touchstart = listeners.pointerDown;\n docEvents.touchmove = listeners.pointerMove;\n docEvents.touchend = listeners.pointerUp;\n docEvents.touchcancel = listeners.pointerUp;\n}\n\ndocEvents.blur = endAll;\n\nfunction onDocSignal ({ doc }, signalName) {\n const eventMethod = signalName.indexOf('add') === 0\n ? events.add : events.remove;\n\n // delegate event listener\n for (const eventType in scope.delegatedEvents) {\n eventMethod(doc, eventType, events.delegateListener);\n eventMethod(doc, eventType, events.delegateUseCapture, true);\n }\n\n for (const eventType in docEvents) {\n eventMethod(doc, eventType, docEvents[eventType]);\n }\n}\n\nsignals.on('update-pointer-down', ({ interaction, pointer, pointerId, pointerIndex, event, eventTarget, down }) => {\n interaction.pointerIds[pointerIndex] = pointerId;\n interaction.pointers[pointerIndex] = pointer;\n\n if (down) {\n interaction.pointerIsDown = true;\n }\n\n if (!interaction.interacting()) {\n utils.setCoords(interaction.startCoords, interaction.pointers);\n\n utils.copyCoords(interaction.curCoords , interaction.startCoords);\n utils.copyCoords(interaction.prevCoords, interaction.startCoords);\n\n interaction.downEvent = event;\n interaction.downTimes[pointerIndex] = interaction.curCoords.timeStamp;\n interaction.downTargets[pointerIndex] = eventTarget || event && utils.getEventTargets(event)[0];\n interaction.pointerWasMoved = false;\n\n utils.pointerExtend(interaction.downPointer, pointer);\n }\n});\n\nscope.signals.on('add-document' , onDocSignal);\nscope.signals.on('remove-document', onDocSignal);\n\nInteraction.pointerMoveTolerance = 1;\nInteraction.doOnInteractions = doOnInteractions;\nInteraction.endAll = endAll;\nInteraction.signals = signals;\nInteraction.docEvents = docEvents;\n\nscope.endAllInteractions = endAll;\n\nmodule.exports = Interaction;\n","const Interaction = require('../Interaction');\nconst InteractEvent = require('../InteractEvent');\n\nconst actions = {\n firePrepared,\n names: [],\n methodDict: {},\n};\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n interaction._interacting = true;\n firePrepared(interaction, event, 'start');\n});\n\nInteraction.signals.on('action-move', function ({ interaction, event, preEnd }) {\n firePrepared(interaction, event, 'move', preEnd);\n\n // if the action was ended in a listener\n if (!interaction.interacting()) { return false; }\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n firePrepared(interaction, event, 'end');\n});\n\nfunction firePrepared (interaction, event, phase, preEnd) {\n const actionName = interaction.prepared.name;\n\n const newEvent = new InteractEvent(interaction, event, actionName, phase, interaction.element, null, preEnd);\n\n interaction.target.fire(newEvent);\n interaction.prevEvent = newEvent;\n}\n\nmodule.exports = actions;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drag = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n startAxis : 'xy',\n lockAxis : 'xy',\n },\n\n checker: function (pointer, event, interactable) {\n const dragOptions = interactable.options.drag;\n\n return dragOptions.enabled\n ? { name: 'drag', axis: (dragOptions.lockAxis === 'start'\n ? dragOptions.startAxis\n : dragOptions.lockAxis)}\n : null;\n },\n\n getCursor: function () {\n return 'move';\n },\n};\n\nInteraction.signals.on('before-action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n interaction.curCoords.page.y = interaction.startCoords.page.y;\n interaction.curCoords.client.y = interaction.startCoords.client.y;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vx);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vx);\n interaction.pointerDelta.client.vy = 0;\n interaction.pointerDelta.page.vy = 0;\n }\n else if (axis === 'y') {\n interaction.curCoords.page.x = interaction.startCoords.page.x;\n interaction.curCoords.client.x = interaction.startCoords.client.x;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vy);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vy);\n interaction.pointerDelta.client.vx = 0;\n interaction.pointerDelta.page.vx = 0;\n }\n});\n\n// dragmove\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'dragmove') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n iEvent.pageY = interaction.startCoords.page.y;\n iEvent.clientY = interaction.startCoords.client.y;\n iEvent.dy = 0;\n }\n else if (axis === 'y') {\n iEvent.pageX = interaction.startCoords.page.x;\n iEvent.clientX = interaction.startCoords.client.x;\n iEvent.dx = 0;\n }\n});\n\n/*\\\n * Interactable.draggable\n [ method ]\n *\n * Gets or sets whether drag actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of drag events\n | var isDraggable = interact('ul li').draggable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on drag events (object makes the Interactable draggable)\n = (object) This Interactable\n | interact(element).draggable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // the axis in which the first movement must be\n | // for the drag sequence to start\n | // 'xy' by default - any direction\n | startAxis: 'x' || 'y' || 'xy',\n |\n | // 'xy' by default - don't restrict to one axis (move in any direction)\n | // 'x' or 'y' to restrict movement to either axis\n | // 'start' to restrict movement to the axis the drag started in\n | lockAxis: 'x' || 'y' || 'xy' || 'start',\n |\n | // max number of drags that can happen concurrently\n | // with elements of this Interactable. Infinity by default\n | max: Infinity,\n |\n | // max number of drags that can target the same element+Interactable\n | // 1 by default\n | maxPerElement: 2\n | });\n\\*/\nInteractable.prototype.draggable = function (options) {\n if (utils.is.object(options)) {\n this.options.drag.enabled = options.enabled === false? false: true;\n this.setPerAction('drag', options);\n this.setOnEvents('drag', options);\n\n if (/^(xy|x|y|start)$/.test(options.lockAxis)) {\n this.options.drag.lockAxis = options.lockAxis;\n }\n if (/^(xy|x|y)$/.test(options.startAxis)) {\n this.options.drag.startAxis = options.startAxis;\n }\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drag.enabled = options;\n\n if (!options) {\n this.ondragstart = this.ondragstart = this.ondragend = null;\n }\n\n return this;\n }\n\n return this.options.drag;\n};\n\nactions.drag = drag;\nactions.names.push('drag');\nutils.merge(Interactable.eventTypes, [\n 'dragstart',\n 'dragmove',\n 'draginertiastart',\n 'draginertiaresume',\n 'dragend',\n]);\nactions.methodDict.drag = 'draggable';\n\ndefaultOptions.drag = drag.defaults;\n\nmodule.exports = drag;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst scope = require('../scope');\nconst interact = require('../interact');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drop = {\n defaults: {\n enabled: false,\n accept : null,\n overlap: 'pointer',\n },\n};\n\nlet dynamicDrop = false;\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // reset active dropzones\n interaction.activeDrops.dropzones = [];\n interaction.activeDrops.elements = [];\n interaction.activeDrops.rects = [];\n\n interaction.dropEvents = null;\n\n if (!interaction.dynamicDrop) {\n setActiveDrops(interaction, interaction.element);\n }\n\n const dragEvent = interaction.prevEvent;\n const dropEvents = getDropEvents(interaction, event, dragEvent);\n\n if (dropEvents.activate) {\n fireActiveDrops(interaction, dropEvents.activate);\n }\n});\n\nInteractEvent.signals.on('new', function ({ interaction, iEvent, event }) {\n if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { return; }\n\n const draggableElement = interaction.element;\n const dragEvent = iEvent;\n const dropResult = getDrop(dragEvent, event, draggableElement);\n\n interaction.dropTarget = dropResult.dropzone;\n interaction.dropElement = dropResult.element;\n\n interaction.dropEvents = getDropEvents(interaction, event, dragEvent);\n});\n\nInteraction.signals.on('action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n fireDropEvents(interaction, interaction.dropEvents);\n});\n\nInteraction.signals.on('action-end', function ({ interaction }) {\n if (interaction.prepared.name === 'drag') {\n fireDropEvents(interaction, interaction.dropEvents);\n }\n});\n\nInteraction.signals.on('stop-drag', function ({ interaction }) {\n interaction.activeDrops.dropzones =\n interaction.activeDrops.elements =\n interaction.activeDrops.rects =\n interaction.dropEvents = null;\n});\n\nfunction collectDrops (interaction, element) {\n const drops = [];\n const elements = [];\n\n element = element || interaction.element;\n\n // collect all dropzones and their elements which qualify for a drop\n for (const current of scope.interactables) {\n if (!current.options.drop.enabled) { continue; }\n\n const accept = current.options.drop.accept;\n\n // test the draggable element against the dropzone's accept setting\n if ((utils.is.element(accept) && accept !== element)\n || (utils.is.string(accept)\n && !utils.matchesSelector(element, accept))) {\n\n continue;\n }\n\n // query for new elements if necessary\n const dropElements = utils.is.string(current.target)\n ? current._context.querySelectorAll(current.target)\n : [current.target];\n\n for (let i = 0; i < dropElements.length; i++) {\n const currentElement = dropElements[i];\n\n if (currentElement !== element) {\n drops.push(current);\n elements.push(currentElement);\n }\n }\n }\n\n return {\n elements,\n dropzones: drops,\n };\n}\n\nfunction fireActiveDrops (interaction, event) {\n let prevElement;\n\n // loop through all active dropzones and trigger event\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n const current = interaction.activeDrops.dropzones[i];\n const currentElement = interaction.activeDrops.elements [i];\n\n // prevent trigger of duplicate events on same element\n if (currentElement !== prevElement) {\n // set current element as event target\n event.target = currentElement;\n current.fire(event);\n }\n prevElement = currentElement;\n }\n}\n\n// Collect a new set of possible drops and save them in activeDrops.\n// setActiveDrops should always be called when a drag has just started or a\n// drag event happens while dynamicDrop is true\nfunction setActiveDrops (interaction, dragElement) {\n // get dropzones and their elements that could receive the draggable\n const possibleDrops = collectDrops(interaction, dragElement, true);\n\n interaction.activeDrops.dropzones = possibleDrops.dropzones;\n interaction.activeDrops.elements = possibleDrops.elements;\n interaction.activeDrops.rects = [];\n\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n interaction.activeDrops.rects[i] =\n interaction.activeDrops.dropzones[i].getRect(interaction.activeDrops.elements[i]);\n }\n}\n\nfunction getDrop (dragEvent, event, dragElement) {\n const interaction = dragEvent.interaction;\n const validDrops = [];\n\n if (dynamicDrop) {\n setActiveDrops(interaction, dragElement);\n }\n\n // collect all dropzones and their elements which qualify for a drop\n for (let j = 0; j < interaction.activeDrops.dropzones.length; j++) {\n const current = interaction.activeDrops.dropzones[j];\n const currentElement = interaction.activeDrops.elements [j];\n const rect = interaction.activeDrops.rects [j];\n\n validDrops.push(current.dropCheck(dragEvent, event, interaction.target, dragElement, currentElement, rect)\n ? currentElement\n : null);\n }\n\n // get the most appropriate dropzone based on DOM depth and order\n const dropIndex = utils.indexOfDeepestElement(validDrops);\n\n return {\n dropzone: interaction.activeDrops.dropzones[dropIndex] || null,\n element : interaction.activeDrops.elements [dropIndex] || null,\n };\n}\n\nfunction getDropEvents (interaction, pointerEvent, dragEvent) {\n const dropEvents = {\n enter : null,\n leave : null,\n activate : null,\n deactivate: null,\n move : null,\n drop : null,\n };\n\n const tmpl = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n };\n\n if (interaction.dropElement !== interaction.prevDropElement) {\n // if there was a prevDropTarget, create a dragleave event\n if (interaction.prevDropTarget) {\n dropEvents.leave = utils.extend({ type: 'dragleave' }, tmpl);\n\n dragEvent.dragLeave = dropEvents.leave.target = interaction.prevDropElement;\n dragEvent.prevDropzone = dropEvents.leave.dropzone = interaction.prevDropTarget;\n }\n // if the dropTarget is not null, create a dragenter event\n if (interaction.dropTarget) {\n dropEvents.enter = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n type : 'dragenter',\n };\n\n dragEvent.dragEnter = interaction.dropElement;\n dragEvent.dropzone = interaction.dropTarget;\n }\n }\n\n if (dragEvent.type === 'dragend' && interaction.dropTarget) {\n dropEvents.drop = utils.extend({ type: 'drop' }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n dragEvent.relatedTarget = interaction.dropElement;\n }\n if (dragEvent.type === 'dragstart') {\n dropEvents.activate = utils.extend({ type: 'dropactivate' }, tmpl);\n\n dropEvents.activate.target = null;\n dropEvents.activate.dropzone = null;\n }\n if (dragEvent.type === 'dragend') {\n dropEvents.deactivate = utils.extend({ type: 'dropdeactivate' }, tmpl);\n\n dropEvents.deactivate.target = null;\n dropEvents.deactivate.dropzone = null;\n }\n if (dragEvent.type === 'dragmove' && interaction.dropTarget) {\n dropEvents.move = utils.extend({\n dragmove : dragEvent,\n type : 'dropmove',\n }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n }\n\n return dropEvents;\n}\n\nfunction fireDropEvents (interaction, dropEvents) {\n if (dropEvents.leave) { interaction.prevDropTarget.fire(dropEvents.leave); }\n if (dropEvents.move ) { interaction.dropTarget.fire(dropEvents.move ); }\n if (dropEvents.enter) { interaction.dropTarget.fire(dropEvents.enter); }\n if (dropEvents.drop ) { interaction.dropTarget.fire(dropEvents.drop ); }\n if (dropEvents.deactivate) {\n fireActiveDrops(interaction, dropEvents.deactivate);\n }\n\n interaction.prevDropTarget = interaction.dropTarget;\n interaction.prevDropElement = interaction.dropElement;\n}\n\n/*\\\n * Interactable.dropzone\n [ method ]\n *\n * Returns or sets whether elements can be dropped onto this\n * Interactable to trigger drop events\n *\n * Dropzones can receive the following events:\n * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends\n * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone\n * - `dragmove` when a draggable that has entered the dropzone is moved\n * - `drop` when a draggable is dropped into this dropzone\n *\n * Use the `accept` option to allow only elements that match the given CSS\n * selector or element. The value can be:\n *\n * - **an Element** - only that element can be dropped into this dropzone.\n * - **a string**, - the element being dragged must match it as a CSS selector.\n * - **`null`** - accept options is cleared - it accepts any element.\n *\n * Use the `overlap` option to set how drops are checked for. The allowed\n * values are:\n *\n * - `'pointer'`, the pointer must be over the dropzone (default)\n * - `'center'`, the draggable element's center must be over the dropzone\n * - a number from 0-1 which is the `(intersection area) / (draggable area)`.\n * e.g. `0.5` for drop to happen when half of the area of the draggable is\n * over the dropzone\n *\n * Use the `checker` option to specify a function to check if a dragged\n * element is over this Interactable.\n *\n | interact(target)\n | .dropChecker(function(dragEvent, // related dragmove or dragend event\n | event, // TouchEvent/PointerEvent/MouseEvent\n | dropped, // bool result of the default checker\n | dropzone, // dropzone Interactable\n | dropElement, // dropzone elemnt\n | draggable, // draggable Interactable\n | draggableElement) {// draggable element\n |\n | return dropped && event.target.hasAttribute('allow-drop');\n | }\n *\n *\n - options (boolean | object | null) #optional The new value to be set.\n | interact('.drop').dropzone({\n | accept: '.can-drop' || document.getElementById('single-drop'),\n | overlap: 'pointer' || 'center' || zeroToOne\n | }\n = (boolean | object) The current setting or this Interactable\n\\*/\nInteractable.prototype.dropzone = function (options) {\n if (utils.is.object(options)) {\n this.options.drop.enabled = options.enabled === false? false: true;\n\n if (utils.is.function(options.ondrop) ) { this.events.ondrop = options.ondrop ; }\n if (utils.is.function(options.ondropactivate) ) { this.events.ondropactivate = options.ondropactivate ; }\n if (utils.is.function(options.ondropdeactivate)) { this.events.ondropdeactivate = options.ondropdeactivate; }\n if (utils.is.function(options.ondragenter) ) { this.events.ondragenter = options.ondragenter ; }\n if (utils.is.function(options.ondragleave) ) { this.events.ondragleave = options.ondragleave ; }\n if (utils.is.function(options.ondropmove) ) { this.events.ondropmove = options.ondropmove ; }\n\n if (/^(pointer|center)$/.test(options.overlap)) {\n this.options.drop.overlap = options.overlap;\n }\n else if (utils.is.number(options.overlap)) {\n this.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0);\n }\n if ('accept' in options) {\n this.options.drop.accept = options.accept;\n }\n if ('checker' in options) {\n this.options.drop.checker = options.checker;\n }\n\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drop.enabled = options;\n\n if (!options) {\n this.ondragenter = this.ondragleave = this.ondrop\n = this.ondropactivate = this.ondropdeactivate = null;\n }\n\n return this;\n }\n\n return this.options.drop;\n};\n\nInteractable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) {\n let dropped = false;\n\n // if the dropzone has no rect (eg. display: none)\n // call the custom dropChecker or just return false\n if (!(rect = rect || this.getRect(dropElement))) {\n return (this.options.drop.checker\n ? this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement)\n : false);\n }\n\n const dropOverlap = this.options.drop.overlap;\n\n if (dropOverlap === 'pointer') {\n const origin = utils.getOriginXY(draggable, draggableElement, 'drag');\n const page = utils.getPageXY(dragEvent);\n\n page.x += origin.x;\n page.y += origin.y;\n\n const horizontal = (page.x > rect.left) && (page.x < rect.right);\n const vertical = (page.y > rect.top ) && (page.y < rect.bottom);\n\n dropped = horizontal && vertical;\n }\n\n const dragRect = draggable.getRect(draggableElement);\n\n if (dragRect && dropOverlap === 'center') {\n const cx = dragRect.left + dragRect.width / 2;\n const cy = dragRect.top + dragRect.height / 2;\n\n dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom;\n }\n\n if (dragRect && utils.is.number(dropOverlap)) {\n const overlapArea = (Math.max(0, Math.min(rect.right , dragRect.right ) - Math.max(rect.left, dragRect.left))\n * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top , dragRect.top )));\n\n const overlapRatio = overlapArea / (dragRect.width * dragRect.height);\n\n dropped = overlapRatio >= dropOverlap;\n }\n\n if (this.options.drop.checker) {\n dropped = this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement);\n }\n\n return dropped;\n};\n\nInteractable.signals.on('unset', function ({ interactable }) {\n interactable.dropzone(false);\n});\n\nInteractable.settingsMethods.push('dropChecker');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.dropTarget = null; // the dropzone a drag target might be dropped into\n interaction.dropElement = null; // the element at the time of checking\n interaction.prevDropTarget = null; // the dropzone that was recently dragged away from\n interaction.prevDropElement = null; // the element at the time of checking\n interaction.dropEvents = null; // the dropEvents related to the current drag event\n\n interaction.activeDrops = {\n dropzones: [], // the dropzones that are mentioned below\n elements : [], // elements of dropzones that accept the target draggable\n rects : [], // the rects of the elements mentioned above\n };\n\n});\n\nInteraction.signals.on('stop', function ({ interaction }) {\n interaction.dropTarget = interaction.dropElement =\n interaction.prevDropTarget = interaction.prevDropElement = null;\n});\n\n/*\\\n * interact.dynamicDrop\n [ method ]\n *\n * Returns or sets whether the dimensions of dropzone elements are\n * calculated on every dragmove or only on dragstart for the default\n * dropChecker\n *\n - newValue (boolean) #optional True to check on each move. False to check only before start\n = (boolean | interact) The current setting or interact\n\\*/\ninteract.dynamicDrop = function (newValue) {\n if (utils.is.bool(newValue)) {\n //if (dragging && dynamicDrop !== newValue && !newValue) {\n //calcRects(dropzones);\n //}\n\n dynamicDrop = newValue;\n\n return interact;\n }\n return dynamicDrop;\n};\n\nutils.merge(Interactable.eventTypes, [\n 'dragenter',\n 'dragleave',\n 'dropactivate',\n 'dropdeactivate',\n 'dropmove',\n 'drop',\n]);\nactions.methodDict.drop = 'dropzone';\n\ndefaultOptions.drop = drop.defaults;\n\nmodule.exports = drop;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst gesture = {\n defaults: {\n enabled : false,\n origin : null,\n restrict: null,\n },\n\n checker: function (pointer, event, interactable, element, interaction) {\n if (interaction.pointerIds.length >= 2) {\n return { name: 'gesture' };\n }\n\n return null;\n },\n\n getCursor: function () {\n return '';\n },\n};\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturestart') { return; }\n iEvent.ds = 0;\n\n interaction.gesture.startDistance = interaction.gesture.prevDistance = iEvent.distance;\n interaction.gesture.startAngle = interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.scale = 1;\n});\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturemove') { return; }\n\n iEvent.ds = iEvent.scale - interaction.gesture.scale;\n\n interaction.target.fire(iEvent);\n\n interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.prevDistance = iEvent.distance;\n\n if (iEvent.scale !== Infinity\n && iEvent.scale !== null\n && iEvent.scale !== undefined\n && !isNaN(iEvent.scale)) {\n\n interaction.gesture.scale = iEvent.scale;\n }\n});\n\n/*\\\n * Interactable.gesturable\n [ method ]\n *\n * Gets or sets whether multitouch gestures can be performed on the\n * Interactable's element\n *\n = (boolean) Indicates if this can be the target of gesture events\n | var isGestureable = interact(element).gesturable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on gesture events (makes the Interactable gesturable)\n = (object) this Interactable\n | interact(element).gesturable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // limit multiple gestures.\n | // See the explanation in @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n\\*/\nInteractable.prototype.gesturable = function (options) {\n if (utils.is.object(options)) {\n this.options.gesture.enabled = options.enabled === false? false: true;\n this.setPerAction('gesture', options);\n this.setOnEvents('gesture', options);\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.gesture.enabled = options;\n\n if (!options) {\n this.ongesturestart = this.ongesturestart = this.ongestureend = null;\n }\n\n return this;\n }\n\n return this.options.gesture;\n};\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action, event, starting, ending, deltaSource }) {\n if (action !== 'gesture') { return; }\n\n const pointers = interaction.pointers;\n\n iEvent.touches = [pointers[0], pointers[1]];\n\n if (starting) {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = 1;\n iEvent.ds = 0;\n iEvent.angle = utils.touchAngle(pointers, undefined, deltaSource);\n iEvent.da = 0;\n }\n else if (ending || event instanceof InteractEvent) {\n iEvent.distance = interaction.prevEvent.distance;\n iEvent.box = interaction.prevEvent.box;\n iEvent.scale = interaction.prevEvent.scale;\n iEvent.ds = iEvent.scale - 1;\n iEvent.angle = interaction.prevEvent.angle;\n iEvent.da = iEvent.angle - interaction.gesture.startAngle;\n }\n else {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = iEvent.distance / interaction.gesture.startDistance;\n iEvent.angle = utils.touchAngle(pointers, interaction.gesture.prevAngle, deltaSource);\n\n iEvent.ds = iEvent.scale - interaction.gesture.prevScale;\n iEvent.da = iEvent.angle - interaction.gesture.prevAngle;\n }\n});\n\nInteraction.signals.on('new', function (interaction) {\n interaction.gesture = {\n start: { x: 0, y: 0 },\n\n startDistance: 0, // distance between two touches of touchStart\n prevDistance : 0,\n distance : 0,\n\n scale: 1, // gesture.distance / gesture.startDistance\n\n startAngle: 0, // angle of line joining two touches\n prevAngle : 0, // angle of the previous gesture event\n };\n});\n\nactions.gesture = gesture;\nactions.names.push('gesture');\nutils.merge(Interactable.eventTypes, [\n 'gesturestart',\n 'gesturemove',\n 'gestureend',\n]);\nactions.methodDict.gesture = 'gesturable';\n\ndefaultOptions.gesture = gesture.defaults;\n\nmodule.exports = gesture;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\n// Less Precision with touch input\nconst defaultMargin = browser.supportsTouch || browser.supportsPointerEvent? 20: 10;\n\nconst resize = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n square: false,\n preserveAspectRatio: false,\n axis: 'xy',\n\n // use default margin\n margin: NaN,\n\n // object with props left, right, top, bottom which are\n // true/false values to resize when the pointer is over that edge,\n // CSS selectors to match the handles for each direction\n // or the Elements for each handle\n edges: null,\n\n // a value of 'none' will limit the resize rect to a minimum of 0x0\n // 'negate' will alow the rect to have negative width/height\n // 'reposition' will keep the width/height positive by swapping\n // the top and bottom edges and/or swapping the left and right edges\n invert: 'none',\n },\n\n checker: function (pointer, event, interactable, element, interaction, rect) {\n if (!rect) { return null; }\n\n const page = utils.extend({}, interaction.curCoords.page);\n const options = interactable.options;\n\n if (options.resize.enabled) {\n const resizeOptions = options.resize;\n const resizeEdges = { left: false, right: false, top: false, bottom: false };\n\n // if using resize.edges\n if (utils.is.object(resizeOptions.edges)) {\n for (const edge in resizeEdges) {\n resizeEdges[edge] = checkResizeEdge(edge,\n resizeOptions.edges[edge],\n page,\n interaction._eventTarget,\n element,\n rect,\n resizeOptions.margin || defaultMargin);\n }\n\n resizeEdges.left = resizeEdges.left && !resizeEdges.right;\n resizeEdges.top = resizeEdges.top && !resizeEdges.bottom;\n\n if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) {\n return {\n name: 'resize',\n edges: resizeEdges,\n };\n }\n }\n else {\n const right = options.resize.axis !== 'y' && page.x > (rect.right - defaultMargin);\n const bottom = options.resize.axis !== 'x' && page.y > (rect.bottom - defaultMargin);\n\n if (right || bottom) {\n return {\n name: 'resize',\n axes: (right? 'x' : '') + (bottom? 'y' : ''),\n };\n }\n }\n }\n\n return null;\n },\n\n cursors: (browser.isIe9OrOlder ? {\n x : 'e-resize',\n y : 's-resize',\n xy: 'se-resize',\n\n top : 'n-resize',\n left : 'w-resize',\n bottom : 's-resize',\n right : 'e-resize',\n topleft : 'se-resize',\n bottomright: 'se-resize',\n topright : 'ne-resize',\n bottomleft : 'ne-resize',\n } : {\n x : 'ew-resize',\n y : 'ns-resize',\n xy: 'nwse-resize',\n\n top : 'ns-resize',\n left : 'ew-resize',\n bottom : 'ns-resize',\n right : 'ew-resize',\n topleft : 'nwse-resize',\n bottomright: 'nwse-resize',\n topright : 'nesw-resize',\n bottomleft : 'nesw-resize',\n }),\n\n getCursor: function (action) {\n if (action.axis) {\n return resize.cursors[action.name + action.axis];\n }\n else if (action.edges) {\n let cursorKey = '';\n const edgeNames = ['top', 'bottom', 'left', 'right'];\n\n for (let i = 0; i < 4; i++) {\n if (action.edges[edgeNames[i]]) {\n cursorKey += edgeNames[i];\n }\n }\n\n return resize.cursors[cursorKey];\n }\n },\n};\n\n// resizestart\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'resizestart' || !interaction.prepared.edges) {\n return;\n }\n\n const startRect = interaction.target.getRect(interaction.element);\n const resizeOptions = interaction.target.options.resize;\n\n /*\n * When using the `resizable.square` or `resizable.preserveAspectRatio` options, resizing from one edge\n * will affect another. E.g. with `resizable.square`, resizing to make the right edge larger will make\n * the bottom edge larger by the same amount. We call these 'linked' edges. Any linked edges will depend\n * on the active edges and the edge being interacted with.\n */\n if (resizeOptions.square || resizeOptions.preserveAspectRatio) {\n const linkedEdges = utils.extend({}, interaction.prepared.edges);\n\n linkedEdges.top = linkedEdges.top || (linkedEdges.left && !linkedEdges.bottom);\n linkedEdges.left = linkedEdges.left || (linkedEdges.top && !linkedEdges.right );\n linkedEdges.bottom = linkedEdges.bottom || (linkedEdges.right && !linkedEdges.top );\n linkedEdges.right = linkedEdges.right || (linkedEdges.bottom && !linkedEdges.left );\n\n interaction.prepared._linkedEdges = linkedEdges;\n }\n else {\n interaction.prepared._linkedEdges = null;\n }\n\n // if using `resizable.preserveAspectRatio` option, record aspect ratio at the start of the resize\n if (resizeOptions.preserveAspectRatio) {\n interaction.resizeStartAspectRatio = startRect.width / startRect.height;\n }\n\n interaction.resizeRects = {\n start : startRect,\n current : utils.extend({}, startRect),\n inverted : utils.extend({}, startRect),\n previous : utils.extend({}, startRect),\n delta : {\n left: 0, right : 0, width : 0,\n top : 0, bottom: 0, height: 0,\n },\n };\n\n iEvent.rect = interaction.resizeRects.inverted;\n iEvent.deltaRect = interaction.resizeRects.delta;\n});\n\n// resizemove\nInteractEvent.signals.on('new', function ({ iEvent, phase, interaction }) {\n if (phase !== 'move' || !interaction.prepared.edges) { return; }\n\n const resizeOptions = interaction.target.options.resize;\n const invert = resizeOptions.invert;\n const invertible = invert === 'reposition' || invert === 'negate';\n\n let edges = interaction.prepared.edges;\n\n const start = interaction.resizeRects.start;\n const current = interaction.resizeRects.current;\n const inverted = interaction.resizeRects.inverted;\n const delta = interaction.resizeRects.delta;\n const previous = utils.extend(interaction.resizeRects.previous, inverted);\n const originalEdges = edges;\n\n let dx = iEvent.dx;\n let dy = iEvent.dy;\n\n if (resizeOptions.preserveAspectRatio || resizeOptions.square) {\n // `resize.preserveAspectRatio` takes precedence over `resize.square`\n const startAspectRatio = resizeOptions.preserveAspectRatio\n ? interaction.resizeStartAspectRatio\n : 1;\n\n edges = interaction.prepared._linkedEdges;\n\n if ((originalEdges.left && originalEdges.bottom)\n || (originalEdges.right && originalEdges.top)) {\n dy = -dx / startAspectRatio;\n }\n else if (originalEdges.left || originalEdges.right ) { dy = dx / startAspectRatio; }\n else if (originalEdges.top || originalEdges.bottom) { dx = dy * startAspectRatio; }\n }\n\n // update the 'current' rect without modifications\n if (edges.top ) { current.top += dy; }\n if (edges.bottom) { current.bottom += dy; }\n if (edges.left ) { current.left += dx; }\n if (edges.right ) { current.right += dx; }\n\n if (invertible) {\n // if invertible, copy the current rect\n utils.extend(inverted, current);\n\n if (invert === 'reposition') {\n // swap edge values if necessary to keep width/height positive\n let swap;\n\n if (inverted.top > inverted.bottom) {\n swap = inverted.top;\n\n inverted.top = inverted.bottom;\n inverted.bottom = swap;\n }\n if (inverted.left > inverted.right) {\n swap = inverted.left;\n\n inverted.left = inverted.right;\n inverted.right = swap;\n }\n }\n }\n else {\n // if not invertible, restrict to minimum of 0x0 rect\n inverted.top = Math.min(current.top, start.bottom);\n inverted.bottom = Math.max(current.bottom, start.top);\n inverted.left = Math.min(current.left, start.right);\n inverted.right = Math.max(current.right, start.left);\n }\n\n inverted.width = inverted.right - inverted.left;\n inverted.height = inverted.bottom - inverted.top ;\n\n for (const edge in inverted) {\n delta[edge] = inverted[edge] - previous[edge];\n }\n\n iEvent.edges = interaction.prepared.edges;\n iEvent.rect = inverted;\n iEvent.deltaRect = delta;\n});\n\n/*\\\n * Interactable.resizable\n [ method ]\n *\n * Gets or sets whether resize actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of resize elements\n | var isResizeable = interact('input[type=text]').resizable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on resize events (object makes the Interactable resizable)\n = (object) This Interactable\n | interact(element).resizable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | edges: {\n | top : true, // Use pointer coords to check for resize.\n | left : false, // Disable resizing from left edge.\n | bottom: '.resize-s',// Resize if pointer target matches selector\n | right : handleEl // Resize if pointer target is the given Element\n | },\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height are adjusted at a 1:1 ratio.\n | square: false,\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height maintain the aspect ratio they had when resizing started.\n | preserveAspectRatio: false,\n |\n | // a value of 'none' will limit the resize rect to a minimum of 0x0\n | // 'negate' will allow the rect to have negative width/height\n | // 'reposition' will keep the width/height positive by swapping\n | // the top and bottom edges and/or swapping the left and right edges\n | invert: 'none' || 'negate' || 'reposition'\n |\n | // limit multiple resizes.\n | // See the explanation in the @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n \\*/\nInteractable.prototype.resizable = function (options) {\n if (utils.is.object(options)) {\n this.options.resize.enabled = options.enabled === false? false: true;\n this.setPerAction('resize', options);\n this.setOnEvents('resize', options);\n\n if (/^x$|^y$|^xy$/.test(options.axis)) {\n this.options.resize.axis = options.axis;\n }\n else if (options.axis === null) {\n this.options.resize.axis = defaultOptions.resize.axis;\n }\n\n if (utils.is.bool(options.preserveAspectRatio)) {\n this.options.resize.preserveAspectRatio = options.preserveAspectRatio;\n }\n else if (utils.is.bool(options.square)) {\n this.options.resize.square = options.square;\n }\n\n return this;\n }\n if (utils.is.bool(options)) {\n this.options.resize.enabled = options;\n\n if (!options) {\n this.onresizestart = this.onresizestart = this.onresizeend = null;\n }\n\n return this;\n }\n return this.options.resize;\n};\n\nfunction checkResizeEdge (name, value, page, element, interactableElement, rect, margin) {\n // false, '', undefined, null\n if (!value) { return false; }\n\n // true value, use pointer coords and element rect\n if (value === true) {\n // if dimensions are negative, \"switch\" edges\n const width = utils.is.number(rect.width )? rect.width : rect.right - rect.left;\n const height = utils.is.number(rect.height)? rect.height : rect.bottom - rect.top ;\n\n if (width < 0) {\n if (name === 'left' ) { name = 'right'; }\n else if (name === 'right') { name = 'left' ; }\n }\n if (height < 0) {\n if (name === 'top' ) { name = 'bottom'; }\n else if (name === 'bottom') { name = 'top' ; }\n }\n\n if (name === 'left' ) { return page.x < ((width >= 0? rect.left: rect.right ) + margin); }\n if (name === 'top' ) { return page.y < ((height >= 0? rect.top : rect.bottom) + margin); }\n\n if (name === 'right' ) { return page.x > ((width >= 0? rect.right : rect.left) - margin); }\n if (name === 'bottom') { return page.y > ((height >= 0? rect.bottom: rect.top ) - margin); }\n }\n\n // the remaining checks require an element\n if (!utils.is.element(element)) { return false; }\n\n return utils.is.element(value)\n // the value is an element to use as a resize handle\n ? value === element\n // otherwise check if element matches value as selector\n : utils.matchesUpTo(element, value, interactableElement);\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.resizeAxes = 'xy';\n});\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action }) {\n if (action !== 'resize' || !interaction.resizeAxes) { return; }\n\n const options = interaction.target.options;\n\n if (options.resize.square) {\n if (interaction.resizeAxes === 'y') {\n iEvent.dx = iEvent.dy;\n }\n else {\n iEvent.dy = iEvent.dx;\n }\n iEvent.axes = 'xy';\n }\n else {\n iEvent.axes = interaction.resizeAxes;\n\n if (interaction.resizeAxes === 'x') {\n iEvent.dy = 0;\n }\n else if (interaction.resizeAxes === 'y') {\n iEvent.dx = 0;\n }\n }\n});\n\nactions.resize = resize;\nactions.names.push('resize');\nutils.merge(Interactable.eventTypes, [\n 'resizestart',\n 'resizemove',\n 'resizeinertiastart',\n 'resizeinertiaresume',\n 'resizeend',\n]);\nactions.methodDict.resize = 'resizable';\n\ndefaultOptions.resize = resize.defaults;\n\nmodule.exports = resize;\n","const raf = require('./utils/raf');\nconst getWindow = require('./utils/window').getWindow;\nconst is = require('./utils/is');\nconst domUtils = require('./utils/domUtils');\nconst Interaction = require('./Interaction');\nconst defaultOptions = require('./defaultOptions');\n\nconst autoScroll = {\n defaults: {\n enabled : false,\n container: null, // the item that is scrolled (Window or HTMLElement)\n margin : 60,\n speed : 300, // the scroll speed in pixels per second\n },\n\n interaction: null,\n i: null, // the handle returned by window.setInterval\n x: 0, y: 0, // Direction each pulse is to scroll in\n\n isScrolling: false,\n prevTime: 0,\n\n start: function (interaction) {\n autoScroll.isScrolling = true;\n raf.cancel(autoScroll.i);\n\n autoScroll.interaction = interaction;\n autoScroll.prevTime = new Date().getTime();\n autoScroll.i = raf.request(autoScroll.scroll);\n },\n\n stop: function () {\n autoScroll.isScrolling = false;\n raf.cancel(autoScroll.i);\n },\n\n // scroll the window by the values in scroll.x/y\n scroll: function () {\n const options = autoScroll.interaction.target.options[autoScroll.interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(autoScroll.interaction.element);\n const now = new Date().getTime();\n // change in time in seconds\n const dt = (now - autoScroll.prevTime) / 1000;\n // displacement\n const s = options.speed * dt;\n\n if (s >= 1) {\n if (is.window(container)) {\n container.scrollBy(autoScroll.x * s, autoScroll.y * s);\n }\n else if (container) {\n container.scrollLeft += autoScroll.x * s;\n container.scrollTop += autoScroll.y * s;\n }\n\n autoScroll.prevTime = now;\n }\n\n if (autoScroll.isScrolling) {\n raf.cancel(autoScroll.i);\n autoScroll.i = raf.request(autoScroll.scroll);\n }\n },\n check: function (interactable, actionName) {\n const options = interactable.options;\n\n return options[actionName].autoScroll && options[actionName].autoScroll.enabled;\n },\n onInteractionMove: function ({ interaction, pointer }) {\n if (!(interaction.interacting()\n && autoScroll.check(interaction.target, interaction.prepared.name))) {\n return;\n }\n\n if (interaction.simulation) {\n autoScroll.x = autoScroll.y = 0;\n return;\n }\n\n let top;\n let right;\n let bottom;\n let left;\n\n const options = interaction.target.options[interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(interaction.element);\n\n if (is.window(container)) {\n left = pointer.clientX < autoScroll.margin;\n top = pointer.clientY < autoScroll.margin;\n right = pointer.clientX > container.innerWidth - autoScroll.margin;\n bottom = pointer.clientY > container.innerHeight - autoScroll.margin;\n }\n else {\n const rect = domUtils.getElementClientRect(container);\n\n left = pointer.clientX < rect.left + autoScroll.margin;\n top = pointer.clientY < rect.top + autoScroll.margin;\n right = pointer.clientX > rect.right - autoScroll.margin;\n bottom = pointer.clientY > rect.bottom - autoScroll.margin;\n }\n\n autoScroll.x = (right ? 1: left? -1: 0);\n autoScroll.y = (bottom? 1: top? -1: 0);\n\n if (!autoScroll.isScrolling) {\n // set the autoScroll properties to those of the target\n autoScroll.margin = options.margin;\n autoScroll.speed = options.speed;\n\n autoScroll.start(interaction);\n }\n },\n};\n\nInteraction.signals.on('stop-active', function () {\n autoScroll.stop();\n});\n\nInteraction.signals.on('action-move', autoScroll.onInteractionMove);\n\ndefaultOptions.perAction.autoScroll = autoScroll.defaults;\n\nmodule.exports = autoScroll;\n","const Interactable = require('../Interactable');\nconst actions = require('../actions/base');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.ignoreFrom\n [ method ]\n *\n * If the target of the `mousedown`, `pointerdown` or `touchstart`\n * event or any of it's parents match the given CSS selector or\n * Element, no drag/resize/gesture is started.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to not ignore any elements\n = (string | Element | object) The current ignoreFrom value or this Interactable\n **\n | interact(element, { ignoreFrom: document.getElementById('no-action') });\n | // or\n | interact(element).ignoreFrom('input, textarea, a');\n\\*/\nInteractable.prototype.ignoreFrom = function (newValue) {\n return this._backCompatOption('ignoreFrom', newValue);\n};\n\n/*\\\n * Interactable.allowFrom\n [ method ]\n *\n * A drag/resize/gesture is started only If the target of the\n * `mousedown`, `pointerdown` or `touchstart` event or any of it's\n * parents match the given CSS selector or Element.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to allow from any element\n = (string | Element | object) The current allowFrom value or this Interactable\n **\n | interact(element, { allowFrom: document.getElementById('drag-handle') });\n | // or\n | interact(element).allowFrom('.handle');\n\\*/\nInteractable.prototype.allowFrom = function (newValue) {\n return this._backCompatOption('allowFrom', newValue);\n};\n\nInteractable.prototype.testIgnore = function (ignoreFrom, interactableElement, element) {\n if (!ignoreFrom || !is.element(element)) { return false; }\n\n if (is.string(ignoreFrom)) {\n return domUtils.matchesUpTo(element, ignoreFrom, interactableElement);\n }\n else if (is.element(ignoreFrom)) {\n return domUtils.nodeContains(ignoreFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testAllow = function (allowFrom, interactableElement, element) {\n if (!allowFrom) { return true; }\n\n if (!is.element(element)) { return false; }\n\n if (is.string(allowFrom)) {\n return domUtils.matchesUpTo(element, allowFrom, interactableElement);\n }\n else if (is.element(allowFrom)) {\n return domUtils.nodeContains(allowFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testIgnoreAllow = function (options, interactableElement, eventTarget) {\n return (!this.testIgnore(options.ignoreFrom, interactableElement, eventTarget)\n && this.testAllow(options.allowFrom, interactableElement, eventTarget));\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (event.buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\n","const interact = require('../interact');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst actions = require('../actions/base');\nconst defaultOptions = require('../defaultOptions');\nconst browser = require('../utils/browser');\nconst scope = require('../scope');\nconst utils = require('../utils');\nconst signals = require('../utils/Signals').new();\n\nrequire('./InteractableMethods');\n\nconst autoStart = {\n signals,\n withinInteractionLimit,\n // Allow this many interactions to happen simultaneously\n maxInteractions: Infinity,\n defaults: {\n perAction: {\n manualStart: false,\n max: Infinity,\n maxPerElement: 1,\n allowFrom: null,\n ignoreFrom: null,\n },\n },\n setActionDefaults: function (action) {\n utils.extend(action.defaults, autoStart.defaults.perAction);\n },\n};\n\n// set cursor style on mousedown\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget }) {\n if (interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\n// set cursor style on mousemove\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget }) {\n if (!interaction.mouse\n || interaction.pointerIsDown\n || interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\nInteraction.signals.on('move', function (arg) {\n const { interaction, event } = arg;\n\n if (!interaction.pointerIsDown\n || interaction.interacting()\n || !interaction.pointerWasMoved\n || !interaction.prepared.name) {\n return;\n }\n\n signals.fire('before-start', arg);\n\n const target = interaction.target;\n\n if (interaction.prepared.name && target) {\n // check manualStart and interaction limit\n if (target.options[interaction.prepared.name].manualStart\n || !withinInteractionLimit(target, interaction.element, interaction.prepared)) {\n interaction.stop(event);\n }\n else {\n interaction.start(interaction.prepared, target, interaction.element);\n }\n }\n});\n\n// Check if the current target supports the action.\n// If so, return the validated action. Otherwise, return null\nfunction validateAction (action, interactable, element, eventTarget) {\n if (utils.is.object(action)\n && interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget)\n && interactable.options[action.name].enabled\n && withinInteractionLimit(interactable, element, action)) {\n return action;\n }\n\n return null;\n}\n\nfunction validateSelector (interaction, pointer, event, matches, matchElements, eventTarget) {\n for (let i = 0, len = matches.length; i < len; i++) {\n const match = matches[i];\n const matchElement = matchElements[i];\n const action = validateAction(match.getAction(pointer, event, interaction, matchElement),\n match,\n matchElement,\n eventTarget);\n\n if (action) {\n return {\n action,\n target: match,\n element: matchElement,\n };\n }\n }\n\n return {};\n}\n\nfunction getActionInfo (interaction, pointer, event, eventTarget) {\n let matches = [];\n let matchElements = [];\n\n let element = eventTarget;\n let action = null;\n\n function pushMatches (interactable, selector, context) {\n const elements = (browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined);\n\n if (utils.matchesSelector(element, selector, elements)) {\n\n matches.push(interactable);\n matchElements.push(element);\n }\n }\n\n while (utils.is.element(element)) {\n matches = [];\n matchElements = [];\n\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && (action = validateAction(elementInteractable.getAction(pointer, event, interaction, element, eventTarget),\n elementInteractable,\n element,\n eventTarget))\n && !elementInteractable.options[action.name].manualStart) {\n return {\n element,\n action,\n target: elementInteractable,\n };\n }\n else {\n scope.interactables.forEachSelector(pushMatches, element);\n\n const actionInfo = validateSelector(interaction, pointer, event, matches, matchElements, eventTarget);\n\n if (actionInfo.action\n && !actionInfo.target.options[actionInfo.action.name].manualStart) {\n return actionInfo;\n }\n }\n\n element = utils.parentNode(element);\n }\n\n return {};\n}\n\nfunction prepare (interaction, { action, target, element }) {\n action = action || {};\n\n if (interaction.target && interaction.target.options.styleCursor) {\n interaction.target._doc.documentElement.style.cursor = '';\n }\n\n interaction.target = target;\n interaction.element = element;\n utils.copyAction(interaction.prepared, action);\n\n if (target && target.options.styleCursor) {\n const cursor = action? actions[action.name].getCursor(action) : '';\n interaction.target._doc.documentElement.style.cursor = cursor;\n }\n\n signals.fire('prepared', { interaction: interaction });\n}\n\nInteraction.signals.on('stop', function ({ interaction }) {\n const target = interaction.target;\n\n if (target && target.options.styleCursor) {\n target._doc.documentElement.style.cursor = '';\n }\n});\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (utils.is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (utils.is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n const buttons = event.buttons || ({\n 0: 1,\n 1: 4,\n 3: 8,\n 4: 16,\n })[event.button];\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\nfunction withinInteractionLimit (interactable, element, action) {\n const options = interactable.options;\n const maxActions = options[action.name].max;\n const maxPerElement = options[action.name].maxPerElement;\n let activeInteractions = 0;\n let targetCount = 0;\n let targetElementCount = 0;\n\n // no actions if any of these values == 0\n if (!(maxActions && maxPerElement && autoStart.maxInteractions)) { return; }\n\n for (let i = 0, len = scope.interactions.length; i < len; i++) {\n const interaction = scope.interactions[i];\n const otherAction = interaction.prepared.name;\n\n if (!interaction.interacting()) { continue; }\n\n activeInteractions++;\n\n if (activeInteractions >= autoStart.maxInteractions) {\n return false;\n }\n\n if (interaction.target !== interactable) { continue; }\n\n targetCount += (otherAction === action.name)|0;\n\n if (targetCount >= maxActions) {\n return false;\n }\n\n if (interaction.element === element) {\n targetElementCount++;\n\n if (otherAction !== action.name || targetElementCount >= maxPerElement) {\n return false;\n }\n }\n }\n\n return autoStart.maxInteractions > 0;\n}\n\n/*\\\n * interact.maxInteractions\n [ method ]\n **\n * Returns or sets the maximum number of concurrent interactions allowed.\n * By default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables\n * and elements, you need to enable it in the draggable, resizable and\n * gesturable `'max'` and `'maxPerElement'` options.\n **\n - newValue (number) #optional Any number. newValue <= 0 means no interactions.\n\\*/\ninteract.maxInteractions = function (newValue) {\n if (utils.is.number(newValue)) {\n autoStart.maxInteractions = newValue;\n\n return this;\n }\n\n return autoStart.maxInteractions;\n};\n\nInteractable.settingsMethods.push('styleCursor');\nInteractable.settingsMethods.push('actionChecker');\nInteractable.settingsMethods.push('ignoreFrom');\nInteractable.settingsMethods.push('allowFrom');\n\ndefaultOptions.base.actionChecker = null;\ndefaultOptions.base.styleCursor = true;\n\nutils.extend(defaultOptions.perAction, autoStart.defaults.perAction);\n\nmodule.exports = autoStart;\n","const autoStart = require('./base');\nconst Interaction = require('../Interaction');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.delayTimer = null;\n});\n\nautoStart.signals.on('prepared', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.delayTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.target, interaction.element);\n }, delay);\n }\n});\n\nInteraction.signals.on('move', function ({ interaction, duplicate }) {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.delayTimer);\n }\n});\n\n// prevent regular down->move autoStart\nautoStart.signals.on('before-start', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.prepared.name = null;\n }\n});\n","const autoStart = require('./base');\nconst scope = require('../scope');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\n\nconst { matchesSelector, parentNode } = require('../utils/domUtils');\n\nautoStart.setActionDefaults(require('../actions/drag'));\n\nautoStart.signals.on('before-start', function ({ interaction, eventTarget, dx, dy }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // check if a drag is in the correct axis\n const absX = Math.abs(dx);\n const absY = Math.abs(dy);\n const options = interaction.target.options.drag;\n const startAxis = options.startAxis;\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy');\n\n interaction.prepared.axis = options.lockAxis === 'start'\n ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n : options.lockAxis;\n\n // if the movement isn't in the startAxis of the interactable\n if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) {\n // cancel the prepared action\n interaction.prepared.name = null;\n\n // then try to get a drag from another ineractable\n\n if (!interaction.prepared.name) {\n\n let element = eventTarget;\n\n const getDraggable = function (interactable, selector, context) {\n const elements = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n if (interactable === interaction.target) { return; }\n\n if (!options.manualStart\n && !interactable.testIgnoreAllow(options, element, eventTarget)\n && matchesSelector(element, selector, elements)) {\n\n const action = interactable.getAction(interaction.downPointer,\n interaction.downEvent,\n interaction,\n element);\n\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, interactable)\n && autoStart.validateAction(action, interactable, element, eventTarget)) {\n\n return interactable;\n }\n }\n };\n\n let action = null;\n\n // check all interactables\n while (is.element(element)) {\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && elementInteractable !== interaction.target\n && !elementInteractable.options.drag.manualStart) {\n\n action = elementInteractable.getAction(interaction.downPointer, interaction.downEvent, interaction, element);\n }\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, elementInteractable)) {\n\n interaction.prepared.name = 'drag';\n interaction.target = elementInteractable;\n interaction.element = element;\n break;\n }\n\n const selectorInteractable = scope.interactables.forEachSelector(getDraggable, element);\n\n if (selectorInteractable) {\n interaction.prepared.name = 'drag';\n interaction.target = selectorInteractable;\n interaction.element = element;\n break;\n }\n\n element = parentNode(element);\n }\n }\n }\n});\n\nfunction checkStartAxis (startAxis, interactable) {\n if (!interactable) { return false; }\n\n const thisAxis = interactable.options.drag.startAxis;\n\n return (startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis);\n}\n","require('./base').setActionDefaults(require('../actions/gesture'));\n","require('./base').setActionDefaults(require('../actions/resize'));\n","module.exports = {\n base: {\n accept : null,\n preventDefault: 'auto',\n deltaSource : 'page',\n },\n\n perAction: {\n origin: { x: 0, y: 0 },\n\n // only allow left button by default\n // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n mouseButtons: 1,\n\n inertia: {\n enabled : false,\n resistance : 10, // the lambda in exponential decay\n minSpeed : 100, // target speed must be above this for inertia to start\n endSpeed : 10, // the speed at which inertia is slow enough to stop\n allowResume : true, // allow resuming an action in inertia phase\n smoothEndDuration: 300, // animate to snap/restrict endOnly if there's no inertia\n },\n },\n};\n","/* browser entry point */\n\n// Legacy browser support\nrequire('./legacyBrowsers');\n\n// inertia\nrequire('./inertia');\n\n// modifiers\nrequire('./modifiers/snap');\nrequire('./modifiers/restrict');\n\n// pointerEvents\nrequire('./pointerEvents/base');\nrequire('./pointerEvents/holdRepeat');\nrequire('./pointerEvents/interactableTargets');\n\n// delay\nrequire('./autoStart/delay');\n\n// actions\nrequire('./actions/gesture');\nrequire('./actions/resize');\nrequire('./actions/drag');\nrequire('./actions/drop');\n\n// load these modifiers after resize is loaded\nrequire('./modifiers/snapSize');\nrequire('./modifiers/restrictEdges');\nrequire('./modifiers/restrictSize');\n\n// autoStart actions\nrequire('./autoStart/gesture');\nrequire('./autoStart/resize');\nrequire('./autoStart/drag');\n\n// Interactable preventDefault setting\nrequire('./interactablePreventDefault.js');\n\n// autoScroll\nrequire('./autoScroll');\n\n// export interact\nmodule.exports = require('./interact');\n","const InteractEvent = require('./InteractEvent');\nconst Interaction = require('./Interaction');\nconst modifiers = require('./modifiers');\nconst utils = require('./utils');\nconst animationFrame = require('./utils/raf');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.inertiaStatus = {\n active : false,\n smoothEnd : false,\n allowResume: false,\n\n startEvent: null,\n upCoords : {},\n\n xe: 0, ye: 0,\n sx: 0, sy: 0,\n\n t0: 0,\n vx0: 0, vys: 0,\n duration: 0,\n\n lambda_v0: 0,\n one_ve_v0: 0,\n i : null,\n };\n\n interaction.boundInertiaFrame = () => inertiaFrame .apply(interaction);\n interaction.boundSmoothEndFrame = () => smoothEndFrame.apply(interaction);\n});\n\nInteraction.signals.on('down', function ({ interaction, event, pointer, eventTarget }) {\n const status = interaction.inertiaStatus;\n\n // Check if the down event hits the current inertia target\n if (status.active) {\n let element = eventTarget;\n\n // climb up the DOM tree from the event target\n while (utils.is.element(element)) {\n\n // if interaction element is the current inertia target element\n if (element === interaction.element) {\n // stop inertia\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n\n // update pointers to the down event's coordinates\n interaction.updatePointer(pointer);\n utils.setCoords(interaction.curCoords, interaction.pointers);\n\n // fire appropriate signals\n const signalArg = { interaction };\n Interaction.signals.fire('before-action-move', signalArg);\n Interaction.signals.fire('action-resume' , signalArg);\n\n // fire a reume event\n const resumeEvent = new InteractEvent(interaction,\n event,\n interaction.prepared.name,\n 'inertiaresume',\n interaction.element);\n\n interaction.target.fire(resumeEvent);\n interaction.prevEvent = resumeEvent;\n modifiers.resetStatuses(interaction.modifierStatuses);\n\n utils.copyCoords(interaction.prevCoords, interaction.curCoords);\n break;\n }\n\n element = utils.parentNode(element);\n }\n }\n});\n\nInteraction.signals.on('up', function ({ interaction, event }) {\n const status = interaction.inertiaStatus;\n\n if (!interaction.interacting() || status.active) { return; }\n\n const target = interaction.target;\n const options = target && target.options;\n const inertiaOptions = options && interaction.prepared.name && options[interaction.prepared.name].inertia;\n\n const now = new Date().getTime();\n const statuses = {};\n const page = utils.extend({}, interaction.curCoords.page);\n const pointerSpeed = interaction.pointerDelta.client.speed;\n\n let smoothEnd = false;\n let modifierResult;\n\n // check if inertia should be started\n const inertiaPossible = (inertiaOptions && inertiaOptions.enabled\n && interaction.prepared.name !== 'gesture'\n && event !== status.startEvent);\n\n const inertia = (inertiaPossible\n && (now - interaction.curCoords.timeStamp) < 50\n && pointerSpeed > inertiaOptions.minSpeed\n && pointerSpeed > inertiaOptions.endSpeed);\n\n const modifierArg = {\n interaction,\n pageCoords: page,\n statuses,\n preEnd: true,\n requireEndOnly: true,\n };\n\n // smoothEnd\n if (inertiaPossible && !inertia) {\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n if (modifierResult.shouldMove && modifierResult.locked) {\n smoothEnd = true;\n }\n }\n\n if (!(inertia || smoothEnd)) { return; }\n\n utils.copyCoords(status.upCoords, interaction.curCoords);\n\n interaction.pointers[0] = status.startEvent =\n new InteractEvent(interaction, event, interaction.prepared.name, 'inertiastart', interaction.element);\n\n status.t0 = now;\n\n status.active = true;\n status.allowResume = inertiaOptions.allowResume;\n interaction.simulation = status;\n\n target.fire(status.startEvent);\n\n if (inertia) {\n status.vx0 = interaction.pointerDelta.client.vx;\n status.vy0 = interaction.pointerDelta.client.vy;\n status.v0 = pointerSpeed;\n\n calcInertia(interaction, status);\n\n utils.extend(page, interaction.curCoords.page);\n\n page.x += status.xe;\n page.y += status.ye;\n\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n status.modifiedXe += modifierResult.dx;\n status.modifiedYe += modifierResult.dy;\n\n status.i = animationFrame.request(interaction.boundInertiaFrame);\n }\n else {\n status.smoothEnd = true;\n status.xe = modifierResult.dx;\n status.ye = modifierResult.dy;\n\n status.sx = status.sy = 0;\n\n status.i = animationFrame.request(interaction.boundSmoothEndFrame);\n }\n});\n\nInteraction.signals.on('stop-active', function ({ interaction }) {\n const status = interaction.inertiaStatus;\n\n if (status.active) {\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n }\n});\n\nfunction calcInertia (interaction, status) {\n const inertiaOptions = interaction.target.options[interaction.prepared.name].inertia;\n const lambda = inertiaOptions.resistance;\n const inertiaDur = -Math.log(inertiaOptions.endSpeed / status.v0) / lambda;\n\n status.x0 = interaction.prevEvent.pageX;\n status.y0 = interaction.prevEvent.pageY;\n status.t0 = status.startEvent.timeStamp / 1000;\n status.sx = status.sy = 0;\n\n status.modifiedXe = status.xe = (status.vx0 - inertiaDur) / lambda;\n status.modifiedYe = status.ye = (status.vy0 - inertiaDur) / lambda;\n status.te = inertiaDur;\n\n status.lambda_v0 = lambda / status.v0;\n status.one_ve_v0 = 1 - inertiaOptions.endSpeed / status.v0;\n}\n\nfunction inertiaFrame () {\n updateInertiaCoords(this);\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n\n const status = this.inertiaStatus;\n const options = this.target.options[this.prepared.name].inertia;\n const lambda = options.resistance;\n const t = new Date().getTime() / 1000 - status.t0;\n\n if (t < status.te) {\n\n const progress = 1 - (Math.exp(-lambda * t) - status.lambda_v0) / status.one_ve_v0;\n\n if (status.modifiedXe === status.xe && status.modifiedYe === status.ye) {\n status.sx = status.xe * progress;\n status.sy = status.ye * progress;\n }\n else {\n const quadPoint = utils.getQuadraticCurvePoint(0, 0,\n status.xe,\n status.ye,\n status.modifiedXe,\n status.modifiedYe,\n progress);\n\n status.sx = quadPoint.x;\n status.sy = quadPoint.y;\n }\n\n this.doMove();\n\n status.i = animationFrame.request(this.boundInertiaFrame);\n }\n else {\n status.sx = status.modifiedXe;\n status.sy = status.modifiedYe;\n\n this.doMove();\n this.end(status.startEvent);\n status.active = false;\n this.simulation = null;\n }\n\n utils.copyCoords(this.prevCoords, this.curCoords);\n}\n\nfunction smoothEndFrame () {\n updateInertiaCoords(this);\n\n const status = this.inertiaStatus;\n const t = new Date().getTime() - status.t0;\n const duration = this.target.options[this.prepared.name].inertia.smoothEndDuration;\n\n if (t < duration) {\n status.sx = utils.easeOutQuad(t, 0, status.xe, duration);\n status.sy = utils.easeOutQuad(t, 0, status.ye, duration);\n\n this.pointerMove(status.startEvent, status.startEvent);\n\n status.i = animationFrame.request(this.boundSmoothEndFrame);\n }\n else {\n status.sx = status.xe;\n status.sy = status.ye;\n\n this.pointerMove(status.startEvent, status.startEvent);\n this.end(status.startEvent);\n\n status.smoothEnd =\n status.active = false;\n this.simulation = null;\n }\n}\n\nfunction updateInertiaCoords (interaction) {\n const status = interaction.inertiaStatus;\n\n // return if inertia isn't running\n if (!status.active) { return; }\n\n const pageUp = status.upCoords.page;\n const clientUp = status.upCoords.client;\n\n utils.setCoords(interaction.curCoords, [ {\n pageX : pageUp.x + status.sx,\n pageY : pageUp.y + status.sy,\n clientX: clientUp.x + status.sx,\n clientY: clientUp.y + status.sy,\n } ]);\n}\n","const browser = require('./utils/browser');\nconst events = require('./utils/events');\nconst utils = require('./utils');\nconst scope = require('./scope');\nconst Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\n\nconst globalEvents = {};\n\n/*\\\n * interact\n [ method ]\n *\n * The methods of this variable can be used to set elements as\n * interactables and also to change various default settings.\n *\n * Calling it as a function and passing an element or a valid CSS selector\n * string returns an Interactable object which has various methods to\n * configure it.\n *\n - element (Element | string) The HTML or SVG Element to interact with or CSS selector\n = (object) An @Interactable\n *\n > Usage\n | interact('#draggable').draggable(true);\n |\n | var rectables = interact('rect');\n | rectables\n | .gesturable(true)\n | .on('gesturemove', function (event) {\n | // ...\n | });\n\\*/\nfunction interact (element, options) {\n let interactable = scope.interactables.get(element, options);\n\n if (!interactable) {\n interactable = new Interactable(element, options);\n interactable.events.global = globalEvents;\n }\n\n return interactable;\n}\n\n/*\\\n * interact.isSet\n [ method ]\n *\n * Check if an element has been set\n - element (Element) The Element being searched for\n = (boolean) Indicates if the element or CSS selector was previously passed to interact\n\\*/\ninteract.isSet = function (element, options) {\n return scope.interactables.indexOfElement(element, options && options.context) !== -1;\n};\n\n/*\\\n * interact.on\n [ method ]\n *\n * Adds a global listener for an InteractEvent or adds a DOM event to\n * `document`\n *\n - type (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) interact\n\\*/\ninteract.on = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.on(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.on(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n // if it is an InteractEvent type, add listener to globalEvents\n if (utils.contains(Interactable.eventTypes, type)) {\n // if this type of event was never bound\n if (!globalEvents[type]) {\n globalEvents[type] = [listener];\n }\n else {\n globalEvents[type].push(listener);\n }\n }\n // If non InteractEvent type, addEventListener to document\n else {\n events.add(scope.document, type, listener, { options });\n }\n\n return interact;\n};\n\n/*\\\n * interact.off\n [ method ]\n *\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n - type (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) interact\n \\*/\ninteract.off = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.off(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.off(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n if (!utils.contains(Interactable.eventTypes, type)) {\n events.remove(scope.document, type, listener, options);\n }\n else {\n let index;\n\n if (type in globalEvents\n && (index = utils.indexOf(globalEvents[type], listener)) !== -1) {\n globalEvents[type].splice(index, 1);\n }\n }\n\n return interact;\n};\n\n/*\\\n * interact.debug\n [ method ]\n *\n * Returns an object which exposes internal data\n = (object) An object with properties that outline the current state and expose internal functions and variables\n\\*/\ninteract.debug = function () {\n return scope;\n};\n\n// expose the functions used to calculate multi-touch properties\ninteract.getPointerAverage = utils.pointerAverage;\ninteract.getTouchBBox = utils.touchBBox;\ninteract.getTouchDistance = utils.touchDistance;\ninteract.getTouchAngle = utils.touchAngle;\n\ninteract.getElementRect = utils.getElementRect;\ninteract.getElementClientRect = utils.getElementClientRect;\ninteract.matchesSelector = utils.matchesSelector;\ninteract.closest = utils.closest;\n\n/*\\\n * interact.supportsTouch\n [ method ]\n *\n = (boolean) Whether or not the browser supports touch input\n\\*/\ninteract.supportsTouch = function () {\n return browser.supportsTouch;\n};\n\n/*\\\n * interact.supportsPointerEvent\n [ method ]\n *\n = (boolean) Whether or not the browser supports PointerEvents\n\\*/\ninteract.supportsPointerEvent = function () {\n return browser.supportsPointerEvent;\n};\n\n/*\\\n * interact.stop\n [ method ]\n *\n * Cancels all interactions (end events are not fired)\n *\n - event (Event) An event on which to call preventDefault()\n = (object) interact\n\\*/\ninteract.stop = function (event) {\n for (let i = scope.interactions.length - 1; i >= 0; i--) {\n scope.interactions[i].stop(event);\n }\n\n return interact;\n};\n\n/*\\\n * interact.pointerMoveTolerance\n [ method ]\n * Returns or sets the distance the pointer must be moved before an action\n * sequence occurs. This also affects tolerance for tap events.\n *\n - newValue (number) #optional The movement from the start position must be greater than this value\n = (number | Interactable) The current setting or interact\n\\*/\ninteract.pointerMoveTolerance = function (newValue) {\n if (utils.is.number(newValue)) {\n Interaction.pointerMoveTolerance = newValue;\n\n return this;\n }\n\n return Interaction.pointerMoveTolerance;\n};\n\ninteract.addDocument = scope.addDocument;\ninteract.removeDocument = scope.removeDocument;\n\nscope.interact = interact;\n\nmodule.exports = interact;\n","const Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\nconst scope = require('./scope');\nconst is = require('./utils/is');\nconst events = require('./utils/events');\n\nconst { nodeContains, matchesSelector } = require('./utils/domUtils');\n\n/*\\\n * Interactable.preventDefault\n [ method ]\n *\n * Returns or sets whether to prevent the browser's default behaviour\n * in response to pointer events. Can be set to:\n * - `'always'` to always prevent\n * - `'never'` to never prevent\n * - `'auto'` to let interact.js try to determine what would be best\n *\n - newValue (string) #optional `true`, `false` or `'auto'`\n = (string | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.preventDefault = function (newValue) {\n if (/^(always|never|auto)$/.test(newValue)) {\n this.options.preventDefault = newValue;\n return this;\n }\n\n if (is.bool(newValue)) {\n this.options.preventDefault = newValue? 'always' : 'never';\n return this;\n }\n\n return this.options.preventDefault;\n};\n\nInteractable.prototype.checkAndPreventDefault = function (event) {\n const setting = this.options.preventDefault;\n\n if (setting === 'never') { return; }\n\n if (setting === 'always') {\n event.preventDefault();\n return;\n }\n\n // setting === 'auto'\n\n // don't preventDefault if the browser supports passiveEvents\n // CSS touch-action and user-selecct should be used instead\n if (events.supportsOptions) {\n return;\n }\n\n // don't preventDefault of pointerdown events\n if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) {\n return;\n }\n\n // don't preventDefault on editable elements\n if (is.element(event.target)\n && matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) {\n return;\n }\n\n event.preventDefault();\n};\n\nfunction onInteractionEvent ({ interaction, event }) {\n if (interaction.target) {\n interaction.target.checkAndPreventDefault(event);\n }\n}\n\nfor (const eventSignal of ['down', 'move', 'up', 'cancel']) {\n Interaction.signals.on(eventSignal, onInteractionEvent);\n}\n\n// prevent native HTML5 drag on interact.js target elements\nInteraction.docEvents.dragstart = function preventNativeDrag (event) {\n for (const interaction of scope.interactions) {\n\n if (interaction.element\n && (interaction.element === event.target\n || nodeContains(interaction.element, event.target))) {\n\n interaction.target.checkAndPreventDefault(event);\n return;\n }\n }\n};\n","const scope = require('./scope');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst iFinder = require('./utils/interactionFinder');\nconst pointerEvents = require('./pointerEvents/base');\n\nconst { window } = require('./utils/window');\n\nconst toString = Object.prototype.toString;\n\nif (!window.Array.isArray) {\n window.Array.isArray = function (obj) {\n return toString.call(obj) === '[object Array]';\n };\n}\n\nif (!String.prototype.trim) {\n String.prototype.trim = function () {\n return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n };\n}\n\n// http://www.quirksmode.org/dom/events/click.html\n// >Events leading to dblclick\n//\n// IE8 doesn't fire down event before dblclick.\n// This workaround tries to fire a tap and doubletap after dblclick\nfunction onIE8Dblclick (event) {\n const eventTarget = event.target;\n const interaction = iFinder.search(event, event.type, eventTarget);\n\n if (!interaction) { return; }\n\n if (interaction.prevTap\n && event.clientX === interaction.prevTap.clientX\n && event.clientY === interaction.prevTap.clientY\n && eventTarget === interaction.prevTap.target) {\n\n interaction.downTargets[0] = eventTarget;\n interaction.downTimes [0] = new Date().getTime();\n\n pointerEvents.fire({\n interaction,\n event,\n eventTarget,\n pointer: event,\n type: 'tap',\n });\n }\n}\n\nif (browser.isIE8) {\n const selectFix = function (event) {\n for (const interaction of scope.interactions) {\n if (interaction.interacting()) {\n interaction.target.checkAndPreventDefault(event);\n }\n }\n };\n\n const onDocIE8 = function onDocIE8 ({ doc, win }, signalName) {\n const eventMethod = signalName.indexOf('listen') === 0\n ? events.add : events.remove;\n\n // For IE's lack of Event#preventDefault\n eventMethod(doc, 'selectstart', selectFix);\n\n if (pointerEvents) {\n eventMethod(doc, 'dblclick', onIE8Dblclick);\n }\n };\n\n scope.signals.on('add-document' , onDocIE8);\n scope.signals.on('remove-document', onDocIE8);\n}\n\nmodule.exports = null;\n","const InteractEvent = require('../InteractEvent');\nconst Interaction = require('../Interaction');\nconst extend = require('../utils/extend');\n\nconst modifiers = {\n names: [],\n\n setOffsets: function (arg) {\n const { interaction, pageCoords: page } = arg;\n const { target, element, startOffset } = interaction;\n const rect = target.getRect(element);\n\n if (rect) {\n startOffset.left = page.x - rect.left;\n startOffset.top = page.y - rect.top;\n\n startOffset.right = rect.right - page.x;\n startOffset.bottom = rect.bottom - page.y;\n\n if (!('width' in rect)) { rect.width = rect.right - rect.left; }\n if (!('height' in rect)) { rect.height = rect.bottom - rect.top ; }\n }\n else {\n startOffset.left = startOffset.top = startOffset.right = startOffset.bottom = 0;\n }\n\n arg.rect = rect;\n arg.interactable = target;\n arg.element = element;\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n\n arg.options = target.options[interaction.prepared.name][modifierName];\n\n if (!arg.options) {\n continue;\n }\n\n interaction.modifierOffsets[modifierName] = modifiers[modifierName].setOffset(arg);\n }\n },\n\n setAll: function (arg) {\n const { interaction, statuses, preEnd, requireEndOnly } = arg;\n const coords = extend({}, arg.pageCoords);\n const result = {\n dx: 0,\n dy: 0,\n changed: false,\n locked: false,\n shouldMove: true,\n };\n\n for (const modifierName of modifiers.names) {\n const modifier = modifiers[modifierName];\n const options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!shouldDo(options, preEnd, requireEndOnly)) { continue; }\n\n arg.status = arg.status = statuses[modifierName];\n arg.options = options;\n arg.offset = arg.interaction.modifierOffsets[modifierName];\n\n modifier.set(arg);\n\n if (arg.status.locked) {\n coords.x += arg.status.dx;\n coords.y += arg.status.dy;\n\n result.dx += arg.status.dx;\n result.dy += arg.status.dy;\n\n result.locked = true;\n }\n }\n\n // a move should be fired if:\n // - there are no modifiers enabled,\n // - no modifiers are \"locked\" i.e. have changed the pointer's coordinates, or\n // - the locked coords have changed since the last pointer move\n result.shouldMove = !arg.status || !result.locked || arg.status.changed;\n\n return result;\n },\n\n resetStatuses: function (statuses) {\n for (const modifierName of modifiers.names) {\n const status = statuses[modifierName] || {};\n\n status.dx = status.dy = 0;\n status.modifiedX = status.modifiedY = NaN;\n status.locked = false;\n status.changed = true;\n\n statuses[modifierName] = status;\n }\n\n return statuses;\n },\n\n start: function ({ interaction }, signalName) {\n const arg = {\n interaction,\n pageCoords: (signalName === 'action-resume' ?\n interaction.curCoords : interaction.startCoords).page,\n startOffset: interaction.startOffset,\n statuses: interaction.modifierStatuses,\n preEnd: false,\n requireEndOnly: false,\n };\n\n modifiers.setOffsets(arg);\n modifiers.resetStatuses(arg.statuses);\n\n arg.pageCoords = extend({}, interaction.startCoords.page);\n interaction.modifierResult = modifiers.setAll(arg);\n },\n};\n\nInteraction.signals.on('new', function (interaction) {\n interaction.startOffset = { left: 0, right: 0, top: 0, bottom: 0 };\n interaction.modifierOffsets = {};\n interaction.modifierStatuses = modifiers.resetStatuses({});\n interaction.modifierResult = null;\n});\n\nInteraction.signals.on('action-start' , modifiers.start);\nInteraction.signals.on('action-resume', modifiers.start);\n\nInteraction.signals.on('before-action-move', function ({ interaction, preEnd, interactingBeforeMove }) {\n const modifierResult = modifiers.setAll({\n interaction,\n preEnd,\n pageCoords: interaction.curCoords.page,\n statuses: interaction.modifierStatuses,\n requireEndOnly: false,\n });\n\n // don't fire an action move if a modifier would keep the event in the same\n // cordinates as before\n if (!modifierResult.shouldMove && interactingBeforeMove) {\n interaction._dontFireMove = true;\n }\n\n interaction.modifierResult = modifierResult;\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n for (let i = 0; i < modifiers.names.length; i++) {\n const options = interaction.target.options[interaction.prepared.name][modifiers.names[i]];\n\n // if the endOnly option is true for any modifier\n if (shouldDo(options, true, true)) {\n // fire a move event at the modified coordinates\n interaction.doMove({ event, preEnd: true });\n break;\n }\n }\n});\n\nInteractEvent.signals.on('set-xy', function (arg) {\n const { iEvent, interaction } = arg;\n const modifierArg = extend({}, arg);\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n modifierArg.options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!modifierArg.options) {\n continue;\n }\n\n const modifier = modifiers[modifierName];\n\n modifierArg.status = interaction.modifierStatuses[modifierName];\n\n iEvent[modifierName] = modifier.modifyCoords(modifierArg);\n }\n});\n\nfunction shouldDo (options, preEnd, requireEndOnly) {\n return (options && options.enabled\n && (preEnd || !options.endOnly)\n && (!requireEndOnly || options.endOnly));\n}\n\nmodule.exports = modifiers;\n","const modifiers = require('./index');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst restrict = {\n defaults: {\n enabled : false,\n endOnly : false,\n restriction: null,\n elementRect: null,\n },\n\n setOffset: function ({ rect, startOffset, options }) {\n const elementRect = options && options.elementRect;\n const offset = {};\n\n if (rect && elementRect) {\n offset.left = startOffset.left - (rect.width * elementRect.left);\n offset.top = startOffset.top - (rect.height * elementRect.top);\n\n offset.right = startOffset.right - (rect.width * (1 - elementRect.right));\n offset.bottom = startOffset.bottom - (rect.height * (1 - elementRect.bottom));\n }\n else {\n offset.left = offset.top = offset.right = offset.bottom = 0;\n }\n\n return offset;\n },\n\n set: function ({ pageCoords, interaction, status, options }) {\n if (!options) { return status; }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n\n const restriction = getRestrictionRect(options.restriction, interaction, page);\n\n if (!restriction) { return status; }\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n const rect = restriction;\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n const offset = interaction.modifierOffsets.restrict;\n\n // object is assumed to have\n // x, y, width, height or\n // left, top, right, bottom\n if ('x' in restriction && 'y' in restriction) {\n modifiedX = Math.max(Math.min(rect.x + rect.width - offset.right , page.x), rect.x + offset.left);\n modifiedY = Math.max(Math.min(rect.y + rect.height - offset.bottom, page.y), rect.y + offset.top );\n }\n else {\n modifiedX = Math.max(Math.min(rect.right - offset.right , page.x), rect.left + offset.left);\n modifiedY = Math.max(Math.min(rect.bottom - offset.bottom, page.y), rect.top + offset.top );\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const elementRect = options && options.elementRect;\n\n if (options && options.enabled\n && !(phase === 'start' && elementRect && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n getRestrictionRect,\n};\n\nfunction getRestrictionRect (value, interaction, page) {\n if (utils.is.function(value)) {\n return utils.resolveRectLike(value, interaction.target, interaction.element, [page.x, page.y, interaction]);\n } else {\n return utils.resolveRectLike(value, interaction.target, interaction.element);\n }\n}\n\nmodifiers.restrict = restrict;\nmodifiers.names.push('restrict');\n\ndefaultOptions.perAction.restrict = restrict.defaults;\n\nmodule.exports = restrict;\n","// This module adds the options.resize.restrictEdges setting which sets min and\n// max for the top, left, bottom and right edges of the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictEdges: {\n// inner: { top: 200, left: 200, right: 400, bottom: 400 },\n// outer: { top: 0, left: 0, right: 600, bottom: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst { getRestrictionRect } = require('./restrict');\n\nconst noInner = { top: +Infinity, left: +Infinity, bottom: -Infinity, right: -Infinity };\nconst noOuter = { top: -Infinity, left: -Infinity, bottom: +Infinity, right: +Infinity };\n\nconst restrictEdges = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n offset: null,\n },\n\n setOffset: function ({ interaction, startOffset, options }) {\n if (!options) {\n return utils.extend({}, startOffset);\n }\n\n const offset = getRestrictionRect(options.offset, interaction, interaction.startCoords.page);\n\n if (offset) {\n return {\n top: startOffset.top + offset.y,\n left: startOffset.left + offset.x,\n bottom: startOffset.bottom + offset.y,\n right: startOffset.right + offset.x,\n };\n }\n\n return startOffset;\n },\n\n set: function ({ pageCoords, interaction, status, offset, options }) {\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n const inner = rectUtils.xywhToTlbr(getRestrictionRect(options.inner, interaction, page)) || noInner;\n const outer = rectUtils.xywhToTlbr(getRestrictionRect(options.outer, interaction, page)) || noOuter;\n\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n if (edges.top) {\n modifiedY = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top);\n }\n else if (edges.bottom) {\n modifiedY = Math.max(Math.min(outer.bottom - offset.bottom, page.y), inner.bottom - offset.bottom);\n }\n if (edges.left) {\n modifiedX = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left);\n }\n else if (edges.right) {\n modifiedX = Math.max(Math.min(outer.right - offset.right, page.x), inner.right - offset.right);\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n if (options && options.enabled\n && !(phase === 'start' && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n noInner,\n noOuter,\n getRestrictionRect,\n};\n\nmodifiers.restrictEdges = restrictEdges;\nmodifiers.names.push('restrictEdges');\n\ndefaultOptions.perAction.restrictEdges = restrictEdges.defaults;\nresize.defaults.restrictEdges = restrictEdges.defaults;\n\nmodule.exports = restrictEdges;\n","// This module adds the options.resize.restrictSize setting which sets min and\n// max width and height for the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictSize: {\n// min: { width: -600, height: -600 },\n// max: { width: 600, height: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst restrictEdges = require('./restrictEdges');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst noMin = { width: -Infinity, height: -Infinity };\nconst noMax = { width: +Infinity, height: +Infinity };\n\nconst restrictSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n },\n\n setOffset: function ({ interaction }) {\n return interaction.startOffset;\n },\n\n set: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const rect = rectUtils.xywhToTlbr(interaction.resizeRects.inverted);\n\n const minSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.min, interaction)) || noMin;\n const maxSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.max, interaction)) || noMax;\n\n arg.options = {\n enabled: options.enabled,\n endOnly: options.endOnly,\n inner: utils.extend({}, restrictEdges.noInner),\n outer: utils.extend({}, restrictEdges.noOuter),\n };\n\n if (edges.top) {\n arg.options.inner.top = rect.bottom - minSize.height;\n arg.options.outer.top = rect.bottom - maxSize.height;\n }\n else if (edges.bottom) {\n arg.options.inner.bottom = rect.top + minSize.height;\n arg.options.outer.bottom = rect.top + maxSize.height;\n }\n if (edges.left) {\n arg.options.inner.left = rect.right - minSize.width;\n arg.options.outer.left = rect.right - maxSize.width;\n }\n else if (edges.right) {\n arg.options.inner.right = rect.left + minSize.width;\n arg.options.outer.right = rect.left + maxSize.width;\n }\n\n restrictEdges.set(arg);\n },\n\n modifyCoords: restrictEdges.modifyCoords,\n};\n\nmodifiers.restrictSize = restrictSize;\nmodifiers.names.push('restrictSize');\n\ndefaultOptions.perAction.restrictSize = restrictSize.defaults;\nresize.defaults.restrictSize = restrictSize.defaults;\n\nmodule.exports = restrictSize;\n","const modifiers = require('./index');\nconst interact = require('../interact');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst snap = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n\n relativePoints: null,\n },\n\n setOffset: function ({ interaction, interactable, element, rect, startOffset, options }) {\n const offsets = [];\n const optionsOrigin = utils.rectToXY(utils.resolveRectLike(options.origin));\n const origin = optionsOrigin || utils.getOriginXY(interactable, element, interaction.prepared.name);\n options = options || interactable.options[interaction.prepared.name].snap || {};\n\n let snapOffset;\n\n if (options.offset === 'startCoords') {\n snapOffset = {\n x: interaction.startCoords.page.x - origin.x,\n y: interaction.startCoords.page.y - origin.y,\n };\n }\n else {\n const offsetRect = utils.resolveRectLike(options.offset, interactable, element, [interaction]);\n\n snapOffset = utils.rectToXY(offsetRect) || { x: 0, y: 0 };\n }\n\n if (rect && options.relativePoints && options.relativePoints.length) {\n for (const { x: relativeX, y: relativeY } of options.relativePoints) {\n offsets.push({\n x: startOffset.left - (rect.width * relativeX) + snapOffset.x,\n y: startOffset.top - (rect.height * relativeY) + snapOffset.y,\n });\n }\n }\n else {\n offsets.push(snapOffset);\n }\n\n return offsets;\n },\n\n set: function ({ interaction, pageCoords, status, options, offset: offsets }) {\n const targets = [];\n let target;\n let page;\n let i;\n\n if (status.useStatusXY) {\n page = { x: status.x, y: status.y };\n }\n else {\n const origin = utils.getOriginXY(interaction.target, interaction.element, interaction.prepared.name);\n\n page = utils.extend({}, pageCoords);\n\n page.x -= origin.x;\n page.y -= origin.y;\n }\n\n status.realX = page.x;\n status.realY = page.y;\n\n let len = options.targets? options.targets.length : 0;\n\n for (const { x: offsetX, y: offsetY } of offsets) {\n const relativeX = page.x - offsetX;\n const relativeY = page.y - offsetY;\n\n for (const snapTarget of options.targets) {\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n targets.push({\n x: utils.is.number(target.x) ? (target.x + offsetX) : relativeX,\n y: utils.is.number(target.y) ? (target.y + offsetY) : relativeY,\n\n range: utils.is.number(target.range)? target.range: options.range,\n });\n }\n }\n\n const closest = {\n target: null,\n inRange: false,\n distance: 0,\n range: 0,\n dx: 0,\n dy: 0,\n };\n\n for (i = 0, len = targets.length; i < len; i++) {\n target = targets[i];\n\n const range = target.range;\n const dx = target.x - page.x;\n const dy = target.y - page.y;\n const distance = utils.hypot(dx, dy);\n let inRange = distance <= range;\n\n // Infinite targets count as being out of range\n // compared to non infinite ones that are in range\n if (range === Infinity && closest.inRange && closest.range !== Infinity) {\n inRange = false;\n }\n\n if (!closest.target || (inRange\n // is the closest target in range?\n ? (closest.inRange && range !== Infinity\n // the pointer is relatively deeper in this target\n ? distance / range < closest.distance / closest.range\n // this target has Infinite range and the closest doesn't\n : (range === Infinity && closest.range !== Infinity)\n // OR this target is closer that the previous closest\n || distance < closest.distance)\n // The other is not in range and the pointer is closer to this target\n : (!closest.inRange && distance < closest.distance))) {\n\n closest.target = target;\n closest.distance = distance;\n closest.range = range;\n closest.inRange = inRange;\n closest.dx = dx;\n closest.dy = dy;\n\n status.range = range;\n }\n }\n\n let snapChanged;\n\n if (closest.target) {\n snapChanged = (status.modifiedX !== closest.target.x || status.modifiedY !== closest.target.y);\n\n status.modifiedX = closest.target.x;\n status.modifiedY = closest.target.y;\n }\n else {\n snapChanged = true;\n\n status.modifiedX = NaN;\n status.modifiedY = NaN;\n }\n\n status.dx = closest.dx;\n status.dy = closest.dy;\n\n status.changed = (snapChanged || (closest.inRange && !status.locked));\n status.locked = closest.inRange;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const relativePoints = options && options.relativePoints;\n\n if (options && options.enabled\n && !(phase === 'start' && relativePoints && relativePoints.length)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n }\n\n return {\n range : status.range,\n locked : status.locked,\n x : status.modifiedX,\n y : status.modifiedY,\n realX : status.realX,\n realY : status.realY,\n dx : status.dx,\n dy : status.dy,\n };\n }\n },\n};\n\ninteract.createSnapGrid = function (grid) {\n return function (x, y) {\n const limits = grid.limits || {\n left : -Infinity,\n right : Infinity,\n top : -Infinity,\n bottom: Infinity,\n };\n let offsetX = 0;\n let offsetY = 0;\n\n if (utils.is.object(grid.offset)) {\n offsetX = grid.offset.x;\n offsetY = grid.offset.y;\n }\n\n const gridx = Math.round((x - offsetX) / grid.x);\n const gridy = Math.round((y - offsetY) / grid.y);\n\n const newX = Math.max(limits.left, Math.min(limits.right , gridx * grid.x + offsetX));\n const newY = Math.max(limits.top , Math.min(limits.bottom, gridy * grid.y + offsetY));\n\n return {\n x: newX,\n y: newY,\n range: grid.range,\n };\n };\n};\n\nmodifiers.snap = snap;\nmodifiers.names.push('snap');\n\ndefaultOptions.perAction.snap = snap.defaults;\n\nmodule.exports = snap;\n","// This module allows snapping of the size of targets during resize\n// interactions.\n\nconst modifiers = require('./index');\nconst snap = require('./snap');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\nconst utils = require('../utils/');\n\nconst snapSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n },\n\n setOffset: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.edges;\n\n if (!edges) { return; }\n\n arg.options = {\n relativePoints: [{\n x: edges.left? 0 : 1,\n y: edges.top ? 0 : 1,\n }],\n origin: { x: 0, y: 0 },\n offset: 'self',\n range: options.range,\n };\n\n const offsets = snap.setOffset(arg);\n arg.options = options;\n\n return offsets;\n },\n\n set: function (arg) {\n const { interaction, options, offset, pageCoords } = arg;\n const page = utils.extend({}, pageCoords);\n const relativeX = page.x - offset[0].x;\n const relativeY = page.y - offset[0].y;\n\n arg.options = utils.extend({}, options);\n arg.options.targets = [];\n\n for (const snapTarget of options.targets) {\n let target;\n\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n if ('width' in target && 'height' in target) {\n target.x = target.width;\n target.y = target.height;\n }\n\n arg.options.targets.push(target);\n }\n\n snap.set(arg);\n },\n\n modifyCoords: function (arg) {\n const { options } = arg;\n\n arg.options = utils.extend({}, options);\n arg.options.enabled = options.enabled;\n arg.options.relativePoints = [null];\n\n snap.modifyCoords(arg);\n },\n};\n\nmodifiers.snapSize = snapSize;\nmodifiers.names.push('snapSize');\n\ndefaultOptions.perAction.snapSize = snapSize.defaults;\nresize.defaults.snapSize = snapSize.defaults;\n\nmodule.exports = snapSize;\n","const pointerUtils = require('../utils/pointerUtils');\n\nmodule.exports = class PointerEvent {\n constructor (type, pointer, event, eventTarget, interaction) {\n pointerUtils.pointerExtend(this, event);\n\n if (event !== pointer) {\n pointerUtils.pointerExtend(this, pointer);\n }\n\n this.interaction = interaction;\n\n this.timeStamp = new Date().getTime();\n this.originalEvent = event;\n this.type = type;\n this.pointerId = pointerUtils.getPointerId(pointer);\n this.pointerType = pointerUtils.getPointerType(pointer);\n this.target = eventTarget;\n this.currentTarget = null;\n\n if (type === 'tap') {\n const pointerIndex = interaction.getPointerIndex(pointer);\n this.dt = this.timeStamp - interaction.downTimes[pointerIndex];\n\n const interval = this.timeStamp - interaction.tapTime;\n\n this.double = !!(interaction.prevTap\n && interaction.prevTap.type !== 'doubletap'\n && interaction.prevTap.target === this.target\n && interval < 500);\n }\n else if (type === 'doubletap') {\n this.dt = pointer.timeStamp - interaction.tapTime;\n }\n }\n\n subtractOrigin ({ x: originX, y: originY }) {\n this.pageX -= originX;\n this.pageY -= originY;\n this.clientX -= originX;\n this.clientY -= originY;\n\n return this;\n }\n\n addOrigin ({ x: originX, y: originY }) {\n this.pageX += originX;\n this.pageY += originY;\n this.clientX += originX;\n this.clientY += originY;\n\n return this;\n }\n\n preventDefault () {\n this.originalEvent.preventDefault();\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n};\n","const PointerEvent = require('./PointerEvent');\nconst Interaction = require('../Interaction');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst defaults = require('../defaultOptions');\nconst signals = require('../utils/Signals').new();\nconst { filter } = require('../utils/arr');\n\nconst simpleSignals = [ 'down', 'up', 'cancel' ];\nconst simpleEvents = [ 'down', 'up', 'cancel' ];\n\nconst pointerEvents = {\n PointerEvent,\n fire,\n collectEventTargets,\n signals,\n defaults: {\n holdDuration: 600,\n ignoreFrom : null,\n allowFrom : null,\n origin : { x: 0, y: 0 },\n },\n types: [\n 'down',\n 'move',\n 'up',\n 'cancel',\n 'tap',\n 'doubletap',\n 'hold',\n ],\n};\n\nfunction fire (arg) {\n const {\n interaction, pointer, event, eventTarget,\n type = arg.pointerEvent.type,\n targets = collectEventTargets(arg),\n pointerEvent = new PointerEvent(type, pointer, event, eventTarget, interaction),\n } = arg;\n\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n targets,\n type,\n pointerEvent,\n };\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n\n for (const prop in target.props || {}) {\n pointerEvent[prop] = target.props[prop];\n }\n\n const origin = utils.getOriginXY(target.eventable, target.element);\n\n pointerEvent.subtractOrigin(origin);\n pointerEvent.eventable = target.eventable;\n pointerEvent.currentTarget = target.element;\n\n target.eventable.fire(pointerEvent);\n\n pointerEvent.addOrigin(origin);\n\n if (pointerEvent.immediatePropagationStopped\n || (pointerEvent.propagationStopped\n && (i + 1) < targets.length && targets[i + 1].element !== pointerEvent.currentTarget)) {\n break;\n }\n }\n\n signals.fire('fired', signalArg);\n\n if (type === 'tap') {\n // if pointerEvent should make a double tap, create and fire a doubletap\n // PointerEvent and use that as the prevTap\n const prevTap = pointerEvent.double\n ? fire({\n interaction, pointer, event, eventTarget,\n type: 'doubletap',\n })\n : pointerEvent;\n\n interaction.prevTap = prevTap;\n interaction.tapTime = prevTap.timeStamp;\n }\n\n return pointerEvent;\n}\n\nfunction collectEventTargets ({ interaction, pointer, event, eventTarget, type }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n // do not fire a tap event if the pointer was moved before being lifted\n if (type === 'tap' && (interaction.pointerWasMoved\n // or if the pointerup target is different to the pointerdown target\n || !(interaction.downTargets[pointerIndex] && interaction.downTargets[pointerIndex] === eventTarget))) {\n return [];\n }\n\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n path,\n targets: [],\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (type === 'hold') {\n signalArg.targets = filter(signalArg.targets, target =>\n target.eventable.options.holdDuration === interaction.holdTimers[pointerIndex].duration);\n }\n\n return signalArg.targets;\n}\n\nInteraction.signals.on('update-pointer-down', function ({ interaction, pointerIndex }) {\n interaction.holdTimers[pointerIndex] = { duration: Infinity, timeout: null };\n});\n\nInteraction.signals.on('remove-pointer', function ({ interaction, pointerIndex }) {\n interaction.holdTimers.splice(pointerIndex, 1);\n});\n\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget, duplicateMove }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n if (!duplicateMove && (!interaction.pointerIsDown || interaction.pointerWasMoved)) {\n if (interaction.pointerIsDown) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n\n fire({\n interaction, pointer, event, eventTarget,\n type: 'move',\n });\n }\n});\n\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget, pointerIndex }) {\n // copy event to be used in timeout for IE8\n const eventCopy = browser.isIE8? utils.extend({}, event) : event;\n\n const timer = interaction.holdTimers[pointerIndex];\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'hold',\n targets: [],\n path,\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (!signalArg.targets.length) { return; }\n\n let minDuration = Infinity;\n\n for (let i = 0; i < signalArg.targets.length; i++) {\n const target = signalArg.targets[i];\n const holdDuration = target.eventable.options.holdDuration;\n\n if (holdDuration < minDuration) {\n minDuration = holdDuration;\n }\n }\n\n timer.duration = minDuration;\n timer.timeout = setTimeout(function () {\n fire({\n interaction,\n eventTarget,\n pointer: browser.isIE8? eventCopy : pointer,\n event: eventCopy,\n type: 'hold',\n });\n }, minDuration);\n});\n\nInteraction.signals.on('up', ({ interaction, pointer, event, eventTarget }) => {\n if (!interaction.pointerWasMoved) {\n fire({ interaction, eventTarget, pointer, event, type: 'tap' });\n }\n});\n\n['up', 'cancel'].forEach(function (signalName) {\n Interaction.signals.on(signalName, function ({ interaction, pointerIndex }) {\n if (interaction.holdTimers[pointerIndex]) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n });\n});\n\nfunction createSignalListener (type) {\n return function ({ interaction, pointer, event, eventTarget }) {\n fire({ interaction, eventTarget, pointer, event, type });\n };\n}\n\nfor (let i = 0; i < simpleSignals.length; i++) {\n Interaction.signals.on(simpleSignals[i], createSignalListener(simpleEvents[i]));\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.prevTap = null; // the most recent tap event on this interaction\n interaction.tapTime = 0; // time of the most recent tap event\n interaction.holdTimers = []; // [{ duration, timeout }]\n});\n\ndefaults.pointerEvents = pointerEvents.defaults;\nmodule.exports = pointerEvents;\n","const pointerEvents = require('./base');\nconst Interaction = require('../Interaction');\n\npointerEvents.signals.on('new', onNew);\npointerEvents.signals.on('fired', onFired);\n\nfor (const signal of ['move', 'up', 'cancel', 'endall']) {\n Interaction.signals.on(signal, endHoldRepeat);\n}\n\nfunction onNew ({ pointerEvent }) {\n if (pointerEvent.type !== 'hold') { return; }\n\n pointerEvent.count = (pointerEvent.count || 0) + 1;\n}\n\nfunction onFired ({ interaction, pointerEvent, eventTarget, targets }) {\n if (pointerEvent.type !== 'hold' || !targets.length) { return; }\n\n // get the repeat interval from the first eventable\n const interval = targets[0].eventable.options.holdRepeatInterval;\n\n // don't repeat if the interval is 0 or less\n if (interval <= 0) { return; }\n\n // set a timeout to fire the holdrepeat event\n interaction.holdIntervalHandle = setTimeout(function () {\n pointerEvents.fire({\n interaction,\n eventTarget,\n type: 'hold',\n pointer: pointerEvent,\n event: pointerEvent,\n });\n }, interval);\n}\n\nfunction endHoldRepeat ({ interaction }) {\n // set the interaction's holdStopTime property\n // to stop further holdRepeat events\n if (interaction.holdIntervalHandle) {\n clearInterval(interaction.holdIntervalHandle);\n interaction.holdIntervalHandle = null;\n }\n}\n\n// don't repeat by default\npointerEvents.defaults.holdRepeatInterval = 0;\npointerEvents.types.push('holdrepeat');\n\nmodule.exports = {\n onNew,\n onFired,\n endHoldRepeat,\n};\n","const pointerEvents = require('./base');\nconst Interactable = require('../Interactable');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\nconst scope = require('../scope');\nconst extend = require('../utils/extend');\nconst { merge } = require('../utils/arr');\n\npointerEvents.signals.on('collect-targets', function ({ targets, element, type, eventTarget }) {\n function collectSelectors (interactable, selector, context) {\n const els = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && is.element(element)\n && domUtils.matchesSelector(element, selector, els)\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n const interactable = scope.interactables.get(element);\n\n if (interactable) {\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n scope.interactables.forEachSelector(collectSelectors, element);\n});\n\nInteractable.signals.on('new', function ({ interactable }) {\n interactable.events.getRect = function (element) {\n return interactable.getRect(element);\n };\n});\n\nInteractable.signals.on('set', function ({ interactable, options }) {\n extend(interactable.events.options, pointerEvents.defaults);\n extend(interactable.events.options, options);\n});\n\nmerge(Interactable.eventTypes, pointerEvents.types);\n\nInteractable.prototype.pointerEvents = function (options) {\n extend(this.events.options, options);\n\n return this;\n};\n\nconst __backCompatOption = Interactable.prototype._backCompatOption;\n\nInteractable.prototype._backCompatOption = function (optionName, newValue) {\n const ret = __backCompatOption.call(this, optionName, newValue);\n\n if (ret === this) {\n this.events.options[optionName] = newValue;\n }\n\n return ret;\n};\n\nInteractable.settingsMethods.push('pointerEvents');\n","const utils = require('./utils');\nconst events = require('./utils/events');\nconst signals = require('./utils/Signals').new();\n\nconst scope = {\n signals,\n events,\n utils,\n\n // main document\n document: require('./utils/domObjects').document,\n // all documents being listened to\n documents: [],\n\n addDocument: function (doc, win) {\n // do nothing if document is already known\n if (utils.contains(scope.documents, doc)) { return false; }\n\n win = win || scope.getWindow(doc);\n\n scope.documents.push(doc);\n events.documents.push(doc);\n\n // don't add an unload event for the main document\n // so that the page may be cached in browser history\n if (doc !== scope.document) {\n events.add(win, 'unload', scope.onWindowUnload);\n }\n\n signals.fire('add-document', { doc, win });\n },\n\n removeDocument: function (doc, win) {\n const index = utils.indexOf(scope.documents, doc);\n\n win = win || scope.getWindow(doc);\n\n events.remove(win, 'unload', scope.onWindowUnload);\n\n scope.documents.splice(index, 1);\n events.documents.splice(index, 1);\n\n signals.fire('remove-document', { win, doc });\n },\n\n onWindowUnload: function () {\n scope.removeDocument(this.document, this);\n },\n};\n\nmodule.exports = scope;\n","const { indexOf } = require('./arr');\n\nclass Signals {\n constructor () {\n this.listeners = {\n // signalName: [listeners],\n };\n }\n\n on (name, listener) {\n if (!this.listeners[name]) {\n this.listeners[name] = [listener];\n return;\n }\n\n this.listeners[name].push(listener);\n }\n\n off (name, listener) {\n if (!this.listeners[name]) { return; }\n\n const index = indexOf(this.listeners[name], listener);\n\n if (index !== -1) {\n this.listeners[name].splice(index, 1);\n }\n }\n\n fire (name, arg) {\n const targetListeners = this.listeners[name];\n\n if (!targetListeners) { return; }\n\n for (let i = 0; i < targetListeners.length; i++) {\n if (targetListeners[i](arg, name) === false) {\n return;\n }\n }\n }\n}\n\nSignals.new = function () {\n return new Signals();\n};\n\nmodule.exports = Signals;\n","function indexOf (array, target) {\n for (let i = 0, len = array.length; i < len; i++) {\n if (array[i] === target) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction contains (array, target) {\n return indexOf(array, target) !== -1;\n}\n\nfunction merge (target, source) {\n for (let i = 0; i < source.length; i++) {\n target.push(source[i]);\n }\n\n return target;\n}\n\nfunction filter (array, test) {\n const result = [];\n\n for (let i = 0; i < array.length; i++) {\n if (test(array[i])) {\n result.push(array[i]);\n }\n }\n\n return result;\n}\n\nmodule.exports = {\n indexOf,\n contains,\n merge,\n filter,\n};\n","const { window } = require('./window');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst Element = domObjects.Element;\nconst navigator = window.navigator;\n\nconst browser = {\n // Does the browser support touch input?\n supportsTouch: !!(('ontouchstart' in window) || is.function(window.DocumentTouch)\n && domObjects.document instanceof window.DocumentTouch),\n\n // Does the browser support PointerEvents\n supportsPointerEvent: !!domObjects.PointerEvent,\n\n isIE8: ('attachEvent' in window) && !('addEventListener' in window),\n\n // Opera Mobile must be handled differently\n isOperaMobile: (navigator.appName === 'Opera'\n && browser.supportsTouch\n && navigator.userAgent.match('Presto')),\n\n // scrolling doesn't change the result of getClientRects on iOS 7\n isIOS7: (/iP(hone|od|ad)/.test(navigator.platform)\n && /OS 7[^\\d]/.test(navigator.appVersion)),\n\n isIe9OrOlder: /MSIE (8|9)/.test(navigator.userAgent),\n\n // prefix matchesSelector\n prefixedMatchesSelector: 'matches' in Element.prototype\n ? 'matches': 'webkitMatchesSelector' in Element.prototype\n ? 'webkitMatchesSelector': 'mozMatchesSelector' in Element.prototype\n ? 'mozMatchesSelector': 'oMatchesSelector' in Element.prototype\n ? 'oMatchesSelector': 'msMatchesSelector',\n\n useMatchesSelectorPolyfill: false,\n\n pEventTypes: (domObjects.PointerEvent\n ? (domObjects.PointerEvent === window.MSPointerEvent\n ? {\n up: 'MSPointerUp',\n down: 'MSPointerDown',\n over: 'mouseover',\n out: 'mouseout',\n move: 'MSPointerMove',\n cancel: 'MSPointerCancel',\n }\n : {\n up: 'pointerup',\n down: 'pointerdown',\n over: 'pointerover',\n out: 'pointerout',\n move: 'pointermove',\n cancel: 'pointercancel',\n })\n : null),\n\n // because Webkit and Opera still use 'mousewheel' event type\n wheelEvent: 'onmousewheel' in domObjects.document? 'mousewheel': 'wheel',\n\n};\n\nbrowser.useMatchesSelectorPolyfill = !is.function(Element.prototype[browser.prefixedMatchesSelector]);\n\nmodule.exports = browser;\n","const domObjects = {};\nconst win = require('./window').window;\n\nfunction blank () {}\n\ndomObjects.document = win.document;\ndomObjects.DocumentFragment = win.DocumentFragment || blank;\ndomObjects.SVGElement = win.SVGElement || blank;\ndomObjects.SVGSVGElement = win.SVGSVGElement || blank;\ndomObjects.SVGElementInstance = win.SVGElementInstance || blank;\ndomObjects.Element = win.Element || blank;\ndomObjects.HTMLElement = win.HTMLElement || domObjects.Element;\n\ndomObjects.Event = win.Event;\ndomObjects.Touch = win.Touch || blank;\ndomObjects.PointerEvent = (win.PointerEvent || win.MSPointerEvent);\n\nmodule.exports = domObjects;\n","const win = require('./window');\nconst browser = require('./browser');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst domUtils = {\n nodeContains: function (parent, child) {\n while (child) {\n if (child === parent) {\n return true;\n }\n\n child = child.parentNode;\n }\n\n return false;\n },\n\n closest: function (element, selector) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) { return element; }\n\n element = domUtils.parentNode(element);\n }\n\n return null;\n },\n\n parentNode: function (node) {\n let parent = node.parentNode;\n\n if (is.docFrag(parent)) {\n // skip past #shado-root fragments\n while ((parent = parent.host) && is.docFrag(parent)) {\n continue;\n }\n\n return parent;\n }\n\n return parent;\n },\n\n // taken from http://tanalin.com/en/blog/2012/12/matches-selector-ie8/ and modified\n matchesSelectorPolyfill: browser.useMatchesSelectorPolyfill\n ? function (element, selector, elems) {\n elems = elems || element.parentNode.querySelectorAll(selector);\n\n for (let i = 0, len = elems.length; i < len; i++) {\n if (elems[i] === element) {\n return true;\n }\n }\n\n return false;\n }\n : null,\n\n matchesSelector: function (element, selector, nodeList) {\n if (browser.useMatchesSelectorPolyfill) {\n return domUtils.matchesSelectorPolyfill(element, selector, nodeList);\n }\n\n // remove /deep/ from selectors if shadowDOM polyfill is used\n if (win.window !== win.realWindow) {\n selector = selector.replace(/\\/deep\\//g, ' ');\n }\n\n return element[browser.prefixedMatchesSelector](selector);\n },\n\n // Test for the element that's \"above\" all other qualifiers\n indexOfDeepestElement: function (elements) {\n let deepestZoneParents = [];\n let dropzoneParents = [];\n let dropzone;\n let deepestZone = elements[0];\n let index = deepestZone? 0: -1;\n let parent;\n let child;\n let i;\n let n;\n\n for (i = 1; i < elements.length; i++) {\n dropzone = elements[i];\n\n // an element might belong to multiple selector dropzones\n if (!dropzone || dropzone === deepestZone) {\n continue;\n }\n\n if (!deepestZone) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n // check if the deepest or current are document.documentElement or document.rootElement\n // - if the current dropzone is, do nothing and continue\n if (dropzone.parentNode === dropzone.ownerDocument) {\n continue;\n }\n // - if deepest is, update with the current dropzone and continue to next\n else if (deepestZone.parentNode === dropzone.ownerDocument) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n if (!deepestZoneParents.length) {\n parent = deepestZone;\n while (parent.parentNode && parent.parentNode !== parent.ownerDocument) {\n deepestZoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n }\n\n // if this element is an svg element and the current deepest is\n // an HTMLElement\n if (deepestZone instanceof domObjects.HTMLElement\n && dropzone instanceof domObjects.SVGElement\n && !(dropzone instanceof domObjects.SVGSVGElement)) {\n\n if (dropzone === deepestZone.parentNode) {\n continue;\n }\n\n parent = dropzone.ownerSVGElement;\n }\n else {\n parent = dropzone;\n }\n\n dropzoneParents = [];\n\n while (parent.parentNode !== parent.ownerDocument) {\n dropzoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n\n n = 0;\n\n // get (position of last common ancestor) + 1\n while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) {\n n++;\n }\n\n const parents = [\n dropzoneParents[n - 1],\n dropzoneParents[n],\n deepestZoneParents[n],\n ];\n\n child = parents[0].lastChild;\n\n while (child) {\n if (child === parents[1]) {\n deepestZone = dropzone;\n index = i;\n deepestZoneParents = [];\n\n break;\n }\n else if (child === parents[2]) {\n break;\n }\n\n child = child.previousSibling;\n }\n }\n\n return index;\n },\n\n matchesUpTo: function (element, selector, limit) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) {\n return true;\n }\n\n element = domUtils.parentNode(element);\n\n if (element === limit) {\n return domUtils.matchesSelector(element, selector);\n }\n }\n\n return false;\n },\n\n getActualElement: function (element) {\n return (element instanceof domObjects.SVGElementInstance\n ? element.correspondingUseElement\n : element);\n },\n\n getScrollXY: function (relevantWindow) {\n relevantWindow = relevantWindow || win.window;\n return {\n x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft,\n y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop,\n };\n },\n\n getElementClientRect: function (element) {\n const clientRect = (element instanceof domObjects.SVGElement\n ? element.getBoundingClientRect()\n : element.getClientRects()[0]);\n\n return clientRect && {\n left : clientRect.left,\n right : clientRect.right,\n top : clientRect.top,\n bottom: clientRect.bottom,\n width : clientRect.width || clientRect.right - clientRect.left,\n height: clientRect.height || clientRect.bottom - clientRect.top,\n };\n },\n\n getElementRect: function (element) {\n const clientRect = domUtils.getElementClientRect(element);\n\n if (!browser.isIOS7 && clientRect) {\n const scroll = domUtils.getScrollXY(win.getWindow(element));\n\n clientRect.left += scroll.x;\n clientRect.right += scroll.x;\n clientRect.top += scroll.y;\n clientRect.bottom += scroll.y;\n }\n\n return clientRect;\n },\n\n getPath: function (element) {\n const path = [];\n\n while (element) {\n path.push(element);\n element = domUtils.parentNode(element);\n }\n\n return path;\n },\n\n trySelector: value => {\n if (!is.string(value)) { return false; }\n\n // an exception will be raised if it is invalid\n domObjects.document.querySelector(value);\n return true;\n },\n};\n\nmodule.exports = domUtils;\n","const is = require('./is');\nconst domUtils = require('./domUtils');\nconst pExtend = require('./pointerExtend');\n\nconst { window, getWindow } = require('./window');\nconst { indexOf, contains } = require('./arr');\n\nconst useAttachEvent = ('attachEvent' in window) && !('addEventListener' in window);\nconst addEvent = useAttachEvent? 'attachEvent': 'addEventListener';\nconst removeEvent = useAttachEvent? 'detachEvent': 'removeEventListener';\nconst on = useAttachEvent? 'on': '';\n\nconst elements = [];\nconst targets = [];\nconst attachedListeners = [];\n\n// {\n// type: {\n// selectors: ['selector', ...],\n// contexts : [document, ...],\n// listeners: [[listener, capture, passive], ...]\n// }\n// }\nconst delegatedEvents = {};\n\nconst documents = [];\n\nconst supportsOptions = !useAttachEvent && (() => {\n let supported = false;\n\n window.document.createElement('div').addEventListener('test', null, {\n get capture () { supported = true; },\n });\n\n return supported;\n})();\n\nfunction add (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n let elementIndex = indexOf(elements, element);\n let target = targets[elementIndex];\n\n if (!target) {\n target = {\n events: {},\n typeCount: 0,\n };\n\n elementIndex = elements.push(element) - 1;\n targets.push(target);\n\n attachedListeners.push(useAttachEvent\n ? {\n supplied: [],\n wrapped : [],\n useCount: [],\n }\n : null);\n }\n\n if (!target.events[type]) {\n target.events[type] = [];\n target.typeCount++;\n }\n\n if (!contains(target.events[type], listener)) {\n let ret;\n\n if (useAttachEvent) {\n const { supplied, wrapped, useCount } = attachedListeners[elementIndex];\n const listenerIndex = indexOf(supplied, listener);\n\n const wrappedListener = wrapped[listenerIndex] || function (event) {\n if (!event.immediatePropagationStopped) {\n event.target = event.srcElement;\n event.currentTarget = element;\n\n event.preventDefault = event.preventDefault || preventDef;\n event.stopPropagation = event.stopPropagation || stopProp;\n event.stopImmediatePropagation = event.stopImmediatePropagation || stopImmProp;\n\n if (/mouse|click/.test(event.type)) {\n event.pageX = event.clientX + getWindow(element).document.documentElement.scrollLeft;\n event.pageY = event.clientY + getWindow(element).document.documentElement.scrollTop;\n }\n\n listener(event);\n }\n };\n\n ret = element[addEvent](on + type, wrappedListener, !!options.capture);\n\n if (listenerIndex === -1) {\n supplied.push(listener);\n wrapped.push(wrappedListener);\n useCount.push(1);\n }\n else {\n useCount[listenerIndex]++;\n }\n }\n else {\n ret = element[addEvent](type, listener, supportsOptions? options : !!options.capture);\n }\n target.events[type].push(listener);\n\n return ret;\n }\n}\n\nfunction remove (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const elementIndex = indexOf(elements, element);\n const target = targets[elementIndex];\n\n if (!target || !target.events) {\n return;\n }\n\n let wrappedListener = listener;\n let listeners;\n let listenerIndex;\n\n if (useAttachEvent) {\n listeners = attachedListeners[elementIndex];\n listenerIndex = indexOf(listeners.supplied, listener);\n wrappedListener = listeners.wrapped[listenerIndex];\n }\n\n if (type === 'all') {\n for (type in target.events) {\n if (target.events.hasOwnProperty(type)) {\n remove(element, type, 'all');\n }\n }\n return;\n }\n\n if (target.events[type]) {\n const len = target.events[type].length;\n\n if (listener === 'all') {\n for (let i = 0; i < len; i++) {\n remove(element, type, target.events[type][i], options);\n }\n return;\n }\n else {\n for (let i = 0; i < len; i++) {\n if (target.events[type][i] === listener) {\n element[removeEvent](on + type, wrappedListener, supportsOptions? options : !!options.capture);\n target.events[type].splice(i, 1);\n\n if (useAttachEvent && listeners) {\n listeners.useCount[listenerIndex]--;\n if (listeners.useCount[listenerIndex] === 0) {\n listeners.supplied.splice(listenerIndex, 1);\n listeners.wrapped.splice(listenerIndex, 1);\n listeners.useCount.splice(listenerIndex, 1);\n }\n }\n\n break;\n }\n }\n }\n\n if (target.events[type] && target.events[type].length === 0) {\n target.events[type] = null;\n target.typeCount--;\n }\n }\n\n if (!target.typeCount) {\n targets.splice(elementIndex, 1);\n elements.splice(elementIndex, 1);\n attachedListeners.splice(elementIndex, 1);\n }\n}\n\nfunction addDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n if (!delegatedEvents[type]) {\n delegatedEvents[type] = {\n selectors: [],\n contexts : [],\n listeners: [],\n };\n\n // add delegate listener functions\n for (let i = 0; i < documents.length; i++) {\n add(documents[i], type, delegateListener);\n add(documents[i], type, delegateUseCapture, true);\n }\n }\n\n const delegated = delegatedEvents[type];\n let index;\n\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n break;\n }\n }\n\n if (index === -1) {\n index = delegated.selectors.length;\n\n delegated.selectors.push(selector);\n delegated.contexts .push(context);\n delegated.listeners.push([]);\n }\n\n // keep listener and capture and passive flags\n delegated.listeners[index].push([listener, !!options.capture, options.passive]);\n}\n\nfunction removeDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const delegated = delegatedEvents[type];\n let matchFound = false;\n let index;\n\n if (!delegated) { return; }\n\n // count from last index of delegated to 0\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n // look for matching selector and context Node\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n\n const listeners = delegated.listeners[index];\n\n // each item of the listeners array is an array: [function, capture, passive]\n for (let i = listeners.length - 1; i >= 0; i--) {\n const [fn, capture, passive] = listeners[i];\n\n // check if the listener functions and capture and passive flags match\n if (fn === listener && capture === !!options.capture && passive === options.passive) {\n // remove the listener from the array of listeners\n listeners.splice(i, 1);\n\n // if all listeners for this interactable have been removed\n // remove the interactable from the delegated arrays\n if (!listeners.length) {\n delegated.selectors.splice(index, 1);\n delegated.contexts .splice(index, 1);\n delegated.listeners.splice(index, 1);\n\n // remove delegate function from context\n remove(context, type, delegateListener);\n remove(context, type, delegateUseCapture, true);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegatedEvents[type] = null;\n }\n }\n\n // only remove one listener\n matchFound = true;\n break;\n }\n }\n\n if (matchFound) { break; }\n }\n }\n}\n\n// bound to the interactable context when a DOM event\n// listener is added to a selector interactable\nfunction delegateListener (event, optionalArg) {\n const options = getOptions(optionalArg);\n const fakeEvent = {};\n const delegated = delegatedEvents[event.type];\n const eventTarget = (domUtils.getActualElement(event.path\n ? event.path[0]\n : event.target));\n let element = eventTarget;\n\n // duplicate the event so that currentTarget can be changed\n pExtend(fakeEvent, event);\n\n fakeEvent.originalEvent = event;\n fakeEvent.preventDefault = preventOriginalDefault;\n\n // climb up document tree looking for selector matches\n while (is.element(element)) {\n for (let i = 0; i < delegated.selectors.length; i++) {\n const selector = delegated.selectors[i];\n const context = delegated.contexts[i];\n\n if (domUtils.matchesSelector(element, selector)\n && domUtils.nodeContains(context, eventTarget)\n && domUtils.nodeContains(context, element)) {\n\n const listeners = delegated.listeners[i];\n\n fakeEvent.currentTarget = element;\n\n for (let j = 0; j < listeners.length; j++) {\n const [fn, capture, passive] = listeners[j];\n\n if (capture === !!options.capture && passive === options.passive) {\n fn(fakeEvent);\n }\n }\n }\n }\n\n element = domUtils.parentNode(element);\n }\n}\n\nfunction delegateUseCapture (event) {\n return delegateListener.call(this, event, true);\n}\n\nfunction preventDef () {\n this.returnValue = false;\n}\n\nfunction preventOriginalDefault () {\n this.originalEvent.preventDefault();\n}\n\nfunction stopProp () {\n this.cancelBubble = true;\n}\n\nfunction stopImmProp () {\n this.cancelBubble = true;\n this.immediatePropagationStopped = true;\n}\n\nfunction getOptions (param) {\n return is.object(param)? param : { capture: param };\n}\n\nmodule.exports = {\n add,\n remove,\n\n addDelegate,\n removeDelegate,\n\n delegateListener,\n delegateUseCapture,\n delegatedEvents,\n documents,\n\n useAttachEvent,\n supportsOptions,\n\n _elements: elements,\n _targets: targets,\n _attachedListeners: attachedListeners,\n};\n","module.exports = function extend (dest, source) {\n for (const prop in source) {\n dest[prop] = source[prop];\n }\n return dest;\n};\n","const {\n resolveRectLike,\n rectToXY,\n} = require('./rect');\n\nmodule.exports = function (target, element, action) {\n const actionOptions = target.options[action];\n const actionOrigin = actionOptions && actionOptions.origin;\n const origin = actionOrigin || target.options.origin;\n\n const originRect = resolveRectLike(origin, target, element, [target && element]);\n\n return rectToXY(originRect) || { x: 0, y: 0 };\n};\n","module.exports = (x, y) => Math.sqrt(x * x + y * y);\n","const extend = require('./extend');\nconst win = require('./window');\n\nconst utils = {\n warnOnce: function (method, message) {\n let warned = false;\n\n return function () {\n if (!warned) {\n win.window.console.warn(message);\n warned = true;\n }\n\n return method.apply(this, arguments);\n };\n },\n\n // http://stackoverflow.com/a/5634528/2280888\n _getQBezierValue: function (t, p1, p2, p3) {\n const iT = 1 - t;\n return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3;\n },\n\n getQuadraticCurvePoint: function (startX, startY, cpX, cpY, endX, endY, position) {\n return {\n x: utils._getQBezierValue(position, startX, cpX, endX),\n y: utils._getQBezierValue(position, startY, cpY, endY),\n };\n },\n\n // http://gizma.com/easing/\n easeOutQuad: function (t, b, c, d) {\n t /= d;\n return -c * t*(t-2) + b;\n },\n\n copyAction: function (dest, src) {\n dest.name = src.name;\n dest.axis = src.axis;\n dest.edges = src.edges;\n\n return dest;\n },\n\n is : require('./is'),\n extend : extend,\n hypot : require('./hypot'),\n getOriginXY: require('./getOriginXY'),\n};\n\nextend(utils, require('./arr'));\nextend(utils, require('./domUtils'));\nextend(utils, require('./pointerUtils'));\nextend(utils, require('./rect'));\n\nmodule.exports = utils;\n","const scope = require('../scope');\nconst utils = require('./index');\n\nconst finder = {\n methodOrder: [ 'simulationResume', 'mouseOrPen', 'hasPointer', 'idle' ],\n\n search: function (pointer, eventType, eventTarget) {\n const pointerType = utils.getPointerType(pointer);\n const pointerId = utils.getPointerId(pointer);\n const details = { pointer, pointerId, pointerType, eventType, eventTarget };\n\n for (const method of finder.methodOrder) {\n const interaction = finder[method](details);\n\n if (interaction) {\n return interaction;\n }\n }\n },\n\n // try to resume simulation with a new pointer\n simulationResume: function ({ pointerType, eventType, eventTarget }) {\n if (!/down|start/i.test(eventType)) {\n return null;\n }\n\n for (const interaction of scope.interactions) {\n let element = eventTarget;\n\n if (interaction.simulation && interaction.simulation.allowResume\n && (interaction.pointerType === pointerType)) {\n while (element) {\n // if the element is the interaction element\n if (element === interaction.element) {\n return interaction;\n }\n element = utils.parentNode(element);\n }\n }\n }\n\n return null;\n },\n\n // if it's a mouse or pen interaction\n mouseOrPen: function ({ pointerId, pointerType, eventType }) {\n if (pointerType !== 'mouse' && pointerType !== 'pen') {\n return null;\n }\n\n let firstNonActive;\n\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType) {\n // if it's a down event, skip interactions with running simulations\n if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; }\n\n // if the interaction is active, return it immediately\n if (interaction.interacting()) {\n return interaction;\n }\n // otherwise save it and look for another active interaction\n else if (!firstNonActive) {\n firstNonActive = interaction;\n }\n }\n }\n\n // if no active mouse interaction was found use the first inactive mouse\n // interaction\n if (firstNonActive) {\n return firstNonActive;\n }\n\n // find any mouse or pen interaction.\n // ignore the interaction if the eventType is a *down, and a simulation\n // is active\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType && !(/down/i.test(eventType) && interaction.simulation)) {\n return interaction;\n }\n }\n\n return null;\n },\n\n // get interaction that has this pointer\n hasPointer: function ({ pointerId }) {\n for (const interaction of scope.interactions) {\n if (utils.contains(interaction.pointerIds, pointerId)) {\n return interaction;\n }\n }\n },\n\n // get first idle interaction with a matching pointerType\n idle: function ({ pointerType }) {\n for (const interaction of scope.interactions) {\n // if there's already a pointer held down\n if (interaction.pointerIds.length === 1) {\n const target = interaction.target;\n // don't add this pointer if there is a target interactable and it\n // isn't gesturable\n if (target && !target.options.gesture.enabled) {\n continue;\n }\n }\n // maximum of 2 pointers per interaction\n else if (interaction.pointerIds.length >= 2) {\n continue;\n }\n\n if (!interaction.interacting() && (pointerType === interaction.pointerType)) {\n return interaction;\n }\n }\n\n return null;\n },\n};\n\nmodule.exports = finder;\n","const win = require('./window');\nconst isWindow = require('./isWindow');\n\nconst is = {\n array : () => {},\n\n window : thing => thing === win.window || isWindow(thing),\n\n docFrag : thing => is.object(thing) && thing.nodeType === 11,\n\n object : thing => !!thing && (typeof thing === 'object'),\n\n function: thing => typeof thing === 'function',\n\n number : thing => typeof thing === 'number' ,\n\n bool : thing => typeof thing === 'boolean' ,\n\n string : thing => typeof thing === 'string' ,\n\n element: thing => {\n if (!thing || (typeof thing !== 'object')) { return false; }\n\n const _window = win.getWindow(thing) || win.window;\n\n return (/object|function/.test(typeof _window.Element)\n ? thing instanceof _window.Element //DOM2\n : thing.nodeType === 1 && typeof thing.nodeName === 'string');\n },\n};\n\nis.array = thing => (is.object(thing)\n && (typeof thing.length !== 'undefined')\n && is.function(thing.splice));\n\nmodule.exports = is;\n","module.exports = (thing) => !!(thing && thing.Window) && (thing instanceof thing.Window);\n","function pointerExtend (dest, source) {\n for (const prop in source) {\n const prefixedPropREs = module.exports.prefixedPropREs;\n let deprecated = false;\n\n // skip deprecated prefixed properties\n for (const vendor in prefixedPropREs) {\n if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) {\n deprecated = true;\n break;\n }\n }\n\n if (!deprecated && typeof source[prop] !== 'function') {\n dest[prop] = source[prop];\n }\n }\n return dest;\n}\n\npointerExtend.prefixedPropREs = {\n webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/,\n};\n\nmodule.exports = pointerExtend;\n","const hypot = require('./hypot');\nconst browser = require('./browser');\nconst dom = require('./domObjects');\nconst domUtils = require('./domUtils');\nconst domObjects = require('./domObjects');\nconst is = require('./is');\nconst pointerExtend = require('./pointerExtend');\n\nconst pointerUtils = {\n copyCoords: function (dest, src) {\n dest.page = dest.page || {};\n dest.page.x = src.page.x;\n dest.page.y = src.page.y;\n\n dest.client = dest.client || {};\n dest.client.x = src.client.x;\n dest.client.y = src.client.y;\n\n dest.timeStamp = src.timeStamp;\n },\n\n setCoordDeltas: function (targetObj, prev, cur) {\n targetObj.page.x = cur.page.x - prev.page.x;\n targetObj.page.y = cur.page.y - prev.page.y;\n targetObj.client.x = cur.client.x - prev.client.x;\n targetObj.client.y = cur.client.y - prev.client.y;\n targetObj.timeStamp = cur.timeStamp - prev.timeStamp;\n\n // set pointer velocity\n const dt = Math.max(targetObj.timeStamp / 1000, 0.001);\n\n targetObj.page.speed = hypot(targetObj.page.x, targetObj.page.y) / dt;\n targetObj.page.vx = targetObj.page.x / dt;\n targetObj.page.vy = targetObj.page.y / dt;\n\n targetObj.client.speed = hypot(targetObj.client.x, targetObj.page.y) / dt;\n targetObj.client.vx = targetObj.client.x / dt;\n targetObj.client.vy = targetObj.client.y / dt;\n },\n\n isNativePointer: function (pointer) {\n return (pointer instanceof dom.Event || pointer instanceof dom.Touch);\n },\n\n // Get specified X/Y coords for mouse or event.touches[0]\n getXY: function (type, pointer, xy) {\n xy = xy || {};\n type = type || 'page';\n\n xy.x = pointer[type + 'X'];\n xy.y = pointer[type + 'Y'];\n\n return xy;\n },\n\n getPageXY: function (pointer, page) {\n page = page || {};\n\n // Opera Mobile handles the viewport and scrolling oddly\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n pointerUtils.getXY('screen', pointer, page);\n\n page.x += window.scrollX;\n page.y += window.scrollY;\n }\n else {\n pointerUtils.getXY('page', pointer, page);\n }\n\n return page;\n },\n\n getClientXY: function (pointer, client) {\n client = client || {};\n\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n // Opera Mobile handles the viewport and scrolling oddly\n pointerUtils.getXY('screen', pointer, client);\n }\n else {\n pointerUtils.getXY('client', pointer, client);\n }\n\n return client;\n },\n\n getPointerId: function (pointer) {\n return is.number(pointer.pointerId)? pointer.pointerId : pointer.identifier;\n },\n\n setCoords: function (targetObj, pointers, timeStamp) {\n const pointer = (pointers.length > 1\n ? pointerUtils.pointerAverage(pointers)\n : pointers[0]);\n\n const tmpXY = {};\n\n pointerUtils.getPageXY(pointer, tmpXY);\n targetObj.page.x = tmpXY.x;\n targetObj.page.y = tmpXY.y;\n\n pointerUtils.getClientXY(pointer, tmpXY);\n targetObj.client.x = tmpXY.x;\n targetObj.client.y = tmpXY.y;\n\n targetObj.timeStamp = is.number(timeStamp) ? timeStamp :new Date().getTime();\n },\n\n pointerExtend: pointerExtend,\n\n getTouchPair: function (event) {\n const touches = [];\n\n // array of touches is supplied\n if (is.array(event)) {\n touches[0] = event[0];\n touches[1] = event[1];\n }\n // an event\n else {\n if (event.type === 'touchend') {\n if (event.touches.length === 1) {\n touches[0] = event.touches[0];\n touches[1] = event.changedTouches[0];\n }\n else if (event.touches.length === 0) {\n touches[0] = event.changedTouches[0];\n touches[1] = event.changedTouches[1];\n }\n }\n else {\n touches[0] = event.touches[0];\n touches[1] = event.touches[1];\n }\n }\n\n return touches;\n },\n\n pointerAverage: function (pointers) {\n const average = {\n pageX : 0,\n pageY : 0,\n clientX: 0,\n clientY: 0,\n screenX: 0,\n screenY: 0,\n };\n\n for (const pointer of pointers) {\n for (const prop in average) {\n average[prop] += pointer[prop];\n }\n }\n for (const prop in average) {\n average[prop] /= pointers.length;\n }\n\n return average;\n },\n\n touchBBox: function (event) {\n if (!event.length && !(event.touches && event.touches.length > 1)) {\n return;\n }\n\n const touches = pointerUtils.getTouchPair(event);\n const minX = Math.min(touches[0].pageX, touches[1].pageX);\n const minY = Math.min(touches[0].pageY, touches[1].pageY);\n const maxX = Math.max(touches[0].pageX, touches[1].pageX);\n const maxY = Math.max(touches[0].pageY, touches[1].pageY);\n\n return {\n x: minX,\n y: minY,\n left: minX,\n top: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n },\n\n touchDistance: function (event, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n\n\n const dx = touches[0][sourceX] - touches[1][sourceX];\n const dy = touches[0][sourceY] - touches[1][sourceY];\n\n return hypot(dx, dy);\n },\n\n touchAngle: function (event, prevAngle, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n const dx = touches[1][sourceX] - touches[0][sourceX];\n const dy = touches[1][sourceY] - touches[0][sourceY];\n const angle = 180 * Math.atan2(dy , dx) / Math.PI;\n\n return angle;\n },\n\n getPointerType: function (pointer) {\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : is.number(pointer.pointerType)\n ? [undefined, undefined,'touch', 'pen', 'mouse'][pointer.pointerType]\n // if the PointerEvent API isn't available, then the \"pointer\" must\n // be either a MouseEvent, TouchEvent, or Touch object\n : /touch/.test(pointer.type) || pointer instanceof domObjects.Touch\n ? 'touch'\n : 'mouse';\n },\n\n // [ event.target, event.currentTarget ]\n getEventTargets: function (event) {\n return [\n domUtils.getActualElement(event.path ? event.path[0] : event.target),\n domUtils.getActualElement(event.currentTarget),\n ];\n },\n};\n\nmodule.exports = pointerUtils;\n","const { window } = require('./window');\n\nconst vendors = ['ms', 'moz', 'webkit', 'o'];\nlet lastTime = 0;\nlet request;\nlet cancel;\n\nfor (let x = 0; x < vendors.length && !window.requestAnimationFrame; x++) {\n request = window[vendors[x] + 'RequestAnimationFrame'];\n cancel = window[vendors[x] +'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n}\n\nif (!request) {\n request = function (callback) {\n const currTime = new Date().getTime();\n const timeToCall = Math.max(0, 16 - (currTime - lastTime));\n const id = setTimeout(function () { callback(currTime + timeToCall); },\n timeToCall);\n\n lastTime = currTime + timeToCall;\n return id;\n };\n}\n\nif (!cancel) {\n cancel = function (id) {\n clearTimeout(id);\n };\n}\n\nmodule.exports = {\n request,\n cancel,\n};\n","const extend = require('./extend');\nconst is = require('./is');\nconst {\n closest,\n parentNode,\n getElementRect,\n} = require('./domUtils');\n\nconst rectUtils = {\n getStringOptionResult: function (value, interactable, element) {\n if (!is.string(value)) {\n return null;\n }\n\n if (value === 'parent') {\n value = parentNode(element);\n }\n else if (value === 'self') {\n value = interactable.getRect(element);\n }\n else {\n value = closest(element, value);\n }\n\n return value;\n },\n\n resolveRectLike: function (value, interactable, element, functionArgs) {\n value = rectUtils.getStringOptionResult(value, interactable, element) || value;\n\n if (is.function(value)) {\n value = value.apply(null, functionArgs);\n }\n\n if (is.element(value)) {\n value = getElementRect(value);\n }\n\n return value;\n },\n\n rectToXY: function (rect) {\n return rect && {\n x: 'x' in rect ? rect.x : rect.left,\n y: 'y' in rect ? rect.y : rect.top,\n };\n },\n\n xywhToTlbr: function (rect) {\n if (rect && !('left' in rect && 'top' in rect)) {\n rect = extend({}, rect);\n\n rect.left = rect.x || 0;\n rect.top = rect.y || 0;\n rect.right = rect.right || (rect.left + rect.width);\n rect.bottom = rect.bottom || (rect.top + rect.height);\n }\n\n return rect;\n },\n\n tlbrToXywh: function (rect) {\n if (rect && !('x' in rect && 'y' in rect)) {\n rect = extend({}, rect);\n\n rect.x = rect.left || 0;\n rect.top = rect.top || 0;\n rect.width = rect.width || (rect.right - rect.x);\n rect.height = rect.height || (rect.bottom - rect.y);\n }\n\n return rect;\n },\n};\n\nmodule.exports = rectUtils;\n","const win = module.exports;\nconst isWindow = require('./isWindow');\n\nfunction init (window) {\n // get wrapped window if using Shadow DOM polyfill\n\n win.realWindow = window;\n\n // create a TextNode\n const el = window.document.createTextNode('');\n\n // check if it's wrapped by a polyfill\n if (el.ownerDocument !== window.document\n && typeof window.wrap === 'function'\n && window.wrap(el) === el) {\n // use wrapped window\n window = window.wrap(window);\n }\n\n win.window = window;\n}\n\nif (typeof window === 'undefined') {\n win.window = undefined;\n win.realWindow = undefined;\n}\nelse {\n init(window);\n}\n\nwin.getWindow = function getWindow (node) {\n if (isWindow(node)) {\n return node;\n }\n\n const rootNode = (node.ownerDocument || node);\n\n return rootNode.defaultView || rootNode.parentWindow || win.window;\n};\n\nwin.init = init;\n"]} \ No newline at end of file diff --git a/dist/interact.min.js b/dist/interact.min.js index c0bb2476c..2d1f0fb62 100644 --- a/dist/interact.min.js +++ b/dist/interact.min.js @@ -1,6 +1,6 @@ -/* interact.js v1.3.0-alpha.3+sha.9595c40 | https://raw.github.com/taye/interact.js/master/LICENSE */ -!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var t;t="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,t.interact=e()}}(function(){return function e(t,n,r){function i(s,a){if(!n[s]){if(!t[s]){var l="function"==typeof require&&require;if(!a&&l)return l(s,!0);if(o)return o(s,!0);var c=new Error("Cannot find module '"+s+"'");throw c.code="MODULE_NOT_FOUND",c}var p=n[s]={exports:{}};t[s][0].call(p.exports,function(e){var n=t[s][1][e];return i(n||e)},p,p.exports,e,t,n,r)}return n[s].exports}for(var o="function"==typeof require&&require,s=0;s6&&void 0!==arguments[6]&&arguments[6];r(this,e);var f=t.target,v=(f&&f.options||s).deltaSource,g=o(f,p,l),h="start"===c,m="end"===c,y=h?t.startCoords:t.curCoords,x=t.prevEvent;p=p||t.element;var b=i({},y.page),w=i({},y.client);b.x-=g.x,b.y-=g.y,w.x-=g.x,w.y-=g.y,this.ctrlKey=n.ctrlKey,this.altKey=n.altKey,this.shiftKey=n.shiftKey,this.metaKey=n.metaKey,this.button=n.button,this.buttons=n.buttons,this.target=p,this.currentTarget=p,this.relatedTarget=u||null,this.preEnd=d,this.type=l+(c||""),this.interaction=t,this.interactable=f,this.t0=h?t.downTimes[t.downTimes.length-1]:x.t0;var E={interaction:t,event:n,action:l,phase:c,element:p,related:u,page:b,client:w,coords:y,starting:h,ending:m,deltaSource:v,iEvent:this};a.fire("set-xy",E),m?(this.pageX=x.pageX,this.pageY=x.pageY,this.clientX=x.clientX,this.clientY=x.clientY):(this.pageX=b.x,this.pageY=b.y,this.clientX=w.x,this.clientY=w.y),this.x0=t.startCoords.page.x-g.x,this.y0=t.startCoords.page.y-g.y,this.clientX0=t.startCoords.client.x-g.x,this.clientY0=t.startCoords.client.y-g.y,a.fire("set-delta",E),this.timeStamp=y.timeStamp,this.dt=t.pointerDelta.timeStamp,this.duration=this.timeStamp-this.t0,this.speed=t.pointerDelta[v].speed,this.velocityX=t.pointerDelta[v].vx,this.velocityY=t.pointerDelta[v].vy,this.swipe=m||"inertiastart"===c?this.getSwipe():null,a.fire("new",E)}return e.prototype.getSwipe=function(){var e=this.interaction;if(e.prevEvent.speed<600||this.timeStamp-e.prevEvent.timeStamp>150)return null;var t=180*Math.atan2(e.prevEvent.velocityY,e.prevEvent.velocityX)/Math.PI;t<0&&(t+=360);var n=112.5<=t&&t<247.5,r=202.5<=t&&t<337.5,i=!n&&(292.5<=t||t<67.5);return{up:r,down:!r&&22.5<=t&&t<157.5,left:n,right:i,angle:t,speed:e.prevEvent.speed,velocity:{x:e.prevEvent.velocityX,y:e.prevEvent.velocityY}}},e.prototype.preventDefault=function(){},e.prototype.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},e.prototype.stopPropagation=function(){this.propagationStopped=!0},e}();a.on("set-delta",function(e){var t=e.iEvent,n=e.interaction,r=e.starting,i=e.deltaSource,o=r?t:n.prevEvent;"client"===i?(t.dx=t.clientX-o.clientX,t.dy=t.clientY-o.clientY):(t.dx=t.pageX-o.pageX,t.dy=t.pageY-o.pageY)}),l.signals=a,t.exports=l},{"./defaultOptions":18,"./utils/Signals":35,"./utils/extend":41,"./utils/getOriginXY":42}],4:[function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=e("./utils/is"),o=e("./utils/events"),s=e("./utils/extend"),a=e("./actions/base"),l=e("./scope"),c=e("./Eventable"),p=e("./defaultOptions"),u=e("./utils/Signals").new(),d=e("./utils/domUtils"),f=d.getElementRect,v=d.nodeContains,g=d.trySelector,h=e("./utils/window"),m=h.getWindow,y=e("./utils/arr"),x=y.indexOf,b=y.contains,w=e("./utils/browser"),E=w.wheelEvent;l.interactables=[];var S=function(){function e(t,n){r(this,e),n=n||{},this.target=t,this.events=new c,this._context=n.context||l.document,this._win=m(g(t)?this._context:t),this._doc=this._win.document,u.fire("new",{target:t,options:n,interactable:this,win:this._win}),l.addDocument(this._doc,this._win),l.interactables.push(this),this.set(n)}return e.prototype.setOnEvents=function(e,t){var n="on"+e;return i.function(t.onstart)&&(this.events[n+"start"]=t.onstart),i.function(t.onmove)&&(this.events[n+"move"]=t.onmove),i.function(t.onend)&&(this.events[n+"end"]=t.onend),i.function(t.oninertiastart)&&(this.events[n+"inertiastart"]=t.oninertiastart),this},e.prototype.setPerAction=function(e,t){for(var n in t)n in p[e]&&(i.object(t[n])?(this.options[e][n]=s(this.options[e][n]||{},t[n]),i.object(p.perAction[n])&&"enabled"in p.perAction[n]&&(this.options[e][n].enabled=!1!==t[n].enabled)):i.bool(t[n])&&i.object(p.perAction[n])?this.options[e][n].enabled=t[n]:void 0!==t[n]&&(this.options[e][n]=t[n]))},e.prototype.getRect=function(e){return e=e||this.target,i.string(this.target)&&!i.element(e)&&(e=this._context.querySelector(this.target)),f(e)},e.prototype.rectChecker=function(e){return i.function(e)?(this.getRect=e,this):null===e?(delete this.options.getRect,this):this.getRect},e.prototype._backCompatOption=function(e,t){if(g(t)||i.object(t)){this.options[e]=t;for(var n=a.names,r=Array.isArray(n),o=0,n=r?n:n[Symbol.iterator]();;){var s;if(r){if(o>=n.length)break;s=n[o++]}else{if(o=n.next(),o.done)break;s=o.value}var l=s;this.options[l][e]=t}return this}return this.options[e]},e.prototype.origin=function(e){return this._backCompatOption("origin",e)},e.prototype.deltaSource=function(e){return"page"===e||"client"===e?(this.options.deltaSource=e,this):this.options.deltaSource},e.prototype.context=function(){return this._context},e.prototype.inContext=function(e){return this._context===e.ownerDocument||v(this._context,e)},e.prototype.fire=function(e){return this.events.fire(e),this},e.prototype._onOffMultiple=function(e,t,n,r){if(i.string(t)&&-1!==t.search(" ")&&(t=t.trim().split(/ +/)),i.array(t)){for(var o=0;o=l.length)break;f=l[d++]}else{if(d=l.next(),d.done)break;f=d.value}var v=f;this.options[v]=p.base[v],v in t&&this[v](t[v])}return u.fire("set",{options:t,interactable:this}),this},e.prototype.unset=function(){if(o.remove(this.target,"all"),i.string(this.target))for(var e in o.delegatedEvents){var t=o.delegatedEvents[e];t.selectors[0]===this.target&&t.contexts[0]===this._context&&(t.selectors.splice(0,1),t.contexts.splice(0,1),t.listeners.splice(0,1),t.selectors.length||(t[e]=null)),o.remove(this._context,e,o.delegateListener),o.remove(this._context,e,o.delegateUseCapture,!0)}else o.remove(this,"all");u.fire("unset",{interactable:this}),l.interactables.splice(x(l.interactables,this),1);for(var n=l.interactions||[],r=Array.isArray(n),s=0,n=r?n:n[Symbol.iterator]();;){var a;if(r){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var c=a;c.target===this&&c.interacting()&&c.stop()}return l.interact},e}();l.interactables.indexOfElement=function(e,t){t=t||l.document;for(var n=0;n=y.length)break;w=y[b++]}else{if(b=y.next(),b.done)break;w=b.value}var E=w,S=E[0],T=E[1];T._updateEventTargets(r,i),T[e](S,t,r,i)}}}function o(e){for(var t=0;te.pointerMoveTolerance);var a={pointer:t,pointerIndex:this.getPointerIndex(t),event:n,eventTarget:r,dx:o,dy:s,duplicate:i,interaction:this,interactingBeforeMove:this.interacting()};i||l.setCoordDeltas(this.pointerDelta,this.prevCoords,this.curCoords),d.fire("move",a),i||(this.interacting()&&this.doMove(a),this.pointerWasMoved&&l.copyCoords(this.prevCoords,this.curCoords))},e.prototype.doMove=function(e){e=l.extend({pointer:this.pointers[0],event:this.prevEvent,eventTarget:this._eventTarget,interaction:this},e||{}),d.fire("before-action-move",e),this._dontFireMove||d.fire("action-move",e),this._dontFireMove=!1},e.prototype.pointerUp=function(e,t,n,r){var i=this.getPointerIndex(e);d.fire(/cancel$/i.test(t.type)?"cancel":"up",{pointer:e,pointerIndex:i,event:t,eventTarget:n,curEventTarget:r,interaction:this}),this.simulation||this.end(t),this.pointerIsDown=!1,this.removePointer(e,t)},e.prototype.end=function(e){e=e||this.prevEvent,this.interacting()&&d.fire("action-end",{event:e,interaction:this}),this.stop()},e.prototype.currentAction=function(){return this._interacting?this.prepared.name:null},e.prototype.interacting=function(){return this._interacting},e.prototype.stop=function(){d.fire("stop",{interaction:this}),this._interacting&&(d.fire("stop-active",{interaction:this}),d.fire("stop-"+this.prepared.name,{interaction:this})),this.target=this.element=null,this._interacting=!1,this.prepared.name=this.prevEvent=null},e.prototype.getPointerIndex=function(e){return l.indexOf(this.pointerIds,l.getPointerId(e))},e.prototype.updatePointer=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:t&&/(down|start)$/i.test(t.type),r=l.getPointerId(e),i=this.getPointerIndex(e);return-1===i&&(i=this.pointerIds.length,this.pointerIds[i]=r),n&&d.fire("update-pointer-down",{pointer:e,event:t,down:n,pointerId:r,pointerIndex:i,interaction:this}),this.pointers[i]=e,i},e.prototype.removePointer=function(e,t){var n=l.getPointerId(e),r=this.mouse?0:l.indexOf(this.pointerIds,n);-1!==r&&(d.fire("remove-pointer",{pointer:e,event:t,pointerIndex:r,interaction:this}),this.pointers.splice(r,1),this.pointerIds.splice(r,1),this.downTargets.splice(r,1),this.downTimes.splice(r,1))},e.prototype._updateEventTargets=function(e,t){this._eventTarget=e,this._curEventTarget=t},e}(),m=0,y=v.length;m=i.length)break;a=i[s++]}else{if(s=i.next(),s.done)break;a=s.value}var l=a;if(l.options.drop.enabled){var c=l.options.drop.accept;if(!(p.is.element(c)&&c!==t||p.is.string(c)&&!p.matchesSelector(t,c)))for(var d=p.is.string(l.target)?l._context.querySelectorAll(l.target):[l.target],f=0;fo.left&&c.xo.top&&c.y=o.left&&v<=o.right&&g>=o.top&&g<=o.bottom}if(f&&p.is.number(a)){s=Math.max(0,Math.min(o.right,f.right)-Math.max(o.left,f.left))*Math.max(0,Math.min(o.bottom,f.bottom)-Math.max(o.top,f.top))/(f.width*f.height)>=a}return this.options.drop.checker&&(s=this.options.drop.checker(e,t,s,this,i,n,r)),s},v.signals.on("unset",function(e){e.interactable.dropzone(!1)}),v.settingsMethods.push("dropChecker"),g.signals.on("new",function(e){e.dropTarget=null,e.dropElement=null,e.prevDropTarget=null,e.prevDropElement=null,e.dropEvents=null,e.activeDrops={dropzones:[],elements:[],rects:[]}}),g.signals.on("stop",function(e){var t=e.interaction;t.dropTarget=t.dropElement=t.prevDropTarget=t.prevDropElement=null}),d.dynamicDrop=function(e){return p.is.bool(e)?(y=e,d):y},p.merge(v.eventTypes,["dragenter","dragleave","dropactivate","dropdeactivate","dropmove","drop"]),c.methodDict.drop="dropzone",h.drop=m.defaults,t.exports=m},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../interact":21,"../scope":34,"../utils":44,"./base":6}],9:[function(e,t,n){"use strict";var r=e("./base"),i=e("../utils"),o=e("../InteractEvent"),s=e("../Interactable"),a=e("../Interaction"),l=e("../defaultOptions"),c={defaults:{enabled:!1,origin:null,restrict:null},checker:function(e,t,n,r,i){return i.pointerIds.length>=2?{name:"gesture"}:null},getCursor:function(){return""}};o.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;"gesturestart"===t.type&&(t.ds=0,n.gesture.startDistance=n.gesture.prevDistance=t.distance,n.gesture.startAngle=n.gesture.prevAngle=t.angle,n.gesture.scale=1)}),o.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;"gesturemove"===t.type&&(t.ds=t.scale-n.gesture.scale,n.target.fire(t),n.gesture.prevAngle=t.angle,n.gesture.prevDistance=t.distance,t.scale===1/0||null===t.scale||void 0===t.scale||isNaN(t.scale)||(n.gesture.scale=t.scale))}),s.prototype.gesturable=function(e){return i.is.object(e)?(this.options.gesture.enabled=!1!==e.enabled,this.setPerAction("gesture",e),this.setOnEvents("gesture",e),this):i.is.bool(e)?(this.options.gesture.enabled=e,e||(this.ongesturestart=this.ongesturestart=this.ongestureend=null),this):this.options.gesture},o.signals.on("set-delta",function(e){var t=e.interaction,n=e.iEvent,r=e.action,s=e.event,a=e.starting,l=e.ending,c=e.deltaSource;if("gesture"===r){var p=t.pointers;n.touches=[p[0],p[1]],a?(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=1,n.ds=0,n.angle=i.touchAngle(p,void 0,c),n.da=0):l||s instanceof o?(n.distance=t.prevEvent.distance,n.box=t.prevEvent.box,n.scale=t.prevEvent.scale,n.ds=n.scale-1,n.angle=t.prevEvent.angle,n.da=n.angle-t.gesture.startAngle):(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=n.distance/t.gesture.startDistance,n.angle=i.touchAngle(p,t.gesture.prevAngle,c),n.ds=n.scale-t.gesture.prevScale,n.da=n.angle-t.gesture.prevAngle)}}),a.signals.on("new",function(e){e.gesture={start:{x:0,y:0},startDistance:0,prevDistance:0,distance:0,scale:1,startAngle:0,prevAngle:0}}),r.gesture=c,r.names.push("gesture"),i.merge(s.eventTypes,["gesturestart","gesturemove","gestureend"]),r.methodDict.gesture="gesturable",l.gesture=c.defaults,t.exports=c},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"./base":6}],10:[function(e,t,n){"use strict";function r(e,t,n,r,i,s,a){if(!t)return!1;if(!0===t){var l=o.is.number(s.width)?s.width:s.right-s.left,c=o.is.number(s.height)?s.height:s.bottom-s.top;if(l<0&&("left"===e?e="right":"right"===e&&(e="left")),c<0&&("top"===e?e="bottom":"bottom"===e&&(e="top")),"left"===e)return n.x<(l>=0?s.left:s.right)+a;if("top"===e)return n.y<(c>=0?s.top:s.bottom)+a;if("right"===e)return n.x>(l>=0?s.right:s.left)-a;if("bottom"===e)return n.y>(c>=0?s.bottom:s.top)-a}return!!o.is.element(r)&&(o.is.element(t)?t===r:o.matchesUpTo(r,t,i))}var i=e("./base"),o=e("../utils"),s=e("../utils/browser"),a=e("../InteractEvent"),l=e("../Interactable"),c=e("../Interaction"),p=e("../defaultOptions"),u=s.supportsTouch||s.supportsPointerEvent?20:10,d={defaults:{enabled:!1,mouseButtons:null,origin:null,snap:null,restrict:null,inertia:null,autoScroll:null,square:!1,preserveAspectRatio:!1,axis:"xy",margin:NaN,edges:null,invert:"none"},checker:function(e,t,n,i,s,a){if(!a)return null;var l=o.extend({},s.curCoords.page),c=n.options;if(c.resize.enabled){var p=c.resize,d={left:!1,right:!1,top:!1,bottom:!1};if(o.is.object(p.edges)){for(var f in d)d[f]=r(f,p.edges[f],l,s._eventTarget,i,a,p.margin||u);if(d.left=d.left&&!d.right,d.top=d.top&&!d.bottom,d.left||d.right||d.top||d.bottom)return{name:"resize",edges:d}}else{var v="y"!==c.resize.axis&&l.x>a.right-u,g="x"!==c.resize.axis&&l.y>a.bottom-u;if(v||g)return{name:"resize",axes:(v?"x":"")+(g?"y":"")}}}return null},cursors:s.isIe9OrOlder?{x:"e-resize",y:"s-resize",xy:"se-resize",top:"n-resize",left:"w-resize",bottom:"s-resize",right:"e-resize",topleft:"se-resize",bottomright:"se-resize",topright:"ne-resize",bottomleft:"ne-resize"}:{x:"ew-resize",y:"ns-resize",xy:"nwse-resize",top:"ns-resize",left:"ew-resize",bottom:"ns-resize",right:"ew-resize",topleft:"nwse-resize",bottomright:"nwse-resize",topright:"nesw-resize",bottomleft:"nesw-resize"},getCursor:function(e){if(e.axis)return d.cursors[e.name+e.axis];if(e.edges){for(var t="",n=["top","bottom","left","right"],r=0;r<4;r++)e.edges[n[r]]&&(t+=n[r]);return d.cursors[t]}}};a.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;if("resizestart"===t.type&&n.prepared.edges){var r=n.target.getRect(n.element),i=n.target.options.resize;if(i.square||i.preserveAspectRatio){var s=o.extend({},n.prepared.edges);s.top=s.top||s.left&&!s.bottom,s.left=s.left||s.top&&!s.right,s.bottom=s.bottom||s.right&&!s.top,s.right=s.right||s.bottom&&!s.left,n.prepared._linkedEdges=s}else n.prepared._linkedEdges=null;i.preserveAspectRatio&&(n.resizeStartAspectRatio=r.width/r.height),n.resizeRects={start:r,current:o.extend({},r),inverted:o.extend({},r),previous:o.extend({},r),delta:{left:0,right:0,width:0,top:0,bottom:0,height:0}},t.rect=n.resizeRects.inverted,t.deltaRect=n.resizeRects.delta}}),a.signals.on("new",function(e){var t=e.iEvent,n=e.phase,r=e.interaction;if("move"===n&&r.prepared.edges){var i=r.target.options.resize,s=i.invert,a="reposition"===s||"negate"===s,l=r.prepared.edges,c=r.resizeRects.start,p=r.resizeRects.current,u=r.resizeRects.inverted,d=r.resizeRects.delta,f=o.extend(r.resizeRects.previous,u),v=l,g=t.dx,h=t.dy;if(i.preserveAspectRatio||i.square){var m=i.preserveAspectRatio?r.resizeStartAspectRatio:1;l=r.prepared._linkedEdges,v.left&&v.bottom||v.right&&v.top?h=-g/m:v.left||v.right?h=g/m:(v.top||v.bottom)&&(g=h*m)}if(l.top&&(p.top+=h),l.bottom&&(p.bottom+=h),l.left&&(p.left+=g),l.right&&(p.right+=g),a){if(o.extend(u,p),"reposition"===s){var y=void 0;u.top>u.bottom&&(y=u.top,u.top=u.bottom,u.bottom=y),u.left>u.right&&(y=u.left,u.left=u.right,u.right=y)}}else u.top=Math.min(p.top,c.bottom),u.bottom=Math.max(p.bottom,c.top),u.left=Math.min(p.left,c.right),u.right=Math.max(p.right,c.left);u.width=u.right-u.left,u.height=u.bottom-u.top;for(var x in u)d[x]=u[x]-f[x];t.edges=r.prepared.edges,t.rect=u,t.deltaRect=d}}),l.prototype.resizable=function(e){return o.is.object(e)?(this.options.resize.enabled=!1!==e.enabled,this.setPerAction("resize",e),this.setOnEvents("resize",e),/^x$|^y$|^xy$/.test(e.axis)?this.options.resize.axis=e.axis:null===e.axis&&(this.options.resize.axis=p.resize.axis),o.is.bool(e.preserveAspectRatio)?this.options.resize.preserveAspectRatio=e.preserveAspectRatio:o.is.bool(e.square)&&(this.options.resize.square=e.square),this):o.is.bool(e)?(this.options.resize.enabled=e,e||(this.onresizestart=this.onresizestart=this.onresizeend=null),this):this.options.resize},c.signals.on("new",function(e){ -e.resizeAxes="xy"}),a.signals.on("set-delta",function(e){var t=e.interaction,n=e.iEvent;"resize"===e.action&&t.resizeAxes&&(t.target.options.resize.square?("y"===t.resizeAxes?n.dx=n.dy:n.dy=n.dx,n.axes="xy"):(n.axes=t.resizeAxes,"x"===t.resizeAxes?n.dy=0:"y"===t.resizeAxes&&(n.dx=0)))}),i.resize=d,i.names.push("resize"),o.merge(l.eventTypes,["resizestart","resizemove","resizeinertiastart","resizeinertiaresume","resizeend"]),i.methodDict.resize="resizable",p.resize=d.defaults,t.exports=d},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"../utils/browser":37,"./base":6}],11:[function(e,t,n){"use strict";var r=e("./utils/raf"),i=e("./utils/window").getWindow,o=e("./utils/is"),s=e("./utils/domUtils"),a=e("./Interaction"),l=e("./defaultOptions"),c={defaults:{enabled:!1,container:null,margin:60,speed:300},interaction:null,i:null,x:0,y:0,isScrolling:!1,prevTime:0,start:function(e){c.isScrolling=!0,r.cancel(c.i),c.interaction=e,c.prevTime=(new Date).getTime(),c.i=r.request(c.scroll)},stop:function(){c.isScrolling=!1,r.cancel(c.i)},scroll:function(){var e=c.interaction.target.options[c.interaction.prepared.name].autoScroll,t=e.container||i(c.interaction.element),n=(new Date).getTime(),s=(n-c.prevTime)/1e3,a=e.speed*s;a>=1&&(o.window(t)?t.scrollBy(c.x*a,c.y*a):t&&(t.scrollLeft+=c.x*a,t.scrollTop+=c.y*a),c.prevTime=n),c.isScrolling&&(r.cancel(c.i),c.i=r.request(c.scroll))},check:function(e,t){var n=e.options;return n[t].autoScroll&&n[t].autoScroll.enabled},onInteractionMove:function(e){var t=e.interaction,n=e.pointer;if(t.interacting()&&c.check(t.target,t.prepared.name)){if(t.simulation)return void(c.x=c.y=0);var r=void 0,a=void 0,l=void 0,p=void 0,u=t.target.options[t.prepared.name].autoScroll,d=u.container||i(t.element);if(o.window(d))p=n.clientXd.innerWidth-c.margin,l=n.clientY>d.innerHeight-c.margin;else{var f=s.getElementClientRect(d);p=n.clientXf.right-c.margin,l=n.clientY>f.bottom-c.margin}c.x=a?1:p?-1:0,c.y=l?1:r?-1:0,c.isScrolling||(c.margin=u.margin,c.speed=u.speed,c.start(t))}}};a.signals.on("stop-active",function(){c.stop()}),a.signals.on("action-move",c.onInteractionMove),l.perAction.autoScroll=c.defaults,t.exports=c},{"./Interaction":5,"./defaultOptions":18,"./utils/domUtils":39,"./utils/is":46,"./utils/raf":50,"./utils/window":52}],12:[function(e,t,n){"use strict";var r=e("../Interactable"),i=e("../actions/base"),o=e("../utils/is"),s=e("../utils/domUtils");r.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},r.prototype.ignoreFrom=function(e){return this._backCompatOption("ignoreFrom",e)},r.prototype.allowFrom=function(e){return this._backCompatOption("allowFrom",e)},r.prototype.testIgnore=function(e,t,n){return!(!e||!o.element(n))&&(o.string(e)?s.matchesUpTo(n,e,t):!!o.element(e)&&s.nodeContains(e,n))},r.prototype.testAllow=function(e,t,n){return!e||!!o.element(n)&&(o.string(e)?s.matchesUpTo(n,e,t):!!o.element(e)&&s.nodeContains(e,n))},r.prototype.testIgnoreAllow=function(e,t,n){return!this.testIgnore(e.ignoreFrom,t,n)&&this.testAllow(e.allowFrom,t,n)},r.prototype.actionChecker=function(e){return o.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},r.prototype.styleCursor=function(e){return o.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},r.prototype.defaultActionChecker=function(e,t,n,r){for(var o=this.getRect(r),s=null,a=i.names,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var u=p;if((!n.pointerIsDown||!n.mouse||0!=(t.buttons&this.options[u].mouseButtons))&&(s=i[u].checker(e,t,this,r,n,o)))return s}}},{"../Interactable":4,"../actions/base":6,"../utils/domUtils":39,"../utils/is":46}],13:[function(e,t,n){"use strict";function r(e,t,n,r){return g.is.object(e)&&t.testIgnoreAllow(t.options[e.name],n,r)&&t.options[e.name].enabled&&a(t,n,e)?e:null}function i(e,t,n,i,o,s){for(var a=0,l=i.length;a=m.maxInteractions)return!1;if(u.target===e){if((a+=d===n.name|0)>=i)return!1;if(u.element===t&&(l++,d!==n.name||l>=o))return!1}}}return m.maxInteractions>0}}var l=e("../interact"),c=e("../Interactable"),p=e("../Interaction"),u=e("../actions/base"),d=e("../defaultOptions"),f=e("../utils/browser"),v=e("../scope"),g=e("../utils"),h=e("../utils/Signals").new();e("./InteractableMethods");var m={signals:h,withinInteractionLimit:a,maxInteractions:1/0,defaults:{perAction:{manualStart:!1,max:1/0,maxPerElement:1,allowFrom:null,ignoreFrom:null}},setActionDefaults:function(e){g.extend(e.defaults,m.defaults.perAction)}};p.signals.on("down",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;if(!t.interacting()){s(t,o(t,n,r,i))}}),p.signals.on("move",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;if(t.mouse&&!t.pointerIsDown&&!t.interacting()){s(t,o(t,n,r,i))}}),p.signals.on("move",function(e){var t=e.interaction,n=e.event;if(t.pointerIsDown&&!t.interacting()&&t.pointerWasMoved&&t.prepared.name){h.fire("before-start",e);var r=t.target;t.prepared.name&&r&&(r.options[t.prepared.name].manualStart||!a(r,t.element,t.prepared)?t.stop(n):t.start(t.prepared,r,t.element))}}),p.signals.on("stop",function(e){var t=e.interaction,n=t.target;n&&n.options.styleCursor&&(n._doc.documentElement.style.cursor="")}),c.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},c.prototype.actionChecker=function(e){return g.is.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},c.prototype.styleCursor=function(e){return g.is.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},c.prototype.defaultActionChecker=function(e,t,n,r){for(var i=this.getRect(r),o=t.buttons||{0:1,1:4,3:8,4:16}[t.button],s=null,a=u.names,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var d=p;if((!n.pointerIsDown||!n.mouse||0!=(o&this.options[d].mouseButtons))&&(s=u[d].checker(e,t,this,r,n,i)))return s}},l.maxInteractions=function(e){return g.is.number(e)?(m.maxInteractions=e,this):m.maxInteractions},c.settingsMethods.push("styleCursor"),c.settingsMethods.push("actionChecker"),c.settingsMethods.push("ignoreFrom"),c.settingsMethods.push("allowFrom"),d.base.actionChecker=null,d.base.styleCursor=!0,g.extend(d.perAction,m.defaults.perAction),t.exports=m},{"../Interactable":4,"../Interaction":5,"../actions/base":6,"../defaultOptions":18,"../interact":21,"../scope":34,"../utils":44,"../utils/Signals":35,"../utils/browser":37,"./InteractableMethods":12}],14:[function(e,t,n){"use strict";var r=e("./base"),i=e("../Interaction");i.signals.on("new",function(e){e.delayTimer=null}),r.signals.on("prepared",function(e){var t=e.interaction,n=t.prepared.name;if(n){var r=t.target.options[n].delay;r>0&&(t.delayTimer=setTimeout(function(){t.start(t.prepared,t.target,t.element)},r))}}),i.signals.on("move",function(e){var t=e.interaction,n=e.duplicate;t.pointerWasMoved&&!n&&clearTimeout(t.delayTimer)}),r.signals.on("before-start",function(e){var t=e.interaction,n=t.prepared.name;if(n){t.target.options[n].delay>0&&(t.prepared.name=null)}})},{"../Interaction":5,"./base":13}],15:[function(e,t,n){"use strict";function r(e,t){if(!t)return!1;var n=t.options.drag.startAxis;return"xy"===e||"xy"===n||n===e}var i=e("./base"),o=e("../scope"),s=e("../utils/browser"),a=e("../utils/is"),l=e("../utils/domUtils"),c=l.matchesSelector,p=l.parentNode;i.setActionDefaults(e("../actions/drag")),i.signals.on("before-start",function(e){var t=e.interaction,n=e.eventTarget,l=e.dx,u=e.dy;if("drag"===t.prepared.name){var d=Math.abs(l),f=Math.abs(u),v=t.target.options.drag,g=v.startAxis,h=d>f?"x":dl.minSpeed&&g>l.endSpeed,b={interaction:t,pageCoords:v,statuses:f,preEnd:!0,requireEndOnly:!0};y&&!x&&(c.resetStatuses(f),m=c.setAll(b),m.shouldMove&&m.locked&&(h=!0)),(x||h)&&(p.copyCoords(i.upCoords,t.curCoords),t.pointers[0]=i.startEvent=new a(t,n,t.prepared.name,"inertiastart",t.element),i.t0=d,i.active=!0,i.allowResume=l.allowResume,t.simulation=i,o.fire(i.startEvent),x?(i.vx0=t.pointerDelta.client.vx,i.vy0=t.pointerDelta.client.vy,i.v0=g,r(t,i),p.extend(v,t.curCoords.page),v.x+=i.xe,v.y+=i.ye,c.resetStatuses(f),m=c.setAll(b),i.modifiedXe+=m.dx,i.modifiedYe+=m.dy,i.i=u.request(t.boundInertiaFrame)):(i.smoothEnd=!0,i.xe=m.dx,i.ye=m.dy,i.sx=i.sy=0,i.i=u.request(t.boundSmoothEndFrame)))}}),l.signals.on("stop-active",function(e){var t=e.interaction,n=t.inertiaStatus;n.active&&(u.cancel(n.i),n.active=!1,t.simulation=null)})},{"./InteractEvent":3,"./Interaction":5,"./modifiers":24,"./utils":44,"./utils/raf":50}],21:[function(e,t,n){"use strict";function r(e,t){var n=a.interactables.get(e,t);return n||(n=new l(e,t),n.events.global=p),n}var i=e("./utils/browser"),o=e("./utils/events"),s=e("./utils"),a=e("./scope"),l=e("./Interactable"),c=e("./Interaction"),p={};r.isSet=function(e,t){return-1!==a.interactables.indexOfElement(e,t&&t.context)},r.on=function(e,t,n){if(s.is.string(e)&&-1!==e.search(" ")&&(e=e.trim().split(/ +/)),s.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.on(f,t,n)}return r}if(s.is.object(e)){for(var v in e)r.on(v,e[v],t);return r}return s.contains(l.eventTypes,e)?p[e]?p[e].push(t):p[e]=[t]:o.add(a.document,e,t,{options:n}),r},r.off=function(e,t,n){if(s.is.string(e)&&-1!==e.search(" ")&&(e=e.trim().split(/ +/)),s.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.off(f,t,n)}return r}if(s.is.object(e)){for(var v in e)r.off(v,e[v],t);return r}if(s.contains(l.eventTypes,e)){var g=void 0;e in p&&-1!==(g=s.indexOf(p[e],t))&&p[e].splice(g,1)}else o.remove(a.document,e,t,n);return r},r.debug=function(){return a},r.getPointerAverage=s.pointerAverage,r.getTouchBBox=s.touchBBox,r.getTouchDistance=s.touchDistance,r.getTouchAngle=s.touchAngle,r.getElementRect=s.getElementRect,r.getElementClientRect=s.getElementClientRect,r.matchesSelector=s.matchesSelector,r.closest=s.closest,r.supportsTouch=function(){return i.supportsTouch},r.supportsPointerEvent=function(){return i.supportsPointerEvent},r.stop=function(e){for(var t=a.interactions.length-1;t>=0;t--)a.interactions[t].stop(e);return r},r.pointerMoveTolerance=function(e){return s.is.number(e)?(c.pointerMoveTolerance=e,this):c.pointerMoveTolerance},r.addDocument=a.addDocument,r.removeDocument=a.removeDocument,a.interact=r,t.exports=r},{"./Interactable":4,"./Interaction":5,"./scope":34,"./utils":44,"./utils/browser":37,"./utils/events":40}],22:[function(e,t,n){"use strict";function r(e){var t=e.interaction,n=e.event;t.target&&t.target.checkAndPreventDefault(n)}var i=e("./Interactable"),o=e("./Interaction"),s=e("./scope"),a=e("./utils/is"),l=e("./utils/events"),c=e("./utils/domUtils"),p=c.nodeContains,u=c.matchesSelector;i.prototype.preventDefault=function(e){return/^(always|never|auto)$/.test(e)?(this.options.preventDefault=e,this):a.bool(e)?(this.options.preventDefault=e?"always":"never",this):this.options.preventDefault},i.prototype.checkAndPreventDefault=function(e){var t=this.options.preventDefault;if("never"!==t)return"always"===t?void e.preventDefault():void(l.supportsOptions||/^(mouse|pointer|touch)*(down|start)/i.test(e.type)||a.element(e.target)&&u(e.target,"input,select,textarea,[contenteditable=true],[contenteditable=true] *")||e.preventDefault())};for(var d=["down","move","up","cancel"],f=0;f=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i;if(o.element&&(o.element===e.target||p(o.element,e.target)))return void o.target.checkAndPreventDefault(e)}}},{"./Interactable":4,"./Interaction":5,"./scope":34,"./utils/domUtils":39,"./utils/events":40,"./utils/is":46}],23:[function(e,t,n){"use strict";function r(e){var t=e.target,n=a.search(e,e.type,t);n&&n.prevTap&&e.clientX===n.prevTap.clientX&&e.clientY===n.prevTap.clientY&&t===n.prevTap.target&&(n.downTargets[0]=t,n.downTimes[0]=(new Date).getTime(),l.fire({interaction:n,event:e,eventTarget:t,pointer:e,type:"tap"}))}var i=e("./scope"),o=e("./utils/events"),s=e("./utils/browser"),a=e("./utils/interactionFinder"),l=e("./pointerEvents/base"),c=e("./utils/window"),p=c.window,u=Object.prototype.toString;if(p.Array.isArray||(p.Array.isArray=function(e){return"[object Array]"===u.call(e)}),String.prototype.trim||(String.prototype.trim=function(){return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")}),s.isIE8){var d=function(e){for(var t=i.interactions,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var o;if(n){if(r>=t.length)break;o=t[r++]}else{if(r=t.next(),r.done)break;o=r.value}var s=o;s.interacting()&&s.target.checkAndPreventDefault(e)}},f=function(e,t){var n=e.doc,i=(e.win,0===t.indexOf("listen")?o.add:o.remove);i(n,"selectstart",d),l&&i(n,"dblclick",r)};i.signals.on("add-document",f),i.signals.on("remove-document",f)}t.exports=null},{"./pointerEvents/base":31,"./scope":34,"./utils/browser":37,"./utils/events":40,"./utils/interactionFinder":45,"./utils/window":52}],24:[function(e,t,n){"use strict";function r(e,t,n){return e&&e.enabled&&(t||!e.endOnly)&&(!n||e.endOnly)}var i=e("../InteractEvent"),o=e("../Interaction"),s=e("../utils/extend"),a={names:[],setOffsets:function(e){var t=e.interaction,n=e.pageCoords,r=t.target,i=t.element,o=t.startOffset,s=r.getRect(i);s?(o.left=n.x-s.left,o.top=n.y-s.top,o.right=s.right-n.x,o.bottom=s.bottom-n.y,"width"in s||(s.width=s.right-s.left),"height"in s||(s.height=s.bottom-s.top)):o.left=o.top=o.right=o.bottom=0,e.rect=s,e.interactable=r,e.element=i;for(var l=0;l=p.length)break;f=p[d++]}else{if(d=p.next(),d.done)break;f=d.value}var v=f,g=a[v],h=t.target.options[t.prepared.name][v];r(h,i,o)&&(e.status=e.status=n[v],e.options=h,e.offset=e.interaction.modifierOffsets[v],g.set(e),e.status.locked&&(l.x+=e.status.dx,l.y+=e.status.dy,c.dx+=e.status.dx,c.dy+=e.status.dy,c.locked=!0))}return c.shouldMove=!e.status||!c.locked||e.status.changed,c},resetStatuses:function(e){for(var t=a.names,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var i;if(n){if(r>=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i,s=e[o]||{};s.dx=s.dy=0,s.modifiedX=s.modifiedY=NaN,s.locked=!1,s.changed=!0,e[o]=s}return e},start:function(e,t){var n=e.interaction,r={interaction:n,pageCoords:("action-resume"===t?n.curCoords:n.startCoords).page,startOffset:n.startOffset,statuses:n.modifierStatuses,preEnd:!1,requireEndOnly:!1};a.setOffsets(r),a.resetStatuses(r.statuses),r.pageCoords=s({},n.startCoords.page),n.modifierResult=a.setAll(r)}};o.signals.on("new",function(e){e.startOffset={left:0,right:0,top:0,bottom:0},e.modifierOffsets={},e.modifierStatuses=a.resetStatuses({}),e.modifierResult=null}),o.signals.on("action-start",a.start),o.signals.on("action-resume",a.start),o.signals.on("before-action-move",function(e){var t=e.interaction,n=e.preEnd,r=e.interactingBeforeMove,i=a.setAll({interaction:t,preEnd:n,pageCoords:t.curCoords.page,statuses:t.modifierStatuses,requireEndOnly:!1});!i.shouldMove&&r&&(t._dontFireMove=!0),t.modifierResult=i}),o.signals.on("action-end",function(e){for(var t=e.interaction,n=e.event,i=0;i=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}var m=h,y=m.x,x=m.y;l.push({x:s.left-i.width*y+u.x,y:s.top-i.height*x+u.y})}else l.push(u);return l},set:function(e){var t=e.interaction,n=e.pageCoords,r=e.status,i=e.options,s=e.offset,a=[],l=void 0,c=void 0,p=void 0;if(r.useStatusXY)c={x:r.x,y:r.y};else{var u=o.getOriginXY(t.target,t.element,t.prepared.name);c=o.extend({},n),c.x-=u.x,c.y-=u.y}r.realX=c.x,r.realY=c.y;for(var d=i.targets?i.targets.length:0,f=s,v=Array.isArray(f),g=0,f=v?f:f[Symbol.iterator]();;){var h;if(v){if(g>=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}for(var m=h,y=m.x,x=m.y,b=c.x-y,w=c.y-x,E=i.targets,S=Array.isArray(E),T=0,E=S?E:E[Symbol.iterator]();;){var C;if(S){if(T>=E.length)break;C=E[T++]}else{if(T=E.next(),T.done)break;C=T.value}var A=C;l=o.is.function(A)?A(b,w,t):A,l&&a.push({x:o.is.number(l.x)?l.x+y:b,y:o.is.number(l.y)?l.y+x:w,range:o.is.number(l.range)?l.range:i.range})}}var D={target:null,inRange:!1,distance:0,range:0,dx:0,dy:0};for(p=0,d=a.length;p=p.length)break;f=p[d++]}else{if(d=p.next(),d.done)break;f=d.value}var v=f,g=void 0;g=a.is.function(v)?v(l,c,t):v,g&&("width"in g&&"height"in g&&(g.x=g.width,g.y=g.height),e.options.targets.push(g))}i.set(e)},modifyCoords:function(e){var t=e.options;e.options=a.extend({},t), -e.options.enabled=t.enabled,e.options.relativePoints=[null],i.modifyCoords(e)}};r.snapSize=l,r.names.push("snapSize"),o.perAction.snapSize=l.defaults,s.defaults.snapSize=l.defaults,t.exports=l},{"../actions/resize":10,"../defaultOptions":18,"../utils/":44,"./index":24,"./snap":28}],30:[function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=e("../utils/pointerUtils");t.exports=function(){function e(t,n,o,s,a){if(r(this,e),i.pointerExtend(this,o),o!==n&&i.pointerExtend(this,n),this.interaction=a,this.timeStamp=(new Date).getTime(),this.originalEvent=o,this.type=t,this.pointerId=i.getPointerId(n),this.pointerType=i.getPointerType(n,a),this.target=s,this.currentTarget=null,"tap"===t){var l=a.getPointerIndex(n);this.dt=this.timeStamp-a.downTimes[l];var c=this.timeStamp-a.tapTime;this.double=!!(a.prevTap&&"doubletap"!==a.prevTap.type&&a.prevTap.target===this.target&&c<500)}else"doubletap"===t&&(this.dt=n.timeStamp-a.tapTime)}return e.prototype.subtractOrigin=function(e){var t=e.x,n=e.y;return this.pageX-=t,this.pageY-=n,this.clientX-=t,this.clientY-=n,this},e.prototype.addOrigin=function(e){var t=e.x,n=e.y;return this.pageX+=t,this.pageY+=n,this.clientX+=t,this.clientY+=n,this},e.prototype.preventDefault=function(){this.originalEvent.preventDefault()},e.prototype.stopPropagation=function(){this.propagationStopped=!0},e.prototype.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},e}()},{"../utils/pointerUtils":49}],31:[function(e,t,n){"use strict";function r(e){for(var t=e.interaction,n=e.pointer,s=e.event,l=e.eventTarget,c=e.type,u=void 0===c?e.pointerEvent.type:c,d=e.targets,f=void 0===d?i(e):d,v=e.pointerEvent,g=void 0===v?new o(u,n,s,l,t):v,h={interaction:t,pointer:n,event:s,eventTarget:l,targets:f,type:u,pointerEvent:g},m=0;m=u.length)break;g=u[v++]}else{if(v=u.next(),v.done)break;g=v.value}var h=g;c.element=h,p.fire("collect-targets",c)}return"hold"===o&&(c.targets=d(c.targets,function(e){return e.eventable.options.holdDuration===t.holdTimers[s].duration})),c.targets}var o=e("./PointerEvent"),s=e("../Interaction"),a=e("../utils"),l=e("../utils/browser"),c=e("../defaultOptions"),p=e("../utils/Signals").new(),u=e("../utils/arr"),d=u.filter,f=["down","up","cancel"],v=["down","up","cancel"],g={PointerEvent:o,fire:r,collectEventTargets:i,signals:p,defaults:{holdDuration:600,ignoreFrom:null,allowFrom:null,origin:{x:0,y:0}},types:["down","move","up","cancel","tap","doubletap","hold"]};s.signals.on("update-pointer-down",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers[n]={duration:1/0,timeout:null}}),s.signals.on("remove-pointer",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers.splice(n,1)}),s.signals.on("move",function(e){var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,s=e.duplicateMove,a=t.getPointerIndex(n);s||t.pointerIsDown&&!t.pointerWasMoved||(t.pointerIsDown&&clearTimeout(t.holdTimers[a].timeout),r({interaction:t,pointer:n,event:i,eventTarget:o,type:"move"}))}),s.signals.on("down",function(e){for(var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,s=e.pointerIndex,c=l.isIE8?a.extend({},i):i,u=t.holdTimers[s],d=a.getPath(o),f={interaction:t,pointer:n,event:i,eventTarget:o,type:"hold",targets:[],path:d,element:null},v=d,g=Array.isArray(v),h=0,v=g?v:v[Symbol.iterator]();;){var m;if(g){if(h>=v.length)break;m=v[h++]}else{if(h=v.next(),h.done)break;m=h.value}var y=m;f.element=y,p.fire("collect-targets",f)}if(f.targets.length){for(var x=1/0,b=0;b=0&&(p.selectors[u]!==e||p.contexts[u]!==t);u--);-1===u&&(u=p.selectors.length,p.selectors.push(e),p.contexts.push(t),p.listeners.push([])),p.listeners[u].push([i,!!s.capture,s.passive])}function s(e,t,n,r,o){var s=f(o),c=O[n],p=!1,u=void 0;if(c)for(u=c.selectors.length-1;u>=0;u--)if(c.selectors[u]===e&&c.contexts[u]===t){for(var d=c.listeners[u],v=d.length-1;v>=0;v--){var g=d[v],h=g[0],m=g[1],y=g[2];if(h===r&&m===!!s.capture&&y===s.passive){d.splice(v,1),d.length||(c.selectors.splice(u,1),c.contexts.splice(u,1),c.listeners.splice(u,1),i(t,n,a),i(t,n,l,!0),c.selectors.length||(O[n]=null)),p=!0;break}}if(p)break}}function a(e,t){var n=f(t),r={},i=O[e.type],o=g.getActualElement(e.path?e.path[0]:e.target),s=o;for(h(r,e),r.originalEvent=e,r.preventDefault=p;v.element(s);){for(var a=0;a=l.length)break;u=l[p++]}else{if(p=l.next(),p.done)break;u=p.value}var d=u,f=s[d](a);if(f)return f}},simulationResume:function(e){var t=e.mouseEvent,n=e.eventType,o=e.eventTarget;if(!/down|start/i.test(n))return null;for(var s=r.interactions,a=Array.isArray(s),l=0,s=a?s:s[Symbol.iterator]();;){var c;if(a){if(l>=s.length)break;c=s[l++]}else{if(l=s.next(),l.done)break;c=l.value}var p=c,u=o;if(p.simulation&&p.simulation.allowResume&&p.mouse===t)for(;u;){if(u===p.element)return p;u=i.parentNode(u)}}return null},mouse:function(e){var t=e.pointerId,n=e.mouseEvent,s=e.eventType;if(!n&&(o.supportsTouch||o.supportsPointerEvent))return null;for(var a=void 0,l=r.interactions,c=Array.isArray(l),p=0,l=c?l:l[Symbol.iterator]();;){var u;if(c){if(p>=l.length)break;u=l[p++]}else{if(p=l.next(),p.done)break;u=p.value}var d=u;if(d.mouse){if(d.simulation&&!i.contains(d.pointerIds,t))continue;if(d.interacting())return d;a||(a=d)}}if(a)return a;for(var f=r.interactions,v=Array.isArray(f),g=0,f=v?f:f[Symbol.iterator]();;){var h;if(v){if(g>=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}var m=h;if(m.mouse&&(!/down/.test(s)||!m.simulation))return m}return null},hasPointer:function(e){for(var t=e.pointerId,n=r.interactions,o=Array.isArray(n),s=0,n=o?n:n[Symbol.iterator]();;){var a;if(o){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var l=a;if(i.contains(l.pointerIds,t))return l}},idle:function(e){for(var t=e.mouseEvent,n=r.interactions,i=Array.isArray(n),o=0,n=i?n:n[Symbol.iterator]();;){var s;if(i){if(o>=n.length)break;s=n[o++]}else{if(o=n.next(),o.done)break;s=o.value}var a=s;if(1===a.pointerIds.length){var l=a.target;if(l&&!l.options.gesture.enabled)continue}else if(a.pointerIds.length>=2)continue;if(!a.interacting()&&t===a.mouse)return a}return null}};t.exports=s},{"../scope":34,"./browser":37,"./index":44}],46:[function(e,t,n){"use strict";var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},i=e("./window"),o=e("./isWindow"),s={array:function(){},window:function(e){return e===i.window||o(e)},docFrag:function(e){return s.object(e)&&11===e.nodeType},object:function(e){return!!e&&"object"===(void 0===e?"undefined":r(e))},function:function(e){return"function"==typeof e},number:function(e){return"number"==typeof e},bool:function(e){return"boolean"==typeof e},string:function(e){return"string"==typeof e},element:function(e){if(!e||"object"!==(void 0===e?"undefined":r(e)))return!1;var t=i.getWindow(e)||i.window;return/object|function/.test(r(t.Element))?e instanceof t.Element:1===e.nodeType&&"string"==typeof e.nodeName}};s.array=function(e){return s.object(e)&&void 0!==e.length&&s.function(e.splice)},t.exports=s},{"./isWindow":47,"./window":52}],47:[function(e,t,n){"use strict";t.exports=function(e){return!(!e||!e.Window)&&e instanceof e.Window}},{}],48:[function(e,t,n){"use strict";function r(e,n){for(var r in n){var i=t.exports.prefixedPropREs,o=!1;for(var s in i)if(0===r.indexOf(s)&&i[s].test(r)){o=!0;break}o||"function"==typeof n[r]||(e[r]=n[r])}return e}r.prefixedPropREs={webkit:/(Movement[XY]|Radius[XY]|RotationAngle|Force)$/},t.exports=r},{}],49:[function(e,t,n){"use strict";var r=e("./hypot"),i=e("./browser"),o=e("./domObjects"),s=e("./domUtils"),a=e("./is"),l=e("./pointerExtend"),c={copyCoords:function(e,t){e.page=e.page||{},e.page.x=t.page.x,e.page.y=t.page.y,e.client=e.client||{},e.client.x=t.client.x,e.client.y=t.client.y,e.timeStamp=t.timeStamp},setCoordDeltas:function(e,t,n){e.page.x=n.page.x-t.page.x,e.page.y=n.page.y-t.page.y,e.client.x=n.client.x-t.client.x,e.client.y=n.client.y-t.client.y,e.timeStamp=n.timeStamp-t.timeStamp;var i=Math.max(e.timeStamp/1e3,.001);e.page.speed=r(e.page.x,e.page.y)/i,e.page.vx=e.page.x/i,e.page.vy=e.page.y/i,e.client.speed=r(e.client.x,e.page.y)/i,e.client.vx=e.client.x/i,e.client.vy=e.client.y/i},isNativePointer:function(e){return e instanceof o.Event||e instanceof o.Touch},getXY:function(e,t,n){return n=n||{},e=e||"page",n.x=t[e+"X"],n.y=t[e+"Y"],n},getPageXY:function(e,t){return t=t||{},i.isOperaMobile&&c.isNativePointer(e)?(c.getXY("screen",e,t),t.x+=window.scrollX,t.y+=window.scrollY):c.getXY("page",e,t),t},getClientXY:function(e,t){return t=t||{},i.isOperaMobile&&c.isNativePointer(e)?c.getXY("screen",e,t):c.getXY("client",e,t),t},getPointerId:function(e){return a.number(e.pointerId)?e.pointerId:e.identifier},setCoords:function(e,t,n){var r=t.length>1?c.pointerAverage(t):t[0],i={};c.getPageXY(r,i),e.page.x=i.x,e.page.y=i.y,c.getClientXY(r,i),e.client.x=i.x,e.client.y=i.y,e.timeStamp=a.number(n)?n:(new Date).getTime()},pointerExtend:l,getTouchPair:function(e){var t=[];return a.array(e)?(t[0]=e[0],t[1]=e[1]):"touchend"===e.type?1===e.touches.length?(t[0]=e.touches[0],t[1]=e.changedTouches[0]):0===e.touches.length&&(t[0]=e.changedTouches[0],t[1]=e.changedTouches[1]):(t[0]=e.touches[0],t[1]=e.touches[1]),t},pointerAverage:function(e){for(var t={pageX:0,pageY:0,clientX:0,clientY:0,screenX:0,screenY:0},n=e,r=Array.isArray(n),i=0,n=r?n:n[Symbol.iterator]();;){var o;if(r){if(i>=n.length)break;o=n[i++]}else{if(i=n.next(),i.done)break;o=i.value}var s=o;for(var a in t)t[a]+=s[a]}for(var l in t)t[l]/=e.length;return t},touchBBox:function(e){if(e.length||e.touches&&e.touches.length>1){var t=c.getTouchPair(e),n=Math.min(t[0].pageX,t[1].pageX),r=Math.min(t[0].pageY,t[1].pageY);return{x:n,y:r,left:n,top:r,width:Math.max(t[0].pageX,t[1].pageX)-n,height:Math.max(t[0].pageY,t[1].pageY)-r}}},touchDistance:function(e,t){var n=t+"X",i=t+"Y",o=c.getTouchPair(e),s=o[0][n]-o[1][n],a=o[0][i]-o[1][i];return r(s,a)},touchAngle:function(e,t,n){var r=n+"X",i=n+"Y",o=c.getTouchPair(e),s=o[1][r]-o[0][r],a=o[1][i]-o[0][i];return 180*Math.atan2(a,s)/Math.PI},getPointerType:function(e,t){return t.mouse?"mouse":i.supportsPointerEvent?a.string(e.pointerType)?e.pointerType:[void 0,void 0,"touch","pen","mouse"][e.pointerType]:"touch"},getEventTargets:function(e){return[s.getActualElement(e.path?e.path[0]:e.target),s.getActualElement(e.currentTarget)]}};t.exports=c},{"./browser":37,"./domObjects":38,"./domUtils":39,"./hypot":43,"./is":46,"./pointerExtend":48}],50:[function(e,t,n){"use strict";for(var r=e("./window"),i=r.window,o=["ms","moz","webkit","o"],s=0,a=void 0,l=void 0,c=0;c6&&void 0!==arguments[6]&&arguments[6];r(this,e);var f=t.target,v=(f&&f.options||s).deltaSource,g=o(f,p,l),h="start"===c,m="end"===c,y=h?t.startCoords:t.curCoords,x=t.prevEvent;p=p||t.element;var b=i({},y.page),w=i({},y.client);b.x-=g.x,b.y-=g.y,w.x-=g.x,w.y-=g.y,this.ctrlKey=n.ctrlKey,this.altKey=n.altKey,this.shiftKey=n.shiftKey,this.metaKey=n.metaKey,this.button=n.button,this.buttons=n.buttons,this.target=p,this.currentTarget=p,this.relatedTarget=u||null,this.preEnd=d,this.type=l+(c||""),this.interaction=t,this.interactable=f,this.t0=h?t.downTimes[t.downTimes.length-1]:x.t0;var E={interaction:t,event:n,action:l,phase:c,element:p,related:u,page:b,client:w,coords:y,starting:h,ending:m,deltaSource:v,iEvent:this};a.fire("set-xy",E),m?(this.pageX=x.pageX,this.pageY=x.pageY,this.clientX=x.clientX,this.clientY=x.clientY):(this.pageX=b.x,this.pageY=b.y,this.clientX=w.x,this.clientY=w.y),this.x0=t.startCoords.page.x-g.x,this.y0=t.startCoords.page.y-g.y,this.clientX0=t.startCoords.client.x-g.x,this.clientY0=t.startCoords.client.y-g.y,a.fire("set-delta",E),this.timeStamp=y.timeStamp,this.dt=t.pointerDelta.timeStamp,this.duration=this.timeStamp-this.t0,this.speed=t.pointerDelta[v].speed,this.velocityX=t.pointerDelta[v].vx,this.velocityY=t.pointerDelta[v].vy,this.swipe=m||"inertiastart"===c?this.getSwipe():null,a.fire("new",E)}return e.prototype.getSwipe=function(){var e=this.interaction;if(e.prevEvent.speed<600||this.timeStamp-e.prevEvent.timeStamp>150)return null;var t=180*Math.atan2(e.prevEvent.velocityY,e.prevEvent.velocityX)/Math.PI;t<0&&(t+=360);var n=112.5<=t&&t<247.5,r=202.5<=t&&t<337.5,i=!n&&(292.5<=t||t<67.5);return{up:r,down:!r&&22.5<=t&&t<157.5,left:n,right:i,angle:t,speed:e.prevEvent.speed,velocity:{x:e.prevEvent.velocityX,y:e.prevEvent.velocityY}}},e.prototype.preventDefault=function(){},e.prototype.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},e.prototype.stopPropagation=function(){this.propagationStopped=!0},e}();a.on("set-delta",function(e){var t=e.iEvent,n=e.interaction,r=e.starting,i=e.deltaSource,o=r?t:n.prevEvent;"client"===i?(t.dx=t.clientX-o.clientX,t.dy=t.clientY-o.clientY):(t.dx=t.pageX-o.pageX,t.dy=t.pageY-o.pageY)}),l.signals=a,t.exports=l},{"./defaultOptions":18,"./utils/Signals":35,"./utils/extend":41,"./utils/getOriginXY":42}],4:[function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=e("./utils/is"),o=e("./utils/events"),s=e("./utils/extend"),a=e("./actions/base"),l=e("./scope"),c=e("./Eventable"),p=e("./defaultOptions"),u=e("./utils/Signals").new(),d=e("./utils/domUtils"),f=d.getElementRect,v=d.nodeContains,g=d.trySelector,h=e("./utils/window"),m=h.getWindow,y=e("./utils/arr"),x=y.indexOf,b=y.contains,w=e("./utils/browser"),E=w.wheelEvent;l.interactables=[];var S=function(){function e(t,n){r(this,e),n=n||{},this.target=t,this.events=new c,this._context=n.context||l.document,this._win=m(g(t)?this._context:t),this._doc=this._win.document,u.fire("new",{target:t,options:n,interactable:this,win:this._win}),l.addDocument(this._doc,this._win),l.interactables.push(this),this.set(n)}return e.prototype.setOnEvents=function(e,t){var n="on"+e;return i.function(t.onstart)&&(this.events[n+"start"]=t.onstart),i.function(t.onmove)&&(this.events[n+"move"]=t.onmove),i.function(t.onend)&&(this.events[n+"end"]=t.onend),i.function(t.oninertiastart)&&(this.events[n+"inertiastart"]=t.oninertiastart),this},e.prototype.setPerAction=function(e,t){for(var n in t)n in p[e]&&(i.object(t[n])?(this.options[e][n]=s(this.options[e][n]||{},t[n]),i.object(p.perAction[n])&&"enabled"in p.perAction[n]&&(this.options[e][n].enabled=!1!==t[n].enabled)):i.bool(t[n])&&i.object(p.perAction[n])?this.options[e][n].enabled=t[n]:void 0!==t[n]&&(this.options[e][n]=t[n]))},e.prototype.getRect=function(e){return e=e||this.target,i.string(this.target)&&!i.element(e)&&(e=this._context.querySelector(this.target)),f(e)},e.prototype.rectChecker=function(e){return i.function(e)?(this.getRect=e,this):null===e?(delete this.options.getRect,this):this.getRect},e.prototype._backCompatOption=function(e,t){if(g(t)||i.object(t)){this.options[e]=t;for(var n=a.names,r=Array.isArray(n),o=0,n=r?n:n[Symbol.iterator]();;){var s;if(r){if(o>=n.length)break;s=n[o++]}else{if(o=n.next(),o.done)break;s=o.value}var l=s;this.options[l][e]=t}return this}return this.options[e]},e.prototype.origin=function(e){return this._backCompatOption("origin",e)},e.prototype.deltaSource=function(e){return"page"===e||"client"===e?(this.options.deltaSource=e,this):this.options.deltaSource},e.prototype.context=function(){return this._context},e.prototype.inContext=function(e){return this._context===e.ownerDocument||v(this._context,e)},e.prototype.fire=function(e){return this.events.fire(e),this},e.prototype._onOffMultiple=function(e,t,n,r){if(i.string(t)&&-1!==t.search(" ")&&(t=t.trim().split(/ +/)),i.array(t)){for(var o=0;o=l.length)break;f=l[d++]}else{if(d=l.next(),d.done)break;f=d.value}var v=f;this.options[v]=p.base[v],v in t&&this[v](t[v])}return u.fire("set",{options:t,interactable:this}),this},e.prototype.unset=function(){if(o.remove(this.target,"all"),i.string(this.target))for(var e in o.delegatedEvents){var t=o.delegatedEvents[e];t.selectors[0]===this.target&&t.contexts[0]===this._context&&(t.selectors.splice(0,1),t.contexts.splice(0,1),t.listeners.splice(0,1),t.selectors.length||(t[e]=null)),o.remove(this._context,e,o.delegateListener),o.remove(this._context,e,o.delegateUseCapture,!0)}else o.remove(this,"all");u.fire("unset",{interactable:this}),l.interactables.splice(x(l.interactables,this),1);for(var n=l.interactions||[],r=Array.isArray(n),s=0,n=r?n:n[Symbol.iterator]();;){var a;if(r){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var c=a;c.target===this&&c.interacting()&&c.stop()}return l.interact},e}();l.interactables.indexOfElement=function(e,t){t=t||l.document;for(var n=0;n=x.length)break;E=x[w++]}else{if(w=x.next(),w.done)break;E=w.value}var S=E,T=S[0],C=S[1];C._updateEventTargets(i,o),C[e](T,t,i,o)}}}function o(e){for(var t=0;te.pointerMoveTolerance);var a={pointer:t,pointerIndex:this.getPointerIndex(t),event:n,eventTarget:r,dx:o,dy:s,duplicate:i,interaction:this,interactingBeforeMove:this.interacting()};i||l.setCoordDeltas(this.pointerDelta,this.prevCoords,this.curCoords),f.fire("move",a),i||(this.interacting()&&this.doMove(a),this.pointerWasMoved&&l.copyCoords(this.prevCoords,this.curCoords))},e.prototype.doMove=function(e){e=l.extend({pointer:this.pointers[0],event:this.prevEvent,eventTarget:this._eventTarget,interaction:this},e||{}),f.fire("before-action-move",e),this._dontFireMove||f.fire("action-move",e),this._dontFireMove=!1},e.prototype.pointerUp=function(e,t,n,r){var i=this.getPointerIndex(e);f.fire(/cancel$/i.test(t.type)?"cancel":"up",{pointer:e,pointerIndex:i,event:t,eventTarget:n,curEventTarget:r,interaction:this}),this.simulation||this.end(t),this.pointerIsDown=!1,this.removePointer(e,t)},e.prototype.end=function(e){e=e||this.prevEvent,this.interacting()&&f.fire("action-end",{event:e,interaction:this}),this.stop()},e.prototype.currentAction=function(){return this._interacting?this.prepared.name:null},e.prototype.interacting=function(){return this._interacting},e.prototype.stop=function(){f.fire("stop",{interaction:this}),this._interacting&&(f.fire("stop-active",{interaction:this}),f.fire("stop-"+this.prepared.name,{interaction:this})),this.target=this.element=null,this._interacting=!1,this.prepared.name=this.prevEvent=null},e.prototype.getPointerIndex=function(e){return"mouse"===this.pointerType||"pen"===this.pointerType?0:l.indexOf(this.pointerIds,l.getPointerId(e))},e.prototype.updatePointer=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:t&&/(down|start)$/i.test(t.type),r=l.getPointerId(e),i=this.getPointerIndex(e);return-1===i&&(i=this.pointerIds.length,this.pointerIds[i]=r),n&&f.fire("update-pointer-down",{pointer:e,event:t,down:n,pointerId:r,pointerIndex:i,interaction:this}),this.pointers[i]=e,i},e.prototype.removePointer=function(e,t){var n=this.getPointerIndex(e);-1!==n&&(f.fire("remove-pointer",{pointer:e,event:t,pointerIndex:n,interaction:this}),this.pointers.splice(n,1),this.pointerIds.splice(n,1),this.downTargets.splice(n,1),this.downTimes.splice(n,1))},e.prototype._updateEventTargets=function(e,t){this._eventTarget=e,this._curEventTarget=t},e}(),y=0,x=g.length;y=i.length)break;a=i[s++]}else{if(s=i.next(),s.done)break;a=s.value}var l=a;if(l.options.drop.enabled){var c=l.options.drop.accept;if(!(p.is.element(c)&&c!==t||p.is.string(c)&&!p.matchesSelector(t,c)))for(var d=p.is.string(l.target)?l._context.querySelectorAll(l.target):[l.target],f=0;fo.left&&c.xo.top&&c.y=o.left&&v<=o.right&&g>=o.top&&g<=o.bottom}if(f&&p.is.number(a)){s=Math.max(0,Math.min(o.right,f.right)-Math.max(o.left,f.left))*Math.max(0,Math.min(o.bottom,f.bottom)-Math.max(o.top,f.top))/(f.width*f.height)>=a}return this.options.drop.checker&&(s=this.options.drop.checker(e,t,s,this,i,n,r)),s},v.signals.on("unset",function(e){e.interactable.dropzone(!1)}),v.settingsMethods.push("dropChecker"),g.signals.on("new",function(e){e.dropTarget=null,e.dropElement=null,e.prevDropTarget=null,e.prevDropElement=null,e.dropEvents=null,e.activeDrops={dropzones:[],elements:[],rects:[]}}),g.signals.on("stop",function(e){var t=e.interaction;t.dropTarget=t.dropElement=t.prevDropTarget=t.prevDropElement=null}),d.dynamicDrop=function(e){return p.is.bool(e)?(y=e,d):y},p.merge(v.eventTypes,["dragenter","dragleave","dropactivate","dropdeactivate","dropmove","drop"]),c.methodDict.drop="dropzone",h.drop=m.defaults,t.exports=m},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../interact":21,"../scope":34,"../utils":44,"./base":6}],9:[function(e,t,n){"use strict";var r=e("./base"),i=e("../utils"),o=e("../InteractEvent"),s=e("../Interactable"),a=e("../Interaction"),l=e("../defaultOptions"),c={defaults:{enabled:!1,origin:null,restrict:null},checker:function(e,t,n,r,i){return i.pointerIds.length>=2?{name:"gesture"}:null},getCursor:function(){return""}};o.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;"gesturestart"===t.type&&(t.ds=0,n.gesture.startDistance=n.gesture.prevDistance=t.distance,n.gesture.startAngle=n.gesture.prevAngle=t.angle,n.gesture.scale=1)}),o.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;"gesturemove"===t.type&&(t.ds=t.scale-n.gesture.scale,n.target.fire(t),n.gesture.prevAngle=t.angle,n.gesture.prevDistance=t.distance,t.scale===1/0||null===t.scale||void 0===t.scale||isNaN(t.scale)||(n.gesture.scale=t.scale))}),s.prototype.gesturable=function(e){return i.is.object(e)?(this.options.gesture.enabled=!1!==e.enabled,this.setPerAction("gesture",e),this.setOnEvents("gesture",e),this):i.is.bool(e)?(this.options.gesture.enabled=e,e||(this.ongesturestart=this.ongesturestart=this.ongestureend=null),this):this.options.gesture},o.signals.on("set-delta",function(e){var t=e.interaction,n=e.iEvent,r=e.action,s=e.event,a=e.starting,l=e.ending,c=e.deltaSource;if("gesture"===r){var p=t.pointers;n.touches=[p[0],p[1]],a?(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=1,n.ds=0,n.angle=i.touchAngle(p,void 0,c),n.da=0):l||s instanceof o?(n.distance=t.prevEvent.distance,n.box=t.prevEvent.box,n.scale=t.prevEvent.scale,n.ds=n.scale-1,n.angle=t.prevEvent.angle,n.da=n.angle-t.gesture.startAngle):(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=n.distance/t.gesture.startDistance,n.angle=i.touchAngle(p,t.gesture.prevAngle,c),n.ds=n.scale-t.gesture.prevScale,n.da=n.angle-t.gesture.prevAngle)}}),a.signals.on("new",function(e){e.gesture={start:{x:0,y:0},startDistance:0,prevDistance:0,distance:0,scale:1,startAngle:0,prevAngle:0}}),r.gesture=c,r.names.push("gesture"),i.merge(s.eventTypes,["gesturestart","gesturemove","gestureend"]),r.methodDict.gesture="gesturable",l.gesture=c.defaults,t.exports=c},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"./base":6}],10:[function(e,t,n){"use strict";function r(e,t,n,r,i,s,a){if(!t)return!1;if(!0===t){var l=o.is.number(s.width)?s.width:s.right-s.left,c=o.is.number(s.height)?s.height:s.bottom-s.top;if(l<0&&("left"===e?e="right":"right"===e&&(e="left")),c<0&&("top"===e?e="bottom":"bottom"===e&&(e="top")),"left"===e)return n.x<(l>=0?s.left:s.right)+a;if("top"===e)return n.y<(c>=0?s.top:s.bottom)+a;if("right"===e)return n.x>(l>=0?s.right:s.left)-a;if("bottom"===e)return n.y>(c>=0?s.bottom:s.top)-a}return!!o.is.element(r)&&(o.is.element(t)?t===r:o.matchesUpTo(r,t,i))}var i=e("./base"),o=e("../utils"),s=e("../utils/browser"),a=e("../InteractEvent"),l=e("../Interactable"),c=e("../Interaction"),p=e("../defaultOptions"),u=s.supportsTouch||s.supportsPointerEvent?20:10,d={defaults:{enabled:!1,mouseButtons:null,origin:null,snap:null,restrict:null,inertia:null,autoScroll:null,square:!1,preserveAspectRatio:!1,axis:"xy",margin:NaN,edges:null,invert:"none"},checker:function(e,t,n,i,s,a){if(!a)return null;var l=o.extend({},s.curCoords.page),c=n.options;if(c.resize.enabled){var p=c.resize,d={left:!1,right:!1,top:!1,bottom:!1};if(o.is.object(p.edges)){for(var f in d)d[f]=r(f,p.edges[f],l,s._eventTarget,i,a,p.margin||u);if(d.left=d.left&&!d.right,d.top=d.top&&!d.bottom,d.left||d.right||d.top||d.bottom)return{name:"resize",edges:d}}else{var v="y"!==c.resize.axis&&l.x>a.right-u,g="x"!==c.resize.axis&&l.y>a.bottom-u;if(v||g)return{name:"resize",axes:(v?"x":"")+(g?"y":"")}}}return null},cursors:s.isIe9OrOlder?{x:"e-resize",y:"s-resize",xy:"se-resize",top:"n-resize",left:"w-resize",bottom:"s-resize",right:"e-resize",topleft:"se-resize",bottomright:"se-resize",topright:"ne-resize",bottomleft:"ne-resize"}:{x:"ew-resize",y:"ns-resize",xy:"nwse-resize",top:"ns-resize",left:"ew-resize",bottom:"ns-resize",right:"ew-resize",topleft:"nwse-resize",bottomright:"nwse-resize",topright:"nesw-resize",bottomleft:"nesw-resize"},getCursor:function(e){if(e.axis)return d.cursors[e.name+e.axis];if(e.edges){for(var t="",n=["top","bottom","left","right"],r=0;r<4;r++)e.edges[n[r]]&&(t+=n[r]);return d.cursors[t]}}};a.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;if("resizestart"===t.type&&n.prepared.edges){var r=n.target.getRect(n.element),i=n.target.options.resize;if(i.square||i.preserveAspectRatio){var s=o.extend({},n.prepared.edges);s.top=s.top||s.left&&!s.bottom,s.left=s.left||s.top&&!s.right,s.bottom=s.bottom||s.right&&!s.top,s.right=s.right||s.bottom&&!s.left,n.prepared._linkedEdges=s}else n.prepared._linkedEdges=null;i.preserveAspectRatio&&(n.resizeStartAspectRatio=r.width/r.height),n.resizeRects={start:r,current:o.extend({},r),inverted:o.extend({},r),previous:o.extend({},r),delta:{left:0,right:0,width:0,top:0,bottom:0,height:0}},t.rect=n.resizeRects.inverted,t.deltaRect=n.resizeRects.delta}}),a.signals.on("new",function(e){var t=e.iEvent,n=e.phase,r=e.interaction;if("move"===n&&r.prepared.edges){var i=r.target.options.resize,s=i.invert,a="reposition"===s||"negate"===s,l=r.prepared.edges,c=r.resizeRects.start,p=r.resizeRects.current,u=r.resizeRects.inverted,d=r.resizeRects.delta,f=o.extend(r.resizeRects.previous,u),v=l,g=t.dx,h=t.dy;if(i.preserveAspectRatio||i.square){var m=i.preserveAspectRatio?r.resizeStartAspectRatio:1;l=r.prepared._linkedEdges,v.left&&v.bottom||v.right&&v.top?h=-g/m:v.left||v.right?h=g/m:(v.top||v.bottom)&&(g=h*m)}if(l.top&&(p.top+=h),l.bottom&&(p.bottom+=h),l.left&&(p.left+=g),l.right&&(p.right+=g),a){if(o.extend(u,p),"reposition"===s){var y=void 0;u.top>u.bottom&&(y=u.top,u.top=u.bottom,u.bottom=y),u.left>u.right&&(y=u.left,u.left=u.right,u.right=y)}}else u.top=Math.min(p.top,c.bottom),u.bottom=Math.max(p.bottom,c.top),u.left=Math.min(p.left,c.right),u.right=Math.max(p.right,c.left);u.width=u.right-u.left,u.height=u.bottom-u.top;for(var x in u)d[x]=u[x]-f[x];t.edges=r.prepared.edges,t.rect=u,t.deltaRect=d}}),l.prototype.resizable=function(e){return o.is.object(e)?(this.options.resize.enabled=!1!==e.enabled,this.setPerAction("resize",e),this.setOnEvents("resize",e),/^x$|^y$|^xy$/.test(e.axis)?this.options.resize.axis=e.axis:null===e.axis&&(this.options.resize.axis=p.resize.axis),o.is.bool(e.preserveAspectRatio)?this.options.resize.preserveAspectRatio=e.preserveAspectRatio:o.is.bool(e.square)&&(this.options.resize.square=e.square),this):o.is.bool(e)?(this.options.resize.enabled=e, +e||(this.onresizestart=this.onresizestart=this.onresizeend=null),this):this.options.resize},c.signals.on("new",function(e){e.resizeAxes="xy"}),a.signals.on("set-delta",function(e){var t=e.interaction,n=e.iEvent;"resize"===e.action&&t.resizeAxes&&(t.target.options.resize.square?("y"===t.resizeAxes?n.dx=n.dy:n.dy=n.dx,n.axes="xy"):(n.axes=t.resizeAxes,"x"===t.resizeAxes?n.dy=0:"y"===t.resizeAxes&&(n.dx=0)))}),i.resize=d,i.names.push("resize"),o.merge(l.eventTypes,["resizestart","resizemove","resizeinertiastart","resizeinertiaresume","resizeend"]),i.methodDict.resize="resizable",p.resize=d.defaults,t.exports=d},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"../utils/browser":37,"./base":6}],11:[function(e,t,n){"use strict";var r=e("./utils/raf"),i=e("./utils/window").getWindow,o=e("./utils/is"),s=e("./utils/domUtils"),a=e("./Interaction"),l=e("./defaultOptions"),c={defaults:{enabled:!1,container:null,margin:60,speed:300},interaction:null,i:null,x:0,y:0,isScrolling:!1,prevTime:0,start:function(e){c.isScrolling=!0,r.cancel(c.i),c.interaction=e,c.prevTime=(new Date).getTime(),c.i=r.request(c.scroll)},stop:function(){c.isScrolling=!1,r.cancel(c.i)},scroll:function(){var e=c.interaction.target.options[c.interaction.prepared.name].autoScroll,t=e.container||i(c.interaction.element),n=(new Date).getTime(),s=(n-c.prevTime)/1e3,a=e.speed*s;a>=1&&(o.window(t)?t.scrollBy(c.x*a,c.y*a):t&&(t.scrollLeft+=c.x*a,t.scrollTop+=c.y*a),c.prevTime=n),c.isScrolling&&(r.cancel(c.i),c.i=r.request(c.scroll))},check:function(e,t){var n=e.options;return n[t].autoScroll&&n[t].autoScroll.enabled},onInteractionMove:function(e){var t=e.interaction,n=e.pointer;if(t.interacting()&&c.check(t.target,t.prepared.name)){if(t.simulation)return void(c.x=c.y=0);var r=void 0,a=void 0,l=void 0,p=void 0,u=t.target.options[t.prepared.name].autoScroll,d=u.container||i(t.element);if(o.window(d))p=n.clientXd.innerWidth-c.margin,l=n.clientY>d.innerHeight-c.margin;else{var f=s.getElementClientRect(d);p=n.clientXf.right-c.margin,l=n.clientY>f.bottom-c.margin}c.x=a?1:p?-1:0,c.y=l?1:r?-1:0,c.isScrolling||(c.margin=u.margin,c.speed=u.speed,c.start(t))}}};a.signals.on("stop-active",function(){c.stop()}),a.signals.on("action-move",c.onInteractionMove),l.perAction.autoScroll=c.defaults,t.exports=c},{"./Interaction":5,"./defaultOptions":18,"./utils/domUtils":39,"./utils/is":46,"./utils/raf":50,"./utils/window":52}],12:[function(e,t,n){"use strict";var r=e("../Interactable"),i=e("../actions/base"),o=e("../utils/is"),s=e("../utils/domUtils");r.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},r.prototype.ignoreFrom=function(e){return this._backCompatOption("ignoreFrom",e)},r.prototype.allowFrom=function(e){return this._backCompatOption("allowFrom",e)},r.prototype.testIgnore=function(e,t,n){return!(!e||!o.element(n))&&(o.string(e)?s.matchesUpTo(n,e,t):!!o.element(e)&&s.nodeContains(e,n))},r.prototype.testAllow=function(e,t,n){return!e||!!o.element(n)&&(o.string(e)?s.matchesUpTo(n,e,t):!!o.element(e)&&s.nodeContains(e,n))},r.prototype.testIgnoreAllow=function(e,t,n){return!this.testIgnore(e.ignoreFrom,t,n)&&this.testAllow(e.allowFrom,t,n)},r.prototype.actionChecker=function(e){return o.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},r.prototype.styleCursor=function(e){return o.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},r.prototype.defaultActionChecker=function(e,t,n,r){for(var o=this.getRect(r),s=null,a=i.names,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var u=p;if((!n.pointerIsDown||!n.mouse||0!=(t.buttons&this.options[u].mouseButtons))&&(s=i[u].checker(e,t,this,r,n,o)))return s}}},{"../Interactable":4,"../actions/base":6,"../utils/domUtils":39,"../utils/is":46}],13:[function(e,t,n){"use strict";function r(e,t,n,r){return g.is.object(e)&&t.testIgnoreAllow(t.options[e.name],n,r)&&t.options[e.name].enabled&&a(t,n,e)?e:null}function i(e,t,n,i,o,s){for(var a=0,l=i.length;a=m.maxInteractions)return!1;if(u.target===e){if((a+=d===n.name|0)>=i)return!1;if(u.element===t&&(l++,d!==n.name||l>=o))return!1}}}return m.maxInteractions>0}}var l=e("../interact"),c=e("../Interactable"),p=e("../Interaction"),u=e("../actions/base"),d=e("../defaultOptions"),f=e("../utils/browser"),v=e("../scope"),g=e("../utils"),h=e("../utils/Signals").new();e("./InteractableMethods");var m={signals:h,withinInteractionLimit:a,maxInteractions:1/0,defaults:{perAction:{manualStart:!1,max:1/0,maxPerElement:1,allowFrom:null,ignoreFrom:null}},setActionDefaults:function(e){g.extend(e.defaults,m.defaults.perAction)}};p.signals.on("down",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;if(!t.interacting()){s(t,o(t,n,r,i))}}),p.signals.on("move",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;if(t.mouse&&!t.pointerIsDown&&!t.interacting()){s(t,o(t,n,r,i))}}),p.signals.on("move",function(e){var t=e.interaction,n=e.event;if(t.pointerIsDown&&!t.interacting()&&t.pointerWasMoved&&t.prepared.name){h.fire("before-start",e);var r=t.target;t.prepared.name&&r&&(r.options[t.prepared.name].manualStart||!a(r,t.element,t.prepared)?t.stop(n):t.start(t.prepared,r,t.element))}}),p.signals.on("stop",function(e){var t=e.interaction,n=t.target;n&&n.options.styleCursor&&(n._doc.documentElement.style.cursor="")}),c.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},c.prototype.actionChecker=function(e){return g.is.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},c.prototype.styleCursor=function(e){return g.is.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},c.prototype.defaultActionChecker=function(e,t,n,r){for(var i=this.getRect(r),o=t.buttons||{0:1,1:4,3:8,4:16}[t.button],s=null,a=u.names,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var d=p;if((!n.pointerIsDown||!n.mouse||0!=(o&this.options[d].mouseButtons))&&(s=u[d].checker(e,t,this,r,n,i)))return s}},l.maxInteractions=function(e){return g.is.number(e)?(m.maxInteractions=e,this):m.maxInteractions},c.settingsMethods.push("styleCursor"),c.settingsMethods.push("actionChecker"),c.settingsMethods.push("ignoreFrom"),c.settingsMethods.push("allowFrom"),d.base.actionChecker=null,d.base.styleCursor=!0,g.extend(d.perAction,m.defaults.perAction),t.exports=m},{"../Interactable":4,"../Interaction":5,"../actions/base":6,"../defaultOptions":18,"../interact":21,"../scope":34,"../utils":44,"../utils/Signals":35,"../utils/browser":37,"./InteractableMethods":12}],14:[function(e,t,n){"use strict";var r=e("./base"),i=e("../Interaction");i.signals.on("new",function(e){e.delayTimer=null}),r.signals.on("prepared",function(e){var t=e.interaction,n=t.prepared.name;if(n){var r=t.target.options[n].delay;r>0&&(t.delayTimer=setTimeout(function(){t.start(t.prepared,t.target,t.element)},r))}}),i.signals.on("move",function(e){var t=e.interaction,n=e.duplicate;t.pointerWasMoved&&!n&&clearTimeout(t.delayTimer)}),r.signals.on("before-start",function(e){var t=e.interaction,n=t.prepared.name;if(n){t.target.options[n].delay>0&&(t.prepared.name=null)}})},{"../Interaction":5,"./base":13}],15:[function(e,t,n){"use strict";function r(e,t){if(!t)return!1;var n=t.options.drag.startAxis;return"xy"===e||"xy"===n||n===e}var i=e("./base"),o=e("../scope"),s=e("../utils/browser"),a=e("../utils/is"),l=e("../utils/domUtils"),c=l.matchesSelector,p=l.parentNode;i.setActionDefaults(e("../actions/drag")),i.signals.on("before-start",function(e){var t=e.interaction,n=e.eventTarget,l=e.dx,u=e.dy;if("drag"===t.prepared.name){var d=Math.abs(l),f=Math.abs(u),v=t.target.options.drag,g=v.startAxis,h=d>f?"x":dl.minSpeed&&g>l.endSpeed,b={interaction:t,pageCoords:v,statuses:f,preEnd:!0,requireEndOnly:!0};y&&!x&&(c.resetStatuses(f),m=c.setAll(b),m.shouldMove&&m.locked&&(h=!0)),(x||h)&&(p.copyCoords(i.upCoords,t.curCoords),t.pointers[0]=i.startEvent=new a(t,n,t.prepared.name,"inertiastart",t.element),i.t0=d,i.active=!0,i.allowResume=l.allowResume,t.simulation=i,o.fire(i.startEvent),x?(i.vx0=t.pointerDelta.client.vx,i.vy0=t.pointerDelta.client.vy,i.v0=g,r(t,i),p.extend(v,t.curCoords.page),v.x+=i.xe,v.y+=i.ye,c.resetStatuses(f),m=c.setAll(b),i.modifiedXe+=m.dx,i.modifiedYe+=m.dy,i.i=u.request(t.boundInertiaFrame)):(i.smoothEnd=!0,i.xe=m.dx,i.ye=m.dy,i.sx=i.sy=0,i.i=u.request(t.boundSmoothEndFrame)))}}),l.signals.on("stop-active",function(e){var t=e.interaction,n=t.inertiaStatus;n.active&&(u.cancel(n.i),n.active=!1,t.simulation=null)})},{"./InteractEvent":3,"./Interaction":5,"./modifiers":24,"./utils":44,"./utils/raf":50}],21:[function(e,t,n){"use strict";function r(e,t){var n=a.interactables.get(e,t);return n||(n=new l(e,t),n.events.global=p),n}var i=e("./utils/browser"),o=e("./utils/events"),s=e("./utils"),a=e("./scope"),l=e("./Interactable"),c=e("./Interaction"),p={};r.isSet=function(e,t){return-1!==a.interactables.indexOfElement(e,t&&t.context)},r.on=function(e,t,n){if(s.is.string(e)&&-1!==e.search(" ")&&(e=e.trim().split(/ +/)),s.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.on(f,t,n)}return r}if(s.is.object(e)){for(var v in e)r.on(v,e[v],t);return r}return s.contains(l.eventTypes,e)?p[e]?p[e].push(t):p[e]=[t]:o.add(a.document,e,t,{options:n}),r},r.off=function(e,t,n){if(s.is.string(e)&&-1!==e.search(" ")&&(e=e.trim().split(/ +/)),s.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.off(f,t,n)}return r}if(s.is.object(e)){for(var v in e)r.off(v,e[v],t);return r}if(s.contains(l.eventTypes,e)){var g=void 0;e in p&&-1!==(g=s.indexOf(p[e],t))&&p[e].splice(g,1)}else o.remove(a.document,e,t,n);return r},r.debug=function(){return a},r.getPointerAverage=s.pointerAverage,r.getTouchBBox=s.touchBBox,r.getTouchDistance=s.touchDistance,r.getTouchAngle=s.touchAngle,r.getElementRect=s.getElementRect,r.getElementClientRect=s.getElementClientRect,r.matchesSelector=s.matchesSelector,r.closest=s.closest,r.supportsTouch=function(){return i.supportsTouch},r.supportsPointerEvent=function(){return i.supportsPointerEvent},r.stop=function(e){for(var t=a.interactions.length-1;t>=0;t--)a.interactions[t].stop(e);return r},r.pointerMoveTolerance=function(e){return s.is.number(e)?(c.pointerMoveTolerance=e,this):c.pointerMoveTolerance},r.addDocument=a.addDocument,r.removeDocument=a.removeDocument,a.interact=r,t.exports=r},{"./Interactable":4,"./Interaction":5,"./scope":34,"./utils":44,"./utils/browser":37,"./utils/events":40}],22:[function(e,t,n){"use strict";function r(e){var t=e.interaction,n=e.event;t.target&&t.target.checkAndPreventDefault(n)}var i=e("./Interactable"),o=e("./Interaction"),s=e("./scope"),a=e("./utils/is"),l=e("./utils/events"),c=e("./utils/domUtils"),p=c.nodeContains,u=c.matchesSelector;i.prototype.preventDefault=function(e){return/^(always|never|auto)$/.test(e)?(this.options.preventDefault=e,this):a.bool(e)?(this.options.preventDefault=e?"always":"never",this):this.options.preventDefault},i.prototype.checkAndPreventDefault=function(e){var t=this.options.preventDefault;if("never"!==t)return"always"===t?void e.preventDefault():void(l.supportsOptions||/^(mouse|pointer|touch)*(down|start)/i.test(e.type)||a.element(e.target)&&u(e.target,"input,select,textarea,[contenteditable=true],[contenteditable=true] *")||e.preventDefault())};for(var d=["down","move","up","cancel"],f=0;f=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i;if(o.element&&(o.element===e.target||p(o.element,e.target)))return void o.target.checkAndPreventDefault(e)}}},{"./Interactable":4,"./Interaction":5,"./scope":34,"./utils/domUtils":39,"./utils/events":40,"./utils/is":46}],23:[function(e,t,n){"use strict";function r(e){var t=e.target,n=a.search(e,e.type,t);n&&n.prevTap&&e.clientX===n.prevTap.clientX&&e.clientY===n.prevTap.clientY&&t===n.prevTap.target&&(n.downTargets[0]=t,n.downTimes[0]=(new Date).getTime(),l.fire({interaction:n,event:e,eventTarget:t,pointer:e,type:"tap"}))}var i=e("./scope"),o=e("./utils/events"),s=e("./utils/browser"),a=e("./utils/interactionFinder"),l=e("./pointerEvents/base"),c=e("./utils/window"),p=c.window,u=Object.prototype.toString;if(p.Array.isArray||(p.Array.isArray=function(e){return"[object Array]"===u.call(e)}),String.prototype.trim||(String.prototype.trim=function(){return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")}),s.isIE8){var d=function(e){for(var t=i.interactions,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var o;if(n){if(r>=t.length)break;o=t[r++]}else{if(r=t.next(),r.done)break;o=r.value}var s=o;s.interacting()&&s.target.checkAndPreventDefault(e)}},f=function(e,t){var n=e.doc,i=(e.win,0===t.indexOf("listen")?o.add:o.remove);i(n,"selectstart",d),l&&i(n,"dblclick",r)};i.signals.on("add-document",f),i.signals.on("remove-document",f)}t.exports=null},{"./pointerEvents/base":31,"./scope":34,"./utils/browser":37,"./utils/events":40,"./utils/interactionFinder":45,"./utils/window":52}],24:[function(e,t,n){"use strict";function r(e,t,n){return e&&e.enabled&&(t||!e.endOnly)&&(!n||e.endOnly)}var i=e("../InteractEvent"),o=e("../Interaction"),s=e("../utils/extend"),a={names:[],setOffsets:function(e){var t=e.interaction,n=e.pageCoords,r=t.target,i=t.element,o=t.startOffset,s=r.getRect(i);s?(o.left=n.x-s.left,o.top=n.y-s.top,o.right=s.right-n.x,o.bottom=s.bottom-n.y,"width"in s||(s.width=s.right-s.left),"height"in s||(s.height=s.bottom-s.top)):o.left=o.top=o.right=o.bottom=0,e.rect=s,e.interactable=r,e.element=i;for(var l=0;l=p.length)break;f=p[d++]}else{if(d=p.next(),d.done)break;f=d.value}var v=f,g=a[v],h=t.target.options[t.prepared.name][v];r(h,i,o)&&(e.status=e.status=n[v],e.options=h,e.offset=e.interaction.modifierOffsets[v],g.set(e),e.status.locked&&(l.x+=e.status.dx,l.y+=e.status.dy,c.dx+=e.status.dx,c.dy+=e.status.dy,c.locked=!0))}return c.shouldMove=!e.status||!c.locked||e.status.changed,c},resetStatuses:function(e){for(var t=a.names,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var i;if(n){if(r>=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i,s=e[o]||{};s.dx=s.dy=0,s.modifiedX=s.modifiedY=NaN,s.locked=!1,s.changed=!0,e[o]=s}return e},start:function(e,t){var n=e.interaction,r={interaction:n,pageCoords:("action-resume"===t?n.curCoords:n.startCoords).page,startOffset:n.startOffset,statuses:n.modifierStatuses,preEnd:!1,requireEndOnly:!1};a.setOffsets(r),a.resetStatuses(r.statuses),r.pageCoords=s({},n.startCoords.page),n.modifierResult=a.setAll(r)}};o.signals.on("new",function(e){e.startOffset={left:0,right:0,top:0,bottom:0},e.modifierOffsets={},e.modifierStatuses=a.resetStatuses({}),e.modifierResult=null}),o.signals.on("action-start",a.start),o.signals.on("action-resume",a.start),o.signals.on("before-action-move",function(e){var t=e.interaction,n=e.preEnd,r=e.interactingBeforeMove,i=a.setAll({interaction:t,preEnd:n,pageCoords:t.curCoords.page,statuses:t.modifierStatuses,requireEndOnly:!1});!i.shouldMove&&r&&(t._dontFireMove=!0),t.modifierResult=i}),o.signals.on("action-end",function(e){for(var t=e.interaction,n=e.event,i=0;i=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}var m=h,y=m.x,x=m.y;l.push({x:s.left-i.width*y+u.x,y:s.top-i.height*x+u.y})}else l.push(u);return l},set:function(e){var t=e.interaction,n=e.pageCoords,r=e.status,i=e.options,s=e.offset,a=[],l=void 0,c=void 0,p=void 0;if(r.useStatusXY)c={x:r.x,y:r.y};else{var u=o.getOriginXY(t.target,t.element,t.prepared.name);c=o.extend({},n),c.x-=u.x,c.y-=u.y}r.realX=c.x,r.realY=c.y;for(var d=i.targets?i.targets.length:0,f=s,v=Array.isArray(f),g=0,f=v?f:f[Symbol.iterator]();;){var h;if(v){if(g>=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}for(var m=h,y=m.x,x=m.y,b=c.x-y,w=c.y-x,E=i.targets,S=Array.isArray(E),T=0,E=S?E:E[Symbol.iterator]();;){var C;if(S){if(T>=E.length)break;C=E[T++]}else{if(T=E.next(),T.done)break;C=T.value}var A=C;l=o.is.function(A)?A(b,w,t):A,l&&a.push({x:o.is.number(l.x)?l.x+y:b,y:o.is.number(l.y)?l.y+x:w,range:o.is.number(l.range)?l.range:i.range})}}var D={target:null,inRange:!1,distance:0,range:0,dx:0,dy:0};for(p=0,d=a.length;p=p.length)break;f=p[d++]}else{if(d=p.next(),d.done)break;f=d.value}var v=f,g=void 0;g=a.is.function(v)?v(l,c,t):v,g&&("width"in g&&"height"in g&&(g.x=g.width, +g.y=g.height),e.options.targets.push(g))}i.set(e)},modifyCoords:function(e){var t=e.options;e.options=a.extend({},t),e.options.enabled=t.enabled,e.options.relativePoints=[null],i.modifyCoords(e)}};r.snapSize=l,r.names.push("snapSize"),o.perAction.snapSize=l.defaults,s.defaults.snapSize=l.defaults,t.exports=l},{"../actions/resize":10,"../defaultOptions":18,"../utils/":44,"./index":24,"./snap":28}],30:[function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=e("../utils/pointerUtils");t.exports=function(){function e(t,n,o,s,a){if(r(this,e),i.pointerExtend(this,o),o!==n&&i.pointerExtend(this,n),this.interaction=a,this.timeStamp=(new Date).getTime(),this.originalEvent=o,this.type=t,this.pointerId=i.getPointerId(n),this.pointerType=i.getPointerType(n),this.target=s,this.currentTarget=null,"tap"===t){var l=a.getPointerIndex(n);this.dt=this.timeStamp-a.downTimes[l];var c=this.timeStamp-a.tapTime;this.double=!!(a.prevTap&&"doubletap"!==a.prevTap.type&&a.prevTap.target===this.target&&c<500)}else"doubletap"===t&&(this.dt=n.timeStamp-a.tapTime)}return e.prototype.subtractOrigin=function(e){var t=e.x,n=e.y;return this.pageX-=t,this.pageY-=n,this.clientX-=t,this.clientY-=n,this},e.prototype.addOrigin=function(e){var t=e.x,n=e.y;return this.pageX+=t,this.pageY+=n,this.clientX+=t,this.clientY+=n,this},e.prototype.preventDefault=function(){this.originalEvent.preventDefault()},e.prototype.stopPropagation=function(){this.propagationStopped=!0},e.prototype.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},e}()},{"../utils/pointerUtils":49}],31:[function(e,t,n){"use strict";function r(e){for(var t=e.interaction,n=e.pointer,s=e.event,l=e.eventTarget,c=e.type,u=void 0===c?e.pointerEvent.type:c,d=e.targets,f=void 0===d?i(e):d,v=e.pointerEvent,g=void 0===v?new o(u,n,s,l,t):v,h={interaction:t,pointer:n,event:s,eventTarget:l,targets:f,type:u,pointerEvent:g},m=0;m=u.length)break;g=u[v++]}else{if(v=u.next(),v.done)break;g=v.value}var h=g;c.element=h,p.fire("collect-targets",c)}return"hold"===o&&(c.targets=d(c.targets,function(e){return e.eventable.options.holdDuration===t.holdTimers[s].duration})),c.targets}var o=e("./PointerEvent"),s=e("../Interaction"),a=e("../utils"),l=e("../utils/browser"),c=e("../defaultOptions"),p=e("../utils/Signals").new(),u=e("../utils/arr"),d=u.filter,f=["down","up","cancel"],v=["down","up","cancel"],g={PointerEvent:o,fire:r,collectEventTargets:i,signals:p,defaults:{holdDuration:600,ignoreFrom:null,allowFrom:null,origin:{x:0,y:0}},types:["down","move","up","cancel","tap","doubletap","hold"]};s.signals.on("update-pointer-down",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers[n]={duration:1/0,timeout:null}}),s.signals.on("remove-pointer",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers.splice(n,1)}),s.signals.on("move",function(e){var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,s=e.duplicateMove,a=t.getPointerIndex(n);s||t.pointerIsDown&&!t.pointerWasMoved||(t.pointerIsDown&&clearTimeout(t.holdTimers[a].timeout),r({interaction:t,pointer:n,event:i,eventTarget:o,type:"move"}))}),s.signals.on("down",function(e){for(var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,s=e.pointerIndex,c=l.isIE8?a.extend({},i):i,u=t.holdTimers[s],d=a.getPath(o),f={interaction:t,pointer:n,event:i,eventTarget:o,type:"hold",targets:[],path:d,element:null},v=d,g=Array.isArray(v),h=0,v=g?v:v[Symbol.iterator]();;){var m;if(g){if(h>=v.length)break;m=v[h++]}else{if(h=v.next(),h.done)break;m=h.value}var y=m;f.element=y,p.fire("collect-targets",f)}if(f.targets.length){for(var x=1/0,b=0;b=0&&(p.selectors[u]!==e||p.contexts[u]!==t);u--);-1===u&&(u=p.selectors.length,p.selectors.push(e),p.contexts.push(t),p.listeners.push([])),p.listeners[u].push([i,!!s.capture,s.passive])}function s(e,t,n,r,o){var s=f(o),c=O[n],p=!1,u=void 0;if(c)for(u=c.selectors.length-1;u>=0;u--)if(c.selectors[u]===e&&c.contexts[u]===t){for(var d=c.listeners[u],v=d.length-1;v>=0;v--){var g=d[v],h=g[0],m=g[1],y=g[2];if(h===r&&m===!!s.capture&&y===s.passive){d.splice(v,1),d.length||(c.selectors.splice(u,1),c.contexts.splice(u,1),c.listeners.splice(u,1),i(t,n,a),i(t,n,l,!0),c.selectors.length||(O[n]=null)),p=!0;break}}if(p)break}}function a(e,t){var n=f(t),r={},i=O[e.type],o=g.getActualElement(e.path?e.path[0]:e.target),s=o;for(h(r,e),r.originalEvent=e,r.preventDefault=p;v.element(s);){for(var a=0;a=l.length)break;u=l[p++]}else{if(p=l.next(),p.done)break;u=p.value}var d=u,f=o[d](a);if(f)return f}},simulationResume:function(e){var t=e.pointerType,n=e.eventType,o=e.eventTarget;if(!/down|start/i.test(n))return null;for(var s=r.interactions,a=Array.isArray(s),l=0,s=a?s:s[Symbol.iterator]();;){var c;if(a){if(l>=s.length)break;c=s[l++]}else{if(l=s.next(),l.done)break;c=l.value}var p=c,u=o;if(p.simulation&&p.simulation.allowResume&&p.pointerType===t)for(;u;){if(u===p.element)return p;u=i.parentNode(u)}}return null},mouseOrPen:function(e){var t=e.pointerId,n=e.pointerType,o=e.eventType;if("mouse"!==n&&"pen"!==n)return null;for(var s=void 0,a=r.interactions,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var u=p;if(u.pointerType===n){if(u.simulation&&!i.contains(u.pointerIds,t))continue;if(u.interacting())return u;s||(s=u)}}if(s)return s;for(var d=r.interactions,f=Array.isArray(d),v=0,d=f?d:d[Symbol.iterator]();;){var g;if(f){if(v>=d.length)break;g=d[v++]}else{if(v=d.next(),v.done)break;g=v.value}var h=g;if(!(h.pointerType!==n||/down/i.test(o)&&h.simulation))return h}return null},hasPointer:function(e){for(var t=e.pointerId,n=r.interactions,o=Array.isArray(n),s=0,n=o?n:n[Symbol.iterator]();;){var a;if(o){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var l=a;if(i.contains(l.pointerIds,t))return l}},idle:function(e){for(var t=e.pointerType,n=r.interactions,i=Array.isArray(n),o=0,n=i?n:n[Symbol.iterator]();;){var s;if(i){if(o>=n.length)break;s=n[o++]}else{if(o=n.next(),o.done)break;s=o.value}var a=s;if(1===a.pointerIds.length){var l=a.target;if(l&&!l.options.gesture.enabled)continue}else if(a.pointerIds.length>=2)continue;if(!a.interacting()&&t===a.pointerType)return a}return null}};t.exports=o},{"../scope":34,"./index":44}],46:[function(e,t,n){"use strict";var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},i=e("./window"),o=e("./isWindow"),s={array:function(){},window:function(e){return e===i.window||o(e)},docFrag:function(e){return s.object(e)&&11===e.nodeType},object:function(e){return!!e&&"object"===(void 0===e?"undefined":r(e))},function:function(e){return"function"==typeof e},number:function(e){return"number"==typeof e},bool:function(e){return"boolean"==typeof e},string:function(e){return"string"==typeof e},element:function(e){if(!e||"object"!==(void 0===e?"undefined":r(e)))return!1;var t=i.getWindow(e)||i.window;return/object|function/.test(r(t.Element))?e instanceof t.Element:1===e.nodeType&&"string"==typeof e.nodeName}};s.array=function(e){return s.object(e)&&void 0!==e.length&&s.function(e.splice)},t.exports=s},{"./isWindow":47,"./window":52}],47:[function(e,t,n){"use strict";t.exports=function(e){return!(!e||!e.Window)&&e instanceof e.Window}},{}],48:[function(e,t,n){"use strict";function r(e,n){for(var r in n){var i=t.exports.prefixedPropREs,o=!1;for(var s in i)if(0===r.indexOf(s)&&i[s].test(r)){o=!0;break}o||"function"==typeof n[r]||(e[r]=n[r])}return e}r.prefixedPropREs={webkit:/(Movement[XY]|Radius[XY]|RotationAngle|Force)$/},t.exports=r},{}],49:[function(e,t,n){"use strict";var r=e("./hypot"),i=e("./browser"),o=e("./domObjects"),s=e("./domUtils"),a=e("./domObjects"),l=e("./is"),c=e("./pointerExtend"),p={copyCoords:function(e,t){e.page=e.page||{},e.page.x=t.page.x,e.page.y=t.page.y,e.client=e.client||{},e.client.x=t.client.x,e.client.y=t.client.y,e.timeStamp=t.timeStamp},setCoordDeltas:function(e,t,n){e.page.x=n.page.x-t.page.x,e.page.y=n.page.y-t.page.y,e.client.x=n.client.x-t.client.x,e.client.y=n.client.y-t.client.y,e.timeStamp=n.timeStamp-t.timeStamp;var i=Math.max(e.timeStamp/1e3,.001);e.page.speed=r(e.page.x,e.page.y)/i,e.page.vx=e.page.x/i,e.page.vy=e.page.y/i,e.client.speed=r(e.client.x,e.page.y)/i,e.client.vx=e.client.x/i,e.client.vy=e.client.y/i},isNativePointer:function(e){return e instanceof o.Event||e instanceof o.Touch},getXY:function(e,t,n){return n=n||{},e=e||"page",n.x=t[e+"X"],n.y=t[e+"Y"],n},getPageXY:function(e,t){return t=t||{},i.isOperaMobile&&p.isNativePointer(e)?(p.getXY("screen",e,t),t.x+=window.scrollX,t.y+=window.scrollY):p.getXY("page",e,t),t},getClientXY:function(e,t){return t=t||{},i.isOperaMobile&&p.isNativePointer(e)?p.getXY("screen",e,t):p.getXY("client",e,t),t},getPointerId:function(e){return l.number(e.pointerId)?e.pointerId:e.identifier},setCoords:function(e,t,n){var r=t.length>1?p.pointerAverage(t):t[0],i={};p.getPageXY(r,i),e.page.x=i.x,e.page.y=i.y,p.getClientXY(r,i),e.client.x=i.x,e.client.y=i.y,e.timeStamp=l.number(n)?n:(new Date).getTime()},pointerExtend:c,getTouchPair:function(e){var t=[];return l.array(e)?(t[0]=e[0],t[1]=e[1]):"touchend"===e.type?1===e.touches.length?(t[0]=e.touches[0],t[1]=e.changedTouches[0]):0===e.touches.length&&(t[0]=e.changedTouches[0],t[1]=e.changedTouches[1]):(t[0]=e.touches[0],t[1]=e.touches[1]),t},pointerAverage:function(e){for(var t={pageX:0,pageY:0,clientX:0,clientY:0,screenX:0,screenY:0},n=e,r=Array.isArray(n),i=0,n=r?n:n[Symbol.iterator]();;){var o;if(r){if(i>=n.length)break;o=n[i++]}else{if(i=n.next(),i.done)break;o=i.value}var s=o;for(var a in t)t[a]+=s[a]}for(var l in t)t[l]/=e.length;return t},touchBBox:function(e){if(e.length||e.touches&&e.touches.length>1){var t=p.getTouchPair(e),n=Math.min(t[0].pageX,t[1].pageX),r=Math.min(t[0].pageY,t[1].pageY);return{x:n,y:r,left:n,top:r,width:Math.max(t[0].pageX,t[1].pageX)-n,height:Math.max(t[0].pageY,t[1].pageY)-r}}},touchDistance:function(e,t){var n=t+"X",i=t+"Y",o=p.getTouchPair(e),s=o[0][n]-o[1][n],a=o[0][i]-o[1][i];return r(s,a)},touchAngle:function(e,t,n){var r=n+"X",i=n+"Y",o=p.getTouchPair(e),s=o[1][r]-o[0][r],a=o[1][i]-o[0][i];return 180*Math.atan2(a,s)/Math.PI},getPointerType:function(e){return l.string(e.pointerType)?e.pointerType:l.number(e.pointerType)?[void 0,void 0,"touch","pen","mouse"][e.pointerType]:/touch/.test(e.type)||e instanceof a.Touch?"touch":"mouse"},getEventTargets:function(e){return[s.getActualElement(e.path?e.path[0]:e.target),s.getActualElement(e.currentTarget)]}};t.exports=p},{"./browser":37,"./domObjects":38,"./domUtils":39,"./hypot":43,"./is":46,"./pointerExtend":48}],50:[function(e,t,n){"use strict";for(var r=e("./window"),i=r.window,o=["ms","moz","webkit","o"],s=0,a=void 0,l=void 0,c=0;c\n * Open source under the MIT License.\n * https://raw.github.com/taye/interact.js/master/LICENSE\n */\n","/*\n * In a (windowless) server environment this file exports a factory function\n * that takes the window to use.\n *\n * var interact = require('interact.js')(windowObject);\n *\n * See https://github.com/taye/interact.js/issues/187\n */\nif (typeof window === 'undefined') {\n module.exports = function (window) {\n require('./src/utils/window').init(window);\n\n return require('./src/index');\n };\n}\nelse {\n module.exports = require('./src/index');\n}\n","const { indexOf } = require('./utils/arr');\nconst extend = require('./utils/extend.js');\n\nfunction fireUntilImmediateStopped (event, listeners) {\n for (let i = 0, len = listeners.length; i < len && !event.immediatePropagationStopped; i++) {\n listeners[i](event);\n }\n}\n\nclass Eventable {\n\n constructor (options) {\n this.options = extend({}, options || {});\n }\n\n fire (event) {\n let listeners;\n const onEvent = 'on' + event.type;\n const global = this.global;\n\n // Interactable#on() listeners\n if ((listeners = this[event.type])) {\n fireUntilImmediateStopped(event, listeners);\n }\n\n // interactable.onevent listener\n if (this[onEvent]) {\n this[onEvent](event);\n }\n\n // interact.on() listeners\n if (!event.propagationStopped && global && (listeners = global[event.type])) {\n fireUntilImmediateStopped(event, listeners);\n }\n }\n\n on (eventType, listener) {\n // if this type of event was never bound\n if (this[eventType]) {\n this[eventType].push(listener);\n }\n else {\n this[eventType] = [listener];\n }\n }\n\n off (eventType, listener) {\n // if it is an action event type\n const eventList = this[eventType];\n const index = eventList? indexOf(eventList, listener) : -1;\n\n if (index !== -1) {\n eventList.splice(index, 1);\n }\n\n if (eventList && eventList.length === 0 || !listener) {\n this[eventType] = listener;\n }\n }\n}\n\nmodule.exports = Eventable;\n","const extend = require('./utils/extend');\nconst getOriginXY = require('./utils/getOriginXY');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nclass InteractEvent {\n constructor (interaction, event, action, phase, element, related, preEnd = false) {\n const target = interaction.target;\n const deltaSource = (target && target.options || defaults).deltaSource;\n const origin = getOriginXY(target, element, action);\n const starting = phase === 'start';\n const ending = phase === 'end';\n const coords = starting? interaction.startCoords : interaction.curCoords;\n const prevEvent = interaction.prevEvent;\n\n element = element || interaction.element;\n\n const page = extend({}, coords.page);\n const client = extend({}, coords.client);\n\n page.x -= origin.x;\n page.y -= origin.y;\n\n client.x -= origin.x;\n client.y -= origin.y;\n\n this.ctrlKey = event.ctrlKey;\n this.altKey = event.altKey;\n this.shiftKey = event.shiftKey;\n this.metaKey = event.metaKey;\n this.button = event.button;\n this.buttons = event.buttons;\n this.target = element;\n this.currentTarget = element;\n this.relatedTarget = related || null;\n this.preEnd = preEnd;\n this.type = action + (phase || '');\n this.interaction = interaction;\n this.interactable = target;\n\n this.t0 = starting ? interaction.downTimes[interaction.downTimes.length - 1]\n : prevEvent.t0;\n\n const signalArg = {\n interaction,\n event,\n action,\n phase,\n element,\n related,\n page,\n client,\n coords,\n starting,\n ending,\n deltaSource,\n iEvent: this,\n };\n\n signals.fire('set-xy', signalArg);\n\n if (ending) {\n // use previous coords when ending\n this.pageX = prevEvent.pageX;\n this.pageY = prevEvent.pageY;\n this.clientX = prevEvent.clientX;\n this.clientY = prevEvent.clientY;\n }\n else {\n this.pageX = page.x;\n this.pageY = page.y;\n this.clientX = client.x;\n this.clientY = client.y;\n }\n\n this.x0 = interaction.startCoords.page.x - origin.x;\n this.y0 = interaction.startCoords.page.y - origin.y;\n this.clientX0 = interaction.startCoords.client.x - origin.x;\n this.clientY0 = interaction.startCoords.client.y - origin.y;\n\n signals.fire('set-delta', signalArg);\n\n this.timeStamp = coords.timeStamp;\n this.dt = interaction.pointerDelta.timeStamp;\n this.duration = this.timeStamp - this.t0;\n\n // speed and velocity in pixels per second\n this.speed = interaction.pointerDelta[deltaSource].speed;\n this.velocityX = interaction.pointerDelta[deltaSource].vx;\n this.velocityY = interaction.pointerDelta[deltaSource].vy;\n\n this.swipe = (ending || phase === 'inertiastart')? this.getSwipe() : null;\n\n signals.fire('new', signalArg);\n }\n\n getSwipe () {\n const interaction = this.interaction;\n\n if (interaction.prevEvent.speed < 600\n || this.timeStamp - interaction.prevEvent.timeStamp > 150) {\n return null;\n }\n\n let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI;\n const overlap = 22.5;\n\n if (angle < 0) {\n angle += 360;\n }\n\n const left = 135 - overlap <= angle && angle < 225 + overlap;\n const up = 225 - overlap <= angle && angle < 315 + overlap;\n\n const right = !left && (315 - overlap <= angle || angle < 45 + overlap);\n const down = !up && 45 - overlap <= angle && angle < 135 + overlap;\n\n return {\n up,\n down,\n left,\n right,\n angle,\n speed: interaction.prevEvent.speed,\n velocity: {\n x: interaction.prevEvent.velocityX,\n y: interaction.prevEvent.velocityY,\n },\n };\n }\n\n preventDefault () {}\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n}\n\nsignals.on('set-delta', function ({ iEvent, interaction, starting, deltaSource }) {\n const prevEvent = starting? iEvent : interaction.prevEvent;\n\n if (deltaSource === 'client') {\n iEvent.dx = iEvent.clientX - prevEvent.clientX;\n iEvent.dy = iEvent.clientY - prevEvent.clientY;\n }\n else {\n iEvent.dx = iEvent.pageX - prevEvent.pageX;\n iEvent.dy = iEvent.pageY - prevEvent.pageY;\n }\n});\n\nInteractEvent.signals = signals;\n\nmodule.exports = InteractEvent;\n","const is = require('./utils/is');\nconst events = require('./utils/events');\nconst extend = require('./utils/extend');\nconst actions = require('./actions/base');\nconst scope = require('./scope');\nconst Eventable = require('./Eventable');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nconst {\n getElementRect,\n nodeContains,\n trySelector,\n} = require('./utils/domUtils');\nconst { getWindow } = require('./utils/window');\nconst { indexOf, contains } = require('./utils/arr');\nconst { wheelEvent } = require('./utils/browser');\n\n// all set interactables\nscope.interactables = [];\n\n/*\\\n * Interactable\n [ property ]\n **\n * Object type returned by @interact\n\\*/\nclass Interactable {\n constructor (target, options) {\n options = options || {};\n\n this.target = target;\n this.events = new Eventable();\n this._context = options.context || scope.document;\n this._win = getWindow(trySelector(target)? this._context : target);\n this._doc = this._win.document;\n\n signals.fire('new', {\n target,\n options,\n interactable: this,\n win: this._win,\n });\n\n scope.addDocument( this._doc, this._win );\n\n scope.interactables.push(this);\n\n this.set(options);\n }\n\n setOnEvents (action, phases) {\n const onAction = 'on' + action;\n\n if (is.function(phases.onstart) ) { this.events[onAction + 'start' ] = phases.onstart ; }\n if (is.function(phases.onmove) ) { this.events[onAction + 'move' ] = phases.onmove ; }\n if (is.function(phases.onend) ) { this.events[onAction + 'end' ] = phases.onend ; }\n if (is.function(phases.oninertiastart)) { this.events[onAction + 'inertiastart' ] = phases.oninertiastart ; }\n\n return this;\n }\n\n setPerAction (action, options) {\n // for all the default per-action options\n for (const option in options) {\n // if this option exists for this action\n if (option in defaults[action]) {\n // if the option in the options arg is an object value\n if (is.object(options[option])) {\n // duplicate the object\n this.options[action][option] = extend(this.options[action][option] || {}, options[option]);\n\n if (is.object(defaults.perAction[option]) && 'enabled' in defaults.perAction[option]) {\n this.options[action][option].enabled = options[option].enabled === false? false : true;\n }\n }\n else if (is.bool(options[option]) && is.object(defaults.perAction[option])) {\n this.options[action][option].enabled = options[option];\n }\n else if (options[option] !== undefined) {\n // or if it's not undefined, do a plain assignment\n this.options[action][option] = options[option];\n }\n }\n }\n }\n\n /*\\\n * Interactable.getRect\n [ method ]\n *\n * The default function to get an Interactables bounding rect. Can be\n * overridden using @Interactable.rectChecker.\n *\n - element (Element) #optional The element to measure.\n = (object) The object's bounding rectangle.\n o {\n o top : 0,\n o left : 0,\n o bottom: 0,\n o right : 0,\n o width : 0,\n o height: 0\n o }\n \\*/\n getRect (element) {\n element = element || this.target;\n\n if (is.string(this.target) && !(is.element(element))) {\n element = this._context.querySelector(this.target);\n }\n\n return getElementRect(element);\n }\n\n /*\\\n * Interactable.rectChecker\n [ method ]\n *\n * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n - checker (function) #optional A function which returns this Interactable's bounding rectangle. See @Interactable.getRect\n = (function | object) The checker function or this Interactable\n \\*/\n rectChecker (checker) {\n if (is.function(checker)) {\n this.getRect = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.getRect;\n\n return this;\n }\n\n return this.getRect;\n }\n\n _backCompatOption (optionName, newValue) {\n if (trySelector(newValue) || is.object(newValue)) {\n this.options[optionName] = newValue;\n\n for (const action of actions.names) {\n this.options[action][optionName] = newValue;\n }\n\n return this;\n }\n\n return this.options[optionName];\n }\n\n /*\\\n * Interactable.origin\n [ method ]\n *\n * Gets or sets the origin of the Interactable's element. The x and y\n * of the origin will be subtracted from action event coordinates.\n *\n - origin (object | string) #optional An object eg. { x: 0, y: 0 } or string 'parent', 'self' or any CSS selector\n * OR\n - origin (Element) #optional An HTML or SVG Element whose rect will be used\n **\n = (object) The current origin or this Interactable\n \\*/\n origin (newValue) {\n return this._backCompatOption('origin', newValue);\n }\n\n /*\\\n * Interactable.deltaSource\n [ method ]\n *\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n - newValue (string) #optional Use 'client' if you will be scrolling while interacting; Use 'page' if you want autoScroll to work\n = (string | object) The current deltaSource or this Interactable\n \\*/\n deltaSource (newValue) {\n if (newValue === 'page' || newValue === 'client') {\n this.options.deltaSource = newValue;\n\n return this;\n }\n\n return this.options.deltaSource;\n }\n\n /*\\\n * Interactable.context\n [ method ]\n *\n * Gets the selector context Node of the Interactable. The default is `window.document`.\n *\n = (Node) The context Node of this Interactable\n **\n \\*/\n context () {\n return this._context;\n }\n\n inContext (element) {\n return (this._context === element.ownerDocument\n || nodeContains(this._context, element));\n }\n\n /*\\\n * Interactable.fire\n [ method ]\n *\n * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n - iEvent (InteractEvent) The InteractEvent object to be fired on this Interactable\n = (Interactable) this Interactable\n \\*/\n fire (iEvent) {\n this.events.fire(iEvent);\n\n return this;\n }\n\n _onOffMultiple (method, eventType, listener, options) {\n if (is.string(eventType) && eventType.search(' ') !== -1) {\n eventType = eventType.trim().split(/ +/);\n }\n\n if (is.array(eventType)) {\n for (let i = 0; i < eventType.length; i++) {\n this[method](eventType[i], listener, options);\n }\n\n return true;\n }\n\n if (is.object(eventType)) {\n for (const prop in eventType) {\n this[method](prop, eventType[prop], listener);\n }\n\n return true;\n }\n }\n\n /*\\\n * Interactable.on\n [ method ]\n *\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n - eventType (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) This Interactable\n \\*/\n on (eventType, listener, options) {\n if (this._onOffMultiple('on', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.on(eventType, listener);\n }\n // delegated event for selector\n else if (is.string(this.target)) {\n events.addDelegate(this.target, this._context, eventType, listener, options);\n }\n else {\n events.add(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.off\n [ method ]\n *\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n - eventType (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) This Interactable\n \\*/\n off (eventType, listener, options) {\n if (this._onOffMultiple('off', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n // if it is an action event type\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.off(eventType, listener);\n }\n // delegated event\n else if (is.string(this.target)) {\n events.removeDelegate(this.target, this._context, eventType, listener, options);\n }\n // remove listener from this Interatable's element\n else {\n events.remove(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.set\n [ method ]\n *\n * Reset the options of this Interactable\n - options (object) The new settings to apply\n = (object) This Interactable\n \\*/\n set (options) {\n if (!is.object(options)) {\n options = {};\n }\n\n this.options = extend({}, defaults.base);\n\n const perActions = extend({}, defaults.perAction);\n\n for (const actionName in actions.methodDict) {\n const methodName = actions.methodDict[actionName];\n\n this.options[actionName] = extend({}, defaults[actionName]);\n\n this.setPerAction(actionName, perActions);\n\n this[methodName](options[actionName]);\n }\n\n for (const setting of Interactable.settingsMethods) {\n this.options[setting] = defaults.base[setting];\n\n if (setting in options) {\n this[setting](options[setting]);\n }\n }\n\n signals.fire('set', {\n options,\n interactable: this,\n });\n\n return this;\n }\n\n /*\\\n * Interactable.unset\n [ method ]\n *\n * Remove this interactable from the list of interactables and remove\n * it's action capabilities and event listeners\n *\n = (object) @interact\n \\*/\n unset () {\n events.remove(this.target, 'all');\n\n if (is.string(this.target)) {\n // remove delegated events\n for (const type in events.delegatedEvents) {\n const delegated = events.delegatedEvents[type];\n\n if (delegated.selectors[0] === this.target\n && delegated.contexts[0] === this._context) {\n\n delegated.selectors.splice(0, 1);\n delegated.contexts .splice(0, 1);\n delegated.listeners.splice(0, 1);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegated[type] = null;\n }\n }\n\n events.remove(this._context, type, events.delegateListener);\n events.remove(this._context, type, events.delegateUseCapture, true);\n }\n }\n else {\n events.remove(this, 'all');\n }\n\n signals.fire('unset', { interactable: this });\n\n scope.interactables.splice(indexOf(scope.interactables, this), 1);\n\n // Stop related interactions when an Interactable is unset\n for (const interaction of scope.interactions || []) {\n if (interaction.target === this && interaction.interacting()) {\n interaction.stop();\n }\n }\n\n return scope.interact;\n }\n}\n\nscope.interactables.indexOfElement = function indexOfElement (target, context) {\n context = context || scope.document;\n\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n if (interactable.target === target && interactable._context === context) {\n return i;\n }\n }\n return -1;\n};\n\nscope.interactables.get = function interactableGet (element, options, dontCheckInContext) {\n const ret = this[this.indexOfElement(element, options && options.context)];\n\n return ret && (is.string(element) || dontCheckInContext || ret.inContext(element))? ret : null;\n};\n\nscope.interactables.forEachSelector = function (callback, element) {\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n // skip non CSS selector targets and out of context elements\n if (!is.string(interactable.target)\n || (element && !interactable.inContext(element))) {\n continue;\n }\n\n const ret = callback(interactable, interactable.target, interactable._context, i, this);\n\n if (ret !== undefined) {\n return ret;\n }\n }\n};\n\n// all interact.js eventTypes\nInteractable.eventTypes = scope.eventTypes = [];\n\nInteractable.signals = signals;\n\nInteractable.settingsMethods = [ 'deltaSource', 'origin', 'preventDefault', 'rectChecker' ];\n\nmodule.exports = Interactable;\n","const scope = require('./scope');\nconst utils = require('./utils');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst finder = require('./utils/interactionFinder');\nconst signals = require('./utils/Signals').new();\n\nconst listeners = {};\nconst methodNames = [\n 'pointerDown', 'pointerMove', 'pointerUp',\n 'updatePointer', 'removePointer',\n];\n\n// for ignoring browser's simulated mouse events\nlet prevTouchTime = 0;\n\n// all active and idle interactions\nscope.interactions = [];\n\nclass Interaction {\n constructor () {\n this.target = null; // current interactable being interacted with\n this.element = null; // the target element of the interactable\n\n this.prepared = { // action that's ready to be fired on next move event\n name : null,\n axis : null,\n edges: null,\n };\n\n // keep track of added pointers\n this.pointers = [];\n this.pointerIds = [];\n this.downTargets = [];\n this.downTimes = [];\n\n // Previous native pointer move event coordinates\n this.prevCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n // current native pointer move event coordinates\n this.curCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Starting InteractEvent pointer coordinates\n this.startCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Change in coordinates and time of the pointer\n this.pointerDelta = {\n page : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n client : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n timeStamp: 0,\n };\n\n this.downEvent = null; // pointerdown/mousedown/touchstart event\n this.downPointer = {};\n\n this._eventTarget = null;\n this._curEventTarget = null;\n\n this.prevEvent = null; // previous action event\n\n this.pointerIsDown = false;\n this.pointerWasMoved = false;\n this._interacting = false;\n\n this.mouse = false;\n\n signals.fire('new', this);\n\n scope.interactions.push(this);\n }\n\n pointerDown (pointer, event, eventTarget) {\n const pointerIndex = this.updatePointer(pointer, event, true);\n\n signals.fire('down', {\n pointer,\n event,\n eventTarget,\n pointerIndex,\n interaction: this,\n });\n }\n\n /*\\\n * Interaction.start\n [ method ]\n *\n * Start an action with the given Interactable and Element as tartgets. The\n * action must be enabled for the target Interactable and an appropriate number\n * of pointers must be held down - 1 for drag/resize, 2 for gesture.\n *\n * Use it with `interactable.able({ manualStart: false })` to always\n * [start actions manually](https://github.com/taye/interact.js/issues/114)\n *\n - action (object) The action to be performed - drag, resize, etc.\n - target (Interactable) The Interactable to target\n - element (Element) The DOM Element to target\n = (object) interact\n **\n | interact(target)\n | .draggable({\n | // disable the default drag start by down->move\n | manualStart: true\n | })\n | // start dragging after the user holds the pointer down\n | .on('hold', function (event) {\n | var interaction = event.interaction;\n |\n | if (!interaction.interacting()) {\n | interaction.start({ name: 'drag' },\n | event.interactable,\n | event.currentTarget);\n | }\n | });\n \\*/\n start (action, target, element) {\n if (this.interacting()\n || !this.pointerIsDown\n || this.pointerIds.length < (action.name === 'gesture'? 2 : 1)) {\n return;\n }\n\n // if this interaction had been removed after stopping\n // add it back\n if (utils.indexOf(scope.interactions, this) === -1) {\n scope.interactions.push(this);\n }\n\n utils.copyAction(this.prepared, action);\n this.target = target;\n this.element = element;\n\n signals.fire('action-start', {\n interaction: this,\n event: this.downEvent,\n });\n }\n\n pointerMove (pointer, event, eventTarget) {\n if (!this.simulation) {\n this.updatePointer(pointer);\n utils.setCoords(this.curCoords, this.pointers);\n }\n\n const duplicateMove = (this.curCoords.page.x === this.prevCoords.page.x\n && this.curCoords.page.y === this.prevCoords.page.y\n && this.curCoords.client.x === this.prevCoords.client.x\n && this.curCoords.client.y === this.prevCoords.client.y);\n\n let dx;\n let dy;\n\n // register movement greater than pointerMoveTolerance\n if (this.pointerIsDown && !this.pointerWasMoved) {\n dx = this.curCoords.client.x - this.startCoords.client.x;\n dy = this.curCoords.client.y - this.startCoords.client.y;\n\n this.pointerWasMoved = utils.hypot(dx, dy) > Interaction.pointerMoveTolerance;\n }\n\n const signalArg = {\n pointer,\n pointerIndex: this.getPointerIndex(pointer),\n event,\n eventTarget,\n dx,\n dy,\n duplicate: duplicateMove,\n interaction: this,\n interactingBeforeMove: this.interacting(),\n };\n\n if (!duplicateMove) {\n // set pointer coordinate, time changes and speeds\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n }\n\n signals.fire('move', signalArg);\n\n if (!duplicateMove) {\n // if interacting, fire an 'action-move' signal etc\n if (this.interacting()) {\n this.doMove(signalArg);\n }\n\n if (this.pointerWasMoved) {\n utils.copyCoords(this.prevCoords, this.curCoords);\n }\n }\n }\n\n /*\\\n * Interaction.doMove\n [ method ]\n *\n * Force a move of the current action at the same coordinates. Useful if\n * snap/restrict has been changed and you want a movement with the new\n * settings.\n *\n **\n | interact(target)\n | .draggable(true)\n | .on('dragmove', function (event) {\n | if (someCondition) {\n | // change the snap settings\n | event.interactable.draggable({ snap: { targets: [] }});\n | // fire another move event with re-calculated snap\n | event.interaction.doMove();\n | }\n | });\n \\*/\n doMove (signalArg) {\n signalArg = utils.extend({\n pointer: this.pointers[0],\n event: this.prevEvent,\n eventTarget: this._eventTarget,\n interaction: this,\n }, signalArg || {});\n\n signals.fire('before-action-move', signalArg);\n\n if (!this._dontFireMove) {\n signals.fire('action-move', signalArg);\n }\n\n this._dontFireMove = false;\n }\n\n // End interact move events and stop auto-scroll unless simulation is running\n pointerUp (pointer, event, eventTarget, curEventTarget) {\n const pointerIndex = this.getPointerIndex(pointer);\n\n signals.fire(/cancel$/i.test(event.type)? 'cancel' : 'up', {\n pointer,\n pointerIndex,\n event,\n eventTarget,\n curEventTarget,\n interaction: this,\n });\n\n if (!this.simulation) {\n this.end(event);\n }\n\n this.pointerIsDown = false;\n this.removePointer(pointer, event);\n }\n\n /*\\\n * Interaction.end\n [ method ]\n *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n - event (PointerEvent) #optional\n **\n | interact(target)\n | .draggable(true)\n | .on('move', function (event) {\n | if (event.pageX > 1000) {\n | // end the current action\n | event.interaction.end();\n | // stop all further listeners from being called\n | event.stopImmediatePropagation();\n | }\n | });\n \\*/\n end (event) {\n event = event || this.prevEvent;\n\n if (this.interacting()) {\n signals.fire('action-end', {\n event,\n interaction: this,\n });\n }\n\n this.stop();\n }\n\n currentAction () {\n return this._interacting? this.prepared.name: null;\n }\n\n interacting () {\n return this._interacting;\n }\n\n stop () {\n signals.fire('stop', { interaction: this });\n\n if (this._interacting) {\n signals.fire('stop-active', { interaction: this });\n signals.fire('stop-' + this.prepared.name, { interaction: this });\n }\n\n this.target = this.element = null;\n\n this._interacting = false;\n this.prepared.name = this.prevEvent = null;\n }\n\n getPointerIndex (pointer) {\n return utils.indexOf(this.pointerIds, utils.getPointerId(pointer));\n }\n\n updatePointer (pointer, event, down = event && /(down|start)$/i.test(event.type)) {\n const id = utils.getPointerId(pointer);\n let index = this.getPointerIndex(pointer);\n\n if (index === -1) {\n index = this.pointerIds.length;\n this.pointerIds[index] = id;\n }\n\n if (down) {\n signals.fire('update-pointer-down', {\n pointer,\n event,\n down,\n pointerId: id,\n pointerIndex: index,\n interaction: this,\n });\n }\n\n this.pointers[index] = pointer;\n\n return index;\n }\n\n removePointer (pointer, event) {\n const id = utils.getPointerId(pointer);\n const index = this.mouse? 0 : utils.indexOf(this.pointerIds, id);\n\n if (index === -1) { return; }\n\n signals.fire('remove-pointer', {\n pointer,\n event,\n pointerIndex: index,\n interaction: this,\n });\n\n this.pointers .splice(index, 1);\n this.pointerIds .splice(index, 1);\n this.downTargets.splice(index, 1);\n this.downTimes .splice(index, 1);\n }\n\n _updateEventTargets (target, currentTarget) {\n this._eventTarget = target;\n this._curEventTarget = currentTarget;\n }\n}\n\nfor (let i = 0, len = methodNames.length; i < len; i++) {\n const method = methodNames[i];\n\n listeners[method] = doOnInteractions(method);\n}\n\nfunction doOnInteractions (method) {\n return (function (event) {\n const [eventTarget, curEventTarget] = utils.getEventTargets(event);\n const matches = []; // [ [pointer, interaction], ...]\n\n if (browser.supportsTouch && /touch/.test(event.type)) {\n prevTouchTime = new Date().getTime();\n\n for (let i = 0; i < event.changedTouches.length; i++) {\n const pointer = event.changedTouches[i];\n const interaction = finder.search(pointer, event.type, eventTarget);\n\n matches.push([pointer, interaction || new Interaction()]);\n }\n }\n else {\n let invalidPointer = false;\n\n if (!browser.supportsPointerEvent && /mouse/.test(event.type)) {\n // ignore mouse events while touch interactions are active\n for (let i = 0; i < scope.interactions.length && !invalidPointer; i++) {\n invalidPointer = !scope.interactions[i].mouse && scope.interactions[i].pointerIsDown;\n }\n\n // try to ignore mouse events that are simulated by the browser\n // after a touch event\n invalidPointer = invalidPointer\n || (new Date().getTime() - prevTouchTime < 500)\n // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated\n || event.timeStamp === 0;\n }\n\n if (!invalidPointer) {\n let interaction = finder.search(event, event.type, eventTarget);\n\n if (!interaction) {\n\n interaction = new Interaction();\n interaction.mouse = (/mouse/i.test(event.pointerType || event.type)\n // MSPointerEvent.MSPOINTER_TYPE_MOUSE\n || event.pointerType === 4\n || !event.pointerType);\n }\n\n matches.push([event, interaction]);\n }\n }\n\n for (const [pointer, interaction] of matches) {\n interaction._updateEventTargets(eventTarget, curEventTarget);\n interaction[method](pointer, event, eventTarget, curEventTarget);\n }\n });\n}\n\nfunction endAll (event) {\n for (let i = 0; i < scope.interactions.length; i++) {\n const interaction = scope.interactions[i];\n\n interaction.end(event);\n signals.fire('endall', { event, interaction });\n }\n}\n\nconst docEvents = { /* 'eventType': listenerFunc */ };\nconst pEventTypes = browser.pEventTypes;\n\nif (scope.PointerEvent) {\n docEvents[pEventTypes.down ] = listeners.pointerDown;\n docEvents[pEventTypes.move ] = listeners.pointerMove;\n docEvents[pEventTypes.up ] = listeners.pointerUp;\n docEvents[pEventTypes.cancel] = listeners.pointerUp;\n}\nelse {\n docEvents.mousedown = listeners.pointerDown;\n docEvents.mousemove = listeners.pointerMove;\n docEvents.mouseup = listeners.pointerUp;\n\n docEvents.touchstart = listeners.pointerDown;\n docEvents.touchmove = listeners.pointerMove;\n docEvents.touchend = listeners.pointerUp;\n docEvents.touchcancel = listeners.pointerUp;\n}\n\ndocEvents.blur = endAll;\n\nfunction onDocSignal ({ doc }, signalName) {\n const eventMethod = signalName.indexOf('add') === 0\n ? events.add : events.remove;\n\n // delegate event listener\n for (const eventType in scope.delegatedEvents) {\n eventMethod(doc, eventType, events.delegateListener);\n eventMethod(doc, eventType, events.delegateUseCapture, true);\n }\n\n for (const eventType in docEvents) {\n eventMethod(doc, eventType, docEvents[eventType]);\n }\n}\n\nsignals.on('update-pointer-down', ({ interaction, pointer, pointerId, pointerIndex, event, eventTarget, down }) => {\n interaction.pointerIds[pointerIndex] = pointerId;\n interaction.pointers[pointerIndex] = pointer;\n\n if (down) {\n interaction.pointerIsDown = true;\n }\n\n if (!interaction.interacting()) {\n utils.setCoords(interaction.startCoords, interaction.pointers);\n\n utils.copyCoords(interaction.curCoords , interaction.startCoords);\n utils.copyCoords(interaction.prevCoords, interaction.startCoords);\n\n interaction.downEvent = event;\n interaction.downTimes[pointerIndex] = interaction.curCoords.timeStamp;\n interaction.downTargets[pointerIndex] = eventTarget || event && utils.getEventTargets(event)[0];\n interaction.pointerWasMoved = false;\n\n utils.pointerExtend(interaction.downPointer, pointer);\n }\n});\n\nscope.signals.on('add-document' , onDocSignal);\nscope.signals.on('remove-document', onDocSignal);\n\nInteraction.pointerMoveTolerance = 1;\nInteraction.doOnInteractions = doOnInteractions;\nInteraction.endAll = endAll;\nInteraction.signals = signals;\nInteraction.docEvents = docEvents;\n\nscope.endAllInteractions = endAll;\n\nmodule.exports = Interaction;\n","const Interaction = require('../Interaction');\nconst InteractEvent = require('../InteractEvent');\n\nconst actions = {\n firePrepared,\n names: [],\n methodDict: {},\n};\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n interaction._interacting = true;\n firePrepared(interaction, event, 'start');\n});\n\nInteraction.signals.on('action-move', function ({ interaction, event, preEnd }) {\n firePrepared(interaction, event, 'move', preEnd);\n\n // if the action was ended in a listener\n if (!interaction.interacting()) { return false; }\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n firePrepared(interaction, event, 'end');\n});\n\nfunction firePrepared (interaction, event, phase, preEnd) {\n const actionName = interaction.prepared.name;\n\n const newEvent = new InteractEvent(interaction, event, actionName, phase, interaction.element, null, preEnd);\n\n interaction.target.fire(newEvent);\n interaction.prevEvent = newEvent;\n}\n\nmodule.exports = actions;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drag = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n startAxis : 'xy',\n lockAxis : 'xy',\n },\n\n checker: function (pointer, event, interactable) {\n const dragOptions = interactable.options.drag;\n\n return dragOptions.enabled\n ? { name: 'drag', axis: (dragOptions.lockAxis === 'start'\n ? dragOptions.startAxis\n : dragOptions.lockAxis)}\n : null;\n },\n\n getCursor: function () {\n return 'move';\n },\n};\n\nInteraction.signals.on('before-action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n interaction.curCoords.page.y = interaction.startCoords.page.y;\n interaction.curCoords.client.y = interaction.startCoords.client.y;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vx);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vx);\n interaction.pointerDelta.client.vy = 0;\n interaction.pointerDelta.page.vy = 0;\n }\n else if (axis === 'y') {\n interaction.curCoords.page.x = interaction.startCoords.page.x;\n interaction.curCoords.client.x = interaction.startCoords.client.x;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vy);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vy);\n interaction.pointerDelta.client.vx = 0;\n interaction.pointerDelta.page.vx = 0;\n }\n});\n\n// dragmove\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'dragmove') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n iEvent.pageY = interaction.startCoords.page.y;\n iEvent.clientY = interaction.startCoords.client.y;\n iEvent.dy = 0;\n }\n else if (axis === 'y') {\n iEvent.pageX = interaction.startCoords.page.x;\n iEvent.clientX = interaction.startCoords.client.x;\n iEvent.dx = 0;\n }\n});\n\n/*\\\n * Interactable.draggable\n [ method ]\n *\n * Gets or sets whether drag actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of drag events\n | var isDraggable = interact('ul li').draggable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on drag events (object makes the Interactable draggable)\n = (object) This Interactable\n | interact(element).draggable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // the axis in which the first movement must be\n | // for the drag sequence to start\n | // 'xy' by default - any direction\n | startAxis: 'x' || 'y' || 'xy',\n |\n | // 'xy' by default - don't restrict to one axis (move in any direction)\n | // 'x' or 'y' to restrict movement to either axis\n | // 'start' to restrict movement to the axis the drag started in\n | lockAxis: 'x' || 'y' || 'xy' || 'start',\n |\n | // max number of drags that can happen concurrently\n | // with elements of this Interactable. Infinity by default\n | max: Infinity,\n |\n | // max number of drags that can target the same element+Interactable\n | // 1 by default\n | maxPerElement: 2\n | });\n\\*/\nInteractable.prototype.draggable = function (options) {\n if (utils.is.object(options)) {\n this.options.drag.enabled = options.enabled === false? false: true;\n this.setPerAction('drag', options);\n this.setOnEvents('drag', options);\n\n if (/^(xy|x|y|start)$/.test(options.lockAxis)) {\n this.options.drag.lockAxis = options.lockAxis;\n }\n if (/^(xy|x|y)$/.test(options.startAxis)) {\n this.options.drag.startAxis = options.startAxis;\n }\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drag.enabled = options;\n\n if (!options) {\n this.ondragstart = this.ondragstart = this.ondragend = null;\n }\n\n return this;\n }\n\n return this.options.drag;\n};\n\nactions.drag = drag;\nactions.names.push('drag');\nutils.merge(Interactable.eventTypes, [\n 'dragstart',\n 'dragmove',\n 'draginertiastart',\n 'draginertiaresume',\n 'dragend',\n]);\nactions.methodDict.drag = 'draggable';\n\ndefaultOptions.drag = drag.defaults;\n\nmodule.exports = drag;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst scope = require('../scope');\nconst interact = require('../interact');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drop = {\n defaults: {\n enabled: false,\n accept : null,\n overlap: 'pointer',\n },\n};\n\nlet dynamicDrop = false;\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // reset active dropzones\n interaction.activeDrops.dropzones = [];\n interaction.activeDrops.elements = [];\n interaction.activeDrops.rects = [];\n\n interaction.dropEvents = null;\n\n if (!interaction.dynamicDrop) {\n setActiveDrops(interaction, interaction.element);\n }\n\n const dragEvent = interaction.prevEvent;\n const dropEvents = getDropEvents(interaction, event, dragEvent);\n\n if (dropEvents.activate) {\n fireActiveDrops(interaction, dropEvents.activate);\n }\n});\n\nInteractEvent.signals.on('new', function ({ interaction, iEvent, event }) {\n if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { return; }\n\n const draggableElement = interaction.element;\n const dragEvent = iEvent;\n const dropResult = getDrop(dragEvent, event, draggableElement);\n\n interaction.dropTarget = dropResult.dropzone;\n interaction.dropElement = dropResult.element;\n\n interaction.dropEvents = getDropEvents(interaction, event, dragEvent);\n});\n\nInteraction.signals.on('action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n fireDropEvents(interaction, interaction.dropEvents);\n});\n\nInteraction.signals.on('action-end', function ({ interaction }) {\n if (interaction.prepared.name === 'drag') {\n fireDropEvents(interaction, interaction.dropEvents);\n }\n});\n\nInteraction.signals.on('stop-drag', function ({ interaction }) {\n interaction.activeDrops.dropzones =\n interaction.activeDrops.elements =\n interaction.activeDrops.rects =\n interaction.dropEvents = null;\n});\n\nfunction collectDrops (interaction, element) {\n const drops = [];\n const elements = [];\n\n element = element || interaction.element;\n\n // collect all dropzones and their elements which qualify for a drop\n for (const current of scope.interactables) {\n if (!current.options.drop.enabled) { continue; }\n\n const accept = current.options.drop.accept;\n\n // test the draggable element against the dropzone's accept setting\n if ((utils.is.element(accept) && accept !== element)\n || (utils.is.string(accept)\n && !utils.matchesSelector(element, accept))) {\n\n continue;\n }\n\n // query for new elements if necessary\n const dropElements = utils.is.string(current.target)\n ? current._context.querySelectorAll(current.target)\n : [current.target];\n\n for (let i = 0; i < dropElements.length; i++) {\n const currentElement = dropElements[i];\n\n if (currentElement !== element) {\n drops.push(current);\n elements.push(currentElement);\n }\n }\n }\n\n return {\n elements,\n dropzones: drops,\n };\n}\n\nfunction fireActiveDrops (interaction, event) {\n let prevElement;\n\n // loop through all active dropzones and trigger event\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n const current = interaction.activeDrops.dropzones[i];\n const currentElement = interaction.activeDrops.elements [i];\n\n // prevent trigger of duplicate events on same element\n if (currentElement !== prevElement) {\n // set current element as event target\n event.target = currentElement;\n current.fire(event);\n }\n prevElement = currentElement;\n }\n}\n\n// Collect a new set of possible drops and save them in activeDrops.\n// setActiveDrops should always be called when a drag has just started or a\n// drag event happens while dynamicDrop is true\nfunction setActiveDrops (interaction, dragElement) {\n // get dropzones and their elements that could receive the draggable\n const possibleDrops = collectDrops(interaction, dragElement, true);\n\n interaction.activeDrops.dropzones = possibleDrops.dropzones;\n interaction.activeDrops.elements = possibleDrops.elements;\n interaction.activeDrops.rects = [];\n\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n interaction.activeDrops.rects[i] =\n interaction.activeDrops.dropzones[i].getRect(interaction.activeDrops.elements[i]);\n }\n}\n\nfunction getDrop (dragEvent, event, dragElement) {\n const interaction = dragEvent.interaction;\n const validDrops = [];\n\n if (dynamicDrop) {\n setActiveDrops(interaction, dragElement);\n }\n\n // collect all dropzones and their elements which qualify for a drop\n for (let j = 0; j < interaction.activeDrops.dropzones.length; j++) {\n const current = interaction.activeDrops.dropzones[j];\n const currentElement = interaction.activeDrops.elements [j];\n const rect = interaction.activeDrops.rects [j];\n\n validDrops.push(current.dropCheck(dragEvent, event, interaction.target, dragElement, currentElement, rect)\n ? currentElement\n : null);\n }\n\n // get the most appropriate dropzone based on DOM depth and order\n const dropIndex = utils.indexOfDeepestElement(validDrops);\n\n return {\n dropzone: interaction.activeDrops.dropzones[dropIndex] || null,\n element : interaction.activeDrops.elements [dropIndex] || null,\n };\n}\n\nfunction getDropEvents (interaction, pointerEvent, dragEvent) {\n const dropEvents = {\n enter : null,\n leave : null,\n activate : null,\n deactivate: null,\n move : null,\n drop : null,\n };\n\n const tmpl = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n };\n\n if (interaction.dropElement !== interaction.prevDropElement) {\n // if there was a prevDropTarget, create a dragleave event\n if (interaction.prevDropTarget) {\n dropEvents.leave = utils.extend({ type: 'dragleave' }, tmpl);\n\n dragEvent.dragLeave = dropEvents.leave.target = interaction.prevDropElement;\n dragEvent.prevDropzone = dropEvents.leave.dropzone = interaction.prevDropTarget;\n }\n // if the dropTarget is not null, create a dragenter event\n if (interaction.dropTarget) {\n dropEvents.enter = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n type : 'dragenter',\n };\n\n dragEvent.dragEnter = interaction.dropElement;\n dragEvent.dropzone = interaction.dropTarget;\n }\n }\n\n if (dragEvent.type === 'dragend' && interaction.dropTarget) {\n dropEvents.drop = utils.extend({ type: 'drop' }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n dragEvent.relatedTarget = interaction.dropElement;\n }\n if (dragEvent.type === 'dragstart') {\n dropEvents.activate = utils.extend({ type: 'dropactivate' }, tmpl);\n\n dropEvents.activate.target = null;\n dropEvents.activate.dropzone = null;\n }\n if (dragEvent.type === 'dragend') {\n dropEvents.deactivate = utils.extend({ type: 'dropdeactivate' }, tmpl);\n\n dropEvents.deactivate.target = null;\n dropEvents.deactivate.dropzone = null;\n }\n if (dragEvent.type === 'dragmove' && interaction.dropTarget) {\n dropEvents.move = utils.extend({\n dragmove : dragEvent,\n type : 'dropmove',\n }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n }\n\n return dropEvents;\n}\n\nfunction fireDropEvents (interaction, dropEvents) {\n if (dropEvents.leave) { interaction.prevDropTarget.fire(dropEvents.leave); }\n if (dropEvents.move ) { interaction.dropTarget.fire(dropEvents.move ); }\n if (dropEvents.enter) { interaction.dropTarget.fire(dropEvents.enter); }\n if (dropEvents.drop ) { interaction.dropTarget.fire(dropEvents.drop ); }\n if (dropEvents.deactivate) {\n fireActiveDrops(interaction, dropEvents.deactivate);\n }\n\n interaction.prevDropTarget = interaction.dropTarget;\n interaction.prevDropElement = interaction.dropElement;\n}\n\n/*\\\n * Interactable.dropzone\n [ method ]\n *\n * Returns or sets whether elements can be dropped onto this\n * Interactable to trigger drop events\n *\n * Dropzones can receive the following events:\n * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends\n * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone\n * - `dragmove` when a draggable that has entered the dropzone is moved\n * - `drop` when a draggable is dropped into this dropzone\n *\n * Use the `accept` option to allow only elements that match the given CSS\n * selector or element. The value can be:\n *\n * - **an Element** - only that element can be dropped into this dropzone.\n * - **a string**, - the element being dragged must match it as a CSS selector.\n * - **`null`** - accept options is cleared - it accepts any element.\n *\n * Use the `overlap` option to set how drops are checked for. The allowed\n * values are:\n *\n * - `'pointer'`, the pointer must be over the dropzone (default)\n * - `'center'`, the draggable element's center must be over the dropzone\n * - a number from 0-1 which is the `(intersection area) / (draggable area)`.\n * e.g. `0.5` for drop to happen when half of the area of the draggable is\n * over the dropzone\n *\n * Use the `checker` option to specify a function to check if a dragged\n * element is over this Interactable.\n *\n | interact(target)\n | .dropChecker(function(dragEvent, // related dragmove or dragend event\n | event, // TouchEvent/PointerEvent/MouseEvent\n | dropped, // bool result of the default checker\n | dropzone, // dropzone Interactable\n | dropElement, // dropzone elemnt\n | draggable, // draggable Interactable\n | draggableElement) {// draggable element\n |\n | return dropped && event.target.hasAttribute('allow-drop');\n | }\n *\n *\n - options (boolean | object | null) #optional The new value to be set.\n | interact('.drop').dropzone({\n | accept: '.can-drop' || document.getElementById('single-drop'),\n | overlap: 'pointer' || 'center' || zeroToOne\n | }\n = (boolean | object) The current setting or this Interactable\n\\*/\nInteractable.prototype.dropzone = function (options) {\n if (utils.is.object(options)) {\n this.options.drop.enabled = options.enabled === false? false: true;\n\n if (utils.is.function(options.ondrop) ) { this.events.ondrop = options.ondrop ; }\n if (utils.is.function(options.ondropactivate) ) { this.events.ondropactivate = options.ondropactivate ; }\n if (utils.is.function(options.ondropdeactivate)) { this.events.ondropdeactivate = options.ondropdeactivate; }\n if (utils.is.function(options.ondragenter) ) { this.events.ondragenter = options.ondragenter ; }\n if (utils.is.function(options.ondragleave) ) { this.events.ondragleave = options.ondragleave ; }\n if (utils.is.function(options.ondropmove) ) { this.events.ondropmove = options.ondropmove ; }\n\n if (/^(pointer|center)$/.test(options.overlap)) {\n this.options.drop.overlap = options.overlap;\n }\n else if (utils.is.number(options.overlap)) {\n this.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0);\n }\n if ('accept' in options) {\n this.options.drop.accept = options.accept;\n }\n if ('checker' in options) {\n this.options.drop.checker = options.checker;\n }\n\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drop.enabled = options;\n\n if (!options) {\n this.ondragenter = this.ondragleave = this.ondrop\n = this.ondropactivate = this.ondropdeactivate = null;\n }\n\n return this;\n }\n\n return this.options.drop;\n};\n\nInteractable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) {\n let dropped = false;\n\n // if the dropzone has no rect (eg. display: none)\n // call the custom dropChecker or just return false\n if (!(rect = rect || this.getRect(dropElement))) {\n return (this.options.drop.checker\n ? this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement)\n : false);\n }\n\n const dropOverlap = this.options.drop.overlap;\n\n if (dropOverlap === 'pointer') {\n const origin = utils.getOriginXY(draggable, draggableElement, 'drag');\n const page = utils.getPageXY(dragEvent);\n\n page.x += origin.x;\n page.y += origin.y;\n\n const horizontal = (page.x > rect.left) && (page.x < rect.right);\n const vertical = (page.y > rect.top ) && (page.y < rect.bottom);\n\n dropped = horizontal && vertical;\n }\n\n const dragRect = draggable.getRect(draggableElement);\n\n if (dragRect && dropOverlap === 'center') {\n const cx = dragRect.left + dragRect.width / 2;\n const cy = dragRect.top + dragRect.height / 2;\n\n dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom;\n }\n\n if (dragRect && utils.is.number(dropOverlap)) {\n const overlapArea = (Math.max(0, Math.min(rect.right , dragRect.right ) - Math.max(rect.left, dragRect.left))\n * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top , dragRect.top )));\n\n const overlapRatio = overlapArea / (dragRect.width * dragRect.height);\n\n dropped = overlapRatio >= dropOverlap;\n }\n\n if (this.options.drop.checker) {\n dropped = this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement);\n }\n\n return dropped;\n};\n\nInteractable.signals.on('unset', function ({ interactable }) {\n interactable.dropzone(false);\n});\n\nInteractable.settingsMethods.push('dropChecker');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.dropTarget = null; // the dropzone a drag target might be dropped into\n interaction.dropElement = null; // the element at the time of checking\n interaction.prevDropTarget = null; // the dropzone that was recently dragged away from\n interaction.prevDropElement = null; // the element at the time of checking\n interaction.dropEvents = null; // the dropEvents related to the current drag event\n\n interaction.activeDrops = {\n dropzones: [], // the dropzones that are mentioned below\n elements : [], // elements of dropzones that accept the target draggable\n rects : [], // the rects of the elements mentioned above\n };\n\n});\n\nInteraction.signals.on('stop', function ({ interaction }) {\n interaction.dropTarget = interaction.dropElement =\n interaction.prevDropTarget = interaction.prevDropElement = null;\n});\n\n/*\\\n * interact.dynamicDrop\n [ method ]\n *\n * Returns or sets whether the dimensions of dropzone elements are\n * calculated on every dragmove or only on dragstart for the default\n * dropChecker\n *\n - newValue (boolean) #optional True to check on each move. False to check only before start\n = (boolean | interact) The current setting or interact\n\\*/\ninteract.dynamicDrop = function (newValue) {\n if (utils.is.bool(newValue)) {\n //if (dragging && dynamicDrop !== newValue && !newValue) {\n //calcRects(dropzones);\n //}\n\n dynamicDrop = newValue;\n\n return interact;\n }\n return dynamicDrop;\n};\n\nutils.merge(Interactable.eventTypes, [\n 'dragenter',\n 'dragleave',\n 'dropactivate',\n 'dropdeactivate',\n 'dropmove',\n 'drop',\n]);\nactions.methodDict.drop = 'dropzone';\n\ndefaultOptions.drop = drop.defaults;\n\nmodule.exports = drop;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst gesture = {\n defaults: {\n enabled : false,\n origin : null,\n restrict: null,\n },\n\n checker: function (pointer, event, interactable, element, interaction) {\n if (interaction.pointerIds.length >= 2) {\n return { name: 'gesture' };\n }\n\n return null;\n },\n\n getCursor: function () {\n return '';\n },\n};\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturestart') { return; }\n iEvent.ds = 0;\n\n interaction.gesture.startDistance = interaction.gesture.prevDistance = iEvent.distance;\n interaction.gesture.startAngle = interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.scale = 1;\n});\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturemove') { return; }\n\n iEvent.ds = iEvent.scale - interaction.gesture.scale;\n\n interaction.target.fire(iEvent);\n\n interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.prevDistance = iEvent.distance;\n\n if (iEvent.scale !== Infinity\n && iEvent.scale !== null\n && iEvent.scale !== undefined\n && !isNaN(iEvent.scale)) {\n\n interaction.gesture.scale = iEvent.scale;\n }\n});\n\n/*\\\n * Interactable.gesturable\n [ method ]\n *\n * Gets or sets whether multitouch gestures can be performed on the\n * Interactable's element\n *\n = (boolean) Indicates if this can be the target of gesture events\n | var isGestureable = interact(element).gesturable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on gesture events (makes the Interactable gesturable)\n = (object) this Interactable\n | interact(element).gesturable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // limit multiple gestures.\n | // See the explanation in @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n\\*/\nInteractable.prototype.gesturable = function (options) {\n if (utils.is.object(options)) {\n this.options.gesture.enabled = options.enabled === false? false: true;\n this.setPerAction('gesture', options);\n this.setOnEvents('gesture', options);\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.gesture.enabled = options;\n\n if (!options) {\n this.ongesturestart = this.ongesturestart = this.ongestureend = null;\n }\n\n return this;\n }\n\n return this.options.gesture;\n};\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action, event, starting, ending, deltaSource }) {\n if (action !== 'gesture') { return; }\n\n const pointers = interaction.pointers;\n\n iEvent.touches = [pointers[0], pointers[1]];\n\n if (starting) {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = 1;\n iEvent.ds = 0;\n iEvent.angle = utils.touchAngle(pointers, undefined, deltaSource);\n iEvent.da = 0;\n }\n else if (ending || event instanceof InteractEvent) {\n iEvent.distance = interaction.prevEvent.distance;\n iEvent.box = interaction.prevEvent.box;\n iEvent.scale = interaction.prevEvent.scale;\n iEvent.ds = iEvent.scale - 1;\n iEvent.angle = interaction.prevEvent.angle;\n iEvent.da = iEvent.angle - interaction.gesture.startAngle;\n }\n else {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = iEvent.distance / interaction.gesture.startDistance;\n iEvent.angle = utils.touchAngle(pointers, interaction.gesture.prevAngle, deltaSource);\n\n iEvent.ds = iEvent.scale - interaction.gesture.prevScale;\n iEvent.da = iEvent.angle - interaction.gesture.prevAngle;\n }\n});\n\nInteraction.signals.on('new', function (interaction) {\n interaction.gesture = {\n start: { x: 0, y: 0 },\n\n startDistance: 0, // distance between two touches of touchStart\n prevDistance : 0,\n distance : 0,\n\n scale: 1, // gesture.distance / gesture.startDistance\n\n startAngle: 0, // angle of line joining two touches\n prevAngle : 0, // angle of the previous gesture event\n };\n});\n\nactions.gesture = gesture;\nactions.names.push('gesture');\nutils.merge(Interactable.eventTypes, [\n 'gesturestart',\n 'gesturemove',\n 'gestureend',\n]);\nactions.methodDict.gesture = 'gesturable';\n\ndefaultOptions.gesture = gesture.defaults;\n\nmodule.exports = gesture;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\n// Less Precision with touch input\nconst defaultMargin = browser.supportsTouch || browser.supportsPointerEvent? 20: 10;\n\nconst resize = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n square: false,\n preserveAspectRatio: false,\n axis: 'xy',\n\n // use default margin\n margin: NaN,\n\n // object with props left, right, top, bottom which are\n // true/false values to resize when the pointer is over that edge,\n // CSS selectors to match the handles for each direction\n // or the Elements for each handle\n edges: null,\n\n // a value of 'none' will limit the resize rect to a minimum of 0x0\n // 'negate' will alow the rect to have negative width/height\n // 'reposition' will keep the width/height positive by swapping\n // the top and bottom edges and/or swapping the left and right edges\n invert: 'none',\n },\n\n checker: function (pointer, event, interactable, element, interaction, rect) {\n if (!rect) { return null; }\n\n const page = utils.extend({}, interaction.curCoords.page);\n const options = interactable.options;\n\n if (options.resize.enabled) {\n const resizeOptions = options.resize;\n const resizeEdges = { left: false, right: false, top: false, bottom: false };\n\n // if using resize.edges\n if (utils.is.object(resizeOptions.edges)) {\n for (const edge in resizeEdges) {\n resizeEdges[edge] = checkResizeEdge(edge,\n resizeOptions.edges[edge],\n page,\n interaction._eventTarget,\n element,\n rect,\n resizeOptions.margin || defaultMargin);\n }\n\n resizeEdges.left = resizeEdges.left && !resizeEdges.right;\n resizeEdges.top = resizeEdges.top && !resizeEdges.bottom;\n\n if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) {\n return {\n name: 'resize',\n edges: resizeEdges,\n };\n }\n }\n else {\n const right = options.resize.axis !== 'y' && page.x > (rect.right - defaultMargin);\n const bottom = options.resize.axis !== 'x' && page.y > (rect.bottom - defaultMargin);\n\n if (right || bottom) {\n return {\n name: 'resize',\n axes: (right? 'x' : '') + (bottom? 'y' : ''),\n };\n }\n }\n }\n\n return null;\n },\n\n cursors: (browser.isIe9OrOlder ? {\n x : 'e-resize',\n y : 's-resize',\n xy: 'se-resize',\n\n top : 'n-resize',\n left : 'w-resize',\n bottom : 's-resize',\n right : 'e-resize',\n topleft : 'se-resize',\n bottomright: 'se-resize',\n topright : 'ne-resize',\n bottomleft : 'ne-resize',\n } : {\n x : 'ew-resize',\n y : 'ns-resize',\n xy: 'nwse-resize',\n\n top : 'ns-resize',\n left : 'ew-resize',\n bottom : 'ns-resize',\n right : 'ew-resize',\n topleft : 'nwse-resize',\n bottomright: 'nwse-resize',\n topright : 'nesw-resize',\n bottomleft : 'nesw-resize',\n }),\n\n getCursor: function (action) {\n if (action.axis) {\n return resize.cursors[action.name + action.axis];\n }\n else if (action.edges) {\n let cursorKey = '';\n const edgeNames = ['top', 'bottom', 'left', 'right'];\n\n for (let i = 0; i < 4; i++) {\n if (action.edges[edgeNames[i]]) {\n cursorKey += edgeNames[i];\n }\n }\n\n return resize.cursors[cursorKey];\n }\n },\n};\n\n// resizestart\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'resizestart' || !interaction.prepared.edges) {\n return;\n }\n\n const startRect = interaction.target.getRect(interaction.element);\n const resizeOptions = interaction.target.options.resize;\n\n /*\n * When using the `resizable.square` or `resizable.preserveAspectRatio` options, resizing from one edge\n * will affect another. E.g. with `resizable.square`, resizing to make the right edge larger will make\n * the bottom edge larger by the same amount. We call these 'linked' edges. Any linked edges will depend\n * on the active edges and the edge being interacted with.\n */\n if (resizeOptions.square || resizeOptions.preserveAspectRatio) {\n const linkedEdges = utils.extend({}, interaction.prepared.edges);\n\n linkedEdges.top = linkedEdges.top || (linkedEdges.left && !linkedEdges.bottom);\n linkedEdges.left = linkedEdges.left || (linkedEdges.top && !linkedEdges.right );\n linkedEdges.bottom = linkedEdges.bottom || (linkedEdges.right && !linkedEdges.top );\n linkedEdges.right = linkedEdges.right || (linkedEdges.bottom && !linkedEdges.left );\n\n interaction.prepared._linkedEdges = linkedEdges;\n }\n else {\n interaction.prepared._linkedEdges = null;\n }\n\n // if using `resizable.preserveAspectRatio` option, record aspect ratio at the start of the resize\n if (resizeOptions.preserveAspectRatio) {\n interaction.resizeStartAspectRatio = startRect.width / startRect.height;\n }\n\n interaction.resizeRects = {\n start : startRect,\n current : utils.extend({}, startRect),\n inverted : utils.extend({}, startRect),\n previous : utils.extend({}, startRect),\n delta : {\n left: 0, right : 0, width : 0,\n top : 0, bottom: 0, height: 0,\n },\n };\n\n iEvent.rect = interaction.resizeRects.inverted;\n iEvent.deltaRect = interaction.resizeRects.delta;\n});\n\n// resizemove\nInteractEvent.signals.on('new', function ({ iEvent, phase, interaction }) {\n if (phase !== 'move' || !interaction.prepared.edges) { return; }\n\n const resizeOptions = interaction.target.options.resize;\n const invert = resizeOptions.invert;\n const invertible = invert === 'reposition' || invert === 'negate';\n\n let edges = interaction.prepared.edges;\n\n const start = interaction.resizeRects.start;\n const current = interaction.resizeRects.current;\n const inverted = interaction.resizeRects.inverted;\n const delta = interaction.resizeRects.delta;\n const previous = utils.extend(interaction.resizeRects.previous, inverted);\n const originalEdges = edges;\n\n let dx = iEvent.dx;\n let dy = iEvent.dy;\n\n if (resizeOptions.preserveAspectRatio || resizeOptions.square) {\n // `resize.preserveAspectRatio` takes precedence over `resize.square`\n const startAspectRatio = resizeOptions.preserveAspectRatio\n ? interaction.resizeStartAspectRatio\n : 1;\n\n edges = interaction.prepared._linkedEdges;\n\n if ((originalEdges.left && originalEdges.bottom)\n || (originalEdges.right && originalEdges.top)) {\n dy = -dx / startAspectRatio;\n }\n else if (originalEdges.left || originalEdges.right ) { dy = dx / startAspectRatio; }\n else if (originalEdges.top || originalEdges.bottom) { dx = dy * startAspectRatio; }\n }\n\n // update the 'current' rect without modifications\n if (edges.top ) { current.top += dy; }\n if (edges.bottom) { current.bottom += dy; }\n if (edges.left ) { current.left += dx; }\n if (edges.right ) { current.right += dx; }\n\n if (invertible) {\n // if invertible, copy the current rect\n utils.extend(inverted, current);\n\n if (invert === 'reposition') {\n // swap edge values if necessary to keep width/height positive\n let swap;\n\n if (inverted.top > inverted.bottom) {\n swap = inverted.top;\n\n inverted.top = inverted.bottom;\n inverted.bottom = swap;\n }\n if (inverted.left > inverted.right) {\n swap = inverted.left;\n\n inverted.left = inverted.right;\n inverted.right = swap;\n }\n }\n }\n else {\n // if not invertible, restrict to minimum of 0x0 rect\n inverted.top = Math.min(current.top, start.bottom);\n inverted.bottom = Math.max(current.bottom, start.top);\n inverted.left = Math.min(current.left, start.right);\n inverted.right = Math.max(current.right, start.left);\n }\n\n inverted.width = inverted.right - inverted.left;\n inverted.height = inverted.bottom - inverted.top ;\n\n for (const edge in inverted) {\n delta[edge] = inverted[edge] - previous[edge];\n }\n\n iEvent.edges = interaction.prepared.edges;\n iEvent.rect = inverted;\n iEvent.deltaRect = delta;\n});\n\n/*\\\n * Interactable.resizable\n [ method ]\n *\n * Gets or sets whether resize actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of resize elements\n | var isResizeable = interact('input[type=text]').resizable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on resize events (object makes the Interactable resizable)\n = (object) This Interactable\n | interact(element).resizable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | edges: {\n | top : true, // Use pointer coords to check for resize.\n | left : false, // Disable resizing from left edge.\n | bottom: '.resize-s',// Resize if pointer target matches selector\n | right : handleEl // Resize if pointer target is the given Element\n | },\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height are adjusted at a 1:1 ratio.\n | square: false,\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height maintain the aspect ratio they had when resizing started.\n | preserveAspectRatio: false,\n |\n | // a value of 'none' will limit the resize rect to a minimum of 0x0\n | // 'negate' will allow the rect to have negative width/height\n | // 'reposition' will keep the width/height positive by swapping\n | // the top and bottom edges and/or swapping the left and right edges\n | invert: 'none' || 'negate' || 'reposition'\n |\n | // limit multiple resizes.\n | // See the explanation in the @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n \\*/\nInteractable.prototype.resizable = function (options) {\n if (utils.is.object(options)) {\n this.options.resize.enabled = options.enabled === false? false: true;\n this.setPerAction('resize', options);\n this.setOnEvents('resize', options);\n\n if (/^x$|^y$|^xy$/.test(options.axis)) {\n this.options.resize.axis = options.axis;\n }\n else if (options.axis === null) {\n this.options.resize.axis = defaultOptions.resize.axis;\n }\n\n if (utils.is.bool(options.preserveAspectRatio)) {\n this.options.resize.preserveAspectRatio = options.preserveAspectRatio;\n }\n else if (utils.is.bool(options.square)) {\n this.options.resize.square = options.square;\n }\n\n return this;\n }\n if (utils.is.bool(options)) {\n this.options.resize.enabled = options;\n\n if (!options) {\n this.onresizestart = this.onresizestart = this.onresizeend = null;\n }\n\n return this;\n }\n return this.options.resize;\n};\n\nfunction checkResizeEdge (name, value, page, element, interactableElement, rect, margin) {\n // false, '', undefined, null\n if (!value) { return false; }\n\n // true value, use pointer coords and element rect\n if (value === true) {\n // if dimensions are negative, \"switch\" edges\n const width = utils.is.number(rect.width )? rect.width : rect.right - rect.left;\n const height = utils.is.number(rect.height)? rect.height : rect.bottom - rect.top ;\n\n if (width < 0) {\n if (name === 'left' ) { name = 'right'; }\n else if (name === 'right') { name = 'left' ; }\n }\n if (height < 0) {\n if (name === 'top' ) { name = 'bottom'; }\n else if (name === 'bottom') { name = 'top' ; }\n }\n\n if (name === 'left' ) { return page.x < ((width >= 0? rect.left: rect.right ) + margin); }\n if (name === 'top' ) { return page.y < ((height >= 0? rect.top : rect.bottom) + margin); }\n\n if (name === 'right' ) { return page.x > ((width >= 0? rect.right : rect.left) - margin); }\n if (name === 'bottom') { return page.y > ((height >= 0? rect.bottom: rect.top ) - margin); }\n }\n\n // the remaining checks require an element\n if (!utils.is.element(element)) { return false; }\n\n return utils.is.element(value)\n // the value is an element to use as a resize handle\n ? value === element\n // otherwise check if element matches value as selector\n : utils.matchesUpTo(element, value, interactableElement);\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.resizeAxes = 'xy';\n});\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action }) {\n if (action !== 'resize' || !interaction.resizeAxes) { return; }\n\n const options = interaction.target.options;\n\n if (options.resize.square) {\n if (interaction.resizeAxes === 'y') {\n iEvent.dx = iEvent.dy;\n }\n else {\n iEvent.dy = iEvent.dx;\n }\n iEvent.axes = 'xy';\n }\n else {\n iEvent.axes = interaction.resizeAxes;\n\n if (interaction.resizeAxes === 'x') {\n iEvent.dy = 0;\n }\n else if (interaction.resizeAxes === 'y') {\n iEvent.dx = 0;\n }\n }\n});\n\nactions.resize = resize;\nactions.names.push('resize');\nutils.merge(Interactable.eventTypes, [\n 'resizestart',\n 'resizemove',\n 'resizeinertiastart',\n 'resizeinertiaresume',\n 'resizeend',\n]);\nactions.methodDict.resize = 'resizable';\n\ndefaultOptions.resize = resize.defaults;\n\nmodule.exports = resize;\n","const raf = require('./utils/raf');\nconst getWindow = require('./utils/window').getWindow;\nconst is = require('./utils/is');\nconst domUtils = require('./utils/domUtils');\nconst Interaction = require('./Interaction');\nconst defaultOptions = require('./defaultOptions');\n\nconst autoScroll = {\n defaults: {\n enabled : false,\n container: null, // the item that is scrolled (Window or HTMLElement)\n margin : 60,\n speed : 300, // the scroll speed in pixels per second\n },\n\n interaction: null,\n i: null, // the handle returned by window.setInterval\n x: 0, y: 0, // Direction each pulse is to scroll in\n\n isScrolling: false,\n prevTime: 0,\n\n start: function (interaction) {\n autoScroll.isScrolling = true;\n raf.cancel(autoScroll.i);\n\n autoScroll.interaction = interaction;\n autoScroll.prevTime = new Date().getTime();\n autoScroll.i = raf.request(autoScroll.scroll);\n },\n\n stop: function () {\n autoScroll.isScrolling = false;\n raf.cancel(autoScroll.i);\n },\n\n // scroll the window by the values in scroll.x/y\n scroll: function () {\n const options = autoScroll.interaction.target.options[autoScroll.interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(autoScroll.interaction.element);\n const now = new Date().getTime();\n // change in time in seconds\n const dt = (now - autoScroll.prevTime) / 1000;\n // displacement\n const s = options.speed * dt;\n\n if (s >= 1) {\n if (is.window(container)) {\n container.scrollBy(autoScroll.x * s, autoScroll.y * s);\n }\n else if (container) {\n container.scrollLeft += autoScroll.x * s;\n container.scrollTop += autoScroll.y * s;\n }\n\n autoScroll.prevTime = now;\n }\n\n if (autoScroll.isScrolling) {\n raf.cancel(autoScroll.i);\n autoScroll.i = raf.request(autoScroll.scroll);\n }\n },\n check: function (interactable, actionName) {\n const options = interactable.options;\n\n return options[actionName].autoScroll && options[actionName].autoScroll.enabled;\n },\n onInteractionMove: function ({ interaction, pointer }) {\n if (!(interaction.interacting()\n && autoScroll.check(interaction.target, interaction.prepared.name))) {\n return;\n }\n\n if (interaction.simulation) {\n autoScroll.x = autoScroll.y = 0;\n return;\n }\n\n let top;\n let right;\n let bottom;\n let left;\n\n const options = interaction.target.options[interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(interaction.element);\n\n if (is.window(container)) {\n left = pointer.clientX < autoScroll.margin;\n top = pointer.clientY < autoScroll.margin;\n right = pointer.clientX > container.innerWidth - autoScroll.margin;\n bottom = pointer.clientY > container.innerHeight - autoScroll.margin;\n }\n else {\n const rect = domUtils.getElementClientRect(container);\n\n left = pointer.clientX < rect.left + autoScroll.margin;\n top = pointer.clientY < rect.top + autoScroll.margin;\n right = pointer.clientX > rect.right - autoScroll.margin;\n bottom = pointer.clientY > rect.bottom - autoScroll.margin;\n }\n\n autoScroll.x = (right ? 1: left? -1: 0);\n autoScroll.y = (bottom? 1: top? -1: 0);\n\n if (!autoScroll.isScrolling) {\n // set the autoScroll properties to those of the target\n autoScroll.margin = options.margin;\n autoScroll.speed = options.speed;\n\n autoScroll.start(interaction);\n }\n },\n};\n\nInteraction.signals.on('stop-active', function () {\n autoScroll.stop();\n});\n\nInteraction.signals.on('action-move', autoScroll.onInteractionMove);\n\ndefaultOptions.perAction.autoScroll = autoScroll.defaults;\n\nmodule.exports = autoScroll;\n","const Interactable = require('../Interactable');\nconst actions = require('../actions/base');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.ignoreFrom\n [ method ]\n *\n * If the target of the `mousedown`, `pointerdown` or `touchstart`\n * event or any of it's parents match the given CSS selector or\n * Element, no drag/resize/gesture is started.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to not ignore any elements\n = (string | Element | object) The current ignoreFrom value or this Interactable\n **\n | interact(element, { ignoreFrom: document.getElementById('no-action') });\n | // or\n | interact(element).ignoreFrom('input, textarea, a');\n\\*/\nInteractable.prototype.ignoreFrom = function (newValue) {\n return this._backCompatOption('ignoreFrom', newValue);\n};\n\n/*\\\n * Interactable.allowFrom\n [ method ]\n *\n * A drag/resize/gesture is started only If the target of the\n * `mousedown`, `pointerdown` or `touchstart` event or any of it's\n * parents match the given CSS selector or Element.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to allow from any element\n = (string | Element | object) The current allowFrom value or this Interactable\n **\n | interact(element, { allowFrom: document.getElementById('drag-handle') });\n | // or\n | interact(element).allowFrom('.handle');\n\\*/\nInteractable.prototype.allowFrom = function (newValue) {\n return this._backCompatOption('allowFrom', newValue);\n};\n\nInteractable.prototype.testIgnore = function (ignoreFrom, interactableElement, element) {\n if (!ignoreFrom || !is.element(element)) { return false; }\n\n if (is.string(ignoreFrom)) {\n return domUtils.matchesUpTo(element, ignoreFrom, interactableElement);\n }\n else if (is.element(ignoreFrom)) {\n return domUtils.nodeContains(ignoreFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testAllow = function (allowFrom, interactableElement, element) {\n if (!allowFrom) { return true; }\n\n if (!is.element(element)) { return false; }\n\n if (is.string(allowFrom)) {\n return domUtils.matchesUpTo(element, allowFrom, interactableElement);\n }\n else if (is.element(allowFrom)) {\n return domUtils.nodeContains(allowFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testIgnoreAllow = function (options, interactableElement, eventTarget) {\n return (!this.testIgnore(options.ignoreFrom, interactableElement, eventTarget)\n && this.testAllow(options.allowFrom, interactableElement, eventTarget));\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (event.buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\n","const interact = require('../interact');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst actions = require('../actions/base');\nconst defaultOptions = require('../defaultOptions');\nconst browser = require('../utils/browser');\nconst scope = require('../scope');\nconst utils = require('../utils');\nconst signals = require('../utils/Signals').new();\n\nrequire('./InteractableMethods');\n\nconst autoStart = {\n signals,\n withinInteractionLimit,\n // Allow this many interactions to happen simultaneously\n maxInteractions: Infinity,\n defaults: {\n perAction: {\n manualStart: false,\n max: Infinity,\n maxPerElement: 1,\n allowFrom: null,\n ignoreFrom: null,\n },\n },\n setActionDefaults: function (action) {\n utils.extend(action.defaults, autoStart.defaults.perAction);\n },\n};\n\n// set cursor style on mousedown\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget }) {\n if (interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\n// set cursor style on mousemove\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget }) {\n if (!interaction.mouse\n || interaction.pointerIsDown\n || interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\nInteraction.signals.on('move', function (arg) {\n const { interaction, event } = arg;\n\n if (!interaction.pointerIsDown\n || interaction.interacting()\n || !interaction.pointerWasMoved\n || !interaction.prepared.name) {\n return;\n }\n\n signals.fire('before-start', arg);\n\n const target = interaction.target;\n\n if (interaction.prepared.name && target) {\n // check manualStart and interaction limit\n if (target.options[interaction.prepared.name].manualStart\n || !withinInteractionLimit(target, interaction.element, interaction.prepared)) {\n interaction.stop(event);\n }\n else {\n interaction.start(interaction.prepared, target, interaction.element);\n }\n }\n});\n\n// Check if the current target supports the action.\n// If so, return the validated action. Otherwise, return null\nfunction validateAction (action, interactable, element, eventTarget) {\n if (utils.is.object(action)\n && interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget)\n && interactable.options[action.name].enabled\n && withinInteractionLimit(interactable, element, action)) {\n return action;\n }\n\n return null;\n}\n\nfunction validateSelector (interaction, pointer, event, matches, matchElements, eventTarget) {\n for (let i = 0, len = matches.length; i < len; i++) {\n const match = matches[i];\n const matchElement = matchElements[i];\n const action = validateAction(match.getAction(pointer, event, interaction, matchElement),\n match,\n matchElement,\n eventTarget);\n\n if (action) {\n return {\n action,\n target: match,\n element: matchElement,\n };\n }\n }\n\n return {};\n}\n\nfunction getActionInfo (interaction, pointer, event, eventTarget) {\n let matches = [];\n let matchElements = [];\n\n let element = eventTarget;\n let action = null;\n\n function pushMatches (interactable, selector, context) {\n const elements = (browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined);\n\n if (utils.matchesSelector(element, selector, elements)) {\n\n matches.push(interactable);\n matchElements.push(element);\n }\n }\n\n while (utils.is.element(element)) {\n matches = [];\n matchElements = [];\n\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && (action = validateAction(elementInteractable.getAction(pointer, event, interaction, element, eventTarget),\n elementInteractable,\n element,\n eventTarget))\n && !elementInteractable.options[action.name].manualStart) {\n return {\n element,\n action,\n target: elementInteractable,\n };\n }\n else {\n scope.interactables.forEachSelector(pushMatches, element);\n\n const actionInfo = validateSelector(interaction, pointer, event, matches, matchElements, eventTarget);\n\n if (actionInfo.action\n && !actionInfo.target.options[actionInfo.action.name].manualStart) {\n return actionInfo;\n }\n }\n\n element = utils.parentNode(element);\n }\n\n return {};\n}\n\nfunction prepare (interaction, { action, target, element }) {\n action = action || {};\n\n if (interaction.target && interaction.target.options.styleCursor) {\n interaction.target._doc.documentElement.style.cursor = '';\n }\n\n interaction.target = target;\n interaction.element = element;\n utils.copyAction(interaction.prepared, action);\n\n if (target && target.options.styleCursor) {\n const cursor = action? actions[action.name].getCursor(action) : '';\n interaction.target._doc.documentElement.style.cursor = cursor;\n }\n\n signals.fire('prepared', { interaction: interaction });\n}\n\nInteraction.signals.on('stop', function ({ interaction }) {\n const target = interaction.target;\n\n if (target && target.options.styleCursor) {\n target._doc.documentElement.style.cursor = '';\n }\n});\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (utils.is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (utils.is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n const buttons = event.buttons || ({\n 0: 1,\n 1: 4,\n 3: 8,\n 4: 16,\n })[event.button];\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\nfunction withinInteractionLimit (interactable, element, action) {\n const options = interactable.options;\n const maxActions = options[action.name].max;\n const maxPerElement = options[action.name].maxPerElement;\n let activeInteractions = 0;\n let targetCount = 0;\n let targetElementCount = 0;\n\n // no actions if any of these values == 0\n if (!(maxActions && maxPerElement && autoStart.maxInteractions)) { return; }\n\n for (let i = 0, len = scope.interactions.length; i < len; i++) {\n const interaction = scope.interactions[i];\n const otherAction = interaction.prepared.name;\n\n if (!interaction.interacting()) { continue; }\n\n activeInteractions++;\n\n if (activeInteractions >= autoStart.maxInteractions) {\n return false;\n }\n\n if (interaction.target !== interactable) { continue; }\n\n targetCount += (otherAction === action.name)|0;\n\n if (targetCount >= maxActions) {\n return false;\n }\n\n if (interaction.element === element) {\n targetElementCount++;\n\n if (otherAction !== action.name || targetElementCount >= maxPerElement) {\n return false;\n }\n }\n }\n\n return autoStart.maxInteractions > 0;\n}\n\n/*\\\n * interact.maxInteractions\n [ method ]\n **\n * Returns or sets the maximum number of concurrent interactions allowed.\n * By default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables\n * and elements, you need to enable it in the draggable, resizable and\n * gesturable `'max'` and `'maxPerElement'` options.\n **\n - newValue (number) #optional Any number. newValue <= 0 means no interactions.\n\\*/\ninteract.maxInteractions = function (newValue) {\n if (utils.is.number(newValue)) {\n autoStart.maxInteractions = newValue;\n\n return this;\n }\n\n return autoStart.maxInteractions;\n};\n\nInteractable.settingsMethods.push('styleCursor');\nInteractable.settingsMethods.push('actionChecker');\nInteractable.settingsMethods.push('ignoreFrom');\nInteractable.settingsMethods.push('allowFrom');\n\ndefaultOptions.base.actionChecker = null;\ndefaultOptions.base.styleCursor = true;\n\nutils.extend(defaultOptions.perAction, autoStart.defaults.perAction);\n\nmodule.exports = autoStart;\n","const autoStart = require('./base');\nconst Interaction = require('../Interaction');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.delayTimer = null;\n});\n\nautoStart.signals.on('prepared', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.delayTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.target, interaction.element);\n }, delay);\n }\n});\n\nInteraction.signals.on('move', function ({ interaction, duplicate }) {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.delayTimer);\n }\n});\n\n// prevent regular down->move autoStart\nautoStart.signals.on('before-start', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.prepared.name = null;\n }\n});\n","const autoStart = require('./base');\nconst scope = require('../scope');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\n\nconst { matchesSelector, parentNode } = require('../utils/domUtils');\n\nautoStart.setActionDefaults(require('../actions/drag'));\n\nautoStart.signals.on('before-start', function ({ interaction, eventTarget, dx, dy }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // check if a drag is in the correct axis\n const absX = Math.abs(dx);\n const absY = Math.abs(dy);\n const options = interaction.target.options.drag;\n const startAxis = options.startAxis;\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy');\n\n interaction.prepared.axis = options.lockAxis === 'start'\n ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n : options.lockAxis;\n\n // if the movement isn't in the startAxis of the interactable\n if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) {\n // cancel the prepared action\n interaction.prepared.name = null;\n\n // then try to get a drag from another ineractable\n\n if (!interaction.prepared.name) {\n\n let element = eventTarget;\n\n const getDraggable = function (interactable, selector, context) {\n const elements = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n if (interactable === interaction.target) { return; }\n\n if (!options.manualStart\n && !interactable.testIgnoreAllow(options, element, eventTarget)\n && matchesSelector(element, selector, elements)) {\n\n const action = interactable.getAction(interaction.downPointer,\n interaction.downEvent,\n interaction,\n element);\n\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, interactable)\n && autoStart.validateAction(action, interactable, element, eventTarget)) {\n\n return interactable;\n }\n }\n };\n\n let action = null;\n\n // check all interactables\n while (is.element(element)) {\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && elementInteractable !== interaction.target\n && !elementInteractable.options.drag.manualStart) {\n\n action = elementInteractable.getAction(interaction.downPointer, interaction.downEvent, interaction, element);\n }\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, elementInteractable)) {\n\n interaction.prepared.name = 'drag';\n interaction.target = elementInteractable;\n interaction.element = element;\n break;\n }\n\n const selectorInteractable = scope.interactables.forEachSelector(getDraggable, element);\n\n if (selectorInteractable) {\n interaction.prepared.name = 'drag';\n interaction.target = selectorInteractable;\n interaction.element = element;\n break;\n }\n\n element = parentNode(element);\n }\n }\n }\n});\n\nfunction checkStartAxis (startAxis, interactable) {\n if (!interactable) { return false; }\n\n const thisAxis = interactable.options.drag.startAxis;\n\n return (startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis);\n}\n","require('./base').setActionDefaults(require('../actions/gesture'));\n","require('./base').setActionDefaults(require('../actions/resize'));\n","module.exports = {\n base: {\n accept : null,\n preventDefault: 'auto',\n deltaSource : 'page',\n },\n\n perAction: {\n origin: { x: 0, y: 0 },\n\n // only allow left button by default\n // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n mouseButtons: 1,\n\n inertia: {\n enabled : false,\n resistance : 10, // the lambda in exponential decay\n minSpeed : 100, // target speed must be above this for inertia to start\n endSpeed : 10, // the speed at which inertia is slow enough to stop\n allowResume : true, // allow resuming an action in inertia phase\n smoothEndDuration: 300, // animate to snap/restrict endOnly if there's no inertia\n },\n },\n};\n","/* browser entry point */\n\n// Legacy browser support\nrequire('./legacyBrowsers');\n\n// inertia\nrequire('./inertia');\n\n// modifiers\nrequire('./modifiers/snap');\nrequire('./modifiers/restrict');\n\n// pointerEvents\nrequire('./pointerEvents/base');\nrequire('./pointerEvents/holdRepeat');\nrequire('./pointerEvents/interactableTargets');\n\n// delay\nrequire('./autoStart/delay');\n\n// actions\nrequire('./actions/gesture');\nrequire('./actions/resize');\nrequire('./actions/drag');\nrequire('./actions/drop');\n\n// load these modifiers after resize is loaded\nrequire('./modifiers/snapSize');\nrequire('./modifiers/restrictEdges');\nrequire('./modifiers/restrictSize');\n\n// autoStart actions\nrequire('./autoStart/gesture');\nrequire('./autoStart/resize');\nrequire('./autoStart/drag');\n\n// Interactable preventDefault setting\nrequire('./interactablePreventDefault.js');\n\n// autoScroll\nrequire('./autoScroll');\n\n// export interact\nmodule.exports = require('./interact');\n","const InteractEvent = require('./InteractEvent');\nconst Interaction = require('./Interaction');\nconst modifiers = require('./modifiers');\nconst utils = require('./utils');\nconst animationFrame = require('./utils/raf');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.inertiaStatus = {\n active : false,\n smoothEnd : false,\n allowResume: false,\n\n startEvent: null,\n upCoords : {},\n\n xe: 0, ye: 0,\n sx: 0, sy: 0,\n\n t0: 0,\n vx0: 0, vys: 0,\n duration: 0,\n\n lambda_v0: 0,\n one_ve_v0: 0,\n i : null,\n };\n\n interaction.boundInertiaFrame = () => inertiaFrame .apply(interaction);\n interaction.boundSmoothEndFrame = () => smoothEndFrame.apply(interaction);\n});\n\nInteraction.signals.on('down', function ({ interaction, event, pointer, eventTarget }) {\n const status = interaction.inertiaStatus;\n\n // Check if the down event hits the current inertia target\n if (status.active) {\n let element = eventTarget;\n\n // climb up the DOM tree from the event target\n while (utils.is.element(element)) {\n\n // if interaction element is the current inertia target element\n if (element === interaction.element) {\n // stop inertia\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n\n // update pointers to the down event's coordinates\n interaction.updatePointer(pointer);\n utils.setCoords(interaction.curCoords, interaction.pointers);\n\n // fire appropriate signals\n const signalArg = { interaction };\n Interaction.signals.fire('before-action-move', signalArg);\n Interaction.signals.fire('action-resume' , signalArg);\n\n // fire a reume event\n const resumeEvent = new InteractEvent(interaction,\n event,\n interaction.prepared.name,\n 'inertiaresume',\n interaction.element);\n\n interaction.target.fire(resumeEvent);\n interaction.prevEvent = resumeEvent;\n modifiers.resetStatuses(interaction.modifierStatuses);\n\n utils.copyCoords(interaction.prevCoords, interaction.curCoords);\n break;\n }\n\n element = utils.parentNode(element);\n }\n }\n});\n\nInteraction.signals.on('up', function ({ interaction, event }) {\n const status = interaction.inertiaStatus;\n\n if (!interaction.interacting() || status.active) { return; }\n\n const target = interaction.target;\n const options = target && target.options;\n const inertiaOptions = options && interaction.prepared.name && options[interaction.prepared.name].inertia;\n\n const now = new Date().getTime();\n const statuses = {};\n const page = utils.extend({}, interaction.curCoords.page);\n const pointerSpeed = interaction.pointerDelta.client.speed;\n\n let smoothEnd = false;\n let modifierResult;\n\n // check if inertia should be started\n const inertiaPossible = (inertiaOptions && inertiaOptions.enabled\n && interaction.prepared.name !== 'gesture'\n && event !== status.startEvent);\n\n const inertia = (inertiaPossible\n && (now - interaction.curCoords.timeStamp) < 50\n && pointerSpeed > inertiaOptions.minSpeed\n && pointerSpeed > inertiaOptions.endSpeed);\n\n const modifierArg = {\n interaction,\n pageCoords: page,\n statuses,\n preEnd: true,\n requireEndOnly: true,\n };\n\n // smoothEnd\n if (inertiaPossible && !inertia) {\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n if (modifierResult.shouldMove && modifierResult.locked) {\n smoothEnd = true;\n }\n }\n\n if (!(inertia || smoothEnd)) { return; }\n\n utils.copyCoords(status.upCoords, interaction.curCoords);\n\n interaction.pointers[0] = status.startEvent =\n new InteractEvent(interaction, event, interaction.prepared.name, 'inertiastart', interaction.element);\n\n status.t0 = now;\n\n status.active = true;\n status.allowResume = inertiaOptions.allowResume;\n interaction.simulation = status;\n\n target.fire(status.startEvent);\n\n if (inertia) {\n status.vx0 = interaction.pointerDelta.client.vx;\n status.vy0 = interaction.pointerDelta.client.vy;\n status.v0 = pointerSpeed;\n\n calcInertia(interaction, status);\n\n utils.extend(page, interaction.curCoords.page);\n\n page.x += status.xe;\n page.y += status.ye;\n\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n status.modifiedXe += modifierResult.dx;\n status.modifiedYe += modifierResult.dy;\n\n status.i = animationFrame.request(interaction.boundInertiaFrame);\n }\n else {\n status.smoothEnd = true;\n status.xe = modifierResult.dx;\n status.ye = modifierResult.dy;\n\n status.sx = status.sy = 0;\n\n status.i = animationFrame.request(interaction.boundSmoothEndFrame);\n }\n});\n\nInteraction.signals.on('stop-active', function ({ interaction }) {\n const status = interaction.inertiaStatus;\n\n if (status.active) {\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n }\n});\n\nfunction calcInertia (interaction, status) {\n const inertiaOptions = interaction.target.options[interaction.prepared.name].inertia;\n const lambda = inertiaOptions.resistance;\n const inertiaDur = -Math.log(inertiaOptions.endSpeed / status.v0) / lambda;\n\n status.x0 = interaction.prevEvent.pageX;\n status.y0 = interaction.prevEvent.pageY;\n status.t0 = status.startEvent.timeStamp / 1000;\n status.sx = status.sy = 0;\n\n status.modifiedXe = status.xe = (status.vx0 - inertiaDur) / lambda;\n status.modifiedYe = status.ye = (status.vy0 - inertiaDur) / lambda;\n status.te = inertiaDur;\n\n status.lambda_v0 = lambda / status.v0;\n status.one_ve_v0 = 1 - inertiaOptions.endSpeed / status.v0;\n}\n\nfunction inertiaFrame () {\n updateInertiaCoords(this);\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n\n const status = this.inertiaStatus;\n const options = this.target.options[this.prepared.name].inertia;\n const lambda = options.resistance;\n const t = new Date().getTime() / 1000 - status.t0;\n\n if (t < status.te) {\n\n const progress = 1 - (Math.exp(-lambda * t) - status.lambda_v0) / status.one_ve_v0;\n\n if (status.modifiedXe === status.xe && status.modifiedYe === status.ye) {\n status.sx = status.xe * progress;\n status.sy = status.ye * progress;\n }\n else {\n const quadPoint = utils.getQuadraticCurvePoint(0, 0,\n status.xe,\n status.ye,\n status.modifiedXe,\n status.modifiedYe,\n progress);\n\n status.sx = quadPoint.x;\n status.sy = quadPoint.y;\n }\n\n this.doMove();\n\n status.i = animationFrame.request(this.boundInertiaFrame);\n }\n else {\n status.sx = status.modifiedXe;\n status.sy = status.modifiedYe;\n\n this.doMove();\n this.end(status.startEvent);\n status.active = false;\n this.simulation = null;\n }\n\n utils.copyCoords(this.prevCoords, this.curCoords);\n}\n\nfunction smoothEndFrame () {\n updateInertiaCoords(this);\n\n const status = this.inertiaStatus;\n const t = new Date().getTime() - status.t0;\n const duration = this.target.options[this.prepared.name].inertia.smoothEndDuration;\n\n if (t < duration) {\n status.sx = utils.easeOutQuad(t, 0, status.xe, duration);\n status.sy = utils.easeOutQuad(t, 0, status.ye, duration);\n\n this.pointerMove(status.startEvent, status.startEvent);\n\n status.i = animationFrame.request(this.boundSmoothEndFrame);\n }\n else {\n status.sx = status.xe;\n status.sy = status.ye;\n\n this.pointerMove(status.startEvent, status.startEvent);\n this.end(status.startEvent);\n\n status.smoothEnd =\n status.active = false;\n this.simulation = null;\n }\n}\n\nfunction updateInertiaCoords (interaction) {\n const status = interaction.inertiaStatus;\n\n // return if inertia isn't running\n if (!status.active) { return; }\n\n const pageUp = status.upCoords.page;\n const clientUp = status.upCoords.client;\n\n utils.setCoords(interaction.curCoords, [ {\n pageX : pageUp.x + status.sx,\n pageY : pageUp.y + status.sy,\n clientX: clientUp.x + status.sx,\n clientY: clientUp.y + status.sy,\n } ]);\n}\n","const browser = require('./utils/browser');\nconst events = require('./utils/events');\nconst utils = require('./utils');\nconst scope = require('./scope');\nconst Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\n\nconst globalEvents = {};\n\n/*\\\n * interact\n [ method ]\n *\n * The methods of this variable can be used to set elements as\n * interactables and also to change various default settings.\n *\n * Calling it as a function and passing an element or a valid CSS selector\n * string returns an Interactable object which has various methods to\n * configure it.\n *\n - element (Element | string) The HTML or SVG Element to interact with or CSS selector\n = (object) An @Interactable\n *\n > Usage\n | interact('#draggable').draggable(true);\n |\n | var rectables = interact('rect');\n | rectables\n | .gesturable(true)\n | .on('gesturemove', function (event) {\n | // ...\n | });\n\\*/\nfunction interact (element, options) {\n let interactable = scope.interactables.get(element, options);\n\n if (!interactable) {\n interactable = new Interactable(element, options);\n interactable.events.global = globalEvents;\n }\n\n return interactable;\n}\n\n/*\\\n * interact.isSet\n [ method ]\n *\n * Check if an element has been set\n - element (Element) The Element being searched for\n = (boolean) Indicates if the element or CSS selector was previously passed to interact\n\\*/\ninteract.isSet = function (element, options) {\n return scope.interactables.indexOfElement(element, options && options.context) !== -1;\n};\n\n/*\\\n * interact.on\n [ method ]\n *\n * Adds a global listener for an InteractEvent or adds a DOM event to\n * `document`\n *\n - type (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) interact\n\\*/\ninteract.on = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.on(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.on(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n // if it is an InteractEvent type, add listener to globalEvents\n if (utils.contains(Interactable.eventTypes, type)) {\n // if this type of event was never bound\n if (!globalEvents[type]) {\n globalEvents[type] = [listener];\n }\n else {\n globalEvents[type].push(listener);\n }\n }\n // If non InteractEvent type, addEventListener to document\n else {\n events.add(scope.document, type, listener, { options });\n }\n\n return interact;\n};\n\n/*\\\n * interact.off\n [ method ]\n *\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n - type (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) interact\n \\*/\ninteract.off = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.off(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.off(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n if (!utils.contains(Interactable.eventTypes, type)) {\n events.remove(scope.document, type, listener, options);\n }\n else {\n let index;\n\n if (type in globalEvents\n && (index = utils.indexOf(globalEvents[type], listener)) !== -1) {\n globalEvents[type].splice(index, 1);\n }\n }\n\n return interact;\n};\n\n/*\\\n * interact.debug\n [ method ]\n *\n * Returns an object which exposes internal data\n = (object) An object with properties that outline the current state and expose internal functions and variables\n\\*/\ninteract.debug = function () {\n return scope;\n};\n\n// expose the functions used to calculate multi-touch properties\ninteract.getPointerAverage = utils.pointerAverage;\ninteract.getTouchBBox = utils.touchBBox;\ninteract.getTouchDistance = utils.touchDistance;\ninteract.getTouchAngle = utils.touchAngle;\n\ninteract.getElementRect = utils.getElementRect;\ninteract.getElementClientRect = utils.getElementClientRect;\ninteract.matchesSelector = utils.matchesSelector;\ninteract.closest = utils.closest;\n\n/*\\\n * interact.supportsTouch\n [ method ]\n *\n = (boolean) Whether or not the browser supports touch input\n\\*/\ninteract.supportsTouch = function () {\n return browser.supportsTouch;\n};\n\n/*\\\n * interact.supportsPointerEvent\n [ method ]\n *\n = (boolean) Whether or not the browser supports PointerEvents\n\\*/\ninteract.supportsPointerEvent = function () {\n return browser.supportsPointerEvent;\n};\n\n/*\\\n * interact.stop\n [ method ]\n *\n * Cancels all interactions (end events are not fired)\n *\n - event (Event) An event on which to call preventDefault()\n = (object) interact\n\\*/\ninteract.stop = function (event) {\n for (let i = scope.interactions.length - 1; i >= 0; i--) {\n scope.interactions[i].stop(event);\n }\n\n return interact;\n};\n\n/*\\\n * interact.pointerMoveTolerance\n [ method ]\n * Returns or sets the distance the pointer must be moved before an action\n * sequence occurs. This also affects tolerance for tap events.\n *\n - newValue (number) #optional The movement from the start position must be greater than this value\n = (number | Interactable) The current setting or interact\n\\*/\ninteract.pointerMoveTolerance = function (newValue) {\n if (utils.is.number(newValue)) {\n Interaction.pointerMoveTolerance = newValue;\n\n return this;\n }\n\n return Interaction.pointerMoveTolerance;\n};\n\ninteract.addDocument = scope.addDocument;\ninteract.removeDocument = scope.removeDocument;\n\nscope.interact = interact;\n\nmodule.exports = interact;\n","const Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\nconst scope = require('./scope');\nconst is = require('./utils/is');\nconst events = require('./utils/events');\n\nconst { nodeContains, matchesSelector } = require('./utils/domUtils');\n\n/*\\\n * Interactable.preventDefault\n [ method ]\n *\n * Returns or sets whether to prevent the browser's default behaviour\n * in response to pointer events. Can be set to:\n * - `'always'` to always prevent\n * - `'never'` to never prevent\n * - `'auto'` to let interact.js try to determine what would be best\n *\n - newValue (string) #optional `true`, `false` or `'auto'`\n = (string | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.preventDefault = function (newValue) {\n if (/^(always|never|auto)$/.test(newValue)) {\n this.options.preventDefault = newValue;\n return this;\n }\n\n if (is.bool(newValue)) {\n this.options.preventDefault = newValue? 'always' : 'never';\n return this;\n }\n\n return this.options.preventDefault;\n};\n\nInteractable.prototype.checkAndPreventDefault = function (event) {\n const setting = this.options.preventDefault;\n\n if (setting === 'never') { return; }\n\n if (setting === 'always') {\n event.preventDefault();\n return;\n }\n\n // setting === 'auto'\n\n // don't preventDefault if the browser supports passiveEvents\n // CSS touch-action and user-selecct should be used instead\n if (events.supportsOptions) {\n return;\n }\n\n // don't preventDefault of pointerdown events\n if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) {\n return;\n }\n\n // don't preventDefault on editable elements\n if (is.element(event.target)\n && matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) {\n return;\n }\n\n event.preventDefault();\n};\n\nfunction onInteractionEvent ({ interaction, event }) {\n if (interaction.target) {\n interaction.target.checkAndPreventDefault(event);\n }\n}\n\nfor (const eventSignal of ['down', 'move', 'up', 'cancel']) {\n Interaction.signals.on(eventSignal, onInteractionEvent);\n}\n\n// prevent native HTML5 drag on interact.js target elements\nInteraction.docEvents.dragstart = function preventNativeDrag (event) {\n for (const interaction of scope.interactions) {\n\n if (interaction.element\n && (interaction.element === event.target\n || nodeContains(interaction.element, event.target))) {\n\n interaction.target.checkAndPreventDefault(event);\n return;\n }\n }\n};\n","const scope = require('./scope');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst iFinder = require('./utils/interactionFinder');\nconst pointerEvents = require('./pointerEvents/base');\n\nconst { window } = require('./utils/window');\n\nconst toString = Object.prototype.toString;\n\nif (!window.Array.isArray) {\n window.Array.isArray = function (obj) {\n return toString.call(obj) === '[object Array]';\n };\n}\n\nif (!String.prototype.trim) {\n String.prototype.trim = function () {\n return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n };\n}\n\n// http://www.quirksmode.org/dom/events/click.html\n// >Events leading to dblclick\n//\n// IE8 doesn't fire down event before dblclick.\n// This workaround tries to fire a tap and doubletap after dblclick\nfunction onIE8Dblclick (event) {\n const eventTarget = event.target;\n const interaction = iFinder.search(event, event.type, eventTarget);\n\n if (!interaction) { return; }\n\n if (interaction.prevTap\n && event.clientX === interaction.prevTap.clientX\n && event.clientY === interaction.prevTap.clientY\n && eventTarget === interaction.prevTap.target) {\n\n interaction.downTargets[0] = eventTarget;\n interaction.downTimes [0] = new Date().getTime();\n\n pointerEvents.fire({\n interaction,\n event,\n eventTarget,\n pointer: event,\n type: 'tap',\n });\n }\n}\n\nif (browser.isIE8) {\n const selectFix = function (event) {\n for (const interaction of scope.interactions) {\n if (interaction.interacting()) {\n interaction.target.checkAndPreventDefault(event);\n }\n }\n };\n\n const onDocIE8 = function onDocIE8 ({ doc, win }, signalName) {\n const eventMethod = signalName.indexOf('listen') === 0\n ? events.add : events.remove;\n\n // For IE's lack of Event#preventDefault\n eventMethod(doc, 'selectstart', selectFix);\n\n if (pointerEvents) {\n eventMethod(doc, 'dblclick', onIE8Dblclick);\n }\n };\n\n scope.signals.on('add-document' , onDocIE8);\n scope.signals.on('remove-document', onDocIE8);\n}\n\nmodule.exports = null;\n","const InteractEvent = require('../InteractEvent');\nconst Interaction = require('../Interaction');\nconst extend = require('../utils/extend');\n\nconst modifiers = {\n names: [],\n\n setOffsets: function (arg) {\n const { interaction, pageCoords: page } = arg;\n const { target, element, startOffset } = interaction;\n const rect = target.getRect(element);\n\n if (rect) {\n startOffset.left = page.x - rect.left;\n startOffset.top = page.y - rect.top;\n\n startOffset.right = rect.right - page.x;\n startOffset.bottom = rect.bottom - page.y;\n\n if (!('width' in rect)) { rect.width = rect.right - rect.left; }\n if (!('height' in rect)) { rect.height = rect.bottom - rect.top ; }\n }\n else {\n startOffset.left = startOffset.top = startOffset.right = startOffset.bottom = 0;\n }\n\n arg.rect = rect;\n arg.interactable = target;\n arg.element = element;\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n\n arg.options = target.options[interaction.prepared.name][modifierName];\n\n if (!arg.options) {\n continue;\n }\n\n interaction.modifierOffsets[modifierName] = modifiers[modifierName].setOffset(arg);\n }\n },\n\n setAll: function (arg) {\n const { interaction, statuses, preEnd, requireEndOnly } = arg;\n const coords = extend({}, arg.pageCoords);\n const result = {\n dx: 0,\n dy: 0,\n changed: false,\n locked: false,\n shouldMove: true,\n };\n\n for (const modifierName of modifiers.names) {\n const modifier = modifiers[modifierName];\n const options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!shouldDo(options, preEnd, requireEndOnly)) { continue; }\n\n arg.status = arg.status = statuses[modifierName];\n arg.options = options;\n arg.offset = arg.interaction.modifierOffsets[modifierName];\n\n modifier.set(arg);\n\n if (arg.status.locked) {\n coords.x += arg.status.dx;\n coords.y += arg.status.dy;\n\n result.dx += arg.status.dx;\n result.dy += arg.status.dy;\n\n result.locked = true;\n }\n }\n\n // a move should be fired if:\n // - there are no modifiers enabled,\n // - no modifiers are \"locked\" i.e. have changed the pointer's coordinates, or\n // - the locked coords have changed since the last pointer move\n result.shouldMove = !arg.status || !result.locked || arg.status.changed;\n\n return result;\n },\n\n resetStatuses: function (statuses) {\n for (const modifierName of modifiers.names) {\n const status = statuses[modifierName] || {};\n\n status.dx = status.dy = 0;\n status.modifiedX = status.modifiedY = NaN;\n status.locked = false;\n status.changed = true;\n\n statuses[modifierName] = status;\n }\n\n return statuses;\n },\n\n start: function ({ interaction }, signalName) {\n const arg = {\n interaction,\n pageCoords: (signalName === 'action-resume' ?\n interaction.curCoords : interaction.startCoords).page,\n startOffset: interaction.startOffset,\n statuses: interaction.modifierStatuses,\n preEnd: false,\n requireEndOnly: false,\n };\n\n modifiers.setOffsets(arg);\n modifiers.resetStatuses(arg.statuses);\n\n arg.pageCoords = extend({}, interaction.startCoords.page);\n interaction.modifierResult = modifiers.setAll(arg);\n },\n};\n\nInteraction.signals.on('new', function (interaction) {\n interaction.startOffset = { left: 0, right: 0, top: 0, bottom: 0 };\n interaction.modifierOffsets = {};\n interaction.modifierStatuses = modifiers.resetStatuses({});\n interaction.modifierResult = null;\n});\n\nInteraction.signals.on('action-start' , modifiers.start);\nInteraction.signals.on('action-resume', modifiers.start);\n\nInteraction.signals.on('before-action-move', function ({ interaction, preEnd, interactingBeforeMove }) {\n const modifierResult = modifiers.setAll({\n interaction,\n preEnd,\n pageCoords: interaction.curCoords.page,\n statuses: interaction.modifierStatuses,\n requireEndOnly: false,\n });\n\n // don't fire an action move if a modifier would keep the event in the same\n // cordinates as before\n if (!modifierResult.shouldMove && interactingBeforeMove) {\n interaction._dontFireMove = true;\n }\n\n interaction.modifierResult = modifierResult;\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n for (let i = 0; i < modifiers.names.length; i++) {\n const options = interaction.target.options[interaction.prepared.name][modifiers.names[i]];\n\n // if the endOnly option is true for any modifier\n if (shouldDo(options, true, true)) {\n // fire a move event at the modified coordinates\n interaction.doMove({ event, preEnd: true });\n break;\n }\n }\n});\n\nInteractEvent.signals.on('set-xy', function (arg) {\n const { iEvent, interaction } = arg;\n const modifierArg = extend({}, arg);\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n modifierArg.options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!modifierArg.options) {\n continue;\n }\n\n const modifier = modifiers[modifierName];\n\n modifierArg.status = interaction.modifierStatuses[modifierName];\n\n iEvent[modifierName] = modifier.modifyCoords(modifierArg);\n }\n});\n\nfunction shouldDo (options, preEnd, requireEndOnly) {\n return (options && options.enabled\n && (preEnd || !options.endOnly)\n && (!requireEndOnly || options.endOnly));\n}\n\nmodule.exports = modifiers;\n","const modifiers = require('./index');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst restrict = {\n defaults: {\n enabled : false,\n endOnly : false,\n restriction: null,\n elementRect: null,\n },\n\n setOffset: function ({ rect, startOffset, options }) {\n const elementRect = options && options.elementRect;\n const offset = {};\n\n if (rect && elementRect) {\n offset.left = startOffset.left - (rect.width * elementRect.left);\n offset.top = startOffset.top - (rect.height * elementRect.top);\n\n offset.right = startOffset.right - (rect.width * (1 - elementRect.right));\n offset.bottom = startOffset.bottom - (rect.height * (1 - elementRect.bottom));\n }\n else {\n offset.left = offset.top = offset.right = offset.bottom = 0;\n }\n\n return offset;\n },\n\n set: function ({ pageCoords, interaction, status, options }) {\n if (!options) { return status; }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n\n const restriction = getRestrictionRect(options.restriction, interaction, page);\n\n if (!restriction) { return status; }\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n const rect = restriction;\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n const offset = interaction.modifierOffsets.restrict;\n\n // object is assumed to have\n // x, y, width, height or\n // left, top, right, bottom\n if ('x' in restriction && 'y' in restriction) {\n modifiedX = Math.max(Math.min(rect.x + rect.width - offset.right , page.x), rect.x + offset.left);\n modifiedY = Math.max(Math.min(rect.y + rect.height - offset.bottom, page.y), rect.y + offset.top );\n }\n else {\n modifiedX = Math.max(Math.min(rect.right - offset.right , page.x), rect.left + offset.left);\n modifiedY = Math.max(Math.min(rect.bottom - offset.bottom, page.y), rect.top + offset.top );\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const elementRect = options && options.elementRect;\n\n if (options && options.enabled\n && !(phase === 'start' && elementRect && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n getRestrictionRect,\n};\n\nfunction getRestrictionRect (value, interaction, page) {\n if (utils.is.function(value)) {\n return utils.resolveRectLike(value, interaction.target, interaction.element, [page.x, page.y, interaction]);\n } else {\n return utils.resolveRectLike(value, interaction.target, interaction.element);\n }\n}\n\nmodifiers.restrict = restrict;\nmodifiers.names.push('restrict');\n\ndefaultOptions.perAction.restrict = restrict.defaults;\n\nmodule.exports = restrict;\n","// This module adds the options.resize.restrictEdges setting which sets min and\n// max for the top, left, bottom and right edges of the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictEdges: {\n// inner: { top: 200, left: 200, right: 400, bottom: 400 },\n// outer: { top: 0, left: 0, right: 600, bottom: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst { getRestrictionRect } = require('./restrict');\n\nconst noInner = { top: +Infinity, left: +Infinity, bottom: -Infinity, right: -Infinity };\nconst noOuter = { top: -Infinity, left: -Infinity, bottom: +Infinity, right: +Infinity };\n\nconst restrictEdges = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n offset: null,\n },\n\n setOffset: function ({ interaction, startOffset, options }) {\n if (!options) {\n return utils.extend({}, startOffset);\n }\n\n const offset = getRestrictionRect(options.offset, interaction, interaction.startCoords.page);\n\n if (offset) {\n return {\n top: startOffset.top + offset.y,\n left: startOffset.left + offset.x,\n bottom: startOffset.bottom + offset.y,\n right: startOffset.right + offset.x,\n };\n }\n\n return startOffset;\n },\n\n set: function ({ pageCoords, interaction, status, offset, options }) {\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n const inner = rectUtils.xywhToTlbr(getRestrictionRect(options.inner, interaction, page)) || noInner;\n const outer = rectUtils.xywhToTlbr(getRestrictionRect(options.outer, interaction, page)) || noOuter;\n\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n if (edges.top) {\n modifiedY = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top);\n }\n else if (edges.bottom) {\n modifiedY = Math.max(Math.min(outer.bottom - offset.bottom, page.y), inner.bottom - offset.bottom);\n }\n if (edges.left) {\n modifiedX = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left);\n }\n else if (edges.right) {\n modifiedX = Math.max(Math.min(outer.right - offset.right, page.x), inner.right - offset.right);\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n if (options && options.enabled\n && !(phase === 'start' && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n noInner,\n noOuter,\n getRestrictionRect,\n};\n\nmodifiers.restrictEdges = restrictEdges;\nmodifiers.names.push('restrictEdges');\n\ndefaultOptions.perAction.restrictEdges = restrictEdges.defaults;\nresize.defaults.restrictEdges = restrictEdges.defaults;\n\nmodule.exports = restrictEdges;\n","// This module adds the options.resize.restrictSize setting which sets min and\n// max width and height for the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictSize: {\n// min: { width: -600, height: -600 },\n// max: { width: 600, height: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst restrictEdges = require('./restrictEdges');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst noMin = { width: -Infinity, height: -Infinity };\nconst noMax = { width: +Infinity, height: +Infinity };\n\nconst restrictSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n },\n\n setOffset: function ({ interaction }) {\n return interaction.startOffset;\n },\n\n set: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const rect = rectUtils.xywhToTlbr(interaction.resizeRects.inverted);\n\n const minSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.min, interaction)) || noMin;\n const maxSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.max, interaction)) || noMax;\n\n arg.options = {\n enabled: options.enabled,\n endOnly: options.endOnly,\n inner: utils.extend({}, restrictEdges.noInner),\n outer: utils.extend({}, restrictEdges.noOuter),\n };\n\n if (edges.top) {\n arg.options.inner.top = rect.bottom - minSize.height;\n arg.options.outer.top = rect.bottom - maxSize.height;\n }\n else if (edges.bottom) {\n arg.options.inner.bottom = rect.top + minSize.height;\n arg.options.outer.bottom = rect.top + maxSize.height;\n }\n if (edges.left) {\n arg.options.inner.left = rect.right - minSize.width;\n arg.options.outer.left = rect.right - maxSize.width;\n }\n else if (edges.right) {\n arg.options.inner.right = rect.left + minSize.width;\n arg.options.outer.right = rect.left + maxSize.width;\n }\n\n restrictEdges.set(arg);\n },\n\n modifyCoords: restrictEdges.modifyCoords,\n};\n\nmodifiers.restrictSize = restrictSize;\nmodifiers.names.push('restrictSize');\n\ndefaultOptions.perAction.restrictSize = restrictSize.defaults;\nresize.defaults.restrictSize = restrictSize.defaults;\n\nmodule.exports = restrictSize;\n","const modifiers = require('./index');\nconst interact = require('../interact');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst snap = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n\n relativePoints: null,\n },\n\n setOffset: function ({ interaction, interactable, element, rect, startOffset, options }) {\n const offsets = [];\n const optionsOrigin = utils.rectToXY(utils.resolveRectLike(options.origin));\n const origin = optionsOrigin || utils.getOriginXY(interactable, element, interaction.prepared.name);\n options = options || interactable.options[interaction.prepared.name].snap || {};\n\n let snapOffset;\n\n if (options.offset === 'startCoords') {\n snapOffset = {\n x: interaction.startCoords.page.x - origin.x,\n y: interaction.startCoords.page.y - origin.y,\n };\n }\n else {\n const offsetRect = utils.resolveRectLike(options.offset, interactable, element, [interaction]);\n\n snapOffset = utils.rectToXY(offsetRect) || { x: 0, y: 0 };\n }\n\n if (rect && options.relativePoints && options.relativePoints.length) {\n for (const { x: relativeX, y: relativeY } of options.relativePoints) {\n offsets.push({\n x: startOffset.left - (rect.width * relativeX) + snapOffset.x,\n y: startOffset.top - (rect.height * relativeY) + snapOffset.y,\n });\n }\n }\n else {\n offsets.push(snapOffset);\n }\n\n return offsets;\n },\n\n set: function ({ interaction, pageCoords, status, options, offset: offsets }) {\n const targets = [];\n let target;\n let page;\n let i;\n\n if (status.useStatusXY) {\n page = { x: status.x, y: status.y };\n }\n else {\n const origin = utils.getOriginXY(interaction.target, interaction.element, interaction.prepared.name);\n\n page = utils.extend({}, pageCoords);\n\n page.x -= origin.x;\n page.y -= origin.y;\n }\n\n status.realX = page.x;\n status.realY = page.y;\n\n let len = options.targets? options.targets.length : 0;\n\n for (const { x: offsetX, y: offsetY } of offsets) {\n const relativeX = page.x - offsetX;\n const relativeY = page.y - offsetY;\n\n for (const snapTarget of options.targets) {\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n targets.push({\n x: utils.is.number(target.x) ? (target.x + offsetX) : relativeX,\n y: utils.is.number(target.y) ? (target.y + offsetY) : relativeY,\n\n range: utils.is.number(target.range)? target.range: options.range,\n });\n }\n }\n\n const closest = {\n target: null,\n inRange: false,\n distance: 0,\n range: 0,\n dx: 0,\n dy: 0,\n };\n\n for (i = 0, len = targets.length; i < len; i++) {\n target = targets[i];\n\n const range = target.range;\n const dx = target.x - page.x;\n const dy = target.y - page.y;\n const distance = utils.hypot(dx, dy);\n let inRange = distance <= range;\n\n // Infinite targets count as being out of range\n // compared to non infinite ones that are in range\n if (range === Infinity && closest.inRange && closest.range !== Infinity) {\n inRange = false;\n }\n\n if (!closest.target || (inRange\n // is the closest target in range?\n ? (closest.inRange && range !== Infinity\n // the pointer is relatively deeper in this target\n ? distance / range < closest.distance / closest.range\n // this target has Infinite range and the closest doesn't\n : (range === Infinity && closest.range !== Infinity)\n // OR this target is closer that the previous closest\n || distance < closest.distance)\n // The other is not in range and the pointer is closer to this target\n : (!closest.inRange && distance < closest.distance))) {\n\n closest.target = target;\n closest.distance = distance;\n closest.range = range;\n closest.inRange = inRange;\n closest.dx = dx;\n closest.dy = dy;\n\n status.range = range;\n }\n }\n\n let snapChanged;\n\n if (closest.target) {\n snapChanged = (status.modifiedX !== closest.target.x || status.modifiedY !== closest.target.y);\n\n status.modifiedX = closest.target.x;\n status.modifiedY = closest.target.y;\n }\n else {\n snapChanged = true;\n\n status.modifiedX = NaN;\n status.modifiedY = NaN;\n }\n\n status.dx = closest.dx;\n status.dy = closest.dy;\n\n status.changed = (snapChanged || (closest.inRange && !status.locked));\n status.locked = closest.inRange;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const relativePoints = options && options.relativePoints;\n\n if (options && options.enabled\n && !(phase === 'start' && relativePoints && relativePoints.length)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n }\n\n return {\n range : status.range,\n locked : status.locked,\n x : status.modifiedX,\n y : status.modifiedY,\n realX : status.realX,\n realY : status.realY,\n dx : status.dx,\n dy : status.dy,\n };\n }\n },\n};\n\ninteract.createSnapGrid = function (grid) {\n return function (x, y) {\n const limits = grid.limits || {\n left : -Infinity,\n right : Infinity,\n top : -Infinity,\n bottom: Infinity,\n };\n let offsetX = 0;\n let offsetY = 0;\n\n if (utils.is.object(grid.offset)) {\n offsetX = grid.offset.x;\n offsetY = grid.offset.y;\n }\n\n const gridx = Math.round((x - offsetX) / grid.x);\n const gridy = Math.round((y - offsetY) / grid.y);\n\n const newX = Math.max(limits.left, Math.min(limits.right , gridx * grid.x + offsetX));\n const newY = Math.max(limits.top , Math.min(limits.bottom, gridy * grid.y + offsetY));\n\n return {\n x: newX,\n y: newY,\n range: grid.range,\n };\n };\n};\n\nmodifiers.snap = snap;\nmodifiers.names.push('snap');\n\ndefaultOptions.perAction.snap = snap.defaults;\n\nmodule.exports = snap;\n","// This module allows snapping of the size of targets during resize\n// interactions.\n\nconst modifiers = require('./index');\nconst snap = require('./snap');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\nconst utils = require('../utils/');\n\nconst snapSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n },\n\n setOffset: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.edges;\n\n if (!edges) { return; }\n\n arg.options = {\n relativePoints: [{\n x: edges.left? 0 : 1,\n y: edges.top ? 0 : 1,\n }],\n origin: { x: 0, y: 0 },\n offset: 'self',\n range: options.range,\n };\n\n const offsets = snap.setOffset(arg);\n arg.options = options;\n\n return offsets;\n },\n\n set: function (arg) {\n const { interaction, options, offset, pageCoords } = arg;\n const page = utils.extend({}, pageCoords);\n const relativeX = page.x - offset[0].x;\n const relativeY = page.y - offset[0].y;\n\n arg.options = utils.extend({}, options);\n arg.options.targets = [];\n\n for (const snapTarget of options.targets) {\n let target;\n\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n if ('width' in target && 'height' in target) {\n target.x = target.width;\n target.y = target.height;\n }\n\n arg.options.targets.push(target);\n }\n\n snap.set(arg);\n },\n\n modifyCoords: function (arg) {\n const { options } = arg;\n\n arg.options = utils.extend({}, options);\n arg.options.enabled = options.enabled;\n arg.options.relativePoints = [null];\n\n snap.modifyCoords(arg);\n },\n};\n\nmodifiers.snapSize = snapSize;\nmodifiers.names.push('snapSize');\n\ndefaultOptions.perAction.snapSize = snapSize.defaults;\nresize.defaults.snapSize = snapSize.defaults;\n\nmodule.exports = snapSize;\n","const pointerUtils = require('../utils/pointerUtils');\n\nmodule.exports = class PointerEvent {\n constructor (type, pointer, event, eventTarget, interaction) {\n pointerUtils.pointerExtend(this, event);\n\n if (event !== pointer) {\n pointerUtils.pointerExtend(this, pointer);\n }\n\n this.interaction = interaction;\n\n this.timeStamp = new Date().getTime();\n this.originalEvent = event;\n this.type = type;\n this.pointerId = pointerUtils.getPointerId(pointer);\n this.pointerType = pointerUtils.getPointerType(pointer, interaction);\n this.target = eventTarget;\n this.currentTarget = null;\n\n if (type === 'tap') {\n const pointerIndex = interaction.getPointerIndex(pointer);\n this.dt = this.timeStamp - interaction.downTimes[pointerIndex];\n\n const interval = this.timeStamp - interaction.tapTime;\n\n this.double = !!(interaction.prevTap\n && interaction.prevTap.type !== 'doubletap'\n && interaction.prevTap.target === this.target\n && interval < 500);\n }\n else if (type === 'doubletap') {\n this.dt = pointer.timeStamp - interaction.tapTime;\n }\n }\n\n subtractOrigin ({ x: originX, y: originY }) {\n this.pageX -= originX;\n this.pageY -= originY;\n this.clientX -= originX;\n this.clientY -= originY;\n\n return this;\n }\n\n addOrigin ({ x: originX, y: originY }) {\n this.pageX += originX;\n this.pageY += originY;\n this.clientX += originX;\n this.clientY += originY;\n\n return this;\n }\n\n preventDefault () {\n this.originalEvent.preventDefault();\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n};\n","const PointerEvent = require('./PointerEvent');\nconst Interaction = require('../Interaction');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst defaults = require('../defaultOptions');\nconst signals = require('../utils/Signals').new();\nconst { filter } = require('../utils/arr');\n\nconst simpleSignals = [ 'down', 'up', 'cancel' ];\nconst simpleEvents = [ 'down', 'up', 'cancel' ];\n\nconst pointerEvents = {\n PointerEvent,\n fire,\n collectEventTargets,\n signals,\n defaults: {\n holdDuration: 600,\n ignoreFrom : null,\n allowFrom : null,\n origin : { x: 0, y: 0 },\n },\n types: [\n 'down',\n 'move',\n 'up',\n 'cancel',\n 'tap',\n 'doubletap',\n 'hold',\n ],\n};\n\nfunction fire (arg) {\n const {\n interaction, pointer, event, eventTarget,\n type = arg.pointerEvent.type,\n targets = collectEventTargets(arg),\n pointerEvent = new PointerEvent(type, pointer, event, eventTarget, interaction),\n } = arg;\n\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n targets,\n type,\n pointerEvent,\n };\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n\n for (const prop in target.props || {}) {\n pointerEvent[prop] = target.props[prop];\n }\n\n const origin = utils.getOriginXY(target.eventable, target.element);\n\n pointerEvent.subtractOrigin(origin);\n pointerEvent.eventable = target.eventable;\n pointerEvent.currentTarget = target.element;\n\n target.eventable.fire(pointerEvent);\n\n pointerEvent.addOrigin(origin);\n\n if (pointerEvent.immediatePropagationStopped\n || (pointerEvent.propagationStopped\n && (i + 1) < targets.length && targets[i + 1].element !== pointerEvent.currentTarget)) {\n break;\n }\n }\n\n signals.fire('fired', signalArg);\n\n if (type === 'tap') {\n // if pointerEvent should make a double tap, create and fire a doubletap\n // PointerEvent and use that as the prevTap\n const prevTap = pointerEvent.double\n ? fire({\n interaction, pointer, event, eventTarget,\n type: 'doubletap',\n })\n : pointerEvent;\n\n interaction.prevTap = prevTap;\n interaction.tapTime = prevTap.timeStamp;\n }\n\n return pointerEvent;\n}\n\nfunction collectEventTargets ({ interaction, pointer, event, eventTarget, type }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n // do not fire a tap event if the pointer was moved before being lifted\n if (type === 'tap' && (interaction.pointerWasMoved\n // or if the pointerup target is different to the pointerdown target\n || !(interaction.downTargets[pointerIndex] && interaction.downTargets[pointerIndex] === eventTarget))) {\n return [];\n }\n\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n path,\n targets: [],\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (type === 'hold') {\n signalArg.targets = filter(signalArg.targets, target =>\n target.eventable.options.holdDuration === interaction.holdTimers[pointerIndex].duration);\n }\n\n return signalArg.targets;\n}\n\nInteraction.signals.on('update-pointer-down', function ({ interaction, pointerIndex }) {\n interaction.holdTimers[pointerIndex] = { duration: Infinity, timeout: null };\n});\n\nInteraction.signals.on('remove-pointer', function ({ interaction, pointerIndex }) {\n interaction.holdTimers.splice(pointerIndex, 1);\n});\n\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget, duplicateMove }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n if (!duplicateMove && (!interaction.pointerIsDown || interaction.pointerWasMoved)) {\n if (interaction.pointerIsDown) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n\n fire({\n interaction, pointer, event, eventTarget,\n type: 'move',\n });\n }\n});\n\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget, pointerIndex }) {\n // copy event to be used in timeout for IE8\n const eventCopy = browser.isIE8? utils.extend({}, event) : event;\n\n const timer = interaction.holdTimers[pointerIndex];\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'hold',\n targets: [],\n path,\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (!signalArg.targets.length) { return; }\n\n let minDuration = Infinity;\n\n for (let i = 0; i < signalArg.targets.length; i++) {\n const target = signalArg.targets[i];\n const holdDuration = target.eventable.options.holdDuration;\n\n if (holdDuration < minDuration) {\n minDuration = holdDuration;\n }\n }\n\n timer.duration = minDuration;\n timer.timeout = setTimeout(function () {\n fire({\n interaction, eventCopy, eventTarget,\n pointer: browser.isIE8? eventCopy : pointer,\n type: 'hold',\n });\n }, minDuration);\n});\n\nInteraction.signals.on('up', ({ interaction, pointer, event, eventTarget }) => {\n if (!interaction.pointerWasMoved) {\n fire({ interaction, eventTarget, pointer, event, type: 'tap' });\n }\n});\n\n['up', 'cancel'].forEach(function (signalName) {\n Interaction.signals.on(signalName, function ({ interaction, pointerIndex }) {\n if (interaction.holdTimers[pointerIndex]) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n });\n});\n\nfunction createSignalListener (type) {\n return function ({ interaction, pointer, event, eventTarget }) {\n fire({ interaction, eventTarget, pointer, event, type });\n };\n}\n\nfor (let i = 0; i < simpleSignals.length; i++) {\n Interaction.signals.on(simpleSignals[i], createSignalListener(simpleEvents[i]));\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.prevTap = null; // the most recent tap event on this interaction\n interaction.tapTime = 0; // time of the most recent tap event\n interaction.holdTimers = []; // [{ duration, timeout }]\n});\n\ndefaults.pointerEvents = pointerEvents.defaults;\nmodule.exports = pointerEvents;\n","const pointerEvents = require('./base');\nconst Interaction = require('../Interaction');\n\npointerEvents.signals.on('new', onNew);\npointerEvents.signals.on('fired', onFired);\n\nfor (const signal of ['move', 'up', 'cancel', 'endall']) {\n Interaction.signals.on(signal, endHoldRepeat);\n}\n\nfunction onNew ({ pointerEvent }) {\n if (pointerEvent.type !== 'hold') { return; }\n\n pointerEvent.count = (pointerEvent.count || 0) + 1;\n}\n\nfunction onFired ({ interaction, pointerEvent, eventTarget, targets }) {\n if (pointerEvent.type !== 'hold' || !targets.length) { return; }\n\n // get the repeat interval from the first eventable\n const interval = targets[0].eventable.options.holdRepeatInterval;\n\n // don't repeat if the interval is 0 or less\n if (interval <= 0) { return; }\n\n // set a timeout to fire the holdrepeat event\n interaction.holdIntervalHandle = setTimeout(function () {\n pointerEvents.fire({\n interaction,\n eventTarget,\n type: 'hold',\n pointer: pointerEvent,\n event: pointerEvent,\n });\n }, interval);\n}\n\nfunction endHoldRepeat ({ interaction }) {\n // set the interaction's holdStopTime property\n // to stop further holdRepeat events\n if (interaction.holdIntervalHandle) {\n clearInterval(interaction.holdIntervalHandle);\n interaction.holdIntervalHandle = null;\n }\n}\n\n// don't repeat by default\npointerEvents.defaults.holdRepeatInterval = 0;\npointerEvents.types.push('holdrepeat');\n\nmodule.exports = {\n onNew,\n onFired,\n endHoldRepeat,\n};\n","const pointerEvents = require('./base');\nconst Interactable = require('../Interactable');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\nconst scope = require('../scope');\nconst extend = require('../utils/extend');\nconst { merge } = require('../utils/arr');\n\npointerEvents.signals.on('collect-targets', function ({ targets, element, type, eventTarget }) {\n function collectSelectors (interactable, selector, context) {\n const els = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && is.element(element)\n && domUtils.matchesSelector(element, selector, els)\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n const interactable = scope.interactables.get(element);\n\n if (interactable) {\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n scope.interactables.forEachSelector(collectSelectors, element);\n});\n\nInteractable.signals.on('new', function ({ interactable }) {\n interactable.events.getRect = function (element) {\n return interactable.getRect(element);\n };\n});\n\nInteractable.signals.on('set', function ({ interactable, options }) {\n extend(interactable.events.options, pointerEvents.defaults);\n extend(interactable.events.options, options);\n});\n\nmerge(Interactable.eventTypes, pointerEvents.types);\n\nInteractable.prototype.pointerEvents = function (options) {\n extend(this.events.options, options);\n\n return this;\n};\n\nconst __backCompatOption = Interactable.prototype._backCompatOption;\n\nInteractable.prototype._backCompatOption = function (optionName, newValue) {\n const ret = __backCompatOption.call(this, optionName, newValue);\n\n if (ret === this) {\n this.events.options[optionName] = newValue;\n }\n\n return ret;\n};\n\nInteractable.settingsMethods.push('pointerEvents');\n","const utils = require('./utils');\nconst events = require('./utils/events');\nconst signals = require('./utils/Signals').new();\n\nconst scope = {\n signals,\n events,\n utils,\n\n // main document\n document: require('./utils/domObjects').document,\n // all documents being listened to\n documents: [],\n\n addDocument: function (doc, win) {\n // do nothing if document is already known\n if (utils.contains(scope.documents, doc)) { return false; }\n\n win = win || scope.getWindow(doc);\n\n scope.documents.push(doc);\n events.documents.push(doc);\n\n // don't add an unload event for the main document\n // so that the page may be cached in browser history\n if (doc !== scope.document) {\n events.add(win, 'unload', scope.onWindowUnload);\n }\n\n signals.fire('add-document', { doc, win });\n },\n\n removeDocument: function (doc, win) {\n const index = utils.indexOf(scope.documents, doc);\n\n win = win || scope.getWindow(doc);\n\n events.remove(win, 'unload', scope.onWindowUnload);\n\n scope.documents.splice(index, 1);\n events.documents.splice(index, 1);\n\n signals.fire('remove-document', { win, doc });\n },\n\n onWindowUnload: function () {\n scope.removeDocument(this.document, this);\n },\n};\n\nmodule.exports = scope;\n","const { indexOf } = require('./arr');\n\nclass Signals {\n constructor () {\n this.listeners = {\n // signalName: [listeners],\n };\n }\n\n on (name, listener) {\n if (!this.listeners[name]) {\n this.listeners[name] = [listener];\n return;\n }\n\n this.listeners[name].push(listener);\n }\n\n off (name, listener) {\n if (!this.listeners[name]) { return; }\n\n const index = indexOf(this.listeners[name], listener);\n\n if (index !== -1) {\n this.listeners[name].splice(index, 1);\n }\n }\n\n fire (name, arg) {\n const targetListeners = this.listeners[name];\n\n if (!targetListeners) { return; }\n\n for (let i = 0; i < targetListeners.length; i++) {\n if (targetListeners[i](arg, name) === false) {\n return;\n }\n }\n }\n}\n\nSignals.new = function () {\n return new Signals();\n};\n\nmodule.exports = Signals;\n","function indexOf (array, target) {\n for (let i = 0, len = array.length; i < len; i++) {\n if (array[i] === target) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction contains (array, target) {\n return indexOf(array, target) !== -1;\n}\n\nfunction merge (target, source) {\n for (let i = 0; i < source.length; i++) {\n target.push(source[i]);\n }\n\n return target;\n}\n\nfunction filter (array, test) {\n const result = [];\n\n for (let i = 0; i < array.length; i++) {\n if (test(array[i])) {\n result.push(array[i]);\n }\n }\n\n return result;\n}\n\nmodule.exports = {\n indexOf,\n contains,\n merge,\n filter,\n};\n","const { window } = require('./window');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst Element = domObjects.Element;\nconst navigator = window.navigator;\n\nconst browser = {\n // Does the browser support touch input?\n supportsTouch: !!(('ontouchstart' in window) || is.function(window.DocumentTouch)\n && domObjects.document instanceof window.DocumentTouch),\n\n // Does the browser support PointerEvents\n supportsPointerEvent: !!domObjects.PointerEvent,\n\n isIE8: ('attachEvent' in window) && !('addEventListener' in window),\n\n // Opera Mobile must be handled differently\n isOperaMobile: (navigator.appName === 'Opera'\n && browser.supportsTouch\n && navigator.userAgent.match('Presto')),\n\n // scrolling doesn't change the result of getClientRects on iOS 7\n isIOS7: (/iP(hone|od|ad)/.test(navigator.platform)\n && /OS 7[^\\d]/.test(navigator.appVersion)),\n\n isIe9OrOlder: /MSIE (8|9)/.test(navigator.userAgent),\n\n // prefix matchesSelector\n prefixedMatchesSelector: 'matches' in Element.prototype\n ? 'matches': 'webkitMatchesSelector' in Element.prototype\n ? 'webkitMatchesSelector': 'mozMatchesSelector' in Element.prototype\n ? 'mozMatchesSelector': 'oMatchesSelector' in Element.prototype\n ? 'oMatchesSelector': 'msMatchesSelector',\n\n useMatchesSelectorPolyfill: false,\n\n pEventTypes: (domObjects.PointerEvent\n ? (domObjects.PointerEvent === window.MSPointerEvent\n ? {\n up: 'MSPointerUp',\n down: 'MSPointerDown',\n over: 'mouseover',\n out: 'mouseout',\n move: 'MSPointerMove',\n cancel: 'MSPointerCancel',\n }\n : {\n up: 'pointerup',\n down: 'pointerdown',\n over: 'pointerover',\n out: 'pointerout',\n move: 'pointermove',\n cancel: 'pointercancel',\n })\n : null),\n\n // because Webkit and Opera still use 'mousewheel' event type\n wheelEvent: 'onmousewheel' in domObjects.document? 'mousewheel': 'wheel',\n\n};\n\nbrowser.useMatchesSelectorPolyfill = !is.function(Element.prototype[browser.prefixedMatchesSelector]);\n\nmodule.exports = browser;\n","const domObjects = {};\nconst win = require('./window').window;\n\nfunction blank () {}\n\ndomObjects.document = win.document;\ndomObjects.DocumentFragment = win.DocumentFragment || blank;\ndomObjects.SVGElement = win.SVGElement || blank;\ndomObjects.SVGSVGElement = win.SVGSVGElement || blank;\ndomObjects.SVGElementInstance = win.SVGElementInstance || blank;\ndomObjects.Element = win.Element || blank;\ndomObjects.HTMLElement = win.HTMLElement || domObjects.Element;\n\ndomObjects.Event = win.Event;\ndomObjects.Touch = win.Touch || blank;\ndomObjects.PointerEvent = (win.PointerEvent || win.MSPointerEvent);\n\nmodule.exports = domObjects;\n","const win = require('./window');\nconst browser = require('./browser');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst domUtils = {\n nodeContains: function (parent, child) {\n while (child) {\n if (child === parent) {\n return true;\n }\n\n child = child.parentNode;\n }\n\n return false;\n },\n\n closest: function (element, selector) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) { return element; }\n\n element = domUtils.parentNode(element);\n }\n\n return null;\n },\n\n parentNode: function (node) {\n let parent = node.parentNode;\n\n if (is.docFrag(parent)) {\n // skip past #shado-root fragments\n while ((parent = parent.host) && is.docFrag(parent)) {\n continue;\n }\n\n return parent;\n }\n\n return parent;\n },\n\n // taken from http://tanalin.com/en/blog/2012/12/matches-selector-ie8/ and modified\n matchesSelectorPolyfill: browser.useMatchesSelectorPolyfill\n ? function (element, selector, elems) {\n elems = elems || element.parentNode.querySelectorAll(selector);\n\n for (let i = 0, len = elems.length; i < len; i++) {\n if (elems[i] === element) {\n return true;\n }\n }\n\n return false;\n }\n : null,\n\n matchesSelector: function (element, selector, nodeList) {\n if (browser.useMatchesSelectorPolyfill) {\n return domUtils.matchesSelectorPolyfill(element, selector, nodeList);\n }\n\n // remove /deep/ from selectors if shadowDOM polyfill is used\n if (win.window !== win.realWindow) {\n selector = selector.replace(/\\/deep\\//g, ' ');\n }\n\n return element[browser.prefixedMatchesSelector](selector);\n },\n\n // Test for the element that's \"above\" all other qualifiers\n indexOfDeepestElement: function (elements) {\n let deepestZoneParents = [];\n let dropzoneParents = [];\n let dropzone;\n let deepestZone = elements[0];\n let index = deepestZone? 0: -1;\n let parent;\n let child;\n let i;\n let n;\n\n for (i = 1; i < elements.length; i++) {\n dropzone = elements[i];\n\n // an element might belong to multiple selector dropzones\n if (!dropzone || dropzone === deepestZone) {\n continue;\n }\n\n if (!deepestZone) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n // check if the deepest or current are document.documentElement or document.rootElement\n // - if the current dropzone is, do nothing and continue\n if (dropzone.parentNode === dropzone.ownerDocument) {\n continue;\n }\n // - if deepest is, update with the current dropzone and continue to next\n else if (deepestZone.parentNode === dropzone.ownerDocument) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n if (!deepestZoneParents.length) {\n parent = deepestZone;\n while (parent.parentNode && parent.parentNode !== parent.ownerDocument) {\n deepestZoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n }\n\n // if this element is an svg element and the current deepest is\n // an HTMLElement\n if (deepestZone instanceof domObjects.HTMLElement\n && dropzone instanceof domObjects.SVGElement\n && !(dropzone instanceof domObjects.SVGSVGElement)) {\n\n if (dropzone === deepestZone.parentNode) {\n continue;\n }\n\n parent = dropzone.ownerSVGElement;\n }\n else {\n parent = dropzone;\n }\n\n dropzoneParents = [];\n\n while (parent.parentNode !== parent.ownerDocument) {\n dropzoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n\n n = 0;\n\n // get (position of last common ancestor) + 1\n while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) {\n n++;\n }\n\n const parents = [\n dropzoneParents[n - 1],\n dropzoneParents[n],\n deepestZoneParents[n],\n ];\n\n child = parents[0].lastChild;\n\n while (child) {\n if (child === parents[1]) {\n deepestZone = dropzone;\n index = i;\n deepestZoneParents = [];\n\n break;\n }\n else if (child === parents[2]) {\n break;\n }\n\n child = child.previousSibling;\n }\n }\n\n return index;\n },\n\n matchesUpTo: function (element, selector, limit) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) {\n return true;\n }\n\n element = domUtils.parentNode(element);\n\n if (element === limit) {\n return domUtils.matchesSelector(element, selector);\n }\n }\n\n return false;\n },\n\n getActualElement: function (element) {\n return (element instanceof domObjects.SVGElementInstance\n ? element.correspondingUseElement\n : element);\n },\n\n getScrollXY: function (relevantWindow) {\n relevantWindow = relevantWindow || win.window;\n return {\n x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft,\n y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop,\n };\n },\n\n getElementClientRect: function (element) {\n const clientRect = (element instanceof domObjects.SVGElement\n ? element.getBoundingClientRect()\n : element.getClientRects()[0]);\n\n return clientRect && {\n left : clientRect.left,\n right : clientRect.right,\n top : clientRect.top,\n bottom: clientRect.bottom,\n width : clientRect.width || clientRect.right - clientRect.left,\n height: clientRect.height || clientRect.bottom - clientRect.top,\n };\n },\n\n getElementRect: function (element) {\n const clientRect = domUtils.getElementClientRect(element);\n\n if (!browser.isIOS7 && clientRect) {\n const scroll = domUtils.getScrollXY(win.getWindow(element));\n\n clientRect.left += scroll.x;\n clientRect.right += scroll.x;\n clientRect.top += scroll.y;\n clientRect.bottom += scroll.y;\n }\n\n return clientRect;\n },\n\n getPath: function (element) {\n const path = [];\n\n while (element) {\n path.push(element);\n element = domUtils.parentNode(element);\n }\n\n return path;\n },\n\n trySelector: value => {\n if (!is.string(value)) { return false; }\n\n // an exception will be raised if it is invalid\n domObjects.document.querySelector(value);\n return true;\n },\n};\n\nmodule.exports = domUtils;\n","const is = require('./is');\nconst domUtils = require('./domUtils');\nconst pExtend = require('./pointerExtend');\n\nconst { window, getWindow } = require('./window');\nconst { indexOf, contains } = require('./arr');\n\nconst useAttachEvent = ('attachEvent' in window) && !('addEventListener' in window);\nconst addEvent = useAttachEvent? 'attachEvent': 'addEventListener';\nconst removeEvent = useAttachEvent? 'detachEvent': 'removeEventListener';\nconst on = useAttachEvent? 'on': '';\n\nconst elements = [];\nconst targets = [];\nconst attachedListeners = [];\n\n// {\n// type: {\n// selectors: ['selector', ...],\n// contexts : [document, ...],\n// listeners: [[listener, capture, passive], ...]\n// }\n// }\nconst delegatedEvents = {};\n\nconst documents = [];\n\nconst supportsOptions = !useAttachEvent && (() => {\n let supported = false;\n\n window.document.createElement('div').addEventListener('test', null, {\n get capture () { supported = true; },\n });\n\n return supported;\n})();\n\nfunction add (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n let elementIndex = indexOf(elements, element);\n let target = targets[elementIndex];\n\n if (!target) {\n target = {\n events: {},\n typeCount: 0,\n };\n\n elementIndex = elements.push(element) - 1;\n targets.push(target);\n\n attachedListeners.push(useAttachEvent\n ? {\n supplied: [],\n wrapped : [],\n useCount: [],\n }\n : null);\n }\n\n if (!target.events[type]) {\n target.events[type] = [];\n target.typeCount++;\n }\n\n if (!contains(target.events[type], listener)) {\n let ret;\n\n if (useAttachEvent) {\n const { supplied, wrapped, useCount } = attachedListeners[elementIndex];\n const listenerIndex = indexOf(supplied, listener);\n\n const wrappedListener = wrapped[listenerIndex] || function (event) {\n if (!event.immediatePropagationStopped) {\n event.target = event.srcElement;\n event.currentTarget = element;\n\n event.preventDefault = event.preventDefault || preventDef;\n event.stopPropagation = event.stopPropagation || stopProp;\n event.stopImmediatePropagation = event.stopImmediatePropagation || stopImmProp;\n\n if (/mouse|click/.test(event.type)) {\n event.pageX = event.clientX + getWindow(element).document.documentElement.scrollLeft;\n event.pageY = event.clientY + getWindow(element).document.documentElement.scrollTop;\n }\n\n listener(event);\n }\n };\n\n ret = element[addEvent](on + type, wrappedListener, !!options.capture);\n\n if (listenerIndex === -1) {\n supplied.push(listener);\n wrapped.push(wrappedListener);\n useCount.push(1);\n }\n else {\n useCount[listenerIndex]++;\n }\n }\n else {\n ret = element[addEvent](type, listener, supportsOptions? options : !!options.capture);\n }\n target.events[type].push(listener);\n\n return ret;\n }\n}\n\nfunction remove (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const elementIndex = indexOf(elements, element);\n const target = targets[elementIndex];\n\n if (!target || !target.events) {\n return;\n }\n\n let wrappedListener = listener;\n let listeners;\n let listenerIndex;\n\n if (useAttachEvent) {\n listeners = attachedListeners[elementIndex];\n listenerIndex = indexOf(listeners.supplied, listener);\n wrappedListener = listeners.wrapped[listenerIndex];\n }\n\n if (type === 'all') {\n for (type in target.events) {\n if (target.events.hasOwnProperty(type)) {\n remove(element, type, 'all');\n }\n }\n return;\n }\n\n if (target.events[type]) {\n const len = target.events[type].length;\n\n if (listener === 'all') {\n for (let i = 0; i < len; i++) {\n remove(element, type, target.events[type][i], options);\n }\n return;\n }\n else {\n for (let i = 0; i < len; i++) {\n if (target.events[type][i] === listener) {\n element[removeEvent](on + type, wrappedListener, supportsOptions? options : !!options.capture);\n target.events[type].splice(i, 1);\n\n if (useAttachEvent && listeners) {\n listeners.useCount[listenerIndex]--;\n if (listeners.useCount[listenerIndex] === 0) {\n listeners.supplied.splice(listenerIndex, 1);\n listeners.wrapped.splice(listenerIndex, 1);\n listeners.useCount.splice(listenerIndex, 1);\n }\n }\n\n break;\n }\n }\n }\n\n if (target.events[type] && target.events[type].length === 0) {\n target.events[type] = null;\n target.typeCount--;\n }\n }\n\n if (!target.typeCount) {\n targets.splice(elementIndex, 1);\n elements.splice(elementIndex, 1);\n attachedListeners.splice(elementIndex, 1);\n }\n}\n\nfunction addDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n if (!delegatedEvents[type]) {\n delegatedEvents[type] = {\n selectors: [],\n contexts : [],\n listeners: [],\n };\n\n // add delegate listener functions\n for (let i = 0; i < documents.length; i++) {\n add(documents[i], type, delegateListener);\n add(documents[i], type, delegateUseCapture, true);\n }\n }\n\n const delegated = delegatedEvents[type];\n let index;\n\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n break;\n }\n }\n\n if (index === -1) {\n index = delegated.selectors.length;\n\n delegated.selectors.push(selector);\n delegated.contexts .push(context);\n delegated.listeners.push([]);\n }\n\n // keep listener and capture and passive flags\n delegated.listeners[index].push([listener, !!options.capture, options.passive]);\n}\n\nfunction removeDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const delegated = delegatedEvents[type];\n let matchFound = false;\n let index;\n\n if (!delegated) { return; }\n\n // count from last index of delegated to 0\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n // look for matching selector and context Node\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n\n const listeners = delegated.listeners[index];\n\n // each item of the listeners array is an array: [function, capture, passive]\n for (let i = listeners.length - 1; i >= 0; i--) {\n const [fn, capture, passive] = listeners[i];\n\n // check if the listener functions and capture and passive flags match\n if (fn === listener && capture === !!options.capture && passive === options.passive) {\n // remove the listener from the array of listeners\n listeners.splice(i, 1);\n\n // if all listeners for this interactable have been removed\n // remove the interactable from the delegated arrays\n if (!listeners.length) {\n delegated.selectors.splice(index, 1);\n delegated.contexts .splice(index, 1);\n delegated.listeners.splice(index, 1);\n\n // remove delegate function from context\n remove(context, type, delegateListener);\n remove(context, type, delegateUseCapture, true);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegatedEvents[type] = null;\n }\n }\n\n // only remove one listener\n matchFound = true;\n break;\n }\n }\n\n if (matchFound) { break; }\n }\n }\n}\n\n// bound to the interactable context when a DOM event\n// listener is added to a selector interactable\nfunction delegateListener (event, optionalArg) {\n const options = getOptions(optionalArg);\n const fakeEvent = {};\n const delegated = delegatedEvents[event.type];\n const eventTarget = (domUtils.getActualElement(event.path\n ? event.path[0]\n : event.target));\n let element = eventTarget;\n\n // duplicate the event so that currentTarget can be changed\n pExtend(fakeEvent, event);\n\n fakeEvent.originalEvent = event;\n fakeEvent.preventDefault = preventOriginalDefault;\n\n // climb up document tree looking for selector matches\n while (is.element(element)) {\n for (let i = 0; i < delegated.selectors.length; i++) {\n const selector = delegated.selectors[i];\n const context = delegated.contexts[i];\n\n if (domUtils.matchesSelector(element, selector)\n && domUtils.nodeContains(context, eventTarget)\n && domUtils.nodeContains(context, element)) {\n\n const listeners = delegated.listeners[i];\n\n fakeEvent.currentTarget = element;\n\n for (let j = 0; j < listeners.length; j++) {\n const [fn, capture, passive] = listeners[j];\n\n if (capture === !!options.capture && passive === options.passive) {\n fn(fakeEvent);\n }\n }\n }\n }\n\n element = domUtils.parentNode(element);\n }\n}\n\nfunction delegateUseCapture (event) {\n return delegateListener.call(this, event, true);\n}\n\nfunction preventDef () {\n this.returnValue = false;\n}\n\nfunction preventOriginalDefault () {\n this.originalEvent.preventDefault();\n}\n\nfunction stopProp () {\n this.cancelBubble = true;\n}\n\nfunction stopImmProp () {\n this.cancelBubble = true;\n this.immediatePropagationStopped = true;\n}\n\nfunction getOptions (param) {\n return is.object(param)? param : { capture: param };\n}\n\nmodule.exports = {\n add,\n remove,\n\n addDelegate,\n removeDelegate,\n\n delegateListener,\n delegateUseCapture,\n delegatedEvents,\n documents,\n\n useAttachEvent,\n supportsOptions,\n\n _elements: elements,\n _targets: targets,\n _attachedListeners: attachedListeners,\n};\n","module.exports = function extend (dest, source) {\n for (const prop in source) {\n dest[prop] = source[prop];\n }\n return dest;\n};\n","const {\n resolveRectLike,\n rectToXY,\n} = require('./rect');\n\nmodule.exports = function (target, element, action) {\n const actionOptions = target.options[action];\n const actionOrigin = actionOptions && actionOptions.origin;\n const origin = actionOrigin || target.options.origin;\n\n const originRect = resolveRectLike(origin, target, element, [target && element]);\n\n return rectToXY(originRect) || { x: 0, y: 0 };\n};\n","module.exports = (x, y) => Math.sqrt(x * x + y * y);\n","const extend = require('./extend');\nconst win = require('./window');\n\nconst utils = {\n warnOnce: function (method, message) {\n let warned = false;\n\n return function () {\n if (!warned) {\n win.window.console.warn(message);\n warned = true;\n }\n\n return method.apply(this, arguments);\n };\n },\n\n // http://stackoverflow.com/a/5634528/2280888\n _getQBezierValue: function (t, p1, p2, p3) {\n const iT = 1 - t;\n return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3;\n },\n\n getQuadraticCurvePoint: function (startX, startY, cpX, cpY, endX, endY, position) {\n return {\n x: utils._getQBezierValue(position, startX, cpX, endX),\n y: utils._getQBezierValue(position, startY, cpY, endY),\n };\n },\n\n // http://gizma.com/easing/\n easeOutQuad: function (t, b, c, d) {\n t /= d;\n return -c * t*(t-2) + b;\n },\n\n copyAction: function (dest, src) {\n dest.name = src.name;\n dest.axis = src.axis;\n dest.edges = src.edges;\n\n return dest;\n },\n\n is : require('./is'),\n extend : extend,\n hypot : require('./hypot'),\n getOriginXY: require('./getOriginXY'),\n};\n\nextend(utils, require('./arr'));\nextend(utils, require('./domUtils'));\nextend(utils, require('./pointerUtils'));\nextend(utils, require('./rect'));\n\nmodule.exports = utils;\n","const scope = require('../scope');\nconst utils = require('./index');\nconst browser = require('./browser');\n\nconst finder = {\n methodOrder: [ 'simulationResume', 'mouse', 'hasPointer', 'idle' ],\n\n search: function (pointer, eventType, eventTarget) {\n const mouseEvent = (/mouse/i.test(pointer.pointerType || eventType)\n // MSPointerEvent.MSPOINTER_TYPE_MOUSE\n || pointer.pointerType === 4);\n const pointerId = utils.getPointerId(pointer);\n const details = { pointer, pointerId, mouseEvent, eventType, eventTarget };\n\n for (const method of finder.methodOrder) {\n const interaction = finder[method](details);\n\n if (interaction) {\n return interaction;\n }\n }\n },\n\n // try to resume simulation with a new pointer\n simulationResume: function ({ mouseEvent, eventType, eventTarget }) {\n if (!/down|start/i.test(eventType)) {\n return null;\n }\n\n for (const interaction of scope.interactions) {\n let element = eventTarget;\n\n if (interaction.simulation && interaction.simulation.allowResume\n && (interaction.mouse === mouseEvent)) {\n while (element) {\n // if the element is the interaction element\n if (element === interaction.element) {\n return interaction;\n }\n element = utils.parentNode(element);\n }\n }\n }\n\n return null;\n },\n\n // if it's a mouse interaction\n mouse: function ({ pointerId, mouseEvent, eventType }) {\n if (!mouseEvent && (browser.supportsTouch || browser.supportsPointerEvent)) {\n return null;\n }\n\n let firstNonActive;\n\n for (const interaction of scope.interactions) {\n if (interaction.mouse) {\n // if it's a down event, skip interactions with running simulations\n if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; }\n\n // if the interaction is active, return it immediately\n if (interaction.interacting()) {\n return interaction;\n }\n // otherwise save it and look for another active interaction\n else if (!firstNonActive) {\n firstNonActive = interaction;\n }\n }\n }\n\n // if no active mouse interaction was found use the first inactive mouse\n // interaction\n if (firstNonActive) {\n return firstNonActive;\n }\n\n // Find any interaction specifically for mouse.\n // ignore the interaction if the eventType is a mousedown, and a simulation\n // is active\n for (const interaction of scope.interactions) {\n if (interaction.mouse && !(/down/.test(eventType) && interaction.simulation)) {\n return interaction;\n }\n }\n\n return null;\n },\n\n // get interaction that has this pointer\n hasPointer: function ({ pointerId }) {\n for (const interaction of scope.interactions) {\n if (utils.contains(interaction.pointerIds, pointerId)) {\n return interaction;\n }\n }\n },\n\n // get first idle interaction\n idle: function ({ mouseEvent }) {\n for (const interaction of scope.interactions) {\n // if there's already a pointer held down\n if (interaction.pointerIds.length === 1) {\n const target = interaction.target;\n // don't add this pointer if there is a target interactable and it\n // isn't gesturable\n if (target && !target.options.gesture.enabled) {\n continue;\n }\n }\n // maximum of 2 pointers per interaction\n else if (interaction.pointerIds.length >= 2) {\n continue;\n }\n\n if (!interaction.interacting() && (mouseEvent === interaction.mouse)) {\n return interaction;\n }\n }\n\n return null;\n },\n};\n\nmodule.exports = finder;\n","const win = require('./window');\nconst isWindow = require('./isWindow');\n\nconst is = {\n array : () => {},\n\n window : thing => thing === win.window || isWindow(thing),\n\n docFrag : thing => is.object(thing) && thing.nodeType === 11,\n\n object : thing => !!thing && (typeof thing === 'object'),\n\n function: thing => typeof thing === 'function',\n\n number : thing => typeof thing === 'number' ,\n\n bool : thing => typeof thing === 'boolean' ,\n\n string : thing => typeof thing === 'string' ,\n\n element: thing => {\n if (!thing || (typeof thing !== 'object')) { return false; }\n\n const _window = win.getWindow(thing) || win.window;\n\n return (/object|function/.test(typeof _window.Element)\n ? thing instanceof _window.Element //DOM2\n : thing.nodeType === 1 && typeof thing.nodeName === 'string');\n },\n};\n\nis.array = thing => (is.object(thing)\n && (typeof thing.length !== 'undefined')\n && is.function(thing.splice));\n\nmodule.exports = is;\n","module.exports = (thing) => !!(thing && thing.Window) && (thing instanceof thing.Window);\n","function pointerExtend (dest, source) {\n for (const prop in source) {\n const prefixedPropREs = module.exports.prefixedPropREs;\n let deprecated = false;\n\n // skip deprecated prefixed properties\n for (const vendor in prefixedPropREs) {\n if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) {\n deprecated = true;\n break;\n }\n }\n\n if (!deprecated && typeof source[prop] !== 'function') {\n dest[prop] = source[prop];\n }\n }\n return dest;\n}\n\npointerExtend.prefixedPropREs = {\n webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/,\n};\n\nmodule.exports = pointerExtend;\n","const hypot = require('./hypot');\nconst browser = require('./browser');\nconst dom = require('./domObjects');\nconst domUtils = require('./domUtils');\nconst is = require('./is');\nconst pointerExtend = require('./pointerExtend');\n\nconst pointerUtils = {\n copyCoords: function (dest, src) {\n dest.page = dest.page || {};\n dest.page.x = src.page.x;\n dest.page.y = src.page.y;\n\n dest.client = dest.client || {};\n dest.client.x = src.client.x;\n dest.client.y = src.client.y;\n\n dest.timeStamp = src.timeStamp;\n },\n\n setCoordDeltas: function (targetObj, prev, cur) {\n targetObj.page.x = cur.page.x - prev.page.x;\n targetObj.page.y = cur.page.y - prev.page.y;\n targetObj.client.x = cur.client.x - prev.client.x;\n targetObj.client.y = cur.client.y - prev.client.y;\n targetObj.timeStamp = cur.timeStamp - prev.timeStamp;\n\n // set pointer velocity\n const dt = Math.max(targetObj.timeStamp / 1000, 0.001);\n\n targetObj.page.speed = hypot(targetObj.page.x, targetObj.page.y) / dt;\n targetObj.page.vx = targetObj.page.x / dt;\n targetObj.page.vy = targetObj.page.y / dt;\n\n targetObj.client.speed = hypot(targetObj.client.x, targetObj.page.y) / dt;\n targetObj.client.vx = targetObj.client.x / dt;\n targetObj.client.vy = targetObj.client.y / dt;\n },\n\n isNativePointer: function (pointer) {\n return (pointer instanceof dom.Event || pointer instanceof dom.Touch);\n },\n\n // Get specified X/Y coords for mouse or event.touches[0]\n getXY: function (type, pointer, xy) {\n xy = xy || {};\n type = type || 'page';\n\n xy.x = pointer[type + 'X'];\n xy.y = pointer[type + 'Y'];\n\n return xy;\n },\n\n getPageXY: function (pointer, page) {\n page = page || {};\n\n // Opera Mobile handles the viewport and scrolling oddly\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n pointerUtils.getXY('screen', pointer, page);\n\n page.x += window.scrollX;\n page.y += window.scrollY;\n }\n else {\n pointerUtils.getXY('page', pointer, page);\n }\n\n return page;\n },\n\n getClientXY: function (pointer, client) {\n client = client || {};\n\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n // Opera Mobile handles the viewport and scrolling oddly\n pointerUtils.getXY('screen', pointer, client);\n }\n else {\n pointerUtils.getXY('client', pointer, client);\n }\n\n return client;\n },\n\n getPointerId: function (pointer) {\n return is.number(pointer.pointerId)? pointer.pointerId : pointer.identifier;\n },\n\n setCoords: function (targetObj, pointers, timeStamp) {\n const pointer = (pointers.length > 1\n ? pointerUtils.pointerAverage(pointers)\n : pointers[0]);\n\n const tmpXY = {};\n\n pointerUtils.getPageXY(pointer, tmpXY);\n targetObj.page.x = tmpXY.x;\n targetObj.page.y = tmpXY.y;\n\n pointerUtils.getClientXY(pointer, tmpXY);\n targetObj.client.x = tmpXY.x;\n targetObj.client.y = tmpXY.y;\n\n targetObj.timeStamp = is.number(timeStamp) ? timeStamp :new Date().getTime();\n },\n\n pointerExtend: pointerExtend,\n\n getTouchPair: function (event) {\n const touches = [];\n\n // array of touches is supplied\n if (is.array(event)) {\n touches[0] = event[0];\n touches[1] = event[1];\n }\n // an event\n else {\n if (event.type === 'touchend') {\n if (event.touches.length === 1) {\n touches[0] = event.touches[0];\n touches[1] = event.changedTouches[0];\n }\n else if (event.touches.length === 0) {\n touches[0] = event.changedTouches[0];\n touches[1] = event.changedTouches[1];\n }\n }\n else {\n touches[0] = event.touches[0];\n touches[1] = event.touches[1];\n }\n }\n\n return touches;\n },\n\n pointerAverage: function (pointers) {\n const average = {\n pageX : 0,\n pageY : 0,\n clientX: 0,\n clientY: 0,\n screenX: 0,\n screenY: 0,\n };\n\n for (const pointer of pointers) {\n for (const prop in average) {\n average[prop] += pointer[prop];\n }\n }\n for (const prop in average) {\n average[prop] /= pointers.length;\n }\n\n return average;\n },\n\n touchBBox: function (event) {\n if (!event.length && !(event.touches && event.touches.length > 1)) {\n return;\n }\n\n const touches = pointerUtils.getTouchPair(event);\n const minX = Math.min(touches[0].pageX, touches[1].pageX);\n const minY = Math.min(touches[0].pageY, touches[1].pageY);\n const maxX = Math.max(touches[0].pageX, touches[1].pageX);\n const maxY = Math.max(touches[0].pageY, touches[1].pageY);\n\n return {\n x: minX,\n y: minY,\n left: minX,\n top: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n },\n\n touchDistance: function (event, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n\n\n const dx = touches[0][sourceX] - touches[1][sourceX];\n const dy = touches[0][sourceY] - touches[1][sourceY];\n\n return hypot(dx, dy);\n },\n\n touchAngle: function (event, prevAngle, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n const dx = touches[1][sourceX] - touches[0][sourceX];\n const dy = touches[1][sourceY] - touches[0][sourceY];\n const angle = 180 * Math.atan2(dy , dx) / Math.PI;\n\n return angle;\n },\n\n getPointerType: function (pointer, interaction) {\n // if the PointerEvent API isn't available, then the pointer must be ither\n // a MouseEvent or TouchEvent\n if (interaction.mouse) { return 'mouse'; }\n if (!browser.supportsPointerEvent) { return 'touch'; }\n\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : [undefined, undefined,'touch', 'pen', 'mouse'][pointer.pointerType];\n },\n\n // [ event.target, event.currentTarget ]\n getEventTargets: function (event) {\n return [\n domUtils.getActualElement(event.path ? event.path[0] : event.target),\n domUtils.getActualElement(event.currentTarget),\n ];\n },\n};\n\nmodule.exports = pointerUtils;\n","const { window } = require('./window');\n\nconst vendors = ['ms', 'moz', 'webkit', 'o'];\nlet lastTime = 0;\nlet request;\nlet cancel;\n\nfor (let x = 0; x < vendors.length && !window.requestAnimationFrame; x++) {\n request = window[vendors[x] + 'RequestAnimationFrame'];\n cancel = window[vendors[x] +'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n}\n\nif (!request) {\n request = function (callback) {\n const currTime = new Date().getTime();\n const timeToCall = Math.max(0, 16 - (currTime - lastTime));\n const id = setTimeout(function () { callback(currTime + timeToCall); },\n timeToCall);\n\n lastTime = currTime + timeToCall;\n return id;\n };\n}\n\nif (!cancel) {\n cancel = function (id) {\n clearTimeout(id);\n };\n}\n\nmodule.exports = {\n request,\n cancel,\n};\n","const extend = require('./extend');\nconst is = require('./is');\nconst {\n closest,\n parentNode,\n getElementRect,\n} = require('./domUtils');\n\nconst rectUtils = {\n getStringOptionResult: function (value, interactable, element) {\n if (!is.string(value)) {\n return null;\n }\n\n if (value === 'parent') {\n value = parentNode(element);\n }\n else if (value === 'self') {\n value = interactable.getRect(element);\n }\n else {\n value = closest(element, value);\n }\n\n return value;\n },\n\n resolveRectLike: function (value, interactable, element, functionArgs) {\n value = rectUtils.getStringOptionResult(value, interactable, element) || value;\n\n if (is.function(value)) {\n value = value.apply(null, functionArgs);\n }\n\n if (is.element(value)) {\n value = getElementRect(value);\n }\n\n return value;\n },\n\n rectToXY: function (rect) {\n return rect && {\n x: 'x' in rect ? rect.x : rect.left,\n y: 'y' in rect ? rect.y : rect.top,\n };\n },\n\n xywhToTlbr: function (rect) {\n if (rect && !('left' in rect && 'top' in rect)) {\n rect = extend({}, rect);\n\n rect.left = rect.x || 0;\n rect.top = rect.y || 0;\n rect.right = rect.right || (rect.left + rect.width);\n rect.bottom = rect.bottom || (rect.top + rect.height);\n }\n\n return rect;\n },\n\n tlbrToXywh: function (rect) {\n if (rect && !('x' in rect && 'y' in rect)) {\n rect = extend({}, rect);\n\n rect.x = rect.left || 0;\n rect.top = rect.top || 0;\n rect.width = rect.width || (rect.right - rect.x);\n rect.height = rect.height || (rect.bottom - rect.y);\n }\n\n return rect;\n },\n};\n\nmodule.exports = rectUtils;\n","const win = module.exports;\nconst isWindow = require('./isWindow');\n\nfunction init (window) {\n // get wrapped window if using Shadow DOM polyfill\n\n win.realWindow = window;\n\n // create a TextNode\n const el = window.document.createTextNode('');\n\n // check if it's wrapped by a polyfill\n if (el.ownerDocument !== window.document\n && typeof window.wrap === 'function'\n && window.wrap(el) === el) {\n // use wrapped window\n window = window.wrap(window);\n }\n\n win.window = window;\n}\n\nif (typeof window === 'undefined') {\n win.window = undefined;\n win.realWindow = undefined;\n}\nelse {\n init(window);\n}\n\nwin.getWindow = function getWindow (node) {\n if (isWindow(node)) {\n return node;\n }\n\n const rootNode = (node.ownerDocument || node);\n\n return rootNode.defaultView || rootNode.parentWindow || win.window;\n};\n\nwin.init = init;\n"]} \ No newline at end of file +{"version":3,"sources":["src/minHeader.js","src/header.js","index.js","src/Eventable.js","src/InteractEvent.js","src/Interactable.js","src/Interaction.js","src/actions/base.js","src/actions/drag.js","src/actions/drop.js","src/actions/gesture.js","src/actions/resize.js","src/autoScroll.js","src/autoStart/InteractableMethods.js","src/autoStart/base.js","src/autoStart/delay.js","src/autoStart/drag.js","src/autoStart/gesture.js","src/autoStart/resize.js","src/defaultOptions.js","src/index.js","src/inertia.js","src/interact.js","src/interactablePreventDefault.js","src/legacyBrowsers.js","src/modifiers/index.js","src/modifiers/restrict.js","src/modifiers/restrictEdges.js","src/modifiers/restrictSize.js","src/modifiers/snap.js","src/modifiers/snapSize.js","src/pointerEvents/PointerEvent.js","src/pointerEvents/base.js","src/pointerEvents/holdRepeat.js","src/pointerEvents/interactableTargets.js","src/scope.js","src/utils/Signals.js","src/utils/arr.js","src/utils/browser.js","src/utils/domObjects.js","src/utils/domUtils.js","src/utils/events.js","src/utils/extend.js","src/utils/getOriginXY.js","src/utils/hypot.js","src/utils/index.js","src/utils/interactionFinder.js","src/utils/is.js","src/utils/isWindow.js","src/utils/pointerExtend.js","src/utils/pointerUtils.js","src/utils/raf.js","src/utils/rect.js","src/utils/window.js"],"names":[],"mappings":"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","file":"interact.min.js","sourceRoot":"","sourcesContent":["/* interact.js v1.3.0-alpha.4+sha.7970416-dirty | https://raw.github.com/taye/interact.js/master/LICENSE */\n","/**\n * interact.js v1.3.0-alpha.4+sha.7970416-dirty\n *\n * Copyright (c) 2012-2017 Taye Adeyemi \n * Open source under the MIT License.\n * https://raw.github.com/taye/interact.js/master/LICENSE\n */\n","/*\n * In a (windowless) server environment this file exports a factory function\n * that takes the window to use.\n *\n * var interact = require('interact.js')(windowObject);\n *\n * See https://github.com/taye/interact.js/issues/187\n */\nif (typeof window === 'undefined') {\n module.exports = function (window) {\n require('./src/utils/window').init(window);\n\n return require('./src/index');\n };\n}\nelse {\n module.exports = require('./src/index');\n}\n","const { indexOf } = require('./utils/arr');\nconst extend = require('./utils/extend.js');\n\nfunction fireUntilImmediateStopped (event, listeners) {\n for (let i = 0, len = listeners.length; i < len && !event.immediatePropagationStopped; i++) {\n listeners[i](event);\n }\n}\n\nclass Eventable {\n\n constructor (options) {\n this.options = extend({}, options || {});\n }\n\n fire (event) {\n let listeners;\n const onEvent = 'on' + event.type;\n const global = this.global;\n\n // Interactable#on() listeners\n if ((listeners = this[event.type])) {\n fireUntilImmediateStopped(event, listeners);\n }\n\n // interactable.onevent listener\n if (this[onEvent]) {\n this[onEvent](event);\n }\n\n // interact.on() listeners\n if (!event.propagationStopped && global && (listeners = global[event.type])) {\n fireUntilImmediateStopped(event, listeners);\n }\n }\n\n on (eventType, listener) {\n // if this type of event was never bound\n if (this[eventType]) {\n this[eventType].push(listener);\n }\n else {\n this[eventType] = [listener];\n }\n }\n\n off (eventType, listener) {\n // if it is an action event type\n const eventList = this[eventType];\n const index = eventList? indexOf(eventList, listener) : -1;\n\n if (index !== -1) {\n eventList.splice(index, 1);\n }\n\n if (eventList && eventList.length === 0 || !listener) {\n this[eventType] = listener;\n }\n }\n}\n\nmodule.exports = Eventable;\n","const extend = require('./utils/extend');\nconst getOriginXY = require('./utils/getOriginXY');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nclass InteractEvent {\n constructor (interaction, event, action, phase, element, related, preEnd = false) {\n const target = interaction.target;\n const deltaSource = (target && target.options || defaults).deltaSource;\n const origin = getOriginXY(target, element, action);\n const starting = phase === 'start';\n const ending = phase === 'end';\n const coords = starting? interaction.startCoords : interaction.curCoords;\n const prevEvent = interaction.prevEvent;\n\n element = element || interaction.element;\n\n const page = extend({}, coords.page);\n const client = extend({}, coords.client);\n\n page.x -= origin.x;\n page.y -= origin.y;\n\n client.x -= origin.x;\n client.y -= origin.y;\n\n this.ctrlKey = event.ctrlKey;\n this.altKey = event.altKey;\n this.shiftKey = event.shiftKey;\n this.metaKey = event.metaKey;\n this.button = event.button;\n this.buttons = event.buttons;\n this.target = element;\n this.currentTarget = element;\n this.relatedTarget = related || null;\n this.preEnd = preEnd;\n this.type = action + (phase || '');\n this.interaction = interaction;\n this.interactable = target;\n\n this.t0 = starting ? interaction.downTimes[interaction.downTimes.length - 1]\n : prevEvent.t0;\n\n const signalArg = {\n interaction,\n event,\n action,\n phase,\n element,\n related,\n page,\n client,\n coords,\n starting,\n ending,\n deltaSource,\n iEvent: this,\n };\n\n signals.fire('set-xy', signalArg);\n\n if (ending) {\n // use previous coords when ending\n this.pageX = prevEvent.pageX;\n this.pageY = prevEvent.pageY;\n this.clientX = prevEvent.clientX;\n this.clientY = prevEvent.clientY;\n }\n else {\n this.pageX = page.x;\n this.pageY = page.y;\n this.clientX = client.x;\n this.clientY = client.y;\n }\n\n this.x0 = interaction.startCoords.page.x - origin.x;\n this.y0 = interaction.startCoords.page.y - origin.y;\n this.clientX0 = interaction.startCoords.client.x - origin.x;\n this.clientY0 = interaction.startCoords.client.y - origin.y;\n\n signals.fire('set-delta', signalArg);\n\n this.timeStamp = coords.timeStamp;\n this.dt = interaction.pointerDelta.timeStamp;\n this.duration = this.timeStamp - this.t0;\n\n // speed and velocity in pixels per second\n this.speed = interaction.pointerDelta[deltaSource].speed;\n this.velocityX = interaction.pointerDelta[deltaSource].vx;\n this.velocityY = interaction.pointerDelta[deltaSource].vy;\n\n this.swipe = (ending || phase === 'inertiastart')? this.getSwipe() : null;\n\n signals.fire('new', signalArg);\n }\n\n getSwipe () {\n const interaction = this.interaction;\n\n if (interaction.prevEvent.speed < 600\n || this.timeStamp - interaction.prevEvent.timeStamp > 150) {\n return null;\n }\n\n let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI;\n const overlap = 22.5;\n\n if (angle < 0) {\n angle += 360;\n }\n\n const left = 135 - overlap <= angle && angle < 225 + overlap;\n const up = 225 - overlap <= angle && angle < 315 + overlap;\n\n const right = !left && (315 - overlap <= angle || angle < 45 + overlap);\n const down = !up && 45 - overlap <= angle && angle < 135 + overlap;\n\n return {\n up,\n down,\n left,\n right,\n angle,\n speed: interaction.prevEvent.speed,\n velocity: {\n x: interaction.prevEvent.velocityX,\n y: interaction.prevEvent.velocityY,\n },\n };\n }\n\n preventDefault () {}\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n}\n\nsignals.on('set-delta', function ({ iEvent, interaction, starting, deltaSource }) {\n const prevEvent = starting? iEvent : interaction.prevEvent;\n\n if (deltaSource === 'client') {\n iEvent.dx = iEvent.clientX - prevEvent.clientX;\n iEvent.dy = iEvent.clientY - prevEvent.clientY;\n }\n else {\n iEvent.dx = iEvent.pageX - prevEvent.pageX;\n iEvent.dy = iEvent.pageY - prevEvent.pageY;\n }\n});\n\nInteractEvent.signals = signals;\n\nmodule.exports = InteractEvent;\n","const is = require('./utils/is');\nconst events = require('./utils/events');\nconst extend = require('./utils/extend');\nconst actions = require('./actions/base');\nconst scope = require('./scope');\nconst Eventable = require('./Eventable');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nconst {\n getElementRect,\n nodeContains,\n trySelector,\n} = require('./utils/domUtils');\nconst { getWindow } = require('./utils/window');\nconst { indexOf, contains } = require('./utils/arr');\nconst { wheelEvent } = require('./utils/browser');\n\n// all set interactables\nscope.interactables = [];\n\n/*\\\n * Interactable\n [ property ]\n **\n * Object type returned by @interact\n\\*/\nclass Interactable {\n constructor (target, options) {\n options = options || {};\n\n this.target = target;\n this.events = new Eventable();\n this._context = options.context || scope.document;\n this._win = getWindow(trySelector(target)? this._context : target);\n this._doc = this._win.document;\n\n signals.fire('new', {\n target,\n options,\n interactable: this,\n win: this._win,\n });\n\n scope.addDocument( this._doc, this._win );\n\n scope.interactables.push(this);\n\n this.set(options);\n }\n\n setOnEvents (action, phases) {\n const onAction = 'on' + action;\n\n if (is.function(phases.onstart) ) { this.events[onAction + 'start' ] = phases.onstart ; }\n if (is.function(phases.onmove) ) { this.events[onAction + 'move' ] = phases.onmove ; }\n if (is.function(phases.onend) ) { this.events[onAction + 'end' ] = phases.onend ; }\n if (is.function(phases.oninertiastart)) { this.events[onAction + 'inertiastart' ] = phases.oninertiastart ; }\n\n return this;\n }\n\n setPerAction (action, options) {\n // for all the default per-action options\n for (const option in options) {\n // if this option exists for this action\n if (option in defaults[action]) {\n // if the option in the options arg is an object value\n if (is.object(options[option])) {\n // duplicate the object\n this.options[action][option] = extend(this.options[action][option] || {}, options[option]);\n\n if (is.object(defaults.perAction[option]) && 'enabled' in defaults.perAction[option]) {\n this.options[action][option].enabled = options[option].enabled === false? false : true;\n }\n }\n else if (is.bool(options[option]) && is.object(defaults.perAction[option])) {\n this.options[action][option].enabled = options[option];\n }\n else if (options[option] !== undefined) {\n // or if it's not undefined, do a plain assignment\n this.options[action][option] = options[option];\n }\n }\n }\n }\n\n /*\\\n * Interactable.getRect\n [ method ]\n *\n * The default function to get an Interactables bounding rect. Can be\n * overridden using @Interactable.rectChecker.\n *\n - element (Element) #optional The element to measure.\n = (object) The object's bounding rectangle.\n o {\n o top : 0,\n o left : 0,\n o bottom: 0,\n o right : 0,\n o width : 0,\n o height: 0\n o }\n \\*/\n getRect (element) {\n element = element || this.target;\n\n if (is.string(this.target) && !(is.element(element))) {\n element = this._context.querySelector(this.target);\n }\n\n return getElementRect(element);\n }\n\n /*\\\n * Interactable.rectChecker\n [ method ]\n *\n * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n - checker (function) #optional A function which returns this Interactable's bounding rectangle. See @Interactable.getRect\n = (function | object) The checker function or this Interactable\n \\*/\n rectChecker (checker) {\n if (is.function(checker)) {\n this.getRect = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.getRect;\n\n return this;\n }\n\n return this.getRect;\n }\n\n _backCompatOption (optionName, newValue) {\n if (trySelector(newValue) || is.object(newValue)) {\n this.options[optionName] = newValue;\n\n for (const action of actions.names) {\n this.options[action][optionName] = newValue;\n }\n\n return this;\n }\n\n return this.options[optionName];\n }\n\n /*\\\n * Interactable.origin\n [ method ]\n *\n * Gets or sets the origin of the Interactable's element. The x and y\n * of the origin will be subtracted from action event coordinates.\n *\n - origin (object | string) #optional An object eg. { x: 0, y: 0 } or string 'parent', 'self' or any CSS selector\n * OR\n - origin (Element) #optional An HTML or SVG Element whose rect will be used\n **\n = (object) The current origin or this Interactable\n \\*/\n origin (newValue) {\n return this._backCompatOption('origin', newValue);\n }\n\n /*\\\n * Interactable.deltaSource\n [ method ]\n *\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n - newValue (string) #optional Use 'client' if you will be scrolling while interacting; Use 'page' if you want autoScroll to work\n = (string | object) The current deltaSource or this Interactable\n \\*/\n deltaSource (newValue) {\n if (newValue === 'page' || newValue === 'client') {\n this.options.deltaSource = newValue;\n\n return this;\n }\n\n return this.options.deltaSource;\n }\n\n /*\\\n * Interactable.context\n [ method ]\n *\n * Gets the selector context Node of the Interactable. The default is `window.document`.\n *\n = (Node) The context Node of this Interactable\n **\n \\*/\n context () {\n return this._context;\n }\n\n inContext (element) {\n return (this._context === element.ownerDocument\n || nodeContains(this._context, element));\n }\n\n /*\\\n * Interactable.fire\n [ method ]\n *\n * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n - iEvent (InteractEvent) The InteractEvent object to be fired on this Interactable\n = (Interactable) this Interactable\n \\*/\n fire (iEvent) {\n this.events.fire(iEvent);\n\n return this;\n }\n\n _onOffMultiple (method, eventType, listener, options) {\n if (is.string(eventType) && eventType.search(' ') !== -1) {\n eventType = eventType.trim().split(/ +/);\n }\n\n if (is.array(eventType)) {\n for (let i = 0; i < eventType.length; i++) {\n this[method](eventType[i], listener, options);\n }\n\n return true;\n }\n\n if (is.object(eventType)) {\n for (const prop in eventType) {\n this[method](prop, eventType[prop], listener);\n }\n\n return true;\n }\n }\n\n /*\\\n * Interactable.on\n [ method ]\n *\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n - eventType (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) This Interactable\n \\*/\n on (eventType, listener, options) {\n if (this._onOffMultiple('on', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.on(eventType, listener);\n }\n // delegated event for selector\n else if (is.string(this.target)) {\n events.addDelegate(this.target, this._context, eventType, listener, options);\n }\n else {\n events.add(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.off\n [ method ]\n *\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n - eventType (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) This Interactable\n \\*/\n off (eventType, listener, options) {\n if (this._onOffMultiple('off', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n // if it is an action event type\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.off(eventType, listener);\n }\n // delegated event\n else if (is.string(this.target)) {\n events.removeDelegate(this.target, this._context, eventType, listener, options);\n }\n // remove listener from this Interatable's element\n else {\n events.remove(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.set\n [ method ]\n *\n * Reset the options of this Interactable\n - options (object) The new settings to apply\n = (object) This Interactable\n \\*/\n set (options) {\n if (!is.object(options)) {\n options = {};\n }\n\n this.options = extend({}, defaults.base);\n\n const perActions = extend({}, defaults.perAction);\n\n for (const actionName in actions.methodDict) {\n const methodName = actions.methodDict[actionName];\n\n this.options[actionName] = extend({}, defaults[actionName]);\n\n this.setPerAction(actionName, perActions);\n\n this[methodName](options[actionName]);\n }\n\n for (const setting of Interactable.settingsMethods) {\n this.options[setting] = defaults.base[setting];\n\n if (setting in options) {\n this[setting](options[setting]);\n }\n }\n\n signals.fire('set', {\n options,\n interactable: this,\n });\n\n return this;\n }\n\n /*\\\n * Interactable.unset\n [ method ]\n *\n * Remove this interactable from the list of interactables and remove\n * it's action capabilities and event listeners\n *\n = (object) @interact\n \\*/\n unset () {\n events.remove(this.target, 'all');\n\n if (is.string(this.target)) {\n // remove delegated events\n for (const type in events.delegatedEvents) {\n const delegated = events.delegatedEvents[type];\n\n if (delegated.selectors[0] === this.target\n && delegated.contexts[0] === this._context) {\n\n delegated.selectors.splice(0, 1);\n delegated.contexts .splice(0, 1);\n delegated.listeners.splice(0, 1);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegated[type] = null;\n }\n }\n\n events.remove(this._context, type, events.delegateListener);\n events.remove(this._context, type, events.delegateUseCapture, true);\n }\n }\n else {\n events.remove(this, 'all');\n }\n\n signals.fire('unset', { interactable: this });\n\n scope.interactables.splice(indexOf(scope.interactables, this), 1);\n\n // Stop related interactions when an Interactable is unset\n for (const interaction of scope.interactions || []) {\n if (interaction.target === this && interaction.interacting()) {\n interaction.stop();\n }\n }\n\n return scope.interact;\n }\n}\n\nscope.interactables.indexOfElement = function indexOfElement (target, context) {\n context = context || scope.document;\n\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n if (interactable.target === target && interactable._context === context) {\n return i;\n }\n }\n return -1;\n};\n\nscope.interactables.get = function interactableGet (element, options, dontCheckInContext) {\n const ret = this[this.indexOfElement(element, options && options.context)];\n\n return ret && (is.string(element) || dontCheckInContext || ret.inContext(element))? ret : null;\n};\n\nscope.interactables.forEachSelector = function (callback, element) {\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n // skip non CSS selector targets and out of context elements\n if (!is.string(interactable.target)\n || (element && !interactable.inContext(element))) {\n continue;\n }\n\n const ret = callback(interactable, interactable.target, interactable._context, i, this);\n\n if (ret !== undefined) {\n return ret;\n }\n }\n};\n\n// all interact.js eventTypes\nInteractable.eventTypes = scope.eventTypes = [];\n\nInteractable.signals = signals;\n\nInteractable.settingsMethods = [ 'deltaSource', 'origin', 'preventDefault', 'rectChecker' ];\n\nmodule.exports = Interactable;\n","const scope = require('./scope');\nconst utils = require('./utils');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst domObjects = require('./utils/domObjects');\nconst finder = require('./utils/interactionFinder');\nconst signals = require('./utils/Signals').new();\n\nconst listeners = {};\nconst methodNames = [\n 'pointerDown', 'pointerMove', 'pointerUp',\n 'updatePointer', 'removePointer',\n];\n\n// for ignoring browser's simulated mouse events\nlet prevTouchTime = 0;\n\n// all active and idle interactions\nscope.interactions = [];\n\nclass Interaction {\n constructor ({ pointerType }) {\n this.target = null; // current interactable being interacted with\n this.element = null; // the target element of the interactable\n\n this.prepared = { // action that's ready to be fired on next move event\n name : null,\n axis : null,\n edges: null,\n };\n\n // keep track of added pointers\n this.pointers = [];\n this.pointerIds = [];\n this.downTargets = [];\n this.downTimes = [];\n\n // Previous native pointer move event coordinates\n this.prevCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n // current native pointer move event coordinates\n this.curCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Starting InteractEvent pointer coordinates\n this.startCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Change in coordinates and time of the pointer\n this.pointerDelta = {\n page : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n client : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n timeStamp: 0,\n };\n\n this.downEvent = null; // pointerdown/mousedown/touchstart event\n this.downPointer = {};\n\n this._eventTarget = null;\n this._curEventTarget = null;\n\n this.prevEvent = null; // previous action event\n\n this.pointerIsDown = false;\n this.pointerWasMoved = false;\n this._interacting = false;\n\n this.pointerType = pointerType;\n\n signals.fire('new', this);\n\n scope.interactions.push(this);\n }\n\n pointerDown (pointer, event, eventTarget) {\n const pointerIndex = this.updatePointer(pointer, event, true);\n\n signals.fire('down', {\n pointer,\n event,\n eventTarget,\n pointerIndex,\n interaction: this,\n });\n }\n\n /*\\\n * Interaction.start\n [ method ]\n *\n * Start an action with the given Interactable and Element as tartgets. The\n * action must be enabled for the target Interactable and an appropriate number\n * of pointers must be held down - 1 for drag/resize, 2 for gesture.\n *\n * Use it with `interactable.able({ manualStart: false })` to always\n * [start actions manually](https://github.com/taye/interact.js/issues/114)\n *\n - action (object) The action to be performed - drag, resize, etc.\n - target (Interactable) The Interactable to target\n - element (Element) The DOM Element to target\n = (object) interact\n **\n | interact(target)\n | .draggable({\n | // disable the default drag start by down->move\n | manualStart: true\n | })\n | // start dragging after the user holds the pointer down\n | .on('hold', function (event) {\n | var interaction = event.interaction;\n |\n | if (!interaction.interacting()) {\n | interaction.start({ name: 'drag' },\n | event.interactable,\n | event.currentTarget);\n | }\n | });\n \\*/\n start (action, target, element) {\n if (this.interacting()\n || !this.pointerIsDown\n || this.pointerIds.length < (action.name === 'gesture'? 2 : 1)) {\n return;\n }\n\n // if this interaction had been removed after stopping\n // add it back\n if (utils.indexOf(scope.interactions, this) === -1) {\n scope.interactions.push(this);\n }\n\n utils.copyAction(this.prepared, action);\n this.target = target;\n this.element = element;\n\n signals.fire('action-start', {\n interaction: this,\n event: this.downEvent,\n });\n }\n\n pointerMove (pointer, event, eventTarget) {\n if (!this.simulation) {\n this.updatePointer(pointer);\n utils.setCoords(this.curCoords, this.pointers);\n }\n\n const duplicateMove = (this.curCoords.page.x === this.prevCoords.page.x\n && this.curCoords.page.y === this.prevCoords.page.y\n && this.curCoords.client.x === this.prevCoords.client.x\n && this.curCoords.client.y === this.prevCoords.client.y);\n\n let dx;\n let dy;\n\n // register movement greater than pointerMoveTolerance\n if (this.pointerIsDown && !this.pointerWasMoved) {\n dx = this.curCoords.client.x - this.startCoords.client.x;\n dy = this.curCoords.client.y - this.startCoords.client.y;\n\n this.pointerWasMoved = utils.hypot(dx, dy) > Interaction.pointerMoveTolerance;\n }\n\n const signalArg = {\n pointer,\n pointerIndex: this.getPointerIndex(pointer),\n event,\n eventTarget,\n dx,\n dy,\n duplicate: duplicateMove,\n interaction: this,\n interactingBeforeMove: this.interacting(),\n };\n\n if (!duplicateMove) {\n // set pointer coordinate, time changes and speeds\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n }\n\n signals.fire('move', signalArg);\n\n if (!duplicateMove) {\n // if interacting, fire an 'action-move' signal etc\n if (this.interacting()) {\n this.doMove(signalArg);\n }\n\n if (this.pointerWasMoved) {\n utils.copyCoords(this.prevCoords, this.curCoords);\n }\n }\n }\n\n /*\\\n * Interaction.doMove\n [ method ]\n *\n * Force a move of the current action at the same coordinates. Useful if\n * snap/restrict has been changed and you want a movement with the new\n * settings.\n *\n **\n | interact(target)\n | .draggable(true)\n | .on('dragmove', function (event) {\n | if (someCondition) {\n | // change the snap settings\n | event.interactable.draggable({ snap: { targets: [] }});\n | // fire another move event with re-calculated snap\n | event.interaction.doMove();\n | }\n | });\n \\*/\n doMove (signalArg) {\n signalArg = utils.extend({\n pointer: this.pointers[0],\n event: this.prevEvent,\n eventTarget: this._eventTarget,\n interaction: this,\n }, signalArg || {});\n\n signals.fire('before-action-move', signalArg);\n\n if (!this._dontFireMove) {\n signals.fire('action-move', signalArg);\n }\n\n this._dontFireMove = false;\n }\n\n // End interact move events and stop auto-scroll unless simulation is running\n pointerUp (pointer, event, eventTarget, curEventTarget) {\n const pointerIndex = this.getPointerIndex(pointer);\n\n signals.fire(/cancel$/i.test(event.type)? 'cancel' : 'up', {\n pointer,\n pointerIndex,\n event,\n eventTarget,\n curEventTarget,\n interaction: this,\n });\n\n if (!this.simulation) {\n this.end(event);\n }\n\n this.pointerIsDown = false;\n this.removePointer(pointer, event);\n }\n\n /*\\\n * Interaction.end\n [ method ]\n *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n - event (PointerEvent) #optional\n **\n | interact(target)\n | .draggable(true)\n | .on('move', function (event) {\n | if (event.pageX > 1000) {\n | // end the current action\n | event.interaction.end();\n | // stop all further listeners from being called\n | event.stopImmediatePropagation();\n | }\n | });\n \\*/\n end (event) {\n event = event || this.prevEvent;\n\n if (this.interacting()) {\n signals.fire('action-end', {\n event,\n interaction: this,\n });\n }\n\n this.stop();\n }\n\n currentAction () {\n return this._interacting? this.prepared.name: null;\n }\n\n interacting () {\n return this._interacting;\n }\n\n stop () {\n signals.fire('stop', { interaction: this });\n\n if (this._interacting) {\n signals.fire('stop-active', { interaction: this });\n signals.fire('stop-' + this.prepared.name, { interaction: this });\n }\n\n this.target = this.element = null;\n\n this._interacting = false;\n this.prepared.name = this.prevEvent = null;\n }\n\n getPointerIndex (pointer) {\n // mouse and pen interactions may have only one pointer\n if (this.pointerType === 'mouse' || this.pointerType === 'pen') {\n return 0;\n }\n\n return utils.indexOf(this.pointerIds, utils.getPointerId(pointer));\n }\n\n updatePointer (pointer, event, down = event && /(down|start)$/i.test(event.type)) {\n const id = utils.getPointerId(pointer);\n let index = this.getPointerIndex(pointer);\n\n if (index === -1) {\n index = this.pointerIds.length;\n this.pointerIds[index] = id;\n }\n\n if (down) {\n signals.fire('update-pointer-down', {\n pointer,\n event,\n down,\n pointerId: id,\n pointerIndex: index,\n interaction: this,\n });\n }\n\n this.pointers[index] = pointer;\n\n return index;\n }\n\n removePointer (pointer, event) {\n const index = this.getPointerIndex(pointer);\n\n if (index === -1) { return; }\n\n signals.fire('remove-pointer', {\n pointer,\n event,\n pointerIndex: index,\n interaction: this,\n });\n\n this.pointers .splice(index, 1);\n this.pointerIds .splice(index, 1);\n this.downTargets.splice(index, 1);\n this.downTimes .splice(index, 1);\n }\n\n _updateEventTargets (target, currentTarget) {\n this._eventTarget = target;\n this._curEventTarget = currentTarget;\n }\n}\n\nfor (let i = 0, len = methodNames.length; i < len; i++) {\n const method = methodNames[i];\n\n listeners[method] = doOnInteractions(method);\n}\n\nfunction doOnInteractions (method) {\n return (function (event) {\n const pointerType = utils.getPointerType(event);\n const [eventTarget, curEventTarget] = utils.getEventTargets(event);\n const matches = []; // [ [pointer, interaction], ...]\n\n if (browser.supportsTouch && /touch/.test(event.type)) {\n prevTouchTime = new Date().getTime();\n\n for (let i = 0; i < event.changedTouches.length; i++) {\n const pointer = event.changedTouches[i];\n const interaction = finder.search(pointer, event.type, eventTarget);\n\n matches.push([pointer, interaction || new Interaction({ pointerType })]);\n }\n }\n else {\n let invalidPointer = false;\n\n if (!browser.supportsPointerEvent && /mouse/.test(event.type)) {\n // ignore mouse events while touch interactions are active\n for (let i = 0; i < scope.interactions.length && !invalidPointer; i++) {\n invalidPointer = scope.interactions[i].pointerType !== 'mouse' && scope.interactions[i].pointerIsDown;\n }\n\n // try to ignore mouse events that are simulated by the browser\n // after a touch event\n invalidPointer = invalidPointer\n || (new Date().getTime() - prevTouchTime < 500)\n // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated\n || event.timeStamp === 0;\n }\n\n if (!invalidPointer) {\n let interaction = finder.search(event, event.type, eventTarget);\n\n if (!interaction) {\n interaction = new Interaction({ pointerType });\n }\n\n matches.push([event, interaction]);\n }\n }\n\n for (const [pointer, interaction] of matches) {\n interaction._updateEventTargets(eventTarget, curEventTarget);\n interaction[method](pointer, event, eventTarget, curEventTarget);\n }\n });\n}\n\nfunction endAll (event) {\n for (let i = 0; i < scope.interactions.length; i++) {\n const interaction = scope.interactions[i];\n\n interaction.end(event);\n signals.fire('endall', { event, interaction });\n }\n}\n\nconst docEvents = { /* 'eventType': listenerFunc */ };\nconst pEventTypes = browser.pEventTypes;\n\nif (domObjects.PointerEvent) {\n docEvents[pEventTypes.down ] = listeners.pointerDown;\n docEvents[pEventTypes.move ] = listeners.pointerMove;\n docEvents[pEventTypes.up ] = listeners.pointerUp;\n docEvents[pEventTypes.cancel] = listeners.pointerUp;\n}\nelse {\n docEvents.mousedown = listeners.pointerDown;\n docEvents.mousemove = listeners.pointerMove;\n docEvents.mouseup = listeners.pointerUp;\n\n docEvents.touchstart = listeners.pointerDown;\n docEvents.touchmove = listeners.pointerMove;\n docEvents.touchend = listeners.pointerUp;\n docEvents.touchcancel = listeners.pointerUp;\n}\n\ndocEvents.blur = endAll;\n\nfunction onDocSignal ({ doc }, signalName) {\n const eventMethod = signalName.indexOf('add') === 0\n ? events.add : events.remove;\n\n // delegate event listener\n for (const eventType in scope.delegatedEvents) {\n eventMethod(doc, eventType, events.delegateListener);\n eventMethod(doc, eventType, events.delegateUseCapture, true);\n }\n\n for (const eventType in docEvents) {\n eventMethod(doc, eventType, docEvents[eventType]);\n }\n}\n\nsignals.on('update-pointer-down', ({ interaction, pointer, pointerId, pointerIndex, event, eventTarget, down }) => {\n interaction.pointerIds[pointerIndex] = pointerId;\n interaction.pointers[pointerIndex] = pointer;\n\n if (down) {\n interaction.pointerIsDown = true;\n }\n\n if (!interaction.interacting()) {\n utils.setCoords(interaction.startCoords, interaction.pointers);\n\n utils.copyCoords(interaction.curCoords , interaction.startCoords);\n utils.copyCoords(interaction.prevCoords, interaction.startCoords);\n\n interaction.downEvent = event;\n interaction.downTimes[pointerIndex] = interaction.curCoords.timeStamp;\n interaction.downTargets[pointerIndex] = eventTarget || event && utils.getEventTargets(event)[0];\n interaction.pointerWasMoved = false;\n\n utils.pointerExtend(interaction.downPointer, pointer);\n }\n});\n\nscope.signals.on('add-document' , onDocSignal);\nscope.signals.on('remove-document', onDocSignal);\n\nInteraction.pointerMoveTolerance = 1;\nInteraction.doOnInteractions = doOnInteractions;\nInteraction.endAll = endAll;\nInteraction.signals = signals;\nInteraction.docEvents = docEvents;\n\nscope.endAllInteractions = endAll;\n\nmodule.exports = Interaction;\n","const Interaction = require('../Interaction');\nconst InteractEvent = require('../InteractEvent');\n\nconst actions = {\n firePrepared,\n names: [],\n methodDict: {},\n};\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n interaction._interacting = true;\n firePrepared(interaction, event, 'start');\n});\n\nInteraction.signals.on('action-move', function ({ interaction, event, preEnd }) {\n firePrepared(interaction, event, 'move', preEnd);\n\n // if the action was ended in a listener\n if (!interaction.interacting()) { return false; }\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n firePrepared(interaction, event, 'end');\n});\n\nfunction firePrepared (interaction, event, phase, preEnd) {\n const actionName = interaction.prepared.name;\n\n const newEvent = new InteractEvent(interaction, event, actionName, phase, interaction.element, null, preEnd);\n\n interaction.target.fire(newEvent);\n interaction.prevEvent = newEvent;\n}\n\nmodule.exports = actions;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drag = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n startAxis : 'xy',\n lockAxis : 'xy',\n },\n\n checker: function (pointer, event, interactable) {\n const dragOptions = interactable.options.drag;\n\n return dragOptions.enabled\n ? { name: 'drag', axis: (dragOptions.lockAxis === 'start'\n ? dragOptions.startAxis\n : dragOptions.lockAxis)}\n : null;\n },\n\n getCursor: function () {\n return 'move';\n },\n};\n\nInteraction.signals.on('before-action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n interaction.curCoords.page.y = interaction.startCoords.page.y;\n interaction.curCoords.client.y = interaction.startCoords.client.y;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vx);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vx);\n interaction.pointerDelta.client.vy = 0;\n interaction.pointerDelta.page.vy = 0;\n }\n else if (axis === 'y') {\n interaction.curCoords.page.x = interaction.startCoords.page.x;\n interaction.curCoords.client.x = interaction.startCoords.client.x;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vy);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vy);\n interaction.pointerDelta.client.vx = 0;\n interaction.pointerDelta.page.vx = 0;\n }\n});\n\n// dragmove\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'dragmove') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n iEvent.pageY = interaction.startCoords.page.y;\n iEvent.clientY = interaction.startCoords.client.y;\n iEvent.dy = 0;\n }\n else if (axis === 'y') {\n iEvent.pageX = interaction.startCoords.page.x;\n iEvent.clientX = interaction.startCoords.client.x;\n iEvent.dx = 0;\n }\n});\n\n/*\\\n * Interactable.draggable\n [ method ]\n *\n * Gets or sets whether drag actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of drag events\n | var isDraggable = interact('ul li').draggable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on drag events (object makes the Interactable draggable)\n = (object) This Interactable\n | interact(element).draggable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // the axis in which the first movement must be\n | // for the drag sequence to start\n | // 'xy' by default - any direction\n | startAxis: 'x' || 'y' || 'xy',\n |\n | // 'xy' by default - don't restrict to one axis (move in any direction)\n | // 'x' or 'y' to restrict movement to either axis\n | // 'start' to restrict movement to the axis the drag started in\n | lockAxis: 'x' || 'y' || 'xy' || 'start',\n |\n | // max number of drags that can happen concurrently\n | // with elements of this Interactable. Infinity by default\n | max: Infinity,\n |\n | // max number of drags that can target the same element+Interactable\n | // 1 by default\n | maxPerElement: 2\n | });\n\\*/\nInteractable.prototype.draggable = function (options) {\n if (utils.is.object(options)) {\n this.options.drag.enabled = options.enabled === false? false: true;\n this.setPerAction('drag', options);\n this.setOnEvents('drag', options);\n\n if (/^(xy|x|y|start)$/.test(options.lockAxis)) {\n this.options.drag.lockAxis = options.lockAxis;\n }\n if (/^(xy|x|y)$/.test(options.startAxis)) {\n this.options.drag.startAxis = options.startAxis;\n }\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drag.enabled = options;\n\n if (!options) {\n this.ondragstart = this.ondragstart = this.ondragend = null;\n }\n\n return this;\n }\n\n return this.options.drag;\n};\n\nactions.drag = drag;\nactions.names.push('drag');\nutils.merge(Interactable.eventTypes, [\n 'dragstart',\n 'dragmove',\n 'draginertiastart',\n 'draginertiaresume',\n 'dragend',\n]);\nactions.methodDict.drag = 'draggable';\n\ndefaultOptions.drag = drag.defaults;\n\nmodule.exports = drag;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst scope = require('../scope');\nconst interact = require('../interact');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drop = {\n defaults: {\n enabled: false,\n accept : null,\n overlap: 'pointer',\n },\n};\n\nlet dynamicDrop = false;\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // reset active dropzones\n interaction.activeDrops.dropzones = [];\n interaction.activeDrops.elements = [];\n interaction.activeDrops.rects = [];\n\n interaction.dropEvents = null;\n\n if (!interaction.dynamicDrop) {\n setActiveDrops(interaction, interaction.element);\n }\n\n const dragEvent = interaction.prevEvent;\n const dropEvents = getDropEvents(interaction, event, dragEvent);\n\n if (dropEvents.activate) {\n fireActiveDrops(interaction, dropEvents.activate);\n }\n});\n\nInteractEvent.signals.on('new', function ({ interaction, iEvent, event }) {\n if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { return; }\n\n const draggableElement = interaction.element;\n const dragEvent = iEvent;\n const dropResult = getDrop(dragEvent, event, draggableElement);\n\n interaction.dropTarget = dropResult.dropzone;\n interaction.dropElement = dropResult.element;\n\n interaction.dropEvents = getDropEvents(interaction, event, dragEvent);\n});\n\nInteraction.signals.on('action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n fireDropEvents(interaction, interaction.dropEvents);\n});\n\nInteraction.signals.on('action-end', function ({ interaction }) {\n if (interaction.prepared.name === 'drag') {\n fireDropEvents(interaction, interaction.dropEvents);\n }\n});\n\nInteraction.signals.on('stop-drag', function ({ interaction }) {\n interaction.activeDrops.dropzones =\n interaction.activeDrops.elements =\n interaction.activeDrops.rects =\n interaction.dropEvents = null;\n});\n\nfunction collectDrops (interaction, element) {\n const drops = [];\n const elements = [];\n\n element = element || interaction.element;\n\n // collect all dropzones and their elements which qualify for a drop\n for (const current of scope.interactables) {\n if (!current.options.drop.enabled) { continue; }\n\n const accept = current.options.drop.accept;\n\n // test the draggable element against the dropzone's accept setting\n if ((utils.is.element(accept) && accept !== element)\n || (utils.is.string(accept)\n && !utils.matchesSelector(element, accept))) {\n\n continue;\n }\n\n // query for new elements if necessary\n const dropElements = utils.is.string(current.target)\n ? current._context.querySelectorAll(current.target)\n : [current.target];\n\n for (let i = 0; i < dropElements.length; i++) {\n const currentElement = dropElements[i];\n\n if (currentElement !== element) {\n drops.push(current);\n elements.push(currentElement);\n }\n }\n }\n\n return {\n elements,\n dropzones: drops,\n };\n}\n\nfunction fireActiveDrops (interaction, event) {\n let prevElement;\n\n // loop through all active dropzones and trigger event\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n const current = interaction.activeDrops.dropzones[i];\n const currentElement = interaction.activeDrops.elements [i];\n\n // prevent trigger of duplicate events on same element\n if (currentElement !== prevElement) {\n // set current element as event target\n event.target = currentElement;\n current.fire(event);\n }\n prevElement = currentElement;\n }\n}\n\n// Collect a new set of possible drops and save them in activeDrops.\n// setActiveDrops should always be called when a drag has just started or a\n// drag event happens while dynamicDrop is true\nfunction setActiveDrops (interaction, dragElement) {\n // get dropzones and their elements that could receive the draggable\n const possibleDrops = collectDrops(interaction, dragElement, true);\n\n interaction.activeDrops.dropzones = possibleDrops.dropzones;\n interaction.activeDrops.elements = possibleDrops.elements;\n interaction.activeDrops.rects = [];\n\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n interaction.activeDrops.rects[i] =\n interaction.activeDrops.dropzones[i].getRect(interaction.activeDrops.elements[i]);\n }\n}\n\nfunction getDrop (dragEvent, event, dragElement) {\n const interaction = dragEvent.interaction;\n const validDrops = [];\n\n if (dynamicDrop) {\n setActiveDrops(interaction, dragElement);\n }\n\n // collect all dropzones and their elements which qualify for a drop\n for (let j = 0; j < interaction.activeDrops.dropzones.length; j++) {\n const current = interaction.activeDrops.dropzones[j];\n const currentElement = interaction.activeDrops.elements [j];\n const rect = interaction.activeDrops.rects [j];\n\n validDrops.push(current.dropCheck(dragEvent, event, interaction.target, dragElement, currentElement, rect)\n ? currentElement\n : null);\n }\n\n // get the most appropriate dropzone based on DOM depth and order\n const dropIndex = utils.indexOfDeepestElement(validDrops);\n\n return {\n dropzone: interaction.activeDrops.dropzones[dropIndex] || null,\n element : interaction.activeDrops.elements [dropIndex] || null,\n };\n}\n\nfunction getDropEvents (interaction, pointerEvent, dragEvent) {\n const dropEvents = {\n enter : null,\n leave : null,\n activate : null,\n deactivate: null,\n move : null,\n drop : null,\n };\n\n const tmpl = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n };\n\n if (interaction.dropElement !== interaction.prevDropElement) {\n // if there was a prevDropTarget, create a dragleave event\n if (interaction.prevDropTarget) {\n dropEvents.leave = utils.extend({ type: 'dragleave' }, tmpl);\n\n dragEvent.dragLeave = dropEvents.leave.target = interaction.prevDropElement;\n dragEvent.prevDropzone = dropEvents.leave.dropzone = interaction.prevDropTarget;\n }\n // if the dropTarget is not null, create a dragenter event\n if (interaction.dropTarget) {\n dropEvents.enter = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n type : 'dragenter',\n };\n\n dragEvent.dragEnter = interaction.dropElement;\n dragEvent.dropzone = interaction.dropTarget;\n }\n }\n\n if (dragEvent.type === 'dragend' && interaction.dropTarget) {\n dropEvents.drop = utils.extend({ type: 'drop' }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n dragEvent.relatedTarget = interaction.dropElement;\n }\n if (dragEvent.type === 'dragstart') {\n dropEvents.activate = utils.extend({ type: 'dropactivate' }, tmpl);\n\n dropEvents.activate.target = null;\n dropEvents.activate.dropzone = null;\n }\n if (dragEvent.type === 'dragend') {\n dropEvents.deactivate = utils.extend({ type: 'dropdeactivate' }, tmpl);\n\n dropEvents.deactivate.target = null;\n dropEvents.deactivate.dropzone = null;\n }\n if (dragEvent.type === 'dragmove' && interaction.dropTarget) {\n dropEvents.move = utils.extend({\n dragmove : dragEvent,\n type : 'dropmove',\n }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n }\n\n return dropEvents;\n}\n\nfunction fireDropEvents (interaction, dropEvents) {\n if (dropEvents.leave) { interaction.prevDropTarget.fire(dropEvents.leave); }\n if (dropEvents.move ) { interaction.dropTarget.fire(dropEvents.move ); }\n if (dropEvents.enter) { interaction.dropTarget.fire(dropEvents.enter); }\n if (dropEvents.drop ) { interaction.dropTarget.fire(dropEvents.drop ); }\n if (dropEvents.deactivate) {\n fireActiveDrops(interaction, dropEvents.deactivate);\n }\n\n interaction.prevDropTarget = interaction.dropTarget;\n interaction.prevDropElement = interaction.dropElement;\n}\n\n/*\\\n * Interactable.dropzone\n [ method ]\n *\n * Returns or sets whether elements can be dropped onto this\n * Interactable to trigger drop events\n *\n * Dropzones can receive the following events:\n * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends\n * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone\n * - `dragmove` when a draggable that has entered the dropzone is moved\n * - `drop` when a draggable is dropped into this dropzone\n *\n * Use the `accept` option to allow only elements that match the given CSS\n * selector or element. The value can be:\n *\n * - **an Element** - only that element can be dropped into this dropzone.\n * - **a string**, - the element being dragged must match it as a CSS selector.\n * - **`null`** - accept options is cleared - it accepts any element.\n *\n * Use the `overlap` option to set how drops are checked for. The allowed\n * values are:\n *\n * - `'pointer'`, the pointer must be over the dropzone (default)\n * - `'center'`, the draggable element's center must be over the dropzone\n * - a number from 0-1 which is the `(intersection area) / (draggable area)`.\n * e.g. `0.5` for drop to happen when half of the area of the draggable is\n * over the dropzone\n *\n * Use the `checker` option to specify a function to check if a dragged\n * element is over this Interactable.\n *\n | interact(target)\n | .dropChecker(function(dragEvent, // related dragmove or dragend event\n | event, // TouchEvent/PointerEvent/MouseEvent\n | dropped, // bool result of the default checker\n | dropzone, // dropzone Interactable\n | dropElement, // dropzone elemnt\n | draggable, // draggable Interactable\n | draggableElement) {// draggable element\n |\n | return dropped && event.target.hasAttribute('allow-drop');\n | }\n *\n *\n - options (boolean | object | null) #optional The new value to be set.\n | interact('.drop').dropzone({\n | accept: '.can-drop' || document.getElementById('single-drop'),\n | overlap: 'pointer' || 'center' || zeroToOne\n | }\n = (boolean | object) The current setting or this Interactable\n\\*/\nInteractable.prototype.dropzone = function (options) {\n if (utils.is.object(options)) {\n this.options.drop.enabled = options.enabled === false? false: true;\n\n if (utils.is.function(options.ondrop) ) { this.events.ondrop = options.ondrop ; }\n if (utils.is.function(options.ondropactivate) ) { this.events.ondropactivate = options.ondropactivate ; }\n if (utils.is.function(options.ondropdeactivate)) { this.events.ondropdeactivate = options.ondropdeactivate; }\n if (utils.is.function(options.ondragenter) ) { this.events.ondragenter = options.ondragenter ; }\n if (utils.is.function(options.ondragleave) ) { this.events.ondragleave = options.ondragleave ; }\n if (utils.is.function(options.ondropmove) ) { this.events.ondropmove = options.ondropmove ; }\n\n if (/^(pointer|center)$/.test(options.overlap)) {\n this.options.drop.overlap = options.overlap;\n }\n else if (utils.is.number(options.overlap)) {\n this.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0);\n }\n if ('accept' in options) {\n this.options.drop.accept = options.accept;\n }\n if ('checker' in options) {\n this.options.drop.checker = options.checker;\n }\n\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drop.enabled = options;\n\n if (!options) {\n this.ondragenter = this.ondragleave = this.ondrop\n = this.ondropactivate = this.ondropdeactivate = null;\n }\n\n return this;\n }\n\n return this.options.drop;\n};\n\nInteractable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) {\n let dropped = false;\n\n // if the dropzone has no rect (eg. display: none)\n // call the custom dropChecker or just return false\n if (!(rect = rect || this.getRect(dropElement))) {\n return (this.options.drop.checker\n ? this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement)\n : false);\n }\n\n const dropOverlap = this.options.drop.overlap;\n\n if (dropOverlap === 'pointer') {\n const origin = utils.getOriginXY(draggable, draggableElement, 'drag');\n const page = utils.getPageXY(dragEvent);\n\n page.x += origin.x;\n page.y += origin.y;\n\n const horizontal = (page.x > rect.left) && (page.x < rect.right);\n const vertical = (page.y > rect.top ) && (page.y < rect.bottom);\n\n dropped = horizontal && vertical;\n }\n\n const dragRect = draggable.getRect(draggableElement);\n\n if (dragRect && dropOverlap === 'center') {\n const cx = dragRect.left + dragRect.width / 2;\n const cy = dragRect.top + dragRect.height / 2;\n\n dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom;\n }\n\n if (dragRect && utils.is.number(dropOverlap)) {\n const overlapArea = (Math.max(0, Math.min(rect.right , dragRect.right ) - Math.max(rect.left, dragRect.left))\n * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top , dragRect.top )));\n\n const overlapRatio = overlapArea / (dragRect.width * dragRect.height);\n\n dropped = overlapRatio >= dropOverlap;\n }\n\n if (this.options.drop.checker) {\n dropped = this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement);\n }\n\n return dropped;\n};\n\nInteractable.signals.on('unset', function ({ interactable }) {\n interactable.dropzone(false);\n});\n\nInteractable.settingsMethods.push('dropChecker');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.dropTarget = null; // the dropzone a drag target might be dropped into\n interaction.dropElement = null; // the element at the time of checking\n interaction.prevDropTarget = null; // the dropzone that was recently dragged away from\n interaction.prevDropElement = null; // the element at the time of checking\n interaction.dropEvents = null; // the dropEvents related to the current drag event\n\n interaction.activeDrops = {\n dropzones: [], // the dropzones that are mentioned below\n elements : [], // elements of dropzones that accept the target draggable\n rects : [], // the rects of the elements mentioned above\n };\n\n});\n\nInteraction.signals.on('stop', function ({ interaction }) {\n interaction.dropTarget = interaction.dropElement =\n interaction.prevDropTarget = interaction.prevDropElement = null;\n});\n\n/*\\\n * interact.dynamicDrop\n [ method ]\n *\n * Returns or sets whether the dimensions of dropzone elements are\n * calculated on every dragmove or only on dragstart for the default\n * dropChecker\n *\n - newValue (boolean) #optional True to check on each move. False to check only before start\n = (boolean | interact) The current setting or interact\n\\*/\ninteract.dynamicDrop = function (newValue) {\n if (utils.is.bool(newValue)) {\n //if (dragging && dynamicDrop !== newValue && !newValue) {\n //calcRects(dropzones);\n //}\n\n dynamicDrop = newValue;\n\n return interact;\n }\n return dynamicDrop;\n};\n\nutils.merge(Interactable.eventTypes, [\n 'dragenter',\n 'dragleave',\n 'dropactivate',\n 'dropdeactivate',\n 'dropmove',\n 'drop',\n]);\nactions.methodDict.drop = 'dropzone';\n\ndefaultOptions.drop = drop.defaults;\n\nmodule.exports = drop;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst gesture = {\n defaults: {\n enabled : false,\n origin : null,\n restrict: null,\n },\n\n checker: function (pointer, event, interactable, element, interaction) {\n if (interaction.pointerIds.length >= 2) {\n return { name: 'gesture' };\n }\n\n return null;\n },\n\n getCursor: function () {\n return '';\n },\n};\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturestart') { return; }\n iEvent.ds = 0;\n\n interaction.gesture.startDistance = interaction.gesture.prevDistance = iEvent.distance;\n interaction.gesture.startAngle = interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.scale = 1;\n});\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturemove') { return; }\n\n iEvent.ds = iEvent.scale - interaction.gesture.scale;\n\n interaction.target.fire(iEvent);\n\n interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.prevDistance = iEvent.distance;\n\n if (iEvent.scale !== Infinity\n && iEvent.scale !== null\n && iEvent.scale !== undefined\n && !isNaN(iEvent.scale)) {\n\n interaction.gesture.scale = iEvent.scale;\n }\n});\n\n/*\\\n * Interactable.gesturable\n [ method ]\n *\n * Gets or sets whether multitouch gestures can be performed on the\n * Interactable's element\n *\n = (boolean) Indicates if this can be the target of gesture events\n | var isGestureable = interact(element).gesturable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on gesture events (makes the Interactable gesturable)\n = (object) this Interactable\n | interact(element).gesturable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // limit multiple gestures.\n | // See the explanation in @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n\\*/\nInteractable.prototype.gesturable = function (options) {\n if (utils.is.object(options)) {\n this.options.gesture.enabled = options.enabled === false? false: true;\n this.setPerAction('gesture', options);\n this.setOnEvents('gesture', options);\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.gesture.enabled = options;\n\n if (!options) {\n this.ongesturestart = this.ongesturestart = this.ongestureend = null;\n }\n\n return this;\n }\n\n return this.options.gesture;\n};\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action, event, starting, ending, deltaSource }) {\n if (action !== 'gesture') { return; }\n\n const pointers = interaction.pointers;\n\n iEvent.touches = [pointers[0], pointers[1]];\n\n if (starting) {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = 1;\n iEvent.ds = 0;\n iEvent.angle = utils.touchAngle(pointers, undefined, deltaSource);\n iEvent.da = 0;\n }\n else if (ending || event instanceof InteractEvent) {\n iEvent.distance = interaction.prevEvent.distance;\n iEvent.box = interaction.prevEvent.box;\n iEvent.scale = interaction.prevEvent.scale;\n iEvent.ds = iEvent.scale - 1;\n iEvent.angle = interaction.prevEvent.angle;\n iEvent.da = iEvent.angle - interaction.gesture.startAngle;\n }\n else {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = iEvent.distance / interaction.gesture.startDistance;\n iEvent.angle = utils.touchAngle(pointers, interaction.gesture.prevAngle, deltaSource);\n\n iEvent.ds = iEvent.scale - interaction.gesture.prevScale;\n iEvent.da = iEvent.angle - interaction.gesture.prevAngle;\n }\n});\n\nInteraction.signals.on('new', function (interaction) {\n interaction.gesture = {\n start: { x: 0, y: 0 },\n\n startDistance: 0, // distance between two touches of touchStart\n prevDistance : 0,\n distance : 0,\n\n scale: 1, // gesture.distance / gesture.startDistance\n\n startAngle: 0, // angle of line joining two touches\n prevAngle : 0, // angle of the previous gesture event\n };\n});\n\nactions.gesture = gesture;\nactions.names.push('gesture');\nutils.merge(Interactable.eventTypes, [\n 'gesturestart',\n 'gesturemove',\n 'gestureend',\n]);\nactions.methodDict.gesture = 'gesturable';\n\ndefaultOptions.gesture = gesture.defaults;\n\nmodule.exports = gesture;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\n// Less Precision with touch input\nconst defaultMargin = browser.supportsTouch || browser.supportsPointerEvent? 20: 10;\n\nconst resize = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n square: false,\n preserveAspectRatio: false,\n axis: 'xy',\n\n // use default margin\n margin: NaN,\n\n // object with props left, right, top, bottom which are\n // true/false values to resize when the pointer is over that edge,\n // CSS selectors to match the handles for each direction\n // or the Elements for each handle\n edges: null,\n\n // a value of 'none' will limit the resize rect to a minimum of 0x0\n // 'negate' will alow the rect to have negative width/height\n // 'reposition' will keep the width/height positive by swapping\n // the top and bottom edges and/or swapping the left and right edges\n invert: 'none',\n },\n\n checker: function (pointer, event, interactable, element, interaction, rect) {\n if (!rect) { return null; }\n\n const page = utils.extend({}, interaction.curCoords.page);\n const options = interactable.options;\n\n if (options.resize.enabled) {\n const resizeOptions = options.resize;\n const resizeEdges = { left: false, right: false, top: false, bottom: false };\n\n // if using resize.edges\n if (utils.is.object(resizeOptions.edges)) {\n for (const edge in resizeEdges) {\n resizeEdges[edge] = checkResizeEdge(edge,\n resizeOptions.edges[edge],\n page,\n interaction._eventTarget,\n element,\n rect,\n resizeOptions.margin || defaultMargin);\n }\n\n resizeEdges.left = resizeEdges.left && !resizeEdges.right;\n resizeEdges.top = resizeEdges.top && !resizeEdges.bottom;\n\n if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) {\n return {\n name: 'resize',\n edges: resizeEdges,\n };\n }\n }\n else {\n const right = options.resize.axis !== 'y' && page.x > (rect.right - defaultMargin);\n const bottom = options.resize.axis !== 'x' && page.y > (rect.bottom - defaultMargin);\n\n if (right || bottom) {\n return {\n name: 'resize',\n axes: (right? 'x' : '') + (bottom? 'y' : ''),\n };\n }\n }\n }\n\n return null;\n },\n\n cursors: (browser.isIe9OrOlder ? {\n x : 'e-resize',\n y : 's-resize',\n xy: 'se-resize',\n\n top : 'n-resize',\n left : 'w-resize',\n bottom : 's-resize',\n right : 'e-resize',\n topleft : 'se-resize',\n bottomright: 'se-resize',\n topright : 'ne-resize',\n bottomleft : 'ne-resize',\n } : {\n x : 'ew-resize',\n y : 'ns-resize',\n xy: 'nwse-resize',\n\n top : 'ns-resize',\n left : 'ew-resize',\n bottom : 'ns-resize',\n right : 'ew-resize',\n topleft : 'nwse-resize',\n bottomright: 'nwse-resize',\n topright : 'nesw-resize',\n bottomleft : 'nesw-resize',\n }),\n\n getCursor: function (action) {\n if (action.axis) {\n return resize.cursors[action.name + action.axis];\n }\n else if (action.edges) {\n let cursorKey = '';\n const edgeNames = ['top', 'bottom', 'left', 'right'];\n\n for (let i = 0; i < 4; i++) {\n if (action.edges[edgeNames[i]]) {\n cursorKey += edgeNames[i];\n }\n }\n\n return resize.cursors[cursorKey];\n }\n },\n};\n\n// resizestart\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'resizestart' || !interaction.prepared.edges) {\n return;\n }\n\n const startRect = interaction.target.getRect(interaction.element);\n const resizeOptions = interaction.target.options.resize;\n\n /*\n * When using the `resizable.square` or `resizable.preserveAspectRatio` options, resizing from one edge\n * will affect another. E.g. with `resizable.square`, resizing to make the right edge larger will make\n * the bottom edge larger by the same amount. We call these 'linked' edges. Any linked edges will depend\n * on the active edges and the edge being interacted with.\n */\n if (resizeOptions.square || resizeOptions.preserveAspectRatio) {\n const linkedEdges = utils.extend({}, interaction.prepared.edges);\n\n linkedEdges.top = linkedEdges.top || (linkedEdges.left && !linkedEdges.bottom);\n linkedEdges.left = linkedEdges.left || (linkedEdges.top && !linkedEdges.right );\n linkedEdges.bottom = linkedEdges.bottom || (linkedEdges.right && !linkedEdges.top );\n linkedEdges.right = linkedEdges.right || (linkedEdges.bottom && !linkedEdges.left );\n\n interaction.prepared._linkedEdges = linkedEdges;\n }\n else {\n interaction.prepared._linkedEdges = null;\n }\n\n // if using `resizable.preserveAspectRatio` option, record aspect ratio at the start of the resize\n if (resizeOptions.preserveAspectRatio) {\n interaction.resizeStartAspectRatio = startRect.width / startRect.height;\n }\n\n interaction.resizeRects = {\n start : startRect,\n current : utils.extend({}, startRect),\n inverted : utils.extend({}, startRect),\n previous : utils.extend({}, startRect),\n delta : {\n left: 0, right : 0, width : 0,\n top : 0, bottom: 0, height: 0,\n },\n };\n\n iEvent.rect = interaction.resizeRects.inverted;\n iEvent.deltaRect = interaction.resizeRects.delta;\n});\n\n// resizemove\nInteractEvent.signals.on('new', function ({ iEvent, phase, interaction }) {\n if (phase !== 'move' || !interaction.prepared.edges) { return; }\n\n const resizeOptions = interaction.target.options.resize;\n const invert = resizeOptions.invert;\n const invertible = invert === 'reposition' || invert === 'negate';\n\n let edges = interaction.prepared.edges;\n\n const start = interaction.resizeRects.start;\n const current = interaction.resizeRects.current;\n const inverted = interaction.resizeRects.inverted;\n const delta = interaction.resizeRects.delta;\n const previous = utils.extend(interaction.resizeRects.previous, inverted);\n const originalEdges = edges;\n\n let dx = iEvent.dx;\n let dy = iEvent.dy;\n\n if (resizeOptions.preserveAspectRatio || resizeOptions.square) {\n // `resize.preserveAspectRatio` takes precedence over `resize.square`\n const startAspectRatio = resizeOptions.preserveAspectRatio\n ? interaction.resizeStartAspectRatio\n : 1;\n\n edges = interaction.prepared._linkedEdges;\n\n if ((originalEdges.left && originalEdges.bottom)\n || (originalEdges.right && originalEdges.top)) {\n dy = -dx / startAspectRatio;\n }\n else if (originalEdges.left || originalEdges.right ) { dy = dx / startAspectRatio; }\n else if (originalEdges.top || originalEdges.bottom) { dx = dy * startAspectRatio; }\n }\n\n // update the 'current' rect without modifications\n if (edges.top ) { current.top += dy; }\n if (edges.bottom) { current.bottom += dy; }\n if (edges.left ) { current.left += dx; }\n if (edges.right ) { current.right += dx; }\n\n if (invertible) {\n // if invertible, copy the current rect\n utils.extend(inverted, current);\n\n if (invert === 'reposition') {\n // swap edge values if necessary to keep width/height positive\n let swap;\n\n if (inverted.top > inverted.bottom) {\n swap = inverted.top;\n\n inverted.top = inverted.bottom;\n inverted.bottom = swap;\n }\n if (inverted.left > inverted.right) {\n swap = inverted.left;\n\n inverted.left = inverted.right;\n inverted.right = swap;\n }\n }\n }\n else {\n // if not invertible, restrict to minimum of 0x0 rect\n inverted.top = Math.min(current.top, start.bottom);\n inverted.bottom = Math.max(current.bottom, start.top);\n inverted.left = Math.min(current.left, start.right);\n inverted.right = Math.max(current.right, start.left);\n }\n\n inverted.width = inverted.right - inverted.left;\n inverted.height = inverted.bottom - inverted.top ;\n\n for (const edge in inverted) {\n delta[edge] = inverted[edge] - previous[edge];\n }\n\n iEvent.edges = interaction.prepared.edges;\n iEvent.rect = inverted;\n iEvent.deltaRect = delta;\n});\n\n/*\\\n * Interactable.resizable\n [ method ]\n *\n * Gets or sets whether resize actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of resize elements\n | var isResizeable = interact('input[type=text]').resizable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on resize events (object makes the Interactable resizable)\n = (object) This Interactable\n | interact(element).resizable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | edges: {\n | top : true, // Use pointer coords to check for resize.\n | left : false, // Disable resizing from left edge.\n | bottom: '.resize-s',// Resize if pointer target matches selector\n | right : handleEl // Resize if pointer target is the given Element\n | },\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height are adjusted at a 1:1 ratio.\n | square: false,\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height maintain the aspect ratio they had when resizing started.\n | preserveAspectRatio: false,\n |\n | // a value of 'none' will limit the resize rect to a minimum of 0x0\n | // 'negate' will allow the rect to have negative width/height\n | // 'reposition' will keep the width/height positive by swapping\n | // the top and bottom edges and/or swapping the left and right edges\n | invert: 'none' || 'negate' || 'reposition'\n |\n | // limit multiple resizes.\n | // See the explanation in the @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n \\*/\nInteractable.prototype.resizable = function (options) {\n if (utils.is.object(options)) {\n this.options.resize.enabled = options.enabled === false? false: true;\n this.setPerAction('resize', options);\n this.setOnEvents('resize', options);\n\n if (/^x$|^y$|^xy$/.test(options.axis)) {\n this.options.resize.axis = options.axis;\n }\n else if (options.axis === null) {\n this.options.resize.axis = defaultOptions.resize.axis;\n }\n\n if (utils.is.bool(options.preserveAspectRatio)) {\n this.options.resize.preserveAspectRatio = options.preserveAspectRatio;\n }\n else if (utils.is.bool(options.square)) {\n this.options.resize.square = options.square;\n }\n\n return this;\n }\n if (utils.is.bool(options)) {\n this.options.resize.enabled = options;\n\n if (!options) {\n this.onresizestart = this.onresizestart = this.onresizeend = null;\n }\n\n return this;\n }\n return this.options.resize;\n};\n\nfunction checkResizeEdge (name, value, page, element, interactableElement, rect, margin) {\n // false, '', undefined, null\n if (!value) { return false; }\n\n // true value, use pointer coords and element rect\n if (value === true) {\n // if dimensions are negative, \"switch\" edges\n const width = utils.is.number(rect.width )? rect.width : rect.right - rect.left;\n const height = utils.is.number(rect.height)? rect.height : rect.bottom - rect.top ;\n\n if (width < 0) {\n if (name === 'left' ) { name = 'right'; }\n else if (name === 'right') { name = 'left' ; }\n }\n if (height < 0) {\n if (name === 'top' ) { name = 'bottom'; }\n else if (name === 'bottom') { name = 'top' ; }\n }\n\n if (name === 'left' ) { return page.x < ((width >= 0? rect.left: rect.right ) + margin); }\n if (name === 'top' ) { return page.y < ((height >= 0? rect.top : rect.bottom) + margin); }\n\n if (name === 'right' ) { return page.x > ((width >= 0? rect.right : rect.left) - margin); }\n if (name === 'bottom') { return page.y > ((height >= 0? rect.bottom: rect.top ) - margin); }\n }\n\n // the remaining checks require an element\n if (!utils.is.element(element)) { return false; }\n\n return utils.is.element(value)\n // the value is an element to use as a resize handle\n ? value === element\n // otherwise check if element matches value as selector\n : utils.matchesUpTo(element, value, interactableElement);\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.resizeAxes = 'xy';\n});\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action }) {\n if (action !== 'resize' || !interaction.resizeAxes) { return; }\n\n const options = interaction.target.options;\n\n if (options.resize.square) {\n if (interaction.resizeAxes === 'y') {\n iEvent.dx = iEvent.dy;\n }\n else {\n iEvent.dy = iEvent.dx;\n }\n iEvent.axes = 'xy';\n }\n else {\n iEvent.axes = interaction.resizeAxes;\n\n if (interaction.resizeAxes === 'x') {\n iEvent.dy = 0;\n }\n else if (interaction.resizeAxes === 'y') {\n iEvent.dx = 0;\n }\n }\n});\n\nactions.resize = resize;\nactions.names.push('resize');\nutils.merge(Interactable.eventTypes, [\n 'resizestart',\n 'resizemove',\n 'resizeinertiastart',\n 'resizeinertiaresume',\n 'resizeend',\n]);\nactions.methodDict.resize = 'resizable';\n\ndefaultOptions.resize = resize.defaults;\n\nmodule.exports = resize;\n","const raf = require('./utils/raf');\nconst getWindow = require('./utils/window').getWindow;\nconst is = require('./utils/is');\nconst domUtils = require('./utils/domUtils');\nconst Interaction = require('./Interaction');\nconst defaultOptions = require('./defaultOptions');\n\nconst autoScroll = {\n defaults: {\n enabled : false,\n container: null, // the item that is scrolled (Window or HTMLElement)\n margin : 60,\n speed : 300, // the scroll speed in pixels per second\n },\n\n interaction: null,\n i: null, // the handle returned by window.setInterval\n x: 0, y: 0, // Direction each pulse is to scroll in\n\n isScrolling: false,\n prevTime: 0,\n\n start: function (interaction) {\n autoScroll.isScrolling = true;\n raf.cancel(autoScroll.i);\n\n autoScroll.interaction = interaction;\n autoScroll.prevTime = new Date().getTime();\n autoScroll.i = raf.request(autoScroll.scroll);\n },\n\n stop: function () {\n autoScroll.isScrolling = false;\n raf.cancel(autoScroll.i);\n },\n\n // scroll the window by the values in scroll.x/y\n scroll: function () {\n const options = autoScroll.interaction.target.options[autoScroll.interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(autoScroll.interaction.element);\n const now = new Date().getTime();\n // change in time in seconds\n const dt = (now - autoScroll.prevTime) / 1000;\n // displacement\n const s = options.speed * dt;\n\n if (s >= 1) {\n if (is.window(container)) {\n container.scrollBy(autoScroll.x * s, autoScroll.y * s);\n }\n else if (container) {\n container.scrollLeft += autoScroll.x * s;\n container.scrollTop += autoScroll.y * s;\n }\n\n autoScroll.prevTime = now;\n }\n\n if (autoScroll.isScrolling) {\n raf.cancel(autoScroll.i);\n autoScroll.i = raf.request(autoScroll.scroll);\n }\n },\n check: function (interactable, actionName) {\n const options = interactable.options;\n\n return options[actionName].autoScroll && options[actionName].autoScroll.enabled;\n },\n onInteractionMove: function ({ interaction, pointer }) {\n if (!(interaction.interacting()\n && autoScroll.check(interaction.target, interaction.prepared.name))) {\n return;\n }\n\n if (interaction.simulation) {\n autoScroll.x = autoScroll.y = 0;\n return;\n }\n\n let top;\n let right;\n let bottom;\n let left;\n\n const options = interaction.target.options[interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(interaction.element);\n\n if (is.window(container)) {\n left = pointer.clientX < autoScroll.margin;\n top = pointer.clientY < autoScroll.margin;\n right = pointer.clientX > container.innerWidth - autoScroll.margin;\n bottom = pointer.clientY > container.innerHeight - autoScroll.margin;\n }\n else {\n const rect = domUtils.getElementClientRect(container);\n\n left = pointer.clientX < rect.left + autoScroll.margin;\n top = pointer.clientY < rect.top + autoScroll.margin;\n right = pointer.clientX > rect.right - autoScroll.margin;\n bottom = pointer.clientY > rect.bottom - autoScroll.margin;\n }\n\n autoScroll.x = (right ? 1: left? -1: 0);\n autoScroll.y = (bottom? 1: top? -1: 0);\n\n if (!autoScroll.isScrolling) {\n // set the autoScroll properties to those of the target\n autoScroll.margin = options.margin;\n autoScroll.speed = options.speed;\n\n autoScroll.start(interaction);\n }\n },\n};\n\nInteraction.signals.on('stop-active', function () {\n autoScroll.stop();\n});\n\nInteraction.signals.on('action-move', autoScroll.onInteractionMove);\n\ndefaultOptions.perAction.autoScroll = autoScroll.defaults;\n\nmodule.exports = autoScroll;\n","const Interactable = require('../Interactable');\nconst actions = require('../actions/base');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.ignoreFrom\n [ method ]\n *\n * If the target of the `mousedown`, `pointerdown` or `touchstart`\n * event or any of it's parents match the given CSS selector or\n * Element, no drag/resize/gesture is started.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to not ignore any elements\n = (string | Element | object) The current ignoreFrom value or this Interactable\n **\n | interact(element, { ignoreFrom: document.getElementById('no-action') });\n | // or\n | interact(element).ignoreFrom('input, textarea, a');\n\\*/\nInteractable.prototype.ignoreFrom = function (newValue) {\n return this._backCompatOption('ignoreFrom', newValue);\n};\n\n/*\\\n * Interactable.allowFrom\n [ method ]\n *\n * A drag/resize/gesture is started only If the target of the\n * `mousedown`, `pointerdown` or `touchstart` event or any of it's\n * parents match the given CSS selector or Element.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to allow from any element\n = (string | Element | object) The current allowFrom value or this Interactable\n **\n | interact(element, { allowFrom: document.getElementById('drag-handle') });\n | // or\n | interact(element).allowFrom('.handle');\n\\*/\nInteractable.prototype.allowFrom = function (newValue) {\n return this._backCompatOption('allowFrom', newValue);\n};\n\nInteractable.prototype.testIgnore = function (ignoreFrom, interactableElement, element) {\n if (!ignoreFrom || !is.element(element)) { return false; }\n\n if (is.string(ignoreFrom)) {\n return domUtils.matchesUpTo(element, ignoreFrom, interactableElement);\n }\n else if (is.element(ignoreFrom)) {\n return domUtils.nodeContains(ignoreFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testAllow = function (allowFrom, interactableElement, element) {\n if (!allowFrom) { return true; }\n\n if (!is.element(element)) { return false; }\n\n if (is.string(allowFrom)) {\n return domUtils.matchesUpTo(element, allowFrom, interactableElement);\n }\n else if (is.element(allowFrom)) {\n return domUtils.nodeContains(allowFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testIgnoreAllow = function (options, interactableElement, eventTarget) {\n return (!this.testIgnore(options.ignoreFrom, interactableElement, eventTarget)\n && this.testAllow(options.allowFrom, interactableElement, eventTarget));\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (event.buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\n","const interact = require('../interact');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst actions = require('../actions/base');\nconst defaultOptions = require('../defaultOptions');\nconst browser = require('../utils/browser');\nconst scope = require('../scope');\nconst utils = require('../utils');\nconst signals = require('../utils/Signals').new();\n\nrequire('./InteractableMethods');\n\nconst autoStart = {\n signals,\n withinInteractionLimit,\n // Allow this many interactions to happen simultaneously\n maxInteractions: Infinity,\n defaults: {\n perAction: {\n manualStart: false,\n max: Infinity,\n maxPerElement: 1,\n allowFrom: null,\n ignoreFrom: null,\n },\n },\n setActionDefaults: function (action) {\n utils.extend(action.defaults, autoStart.defaults.perAction);\n },\n};\n\n// set cursor style on mousedown\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget }) {\n if (interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\n// set cursor style on mousemove\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget }) {\n if (!interaction.mouse\n || interaction.pointerIsDown\n || interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\nInteraction.signals.on('move', function (arg) {\n const { interaction, event } = arg;\n\n if (!interaction.pointerIsDown\n || interaction.interacting()\n || !interaction.pointerWasMoved\n || !interaction.prepared.name) {\n return;\n }\n\n signals.fire('before-start', arg);\n\n const target = interaction.target;\n\n if (interaction.prepared.name && target) {\n // check manualStart and interaction limit\n if (target.options[interaction.prepared.name].manualStart\n || !withinInteractionLimit(target, interaction.element, interaction.prepared)) {\n interaction.stop(event);\n }\n else {\n interaction.start(interaction.prepared, target, interaction.element);\n }\n }\n});\n\n// Check if the current target supports the action.\n// If so, return the validated action. Otherwise, return null\nfunction validateAction (action, interactable, element, eventTarget) {\n if (utils.is.object(action)\n && interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget)\n && interactable.options[action.name].enabled\n && withinInteractionLimit(interactable, element, action)) {\n return action;\n }\n\n return null;\n}\n\nfunction validateSelector (interaction, pointer, event, matches, matchElements, eventTarget) {\n for (let i = 0, len = matches.length; i < len; i++) {\n const match = matches[i];\n const matchElement = matchElements[i];\n const action = validateAction(match.getAction(pointer, event, interaction, matchElement),\n match,\n matchElement,\n eventTarget);\n\n if (action) {\n return {\n action,\n target: match,\n element: matchElement,\n };\n }\n }\n\n return {};\n}\n\nfunction getActionInfo (interaction, pointer, event, eventTarget) {\n let matches = [];\n let matchElements = [];\n\n let element = eventTarget;\n let action = null;\n\n function pushMatches (interactable, selector, context) {\n const elements = (browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined);\n\n if (utils.matchesSelector(element, selector, elements)) {\n\n matches.push(interactable);\n matchElements.push(element);\n }\n }\n\n while (utils.is.element(element)) {\n matches = [];\n matchElements = [];\n\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && (action = validateAction(elementInteractable.getAction(pointer, event, interaction, element, eventTarget),\n elementInteractable,\n element,\n eventTarget))\n && !elementInteractable.options[action.name].manualStart) {\n return {\n element,\n action,\n target: elementInteractable,\n };\n }\n else {\n scope.interactables.forEachSelector(pushMatches, element);\n\n const actionInfo = validateSelector(interaction, pointer, event, matches, matchElements, eventTarget);\n\n if (actionInfo.action\n && !actionInfo.target.options[actionInfo.action.name].manualStart) {\n return actionInfo;\n }\n }\n\n element = utils.parentNode(element);\n }\n\n return {};\n}\n\nfunction prepare (interaction, { action, target, element }) {\n action = action || {};\n\n if (interaction.target && interaction.target.options.styleCursor) {\n interaction.target._doc.documentElement.style.cursor = '';\n }\n\n interaction.target = target;\n interaction.element = element;\n utils.copyAction(interaction.prepared, action);\n\n if (target && target.options.styleCursor) {\n const cursor = action? actions[action.name].getCursor(action) : '';\n interaction.target._doc.documentElement.style.cursor = cursor;\n }\n\n signals.fire('prepared', { interaction: interaction });\n}\n\nInteraction.signals.on('stop', function ({ interaction }) {\n const target = interaction.target;\n\n if (target && target.options.styleCursor) {\n target._doc.documentElement.style.cursor = '';\n }\n});\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (utils.is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (utils.is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n const buttons = event.buttons || ({\n 0: 1,\n 1: 4,\n 3: 8,\n 4: 16,\n })[event.button];\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\nfunction withinInteractionLimit (interactable, element, action) {\n const options = interactable.options;\n const maxActions = options[action.name].max;\n const maxPerElement = options[action.name].maxPerElement;\n let activeInteractions = 0;\n let targetCount = 0;\n let targetElementCount = 0;\n\n // no actions if any of these values == 0\n if (!(maxActions && maxPerElement && autoStart.maxInteractions)) { return; }\n\n for (let i = 0, len = scope.interactions.length; i < len; i++) {\n const interaction = scope.interactions[i];\n const otherAction = interaction.prepared.name;\n\n if (!interaction.interacting()) { continue; }\n\n activeInteractions++;\n\n if (activeInteractions >= autoStart.maxInteractions) {\n return false;\n }\n\n if (interaction.target !== interactable) { continue; }\n\n targetCount += (otherAction === action.name)|0;\n\n if (targetCount >= maxActions) {\n return false;\n }\n\n if (interaction.element === element) {\n targetElementCount++;\n\n if (otherAction !== action.name || targetElementCount >= maxPerElement) {\n return false;\n }\n }\n }\n\n return autoStart.maxInteractions > 0;\n}\n\n/*\\\n * interact.maxInteractions\n [ method ]\n **\n * Returns or sets the maximum number of concurrent interactions allowed.\n * By default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables\n * and elements, you need to enable it in the draggable, resizable and\n * gesturable `'max'` and `'maxPerElement'` options.\n **\n - newValue (number) #optional Any number. newValue <= 0 means no interactions.\n\\*/\ninteract.maxInteractions = function (newValue) {\n if (utils.is.number(newValue)) {\n autoStart.maxInteractions = newValue;\n\n return this;\n }\n\n return autoStart.maxInteractions;\n};\n\nInteractable.settingsMethods.push('styleCursor');\nInteractable.settingsMethods.push('actionChecker');\nInteractable.settingsMethods.push('ignoreFrom');\nInteractable.settingsMethods.push('allowFrom');\n\ndefaultOptions.base.actionChecker = null;\ndefaultOptions.base.styleCursor = true;\n\nutils.extend(defaultOptions.perAction, autoStart.defaults.perAction);\n\nmodule.exports = autoStart;\n","const autoStart = require('./base');\nconst Interaction = require('../Interaction');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.delayTimer = null;\n});\n\nautoStart.signals.on('prepared', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.delayTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.target, interaction.element);\n }, delay);\n }\n});\n\nInteraction.signals.on('move', function ({ interaction, duplicate }) {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.delayTimer);\n }\n});\n\n// prevent regular down->move autoStart\nautoStart.signals.on('before-start', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.prepared.name = null;\n }\n});\n","const autoStart = require('./base');\nconst scope = require('../scope');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\n\nconst { matchesSelector, parentNode } = require('../utils/domUtils');\n\nautoStart.setActionDefaults(require('../actions/drag'));\n\nautoStart.signals.on('before-start', function ({ interaction, eventTarget, dx, dy }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // check if a drag is in the correct axis\n const absX = Math.abs(dx);\n const absY = Math.abs(dy);\n const options = interaction.target.options.drag;\n const startAxis = options.startAxis;\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy');\n\n interaction.prepared.axis = options.lockAxis === 'start'\n ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n : options.lockAxis;\n\n // if the movement isn't in the startAxis of the interactable\n if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) {\n // cancel the prepared action\n interaction.prepared.name = null;\n\n // then try to get a drag from another ineractable\n\n if (!interaction.prepared.name) {\n\n let element = eventTarget;\n\n const getDraggable = function (interactable, selector, context) {\n const elements = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n if (interactable === interaction.target) { return; }\n\n if (!options.manualStart\n && !interactable.testIgnoreAllow(options, element, eventTarget)\n && matchesSelector(element, selector, elements)) {\n\n const action = interactable.getAction(interaction.downPointer,\n interaction.downEvent,\n interaction,\n element);\n\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, interactable)\n && autoStart.validateAction(action, interactable, element, eventTarget)) {\n\n return interactable;\n }\n }\n };\n\n let action = null;\n\n // check all interactables\n while (is.element(element)) {\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && elementInteractable !== interaction.target\n && !elementInteractable.options.drag.manualStart) {\n\n action = elementInteractable.getAction(interaction.downPointer, interaction.downEvent, interaction, element);\n }\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, elementInteractable)) {\n\n interaction.prepared.name = 'drag';\n interaction.target = elementInteractable;\n interaction.element = element;\n break;\n }\n\n const selectorInteractable = scope.interactables.forEachSelector(getDraggable, element);\n\n if (selectorInteractable) {\n interaction.prepared.name = 'drag';\n interaction.target = selectorInteractable;\n interaction.element = element;\n break;\n }\n\n element = parentNode(element);\n }\n }\n }\n});\n\nfunction checkStartAxis (startAxis, interactable) {\n if (!interactable) { return false; }\n\n const thisAxis = interactable.options.drag.startAxis;\n\n return (startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis);\n}\n","require('./base').setActionDefaults(require('../actions/gesture'));\n","require('./base').setActionDefaults(require('../actions/resize'));\n","module.exports = {\n base: {\n accept : null,\n preventDefault: 'auto',\n deltaSource : 'page',\n },\n\n perAction: {\n origin: { x: 0, y: 0 },\n\n // only allow left button by default\n // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n mouseButtons: 1,\n\n inertia: {\n enabled : false,\n resistance : 10, // the lambda in exponential decay\n minSpeed : 100, // target speed must be above this for inertia to start\n endSpeed : 10, // the speed at which inertia is slow enough to stop\n allowResume : true, // allow resuming an action in inertia phase\n smoothEndDuration: 300, // animate to snap/restrict endOnly if there's no inertia\n },\n },\n};\n","/* browser entry point */\n\n// Legacy browser support\nrequire('./legacyBrowsers');\n\n// inertia\nrequire('./inertia');\n\n// modifiers\nrequire('./modifiers/snap');\nrequire('./modifiers/restrict');\n\n// pointerEvents\nrequire('./pointerEvents/base');\nrequire('./pointerEvents/holdRepeat');\nrequire('./pointerEvents/interactableTargets');\n\n// delay\nrequire('./autoStart/delay');\n\n// actions\nrequire('./actions/gesture');\nrequire('./actions/resize');\nrequire('./actions/drag');\nrequire('./actions/drop');\n\n// load these modifiers after resize is loaded\nrequire('./modifiers/snapSize');\nrequire('./modifiers/restrictEdges');\nrequire('./modifiers/restrictSize');\n\n// autoStart actions\nrequire('./autoStart/gesture');\nrequire('./autoStart/resize');\nrequire('./autoStart/drag');\n\n// Interactable preventDefault setting\nrequire('./interactablePreventDefault.js');\n\n// autoScroll\nrequire('./autoScroll');\n\n// export interact\nmodule.exports = require('./interact');\n","const InteractEvent = require('./InteractEvent');\nconst Interaction = require('./Interaction');\nconst modifiers = require('./modifiers');\nconst utils = require('./utils');\nconst animationFrame = require('./utils/raf');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.inertiaStatus = {\n active : false,\n smoothEnd : false,\n allowResume: false,\n\n startEvent: null,\n upCoords : {},\n\n xe: 0, ye: 0,\n sx: 0, sy: 0,\n\n t0: 0,\n vx0: 0, vys: 0,\n duration: 0,\n\n lambda_v0: 0,\n one_ve_v0: 0,\n i : null,\n };\n\n interaction.boundInertiaFrame = () => inertiaFrame .apply(interaction);\n interaction.boundSmoothEndFrame = () => smoothEndFrame.apply(interaction);\n});\n\nInteraction.signals.on('down', function ({ interaction, event, pointer, eventTarget }) {\n const status = interaction.inertiaStatus;\n\n // Check if the down event hits the current inertia target\n if (status.active) {\n let element = eventTarget;\n\n // climb up the DOM tree from the event target\n while (utils.is.element(element)) {\n\n // if interaction element is the current inertia target element\n if (element === interaction.element) {\n // stop inertia\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n\n // update pointers to the down event's coordinates\n interaction.updatePointer(pointer);\n utils.setCoords(interaction.curCoords, interaction.pointers);\n\n // fire appropriate signals\n const signalArg = { interaction };\n Interaction.signals.fire('before-action-move', signalArg);\n Interaction.signals.fire('action-resume' , signalArg);\n\n // fire a reume event\n const resumeEvent = new InteractEvent(interaction,\n event,\n interaction.prepared.name,\n 'inertiaresume',\n interaction.element);\n\n interaction.target.fire(resumeEvent);\n interaction.prevEvent = resumeEvent;\n modifiers.resetStatuses(interaction.modifierStatuses);\n\n utils.copyCoords(interaction.prevCoords, interaction.curCoords);\n break;\n }\n\n element = utils.parentNode(element);\n }\n }\n});\n\nInteraction.signals.on('up', function ({ interaction, event }) {\n const status = interaction.inertiaStatus;\n\n if (!interaction.interacting() || status.active) { return; }\n\n const target = interaction.target;\n const options = target && target.options;\n const inertiaOptions = options && interaction.prepared.name && options[interaction.prepared.name].inertia;\n\n const now = new Date().getTime();\n const statuses = {};\n const page = utils.extend({}, interaction.curCoords.page);\n const pointerSpeed = interaction.pointerDelta.client.speed;\n\n let smoothEnd = false;\n let modifierResult;\n\n // check if inertia should be started\n const inertiaPossible = (inertiaOptions && inertiaOptions.enabled\n && interaction.prepared.name !== 'gesture'\n && event !== status.startEvent);\n\n const inertia = (inertiaPossible\n && (now - interaction.curCoords.timeStamp) < 50\n && pointerSpeed > inertiaOptions.minSpeed\n && pointerSpeed > inertiaOptions.endSpeed);\n\n const modifierArg = {\n interaction,\n pageCoords: page,\n statuses,\n preEnd: true,\n requireEndOnly: true,\n };\n\n // smoothEnd\n if (inertiaPossible && !inertia) {\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n if (modifierResult.shouldMove && modifierResult.locked) {\n smoothEnd = true;\n }\n }\n\n if (!(inertia || smoothEnd)) { return; }\n\n utils.copyCoords(status.upCoords, interaction.curCoords);\n\n interaction.pointers[0] = status.startEvent =\n new InteractEvent(interaction, event, interaction.prepared.name, 'inertiastart', interaction.element);\n\n status.t0 = now;\n\n status.active = true;\n status.allowResume = inertiaOptions.allowResume;\n interaction.simulation = status;\n\n target.fire(status.startEvent);\n\n if (inertia) {\n status.vx0 = interaction.pointerDelta.client.vx;\n status.vy0 = interaction.pointerDelta.client.vy;\n status.v0 = pointerSpeed;\n\n calcInertia(interaction, status);\n\n utils.extend(page, interaction.curCoords.page);\n\n page.x += status.xe;\n page.y += status.ye;\n\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n status.modifiedXe += modifierResult.dx;\n status.modifiedYe += modifierResult.dy;\n\n status.i = animationFrame.request(interaction.boundInertiaFrame);\n }\n else {\n status.smoothEnd = true;\n status.xe = modifierResult.dx;\n status.ye = modifierResult.dy;\n\n status.sx = status.sy = 0;\n\n status.i = animationFrame.request(interaction.boundSmoothEndFrame);\n }\n});\n\nInteraction.signals.on('stop-active', function ({ interaction }) {\n const status = interaction.inertiaStatus;\n\n if (status.active) {\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n }\n});\n\nfunction calcInertia (interaction, status) {\n const inertiaOptions = interaction.target.options[interaction.prepared.name].inertia;\n const lambda = inertiaOptions.resistance;\n const inertiaDur = -Math.log(inertiaOptions.endSpeed / status.v0) / lambda;\n\n status.x0 = interaction.prevEvent.pageX;\n status.y0 = interaction.prevEvent.pageY;\n status.t0 = status.startEvent.timeStamp / 1000;\n status.sx = status.sy = 0;\n\n status.modifiedXe = status.xe = (status.vx0 - inertiaDur) / lambda;\n status.modifiedYe = status.ye = (status.vy0 - inertiaDur) / lambda;\n status.te = inertiaDur;\n\n status.lambda_v0 = lambda / status.v0;\n status.one_ve_v0 = 1 - inertiaOptions.endSpeed / status.v0;\n}\n\nfunction inertiaFrame () {\n updateInertiaCoords(this);\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n\n const status = this.inertiaStatus;\n const options = this.target.options[this.prepared.name].inertia;\n const lambda = options.resistance;\n const t = new Date().getTime() / 1000 - status.t0;\n\n if (t < status.te) {\n\n const progress = 1 - (Math.exp(-lambda * t) - status.lambda_v0) / status.one_ve_v0;\n\n if (status.modifiedXe === status.xe && status.modifiedYe === status.ye) {\n status.sx = status.xe * progress;\n status.sy = status.ye * progress;\n }\n else {\n const quadPoint = utils.getQuadraticCurvePoint(0, 0,\n status.xe,\n status.ye,\n status.modifiedXe,\n status.modifiedYe,\n progress);\n\n status.sx = quadPoint.x;\n status.sy = quadPoint.y;\n }\n\n this.doMove();\n\n status.i = animationFrame.request(this.boundInertiaFrame);\n }\n else {\n status.sx = status.modifiedXe;\n status.sy = status.modifiedYe;\n\n this.doMove();\n this.end(status.startEvent);\n status.active = false;\n this.simulation = null;\n }\n\n utils.copyCoords(this.prevCoords, this.curCoords);\n}\n\nfunction smoothEndFrame () {\n updateInertiaCoords(this);\n\n const status = this.inertiaStatus;\n const t = new Date().getTime() - status.t0;\n const duration = this.target.options[this.prepared.name].inertia.smoothEndDuration;\n\n if (t < duration) {\n status.sx = utils.easeOutQuad(t, 0, status.xe, duration);\n status.sy = utils.easeOutQuad(t, 0, status.ye, duration);\n\n this.pointerMove(status.startEvent, status.startEvent);\n\n status.i = animationFrame.request(this.boundSmoothEndFrame);\n }\n else {\n status.sx = status.xe;\n status.sy = status.ye;\n\n this.pointerMove(status.startEvent, status.startEvent);\n this.end(status.startEvent);\n\n status.smoothEnd =\n status.active = false;\n this.simulation = null;\n }\n}\n\nfunction updateInertiaCoords (interaction) {\n const status = interaction.inertiaStatus;\n\n // return if inertia isn't running\n if (!status.active) { return; }\n\n const pageUp = status.upCoords.page;\n const clientUp = status.upCoords.client;\n\n utils.setCoords(interaction.curCoords, [ {\n pageX : pageUp.x + status.sx,\n pageY : pageUp.y + status.sy,\n clientX: clientUp.x + status.sx,\n clientY: clientUp.y + status.sy,\n } ]);\n}\n","const browser = require('./utils/browser');\nconst events = require('./utils/events');\nconst utils = require('./utils');\nconst scope = require('./scope');\nconst Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\n\nconst globalEvents = {};\n\n/*\\\n * interact\n [ method ]\n *\n * The methods of this variable can be used to set elements as\n * interactables and also to change various default settings.\n *\n * Calling it as a function and passing an element or a valid CSS selector\n * string returns an Interactable object which has various methods to\n * configure it.\n *\n - element (Element | string) The HTML or SVG Element to interact with or CSS selector\n = (object) An @Interactable\n *\n > Usage\n | interact('#draggable').draggable(true);\n |\n | var rectables = interact('rect');\n | rectables\n | .gesturable(true)\n | .on('gesturemove', function (event) {\n | // ...\n | });\n\\*/\nfunction interact (element, options) {\n let interactable = scope.interactables.get(element, options);\n\n if (!interactable) {\n interactable = new Interactable(element, options);\n interactable.events.global = globalEvents;\n }\n\n return interactable;\n}\n\n/*\\\n * interact.isSet\n [ method ]\n *\n * Check if an element has been set\n - element (Element) The Element being searched for\n = (boolean) Indicates if the element or CSS selector was previously passed to interact\n\\*/\ninteract.isSet = function (element, options) {\n return scope.interactables.indexOfElement(element, options && options.context) !== -1;\n};\n\n/*\\\n * interact.on\n [ method ]\n *\n * Adds a global listener for an InteractEvent or adds a DOM event to\n * `document`\n *\n - type (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) interact\n\\*/\ninteract.on = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.on(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.on(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n // if it is an InteractEvent type, add listener to globalEvents\n if (utils.contains(Interactable.eventTypes, type)) {\n // if this type of event was never bound\n if (!globalEvents[type]) {\n globalEvents[type] = [listener];\n }\n else {\n globalEvents[type].push(listener);\n }\n }\n // If non InteractEvent type, addEventListener to document\n else {\n events.add(scope.document, type, listener, { options });\n }\n\n return interact;\n};\n\n/*\\\n * interact.off\n [ method ]\n *\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n - type (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) interact\n \\*/\ninteract.off = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.off(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.off(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n if (!utils.contains(Interactable.eventTypes, type)) {\n events.remove(scope.document, type, listener, options);\n }\n else {\n let index;\n\n if (type in globalEvents\n && (index = utils.indexOf(globalEvents[type], listener)) !== -1) {\n globalEvents[type].splice(index, 1);\n }\n }\n\n return interact;\n};\n\n/*\\\n * interact.debug\n [ method ]\n *\n * Returns an object which exposes internal data\n = (object) An object with properties that outline the current state and expose internal functions and variables\n\\*/\ninteract.debug = function () {\n return scope;\n};\n\n// expose the functions used to calculate multi-touch properties\ninteract.getPointerAverage = utils.pointerAverage;\ninteract.getTouchBBox = utils.touchBBox;\ninteract.getTouchDistance = utils.touchDistance;\ninteract.getTouchAngle = utils.touchAngle;\n\ninteract.getElementRect = utils.getElementRect;\ninteract.getElementClientRect = utils.getElementClientRect;\ninteract.matchesSelector = utils.matchesSelector;\ninteract.closest = utils.closest;\n\n/*\\\n * interact.supportsTouch\n [ method ]\n *\n = (boolean) Whether or not the browser supports touch input\n\\*/\ninteract.supportsTouch = function () {\n return browser.supportsTouch;\n};\n\n/*\\\n * interact.supportsPointerEvent\n [ method ]\n *\n = (boolean) Whether or not the browser supports PointerEvents\n\\*/\ninteract.supportsPointerEvent = function () {\n return browser.supportsPointerEvent;\n};\n\n/*\\\n * interact.stop\n [ method ]\n *\n * Cancels all interactions (end events are not fired)\n *\n - event (Event) An event on which to call preventDefault()\n = (object) interact\n\\*/\ninteract.stop = function (event) {\n for (let i = scope.interactions.length - 1; i >= 0; i--) {\n scope.interactions[i].stop(event);\n }\n\n return interact;\n};\n\n/*\\\n * interact.pointerMoveTolerance\n [ method ]\n * Returns or sets the distance the pointer must be moved before an action\n * sequence occurs. This also affects tolerance for tap events.\n *\n - newValue (number) #optional The movement from the start position must be greater than this value\n = (number | Interactable) The current setting or interact\n\\*/\ninteract.pointerMoveTolerance = function (newValue) {\n if (utils.is.number(newValue)) {\n Interaction.pointerMoveTolerance = newValue;\n\n return this;\n }\n\n return Interaction.pointerMoveTolerance;\n};\n\ninteract.addDocument = scope.addDocument;\ninteract.removeDocument = scope.removeDocument;\n\nscope.interact = interact;\n\nmodule.exports = interact;\n","const Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\nconst scope = require('./scope');\nconst is = require('./utils/is');\nconst events = require('./utils/events');\n\nconst { nodeContains, matchesSelector } = require('./utils/domUtils');\n\n/*\\\n * Interactable.preventDefault\n [ method ]\n *\n * Returns or sets whether to prevent the browser's default behaviour\n * in response to pointer events. Can be set to:\n * - `'always'` to always prevent\n * - `'never'` to never prevent\n * - `'auto'` to let interact.js try to determine what would be best\n *\n - newValue (string) #optional `true`, `false` or `'auto'`\n = (string | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.preventDefault = function (newValue) {\n if (/^(always|never|auto)$/.test(newValue)) {\n this.options.preventDefault = newValue;\n return this;\n }\n\n if (is.bool(newValue)) {\n this.options.preventDefault = newValue? 'always' : 'never';\n return this;\n }\n\n return this.options.preventDefault;\n};\n\nInteractable.prototype.checkAndPreventDefault = function (event) {\n const setting = this.options.preventDefault;\n\n if (setting === 'never') { return; }\n\n if (setting === 'always') {\n event.preventDefault();\n return;\n }\n\n // setting === 'auto'\n\n // don't preventDefault if the browser supports passiveEvents\n // CSS touch-action and user-selecct should be used instead\n if (events.supportsOptions) {\n return;\n }\n\n // don't preventDefault of pointerdown events\n if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) {\n return;\n }\n\n // don't preventDefault on editable elements\n if (is.element(event.target)\n && matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) {\n return;\n }\n\n event.preventDefault();\n};\n\nfunction onInteractionEvent ({ interaction, event }) {\n if (interaction.target) {\n interaction.target.checkAndPreventDefault(event);\n }\n}\n\nfor (const eventSignal of ['down', 'move', 'up', 'cancel']) {\n Interaction.signals.on(eventSignal, onInteractionEvent);\n}\n\n// prevent native HTML5 drag on interact.js target elements\nInteraction.docEvents.dragstart = function preventNativeDrag (event) {\n for (const interaction of scope.interactions) {\n\n if (interaction.element\n && (interaction.element === event.target\n || nodeContains(interaction.element, event.target))) {\n\n interaction.target.checkAndPreventDefault(event);\n return;\n }\n }\n};\n","const scope = require('./scope');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst iFinder = require('./utils/interactionFinder');\nconst pointerEvents = require('./pointerEvents/base');\n\nconst { window } = require('./utils/window');\n\nconst toString = Object.prototype.toString;\n\nif (!window.Array.isArray) {\n window.Array.isArray = function (obj) {\n return toString.call(obj) === '[object Array]';\n };\n}\n\nif (!String.prototype.trim) {\n String.prototype.trim = function () {\n return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n };\n}\n\n// http://www.quirksmode.org/dom/events/click.html\n// >Events leading to dblclick\n//\n// IE8 doesn't fire down event before dblclick.\n// This workaround tries to fire a tap and doubletap after dblclick\nfunction onIE8Dblclick (event) {\n const eventTarget = event.target;\n const interaction = iFinder.search(event, event.type, eventTarget);\n\n if (!interaction) { return; }\n\n if (interaction.prevTap\n && event.clientX === interaction.prevTap.clientX\n && event.clientY === interaction.prevTap.clientY\n && eventTarget === interaction.prevTap.target) {\n\n interaction.downTargets[0] = eventTarget;\n interaction.downTimes [0] = new Date().getTime();\n\n pointerEvents.fire({\n interaction,\n event,\n eventTarget,\n pointer: event,\n type: 'tap',\n });\n }\n}\n\nif (browser.isIE8) {\n const selectFix = function (event) {\n for (const interaction of scope.interactions) {\n if (interaction.interacting()) {\n interaction.target.checkAndPreventDefault(event);\n }\n }\n };\n\n const onDocIE8 = function onDocIE8 ({ doc, win }, signalName) {\n const eventMethod = signalName.indexOf('listen') === 0\n ? events.add : events.remove;\n\n // For IE's lack of Event#preventDefault\n eventMethod(doc, 'selectstart', selectFix);\n\n if (pointerEvents) {\n eventMethod(doc, 'dblclick', onIE8Dblclick);\n }\n };\n\n scope.signals.on('add-document' , onDocIE8);\n scope.signals.on('remove-document', onDocIE8);\n}\n\nmodule.exports = null;\n","const InteractEvent = require('../InteractEvent');\nconst Interaction = require('../Interaction');\nconst extend = require('../utils/extend');\n\nconst modifiers = {\n names: [],\n\n setOffsets: function (arg) {\n const { interaction, pageCoords: page } = arg;\n const { target, element, startOffset } = interaction;\n const rect = target.getRect(element);\n\n if (rect) {\n startOffset.left = page.x - rect.left;\n startOffset.top = page.y - rect.top;\n\n startOffset.right = rect.right - page.x;\n startOffset.bottom = rect.bottom - page.y;\n\n if (!('width' in rect)) { rect.width = rect.right - rect.left; }\n if (!('height' in rect)) { rect.height = rect.bottom - rect.top ; }\n }\n else {\n startOffset.left = startOffset.top = startOffset.right = startOffset.bottom = 0;\n }\n\n arg.rect = rect;\n arg.interactable = target;\n arg.element = element;\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n\n arg.options = target.options[interaction.prepared.name][modifierName];\n\n if (!arg.options) {\n continue;\n }\n\n interaction.modifierOffsets[modifierName] = modifiers[modifierName].setOffset(arg);\n }\n },\n\n setAll: function (arg) {\n const { interaction, statuses, preEnd, requireEndOnly } = arg;\n const coords = extend({}, arg.pageCoords);\n const result = {\n dx: 0,\n dy: 0,\n changed: false,\n locked: false,\n shouldMove: true,\n };\n\n for (const modifierName of modifiers.names) {\n const modifier = modifiers[modifierName];\n const options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!shouldDo(options, preEnd, requireEndOnly)) { continue; }\n\n arg.status = arg.status = statuses[modifierName];\n arg.options = options;\n arg.offset = arg.interaction.modifierOffsets[modifierName];\n\n modifier.set(arg);\n\n if (arg.status.locked) {\n coords.x += arg.status.dx;\n coords.y += arg.status.dy;\n\n result.dx += arg.status.dx;\n result.dy += arg.status.dy;\n\n result.locked = true;\n }\n }\n\n // a move should be fired if:\n // - there are no modifiers enabled,\n // - no modifiers are \"locked\" i.e. have changed the pointer's coordinates, or\n // - the locked coords have changed since the last pointer move\n result.shouldMove = !arg.status || !result.locked || arg.status.changed;\n\n return result;\n },\n\n resetStatuses: function (statuses) {\n for (const modifierName of modifiers.names) {\n const status = statuses[modifierName] || {};\n\n status.dx = status.dy = 0;\n status.modifiedX = status.modifiedY = NaN;\n status.locked = false;\n status.changed = true;\n\n statuses[modifierName] = status;\n }\n\n return statuses;\n },\n\n start: function ({ interaction }, signalName) {\n const arg = {\n interaction,\n pageCoords: (signalName === 'action-resume' ?\n interaction.curCoords : interaction.startCoords).page,\n startOffset: interaction.startOffset,\n statuses: interaction.modifierStatuses,\n preEnd: false,\n requireEndOnly: false,\n };\n\n modifiers.setOffsets(arg);\n modifiers.resetStatuses(arg.statuses);\n\n arg.pageCoords = extend({}, interaction.startCoords.page);\n interaction.modifierResult = modifiers.setAll(arg);\n },\n};\n\nInteraction.signals.on('new', function (interaction) {\n interaction.startOffset = { left: 0, right: 0, top: 0, bottom: 0 };\n interaction.modifierOffsets = {};\n interaction.modifierStatuses = modifiers.resetStatuses({});\n interaction.modifierResult = null;\n});\n\nInteraction.signals.on('action-start' , modifiers.start);\nInteraction.signals.on('action-resume', modifiers.start);\n\nInteraction.signals.on('before-action-move', function ({ interaction, preEnd, interactingBeforeMove }) {\n const modifierResult = modifiers.setAll({\n interaction,\n preEnd,\n pageCoords: interaction.curCoords.page,\n statuses: interaction.modifierStatuses,\n requireEndOnly: false,\n });\n\n // don't fire an action move if a modifier would keep the event in the same\n // cordinates as before\n if (!modifierResult.shouldMove && interactingBeforeMove) {\n interaction._dontFireMove = true;\n }\n\n interaction.modifierResult = modifierResult;\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n for (let i = 0; i < modifiers.names.length; i++) {\n const options = interaction.target.options[interaction.prepared.name][modifiers.names[i]];\n\n // if the endOnly option is true for any modifier\n if (shouldDo(options, true, true)) {\n // fire a move event at the modified coordinates\n interaction.doMove({ event, preEnd: true });\n break;\n }\n }\n});\n\nInteractEvent.signals.on('set-xy', function (arg) {\n const { iEvent, interaction } = arg;\n const modifierArg = extend({}, arg);\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n modifierArg.options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!modifierArg.options) {\n continue;\n }\n\n const modifier = modifiers[modifierName];\n\n modifierArg.status = interaction.modifierStatuses[modifierName];\n\n iEvent[modifierName] = modifier.modifyCoords(modifierArg);\n }\n});\n\nfunction shouldDo (options, preEnd, requireEndOnly) {\n return (options && options.enabled\n && (preEnd || !options.endOnly)\n && (!requireEndOnly || options.endOnly));\n}\n\nmodule.exports = modifiers;\n","const modifiers = require('./index');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst restrict = {\n defaults: {\n enabled : false,\n endOnly : false,\n restriction: null,\n elementRect: null,\n },\n\n setOffset: function ({ rect, startOffset, options }) {\n const elementRect = options && options.elementRect;\n const offset = {};\n\n if (rect && elementRect) {\n offset.left = startOffset.left - (rect.width * elementRect.left);\n offset.top = startOffset.top - (rect.height * elementRect.top);\n\n offset.right = startOffset.right - (rect.width * (1 - elementRect.right));\n offset.bottom = startOffset.bottom - (rect.height * (1 - elementRect.bottom));\n }\n else {\n offset.left = offset.top = offset.right = offset.bottom = 0;\n }\n\n return offset;\n },\n\n set: function ({ pageCoords, interaction, status, options }) {\n if (!options) { return status; }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n\n const restriction = getRestrictionRect(options.restriction, interaction, page);\n\n if (!restriction) { return status; }\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n const rect = restriction;\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n const offset = interaction.modifierOffsets.restrict;\n\n // object is assumed to have\n // x, y, width, height or\n // left, top, right, bottom\n if ('x' in restriction && 'y' in restriction) {\n modifiedX = Math.max(Math.min(rect.x + rect.width - offset.right , page.x), rect.x + offset.left);\n modifiedY = Math.max(Math.min(rect.y + rect.height - offset.bottom, page.y), rect.y + offset.top );\n }\n else {\n modifiedX = Math.max(Math.min(rect.right - offset.right , page.x), rect.left + offset.left);\n modifiedY = Math.max(Math.min(rect.bottom - offset.bottom, page.y), rect.top + offset.top );\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const elementRect = options && options.elementRect;\n\n if (options && options.enabled\n && !(phase === 'start' && elementRect && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n getRestrictionRect,\n};\n\nfunction getRestrictionRect (value, interaction, page) {\n if (utils.is.function(value)) {\n return utils.resolveRectLike(value, interaction.target, interaction.element, [page.x, page.y, interaction]);\n } else {\n return utils.resolveRectLike(value, interaction.target, interaction.element);\n }\n}\n\nmodifiers.restrict = restrict;\nmodifiers.names.push('restrict');\n\ndefaultOptions.perAction.restrict = restrict.defaults;\n\nmodule.exports = restrict;\n","// This module adds the options.resize.restrictEdges setting which sets min and\n// max for the top, left, bottom and right edges of the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictEdges: {\n// inner: { top: 200, left: 200, right: 400, bottom: 400 },\n// outer: { top: 0, left: 0, right: 600, bottom: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst { getRestrictionRect } = require('./restrict');\n\nconst noInner = { top: +Infinity, left: +Infinity, bottom: -Infinity, right: -Infinity };\nconst noOuter = { top: -Infinity, left: -Infinity, bottom: +Infinity, right: +Infinity };\n\nconst restrictEdges = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n offset: null,\n },\n\n setOffset: function ({ interaction, startOffset, options }) {\n if (!options) {\n return utils.extend({}, startOffset);\n }\n\n const offset = getRestrictionRect(options.offset, interaction, interaction.startCoords.page);\n\n if (offset) {\n return {\n top: startOffset.top + offset.y,\n left: startOffset.left + offset.x,\n bottom: startOffset.bottom + offset.y,\n right: startOffset.right + offset.x,\n };\n }\n\n return startOffset;\n },\n\n set: function ({ pageCoords, interaction, status, offset, options }) {\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n const inner = rectUtils.xywhToTlbr(getRestrictionRect(options.inner, interaction, page)) || noInner;\n const outer = rectUtils.xywhToTlbr(getRestrictionRect(options.outer, interaction, page)) || noOuter;\n\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n if (edges.top) {\n modifiedY = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top);\n }\n else if (edges.bottom) {\n modifiedY = Math.max(Math.min(outer.bottom - offset.bottom, page.y), inner.bottom - offset.bottom);\n }\n if (edges.left) {\n modifiedX = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left);\n }\n else if (edges.right) {\n modifiedX = Math.max(Math.min(outer.right - offset.right, page.x), inner.right - offset.right);\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n if (options && options.enabled\n && !(phase === 'start' && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n noInner,\n noOuter,\n getRestrictionRect,\n};\n\nmodifiers.restrictEdges = restrictEdges;\nmodifiers.names.push('restrictEdges');\n\ndefaultOptions.perAction.restrictEdges = restrictEdges.defaults;\nresize.defaults.restrictEdges = restrictEdges.defaults;\n\nmodule.exports = restrictEdges;\n","// This module adds the options.resize.restrictSize setting which sets min and\n// max width and height for the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictSize: {\n// min: { width: -600, height: -600 },\n// max: { width: 600, height: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst restrictEdges = require('./restrictEdges');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst noMin = { width: -Infinity, height: -Infinity };\nconst noMax = { width: +Infinity, height: +Infinity };\n\nconst restrictSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n },\n\n setOffset: function ({ interaction }) {\n return interaction.startOffset;\n },\n\n set: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const rect = rectUtils.xywhToTlbr(interaction.resizeRects.inverted);\n\n const minSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.min, interaction)) || noMin;\n const maxSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.max, interaction)) || noMax;\n\n arg.options = {\n enabled: options.enabled,\n endOnly: options.endOnly,\n inner: utils.extend({}, restrictEdges.noInner),\n outer: utils.extend({}, restrictEdges.noOuter),\n };\n\n if (edges.top) {\n arg.options.inner.top = rect.bottom - minSize.height;\n arg.options.outer.top = rect.bottom - maxSize.height;\n }\n else if (edges.bottom) {\n arg.options.inner.bottom = rect.top + minSize.height;\n arg.options.outer.bottom = rect.top + maxSize.height;\n }\n if (edges.left) {\n arg.options.inner.left = rect.right - minSize.width;\n arg.options.outer.left = rect.right - maxSize.width;\n }\n else if (edges.right) {\n arg.options.inner.right = rect.left + minSize.width;\n arg.options.outer.right = rect.left + maxSize.width;\n }\n\n restrictEdges.set(arg);\n },\n\n modifyCoords: restrictEdges.modifyCoords,\n};\n\nmodifiers.restrictSize = restrictSize;\nmodifiers.names.push('restrictSize');\n\ndefaultOptions.perAction.restrictSize = restrictSize.defaults;\nresize.defaults.restrictSize = restrictSize.defaults;\n\nmodule.exports = restrictSize;\n","const modifiers = require('./index');\nconst interact = require('../interact');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst snap = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n\n relativePoints: null,\n },\n\n setOffset: function ({ interaction, interactable, element, rect, startOffset, options }) {\n const offsets = [];\n const optionsOrigin = utils.rectToXY(utils.resolveRectLike(options.origin));\n const origin = optionsOrigin || utils.getOriginXY(interactable, element, interaction.prepared.name);\n options = options || interactable.options[interaction.prepared.name].snap || {};\n\n let snapOffset;\n\n if (options.offset === 'startCoords') {\n snapOffset = {\n x: interaction.startCoords.page.x - origin.x,\n y: interaction.startCoords.page.y - origin.y,\n };\n }\n else {\n const offsetRect = utils.resolveRectLike(options.offset, interactable, element, [interaction]);\n\n snapOffset = utils.rectToXY(offsetRect) || { x: 0, y: 0 };\n }\n\n if (rect && options.relativePoints && options.relativePoints.length) {\n for (const { x: relativeX, y: relativeY } of options.relativePoints) {\n offsets.push({\n x: startOffset.left - (rect.width * relativeX) + snapOffset.x,\n y: startOffset.top - (rect.height * relativeY) + snapOffset.y,\n });\n }\n }\n else {\n offsets.push(snapOffset);\n }\n\n return offsets;\n },\n\n set: function ({ interaction, pageCoords, status, options, offset: offsets }) {\n const targets = [];\n let target;\n let page;\n let i;\n\n if (status.useStatusXY) {\n page = { x: status.x, y: status.y };\n }\n else {\n const origin = utils.getOriginXY(interaction.target, interaction.element, interaction.prepared.name);\n\n page = utils.extend({}, pageCoords);\n\n page.x -= origin.x;\n page.y -= origin.y;\n }\n\n status.realX = page.x;\n status.realY = page.y;\n\n let len = options.targets? options.targets.length : 0;\n\n for (const { x: offsetX, y: offsetY } of offsets) {\n const relativeX = page.x - offsetX;\n const relativeY = page.y - offsetY;\n\n for (const snapTarget of options.targets) {\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n targets.push({\n x: utils.is.number(target.x) ? (target.x + offsetX) : relativeX,\n y: utils.is.number(target.y) ? (target.y + offsetY) : relativeY,\n\n range: utils.is.number(target.range)? target.range: options.range,\n });\n }\n }\n\n const closest = {\n target: null,\n inRange: false,\n distance: 0,\n range: 0,\n dx: 0,\n dy: 0,\n };\n\n for (i = 0, len = targets.length; i < len; i++) {\n target = targets[i];\n\n const range = target.range;\n const dx = target.x - page.x;\n const dy = target.y - page.y;\n const distance = utils.hypot(dx, dy);\n let inRange = distance <= range;\n\n // Infinite targets count as being out of range\n // compared to non infinite ones that are in range\n if (range === Infinity && closest.inRange && closest.range !== Infinity) {\n inRange = false;\n }\n\n if (!closest.target || (inRange\n // is the closest target in range?\n ? (closest.inRange && range !== Infinity\n // the pointer is relatively deeper in this target\n ? distance / range < closest.distance / closest.range\n // this target has Infinite range and the closest doesn't\n : (range === Infinity && closest.range !== Infinity)\n // OR this target is closer that the previous closest\n || distance < closest.distance)\n // The other is not in range and the pointer is closer to this target\n : (!closest.inRange && distance < closest.distance))) {\n\n closest.target = target;\n closest.distance = distance;\n closest.range = range;\n closest.inRange = inRange;\n closest.dx = dx;\n closest.dy = dy;\n\n status.range = range;\n }\n }\n\n let snapChanged;\n\n if (closest.target) {\n snapChanged = (status.modifiedX !== closest.target.x || status.modifiedY !== closest.target.y);\n\n status.modifiedX = closest.target.x;\n status.modifiedY = closest.target.y;\n }\n else {\n snapChanged = true;\n\n status.modifiedX = NaN;\n status.modifiedY = NaN;\n }\n\n status.dx = closest.dx;\n status.dy = closest.dy;\n\n status.changed = (snapChanged || (closest.inRange && !status.locked));\n status.locked = closest.inRange;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const relativePoints = options && options.relativePoints;\n\n if (options && options.enabled\n && !(phase === 'start' && relativePoints && relativePoints.length)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n }\n\n return {\n range : status.range,\n locked : status.locked,\n x : status.modifiedX,\n y : status.modifiedY,\n realX : status.realX,\n realY : status.realY,\n dx : status.dx,\n dy : status.dy,\n };\n }\n },\n};\n\ninteract.createSnapGrid = function (grid) {\n return function (x, y) {\n const limits = grid.limits || {\n left : -Infinity,\n right : Infinity,\n top : -Infinity,\n bottom: Infinity,\n };\n let offsetX = 0;\n let offsetY = 0;\n\n if (utils.is.object(grid.offset)) {\n offsetX = grid.offset.x;\n offsetY = grid.offset.y;\n }\n\n const gridx = Math.round((x - offsetX) / grid.x);\n const gridy = Math.round((y - offsetY) / grid.y);\n\n const newX = Math.max(limits.left, Math.min(limits.right , gridx * grid.x + offsetX));\n const newY = Math.max(limits.top , Math.min(limits.bottom, gridy * grid.y + offsetY));\n\n return {\n x: newX,\n y: newY,\n range: grid.range,\n };\n };\n};\n\nmodifiers.snap = snap;\nmodifiers.names.push('snap');\n\ndefaultOptions.perAction.snap = snap.defaults;\n\nmodule.exports = snap;\n","// This module allows snapping of the size of targets during resize\n// interactions.\n\nconst modifiers = require('./index');\nconst snap = require('./snap');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\nconst utils = require('../utils/');\n\nconst snapSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n },\n\n setOffset: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.edges;\n\n if (!edges) { return; }\n\n arg.options = {\n relativePoints: [{\n x: edges.left? 0 : 1,\n y: edges.top ? 0 : 1,\n }],\n origin: { x: 0, y: 0 },\n offset: 'self',\n range: options.range,\n };\n\n const offsets = snap.setOffset(arg);\n arg.options = options;\n\n return offsets;\n },\n\n set: function (arg) {\n const { interaction, options, offset, pageCoords } = arg;\n const page = utils.extend({}, pageCoords);\n const relativeX = page.x - offset[0].x;\n const relativeY = page.y - offset[0].y;\n\n arg.options = utils.extend({}, options);\n arg.options.targets = [];\n\n for (const snapTarget of options.targets) {\n let target;\n\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n if ('width' in target && 'height' in target) {\n target.x = target.width;\n target.y = target.height;\n }\n\n arg.options.targets.push(target);\n }\n\n snap.set(arg);\n },\n\n modifyCoords: function (arg) {\n const { options } = arg;\n\n arg.options = utils.extend({}, options);\n arg.options.enabled = options.enabled;\n arg.options.relativePoints = [null];\n\n snap.modifyCoords(arg);\n },\n};\n\nmodifiers.snapSize = snapSize;\nmodifiers.names.push('snapSize');\n\ndefaultOptions.perAction.snapSize = snapSize.defaults;\nresize.defaults.snapSize = snapSize.defaults;\n\nmodule.exports = snapSize;\n","const pointerUtils = require('../utils/pointerUtils');\n\nmodule.exports = class PointerEvent {\n constructor (type, pointer, event, eventTarget, interaction) {\n pointerUtils.pointerExtend(this, event);\n\n if (event !== pointer) {\n pointerUtils.pointerExtend(this, pointer);\n }\n\n this.interaction = interaction;\n\n this.timeStamp = new Date().getTime();\n this.originalEvent = event;\n this.type = type;\n this.pointerId = pointerUtils.getPointerId(pointer);\n this.pointerType = pointerUtils.getPointerType(pointer);\n this.target = eventTarget;\n this.currentTarget = null;\n\n if (type === 'tap') {\n const pointerIndex = interaction.getPointerIndex(pointer);\n this.dt = this.timeStamp - interaction.downTimes[pointerIndex];\n\n const interval = this.timeStamp - interaction.tapTime;\n\n this.double = !!(interaction.prevTap\n && interaction.prevTap.type !== 'doubletap'\n && interaction.prevTap.target === this.target\n && interval < 500);\n }\n else if (type === 'doubletap') {\n this.dt = pointer.timeStamp - interaction.tapTime;\n }\n }\n\n subtractOrigin ({ x: originX, y: originY }) {\n this.pageX -= originX;\n this.pageY -= originY;\n this.clientX -= originX;\n this.clientY -= originY;\n\n return this;\n }\n\n addOrigin ({ x: originX, y: originY }) {\n this.pageX += originX;\n this.pageY += originY;\n this.clientX += originX;\n this.clientY += originY;\n\n return this;\n }\n\n preventDefault () {\n this.originalEvent.preventDefault();\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n};\n","const PointerEvent = require('./PointerEvent');\nconst Interaction = require('../Interaction');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst defaults = require('../defaultOptions');\nconst signals = require('../utils/Signals').new();\nconst { filter } = require('../utils/arr');\n\nconst simpleSignals = [ 'down', 'up', 'cancel' ];\nconst simpleEvents = [ 'down', 'up', 'cancel' ];\n\nconst pointerEvents = {\n PointerEvent,\n fire,\n collectEventTargets,\n signals,\n defaults: {\n holdDuration: 600,\n ignoreFrom : null,\n allowFrom : null,\n origin : { x: 0, y: 0 },\n },\n types: [\n 'down',\n 'move',\n 'up',\n 'cancel',\n 'tap',\n 'doubletap',\n 'hold',\n ],\n};\n\nfunction fire (arg) {\n const {\n interaction, pointer, event, eventTarget,\n type = arg.pointerEvent.type,\n targets = collectEventTargets(arg),\n pointerEvent = new PointerEvent(type, pointer, event, eventTarget, interaction),\n } = arg;\n\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n targets,\n type,\n pointerEvent,\n };\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n\n for (const prop in target.props || {}) {\n pointerEvent[prop] = target.props[prop];\n }\n\n const origin = utils.getOriginXY(target.eventable, target.element);\n\n pointerEvent.subtractOrigin(origin);\n pointerEvent.eventable = target.eventable;\n pointerEvent.currentTarget = target.element;\n\n target.eventable.fire(pointerEvent);\n\n pointerEvent.addOrigin(origin);\n\n if (pointerEvent.immediatePropagationStopped\n || (pointerEvent.propagationStopped\n && (i + 1) < targets.length && targets[i + 1].element !== pointerEvent.currentTarget)) {\n break;\n }\n }\n\n signals.fire('fired', signalArg);\n\n if (type === 'tap') {\n // if pointerEvent should make a double tap, create and fire a doubletap\n // PointerEvent and use that as the prevTap\n const prevTap = pointerEvent.double\n ? fire({\n interaction, pointer, event, eventTarget,\n type: 'doubletap',\n })\n : pointerEvent;\n\n interaction.prevTap = prevTap;\n interaction.tapTime = prevTap.timeStamp;\n }\n\n return pointerEvent;\n}\n\nfunction collectEventTargets ({ interaction, pointer, event, eventTarget, type }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n // do not fire a tap event if the pointer was moved before being lifted\n if (type === 'tap' && (interaction.pointerWasMoved\n // or if the pointerup target is different to the pointerdown target\n || !(interaction.downTargets[pointerIndex] && interaction.downTargets[pointerIndex] === eventTarget))) {\n return [];\n }\n\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n path,\n targets: [],\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (type === 'hold') {\n signalArg.targets = filter(signalArg.targets, target =>\n target.eventable.options.holdDuration === interaction.holdTimers[pointerIndex].duration);\n }\n\n return signalArg.targets;\n}\n\nInteraction.signals.on('update-pointer-down', function ({ interaction, pointerIndex }) {\n interaction.holdTimers[pointerIndex] = { duration: Infinity, timeout: null };\n});\n\nInteraction.signals.on('remove-pointer', function ({ interaction, pointerIndex }) {\n interaction.holdTimers.splice(pointerIndex, 1);\n});\n\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget, duplicateMove }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n if (!duplicateMove && (!interaction.pointerIsDown || interaction.pointerWasMoved)) {\n if (interaction.pointerIsDown) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n\n fire({\n interaction, pointer, event, eventTarget,\n type: 'move',\n });\n }\n});\n\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget, pointerIndex }) {\n // copy event to be used in timeout for IE8\n const eventCopy = browser.isIE8? utils.extend({}, event) : event;\n\n const timer = interaction.holdTimers[pointerIndex];\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'hold',\n targets: [],\n path,\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (!signalArg.targets.length) { return; }\n\n let minDuration = Infinity;\n\n for (let i = 0; i < signalArg.targets.length; i++) {\n const target = signalArg.targets[i];\n const holdDuration = target.eventable.options.holdDuration;\n\n if (holdDuration < minDuration) {\n minDuration = holdDuration;\n }\n }\n\n timer.duration = minDuration;\n timer.timeout = setTimeout(function () {\n fire({\n interaction,\n eventTarget,\n pointer: browser.isIE8? eventCopy : pointer,\n event: eventCopy,\n type: 'hold',\n });\n }, minDuration);\n});\n\nInteraction.signals.on('up', ({ interaction, pointer, event, eventTarget }) => {\n if (!interaction.pointerWasMoved) {\n fire({ interaction, eventTarget, pointer, event, type: 'tap' });\n }\n});\n\n['up', 'cancel'].forEach(function (signalName) {\n Interaction.signals.on(signalName, function ({ interaction, pointerIndex }) {\n if (interaction.holdTimers[pointerIndex]) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n });\n});\n\nfunction createSignalListener (type) {\n return function ({ interaction, pointer, event, eventTarget }) {\n fire({ interaction, eventTarget, pointer, event, type });\n };\n}\n\nfor (let i = 0; i < simpleSignals.length; i++) {\n Interaction.signals.on(simpleSignals[i], createSignalListener(simpleEvents[i]));\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.prevTap = null; // the most recent tap event on this interaction\n interaction.tapTime = 0; // time of the most recent tap event\n interaction.holdTimers = []; // [{ duration, timeout }]\n});\n\ndefaults.pointerEvents = pointerEvents.defaults;\nmodule.exports = pointerEvents;\n","const pointerEvents = require('./base');\nconst Interaction = require('../Interaction');\n\npointerEvents.signals.on('new', onNew);\npointerEvents.signals.on('fired', onFired);\n\nfor (const signal of ['move', 'up', 'cancel', 'endall']) {\n Interaction.signals.on(signal, endHoldRepeat);\n}\n\nfunction onNew ({ pointerEvent }) {\n if (pointerEvent.type !== 'hold') { return; }\n\n pointerEvent.count = (pointerEvent.count || 0) + 1;\n}\n\nfunction onFired ({ interaction, pointerEvent, eventTarget, targets }) {\n if (pointerEvent.type !== 'hold' || !targets.length) { return; }\n\n // get the repeat interval from the first eventable\n const interval = targets[0].eventable.options.holdRepeatInterval;\n\n // don't repeat if the interval is 0 or less\n if (interval <= 0) { return; }\n\n // set a timeout to fire the holdrepeat event\n interaction.holdIntervalHandle = setTimeout(function () {\n pointerEvents.fire({\n interaction,\n eventTarget,\n type: 'hold',\n pointer: pointerEvent,\n event: pointerEvent,\n });\n }, interval);\n}\n\nfunction endHoldRepeat ({ interaction }) {\n // set the interaction's holdStopTime property\n // to stop further holdRepeat events\n if (interaction.holdIntervalHandle) {\n clearInterval(interaction.holdIntervalHandle);\n interaction.holdIntervalHandle = null;\n }\n}\n\n// don't repeat by default\npointerEvents.defaults.holdRepeatInterval = 0;\npointerEvents.types.push('holdrepeat');\n\nmodule.exports = {\n onNew,\n onFired,\n endHoldRepeat,\n};\n","const pointerEvents = require('./base');\nconst Interactable = require('../Interactable');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\nconst scope = require('../scope');\nconst extend = require('../utils/extend');\nconst { merge } = require('../utils/arr');\n\npointerEvents.signals.on('collect-targets', function ({ targets, element, type, eventTarget }) {\n function collectSelectors (interactable, selector, context) {\n const els = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && is.element(element)\n && domUtils.matchesSelector(element, selector, els)\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n const interactable = scope.interactables.get(element);\n\n if (interactable) {\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n scope.interactables.forEachSelector(collectSelectors, element);\n});\n\nInteractable.signals.on('new', function ({ interactable }) {\n interactable.events.getRect = function (element) {\n return interactable.getRect(element);\n };\n});\n\nInteractable.signals.on('set', function ({ interactable, options }) {\n extend(interactable.events.options, pointerEvents.defaults);\n extend(interactable.events.options, options);\n});\n\nmerge(Interactable.eventTypes, pointerEvents.types);\n\nInteractable.prototype.pointerEvents = function (options) {\n extend(this.events.options, options);\n\n return this;\n};\n\nconst __backCompatOption = Interactable.prototype._backCompatOption;\n\nInteractable.prototype._backCompatOption = function (optionName, newValue) {\n const ret = __backCompatOption.call(this, optionName, newValue);\n\n if (ret === this) {\n this.events.options[optionName] = newValue;\n }\n\n return ret;\n};\n\nInteractable.settingsMethods.push('pointerEvents');\n","const utils = require('./utils');\nconst events = require('./utils/events');\nconst signals = require('./utils/Signals').new();\n\nconst scope = {\n signals,\n events,\n utils,\n\n // main document\n document: require('./utils/domObjects').document,\n // all documents being listened to\n documents: [],\n\n addDocument: function (doc, win) {\n // do nothing if document is already known\n if (utils.contains(scope.documents, doc)) { return false; }\n\n win = win || scope.getWindow(doc);\n\n scope.documents.push(doc);\n events.documents.push(doc);\n\n // don't add an unload event for the main document\n // so that the page may be cached in browser history\n if (doc !== scope.document) {\n events.add(win, 'unload', scope.onWindowUnload);\n }\n\n signals.fire('add-document', { doc, win });\n },\n\n removeDocument: function (doc, win) {\n const index = utils.indexOf(scope.documents, doc);\n\n win = win || scope.getWindow(doc);\n\n events.remove(win, 'unload', scope.onWindowUnload);\n\n scope.documents.splice(index, 1);\n events.documents.splice(index, 1);\n\n signals.fire('remove-document', { win, doc });\n },\n\n onWindowUnload: function () {\n scope.removeDocument(this.document, this);\n },\n};\n\nmodule.exports = scope;\n","const { indexOf } = require('./arr');\n\nclass Signals {\n constructor () {\n this.listeners = {\n // signalName: [listeners],\n };\n }\n\n on (name, listener) {\n if (!this.listeners[name]) {\n this.listeners[name] = [listener];\n return;\n }\n\n this.listeners[name].push(listener);\n }\n\n off (name, listener) {\n if (!this.listeners[name]) { return; }\n\n const index = indexOf(this.listeners[name], listener);\n\n if (index !== -1) {\n this.listeners[name].splice(index, 1);\n }\n }\n\n fire (name, arg) {\n const targetListeners = this.listeners[name];\n\n if (!targetListeners) { return; }\n\n for (let i = 0; i < targetListeners.length; i++) {\n if (targetListeners[i](arg, name) === false) {\n return;\n }\n }\n }\n}\n\nSignals.new = function () {\n return new Signals();\n};\n\nmodule.exports = Signals;\n","function indexOf (array, target) {\n for (let i = 0, len = array.length; i < len; i++) {\n if (array[i] === target) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction contains (array, target) {\n return indexOf(array, target) !== -1;\n}\n\nfunction merge (target, source) {\n for (let i = 0; i < source.length; i++) {\n target.push(source[i]);\n }\n\n return target;\n}\n\nfunction filter (array, test) {\n const result = [];\n\n for (let i = 0; i < array.length; i++) {\n if (test(array[i])) {\n result.push(array[i]);\n }\n }\n\n return result;\n}\n\nmodule.exports = {\n indexOf,\n contains,\n merge,\n filter,\n};\n","const { window } = require('./window');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst Element = domObjects.Element;\nconst navigator = window.navigator;\n\nconst browser = {\n // Does the browser support touch input?\n supportsTouch: !!(('ontouchstart' in window) || is.function(window.DocumentTouch)\n && domObjects.document instanceof window.DocumentTouch),\n\n // Does the browser support PointerEvents\n supportsPointerEvent: !!domObjects.PointerEvent,\n\n isIE8: ('attachEvent' in window) && !('addEventListener' in window),\n\n // Opera Mobile must be handled differently\n isOperaMobile: (navigator.appName === 'Opera'\n && browser.supportsTouch\n && navigator.userAgent.match('Presto')),\n\n // scrolling doesn't change the result of getClientRects on iOS 7\n isIOS7: (/iP(hone|od|ad)/.test(navigator.platform)\n && /OS 7[^\\d]/.test(navigator.appVersion)),\n\n isIe9OrOlder: /MSIE (8|9)/.test(navigator.userAgent),\n\n // prefix matchesSelector\n prefixedMatchesSelector: 'matches' in Element.prototype\n ? 'matches': 'webkitMatchesSelector' in Element.prototype\n ? 'webkitMatchesSelector': 'mozMatchesSelector' in Element.prototype\n ? 'mozMatchesSelector': 'oMatchesSelector' in Element.prototype\n ? 'oMatchesSelector': 'msMatchesSelector',\n\n useMatchesSelectorPolyfill: false,\n\n pEventTypes: (domObjects.PointerEvent\n ? (domObjects.PointerEvent === window.MSPointerEvent\n ? {\n up: 'MSPointerUp',\n down: 'MSPointerDown',\n over: 'mouseover',\n out: 'mouseout',\n move: 'MSPointerMove',\n cancel: 'MSPointerCancel',\n }\n : {\n up: 'pointerup',\n down: 'pointerdown',\n over: 'pointerover',\n out: 'pointerout',\n move: 'pointermove',\n cancel: 'pointercancel',\n })\n : null),\n\n // because Webkit and Opera still use 'mousewheel' event type\n wheelEvent: 'onmousewheel' in domObjects.document? 'mousewheel': 'wheel',\n\n};\n\nbrowser.useMatchesSelectorPolyfill = !is.function(Element.prototype[browser.prefixedMatchesSelector]);\n\nmodule.exports = browser;\n","const domObjects = {};\nconst win = require('./window').window;\n\nfunction blank () {}\n\ndomObjects.document = win.document;\ndomObjects.DocumentFragment = win.DocumentFragment || blank;\ndomObjects.SVGElement = win.SVGElement || blank;\ndomObjects.SVGSVGElement = win.SVGSVGElement || blank;\ndomObjects.SVGElementInstance = win.SVGElementInstance || blank;\ndomObjects.Element = win.Element || blank;\ndomObjects.HTMLElement = win.HTMLElement || domObjects.Element;\n\ndomObjects.Event = win.Event;\ndomObjects.Touch = win.Touch || blank;\ndomObjects.PointerEvent = (win.PointerEvent || win.MSPointerEvent);\n\nmodule.exports = domObjects;\n","const win = require('./window');\nconst browser = require('./browser');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst domUtils = {\n nodeContains: function (parent, child) {\n while (child) {\n if (child === parent) {\n return true;\n }\n\n child = child.parentNode;\n }\n\n return false;\n },\n\n closest: function (element, selector) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) { return element; }\n\n element = domUtils.parentNode(element);\n }\n\n return null;\n },\n\n parentNode: function (node) {\n let parent = node.parentNode;\n\n if (is.docFrag(parent)) {\n // skip past #shado-root fragments\n while ((parent = parent.host) && is.docFrag(parent)) {\n continue;\n }\n\n return parent;\n }\n\n return parent;\n },\n\n // taken from http://tanalin.com/en/blog/2012/12/matches-selector-ie8/ and modified\n matchesSelectorPolyfill: browser.useMatchesSelectorPolyfill\n ? function (element, selector, elems) {\n elems = elems || element.parentNode.querySelectorAll(selector);\n\n for (let i = 0, len = elems.length; i < len; i++) {\n if (elems[i] === element) {\n return true;\n }\n }\n\n return false;\n }\n : null,\n\n matchesSelector: function (element, selector, nodeList) {\n if (browser.useMatchesSelectorPolyfill) {\n return domUtils.matchesSelectorPolyfill(element, selector, nodeList);\n }\n\n // remove /deep/ from selectors if shadowDOM polyfill is used\n if (win.window !== win.realWindow) {\n selector = selector.replace(/\\/deep\\//g, ' ');\n }\n\n return element[browser.prefixedMatchesSelector](selector);\n },\n\n // Test for the element that's \"above\" all other qualifiers\n indexOfDeepestElement: function (elements) {\n let deepestZoneParents = [];\n let dropzoneParents = [];\n let dropzone;\n let deepestZone = elements[0];\n let index = deepestZone? 0: -1;\n let parent;\n let child;\n let i;\n let n;\n\n for (i = 1; i < elements.length; i++) {\n dropzone = elements[i];\n\n // an element might belong to multiple selector dropzones\n if (!dropzone || dropzone === deepestZone) {\n continue;\n }\n\n if (!deepestZone) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n // check if the deepest or current are document.documentElement or document.rootElement\n // - if the current dropzone is, do nothing and continue\n if (dropzone.parentNode === dropzone.ownerDocument) {\n continue;\n }\n // - if deepest is, update with the current dropzone and continue to next\n else if (deepestZone.parentNode === dropzone.ownerDocument) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n if (!deepestZoneParents.length) {\n parent = deepestZone;\n while (parent.parentNode && parent.parentNode !== parent.ownerDocument) {\n deepestZoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n }\n\n // if this element is an svg element and the current deepest is\n // an HTMLElement\n if (deepestZone instanceof domObjects.HTMLElement\n && dropzone instanceof domObjects.SVGElement\n && !(dropzone instanceof domObjects.SVGSVGElement)) {\n\n if (dropzone === deepestZone.parentNode) {\n continue;\n }\n\n parent = dropzone.ownerSVGElement;\n }\n else {\n parent = dropzone;\n }\n\n dropzoneParents = [];\n\n while (parent.parentNode !== parent.ownerDocument) {\n dropzoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n\n n = 0;\n\n // get (position of last common ancestor) + 1\n while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) {\n n++;\n }\n\n const parents = [\n dropzoneParents[n - 1],\n dropzoneParents[n],\n deepestZoneParents[n],\n ];\n\n child = parents[0].lastChild;\n\n while (child) {\n if (child === parents[1]) {\n deepestZone = dropzone;\n index = i;\n deepestZoneParents = [];\n\n break;\n }\n else if (child === parents[2]) {\n break;\n }\n\n child = child.previousSibling;\n }\n }\n\n return index;\n },\n\n matchesUpTo: function (element, selector, limit) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) {\n return true;\n }\n\n element = domUtils.parentNode(element);\n\n if (element === limit) {\n return domUtils.matchesSelector(element, selector);\n }\n }\n\n return false;\n },\n\n getActualElement: function (element) {\n return (element instanceof domObjects.SVGElementInstance\n ? element.correspondingUseElement\n : element);\n },\n\n getScrollXY: function (relevantWindow) {\n relevantWindow = relevantWindow || win.window;\n return {\n x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft,\n y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop,\n };\n },\n\n getElementClientRect: function (element) {\n const clientRect = (element instanceof domObjects.SVGElement\n ? element.getBoundingClientRect()\n : element.getClientRects()[0]);\n\n return clientRect && {\n left : clientRect.left,\n right : clientRect.right,\n top : clientRect.top,\n bottom: clientRect.bottom,\n width : clientRect.width || clientRect.right - clientRect.left,\n height: clientRect.height || clientRect.bottom - clientRect.top,\n };\n },\n\n getElementRect: function (element) {\n const clientRect = domUtils.getElementClientRect(element);\n\n if (!browser.isIOS7 && clientRect) {\n const scroll = domUtils.getScrollXY(win.getWindow(element));\n\n clientRect.left += scroll.x;\n clientRect.right += scroll.x;\n clientRect.top += scroll.y;\n clientRect.bottom += scroll.y;\n }\n\n return clientRect;\n },\n\n getPath: function (element) {\n const path = [];\n\n while (element) {\n path.push(element);\n element = domUtils.parentNode(element);\n }\n\n return path;\n },\n\n trySelector: value => {\n if (!is.string(value)) { return false; }\n\n // an exception will be raised if it is invalid\n domObjects.document.querySelector(value);\n return true;\n },\n};\n\nmodule.exports = domUtils;\n","const is = require('./is');\nconst domUtils = require('./domUtils');\nconst pExtend = require('./pointerExtend');\n\nconst { window, getWindow } = require('./window');\nconst { indexOf, contains } = require('./arr');\n\nconst useAttachEvent = ('attachEvent' in window) && !('addEventListener' in window);\nconst addEvent = useAttachEvent? 'attachEvent': 'addEventListener';\nconst removeEvent = useAttachEvent? 'detachEvent': 'removeEventListener';\nconst on = useAttachEvent? 'on': '';\n\nconst elements = [];\nconst targets = [];\nconst attachedListeners = [];\n\n// {\n// type: {\n// selectors: ['selector', ...],\n// contexts : [document, ...],\n// listeners: [[listener, capture, passive], ...]\n// }\n// }\nconst delegatedEvents = {};\n\nconst documents = [];\n\nconst supportsOptions = !useAttachEvent && (() => {\n let supported = false;\n\n window.document.createElement('div').addEventListener('test', null, {\n get capture () { supported = true; },\n });\n\n return supported;\n})();\n\nfunction add (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n let elementIndex = indexOf(elements, element);\n let target = targets[elementIndex];\n\n if (!target) {\n target = {\n events: {},\n typeCount: 0,\n };\n\n elementIndex = elements.push(element) - 1;\n targets.push(target);\n\n attachedListeners.push(useAttachEvent\n ? {\n supplied: [],\n wrapped : [],\n useCount: [],\n }\n : null);\n }\n\n if (!target.events[type]) {\n target.events[type] = [];\n target.typeCount++;\n }\n\n if (!contains(target.events[type], listener)) {\n let ret;\n\n if (useAttachEvent) {\n const { supplied, wrapped, useCount } = attachedListeners[elementIndex];\n const listenerIndex = indexOf(supplied, listener);\n\n const wrappedListener = wrapped[listenerIndex] || function (event) {\n if (!event.immediatePropagationStopped) {\n event.target = event.srcElement;\n event.currentTarget = element;\n\n event.preventDefault = event.preventDefault || preventDef;\n event.stopPropagation = event.stopPropagation || stopProp;\n event.stopImmediatePropagation = event.stopImmediatePropagation || stopImmProp;\n\n if (/mouse|click/.test(event.type)) {\n event.pageX = event.clientX + getWindow(element).document.documentElement.scrollLeft;\n event.pageY = event.clientY + getWindow(element).document.documentElement.scrollTop;\n }\n\n listener(event);\n }\n };\n\n ret = element[addEvent](on + type, wrappedListener, !!options.capture);\n\n if (listenerIndex === -1) {\n supplied.push(listener);\n wrapped.push(wrappedListener);\n useCount.push(1);\n }\n else {\n useCount[listenerIndex]++;\n }\n }\n else {\n ret = element[addEvent](type, listener, supportsOptions? options : !!options.capture);\n }\n target.events[type].push(listener);\n\n return ret;\n }\n}\n\nfunction remove (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const elementIndex = indexOf(elements, element);\n const target = targets[elementIndex];\n\n if (!target || !target.events) {\n return;\n }\n\n let wrappedListener = listener;\n let listeners;\n let listenerIndex;\n\n if (useAttachEvent) {\n listeners = attachedListeners[elementIndex];\n listenerIndex = indexOf(listeners.supplied, listener);\n wrappedListener = listeners.wrapped[listenerIndex];\n }\n\n if (type === 'all') {\n for (type in target.events) {\n if (target.events.hasOwnProperty(type)) {\n remove(element, type, 'all');\n }\n }\n return;\n }\n\n if (target.events[type]) {\n const len = target.events[type].length;\n\n if (listener === 'all') {\n for (let i = 0; i < len; i++) {\n remove(element, type, target.events[type][i], options);\n }\n return;\n }\n else {\n for (let i = 0; i < len; i++) {\n if (target.events[type][i] === listener) {\n element[removeEvent](on + type, wrappedListener, supportsOptions? options : !!options.capture);\n target.events[type].splice(i, 1);\n\n if (useAttachEvent && listeners) {\n listeners.useCount[listenerIndex]--;\n if (listeners.useCount[listenerIndex] === 0) {\n listeners.supplied.splice(listenerIndex, 1);\n listeners.wrapped.splice(listenerIndex, 1);\n listeners.useCount.splice(listenerIndex, 1);\n }\n }\n\n break;\n }\n }\n }\n\n if (target.events[type] && target.events[type].length === 0) {\n target.events[type] = null;\n target.typeCount--;\n }\n }\n\n if (!target.typeCount) {\n targets.splice(elementIndex, 1);\n elements.splice(elementIndex, 1);\n attachedListeners.splice(elementIndex, 1);\n }\n}\n\nfunction addDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n if (!delegatedEvents[type]) {\n delegatedEvents[type] = {\n selectors: [],\n contexts : [],\n listeners: [],\n };\n\n // add delegate listener functions\n for (let i = 0; i < documents.length; i++) {\n add(documents[i], type, delegateListener);\n add(documents[i], type, delegateUseCapture, true);\n }\n }\n\n const delegated = delegatedEvents[type];\n let index;\n\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n break;\n }\n }\n\n if (index === -1) {\n index = delegated.selectors.length;\n\n delegated.selectors.push(selector);\n delegated.contexts .push(context);\n delegated.listeners.push([]);\n }\n\n // keep listener and capture and passive flags\n delegated.listeners[index].push([listener, !!options.capture, options.passive]);\n}\n\nfunction removeDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const delegated = delegatedEvents[type];\n let matchFound = false;\n let index;\n\n if (!delegated) { return; }\n\n // count from last index of delegated to 0\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n // look for matching selector and context Node\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n\n const listeners = delegated.listeners[index];\n\n // each item of the listeners array is an array: [function, capture, passive]\n for (let i = listeners.length - 1; i >= 0; i--) {\n const [fn, capture, passive] = listeners[i];\n\n // check if the listener functions and capture and passive flags match\n if (fn === listener && capture === !!options.capture && passive === options.passive) {\n // remove the listener from the array of listeners\n listeners.splice(i, 1);\n\n // if all listeners for this interactable have been removed\n // remove the interactable from the delegated arrays\n if (!listeners.length) {\n delegated.selectors.splice(index, 1);\n delegated.contexts .splice(index, 1);\n delegated.listeners.splice(index, 1);\n\n // remove delegate function from context\n remove(context, type, delegateListener);\n remove(context, type, delegateUseCapture, true);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegatedEvents[type] = null;\n }\n }\n\n // only remove one listener\n matchFound = true;\n break;\n }\n }\n\n if (matchFound) { break; }\n }\n }\n}\n\n// bound to the interactable context when a DOM event\n// listener is added to a selector interactable\nfunction delegateListener (event, optionalArg) {\n const options = getOptions(optionalArg);\n const fakeEvent = {};\n const delegated = delegatedEvents[event.type];\n const eventTarget = (domUtils.getActualElement(event.path\n ? event.path[0]\n : event.target));\n let element = eventTarget;\n\n // duplicate the event so that currentTarget can be changed\n pExtend(fakeEvent, event);\n\n fakeEvent.originalEvent = event;\n fakeEvent.preventDefault = preventOriginalDefault;\n\n // climb up document tree looking for selector matches\n while (is.element(element)) {\n for (let i = 0; i < delegated.selectors.length; i++) {\n const selector = delegated.selectors[i];\n const context = delegated.contexts[i];\n\n if (domUtils.matchesSelector(element, selector)\n && domUtils.nodeContains(context, eventTarget)\n && domUtils.nodeContains(context, element)) {\n\n const listeners = delegated.listeners[i];\n\n fakeEvent.currentTarget = element;\n\n for (let j = 0; j < listeners.length; j++) {\n const [fn, capture, passive] = listeners[j];\n\n if (capture === !!options.capture && passive === options.passive) {\n fn(fakeEvent);\n }\n }\n }\n }\n\n element = domUtils.parentNode(element);\n }\n}\n\nfunction delegateUseCapture (event) {\n return delegateListener.call(this, event, true);\n}\n\nfunction preventDef () {\n this.returnValue = false;\n}\n\nfunction preventOriginalDefault () {\n this.originalEvent.preventDefault();\n}\n\nfunction stopProp () {\n this.cancelBubble = true;\n}\n\nfunction stopImmProp () {\n this.cancelBubble = true;\n this.immediatePropagationStopped = true;\n}\n\nfunction getOptions (param) {\n return is.object(param)? param : { capture: param };\n}\n\nmodule.exports = {\n add,\n remove,\n\n addDelegate,\n removeDelegate,\n\n delegateListener,\n delegateUseCapture,\n delegatedEvents,\n documents,\n\n useAttachEvent,\n supportsOptions,\n\n _elements: elements,\n _targets: targets,\n _attachedListeners: attachedListeners,\n};\n","module.exports = function extend (dest, source) {\n for (const prop in source) {\n dest[prop] = source[prop];\n }\n return dest;\n};\n","const {\n resolveRectLike,\n rectToXY,\n} = require('./rect');\n\nmodule.exports = function (target, element, action) {\n const actionOptions = target.options[action];\n const actionOrigin = actionOptions && actionOptions.origin;\n const origin = actionOrigin || target.options.origin;\n\n const originRect = resolveRectLike(origin, target, element, [target && element]);\n\n return rectToXY(originRect) || { x: 0, y: 0 };\n};\n","module.exports = (x, y) => Math.sqrt(x * x + y * y);\n","const extend = require('./extend');\nconst win = require('./window');\n\nconst utils = {\n warnOnce: function (method, message) {\n let warned = false;\n\n return function () {\n if (!warned) {\n win.window.console.warn(message);\n warned = true;\n }\n\n return method.apply(this, arguments);\n };\n },\n\n // http://stackoverflow.com/a/5634528/2280888\n _getQBezierValue: function (t, p1, p2, p3) {\n const iT = 1 - t;\n return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3;\n },\n\n getQuadraticCurvePoint: function (startX, startY, cpX, cpY, endX, endY, position) {\n return {\n x: utils._getQBezierValue(position, startX, cpX, endX),\n y: utils._getQBezierValue(position, startY, cpY, endY),\n };\n },\n\n // http://gizma.com/easing/\n easeOutQuad: function (t, b, c, d) {\n t /= d;\n return -c * t*(t-2) + b;\n },\n\n copyAction: function (dest, src) {\n dest.name = src.name;\n dest.axis = src.axis;\n dest.edges = src.edges;\n\n return dest;\n },\n\n is : require('./is'),\n extend : extend,\n hypot : require('./hypot'),\n getOriginXY: require('./getOriginXY'),\n};\n\nextend(utils, require('./arr'));\nextend(utils, require('./domUtils'));\nextend(utils, require('./pointerUtils'));\nextend(utils, require('./rect'));\n\nmodule.exports = utils;\n","const scope = require('../scope');\nconst utils = require('./index');\n\nconst finder = {\n methodOrder: [ 'simulationResume', 'mouseOrPen', 'hasPointer', 'idle' ],\n\n search: function (pointer, eventType, eventTarget) {\n const pointerType = utils.getPointerType(pointer);\n const pointerId = utils.getPointerId(pointer);\n const details = { pointer, pointerId, pointerType, eventType, eventTarget };\n\n for (const method of finder.methodOrder) {\n const interaction = finder[method](details);\n\n if (interaction) {\n return interaction;\n }\n }\n },\n\n // try to resume simulation with a new pointer\n simulationResume: function ({ pointerType, eventType, eventTarget }) {\n if (!/down|start/i.test(eventType)) {\n return null;\n }\n\n for (const interaction of scope.interactions) {\n let element = eventTarget;\n\n if (interaction.simulation && interaction.simulation.allowResume\n && (interaction.pointerType === pointerType)) {\n while (element) {\n // if the element is the interaction element\n if (element === interaction.element) {\n return interaction;\n }\n element = utils.parentNode(element);\n }\n }\n }\n\n return null;\n },\n\n // if it's a mouse or pen interaction\n mouseOrPen: function ({ pointerId, pointerType, eventType }) {\n if (pointerType !== 'mouse' && pointerType !== 'pen') {\n return null;\n }\n\n let firstNonActive;\n\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType) {\n // if it's a down event, skip interactions with running simulations\n if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; }\n\n // if the interaction is active, return it immediately\n if (interaction.interacting()) {\n return interaction;\n }\n // otherwise save it and look for another active interaction\n else if (!firstNonActive) {\n firstNonActive = interaction;\n }\n }\n }\n\n // if no active mouse interaction was found use the first inactive mouse\n // interaction\n if (firstNonActive) {\n return firstNonActive;\n }\n\n // find any mouse or pen interaction.\n // ignore the interaction if the eventType is a *down, and a simulation\n // is active\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType && !(/down/i.test(eventType) && interaction.simulation)) {\n return interaction;\n }\n }\n\n return null;\n },\n\n // get interaction that has this pointer\n hasPointer: function ({ pointerId }) {\n for (const interaction of scope.interactions) {\n if (utils.contains(interaction.pointerIds, pointerId)) {\n return interaction;\n }\n }\n },\n\n // get first idle interaction with a matching pointerType\n idle: function ({ pointerType }) {\n for (const interaction of scope.interactions) {\n // if there's already a pointer held down\n if (interaction.pointerIds.length === 1) {\n const target = interaction.target;\n // don't add this pointer if there is a target interactable and it\n // isn't gesturable\n if (target && !target.options.gesture.enabled) {\n continue;\n }\n }\n // maximum of 2 pointers per interaction\n else if (interaction.pointerIds.length >= 2) {\n continue;\n }\n\n if (!interaction.interacting() && (pointerType === interaction.pointerType)) {\n return interaction;\n }\n }\n\n return null;\n },\n};\n\nmodule.exports = finder;\n","const win = require('./window');\nconst isWindow = require('./isWindow');\n\nconst is = {\n array : () => {},\n\n window : thing => thing === win.window || isWindow(thing),\n\n docFrag : thing => is.object(thing) && thing.nodeType === 11,\n\n object : thing => !!thing && (typeof thing === 'object'),\n\n function: thing => typeof thing === 'function',\n\n number : thing => typeof thing === 'number' ,\n\n bool : thing => typeof thing === 'boolean' ,\n\n string : thing => typeof thing === 'string' ,\n\n element: thing => {\n if (!thing || (typeof thing !== 'object')) { return false; }\n\n const _window = win.getWindow(thing) || win.window;\n\n return (/object|function/.test(typeof _window.Element)\n ? thing instanceof _window.Element //DOM2\n : thing.nodeType === 1 && typeof thing.nodeName === 'string');\n },\n};\n\nis.array = thing => (is.object(thing)\n && (typeof thing.length !== 'undefined')\n && is.function(thing.splice));\n\nmodule.exports = is;\n","module.exports = (thing) => !!(thing && thing.Window) && (thing instanceof thing.Window);\n","function pointerExtend (dest, source) {\n for (const prop in source) {\n const prefixedPropREs = module.exports.prefixedPropREs;\n let deprecated = false;\n\n // skip deprecated prefixed properties\n for (const vendor in prefixedPropREs) {\n if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) {\n deprecated = true;\n break;\n }\n }\n\n if (!deprecated && typeof source[prop] !== 'function') {\n dest[prop] = source[prop];\n }\n }\n return dest;\n}\n\npointerExtend.prefixedPropREs = {\n webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/,\n};\n\nmodule.exports = pointerExtend;\n","const hypot = require('./hypot');\nconst browser = require('./browser');\nconst dom = require('./domObjects');\nconst domUtils = require('./domUtils');\nconst domObjects = require('./domObjects');\nconst is = require('./is');\nconst pointerExtend = require('./pointerExtend');\n\nconst pointerUtils = {\n copyCoords: function (dest, src) {\n dest.page = dest.page || {};\n dest.page.x = src.page.x;\n dest.page.y = src.page.y;\n\n dest.client = dest.client || {};\n dest.client.x = src.client.x;\n dest.client.y = src.client.y;\n\n dest.timeStamp = src.timeStamp;\n },\n\n setCoordDeltas: function (targetObj, prev, cur) {\n targetObj.page.x = cur.page.x - prev.page.x;\n targetObj.page.y = cur.page.y - prev.page.y;\n targetObj.client.x = cur.client.x - prev.client.x;\n targetObj.client.y = cur.client.y - prev.client.y;\n targetObj.timeStamp = cur.timeStamp - prev.timeStamp;\n\n // set pointer velocity\n const dt = Math.max(targetObj.timeStamp / 1000, 0.001);\n\n targetObj.page.speed = hypot(targetObj.page.x, targetObj.page.y) / dt;\n targetObj.page.vx = targetObj.page.x / dt;\n targetObj.page.vy = targetObj.page.y / dt;\n\n targetObj.client.speed = hypot(targetObj.client.x, targetObj.page.y) / dt;\n targetObj.client.vx = targetObj.client.x / dt;\n targetObj.client.vy = targetObj.client.y / dt;\n },\n\n isNativePointer: function (pointer) {\n return (pointer instanceof dom.Event || pointer instanceof dom.Touch);\n },\n\n // Get specified X/Y coords for mouse or event.touches[0]\n getXY: function (type, pointer, xy) {\n xy = xy || {};\n type = type || 'page';\n\n xy.x = pointer[type + 'X'];\n xy.y = pointer[type + 'Y'];\n\n return xy;\n },\n\n getPageXY: function (pointer, page) {\n page = page || {};\n\n // Opera Mobile handles the viewport and scrolling oddly\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n pointerUtils.getXY('screen', pointer, page);\n\n page.x += window.scrollX;\n page.y += window.scrollY;\n }\n else {\n pointerUtils.getXY('page', pointer, page);\n }\n\n return page;\n },\n\n getClientXY: function (pointer, client) {\n client = client || {};\n\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n // Opera Mobile handles the viewport and scrolling oddly\n pointerUtils.getXY('screen', pointer, client);\n }\n else {\n pointerUtils.getXY('client', pointer, client);\n }\n\n return client;\n },\n\n getPointerId: function (pointer) {\n return is.number(pointer.pointerId)? pointer.pointerId : pointer.identifier;\n },\n\n setCoords: function (targetObj, pointers, timeStamp) {\n const pointer = (pointers.length > 1\n ? pointerUtils.pointerAverage(pointers)\n : pointers[0]);\n\n const tmpXY = {};\n\n pointerUtils.getPageXY(pointer, tmpXY);\n targetObj.page.x = tmpXY.x;\n targetObj.page.y = tmpXY.y;\n\n pointerUtils.getClientXY(pointer, tmpXY);\n targetObj.client.x = tmpXY.x;\n targetObj.client.y = tmpXY.y;\n\n targetObj.timeStamp = is.number(timeStamp) ? timeStamp :new Date().getTime();\n },\n\n pointerExtend: pointerExtend,\n\n getTouchPair: function (event) {\n const touches = [];\n\n // array of touches is supplied\n if (is.array(event)) {\n touches[0] = event[0];\n touches[1] = event[1];\n }\n // an event\n else {\n if (event.type === 'touchend') {\n if (event.touches.length === 1) {\n touches[0] = event.touches[0];\n touches[1] = event.changedTouches[0];\n }\n else if (event.touches.length === 0) {\n touches[0] = event.changedTouches[0];\n touches[1] = event.changedTouches[1];\n }\n }\n else {\n touches[0] = event.touches[0];\n touches[1] = event.touches[1];\n }\n }\n\n return touches;\n },\n\n pointerAverage: function (pointers) {\n const average = {\n pageX : 0,\n pageY : 0,\n clientX: 0,\n clientY: 0,\n screenX: 0,\n screenY: 0,\n };\n\n for (const pointer of pointers) {\n for (const prop in average) {\n average[prop] += pointer[prop];\n }\n }\n for (const prop in average) {\n average[prop] /= pointers.length;\n }\n\n return average;\n },\n\n touchBBox: function (event) {\n if (!event.length && !(event.touches && event.touches.length > 1)) {\n return;\n }\n\n const touches = pointerUtils.getTouchPair(event);\n const minX = Math.min(touches[0].pageX, touches[1].pageX);\n const minY = Math.min(touches[0].pageY, touches[1].pageY);\n const maxX = Math.max(touches[0].pageX, touches[1].pageX);\n const maxY = Math.max(touches[0].pageY, touches[1].pageY);\n\n return {\n x: minX,\n y: minY,\n left: minX,\n top: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n },\n\n touchDistance: function (event, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n\n\n const dx = touches[0][sourceX] - touches[1][sourceX];\n const dy = touches[0][sourceY] - touches[1][sourceY];\n\n return hypot(dx, dy);\n },\n\n touchAngle: function (event, prevAngle, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n const dx = touches[1][sourceX] - touches[0][sourceX];\n const dy = touches[1][sourceY] - touches[0][sourceY];\n const angle = 180 * Math.atan2(dy , dx) / Math.PI;\n\n return angle;\n },\n\n getPointerType: function (pointer) {\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : is.number(pointer.pointerType)\n ? [undefined, undefined,'touch', 'pen', 'mouse'][pointer.pointerType]\n // if the PointerEvent API isn't available, then the \"pointer\" must\n // be either a MouseEvent, TouchEvent, or Touch object\n : /touch/.test(pointer.type) || pointer instanceof domObjects.Touch\n ? 'touch'\n : 'mouse';\n },\n\n // [ event.target, event.currentTarget ]\n getEventTargets: function (event) {\n return [\n domUtils.getActualElement(event.path ? event.path[0] : event.target),\n domUtils.getActualElement(event.currentTarget),\n ];\n },\n};\n\nmodule.exports = pointerUtils;\n","const { window } = require('./window');\n\nconst vendors = ['ms', 'moz', 'webkit', 'o'];\nlet lastTime = 0;\nlet request;\nlet cancel;\n\nfor (let x = 0; x < vendors.length && !window.requestAnimationFrame; x++) {\n request = window[vendors[x] + 'RequestAnimationFrame'];\n cancel = window[vendors[x] +'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n}\n\nif (!request) {\n request = function (callback) {\n const currTime = new Date().getTime();\n const timeToCall = Math.max(0, 16 - (currTime - lastTime));\n const id = setTimeout(function () { callback(currTime + timeToCall); },\n timeToCall);\n\n lastTime = currTime + timeToCall;\n return id;\n };\n}\n\nif (!cancel) {\n cancel = function (id) {\n clearTimeout(id);\n };\n}\n\nmodule.exports = {\n request,\n cancel,\n};\n","const extend = require('./extend');\nconst is = require('./is');\nconst {\n closest,\n parentNode,\n getElementRect,\n} = require('./domUtils');\n\nconst rectUtils = {\n getStringOptionResult: function (value, interactable, element) {\n if (!is.string(value)) {\n return null;\n }\n\n if (value === 'parent') {\n value = parentNode(element);\n }\n else if (value === 'self') {\n value = interactable.getRect(element);\n }\n else {\n value = closest(element, value);\n }\n\n return value;\n },\n\n resolveRectLike: function (value, interactable, element, functionArgs) {\n value = rectUtils.getStringOptionResult(value, interactable, element) || value;\n\n if (is.function(value)) {\n value = value.apply(null, functionArgs);\n }\n\n if (is.element(value)) {\n value = getElementRect(value);\n }\n\n return value;\n },\n\n rectToXY: function (rect) {\n return rect && {\n x: 'x' in rect ? rect.x : rect.left,\n y: 'y' in rect ? rect.y : rect.top,\n };\n },\n\n xywhToTlbr: function (rect) {\n if (rect && !('left' in rect && 'top' in rect)) {\n rect = extend({}, rect);\n\n rect.left = rect.x || 0;\n rect.top = rect.y || 0;\n rect.right = rect.right || (rect.left + rect.width);\n rect.bottom = rect.bottom || (rect.top + rect.height);\n }\n\n return rect;\n },\n\n tlbrToXywh: function (rect) {\n if (rect && !('x' in rect && 'y' in rect)) {\n rect = extend({}, rect);\n\n rect.x = rect.left || 0;\n rect.top = rect.top || 0;\n rect.width = rect.width || (rect.right - rect.x);\n rect.height = rect.height || (rect.bottom - rect.y);\n }\n\n return rect;\n },\n};\n\nmodule.exports = rectUtils;\n","const win = module.exports;\nconst isWindow = require('./isWindow');\n\nfunction init (window) {\n // get wrapped window if using Shadow DOM polyfill\n\n win.realWindow = window;\n\n // create a TextNode\n const el = window.document.createTextNode('');\n\n // check if it's wrapped by a polyfill\n if (el.ownerDocument !== window.document\n && typeof window.wrap === 'function'\n && window.wrap(el) === el) {\n // use wrapped window\n window = window.wrap(window);\n }\n\n win.window = window;\n}\n\nif (typeof window === 'undefined') {\n win.window = undefined;\n win.realWindow = undefined;\n}\nelse {\n init(window);\n}\n\nwin.getWindow = function getWindow (node) {\n if (isWindow(node)) {\n return node;\n }\n\n const rootNode = (node.ownerDocument || node);\n\n return rootNode.defaultView || rootNode.parentWindow || win.window;\n};\n\nwin.init = init;\n"]} \ No newline at end of file diff --git a/package.json b/package.json index 76f3e9969..f39704e99 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "interactjs", - "version": "1.3.0-alpha.3+sha.9595c40", + "version": "1.3.0-alpha.4+sha.7970416", "repository": { "type": "git", "url": "https://github.com/taye/interact.js.git"
- Interactable.on(eventType, listener, [options])⚓➭ + Interactable.on(eventType, listener, [options])⚓➭ @@ -1273,7 +1273,7 @@ Parameters - Interactable.off(eventType, listener, [options])⚓➭ + Interactable.off(eventType, listener, [options])⚓➭ @@ -1339,7 +1339,7 @@ Parameters - Interactable.set(options)⚓➭ + Interactable.set(options)⚓➭ @@ -1399,7 +1399,7 @@ Parameters - Interactable.unset()⚓➭ + Interactable.unset()⚓➭ @@ -1442,7 +1442,7 @@ Interactable.unset() - Interactable.actionChecker([checker])⚓➭ + Interactable.actionChecker([checker])⚓➭ @@ -1542,7 +1542,7 @@ Parameters - Interactable.styleCursor([newValue])⚓➭ + Interactable.styleCursor([newValue])⚓➭ @@ -1605,7 +1605,7 @@ Parameters - interact.maxInteractions([newValue])⚓➭ + interact.maxInteractions([newValue])⚓➭ @@ -1652,7 +1652,7 @@ Parameters - Interactable.preventDefault([newValue])⚓➭ + Interactable.preventDefault([newValue])⚓➭ @@ -1718,7 +1718,7 @@ Parameters - interact(element)⚓➭ + interact(element)⚓➭ @@ -1821,7 +1821,7 @@ Usage - interact.isSet(element)⚓➭ + interact.isSet(element)⚓➭ @@ -1881,7 +1881,7 @@ Parameters - interact.on(type, listener, [options])⚓➭ + interact.on(type, listener, [options])⚓➭ @@ -1948,7 +1948,7 @@ Parameters - interact.off(type, listener, [options])⚓➭ + interact.off(type, listener, [options])⚓➭ @@ -2014,7 +2014,7 @@ Parameters - interact.debug()⚓➭ + interact.debug()⚓➭ @@ -2056,7 +2056,7 @@ interact.debug() - interact.supportsTouch()⚓➭ + interact.supportsTouch()⚓➭ @@ -2097,7 +2097,7 @@ interact.supportsTouch() - interact.supportsPointerEvent()⚓➭ + interact.supportsPointerEvent()⚓➭ @@ -2138,7 +2138,7 @@ interact.supportsPointerEvent() - interact.stop(event)⚓➭ + interact.stop(event)⚓➭ @@ -2198,7 +2198,7 @@ Parameters - interact.pointerMoveTolerance([newValue])⚓➭ + interact.pointerMoveTolerance([newValue])⚓➭ @@ -2261,7 +2261,7 @@ Parameters - Interaction.start(action, target, element)⚓➭ + Interaction.start(action, target, element)⚓➭ @@ -2356,7 +2356,7 @@ Parameters - Interaction.doMove()⚓➭ + Interaction.doMove()⚓➭ @@ -2403,7 +2403,7 @@ Interaction.doMove() - Interaction.end([event])⚓➭ + Interaction.end([event])⚓➭ diff --git a/dist/interact.js b/dist/interact.js index e8ae35c3b..c78a3c751 100644 --- a/dist/interact.js +++ b/dist/interact.js @@ -1,5 +1,5 @@ /** - * interact.js v1.3.0-alpha.3+sha.9595c40 + * interact.js v1.3.0-alpha.4+sha.7970416-dirty * * Copyright (c) 2012-2017 Taye Adeyemi * Open source under the MIT License. @@ -816,6 +816,7 @@ var scope = require('./scope'); var utils = require('./utils'); var events = require('./utils/events'); var browser = require('./utils/browser'); +var domObjects = require('./utils/domObjects'); var finder = require('./utils/interactionFinder'); var signals = require('./utils/Signals').new(); @@ -829,7 +830,9 @@ var prevTouchTime = 0; scope.interactions = []; var Interaction = function () { - function Interaction() { + function Interaction(_ref) { + var pointerType = _ref.pointerType; + _classCallCheck(this, Interaction); this.target = null; // current interactable being interacted with @@ -886,7 +889,7 @@ var Interaction = function () { this.pointerWasMoved = false; this._interacting = false; - this.mouse = false; + this.pointerType = pointerType; signals.fire('new', this); @@ -1130,6 +1133,11 @@ var Interaction = function () { }; Interaction.prototype.getPointerIndex = function getPointerIndex(pointer) { + // mouse and pen interactions may have only one pointer + if (this.pointerType === 'mouse' || this.pointerType === 'pen') { + return 0; + } + return utils.indexOf(this.pointerIds, utils.getPointerId(pointer)); }; @@ -1161,8 +1169,7 @@ var Interaction = function () { }; Interaction.prototype.removePointer = function removePointer(pointer, event) { - var id = utils.getPointerId(pointer); - var index = this.mouse ? 0 : utils.indexOf(this.pointerIds, id); + var index = this.getPointerIndex(pointer); if (index === -1) { return; @@ -1197,6 +1204,8 @@ for (var i = 0, len = methodNames.length; i < len; i++) { function doOnInteractions(method) { return function (event) { + var pointerType = utils.getPointerType(event); + var _utils$getEventTarget = utils.getEventTargets(event), eventTarget = _utils$getEventTarget[0], curEventTarget = _utils$getEventTarget[1]; @@ -1210,7 +1219,7 @@ function doOnInteractions(method) { var pointer = event.changedTouches[_i]; var interaction = finder.search(pointer, event.type, eventTarget); - matches.push([pointer, interaction || new Interaction()]); + matches.push([pointer, interaction || new Interaction({ pointerType: pointerType })]); } } else { var invalidPointer = false; @@ -1218,7 +1227,7 @@ function doOnInteractions(method) { if (!browser.supportsPointerEvent && /mouse/.test(event.type)) { // ignore mouse events while touch interactions are active for (var _i2 = 0; _i2 < scope.interactions.length && !invalidPointer; _i2++) { - invalidPointer = !scope.interactions[_i2].mouse && scope.interactions[_i2].pointerIsDown; + invalidPointer = scope.interactions[_i2].pointerType !== 'mouse' && scope.interactions[_i2].pointerIsDown; } // try to ignore mouse events that are simulated by the browser @@ -1232,11 +1241,7 @@ function doOnInteractions(method) { var _interaction = finder.search(event, event.type, eventTarget); if (!_interaction) { - - _interaction = new Interaction(); - _interaction.mouse = /mouse/i.test(event.pointerType || event.type) - // MSPointerEvent.MSPOINTER_TYPE_MOUSE - || event.pointerType === 4 || !event.pointerType; + _interaction = new Interaction({ pointerType: pointerType }); } matches.push([event, _interaction]); @@ -1244,20 +1249,20 @@ function doOnInteractions(method) { } for (var _iterator = matches, _isArray = Array.isArray(_iterator), _i3 = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { - var _ref; + var _ref2; if (_isArray) { if (_i3 >= _iterator.length) break; - _ref = _iterator[_i3++]; + _ref2 = _iterator[_i3++]; } else { _i3 = _iterator.next(); if (_i3.done) break; - _ref = _i3.value; + _ref2 = _i3.value; } - var _ref2 = _ref, - _pointer = _ref2[0], - _interaction2 = _ref2[1]; + var _ref3 = _ref2, + _pointer = _ref3[0], + _interaction2 = _ref3[1]; _interaction2._updateEventTargets(eventTarget, curEventTarget); _interaction2[method](_pointer, event, eventTarget, curEventTarget); @@ -1277,7 +1282,7 @@ function endAll(event) { var docEvents = {/* 'eventType': listenerFunc */}; var pEventTypes = browser.pEventTypes; -if (scope.PointerEvent) { +if (domObjects.PointerEvent) { docEvents[pEventTypes.down] = listeners.pointerDown; docEvents[pEventTypes.move] = listeners.pointerMove; docEvents[pEventTypes.up] = listeners.pointerUp; @@ -1295,8 +1300,8 @@ if (scope.PointerEvent) { docEvents.blur = endAll; -function onDocSignal(_ref3, signalName) { - var doc = _ref3.doc; +function onDocSignal(_ref4, signalName) { + var doc = _ref4.doc; var eventMethod = signalName.indexOf('add') === 0 ? events.add : events.remove; @@ -1311,14 +1316,14 @@ function onDocSignal(_ref3, signalName) { } } -signals.on('update-pointer-down', function (_ref4) { - var interaction = _ref4.interaction, - pointer = _ref4.pointer, - pointerId = _ref4.pointerId, - pointerIndex = _ref4.pointerIndex, - event = _ref4.event, - eventTarget = _ref4.eventTarget, - down = _ref4.down; +signals.on('update-pointer-down', function (_ref5) { + var interaction = _ref5.interaction, + pointer = _ref5.pointer, + pointerId = _ref5.pointerId, + pointerIndex = _ref5.pointerIndex, + event = _ref5.event, + eventTarget = _ref5.eventTarget, + down = _ref5.down; interaction.pointerIds[pointerIndex] = pointerId; interaction.pointers[pointerIndex] = pointer; @@ -1355,7 +1360,7 @@ scope.endAllInteractions = endAll; module.exports = Interaction; -},{"./scope":34,"./utils":44,"./utils/Signals":35,"./utils/browser":37,"./utils/events":40,"./utils/interactionFinder":45}],6:[function(require,module,exports){ +},{"./scope":34,"./utils":44,"./utils/Signals":35,"./utils/browser":37,"./utils/domObjects":38,"./utils/events":40,"./utils/interactionFinder":45}],6:[function(require,module,exports){ 'use strict'; var Interaction = require('../Interaction'); @@ -5460,7 +5465,7 @@ module.exports = function () { this.originalEvent = event; this.type = type; this.pointerId = pointerUtils.getPointerId(pointer); - this.pointerType = pointerUtils.getPointerType(pointer, interaction); + this.pointerType = pointerUtils.getPointerType(pointer); this.target = eventTarget; this.currentTarget = null; @@ -5758,8 +5763,10 @@ Interaction.signals.on('down', function (_ref6) { timer.duration = minDuration; timer.timeout = setTimeout(function () { fire({ - interaction: interaction, eventCopy: eventCopy, eventTarget: eventTarget, + interaction: interaction, + eventTarget: eventTarget, pointer: browser.isIE8 ? eventCopy : pointer, + event: eventCopy, type: 'hold' }); }, minDuration); @@ -6946,17 +6953,14 @@ module.exports = utils; var scope = require('../scope'); var utils = require('./index'); -var browser = require('./browser'); var finder = { - methodOrder: ['simulationResume', 'mouse', 'hasPointer', 'idle'], + methodOrder: ['simulationResume', 'mouseOrPen', 'hasPointer', 'idle'], search: function search(pointer, eventType, eventTarget) { - var mouseEvent = /mouse/i.test(pointer.pointerType || eventType) - // MSPointerEvent.MSPOINTER_TYPE_MOUSE - || pointer.pointerType === 4; + var pointerType = utils.getPointerType(pointer); var pointerId = utils.getPointerId(pointer); - var details = { pointer: pointer, pointerId: pointerId, mouseEvent: mouseEvent, eventType: eventType, eventTarget: eventTarget }; + var details = { pointer: pointer, pointerId: pointerId, pointerType: pointerType, eventType: eventType, eventTarget: eventTarget }; for (var _iterator = finder.methodOrder, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { var _ref; @@ -6982,7 +6986,7 @@ var finder = { // try to resume simulation with a new pointer simulationResume: function simulationResume(_ref2) { - var mouseEvent = _ref2.mouseEvent, + var pointerType = _ref2.pointerType, eventType = _ref2.eventType, eventTarget = _ref2.eventTarget; @@ -7006,7 +7010,7 @@ var finder = { var element = eventTarget; - if (interaction.simulation && interaction.simulation.allowResume && interaction.mouse === mouseEvent) { + if (interaction.simulation && interaction.simulation.allowResume && interaction.pointerType === pointerType) { while (element) { // if the element is the interaction element if (element === interaction.element) { @@ -7020,13 +7024,13 @@ var finder = { return null; }, - // if it's a mouse interaction - mouse: function mouse(_ref4) { + // if it's a mouse or pen interaction + mouseOrPen: function mouseOrPen(_ref4) { var pointerId = _ref4.pointerId, - mouseEvent = _ref4.mouseEvent, + pointerType = _ref4.pointerType, eventType = _ref4.eventType; - if (!mouseEvent && (browser.supportsTouch || browser.supportsPointerEvent)) { + if (pointerType !== 'mouse' && pointerType !== 'pen') { return null; } @@ -7046,7 +7050,7 @@ var finder = { var interaction = _ref5; - if (interaction.mouse) { + if (interaction.pointerType === pointerType) { // if it's a down event, skip interactions with running simulations if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; @@ -7069,8 +7073,8 @@ var finder = { return firstNonActive; } - // Find any interaction specifically for mouse. - // ignore the interaction if the eventType is a mousedown, and a simulation + // find any mouse or pen interaction. + // ignore the interaction if the eventType is a *down, and a simulation // is active for (var _iterator4 = scope.interactions, _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) { var _ref6; @@ -7086,7 +7090,7 @@ var finder = { var _interaction = _ref6; - if (_interaction.mouse && !(/down/.test(eventType) && _interaction.simulation)) { + if (_interaction.pointerType === pointerType && !(/down/i.test(eventType) && _interaction.simulation)) { return _interaction; } } @@ -7118,9 +7122,9 @@ var finder = { } }, - // get first idle interaction + // get first idle interaction with a matching pointerType idle: function idle(_ref9) { - var mouseEvent = _ref9.mouseEvent; + var pointerType = _ref9.pointerType; for (var _iterator6 = scope.interactions, _isArray6 = Array.isArray(_iterator6), _i6 = 0, _iterator6 = _isArray6 ? _iterator6 : _iterator6[Symbol.iterator]();;) { var _ref10; @@ -7150,7 +7154,7 @@ var finder = { continue; } - if (!interaction.interacting() && mouseEvent === interaction.mouse) { + if (!interaction.interacting() && pointerType === interaction.pointerType) { return interaction; } } @@ -7161,7 +7165,7 @@ var finder = { module.exports = finder; -},{"../scope":34,"./browser":37,"./index":44}],46:[function(require,module,exports){ +},{"../scope":34,"./index":44}],46:[function(require,module,exports){ 'use strict'; var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; @@ -7262,6 +7266,7 @@ var hypot = require('./hypot'); var browser = require('./browser'); var dom = require('./domObjects'); var domUtils = require('./domUtils'); +var domObjects = require('./domObjects'); var is = require('./is'); var pointerExtend = require('./pointerExtend'); @@ -7468,17 +7473,11 @@ var pointerUtils = { return angle; }, - getPointerType: function getPointerType(pointer, interaction) { - // if the PointerEvent API isn't available, then the pointer must be ither - // a MouseEvent or TouchEvent - if (interaction.mouse) { - return 'mouse'; - } - if (!browser.supportsPointerEvent) { - return 'touch'; - } - - return is.string(pointer.pointerType) ? pointer.pointerType : [undefined, undefined, 'touch', 'pen', 'mouse'][pointer.pointerType]; + getPointerType: function getPointerType(pointer) { + return is.string(pointer.pointerType) ? pointer.pointerType : is.number(pointer.pointerType) ? [undefined, undefined, 'touch', 'pen', 'mouse'][pointer.pointerType] + // if the PointerEvent API isn't available, then the "pointer" must + // be either a MouseEvent, TouchEvent, or Touch object + : /touch/.test(pointer.type) || pointer instanceof domObjects.Touch ? 'touch' : 'mouse'; }, // [ event.target, event.currentTarget ] diff --git a/dist/interact.js.map b/dist/interact.js.map index 60832b766..4f3a62ba8 100644 --- a/dist/interact.js.map +++ b/dist/interact.js.map @@ -1 +1 @@ -{"version":3,"sources":["src/header.js","node_modules/browser-pack/_prelude.js","index.js","src/Eventable.js","src/InteractEvent.js","src/Interactable.js","src/Interaction.js","src/actions/base.js","src/actions/drag.js","src/actions/drop.js","src/actions/gesture.js","src/actions/resize.js","src/autoScroll.js","src/autoStart/InteractableMethods.js","src/autoStart/base.js","src/autoStart/delay.js","src/autoStart/drag.js","src/autoStart/gesture.js","src/autoStart/resize.js","src/defaultOptions.js","src/index.js","src/inertia.js","src/interact.js","src/interactablePreventDefault.js","src/legacyBrowsers.js","src/modifiers/index.js","src/modifiers/restrict.js","src/modifiers/restrictEdges.js","src/modifiers/restrictSize.js","src/modifiers/snap.js","src/modifiers/snapSize.js","src/pointerEvents/PointerEvent.js","src/pointerEvents/base.js","src/pointerEvents/holdRepeat.js","src/pointerEvents/interactableTargets.js","src/scope.js","src/utils/Signals.js","src/utils/arr.js","src/utils/browser.js","src/utils/domObjects.js","src/utils/domUtils.js","src/utils/events.js","src/utils/extend.js","src/utils/getOriginXY.js","src/utils/hypot.js","src/utils/index.js","src/utils/interactionFinder.js","src/utils/is.js","src/utils/isWindow.js","src/utils/pointerExtend.js","src/utils/pointerUtils.js","src/utils/raf.js","src/utils/rect.js","src/utils/window.js"],"names":[],"mappings":"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","file":"interact.js","sourceRoot":"","sourcesContent":["/**\n * interact.js v1.3.0-alpha.3+sha.9595c40\n *\n * Copyright (c) 2012-2017 Taye Adeyemi \n * Open source under the MIT License.\n * https://raw.github.com/taye/interact.js/master/LICENSE\n */\n","(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o 150) {\n return null;\n }\n\n let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI;\n const overlap = 22.5;\n\n if (angle < 0) {\n angle += 360;\n }\n\n const left = 135 - overlap <= angle && angle < 225 + overlap;\n const up = 225 - overlap <= angle && angle < 315 + overlap;\n\n const right = !left && (315 - overlap <= angle || angle < 45 + overlap);\n const down = !up && 45 - overlap <= angle && angle < 135 + overlap;\n\n return {\n up,\n down,\n left,\n right,\n angle,\n speed: interaction.prevEvent.speed,\n velocity: {\n x: interaction.prevEvent.velocityX,\n y: interaction.prevEvent.velocityY,\n },\n };\n }\n\n preventDefault () {}\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n}\n\nsignals.on('set-delta', function ({ iEvent, interaction, starting, deltaSource }) {\n const prevEvent = starting? iEvent : interaction.prevEvent;\n\n if (deltaSource === 'client') {\n iEvent.dx = iEvent.clientX - prevEvent.clientX;\n iEvent.dy = iEvent.clientY - prevEvent.clientY;\n }\n else {\n iEvent.dx = iEvent.pageX - prevEvent.pageX;\n iEvent.dy = iEvent.pageY - prevEvent.pageY;\n }\n});\n\nInteractEvent.signals = signals;\n\nmodule.exports = InteractEvent;\n","const is = require('./utils/is');\nconst events = require('./utils/events');\nconst extend = require('./utils/extend');\nconst actions = require('./actions/base');\nconst scope = require('./scope');\nconst Eventable = require('./Eventable');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nconst {\n getElementRect,\n nodeContains,\n trySelector,\n} = require('./utils/domUtils');\nconst { getWindow } = require('./utils/window');\nconst { indexOf, contains } = require('./utils/arr');\nconst { wheelEvent } = require('./utils/browser');\n\n// all set interactables\nscope.interactables = [];\n\n/*\\\n * Interactable\n [ property ]\n **\n * Object type returned by @interact\n\\*/\nclass Interactable {\n constructor (target, options) {\n options = options || {};\n\n this.target = target;\n this.events = new Eventable();\n this._context = options.context || scope.document;\n this._win = getWindow(trySelector(target)? this._context : target);\n this._doc = this._win.document;\n\n signals.fire('new', {\n target,\n options,\n interactable: this,\n win: this._win,\n });\n\n scope.addDocument( this._doc, this._win );\n\n scope.interactables.push(this);\n\n this.set(options);\n }\n\n setOnEvents (action, phases) {\n const onAction = 'on' + action;\n\n if (is.function(phases.onstart) ) { this.events[onAction + 'start' ] = phases.onstart ; }\n if (is.function(phases.onmove) ) { this.events[onAction + 'move' ] = phases.onmove ; }\n if (is.function(phases.onend) ) { this.events[onAction + 'end' ] = phases.onend ; }\n if (is.function(phases.oninertiastart)) { this.events[onAction + 'inertiastart' ] = phases.oninertiastart ; }\n\n return this;\n }\n\n setPerAction (action, options) {\n // for all the default per-action options\n for (const option in options) {\n // if this option exists for this action\n if (option in defaults[action]) {\n // if the option in the options arg is an object value\n if (is.object(options[option])) {\n // duplicate the object\n this.options[action][option] = extend(this.options[action][option] || {}, options[option]);\n\n if (is.object(defaults.perAction[option]) && 'enabled' in defaults.perAction[option]) {\n this.options[action][option].enabled = options[option].enabled === false? false : true;\n }\n }\n else if (is.bool(options[option]) && is.object(defaults.perAction[option])) {\n this.options[action][option].enabled = options[option];\n }\n else if (options[option] !== undefined) {\n // or if it's not undefined, do a plain assignment\n this.options[action][option] = options[option];\n }\n }\n }\n }\n\n /*\\\n * Interactable.getRect\n [ method ]\n *\n * The default function to get an Interactables bounding rect. Can be\n * overridden using @Interactable.rectChecker.\n *\n - element (Element) #optional The element to measure.\n = (object) The object's bounding rectangle.\n o {\n o top : 0,\n o left : 0,\n o bottom: 0,\n o right : 0,\n o width : 0,\n o height: 0\n o }\n \\*/\n getRect (element) {\n element = element || this.target;\n\n if (is.string(this.target) && !(is.element(element))) {\n element = this._context.querySelector(this.target);\n }\n\n return getElementRect(element);\n }\n\n /*\\\n * Interactable.rectChecker\n [ method ]\n *\n * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n - checker (function) #optional A function which returns this Interactable's bounding rectangle. See @Interactable.getRect\n = (function | object) The checker function or this Interactable\n \\*/\n rectChecker (checker) {\n if (is.function(checker)) {\n this.getRect = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.getRect;\n\n return this;\n }\n\n return this.getRect;\n }\n\n _backCompatOption (optionName, newValue) {\n if (trySelector(newValue) || is.object(newValue)) {\n this.options[optionName] = newValue;\n\n for (const action of actions.names) {\n this.options[action][optionName] = newValue;\n }\n\n return this;\n }\n\n return this.options[optionName];\n }\n\n /*\\\n * Interactable.origin\n [ method ]\n *\n * Gets or sets the origin of the Interactable's element. The x and y\n * of the origin will be subtracted from action event coordinates.\n *\n - origin (object | string) #optional An object eg. { x: 0, y: 0 } or string 'parent', 'self' or any CSS selector\n * OR\n - origin (Element) #optional An HTML or SVG Element whose rect will be used\n **\n = (object) The current origin or this Interactable\n \\*/\n origin (newValue) {\n return this._backCompatOption('origin', newValue);\n }\n\n /*\\\n * Interactable.deltaSource\n [ method ]\n *\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n - newValue (string) #optional Use 'client' if you will be scrolling while interacting; Use 'page' if you want autoScroll to work\n = (string | object) The current deltaSource or this Interactable\n \\*/\n deltaSource (newValue) {\n if (newValue === 'page' || newValue === 'client') {\n this.options.deltaSource = newValue;\n\n return this;\n }\n\n return this.options.deltaSource;\n }\n\n /*\\\n * Interactable.context\n [ method ]\n *\n * Gets the selector context Node of the Interactable. The default is `window.document`.\n *\n = (Node) The context Node of this Interactable\n **\n \\*/\n context () {\n return this._context;\n }\n\n inContext (element) {\n return (this._context === element.ownerDocument\n || nodeContains(this._context, element));\n }\n\n /*\\\n * Interactable.fire\n [ method ]\n *\n * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n - iEvent (InteractEvent) The InteractEvent object to be fired on this Interactable\n = (Interactable) this Interactable\n \\*/\n fire (iEvent) {\n this.events.fire(iEvent);\n\n return this;\n }\n\n _onOffMultiple (method, eventType, listener, options) {\n if (is.string(eventType) && eventType.search(' ') !== -1) {\n eventType = eventType.trim().split(/ +/);\n }\n\n if (is.array(eventType)) {\n for (let i = 0; i < eventType.length; i++) {\n this[method](eventType[i], listener, options);\n }\n\n return true;\n }\n\n if (is.object(eventType)) {\n for (const prop in eventType) {\n this[method](prop, eventType[prop], listener);\n }\n\n return true;\n }\n }\n\n /*\\\n * Interactable.on\n [ method ]\n *\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n - eventType (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) This Interactable\n \\*/\n on (eventType, listener, options) {\n if (this._onOffMultiple('on', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.on(eventType, listener);\n }\n // delegated event for selector\n else if (is.string(this.target)) {\n events.addDelegate(this.target, this._context, eventType, listener, options);\n }\n else {\n events.add(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.off\n [ method ]\n *\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n - eventType (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) This Interactable\n \\*/\n off (eventType, listener, options) {\n if (this._onOffMultiple('off', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n // if it is an action event type\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.off(eventType, listener);\n }\n // delegated event\n else if (is.string(this.target)) {\n events.removeDelegate(this.target, this._context, eventType, listener, options);\n }\n // remove listener from this Interatable's element\n else {\n events.remove(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.set\n [ method ]\n *\n * Reset the options of this Interactable\n - options (object) The new settings to apply\n = (object) This Interactable\n \\*/\n set (options) {\n if (!is.object(options)) {\n options = {};\n }\n\n this.options = extend({}, defaults.base);\n\n const perActions = extend({}, defaults.perAction);\n\n for (const actionName in actions.methodDict) {\n const methodName = actions.methodDict[actionName];\n\n this.options[actionName] = extend({}, defaults[actionName]);\n\n this.setPerAction(actionName, perActions);\n\n this[methodName](options[actionName]);\n }\n\n for (const setting of Interactable.settingsMethods) {\n this.options[setting] = defaults.base[setting];\n\n if (setting in options) {\n this[setting](options[setting]);\n }\n }\n\n signals.fire('set', {\n options,\n interactable: this,\n });\n\n return this;\n }\n\n /*\\\n * Interactable.unset\n [ method ]\n *\n * Remove this interactable from the list of interactables and remove\n * it's action capabilities and event listeners\n *\n = (object) @interact\n \\*/\n unset () {\n events.remove(this.target, 'all');\n\n if (is.string(this.target)) {\n // remove delegated events\n for (const type in events.delegatedEvents) {\n const delegated = events.delegatedEvents[type];\n\n if (delegated.selectors[0] === this.target\n && delegated.contexts[0] === this._context) {\n\n delegated.selectors.splice(0, 1);\n delegated.contexts .splice(0, 1);\n delegated.listeners.splice(0, 1);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegated[type] = null;\n }\n }\n\n events.remove(this._context, type, events.delegateListener);\n events.remove(this._context, type, events.delegateUseCapture, true);\n }\n }\n else {\n events.remove(this, 'all');\n }\n\n signals.fire('unset', { interactable: this });\n\n scope.interactables.splice(indexOf(scope.interactables, this), 1);\n\n // Stop related interactions when an Interactable is unset\n for (const interaction of scope.interactions || []) {\n if (interaction.target === this && interaction.interacting()) {\n interaction.stop();\n }\n }\n\n return scope.interact;\n }\n}\n\nscope.interactables.indexOfElement = function indexOfElement (target, context) {\n context = context || scope.document;\n\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n if (interactable.target === target && interactable._context === context) {\n return i;\n }\n }\n return -1;\n};\n\nscope.interactables.get = function interactableGet (element, options, dontCheckInContext) {\n const ret = this[this.indexOfElement(element, options && options.context)];\n\n return ret && (is.string(element) || dontCheckInContext || ret.inContext(element))? ret : null;\n};\n\nscope.interactables.forEachSelector = function (callback, element) {\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n // skip non CSS selector targets and out of context elements\n if (!is.string(interactable.target)\n || (element && !interactable.inContext(element))) {\n continue;\n }\n\n const ret = callback(interactable, interactable.target, interactable._context, i, this);\n\n if (ret !== undefined) {\n return ret;\n }\n }\n};\n\n// all interact.js eventTypes\nInteractable.eventTypes = scope.eventTypes = [];\n\nInteractable.signals = signals;\n\nInteractable.settingsMethods = [ 'deltaSource', 'origin', 'preventDefault', 'rectChecker' ];\n\nmodule.exports = Interactable;\n","const scope = require('./scope');\nconst utils = require('./utils');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst finder = require('./utils/interactionFinder');\nconst signals = require('./utils/Signals').new();\n\nconst listeners = {};\nconst methodNames = [\n 'pointerDown', 'pointerMove', 'pointerUp',\n 'updatePointer', 'removePointer',\n];\n\n// for ignoring browser's simulated mouse events\nlet prevTouchTime = 0;\n\n// all active and idle interactions\nscope.interactions = [];\n\nclass Interaction {\n constructor () {\n this.target = null; // current interactable being interacted with\n this.element = null; // the target element of the interactable\n\n this.prepared = { // action that's ready to be fired on next move event\n name : null,\n axis : null,\n edges: null,\n };\n\n // keep track of added pointers\n this.pointers = [];\n this.pointerIds = [];\n this.downTargets = [];\n this.downTimes = [];\n\n // Previous native pointer move event coordinates\n this.prevCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n // current native pointer move event coordinates\n this.curCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Starting InteractEvent pointer coordinates\n this.startCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Change in coordinates and time of the pointer\n this.pointerDelta = {\n page : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n client : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n timeStamp: 0,\n };\n\n this.downEvent = null; // pointerdown/mousedown/touchstart event\n this.downPointer = {};\n\n this._eventTarget = null;\n this._curEventTarget = null;\n\n this.prevEvent = null; // previous action event\n\n this.pointerIsDown = false;\n this.pointerWasMoved = false;\n this._interacting = false;\n\n this.mouse = false;\n\n signals.fire('new', this);\n\n scope.interactions.push(this);\n }\n\n pointerDown (pointer, event, eventTarget) {\n const pointerIndex = this.updatePointer(pointer, event, true);\n\n signals.fire('down', {\n pointer,\n event,\n eventTarget,\n pointerIndex,\n interaction: this,\n });\n }\n\n /*\\\n * Interaction.start\n [ method ]\n *\n * Start an action with the given Interactable and Element as tartgets. The\n * action must be enabled for the target Interactable and an appropriate number\n * of pointers must be held down - 1 for drag/resize, 2 for gesture.\n *\n * Use it with `interactable.able({ manualStart: false })` to always\n * [start actions manually](https://github.com/taye/interact.js/issues/114)\n *\n - action (object) The action to be performed - drag, resize, etc.\n - target (Interactable) The Interactable to target\n - element (Element) The DOM Element to target\n = (object) interact\n **\n | interact(target)\n | .draggable({\n | // disable the default drag start by down->move\n | manualStart: true\n | })\n | // start dragging after the user holds the pointer down\n | .on('hold', function (event) {\n | var interaction = event.interaction;\n |\n | if (!interaction.interacting()) {\n | interaction.start({ name: 'drag' },\n | event.interactable,\n | event.currentTarget);\n | }\n | });\n \\*/\n start (action, target, element) {\n if (this.interacting()\n || !this.pointerIsDown\n || this.pointerIds.length < (action.name === 'gesture'? 2 : 1)) {\n return;\n }\n\n // if this interaction had been removed after stopping\n // add it back\n if (utils.indexOf(scope.interactions, this) === -1) {\n scope.interactions.push(this);\n }\n\n utils.copyAction(this.prepared, action);\n this.target = target;\n this.element = element;\n\n signals.fire('action-start', {\n interaction: this,\n event: this.downEvent,\n });\n }\n\n pointerMove (pointer, event, eventTarget) {\n if (!this.simulation) {\n this.updatePointer(pointer);\n utils.setCoords(this.curCoords, this.pointers);\n }\n\n const duplicateMove = (this.curCoords.page.x === this.prevCoords.page.x\n && this.curCoords.page.y === this.prevCoords.page.y\n && this.curCoords.client.x === this.prevCoords.client.x\n && this.curCoords.client.y === this.prevCoords.client.y);\n\n let dx;\n let dy;\n\n // register movement greater than pointerMoveTolerance\n if (this.pointerIsDown && !this.pointerWasMoved) {\n dx = this.curCoords.client.x - this.startCoords.client.x;\n dy = this.curCoords.client.y - this.startCoords.client.y;\n\n this.pointerWasMoved = utils.hypot(dx, dy) > Interaction.pointerMoveTolerance;\n }\n\n const signalArg = {\n pointer,\n pointerIndex: this.getPointerIndex(pointer),\n event,\n eventTarget,\n dx,\n dy,\n duplicate: duplicateMove,\n interaction: this,\n interactingBeforeMove: this.interacting(),\n };\n\n if (!duplicateMove) {\n // set pointer coordinate, time changes and speeds\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n }\n\n signals.fire('move', signalArg);\n\n if (!duplicateMove) {\n // if interacting, fire an 'action-move' signal etc\n if (this.interacting()) {\n this.doMove(signalArg);\n }\n\n if (this.pointerWasMoved) {\n utils.copyCoords(this.prevCoords, this.curCoords);\n }\n }\n }\n\n /*\\\n * Interaction.doMove\n [ method ]\n *\n * Force a move of the current action at the same coordinates. Useful if\n * snap/restrict has been changed and you want a movement with the new\n * settings.\n *\n **\n | interact(target)\n | .draggable(true)\n | .on('dragmove', function (event) {\n | if (someCondition) {\n | // change the snap settings\n | event.interactable.draggable({ snap: { targets: [] }});\n | // fire another move event with re-calculated snap\n | event.interaction.doMove();\n | }\n | });\n \\*/\n doMove (signalArg) {\n signalArg = utils.extend({\n pointer: this.pointers[0],\n event: this.prevEvent,\n eventTarget: this._eventTarget,\n interaction: this,\n }, signalArg || {});\n\n signals.fire('before-action-move', signalArg);\n\n if (!this._dontFireMove) {\n signals.fire('action-move', signalArg);\n }\n\n this._dontFireMove = false;\n }\n\n // End interact move events and stop auto-scroll unless simulation is running\n pointerUp (pointer, event, eventTarget, curEventTarget) {\n const pointerIndex = this.getPointerIndex(pointer);\n\n signals.fire(/cancel$/i.test(event.type)? 'cancel' : 'up', {\n pointer,\n pointerIndex,\n event,\n eventTarget,\n curEventTarget,\n interaction: this,\n });\n\n if (!this.simulation) {\n this.end(event);\n }\n\n this.pointerIsDown = false;\n this.removePointer(pointer, event);\n }\n\n /*\\\n * Interaction.end\n [ method ]\n *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n - event (PointerEvent) #optional\n **\n | interact(target)\n | .draggable(true)\n | .on('move', function (event) {\n | if (event.pageX > 1000) {\n | // end the current action\n | event.interaction.end();\n | // stop all further listeners from being called\n | event.stopImmediatePropagation();\n | }\n | });\n \\*/\n end (event) {\n event = event || this.prevEvent;\n\n if (this.interacting()) {\n signals.fire('action-end', {\n event,\n interaction: this,\n });\n }\n\n this.stop();\n }\n\n currentAction () {\n return this._interacting? this.prepared.name: null;\n }\n\n interacting () {\n return this._interacting;\n }\n\n stop () {\n signals.fire('stop', { interaction: this });\n\n if (this._interacting) {\n signals.fire('stop-active', { interaction: this });\n signals.fire('stop-' + this.prepared.name, { interaction: this });\n }\n\n this.target = this.element = null;\n\n this._interacting = false;\n this.prepared.name = this.prevEvent = null;\n }\n\n getPointerIndex (pointer) {\n return utils.indexOf(this.pointerIds, utils.getPointerId(pointer));\n }\n\n updatePointer (pointer, event, down = event && /(down|start)$/i.test(event.type)) {\n const id = utils.getPointerId(pointer);\n let index = this.getPointerIndex(pointer);\n\n if (index === -1) {\n index = this.pointerIds.length;\n this.pointerIds[index] = id;\n }\n\n if (down) {\n signals.fire('update-pointer-down', {\n pointer,\n event,\n down,\n pointerId: id,\n pointerIndex: index,\n interaction: this,\n });\n }\n\n this.pointers[index] = pointer;\n\n return index;\n }\n\n removePointer (pointer, event) {\n const id = utils.getPointerId(pointer);\n const index = this.mouse? 0 : utils.indexOf(this.pointerIds, id);\n\n if (index === -1) { return; }\n\n signals.fire('remove-pointer', {\n pointer,\n event,\n pointerIndex: index,\n interaction: this,\n });\n\n this.pointers .splice(index, 1);\n this.pointerIds .splice(index, 1);\n this.downTargets.splice(index, 1);\n this.downTimes .splice(index, 1);\n }\n\n _updateEventTargets (target, currentTarget) {\n this._eventTarget = target;\n this._curEventTarget = currentTarget;\n }\n}\n\nfor (let i = 0, len = methodNames.length; i < len; i++) {\n const method = methodNames[i];\n\n listeners[method] = doOnInteractions(method);\n}\n\nfunction doOnInteractions (method) {\n return (function (event) {\n const [eventTarget, curEventTarget] = utils.getEventTargets(event);\n const matches = []; // [ [pointer, interaction], ...]\n\n if (browser.supportsTouch && /touch/.test(event.type)) {\n prevTouchTime = new Date().getTime();\n\n for (let i = 0; i < event.changedTouches.length; i++) {\n const pointer = event.changedTouches[i];\n const interaction = finder.search(pointer, event.type, eventTarget);\n\n matches.push([pointer, interaction || new Interaction()]);\n }\n }\n else {\n let invalidPointer = false;\n\n if (!browser.supportsPointerEvent && /mouse/.test(event.type)) {\n // ignore mouse events while touch interactions are active\n for (let i = 0; i < scope.interactions.length && !invalidPointer; i++) {\n invalidPointer = !scope.interactions[i].mouse && scope.interactions[i].pointerIsDown;\n }\n\n // try to ignore mouse events that are simulated by the browser\n // after a touch event\n invalidPointer = invalidPointer\n || (new Date().getTime() - prevTouchTime < 500)\n // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated\n || event.timeStamp === 0;\n }\n\n if (!invalidPointer) {\n let interaction = finder.search(event, event.type, eventTarget);\n\n if (!interaction) {\n\n interaction = new Interaction();\n interaction.mouse = (/mouse/i.test(event.pointerType || event.type)\n // MSPointerEvent.MSPOINTER_TYPE_MOUSE\n || event.pointerType === 4\n || !event.pointerType);\n }\n\n matches.push([event, interaction]);\n }\n }\n\n for (const [pointer, interaction] of matches) {\n interaction._updateEventTargets(eventTarget, curEventTarget);\n interaction[method](pointer, event, eventTarget, curEventTarget);\n }\n });\n}\n\nfunction endAll (event) {\n for (let i = 0; i < scope.interactions.length; i++) {\n const interaction = scope.interactions[i];\n\n interaction.end(event);\n signals.fire('endall', { event, interaction });\n }\n}\n\nconst docEvents = { /* 'eventType': listenerFunc */ };\nconst pEventTypes = browser.pEventTypes;\n\nif (scope.PointerEvent) {\n docEvents[pEventTypes.down ] = listeners.pointerDown;\n docEvents[pEventTypes.move ] = listeners.pointerMove;\n docEvents[pEventTypes.up ] = listeners.pointerUp;\n docEvents[pEventTypes.cancel] = listeners.pointerUp;\n}\nelse {\n docEvents.mousedown = listeners.pointerDown;\n docEvents.mousemove = listeners.pointerMove;\n docEvents.mouseup = listeners.pointerUp;\n\n docEvents.touchstart = listeners.pointerDown;\n docEvents.touchmove = listeners.pointerMove;\n docEvents.touchend = listeners.pointerUp;\n docEvents.touchcancel = listeners.pointerUp;\n}\n\ndocEvents.blur = endAll;\n\nfunction onDocSignal ({ doc }, signalName) {\n const eventMethod = signalName.indexOf('add') === 0\n ? events.add : events.remove;\n\n // delegate event listener\n for (const eventType in scope.delegatedEvents) {\n eventMethod(doc, eventType, events.delegateListener);\n eventMethod(doc, eventType, events.delegateUseCapture, true);\n }\n\n for (const eventType in docEvents) {\n eventMethod(doc, eventType, docEvents[eventType]);\n }\n}\n\nsignals.on('update-pointer-down', ({ interaction, pointer, pointerId, pointerIndex, event, eventTarget, down }) => {\n interaction.pointerIds[pointerIndex] = pointerId;\n interaction.pointers[pointerIndex] = pointer;\n\n if (down) {\n interaction.pointerIsDown = true;\n }\n\n if (!interaction.interacting()) {\n utils.setCoords(interaction.startCoords, interaction.pointers);\n\n utils.copyCoords(interaction.curCoords , interaction.startCoords);\n utils.copyCoords(interaction.prevCoords, interaction.startCoords);\n\n interaction.downEvent = event;\n interaction.downTimes[pointerIndex] = interaction.curCoords.timeStamp;\n interaction.downTargets[pointerIndex] = eventTarget || event && utils.getEventTargets(event)[0];\n interaction.pointerWasMoved = false;\n\n utils.pointerExtend(interaction.downPointer, pointer);\n }\n});\n\nscope.signals.on('add-document' , onDocSignal);\nscope.signals.on('remove-document', onDocSignal);\n\nInteraction.pointerMoveTolerance = 1;\nInteraction.doOnInteractions = doOnInteractions;\nInteraction.endAll = endAll;\nInteraction.signals = signals;\nInteraction.docEvents = docEvents;\n\nscope.endAllInteractions = endAll;\n\nmodule.exports = Interaction;\n","const Interaction = require('../Interaction');\nconst InteractEvent = require('../InteractEvent');\n\nconst actions = {\n firePrepared,\n names: [],\n methodDict: {},\n};\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n interaction._interacting = true;\n firePrepared(interaction, event, 'start');\n});\n\nInteraction.signals.on('action-move', function ({ interaction, event, preEnd }) {\n firePrepared(interaction, event, 'move', preEnd);\n\n // if the action was ended in a listener\n if (!interaction.interacting()) { return false; }\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n firePrepared(interaction, event, 'end');\n});\n\nfunction firePrepared (interaction, event, phase, preEnd) {\n const actionName = interaction.prepared.name;\n\n const newEvent = new InteractEvent(interaction, event, actionName, phase, interaction.element, null, preEnd);\n\n interaction.target.fire(newEvent);\n interaction.prevEvent = newEvent;\n}\n\nmodule.exports = actions;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drag = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n startAxis : 'xy',\n lockAxis : 'xy',\n },\n\n checker: function (pointer, event, interactable) {\n const dragOptions = interactable.options.drag;\n\n return dragOptions.enabled\n ? { name: 'drag', axis: (dragOptions.lockAxis === 'start'\n ? dragOptions.startAxis\n : dragOptions.lockAxis)}\n : null;\n },\n\n getCursor: function () {\n return 'move';\n },\n};\n\nInteraction.signals.on('before-action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n interaction.curCoords.page.y = interaction.startCoords.page.y;\n interaction.curCoords.client.y = interaction.startCoords.client.y;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vx);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vx);\n interaction.pointerDelta.client.vy = 0;\n interaction.pointerDelta.page.vy = 0;\n }\n else if (axis === 'y') {\n interaction.curCoords.page.x = interaction.startCoords.page.x;\n interaction.curCoords.client.x = interaction.startCoords.client.x;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vy);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vy);\n interaction.pointerDelta.client.vx = 0;\n interaction.pointerDelta.page.vx = 0;\n }\n});\n\n// dragmove\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'dragmove') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n iEvent.pageY = interaction.startCoords.page.y;\n iEvent.clientY = interaction.startCoords.client.y;\n iEvent.dy = 0;\n }\n else if (axis === 'y') {\n iEvent.pageX = interaction.startCoords.page.x;\n iEvent.clientX = interaction.startCoords.client.x;\n iEvent.dx = 0;\n }\n});\n\n/*\\\n * Interactable.draggable\n [ method ]\n *\n * Gets or sets whether drag actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of drag events\n | var isDraggable = interact('ul li').draggable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on drag events (object makes the Interactable draggable)\n = (object) This Interactable\n | interact(element).draggable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // the axis in which the first movement must be\n | // for the drag sequence to start\n | // 'xy' by default - any direction\n | startAxis: 'x' || 'y' || 'xy',\n |\n | // 'xy' by default - don't restrict to one axis (move in any direction)\n | // 'x' or 'y' to restrict movement to either axis\n | // 'start' to restrict movement to the axis the drag started in\n | lockAxis: 'x' || 'y' || 'xy' || 'start',\n |\n | // max number of drags that can happen concurrently\n | // with elements of this Interactable. Infinity by default\n | max: Infinity,\n |\n | // max number of drags that can target the same element+Interactable\n | // 1 by default\n | maxPerElement: 2\n | });\n\\*/\nInteractable.prototype.draggable = function (options) {\n if (utils.is.object(options)) {\n this.options.drag.enabled = options.enabled === false? false: true;\n this.setPerAction('drag', options);\n this.setOnEvents('drag', options);\n\n if (/^(xy|x|y|start)$/.test(options.lockAxis)) {\n this.options.drag.lockAxis = options.lockAxis;\n }\n if (/^(xy|x|y)$/.test(options.startAxis)) {\n this.options.drag.startAxis = options.startAxis;\n }\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drag.enabled = options;\n\n if (!options) {\n this.ondragstart = this.ondragstart = this.ondragend = null;\n }\n\n return this;\n }\n\n return this.options.drag;\n};\n\nactions.drag = drag;\nactions.names.push('drag');\nutils.merge(Interactable.eventTypes, [\n 'dragstart',\n 'dragmove',\n 'draginertiastart',\n 'draginertiaresume',\n 'dragend',\n]);\nactions.methodDict.drag = 'draggable';\n\ndefaultOptions.drag = drag.defaults;\n\nmodule.exports = drag;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst scope = require('../scope');\nconst interact = require('../interact');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drop = {\n defaults: {\n enabled: false,\n accept : null,\n overlap: 'pointer',\n },\n};\n\nlet dynamicDrop = false;\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // reset active dropzones\n interaction.activeDrops.dropzones = [];\n interaction.activeDrops.elements = [];\n interaction.activeDrops.rects = [];\n\n interaction.dropEvents = null;\n\n if (!interaction.dynamicDrop) {\n setActiveDrops(interaction, interaction.element);\n }\n\n const dragEvent = interaction.prevEvent;\n const dropEvents = getDropEvents(interaction, event, dragEvent);\n\n if (dropEvents.activate) {\n fireActiveDrops(interaction, dropEvents.activate);\n }\n});\n\nInteractEvent.signals.on('new', function ({ interaction, iEvent, event }) {\n if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { return; }\n\n const draggableElement = interaction.element;\n const dragEvent = iEvent;\n const dropResult = getDrop(dragEvent, event, draggableElement);\n\n interaction.dropTarget = dropResult.dropzone;\n interaction.dropElement = dropResult.element;\n\n interaction.dropEvents = getDropEvents(interaction, event, dragEvent);\n});\n\nInteraction.signals.on('action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n fireDropEvents(interaction, interaction.dropEvents);\n});\n\nInteraction.signals.on('action-end', function ({ interaction }) {\n if (interaction.prepared.name === 'drag') {\n fireDropEvents(interaction, interaction.dropEvents);\n }\n});\n\nInteraction.signals.on('stop-drag', function ({ interaction }) {\n interaction.activeDrops.dropzones =\n interaction.activeDrops.elements =\n interaction.activeDrops.rects =\n interaction.dropEvents = null;\n});\n\nfunction collectDrops (interaction, element) {\n const drops = [];\n const elements = [];\n\n element = element || interaction.element;\n\n // collect all dropzones and their elements which qualify for a drop\n for (const current of scope.interactables) {\n if (!current.options.drop.enabled) { continue; }\n\n const accept = current.options.drop.accept;\n\n // test the draggable element against the dropzone's accept setting\n if ((utils.is.element(accept) && accept !== element)\n || (utils.is.string(accept)\n && !utils.matchesSelector(element, accept))) {\n\n continue;\n }\n\n // query for new elements if necessary\n const dropElements = utils.is.string(current.target)\n ? current._context.querySelectorAll(current.target)\n : [current.target];\n\n for (let i = 0; i < dropElements.length; i++) {\n const currentElement = dropElements[i];\n\n if (currentElement !== element) {\n drops.push(current);\n elements.push(currentElement);\n }\n }\n }\n\n return {\n elements,\n dropzones: drops,\n };\n}\n\nfunction fireActiveDrops (interaction, event) {\n let prevElement;\n\n // loop through all active dropzones and trigger event\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n const current = interaction.activeDrops.dropzones[i];\n const currentElement = interaction.activeDrops.elements [i];\n\n // prevent trigger of duplicate events on same element\n if (currentElement !== prevElement) {\n // set current element as event target\n event.target = currentElement;\n current.fire(event);\n }\n prevElement = currentElement;\n }\n}\n\n// Collect a new set of possible drops and save them in activeDrops.\n// setActiveDrops should always be called when a drag has just started or a\n// drag event happens while dynamicDrop is true\nfunction setActiveDrops (interaction, dragElement) {\n // get dropzones and their elements that could receive the draggable\n const possibleDrops = collectDrops(interaction, dragElement, true);\n\n interaction.activeDrops.dropzones = possibleDrops.dropzones;\n interaction.activeDrops.elements = possibleDrops.elements;\n interaction.activeDrops.rects = [];\n\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n interaction.activeDrops.rects[i] =\n interaction.activeDrops.dropzones[i].getRect(interaction.activeDrops.elements[i]);\n }\n}\n\nfunction getDrop (dragEvent, event, dragElement) {\n const interaction = dragEvent.interaction;\n const validDrops = [];\n\n if (dynamicDrop) {\n setActiveDrops(interaction, dragElement);\n }\n\n // collect all dropzones and their elements which qualify for a drop\n for (let j = 0; j < interaction.activeDrops.dropzones.length; j++) {\n const current = interaction.activeDrops.dropzones[j];\n const currentElement = interaction.activeDrops.elements [j];\n const rect = interaction.activeDrops.rects [j];\n\n validDrops.push(current.dropCheck(dragEvent, event, interaction.target, dragElement, currentElement, rect)\n ? currentElement\n : null);\n }\n\n // get the most appropriate dropzone based on DOM depth and order\n const dropIndex = utils.indexOfDeepestElement(validDrops);\n\n return {\n dropzone: interaction.activeDrops.dropzones[dropIndex] || null,\n element : interaction.activeDrops.elements [dropIndex] || null,\n };\n}\n\nfunction getDropEvents (interaction, pointerEvent, dragEvent) {\n const dropEvents = {\n enter : null,\n leave : null,\n activate : null,\n deactivate: null,\n move : null,\n drop : null,\n };\n\n const tmpl = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n };\n\n if (interaction.dropElement !== interaction.prevDropElement) {\n // if there was a prevDropTarget, create a dragleave event\n if (interaction.prevDropTarget) {\n dropEvents.leave = utils.extend({ type: 'dragleave' }, tmpl);\n\n dragEvent.dragLeave = dropEvents.leave.target = interaction.prevDropElement;\n dragEvent.prevDropzone = dropEvents.leave.dropzone = interaction.prevDropTarget;\n }\n // if the dropTarget is not null, create a dragenter event\n if (interaction.dropTarget) {\n dropEvents.enter = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n type : 'dragenter',\n };\n\n dragEvent.dragEnter = interaction.dropElement;\n dragEvent.dropzone = interaction.dropTarget;\n }\n }\n\n if (dragEvent.type === 'dragend' && interaction.dropTarget) {\n dropEvents.drop = utils.extend({ type: 'drop' }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n dragEvent.relatedTarget = interaction.dropElement;\n }\n if (dragEvent.type === 'dragstart') {\n dropEvents.activate = utils.extend({ type: 'dropactivate' }, tmpl);\n\n dropEvents.activate.target = null;\n dropEvents.activate.dropzone = null;\n }\n if (dragEvent.type === 'dragend') {\n dropEvents.deactivate = utils.extend({ type: 'dropdeactivate' }, tmpl);\n\n dropEvents.deactivate.target = null;\n dropEvents.deactivate.dropzone = null;\n }\n if (dragEvent.type === 'dragmove' && interaction.dropTarget) {\n dropEvents.move = utils.extend({\n dragmove : dragEvent,\n type : 'dropmove',\n }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n }\n\n return dropEvents;\n}\n\nfunction fireDropEvents (interaction, dropEvents) {\n if (dropEvents.leave) { interaction.prevDropTarget.fire(dropEvents.leave); }\n if (dropEvents.move ) { interaction.dropTarget.fire(dropEvents.move ); }\n if (dropEvents.enter) { interaction.dropTarget.fire(dropEvents.enter); }\n if (dropEvents.drop ) { interaction.dropTarget.fire(dropEvents.drop ); }\n if (dropEvents.deactivate) {\n fireActiveDrops(interaction, dropEvents.deactivate);\n }\n\n interaction.prevDropTarget = interaction.dropTarget;\n interaction.prevDropElement = interaction.dropElement;\n}\n\n/*\\\n * Interactable.dropzone\n [ method ]\n *\n * Returns or sets whether elements can be dropped onto this\n * Interactable to trigger drop events\n *\n * Dropzones can receive the following events:\n * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends\n * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone\n * - `dragmove` when a draggable that has entered the dropzone is moved\n * - `drop` when a draggable is dropped into this dropzone\n *\n * Use the `accept` option to allow only elements that match the given CSS\n * selector or element. The value can be:\n *\n * - **an Element** - only that element can be dropped into this dropzone.\n * - **a string**, - the element being dragged must match it as a CSS selector.\n * - **`null`** - accept options is cleared - it accepts any element.\n *\n * Use the `overlap` option to set how drops are checked for. The allowed\n * values are:\n *\n * - `'pointer'`, the pointer must be over the dropzone (default)\n * - `'center'`, the draggable element's center must be over the dropzone\n * - a number from 0-1 which is the `(intersection area) / (draggable area)`.\n * e.g. `0.5` for drop to happen when half of the area of the draggable is\n * over the dropzone\n *\n * Use the `checker` option to specify a function to check if a dragged\n * element is over this Interactable.\n *\n | interact(target)\n | .dropChecker(function(dragEvent, // related dragmove or dragend event\n | event, // TouchEvent/PointerEvent/MouseEvent\n | dropped, // bool result of the default checker\n | dropzone, // dropzone Interactable\n | dropElement, // dropzone elemnt\n | draggable, // draggable Interactable\n | draggableElement) {// draggable element\n |\n | return dropped && event.target.hasAttribute('allow-drop');\n | }\n *\n *\n - options (boolean | object | null) #optional The new value to be set.\n | interact('.drop').dropzone({\n | accept: '.can-drop' || document.getElementById('single-drop'),\n | overlap: 'pointer' || 'center' || zeroToOne\n | }\n = (boolean | object) The current setting or this Interactable\n\\*/\nInteractable.prototype.dropzone = function (options) {\n if (utils.is.object(options)) {\n this.options.drop.enabled = options.enabled === false? false: true;\n\n if (utils.is.function(options.ondrop) ) { this.events.ondrop = options.ondrop ; }\n if (utils.is.function(options.ondropactivate) ) { this.events.ondropactivate = options.ondropactivate ; }\n if (utils.is.function(options.ondropdeactivate)) { this.events.ondropdeactivate = options.ondropdeactivate; }\n if (utils.is.function(options.ondragenter) ) { this.events.ondragenter = options.ondragenter ; }\n if (utils.is.function(options.ondragleave) ) { this.events.ondragleave = options.ondragleave ; }\n if (utils.is.function(options.ondropmove) ) { this.events.ondropmove = options.ondropmove ; }\n\n if (/^(pointer|center)$/.test(options.overlap)) {\n this.options.drop.overlap = options.overlap;\n }\n else if (utils.is.number(options.overlap)) {\n this.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0);\n }\n if ('accept' in options) {\n this.options.drop.accept = options.accept;\n }\n if ('checker' in options) {\n this.options.drop.checker = options.checker;\n }\n\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drop.enabled = options;\n\n if (!options) {\n this.ondragenter = this.ondragleave = this.ondrop\n = this.ondropactivate = this.ondropdeactivate = null;\n }\n\n return this;\n }\n\n return this.options.drop;\n};\n\nInteractable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) {\n let dropped = false;\n\n // if the dropzone has no rect (eg. display: none)\n // call the custom dropChecker or just return false\n if (!(rect = rect || this.getRect(dropElement))) {\n return (this.options.drop.checker\n ? this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement)\n : false);\n }\n\n const dropOverlap = this.options.drop.overlap;\n\n if (dropOverlap === 'pointer') {\n const origin = utils.getOriginXY(draggable, draggableElement, 'drag');\n const page = utils.getPageXY(dragEvent);\n\n page.x += origin.x;\n page.y += origin.y;\n\n const horizontal = (page.x > rect.left) && (page.x < rect.right);\n const vertical = (page.y > rect.top ) && (page.y < rect.bottom);\n\n dropped = horizontal && vertical;\n }\n\n const dragRect = draggable.getRect(draggableElement);\n\n if (dragRect && dropOverlap === 'center') {\n const cx = dragRect.left + dragRect.width / 2;\n const cy = dragRect.top + dragRect.height / 2;\n\n dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom;\n }\n\n if (dragRect && utils.is.number(dropOverlap)) {\n const overlapArea = (Math.max(0, Math.min(rect.right , dragRect.right ) - Math.max(rect.left, dragRect.left))\n * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top , dragRect.top )));\n\n const overlapRatio = overlapArea / (dragRect.width * dragRect.height);\n\n dropped = overlapRatio >= dropOverlap;\n }\n\n if (this.options.drop.checker) {\n dropped = this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement);\n }\n\n return dropped;\n};\n\nInteractable.signals.on('unset', function ({ interactable }) {\n interactable.dropzone(false);\n});\n\nInteractable.settingsMethods.push('dropChecker');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.dropTarget = null; // the dropzone a drag target might be dropped into\n interaction.dropElement = null; // the element at the time of checking\n interaction.prevDropTarget = null; // the dropzone that was recently dragged away from\n interaction.prevDropElement = null; // the element at the time of checking\n interaction.dropEvents = null; // the dropEvents related to the current drag event\n\n interaction.activeDrops = {\n dropzones: [], // the dropzones that are mentioned below\n elements : [], // elements of dropzones that accept the target draggable\n rects : [], // the rects of the elements mentioned above\n };\n\n});\n\nInteraction.signals.on('stop', function ({ interaction }) {\n interaction.dropTarget = interaction.dropElement =\n interaction.prevDropTarget = interaction.prevDropElement = null;\n});\n\n/*\\\n * interact.dynamicDrop\n [ method ]\n *\n * Returns or sets whether the dimensions of dropzone elements are\n * calculated on every dragmove or only on dragstart for the default\n * dropChecker\n *\n - newValue (boolean) #optional True to check on each move. False to check only before start\n = (boolean | interact) The current setting or interact\n\\*/\ninteract.dynamicDrop = function (newValue) {\n if (utils.is.bool(newValue)) {\n //if (dragging && dynamicDrop !== newValue && !newValue) {\n //calcRects(dropzones);\n //}\n\n dynamicDrop = newValue;\n\n return interact;\n }\n return dynamicDrop;\n};\n\nutils.merge(Interactable.eventTypes, [\n 'dragenter',\n 'dragleave',\n 'dropactivate',\n 'dropdeactivate',\n 'dropmove',\n 'drop',\n]);\nactions.methodDict.drop = 'dropzone';\n\ndefaultOptions.drop = drop.defaults;\n\nmodule.exports = drop;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst gesture = {\n defaults: {\n enabled : false,\n origin : null,\n restrict: null,\n },\n\n checker: function (pointer, event, interactable, element, interaction) {\n if (interaction.pointerIds.length >= 2) {\n return { name: 'gesture' };\n }\n\n return null;\n },\n\n getCursor: function () {\n return '';\n },\n};\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturestart') { return; }\n iEvent.ds = 0;\n\n interaction.gesture.startDistance = interaction.gesture.prevDistance = iEvent.distance;\n interaction.gesture.startAngle = interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.scale = 1;\n});\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturemove') { return; }\n\n iEvent.ds = iEvent.scale - interaction.gesture.scale;\n\n interaction.target.fire(iEvent);\n\n interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.prevDistance = iEvent.distance;\n\n if (iEvent.scale !== Infinity\n && iEvent.scale !== null\n && iEvent.scale !== undefined\n && !isNaN(iEvent.scale)) {\n\n interaction.gesture.scale = iEvent.scale;\n }\n});\n\n/*\\\n * Interactable.gesturable\n [ method ]\n *\n * Gets or sets whether multitouch gestures can be performed on the\n * Interactable's element\n *\n = (boolean) Indicates if this can be the target of gesture events\n | var isGestureable = interact(element).gesturable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on gesture events (makes the Interactable gesturable)\n = (object) this Interactable\n | interact(element).gesturable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // limit multiple gestures.\n | // See the explanation in @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n\\*/\nInteractable.prototype.gesturable = function (options) {\n if (utils.is.object(options)) {\n this.options.gesture.enabled = options.enabled === false? false: true;\n this.setPerAction('gesture', options);\n this.setOnEvents('gesture', options);\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.gesture.enabled = options;\n\n if (!options) {\n this.ongesturestart = this.ongesturestart = this.ongestureend = null;\n }\n\n return this;\n }\n\n return this.options.gesture;\n};\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action, event, starting, ending, deltaSource }) {\n if (action !== 'gesture') { return; }\n\n const pointers = interaction.pointers;\n\n iEvent.touches = [pointers[0], pointers[1]];\n\n if (starting) {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = 1;\n iEvent.ds = 0;\n iEvent.angle = utils.touchAngle(pointers, undefined, deltaSource);\n iEvent.da = 0;\n }\n else if (ending || event instanceof InteractEvent) {\n iEvent.distance = interaction.prevEvent.distance;\n iEvent.box = interaction.prevEvent.box;\n iEvent.scale = interaction.prevEvent.scale;\n iEvent.ds = iEvent.scale - 1;\n iEvent.angle = interaction.prevEvent.angle;\n iEvent.da = iEvent.angle - interaction.gesture.startAngle;\n }\n else {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = iEvent.distance / interaction.gesture.startDistance;\n iEvent.angle = utils.touchAngle(pointers, interaction.gesture.prevAngle, deltaSource);\n\n iEvent.ds = iEvent.scale - interaction.gesture.prevScale;\n iEvent.da = iEvent.angle - interaction.gesture.prevAngle;\n }\n});\n\nInteraction.signals.on('new', function (interaction) {\n interaction.gesture = {\n start: { x: 0, y: 0 },\n\n startDistance: 0, // distance between two touches of touchStart\n prevDistance : 0,\n distance : 0,\n\n scale: 1, // gesture.distance / gesture.startDistance\n\n startAngle: 0, // angle of line joining two touches\n prevAngle : 0, // angle of the previous gesture event\n };\n});\n\nactions.gesture = gesture;\nactions.names.push('gesture');\nutils.merge(Interactable.eventTypes, [\n 'gesturestart',\n 'gesturemove',\n 'gestureend',\n]);\nactions.methodDict.gesture = 'gesturable';\n\ndefaultOptions.gesture = gesture.defaults;\n\nmodule.exports = gesture;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\n// Less Precision with touch input\nconst defaultMargin = browser.supportsTouch || browser.supportsPointerEvent? 20: 10;\n\nconst resize = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n square: false,\n preserveAspectRatio: false,\n axis: 'xy',\n\n // use default margin\n margin: NaN,\n\n // object with props left, right, top, bottom which are\n // true/false values to resize when the pointer is over that edge,\n // CSS selectors to match the handles for each direction\n // or the Elements for each handle\n edges: null,\n\n // a value of 'none' will limit the resize rect to a minimum of 0x0\n // 'negate' will alow the rect to have negative width/height\n // 'reposition' will keep the width/height positive by swapping\n // the top and bottom edges and/or swapping the left and right edges\n invert: 'none',\n },\n\n checker: function (pointer, event, interactable, element, interaction, rect) {\n if (!rect) { return null; }\n\n const page = utils.extend({}, interaction.curCoords.page);\n const options = interactable.options;\n\n if (options.resize.enabled) {\n const resizeOptions = options.resize;\n const resizeEdges = { left: false, right: false, top: false, bottom: false };\n\n // if using resize.edges\n if (utils.is.object(resizeOptions.edges)) {\n for (const edge in resizeEdges) {\n resizeEdges[edge] = checkResizeEdge(edge,\n resizeOptions.edges[edge],\n page,\n interaction._eventTarget,\n element,\n rect,\n resizeOptions.margin || defaultMargin);\n }\n\n resizeEdges.left = resizeEdges.left && !resizeEdges.right;\n resizeEdges.top = resizeEdges.top && !resizeEdges.bottom;\n\n if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) {\n return {\n name: 'resize',\n edges: resizeEdges,\n };\n }\n }\n else {\n const right = options.resize.axis !== 'y' && page.x > (rect.right - defaultMargin);\n const bottom = options.resize.axis !== 'x' && page.y > (rect.bottom - defaultMargin);\n\n if (right || bottom) {\n return {\n name: 'resize',\n axes: (right? 'x' : '') + (bottom? 'y' : ''),\n };\n }\n }\n }\n\n return null;\n },\n\n cursors: (browser.isIe9OrOlder ? {\n x : 'e-resize',\n y : 's-resize',\n xy: 'se-resize',\n\n top : 'n-resize',\n left : 'w-resize',\n bottom : 's-resize',\n right : 'e-resize',\n topleft : 'se-resize',\n bottomright: 'se-resize',\n topright : 'ne-resize',\n bottomleft : 'ne-resize',\n } : {\n x : 'ew-resize',\n y : 'ns-resize',\n xy: 'nwse-resize',\n\n top : 'ns-resize',\n left : 'ew-resize',\n bottom : 'ns-resize',\n right : 'ew-resize',\n topleft : 'nwse-resize',\n bottomright: 'nwse-resize',\n topright : 'nesw-resize',\n bottomleft : 'nesw-resize',\n }),\n\n getCursor: function (action) {\n if (action.axis) {\n return resize.cursors[action.name + action.axis];\n }\n else if (action.edges) {\n let cursorKey = '';\n const edgeNames = ['top', 'bottom', 'left', 'right'];\n\n for (let i = 0; i < 4; i++) {\n if (action.edges[edgeNames[i]]) {\n cursorKey += edgeNames[i];\n }\n }\n\n return resize.cursors[cursorKey];\n }\n },\n};\n\n// resizestart\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'resizestart' || !interaction.prepared.edges) {\n return;\n }\n\n const startRect = interaction.target.getRect(interaction.element);\n const resizeOptions = interaction.target.options.resize;\n\n /*\n * When using the `resizable.square` or `resizable.preserveAspectRatio` options, resizing from one edge\n * will affect another. E.g. with `resizable.square`, resizing to make the right edge larger will make\n * the bottom edge larger by the same amount. We call these 'linked' edges. Any linked edges will depend\n * on the active edges and the edge being interacted with.\n */\n if (resizeOptions.square || resizeOptions.preserveAspectRatio) {\n const linkedEdges = utils.extend({}, interaction.prepared.edges);\n\n linkedEdges.top = linkedEdges.top || (linkedEdges.left && !linkedEdges.bottom);\n linkedEdges.left = linkedEdges.left || (linkedEdges.top && !linkedEdges.right );\n linkedEdges.bottom = linkedEdges.bottom || (linkedEdges.right && !linkedEdges.top );\n linkedEdges.right = linkedEdges.right || (linkedEdges.bottom && !linkedEdges.left );\n\n interaction.prepared._linkedEdges = linkedEdges;\n }\n else {\n interaction.prepared._linkedEdges = null;\n }\n\n // if using `resizable.preserveAspectRatio` option, record aspect ratio at the start of the resize\n if (resizeOptions.preserveAspectRatio) {\n interaction.resizeStartAspectRatio = startRect.width / startRect.height;\n }\n\n interaction.resizeRects = {\n start : startRect,\n current : utils.extend({}, startRect),\n inverted : utils.extend({}, startRect),\n previous : utils.extend({}, startRect),\n delta : {\n left: 0, right : 0, width : 0,\n top : 0, bottom: 0, height: 0,\n },\n };\n\n iEvent.rect = interaction.resizeRects.inverted;\n iEvent.deltaRect = interaction.resizeRects.delta;\n});\n\n// resizemove\nInteractEvent.signals.on('new', function ({ iEvent, phase, interaction }) {\n if (phase !== 'move' || !interaction.prepared.edges) { return; }\n\n const resizeOptions = interaction.target.options.resize;\n const invert = resizeOptions.invert;\n const invertible = invert === 'reposition' || invert === 'negate';\n\n let edges = interaction.prepared.edges;\n\n const start = interaction.resizeRects.start;\n const current = interaction.resizeRects.current;\n const inverted = interaction.resizeRects.inverted;\n const delta = interaction.resizeRects.delta;\n const previous = utils.extend(interaction.resizeRects.previous, inverted);\n const originalEdges = edges;\n\n let dx = iEvent.dx;\n let dy = iEvent.dy;\n\n if (resizeOptions.preserveAspectRatio || resizeOptions.square) {\n // `resize.preserveAspectRatio` takes precedence over `resize.square`\n const startAspectRatio = resizeOptions.preserveAspectRatio\n ? interaction.resizeStartAspectRatio\n : 1;\n\n edges = interaction.prepared._linkedEdges;\n\n if ((originalEdges.left && originalEdges.bottom)\n || (originalEdges.right && originalEdges.top)) {\n dy = -dx / startAspectRatio;\n }\n else if (originalEdges.left || originalEdges.right ) { dy = dx / startAspectRatio; }\n else if (originalEdges.top || originalEdges.bottom) { dx = dy * startAspectRatio; }\n }\n\n // update the 'current' rect without modifications\n if (edges.top ) { current.top += dy; }\n if (edges.bottom) { current.bottom += dy; }\n if (edges.left ) { current.left += dx; }\n if (edges.right ) { current.right += dx; }\n\n if (invertible) {\n // if invertible, copy the current rect\n utils.extend(inverted, current);\n\n if (invert === 'reposition') {\n // swap edge values if necessary to keep width/height positive\n let swap;\n\n if (inverted.top > inverted.bottom) {\n swap = inverted.top;\n\n inverted.top = inverted.bottom;\n inverted.bottom = swap;\n }\n if (inverted.left > inverted.right) {\n swap = inverted.left;\n\n inverted.left = inverted.right;\n inverted.right = swap;\n }\n }\n }\n else {\n // if not invertible, restrict to minimum of 0x0 rect\n inverted.top = Math.min(current.top, start.bottom);\n inverted.bottom = Math.max(current.bottom, start.top);\n inverted.left = Math.min(current.left, start.right);\n inverted.right = Math.max(current.right, start.left);\n }\n\n inverted.width = inverted.right - inverted.left;\n inverted.height = inverted.bottom - inverted.top ;\n\n for (const edge in inverted) {\n delta[edge] = inverted[edge] - previous[edge];\n }\n\n iEvent.edges = interaction.prepared.edges;\n iEvent.rect = inverted;\n iEvent.deltaRect = delta;\n});\n\n/*\\\n * Interactable.resizable\n [ method ]\n *\n * Gets or sets whether resize actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of resize elements\n | var isResizeable = interact('input[type=text]').resizable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on resize events (object makes the Interactable resizable)\n = (object) This Interactable\n | interact(element).resizable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | edges: {\n | top : true, // Use pointer coords to check for resize.\n | left : false, // Disable resizing from left edge.\n | bottom: '.resize-s',// Resize if pointer target matches selector\n | right : handleEl // Resize if pointer target is the given Element\n | },\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height are adjusted at a 1:1 ratio.\n | square: false,\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height maintain the aspect ratio they had when resizing started.\n | preserveAspectRatio: false,\n |\n | // a value of 'none' will limit the resize rect to a minimum of 0x0\n | // 'negate' will allow the rect to have negative width/height\n | // 'reposition' will keep the width/height positive by swapping\n | // the top and bottom edges and/or swapping the left and right edges\n | invert: 'none' || 'negate' || 'reposition'\n |\n | // limit multiple resizes.\n | // See the explanation in the @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n \\*/\nInteractable.prototype.resizable = function (options) {\n if (utils.is.object(options)) {\n this.options.resize.enabled = options.enabled === false? false: true;\n this.setPerAction('resize', options);\n this.setOnEvents('resize', options);\n\n if (/^x$|^y$|^xy$/.test(options.axis)) {\n this.options.resize.axis = options.axis;\n }\n else if (options.axis === null) {\n this.options.resize.axis = defaultOptions.resize.axis;\n }\n\n if (utils.is.bool(options.preserveAspectRatio)) {\n this.options.resize.preserveAspectRatio = options.preserveAspectRatio;\n }\n else if (utils.is.bool(options.square)) {\n this.options.resize.square = options.square;\n }\n\n return this;\n }\n if (utils.is.bool(options)) {\n this.options.resize.enabled = options;\n\n if (!options) {\n this.onresizestart = this.onresizestart = this.onresizeend = null;\n }\n\n return this;\n }\n return this.options.resize;\n};\n\nfunction checkResizeEdge (name, value, page, element, interactableElement, rect, margin) {\n // false, '', undefined, null\n if (!value) { return false; }\n\n // true value, use pointer coords and element rect\n if (value === true) {\n // if dimensions are negative, \"switch\" edges\n const width = utils.is.number(rect.width )? rect.width : rect.right - rect.left;\n const height = utils.is.number(rect.height)? rect.height : rect.bottom - rect.top ;\n\n if (width < 0) {\n if (name === 'left' ) { name = 'right'; }\n else if (name === 'right') { name = 'left' ; }\n }\n if (height < 0) {\n if (name === 'top' ) { name = 'bottom'; }\n else if (name === 'bottom') { name = 'top' ; }\n }\n\n if (name === 'left' ) { return page.x < ((width >= 0? rect.left: rect.right ) + margin); }\n if (name === 'top' ) { return page.y < ((height >= 0? rect.top : rect.bottom) + margin); }\n\n if (name === 'right' ) { return page.x > ((width >= 0? rect.right : rect.left) - margin); }\n if (name === 'bottom') { return page.y > ((height >= 0? rect.bottom: rect.top ) - margin); }\n }\n\n // the remaining checks require an element\n if (!utils.is.element(element)) { return false; }\n\n return utils.is.element(value)\n // the value is an element to use as a resize handle\n ? value === element\n // otherwise check if element matches value as selector\n : utils.matchesUpTo(element, value, interactableElement);\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.resizeAxes = 'xy';\n});\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action }) {\n if (action !== 'resize' || !interaction.resizeAxes) { return; }\n\n const options = interaction.target.options;\n\n if (options.resize.square) {\n if (interaction.resizeAxes === 'y') {\n iEvent.dx = iEvent.dy;\n }\n else {\n iEvent.dy = iEvent.dx;\n }\n iEvent.axes = 'xy';\n }\n else {\n iEvent.axes = interaction.resizeAxes;\n\n if (interaction.resizeAxes === 'x') {\n iEvent.dy = 0;\n }\n else if (interaction.resizeAxes === 'y') {\n iEvent.dx = 0;\n }\n }\n});\n\nactions.resize = resize;\nactions.names.push('resize');\nutils.merge(Interactable.eventTypes, [\n 'resizestart',\n 'resizemove',\n 'resizeinertiastart',\n 'resizeinertiaresume',\n 'resizeend',\n]);\nactions.methodDict.resize = 'resizable';\n\ndefaultOptions.resize = resize.defaults;\n\nmodule.exports = resize;\n","const raf = require('./utils/raf');\nconst getWindow = require('./utils/window').getWindow;\nconst is = require('./utils/is');\nconst domUtils = require('./utils/domUtils');\nconst Interaction = require('./Interaction');\nconst defaultOptions = require('./defaultOptions');\n\nconst autoScroll = {\n defaults: {\n enabled : false,\n container: null, // the item that is scrolled (Window or HTMLElement)\n margin : 60,\n speed : 300, // the scroll speed in pixels per second\n },\n\n interaction: null,\n i: null, // the handle returned by window.setInterval\n x: 0, y: 0, // Direction each pulse is to scroll in\n\n isScrolling: false,\n prevTime: 0,\n\n start: function (interaction) {\n autoScroll.isScrolling = true;\n raf.cancel(autoScroll.i);\n\n autoScroll.interaction = interaction;\n autoScroll.prevTime = new Date().getTime();\n autoScroll.i = raf.request(autoScroll.scroll);\n },\n\n stop: function () {\n autoScroll.isScrolling = false;\n raf.cancel(autoScroll.i);\n },\n\n // scroll the window by the values in scroll.x/y\n scroll: function () {\n const options = autoScroll.interaction.target.options[autoScroll.interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(autoScroll.interaction.element);\n const now = new Date().getTime();\n // change in time in seconds\n const dt = (now - autoScroll.prevTime) / 1000;\n // displacement\n const s = options.speed * dt;\n\n if (s >= 1) {\n if (is.window(container)) {\n container.scrollBy(autoScroll.x * s, autoScroll.y * s);\n }\n else if (container) {\n container.scrollLeft += autoScroll.x * s;\n container.scrollTop += autoScroll.y * s;\n }\n\n autoScroll.prevTime = now;\n }\n\n if (autoScroll.isScrolling) {\n raf.cancel(autoScroll.i);\n autoScroll.i = raf.request(autoScroll.scroll);\n }\n },\n check: function (interactable, actionName) {\n const options = interactable.options;\n\n return options[actionName].autoScroll && options[actionName].autoScroll.enabled;\n },\n onInteractionMove: function ({ interaction, pointer }) {\n if (!(interaction.interacting()\n && autoScroll.check(interaction.target, interaction.prepared.name))) {\n return;\n }\n\n if (interaction.simulation) {\n autoScroll.x = autoScroll.y = 0;\n return;\n }\n\n let top;\n let right;\n let bottom;\n let left;\n\n const options = interaction.target.options[interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(interaction.element);\n\n if (is.window(container)) {\n left = pointer.clientX < autoScroll.margin;\n top = pointer.clientY < autoScroll.margin;\n right = pointer.clientX > container.innerWidth - autoScroll.margin;\n bottom = pointer.clientY > container.innerHeight - autoScroll.margin;\n }\n else {\n const rect = domUtils.getElementClientRect(container);\n\n left = pointer.clientX < rect.left + autoScroll.margin;\n top = pointer.clientY < rect.top + autoScroll.margin;\n right = pointer.clientX > rect.right - autoScroll.margin;\n bottom = pointer.clientY > rect.bottom - autoScroll.margin;\n }\n\n autoScroll.x = (right ? 1: left? -1: 0);\n autoScroll.y = (bottom? 1: top? -1: 0);\n\n if (!autoScroll.isScrolling) {\n // set the autoScroll properties to those of the target\n autoScroll.margin = options.margin;\n autoScroll.speed = options.speed;\n\n autoScroll.start(interaction);\n }\n },\n};\n\nInteraction.signals.on('stop-active', function () {\n autoScroll.stop();\n});\n\nInteraction.signals.on('action-move', autoScroll.onInteractionMove);\n\ndefaultOptions.perAction.autoScroll = autoScroll.defaults;\n\nmodule.exports = autoScroll;\n","const Interactable = require('../Interactable');\nconst actions = require('../actions/base');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.ignoreFrom\n [ method ]\n *\n * If the target of the `mousedown`, `pointerdown` or `touchstart`\n * event or any of it's parents match the given CSS selector or\n * Element, no drag/resize/gesture is started.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to not ignore any elements\n = (string | Element | object) The current ignoreFrom value or this Interactable\n **\n | interact(element, { ignoreFrom: document.getElementById('no-action') });\n | // or\n | interact(element).ignoreFrom('input, textarea, a');\n\\*/\nInteractable.prototype.ignoreFrom = function (newValue) {\n return this._backCompatOption('ignoreFrom', newValue);\n};\n\n/*\\\n * Interactable.allowFrom\n [ method ]\n *\n * A drag/resize/gesture is started only If the target of the\n * `mousedown`, `pointerdown` or `touchstart` event or any of it's\n * parents match the given CSS selector or Element.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to allow from any element\n = (string | Element | object) The current allowFrom value or this Interactable\n **\n | interact(element, { allowFrom: document.getElementById('drag-handle') });\n | // or\n | interact(element).allowFrom('.handle');\n\\*/\nInteractable.prototype.allowFrom = function (newValue) {\n return this._backCompatOption('allowFrom', newValue);\n};\n\nInteractable.prototype.testIgnore = function (ignoreFrom, interactableElement, element) {\n if (!ignoreFrom || !is.element(element)) { return false; }\n\n if (is.string(ignoreFrom)) {\n return domUtils.matchesUpTo(element, ignoreFrom, interactableElement);\n }\n else if (is.element(ignoreFrom)) {\n return domUtils.nodeContains(ignoreFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testAllow = function (allowFrom, interactableElement, element) {\n if (!allowFrom) { return true; }\n\n if (!is.element(element)) { return false; }\n\n if (is.string(allowFrom)) {\n return domUtils.matchesUpTo(element, allowFrom, interactableElement);\n }\n else if (is.element(allowFrom)) {\n return domUtils.nodeContains(allowFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testIgnoreAllow = function (options, interactableElement, eventTarget) {\n return (!this.testIgnore(options.ignoreFrom, interactableElement, eventTarget)\n && this.testAllow(options.allowFrom, interactableElement, eventTarget));\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (event.buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\n","const interact = require('../interact');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst actions = require('../actions/base');\nconst defaultOptions = require('../defaultOptions');\nconst browser = require('../utils/browser');\nconst scope = require('../scope');\nconst utils = require('../utils');\nconst signals = require('../utils/Signals').new();\n\nrequire('./InteractableMethods');\n\nconst autoStart = {\n signals,\n withinInteractionLimit,\n // Allow this many interactions to happen simultaneously\n maxInteractions: Infinity,\n defaults: {\n perAction: {\n manualStart: false,\n max: Infinity,\n maxPerElement: 1,\n allowFrom: null,\n ignoreFrom: null,\n },\n },\n setActionDefaults: function (action) {\n utils.extend(action.defaults, autoStart.defaults.perAction);\n },\n};\n\n// set cursor style on mousedown\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget }) {\n if (interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\n// set cursor style on mousemove\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget }) {\n if (!interaction.mouse\n || interaction.pointerIsDown\n || interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\nInteraction.signals.on('move', function (arg) {\n const { interaction, event } = arg;\n\n if (!interaction.pointerIsDown\n || interaction.interacting()\n || !interaction.pointerWasMoved\n || !interaction.prepared.name) {\n return;\n }\n\n signals.fire('before-start', arg);\n\n const target = interaction.target;\n\n if (interaction.prepared.name && target) {\n // check manualStart and interaction limit\n if (target.options[interaction.prepared.name].manualStart\n || !withinInteractionLimit(target, interaction.element, interaction.prepared)) {\n interaction.stop(event);\n }\n else {\n interaction.start(interaction.prepared, target, interaction.element);\n }\n }\n});\n\n// Check if the current target supports the action.\n// If so, return the validated action. Otherwise, return null\nfunction validateAction (action, interactable, element, eventTarget) {\n if (utils.is.object(action)\n && interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget)\n && interactable.options[action.name].enabled\n && withinInteractionLimit(interactable, element, action)) {\n return action;\n }\n\n return null;\n}\n\nfunction validateSelector (interaction, pointer, event, matches, matchElements, eventTarget) {\n for (let i = 0, len = matches.length; i < len; i++) {\n const match = matches[i];\n const matchElement = matchElements[i];\n const action = validateAction(match.getAction(pointer, event, interaction, matchElement),\n match,\n matchElement,\n eventTarget);\n\n if (action) {\n return {\n action,\n target: match,\n element: matchElement,\n };\n }\n }\n\n return {};\n}\n\nfunction getActionInfo (interaction, pointer, event, eventTarget) {\n let matches = [];\n let matchElements = [];\n\n let element = eventTarget;\n let action = null;\n\n function pushMatches (interactable, selector, context) {\n const elements = (browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined);\n\n if (utils.matchesSelector(element, selector, elements)) {\n\n matches.push(interactable);\n matchElements.push(element);\n }\n }\n\n while (utils.is.element(element)) {\n matches = [];\n matchElements = [];\n\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && (action = validateAction(elementInteractable.getAction(pointer, event, interaction, element, eventTarget),\n elementInteractable,\n element,\n eventTarget))\n && !elementInteractable.options[action.name].manualStart) {\n return {\n element,\n action,\n target: elementInteractable,\n };\n }\n else {\n scope.interactables.forEachSelector(pushMatches, element);\n\n const actionInfo = validateSelector(interaction, pointer, event, matches, matchElements, eventTarget);\n\n if (actionInfo.action\n && !actionInfo.target.options[actionInfo.action.name].manualStart) {\n return actionInfo;\n }\n }\n\n element = utils.parentNode(element);\n }\n\n return {};\n}\n\nfunction prepare (interaction, { action, target, element }) {\n action = action || {};\n\n if (interaction.target && interaction.target.options.styleCursor) {\n interaction.target._doc.documentElement.style.cursor = '';\n }\n\n interaction.target = target;\n interaction.element = element;\n utils.copyAction(interaction.prepared, action);\n\n if (target && target.options.styleCursor) {\n const cursor = action? actions[action.name].getCursor(action) : '';\n interaction.target._doc.documentElement.style.cursor = cursor;\n }\n\n signals.fire('prepared', { interaction: interaction });\n}\n\nInteraction.signals.on('stop', function ({ interaction }) {\n const target = interaction.target;\n\n if (target && target.options.styleCursor) {\n target._doc.documentElement.style.cursor = '';\n }\n});\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (utils.is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (utils.is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n const buttons = event.buttons || ({\n 0: 1,\n 1: 4,\n 3: 8,\n 4: 16,\n })[event.button];\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\nfunction withinInteractionLimit (interactable, element, action) {\n const options = interactable.options;\n const maxActions = options[action.name].max;\n const maxPerElement = options[action.name].maxPerElement;\n let activeInteractions = 0;\n let targetCount = 0;\n let targetElementCount = 0;\n\n // no actions if any of these values == 0\n if (!(maxActions && maxPerElement && autoStart.maxInteractions)) { return; }\n\n for (let i = 0, len = scope.interactions.length; i < len; i++) {\n const interaction = scope.interactions[i];\n const otherAction = interaction.prepared.name;\n\n if (!interaction.interacting()) { continue; }\n\n activeInteractions++;\n\n if (activeInteractions >= autoStart.maxInteractions) {\n return false;\n }\n\n if (interaction.target !== interactable) { continue; }\n\n targetCount += (otherAction === action.name)|0;\n\n if (targetCount >= maxActions) {\n return false;\n }\n\n if (interaction.element === element) {\n targetElementCount++;\n\n if (otherAction !== action.name || targetElementCount >= maxPerElement) {\n return false;\n }\n }\n }\n\n return autoStart.maxInteractions > 0;\n}\n\n/*\\\n * interact.maxInteractions\n [ method ]\n **\n * Returns or sets the maximum number of concurrent interactions allowed.\n * By default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables\n * and elements, you need to enable it in the draggable, resizable and\n * gesturable `'max'` and `'maxPerElement'` options.\n **\n - newValue (number) #optional Any number. newValue <= 0 means no interactions.\n\\*/\ninteract.maxInteractions = function (newValue) {\n if (utils.is.number(newValue)) {\n autoStart.maxInteractions = newValue;\n\n return this;\n }\n\n return autoStart.maxInteractions;\n};\n\nInteractable.settingsMethods.push('styleCursor');\nInteractable.settingsMethods.push('actionChecker');\nInteractable.settingsMethods.push('ignoreFrom');\nInteractable.settingsMethods.push('allowFrom');\n\ndefaultOptions.base.actionChecker = null;\ndefaultOptions.base.styleCursor = true;\n\nutils.extend(defaultOptions.perAction, autoStart.defaults.perAction);\n\nmodule.exports = autoStart;\n","const autoStart = require('./base');\nconst Interaction = require('../Interaction');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.delayTimer = null;\n});\n\nautoStart.signals.on('prepared', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.delayTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.target, interaction.element);\n }, delay);\n }\n});\n\nInteraction.signals.on('move', function ({ interaction, duplicate }) {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.delayTimer);\n }\n});\n\n// prevent regular down->move autoStart\nautoStart.signals.on('before-start', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.prepared.name = null;\n }\n});\n","const autoStart = require('./base');\nconst scope = require('../scope');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\n\nconst { matchesSelector, parentNode } = require('../utils/domUtils');\n\nautoStart.setActionDefaults(require('../actions/drag'));\n\nautoStart.signals.on('before-start', function ({ interaction, eventTarget, dx, dy }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // check if a drag is in the correct axis\n const absX = Math.abs(dx);\n const absY = Math.abs(dy);\n const options = interaction.target.options.drag;\n const startAxis = options.startAxis;\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy');\n\n interaction.prepared.axis = options.lockAxis === 'start'\n ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n : options.lockAxis;\n\n // if the movement isn't in the startAxis of the interactable\n if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) {\n // cancel the prepared action\n interaction.prepared.name = null;\n\n // then try to get a drag from another ineractable\n\n if (!interaction.prepared.name) {\n\n let element = eventTarget;\n\n const getDraggable = function (interactable, selector, context) {\n const elements = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n if (interactable === interaction.target) { return; }\n\n if (!options.manualStart\n && !interactable.testIgnoreAllow(options, element, eventTarget)\n && matchesSelector(element, selector, elements)) {\n\n const action = interactable.getAction(interaction.downPointer,\n interaction.downEvent,\n interaction,\n element);\n\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, interactable)\n && autoStart.validateAction(action, interactable, element, eventTarget)) {\n\n return interactable;\n }\n }\n };\n\n let action = null;\n\n // check all interactables\n while (is.element(element)) {\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && elementInteractable !== interaction.target\n && !elementInteractable.options.drag.manualStart) {\n\n action = elementInteractable.getAction(interaction.downPointer, interaction.downEvent, interaction, element);\n }\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, elementInteractable)) {\n\n interaction.prepared.name = 'drag';\n interaction.target = elementInteractable;\n interaction.element = element;\n break;\n }\n\n const selectorInteractable = scope.interactables.forEachSelector(getDraggable, element);\n\n if (selectorInteractable) {\n interaction.prepared.name = 'drag';\n interaction.target = selectorInteractable;\n interaction.element = element;\n break;\n }\n\n element = parentNode(element);\n }\n }\n }\n});\n\nfunction checkStartAxis (startAxis, interactable) {\n if (!interactable) { return false; }\n\n const thisAxis = interactable.options.drag.startAxis;\n\n return (startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis);\n}\n","require('./base').setActionDefaults(require('../actions/gesture'));\n","require('./base').setActionDefaults(require('../actions/resize'));\n","module.exports = {\n base: {\n accept : null,\n preventDefault: 'auto',\n deltaSource : 'page',\n },\n\n perAction: {\n origin: { x: 0, y: 0 },\n\n // only allow left button by default\n // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n mouseButtons: 1,\n\n inertia: {\n enabled : false,\n resistance : 10, // the lambda in exponential decay\n minSpeed : 100, // target speed must be above this for inertia to start\n endSpeed : 10, // the speed at which inertia is slow enough to stop\n allowResume : true, // allow resuming an action in inertia phase\n smoothEndDuration: 300, // animate to snap/restrict endOnly if there's no inertia\n },\n },\n};\n","/* browser entry point */\n\n// Legacy browser support\nrequire('./legacyBrowsers');\n\n// inertia\nrequire('./inertia');\n\n// modifiers\nrequire('./modifiers/snap');\nrequire('./modifiers/restrict');\n\n// pointerEvents\nrequire('./pointerEvents/base');\nrequire('./pointerEvents/holdRepeat');\nrequire('./pointerEvents/interactableTargets');\n\n// delay\nrequire('./autoStart/delay');\n\n// actions\nrequire('./actions/gesture');\nrequire('./actions/resize');\nrequire('./actions/drag');\nrequire('./actions/drop');\n\n// load these modifiers after resize is loaded\nrequire('./modifiers/snapSize');\nrequire('./modifiers/restrictEdges');\nrequire('./modifiers/restrictSize');\n\n// autoStart actions\nrequire('./autoStart/gesture');\nrequire('./autoStart/resize');\nrequire('./autoStart/drag');\n\n// Interactable preventDefault setting\nrequire('./interactablePreventDefault.js');\n\n// autoScroll\nrequire('./autoScroll');\n\n// export interact\nmodule.exports = require('./interact');\n","const InteractEvent = require('./InteractEvent');\nconst Interaction = require('./Interaction');\nconst modifiers = require('./modifiers');\nconst utils = require('./utils');\nconst animationFrame = require('./utils/raf');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.inertiaStatus = {\n active : false,\n smoothEnd : false,\n allowResume: false,\n\n startEvent: null,\n upCoords : {},\n\n xe: 0, ye: 0,\n sx: 0, sy: 0,\n\n t0: 0,\n vx0: 0, vys: 0,\n duration: 0,\n\n lambda_v0: 0,\n one_ve_v0: 0,\n i : null,\n };\n\n interaction.boundInertiaFrame = () => inertiaFrame .apply(interaction);\n interaction.boundSmoothEndFrame = () => smoothEndFrame.apply(interaction);\n});\n\nInteraction.signals.on('down', function ({ interaction, event, pointer, eventTarget }) {\n const status = interaction.inertiaStatus;\n\n // Check if the down event hits the current inertia target\n if (status.active) {\n let element = eventTarget;\n\n // climb up the DOM tree from the event target\n while (utils.is.element(element)) {\n\n // if interaction element is the current inertia target element\n if (element === interaction.element) {\n // stop inertia\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n\n // update pointers to the down event's coordinates\n interaction.updatePointer(pointer);\n utils.setCoords(interaction.curCoords, interaction.pointers);\n\n // fire appropriate signals\n const signalArg = { interaction };\n Interaction.signals.fire('before-action-move', signalArg);\n Interaction.signals.fire('action-resume' , signalArg);\n\n // fire a reume event\n const resumeEvent = new InteractEvent(interaction,\n event,\n interaction.prepared.name,\n 'inertiaresume',\n interaction.element);\n\n interaction.target.fire(resumeEvent);\n interaction.prevEvent = resumeEvent;\n modifiers.resetStatuses(interaction.modifierStatuses);\n\n utils.copyCoords(interaction.prevCoords, interaction.curCoords);\n break;\n }\n\n element = utils.parentNode(element);\n }\n }\n});\n\nInteraction.signals.on('up', function ({ interaction, event }) {\n const status = interaction.inertiaStatus;\n\n if (!interaction.interacting() || status.active) { return; }\n\n const target = interaction.target;\n const options = target && target.options;\n const inertiaOptions = options && interaction.prepared.name && options[interaction.prepared.name].inertia;\n\n const now = new Date().getTime();\n const statuses = {};\n const page = utils.extend({}, interaction.curCoords.page);\n const pointerSpeed = interaction.pointerDelta.client.speed;\n\n let smoothEnd = false;\n let modifierResult;\n\n // check if inertia should be started\n const inertiaPossible = (inertiaOptions && inertiaOptions.enabled\n && interaction.prepared.name !== 'gesture'\n && event !== status.startEvent);\n\n const inertia = (inertiaPossible\n && (now - interaction.curCoords.timeStamp) < 50\n && pointerSpeed > inertiaOptions.minSpeed\n && pointerSpeed > inertiaOptions.endSpeed);\n\n const modifierArg = {\n interaction,\n pageCoords: page,\n statuses,\n preEnd: true,\n requireEndOnly: true,\n };\n\n // smoothEnd\n if (inertiaPossible && !inertia) {\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n if (modifierResult.shouldMove && modifierResult.locked) {\n smoothEnd = true;\n }\n }\n\n if (!(inertia || smoothEnd)) { return; }\n\n utils.copyCoords(status.upCoords, interaction.curCoords);\n\n interaction.pointers[0] = status.startEvent =\n new InteractEvent(interaction, event, interaction.prepared.name, 'inertiastart', interaction.element);\n\n status.t0 = now;\n\n status.active = true;\n status.allowResume = inertiaOptions.allowResume;\n interaction.simulation = status;\n\n target.fire(status.startEvent);\n\n if (inertia) {\n status.vx0 = interaction.pointerDelta.client.vx;\n status.vy0 = interaction.pointerDelta.client.vy;\n status.v0 = pointerSpeed;\n\n calcInertia(interaction, status);\n\n utils.extend(page, interaction.curCoords.page);\n\n page.x += status.xe;\n page.y += status.ye;\n\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n status.modifiedXe += modifierResult.dx;\n status.modifiedYe += modifierResult.dy;\n\n status.i = animationFrame.request(interaction.boundInertiaFrame);\n }\n else {\n status.smoothEnd = true;\n status.xe = modifierResult.dx;\n status.ye = modifierResult.dy;\n\n status.sx = status.sy = 0;\n\n status.i = animationFrame.request(interaction.boundSmoothEndFrame);\n }\n});\n\nInteraction.signals.on('stop-active', function ({ interaction }) {\n const status = interaction.inertiaStatus;\n\n if (status.active) {\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n }\n});\n\nfunction calcInertia (interaction, status) {\n const inertiaOptions = interaction.target.options[interaction.prepared.name].inertia;\n const lambda = inertiaOptions.resistance;\n const inertiaDur = -Math.log(inertiaOptions.endSpeed / status.v0) / lambda;\n\n status.x0 = interaction.prevEvent.pageX;\n status.y0 = interaction.prevEvent.pageY;\n status.t0 = status.startEvent.timeStamp / 1000;\n status.sx = status.sy = 0;\n\n status.modifiedXe = status.xe = (status.vx0 - inertiaDur) / lambda;\n status.modifiedYe = status.ye = (status.vy0 - inertiaDur) / lambda;\n status.te = inertiaDur;\n\n status.lambda_v0 = lambda / status.v0;\n status.one_ve_v0 = 1 - inertiaOptions.endSpeed / status.v0;\n}\n\nfunction inertiaFrame () {\n updateInertiaCoords(this);\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n\n const status = this.inertiaStatus;\n const options = this.target.options[this.prepared.name].inertia;\n const lambda = options.resistance;\n const t = new Date().getTime() / 1000 - status.t0;\n\n if (t < status.te) {\n\n const progress = 1 - (Math.exp(-lambda * t) - status.lambda_v0) / status.one_ve_v0;\n\n if (status.modifiedXe === status.xe && status.modifiedYe === status.ye) {\n status.sx = status.xe * progress;\n status.sy = status.ye * progress;\n }\n else {\n const quadPoint = utils.getQuadraticCurvePoint(0, 0,\n status.xe,\n status.ye,\n status.modifiedXe,\n status.modifiedYe,\n progress);\n\n status.sx = quadPoint.x;\n status.sy = quadPoint.y;\n }\n\n this.doMove();\n\n status.i = animationFrame.request(this.boundInertiaFrame);\n }\n else {\n status.sx = status.modifiedXe;\n status.sy = status.modifiedYe;\n\n this.doMove();\n this.end(status.startEvent);\n status.active = false;\n this.simulation = null;\n }\n\n utils.copyCoords(this.prevCoords, this.curCoords);\n}\n\nfunction smoothEndFrame () {\n updateInertiaCoords(this);\n\n const status = this.inertiaStatus;\n const t = new Date().getTime() - status.t0;\n const duration = this.target.options[this.prepared.name].inertia.smoothEndDuration;\n\n if (t < duration) {\n status.sx = utils.easeOutQuad(t, 0, status.xe, duration);\n status.sy = utils.easeOutQuad(t, 0, status.ye, duration);\n\n this.pointerMove(status.startEvent, status.startEvent);\n\n status.i = animationFrame.request(this.boundSmoothEndFrame);\n }\n else {\n status.sx = status.xe;\n status.sy = status.ye;\n\n this.pointerMove(status.startEvent, status.startEvent);\n this.end(status.startEvent);\n\n status.smoothEnd =\n status.active = false;\n this.simulation = null;\n }\n}\n\nfunction updateInertiaCoords (interaction) {\n const status = interaction.inertiaStatus;\n\n // return if inertia isn't running\n if (!status.active) { return; }\n\n const pageUp = status.upCoords.page;\n const clientUp = status.upCoords.client;\n\n utils.setCoords(interaction.curCoords, [ {\n pageX : pageUp.x + status.sx,\n pageY : pageUp.y + status.sy,\n clientX: clientUp.x + status.sx,\n clientY: clientUp.y + status.sy,\n } ]);\n}\n","const browser = require('./utils/browser');\nconst events = require('./utils/events');\nconst utils = require('./utils');\nconst scope = require('./scope');\nconst Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\n\nconst globalEvents = {};\n\n/*\\\n * interact\n [ method ]\n *\n * The methods of this variable can be used to set elements as\n * interactables and also to change various default settings.\n *\n * Calling it as a function and passing an element or a valid CSS selector\n * string returns an Interactable object which has various methods to\n * configure it.\n *\n - element (Element | string) The HTML or SVG Element to interact with or CSS selector\n = (object) An @Interactable\n *\n > Usage\n | interact('#draggable').draggable(true);\n |\n | var rectables = interact('rect');\n | rectables\n | .gesturable(true)\n | .on('gesturemove', function (event) {\n | // ...\n | });\n\\*/\nfunction interact (element, options) {\n let interactable = scope.interactables.get(element, options);\n\n if (!interactable) {\n interactable = new Interactable(element, options);\n interactable.events.global = globalEvents;\n }\n\n return interactable;\n}\n\n/*\\\n * interact.isSet\n [ method ]\n *\n * Check if an element has been set\n - element (Element) The Element being searched for\n = (boolean) Indicates if the element or CSS selector was previously passed to interact\n\\*/\ninteract.isSet = function (element, options) {\n return scope.interactables.indexOfElement(element, options && options.context) !== -1;\n};\n\n/*\\\n * interact.on\n [ method ]\n *\n * Adds a global listener for an InteractEvent or adds a DOM event to\n * `document`\n *\n - type (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) interact\n\\*/\ninteract.on = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.on(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.on(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n // if it is an InteractEvent type, add listener to globalEvents\n if (utils.contains(Interactable.eventTypes, type)) {\n // if this type of event was never bound\n if (!globalEvents[type]) {\n globalEvents[type] = [listener];\n }\n else {\n globalEvents[type].push(listener);\n }\n }\n // If non InteractEvent type, addEventListener to document\n else {\n events.add(scope.document, type, listener, { options });\n }\n\n return interact;\n};\n\n/*\\\n * interact.off\n [ method ]\n *\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n - type (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) interact\n \\*/\ninteract.off = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.off(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.off(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n if (!utils.contains(Interactable.eventTypes, type)) {\n events.remove(scope.document, type, listener, options);\n }\n else {\n let index;\n\n if (type in globalEvents\n && (index = utils.indexOf(globalEvents[type], listener)) !== -1) {\n globalEvents[type].splice(index, 1);\n }\n }\n\n return interact;\n};\n\n/*\\\n * interact.debug\n [ method ]\n *\n * Returns an object which exposes internal data\n = (object) An object with properties that outline the current state and expose internal functions and variables\n\\*/\ninteract.debug = function () {\n return scope;\n};\n\n// expose the functions used to calculate multi-touch properties\ninteract.getPointerAverage = utils.pointerAverage;\ninteract.getTouchBBox = utils.touchBBox;\ninteract.getTouchDistance = utils.touchDistance;\ninteract.getTouchAngle = utils.touchAngle;\n\ninteract.getElementRect = utils.getElementRect;\ninteract.getElementClientRect = utils.getElementClientRect;\ninteract.matchesSelector = utils.matchesSelector;\ninteract.closest = utils.closest;\n\n/*\\\n * interact.supportsTouch\n [ method ]\n *\n = (boolean) Whether or not the browser supports touch input\n\\*/\ninteract.supportsTouch = function () {\n return browser.supportsTouch;\n};\n\n/*\\\n * interact.supportsPointerEvent\n [ method ]\n *\n = (boolean) Whether or not the browser supports PointerEvents\n\\*/\ninteract.supportsPointerEvent = function () {\n return browser.supportsPointerEvent;\n};\n\n/*\\\n * interact.stop\n [ method ]\n *\n * Cancels all interactions (end events are not fired)\n *\n - event (Event) An event on which to call preventDefault()\n = (object) interact\n\\*/\ninteract.stop = function (event) {\n for (let i = scope.interactions.length - 1; i >= 0; i--) {\n scope.interactions[i].stop(event);\n }\n\n return interact;\n};\n\n/*\\\n * interact.pointerMoveTolerance\n [ method ]\n * Returns or sets the distance the pointer must be moved before an action\n * sequence occurs. This also affects tolerance for tap events.\n *\n - newValue (number) #optional The movement from the start position must be greater than this value\n = (number | Interactable) The current setting or interact\n\\*/\ninteract.pointerMoveTolerance = function (newValue) {\n if (utils.is.number(newValue)) {\n Interaction.pointerMoveTolerance = newValue;\n\n return this;\n }\n\n return Interaction.pointerMoveTolerance;\n};\n\ninteract.addDocument = scope.addDocument;\ninteract.removeDocument = scope.removeDocument;\n\nscope.interact = interact;\n\nmodule.exports = interact;\n","const Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\nconst scope = require('./scope');\nconst is = require('./utils/is');\nconst events = require('./utils/events');\n\nconst { nodeContains, matchesSelector } = require('./utils/domUtils');\n\n/*\\\n * Interactable.preventDefault\n [ method ]\n *\n * Returns or sets whether to prevent the browser's default behaviour\n * in response to pointer events. Can be set to:\n * - `'always'` to always prevent\n * - `'never'` to never prevent\n * - `'auto'` to let interact.js try to determine what would be best\n *\n - newValue (string) #optional `true`, `false` or `'auto'`\n = (string | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.preventDefault = function (newValue) {\n if (/^(always|never|auto)$/.test(newValue)) {\n this.options.preventDefault = newValue;\n return this;\n }\n\n if (is.bool(newValue)) {\n this.options.preventDefault = newValue? 'always' : 'never';\n return this;\n }\n\n return this.options.preventDefault;\n};\n\nInteractable.prototype.checkAndPreventDefault = function (event) {\n const setting = this.options.preventDefault;\n\n if (setting === 'never') { return; }\n\n if (setting === 'always') {\n event.preventDefault();\n return;\n }\n\n // setting === 'auto'\n\n // don't preventDefault if the browser supports passiveEvents\n // CSS touch-action and user-selecct should be used instead\n if (events.supportsOptions) {\n return;\n }\n\n // don't preventDefault of pointerdown events\n if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) {\n return;\n }\n\n // don't preventDefault on editable elements\n if (is.element(event.target)\n && matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) {\n return;\n }\n\n event.preventDefault();\n};\n\nfunction onInteractionEvent ({ interaction, event }) {\n if (interaction.target) {\n interaction.target.checkAndPreventDefault(event);\n }\n}\n\nfor (const eventSignal of ['down', 'move', 'up', 'cancel']) {\n Interaction.signals.on(eventSignal, onInteractionEvent);\n}\n\n// prevent native HTML5 drag on interact.js target elements\nInteraction.docEvents.dragstart = function preventNativeDrag (event) {\n for (const interaction of scope.interactions) {\n\n if (interaction.element\n && (interaction.element === event.target\n || nodeContains(interaction.element, event.target))) {\n\n interaction.target.checkAndPreventDefault(event);\n return;\n }\n }\n};\n","const scope = require('./scope');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst iFinder = require('./utils/interactionFinder');\nconst pointerEvents = require('./pointerEvents/base');\n\nconst { window } = require('./utils/window');\n\nconst toString = Object.prototype.toString;\n\nif (!window.Array.isArray) {\n window.Array.isArray = function (obj) {\n return toString.call(obj) === '[object Array]';\n };\n}\n\nif (!String.prototype.trim) {\n String.prototype.trim = function () {\n return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n };\n}\n\n// http://www.quirksmode.org/dom/events/click.html\n// >Events leading to dblclick\n//\n// IE8 doesn't fire down event before dblclick.\n// This workaround tries to fire a tap and doubletap after dblclick\nfunction onIE8Dblclick (event) {\n const eventTarget = event.target;\n const interaction = iFinder.search(event, event.type, eventTarget);\n\n if (!interaction) { return; }\n\n if (interaction.prevTap\n && event.clientX === interaction.prevTap.clientX\n && event.clientY === interaction.prevTap.clientY\n && eventTarget === interaction.prevTap.target) {\n\n interaction.downTargets[0] = eventTarget;\n interaction.downTimes [0] = new Date().getTime();\n\n pointerEvents.fire({\n interaction,\n event,\n eventTarget,\n pointer: event,\n type: 'tap',\n });\n }\n}\n\nif (browser.isIE8) {\n const selectFix = function (event) {\n for (const interaction of scope.interactions) {\n if (interaction.interacting()) {\n interaction.target.checkAndPreventDefault(event);\n }\n }\n };\n\n const onDocIE8 = function onDocIE8 ({ doc, win }, signalName) {\n const eventMethod = signalName.indexOf('listen') === 0\n ? events.add : events.remove;\n\n // For IE's lack of Event#preventDefault\n eventMethod(doc, 'selectstart', selectFix);\n\n if (pointerEvents) {\n eventMethod(doc, 'dblclick', onIE8Dblclick);\n }\n };\n\n scope.signals.on('add-document' , onDocIE8);\n scope.signals.on('remove-document', onDocIE8);\n}\n\nmodule.exports = null;\n","const InteractEvent = require('../InteractEvent');\nconst Interaction = require('../Interaction');\nconst extend = require('../utils/extend');\n\nconst modifiers = {\n names: [],\n\n setOffsets: function (arg) {\n const { interaction, pageCoords: page } = arg;\n const { target, element, startOffset } = interaction;\n const rect = target.getRect(element);\n\n if (rect) {\n startOffset.left = page.x - rect.left;\n startOffset.top = page.y - rect.top;\n\n startOffset.right = rect.right - page.x;\n startOffset.bottom = rect.bottom - page.y;\n\n if (!('width' in rect)) { rect.width = rect.right - rect.left; }\n if (!('height' in rect)) { rect.height = rect.bottom - rect.top ; }\n }\n else {\n startOffset.left = startOffset.top = startOffset.right = startOffset.bottom = 0;\n }\n\n arg.rect = rect;\n arg.interactable = target;\n arg.element = element;\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n\n arg.options = target.options[interaction.prepared.name][modifierName];\n\n if (!arg.options) {\n continue;\n }\n\n interaction.modifierOffsets[modifierName] = modifiers[modifierName].setOffset(arg);\n }\n },\n\n setAll: function (arg) {\n const { interaction, statuses, preEnd, requireEndOnly } = arg;\n const coords = extend({}, arg.pageCoords);\n const result = {\n dx: 0,\n dy: 0,\n changed: false,\n locked: false,\n shouldMove: true,\n };\n\n for (const modifierName of modifiers.names) {\n const modifier = modifiers[modifierName];\n const options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!shouldDo(options, preEnd, requireEndOnly)) { continue; }\n\n arg.status = arg.status = statuses[modifierName];\n arg.options = options;\n arg.offset = arg.interaction.modifierOffsets[modifierName];\n\n modifier.set(arg);\n\n if (arg.status.locked) {\n coords.x += arg.status.dx;\n coords.y += arg.status.dy;\n\n result.dx += arg.status.dx;\n result.dy += arg.status.dy;\n\n result.locked = true;\n }\n }\n\n // a move should be fired if:\n // - there are no modifiers enabled,\n // - no modifiers are \"locked\" i.e. have changed the pointer's coordinates, or\n // - the locked coords have changed since the last pointer move\n result.shouldMove = !arg.status || !result.locked || arg.status.changed;\n\n return result;\n },\n\n resetStatuses: function (statuses) {\n for (const modifierName of modifiers.names) {\n const status = statuses[modifierName] || {};\n\n status.dx = status.dy = 0;\n status.modifiedX = status.modifiedY = NaN;\n status.locked = false;\n status.changed = true;\n\n statuses[modifierName] = status;\n }\n\n return statuses;\n },\n\n start: function ({ interaction }, signalName) {\n const arg = {\n interaction,\n pageCoords: (signalName === 'action-resume' ?\n interaction.curCoords : interaction.startCoords).page,\n startOffset: interaction.startOffset,\n statuses: interaction.modifierStatuses,\n preEnd: false,\n requireEndOnly: false,\n };\n\n modifiers.setOffsets(arg);\n modifiers.resetStatuses(arg.statuses);\n\n arg.pageCoords = extend({}, interaction.startCoords.page);\n interaction.modifierResult = modifiers.setAll(arg);\n },\n};\n\nInteraction.signals.on('new', function (interaction) {\n interaction.startOffset = { left: 0, right: 0, top: 0, bottom: 0 };\n interaction.modifierOffsets = {};\n interaction.modifierStatuses = modifiers.resetStatuses({});\n interaction.modifierResult = null;\n});\n\nInteraction.signals.on('action-start' , modifiers.start);\nInteraction.signals.on('action-resume', modifiers.start);\n\nInteraction.signals.on('before-action-move', function ({ interaction, preEnd, interactingBeforeMove }) {\n const modifierResult = modifiers.setAll({\n interaction,\n preEnd,\n pageCoords: interaction.curCoords.page,\n statuses: interaction.modifierStatuses,\n requireEndOnly: false,\n });\n\n // don't fire an action move if a modifier would keep the event in the same\n // cordinates as before\n if (!modifierResult.shouldMove && interactingBeforeMove) {\n interaction._dontFireMove = true;\n }\n\n interaction.modifierResult = modifierResult;\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n for (let i = 0; i < modifiers.names.length; i++) {\n const options = interaction.target.options[interaction.prepared.name][modifiers.names[i]];\n\n // if the endOnly option is true for any modifier\n if (shouldDo(options, true, true)) {\n // fire a move event at the modified coordinates\n interaction.doMove({ event, preEnd: true });\n break;\n }\n }\n});\n\nInteractEvent.signals.on('set-xy', function (arg) {\n const { iEvent, interaction } = arg;\n const modifierArg = extend({}, arg);\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n modifierArg.options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!modifierArg.options) {\n continue;\n }\n\n const modifier = modifiers[modifierName];\n\n modifierArg.status = interaction.modifierStatuses[modifierName];\n\n iEvent[modifierName] = modifier.modifyCoords(modifierArg);\n }\n});\n\nfunction shouldDo (options, preEnd, requireEndOnly) {\n return (options && options.enabled\n && (preEnd || !options.endOnly)\n && (!requireEndOnly || options.endOnly));\n}\n\nmodule.exports = modifiers;\n","const modifiers = require('./index');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst restrict = {\n defaults: {\n enabled : false,\n endOnly : false,\n restriction: null,\n elementRect: null,\n },\n\n setOffset: function ({ rect, startOffset, options }) {\n const elementRect = options && options.elementRect;\n const offset = {};\n\n if (rect && elementRect) {\n offset.left = startOffset.left - (rect.width * elementRect.left);\n offset.top = startOffset.top - (rect.height * elementRect.top);\n\n offset.right = startOffset.right - (rect.width * (1 - elementRect.right));\n offset.bottom = startOffset.bottom - (rect.height * (1 - elementRect.bottom));\n }\n else {\n offset.left = offset.top = offset.right = offset.bottom = 0;\n }\n\n return offset;\n },\n\n set: function ({ pageCoords, interaction, status, options }) {\n if (!options) { return status; }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n\n const restriction = getRestrictionRect(options.restriction, interaction, page);\n\n if (!restriction) { return status; }\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n const rect = restriction;\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n const offset = interaction.modifierOffsets.restrict;\n\n // object is assumed to have\n // x, y, width, height or\n // left, top, right, bottom\n if ('x' in restriction && 'y' in restriction) {\n modifiedX = Math.max(Math.min(rect.x + rect.width - offset.right , page.x), rect.x + offset.left);\n modifiedY = Math.max(Math.min(rect.y + rect.height - offset.bottom, page.y), rect.y + offset.top );\n }\n else {\n modifiedX = Math.max(Math.min(rect.right - offset.right , page.x), rect.left + offset.left);\n modifiedY = Math.max(Math.min(rect.bottom - offset.bottom, page.y), rect.top + offset.top );\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const elementRect = options && options.elementRect;\n\n if (options && options.enabled\n && !(phase === 'start' && elementRect && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n getRestrictionRect,\n};\n\nfunction getRestrictionRect (value, interaction, page) {\n if (utils.is.function(value)) {\n return utils.resolveRectLike(value, interaction.target, interaction.element, [page.x, page.y, interaction]);\n } else {\n return utils.resolveRectLike(value, interaction.target, interaction.element);\n }\n}\n\nmodifiers.restrict = restrict;\nmodifiers.names.push('restrict');\n\ndefaultOptions.perAction.restrict = restrict.defaults;\n\nmodule.exports = restrict;\n","// This module adds the options.resize.restrictEdges setting which sets min and\n// max for the top, left, bottom and right edges of the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictEdges: {\n// inner: { top: 200, left: 200, right: 400, bottom: 400 },\n// outer: { top: 0, left: 0, right: 600, bottom: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst { getRestrictionRect } = require('./restrict');\n\nconst noInner = { top: +Infinity, left: +Infinity, bottom: -Infinity, right: -Infinity };\nconst noOuter = { top: -Infinity, left: -Infinity, bottom: +Infinity, right: +Infinity };\n\nconst restrictEdges = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n offset: null,\n },\n\n setOffset: function ({ interaction, startOffset, options }) {\n if (!options) {\n return utils.extend({}, startOffset);\n }\n\n const offset = getRestrictionRect(options.offset, interaction, interaction.startCoords.page);\n\n if (offset) {\n return {\n top: startOffset.top + offset.y,\n left: startOffset.left + offset.x,\n bottom: startOffset.bottom + offset.y,\n right: startOffset.right + offset.x,\n };\n }\n\n return startOffset;\n },\n\n set: function ({ pageCoords, interaction, status, offset, options }) {\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n const inner = rectUtils.xywhToTlbr(getRestrictionRect(options.inner, interaction, page)) || noInner;\n const outer = rectUtils.xywhToTlbr(getRestrictionRect(options.outer, interaction, page)) || noOuter;\n\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n if (edges.top) {\n modifiedY = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top);\n }\n else if (edges.bottom) {\n modifiedY = Math.max(Math.min(outer.bottom - offset.bottom, page.y), inner.bottom - offset.bottom);\n }\n if (edges.left) {\n modifiedX = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left);\n }\n else if (edges.right) {\n modifiedX = Math.max(Math.min(outer.right - offset.right, page.x), inner.right - offset.right);\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n if (options && options.enabled\n && !(phase === 'start' && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n noInner,\n noOuter,\n getRestrictionRect,\n};\n\nmodifiers.restrictEdges = restrictEdges;\nmodifiers.names.push('restrictEdges');\n\ndefaultOptions.perAction.restrictEdges = restrictEdges.defaults;\nresize.defaults.restrictEdges = restrictEdges.defaults;\n\nmodule.exports = restrictEdges;\n","// This module adds the options.resize.restrictSize setting which sets min and\n// max width and height for the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictSize: {\n// min: { width: -600, height: -600 },\n// max: { width: 600, height: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst restrictEdges = require('./restrictEdges');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst noMin = { width: -Infinity, height: -Infinity };\nconst noMax = { width: +Infinity, height: +Infinity };\n\nconst restrictSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n },\n\n setOffset: function ({ interaction }) {\n return interaction.startOffset;\n },\n\n set: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const rect = rectUtils.xywhToTlbr(interaction.resizeRects.inverted);\n\n const minSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.min, interaction)) || noMin;\n const maxSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.max, interaction)) || noMax;\n\n arg.options = {\n enabled: options.enabled,\n endOnly: options.endOnly,\n inner: utils.extend({}, restrictEdges.noInner),\n outer: utils.extend({}, restrictEdges.noOuter),\n };\n\n if (edges.top) {\n arg.options.inner.top = rect.bottom - minSize.height;\n arg.options.outer.top = rect.bottom - maxSize.height;\n }\n else if (edges.bottom) {\n arg.options.inner.bottom = rect.top + minSize.height;\n arg.options.outer.bottom = rect.top + maxSize.height;\n }\n if (edges.left) {\n arg.options.inner.left = rect.right - minSize.width;\n arg.options.outer.left = rect.right - maxSize.width;\n }\n else if (edges.right) {\n arg.options.inner.right = rect.left + minSize.width;\n arg.options.outer.right = rect.left + maxSize.width;\n }\n\n restrictEdges.set(arg);\n },\n\n modifyCoords: restrictEdges.modifyCoords,\n};\n\nmodifiers.restrictSize = restrictSize;\nmodifiers.names.push('restrictSize');\n\ndefaultOptions.perAction.restrictSize = restrictSize.defaults;\nresize.defaults.restrictSize = restrictSize.defaults;\n\nmodule.exports = restrictSize;\n","const modifiers = require('./index');\nconst interact = require('../interact');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst snap = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n\n relativePoints: null,\n },\n\n setOffset: function ({ interaction, interactable, element, rect, startOffset, options }) {\n const offsets = [];\n const optionsOrigin = utils.rectToXY(utils.resolveRectLike(options.origin));\n const origin = optionsOrigin || utils.getOriginXY(interactable, element, interaction.prepared.name);\n options = options || interactable.options[interaction.prepared.name].snap || {};\n\n let snapOffset;\n\n if (options.offset === 'startCoords') {\n snapOffset = {\n x: interaction.startCoords.page.x - origin.x,\n y: interaction.startCoords.page.y - origin.y,\n };\n }\n else {\n const offsetRect = utils.resolveRectLike(options.offset, interactable, element, [interaction]);\n\n snapOffset = utils.rectToXY(offsetRect) || { x: 0, y: 0 };\n }\n\n if (rect && options.relativePoints && options.relativePoints.length) {\n for (const { x: relativeX, y: relativeY } of options.relativePoints) {\n offsets.push({\n x: startOffset.left - (rect.width * relativeX) + snapOffset.x,\n y: startOffset.top - (rect.height * relativeY) + snapOffset.y,\n });\n }\n }\n else {\n offsets.push(snapOffset);\n }\n\n return offsets;\n },\n\n set: function ({ interaction, pageCoords, status, options, offset: offsets }) {\n const targets = [];\n let target;\n let page;\n let i;\n\n if (status.useStatusXY) {\n page = { x: status.x, y: status.y };\n }\n else {\n const origin = utils.getOriginXY(interaction.target, interaction.element, interaction.prepared.name);\n\n page = utils.extend({}, pageCoords);\n\n page.x -= origin.x;\n page.y -= origin.y;\n }\n\n status.realX = page.x;\n status.realY = page.y;\n\n let len = options.targets? options.targets.length : 0;\n\n for (const { x: offsetX, y: offsetY } of offsets) {\n const relativeX = page.x - offsetX;\n const relativeY = page.y - offsetY;\n\n for (const snapTarget of options.targets) {\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n targets.push({\n x: utils.is.number(target.x) ? (target.x + offsetX) : relativeX,\n y: utils.is.number(target.y) ? (target.y + offsetY) : relativeY,\n\n range: utils.is.number(target.range)? target.range: options.range,\n });\n }\n }\n\n const closest = {\n target: null,\n inRange: false,\n distance: 0,\n range: 0,\n dx: 0,\n dy: 0,\n };\n\n for (i = 0, len = targets.length; i < len; i++) {\n target = targets[i];\n\n const range = target.range;\n const dx = target.x - page.x;\n const dy = target.y - page.y;\n const distance = utils.hypot(dx, dy);\n let inRange = distance <= range;\n\n // Infinite targets count as being out of range\n // compared to non infinite ones that are in range\n if (range === Infinity && closest.inRange && closest.range !== Infinity) {\n inRange = false;\n }\n\n if (!closest.target || (inRange\n // is the closest target in range?\n ? (closest.inRange && range !== Infinity\n // the pointer is relatively deeper in this target\n ? distance / range < closest.distance / closest.range\n // this target has Infinite range and the closest doesn't\n : (range === Infinity && closest.range !== Infinity)\n // OR this target is closer that the previous closest\n || distance < closest.distance)\n // The other is not in range and the pointer is closer to this target\n : (!closest.inRange && distance < closest.distance))) {\n\n closest.target = target;\n closest.distance = distance;\n closest.range = range;\n closest.inRange = inRange;\n closest.dx = dx;\n closest.dy = dy;\n\n status.range = range;\n }\n }\n\n let snapChanged;\n\n if (closest.target) {\n snapChanged = (status.modifiedX !== closest.target.x || status.modifiedY !== closest.target.y);\n\n status.modifiedX = closest.target.x;\n status.modifiedY = closest.target.y;\n }\n else {\n snapChanged = true;\n\n status.modifiedX = NaN;\n status.modifiedY = NaN;\n }\n\n status.dx = closest.dx;\n status.dy = closest.dy;\n\n status.changed = (snapChanged || (closest.inRange && !status.locked));\n status.locked = closest.inRange;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const relativePoints = options && options.relativePoints;\n\n if (options && options.enabled\n && !(phase === 'start' && relativePoints && relativePoints.length)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n }\n\n return {\n range : status.range,\n locked : status.locked,\n x : status.modifiedX,\n y : status.modifiedY,\n realX : status.realX,\n realY : status.realY,\n dx : status.dx,\n dy : status.dy,\n };\n }\n },\n};\n\ninteract.createSnapGrid = function (grid) {\n return function (x, y) {\n const limits = grid.limits || {\n left : -Infinity,\n right : Infinity,\n top : -Infinity,\n bottom: Infinity,\n };\n let offsetX = 0;\n let offsetY = 0;\n\n if (utils.is.object(grid.offset)) {\n offsetX = grid.offset.x;\n offsetY = grid.offset.y;\n }\n\n const gridx = Math.round((x - offsetX) / grid.x);\n const gridy = Math.round((y - offsetY) / grid.y);\n\n const newX = Math.max(limits.left, Math.min(limits.right , gridx * grid.x + offsetX));\n const newY = Math.max(limits.top , Math.min(limits.bottom, gridy * grid.y + offsetY));\n\n return {\n x: newX,\n y: newY,\n range: grid.range,\n };\n };\n};\n\nmodifiers.snap = snap;\nmodifiers.names.push('snap');\n\ndefaultOptions.perAction.snap = snap.defaults;\n\nmodule.exports = snap;\n","// This module allows snapping of the size of targets during resize\n// interactions.\n\nconst modifiers = require('./index');\nconst snap = require('./snap');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\nconst utils = require('../utils/');\n\nconst snapSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n },\n\n setOffset: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.edges;\n\n if (!edges) { return; }\n\n arg.options = {\n relativePoints: [{\n x: edges.left? 0 : 1,\n y: edges.top ? 0 : 1,\n }],\n origin: { x: 0, y: 0 },\n offset: 'self',\n range: options.range,\n };\n\n const offsets = snap.setOffset(arg);\n arg.options = options;\n\n return offsets;\n },\n\n set: function (arg) {\n const { interaction, options, offset, pageCoords } = arg;\n const page = utils.extend({}, pageCoords);\n const relativeX = page.x - offset[0].x;\n const relativeY = page.y - offset[0].y;\n\n arg.options = utils.extend({}, options);\n arg.options.targets = [];\n\n for (const snapTarget of options.targets) {\n let target;\n\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n if ('width' in target && 'height' in target) {\n target.x = target.width;\n target.y = target.height;\n }\n\n arg.options.targets.push(target);\n }\n\n snap.set(arg);\n },\n\n modifyCoords: function (arg) {\n const { options } = arg;\n\n arg.options = utils.extend({}, options);\n arg.options.enabled = options.enabled;\n arg.options.relativePoints = [null];\n\n snap.modifyCoords(arg);\n },\n};\n\nmodifiers.snapSize = snapSize;\nmodifiers.names.push('snapSize');\n\ndefaultOptions.perAction.snapSize = snapSize.defaults;\nresize.defaults.snapSize = snapSize.defaults;\n\nmodule.exports = snapSize;\n","const pointerUtils = require('../utils/pointerUtils');\n\nmodule.exports = class PointerEvent {\n constructor (type, pointer, event, eventTarget, interaction) {\n pointerUtils.pointerExtend(this, event);\n\n if (event !== pointer) {\n pointerUtils.pointerExtend(this, pointer);\n }\n\n this.interaction = interaction;\n\n this.timeStamp = new Date().getTime();\n this.originalEvent = event;\n this.type = type;\n this.pointerId = pointerUtils.getPointerId(pointer);\n this.pointerType = pointerUtils.getPointerType(pointer, interaction);\n this.target = eventTarget;\n this.currentTarget = null;\n\n if (type === 'tap') {\n const pointerIndex = interaction.getPointerIndex(pointer);\n this.dt = this.timeStamp - interaction.downTimes[pointerIndex];\n\n const interval = this.timeStamp - interaction.tapTime;\n\n this.double = !!(interaction.prevTap\n && interaction.prevTap.type !== 'doubletap'\n && interaction.prevTap.target === this.target\n && interval < 500);\n }\n else if (type === 'doubletap') {\n this.dt = pointer.timeStamp - interaction.tapTime;\n }\n }\n\n subtractOrigin ({ x: originX, y: originY }) {\n this.pageX -= originX;\n this.pageY -= originY;\n this.clientX -= originX;\n this.clientY -= originY;\n\n return this;\n }\n\n addOrigin ({ x: originX, y: originY }) {\n this.pageX += originX;\n this.pageY += originY;\n this.clientX += originX;\n this.clientY += originY;\n\n return this;\n }\n\n preventDefault () {\n this.originalEvent.preventDefault();\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n};\n","const PointerEvent = require('./PointerEvent');\nconst Interaction = require('../Interaction');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst defaults = require('../defaultOptions');\nconst signals = require('../utils/Signals').new();\nconst { filter } = require('../utils/arr');\n\nconst simpleSignals = [ 'down', 'up', 'cancel' ];\nconst simpleEvents = [ 'down', 'up', 'cancel' ];\n\nconst pointerEvents = {\n PointerEvent,\n fire,\n collectEventTargets,\n signals,\n defaults: {\n holdDuration: 600,\n ignoreFrom : null,\n allowFrom : null,\n origin : { x: 0, y: 0 },\n },\n types: [\n 'down',\n 'move',\n 'up',\n 'cancel',\n 'tap',\n 'doubletap',\n 'hold',\n ],\n};\n\nfunction fire (arg) {\n const {\n interaction, pointer, event, eventTarget,\n type = arg.pointerEvent.type,\n targets = collectEventTargets(arg),\n pointerEvent = new PointerEvent(type, pointer, event, eventTarget, interaction),\n } = arg;\n\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n targets,\n type,\n pointerEvent,\n };\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n\n for (const prop in target.props || {}) {\n pointerEvent[prop] = target.props[prop];\n }\n\n const origin = utils.getOriginXY(target.eventable, target.element);\n\n pointerEvent.subtractOrigin(origin);\n pointerEvent.eventable = target.eventable;\n pointerEvent.currentTarget = target.element;\n\n target.eventable.fire(pointerEvent);\n\n pointerEvent.addOrigin(origin);\n\n if (pointerEvent.immediatePropagationStopped\n || (pointerEvent.propagationStopped\n && (i + 1) < targets.length && targets[i + 1].element !== pointerEvent.currentTarget)) {\n break;\n }\n }\n\n signals.fire('fired', signalArg);\n\n if (type === 'tap') {\n // if pointerEvent should make a double tap, create and fire a doubletap\n // PointerEvent and use that as the prevTap\n const prevTap = pointerEvent.double\n ? fire({\n interaction, pointer, event, eventTarget,\n type: 'doubletap',\n })\n : pointerEvent;\n\n interaction.prevTap = prevTap;\n interaction.tapTime = prevTap.timeStamp;\n }\n\n return pointerEvent;\n}\n\nfunction collectEventTargets ({ interaction, pointer, event, eventTarget, type }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n // do not fire a tap event if the pointer was moved before being lifted\n if (type === 'tap' && (interaction.pointerWasMoved\n // or if the pointerup target is different to the pointerdown target\n || !(interaction.downTargets[pointerIndex] && interaction.downTargets[pointerIndex] === eventTarget))) {\n return [];\n }\n\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n path,\n targets: [],\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (type === 'hold') {\n signalArg.targets = filter(signalArg.targets, target =>\n target.eventable.options.holdDuration === interaction.holdTimers[pointerIndex].duration);\n }\n\n return signalArg.targets;\n}\n\nInteraction.signals.on('update-pointer-down', function ({ interaction, pointerIndex }) {\n interaction.holdTimers[pointerIndex] = { duration: Infinity, timeout: null };\n});\n\nInteraction.signals.on('remove-pointer', function ({ interaction, pointerIndex }) {\n interaction.holdTimers.splice(pointerIndex, 1);\n});\n\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget, duplicateMove }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n if (!duplicateMove && (!interaction.pointerIsDown || interaction.pointerWasMoved)) {\n if (interaction.pointerIsDown) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n\n fire({\n interaction, pointer, event, eventTarget,\n type: 'move',\n });\n }\n});\n\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget, pointerIndex }) {\n // copy event to be used in timeout for IE8\n const eventCopy = browser.isIE8? utils.extend({}, event) : event;\n\n const timer = interaction.holdTimers[pointerIndex];\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'hold',\n targets: [],\n path,\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (!signalArg.targets.length) { return; }\n\n let minDuration = Infinity;\n\n for (let i = 0; i < signalArg.targets.length; i++) {\n const target = signalArg.targets[i];\n const holdDuration = target.eventable.options.holdDuration;\n\n if (holdDuration < minDuration) {\n minDuration = holdDuration;\n }\n }\n\n timer.duration = minDuration;\n timer.timeout = setTimeout(function () {\n fire({\n interaction, eventCopy, eventTarget,\n pointer: browser.isIE8? eventCopy : pointer,\n type: 'hold',\n });\n }, minDuration);\n});\n\nInteraction.signals.on('up', ({ interaction, pointer, event, eventTarget }) => {\n if (!interaction.pointerWasMoved) {\n fire({ interaction, eventTarget, pointer, event, type: 'tap' });\n }\n});\n\n['up', 'cancel'].forEach(function (signalName) {\n Interaction.signals.on(signalName, function ({ interaction, pointerIndex }) {\n if (interaction.holdTimers[pointerIndex]) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n });\n});\n\nfunction createSignalListener (type) {\n return function ({ interaction, pointer, event, eventTarget }) {\n fire({ interaction, eventTarget, pointer, event, type });\n };\n}\n\nfor (let i = 0; i < simpleSignals.length; i++) {\n Interaction.signals.on(simpleSignals[i], createSignalListener(simpleEvents[i]));\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.prevTap = null; // the most recent tap event on this interaction\n interaction.tapTime = 0; // time of the most recent tap event\n interaction.holdTimers = []; // [{ duration, timeout }]\n});\n\ndefaults.pointerEvents = pointerEvents.defaults;\nmodule.exports = pointerEvents;\n","const pointerEvents = require('./base');\nconst Interaction = require('../Interaction');\n\npointerEvents.signals.on('new', onNew);\npointerEvents.signals.on('fired', onFired);\n\nfor (const signal of ['move', 'up', 'cancel', 'endall']) {\n Interaction.signals.on(signal, endHoldRepeat);\n}\n\nfunction onNew ({ pointerEvent }) {\n if (pointerEvent.type !== 'hold') { return; }\n\n pointerEvent.count = (pointerEvent.count || 0) + 1;\n}\n\nfunction onFired ({ interaction, pointerEvent, eventTarget, targets }) {\n if (pointerEvent.type !== 'hold' || !targets.length) { return; }\n\n // get the repeat interval from the first eventable\n const interval = targets[0].eventable.options.holdRepeatInterval;\n\n // don't repeat if the interval is 0 or less\n if (interval <= 0) { return; }\n\n // set a timeout to fire the holdrepeat event\n interaction.holdIntervalHandle = setTimeout(function () {\n pointerEvents.fire({\n interaction,\n eventTarget,\n type: 'hold',\n pointer: pointerEvent,\n event: pointerEvent,\n });\n }, interval);\n}\n\nfunction endHoldRepeat ({ interaction }) {\n // set the interaction's holdStopTime property\n // to stop further holdRepeat events\n if (interaction.holdIntervalHandle) {\n clearInterval(interaction.holdIntervalHandle);\n interaction.holdIntervalHandle = null;\n }\n}\n\n// don't repeat by default\npointerEvents.defaults.holdRepeatInterval = 0;\npointerEvents.types.push('holdrepeat');\n\nmodule.exports = {\n onNew,\n onFired,\n endHoldRepeat,\n};\n","const pointerEvents = require('./base');\nconst Interactable = require('../Interactable');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\nconst scope = require('../scope');\nconst extend = require('../utils/extend');\nconst { merge } = require('../utils/arr');\n\npointerEvents.signals.on('collect-targets', function ({ targets, element, type, eventTarget }) {\n function collectSelectors (interactable, selector, context) {\n const els = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && is.element(element)\n && domUtils.matchesSelector(element, selector, els)\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n const interactable = scope.interactables.get(element);\n\n if (interactable) {\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n scope.interactables.forEachSelector(collectSelectors, element);\n});\n\nInteractable.signals.on('new', function ({ interactable }) {\n interactable.events.getRect = function (element) {\n return interactable.getRect(element);\n };\n});\n\nInteractable.signals.on('set', function ({ interactable, options }) {\n extend(interactable.events.options, pointerEvents.defaults);\n extend(interactable.events.options, options);\n});\n\nmerge(Interactable.eventTypes, pointerEvents.types);\n\nInteractable.prototype.pointerEvents = function (options) {\n extend(this.events.options, options);\n\n return this;\n};\n\nconst __backCompatOption = Interactable.prototype._backCompatOption;\n\nInteractable.prototype._backCompatOption = function (optionName, newValue) {\n const ret = __backCompatOption.call(this, optionName, newValue);\n\n if (ret === this) {\n this.events.options[optionName] = newValue;\n }\n\n return ret;\n};\n\nInteractable.settingsMethods.push('pointerEvents');\n","const utils = require('./utils');\nconst events = require('./utils/events');\nconst signals = require('./utils/Signals').new();\n\nconst scope = {\n signals,\n events,\n utils,\n\n // main document\n document: require('./utils/domObjects').document,\n // all documents being listened to\n documents: [],\n\n addDocument: function (doc, win) {\n // do nothing if document is already known\n if (utils.contains(scope.documents, doc)) { return false; }\n\n win = win || scope.getWindow(doc);\n\n scope.documents.push(doc);\n events.documents.push(doc);\n\n // don't add an unload event for the main document\n // so that the page may be cached in browser history\n if (doc !== scope.document) {\n events.add(win, 'unload', scope.onWindowUnload);\n }\n\n signals.fire('add-document', { doc, win });\n },\n\n removeDocument: function (doc, win) {\n const index = utils.indexOf(scope.documents, doc);\n\n win = win || scope.getWindow(doc);\n\n events.remove(win, 'unload', scope.onWindowUnload);\n\n scope.documents.splice(index, 1);\n events.documents.splice(index, 1);\n\n signals.fire('remove-document', { win, doc });\n },\n\n onWindowUnload: function () {\n scope.removeDocument(this.document, this);\n },\n};\n\nmodule.exports = scope;\n","const { indexOf } = require('./arr');\n\nclass Signals {\n constructor () {\n this.listeners = {\n // signalName: [listeners],\n };\n }\n\n on (name, listener) {\n if (!this.listeners[name]) {\n this.listeners[name] = [listener];\n return;\n }\n\n this.listeners[name].push(listener);\n }\n\n off (name, listener) {\n if (!this.listeners[name]) { return; }\n\n const index = indexOf(this.listeners[name], listener);\n\n if (index !== -1) {\n this.listeners[name].splice(index, 1);\n }\n }\n\n fire (name, arg) {\n const targetListeners = this.listeners[name];\n\n if (!targetListeners) { return; }\n\n for (let i = 0; i < targetListeners.length; i++) {\n if (targetListeners[i](arg, name) === false) {\n return;\n }\n }\n }\n}\n\nSignals.new = function () {\n return new Signals();\n};\n\nmodule.exports = Signals;\n","function indexOf (array, target) {\n for (let i = 0, len = array.length; i < len; i++) {\n if (array[i] === target) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction contains (array, target) {\n return indexOf(array, target) !== -1;\n}\n\nfunction merge (target, source) {\n for (let i = 0; i < source.length; i++) {\n target.push(source[i]);\n }\n\n return target;\n}\n\nfunction filter (array, test) {\n const result = [];\n\n for (let i = 0; i < array.length; i++) {\n if (test(array[i])) {\n result.push(array[i]);\n }\n }\n\n return result;\n}\n\nmodule.exports = {\n indexOf,\n contains,\n merge,\n filter,\n};\n","const { window } = require('./window');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst Element = domObjects.Element;\nconst navigator = window.navigator;\n\nconst browser = {\n // Does the browser support touch input?\n supportsTouch: !!(('ontouchstart' in window) || is.function(window.DocumentTouch)\n && domObjects.document instanceof window.DocumentTouch),\n\n // Does the browser support PointerEvents\n supportsPointerEvent: !!domObjects.PointerEvent,\n\n isIE8: ('attachEvent' in window) && !('addEventListener' in window),\n\n // Opera Mobile must be handled differently\n isOperaMobile: (navigator.appName === 'Opera'\n && browser.supportsTouch\n && navigator.userAgent.match('Presto')),\n\n // scrolling doesn't change the result of getClientRects on iOS 7\n isIOS7: (/iP(hone|od|ad)/.test(navigator.platform)\n && /OS 7[^\\d]/.test(navigator.appVersion)),\n\n isIe9OrOlder: /MSIE (8|9)/.test(navigator.userAgent),\n\n // prefix matchesSelector\n prefixedMatchesSelector: 'matches' in Element.prototype\n ? 'matches': 'webkitMatchesSelector' in Element.prototype\n ? 'webkitMatchesSelector': 'mozMatchesSelector' in Element.prototype\n ? 'mozMatchesSelector': 'oMatchesSelector' in Element.prototype\n ? 'oMatchesSelector': 'msMatchesSelector',\n\n useMatchesSelectorPolyfill: false,\n\n pEventTypes: (domObjects.PointerEvent\n ? (domObjects.PointerEvent === window.MSPointerEvent\n ? {\n up: 'MSPointerUp',\n down: 'MSPointerDown',\n over: 'mouseover',\n out: 'mouseout',\n move: 'MSPointerMove',\n cancel: 'MSPointerCancel',\n }\n : {\n up: 'pointerup',\n down: 'pointerdown',\n over: 'pointerover',\n out: 'pointerout',\n move: 'pointermove',\n cancel: 'pointercancel',\n })\n : null),\n\n // because Webkit and Opera still use 'mousewheel' event type\n wheelEvent: 'onmousewheel' in domObjects.document? 'mousewheel': 'wheel',\n\n};\n\nbrowser.useMatchesSelectorPolyfill = !is.function(Element.prototype[browser.prefixedMatchesSelector]);\n\nmodule.exports = browser;\n","const domObjects = {};\nconst win = require('./window').window;\n\nfunction blank () {}\n\ndomObjects.document = win.document;\ndomObjects.DocumentFragment = win.DocumentFragment || blank;\ndomObjects.SVGElement = win.SVGElement || blank;\ndomObjects.SVGSVGElement = win.SVGSVGElement || blank;\ndomObjects.SVGElementInstance = win.SVGElementInstance || blank;\ndomObjects.Element = win.Element || blank;\ndomObjects.HTMLElement = win.HTMLElement || domObjects.Element;\n\ndomObjects.Event = win.Event;\ndomObjects.Touch = win.Touch || blank;\ndomObjects.PointerEvent = (win.PointerEvent || win.MSPointerEvent);\n\nmodule.exports = domObjects;\n","const win = require('./window');\nconst browser = require('./browser');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst domUtils = {\n nodeContains: function (parent, child) {\n while (child) {\n if (child === parent) {\n return true;\n }\n\n child = child.parentNode;\n }\n\n return false;\n },\n\n closest: function (element, selector) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) { return element; }\n\n element = domUtils.parentNode(element);\n }\n\n return null;\n },\n\n parentNode: function (node) {\n let parent = node.parentNode;\n\n if (is.docFrag(parent)) {\n // skip past #shado-root fragments\n while ((parent = parent.host) && is.docFrag(parent)) {\n continue;\n }\n\n return parent;\n }\n\n return parent;\n },\n\n // taken from http://tanalin.com/en/blog/2012/12/matches-selector-ie8/ and modified\n matchesSelectorPolyfill: browser.useMatchesSelectorPolyfill\n ? function (element, selector, elems) {\n elems = elems || element.parentNode.querySelectorAll(selector);\n\n for (let i = 0, len = elems.length; i < len; i++) {\n if (elems[i] === element) {\n return true;\n }\n }\n\n return false;\n }\n : null,\n\n matchesSelector: function (element, selector, nodeList) {\n if (browser.useMatchesSelectorPolyfill) {\n return domUtils.matchesSelectorPolyfill(element, selector, nodeList);\n }\n\n // remove /deep/ from selectors if shadowDOM polyfill is used\n if (win.window !== win.realWindow) {\n selector = selector.replace(/\\/deep\\//g, ' ');\n }\n\n return element[browser.prefixedMatchesSelector](selector);\n },\n\n // Test for the element that's \"above\" all other qualifiers\n indexOfDeepestElement: function (elements) {\n let deepestZoneParents = [];\n let dropzoneParents = [];\n let dropzone;\n let deepestZone = elements[0];\n let index = deepestZone? 0: -1;\n let parent;\n let child;\n let i;\n let n;\n\n for (i = 1; i < elements.length; i++) {\n dropzone = elements[i];\n\n // an element might belong to multiple selector dropzones\n if (!dropzone || dropzone === deepestZone) {\n continue;\n }\n\n if (!deepestZone) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n // check if the deepest or current are document.documentElement or document.rootElement\n // - if the current dropzone is, do nothing and continue\n if (dropzone.parentNode === dropzone.ownerDocument) {\n continue;\n }\n // - if deepest is, update with the current dropzone and continue to next\n else if (deepestZone.parentNode === dropzone.ownerDocument) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n if (!deepestZoneParents.length) {\n parent = deepestZone;\n while (parent.parentNode && parent.parentNode !== parent.ownerDocument) {\n deepestZoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n }\n\n // if this element is an svg element and the current deepest is\n // an HTMLElement\n if (deepestZone instanceof domObjects.HTMLElement\n && dropzone instanceof domObjects.SVGElement\n && !(dropzone instanceof domObjects.SVGSVGElement)) {\n\n if (dropzone === deepestZone.parentNode) {\n continue;\n }\n\n parent = dropzone.ownerSVGElement;\n }\n else {\n parent = dropzone;\n }\n\n dropzoneParents = [];\n\n while (parent.parentNode !== parent.ownerDocument) {\n dropzoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n\n n = 0;\n\n // get (position of last common ancestor) + 1\n while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) {\n n++;\n }\n\n const parents = [\n dropzoneParents[n - 1],\n dropzoneParents[n],\n deepestZoneParents[n],\n ];\n\n child = parents[0].lastChild;\n\n while (child) {\n if (child === parents[1]) {\n deepestZone = dropzone;\n index = i;\n deepestZoneParents = [];\n\n break;\n }\n else if (child === parents[2]) {\n break;\n }\n\n child = child.previousSibling;\n }\n }\n\n return index;\n },\n\n matchesUpTo: function (element, selector, limit) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) {\n return true;\n }\n\n element = domUtils.parentNode(element);\n\n if (element === limit) {\n return domUtils.matchesSelector(element, selector);\n }\n }\n\n return false;\n },\n\n getActualElement: function (element) {\n return (element instanceof domObjects.SVGElementInstance\n ? element.correspondingUseElement\n : element);\n },\n\n getScrollXY: function (relevantWindow) {\n relevantWindow = relevantWindow || win.window;\n return {\n x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft,\n y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop,\n };\n },\n\n getElementClientRect: function (element) {\n const clientRect = (element instanceof domObjects.SVGElement\n ? element.getBoundingClientRect()\n : element.getClientRects()[0]);\n\n return clientRect && {\n left : clientRect.left,\n right : clientRect.right,\n top : clientRect.top,\n bottom: clientRect.bottom,\n width : clientRect.width || clientRect.right - clientRect.left,\n height: clientRect.height || clientRect.bottom - clientRect.top,\n };\n },\n\n getElementRect: function (element) {\n const clientRect = domUtils.getElementClientRect(element);\n\n if (!browser.isIOS7 && clientRect) {\n const scroll = domUtils.getScrollXY(win.getWindow(element));\n\n clientRect.left += scroll.x;\n clientRect.right += scroll.x;\n clientRect.top += scroll.y;\n clientRect.bottom += scroll.y;\n }\n\n return clientRect;\n },\n\n getPath: function (element) {\n const path = [];\n\n while (element) {\n path.push(element);\n element = domUtils.parentNode(element);\n }\n\n return path;\n },\n\n trySelector: value => {\n if (!is.string(value)) { return false; }\n\n // an exception will be raised if it is invalid\n domObjects.document.querySelector(value);\n return true;\n },\n};\n\nmodule.exports = domUtils;\n","const is = require('./is');\nconst domUtils = require('./domUtils');\nconst pExtend = require('./pointerExtend');\n\nconst { window, getWindow } = require('./window');\nconst { indexOf, contains } = require('./arr');\n\nconst useAttachEvent = ('attachEvent' in window) && !('addEventListener' in window);\nconst addEvent = useAttachEvent? 'attachEvent': 'addEventListener';\nconst removeEvent = useAttachEvent? 'detachEvent': 'removeEventListener';\nconst on = useAttachEvent? 'on': '';\n\nconst elements = [];\nconst targets = [];\nconst attachedListeners = [];\n\n// {\n// type: {\n// selectors: ['selector', ...],\n// contexts : [document, ...],\n// listeners: [[listener, capture, passive], ...]\n// }\n// }\nconst delegatedEvents = {};\n\nconst documents = [];\n\nconst supportsOptions = !useAttachEvent && (() => {\n let supported = false;\n\n window.document.createElement('div').addEventListener('test', null, {\n get capture () { supported = true; },\n });\n\n return supported;\n})();\n\nfunction add (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n let elementIndex = indexOf(elements, element);\n let target = targets[elementIndex];\n\n if (!target) {\n target = {\n events: {},\n typeCount: 0,\n };\n\n elementIndex = elements.push(element) - 1;\n targets.push(target);\n\n attachedListeners.push(useAttachEvent\n ? {\n supplied: [],\n wrapped : [],\n useCount: [],\n }\n : null);\n }\n\n if (!target.events[type]) {\n target.events[type] = [];\n target.typeCount++;\n }\n\n if (!contains(target.events[type], listener)) {\n let ret;\n\n if (useAttachEvent) {\n const { supplied, wrapped, useCount } = attachedListeners[elementIndex];\n const listenerIndex = indexOf(supplied, listener);\n\n const wrappedListener = wrapped[listenerIndex] || function (event) {\n if (!event.immediatePropagationStopped) {\n event.target = event.srcElement;\n event.currentTarget = element;\n\n event.preventDefault = event.preventDefault || preventDef;\n event.stopPropagation = event.stopPropagation || stopProp;\n event.stopImmediatePropagation = event.stopImmediatePropagation || stopImmProp;\n\n if (/mouse|click/.test(event.type)) {\n event.pageX = event.clientX + getWindow(element).document.documentElement.scrollLeft;\n event.pageY = event.clientY + getWindow(element).document.documentElement.scrollTop;\n }\n\n listener(event);\n }\n };\n\n ret = element[addEvent](on + type, wrappedListener, !!options.capture);\n\n if (listenerIndex === -1) {\n supplied.push(listener);\n wrapped.push(wrappedListener);\n useCount.push(1);\n }\n else {\n useCount[listenerIndex]++;\n }\n }\n else {\n ret = element[addEvent](type, listener, supportsOptions? options : !!options.capture);\n }\n target.events[type].push(listener);\n\n return ret;\n }\n}\n\nfunction remove (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const elementIndex = indexOf(elements, element);\n const target = targets[elementIndex];\n\n if (!target || !target.events) {\n return;\n }\n\n let wrappedListener = listener;\n let listeners;\n let listenerIndex;\n\n if (useAttachEvent) {\n listeners = attachedListeners[elementIndex];\n listenerIndex = indexOf(listeners.supplied, listener);\n wrappedListener = listeners.wrapped[listenerIndex];\n }\n\n if (type === 'all') {\n for (type in target.events) {\n if (target.events.hasOwnProperty(type)) {\n remove(element, type, 'all');\n }\n }\n return;\n }\n\n if (target.events[type]) {\n const len = target.events[type].length;\n\n if (listener === 'all') {\n for (let i = 0; i < len; i++) {\n remove(element, type, target.events[type][i], options);\n }\n return;\n }\n else {\n for (let i = 0; i < len; i++) {\n if (target.events[type][i] === listener) {\n element[removeEvent](on + type, wrappedListener, supportsOptions? options : !!options.capture);\n target.events[type].splice(i, 1);\n\n if (useAttachEvent && listeners) {\n listeners.useCount[listenerIndex]--;\n if (listeners.useCount[listenerIndex] === 0) {\n listeners.supplied.splice(listenerIndex, 1);\n listeners.wrapped.splice(listenerIndex, 1);\n listeners.useCount.splice(listenerIndex, 1);\n }\n }\n\n break;\n }\n }\n }\n\n if (target.events[type] && target.events[type].length === 0) {\n target.events[type] = null;\n target.typeCount--;\n }\n }\n\n if (!target.typeCount) {\n targets.splice(elementIndex, 1);\n elements.splice(elementIndex, 1);\n attachedListeners.splice(elementIndex, 1);\n }\n}\n\nfunction addDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n if (!delegatedEvents[type]) {\n delegatedEvents[type] = {\n selectors: [],\n contexts : [],\n listeners: [],\n };\n\n // add delegate listener functions\n for (let i = 0; i < documents.length; i++) {\n add(documents[i], type, delegateListener);\n add(documents[i], type, delegateUseCapture, true);\n }\n }\n\n const delegated = delegatedEvents[type];\n let index;\n\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n break;\n }\n }\n\n if (index === -1) {\n index = delegated.selectors.length;\n\n delegated.selectors.push(selector);\n delegated.contexts .push(context);\n delegated.listeners.push([]);\n }\n\n // keep listener and capture and passive flags\n delegated.listeners[index].push([listener, !!options.capture, options.passive]);\n}\n\nfunction removeDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const delegated = delegatedEvents[type];\n let matchFound = false;\n let index;\n\n if (!delegated) { return; }\n\n // count from last index of delegated to 0\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n // look for matching selector and context Node\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n\n const listeners = delegated.listeners[index];\n\n // each item of the listeners array is an array: [function, capture, passive]\n for (let i = listeners.length - 1; i >= 0; i--) {\n const [fn, capture, passive] = listeners[i];\n\n // check if the listener functions and capture and passive flags match\n if (fn === listener && capture === !!options.capture && passive === options.passive) {\n // remove the listener from the array of listeners\n listeners.splice(i, 1);\n\n // if all listeners for this interactable have been removed\n // remove the interactable from the delegated arrays\n if (!listeners.length) {\n delegated.selectors.splice(index, 1);\n delegated.contexts .splice(index, 1);\n delegated.listeners.splice(index, 1);\n\n // remove delegate function from context\n remove(context, type, delegateListener);\n remove(context, type, delegateUseCapture, true);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegatedEvents[type] = null;\n }\n }\n\n // only remove one listener\n matchFound = true;\n break;\n }\n }\n\n if (matchFound) { break; }\n }\n }\n}\n\n// bound to the interactable context when a DOM event\n// listener is added to a selector interactable\nfunction delegateListener (event, optionalArg) {\n const options = getOptions(optionalArg);\n const fakeEvent = {};\n const delegated = delegatedEvents[event.type];\n const eventTarget = (domUtils.getActualElement(event.path\n ? event.path[0]\n : event.target));\n let element = eventTarget;\n\n // duplicate the event so that currentTarget can be changed\n pExtend(fakeEvent, event);\n\n fakeEvent.originalEvent = event;\n fakeEvent.preventDefault = preventOriginalDefault;\n\n // climb up document tree looking for selector matches\n while (is.element(element)) {\n for (let i = 0; i < delegated.selectors.length; i++) {\n const selector = delegated.selectors[i];\n const context = delegated.contexts[i];\n\n if (domUtils.matchesSelector(element, selector)\n && domUtils.nodeContains(context, eventTarget)\n && domUtils.nodeContains(context, element)) {\n\n const listeners = delegated.listeners[i];\n\n fakeEvent.currentTarget = element;\n\n for (let j = 0; j < listeners.length; j++) {\n const [fn, capture, passive] = listeners[j];\n\n if (capture === !!options.capture && passive === options.passive) {\n fn(fakeEvent);\n }\n }\n }\n }\n\n element = domUtils.parentNode(element);\n }\n}\n\nfunction delegateUseCapture (event) {\n return delegateListener.call(this, event, true);\n}\n\nfunction preventDef () {\n this.returnValue = false;\n}\n\nfunction preventOriginalDefault () {\n this.originalEvent.preventDefault();\n}\n\nfunction stopProp () {\n this.cancelBubble = true;\n}\n\nfunction stopImmProp () {\n this.cancelBubble = true;\n this.immediatePropagationStopped = true;\n}\n\nfunction getOptions (param) {\n return is.object(param)? param : { capture: param };\n}\n\nmodule.exports = {\n add,\n remove,\n\n addDelegate,\n removeDelegate,\n\n delegateListener,\n delegateUseCapture,\n delegatedEvents,\n documents,\n\n useAttachEvent,\n supportsOptions,\n\n _elements: elements,\n _targets: targets,\n _attachedListeners: attachedListeners,\n};\n","module.exports = function extend (dest, source) {\n for (const prop in source) {\n dest[prop] = source[prop];\n }\n return dest;\n};\n","const {\n resolveRectLike,\n rectToXY,\n} = require('./rect');\n\nmodule.exports = function (target, element, action) {\n const actionOptions = target.options[action];\n const actionOrigin = actionOptions && actionOptions.origin;\n const origin = actionOrigin || target.options.origin;\n\n const originRect = resolveRectLike(origin, target, element, [target && element]);\n\n return rectToXY(originRect) || { x: 0, y: 0 };\n};\n","module.exports = (x, y) => Math.sqrt(x * x + y * y);\n","const extend = require('./extend');\nconst win = require('./window');\n\nconst utils = {\n warnOnce: function (method, message) {\n let warned = false;\n\n return function () {\n if (!warned) {\n win.window.console.warn(message);\n warned = true;\n }\n\n return method.apply(this, arguments);\n };\n },\n\n // http://stackoverflow.com/a/5634528/2280888\n _getQBezierValue: function (t, p1, p2, p3) {\n const iT = 1 - t;\n return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3;\n },\n\n getQuadraticCurvePoint: function (startX, startY, cpX, cpY, endX, endY, position) {\n return {\n x: utils._getQBezierValue(position, startX, cpX, endX),\n y: utils._getQBezierValue(position, startY, cpY, endY),\n };\n },\n\n // http://gizma.com/easing/\n easeOutQuad: function (t, b, c, d) {\n t /= d;\n return -c * t*(t-2) + b;\n },\n\n copyAction: function (dest, src) {\n dest.name = src.name;\n dest.axis = src.axis;\n dest.edges = src.edges;\n\n return dest;\n },\n\n is : require('./is'),\n extend : extend,\n hypot : require('./hypot'),\n getOriginXY: require('./getOriginXY'),\n};\n\nextend(utils, require('./arr'));\nextend(utils, require('./domUtils'));\nextend(utils, require('./pointerUtils'));\nextend(utils, require('./rect'));\n\nmodule.exports = utils;\n","const scope = require('../scope');\nconst utils = require('./index');\nconst browser = require('./browser');\n\nconst finder = {\n methodOrder: [ 'simulationResume', 'mouse', 'hasPointer', 'idle' ],\n\n search: function (pointer, eventType, eventTarget) {\n const mouseEvent = (/mouse/i.test(pointer.pointerType || eventType)\n // MSPointerEvent.MSPOINTER_TYPE_MOUSE\n || pointer.pointerType === 4);\n const pointerId = utils.getPointerId(pointer);\n const details = { pointer, pointerId, mouseEvent, eventType, eventTarget };\n\n for (const method of finder.methodOrder) {\n const interaction = finder[method](details);\n\n if (interaction) {\n return interaction;\n }\n }\n },\n\n // try to resume simulation with a new pointer\n simulationResume: function ({ mouseEvent, eventType, eventTarget }) {\n if (!/down|start/i.test(eventType)) {\n return null;\n }\n\n for (const interaction of scope.interactions) {\n let element = eventTarget;\n\n if (interaction.simulation && interaction.simulation.allowResume\n && (interaction.mouse === mouseEvent)) {\n while (element) {\n // if the element is the interaction element\n if (element === interaction.element) {\n return interaction;\n }\n element = utils.parentNode(element);\n }\n }\n }\n\n return null;\n },\n\n // if it's a mouse interaction\n mouse: function ({ pointerId, mouseEvent, eventType }) {\n if (!mouseEvent && (browser.supportsTouch || browser.supportsPointerEvent)) {\n return null;\n }\n\n let firstNonActive;\n\n for (const interaction of scope.interactions) {\n if (interaction.mouse) {\n // if it's a down event, skip interactions with running simulations\n if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; }\n\n // if the interaction is active, return it immediately\n if (interaction.interacting()) {\n return interaction;\n }\n // otherwise save it and look for another active interaction\n else if (!firstNonActive) {\n firstNonActive = interaction;\n }\n }\n }\n\n // if no active mouse interaction was found use the first inactive mouse\n // interaction\n if (firstNonActive) {\n return firstNonActive;\n }\n\n // Find any interaction specifically for mouse.\n // ignore the interaction if the eventType is a mousedown, and a simulation\n // is active\n for (const interaction of scope.interactions) {\n if (interaction.mouse && !(/down/.test(eventType) && interaction.simulation)) {\n return interaction;\n }\n }\n\n return null;\n },\n\n // get interaction that has this pointer\n hasPointer: function ({ pointerId }) {\n for (const interaction of scope.interactions) {\n if (utils.contains(interaction.pointerIds, pointerId)) {\n return interaction;\n }\n }\n },\n\n // get first idle interaction\n idle: function ({ mouseEvent }) {\n for (const interaction of scope.interactions) {\n // if there's already a pointer held down\n if (interaction.pointerIds.length === 1) {\n const target = interaction.target;\n // don't add this pointer if there is a target interactable and it\n // isn't gesturable\n if (target && !target.options.gesture.enabled) {\n continue;\n }\n }\n // maximum of 2 pointers per interaction\n else if (interaction.pointerIds.length >= 2) {\n continue;\n }\n\n if (!interaction.interacting() && (mouseEvent === interaction.mouse)) {\n return interaction;\n }\n }\n\n return null;\n },\n};\n\nmodule.exports = finder;\n","const win = require('./window');\nconst isWindow = require('./isWindow');\n\nconst is = {\n array : () => {},\n\n window : thing => thing === win.window || isWindow(thing),\n\n docFrag : thing => is.object(thing) && thing.nodeType === 11,\n\n object : thing => !!thing && (typeof thing === 'object'),\n\n function: thing => typeof thing === 'function',\n\n number : thing => typeof thing === 'number' ,\n\n bool : thing => typeof thing === 'boolean' ,\n\n string : thing => typeof thing === 'string' ,\n\n element: thing => {\n if (!thing || (typeof thing !== 'object')) { return false; }\n\n const _window = win.getWindow(thing) || win.window;\n\n return (/object|function/.test(typeof _window.Element)\n ? thing instanceof _window.Element //DOM2\n : thing.nodeType === 1 && typeof thing.nodeName === 'string');\n },\n};\n\nis.array = thing => (is.object(thing)\n && (typeof thing.length !== 'undefined')\n && is.function(thing.splice));\n\nmodule.exports = is;\n","module.exports = (thing) => !!(thing && thing.Window) && (thing instanceof thing.Window);\n","function pointerExtend (dest, source) {\n for (const prop in source) {\n const prefixedPropREs = module.exports.prefixedPropREs;\n let deprecated = false;\n\n // skip deprecated prefixed properties\n for (const vendor in prefixedPropREs) {\n if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) {\n deprecated = true;\n break;\n }\n }\n\n if (!deprecated && typeof source[prop] !== 'function') {\n dest[prop] = source[prop];\n }\n }\n return dest;\n}\n\npointerExtend.prefixedPropREs = {\n webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/,\n};\n\nmodule.exports = pointerExtend;\n","const hypot = require('./hypot');\nconst browser = require('./browser');\nconst dom = require('./domObjects');\nconst domUtils = require('./domUtils');\nconst is = require('./is');\nconst pointerExtend = require('./pointerExtend');\n\nconst pointerUtils = {\n copyCoords: function (dest, src) {\n dest.page = dest.page || {};\n dest.page.x = src.page.x;\n dest.page.y = src.page.y;\n\n dest.client = dest.client || {};\n dest.client.x = src.client.x;\n dest.client.y = src.client.y;\n\n dest.timeStamp = src.timeStamp;\n },\n\n setCoordDeltas: function (targetObj, prev, cur) {\n targetObj.page.x = cur.page.x - prev.page.x;\n targetObj.page.y = cur.page.y - prev.page.y;\n targetObj.client.x = cur.client.x - prev.client.x;\n targetObj.client.y = cur.client.y - prev.client.y;\n targetObj.timeStamp = cur.timeStamp - prev.timeStamp;\n\n // set pointer velocity\n const dt = Math.max(targetObj.timeStamp / 1000, 0.001);\n\n targetObj.page.speed = hypot(targetObj.page.x, targetObj.page.y) / dt;\n targetObj.page.vx = targetObj.page.x / dt;\n targetObj.page.vy = targetObj.page.y / dt;\n\n targetObj.client.speed = hypot(targetObj.client.x, targetObj.page.y) / dt;\n targetObj.client.vx = targetObj.client.x / dt;\n targetObj.client.vy = targetObj.client.y / dt;\n },\n\n isNativePointer: function (pointer) {\n return (pointer instanceof dom.Event || pointer instanceof dom.Touch);\n },\n\n // Get specified X/Y coords for mouse or event.touches[0]\n getXY: function (type, pointer, xy) {\n xy = xy || {};\n type = type || 'page';\n\n xy.x = pointer[type + 'X'];\n xy.y = pointer[type + 'Y'];\n\n return xy;\n },\n\n getPageXY: function (pointer, page) {\n page = page || {};\n\n // Opera Mobile handles the viewport and scrolling oddly\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n pointerUtils.getXY('screen', pointer, page);\n\n page.x += window.scrollX;\n page.y += window.scrollY;\n }\n else {\n pointerUtils.getXY('page', pointer, page);\n }\n\n return page;\n },\n\n getClientXY: function (pointer, client) {\n client = client || {};\n\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n // Opera Mobile handles the viewport and scrolling oddly\n pointerUtils.getXY('screen', pointer, client);\n }\n else {\n pointerUtils.getXY('client', pointer, client);\n }\n\n return client;\n },\n\n getPointerId: function (pointer) {\n return is.number(pointer.pointerId)? pointer.pointerId : pointer.identifier;\n },\n\n setCoords: function (targetObj, pointers, timeStamp) {\n const pointer = (pointers.length > 1\n ? pointerUtils.pointerAverage(pointers)\n : pointers[0]);\n\n const tmpXY = {};\n\n pointerUtils.getPageXY(pointer, tmpXY);\n targetObj.page.x = tmpXY.x;\n targetObj.page.y = tmpXY.y;\n\n pointerUtils.getClientXY(pointer, tmpXY);\n targetObj.client.x = tmpXY.x;\n targetObj.client.y = tmpXY.y;\n\n targetObj.timeStamp = is.number(timeStamp) ? timeStamp :new Date().getTime();\n },\n\n pointerExtend: pointerExtend,\n\n getTouchPair: function (event) {\n const touches = [];\n\n // array of touches is supplied\n if (is.array(event)) {\n touches[0] = event[0];\n touches[1] = event[1];\n }\n // an event\n else {\n if (event.type === 'touchend') {\n if (event.touches.length === 1) {\n touches[0] = event.touches[0];\n touches[1] = event.changedTouches[0];\n }\n else if (event.touches.length === 0) {\n touches[0] = event.changedTouches[0];\n touches[1] = event.changedTouches[1];\n }\n }\n else {\n touches[0] = event.touches[0];\n touches[1] = event.touches[1];\n }\n }\n\n return touches;\n },\n\n pointerAverage: function (pointers) {\n const average = {\n pageX : 0,\n pageY : 0,\n clientX: 0,\n clientY: 0,\n screenX: 0,\n screenY: 0,\n };\n\n for (const pointer of pointers) {\n for (const prop in average) {\n average[prop] += pointer[prop];\n }\n }\n for (const prop in average) {\n average[prop] /= pointers.length;\n }\n\n return average;\n },\n\n touchBBox: function (event) {\n if (!event.length && !(event.touches && event.touches.length > 1)) {\n return;\n }\n\n const touches = pointerUtils.getTouchPair(event);\n const minX = Math.min(touches[0].pageX, touches[1].pageX);\n const minY = Math.min(touches[0].pageY, touches[1].pageY);\n const maxX = Math.max(touches[0].pageX, touches[1].pageX);\n const maxY = Math.max(touches[0].pageY, touches[1].pageY);\n\n return {\n x: minX,\n y: minY,\n left: minX,\n top: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n },\n\n touchDistance: function (event, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n\n\n const dx = touches[0][sourceX] - touches[1][sourceX];\n const dy = touches[0][sourceY] - touches[1][sourceY];\n\n return hypot(dx, dy);\n },\n\n touchAngle: function (event, prevAngle, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n const dx = touches[1][sourceX] - touches[0][sourceX];\n const dy = touches[1][sourceY] - touches[0][sourceY];\n const angle = 180 * Math.atan2(dy , dx) / Math.PI;\n\n return angle;\n },\n\n getPointerType: function (pointer, interaction) {\n // if the PointerEvent API isn't available, then the pointer must be ither\n // a MouseEvent or TouchEvent\n if (interaction.mouse) { return 'mouse'; }\n if (!browser.supportsPointerEvent) { return 'touch'; }\n\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : [undefined, undefined,'touch', 'pen', 'mouse'][pointer.pointerType];\n },\n\n // [ event.target, event.currentTarget ]\n getEventTargets: function (event) {\n return [\n domUtils.getActualElement(event.path ? event.path[0] : event.target),\n domUtils.getActualElement(event.currentTarget),\n ];\n },\n};\n\nmodule.exports = pointerUtils;\n","const { window } = require('./window');\n\nconst vendors = ['ms', 'moz', 'webkit', 'o'];\nlet lastTime = 0;\nlet request;\nlet cancel;\n\nfor (let x = 0; x < vendors.length && !window.requestAnimationFrame; x++) {\n request = window[vendors[x] + 'RequestAnimationFrame'];\n cancel = window[vendors[x] +'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n}\n\nif (!request) {\n request = function (callback) {\n const currTime = new Date().getTime();\n const timeToCall = Math.max(0, 16 - (currTime - lastTime));\n const id = setTimeout(function () { callback(currTime + timeToCall); },\n timeToCall);\n\n lastTime = currTime + timeToCall;\n return id;\n };\n}\n\nif (!cancel) {\n cancel = function (id) {\n clearTimeout(id);\n };\n}\n\nmodule.exports = {\n request,\n cancel,\n};\n","const extend = require('./extend');\nconst is = require('./is');\nconst {\n closest,\n parentNode,\n getElementRect,\n} = require('./domUtils');\n\nconst rectUtils = {\n getStringOptionResult: function (value, interactable, element) {\n if (!is.string(value)) {\n return null;\n }\n\n if (value === 'parent') {\n value = parentNode(element);\n }\n else if (value === 'self') {\n value = interactable.getRect(element);\n }\n else {\n value = closest(element, value);\n }\n\n return value;\n },\n\n resolveRectLike: function (value, interactable, element, functionArgs) {\n value = rectUtils.getStringOptionResult(value, interactable, element) || value;\n\n if (is.function(value)) {\n value = value.apply(null, functionArgs);\n }\n\n if (is.element(value)) {\n value = getElementRect(value);\n }\n\n return value;\n },\n\n rectToXY: function (rect) {\n return rect && {\n x: 'x' in rect ? rect.x : rect.left,\n y: 'y' in rect ? rect.y : rect.top,\n };\n },\n\n xywhToTlbr: function (rect) {\n if (rect && !('left' in rect && 'top' in rect)) {\n rect = extend({}, rect);\n\n rect.left = rect.x || 0;\n rect.top = rect.y || 0;\n rect.right = rect.right || (rect.left + rect.width);\n rect.bottom = rect.bottom || (rect.top + rect.height);\n }\n\n return rect;\n },\n\n tlbrToXywh: function (rect) {\n if (rect && !('x' in rect && 'y' in rect)) {\n rect = extend({}, rect);\n\n rect.x = rect.left || 0;\n rect.top = rect.top || 0;\n rect.width = rect.width || (rect.right - rect.x);\n rect.height = rect.height || (rect.bottom - rect.y);\n }\n\n return rect;\n },\n};\n\nmodule.exports = rectUtils;\n","const win = module.exports;\nconst isWindow = require('./isWindow');\n\nfunction init (window) {\n // get wrapped window if using Shadow DOM polyfill\n\n win.realWindow = window;\n\n // create a TextNode\n const el = window.document.createTextNode('');\n\n // check if it's wrapped by a polyfill\n if (el.ownerDocument !== window.document\n && typeof window.wrap === 'function'\n && window.wrap(el) === el) {\n // use wrapped window\n window = window.wrap(window);\n }\n\n win.window = window;\n}\n\nif (typeof window === 'undefined') {\n win.window = undefined;\n win.realWindow = undefined;\n}\nelse {\n init(window);\n}\n\nwin.getWindow = function getWindow (node) {\n if (isWindow(node)) {\n return node;\n }\n\n const rootNode = (node.ownerDocument || node);\n\n return rootNode.defaultView || rootNode.parentWindow || win.window;\n};\n\nwin.init = init;\n"]} \ No newline at end of file +{"version":3,"sources":["src/header.js","node_modules/browser-pack/_prelude.js","index.js","src/Eventable.js","src/InteractEvent.js","src/Interactable.js","src/Interaction.js","src/actions/base.js","src/actions/drag.js","src/actions/drop.js","src/actions/gesture.js","src/actions/resize.js","src/autoScroll.js","src/autoStart/InteractableMethods.js","src/autoStart/base.js","src/autoStart/delay.js","src/autoStart/drag.js","src/autoStart/gesture.js","src/autoStart/resize.js","src/defaultOptions.js","src/index.js","src/inertia.js","src/interact.js","src/interactablePreventDefault.js","src/legacyBrowsers.js","src/modifiers/index.js","src/modifiers/restrict.js","src/modifiers/restrictEdges.js","src/modifiers/restrictSize.js","src/modifiers/snap.js","src/modifiers/snapSize.js","src/pointerEvents/PointerEvent.js","src/pointerEvents/base.js","src/pointerEvents/holdRepeat.js","src/pointerEvents/interactableTargets.js","src/scope.js","src/utils/Signals.js","src/utils/arr.js","src/utils/browser.js","src/utils/domObjects.js","src/utils/domUtils.js","src/utils/events.js","src/utils/extend.js","src/utils/getOriginXY.js","src/utils/hypot.js","src/utils/index.js","src/utils/interactionFinder.js","src/utils/is.js","src/utils/isWindow.js","src/utils/pointerExtend.js","src/utils/pointerUtils.js","src/utils/raf.js","src/utils/rect.js","src/utils/window.js"],"names":[],"mappings":";AAAA;AACA;AACA;AACA;AACA;AACA;ACLA,ADMA;AACA;;AEPA;;;;;;;;AAQA,IAAI,OAAO,MAAP,KAAkB,WAAtB,EAAmC;AACjC,SAAO,OAAP,GAAiB,UAAU,MAAV,EAAkB;AACjC,YAAQ,oBAAR,EAA8B,IAA9B,CAAmC,MAAnC;;AAEA,WAAO,QAAQ,aAAR,CAAP;AACD,GAJD;AAKD,CAND,MAOK;AACH,SAAO,OAAP,GAAiB,QAAQ,aAAR,CAAjB;AACD;;;;;;;eCjBmB,QAAQ,aAAR,C;IAAZ,O,YAAA,O;;AACR,IAAM,SAAS,QAAQ,mBAAR,CAAf;;AAEA,SAAS,yBAAT,CAAoC,KAApC,EAA2C,SAA3C,EAAsD;AACpD,OAAK,IAAI,IAAI,CAAR,EAAW,MAAM,UAAU,MAAhC,EAAwC,IAAI,GAAJ,IAAW,CAAC,MAAM,2BAA1D,EAAuF,GAAvF,EAA4F;AAC1F,cAAU,CAAV,EAAa,KAAb;AACD;AACF;;IAEK,S;AAEJ,qBAAa,OAAb,EAAsB;AAAA;;AACpB,SAAK,OAAL,GAAe,OAAO,EAAP,EAAW,WAAW,EAAtB,CAAf;AACD;;sBAED,I,iBAAM,K,EAAO;AACX,QAAI,kBAAJ;AACA,QAAM,UAAU,OAAO,MAAM,IAA7B;AACA,QAAM,SAAS,KAAK,MAApB;;AAEA;AACA,QAAK,YAAY,KAAK,MAAM,IAAX,CAAjB,EAAoC;AAClC,gCAA0B,KAA1B,EAAiC,SAAjC;AACD;;AAED;AACA,QAAI,KAAK,OAAL,CAAJ,EAAmB;AACjB,WAAK,OAAL,EAAc,KAAd;AACD;;AAED;AACA,QAAI,CAAC,MAAM,kBAAP,IAA6B,MAA7B,KAAwC,YAAY,OAAO,MAAM,IAAb,CAApD,CAAJ,EAA8E;AAC5E,gCAA0B,KAA1B,EAAiC,SAAjC;AACD;AACF,G;;sBAED,E,eAAI,S,EAAW,Q,EAAU;AACvB;AACA,QAAI,KAAK,SAAL,CAAJ,EAAqB;AACnB,WAAK,SAAL,EAAgB,IAAhB,CAAqB,QAArB;AACD,KAFD,MAGK;AACH,WAAK,SAAL,IAAkB,CAAC,QAAD,CAAlB;AACD;AACF,G;;sBAED,G,gBAAK,S,EAAW,Q,EAAU;AACxB;AACA,QAAM,YAAY,KAAK,SAAL,CAAlB;AACA,QAAM,QAAY,YAAW,QAAQ,SAAR,EAAmB,QAAnB,CAAX,GAA0C,CAAC,CAA7D;;AAEA,QAAI,UAAU,CAAC,CAAf,EAAkB;AAChB,gBAAU,MAAV,CAAiB,KAAjB,EAAwB,CAAxB;AACD;;AAED,QAAI,aAAa,UAAU,MAAV,KAAqB,CAAlC,IAAuC,CAAC,QAA5C,EAAsD;AACpD,WAAK,SAAL,IAAkB,QAAlB;AACD;AACF,G;;;;;AAGH,OAAO,OAAP,GAAiB,SAAjB;;;;;;;AC7DA,IAAM,SAAc,QAAQ,gBAAR,CAApB;AACA,IAAM,cAAc,QAAQ,qBAAR,CAApB;AACA,IAAM,WAAc,QAAQ,kBAAR,CAApB;AACA,IAAM,UAAc,QAAQ,iBAAR,EAA2B,GAA3B,EAApB;;IAEM,a;AACJ,yBAAa,WAAb,EAA0B,KAA1B,EAAiC,MAAjC,EAAyC,KAAzC,EAAgD,OAAhD,EAAyD,OAAzD,EAAkF;AAAA,QAAhB,MAAgB,uEAAP,KAAO;;AAAA;;AAChF,QAAM,SAAc,YAAY,MAAhC;AACA,QAAM,cAAc,CAAC,UAAU,OAAO,OAAjB,IAA4B,QAA7B,EAAuC,WAA3D;AACA,QAAM,SAAc,YAAY,MAAZ,EAAoB,OAApB,EAA6B,MAA7B,CAApB;AACA,QAAM,WAAc,UAAU,OAA9B;AACA,QAAM,SAAc,UAAU,KAA9B;AACA,QAAM,SAAc,WAAU,YAAY,WAAtB,GAAoC,YAAY,SAApE;AACA,QAAM,YAAc,YAAY,SAAhC;;AAEA,cAAU,WAAW,YAAY,OAAjC;;AAEA,QAAM,OAAS,OAAO,EAAP,EAAW,OAAO,IAAlB,CAAf;AACA,QAAM,SAAS,OAAO,EAAP,EAAW,OAAO,MAAlB,CAAf;;AAEA,SAAK,CAAL,IAAU,OAAO,CAAjB;AACA,SAAK,CAAL,IAAU,OAAO,CAAjB;;AAEA,WAAO,CAAP,IAAY,OAAO,CAAnB;AACA,WAAO,CAAP,IAAY,OAAO,CAAnB;;AAEA,SAAK,OAAL,GAAqB,MAAM,OAA3B;AACA,SAAK,MAAL,GAAqB,MAAM,MAA3B;AACA,SAAK,QAAL,GAAqB,MAAM,QAA3B;AACA,SAAK,OAAL,GAAqB,MAAM,OAA3B;AACA,SAAK,MAAL,GAAqB,MAAM,MAA3B;AACA,SAAK,OAAL,GAAqB,MAAM,OAA3B;AACA,SAAK,MAAL,GAAqB,OAArB;AACA,SAAK,aAAL,GAAqB,OAArB;AACA,SAAK,aAAL,GAAqB,WAAW,IAAhC;AACA,SAAK,MAAL,GAAqB,MAArB;AACA,SAAK,IAAL,GAAqB,UAAU,SAAS,EAAnB,CAArB;AACA,SAAK,WAAL,GAAqB,WAArB;AACA,SAAK,YAAL,GAAqB,MAArB;;AAEA,SAAK,EAAL,GAAU,WAAW,YAAY,SAAZ,CAAsB,YAAY,SAAZ,CAAsB,MAAtB,GAA+B,CAArD,CAAX,GACW,UAAU,EAD/B;;AAGA,QAAM,YAAY;AAChB,8BADgB;AAEhB,kBAFgB;AAGhB,oBAHgB;AAIhB,kBAJgB;AAKhB,sBALgB;AAMhB,sBANgB;AAOhB,gBAPgB;AAQhB,oBARgB;AAShB,oBATgB;AAUhB,wBAVgB;AAWhB,oBAXgB;AAYhB,8BAZgB;AAahB,cAAQ;AAbQ,KAAlB;;AAgBA,YAAQ,IAAR,CAAa,QAAb,EAAuB,SAAvB;;AAEA,QAAI,MAAJ,EAAY;AACV;AACA,WAAK,KAAL,GAAa,UAAU,KAAvB;AACA,WAAK,KAAL,GAAa,UAAU,KAAvB;AACA,WAAK,OAAL,GAAe,UAAU,OAAzB;AACA,WAAK,OAAL,GAAe,UAAU,OAAzB;AACD,KAND,MAOK;AACH,WAAK,KAAL,GAAiB,KAAK,CAAtB;AACA,WAAK,KAAL,GAAiB,KAAK,CAAtB;AACA,WAAK,OAAL,GAAiB,OAAO,CAAxB;AACA,WAAK,OAAL,GAAiB,OAAO,CAAxB;AACD;;AAED,SAAK,EAAL,GAAiB,YAAY,WAAZ,CAAwB,IAAxB,CAA6B,CAA7B,GAAiC,OAAO,CAAzD;AACA,SAAK,EAAL,GAAiB,YAAY,WAAZ,CAAwB,IAAxB,CAA6B,CAA7B,GAAiC,OAAO,CAAzD;AACA,SAAK,QAAL,GAAiB,YAAY,WAAZ,CAAwB,MAAxB,CAA+B,CAA/B,GAAmC,OAAO,CAA3D;AACA,SAAK,QAAL,GAAiB,YAAY,WAAZ,CAAwB,MAAxB,CAA+B,CAA/B,GAAmC,OAAO,CAA3D;;AAEA,YAAQ,IAAR,CAAa,WAAb,EAA0B,SAA1B;;AAEA,SAAK,SAAL,GAAiB,OAAO,SAAxB;AACA,SAAK,EAAL,GAAiB,YAAY,YAAZ,CAAyB,SAA1C;AACA,SAAK,QAAL,GAAiB,KAAK,SAAL,GAAiB,KAAK,EAAvC;;AAEA;AACA,SAAK,KAAL,GAAa,YAAY,YAAZ,CAAyB,WAAzB,EAAsC,KAAnD;AACA,SAAK,SAAL,GAAiB,YAAY,YAAZ,CAAyB,WAAzB,EAAsC,EAAvD;AACA,SAAK,SAAL,GAAiB,YAAY,YAAZ,CAAyB,WAAzB,EAAsC,EAAvD;;AAEA,SAAK,KAAL,GAAc,UAAU,UAAU,cAArB,GAAsC,KAAK,QAAL,EAAtC,GAAwD,IAArE;;AAEA,YAAQ,IAAR,CAAa,KAAb,EAAoB,SAApB;AACD;;0BAED,Q,uBAAY;AACV,QAAM,cAAc,KAAK,WAAzB;;AAEA,QAAI,YAAY,SAAZ,CAAsB,KAAtB,GAA8B,GAA9B,IACG,KAAK,SAAL,GAAiB,YAAY,SAAZ,CAAsB,SAAvC,GAAmD,GAD1D,EAC+D;AAC7D,aAAO,IAAP;AACD;;AAED,QAAI,QAAQ,MAAM,KAAK,KAAL,CAAW,YAAY,SAAZ,CAAsB,SAAjC,EAA4C,YAAY,SAAZ,CAAsB,SAAlE,CAAN,GAAqF,KAAK,EAAtG;AACA,QAAM,UAAU,IAAhB;;AAEA,QAAI,QAAQ,CAAZ,EAAe;AACb,eAAS,GAAT;AACD;;AAED,QAAM,OAAO,MAAM,OAAN,IAAiB,KAAjB,IAA0B,QAAQ,MAAM,OAArD;AACA,QAAM,KAAO,MAAM,OAAN,IAAiB,KAAjB,IAA0B,QAAQ,MAAM,OAArD;;AAEA,QAAM,QAAQ,CAAC,IAAD,KAAU,MAAM,OAAN,IAAiB,KAAjB,IAA0B,QAAS,KAAK,OAAlD,CAAd;AACA,QAAM,OAAQ,CAAC,EAAD,IAAW,KAAK,OAAL,IAAgB,KAA3B,IAAoC,QAAQ,MAAM,OAAhE;;AAEA,WAAO;AACL,YADK;AAEL,gBAFK;AAGL,gBAHK;AAIL,kBAJK;AAKL,kBALK;AAML,aAAO,YAAY,SAAZ,CAAsB,KANxB;AAOL,gBAAU;AACR,WAAG,YAAY,SAAZ,CAAsB,SADjB;AAER,WAAG,YAAY,SAAZ,CAAsB;AAFjB;AAPL,KAAP;AAYD,G;;0BAED,c,6BAAkB,CAAE,C;;0BAEpB,wB,uCAA4B;AAC1B,SAAK,2BAAL,GAAmC,KAAK,kBAAL,GAA0B,IAA7D;AACD,G;;0BAED,e,8BAAmB;AACjB,SAAK,kBAAL,GAA0B,IAA1B;AACD,G;;;;;AAGH,QAAQ,EAAR,CAAW,WAAX,EAAwB,gBAA0D;AAAA,MAA9C,MAA8C,QAA9C,MAA8C;AAAA,MAAtC,WAAsC,QAAtC,WAAsC;AAAA,MAAzB,QAAyB,QAAzB,QAAyB;AAAA,MAAf,WAAe,QAAf,WAAe;;AAChF,MAAM,YAAY,WAAU,MAAV,GAAmB,YAAY,SAAjD;;AAEA,MAAI,gBAAgB,QAApB,EAA8B;AAC5B,WAAO,EAAP,GAAY,OAAO,OAAP,GAAiB,UAAU,OAAvC;AACA,WAAO,EAAP,GAAY,OAAO,OAAP,GAAiB,UAAU,OAAvC;AACD,GAHD,MAIK;AACH,WAAO,EAAP,GAAY,OAAO,KAAP,GAAe,UAAU,KAArC;AACA,WAAO,EAAP,GAAY,OAAO,KAAP,GAAe,UAAU,KAArC;AACD;AACF,CAXD;;AAaA,cAAc,OAAd,GAAwB,OAAxB;;AAEA,OAAO,OAAP,GAAiB,aAAjB;;;;;;;AC7JA,IAAM,KAAY,QAAQ,YAAR,CAAlB;AACA,IAAM,SAAY,QAAQ,gBAAR,CAAlB;AACA,IAAM,SAAY,QAAQ,gBAAR,CAAlB;AACA,IAAM,UAAY,QAAQ,gBAAR,CAAlB;AACA,IAAM,QAAY,QAAQ,SAAR,CAAlB;AACA,IAAM,YAAY,QAAQ,aAAR,CAAlB;AACA,IAAM,WAAY,QAAQ,kBAAR,CAAlB;AACA,IAAM,UAAY,QAAQ,iBAAR,EAA2B,GAA3B,EAAlB;;eAM8B,QAAQ,kBAAR,C;IAH5B,c,YAAA,c;IACA,Y,YAAA,Y;IACA,W,YAAA,W;;gBAE4B,QAAQ,gBAAR,C;IAAtB,S,aAAA,S;;gBACsB,QAAQ,aAAR,C;IAAtB,O,aAAA,O;IAAS,Q,aAAA,Q;;gBACa,QAAQ,iBAAR,C;IAAtB,U,aAAA,U;;AAER;;;AACA,MAAM,aAAN,GAAsB,EAAtB;;AAEA;;;;;;;IAMM,Y;AACJ,wBAAa,MAAb,EAAqB,OAArB,EAA8B;AAAA;;AAC5B,cAAU,WAAW,EAArB;;AAEA,SAAK,MAAL,GAAgB,MAAhB;AACA,SAAK,MAAL,GAAgB,IAAI,SAAJ,EAAhB;AACA,SAAK,QAAL,GAAgB,QAAQ,OAAR,IAAmB,MAAM,QAAzC;AACA,SAAK,IAAL,GAAgB,UAAU,YAAY,MAAZ,IAAqB,KAAK,QAA1B,GAAqC,MAA/C,CAAhB;AACA,SAAK,IAAL,GAAgB,KAAK,IAAL,CAAU,QAA1B;;AAEA,YAAQ,IAAR,CAAa,KAAb,EAAoB;AAClB,oBADkB;AAElB,sBAFkB;AAGlB,oBAAc,IAHI;AAIlB,WAAK,KAAK;AAJQ,KAApB;;AAOA,UAAM,WAAN,CAAmB,KAAK,IAAxB,EAA8B,KAAK,IAAnC;;AAEA,UAAM,aAAN,CAAoB,IAApB,CAAyB,IAAzB;;AAEA,SAAK,GAAL,CAAS,OAAT;AACD;;yBAED,W,wBAAa,M,EAAQ,M,EAAQ;AAC3B,QAAM,WAAW,OAAO,MAAxB;;AAEA,QAAI,GAAG,QAAH,CAAY,OAAO,OAAnB,CAAJ,EAAwC;AAAE,WAAK,MAAL,CAAY,WAAW,OAAvB,IAA0C,OAAO,OAAjD;AAAoE;AAC9G,QAAI,GAAG,QAAH,CAAY,OAAO,MAAnB,CAAJ,EAAwC;AAAE,WAAK,MAAL,CAAY,WAAW,MAAvB,IAA0C,OAAO,MAAjD;AAAoE;AAC9G,QAAI,GAAG,QAAH,CAAY,OAAO,KAAnB,CAAJ,EAAwC;AAAE,WAAK,MAAL,CAAY,WAAW,KAAvB,IAA0C,OAAO,KAAjD;AAAoE;AAC9G,QAAI,GAAG,QAAH,CAAY,OAAO,cAAnB,CAAJ,EAAwC;AAAE,WAAK,MAAL,CAAY,WAAW,cAAvB,IAA0C,OAAO,cAAjD;AAAoE;;AAE9G,WAAO,IAAP;AACD,G;;yBAED,Y,yBAAc,M,EAAQ,O,EAAS;AAC7B;AACA,SAAK,IAAM,MAAX,IAAqB,OAArB,EAA8B;AAC5B;AACA,UAAI,UAAU,SAAS,MAAT,CAAd,EAAgC;AAC9B;AACA,YAAI,GAAG,MAAH,CAAU,QAAQ,MAAR,CAAV,CAAJ,EAAgC;AAC9B;AACA,eAAK,OAAL,CAAa,MAAb,EAAqB,MAArB,IAA+B,OAAO,KAAK,OAAL,CAAa,MAAb,EAAqB,MAArB,KAAgC,EAAvC,EAA2C,QAAQ,MAAR,CAA3C,CAA/B;;AAEA,cAAI,GAAG,MAAH,CAAU,SAAS,SAAT,CAAmB,MAAnB,CAAV,KAAyC,aAAa,SAAS,SAAT,CAAmB,MAAnB,CAA1D,EAAsF;AACpF,iBAAK,OAAL,CAAa,MAAb,EAAqB,MAArB,EAA6B,OAA7B,GAAuC,QAAQ,MAAR,EAAgB,OAAhB,KAA4B,KAA5B,GAAmC,KAAnC,GAA2C,IAAlF;AACD;AACF,SAPD,MAQK,IAAI,GAAG,IAAH,CAAQ,QAAQ,MAAR,CAAR,KAA4B,GAAG,MAAH,CAAU,SAAS,SAAT,CAAmB,MAAnB,CAAV,CAAhC,EAAuE;AAC1E,eAAK,OAAL,CAAa,MAAb,EAAqB,MAArB,EAA6B,OAA7B,GAAuC,QAAQ,MAAR,CAAvC;AACD,SAFI,MAGA,IAAI,QAAQ,MAAR,MAAoB,SAAxB,EAAmC;AACtC;AACA,eAAK,OAAL,CAAa,MAAb,EAAqB,MAArB,IAA+B,QAAQ,MAAR,CAA/B;AACD;AACF;AACF;AACF,G;;AAED;;;;;;;;;;;;;;;;;;;;yBAkBA,O,oBAAS,O,EAAS;AAChB,cAAU,WAAW,KAAK,MAA1B;;AAEA,QAAI,GAAG,MAAH,CAAU,KAAK,MAAf,KAA0B,CAAE,GAAG,OAAH,CAAW,OAAX,CAAhC,EAAsD;AACpD,gBAAU,KAAK,QAAL,CAAc,aAAd,CAA4B,KAAK,MAAjC,CAAV;AACD;;AAED,WAAO,eAAe,OAAf,CAAP;AACD,G;;AAED;;;;;;;;;;;;yBAUA,W,wBAAa,O,EAAS;AACpB,QAAI,GAAG,QAAH,CAAY,OAAZ,CAAJ,EAA0B;AACxB,WAAK,OAAL,GAAe,OAAf;;AAEA,aAAO,IAAP;AACD;;AAED,QAAI,YAAY,IAAhB,EAAsB;AACpB,aAAO,KAAK,OAAL,CAAa,OAApB;;AAEA,aAAO,IAAP;AACD;;AAED,WAAO,KAAK,OAAZ;AACD,G;;yBAED,iB,8BAAmB,U,EAAY,Q,EAAU;AACvC,QAAI,YAAY,QAAZ,KAAyB,GAAG,MAAH,CAAU,QAAV,CAA7B,EAAkD;AAChD,WAAK,OAAL,CAAa,UAAb,IAA2B,QAA3B;;AAEA,2BAAqB,QAAQ,KAA7B,kHAAoC;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,YAAzB,MAAyB;;AAClC,aAAK,OAAL,CAAa,MAAb,EAAqB,UAArB,IAAmC,QAAnC;AACD;;AAED,aAAO,IAAP;AACD;;AAED,WAAO,KAAK,OAAL,CAAa,UAAb,CAAP;AACD,G;;AAED;;;;;;;;;;;;;;;yBAaA,M,mBAAQ,Q,EAAU;AAChB,WAAO,KAAK,iBAAL,CAAuB,QAAvB,EAAiC,QAAjC,CAAP;AACD,G;;AAED;;;;;;;;;;;;yBAUA,W,wBAAa,Q,EAAU;AACrB,QAAI,aAAa,MAAb,IAAuB,aAAa,QAAxC,EAAkD;AAChD,WAAK,OAAL,CAAa,WAAb,GAA2B,QAA3B;;AAEA,aAAO,IAAP;AACD;;AAED,WAAO,KAAK,OAAL,CAAa,WAApB;AACD,G;;AAED;;;;;;;;;;;yBASA,O,sBAAW;AACT,WAAO,KAAK,QAAZ;AACD,G;;yBAED,S,sBAAW,O,EAAS;AAClB,WAAQ,KAAK,QAAL,KAAkB,QAAQ,aAA1B,IACG,aAAa,KAAK,QAAlB,EAA4B,OAA5B,CADX;AAED,G;;AAED;;;;;;;;;;;;yBAUA,I,iBAAM,M,EAAQ;AACZ,SAAK,MAAL,CAAY,IAAZ,CAAiB,MAAjB;;AAEA,WAAO,IAAP;AACD,G;;yBAED,c,2BAAgB,M,EAAQ,S,EAAW,Q,EAAU,O,EAAS;AACpD,QAAI,GAAG,MAAH,CAAU,SAAV,KAAwB,UAAU,MAAV,CAAiB,GAAjB,MAA0B,CAAC,CAAvD,EAA0D;AACxD,kBAAY,UAAU,IAAV,GAAiB,KAAjB,CAAuB,IAAvB,CAAZ;AACD;;AAED,QAAI,GAAG,KAAH,CAAS,SAAT,CAAJ,EAAyB;AACvB,WAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,UAAU,MAA9B,EAAsC,GAAtC,EAA2C;AACzC,aAAK,MAAL,EAAa,UAAU,CAAV,CAAb,EAA2B,QAA3B,EAAqC,OAArC;AACD;;AAED,aAAO,IAAP;AACD;;AAED,QAAI,GAAG,MAAH,CAAU,SAAV,CAAJ,EAA0B;AACxB,WAAK,IAAM,IAAX,IAAmB,SAAnB,EAA8B;AAC5B,aAAK,MAAL,EAAa,IAAb,EAAmB,UAAU,IAAV,CAAnB,EAAoC,QAApC;AACD;;AAED,aAAO,IAAP;AACD;AACF,G;;AAED;;;;;;;;;;;;;yBAWA,E,eAAI,S,EAAW,Q,EAAU,O,EAAS;AAChC,QAAI,KAAK,cAAL,CAAoB,IAApB,EAA0B,SAA1B,EAAqC,QAArC,EAA+C,OAA/C,CAAJ,EAA6D;AAC3D,aAAO,IAAP;AACD;;AAED,QAAI,cAAc,OAAlB,EAA2B;AAAE,kBAAY,UAAZ;AAAyB;;AAEtD,QAAI,SAAS,aAAa,UAAtB,EAAkC,SAAlC,CAAJ,EAAkD;AAChD,WAAK,MAAL,CAAY,EAAZ,CAAe,SAAf,EAA0B,QAA1B;AACD;AACD;AAHA,SAIK,IAAI,GAAG,MAAH,CAAU,KAAK,MAAf,CAAJ,EAA4B;AAC/B,eAAO,WAAP,CAAmB,KAAK,MAAxB,EAAgC,KAAK,QAArC,EAA+C,SAA/C,EAA0D,QAA1D,EAAoE,OAApE;AACD,OAFI,MAGA;AACH,eAAO,GAAP,CAAW,KAAK,MAAhB,EAAwB,SAAxB,EAAmC,QAAnC,EAA6C,OAA7C;AACD;;AAED,WAAO,IAAP;AACD,G;;AAED;;;;;;;;;;;;;yBAWA,G,gBAAK,S,EAAW,Q,EAAU,O,EAAS;AACjC,QAAI,KAAK,cAAL,CAAoB,KAApB,EAA2B,SAA3B,EAAsC,QAAtC,EAAgD,OAAhD,CAAJ,EAA8D;AAC5D,aAAO,IAAP;AACD;;AAED,QAAI,cAAc,OAAlB,EAA2B;AAAE,kBAAY,UAAZ;AAAyB;;AAEtD;AACA,QAAI,SAAS,aAAa,UAAtB,EAAkC,SAAlC,CAAJ,EAAkD;AAChD,WAAK,MAAL,CAAY,GAAZ,CAAgB,SAAhB,EAA2B,QAA3B;AACD;AACD;AAHA,SAIK,IAAI,GAAG,MAAH,CAAU,KAAK,MAAf,CAAJ,EAA4B;AAC/B,eAAO,cAAP,CAAsB,KAAK,MAA3B,EAAmC,KAAK,QAAxC,EAAkD,SAAlD,EAA6D,QAA7D,EAAuE,OAAvE;AACD;AACD;AAHK,WAIA;AACH,iBAAO,MAAP,CAAc,KAAK,MAAnB,EAA2B,SAA3B,EAAsC,QAAtC,EAAgD,OAAhD;AACD;;AAED,WAAO,IAAP;AACD,G;;AAED;;;;;;;;;;yBAQA,G,gBAAK,O,EAAS;AACZ,QAAI,CAAC,GAAG,MAAH,CAAU,OAAV,CAAL,EAAyB;AACvB,gBAAU,EAAV;AACD;;AAED,SAAK,OAAL,GAAe,OAAO,EAAP,EAAW,SAAS,IAApB,CAAf;;AAEA,QAAM,aAAa,OAAO,EAAP,EAAW,SAAS,SAApB,CAAnB;;AAEA,SAAK,IAAM,UAAX,IAAyB,QAAQ,UAAjC,EAA6C;AAC3C,UAAM,aAAa,QAAQ,UAAR,CAAmB,UAAnB,CAAnB;;AAEA,WAAK,OAAL,CAAa,UAAb,IAA2B,OAAO,EAAP,EAAW,SAAS,UAAT,CAAX,CAA3B;;AAEA,WAAK,YAAL,CAAkB,UAAlB,EAA8B,UAA9B;;AAEA,WAAK,UAAL,EAAiB,QAAQ,UAAR,CAAjB;AACD;;AAED,0BAAsB,aAAa,eAAnC,yHAAoD;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAAzC,OAAyC;;AAClD,WAAK,OAAL,CAAa,OAAb,IAAwB,SAAS,IAAT,CAAc,OAAd,CAAxB;;AAEA,UAAI,WAAW,OAAf,EAAwB;AACtB,aAAK,OAAL,EAAc,QAAQ,OAAR,CAAd;AACD;AACF;;AAED,YAAQ,IAAR,CAAa,KAAb,EAAoB;AAClB,sBADkB;AAElB,oBAAc;AAFI,KAApB;;AAKA,WAAO,IAAP;AACD,G;;AAED;;;;;;;;;;;yBASA,K,oBAAS;AACP,WAAO,MAAP,CAAc,KAAK,MAAnB,EAA2B,KAA3B;;AAEA,QAAI,GAAG,MAAH,CAAU,KAAK,MAAf,CAAJ,EAA4B;AAC1B;AACA,WAAK,IAAM,IAAX,IAAmB,OAAO,eAA1B,EAA2C;AACzC,YAAM,YAAY,OAAO,eAAP,CAAuB,IAAvB,CAAlB;;AAEA,YAAI,UAAU,SAAV,CAAoB,CAApB,MAA2B,KAAK,MAAhC,IACG,UAAU,QAAV,CAAmB,CAAnB,MAA0B,KAAK,QADtC,EACgD;;AAE9C,oBAAU,SAAV,CAAoB,MAApB,CAA2B,CAA3B,EAA8B,CAA9B;AACA,oBAAU,QAAV,CAAoB,MAApB,CAA2B,CAA3B,EAA8B,CAA9B;AACA,oBAAU,SAAV,CAAoB,MAApB,CAA2B,CAA3B,EAA8B,CAA9B;;AAEA;AACA,cAAI,CAAC,UAAU,SAAV,CAAoB,MAAzB,EAAiC;AAC/B,sBAAU,IAAV,IAAkB,IAAlB;AACD;AACF;;AAED,eAAO,MAAP,CAAc,KAAK,QAAnB,EAA6B,IAA7B,EAAmC,OAAO,gBAA1C;AACA,eAAO,MAAP,CAAc,KAAK,QAAnB,EAA6B,IAA7B,EAAmC,OAAO,kBAA1C,EAA8D,IAA9D;AACD;AACF,KArBD,MAsBK;AACH,aAAO,MAAP,CAAc,IAAd,EAAoB,KAApB;AACD;;AAED,YAAQ,IAAR,CAAa,OAAb,EAAsB,EAAE,cAAc,IAAhB,EAAtB;;AAEA,UAAM,aAAN,CAAoB,MAApB,CAA2B,QAAQ,MAAM,aAAd,EAA6B,IAA7B,CAA3B,EAA+D,CAA/D;;AAEA;AACA,0BAA0B,MAAM,YAAN,IAAsB,EAAhD,yHAAoD;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAAzC,WAAyC;;AAClD,UAAI,YAAY,MAAZ,KAAuB,IAAvB,IAA+B,YAAY,WAAZ,EAAnC,EAA8D;AAC5D,oBAAY,IAAZ;AACD;AACF;;AAED,WAAO,MAAM,QAAb;AACD,G;;;;;AAGH,MAAM,aAAN,CAAoB,cAApB,GAAqC,SAAS,cAAT,CAAyB,MAAzB,EAAiC,OAAjC,EAA0C;AAC7E,YAAU,WAAW,MAAM,QAA3B;;AAEA,OAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,KAAK,MAAzB,EAAiC,GAAjC,EAAsC;AACpC,QAAM,eAAe,KAAK,CAAL,CAArB;;AAEA,QAAI,aAAa,MAAb,KAAwB,MAAxB,IAAkC,aAAa,QAAb,KAA0B,OAAhE,EAAyE;AACvE,aAAO,CAAP;AACD;AACF;AACD,SAAO,CAAC,CAAR;AACD,CAXD;;AAaA,MAAM,aAAN,CAAoB,GAApB,GAA0B,SAAS,eAAT,CAA0B,OAA1B,EAAmC,OAAnC,EAA4C,kBAA5C,EAAgE;AACxF,MAAM,MAAM,KAAK,KAAK,cAAL,CAAoB,OAApB,EAA6B,WAAW,QAAQ,OAAhD,CAAL,CAAZ;;AAEA,SAAO,QAAQ,GAAG,MAAH,CAAU,OAAV,KAAsB,kBAAtB,IAA4C,IAAI,SAAJ,CAAc,OAAd,CAApD,IAA6E,GAA7E,GAAmF,IAA1F;AACD,CAJD;;AAMA,MAAM,aAAN,CAAoB,eAApB,GAAsC,UAAU,QAAV,EAAoB,OAApB,EAA6B;AACjE,OAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,KAAK,MAAzB,EAAiC,GAAjC,EAAsC;AACpC,QAAM,eAAe,KAAK,CAAL,CAArB;;AAEA;AACA,QAAI,CAAC,GAAG,MAAH,CAAU,aAAa,MAAvB,CAAD,IACI,WAAW,CAAC,aAAa,SAAb,CAAuB,OAAvB,CADpB,EACsD;AACpD;AACD;;AAED,QAAM,MAAM,SAAS,YAAT,EAAuB,aAAa,MAApC,EAA4C,aAAa,QAAzD,EAAmE,CAAnE,EAAsE,IAAtE,CAAZ;;AAEA,QAAI,QAAQ,SAAZ,EAAuB;AACrB,aAAO,GAAP;AACD;AACF;AACF,CAhBD;;AAkBA;AACA,aAAa,UAAb,GAA0B,MAAM,UAAN,GAAmB,EAA7C;;AAEA,aAAa,OAAb,GAAuB,OAAvB;;AAEA,aAAa,eAAb,GAA+B,CAAE,aAAF,EAAiB,QAAjB,EAA2B,gBAA3B,EAA6C,aAA7C,CAA/B;;AAEA,OAAO,OAAP,GAAiB,YAAjB;;;;;;;ACtcA,IAAM,QAAa,QAAQ,SAAR,CAAnB;AACA,IAAM,QAAa,QAAQ,SAAR,CAAnB;AACA,IAAM,SAAa,QAAQ,gBAAR,CAAnB;AACA,IAAM,UAAa,QAAQ,iBAAR,CAAnB;AACA,IAAM,aAAa,QAAQ,oBAAR,CAAnB;AACA,IAAM,SAAa,QAAQ,2BAAR,CAAnB;AACA,IAAM,UAAa,QAAQ,iBAAR,EAA2B,GAA3B,EAAnB;;AAEA,IAAM,YAAc,EAApB;AACA,IAAM,cAAc,CAClB,aADkB,EACH,aADG,EACY,WADZ,EAElB,eAFkB,EAED,eAFC,CAApB;;AAKA;AACA,IAAI,gBAAgB,CAApB;;AAEA;AACA,MAAM,YAAN,GAAqB,EAArB;;IAEM,W;AACJ,6BAA8B;AAAA,QAAf,WAAe,QAAf,WAAe;;AAAA;;AAC5B,SAAK,MAAL,GAAqB,IAArB,CAD4B,CACD;AAC3B,SAAK,OAAL,GAAqB,IAArB,CAF4B,CAED;;AAE3B,SAAK,QAAL,GAAqB,EAAM;AACzB,YAAO,IADY;AAEnB,YAAO,IAFY;AAGnB,aAAO;AAHY,KAArB;;AAMA;AACA,SAAK,QAAL,GAAmB,EAAnB;AACA,SAAK,UAAL,GAAmB,EAAnB;AACA,SAAK,WAAL,GAAmB,EAAnB;AACA,SAAK,SAAL,GAAmB,EAAnB;;AAEA;AACA,SAAK,UAAL,GAAkB;AAChB,YAAW,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EADK;AAEhB,cAAW,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EAFK;AAGhB,iBAAW;AAHK,KAAlB;AAKA;AACA,SAAK,SAAL,GAAiB;AACf,YAAW,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EADI;AAEf,cAAW,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EAFI;AAGf,iBAAW;AAHI,KAAjB;;AAMA;AACA,SAAK,WAAL,GAAmB;AACjB,YAAW,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EADM;AAEjB,cAAW,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EAFM;AAGjB,iBAAW;AAHM,KAAnB;;AAMA;AACA,SAAK,YAAL,GAAoB;AAClB,YAAW,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EAAc,IAAI,CAAlB,EAAqB,IAAI,CAAzB,EAA4B,OAAO,CAAnC,EADO;AAElB,cAAW,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EAAc,IAAI,CAAlB,EAAqB,IAAI,CAAzB,EAA4B,OAAO,CAAnC,EAFO;AAGlB,iBAAW;AAHO,KAApB;;AAMA,SAAK,SAAL,GAAmB,IAAnB,CA3C4B,CA2CA;AAC5B,SAAK,WAAL,GAAmB,EAAnB;;AAEA,SAAK,YAAL,GAAuB,IAAvB;AACA,SAAK,eAAL,GAAuB,IAAvB;;AAEA,SAAK,SAAL,GAAiB,IAAjB,CAjD4B,CAiDA;;AAE5B,SAAK,aAAL,GAAuB,KAAvB;AACA,SAAK,eAAL,GAAuB,KAAvB;AACA,SAAK,YAAL,GAAuB,KAAvB;;AAEA,SAAK,WAAL,GAAmB,WAAnB;;AAEA,YAAQ,IAAR,CAAa,KAAb,EAAoB,IAApB;;AAEA,UAAM,YAAN,CAAmB,IAAnB,CAAwB,IAAxB;AACD;;wBAED,W,wBAAa,O,EAAS,K,EAAO,W,EAAa;AACxC,QAAM,eAAe,KAAK,aAAL,CAAmB,OAAnB,EAA4B,KAA5B,EAAmC,IAAnC,CAArB;;AAEA,YAAQ,IAAR,CAAa,MAAb,EAAqB;AACnB,sBADmB;AAEnB,kBAFmB;AAGnB,8BAHmB;AAInB,gCAJmB;AAKnB,mBAAa;AALM,KAArB;AAOD,G;;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wBAgCA,K,kBAAO,M,EAAQ,M,EAAQ,O,EAAS;AAC9B,QAAI,KAAK,WAAL,MACG,CAAC,KAAK,aADT,IAEG,KAAK,UAAL,CAAgB,MAAhB,IAA0B,OAAO,IAAP,KAAgB,SAAhB,GAA2B,CAA3B,GAA+B,CAAzD,CAFP,EAEoE;AAClE;AACD;;AAED;AACA;AACA,QAAI,MAAM,OAAN,CAAc,MAAM,YAApB,EAAkC,IAAlC,MAA4C,CAAC,CAAjD,EAAoD;AAClD,YAAM,YAAN,CAAmB,IAAnB,CAAwB,IAAxB;AACD;;AAED,UAAM,UAAN,CAAiB,KAAK,QAAtB,EAAgC,MAAhC;AACA,SAAK,MAAL,GAAsB,MAAtB;AACA,SAAK,OAAL,GAAsB,OAAtB;;AAEA,YAAQ,IAAR,CAAa,cAAb,EAA6B;AAC3B,mBAAa,IADc;AAE3B,aAAO,KAAK;AAFe,KAA7B;AAID,G;;wBAED,W,wBAAa,O,EAAS,K,EAAO,W,EAAa;AACxC,QAAI,CAAC,KAAK,UAAV,EAAsB;AACpB,WAAK,aAAL,CAAmB,OAAnB;AACA,YAAM,SAAN,CAAgB,KAAK,SAArB,EAAgC,KAAK,QAArC;AACD;;AAED,QAAM,gBAAiB,KAAK,SAAL,CAAe,IAAf,CAAoB,CAApB,KAA0B,KAAK,UAAL,CAAgB,IAAhB,CAAqB,CAA/C,IACG,KAAK,SAAL,CAAe,IAAf,CAAoB,CAApB,KAA0B,KAAK,UAAL,CAAgB,IAAhB,CAAqB,CADlD,IAEG,KAAK,SAAL,CAAe,MAAf,CAAsB,CAAtB,KAA4B,KAAK,UAAL,CAAgB,MAAhB,CAAuB,CAFtD,IAGG,KAAK,SAAL,CAAe,MAAf,CAAsB,CAAtB,KAA4B,KAAK,UAAL,CAAgB,MAAhB,CAAuB,CAH7E;;AAKA,QAAI,WAAJ;AACA,QAAI,WAAJ;;AAEA;AACA,QAAI,KAAK,aAAL,IAAsB,CAAC,KAAK,eAAhC,EAAiD;AAC/C,WAAK,KAAK,SAAL,CAAe,MAAf,CAAsB,CAAtB,GAA0B,KAAK,WAAL,CAAiB,MAAjB,CAAwB,CAAvD;AACA,WAAK,KAAK,SAAL,CAAe,MAAf,CAAsB,CAAtB,GAA0B,KAAK,WAAL,CAAiB,MAAjB,CAAwB,CAAvD;;AAEA,WAAK,eAAL,GAAuB,MAAM,KAAN,CAAY,EAAZ,EAAgB,EAAhB,IAAsB,YAAY,oBAAzD;AACD;;AAED,QAAM,YAAY;AAChB,sBADgB;AAEhB,oBAAc,KAAK,eAAL,CAAqB,OAArB,CAFE;AAGhB,kBAHgB;AAIhB,8BAJgB;AAKhB,YALgB;AAMhB,YANgB;AAOhB,iBAAW,aAPK;AAQhB,mBAAa,IARG;AAShB,6BAAuB,KAAK,WAAL;AATP,KAAlB;;AAYA,QAAI,CAAC,aAAL,EAAoB;AAClB;AACA,YAAM,cAAN,CAAqB,KAAK,YAA1B,EAAwC,KAAK,UAA7C,EAAyD,KAAK,SAA9D;AACD;;AAED,YAAQ,IAAR,CAAa,MAAb,EAAqB,SAArB;;AAEA,QAAI,CAAC,aAAL,EAAoB;AAClB;AACA,UAAI,KAAK,WAAL,EAAJ,EAAwB;AACtB,aAAK,MAAL,CAAY,SAAZ;AACD;;AAED,UAAI,KAAK,eAAT,EAA0B;AACxB,cAAM,UAAN,CAAiB,KAAK,UAAtB,EAAkC,KAAK,SAAvC;AACD;AACF;AACF,G;;AAED;;;;;;;;;;;;;;;;;;;;;;wBAoBA,M,mBAAQ,S,EAAW;AACjB,gBAAY,MAAM,MAAN,CAAa;AACvB,eAAS,KAAK,QAAL,CAAc,CAAd,CADc;AAEvB,aAAO,KAAK,SAFW;AAGvB,mBAAa,KAAK,YAHK;AAIvB,mBAAa;AAJU,KAAb,EAKT,aAAa,EALJ,CAAZ;;AAOA,YAAQ,IAAR,CAAa,oBAAb,EAAmC,SAAnC;;AAEA,QAAI,CAAC,KAAK,aAAV,EAAyB;AACvB,cAAQ,IAAR,CAAa,aAAb,EAA4B,SAA5B;AACD;;AAED,SAAK,aAAL,GAAqB,KAArB;AACD,G;;AAED;;;wBACA,S,sBAAW,O,EAAS,K,EAAO,W,EAAa,c,EAAgB;AACtD,QAAM,eAAe,KAAK,eAAL,CAAqB,OAArB,CAArB;;AAEA,YAAQ,IAAR,CAAa,WAAW,IAAX,CAAgB,MAAM,IAAtB,IAA6B,QAA7B,GAAwC,IAArD,EAA2D;AACzD,sBADyD;AAEzD,gCAFyD;AAGzD,kBAHyD;AAIzD,8BAJyD;AAKzD,oCALyD;AAMzD,mBAAa;AAN4C,KAA3D;;AASA,QAAI,CAAC,KAAK,UAAV,EAAsB;AACpB,WAAK,GAAL,CAAS,KAAT;AACD;;AAED,SAAK,aAAL,GAAqB,KAArB;AACA,SAAK,aAAL,CAAmB,OAAnB,EAA4B,KAA5B;AACD,G;;AAED;;;;;;;;;;;;;;;;;;;;;;wBAoBA,G,gBAAK,K,EAAO;AACV,YAAQ,SAAS,KAAK,SAAtB;;AAEA,QAAI,KAAK,WAAL,EAAJ,EAAwB;AACtB,cAAQ,IAAR,CAAa,YAAb,EAA2B;AACzB,oBADyB;AAEzB,qBAAa;AAFY,OAA3B;AAID;;AAED,SAAK,IAAL;AACD,G;;wBAED,a,4BAAiB;AACf,WAAO,KAAK,YAAL,GAAmB,KAAK,QAAL,CAAc,IAAjC,GAAuC,IAA9C;AACD,G;;wBAED,W,0BAAe;AACb,WAAO,KAAK,YAAZ;AACD,G;;wBAED,I,mBAAQ;AACN,YAAQ,IAAR,CAAa,MAAb,EAAqB,EAAE,aAAa,IAAf,EAArB;;AAEA,QAAI,KAAK,YAAT,EAAuB;AACrB,cAAQ,IAAR,CAAa,aAAb,EAA4B,EAAE,aAAa,IAAf,EAA5B;AACA,cAAQ,IAAR,CAAa,UAAU,KAAK,QAAL,CAAc,IAArC,EAA2C,EAAE,aAAa,IAAf,EAA3C;AACD;;AAED,SAAK,MAAL,GAAc,KAAK,OAAL,GAAe,IAA7B;;AAEA,SAAK,YAAL,GAAoB,KAApB;AACA,SAAK,QAAL,CAAc,IAAd,GAAqB,KAAK,SAAL,GAAiB,IAAtC;AACD,G;;wBAED,e,4BAAiB,O,EAAS;AACxB;AACA,QAAI,KAAK,WAAL,KAAqB,OAArB,IAAgC,KAAK,WAAL,KAAqB,KAAzD,EAAgE;AAC9D,aAAO,CAAP;AACD;;AAED,WAAO,MAAM,OAAN,CAAc,KAAK,UAAnB,EAA+B,MAAM,YAAN,CAAmB,OAAnB,CAA/B,CAAP;AACD,G;;wBAED,a,0BAAe,O,EAAS,K,EAA0D;AAAA,QAAnD,IAAmD,uEAA5C,SAAS,iBAAiB,IAAjB,CAAsB,MAAM,IAA5B,CAAmC;;AAChF,QAAM,KAAK,MAAM,YAAN,CAAmB,OAAnB,CAAX;AACA,QAAI,QAAQ,KAAK,eAAL,CAAqB,OAArB,CAAZ;;AAEA,QAAI,UAAU,CAAC,CAAf,EAAkB;AAChB,cAAQ,KAAK,UAAL,CAAgB,MAAxB;AACA,WAAK,UAAL,CAAgB,KAAhB,IAAyB,EAAzB;AACD;;AAED,QAAI,IAAJ,EAAU;AACR,cAAQ,IAAR,CAAa,qBAAb,EAAoC;AAClC,wBADkC;AAElC,oBAFkC;AAGlC,kBAHkC;AAIlC,mBAAW,EAJuB;AAKlC,sBAAc,KALoB;AAMlC,qBAAa;AANqB,OAApC;AAQD;;AAED,SAAK,QAAL,CAAc,KAAd,IAAuB,OAAvB;;AAEA,WAAO,KAAP;AACD,G;;wBAED,a,0BAAe,O,EAAS,K,EAAO;AAC7B,QAAM,QAAQ,KAAK,eAAL,CAAqB,OAArB,CAAd;;AAEA,QAAI,UAAU,CAAC,CAAf,EAAkB;AAAE;AAAS;;AAE7B,YAAQ,IAAR,CAAa,gBAAb,EAA+B;AAC7B,sBAD6B;AAE7B,kBAF6B;AAG7B,oBAAc,KAHe;AAI7B,mBAAa;AAJgB,KAA/B;;AAOA,SAAK,QAAL,CAAiB,MAAjB,CAAwB,KAAxB,EAA+B,CAA/B;AACA,SAAK,UAAL,CAAiB,MAAjB,CAAwB,KAAxB,EAA+B,CAA/B;AACA,SAAK,WAAL,CAAiB,MAAjB,CAAwB,KAAxB,EAA+B,CAA/B;AACA,SAAK,SAAL,CAAiB,MAAjB,CAAwB,KAAxB,EAA+B,CAA/B;AACD,G;;wBAED,mB,gCAAqB,M,EAAQ,a,EAAe;AAC1C,SAAK,YAAL,GAAuB,MAAvB;AACA,SAAK,eAAL,GAAuB,aAAvB;AACD,G;;;;;AAGH,KAAK,IAAI,IAAI,CAAR,EAAW,MAAM,YAAY,MAAlC,EAA0C,IAAI,GAA9C,EAAmD,GAAnD,EAAwD;AACtD,MAAM,SAAS,YAAY,CAAZ,CAAf;;AAEA,YAAU,MAAV,IAAoB,iBAAiB,MAAjB,CAApB;AACD;;AAED,SAAS,gBAAT,CAA2B,MAA3B,EAAmC;AACjC,SAAQ,UAAU,KAAV,EAAiB;AACvB,QAAM,cAAc,MAAM,cAAN,CAAqB,KAArB,CAApB;;AADuB,gCAEe,MAAM,eAAN,CAAsB,KAAtB,CAFf;AAAA,QAEhB,WAFgB;AAAA,QAEH,cAFG;;AAGvB,QAAM,UAAU,EAAhB,CAHuB,CAGH;;AAEpB,QAAI,QAAQ,aAAR,IAAyB,QAAQ,IAAR,CAAa,MAAM,IAAnB,CAA7B,EAAuD;AACrD,sBAAgB,IAAI,IAAJ,GAAW,OAAX,EAAhB;;AAEA,WAAK,IAAI,KAAI,CAAb,EAAgB,KAAI,MAAM,cAAN,CAAqB,MAAzC,EAAiD,IAAjD,EAAsD;AACpD,YAAM,UAAU,MAAM,cAAN,CAAqB,EAArB,CAAhB;AACA,YAAM,cAAc,OAAO,MAAP,CAAc,OAAd,EAAuB,MAAM,IAA7B,EAAmC,WAAnC,CAApB;;AAEA,gBAAQ,IAAR,CAAa,CAAC,OAAD,EAAU,eAAe,IAAI,WAAJ,CAAgB,EAAE,wBAAF,EAAhB,CAAzB,CAAb;AACD;AACF,KATD,MAUK;AACH,UAAI,iBAAiB,KAArB;;AAEA,UAAI,CAAC,QAAQ,oBAAT,IAAiC,QAAQ,IAAR,CAAa,MAAM,IAAnB,CAArC,EAA+D;AAC7D;AACA,aAAK,IAAI,MAAI,CAAb,EAAgB,MAAI,MAAM,YAAN,CAAmB,MAAvB,IAAiC,CAAC,cAAlD,EAAkE,KAAlE,EAAuE;AACrE,2BAAiB,MAAM,YAAN,CAAmB,GAAnB,EAAsB,WAAtB,KAAsC,OAAtC,IAAiD,MAAM,YAAN,CAAmB,GAAnB,EAAsB,aAAxF;AACD;;AAED;AACA;AACA,yBAAiB,kBACX,IAAI,IAAJ,GAAW,OAAX,KAAuB,aAAvB,GAAuC;AAC3C;AAFe,WAGZ,MAAM,SAAN,KAAoB,CAHzB;AAID;;AAED,UAAI,CAAC,cAAL,EAAqB;AACnB,YAAI,eAAc,OAAO,MAAP,CAAc,KAAd,EAAqB,MAAM,IAA3B,EAAiC,WAAjC,CAAlB;;AAEA,YAAI,CAAC,YAAL,EAAkB;AAChB,yBAAc,IAAI,WAAJ,CAAgB,EAAE,wBAAF,EAAhB,CAAd;AACD;;AAED,gBAAQ,IAAR,CAAa,CAAC,KAAD,EAAQ,YAAR,CAAb;AACD;AACF;;AAED,yBAAqC,OAArC,mHAA8C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,UAAlC,QAAkC;AAAA,UAAzB,aAAyB;;AAC5C,oBAAY,mBAAZ,CAAgC,WAAhC,EAA6C,cAA7C;AACA,oBAAY,MAAZ,EAAoB,QAApB,EAA6B,KAA7B,EAAoC,WAApC,EAAiD,cAAjD;AACD;AACF,GA/CD;AAgDD;;AAED,SAAS,MAAT,CAAiB,KAAjB,EAAwB;AACtB,OAAK,IAAI,MAAI,CAAb,EAAgB,MAAI,MAAM,YAAN,CAAmB,MAAvC,EAA+C,KAA/C,EAAoD;AAClD,QAAM,cAAc,MAAM,YAAN,CAAmB,GAAnB,CAApB;;AAEA,gBAAY,GAAZ,CAAgB,KAAhB;AACA,YAAQ,IAAR,CAAa,QAAb,EAAuB,EAAE,YAAF,EAAS,wBAAT,EAAvB;AACD;AACF;;AAED,IAAM,YAAY,CAAE,+BAAF,CAAlB;AACA,IAAM,cAAc,QAAQ,WAA5B;;AAEA,IAAI,WAAW,YAAf,EAA6B;AAC3B,YAAU,YAAY,IAAtB,IAAgC,UAAU,WAA1C;AACA,YAAU,YAAY,IAAtB,IAAgC,UAAU,WAA1C;AACA,YAAU,YAAY,EAAtB,IAAgC,UAAU,SAA1C;AACA,YAAU,YAAY,MAAtB,IAAgC,UAAU,SAA1C;AACD,CALD,MAMK;AACH,YAAU,SAAV,GAAwB,UAAU,WAAlC;AACA,YAAU,SAAV,GAAwB,UAAU,WAAlC;AACA,YAAU,OAAV,GAAwB,UAAU,SAAlC;;AAEA,YAAU,UAAV,GAAwB,UAAU,WAAlC;AACA,YAAU,SAAV,GAAwB,UAAU,WAAlC;AACA,YAAU,QAAV,GAAwB,UAAU,SAAlC;AACA,YAAU,WAAV,GAAwB,UAAU,SAAlC;AACD;;AAED,UAAU,IAAV,GAAiB,MAAjB;;AAEA,SAAS,WAAT,QAA+B,UAA/B,EAA2C;AAAA,MAAnB,GAAmB,SAAnB,GAAmB;;AACzC,MAAM,cAAc,WAAW,OAAX,CAAmB,KAAnB,MAA8B,CAA9B,GAChB,OAAO,GADS,GACH,OAAO,MADxB;;AAGA;AACA,OAAK,IAAM,SAAX,IAAwB,MAAM,eAA9B,EAA+C;AAC7C,gBAAY,GAAZ,EAAiB,SAAjB,EAA4B,OAAO,gBAAnC;AACA,gBAAY,GAAZ,EAAiB,SAAjB,EAA4B,OAAO,kBAAnC,EAAuD,IAAvD;AACD;;AAED,OAAK,IAAM,UAAX,IAAwB,SAAxB,EAAmC;AACjC,gBAAY,GAAZ,EAAiB,UAAjB,EAA4B,UAAU,UAAV,CAA5B;AACD;AACF;;AAED,QAAQ,EAAR,CAAW,qBAAX,EAAkC,iBAAiF;AAAA,MAA9E,WAA8E,SAA9E,WAA8E;AAAA,MAAjE,OAAiE,SAAjE,OAAiE;AAAA,MAAxD,SAAwD,SAAxD,SAAwD;AAAA,MAA7C,YAA6C,SAA7C,YAA6C;AAAA,MAA/B,KAA+B,SAA/B,KAA+B;AAAA,MAAxB,WAAwB,SAAxB,WAAwB;AAAA,MAAX,IAAW,SAAX,IAAW;;AACjH,cAAY,UAAZ,CAAuB,YAAvB,IAAuC,SAAvC;AACA,cAAY,QAAZ,CAAqB,YAArB,IAAqC,OAArC;;AAEA,MAAI,IAAJ,EAAU;AACR,gBAAY,aAAZ,GAA4B,IAA5B;AACD;;AAED,MAAI,CAAC,YAAY,WAAZ,EAAL,EAAgC;AAC9B,UAAM,SAAN,CAAgB,YAAY,WAA5B,EAAyC,YAAY,QAArD;;AAEA,UAAM,UAAN,CAAiB,YAAY,SAA7B,EAAyC,YAAY,WAArD;AACA,UAAM,UAAN,CAAiB,YAAY,UAA7B,EAAyC,YAAY,WAArD;;AAEA,gBAAY,SAAZ,GAAwC,KAAxC;AACA,gBAAY,SAAZ,CAAsB,YAAtB,IAAwC,YAAY,SAAZ,CAAsB,SAA9D;AACA,gBAAY,WAAZ,CAAwB,YAAxB,IAAwC,eAAe,SAAS,MAAM,eAAN,CAAsB,KAAtB,EAA6B,CAA7B,CAAhE;AACA,gBAAY,eAAZ,GAAwC,KAAxC;;AAEA,UAAM,aAAN,CAAoB,YAAY,WAAhC,EAA6C,OAA7C;AACD;AACF,CArBD;;AAuBA,MAAM,OAAN,CAAc,EAAd,CAAiB,cAAjB,EAAoC,WAApC;AACA,MAAM,OAAN,CAAc,EAAd,CAAiB,iBAAjB,EAAoC,WAApC;;AAEA,YAAY,oBAAZ,GAAmC,CAAnC;AACA,YAAY,gBAAZ,GAA+B,gBAA/B;AACA,YAAY,MAAZ,GAAqB,MAArB;AACA,YAAY,OAAZ,GAAsB,OAAtB;AACA,YAAY,SAAZ,GAAwB,SAAxB;;AAEA,MAAM,kBAAN,GAA2B,MAA3B;;AAEA,OAAO,OAAP,GAAiB,WAAjB;;;;;AC/fA,IAAM,cAAgB,QAAQ,gBAAR,CAAtB;AACA,IAAM,gBAAgB,QAAQ,kBAAR,CAAtB;;AAEA,IAAM,UAAU;AACd,4BADc;AAEd,SAAO,EAFO;AAGd,cAAY;AAHE,CAAhB;;AAMA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,cAAvB,EAAuC,gBAAkC;AAAA,MAAtB,WAAsB,QAAtB,WAAsB;AAAA,MAAT,KAAS,QAAT,KAAS;;AACvE,cAAY,YAAZ,GAA2B,IAA3B;AACA,eAAa,WAAb,EAA0B,KAA1B,EAAiC,OAAjC;AACD,CAHD;;AAKA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,aAAvB,EAAsC,iBAA0C;AAAA,MAA9B,WAA8B,SAA9B,WAA8B;AAAA,MAAjB,KAAiB,SAAjB,KAAiB;AAAA,MAAV,MAAU,SAAV,MAAU;;AAC9E,eAAa,WAAb,EAA0B,KAA1B,EAAiC,MAAjC,EAAyC,MAAzC;;AAEA;AACA,MAAI,CAAC,YAAY,WAAZ,EAAL,EAAgC;AAAE,WAAO,KAAP;AAAe;AAClD,CALD;;AAOA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,YAAvB,EAAqC,iBAAkC;AAAA,MAAtB,WAAsB,SAAtB,WAAsB;AAAA,MAAT,KAAS,SAAT,KAAS;;AACrE,eAAa,WAAb,EAA0B,KAA1B,EAAiC,KAAjC;AACD,CAFD;;AAIA,SAAS,YAAT,CAAuB,WAAvB,EAAoC,KAApC,EAA2C,KAA3C,EAAkD,MAAlD,EAA0D;AACxD,MAAM,aAAa,YAAY,QAAZ,CAAqB,IAAxC;;AAEA,MAAM,WAAW,IAAI,aAAJ,CAAkB,WAAlB,EAA+B,KAA/B,EAAsC,UAAtC,EAAkD,KAAlD,EAAyD,YAAY,OAArE,EAA8E,IAA9E,EAAoF,MAApF,CAAjB;;AAEA,cAAY,MAAZ,CAAmB,IAAnB,CAAwB,QAAxB;AACA,cAAY,SAAZ,GAAwB,QAAxB;AACD;;AAED,OAAO,OAAP,GAAiB,OAAjB;;;;;AClCA,IAAM,UAAiB,QAAQ,QAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,UAAR,CAAvB;AACA,IAAM,gBAAiB,QAAQ,kBAAR,CAAvB;AACA,IAAM,eAAiB,QAAQ,iBAAR,CAAvB;AACA,IAAM,cAAiB,QAAQ,gBAAR,CAAvB;AACA,IAAM,iBAAiB,QAAQ,mBAAR,CAAvB;;AAEA,IAAM,OAAO;AACX,YAAU;AACR,aAAc,KADN;AAER,kBAAc,IAFN;;AAIR,YAAY,IAJJ;AAKR,UAAY,IALJ;AAMR,cAAY,IANJ;AAOR,aAAY,IAPJ;AAQR,gBAAY,IARJ;;AAUR,eAAY,IAVJ;AAWR,cAAY;AAXJ,GADC;;AAeX,WAAS,iBAAU,OAAV,EAAmB,KAAnB,EAA0B,YAA1B,EAAwC;AAC/C,QAAM,cAAc,aAAa,OAAb,CAAqB,IAAzC;;AAEA,WAAO,YAAY,OAAZ,GACH,EAAE,MAAM,MAAR,EAAgB,MAAO,YAAY,QAAZ,KAAyB,OAAzB,GACE,YAAY,SADd,GAEE,YAAY,QAFrC,EADG,GAIH,IAJJ;AAKD,GAvBU;;AAyBX,aAAW,qBAAY;AACrB,WAAO,MAAP;AACD;AA3BU,CAAb;;AA8BA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,oBAAvB,EAA6C,gBAA2B;AAAA,MAAf,WAAe,QAAf,WAAe;;AACtE,MAAI,YAAY,QAAZ,CAAqB,IAArB,KAA8B,MAAlC,EAA0C;AAAE;AAAS;;AAErD,MAAM,OAAO,YAAY,QAAZ,CAAqB,IAAlC;;AAEA,MAAI,SAAS,GAAb,EAAkB;AAChB,gBAAY,SAAZ,CAAsB,IAAtB,CAA2B,CAA3B,GAAiC,YAAY,WAAZ,CAAwB,IAAxB,CAA6B,CAA9D;AACA,gBAAY,SAAZ,CAAsB,MAAtB,CAA6B,CAA7B,GAAiC,YAAY,WAAZ,CAAwB,MAAxB,CAA+B,CAAhE;;AAEA,gBAAY,YAAZ,CAAyB,IAAzB,CAA8B,KAA9B,GAAwC,KAAK,GAAL,CAAS,YAAY,YAAZ,CAAyB,IAAzB,CAA8B,EAAvC,CAAxC;AACA,gBAAY,YAAZ,CAAyB,MAAzB,CAAgC,KAAhC,GAAwC,KAAK,GAAL,CAAS,YAAY,YAAZ,CAAyB,MAAzB,CAAgC,EAAzC,CAAxC;AACA,gBAAY,YAAZ,CAAyB,MAAzB,CAAgC,EAAhC,GAAqC,CAArC;AACA,gBAAY,YAAZ,CAAyB,IAAzB,CAA8B,EAA9B,GAAqC,CAArC;AACD,GARD,MASK,IAAI,SAAS,GAAb,EAAkB;AACrB,gBAAY,SAAZ,CAAsB,IAAtB,CAA2B,CAA3B,GAAiC,YAAY,WAAZ,CAAwB,IAAxB,CAA6B,CAA9D;AACA,gBAAY,SAAZ,CAAsB,MAAtB,CAA6B,CAA7B,GAAiC,YAAY,WAAZ,CAAwB,MAAxB,CAA+B,CAAhE;;AAEA,gBAAY,YAAZ,CAAyB,IAAzB,CAA8B,KAA9B,GAAwC,KAAK,GAAL,CAAS,YAAY,YAAZ,CAAyB,IAAzB,CAA8B,EAAvC,CAAxC;AACA,gBAAY,YAAZ,CAAyB,MAAzB,CAAgC,KAAhC,GAAwC,KAAK,GAAL,CAAS,YAAY,YAAZ,CAAyB,MAAzB,CAAgC,EAAzC,CAAxC;AACA,gBAAY,YAAZ,CAAyB,MAAzB,CAAgC,EAAhC,GAAqC,CAArC;AACA,gBAAY,YAAZ,CAAyB,IAAzB,CAA8B,EAA9B,GAAqC,CAArC;AACD;AACF,CAvBD;;AAyBA;AACA,cAAc,OAAd,CAAsB,EAAtB,CAAyB,KAAzB,EAAgC,iBAAmC;AAAA,MAAvB,MAAuB,SAAvB,MAAuB;AAAA,MAAf,WAAe,SAAf,WAAe;;AACjE,MAAI,OAAO,IAAP,KAAgB,UAApB,EAAgC;AAAE;AAAS;;AAE3C,MAAM,OAAO,YAAY,QAAZ,CAAqB,IAAlC;;AAEA,MAAI,SAAS,GAAb,EAAkB;AAChB,WAAO,KAAP,GAAiB,YAAY,WAAZ,CAAwB,IAAxB,CAA6B,CAA9C;AACA,WAAO,OAAP,GAAiB,YAAY,WAAZ,CAAwB,MAAxB,CAA+B,CAAhD;AACA,WAAO,EAAP,GAAY,CAAZ;AACD,GAJD,MAKK,IAAI,SAAS,GAAb,EAAkB;AACrB,WAAO,KAAP,GAAiB,YAAY,WAAZ,CAAwB,IAAxB,CAA6B,CAA9C;AACA,WAAO,OAAP,GAAiB,YAAY,WAAZ,CAAwB,MAAxB,CAA+B,CAAhD;AACA,WAAO,EAAP,GAAY,CAAZ;AACD;AACF,CAfD;;AAiBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoCA,aAAa,SAAb,CAAuB,SAAvB,GAAmC,UAAU,OAAV,EAAmB;AACpD,MAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,OAAhB,CAAJ,EAA8B;AAC5B,SAAK,OAAL,CAAa,IAAb,CAAkB,OAAlB,GAA4B,QAAQ,OAAR,KAAoB,KAApB,GAA2B,KAA3B,GAAkC,IAA9D;AACA,SAAK,YAAL,CAAkB,MAAlB,EAA0B,OAA1B;AACA,SAAK,WAAL,CAAiB,MAAjB,EAAyB,OAAzB;;AAEA,QAAI,mBAAmB,IAAnB,CAAwB,QAAQ,QAAhC,CAAJ,EAA+C;AAC7C,WAAK,OAAL,CAAa,IAAb,CAAkB,QAAlB,GAA6B,QAAQ,QAArC;AACD;AACD,QAAI,aAAa,IAAb,CAAkB,QAAQ,SAA1B,CAAJ,EAA0C;AACxC,WAAK,OAAL,CAAa,IAAb,CAAkB,SAAlB,GAA8B,QAAQ,SAAtC;AACD;;AAED,WAAO,IAAP;AACD;;AAED,MAAI,MAAM,EAAN,CAAS,IAAT,CAAc,OAAd,CAAJ,EAA4B;AAC1B,SAAK,OAAL,CAAa,IAAb,CAAkB,OAAlB,GAA4B,OAA5B;;AAEA,QAAI,CAAC,OAAL,EAAc;AACZ,WAAK,WAAL,GAAmB,KAAK,WAAL,GAAmB,KAAK,SAAL,GAAiB,IAAvD;AACD;;AAED,WAAO,IAAP;AACD;;AAED,SAAO,KAAK,OAAL,CAAa,IAApB;AACD,CA3BD;;AA6BA,QAAQ,IAAR,GAAe,IAAf;AACA,QAAQ,KAAR,CAAc,IAAd,CAAmB,MAAnB;AACA,MAAM,KAAN,CAAY,aAAa,UAAzB,EAAqC,CACnC,WADmC,EAEnC,UAFmC,EAGnC,kBAHmC,EAInC,mBAJmC,EAKnC,SALmC,CAArC;AAOA,QAAQ,UAAR,CAAmB,IAAnB,GAA0B,WAA1B;;AAEA,eAAe,IAAf,GAAsB,KAAK,QAA3B;;AAEA,OAAO,OAAP,GAAiB,IAAjB;;;;;AC9JA,IAAM,UAAiB,QAAQ,QAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,UAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,UAAR,CAAvB;AACA,IAAM,WAAiB,QAAQ,aAAR,CAAvB;AACA,IAAM,gBAAiB,QAAQ,kBAAR,CAAvB;AACA,IAAM,eAAiB,QAAQ,iBAAR,CAAvB;AACA,IAAM,cAAiB,QAAQ,gBAAR,CAAvB;AACA,IAAM,iBAAiB,QAAQ,mBAAR,CAAvB;;AAEA,IAAM,OAAO;AACX,YAAU;AACR,aAAS,KADD;AAER,YAAS,IAFD;AAGR,aAAS;AAHD;AADC,CAAb;;AAQA,IAAI,cAAc,KAAlB;;AAEA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,cAAvB,EAAuC,gBAAkC;AAAA,MAAtB,WAAsB,QAAtB,WAAsB;AAAA,MAAT,KAAS,QAAT,KAAS;;AACvE,MAAI,YAAY,QAAZ,CAAqB,IAArB,KAA8B,MAAlC,EAA0C;AAAE;AAAS;;AAErD;AACA,cAAY,WAAZ,CAAwB,SAAxB,GAAoC,EAApC;AACA,cAAY,WAAZ,CAAwB,QAAxB,GAAoC,EAApC;AACA,cAAY,WAAZ,CAAwB,KAAxB,GAAoC,EAApC;;AAEA,cAAY,UAAZ,GAAyB,IAAzB;;AAEA,MAAI,CAAC,YAAY,WAAjB,EAA8B;AAC5B,mBAAe,WAAf,EAA4B,YAAY,OAAxC;AACD;;AAED,MAAM,YAAY,YAAY,SAA9B;AACA,MAAM,aAAa,cAAc,WAAd,EAA2B,KAA3B,EAAkC,SAAlC,CAAnB;;AAEA,MAAI,WAAW,QAAf,EAAyB;AACvB,oBAAgB,WAAhB,EAA6B,WAAW,QAAxC;AACD;AACF,CApBD;;AAsBA,cAAc,OAAd,CAAsB,EAAtB,CAAyB,KAAzB,EAAgC,iBAA0C;AAAA,MAA9B,WAA8B,SAA9B,WAA8B;AAAA,MAAjB,MAAiB,SAAjB,MAAiB;AAAA,MAAT,KAAS,SAAT,KAAS;;AACxE,MAAI,OAAO,IAAP,KAAgB,UAAhB,IAA8B,OAAO,IAAP,KAAgB,SAAlD,EAA6D;AAAE;AAAS;;AAExE,MAAM,mBAAmB,YAAY,OAArC;AACA,MAAM,YAAY,MAAlB;AACA,MAAM,aAAa,QAAQ,SAAR,EAAmB,KAAnB,EAA0B,gBAA1B,CAAnB;;AAEA,cAAY,UAAZ,GAA0B,WAAW,QAArC;AACA,cAAY,WAAZ,GAA0B,WAAW,OAArC;;AAEA,cAAY,UAAZ,GAAyB,cAAc,WAAd,EAA2B,KAA3B,EAAkC,SAAlC,CAAzB;AACD,CAXD;;AAaA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,aAAvB,EAAsC,iBAA2B;AAAA,MAAf,WAAe,SAAf,WAAe;;AAC/D,MAAI,YAAY,QAAZ,CAAqB,IAArB,KAA8B,MAAlC,EAA0C;AAAE;AAAS;;AAErD,iBAAe,WAAf,EAA4B,YAAY,UAAxC;AACD,CAJD;;AAMA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,YAAvB,EAAqC,iBAA2B;AAAA,MAAf,WAAe,SAAf,WAAe;;AAC9D,MAAI,YAAY,QAAZ,CAAqB,IAArB,KAA8B,MAAlC,EAA0C;AACxC,mBAAe,WAAf,EAA4B,YAAY,UAAxC;AACD;AACF,CAJD;;AAMA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,WAAvB,EAAoC,iBAA2B;AAAA,MAAf,WAAe,SAAf,WAAe;;AAC7D,cAAY,WAAZ,CAAwB,SAAxB,GACE,YAAY,WAAZ,CAAwB,QAAxB,GACA,YAAY,WAAZ,CAAwB,KAAxB,GACA,YAAY,UAAZ,GAAyB,IAH3B;AAID,CALD;;AAOA,SAAS,YAAT,CAAuB,WAAvB,EAAoC,OAApC,EAA6C;AAC3C,MAAM,QAAQ,EAAd;AACA,MAAM,WAAW,EAAjB;;AAEA,YAAU,WAAW,YAAY,OAAjC;;AAEA;AACA,uBAAsB,MAAM,aAA5B,kHAA2C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,QAAhC,OAAgC;;AACzC,QAAI,CAAC,QAAQ,OAAR,CAAgB,IAAhB,CAAqB,OAA1B,EAAmC;AAAE;AAAW;;AAEhD,QAAM,SAAS,QAAQ,OAAR,CAAgB,IAAhB,CAAqB,MAApC;;AAEA;AACA,QAAK,MAAM,EAAN,CAAS,OAAT,CAAiB,MAAjB,KAA4B,WAAW,OAAxC,IACI,MAAM,EAAN,CAAS,MAAT,CAAgB,MAAhB,KACD,CAAC,MAAM,eAAN,CAAsB,OAAtB,EAA+B,MAA/B,CAFR,EAEiD;;AAE/C;AACD;;AAED;AACA,QAAM,eAAe,MAAM,EAAN,CAAS,MAAT,CAAgB,QAAQ,MAAxB,IACjB,QAAQ,QAAR,CAAiB,gBAAjB,CAAkC,QAAQ,MAA1C,CADiB,GAEjB,CAAC,QAAQ,MAAT,CAFJ;;AAIA,SAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,aAAa,MAAjC,EAAyC,GAAzC,EAA8C;AAC5C,UAAM,iBAAiB,aAAa,CAAb,CAAvB;;AAEA,UAAI,mBAAmB,OAAvB,EAAgC;AAC9B,cAAM,IAAN,CAAW,OAAX;AACA,iBAAS,IAAT,CAAc,cAAd;AACD;AACF;AACF;;AAED,SAAO;AACL,sBADK;AAEL,eAAW;AAFN,GAAP;AAID;;AAED,SAAS,eAAT,CAA0B,WAA1B,EAAuC,KAAvC,EAA8C;AAC5C,MAAI,oBAAJ;;AAEA;AACA,OAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,YAAY,WAAZ,CAAwB,SAAxB,CAAkC,MAAtD,EAA8D,GAA9D,EAAmE;AACjE,QAAM,UAAU,YAAY,WAAZ,CAAwB,SAAxB,CAAkC,CAAlC,CAAhB;AACA,QAAM,iBAAiB,YAAY,WAAZ,CAAwB,QAAxB,CAAkC,CAAlC,CAAvB;;AAEA;AACA,QAAI,mBAAmB,WAAvB,EAAoC;AAClC;AACA,YAAM,MAAN,GAAe,cAAf;AACA,cAAQ,IAAR,CAAa,KAAb;AACD;AACD,kBAAc,cAAd;AACD;AACF;;AAED;AACA;AACA;AACA,SAAS,cAAT,CAAyB,WAAzB,EAAsC,WAAtC,EAAmD;AACjD;AACA,MAAM,gBAAgB,aAAa,WAAb,EAA0B,WAA1B,EAAuC,IAAvC,CAAtB;;AAEA,cAAY,WAAZ,CAAwB,SAAxB,GAAoC,cAAc,SAAlD;AACA,cAAY,WAAZ,CAAwB,QAAxB,GAAoC,cAAc,QAAlD;AACA,cAAY,WAAZ,CAAwB,KAAxB,GAAoC,EAApC;;AAEA,OAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,YAAY,WAAZ,CAAwB,SAAxB,CAAkC,MAAtD,EAA8D,GAA9D,EAAmE;AACjE,gBAAY,WAAZ,CAAwB,KAAxB,CAA8B,CAA9B,IACE,YAAY,WAAZ,CAAwB,SAAxB,CAAkC,CAAlC,EAAqC,OAArC,CAA6C,YAAY,WAAZ,CAAwB,QAAxB,CAAiC,CAAjC,CAA7C,CADF;AAED;AACF;;AAED,SAAS,OAAT,CAAkB,SAAlB,EAA6B,KAA7B,EAAoC,WAApC,EAAiD;AAC/C,MAAM,cAAc,UAAU,WAA9B;AACA,MAAM,aAAa,EAAnB;;AAEA,MAAI,WAAJ,EAAiB;AACf,mBAAe,WAAf,EAA4B,WAA5B;AACD;;AAED;AACA,OAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,YAAY,WAAZ,CAAwB,SAAxB,CAAkC,MAAtD,EAA8D,GAA9D,EAAmE;AACjE,QAAM,UAAiB,YAAY,WAAZ,CAAwB,SAAxB,CAAkC,CAAlC,CAAvB;AACA,QAAM,iBAAiB,YAAY,WAAZ,CAAwB,QAAxB,CAAkC,CAAlC,CAAvB;AACA,QAAM,OAAiB,YAAY,WAAZ,CAAwB,KAAxB,CAAkC,CAAlC,CAAvB;;AAEA,eAAW,IAAX,CAAgB,QAAQ,SAAR,CAAkB,SAAlB,EAA6B,KAA7B,EAAoC,YAAY,MAAhD,EAAwD,WAAxD,EAAqE,cAArE,EAAqF,IAArF,IACZ,cADY,GAEZ,IAFJ;AAGD;;AAED;AACA,MAAM,YAAY,MAAM,qBAAN,CAA4B,UAA5B,CAAlB;;AAEA,SAAO;AACL,cAAU,YAAY,WAAZ,CAAwB,SAAxB,CAAkC,SAAlC,KAAgD,IADrD;AAEL,aAAU,YAAY,WAAZ,CAAwB,QAAxB,CAAkC,SAAlC,KAAgD;AAFrD,GAAP;AAID;;AAED,SAAS,aAAT,CAAwB,WAAxB,EAAqC,YAArC,EAAmD,SAAnD,EAA8D;AAC5D,MAAM,aAAa;AACjB,WAAY,IADK;AAEjB,WAAY,IAFK;AAGjB,cAAY,IAHK;AAIjB,gBAAY,IAJK;AAKjB,UAAY,IALK;AAMjB,UAAY;AANK,GAAnB;;AASA,MAAM,OAAO;AACX,wBADW;AAEX,4BAFW;AAGX,YAAe,YAAY,WAHhB;AAIX,cAAe,YAAY,UAJhB;AAKX,mBAAe,UAAU,MALd;AAMX,eAAe,UAAU,YANd;AAOX,eAAe,UAAU;AAPd,GAAb;;AAUA,MAAI,YAAY,WAAZ,KAA4B,YAAY,eAA5C,EAA6D;AAC3D;AACA,QAAI,YAAY,cAAhB,EAAgC;AAC9B,iBAAW,KAAX,GAAmB,MAAM,MAAN,CAAa,EAAE,MAAM,WAAR,EAAb,EAAoC,IAApC,CAAnB;;AAEA,gBAAU,SAAV,GAAyB,WAAW,KAAX,CAAiB,MAAjB,GAA4B,YAAY,eAAjE;AACA,gBAAU,YAAV,GAAyB,WAAW,KAAX,CAAiB,QAAjB,GAA4B,YAAY,cAAjE;AACD;AACD;AACA,QAAI,YAAY,UAAhB,EAA4B;AAC1B,iBAAW,KAAX,GAAmB;AACjB,4BADiB;AAEjB,gCAFiB;AAGjB,gBAAe,YAAY,WAHV;AAIjB,kBAAe,YAAY,UAJV;AAKjB,uBAAe,UAAU,MALR;AAMjB,mBAAe,UAAU,YANR;AAOjB,mBAAe,UAAU,SAPR;AAQjB,cAAe;AARE,OAAnB;;AAWA,gBAAU,SAAV,GAAsB,YAAY,WAAlC;AACA,gBAAU,QAAV,GAAqB,YAAY,UAAjC;AACD;AACF;;AAED,MAAI,UAAU,IAAV,KAAmB,SAAnB,IAAgC,YAAY,UAAhD,EAA4D;AAC1D,eAAW,IAAX,GAAkB,MAAM,MAAN,CAAa,EAAE,MAAM,MAAR,EAAb,EAA+B,IAA/B,CAAlB;;AAEA,cAAU,QAAV,GAAqB,YAAY,UAAjC;AACA,cAAU,aAAV,GAA0B,YAAY,WAAtC;AACD;AACD,MAAI,UAAU,IAAV,KAAmB,WAAvB,EAAoC;AAClC,eAAW,QAAX,GAAsB,MAAM,MAAN,CAAa,EAAE,MAAM,cAAR,EAAb,EAAuC,IAAvC,CAAtB;;AAEA,eAAW,QAAX,CAAoB,MAApB,GAA+B,IAA/B;AACA,eAAW,QAAX,CAAoB,QAApB,GAA+B,IAA/B;AACD;AACD,MAAI,UAAU,IAAV,KAAmB,SAAvB,EAAkC;AAChC,eAAW,UAAX,GAAwB,MAAM,MAAN,CAAa,EAAE,MAAM,gBAAR,EAAb,EAAyC,IAAzC,CAAxB;;AAEA,eAAW,UAAX,CAAsB,MAAtB,GAAiC,IAAjC;AACA,eAAW,UAAX,CAAsB,QAAtB,GAAiC,IAAjC;AACD;AACD,MAAI,UAAU,IAAV,KAAmB,UAAnB,IAAiC,YAAY,UAAjD,EAA6D;AAC3D,eAAW,IAAX,GAAkB,MAAM,MAAN,CAAa;AAC7B,gBAAe,SADc;AAE7B,YAAe;AAFc,KAAb,EAGf,IAHe,CAAlB;;AAKA,cAAU,QAAV,GAAqB,YAAY,UAAjC;AACD;;AAED,SAAO,UAAP;AACD;;AAED,SAAS,cAAT,CAAyB,WAAzB,EAAsC,UAAtC,EAAkD;AAChD,MAAI,WAAW,KAAf,EAAsB;AAAE,gBAAY,cAAZ,CAA2B,IAA3B,CAAgC,WAAW,KAA3C;AAAoD;AAC5E,MAAI,WAAW,IAAf,EAAsB;AAAM,gBAAY,UAAZ,CAAuB,IAAvB,CAA4B,WAAW,IAAvC;AAAgD;AAC5E,MAAI,WAAW,KAAf,EAAsB;AAAM,gBAAY,UAAZ,CAAuB,IAAvB,CAA4B,WAAW,KAAvC;AAAgD;AAC5E,MAAI,WAAW,IAAf,EAAsB;AAAM,gBAAY,UAAZ,CAAuB,IAAvB,CAA4B,WAAW,IAAvC;AAAgD;AAC5E,MAAI,WAAW,UAAf,EAA2B;AACzB,oBAAgB,WAAhB,EAA6B,WAAW,UAAxC;AACD;;AAED,cAAY,cAAZ,GAA8B,YAAY,UAA1C;AACA,cAAY,eAAZ,GAA8B,YAAY,WAA1C;AACD;;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoDA,aAAa,SAAb,CAAuB,QAAvB,GAAkC,UAAU,OAAV,EAAmB;AACnD,MAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,OAAhB,CAAJ,EAA8B;AAC5B,SAAK,OAAL,CAAa,IAAb,CAAkB,OAAlB,GAA4B,QAAQ,OAAR,KAAoB,KAApB,GAA2B,KAA3B,GAAkC,IAA9D;;AAEA,QAAI,MAAM,EAAN,CAAS,QAAT,CAAkB,QAAQ,MAA1B,CAAJ,EAAiD;AAAE,WAAK,MAAL,CAAY,MAAZ,GAA+B,QAAQ,MAAvC;AAA0D;AAC7G,QAAI,MAAM,EAAN,CAAS,QAAT,CAAkB,QAAQ,cAA1B,CAAJ,EAAiD;AAAE,WAAK,MAAL,CAAY,cAAZ,GAA+B,QAAQ,cAAvC;AAA0D;AAC7G,QAAI,MAAM,EAAN,CAAS,QAAT,CAAkB,QAAQ,gBAA1B,CAAJ,EAAiD;AAAE,WAAK,MAAL,CAAY,gBAAZ,GAA+B,QAAQ,gBAAvC;AAA0D;AAC7G,QAAI,MAAM,EAAN,CAAS,QAAT,CAAkB,QAAQ,WAA1B,CAAJ,EAAiD;AAAE,WAAK,MAAL,CAAY,WAAZ,GAA+B,QAAQ,WAAvC;AAA0D;AAC7G,QAAI,MAAM,EAAN,CAAS,QAAT,CAAkB,QAAQ,WAA1B,CAAJ,EAAiD;AAAE,WAAK,MAAL,CAAY,WAAZ,GAA+B,QAAQ,WAAvC;AAA0D;AAC7G,QAAI,MAAM,EAAN,CAAS,QAAT,CAAkB,QAAQ,UAA1B,CAAJ,EAAiD;AAAE,WAAK,MAAL,CAAY,UAAZ,GAA+B,QAAQ,UAAvC;AAA0D;;AAE7G,QAAI,qBAAqB,IAArB,CAA0B,QAAQ,OAAlC,CAAJ,EAAgD;AAC9C,WAAK,OAAL,CAAa,IAAb,CAAkB,OAAlB,GAA4B,QAAQ,OAApC;AACD,KAFD,MAGK,IAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,QAAQ,OAAxB,CAAJ,EAAsC;AACzC,WAAK,OAAL,CAAa,IAAb,CAAkB,OAAlB,GAA4B,KAAK,GAAL,CAAS,KAAK,GAAL,CAAS,CAAT,EAAY,QAAQ,OAApB,CAAT,EAAuC,CAAvC,CAA5B;AACD;AACD,QAAI,YAAY,OAAhB,EAAyB;AACvB,WAAK,OAAL,CAAa,IAAb,CAAkB,MAAlB,GAA2B,QAAQ,MAAnC;AACD;AACD,QAAI,aAAa,OAAjB,EAA0B;AACxB,WAAK,OAAL,CAAa,IAAb,CAAkB,OAAlB,GAA4B,QAAQ,OAApC;AACD;;AAGD,WAAO,IAAP;AACD;;AAED,MAAI,MAAM,EAAN,CAAS,IAAT,CAAc,OAAd,CAAJ,EAA4B;AAC1B,SAAK,OAAL,CAAa,IAAb,CAAkB,OAAlB,GAA4B,OAA5B;;AAEA,QAAI,CAAC,OAAL,EAAc;AACZ,WAAK,WAAL,GAAmB,KAAK,WAAL,GAAmB,KAAK,MAAL,GAClC,KAAK,cAAL,GAAsB,KAAK,gBAAL,GAAwB,IADlD;AAED;;AAED,WAAO,IAAP;AACD;;AAED,SAAO,KAAK,OAAL,CAAa,IAApB;AACD,CAxCD;;AA0CA,aAAa,SAAb,CAAuB,SAAvB,GAAmC,UAAU,SAAV,EAAqB,KAArB,EAA4B,SAA5B,EAAuC,gBAAvC,EAAyD,WAAzD,EAAsE,IAAtE,EAA4E;AAC7G,MAAI,UAAU,KAAd;;AAEA;AACA;AACA,MAAI,EAAE,OAAO,QAAQ,KAAK,OAAL,CAAa,WAAb,CAAjB,CAAJ,EAAiD;AAC/C,WAAQ,KAAK,OAAL,CAAa,IAAb,CAAkB,OAAlB,GACJ,KAAK,OAAL,CAAa,IAAb,CAAkB,OAAlB,CAA0B,SAA1B,EAAqC,KAArC,EAA4C,OAA5C,EAAqD,IAArD,EAA2D,WAA3D,EAAwE,SAAxE,EAAmF,gBAAnF,CADI,GAEJ,KAFJ;AAGD;;AAED,MAAM,cAAc,KAAK,OAAL,CAAa,IAAb,CAAkB,OAAtC;;AAEA,MAAI,gBAAgB,SAApB,EAA+B;AAC7B,QAAM,SAAS,MAAM,WAAN,CAAkB,SAAlB,EAA6B,gBAA7B,EAA+C,MAA/C,CAAf;AACA,QAAM,OAAO,MAAM,SAAN,CAAgB,SAAhB,CAAb;;AAEA,SAAK,CAAL,IAAU,OAAO,CAAjB;AACA,SAAK,CAAL,IAAU,OAAO,CAAjB;;AAEA,QAAM,aAAc,KAAK,CAAL,GAAS,KAAK,IAAf,IAAyB,KAAK,CAAL,GAAS,KAAK,KAA1D;AACA,QAAM,WAAc,KAAK,CAAL,GAAS,KAAK,GAAf,IAAyB,KAAK,CAAL,GAAS,KAAK,MAA1D;;AAEA,cAAU,cAAc,QAAxB;AACD;;AAED,MAAM,WAAW,UAAU,OAAV,CAAkB,gBAAlB,CAAjB;;AAEA,MAAI,YAAY,gBAAgB,QAAhC,EAA0C;AACxC,QAAM,KAAK,SAAS,IAAT,GAAgB,SAAS,KAAT,GAAkB,CAA7C;AACA,QAAM,KAAK,SAAS,GAAT,GAAgB,SAAS,MAAT,GAAkB,CAA7C;;AAEA,cAAU,MAAM,KAAK,IAAX,IAAmB,MAAM,KAAK,KAA9B,IAAuC,MAAM,KAAK,GAAlD,IAAyD,MAAM,KAAK,MAA9E;AACD;;AAED,MAAI,YAAY,MAAM,EAAN,CAAS,MAAT,CAAgB,WAAhB,CAAhB,EAA8C;AAC5C,QAAM,cAAgB,KAAK,GAAL,CAAS,CAAT,EAAY,KAAK,GAAL,CAAS,KAAK,KAAd,EAAsB,SAAS,KAA/B,IAAyC,KAAK,GAAL,CAAS,KAAK,IAAd,EAAoB,SAAS,IAA7B,CAArD,IACE,KAAK,GAAL,CAAS,CAAT,EAAY,KAAK,GAAL,CAAS,KAAK,MAAd,EAAsB,SAAS,MAA/B,IAAyC,KAAK,GAAL,CAAS,KAAK,GAAd,EAAoB,SAAS,GAA7B,CAArD,CADxB;;AAGA,QAAM,eAAe,eAAe,SAAS,KAAT,GAAiB,SAAS,MAAzC,CAArB;;AAEA,cAAU,gBAAgB,WAA1B;AACD;;AAED,MAAI,KAAK,OAAL,CAAa,IAAb,CAAkB,OAAtB,EAA+B;AAC7B,cAAU,KAAK,OAAL,CAAa,IAAb,CAAkB,OAAlB,CAA0B,SAA1B,EAAqC,KAArC,EAA4C,OAA5C,EAAqD,IAArD,EAA2D,WAA3D,EAAwE,SAAxE,EAAmF,gBAAnF,CAAV;AACD;;AAED,SAAO,OAAP;AACD,CAjDD;;AAmDA,aAAa,OAAb,CAAqB,EAArB,CAAwB,OAAxB,EAAiC,iBAA4B;AAAA,MAAhB,YAAgB,SAAhB,YAAgB;;AAC3D,eAAa,QAAb,CAAsB,KAAtB;AACD,CAFD;;AAIA,aAAa,eAAb,CAA6B,IAA7B,CAAkC,aAAlC;;AAEA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,KAAvB,EAA8B,UAAU,WAAV,EAAuB;AACnD,cAAY,UAAZ,GAA8B,IAA9B,CADmD,CACf;AACpC,cAAY,WAAZ,GAA8B,IAA9B,CAFmD,CAEf;AACpC,cAAY,cAAZ,GAA8B,IAA9B,CAHmD,CAGf;AACpC,cAAY,eAAZ,GAA8B,IAA9B,CAJmD,CAIf;AACpC,cAAY,UAAZ,GAA8B,IAA9B,CALmD,CAKf;;AAEpC,cAAY,WAAZ,GAA0B;AACxB,eAAW,EADa,EACJ;AACpB,cAAW,EAFa,EAEJ;AACpB,WAAW,EAHa,CAGJ;AAHI,GAA1B;AAMD,CAbD;;AAeA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,MAAvB,EAA+B,iBAA2B;AAAA,MAAf,WAAe,SAAf,WAAe;;AACxD,cAAY,UAAZ,GAAyB,YAAY,WAAZ,GACvB,YAAY,cAAZ,GAA6B,YAAY,eAAZ,GAA8B,IAD7D;AAED,CAHD;;AAKA;;;;;;;;;;;AAWA,SAAS,WAAT,GAAuB,UAAU,QAAV,EAAoB;AACzC,MAAI,MAAM,EAAN,CAAS,IAAT,CAAc,QAAd,CAAJ,EAA6B;AAC3B;AACE;AACF;;AAEA,kBAAc,QAAd;;AAEA,WAAO,QAAP;AACD;AACD,SAAO,WAAP;AACD,CAXD;;AAaA,MAAM,KAAN,CAAY,aAAa,UAAzB,EAAqC,CACnC,WADmC,EAEnC,WAFmC,EAGnC,cAHmC,EAInC,gBAJmC,EAKnC,UALmC,EAMnC,MANmC,CAArC;AAQA,QAAQ,UAAR,CAAmB,IAAnB,GAA0B,UAA1B;;AAEA,eAAe,IAAf,GAAsB,KAAK,QAA3B;;AAEA,OAAO,OAAP,GAAiB,IAAjB;;;;;ACzdA,IAAM,UAAiB,QAAQ,QAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,UAAR,CAAvB;AACA,IAAM,gBAAiB,QAAQ,kBAAR,CAAvB;AACA,IAAM,eAAiB,QAAQ,iBAAR,CAAvB;AACA,IAAM,cAAiB,QAAQ,gBAAR,CAAvB;AACA,IAAM,iBAAiB,QAAQ,mBAAR,CAAvB;;AAEA,IAAM,UAAU;AACd,YAAU;AACR,aAAU,KADF;AAER,YAAU,IAFF;AAGR,cAAU;AAHF,GADI;;AAOd,WAAS,iBAAU,OAAV,EAAmB,KAAnB,EAA0B,YAA1B,EAAwC,OAAxC,EAAiD,WAAjD,EAA8D;AACrE,QAAI,YAAY,UAAZ,CAAuB,MAAvB,IAAiC,CAArC,EAAwC;AACtC,aAAO,EAAE,MAAM,SAAR,EAAP;AACD;;AAED,WAAO,IAAP;AACD,GAba;;AAed,aAAW,qBAAY;AACrB,WAAO,EAAP;AACD;AAjBa,CAAhB;;AAoBA,cAAc,OAAd,CAAsB,EAAtB,CAAyB,KAAzB,EAAgC,gBAAmC;AAAA,MAAvB,MAAuB,QAAvB,MAAuB;AAAA,MAAf,WAAe,QAAf,WAAe;;AACjE,MAAI,OAAO,IAAP,KAAgB,cAApB,EAAoC;AAAE;AAAS;AAC/C,SAAO,EAAP,GAAY,CAAZ;;AAEA,cAAY,OAAZ,CAAoB,aAApB,GAAoC,YAAY,OAAZ,CAAoB,YAApB,GAAmC,OAAO,QAA9E;AACA,cAAY,OAAZ,CAAoB,UAApB,GAAiC,YAAY,OAAZ,CAAoB,SAApB,GAAgC,OAAO,KAAxE;AACA,cAAY,OAAZ,CAAoB,KAApB,GAA4B,CAA5B;AACD,CAPD;;AASA,cAAc,OAAd,CAAsB,EAAtB,CAAyB,KAAzB,EAAgC,iBAAmC;AAAA,MAAvB,MAAuB,SAAvB,MAAuB;AAAA,MAAf,WAAe,SAAf,WAAe;;AACjE,MAAI,OAAO,IAAP,KAAgB,aAApB,EAAmC;AAAE;AAAS;;AAE9C,SAAO,EAAP,GAAY,OAAO,KAAP,GAAe,YAAY,OAAZ,CAAoB,KAA/C;;AAEA,cAAY,MAAZ,CAAmB,IAAnB,CAAwB,MAAxB;;AAEA,cAAY,OAAZ,CAAoB,SAApB,GAAgC,OAAO,KAAvC;AACA,cAAY,OAAZ,CAAoB,YAApB,GAAmC,OAAO,QAA1C;;AAEA,MAAI,OAAO,KAAP,KAAiB,QAAjB,IACG,OAAO,KAAP,KAAiB,IADpB,IAEG,OAAO,KAAP,KAAiB,SAFpB,IAGG,CAAC,MAAM,OAAO,KAAb,CAHR,EAG6B;;AAE3B,gBAAY,OAAZ,CAAoB,KAApB,GAA4B,OAAO,KAAnC;AACD;AACF,CAjBD;;AAmBA;;;;;;;;;;;;;;;;;;;;;;;AAuBA,aAAa,SAAb,CAAuB,UAAvB,GAAoC,UAAU,OAAV,EAAmB;AACrD,MAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,OAAhB,CAAJ,EAA8B;AAC5B,SAAK,OAAL,CAAa,OAAb,CAAqB,OAArB,GAA+B,QAAQ,OAAR,KAAoB,KAApB,GAA2B,KAA3B,GAAkC,IAAjE;AACA,SAAK,YAAL,CAAkB,SAAlB,EAA6B,OAA7B;AACA,SAAK,WAAL,CAAiB,SAAjB,EAA4B,OAA5B;;AAEA,WAAO,IAAP;AACD;;AAED,MAAI,MAAM,EAAN,CAAS,IAAT,CAAc,OAAd,CAAJ,EAA4B;AAC1B,SAAK,OAAL,CAAa,OAAb,CAAqB,OAArB,GAA+B,OAA/B;;AAEA,QAAI,CAAC,OAAL,EAAc;AACZ,WAAK,cAAL,GAAsB,KAAK,cAAL,GAAsB,KAAK,YAAL,GAAoB,IAAhE;AACD;;AAED,WAAO,IAAP;AACD;;AAED,SAAO,KAAK,OAAL,CAAa,OAApB;AACD,CApBD;;AAsBA,cAAc,OAAd,CAAsB,EAAtB,CAAyB,WAAzB,EAAsC,iBAAiF;AAAA,MAArE,WAAqE,SAArE,WAAqE;AAAA,MAAxD,MAAwD,SAAxD,MAAwD;AAAA,MAAhD,MAAgD,SAAhD,MAAgD;AAAA,MAAxC,KAAwC,SAAxC,KAAwC;AAAA,MAAjC,QAAiC,SAAjC,QAAiC;AAAA,MAAvB,MAAuB,SAAvB,MAAuB;AAAA,MAAf,WAAe,SAAf,WAAe;;AACrH,MAAI,WAAW,SAAf,EAA0B;AAAE;AAAS;;AAErC,MAAM,WAAW,YAAY,QAA7B;;AAEA,SAAO,OAAP,GAAiB,CAAC,SAAS,CAAT,CAAD,EAAc,SAAS,CAAT,CAAd,CAAjB;;AAEA,MAAI,QAAJ,EAAc;AACZ,WAAO,QAAP,GAAkB,MAAM,aAAN,CAAoB,QAApB,EAA8B,WAA9B,CAAlB;AACA,WAAO,GAAP,GAAkB,MAAM,SAAN,CAAgB,QAAhB,CAAlB;AACA,WAAO,KAAP,GAAkB,CAAlB;AACA,WAAO,EAAP,GAAkB,CAAlB;AACA,WAAO,KAAP,GAAkB,MAAM,UAAN,CAAiB,QAAjB,EAA2B,SAA3B,EAAsC,WAAtC,CAAlB;AACA,WAAO,EAAP,GAAkB,CAAlB;AACD,GAPD,MAQK,IAAI,UAAU,iBAAiB,aAA/B,EAA8C;AACjD,WAAO,QAAP,GAAkB,YAAY,SAAZ,CAAsB,QAAxC;AACA,WAAO,GAAP,GAAkB,YAAY,SAAZ,CAAsB,GAAxC;AACA,WAAO,KAAP,GAAkB,YAAY,SAAZ,CAAsB,KAAxC;AACA,WAAO,EAAP,GAAkB,OAAO,KAAP,GAAe,CAAjC;AACA,WAAO,KAAP,GAAkB,YAAY,SAAZ,CAAsB,KAAxC;AACA,WAAO,EAAP,GAAkB,OAAO,KAAP,GAAe,YAAY,OAAZ,CAAoB,UAArD;AACD,GAPI,MAQA;AACH,WAAO,QAAP,GAAkB,MAAM,aAAN,CAAoB,QAApB,EAA8B,WAA9B,CAAlB;AACA,WAAO,GAAP,GAAkB,MAAM,SAAN,CAAgB,QAAhB,CAAlB;AACA,WAAO,KAAP,GAAkB,OAAO,QAAP,GAAkB,YAAY,OAAZ,CAAoB,aAAxD;AACA,WAAO,KAAP,GAAkB,MAAM,UAAN,CAAiB,QAAjB,EAA2B,YAAY,OAAZ,CAAoB,SAA/C,EAA0D,WAA1D,CAAlB;;AAEA,WAAO,EAAP,GAAY,OAAO,KAAP,GAAe,YAAY,OAAZ,CAAoB,SAA/C;AACA,WAAO,EAAP,GAAY,OAAO,KAAP,GAAe,YAAY,OAAZ,CAAoB,SAA/C;AACD;AACF,CAhCD;;AAkCA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,KAAvB,EAA8B,UAAU,WAAV,EAAuB;AACnD,cAAY,OAAZ,GAAsB;AACpB,WAAO,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EADa;;AAGpB,mBAAe,CAHK,EAGA;AACpB,kBAAe,CAJK;AAKpB,cAAe,CALK;;AAOpB,WAAO,CAPa,EAOA;;AAEpB,gBAAY,CATQ,EASA;AACpB,eAAY,CAVQ,CAUA;AAVA,GAAtB;AAYD,CAbD;;AAeA,QAAQ,OAAR,GAAkB,OAAlB;AACA,QAAQ,KAAR,CAAc,IAAd,CAAmB,SAAnB;AACA,MAAM,KAAN,CAAY,aAAa,UAAzB,EAAqC,CACnC,cADmC,EAEnC,aAFmC,EAGnC,YAHmC,CAArC;AAKA,QAAQ,UAAR,CAAmB,OAAnB,GAA6B,YAA7B;;AAEA,eAAe,OAAf,GAAyB,QAAQ,QAAjC;;AAEA,OAAO,OAAP,GAAiB,OAAjB;;;;;AChKA,IAAM,UAAiB,QAAQ,QAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,UAAR,CAAvB;AACA,IAAM,UAAiB,QAAQ,kBAAR,CAAvB;AACA,IAAM,gBAAiB,QAAQ,kBAAR,CAAvB;AACA,IAAM,eAAiB,QAAQ,iBAAR,CAAvB;AACA,IAAM,cAAiB,QAAQ,gBAAR,CAAvB;AACA,IAAM,iBAAiB,QAAQ,mBAAR,CAAvB;;AAEA;AACA,IAAM,gBAAgB,QAAQ,aAAR,IAAyB,QAAQ,oBAAjC,GAAuD,EAAvD,GAA2D,EAAjF;;AAEA,IAAM,SAAS;AACb,YAAU;AACR,aAAc,KADN;AAER,kBAAc,IAFN;;AAIR,YAAY,IAJJ;AAKR,UAAY,IALJ;AAMR,cAAY,IANJ;AAOR,aAAY,IAPJ;AAQR,gBAAY,IARJ;;AAUR,YAAQ,KAVA;AAWR,yBAAqB,KAXb;AAYR,UAAM,IAZE;;AAcR;AACA,YAAQ,GAfA;;AAiBR;AACA;AACA;AACA;AACA,WAAO,IArBC;;AAuBR;AACA;AACA;AACA;AACA,YAAQ;AA3BA,GADG;;AA+Bb,WAAS,iBAAU,OAAV,EAAmB,KAAnB,EAA0B,YAA1B,EAAwC,OAAxC,EAAiD,WAAjD,EAA8D,IAA9D,EAAoE;AAC3E,QAAI,CAAC,IAAL,EAAW;AAAE,aAAO,IAAP;AAAc;;AAE3B,QAAM,OAAO,MAAM,MAAN,CAAa,EAAb,EAAiB,YAAY,SAAZ,CAAsB,IAAvC,CAAb;AACA,QAAM,UAAU,aAAa,OAA7B;;AAEA,QAAI,QAAQ,MAAR,CAAe,OAAnB,EAA4B;AAC1B,UAAM,gBAAgB,QAAQ,MAA9B;AACA,UAAM,cAAc,EAAE,MAAM,KAAR,EAAe,OAAO,KAAtB,EAA6B,KAAK,KAAlC,EAAyC,QAAQ,KAAjD,EAApB;;AAEA;AACA,UAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,cAAc,KAA9B,CAAJ,EAA0C;AACxC,aAAK,IAAM,IAAX,IAAmB,WAAnB,EAAgC;AAC9B,sBAAY,IAAZ,IAAoB,gBAAgB,IAAhB,EACgB,cAAc,KAAd,CAAoB,IAApB,CADhB,EAEgB,IAFhB,EAGgB,YAAY,YAH5B,EAIgB,OAJhB,EAKgB,IALhB,EAMgB,cAAc,MAAd,IAAwB,aANxC,CAApB;AAOD;;AAED,oBAAY,IAAZ,GAAmB,YAAY,IAAZ,IAAoB,CAAC,YAAY,KAApD;AACA,oBAAY,GAAZ,GAAmB,YAAY,GAAZ,IAAoB,CAAC,YAAY,MAApD;;AAEA,YAAI,YAAY,IAAZ,IAAoB,YAAY,KAAhC,IAAyC,YAAY,GAArD,IAA4D,YAAY,MAA5E,EAAoF;AAClF,iBAAO;AACL,kBAAM,QADD;AAEL,mBAAO;AAFF,WAAP;AAID;AACF,OApBD,MAqBK;AACH,YAAM,QAAS,QAAQ,MAAR,CAAe,IAAf,KAAwB,GAAxB,IAA+B,KAAK,CAAL,GAAU,KAAK,KAAL,GAAc,aAAtE;AACA,YAAM,SAAS,QAAQ,MAAR,CAAe,IAAf,KAAwB,GAAxB,IAA+B,KAAK,CAAL,GAAU,KAAK,MAAL,GAAc,aAAtE;;AAEA,YAAI,SAAS,MAAb,EAAqB;AACnB,iBAAO;AACL,kBAAM,QADD;AAEL,kBAAM,CAAC,QAAO,GAAP,GAAa,EAAd,KAAqB,SAAQ,GAAR,GAAc,EAAnC;AAFD,WAAP;AAID;AACF;AACF;;AAED,WAAO,IAAP;AACD,GA7EY;;AA+Eb,WAAU,QAAQ,YAAR,GAAuB;AAC/B,OAAI,UAD2B;AAE/B,OAAI,UAF2B;AAG/B,QAAI,WAH2B;;AAK/B,SAAa,UALkB;AAM/B,UAAa,UANkB;AAO/B,YAAa,UAPkB;AAQ/B,WAAa,UARkB;AAS/B,aAAa,WATkB;AAU/B,iBAAa,WAVkB;AAW/B,cAAa,WAXkB;AAY/B,gBAAa;AAZkB,GAAvB,GAaN;AACF,OAAI,WADF;AAEF,OAAI,WAFF;AAGF,QAAI,aAHF;;AAKF,SAAa,WALX;AAMF,UAAa,WANX;AAOF,YAAa,WAPX;AAQF,WAAa,WARX;AASF,aAAa,aATX;AAUF,iBAAa,aAVX;AAWF,cAAa,aAXX;AAYF,gBAAa;AAZX,GA5FS;;AA2Gb,aAAW,mBAAU,MAAV,EAAkB;AAC3B,QAAI,OAAO,IAAX,EAAiB;AACf,aAAO,OAAO,OAAP,CAAe,OAAO,IAAP,GAAc,OAAO,IAApC,CAAP;AACD,KAFD,MAGK,IAAI,OAAO,KAAX,EAAkB;AACrB,UAAI,YAAY,EAAhB;AACA,UAAM,YAAY,CAAC,KAAD,EAAQ,QAAR,EAAkB,MAAlB,EAA0B,OAA1B,CAAlB;;AAEA,WAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,CAApB,EAAuB,GAAvB,EAA4B;AAC1B,YAAI,OAAO,KAAP,CAAa,UAAU,CAAV,CAAb,CAAJ,EAAgC;AAC9B,uBAAa,UAAU,CAAV,CAAb;AACD;AACF;;AAED,aAAO,OAAO,OAAP,CAAe,SAAf,CAAP;AACD;AACF;AA3HY,CAAf;;AA8HA;AACA,cAAc,OAAd,CAAsB,EAAtB,CAAyB,KAAzB,EAAgC,gBAAmC;AAAA,MAAvB,MAAuB,QAAvB,MAAuB;AAAA,MAAf,WAAe,QAAf,WAAe;;AACjE,MAAI,OAAO,IAAP,KAAgB,aAAhB,IAAiC,CAAC,YAAY,QAAZ,CAAqB,KAA3D,EAAkE;AAChE;AACD;;AAED,MAAM,YAAY,YAAY,MAAZ,CAAmB,OAAnB,CAA2B,YAAY,OAAvC,CAAlB;AACA,MAAM,gBAAgB,YAAY,MAAZ,CAAmB,OAAnB,CAA2B,MAAjD;;AAEA;;;;;;AAMA,MAAI,cAAc,MAAd,IAAwB,cAAc,mBAA1C,EAA+D;AAC7D,QAAM,cAAc,MAAM,MAAN,CAAa,EAAb,EAAiB,YAAY,QAAZ,CAAqB,KAAtC,CAApB;;AAEA,gBAAY,GAAZ,GAAqB,YAAY,GAAZ,IAAuB,YAAY,IAAZ,IAAsB,CAAC,YAAY,MAA/E;AACA,gBAAY,IAAZ,GAAqB,YAAY,IAAZ,IAAuB,YAAY,GAAZ,IAAsB,CAAC,YAAY,KAA/E;AACA,gBAAY,MAAZ,GAAqB,YAAY,MAAZ,IAAuB,YAAY,KAAZ,IAAsB,CAAC,YAAY,GAA/E;AACA,gBAAY,KAAZ,GAAqB,YAAY,KAAZ,IAAuB,YAAY,MAAZ,IAAsB,CAAC,YAAY,IAA/E;;AAEA,gBAAY,QAAZ,CAAqB,YAArB,GAAoC,WAApC;AACD,GATD,MAUK;AACH,gBAAY,QAAZ,CAAqB,YAArB,GAAoC,IAApC;AACD;;AAED;AACA,MAAI,cAAc,mBAAlB,EAAuC;AACrC,gBAAY,sBAAZ,GAAqC,UAAU,KAAV,GAAkB,UAAU,MAAjE;AACD;;AAED,cAAY,WAAZ,GAA0B;AACxB,WAAY,SADY;AAExB,aAAY,MAAM,MAAN,CAAa,EAAb,EAAiB,SAAjB,CAFY;AAGxB,cAAY,MAAM,MAAN,CAAa,EAAb,EAAiB,SAAjB,CAHY;AAIxB,cAAY,MAAM,MAAN,CAAa,EAAb,EAAiB,SAAjB,CAJY;AAKxB,WAAY;AACV,YAAM,CADI,EACD,OAAQ,CADP,EACU,OAAQ,CADlB;AAEV,WAAM,CAFI,EAED,QAAQ,CAFP,EAEU,QAAQ;AAFlB;AALY,GAA1B;;AAWA,SAAO,IAAP,GAAc,YAAY,WAAZ,CAAwB,QAAtC;AACA,SAAO,SAAP,GAAmB,YAAY,WAAZ,CAAwB,KAA3C;AACD,CA9CD;;AAgDA;AACA,cAAc,OAAd,CAAsB,EAAtB,CAAyB,KAAzB,EAAgC,iBAA0C;AAAA,MAA9B,MAA8B,SAA9B,MAA8B;AAAA,MAAtB,KAAsB,SAAtB,KAAsB;AAAA,MAAf,WAAe,SAAf,WAAe;;AACxE,MAAI,UAAU,MAAV,IAAoB,CAAC,YAAY,QAAZ,CAAqB,KAA9C,EAAqD;AAAE;AAAS;;AAEhE,MAAM,gBAAgB,YAAY,MAAZ,CAAmB,OAAnB,CAA2B,MAAjD;AACA,MAAM,SAAS,cAAc,MAA7B;AACA,MAAM,aAAa,WAAW,YAAX,IAA2B,WAAW,QAAzD;;AAEA,MAAI,QAAQ,YAAY,QAAZ,CAAqB,KAAjC;;AAEA,MAAM,QAAa,YAAY,WAAZ,CAAwB,KAA3C;AACA,MAAM,UAAa,YAAY,WAAZ,CAAwB,OAA3C;AACA,MAAM,WAAa,YAAY,WAAZ,CAAwB,QAA3C;AACA,MAAM,QAAa,YAAY,WAAZ,CAAwB,KAA3C;AACA,MAAM,WAAa,MAAM,MAAN,CAAa,YAAY,WAAZ,CAAwB,QAArC,EAA+C,QAA/C,CAAnB;AACA,MAAM,gBAAgB,KAAtB;;AAEA,MAAI,KAAK,OAAO,EAAhB;AACA,MAAI,KAAK,OAAO,EAAhB;;AAEA,MAAI,cAAc,mBAAd,IAAqC,cAAc,MAAvD,EAA+D;AAC7D;AACA,QAAM,mBAAmB,cAAc,mBAAd,GACrB,YAAY,sBADS,GAErB,CAFJ;;AAIA,YAAQ,YAAY,QAAZ,CAAqB,YAA7B;;AAEA,QAAK,cAAc,IAAd,IAAsB,cAAc,MAArC,IACI,cAAc,KAAd,IAAuB,cAAc,GAD7C,EACmD;AACjD,WAAK,CAAC,EAAD,GAAM,gBAAX;AACD,KAHD,MAIK,IAAI,cAAc,IAAd,IAAsB,cAAc,KAAxC,EAAgD;AAAE,WAAK,KAAK,gBAAV;AAA6B,KAA/E,MACA,IAAI,cAAc,GAAd,IAAsB,cAAc,MAAxC,EAAgD;AAAE,WAAK,KAAK,gBAAV;AAA6B;AACrF;;AAED;AACA,MAAI,MAAM,GAAV,EAAkB;AAAE,YAAQ,GAAR,IAAkB,EAAlB;AAAuB;AAC3C,MAAI,MAAM,MAAV,EAAkB;AAAE,YAAQ,MAAR,IAAkB,EAAlB;AAAuB;AAC3C,MAAI,MAAM,IAAV,EAAkB;AAAE,YAAQ,IAAR,IAAkB,EAAlB;AAAuB;AAC3C,MAAI,MAAM,KAAV,EAAkB;AAAE,YAAQ,KAAR,IAAkB,EAAlB;AAAuB;;AAE3C,MAAI,UAAJ,EAAgB;AACd;AACA,UAAM,MAAN,CAAa,QAAb,EAAuB,OAAvB;;AAEA,QAAI,WAAW,YAAf,EAA6B;AAC3B;AACA,UAAI,aAAJ;;AAEA,UAAI,SAAS,GAAT,GAAe,SAAS,MAA5B,EAAoC;AAClC,eAAO,SAAS,GAAhB;;AAEA,iBAAS,GAAT,GAAe,SAAS,MAAxB;AACA,iBAAS,MAAT,GAAkB,IAAlB;AACD;AACD,UAAI,SAAS,IAAT,GAAgB,SAAS,KAA7B,EAAoC;AAClC,eAAO,SAAS,IAAhB;;AAEA,iBAAS,IAAT,GAAgB,SAAS,KAAzB;AACA,iBAAS,KAAT,GAAiB,IAAjB;AACD;AACF;AACF,GArBD,MAsBK;AACH;AACA,aAAS,GAAT,GAAkB,KAAK,GAAL,CAAS,QAAQ,GAAjB,EAAsB,MAAM,MAA5B,CAAlB;AACA,aAAS,MAAT,GAAkB,KAAK,GAAL,CAAS,QAAQ,MAAjB,EAAyB,MAAM,GAA/B,CAAlB;AACA,aAAS,IAAT,GAAkB,KAAK,GAAL,CAAS,QAAQ,IAAjB,EAAuB,MAAM,KAA7B,CAAlB;AACA,aAAS,KAAT,GAAkB,KAAK,GAAL,CAAS,QAAQ,KAAjB,EAAwB,MAAM,IAA9B,CAAlB;AACD;;AAED,WAAS,KAAT,GAAkB,SAAS,KAAT,GAAkB,SAAS,IAA7C;AACA,WAAS,MAAT,GAAkB,SAAS,MAAT,GAAkB,SAAS,GAA7C;;AAEA,OAAK,IAAM,IAAX,IAAmB,QAAnB,EAA6B;AAC3B,UAAM,IAAN,IAAc,SAAS,IAAT,IAAiB,SAAS,IAAT,CAA/B;AACD;;AAED,SAAO,KAAP,GAAe,YAAY,QAAZ,CAAqB,KAApC;AACA,SAAO,IAAP,GAAc,QAAd;AACA,SAAO,SAAP,GAAmB,KAAnB;AACD,CAjFD;;AAmFA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4CA,aAAa,SAAb,CAAuB,SAAvB,GAAmC,UAAU,OAAV,EAAmB;AACpD,MAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,OAAhB,CAAJ,EAA8B;AAC5B,SAAK,OAAL,CAAa,MAAb,CAAoB,OAApB,GAA8B,QAAQ,OAAR,KAAoB,KAApB,GAA2B,KAA3B,GAAkC,IAAhE;AACA,SAAK,YAAL,CAAkB,QAAlB,EAA4B,OAA5B;AACA,SAAK,WAAL,CAAiB,QAAjB,EAA2B,OAA3B;;AAEA,QAAI,eAAe,IAAf,CAAoB,QAAQ,IAA5B,CAAJ,EAAuC;AACrC,WAAK,OAAL,CAAa,MAAb,CAAoB,IAApB,GAA2B,QAAQ,IAAnC;AACD,KAFD,MAGK,IAAI,QAAQ,IAAR,KAAiB,IAArB,EAA2B;AAC9B,WAAK,OAAL,CAAa,MAAb,CAAoB,IAApB,GAA2B,eAAe,MAAf,CAAsB,IAAjD;AACD;;AAED,QAAI,MAAM,EAAN,CAAS,IAAT,CAAc,QAAQ,mBAAtB,CAAJ,EAAgD;AAC9C,WAAK,OAAL,CAAa,MAAb,CAAoB,mBAApB,GAA0C,QAAQ,mBAAlD;AACD,KAFD,MAGK,IAAI,MAAM,EAAN,CAAS,IAAT,CAAc,QAAQ,MAAtB,CAAJ,EAAmC;AACtC,WAAK,OAAL,CAAa,MAAb,CAAoB,MAApB,GAA6B,QAAQ,MAArC;AACD;;AAED,WAAO,IAAP;AACD;AACD,MAAI,MAAM,EAAN,CAAS,IAAT,CAAc,OAAd,CAAJ,EAA4B;AAC1B,SAAK,OAAL,CAAa,MAAb,CAAoB,OAApB,GAA8B,OAA9B;;AAEA,QAAI,CAAC,OAAL,EAAc;AACZ,WAAK,aAAL,GAAqB,KAAK,aAAL,GAAqB,KAAK,WAAL,GAAmB,IAA7D;AACD;;AAED,WAAO,IAAP;AACD;AACD,SAAO,KAAK,OAAL,CAAa,MAApB;AACD,CAhCD;;AAkCA,SAAS,eAAT,CAA0B,IAA1B,EAAgC,KAAhC,EAAuC,IAAvC,EAA6C,OAA7C,EAAsD,mBAAtD,EAA2E,IAA3E,EAAiF,MAAjF,EAAyF;AACvF;AACA,MAAI,CAAC,KAAL,EAAY;AAAE,WAAO,KAAP;AAAe;;AAE7B;AACA,MAAI,UAAU,IAAd,EAAoB;AAClB;AACA,QAAM,QAAS,MAAM,EAAN,CAAS,MAAT,CAAgB,KAAK,KAArB,IAA8B,KAAK,KAAnC,GAA4C,KAAK,KAAL,GAAc,KAAK,IAA9E;AACA,QAAM,SAAS,MAAM,EAAN,CAAS,MAAT,CAAgB,KAAK,MAArB,IAA8B,KAAK,MAAnC,GAA4C,KAAK,MAAL,GAAc,KAAK,GAA9E;;AAEA,QAAI,QAAQ,CAAZ,EAAe;AACb,UAAS,SAAS,MAAlB,EAA2B;AAAE,eAAO,OAAP;AAAiB,OAA9C,MACK,IAAI,SAAS,OAAb,EAAsB;AAAE,eAAO,MAAP;AAAiB;AAC/C;AACD,QAAI,SAAS,CAAb,EAAgB;AACd,UAAS,SAAS,KAAlB,EAA4B;AAAE,eAAO,QAAP;AAAkB,OAAhD,MACK,IAAI,SAAS,QAAb,EAAuB;AAAE,eAAO,KAAP;AAAkB;AACjD;;AAED,QAAI,SAAS,MAAb,EAAuB;AAAE,aAAO,KAAK,CAAL,GAAU,CAAC,SAAU,CAAV,GAAa,KAAK,IAAlB,GAAwB,KAAK,KAA9B,IAAwC,MAAzD;AAAmE;AAC5F,QAAI,SAAS,KAAb,EAAuB;AAAE,aAAO,KAAK,CAAL,GAAU,CAAC,UAAU,CAAV,GAAa,KAAK,GAAlB,GAAwB,KAAK,MAA9B,IAAwC,MAAzD;AAAmE;;AAE5F,QAAI,SAAS,OAAb,EAAuB;AAAE,aAAO,KAAK,CAAL,GAAU,CAAC,SAAU,CAAV,GAAa,KAAK,KAAlB,GAA0B,KAAK,IAAhC,IAAwC,MAAzD;AAAmE;AAC5F,QAAI,SAAS,QAAb,EAAuB;AAAE,aAAO,KAAK,CAAL,GAAU,CAAC,UAAU,CAAV,GAAa,KAAK,MAAlB,GAA0B,KAAK,GAAhC,IAAwC,MAAzD;AAAmE;AAC7F;;AAED;AACA,MAAI,CAAC,MAAM,EAAN,CAAS,OAAT,CAAiB,OAAjB,CAAL,EAAgC;AAAE,WAAO,KAAP;AAAe;;AAEjD,SAAO,MAAM,EAAN,CAAS,OAAT,CAAiB,KAAjB;AACP;AADO,IAEH,UAAU;AACZ;AAHK,IAIH,MAAM,WAAN,CAAkB,OAAlB,EAA2B,KAA3B,EAAkC,mBAAlC,CAJJ;AAKD;;AAED,YAAY,OAAZ,CAAoB,EAApB,CAAuB,KAAvB,EAA8B,UAAU,WAAV,EAAuB;AACnD,cAAY,UAAZ,GAAyB,IAAzB;AACD,CAFD;;AAIA,cAAc,OAAd,CAAsB,EAAtB,CAAyB,WAAzB,EAAsC,iBAA2C;AAAA,MAA/B,WAA+B,SAA/B,WAA+B;AAAA,MAAlB,MAAkB,SAAlB,MAAkB;AAAA,MAAV,MAAU,SAAV,MAAU;;AAC/E,MAAI,WAAW,QAAX,IAAuB,CAAC,YAAY,UAAxC,EAAoD;AAAE;AAAS;;AAE/D,MAAM,UAAU,YAAY,MAAZ,CAAmB,OAAnC;;AAEA,MAAI,QAAQ,MAAR,CAAe,MAAnB,EAA2B;AACzB,QAAI,YAAY,UAAZ,KAA2B,GAA/B,EAAoC;AAClC,aAAO,EAAP,GAAY,OAAO,EAAnB;AACD,KAFD,MAGK;AACH,aAAO,EAAP,GAAY,OAAO,EAAnB;AACD;AACD,WAAO,IAAP,GAAc,IAAd;AACD,GARD,MASK;AACH,WAAO,IAAP,GAAc,YAAY,UAA1B;;AAEA,QAAI,YAAY,UAAZ,KAA2B,GAA/B,EAAoC;AAClC,aAAO,EAAP,GAAY,CAAZ;AACD,KAFD,MAGK,IAAI,YAAY,UAAZ,KAA2B,GAA/B,EAAoC;AACvC,aAAO,EAAP,GAAY,CAAZ;AACD;AACF;AACF,CAxBD;;AA0BA,QAAQ,MAAR,GAAiB,MAAjB;AACA,QAAQ,KAAR,CAAc,IAAd,CAAmB,QAAnB;AACA,MAAM,KAAN,CAAY,aAAa,UAAzB,EAAqC,CACnC,aADmC,EAEnC,YAFmC,EAGnC,oBAHmC,EAInC,qBAJmC,EAKnC,WALmC,CAArC;AAOA,QAAQ,UAAR,CAAmB,MAAnB,GAA4B,WAA5B;;AAEA,eAAe,MAAf,GAAwB,OAAO,QAA/B;;AAEA,OAAO,OAAP,GAAiB,MAAjB;;;;;AC3aA,IAAM,MAAiB,QAAQ,aAAR,CAAvB;AACA,IAAM,YAAiB,QAAQ,gBAAR,EAA0B,SAAjD;AACA,IAAM,KAAiB,QAAQ,YAAR,CAAvB;AACA,IAAM,WAAiB,QAAQ,kBAAR,CAAvB;AACA,IAAM,cAAiB,QAAQ,eAAR,CAAvB;AACA,IAAM,iBAAiB,QAAQ,kBAAR,CAAvB;;AAEA,IAAM,aAAa;AACjB,YAAU;AACR,aAAW,KADH;AAER,eAAW,IAFH,EAEa;AACrB,YAAW,EAHH;AAIR,WAAW,GAJH,CAIa;AAJb,GADO;;AAQjB,eAAa,IARI;AASjB,KAAG,IATc,EASL;AACZ,KAAG,CAVc,EAUX,GAAG,CAVQ,EAUL;;AAEZ,eAAa,KAZI;AAajB,YAAU,CAbO;;AAejB,SAAO,eAAU,WAAV,EAAuB;AAC5B,eAAW,WAAX,GAAyB,IAAzB;AACA,QAAI,MAAJ,CAAW,WAAW,CAAtB;;AAEA,eAAW,WAAX,GAAyB,WAAzB;AACA,eAAW,QAAX,GAAsB,IAAI,IAAJ,GAAW,OAAX,EAAtB;AACA,eAAW,CAAX,GAAe,IAAI,OAAJ,CAAY,WAAW,MAAvB,CAAf;AACD,GAtBgB;;AAwBjB,QAAM,gBAAY;AAChB,eAAW,WAAX,GAAyB,KAAzB;AACA,QAAI,MAAJ,CAAW,WAAW,CAAtB;AACD,GA3BgB;;AA6BjB;AACA,UAAQ,kBAAY;AAClB,QAAM,UAAU,WAAW,WAAX,CAAuB,MAAvB,CAA8B,OAA9B,CAAsC,WAAW,WAAX,CAAuB,QAAvB,CAAgC,IAAtE,EAA4E,UAA5F;AACA,QAAM,YAAY,QAAQ,SAAR,IAAqB,UAAU,WAAW,WAAX,CAAuB,OAAjC,CAAvC;AACA,QAAM,MAAM,IAAI,IAAJ,GAAW,OAAX,EAAZ;AACA;AACA,QAAM,KAAK,CAAC,MAAM,WAAW,QAAlB,IAA8B,IAAzC;AACA;AACA,QAAM,IAAI,QAAQ,KAAR,GAAgB,EAA1B;;AAEA,QAAI,KAAK,CAAT,EAAY;AACV,UAAI,GAAG,MAAH,CAAU,SAAV,CAAJ,EAA0B;AACxB,kBAAU,QAAV,CAAmB,WAAW,CAAX,GAAe,CAAlC,EAAqC,WAAW,CAAX,GAAe,CAApD;AACD,OAFD,MAGK,IAAI,SAAJ,EAAe;AAClB,kBAAU,UAAV,IAAwB,WAAW,CAAX,GAAe,CAAvC;AACA,kBAAU,SAAV,IAAwB,WAAW,CAAX,GAAe,CAAvC;AACD;;AAED,iBAAW,QAAX,GAAsB,GAAtB;AACD;;AAED,QAAI,WAAW,WAAf,EAA4B;AAC1B,UAAI,MAAJ,CAAW,WAAW,CAAtB;AACA,iBAAW,CAAX,GAAe,IAAI,OAAJ,CAAY,WAAW,MAAvB,CAAf;AACD;AACF,GAvDgB;AAwDjB,SAAO,eAAU,YAAV,EAAwB,UAAxB,EAAoC;AACzC,QAAM,UAAU,aAAa,OAA7B;;AAEA,WAAO,QAAQ,UAAR,EAAoB,UAApB,IAAkC,QAAQ,UAAR,EAAoB,UAApB,CAA+B,OAAxE;AACD,GA5DgB;AA6DjB,qBAAmB,iCAAoC;AAAA,QAAxB,WAAwB,QAAxB,WAAwB;AAAA,QAAX,OAAW,QAAX,OAAW;;AACrD,QAAI,EAAE,YAAY,WAAZ,MACG,WAAW,KAAX,CAAiB,YAAY,MAA7B,EAAqC,YAAY,QAAZ,CAAqB,IAA1D,CADL,CAAJ,EAC2E;AACzE;AACD;;AAED,QAAI,YAAY,UAAhB,EAA4B;AAC1B,iBAAW,CAAX,GAAe,WAAW,CAAX,GAAe,CAA9B;AACA;AACD;;AAED,QAAI,YAAJ;AACA,QAAI,cAAJ;AACA,QAAI,eAAJ;AACA,QAAI,aAAJ;;AAEA,QAAM,UAAU,YAAY,MAAZ,CAAmB,OAAnB,CAA2B,YAAY,QAAZ,CAAqB,IAAhD,EAAsD,UAAtE;AACA,QAAM,YAAY,QAAQ,SAAR,IAAqB,UAAU,YAAY,OAAtB,CAAvC;;AAEA,QAAI,GAAG,MAAH,CAAU,SAAV,CAAJ,EAA0B;AACxB,aAAS,QAAQ,OAAR,GAAkB,WAAW,MAAtC;AACA,YAAS,QAAQ,OAAR,GAAkB,WAAW,MAAtC;AACA,cAAS,QAAQ,OAAR,GAAkB,UAAU,UAAV,GAAwB,WAAW,MAA9D;AACA,eAAS,QAAQ,OAAR,GAAkB,UAAU,WAAV,GAAwB,WAAW,MAA9D;AACD,KALD,MAMK;AACH,UAAM,OAAO,SAAS,oBAAT,CAA8B,SAA9B,CAAb;;AAEA,aAAS,QAAQ,OAAR,GAAkB,KAAK,IAAL,GAAc,WAAW,MAApD;AACA,YAAS,QAAQ,OAAR,GAAkB,KAAK,GAAL,GAAc,WAAW,MAApD;AACA,cAAS,QAAQ,OAAR,GAAkB,KAAK,KAAL,GAAc,WAAW,MAApD;AACA,eAAS,QAAQ,OAAR,GAAkB,KAAK,MAAL,GAAc,WAAW,MAApD;AACD;;AAED,eAAW,CAAX,GAAgB,QAAQ,CAAR,GAAW,OAAM,CAAC,CAAP,GAAU,CAArC;AACA,eAAW,CAAX,GAAgB,SAAQ,CAAR,GAAY,MAAK,CAAC,CAAN,GAAS,CAArC;;AAEA,QAAI,CAAC,WAAW,WAAhB,EAA6B;AAC3B;AACA,iBAAW,MAAX,GAAoB,QAAQ,MAA5B;AACA,iBAAW,KAAX,GAAoB,QAAQ,KAA5B;;AAEA,iBAAW,KAAX,CAAiB,WAAjB;AACD;AACF;AAzGgB,CAAnB;;AA4GA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,aAAvB,EAAsC,YAAY;AAChD,aAAW,IAAX;AACD,CAFD;;AAIA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,aAAvB,EAAsC,WAAW,iBAAjD;;AAEA,eAAe,SAAf,CAAyB,UAAzB,GAAsC,WAAW,QAAjD;;AAEA,OAAO,OAAP,GAAiB,UAAjB;;;;;AC3HA,IAAM,eAAe,QAAQ,iBAAR,CAArB;AACA,IAAM,UAAe,QAAQ,iBAAR,CAArB;AACA,IAAM,KAAe,QAAQ,aAAR,CAArB;AACA,IAAM,WAAe,QAAQ,mBAAR,CAArB;;AAEA,aAAa,SAAb,CAAuB,SAAvB,GAAmC,UAAU,OAAV,EAAmB,KAAnB,EAA0B,WAA1B,EAAuC,OAAvC,EAAgD;AACjF,MAAM,SAAS,KAAK,oBAAL,CAA0B,OAA1B,EAAmC,KAAnC,EAA0C,WAA1C,EAAuD,OAAvD,CAAf;;AAEA,MAAI,KAAK,OAAL,CAAa,aAAjB,EAAgC;AAC9B,WAAO,KAAK,OAAL,CAAa,aAAb,CAA2B,OAA3B,EAAoC,KAApC,EAA2C,MAA3C,EAAmD,IAAnD,EAAyD,OAAzD,EAAkE,WAAlE,CAAP;AACD;;AAED,SAAO,MAAP;AACD,CARD;;AAUA;;;;;;;;;;;;;;;AAeA,aAAa,SAAb,CAAuB,UAAvB,GAAoC,UAAU,QAAV,EAAoB;AACtD,SAAO,KAAK,iBAAL,CAAuB,YAAvB,EAAqC,QAArC,CAAP;AACD,CAFD;;AAIA;;;;;;;;;;;;;;;AAeA,aAAa,SAAb,CAAuB,SAAvB,GAAmC,UAAU,QAAV,EAAoB;AACrD,SAAO,KAAK,iBAAL,CAAuB,WAAvB,EAAoC,QAApC,CAAP;AACD,CAFD;;AAIA,aAAa,SAAb,CAAuB,UAAvB,GAAoC,UAAU,UAAV,EAAsB,mBAAtB,EAA2C,OAA3C,EAAoD;AACtF,MAAI,CAAC,UAAD,IAAe,CAAC,GAAG,OAAH,CAAW,OAAX,CAApB,EAAyC;AAAE,WAAO,KAAP;AAAe;;AAE1D,MAAI,GAAG,MAAH,CAAU,UAAV,CAAJ,EAA2B;AACzB,WAAO,SAAS,WAAT,CAAqB,OAArB,EAA8B,UAA9B,EAA0C,mBAA1C,CAAP;AACD,GAFD,MAGK,IAAI,GAAG,OAAH,CAAW,UAAX,CAAJ,EAA4B;AAC/B,WAAO,SAAS,YAAT,CAAsB,UAAtB,EAAkC,OAAlC,CAAP;AACD;;AAED,SAAO,KAAP;AACD,CAXD;;AAaA,aAAa,SAAb,CAAuB,SAAvB,GAAmC,UAAU,SAAV,EAAqB,mBAArB,EAA0C,OAA1C,EAAmD;AACpF,MAAI,CAAC,SAAL,EAAgB;AAAE,WAAO,IAAP;AAAc;;AAEhC,MAAI,CAAC,GAAG,OAAH,CAAW,OAAX,CAAL,EAA0B;AAAE,WAAO,KAAP;AAAe;;AAE3C,MAAI,GAAG,MAAH,CAAU,SAAV,CAAJ,EAA0B;AACxB,WAAO,SAAS,WAAT,CAAqB,OAArB,EAA8B,SAA9B,EAAyC,mBAAzC,CAAP;AACD,GAFD,MAGK,IAAI,GAAG,OAAH,CAAW,SAAX,CAAJ,EAA2B;AAC9B,WAAO,SAAS,YAAT,CAAsB,SAAtB,EAAiC,OAAjC,CAAP;AACD;;AAED,SAAO,KAAP;AACD,CAbD;;AAeA,aAAa,SAAb,CAAuB,eAAvB,GAAyC,UAAU,OAAV,EAAmB,mBAAnB,EAAwC,WAAxC,EAAqD;AAC5F,SAAQ,CAAC,KAAK,UAAL,CAAgB,QAAQ,UAAxB,EAAoC,mBAApC,EAAyD,WAAzD,CAAD,IACH,KAAK,SAAL,CAAe,QAAQ,SAAvB,EAAkC,mBAAlC,EAAuD,WAAvD,CADL;AAED,CAHD;;AAKA;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4BA,aAAa,SAAb,CAAuB,aAAvB,GAAuC,UAAU,OAAV,EAAmB;AACxD,MAAI,GAAG,QAAH,CAAY,OAAZ,CAAJ,EAA0B;AACxB,SAAK,OAAL,CAAa,aAAb,GAA6B,OAA7B;;AAEA,WAAO,IAAP;AACD;;AAED,MAAI,YAAY,IAAhB,EAAsB;AACpB,WAAO,KAAK,OAAL,CAAa,aAApB;;AAEA,WAAO,IAAP;AACD;;AAED,SAAO,KAAK,OAAL,CAAa,aAApB;AACD,CAdD;;AAgBA;;;;;;;;;;AAUA,aAAa,SAAb,CAAuB,WAAvB,GAAqC,UAAU,QAAV,EAAoB;AACvD,MAAI,GAAG,IAAH,CAAQ,QAAR,CAAJ,EAAuB;AACrB,SAAK,OAAL,CAAa,WAAb,GAA2B,QAA3B;;AAEA,WAAO,IAAP;AACD;;AAED,MAAI,aAAa,IAAjB,EAAuB;AACrB,WAAO,KAAK,OAAL,CAAa,WAApB;;AAEA,WAAO,IAAP;AACD;;AAED,SAAO,KAAK,OAAL,CAAa,WAApB;AACD,CAdD;;AAgBA,aAAa,SAAb,CAAuB,oBAAvB,GAA8C,UAAU,OAAV,EAAmB,KAAnB,EAA0B,WAA1B,EAAuC,OAAvC,EAAgD;AAC5F,MAAM,OAAO,KAAK,OAAL,CAAa,OAAb,CAAb;AACA,MAAI,SAAS,IAAb;;AAEA,uBAAyB,QAAQ,KAAjC,kHAAwC;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,QAA7B,UAA6B;;AACtC;AACA,QAAI,YAAY,aAAZ,IACG,YAAY,KADf,IAEG,CAAC,MAAM,OAAN,GAAgB,KAAK,OAAL,CAAa,UAAb,EAAyB,YAA1C,MAA4D,CAFnE,EAEsE;AACpE;AACD;;AAED,aAAS,QAAQ,UAAR,EAAoB,OAApB,CAA4B,OAA5B,EAAqC,KAArC,EAA4C,IAA5C,EAAkD,OAAlD,EAA2D,WAA3D,EAAwE,IAAxE,CAAT;;AAEA,QAAI,MAAJ,EAAY;AACV,aAAO,MAAP;AACD;AACF;AACF,CAlBD;;;;;AC5JA,IAAM,WAAiB,QAAQ,aAAR,CAAvB;AACA,IAAM,eAAiB,QAAQ,iBAAR,CAAvB;AACA,IAAM,cAAiB,QAAQ,gBAAR,CAAvB;AACA,IAAM,UAAiB,QAAQ,iBAAR,CAAvB;AACA,IAAM,iBAAiB,QAAQ,mBAAR,CAAvB;AACA,IAAM,UAAiB,QAAQ,kBAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,UAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,UAAR,CAAvB;AACA,IAAM,UAAiB,QAAQ,kBAAR,EAA4B,GAA5B,EAAvB;;AAEA,QAAQ,uBAAR;;AAEA,IAAM,YAAY;AAChB,kBADgB;AAEhB,gDAFgB;AAGhB;AACA,mBAAiB,QAJD;AAKhB,YAAU;AACR,eAAW;AACT,mBAAa,KADJ;AAET,WAAK,QAFI;AAGT,qBAAe,CAHN;AAIT,iBAAY,IAJH;AAKT,kBAAY;AALH;AADH,GALM;AAchB,qBAAmB,2BAAU,MAAV,EAAkB;AACnC,UAAM,MAAN,CAAa,OAAO,QAApB,EAA8B,UAAU,QAAV,CAAmB,SAAjD;AACD;AAhBe,CAAlB;;AAmBA;AACA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,MAAvB,EAA+B,gBAAwD;AAAA,MAA5C,WAA4C,QAA5C,WAA4C;AAAA,MAA/B,OAA+B,QAA/B,OAA+B;AAAA,MAAtB,KAAsB,QAAtB,KAAsB;AAAA,MAAf,WAAe,QAAf,WAAe;;AACrF,MAAI,YAAY,WAAZ,EAAJ,EAA+B;AAAE;AAAS;;AAE1C,MAAM,aAAa,cAAc,WAAd,EAA2B,OAA3B,EAAoC,KAApC,EAA2C,WAA3C,CAAnB;AACA,UAAQ,WAAR,EAAqB,UAArB;AACD,CALD;;AAOA;AACA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,MAAvB,EAA+B,iBAAwD;AAAA,MAA5C,WAA4C,SAA5C,WAA4C;AAAA,MAA/B,OAA+B,SAA/B,OAA+B;AAAA,MAAtB,KAAsB,SAAtB,KAAsB;AAAA,MAAf,WAAe,SAAf,WAAe;;AACrF,MAAI,CAAC,YAAY,KAAb,IACG,YAAY,aADf,IAEG,YAAY,WAAZ,EAFP,EAEkC;AAAE;AAAS;;AAE7C,MAAM,aAAa,cAAc,WAAd,EAA2B,OAA3B,EAAoC,KAApC,EAA2C,WAA3C,CAAnB;AACA,UAAQ,WAAR,EAAqB,UAArB;AACD,CAPD;;AASA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,MAAvB,EAA+B,UAAU,GAAV,EAAe;AAAA,MACpC,WADoC,GACb,GADa,CACpC,WADoC;AAAA,MACvB,KADuB,GACb,GADa,CACvB,KADuB;;;AAG5C,MAAI,CAAC,YAAY,aAAb,IACG,YAAY,WAAZ,EADH,IAEG,CAAC,YAAY,eAFhB,IAGG,CAAC,YAAY,QAAZ,CAAqB,IAH7B,EAGmC;AACjC;AACD;;AAED,UAAQ,IAAR,CAAa,cAAb,EAA6B,GAA7B;;AAEA,MAAM,SAAS,YAAY,MAA3B;;AAEA,MAAI,YAAY,QAAZ,CAAqB,IAArB,IAA6B,MAAjC,EAAyC;AACvC;AACA,QAAI,OAAO,OAAP,CAAe,YAAY,QAAZ,CAAqB,IAApC,EAA0C,WAA1C,IACG,CAAC,uBAAuB,MAAvB,EAA+B,YAAY,OAA3C,EAAoD,YAAY,QAAhE,CADR,EACmF;AACjF,kBAAY,IAAZ,CAAiB,KAAjB;AACD,KAHD,MAIK;AACH,kBAAY,KAAZ,CAAkB,YAAY,QAA9B,EAAwC,MAAxC,EAAgD,YAAY,OAA5D;AACD;AACF;AACF,CAxBD;;AA0BA;AACA;AACA,SAAS,cAAT,CAAyB,MAAzB,EAAiC,YAAjC,EAA+C,OAA/C,EAAwD,WAAxD,EAAqE;AACnE,MAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,MAAhB,KACG,aAAa,eAAb,CAA6B,aAAa,OAAb,CAAqB,OAAO,IAA5B,CAA7B,EAAgE,OAAhE,EAAyE,WAAzE,CADH,IAEG,aAAa,OAAb,CAAqB,OAAO,IAA5B,EAAkC,OAFrC,IAGG,uBAAuB,YAAvB,EAAqC,OAArC,EAA8C,MAA9C,CAHP,EAG8D;AAC5D,WAAO,MAAP;AACD;;AAED,SAAO,IAAP;AACD;;AAED,SAAS,gBAAT,CAA2B,WAA3B,EAAwC,OAAxC,EAAiD,KAAjD,EAAwD,OAAxD,EAAiE,aAAjE,EAAgF,WAAhF,EAA6F;AAC3F,OAAK,IAAI,IAAI,CAAR,EAAW,MAAM,QAAQ,MAA9B,EAAsC,IAAI,GAA1C,EAA+C,GAA/C,EAAoD;AAClD,QAAM,QAAQ,QAAQ,CAAR,CAAd;AACA,QAAM,eAAe,cAAc,CAAd,CAArB;AACA,QAAM,SAAS,eAAe,MAAM,SAAN,CAAgB,OAAhB,EAAyB,KAAzB,EAAgC,WAAhC,EAA6C,YAA7C,CAAf,EACe,KADf,EAEe,YAFf,EAGe,WAHf,CAAf;;AAKA,QAAI,MAAJ,EAAY;AACV,aAAO;AACL,sBADK;AAEL,gBAAQ,KAFH;AAGL,iBAAS;AAHJ,OAAP;AAKD;AACF;;AAED,SAAO,EAAP;AACD;;AAED,SAAS,aAAT,CAAwB,WAAxB,EAAqC,OAArC,EAA8C,KAA9C,EAAqD,WAArD,EAAkE;AAChE,MAAI,UAAU,EAAd;AACA,MAAI,gBAAgB,EAApB;;AAEA,MAAI,UAAU,WAAd;AACA,MAAI,SAAS,IAAb;;AAEA,WAAS,WAAT,CAAsB,YAAtB,EAAoC,QAApC,EAA8C,OAA9C,EAAuD;AACrD,QAAM,WAAY,QAAQ,0BAAR,GACd,QAAQ,gBAAR,CAAyB,QAAzB,CADc,GAEd,SAFJ;;AAIA,QAAI,MAAM,eAAN,CAAsB,OAAtB,EAA+B,QAA/B,EAAyC,QAAzC,CAAJ,EAAwD;;AAEtD,cAAQ,IAAR,CAAa,YAAb;AACA,oBAAc,IAAd,CAAmB,OAAnB;AACD;AACF;;AAED,SAAO,MAAM,EAAN,CAAS,OAAT,CAAiB,OAAjB,CAAP,EAAkC;AAChC,cAAU,EAAV;AACA,oBAAgB,EAAhB;;AAEA,QAAM,sBAAsB,MAAM,aAAN,CAAoB,GAApB,CAAwB,OAAxB,CAA5B;;AAEA,QAAI,wBACI,SAAS,eAAe,oBAAoB,SAApB,CAA8B,OAA9B,EAAuC,KAAvC,EAA8C,WAA9C,EAA2D,OAA3D,EAAoE,WAApE,CAAf,EACe,mBADf,EAEe,OAFf,EAGe,WAHf,CADb,KAKG,CAAC,oBAAoB,OAApB,CAA4B,OAAO,IAAnC,EAAyC,WALjD,EAK8D;AAC5D,aAAO;AACL,wBADK;AAEL,sBAFK;AAGL,gBAAQ;AAHH,OAAP;AAKD,KAXD,MAYK;AACH,YAAM,aAAN,CAAoB,eAApB,CAAoC,WAApC,EAAiD,OAAjD;;AAEA,UAAM,aAAa,iBAAiB,WAAjB,EAA8B,OAA9B,EAAuC,KAAvC,EAA8C,OAA9C,EAAuD,aAAvD,EAAsE,WAAtE,CAAnB;;AAEA,UAAI,WAAW,MAAX,IACG,CAAC,WAAW,MAAX,CAAkB,OAAlB,CAA0B,WAAW,MAAX,CAAkB,IAA5C,EAAkD,WAD1D,EACuE;AACrE,eAAO,UAAP;AACD;AACF;;AAED,cAAU,MAAM,UAAN,CAAiB,OAAjB,CAAV;AACD;;AAED,SAAO,EAAP;AACD;;AAED,SAAS,OAAT,CAAkB,WAAlB,SAA4D;AAAA,MAA3B,MAA2B,SAA3B,MAA2B;AAAA,MAAnB,MAAmB,SAAnB,MAAmB;AAAA,MAAX,OAAW,SAAX,OAAW;;AAC1D,WAAS,UAAU,EAAnB;;AAEA,MAAI,YAAY,MAAZ,IAAsB,YAAY,MAAZ,CAAmB,OAAnB,CAA2B,WAArD,EAAkE;AAChE,gBAAY,MAAZ,CAAmB,IAAnB,CAAwB,eAAxB,CAAwC,KAAxC,CAA8C,MAA9C,GAAuD,EAAvD;AACD;;AAED,cAAY,MAAZ,GAAqB,MAArB;AACA,cAAY,OAAZ,GAAsB,OAAtB;AACA,QAAM,UAAN,CAAiB,YAAY,QAA7B,EAAuC,MAAvC;;AAEA,MAAI,UAAU,OAAO,OAAP,CAAe,WAA7B,EAA0C;AACxC,QAAM,SAAS,SAAQ,QAAQ,OAAO,IAAf,EAAqB,SAArB,CAA+B,MAA/B,CAAR,GAAiD,EAAhE;AACA,gBAAY,MAAZ,CAAmB,IAAnB,CAAwB,eAAxB,CAAwC,KAAxC,CAA8C,MAA9C,GAAuD,MAAvD;AACD;;AAED,UAAQ,IAAR,CAAa,UAAb,EAAyB,EAAE,aAAa,WAAf,EAAzB;AACD;;AAED,YAAY,OAAZ,CAAoB,EAApB,CAAuB,MAAvB,EAA+B,iBAA2B;AAAA,MAAf,WAAe,SAAf,WAAe;;AACxD,MAAM,SAAS,YAAY,MAA3B;;AAEA,MAAI,UAAU,OAAO,OAAP,CAAe,WAA7B,EAA0C;AACxC,WAAO,IAAP,CAAY,eAAZ,CAA4B,KAA5B,CAAkC,MAAlC,GAA2C,EAA3C;AACD;AACF,CAND;;AAQA,aAAa,SAAb,CAAuB,SAAvB,GAAmC,UAAU,OAAV,EAAmB,KAAnB,EAA0B,WAA1B,EAAuC,OAAvC,EAAgD;AACjF,MAAM,SAAS,KAAK,oBAAL,CAA0B,OAA1B,EAAmC,KAAnC,EAA0C,WAA1C,EAAuD,OAAvD,CAAf;;AAEA,MAAI,KAAK,OAAL,CAAa,aAAjB,EAAgC;AAC9B,WAAO,KAAK,OAAL,CAAa,aAAb,CAA2B,OAA3B,EAAoC,KAApC,EAA2C,MAA3C,EAAmD,IAAnD,EAAyD,OAAzD,EAAkE,WAAlE,CAAP;AACD;;AAED,SAAO,MAAP;AACD,CARD;;AAUA;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4BA,aAAa,SAAb,CAAuB,aAAvB,GAAuC,UAAU,OAAV,EAAmB;AACxD,MAAI,MAAM,EAAN,CAAS,QAAT,CAAkB,OAAlB,CAAJ,EAAgC;AAC9B,SAAK,OAAL,CAAa,aAAb,GAA6B,OAA7B;;AAEA,WAAO,IAAP;AACD;;AAED,MAAI,YAAY,IAAhB,EAAsB;AACpB,WAAO,KAAK,OAAL,CAAa,aAApB;;AAEA,WAAO,IAAP;AACD;;AAED,SAAO,KAAK,OAAL,CAAa,aAApB;AACD,CAdD;;AAgBA;;;;;;;;;;AAUA,aAAa,SAAb,CAAuB,WAAvB,GAAqC,UAAU,QAAV,EAAoB;AACvD,MAAI,MAAM,EAAN,CAAS,IAAT,CAAc,QAAd,CAAJ,EAA6B;AAC3B,SAAK,OAAL,CAAa,WAAb,GAA2B,QAA3B;;AAEA,WAAO,IAAP;AACD;;AAED,MAAI,aAAa,IAAjB,EAAuB;AACrB,WAAO,KAAK,OAAL,CAAa,WAApB;;AAEA,WAAO,IAAP;AACD;;AAED,SAAO,KAAK,OAAL,CAAa,WAApB;AACD,CAdD;;AAgBA,aAAa,SAAb,CAAuB,oBAAvB,GAA8C,UAAU,OAAV,EAAmB,KAAnB,EAA0B,WAA1B,EAAuC,OAAvC,EAAgD;AAC5F,MAAM,OAAO,KAAK,OAAL,CAAa,OAAb,CAAb;AACA,MAAM,UAAU,MAAM,OAAN,IAAkB;AAChC,OAAG,CAD6B;AAEhC,OAAG,CAF6B;AAGhC,OAAG,CAH6B;AAIhC,OAAG;AAJ6B,GAAD,CAK9B,MAAM,MALwB,CAAjC;AAMA,MAAI,SAAS,IAAb;;AAEA,uBAAyB,QAAQ,KAAjC,kHAAwC;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,QAA7B,UAA6B;;AACtC;AACA,QAAI,YAAY,aAAZ,IACG,YAAY,KADf,IAEG,CAAC,UAAU,KAAK,OAAL,CAAa,UAAb,EAAyB,YAApC,MAAsD,CAF7D,EAEgE;AAC9D;AACD;;AAED,aAAS,QAAQ,UAAR,EAAoB,OAApB,CAA4B,OAA5B,EAAqC,KAArC,EAA4C,IAA5C,EAAkD,OAAlD,EAA2D,WAA3D,EAAwE,IAAxE,CAAT;;AAEA,QAAI,MAAJ,EAAY;AACV,aAAO,MAAP;AACD;AACF;AACF,CAxBD;;AA0BA,SAAS,sBAAT,CAAiC,YAAjC,EAA+C,OAA/C,EAAwD,MAAxD,EAAgE;AAC9D,MAAM,UAAU,aAAa,OAA7B;AACA,MAAM,aAAa,QAAQ,OAAO,IAAf,EAAqB,GAAxC;AACA,MAAM,gBAAgB,QAAQ,OAAO,IAAf,EAAqB,aAA3C;AACA,MAAI,qBAAqB,CAAzB;AACA,MAAI,cAAc,CAAlB;AACA,MAAI,qBAAqB,CAAzB;;AAEA;AACA,MAAI,EAAE,cAAc,aAAd,IAA+B,UAAU,eAA3C,CAAJ,EAAiE;AAAE;AAAS;;AAE5E,OAAK,IAAI,IAAI,CAAR,EAAW,MAAM,MAAM,YAAN,CAAmB,MAAzC,EAAiD,IAAI,GAArD,EAA0D,GAA1D,EAA+D;AAC7D,QAAM,cAAc,MAAM,YAAN,CAAmB,CAAnB,CAApB;AACA,QAAM,cAAc,YAAY,QAAZ,CAAqB,IAAzC;;AAEA,QAAI,CAAC,YAAY,WAAZ,EAAL,EAAgC;AAAE;AAAW;;AAE7C;;AAEA,QAAI,sBAAsB,UAAU,eAApC,EAAqD;AACnD,aAAO,KAAP;AACD;;AAED,QAAI,YAAY,MAAZ,KAAuB,YAA3B,EAAyC;AAAE;AAAW;;AAEtD,mBAAgB,gBAAgB,OAAO,IAAxB,GAA8B,CAA7C;;AAEA,QAAI,eAAe,UAAnB,EAA+B;AAC7B,aAAO,KAAP;AACD;;AAED,QAAI,YAAY,OAAZ,KAAwB,OAA5B,EAAqC;AACnC;;AAEA,UAAI,gBAAgB,OAAO,IAAvB,IAA+B,sBAAsB,aAAzD,EAAwE;AACtE,eAAO,KAAP;AACD;AACF;AACF;;AAED,SAAO,UAAU,eAAV,GAA4B,CAAnC;AACD;;AAED;;;;;;;;;;;;AAYA,SAAS,eAAT,GAA2B,UAAU,QAAV,EAAoB;AAC7C,MAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,QAAhB,CAAJ,EAA+B;AAC7B,cAAU,eAAV,GAA4B,QAA5B;;AAEA,WAAO,IAAP;AACD;;AAED,SAAO,UAAU,eAAjB;AACD,CARD;;AAUA,aAAa,eAAb,CAA6B,IAA7B,CAAkC,aAAlC;AACA,aAAa,eAAb,CAA6B,IAA7B,CAAkC,eAAlC;AACA,aAAa,eAAb,CAA6B,IAA7B,CAAkC,YAAlC;AACA,aAAa,eAAb,CAA6B,IAA7B,CAAkC,WAAlC;;AAEA,eAAe,IAAf,CAAoB,aAApB,GAAoC,IAApC;AACA,eAAe,IAAf,CAAoB,WAApB,GAAkC,IAAlC;;AAEA,MAAM,MAAN,CAAa,eAAe,SAA5B,EAAuC,UAAU,QAAV,CAAmB,SAA1D;;AAEA,OAAO,OAAP,GAAiB,SAAjB;;;;;ACnXA,IAAM,YAAc,QAAQ,QAAR,CAApB;AACA,IAAM,cAAc,QAAQ,gBAAR,CAApB;;AAEA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,KAAvB,EAA8B,UAAU,WAAV,EAAuB;AACnD,cAAY,UAAZ,GAAyB,IAAzB;AACD,CAFD;;AAIA,UAAU,OAAV,CAAkB,EAAlB,CAAqB,UAArB,EAAiC,gBAA2B;AAAA,MAAf,WAAe,QAAf,WAAe;;AAC1D,MAAM,aAAa,YAAY,QAAZ,CAAqB,IAAxC;;AAEA,MAAI,CAAC,UAAL,EAAiB;AAAE;AAAS;;AAE5B,MAAM,QAAQ,YAAY,MAAZ,CAAmB,OAAnB,CAA2B,UAA3B,EAAuC,KAArD;;AAEA,MAAI,QAAQ,CAAZ,EAAe;AACb,gBAAY,UAAZ,GAAyB,WAAW,YAAM;AACxC,kBAAY,KAAZ,CAAkB,YAAY,QAA9B,EAAwC,YAAY,MAApD,EAA4D,YAAY,OAAxE;AACD,KAFwB,EAEtB,KAFsB,CAAzB;AAGD;AACF,CAZD;;AAcA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,MAAvB,EAA+B,iBAAsC;AAAA,MAA1B,WAA0B,SAA1B,WAA0B;AAAA,MAAb,SAAa,SAAb,SAAa;;AACnE,MAAI,YAAY,eAAZ,IAA+B,CAAC,SAApC,EAA+C;AAC7C,iBAAa,YAAY,UAAzB;AACD;AACF,CAJD;;AAMA;AACA,UAAU,OAAV,CAAkB,EAAlB,CAAqB,cAArB,EAAqC,iBAA2B;AAAA,MAAf,WAAe,SAAf,WAAe;;AAC9D,MAAM,aAAa,YAAY,QAAZ,CAAqB,IAAxC;;AAEA,MAAI,CAAC,UAAL,EAAiB;AAAE;AAAS;;AAE5B,MAAM,QAAQ,YAAY,MAAZ,CAAmB,OAAnB,CAA2B,UAA3B,EAAuC,KAArD;;AAEA,MAAI,QAAQ,CAAZ,EAAe;AACb,gBAAY,QAAZ,CAAqB,IAArB,GAA4B,IAA5B;AACD;AACF,CAVD;;;;;AC5BA,IAAM,YAAY,QAAQ,QAAR,CAAlB;AACA,IAAM,QAAY,QAAQ,UAAR,CAAlB;AACA,IAAM,UAAY,QAAQ,kBAAR,CAAlB;AACA,IAAM,KAAY,QAAQ,aAAR,CAAlB;;eAEwC,QAAQ,mBAAR,C;IAAhC,e,YAAA,e;IAAiB,U,YAAA,U;;AAEzB,UAAU,iBAAV,CAA4B,QAAQ,iBAAR,CAA5B;;AAEA,UAAU,OAAV,CAAkB,EAAlB,CAAqB,cAArB,EAAsC,gBAAgD;AAAA,MAApC,WAAoC,QAApC,WAAoC;AAAA,MAAvB,WAAuB,QAAvB,WAAuB;AAAA,MAAV,EAAU,QAAV,EAAU;AAAA,MAAN,EAAM,QAAN,EAAM;;AACpF,MAAI,YAAY,QAAZ,CAAqB,IAArB,KAA8B,MAAlC,EAA0C;AAAE;AAAS;;AAErD;AACA,MAAM,OAAO,KAAK,GAAL,CAAS,EAAT,CAAb;AACA,MAAM,OAAO,KAAK,GAAL,CAAS,EAAT,CAAb;AACA,MAAM,UAAU,YAAY,MAAZ,CAAmB,OAAnB,CAA2B,IAA3C;AACA,MAAM,YAAY,QAAQ,SAA1B;AACA,MAAM,cAAe,OAAO,IAAP,GAAc,GAAd,GAAoB,OAAO,IAAP,GAAc,GAAd,GAAoB,IAA7D;;AAEA,cAAY,QAAZ,CAAqB,IAArB,GAA4B,QAAQ,QAAR,KAAqB,OAArB,GACxB,YAAY,CAAZ,CADwB,CACT;AADS,IAExB,QAAQ,QAFZ;;AAIA;AACA,MAAI,gBAAgB,IAAhB,IAAwB,cAAc,IAAtC,IAA8C,cAAc,WAAhE,EAA6E;AAC3E;AACA,gBAAY,QAAZ,CAAqB,IAArB,GAA4B,IAA5B;;AAEA;;AAEA,QAAI,CAAC,YAAY,QAAZ,CAAqB,IAA1B,EAAgC;;AAE9B,UAAI,UAAU,WAAd;;AAEA,UAAM,eAAe,SAAf,YAAe,CAAU,YAAV,EAAwB,QAAxB,EAAkC,OAAlC,EAA2C;AAC9D,YAAM,WAAW,QAAQ,0BAAR,GACX,QAAQ,gBAAR,CAAyB,QAAzB,CADW,GAEX,SAFN;;AAIA,YAAI,iBAAiB,YAAY,MAAjC,EAAyC;AAAE;AAAS;;AAEpD,YAAI,CAAC,QAAQ,WAAT,IACG,CAAC,aAAa,eAAb,CAA6B,OAA7B,EAAsC,OAAtC,EAA+C,WAA/C,CADJ,IAEG,gBAAgB,OAAhB,EAAyB,QAAzB,EAAmC,QAAnC,CAFP,EAEqD;;AAEnD,cAAM,UAAS,aAAa,SAAb,CAAuB,YAAY,WAAnC,EACuB,YAAY,SADnC,EAEuB,WAFvB,EAGuB,OAHvB,CAAf;;AAKA,cAAI,WACG,QAAO,IAAP,KAAgB,MADnB,IAEG,eAAe,WAAf,EAA4B,YAA5B,CAFH,IAGG,UAAU,cAAV,CAAyB,OAAzB,EAAiC,YAAjC,EAA+C,OAA/C,EAAwD,WAAxD,CAHP,EAG6E;;AAE3E,mBAAO,YAAP;AACD;AACF;AACF,OAxBD;;AA0BA,UAAI,SAAS,IAAb;;AAEA;AACA,aAAO,GAAG,OAAH,CAAW,OAAX,CAAP,EAA4B;AAC1B,YAAM,sBAAsB,MAAM,aAAN,CAAoB,GAApB,CAAwB,OAAxB,CAA5B;;AAEA,YAAI,uBACG,wBAAwB,YAAY,MADvC,IAEG,CAAC,oBAAoB,OAApB,CAA4B,IAA5B,CAAiC,WAFzC,EAEsD;;AAEpD,mBAAS,oBAAoB,SAApB,CAA8B,YAAY,WAA1C,EAAuD,YAAY,SAAnE,EAA8E,WAA9E,EAA2F,OAA3F,CAAT;AACD;AACD,YAAI,UACG,OAAO,IAAP,KAAgB,MADnB,IAEG,eAAe,WAAf,EAA4B,mBAA5B,CAFP,EAEyD;;AAEvD,sBAAY,QAAZ,CAAqB,IAArB,GAA4B,MAA5B;AACA,sBAAY,MAAZ,GAAqB,mBAArB;AACA,sBAAY,OAAZ,GAAsB,OAAtB;AACA;AACD;;AAED,YAAM,uBAAuB,MAAM,aAAN,CAAoB,eAApB,CAAoC,YAApC,EAAkD,OAAlD,CAA7B;;AAEA,YAAI,oBAAJ,EAA0B;AACxB,sBAAY,QAAZ,CAAqB,IAArB,GAA4B,MAA5B;AACA,sBAAY,MAAZ,GAAqB,oBAArB;AACA,sBAAY,OAAZ,GAAsB,OAAtB;AACA;AACD;;AAED,kBAAU,WAAW,OAAX,CAAV;AACD;AACF;AACF;AACF,CAtFD;;AAwFA,SAAS,cAAT,CAAyB,SAAzB,EAAoC,YAApC,EAAkD;AAChD,MAAI,CAAC,YAAL,EAAmB;AAAE,WAAO,KAAP;AAAe;;AAEpC,MAAM,WAAW,aAAa,OAAb,CAAqB,IAArB,CAA0B,SAA3C;;AAEA,SAAQ,cAAc,IAAd,IAAsB,aAAa,IAAnC,IAA2C,aAAa,SAAhE;AACD;;;;;ACvGD,QAAQ,QAAR,EAAkB,iBAAlB,CAAoC,QAAQ,oBAAR,CAApC;;;;;ACAA,QAAQ,QAAR,EAAkB,iBAAlB,CAAoC,QAAQ,mBAAR,CAApC;;;;;ACAA,OAAO,OAAP,GAAiB;AACf,QAAM;AACJ,YAAgB,IADZ;AAEJ,oBAAgB,MAFZ;AAGJ,iBAAgB;AAHZ,GADS;;AAOf,aAAW;AACT,YAAQ,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EADC;;AAGT;AACA;AACA,kBAAc,CALL;;AAOT,aAAS;AACP,eAAmB,KADZ;AAEP,kBAAmB,EAFZ,EAEmB;AAC1B,gBAAmB,GAHZ,EAGmB;AAC1B,gBAAmB,EAJZ,EAImB;AAC1B,mBAAmB,IALZ,EAKmB;AAC1B,yBAAmB,GANZ,CAMmB;AANnB;AAPA;AAPI,CAAjB;;;;;ACAA;;AAEA;AACA,QAAQ,kBAAR;;AAEA;AACA,QAAQ,WAAR;;AAEA;AACA,QAAQ,kBAAR;AACA,QAAQ,sBAAR;;AAEA;AACA,QAAQ,sBAAR;AACA,QAAQ,4BAAR;AACA,QAAQ,qCAAR;;AAEA;AACA,QAAQ,mBAAR;;AAEA;AACA,QAAQ,mBAAR;AACA,QAAQ,kBAAR;AACA,QAAQ,gBAAR;AACA,QAAQ,gBAAR;;AAEA;AACA,QAAQ,sBAAR;AACA,QAAQ,2BAAR;AACA,QAAQ,0BAAR;;AAEA;AACA,QAAQ,qBAAR;AACA,QAAQ,oBAAR;AACA,QAAQ,kBAAR;;AAEA;AACA,QAAQ,iCAAR;;AAEA;AACA,QAAQ,cAAR;;AAEA;AACA,OAAO,OAAP,GAAiB,QAAQ,YAAR,CAAjB;;;;;AC3CA,IAAM,gBAAiB,QAAQ,iBAAR,CAAvB;AACA,IAAM,cAAiB,QAAQ,eAAR,CAAvB;AACA,IAAM,YAAiB,QAAQ,aAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,SAAR,CAAvB;AACA,IAAM,iBAAiB,QAAQ,aAAR,CAAvB;;AAEA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,KAAvB,EAA8B,UAAU,WAAV,EAAuB;AACnD,cAAY,aAAZ,GAA4B;AAC1B,YAAa,KADa;AAE1B,eAAa,KAFa;AAG1B,iBAAa,KAHa;;AAK1B,gBAAY,IALc;AAM1B,cAAY,EANc;;AAQ1B,QAAI,CARsB,EAQnB,IAAI,CARe;AAS1B,QAAI,CATsB,EASnB,IAAI,CATe;;AAW1B,QAAI,CAXsB;AAY1B,SAAK,CAZqB,EAYlB,KAAK,CAZa;AAa1B,cAAU,CAbgB;;AAe1B,eAAW,CAfe;AAgB1B,eAAW,CAhBe;AAiB1B,OAAK;AAjBqB,GAA5B;;AAoBA,cAAY,iBAAZ,GAAkC;AAAA,WAAM,aAAe,KAAf,CAAqB,WAArB,CAAN;AAAA,GAAlC;AACA,cAAY,mBAAZ,GAAkC;AAAA,WAAM,eAAe,KAAf,CAAqB,WAArB,CAAN;AAAA,GAAlC;AACD,CAvBD;;AAyBA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,MAAvB,EAA+B,gBAAwD;AAAA,MAA5C,WAA4C,QAA5C,WAA4C;AAAA,MAA/B,KAA+B,QAA/B,KAA+B;AAAA,MAAxB,OAAwB,QAAxB,OAAwB;AAAA,MAAf,WAAe,QAAf,WAAe;;AACrF,MAAM,SAAS,YAAY,aAA3B;;AAEA;AACA,MAAI,OAAO,MAAX,EAAmB;AACjB,QAAI,UAAU,WAAd;;AAEA;AACA,WAAO,MAAM,EAAN,CAAS,OAAT,CAAiB,OAAjB,CAAP,EAAkC;;AAEhC;AACA,UAAI,YAAY,YAAY,OAA5B,EAAqC;AACnC;AACA,uBAAe,MAAf,CAAsB,OAAO,CAA7B;AACA,eAAO,MAAP,GAAgB,KAAhB;AACA,oBAAY,UAAZ,GAAyB,IAAzB;;AAEA;AACA,oBAAY,aAAZ,CAA0B,OAA1B;AACA,cAAM,SAAN,CAAgB,YAAY,SAA5B,EAAuC,YAAY,QAAnD;;AAEA;AACA,YAAM,YAAY,EAAE,wBAAF,EAAlB;AACA,oBAAY,OAAZ,CAAoB,IAApB,CAAyB,oBAAzB,EAA+C,SAA/C;AACA,oBAAY,OAAZ,CAAoB,IAApB,CAAyB,eAAzB,EAA+C,SAA/C;;AAEA;AACA,YAAM,cAAc,IAAI,aAAJ,CAAkB,WAAlB,EACkB,KADlB,EAEkB,YAAY,QAAZ,CAAqB,IAFvC,EAGkB,eAHlB,EAIkB,YAAY,OAJ9B,CAApB;;AAMA,oBAAY,MAAZ,CAAmB,IAAnB,CAAwB,WAAxB;AACA,oBAAY,SAAZ,GAAwB,WAAxB;AACA,kBAAU,aAAV,CAAwB,YAAY,gBAApC;;AAEA,cAAM,UAAN,CAAiB,YAAY,UAA7B,EAAyC,YAAY,SAArD;AACA;AACD;;AAED,gBAAU,MAAM,UAAN,CAAiB,OAAjB,CAAV;AACD;AACF;AACF,CA5CD;;AA8CA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,IAAvB,EAA6B,iBAAkC;AAAA,MAAtB,WAAsB,SAAtB,WAAsB;AAAA,MAAT,KAAS,SAAT,KAAS;;AAC7D,MAAM,SAAS,YAAY,aAA3B;;AAEA,MAAI,CAAC,YAAY,WAAZ,EAAD,IAA8B,OAAO,MAAzC,EAAiD;AAAE;AAAS;;AAE5D,MAAM,SAAS,YAAY,MAA3B;AACA,MAAM,UAAU,UAAU,OAAO,OAAjC;AACA,MAAM,iBAAiB,WAAW,YAAY,QAAZ,CAAqB,IAAhC,IAAwC,QAAQ,YAAY,QAAZ,CAAqB,IAA7B,EAAmC,OAAlG;;AAEA,MAAM,MAAM,IAAI,IAAJ,GAAW,OAAX,EAAZ;AACA,MAAM,WAAW,EAAjB;AACA,MAAM,OAAO,MAAM,MAAN,CAAa,EAAb,EAAiB,YAAY,SAAZ,CAAsB,IAAvC,CAAb;AACA,MAAM,eAAe,YAAY,YAAZ,CAAyB,MAAzB,CAAgC,KAArD;;AAEA,MAAI,YAAY,KAAhB;AACA,MAAI,uBAAJ;;AAEA;AACA,MAAM,kBAAmB,kBAAkB,eAAe,OAAjC,IACH,YAAY,QAAZ,CAAqB,IAArB,KAA8B,SAD3B,IAEH,UAAU,OAAO,UAFvC;;AAIA,MAAM,UAAW,mBACX,MAAM,YAAY,SAAZ,CAAsB,SAA7B,GAA0C,EAD9B,IAEZ,eAAe,eAAe,QAFlB,IAGZ,eAAe,eAAe,QAHnC;;AAKA,MAAM,cAAc;AAClB,4BADkB;AAElB,gBAAY,IAFM;AAGlB,sBAHkB;AAIlB,YAAQ,IAJU;AAKlB,oBAAgB;AALE,GAApB;;AAQA;AACA,MAAI,mBAAmB,CAAC,OAAxB,EAAiC;AAC/B,cAAU,aAAV,CAAwB,QAAxB;;AAEA,qBAAiB,UAAU,MAAV,CAAiB,WAAjB,CAAjB;;AAEA,QAAI,eAAe,UAAf,IAA6B,eAAe,MAAhD,EAAwD;AACtD,kBAAY,IAAZ;AACD;AACF;;AAED,MAAI,EAAE,WAAW,SAAb,CAAJ,EAA6B;AAAE;AAAS;;AAExC,QAAM,UAAN,CAAiB,OAAO,QAAxB,EAAkC,YAAY,SAA9C;;AAEA,cAAY,QAAZ,CAAqB,CAArB,IAA0B,OAAO,UAAP,GACxB,IAAI,aAAJ,CAAkB,WAAlB,EAA+B,KAA/B,EAAsC,YAAY,QAAZ,CAAqB,IAA3D,EAAiE,cAAjE,EAAiF,YAAY,OAA7F,CADF;;AAGA,SAAO,EAAP,GAAY,GAAZ;;AAEA,SAAO,MAAP,GAAgB,IAAhB;AACA,SAAO,WAAP,GAAqB,eAAe,WAApC;AACA,cAAY,UAAZ,GAAyB,MAAzB;;AAEA,SAAO,IAAP,CAAY,OAAO,UAAnB;;AAEA,MAAI,OAAJ,EAAa;AACX,WAAO,GAAP,GAAa,YAAY,YAAZ,CAAyB,MAAzB,CAAgC,EAA7C;AACA,WAAO,GAAP,GAAa,YAAY,YAAZ,CAAyB,MAAzB,CAAgC,EAA7C;AACA,WAAO,EAAP,GAAY,YAAZ;;AAEA,gBAAY,WAAZ,EAAyB,MAAzB;;AAEA,UAAM,MAAN,CAAa,IAAb,EAAmB,YAAY,SAAZ,CAAsB,IAAzC;;AAEA,SAAK,CAAL,IAAU,OAAO,EAAjB;AACA,SAAK,CAAL,IAAU,OAAO,EAAjB;;AAEA,cAAU,aAAV,CAAwB,QAAxB;;AAEA,qBAAiB,UAAU,MAAV,CAAiB,WAAjB,CAAjB;;AAEA,WAAO,UAAP,IAAqB,eAAe,EAApC;AACA,WAAO,UAAP,IAAqB,eAAe,EAApC;;AAEA,WAAO,CAAP,GAAW,eAAe,OAAf,CAAuB,YAAY,iBAAnC,CAAX;AACD,GApBD,MAqBK;AACH,WAAO,SAAP,GAAmB,IAAnB;AACA,WAAO,EAAP,GAAY,eAAe,EAA3B;AACA,WAAO,EAAP,GAAY,eAAe,EAA3B;;AAEA,WAAO,EAAP,GAAY,OAAO,EAAP,GAAY,CAAxB;;AAEA,WAAO,CAAP,GAAW,eAAe,OAAf,CAAuB,YAAY,mBAAnC,CAAX;AACD;AACF,CA3FD;;AA6FA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,aAAvB,EAAsC,iBAA2B;AAAA,MAAf,WAAe,SAAf,WAAe;;AAC/D,MAAM,SAAS,YAAY,aAA3B;;AAEA,MAAI,OAAO,MAAX,EAAmB;AACjB,mBAAe,MAAf,CAAsB,OAAO,CAA7B;AACA,WAAO,MAAP,GAAgB,KAAhB;AACA,gBAAY,UAAZ,GAAyB,IAAzB;AACD;AACF,CARD;;AAUA,SAAS,WAAT,CAAsB,WAAtB,EAAmC,MAAnC,EAA2C;AACzC,MAAM,iBAAiB,YAAY,MAAZ,CAAmB,OAAnB,CAA2B,YAAY,QAAZ,CAAqB,IAAhD,EAAsD,OAA7E;AACA,MAAM,SAAS,eAAe,UAA9B;AACA,MAAM,aAAa,CAAC,KAAK,GAAL,CAAS,eAAe,QAAf,GAA0B,OAAO,EAA1C,CAAD,GAAiD,MAApE;;AAEA,SAAO,EAAP,GAAY,YAAY,SAAZ,CAAsB,KAAlC;AACA,SAAO,EAAP,GAAY,YAAY,SAAZ,CAAsB,KAAlC;AACA,SAAO,EAAP,GAAY,OAAO,UAAP,CAAkB,SAAlB,GAA8B,IAA1C;AACA,SAAO,EAAP,GAAY,OAAO,EAAP,GAAY,CAAxB;;AAEA,SAAO,UAAP,GAAoB,OAAO,EAAP,GAAY,CAAC,OAAO,GAAP,GAAa,UAAd,IAA4B,MAA5D;AACA,SAAO,UAAP,GAAoB,OAAO,EAAP,GAAY,CAAC,OAAO,GAAP,GAAa,UAAd,IAA4B,MAA5D;AACA,SAAO,EAAP,GAAY,UAAZ;;AAEA,SAAO,SAAP,GAAmB,SAAS,OAAO,EAAnC;AACA,SAAO,SAAP,GAAmB,IAAI,eAAe,QAAf,GAA0B,OAAO,EAAxD;AACD;;AAED,SAAS,YAAT,GAAyB;AACvB,sBAAoB,IAApB;AACA,QAAM,cAAN,CAAqB,KAAK,YAA1B,EAAwC,KAAK,UAA7C,EAAyD,KAAK,SAA9D;;AAEA,MAAM,SAAS,KAAK,aAApB;AACA,MAAM,UAAU,KAAK,MAAL,CAAY,OAAZ,CAAoB,KAAK,QAAL,CAAc,IAAlC,EAAwC,OAAxD;AACA,MAAM,SAAS,QAAQ,UAAvB;AACA,MAAM,IAAI,IAAI,IAAJ,GAAW,OAAX,KAAuB,IAAvB,GAA8B,OAAO,EAA/C;;AAEA,MAAI,IAAI,OAAO,EAAf,EAAmB;;AAEjB,QAAM,WAAY,IAAI,CAAC,KAAK,GAAL,CAAS,CAAC,MAAD,GAAU,CAAnB,IAAwB,OAAO,SAAhC,IAA6C,OAAO,SAA1E;;AAEA,QAAI,OAAO,UAAP,KAAsB,OAAO,EAA7B,IAAmC,OAAO,UAAP,KAAsB,OAAO,EAApE,EAAwE;AACtE,aAAO,EAAP,GAAY,OAAO,EAAP,GAAY,QAAxB;AACA,aAAO,EAAP,GAAY,OAAO,EAAP,GAAY,QAAxB;AACD,KAHD,MAIK;AACH,UAAM,YAAY,MAAM,sBAAN,CAA6B,CAA7B,EAAgC,CAAhC,EAC6B,OAAO,EADpC,EAE6B,OAAO,EAFpC,EAG6B,OAAO,UAHpC,EAI6B,OAAO,UAJpC,EAK6B,QAL7B,CAAlB;;AAOA,aAAO,EAAP,GAAY,UAAU,CAAtB;AACA,aAAO,EAAP,GAAY,UAAU,CAAtB;AACD;;AAED,SAAK,MAAL;;AAEA,WAAO,CAAP,GAAW,eAAe,OAAf,CAAuB,KAAK,iBAA5B,CAAX;AACD,GAvBD,MAwBK;AACH,WAAO,EAAP,GAAY,OAAO,UAAnB;AACA,WAAO,EAAP,GAAY,OAAO,UAAnB;;AAEA,SAAK,MAAL;AACA,SAAK,GAAL,CAAS,OAAO,UAAhB;AACA,WAAO,MAAP,GAAgB,KAAhB;AACA,SAAK,UAAL,GAAkB,IAAlB;AACD;;AAED,QAAM,UAAN,CAAiB,KAAK,UAAtB,EAAkC,KAAK,SAAvC;AACD;;AAED,SAAS,cAAT,GAA2B;AACzB,sBAAoB,IAApB;;AAEA,MAAM,SAAS,KAAK,aAApB;AACA,MAAM,IAAI,IAAI,IAAJ,GAAW,OAAX,KAAuB,OAAO,EAAxC;AACA,MAAM,WAAW,KAAK,MAAL,CAAY,OAAZ,CAAoB,KAAK,QAAL,CAAc,IAAlC,EAAwC,OAAxC,CAAgD,iBAAjE;;AAEA,MAAI,IAAI,QAAR,EAAkB;AAChB,WAAO,EAAP,GAAY,MAAM,WAAN,CAAkB,CAAlB,EAAqB,CAArB,EAAwB,OAAO,EAA/B,EAAmC,QAAnC,CAAZ;AACA,WAAO,EAAP,GAAY,MAAM,WAAN,CAAkB,CAAlB,EAAqB,CAArB,EAAwB,OAAO,EAA/B,EAAmC,QAAnC,CAAZ;;AAEA,SAAK,WAAL,CAAiB,OAAO,UAAxB,EAAoC,OAAO,UAA3C;;AAEA,WAAO,CAAP,GAAW,eAAe,OAAf,CAAuB,KAAK,mBAA5B,CAAX;AACD,GAPD,MAQK;AACH,WAAO,EAAP,GAAY,OAAO,EAAnB;AACA,WAAO,EAAP,GAAY,OAAO,EAAnB;;AAEA,SAAK,WAAL,CAAiB,OAAO,UAAxB,EAAoC,OAAO,UAA3C;AACA,SAAK,GAAL,CAAS,OAAO,UAAhB;;AAEA,WAAO,SAAP,GACE,OAAO,MAAP,GAAgB,KADlB;AAEA,SAAK,UAAL,GAAkB,IAAlB;AACD;AACF;;AAED,SAAS,mBAAT,CAA8B,WAA9B,EAA2C;AACzC,MAAM,SAAS,YAAY,aAA3B;;AAEA;AACA,MAAI,CAAC,OAAO,MAAZ,EAAoB;AAAE;AAAS;;AAE/B,MAAM,SAAW,OAAO,QAAP,CAAgB,IAAjC;AACA,MAAM,WAAW,OAAO,QAAP,CAAgB,MAAjC;;AAEA,QAAM,SAAN,CAAgB,YAAY,SAA5B,EAAuC,CAAE;AACvC,WAAS,OAAO,CAAP,GAAa,OAAO,EADU;AAEvC,WAAS,OAAO,CAAP,GAAa,OAAO,EAFU;AAGvC,aAAS,SAAS,CAAT,GAAa,OAAO,EAHU;AAIvC,aAAS,SAAS,CAAT,GAAa,OAAO;AAJU,GAAF,CAAvC;AAMD;;;;;AC/RD,IAAM,UAAe,QAAQ,iBAAR,CAArB;AACA,IAAM,SAAe,QAAQ,gBAAR,CAArB;AACA,IAAM,QAAe,QAAQ,SAAR,CAArB;AACA,IAAM,QAAe,QAAQ,SAAR,CAArB;AACA,IAAM,eAAe,QAAQ,gBAAR,CAArB;AACA,IAAM,cAAe,QAAQ,eAAR,CAArB;;AAEA,IAAM,eAAe,EAArB;;AAEA;;;;;;;;;;;;;;;;;;;;;;;;AAwBA,SAAS,QAAT,CAAmB,OAAnB,EAA4B,OAA5B,EAAqC;AACnC,MAAI,eAAe,MAAM,aAAN,CAAoB,GAApB,CAAwB,OAAxB,EAAiC,OAAjC,CAAnB;;AAEA,MAAI,CAAC,YAAL,EAAmB;AACjB,mBAAe,IAAI,YAAJ,CAAiB,OAAjB,EAA0B,OAA1B,CAAf;AACA,iBAAa,MAAb,CAAoB,MAApB,GAA6B,YAA7B;AACD;;AAED,SAAO,YAAP;AACD;;AAED;;;;;;;;AAQA,SAAS,KAAT,GAAiB,UAAU,OAAV,EAAmB,OAAnB,EAA4B;AAC3C,SAAO,MAAM,aAAN,CAAoB,cAApB,CAAmC,OAAnC,EAA4C,WAAW,QAAQ,OAA/D,MAA4E,CAAC,CAApF;AACD,CAFD;;AAIA;;;;;;;;;;;;AAYA,SAAS,EAAT,GAAc,UAAU,IAAV,EAAgB,QAAhB,EAA0B,OAA1B,EAAmC;AAC/C,MAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,IAAhB,KAAyB,KAAK,MAAL,CAAY,GAAZ,MAAqB,CAAC,CAAnD,EAAsD;AACpD,WAAO,KAAK,IAAL,GAAY,KAAZ,CAAkB,IAAlB,CAAP;AACD;;AAED,MAAI,MAAM,EAAN,CAAS,KAAT,CAAe,IAAf,CAAJ,EAA0B;AACxB,yBAAwB,IAAxB,kHAA8B;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAAnB,SAAmB;;AAC5B,eAAS,EAAT,CAAY,SAAZ,EAAuB,QAAvB,EAAiC,OAAjC;AACD;;AAED,WAAO,QAAP;AACD;;AAED,MAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,IAAhB,CAAJ,EAA2B;AACzB,SAAK,IAAM,IAAX,IAAmB,IAAnB,EAAyB;AACvB,eAAS,EAAT,CAAY,IAAZ,EAAkB,KAAK,IAAL,CAAlB,EAA8B,QAA9B;AACD;;AAED,WAAO,QAAP;AACD;;AAED;AACA,MAAI,MAAM,QAAN,CAAe,aAAa,UAA5B,EAAwC,IAAxC,CAAJ,EAAmD;AACjD;AACA,QAAI,CAAC,aAAa,IAAb,CAAL,EAAyB;AACvB,mBAAa,IAAb,IAAqB,CAAC,QAAD,CAArB;AACD,KAFD,MAGK;AACH,mBAAa,IAAb,EAAmB,IAAnB,CAAwB,QAAxB;AACD;AACF;AACD;AATA,OAUK;AACH,aAAO,GAAP,CAAW,MAAM,QAAjB,EAA2B,IAA3B,EAAiC,QAAjC,EAA2C,EAAE,gBAAF,EAA3C;AACD;;AAED,SAAO,QAAP;AACD,CArCD;;AAuCA;;;;;;;;;;;AAWA,SAAS,GAAT,GAAe,UAAU,IAAV,EAAgB,QAAhB,EAA0B,OAA1B,EAAmC;AAChD,MAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,IAAhB,KAAyB,KAAK,MAAL,CAAY,GAAZ,MAAqB,CAAC,CAAnD,EAAsD;AACpD,WAAO,KAAK,IAAL,GAAY,KAAZ,CAAkB,IAAlB,CAAP;AACD;;AAED,MAAI,MAAM,EAAN,CAAS,KAAT,CAAe,IAAf,CAAJ,EAA0B;AACxB,0BAAwB,IAAxB,yHAA8B;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAAnB,SAAmB;;AAC5B,eAAS,GAAT,CAAa,SAAb,EAAwB,QAAxB,EAAkC,OAAlC;AACD;;AAED,WAAO,QAAP;AACD;;AAED,MAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,IAAhB,CAAJ,EAA2B;AACzB,SAAK,IAAM,IAAX,IAAmB,IAAnB,EAAyB;AACvB,eAAS,GAAT,CAAa,IAAb,EAAmB,KAAK,IAAL,CAAnB,EAA+B,QAA/B;AACD;;AAED,WAAO,QAAP;AACD;;AAED,MAAI,CAAC,MAAM,QAAN,CAAe,aAAa,UAA5B,EAAwC,IAAxC,CAAL,EAAoD;AAClD,WAAO,MAAP,CAAc,MAAM,QAApB,EAA8B,IAA9B,EAAoC,QAApC,EAA8C,OAA9C;AACD,GAFD,MAGK;AACH,QAAI,cAAJ;;AAEA,QAAI,QAAQ,YAAR,IACG,CAAC,QAAQ,MAAM,OAAN,CAAc,aAAa,IAAb,CAAd,EAAkC,QAAlC,CAAT,MAA0D,CAAC,CADlE,EACqE;AACnE,mBAAa,IAAb,EAAmB,MAAnB,CAA0B,KAA1B,EAAiC,CAAjC;AACD;AACF;;AAED,SAAO,QAAP;AACD,CAlCD;;AAoCA;;;;;;;AAOA,SAAS,KAAT,GAAiB,YAAY;AAC3B,SAAO,KAAP;AACD,CAFD;;AAIA;AACA,SAAS,iBAAT,GAA8B,MAAM,cAApC;AACA,SAAS,YAAT,GAA8B,MAAM,SAApC;AACA,SAAS,gBAAT,GAA8B,MAAM,aAApC;AACA,SAAS,aAAT,GAA8B,MAAM,UAApC;;AAEA,SAAS,cAAT,GAAgC,MAAM,cAAtC;AACA,SAAS,oBAAT,GAAgC,MAAM,oBAAtC;AACA,SAAS,eAAT,GAAgC,MAAM,eAAtC;AACA,SAAS,OAAT,GAAgC,MAAM,OAAtC;;AAEA;;;;;;AAMA,SAAS,aAAT,GAAyB,YAAY;AACnC,SAAO,QAAQ,aAAf;AACD,CAFD;;AAIA;;;;;;AAMA,SAAS,oBAAT,GAAgC,YAAY;AAC1C,SAAO,QAAQ,oBAAf;AACD,CAFD;;AAIA;;;;;;;;;AASA,SAAS,IAAT,GAAgB,UAAU,KAAV,EAAiB;AAC/B,OAAK,IAAI,IAAI,MAAM,YAAN,CAAmB,MAAnB,GAA4B,CAAzC,EAA4C,KAAK,CAAjD,EAAoD,GAApD,EAAyD;AACvD,UAAM,YAAN,CAAmB,CAAnB,EAAsB,IAAtB,CAA2B,KAA3B;AACD;;AAED,SAAO,QAAP;AACD,CAND;;AAQA;;;;;;;;;AASA,SAAS,oBAAT,GAAgC,UAAU,QAAV,EAAoB;AAClD,MAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,QAAhB,CAAJ,EAA+B;AAC7B,gBAAY,oBAAZ,GAAmC,QAAnC;;AAEA,WAAO,IAAP;AACD;;AAED,SAAO,YAAY,oBAAnB;AACD,CARD;;AAUA,SAAS,WAAT,GAA0B,MAAM,WAAhC;AACA,SAAS,cAAT,GAA0B,MAAM,cAAhC;;AAEA,MAAM,QAAN,GAAiB,QAAjB;;AAEA,OAAO,OAAP,GAAiB,QAAjB;;;;;AC7OA,IAAM,eAAe,QAAQ,gBAAR,CAArB;AACA,IAAM,cAAe,QAAQ,eAAR,CAArB;AACA,IAAM,QAAe,QAAQ,SAAR,CAArB;AACA,IAAM,KAAe,QAAQ,YAAR,CAArB;AACA,IAAM,SAAe,QAAQ,gBAAR,CAArB;;eAE0C,QAAQ,kBAAR,C;IAAlC,Y,YAAA,Y;IAAc,e,YAAA,e;;AAEtB;;;;;;;;;;;;;;;AAaA,aAAa,SAAb,CAAuB,cAAvB,GAAwC,UAAU,QAAV,EAAoB;AAC1D,MAAI,wBAAwB,IAAxB,CAA6B,QAA7B,CAAJ,EAA4C;AAC1C,SAAK,OAAL,CAAa,cAAb,GAA8B,QAA9B;AACA,WAAO,IAAP;AACD;;AAED,MAAI,GAAG,IAAH,CAAQ,QAAR,CAAJ,EAAuB;AACrB,SAAK,OAAL,CAAa,cAAb,GAA8B,WAAU,QAAV,GAAqB,OAAnD;AACA,WAAO,IAAP;AACD;;AAED,SAAO,KAAK,OAAL,CAAa,cAApB;AACD,CAZD;;AAcA,aAAa,SAAb,CAAuB,sBAAvB,GAAgD,UAAU,KAAV,EAAiB;AAC/D,MAAM,UAAU,KAAK,OAAL,CAAa,cAA7B;;AAEA,MAAI,YAAY,OAAhB,EAAyB;AAAE;AAAS;;AAEpC,MAAI,YAAY,QAAhB,EAA0B;AACxB,UAAM,cAAN;AACA;AACD;;AAED;;AAEA;AACA;AACA,MAAI,OAAO,eAAX,EAA4B;AAC1B;AACD;;AAED;AACA,MAAI,uCAAuC,IAAvC,CAA4C,MAAM,IAAlD,CAAJ,EAA6D;AAC3D;AACD;;AAED;AACA,MAAI,GAAG,OAAH,CAAW,MAAM,MAAjB,KACG,gBAAgB,MAAM,MAAtB,EAA8B,uEAA9B,CADP,EAC+G;AAC7G;AACD;;AAED,QAAM,cAAN;AACD,CA9BD;;AAgCA,SAAS,kBAAT,OAAqD;AAAA,MAAtB,WAAsB,QAAtB,WAAsB;AAAA,MAAT,KAAS,QAAT,KAAS;;AACnD,MAAI,YAAY,MAAhB,EAAwB;AACtB,gBAAY,MAAZ,CAAmB,sBAAnB,CAA0C,KAA1C;AACD;AACF;;WAEyB,CAAC,MAAD,EAAS,MAAT,EAAiB,IAAjB,EAAuB,QAAvB,C;AAA1B,yCAA4D;AAAvD,MAAM,sBAAN;AACH,cAAY,OAAZ,CAAoB,EAApB,CAAuB,WAAvB,EAAoC,kBAApC;AACD;;AAED;AACA,YAAY,SAAZ,CAAsB,SAAtB,GAAkC,SAAS,iBAAT,CAA4B,KAA5B,EAAmC;AACnE,uBAA0B,MAAM,YAAhC,mHAA8C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,QAAnC,WAAmC;;;AAE5C,QAAI,YAAY,OAAZ,KACI,YAAY,OAAZ,KAAwB,MAAM,MAA9B,IACG,aAAa,YAAY,OAAzB,EAAkC,MAAM,MAAxC,CAFP,CAAJ,EAE6D;;AAE3D,kBAAY,MAAZ,CAAmB,sBAAnB,CAA0C,KAA1C;AACA;AACD;AACF;AACF,CAXD;;;;;AC9EA,IAAM,QAAgB,QAAQ,SAAR,CAAtB;AACA,IAAM,SAAgB,QAAQ,gBAAR,CAAtB;AACA,IAAM,UAAgB,QAAQ,iBAAR,CAAtB;AACA,IAAM,UAAgB,QAAQ,2BAAR,CAAtB;AACA,IAAM,gBAAgB,QAAQ,sBAAR,CAAtB;;eAEmB,QAAQ,gBAAR,C;IAAX,M,YAAA,M;;AAER,IAAM,WAAW,OAAO,SAAP,CAAiB,QAAlC;;AAEA,IAAI,CAAC,OAAO,KAAP,CAAa,OAAlB,EAA2B;AACzB,SAAO,KAAP,CAAa,OAAb,GAAuB,UAAU,GAAV,EAAe;AACpC,WAAO,SAAS,IAAT,CAAc,GAAd,MAAuB,gBAA9B;AACD,GAFD;AAGD;;AAED,IAAI,CAAC,OAAO,SAAP,CAAiB,IAAtB,EAA4B;AAC1B,SAAO,SAAP,CAAiB,IAAjB,GAAwB,YAAY;AAClC,WAAO,KAAK,OAAL,CAAa,oCAAb,EAAmD,EAAnD,CAAP;AACD,GAFD;AAGD;;AAED;AACA;AACA;AACA;AACA;AACA,SAAS,aAAT,CAAwB,KAAxB,EAA+B;AAC7B,MAAM,cAAc,MAAM,MAA1B;AACA,MAAM,cAAc,QAAQ,MAAR,CAAe,KAAf,EAAsB,MAAM,IAA5B,EAAkC,WAAlC,CAApB;;AAEA,MAAI,CAAC,WAAL,EAAkB;AAAE;AAAS;;AAE7B,MAAI,YAAY,OAAZ,IACG,MAAM,OAAN,KAAkB,YAAY,OAAZ,CAAoB,OADzC,IAEG,MAAM,OAAN,KAAkB,YAAY,OAAZ,CAAoB,OAFzC,IAGG,gBAAkB,YAAY,OAAZ,CAAoB,MAH7C,EAGqD;;AAEnD,gBAAY,WAAZ,CAAwB,CAAxB,IAA6B,WAA7B;AACA,gBAAY,SAAZ,CAAwB,CAAxB,IAA6B,IAAI,IAAJ,GAAW,OAAX,EAA7B;;AAEA,kBAAc,IAAd,CAAmB;AACjB,8BADiB;AAEjB,kBAFiB;AAGjB,8BAHiB;AAIjB,eAAS,KAJQ;AAKjB,YAAM;AALW,KAAnB;AAOD;AACF;;AAED,IAAI,QAAQ,KAAZ,EAAmB;AACjB,MAAM,YAAY,SAAZ,SAAY,CAAU,KAAV,EAAiB;AACjC,yBAA0B,MAAM,YAAhC,kHAA8C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAAnC,WAAmC;;AAC5C,UAAI,YAAY,WAAZ,EAAJ,EAA+B;AAC7B,oBAAY,MAAZ,CAAmB,sBAAnB,CAA0C,KAA1C;AACD;AACF;AACF,GAND;;AAQA,MAAM,WAAW,SAAS,QAAT,QAAiC,UAAjC,EAA6C;AAAA,QAAxB,GAAwB,SAAxB,GAAwB;AAAA,QAAnB,GAAmB,SAAnB,GAAmB;;AAC5D,QAAM,cAAc,WAAW,OAAX,CAAmB,QAAnB,MAAiC,CAAjC,GAChB,OAAO,GADS,GACH,OAAO,MADxB;;AAGA;AACA,gBAAY,GAAZ,EAAiB,aAAjB,EAAgC,SAAhC;;AAEA,QAAI,aAAJ,EAAmB;AACjB,kBAAY,GAAZ,EAAiB,UAAjB,EAA6B,aAA7B;AACD;AACF,GAVD;;AAYA,QAAM,OAAN,CAAc,EAAd,CAAiB,cAAjB,EAAoC,QAApC;AACA,QAAM,OAAN,CAAc,EAAd,CAAiB,iBAAjB,EAAoC,QAApC;AACD;;AAED,OAAO,OAAP,GAAiB,IAAjB;;;;;AC5EA,IAAM,gBAAgB,QAAQ,kBAAR,CAAtB;AACA,IAAM,cAAgB,QAAQ,gBAAR,CAAtB;AACA,IAAM,SAAgB,QAAQ,iBAAR,CAAtB;;AAEA,IAAM,YAAY;AAChB,SAAO,EADS;;AAGhB,cAAY,oBAAU,GAAV,EAAe;AAAA,QACjB,WADiB,GACiB,GADjB,CACjB,WADiB;AAAA,QACQ,IADR,GACiB,GADjB,CACJ,UADI;AAAA,QAEjB,MAFiB,GAEgB,WAFhB,CAEjB,MAFiB;AAAA,QAET,OAFS,GAEgB,WAFhB,CAET,OAFS;AAAA,QAEA,WAFA,GAEgB,WAFhB,CAEA,WAFA;;AAGzB,QAAM,OAAO,OAAO,OAAP,CAAe,OAAf,CAAb;;AAEA,QAAI,IAAJ,EAAU;AACR,kBAAY,IAAZ,GAAmB,KAAK,CAAL,GAAS,KAAK,IAAjC;AACA,kBAAY,GAAZ,GAAmB,KAAK,CAAL,GAAS,KAAK,GAAjC;;AAEA,kBAAY,KAAZ,GAAqB,KAAK,KAAL,GAAc,KAAK,CAAxC;AACA,kBAAY,MAAZ,GAAqB,KAAK,MAAL,GAAc,KAAK,CAAxC;;AAEA,UAAI,EAAE,WAAY,IAAd,CAAJ,EAAyB;AAAE,aAAK,KAAL,GAAc,KAAK,KAAL,GAAc,KAAK,IAAjC;AAAwC;AACnE,UAAI,EAAE,YAAY,IAAd,CAAJ,EAAyB;AAAE,aAAK,MAAL,GAAc,KAAK,MAAL,GAAc,KAAK,GAAjC;AAAwC;AACpE,KATD,MAUK;AACH,kBAAY,IAAZ,GAAmB,YAAY,GAAZ,GAAkB,YAAY,KAAZ,GAAoB,YAAY,MAAZ,GAAqB,CAA9E;AACD;;AAED,QAAI,IAAJ,GAAW,IAAX;AACA,QAAI,YAAJ,GAAmB,MAAnB;AACA,QAAI,OAAJ,GAAc,OAAd;;AAEA,SAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,UAAU,KAAV,CAAgB,MAApC,EAA4C,GAA5C,EAAiD;AAC/C,UAAM,eAAe,UAAU,KAAV,CAAgB,CAAhB,CAArB;;AAEA,UAAI,OAAJ,GAAc,OAAO,OAAP,CAAe,YAAY,QAAZ,CAAqB,IAApC,EAA0C,YAA1C,CAAd;;AAEA,UAAI,CAAC,IAAI,OAAT,EAAkB;AAChB;AACD;;AAED,kBAAY,eAAZ,CAA4B,YAA5B,IAA4C,UAAU,YAAV,EAAwB,SAAxB,CAAkC,GAAlC,CAA5C;AACD;AACF,GArCe;;AAuChB,UAAQ,gBAAU,GAAV,EAAe;AAAA,QACb,WADa,GACqC,GADrC,CACb,WADa;AAAA,QACA,QADA,GACqC,GADrC,CACA,QADA;AAAA,QACU,MADV,GACqC,GADrC,CACU,MADV;AAAA,QACkB,cADlB,GACqC,GADrC,CACkB,cADlB;;AAErB,QAAM,SAAS,OAAO,EAAP,EAAW,IAAI,UAAf,CAAf;AACA,QAAM,SAAS;AACb,UAAI,CADS;AAEb,UAAI,CAFS;AAGb,eAAS,KAHI;AAIb,cAAQ,KAJK;AAKb,kBAAY;AALC,KAAf;;AAQA,yBAA2B,UAAU,KAArC,kHAA4C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAAjC,YAAiC;;AAC1C,UAAM,WAAW,UAAU,YAAV,CAAjB;AACA,UAAM,UAAU,YAAY,MAAZ,CAAmB,OAAnB,CAA2B,YAAY,QAAZ,CAAqB,IAAhD,EAAsD,YAAtD,CAAhB;;AAEA,UAAI,CAAC,SAAS,OAAT,EAAkB,MAAlB,EAA0B,cAA1B,CAAL,EAAgD;AAAE;AAAW;;AAE7D,UAAI,MAAJ,GAAa,IAAI,MAAJ,GAAa,SAAS,YAAT,CAA1B;AACA,UAAI,OAAJ,GAAc,OAAd;AACA,UAAI,MAAJ,GAAa,IAAI,WAAJ,CAAgB,eAAhB,CAAgC,YAAhC,CAAb;;AAEA,eAAS,GAAT,CAAa,GAAb;;AAEA,UAAI,IAAI,MAAJ,CAAW,MAAf,EAAuB;AACrB,eAAO,CAAP,IAAY,IAAI,MAAJ,CAAW,EAAvB;AACA,eAAO,CAAP,IAAY,IAAI,MAAJ,CAAW,EAAvB;;AAEA,eAAO,EAAP,IAAa,IAAI,MAAJ,CAAW,EAAxB;AACA,eAAO,EAAP,IAAa,IAAI,MAAJ,CAAW,EAAxB;;AAEA,eAAO,MAAP,GAAgB,IAAhB;AACD;AACF;;AAED;AACA;AACA;AACA;AACA,WAAO,UAAP,GAAoB,CAAC,IAAI,MAAL,IAAe,CAAC,OAAO,MAAvB,IAAiC,IAAI,MAAJ,CAAW,OAAhE;;AAEA,WAAO,MAAP;AACD,GAhFe;;AAkFhB,iBAAe,uBAAU,QAAV,EAAoB;AACjC,0BAA2B,UAAU,KAArC,yHAA4C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAAjC,YAAiC;;AAC1C,UAAM,SAAS,SAAS,YAAT,KAA0B,EAAzC;;AAEA,aAAO,EAAP,GAAY,OAAO,EAAP,GAAY,CAAxB;AACA,aAAO,SAAP,GAAmB,OAAO,SAAP,GAAmB,GAAtC;AACA,aAAO,MAAP,GAAgB,KAAhB;AACA,aAAO,OAAP,GAAiB,IAAjB;;AAEA,eAAS,YAAT,IAAyB,MAAzB;AACD;;AAED,WAAO,QAAP;AACD,GA/Fe;;AAiGhB,SAAO,sBAA2B,UAA3B,EAAuC;AAAA,QAA3B,WAA2B,SAA3B,WAA2B;;AAC5C,QAAM,MAAM;AACV,8BADU;AAEV,kBAAY,CAAC,eAAe,eAAf,GACA,YAAY,SADZ,GACwB,YAAY,WADrC,EACkD,IAHpD;AAIV,mBAAa,YAAY,WAJf;AAKV,gBAAU,YAAY,gBALZ;AAMV,cAAQ,KANE;AAOV,sBAAgB;AAPN,KAAZ;;AAUA,cAAU,UAAV,CAAqB,GAArB;AACA,cAAU,aAAV,CAAwB,IAAI,QAA5B;;AAEA,QAAI,UAAJ,GAAiB,OAAO,EAAP,EAAW,YAAY,WAAZ,CAAwB,IAAnC,CAAjB;AACA,gBAAY,cAAZ,GAA6B,UAAU,MAAV,CAAiB,GAAjB,CAA7B;AACD;AAjHe,CAAlB;;AAoHA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,KAAvB,EAA8B,UAAU,WAAV,EAAuB;AACnD,cAAY,WAAZ,GAA+B,EAAE,MAAM,CAAR,EAAW,OAAO,CAAlB,EAAqB,KAAK,CAA1B,EAA6B,QAAQ,CAArC,EAA/B;AACA,cAAY,eAAZ,GAA+B,EAA/B;AACA,cAAY,gBAAZ,GAA+B,UAAU,aAAV,CAAwB,EAAxB,CAA/B;AACA,cAAY,cAAZ,GAA+B,IAA/B;AACD,CALD;;AAOA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,cAAvB,EAAwC,UAAU,KAAlD;AACA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,eAAvB,EAAwC,UAAU,KAAlD;;AAEA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,oBAAvB,EAA6C,iBAA0D;AAAA,MAA9C,WAA8C,SAA9C,WAA8C;AAAA,MAAjC,MAAiC,SAAjC,MAAiC;AAAA,MAAzB,qBAAyB,SAAzB,qBAAyB;;AACrG,MAAM,iBAAiB,UAAU,MAAV,CAAiB;AACtC,4BADsC;AAEtC,kBAFsC;AAGtC,gBAAY,YAAY,SAAZ,CAAsB,IAHI;AAItC,cAAU,YAAY,gBAJgB;AAKtC,oBAAgB;AALsB,GAAjB,CAAvB;;AAQA;AACA;AACA,MAAI,CAAC,eAAe,UAAhB,IAA8B,qBAAlC,EAAyD;AACvD,gBAAY,aAAZ,GAA4B,IAA5B;AACD;;AAED,cAAY,cAAZ,GAA6B,cAA7B;AACD,CAhBD;;AAkBA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,YAAvB,EAAqC,iBAAkC;AAAA,MAAtB,WAAsB,SAAtB,WAAsB;AAAA,MAAT,KAAS,SAAT,KAAS;;AACrE,OAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,UAAU,KAAV,CAAgB,MAApC,EAA4C,GAA5C,EAAiD;AAC/C,QAAM,UAAU,YAAY,MAAZ,CAAmB,OAAnB,CAA2B,YAAY,QAAZ,CAAqB,IAAhD,EAAsD,UAAU,KAAV,CAAgB,CAAhB,CAAtD,CAAhB;;AAEA;AACA,QAAI,SAAS,OAAT,EAAkB,IAAlB,EAAwB,IAAxB,CAAJ,EAAmC;AACjC;AACA,kBAAY,MAAZ,CAAmB,EAAE,YAAF,EAAS,QAAQ,IAAjB,EAAnB;AACA;AACD;AACF;AACF,CAXD;;AAaA,cAAc,OAAd,CAAsB,EAAtB,CAAyB,QAAzB,EAAmC,UAAU,GAAV,EAAe;AAAA,MACxC,MADwC,GAChB,GADgB,CACxC,MADwC;AAAA,MAChC,WADgC,GAChB,GADgB,CAChC,WADgC;;AAEhD,MAAM,cAAc,OAAO,EAAP,EAAW,GAAX,CAApB;;AAEA,OAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,UAAU,KAAV,CAAgB,MAApC,EAA4C,GAA5C,EAAiD;AAC/C,QAAM,eAAe,UAAU,KAAV,CAAgB,CAAhB,CAArB;AACA,gBAAY,OAAZ,GAAsB,YAAY,MAAZ,CAAmB,OAAnB,CAA2B,YAAY,QAAZ,CAAqB,IAAhD,EAAsD,YAAtD,CAAtB;;AAEA,QAAI,CAAC,YAAY,OAAjB,EAA0B;AACxB;AACD;;AAED,QAAM,WAAW,UAAU,YAAV,CAAjB;;AAEA,gBAAY,MAAZ,GAAqB,YAAY,gBAAZ,CAA6B,YAA7B,CAArB;;AAEA,WAAO,YAAP,IAAuB,SAAS,YAAT,CAAsB,WAAtB,CAAvB;AACD;AACF,CAlBD;;AAoBA,SAAS,QAAT,CAAmB,OAAnB,EAA4B,MAA5B,EAAoC,cAApC,EAAoD;AAClD,SAAQ,WAAW,QAAQ,OAAnB,KACI,UAAU,CAAC,QAAQ,OADvB,MAEI,CAAC,cAAD,IAAmB,QAAQ,OAF/B,CAAR;AAGD;;AAED,OAAO,OAAP,GAAiB,SAAjB;;;;;AC3LA,IAAM,YAAiB,QAAQ,SAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,UAAR,CAAvB;AACA,IAAM,iBAAiB,QAAQ,mBAAR,CAAvB;;AAEA,IAAM,WAAW;AACf,YAAU;AACR,aAAa,KADL;AAER,aAAa,KAFL;AAGR,iBAAa,IAHL;AAIR,iBAAa;AAJL,GADK;;AAQf,aAAW,yBAA0C;AAAA,QAA9B,IAA8B,QAA9B,IAA8B;AAAA,QAAxB,WAAwB,QAAxB,WAAwB;AAAA,QAAX,OAAW,QAAX,OAAW;;AACnD,QAAM,cAAc,WAAW,QAAQ,WAAvC;AACA,QAAM,SAAS,EAAf;;AAEA,QAAI,QAAQ,WAAZ,EAAyB;AACvB,aAAO,IAAP,GAAc,YAAY,IAAZ,GAAoB,KAAK,KAAL,GAAc,YAAY,IAA5D;AACA,aAAO,GAAP,GAAc,YAAY,GAAZ,GAAoB,KAAK,MAAL,GAAc,YAAY,GAA5D;;AAEA,aAAO,KAAP,GAAgB,YAAY,KAAZ,GAAsB,KAAK,KAAL,IAAe,IAAI,YAAY,KAA/B,CAAtC;AACA,aAAO,MAAP,GAAgB,YAAY,MAAZ,GAAsB,KAAK,MAAL,IAAe,IAAI,YAAY,MAA/B,CAAtC;AACD,KAND,MAOK;AACH,aAAO,IAAP,GAAc,OAAO,GAAP,GAAa,OAAO,KAAP,GAAe,OAAO,MAAP,GAAgB,CAA1D;AACD;;AAED,WAAO,MAAP;AACD,GAxBc;;AA0Bf,OAAK,oBAAwD;AAAA,QAA5C,UAA4C,SAA5C,UAA4C;AAAA,QAAhC,WAAgC,SAAhC,WAAgC;AAAA,QAAnB,MAAmB,SAAnB,MAAmB;AAAA,QAAX,OAAW,SAAX,OAAW;;AAC3D,QAAI,CAAC,OAAL,EAAc;AAAE,aAAO,MAAP;AAAgB;;AAEhC,QAAM,OAAO,OAAO,WAAP,GACT,EAAE,GAAG,OAAO,CAAZ,EAAe,GAAG,OAAO,CAAzB,EADS,GAET,MAAM,MAAN,CAAa,EAAb,EAAiB,UAAjB,CAFJ;;AAIA,QAAM,cAAc,mBAAmB,QAAQ,WAA3B,EAAwC,WAAxC,EAAqD,IAArD,CAApB;;AAEA,QAAI,CAAC,WAAL,EAAkB;AAAE,aAAO,MAAP;AAAgB;;AAEpC,WAAO,EAAP,GAAY,CAAZ;AACA,WAAO,EAAP,GAAY,CAAZ;AACA,WAAO,MAAP,GAAgB,KAAhB;;AAEA,QAAM,OAAO,WAAb;AACA,QAAI,YAAY,KAAK,CAArB;AACA,QAAI,YAAY,KAAK,CAArB;;AAEA,QAAM,SAAS,YAAY,eAAZ,CAA4B,QAA3C;;AAEA;AACA;AACA;AACA,QAAI,OAAO,WAAP,IAAsB,OAAO,WAAjC,EAA8C;AAC5C,kBAAY,KAAK,GAAL,CAAS,KAAK,GAAL,CAAS,KAAK,CAAL,GAAS,KAAK,KAAd,GAAuB,OAAO,KAAvC,EAA+C,KAAK,CAApD,CAAT,EAAiE,KAAK,CAAL,GAAS,OAAO,IAAjF,CAAZ;AACA,kBAAY,KAAK,GAAL,CAAS,KAAK,GAAL,CAAS,KAAK,CAAL,GAAS,KAAK,MAAd,GAAuB,OAAO,MAAvC,EAA+C,KAAK,CAApD,CAAT,EAAiE,KAAK,CAAL,GAAS,OAAO,GAAjF,CAAZ;AACD,KAHD,MAIK;AACH,kBAAY,KAAK,GAAL,CAAS,KAAK,GAAL,CAAS,KAAK,KAAL,GAAc,OAAO,KAA9B,EAAsC,KAAK,CAA3C,CAAT,EAAwD,KAAK,IAAL,GAAY,OAAO,IAA3E,CAAZ;AACA,kBAAY,KAAK,GAAL,CAAS,KAAK,GAAL,CAAS,KAAK,MAAL,GAAc,OAAO,MAA9B,EAAsC,KAAK,CAA3C,CAAT,EAAwD,KAAK,GAAL,GAAY,OAAO,GAA3E,CAAZ;AACD;;AAED,WAAO,EAAP,GAAY,YAAY,KAAK,CAA7B;AACA,WAAO,EAAP,GAAY,YAAY,KAAK,CAA7B;;AAEA,WAAO,OAAP,GAAiB,OAAO,SAAP,KAAqB,SAArB,IAAkC,OAAO,SAAP,KAAqB,SAAxE;AACA,WAAO,MAAP,GAAgB,CAAC,EAAE,OAAO,EAAP,IAAa,OAAO,EAAtB,CAAjB;;AAEA,WAAO,SAAP,GAAmB,SAAnB;AACA,WAAO,SAAP,GAAmB,SAAnB;AACD,GAnEc;;AAqEf,gBAAc,6BAAoD;AAAA,QAAxC,IAAwC,SAAxC,IAAwC;AAAA,QAAlC,MAAkC,SAAlC,MAAkC;AAAA,QAA1B,MAA0B,SAA1B,MAA0B;AAAA,QAAlB,KAAkB,SAAlB,KAAkB;AAAA,QAAX,OAAW,SAAX,OAAW;;AAChE,QAAM,cAAc,WAAW,QAAQ,WAAvC;;AAEA,QAAI,WAAW,QAAQ,OAAnB,IACG,EAAE,UAAU,OAAV,IAAqB,WAArB,IAAoC,OAAO,MAA7C,CADP,EAC6D;;AAE3D,UAAI,OAAO,MAAX,EAAmB;AACjB,aAAK,CAAL,IAAU,OAAO,EAAjB;AACA,aAAK,CAAL,IAAU,OAAO,EAAjB;AACA,eAAO,CAAP,IAAY,OAAO,EAAnB;AACA,eAAO,CAAP,IAAY,OAAO,EAAnB;;AAEA,eAAO;AACL,cAAI,OAAO,EADN;AAEL,cAAI,OAAO;AAFN,SAAP;AAID;AACF;AACF,GAvFc;;AAyFf;AAzFe,CAAjB;;AA4FA,SAAS,kBAAT,CAA6B,KAA7B,EAAoC,WAApC,EAAiD,IAAjD,EAAuD;AACrD,MAAI,MAAM,EAAN,CAAS,QAAT,CAAkB,KAAlB,CAAJ,EAA8B;AAC5B,WAAO,MAAM,eAAN,CAAsB,KAAtB,EAA6B,YAAY,MAAzC,EAAiD,YAAY,OAA7D,EAAsE,CAAC,KAAK,CAAN,EAAS,KAAK,CAAd,EAAiB,WAAjB,CAAtE,CAAP;AACD,GAFD,MAEO;AACL,WAAO,MAAM,eAAN,CAAsB,KAAtB,EAA6B,YAAY,MAAzC,EAAiD,YAAY,OAA7D,CAAP;AACD;AACF;;AAED,UAAU,QAAV,GAAqB,QAArB;AACA,UAAU,KAAV,CAAgB,IAAhB,CAAqB,UAArB;;AAEA,eAAe,SAAf,CAAyB,QAAzB,GAAoC,SAAS,QAA7C;;AAEA,OAAO,OAAP,GAAiB,QAAjB;;;;;AC7GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,IAAM,YAAiB,QAAQ,SAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,UAAR,CAAvB;AACA,IAAM,YAAiB,QAAQ,eAAR,CAAvB;AACA,IAAM,iBAAiB,QAAQ,mBAAR,CAAvB;AACA,IAAM,SAAiB,QAAQ,mBAAR,CAAvB;;eAE+B,QAAQ,YAAR,C;IAAvB,kB,YAAA,kB;;AAER,IAAM,UAAU,EAAE,KAAK,CAAC,QAAR,EAAkB,MAAM,CAAC,QAAzB,EAAmC,QAAQ,CAAC,QAA5C,EAAsD,OAAO,CAAC,QAA9D,EAAhB;AACA,IAAM,UAAU,EAAE,KAAK,CAAC,QAAR,EAAkB,MAAM,CAAC,QAAzB,EAAmC,QAAQ,CAAC,QAA5C,EAAsD,OAAO,CAAC,QAA9D,EAAhB;;AAEA,IAAM,gBAAgB;AACpB,YAAU;AACR,aAAS,KADD;AAER,aAAS,KAFD;AAGR,SAAK,IAHG;AAIR,SAAK,IAJG;AAKR,YAAQ;AALA,GADU;;AASpB,aAAW,yBAAiD;AAAA,QAArC,WAAqC,QAArC,WAAqC;AAAA,QAAxB,WAAwB,QAAxB,WAAwB;AAAA,QAAX,OAAW,QAAX,OAAW;;AAC1D,QAAI,CAAC,OAAL,EAAc;AACZ,aAAO,MAAM,MAAN,CAAa,EAAb,EAAiB,WAAjB,CAAP;AACD;;AAED,QAAM,SAAS,mBAAmB,QAAQ,MAA3B,EAAmC,WAAnC,EAAgD,YAAY,WAAZ,CAAwB,IAAxE,CAAf;;AAEA,QAAI,MAAJ,EAAY;AACV,aAAO;AACL,aAAQ,YAAY,GAAZ,GAAqB,OAAO,CAD/B;AAEL,cAAQ,YAAY,IAAZ,GAAqB,OAAO,CAF/B;AAGL,gBAAQ,YAAY,MAAZ,GAAqB,OAAO,CAH/B;AAIL,eAAQ,YAAY,KAAZ,GAAqB,OAAO;AAJ/B,OAAP;AAMD;;AAED,WAAO,WAAP;AACD,GA1BmB;;AA4BpB,OAAK,oBAAgE;AAAA,QAApD,UAAoD,SAApD,UAAoD;AAAA,QAAxC,WAAwC,SAAxC,WAAwC;AAAA,QAA3B,MAA2B,SAA3B,MAA2B;AAAA,QAAnB,MAAmB,SAAnB,MAAmB;AAAA,QAAX,OAAW,SAAX,OAAW;;AACnE,QAAM,QAAQ,YAAY,QAAZ,CAAqB,WAArB,IAAoC,YAAY,QAAZ,CAAqB,KAAvE;;AAEA,QAAI,CAAC,YAAY,WAAZ,EAAD,IAA8B,CAAC,KAAnC,EAA0C;AACxC;AACD;;AAED,QAAM,OAAO,OAAO,WAAP,GACT,EAAE,GAAG,OAAO,CAAZ,EAAe,GAAG,OAAO,CAAzB,EADS,GAET,MAAM,MAAN,CAAa,EAAb,EAAiB,UAAjB,CAFJ;AAGA,QAAM,QAAQ,UAAU,UAAV,CAAqB,mBAAmB,QAAQ,KAA3B,EAAkC,WAAlC,EAA+C,IAA/C,CAArB,KAA8E,OAA5F;AACA,QAAM,QAAQ,UAAU,UAAV,CAAqB,mBAAmB,QAAQ,KAA3B,EAAkC,WAAlC,EAA+C,IAA/C,CAArB,KAA8E,OAA5F;;AAEA,QAAI,YAAY,KAAK,CAArB;AACA,QAAI,YAAY,KAAK,CAArB;;AAEA,WAAO,EAAP,GAAY,CAAZ;AACA,WAAO,EAAP,GAAY,CAAZ;AACA,WAAO,MAAP,GAAgB,KAAhB;;AAEA,QAAI,MAAM,GAAV,EAAe;AACb,kBAAY,KAAK,GAAL,CAAS,KAAK,GAAL,CAAS,MAAM,GAAN,GAAe,OAAO,GAA/B,EAAuC,KAAK,CAA5C,CAAT,EAAyD,MAAM,GAAN,GAAe,OAAO,GAA/E,CAAZ;AACD,KAFD,MAGK,IAAI,MAAM,MAAV,EAAkB;AACrB,kBAAY,KAAK,GAAL,CAAS,KAAK,GAAL,CAAS,MAAM,MAAN,GAAe,OAAO,MAA/B,EAAuC,KAAK,CAA5C,CAAT,EAAyD,MAAM,MAAN,GAAe,OAAO,MAA/E,CAAZ;AACD;AACD,QAAI,MAAM,IAAV,EAAgB;AACd,kBAAY,KAAK,GAAL,CAAS,KAAK,GAAL,CAAS,MAAM,IAAN,GAAe,OAAO,IAA/B,EAAuC,KAAK,CAA5C,CAAT,EAAyD,MAAM,IAAN,GAAe,OAAO,IAA/E,CAAZ;AACD,KAFD,MAGK,IAAI,MAAM,KAAV,EAAiB;AACpB,kBAAY,KAAK,GAAL,CAAS,KAAK,GAAL,CAAS,MAAM,KAAN,GAAe,OAAO,KAA/B,EAAuC,KAAK,CAA5C,CAAT,EAAyD,MAAM,KAAN,GAAe,OAAO,KAA/E,CAAZ;AACD;;AAED,WAAO,EAAP,GAAY,YAAY,KAAK,CAA7B;AACA,WAAO,EAAP,GAAY,YAAY,KAAK,CAA7B;;AAEA,WAAO,OAAP,GAAiB,OAAO,SAAP,KAAqB,SAArB,IAAkC,OAAO,SAAP,KAAqB,SAAxE;AACA,WAAO,MAAP,GAAgB,CAAC,EAAE,OAAO,EAAP,IAAa,OAAO,EAAtB,CAAjB;;AAEA,WAAO,SAAP,GAAmB,SAAnB;AACA,WAAO,SAAP,GAAmB,SAAnB;AACD,GArEmB;;AAuEpB,gBAAc,6BAAoD;AAAA,QAAxC,IAAwC,SAAxC,IAAwC;AAAA,QAAlC,MAAkC,SAAlC,MAAkC;AAAA,QAA1B,MAA0B,SAA1B,MAA0B;AAAA,QAAlB,KAAkB,SAAlB,KAAkB;AAAA,QAAX,OAAW,SAAX,OAAW;;AAChE,QAAI,WAAW,QAAQ,OAAnB,IACG,EAAE,UAAU,OAAV,IAAqB,OAAO,MAA9B,CADP,EAC8C;;AAE5C,UAAI,OAAO,MAAX,EAAmB;AACjB,aAAK,CAAL,IAAU,OAAO,EAAjB;AACA,aAAK,CAAL,IAAU,OAAO,EAAjB;AACA,eAAO,CAAP,IAAY,OAAO,EAAnB;AACA,eAAO,CAAP,IAAY,OAAO,EAAnB;;AAEA,eAAO;AACL,cAAI,OAAO,EADN;AAEL,cAAI,OAAO;AAFN,SAAP;AAID;AACF;AACF,GAvFmB;;AAyFpB,kBAzFoB;AA0FpB,kBA1FoB;AA2FpB;AA3FoB,CAAtB;;AA8FA,UAAU,aAAV,GAA0B,aAA1B;AACA,UAAU,KAAV,CAAgB,IAAhB,CAAqB,eAArB;;AAEA,eAAe,SAAf,CAAyB,aAAzB,GAAyC,cAAc,QAAvD;AACA,OAAO,QAAP,CAAgB,aAAhB,GAAyC,cAAc,QAAvD;;AAEA,OAAO,OAAP,GAAiB,aAAjB;;;;;AC1HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,IAAM,YAAiB,QAAQ,SAAR,CAAvB;AACA,IAAM,gBAAiB,QAAQ,iBAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,UAAR,CAAvB;AACA,IAAM,YAAiB,QAAQ,eAAR,CAAvB;AACA,IAAM,iBAAiB,QAAQ,mBAAR,CAAvB;AACA,IAAM,SAAiB,QAAQ,mBAAR,CAAvB;;AAEA,IAAM,QAAQ,EAAE,OAAO,CAAC,QAAV,EAAoB,QAAQ,CAAC,QAA7B,EAAd;AACA,IAAM,QAAQ,EAAE,OAAO,CAAC,QAAV,EAAoB,QAAQ,CAAC,QAA7B,EAAd;;AAEA,IAAM,eAAe;AACnB,YAAU;AACR,aAAS,KADD;AAER,aAAS,KAFD;AAGR,SAAK,IAHG;AAIR,SAAK;AAJG,GADS;;AAQnB,aAAW,yBAA2B;AAAA,QAAf,WAAe,QAAf,WAAe;;AACpC,WAAO,YAAY,WAAnB;AACD,GAVkB;;AAYnB,OAAK,aAAU,GAAV,EAAe;AAAA,QACV,WADU,GACe,GADf,CACV,WADU;AAAA,QACG,OADH,GACe,GADf,CACG,OADH;;AAElB,QAAM,QAAQ,YAAY,QAAZ,CAAqB,WAArB,IAAoC,YAAY,QAAZ,CAAqB,KAAvE;;AAEA,QAAI,CAAC,YAAY,WAAZ,EAAD,IAA8B,CAAC,KAAnC,EAA0C;AACxC;AACD;;AAED,QAAM,OAAO,UAAU,UAAV,CAAqB,YAAY,WAAZ,CAAwB,QAA7C,CAAb;;AAEA,QAAM,UAAU,UAAU,UAAV,CAAqB,cAAc,kBAAd,CAAiC,QAAQ,GAAzC,EAA8C,WAA9C,CAArB,KAAoF,KAApG;AACA,QAAM,UAAU,UAAU,UAAV,CAAqB,cAAc,kBAAd,CAAiC,QAAQ,GAAzC,EAA8C,WAA9C,CAArB,KAAoF,KAApG;;AAEA,QAAI,OAAJ,GAAc;AACZ,eAAS,QAAQ,OADL;AAEZ,eAAS,QAAQ,OAFL;AAGZ,aAAO,MAAM,MAAN,CAAa,EAAb,EAAiB,cAAc,OAA/B,CAHK;AAIZ,aAAO,MAAM,MAAN,CAAa,EAAb,EAAiB,cAAc,OAA/B;AAJK,KAAd;;AAOA,QAAI,MAAM,GAAV,EAAe;AACb,UAAI,OAAJ,CAAY,KAAZ,CAAkB,GAAlB,GAAwB,KAAK,MAAL,GAAc,QAAQ,MAA9C;AACA,UAAI,OAAJ,CAAY,KAAZ,CAAkB,GAAlB,GAAwB,KAAK,MAAL,GAAc,QAAQ,MAA9C;AACD,KAHD,MAIK,IAAI,MAAM,MAAV,EAAkB;AACrB,UAAI,OAAJ,CAAY,KAAZ,CAAkB,MAAlB,GAA2B,KAAK,GAAL,GAAW,QAAQ,MAA9C;AACA,UAAI,OAAJ,CAAY,KAAZ,CAAkB,MAAlB,GAA2B,KAAK,GAAL,GAAW,QAAQ,MAA9C;AACD;AACD,QAAI,MAAM,IAAV,EAAgB;AACd,UAAI,OAAJ,CAAY,KAAZ,CAAkB,IAAlB,GAAyB,KAAK,KAAL,GAAa,QAAQ,KAA9C;AACA,UAAI,OAAJ,CAAY,KAAZ,CAAkB,IAAlB,GAAyB,KAAK,KAAL,GAAa,QAAQ,KAA9C;AACD,KAHD,MAIK,IAAI,MAAM,KAAV,EAAiB;AACpB,UAAI,OAAJ,CAAY,KAAZ,CAAkB,KAAlB,GAA0B,KAAK,IAAL,GAAY,QAAQ,KAA9C;AACA,UAAI,OAAJ,CAAY,KAAZ,CAAkB,KAAlB,GAA0B,KAAK,IAAL,GAAY,QAAQ,KAA9C;AACD;;AAED,kBAAc,GAAd,CAAkB,GAAlB;AACD,GAlDkB;;AAoDnB,gBAAc,cAAc;AApDT,CAArB;;AAuDA,UAAU,YAAV,GAAyB,YAAzB;AACA,UAAU,KAAV,CAAgB,IAAhB,CAAqB,cAArB;;AAEA,eAAe,SAAf,CAAyB,YAAzB,GAAwC,aAAa,QAArD;AACA,OAAO,QAAP,CAAgB,YAAhB,GAAwC,aAAa,QAArD;;AAEA,OAAO,OAAP,GAAiB,YAAjB;;;;;AClFA,IAAM,YAAiB,QAAQ,SAAR,CAAvB;AACA,IAAM,WAAiB,QAAQ,aAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,UAAR,CAAvB;AACA,IAAM,iBAAiB,QAAQ,mBAAR,CAAvB;;AAEA,IAAM,OAAO;AACX,YAAU;AACR,aAAS,KADD;AAER,aAAS,KAFD;AAGR,WAAS,QAHD;AAIR,aAAS,IAJD;AAKR,aAAS,IALD;;AAOR,oBAAgB;AAPR,GADC;;AAWX,aAAW,yBAA8E;AAAA,QAAlE,WAAkE,QAAlE,WAAkE;AAAA,QAArD,YAAqD,QAArD,YAAqD;AAAA,QAAvC,OAAuC,QAAvC,OAAuC;AAAA,QAA9B,IAA8B,QAA9B,IAA8B;AAAA,QAAxB,WAAwB,QAAxB,WAAwB;AAAA,QAAX,OAAW,QAAX,OAAW;;AACvF,QAAM,UAAU,EAAhB;AACA,QAAM,gBAAgB,MAAM,QAAN,CAAe,MAAM,eAAN,CAAsB,QAAQ,MAA9B,CAAf,CAAtB;AACA,QAAM,SAAS,iBAAiB,MAAM,WAAN,CAAkB,YAAlB,EAAgC,OAAhC,EAAyC,YAAY,QAAZ,CAAqB,IAA9D,CAAhC;AACA,cAAU,WAAW,aAAa,OAAb,CAAqB,YAAY,QAAZ,CAAqB,IAA1C,EAAgD,IAA3D,IAAmE,EAA7E;;AAEA,QAAI,mBAAJ;;AAEA,QAAI,QAAQ,MAAR,KAAmB,aAAvB,EAAsC;AACpC,mBAAa;AACX,WAAG,YAAY,WAAZ,CAAwB,IAAxB,CAA6B,CAA7B,GAAiC,OAAO,CADhC;AAEX,WAAG,YAAY,WAAZ,CAAwB,IAAxB,CAA6B,CAA7B,GAAiC,OAAO;AAFhC,OAAb;AAID,KALD,MAMM;AACJ,UAAM,aAAa,MAAM,eAAN,CAAsB,QAAQ,MAA9B,EAAsC,YAAtC,EAAoD,OAApD,EAA6D,CAAC,WAAD,CAA7D,CAAnB;;AAEA,mBAAa,MAAM,QAAN,CAAe,UAAf,KAA8B,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EAA3C;AACD;;AAED,QAAI,QAAQ,QAAQ,cAAhB,IAAkC,QAAQ,cAAR,CAAuB,MAA7D,EAAqE;AACnE,2BAA6C,QAAQ,cAArD,kHAAqE;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,YAArD,SAAqD,SAAxD,CAAwD;AAAA,YAAvC,SAAuC,SAA1C,CAA0C;;AACnE,gBAAQ,IAAR,CAAa;AACX,aAAG,YAAY,IAAZ,GAAoB,KAAK,KAAL,GAAc,SAAlC,GAA+C,WAAW,CADlD;AAEX,aAAG,YAAY,GAAZ,GAAoB,KAAK,MAAL,GAAc,SAAlC,GAA+C,WAAW;AAFlD,SAAb;AAID;AACF,KAPD,MAQK;AACH,cAAQ,IAAR,CAAa,UAAb;AACD;;AAED,WAAO,OAAP;AACD,GA5CU;;AA8CX,OAAK,oBAAyE;AAAA,QAA7D,WAA6D,SAA7D,WAA6D;AAAA,QAAhD,UAAgD,SAAhD,UAAgD;AAAA,QAApC,MAAoC,SAApC,MAAoC;AAAA,QAA5B,OAA4B,SAA5B,OAA4B;AAAA,QAAX,OAAW,SAAnB,MAAmB;;AAC5E,QAAM,UAAU,EAAhB;AACA,QAAI,eAAJ;AACA,QAAI,aAAJ;AACA,QAAI,UAAJ;;AAEA,QAAI,OAAO,WAAX,EAAwB;AACtB,aAAO,EAAE,GAAG,OAAO,CAAZ,EAAe,GAAG,OAAO,CAAzB,EAAP;AACD,KAFD,MAGK;AACH,UAAM,SAAS,MAAM,WAAN,CAAkB,YAAY,MAA9B,EAAsC,YAAY,OAAlD,EAA2D,YAAY,QAAZ,CAAqB,IAAhF,CAAf;;AAEA,aAAO,MAAM,MAAN,CAAa,EAAb,EAAiB,UAAjB,CAAP;;AAEA,WAAK,CAAL,IAAU,OAAO,CAAjB;AACA,WAAK,CAAL,IAAU,OAAO,CAAjB;AACD;;AAED,WAAO,KAAP,GAAe,KAAK,CAApB;AACA,WAAO,KAAP,GAAe,KAAK,CAApB;;AAEA,QAAI,MAAM,QAAQ,OAAR,GAAiB,QAAQ,OAAR,CAAgB,MAAjC,GAA0C,CAApD;;AAEA,0BAAyC,OAAzC,yHAAkD;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,UAAlC,OAAkC,SAArC,CAAqC;AAAA,UAAtB,OAAsB,SAAzB,CAAyB;;AAChD,UAAM,YAAY,KAAK,CAAL,GAAS,OAA3B;AACA,UAAM,YAAY,KAAK,CAAL,GAAS,OAA3B;;AAEA,4BAAyB,QAAQ,OAAjC,yHAA0C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,YAA/B,UAA+B;;AACxC,YAAI,MAAM,EAAN,CAAS,QAAT,CAAkB,UAAlB,CAAJ,EAAmC;AACjC,mBAAS,WAAW,SAAX,EAAsB,SAAtB,EAAiC,WAAjC,CAAT;AACD,SAFD,MAGK;AACH,mBAAS,UAAT;AACD;;AAED,YAAI,CAAC,MAAL,EAAa;AAAE;AAAW;;AAE1B,gBAAQ,IAAR,CAAa;AACX,aAAG,MAAM,EAAN,CAAS,MAAT,CAAgB,OAAO,CAAvB,IAA6B,OAAO,CAAP,GAAW,OAAxC,GAAmD,SAD3C;AAEX,aAAG,MAAM,EAAN,CAAS,MAAT,CAAgB,OAAO,CAAvB,IAA6B,OAAO,CAAP,GAAW,OAAxC,GAAmD,SAF3C;;AAIX,iBAAO,MAAM,EAAN,CAAS,MAAT,CAAgB,OAAO,KAAvB,IAA+B,OAAO,KAAtC,GAA6C,QAAQ;AAJjD,SAAb;AAMD;AACF;;AAED,QAAM,UAAU;AACd,cAAQ,IADM;AAEd,eAAS,KAFK;AAGd,gBAAU,CAHI;AAId,aAAO,CAJO;AAKd,UAAI,CALU;AAMd,UAAI;AANU,KAAhB;;AASA,SAAK,IAAI,CAAJ,EAAO,MAAM,QAAQ,MAA1B,EAAkC,IAAI,GAAtC,EAA2C,GAA3C,EAAgD;AAC9C,eAAS,QAAQ,CAAR,CAAT;;AAEA,UAAM,QAAQ,OAAO,KAArB;AACA,UAAM,KAAK,OAAO,CAAP,GAAW,KAAK,CAA3B;AACA,UAAM,KAAK,OAAO,CAAP,GAAW,KAAK,CAA3B;AACA,UAAM,WAAW,MAAM,KAAN,CAAY,EAAZ,EAAgB,EAAhB,CAAjB;AACA,UAAI,UAAU,YAAY,KAA1B;;AAEA;AACA;AACA,UAAI,UAAU,QAAV,IAAsB,QAAQ,OAA9B,IAAyC,QAAQ,KAAR,KAAkB,QAA/D,EAAyE;AACvE,kBAAU,KAAV;AACD;;AAED,UAAI,CAAC,QAAQ,MAAT,KAAoB;AACpB;AADoB,QAEjB,QAAQ,OAAR,IAAmB,UAAU;AAChC;AADG,QAED,WAAW,KAAX,GAAmB,QAAQ,QAAR,GAAmB,QAAQ;AAChD;AAHG,QAIA,UAAU,QAAV,IAAsB,QAAQ,KAAR,KAAkB,QAAzC;AACF;AACC,iBAAW,QAAQ,QARA;AASpB;AACG,OAAC,QAAQ,OAAT,IAAoB,WAAW,QAAQ,QAV1C,CAAJ,EAU0D;;AAExD,gBAAQ,MAAR,GAAiB,MAAjB;AACA,gBAAQ,QAAR,GAAmB,QAAnB;AACA,gBAAQ,KAAR,GAAgB,KAAhB;AACA,gBAAQ,OAAR,GAAkB,OAAlB;AACA,gBAAQ,EAAR,GAAa,EAAb;AACA,gBAAQ,EAAR,GAAa,EAAb;;AAEA,eAAO,KAAP,GAAe,KAAf;AACD;AACF;;AAED,QAAI,oBAAJ;;AAEA,QAAI,QAAQ,MAAZ,EAAoB;AAClB,oBAAe,OAAO,SAAP,KAAqB,QAAQ,MAAR,CAAe,CAApC,IAAyC,OAAO,SAAP,KAAqB,QAAQ,MAAR,CAAe,CAA5F;;AAEA,aAAO,SAAP,GAAmB,QAAQ,MAAR,CAAe,CAAlC;AACA,aAAO,SAAP,GAAmB,QAAQ,MAAR,CAAe,CAAlC;AACD,KALD,MAMK;AACH,oBAAc,IAAd;;AAEA,aAAO,SAAP,GAAmB,GAAnB;AACA,aAAO,SAAP,GAAmB,GAAnB;AACD;;AAED,WAAO,EAAP,GAAY,QAAQ,EAApB;AACA,WAAO,EAAP,GAAY,QAAQ,EAApB;;AAEA,WAAO,OAAP,GAAkB,eAAgB,QAAQ,OAAR,IAAmB,CAAC,OAAO,MAA7D;AACA,WAAO,MAAP,GAAgB,QAAQ,OAAxB;AACD,GA/JU;;AAiKX,gBAAc,6BAAoD;AAAA,QAAxC,IAAwC,SAAxC,IAAwC;AAAA,QAAlC,MAAkC,SAAlC,MAAkC;AAAA,QAA1B,MAA0B,SAA1B,MAA0B;AAAA,QAAlB,KAAkB,SAAlB,KAAkB;AAAA,QAAX,OAAW,SAAX,OAAW;;AAChE,QAAM,iBAAiB,WAAW,QAAQ,cAA1C;;AAEA,QAAI,WAAW,QAAQ,OAAnB,IACG,EAAE,UAAU,OAAV,IAAqB,cAArB,IAAuC,eAAe,MAAxD,CADP,EACwE;;AAEtE,UAAI,OAAO,MAAX,EAAmB;AACjB,aAAK,CAAL,IAAU,OAAO,EAAjB;AACA,aAAK,CAAL,IAAU,OAAO,EAAjB;AACA,eAAO,CAAP,IAAY,OAAO,EAAnB;AACA,eAAO,CAAP,IAAY,OAAO,EAAnB;AACD;;AAED,aAAO;AACL,eAAS,OAAO,KADX;AAEL,gBAAS,OAAO,MAFX;AAGL,WAAS,OAAO,SAHX;AAIL,WAAS,OAAO,SAJX;AAKL,eAAS,OAAO,KALX;AAML,eAAS,OAAO,KANX;AAOL,YAAS,OAAO,EAPX;AAQL,YAAS,OAAO;AARX,OAAP;AAUD;AACF;AAzLU,CAAb;;AA4LA,SAAS,cAAT,GAA0B,UAAU,IAAV,EAAgB;AACxC,SAAO,UAAU,CAAV,EAAa,CAAb,EAAgB;AACrB,QAAM,SAAS,KAAK,MAAL,IAAe;AAC5B,YAAQ,CAAC,QADmB;AAE5B,aAAS,QAFmB;AAG5B,WAAQ,CAAC,QAHmB;AAI5B,cAAS;AAJmB,KAA9B;AAMA,QAAI,UAAU,CAAd;AACA,QAAI,UAAU,CAAd;;AAEA,QAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,KAAK,MAArB,CAAJ,EAAkC;AAChC,gBAAU,KAAK,MAAL,CAAY,CAAtB;AACA,gBAAU,KAAK,MAAL,CAAY,CAAtB;AACD;;AAED,QAAM,QAAQ,KAAK,KAAL,CAAW,CAAC,IAAI,OAAL,IAAgB,KAAK,CAAhC,CAAd;AACA,QAAM,QAAQ,KAAK,KAAL,CAAW,CAAC,IAAI,OAAL,IAAgB,KAAK,CAAhC,CAAd;;AAEA,QAAM,OAAO,KAAK,GAAL,CAAS,OAAO,IAAhB,EAAsB,KAAK,GAAL,CAAS,OAAO,KAAhB,EAAwB,QAAQ,KAAK,CAAb,GAAiB,OAAzC,CAAtB,CAAb;AACA,QAAM,OAAO,KAAK,GAAL,CAAS,OAAO,GAAhB,EAAsB,KAAK,GAAL,CAAS,OAAO,MAAhB,EAAwB,QAAQ,KAAK,CAAb,GAAiB,OAAzC,CAAtB,CAAb;;AAEA,WAAO;AACL,SAAG,IADE;AAEL,SAAG,IAFE;AAGL,aAAO,KAAK;AAHP,KAAP;AAKD,GA1BD;AA2BD,CA5BD;;AA8BA,UAAU,IAAV,GAAiB,IAAjB;AACA,UAAU,KAAV,CAAgB,IAAhB,CAAqB,MAArB;;AAEA,eAAe,SAAf,CAAyB,IAAzB,GAAgC,KAAK,QAArC;;AAEA,OAAO,OAAP,GAAiB,IAAjB;;;;;ACpOA;AACA;;AAEA,IAAM,YAAiB,QAAQ,SAAR,CAAvB;AACA,IAAM,OAAiB,QAAQ,QAAR,CAAvB;AACA,IAAM,iBAAiB,QAAQ,mBAAR,CAAvB;AACA,IAAM,SAAiB,QAAQ,mBAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,WAAR,CAAvB;;AAEA,IAAM,WAAW;AACf,YAAU;AACR,aAAS,KADD;AAER,aAAS,KAFD;AAGR,WAAS,QAHD;AAIR,aAAS,IAJD;AAKR,aAAS;AALD,GADK;;AASf,aAAW,mBAAU,GAAV,EAAe;AAAA,QAChB,WADgB,GACS,GADT,CAChB,WADgB;AAAA,QACH,OADG,GACS,GADT,CACH,OADG;;AAExB,QAAM,QAAQ,YAAY,QAAZ,CAAqB,KAAnC;;AAEA,QAAI,CAAC,KAAL,EAAY;AAAE;AAAS;;AAEvB,QAAI,OAAJ,GAAc;AACZ,sBAAgB,CAAC;AACf,WAAG,MAAM,IAAN,GAAY,CAAZ,GAAgB,CADJ;AAEf,WAAG,MAAM,GAAN,GAAY,CAAZ,GAAgB;AAFJ,OAAD,CADJ;AAKZ,cAAQ,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EALI;AAMZ,cAAQ,MANI;AAOZ,aAAO,QAAQ;AAPH,KAAd;;AAUA,QAAM,UAAU,KAAK,SAAL,CAAe,GAAf,CAAhB;AACA,QAAI,OAAJ,GAAc,OAAd;;AAEA,WAAO,OAAP;AACD,GA7Bc;;AA+Bf,OAAK,aAAU,GAAV,EAAe;AAAA,QACV,WADU,GACmC,GADnC,CACV,WADU;AAAA,QACG,OADH,GACmC,GADnC,CACG,OADH;AAAA,QACY,MADZ,GACmC,GADnC,CACY,MADZ;AAAA,QACoB,UADpB,GACmC,GADnC,CACoB,UADpB;;AAElB,QAAM,OAAO,MAAM,MAAN,CAAa,EAAb,EAAiB,UAAjB,CAAb;AACA,QAAM,YAAY,KAAK,CAAL,GAAS,OAAO,CAAP,EAAU,CAArC;AACA,QAAM,YAAY,KAAK,CAAL,GAAS,OAAO,CAAP,EAAU,CAArC;;AAEA,QAAI,OAAJ,GAAc,MAAM,MAAN,CAAa,EAAb,EAAiB,OAAjB,CAAd;AACA,QAAI,OAAJ,CAAY,OAAZ,GAAsB,EAAtB;;AAEA,yBAAyB,QAAQ,OAAjC,kHAA0C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAA/B,UAA+B;;AACxC,UAAI,eAAJ;;AAEA,UAAI,MAAM,EAAN,CAAS,QAAT,CAAkB,UAAlB,CAAJ,EAAmC;AACjC,iBAAS,WAAW,SAAX,EAAsB,SAAtB,EAAiC,WAAjC,CAAT;AACD,OAFD,MAGK;AACH,iBAAS,UAAT;AACD;;AAED,UAAI,CAAC,MAAL,EAAa;AAAE;AAAW;;AAE1B,UAAI,WAAW,MAAX,IAAqB,YAAY,MAArC,EAA6C;AAC3C,eAAO,CAAP,GAAW,OAAO,KAAlB;AACA,eAAO,CAAP,GAAW,OAAO,MAAlB;AACD;;AAED,UAAI,OAAJ,CAAY,OAAZ,CAAoB,IAApB,CAAyB,MAAzB;AACD;;AAED,SAAK,GAAL,CAAS,GAAT;AACD,GA7Dc;;AA+Df,gBAAc,sBAAU,GAAV,EAAe;AAAA,QACnB,OADmB,GACP,GADO,CACnB,OADmB;;;AAG3B,QAAI,OAAJ,GAAc,MAAM,MAAN,CAAa,EAAb,EAAiB,OAAjB,CAAd;AACA,QAAI,OAAJ,CAAY,OAAZ,GAAsB,QAAQ,OAA9B;AACA,QAAI,OAAJ,CAAY,cAAZ,GAA6B,CAAC,IAAD,CAA7B;;AAEA,SAAK,YAAL,CAAkB,GAAlB;AACD;AAvEc,CAAjB;;AA0EA,UAAU,QAAV,GAAqB,QAArB;AACA,UAAU,KAAV,CAAgB,IAAhB,CAAqB,UAArB;;AAEA,eAAe,SAAf,CAAyB,QAAzB,GAAoC,SAAS,QAA7C;AACA,OAAO,QAAP,CAAgB,QAAhB,GAAoC,SAAS,QAA7C;;AAEA,OAAO,OAAP,GAAiB,QAAjB;;;;;;;ACzFA,IAAM,eAAe,QAAQ,uBAAR,CAArB;;AAEA,OAAO,OAAP;AACE,wBAAa,IAAb,EAAmB,OAAnB,EAA4B,KAA5B,EAAmC,WAAnC,EAAgD,WAAhD,EAA6D;AAAA;;AAC3D,iBAAa,aAAb,CAA2B,IAA3B,EAAiC,KAAjC;;AAEA,QAAI,UAAU,OAAd,EAAuB;AACrB,mBAAa,aAAb,CAA2B,IAA3B,EAAiC,OAAjC;AACD;;AAED,SAAK,WAAL,GAAmB,WAAnB;;AAEA,SAAK,SAAL,GAAqB,IAAI,IAAJ,GAAW,OAAX,EAArB;AACA,SAAK,aAAL,GAAqB,KAArB;AACA,SAAK,IAAL,GAAqB,IAArB;AACA,SAAK,SAAL,GAAqB,aAAa,YAAb,CAA0B,OAA1B,CAArB;AACA,SAAK,WAAL,GAAqB,aAAa,cAAb,CAA4B,OAA5B,CAArB;AACA,SAAK,MAAL,GAAqB,WAArB;AACA,SAAK,aAAL,GAAqB,IAArB;;AAEA,QAAI,SAAS,KAAb,EAAoB;AAClB,UAAM,eAAe,YAAY,eAAZ,CAA4B,OAA5B,CAArB;AACA,WAAK,EAAL,GAAU,KAAK,SAAL,GAAiB,YAAY,SAAZ,CAAsB,YAAtB,CAA3B;;AAEA,UAAM,WAAW,KAAK,SAAL,GAAiB,YAAY,OAA9C;;AAEA,WAAK,MAAL,GAAc,CAAC,EAAE,YAAY,OAAZ,IACZ,YAAY,OAAZ,CAAoB,IAApB,KAA6B,WADjB,IAEZ,YAAY,OAAZ,CAAoB,MAApB,KAA+B,KAAK,MAFxB,IAGZ,WAAW,GAHD,CAAf;AAID,KAVD,MAWK,IAAI,SAAS,WAAb,EAA0B;AAC7B,WAAK,EAAL,GAAU,QAAQ,SAAR,GAAoB,YAAY,OAA1C;AACD;AACF;;AAhCH,yBAkCE,cAlCF,iCAkC8C;AAAA,QAAvB,OAAuB,QAA1B,CAA0B;AAAA,QAAX,OAAW,QAAd,CAAc;;AAC1C,SAAK,KAAL,IAAgB,OAAhB;AACA,SAAK,KAAL,IAAgB,OAAhB;AACA,SAAK,OAAL,IAAgB,OAAhB;AACA,SAAK,OAAL,IAAgB,OAAhB;;AAEA,WAAO,IAAP;AACD,GAzCH;;AAAA,yBA2CE,SA3CF,6BA2CyC;AAAA,QAAvB,OAAuB,SAA1B,CAA0B;AAAA,QAAX,OAAW,SAAd,CAAc;;AACrC,SAAK,KAAL,IAAgB,OAAhB;AACA,SAAK,KAAL,IAAgB,OAAhB;AACA,SAAK,OAAL,IAAgB,OAAhB;AACA,SAAK,OAAL,IAAgB,OAAhB;;AAEA,WAAO,IAAP;AACD,GAlDH;;AAAA,yBAoDE,cApDF,6BAoDoB;AAChB,SAAK,aAAL,CAAmB,cAAnB;AACD,GAtDH;;AAAA,yBAwDE,eAxDF,8BAwDqB;AACjB,SAAK,kBAAL,GAA0B,IAA1B;AACD,GA1DH;;AAAA,yBA4DE,wBA5DF,uCA4D8B;AAC1B,SAAK,2BAAL,GAAmC,KAAK,kBAAL,GAA0B,IAA7D;AACD,GA9DH;;AAAA;AAAA;;;;;ACFA,IAAM,eAAe,QAAQ,gBAAR,CAArB;AACA,IAAM,cAAe,QAAQ,gBAAR,CAArB;AACA,IAAM,QAAe,QAAQ,UAAR,CAArB;AACA,IAAM,UAAe,QAAQ,kBAAR,CAArB;AACA,IAAM,WAAe,QAAQ,mBAAR,CAArB;AACA,IAAM,UAAe,QAAQ,kBAAR,EAA4B,GAA5B,EAArB;;eACqB,QAAQ,cAAR,C;IAAb,M,YAAA,M;;AAER,IAAM,gBAAgB,CAAE,MAAF,EAAU,IAAV,EAAgB,QAAhB,CAAtB;AACA,IAAM,eAAgB,CAAE,MAAF,EAAU,IAAV,EAAgB,QAAhB,CAAtB;;AAEA,IAAM,gBAAgB;AACpB,4BADoB;AAEpB,YAFoB;AAGpB,0CAHoB;AAIpB,kBAJoB;AAKpB,YAAU;AACR,kBAAc,GADN;AAER,gBAAc,IAFN;AAGR,eAAc,IAHN;AAIR,YAAc,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX;AAJN,GALU;AAWpB,SAAO,CACL,MADK,EAEL,MAFK,EAGL,IAHK,EAIL,QAJK,EAKL,KALK,EAML,WANK,EAOL,MAPK;AAXa,CAAtB;;AAsBA,SAAS,IAAT,CAAe,GAAf,EAAoB;AAAA,MAEhB,WAFgB,GAMd,GANc,CAEhB,WAFgB;AAAA,MAEH,OAFG,GAMd,GANc,CAEH,OAFG;AAAA,MAEM,KAFN,GAMd,GANc,CAEM,KAFN;AAAA,MAEa,WAFb,GAMd,GANc,CAEa,WAFb;AAAA,kBAMd,GANc,CAGhB,IAHgB;AAAA,MAGhB,IAHgB,6BAGT,IAAI,YAAJ,CAAiB,IAHR;AAAA,qBAMd,GANc,CAIhB,OAJgB;AAAA,MAIhB,OAJgB,gCAIN,oBAAoB,GAApB,CAJM;AAAA,0BAMd,GANc,CAKhB,YALgB;AAAA,MAKhB,YALgB,qCAKD,IAAI,YAAJ,CAAiB,IAAjB,EAAuB,OAAvB,EAAgC,KAAhC,EAAuC,WAAvC,EAAoD,WAApD,CALC;;;AAQlB,MAAM,YAAY;AAChB,4BADgB;AAEhB,oBAFgB;AAGhB,gBAHgB;AAIhB,4BAJgB;AAKhB,oBALgB;AAMhB,cANgB;AAOhB;AAPgB,GAAlB;;AAUA,OAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,QAAQ,MAA5B,EAAoC,GAApC,EAAyC;AACvC,QAAM,SAAS,QAAQ,CAAR,CAAf;;AAEA,SAAK,IAAM,IAAX,IAAmB,OAAO,KAAP,IAAgB,EAAnC,EAAuC;AACrC,mBAAa,IAAb,IAAqB,OAAO,KAAP,CAAa,IAAb,CAArB;AACD;;AAED,QAAM,SAAS,MAAM,WAAN,CAAkB,OAAO,SAAzB,EAAoC,OAAO,OAA3C,CAAf;;AAEA,iBAAa,cAAb,CAA4B,MAA5B;AACA,iBAAa,SAAb,GAAyB,OAAO,SAAhC;AACA,iBAAa,aAAb,GAA6B,OAAO,OAApC;;AAEA,WAAO,SAAP,CAAiB,IAAjB,CAAsB,YAAtB;;AAEA,iBAAa,SAAb,CAAuB,MAAvB;;AAEA,QAAI,aAAa,2BAAb,IACI,aAAa,kBAAb,IACI,IAAI,CAAL,GAAU,QAAQ,MADrB,IAC+B,QAAQ,IAAI,CAAZ,EAAe,OAAf,KAA2B,aAAa,aAF/E,EAE+F;AAC7F;AACD;AACF;;AAED,UAAQ,IAAR,CAAa,OAAb,EAAsB,SAAtB;;AAEA,MAAI,SAAS,KAAb,EAAoB;AAClB;AACA;AACA,QAAM,UAAU,aAAa,MAAb,GACZ,KAAK;AACL,8BADK,EACQ,gBADR,EACiB,YADjB,EACwB,wBADxB;AAEL,YAAM;AAFD,KAAL,CADY,GAKZ,YALJ;;AAOA,gBAAY,OAAZ,GAAsB,OAAtB;AACA,gBAAY,OAAZ,GAAsB,QAAQ,SAA9B;AACD;;AAED,SAAO,YAAP;AACD;;AAED,SAAS,mBAAT,OAAkF;AAAA,MAAlD,WAAkD,QAAlD,WAAkD;AAAA,MAArC,OAAqC,QAArC,OAAqC;AAAA,MAA5B,KAA4B,QAA5B,KAA4B;AAAA,MAArB,WAAqB,QAArB,WAAqB;AAAA,MAAR,IAAQ,QAAR,IAAQ;;AAChF,MAAM,eAAe,YAAY,eAAZ,CAA4B,OAA5B,CAArB;;AAEA;AACA,MAAI,SAAS,KAAT,KAAmB,YAAY;AAC/B;AADmB,KAEhB,EAAE,YAAY,WAAZ,CAAwB,YAAxB,KAAyC,YAAY,WAAZ,CAAwB,YAAxB,MAA0C,WAArF,CAFH,CAAJ,EAE2G;AACzG,WAAO,EAAP;AACD;;AAED,MAAM,OAAO,MAAM,OAAN,CAAc,WAAd,CAAb;AACA,MAAM,YAAY;AAChB,4BADgB;AAEhB,oBAFgB;AAGhB,gBAHgB;AAIhB,4BAJgB;AAKhB,cALgB;AAMhB,cANgB;AAOhB,aAAS,EAPO;AAQhB,aAAS;AARO,GAAlB;;AAWA,uBAAsB,IAAtB,kHAA4B;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,QAAjB,OAAiB;;AAC1B,cAAU,OAAV,GAAoB,OAApB;;AAEA,YAAQ,IAAR,CAAa,iBAAb,EAAgC,SAAhC;AACD;;AAED,MAAI,SAAS,MAAb,EAAqB;AACnB,cAAU,OAAV,GAAoB,OAAO,UAAU,OAAjB,EAA0B;AAAA,aAC5C,OAAO,SAAP,CAAiB,OAAjB,CAAyB,YAAzB,KAA0C,YAAY,UAAZ,CAAuB,YAAvB,EAAqC,QADnC;AAAA,KAA1B,CAApB;AAED;;AAED,SAAO,UAAU,OAAjB;AACD;;AAED,YAAY,OAAZ,CAAoB,EAApB,CAAuB,qBAAvB,EAA8C,iBAAyC;AAAA,MAA7B,WAA6B,SAA7B,WAA6B;AAAA,MAAhB,YAAgB,SAAhB,YAAgB;;AACrF,cAAY,UAAZ,CAAuB,YAAvB,IAAuC,EAAE,UAAU,QAAZ,EAAsB,SAAS,IAA/B,EAAvC;AACD,CAFD;;AAIA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,gBAAvB,EAAyC,iBAAyC;AAAA,MAA7B,WAA6B,SAA7B,WAA6B;AAAA,MAAhB,YAAgB,SAAhB,YAAgB;;AAChF,cAAY,UAAZ,CAAuB,MAAvB,CAA8B,YAA9B,EAA4C,CAA5C;AACD,CAFD;;AAIA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,MAAvB,EAA+B,iBAAuE;AAAA,MAA3D,WAA2D,SAA3D,WAA2D;AAAA,MAA9C,OAA8C,SAA9C,OAA8C;AAAA,MAArC,KAAqC,SAArC,KAAqC;AAAA,MAA9B,WAA8B,SAA9B,WAA8B;AAAA,MAAjB,aAAiB,SAAjB,aAAiB;;AACpG,MAAM,eAAe,YAAY,eAAZ,CAA4B,OAA5B,CAArB;;AAEA,MAAI,CAAC,aAAD,KAAmB,CAAC,YAAY,aAAb,IAA8B,YAAY,eAA7D,CAAJ,EAAmF;AACjF,QAAI,YAAY,aAAhB,EAA+B;AAC7B,mBAAa,YAAY,UAAZ,CAAuB,YAAvB,EAAqC,OAAlD;AACD;;AAED,SAAK;AACH,8BADG,EACU,gBADV,EACmB,YADnB,EAC0B,wBAD1B;AAEH,YAAM;AAFH,KAAL;AAID;AACF,CAbD;;AAeA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,MAAvB,EAA+B,iBAAsE;AAAA,MAA1D,WAA0D,SAA1D,WAA0D;AAAA,MAA7C,OAA6C,SAA7C,OAA6C;AAAA,MAApC,KAAoC,SAApC,KAAoC;AAAA,MAA7B,WAA6B,SAA7B,WAA6B;AAAA,MAAhB,YAAgB,SAAhB,YAAgB;;AACnG;AACA,MAAM,YAAY,QAAQ,KAAR,GAAe,MAAM,MAAN,CAAa,EAAb,EAAiB,KAAjB,CAAf,GAAyC,KAA3D;;AAEA,MAAM,QAAQ,YAAY,UAAZ,CAAuB,YAAvB,CAAd;AACA,MAAM,OAAO,MAAM,OAAN,CAAc,WAAd,CAAb;AACA,MAAM,YAAY;AAChB,4BADgB;AAEhB,oBAFgB;AAGhB,gBAHgB;AAIhB,4BAJgB;AAKhB,UAAM,MALU;AAMhB,aAAS,EANO;AAOhB,cAPgB;AAQhB,aAAS;AARO,GAAlB;;AAWA,wBAAsB,IAAtB,yHAA4B;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,QAAjB,OAAiB;;AAC1B,cAAU,OAAV,GAAoB,OAApB;;AAEA,YAAQ,IAAR,CAAa,iBAAb,EAAgC,SAAhC;AACD;;AAED,MAAI,CAAC,UAAU,OAAV,CAAkB,MAAvB,EAA+B;AAAE;AAAS;;AAE1C,MAAI,cAAc,QAAlB;;AAEA,OAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,UAAU,OAAV,CAAkB,MAAtC,EAA8C,GAA9C,EAAmD;AACjD,QAAM,SAAS,UAAU,OAAV,CAAkB,CAAlB,CAAf;AACA,QAAM,eAAe,OAAO,SAAP,CAAiB,OAAjB,CAAyB,YAA9C;;AAEA,QAAI,eAAe,WAAnB,EAAgC;AAC9B,oBAAc,YAAd;AACD;AACF;;AAED,QAAM,QAAN,GAAiB,WAAjB;AACA,QAAM,OAAN,GAAgB,WAAW,YAAY;AACrC,SAAK;AACH,8BADG;AAEH,8BAFG;AAGH,eAAS,QAAQ,KAAR,GAAe,SAAf,GAA2B,OAHjC;AAIH,aAAO,SAJJ;AAKH,YAAM;AALH,KAAL;AAOD,GARe,EAQb,WARa,CAAhB;AASD,CA9CD;;AAgDA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,IAAvB,EAA6B,iBAAkD;AAAA,MAA/C,WAA+C,SAA/C,WAA+C;AAAA,MAAlC,OAAkC,SAAlC,OAAkC;AAAA,MAAzB,KAAyB,SAAzB,KAAyB;AAAA,MAAlB,WAAkB,SAAlB,WAAkB;;AAC7E,MAAI,CAAC,YAAY,eAAjB,EAAkC;AAChC,SAAK,EAAE,wBAAF,EAAe,wBAAf,EAA4B,gBAA5B,EAAqC,YAArC,EAA4C,MAAM,KAAlD,EAAL;AACD;AACF,CAJD;;AAMA,CAAC,IAAD,EAAO,QAAP,EAAiB,OAAjB,CAAyB,UAAU,UAAV,EAAsB;AAC7C,cAAY,OAAZ,CAAoB,EAApB,CAAuB,UAAvB,EAAmC,iBAAyC;AAAA,QAA7B,WAA6B,SAA7B,WAA6B;AAAA,QAAhB,YAAgB,SAAhB,YAAgB;;AAC1E,QAAI,YAAY,UAAZ,CAAuB,YAAvB,CAAJ,EAA0C;AACxC,mBAAa,YAAY,UAAZ,CAAuB,YAAvB,EAAqC,OAAlD;AACD;AACF,GAJD;AAKD,CAND;;AAQA,SAAS,oBAAT,CAA+B,IAA/B,EAAqC;AACnC,SAAO,kBAAwD;AAAA,QAA5C,WAA4C,UAA5C,WAA4C;AAAA,QAA/B,OAA+B,UAA/B,OAA+B;AAAA,QAAtB,KAAsB,UAAtB,KAAsB;AAAA,QAAf,WAAe,UAAf,WAAe;;AAC7D,SAAK,EAAE,wBAAF,EAAe,wBAAf,EAA4B,gBAA5B,EAAqC,YAArC,EAA4C,UAA5C,EAAL;AACD,GAFD;AAGD;;AAED,KAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,cAAc,MAAlC,EAA0C,GAA1C,EAA+C;AAC7C,cAAY,OAAZ,CAAoB,EAApB,CAAuB,cAAc,CAAd,CAAvB,EAAyC,qBAAqB,aAAa,CAAb,CAArB,CAAzC;AACD;;AAED,YAAY,OAAZ,CAAoB,EAApB,CAAuB,KAAvB,EAA8B,UAAU,WAAV,EAAuB;AACnD,cAAY,OAAZ,GAAyB,IAAzB,CADmD,CACnB;AAChC,cAAY,OAAZ,GAAyB,CAAzB,CAFmD,CAEnB;AAChC,cAAY,UAAZ,GAAyB,EAAzB,CAHmD,CAGnB;AACjC,CAJD;;AAMA,SAAS,aAAT,GAAyB,cAAc,QAAvC;AACA,OAAO,OAAP,GAAiB,aAAjB;;;;;ACxOA,IAAM,gBAAgB,QAAQ,QAAR,CAAtB;AACA,IAAM,cAAgB,QAAQ,gBAAR,CAAtB;;AAEA,cAAc,OAAd,CAAsB,EAAtB,CAAyB,KAAzB,EAAgC,KAAhC;AACA,cAAc,OAAd,CAAsB,EAAtB,CAAyB,OAAzB,EAAkC,OAAlC;;WAEqB,CAAC,MAAD,EAAS,IAAT,EAAe,QAAf,EAAyB,QAAzB,C;AAArB,yCAAyD;AAApD,MAAM,iBAAN;AACH,cAAY,OAAZ,CAAoB,EAApB,CAAuB,MAAvB,EAA+B,aAA/B;AACD;;AAED,SAAS,KAAT,OAAkC;AAAA,MAAhB,YAAgB,QAAhB,YAAgB;;AAChC,MAAI,aAAa,IAAb,KAAsB,MAA1B,EAAkC;AAAE;AAAS;;AAE7C,eAAa,KAAb,GAAqB,CAAC,aAAa,KAAb,IAAsB,CAAvB,IAA4B,CAAjD;AACD;;AAED,SAAS,OAAT,QAAuE;AAAA,MAAnD,WAAmD,SAAnD,WAAmD;AAAA,MAAtC,YAAsC,SAAtC,YAAsC;AAAA,MAAxB,WAAwB,SAAxB,WAAwB;AAAA,MAAX,OAAW,SAAX,OAAW;;AACrE,MAAI,aAAa,IAAb,KAAsB,MAAtB,IAAgC,CAAC,QAAQ,MAA7C,EAAqD;AAAE;AAAS;;AAEhE;AACA,MAAM,WAAW,QAAQ,CAAR,EAAW,SAAX,CAAqB,OAArB,CAA6B,kBAA9C;;AAEA;AACA,MAAI,YAAY,CAAhB,EAAmB;AAAE;AAAS;;AAE9B;AACA,cAAY,kBAAZ,GAAiC,WAAW,YAAY;AACtD,kBAAc,IAAd,CAAmB;AACjB,8BADiB;AAEjB,8BAFiB;AAGjB,YAAM,MAHW;AAIjB,eAAS,YAJQ;AAKjB,aAAO;AALU,KAAnB;AAOD,GARgC,EAQ9B,QAR8B,CAAjC;AASD;;AAED,SAAS,aAAT,QAAyC;AAAA,MAAf,WAAe,SAAf,WAAe;;AACvC;AACA;AACA,MAAI,YAAY,kBAAhB,EAAoC;AAClC,kBAAc,YAAY,kBAA1B;AACA,gBAAY,kBAAZ,GAAiC,IAAjC;AACD;AACF;;AAED;AACA,cAAc,QAAd,CAAuB,kBAAvB,GAA4C,CAA5C;AACA,cAAc,KAAd,CAAoB,IAApB,CAAyB,YAAzB;;AAEA,OAAO,OAAP,GAAiB;AACf,cADe;AAEf,kBAFe;AAGf;AAHe,CAAjB;;;;;AClDA,IAAM,gBAAgB,QAAQ,QAAR,CAAtB;AACA,IAAM,eAAgB,QAAQ,iBAAR,CAAtB;AACA,IAAM,UAAgB,QAAQ,kBAAR,CAAtB;AACA,IAAM,KAAgB,QAAQ,aAAR,CAAtB;AACA,IAAM,WAAgB,QAAQ,mBAAR,CAAtB;AACA,IAAM,QAAgB,QAAQ,UAAR,CAAtB;AACA,IAAM,SAAgB,QAAQ,iBAAR,CAAtB;;eACsB,QAAQ,cAAR,C;IAAd,K,YAAA,K;;AAER,cAAc,OAAd,CAAsB,EAAtB,CAAyB,iBAAzB,EAA4C,gBAAmD;AAAA,MAAvC,OAAuC,QAAvC,OAAuC;AAAA,MAA9B,OAA8B,QAA9B,OAA8B;AAAA,MAArB,IAAqB,QAArB,IAAqB;AAAA,MAAf,WAAe,QAAf,WAAe;;AAC7F,WAAS,gBAAT,CAA2B,YAA3B,EAAyC,QAAzC,EAAmD,OAAnD,EAA4D;AAC1D,QAAM,MAAM,QAAQ,0BAAR,GACN,QAAQ,gBAAR,CAAyB,QAAzB,CADM,GAEN,SAFN;;AAIA,QAAM,YAAY,aAAa,MAA/B;AACA,QAAM,UAAU,UAAU,OAA1B;;AAEA,QAAI,UAAU,IAAV,KACG,GAAG,OAAH,CAAW,OAAX,CADH,IAEG,SAAS,eAAT,CAAyB,OAAzB,EAAkC,QAAlC,EAA4C,GAA5C,CAFH,IAGG,aAAa,eAAb,CAA6B,OAA7B,EAAsC,OAAtC,EAA+C,WAA/C,CAHP,EAGoE;;AAElE,cAAQ,IAAR,CAAa;AACX,wBADW;AAEX,4BAFW;AAGX,eAAO,EAAE,0BAAF;AAHI,OAAb;AAKD;AACF;;AAED,MAAM,eAAe,MAAM,aAAN,CAAoB,GAApB,CAAwB,OAAxB,CAArB;;AAEA,MAAI,YAAJ,EAAkB;AAChB,QAAM,YAAY,aAAa,MAA/B;AACA,QAAM,UAAU,UAAU,OAA1B;;AAEA,QAAI,UAAU,IAAV,KACG,aAAa,eAAb,CAA6B,OAA7B,EAAsC,OAAtC,EAA+C,WAA/C,CADP,EACoE;AAClE,cAAQ,IAAR,CAAa;AACX,wBADW;AAEX,4BAFW;AAGX,eAAO,EAAE,0BAAF;AAHI,OAAb;AAKD;AACF;;AAED,QAAM,aAAN,CAAoB,eAApB,CAAoC,gBAApC,EAAsD,OAAtD;AACD,CAvCD;;AAyCA,aAAa,OAAb,CAAqB,EAArB,CAAwB,KAAxB,EAA+B,iBAA4B;AAAA,MAAhB,YAAgB,SAAhB,YAAgB;;AACzD,eAAa,MAAb,CAAoB,OAApB,GAA8B,UAAU,OAAV,EAAmB;AAC/C,WAAO,aAAa,OAAb,CAAqB,OAArB,CAAP;AACD,GAFD;AAGD,CAJD;;AAMA,aAAa,OAAb,CAAqB,EAArB,CAAwB,KAAxB,EAA+B,iBAAqC;AAAA,MAAzB,YAAyB,SAAzB,YAAyB;AAAA,MAAX,OAAW,SAAX,OAAW;;AAClE,SAAO,aAAa,MAAb,CAAoB,OAA3B,EAAoC,cAAc,QAAlD;AACA,SAAO,aAAa,MAAb,CAAoB,OAA3B,EAAoC,OAApC;AACD,CAHD;;AAKA,MAAM,aAAa,UAAnB,EAA+B,cAAc,KAA7C;;AAEA,aAAa,SAAb,CAAuB,aAAvB,GAAuC,UAAU,OAAV,EAAmB;AACxD,SAAO,KAAK,MAAL,CAAY,OAAnB,EAA4B,OAA5B;;AAEA,SAAO,IAAP;AACD,CAJD;;AAMA,IAAM,qBAAqB,aAAa,SAAb,CAAuB,iBAAlD;;AAEA,aAAa,SAAb,CAAuB,iBAAvB,GAA2C,UAAU,UAAV,EAAsB,QAAtB,EAAgC;AACzE,MAAM,MAAM,mBAAmB,IAAnB,CAAwB,IAAxB,EAA8B,UAA9B,EAA0C,QAA1C,CAAZ;;AAEA,MAAI,QAAQ,IAAZ,EAAkB;AAChB,SAAK,MAAL,CAAY,OAAZ,CAAoB,UAApB,IAAkC,QAAlC;AACD;;AAED,SAAO,GAAP;AACD,CARD;;AAUA,aAAa,eAAb,CAA6B,IAA7B,CAAkC,eAAlC;;;;;ACjFA,IAAM,QAAU,QAAQ,SAAR,CAAhB;AACA,IAAM,SAAU,QAAQ,gBAAR,CAAhB;AACA,IAAM,UAAU,QAAQ,iBAAR,EAA2B,GAA3B,EAAhB;;AAEA,IAAM,QAAQ;AACZ,kBADY;AAEZ,gBAFY;AAGZ,cAHY;;AAKZ;AACA,YAAU,QAAQ,oBAAR,EAA8B,QAN5B;AAOZ;AACA,aAAW,EARC;;AAUZ,eAAa,qBAAU,GAAV,EAAe,GAAf,EAAoB;AAC/B;AACA,QAAI,MAAM,QAAN,CAAe,MAAM,SAArB,EAAgC,GAAhC,CAAJ,EAA0C;AAAE,aAAO,KAAP;AAAe;;AAE3D,UAAM,OAAO,MAAM,SAAN,CAAgB,GAAhB,CAAb;;AAEA,UAAM,SAAN,CAAgB,IAAhB,CAAqB,GAArB;AACA,WAAO,SAAP,CAAiB,IAAjB,CAAsB,GAAtB;;AAEA;AACA;AACA,QAAI,QAAQ,MAAM,QAAlB,EAA4B;AAC1B,aAAO,GAAP,CAAW,GAAX,EAAgB,QAAhB,EAA0B,MAAM,cAAhC;AACD;;AAED,YAAQ,IAAR,CAAa,cAAb,EAA6B,EAAE,QAAF,EAAO,QAAP,EAA7B;AACD,GA1BW;;AA4BZ,kBAAgB,wBAAU,GAAV,EAAe,GAAf,EAAoB;AAClC,QAAM,QAAQ,MAAM,OAAN,CAAc,MAAM,SAApB,EAA+B,GAA/B,CAAd;;AAEA,UAAM,OAAO,MAAM,SAAN,CAAgB,GAAhB,CAAb;;AAEA,WAAO,MAAP,CAAc,GAAd,EAAmB,QAAnB,EAA6B,MAAM,cAAnC;;AAEA,UAAM,SAAN,CAAgB,MAAhB,CAAuB,KAAvB,EAA8B,CAA9B;AACA,WAAO,SAAP,CAAiB,MAAjB,CAAwB,KAAxB,EAA+B,CAA/B;;AAEA,YAAQ,IAAR,CAAa,iBAAb,EAAgC,EAAE,QAAF,EAAO,QAAP,EAAhC;AACD,GAvCW;;AAyCZ,kBAAgB,0BAAY;AAC1B,UAAM,cAAN,CAAqB,KAAK,QAA1B,EAAoC,IAApC;AACD;AA3CW,CAAd;;AA8CA,OAAO,OAAP,GAAiB,KAAjB;;;;;;;eClDoB,QAAQ,OAAR,C;IAAZ,O,YAAA,O;;IAEF,O;AACJ,qBAAe;AAAA;;AACb,SAAK,SAAL,GAAiB;AACf;AADe,KAAjB;AAGD;;oBAED,E,eAAI,I,EAAM,Q,EAAU;AAClB,QAAI,CAAC,KAAK,SAAL,CAAe,IAAf,CAAL,EAA2B;AACzB,WAAK,SAAL,CAAe,IAAf,IAAuB,CAAC,QAAD,CAAvB;AACA;AACD;;AAED,SAAK,SAAL,CAAe,IAAf,EAAqB,IAArB,CAA0B,QAA1B;AACD,G;;oBAED,G,gBAAK,I,EAAM,Q,EAAU;AACnB,QAAI,CAAC,KAAK,SAAL,CAAe,IAAf,CAAL,EAA2B;AAAE;AAAS;;AAEtC,QAAM,QAAQ,QAAQ,KAAK,SAAL,CAAe,IAAf,CAAR,EAA8B,QAA9B,CAAd;;AAEA,QAAI,UAAU,CAAC,CAAf,EAAkB;AAChB,WAAK,SAAL,CAAe,IAAf,EAAqB,MAArB,CAA4B,KAA5B,EAAmC,CAAnC;AACD;AACF,G;;oBAED,I,iBAAM,I,EAAM,G,EAAK;AACf,QAAM,kBAAkB,KAAK,SAAL,CAAe,IAAf,CAAxB;;AAEA,QAAI,CAAC,eAAL,EAAsB;AAAE;AAAS;;AAEjC,SAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,gBAAgB,MAApC,EAA4C,GAA5C,EAAiD;AAC/C,UAAI,gBAAgB,CAAhB,EAAmB,GAAnB,EAAwB,IAAxB,MAAkC,KAAtC,EAA6C;AAC3C;AACD;AACF;AACF,G;;;;;AAGH,QAAQ,GAAR,GAAc,YAAY;AACxB,SAAO,IAAI,OAAJ,EAAP;AACD,CAFD;;AAIA,OAAO,OAAP,GAAiB,OAAjB;;;;;AC7CA,SAAS,OAAT,CAAkB,KAAlB,EAAyB,MAAzB,EAAiC;AAC/B,OAAK,IAAI,IAAI,CAAR,EAAW,MAAM,MAAM,MAA5B,EAAoC,IAAI,GAAxC,EAA6C,GAA7C,EAAkD;AAChD,QAAI,MAAM,CAAN,MAAa,MAAjB,EAAyB;AACvB,aAAO,CAAP;AACD;AACF;;AAED,SAAO,CAAC,CAAR;AACD;;AAED,SAAS,QAAT,CAAmB,KAAnB,EAA0B,MAA1B,EAAkC;AAChC,SAAO,QAAQ,KAAR,EAAe,MAAf,MAA2B,CAAC,CAAnC;AACD;;AAED,SAAS,KAAT,CAAgB,MAAhB,EAAwB,MAAxB,EAAgC;AAC9B,OAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,OAAO,MAA3B,EAAmC,GAAnC,EAAwC;AACtC,WAAO,IAAP,CAAY,OAAO,CAAP,CAAZ;AACD;;AAED,SAAO,MAAP;AACD;;AAED,SAAS,MAAT,CAAiB,KAAjB,EAAwB,IAAxB,EAA8B;AAC5B,MAAM,SAAS,EAAf;;AAEA,OAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,MAAM,MAA1B,EAAkC,GAAlC,EAAuC;AACrC,QAAI,KAAK,MAAM,CAAN,CAAL,CAAJ,EAAoB;AAClB,aAAO,IAAP,CAAY,MAAM,CAAN,CAAZ;AACD;AACF;;AAED,SAAO,MAAP;AACD;;AAED,OAAO,OAAP,GAAiB;AACf,kBADe;AAEf,oBAFe;AAGf,cAHe;AAIf;AAJe,CAAjB;;;;;eClCmB,QAAQ,UAAR,C;IAAX,M,YAAA,M;;AACR,IAAM,KAAS,QAAQ,MAAR,CAAf;AACA,IAAM,aAAa,QAAQ,cAAR,CAAnB;;AAEA,IAAM,UAAU,WAAW,OAA3B;AACA,IAAM,YAAa,OAAO,SAA1B;;AAEA,IAAM,UAAU;AACd;AACA,iBAAe,CAAC,EAAG,kBAAkB,MAAnB,IAA8B,GAAG,QAAH,CAAY,OAAO,aAAnB,KAC1B,WAAW,QAAX,YAA+B,OAAO,aAD5C,CAFF;;AAKd;AACA,wBAAsB,CAAC,CAAC,WAAW,YANrB;;AAQd,SAAQ,iBAAiB,MAAlB,IAA6B,EAAE,sBAAsB,MAAxB,CARtB;;AAUd;AACA,iBAAgB,UAAU,OAAV,KAAsB,OAAtB,IACT,QAAQ,aADC,IAET,UAAU,SAAV,CAAoB,KAApB,CAA0B,QAA1B,CAbO;;AAed;AACA,UAAS,iBAAiB,IAAjB,CAAsB,UAAU,QAAhC,KACG,YAAY,IAAZ,CAAiB,UAAU,UAA3B,CAjBE;;AAmBd,gBAAc,aAAa,IAAb,CAAkB,UAAU,SAA5B,CAnBA;;AAqBd;AACA,2BAAyB,aAAa,QAAQ,SAArB,GACrB,SADqB,GACV,2BAA2B,QAAQ,SAAnC,GACX,uBADW,GACc,wBAAwB,QAAQ,SAAhC,GACzB,oBADyB,GACH,sBAAsB,QAAQ,SAA9B,GACtB,kBADsB,GACF,mBA1BV;;AA4Bd,8BAA4B,KA5Bd;;AA8Bd,eAAc,WAAW,YAAX,GACT,WAAW,YAAX,KAA4B,OAAO,cAAnC,GACC;AACA,QAAQ,aADR;AAEA,UAAQ,eAFR;AAGA,UAAQ,WAHR;AAIA,SAAQ,UAJR;AAKA,UAAQ,eALR;AAMA,YAAQ;AANR,GADD,GASC;AACA,QAAQ,WADR;AAEA,UAAQ,aAFR;AAGA,UAAQ,aAHR;AAIA,SAAQ,YAJR;AAKA,UAAQ,aALR;AAMA,YAAQ;AANR,GAVQ,GAkBV,IAhDU;;AAkDd;AACA,cAAY,kBAAkB,WAAW,QAA7B,GAAuC,YAAvC,GAAqD;;AAnDnD,CAAhB;;AAuDA,QAAQ,0BAAR,GAAqC,CAAC,GAAG,QAAH,CAAY,QAAQ,SAAR,CAAkB,QAAQ,uBAA1B,CAAZ,CAAtC;;AAEA,OAAO,OAAP,GAAiB,OAAjB;;;;;AChEA,IAAM,aAAa,EAAnB;AACA,IAAM,MAAM,QAAQ,UAAR,EAAoB,MAAhC;;AAEA,SAAS,KAAT,GAAkB,CAAE;;AAEpB,WAAW,QAAX,GAAgC,IAAI,QAApC;AACA,WAAW,gBAAX,GAAgC,IAAI,gBAAJ,IAA0B,KAA1D;AACA,WAAW,UAAX,GAAgC,IAAI,UAAJ,IAA0B,KAA1D;AACA,WAAW,aAAX,GAAgC,IAAI,aAAJ,IAA0B,KAA1D;AACA,WAAW,kBAAX,GAAgC,IAAI,kBAAJ,IAA0B,KAA1D;AACA,WAAW,OAAX,GAAgC,IAAI,OAAJ,IAA0B,KAA1D;AACA,WAAW,WAAX,GAAgC,IAAI,WAAJ,IAA0B,WAAW,OAArE;;AAEA,WAAW,KAAX,GAA0B,IAAI,KAA9B;AACA,WAAW,KAAX,GAA0B,IAAI,KAAJ,IAAa,KAAvC;AACA,WAAW,YAAX,GAA2B,IAAI,YAAJ,IAAoB,IAAI,cAAnD;;AAEA,OAAO,OAAP,GAAiB,UAAjB;;;;;ACjBA,IAAM,MAAa,QAAQ,UAAR,CAAnB;AACA,IAAM,UAAa,QAAQ,WAAR,CAAnB;AACA,IAAM,KAAa,QAAQ,MAAR,CAAnB;AACA,IAAM,aAAa,QAAQ,cAAR,CAAnB;;AAEA,IAAM,WAAW;AACf,gBAAc,sBAAU,MAAV,EAAkB,KAAlB,EAAyB;AACrC,WAAO,KAAP,EAAc;AACZ,UAAI,UAAU,MAAd,EAAsB;AACpB,eAAO,IAAP;AACD;;AAED,cAAQ,MAAM,UAAd;AACD;;AAED,WAAO,KAAP;AACD,GAXc;;AAaf,WAAS,iBAAU,OAAV,EAAmB,QAAnB,EAA6B;AACpC,WAAO,GAAG,OAAH,CAAW,OAAX,CAAP,EAA4B;AAC1B,UAAI,SAAS,eAAT,CAAyB,OAAzB,EAAkC,QAAlC,CAAJ,EAAiD;AAAE,eAAO,OAAP;AAAiB;;AAEpE,gBAAU,SAAS,UAAT,CAAoB,OAApB,CAAV;AACD;;AAED,WAAO,IAAP;AACD,GArBc;;AAuBf,cAAY,oBAAU,IAAV,EAAgB;AAC1B,QAAI,SAAS,KAAK,UAAlB;;AAEA,QAAI,GAAG,OAAH,CAAW,MAAX,CAAJ,EAAwB;AACtB;AACA,aAAO,CAAC,SAAS,OAAO,IAAjB,KAA0B,GAAG,OAAH,CAAW,MAAX,CAAjC,EAAqD;AACnD;AACD;;AAED,aAAO,MAAP;AACD;;AAED,WAAO,MAAP;AACD,GApCc;;AAsCf;AACA,2BAAyB,QAAQ,0BAAR,GACrB,UAAU,OAAV,EAAmB,QAAnB,EAA6B,KAA7B,EAAoC;AACpC,YAAQ,SAAS,QAAQ,UAAR,CAAmB,gBAAnB,CAAoC,QAApC,CAAjB;;AAEA,SAAK,IAAI,IAAI,CAAR,EAAW,MAAM,MAAM,MAA5B,EAAoC,IAAI,GAAxC,EAA6C,GAA7C,EAAkD;AAChD,UAAI,MAAM,CAAN,MAAa,OAAjB,EAA0B;AACxB,eAAO,IAAP;AACD;AACF;;AAED,WAAO,KAAP;AACD,GAXsB,GAYrB,IAnDW;;AAqDf,mBAAiB,yBAAU,OAAV,EAAmB,QAAnB,EAA6B,QAA7B,EAAuC;AACtD,QAAI,QAAQ,0BAAZ,EAAwC;AACtC,aAAO,SAAS,uBAAT,CAAiC,OAAjC,EAA0C,QAA1C,EAAoD,QAApD,CAAP;AACD;;AAED;AACA,QAAI,IAAI,MAAJ,KAAe,IAAI,UAAvB,EAAmC;AACjC,iBAAW,SAAS,OAAT,CAAiB,WAAjB,EAA8B,GAA9B,CAAX;AACD;;AAED,WAAO,QAAQ,QAAQ,uBAAhB,EAAyC,QAAzC,CAAP;AACD,GAhEc;;AAkEf;AACA,yBAAuB,+BAAU,QAAV,EAAoB;AACzC,QAAI,qBAAqB,EAAzB;AACA,QAAI,kBAAkB,EAAtB;AACA,QAAI,iBAAJ;AACA,QAAI,cAAc,SAAS,CAAT,CAAlB;AACA,QAAI,QAAQ,cAAa,CAAb,GAAgB,CAAC,CAA7B;AACA,QAAI,eAAJ;AACA,QAAI,cAAJ;AACA,QAAI,UAAJ;AACA,QAAI,UAAJ;;AAEA,SAAK,IAAI,CAAT,EAAY,IAAI,SAAS,MAAzB,EAAiC,GAAjC,EAAsC;AACpC,iBAAW,SAAS,CAAT,CAAX;;AAEA;AACA,UAAI,CAAC,QAAD,IAAa,aAAa,WAA9B,EAA2C;AACzC;AACD;;AAED,UAAI,CAAC,WAAL,EAAkB;AAChB,sBAAc,QAAd;AACA,gBAAQ,CAAR;AACA;AACD;;AAED;AACA;AACA,UAAI,SAAS,UAAT,KAAwB,SAAS,aAArC,EAAoD;AAClD;AACD;AACD;AAHA,WAIK,IAAI,YAAY,UAAZ,KAA2B,SAAS,aAAxC,EAAuD;AAC1D,wBAAc,QAAd;AACA,kBAAQ,CAAR;AACA;AACD;;AAED,UAAI,CAAC,mBAAmB,MAAxB,EAAgC;AAC9B,iBAAS,WAAT;AACA,eAAO,OAAO,UAAP,IAAqB,OAAO,UAAP,KAAsB,OAAO,aAAzD,EAAwE;AACtE,6BAAmB,OAAnB,CAA2B,MAA3B;AACA,mBAAS,OAAO,UAAhB;AACD;AACF;;AAED;AACA;AACA,UAAI,uBAAuB,WAAW,WAAlC,IACG,oBAAoB,WAAW,UADlC,IAEG,EAAE,oBAAoB,WAAW,aAAjC,CAFP,EAEwD;;AAEtD,YAAI,aAAa,YAAY,UAA7B,EAAyC;AACvC;AACD;;AAED,iBAAS,SAAS,eAAlB;AACD,OATD,MAUK;AACH,iBAAS,QAAT;AACD;;AAED,wBAAkB,EAAlB;;AAEA,aAAO,OAAO,UAAP,KAAsB,OAAO,aAApC,EAAmD;AACjD,wBAAgB,OAAhB,CAAwB,MAAxB;AACA,iBAAS,OAAO,UAAhB;AACD;;AAED,UAAI,CAAJ;;AAEA;AACA,aAAO,gBAAgB,CAAhB,KAAsB,gBAAgB,CAAhB,MAAuB,mBAAmB,CAAnB,CAApD,EAA2E;AACzE;AACD;;AAED,UAAM,UAAU,CACd,gBAAgB,IAAI,CAApB,CADc,EAEd,gBAAgB,CAAhB,CAFc,EAGd,mBAAmB,CAAnB,CAHc,CAAhB;;AAMA,cAAQ,QAAQ,CAAR,EAAW,SAAnB;;AAEA,aAAO,KAAP,EAAc;AACZ,YAAI,UAAU,QAAQ,CAAR,CAAd,EAA0B;AACxB,wBAAc,QAAd;AACA,kBAAQ,CAAR;AACA,+BAAqB,EAArB;;AAEA;AACD,SAND,MAOK,IAAI,UAAU,QAAQ,CAAR,CAAd,EAA0B;AAC7B;AACD;;AAED,gBAAQ,MAAM,eAAd;AACD;AACF;;AAED,WAAO,KAAP;AACD,GAvKc;;AAyKf,eAAa,qBAAU,OAAV,EAAmB,QAAnB,EAA6B,KAA7B,EAAoC;AAC/C,WAAO,GAAG,OAAH,CAAW,OAAX,CAAP,EAA4B;AAC1B,UAAI,SAAS,eAAT,CAAyB,OAAzB,EAAkC,QAAlC,CAAJ,EAAiD;AAC/C,eAAO,IAAP;AACD;;AAED,gBAAU,SAAS,UAAT,CAAoB,OAApB,CAAV;;AAEA,UAAI,YAAY,KAAhB,EAAuB;AACrB,eAAO,SAAS,eAAT,CAAyB,OAAzB,EAAkC,QAAlC,CAAP;AACD;AACF;;AAED,WAAO,KAAP;AACD,GAvLc;;AAyLf,oBAAkB,0BAAU,OAAV,EAAmB;AACnC,WAAQ,mBAAmB,WAAW,kBAA9B,GACJ,QAAQ,uBADJ,GAEJ,OAFJ;AAGD,GA7Lc;;AA+Lf,eAAa,qBAAU,cAAV,EAA0B;AACrC,qBAAiB,kBAAkB,IAAI,MAAvC;AACA,WAAO;AACL,SAAG,eAAe,OAAf,IAA0B,eAAe,QAAf,CAAwB,eAAxB,CAAwC,UADhE;AAEL,SAAG,eAAe,OAAf,IAA0B,eAAe,QAAf,CAAwB,eAAxB,CAAwC;AAFhE,KAAP;AAID,GArMc;;AAuMf,wBAAsB,8BAAU,OAAV,EAAmB;AACvC,QAAM,aAAc,mBAAmB,WAAW,UAA9B,GAChB,QAAQ,qBAAR,EADgB,GAEhB,QAAQ,cAAR,GAAyB,CAAzB,CAFJ;;AAIA,WAAO,cAAc;AACnB,YAAQ,WAAW,IADA;AAEnB,aAAQ,WAAW,KAFA;AAGnB,WAAQ,WAAW,GAHA;AAInB,cAAQ,WAAW,MAJA;AAKnB,aAAQ,WAAW,KAAX,IAAqB,WAAW,KAAX,GAAoB,WAAW,IALzC;AAMnB,cAAQ,WAAW,MAAX,IAAqB,WAAW,MAAX,GAAoB,WAAW;AANzC,KAArB;AAQD,GApNc;;AAsNf,kBAAgB,wBAAU,OAAV,EAAmB;AACjC,QAAM,aAAa,SAAS,oBAAT,CAA8B,OAA9B,CAAnB;;AAEA,QAAI,CAAC,QAAQ,MAAT,IAAmB,UAAvB,EAAmC;AACjC,UAAM,SAAS,SAAS,WAAT,CAAqB,IAAI,SAAJ,CAAc,OAAd,CAArB,CAAf;;AAEA,iBAAW,IAAX,IAAqB,OAAO,CAA5B;AACA,iBAAW,KAAX,IAAqB,OAAO,CAA5B;AACA,iBAAW,GAAX,IAAqB,OAAO,CAA5B;AACA,iBAAW,MAAX,IAAqB,OAAO,CAA5B;AACD;;AAED,WAAO,UAAP;AACD,GAnOc;;AAqOf,WAAS,iBAAU,OAAV,EAAmB;AAC1B,QAAM,OAAO,EAAb;;AAEA,WAAO,OAAP,EAAgB;AACd,WAAK,IAAL,CAAU,OAAV;AACA,gBAAU,SAAS,UAAT,CAAoB,OAApB,CAAV;AACD;;AAED,WAAO,IAAP;AACD,GA9Oc;;AAgPf,eAAa,4BAAS;AACpB,QAAI,CAAC,GAAG,MAAH,CAAU,KAAV,CAAL,EAAuB;AAAE,aAAO,KAAP;AAAe;;AAExC;AACA,eAAW,QAAX,CAAoB,aAApB,CAAkC,KAAlC;AACA,WAAO,IAAP;AACD;AAtPc,CAAjB;;AAyPA,OAAO,OAAP,GAAiB,QAAjB;;;;;AC9PA,IAAM,KAAO,QAAQ,MAAR,CAAb;AACA,IAAM,WAAW,QAAQ,YAAR,CAAjB;AACA,IAAM,UAAW,QAAQ,iBAAR,CAAjB;;eAE+B,QAAQ,UAAR,C;IAAvB,M,YAAA,M;IAAQ,S,YAAA,S;;gBACc,QAAQ,OAAR,C;IAAtB,O,aAAA,O;IAAS,Q,aAAA,Q;;AAEjB,IAAM,iBAAkB,iBAAiB,MAAlB,IAA6B,EAAE,sBAAsB,MAAxB,CAApD;AACA,IAAM,WAAiB,iBAAiB,aAAjB,GAAgC,kBAAvD;AACA,IAAM,cAAiB,iBAAiB,aAAjB,GAAgC,qBAAvD;AACA,IAAM,KAAiB,iBAAgB,IAAhB,GAAsB,EAA7C;;AAEA,IAAM,WAAoB,EAA1B;AACA,IAAM,UAAoB,EAA1B;AACA,IAAM,oBAAoB,EAA1B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAM,kBAAkB,EAAxB;;AAEA,IAAM,YAAY,EAAlB;;AAEA,IAAM,kBAAkB,CAAC,cAAD,IAAoB,YAAM;AAChD,MAAI,YAAY,KAAhB;;AAEA,SAAO,QAAP,CAAgB,aAAhB,CAA8B,KAA9B,EAAqC,gBAArC,CAAsD,MAAtD,EAA8D,IAA9D,EAAoE;AAClE,QAAI,OAAJ,GAAe;AAAE,kBAAY,IAAZ;AAAmB;AAD8B,GAApE;;AAIA,SAAO,SAAP;AACD,CAR0C,EAA3C;;AAUA,SAAS,GAAT,CAAc,OAAd,EAAuB,IAAvB,EAA6B,QAA7B,EAAuC,WAAvC,EAAoD;AAClD,MAAM,UAAU,WAAW,WAAX,CAAhB;AACA,MAAI,eAAe,QAAQ,QAAR,EAAkB,OAAlB,CAAnB;AACA,MAAI,SAAS,QAAQ,YAAR,CAAb;;AAEA,MAAI,CAAC,MAAL,EAAa;AACX,aAAS;AACP,cAAQ,EADD;AAEP,iBAAW;AAFJ,KAAT;;AAKA,mBAAe,SAAS,IAAT,CAAc,OAAd,IAAyB,CAAxC;AACA,YAAQ,IAAR,CAAa,MAAb;;AAEA,sBAAkB,IAAlB,CAAuB,iBACnB;AACA,gBAAU,EADV;AAEA,eAAU,EAFV;AAGA,gBAAU;AAHV,KADmB,GAMnB,IANJ;AAOD;;AAED,MAAI,CAAC,OAAO,MAAP,CAAc,IAAd,CAAL,EAA0B;AACxB,WAAO,MAAP,CAAc,IAAd,IAAsB,EAAtB;AACA,WAAO,SAAP;AACD;;AAED,MAAI,CAAC,SAAS,OAAO,MAAP,CAAc,IAAd,CAAT,EAA8B,QAA9B,CAAL,EAA8C;AAC5C,QAAI,YAAJ;;AAEA,QAAI,cAAJ,EAAoB;AAAA,kCACsB,kBAAkB,YAAlB,CADtB;AAAA,UACV,QADU,yBACV,QADU;AAAA,UACA,OADA,yBACA,OADA;AAAA,UACS,QADT,yBACS,QADT;;AAElB,UAAM,gBAAgB,QAAQ,QAAR,EAAkB,QAAlB,CAAtB;;AAEA,UAAM,kBAAkB,QAAQ,aAAR,KAA0B,UAAU,KAAV,EAAiB;AACjE,YAAI,CAAC,MAAM,2BAAX,EAAwC;AACtC,gBAAM,MAAN,GAAe,MAAM,UAArB;AACA,gBAAM,aAAN,GAAsB,OAAtB;;AAEA,gBAAM,cAAN,GAAiC,MAAM,cAAN,IAAkC,UAAnE;AACA,gBAAM,eAAN,GAAiC,MAAM,eAAN,IAAkC,QAAnE;AACA,gBAAM,wBAAN,GAAiC,MAAM,wBAAN,IAAkC,WAAnE;;AAEA,cAAI,cAAc,IAAd,CAAmB,MAAM,IAAzB,CAAJ,EAAoC;AAClC,kBAAM,KAAN,GAAc,MAAM,OAAN,GAAgB,UAAU,OAAV,EAAmB,QAAnB,CAA4B,eAA5B,CAA4C,UAA1E;AACA,kBAAM,KAAN,GAAc,MAAM,OAAN,GAAgB,UAAU,OAAV,EAAmB,QAAnB,CAA4B,eAA5B,CAA4C,SAA1E;AACD;;AAED,mBAAS,KAAT;AACD;AACF,OAhBD;;AAkBA,YAAM,QAAQ,QAAR,EAAkB,KAAK,IAAvB,EAA6B,eAA7B,EAA8C,CAAC,CAAC,QAAQ,OAAxD,CAAN;;AAEA,UAAI,kBAAkB,CAAC,CAAvB,EAA0B;AACxB,iBAAS,IAAT,CAAc,QAAd;AACA,gBAAQ,IAAR,CAAa,eAAb;AACA,iBAAS,IAAT,CAAc,CAAd;AACD,OAJD,MAKK;AACH,iBAAS,aAAT;AACD;AACF,KAhCD,MAiCK;AACH,YAAM,QAAQ,QAAR,EAAkB,IAAlB,EAAwB,QAAxB,EAAkC,kBAAiB,OAAjB,GAA2B,CAAC,CAAC,QAAQ,OAAvE,CAAN;AACD;AACD,WAAO,MAAP,CAAc,IAAd,EAAoB,IAApB,CAAyB,QAAzB;;AAEA,WAAO,GAAP;AACD;AACF;;AAED,SAAS,MAAT,CAAiB,OAAjB,EAA0B,IAA1B,EAAgC,QAAhC,EAA0C,WAA1C,EAAuD;AACrD,MAAM,UAAU,WAAW,WAAX,CAAhB;AACA,MAAM,eAAe,QAAQ,QAAR,EAAkB,OAAlB,CAArB;AACA,MAAM,SAAS,QAAQ,YAAR,CAAf;;AAEA,MAAI,CAAC,MAAD,IAAW,CAAC,OAAO,MAAvB,EAA+B;AAC7B;AACD;;AAED,MAAI,kBAAkB,QAAtB;AACA,MAAI,kBAAJ;AACA,MAAI,sBAAJ;;AAEA,MAAI,cAAJ,EAAoB;AAClB,gBAAY,kBAAkB,YAAlB,CAAZ;AACA,oBAAgB,QAAQ,UAAU,QAAlB,EAA4B,QAA5B,CAAhB;AACA,sBAAkB,UAAU,OAAV,CAAkB,aAAlB,CAAlB;AACD;;AAED,MAAI,SAAS,KAAb,EAAoB;AAClB,SAAK,IAAL,IAAa,OAAO,MAApB,EAA4B;AAC1B,UAAI,OAAO,MAAP,CAAc,cAAd,CAA6B,IAA7B,CAAJ,EAAwC;AACtC,eAAO,OAAP,EAAgB,IAAhB,EAAsB,KAAtB;AACD;AACF;AACD;AACD;;AAED,MAAI,OAAO,MAAP,CAAc,IAAd,CAAJ,EAAyB;AACvB,QAAM,MAAM,OAAO,MAAP,CAAc,IAAd,EAAoB,MAAhC;;AAEA,QAAI,aAAa,KAAjB,EAAwB;AACtB,WAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,GAApB,EAAyB,GAAzB,EAA8B;AAC5B,eAAO,OAAP,EAAgB,IAAhB,EAAsB,OAAO,MAAP,CAAc,IAAd,EAAoB,CAApB,CAAtB,EAA8C,OAA9C;AACD;AACD;AACD,KALD,MAMK;AACH,WAAK,IAAI,KAAI,CAAb,EAAgB,KAAI,GAApB,EAAyB,IAAzB,EAA8B;AAC5B,YAAI,OAAO,MAAP,CAAc,IAAd,EAAoB,EAApB,MAA2B,QAA/B,EAAyC;AACvC,kBAAQ,WAAR,EAAqB,KAAK,IAA1B,EAAgC,eAAhC,EAAiD,kBAAiB,OAAjB,GAA2B,CAAC,CAAC,QAAQ,OAAtF;AACA,iBAAO,MAAP,CAAc,IAAd,EAAoB,MAApB,CAA2B,EAA3B,EAA8B,CAA9B;;AAEA,cAAI,kBAAkB,SAAtB,EAAiC;AAC/B,sBAAU,QAAV,CAAmB,aAAnB;AACA,gBAAI,UAAU,QAAV,CAAmB,aAAnB,MAAsC,CAA1C,EAA6C;AAC3C,wBAAU,QAAV,CAAmB,MAAnB,CAA0B,aAA1B,EAAyC,CAAzC;AACA,wBAAU,OAAV,CAAkB,MAAlB,CAAyB,aAAzB,EAAwC,CAAxC;AACA,wBAAU,QAAV,CAAmB,MAAnB,CAA0B,aAA1B,EAAyC,CAAzC;AACD;AACF;;AAED;AACD;AACF;AACF;;AAED,QAAI,OAAO,MAAP,CAAc,IAAd,KAAuB,OAAO,MAAP,CAAc,IAAd,EAAoB,MAApB,KAA+B,CAA1D,EAA6D;AAC3D,aAAO,MAAP,CAAc,IAAd,IAAsB,IAAtB;AACA,aAAO,SAAP;AACD;AACF;;AAED,MAAI,CAAC,OAAO,SAAZ,EAAuB;AACrB,YAAQ,MAAR,CAAe,YAAf,EAA6B,CAA7B;AACA,aAAS,MAAT,CAAgB,YAAhB,EAA8B,CAA9B;AACA,sBAAkB,MAAlB,CAAyB,YAAzB,EAAuC,CAAvC;AACD;AACF;;AAED,SAAS,WAAT,CAAsB,QAAtB,EAAgC,OAAhC,EAAyC,IAAzC,EAA+C,QAA/C,EAAyD,WAAzD,EAAsE;AACpE,MAAM,UAAU,WAAW,WAAX,CAAhB;AACA,MAAI,CAAC,gBAAgB,IAAhB,CAAL,EAA4B;AAC1B,oBAAgB,IAAhB,IAAwB;AACtB,iBAAW,EADW;AAEtB,gBAAW,EAFW;AAGtB,iBAAW;AAHW,KAAxB;;AAMA;AACA,SAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,UAAU,MAA9B,EAAsC,GAAtC,EAA2C;AACzC,UAAI,UAAU,CAAV,CAAJ,EAAkB,IAAlB,EAAwB,gBAAxB;AACA,UAAI,UAAU,CAAV,CAAJ,EAAkB,IAAlB,EAAwB,kBAAxB,EAA4C,IAA5C;AACD;AACF;;AAED,MAAM,YAAY,gBAAgB,IAAhB,CAAlB;AACA,MAAI,cAAJ;;AAEA,OAAK,QAAQ,UAAU,SAAV,CAAoB,MAApB,GAA6B,CAA1C,EAA6C,SAAS,CAAtD,EAAyD,OAAzD,EAAkE;AAChE,QAAI,UAAU,SAAV,CAAoB,KAApB,MAA+B,QAA/B,IACG,UAAU,QAAV,CAAmB,KAAnB,MAA8B,OADrC,EAC8C;AAC5C;AACD;AACF;;AAED,MAAI,UAAU,CAAC,CAAf,EAAkB;AAChB,YAAQ,UAAU,SAAV,CAAoB,MAA5B;;AAEA,cAAU,SAAV,CAAoB,IAApB,CAAyB,QAAzB;AACA,cAAU,QAAV,CAAoB,IAApB,CAAyB,OAAzB;AACA,cAAU,SAAV,CAAoB,IAApB,CAAyB,EAAzB;AACD;;AAED;AACA,YAAU,SAAV,CAAoB,KAApB,EAA2B,IAA3B,CAAgC,CAAC,QAAD,EAAW,CAAC,CAAC,QAAQ,OAArB,EAA8B,QAAQ,OAAtC,CAAhC;AACD;;AAED,SAAS,cAAT,CAAyB,QAAzB,EAAmC,OAAnC,EAA4C,IAA5C,EAAkD,QAAlD,EAA4D,WAA5D,EAAyE;AACvE,MAAM,UAAU,WAAW,WAAX,CAAhB;AACA,MAAM,YAAY,gBAAgB,IAAhB,CAAlB;AACA,MAAI,aAAa,KAAjB;AACA,MAAI,cAAJ;;AAEA,MAAI,CAAC,SAAL,EAAgB;AAAE;AAAS;;AAE3B;AACA,OAAK,QAAQ,UAAU,SAAV,CAAoB,MAApB,GAA6B,CAA1C,EAA6C,SAAS,CAAtD,EAAyD,OAAzD,EAAkE;AAChE;AACA,QAAI,UAAU,SAAV,CAAoB,KAApB,MAA+B,QAA/B,IACG,UAAU,QAAV,CAAmB,KAAnB,MAA8B,OADrC,EAC8C;;AAE5C,UAAM,YAAY,UAAU,SAAV,CAAoB,KAApB,CAAlB;;AAEA;AACA,WAAK,IAAI,IAAI,UAAU,MAAV,GAAmB,CAAhC,EAAmC,KAAK,CAAxC,EAA2C,GAA3C,EAAgD;AAAA,2BACf,UAAU,CAAV,CADe;AAAA,YACvC,EADuC;AAAA,YACnC,OADmC;AAAA,YAC1B,OAD0B;;AAG9C;;AACA,YAAI,OAAO,QAAP,IAAmB,YAAY,CAAC,CAAC,QAAQ,OAAzC,IAAoD,YAAY,QAAQ,OAA5E,EAAqF;AACnF;AACA,oBAAU,MAAV,CAAiB,CAAjB,EAAoB,CAApB;;AAEA;AACA;AACA,cAAI,CAAC,UAAU,MAAf,EAAuB;AACrB,sBAAU,SAAV,CAAoB,MAApB,CAA2B,KAA3B,EAAkC,CAAlC;AACA,sBAAU,QAAV,CAAoB,MAApB,CAA2B,KAA3B,EAAkC,CAAlC;AACA,sBAAU,SAAV,CAAoB,MAApB,CAA2B,KAA3B,EAAkC,CAAlC;;AAEA;AACA,mBAAO,OAAP,EAAgB,IAAhB,EAAsB,gBAAtB;AACA,mBAAO,OAAP,EAAgB,IAAhB,EAAsB,kBAAtB,EAA0C,IAA1C;;AAEA;AACA,gBAAI,CAAC,UAAU,SAAV,CAAoB,MAAzB,EAAiC;AAC/B,8BAAgB,IAAhB,IAAwB,IAAxB;AACD;AACF;;AAED;AACA,uBAAa,IAAb;AACA;AACD;AACF;;AAED,UAAI,UAAJ,EAAgB;AAAE;AAAQ;AAC3B;AACF;AACF;;AAED;AACA;AACA,SAAS,gBAAT,CAA2B,KAA3B,EAAkC,WAAlC,EAA+C;AAC7C,MAAM,UAAU,WAAW,WAAX,CAAhB;AACA,MAAM,YAAY,EAAlB;AACA,MAAM,YAAY,gBAAgB,MAAM,IAAtB,CAAlB;AACA,MAAM,cAAe,SAAS,gBAAT,CAA0B,MAAM,IAAN,GAC3C,MAAM,IAAN,CAAW,CAAX,CAD2C,GAE3C,MAAM,MAFW,CAArB;AAGA,MAAI,UAAU,WAAd;;AAEA;AACA,UAAQ,SAAR,EAAmB,KAAnB;;AAEA,YAAU,aAAV,GAA0B,KAA1B;AACA,YAAU,cAAV,GAA2B,sBAA3B;;AAEA;AACA,SAAO,GAAG,OAAH,CAAW,OAAX,CAAP,EAA4B;AAC1B,SAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,UAAU,SAAV,CAAoB,MAAxC,EAAgD,GAAhD,EAAqD;AACnD,UAAM,WAAW,UAAU,SAAV,CAAoB,CAApB,CAAjB;AACA,UAAM,UAAU,UAAU,QAAV,CAAmB,CAAnB,CAAhB;;AAEA,UAAI,SAAS,eAAT,CAAyB,OAAzB,EAAkC,QAAlC,KACG,SAAS,YAAT,CAAsB,OAAtB,EAA+B,WAA/B,CADH,IAEG,SAAS,YAAT,CAAsB,OAAtB,EAA+B,OAA/B,CAFP,EAEgD;;AAE9C,YAAM,YAAY,UAAU,SAAV,CAAoB,CAApB,CAAlB;;AAEA,kBAAU,aAAV,GAA0B,OAA1B;;AAEA,aAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,UAAU,MAA9B,EAAsC,GAAtC,EAA2C;AAAA,6BACV,UAAU,CAAV,CADU;AAAA,cAClC,EADkC;AAAA,cAC9B,OAD8B;AAAA,cACrB,OADqB;;;AAGzC,cAAI,YAAY,CAAC,CAAC,QAAQ,OAAtB,IAAiC,YAAY,QAAQ,OAAzD,EAAkE;AAChE,eAAG,SAAH;AACD;AACF;AACF;AACF;;AAED,cAAU,SAAS,UAAT,CAAoB,OAApB,CAAV;AACD;AACF;;AAED,SAAS,kBAAT,CAA6B,KAA7B,EAAoC;AAClC,SAAO,iBAAiB,IAAjB,CAAsB,IAAtB,EAA4B,KAA5B,EAAmC,IAAnC,CAAP;AACD;;AAED,SAAS,UAAT,GAAuB;AACrB,OAAK,WAAL,GAAmB,KAAnB;AACD;;AAED,SAAS,sBAAT,GAAmC;AACjC,OAAK,aAAL,CAAmB,cAAnB;AACD;;AAED,SAAS,QAAT,GAAqB;AACnB,OAAK,YAAL,GAAoB,IAApB;AACD;;AAED,SAAS,WAAT,GAAwB;AACtB,OAAK,YAAL,GAAoB,IAApB;AACA,OAAK,2BAAL,GAAmC,IAAnC;AACD;;AAED,SAAS,UAAT,CAAqB,KAArB,EAA4B;AAC1B,SAAO,GAAG,MAAH,CAAU,KAAV,IAAkB,KAAlB,GAA0B,EAAE,SAAS,KAAX,EAAjC;AACD;;AAED,OAAO,OAAP,GAAiB;AACf,UADe;AAEf,gBAFe;;AAIf,0BAJe;AAKf,gCALe;;AAOf,oCAPe;AAQf,wCARe;AASf,kCATe;AAUf,sBAVe;;AAYf,gCAZe;AAaf,kCAbe;;AAef,aAAW,QAfI;AAgBf,YAAU,OAhBK;AAiBf,sBAAoB;AAjBL,CAAjB;;;;;ACrVA,OAAO,OAAP,GAAiB,SAAS,MAAT,CAAiB,IAAjB,EAAuB,MAAvB,EAA+B;AAC9C,OAAK,IAAM,IAAX,IAAmB,MAAnB,EAA2B;AACzB,SAAK,IAAL,IAAa,OAAO,IAAP,CAAb;AACD;AACD,SAAO,IAAP;AACD,CALD;;;;;eCGI,QAAQ,QAAR,C;IAFF,e,YAAA,e;IACA,Q,YAAA,Q;;AAGF,OAAO,OAAP,GAAiB,UAAU,MAAV,EAAkB,OAAlB,EAA2B,MAA3B,EAAmC;AAClD,MAAM,gBAAgB,OAAO,OAAP,CAAe,MAAf,CAAtB;AACA,MAAM,eAAe,iBAAiB,cAAc,MAApD;AACA,MAAM,SAAS,gBAAgB,OAAO,OAAP,CAAe,MAA9C;;AAEA,MAAM,aAAa,gBAAgB,MAAhB,EAAwB,MAAxB,EAAgC,OAAhC,EAAyC,CAAC,UAAU,OAAX,CAAzC,CAAnB;;AAEA,SAAO,SAAS,UAAT,KAAwB,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EAA/B;AACD,CARD;;;;;ACLA,OAAO,OAAP,GAAiB,UAAC,CAAD,EAAI,CAAJ;AAAA,SAAW,KAAK,IAAL,CAAU,IAAI,CAAJ,GAAQ,IAAI,CAAtB,CAAX;AAAA,CAAjB;;;;;ACAA,IAAM,SAAS,QAAQ,UAAR,CAAf;AACA,IAAM,MAAS,QAAQ,UAAR,CAAf;;AAEA,IAAM,QAAQ;AACZ,YAAU,kBAAU,MAAV,EAAkB,OAAlB,EAA2B;AACnC,QAAI,SAAS,KAAb;;AAEA,WAAO,YAAY;AACjB,UAAI,CAAC,MAAL,EAAa;AACX,YAAI,MAAJ,CAAW,OAAX,CAAmB,IAAnB,CAAwB,OAAxB;AACA,iBAAS,IAAT;AACD;;AAED,aAAO,OAAO,KAAP,CAAa,IAAb,EAAmB,SAAnB,CAAP;AACD,KAPD;AAQD,GAZW;;AAcZ;AACA,oBAAkB,0BAAU,CAAV,EAAa,EAAb,EAAiB,EAAjB,EAAqB,EAArB,EAAyB;AACzC,QAAM,KAAK,IAAI,CAAf;AACA,WAAO,KAAK,EAAL,GAAU,EAAV,GAAe,IAAI,EAAJ,GAAS,CAAT,GAAa,EAA5B,GAAiC,IAAI,CAAJ,GAAQ,EAAhD;AACD,GAlBW;;AAoBZ,0BAAwB,gCAAU,MAAV,EAAkB,MAAlB,EAA0B,GAA1B,EAA+B,GAA/B,EAAoC,IAApC,EAA0C,IAA1C,EAAgD,QAAhD,EAA0D;AAChF,WAAO;AACL,SAAI,MAAM,gBAAN,CAAuB,QAAvB,EAAiC,MAAjC,EAAyC,GAAzC,EAA8C,IAA9C,CADC;AAEL,SAAI,MAAM,gBAAN,CAAuB,QAAvB,EAAiC,MAAjC,EAAyC,GAAzC,EAA8C,IAA9C;AAFC,KAAP;AAID,GAzBW;;AA2BZ;AACA,eAAa,qBAAU,CAAV,EAAa,CAAb,EAAgB,CAAhB,EAAmB,CAAnB,EAAsB;AACjC,SAAK,CAAL;AACA,WAAO,CAAC,CAAD,GAAK,CAAL,IAAQ,IAAE,CAAV,IAAe,CAAtB;AACD,GA/BW;;AAiCZ,cAAY,oBAAU,IAAV,EAAgB,GAAhB,EAAqB;AAC/B,SAAK,IAAL,GAAa,IAAI,IAAjB;AACA,SAAK,IAAL,GAAa,IAAI,IAAjB;AACA,SAAK,KAAL,GAAa,IAAI,KAAjB;;AAEA,WAAO,IAAP;AACD,GAvCW;;AAyCZ,MAAa,QAAQ,MAAR,CAzCD;AA0CZ,UAAa,MA1CD;AA2CZ,SAAa,QAAQ,SAAR,CA3CD;AA4CZ,eAAa,QAAQ,eAAR;AA5CD,CAAd;;AA+CA,OAAO,KAAP,EAAc,QAAQ,OAAR,CAAd;AACA,OAAO,KAAP,EAAc,QAAQ,YAAR,CAAd;AACA,OAAO,KAAP,EAAc,QAAQ,gBAAR,CAAd;AACA,OAAO,KAAP,EAAc,QAAQ,QAAR,CAAd;;AAEA,OAAO,OAAP,GAAiB,KAAjB;;;;;ACvDA,IAAM,QAAU,QAAQ,UAAR,CAAhB;AACA,IAAM,QAAU,QAAQ,SAAR,CAAhB;;AAEA,IAAM,SAAS;AACb,eAAa,CAAE,kBAAF,EAAsB,YAAtB,EAAoC,YAApC,EAAkD,MAAlD,CADA;;AAGb,UAAQ,gBAAU,OAAV,EAAmB,SAAnB,EAA8B,WAA9B,EAA2C;AACjD,QAAM,cAAc,MAAM,cAAN,CAAqB,OAArB,CAApB;AACA,QAAM,YAAY,MAAM,YAAN,CAAmB,OAAnB,CAAlB;AACA,QAAM,UAAU,EAAE,gBAAF,EAAW,oBAAX,EAAsB,wBAAtB,EAAmC,oBAAnC,EAA8C,wBAA9C,EAAhB;;AAEA,yBAAqB,OAAO,WAA5B,kHAAyC;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAA9B,MAA8B;;AACvC,UAAM,cAAc,OAAO,MAAP,EAAe,OAAf,CAApB;;AAEA,UAAI,WAAJ,EAAiB;AACf,eAAO,WAAP;AACD;AACF;AACF,GAfY;;AAiBb;AACA,oBAAkB,iCAAmD;AAAA,QAAvC,WAAuC,SAAvC,WAAuC;AAAA,QAA1B,SAA0B,SAA1B,SAA0B;AAAA,QAAf,WAAe,SAAf,WAAe;;AACnE,QAAI,CAAC,cAAc,IAAd,CAAmB,SAAnB,CAAL,EAAoC;AAClC,aAAO,IAAP;AACD;;AAED,0BAA0B,MAAM,YAAhC,yHAA8C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAAnC,WAAmC;;AAC5C,UAAI,UAAU,WAAd;;AAEA,UAAI,YAAY,UAAZ,IAA0B,YAAY,UAAZ,CAAuB,WAAjD,IACI,YAAY,WAAZ,KAA4B,WADpC,EACkD;AAChD,eAAO,OAAP,EAAgB;AACd;AACA,cAAI,YAAY,YAAY,OAA5B,EAAqC;AACnC,mBAAO,WAAP;AACD;AACD,oBAAU,MAAM,UAAN,CAAiB,OAAjB,CAAV;AACD;AACF;AACF;;AAED,WAAO,IAAP;AACD,GAvCY;;AAyCb;AACA,cAAY,2BAAiD;AAAA,QAArC,SAAqC,SAArC,SAAqC;AAAA,QAA1B,WAA0B,SAA1B,WAA0B;AAAA,QAAb,SAAa,SAAb,SAAa;;AAC3D,QAAI,gBAAgB,OAAhB,IAA2B,gBAAgB,KAA/C,EAAsD;AACpD,aAAO,IAAP;AACD;;AAED,QAAI,uBAAJ;;AAEA,0BAA0B,MAAM,YAAhC,yHAA8C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAAnC,WAAmC;;AAC5C,UAAI,YAAY,WAAZ,KAA4B,WAAhC,EAA6C;AAC3C;AACA,YAAI,YAAY,UAAZ,IAA0B,CAAC,MAAM,QAAN,CAAe,YAAY,UAA3B,EAAuC,SAAvC,CAA/B,EAAkF;AAAE;AAAW;;AAE/F;AACA,YAAI,YAAY,WAAZ,EAAJ,EAA+B;AAC7B,iBAAO,WAAP;AACD;AACD;AAHA,aAIK,IAAI,CAAC,cAAL,EAAqB;AACxB,6BAAiB,WAAjB;AACD;AACF;AACF;;AAED;AACA;AACA,QAAI,cAAJ,EAAoB;AAClB,aAAO,cAAP;AACD;;AAED;AACA;AACA;AACA,0BAA0B,MAAM,YAAhC,yHAA8C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAAnC,YAAmC;;AAC5C,UAAI,aAAY,WAAZ,KAA4B,WAA5B,IAA2C,EAAE,QAAQ,IAAR,CAAa,SAAb,KAA2B,aAAY,UAAzC,CAA/C,EAAqG;AACnG,eAAO,YAAP;AACD;AACF;;AAED,WAAO,IAAP;AACD,GAjFY;;AAmFb;AACA,cAAY,2BAAyB;AAAA,QAAb,SAAa,SAAb,SAAa;;AACnC,0BAA0B,MAAM,YAAhC,yHAA8C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAAnC,WAAmC;;AAC5C,UAAI,MAAM,QAAN,CAAe,YAAY,UAA3B,EAAuC,SAAvC,CAAJ,EAAuD;AACrD,eAAO,WAAP;AACD;AACF;AACF,GA1FY;;AA4Fb;AACA,QAAM,qBAA2B;AAAA,QAAf,WAAe,SAAf,WAAe;;AAC/B,0BAA0B,MAAM,YAAhC,yHAA8C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAAnC,WAAmC;;AAC5C;AACA,UAAI,YAAY,UAAZ,CAAuB,MAAvB,KAAkC,CAAtC,EAAyC;AACvC,YAAM,SAAS,YAAY,MAA3B;AACA;AACA;AACA,YAAI,UAAU,CAAC,OAAO,OAAP,CAAe,OAAf,CAAuB,OAAtC,EAA+C;AAC7C;AACD;AACF;AACD;AARA,WASK,IAAI,YAAY,UAAZ,CAAuB,MAAvB,IAAiC,CAArC,EAAwC;AAC3C;AACD;;AAED,UAAI,CAAC,YAAY,WAAZ,EAAD,IAA+B,gBAAgB,YAAY,WAA/D,EAA6E;AAC3E,eAAO,WAAP;AACD;AACF;;AAED,WAAO,IAAP;AACD;AAnHY,CAAf;;AAsHA,OAAO,OAAP,GAAiB,MAAjB;;;;;;;ACzHA,IAAM,MAAa,QAAQ,UAAR,CAAnB;AACA,IAAM,WAAa,QAAQ,YAAR,CAAnB;;AAEA,IAAM,KAAK;AACT,SAAU,iBAAM,CAAE,CADT;;AAGT,UAAU;AAAA,WAAS,UAAU,IAAI,MAAd,IAAwB,SAAS,KAAT,CAAjC;AAAA,GAHD;;AAKT,WAAU;AAAA,WAAS,GAAG,MAAH,CAAU,KAAV,KAAoB,MAAM,QAAN,KAAmB,EAAhD;AAAA,GALD;;AAOT,UAAU;AAAA,WAAS,CAAC,CAAC,KAAF,IAAY,QAAO,KAAP,yCAAO,KAAP,OAAiB,QAAtC;AAAA,GAPD;;AAST,YAAU;AAAA,WAAS,OAAO,KAAP,KAAiB,UAA1B;AAAA,GATD;;AAWT,UAAU;AAAA,WAAS,OAAO,KAAP,KAAiB,QAA1B;AAAA,GAXD;;AAaT,QAAU;AAAA,WAAS,OAAO,KAAP,KAAiB,SAA1B;AAAA,GAbD;;AAeT,UAAU;AAAA,WAAS,OAAO,KAAP,KAAiB,QAA1B;AAAA,GAfD;;AAiBT,WAAS,wBAAS;AAChB,QAAI,CAAC,KAAD,IAAW,QAAO,KAAP,yCAAO,KAAP,OAAiB,QAAhC,EAA2C;AAAE,aAAO,KAAP;AAAe;;AAE5D,QAAM,UAAU,IAAI,SAAJ,CAAc,KAAd,KAAwB,IAAI,MAA5C;;AAEA,WAAQ,mBAAkB,IAAlB,SAA8B,QAAQ,OAAtC,KACJ,iBAAiB,QAAQ,OADrB,CAC6B;AAD7B,QAEJ,MAAM,QAAN,KAAmB,CAAnB,IAAwB,OAAO,MAAM,QAAb,KAA0B;AAFtD;AAGD;AAzBQ,CAAX;;AA4BA,GAAG,KAAH,GAAW;AAAA,SAAU,GAAG,MAAH,CAAU,KAAV,KACf,OAAO,MAAM,MAAb,KAAwB,WADT,IAEhB,GAAG,QAAH,CAAY,MAAM,MAAlB,CAFM;AAAA,CAAX;;AAIA,OAAO,OAAP,GAAiB,EAAjB;;;;;ACnCA,OAAO,OAAP,GAAiB,UAAC,KAAD;AAAA,SAAW,CAAC,EAAE,SAAS,MAAM,MAAjB,CAAD,IAA8B,iBAAiB,MAAM,MAAhE;AAAA,CAAjB;;;;;ACAA,SAAS,aAAT,CAAwB,IAAxB,EAA8B,MAA9B,EAAsC;AACpC,OAAK,IAAM,IAAX,IAAmB,MAAnB,EAA2B;AACzB,QAAM,kBAAkB,OAAO,OAAP,CAAe,eAAvC;AACA,QAAI,aAAa,KAAjB;;AAEA;AACA,SAAK,IAAM,MAAX,IAAqB,eAArB,EAAsC;AACpC,UAAI,KAAK,OAAL,CAAa,MAAb,MAAyB,CAAzB,IAA8B,gBAAgB,MAAhB,EAAwB,IAAxB,CAA6B,IAA7B,CAAlC,EAAsE;AACpE,qBAAa,IAAb;AACA;AACD;AACF;;AAED,QAAI,CAAC,UAAD,IAAe,OAAO,OAAO,IAAP,CAAP,KAAwB,UAA3C,EAAuD;AACrD,WAAK,IAAL,IAAa,OAAO,IAAP,CAAb;AACD;AACF;AACD,SAAO,IAAP;AACD;;AAED,cAAc,eAAd,GAAgC;AAC9B,UAAQ;AADsB,CAAhC;;AAIA,OAAO,OAAP,GAAiB,aAAjB;;;;;ACxBA,IAAM,QAAgB,QAAQ,SAAR,CAAtB;AACA,IAAM,UAAgB,QAAQ,WAAR,CAAtB;AACA,IAAM,MAAgB,QAAQ,cAAR,CAAtB;AACA,IAAM,WAAgB,QAAQ,YAAR,CAAtB;AACA,IAAM,aAAgB,QAAQ,cAAR,CAAtB;AACA,IAAM,KAAgB,QAAQ,MAAR,CAAtB;AACA,IAAM,gBAAgB,QAAQ,iBAAR,CAAtB;;AAEA,IAAM,eAAe;AACnB,cAAY,oBAAU,IAAV,EAAgB,GAAhB,EAAqB;AAC/B,SAAK,IAAL,GAAY,KAAK,IAAL,IAAa,EAAzB;AACA,SAAK,IAAL,CAAU,CAAV,GAAc,IAAI,IAAJ,CAAS,CAAvB;AACA,SAAK,IAAL,CAAU,CAAV,GAAc,IAAI,IAAJ,CAAS,CAAvB;;AAEA,SAAK,MAAL,GAAc,KAAK,MAAL,IAAe,EAA7B;AACA,SAAK,MAAL,CAAY,CAAZ,GAAgB,IAAI,MAAJ,CAAW,CAA3B;AACA,SAAK,MAAL,CAAY,CAAZ,GAAgB,IAAI,MAAJ,CAAW,CAA3B;;AAEA,SAAK,SAAL,GAAiB,IAAI,SAArB;AACD,GAXkB;;AAanB,kBAAgB,wBAAU,SAAV,EAAqB,IAArB,EAA2B,GAA3B,EAAgC;AAC9C,cAAU,IAAV,CAAe,CAAf,GAAsB,IAAI,IAAJ,CAAS,CAAT,GAAgB,KAAK,IAAL,CAAU,CAAhD;AACA,cAAU,IAAV,CAAe,CAAf,GAAsB,IAAI,IAAJ,CAAS,CAAT,GAAgB,KAAK,IAAL,CAAU,CAAhD;AACA,cAAU,MAAV,CAAiB,CAAjB,GAAsB,IAAI,MAAJ,CAAW,CAAX,GAAgB,KAAK,MAAL,CAAY,CAAlD;AACA,cAAU,MAAV,CAAiB,CAAjB,GAAsB,IAAI,MAAJ,CAAW,CAAX,GAAgB,KAAK,MAAL,CAAY,CAAlD;AACA,cAAU,SAAV,GAAsB,IAAI,SAAJ,GAAgB,KAAK,SAA3C;;AAEA;AACA,QAAM,KAAK,KAAK,GAAL,CAAS,UAAU,SAAV,GAAsB,IAA/B,EAAqC,KAArC,CAAX;;AAEA,cAAU,IAAV,CAAe,KAAf,GAAyB,MAAM,UAAU,IAAV,CAAe,CAArB,EAAwB,UAAU,IAAV,CAAe,CAAvC,IAA4C,EAArE;AACA,cAAU,IAAV,CAAe,EAAf,GAAyB,UAAU,IAAV,CAAe,CAAf,GAAmB,EAA5C;AACA,cAAU,IAAV,CAAe,EAAf,GAAyB,UAAU,IAAV,CAAe,CAAf,GAAmB,EAA5C;;AAEA,cAAU,MAAV,CAAiB,KAAjB,GAAyB,MAAM,UAAU,MAAV,CAAiB,CAAvB,EAA0B,UAAU,IAAV,CAAe,CAAzC,IAA8C,EAAvE;AACA,cAAU,MAAV,CAAiB,EAAjB,GAAyB,UAAU,MAAV,CAAiB,CAAjB,GAAqB,EAA9C;AACA,cAAU,MAAV,CAAiB,EAAjB,GAAyB,UAAU,MAAV,CAAiB,CAAjB,GAAqB,EAA9C;AACD,GA9BkB;;AAgCnB,mBAAiB,yBAAW,OAAX,EAAoB;AACnC,WAAQ,mBAAmB,IAAI,KAAvB,IAAgC,mBAAmB,IAAI,KAA/D;AACD,GAlCkB;;AAoCnB;AACA,SAAO,eAAU,IAAV,EAAgB,OAAhB,EAAyB,EAAzB,EAA6B;AAClC,SAAK,MAAM,EAAX;AACA,WAAO,QAAQ,MAAf;;AAEA,OAAG,CAAH,GAAO,QAAQ,OAAO,GAAf,CAAP;AACA,OAAG,CAAH,GAAO,QAAQ,OAAO,GAAf,CAAP;;AAEA,WAAO,EAAP;AACD,GA7CkB;;AA+CnB,aAAW,mBAAU,OAAV,EAAmB,IAAnB,EAAyB;AAClC,WAAO,QAAQ,EAAf;;AAEA;AACA,QAAI,QAAQ,aAAR,IAAyB,aAAa,eAAb,CAA6B,OAA7B,CAA7B,EAAoE;AAClE,mBAAa,KAAb,CAAmB,QAAnB,EAA6B,OAA7B,EAAsC,IAAtC;;AAEA,WAAK,CAAL,IAAU,OAAO,OAAjB;AACA,WAAK,CAAL,IAAU,OAAO,OAAjB;AACD,KALD,MAMK;AACH,mBAAa,KAAb,CAAmB,MAAnB,EAA2B,OAA3B,EAAoC,IAApC;AACD;;AAED,WAAO,IAAP;AACD,GA9DkB;;AAgEnB,eAAa,qBAAU,OAAV,EAAmB,MAAnB,EAA2B;AACtC,aAAS,UAAU,EAAnB;;AAEA,QAAI,QAAQ,aAAR,IAAyB,aAAa,eAAb,CAA6B,OAA7B,CAA7B,EAAoE;AAClE;AACA,mBAAa,KAAb,CAAmB,QAAnB,EAA6B,OAA7B,EAAsC,MAAtC;AACD,KAHD,MAIK;AACH,mBAAa,KAAb,CAAmB,QAAnB,EAA6B,OAA7B,EAAsC,MAAtC;AACD;;AAED,WAAO,MAAP;AACD,GA5EkB;;AA8EnB,gBAAc,sBAAU,OAAV,EAAmB;AAC/B,WAAO,GAAG,MAAH,CAAU,QAAQ,SAAlB,IAA8B,QAAQ,SAAtC,GAAkD,QAAQ,UAAjE;AACD,GAhFkB;;AAkFnB,aAAW,mBAAU,SAAV,EAAqB,QAArB,EAA+B,SAA/B,EAA0C;AACnD,QAAM,UAAW,SAAS,MAAT,GAAkB,CAAlB,GACE,aAAa,cAAb,CAA4B,QAA5B,CADF,GAEE,SAAS,CAAT,CAFnB;;AAIA,QAAM,QAAQ,EAAd;;AAEA,iBAAa,SAAb,CAAuB,OAAvB,EAAgC,KAAhC;AACA,cAAU,IAAV,CAAe,CAAf,GAAmB,MAAM,CAAzB;AACA,cAAU,IAAV,CAAe,CAAf,GAAmB,MAAM,CAAzB;;AAEA,iBAAa,WAAb,CAAyB,OAAzB,EAAkC,KAAlC;AACA,cAAU,MAAV,CAAiB,CAAjB,GAAqB,MAAM,CAA3B;AACA,cAAU,MAAV,CAAiB,CAAjB,GAAqB,MAAM,CAA3B;;AAEA,cAAU,SAAV,GAAsB,GAAG,MAAH,CAAU,SAAV,IAAuB,SAAvB,GAAkC,IAAI,IAAJ,GAAW,OAAX,EAAxD;AACD,GAlGkB;;AAoGnB,iBAAe,aApGI;;AAsGnB,gBAAc,sBAAU,KAAV,EAAiB;AAC7B,QAAM,UAAU,EAAhB;;AAEA;AACA,QAAI,GAAG,KAAH,CAAS,KAAT,CAAJ,EAAqB;AACnB,cAAQ,CAAR,IAAa,MAAM,CAAN,CAAb;AACA,cAAQ,CAAR,IAAa,MAAM,CAAN,CAAb;AACD;AACD;AAJA,SAKK;AACH,YAAI,MAAM,IAAN,KAAe,UAAnB,EAA+B;AAC7B,cAAI,MAAM,OAAN,CAAc,MAAd,KAAyB,CAA7B,EAAgC;AAC9B,oBAAQ,CAAR,IAAa,MAAM,OAAN,CAAc,CAAd,CAAb;AACA,oBAAQ,CAAR,IAAa,MAAM,cAAN,CAAqB,CAArB,CAAb;AACD,WAHD,MAIK,IAAI,MAAM,OAAN,CAAc,MAAd,KAAyB,CAA7B,EAAgC;AACnC,oBAAQ,CAAR,IAAa,MAAM,cAAN,CAAqB,CAArB,CAAb;AACA,oBAAQ,CAAR,IAAa,MAAM,cAAN,CAAqB,CAArB,CAAb;AACD;AACF,SATD,MAUK;AACH,kBAAQ,CAAR,IAAa,MAAM,OAAN,CAAc,CAAd,CAAb;AACA,kBAAQ,CAAR,IAAa,MAAM,OAAN,CAAc,CAAd,CAAb;AACD;AACF;;AAED,WAAO,OAAP;AACD,GAjIkB;;AAmInB,kBAAgB,wBAAU,QAAV,EAAoB;AAClC,QAAM,UAAU;AACd,aAAS,CADK;AAEd,aAAS,CAFK;AAGd,eAAS,CAHK;AAId,eAAS,CAJK;AAKd,eAAS,CALK;AAMd,eAAS;AANK,KAAhB;;AASA,yBAAsB,QAAtB,kHAAgC;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAArB,OAAqB;;AAC9B,WAAK,IAAM,KAAX,IAAmB,OAAnB,EAA4B;AAC1B,gBAAQ,KAAR,KAAiB,QAAQ,KAAR,CAAjB;AACD;AACF;AACD,SAAK,IAAM,IAAX,IAAmB,OAAnB,EAA4B;AAC1B,cAAQ,IAAR,KAAiB,SAAS,MAA1B;AACD;;AAED,WAAO,OAAP;AACD,GAvJkB;;AAyJnB,aAAW,mBAAU,KAAV,EAAiB;AAC1B,QAAI,CAAC,MAAM,MAAP,IAAiB,EAAE,MAAM,OAAN,IAAiB,MAAM,OAAN,CAAc,MAAd,GAAuB,CAA1C,CAArB,EAAmE;AACjE;AACD;;AAED,QAAM,UAAU,aAAa,YAAb,CAA0B,KAA1B,CAAhB;AACA,QAAM,OAAO,KAAK,GAAL,CAAS,QAAQ,CAAR,EAAW,KAApB,EAA2B,QAAQ,CAAR,EAAW,KAAtC,CAAb;AACA,QAAM,OAAO,KAAK,GAAL,CAAS,QAAQ,CAAR,EAAW,KAApB,EAA2B,QAAQ,CAAR,EAAW,KAAtC,CAAb;AACA,QAAM,OAAO,KAAK,GAAL,CAAS,QAAQ,CAAR,EAAW,KAApB,EAA2B,QAAQ,CAAR,EAAW,KAAtC,CAAb;AACA,QAAM,OAAO,KAAK,GAAL,CAAS,QAAQ,CAAR,EAAW,KAApB,EAA2B,QAAQ,CAAR,EAAW,KAAtC,CAAb;;AAEA,WAAO;AACL,SAAG,IADE;AAEL,SAAG,IAFE;AAGL,YAAM,IAHD;AAIL,WAAK,IAJA;AAKL,aAAO,OAAO,IALT;AAML,cAAQ,OAAO;AANV,KAAP;AAQD,GA5KkB;;AA8KnB,iBAAe,uBAAU,KAAV,EAAiB,WAAjB,EAA8B;AAC3C,QAAM,UAAU,cAAc,GAA9B;AACA,QAAM,UAAU,cAAc,GAA9B;AACA,QAAM,UAAU,aAAa,YAAb,CAA0B,KAA1B,CAAhB;;AAGA,QAAM,KAAK,QAAQ,CAAR,EAAW,OAAX,IAAsB,QAAQ,CAAR,EAAW,OAAX,CAAjC;AACA,QAAM,KAAK,QAAQ,CAAR,EAAW,OAAX,IAAsB,QAAQ,CAAR,EAAW,OAAX,CAAjC;;AAEA,WAAO,MAAM,EAAN,EAAU,EAAV,CAAP;AACD,GAxLkB;;AA0LnB,cAAY,oBAAU,KAAV,EAAiB,SAAjB,EAA4B,WAA5B,EAAyC;AACnD,QAAM,UAAU,cAAc,GAA9B;AACA,QAAM,UAAU,cAAc,GAA9B;AACA,QAAM,UAAU,aAAa,YAAb,CAA0B,KAA1B,CAAhB;AACA,QAAM,KAAK,QAAQ,CAAR,EAAW,OAAX,IAAsB,QAAQ,CAAR,EAAW,OAAX,CAAjC;AACA,QAAM,KAAK,QAAQ,CAAR,EAAW,OAAX,IAAsB,QAAQ,CAAR,EAAW,OAAX,CAAjC;AACA,QAAM,QAAQ,MAAM,KAAK,KAAL,CAAW,EAAX,EAAgB,EAAhB,CAAN,GAA4B,KAAK,EAA/C;;AAEA,WAAQ,KAAR;AACD,GAnMkB;;AAqMnB,kBAAgB,wBAAU,OAAV,EAAmB;AACjC,WAAO,GAAG,MAAH,CAAU,QAAQ,WAAlB,IACH,QAAQ,WADL,GAEH,GAAG,MAAH,CAAU,QAAQ,WAAlB,IACE,CAAC,SAAD,EAAY,SAAZ,EAAsB,OAAtB,EAA+B,KAA/B,EAAsC,OAAtC,EAA+C,QAAQ,WAAvD;AACA;AACA;AAHF,MAII,QAAQ,IAAR,CAAa,QAAQ,IAArB,KAA8B,mBAAmB,WAAW,KAA5D,GACE,OADF,GAEE,OARV;AASD,GA/MkB;;AAiNnB;AACA,mBAAiB,yBAAU,KAAV,EAAiB;AAChC,WAAO,CACL,SAAS,gBAAT,CAA0B,MAAM,IAAN,GAAa,MAAM,IAAN,CAAW,CAAX,CAAb,GAA6B,MAAM,MAA7D,CADK,EAEL,SAAS,gBAAT,CAA0B,MAAM,aAAhC,CAFK,CAAP;AAID;AAvNkB,CAArB;;AA0NA,OAAO,OAAP,GAAiB,YAAjB;;;;;eClOmB,QAAQ,UAAR,C;IAAX,M,YAAA,M;;AAER,IAAM,UAAU,CAAC,IAAD,EAAO,KAAP,EAAc,QAAd,EAAwB,GAAxB,CAAhB;AACA,IAAI,WAAW,CAAf;AACA,IAAI,gBAAJ;AACA,IAAI,eAAJ;;AAEA,KAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,QAAQ,MAAZ,IAAsB,CAAC,OAAO,qBAA9C,EAAqE,GAArE,EAA0E;AACxE,YAAU,OAAO,QAAQ,CAAR,IAAa,uBAApB,CAAV;AACA,WAAS,OAAO,QAAQ,CAAR,IAAY,sBAAnB,KAA8C,OAAO,QAAQ,CAAR,IAAa,6BAApB,CAAvD;AACD;;AAED,IAAI,CAAC,OAAL,EAAc;AACZ,YAAU,iBAAU,QAAV,EAAoB;AAC5B,QAAM,WAAW,IAAI,IAAJ,GAAW,OAAX,EAAjB;AACA,QAAM,aAAa,KAAK,GAAL,CAAS,CAAT,EAAY,MAAM,WAAW,QAAjB,CAAZ,CAAnB;AACA,QAAM,KAAK,WAAW,YAAY;AAAE,eAAS,WAAW,UAApB;AAAkC,KAA3D,EACW,UADX,CAAX;;AAGA,eAAW,WAAW,UAAtB;AACA,WAAO,EAAP;AACD,GARD;AASD;;AAED,IAAI,CAAC,MAAL,EAAa;AACX,WAAS,gBAAU,EAAV,EAAc;AACrB,iBAAa,EAAb;AACD,GAFD;AAGD;;AAED,OAAO,OAAP,GAAiB;AACf,kBADe;AAEf;AAFe,CAAjB;;;;;AC9BA,IAAM,SAAS,QAAQ,UAAR,CAAf;AACA,IAAM,KAAK,QAAQ,MAAR,CAAX;;eAKI,QAAQ,YAAR,C;IAHF,O,YAAA,O;IACA,U,YAAA,U;IACA,c,YAAA,c;;AAGF,IAAM,YAAY;AAChB,yBAAuB,+BAAU,KAAV,EAAiB,YAAjB,EAA+B,OAA/B,EAAwC;AAC7D,QAAI,CAAC,GAAG,MAAH,CAAU,KAAV,CAAL,EAAuB;AACrB,aAAO,IAAP;AACD;;AAED,QAAI,UAAU,QAAd,EAAwB;AACtB,cAAQ,WAAW,OAAX,CAAR;AACD,KAFD,MAGK,IAAI,UAAU,MAAd,EAAsB;AACzB,cAAQ,aAAa,OAAb,CAAqB,OAArB,CAAR;AACD,KAFI,MAGA;AACH,cAAQ,QAAQ,OAAR,EAAiB,KAAjB,CAAR;AACD;;AAED,WAAO,KAAP;AACD,GAjBe;;AAmBhB,mBAAiB,yBAAU,KAAV,EAAiB,YAAjB,EAA+B,OAA/B,EAAwC,YAAxC,EAAsD;AACrE,YAAQ,UAAU,qBAAV,CAAgC,KAAhC,EAAuC,YAAvC,EAAqD,OAArD,KAAiE,KAAzE;;AAEA,QAAI,GAAG,QAAH,CAAY,KAAZ,CAAJ,EAAwB;AACtB,cAAQ,MAAM,KAAN,CAAY,IAAZ,EAAkB,YAAlB,CAAR;AACD;;AAED,QAAI,GAAG,OAAH,CAAW,KAAX,CAAJ,EAAuB;AACrB,cAAQ,eAAe,KAAf,CAAR;AACD;;AAED,WAAO,KAAP;AACD,GA/Be;;AAiChB,YAAU,kBAAU,IAAV,EAAgB;AACxB,WAAQ,QAAQ;AACd,SAAG,OAAO,IAAP,GAAc,KAAK,CAAnB,GAAuB,KAAK,IADjB;AAEd,SAAG,OAAO,IAAP,GAAc,KAAK,CAAnB,GAAuB,KAAK;AAFjB,KAAhB;AAID,GAtCe;;AAwChB,cAAY,oBAAU,IAAV,EAAgB;AAC1B,QAAI,QAAQ,EAAE,UAAU,IAAV,IAAkB,SAAS,IAA7B,CAAZ,EAAgD;AAC9C,aAAO,OAAO,EAAP,EAAW,IAAX,CAAP;;AAEA,WAAK,IAAL,GAAc,KAAK,CAAL,IAAU,CAAxB;AACA,WAAK,GAAL,GAAc,KAAK,CAAL,IAAU,CAAxB;AACA,WAAK,KAAL,GAAc,KAAK,KAAL,IAAiB,KAAK,IAAL,GAAY,KAAK,KAAhD;AACA,WAAK,MAAL,GAAc,KAAK,MAAL,IAAiB,KAAK,GAAL,GAAW,KAAK,MAA/C;AACD;;AAED,WAAO,IAAP;AACD,GAnDe;;AAqDhB,cAAY,oBAAU,IAAV,EAAgB;AAC1B,QAAI,QAAQ,EAAE,OAAO,IAAP,IAAe,OAAO,IAAxB,CAAZ,EAA2C;AACzC,aAAO,OAAO,EAAP,EAAW,IAAX,CAAP;;AAEA,WAAK,CAAL,GAAc,KAAK,IAAL,IAAa,CAA3B;AACA,WAAK,GAAL,GAAc,KAAK,GAAL,IAAa,CAA3B;AACA,WAAK,KAAL,GAAc,KAAK,KAAL,IAAgB,KAAK,KAAL,GAAc,KAAK,CAAjD;AACA,WAAK,MAAL,GAAc,KAAK,MAAL,IAAgB,KAAK,MAAL,GAAc,KAAK,CAAjD;AACD;;AAED,WAAO,IAAP;AACD;AAhEe,CAAlB;;AAmEA,OAAO,OAAP,GAAiB,SAAjB;;;;;AC3EA,IAAM,MAAM,OAAO,OAAnB;AACA,IAAM,WAAW,QAAQ,YAAR,CAAjB;;AAEA,SAAS,IAAT,CAAe,MAAf,EAAuB;AACrB;;AAEA,MAAI,UAAJ,GAAiB,MAAjB;;AAEA;AACA,MAAM,KAAK,OAAO,QAAP,CAAgB,cAAhB,CAA+B,EAA/B,CAAX;;AAEA;AACA,MAAI,GAAG,aAAH,KAAqB,OAAO,QAA5B,IACG,OAAO,OAAO,IAAd,KAAuB,UAD1B,IAEC,OAAO,IAAP,CAAY,EAAZ,MAAoB,EAFzB,EAE6B;AAC3B;AACA,aAAS,OAAO,IAAP,CAAY,MAAZ,CAAT;AACD;;AAED,MAAI,MAAJ,GAAa,MAAb;AACD;;AAED,IAAI,OAAO,MAAP,KAAkB,WAAtB,EAAmC;AACjC,MAAI,MAAJ,GAAiB,SAAjB;AACA,MAAI,UAAJ,GAAiB,SAAjB;AACD,CAHD,MAIK;AACH,OAAK,MAAL;AACD;;AAED,IAAI,SAAJ,GAAgB,SAAS,SAAT,CAAoB,IAApB,EAA0B;AACxC,MAAI,SAAS,IAAT,CAAJ,EAAoB;AAClB,WAAO,IAAP;AACD;;AAED,MAAM,WAAY,KAAK,aAAL,IAAsB,IAAxC;;AAEA,SAAO,SAAS,WAAT,IAAwB,SAAS,YAAjC,IAAiD,IAAI,MAA5D;AACD,CARD;;AAUA,IAAI,IAAJ,GAAW,IAAX","file":"interact.js","sourceRoot":"","sourcesContent":["/**\n * interact.js v1.3.0-alpha.4+sha.7970416-dirty\n *\n * Copyright (c) 2012-2017 Taye Adeyemi \n * Open source under the MIT License.\n * https://raw.github.com/taye/interact.js/master/LICENSE\n */\n","(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o 150) {\n return null;\n }\n\n let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI;\n const overlap = 22.5;\n\n if (angle < 0) {\n angle += 360;\n }\n\n const left = 135 - overlap <= angle && angle < 225 + overlap;\n const up = 225 - overlap <= angle && angle < 315 + overlap;\n\n const right = !left && (315 - overlap <= angle || angle < 45 + overlap);\n const down = !up && 45 - overlap <= angle && angle < 135 + overlap;\n\n return {\n up,\n down,\n left,\n right,\n angle,\n speed: interaction.prevEvent.speed,\n velocity: {\n x: interaction.prevEvent.velocityX,\n y: interaction.prevEvent.velocityY,\n },\n };\n }\n\n preventDefault () {}\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n}\n\nsignals.on('set-delta', function ({ iEvent, interaction, starting, deltaSource }) {\n const prevEvent = starting? iEvent : interaction.prevEvent;\n\n if (deltaSource === 'client') {\n iEvent.dx = iEvent.clientX - prevEvent.clientX;\n iEvent.dy = iEvent.clientY - prevEvent.clientY;\n }\n else {\n iEvent.dx = iEvent.pageX - prevEvent.pageX;\n iEvent.dy = iEvent.pageY - prevEvent.pageY;\n }\n});\n\nInteractEvent.signals = signals;\n\nmodule.exports = InteractEvent;\n","const is = require('./utils/is');\nconst events = require('./utils/events');\nconst extend = require('./utils/extend');\nconst actions = require('./actions/base');\nconst scope = require('./scope');\nconst Eventable = require('./Eventable');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nconst {\n getElementRect,\n nodeContains,\n trySelector,\n} = require('./utils/domUtils');\nconst { getWindow } = require('./utils/window');\nconst { indexOf, contains } = require('./utils/arr');\nconst { wheelEvent } = require('./utils/browser');\n\n// all set interactables\nscope.interactables = [];\n\n/*\\\n * Interactable\n [ property ]\n **\n * Object type returned by @interact\n\\*/\nclass Interactable {\n constructor (target, options) {\n options = options || {};\n\n this.target = target;\n this.events = new Eventable();\n this._context = options.context || scope.document;\n this._win = getWindow(trySelector(target)? this._context : target);\n this._doc = this._win.document;\n\n signals.fire('new', {\n target,\n options,\n interactable: this,\n win: this._win,\n });\n\n scope.addDocument( this._doc, this._win );\n\n scope.interactables.push(this);\n\n this.set(options);\n }\n\n setOnEvents (action, phases) {\n const onAction = 'on' + action;\n\n if (is.function(phases.onstart) ) { this.events[onAction + 'start' ] = phases.onstart ; }\n if (is.function(phases.onmove) ) { this.events[onAction + 'move' ] = phases.onmove ; }\n if (is.function(phases.onend) ) { this.events[onAction + 'end' ] = phases.onend ; }\n if (is.function(phases.oninertiastart)) { this.events[onAction + 'inertiastart' ] = phases.oninertiastart ; }\n\n return this;\n }\n\n setPerAction (action, options) {\n // for all the default per-action options\n for (const option in options) {\n // if this option exists for this action\n if (option in defaults[action]) {\n // if the option in the options arg is an object value\n if (is.object(options[option])) {\n // duplicate the object\n this.options[action][option] = extend(this.options[action][option] || {}, options[option]);\n\n if (is.object(defaults.perAction[option]) && 'enabled' in defaults.perAction[option]) {\n this.options[action][option].enabled = options[option].enabled === false? false : true;\n }\n }\n else if (is.bool(options[option]) && is.object(defaults.perAction[option])) {\n this.options[action][option].enabled = options[option];\n }\n else if (options[option] !== undefined) {\n // or if it's not undefined, do a plain assignment\n this.options[action][option] = options[option];\n }\n }\n }\n }\n\n /*\\\n * Interactable.getRect\n [ method ]\n *\n * The default function to get an Interactables bounding rect. Can be\n * overridden using @Interactable.rectChecker.\n *\n - element (Element) #optional The element to measure.\n = (object) The object's bounding rectangle.\n o {\n o top : 0,\n o left : 0,\n o bottom: 0,\n o right : 0,\n o width : 0,\n o height: 0\n o }\n \\*/\n getRect (element) {\n element = element || this.target;\n\n if (is.string(this.target) && !(is.element(element))) {\n element = this._context.querySelector(this.target);\n }\n\n return getElementRect(element);\n }\n\n /*\\\n * Interactable.rectChecker\n [ method ]\n *\n * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n - checker (function) #optional A function which returns this Interactable's bounding rectangle. See @Interactable.getRect\n = (function | object) The checker function or this Interactable\n \\*/\n rectChecker (checker) {\n if (is.function(checker)) {\n this.getRect = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.getRect;\n\n return this;\n }\n\n return this.getRect;\n }\n\n _backCompatOption (optionName, newValue) {\n if (trySelector(newValue) || is.object(newValue)) {\n this.options[optionName] = newValue;\n\n for (const action of actions.names) {\n this.options[action][optionName] = newValue;\n }\n\n return this;\n }\n\n return this.options[optionName];\n }\n\n /*\\\n * Interactable.origin\n [ method ]\n *\n * Gets or sets the origin of the Interactable's element. The x and y\n * of the origin will be subtracted from action event coordinates.\n *\n - origin (object | string) #optional An object eg. { x: 0, y: 0 } or string 'parent', 'self' or any CSS selector\n * OR\n - origin (Element) #optional An HTML or SVG Element whose rect will be used\n **\n = (object) The current origin or this Interactable\n \\*/\n origin (newValue) {\n return this._backCompatOption('origin', newValue);\n }\n\n /*\\\n * Interactable.deltaSource\n [ method ]\n *\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n - newValue (string) #optional Use 'client' if you will be scrolling while interacting; Use 'page' if you want autoScroll to work\n = (string | object) The current deltaSource or this Interactable\n \\*/\n deltaSource (newValue) {\n if (newValue === 'page' || newValue === 'client') {\n this.options.deltaSource = newValue;\n\n return this;\n }\n\n return this.options.deltaSource;\n }\n\n /*\\\n * Interactable.context\n [ method ]\n *\n * Gets the selector context Node of the Interactable. The default is `window.document`.\n *\n = (Node) The context Node of this Interactable\n **\n \\*/\n context () {\n return this._context;\n }\n\n inContext (element) {\n return (this._context === element.ownerDocument\n || nodeContains(this._context, element));\n }\n\n /*\\\n * Interactable.fire\n [ method ]\n *\n * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n - iEvent (InteractEvent) The InteractEvent object to be fired on this Interactable\n = (Interactable) this Interactable\n \\*/\n fire (iEvent) {\n this.events.fire(iEvent);\n\n return this;\n }\n\n _onOffMultiple (method, eventType, listener, options) {\n if (is.string(eventType) && eventType.search(' ') !== -1) {\n eventType = eventType.trim().split(/ +/);\n }\n\n if (is.array(eventType)) {\n for (let i = 0; i < eventType.length; i++) {\n this[method](eventType[i], listener, options);\n }\n\n return true;\n }\n\n if (is.object(eventType)) {\n for (const prop in eventType) {\n this[method](prop, eventType[prop], listener);\n }\n\n return true;\n }\n }\n\n /*\\\n * Interactable.on\n [ method ]\n *\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n - eventType (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) This Interactable\n \\*/\n on (eventType, listener, options) {\n if (this._onOffMultiple('on', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.on(eventType, listener);\n }\n // delegated event for selector\n else if (is.string(this.target)) {\n events.addDelegate(this.target, this._context, eventType, listener, options);\n }\n else {\n events.add(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.off\n [ method ]\n *\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n - eventType (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) This Interactable\n \\*/\n off (eventType, listener, options) {\n if (this._onOffMultiple('off', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n // if it is an action event type\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.off(eventType, listener);\n }\n // delegated event\n else if (is.string(this.target)) {\n events.removeDelegate(this.target, this._context, eventType, listener, options);\n }\n // remove listener from this Interatable's element\n else {\n events.remove(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.set\n [ method ]\n *\n * Reset the options of this Interactable\n - options (object) The new settings to apply\n = (object) This Interactable\n \\*/\n set (options) {\n if (!is.object(options)) {\n options = {};\n }\n\n this.options = extend({}, defaults.base);\n\n const perActions = extend({}, defaults.perAction);\n\n for (const actionName in actions.methodDict) {\n const methodName = actions.methodDict[actionName];\n\n this.options[actionName] = extend({}, defaults[actionName]);\n\n this.setPerAction(actionName, perActions);\n\n this[methodName](options[actionName]);\n }\n\n for (const setting of Interactable.settingsMethods) {\n this.options[setting] = defaults.base[setting];\n\n if (setting in options) {\n this[setting](options[setting]);\n }\n }\n\n signals.fire('set', {\n options,\n interactable: this,\n });\n\n return this;\n }\n\n /*\\\n * Interactable.unset\n [ method ]\n *\n * Remove this interactable from the list of interactables and remove\n * it's action capabilities and event listeners\n *\n = (object) @interact\n \\*/\n unset () {\n events.remove(this.target, 'all');\n\n if (is.string(this.target)) {\n // remove delegated events\n for (const type in events.delegatedEvents) {\n const delegated = events.delegatedEvents[type];\n\n if (delegated.selectors[0] === this.target\n && delegated.contexts[0] === this._context) {\n\n delegated.selectors.splice(0, 1);\n delegated.contexts .splice(0, 1);\n delegated.listeners.splice(0, 1);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegated[type] = null;\n }\n }\n\n events.remove(this._context, type, events.delegateListener);\n events.remove(this._context, type, events.delegateUseCapture, true);\n }\n }\n else {\n events.remove(this, 'all');\n }\n\n signals.fire('unset', { interactable: this });\n\n scope.interactables.splice(indexOf(scope.interactables, this), 1);\n\n // Stop related interactions when an Interactable is unset\n for (const interaction of scope.interactions || []) {\n if (interaction.target === this && interaction.interacting()) {\n interaction.stop();\n }\n }\n\n return scope.interact;\n }\n}\n\nscope.interactables.indexOfElement = function indexOfElement (target, context) {\n context = context || scope.document;\n\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n if (interactable.target === target && interactable._context === context) {\n return i;\n }\n }\n return -1;\n};\n\nscope.interactables.get = function interactableGet (element, options, dontCheckInContext) {\n const ret = this[this.indexOfElement(element, options && options.context)];\n\n return ret && (is.string(element) || dontCheckInContext || ret.inContext(element))? ret : null;\n};\n\nscope.interactables.forEachSelector = function (callback, element) {\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n // skip non CSS selector targets and out of context elements\n if (!is.string(interactable.target)\n || (element && !interactable.inContext(element))) {\n continue;\n }\n\n const ret = callback(interactable, interactable.target, interactable._context, i, this);\n\n if (ret !== undefined) {\n return ret;\n }\n }\n};\n\n// all interact.js eventTypes\nInteractable.eventTypes = scope.eventTypes = [];\n\nInteractable.signals = signals;\n\nInteractable.settingsMethods = [ 'deltaSource', 'origin', 'preventDefault', 'rectChecker' ];\n\nmodule.exports = Interactable;\n","const scope = require('./scope');\nconst utils = require('./utils');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst domObjects = require('./utils/domObjects');\nconst finder = require('./utils/interactionFinder');\nconst signals = require('./utils/Signals').new();\n\nconst listeners = {};\nconst methodNames = [\n 'pointerDown', 'pointerMove', 'pointerUp',\n 'updatePointer', 'removePointer',\n];\n\n// for ignoring browser's simulated mouse events\nlet prevTouchTime = 0;\n\n// all active and idle interactions\nscope.interactions = [];\n\nclass Interaction {\n constructor ({ pointerType }) {\n this.target = null; // current interactable being interacted with\n this.element = null; // the target element of the interactable\n\n this.prepared = { // action that's ready to be fired on next move event\n name : null,\n axis : null,\n edges: null,\n };\n\n // keep track of added pointers\n this.pointers = [];\n this.pointerIds = [];\n this.downTargets = [];\n this.downTimes = [];\n\n // Previous native pointer move event coordinates\n this.prevCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n // current native pointer move event coordinates\n this.curCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Starting InteractEvent pointer coordinates\n this.startCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Change in coordinates and time of the pointer\n this.pointerDelta = {\n page : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n client : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n timeStamp: 0,\n };\n\n this.downEvent = null; // pointerdown/mousedown/touchstart event\n this.downPointer = {};\n\n this._eventTarget = null;\n this._curEventTarget = null;\n\n this.prevEvent = null; // previous action event\n\n this.pointerIsDown = false;\n this.pointerWasMoved = false;\n this._interacting = false;\n\n this.pointerType = pointerType;\n\n signals.fire('new', this);\n\n scope.interactions.push(this);\n }\n\n pointerDown (pointer, event, eventTarget) {\n const pointerIndex = this.updatePointer(pointer, event, true);\n\n signals.fire('down', {\n pointer,\n event,\n eventTarget,\n pointerIndex,\n interaction: this,\n });\n }\n\n /*\\\n * Interaction.start\n [ method ]\n *\n * Start an action with the given Interactable and Element as tartgets. The\n * action must be enabled for the target Interactable and an appropriate number\n * of pointers must be held down - 1 for drag/resize, 2 for gesture.\n *\n * Use it with `interactable.able({ manualStart: false })` to always\n * [start actions manually](https://github.com/taye/interact.js/issues/114)\n *\n - action (object) The action to be performed - drag, resize, etc.\n - target (Interactable) The Interactable to target\n - element (Element) The DOM Element to target\n = (object) interact\n **\n | interact(target)\n | .draggable({\n | // disable the default drag start by down->move\n | manualStart: true\n | })\n | // start dragging after the user holds the pointer down\n | .on('hold', function (event) {\n | var interaction = event.interaction;\n |\n | if (!interaction.interacting()) {\n | interaction.start({ name: 'drag' },\n | event.interactable,\n | event.currentTarget);\n | }\n | });\n \\*/\n start (action, target, element) {\n if (this.interacting()\n || !this.pointerIsDown\n || this.pointerIds.length < (action.name === 'gesture'? 2 : 1)) {\n return;\n }\n\n // if this interaction had been removed after stopping\n // add it back\n if (utils.indexOf(scope.interactions, this) === -1) {\n scope.interactions.push(this);\n }\n\n utils.copyAction(this.prepared, action);\n this.target = target;\n this.element = element;\n\n signals.fire('action-start', {\n interaction: this,\n event: this.downEvent,\n });\n }\n\n pointerMove (pointer, event, eventTarget) {\n if (!this.simulation) {\n this.updatePointer(pointer);\n utils.setCoords(this.curCoords, this.pointers);\n }\n\n const duplicateMove = (this.curCoords.page.x === this.prevCoords.page.x\n && this.curCoords.page.y === this.prevCoords.page.y\n && this.curCoords.client.x === this.prevCoords.client.x\n && this.curCoords.client.y === this.prevCoords.client.y);\n\n let dx;\n let dy;\n\n // register movement greater than pointerMoveTolerance\n if (this.pointerIsDown && !this.pointerWasMoved) {\n dx = this.curCoords.client.x - this.startCoords.client.x;\n dy = this.curCoords.client.y - this.startCoords.client.y;\n\n this.pointerWasMoved = utils.hypot(dx, dy) > Interaction.pointerMoveTolerance;\n }\n\n const signalArg = {\n pointer,\n pointerIndex: this.getPointerIndex(pointer),\n event,\n eventTarget,\n dx,\n dy,\n duplicate: duplicateMove,\n interaction: this,\n interactingBeforeMove: this.interacting(),\n };\n\n if (!duplicateMove) {\n // set pointer coordinate, time changes and speeds\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n }\n\n signals.fire('move', signalArg);\n\n if (!duplicateMove) {\n // if interacting, fire an 'action-move' signal etc\n if (this.interacting()) {\n this.doMove(signalArg);\n }\n\n if (this.pointerWasMoved) {\n utils.copyCoords(this.prevCoords, this.curCoords);\n }\n }\n }\n\n /*\\\n * Interaction.doMove\n [ method ]\n *\n * Force a move of the current action at the same coordinates. Useful if\n * snap/restrict has been changed and you want a movement with the new\n * settings.\n *\n **\n | interact(target)\n | .draggable(true)\n | .on('dragmove', function (event) {\n | if (someCondition) {\n | // change the snap settings\n | event.interactable.draggable({ snap: { targets: [] }});\n | // fire another move event with re-calculated snap\n | event.interaction.doMove();\n | }\n | });\n \\*/\n doMove (signalArg) {\n signalArg = utils.extend({\n pointer: this.pointers[0],\n event: this.prevEvent,\n eventTarget: this._eventTarget,\n interaction: this,\n }, signalArg || {});\n\n signals.fire('before-action-move', signalArg);\n\n if (!this._dontFireMove) {\n signals.fire('action-move', signalArg);\n }\n\n this._dontFireMove = false;\n }\n\n // End interact move events and stop auto-scroll unless simulation is running\n pointerUp (pointer, event, eventTarget, curEventTarget) {\n const pointerIndex = this.getPointerIndex(pointer);\n\n signals.fire(/cancel$/i.test(event.type)? 'cancel' : 'up', {\n pointer,\n pointerIndex,\n event,\n eventTarget,\n curEventTarget,\n interaction: this,\n });\n\n if (!this.simulation) {\n this.end(event);\n }\n\n this.pointerIsDown = false;\n this.removePointer(pointer, event);\n }\n\n /*\\\n * Interaction.end\n [ method ]\n *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n - event (PointerEvent) #optional\n **\n | interact(target)\n | .draggable(true)\n | .on('move', function (event) {\n | if (event.pageX > 1000) {\n | // end the current action\n | event.interaction.end();\n | // stop all further listeners from being called\n | event.stopImmediatePropagation();\n | }\n | });\n \\*/\n end (event) {\n event = event || this.prevEvent;\n\n if (this.interacting()) {\n signals.fire('action-end', {\n event,\n interaction: this,\n });\n }\n\n this.stop();\n }\n\n currentAction () {\n return this._interacting? this.prepared.name: null;\n }\n\n interacting () {\n return this._interacting;\n }\n\n stop () {\n signals.fire('stop', { interaction: this });\n\n if (this._interacting) {\n signals.fire('stop-active', { interaction: this });\n signals.fire('stop-' + this.prepared.name, { interaction: this });\n }\n\n this.target = this.element = null;\n\n this._interacting = false;\n this.prepared.name = this.prevEvent = null;\n }\n\n getPointerIndex (pointer) {\n // mouse and pen interactions may have only one pointer\n if (this.pointerType === 'mouse' || this.pointerType === 'pen') {\n return 0;\n }\n\n return utils.indexOf(this.pointerIds, utils.getPointerId(pointer));\n }\n\n updatePointer (pointer, event, down = event && /(down|start)$/i.test(event.type)) {\n const id = utils.getPointerId(pointer);\n let index = this.getPointerIndex(pointer);\n\n if (index === -1) {\n index = this.pointerIds.length;\n this.pointerIds[index] = id;\n }\n\n if (down) {\n signals.fire('update-pointer-down', {\n pointer,\n event,\n down,\n pointerId: id,\n pointerIndex: index,\n interaction: this,\n });\n }\n\n this.pointers[index] = pointer;\n\n return index;\n }\n\n removePointer (pointer, event) {\n const index = this.getPointerIndex(pointer);\n\n if (index === -1) { return; }\n\n signals.fire('remove-pointer', {\n pointer,\n event,\n pointerIndex: index,\n interaction: this,\n });\n\n this.pointers .splice(index, 1);\n this.pointerIds .splice(index, 1);\n this.downTargets.splice(index, 1);\n this.downTimes .splice(index, 1);\n }\n\n _updateEventTargets (target, currentTarget) {\n this._eventTarget = target;\n this._curEventTarget = currentTarget;\n }\n}\n\nfor (let i = 0, len = methodNames.length; i < len; i++) {\n const method = methodNames[i];\n\n listeners[method] = doOnInteractions(method);\n}\n\nfunction doOnInteractions (method) {\n return (function (event) {\n const pointerType = utils.getPointerType(event);\n const [eventTarget, curEventTarget] = utils.getEventTargets(event);\n const matches = []; // [ [pointer, interaction], ...]\n\n if (browser.supportsTouch && /touch/.test(event.type)) {\n prevTouchTime = new Date().getTime();\n\n for (let i = 0; i < event.changedTouches.length; i++) {\n const pointer = event.changedTouches[i];\n const interaction = finder.search(pointer, event.type, eventTarget);\n\n matches.push([pointer, interaction || new Interaction({ pointerType })]);\n }\n }\n else {\n let invalidPointer = false;\n\n if (!browser.supportsPointerEvent && /mouse/.test(event.type)) {\n // ignore mouse events while touch interactions are active\n for (let i = 0; i < scope.interactions.length && !invalidPointer; i++) {\n invalidPointer = scope.interactions[i].pointerType !== 'mouse' && scope.interactions[i].pointerIsDown;\n }\n\n // try to ignore mouse events that are simulated by the browser\n // after a touch event\n invalidPointer = invalidPointer\n || (new Date().getTime() - prevTouchTime < 500)\n // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated\n || event.timeStamp === 0;\n }\n\n if (!invalidPointer) {\n let interaction = finder.search(event, event.type, eventTarget);\n\n if (!interaction) {\n interaction = new Interaction({ pointerType });\n }\n\n matches.push([event, interaction]);\n }\n }\n\n for (const [pointer, interaction] of matches) {\n interaction._updateEventTargets(eventTarget, curEventTarget);\n interaction[method](pointer, event, eventTarget, curEventTarget);\n }\n });\n}\n\nfunction endAll (event) {\n for (let i = 0; i < scope.interactions.length; i++) {\n const interaction = scope.interactions[i];\n\n interaction.end(event);\n signals.fire('endall', { event, interaction });\n }\n}\n\nconst docEvents = { /* 'eventType': listenerFunc */ };\nconst pEventTypes = browser.pEventTypes;\n\nif (domObjects.PointerEvent) {\n docEvents[pEventTypes.down ] = listeners.pointerDown;\n docEvents[pEventTypes.move ] = listeners.pointerMove;\n docEvents[pEventTypes.up ] = listeners.pointerUp;\n docEvents[pEventTypes.cancel] = listeners.pointerUp;\n}\nelse {\n docEvents.mousedown = listeners.pointerDown;\n docEvents.mousemove = listeners.pointerMove;\n docEvents.mouseup = listeners.pointerUp;\n\n docEvents.touchstart = listeners.pointerDown;\n docEvents.touchmove = listeners.pointerMove;\n docEvents.touchend = listeners.pointerUp;\n docEvents.touchcancel = listeners.pointerUp;\n}\n\ndocEvents.blur = endAll;\n\nfunction onDocSignal ({ doc }, signalName) {\n const eventMethod = signalName.indexOf('add') === 0\n ? events.add : events.remove;\n\n // delegate event listener\n for (const eventType in scope.delegatedEvents) {\n eventMethod(doc, eventType, events.delegateListener);\n eventMethod(doc, eventType, events.delegateUseCapture, true);\n }\n\n for (const eventType in docEvents) {\n eventMethod(doc, eventType, docEvents[eventType]);\n }\n}\n\nsignals.on('update-pointer-down', ({ interaction, pointer, pointerId, pointerIndex, event, eventTarget, down }) => {\n interaction.pointerIds[pointerIndex] = pointerId;\n interaction.pointers[pointerIndex] = pointer;\n\n if (down) {\n interaction.pointerIsDown = true;\n }\n\n if (!interaction.interacting()) {\n utils.setCoords(interaction.startCoords, interaction.pointers);\n\n utils.copyCoords(interaction.curCoords , interaction.startCoords);\n utils.copyCoords(interaction.prevCoords, interaction.startCoords);\n\n interaction.downEvent = event;\n interaction.downTimes[pointerIndex] = interaction.curCoords.timeStamp;\n interaction.downTargets[pointerIndex] = eventTarget || event && utils.getEventTargets(event)[0];\n interaction.pointerWasMoved = false;\n\n utils.pointerExtend(interaction.downPointer, pointer);\n }\n});\n\nscope.signals.on('add-document' , onDocSignal);\nscope.signals.on('remove-document', onDocSignal);\n\nInteraction.pointerMoveTolerance = 1;\nInteraction.doOnInteractions = doOnInteractions;\nInteraction.endAll = endAll;\nInteraction.signals = signals;\nInteraction.docEvents = docEvents;\n\nscope.endAllInteractions = endAll;\n\nmodule.exports = Interaction;\n","const Interaction = require('../Interaction');\nconst InteractEvent = require('../InteractEvent');\n\nconst actions = {\n firePrepared,\n names: [],\n methodDict: {},\n};\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n interaction._interacting = true;\n firePrepared(interaction, event, 'start');\n});\n\nInteraction.signals.on('action-move', function ({ interaction, event, preEnd }) {\n firePrepared(interaction, event, 'move', preEnd);\n\n // if the action was ended in a listener\n if (!interaction.interacting()) { return false; }\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n firePrepared(interaction, event, 'end');\n});\n\nfunction firePrepared (interaction, event, phase, preEnd) {\n const actionName = interaction.prepared.name;\n\n const newEvent = new InteractEvent(interaction, event, actionName, phase, interaction.element, null, preEnd);\n\n interaction.target.fire(newEvent);\n interaction.prevEvent = newEvent;\n}\n\nmodule.exports = actions;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drag = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n startAxis : 'xy',\n lockAxis : 'xy',\n },\n\n checker: function (pointer, event, interactable) {\n const dragOptions = interactable.options.drag;\n\n return dragOptions.enabled\n ? { name: 'drag', axis: (dragOptions.lockAxis === 'start'\n ? dragOptions.startAxis\n : dragOptions.lockAxis)}\n : null;\n },\n\n getCursor: function () {\n return 'move';\n },\n};\n\nInteraction.signals.on('before-action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n interaction.curCoords.page.y = interaction.startCoords.page.y;\n interaction.curCoords.client.y = interaction.startCoords.client.y;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vx);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vx);\n interaction.pointerDelta.client.vy = 0;\n interaction.pointerDelta.page.vy = 0;\n }\n else if (axis === 'y') {\n interaction.curCoords.page.x = interaction.startCoords.page.x;\n interaction.curCoords.client.x = interaction.startCoords.client.x;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vy);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vy);\n interaction.pointerDelta.client.vx = 0;\n interaction.pointerDelta.page.vx = 0;\n }\n});\n\n// dragmove\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'dragmove') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n iEvent.pageY = interaction.startCoords.page.y;\n iEvent.clientY = interaction.startCoords.client.y;\n iEvent.dy = 0;\n }\n else if (axis === 'y') {\n iEvent.pageX = interaction.startCoords.page.x;\n iEvent.clientX = interaction.startCoords.client.x;\n iEvent.dx = 0;\n }\n});\n\n/*\\\n * Interactable.draggable\n [ method ]\n *\n * Gets or sets whether drag actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of drag events\n | var isDraggable = interact('ul li').draggable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on drag events (object makes the Interactable draggable)\n = (object) This Interactable\n | interact(element).draggable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // the axis in which the first movement must be\n | // for the drag sequence to start\n | // 'xy' by default - any direction\n | startAxis: 'x' || 'y' || 'xy',\n |\n | // 'xy' by default - don't restrict to one axis (move in any direction)\n | // 'x' or 'y' to restrict movement to either axis\n | // 'start' to restrict movement to the axis the drag started in\n | lockAxis: 'x' || 'y' || 'xy' || 'start',\n |\n | // max number of drags that can happen concurrently\n | // with elements of this Interactable. Infinity by default\n | max: Infinity,\n |\n | // max number of drags that can target the same element+Interactable\n | // 1 by default\n | maxPerElement: 2\n | });\n\\*/\nInteractable.prototype.draggable = function (options) {\n if (utils.is.object(options)) {\n this.options.drag.enabled = options.enabled === false? false: true;\n this.setPerAction('drag', options);\n this.setOnEvents('drag', options);\n\n if (/^(xy|x|y|start)$/.test(options.lockAxis)) {\n this.options.drag.lockAxis = options.lockAxis;\n }\n if (/^(xy|x|y)$/.test(options.startAxis)) {\n this.options.drag.startAxis = options.startAxis;\n }\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drag.enabled = options;\n\n if (!options) {\n this.ondragstart = this.ondragstart = this.ondragend = null;\n }\n\n return this;\n }\n\n return this.options.drag;\n};\n\nactions.drag = drag;\nactions.names.push('drag');\nutils.merge(Interactable.eventTypes, [\n 'dragstart',\n 'dragmove',\n 'draginertiastart',\n 'draginertiaresume',\n 'dragend',\n]);\nactions.methodDict.drag = 'draggable';\n\ndefaultOptions.drag = drag.defaults;\n\nmodule.exports = drag;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst scope = require('../scope');\nconst interact = require('../interact');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drop = {\n defaults: {\n enabled: false,\n accept : null,\n overlap: 'pointer',\n },\n};\n\nlet dynamicDrop = false;\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // reset active dropzones\n interaction.activeDrops.dropzones = [];\n interaction.activeDrops.elements = [];\n interaction.activeDrops.rects = [];\n\n interaction.dropEvents = null;\n\n if (!interaction.dynamicDrop) {\n setActiveDrops(interaction, interaction.element);\n }\n\n const dragEvent = interaction.prevEvent;\n const dropEvents = getDropEvents(interaction, event, dragEvent);\n\n if (dropEvents.activate) {\n fireActiveDrops(interaction, dropEvents.activate);\n }\n});\n\nInteractEvent.signals.on('new', function ({ interaction, iEvent, event }) {\n if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { return; }\n\n const draggableElement = interaction.element;\n const dragEvent = iEvent;\n const dropResult = getDrop(dragEvent, event, draggableElement);\n\n interaction.dropTarget = dropResult.dropzone;\n interaction.dropElement = dropResult.element;\n\n interaction.dropEvents = getDropEvents(interaction, event, dragEvent);\n});\n\nInteraction.signals.on('action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n fireDropEvents(interaction, interaction.dropEvents);\n});\n\nInteraction.signals.on('action-end', function ({ interaction }) {\n if (interaction.prepared.name === 'drag') {\n fireDropEvents(interaction, interaction.dropEvents);\n }\n});\n\nInteraction.signals.on('stop-drag', function ({ interaction }) {\n interaction.activeDrops.dropzones =\n interaction.activeDrops.elements =\n interaction.activeDrops.rects =\n interaction.dropEvents = null;\n});\n\nfunction collectDrops (interaction, element) {\n const drops = [];\n const elements = [];\n\n element = element || interaction.element;\n\n // collect all dropzones and their elements which qualify for a drop\n for (const current of scope.interactables) {\n if (!current.options.drop.enabled) { continue; }\n\n const accept = current.options.drop.accept;\n\n // test the draggable element against the dropzone's accept setting\n if ((utils.is.element(accept) && accept !== element)\n || (utils.is.string(accept)\n && !utils.matchesSelector(element, accept))) {\n\n continue;\n }\n\n // query for new elements if necessary\n const dropElements = utils.is.string(current.target)\n ? current._context.querySelectorAll(current.target)\n : [current.target];\n\n for (let i = 0; i < dropElements.length; i++) {\n const currentElement = dropElements[i];\n\n if (currentElement !== element) {\n drops.push(current);\n elements.push(currentElement);\n }\n }\n }\n\n return {\n elements,\n dropzones: drops,\n };\n}\n\nfunction fireActiveDrops (interaction, event) {\n let prevElement;\n\n // loop through all active dropzones and trigger event\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n const current = interaction.activeDrops.dropzones[i];\n const currentElement = interaction.activeDrops.elements [i];\n\n // prevent trigger of duplicate events on same element\n if (currentElement !== prevElement) {\n // set current element as event target\n event.target = currentElement;\n current.fire(event);\n }\n prevElement = currentElement;\n }\n}\n\n// Collect a new set of possible drops and save them in activeDrops.\n// setActiveDrops should always be called when a drag has just started or a\n// drag event happens while dynamicDrop is true\nfunction setActiveDrops (interaction, dragElement) {\n // get dropzones and their elements that could receive the draggable\n const possibleDrops = collectDrops(interaction, dragElement, true);\n\n interaction.activeDrops.dropzones = possibleDrops.dropzones;\n interaction.activeDrops.elements = possibleDrops.elements;\n interaction.activeDrops.rects = [];\n\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n interaction.activeDrops.rects[i] =\n interaction.activeDrops.dropzones[i].getRect(interaction.activeDrops.elements[i]);\n }\n}\n\nfunction getDrop (dragEvent, event, dragElement) {\n const interaction = dragEvent.interaction;\n const validDrops = [];\n\n if (dynamicDrop) {\n setActiveDrops(interaction, dragElement);\n }\n\n // collect all dropzones and their elements which qualify for a drop\n for (let j = 0; j < interaction.activeDrops.dropzones.length; j++) {\n const current = interaction.activeDrops.dropzones[j];\n const currentElement = interaction.activeDrops.elements [j];\n const rect = interaction.activeDrops.rects [j];\n\n validDrops.push(current.dropCheck(dragEvent, event, interaction.target, dragElement, currentElement, rect)\n ? currentElement\n : null);\n }\n\n // get the most appropriate dropzone based on DOM depth and order\n const dropIndex = utils.indexOfDeepestElement(validDrops);\n\n return {\n dropzone: interaction.activeDrops.dropzones[dropIndex] || null,\n element : interaction.activeDrops.elements [dropIndex] || null,\n };\n}\n\nfunction getDropEvents (interaction, pointerEvent, dragEvent) {\n const dropEvents = {\n enter : null,\n leave : null,\n activate : null,\n deactivate: null,\n move : null,\n drop : null,\n };\n\n const tmpl = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n };\n\n if (interaction.dropElement !== interaction.prevDropElement) {\n // if there was a prevDropTarget, create a dragleave event\n if (interaction.prevDropTarget) {\n dropEvents.leave = utils.extend({ type: 'dragleave' }, tmpl);\n\n dragEvent.dragLeave = dropEvents.leave.target = interaction.prevDropElement;\n dragEvent.prevDropzone = dropEvents.leave.dropzone = interaction.prevDropTarget;\n }\n // if the dropTarget is not null, create a dragenter event\n if (interaction.dropTarget) {\n dropEvents.enter = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n type : 'dragenter',\n };\n\n dragEvent.dragEnter = interaction.dropElement;\n dragEvent.dropzone = interaction.dropTarget;\n }\n }\n\n if (dragEvent.type === 'dragend' && interaction.dropTarget) {\n dropEvents.drop = utils.extend({ type: 'drop' }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n dragEvent.relatedTarget = interaction.dropElement;\n }\n if (dragEvent.type === 'dragstart') {\n dropEvents.activate = utils.extend({ type: 'dropactivate' }, tmpl);\n\n dropEvents.activate.target = null;\n dropEvents.activate.dropzone = null;\n }\n if (dragEvent.type === 'dragend') {\n dropEvents.deactivate = utils.extend({ type: 'dropdeactivate' }, tmpl);\n\n dropEvents.deactivate.target = null;\n dropEvents.deactivate.dropzone = null;\n }\n if (dragEvent.type === 'dragmove' && interaction.dropTarget) {\n dropEvents.move = utils.extend({\n dragmove : dragEvent,\n type : 'dropmove',\n }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n }\n\n return dropEvents;\n}\n\nfunction fireDropEvents (interaction, dropEvents) {\n if (dropEvents.leave) { interaction.prevDropTarget.fire(dropEvents.leave); }\n if (dropEvents.move ) { interaction.dropTarget.fire(dropEvents.move ); }\n if (dropEvents.enter) { interaction.dropTarget.fire(dropEvents.enter); }\n if (dropEvents.drop ) { interaction.dropTarget.fire(dropEvents.drop ); }\n if (dropEvents.deactivate) {\n fireActiveDrops(interaction, dropEvents.deactivate);\n }\n\n interaction.prevDropTarget = interaction.dropTarget;\n interaction.prevDropElement = interaction.dropElement;\n}\n\n/*\\\n * Interactable.dropzone\n [ method ]\n *\n * Returns or sets whether elements can be dropped onto this\n * Interactable to trigger drop events\n *\n * Dropzones can receive the following events:\n * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends\n * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone\n * - `dragmove` when a draggable that has entered the dropzone is moved\n * - `drop` when a draggable is dropped into this dropzone\n *\n * Use the `accept` option to allow only elements that match the given CSS\n * selector or element. The value can be:\n *\n * - **an Element** - only that element can be dropped into this dropzone.\n * - **a string**, - the element being dragged must match it as a CSS selector.\n * - **`null`** - accept options is cleared - it accepts any element.\n *\n * Use the `overlap` option to set how drops are checked for. The allowed\n * values are:\n *\n * - `'pointer'`, the pointer must be over the dropzone (default)\n * - `'center'`, the draggable element's center must be over the dropzone\n * - a number from 0-1 which is the `(intersection area) / (draggable area)`.\n * e.g. `0.5` for drop to happen when half of the area of the draggable is\n * over the dropzone\n *\n * Use the `checker` option to specify a function to check if a dragged\n * element is over this Interactable.\n *\n | interact(target)\n | .dropChecker(function(dragEvent, // related dragmove or dragend event\n | event, // TouchEvent/PointerEvent/MouseEvent\n | dropped, // bool result of the default checker\n | dropzone, // dropzone Interactable\n | dropElement, // dropzone elemnt\n | draggable, // draggable Interactable\n | draggableElement) {// draggable element\n |\n | return dropped && event.target.hasAttribute('allow-drop');\n | }\n *\n *\n - options (boolean | object | null) #optional The new value to be set.\n | interact('.drop').dropzone({\n | accept: '.can-drop' || document.getElementById('single-drop'),\n | overlap: 'pointer' || 'center' || zeroToOne\n | }\n = (boolean | object) The current setting or this Interactable\n\\*/\nInteractable.prototype.dropzone = function (options) {\n if (utils.is.object(options)) {\n this.options.drop.enabled = options.enabled === false? false: true;\n\n if (utils.is.function(options.ondrop) ) { this.events.ondrop = options.ondrop ; }\n if (utils.is.function(options.ondropactivate) ) { this.events.ondropactivate = options.ondropactivate ; }\n if (utils.is.function(options.ondropdeactivate)) { this.events.ondropdeactivate = options.ondropdeactivate; }\n if (utils.is.function(options.ondragenter) ) { this.events.ondragenter = options.ondragenter ; }\n if (utils.is.function(options.ondragleave) ) { this.events.ondragleave = options.ondragleave ; }\n if (utils.is.function(options.ondropmove) ) { this.events.ondropmove = options.ondropmove ; }\n\n if (/^(pointer|center)$/.test(options.overlap)) {\n this.options.drop.overlap = options.overlap;\n }\n else if (utils.is.number(options.overlap)) {\n this.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0);\n }\n if ('accept' in options) {\n this.options.drop.accept = options.accept;\n }\n if ('checker' in options) {\n this.options.drop.checker = options.checker;\n }\n\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drop.enabled = options;\n\n if (!options) {\n this.ondragenter = this.ondragleave = this.ondrop\n = this.ondropactivate = this.ondropdeactivate = null;\n }\n\n return this;\n }\n\n return this.options.drop;\n};\n\nInteractable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) {\n let dropped = false;\n\n // if the dropzone has no rect (eg. display: none)\n // call the custom dropChecker or just return false\n if (!(rect = rect || this.getRect(dropElement))) {\n return (this.options.drop.checker\n ? this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement)\n : false);\n }\n\n const dropOverlap = this.options.drop.overlap;\n\n if (dropOverlap === 'pointer') {\n const origin = utils.getOriginXY(draggable, draggableElement, 'drag');\n const page = utils.getPageXY(dragEvent);\n\n page.x += origin.x;\n page.y += origin.y;\n\n const horizontal = (page.x > rect.left) && (page.x < rect.right);\n const vertical = (page.y > rect.top ) && (page.y < rect.bottom);\n\n dropped = horizontal && vertical;\n }\n\n const dragRect = draggable.getRect(draggableElement);\n\n if (dragRect && dropOverlap === 'center') {\n const cx = dragRect.left + dragRect.width / 2;\n const cy = dragRect.top + dragRect.height / 2;\n\n dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom;\n }\n\n if (dragRect && utils.is.number(dropOverlap)) {\n const overlapArea = (Math.max(0, Math.min(rect.right , dragRect.right ) - Math.max(rect.left, dragRect.left))\n * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top , dragRect.top )));\n\n const overlapRatio = overlapArea / (dragRect.width * dragRect.height);\n\n dropped = overlapRatio >= dropOverlap;\n }\n\n if (this.options.drop.checker) {\n dropped = this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement);\n }\n\n return dropped;\n};\n\nInteractable.signals.on('unset', function ({ interactable }) {\n interactable.dropzone(false);\n});\n\nInteractable.settingsMethods.push('dropChecker');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.dropTarget = null; // the dropzone a drag target might be dropped into\n interaction.dropElement = null; // the element at the time of checking\n interaction.prevDropTarget = null; // the dropzone that was recently dragged away from\n interaction.prevDropElement = null; // the element at the time of checking\n interaction.dropEvents = null; // the dropEvents related to the current drag event\n\n interaction.activeDrops = {\n dropzones: [], // the dropzones that are mentioned below\n elements : [], // elements of dropzones that accept the target draggable\n rects : [], // the rects of the elements mentioned above\n };\n\n});\n\nInteraction.signals.on('stop', function ({ interaction }) {\n interaction.dropTarget = interaction.dropElement =\n interaction.prevDropTarget = interaction.prevDropElement = null;\n});\n\n/*\\\n * interact.dynamicDrop\n [ method ]\n *\n * Returns or sets whether the dimensions of dropzone elements are\n * calculated on every dragmove or only on dragstart for the default\n * dropChecker\n *\n - newValue (boolean) #optional True to check on each move. False to check only before start\n = (boolean | interact) The current setting or interact\n\\*/\ninteract.dynamicDrop = function (newValue) {\n if (utils.is.bool(newValue)) {\n //if (dragging && dynamicDrop !== newValue && !newValue) {\n //calcRects(dropzones);\n //}\n\n dynamicDrop = newValue;\n\n return interact;\n }\n return dynamicDrop;\n};\n\nutils.merge(Interactable.eventTypes, [\n 'dragenter',\n 'dragleave',\n 'dropactivate',\n 'dropdeactivate',\n 'dropmove',\n 'drop',\n]);\nactions.methodDict.drop = 'dropzone';\n\ndefaultOptions.drop = drop.defaults;\n\nmodule.exports = drop;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst gesture = {\n defaults: {\n enabled : false,\n origin : null,\n restrict: null,\n },\n\n checker: function (pointer, event, interactable, element, interaction) {\n if (interaction.pointerIds.length >= 2) {\n return { name: 'gesture' };\n }\n\n return null;\n },\n\n getCursor: function () {\n return '';\n },\n};\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturestart') { return; }\n iEvent.ds = 0;\n\n interaction.gesture.startDistance = interaction.gesture.prevDistance = iEvent.distance;\n interaction.gesture.startAngle = interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.scale = 1;\n});\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturemove') { return; }\n\n iEvent.ds = iEvent.scale - interaction.gesture.scale;\n\n interaction.target.fire(iEvent);\n\n interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.prevDistance = iEvent.distance;\n\n if (iEvent.scale !== Infinity\n && iEvent.scale !== null\n && iEvent.scale !== undefined\n && !isNaN(iEvent.scale)) {\n\n interaction.gesture.scale = iEvent.scale;\n }\n});\n\n/*\\\n * Interactable.gesturable\n [ method ]\n *\n * Gets or sets whether multitouch gestures can be performed on the\n * Interactable's element\n *\n = (boolean) Indicates if this can be the target of gesture events\n | var isGestureable = interact(element).gesturable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on gesture events (makes the Interactable gesturable)\n = (object) this Interactable\n | interact(element).gesturable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // limit multiple gestures.\n | // See the explanation in @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n\\*/\nInteractable.prototype.gesturable = function (options) {\n if (utils.is.object(options)) {\n this.options.gesture.enabled = options.enabled === false? false: true;\n this.setPerAction('gesture', options);\n this.setOnEvents('gesture', options);\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.gesture.enabled = options;\n\n if (!options) {\n this.ongesturestart = this.ongesturestart = this.ongestureend = null;\n }\n\n return this;\n }\n\n return this.options.gesture;\n};\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action, event, starting, ending, deltaSource }) {\n if (action !== 'gesture') { return; }\n\n const pointers = interaction.pointers;\n\n iEvent.touches = [pointers[0], pointers[1]];\n\n if (starting) {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = 1;\n iEvent.ds = 0;\n iEvent.angle = utils.touchAngle(pointers, undefined, deltaSource);\n iEvent.da = 0;\n }\n else if (ending || event instanceof InteractEvent) {\n iEvent.distance = interaction.prevEvent.distance;\n iEvent.box = interaction.prevEvent.box;\n iEvent.scale = interaction.prevEvent.scale;\n iEvent.ds = iEvent.scale - 1;\n iEvent.angle = interaction.prevEvent.angle;\n iEvent.da = iEvent.angle - interaction.gesture.startAngle;\n }\n else {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = iEvent.distance / interaction.gesture.startDistance;\n iEvent.angle = utils.touchAngle(pointers, interaction.gesture.prevAngle, deltaSource);\n\n iEvent.ds = iEvent.scale - interaction.gesture.prevScale;\n iEvent.da = iEvent.angle - interaction.gesture.prevAngle;\n }\n});\n\nInteraction.signals.on('new', function (interaction) {\n interaction.gesture = {\n start: { x: 0, y: 0 },\n\n startDistance: 0, // distance between two touches of touchStart\n prevDistance : 0,\n distance : 0,\n\n scale: 1, // gesture.distance / gesture.startDistance\n\n startAngle: 0, // angle of line joining two touches\n prevAngle : 0, // angle of the previous gesture event\n };\n});\n\nactions.gesture = gesture;\nactions.names.push('gesture');\nutils.merge(Interactable.eventTypes, [\n 'gesturestart',\n 'gesturemove',\n 'gestureend',\n]);\nactions.methodDict.gesture = 'gesturable';\n\ndefaultOptions.gesture = gesture.defaults;\n\nmodule.exports = gesture;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\n// Less Precision with touch input\nconst defaultMargin = browser.supportsTouch || browser.supportsPointerEvent? 20: 10;\n\nconst resize = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n square: false,\n preserveAspectRatio: false,\n axis: 'xy',\n\n // use default margin\n margin: NaN,\n\n // object with props left, right, top, bottom which are\n // true/false values to resize when the pointer is over that edge,\n // CSS selectors to match the handles for each direction\n // or the Elements for each handle\n edges: null,\n\n // a value of 'none' will limit the resize rect to a minimum of 0x0\n // 'negate' will alow the rect to have negative width/height\n // 'reposition' will keep the width/height positive by swapping\n // the top and bottom edges and/or swapping the left and right edges\n invert: 'none',\n },\n\n checker: function (pointer, event, interactable, element, interaction, rect) {\n if (!rect) { return null; }\n\n const page = utils.extend({}, interaction.curCoords.page);\n const options = interactable.options;\n\n if (options.resize.enabled) {\n const resizeOptions = options.resize;\n const resizeEdges = { left: false, right: false, top: false, bottom: false };\n\n // if using resize.edges\n if (utils.is.object(resizeOptions.edges)) {\n for (const edge in resizeEdges) {\n resizeEdges[edge] = checkResizeEdge(edge,\n resizeOptions.edges[edge],\n page,\n interaction._eventTarget,\n element,\n rect,\n resizeOptions.margin || defaultMargin);\n }\n\n resizeEdges.left = resizeEdges.left && !resizeEdges.right;\n resizeEdges.top = resizeEdges.top && !resizeEdges.bottom;\n\n if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) {\n return {\n name: 'resize',\n edges: resizeEdges,\n };\n }\n }\n else {\n const right = options.resize.axis !== 'y' && page.x > (rect.right - defaultMargin);\n const bottom = options.resize.axis !== 'x' && page.y > (rect.bottom - defaultMargin);\n\n if (right || bottom) {\n return {\n name: 'resize',\n axes: (right? 'x' : '') + (bottom? 'y' : ''),\n };\n }\n }\n }\n\n return null;\n },\n\n cursors: (browser.isIe9OrOlder ? {\n x : 'e-resize',\n y : 's-resize',\n xy: 'se-resize',\n\n top : 'n-resize',\n left : 'w-resize',\n bottom : 's-resize',\n right : 'e-resize',\n topleft : 'se-resize',\n bottomright: 'se-resize',\n topright : 'ne-resize',\n bottomleft : 'ne-resize',\n } : {\n x : 'ew-resize',\n y : 'ns-resize',\n xy: 'nwse-resize',\n\n top : 'ns-resize',\n left : 'ew-resize',\n bottom : 'ns-resize',\n right : 'ew-resize',\n topleft : 'nwse-resize',\n bottomright: 'nwse-resize',\n topright : 'nesw-resize',\n bottomleft : 'nesw-resize',\n }),\n\n getCursor: function (action) {\n if (action.axis) {\n return resize.cursors[action.name + action.axis];\n }\n else if (action.edges) {\n let cursorKey = '';\n const edgeNames = ['top', 'bottom', 'left', 'right'];\n\n for (let i = 0; i < 4; i++) {\n if (action.edges[edgeNames[i]]) {\n cursorKey += edgeNames[i];\n }\n }\n\n return resize.cursors[cursorKey];\n }\n },\n};\n\n// resizestart\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'resizestart' || !interaction.prepared.edges) {\n return;\n }\n\n const startRect = interaction.target.getRect(interaction.element);\n const resizeOptions = interaction.target.options.resize;\n\n /*\n * When using the `resizable.square` or `resizable.preserveAspectRatio` options, resizing from one edge\n * will affect another. E.g. with `resizable.square`, resizing to make the right edge larger will make\n * the bottom edge larger by the same amount. We call these 'linked' edges. Any linked edges will depend\n * on the active edges and the edge being interacted with.\n */\n if (resizeOptions.square || resizeOptions.preserveAspectRatio) {\n const linkedEdges = utils.extend({}, interaction.prepared.edges);\n\n linkedEdges.top = linkedEdges.top || (linkedEdges.left && !linkedEdges.bottom);\n linkedEdges.left = linkedEdges.left || (linkedEdges.top && !linkedEdges.right );\n linkedEdges.bottom = linkedEdges.bottom || (linkedEdges.right && !linkedEdges.top );\n linkedEdges.right = linkedEdges.right || (linkedEdges.bottom && !linkedEdges.left );\n\n interaction.prepared._linkedEdges = linkedEdges;\n }\n else {\n interaction.prepared._linkedEdges = null;\n }\n\n // if using `resizable.preserveAspectRatio` option, record aspect ratio at the start of the resize\n if (resizeOptions.preserveAspectRatio) {\n interaction.resizeStartAspectRatio = startRect.width / startRect.height;\n }\n\n interaction.resizeRects = {\n start : startRect,\n current : utils.extend({}, startRect),\n inverted : utils.extend({}, startRect),\n previous : utils.extend({}, startRect),\n delta : {\n left: 0, right : 0, width : 0,\n top : 0, bottom: 0, height: 0,\n },\n };\n\n iEvent.rect = interaction.resizeRects.inverted;\n iEvent.deltaRect = interaction.resizeRects.delta;\n});\n\n// resizemove\nInteractEvent.signals.on('new', function ({ iEvent, phase, interaction }) {\n if (phase !== 'move' || !interaction.prepared.edges) { return; }\n\n const resizeOptions = interaction.target.options.resize;\n const invert = resizeOptions.invert;\n const invertible = invert === 'reposition' || invert === 'negate';\n\n let edges = interaction.prepared.edges;\n\n const start = interaction.resizeRects.start;\n const current = interaction.resizeRects.current;\n const inverted = interaction.resizeRects.inverted;\n const delta = interaction.resizeRects.delta;\n const previous = utils.extend(interaction.resizeRects.previous, inverted);\n const originalEdges = edges;\n\n let dx = iEvent.dx;\n let dy = iEvent.dy;\n\n if (resizeOptions.preserveAspectRatio || resizeOptions.square) {\n // `resize.preserveAspectRatio` takes precedence over `resize.square`\n const startAspectRatio = resizeOptions.preserveAspectRatio\n ? interaction.resizeStartAspectRatio\n : 1;\n\n edges = interaction.prepared._linkedEdges;\n\n if ((originalEdges.left && originalEdges.bottom)\n || (originalEdges.right && originalEdges.top)) {\n dy = -dx / startAspectRatio;\n }\n else if (originalEdges.left || originalEdges.right ) { dy = dx / startAspectRatio; }\n else if (originalEdges.top || originalEdges.bottom) { dx = dy * startAspectRatio; }\n }\n\n // update the 'current' rect without modifications\n if (edges.top ) { current.top += dy; }\n if (edges.bottom) { current.bottom += dy; }\n if (edges.left ) { current.left += dx; }\n if (edges.right ) { current.right += dx; }\n\n if (invertible) {\n // if invertible, copy the current rect\n utils.extend(inverted, current);\n\n if (invert === 'reposition') {\n // swap edge values if necessary to keep width/height positive\n let swap;\n\n if (inverted.top > inverted.bottom) {\n swap = inverted.top;\n\n inverted.top = inverted.bottom;\n inverted.bottom = swap;\n }\n if (inverted.left > inverted.right) {\n swap = inverted.left;\n\n inverted.left = inverted.right;\n inverted.right = swap;\n }\n }\n }\n else {\n // if not invertible, restrict to minimum of 0x0 rect\n inverted.top = Math.min(current.top, start.bottom);\n inverted.bottom = Math.max(current.bottom, start.top);\n inverted.left = Math.min(current.left, start.right);\n inverted.right = Math.max(current.right, start.left);\n }\n\n inverted.width = inverted.right - inverted.left;\n inverted.height = inverted.bottom - inverted.top ;\n\n for (const edge in inverted) {\n delta[edge] = inverted[edge] - previous[edge];\n }\n\n iEvent.edges = interaction.prepared.edges;\n iEvent.rect = inverted;\n iEvent.deltaRect = delta;\n});\n\n/*\\\n * Interactable.resizable\n [ method ]\n *\n * Gets or sets whether resize actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of resize elements\n | var isResizeable = interact('input[type=text]').resizable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on resize events (object makes the Interactable resizable)\n = (object) This Interactable\n | interact(element).resizable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | edges: {\n | top : true, // Use pointer coords to check for resize.\n | left : false, // Disable resizing from left edge.\n | bottom: '.resize-s',// Resize if pointer target matches selector\n | right : handleEl // Resize if pointer target is the given Element\n | },\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height are adjusted at a 1:1 ratio.\n | square: false,\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height maintain the aspect ratio they had when resizing started.\n | preserveAspectRatio: false,\n |\n | // a value of 'none' will limit the resize rect to a minimum of 0x0\n | // 'negate' will allow the rect to have negative width/height\n | // 'reposition' will keep the width/height positive by swapping\n | // the top and bottom edges and/or swapping the left and right edges\n | invert: 'none' || 'negate' || 'reposition'\n |\n | // limit multiple resizes.\n | // See the explanation in the @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n \\*/\nInteractable.prototype.resizable = function (options) {\n if (utils.is.object(options)) {\n this.options.resize.enabled = options.enabled === false? false: true;\n this.setPerAction('resize', options);\n this.setOnEvents('resize', options);\n\n if (/^x$|^y$|^xy$/.test(options.axis)) {\n this.options.resize.axis = options.axis;\n }\n else if (options.axis === null) {\n this.options.resize.axis = defaultOptions.resize.axis;\n }\n\n if (utils.is.bool(options.preserveAspectRatio)) {\n this.options.resize.preserveAspectRatio = options.preserveAspectRatio;\n }\n else if (utils.is.bool(options.square)) {\n this.options.resize.square = options.square;\n }\n\n return this;\n }\n if (utils.is.bool(options)) {\n this.options.resize.enabled = options;\n\n if (!options) {\n this.onresizestart = this.onresizestart = this.onresizeend = null;\n }\n\n return this;\n }\n return this.options.resize;\n};\n\nfunction checkResizeEdge (name, value, page, element, interactableElement, rect, margin) {\n // false, '', undefined, null\n if (!value) { return false; }\n\n // true value, use pointer coords and element rect\n if (value === true) {\n // if dimensions are negative, \"switch\" edges\n const width = utils.is.number(rect.width )? rect.width : rect.right - rect.left;\n const height = utils.is.number(rect.height)? rect.height : rect.bottom - rect.top ;\n\n if (width < 0) {\n if (name === 'left' ) { name = 'right'; }\n else if (name === 'right') { name = 'left' ; }\n }\n if (height < 0) {\n if (name === 'top' ) { name = 'bottom'; }\n else if (name === 'bottom') { name = 'top' ; }\n }\n\n if (name === 'left' ) { return page.x < ((width >= 0? rect.left: rect.right ) + margin); }\n if (name === 'top' ) { return page.y < ((height >= 0? rect.top : rect.bottom) + margin); }\n\n if (name === 'right' ) { return page.x > ((width >= 0? rect.right : rect.left) - margin); }\n if (name === 'bottom') { return page.y > ((height >= 0? rect.bottom: rect.top ) - margin); }\n }\n\n // the remaining checks require an element\n if (!utils.is.element(element)) { return false; }\n\n return utils.is.element(value)\n // the value is an element to use as a resize handle\n ? value === element\n // otherwise check if element matches value as selector\n : utils.matchesUpTo(element, value, interactableElement);\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.resizeAxes = 'xy';\n});\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action }) {\n if (action !== 'resize' || !interaction.resizeAxes) { return; }\n\n const options = interaction.target.options;\n\n if (options.resize.square) {\n if (interaction.resizeAxes === 'y') {\n iEvent.dx = iEvent.dy;\n }\n else {\n iEvent.dy = iEvent.dx;\n }\n iEvent.axes = 'xy';\n }\n else {\n iEvent.axes = interaction.resizeAxes;\n\n if (interaction.resizeAxes === 'x') {\n iEvent.dy = 0;\n }\n else if (interaction.resizeAxes === 'y') {\n iEvent.dx = 0;\n }\n }\n});\n\nactions.resize = resize;\nactions.names.push('resize');\nutils.merge(Interactable.eventTypes, [\n 'resizestart',\n 'resizemove',\n 'resizeinertiastart',\n 'resizeinertiaresume',\n 'resizeend',\n]);\nactions.methodDict.resize = 'resizable';\n\ndefaultOptions.resize = resize.defaults;\n\nmodule.exports = resize;\n","const raf = require('./utils/raf');\nconst getWindow = require('./utils/window').getWindow;\nconst is = require('./utils/is');\nconst domUtils = require('./utils/domUtils');\nconst Interaction = require('./Interaction');\nconst defaultOptions = require('./defaultOptions');\n\nconst autoScroll = {\n defaults: {\n enabled : false,\n container: null, // the item that is scrolled (Window or HTMLElement)\n margin : 60,\n speed : 300, // the scroll speed in pixels per second\n },\n\n interaction: null,\n i: null, // the handle returned by window.setInterval\n x: 0, y: 0, // Direction each pulse is to scroll in\n\n isScrolling: false,\n prevTime: 0,\n\n start: function (interaction) {\n autoScroll.isScrolling = true;\n raf.cancel(autoScroll.i);\n\n autoScroll.interaction = interaction;\n autoScroll.prevTime = new Date().getTime();\n autoScroll.i = raf.request(autoScroll.scroll);\n },\n\n stop: function () {\n autoScroll.isScrolling = false;\n raf.cancel(autoScroll.i);\n },\n\n // scroll the window by the values in scroll.x/y\n scroll: function () {\n const options = autoScroll.interaction.target.options[autoScroll.interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(autoScroll.interaction.element);\n const now = new Date().getTime();\n // change in time in seconds\n const dt = (now - autoScroll.prevTime) / 1000;\n // displacement\n const s = options.speed * dt;\n\n if (s >= 1) {\n if (is.window(container)) {\n container.scrollBy(autoScroll.x * s, autoScroll.y * s);\n }\n else if (container) {\n container.scrollLeft += autoScroll.x * s;\n container.scrollTop += autoScroll.y * s;\n }\n\n autoScroll.prevTime = now;\n }\n\n if (autoScroll.isScrolling) {\n raf.cancel(autoScroll.i);\n autoScroll.i = raf.request(autoScroll.scroll);\n }\n },\n check: function (interactable, actionName) {\n const options = interactable.options;\n\n return options[actionName].autoScroll && options[actionName].autoScroll.enabled;\n },\n onInteractionMove: function ({ interaction, pointer }) {\n if (!(interaction.interacting()\n && autoScroll.check(interaction.target, interaction.prepared.name))) {\n return;\n }\n\n if (interaction.simulation) {\n autoScroll.x = autoScroll.y = 0;\n return;\n }\n\n let top;\n let right;\n let bottom;\n let left;\n\n const options = interaction.target.options[interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(interaction.element);\n\n if (is.window(container)) {\n left = pointer.clientX < autoScroll.margin;\n top = pointer.clientY < autoScroll.margin;\n right = pointer.clientX > container.innerWidth - autoScroll.margin;\n bottom = pointer.clientY > container.innerHeight - autoScroll.margin;\n }\n else {\n const rect = domUtils.getElementClientRect(container);\n\n left = pointer.clientX < rect.left + autoScroll.margin;\n top = pointer.clientY < rect.top + autoScroll.margin;\n right = pointer.clientX > rect.right - autoScroll.margin;\n bottom = pointer.clientY > rect.bottom - autoScroll.margin;\n }\n\n autoScroll.x = (right ? 1: left? -1: 0);\n autoScroll.y = (bottom? 1: top? -1: 0);\n\n if (!autoScroll.isScrolling) {\n // set the autoScroll properties to those of the target\n autoScroll.margin = options.margin;\n autoScroll.speed = options.speed;\n\n autoScroll.start(interaction);\n }\n },\n};\n\nInteraction.signals.on('stop-active', function () {\n autoScroll.stop();\n});\n\nInteraction.signals.on('action-move', autoScroll.onInteractionMove);\n\ndefaultOptions.perAction.autoScroll = autoScroll.defaults;\n\nmodule.exports = autoScroll;\n","const Interactable = require('../Interactable');\nconst actions = require('../actions/base');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.ignoreFrom\n [ method ]\n *\n * If the target of the `mousedown`, `pointerdown` or `touchstart`\n * event or any of it's parents match the given CSS selector or\n * Element, no drag/resize/gesture is started.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to not ignore any elements\n = (string | Element | object) The current ignoreFrom value or this Interactable\n **\n | interact(element, { ignoreFrom: document.getElementById('no-action') });\n | // or\n | interact(element).ignoreFrom('input, textarea, a');\n\\*/\nInteractable.prototype.ignoreFrom = function (newValue) {\n return this._backCompatOption('ignoreFrom', newValue);\n};\n\n/*\\\n * Interactable.allowFrom\n [ method ]\n *\n * A drag/resize/gesture is started only If the target of the\n * `mousedown`, `pointerdown` or `touchstart` event or any of it's\n * parents match the given CSS selector or Element.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to allow from any element\n = (string | Element | object) The current allowFrom value or this Interactable\n **\n | interact(element, { allowFrom: document.getElementById('drag-handle') });\n | // or\n | interact(element).allowFrom('.handle');\n\\*/\nInteractable.prototype.allowFrom = function (newValue) {\n return this._backCompatOption('allowFrom', newValue);\n};\n\nInteractable.prototype.testIgnore = function (ignoreFrom, interactableElement, element) {\n if (!ignoreFrom || !is.element(element)) { return false; }\n\n if (is.string(ignoreFrom)) {\n return domUtils.matchesUpTo(element, ignoreFrom, interactableElement);\n }\n else if (is.element(ignoreFrom)) {\n return domUtils.nodeContains(ignoreFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testAllow = function (allowFrom, interactableElement, element) {\n if (!allowFrom) { return true; }\n\n if (!is.element(element)) { return false; }\n\n if (is.string(allowFrom)) {\n return domUtils.matchesUpTo(element, allowFrom, interactableElement);\n }\n else if (is.element(allowFrom)) {\n return domUtils.nodeContains(allowFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testIgnoreAllow = function (options, interactableElement, eventTarget) {\n return (!this.testIgnore(options.ignoreFrom, interactableElement, eventTarget)\n && this.testAllow(options.allowFrom, interactableElement, eventTarget));\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (event.buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\n","const interact = require('../interact');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst actions = require('../actions/base');\nconst defaultOptions = require('../defaultOptions');\nconst browser = require('../utils/browser');\nconst scope = require('../scope');\nconst utils = require('../utils');\nconst signals = require('../utils/Signals').new();\n\nrequire('./InteractableMethods');\n\nconst autoStart = {\n signals,\n withinInteractionLimit,\n // Allow this many interactions to happen simultaneously\n maxInteractions: Infinity,\n defaults: {\n perAction: {\n manualStart: false,\n max: Infinity,\n maxPerElement: 1,\n allowFrom: null,\n ignoreFrom: null,\n },\n },\n setActionDefaults: function (action) {\n utils.extend(action.defaults, autoStart.defaults.perAction);\n },\n};\n\n// set cursor style on mousedown\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget }) {\n if (interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\n// set cursor style on mousemove\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget }) {\n if (!interaction.mouse\n || interaction.pointerIsDown\n || interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\nInteraction.signals.on('move', function (arg) {\n const { interaction, event } = arg;\n\n if (!interaction.pointerIsDown\n || interaction.interacting()\n || !interaction.pointerWasMoved\n || !interaction.prepared.name) {\n return;\n }\n\n signals.fire('before-start', arg);\n\n const target = interaction.target;\n\n if (interaction.prepared.name && target) {\n // check manualStart and interaction limit\n if (target.options[interaction.prepared.name].manualStart\n || !withinInteractionLimit(target, interaction.element, interaction.prepared)) {\n interaction.stop(event);\n }\n else {\n interaction.start(interaction.prepared, target, interaction.element);\n }\n }\n});\n\n// Check if the current target supports the action.\n// If so, return the validated action. Otherwise, return null\nfunction validateAction (action, interactable, element, eventTarget) {\n if (utils.is.object(action)\n && interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget)\n && interactable.options[action.name].enabled\n && withinInteractionLimit(interactable, element, action)) {\n return action;\n }\n\n return null;\n}\n\nfunction validateSelector (interaction, pointer, event, matches, matchElements, eventTarget) {\n for (let i = 0, len = matches.length; i < len; i++) {\n const match = matches[i];\n const matchElement = matchElements[i];\n const action = validateAction(match.getAction(pointer, event, interaction, matchElement),\n match,\n matchElement,\n eventTarget);\n\n if (action) {\n return {\n action,\n target: match,\n element: matchElement,\n };\n }\n }\n\n return {};\n}\n\nfunction getActionInfo (interaction, pointer, event, eventTarget) {\n let matches = [];\n let matchElements = [];\n\n let element = eventTarget;\n let action = null;\n\n function pushMatches (interactable, selector, context) {\n const elements = (browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined);\n\n if (utils.matchesSelector(element, selector, elements)) {\n\n matches.push(interactable);\n matchElements.push(element);\n }\n }\n\n while (utils.is.element(element)) {\n matches = [];\n matchElements = [];\n\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && (action = validateAction(elementInteractable.getAction(pointer, event, interaction, element, eventTarget),\n elementInteractable,\n element,\n eventTarget))\n && !elementInteractable.options[action.name].manualStart) {\n return {\n element,\n action,\n target: elementInteractable,\n };\n }\n else {\n scope.interactables.forEachSelector(pushMatches, element);\n\n const actionInfo = validateSelector(interaction, pointer, event, matches, matchElements, eventTarget);\n\n if (actionInfo.action\n && !actionInfo.target.options[actionInfo.action.name].manualStart) {\n return actionInfo;\n }\n }\n\n element = utils.parentNode(element);\n }\n\n return {};\n}\n\nfunction prepare (interaction, { action, target, element }) {\n action = action || {};\n\n if (interaction.target && interaction.target.options.styleCursor) {\n interaction.target._doc.documentElement.style.cursor = '';\n }\n\n interaction.target = target;\n interaction.element = element;\n utils.copyAction(interaction.prepared, action);\n\n if (target && target.options.styleCursor) {\n const cursor = action? actions[action.name].getCursor(action) : '';\n interaction.target._doc.documentElement.style.cursor = cursor;\n }\n\n signals.fire('prepared', { interaction: interaction });\n}\n\nInteraction.signals.on('stop', function ({ interaction }) {\n const target = interaction.target;\n\n if (target && target.options.styleCursor) {\n target._doc.documentElement.style.cursor = '';\n }\n});\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (utils.is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (utils.is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n const buttons = event.buttons || ({\n 0: 1,\n 1: 4,\n 3: 8,\n 4: 16,\n })[event.button];\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\nfunction withinInteractionLimit (interactable, element, action) {\n const options = interactable.options;\n const maxActions = options[action.name].max;\n const maxPerElement = options[action.name].maxPerElement;\n let activeInteractions = 0;\n let targetCount = 0;\n let targetElementCount = 0;\n\n // no actions if any of these values == 0\n if (!(maxActions && maxPerElement && autoStart.maxInteractions)) { return; }\n\n for (let i = 0, len = scope.interactions.length; i < len; i++) {\n const interaction = scope.interactions[i];\n const otherAction = interaction.prepared.name;\n\n if (!interaction.interacting()) { continue; }\n\n activeInteractions++;\n\n if (activeInteractions >= autoStart.maxInteractions) {\n return false;\n }\n\n if (interaction.target !== interactable) { continue; }\n\n targetCount += (otherAction === action.name)|0;\n\n if (targetCount >= maxActions) {\n return false;\n }\n\n if (interaction.element === element) {\n targetElementCount++;\n\n if (otherAction !== action.name || targetElementCount >= maxPerElement) {\n return false;\n }\n }\n }\n\n return autoStart.maxInteractions > 0;\n}\n\n/*\\\n * interact.maxInteractions\n [ method ]\n **\n * Returns or sets the maximum number of concurrent interactions allowed.\n * By default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables\n * and elements, you need to enable it in the draggable, resizable and\n * gesturable `'max'` and `'maxPerElement'` options.\n **\n - newValue (number) #optional Any number. newValue <= 0 means no interactions.\n\\*/\ninteract.maxInteractions = function (newValue) {\n if (utils.is.number(newValue)) {\n autoStart.maxInteractions = newValue;\n\n return this;\n }\n\n return autoStart.maxInteractions;\n};\n\nInteractable.settingsMethods.push('styleCursor');\nInteractable.settingsMethods.push('actionChecker');\nInteractable.settingsMethods.push('ignoreFrom');\nInteractable.settingsMethods.push('allowFrom');\n\ndefaultOptions.base.actionChecker = null;\ndefaultOptions.base.styleCursor = true;\n\nutils.extend(defaultOptions.perAction, autoStart.defaults.perAction);\n\nmodule.exports = autoStart;\n","const autoStart = require('./base');\nconst Interaction = require('../Interaction');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.delayTimer = null;\n});\n\nautoStart.signals.on('prepared', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.delayTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.target, interaction.element);\n }, delay);\n }\n});\n\nInteraction.signals.on('move', function ({ interaction, duplicate }) {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.delayTimer);\n }\n});\n\n// prevent regular down->move autoStart\nautoStart.signals.on('before-start', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.prepared.name = null;\n }\n});\n","const autoStart = require('./base');\nconst scope = require('../scope');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\n\nconst { matchesSelector, parentNode } = require('../utils/domUtils');\n\nautoStart.setActionDefaults(require('../actions/drag'));\n\nautoStart.signals.on('before-start', function ({ interaction, eventTarget, dx, dy }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // check if a drag is in the correct axis\n const absX = Math.abs(dx);\n const absY = Math.abs(dy);\n const options = interaction.target.options.drag;\n const startAxis = options.startAxis;\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy');\n\n interaction.prepared.axis = options.lockAxis === 'start'\n ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n : options.lockAxis;\n\n // if the movement isn't in the startAxis of the interactable\n if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) {\n // cancel the prepared action\n interaction.prepared.name = null;\n\n // then try to get a drag from another ineractable\n\n if (!interaction.prepared.name) {\n\n let element = eventTarget;\n\n const getDraggable = function (interactable, selector, context) {\n const elements = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n if (interactable === interaction.target) { return; }\n\n if (!options.manualStart\n && !interactable.testIgnoreAllow(options, element, eventTarget)\n && matchesSelector(element, selector, elements)) {\n\n const action = interactable.getAction(interaction.downPointer,\n interaction.downEvent,\n interaction,\n element);\n\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, interactable)\n && autoStart.validateAction(action, interactable, element, eventTarget)) {\n\n return interactable;\n }\n }\n };\n\n let action = null;\n\n // check all interactables\n while (is.element(element)) {\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && elementInteractable !== interaction.target\n && !elementInteractable.options.drag.manualStart) {\n\n action = elementInteractable.getAction(interaction.downPointer, interaction.downEvent, interaction, element);\n }\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, elementInteractable)) {\n\n interaction.prepared.name = 'drag';\n interaction.target = elementInteractable;\n interaction.element = element;\n break;\n }\n\n const selectorInteractable = scope.interactables.forEachSelector(getDraggable, element);\n\n if (selectorInteractable) {\n interaction.prepared.name = 'drag';\n interaction.target = selectorInteractable;\n interaction.element = element;\n break;\n }\n\n element = parentNode(element);\n }\n }\n }\n});\n\nfunction checkStartAxis (startAxis, interactable) {\n if (!interactable) { return false; }\n\n const thisAxis = interactable.options.drag.startAxis;\n\n return (startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis);\n}\n","require('./base').setActionDefaults(require('../actions/gesture'));\n","require('./base').setActionDefaults(require('../actions/resize'));\n","module.exports = {\n base: {\n accept : null,\n preventDefault: 'auto',\n deltaSource : 'page',\n },\n\n perAction: {\n origin: { x: 0, y: 0 },\n\n // only allow left button by default\n // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n mouseButtons: 1,\n\n inertia: {\n enabled : false,\n resistance : 10, // the lambda in exponential decay\n minSpeed : 100, // target speed must be above this for inertia to start\n endSpeed : 10, // the speed at which inertia is slow enough to stop\n allowResume : true, // allow resuming an action in inertia phase\n smoothEndDuration: 300, // animate to snap/restrict endOnly if there's no inertia\n },\n },\n};\n","/* browser entry point */\n\n// Legacy browser support\nrequire('./legacyBrowsers');\n\n// inertia\nrequire('./inertia');\n\n// modifiers\nrequire('./modifiers/snap');\nrequire('./modifiers/restrict');\n\n// pointerEvents\nrequire('./pointerEvents/base');\nrequire('./pointerEvents/holdRepeat');\nrequire('./pointerEvents/interactableTargets');\n\n// delay\nrequire('./autoStart/delay');\n\n// actions\nrequire('./actions/gesture');\nrequire('./actions/resize');\nrequire('./actions/drag');\nrequire('./actions/drop');\n\n// load these modifiers after resize is loaded\nrequire('./modifiers/snapSize');\nrequire('./modifiers/restrictEdges');\nrequire('./modifiers/restrictSize');\n\n// autoStart actions\nrequire('./autoStart/gesture');\nrequire('./autoStart/resize');\nrequire('./autoStart/drag');\n\n// Interactable preventDefault setting\nrequire('./interactablePreventDefault.js');\n\n// autoScroll\nrequire('./autoScroll');\n\n// export interact\nmodule.exports = require('./interact');\n","const InteractEvent = require('./InteractEvent');\nconst Interaction = require('./Interaction');\nconst modifiers = require('./modifiers');\nconst utils = require('./utils');\nconst animationFrame = require('./utils/raf');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.inertiaStatus = {\n active : false,\n smoothEnd : false,\n allowResume: false,\n\n startEvent: null,\n upCoords : {},\n\n xe: 0, ye: 0,\n sx: 0, sy: 0,\n\n t0: 0,\n vx0: 0, vys: 0,\n duration: 0,\n\n lambda_v0: 0,\n one_ve_v0: 0,\n i : null,\n };\n\n interaction.boundInertiaFrame = () => inertiaFrame .apply(interaction);\n interaction.boundSmoothEndFrame = () => smoothEndFrame.apply(interaction);\n});\n\nInteraction.signals.on('down', function ({ interaction, event, pointer, eventTarget }) {\n const status = interaction.inertiaStatus;\n\n // Check if the down event hits the current inertia target\n if (status.active) {\n let element = eventTarget;\n\n // climb up the DOM tree from the event target\n while (utils.is.element(element)) {\n\n // if interaction element is the current inertia target element\n if (element === interaction.element) {\n // stop inertia\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n\n // update pointers to the down event's coordinates\n interaction.updatePointer(pointer);\n utils.setCoords(interaction.curCoords, interaction.pointers);\n\n // fire appropriate signals\n const signalArg = { interaction };\n Interaction.signals.fire('before-action-move', signalArg);\n Interaction.signals.fire('action-resume' , signalArg);\n\n // fire a reume event\n const resumeEvent = new InteractEvent(interaction,\n event,\n interaction.prepared.name,\n 'inertiaresume',\n interaction.element);\n\n interaction.target.fire(resumeEvent);\n interaction.prevEvent = resumeEvent;\n modifiers.resetStatuses(interaction.modifierStatuses);\n\n utils.copyCoords(interaction.prevCoords, interaction.curCoords);\n break;\n }\n\n element = utils.parentNode(element);\n }\n }\n});\n\nInteraction.signals.on('up', function ({ interaction, event }) {\n const status = interaction.inertiaStatus;\n\n if (!interaction.interacting() || status.active) { return; }\n\n const target = interaction.target;\n const options = target && target.options;\n const inertiaOptions = options && interaction.prepared.name && options[interaction.prepared.name].inertia;\n\n const now = new Date().getTime();\n const statuses = {};\n const page = utils.extend({}, interaction.curCoords.page);\n const pointerSpeed = interaction.pointerDelta.client.speed;\n\n let smoothEnd = false;\n let modifierResult;\n\n // check if inertia should be started\n const inertiaPossible = (inertiaOptions && inertiaOptions.enabled\n && interaction.prepared.name !== 'gesture'\n && event !== status.startEvent);\n\n const inertia = (inertiaPossible\n && (now - interaction.curCoords.timeStamp) < 50\n && pointerSpeed > inertiaOptions.minSpeed\n && pointerSpeed > inertiaOptions.endSpeed);\n\n const modifierArg = {\n interaction,\n pageCoords: page,\n statuses,\n preEnd: true,\n requireEndOnly: true,\n };\n\n // smoothEnd\n if (inertiaPossible && !inertia) {\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n if (modifierResult.shouldMove && modifierResult.locked) {\n smoothEnd = true;\n }\n }\n\n if (!(inertia || smoothEnd)) { return; }\n\n utils.copyCoords(status.upCoords, interaction.curCoords);\n\n interaction.pointers[0] = status.startEvent =\n new InteractEvent(interaction, event, interaction.prepared.name, 'inertiastart', interaction.element);\n\n status.t0 = now;\n\n status.active = true;\n status.allowResume = inertiaOptions.allowResume;\n interaction.simulation = status;\n\n target.fire(status.startEvent);\n\n if (inertia) {\n status.vx0 = interaction.pointerDelta.client.vx;\n status.vy0 = interaction.pointerDelta.client.vy;\n status.v0 = pointerSpeed;\n\n calcInertia(interaction, status);\n\n utils.extend(page, interaction.curCoords.page);\n\n page.x += status.xe;\n page.y += status.ye;\n\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n status.modifiedXe += modifierResult.dx;\n status.modifiedYe += modifierResult.dy;\n\n status.i = animationFrame.request(interaction.boundInertiaFrame);\n }\n else {\n status.smoothEnd = true;\n status.xe = modifierResult.dx;\n status.ye = modifierResult.dy;\n\n status.sx = status.sy = 0;\n\n status.i = animationFrame.request(interaction.boundSmoothEndFrame);\n }\n});\n\nInteraction.signals.on('stop-active', function ({ interaction }) {\n const status = interaction.inertiaStatus;\n\n if (status.active) {\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n }\n});\n\nfunction calcInertia (interaction, status) {\n const inertiaOptions = interaction.target.options[interaction.prepared.name].inertia;\n const lambda = inertiaOptions.resistance;\n const inertiaDur = -Math.log(inertiaOptions.endSpeed / status.v0) / lambda;\n\n status.x0 = interaction.prevEvent.pageX;\n status.y0 = interaction.prevEvent.pageY;\n status.t0 = status.startEvent.timeStamp / 1000;\n status.sx = status.sy = 0;\n\n status.modifiedXe = status.xe = (status.vx0 - inertiaDur) / lambda;\n status.modifiedYe = status.ye = (status.vy0 - inertiaDur) / lambda;\n status.te = inertiaDur;\n\n status.lambda_v0 = lambda / status.v0;\n status.one_ve_v0 = 1 - inertiaOptions.endSpeed / status.v0;\n}\n\nfunction inertiaFrame () {\n updateInertiaCoords(this);\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n\n const status = this.inertiaStatus;\n const options = this.target.options[this.prepared.name].inertia;\n const lambda = options.resistance;\n const t = new Date().getTime() / 1000 - status.t0;\n\n if (t < status.te) {\n\n const progress = 1 - (Math.exp(-lambda * t) - status.lambda_v0) / status.one_ve_v0;\n\n if (status.modifiedXe === status.xe && status.modifiedYe === status.ye) {\n status.sx = status.xe * progress;\n status.sy = status.ye * progress;\n }\n else {\n const quadPoint = utils.getQuadraticCurvePoint(0, 0,\n status.xe,\n status.ye,\n status.modifiedXe,\n status.modifiedYe,\n progress);\n\n status.sx = quadPoint.x;\n status.sy = quadPoint.y;\n }\n\n this.doMove();\n\n status.i = animationFrame.request(this.boundInertiaFrame);\n }\n else {\n status.sx = status.modifiedXe;\n status.sy = status.modifiedYe;\n\n this.doMove();\n this.end(status.startEvent);\n status.active = false;\n this.simulation = null;\n }\n\n utils.copyCoords(this.prevCoords, this.curCoords);\n}\n\nfunction smoothEndFrame () {\n updateInertiaCoords(this);\n\n const status = this.inertiaStatus;\n const t = new Date().getTime() - status.t0;\n const duration = this.target.options[this.prepared.name].inertia.smoothEndDuration;\n\n if (t < duration) {\n status.sx = utils.easeOutQuad(t, 0, status.xe, duration);\n status.sy = utils.easeOutQuad(t, 0, status.ye, duration);\n\n this.pointerMove(status.startEvent, status.startEvent);\n\n status.i = animationFrame.request(this.boundSmoothEndFrame);\n }\n else {\n status.sx = status.xe;\n status.sy = status.ye;\n\n this.pointerMove(status.startEvent, status.startEvent);\n this.end(status.startEvent);\n\n status.smoothEnd =\n status.active = false;\n this.simulation = null;\n }\n}\n\nfunction updateInertiaCoords (interaction) {\n const status = interaction.inertiaStatus;\n\n // return if inertia isn't running\n if (!status.active) { return; }\n\n const pageUp = status.upCoords.page;\n const clientUp = status.upCoords.client;\n\n utils.setCoords(interaction.curCoords, [ {\n pageX : pageUp.x + status.sx,\n pageY : pageUp.y + status.sy,\n clientX: clientUp.x + status.sx,\n clientY: clientUp.y + status.sy,\n } ]);\n}\n","const browser = require('./utils/browser');\nconst events = require('./utils/events');\nconst utils = require('./utils');\nconst scope = require('./scope');\nconst Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\n\nconst globalEvents = {};\n\n/*\\\n * interact\n [ method ]\n *\n * The methods of this variable can be used to set elements as\n * interactables and also to change various default settings.\n *\n * Calling it as a function and passing an element or a valid CSS selector\n * string returns an Interactable object which has various methods to\n * configure it.\n *\n - element (Element | string) The HTML or SVG Element to interact with or CSS selector\n = (object) An @Interactable\n *\n > Usage\n | interact('#draggable').draggable(true);\n |\n | var rectables = interact('rect');\n | rectables\n | .gesturable(true)\n | .on('gesturemove', function (event) {\n | // ...\n | });\n\\*/\nfunction interact (element, options) {\n let interactable = scope.interactables.get(element, options);\n\n if (!interactable) {\n interactable = new Interactable(element, options);\n interactable.events.global = globalEvents;\n }\n\n return interactable;\n}\n\n/*\\\n * interact.isSet\n [ method ]\n *\n * Check if an element has been set\n - element (Element) The Element being searched for\n = (boolean) Indicates if the element or CSS selector was previously passed to interact\n\\*/\ninteract.isSet = function (element, options) {\n return scope.interactables.indexOfElement(element, options && options.context) !== -1;\n};\n\n/*\\\n * interact.on\n [ method ]\n *\n * Adds a global listener for an InteractEvent or adds a DOM event to\n * `document`\n *\n - type (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) interact\n\\*/\ninteract.on = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.on(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.on(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n // if it is an InteractEvent type, add listener to globalEvents\n if (utils.contains(Interactable.eventTypes, type)) {\n // if this type of event was never bound\n if (!globalEvents[type]) {\n globalEvents[type] = [listener];\n }\n else {\n globalEvents[type].push(listener);\n }\n }\n // If non InteractEvent type, addEventListener to document\n else {\n events.add(scope.document, type, listener, { options });\n }\n\n return interact;\n};\n\n/*\\\n * interact.off\n [ method ]\n *\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n - type (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) interact\n \\*/\ninteract.off = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.off(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.off(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n if (!utils.contains(Interactable.eventTypes, type)) {\n events.remove(scope.document, type, listener, options);\n }\n else {\n let index;\n\n if (type in globalEvents\n && (index = utils.indexOf(globalEvents[type], listener)) !== -1) {\n globalEvents[type].splice(index, 1);\n }\n }\n\n return interact;\n};\n\n/*\\\n * interact.debug\n [ method ]\n *\n * Returns an object which exposes internal data\n = (object) An object with properties that outline the current state and expose internal functions and variables\n\\*/\ninteract.debug = function () {\n return scope;\n};\n\n// expose the functions used to calculate multi-touch properties\ninteract.getPointerAverage = utils.pointerAverage;\ninteract.getTouchBBox = utils.touchBBox;\ninteract.getTouchDistance = utils.touchDistance;\ninteract.getTouchAngle = utils.touchAngle;\n\ninteract.getElementRect = utils.getElementRect;\ninteract.getElementClientRect = utils.getElementClientRect;\ninteract.matchesSelector = utils.matchesSelector;\ninteract.closest = utils.closest;\n\n/*\\\n * interact.supportsTouch\n [ method ]\n *\n = (boolean) Whether or not the browser supports touch input\n\\*/\ninteract.supportsTouch = function () {\n return browser.supportsTouch;\n};\n\n/*\\\n * interact.supportsPointerEvent\n [ method ]\n *\n = (boolean) Whether or not the browser supports PointerEvents\n\\*/\ninteract.supportsPointerEvent = function () {\n return browser.supportsPointerEvent;\n};\n\n/*\\\n * interact.stop\n [ method ]\n *\n * Cancels all interactions (end events are not fired)\n *\n - event (Event) An event on which to call preventDefault()\n = (object) interact\n\\*/\ninteract.stop = function (event) {\n for (let i = scope.interactions.length - 1; i >= 0; i--) {\n scope.interactions[i].stop(event);\n }\n\n return interact;\n};\n\n/*\\\n * interact.pointerMoveTolerance\n [ method ]\n * Returns or sets the distance the pointer must be moved before an action\n * sequence occurs. This also affects tolerance for tap events.\n *\n - newValue (number) #optional The movement from the start position must be greater than this value\n = (number | Interactable) The current setting or interact\n\\*/\ninteract.pointerMoveTolerance = function (newValue) {\n if (utils.is.number(newValue)) {\n Interaction.pointerMoveTolerance = newValue;\n\n return this;\n }\n\n return Interaction.pointerMoveTolerance;\n};\n\ninteract.addDocument = scope.addDocument;\ninteract.removeDocument = scope.removeDocument;\n\nscope.interact = interact;\n\nmodule.exports = interact;\n","const Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\nconst scope = require('./scope');\nconst is = require('./utils/is');\nconst events = require('./utils/events');\n\nconst { nodeContains, matchesSelector } = require('./utils/domUtils');\n\n/*\\\n * Interactable.preventDefault\n [ method ]\n *\n * Returns or sets whether to prevent the browser's default behaviour\n * in response to pointer events. Can be set to:\n * - `'always'` to always prevent\n * - `'never'` to never prevent\n * - `'auto'` to let interact.js try to determine what would be best\n *\n - newValue (string) #optional `true`, `false` or `'auto'`\n = (string | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.preventDefault = function (newValue) {\n if (/^(always|never|auto)$/.test(newValue)) {\n this.options.preventDefault = newValue;\n return this;\n }\n\n if (is.bool(newValue)) {\n this.options.preventDefault = newValue? 'always' : 'never';\n return this;\n }\n\n return this.options.preventDefault;\n};\n\nInteractable.prototype.checkAndPreventDefault = function (event) {\n const setting = this.options.preventDefault;\n\n if (setting === 'never') { return; }\n\n if (setting === 'always') {\n event.preventDefault();\n return;\n }\n\n // setting === 'auto'\n\n // don't preventDefault if the browser supports passiveEvents\n // CSS touch-action and user-selecct should be used instead\n if (events.supportsOptions) {\n return;\n }\n\n // don't preventDefault of pointerdown events\n if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) {\n return;\n }\n\n // don't preventDefault on editable elements\n if (is.element(event.target)\n && matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) {\n return;\n }\n\n event.preventDefault();\n};\n\nfunction onInteractionEvent ({ interaction, event }) {\n if (interaction.target) {\n interaction.target.checkAndPreventDefault(event);\n }\n}\n\nfor (const eventSignal of ['down', 'move', 'up', 'cancel']) {\n Interaction.signals.on(eventSignal, onInteractionEvent);\n}\n\n// prevent native HTML5 drag on interact.js target elements\nInteraction.docEvents.dragstart = function preventNativeDrag (event) {\n for (const interaction of scope.interactions) {\n\n if (interaction.element\n && (interaction.element === event.target\n || nodeContains(interaction.element, event.target))) {\n\n interaction.target.checkAndPreventDefault(event);\n return;\n }\n }\n};\n","const scope = require('./scope');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst iFinder = require('./utils/interactionFinder');\nconst pointerEvents = require('./pointerEvents/base');\n\nconst { window } = require('./utils/window');\n\nconst toString = Object.prototype.toString;\n\nif (!window.Array.isArray) {\n window.Array.isArray = function (obj) {\n return toString.call(obj) === '[object Array]';\n };\n}\n\nif (!String.prototype.trim) {\n String.prototype.trim = function () {\n return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n };\n}\n\n// http://www.quirksmode.org/dom/events/click.html\n// >Events leading to dblclick\n//\n// IE8 doesn't fire down event before dblclick.\n// This workaround tries to fire a tap and doubletap after dblclick\nfunction onIE8Dblclick (event) {\n const eventTarget = event.target;\n const interaction = iFinder.search(event, event.type, eventTarget);\n\n if (!interaction) { return; }\n\n if (interaction.prevTap\n && event.clientX === interaction.prevTap.clientX\n && event.clientY === interaction.prevTap.clientY\n && eventTarget === interaction.prevTap.target) {\n\n interaction.downTargets[0] = eventTarget;\n interaction.downTimes [0] = new Date().getTime();\n\n pointerEvents.fire({\n interaction,\n event,\n eventTarget,\n pointer: event,\n type: 'tap',\n });\n }\n}\n\nif (browser.isIE8) {\n const selectFix = function (event) {\n for (const interaction of scope.interactions) {\n if (interaction.interacting()) {\n interaction.target.checkAndPreventDefault(event);\n }\n }\n };\n\n const onDocIE8 = function onDocIE8 ({ doc, win }, signalName) {\n const eventMethod = signalName.indexOf('listen') === 0\n ? events.add : events.remove;\n\n // For IE's lack of Event#preventDefault\n eventMethod(doc, 'selectstart', selectFix);\n\n if (pointerEvents) {\n eventMethod(doc, 'dblclick', onIE8Dblclick);\n }\n };\n\n scope.signals.on('add-document' , onDocIE8);\n scope.signals.on('remove-document', onDocIE8);\n}\n\nmodule.exports = null;\n","const InteractEvent = require('../InteractEvent');\nconst Interaction = require('../Interaction');\nconst extend = require('../utils/extend');\n\nconst modifiers = {\n names: [],\n\n setOffsets: function (arg) {\n const { interaction, pageCoords: page } = arg;\n const { target, element, startOffset } = interaction;\n const rect = target.getRect(element);\n\n if (rect) {\n startOffset.left = page.x - rect.left;\n startOffset.top = page.y - rect.top;\n\n startOffset.right = rect.right - page.x;\n startOffset.bottom = rect.bottom - page.y;\n\n if (!('width' in rect)) { rect.width = rect.right - rect.left; }\n if (!('height' in rect)) { rect.height = rect.bottom - rect.top ; }\n }\n else {\n startOffset.left = startOffset.top = startOffset.right = startOffset.bottom = 0;\n }\n\n arg.rect = rect;\n arg.interactable = target;\n arg.element = element;\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n\n arg.options = target.options[interaction.prepared.name][modifierName];\n\n if (!arg.options) {\n continue;\n }\n\n interaction.modifierOffsets[modifierName] = modifiers[modifierName].setOffset(arg);\n }\n },\n\n setAll: function (arg) {\n const { interaction, statuses, preEnd, requireEndOnly } = arg;\n const coords = extend({}, arg.pageCoords);\n const result = {\n dx: 0,\n dy: 0,\n changed: false,\n locked: false,\n shouldMove: true,\n };\n\n for (const modifierName of modifiers.names) {\n const modifier = modifiers[modifierName];\n const options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!shouldDo(options, preEnd, requireEndOnly)) { continue; }\n\n arg.status = arg.status = statuses[modifierName];\n arg.options = options;\n arg.offset = arg.interaction.modifierOffsets[modifierName];\n\n modifier.set(arg);\n\n if (arg.status.locked) {\n coords.x += arg.status.dx;\n coords.y += arg.status.dy;\n\n result.dx += arg.status.dx;\n result.dy += arg.status.dy;\n\n result.locked = true;\n }\n }\n\n // a move should be fired if:\n // - there are no modifiers enabled,\n // - no modifiers are \"locked\" i.e. have changed the pointer's coordinates, or\n // - the locked coords have changed since the last pointer move\n result.shouldMove = !arg.status || !result.locked || arg.status.changed;\n\n return result;\n },\n\n resetStatuses: function (statuses) {\n for (const modifierName of modifiers.names) {\n const status = statuses[modifierName] || {};\n\n status.dx = status.dy = 0;\n status.modifiedX = status.modifiedY = NaN;\n status.locked = false;\n status.changed = true;\n\n statuses[modifierName] = status;\n }\n\n return statuses;\n },\n\n start: function ({ interaction }, signalName) {\n const arg = {\n interaction,\n pageCoords: (signalName === 'action-resume' ?\n interaction.curCoords : interaction.startCoords).page,\n startOffset: interaction.startOffset,\n statuses: interaction.modifierStatuses,\n preEnd: false,\n requireEndOnly: false,\n };\n\n modifiers.setOffsets(arg);\n modifiers.resetStatuses(arg.statuses);\n\n arg.pageCoords = extend({}, interaction.startCoords.page);\n interaction.modifierResult = modifiers.setAll(arg);\n },\n};\n\nInteraction.signals.on('new', function (interaction) {\n interaction.startOffset = { left: 0, right: 0, top: 0, bottom: 0 };\n interaction.modifierOffsets = {};\n interaction.modifierStatuses = modifiers.resetStatuses({});\n interaction.modifierResult = null;\n});\n\nInteraction.signals.on('action-start' , modifiers.start);\nInteraction.signals.on('action-resume', modifiers.start);\n\nInteraction.signals.on('before-action-move', function ({ interaction, preEnd, interactingBeforeMove }) {\n const modifierResult = modifiers.setAll({\n interaction,\n preEnd,\n pageCoords: interaction.curCoords.page,\n statuses: interaction.modifierStatuses,\n requireEndOnly: false,\n });\n\n // don't fire an action move if a modifier would keep the event in the same\n // cordinates as before\n if (!modifierResult.shouldMove && interactingBeforeMove) {\n interaction._dontFireMove = true;\n }\n\n interaction.modifierResult = modifierResult;\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n for (let i = 0; i < modifiers.names.length; i++) {\n const options = interaction.target.options[interaction.prepared.name][modifiers.names[i]];\n\n // if the endOnly option is true for any modifier\n if (shouldDo(options, true, true)) {\n // fire a move event at the modified coordinates\n interaction.doMove({ event, preEnd: true });\n break;\n }\n }\n});\n\nInteractEvent.signals.on('set-xy', function (arg) {\n const { iEvent, interaction } = arg;\n const modifierArg = extend({}, arg);\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n modifierArg.options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!modifierArg.options) {\n continue;\n }\n\n const modifier = modifiers[modifierName];\n\n modifierArg.status = interaction.modifierStatuses[modifierName];\n\n iEvent[modifierName] = modifier.modifyCoords(modifierArg);\n }\n});\n\nfunction shouldDo (options, preEnd, requireEndOnly) {\n return (options && options.enabled\n && (preEnd || !options.endOnly)\n && (!requireEndOnly || options.endOnly));\n}\n\nmodule.exports = modifiers;\n","const modifiers = require('./index');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst restrict = {\n defaults: {\n enabled : false,\n endOnly : false,\n restriction: null,\n elementRect: null,\n },\n\n setOffset: function ({ rect, startOffset, options }) {\n const elementRect = options && options.elementRect;\n const offset = {};\n\n if (rect && elementRect) {\n offset.left = startOffset.left - (rect.width * elementRect.left);\n offset.top = startOffset.top - (rect.height * elementRect.top);\n\n offset.right = startOffset.right - (rect.width * (1 - elementRect.right));\n offset.bottom = startOffset.bottom - (rect.height * (1 - elementRect.bottom));\n }\n else {\n offset.left = offset.top = offset.right = offset.bottom = 0;\n }\n\n return offset;\n },\n\n set: function ({ pageCoords, interaction, status, options }) {\n if (!options) { return status; }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n\n const restriction = getRestrictionRect(options.restriction, interaction, page);\n\n if (!restriction) { return status; }\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n const rect = restriction;\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n const offset = interaction.modifierOffsets.restrict;\n\n // object is assumed to have\n // x, y, width, height or\n // left, top, right, bottom\n if ('x' in restriction && 'y' in restriction) {\n modifiedX = Math.max(Math.min(rect.x + rect.width - offset.right , page.x), rect.x + offset.left);\n modifiedY = Math.max(Math.min(rect.y + rect.height - offset.bottom, page.y), rect.y + offset.top );\n }\n else {\n modifiedX = Math.max(Math.min(rect.right - offset.right , page.x), rect.left + offset.left);\n modifiedY = Math.max(Math.min(rect.bottom - offset.bottom, page.y), rect.top + offset.top );\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const elementRect = options && options.elementRect;\n\n if (options && options.enabled\n && !(phase === 'start' && elementRect && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n getRestrictionRect,\n};\n\nfunction getRestrictionRect (value, interaction, page) {\n if (utils.is.function(value)) {\n return utils.resolveRectLike(value, interaction.target, interaction.element, [page.x, page.y, interaction]);\n } else {\n return utils.resolveRectLike(value, interaction.target, interaction.element);\n }\n}\n\nmodifiers.restrict = restrict;\nmodifiers.names.push('restrict');\n\ndefaultOptions.perAction.restrict = restrict.defaults;\n\nmodule.exports = restrict;\n","// This module adds the options.resize.restrictEdges setting which sets min and\n// max for the top, left, bottom and right edges of the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictEdges: {\n// inner: { top: 200, left: 200, right: 400, bottom: 400 },\n// outer: { top: 0, left: 0, right: 600, bottom: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst { getRestrictionRect } = require('./restrict');\n\nconst noInner = { top: +Infinity, left: +Infinity, bottom: -Infinity, right: -Infinity };\nconst noOuter = { top: -Infinity, left: -Infinity, bottom: +Infinity, right: +Infinity };\n\nconst restrictEdges = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n offset: null,\n },\n\n setOffset: function ({ interaction, startOffset, options }) {\n if (!options) {\n return utils.extend({}, startOffset);\n }\n\n const offset = getRestrictionRect(options.offset, interaction, interaction.startCoords.page);\n\n if (offset) {\n return {\n top: startOffset.top + offset.y,\n left: startOffset.left + offset.x,\n bottom: startOffset.bottom + offset.y,\n right: startOffset.right + offset.x,\n };\n }\n\n return startOffset;\n },\n\n set: function ({ pageCoords, interaction, status, offset, options }) {\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n const inner = rectUtils.xywhToTlbr(getRestrictionRect(options.inner, interaction, page)) || noInner;\n const outer = rectUtils.xywhToTlbr(getRestrictionRect(options.outer, interaction, page)) || noOuter;\n\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n if (edges.top) {\n modifiedY = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top);\n }\n else if (edges.bottom) {\n modifiedY = Math.max(Math.min(outer.bottom - offset.bottom, page.y), inner.bottom - offset.bottom);\n }\n if (edges.left) {\n modifiedX = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left);\n }\n else if (edges.right) {\n modifiedX = Math.max(Math.min(outer.right - offset.right, page.x), inner.right - offset.right);\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n if (options && options.enabled\n && !(phase === 'start' && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n noInner,\n noOuter,\n getRestrictionRect,\n};\n\nmodifiers.restrictEdges = restrictEdges;\nmodifiers.names.push('restrictEdges');\n\ndefaultOptions.perAction.restrictEdges = restrictEdges.defaults;\nresize.defaults.restrictEdges = restrictEdges.defaults;\n\nmodule.exports = restrictEdges;\n","// This module adds the options.resize.restrictSize setting which sets min and\n// max width and height for the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictSize: {\n// min: { width: -600, height: -600 },\n// max: { width: 600, height: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst restrictEdges = require('./restrictEdges');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst noMin = { width: -Infinity, height: -Infinity };\nconst noMax = { width: +Infinity, height: +Infinity };\n\nconst restrictSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n },\n\n setOffset: function ({ interaction }) {\n return interaction.startOffset;\n },\n\n set: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const rect = rectUtils.xywhToTlbr(interaction.resizeRects.inverted);\n\n const minSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.min, interaction)) || noMin;\n const maxSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.max, interaction)) || noMax;\n\n arg.options = {\n enabled: options.enabled,\n endOnly: options.endOnly,\n inner: utils.extend({}, restrictEdges.noInner),\n outer: utils.extend({}, restrictEdges.noOuter),\n };\n\n if (edges.top) {\n arg.options.inner.top = rect.bottom - minSize.height;\n arg.options.outer.top = rect.bottom - maxSize.height;\n }\n else if (edges.bottom) {\n arg.options.inner.bottom = rect.top + minSize.height;\n arg.options.outer.bottom = rect.top + maxSize.height;\n }\n if (edges.left) {\n arg.options.inner.left = rect.right - minSize.width;\n arg.options.outer.left = rect.right - maxSize.width;\n }\n else if (edges.right) {\n arg.options.inner.right = rect.left + minSize.width;\n arg.options.outer.right = rect.left + maxSize.width;\n }\n\n restrictEdges.set(arg);\n },\n\n modifyCoords: restrictEdges.modifyCoords,\n};\n\nmodifiers.restrictSize = restrictSize;\nmodifiers.names.push('restrictSize');\n\ndefaultOptions.perAction.restrictSize = restrictSize.defaults;\nresize.defaults.restrictSize = restrictSize.defaults;\n\nmodule.exports = restrictSize;\n","const modifiers = require('./index');\nconst interact = require('../interact');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst snap = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n\n relativePoints: null,\n },\n\n setOffset: function ({ interaction, interactable, element, rect, startOffset, options }) {\n const offsets = [];\n const optionsOrigin = utils.rectToXY(utils.resolveRectLike(options.origin));\n const origin = optionsOrigin || utils.getOriginXY(interactable, element, interaction.prepared.name);\n options = options || interactable.options[interaction.prepared.name].snap || {};\n\n let snapOffset;\n\n if (options.offset === 'startCoords') {\n snapOffset = {\n x: interaction.startCoords.page.x - origin.x,\n y: interaction.startCoords.page.y - origin.y,\n };\n }\n else {\n const offsetRect = utils.resolveRectLike(options.offset, interactable, element, [interaction]);\n\n snapOffset = utils.rectToXY(offsetRect) || { x: 0, y: 0 };\n }\n\n if (rect && options.relativePoints && options.relativePoints.length) {\n for (const { x: relativeX, y: relativeY } of options.relativePoints) {\n offsets.push({\n x: startOffset.left - (rect.width * relativeX) + snapOffset.x,\n y: startOffset.top - (rect.height * relativeY) + snapOffset.y,\n });\n }\n }\n else {\n offsets.push(snapOffset);\n }\n\n return offsets;\n },\n\n set: function ({ interaction, pageCoords, status, options, offset: offsets }) {\n const targets = [];\n let target;\n let page;\n let i;\n\n if (status.useStatusXY) {\n page = { x: status.x, y: status.y };\n }\n else {\n const origin = utils.getOriginXY(interaction.target, interaction.element, interaction.prepared.name);\n\n page = utils.extend({}, pageCoords);\n\n page.x -= origin.x;\n page.y -= origin.y;\n }\n\n status.realX = page.x;\n status.realY = page.y;\n\n let len = options.targets? options.targets.length : 0;\n\n for (const { x: offsetX, y: offsetY } of offsets) {\n const relativeX = page.x - offsetX;\n const relativeY = page.y - offsetY;\n\n for (const snapTarget of options.targets) {\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n targets.push({\n x: utils.is.number(target.x) ? (target.x + offsetX) : relativeX,\n y: utils.is.number(target.y) ? (target.y + offsetY) : relativeY,\n\n range: utils.is.number(target.range)? target.range: options.range,\n });\n }\n }\n\n const closest = {\n target: null,\n inRange: false,\n distance: 0,\n range: 0,\n dx: 0,\n dy: 0,\n };\n\n for (i = 0, len = targets.length; i < len; i++) {\n target = targets[i];\n\n const range = target.range;\n const dx = target.x - page.x;\n const dy = target.y - page.y;\n const distance = utils.hypot(dx, dy);\n let inRange = distance <= range;\n\n // Infinite targets count as being out of range\n // compared to non infinite ones that are in range\n if (range === Infinity && closest.inRange && closest.range !== Infinity) {\n inRange = false;\n }\n\n if (!closest.target || (inRange\n // is the closest target in range?\n ? (closest.inRange && range !== Infinity\n // the pointer is relatively deeper in this target\n ? distance / range < closest.distance / closest.range\n // this target has Infinite range and the closest doesn't\n : (range === Infinity && closest.range !== Infinity)\n // OR this target is closer that the previous closest\n || distance < closest.distance)\n // The other is not in range and the pointer is closer to this target\n : (!closest.inRange && distance < closest.distance))) {\n\n closest.target = target;\n closest.distance = distance;\n closest.range = range;\n closest.inRange = inRange;\n closest.dx = dx;\n closest.dy = dy;\n\n status.range = range;\n }\n }\n\n let snapChanged;\n\n if (closest.target) {\n snapChanged = (status.modifiedX !== closest.target.x || status.modifiedY !== closest.target.y);\n\n status.modifiedX = closest.target.x;\n status.modifiedY = closest.target.y;\n }\n else {\n snapChanged = true;\n\n status.modifiedX = NaN;\n status.modifiedY = NaN;\n }\n\n status.dx = closest.dx;\n status.dy = closest.dy;\n\n status.changed = (snapChanged || (closest.inRange && !status.locked));\n status.locked = closest.inRange;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const relativePoints = options && options.relativePoints;\n\n if (options && options.enabled\n && !(phase === 'start' && relativePoints && relativePoints.length)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n }\n\n return {\n range : status.range,\n locked : status.locked,\n x : status.modifiedX,\n y : status.modifiedY,\n realX : status.realX,\n realY : status.realY,\n dx : status.dx,\n dy : status.dy,\n };\n }\n },\n};\n\ninteract.createSnapGrid = function (grid) {\n return function (x, y) {\n const limits = grid.limits || {\n left : -Infinity,\n right : Infinity,\n top : -Infinity,\n bottom: Infinity,\n };\n let offsetX = 0;\n let offsetY = 0;\n\n if (utils.is.object(grid.offset)) {\n offsetX = grid.offset.x;\n offsetY = grid.offset.y;\n }\n\n const gridx = Math.round((x - offsetX) / grid.x);\n const gridy = Math.round((y - offsetY) / grid.y);\n\n const newX = Math.max(limits.left, Math.min(limits.right , gridx * grid.x + offsetX));\n const newY = Math.max(limits.top , Math.min(limits.bottom, gridy * grid.y + offsetY));\n\n return {\n x: newX,\n y: newY,\n range: grid.range,\n };\n };\n};\n\nmodifiers.snap = snap;\nmodifiers.names.push('snap');\n\ndefaultOptions.perAction.snap = snap.defaults;\n\nmodule.exports = snap;\n","// This module allows snapping of the size of targets during resize\n// interactions.\n\nconst modifiers = require('./index');\nconst snap = require('./snap');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\nconst utils = require('../utils/');\n\nconst snapSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n },\n\n setOffset: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.edges;\n\n if (!edges) { return; }\n\n arg.options = {\n relativePoints: [{\n x: edges.left? 0 : 1,\n y: edges.top ? 0 : 1,\n }],\n origin: { x: 0, y: 0 },\n offset: 'self',\n range: options.range,\n };\n\n const offsets = snap.setOffset(arg);\n arg.options = options;\n\n return offsets;\n },\n\n set: function (arg) {\n const { interaction, options, offset, pageCoords } = arg;\n const page = utils.extend({}, pageCoords);\n const relativeX = page.x - offset[0].x;\n const relativeY = page.y - offset[0].y;\n\n arg.options = utils.extend({}, options);\n arg.options.targets = [];\n\n for (const snapTarget of options.targets) {\n let target;\n\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n if ('width' in target && 'height' in target) {\n target.x = target.width;\n target.y = target.height;\n }\n\n arg.options.targets.push(target);\n }\n\n snap.set(arg);\n },\n\n modifyCoords: function (arg) {\n const { options } = arg;\n\n arg.options = utils.extend({}, options);\n arg.options.enabled = options.enabled;\n arg.options.relativePoints = [null];\n\n snap.modifyCoords(arg);\n },\n};\n\nmodifiers.snapSize = snapSize;\nmodifiers.names.push('snapSize');\n\ndefaultOptions.perAction.snapSize = snapSize.defaults;\nresize.defaults.snapSize = snapSize.defaults;\n\nmodule.exports = snapSize;\n","const pointerUtils = require('../utils/pointerUtils');\n\nmodule.exports = class PointerEvent {\n constructor (type, pointer, event, eventTarget, interaction) {\n pointerUtils.pointerExtend(this, event);\n\n if (event !== pointer) {\n pointerUtils.pointerExtend(this, pointer);\n }\n\n this.interaction = interaction;\n\n this.timeStamp = new Date().getTime();\n this.originalEvent = event;\n this.type = type;\n this.pointerId = pointerUtils.getPointerId(pointer);\n this.pointerType = pointerUtils.getPointerType(pointer);\n this.target = eventTarget;\n this.currentTarget = null;\n\n if (type === 'tap') {\n const pointerIndex = interaction.getPointerIndex(pointer);\n this.dt = this.timeStamp - interaction.downTimes[pointerIndex];\n\n const interval = this.timeStamp - interaction.tapTime;\n\n this.double = !!(interaction.prevTap\n && interaction.prevTap.type !== 'doubletap'\n && interaction.prevTap.target === this.target\n && interval < 500);\n }\n else if (type === 'doubletap') {\n this.dt = pointer.timeStamp - interaction.tapTime;\n }\n }\n\n subtractOrigin ({ x: originX, y: originY }) {\n this.pageX -= originX;\n this.pageY -= originY;\n this.clientX -= originX;\n this.clientY -= originY;\n\n return this;\n }\n\n addOrigin ({ x: originX, y: originY }) {\n this.pageX += originX;\n this.pageY += originY;\n this.clientX += originX;\n this.clientY += originY;\n\n return this;\n }\n\n preventDefault () {\n this.originalEvent.preventDefault();\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n};\n","const PointerEvent = require('./PointerEvent');\nconst Interaction = require('../Interaction');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst defaults = require('../defaultOptions');\nconst signals = require('../utils/Signals').new();\nconst { filter } = require('../utils/arr');\n\nconst simpleSignals = [ 'down', 'up', 'cancel' ];\nconst simpleEvents = [ 'down', 'up', 'cancel' ];\n\nconst pointerEvents = {\n PointerEvent,\n fire,\n collectEventTargets,\n signals,\n defaults: {\n holdDuration: 600,\n ignoreFrom : null,\n allowFrom : null,\n origin : { x: 0, y: 0 },\n },\n types: [\n 'down',\n 'move',\n 'up',\n 'cancel',\n 'tap',\n 'doubletap',\n 'hold',\n ],\n};\n\nfunction fire (arg) {\n const {\n interaction, pointer, event, eventTarget,\n type = arg.pointerEvent.type,\n targets = collectEventTargets(arg),\n pointerEvent = new PointerEvent(type, pointer, event, eventTarget, interaction),\n } = arg;\n\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n targets,\n type,\n pointerEvent,\n };\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n\n for (const prop in target.props || {}) {\n pointerEvent[prop] = target.props[prop];\n }\n\n const origin = utils.getOriginXY(target.eventable, target.element);\n\n pointerEvent.subtractOrigin(origin);\n pointerEvent.eventable = target.eventable;\n pointerEvent.currentTarget = target.element;\n\n target.eventable.fire(pointerEvent);\n\n pointerEvent.addOrigin(origin);\n\n if (pointerEvent.immediatePropagationStopped\n || (pointerEvent.propagationStopped\n && (i + 1) < targets.length && targets[i + 1].element !== pointerEvent.currentTarget)) {\n break;\n }\n }\n\n signals.fire('fired', signalArg);\n\n if (type === 'tap') {\n // if pointerEvent should make a double tap, create and fire a doubletap\n // PointerEvent and use that as the prevTap\n const prevTap = pointerEvent.double\n ? fire({\n interaction, pointer, event, eventTarget,\n type: 'doubletap',\n })\n : pointerEvent;\n\n interaction.prevTap = prevTap;\n interaction.tapTime = prevTap.timeStamp;\n }\n\n return pointerEvent;\n}\n\nfunction collectEventTargets ({ interaction, pointer, event, eventTarget, type }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n // do not fire a tap event if the pointer was moved before being lifted\n if (type === 'tap' && (interaction.pointerWasMoved\n // or if the pointerup target is different to the pointerdown target\n || !(interaction.downTargets[pointerIndex] && interaction.downTargets[pointerIndex] === eventTarget))) {\n return [];\n }\n\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n path,\n targets: [],\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (type === 'hold') {\n signalArg.targets = filter(signalArg.targets, target =>\n target.eventable.options.holdDuration === interaction.holdTimers[pointerIndex].duration);\n }\n\n return signalArg.targets;\n}\n\nInteraction.signals.on('update-pointer-down', function ({ interaction, pointerIndex }) {\n interaction.holdTimers[pointerIndex] = { duration: Infinity, timeout: null };\n});\n\nInteraction.signals.on('remove-pointer', function ({ interaction, pointerIndex }) {\n interaction.holdTimers.splice(pointerIndex, 1);\n});\n\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget, duplicateMove }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n if (!duplicateMove && (!interaction.pointerIsDown || interaction.pointerWasMoved)) {\n if (interaction.pointerIsDown) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n\n fire({\n interaction, pointer, event, eventTarget,\n type: 'move',\n });\n }\n});\n\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget, pointerIndex }) {\n // copy event to be used in timeout for IE8\n const eventCopy = browser.isIE8? utils.extend({}, event) : event;\n\n const timer = interaction.holdTimers[pointerIndex];\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'hold',\n targets: [],\n path,\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (!signalArg.targets.length) { return; }\n\n let minDuration = Infinity;\n\n for (let i = 0; i < signalArg.targets.length; i++) {\n const target = signalArg.targets[i];\n const holdDuration = target.eventable.options.holdDuration;\n\n if (holdDuration < minDuration) {\n minDuration = holdDuration;\n }\n }\n\n timer.duration = minDuration;\n timer.timeout = setTimeout(function () {\n fire({\n interaction,\n eventTarget,\n pointer: browser.isIE8? eventCopy : pointer,\n event: eventCopy,\n type: 'hold',\n });\n }, minDuration);\n});\n\nInteraction.signals.on('up', ({ interaction, pointer, event, eventTarget }) => {\n if (!interaction.pointerWasMoved) {\n fire({ interaction, eventTarget, pointer, event, type: 'tap' });\n }\n});\n\n['up', 'cancel'].forEach(function (signalName) {\n Interaction.signals.on(signalName, function ({ interaction, pointerIndex }) {\n if (interaction.holdTimers[pointerIndex]) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n });\n});\n\nfunction createSignalListener (type) {\n return function ({ interaction, pointer, event, eventTarget }) {\n fire({ interaction, eventTarget, pointer, event, type });\n };\n}\n\nfor (let i = 0; i < simpleSignals.length; i++) {\n Interaction.signals.on(simpleSignals[i], createSignalListener(simpleEvents[i]));\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.prevTap = null; // the most recent tap event on this interaction\n interaction.tapTime = 0; // time of the most recent tap event\n interaction.holdTimers = []; // [{ duration, timeout }]\n});\n\ndefaults.pointerEvents = pointerEvents.defaults;\nmodule.exports = pointerEvents;\n","const pointerEvents = require('./base');\nconst Interaction = require('../Interaction');\n\npointerEvents.signals.on('new', onNew);\npointerEvents.signals.on('fired', onFired);\n\nfor (const signal of ['move', 'up', 'cancel', 'endall']) {\n Interaction.signals.on(signal, endHoldRepeat);\n}\n\nfunction onNew ({ pointerEvent }) {\n if (pointerEvent.type !== 'hold') { return; }\n\n pointerEvent.count = (pointerEvent.count || 0) + 1;\n}\n\nfunction onFired ({ interaction, pointerEvent, eventTarget, targets }) {\n if (pointerEvent.type !== 'hold' || !targets.length) { return; }\n\n // get the repeat interval from the first eventable\n const interval = targets[0].eventable.options.holdRepeatInterval;\n\n // don't repeat if the interval is 0 or less\n if (interval <= 0) { return; }\n\n // set a timeout to fire the holdrepeat event\n interaction.holdIntervalHandle = setTimeout(function () {\n pointerEvents.fire({\n interaction,\n eventTarget,\n type: 'hold',\n pointer: pointerEvent,\n event: pointerEvent,\n });\n }, interval);\n}\n\nfunction endHoldRepeat ({ interaction }) {\n // set the interaction's holdStopTime property\n // to stop further holdRepeat events\n if (interaction.holdIntervalHandle) {\n clearInterval(interaction.holdIntervalHandle);\n interaction.holdIntervalHandle = null;\n }\n}\n\n// don't repeat by default\npointerEvents.defaults.holdRepeatInterval = 0;\npointerEvents.types.push('holdrepeat');\n\nmodule.exports = {\n onNew,\n onFired,\n endHoldRepeat,\n};\n","const pointerEvents = require('./base');\nconst Interactable = require('../Interactable');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\nconst scope = require('../scope');\nconst extend = require('../utils/extend');\nconst { merge } = require('../utils/arr');\n\npointerEvents.signals.on('collect-targets', function ({ targets, element, type, eventTarget }) {\n function collectSelectors (interactable, selector, context) {\n const els = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && is.element(element)\n && domUtils.matchesSelector(element, selector, els)\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n const interactable = scope.interactables.get(element);\n\n if (interactable) {\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n scope.interactables.forEachSelector(collectSelectors, element);\n});\n\nInteractable.signals.on('new', function ({ interactable }) {\n interactable.events.getRect = function (element) {\n return interactable.getRect(element);\n };\n});\n\nInteractable.signals.on('set', function ({ interactable, options }) {\n extend(interactable.events.options, pointerEvents.defaults);\n extend(interactable.events.options, options);\n});\n\nmerge(Interactable.eventTypes, pointerEvents.types);\n\nInteractable.prototype.pointerEvents = function (options) {\n extend(this.events.options, options);\n\n return this;\n};\n\nconst __backCompatOption = Interactable.prototype._backCompatOption;\n\nInteractable.prototype._backCompatOption = function (optionName, newValue) {\n const ret = __backCompatOption.call(this, optionName, newValue);\n\n if (ret === this) {\n this.events.options[optionName] = newValue;\n }\n\n return ret;\n};\n\nInteractable.settingsMethods.push('pointerEvents');\n","const utils = require('./utils');\nconst events = require('./utils/events');\nconst signals = require('./utils/Signals').new();\n\nconst scope = {\n signals,\n events,\n utils,\n\n // main document\n document: require('./utils/domObjects').document,\n // all documents being listened to\n documents: [],\n\n addDocument: function (doc, win) {\n // do nothing if document is already known\n if (utils.contains(scope.documents, doc)) { return false; }\n\n win = win || scope.getWindow(doc);\n\n scope.documents.push(doc);\n events.documents.push(doc);\n\n // don't add an unload event for the main document\n // so that the page may be cached in browser history\n if (doc !== scope.document) {\n events.add(win, 'unload', scope.onWindowUnload);\n }\n\n signals.fire('add-document', { doc, win });\n },\n\n removeDocument: function (doc, win) {\n const index = utils.indexOf(scope.documents, doc);\n\n win = win || scope.getWindow(doc);\n\n events.remove(win, 'unload', scope.onWindowUnload);\n\n scope.documents.splice(index, 1);\n events.documents.splice(index, 1);\n\n signals.fire('remove-document', { win, doc });\n },\n\n onWindowUnload: function () {\n scope.removeDocument(this.document, this);\n },\n};\n\nmodule.exports = scope;\n","const { indexOf } = require('./arr');\n\nclass Signals {\n constructor () {\n this.listeners = {\n // signalName: [listeners],\n };\n }\n\n on (name, listener) {\n if (!this.listeners[name]) {\n this.listeners[name] = [listener];\n return;\n }\n\n this.listeners[name].push(listener);\n }\n\n off (name, listener) {\n if (!this.listeners[name]) { return; }\n\n const index = indexOf(this.listeners[name], listener);\n\n if (index !== -1) {\n this.listeners[name].splice(index, 1);\n }\n }\n\n fire (name, arg) {\n const targetListeners = this.listeners[name];\n\n if (!targetListeners) { return; }\n\n for (let i = 0; i < targetListeners.length; i++) {\n if (targetListeners[i](arg, name) === false) {\n return;\n }\n }\n }\n}\n\nSignals.new = function () {\n return new Signals();\n};\n\nmodule.exports = Signals;\n","function indexOf (array, target) {\n for (let i = 0, len = array.length; i < len; i++) {\n if (array[i] === target) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction contains (array, target) {\n return indexOf(array, target) !== -1;\n}\n\nfunction merge (target, source) {\n for (let i = 0; i < source.length; i++) {\n target.push(source[i]);\n }\n\n return target;\n}\n\nfunction filter (array, test) {\n const result = [];\n\n for (let i = 0; i < array.length; i++) {\n if (test(array[i])) {\n result.push(array[i]);\n }\n }\n\n return result;\n}\n\nmodule.exports = {\n indexOf,\n contains,\n merge,\n filter,\n};\n","const { window } = require('./window');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst Element = domObjects.Element;\nconst navigator = window.navigator;\n\nconst browser = {\n // Does the browser support touch input?\n supportsTouch: !!(('ontouchstart' in window) || is.function(window.DocumentTouch)\n && domObjects.document instanceof window.DocumentTouch),\n\n // Does the browser support PointerEvents\n supportsPointerEvent: !!domObjects.PointerEvent,\n\n isIE8: ('attachEvent' in window) && !('addEventListener' in window),\n\n // Opera Mobile must be handled differently\n isOperaMobile: (navigator.appName === 'Opera'\n && browser.supportsTouch\n && navigator.userAgent.match('Presto')),\n\n // scrolling doesn't change the result of getClientRects on iOS 7\n isIOS7: (/iP(hone|od|ad)/.test(navigator.platform)\n && /OS 7[^\\d]/.test(navigator.appVersion)),\n\n isIe9OrOlder: /MSIE (8|9)/.test(navigator.userAgent),\n\n // prefix matchesSelector\n prefixedMatchesSelector: 'matches' in Element.prototype\n ? 'matches': 'webkitMatchesSelector' in Element.prototype\n ? 'webkitMatchesSelector': 'mozMatchesSelector' in Element.prototype\n ? 'mozMatchesSelector': 'oMatchesSelector' in Element.prototype\n ? 'oMatchesSelector': 'msMatchesSelector',\n\n useMatchesSelectorPolyfill: false,\n\n pEventTypes: (domObjects.PointerEvent\n ? (domObjects.PointerEvent === window.MSPointerEvent\n ? {\n up: 'MSPointerUp',\n down: 'MSPointerDown',\n over: 'mouseover',\n out: 'mouseout',\n move: 'MSPointerMove',\n cancel: 'MSPointerCancel',\n }\n : {\n up: 'pointerup',\n down: 'pointerdown',\n over: 'pointerover',\n out: 'pointerout',\n move: 'pointermove',\n cancel: 'pointercancel',\n })\n : null),\n\n // because Webkit and Opera still use 'mousewheel' event type\n wheelEvent: 'onmousewheel' in domObjects.document? 'mousewheel': 'wheel',\n\n};\n\nbrowser.useMatchesSelectorPolyfill = !is.function(Element.prototype[browser.prefixedMatchesSelector]);\n\nmodule.exports = browser;\n","const domObjects = {};\nconst win = require('./window').window;\n\nfunction blank () {}\n\ndomObjects.document = win.document;\ndomObjects.DocumentFragment = win.DocumentFragment || blank;\ndomObjects.SVGElement = win.SVGElement || blank;\ndomObjects.SVGSVGElement = win.SVGSVGElement || blank;\ndomObjects.SVGElementInstance = win.SVGElementInstance || blank;\ndomObjects.Element = win.Element || blank;\ndomObjects.HTMLElement = win.HTMLElement || domObjects.Element;\n\ndomObjects.Event = win.Event;\ndomObjects.Touch = win.Touch || blank;\ndomObjects.PointerEvent = (win.PointerEvent || win.MSPointerEvent);\n\nmodule.exports = domObjects;\n","const win = require('./window');\nconst browser = require('./browser');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst domUtils = {\n nodeContains: function (parent, child) {\n while (child) {\n if (child === parent) {\n return true;\n }\n\n child = child.parentNode;\n }\n\n return false;\n },\n\n closest: function (element, selector) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) { return element; }\n\n element = domUtils.parentNode(element);\n }\n\n return null;\n },\n\n parentNode: function (node) {\n let parent = node.parentNode;\n\n if (is.docFrag(parent)) {\n // skip past #shado-root fragments\n while ((parent = parent.host) && is.docFrag(parent)) {\n continue;\n }\n\n return parent;\n }\n\n return parent;\n },\n\n // taken from http://tanalin.com/en/blog/2012/12/matches-selector-ie8/ and modified\n matchesSelectorPolyfill: browser.useMatchesSelectorPolyfill\n ? function (element, selector, elems) {\n elems = elems || element.parentNode.querySelectorAll(selector);\n\n for (let i = 0, len = elems.length; i < len; i++) {\n if (elems[i] === element) {\n return true;\n }\n }\n\n return false;\n }\n : null,\n\n matchesSelector: function (element, selector, nodeList) {\n if (browser.useMatchesSelectorPolyfill) {\n return domUtils.matchesSelectorPolyfill(element, selector, nodeList);\n }\n\n // remove /deep/ from selectors if shadowDOM polyfill is used\n if (win.window !== win.realWindow) {\n selector = selector.replace(/\\/deep\\//g, ' ');\n }\n\n return element[browser.prefixedMatchesSelector](selector);\n },\n\n // Test for the element that's \"above\" all other qualifiers\n indexOfDeepestElement: function (elements) {\n let deepestZoneParents = [];\n let dropzoneParents = [];\n let dropzone;\n let deepestZone = elements[0];\n let index = deepestZone? 0: -1;\n let parent;\n let child;\n let i;\n let n;\n\n for (i = 1; i < elements.length; i++) {\n dropzone = elements[i];\n\n // an element might belong to multiple selector dropzones\n if (!dropzone || dropzone === deepestZone) {\n continue;\n }\n\n if (!deepestZone) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n // check if the deepest or current are document.documentElement or document.rootElement\n // - if the current dropzone is, do nothing and continue\n if (dropzone.parentNode === dropzone.ownerDocument) {\n continue;\n }\n // - if deepest is, update with the current dropzone and continue to next\n else if (deepestZone.parentNode === dropzone.ownerDocument) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n if (!deepestZoneParents.length) {\n parent = deepestZone;\n while (parent.parentNode && parent.parentNode !== parent.ownerDocument) {\n deepestZoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n }\n\n // if this element is an svg element and the current deepest is\n // an HTMLElement\n if (deepestZone instanceof domObjects.HTMLElement\n && dropzone instanceof domObjects.SVGElement\n && !(dropzone instanceof domObjects.SVGSVGElement)) {\n\n if (dropzone === deepestZone.parentNode) {\n continue;\n }\n\n parent = dropzone.ownerSVGElement;\n }\n else {\n parent = dropzone;\n }\n\n dropzoneParents = [];\n\n while (parent.parentNode !== parent.ownerDocument) {\n dropzoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n\n n = 0;\n\n // get (position of last common ancestor) + 1\n while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) {\n n++;\n }\n\n const parents = [\n dropzoneParents[n - 1],\n dropzoneParents[n],\n deepestZoneParents[n],\n ];\n\n child = parents[0].lastChild;\n\n while (child) {\n if (child === parents[1]) {\n deepestZone = dropzone;\n index = i;\n deepestZoneParents = [];\n\n break;\n }\n else if (child === parents[2]) {\n break;\n }\n\n child = child.previousSibling;\n }\n }\n\n return index;\n },\n\n matchesUpTo: function (element, selector, limit) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) {\n return true;\n }\n\n element = domUtils.parentNode(element);\n\n if (element === limit) {\n return domUtils.matchesSelector(element, selector);\n }\n }\n\n return false;\n },\n\n getActualElement: function (element) {\n return (element instanceof domObjects.SVGElementInstance\n ? element.correspondingUseElement\n : element);\n },\n\n getScrollXY: function (relevantWindow) {\n relevantWindow = relevantWindow || win.window;\n return {\n x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft,\n y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop,\n };\n },\n\n getElementClientRect: function (element) {\n const clientRect = (element instanceof domObjects.SVGElement\n ? element.getBoundingClientRect()\n : element.getClientRects()[0]);\n\n return clientRect && {\n left : clientRect.left,\n right : clientRect.right,\n top : clientRect.top,\n bottom: clientRect.bottom,\n width : clientRect.width || clientRect.right - clientRect.left,\n height: clientRect.height || clientRect.bottom - clientRect.top,\n };\n },\n\n getElementRect: function (element) {\n const clientRect = domUtils.getElementClientRect(element);\n\n if (!browser.isIOS7 && clientRect) {\n const scroll = domUtils.getScrollXY(win.getWindow(element));\n\n clientRect.left += scroll.x;\n clientRect.right += scroll.x;\n clientRect.top += scroll.y;\n clientRect.bottom += scroll.y;\n }\n\n return clientRect;\n },\n\n getPath: function (element) {\n const path = [];\n\n while (element) {\n path.push(element);\n element = domUtils.parentNode(element);\n }\n\n return path;\n },\n\n trySelector: value => {\n if (!is.string(value)) { return false; }\n\n // an exception will be raised if it is invalid\n domObjects.document.querySelector(value);\n return true;\n },\n};\n\nmodule.exports = domUtils;\n","const is = require('./is');\nconst domUtils = require('./domUtils');\nconst pExtend = require('./pointerExtend');\n\nconst { window, getWindow } = require('./window');\nconst { indexOf, contains } = require('./arr');\n\nconst useAttachEvent = ('attachEvent' in window) && !('addEventListener' in window);\nconst addEvent = useAttachEvent? 'attachEvent': 'addEventListener';\nconst removeEvent = useAttachEvent? 'detachEvent': 'removeEventListener';\nconst on = useAttachEvent? 'on': '';\n\nconst elements = [];\nconst targets = [];\nconst attachedListeners = [];\n\n// {\n// type: {\n// selectors: ['selector', ...],\n// contexts : [document, ...],\n// listeners: [[listener, capture, passive], ...]\n// }\n// }\nconst delegatedEvents = {};\n\nconst documents = [];\n\nconst supportsOptions = !useAttachEvent && (() => {\n let supported = false;\n\n window.document.createElement('div').addEventListener('test', null, {\n get capture () { supported = true; },\n });\n\n return supported;\n})();\n\nfunction add (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n let elementIndex = indexOf(elements, element);\n let target = targets[elementIndex];\n\n if (!target) {\n target = {\n events: {},\n typeCount: 0,\n };\n\n elementIndex = elements.push(element) - 1;\n targets.push(target);\n\n attachedListeners.push(useAttachEvent\n ? {\n supplied: [],\n wrapped : [],\n useCount: [],\n }\n : null);\n }\n\n if (!target.events[type]) {\n target.events[type] = [];\n target.typeCount++;\n }\n\n if (!contains(target.events[type], listener)) {\n let ret;\n\n if (useAttachEvent) {\n const { supplied, wrapped, useCount } = attachedListeners[elementIndex];\n const listenerIndex = indexOf(supplied, listener);\n\n const wrappedListener = wrapped[listenerIndex] || function (event) {\n if (!event.immediatePropagationStopped) {\n event.target = event.srcElement;\n event.currentTarget = element;\n\n event.preventDefault = event.preventDefault || preventDef;\n event.stopPropagation = event.stopPropagation || stopProp;\n event.stopImmediatePropagation = event.stopImmediatePropagation || stopImmProp;\n\n if (/mouse|click/.test(event.type)) {\n event.pageX = event.clientX + getWindow(element).document.documentElement.scrollLeft;\n event.pageY = event.clientY + getWindow(element).document.documentElement.scrollTop;\n }\n\n listener(event);\n }\n };\n\n ret = element[addEvent](on + type, wrappedListener, !!options.capture);\n\n if (listenerIndex === -1) {\n supplied.push(listener);\n wrapped.push(wrappedListener);\n useCount.push(1);\n }\n else {\n useCount[listenerIndex]++;\n }\n }\n else {\n ret = element[addEvent](type, listener, supportsOptions? options : !!options.capture);\n }\n target.events[type].push(listener);\n\n return ret;\n }\n}\n\nfunction remove (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const elementIndex = indexOf(elements, element);\n const target = targets[elementIndex];\n\n if (!target || !target.events) {\n return;\n }\n\n let wrappedListener = listener;\n let listeners;\n let listenerIndex;\n\n if (useAttachEvent) {\n listeners = attachedListeners[elementIndex];\n listenerIndex = indexOf(listeners.supplied, listener);\n wrappedListener = listeners.wrapped[listenerIndex];\n }\n\n if (type === 'all') {\n for (type in target.events) {\n if (target.events.hasOwnProperty(type)) {\n remove(element, type, 'all');\n }\n }\n return;\n }\n\n if (target.events[type]) {\n const len = target.events[type].length;\n\n if (listener === 'all') {\n for (let i = 0; i < len; i++) {\n remove(element, type, target.events[type][i], options);\n }\n return;\n }\n else {\n for (let i = 0; i < len; i++) {\n if (target.events[type][i] === listener) {\n element[removeEvent](on + type, wrappedListener, supportsOptions? options : !!options.capture);\n target.events[type].splice(i, 1);\n\n if (useAttachEvent && listeners) {\n listeners.useCount[listenerIndex]--;\n if (listeners.useCount[listenerIndex] === 0) {\n listeners.supplied.splice(listenerIndex, 1);\n listeners.wrapped.splice(listenerIndex, 1);\n listeners.useCount.splice(listenerIndex, 1);\n }\n }\n\n break;\n }\n }\n }\n\n if (target.events[type] && target.events[type].length === 0) {\n target.events[type] = null;\n target.typeCount--;\n }\n }\n\n if (!target.typeCount) {\n targets.splice(elementIndex, 1);\n elements.splice(elementIndex, 1);\n attachedListeners.splice(elementIndex, 1);\n }\n}\n\nfunction addDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n if (!delegatedEvents[type]) {\n delegatedEvents[type] = {\n selectors: [],\n contexts : [],\n listeners: [],\n };\n\n // add delegate listener functions\n for (let i = 0; i < documents.length; i++) {\n add(documents[i], type, delegateListener);\n add(documents[i], type, delegateUseCapture, true);\n }\n }\n\n const delegated = delegatedEvents[type];\n let index;\n\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n break;\n }\n }\n\n if (index === -1) {\n index = delegated.selectors.length;\n\n delegated.selectors.push(selector);\n delegated.contexts .push(context);\n delegated.listeners.push([]);\n }\n\n // keep listener and capture and passive flags\n delegated.listeners[index].push([listener, !!options.capture, options.passive]);\n}\n\nfunction removeDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const delegated = delegatedEvents[type];\n let matchFound = false;\n let index;\n\n if (!delegated) { return; }\n\n // count from last index of delegated to 0\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n // look for matching selector and context Node\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n\n const listeners = delegated.listeners[index];\n\n // each item of the listeners array is an array: [function, capture, passive]\n for (let i = listeners.length - 1; i >= 0; i--) {\n const [fn, capture, passive] = listeners[i];\n\n // check if the listener functions and capture and passive flags match\n if (fn === listener && capture === !!options.capture && passive === options.passive) {\n // remove the listener from the array of listeners\n listeners.splice(i, 1);\n\n // if all listeners for this interactable have been removed\n // remove the interactable from the delegated arrays\n if (!listeners.length) {\n delegated.selectors.splice(index, 1);\n delegated.contexts .splice(index, 1);\n delegated.listeners.splice(index, 1);\n\n // remove delegate function from context\n remove(context, type, delegateListener);\n remove(context, type, delegateUseCapture, true);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegatedEvents[type] = null;\n }\n }\n\n // only remove one listener\n matchFound = true;\n break;\n }\n }\n\n if (matchFound) { break; }\n }\n }\n}\n\n// bound to the interactable context when a DOM event\n// listener is added to a selector interactable\nfunction delegateListener (event, optionalArg) {\n const options = getOptions(optionalArg);\n const fakeEvent = {};\n const delegated = delegatedEvents[event.type];\n const eventTarget = (domUtils.getActualElement(event.path\n ? event.path[0]\n : event.target));\n let element = eventTarget;\n\n // duplicate the event so that currentTarget can be changed\n pExtend(fakeEvent, event);\n\n fakeEvent.originalEvent = event;\n fakeEvent.preventDefault = preventOriginalDefault;\n\n // climb up document tree looking for selector matches\n while (is.element(element)) {\n for (let i = 0; i < delegated.selectors.length; i++) {\n const selector = delegated.selectors[i];\n const context = delegated.contexts[i];\n\n if (domUtils.matchesSelector(element, selector)\n && domUtils.nodeContains(context, eventTarget)\n && domUtils.nodeContains(context, element)) {\n\n const listeners = delegated.listeners[i];\n\n fakeEvent.currentTarget = element;\n\n for (let j = 0; j < listeners.length; j++) {\n const [fn, capture, passive] = listeners[j];\n\n if (capture === !!options.capture && passive === options.passive) {\n fn(fakeEvent);\n }\n }\n }\n }\n\n element = domUtils.parentNode(element);\n }\n}\n\nfunction delegateUseCapture (event) {\n return delegateListener.call(this, event, true);\n}\n\nfunction preventDef () {\n this.returnValue = false;\n}\n\nfunction preventOriginalDefault () {\n this.originalEvent.preventDefault();\n}\n\nfunction stopProp () {\n this.cancelBubble = true;\n}\n\nfunction stopImmProp () {\n this.cancelBubble = true;\n this.immediatePropagationStopped = true;\n}\n\nfunction getOptions (param) {\n return is.object(param)? param : { capture: param };\n}\n\nmodule.exports = {\n add,\n remove,\n\n addDelegate,\n removeDelegate,\n\n delegateListener,\n delegateUseCapture,\n delegatedEvents,\n documents,\n\n useAttachEvent,\n supportsOptions,\n\n _elements: elements,\n _targets: targets,\n _attachedListeners: attachedListeners,\n};\n","module.exports = function extend (dest, source) {\n for (const prop in source) {\n dest[prop] = source[prop];\n }\n return dest;\n};\n","const {\n resolveRectLike,\n rectToXY,\n} = require('./rect');\n\nmodule.exports = function (target, element, action) {\n const actionOptions = target.options[action];\n const actionOrigin = actionOptions && actionOptions.origin;\n const origin = actionOrigin || target.options.origin;\n\n const originRect = resolveRectLike(origin, target, element, [target && element]);\n\n return rectToXY(originRect) || { x: 0, y: 0 };\n};\n","module.exports = (x, y) => Math.sqrt(x * x + y * y);\n","const extend = require('./extend');\nconst win = require('./window');\n\nconst utils = {\n warnOnce: function (method, message) {\n let warned = false;\n\n return function () {\n if (!warned) {\n win.window.console.warn(message);\n warned = true;\n }\n\n return method.apply(this, arguments);\n };\n },\n\n // http://stackoverflow.com/a/5634528/2280888\n _getQBezierValue: function (t, p1, p2, p3) {\n const iT = 1 - t;\n return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3;\n },\n\n getQuadraticCurvePoint: function (startX, startY, cpX, cpY, endX, endY, position) {\n return {\n x: utils._getQBezierValue(position, startX, cpX, endX),\n y: utils._getQBezierValue(position, startY, cpY, endY),\n };\n },\n\n // http://gizma.com/easing/\n easeOutQuad: function (t, b, c, d) {\n t /= d;\n return -c * t*(t-2) + b;\n },\n\n copyAction: function (dest, src) {\n dest.name = src.name;\n dest.axis = src.axis;\n dest.edges = src.edges;\n\n return dest;\n },\n\n is : require('./is'),\n extend : extend,\n hypot : require('./hypot'),\n getOriginXY: require('./getOriginXY'),\n};\n\nextend(utils, require('./arr'));\nextend(utils, require('./domUtils'));\nextend(utils, require('./pointerUtils'));\nextend(utils, require('./rect'));\n\nmodule.exports = utils;\n","const scope = require('../scope');\nconst utils = require('./index');\n\nconst finder = {\n methodOrder: [ 'simulationResume', 'mouseOrPen', 'hasPointer', 'idle' ],\n\n search: function (pointer, eventType, eventTarget) {\n const pointerType = utils.getPointerType(pointer);\n const pointerId = utils.getPointerId(pointer);\n const details = { pointer, pointerId, pointerType, eventType, eventTarget };\n\n for (const method of finder.methodOrder) {\n const interaction = finder[method](details);\n\n if (interaction) {\n return interaction;\n }\n }\n },\n\n // try to resume simulation with a new pointer\n simulationResume: function ({ pointerType, eventType, eventTarget }) {\n if (!/down|start/i.test(eventType)) {\n return null;\n }\n\n for (const interaction of scope.interactions) {\n let element = eventTarget;\n\n if (interaction.simulation && interaction.simulation.allowResume\n && (interaction.pointerType === pointerType)) {\n while (element) {\n // if the element is the interaction element\n if (element === interaction.element) {\n return interaction;\n }\n element = utils.parentNode(element);\n }\n }\n }\n\n return null;\n },\n\n // if it's a mouse or pen interaction\n mouseOrPen: function ({ pointerId, pointerType, eventType }) {\n if (pointerType !== 'mouse' && pointerType !== 'pen') {\n return null;\n }\n\n let firstNonActive;\n\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType) {\n // if it's a down event, skip interactions with running simulations\n if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; }\n\n // if the interaction is active, return it immediately\n if (interaction.interacting()) {\n return interaction;\n }\n // otherwise save it and look for another active interaction\n else if (!firstNonActive) {\n firstNonActive = interaction;\n }\n }\n }\n\n // if no active mouse interaction was found use the first inactive mouse\n // interaction\n if (firstNonActive) {\n return firstNonActive;\n }\n\n // find any mouse or pen interaction.\n // ignore the interaction if the eventType is a *down, and a simulation\n // is active\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType && !(/down/i.test(eventType) && interaction.simulation)) {\n return interaction;\n }\n }\n\n return null;\n },\n\n // get interaction that has this pointer\n hasPointer: function ({ pointerId }) {\n for (const interaction of scope.interactions) {\n if (utils.contains(interaction.pointerIds, pointerId)) {\n return interaction;\n }\n }\n },\n\n // get first idle interaction with a matching pointerType\n idle: function ({ pointerType }) {\n for (const interaction of scope.interactions) {\n // if there's already a pointer held down\n if (interaction.pointerIds.length === 1) {\n const target = interaction.target;\n // don't add this pointer if there is a target interactable and it\n // isn't gesturable\n if (target && !target.options.gesture.enabled) {\n continue;\n }\n }\n // maximum of 2 pointers per interaction\n else if (interaction.pointerIds.length >= 2) {\n continue;\n }\n\n if (!interaction.interacting() && (pointerType === interaction.pointerType)) {\n return interaction;\n }\n }\n\n return null;\n },\n};\n\nmodule.exports = finder;\n","const win = require('./window');\nconst isWindow = require('./isWindow');\n\nconst is = {\n array : () => {},\n\n window : thing => thing === win.window || isWindow(thing),\n\n docFrag : thing => is.object(thing) && thing.nodeType === 11,\n\n object : thing => !!thing && (typeof thing === 'object'),\n\n function: thing => typeof thing === 'function',\n\n number : thing => typeof thing === 'number' ,\n\n bool : thing => typeof thing === 'boolean' ,\n\n string : thing => typeof thing === 'string' ,\n\n element: thing => {\n if (!thing || (typeof thing !== 'object')) { return false; }\n\n const _window = win.getWindow(thing) || win.window;\n\n return (/object|function/.test(typeof _window.Element)\n ? thing instanceof _window.Element //DOM2\n : thing.nodeType === 1 && typeof thing.nodeName === 'string');\n },\n};\n\nis.array = thing => (is.object(thing)\n && (typeof thing.length !== 'undefined')\n && is.function(thing.splice));\n\nmodule.exports = is;\n","module.exports = (thing) => !!(thing && thing.Window) && (thing instanceof thing.Window);\n","function pointerExtend (dest, source) {\n for (const prop in source) {\n const prefixedPropREs = module.exports.prefixedPropREs;\n let deprecated = false;\n\n // skip deprecated prefixed properties\n for (const vendor in prefixedPropREs) {\n if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) {\n deprecated = true;\n break;\n }\n }\n\n if (!deprecated && typeof source[prop] !== 'function') {\n dest[prop] = source[prop];\n }\n }\n return dest;\n}\n\npointerExtend.prefixedPropREs = {\n webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/,\n};\n\nmodule.exports = pointerExtend;\n","const hypot = require('./hypot');\nconst browser = require('./browser');\nconst dom = require('./domObjects');\nconst domUtils = require('./domUtils');\nconst domObjects = require('./domObjects');\nconst is = require('./is');\nconst pointerExtend = require('./pointerExtend');\n\nconst pointerUtils = {\n copyCoords: function (dest, src) {\n dest.page = dest.page || {};\n dest.page.x = src.page.x;\n dest.page.y = src.page.y;\n\n dest.client = dest.client || {};\n dest.client.x = src.client.x;\n dest.client.y = src.client.y;\n\n dest.timeStamp = src.timeStamp;\n },\n\n setCoordDeltas: function (targetObj, prev, cur) {\n targetObj.page.x = cur.page.x - prev.page.x;\n targetObj.page.y = cur.page.y - prev.page.y;\n targetObj.client.x = cur.client.x - prev.client.x;\n targetObj.client.y = cur.client.y - prev.client.y;\n targetObj.timeStamp = cur.timeStamp - prev.timeStamp;\n\n // set pointer velocity\n const dt = Math.max(targetObj.timeStamp / 1000, 0.001);\n\n targetObj.page.speed = hypot(targetObj.page.x, targetObj.page.y) / dt;\n targetObj.page.vx = targetObj.page.x / dt;\n targetObj.page.vy = targetObj.page.y / dt;\n\n targetObj.client.speed = hypot(targetObj.client.x, targetObj.page.y) / dt;\n targetObj.client.vx = targetObj.client.x / dt;\n targetObj.client.vy = targetObj.client.y / dt;\n },\n\n isNativePointer: function (pointer) {\n return (pointer instanceof dom.Event || pointer instanceof dom.Touch);\n },\n\n // Get specified X/Y coords for mouse or event.touches[0]\n getXY: function (type, pointer, xy) {\n xy = xy || {};\n type = type || 'page';\n\n xy.x = pointer[type + 'X'];\n xy.y = pointer[type + 'Y'];\n\n return xy;\n },\n\n getPageXY: function (pointer, page) {\n page = page || {};\n\n // Opera Mobile handles the viewport and scrolling oddly\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n pointerUtils.getXY('screen', pointer, page);\n\n page.x += window.scrollX;\n page.y += window.scrollY;\n }\n else {\n pointerUtils.getXY('page', pointer, page);\n }\n\n return page;\n },\n\n getClientXY: function (pointer, client) {\n client = client || {};\n\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n // Opera Mobile handles the viewport and scrolling oddly\n pointerUtils.getXY('screen', pointer, client);\n }\n else {\n pointerUtils.getXY('client', pointer, client);\n }\n\n return client;\n },\n\n getPointerId: function (pointer) {\n return is.number(pointer.pointerId)? pointer.pointerId : pointer.identifier;\n },\n\n setCoords: function (targetObj, pointers, timeStamp) {\n const pointer = (pointers.length > 1\n ? pointerUtils.pointerAverage(pointers)\n : pointers[0]);\n\n const tmpXY = {};\n\n pointerUtils.getPageXY(pointer, tmpXY);\n targetObj.page.x = tmpXY.x;\n targetObj.page.y = tmpXY.y;\n\n pointerUtils.getClientXY(pointer, tmpXY);\n targetObj.client.x = tmpXY.x;\n targetObj.client.y = tmpXY.y;\n\n targetObj.timeStamp = is.number(timeStamp) ? timeStamp :new Date().getTime();\n },\n\n pointerExtend: pointerExtend,\n\n getTouchPair: function (event) {\n const touches = [];\n\n // array of touches is supplied\n if (is.array(event)) {\n touches[0] = event[0];\n touches[1] = event[1];\n }\n // an event\n else {\n if (event.type === 'touchend') {\n if (event.touches.length === 1) {\n touches[0] = event.touches[0];\n touches[1] = event.changedTouches[0];\n }\n else if (event.touches.length === 0) {\n touches[0] = event.changedTouches[0];\n touches[1] = event.changedTouches[1];\n }\n }\n else {\n touches[0] = event.touches[0];\n touches[1] = event.touches[1];\n }\n }\n\n return touches;\n },\n\n pointerAverage: function (pointers) {\n const average = {\n pageX : 0,\n pageY : 0,\n clientX: 0,\n clientY: 0,\n screenX: 0,\n screenY: 0,\n };\n\n for (const pointer of pointers) {\n for (const prop in average) {\n average[prop] += pointer[prop];\n }\n }\n for (const prop in average) {\n average[prop] /= pointers.length;\n }\n\n return average;\n },\n\n touchBBox: function (event) {\n if (!event.length && !(event.touches && event.touches.length > 1)) {\n return;\n }\n\n const touches = pointerUtils.getTouchPair(event);\n const minX = Math.min(touches[0].pageX, touches[1].pageX);\n const minY = Math.min(touches[0].pageY, touches[1].pageY);\n const maxX = Math.max(touches[0].pageX, touches[1].pageX);\n const maxY = Math.max(touches[0].pageY, touches[1].pageY);\n\n return {\n x: minX,\n y: minY,\n left: minX,\n top: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n },\n\n touchDistance: function (event, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n\n\n const dx = touches[0][sourceX] - touches[1][sourceX];\n const dy = touches[0][sourceY] - touches[1][sourceY];\n\n return hypot(dx, dy);\n },\n\n touchAngle: function (event, prevAngle, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n const dx = touches[1][sourceX] - touches[0][sourceX];\n const dy = touches[1][sourceY] - touches[0][sourceY];\n const angle = 180 * Math.atan2(dy , dx) / Math.PI;\n\n return angle;\n },\n\n getPointerType: function (pointer) {\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : is.number(pointer.pointerType)\n ? [undefined, undefined,'touch', 'pen', 'mouse'][pointer.pointerType]\n // if the PointerEvent API isn't available, then the \"pointer\" must\n // be either a MouseEvent, TouchEvent, or Touch object\n : /touch/.test(pointer.type) || pointer instanceof domObjects.Touch\n ? 'touch'\n : 'mouse';\n },\n\n // [ event.target, event.currentTarget ]\n getEventTargets: function (event) {\n return [\n domUtils.getActualElement(event.path ? event.path[0] : event.target),\n domUtils.getActualElement(event.currentTarget),\n ];\n },\n};\n\nmodule.exports = pointerUtils;\n","const { window } = require('./window');\n\nconst vendors = ['ms', 'moz', 'webkit', 'o'];\nlet lastTime = 0;\nlet request;\nlet cancel;\n\nfor (let x = 0; x < vendors.length && !window.requestAnimationFrame; x++) {\n request = window[vendors[x] + 'RequestAnimationFrame'];\n cancel = window[vendors[x] +'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n}\n\nif (!request) {\n request = function (callback) {\n const currTime = new Date().getTime();\n const timeToCall = Math.max(0, 16 - (currTime - lastTime));\n const id = setTimeout(function () { callback(currTime + timeToCall); },\n timeToCall);\n\n lastTime = currTime + timeToCall;\n return id;\n };\n}\n\nif (!cancel) {\n cancel = function (id) {\n clearTimeout(id);\n };\n}\n\nmodule.exports = {\n request,\n cancel,\n};\n","const extend = require('./extend');\nconst is = require('./is');\nconst {\n closest,\n parentNode,\n getElementRect,\n} = require('./domUtils');\n\nconst rectUtils = {\n getStringOptionResult: function (value, interactable, element) {\n if (!is.string(value)) {\n return null;\n }\n\n if (value === 'parent') {\n value = parentNode(element);\n }\n else if (value === 'self') {\n value = interactable.getRect(element);\n }\n else {\n value = closest(element, value);\n }\n\n return value;\n },\n\n resolveRectLike: function (value, interactable, element, functionArgs) {\n value = rectUtils.getStringOptionResult(value, interactable, element) || value;\n\n if (is.function(value)) {\n value = value.apply(null, functionArgs);\n }\n\n if (is.element(value)) {\n value = getElementRect(value);\n }\n\n return value;\n },\n\n rectToXY: function (rect) {\n return rect && {\n x: 'x' in rect ? rect.x : rect.left,\n y: 'y' in rect ? rect.y : rect.top,\n };\n },\n\n xywhToTlbr: function (rect) {\n if (rect && !('left' in rect && 'top' in rect)) {\n rect = extend({}, rect);\n\n rect.left = rect.x || 0;\n rect.top = rect.y || 0;\n rect.right = rect.right || (rect.left + rect.width);\n rect.bottom = rect.bottom || (rect.top + rect.height);\n }\n\n return rect;\n },\n\n tlbrToXywh: function (rect) {\n if (rect && !('x' in rect && 'y' in rect)) {\n rect = extend({}, rect);\n\n rect.x = rect.left || 0;\n rect.top = rect.top || 0;\n rect.width = rect.width || (rect.right - rect.x);\n rect.height = rect.height || (rect.bottom - rect.y);\n }\n\n return rect;\n },\n};\n\nmodule.exports = rectUtils;\n","const win = module.exports;\nconst isWindow = require('./isWindow');\n\nfunction init (window) {\n // get wrapped window if using Shadow DOM polyfill\n\n win.realWindow = window;\n\n // create a TextNode\n const el = window.document.createTextNode('');\n\n // check if it's wrapped by a polyfill\n if (el.ownerDocument !== window.document\n && typeof window.wrap === 'function'\n && window.wrap(el) === el) {\n // use wrapped window\n window = window.wrap(window);\n }\n\n win.window = window;\n}\n\nif (typeof window === 'undefined') {\n win.window = undefined;\n win.realWindow = undefined;\n}\nelse {\n init(window);\n}\n\nwin.getWindow = function getWindow (node) {\n if (isWindow(node)) {\n return node;\n }\n\n const rootNode = (node.ownerDocument || node);\n\n return rootNode.defaultView || rootNode.parentWindow || win.window;\n};\n\nwin.init = init;\n"]} \ No newline at end of file diff --git a/dist/interact.min.js b/dist/interact.min.js index c0bb2476c..2d1f0fb62 100644 --- a/dist/interact.min.js +++ b/dist/interact.min.js @@ -1,6 +1,6 @@ -/* interact.js v1.3.0-alpha.3+sha.9595c40 | https://raw.github.com/taye/interact.js/master/LICENSE */ -!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var t;t="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,t.interact=e()}}(function(){return function e(t,n,r){function i(s,a){if(!n[s]){if(!t[s]){var l="function"==typeof require&&require;if(!a&&l)return l(s,!0);if(o)return o(s,!0);var c=new Error("Cannot find module '"+s+"'");throw c.code="MODULE_NOT_FOUND",c}var p=n[s]={exports:{}};t[s][0].call(p.exports,function(e){var n=t[s][1][e];return i(n||e)},p,p.exports,e,t,n,r)}return n[s].exports}for(var o="function"==typeof require&&require,s=0;s6&&void 0!==arguments[6]&&arguments[6];r(this,e);var f=t.target,v=(f&&f.options||s).deltaSource,g=o(f,p,l),h="start"===c,m="end"===c,y=h?t.startCoords:t.curCoords,x=t.prevEvent;p=p||t.element;var b=i({},y.page),w=i({},y.client);b.x-=g.x,b.y-=g.y,w.x-=g.x,w.y-=g.y,this.ctrlKey=n.ctrlKey,this.altKey=n.altKey,this.shiftKey=n.shiftKey,this.metaKey=n.metaKey,this.button=n.button,this.buttons=n.buttons,this.target=p,this.currentTarget=p,this.relatedTarget=u||null,this.preEnd=d,this.type=l+(c||""),this.interaction=t,this.interactable=f,this.t0=h?t.downTimes[t.downTimes.length-1]:x.t0;var E={interaction:t,event:n,action:l,phase:c,element:p,related:u,page:b,client:w,coords:y,starting:h,ending:m,deltaSource:v,iEvent:this};a.fire("set-xy",E),m?(this.pageX=x.pageX,this.pageY=x.pageY,this.clientX=x.clientX,this.clientY=x.clientY):(this.pageX=b.x,this.pageY=b.y,this.clientX=w.x,this.clientY=w.y),this.x0=t.startCoords.page.x-g.x,this.y0=t.startCoords.page.y-g.y,this.clientX0=t.startCoords.client.x-g.x,this.clientY0=t.startCoords.client.y-g.y,a.fire("set-delta",E),this.timeStamp=y.timeStamp,this.dt=t.pointerDelta.timeStamp,this.duration=this.timeStamp-this.t0,this.speed=t.pointerDelta[v].speed,this.velocityX=t.pointerDelta[v].vx,this.velocityY=t.pointerDelta[v].vy,this.swipe=m||"inertiastart"===c?this.getSwipe():null,a.fire("new",E)}return e.prototype.getSwipe=function(){var e=this.interaction;if(e.prevEvent.speed<600||this.timeStamp-e.prevEvent.timeStamp>150)return null;var t=180*Math.atan2(e.prevEvent.velocityY,e.prevEvent.velocityX)/Math.PI;t<0&&(t+=360);var n=112.5<=t&&t<247.5,r=202.5<=t&&t<337.5,i=!n&&(292.5<=t||t<67.5);return{up:r,down:!r&&22.5<=t&&t<157.5,left:n,right:i,angle:t,speed:e.prevEvent.speed,velocity:{x:e.prevEvent.velocityX,y:e.prevEvent.velocityY}}},e.prototype.preventDefault=function(){},e.prototype.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},e.prototype.stopPropagation=function(){this.propagationStopped=!0},e}();a.on("set-delta",function(e){var t=e.iEvent,n=e.interaction,r=e.starting,i=e.deltaSource,o=r?t:n.prevEvent;"client"===i?(t.dx=t.clientX-o.clientX,t.dy=t.clientY-o.clientY):(t.dx=t.pageX-o.pageX,t.dy=t.pageY-o.pageY)}),l.signals=a,t.exports=l},{"./defaultOptions":18,"./utils/Signals":35,"./utils/extend":41,"./utils/getOriginXY":42}],4:[function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=e("./utils/is"),o=e("./utils/events"),s=e("./utils/extend"),a=e("./actions/base"),l=e("./scope"),c=e("./Eventable"),p=e("./defaultOptions"),u=e("./utils/Signals").new(),d=e("./utils/domUtils"),f=d.getElementRect,v=d.nodeContains,g=d.trySelector,h=e("./utils/window"),m=h.getWindow,y=e("./utils/arr"),x=y.indexOf,b=y.contains,w=e("./utils/browser"),E=w.wheelEvent;l.interactables=[];var S=function(){function e(t,n){r(this,e),n=n||{},this.target=t,this.events=new c,this._context=n.context||l.document,this._win=m(g(t)?this._context:t),this._doc=this._win.document,u.fire("new",{target:t,options:n,interactable:this,win:this._win}),l.addDocument(this._doc,this._win),l.interactables.push(this),this.set(n)}return e.prototype.setOnEvents=function(e,t){var n="on"+e;return i.function(t.onstart)&&(this.events[n+"start"]=t.onstart),i.function(t.onmove)&&(this.events[n+"move"]=t.onmove),i.function(t.onend)&&(this.events[n+"end"]=t.onend),i.function(t.oninertiastart)&&(this.events[n+"inertiastart"]=t.oninertiastart),this},e.prototype.setPerAction=function(e,t){for(var n in t)n in p[e]&&(i.object(t[n])?(this.options[e][n]=s(this.options[e][n]||{},t[n]),i.object(p.perAction[n])&&"enabled"in p.perAction[n]&&(this.options[e][n].enabled=!1!==t[n].enabled)):i.bool(t[n])&&i.object(p.perAction[n])?this.options[e][n].enabled=t[n]:void 0!==t[n]&&(this.options[e][n]=t[n]))},e.prototype.getRect=function(e){return e=e||this.target,i.string(this.target)&&!i.element(e)&&(e=this._context.querySelector(this.target)),f(e)},e.prototype.rectChecker=function(e){return i.function(e)?(this.getRect=e,this):null===e?(delete this.options.getRect,this):this.getRect},e.prototype._backCompatOption=function(e,t){if(g(t)||i.object(t)){this.options[e]=t;for(var n=a.names,r=Array.isArray(n),o=0,n=r?n:n[Symbol.iterator]();;){var s;if(r){if(o>=n.length)break;s=n[o++]}else{if(o=n.next(),o.done)break;s=o.value}var l=s;this.options[l][e]=t}return this}return this.options[e]},e.prototype.origin=function(e){return this._backCompatOption("origin",e)},e.prototype.deltaSource=function(e){return"page"===e||"client"===e?(this.options.deltaSource=e,this):this.options.deltaSource},e.prototype.context=function(){return this._context},e.prototype.inContext=function(e){return this._context===e.ownerDocument||v(this._context,e)},e.prototype.fire=function(e){return this.events.fire(e),this},e.prototype._onOffMultiple=function(e,t,n,r){if(i.string(t)&&-1!==t.search(" ")&&(t=t.trim().split(/ +/)),i.array(t)){for(var o=0;o=l.length)break;f=l[d++]}else{if(d=l.next(),d.done)break;f=d.value}var v=f;this.options[v]=p.base[v],v in t&&this[v](t[v])}return u.fire("set",{options:t,interactable:this}),this},e.prototype.unset=function(){if(o.remove(this.target,"all"),i.string(this.target))for(var e in o.delegatedEvents){var t=o.delegatedEvents[e];t.selectors[0]===this.target&&t.contexts[0]===this._context&&(t.selectors.splice(0,1),t.contexts.splice(0,1),t.listeners.splice(0,1),t.selectors.length||(t[e]=null)),o.remove(this._context,e,o.delegateListener),o.remove(this._context,e,o.delegateUseCapture,!0)}else o.remove(this,"all");u.fire("unset",{interactable:this}),l.interactables.splice(x(l.interactables,this),1);for(var n=l.interactions||[],r=Array.isArray(n),s=0,n=r?n:n[Symbol.iterator]();;){var a;if(r){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var c=a;c.target===this&&c.interacting()&&c.stop()}return l.interact},e}();l.interactables.indexOfElement=function(e,t){t=t||l.document;for(var n=0;n=y.length)break;w=y[b++]}else{if(b=y.next(),b.done)break;w=b.value}var E=w,S=E[0],T=E[1];T._updateEventTargets(r,i),T[e](S,t,r,i)}}}function o(e){for(var t=0;te.pointerMoveTolerance);var a={pointer:t,pointerIndex:this.getPointerIndex(t),event:n,eventTarget:r,dx:o,dy:s,duplicate:i,interaction:this,interactingBeforeMove:this.interacting()};i||l.setCoordDeltas(this.pointerDelta,this.prevCoords,this.curCoords),d.fire("move",a),i||(this.interacting()&&this.doMove(a),this.pointerWasMoved&&l.copyCoords(this.prevCoords,this.curCoords))},e.prototype.doMove=function(e){e=l.extend({pointer:this.pointers[0],event:this.prevEvent,eventTarget:this._eventTarget,interaction:this},e||{}),d.fire("before-action-move",e),this._dontFireMove||d.fire("action-move",e),this._dontFireMove=!1},e.prototype.pointerUp=function(e,t,n,r){var i=this.getPointerIndex(e);d.fire(/cancel$/i.test(t.type)?"cancel":"up",{pointer:e,pointerIndex:i,event:t,eventTarget:n,curEventTarget:r,interaction:this}),this.simulation||this.end(t),this.pointerIsDown=!1,this.removePointer(e,t)},e.prototype.end=function(e){e=e||this.prevEvent,this.interacting()&&d.fire("action-end",{event:e,interaction:this}),this.stop()},e.prototype.currentAction=function(){return this._interacting?this.prepared.name:null},e.prototype.interacting=function(){return this._interacting},e.prototype.stop=function(){d.fire("stop",{interaction:this}),this._interacting&&(d.fire("stop-active",{interaction:this}),d.fire("stop-"+this.prepared.name,{interaction:this})),this.target=this.element=null,this._interacting=!1,this.prepared.name=this.prevEvent=null},e.prototype.getPointerIndex=function(e){return l.indexOf(this.pointerIds,l.getPointerId(e))},e.prototype.updatePointer=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:t&&/(down|start)$/i.test(t.type),r=l.getPointerId(e),i=this.getPointerIndex(e);return-1===i&&(i=this.pointerIds.length,this.pointerIds[i]=r),n&&d.fire("update-pointer-down",{pointer:e,event:t,down:n,pointerId:r,pointerIndex:i,interaction:this}),this.pointers[i]=e,i},e.prototype.removePointer=function(e,t){var n=l.getPointerId(e),r=this.mouse?0:l.indexOf(this.pointerIds,n);-1!==r&&(d.fire("remove-pointer",{pointer:e,event:t,pointerIndex:r,interaction:this}),this.pointers.splice(r,1),this.pointerIds.splice(r,1),this.downTargets.splice(r,1),this.downTimes.splice(r,1))},e.prototype._updateEventTargets=function(e,t){this._eventTarget=e,this._curEventTarget=t},e}(),m=0,y=v.length;m=i.length)break;a=i[s++]}else{if(s=i.next(),s.done)break;a=s.value}var l=a;if(l.options.drop.enabled){var c=l.options.drop.accept;if(!(p.is.element(c)&&c!==t||p.is.string(c)&&!p.matchesSelector(t,c)))for(var d=p.is.string(l.target)?l._context.querySelectorAll(l.target):[l.target],f=0;fo.left&&c.xo.top&&c.y=o.left&&v<=o.right&&g>=o.top&&g<=o.bottom}if(f&&p.is.number(a)){s=Math.max(0,Math.min(o.right,f.right)-Math.max(o.left,f.left))*Math.max(0,Math.min(o.bottom,f.bottom)-Math.max(o.top,f.top))/(f.width*f.height)>=a}return this.options.drop.checker&&(s=this.options.drop.checker(e,t,s,this,i,n,r)),s},v.signals.on("unset",function(e){e.interactable.dropzone(!1)}),v.settingsMethods.push("dropChecker"),g.signals.on("new",function(e){e.dropTarget=null,e.dropElement=null,e.prevDropTarget=null,e.prevDropElement=null,e.dropEvents=null,e.activeDrops={dropzones:[],elements:[],rects:[]}}),g.signals.on("stop",function(e){var t=e.interaction;t.dropTarget=t.dropElement=t.prevDropTarget=t.prevDropElement=null}),d.dynamicDrop=function(e){return p.is.bool(e)?(y=e,d):y},p.merge(v.eventTypes,["dragenter","dragleave","dropactivate","dropdeactivate","dropmove","drop"]),c.methodDict.drop="dropzone",h.drop=m.defaults,t.exports=m},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../interact":21,"../scope":34,"../utils":44,"./base":6}],9:[function(e,t,n){"use strict";var r=e("./base"),i=e("../utils"),o=e("../InteractEvent"),s=e("../Interactable"),a=e("../Interaction"),l=e("../defaultOptions"),c={defaults:{enabled:!1,origin:null,restrict:null},checker:function(e,t,n,r,i){return i.pointerIds.length>=2?{name:"gesture"}:null},getCursor:function(){return""}};o.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;"gesturestart"===t.type&&(t.ds=0,n.gesture.startDistance=n.gesture.prevDistance=t.distance,n.gesture.startAngle=n.gesture.prevAngle=t.angle,n.gesture.scale=1)}),o.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;"gesturemove"===t.type&&(t.ds=t.scale-n.gesture.scale,n.target.fire(t),n.gesture.prevAngle=t.angle,n.gesture.prevDistance=t.distance,t.scale===1/0||null===t.scale||void 0===t.scale||isNaN(t.scale)||(n.gesture.scale=t.scale))}),s.prototype.gesturable=function(e){return i.is.object(e)?(this.options.gesture.enabled=!1!==e.enabled,this.setPerAction("gesture",e),this.setOnEvents("gesture",e),this):i.is.bool(e)?(this.options.gesture.enabled=e,e||(this.ongesturestart=this.ongesturestart=this.ongestureend=null),this):this.options.gesture},o.signals.on("set-delta",function(e){var t=e.interaction,n=e.iEvent,r=e.action,s=e.event,a=e.starting,l=e.ending,c=e.deltaSource;if("gesture"===r){var p=t.pointers;n.touches=[p[0],p[1]],a?(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=1,n.ds=0,n.angle=i.touchAngle(p,void 0,c),n.da=0):l||s instanceof o?(n.distance=t.prevEvent.distance,n.box=t.prevEvent.box,n.scale=t.prevEvent.scale,n.ds=n.scale-1,n.angle=t.prevEvent.angle,n.da=n.angle-t.gesture.startAngle):(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=n.distance/t.gesture.startDistance,n.angle=i.touchAngle(p,t.gesture.prevAngle,c),n.ds=n.scale-t.gesture.prevScale,n.da=n.angle-t.gesture.prevAngle)}}),a.signals.on("new",function(e){e.gesture={start:{x:0,y:0},startDistance:0,prevDistance:0,distance:0,scale:1,startAngle:0,prevAngle:0}}),r.gesture=c,r.names.push("gesture"),i.merge(s.eventTypes,["gesturestart","gesturemove","gestureend"]),r.methodDict.gesture="gesturable",l.gesture=c.defaults,t.exports=c},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"./base":6}],10:[function(e,t,n){"use strict";function r(e,t,n,r,i,s,a){if(!t)return!1;if(!0===t){var l=o.is.number(s.width)?s.width:s.right-s.left,c=o.is.number(s.height)?s.height:s.bottom-s.top;if(l<0&&("left"===e?e="right":"right"===e&&(e="left")),c<0&&("top"===e?e="bottom":"bottom"===e&&(e="top")),"left"===e)return n.x<(l>=0?s.left:s.right)+a;if("top"===e)return n.y<(c>=0?s.top:s.bottom)+a;if("right"===e)return n.x>(l>=0?s.right:s.left)-a;if("bottom"===e)return n.y>(c>=0?s.bottom:s.top)-a}return!!o.is.element(r)&&(o.is.element(t)?t===r:o.matchesUpTo(r,t,i))}var i=e("./base"),o=e("../utils"),s=e("../utils/browser"),a=e("../InteractEvent"),l=e("../Interactable"),c=e("../Interaction"),p=e("../defaultOptions"),u=s.supportsTouch||s.supportsPointerEvent?20:10,d={defaults:{enabled:!1,mouseButtons:null,origin:null,snap:null,restrict:null,inertia:null,autoScroll:null,square:!1,preserveAspectRatio:!1,axis:"xy",margin:NaN,edges:null,invert:"none"},checker:function(e,t,n,i,s,a){if(!a)return null;var l=o.extend({},s.curCoords.page),c=n.options;if(c.resize.enabled){var p=c.resize,d={left:!1,right:!1,top:!1,bottom:!1};if(o.is.object(p.edges)){for(var f in d)d[f]=r(f,p.edges[f],l,s._eventTarget,i,a,p.margin||u);if(d.left=d.left&&!d.right,d.top=d.top&&!d.bottom,d.left||d.right||d.top||d.bottom)return{name:"resize",edges:d}}else{var v="y"!==c.resize.axis&&l.x>a.right-u,g="x"!==c.resize.axis&&l.y>a.bottom-u;if(v||g)return{name:"resize",axes:(v?"x":"")+(g?"y":"")}}}return null},cursors:s.isIe9OrOlder?{x:"e-resize",y:"s-resize",xy:"se-resize",top:"n-resize",left:"w-resize",bottom:"s-resize",right:"e-resize",topleft:"se-resize",bottomright:"se-resize",topright:"ne-resize",bottomleft:"ne-resize"}:{x:"ew-resize",y:"ns-resize",xy:"nwse-resize",top:"ns-resize",left:"ew-resize",bottom:"ns-resize",right:"ew-resize",topleft:"nwse-resize",bottomright:"nwse-resize",topright:"nesw-resize",bottomleft:"nesw-resize"},getCursor:function(e){if(e.axis)return d.cursors[e.name+e.axis];if(e.edges){for(var t="",n=["top","bottom","left","right"],r=0;r<4;r++)e.edges[n[r]]&&(t+=n[r]);return d.cursors[t]}}};a.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;if("resizestart"===t.type&&n.prepared.edges){var r=n.target.getRect(n.element),i=n.target.options.resize;if(i.square||i.preserveAspectRatio){var s=o.extend({},n.prepared.edges);s.top=s.top||s.left&&!s.bottom,s.left=s.left||s.top&&!s.right,s.bottom=s.bottom||s.right&&!s.top,s.right=s.right||s.bottom&&!s.left,n.prepared._linkedEdges=s}else n.prepared._linkedEdges=null;i.preserveAspectRatio&&(n.resizeStartAspectRatio=r.width/r.height),n.resizeRects={start:r,current:o.extend({},r),inverted:o.extend({},r),previous:o.extend({},r),delta:{left:0,right:0,width:0,top:0,bottom:0,height:0}},t.rect=n.resizeRects.inverted,t.deltaRect=n.resizeRects.delta}}),a.signals.on("new",function(e){var t=e.iEvent,n=e.phase,r=e.interaction;if("move"===n&&r.prepared.edges){var i=r.target.options.resize,s=i.invert,a="reposition"===s||"negate"===s,l=r.prepared.edges,c=r.resizeRects.start,p=r.resizeRects.current,u=r.resizeRects.inverted,d=r.resizeRects.delta,f=o.extend(r.resizeRects.previous,u),v=l,g=t.dx,h=t.dy;if(i.preserveAspectRatio||i.square){var m=i.preserveAspectRatio?r.resizeStartAspectRatio:1;l=r.prepared._linkedEdges,v.left&&v.bottom||v.right&&v.top?h=-g/m:v.left||v.right?h=g/m:(v.top||v.bottom)&&(g=h*m)}if(l.top&&(p.top+=h),l.bottom&&(p.bottom+=h),l.left&&(p.left+=g),l.right&&(p.right+=g),a){if(o.extend(u,p),"reposition"===s){var y=void 0;u.top>u.bottom&&(y=u.top,u.top=u.bottom,u.bottom=y),u.left>u.right&&(y=u.left,u.left=u.right,u.right=y)}}else u.top=Math.min(p.top,c.bottom),u.bottom=Math.max(p.bottom,c.top),u.left=Math.min(p.left,c.right),u.right=Math.max(p.right,c.left);u.width=u.right-u.left,u.height=u.bottom-u.top;for(var x in u)d[x]=u[x]-f[x];t.edges=r.prepared.edges,t.rect=u,t.deltaRect=d}}),l.prototype.resizable=function(e){return o.is.object(e)?(this.options.resize.enabled=!1!==e.enabled,this.setPerAction("resize",e),this.setOnEvents("resize",e),/^x$|^y$|^xy$/.test(e.axis)?this.options.resize.axis=e.axis:null===e.axis&&(this.options.resize.axis=p.resize.axis),o.is.bool(e.preserveAspectRatio)?this.options.resize.preserveAspectRatio=e.preserveAspectRatio:o.is.bool(e.square)&&(this.options.resize.square=e.square),this):o.is.bool(e)?(this.options.resize.enabled=e,e||(this.onresizestart=this.onresizestart=this.onresizeend=null),this):this.options.resize},c.signals.on("new",function(e){ -e.resizeAxes="xy"}),a.signals.on("set-delta",function(e){var t=e.interaction,n=e.iEvent;"resize"===e.action&&t.resizeAxes&&(t.target.options.resize.square?("y"===t.resizeAxes?n.dx=n.dy:n.dy=n.dx,n.axes="xy"):(n.axes=t.resizeAxes,"x"===t.resizeAxes?n.dy=0:"y"===t.resizeAxes&&(n.dx=0)))}),i.resize=d,i.names.push("resize"),o.merge(l.eventTypes,["resizestart","resizemove","resizeinertiastart","resizeinertiaresume","resizeend"]),i.methodDict.resize="resizable",p.resize=d.defaults,t.exports=d},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"../utils/browser":37,"./base":6}],11:[function(e,t,n){"use strict";var r=e("./utils/raf"),i=e("./utils/window").getWindow,o=e("./utils/is"),s=e("./utils/domUtils"),a=e("./Interaction"),l=e("./defaultOptions"),c={defaults:{enabled:!1,container:null,margin:60,speed:300},interaction:null,i:null,x:0,y:0,isScrolling:!1,prevTime:0,start:function(e){c.isScrolling=!0,r.cancel(c.i),c.interaction=e,c.prevTime=(new Date).getTime(),c.i=r.request(c.scroll)},stop:function(){c.isScrolling=!1,r.cancel(c.i)},scroll:function(){var e=c.interaction.target.options[c.interaction.prepared.name].autoScroll,t=e.container||i(c.interaction.element),n=(new Date).getTime(),s=(n-c.prevTime)/1e3,a=e.speed*s;a>=1&&(o.window(t)?t.scrollBy(c.x*a,c.y*a):t&&(t.scrollLeft+=c.x*a,t.scrollTop+=c.y*a),c.prevTime=n),c.isScrolling&&(r.cancel(c.i),c.i=r.request(c.scroll))},check:function(e,t){var n=e.options;return n[t].autoScroll&&n[t].autoScroll.enabled},onInteractionMove:function(e){var t=e.interaction,n=e.pointer;if(t.interacting()&&c.check(t.target,t.prepared.name)){if(t.simulation)return void(c.x=c.y=0);var r=void 0,a=void 0,l=void 0,p=void 0,u=t.target.options[t.prepared.name].autoScroll,d=u.container||i(t.element);if(o.window(d))p=n.clientXd.innerWidth-c.margin,l=n.clientY>d.innerHeight-c.margin;else{var f=s.getElementClientRect(d);p=n.clientXf.right-c.margin,l=n.clientY>f.bottom-c.margin}c.x=a?1:p?-1:0,c.y=l?1:r?-1:0,c.isScrolling||(c.margin=u.margin,c.speed=u.speed,c.start(t))}}};a.signals.on("stop-active",function(){c.stop()}),a.signals.on("action-move",c.onInteractionMove),l.perAction.autoScroll=c.defaults,t.exports=c},{"./Interaction":5,"./defaultOptions":18,"./utils/domUtils":39,"./utils/is":46,"./utils/raf":50,"./utils/window":52}],12:[function(e,t,n){"use strict";var r=e("../Interactable"),i=e("../actions/base"),o=e("../utils/is"),s=e("../utils/domUtils");r.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},r.prototype.ignoreFrom=function(e){return this._backCompatOption("ignoreFrom",e)},r.prototype.allowFrom=function(e){return this._backCompatOption("allowFrom",e)},r.prototype.testIgnore=function(e,t,n){return!(!e||!o.element(n))&&(o.string(e)?s.matchesUpTo(n,e,t):!!o.element(e)&&s.nodeContains(e,n))},r.prototype.testAllow=function(e,t,n){return!e||!!o.element(n)&&(o.string(e)?s.matchesUpTo(n,e,t):!!o.element(e)&&s.nodeContains(e,n))},r.prototype.testIgnoreAllow=function(e,t,n){return!this.testIgnore(e.ignoreFrom,t,n)&&this.testAllow(e.allowFrom,t,n)},r.prototype.actionChecker=function(e){return o.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},r.prototype.styleCursor=function(e){return o.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},r.prototype.defaultActionChecker=function(e,t,n,r){for(var o=this.getRect(r),s=null,a=i.names,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var u=p;if((!n.pointerIsDown||!n.mouse||0!=(t.buttons&this.options[u].mouseButtons))&&(s=i[u].checker(e,t,this,r,n,o)))return s}}},{"../Interactable":4,"../actions/base":6,"../utils/domUtils":39,"../utils/is":46}],13:[function(e,t,n){"use strict";function r(e,t,n,r){return g.is.object(e)&&t.testIgnoreAllow(t.options[e.name],n,r)&&t.options[e.name].enabled&&a(t,n,e)?e:null}function i(e,t,n,i,o,s){for(var a=0,l=i.length;a=m.maxInteractions)return!1;if(u.target===e){if((a+=d===n.name|0)>=i)return!1;if(u.element===t&&(l++,d!==n.name||l>=o))return!1}}}return m.maxInteractions>0}}var l=e("../interact"),c=e("../Interactable"),p=e("../Interaction"),u=e("../actions/base"),d=e("../defaultOptions"),f=e("../utils/browser"),v=e("../scope"),g=e("../utils"),h=e("../utils/Signals").new();e("./InteractableMethods");var m={signals:h,withinInteractionLimit:a,maxInteractions:1/0,defaults:{perAction:{manualStart:!1,max:1/0,maxPerElement:1,allowFrom:null,ignoreFrom:null}},setActionDefaults:function(e){g.extend(e.defaults,m.defaults.perAction)}};p.signals.on("down",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;if(!t.interacting()){s(t,o(t,n,r,i))}}),p.signals.on("move",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;if(t.mouse&&!t.pointerIsDown&&!t.interacting()){s(t,o(t,n,r,i))}}),p.signals.on("move",function(e){var t=e.interaction,n=e.event;if(t.pointerIsDown&&!t.interacting()&&t.pointerWasMoved&&t.prepared.name){h.fire("before-start",e);var r=t.target;t.prepared.name&&r&&(r.options[t.prepared.name].manualStart||!a(r,t.element,t.prepared)?t.stop(n):t.start(t.prepared,r,t.element))}}),p.signals.on("stop",function(e){var t=e.interaction,n=t.target;n&&n.options.styleCursor&&(n._doc.documentElement.style.cursor="")}),c.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},c.prototype.actionChecker=function(e){return g.is.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},c.prototype.styleCursor=function(e){return g.is.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},c.prototype.defaultActionChecker=function(e,t,n,r){for(var i=this.getRect(r),o=t.buttons||{0:1,1:4,3:8,4:16}[t.button],s=null,a=u.names,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var d=p;if((!n.pointerIsDown||!n.mouse||0!=(o&this.options[d].mouseButtons))&&(s=u[d].checker(e,t,this,r,n,i)))return s}},l.maxInteractions=function(e){return g.is.number(e)?(m.maxInteractions=e,this):m.maxInteractions},c.settingsMethods.push("styleCursor"),c.settingsMethods.push("actionChecker"),c.settingsMethods.push("ignoreFrom"),c.settingsMethods.push("allowFrom"),d.base.actionChecker=null,d.base.styleCursor=!0,g.extend(d.perAction,m.defaults.perAction),t.exports=m},{"../Interactable":4,"../Interaction":5,"../actions/base":6,"../defaultOptions":18,"../interact":21,"../scope":34,"../utils":44,"../utils/Signals":35,"../utils/browser":37,"./InteractableMethods":12}],14:[function(e,t,n){"use strict";var r=e("./base"),i=e("../Interaction");i.signals.on("new",function(e){e.delayTimer=null}),r.signals.on("prepared",function(e){var t=e.interaction,n=t.prepared.name;if(n){var r=t.target.options[n].delay;r>0&&(t.delayTimer=setTimeout(function(){t.start(t.prepared,t.target,t.element)},r))}}),i.signals.on("move",function(e){var t=e.interaction,n=e.duplicate;t.pointerWasMoved&&!n&&clearTimeout(t.delayTimer)}),r.signals.on("before-start",function(e){var t=e.interaction,n=t.prepared.name;if(n){t.target.options[n].delay>0&&(t.prepared.name=null)}})},{"../Interaction":5,"./base":13}],15:[function(e,t,n){"use strict";function r(e,t){if(!t)return!1;var n=t.options.drag.startAxis;return"xy"===e||"xy"===n||n===e}var i=e("./base"),o=e("../scope"),s=e("../utils/browser"),a=e("../utils/is"),l=e("../utils/domUtils"),c=l.matchesSelector,p=l.parentNode;i.setActionDefaults(e("../actions/drag")),i.signals.on("before-start",function(e){var t=e.interaction,n=e.eventTarget,l=e.dx,u=e.dy;if("drag"===t.prepared.name){var d=Math.abs(l),f=Math.abs(u),v=t.target.options.drag,g=v.startAxis,h=d>f?"x":dl.minSpeed&&g>l.endSpeed,b={interaction:t,pageCoords:v,statuses:f,preEnd:!0,requireEndOnly:!0};y&&!x&&(c.resetStatuses(f),m=c.setAll(b),m.shouldMove&&m.locked&&(h=!0)),(x||h)&&(p.copyCoords(i.upCoords,t.curCoords),t.pointers[0]=i.startEvent=new a(t,n,t.prepared.name,"inertiastart",t.element),i.t0=d,i.active=!0,i.allowResume=l.allowResume,t.simulation=i,o.fire(i.startEvent),x?(i.vx0=t.pointerDelta.client.vx,i.vy0=t.pointerDelta.client.vy,i.v0=g,r(t,i),p.extend(v,t.curCoords.page),v.x+=i.xe,v.y+=i.ye,c.resetStatuses(f),m=c.setAll(b),i.modifiedXe+=m.dx,i.modifiedYe+=m.dy,i.i=u.request(t.boundInertiaFrame)):(i.smoothEnd=!0,i.xe=m.dx,i.ye=m.dy,i.sx=i.sy=0,i.i=u.request(t.boundSmoothEndFrame)))}}),l.signals.on("stop-active",function(e){var t=e.interaction,n=t.inertiaStatus;n.active&&(u.cancel(n.i),n.active=!1,t.simulation=null)})},{"./InteractEvent":3,"./Interaction":5,"./modifiers":24,"./utils":44,"./utils/raf":50}],21:[function(e,t,n){"use strict";function r(e,t){var n=a.interactables.get(e,t);return n||(n=new l(e,t),n.events.global=p),n}var i=e("./utils/browser"),o=e("./utils/events"),s=e("./utils"),a=e("./scope"),l=e("./Interactable"),c=e("./Interaction"),p={};r.isSet=function(e,t){return-1!==a.interactables.indexOfElement(e,t&&t.context)},r.on=function(e,t,n){if(s.is.string(e)&&-1!==e.search(" ")&&(e=e.trim().split(/ +/)),s.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.on(f,t,n)}return r}if(s.is.object(e)){for(var v in e)r.on(v,e[v],t);return r}return s.contains(l.eventTypes,e)?p[e]?p[e].push(t):p[e]=[t]:o.add(a.document,e,t,{options:n}),r},r.off=function(e,t,n){if(s.is.string(e)&&-1!==e.search(" ")&&(e=e.trim().split(/ +/)),s.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.off(f,t,n)}return r}if(s.is.object(e)){for(var v in e)r.off(v,e[v],t);return r}if(s.contains(l.eventTypes,e)){var g=void 0;e in p&&-1!==(g=s.indexOf(p[e],t))&&p[e].splice(g,1)}else o.remove(a.document,e,t,n);return r},r.debug=function(){return a},r.getPointerAverage=s.pointerAverage,r.getTouchBBox=s.touchBBox,r.getTouchDistance=s.touchDistance,r.getTouchAngle=s.touchAngle,r.getElementRect=s.getElementRect,r.getElementClientRect=s.getElementClientRect,r.matchesSelector=s.matchesSelector,r.closest=s.closest,r.supportsTouch=function(){return i.supportsTouch},r.supportsPointerEvent=function(){return i.supportsPointerEvent},r.stop=function(e){for(var t=a.interactions.length-1;t>=0;t--)a.interactions[t].stop(e);return r},r.pointerMoveTolerance=function(e){return s.is.number(e)?(c.pointerMoveTolerance=e,this):c.pointerMoveTolerance},r.addDocument=a.addDocument,r.removeDocument=a.removeDocument,a.interact=r,t.exports=r},{"./Interactable":4,"./Interaction":5,"./scope":34,"./utils":44,"./utils/browser":37,"./utils/events":40}],22:[function(e,t,n){"use strict";function r(e){var t=e.interaction,n=e.event;t.target&&t.target.checkAndPreventDefault(n)}var i=e("./Interactable"),o=e("./Interaction"),s=e("./scope"),a=e("./utils/is"),l=e("./utils/events"),c=e("./utils/domUtils"),p=c.nodeContains,u=c.matchesSelector;i.prototype.preventDefault=function(e){return/^(always|never|auto)$/.test(e)?(this.options.preventDefault=e,this):a.bool(e)?(this.options.preventDefault=e?"always":"never",this):this.options.preventDefault},i.prototype.checkAndPreventDefault=function(e){var t=this.options.preventDefault;if("never"!==t)return"always"===t?void e.preventDefault():void(l.supportsOptions||/^(mouse|pointer|touch)*(down|start)/i.test(e.type)||a.element(e.target)&&u(e.target,"input,select,textarea,[contenteditable=true],[contenteditable=true] *")||e.preventDefault())};for(var d=["down","move","up","cancel"],f=0;f=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i;if(o.element&&(o.element===e.target||p(o.element,e.target)))return void o.target.checkAndPreventDefault(e)}}},{"./Interactable":4,"./Interaction":5,"./scope":34,"./utils/domUtils":39,"./utils/events":40,"./utils/is":46}],23:[function(e,t,n){"use strict";function r(e){var t=e.target,n=a.search(e,e.type,t);n&&n.prevTap&&e.clientX===n.prevTap.clientX&&e.clientY===n.prevTap.clientY&&t===n.prevTap.target&&(n.downTargets[0]=t,n.downTimes[0]=(new Date).getTime(),l.fire({interaction:n,event:e,eventTarget:t,pointer:e,type:"tap"}))}var i=e("./scope"),o=e("./utils/events"),s=e("./utils/browser"),a=e("./utils/interactionFinder"),l=e("./pointerEvents/base"),c=e("./utils/window"),p=c.window,u=Object.prototype.toString;if(p.Array.isArray||(p.Array.isArray=function(e){return"[object Array]"===u.call(e)}),String.prototype.trim||(String.prototype.trim=function(){return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")}),s.isIE8){var d=function(e){for(var t=i.interactions,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var o;if(n){if(r>=t.length)break;o=t[r++]}else{if(r=t.next(),r.done)break;o=r.value}var s=o;s.interacting()&&s.target.checkAndPreventDefault(e)}},f=function(e,t){var n=e.doc,i=(e.win,0===t.indexOf("listen")?o.add:o.remove);i(n,"selectstart",d),l&&i(n,"dblclick",r)};i.signals.on("add-document",f),i.signals.on("remove-document",f)}t.exports=null},{"./pointerEvents/base":31,"./scope":34,"./utils/browser":37,"./utils/events":40,"./utils/interactionFinder":45,"./utils/window":52}],24:[function(e,t,n){"use strict";function r(e,t,n){return e&&e.enabled&&(t||!e.endOnly)&&(!n||e.endOnly)}var i=e("../InteractEvent"),o=e("../Interaction"),s=e("../utils/extend"),a={names:[],setOffsets:function(e){var t=e.interaction,n=e.pageCoords,r=t.target,i=t.element,o=t.startOffset,s=r.getRect(i);s?(o.left=n.x-s.left,o.top=n.y-s.top,o.right=s.right-n.x,o.bottom=s.bottom-n.y,"width"in s||(s.width=s.right-s.left),"height"in s||(s.height=s.bottom-s.top)):o.left=o.top=o.right=o.bottom=0,e.rect=s,e.interactable=r,e.element=i;for(var l=0;l=p.length)break;f=p[d++]}else{if(d=p.next(),d.done)break;f=d.value}var v=f,g=a[v],h=t.target.options[t.prepared.name][v];r(h,i,o)&&(e.status=e.status=n[v],e.options=h,e.offset=e.interaction.modifierOffsets[v],g.set(e),e.status.locked&&(l.x+=e.status.dx,l.y+=e.status.dy,c.dx+=e.status.dx,c.dy+=e.status.dy,c.locked=!0))}return c.shouldMove=!e.status||!c.locked||e.status.changed,c},resetStatuses:function(e){for(var t=a.names,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var i;if(n){if(r>=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i,s=e[o]||{};s.dx=s.dy=0,s.modifiedX=s.modifiedY=NaN,s.locked=!1,s.changed=!0,e[o]=s}return e},start:function(e,t){var n=e.interaction,r={interaction:n,pageCoords:("action-resume"===t?n.curCoords:n.startCoords).page,startOffset:n.startOffset,statuses:n.modifierStatuses,preEnd:!1,requireEndOnly:!1};a.setOffsets(r),a.resetStatuses(r.statuses),r.pageCoords=s({},n.startCoords.page),n.modifierResult=a.setAll(r)}};o.signals.on("new",function(e){e.startOffset={left:0,right:0,top:0,bottom:0},e.modifierOffsets={},e.modifierStatuses=a.resetStatuses({}),e.modifierResult=null}),o.signals.on("action-start",a.start),o.signals.on("action-resume",a.start),o.signals.on("before-action-move",function(e){var t=e.interaction,n=e.preEnd,r=e.interactingBeforeMove,i=a.setAll({interaction:t,preEnd:n,pageCoords:t.curCoords.page,statuses:t.modifierStatuses,requireEndOnly:!1});!i.shouldMove&&r&&(t._dontFireMove=!0),t.modifierResult=i}),o.signals.on("action-end",function(e){for(var t=e.interaction,n=e.event,i=0;i=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}var m=h,y=m.x,x=m.y;l.push({x:s.left-i.width*y+u.x,y:s.top-i.height*x+u.y})}else l.push(u);return l},set:function(e){var t=e.interaction,n=e.pageCoords,r=e.status,i=e.options,s=e.offset,a=[],l=void 0,c=void 0,p=void 0;if(r.useStatusXY)c={x:r.x,y:r.y};else{var u=o.getOriginXY(t.target,t.element,t.prepared.name);c=o.extend({},n),c.x-=u.x,c.y-=u.y}r.realX=c.x,r.realY=c.y;for(var d=i.targets?i.targets.length:0,f=s,v=Array.isArray(f),g=0,f=v?f:f[Symbol.iterator]();;){var h;if(v){if(g>=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}for(var m=h,y=m.x,x=m.y,b=c.x-y,w=c.y-x,E=i.targets,S=Array.isArray(E),T=0,E=S?E:E[Symbol.iterator]();;){var C;if(S){if(T>=E.length)break;C=E[T++]}else{if(T=E.next(),T.done)break;C=T.value}var A=C;l=o.is.function(A)?A(b,w,t):A,l&&a.push({x:o.is.number(l.x)?l.x+y:b,y:o.is.number(l.y)?l.y+x:w,range:o.is.number(l.range)?l.range:i.range})}}var D={target:null,inRange:!1,distance:0,range:0,dx:0,dy:0};for(p=0,d=a.length;p=p.length)break;f=p[d++]}else{if(d=p.next(),d.done)break;f=d.value}var v=f,g=void 0;g=a.is.function(v)?v(l,c,t):v,g&&("width"in g&&"height"in g&&(g.x=g.width,g.y=g.height),e.options.targets.push(g))}i.set(e)},modifyCoords:function(e){var t=e.options;e.options=a.extend({},t), -e.options.enabled=t.enabled,e.options.relativePoints=[null],i.modifyCoords(e)}};r.snapSize=l,r.names.push("snapSize"),o.perAction.snapSize=l.defaults,s.defaults.snapSize=l.defaults,t.exports=l},{"../actions/resize":10,"../defaultOptions":18,"../utils/":44,"./index":24,"./snap":28}],30:[function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=e("../utils/pointerUtils");t.exports=function(){function e(t,n,o,s,a){if(r(this,e),i.pointerExtend(this,o),o!==n&&i.pointerExtend(this,n),this.interaction=a,this.timeStamp=(new Date).getTime(),this.originalEvent=o,this.type=t,this.pointerId=i.getPointerId(n),this.pointerType=i.getPointerType(n,a),this.target=s,this.currentTarget=null,"tap"===t){var l=a.getPointerIndex(n);this.dt=this.timeStamp-a.downTimes[l];var c=this.timeStamp-a.tapTime;this.double=!!(a.prevTap&&"doubletap"!==a.prevTap.type&&a.prevTap.target===this.target&&c<500)}else"doubletap"===t&&(this.dt=n.timeStamp-a.tapTime)}return e.prototype.subtractOrigin=function(e){var t=e.x,n=e.y;return this.pageX-=t,this.pageY-=n,this.clientX-=t,this.clientY-=n,this},e.prototype.addOrigin=function(e){var t=e.x,n=e.y;return this.pageX+=t,this.pageY+=n,this.clientX+=t,this.clientY+=n,this},e.prototype.preventDefault=function(){this.originalEvent.preventDefault()},e.prototype.stopPropagation=function(){this.propagationStopped=!0},e.prototype.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},e}()},{"../utils/pointerUtils":49}],31:[function(e,t,n){"use strict";function r(e){for(var t=e.interaction,n=e.pointer,s=e.event,l=e.eventTarget,c=e.type,u=void 0===c?e.pointerEvent.type:c,d=e.targets,f=void 0===d?i(e):d,v=e.pointerEvent,g=void 0===v?new o(u,n,s,l,t):v,h={interaction:t,pointer:n,event:s,eventTarget:l,targets:f,type:u,pointerEvent:g},m=0;m=u.length)break;g=u[v++]}else{if(v=u.next(),v.done)break;g=v.value}var h=g;c.element=h,p.fire("collect-targets",c)}return"hold"===o&&(c.targets=d(c.targets,function(e){return e.eventable.options.holdDuration===t.holdTimers[s].duration})),c.targets}var o=e("./PointerEvent"),s=e("../Interaction"),a=e("../utils"),l=e("../utils/browser"),c=e("../defaultOptions"),p=e("../utils/Signals").new(),u=e("../utils/arr"),d=u.filter,f=["down","up","cancel"],v=["down","up","cancel"],g={PointerEvent:o,fire:r,collectEventTargets:i,signals:p,defaults:{holdDuration:600,ignoreFrom:null,allowFrom:null,origin:{x:0,y:0}},types:["down","move","up","cancel","tap","doubletap","hold"]};s.signals.on("update-pointer-down",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers[n]={duration:1/0,timeout:null}}),s.signals.on("remove-pointer",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers.splice(n,1)}),s.signals.on("move",function(e){var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,s=e.duplicateMove,a=t.getPointerIndex(n);s||t.pointerIsDown&&!t.pointerWasMoved||(t.pointerIsDown&&clearTimeout(t.holdTimers[a].timeout),r({interaction:t,pointer:n,event:i,eventTarget:o,type:"move"}))}),s.signals.on("down",function(e){for(var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,s=e.pointerIndex,c=l.isIE8?a.extend({},i):i,u=t.holdTimers[s],d=a.getPath(o),f={interaction:t,pointer:n,event:i,eventTarget:o,type:"hold",targets:[],path:d,element:null},v=d,g=Array.isArray(v),h=0,v=g?v:v[Symbol.iterator]();;){var m;if(g){if(h>=v.length)break;m=v[h++]}else{if(h=v.next(),h.done)break;m=h.value}var y=m;f.element=y,p.fire("collect-targets",f)}if(f.targets.length){for(var x=1/0,b=0;b=0&&(p.selectors[u]!==e||p.contexts[u]!==t);u--);-1===u&&(u=p.selectors.length,p.selectors.push(e),p.contexts.push(t),p.listeners.push([])),p.listeners[u].push([i,!!s.capture,s.passive])}function s(e,t,n,r,o){var s=f(o),c=O[n],p=!1,u=void 0;if(c)for(u=c.selectors.length-1;u>=0;u--)if(c.selectors[u]===e&&c.contexts[u]===t){for(var d=c.listeners[u],v=d.length-1;v>=0;v--){var g=d[v],h=g[0],m=g[1],y=g[2];if(h===r&&m===!!s.capture&&y===s.passive){d.splice(v,1),d.length||(c.selectors.splice(u,1),c.contexts.splice(u,1),c.listeners.splice(u,1),i(t,n,a),i(t,n,l,!0),c.selectors.length||(O[n]=null)),p=!0;break}}if(p)break}}function a(e,t){var n=f(t),r={},i=O[e.type],o=g.getActualElement(e.path?e.path[0]:e.target),s=o;for(h(r,e),r.originalEvent=e,r.preventDefault=p;v.element(s);){for(var a=0;a=l.length)break;u=l[p++]}else{if(p=l.next(),p.done)break;u=p.value}var d=u,f=s[d](a);if(f)return f}},simulationResume:function(e){var t=e.mouseEvent,n=e.eventType,o=e.eventTarget;if(!/down|start/i.test(n))return null;for(var s=r.interactions,a=Array.isArray(s),l=0,s=a?s:s[Symbol.iterator]();;){var c;if(a){if(l>=s.length)break;c=s[l++]}else{if(l=s.next(),l.done)break;c=l.value}var p=c,u=o;if(p.simulation&&p.simulation.allowResume&&p.mouse===t)for(;u;){if(u===p.element)return p;u=i.parentNode(u)}}return null},mouse:function(e){var t=e.pointerId,n=e.mouseEvent,s=e.eventType;if(!n&&(o.supportsTouch||o.supportsPointerEvent))return null;for(var a=void 0,l=r.interactions,c=Array.isArray(l),p=0,l=c?l:l[Symbol.iterator]();;){var u;if(c){if(p>=l.length)break;u=l[p++]}else{if(p=l.next(),p.done)break;u=p.value}var d=u;if(d.mouse){if(d.simulation&&!i.contains(d.pointerIds,t))continue;if(d.interacting())return d;a||(a=d)}}if(a)return a;for(var f=r.interactions,v=Array.isArray(f),g=0,f=v?f:f[Symbol.iterator]();;){var h;if(v){if(g>=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}var m=h;if(m.mouse&&(!/down/.test(s)||!m.simulation))return m}return null},hasPointer:function(e){for(var t=e.pointerId,n=r.interactions,o=Array.isArray(n),s=0,n=o?n:n[Symbol.iterator]();;){var a;if(o){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var l=a;if(i.contains(l.pointerIds,t))return l}},idle:function(e){for(var t=e.mouseEvent,n=r.interactions,i=Array.isArray(n),o=0,n=i?n:n[Symbol.iterator]();;){var s;if(i){if(o>=n.length)break;s=n[o++]}else{if(o=n.next(),o.done)break;s=o.value}var a=s;if(1===a.pointerIds.length){var l=a.target;if(l&&!l.options.gesture.enabled)continue}else if(a.pointerIds.length>=2)continue;if(!a.interacting()&&t===a.mouse)return a}return null}};t.exports=s},{"../scope":34,"./browser":37,"./index":44}],46:[function(e,t,n){"use strict";var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},i=e("./window"),o=e("./isWindow"),s={array:function(){},window:function(e){return e===i.window||o(e)},docFrag:function(e){return s.object(e)&&11===e.nodeType},object:function(e){return!!e&&"object"===(void 0===e?"undefined":r(e))},function:function(e){return"function"==typeof e},number:function(e){return"number"==typeof e},bool:function(e){return"boolean"==typeof e},string:function(e){return"string"==typeof e},element:function(e){if(!e||"object"!==(void 0===e?"undefined":r(e)))return!1;var t=i.getWindow(e)||i.window;return/object|function/.test(r(t.Element))?e instanceof t.Element:1===e.nodeType&&"string"==typeof e.nodeName}};s.array=function(e){return s.object(e)&&void 0!==e.length&&s.function(e.splice)},t.exports=s},{"./isWindow":47,"./window":52}],47:[function(e,t,n){"use strict";t.exports=function(e){return!(!e||!e.Window)&&e instanceof e.Window}},{}],48:[function(e,t,n){"use strict";function r(e,n){for(var r in n){var i=t.exports.prefixedPropREs,o=!1;for(var s in i)if(0===r.indexOf(s)&&i[s].test(r)){o=!0;break}o||"function"==typeof n[r]||(e[r]=n[r])}return e}r.prefixedPropREs={webkit:/(Movement[XY]|Radius[XY]|RotationAngle|Force)$/},t.exports=r},{}],49:[function(e,t,n){"use strict";var r=e("./hypot"),i=e("./browser"),o=e("./domObjects"),s=e("./domUtils"),a=e("./is"),l=e("./pointerExtend"),c={copyCoords:function(e,t){e.page=e.page||{},e.page.x=t.page.x,e.page.y=t.page.y,e.client=e.client||{},e.client.x=t.client.x,e.client.y=t.client.y,e.timeStamp=t.timeStamp},setCoordDeltas:function(e,t,n){e.page.x=n.page.x-t.page.x,e.page.y=n.page.y-t.page.y,e.client.x=n.client.x-t.client.x,e.client.y=n.client.y-t.client.y,e.timeStamp=n.timeStamp-t.timeStamp;var i=Math.max(e.timeStamp/1e3,.001);e.page.speed=r(e.page.x,e.page.y)/i,e.page.vx=e.page.x/i,e.page.vy=e.page.y/i,e.client.speed=r(e.client.x,e.page.y)/i,e.client.vx=e.client.x/i,e.client.vy=e.client.y/i},isNativePointer:function(e){return e instanceof o.Event||e instanceof o.Touch},getXY:function(e,t,n){return n=n||{},e=e||"page",n.x=t[e+"X"],n.y=t[e+"Y"],n},getPageXY:function(e,t){return t=t||{},i.isOperaMobile&&c.isNativePointer(e)?(c.getXY("screen",e,t),t.x+=window.scrollX,t.y+=window.scrollY):c.getXY("page",e,t),t},getClientXY:function(e,t){return t=t||{},i.isOperaMobile&&c.isNativePointer(e)?c.getXY("screen",e,t):c.getXY("client",e,t),t},getPointerId:function(e){return a.number(e.pointerId)?e.pointerId:e.identifier},setCoords:function(e,t,n){var r=t.length>1?c.pointerAverage(t):t[0],i={};c.getPageXY(r,i),e.page.x=i.x,e.page.y=i.y,c.getClientXY(r,i),e.client.x=i.x,e.client.y=i.y,e.timeStamp=a.number(n)?n:(new Date).getTime()},pointerExtend:l,getTouchPair:function(e){var t=[];return a.array(e)?(t[0]=e[0],t[1]=e[1]):"touchend"===e.type?1===e.touches.length?(t[0]=e.touches[0],t[1]=e.changedTouches[0]):0===e.touches.length&&(t[0]=e.changedTouches[0],t[1]=e.changedTouches[1]):(t[0]=e.touches[0],t[1]=e.touches[1]),t},pointerAverage:function(e){for(var t={pageX:0,pageY:0,clientX:0,clientY:0,screenX:0,screenY:0},n=e,r=Array.isArray(n),i=0,n=r?n:n[Symbol.iterator]();;){var o;if(r){if(i>=n.length)break;o=n[i++]}else{if(i=n.next(),i.done)break;o=i.value}var s=o;for(var a in t)t[a]+=s[a]}for(var l in t)t[l]/=e.length;return t},touchBBox:function(e){if(e.length||e.touches&&e.touches.length>1){var t=c.getTouchPair(e),n=Math.min(t[0].pageX,t[1].pageX),r=Math.min(t[0].pageY,t[1].pageY);return{x:n,y:r,left:n,top:r,width:Math.max(t[0].pageX,t[1].pageX)-n,height:Math.max(t[0].pageY,t[1].pageY)-r}}},touchDistance:function(e,t){var n=t+"X",i=t+"Y",o=c.getTouchPair(e),s=o[0][n]-o[1][n],a=o[0][i]-o[1][i];return r(s,a)},touchAngle:function(e,t,n){var r=n+"X",i=n+"Y",o=c.getTouchPair(e),s=o[1][r]-o[0][r],a=o[1][i]-o[0][i];return 180*Math.atan2(a,s)/Math.PI},getPointerType:function(e,t){return t.mouse?"mouse":i.supportsPointerEvent?a.string(e.pointerType)?e.pointerType:[void 0,void 0,"touch","pen","mouse"][e.pointerType]:"touch"},getEventTargets:function(e){return[s.getActualElement(e.path?e.path[0]:e.target),s.getActualElement(e.currentTarget)]}};t.exports=c},{"./browser":37,"./domObjects":38,"./domUtils":39,"./hypot":43,"./is":46,"./pointerExtend":48}],50:[function(e,t,n){"use strict";for(var r=e("./window"),i=r.window,o=["ms","moz","webkit","o"],s=0,a=void 0,l=void 0,c=0;c6&&void 0!==arguments[6]&&arguments[6];r(this,e);var f=t.target,v=(f&&f.options||s).deltaSource,g=o(f,p,l),h="start"===c,m="end"===c,y=h?t.startCoords:t.curCoords,x=t.prevEvent;p=p||t.element;var b=i({},y.page),w=i({},y.client);b.x-=g.x,b.y-=g.y,w.x-=g.x,w.y-=g.y,this.ctrlKey=n.ctrlKey,this.altKey=n.altKey,this.shiftKey=n.shiftKey,this.metaKey=n.metaKey,this.button=n.button,this.buttons=n.buttons,this.target=p,this.currentTarget=p,this.relatedTarget=u||null,this.preEnd=d,this.type=l+(c||""),this.interaction=t,this.interactable=f,this.t0=h?t.downTimes[t.downTimes.length-1]:x.t0;var E={interaction:t,event:n,action:l,phase:c,element:p,related:u,page:b,client:w,coords:y,starting:h,ending:m,deltaSource:v,iEvent:this};a.fire("set-xy",E),m?(this.pageX=x.pageX,this.pageY=x.pageY,this.clientX=x.clientX,this.clientY=x.clientY):(this.pageX=b.x,this.pageY=b.y,this.clientX=w.x,this.clientY=w.y),this.x0=t.startCoords.page.x-g.x,this.y0=t.startCoords.page.y-g.y,this.clientX0=t.startCoords.client.x-g.x,this.clientY0=t.startCoords.client.y-g.y,a.fire("set-delta",E),this.timeStamp=y.timeStamp,this.dt=t.pointerDelta.timeStamp,this.duration=this.timeStamp-this.t0,this.speed=t.pointerDelta[v].speed,this.velocityX=t.pointerDelta[v].vx,this.velocityY=t.pointerDelta[v].vy,this.swipe=m||"inertiastart"===c?this.getSwipe():null,a.fire("new",E)}return e.prototype.getSwipe=function(){var e=this.interaction;if(e.prevEvent.speed<600||this.timeStamp-e.prevEvent.timeStamp>150)return null;var t=180*Math.atan2(e.prevEvent.velocityY,e.prevEvent.velocityX)/Math.PI;t<0&&(t+=360);var n=112.5<=t&&t<247.5,r=202.5<=t&&t<337.5,i=!n&&(292.5<=t||t<67.5);return{up:r,down:!r&&22.5<=t&&t<157.5,left:n,right:i,angle:t,speed:e.prevEvent.speed,velocity:{x:e.prevEvent.velocityX,y:e.prevEvent.velocityY}}},e.prototype.preventDefault=function(){},e.prototype.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},e.prototype.stopPropagation=function(){this.propagationStopped=!0},e}();a.on("set-delta",function(e){var t=e.iEvent,n=e.interaction,r=e.starting,i=e.deltaSource,o=r?t:n.prevEvent;"client"===i?(t.dx=t.clientX-o.clientX,t.dy=t.clientY-o.clientY):(t.dx=t.pageX-o.pageX,t.dy=t.pageY-o.pageY)}),l.signals=a,t.exports=l},{"./defaultOptions":18,"./utils/Signals":35,"./utils/extend":41,"./utils/getOriginXY":42}],4:[function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=e("./utils/is"),o=e("./utils/events"),s=e("./utils/extend"),a=e("./actions/base"),l=e("./scope"),c=e("./Eventable"),p=e("./defaultOptions"),u=e("./utils/Signals").new(),d=e("./utils/domUtils"),f=d.getElementRect,v=d.nodeContains,g=d.trySelector,h=e("./utils/window"),m=h.getWindow,y=e("./utils/arr"),x=y.indexOf,b=y.contains,w=e("./utils/browser"),E=w.wheelEvent;l.interactables=[];var S=function(){function e(t,n){r(this,e),n=n||{},this.target=t,this.events=new c,this._context=n.context||l.document,this._win=m(g(t)?this._context:t),this._doc=this._win.document,u.fire("new",{target:t,options:n,interactable:this,win:this._win}),l.addDocument(this._doc,this._win),l.interactables.push(this),this.set(n)}return e.prototype.setOnEvents=function(e,t){var n="on"+e;return i.function(t.onstart)&&(this.events[n+"start"]=t.onstart),i.function(t.onmove)&&(this.events[n+"move"]=t.onmove),i.function(t.onend)&&(this.events[n+"end"]=t.onend),i.function(t.oninertiastart)&&(this.events[n+"inertiastart"]=t.oninertiastart),this},e.prototype.setPerAction=function(e,t){for(var n in t)n in p[e]&&(i.object(t[n])?(this.options[e][n]=s(this.options[e][n]||{},t[n]),i.object(p.perAction[n])&&"enabled"in p.perAction[n]&&(this.options[e][n].enabled=!1!==t[n].enabled)):i.bool(t[n])&&i.object(p.perAction[n])?this.options[e][n].enabled=t[n]:void 0!==t[n]&&(this.options[e][n]=t[n]))},e.prototype.getRect=function(e){return e=e||this.target,i.string(this.target)&&!i.element(e)&&(e=this._context.querySelector(this.target)),f(e)},e.prototype.rectChecker=function(e){return i.function(e)?(this.getRect=e,this):null===e?(delete this.options.getRect,this):this.getRect},e.prototype._backCompatOption=function(e,t){if(g(t)||i.object(t)){this.options[e]=t;for(var n=a.names,r=Array.isArray(n),o=0,n=r?n:n[Symbol.iterator]();;){var s;if(r){if(o>=n.length)break;s=n[o++]}else{if(o=n.next(),o.done)break;s=o.value}var l=s;this.options[l][e]=t}return this}return this.options[e]},e.prototype.origin=function(e){return this._backCompatOption("origin",e)},e.prototype.deltaSource=function(e){return"page"===e||"client"===e?(this.options.deltaSource=e,this):this.options.deltaSource},e.prototype.context=function(){return this._context},e.prototype.inContext=function(e){return this._context===e.ownerDocument||v(this._context,e)},e.prototype.fire=function(e){return this.events.fire(e),this},e.prototype._onOffMultiple=function(e,t,n,r){if(i.string(t)&&-1!==t.search(" ")&&(t=t.trim().split(/ +/)),i.array(t)){for(var o=0;o=l.length)break;f=l[d++]}else{if(d=l.next(),d.done)break;f=d.value}var v=f;this.options[v]=p.base[v],v in t&&this[v](t[v])}return u.fire("set",{options:t,interactable:this}),this},e.prototype.unset=function(){if(o.remove(this.target,"all"),i.string(this.target))for(var e in o.delegatedEvents){var t=o.delegatedEvents[e];t.selectors[0]===this.target&&t.contexts[0]===this._context&&(t.selectors.splice(0,1),t.contexts.splice(0,1),t.listeners.splice(0,1),t.selectors.length||(t[e]=null)),o.remove(this._context,e,o.delegateListener),o.remove(this._context,e,o.delegateUseCapture,!0)}else o.remove(this,"all");u.fire("unset",{interactable:this}),l.interactables.splice(x(l.interactables,this),1);for(var n=l.interactions||[],r=Array.isArray(n),s=0,n=r?n:n[Symbol.iterator]();;){var a;if(r){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var c=a;c.target===this&&c.interacting()&&c.stop()}return l.interact},e}();l.interactables.indexOfElement=function(e,t){t=t||l.document;for(var n=0;n=x.length)break;E=x[w++]}else{if(w=x.next(),w.done)break;E=w.value}var S=E,T=S[0],C=S[1];C._updateEventTargets(i,o),C[e](T,t,i,o)}}}function o(e){for(var t=0;te.pointerMoveTolerance);var a={pointer:t,pointerIndex:this.getPointerIndex(t),event:n,eventTarget:r,dx:o,dy:s,duplicate:i,interaction:this,interactingBeforeMove:this.interacting()};i||l.setCoordDeltas(this.pointerDelta,this.prevCoords,this.curCoords),f.fire("move",a),i||(this.interacting()&&this.doMove(a),this.pointerWasMoved&&l.copyCoords(this.prevCoords,this.curCoords))},e.prototype.doMove=function(e){e=l.extend({pointer:this.pointers[0],event:this.prevEvent,eventTarget:this._eventTarget,interaction:this},e||{}),f.fire("before-action-move",e),this._dontFireMove||f.fire("action-move",e),this._dontFireMove=!1},e.prototype.pointerUp=function(e,t,n,r){var i=this.getPointerIndex(e);f.fire(/cancel$/i.test(t.type)?"cancel":"up",{pointer:e,pointerIndex:i,event:t,eventTarget:n,curEventTarget:r,interaction:this}),this.simulation||this.end(t),this.pointerIsDown=!1,this.removePointer(e,t)},e.prototype.end=function(e){e=e||this.prevEvent,this.interacting()&&f.fire("action-end",{event:e,interaction:this}),this.stop()},e.prototype.currentAction=function(){return this._interacting?this.prepared.name:null},e.prototype.interacting=function(){return this._interacting},e.prototype.stop=function(){f.fire("stop",{interaction:this}),this._interacting&&(f.fire("stop-active",{interaction:this}),f.fire("stop-"+this.prepared.name,{interaction:this})),this.target=this.element=null,this._interacting=!1,this.prepared.name=this.prevEvent=null},e.prototype.getPointerIndex=function(e){return"mouse"===this.pointerType||"pen"===this.pointerType?0:l.indexOf(this.pointerIds,l.getPointerId(e))},e.prototype.updatePointer=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:t&&/(down|start)$/i.test(t.type),r=l.getPointerId(e),i=this.getPointerIndex(e);return-1===i&&(i=this.pointerIds.length,this.pointerIds[i]=r),n&&f.fire("update-pointer-down",{pointer:e,event:t,down:n,pointerId:r,pointerIndex:i,interaction:this}),this.pointers[i]=e,i},e.prototype.removePointer=function(e,t){var n=this.getPointerIndex(e);-1!==n&&(f.fire("remove-pointer",{pointer:e,event:t,pointerIndex:n,interaction:this}),this.pointers.splice(n,1),this.pointerIds.splice(n,1),this.downTargets.splice(n,1),this.downTimes.splice(n,1))},e.prototype._updateEventTargets=function(e,t){this._eventTarget=e,this._curEventTarget=t},e}(),y=0,x=g.length;y=i.length)break;a=i[s++]}else{if(s=i.next(),s.done)break;a=s.value}var l=a;if(l.options.drop.enabled){var c=l.options.drop.accept;if(!(p.is.element(c)&&c!==t||p.is.string(c)&&!p.matchesSelector(t,c)))for(var d=p.is.string(l.target)?l._context.querySelectorAll(l.target):[l.target],f=0;fo.left&&c.xo.top&&c.y=o.left&&v<=o.right&&g>=o.top&&g<=o.bottom}if(f&&p.is.number(a)){s=Math.max(0,Math.min(o.right,f.right)-Math.max(o.left,f.left))*Math.max(0,Math.min(o.bottom,f.bottom)-Math.max(o.top,f.top))/(f.width*f.height)>=a}return this.options.drop.checker&&(s=this.options.drop.checker(e,t,s,this,i,n,r)),s},v.signals.on("unset",function(e){e.interactable.dropzone(!1)}),v.settingsMethods.push("dropChecker"),g.signals.on("new",function(e){e.dropTarget=null,e.dropElement=null,e.prevDropTarget=null,e.prevDropElement=null,e.dropEvents=null,e.activeDrops={dropzones:[],elements:[],rects:[]}}),g.signals.on("stop",function(e){var t=e.interaction;t.dropTarget=t.dropElement=t.prevDropTarget=t.prevDropElement=null}),d.dynamicDrop=function(e){return p.is.bool(e)?(y=e,d):y},p.merge(v.eventTypes,["dragenter","dragleave","dropactivate","dropdeactivate","dropmove","drop"]),c.methodDict.drop="dropzone",h.drop=m.defaults,t.exports=m},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../interact":21,"../scope":34,"../utils":44,"./base":6}],9:[function(e,t,n){"use strict";var r=e("./base"),i=e("../utils"),o=e("../InteractEvent"),s=e("../Interactable"),a=e("../Interaction"),l=e("../defaultOptions"),c={defaults:{enabled:!1,origin:null,restrict:null},checker:function(e,t,n,r,i){return i.pointerIds.length>=2?{name:"gesture"}:null},getCursor:function(){return""}};o.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;"gesturestart"===t.type&&(t.ds=0,n.gesture.startDistance=n.gesture.prevDistance=t.distance,n.gesture.startAngle=n.gesture.prevAngle=t.angle,n.gesture.scale=1)}),o.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;"gesturemove"===t.type&&(t.ds=t.scale-n.gesture.scale,n.target.fire(t),n.gesture.prevAngle=t.angle,n.gesture.prevDistance=t.distance,t.scale===1/0||null===t.scale||void 0===t.scale||isNaN(t.scale)||(n.gesture.scale=t.scale))}),s.prototype.gesturable=function(e){return i.is.object(e)?(this.options.gesture.enabled=!1!==e.enabled,this.setPerAction("gesture",e),this.setOnEvents("gesture",e),this):i.is.bool(e)?(this.options.gesture.enabled=e,e||(this.ongesturestart=this.ongesturestart=this.ongestureend=null),this):this.options.gesture},o.signals.on("set-delta",function(e){var t=e.interaction,n=e.iEvent,r=e.action,s=e.event,a=e.starting,l=e.ending,c=e.deltaSource;if("gesture"===r){var p=t.pointers;n.touches=[p[0],p[1]],a?(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=1,n.ds=0,n.angle=i.touchAngle(p,void 0,c),n.da=0):l||s instanceof o?(n.distance=t.prevEvent.distance,n.box=t.prevEvent.box,n.scale=t.prevEvent.scale,n.ds=n.scale-1,n.angle=t.prevEvent.angle,n.da=n.angle-t.gesture.startAngle):(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=n.distance/t.gesture.startDistance,n.angle=i.touchAngle(p,t.gesture.prevAngle,c),n.ds=n.scale-t.gesture.prevScale,n.da=n.angle-t.gesture.prevAngle)}}),a.signals.on("new",function(e){e.gesture={start:{x:0,y:0},startDistance:0,prevDistance:0,distance:0,scale:1,startAngle:0,prevAngle:0}}),r.gesture=c,r.names.push("gesture"),i.merge(s.eventTypes,["gesturestart","gesturemove","gestureend"]),r.methodDict.gesture="gesturable",l.gesture=c.defaults,t.exports=c},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"./base":6}],10:[function(e,t,n){"use strict";function r(e,t,n,r,i,s,a){if(!t)return!1;if(!0===t){var l=o.is.number(s.width)?s.width:s.right-s.left,c=o.is.number(s.height)?s.height:s.bottom-s.top;if(l<0&&("left"===e?e="right":"right"===e&&(e="left")),c<0&&("top"===e?e="bottom":"bottom"===e&&(e="top")),"left"===e)return n.x<(l>=0?s.left:s.right)+a;if("top"===e)return n.y<(c>=0?s.top:s.bottom)+a;if("right"===e)return n.x>(l>=0?s.right:s.left)-a;if("bottom"===e)return n.y>(c>=0?s.bottom:s.top)-a}return!!o.is.element(r)&&(o.is.element(t)?t===r:o.matchesUpTo(r,t,i))}var i=e("./base"),o=e("../utils"),s=e("../utils/browser"),a=e("../InteractEvent"),l=e("../Interactable"),c=e("../Interaction"),p=e("../defaultOptions"),u=s.supportsTouch||s.supportsPointerEvent?20:10,d={defaults:{enabled:!1,mouseButtons:null,origin:null,snap:null,restrict:null,inertia:null,autoScroll:null,square:!1,preserveAspectRatio:!1,axis:"xy",margin:NaN,edges:null,invert:"none"},checker:function(e,t,n,i,s,a){if(!a)return null;var l=o.extend({},s.curCoords.page),c=n.options;if(c.resize.enabled){var p=c.resize,d={left:!1,right:!1,top:!1,bottom:!1};if(o.is.object(p.edges)){for(var f in d)d[f]=r(f,p.edges[f],l,s._eventTarget,i,a,p.margin||u);if(d.left=d.left&&!d.right,d.top=d.top&&!d.bottom,d.left||d.right||d.top||d.bottom)return{name:"resize",edges:d}}else{var v="y"!==c.resize.axis&&l.x>a.right-u,g="x"!==c.resize.axis&&l.y>a.bottom-u;if(v||g)return{name:"resize",axes:(v?"x":"")+(g?"y":"")}}}return null},cursors:s.isIe9OrOlder?{x:"e-resize",y:"s-resize",xy:"se-resize",top:"n-resize",left:"w-resize",bottom:"s-resize",right:"e-resize",topleft:"se-resize",bottomright:"se-resize",topright:"ne-resize",bottomleft:"ne-resize"}:{x:"ew-resize",y:"ns-resize",xy:"nwse-resize",top:"ns-resize",left:"ew-resize",bottom:"ns-resize",right:"ew-resize",topleft:"nwse-resize",bottomright:"nwse-resize",topright:"nesw-resize",bottomleft:"nesw-resize"},getCursor:function(e){if(e.axis)return d.cursors[e.name+e.axis];if(e.edges){for(var t="",n=["top","bottom","left","right"],r=0;r<4;r++)e.edges[n[r]]&&(t+=n[r]);return d.cursors[t]}}};a.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;if("resizestart"===t.type&&n.prepared.edges){var r=n.target.getRect(n.element),i=n.target.options.resize;if(i.square||i.preserveAspectRatio){var s=o.extend({},n.prepared.edges);s.top=s.top||s.left&&!s.bottom,s.left=s.left||s.top&&!s.right,s.bottom=s.bottom||s.right&&!s.top,s.right=s.right||s.bottom&&!s.left,n.prepared._linkedEdges=s}else n.prepared._linkedEdges=null;i.preserveAspectRatio&&(n.resizeStartAspectRatio=r.width/r.height),n.resizeRects={start:r,current:o.extend({},r),inverted:o.extend({},r),previous:o.extend({},r),delta:{left:0,right:0,width:0,top:0,bottom:0,height:0}},t.rect=n.resizeRects.inverted,t.deltaRect=n.resizeRects.delta}}),a.signals.on("new",function(e){var t=e.iEvent,n=e.phase,r=e.interaction;if("move"===n&&r.prepared.edges){var i=r.target.options.resize,s=i.invert,a="reposition"===s||"negate"===s,l=r.prepared.edges,c=r.resizeRects.start,p=r.resizeRects.current,u=r.resizeRects.inverted,d=r.resizeRects.delta,f=o.extend(r.resizeRects.previous,u),v=l,g=t.dx,h=t.dy;if(i.preserveAspectRatio||i.square){var m=i.preserveAspectRatio?r.resizeStartAspectRatio:1;l=r.prepared._linkedEdges,v.left&&v.bottom||v.right&&v.top?h=-g/m:v.left||v.right?h=g/m:(v.top||v.bottom)&&(g=h*m)}if(l.top&&(p.top+=h),l.bottom&&(p.bottom+=h),l.left&&(p.left+=g),l.right&&(p.right+=g),a){if(o.extend(u,p),"reposition"===s){var y=void 0;u.top>u.bottom&&(y=u.top,u.top=u.bottom,u.bottom=y),u.left>u.right&&(y=u.left,u.left=u.right,u.right=y)}}else u.top=Math.min(p.top,c.bottom),u.bottom=Math.max(p.bottom,c.top),u.left=Math.min(p.left,c.right),u.right=Math.max(p.right,c.left);u.width=u.right-u.left,u.height=u.bottom-u.top;for(var x in u)d[x]=u[x]-f[x];t.edges=r.prepared.edges,t.rect=u,t.deltaRect=d}}),l.prototype.resizable=function(e){return o.is.object(e)?(this.options.resize.enabled=!1!==e.enabled,this.setPerAction("resize",e),this.setOnEvents("resize",e),/^x$|^y$|^xy$/.test(e.axis)?this.options.resize.axis=e.axis:null===e.axis&&(this.options.resize.axis=p.resize.axis),o.is.bool(e.preserveAspectRatio)?this.options.resize.preserveAspectRatio=e.preserveAspectRatio:o.is.bool(e.square)&&(this.options.resize.square=e.square),this):o.is.bool(e)?(this.options.resize.enabled=e, +e||(this.onresizestart=this.onresizestart=this.onresizeend=null),this):this.options.resize},c.signals.on("new",function(e){e.resizeAxes="xy"}),a.signals.on("set-delta",function(e){var t=e.interaction,n=e.iEvent;"resize"===e.action&&t.resizeAxes&&(t.target.options.resize.square?("y"===t.resizeAxes?n.dx=n.dy:n.dy=n.dx,n.axes="xy"):(n.axes=t.resizeAxes,"x"===t.resizeAxes?n.dy=0:"y"===t.resizeAxes&&(n.dx=0)))}),i.resize=d,i.names.push("resize"),o.merge(l.eventTypes,["resizestart","resizemove","resizeinertiastart","resizeinertiaresume","resizeend"]),i.methodDict.resize="resizable",p.resize=d.defaults,t.exports=d},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"../utils/browser":37,"./base":6}],11:[function(e,t,n){"use strict";var r=e("./utils/raf"),i=e("./utils/window").getWindow,o=e("./utils/is"),s=e("./utils/domUtils"),a=e("./Interaction"),l=e("./defaultOptions"),c={defaults:{enabled:!1,container:null,margin:60,speed:300},interaction:null,i:null,x:0,y:0,isScrolling:!1,prevTime:0,start:function(e){c.isScrolling=!0,r.cancel(c.i),c.interaction=e,c.prevTime=(new Date).getTime(),c.i=r.request(c.scroll)},stop:function(){c.isScrolling=!1,r.cancel(c.i)},scroll:function(){var e=c.interaction.target.options[c.interaction.prepared.name].autoScroll,t=e.container||i(c.interaction.element),n=(new Date).getTime(),s=(n-c.prevTime)/1e3,a=e.speed*s;a>=1&&(o.window(t)?t.scrollBy(c.x*a,c.y*a):t&&(t.scrollLeft+=c.x*a,t.scrollTop+=c.y*a),c.prevTime=n),c.isScrolling&&(r.cancel(c.i),c.i=r.request(c.scroll))},check:function(e,t){var n=e.options;return n[t].autoScroll&&n[t].autoScroll.enabled},onInteractionMove:function(e){var t=e.interaction,n=e.pointer;if(t.interacting()&&c.check(t.target,t.prepared.name)){if(t.simulation)return void(c.x=c.y=0);var r=void 0,a=void 0,l=void 0,p=void 0,u=t.target.options[t.prepared.name].autoScroll,d=u.container||i(t.element);if(o.window(d))p=n.clientXd.innerWidth-c.margin,l=n.clientY>d.innerHeight-c.margin;else{var f=s.getElementClientRect(d);p=n.clientXf.right-c.margin,l=n.clientY>f.bottom-c.margin}c.x=a?1:p?-1:0,c.y=l?1:r?-1:0,c.isScrolling||(c.margin=u.margin,c.speed=u.speed,c.start(t))}}};a.signals.on("stop-active",function(){c.stop()}),a.signals.on("action-move",c.onInteractionMove),l.perAction.autoScroll=c.defaults,t.exports=c},{"./Interaction":5,"./defaultOptions":18,"./utils/domUtils":39,"./utils/is":46,"./utils/raf":50,"./utils/window":52}],12:[function(e,t,n){"use strict";var r=e("../Interactable"),i=e("../actions/base"),o=e("../utils/is"),s=e("../utils/domUtils");r.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},r.prototype.ignoreFrom=function(e){return this._backCompatOption("ignoreFrom",e)},r.prototype.allowFrom=function(e){return this._backCompatOption("allowFrom",e)},r.prototype.testIgnore=function(e,t,n){return!(!e||!o.element(n))&&(o.string(e)?s.matchesUpTo(n,e,t):!!o.element(e)&&s.nodeContains(e,n))},r.prototype.testAllow=function(e,t,n){return!e||!!o.element(n)&&(o.string(e)?s.matchesUpTo(n,e,t):!!o.element(e)&&s.nodeContains(e,n))},r.prototype.testIgnoreAllow=function(e,t,n){return!this.testIgnore(e.ignoreFrom,t,n)&&this.testAllow(e.allowFrom,t,n)},r.prototype.actionChecker=function(e){return o.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},r.prototype.styleCursor=function(e){return o.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},r.prototype.defaultActionChecker=function(e,t,n,r){for(var o=this.getRect(r),s=null,a=i.names,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var u=p;if((!n.pointerIsDown||!n.mouse||0!=(t.buttons&this.options[u].mouseButtons))&&(s=i[u].checker(e,t,this,r,n,o)))return s}}},{"../Interactable":4,"../actions/base":6,"../utils/domUtils":39,"../utils/is":46}],13:[function(e,t,n){"use strict";function r(e,t,n,r){return g.is.object(e)&&t.testIgnoreAllow(t.options[e.name],n,r)&&t.options[e.name].enabled&&a(t,n,e)?e:null}function i(e,t,n,i,o,s){for(var a=0,l=i.length;a=m.maxInteractions)return!1;if(u.target===e){if((a+=d===n.name|0)>=i)return!1;if(u.element===t&&(l++,d!==n.name||l>=o))return!1}}}return m.maxInteractions>0}}var l=e("../interact"),c=e("../Interactable"),p=e("../Interaction"),u=e("../actions/base"),d=e("../defaultOptions"),f=e("../utils/browser"),v=e("../scope"),g=e("../utils"),h=e("../utils/Signals").new();e("./InteractableMethods");var m={signals:h,withinInteractionLimit:a,maxInteractions:1/0,defaults:{perAction:{manualStart:!1,max:1/0,maxPerElement:1,allowFrom:null,ignoreFrom:null}},setActionDefaults:function(e){g.extend(e.defaults,m.defaults.perAction)}};p.signals.on("down",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;if(!t.interacting()){s(t,o(t,n,r,i))}}),p.signals.on("move",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;if(t.mouse&&!t.pointerIsDown&&!t.interacting()){s(t,o(t,n,r,i))}}),p.signals.on("move",function(e){var t=e.interaction,n=e.event;if(t.pointerIsDown&&!t.interacting()&&t.pointerWasMoved&&t.prepared.name){h.fire("before-start",e);var r=t.target;t.prepared.name&&r&&(r.options[t.prepared.name].manualStart||!a(r,t.element,t.prepared)?t.stop(n):t.start(t.prepared,r,t.element))}}),p.signals.on("stop",function(e){var t=e.interaction,n=t.target;n&&n.options.styleCursor&&(n._doc.documentElement.style.cursor="")}),c.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},c.prototype.actionChecker=function(e){return g.is.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},c.prototype.styleCursor=function(e){return g.is.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},c.prototype.defaultActionChecker=function(e,t,n,r){for(var i=this.getRect(r),o=t.buttons||{0:1,1:4,3:8,4:16}[t.button],s=null,a=u.names,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var d=p;if((!n.pointerIsDown||!n.mouse||0!=(o&this.options[d].mouseButtons))&&(s=u[d].checker(e,t,this,r,n,i)))return s}},l.maxInteractions=function(e){return g.is.number(e)?(m.maxInteractions=e,this):m.maxInteractions},c.settingsMethods.push("styleCursor"),c.settingsMethods.push("actionChecker"),c.settingsMethods.push("ignoreFrom"),c.settingsMethods.push("allowFrom"),d.base.actionChecker=null,d.base.styleCursor=!0,g.extend(d.perAction,m.defaults.perAction),t.exports=m},{"../Interactable":4,"../Interaction":5,"../actions/base":6,"../defaultOptions":18,"../interact":21,"../scope":34,"../utils":44,"../utils/Signals":35,"../utils/browser":37,"./InteractableMethods":12}],14:[function(e,t,n){"use strict";var r=e("./base"),i=e("../Interaction");i.signals.on("new",function(e){e.delayTimer=null}),r.signals.on("prepared",function(e){var t=e.interaction,n=t.prepared.name;if(n){var r=t.target.options[n].delay;r>0&&(t.delayTimer=setTimeout(function(){t.start(t.prepared,t.target,t.element)},r))}}),i.signals.on("move",function(e){var t=e.interaction,n=e.duplicate;t.pointerWasMoved&&!n&&clearTimeout(t.delayTimer)}),r.signals.on("before-start",function(e){var t=e.interaction,n=t.prepared.name;if(n){t.target.options[n].delay>0&&(t.prepared.name=null)}})},{"../Interaction":5,"./base":13}],15:[function(e,t,n){"use strict";function r(e,t){if(!t)return!1;var n=t.options.drag.startAxis;return"xy"===e||"xy"===n||n===e}var i=e("./base"),o=e("../scope"),s=e("../utils/browser"),a=e("../utils/is"),l=e("../utils/domUtils"),c=l.matchesSelector,p=l.parentNode;i.setActionDefaults(e("../actions/drag")),i.signals.on("before-start",function(e){var t=e.interaction,n=e.eventTarget,l=e.dx,u=e.dy;if("drag"===t.prepared.name){var d=Math.abs(l),f=Math.abs(u),v=t.target.options.drag,g=v.startAxis,h=d>f?"x":dl.minSpeed&&g>l.endSpeed,b={interaction:t,pageCoords:v,statuses:f,preEnd:!0,requireEndOnly:!0};y&&!x&&(c.resetStatuses(f),m=c.setAll(b),m.shouldMove&&m.locked&&(h=!0)),(x||h)&&(p.copyCoords(i.upCoords,t.curCoords),t.pointers[0]=i.startEvent=new a(t,n,t.prepared.name,"inertiastart",t.element),i.t0=d,i.active=!0,i.allowResume=l.allowResume,t.simulation=i,o.fire(i.startEvent),x?(i.vx0=t.pointerDelta.client.vx,i.vy0=t.pointerDelta.client.vy,i.v0=g,r(t,i),p.extend(v,t.curCoords.page),v.x+=i.xe,v.y+=i.ye,c.resetStatuses(f),m=c.setAll(b),i.modifiedXe+=m.dx,i.modifiedYe+=m.dy,i.i=u.request(t.boundInertiaFrame)):(i.smoothEnd=!0,i.xe=m.dx,i.ye=m.dy,i.sx=i.sy=0,i.i=u.request(t.boundSmoothEndFrame)))}}),l.signals.on("stop-active",function(e){var t=e.interaction,n=t.inertiaStatus;n.active&&(u.cancel(n.i),n.active=!1,t.simulation=null)})},{"./InteractEvent":3,"./Interaction":5,"./modifiers":24,"./utils":44,"./utils/raf":50}],21:[function(e,t,n){"use strict";function r(e,t){var n=a.interactables.get(e,t);return n||(n=new l(e,t),n.events.global=p),n}var i=e("./utils/browser"),o=e("./utils/events"),s=e("./utils"),a=e("./scope"),l=e("./Interactable"),c=e("./Interaction"),p={};r.isSet=function(e,t){return-1!==a.interactables.indexOfElement(e,t&&t.context)},r.on=function(e,t,n){if(s.is.string(e)&&-1!==e.search(" ")&&(e=e.trim().split(/ +/)),s.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.on(f,t,n)}return r}if(s.is.object(e)){for(var v in e)r.on(v,e[v],t);return r}return s.contains(l.eventTypes,e)?p[e]?p[e].push(t):p[e]=[t]:o.add(a.document,e,t,{options:n}),r},r.off=function(e,t,n){if(s.is.string(e)&&-1!==e.search(" ")&&(e=e.trim().split(/ +/)),s.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.off(f,t,n)}return r}if(s.is.object(e)){for(var v in e)r.off(v,e[v],t);return r}if(s.contains(l.eventTypes,e)){var g=void 0;e in p&&-1!==(g=s.indexOf(p[e],t))&&p[e].splice(g,1)}else o.remove(a.document,e,t,n);return r},r.debug=function(){return a},r.getPointerAverage=s.pointerAverage,r.getTouchBBox=s.touchBBox,r.getTouchDistance=s.touchDistance,r.getTouchAngle=s.touchAngle,r.getElementRect=s.getElementRect,r.getElementClientRect=s.getElementClientRect,r.matchesSelector=s.matchesSelector,r.closest=s.closest,r.supportsTouch=function(){return i.supportsTouch},r.supportsPointerEvent=function(){return i.supportsPointerEvent},r.stop=function(e){for(var t=a.interactions.length-1;t>=0;t--)a.interactions[t].stop(e);return r},r.pointerMoveTolerance=function(e){return s.is.number(e)?(c.pointerMoveTolerance=e,this):c.pointerMoveTolerance},r.addDocument=a.addDocument,r.removeDocument=a.removeDocument,a.interact=r,t.exports=r},{"./Interactable":4,"./Interaction":5,"./scope":34,"./utils":44,"./utils/browser":37,"./utils/events":40}],22:[function(e,t,n){"use strict";function r(e){var t=e.interaction,n=e.event;t.target&&t.target.checkAndPreventDefault(n)}var i=e("./Interactable"),o=e("./Interaction"),s=e("./scope"),a=e("./utils/is"),l=e("./utils/events"),c=e("./utils/domUtils"),p=c.nodeContains,u=c.matchesSelector;i.prototype.preventDefault=function(e){return/^(always|never|auto)$/.test(e)?(this.options.preventDefault=e,this):a.bool(e)?(this.options.preventDefault=e?"always":"never",this):this.options.preventDefault},i.prototype.checkAndPreventDefault=function(e){var t=this.options.preventDefault;if("never"!==t)return"always"===t?void e.preventDefault():void(l.supportsOptions||/^(mouse|pointer|touch)*(down|start)/i.test(e.type)||a.element(e.target)&&u(e.target,"input,select,textarea,[contenteditable=true],[contenteditable=true] *")||e.preventDefault())};for(var d=["down","move","up","cancel"],f=0;f=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i;if(o.element&&(o.element===e.target||p(o.element,e.target)))return void o.target.checkAndPreventDefault(e)}}},{"./Interactable":4,"./Interaction":5,"./scope":34,"./utils/domUtils":39,"./utils/events":40,"./utils/is":46}],23:[function(e,t,n){"use strict";function r(e){var t=e.target,n=a.search(e,e.type,t);n&&n.prevTap&&e.clientX===n.prevTap.clientX&&e.clientY===n.prevTap.clientY&&t===n.prevTap.target&&(n.downTargets[0]=t,n.downTimes[0]=(new Date).getTime(),l.fire({interaction:n,event:e,eventTarget:t,pointer:e,type:"tap"}))}var i=e("./scope"),o=e("./utils/events"),s=e("./utils/browser"),a=e("./utils/interactionFinder"),l=e("./pointerEvents/base"),c=e("./utils/window"),p=c.window,u=Object.prototype.toString;if(p.Array.isArray||(p.Array.isArray=function(e){return"[object Array]"===u.call(e)}),String.prototype.trim||(String.prototype.trim=function(){return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")}),s.isIE8){var d=function(e){for(var t=i.interactions,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var o;if(n){if(r>=t.length)break;o=t[r++]}else{if(r=t.next(),r.done)break;o=r.value}var s=o;s.interacting()&&s.target.checkAndPreventDefault(e)}},f=function(e,t){var n=e.doc,i=(e.win,0===t.indexOf("listen")?o.add:o.remove);i(n,"selectstart",d),l&&i(n,"dblclick",r)};i.signals.on("add-document",f),i.signals.on("remove-document",f)}t.exports=null},{"./pointerEvents/base":31,"./scope":34,"./utils/browser":37,"./utils/events":40,"./utils/interactionFinder":45,"./utils/window":52}],24:[function(e,t,n){"use strict";function r(e,t,n){return e&&e.enabled&&(t||!e.endOnly)&&(!n||e.endOnly)}var i=e("../InteractEvent"),o=e("../Interaction"),s=e("../utils/extend"),a={names:[],setOffsets:function(e){var t=e.interaction,n=e.pageCoords,r=t.target,i=t.element,o=t.startOffset,s=r.getRect(i);s?(o.left=n.x-s.left,o.top=n.y-s.top,o.right=s.right-n.x,o.bottom=s.bottom-n.y,"width"in s||(s.width=s.right-s.left),"height"in s||(s.height=s.bottom-s.top)):o.left=o.top=o.right=o.bottom=0,e.rect=s,e.interactable=r,e.element=i;for(var l=0;l=p.length)break;f=p[d++]}else{if(d=p.next(),d.done)break;f=d.value}var v=f,g=a[v],h=t.target.options[t.prepared.name][v];r(h,i,o)&&(e.status=e.status=n[v],e.options=h,e.offset=e.interaction.modifierOffsets[v],g.set(e),e.status.locked&&(l.x+=e.status.dx,l.y+=e.status.dy,c.dx+=e.status.dx,c.dy+=e.status.dy,c.locked=!0))}return c.shouldMove=!e.status||!c.locked||e.status.changed,c},resetStatuses:function(e){for(var t=a.names,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var i;if(n){if(r>=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i,s=e[o]||{};s.dx=s.dy=0,s.modifiedX=s.modifiedY=NaN,s.locked=!1,s.changed=!0,e[o]=s}return e},start:function(e,t){var n=e.interaction,r={interaction:n,pageCoords:("action-resume"===t?n.curCoords:n.startCoords).page,startOffset:n.startOffset,statuses:n.modifierStatuses,preEnd:!1,requireEndOnly:!1};a.setOffsets(r),a.resetStatuses(r.statuses),r.pageCoords=s({},n.startCoords.page),n.modifierResult=a.setAll(r)}};o.signals.on("new",function(e){e.startOffset={left:0,right:0,top:0,bottom:0},e.modifierOffsets={},e.modifierStatuses=a.resetStatuses({}),e.modifierResult=null}),o.signals.on("action-start",a.start),o.signals.on("action-resume",a.start),o.signals.on("before-action-move",function(e){var t=e.interaction,n=e.preEnd,r=e.interactingBeforeMove,i=a.setAll({interaction:t,preEnd:n,pageCoords:t.curCoords.page,statuses:t.modifierStatuses,requireEndOnly:!1});!i.shouldMove&&r&&(t._dontFireMove=!0),t.modifierResult=i}),o.signals.on("action-end",function(e){for(var t=e.interaction,n=e.event,i=0;i=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}var m=h,y=m.x,x=m.y;l.push({x:s.left-i.width*y+u.x,y:s.top-i.height*x+u.y})}else l.push(u);return l},set:function(e){var t=e.interaction,n=e.pageCoords,r=e.status,i=e.options,s=e.offset,a=[],l=void 0,c=void 0,p=void 0;if(r.useStatusXY)c={x:r.x,y:r.y};else{var u=o.getOriginXY(t.target,t.element,t.prepared.name);c=o.extend({},n),c.x-=u.x,c.y-=u.y}r.realX=c.x,r.realY=c.y;for(var d=i.targets?i.targets.length:0,f=s,v=Array.isArray(f),g=0,f=v?f:f[Symbol.iterator]();;){var h;if(v){if(g>=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}for(var m=h,y=m.x,x=m.y,b=c.x-y,w=c.y-x,E=i.targets,S=Array.isArray(E),T=0,E=S?E:E[Symbol.iterator]();;){var C;if(S){if(T>=E.length)break;C=E[T++]}else{if(T=E.next(),T.done)break;C=T.value}var A=C;l=o.is.function(A)?A(b,w,t):A,l&&a.push({x:o.is.number(l.x)?l.x+y:b,y:o.is.number(l.y)?l.y+x:w,range:o.is.number(l.range)?l.range:i.range})}}var D={target:null,inRange:!1,distance:0,range:0,dx:0,dy:0};for(p=0,d=a.length;p=p.length)break;f=p[d++]}else{if(d=p.next(),d.done)break;f=d.value}var v=f,g=void 0;g=a.is.function(v)?v(l,c,t):v,g&&("width"in g&&"height"in g&&(g.x=g.width, +g.y=g.height),e.options.targets.push(g))}i.set(e)},modifyCoords:function(e){var t=e.options;e.options=a.extend({},t),e.options.enabled=t.enabled,e.options.relativePoints=[null],i.modifyCoords(e)}};r.snapSize=l,r.names.push("snapSize"),o.perAction.snapSize=l.defaults,s.defaults.snapSize=l.defaults,t.exports=l},{"../actions/resize":10,"../defaultOptions":18,"../utils/":44,"./index":24,"./snap":28}],30:[function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=e("../utils/pointerUtils");t.exports=function(){function e(t,n,o,s,a){if(r(this,e),i.pointerExtend(this,o),o!==n&&i.pointerExtend(this,n),this.interaction=a,this.timeStamp=(new Date).getTime(),this.originalEvent=o,this.type=t,this.pointerId=i.getPointerId(n),this.pointerType=i.getPointerType(n),this.target=s,this.currentTarget=null,"tap"===t){var l=a.getPointerIndex(n);this.dt=this.timeStamp-a.downTimes[l];var c=this.timeStamp-a.tapTime;this.double=!!(a.prevTap&&"doubletap"!==a.prevTap.type&&a.prevTap.target===this.target&&c<500)}else"doubletap"===t&&(this.dt=n.timeStamp-a.tapTime)}return e.prototype.subtractOrigin=function(e){var t=e.x,n=e.y;return this.pageX-=t,this.pageY-=n,this.clientX-=t,this.clientY-=n,this},e.prototype.addOrigin=function(e){var t=e.x,n=e.y;return this.pageX+=t,this.pageY+=n,this.clientX+=t,this.clientY+=n,this},e.prototype.preventDefault=function(){this.originalEvent.preventDefault()},e.prototype.stopPropagation=function(){this.propagationStopped=!0},e.prototype.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},e}()},{"../utils/pointerUtils":49}],31:[function(e,t,n){"use strict";function r(e){for(var t=e.interaction,n=e.pointer,s=e.event,l=e.eventTarget,c=e.type,u=void 0===c?e.pointerEvent.type:c,d=e.targets,f=void 0===d?i(e):d,v=e.pointerEvent,g=void 0===v?new o(u,n,s,l,t):v,h={interaction:t,pointer:n,event:s,eventTarget:l,targets:f,type:u,pointerEvent:g},m=0;m=u.length)break;g=u[v++]}else{if(v=u.next(),v.done)break;g=v.value}var h=g;c.element=h,p.fire("collect-targets",c)}return"hold"===o&&(c.targets=d(c.targets,function(e){return e.eventable.options.holdDuration===t.holdTimers[s].duration})),c.targets}var o=e("./PointerEvent"),s=e("../Interaction"),a=e("../utils"),l=e("../utils/browser"),c=e("../defaultOptions"),p=e("../utils/Signals").new(),u=e("../utils/arr"),d=u.filter,f=["down","up","cancel"],v=["down","up","cancel"],g={PointerEvent:o,fire:r,collectEventTargets:i,signals:p,defaults:{holdDuration:600,ignoreFrom:null,allowFrom:null,origin:{x:0,y:0}},types:["down","move","up","cancel","tap","doubletap","hold"]};s.signals.on("update-pointer-down",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers[n]={duration:1/0,timeout:null}}),s.signals.on("remove-pointer",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers.splice(n,1)}),s.signals.on("move",function(e){var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,s=e.duplicateMove,a=t.getPointerIndex(n);s||t.pointerIsDown&&!t.pointerWasMoved||(t.pointerIsDown&&clearTimeout(t.holdTimers[a].timeout),r({interaction:t,pointer:n,event:i,eventTarget:o,type:"move"}))}),s.signals.on("down",function(e){for(var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,s=e.pointerIndex,c=l.isIE8?a.extend({},i):i,u=t.holdTimers[s],d=a.getPath(o),f={interaction:t,pointer:n,event:i,eventTarget:o,type:"hold",targets:[],path:d,element:null},v=d,g=Array.isArray(v),h=0,v=g?v:v[Symbol.iterator]();;){var m;if(g){if(h>=v.length)break;m=v[h++]}else{if(h=v.next(),h.done)break;m=h.value}var y=m;f.element=y,p.fire("collect-targets",f)}if(f.targets.length){for(var x=1/0,b=0;b=0&&(p.selectors[u]!==e||p.contexts[u]!==t);u--);-1===u&&(u=p.selectors.length,p.selectors.push(e),p.contexts.push(t),p.listeners.push([])),p.listeners[u].push([i,!!s.capture,s.passive])}function s(e,t,n,r,o){var s=f(o),c=O[n],p=!1,u=void 0;if(c)for(u=c.selectors.length-1;u>=0;u--)if(c.selectors[u]===e&&c.contexts[u]===t){for(var d=c.listeners[u],v=d.length-1;v>=0;v--){var g=d[v],h=g[0],m=g[1],y=g[2];if(h===r&&m===!!s.capture&&y===s.passive){d.splice(v,1),d.length||(c.selectors.splice(u,1),c.contexts.splice(u,1),c.listeners.splice(u,1),i(t,n,a),i(t,n,l,!0),c.selectors.length||(O[n]=null)),p=!0;break}}if(p)break}}function a(e,t){var n=f(t),r={},i=O[e.type],o=g.getActualElement(e.path?e.path[0]:e.target),s=o;for(h(r,e),r.originalEvent=e,r.preventDefault=p;v.element(s);){for(var a=0;a=l.length)break;u=l[p++]}else{if(p=l.next(),p.done)break;u=p.value}var d=u,f=o[d](a);if(f)return f}},simulationResume:function(e){var t=e.pointerType,n=e.eventType,o=e.eventTarget;if(!/down|start/i.test(n))return null;for(var s=r.interactions,a=Array.isArray(s),l=0,s=a?s:s[Symbol.iterator]();;){var c;if(a){if(l>=s.length)break;c=s[l++]}else{if(l=s.next(),l.done)break;c=l.value}var p=c,u=o;if(p.simulation&&p.simulation.allowResume&&p.pointerType===t)for(;u;){if(u===p.element)return p;u=i.parentNode(u)}}return null},mouseOrPen:function(e){var t=e.pointerId,n=e.pointerType,o=e.eventType;if("mouse"!==n&&"pen"!==n)return null;for(var s=void 0,a=r.interactions,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var u=p;if(u.pointerType===n){if(u.simulation&&!i.contains(u.pointerIds,t))continue;if(u.interacting())return u;s||(s=u)}}if(s)return s;for(var d=r.interactions,f=Array.isArray(d),v=0,d=f?d:d[Symbol.iterator]();;){var g;if(f){if(v>=d.length)break;g=d[v++]}else{if(v=d.next(),v.done)break;g=v.value}var h=g;if(!(h.pointerType!==n||/down/i.test(o)&&h.simulation))return h}return null},hasPointer:function(e){for(var t=e.pointerId,n=r.interactions,o=Array.isArray(n),s=0,n=o?n:n[Symbol.iterator]();;){var a;if(o){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var l=a;if(i.contains(l.pointerIds,t))return l}},idle:function(e){for(var t=e.pointerType,n=r.interactions,i=Array.isArray(n),o=0,n=i?n:n[Symbol.iterator]();;){var s;if(i){if(o>=n.length)break;s=n[o++]}else{if(o=n.next(),o.done)break;s=o.value}var a=s;if(1===a.pointerIds.length){var l=a.target;if(l&&!l.options.gesture.enabled)continue}else if(a.pointerIds.length>=2)continue;if(!a.interacting()&&t===a.pointerType)return a}return null}};t.exports=o},{"../scope":34,"./index":44}],46:[function(e,t,n){"use strict";var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},i=e("./window"),o=e("./isWindow"),s={array:function(){},window:function(e){return e===i.window||o(e)},docFrag:function(e){return s.object(e)&&11===e.nodeType},object:function(e){return!!e&&"object"===(void 0===e?"undefined":r(e))},function:function(e){return"function"==typeof e},number:function(e){return"number"==typeof e},bool:function(e){return"boolean"==typeof e},string:function(e){return"string"==typeof e},element:function(e){if(!e||"object"!==(void 0===e?"undefined":r(e)))return!1;var t=i.getWindow(e)||i.window;return/object|function/.test(r(t.Element))?e instanceof t.Element:1===e.nodeType&&"string"==typeof e.nodeName}};s.array=function(e){return s.object(e)&&void 0!==e.length&&s.function(e.splice)},t.exports=s},{"./isWindow":47,"./window":52}],47:[function(e,t,n){"use strict";t.exports=function(e){return!(!e||!e.Window)&&e instanceof e.Window}},{}],48:[function(e,t,n){"use strict";function r(e,n){for(var r in n){var i=t.exports.prefixedPropREs,o=!1;for(var s in i)if(0===r.indexOf(s)&&i[s].test(r)){o=!0;break}o||"function"==typeof n[r]||(e[r]=n[r])}return e}r.prefixedPropREs={webkit:/(Movement[XY]|Radius[XY]|RotationAngle|Force)$/},t.exports=r},{}],49:[function(e,t,n){"use strict";var r=e("./hypot"),i=e("./browser"),o=e("./domObjects"),s=e("./domUtils"),a=e("./domObjects"),l=e("./is"),c=e("./pointerExtend"),p={copyCoords:function(e,t){e.page=e.page||{},e.page.x=t.page.x,e.page.y=t.page.y,e.client=e.client||{},e.client.x=t.client.x,e.client.y=t.client.y,e.timeStamp=t.timeStamp},setCoordDeltas:function(e,t,n){e.page.x=n.page.x-t.page.x,e.page.y=n.page.y-t.page.y,e.client.x=n.client.x-t.client.x,e.client.y=n.client.y-t.client.y,e.timeStamp=n.timeStamp-t.timeStamp;var i=Math.max(e.timeStamp/1e3,.001);e.page.speed=r(e.page.x,e.page.y)/i,e.page.vx=e.page.x/i,e.page.vy=e.page.y/i,e.client.speed=r(e.client.x,e.page.y)/i,e.client.vx=e.client.x/i,e.client.vy=e.client.y/i},isNativePointer:function(e){return e instanceof o.Event||e instanceof o.Touch},getXY:function(e,t,n){return n=n||{},e=e||"page",n.x=t[e+"X"],n.y=t[e+"Y"],n},getPageXY:function(e,t){return t=t||{},i.isOperaMobile&&p.isNativePointer(e)?(p.getXY("screen",e,t),t.x+=window.scrollX,t.y+=window.scrollY):p.getXY("page",e,t),t},getClientXY:function(e,t){return t=t||{},i.isOperaMobile&&p.isNativePointer(e)?p.getXY("screen",e,t):p.getXY("client",e,t),t},getPointerId:function(e){return l.number(e.pointerId)?e.pointerId:e.identifier},setCoords:function(e,t,n){var r=t.length>1?p.pointerAverage(t):t[0],i={};p.getPageXY(r,i),e.page.x=i.x,e.page.y=i.y,p.getClientXY(r,i),e.client.x=i.x,e.client.y=i.y,e.timeStamp=l.number(n)?n:(new Date).getTime()},pointerExtend:c,getTouchPair:function(e){var t=[];return l.array(e)?(t[0]=e[0],t[1]=e[1]):"touchend"===e.type?1===e.touches.length?(t[0]=e.touches[0],t[1]=e.changedTouches[0]):0===e.touches.length&&(t[0]=e.changedTouches[0],t[1]=e.changedTouches[1]):(t[0]=e.touches[0],t[1]=e.touches[1]),t},pointerAverage:function(e){for(var t={pageX:0,pageY:0,clientX:0,clientY:0,screenX:0,screenY:0},n=e,r=Array.isArray(n),i=0,n=r?n:n[Symbol.iterator]();;){var o;if(r){if(i>=n.length)break;o=n[i++]}else{if(i=n.next(),i.done)break;o=i.value}var s=o;for(var a in t)t[a]+=s[a]}for(var l in t)t[l]/=e.length;return t},touchBBox:function(e){if(e.length||e.touches&&e.touches.length>1){var t=p.getTouchPair(e),n=Math.min(t[0].pageX,t[1].pageX),r=Math.min(t[0].pageY,t[1].pageY);return{x:n,y:r,left:n,top:r,width:Math.max(t[0].pageX,t[1].pageX)-n,height:Math.max(t[0].pageY,t[1].pageY)-r}}},touchDistance:function(e,t){var n=t+"X",i=t+"Y",o=p.getTouchPair(e),s=o[0][n]-o[1][n],a=o[0][i]-o[1][i];return r(s,a)},touchAngle:function(e,t,n){var r=n+"X",i=n+"Y",o=p.getTouchPair(e),s=o[1][r]-o[0][r],a=o[1][i]-o[0][i];return 180*Math.atan2(a,s)/Math.PI},getPointerType:function(e){return l.string(e.pointerType)?e.pointerType:l.number(e.pointerType)?[void 0,void 0,"touch","pen","mouse"][e.pointerType]:/touch/.test(e.type)||e instanceof a.Touch?"touch":"mouse"},getEventTargets:function(e){return[s.getActualElement(e.path?e.path[0]:e.target),s.getActualElement(e.currentTarget)]}};t.exports=p},{"./browser":37,"./domObjects":38,"./domUtils":39,"./hypot":43,"./is":46,"./pointerExtend":48}],50:[function(e,t,n){"use strict";for(var r=e("./window"),i=r.window,o=["ms","moz","webkit","o"],s=0,a=void 0,l=void 0,c=0;c\n * Open source under the MIT License.\n * https://raw.github.com/taye/interact.js/master/LICENSE\n */\n","/*\n * In a (windowless) server environment this file exports a factory function\n * that takes the window to use.\n *\n * var interact = require('interact.js')(windowObject);\n *\n * See https://github.com/taye/interact.js/issues/187\n */\nif (typeof window === 'undefined') {\n module.exports = function (window) {\n require('./src/utils/window').init(window);\n\n return require('./src/index');\n };\n}\nelse {\n module.exports = require('./src/index');\n}\n","const { indexOf } = require('./utils/arr');\nconst extend = require('./utils/extend.js');\n\nfunction fireUntilImmediateStopped (event, listeners) {\n for (let i = 0, len = listeners.length; i < len && !event.immediatePropagationStopped; i++) {\n listeners[i](event);\n }\n}\n\nclass Eventable {\n\n constructor (options) {\n this.options = extend({}, options || {});\n }\n\n fire (event) {\n let listeners;\n const onEvent = 'on' + event.type;\n const global = this.global;\n\n // Interactable#on() listeners\n if ((listeners = this[event.type])) {\n fireUntilImmediateStopped(event, listeners);\n }\n\n // interactable.onevent listener\n if (this[onEvent]) {\n this[onEvent](event);\n }\n\n // interact.on() listeners\n if (!event.propagationStopped && global && (listeners = global[event.type])) {\n fireUntilImmediateStopped(event, listeners);\n }\n }\n\n on (eventType, listener) {\n // if this type of event was never bound\n if (this[eventType]) {\n this[eventType].push(listener);\n }\n else {\n this[eventType] = [listener];\n }\n }\n\n off (eventType, listener) {\n // if it is an action event type\n const eventList = this[eventType];\n const index = eventList? indexOf(eventList, listener) : -1;\n\n if (index !== -1) {\n eventList.splice(index, 1);\n }\n\n if (eventList && eventList.length === 0 || !listener) {\n this[eventType] = listener;\n }\n }\n}\n\nmodule.exports = Eventable;\n","const extend = require('./utils/extend');\nconst getOriginXY = require('./utils/getOriginXY');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nclass InteractEvent {\n constructor (interaction, event, action, phase, element, related, preEnd = false) {\n const target = interaction.target;\n const deltaSource = (target && target.options || defaults).deltaSource;\n const origin = getOriginXY(target, element, action);\n const starting = phase === 'start';\n const ending = phase === 'end';\n const coords = starting? interaction.startCoords : interaction.curCoords;\n const prevEvent = interaction.prevEvent;\n\n element = element || interaction.element;\n\n const page = extend({}, coords.page);\n const client = extend({}, coords.client);\n\n page.x -= origin.x;\n page.y -= origin.y;\n\n client.x -= origin.x;\n client.y -= origin.y;\n\n this.ctrlKey = event.ctrlKey;\n this.altKey = event.altKey;\n this.shiftKey = event.shiftKey;\n this.metaKey = event.metaKey;\n this.button = event.button;\n this.buttons = event.buttons;\n this.target = element;\n this.currentTarget = element;\n this.relatedTarget = related || null;\n this.preEnd = preEnd;\n this.type = action + (phase || '');\n this.interaction = interaction;\n this.interactable = target;\n\n this.t0 = starting ? interaction.downTimes[interaction.downTimes.length - 1]\n : prevEvent.t0;\n\n const signalArg = {\n interaction,\n event,\n action,\n phase,\n element,\n related,\n page,\n client,\n coords,\n starting,\n ending,\n deltaSource,\n iEvent: this,\n };\n\n signals.fire('set-xy', signalArg);\n\n if (ending) {\n // use previous coords when ending\n this.pageX = prevEvent.pageX;\n this.pageY = prevEvent.pageY;\n this.clientX = prevEvent.clientX;\n this.clientY = prevEvent.clientY;\n }\n else {\n this.pageX = page.x;\n this.pageY = page.y;\n this.clientX = client.x;\n this.clientY = client.y;\n }\n\n this.x0 = interaction.startCoords.page.x - origin.x;\n this.y0 = interaction.startCoords.page.y - origin.y;\n this.clientX0 = interaction.startCoords.client.x - origin.x;\n this.clientY0 = interaction.startCoords.client.y - origin.y;\n\n signals.fire('set-delta', signalArg);\n\n this.timeStamp = coords.timeStamp;\n this.dt = interaction.pointerDelta.timeStamp;\n this.duration = this.timeStamp - this.t0;\n\n // speed and velocity in pixels per second\n this.speed = interaction.pointerDelta[deltaSource].speed;\n this.velocityX = interaction.pointerDelta[deltaSource].vx;\n this.velocityY = interaction.pointerDelta[deltaSource].vy;\n\n this.swipe = (ending || phase === 'inertiastart')? this.getSwipe() : null;\n\n signals.fire('new', signalArg);\n }\n\n getSwipe () {\n const interaction = this.interaction;\n\n if (interaction.prevEvent.speed < 600\n || this.timeStamp - interaction.prevEvent.timeStamp > 150) {\n return null;\n }\n\n let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI;\n const overlap = 22.5;\n\n if (angle < 0) {\n angle += 360;\n }\n\n const left = 135 - overlap <= angle && angle < 225 + overlap;\n const up = 225 - overlap <= angle && angle < 315 + overlap;\n\n const right = !left && (315 - overlap <= angle || angle < 45 + overlap);\n const down = !up && 45 - overlap <= angle && angle < 135 + overlap;\n\n return {\n up,\n down,\n left,\n right,\n angle,\n speed: interaction.prevEvent.speed,\n velocity: {\n x: interaction.prevEvent.velocityX,\n y: interaction.prevEvent.velocityY,\n },\n };\n }\n\n preventDefault () {}\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n}\n\nsignals.on('set-delta', function ({ iEvent, interaction, starting, deltaSource }) {\n const prevEvent = starting? iEvent : interaction.prevEvent;\n\n if (deltaSource === 'client') {\n iEvent.dx = iEvent.clientX - prevEvent.clientX;\n iEvent.dy = iEvent.clientY - prevEvent.clientY;\n }\n else {\n iEvent.dx = iEvent.pageX - prevEvent.pageX;\n iEvent.dy = iEvent.pageY - prevEvent.pageY;\n }\n});\n\nInteractEvent.signals = signals;\n\nmodule.exports = InteractEvent;\n","const is = require('./utils/is');\nconst events = require('./utils/events');\nconst extend = require('./utils/extend');\nconst actions = require('./actions/base');\nconst scope = require('./scope');\nconst Eventable = require('./Eventable');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nconst {\n getElementRect,\n nodeContains,\n trySelector,\n} = require('./utils/domUtils');\nconst { getWindow } = require('./utils/window');\nconst { indexOf, contains } = require('./utils/arr');\nconst { wheelEvent } = require('./utils/browser');\n\n// all set interactables\nscope.interactables = [];\n\n/*\\\n * Interactable\n [ property ]\n **\n * Object type returned by @interact\n\\*/\nclass Interactable {\n constructor (target, options) {\n options = options || {};\n\n this.target = target;\n this.events = new Eventable();\n this._context = options.context || scope.document;\n this._win = getWindow(trySelector(target)? this._context : target);\n this._doc = this._win.document;\n\n signals.fire('new', {\n target,\n options,\n interactable: this,\n win: this._win,\n });\n\n scope.addDocument( this._doc, this._win );\n\n scope.interactables.push(this);\n\n this.set(options);\n }\n\n setOnEvents (action, phases) {\n const onAction = 'on' + action;\n\n if (is.function(phases.onstart) ) { this.events[onAction + 'start' ] = phases.onstart ; }\n if (is.function(phases.onmove) ) { this.events[onAction + 'move' ] = phases.onmove ; }\n if (is.function(phases.onend) ) { this.events[onAction + 'end' ] = phases.onend ; }\n if (is.function(phases.oninertiastart)) { this.events[onAction + 'inertiastart' ] = phases.oninertiastart ; }\n\n return this;\n }\n\n setPerAction (action, options) {\n // for all the default per-action options\n for (const option in options) {\n // if this option exists for this action\n if (option in defaults[action]) {\n // if the option in the options arg is an object value\n if (is.object(options[option])) {\n // duplicate the object\n this.options[action][option] = extend(this.options[action][option] || {}, options[option]);\n\n if (is.object(defaults.perAction[option]) && 'enabled' in defaults.perAction[option]) {\n this.options[action][option].enabled = options[option].enabled === false? false : true;\n }\n }\n else if (is.bool(options[option]) && is.object(defaults.perAction[option])) {\n this.options[action][option].enabled = options[option];\n }\n else if (options[option] !== undefined) {\n // or if it's not undefined, do a plain assignment\n this.options[action][option] = options[option];\n }\n }\n }\n }\n\n /*\\\n * Interactable.getRect\n [ method ]\n *\n * The default function to get an Interactables bounding rect. Can be\n * overridden using @Interactable.rectChecker.\n *\n - element (Element) #optional The element to measure.\n = (object) The object's bounding rectangle.\n o {\n o top : 0,\n o left : 0,\n o bottom: 0,\n o right : 0,\n o width : 0,\n o height: 0\n o }\n \\*/\n getRect (element) {\n element = element || this.target;\n\n if (is.string(this.target) && !(is.element(element))) {\n element = this._context.querySelector(this.target);\n }\n\n return getElementRect(element);\n }\n\n /*\\\n * Interactable.rectChecker\n [ method ]\n *\n * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n - checker (function) #optional A function which returns this Interactable's bounding rectangle. See @Interactable.getRect\n = (function | object) The checker function or this Interactable\n \\*/\n rectChecker (checker) {\n if (is.function(checker)) {\n this.getRect = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.getRect;\n\n return this;\n }\n\n return this.getRect;\n }\n\n _backCompatOption (optionName, newValue) {\n if (trySelector(newValue) || is.object(newValue)) {\n this.options[optionName] = newValue;\n\n for (const action of actions.names) {\n this.options[action][optionName] = newValue;\n }\n\n return this;\n }\n\n return this.options[optionName];\n }\n\n /*\\\n * Interactable.origin\n [ method ]\n *\n * Gets or sets the origin of the Interactable's element. The x and y\n * of the origin will be subtracted from action event coordinates.\n *\n - origin (object | string) #optional An object eg. { x: 0, y: 0 } or string 'parent', 'self' or any CSS selector\n * OR\n - origin (Element) #optional An HTML or SVG Element whose rect will be used\n **\n = (object) The current origin or this Interactable\n \\*/\n origin (newValue) {\n return this._backCompatOption('origin', newValue);\n }\n\n /*\\\n * Interactable.deltaSource\n [ method ]\n *\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n - newValue (string) #optional Use 'client' if you will be scrolling while interacting; Use 'page' if you want autoScroll to work\n = (string | object) The current deltaSource or this Interactable\n \\*/\n deltaSource (newValue) {\n if (newValue === 'page' || newValue === 'client') {\n this.options.deltaSource = newValue;\n\n return this;\n }\n\n return this.options.deltaSource;\n }\n\n /*\\\n * Interactable.context\n [ method ]\n *\n * Gets the selector context Node of the Interactable. The default is `window.document`.\n *\n = (Node) The context Node of this Interactable\n **\n \\*/\n context () {\n return this._context;\n }\n\n inContext (element) {\n return (this._context === element.ownerDocument\n || nodeContains(this._context, element));\n }\n\n /*\\\n * Interactable.fire\n [ method ]\n *\n * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n - iEvent (InteractEvent) The InteractEvent object to be fired on this Interactable\n = (Interactable) this Interactable\n \\*/\n fire (iEvent) {\n this.events.fire(iEvent);\n\n return this;\n }\n\n _onOffMultiple (method, eventType, listener, options) {\n if (is.string(eventType) && eventType.search(' ') !== -1) {\n eventType = eventType.trim().split(/ +/);\n }\n\n if (is.array(eventType)) {\n for (let i = 0; i < eventType.length; i++) {\n this[method](eventType[i], listener, options);\n }\n\n return true;\n }\n\n if (is.object(eventType)) {\n for (const prop in eventType) {\n this[method](prop, eventType[prop], listener);\n }\n\n return true;\n }\n }\n\n /*\\\n * Interactable.on\n [ method ]\n *\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n - eventType (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) This Interactable\n \\*/\n on (eventType, listener, options) {\n if (this._onOffMultiple('on', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.on(eventType, listener);\n }\n // delegated event for selector\n else if (is.string(this.target)) {\n events.addDelegate(this.target, this._context, eventType, listener, options);\n }\n else {\n events.add(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.off\n [ method ]\n *\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n - eventType (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) This Interactable\n \\*/\n off (eventType, listener, options) {\n if (this._onOffMultiple('off', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n // if it is an action event type\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.off(eventType, listener);\n }\n // delegated event\n else if (is.string(this.target)) {\n events.removeDelegate(this.target, this._context, eventType, listener, options);\n }\n // remove listener from this Interatable's element\n else {\n events.remove(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.set\n [ method ]\n *\n * Reset the options of this Interactable\n - options (object) The new settings to apply\n = (object) This Interactable\n \\*/\n set (options) {\n if (!is.object(options)) {\n options = {};\n }\n\n this.options = extend({}, defaults.base);\n\n const perActions = extend({}, defaults.perAction);\n\n for (const actionName in actions.methodDict) {\n const methodName = actions.methodDict[actionName];\n\n this.options[actionName] = extend({}, defaults[actionName]);\n\n this.setPerAction(actionName, perActions);\n\n this[methodName](options[actionName]);\n }\n\n for (const setting of Interactable.settingsMethods) {\n this.options[setting] = defaults.base[setting];\n\n if (setting in options) {\n this[setting](options[setting]);\n }\n }\n\n signals.fire('set', {\n options,\n interactable: this,\n });\n\n return this;\n }\n\n /*\\\n * Interactable.unset\n [ method ]\n *\n * Remove this interactable from the list of interactables and remove\n * it's action capabilities and event listeners\n *\n = (object) @interact\n \\*/\n unset () {\n events.remove(this.target, 'all');\n\n if (is.string(this.target)) {\n // remove delegated events\n for (const type in events.delegatedEvents) {\n const delegated = events.delegatedEvents[type];\n\n if (delegated.selectors[0] === this.target\n && delegated.contexts[0] === this._context) {\n\n delegated.selectors.splice(0, 1);\n delegated.contexts .splice(0, 1);\n delegated.listeners.splice(0, 1);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegated[type] = null;\n }\n }\n\n events.remove(this._context, type, events.delegateListener);\n events.remove(this._context, type, events.delegateUseCapture, true);\n }\n }\n else {\n events.remove(this, 'all');\n }\n\n signals.fire('unset', { interactable: this });\n\n scope.interactables.splice(indexOf(scope.interactables, this), 1);\n\n // Stop related interactions when an Interactable is unset\n for (const interaction of scope.interactions || []) {\n if (interaction.target === this && interaction.interacting()) {\n interaction.stop();\n }\n }\n\n return scope.interact;\n }\n}\n\nscope.interactables.indexOfElement = function indexOfElement (target, context) {\n context = context || scope.document;\n\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n if (interactable.target === target && interactable._context === context) {\n return i;\n }\n }\n return -1;\n};\n\nscope.interactables.get = function interactableGet (element, options, dontCheckInContext) {\n const ret = this[this.indexOfElement(element, options && options.context)];\n\n return ret && (is.string(element) || dontCheckInContext || ret.inContext(element))? ret : null;\n};\n\nscope.interactables.forEachSelector = function (callback, element) {\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n // skip non CSS selector targets and out of context elements\n if (!is.string(interactable.target)\n || (element && !interactable.inContext(element))) {\n continue;\n }\n\n const ret = callback(interactable, interactable.target, interactable._context, i, this);\n\n if (ret !== undefined) {\n return ret;\n }\n }\n};\n\n// all interact.js eventTypes\nInteractable.eventTypes = scope.eventTypes = [];\n\nInteractable.signals = signals;\n\nInteractable.settingsMethods = [ 'deltaSource', 'origin', 'preventDefault', 'rectChecker' ];\n\nmodule.exports = Interactable;\n","const scope = require('./scope');\nconst utils = require('./utils');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst finder = require('./utils/interactionFinder');\nconst signals = require('./utils/Signals').new();\n\nconst listeners = {};\nconst methodNames = [\n 'pointerDown', 'pointerMove', 'pointerUp',\n 'updatePointer', 'removePointer',\n];\n\n// for ignoring browser's simulated mouse events\nlet prevTouchTime = 0;\n\n// all active and idle interactions\nscope.interactions = [];\n\nclass Interaction {\n constructor () {\n this.target = null; // current interactable being interacted with\n this.element = null; // the target element of the interactable\n\n this.prepared = { // action that's ready to be fired on next move event\n name : null,\n axis : null,\n edges: null,\n };\n\n // keep track of added pointers\n this.pointers = [];\n this.pointerIds = [];\n this.downTargets = [];\n this.downTimes = [];\n\n // Previous native pointer move event coordinates\n this.prevCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n // current native pointer move event coordinates\n this.curCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Starting InteractEvent pointer coordinates\n this.startCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Change in coordinates and time of the pointer\n this.pointerDelta = {\n page : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n client : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n timeStamp: 0,\n };\n\n this.downEvent = null; // pointerdown/mousedown/touchstart event\n this.downPointer = {};\n\n this._eventTarget = null;\n this._curEventTarget = null;\n\n this.prevEvent = null; // previous action event\n\n this.pointerIsDown = false;\n this.pointerWasMoved = false;\n this._interacting = false;\n\n this.mouse = false;\n\n signals.fire('new', this);\n\n scope.interactions.push(this);\n }\n\n pointerDown (pointer, event, eventTarget) {\n const pointerIndex = this.updatePointer(pointer, event, true);\n\n signals.fire('down', {\n pointer,\n event,\n eventTarget,\n pointerIndex,\n interaction: this,\n });\n }\n\n /*\\\n * Interaction.start\n [ method ]\n *\n * Start an action with the given Interactable and Element as tartgets. The\n * action must be enabled for the target Interactable and an appropriate number\n * of pointers must be held down - 1 for drag/resize, 2 for gesture.\n *\n * Use it with `interactable.able({ manualStart: false })` to always\n * [start actions manually](https://github.com/taye/interact.js/issues/114)\n *\n - action (object) The action to be performed - drag, resize, etc.\n - target (Interactable) The Interactable to target\n - element (Element) The DOM Element to target\n = (object) interact\n **\n | interact(target)\n | .draggable({\n | // disable the default drag start by down->move\n | manualStart: true\n | })\n | // start dragging after the user holds the pointer down\n | .on('hold', function (event) {\n | var interaction = event.interaction;\n |\n | if (!interaction.interacting()) {\n | interaction.start({ name: 'drag' },\n | event.interactable,\n | event.currentTarget);\n | }\n | });\n \\*/\n start (action, target, element) {\n if (this.interacting()\n || !this.pointerIsDown\n || this.pointerIds.length < (action.name === 'gesture'? 2 : 1)) {\n return;\n }\n\n // if this interaction had been removed after stopping\n // add it back\n if (utils.indexOf(scope.interactions, this) === -1) {\n scope.interactions.push(this);\n }\n\n utils.copyAction(this.prepared, action);\n this.target = target;\n this.element = element;\n\n signals.fire('action-start', {\n interaction: this,\n event: this.downEvent,\n });\n }\n\n pointerMove (pointer, event, eventTarget) {\n if (!this.simulation) {\n this.updatePointer(pointer);\n utils.setCoords(this.curCoords, this.pointers);\n }\n\n const duplicateMove = (this.curCoords.page.x === this.prevCoords.page.x\n && this.curCoords.page.y === this.prevCoords.page.y\n && this.curCoords.client.x === this.prevCoords.client.x\n && this.curCoords.client.y === this.prevCoords.client.y);\n\n let dx;\n let dy;\n\n // register movement greater than pointerMoveTolerance\n if (this.pointerIsDown && !this.pointerWasMoved) {\n dx = this.curCoords.client.x - this.startCoords.client.x;\n dy = this.curCoords.client.y - this.startCoords.client.y;\n\n this.pointerWasMoved = utils.hypot(dx, dy) > Interaction.pointerMoveTolerance;\n }\n\n const signalArg = {\n pointer,\n pointerIndex: this.getPointerIndex(pointer),\n event,\n eventTarget,\n dx,\n dy,\n duplicate: duplicateMove,\n interaction: this,\n interactingBeforeMove: this.interacting(),\n };\n\n if (!duplicateMove) {\n // set pointer coordinate, time changes and speeds\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n }\n\n signals.fire('move', signalArg);\n\n if (!duplicateMove) {\n // if interacting, fire an 'action-move' signal etc\n if (this.interacting()) {\n this.doMove(signalArg);\n }\n\n if (this.pointerWasMoved) {\n utils.copyCoords(this.prevCoords, this.curCoords);\n }\n }\n }\n\n /*\\\n * Interaction.doMove\n [ method ]\n *\n * Force a move of the current action at the same coordinates. Useful if\n * snap/restrict has been changed and you want a movement with the new\n * settings.\n *\n **\n | interact(target)\n | .draggable(true)\n | .on('dragmove', function (event) {\n | if (someCondition) {\n | // change the snap settings\n | event.interactable.draggable({ snap: { targets: [] }});\n | // fire another move event with re-calculated snap\n | event.interaction.doMove();\n | }\n | });\n \\*/\n doMove (signalArg) {\n signalArg = utils.extend({\n pointer: this.pointers[0],\n event: this.prevEvent,\n eventTarget: this._eventTarget,\n interaction: this,\n }, signalArg || {});\n\n signals.fire('before-action-move', signalArg);\n\n if (!this._dontFireMove) {\n signals.fire('action-move', signalArg);\n }\n\n this._dontFireMove = false;\n }\n\n // End interact move events and stop auto-scroll unless simulation is running\n pointerUp (pointer, event, eventTarget, curEventTarget) {\n const pointerIndex = this.getPointerIndex(pointer);\n\n signals.fire(/cancel$/i.test(event.type)? 'cancel' : 'up', {\n pointer,\n pointerIndex,\n event,\n eventTarget,\n curEventTarget,\n interaction: this,\n });\n\n if (!this.simulation) {\n this.end(event);\n }\n\n this.pointerIsDown = false;\n this.removePointer(pointer, event);\n }\n\n /*\\\n * Interaction.end\n [ method ]\n *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n - event (PointerEvent) #optional\n **\n | interact(target)\n | .draggable(true)\n | .on('move', function (event) {\n | if (event.pageX > 1000) {\n | // end the current action\n | event.interaction.end();\n | // stop all further listeners from being called\n | event.stopImmediatePropagation();\n | }\n | });\n \\*/\n end (event) {\n event = event || this.prevEvent;\n\n if (this.interacting()) {\n signals.fire('action-end', {\n event,\n interaction: this,\n });\n }\n\n this.stop();\n }\n\n currentAction () {\n return this._interacting? this.prepared.name: null;\n }\n\n interacting () {\n return this._interacting;\n }\n\n stop () {\n signals.fire('stop', { interaction: this });\n\n if (this._interacting) {\n signals.fire('stop-active', { interaction: this });\n signals.fire('stop-' + this.prepared.name, { interaction: this });\n }\n\n this.target = this.element = null;\n\n this._interacting = false;\n this.prepared.name = this.prevEvent = null;\n }\n\n getPointerIndex (pointer) {\n return utils.indexOf(this.pointerIds, utils.getPointerId(pointer));\n }\n\n updatePointer (pointer, event, down = event && /(down|start)$/i.test(event.type)) {\n const id = utils.getPointerId(pointer);\n let index = this.getPointerIndex(pointer);\n\n if (index === -1) {\n index = this.pointerIds.length;\n this.pointerIds[index] = id;\n }\n\n if (down) {\n signals.fire('update-pointer-down', {\n pointer,\n event,\n down,\n pointerId: id,\n pointerIndex: index,\n interaction: this,\n });\n }\n\n this.pointers[index] = pointer;\n\n return index;\n }\n\n removePointer (pointer, event) {\n const id = utils.getPointerId(pointer);\n const index = this.mouse? 0 : utils.indexOf(this.pointerIds, id);\n\n if (index === -1) { return; }\n\n signals.fire('remove-pointer', {\n pointer,\n event,\n pointerIndex: index,\n interaction: this,\n });\n\n this.pointers .splice(index, 1);\n this.pointerIds .splice(index, 1);\n this.downTargets.splice(index, 1);\n this.downTimes .splice(index, 1);\n }\n\n _updateEventTargets (target, currentTarget) {\n this._eventTarget = target;\n this._curEventTarget = currentTarget;\n }\n}\n\nfor (let i = 0, len = methodNames.length; i < len; i++) {\n const method = methodNames[i];\n\n listeners[method] = doOnInteractions(method);\n}\n\nfunction doOnInteractions (method) {\n return (function (event) {\n const [eventTarget, curEventTarget] = utils.getEventTargets(event);\n const matches = []; // [ [pointer, interaction], ...]\n\n if (browser.supportsTouch && /touch/.test(event.type)) {\n prevTouchTime = new Date().getTime();\n\n for (let i = 0; i < event.changedTouches.length; i++) {\n const pointer = event.changedTouches[i];\n const interaction = finder.search(pointer, event.type, eventTarget);\n\n matches.push([pointer, interaction || new Interaction()]);\n }\n }\n else {\n let invalidPointer = false;\n\n if (!browser.supportsPointerEvent && /mouse/.test(event.type)) {\n // ignore mouse events while touch interactions are active\n for (let i = 0; i < scope.interactions.length && !invalidPointer; i++) {\n invalidPointer = !scope.interactions[i].mouse && scope.interactions[i].pointerIsDown;\n }\n\n // try to ignore mouse events that are simulated by the browser\n // after a touch event\n invalidPointer = invalidPointer\n || (new Date().getTime() - prevTouchTime < 500)\n // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated\n || event.timeStamp === 0;\n }\n\n if (!invalidPointer) {\n let interaction = finder.search(event, event.type, eventTarget);\n\n if (!interaction) {\n\n interaction = new Interaction();\n interaction.mouse = (/mouse/i.test(event.pointerType || event.type)\n // MSPointerEvent.MSPOINTER_TYPE_MOUSE\n || event.pointerType === 4\n || !event.pointerType);\n }\n\n matches.push([event, interaction]);\n }\n }\n\n for (const [pointer, interaction] of matches) {\n interaction._updateEventTargets(eventTarget, curEventTarget);\n interaction[method](pointer, event, eventTarget, curEventTarget);\n }\n });\n}\n\nfunction endAll (event) {\n for (let i = 0; i < scope.interactions.length; i++) {\n const interaction = scope.interactions[i];\n\n interaction.end(event);\n signals.fire('endall', { event, interaction });\n }\n}\n\nconst docEvents = { /* 'eventType': listenerFunc */ };\nconst pEventTypes = browser.pEventTypes;\n\nif (scope.PointerEvent) {\n docEvents[pEventTypes.down ] = listeners.pointerDown;\n docEvents[pEventTypes.move ] = listeners.pointerMove;\n docEvents[pEventTypes.up ] = listeners.pointerUp;\n docEvents[pEventTypes.cancel] = listeners.pointerUp;\n}\nelse {\n docEvents.mousedown = listeners.pointerDown;\n docEvents.mousemove = listeners.pointerMove;\n docEvents.mouseup = listeners.pointerUp;\n\n docEvents.touchstart = listeners.pointerDown;\n docEvents.touchmove = listeners.pointerMove;\n docEvents.touchend = listeners.pointerUp;\n docEvents.touchcancel = listeners.pointerUp;\n}\n\ndocEvents.blur = endAll;\n\nfunction onDocSignal ({ doc }, signalName) {\n const eventMethod = signalName.indexOf('add') === 0\n ? events.add : events.remove;\n\n // delegate event listener\n for (const eventType in scope.delegatedEvents) {\n eventMethod(doc, eventType, events.delegateListener);\n eventMethod(doc, eventType, events.delegateUseCapture, true);\n }\n\n for (const eventType in docEvents) {\n eventMethod(doc, eventType, docEvents[eventType]);\n }\n}\n\nsignals.on('update-pointer-down', ({ interaction, pointer, pointerId, pointerIndex, event, eventTarget, down }) => {\n interaction.pointerIds[pointerIndex] = pointerId;\n interaction.pointers[pointerIndex] = pointer;\n\n if (down) {\n interaction.pointerIsDown = true;\n }\n\n if (!interaction.interacting()) {\n utils.setCoords(interaction.startCoords, interaction.pointers);\n\n utils.copyCoords(interaction.curCoords , interaction.startCoords);\n utils.copyCoords(interaction.prevCoords, interaction.startCoords);\n\n interaction.downEvent = event;\n interaction.downTimes[pointerIndex] = interaction.curCoords.timeStamp;\n interaction.downTargets[pointerIndex] = eventTarget || event && utils.getEventTargets(event)[0];\n interaction.pointerWasMoved = false;\n\n utils.pointerExtend(interaction.downPointer, pointer);\n }\n});\n\nscope.signals.on('add-document' , onDocSignal);\nscope.signals.on('remove-document', onDocSignal);\n\nInteraction.pointerMoveTolerance = 1;\nInteraction.doOnInteractions = doOnInteractions;\nInteraction.endAll = endAll;\nInteraction.signals = signals;\nInteraction.docEvents = docEvents;\n\nscope.endAllInteractions = endAll;\n\nmodule.exports = Interaction;\n","const Interaction = require('../Interaction');\nconst InteractEvent = require('../InteractEvent');\n\nconst actions = {\n firePrepared,\n names: [],\n methodDict: {},\n};\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n interaction._interacting = true;\n firePrepared(interaction, event, 'start');\n});\n\nInteraction.signals.on('action-move', function ({ interaction, event, preEnd }) {\n firePrepared(interaction, event, 'move', preEnd);\n\n // if the action was ended in a listener\n if (!interaction.interacting()) { return false; }\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n firePrepared(interaction, event, 'end');\n});\n\nfunction firePrepared (interaction, event, phase, preEnd) {\n const actionName = interaction.prepared.name;\n\n const newEvent = new InteractEvent(interaction, event, actionName, phase, interaction.element, null, preEnd);\n\n interaction.target.fire(newEvent);\n interaction.prevEvent = newEvent;\n}\n\nmodule.exports = actions;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drag = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n startAxis : 'xy',\n lockAxis : 'xy',\n },\n\n checker: function (pointer, event, interactable) {\n const dragOptions = interactable.options.drag;\n\n return dragOptions.enabled\n ? { name: 'drag', axis: (dragOptions.lockAxis === 'start'\n ? dragOptions.startAxis\n : dragOptions.lockAxis)}\n : null;\n },\n\n getCursor: function () {\n return 'move';\n },\n};\n\nInteraction.signals.on('before-action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n interaction.curCoords.page.y = interaction.startCoords.page.y;\n interaction.curCoords.client.y = interaction.startCoords.client.y;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vx);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vx);\n interaction.pointerDelta.client.vy = 0;\n interaction.pointerDelta.page.vy = 0;\n }\n else if (axis === 'y') {\n interaction.curCoords.page.x = interaction.startCoords.page.x;\n interaction.curCoords.client.x = interaction.startCoords.client.x;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vy);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vy);\n interaction.pointerDelta.client.vx = 0;\n interaction.pointerDelta.page.vx = 0;\n }\n});\n\n// dragmove\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'dragmove') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n iEvent.pageY = interaction.startCoords.page.y;\n iEvent.clientY = interaction.startCoords.client.y;\n iEvent.dy = 0;\n }\n else if (axis === 'y') {\n iEvent.pageX = interaction.startCoords.page.x;\n iEvent.clientX = interaction.startCoords.client.x;\n iEvent.dx = 0;\n }\n});\n\n/*\\\n * Interactable.draggable\n [ method ]\n *\n * Gets or sets whether drag actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of drag events\n | var isDraggable = interact('ul li').draggable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on drag events (object makes the Interactable draggable)\n = (object) This Interactable\n | interact(element).draggable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // the axis in which the first movement must be\n | // for the drag sequence to start\n | // 'xy' by default - any direction\n | startAxis: 'x' || 'y' || 'xy',\n |\n | // 'xy' by default - don't restrict to one axis (move in any direction)\n | // 'x' or 'y' to restrict movement to either axis\n | // 'start' to restrict movement to the axis the drag started in\n | lockAxis: 'x' || 'y' || 'xy' || 'start',\n |\n | // max number of drags that can happen concurrently\n | // with elements of this Interactable. Infinity by default\n | max: Infinity,\n |\n | // max number of drags that can target the same element+Interactable\n | // 1 by default\n | maxPerElement: 2\n | });\n\\*/\nInteractable.prototype.draggable = function (options) {\n if (utils.is.object(options)) {\n this.options.drag.enabled = options.enabled === false? false: true;\n this.setPerAction('drag', options);\n this.setOnEvents('drag', options);\n\n if (/^(xy|x|y|start)$/.test(options.lockAxis)) {\n this.options.drag.lockAxis = options.lockAxis;\n }\n if (/^(xy|x|y)$/.test(options.startAxis)) {\n this.options.drag.startAxis = options.startAxis;\n }\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drag.enabled = options;\n\n if (!options) {\n this.ondragstart = this.ondragstart = this.ondragend = null;\n }\n\n return this;\n }\n\n return this.options.drag;\n};\n\nactions.drag = drag;\nactions.names.push('drag');\nutils.merge(Interactable.eventTypes, [\n 'dragstart',\n 'dragmove',\n 'draginertiastart',\n 'draginertiaresume',\n 'dragend',\n]);\nactions.methodDict.drag = 'draggable';\n\ndefaultOptions.drag = drag.defaults;\n\nmodule.exports = drag;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst scope = require('../scope');\nconst interact = require('../interact');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drop = {\n defaults: {\n enabled: false,\n accept : null,\n overlap: 'pointer',\n },\n};\n\nlet dynamicDrop = false;\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // reset active dropzones\n interaction.activeDrops.dropzones = [];\n interaction.activeDrops.elements = [];\n interaction.activeDrops.rects = [];\n\n interaction.dropEvents = null;\n\n if (!interaction.dynamicDrop) {\n setActiveDrops(interaction, interaction.element);\n }\n\n const dragEvent = interaction.prevEvent;\n const dropEvents = getDropEvents(interaction, event, dragEvent);\n\n if (dropEvents.activate) {\n fireActiveDrops(interaction, dropEvents.activate);\n }\n});\n\nInteractEvent.signals.on('new', function ({ interaction, iEvent, event }) {\n if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { return; }\n\n const draggableElement = interaction.element;\n const dragEvent = iEvent;\n const dropResult = getDrop(dragEvent, event, draggableElement);\n\n interaction.dropTarget = dropResult.dropzone;\n interaction.dropElement = dropResult.element;\n\n interaction.dropEvents = getDropEvents(interaction, event, dragEvent);\n});\n\nInteraction.signals.on('action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n fireDropEvents(interaction, interaction.dropEvents);\n});\n\nInteraction.signals.on('action-end', function ({ interaction }) {\n if (interaction.prepared.name === 'drag') {\n fireDropEvents(interaction, interaction.dropEvents);\n }\n});\n\nInteraction.signals.on('stop-drag', function ({ interaction }) {\n interaction.activeDrops.dropzones =\n interaction.activeDrops.elements =\n interaction.activeDrops.rects =\n interaction.dropEvents = null;\n});\n\nfunction collectDrops (interaction, element) {\n const drops = [];\n const elements = [];\n\n element = element || interaction.element;\n\n // collect all dropzones and their elements which qualify for a drop\n for (const current of scope.interactables) {\n if (!current.options.drop.enabled) { continue; }\n\n const accept = current.options.drop.accept;\n\n // test the draggable element against the dropzone's accept setting\n if ((utils.is.element(accept) && accept !== element)\n || (utils.is.string(accept)\n && !utils.matchesSelector(element, accept))) {\n\n continue;\n }\n\n // query for new elements if necessary\n const dropElements = utils.is.string(current.target)\n ? current._context.querySelectorAll(current.target)\n : [current.target];\n\n for (let i = 0; i < dropElements.length; i++) {\n const currentElement = dropElements[i];\n\n if (currentElement !== element) {\n drops.push(current);\n elements.push(currentElement);\n }\n }\n }\n\n return {\n elements,\n dropzones: drops,\n };\n}\n\nfunction fireActiveDrops (interaction, event) {\n let prevElement;\n\n // loop through all active dropzones and trigger event\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n const current = interaction.activeDrops.dropzones[i];\n const currentElement = interaction.activeDrops.elements [i];\n\n // prevent trigger of duplicate events on same element\n if (currentElement !== prevElement) {\n // set current element as event target\n event.target = currentElement;\n current.fire(event);\n }\n prevElement = currentElement;\n }\n}\n\n// Collect a new set of possible drops and save them in activeDrops.\n// setActiveDrops should always be called when a drag has just started or a\n// drag event happens while dynamicDrop is true\nfunction setActiveDrops (interaction, dragElement) {\n // get dropzones and their elements that could receive the draggable\n const possibleDrops = collectDrops(interaction, dragElement, true);\n\n interaction.activeDrops.dropzones = possibleDrops.dropzones;\n interaction.activeDrops.elements = possibleDrops.elements;\n interaction.activeDrops.rects = [];\n\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n interaction.activeDrops.rects[i] =\n interaction.activeDrops.dropzones[i].getRect(interaction.activeDrops.elements[i]);\n }\n}\n\nfunction getDrop (dragEvent, event, dragElement) {\n const interaction = dragEvent.interaction;\n const validDrops = [];\n\n if (dynamicDrop) {\n setActiveDrops(interaction, dragElement);\n }\n\n // collect all dropzones and their elements which qualify for a drop\n for (let j = 0; j < interaction.activeDrops.dropzones.length; j++) {\n const current = interaction.activeDrops.dropzones[j];\n const currentElement = interaction.activeDrops.elements [j];\n const rect = interaction.activeDrops.rects [j];\n\n validDrops.push(current.dropCheck(dragEvent, event, interaction.target, dragElement, currentElement, rect)\n ? currentElement\n : null);\n }\n\n // get the most appropriate dropzone based on DOM depth and order\n const dropIndex = utils.indexOfDeepestElement(validDrops);\n\n return {\n dropzone: interaction.activeDrops.dropzones[dropIndex] || null,\n element : interaction.activeDrops.elements [dropIndex] || null,\n };\n}\n\nfunction getDropEvents (interaction, pointerEvent, dragEvent) {\n const dropEvents = {\n enter : null,\n leave : null,\n activate : null,\n deactivate: null,\n move : null,\n drop : null,\n };\n\n const tmpl = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n };\n\n if (interaction.dropElement !== interaction.prevDropElement) {\n // if there was a prevDropTarget, create a dragleave event\n if (interaction.prevDropTarget) {\n dropEvents.leave = utils.extend({ type: 'dragleave' }, tmpl);\n\n dragEvent.dragLeave = dropEvents.leave.target = interaction.prevDropElement;\n dragEvent.prevDropzone = dropEvents.leave.dropzone = interaction.prevDropTarget;\n }\n // if the dropTarget is not null, create a dragenter event\n if (interaction.dropTarget) {\n dropEvents.enter = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n type : 'dragenter',\n };\n\n dragEvent.dragEnter = interaction.dropElement;\n dragEvent.dropzone = interaction.dropTarget;\n }\n }\n\n if (dragEvent.type === 'dragend' && interaction.dropTarget) {\n dropEvents.drop = utils.extend({ type: 'drop' }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n dragEvent.relatedTarget = interaction.dropElement;\n }\n if (dragEvent.type === 'dragstart') {\n dropEvents.activate = utils.extend({ type: 'dropactivate' }, tmpl);\n\n dropEvents.activate.target = null;\n dropEvents.activate.dropzone = null;\n }\n if (dragEvent.type === 'dragend') {\n dropEvents.deactivate = utils.extend({ type: 'dropdeactivate' }, tmpl);\n\n dropEvents.deactivate.target = null;\n dropEvents.deactivate.dropzone = null;\n }\n if (dragEvent.type === 'dragmove' && interaction.dropTarget) {\n dropEvents.move = utils.extend({\n dragmove : dragEvent,\n type : 'dropmove',\n }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n }\n\n return dropEvents;\n}\n\nfunction fireDropEvents (interaction, dropEvents) {\n if (dropEvents.leave) { interaction.prevDropTarget.fire(dropEvents.leave); }\n if (dropEvents.move ) { interaction.dropTarget.fire(dropEvents.move ); }\n if (dropEvents.enter) { interaction.dropTarget.fire(dropEvents.enter); }\n if (dropEvents.drop ) { interaction.dropTarget.fire(dropEvents.drop ); }\n if (dropEvents.deactivate) {\n fireActiveDrops(interaction, dropEvents.deactivate);\n }\n\n interaction.prevDropTarget = interaction.dropTarget;\n interaction.prevDropElement = interaction.dropElement;\n}\n\n/*\\\n * Interactable.dropzone\n [ method ]\n *\n * Returns or sets whether elements can be dropped onto this\n * Interactable to trigger drop events\n *\n * Dropzones can receive the following events:\n * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends\n * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone\n * - `dragmove` when a draggable that has entered the dropzone is moved\n * - `drop` when a draggable is dropped into this dropzone\n *\n * Use the `accept` option to allow only elements that match the given CSS\n * selector or element. The value can be:\n *\n * - **an Element** - only that element can be dropped into this dropzone.\n * - **a string**, - the element being dragged must match it as a CSS selector.\n * - **`null`** - accept options is cleared - it accepts any element.\n *\n * Use the `overlap` option to set how drops are checked for. The allowed\n * values are:\n *\n * - `'pointer'`, the pointer must be over the dropzone (default)\n * - `'center'`, the draggable element's center must be over the dropzone\n * - a number from 0-1 which is the `(intersection area) / (draggable area)`.\n * e.g. `0.5` for drop to happen when half of the area of the draggable is\n * over the dropzone\n *\n * Use the `checker` option to specify a function to check if a dragged\n * element is over this Interactable.\n *\n | interact(target)\n | .dropChecker(function(dragEvent, // related dragmove or dragend event\n | event, // TouchEvent/PointerEvent/MouseEvent\n | dropped, // bool result of the default checker\n | dropzone, // dropzone Interactable\n | dropElement, // dropzone elemnt\n | draggable, // draggable Interactable\n | draggableElement) {// draggable element\n |\n | return dropped && event.target.hasAttribute('allow-drop');\n | }\n *\n *\n - options (boolean | object | null) #optional The new value to be set.\n | interact('.drop').dropzone({\n | accept: '.can-drop' || document.getElementById('single-drop'),\n | overlap: 'pointer' || 'center' || zeroToOne\n | }\n = (boolean | object) The current setting or this Interactable\n\\*/\nInteractable.prototype.dropzone = function (options) {\n if (utils.is.object(options)) {\n this.options.drop.enabled = options.enabled === false? false: true;\n\n if (utils.is.function(options.ondrop) ) { this.events.ondrop = options.ondrop ; }\n if (utils.is.function(options.ondropactivate) ) { this.events.ondropactivate = options.ondropactivate ; }\n if (utils.is.function(options.ondropdeactivate)) { this.events.ondropdeactivate = options.ondropdeactivate; }\n if (utils.is.function(options.ondragenter) ) { this.events.ondragenter = options.ondragenter ; }\n if (utils.is.function(options.ondragleave) ) { this.events.ondragleave = options.ondragleave ; }\n if (utils.is.function(options.ondropmove) ) { this.events.ondropmove = options.ondropmove ; }\n\n if (/^(pointer|center)$/.test(options.overlap)) {\n this.options.drop.overlap = options.overlap;\n }\n else if (utils.is.number(options.overlap)) {\n this.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0);\n }\n if ('accept' in options) {\n this.options.drop.accept = options.accept;\n }\n if ('checker' in options) {\n this.options.drop.checker = options.checker;\n }\n\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drop.enabled = options;\n\n if (!options) {\n this.ondragenter = this.ondragleave = this.ondrop\n = this.ondropactivate = this.ondropdeactivate = null;\n }\n\n return this;\n }\n\n return this.options.drop;\n};\n\nInteractable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) {\n let dropped = false;\n\n // if the dropzone has no rect (eg. display: none)\n // call the custom dropChecker or just return false\n if (!(rect = rect || this.getRect(dropElement))) {\n return (this.options.drop.checker\n ? this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement)\n : false);\n }\n\n const dropOverlap = this.options.drop.overlap;\n\n if (dropOverlap === 'pointer') {\n const origin = utils.getOriginXY(draggable, draggableElement, 'drag');\n const page = utils.getPageXY(dragEvent);\n\n page.x += origin.x;\n page.y += origin.y;\n\n const horizontal = (page.x > rect.left) && (page.x < rect.right);\n const vertical = (page.y > rect.top ) && (page.y < rect.bottom);\n\n dropped = horizontal && vertical;\n }\n\n const dragRect = draggable.getRect(draggableElement);\n\n if (dragRect && dropOverlap === 'center') {\n const cx = dragRect.left + dragRect.width / 2;\n const cy = dragRect.top + dragRect.height / 2;\n\n dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom;\n }\n\n if (dragRect && utils.is.number(dropOverlap)) {\n const overlapArea = (Math.max(0, Math.min(rect.right , dragRect.right ) - Math.max(rect.left, dragRect.left))\n * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top , dragRect.top )));\n\n const overlapRatio = overlapArea / (dragRect.width * dragRect.height);\n\n dropped = overlapRatio >= dropOverlap;\n }\n\n if (this.options.drop.checker) {\n dropped = this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement);\n }\n\n return dropped;\n};\n\nInteractable.signals.on('unset', function ({ interactable }) {\n interactable.dropzone(false);\n});\n\nInteractable.settingsMethods.push('dropChecker');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.dropTarget = null; // the dropzone a drag target might be dropped into\n interaction.dropElement = null; // the element at the time of checking\n interaction.prevDropTarget = null; // the dropzone that was recently dragged away from\n interaction.prevDropElement = null; // the element at the time of checking\n interaction.dropEvents = null; // the dropEvents related to the current drag event\n\n interaction.activeDrops = {\n dropzones: [], // the dropzones that are mentioned below\n elements : [], // elements of dropzones that accept the target draggable\n rects : [], // the rects of the elements mentioned above\n };\n\n});\n\nInteraction.signals.on('stop', function ({ interaction }) {\n interaction.dropTarget = interaction.dropElement =\n interaction.prevDropTarget = interaction.prevDropElement = null;\n});\n\n/*\\\n * interact.dynamicDrop\n [ method ]\n *\n * Returns or sets whether the dimensions of dropzone elements are\n * calculated on every dragmove or only on dragstart for the default\n * dropChecker\n *\n - newValue (boolean) #optional True to check on each move. False to check only before start\n = (boolean | interact) The current setting or interact\n\\*/\ninteract.dynamicDrop = function (newValue) {\n if (utils.is.bool(newValue)) {\n //if (dragging && dynamicDrop !== newValue && !newValue) {\n //calcRects(dropzones);\n //}\n\n dynamicDrop = newValue;\n\n return interact;\n }\n return dynamicDrop;\n};\n\nutils.merge(Interactable.eventTypes, [\n 'dragenter',\n 'dragleave',\n 'dropactivate',\n 'dropdeactivate',\n 'dropmove',\n 'drop',\n]);\nactions.methodDict.drop = 'dropzone';\n\ndefaultOptions.drop = drop.defaults;\n\nmodule.exports = drop;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst gesture = {\n defaults: {\n enabled : false,\n origin : null,\n restrict: null,\n },\n\n checker: function (pointer, event, interactable, element, interaction) {\n if (interaction.pointerIds.length >= 2) {\n return { name: 'gesture' };\n }\n\n return null;\n },\n\n getCursor: function () {\n return '';\n },\n};\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturestart') { return; }\n iEvent.ds = 0;\n\n interaction.gesture.startDistance = interaction.gesture.prevDistance = iEvent.distance;\n interaction.gesture.startAngle = interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.scale = 1;\n});\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturemove') { return; }\n\n iEvent.ds = iEvent.scale - interaction.gesture.scale;\n\n interaction.target.fire(iEvent);\n\n interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.prevDistance = iEvent.distance;\n\n if (iEvent.scale !== Infinity\n && iEvent.scale !== null\n && iEvent.scale !== undefined\n && !isNaN(iEvent.scale)) {\n\n interaction.gesture.scale = iEvent.scale;\n }\n});\n\n/*\\\n * Interactable.gesturable\n [ method ]\n *\n * Gets or sets whether multitouch gestures can be performed on the\n * Interactable's element\n *\n = (boolean) Indicates if this can be the target of gesture events\n | var isGestureable = interact(element).gesturable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on gesture events (makes the Interactable gesturable)\n = (object) this Interactable\n | interact(element).gesturable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // limit multiple gestures.\n | // See the explanation in @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n\\*/\nInteractable.prototype.gesturable = function (options) {\n if (utils.is.object(options)) {\n this.options.gesture.enabled = options.enabled === false? false: true;\n this.setPerAction('gesture', options);\n this.setOnEvents('gesture', options);\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.gesture.enabled = options;\n\n if (!options) {\n this.ongesturestart = this.ongesturestart = this.ongestureend = null;\n }\n\n return this;\n }\n\n return this.options.gesture;\n};\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action, event, starting, ending, deltaSource }) {\n if (action !== 'gesture') { return; }\n\n const pointers = interaction.pointers;\n\n iEvent.touches = [pointers[0], pointers[1]];\n\n if (starting) {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = 1;\n iEvent.ds = 0;\n iEvent.angle = utils.touchAngle(pointers, undefined, deltaSource);\n iEvent.da = 0;\n }\n else if (ending || event instanceof InteractEvent) {\n iEvent.distance = interaction.prevEvent.distance;\n iEvent.box = interaction.prevEvent.box;\n iEvent.scale = interaction.prevEvent.scale;\n iEvent.ds = iEvent.scale - 1;\n iEvent.angle = interaction.prevEvent.angle;\n iEvent.da = iEvent.angle - interaction.gesture.startAngle;\n }\n else {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = iEvent.distance / interaction.gesture.startDistance;\n iEvent.angle = utils.touchAngle(pointers, interaction.gesture.prevAngle, deltaSource);\n\n iEvent.ds = iEvent.scale - interaction.gesture.prevScale;\n iEvent.da = iEvent.angle - interaction.gesture.prevAngle;\n }\n});\n\nInteraction.signals.on('new', function (interaction) {\n interaction.gesture = {\n start: { x: 0, y: 0 },\n\n startDistance: 0, // distance between two touches of touchStart\n prevDistance : 0,\n distance : 0,\n\n scale: 1, // gesture.distance / gesture.startDistance\n\n startAngle: 0, // angle of line joining two touches\n prevAngle : 0, // angle of the previous gesture event\n };\n});\n\nactions.gesture = gesture;\nactions.names.push('gesture');\nutils.merge(Interactable.eventTypes, [\n 'gesturestart',\n 'gesturemove',\n 'gestureend',\n]);\nactions.methodDict.gesture = 'gesturable';\n\ndefaultOptions.gesture = gesture.defaults;\n\nmodule.exports = gesture;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\n// Less Precision with touch input\nconst defaultMargin = browser.supportsTouch || browser.supportsPointerEvent? 20: 10;\n\nconst resize = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n square: false,\n preserveAspectRatio: false,\n axis: 'xy',\n\n // use default margin\n margin: NaN,\n\n // object with props left, right, top, bottom which are\n // true/false values to resize when the pointer is over that edge,\n // CSS selectors to match the handles for each direction\n // or the Elements for each handle\n edges: null,\n\n // a value of 'none' will limit the resize rect to a minimum of 0x0\n // 'negate' will alow the rect to have negative width/height\n // 'reposition' will keep the width/height positive by swapping\n // the top and bottom edges and/or swapping the left and right edges\n invert: 'none',\n },\n\n checker: function (pointer, event, interactable, element, interaction, rect) {\n if (!rect) { return null; }\n\n const page = utils.extend({}, interaction.curCoords.page);\n const options = interactable.options;\n\n if (options.resize.enabled) {\n const resizeOptions = options.resize;\n const resizeEdges = { left: false, right: false, top: false, bottom: false };\n\n // if using resize.edges\n if (utils.is.object(resizeOptions.edges)) {\n for (const edge in resizeEdges) {\n resizeEdges[edge] = checkResizeEdge(edge,\n resizeOptions.edges[edge],\n page,\n interaction._eventTarget,\n element,\n rect,\n resizeOptions.margin || defaultMargin);\n }\n\n resizeEdges.left = resizeEdges.left && !resizeEdges.right;\n resizeEdges.top = resizeEdges.top && !resizeEdges.bottom;\n\n if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) {\n return {\n name: 'resize',\n edges: resizeEdges,\n };\n }\n }\n else {\n const right = options.resize.axis !== 'y' && page.x > (rect.right - defaultMargin);\n const bottom = options.resize.axis !== 'x' && page.y > (rect.bottom - defaultMargin);\n\n if (right || bottom) {\n return {\n name: 'resize',\n axes: (right? 'x' : '') + (bottom? 'y' : ''),\n };\n }\n }\n }\n\n return null;\n },\n\n cursors: (browser.isIe9OrOlder ? {\n x : 'e-resize',\n y : 's-resize',\n xy: 'se-resize',\n\n top : 'n-resize',\n left : 'w-resize',\n bottom : 's-resize',\n right : 'e-resize',\n topleft : 'se-resize',\n bottomright: 'se-resize',\n topright : 'ne-resize',\n bottomleft : 'ne-resize',\n } : {\n x : 'ew-resize',\n y : 'ns-resize',\n xy: 'nwse-resize',\n\n top : 'ns-resize',\n left : 'ew-resize',\n bottom : 'ns-resize',\n right : 'ew-resize',\n topleft : 'nwse-resize',\n bottomright: 'nwse-resize',\n topright : 'nesw-resize',\n bottomleft : 'nesw-resize',\n }),\n\n getCursor: function (action) {\n if (action.axis) {\n return resize.cursors[action.name + action.axis];\n }\n else if (action.edges) {\n let cursorKey = '';\n const edgeNames = ['top', 'bottom', 'left', 'right'];\n\n for (let i = 0; i < 4; i++) {\n if (action.edges[edgeNames[i]]) {\n cursorKey += edgeNames[i];\n }\n }\n\n return resize.cursors[cursorKey];\n }\n },\n};\n\n// resizestart\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'resizestart' || !interaction.prepared.edges) {\n return;\n }\n\n const startRect = interaction.target.getRect(interaction.element);\n const resizeOptions = interaction.target.options.resize;\n\n /*\n * When using the `resizable.square` or `resizable.preserveAspectRatio` options, resizing from one edge\n * will affect another. E.g. with `resizable.square`, resizing to make the right edge larger will make\n * the bottom edge larger by the same amount. We call these 'linked' edges. Any linked edges will depend\n * on the active edges and the edge being interacted with.\n */\n if (resizeOptions.square || resizeOptions.preserveAspectRatio) {\n const linkedEdges = utils.extend({}, interaction.prepared.edges);\n\n linkedEdges.top = linkedEdges.top || (linkedEdges.left && !linkedEdges.bottom);\n linkedEdges.left = linkedEdges.left || (linkedEdges.top && !linkedEdges.right );\n linkedEdges.bottom = linkedEdges.bottom || (linkedEdges.right && !linkedEdges.top );\n linkedEdges.right = linkedEdges.right || (linkedEdges.bottom && !linkedEdges.left );\n\n interaction.prepared._linkedEdges = linkedEdges;\n }\n else {\n interaction.prepared._linkedEdges = null;\n }\n\n // if using `resizable.preserveAspectRatio` option, record aspect ratio at the start of the resize\n if (resizeOptions.preserveAspectRatio) {\n interaction.resizeStartAspectRatio = startRect.width / startRect.height;\n }\n\n interaction.resizeRects = {\n start : startRect,\n current : utils.extend({}, startRect),\n inverted : utils.extend({}, startRect),\n previous : utils.extend({}, startRect),\n delta : {\n left: 0, right : 0, width : 0,\n top : 0, bottom: 0, height: 0,\n },\n };\n\n iEvent.rect = interaction.resizeRects.inverted;\n iEvent.deltaRect = interaction.resizeRects.delta;\n});\n\n// resizemove\nInteractEvent.signals.on('new', function ({ iEvent, phase, interaction }) {\n if (phase !== 'move' || !interaction.prepared.edges) { return; }\n\n const resizeOptions = interaction.target.options.resize;\n const invert = resizeOptions.invert;\n const invertible = invert === 'reposition' || invert === 'negate';\n\n let edges = interaction.prepared.edges;\n\n const start = interaction.resizeRects.start;\n const current = interaction.resizeRects.current;\n const inverted = interaction.resizeRects.inverted;\n const delta = interaction.resizeRects.delta;\n const previous = utils.extend(interaction.resizeRects.previous, inverted);\n const originalEdges = edges;\n\n let dx = iEvent.dx;\n let dy = iEvent.dy;\n\n if (resizeOptions.preserveAspectRatio || resizeOptions.square) {\n // `resize.preserveAspectRatio` takes precedence over `resize.square`\n const startAspectRatio = resizeOptions.preserveAspectRatio\n ? interaction.resizeStartAspectRatio\n : 1;\n\n edges = interaction.prepared._linkedEdges;\n\n if ((originalEdges.left && originalEdges.bottom)\n || (originalEdges.right && originalEdges.top)) {\n dy = -dx / startAspectRatio;\n }\n else if (originalEdges.left || originalEdges.right ) { dy = dx / startAspectRatio; }\n else if (originalEdges.top || originalEdges.bottom) { dx = dy * startAspectRatio; }\n }\n\n // update the 'current' rect without modifications\n if (edges.top ) { current.top += dy; }\n if (edges.bottom) { current.bottom += dy; }\n if (edges.left ) { current.left += dx; }\n if (edges.right ) { current.right += dx; }\n\n if (invertible) {\n // if invertible, copy the current rect\n utils.extend(inverted, current);\n\n if (invert === 'reposition') {\n // swap edge values if necessary to keep width/height positive\n let swap;\n\n if (inverted.top > inverted.bottom) {\n swap = inverted.top;\n\n inverted.top = inverted.bottom;\n inverted.bottom = swap;\n }\n if (inverted.left > inverted.right) {\n swap = inverted.left;\n\n inverted.left = inverted.right;\n inverted.right = swap;\n }\n }\n }\n else {\n // if not invertible, restrict to minimum of 0x0 rect\n inverted.top = Math.min(current.top, start.bottom);\n inverted.bottom = Math.max(current.bottom, start.top);\n inverted.left = Math.min(current.left, start.right);\n inverted.right = Math.max(current.right, start.left);\n }\n\n inverted.width = inverted.right - inverted.left;\n inverted.height = inverted.bottom - inverted.top ;\n\n for (const edge in inverted) {\n delta[edge] = inverted[edge] - previous[edge];\n }\n\n iEvent.edges = interaction.prepared.edges;\n iEvent.rect = inverted;\n iEvent.deltaRect = delta;\n});\n\n/*\\\n * Interactable.resizable\n [ method ]\n *\n * Gets or sets whether resize actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of resize elements\n | var isResizeable = interact('input[type=text]').resizable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on resize events (object makes the Interactable resizable)\n = (object) This Interactable\n | interact(element).resizable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | edges: {\n | top : true, // Use pointer coords to check for resize.\n | left : false, // Disable resizing from left edge.\n | bottom: '.resize-s',// Resize if pointer target matches selector\n | right : handleEl // Resize if pointer target is the given Element\n | },\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height are adjusted at a 1:1 ratio.\n | square: false,\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height maintain the aspect ratio they had when resizing started.\n | preserveAspectRatio: false,\n |\n | // a value of 'none' will limit the resize rect to a minimum of 0x0\n | // 'negate' will allow the rect to have negative width/height\n | // 'reposition' will keep the width/height positive by swapping\n | // the top and bottom edges and/or swapping the left and right edges\n | invert: 'none' || 'negate' || 'reposition'\n |\n | // limit multiple resizes.\n | // See the explanation in the @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n \\*/\nInteractable.prototype.resizable = function (options) {\n if (utils.is.object(options)) {\n this.options.resize.enabled = options.enabled === false? false: true;\n this.setPerAction('resize', options);\n this.setOnEvents('resize', options);\n\n if (/^x$|^y$|^xy$/.test(options.axis)) {\n this.options.resize.axis = options.axis;\n }\n else if (options.axis === null) {\n this.options.resize.axis = defaultOptions.resize.axis;\n }\n\n if (utils.is.bool(options.preserveAspectRatio)) {\n this.options.resize.preserveAspectRatio = options.preserveAspectRatio;\n }\n else if (utils.is.bool(options.square)) {\n this.options.resize.square = options.square;\n }\n\n return this;\n }\n if (utils.is.bool(options)) {\n this.options.resize.enabled = options;\n\n if (!options) {\n this.onresizestart = this.onresizestart = this.onresizeend = null;\n }\n\n return this;\n }\n return this.options.resize;\n};\n\nfunction checkResizeEdge (name, value, page, element, interactableElement, rect, margin) {\n // false, '', undefined, null\n if (!value) { return false; }\n\n // true value, use pointer coords and element rect\n if (value === true) {\n // if dimensions are negative, \"switch\" edges\n const width = utils.is.number(rect.width )? rect.width : rect.right - rect.left;\n const height = utils.is.number(rect.height)? rect.height : rect.bottom - rect.top ;\n\n if (width < 0) {\n if (name === 'left' ) { name = 'right'; }\n else if (name === 'right') { name = 'left' ; }\n }\n if (height < 0) {\n if (name === 'top' ) { name = 'bottom'; }\n else if (name === 'bottom') { name = 'top' ; }\n }\n\n if (name === 'left' ) { return page.x < ((width >= 0? rect.left: rect.right ) + margin); }\n if (name === 'top' ) { return page.y < ((height >= 0? rect.top : rect.bottom) + margin); }\n\n if (name === 'right' ) { return page.x > ((width >= 0? rect.right : rect.left) - margin); }\n if (name === 'bottom') { return page.y > ((height >= 0? rect.bottom: rect.top ) - margin); }\n }\n\n // the remaining checks require an element\n if (!utils.is.element(element)) { return false; }\n\n return utils.is.element(value)\n // the value is an element to use as a resize handle\n ? value === element\n // otherwise check if element matches value as selector\n : utils.matchesUpTo(element, value, interactableElement);\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.resizeAxes = 'xy';\n});\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action }) {\n if (action !== 'resize' || !interaction.resizeAxes) { return; }\n\n const options = interaction.target.options;\n\n if (options.resize.square) {\n if (interaction.resizeAxes === 'y') {\n iEvent.dx = iEvent.dy;\n }\n else {\n iEvent.dy = iEvent.dx;\n }\n iEvent.axes = 'xy';\n }\n else {\n iEvent.axes = interaction.resizeAxes;\n\n if (interaction.resizeAxes === 'x') {\n iEvent.dy = 0;\n }\n else if (interaction.resizeAxes === 'y') {\n iEvent.dx = 0;\n }\n }\n});\n\nactions.resize = resize;\nactions.names.push('resize');\nutils.merge(Interactable.eventTypes, [\n 'resizestart',\n 'resizemove',\n 'resizeinertiastart',\n 'resizeinertiaresume',\n 'resizeend',\n]);\nactions.methodDict.resize = 'resizable';\n\ndefaultOptions.resize = resize.defaults;\n\nmodule.exports = resize;\n","const raf = require('./utils/raf');\nconst getWindow = require('./utils/window').getWindow;\nconst is = require('./utils/is');\nconst domUtils = require('./utils/domUtils');\nconst Interaction = require('./Interaction');\nconst defaultOptions = require('./defaultOptions');\n\nconst autoScroll = {\n defaults: {\n enabled : false,\n container: null, // the item that is scrolled (Window or HTMLElement)\n margin : 60,\n speed : 300, // the scroll speed in pixels per second\n },\n\n interaction: null,\n i: null, // the handle returned by window.setInterval\n x: 0, y: 0, // Direction each pulse is to scroll in\n\n isScrolling: false,\n prevTime: 0,\n\n start: function (interaction) {\n autoScroll.isScrolling = true;\n raf.cancel(autoScroll.i);\n\n autoScroll.interaction = interaction;\n autoScroll.prevTime = new Date().getTime();\n autoScroll.i = raf.request(autoScroll.scroll);\n },\n\n stop: function () {\n autoScroll.isScrolling = false;\n raf.cancel(autoScroll.i);\n },\n\n // scroll the window by the values in scroll.x/y\n scroll: function () {\n const options = autoScroll.interaction.target.options[autoScroll.interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(autoScroll.interaction.element);\n const now = new Date().getTime();\n // change in time in seconds\n const dt = (now - autoScroll.prevTime) / 1000;\n // displacement\n const s = options.speed * dt;\n\n if (s >= 1) {\n if (is.window(container)) {\n container.scrollBy(autoScroll.x * s, autoScroll.y * s);\n }\n else if (container) {\n container.scrollLeft += autoScroll.x * s;\n container.scrollTop += autoScroll.y * s;\n }\n\n autoScroll.prevTime = now;\n }\n\n if (autoScroll.isScrolling) {\n raf.cancel(autoScroll.i);\n autoScroll.i = raf.request(autoScroll.scroll);\n }\n },\n check: function (interactable, actionName) {\n const options = interactable.options;\n\n return options[actionName].autoScroll && options[actionName].autoScroll.enabled;\n },\n onInteractionMove: function ({ interaction, pointer }) {\n if (!(interaction.interacting()\n && autoScroll.check(interaction.target, interaction.prepared.name))) {\n return;\n }\n\n if (interaction.simulation) {\n autoScroll.x = autoScroll.y = 0;\n return;\n }\n\n let top;\n let right;\n let bottom;\n let left;\n\n const options = interaction.target.options[interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(interaction.element);\n\n if (is.window(container)) {\n left = pointer.clientX < autoScroll.margin;\n top = pointer.clientY < autoScroll.margin;\n right = pointer.clientX > container.innerWidth - autoScroll.margin;\n bottom = pointer.clientY > container.innerHeight - autoScroll.margin;\n }\n else {\n const rect = domUtils.getElementClientRect(container);\n\n left = pointer.clientX < rect.left + autoScroll.margin;\n top = pointer.clientY < rect.top + autoScroll.margin;\n right = pointer.clientX > rect.right - autoScroll.margin;\n bottom = pointer.clientY > rect.bottom - autoScroll.margin;\n }\n\n autoScroll.x = (right ? 1: left? -1: 0);\n autoScroll.y = (bottom? 1: top? -1: 0);\n\n if (!autoScroll.isScrolling) {\n // set the autoScroll properties to those of the target\n autoScroll.margin = options.margin;\n autoScroll.speed = options.speed;\n\n autoScroll.start(interaction);\n }\n },\n};\n\nInteraction.signals.on('stop-active', function () {\n autoScroll.stop();\n});\n\nInteraction.signals.on('action-move', autoScroll.onInteractionMove);\n\ndefaultOptions.perAction.autoScroll = autoScroll.defaults;\n\nmodule.exports = autoScroll;\n","const Interactable = require('../Interactable');\nconst actions = require('../actions/base');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.ignoreFrom\n [ method ]\n *\n * If the target of the `mousedown`, `pointerdown` or `touchstart`\n * event or any of it's parents match the given CSS selector or\n * Element, no drag/resize/gesture is started.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to not ignore any elements\n = (string | Element | object) The current ignoreFrom value or this Interactable\n **\n | interact(element, { ignoreFrom: document.getElementById('no-action') });\n | // or\n | interact(element).ignoreFrom('input, textarea, a');\n\\*/\nInteractable.prototype.ignoreFrom = function (newValue) {\n return this._backCompatOption('ignoreFrom', newValue);\n};\n\n/*\\\n * Interactable.allowFrom\n [ method ]\n *\n * A drag/resize/gesture is started only If the target of the\n * `mousedown`, `pointerdown` or `touchstart` event or any of it's\n * parents match the given CSS selector or Element.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to allow from any element\n = (string | Element | object) The current allowFrom value or this Interactable\n **\n | interact(element, { allowFrom: document.getElementById('drag-handle') });\n | // or\n | interact(element).allowFrom('.handle');\n\\*/\nInteractable.prototype.allowFrom = function (newValue) {\n return this._backCompatOption('allowFrom', newValue);\n};\n\nInteractable.prototype.testIgnore = function (ignoreFrom, interactableElement, element) {\n if (!ignoreFrom || !is.element(element)) { return false; }\n\n if (is.string(ignoreFrom)) {\n return domUtils.matchesUpTo(element, ignoreFrom, interactableElement);\n }\n else if (is.element(ignoreFrom)) {\n return domUtils.nodeContains(ignoreFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testAllow = function (allowFrom, interactableElement, element) {\n if (!allowFrom) { return true; }\n\n if (!is.element(element)) { return false; }\n\n if (is.string(allowFrom)) {\n return domUtils.matchesUpTo(element, allowFrom, interactableElement);\n }\n else if (is.element(allowFrom)) {\n return domUtils.nodeContains(allowFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testIgnoreAllow = function (options, interactableElement, eventTarget) {\n return (!this.testIgnore(options.ignoreFrom, interactableElement, eventTarget)\n && this.testAllow(options.allowFrom, interactableElement, eventTarget));\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (event.buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\n","const interact = require('../interact');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst actions = require('../actions/base');\nconst defaultOptions = require('../defaultOptions');\nconst browser = require('../utils/browser');\nconst scope = require('../scope');\nconst utils = require('../utils');\nconst signals = require('../utils/Signals').new();\n\nrequire('./InteractableMethods');\n\nconst autoStart = {\n signals,\n withinInteractionLimit,\n // Allow this many interactions to happen simultaneously\n maxInteractions: Infinity,\n defaults: {\n perAction: {\n manualStart: false,\n max: Infinity,\n maxPerElement: 1,\n allowFrom: null,\n ignoreFrom: null,\n },\n },\n setActionDefaults: function (action) {\n utils.extend(action.defaults, autoStart.defaults.perAction);\n },\n};\n\n// set cursor style on mousedown\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget }) {\n if (interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\n// set cursor style on mousemove\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget }) {\n if (!interaction.mouse\n || interaction.pointerIsDown\n || interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\nInteraction.signals.on('move', function (arg) {\n const { interaction, event } = arg;\n\n if (!interaction.pointerIsDown\n || interaction.interacting()\n || !interaction.pointerWasMoved\n || !interaction.prepared.name) {\n return;\n }\n\n signals.fire('before-start', arg);\n\n const target = interaction.target;\n\n if (interaction.prepared.name && target) {\n // check manualStart and interaction limit\n if (target.options[interaction.prepared.name].manualStart\n || !withinInteractionLimit(target, interaction.element, interaction.prepared)) {\n interaction.stop(event);\n }\n else {\n interaction.start(interaction.prepared, target, interaction.element);\n }\n }\n});\n\n// Check if the current target supports the action.\n// If so, return the validated action. Otherwise, return null\nfunction validateAction (action, interactable, element, eventTarget) {\n if (utils.is.object(action)\n && interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget)\n && interactable.options[action.name].enabled\n && withinInteractionLimit(interactable, element, action)) {\n return action;\n }\n\n return null;\n}\n\nfunction validateSelector (interaction, pointer, event, matches, matchElements, eventTarget) {\n for (let i = 0, len = matches.length; i < len; i++) {\n const match = matches[i];\n const matchElement = matchElements[i];\n const action = validateAction(match.getAction(pointer, event, interaction, matchElement),\n match,\n matchElement,\n eventTarget);\n\n if (action) {\n return {\n action,\n target: match,\n element: matchElement,\n };\n }\n }\n\n return {};\n}\n\nfunction getActionInfo (interaction, pointer, event, eventTarget) {\n let matches = [];\n let matchElements = [];\n\n let element = eventTarget;\n let action = null;\n\n function pushMatches (interactable, selector, context) {\n const elements = (browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined);\n\n if (utils.matchesSelector(element, selector, elements)) {\n\n matches.push(interactable);\n matchElements.push(element);\n }\n }\n\n while (utils.is.element(element)) {\n matches = [];\n matchElements = [];\n\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && (action = validateAction(elementInteractable.getAction(pointer, event, interaction, element, eventTarget),\n elementInteractable,\n element,\n eventTarget))\n && !elementInteractable.options[action.name].manualStart) {\n return {\n element,\n action,\n target: elementInteractable,\n };\n }\n else {\n scope.interactables.forEachSelector(pushMatches, element);\n\n const actionInfo = validateSelector(interaction, pointer, event, matches, matchElements, eventTarget);\n\n if (actionInfo.action\n && !actionInfo.target.options[actionInfo.action.name].manualStart) {\n return actionInfo;\n }\n }\n\n element = utils.parentNode(element);\n }\n\n return {};\n}\n\nfunction prepare (interaction, { action, target, element }) {\n action = action || {};\n\n if (interaction.target && interaction.target.options.styleCursor) {\n interaction.target._doc.documentElement.style.cursor = '';\n }\n\n interaction.target = target;\n interaction.element = element;\n utils.copyAction(interaction.prepared, action);\n\n if (target && target.options.styleCursor) {\n const cursor = action? actions[action.name].getCursor(action) : '';\n interaction.target._doc.documentElement.style.cursor = cursor;\n }\n\n signals.fire('prepared', { interaction: interaction });\n}\n\nInteraction.signals.on('stop', function ({ interaction }) {\n const target = interaction.target;\n\n if (target && target.options.styleCursor) {\n target._doc.documentElement.style.cursor = '';\n }\n});\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (utils.is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (utils.is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n const buttons = event.buttons || ({\n 0: 1,\n 1: 4,\n 3: 8,\n 4: 16,\n })[event.button];\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\nfunction withinInteractionLimit (interactable, element, action) {\n const options = interactable.options;\n const maxActions = options[action.name].max;\n const maxPerElement = options[action.name].maxPerElement;\n let activeInteractions = 0;\n let targetCount = 0;\n let targetElementCount = 0;\n\n // no actions if any of these values == 0\n if (!(maxActions && maxPerElement && autoStart.maxInteractions)) { return; }\n\n for (let i = 0, len = scope.interactions.length; i < len; i++) {\n const interaction = scope.interactions[i];\n const otherAction = interaction.prepared.name;\n\n if (!interaction.interacting()) { continue; }\n\n activeInteractions++;\n\n if (activeInteractions >= autoStart.maxInteractions) {\n return false;\n }\n\n if (interaction.target !== interactable) { continue; }\n\n targetCount += (otherAction === action.name)|0;\n\n if (targetCount >= maxActions) {\n return false;\n }\n\n if (interaction.element === element) {\n targetElementCount++;\n\n if (otherAction !== action.name || targetElementCount >= maxPerElement) {\n return false;\n }\n }\n }\n\n return autoStart.maxInteractions > 0;\n}\n\n/*\\\n * interact.maxInteractions\n [ method ]\n **\n * Returns or sets the maximum number of concurrent interactions allowed.\n * By default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables\n * and elements, you need to enable it in the draggable, resizable and\n * gesturable `'max'` and `'maxPerElement'` options.\n **\n - newValue (number) #optional Any number. newValue <= 0 means no interactions.\n\\*/\ninteract.maxInteractions = function (newValue) {\n if (utils.is.number(newValue)) {\n autoStart.maxInteractions = newValue;\n\n return this;\n }\n\n return autoStart.maxInteractions;\n};\n\nInteractable.settingsMethods.push('styleCursor');\nInteractable.settingsMethods.push('actionChecker');\nInteractable.settingsMethods.push('ignoreFrom');\nInteractable.settingsMethods.push('allowFrom');\n\ndefaultOptions.base.actionChecker = null;\ndefaultOptions.base.styleCursor = true;\n\nutils.extend(defaultOptions.perAction, autoStart.defaults.perAction);\n\nmodule.exports = autoStart;\n","const autoStart = require('./base');\nconst Interaction = require('../Interaction');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.delayTimer = null;\n});\n\nautoStart.signals.on('prepared', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.delayTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.target, interaction.element);\n }, delay);\n }\n});\n\nInteraction.signals.on('move', function ({ interaction, duplicate }) {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.delayTimer);\n }\n});\n\n// prevent regular down->move autoStart\nautoStart.signals.on('before-start', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.prepared.name = null;\n }\n});\n","const autoStart = require('./base');\nconst scope = require('../scope');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\n\nconst { matchesSelector, parentNode } = require('../utils/domUtils');\n\nautoStart.setActionDefaults(require('../actions/drag'));\n\nautoStart.signals.on('before-start', function ({ interaction, eventTarget, dx, dy }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // check if a drag is in the correct axis\n const absX = Math.abs(dx);\n const absY = Math.abs(dy);\n const options = interaction.target.options.drag;\n const startAxis = options.startAxis;\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy');\n\n interaction.prepared.axis = options.lockAxis === 'start'\n ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n : options.lockAxis;\n\n // if the movement isn't in the startAxis of the interactable\n if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) {\n // cancel the prepared action\n interaction.prepared.name = null;\n\n // then try to get a drag from another ineractable\n\n if (!interaction.prepared.name) {\n\n let element = eventTarget;\n\n const getDraggable = function (interactable, selector, context) {\n const elements = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n if (interactable === interaction.target) { return; }\n\n if (!options.manualStart\n && !interactable.testIgnoreAllow(options, element, eventTarget)\n && matchesSelector(element, selector, elements)) {\n\n const action = interactable.getAction(interaction.downPointer,\n interaction.downEvent,\n interaction,\n element);\n\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, interactable)\n && autoStart.validateAction(action, interactable, element, eventTarget)) {\n\n return interactable;\n }\n }\n };\n\n let action = null;\n\n // check all interactables\n while (is.element(element)) {\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && elementInteractable !== interaction.target\n && !elementInteractable.options.drag.manualStart) {\n\n action = elementInteractable.getAction(interaction.downPointer, interaction.downEvent, interaction, element);\n }\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, elementInteractable)) {\n\n interaction.prepared.name = 'drag';\n interaction.target = elementInteractable;\n interaction.element = element;\n break;\n }\n\n const selectorInteractable = scope.interactables.forEachSelector(getDraggable, element);\n\n if (selectorInteractable) {\n interaction.prepared.name = 'drag';\n interaction.target = selectorInteractable;\n interaction.element = element;\n break;\n }\n\n element = parentNode(element);\n }\n }\n }\n});\n\nfunction checkStartAxis (startAxis, interactable) {\n if (!interactable) { return false; }\n\n const thisAxis = interactable.options.drag.startAxis;\n\n return (startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis);\n}\n","require('./base').setActionDefaults(require('../actions/gesture'));\n","require('./base').setActionDefaults(require('../actions/resize'));\n","module.exports = {\n base: {\n accept : null,\n preventDefault: 'auto',\n deltaSource : 'page',\n },\n\n perAction: {\n origin: { x: 0, y: 0 },\n\n // only allow left button by default\n // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n mouseButtons: 1,\n\n inertia: {\n enabled : false,\n resistance : 10, // the lambda in exponential decay\n minSpeed : 100, // target speed must be above this for inertia to start\n endSpeed : 10, // the speed at which inertia is slow enough to stop\n allowResume : true, // allow resuming an action in inertia phase\n smoothEndDuration: 300, // animate to snap/restrict endOnly if there's no inertia\n },\n },\n};\n","/* browser entry point */\n\n// Legacy browser support\nrequire('./legacyBrowsers');\n\n// inertia\nrequire('./inertia');\n\n// modifiers\nrequire('./modifiers/snap');\nrequire('./modifiers/restrict');\n\n// pointerEvents\nrequire('./pointerEvents/base');\nrequire('./pointerEvents/holdRepeat');\nrequire('./pointerEvents/interactableTargets');\n\n// delay\nrequire('./autoStart/delay');\n\n// actions\nrequire('./actions/gesture');\nrequire('./actions/resize');\nrequire('./actions/drag');\nrequire('./actions/drop');\n\n// load these modifiers after resize is loaded\nrequire('./modifiers/snapSize');\nrequire('./modifiers/restrictEdges');\nrequire('./modifiers/restrictSize');\n\n// autoStart actions\nrequire('./autoStart/gesture');\nrequire('./autoStart/resize');\nrequire('./autoStart/drag');\n\n// Interactable preventDefault setting\nrequire('./interactablePreventDefault.js');\n\n// autoScroll\nrequire('./autoScroll');\n\n// export interact\nmodule.exports = require('./interact');\n","const InteractEvent = require('./InteractEvent');\nconst Interaction = require('./Interaction');\nconst modifiers = require('./modifiers');\nconst utils = require('./utils');\nconst animationFrame = require('./utils/raf');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.inertiaStatus = {\n active : false,\n smoothEnd : false,\n allowResume: false,\n\n startEvent: null,\n upCoords : {},\n\n xe: 0, ye: 0,\n sx: 0, sy: 0,\n\n t0: 0,\n vx0: 0, vys: 0,\n duration: 0,\n\n lambda_v0: 0,\n one_ve_v0: 0,\n i : null,\n };\n\n interaction.boundInertiaFrame = () => inertiaFrame .apply(interaction);\n interaction.boundSmoothEndFrame = () => smoothEndFrame.apply(interaction);\n});\n\nInteraction.signals.on('down', function ({ interaction, event, pointer, eventTarget }) {\n const status = interaction.inertiaStatus;\n\n // Check if the down event hits the current inertia target\n if (status.active) {\n let element = eventTarget;\n\n // climb up the DOM tree from the event target\n while (utils.is.element(element)) {\n\n // if interaction element is the current inertia target element\n if (element === interaction.element) {\n // stop inertia\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n\n // update pointers to the down event's coordinates\n interaction.updatePointer(pointer);\n utils.setCoords(interaction.curCoords, interaction.pointers);\n\n // fire appropriate signals\n const signalArg = { interaction };\n Interaction.signals.fire('before-action-move', signalArg);\n Interaction.signals.fire('action-resume' , signalArg);\n\n // fire a reume event\n const resumeEvent = new InteractEvent(interaction,\n event,\n interaction.prepared.name,\n 'inertiaresume',\n interaction.element);\n\n interaction.target.fire(resumeEvent);\n interaction.prevEvent = resumeEvent;\n modifiers.resetStatuses(interaction.modifierStatuses);\n\n utils.copyCoords(interaction.prevCoords, interaction.curCoords);\n break;\n }\n\n element = utils.parentNode(element);\n }\n }\n});\n\nInteraction.signals.on('up', function ({ interaction, event }) {\n const status = interaction.inertiaStatus;\n\n if (!interaction.interacting() || status.active) { return; }\n\n const target = interaction.target;\n const options = target && target.options;\n const inertiaOptions = options && interaction.prepared.name && options[interaction.prepared.name].inertia;\n\n const now = new Date().getTime();\n const statuses = {};\n const page = utils.extend({}, interaction.curCoords.page);\n const pointerSpeed = interaction.pointerDelta.client.speed;\n\n let smoothEnd = false;\n let modifierResult;\n\n // check if inertia should be started\n const inertiaPossible = (inertiaOptions && inertiaOptions.enabled\n && interaction.prepared.name !== 'gesture'\n && event !== status.startEvent);\n\n const inertia = (inertiaPossible\n && (now - interaction.curCoords.timeStamp) < 50\n && pointerSpeed > inertiaOptions.minSpeed\n && pointerSpeed > inertiaOptions.endSpeed);\n\n const modifierArg = {\n interaction,\n pageCoords: page,\n statuses,\n preEnd: true,\n requireEndOnly: true,\n };\n\n // smoothEnd\n if (inertiaPossible && !inertia) {\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n if (modifierResult.shouldMove && modifierResult.locked) {\n smoothEnd = true;\n }\n }\n\n if (!(inertia || smoothEnd)) { return; }\n\n utils.copyCoords(status.upCoords, interaction.curCoords);\n\n interaction.pointers[0] = status.startEvent =\n new InteractEvent(interaction, event, interaction.prepared.name, 'inertiastart', interaction.element);\n\n status.t0 = now;\n\n status.active = true;\n status.allowResume = inertiaOptions.allowResume;\n interaction.simulation = status;\n\n target.fire(status.startEvent);\n\n if (inertia) {\n status.vx0 = interaction.pointerDelta.client.vx;\n status.vy0 = interaction.pointerDelta.client.vy;\n status.v0 = pointerSpeed;\n\n calcInertia(interaction, status);\n\n utils.extend(page, interaction.curCoords.page);\n\n page.x += status.xe;\n page.y += status.ye;\n\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n status.modifiedXe += modifierResult.dx;\n status.modifiedYe += modifierResult.dy;\n\n status.i = animationFrame.request(interaction.boundInertiaFrame);\n }\n else {\n status.smoothEnd = true;\n status.xe = modifierResult.dx;\n status.ye = modifierResult.dy;\n\n status.sx = status.sy = 0;\n\n status.i = animationFrame.request(interaction.boundSmoothEndFrame);\n }\n});\n\nInteraction.signals.on('stop-active', function ({ interaction }) {\n const status = interaction.inertiaStatus;\n\n if (status.active) {\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n }\n});\n\nfunction calcInertia (interaction, status) {\n const inertiaOptions = interaction.target.options[interaction.prepared.name].inertia;\n const lambda = inertiaOptions.resistance;\n const inertiaDur = -Math.log(inertiaOptions.endSpeed / status.v0) / lambda;\n\n status.x0 = interaction.prevEvent.pageX;\n status.y0 = interaction.prevEvent.pageY;\n status.t0 = status.startEvent.timeStamp / 1000;\n status.sx = status.sy = 0;\n\n status.modifiedXe = status.xe = (status.vx0 - inertiaDur) / lambda;\n status.modifiedYe = status.ye = (status.vy0 - inertiaDur) / lambda;\n status.te = inertiaDur;\n\n status.lambda_v0 = lambda / status.v0;\n status.one_ve_v0 = 1 - inertiaOptions.endSpeed / status.v0;\n}\n\nfunction inertiaFrame () {\n updateInertiaCoords(this);\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n\n const status = this.inertiaStatus;\n const options = this.target.options[this.prepared.name].inertia;\n const lambda = options.resistance;\n const t = new Date().getTime() / 1000 - status.t0;\n\n if (t < status.te) {\n\n const progress = 1 - (Math.exp(-lambda * t) - status.lambda_v0) / status.one_ve_v0;\n\n if (status.modifiedXe === status.xe && status.modifiedYe === status.ye) {\n status.sx = status.xe * progress;\n status.sy = status.ye * progress;\n }\n else {\n const quadPoint = utils.getQuadraticCurvePoint(0, 0,\n status.xe,\n status.ye,\n status.modifiedXe,\n status.modifiedYe,\n progress);\n\n status.sx = quadPoint.x;\n status.sy = quadPoint.y;\n }\n\n this.doMove();\n\n status.i = animationFrame.request(this.boundInertiaFrame);\n }\n else {\n status.sx = status.modifiedXe;\n status.sy = status.modifiedYe;\n\n this.doMove();\n this.end(status.startEvent);\n status.active = false;\n this.simulation = null;\n }\n\n utils.copyCoords(this.prevCoords, this.curCoords);\n}\n\nfunction smoothEndFrame () {\n updateInertiaCoords(this);\n\n const status = this.inertiaStatus;\n const t = new Date().getTime() - status.t0;\n const duration = this.target.options[this.prepared.name].inertia.smoothEndDuration;\n\n if (t < duration) {\n status.sx = utils.easeOutQuad(t, 0, status.xe, duration);\n status.sy = utils.easeOutQuad(t, 0, status.ye, duration);\n\n this.pointerMove(status.startEvent, status.startEvent);\n\n status.i = animationFrame.request(this.boundSmoothEndFrame);\n }\n else {\n status.sx = status.xe;\n status.sy = status.ye;\n\n this.pointerMove(status.startEvent, status.startEvent);\n this.end(status.startEvent);\n\n status.smoothEnd =\n status.active = false;\n this.simulation = null;\n }\n}\n\nfunction updateInertiaCoords (interaction) {\n const status = interaction.inertiaStatus;\n\n // return if inertia isn't running\n if (!status.active) { return; }\n\n const pageUp = status.upCoords.page;\n const clientUp = status.upCoords.client;\n\n utils.setCoords(interaction.curCoords, [ {\n pageX : pageUp.x + status.sx,\n pageY : pageUp.y + status.sy,\n clientX: clientUp.x + status.sx,\n clientY: clientUp.y + status.sy,\n } ]);\n}\n","const browser = require('./utils/browser');\nconst events = require('./utils/events');\nconst utils = require('./utils');\nconst scope = require('./scope');\nconst Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\n\nconst globalEvents = {};\n\n/*\\\n * interact\n [ method ]\n *\n * The methods of this variable can be used to set elements as\n * interactables and also to change various default settings.\n *\n * Calling it as a function and passing an element or a valid CSS selector\n * string returns an Interactable object which has various methods to\n * configure it.\n *\n - element (Element | string) The HTML or SVG Element to interact with or CSS selector\n = (object) An @Interactable\n *\n > Usage\n | interact('#draggable').draggable(true);\n |\n | var rectables = interact('rect');\n | rectables\n | .gesturable(true)\n | .on('gesturemove', function (event) {\n | // ...\n | });\n\\*/\nfunction interact (element, options) {\n let interactable = scope.interactables.get(element, options);\n\n if (!interactable) {\n interactable = new Interactable(element, options);\n interactable.events.global = globalEvents;\n }\n\n return interactable;\n}\n\n/*\\\n * interact.isSet\n [ method ]\n *\n * Check if an element has been set\n - element (Element) The Element being searched for\n = (boolean) Indicates if the element or CSS selector was previously passed to interact\n\\*/\ninteract.isSet = function (element, options) {\n return scope.interactables.indexOfElement(element, options && options.context) !== -1;\n};\n\n/*\\\n * interact.on\n [ method ]\n *\n * Adds a global listener for an InteractEvent or adds a DOM event to\n * `document`\n *\n - type (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) interact\n\\*/\ninteract.on = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.on(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.on(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n // if it is an InteractEvent type, add listener to globalEvents\n if (utils.contains(Interactable.eventTypes, type)) {\n // if this type of event was never bound\n if (!globalEvents[type]) {\n globalEvents[type] = [listener];\n }\n else {\n globalEvents[type].push(listener);\n }\n }\n // If non InteractEvent type, addEventListener to document\n else {\n events.add(scope.document, type, listener, { options });\n }\n\n return interact;\n};\n\n/*\\\n * interact.off\n [ method ]\n *\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n - type (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) interact\n \\*/\ninteract.off = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.off(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.off(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n if (!utils.contains(Interactable.eventTypes, type)) {\n events.remove(scope.document, type, listener, options);\n }\n else {\n let index;\n\n if (type in globalEvents\n && (index = utils.indexOf(globalEvents[type], listener)) !== -1) {\n globalEvents[type].splice(index, 1);\n }\n }\n\n return interact;\n};\n\n/*\\\n * interact.debug\n [ method ]\n *\n * Returns an object which exposes internal data\n = (object) An object with properties that outline the current state and expose internal functions and variables\n\\*/\ninteract.debug = function () {\n return scope;\n};\n\n// expose the functions used to calculate multi-touch properties\ninteract.getPointerAverage = utils.pointerAverage;\ninteract.getTouchBBox = utils.touchBBox;\ninteract.getTouchDistance = utils.touchDistance;\ninteract.getTouchAngle = utils.touchAngle;\n\ninteract.getElementRect = utils.getElementRect;\ninteract.getElementClientRect = utils.getElementClientRect;\ninteract.matchesSelector = utils.matchesSelector;\ninteract.closest = utils.closest;\n\n/*\\\n * interact.supportsTouch\n [ method ]\n *\n = (boolean) Whether or not the browser supports touch input\n\\*/\ninteract.supportsTouch = function () {\n return browser.supportsTouch;\n};\n\n/*\\\n * interact.supportsPointerEvent\n [ method ]\n *\n = (boolean) Whether or not the browser supports PointerEvents\n\\*/\ninteract.supportsPointerEvent = function () {\n return browser.supportsPointerEvent;\n};\n\n/*\\\n * interact.stop\n [ method ]\n *\n * Cancels all interactions (end events are not fired)\n *\n - event (Event) An event on which to call preventDefault()\n = (object) interact\n\\*/\ninteract.stop = function (event) {\n for (let i = scope.interactions.length - 1; i >= 0; i--) {\n scope.interactions[i].stop(event);\n }\n\n return interact;\n};\n\n/*\\\n * interact.pointerMoveTolerance\n [ method ]\n * Returns or sets the distance the pointer must be moved before an action\n * sequence occurs. This also affects tolerance for tap events.\n *\n - newValue (number) #optional The movement from the start position must be greater than this value\n = (number | Interactable) The current setting or interact\n\\*/\ninteract.pointerMoveTolerance = function (newValue) {\n if (utils.is.number(newValue)) {\n Interaction.pointerMoveTolerance = newValue;\n\n return this;\n }\n\n return Interaction.pointerMoveTolerance;\n};\n\ninteract.addDocument = scope.addDocument;\ninteract.removeDocument = scope.removeDocument;\n\nscope.interact = interact;\n\nmodule.exports = interact;\n","const Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\nconst scope = require('./scope');\nconst is = require('./utils/is');\nconst events = require('./utils/events');\n\nconst { nodeContains, matchesSelector } = require('./utils/domUtils');\n\n/*\\\n * Interactable.preventDefault\n [ method ]\n *\n * Returns or sets whether to prevent the browser's default behaviour\n * in response to pointer events. Can be set to:\n * - `'always'` to always prevent\n * - `'never'` to never prevent\n * - `'auto'` to let interact.js try to determine what would be best\n *\n - newValue (string) #optional `true`, `false` or `'auto'`\n = (string | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.preventDefault = function (newValue) {\n if (/^(always|never|auto)$/.test(newValue)) {\n this.options.preventDefault = newValue;\n return this;\n }\n\n if (is.bool(newValue)) {\n this.options.preventDefault = newValue? 'always' : 'never';\n return this;\n }\n\n return this.options.preventDefault;\n};\n\nInteractable.prototype.checkAndPreventDefault = function (event) {\n const setting = this.options.preventDefault;\n\n if (setting === 'never') { return; }\n\n if (setting === 'always') {\n event.preventDefault();\n return;\n }\n\n // setting === 'auto'\n\n // don't preventDefault if the browser supports passiveEvents\n // CSS touch-action and user-selecct should be used instead\n if (events.supportsOptions) {\n return;\n }\n\n // don't preventDefault of pointerdown events\n if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) {\n return;\n }\n\n // don't preventDefault on editable elements\n if (is.element(event.target)\n && matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) {\n return;\n }\n\n event.preventDefault();\n};\n\nfunction onInteractionEvent ({ interaction, event }) {\n if (interaction.target) {\n interaction.target.checkAndPreventDefault(event);\n }\n}\n\nfor (const eventSignal of ['down', 'move', 'up', 'cancel']) {\n Interaction.signals.on(eventSignal, onInteractionEvent);\n}\n\n// prevent native HTML5 drag on interact.js target elements\nInteraction.docEvents.dragstart = function preventNativeDrag (event) {\n for (const interaction of scope.interactions) {\n\n if (interaction.element\n && (interaction.element === event.target\n || nodeContains(interaction.element, event.target))) {\n\n interaction.target.checkAndPreventDefault(event);\n return;\n }\n }\n};\n","const scope = require('./scope');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst iFinder = require('./utils/interactionFinder');\nconst pointerEvents = require('./pointerEvents/base');\n\nconst { window } = require('./utils/window');\n\nconst toString = Object.prototype.toString;\n\nif (!window.Array.isArray) {\n window.Array.isArray = function (obj) {\n return toString.call(obj) === '[object Array]';\n };\n}\n\nif (!String.prototype.trim) {\n String.prototype.trim = function () {\n return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n };\n}\n\n// http://www.quirksmode.org/dom/events/click.html\n// >Events leading to dblclick\n//\n// IE8 doesn't fire down event before dblclick.\n// This workaround tries to fire a tap and doubletap after dblclick\nfunction onIE8Dblclick (event) {\n const eventTarget = event.target;\n const interaction = iFinder.search(event, event.type, eventTarget);\n\n if (!interaction) { return; }\n\n if (interaction.prevTap\n && event.clientX === interaction.prevTap.clientX\n && event.clientY === interaction.prevTap.clientY\n && eventTarget === interaction.prevTap.target) {\n\n interaction.downTargets[0] = eventTarget;\n interaction.downTimes [0] = new Date().getTime();\n\n pointerEvents.fire({\n interaction,\n event,\n eventTarget,\n pointer: event,\n type: 'tap',\n });\n }\n}\n\nif (browser.isIE8) {\n const selectFix = function (event) {\n for (const interaction of scope.interactions) {\n if (interaction.interacting()) {\n interaction.target.checkAndPreventDefault(event);\n }\n }\n };\n\n const onDocIE8 = function onDocIE8 ({ doc, win }, signalName) {\n const eventMethod = signalName.indexOf('listen') === 0\n ? events.add : events.remove;\n\n // For IE's lack of Event#preventDefault\n eventMethod(doc, 'selectstart', selectFix);\n\n if (pointerEvents) {\n eventMethod(doc, 'dblclick', onIE8Dblclick);\n }\n };\n\n scope.signals.on('add-document' , onDocIE8);\n scope.signals.on('remove-document', onDocIE8);\n}\n\nmodule.exports = null;\n","const InteractEvent = require('../InteractEvent');\nconst Interaction = require('../Interaction');\nconst extend = require('../utils/extend');\n\nconst modifiers = {\n names: [],\n\n setOffsets: function (arg) {\n const { interaction, pageCoords: page } = arg;\n const { target, element, startOffset } = interaction;\n const rect = target.getRect(element);\n\n if (rect) {\n startOffset.left = page.x - rect.left;\n startOffset.top = page.y - rect.top;\n\n startOffset.right = rect.right - page.x;\n startOffset.bottom = rect.bottom - page.y;\n\n if (!('width' in rect)) { rect.width = rect.right - rect.left; }\n if (!('height' in rect)) { rect.height = rect.bottom - rect.top ; }\n }\n else {\n startOffset.left = startOffset.top = startOffset.right = startOffset.bottom = 0;\n }\n\n arg.rect = rect;\n arg.interactable = target;\n arg.element = element;\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n\n arg.options = target.options[interaction.prepared.name][modifierName];\n\n if (!arg.options) {\n continue;\n }\n\n interaction.modifierOffsets[modifierName] = modifiers[modifierName].setOffset(arg);\n }\n },\n\n setAll: function (arg) {\n const { interaction, statuses, preEnd, requireEndOnly } = arg;\n const coords = extend({}, arg.pageCoords);\n const result = {\n dx: 0,\n dy: 0,\n changed: false,\n locked: false,\n shouldMove: true,\n };\n\n for (const modifierName of modifiers.names) {\n const modifier = modifiers[modifierName];\n const options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!shouldDo(options, preEnd, requireEndOnly)) { continue; }\n\n arg.status = arg.status = statuses[modifierName];\n arg.options = options;\n arg.offset = arg.interaction.modifierOffsets[modifierName];\n\n modifier.set(arg);\n\n if (arg.status.locked) {\n coords.x += arg.status.dx;\n coords.y += arg.status.dy;\n\n result.dx += arg.status.dx;\n result.dy += arg.status.dy;\n\n result.locked = true;\n }\n }\n\n // a move should be fired if:\n // - there are no modifiers enabled,\n // - no modifiers are \"locked\" i.e. have changed the pointer's coordinates, or\n // - the locked coords have changed since the last pointer move\n result.shouldMove = !arg.status || !result.locked || arg.status.changed;\n\n return result;\n },\n\n resetStatuses: function (statuses) {\n for (const modifierName of modifiers.names) {\n const status = statuses[modifierName] || {};\n\n status.dx = status.dy = 0;\n status.modifiedX = status.modifiedY = NaN;\n status.locked = false;\n status.changed = true;\n\n statuses[modifierName] = status;\n }\n\n return statuses;\n },\n\n start: function ({ interaction }, signalName) {\n const arg = {\n interaction,\n pageCoords: (signalName === 'action-resume' ?\n interaction.curCoords : interaction.startCoords).page,\n startOffset: interaction.startOffset,\n statuses: interaction.modifierStatuses,\n preEnd: false,\n requireEndOnly: false,\n };\n\n modifiers.setOffsets(arg);\n modifiers.resetStatuses(arg.statuses);\n\n arg.pageCoords = extend({}, interaction.startCoords.page);\n interaction.modifierResult = modifiers.setAll(arg);\n },\n};\n\nInteraction.signals.on('new', function (interaction) {\n interaction.startOffset = { left: 0, right: 0, top: 0, bottom: 0 };\n interaction.modifierOffsets = {};\n interaction.modifierStatuses = modifiers.resetStatuses({});\n interaction.modifierResult = null;\n});\n\nInteraction.signals.on('action-start' , modifiers.start);\nInteraction.signals.on('action-resume', modifiers.start);\n\nInteraction.signals.on('before-action-move', function ({ interaction, preEnd, interactingBeforeMove }) {\n const modifierResult = modifiers.setAll({\n interaction,\n preEnd,\n pageCoords: interaction.curCoords.page,\n statuses: interaction.modifierStatuses,\n requireEndOnly: false,\n });\n\n // don't fire an action move if a modifier would keep the event in the same\n // cordinates as before\n if (!modifierResult.shouldMove && interactingBeforeMove) {\n interaction._dontFireMove = true;\n }\n\n interaction.modifierResult = modifierResult;\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n for (let i = 0; i < modifiers.names.length; i++) {\n const options = interaction.target.options[interaction.prepared.name][modifiers.names[i]];\n\n // if the endOnly option is true for any modifier\n if (shouldDo(options, true, true)) {\n // fire a move event at the modified coordinates\n interaction.doMove({ event, preEnd: true });\n break;\n }\n }\n});\n\nInteractEvent.signals.on('set-xy', function (arg) {\n const { iEvent, interaction } = arg;\n const modifierArg = extend({}, arg);\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n modifierArg.options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!modifierArg.options) {\n continue;\n }\n\n const modifier = modifiers[modifierName];\n\n modifierArg.status = interaction.modifierStatuses[modifierName];\n\n iEvent[modifierName] = modifier.modifyCoords(modifierArg);\n }\n});\n\nfunction shouldDo (options, preEnd, requireEndOnly) {\n return (options && options.enabled\n && (preEnd || !options.endOnly)\n && (!requireEndOnly || options.endOnly));\n}\n\nmodule.exports = modifiers;\n","const modifiers = require('./index');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst restrict = {\n defaults: {\n enabled : false,\n endOnly : false,\n restriction: null,\n elementRect: null,\n },\n\n setOffset: function ({ rect, startOffset, options }) {\n const elementRect = options && options.elementRect;\n const offset = {};\n\n if (rect && elementRect) {\n offset.left = startOffset.left - (rect.width * elementRect.left);\n offset.top = startOffset.top - (rect.height * elementRect.top);\n\n offset.right = startOffset.right - (rect.width * (1 - elementRect.right));\n offset.bottom = startOffset.bottom - (rect.height * (1 - elementRect.bottom));\n }\n else {\n offset.left = offset.top = offset.right = offset.bottom = 0;\n }\n\n return offset;\n },\n\n set: function ({ pageCoords, interaction, status, options }) {\n if (!options) { return status; }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n\n const restriction = getRestrictionRect(options.restriction, interaction, page);\n\n if (!restriction) { return status; }\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n const rect = restriction;\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n const offset = interaction.modifierOffsets.restrict;\n\n // object is assumed to have\n // x, y, width, height or\n // left, top, right, bottom\n if ('x' in restriction && 'y' in restriction) {\n modifiedX = Math.max(Math.min(rect.x + rect.width - offset.right , page.x), rect.x + offset.left);\n modifiedY = Math.max(Math.min(rect.y + rect.height - offset.bottom, page.y), rect.y + offset.top );\n }\n else {\n modifiedX = Math.max(Math.min(rect.right - offset.right , page.x), rect.left + offset.left);\n modifiedY = Math.max(Math.min(rect.bottom - offset.bottom, page.y), rect.top + offset.top );\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const elementRect = options && options.elementRect;\n\n if (options && options.enabled\n && !(phase === 'start' && elementRect && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n getRestrictionRect,\n};\n\nfunction getRestrictionRect (value, interaction, page) {\n if (utils.is.function(value)) {\n return utils.resolveRectLike(value, interaction.target, interaction.element, [page.x, page.y, interaction]);\n } else {\n return utils.resolveRectLike(value, interaction.target, interaction.element);\n }\n}\n\nmodifiers.restrict = restrict;\nmodifiers.names.push('restrict');\n\ndefaultOptions.perAction.restrict = restrict.defaults;\n\nmodule.exports = restrict;\n","// This module adds the options.resize.restrictEdges setting which sets min and\n// max for the top, left, bottom and right edges of the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictEdges: {\n// inner: { top: 200, left: 200, right: 400, bottom: 400 },\n// outer: { top: 0, left: 0, right: 600, bottom: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst { getRestrictionRect } = require('./restrict');\n\nconst noInner = { top: +Infinity, left: +Infinity, bottom: -Infinity, right: -Infinity };\nconst noOuter = { top: -Infinity, left: -Infinity, bottom: +Infinity, right: +Infinity };\n\nconst restrictEdges = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n offset: null,\n },\n\n setOffset: function ({ interaction, startOffset, options }) {\n if (!options) {\n return utils.extend({}, startOffset);\n }\n\n const offset = getRestrictionRect(options.offset, interaction, interaction.startCoords.page);\n\n if (offset) {\n return {\n top: startOffset.top + offset.y,\n left: startOffset.left + offset.x,\n bottom: startOffset.bottom + offset.y,\n right: startOffset.right + offset.x,\n };\n }\n\n return startOffset;\n },\n\n set: function ({ pageCoords, interaction, status, offset, options }) {\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n const inner = rectUtils.xywhToTlbr(getRestrictionRect(options.inner, interaction, page)) || noInner;\n const outer = rectUtils.xywhToTlbr(getRestrictionRect(options.outer, interaction, page)) || noOuter;\n\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n if (edges.top) {\n modifiedY = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top);\n }\n else if (edges.bottom) {\n modifiedY = Math.max(Math.min(outer.bottom - offset.bottom, page.y), inner.bottom - offset.bottom);\n }\n if (edges.left) {\n modifiedX = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left);\n }\n else if (edges.right) {\n modifiedX = Math.max(Math.min(outer.right - offset.right, page.x), inner.right - offset.right);\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n if (options && options.enabled\n && !(phase === 'start' && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n noInner,\n noOuter,\n getRestrictionRect,\n};\n\nmodifiers.restrictEdges = restrictEdges;\nmodifiers.names.push('restrictEdges');\n\ndefaultOptions.perAction.restrictEdges = restrictEdges.defaults;\nresize.defaults.restrictEdges = restrictEdges.defaults;\n\nmodule.exports = restrictEdges;\n","// This module adds the options.resize.restrictSize setting which sets min and\n// max width and height for the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictSize: {\n// min: { width: -600, height: -600 },\n// max: { width: 600, height: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst restrictEdges = require('./restrictEdges');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst noMin = { width: -Infinity, height: -Infinity };\nconst noMax = { width: +Infinity, height: +Infinity };\n\nconst restrictSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n },\n\n setOffset: function ({ interaction }) {\n return interaction.startOffset;\n },\n\n set: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const rect = rectUtils.xywhToTlbr(interaction.resizeRects.inverted);\n\n const minSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.min, interaction)) || noMin;\n const maxSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.max, interaction)) || noMax;\n\n arg.options = {\n enabled: options.enabled,\n endOnly: options.endOnly,\n inner: utils.extend({}, restrictEdges.noInner),\n outer: utils.extend({}, restrictEdges.noOuter),\n };\n\n if (edges.top) {\n arg.options.inner.top = rect.bottom - minSize.height;\n arg.options.outer.top = rect.bottom - maxSize.height;\n }\n else if (edges.bottom) {\n arg.options.inner.bottom = rect.top + minSize.height;\n arg.options.outer.bottom = rect.top + maxSize.height;\n }\n if (edges.left) {\n arg.options.inner.left = rect.right - minSize.width;\n arg.options.outer.left = rect.right - maxSize.width;\n }\n else if (edges.right) {\n arg.options.inner.right = rect.left + minSize.width;\n arg.options.outer.right = rect.left + maxSize.width;\n }\n\n restrictEdges.set(arg);\n },\n\n modifyCoords: restrictEdges.modifyCoords,\n};\n\nmodifiers.restrictSize = restrictSize;\nmodifiers.names.push('restrictSize');\n\ndefaultOptions.perAction.restrictSize = restrictSize.defaults;\nresize.defaults.restrictSize = restrictSize.defaults;\n\nmodule.exports = restrictSize;\n","const modifiers = require('./index');\nconst interact = require('../interact');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst snap = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n\n relativePoints: null,\n },\n\n setOffset: function ({ interaction, interactable, element, rect, startOffset, options }) {\n const offsets = [];\n const optionsOrigin = utils.rectToXY(utils.resolveRectLike(options.origin));\n const origin = optionsOrigin || utils.getOriginXY(interactable, element, interaction.prepared.name);\n options = options || interactable.options[interaction.prepared.name].snap || {};\n\n let snapOffset;\n\n if (options.offset === 'startCoords') {\n snapOffset = {\n x: interaction.startCoords.page.x - origin.x,\n y: interaction.startCoords.page.y - origin.y,\n };\n }\n else {\n const offsetRect = utils.resolveRectLike(options.offset, interactable, element, [interaction]);\n\n snapOffset = utils.rectToXY(offsetRect) || { x: 0, y: 0 };\n }\n\n if (rect && options.relativePoints && options.relativePoints.length) {\n for (const { x: relativeX, y: relativeY } of options.relativePoints) {\n offsets.push({\n x: startOffset.left - (rect.width * relativeX) + snapOffset.x,\n y: startOffset.top - (rect.height * relativeY) + snapOffset.y,\n });\n }\n }\n else {\n offsets.push(snapOffset);\n }\n\n return offsets;\n },\n\n set: function ({ interaction, pageCoords, status, options, offset: offsets }) {\n const targets = [];\n let target;\n let page;\n let i;\n\n if (status.useStatusXY) {\n page = { x: status.x, y: status.y };\n }\n else {\n const origin = utils.getOriginXY(interaction.target, interaction.element, interaction.prepared.name);\n\n page = utils.extend({}, pageCoords);\n\n page.x -= origin.x;\n page.y -= origin.y;\n }\n\n status.realX = page.x;\n status.realY = page.y;\n\n let len = options.targets? options.targets.length : 0;\n\n for (const { x: offsetX, y: offsetY } of offsets) {\n const relativeX = page.x - offsetX;\n const relativeY = page.y - offsetY;\n\n for (const snapTarget of options.targets) {\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n targets.push({\n x: utils.is.number(target.x) ? (target.x + offsetX) : relativeX,\n y: utils.is.number(target.y) ? (target.y + offsetY) : relativeY,\n\n range: utils.is.number(target.range)? target.range: options.range,\n });\n }\n }\n\n const closest = {\n target: null,\n inRange: false,\n distance: 0,\n range: 0,\n dx: 0,\n dy: 0,\n };\n\n for (i = 0, len = targets.length; i < len; i++) {\n target = targets[i];\n\n const range = target.range;\n const dx = target.x - page.x;\n const dy = target.y - page.y;\n const distance = utils.hypot(dx, dy);\n let inRange = distance <= range;\n\n // Infinite targets count as being out of range\n // compared to non infinite ones that are in range\n if (range === Infinity && closest.inRange && closest.range !== Infinity) {\n inRange = false;\n }\n\n if (!closest.target || (inRange\n // is the closest target in range?\n ? (closest.inRange && range !== Infinity\n // the pointer is relatively deeper in this target\n ? distance / range < closest.distance / closest.range\n // this target has Infinite range and the closest doesn't\n : (range === Infinity && closest.range !== Infinity)\n // OR this target is closer that the previous closest\n || distance < closest.distance)\n // The other is not in range and the pointer is closer to this target\n : (!closest.inRange && distance < closest.distance))) {\n\n closest.target = target;\n closest.distance = distance;\n closest.range = range;\n closest.inRange = inRange;\n closest.dx = dx;\n closest.dy = dy;\n\n status.range = range;\n }\n }\n\n let snapChanged;\n\n if (closest.target) {\n snapChanged = (status.modifiedX !== closest.target.x || status.modifiedY !== closest.target.y);\n\n status.modifiedX = closest.target.x;\n status.modifiedY = closest.target.y;\n }\n else {\n snapChanged = true;\n\n status.modifiedX = NaN;\n status.modifiedY = NaN;\n }\n\n status.dx = closest.dx;\n status.dy = closest.dy;\n\n status.changed = (snapChanged || (closest.inRange && !status.locked));\n status.locked = closest.inRange;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const relativePoints = options && options.relativePoints;\n\n if (options && options.enabled\n && !(phase === 'start' && relativePoints && relativePoints.length)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n }\n\n return {\n range : status.range,\n locked : status.locked,\n x : status.modifiedX,\n y : status.modifiedY,\n realX : status.realX,\n realY : status.realY,\n dx : status.dx,\n dy : status.dy,\n };\n }\n },\n};\n\ninteract.createSnapGrid = function (grid) {\n return function (x, y) {\n const limits = grid.limits || {\n left : -Infinity,\n right : Infinity,\n top : -Infinity,\n bottom: Infinity,\n };\n let offsetX = 0;\n let offsetY = 0;\n\n if (utils.is.object(grid.offset)) {\n offsetX = grid.offset.x;\n offsetY = grid.offset.y;\n }\n\n const gridx = Math.round((x - offsetX) / grid.x);\n const gridy = Math.round((y - offsetY) / grid.y);\n\n const newX = Math.max(limits.left, Math.min(limits.right , gridx * grid.x + offsetX));\n const newY = Math.max(limits.top , Math.min(limits.bottom, gridy * grid.y + offsetY));\n\n return {\n x: newX,\n y: newY,\n range: grid.range,\n };\n };\n};\n\nmodifiers.snap = snap;\nmodifiers.names.push('snap');\n\ndefaultOptions.perAction.snap = snap.defaults;\n\nmodule.exports = snap;\n","// This module allows snapping of the size of targets during resize\n// interactions.\n\nconst modifiers = require('./index');\nconst snap = require('./snap');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\nconst utils = require('../utils/');\n\nconst snapSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n },\n\n setOffset: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.edges;\n\n if (!edges) { return; }\n\n arg.options = {\n relativePoints: [{\n x: edges.left? 0 : 1,\n y: edges.top ? 0 : 1,\n }],\n origin: { x: 0, y: 0 },\n offset: 'self',\n range: options.range,\n };\n\n const offsets = snap.setOffset(arg);\n arg.options = options;\n\n return offsets;\n },\n\n set: function (arg) {\n const { interaction, options, offset, pageCoords } = arg;\n const page = utils.extend({}, pageCoords);\n const relativeX = page.x - offset[0].x;\n const relativeY = page.y - offset[0].y;\n\n arg.options = utils.extend({}, options);\n arg.options.targets = [];\n\n for (const snapTarget of options.targets) {\n let target;\n\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n if ('width' in target && 'height' in target) {\n target.x = target.width;\n target.y = target.height;\n }\n\n arg.options.targets.push(target);\n }\n\n snap.set(arg);\n },\n\n modifyCoords: function (arg) {\n const { options } = arg;\n\n arg.options = utils.extend({}, options);\n arg.options.enabled = options.enabled;\n arg.options.relativePoints = [null];\n\n snap.modifyCoords(arg);\n },\n};\n\nmodifiers.snapSize = snapSize;\nmodifiers.names.push('snapSize');\n\ndefaultOptions.perAction.snapSize = snapSize.defaults;\nresize.defaults.snapSize = snapSize.defaults;\n\nmodule.exports = snapSize;\n","const pointerUtils = require('../utils/pointerUtils');\n\nmodule.exports = class PointerEvent {\n constructor (type, pointer, event, eventTarget, interaction) {\n pointerUtils.pointerExtend(this, event);\n\n if (event !== pointer) {\n pointerUtils.pointerExtend(this, pointer);\n }\n\n this.interaction = interaction;\n\n this.timeStamp = new Date().getTime();\n this.originalEvent = event;\n this.type = type;\n this.pointerId = pointerUtils.getPointerId(pointer);\n this.pointerType = pointerUtils.getPointerType(pointer, interaction);\n this.target = eventTarget;\n this.currentTarget = null;\n\n if (type === 'tap') {\n const pointerIndex = interaction.getPointerIndex(pointer);\n this.dt = this.timeStamp - interaction.downTimes[pointerIndex];\n\n const interval = this.timeStamp - interaction.tapTime;\n\n this.double = !!(interaction.prevTap\n && interaction.prevTap.type !== 'doubletap'\n && interaction.prevTap.target === this.target\n && interval < 500);\n }\n else if (type === 'doubletap') {\n this.dt = pointer.timeStamp - interaction.tapTime;\n }\n }\n\n subtractOrigin ({ x: originX, y: originY }) {\n this.pageX -= originX;\n this.pageY -= originY;\n this.clientX -= originX;\n this.clientY -= originY;\n\n return this;\n }\n\n addOrigin ({ x: originX, y: originY }) {\n this.pageX += originX;\n this.pageY += originY;\n this.clientX += originX;\n this.clientY += originY;\n\n return this;\n }\n\n preventDefault () {\n this.originalEvent.preventDefault();\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n};\n","const PointerEvent = require('./PointerEvent');\nconst Interaction = require('../Interaction');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst defaults = require('../defaultOptions');\nconst signals = require('../utils/Signals').new();\nconst { filter } = require('../utils/arr');\n\nconst simpleSignals = [ 'down', 'up', 'cancel' ];\nconst simpleEvents = [ 'down', 'up', 'cancel' ];\n\nconst pointerEvents = {\n PointerEvent,\n fire,\n collectEventTargets,\n signals,\n defaults: {\n holdDuration: 600,\n ignoreFrom : null,\n allowFrom : null,\n origin : { x: 0, y: 0 },\n },\n types: [\n 'down',\n 'move',\n 'up',\n 'cancel',\n 'tap',\n 'doubletap',\n 'hold',\n ],\n};\n\nfunction fire (arg) {\n const {\n interaction, pointer, event, eventTarget,\n type = arg.pointerEvent.type,\n targets = collectEventTargets(arg),\n pointerEvent = new PointerEvent(type, pointer, event, eventTarget, interaction),\n } = arg;\n\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n targets,\n type,\n pointerEvent,\n };\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n\n for (const prop in target.props || {}) {\n pointerEvent[prop] = target.props[prop];\n }\n\n const origin = utils.getOriginXY(target.eventable, target.element);\n\n pointerEvent.subtractOrigin(origin);\n pointerEvent.eventable = target.eventable;\n pointerEvent.currentTarget = target.element;\n\n target.eventable.fire(pointerEvent);\n\n pointerEvent.addOrigin(origin);\n\n if (pointerEvent.immediatePropagationStopped\n || (pointerEvent.propagationStopped\n && (i + 1) < targets.length && targets[i + 1].element !== pointerEvent.currentTarget)) {\n break;\n }\n }\n\n signals.fire('fired', signalArg);\n\n if (type === 'tap') {\n // if pointerEvent should make a double tap, create and fire a doubletap\n // PointerEvent and use that as the prevTap\n const prevTap = pointerEvent.double\n ? fire({\n interaction, pointer, event, eventTarget,\n type: 'doubletap',\n })\n : pointerEvent;\n\n interaction.prevTap = prevTap;\n interaction.tapTime = prevTap.timeStamp;\n }\n\n return pointerEvent;\n}\n\nfunction collectEventTargets ({ interaction, pointer, event, eventTarget, type }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n // do not fire a tap event if the pointer was moved before being lifted\n if (type === 'tap' && (interaction.pointerWasMoved\n // or if the pointerup target is different to the pointerdown target\n || !(interaction.downTargets[pointerIndex] && interaction.downTargets[pointerIndex] === eventTarget))) {\n return [];\n }\n\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n path,\n targets: [],\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (type === 'hold') {\n signalArg.targets = filter(signalArg.targets, target =>\n target.eventable.options.holdDuration === interaction.holdTimers[pointerIndex].duration);\n }\n\n return signalArg.targets;\n}\n\nInteraction.signals.on('update-pointer-down', function ({ interaction, pointerIndex }) {\n interaction.holdTimers[pointerIndex] = { duration: Infinity, timeout: null };\n});\n\nInteraction.signals.on('remove-pointer', function ({ interaction, pointerIndex }) {\n interaction.holdTimers.splice(pointerIndex, 1);\n});\n\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget, duplicateMove }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n if (!duplicateMove && (!interaction.pointerIsDown || interaction.pointerWasMoved)) {\n if (interaction.pointerIsDown) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n\n fire({\n interaction, pointer, event, eventTarget,\n type: 'move',\n });\n }\n});\n\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget, pointerIndex }) {\n // copy event to be used in timeout for IE8\n const eventCopy = browser.isIE8? utils.extend({}, event) : event;\n\n const timer = interaction.holdTimers[pointerIndex];\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'hold',\n targets: [],\n path,\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (!signalArg.targets.length) { return; }\n\n let minDuration = Infinity;\n\n for (let i = 0; i < signalArg.targets.length; i++) {\n const target = signalArg.targets[i];\n const holdDuration = target.eventable.options.holdDuration;\n\n if (holdDuration < minDuration) {\n minDuration = holdDuration;\n }\n }\n\n timer.duration = minDuration;\n timer.timeout = setTimeout(function () {\n fire({\n interaction, eventCopy, eventTarget,\n pointer: browser.isIE8? eventCopy : pointer,\n type: 'hold',\n });\n }, minDuration);\n});\n\nInteraction.signals.on('up', ({ interaction, pointer, event, eventTarget }) => {\n if (!interaction.pointerWasMoved) {\n fire({ interaction, eventTarget, pointer, event, type: 'tap' });\n }\n});\n\n['up', 'cancel'].forEach(function (signalName) {\n Interaction.signals.on(signalName, function ({ interaction, pointerIndex }) {\n if (interaction.holdTimers[pointerIndex]) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n });\n});\n\nfunction createSignalListener (type) {\n return function ({ interaction, pointer, event, eventTarget }) {\n fire({ interaction, eventTarget, pointer, event, type });\n };\n}\n\nfor (let i = 0; i < simpleSignals.length; i++) {\n Interaction.signals.on(simpleSignals[i], createSignalListener(simpleEvents[i]));\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.prevTap = null; // the most recent tap event on this interaction\n interaction.tapTime = 0; // time of the most recent tap event\n interaction.holdTimers = []; // [{ duration, timeout }]\n});\n\ndefaults.pointerEvents = pointerEvents.defaults;\nmodule.exports = pointerEvents;\n","const pointerEvents = require('./base');\nconst Interaction = require('../Interaction');\n\npointerEvents.signals.on('new', onNew);\npointerEvents.signals.on('fired', onFired);\n\nfor (const signal of ['move', 'up', 'cancel', 'endall']) {\n Interaction.signals.on(signal, endHoldRepeat);\n}\n\nfunction onNew ({ pointerEvent }) {\n if (pointerEvent.type !== 'hold') { return; }\n\n pointerEvent.count = (pointerEvent.count || 0) + 1;\n}\n\nfunction onFired ({ interaction, pointerEvent, eventTarget, targets }) {\n if (pointerEvent.type !== 'hold' || !targets.length) { return; }\n\n // get the repeat interval from the first eventable\n const interval = targets[0].eventable.options.holdRepeatInterval;\n\n // don't repeat if the interval is 0 or less\n if (interval <= 0) { return; }\n\n // set a timeout to fire the holdrepeat event\n interaction.holdIntervalHandle = setTimeout(function () {\n pointerEvents.fire({\n interaction,\n eventTarget,\n type: 'hold',\n pointer: pointerEvent,\n event: pointerEvent,\n });\n }, interval);\n}\n\nfunction endHoldRepeat ({ interaction }) {\n // set the interaction's holdStopTime property\n // to stop further holdRepeat events\n if (interaction.holdIntervalHandle) {\n clearInterval(interaction.holdIntervalHandle);\n interaction.holdIntervalHandle = null;\n }\n}\n\n// don't repeat by default\npointerEvents.defaults.holdRepeatInterval = 0;\npointerEvents.types.push('holdrepeat');\n\nmodule.exports = {\n onNew,\n onFired,\n endHoldRepeat,\n};\n","const pointerEvents = require('./base');\nconst Interactable = require('../Interactable');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\nconst scope = require('../scope');\nconst extend = require('../utils/extend');\nconst { merge } = require('../utils/arr');\n\npointerEvents.signals.on('collect-targets', function ({ targets, element, type, eventTarget }) {\n function collectSelectors (interactable, selector, context) {\n const els = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && is.element(element)\n && domUtils.matchesSelector(element, selector, els)\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n const interactable = scope.interactables.get(element);\n\n if (interactable) {\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n scope.interactables.forEachSelector(collectSelectors, element);\n});\n\nInteractable.signals.on('new', function ({ interactable }) {\n interactable.events.getRect = function (element) {\n return interactable.getRect(element);\n };\n});\n\nInteractable.signals.on('set', function ({ interactable, options }) {\n extend(interactable.events.options, pointerEvents.defaults);\n extend(interactable.events.options, options);\n});\n\nmerge(Interactable.eventTypes, pointerEvents.types);\n\nInteractable.prototype.pointerEvents = function (options) {\n extend(this.events.options, options);\n\n return this;\n};\n\nconst __backCompatOption = Interactable.prototype._backCompatOption;\n\nInteractable.prototype._backCompatOption = function (optionName, newValue) {\n const ret = __backCompatOption.call(this, optionName, newValue);\n\n if (ret === this) {\n this.events.options[optionName] = newValue;\n }\n\n return ret;\n};\n\nInteractable.settingsMethods.push('pointerEvents');\n","const utils = require('./utils');\nconst events = require('./utils/events');\nconst signals = require('./utils/Signals').new();\n\nconst scope = {\n signals,\n events,\n utils,\n\n // main document\n document: require('./utils/domObjects').document,\n // all documents being listened to\n documents: [],\n\n addDocument: function (doc, win) {\n // do nothing if document is already known\n if (utils.contains(scope.documents, doc)) { return false; }\n\n win = win || scope.getWindow(doc);\n\n scope.documents.push(doc);\n events.documents.push(doc);\n\n // don't add an unload event for the main document\n // so that the page may be cached in browser history\n if (doc !== scope.document) {\n events.add(win, 'unload', scope.onWindowUnload);\n }\n\n signals.fire('add-document', { doc, win });\n },\n\n removeDocument: function (doc, win) {\n const index = utils.indexOf(scope.documents, doc);\n\n win = win || scope.getWindow(doc);\n\n events.remove(win, 'unload', scope.onWindowUnload);\n\n scope.documents.splice(index, 1);\n events.documents.splice(index, 1);\n\n signals.fire('remove-document', { win, doc });\n },\n\n onWindowUnload: function () {\n scope.removeDocument(this.document, this);\n },\n};\n\nmodule.exports = scope;\n","const { indexOf } = require('./arr');\n\nclass Signals {\n constructor () {\n this.listeners = {\n // signalName: [listeners],\n };\n }\n\n on (name, listener) {\n if (!this.listeners[name]) {\n this.listeners[name] = [listener];\n return;\n }\n\n this.listeners[name].push(listener);\n }\n\n off (name, listener) {\n if (!this.listeners[name]) { return; }\n\n const index = indexOf(this.listeners[name], listener);\n\n if (index !== -1) {\n this.listeners[name].splice(index, 1);\n }\n }\n\n fire (name, arg) {\n const targetListeners = this.listeners[name];\n\n if (!targetListeners) { return; }\n\n for (let i = 0; i < targetListeners.length; i++) {\n if (targetListeners[i](arg, name) === false) {\n return;\n }\n }\n }\n}\n\nSignals.new = function () {\n return new Signals();\n};\n\nmodule.exports = Signals;\n","function indexOf (array, target) {\n for (let i = 0, len = array.length; i < len; i++) {\n if (array[i] === target) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction contains (array, target) {\n return indexOf(array, target) !== -1;\n}\n\nfunction merge (target, source) {\n for (let i = 0; i < source.length; i++) {\n target.push(source[i]);\n }\n\n return target;\n}\n\nfunction filter (array, test) {\n const result = [];\n\n for (let i = 0; i < array.length; i++) {\n if (test(array[i])) {\n result.push(array[i]);\n }\n }\n\n return result;\n}\n\nmodule.exports = {\n indexOf,\n contains,\n merge,\n filter,\n};\n","const { window } = require('./window');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst Element = domObjects.Element;\nconst navigator = window.navigator;\n\nconst browser = {\n // Does the browser support touch input?\n supportsTouch: !!(('ontouchstart' in window) || is.function(window.DocumentTouch)\n && domObjects.document instanceof window.DocumentTouch),\n\n // Does the browser support PointerEvents\n supportsPointerEvent: !!domObjects.PointerEvent,\n\n isIE8: ('attachEvent' in window) && !('addEventListener' in window),\n\n // Opera Mobile must be handled differently\n isOperaMobile: (navigator.appName === 'Opera'\n && browser.supportsTouch\n && navigator.userAgent.match('Presto')),\n\n // scrolling doesn't change the result of getClientRects on iOS 7\n isIOS7: (/iP(hone|od|ad)/.test(navigator.platform)\n && /OS 7[^\\d]/.test(navigator.appVersion)),\n\n isIe9OrOlder: /MSIE (8|9)/.test(navigator.userAgent),\n\n // prefix matchesSelector\n prefixedMatchesSelector: 'matches' in Element.prototype\n ? 'matches': 'webkitMatchesSelector' in Element.prototype\n ? 'webkitMatchesSelector': 'mozMatchesSelector' in Element.prototype\n ? 'mozMatchesSelector': 'oMatchesSelector' in Element.prototype\n ? 'oMatchesSelector': 'msMatchesSelector',\n\n useMatchesSelectorPolyfill: false,\n\n pEventTypes: (domObjects.PointerEvent\n ? (domObjects.PointerEvent === window.MSPointerEvent\n ? {\n up: 'MSPointerUp',\n down: 'MSPointerDown',\n over: 'mouseover',\n out: 'mouseout',\n move: 'MSPointerMove',\n cancel: 'MSPointerCancel',\n }\n : {\n up: 'pointerup',\n down: 'pointerdown',\n over: 'pointerover',\n out: 'pointerout',\n move: 'pointermove',\n cancel: 'pointercancel',\n })\n : null),\n\n // because Webkit and Opera still use 'mousewheel' event type\n wheelEvent: 'onmousewheel' in domObjects.document? 'mousewheel': 'wheel',\n\n};\n\nbrowser.useMatchesSelectorPolyfill = !is.function(Element.prototype[browser.prefixedMatchesSelector]);\n\nmodule.exports = browser;\n","const domObjects = {};\nconst win = require('./window').window;\n\nfunction blank () {}\n\ndomObjects.document = win.document;\ndomObjects.DocumentFragment = win.DocumentFragment || blank;\ndomObjects.SVGElement = win.SVGElement || blank;\ndomObjects.SVGSVGElement = win.SVGSVGElement || blank;\ndomObjects.SVGElementInstance = win.SVGElementInstance || blank;\ndomObjects.Element = win.Element || blank;\ndomObjects.HTMLElement = win.HTMLElement || domObjects.Element;\n\ndomObjects.Event = win.Event;\ndomObjects.Touch = win.Touch || blank;\ndomObjects.PointerEvent = (win.PointerEvent || win.MSPointerEvent);\n\nmodule.exports = domObjects;\n","const win = require('./window');\nconst browser = require('./browser');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst domUtils = {\n nodeContains: function (parent, child) {\n while (child) {\n if (child === parent) {\n return true;\n }\n\n child = child.parentNode;\n }\n\n return false;\n },\n\n closest: function (element, selector) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) { return element; }\n\n element = domUtils.parentNode(element);\n }\n\n return null;\n },\n\n parentNode: function (node) {\n let parent = node.parentNode;\n\n if (is.docFrag(parent)) {\n // skip past #shado-root fragments\n while ((parent = parent.host) && is.docFrag(parent)) {\n continue;\n }\n\n return parent;\n }\n\n return parent;\n },\n\n // taken from http://tanalin.com/en/blog/2012/12/matches-selector-ie8/ and modified\n matchesSelectorPolyfill: browser.useMatchesSelectorPolyfill\n ? function (element, selector, elems) {\n elems = elems || element.parentNode.querySelectorAll(selector);\n\n for (let i = 0, len = elems.length; i < len; i++) {\n if (elems[i] === element) {\n return true;\n }\n }\n\n return false;\n }\n : null,\n\n matchesSelector: function (element, selector, nodeList) {\n if (browser.useMatchesSelectorPolyfill) {\n return domUtils.matchesSelectorPolyfill(element, selector, nodeList);\n }\n\n // remove /deep/ from selectors if shadowDOM polyfill is used\n if (win.window !== win.realWindow) {\n selector = selector.replace(/\\/deep\\//g, ' ');\n }\n\n return element[browser.prefixedMatchesSelector](selector);\n },\n\n // Test for the element that's \"above\" all other qualifiers\n indexOfDeepestElement: function (elements) {\n let deepestZoneParents = [];\n let dropzoneParents = [];\n let dropzone;\n let deepestZone = elements[0];\n let index = deepestZone? 0: -1;\n let parent;\n let child;\n let i;\n let n;\n\n for (i = 1; i < elements.length; i++) {\n dropzone = elements[i];\n\n // an element might belong to multiple selector dropzones\n if (!dropzone || dropzone === deepestZone) {\n continue;\n }\n\n if (!deepestZone) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n // check if the deepest or current are document.documentElement or document.rootElement\n // - if the current dropzone is, do nothing and continue\n if (dropzone.parentNode === dropzone.ownerDocument) {\n continue;\n }\n // - if deepest is, update with the current dropzone and continue to next\n else if (deepestZone.parentNode === dropzone.ownerDocument) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n if (!deepestZoneParents.length) {\n parent = deepestZone;\n while (parent.parentNode && parent.parentNode !== parent.ownerDocument) {\n deepestZoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n }\n\n // if this element is an svg element and the current deepest is\n // an HTMLElement\n if (deepestZone instanceof domObjects.HTMLElement\n && dropzone instanceof domObjects.SVGElement\n && !(dropzone instanceof domObjects.SVGSVGElement)) {\n\n if (dropzone === deepestZone.parentNode) {\n continue;\n }\n\n parent = dropzone.ownerSVGElement;\n }\n else {\n parent = dropzone;\n }\n\n dropzoneParents = [];\n\n while (parent.parentNode !== parent.ownerDocument) {\n dropzoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n\n n = 0;\n\n // get (position of last common ancestor) + 1\n while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) {\n n++;\n }\n\n const parents = [\n dropzoneParents[n - 1],\n dropzoneParents[n],\n deepestZoneParents[n],\n ];\n\n child = parents[0].lastChild;\n\n while (child) {\n if (child === parents[1]) {\n deepestZone = dropzone;\n index = i;\n deepestZoneParents = [];\n\n break;\n }\n else if (child === parents[2]) {\n break;\n }\n\n child = child.previousSibling;\n }\n }\n\n return index;\n },\n\n matchesUpTo: function (element, selector, limit) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) {\n return true;\n }\n\n element = domUtils.parentNode(element);\n\n if (element === limit) {\n return domUtils.matchesSelector(element, selector);\n }\n }\n\n return false;\n },\n\n getActualElement: function (element) {\n return (element instanceof domObjects.SVGElementInstance\n ? element.correspondingUseElement\n : element);\n },\n\n getScrollXY: function (relevantWindow) {\n relevantWindow = relevantWindow || win.window;\n return {\n x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft,\n y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop,\n };\n },\n\n getElementClientRect: function (element) {\n const clientRect = (element instanceof domObjects.SVGElement\n ? element.getBoundingClientRect()\n : element.getClientRects()[0]);\n\n return clientRect && {\n left : clientRect.left,\n right : clientRect.right,\n top : clientRect.top,\n bottom: clientRect.bottom,\n width : clientRect.width || clientRect.right - clientRect.left,\n height: clientRect.height || clientRect.bottom - clientRect.top,\n };\n },\n\n getElementRect: function (element) {\n const clientRect = domUtils.getElementClientRect(element);\n\n if (!browser.isIOS7 && clientRect) {\n const scroll = domUtils.getScrollXY(win.getWindow(element));\n\n clientRect.left += scroll.x;\n clientRect.right += scroll.x;\n clientRect.top += scroll.y;\n clientRect.bottom += scroll.y;\n }\n\n return clientRect;\n },\n\n getPath: function (element) {\n const path = [];\n\n while (element) {\n path.push(element);\n element = domUtils.parentNode(element);\n }\n\n return path;\n },\n\n trySelector: value => {\n if (!is.string(value)) { return false; }\n\n // an exception will be raised if it is invalid\n domObjects.document.querySelector(value);\n return true;\n },\n};\n\nmodule.exports = domUtils;\n","const is = require('./is');\nconst domUtils = require('./domUtils');\nconst pExtend = require('./pointerExtend');\n\nconst { window, getWindow } = require('./window');\nconst { indexOf, contains } = require('./arr');\n\nconst useAttachEvent = ('attachEvent' in window) && !('addEventListener' in window);\nconst addEvent = useAttachEvent? 'attachEvent': 'addEventListener';\nconst removeEvent = useAttachEvent? 'detachEvent': 'removeEventListener';\nconst on = useAttachEvent? 'on': '';\n\nconst elements = [];\nconst targets = [];\nconst attachedListeners = [];\n\n// {\n// type: {\n// selectors: ['selector', ...],\n// contexts : [document, ...],\n// listeners: [[listener, capture, passive], ...]\n// }\n// }\nconst delegatedEvents = {};\n\nconst documents = [];\n\nconst supportsOptions = !useAttachEvent && (() => {\n let supported = false;\n\n window.document.createElement('div').addEventListener('test', null, {\n get capture () { supported = true; },\n });\n\n return supported;\n})();\n\nfunction add (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n let elementIndex = indexOf(elements, element);\n let target = targets[elementIndex];\n\n if (!target) {\n target = {\n events: {},\n typeCount: 0,\n };\n\n elementIndex = elements.push(element) - 1;\n targets.push(target);\n\n attachedListeners.push(useAttachEvent\n ? {\n supplied: [],\n wrapped : [],\n useCount: [],\n }\n : null);\n }\n\n if (!target.events[type]) {\n target.events[type] = [];\n target.typeCount++;\n }\n\n if (!contains(target.events[type], listener)) {\n let ret;\n\n if (useAttachEvent) {\n const { supplied, wrapped, useCount } = attachedListeners[elementIndex];\n const listenerIndex = indexOf(supplied, listener);\n\n const wrappedListener = wrapped[listenerIndex] || function (event) {\n if (!event.immediatePropagationStopped) {\n event.target = event.srcElement;\n event.currentTarget = element;\n\n event.preventDefault = event.preventDefault || preventDef;\n event.stopPropagation = event.stopPropagation || stopProp;\n event.stopImmediatePropagation = event.stopImmediatePropagation || stopImmProp;\n\n if (/mouse|click/.test(event.type)) {\n event.pageX = event.clientX + getWindow(element).document.documentElement.scrollLeft;\n event.pageY = event.clientY + getWindow(element).document.documentElement.scrollTop;\n }\n\n listener(event);\n }\n };\n\n ret = element[addEvent](on + type, wrappedListener, !!options.capture);\n\n if (listenerIndex === -1) {\n supplied.push(listener);\n wrapped.push(wrappedListener);\n useCount.push(1);\n }\n else {\n useCount[listenerIndex]++;\n }\n }\n else {\n ret = element[addEvent](type, listener, supportsOptions? options : !!options.capture);\n }\n target.events[type].push(listener);\n\n return ret;\n }\n}\n\nfunction remove (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const elementIndex = indexOf(elements, element);\n const target = targets[elementIndex];\n\n if (!target || !target.events) {\n return;\n }\n\n let wrappedListener = listener;\n let listeners;\n let listenerIndex;\n\n if (useAttachEvent) {\n listeners = attachedListeners[elementIndex];\n listenerIndex = indexOf(listeners.supplied, listener);\n wrappedListener = listeners.wrapped[listenerIndex];\n }\n\n if (type === 'all') {\n for (type in target.events) {\n if (target.events.hasOwnProperty(type)) {\n remove(element, type, 'all');\n }\n }\n return;\n }\n\n if (target.events[type]) {\n const len = target.events[type].length;\n\n if (listener === 'all') {\n for (let i = 0; i < len; i++) {\n remove(element, type, target.events[type][i], options);\n }\n return;\n }\n else {\n for (let i = 0; i < len; i++) {\n if (target.events[type][i] === listener) {\n element[removeEvent](on + type, wrappedListener, supportsOptions? options : !!options.capture);\n target.events[type].splice(i, 1);\n\n if (useAttachEvent && listeners) {\n listeners.useCount[listenerIndex]--;\n if (listeners.useCount[listenerIndex] === 0) {\n listeners.supplied.splice(listenerIndex, 1);\n listeners.wrapped.splice(listenerIndex, 1);\n listeners.useCount.splice(listenerIndex, 1);\n }\n }\n\n break;\n }\n }\n }\n\n if (target.events[type] && target.events[type].length === 0) {\n target.events[type] = null;\n target.typeCount--;\n }\n }\n\n if (!target.typeCount) {\n targets.splice(elementIndex, 1);\n elements.splice(elementIndex, 1);\n attachedListeners.splice(elementIndex, 1);\n }\n}\n\nfunction addDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n if (!delegatedEvents[type]) {\n delegatedEvents[type] = {\n selectors: [],\n contexts : [],\n listeners: [],\n };\n\n // add delegate listener functions\n for (let i = 0; i < documents.length; i++) {\n add(documents[i], type, delegateListener);\n add(documents[i], type, delegateUseCapture, true);\n }\n }\n\n const delegated = delegatedEvents[type];\n let index;\n\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n break;\n }\n }\n\n if (index === -1) {\n index = delegated.selectors.length;\n\n delegated.selectors.push(selector);\n delegated.contexts .push(context);\n delegated.listeners.push([]);\n }\n\n // keep listener and capture and passive flags\n delegated.listeners[index].push([listener, !!options.capture, options.passive]);\n}\n\nfunction removeDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const delegated = delegatedEvents[type];\n let matchFound = false;\n let index;\n\n if (!delegated) { return; }\n\n // count from last index of delegated to 0\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n // look for matching selector and context Node\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n\n const listeners = delegated.listeners[index];\n\n // each item of the listeners array is an array: [function, capture, passive]\n for (let i = listeners.length - 1; i >= 0; i--) {\n const [fn, capture, passive] = listeners[i];\n\n // check if the listener functions and capture and passive flags match\n if (fn === listener && capture === !!options.capture && passive === options.passive) {\n // remove the listener from the array of listeners\n listeners.splice(i, 1);\n\n // if all listeners for this interactable have been removed\n // remove the interactable from the delegated arrays\n if (!listeners.length) {\n delegated.selectors.splice(index, 1);\n delegated.contexts .splice(index, 1);\n delegated.listeners.splice(index, 1);\n\n // remove delegate function from context\n remove(context, type, delegateListener);\n remove(context, type, delegateUseCapture, true);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegatedEvents[type] = null;\n }\n }\n\n // only remove one listener\n matchFound = true;\n break;\n }\n }\n\n if (matchFound) { break; }\n }\n }\n}\n\n// bound to the interactable context when a DOM event\n// listener is added to a selector interactable\nfunction delegateListener (event, optionalArg) {\n const options = getOptions(optionalArg);\n const fakeEvent = {};\n const delegated = delegatedEvents[event.type];\n const eventTarget = (domUtils.getActualElement(event.path\n ? event.path[0]\n : event.target));\n let element = eventTarget;\n\n // duplicate the event so that currentTarget can be changed\n pExtend(fakeEvent, event);\n\n fakeEvent.originalEvent = event;\n fakeEvent.preventDefault = preventOriginalDefault;\n\n // climb up document tree looking for selector matches\n while (is.element(element)) {\n for (let i = 0; i < delegated.selectors.length; i++) {\n const selector = delegated.selectors[i];\n const context = delegated.contexts[i];\n\n if (domUtils.matchesSelector(element, selector)\n && domUtils.nodeContains(context, eventTarget)\n && domUtils.nodeContains(context, element)) {\n\n const listeners = delegated.listeners[i];\n\n fakeEvent.currentTarget = element;\n\n for (let j = 0; j < listeners.length; j++) {\n const [fn, capture, passive] = listeners[j];\n\n if (capture === !!options.capture && passive === options.passive) {\n fn(fakeEvent);\n }\n }\n }\n }\n\n element = domUtils.parentNode(element);\n }\n}\n\nfunction delegateUseCapture (event) {\n return delegateListener.call(this, event, true);\n}\n\nfunction preventDef () {\n this.returnValue = false;\n}\n\nfunction preventOriginalDefault () {\n this.originalEvent.preventDefault();\n}\n\nfunction stopProp () {\n this.cancelBubble = true;\n}\n\nfunction stopImmProp () {\n this.cancelBubble = true;\n this.immediatePropagationStopped = true;\n}\n\nfunction getOptions (param) {\n return is.object(param)? param : { capture: param };\n}\n\nmodule.exports = {\n add,\n remove,\n\n addDelegate,\n removeDelegate,\n\n delegateListener,\n delegateUseCapture,\n delegatedEvents,\n documents,\n\n useAttachEvent,\n supportsOptions,\n\n _elements: elements,\n _targets: targets,\n _attachedListeners: attachedListeners,\n};\n","module.exports = function extend (dest, source) {\n for (const prop in source) {\n dest[prop] = source[prop];\n }\n return dest;\n};\n","const {\n resolveRectLike,\n rectToXY,\n} = require('./rect');\n\nmodule.exports = function (target, element, action) {\n const actionOptions = target.options[action];\n const actionOrigin = actionOptions && actionOptions.origin;\n const origin = actionOrigin || target.options.origin;\n\n const originRect = resolveRectLike(origin, target, element, [target && element]);\n\n return rectToXY(originRect) || { x: 0, y: 0 };\n};\n","module.exports = (x, y) => Math.sqrt(x * x + y * y);\n","const extend = require('./extend');\nconst win = require('./window');\n\nconst utils = {\n warnOnce: function (method, message) {\n let warned = false;\n\n return function () {\n if (!warned) {\n win.window.console.warn(message);\n warned = true;\n }\n\n return method.apply(this, arguments);\n };\n },\n\n // http://stackoverflow.com/a/5634528/2280888\n _getQBezierValue: function (t, p1, p2, p3) {\n const iT = 1 - t;\n return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3;\n },\n\n getQuadraticCurvePoint: function (startX, startY, cpX, cpY, endX, endY, position) {\n return {\n x: utils._getQBezierValue(position, startX, cpX, endX),\n y: utils._getQBezierValue(position, startY, cpY, endY),\n };\n },\n\n // http://gizma.com/easing/\n easeOutQuad: function (t, b, c, d) {\n t /= d;\n return -c * t*(t-2) + b;\n },\n\n copyAction: function (dest, src) {\n dest.name = src.name;\n dest.axis = src.axis;\n dest.edges = src.edges;\n\n return dest;\n },\n\n is : require('./is'),\n extend : extend,\n hypot : require('./hypot'),\n getOriginXY: require('./getOriginXY'),\n};\n\nextend(utils, require('./arr'));\nextend(utils, require('./domUtils'));\nextend(utils, require('./pointerUtils'));\nextend(utils, require('./rect'));\n\nmodule.exports = utils;\n","const scope = require('../scope');\nconst utils = require('./index');\nconst browser = require('./browser');\n\nconst finder = {\n methodOrder: [ 'simulationResume', 'mouse', 'hasPointer', 'idle' ],\n\n search: function (pointer, eventType, eventTarget) {\n const mouseEvent = (/mouse/i.test(pointer.pointerType || eventType)\n // MSPointerEvent.MSPOINTER_TYPE_MOUSE\n || pointer.pointerType === 4);\n const pointerId = utils.getPointerId(pointer);\n const details = { pointer, pointerId, mouseEvent, eventType, eventTarget };\n\n for (const method of finder.methodOrder) {\n const interaction = finder[method](details);\n\n if (interaction) {\n return interaction;\n }\n }\n },\n\n // try to resume simulation with a new pointer\n simulationResume: function ({ mouseEvent, eventType, eventTarget }) {\n if (!/down|start/i.test(eventType)) {\n return null;\n }\n\n for (const interaction of scope.interactions) {\n let element = eventTarget;\n\n if (interaction.simulation && interaction.simulation.allowResume\n && (interaction.mouse === mouseEvent)) {\n while (element) {\n // if the element is the interaction element\n if (element === interaction.element) {\n return interaction;\n }\n element = utils.parentNode(element);\n }\n }\n }\n\n return null;\n },\n\n // if it's a mouse interaction\n mouse: function ({ pointerId, mouseEvent, eventType }) {\n if (!mouseEvent && (browser.supportsTouch || browser.supportsPointerEvent)) {\n return null;\n }\n\n let firstNonActive;\n\n for (const interaction of scope.interactions) {\n if (interaction.mouse) {\n // if it's a down event, skip interactions with running simulations\n if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; }\n\n // if the interaction is active, return it immediately\n if (interaction.interacting()) {\n return interaction;\n }\n // otherwise save it and look for another active interaction\n else if (!firstNonActive) {\n firstNonActive = interaction;\n }\n }\n }\n\n // if no active mouse interaction was found use the first inactive mouse\n // interaction\n if (firstNonActive) {\n return firstNonActive;\n }\n\n // Find any interaction specifically for mouse.\n // ignore the interaction if the eventType is a mousedown, and a simulation\n // is active\n for (const interaction of scope.interactions) {\n if (interaction.mouse && !(/down/.test(eventType) && interaction.simulation)) {\n return interaction;\n }\n }\n\n return null;\n },\n\n // get interaction that has this pointer\n hasPointer: function ({ pointerId }) {\n for (const interaction of scope.interactions) {\n if (utils.contains(interaction.pointerIds, pointerId)) {\n return interaction;\n }\n }\n },\n\n // get first idle interaction\n idle: function ({ mouseEvent }) {\n for (const interaction of scope.interactions) {\n // if there's already a pointer held down\n if (interaction.pointerIds.length === 1) {\n const target = interaction.target;\n // don't add this pointer if there is a target interactable and it\n // isn't gesturable\n if (target && !target.options.gesture.enabled) {\n continue;\n }\n }\n // maximum of 2 pointers per interaction\n else if (interaction.pointerIds.length >= 2) {\n continue;\n }\n\n if (!interaction.interacting() && (mouseEvent === interaction.mouse)) {\n return interaction;\n }\n }\n\n return null;\n },\n};\n\nmodule.exports = finder;\n","const win = require('./window');\nconst isWindow = require('./isWindow');\n\nconst is = {\n array : () => {},\n\n window : thing => thing === win.window || isWindow(thing),\n\n docFrag : thing => is.object(thing) && thing.nodeType === 11,\n\n object : thing => !!thing && (typeof thing === 'object'),\n\n function: thing => typeof thing === 'function',\n\n number : thing => typeof thing === 'number' ,\n\n bool : thing => typeof thing === 'boolean' ,\n\n string : thing => typeof thing === 'string' ,\n\n element: thing => {\n if (!thing || (typeof thing !== 'object')) { return false; }\n\n const _window = win.getWindow(thing) || win.window;\n\n return (/object|function/.test(typeof _window.Element)\n ? thing instanceof _window.Element //DOM2\n : thing.nodeType === 1 && typeof thing.nodeName === 'string');\n },\n};\n\nis.array = thing => (is.object(thing)\n && (typeof thing.length !== 'undefined')\n && is.function(thing.splice));\n\nmodule.exports = is;\n","module.exports = (thing) => !!(thing && thing.Window) && (thing instanceof thing.Window);\n","function pointerExtend (dest, source) {\n for (const prop in source) {\n const prefixedPropREs = module.exports.prefixedPropREs;\n let deprecated = false;\n\n // skip deprecated prefixed properties\n for (const vendor in prefixedPropREs) {\n if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) {\n deprecated = true;\n break;\n }\n }\n\n if (!deprecated && typeof source[prop] !== 'function') {\n dest[prop] = source[prop];\n }\n }\n return dest;\n}\n\npointerExtend.prefixedPropREs = {\n webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/,\n};\n\nmodule.exports = pointerExtend;\n","const hypot = require('./hypot');\nconst browser = require('./browser');\nconst dom = require('./domObjects');\nconst domUtils = require('./domUtils');\nconst is = require('./is');\nconst pointerExtend = require('./pointerExtend');\n\nconst pointerUtils = {\n copyCoords: function (dest, src) {\n dest.page = dest.page || {};\n dest.page.x = src.page.x;\n dest.page.y = src.page.y;\n\n dest.client = dest.client || {};\n dest.client.x = src.client.x;\n dest.client.y = src.client.y;\n\n dest.timeStamp = src.timeStamp;\n },\n\n setCoordDeltas: function (targetObj, prev, cur) {\n targetObj.page.x = cur.page.x - prev.page.x;\n targetObj.page.y = cur.page.y - prev.page.y;\n targetObj.client.x = cur.client.x - prev.client.x;\n targetObj.client.y = cur.client.y - prev.client.y;\n targetObj.timeStamp = cur.timeStamp - prev.timeStamp;\n\n // set pointer velocity\n const dt = Math.max(targetObj.timeStamp / 1000, 0.001);\n\n targetObj.page.speed = hypot(targetObj.page.x, targetObj.page.y) / dt;\n targetObj.page.vx = targetObj.page.x / dt;\n targetObj.page.vy = targetObj.page.y / dt;\n\n targetObj.client.speed = hypot(targetObj.client.x, targetObj.page.y) / dt;\n targetObj.client.vx = targetObj.client.x / dt;\n targetObj.client.vy = targetObj.client.y / dt;\n },\n\n isNativePointer: function (pointer) {\n return (pointer instanceof dom.Event || pointer instanceof dom.Touch);\n },\n\n // Get specified X/Y coords for mouse or event.touches[0]\n getXY: function (type, pointer, xy) {\n xy = xy || {};\n type = type || 'page';\n\n xy.x = pointer[type + 'X'];\n xy.y = pointer[type + 'Y'];\n\n return xy;\n },\n\n getPageXY: function (pointer, page) {\n page = page || {};\n\n // Opera Mobile handles the viewport and scrolling oddly\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n pointerUtils.getXY('screen', pointer, page);\n\n page.x += window.scrollX;\n page.y += window.scrollY;\n }\n else {\n pointerUtils.getXY('page', pointer, page);\n }\n\n return page;\n },\n\n getClientXY: function (pointer, client) {\n client = client || {};\n\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n // Opera Mobile handles the viewport and scrolling oddly\n pointerUtils.getXY('screen', pointer, client);\n }\n else {\n pointerUtils.getXY('client', pointer, client);\n }\n\n return client;\n },\n\n getPointerId: function (pointer) {\n return is.number(pointer.pointerId)? pointer.pointerId : pointer.identifier;\n },\n\n setCoords: function (targetObj, pointers, timeStamp) {\n const pointer = (pointers.length > 1\n ? pointerUtils.pointerAverage(pointers)\n : pointers[0]);\n\n const tmpXY = {};\n\n pointerUtils.getPageXY(pointer, tmpXY);\n targetObj.page.x = tmpXY.x;\n targetObj.page.y = tmpXY.y;\n\n pointerUtils.getClientXY(pointer, tmpXY);\n targetObj.client.x = tmpXY.x;\n targetObj.client.y = tmpXY.y;\n\n targetObj.timeStamp = is.number(timeStamp) ? timeStamp :new Date().getTime();\n },\n\n pointerExtend: pointerExtend,\n\n getTouchPair: function (event) {\n const touches = [];\n\n // array of touches is supplied\n if (is.array(event)) {\n touches[0] = event[0];\n touches[1] = event[1];\n }\n // an event\n else {\n if (event.type === 'touchend') {\n if (event.touches.length === 1) {\n touches[0] = event.touches[0];\n touches[1] = event.changedTouches[0];\n }\n else if (event.touches.length === 0) {\n touches[0] = event.changedTouches[0];\n touches[1] = event.changedTouches[1];\n }\n }\n else {\n touches[0] = event.touches[0];\n touches[1] = event.touches[1];\n }\n }\n\n return touches;\n },\n\n pointerAverage: function (pointers) {\n const average = {\n pageX : 0,\n pageY : 0,\n clientX: 0,\n clientY: 0,\n screenX: 0,\n screenY: 0,\n };\n\n for (const pointer of pointers) {\n for (const prop in average) {\n average[prop] += pointer[prop];\n }\n }\n for (const prop in average) {\n average[prop] /= pointers.length;\n }\n\n return average;\n },\n\n touchBBox: function (event) {\n if (!event.length && !(event.touches && event.touches.length > 1)) {\n return;\n }\n\n const touches = pointerUtils.getTouchPair(event);\n const minX = Math.min(touches[0].pageX, touches[1].pageX);\n const minY = Math.min(touches[0].pageY, touches[1].pageY);\n const maxX = Math.max(touches[0].pageX, touches[1].pageX);\n const maxY = Math.max(touches[0].pageY, touches[1].pageY);\n\n return {\n x: minX,\n y: minY,\n left: minX,\n top: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n },\n\n touchDistance: function (event, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n\n\n const dx = touches[0][sourceX] - touches[1][sourceX];\n const dy = touches[0][sourceY] - touches[1][sourceY];\n\n return hypot(dx, dy);\n },\n\n touchAngle: function (event, prevAngle, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n const dx = touches[1][sourceX] - touches[0][sourceX];\n const dy = touches[1][sourceY] - touches[0][sourceY];\n const angle = 180 * Math.atan2(dy , dx) / Math.PI;\n\n return angle;\n },\n\n getPointerType: function (pointer, interaction) {\n // if the PointerEvent API isn't available, then the pointer must be ither\n // a MouseEvent or TouchEvent\n if (interaction.mouse) { return 'mouse'; }\n if (!browser.supportsPointerEvent) { return 'touch'; }\n\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : [undefined, undefined,'touch', 'pen', 'mouse'][pointer.pointerType];\n },\n\n // [ event.target, event.currentTarget ]\n getEventTargets: function (event) {\n return [\n domUtils.getActualElement(event.path ? event.path[0] : event.target),\n domUtils.getActualElement(event.currentTarget),\n ];\n },\n};\n\nmodule.exports = pointerUtils;\n","const { window } = require('./window');\n\nconst vendors = ['ms', 'moz', 'webkit', 'o'];\nlet lastTime = 0;\nlet request;\nlet cancel;\n\nfor (let x = 0; x < vendors.length && !window.requestAnimationFrame; x++) {\n request = window[vendors[x] + 'RequestAnimationFrame'];\n cancel = window[vendors[x] +'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n}\n\nif (!request) {\n request = function (callback) {\n const currTime = new Date().getTime();\n const timeToCall = Math.max(0, 16 - (currTime - lastTime));\n const id = setTimeout(function () { callback(currTime + timeToCall); },\n timeToCall);\n\n lastTime = currTime + timeToCall;\n return id;\n };\n}\n\nif (!cancel) {\n cancel = function (id) {\n clearTimeout(id);\n };\n}\n\nmodule.exports = {\n request,\n cancel,\n};\n","const extend = require('./extend');\nconst is = require('./is');\nconst {\n closest,\n parentNode,\n getElementRect,\n} = require('./domUtils');\n\nconst rectUtils = {\n getStringOptionResult: function (value, interactable, element) {\n if (!is.string(value)) {\n return null;\n }\n\n if (value === 'parent') {\n value = parentNode(element);\n }\n else if (value === 'self') {\n value = interactable.getRect(element);\n }\n else {\n value = closest(element, value);\n }\n\n return value;\n },\n\n resolveRectLike: function (value, interactable, element, functionArgs) {\n value = rectUtils.getStringOptionResult(value, interactable, element) || value;\n\n if (is.function(value)) {\n value = value.apply(null, functionArgs);\n }\n\n if (is.element(value)) {\n value = getElementRect(value);\n }\n\n return value;\n },\n\n rectToXY: function (rect) {\n return rect && {\n x: 'x' in rect ? rect.x : rect.left,\n y: 'y' in rect ? rect.y : rect.top,\n };\n },\n\n xywhToTlbr: function (rect) {\n if (rect && !('left' in rect && 'top' in rect)) {\n rect = extend({}, rect);\n\n rect.left = rect.x || 0;\n rect.top = rect.y || 0;\n rect.right = rect.right || (rect.left + rect.width);\n rect.bottom = rect.bottom || (rect.top + rect.height);\n }\n\n return rect;\n },\n\n tlbrToXywh: function (rect) {\n if (rect && !('x' in rect && 'y' in rect)) {\n rect = extend({}, rect);\n\n rect.x = rect.left || 0;\n rect.top = rect.top || 0;\n rect.width = rect.width || (rect.right - rect.x);\n rect.height = rect.height || (rect.bottom - rect.y);\n }\n\n return rect;\n },\n};\n\nmodule.exports = rectUtils;\n","const win = module.exports;\nconst isWindow = require('./isWindow');\n\nfunction init (window) {\n // get wrapped window if using Shadow DOM polyfill\n\n win.realWindow = window;\n\n // create a TextNode\n const el = window.document.createTextNode('');\n\n // check if it's wrapped by a polyfill\n if (el.ownerDocument !== window.document\n && typeof window.wrap === 'function'\n && window.wrap(el) === el) {\n // use wrapped window\n window = window.wrap(window);\n }\n\n win.window = window;\n}\n\nif (typeof window === 'undefined') {\n win.window = undefined;\n win.realWindow = undefined;\n}\nelse {\n init(window);\n}\n\nwin.getWindow = function getWindow (node) {\n if (isWindow(node)) {\n return node;\n }\n\n const rootNode = (node.ownerDocument || node);\n\n return rootNode.defaultView || rootNode.parentWindow || win.window;\n};\n\nwin.init = init;\n"]} \ No newline at end of file +{"version":3,"sources":["src/minHeader.js","src/header.js","index.js","src/Eventable.js","src/InteractEvent.js","src/Interactable.js","src/Interaction.js","src/actions/base.js","src/actions/drag.js","src/actions/drop.js","src/actions/gesture.js","src/actions/resize.js","src/autoScroll.js","src/autoStart/InteractableMethods.js","src/autoStart/base.js","src/autoStart/delay.js","src/autoStart/drag.js","src/autoStart/gesture.js","src/autoStart/resize.js","src/defaultOptions.js","src/index.js","src/inertia.js","src/interact.js","src/interactablePreventDefault.js","src/legacyBrowsers.js","src/modifiers/index.js","src/modifiers/restrict.js","src/modifiers/restrictEdges.js","src/modifiers/restrictSize.js","src/modifiers/snap.js","src/modifiers/snapSize.js","src/pointerEvents/PointerEvent.js","src/pointerEvents/base.js","src/pointerEvents/holdRepeat.js","src/pointerEvents/interactableTargets.js","src/scope.js","src/utils/Signals.js","src/utils/arr.js","src/utils/browser.js","src/utils/domObjects.js","src/utils/domUtils.js","src/utils/events.js","src/utils/extend.js","src/utils/getOriginXY.js","src/utils/hypot.js","src/utils/index.js","src/utils/interactionFinder.js","src/utils/is.js","src/utils/isWindow.js","src/utils/pointerExtend.js","src/utils/pointerUtils.js","src/utils/raf.js","src/utils/rect.js","src/utils/window.js"],"names":[],"mappings":";AAAA,CCMA,SAAA,GAAA,GAAA,gBAAA,UAAA,mBAAA,QAAA,OAAA,QAAA,QAAA,IAAA,kBAAA,SAAA,OAAA,IAAA,UAAA,OAAA,CAAA,GAAA,EAAA,GAAA,mBAAA,QAAA,OAAA,mBAAA,QAAA,OAAA,mBAAA,MAAA,KAAA,KAAA,EAAA,SAAA,MAAA,WAAA,MAAA,SAAA,GAAA,EAAA,EAAA,GAAA,QAAA,GAAA,EAAA,GAAA,IAAA,EAAA,GAAA,CAAA,IAAA,EAAA,GAAA,CAAA,GAAA,GAAA,kBAAA,UAAA,OAAA,KAAA,GAAA,EAAA,MAAA,GAAA,GAAA,EAAA,IAAA,EAAA,MAAA,GAAA,GAAA,EAAA,IAAA,GAAA,GAAA,OAAA,uBAAA,EAAA,IAAA,MAAA,GAAA,KAAA,mBAAA,EAAA,GAAA,GAAA,EAAA,IAAA,WAAA,GAAA,GAAA,GAAA,KAAA,EAAA,QAAA,SAAA,GAAA,GAAA,GAAA,EAAA,GAAA,GAAA,EAAA,OAAA,GAAA,GAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,GAAA,MAAA,GAAA,GAAA,QAAA,IAAA,GAAA,GAAA,kBAAA,UAAA,QAAA,EAAA,EAAA,EAAA,EAAA,OAAA,IAAA,EAAA,EAAA,GAAA,OAAA,KAAA,GAAA,SAAA,EAAA,EAAA,GACA,YCCsB,oBAAX,QACT,EAAO,QAAU,SAAU,GAGzB,MAFA,GAAQ,sBAAsB,KAAK,GAE5B,EAAQ,gBAIjB,EAAO,QAAU,EAAQ,0LCb3B,QAAS,GAA2B,EAAO,GACzC,IAAK,GAAI,GAAI,EAAG,EAAM,EAAU,OAAQ,EAAI,IAAQ,EAAM,4BAA6B,IACrF,EAAU,GAAG,SALG,EAAQ,eAApB,IAAA,QACF,EAAS,EAAQ,qBAQjB,aAEJ,QAAA,GAAa,GAAS,EAAA,KAAA,GACpB,KAAK,QAAU,KAAW,0BAG5B,cAAM,GACJ,GAAI,OAAA,GACE,EAAU,KAAO,EAAM,KACvB,EAAS,KAAK,QAGf,EAAY,KAAK,EAAM,QAC1B,EAA0B,EAAO,GAI/B,KAAK,IACP,KAAK,GAAS,IAIX,EAAM,oBAAsB,IAAW,EAAY,EAAO,EAAM,QACnE,EAA0B,EAAO,gBAIrC,YAAI,EAAW,GAET,KAAK,GACP,KAAK,GAAW,KAAK,GAGrB,KAAK,IAAc,gBAIvB,aAAK,EAAW,GAEd,GAAM,GAAY,KAAK,GACjB,EAAY,EAAW,EAAQ,EAAW,IAAa,GAE9C,IAAX,GACF,EAAU,OAAO,EAAO,IAGtB,GAAkC,IAArB,EAAU,SAAiB,KAC1C,KAAK,GAAa,QAKxB,GAAO,QAAU,4KC7DjB,GAAM,GAAc,EAAQ,kBACtB,EAAc,EAAQ,uBACtB,EAAc,EAAQ,oBACtB,EAAc,EAAQ,mBAAmB,MAEzC,aACJ,QAAA,GAAa,EAAa,EAAO,EAAQ,EAAO,EAAS,GAAyB,GAAhB,GAAgB,UAAA,OAAA,OAAA,KAAA,UAAA,IAAA,UAAA,EAAA,GAAA,KAAA,EAChF,IAAM,GAAc,EAAY,OAC1B,GAAe,GAAU,EAAO,SAAW,GAAU,YACrD,EAAc,EAAY,EAAQ,EAAS,GAC3C,EAAwB,UAAV,EACd,EAAwB,QAAV,EACd,EAAc,EAAU,EAAY,YAAc,EAAY,UAC9D,EAAc,EAAY,SAEhC,GAAU,GAAW,EAAY,OAEjC,IAAM,GAAS,KAAW,EAAO,MAC3B,EAAS,KAAW,EAAO,OAEjC,GAAK,GAAK,EAAO,EACjB,EAAK,GAAK,EAAO,EAEjB,EAAO,GAAK,EAAO,EACnB,EAAO,GAAK,EAAO,EAEnB,KAAK,QAAgB,EAAM,QAC3B,KAAK,OAAgB,EAAM,OAC3B,KAAK,SAAgB,EAAM,SAC3B,KAAK,QAAgB,EAAM,QAC3B,KAAK,OAAgB,EAAM,OAC3B,KAAK,QAAgB,EAAM,QAC3B,KAAK,OAAgB,EACrB,KAAK,cAAgB,EACrB,KAAK,cAAgB,GAAW,KAChC,KAAK,OAAgB,EACrB,KAAK,KAAgB,GAAU,GAAS,IACxC,KAAK,YAAgB,EACrB,KAAK,aAAgB,EAErB,KAAK,GAAK,EAAW,EAAY,UAAU,EAAY,UAAU,OAAS,GACrD,EAAU,EAE/B,IAAM,IACJ,YAAA,EACA,MAAA,EACA,OAAA,EACA,MAAA,EACA,QAAA,EACA,QAAA,EACA,KAAA,EACA,OAAA,EACA,OAAA,EACA,SAAA,EACA,OAAA,EACA,YAAA,EACA,OAAQ,KAGV,GAAQ,KAAK,SAAU,GAEnB,GAEF,KAAK,MAAQ,EAAU,MACvB,KAAK,MAAQ,EAAU,MACvB,KAAK,QAAU,EAAU,QACzB,KAAK,QAAU,EAAU,UAGzB,KAAK,MAAY,EAAK,EACtB,KAAK,MAAY,EAAK,EACtB,KAAK,QAAY,EAAO,EACxB,KAAK,QAAY,EAAO,GAG1B,KAAK,GAAY,EAAY,YAAY,KAAK,EAAI,EAAO,EACzD,KAAK,GAAY,EAAY,YAAY,KAAK,EAAI,EAAO,EACzD,KAAK,SAAY,EAAY,YAAY,OAAO,EAAI,EAAO,EAC3D,KAAK,SAAY,EAAY,YAAY,OAAO,EAAI,EAAO,EAE3D,EAAQ,KAAK,YAAa,GAE1B,KAAK,UAAY,EAAO,UACxB,KAAK,GAAY,EAAY,aAAa,UAC1C,KAAK,SAAY,KAAK,UAAY,KAAK,GAGvC,KAAK,MAAQ,EAAY,aAAa,GAAa,MACnD,KAAK,UAAY,EAAY,aAAa,GAAa,GACvD,KAAK,UAAY,EAAY,aAAa,GAAa,GAEvD,KAAK,MAAS,GAAoB,iBAAV,EAA2B,KAAK,WAAa,KAErE,EAAQ,KAAK,MAAO,sBAGtB,oBACE,GAAM,GAAc,KAAK,WAEzB,IAAI,EAAY,UAAU,MAAQ,KAC3B,KAAK,UAAY,EAAY,UAAU,UAAY,IACxD,MAAO,KAGT,IAAI,GAAQ,IAAM,KAAK,MAAM,EAAY,UAAU,UAAW,EAAY,UAAU,WAAa,KAAK,EAGlG,GAAQ,IACV,GAAS,IAGX,IAAM,GAAO,OAAiB,GAAS,EAAQ,MACzC,EAAO,OAAiB,GAAS,EAAQ,MAEzC,GAAS,IAAS,OAAiB,GAAS,EAAS,KAG3D,QACE,GAAA,EACA,MAJa,GAAU,MAAgB,GAAS,EAAQ,MAKxD,KAAA,EACA,MAAA,EACA,MAAA,EACA,MAAO,EAAY,UAAU,MAC7B,UACE,EAAG,EAAY,UAAU,UACzB,EAAG,EAAY,UAAU,yBAK/B,wCAEA,oCACE,KAAK,4BAA8B,KAAK,oBAAqB,eAG/D,2BACE,KAAK,oBAAqB,OAI9B,GAAQ,GAAG,YAAa,SAAA,GAA0D,GAA9C,GAA8C,EAA9C,OAAQ,EAAsC,EAAtC,YAAa,EAAyB,EAAzB,SAAU,EAAe,EAAf,YAC3D,EAAY,EAAU,EAAS,EAAY,SAE7B,YAAhB,GACF,EAAO,GAAK,EAAO,QAAU,EAAU,QACvC,EAAO,GAAK,EAAO,QAAU,EAAU,UAGvC,EAAO,GAAK,EAAO,MAAQ,EAAU,MACrC,EAAO,GAAK,EAAO,MAAQ,EAAU,SAIzC,EAAc,QAAU,EAExB,EAAO,QAAU,4NC7JjB,GAAM,GAAY,EAAQ,cACpB,EAAY,EAAQ,kBACpB,EAAY,EAAQ,kBACpB,EAAY,EAAQ,kBACpB,EAAY,EAAQ,WACpB,EAAY,EAAQ,eACpB,EAAY,EAAQ,oBACpB,EAAY,EAAQ,mBAAmB,QAMf,EAAQ,oBAHpC,IAAA,eACA,IAAA,aACA,IAAA,cAE4B,EAAQ,kBAA9B,IAAA,YACsB,EAAQ,eAA9B,IAAA,QAAS,IAAA,WACa,EAAQ,mBAA9B,IAAA,UAGR,GAAM,oBAQA,cACJ,QAAA,GAAa,EAAQ,GAAS,EAAA,KAAA,GAC5B,EAAU,MAEV,KAAK,OAAW,EAChB,KAAK,OAAW,GAAI,GACpB,KAAK,SAAW,EAAQ,SAAW,EAAM,SACzC,KAAK,KAAW,EAAU,EAAY,GAAS,KAAK,SAAW,GAC/D,KAAK,KAAW,KAAK,KAAK,SAE1B,EAAQ,KAAK,OACX,OAAA,EACA,QAAA,EACA,aAAc,KACd,IAAK,KAAK,OAGZ,EAAM,YAAa,KAAK,KAAM,KAAK,MAEnC,EAAM,cAAc,KAAK,MAEzB,KAAK,IAAI,sBAGX,qBAAa,EAAQ,GACnB,GAAM,GAAW,KAAO,CAOxB,OALI,GAAG,SAAS,EAAO,WAAmB,KAAK,OAAO,EAAW,SAAmB,EAAO,SACvF,EAAG,SAAS,EAAO,UAAmB,KAAK,OAAO,EAAW,QAAmB,EAAO,QACvF,EAAG,SAAS,EAAO,SAAmB,KAAK,OAAO,EAAW,OAAmB,EAAO,OACvF,EAAG,SAAS,EAAO,kBAAmB,KAAK,OAAO,EAAW,gBAAmB,EAAO,gBAEpF,kBAGT,sBAAc,EAAQ,GAEpB,IAAK,GAAM,KAAU,GAEf,IAAU,GAAS,KAEjB,EAAG,OAAO,EAAQ,KAEpB,KAAK,QAAQ,GAAQ,GAAU,EAAO,KAAK,QAAQ,GAAQ,OAAe,EAAQ,IAE9E,EAAG,OAAO,EAAS,UAAU,KAAY,WAAa,GAAS,UAAU,KAC3E,KAAK,QAAQ,GAAQ,GAAQ,SAAsC,IAA5B,EAAQ,GAAQ,UAGlD,EAAG,KAAK,EAAQ,KAAY,EAAG,OAAO,EAAS,UAAU,IAChE,KAAK,QAAQ,GAAQ,GAAQ,QAAU,EAAQ,OAEpB,KAApB,EAAQ,KAEf,KAAK,QAAQ,GAAQ,GAAU,EAAQ,kBAwB/C,iBAAS,GAOP,MANA,GAAU,GAAW,KAAK,OAEtB,EAAG,OAAO,KAAK,UAAa,EAAG,QAAQ,KACzC,EAAU,KAAK,SAAS,cAAc,KAAK,SAGtC,EAAe,gBAaxB,qBAAa,GACX,MAAI,GAAG,SAAS,IACd,KAAK,QAAU,EAER,MAGO,OAAZ,SACK,MAAK,QAAQ,QAEb,MAGF,KAAK,qBAGd,2BAAmB,EAAY,GAC7B,GAAI,EAAY,IAAa,EAAG,OAAO,GAAW,CAChD,KAAK,QAAQ,GAAc,CAE3B,KAAA,GAAA,GAAqB,EAAQ,MAA7B,EAAA,MAAA,QAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,OAAA,cAAoC,CAAA,GAAA,EAAA,IAAA,EAAA,CAAA,GAAA,GAAA,EAAA,OAAA,KAAA,GAAA,EAAA,SAAA,CAAA,GAAA,EAAA,EAAA,OAAA,EAAA,KAAA,KAAA,GAAA,EAAA,MAAA,GAAzB,GAAyB,CAClC,MAAK,QAAQ,GAAQ,GAAc,EAGrC,MAAO,MAGT,MAAO,MAAK,QAAQ,gBAgBtB,gBAAQ,GACN,MAAO,MAAK,kBAAkB,SAAU,gBAa1C,qBAAa,GACX,MAAiB,SAAb,GAAoC,WAAb,GACzB,KAAK,QAAQ,YAAc,EAEpB,MAGF,KAAK,QAAQ,yBAYtB,mBACE,MAAO,MAAK,sBAGd,mBAAW,GACT,MAAQ,MAAK,WAAa,EAAQ,eACvB,EAAa,KAAK,SAAU,gBAazC,cAAM,GAGJ,MAFA,MAAK,OAAO,KAAK,GAEV,kBAGT,wBAAgB,EAAQ,EAAW,EAAU,GAK3C,GAJI,EAAG,OAAO,KAAyC,IAA3B,EAAU,OAAO,OAC3C,EAAY,EAAU,OAAO,MAAM,OAGjC,EAAG,MAAM,GAAY,CACvB,IAAK,GAAI,GAAI,EAAG,EAAI,EAAU,OAAQ,IACpC,KAAK,GAAQ,EAAU,GAAI,EAAU,EAGvC,QAAO,EAGT,GAAI,EAAG,OAAO,GAAY,CACxB,IAAK,GAAM,KAAQ,GACjB,KAAK,GAAQ,EAAM,EAAU,GAAO,EAGtC,QAAO,gBAeX,YAAI,EAAW,EAAU,GACvB,MAAI,MAAK,eAAe,KAAM,EAAW,EAAU,GAC1C,MAGS,UAAd,IAAyB,EAAY,GAErC,EAAS,EAAa,WAAY,GACpC,KAAK,OAAO,GAAG,EAAW,GAGnB,EAAG,OAAO,KAAK,QACtB,EAAO,YAAY,KAAK,OAAQ,KAAK,SAAU,EAAW,EAAU,GAGpE,EAAO,IAAI,KAAK,OAAQ,EAAW,EAAU,GAGxC,mBAcT,aAAK,EAAW,EAAU,GACxB,MAAI,MAAK,eAAe,MAAO,EAAW,EAAU,GAC3C,MAGS,UAAd,IAAyB,EAAY,GAGrC,EAAS,EAAa,WAAY,GACpC,KAAK,OAAO,IAAI,EAAW,GAGpB,EAAG,OAAO,KAAK,QACtB,EAAO,eAAe,KAAK,OAAQ,KAAK,SAAU,EAAW,EAAU,GAIvE,EAAO,OAAO,KAAK,OAAQ,EAAW,EAAU,GAG3C,mBAWT,aAAK,GACE,EAAG,OAAO,KACb,MAGF,KAAK,QAAU,KAAW,EAAS,KAEnC,IAAM,GAAa,KAAW,EAAS,UAEvC,KAAK,GAAM,KAAc,GAAQ,WAAY,CAC3C,GAAM,GAAa,EAAQ,WAAW,EAEtC,MAAK,QAAQ,GAAc,KAAW,EAAS,IAE/C,KAAK,aAAa,EAAY,GAE9B,KAAK,GAAY,EAAQ,IAG3B,IAAA,GAAA,GAAsB,EAAa,gBAAnC,EAAA,MAAA,QAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,OAAA,cAAoD,CAAA,GAAA,EAAA,IAAA,EAAA,CAAA,GAAA,GAAA,EAAA,OAAA,KAAA,GAAA,EAAA,SAAA,CAAA,GAAA,EAAA,EAAA,OAAA,EAAA,KAAA,KAAA,GAAA,EAAA,MAAA,GAAzC,GAAyC,CAClD,MAAK,QAAQ,GAAW,EAAS,KAAK,GAElC,IAAW,IACb,KAAK,GAAS,EAAQ,IAS1B,MALA,GAAQ,KAAK,OACX,QAAA,EACA,aAAc,OAGT,kBAYT,iBAGE,GAFA,EAAO,OAAO,KAAK,OAAQ,OAEvB,EAAG,OAAO,KAAK,QAEjB,IAAK,GAAM,KAAQ,GAAO,gBAAiB,CACzC,GAAM,GAAY,EAAO,gBAAgB,EAErC,GAAU,UAAU,KAAO,KAAK,QAC7B,EAAU,SAAS,KAAO,KAAK,WAEpC,EAAU,UAAU,OAAO,EAAG,GAC9B,EAAU,SAAU,OAAO,EAAG,GAC9B,EAAU,UAAU,OAAO,EAAG,GAGzB,EAAU,UAAU,SACvB,EAAU,GAAQ,OAItB,EAAO,OAAO,KAAK,SAAU,EAAM,EAAO,kBAC1C,EAAO,OAAO,KAAK,SAAU,EAAM,EAAO,oBAAoB,OAIhE,GAAO,OAAO,KAAM,MAGtB,GAAQ,KAAK,SAAW,aAAc,OAEtC,EAAM,cAAc,OAAO,EAAQ,EAAM,cAAe,MAAO,EAG/D,KAAA,GAAA,GAA0B,EAAM,iBAAhC,EAAA,MAAA,QAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,OAAA,cAAoD,CAAA,GAAA,EAAA,IAAA,EAAA,CAAA,GAAA,GAAA,EAAA,OAAA,KAAA,GAAA,EAAA,SAAA,CAAA,GAAA,EAAA,EAAA,OAAA,EAAA,KAAA,KAAA,GAAA,EAAA,MAAA,GAAzC,GAAyC,CAC9C,GAAY,SAAW,MAAQ,EAAY,eAC7C,EAAY,OAIhB,MAAO,GAAM,cAIjB,GAAM,cAAc,eAAiB,SAAyB,EAAQ,GACpE,EAAU,GAAW,EAAM,QAE3B,KAAK,GAAI,GAAI,EAAG,EAAI,KAAK,OAAQ,IAAK,CACpC,GAAM,GAAe,KAAK,EAE1B,IAAI,EAAa,SAAW,GAAU,EAAa,WAAa,EAC9D,MAAO,GAGX,OAAQ,GAGV,EAAM,cAAc,IAAM,SAA0B,EAAS,EAAS,GACpE,GAAM,GAAM,KAAK,KAAK,eAAe,EAAS,GAAW,EAAQ,SAEjE,OAAO,KAAQ,EAAG,OAAO,IAAY,GAAsB,EAAI,UAAU,IAAW,EAAM,MAG5F,EAAM,cAAc,gBAAkB,SAAU,EAAU,GACxD,IAAK,GAAI,GAAI,EAAG,EAAI,KAAK,OAAQ,IAAK,CACpC,GAAM,GAAe,KAAK,EAG1B,IAAK,EAAG,OAAO,EAAa,WACpB,GAAY,EAAa,UAAU,IAD3C,CAKA,GAAM,GAAM,EAAS,EAAc,EAAa,OAAQ,EAAa,SAAU,EAAG,KAElF,QAAY,KAAR,EACF,MAAO,MAMb,EAAa,WAAa,EAAM,cAEhC,EAAa,QAAU,EAEvB,EAAa,iBAAoB,cAAe,SAAU,iBAAkB,eAE5E,EAAO,QAAU,uWC1EjB,QAAS,GAAkB,GACzB,MAAQ,UAAU,GAChB,GAAM,GAAc,EAAM,eAAe,GADlB,EAEe,EAAM,gBAAgB,GAArD,EAFgB,EAAA,GAEH,EAFG,EAAA,GAGjB,IAEN,IAAI,EAAQ,eAAiB,QAAQ,KAAK,EAAM,MAAO,CACrD,GAAgB,GAAI,OAAO,SAE3B,KAAK,GAAI,GAAI,EAAG,EAAI,EAAM,eAAe,OAAQ,IAAK,CACpD,GAAM,GAAU,EAAM,eAAe,GAC/B,EAAc,EAAO,OAAO,EAAS,EAAM,KAAM,EAEvD,GAAQ,MAAM,EAAS,GAAe,GAAI,IAAc,YAAA,WAGvD,CACH,GAAI,IAAiB,CAErB,KAAK,EAAQ,sBAAwB,QAAQ,KAAK,EAAM,MAAO,CAE7D,IAAK,GAAI,GAAI,EAAG,EAAI,EAAM,aAAa,SAAW,EAAgB,IAChE,EAAuD,UAAtC,EAAM,aAAa,GAAG,aAA2B,EAAM,aAAa,GAAG,aAK1F,GAAiB,IACX,GAAI,OAAO,UAAY,EAAgB,KAEpB,IAApB,EAAM,UAGb,IAAK,EAAgB,CACnB,GAAI,GAAc,EAAO,OAAO,EAAO,EAAM,KAAM,EAE9C,KACH,EAAc,GAAI,IAAc,YAAA,KAGlC,EAAQ,MAAM,EAAO,KAIzB,IAAA,GAAA,GAAqC,EAArC,EAAA,MAAA,QAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,OAAA,cAA8C,CAAA,GAAA,EAAA,IAAA,EAAA,CAAA,GAAA,GAAA,EAAA,OAAA,KAAA,GAAA,EAAA,SAAA,CAAA,GAAA,EAAA,EAAA,OAAA,EAAA,KAAA,KAAA,GAAA,EAAA,MAAA,GAAA,GAAA,EAAlC,EAAkC,EAAA,GAAzB,EAAyB,EAAA,EAC5C,GAAY,oBAAoB,EAAa,GAC7C,EAAY,GAAQ,EAAS,EAAO,EAAa,KAKvD,QAAS,GAAQ,GACf,IAAK,GAAI,GAAI,EAAG,EAAI,EAAM,aAAa,OAAQ,IAAK,CAClD,GAAM,GAAc,EAAM,aAAa,EAEvC,GAAY,IAAI,GAChB,EAAQ,KAAK,UAAY,MAAA,EAAO,YAAA,KA0BpC,QAAS,GAAT,EAA+B,GAAY,GAAnB,GAAmB,EAAnB,IAChB,EAA4C,IAA9B,EAAW,QAAQ,OACnC,EAAO,IAAM,EAAO,MAGxB,KAAK,GAAM,KAAa,GAAM,gBAC5B,EAAY,EAAK,EAAW,EAAO,kBACnC,EAAY,EAAK,EAAW,EAAO,oBAAoB,EAGzD,KAAK,GAAM,KAAa,GACtB,EAAY,EAAK,EAAW,EAAU,IAzd1C,GAAM,GAAa,EAAQ,WACrB,EAAa,EAAQ,WACrB,EAAa,EAAQ,kBACrB,EAAa,EAAQ,mBACrB,EAAa,EAAQ,sBACrB,EAAa,EAAQ,6BACrB,EAAa,EAAQ,mBAAmB,MAExC,KACA,GACJ,cAAe,cAAe,YAC9B,gBAAiB,iBAIf,EAAgB,CAGpB,GAAM,eAoWN,KAAK,GAlWC,cACJ,QAAA,GAAA,GAA8B,GAAf,GAAe,EAAf,WAAe,GAAA,KAAA,GAC5B,KAAK,OAAgB,KACrB,KAAK,QAAgB,KAErB,KAAK,UACH,KAAO,KACP,KAAO,KACP,MAAO,MAIT,KAAK,YACL,KAAK,cACL,KAAK,eACL,KAAK,aAGL,KAAK,YACH,MAAa,EAAG,EAAG,EAAG,GACtB,QAAa,EAAG,EAAG,EAAG,GACtB,UAAW,GAGb,KAAK,WACH,MAAa,EAAG,EAAG,EAAG,GACtB,QAAa,EAAG,EAAG,EAAG,GACtB,UAAW,GAIb,KAAK,aACH,MAAa,EAAG,EAAG,EAAG,GACtB,QAAa,EAAG,EAAG,EAAG,GACtB,UAAW,GAIb,KAAK,cACH,MAAa,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,GAAI,EAAG,MAAO,GAC9C,QAAa,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,GAAI,EAAG,MAAO,GAC9C,UAAW,GAGb,KAAK,UAAc,KACnB,KAAK,eAEL,KAAK,aAAkB,KACvB,KAAK,gBAAkB,KAEvB,KAAK,UAAY,KAEjB,KAAK,eAAkB,EACvB,KAAK,iBAAkB,EACvB,KAAK,cAAkB,EAEvB,KAAK,YAAc,EAEnB,EAAQ,KAAK,MAAO,MAEpB,EAAM,aAAa,KAAK,yBAG1B,qBAAa,EAAS,EAAO,GAC3B,GAAM,GAAe,KAAK,cAAc,EAAS,GAAO,EAExD,GAAQ,KAAK,QACX,QAAA,EACA,MAAA,EACA,YAAA,EACA,aAAA,EACA,YAAa,oBAoCjB,eAAO,EAAQ,EAAQ,GACjB,KAAK,gBACD,KAAK,eACN,KAAK,WAAW,QAA0B,YAAhB,EAAO,KAAoB,EAAI,MAMf,IAA7C,EAAM,QAAQ,EAAM,aAAc,OACpC,EAAM,aAAa,KAAK,MAG1B,EAAM,WAAW,KAAK,SAAU,GAChC,KAAK,OAAiB,EACtB,KAAK,QAAiB,EAEtB,EAAQ,KAAK,gBACX,YAAa,KACb,MAAO,KAAK,0BAIhB,qBAAa,EAAS,EAAO,GACtB,KAAK,aACR,KAAK,cAAc,GACnB,EAAM,UAAU,KAAK,UAAW,KAAK,UAGvC,IAAM,GAAiB,KAAK,UAAU,KAAK,IAAM,KAAK,WAAW,KAAK,GAC5C,KAAK,UAAU,KAAK,IAAM,KAAK,WAAW,KAAK,GAC/C,KAAK,UAAU,OAAO,IAAM,KAAK,WAAW,OAAO,GACnD,KAAK,UAAU,OAAO,IAAM,KAAK,WAAW,OAAO,EAEzE,MAAA,GACA,MAAA,EAGA,MAAK,gBAAkB,KAAK,kBAC9B,EAAK,KAAK,UAAU,OAAO,EAAI,KAAK,YAAY,OAAO,EACvD,EAAK,KAAK,UAAU,OAAO,EAAI,KAAK,YAAY,OAAO,EAEvD,KAAK,gBAAkB,EAAM,MAAM,EAAI,GAAM,EAAY,qBAG3D,IAAM,IACJ,QAAA,EACA,aAAc,KAAK,gBAAgB,GACnC,MAAA,EACA,YAAA,EACA,GAAA,EACA,GAAA,EACA,UAAW,EACX,YAAa,KACb,sBAAuB,KAAK,cAGzB,IAEH,EAAM,eAAe,KAAK,aAAc,KAAK,WAAY,KAAK,WAGhE,EAAQ,KAAK,OAAQ,GAEhB,IAEC,KAAK,eACP,KAAK,OAAO,GAGV,KAAK,iBACP,EAAM,WAAW,KAAK,WAAY,KAAK,yBAyB7C,gBAAQ,GACN,EAAY,EAAM,QAChB,QAAS,KAAK,SAAS,GACvB,MAAO,KAAK,UACZ,YAAa,KAAK,aAClB,YAAa,MACZ,OAEH,EAAQ,KAAK,qBAAsB,GAE9B,KAAK,eACR,EAAQ,KAAK,cAAe,GAG9B,KAAK,eAAgB,eAIvB,mBAAW,EAAS,EAAO,EAAa,GACtC,GAAM,GAAe,KAAK,gBAAgB,EAE1C,GAAQ,KAAK,WAAW,KAAK,EAAM,MAAO,SAAW,MACnD,QAAA,EACA,aAAA,EACA,MAAA,EACA,YAAA,EACA,eAAA,EACA,YAAa,OAGV,KAAK,YACR,KAAK,IAAI,GAGX,KAAK,eAAgB,EACrB,KAAK,cAAc,EAAS,gBAuB9B,aAAK,GACH,EAAQ,GAAS,KAAK,UAElB,KAAK,eACP,EAAQ,KAAK,cACX,MAAA,EACA,YAAa,OAIjB,KAAK,oBAGP,yBACE,MAAO,MAAK,aAAc,KAAK,SAAS,KAAM,kBAGhD,uBACE,MAAO,MAAK,0BAGd,gBACE,EAAQ,KAAK,QAAU,YAAa,OAEhC,KAAK,eACP,EAAQ,KAAK,eAAiB,YAAa,OAC3C,EAAQ,KAAK,QAAU,KAAK,SAAS,MAAQ,YAAa,QAG5D,KAAK,OAAS,KAAK,QAAU,KAE7B,KAAK,cAAe,EACpB,KAAK,SAAS,KAAO,KAAK,UAAY,kBAGxC,yBAAiB,GAEf,MAAyB,UAArB,KAAK,aAAgD,QAArB,KAAK,YAChC,EAGF,EAAM,QAAQ,KAAK,WAAY,EAAM,aAAa,iBAG3D,uBAAe,EAAS,GAA0D,GAAnD,GAAmD,UAAA,OAAA,OAAA,KAAA,UAAA,GAAA,UAAA,GAA5C,GAAS,iBAAiB,KAAK,EAAM,MACnE,EAAK,EAAM,aAAa,GAC1B,EAAQ,KAAK,gBAAgB,EAoBjC,QAlBe,IAAX,IACF,EAAQ,KAAK,WAAW,OACxB,KAAK,WAAW,GAAS,GAGvB,GACF,EAAQ,KAAK,uBACX,QAAA,EACA,MAAA,EACA,KAAA,EACA,UAAW,EACX,aAAc,EACd,YAAa,OAIjB,KAAK,SAAS,GAAS,EAEhB,eAGT,uBAAe,EAAS,GACtB,GAAM,GAAQ,KAAK,gBAAgB,IAEpB,IAAX,IAEJ,EAAQ,KAAK,kBACX,QAAA,EACA,MAAA,EACA,aAAc,EACd,YAAa,OAGf,KAAK,SAAY,OAAO,EAAO,GAC/B,KAAK,WAAY,OAAO,EAAO,GAC/B,KAAK,YAAY,OAAO,EAAO,GAC/B,KAAK,UAAY,OAAO,EAAO,iBAGjC,6BAAqB,EAAQ,GAC3B,KAAK,aAAkB,EACvB,KAAK,gBAAkB,QAIlB,EAAI,EAAG,EAAM,EAAY,OAAQ,EAAI,EAAK,IAAK,CACtD,GAAM,GAAS,EAAY,EAE3B,GAAU,GAAU,EAAiB,GA+DvC,GAAM,MACA,EAAc,EAAQ,WAExB,GAAW,cACb,EAAU,EAAY,MAAU,EAAU,YAC1C,EAAU,EAAY,MAAU,EAAU,YAC1C,EAAU,EAAY,IAAU,EAAU,UAC1C,EAAU,EAAY,QAAU,EAAU,YAG1C,EAAU,UAAc,EAAU,YAClC,EAAU,UAAc,EAAU,YAClC,EAAU,QAAc,EAAU,UAElC,EAAU,WAAc,EAAU,YAClC,EAAU,UAAc,EAAU,YAClC,EAAU,SAAc,EAAU,UAClC,EAAU,YAAc,EAAU,WAGpC,EAAU,KAAO,EAiBjB,EAAQ,GAAG,sBAAuB,SAAA,GAAiF,GAA9E,GAA8E,EAA9E,YAAa,EAAiE,EAAjE,QAAS,EAAwD,EAAxD,UAAW,EAA6C,EAA7C,aAAc,EAA+B,EAA/B,MAAO,EAAwB,EAAxB,YAAa,EAAW,EAAX,IACtG,GAAY,WAAW,GAAgB,EACvC,EAAY,SAAS,GAAgB,EAEjC,IACF,EAAY,eAAgB,GAGzB,EAAY,gBACf,EAAM,UAAU,EAAY,YAAa,EAAY,UAErD,EAAM,WAAW,EAAY,UAAY,EAAY,aACrD,EAAM,WAAW,EAAY,WAAY,EAAY,aAErD,EAAY,UAA4B,EACxC,EAAY,UAAU,GAAkB,EAAY,UAAU,UAC9D,EAAY,YAAY,GAAgB,GAAe,GAAS,EAAM,gBAAgB,GAAO,GAC7F,EAAY,iBAA4B,EAExC,EAAM,cAAc,EAAY,YAAa,MAIjD,EAAM,QAAQ,GAAG,eAAmB,GACpC,EAAM,QAAQ,GAAG,kBAAmB,GAEpC,EAAY,qBAAuB,EACnC,EAAY,iBAAmB,EAC/B,EAAY,OAAS,EACrB,EAAY,QAAU,EACtB,EAAY,UAAY,EAExB,EAAM,mBAAqB,EAE3B,EAAO,QAAU,oLCtejB,SAAS,GAAc,EAAa,EAAO,EAAO,GAChD,GAAM,GAAa,EAAY,SAAS,KAElC,EAAW,GAAI,GAAc,EAAa,EAAO,EAAY,EAAO,EAAY,QAAS,KAAM,EAErG,GAAY,OAAO,KAAK,GACxB,EAAY,UAAY,EA/B1B,GAAM,GAAgB,EAAQ,kBACxB,EAAgB,EAAQ,oBAExB,GACJ,aAAA,EACA,SACA,cAGF,GAAY,QAAQ,GAAG,eAAgB,SAAA,GAAkC,GAAtB,GAAsB,EAAtB,YAAa,EAAS,EAAT,KAC9D,GAAY,cAAe,EAC3B,EAAa,EAAa,EAAO,WAGnC,EAAY,QAAQ,GAAG,cAAe,SAAA,GAA0C,GAA9B,GAA8B,EAA9B,WAIhD,IAHA,EAAa,EADiE,EAAjB,MAC5B,OAD6C,EAAV,SAI/D,EAAY,cAAiB,OAAO,IAG3C,EAAY,QAAQ,GAAG,aAAc,SAAA,GACnC,EADqE,EAAtB,YAAsB,EAAT,MAC3B,SAYnC,EAAO,QAAU,6EClCjB,IAAM,GAAiB,EAAQ,UACzB,EAAiB,EAAQ,YACzB,EAAiB,EAAQ,oBACzB,EAAiB,EAAQ,mBACzB,EAAiB,EAAQ,kBACzB,EAAiB,EAAQ,qBAEzB,GACJ,UACE,SAAc,EACd,aAAc,KAEd,OAAY,KACZ,KAAY,KACZ,SAAY,KACZ,QAAY,KACZ,WAAY,KAEZ,UAAY,KACZ,SAAY,MAGd,QAAS,SAAU,EAAS,EAAO,GACjC,GAAM,GAAc,EAAa,QAAQ,IAEzC,OAAO,GAAY,SACb,KAAM,OAAQ,KAAgC,UAAzB,EAAY,SACV,EAAY,UACZ,EAAY,UACrC,MAGN,UAAW,WACT,MAAO,QAIX,GAAY,QAAQ,GAAG,qBAAsB,SAAA,GAA2B,GAAf,GAAe,EAAf,WACvD,IAAkC,SAA9B,EAAY,SAAS,KAAzB,CAEA,GAAM,GAAO,EAAY,SAAS,IAErB,OAAT,GACF,EAAY,UAAU,KAAK,EAAM,EAAY,YAAY,KAAK,EAC9D,EAAY,UAAU,OAAO,EAAI,EAAY,YAAY,OAAO,EAEhE,EAAY,aAAa,KAAK,MAAU,KAAK,IAAI,EAAY,aAAa,KAAK,IAC/E,EAAY,aAAa,OAAO,MAAQ,KAAK,IAAI,EAAY,aAAa,OAAO,IACjF,EAAY,aAAa,OAAO,GAAK,EACrC,EAAY,aAAa,KAAK,GAAO,GAErB,MAAT,IACP,EAAY,UAAU,KAAK,EAAM,EAAY,YAAY,KAAK,EAC9D,EAAY,UAAU,OAAO,EAAI,EAAY,YAAY,OAAO,EAEhE,EAAY,aAAa,KAAK,MAAU,KAAK,IAAI,EAAY,aAAa,KAAK,IAC/E,EAAY,aAAa,OAAO,MAAQ,KAAK,IAAI,EAAY,aAAa,OAAO,IACjF,EAAY,aAAa,OAAO,GAAK,EACrC,EAAY,aAAa,KAAK,GAAO,MAKzC,EAAc,QAAQ,GAAG,MAAO,SAAA,GAAmC,GAAvB,GAAuB,EAAvB,OAAQ,EAAe,EAAf,WAClD,IAAoB,aAAhB,EAAO,KAAX,CAEA,GAAM,GAAO,EAAY,SAAS,IAErB,OAAT,GACF,EAAO,MAAU,EAAY,YAAY,KAAK,EAC9C,EAAO,QAAU,EAAY,YAAY,OAAO,EAChD,EAAO,GAAK,GAEI,MAAT,IACP,EAAO,MAAU,EAAY,YAAY,KAAK,EAC9C,EAAO,QAAU,EAAY,YAAY,OAAO,EAChD,EAAO,GAAK,MAwChB,EAAa,UAAU,UAAY,SAAU,GAC3C,MAAI,GAAM,GAAG,OAAO,IAClB,KAAK,QAAQ,KAAK,SAA8B,IAApB,EAAQ,QACpC,KAAK,aAAa,OAAQ,GAC1B,KAAK,YAAY,OAAQ,GAErB,mBAAmB,KAAK,EAAQ,YAClC,KAAK,QAAQ,KAAK,SAAW,EAAQ,UAEnC,aAAa,KAAK,EAAQ,aAC5B,KAAK,QAAQ,KAAK,UAAY,EAAQ,WAGjC,MAGL,EAAM,GAAG,KAAK,IAChB,KAAK,QAAQ,KAAK,QAAU,EAEvB,IACH,KAAK,YAAc,KAAK,YAAc,KAAK,UAAY,MAGlD,MAGF,KAAK,QAAQ,MAGtB,EAAQ,KAAO,EACf,EAAQ,MAAM,KAAK,QACnB,EAAM,MAAM,EAAa,YACvB,YACA,WACA,mBACA,oBACA,YAEF,EAAQ,WAAW,KAAO,YAE1B,EAAe,KAAO,EAAK,SAE3B,EAAO,QAAU,iJCrFjB,SAAS,GAAc,EAAa,GAClC,GAAM,MACA,IAEN,GAAU,GAAW,EAAY,OAGjC,KAAA,GAAA,GAAsB,EAAM,cAA5B,EAAA,MAAA,QAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,OAAA,cAA2C,CAAA,GAAA,EAAA,IAAA,EAAA,CAAA,GAAA,GAAA,EAAA,OAAA,KAAA,GAAA,EAAA,SAAA,CAAA,GAAA,EAAA,EAAA,OAAA,EAAA,KAAA,KAAA,GAAA,EAAA,MAAA,GAAhC,GAAgC,CACzC,IAAK,EAAQ,QAAQ,KAAK,QAA1B,CAEA,GAAM,GAAS,EAAQ,QAAQ,KAAK,MAGpC,MAAK,EAAM,GAAG,QAAQ,IAAW,IAAW,GACpC,EAAM,GAAG,OAAO,KAChB,EAAM,gBAAgB,EAAS,IAUvC,IAAK,GAJC,GAAe,EAAM,GAAG,OAAO,EAAQ,QACzC,EAAQ,SAAS,iBAAiB,EAAQ,SACzC,EAAQ,QAEJ,EAAI,EAAG,EAAI,EAAa,OAAQ,IAAK,CAC5C,GAAM,GAAiB,EAAa,EAEhC,KAAmB,IACrB,EAAM,KAAK,GACX,EAAS,KAAK,MAKpB,OACE,SAAA,EACA,UAAW,GAIf,QAAS,GAAiB,EAAa,GAIrC,IAAK,GAHD,OAAA,GAGK,EAAI,EAAG,EAAI,EAAY,YAAY,UAAU,OAAQ,IAAK,CACjE,GAAM,GAAU,EAAY,YAAY,UAAU,GAC5C,EAAiB,EAAY,YAAY,SAAU,EAGrD,KAAmB,IAErB,EAAM,OAAS,EACf,EAAQ,KAAK,IAEf,EAAc,GAOlB,QAAS,GAAgB,EAAa,GAEpC,GAAM,GAAgB,EAAa,EAAa,GAAa,EAE7D,GAAY,YAAY,UAAY,EAAc,UAClD,EAAY,YAAY,SAAY,EAAc,SAClD,EAAY,YAAY,QAExB,KAAK,GAAI,GAAI,EAAG,EAAI,EAAY,YAAY,UAAU,OAAQ,IAC5D,EAAY,YAAY,MAAM,GAC5B,EAAY,YAAY,UAAU,GAAG,QAAQ,EAAY,YAAY,SAAS,IAIpF,QAAS,GAAS,EAAW,EAAO,GAClC,GAAM,GAAc,EAAU,YACxB,IAEF,IACF,EAAe,EAAa,EAI9B,KAAK,GAAI,GAAI,EAAG,EAAI,EAAY,YAAY,UAAU,OAAQ,IAAK,CACjE,GAAM,GAAiB,EAAY,YAAY,UAAU,GACnD,EAAiB,EAAY,YAAY,SAAU,GACnD,EAAiB,EAAY,YAAY,MAAU,EAEzD,GAAW,KAAK,EAAQ,UAAU,EAAW,EAAO,EAAY,OAAQ,EAAa,EAAgB,GACjG,EACA,MAIN,GAAM,GAAY,EAAM,sBAAsB,EAE9C,QACE,SAAU,EAAY,YAAY,UAAU,IAAc,KAC1D,QAAU,EAAY,YAAY,SAAU,IAAc,MAI9D,QAAS,GAAe,EAAa,EAAc,GACjD,GAAM,IACJ,MAAY,KACZ,MAAY,KACZ,SAAY,KACZ,WAAY,KACZ,KAAY,KACZ,KAAY,MAGR,GACJ,UAAA,EACA,YAAA,EACA,OAAe,EAAY,YAC3B,SAAe,EAAY,WAC3B,cAAe,EAAU,OACzB,UAAe,EAAU,aACzB,UAAe,EAAU,UAwD3B,OArDI,GAAY,cAAgB,EAAY,kBAEtC,EAAY,iBACd,EAAW,MAAQ,EAAM,QAAS,KAAM,aAAe,GAEvD,EAAU,UAAe,EAAW,MAAM,OAAW,EAAY,gBACjE,EAAU,aAAe,EAAW,MAAM,SAAW,EAAY,gBAG/D,EAAY,aACd,EAAW,OACT,UAAA,EACA,YAAA,EACA,OAAe,EAAY,YAC3B,SAAe,EAAY,WAC3B,cAAe,EAAU,OACzB,UAAe,EAAU,aACzB,UAAe,EAAU,UACzB,KAAe,aAGjB,EAAU,UAAY,EAAY,YAClC,EAAU,SAAW,EAAY,aAId,YAAnB,EAAU,MAAsB,EAAY,aAC9C,EAAW,KAAO,EAAM,QAAS,KAAM,QAAU,GAEjD,EAAU,SAAW,EAAY,WACjC,EAAU,cAAgB,EAAY,aAEjB,cAAnB,EAAU,OACZ,EAAW,SAAW,EAAM,QAAS,KAAM,gBAAkB,GAE7D,EAAW,SAAS,OAAW,KAC/B,EAAW,SAAS,SAAW,MAEV,YAAnB,EAAU,OACZ,EAAW,WAAa,EAAM,QAAS,KAAM,kBAAoB,GAEjE,EAAW,WAAW,OAAW,KACjC,EAAW,WAAW,SAAW,MAEZ,aAAnB,EAAU,MAAuB,EAAY,aAC/C,EAAW,KAAO,EAAM,QACtB,SAAe,EACf,KAAe,YACd,GAEH,EAAU,SAAW,EAAY,YAG5B,EAGT,QAAS,GAAgB,EAAa,GAChC,EAAW,OAAS,EAAY,eAAe,KAAK,EAAW,OAC/D,EAAW,MAAa,EAAY,WAAW,KAAK,EAAW,MAC/D,EAAW,OAAa,EAAY,WAAW,KAAK,EAAW,OAC/D,EAAW,MAAa,EAAY,WAAW,KAAK,EAAW,MAC/D,EAAW,YACb,EAAgB,EAAa,EAAW,YAG1C,EAAY,eAAkB,EAAY,WAC1C,EAAY,gBAAkB,EAAY,YAvQ5C,GAAM,GAAiB,EAAQ,UACzB,EAAiB,EAAQ,YACzB,EAAiB,EAAQ,YACzB,EAAiB,EAAQ,eACzB,EAAiB,EAAQ,oBACzB,EAAiB,EAAQ,mBACzB,EAAiB,EAAQ,kBACzB,EAAiB,EAAQ,qBAEzB,GACJ,UACE,SAAS,EACT,OAAS,KACT,QAAS,YAIT,GAAc,CAElB,GAAY,QAAQ,GAAG,eAAgB,SAAA,GAAkC,GAAtB,GAAsB,EAAtB,YAAa,EAAS,EAAT,KAC9D,IAAkC,SAA9B,EAAY,SAAS,KAAzB,CAGA,EAAY,YAAY,aACxB,EAAY,YAAY,YACxB,EAAY,YAAY,SAExB,EAAY,WAAa,KAEpB,EAAY,aACf,EAAe,EAAa,EAAY,QAG1C,IAAM,GAAY,EAAY,UACxB,EAAa,EAAc,EAAa,EAAO,EAEjD,GAAW,UACb,EAAgB,EAAa,EAAW,aAI5C,EAAc,QAAQ,GAAG,MAAO,SAAA,GAA0C,GAA9B,GAA8B,EAA9B,YAAa,EAAiB,EAAjB,OAAQ,EAAS,EAAT,KAC/D,IAAoB,aAAhB,EAAO,MAAuC,YAAhB,EAAO,KAAzC,CAEA,GAAM,GAAmB,EAAY,QAC/B,EAAY,EACZ,EAAa,EAAQ,EAAW,EAAO,EAE7C,GAAY,WAAc,EAAW,SACrC,EAAY,YAAc,EAAW,QAErC,EAAY,WAAa,EAAc,EAAa,EAAO,MAG7D,EAAY,QAAQ,GAAG,cAAe,SAAA,GAA2B,GAAf,GAAe,EAAf,WACd,UAA9B,EAAY,SAAS,MAEzB,EAAe,EAAa,EAAY,cAG1C,EAAY,QAAQ,GAAG,aAAc,SAAA,GAA2B,GAAf,GAAe,EAAf,WACb,UAA9B,EAAY,SAAS,MACvB,EAAe,EAAa,EAAY,cAI5C,EAAY,QAAQ,GAAG,YAAa,SAAA,GAA2B,GAAf,GAAe,EAAf,WAC9C,GAAY,YAAY,UACtB,EAAY,YAAY,SACxB,EAAY,YAAY,MACxB,EAAY,WAAa,OAwP7B,EAAa,UAAU,SAAW,SAAU,GAC1C,MAAI,GAAM,GAAG,OAAO,IAClB,KAAK,QAAQ,KAAK,SAA8B,IAApB,EAAQ,QAEhC,EAAM,GAAG,SAAS,EAAQ,UAAqB,KAAK,OAAO,OAAmB,EAAQ,QACtF,EAAM,GAAG,SAAS,EAAQ,kBAAqB,KAAK,OAAO,eAAmB,EAAQ,gBACtF,EAAM,GAAG,SAAS,EAAQ,oBAAqB,KAAK,OAAO,iBAAmB,EAAQ,kBACtF,EAAM,GAAG,SAAS,EAAQ,eAAqB,KAAK,OAAO,YAAmB,EAAQ,aACtF,EAAM,GAAG,SAAS,EAAQ,eAAqB,KAAK,OAAO,YAAmB,EAAQ,aACtF,EAAM,GAAG,SAAS,EAAQ,cAAqB,KAAK,OAAO,WAAmB,EAAQ,YAEtF,qBAAqB,KAAK,EAAQ,SACpC,KAAK,QAAQ,KAAK,QAAU,EAAQ,QAE7B,EAAM,GAAG,OAAO,EAAQ,WAC/B,KAAK,QAAQ,KAAK,QAAU,KAAK,IAAI,KAAK,IAAI,EAAG,EAAQ,SAAU,IAEjE,UAAY,KACd,KAAK,QAAQ,KAAK,OAAS,EAAQ,QAEjC,WAAa,KACf,KAAK,QAAQ,KAAK,QAAU,EAAQ,SAI/B,MAGL,EAAM,GAAG,KAAK,IAChB,KAAK,QAAQ,KAAK,QAAU,EAEvB,IACH,KAAK,YAAc,KAAK,YAAc,KAAK,OACvC,KAAK,eAAiB,KAAK,iBAAmB,MAG7C,MAGF,KAAK,QAAQ,MAGtB,EAAa,UAAU,UAAY,SAAU,EAAW,EAAO,EAAW,EAAkB,EAAa,GACvG,GAAI,IAAU,CAId,MAAM,EAAO,GAAQ,KAAK,QAAQ,IAChC,QAAQ,KAAK,QAAQ,KAAK,SACtB,KAAK,QAAQ,KAAK,QAAQ,EAAW,EAAO,EAAS,KAAM,EAAa,EAAW,EAIzF,IAAM,GAAc,KAAK,QAAQ,KAAK,OAEtC,IAAoB,YAAhB,EAA2B,CAC7B,GAAM,GAAS,EAAM,YAAY,EAAW,EAAkB,QACxD,EAAO,EAAM,UAAU,EAE7B,GAAK,GAAK,EAAO,EACjB,EAAK,GAAK,EAAO,CAEjB,IAAM,GAAc,EAAK,EAAI,EAAK,MAAU,EAAK,EAAI,EAAK,MACpD,EAAc,EAAK,EAAI,EAAK,KAAU,EAAK,EAAI,EAAK,MAE1D,GAAU,GAAc,EAG1B,GAAM,GAAW,EAAU,QAAQ,EAEnC,IAAI,GAA4B,WAAhB,EAA0B,CACxC,GAAM,GAAK,EAAS,KAAO,EAAS,MAAS,EACvC,EAAK,EAAS,IAAO,EAAS,OAAS,CAE7C,GAAU,GAAM,EAAK,MAAQ,GAAM,EAAK,OAAS,GAAM,EAAK,KAAO,GAAM,EAAK,OAGhF,GAAI,GAAY,EAAM,GAAG,OAAO,GAAc,CAM5C,EALsB,KAAK,IAAI,EAAG,KAAK,IAAI,EAAK,MAAQ,EAAS,OAAU,KAAK,IAAI,EAAK,KAAM,EAAS,OAChF,KAAK,IAAI,EAAG,KAAK,IAAI,EAAK,OAAQ,EAAS,QAAU,KAAK,IAAI,EAAK,IAAM,EAAS,OAEtE,EAAS,MAAQ,EAAS,SAEpC,EAO5B,MAJI,MAAK,QAAQ,KAAK,UACpB,EAAU,KAAK,QAAQ,KAAK,QAAQ,EAAW,EAAO,EAAS,KAAM,EAAa,EAAW,IAGxF,GAGT,EAAa,QAAQ,GAAG,QAAS,SAAA,GAA4B,EAAhB,aAC9B,UAAS,KAGxB,EAAa,gBAAgB,KAAK,eAElC,EAAY,QAAQ,GAAG,MAAO,SAAU,GACtC,EAAY,WAAkB,KAC9B,EAAY,YAAkB,KAC9B,EAAY,eAAkB,KAC9B,EAAY,gBAAkB,KAC9B,EAAY,WAAkB,KAE9B,EAAY,aACV,aACA,YACA,YAKJ,EAAY,QAAQ,GAAG,OAAQ,SAAA,GAA2B,GAAf,GAAe,EAAf,WACzC,GAAY,WAAa,EAAY,YACnC,EAAY,eAAiB,EAAY,gBAAkB,OAc/D,EAAS,YAAc,SAAU,GAC/B,MAAI,GAAM,GAAG,KAAK,IAKhB,EAAc,EAEP,GAEF,GAGT,EAAM,MAAM,EAAa,YACvB,YACA,YACA,eACA,iBACA,WACA,SAEF,EAAQ,WAAW,KAAO,WAE1B,EAAe,KAAO,EAAK,SAE3B,EAAO,QAAU,gLCzdjB,IAAM,GAAiB,EAAQ,UACzB,EAAiB,EAAQ,YACzB,EAAiB,EAAQ,oBACzB,EAAiB,EAAQ,mBACzB,EAAiB,EAAQ,kBACzB,EAAiB,EAAQ,qBAEzB,GACJ,UACE,SAAU,EACV,OAAU,KACV,SAAU,MAGZ,QAAS,SAAU,EAAS,EAAO,EAAc,EAAS,GACxD,MAAI,GAAY,WAAW,QAAU,GAC1B,KAAM,WAGV,MAGT,UAAW,WACT,MAAO,IAIX,GAAc,QAAQ,GAAG,MAAO,SAAA,GAAmC,GAAvB,GAAuB,EAAvB,OAAQ,EAAe,EAAf,WAC9B,kBAAhB,EAAO,OACX,EAAO,GAAK,EAEZ,EAAY,QAAQ,cAAgB,EAAY,QAAQ,aAAe,EAAO,SAC9E,EAAY,QAAQ,WAAa,EAAY,QAAQ,UAAY,EAAO,MACxE,EAAY,QAAQ,MAAQ,KAG9B,EAAc,QAAQ,GAAG,MAAO,SAAA,GAAmC,GAAvB,GAAuB,EAAvB,OAAQ,EAAe,EAAf,WAC9B,iBAAhB,EAAO,OAEX,EAAO,GAAK,EAAO,MAAQ,EAAY,QAAQ,MAE/C,EAAY,OAAO,KAAK,GAExB,EAAY,QAAQ,UAAY,EAAO,MACvC,EAAY,QAAQ,aAAe,EAAO,SAEtC,EAAO,QAAU,EAAA,GACG,OAAjB,EAAO,WACU,KAAjB,EAAO,OACN,MAAM,EAAO,SAEnB,EAAY,QAAQ,MAAQ,EAAO,UA2BvC,EAAa,UAAU,WAAa,SAAU,GAC5C,MAAI,GAAM,GAAG,OAAO,IAClB,KAAK,QAAQ,QAAQ,SAA8B,IAApB,EAAQ,QACvC,KAAK,aAAa,UAAW,GAC7B,KAAK,YAAY,UAAW,GAErB,MAGL,EAAM,GAAG,KAAK,IAChB,KAAK,QAAQ,QAAQ,QAAU,EAE1B,IACH,KAAK,eAAiB,KAAK,eAAiB,KAAK,aAAe,MAG3D,MAGF,KAAK,QAAQ,SAGtB,EAAc,QAAQ,GAAG,YAAa,SAAA,GAAiF,GAArE,GAAqE,EAArE,YAAa,EAAwD,EAAxD,OAAQ,EAAgD,EAAhD,OAAQ,EAAwC,EAAxC,MAAO,EAAiC,EAAjC,SAAU,EAAuB,EAAvB,OAAQ,EAAe,EAAf,WACtG,IAAe,YAAX,EAAJ,CAEA,GAAM,GAAW,EAAY,QAE7B,GAAO,SAAW,EAAS,GAAI,EAAS,IAEpC,GACF,EAAO,SAAW,EAAM,cAAc,EAAU,GAChD,EAAO,IAAW,EAAM,UAAU,GAClC,EAAO,MAAW,EAClB,EAAO,GAAW,EAClB,EAAO,MAAW,EAAM,WAAW,MAAU,GAAW,GACxD,EAAO,GAAW,GAEX,GAAU,YAAiB,IAClC,EAAO,SAAW,EAAY,UAAU,SACxC,EAAO,IAAW,EAAY,UAAU,IACxC,EAAO,MAAW,EAAY,UAAU,MACxC,EAAO,GAAW,EAAO,MAAQ,EACjC,EAAO,MAAW,EAAY,UAAU,MACxC,EAAO,GAAW,EAAO,MAAQ,EAAY,QAAQ,aAGrD,EAAO,SAAW,EAAM,cAAc,EAAU,GAChD,EAAO,IAAW,EAAM,UAAU,GAClC,EAAO,MAAW,EAAO,SAAW,EAAY,QAAQ,cACxD,EAAO,MAAW,EAAM,WAAW,EAAU,EAAY,QAAQ,UAAW,GAE5E,EAAO,GAAK,EAAO,MAAQ,EAAY,QAAQ,UAC/C,EAAO,GAAK,EAAO,MAAQ,EAAY,QAAQ,cAInD,EAAY,QAAQ,GAAG,MAAO,SAAU,GACtC,EAAY,SACV,OAAS,EAAG,EAAG,EAAG,GAElB,cAAe,EACf,aAAe,EACf,SAAe,EAEf,MAAO,EAEP,WAAY,EACZ,UAAY,KAIhB,EAAQ,QAAU,EAClB,EAAQ,MAAM,KAAK,WACnB,EAAM,MAAM,EAAa,YACvB,eACA,cACA,eAEF,EAAQ,WAAW,QAAU,aAE7B,EAAe,QAAU,EAAQ,SAEjC,EAAO,QAAU,kJC4LjB,SAAS,GAAiB,EAAM,EAAO,EAAM,EAAS,EAAqB,EAAM,GAE/E,IAAK,EAAS,OAAO,CAGrB,KAAc,IAAV,EAAgB,CAElB,GAAM,GAAS,EAAM,GAAG,OAAO,EAAK,OAAS,EAAK,MAAS,EAAK,MAAS,EAAK,KACxE,EAAS,EAAM,GAAG,OAAO,EAAK,QAAS,EAAK,OAAS,EAAK,OAAS,EAAK,GAW9E,IATI,EAAQ,IACQ,SAAT,EAAoB,EAAO,QAClB,UAAT,IAAoB,EAAO,SAElC,EAAS,IACO,QAAT,EAAqB,EAAO,SACnB,WAAT,IAAqB,EAAO,QAG1B,SAAT,EAAqB,MAAO,GAAK,GAAM,GAAU,EAAG,EAAK,KAAM,EAAK,OAAU,CAClF,IAAa,QAAT,EAAqB,MAAO,GAAK,GAAM,GAAU,EAAG,EAAK,IAAM,EAAK,QAAU,CAElF,IAAa,UAAT,EAAqB,MAAO,GAAK,GAAM,GAAU,EAAG,EAAK,MAAQ,EAAK,MAAQ,CAClF,IAAa,WAAT,EAAqB,MAAO,GAAK,GAAM,GAAU,EAAG,EAAK,OAAQ,EAAK,KAAQ,EAIpF,QAAK,EAAM,GAAG,QAAQ,KAEf,EAAM,GAAG,QAAQ,GAEpB,IAAU,EAEV,EAAM,YAAY,EAAS,EAAO,IA7XxC,GAAM,GAAiB,EAAQ,UACzB,EAAiB,EAAQ,YACzB,EAAiB,EAAQ,oBACzB,EAAiB,EAAQ,oBACzB,EAAiB,EAAQ,mBACzB,EAAiB,EAAQ,kBACzB,EAAiB,EAAQ,qBAGzB,EAAgB,EAAQ,eAAiB,EAAQ,qBAAsB,GAAI,GAE3E,GACJ,UACE,SAAc,EACd,aAAc,KAEd,OAAY,KACZ,KAAY,KACZ,SAAY,KACZ,QAAY,KACZ,WAAY,KAEZ,QAAQ,EACR,qBAAqB,EACrB,KAAM,KAGN,OAAQ,IAMR,MAAO,KAMP,OAAQ,QAGV,QAAS,SAAU,EAAS,EAAO,EAAc,EAAS,EAAa,GACrE,IAAK,EAAQ,MAAO,KAEpB,IAAM,GAAO,EAAM,UAAW,EAAY,UAAU,MAC9C,EAAU,EAAa,OAE7B,IAAI,EAAQ,OAAO,QAAS,CAC1B,GAAM,GAAgB,EAAQ,OACxB,GAAgB,MAAM,EAAO,OAAO,EAAO,KAAK,EAAO,QAAQ,EAGrE,IAAI,EAAM,GAAG,OAAO,EAAc,OAAQ,CACxC,IAAK,GAAM,KAAQ,GACjB,EAAY,GAAQ,EAAgB,EACA,EAAc,MAAM,GACpB,EACA,EAAY,aACZ,EACA,EACA,EAAc,QAAU,EAM9D,IAHA,EAAY,KAAO,EAAY,OAAS,EAAY,MACpD,EAAY,IAAO,EAAY,MAAS,EAAY,OAEhD,EAAY,MAAQ,EAAY,OAAS,EAAY,KAAO,EAAY,OAC1E,OACE,KAAM,SACN,MAAO,OAIR,CACH,GAAM,GAAiC,MAAxB,EAAQ,OAAO,MAAgB,EAAK,EAAK,EAAK,MAAS,EAChE,EAAiC,MAAxB,EAAQ,OAAO,MAAgB,EAAK,EAAK,EAAK,OAAS,CAEtE,IAAI,GAAS,EACX,OACE,KAAM,SACN,MAAO,EAAO,IAAM,KAAO,EAAQ,IAAM,MAMjD,MAAO,OAGT,QAAU,EAAQ,cAChB,EAAI,WACJ,EAAI,WACJ,GAAI,YAEJ,IAAa,WACb,KAAa,WACb,OAAa,WACb,MAAa,WACb,QAAa,YACb,YAAa,YACb,SAAa,YACb,WAAa,cAEb,EAAI,YACJ,EAAI,YACJ,GAAI,cAEJ,IAAa,YACb,KAAa,YACb,OAAa,YACb,MAAa,YACb,QAAa,cACb,YAAa,cACb,SAAa,cACb,WAAa,eAGf,UAAW,SAAU,GACnB,GAAI,EAAO,KACT,MAAO,GAAO,QAAQ,EAAO,KAAO,EAAO,KAExC,IAAI,EAAO,MAAO,CAIrB,IAAK,GAHD,GAAY,GACV,GAAa,MAAO,SAAU,OAAQ,SAEnC,EAAI,EAAG,EAAI,EAAG,IACjB,EAAO,MAAM,EAAU,MACzB,GAAa,EAAU,GAI3B,OAAO,GAAO,QAAQ,KAM5B,GAAc,QAAQ,GAAG,MAAO,SAAA,GAAmC,GAAvB,GAAuB,EAAvB,OAAQ,EAAe,EAAf,WAClD,IAAoB,gBAAhB,EAAO,MAA2B,EAAY,SAAS,MAA3D,CAIA,GAAM,GAAY,EAAY,OAAO,QAAQ,EAAY,SACnD,EAAgB,EAAY,OAAO,QAAQ,MAQjD,IAAI,EAAc,QAAU,EAAc,oBAAqB,CAC7D,GAAM,GAAc,EAAM,UAAW,EAAY,SAAS,MAE1D,GAAY,IAAS,EAAY,KAAW,EAAY,OAAW,EAAY,OAC/E,EAAY,KAAS,EAAY,MAAW,EAAY,MAAW,EAAY,MAC/E,EAAY,OAAS,EAAY,QAAW,EAAY,QAAW,EAAY,IAC/E,EAAY,MAAS,EAAY,OAAW,EAAY,SAAW,EAAY,KAE/E,EAAY,SAAS,aAAe,MAGpC,GAAY,SAAS,aAAe,IAIlC,GAAc,sBAChB,EAAY,uBAAyB,EAAU,MAAQ,EAAU,QAGnE,EAAY,aACV,MAAY,EACZ,QAAY,EAAM,UAAW,GAC7B,SAAY,EAAM,UAAW,GAC7B,SAAY,EAAM,UAAW,GAC7B,OACE,KAAM,EAAG,MAAQ,EAAG,MAAQ,EAC5B,IAAM,EAAG,OAAQ,EAAG,OAAQ,IAIhC,EAAO,KAAO,EAAY,YAAY,SACtC,EAAO,UAAY,EAAY,YAAY,SAI7C,EAAc,QAAQ,GAAG,MAAO,SAAA,GAA0C,GAA9B,GAA8B,EAA9B,OAAQ,EAAsB,EAAtB,MAAO,EAAe,EAAf,WACzD,IAAc,SAAV,GAAqB,EAAY,SAAS,MAA9C,CAEA,GAAM,GAAgB,EAAY,OAAO,QAAQ,OAC3C,EAAS,EAAc,OACvB,EAAwB,eAAX,GAAsC,WAAX,EAE1C,EAAQ,EAAY,SAAS,MAE3B,EAAa,EAAY,YAAY,MACrC,EAAa,EAAY,YAAY,QACrC,EAAa,EAAY,YAAY,SACrC,EAAa,EAAY,YAAY,MACrC,EAAa,EAAM,OAAO,EAAY,YAAY,SAAU,GAC5D,EAAgB,EAElB,EAAK,EAAO,GACZ,EAAK,EAAO,EAEhB,IAAI,EAAc,qBAAuB,EAAc,OAAQ,CAE7D,GAAM,GAAmB,EAAc,oBACnC,EAAY,uBACZ,CAEJ,GAAQ,EAAY,SAAS,aAExB,EAAc,MAAQ,EAAc,QACjC,EAAc,OAAS,EAAc,IAC3C,GAAM,EAAK,EAEJ,EAAc,MAAQ,EAAc,MAAU,EAAK,EAAK,GACxD,EAAc,KAAQ,EAAc,UAAU,EAAK,EAAK,GASnE,GALI,EAAM,MAAU,EAAQ,KAAU,GAClC,EAAM,SAAU,EAAQ,QAAU,GAClC,EAAM,OAAU,EAAQ,MAAU,GAClC,EAAM,QAAU,EAAQ,OAAU,GAElC,GAIF,GAFA,EAAM,OAAO,EAAU,GAER,eAAX,EAAyB,CAE3B,GAAI,OAAA,EAEA,GAAS,IAAM,EAAS,SAC1B,EAAO,EAAS,IAEhB,EAAS,IAAM,EAAS,OACxB,EAAS,OAAS,GAEhB,EAAS,KAAO,EAAS,QAC3B,EAAO,EAAS,KAEhB,EAAS,KAAO,EAAS,MACzB,EAAS,MAAQ,QAMrB,GAAS,IAAS,KAAK,IAAI,EAAQ,IAAK,EAAM,QAC9C,EAAS,OAAS,KAAK,IAAI,EAAQ,OAAQ,EAAM,KACjD,EAAS,KAAS,KAAK,IAAI,EAAQ,KAAM,EAAM,OAC/C,EAAS,MAAS,KAAK,IAAI,EAAQ,MAAO,EAAM,KAGlD,GAAS,MAAS,EAAS,MAAS,EAAS,KAC7C,EAAS,OAAS,EAAS,OAAS,EAAS,GAE7C,KAAK,GAAM,KAAQ,GACjB,EAAM,GAAQ,EAAS,GAAQ,EAAS,EAG1C,GAAO,MAAQ,EAAY,SAAS,MACpC,EAAO,KAAO,EACd,EAAO,UAAY,KA+CrB,EAAa,UAAU,UAAY,SAAU,GAC3C,MAAI,GAAM,GAAG,OAAO,IAClB,KAAK,QAAQ,OAAO,SAA8B,IAApB,EAAQ,QACtC,KAAK,aAAa,SAAU,GAC5B,KAAK,YAAY,SAAU,GAEvB,eAAe,KAAK,EAAQ,MAC9B,KAAK,QAAQ,OAAO,KAAO,EAAQ,KAEX,OAAjB,EAAQ,OACf,KAAK,QAAQ,OAAO,KAAO,EAAe,OAAO,MAG/C,EAAM,GAAG,KAAK,EAAQ,qBACxB,KAAK,QAAQ,OAAO,oBAAsB,EAAQ,oBAE3C,EAAM,GAAG,KAAK,EAAQ,UAC7B,KAAK,QAAQ,OAAO,OAAS,EAAQ,QAGhC,MAEL,EAAM,GAAG,KAAK,IAChB,KAAK,QAAQ,OAAO,QAAU,EAEzB,IACH,KAAK,cAAgB,KAAK,cAAgB,KAAK,YAAc;AXnVnE,iEWsVW,MAEF,KAAK,QAAQ,QAuCtB,EAAY,QAAQ,GAAG,MAAO,SAAU,GACtC,EAAY,WAAa,OAG3B,EAAc,QAAQ,GAAG,YAAa,SAAA,GAA2C,GAA/B,GAA+B,EAA/B,YAAa,EAAkB,EAAlB,MAC9C,YADgE,EAAV,QACzC,EAAY,aAExB,EAAY,OAAO,QAEvB,OAAO,QACc,MAA3B,EAAY,WACd,EAAO,GAAK,EAAO,GAGnB,EAAO,GAAK,EAAO,GAErB,EAAO,KAAO,OAGd,EAAO,KAAO,EAAY,WAEK,MAA3B,EAAY,WACd,EAAO,GAAK,EAEsB,MAA3B,EAAY,aACnB,EAAO,GAAK,OAKlB,EAAQ,OAAS,EACjB,EAAQ,MAAM,KAAK,UACnB,EAAM,MAAM,EAAa,YACvB,cACA,aACA,qBACA,sBACA,cAEF,EAAQ,WAAW,OAAS,YAE5B,EAAe,OAAS,EAAO,SAE/B,EAAO,QAAU,wKC3ajB,IAAM,GAAiB,EAAQ,eACzB,EAAiB,EAAQ,kBAAkB,UAC3C,EAAiB,EAAQ,cACzB,EAAiB,EAAQ,oBACzB,EAAiB,EAAQ,iBACzB,EAAiB,EAAQ,oBAEzB,GACJ,UACE,SAAW,EACX,UAAW,KACX,OAAW,GACX,MAAW,KAGb,YAAa,KACb,EAAG,KACH,EAAG,EAAG,EAAG,EAET,aAAa,EACb,SAAU,EAEV,MAAO,SAAU,GACf,EAAW,aAAc,EACzB,EAAI,OAAO,EAAW,GAEtB,EAAW,YAAc,EACzB,EAAW,UAAW,GAAI,OAAO,UACjC,EAAW,EAAI,EAAI,QAAQ,EAAW,SAGxC,KAAM,WACJ,EAAW,aAAc,EACzB,EAAI,OAAO,EAAW,IAIxB,OAAQ,WACN,GAAM,GAAU,EAAW,YAAY,OAAO,QAAQ,EAAW,YAAY,SAAS,MAAM,WACtF,EAAY,EAAQ,WAAa,EAAU,EAAW,YAAY,SAClE,GAAM,GAAI,OAAO,UAEjB,GAAM,EAAM,EAAW,UAAY,IAEnC,EAAI,EAAQ,MAAQ,CAEtB,IAAK,IACH,EAAG,OAAO,GACZ,EAAU,SAAS,EAAW,EAAI,EAAG,EAAW,EAAI,GAE7C,IACP,EAAU,YAAc,EAAW,EAAI,EACvC,EAAU,WAAc,EAAW,EAAI,GAGzC,EAAW,SAAW,GAGpB,EAAW,cACb,EAAI,OAAO,EAAW,GACtB,EAAW,EAAI,EAAI,QAAQ,EAAW,UAG1C,MAAO,SAAU,EAAc,GAC7B,GAAM,GAAU,EAAa,OAE7B,OAAO,GAAQ,GAAY,YAAc,EAAQ,GAAY,WAAW,SAE1E,kBAAmB,SAAA,GAAoC,GAAxB,GAAwB,EAAxB,YAAa,EAAW,EAAX,OAC1C,IAAM,EAAY,eACT,EAAW,MAAM,EAAY,OAAQ,EAAY,SAAS,MADnE,CAKA,GAAI,EAAY,WAEd,YADA,EAAW,EAAI,EAAW,EAAI,EAIhC,IAAI,OAAA,GACA,MAAA,GACA,MAAA,GACA,MAAA,GAEE,EAAU,EAAY,OAAO,QAAQ,EAAY,SAAS,MAAM,WAChE,EAAY,EAAQ,WAAa,EAAU,EAAY,QAE7D,IAAI,EAAG,OAAO,GACZ,EAAS,EAAQ,QAAU,EAAW,OACtC,EAAS,EAAQ,QAAU,EAAW,OACtC,EAAS,EAAQ,QAAU,EAAU,WAAc,EAAW,OAC9D,EAAS,EAAQ,QAAU,EAAU,YAAc,EAAW,WAE3D,CACH,GAAM,GAAO,EAAS,qBAAqB,EAE3C,GAAS,EAAQ,QAAU,EAAK,KAAS,EAAW,OACpD,EAAS,EAAQ,QAAU,EAAK,IAAS,EAAW,OACpD,EAAS,EAAQ,QAAU,EAAK,MAAS,EAAW,OACpD,EAAS,EAAQ,QAAU,EAAK,OAAS,EAAW,OAGtD,EAAW,EAAK,EAAQ,EAAG,GAAO,EAAG,EACrC,EAAW,EAAK,EAAQ,EAAI,GAAM,EAAG,EAEhC,EAAW,cAEd,EAAW,OAAS,EAAQ,OAC5B,EAAW,MAAS,EAAQ,MAE5B,EAAW,MAAM,MAKvB,GAAY,QAAQ,GAAG,cAAe,WACpC,EAAW,SAGb,EAAY,QAAQ,GAAG,cAAe,EAAW,mBAEjD,EAAe,UAAU,WAAa,EAAW,SAEjD,EAAO,QAAU,yJC3HjB,IAAM,GAAe,EAAQ,mBACvB,EAAe,EAAQ,mBACvB,EAAe,EAAQ,eACvB,EAAe,EAAQ,oBAE7B,GAAa,UAAU,UAAY,SAAU,EAAS,EAAO,EAAa,GACxE,GAAM,GAAS,KAAK,qBAAqB,EAAS,EAAO,EAAa,EAEtE,OAAI,MAAK,QAAQ,cACR,KAAK,QAAQ,cAAc,EAAS,EAAO,EAAQ,KAAM,EAAS,GAGpE,GAkBT,EAAa,UAAU,WAAa,SAAU,GAC5C,MAAO,MAAK,kBAAkB,aAAc,IAkB9C,EAAa,UAAU,UAAY,SAAU,GAC3C,MAAO,MAAK,kBAAkB,YAAa,IAG7C,EAAa,UAAU,WAAa,SAAU,EAAY,EAAqB,GAC7E,SAAK,IAAe,EAAG,QAAQ,MAE3B,EAAG,OAAO,GACL,EAAS,YAAY,EAAS,EAAY,KAE1C,EAAG,QAAQ,IACX,EAAS,aAAa,EAAY,KAM7C,EAAa,UAAU,UAAY,SAAU,EAAW,EAAqB,GAC3E,OAAK,KAEA,EAAG,QAAQ,KAEZ,EAAG,OAAO,GACL,EAAS,YAAY,EAAS,EAAW,KAEzC,EAAG,QAAQ,IACX,EAAS,aAAa,EAAW,KAM5C,EAAa,UAAU,gBAAkB,SAAU,EAAS,EAAqB,GAC/E,OAAS,KAAK,WAAW,EAAQ,WAAY,EAAqB,IAC7D,KAAK,UAAU,EAAQ,UAAW,EAAqB,IA+B9D,EAAa,UAAU,cAAgB,SAAU,GAC/C,MAAI,GAAG,SAAS,IACd,KAAK,QAAQ,cAAgB,EAEtB,MAGO,OAAZ,SACK,MAAK,QAAQ,cAEb,MAGF,KAAK,QAAQ,eAatB,EAAa,UAAU,YAAc,SAAU,GAC7C,MAAI,GAAG,KAAK,IACV,KAAK,QAAQ,YAAc,EAEpB,MAGQ,OAAb,SACK,MAAK,QAAQ,YAEb,MAGF,KAAK,QAAQ,aAGtB,EAAa,UAAU,qBAAuB,SAAU,EAAS,EAAO,EAAa,GAInF,IAAA,GAHM,GAAO,KAAK,QAAQ,GACtB,EAAS,KAEb,EAAyB,EAAQ,MAAjC,EAAA,MAAA,QAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,OAAA,cAAwC,CAAA,GAAA,EAAA,IAAA,EAAA,CAAA,GAAA,GAAA,EAAA,OAAA,KAAA,GAAA,EAAA,SAAA,CAAA,GAAA,EAAA,EAAA,OAAA,EAAA,KAAA,KAAA,GAAA,EAAA,MAAA,GAA7B,GAA6B,CAEtC,MAAI,EAAY,gBACT,EAAY,OACgD,IAA3D,EAAM,QAAU,KAAK,QAAQ,GAAY,iBAIjD,EAAS,EAAQ,GAAY,QAAQ,EAAS,EAAO,KAAM,EAAS,EAAa,IAG/E,MAAO,yHC9Fb,SAAS,GAAgB,EAAQ,EAAc,EAAS,GACtD,MAAI,GAAM,GAAG,OAAO,IACb,EAAa,gBAAgB,EAAa,QAAQ,EAAO,MAAO,EAAS,IACzE,EAAa,QAAQ,EAAO,MAAM,SAClC,EAAuB,EAAc,EAAS,GAC5C,EAGF,KAGT,QAAS,GAAkB,EAAa,EAAS,EAAO,EAAS,EAAe,GAC9E,IAAK,GAAI,GAAI,EAAG,EAAM,EAAQ,OAAQ,EAAI,EAAK,IAAK,CAClD,GAAM,GAAQ,EAAQ,GAChB,EAAe,EAAc,GAC7B,EAAS,EAAe,EAAM,UAAU,EAAS,EAAO,EAAa,GAC7C,EACA,EACA,EAE9B,IAAI,EACF,OACE,OAAA,EACA,OAAQ,EACR,QAAS,GAKf,SAGF,QAAS,GAAe,EAAa,EAAS,EAAO,GAOnD,QAAS,GAAa,EAAc,EAAU,GAC5C,GAAM,GAAY,EAAQ,2BACtB,EAAQ,iBAAiB,OACzB,EAEA,GAAM,gBAAgB,EAAS,EAAU,KAE3C,EAAQ,KAAK,GACb,EAAc,KAAK,IAIvB,IAlBA,GAAI,MACA,KAEA,EAAU,EACV,EAAS,KAcN,EAAM,GAAG,QAAQ,IAAU,CAChC,KACA,IAEA,IAAM,GAAsB,EAAM,cAAc,IAAI,EAEpD,IAAI,IACI,EAAS,EAAe,EAAoB,UAAU,EAAS,EAAO,EAAa,EAAS,GACpE,EACA,EACA,MACxB,EAAoB,QAAQ,EAAO,MAAM,YAC/C,OACE,QAAA,EACA,OAAA,EACA,OAAQ,EAIV,GAAM,cAAc,gBAAgB,EAAa,EAEjD,IAAM,GAAa,EAAiB,EAAa,EAAS,EAAO,EAAS,EAAe,EAEzF,IAAI,EAAW,SACP,EAAW,OAAO,QAAQ,EAAW,OAAO,MAAM,YACxD,MAAO,EAIX,GAAU,EAAM,WAAW,GAG7B,SAGF,QAAS,GAAS,EAAlB,GAA4D,GAA3B,GAA2B,EAA3B,OAAQ,EAAmB,EAAnB,OAAQ,EAAW,EAAX,OAW/C,IAVA,EAAS,MAEL,EAAY,QAAU,EAAY,OAAO,QAAQ,cACnD,EAAY,OAAO,KAAK,gBAAgB,MAAM,OAAS,IAGzD,EAAY,OAAS,EACrB,EAAY,QAAU,EACtB,EAAM,WAAW,EAAY,SAAU,GAEnC,GAAU,EAAO,QAAQ,YAAa,CACxC,GAAM,GAAS,EAAQ,EAAQ,EAAO,MAAM,UAAU,GAAU,EAChE,GAAY,OAAO,KAAK,gBAAgB,MAAM,OAAS,EAGzD,EAAQ,KAAK,YAAc,YAAa,IAqH1C,QAAS,GAAwB,EAAc,EAAS,GACtD,GAAM,GAAU,EAAa,QACvB,EAAa,EAAQ,EAAO,MAAM,IAClC,EAAgB,EAAQ,EAAO,MAAM,cACvC,EAAqB,EACrB,EAAc,EACd,EAAqB,CAGzB,IAAM,GAAc,GAAiB,EAAU,gBAA/C,CAEA,IAAK,GAAI,GAAI,EAAG,EAAM,EAAM,aAAa,OAAQ,EAAI,EAAK,IAAK,CAC7D,GAAM,GAAc,EAAM,aAAa,GACjC,EAAc,EAAY,SAAS,IAEzC,IAAK,EAAY,cAAjB,CAIA,KAFA,GAE0B,EAAU,gBAClC,OAAO,CAGT,IAAI,EAAY,SAAW,EAA3B,CAIA,IAFA,GAAgB,IAAgB,EAAO,KAAM,IAE1B,EACjB,OAAO,CAGT,IAAI,EAAY,UAAY,IAC1B,IAEI,IAAgB,EAAO,MAAQ,GAAsB,GACvD,OAAO,IAKb,MAAO,GAAU,gBAAkB,GAhVrC,GAAM,GAAiB,EAAQ,eACzB,EAAiB,EAAQ,mBACzB,EAAiB,EAAQ,kBACzB,EAAiB,EAAQ,mBACzB,EAAiB,EAAQ,qBACzB,EAAiB,EAAQ,oBACzB,EAAiB,EAAQ,YACzB,EAAiB,EAAQ,YACzB,EAAiB,EAAQ,oBAAoB,KAEnD,GAAQ,wBAER,IAAM,IACJ,QAAA,EACA,uBAAA,EAEA,gBAAiB,EAAA,EACjB,UACE,WACE,aAAa,EACb,IAAK,EAAA,EACL,cAAe,EACf,UAAY,KACZ,WAAY,OAGhB,kBAAmB,SAAU,GAC3B,EAAM,OAAO,EAAO,SAAU,EAAU,SAAS,YAKrD,GAAY,QAAQ,GAAG,OAAQ,SAAA,GAAwD,GAA5C,GAA4C,EAA5C,YAAa,EAA+B,EAA/B,QAAS,EAAsB,EAAtB,MAAO,EAAe,EAAf,WACtE,KAAI,EAAY,cAAhB,CAGA,EAAQ,EADW,EAAc,EAAa,EAAS,EAAO,OAKhE,EAAY,QAAQ,GAAG,OAAQ,SAAA,GAAwD,GAA5C,GAA4C,EAA5C,YAAa,EAA+B,EAA/B,QAAS,EAAsB,EAAtB,MAAO,EAAe,EAAf,WACtE,IAAK,EAAY,QACV,EAAY,gBACZ,EAAY,cAFnB,CAKA,EAAQ,EADW,EAAc,EAAa,EAAS,EAAO,OAIhE,EAAY,QAAQ,GAAG,OAAQ,SAAU,GAAK,GACpC,GAAuB,EAAvB,YAAa,EAAU,EAAV,KAErB,IAAK,EAAY,gBACV,EAAY,eACX,EAAY,iBACZ,EAAY,SAAS,KAH7B,CAOA,EAAQ,KAAK,eAAgB,EAE7B,IAAM,GAAS,EAAY,MAEvB,GAAY,SAAS,MAAQ,IAE3B,EAAO,QAAQ,EAAY,SAAS,MAAM,cACtC,EAAuB,EAAQ,EAAY,QAAS,EAAY,UACtE,EAAY,KAAK,GAGjB,EAAY,MAAM,EAAY,SAAU,EAAQ,EAAY,aAgHlE,EAAY,QAAQ,GAAG,OAAQ,SAAA,GAA2B,GAAf,GAAe,EAAf,YACnC,EAAS,EAAY,MAEvB,IAAU,EAAO,QAAQ,cAC3B,EAAO,KAAK,gBAAgB,MAAM,OAAS,MAI/C,EAAa,UAAU,UAAY,SAAU,EAAS,EAAO,EAAa,GACxE,GAAM,GAAS,KAAK,qBAAqB,EAAS,EAAO,EAAa,EAEtE,OAAI,MAAK,QAAQ,cACR,KAAK,QAAQ,cAAc,EAAS,EAAO,EAAQ,KAAM,EAAS,GAGpE,GA+BT,EAAa,UAAU,cAAgB,SAAU,GAC/C,MAAI,GAAM,GAAG,SAAS,IACpB,KAAK,QAAQ,cAAgB,EAEtB,MAGO,OAAZ,SACK,MAAK,QAAQ,cAEb,MAGF,KAAK,QAAQ,eAatB,EAAa,UAAU,YAAc,SAAU,GAC7C,MAAI,GAAM,GAAG,KAAK,IAChB,KAAK,QAAQ,YAAc,EAEpB,MAGQ,OAAb,SACK,MAAK,QAAQ,YAEb,MAGF,KAAK,QAAQ,aAGtB,EAAa,UAAU,qBAAuB,SAAU,EAAS,EAAO,EAAa,GAUnF,IAAA,GATM,GAAO,KAAK,QAAQ,GACpB,EAAU,EAAM,UACpB,EAAG,EACH,EAAG,EACH,EAAG,EACH,EAAG,IACF,EAAM,QACL,EAAS,KAEb,EAAyB,EAAQ,MAAjC,EAAA,MAAA,QAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,OAAA,cAAwC,CAAA,GAAA,EAAA,IAAA,EAAA,CAAA,GAAA,GAAA,EAAA,OAAA,KAAA,GAAA,EAAA,SAAA,CAAA,GAAA,EAAA,EAAA,OAAA,EAAA,KAAA,KAAA,GAAA,EAAA,MAAA,GAA7B,GAA6B,CAEtC,MAAI,EAAY,gBACT,EAAY,OAC0C,IAArD,EAAU,KAAK,QAAQ,GAAY,iBAI3C,EAAS,EAAQ,GAAY,QAAQ,EAAS,EAAO,KAAM,EAAS,EAAa,IAG/E,MAAO,KA4Db,EAAS,gBAAkB,SAAU,GACnC,MAAI,GAAM,GAAG,OAAO,IAClB,EAAU,gBAAkB,EAErB,MAGF,EAAU,iBAGnB,EAAa,gBAAgB,KAAK,eAClC,EAAa,gBAAgB,KAAK,iBAClC,EAAa,gBAAgB,KAAK,cAClC,EAAa,gBAAgB,KAAK,aAElC,EAAe,KAAK,cAAgB,KACpC,EAAe,KAAK,aAAc,EAElC,EAAM,OAAO,EAAe,UAAW,EAAU,SAAS,WAE1D,EAAO,QAAU,4OCnXjB,IAAM,GAAc,EAAQ,UACtB,EAAc,EAAQ,iBAE5B,GAAY,QAAQ,GAAG,MAAO,SAAU,GACtC,EAAY,WAAa,OAG3B,EAAU,QAAQ,GAAG,WAAY,SAAA,GAA2B,GAAf,GAAe,EAAf,YACrC,EAAa,EAAY,SAAS,IAExC,IAAK,EAAL,CAEA,GAAM,GAAQ,EAAY,OAAO,QAAQ,GAAY,KAEjD,GAAQ,IACV,EAAY,WAAa,WAAW,WAClC,EAAY,MAAM,EAAY,SAAU,EAAY,OAAQ,EAAY,UACvE,OAIP,EAAY,QAAQ,GAAG,OAAQ,SAAA,GAAsC,GAA1B,GAA0B,EAA1B,YAAa,EAAa,EAAb,SAClD,GAAY,kBAAoB,GAClC,aAAa,EAAY,cAK7B,EAAU,QAAQ,GAAG,eAAgB,SAAA,GAA2B,GAAf,GAAe,EAAf,YACzC,EAAa,EAAY,SAAS,IAExC,IAAK,EAAL,CAEc,EAAY,OAAO,QAAQ,GAAY,MAEzC,IACV,EAAY,SAAS,KAAO,4EC6DhC,SAAS,GAAgB,EAAW,GAClC,IAAK,EAAgB,OAAO,CAE5B,IAAM,GAAW,EAAa,QAAQ,KAAK,SAE3C,OAAsB,OAAd,GAAmC,OAAb,GAAqB,IAAa,EAtGlE,GAAM,GAAY,EAAQ,UACpB,EAAY,EAAQ,YACpB,EAAY,EAAQ,oBACpB,EAAY,EAAQ,iBAEc,EAAQ,qBAAxC,IAAA,gBAAiB,IAAA,UAEzB,GAAU,kBAAkB,EAAQ,oBAEpC,EAAU,QAAQ,GAAG,eAAiB,SAAA,GAAgD,GAApC,GAAoC,EAApC,YAAa,EAAuB,EAAvB,YAAa,EAAU,EAAV,GAAI,EAAM,EAAN,EAC9E,IAAkC,SAA9B,EAAY,SAAS,KAAzB,CAGA,GAAM,GAAO,KAAK,IAAI,GAChB,EAAO,KAAK,IAAI,GAChB,EAAU,EAAY,OAAO,QAAQ,KACrC,EAAY,EAAQ,UACpB,EAAe,EAAO,EAAO,IAAM,EAAO,EAAO,IAAM,IAO7D,IALA,EAAY,SAAS,KAA4B,UAArB,EAAQ,SAChC,EAAY,GACZ,EAAQ,SAGQ,OAAhB,GAAsC,OAAd,GAAsB,IAAc,IAE9D,EAAY,SAAS,KAAO,MAIvB,EAAY,SAAS,MAiCxB,IA/BA,GAAI,GAAU,EAER,EAAe,SAAU,EAAc,EAAU,GACrD,GAAM,GAAW,EAAQ,2BACnB,EAAQ,iBAAiB,OACzB,EAEN,IAAI,IAAiB,EAAY,SAE5B,EAAQ,cACL,EAAa,gBAAgB,EAAS,EAAS,IAChD,EAAgB,EAAS,EAAU,GAAW,CAEnD,GAAM,GAAS,EAAa,UAAU,EAAY,YACZ,EAAY,UACZ,EACA,EAEtC,IAAI,GACmB,SAAhB,EAAO,MACP,EAAe,EAAa,IAC5B,EAAU,eAAe,EAAQ,EAAc,EAAS,GAE7D,MAAO,KAKT,EAAS,KAGN,EAAG,QAAQ,IAAU,CAC1B,GAAM,GAAsB,EAAM,cAAc,IAAI,EAQpD,IANI,GACG,IAAwB,EAAY,SACnC,EAAoB,QAAQ,KAAK,cAEvC,EAAS,EAAoB,UAAU,EAAY,YAAa,EAAY,UAAW,EAAa,IAElG,GACmB,SAAhB,EAAO,MACP,EAAe,EAAa,GAAsB,CAEvD,EAAY,SAAS,KAAO,OAC5B,EAAY,OAAS,EACrB,EAAY,QAAU,CACtB,OAGF,GAAM,GAAuB,EAAM,cAAc,gBAAgB,EAAc,EAE/E,IAAI,EAAsB,CACxB,EAAY,SAAS,KAAO,OAC5B,EAAY,OAAS,EACrB,EAAY,QAAU,CACtB,OAGF,EAAU,EAAW,uJC3F7B,GAAQ,UAAU,kBAAkB,EAAQ,8FCA5C,GAAQ,UAAU,kBAAkB,EAAQ,6FCA5C,GAAO,SACL,MACE,OAAgB,KAChB,eAAgB,OAChB,YAAgB,QAGlB,WACE,QAAU,EAAG,EAAG,EAAG,GAInB,aAAc,EAEd,SACE,SAAmB,EACnB,WAAmB,GACnB,SAAmB,IACnB,SAAmB,GACnB,aAAmB,EACnB,kBAAmB,4CCjBzB,GAAQ,oBAGR,EAAQ,aAGR,EAAQ,oBACR,EAAQ,wBAGR,EAAQ,wBACR,EAAQ,8BACR,EAAQ,uCAGR,EAAQ,qBAGR,EAAQ,qBACR,EAAQ,oBACR,EAAQ,kBACR,EAAQ,kBAGR,EAAQ,wBACR,EAAQ,6BACR,EAAQ,4BAGR,EAAQ,uBACR,EAAQ,sBACR,EAAQ,oBAGR,EAAQ,mCAGR,EAAQ,gBAGR,EAAO,QAAU,EAAQ,wjBCyIzB,SAAS,GAAa,EAAa,GACjC,GAAM,GAAiB,EAAY,OAAO,QAAQ,EAAY,SAAS,MAAM,QACvE,EAAS,EAAe,WACxB,GAAc,KAAK,IAAI,EAAe,SAAW,EAAO,IAAM,CAEpE,GAAO,GAAK,EAAY,UAAU,MAClC,EAAO,GAAK,EAAY,UAAU,MAClC,EAAO,GAAK,EAAO,WAAW,UAAY,IAC1C,EAAO,GAAK,EAAO,GAAK,EAExB,EAAO,WAAa,EAAO,IAAM,EAAO,IAAM,GAAc,EAC5D,EAAO,WAAa,EAAO,IAAM,EAAO,IAAM,GAAc,EAC5D,EAAO,GAAK,EAEZ,EAAO,UAAY,EAAS,EAAO,GACnC,EAAO,UAAY,EAAI,EAAe,SAAW,EAAO,GAG1D,QAAS,KACP,EAAoB,MACpB,EAAM,eAAe,KAAK,aAAc,KAAK,WAAY,KAAK,UAE9D,IAAM,GAAS,KAAK,cACd,EAAU,KAAK,OAAO,QAAQ,KAAK,SAAS,MAAM,QAClD,EAAS,EAAQ,WACjB,GAAI,GAAI,OAAO,UAAY,IAAO,EAAO,EAE/C,IAAI,EAAI,EAAO,GAAI,CAEjB,GAAM,GAAY,GAAK,KAAK,KAAK,EAAS,GAAK,EAAO,WAAa,EAAO,SAE1E,IAAI,EAAO,aAAe,EAAO,IAAM,EAAO,aAAe,EAAO,GAClE,EAAO,GAAK,EAAO,GAAK,EACxB,EAAO,GAAK,EAAO,GAAK,MAErB,CACH,GAAM,GAAY,EAAM,uBAAuB,EAAG,EACH,EAAO,GACP,EAAO,GACP,EAAO,WACP,EAAO,WACP,EAE/C,GAAO,GAAK,EAAU,EACtB,EAAO,GAAK,EAAU,EAGxB,KAAK,SAEL,EAAO,EAAI,EAAe,QAAQ,KAAK,uBAGvC,GAAO,GAAK,EAAO,WACnB,EAAO,GAAK,EAAO,WAEnB,KAAK,SACL,KAAK,IAAI,EAAO,YAChB,EAAO,QAAS,EAChB,KAAK,WAAa,IAGpB,GAAM,WAAW,KAAK,WAAY,KAAK,WAGzC,QAAS,KACP,EAAoB,KAEpB,IAAM,GAAS,KAAK,cACd,GAAI,GAAI,OAAO,UAAY,EAAO,GAClC,EAAW,KAAK,OAAO,QAAQ,KAAK,SAAS,MAAM,QAAQ,iBAE7D,GAAI,GACN,EAAO,GAAK,EAAM,YAAY,EAAG,EAAG,EAAO,GAAI,GAC/C,EAAO,GAAK,EAAM,YAAY,EAAG,EAAG,EAAO,GAAI,GAE/C,KAAK,YAAY,EAAO,WAAY,EAAO,YAE3C,EAAO,EAAI,EAAe,QAAQ,KAAK,uBAGvC,EAAO,GAAK,EAAO,GACnB,EAAO,GAAK,EAAO,GAEnB,KAAK,YAAY,EAAO,WAAY,EAAO,YAC3C,KAAK,IAAI,EAAO,YAEhB,EAAO,UACL,EAAO,QAAS,EAClB,KAAK,WAAa,MAItB,QAAS,GAAqB,GAC5B,GAAM,GAAS,EAAY,aAG3B,IAAK,EAAO,OAAZ,CAEA,GAAM,GAAW,EAAO,SAAS,KAC3B,EAAW,EAAO,SAAS,MAEjC,GAAM,UAAU,EAAY,YAC1B,MAAS,EAAO,EAAM,EAAO,GAC7B,MAAS,EAAO,EAAM,EAAO,GAC7B,QAAS,EAAS,EAAI,EAAO,GAC7B,QAAS,EAAS,EAAI,EAAO,OA7RjC,GAAM,GAAiB,EAAQ,mBACzB,EAAiB,EAAQ,iBACzB,EAAiB,EAAQ,eACzB,EAAiB,EAAQ,WACzB,EAAiB,EAAQ,cAE/B,GAAY,QAAQ,GAAG,MAAO,SAAU,GACtC,EAAY,eACV,QAAa,EACb,WAAa,EACb,aAAa,EAEb,WAAY,KACZ,YAEA,GAAI,EAAG,GAAI,EACX,GAAI,EAAG,GAAI,EAEX,GAAI,EACJ,IAAK,EAAG,IAAK,EACb,SAAU,EAEV,UAAW,EACX,UAAW,EACX,EAAK,MAGP,EAAY,kBAAsB,WAAA,MAAM,GAAe,MAAM,IAC7D,EAAY,oBAAsB,WAAA,MAAM,GAAe,MAAM,MAG/D,EAAY,QAAQ,GAAG,OAAQ,SAAA,GAAwD,GAA5C,GAA4C,EAA5C,YAAa,EAA+B,EAA/B,MAAO,EAAwB,EAAxB,QAAS,EAAe,EAAf,YAChE,EAAS,EAAY,aAG3B,IAAI,EAAO,OAIT,IAHA,GAAI,GAAU,EAGP,EAAM,GAAG,QAAQ,IAAU,CAGhC,GAAI,IAAY,EAAY,QAAS,CAEnC,EAAe,OAAO,EAAO,GAC7B,EAAO,QAAS,EAChB,EAAY,WAAa,KAGzB,EAAY,cAAc,GAC1B,EAAM,UAAU,EAAY,UAAW,EAAY,SAGnD,IAAM,IAAc,YAAA,EACpB,GAAY,QAAQ,KAAK,qBAAsB,GAC/C,EAAY,QAAQ,KAAK,gBAAsB,EAG/C,IAAM,GAAc,GAAI,GAAc,EACA,EACA,EAAY,SAAS,KACrB,gBACA,EAAY,QAElD,GAAY,OAAO,KAAK,GACxB,EAAY,UAAY,EACxB,EAAU,cAAc,EAAY,kBAEpC,EAAM,WAAW,EAAY,WAAY,EAAY,UACrD,OAGF,EAAU,EAAM,WAAW,MAKjC,EAAY,QAAQ,GAAG,KAAM,SAAA,GAAkC,GAAtB,GAAsB,EAAtB,YAAa,EAAS,EAAT,MAC9C,EAAS,EAAY,aAE3B,IAAK,EAAY,gBAAiB,EAAO,OAAzC,CAEA,GAAM,GAAS,EAAY,OACrB,EAAU,GAAU,EAAO,QAC3B,EAAiB,GAAW,EAAY,SAAS,MAAQ,EAAQ,EAAY,SAAS,MAAM,QAE5F,GAAM,GAAI,OAAO,UACjB,KACA,EAAO,EAAM,UAAW,EAAY,UAAU,MAC9C,EAAe,EAAY,aAAa,OAAO,MAEjD,GAAY,EACZ,MAAA,GAGE,EAAmB,GAAkB,EAAe,SACN,YAA9B,EAAY,SAAS,MACrB,IAAU,EAAO,WAEjC,EAAW,GACX,EAAM,EAAY,UAAU,UAAa,IAC1C,EAAe,EAAe,UAC9B,EAAe,EAAe,SAE7B,GACJ,YAAA,EACA,WAAY,EACZ,SAAA,EACA,QAAQ,EACR,gBAAgB,EAId,KAAoB,IACtB,EAAU,cAAc,GAExB,EAAiB,EAAU,OAAO,GAE9B,EAAe,YAAc,EAAe,SAC9C,GAAY,KAIV,GAAW,KAEjB,EAAM,WAAW,EAAO,SAAU,EAAY,WAE9C,EAAY,SAAS,GAAK,EAAO,WAC/B,GAAI,GAAc,EAAa,EAAO,EAAY,SAAS,KAAM,eAAgB,EAAY,SAE/F,EAAO,GAAK,EAEZ,EAAO,QAAS,EAChB,EAAO,YAAc,EAAe,YACpC,EAAY,WAAa,EAEzB,EAAO,KAAK,EAAO,YAEf,GACF,EAAO,IAAM,EAAY,aAAa,OAAO,GAC7C,EAAO,IAAM,EAAY,aAAa,OAAO,GAC7C,EAAO,GAAK,EAEZ,EAAY,EAAa,GAEzB,EAAM,OAAO,EAAM,EAAY,UAAU,MAEzC,EAAK,GAAK,EAAO,GACjB,EAAK,GAAK,EAAO,GAEjB,EAAU,cAAc,GAExB,EAAiB,EAAU,OAAO,GAElC,EAAO,YAAc,EAAe,GACpC,EAAO,YAAc,EAAe,GAEpC,EAAO,EAAI,EAAe,QAAQ,EAAY,qBAG9C,EAAO,WAAY,EACnB,EAAO,GAAK,EAAe,GAC3B,EAAO,GAAK,EAAe,GAE3B,EAAO,GAAK,EAAO,GAAK,EAExB,EAAO,EAAI,EAAe,QAAQ,EAAY,0BAIlD,EAAY,QAAQ,GAAG,cAAe,SAAA,GAA2B,GAAf,GAAe,EAAf,YAC1C,EAAS,EAAY,aAEvB,GAAO,SACT,EAAe,OAAO,EAAO,GAC7B,EAAO,QAAS,EAChB,EAAY,WAAa,iIC/I7B,SAAS,GAAU,EAAS,GAC1B,GAAI,GAAe,EAAM,cAAc,IAAI,EAAS,EAOpD,OALK,KACH,EAAe,GAAI,GAAa,EAAS,GACzC,EAAa,OAAO,OAAS,GAGxB,EAzCT,GAAM,GAAe,EAAQ,mBACvB,EAAe,EAAQ,kBACvB,EAAe,EAAQ,WACvB,EAAe,EAAQ,WACvB,EAAe,EAAQ,kBACvB,EAAe,EAAQ,iBAEvB,IA6CN,GAAS,MAAQ,SAAU,EAAS,GAClC,OAAoF,IAA7E,EAAM,cAAc,eAAe,EAAS,GAAW,EAAQ,UAexE,EAAS,GAAK,SAAU,EAAM,EAAU,GAKtC,GAJI,EAAM,GAAG,OAAO,KAA+B,IAAtB,EAAK,OAAO,OACvC,EAAO,EAAK,OAAO,MAAM,OAGvB,EAAM,GAAG,MAAM,GAAO,CACxB,IAAA,GAAA,GAAwB,EAAxB,EAAA,MAAA,QAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,OAAA,cAA8B,CAAA,GAAA,EAAA,IAAA,EAAA,CAAA,GAAA,GAAA,EAAA,OAAA,KAAA,GAAA,EAAA,SAAA,CAAA,GAAA,EAAA,EAAA,OAAA,EAAA,KAAA,KAAA,GAAA,EAAA,MAAA,GAAnB,GAAmB,CAC5B,GAAS,GAAG,EAAW,EAAU,GAGnC,MAAO,GAGT,GAAI,EAAM,GAAG,OAAO,GAAO,CACzB,IAAK,GAAM,KAAQ,GACjB,EAAS,GAAG,EAAM,EAAK,GAAO,EAGhC,OAAO,GAkBT,MAdI,GAAM,SAAS,EAAa,WAAY,GAErC,EAAa,GAIhB,EAAa,GAAM,KAAK,GAHxB,EAAa,IAAS,GAQxB,EAAO,IAAI,EAAM,SAAU,EAAM,GAAY,QAAA,IAGxC,GAcT,EAAS,IAAM,SAAU,EAAM,EAAU,GAKvC,GAJI,EAAM,GAAG,OAAO,KAA+B,IAAtB,EAAK,OAAO,OACvC,EAAO,EAAK,OAAO,MAAM,OAGvB,EAAM,GAAG,MAAM,GAAO,CACxB,IAAA,GAAA,GAAwB,EAAxB,EAAA,MAAA,QAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,OAAA,cAA8B,CAAA,GAAA,EAAA,IAAA,EAAA,CAAA,GAAA,GAAA,EAAA,OAAA,KAAA,GAAA,EAAA,SAAA,CAAA,GAAA,EAAA,EAAA,OAAA,EAAA,KAAA,KAAA,GAAA,EAAA,MAAA,GAAnB,GAAmB,CAC5B,GAAS,IAAI,EAAW,EAAU,GAGpC,MAAO,GAGT,GAAI,EAAM,GAAG,OAAO,GAAO,CACzB,IAAK,GAAM,KAAQ,GACjB,EAAS,IAAI,EAAM,EAAK,GAAO,EAGjC,OAAO,GAGT,GAAK,EAAM,SAAS,EAAa,WAAY,GAGxC,CACH,GAAI,OAAA,EAEA,KAAQ,KACsD,KAA1D,EAAQ,EAAM,QAAQ,EAAa,GAAO,KAChD,EAAa,GAAM,OAAO,EAAO,OAPnC,GAAO,OAAO,EAAM,SAAU,EAAM,EAAU,EAWhD,OAAO,IAUT,EAAS,MAAQ,WACf,MAAO,IAIT,EAAS,kBAAqB,EAAM,eACpC,EAAS,aAAqB,EAAM,UACpC,EAAS,iBAAqB,EAAM,cACpC,EAAS,cAAqB,EAAM,WAEpC,EAAS,eAAuB,EAAM,eACtC,EAAS,qBAAuB,EAAM,qBACtC,EAAS,gBAAuB,EAAM,gBACtC,EAAS,QAAuB,EAAM,QAQtC,EAAS,cAAgB,WACvB,MAAO,GAAQ,eASjB,EAAS,qBAAuB,WAC9B,MAAO,GAAQ,sBAYjB,EAAS,KAAO,SAAU,GACxB,IAAK,GAAI,GAAI,EAAM,aAAa,OAAS,EAAG,GAAK,EAAG,IAClD,EAAM,aAAa,GAAG,KAAK,EAG7B,OAAO,IAYT,EAAS,qBAAuB,SAAU,GACxC,MAAI,GAAM,GAAG,OAAO,IAClB,EAAY,qBAAuB,EAE5B,MAGF,EAAY,sBAGrB,EAAS,YAAiB,EAAM,YAChC,EAAS,eAAiB,EAAM,eAEhC,EAAM,SAAW,EAEjB,EAAO,QAAU,8IC1KjB,SAAS,GAAT,GAAqD,GAAtB,GAAsB,EAAtB,YAAa,EAAS,EAAT,KACtC,GAAY,QACd,EAAY,OAAO,uBAAuB,GArE9C,GAAM,GAAe,EAAQ,kBACvB,EAAe,EAAQ,iBACvB,EAAe,EAAQ,WACvB,EAAe,EAAQ,cACvB,EAAe,EAAQ,oBAEa,EAAQ,oBAA1C,IAAA,aAAc,IAAA,eAetB,GAAa,UAAU,eAAiB,SAAU,GAChD,MAAI,wBAAwB,KAAK,IAC/B,KAAK,QAAQ,eAAiB,EACvB,MAGL,EAAG,KAAK,IACV,KAAK,QAAQ,eAAiB,EAAU,SAAW,QAC5C,MAGF,KAAK,QAAQ,gBAGtB,EAAa,UAAU,uBAAyB,SAAU,GACxD,GAAM,GAAU,KAAK,QAAQ,cAE7B,IAAgB,UAAZ,EAEJ,MAAgB,WAAZ,MACF,GAAM,sBAQJ,EAAO,iBAKP,uCAAuC,KAAK,EAAM,OAKlD,EAAG,QAAQ,EAAM,SACd,EAAgB,EAAM,OAAQ,0EAIrC,EAAM,kBASR,KAAA,OAA2B,OAAQ,OAAQ,KAAM,UAAjD,EAAA,EAAA,EAAA,EAAA,OAAA,IAA4D,CAAvD,GAAM,GAAA,EAAA,EACT,GAAY,QAAQ,GAAG,EAAa,GAItC,EAAY,UAAU,UAAY,SAA4B,GAC5D,IAAA,GAAA,GAA0B,EAAM,aAAhC,EAAA,MAAA,QAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,OAAA,cAA8C,CAAA,GAAA,EAAA,IAAA,EAAA,CAAA,GAAA,GAAA,EAAA,OAAA,KAAA,GAAA,EAAA,SAAA,CAAA,GAAA,EAAA,EAAA,OAAA,EAAA,KAAA,KAAA,GAAA,EAAA,MAAA,GAAnC,GAAmC,CAE5C,IAAI,EAAY,UACR,EAAY,UAAY,EAAM,QAC3B,EAAa,EAAY,QAAS,EAAM,SAGjD,WADA,GAAY,OAAO,uBAAuB,qJC1DhD,SAAS,GAAe,GACtB,GAAM,GAAc,EAAM,OACpB,EAAc,EAAQ,OAAO,EAAO,EAAM,KAAM,EAEjD,IAED,EAAY,SACT,EAAM,UAAY,EAAY,QAAQ,SACtC,EAAM,UAAY,EAAY,QAAQ,SACtC,IAAkB,EAAY,QAAQ,SAE3C,EAAY,YAAY,GAAK,EAC7B,EAAY,UAAY,IAAK,GAAI,OAAO,UAExC,EAAc,MACZ,YAAA,EACA,MAAA,EACA,YAAA,EACA,QAAS,EACT,KAAM,SA9CZ,GAAM,GAAgB,EAAQ,WACxB,EAAgB,EAAQ,kBACxB,EAAgB,EAAQ,mBACxB,EAAgB,EAAQ,6BACxB,EAAgB,EAAQ,0BAEX,EAAQ,kBAAnB,IAAA,OAEF,EAAW,OAAO,UAAU,QA2ClC,IAzCK,EAAO,MAAM,UAChB,EAAO,MAAM,QAAU,SAAU,GAC/B,MAA8B,mBAAvB,EAAS,KAAK,KAIpB,OAAO,UAAU,OACpB,OAAO,UAAU,KAAO,WACtB,MAAO,MAAK,QAAQ,qCAAsC,MAiC1D,EAAQ,MAAO,CACjB,GAAM,GAAY,SAAU,GAC1B,IAAA,GAAA,GAA0B,EAAM,aAAhC,EAAA,MAAA,QAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,OAAA,cAA8C,CAAA,GAAA,EAAA,IAAA,EAAA,CAAA,GAAA,GAAA,EAAA,OAAA,KAAA,GAAA,EAAA,SAAA,CAAA,GAAA,EAAA,EAAA,OAAA,EAAA,KAAA,KAAA,GAAA,EAAA,MAAA,GAAnC,GAAmC,CACxC,GAAY,eACd,EAAY,OAAO,uBAAuB,KAK1C,EAAW,SAAA,EAAiC,GAAY,GAAxB,GAAwB,EAAxB,IAC9B,GADsD,EAAnB,IACY,IAAjC,EAAW,QAAQ,UACnC,EAAO,IAAM,EAAO,OAGxB,GAAY,EAAK,cAAe,GAE5B,GACF,EAAY,EAAK,WAAY,GAIjC,GAAM,QAAQ,GAAG,eAAmB,GACpC,EAAM,QAAQ,GAAG,kBAAmB,GAGtC,EAAO,QAAU,4KCyGjB,SAAS,GAAU,EAAS,EAAQ,GAClC,MAAQ,IAAW,EAAQ,UACf,IAAW,EAAQ,YAClB,GAAkB,EAAQ,SAxLzC,GAAM,GAAgB,EAAQ,oBACxB,EAAgB,EAAQ,kBACxB,EAAgB,EAAQ,mBAExB,GACJ,SAEA,WAAY,SAAU,GAAK,GACjB,GAAkC,EAAlC,YAAyB,EAAS,EAArB,WACb,EAAiC,EAAjC,OAAQ,EAAyB,EAAzB,QAAS,EAAgB,EAAhB,YACnB,EAAO,EAAO,QAAQ,EAExB,IACF,EAAY,KAAO,EAAK,EAAI,EAAK,KACjC,EAAY,IAAO,EAAK,EAAI,EAAK,IAEjC,EAAY,MAAS,EAAK,MAAS,EAAK,EACxC,EAAY,OAAS,EAAK,OAAS,EAAK,EAElC,SAAY,KAAS,EAAK,MAAS,EAAK,MAAS,EAAK,MACtD,UAAY,KAAS,EAAK,OAAS,EAAK,OAAS,EAAK,MAG5D,EAAY,KAAO,EAAY,IAAM,EAAY,MAAQ,EAAY,OAAS,EAGhF,EAAI,KAAO,EACX,EAAI,aAAe,EACnB,EAAI,QAAU,CAEd,KAAK,GAAI,GAAI,EAAG,EAAI,EAAU,MAAM,OAAQ,IAAK,CAC/C,GAAM,GAAe,EAAU,MAAM,EAErC,GAAI,QAAU,EAAO,QAAQ,EAAY,SAAS,MAAM,GAEnD,EAAI,UAIT,EAAY,gBAAgB,GAAgB,EAAU,GAAc,UAAU,MAIlF,OAAQ,SAAU,GAWhB,IAAA,GAVQ,GAAkD,EAAlD,YAAa,EAAqC,EAArC,SAAU,EAA2B,EAA3B,OAAQ,EAAmB,EAAnB,eACjC,EAAS,KAAW,EAAI,YACxB,GACJ,GAAI,EACJ,GAAI,EACJ,SAAS,EACT,QAAQ,EACR,YAAY,GAGd,EAA2B,EAAU,MAArC,EAAA,MAAA,QAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,OAAA,cAA4C,CAAA,GAAA,EAAA,IAAA,EAAA,CAAA,GAAA,GAAA,EAAA,OAAA,KAAA,GAAA,EAAA,SAAA,CAAA,GAAA,EAAA,EAAA,OAAA,EAAA,KAAA,KAAA,GAAA,EAAA,MAAA,GAAjC,GAAiC,EACpC,EAAW,EAAU,GACrB,EAAU,EAAY,OAAO,QAAQ,EAAY,SAAS,MAAM,EAEjE,GAAS,EAAS,EAAQ,KAE/B,EAAI,OAAS,EAAI,OAAS,EAAS,GACnC,EAAI,QAAU,EACd,EAAI,OAAS,EAAI,YAAY,gBAAgB,GAE7C,EAAS,IAAI,GAET,EAAI,OAAO,SACb,EAAO,GAAK,EAAI,OAAO,GACvB,EAAO,GAAK,EAAI,OAAO,GAEvB,EAAO,IAAM,EAAI,OAAO,GACxB,EAAO,IAAM,EAAI,OAAO,GAExB,EAAO,QAAS,IAUpB,MAFA,GAAO,YAAc,EAAI,SAAW,EAAO,QAAU,EAAI,OAAO,QAEzD,GAGT,cAAe,SAAU,GACvB,IAAA,GAAA,GAA2B,EAAU,MAArC,EAAA,MAAA,QAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,OAAA,cAA4C,CAAA,GAAA,EAAA,IAAA,EAAA,CAAA,GAAA,GAAA,EAAA,OAAA,KAAA,GAAA,EAAA,SAAA,CAAA,GAAA,EAAA,EAAA,OAAA,EAAA,KAAA,KAAA,GAAA,EAAA,MAAA,GAAjC,GAAiC,EACpC,EAAS,EAAS,MAExB,GAAO,GAAK,EAAO,GAAK,EACxB,EAAO,UAAY,EAAO,UAAY,IACtC,EAAO,QAAS,EAChB,EAAO,SAAU,EAEjB,EAAS,GAAgB,EAG3B,MAAO,IAGT,MAAO,SAAA,EAA2B,GAAY,GAA3B,GAA2B,EAA3B,YACX,GACJ,YAAA,EACA,YAA4B,kBAAf,EACA,EAAY,UAAY,EAAY,aAAa,KAC9D,YAAa,EAAY,YACzB,SAAU,EAAY,iBACtB,QAAQ,EACR,gBAAgB,EAGlB,GAAU,WAAW,GACrB,EAAU,cAAc,EAAI,UAE5B,EAAI,WAAa,KAAW,EAAY,YAAY,MACpD,EAAY,eAAiB,EAAU,OAAO,IAIlD,GAAY,QAAQ,GAAG,MAAO,SAAU,GACtC,EAAY,aAAqB,KAAM,EAAG,MAAO,EAAG,IAAK,EAAG,OAAQ,GACpE,EAAY,mBACZ,EAAY,iBAAmB,EAAU,kBACzC,EAAY,eAAmB,OAGjC,EAAY,QAAQ,GAAG,eAAiB,EAAU,OAClD,EAAY,QAAQ,GAAG,gBAAiB,EAAU,OAElD,EAAY,QAAQ,GAAG,qBAAsB,SAAA,GAA0D,GAA9C,GAA8C,EAA9C,YAAa,EAAiC,EAAjC,OAAQ,EAAyB,EAAzB,sBACtE,EAAiB,EAAU,QAC/B,YAAA,EACA,OAAA,EACA,WAAY,EAAY,UAAU,KAClC,SAAU,EAAY,iBACtB,gBAAgB,KAKb,EAAe,YAAc,IAChC,EAAY,eAAgB,GAG9B,EAAY,eAAiB,IAG/B,EAAY,QAAQ,GAAG,aAAc,SAAA,GACnC,IAAK,GAD0C,GAAsB,EAAtB,YAAa,EAAS,EAAT,MACnD,EAAI,EAAG,EAAI,EAAU,MAAM,OAAQ,IAAK,CAI/C,GAAI,EAHY,EAAY,OAAO,QAAQ,EAAY,SAAS,MAAM,EAAU,MAAM,KAGhE,GAAM,GAAO,CAEjC,EAAY,QAAS,MAAA,EAAO,QAAQ,GACpC,WAKN,EAAc,QAAQ,GAAG,SAAU,SAAU,GAI3C,IAAK,GAHG,GAAwB,EAAxB,OAAQ,EAAgB,EAAhB,YACV,EAAc,KAAW,GAEtB,EAAI,EAAG,EAAI,EAAU,MAAM,OAAQ,IAAK,CAC/C,GAAM,GAAe,EAAU,MAAM,EAGrC,IAFA,EAAY,QAAU,EAAY,OAAO,QAAQ,EAAY,SAAS,MAAM,GAEvE,EAAY,QAAjB,CAIA,GAAM,GAAW,EAAU,EAE3B,GAAY,OAAS,EAAY,iBAAiB,GAElD,EAAO,GAAgB,EAAS,aAAa,OAUjD,EAAO,QAAU,mGC3FjB,SAAS,GAAoB,EAAO,EAAa,GAC/C,MAAI,GAAM,GAAG,SAAS,GACb,EAAM,gBAAgB,EAAO,EAAY,OAAQ,EAAY,SAAU,EAAK,EAAG,EAAK,EAAG,IAEvF,EAAM,gBAAgB,EAAO,EAAY,OAAQ,EAAY,SApGxE,GAAM,GAAiB,EAAQ,WACzB,EAAiB,EAAQ,YACzB,EAAiB,EAAQ,qBAEzB,GACJ,UACE,SAAa,EACb,SAAa,EACb,YAAa,KACb,YAAa,MAGf,UAAW,SAAA,GAA0C,GAA9B,GAA8B,EAA9B,KAAM,EAAwB,EAAxB,YAAa,EAAW,EAAX,QAClC,EAAc,GAAW,EAAQ,YACjC,IAaN,OAXI,IAAQ,GACV,EAAO,KAAO,EAAY,KAAQ,EAAK,MAAS,EAAY,KAC5D,EAAO,IAAO,EAAY,IAAQ,EAAK,OAAS,EAAY,IAE5D,EAAO,MAAS,EAAY,MAAU,EAAK,OAAU,EAAI,EAAY,OACrE,EAAO,OAAS,EAAY,OAAU,EAAK,QAAU,EAAI,EAAY,SAGrE,EAAO,KAAO,EAAO,IAAM,EAAO,MAAQ,EAAO,OAAS,EAGrD,GAGT,IAAK,SAAA,GAAwD,GAA5C,GAA4C,EAA5C,WAAY,EAAgC,EAAhC,YAAa,EAAmB,EAAnB,OAAQ,EAAW,EAAX,OAChD,KAAK,EAAW,MAAO,EAEvB,IAAM,GAAO,EAAO,aACd,EAAG,EAAO,EAAG,EAAG,EAAO,GACzB,EAAM,UAAW,GAEf,EAAc,EAAmB,EAAQ,YAAa,EAAa,EAEzE,KAAK,EAAe,MAAO,EAE3B,GAAO,GAAK,EACZ,EAAO,GAAK,EACZ,EAAO,QAAS,CAEhB,IAAM,GAAO,EACT,EAAY,EAAK,EACjB,EAAY,EAAK,EAEf,EAAS,EAAY,gBAAgB,QAKvC,MAAO,IAAe,KAAO,IAC/B,EAAY,KAAK,IAAI,KAAK,IAAI,EAAK,EAAI,EAAK,MAAS,EAAO,MAAQ,EAAK,GAAI,EAAK,EAAI,EAAO,MAC7F,EAAY,KAAK,IAAI,KAAK,IAAI,EAAK,EAAI,EAAK,OAAS,EAAO,OAAQ,EAAK,GAAI,EAAK,EAAI,EAAO,OAG7F,EAAY,KAAK,IAAI,KAAK,IAAI,EAAK,MAAS,EAAO,MAAQ,EAAK,GAAI,EAAK,KAAO,EAAO,MACvF,EAAY,KAAK,IAAI,KAAK,IAAI,EAAK,OAAS,EAAO,OAAQ,EAAK,GAAI,EAAK,IAAO,EAAO,MAGzF,EAAO,GAAK,EAAY,EAAK,EAC7B,EAAO,GAAK,EAAY,EAAK,EAE7B,EAAO,QAAU,EAAO,YAAc,GAAa,EAAO,YAAc,EACxE,EAAO,UAAY,EAAO,KAAM,EAAO,IAEvC,EAAO,UAAY,EACnB,EAAO,UAAY,GAGrB,aAAc,SAAA,GAAoD,GAAxC,GAAwC,EAAxC,KAAM,EAAkC,EAAlC,OAAQ,EAA0B,EAA1B,OAAQ,EAAkB,EAAlB,MAAO,EAAW,EAAX,QAC/C,EAAc,GAAW,EAAQ,WAEvC,IAAI,GAAW,EAAQ,UACJ,UAAV,IAAqB,IAAe,EAAO,SAE9C,EAAO,OAMT,MALA,GAAK,GAAK,EAAO,GACjB,EAAK,GAAK,EAAO,GACjB,EAAO,GAAK,EAAO,GACnB,EAAO,GAAK,EAAO,IAGjB,GAAI,EAAO,GACX,GAAI,EAAO,KAMnB,mBAAA,EAWF,GAAU,SAAW,EACrB,EAAU,MAAM,KAAK,YAErB,EAAe,UAAU,SAAW,EAAS,SAE7C,EAAO,QAAU,wFClGjB,IAAM,GAAiB,EAAQ,WACzB,EAAiB,EAAQ,YACzB,EAAiB,EAAQ,iBACzB,EAAiB,EAAQ,qBACzB,EAAiB,EAAQ,uBAEA,EAAQ,cAA/B,IAAA,mBAEF,GAAY,IAAM,EAAA,EAAU,KAAO,EAAA,EAAU,QAAS,EAAA,EAAU,OAAQ,EAAA,GACxE,GAAY,KAAM,EAAA,EAAU,MAAO,EAAA,EAAU,OAAS,EAAA,EAAU,MAAQ,EAAA,GAExE,GACJ,UACE,SAAS,EACT,SAAS,EACT,IAAK,KACL,IAAK,KACL,OAAQ,MAGV,UAAW,SAAA,GAAiD,GAArC,GAAqC,EAArC,YAAa,EAAwB,EAAxB,YAAa,EAAW,EAAX,OAC/C,KAAK,EACH,MAAO,GAAM,UAAW,EAG1B,IAAM,GAAS,EAAmB,EAAQ,OAAQ,EAAa,EAAY,YAAY,KAEvF,OAAI,IAEA,IAAQ,EAAY,IAAS,EAAO,EACpC,KAAQ,EAAY,KAAS,EAAO,EACpC,OAAQ,EAAY,OAAS,EAAO,EACpC,MAAQ,EAAY,MAAS,EAAO,GAIjC,GAGT,IAAK,SAAA,GAAgE,GAApD,GAAoD,EAApD,WAAY,EAAwC,EAAxC,YAAa,EAA2B,EAA3B,OAAQ,EAAmB,EAAnB,OAAQ,EAAW,EAAX,QAClD,EAAQ,EAAY,SAAS,aAAe,EAAY,SAAS,KAEvE,IAAK,EAAY,eAAkB,EAAnC,CAIA,GAAM,GAAO,EAAO,aACd,EAAG,EAAO,EAAG,EAAG,EAAO,GACzB,EAAM,UAAW,GACf,EAAQ,EAAU,WAAW,EAAmB,EAAQ,MAAO,EAAa,KAAU,EACtF,EAAQ,EAAU,WAAW,EAAmB,EAAQ,MAAO,EAAa,KAAU,EAExF,EAAY,EAAK,EACjB,EAAY,EAAK,CAErB,GAAO,GAAK,EACZ,EAAO,GAAK,EACZ,EAAO,QAAS,EAEZ,EAAM,IACR,EAAY,KAAK,IAAI,KAAK,IAAI,EAAM,IAAS,EAAO,IAAQ,EAAK,GAAI,EAAM,IAAS,EAAO,KAEpF,EAAM,SACb,EAAY,KAAK,IAAI,KAAK,IAAI,EAAM,OAAS,EAAO,OAAQ,EAAK,GAAI,EAAM,OAAS,EAAO,SAEzF,EAAM,KACR,EAAY,KAAK,IAAI,KAAK,IAAI,EAAM,KAAS,EAAO,KAAQ,EAAK,GAAI,EAAM,KAAS,EAAO,MAEpF,EAAM,QACb,EAAY,KAAK,IAAI,KAAK,IAAI,EAAM,MAAS,EAAO,MAAQ,EAAK,GAAI,EAAM,MAAS,EAAO,QAG7F,EAAO,GAAK,EAAY,EAAK,EAC7B,EAAO,GAAK,EAAY,EAAK,EAE7B,EAAO,QAAU,EAAO,YAAc,GAAa,EAAO,YAAc,EACxE,EAAO,UAAY,EAAO,KAAM,EAAO,IAEvC,EAAO,UAAY,EACnB,EAAO,UAAY,IAGrB,aAAc,SAAA,GAAoD,GAAxC,GAAwC,EAAxC,KAAM,EAAkC,EAAlC,OAAQ,EAA0B,EAA1B,OAAQ,EAAkB,EAAlB,MAAO,EAAW,EAAX,OACrD,IAAI,GAAW,EAAQ,UACJ,UAAV,IAAqB,EAAO,SAE/B,EAAO,OAMT,MALA,GAAK,GAAK,EAAO,GACjB,EAAK,GAAK,EAAO,GACjB,EAAO,GAAK,EAAO,GACnB,EAAO,GAAK,EAAO,IAGjB,GAAI,EAAO,GACX,GAAI,EAAO,KAMnB,QAAA,EACA,QAAA,EACA,mBAAA,EAGF,GAAU,cAAgB,EAC1B,EAAU,MAAM,KAAK,iBAErB,EAAe,UAAU,cAAgB,EAAc,SACvD,EAAO,SAAS,cAAyB,EAAc,SAEvD,EAAO,QAAU,kJC/GjB,IAAM,GAAiB,EAAQ,WACzB,EAAiB,EAAQ,mBACzB,EAAiB,EAAQ,YACzB,EAAiB,EAAQ,iBACzB,EAAiB,EAAQ,qBACzB,EAAiB,EAAQ,qBAEzB,GAAU,OAAQ,EAAA,EAAU,QAAS,EAAA,GACrC,GAAU,MAAQ,EAAA,EAAU,OAAS,EAAA,GAErC,GACJ,UACE,SAAS,EACT,SAAS,EACT,IAAK,KACL,IAAK,MAGP,UAAW,SAAA,GACT,MADoC,GAAf,YACF,aAGrB,IAAK,SAAU,GAAK,GACV,GAAyB,EAAzB,YAAa,EAAY,EAAZ,QACf,EAAQ,EAAY,SAAS,aAAe,EAAY,SAAS,KAEvE,IAAK,EAAY,eAAkB,EAAnC,CAIA,GAAM,GAAO,EAAU,WAAW,EAAY,YAAY,UAEpD,EAAU,EAAU,WAAW,EAAc,mBAAmB,EAAQ,IAAK,KAAiB,EAC9F,EAAU,EAAU,WAAW,EAAc,mBAAmB,EAAQ,IAAK,KAAiB,CAEpG,GAAI,SACF,QAAS,EAAQ,QACjB,QAAS,EAAQ,QACjB,MAAO,EAAM,UAAW,EAAc,SACtC,MAAO,EAAM,UAAW,EAAc,UAGpC,EAAM,KACR,EAAI,QAAQ,MAAM,IAAM,EAAK,OAAS,EAAQ,OAC9C,EAAI,QAAQ,MAAM,IAAM,EAAK,OAAS,EAAQ,QAEvC,EAAM,SACb,EAAI,QAAQ,MAAM,OAAS,EAAK,IAAM,EAAQ,OAC9C,EAAI,QAAQ,MAAM,OAAS,EAAK,IAAM,EAAQ,QAE5C,EAAM,MACR,EAAI,QAAQ,MAAM,KAAO,EAAK,MAAQ,EAAQ,MAC9C,EAAI,QAAQ,MAAM,KAAO,EAAK,MAAQ,EAAQ,OAEvC,EAAM,QACb,EAAI,QAAQ,MAAM,MAAQ,EAAK,KAAO,EAAQ,MAC9C,EAAI,QAAQ,MAAM,MAAQ,EAAK,KAAO,EAAQ,OAGhD,EAAc,IAAI,KAGpB,aAAc,EAAc,aAG9B,GAAU,aAAe,EACzB,EAAU,MAAM,KAAK,gBAErB,EAAe,UAAU,aAAe,EAAa,SACrD,EAAO,SAAS,aAAwB,EAAa,SAErD,EAAO,QAAU,uJClFjB,IAAM,GAAiB,EAAQ,WACzB,EAAiB,EAAQ,eACzB,EAAiB,EAAQ,YACzB,EAAiB,EAAQ,qBAEzB,GACJ,UACE,SAAS,EACT,SAAS,EACT,MAAS,EAAA,EACT,QAAS,KACT,QAAS,KAET,eAAgB,MAGlB,UAAW,SAAA,GAA8E,GAAlE,GAAkE,EAAlE,YAAa,EAAqD,EAArD,aAAc,EAAuC,EAAvC,QAAS,EAA8B,EAA9B,KAAM,EAAwB,EAAxB,YAAa,EAAW,EAAX,QACtE,KACA,EAAgB,EAAM,SAAS,EAAM,gBAAgB,EAAQ,SAC7D,EAAS,GAAiB,EAAM,YAAY,EAAc,EAAS,EAAY,SAAS,KAC9F,GAAU,GAAW,EAAa,QAAQ,EAAY,SAAS,MAAM,QAErE,IAAI,OAAA,EAEJ,IAAuB,gBAAnB,EAAQ,OACV,GACE,EAAG,EAAY,YAAY,KAAK,EAAI,EAAO,EAC3C,EAAG,EAAY,YAAY,KAAK,EAAI,EAAO,OAGzC,CACJ,GAAM,GAAa,EAAM,gBAAgB,EAAQ,OAAQ,EAAc,GAAU,GAEjF,GAAa,EAAM,SAAS,KAAiB,EAAG,EAAG,EAAG,GAGxD,GAAI,GAAQ,EAAQ,gBAAkB,EAAQ,eAAe,OAC3D,IAAA,GAAA,GAA6C,EAAQ,eAArD,EAAA,MAAA,QAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,OAAA,cAAqE,CAAA,GAAA,EAAA,IAAA,EAAA,CAAA,GAAA,GAAA,EAAA,OAAA,KAAA,GAAA,EAAA,SAAA,CAAA,GAAA,EAAA,EAAA,OAAA,EAAA,KAAA,KAAA,GAAA,EAAA,MAAA,GAAA,GAAA,EAArD,EAAqD,EAAxD,EAAiB,EAAuC,EAA1C,CACzB,GAAQ,MACN,EAAG,EAAY,KAAQ,EAAK,MAAS,EAAa,EAAW,EAC7D,EAAG,EAAY,IAAQ,EAAK,OAAS,EAAa,EAAW,QAKjE,GAAQ,KAAK,EAGf,OAAO,IAGT,IAAK,SAAA,GAAyE,GAA7D,GAA6D,EAA7D,YAAa,EAAgD,EAAhD,WAAY,EAAoC,EAApC,OAAQ,EAA4B,EAA5B,QAAiB,EAAW,EAAnB,OACnD,KACF,MAAA,GACA,MAAA,GACA,MAAA,EAEJ,IAAI,EAAO,YACT,GAAS,EAAG,EAAO,EAAG,EAAG,EAAO,OAE7B,CACH,GAAM,GAAS,EAAM,YAAY,EAAY,OAAQ,EAAY,QAAS,EAAY,SAAS,KAE/F,GAAO,EAAM,UAAW,GAExB,EAAK,GAAK,EAAO,EACjB,EAAK,GAAK,EAAO,EAGnB,EAAO,MAAQ,EAAK,EACpB,EAAO,MAAQ,EAAK,CAIpB,KAAA,GAFI,GAAM,EAAQ,QAAS,EAAQ,QAAQ,OAAS,EAEpD,EAAyC,EAAzC,EAAA,MAAA,QAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,OAAA,cAAkD,CAAA,GAAA,EAAA,IAAA,EAAA,CAAA,GAAA,GAAA,EAAA,OAAA,KAAA,GAAA,EAAA,SAAA,CAAA,GAAA,EAAA,EAAA,OAAA,EAAA,KAAA,KAAA,GAAA,EAAA,MAIhD,IAAA,GAJgD,GAAA,EAAlC,EAAkC,EAArC,EAAe,EAAsB,EAAzB,EACjB,EAAY,EAAK,EAAI,EACrB,EAAY,EAAK,EAAI,EAE3B,EAAyB,EAAQ,QAAjC,EAAA,MAAA,QAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,OAAA,cAA0C,CAAA,GAAA,EAAA,IAAA,EAAA,CAAA,GAAA,GAAA,EAAA,OAAA,KAAA,GAAA,EAAA,SAAA,CAAA,GAAA,EAAA,EAAA,OAAA,EAAA,KAAA,KAAA,GAAA,EAAA,MAAA,GAA/B,GAA+B,CAEtC,GADE,EAAM,GAAG,SAAS,GACX,EAAW,EAAW,EAAW,GAGjC,EAGN,GAEL,EAAQ,MACN,EAAG,EAAM,GAAG,OAAO,EAAO,GAAM,EAAO,EAAI,EAAW,EACtD,EAAG,EAAM,GAAG,OAAO,EAAO,GAAM,EAAO,EAAI,EAAW,EAEtD,MAAO,EAAM,GAAG,OAAO,EAAO,OAAQ,EAAO,MAAO,EAAQ,SAKlE,GAAM,IACJ,OAAQ,KACR,SAAS,EACT,SAAU,EACV,MAAO,EACP,GAAI,EACJ,GAAI,EAGN,KAAK,EAAI,EAAG,EAAM,EAAQ,OAAQ,EAAI,EAAK,IAAK,CAC9C,EAAS,EAAQ,EAEjB,IAAM,GAAQ,EAAO,MACf,EAAK,EAAO,EAAI,EAAK,EACrB,EAAK,EAAO,EAAI,EAAK,EACrB,EAAW,EAAM,MAAM,EAAI,GAC7B,EAAU,GAAY,CAItB,KAAU,EAAA,GAAY,EAAQ,SAAW,EAAQ,QAAU,EAAA,IAC7D,GAAU,GAGP,EAAQ,UAAW,EAEjB,EAAQ,SAAW,IAAU,EAAA,EAE9B,EAAW,EAAQ,EAAQ,SAAW,EAAQ,MAE7C,IAAU,EAAA,GAAY,EAAQ,QAAU,EAAA,GAE1C,EAAW,EAAQ,UAEhB,EAAQ,SAAW,EAAW,EAAQ,YAE5C,EAAQ,OAAS,EACjB,EAAQ,SAAW,EACnB,EAAQ,MAAQ,EAChB,EAAQ,QAAU,EAClB,EAAQ,GAAK,EACb,EAAQ,GAAK,EAEb,EAAO,MAAQ,GAInB,GAAI,OAAA,EAEA,GAAQ,QACV,EAAe,EAAO,YAAc,EAAQ,OAAO,GAAK,EAAO,YAAc,EAAQ,OAAO,EAE5F,EAAO,UAAY,EAAQ,OAAO,EAClC,EAAO,UAAY,EAAQ,OAAO,IAGlC,GAAc,EAEd,EAAO,UAAY,IACnB,EAAO,UAAY,KAGrB,EAAO,GAAK,EAAQ,GACpB,EAAO,GAAK,EAAQ,GAEpB,EAAO,QAAW,GAAgB,EAAQ,UAAY,EAAO,OAC7D,EAAO,OAAS,EAAQ,SAG1B,aAAc,SAAA,GAAoD,GAAxC,GAAwC,EAAxC,KAAM,EAAkC,EAAlC,OAAQ,EAA0B,EAA1B,OAAQ,EAAkB,EAAlB,MAAO,EAAW,EAAX,QAC/C,EAAiB,GAAW,EAAQ,cAE1C,IAAI,GAAW,EAAQ,UACJ,UAAV,IAAqB,IAAkB,EAAe,QAS7D,MAPI,GAAO,SACT,EAAK,GAAK,EAAO,GACjB,EAAK,GAAK,EAAO,GACjB,EAAO,GAAK,EAAO,GACnB,EAAO,GAAK,EAAO,KAInB,MAAS,EAAO,MAChB,OAAS,EAAO,OAChB,EAAS,EAAO,UAChB,EAAS,EAAO,UAChB,MAAS,EAAO,MAChB,MAAS,EAAO,MAChB,GAAS,EAAO,GAChB,GAAS,EAAO,KAMxB,GAAS,eAAiB,SAAU,GAClC,MAAO,UAAU,EAAG,GAClB,GAAM,GAAS,EAAK,SAClB,MAAS,EAAA,EACT,MAAS,EAAA,EACT,KAAS,EAAA,EACT,OAAS,EAAA,GAEP,EAAU,EACV,EAAU,CAEV,GAAM,GAAG,OAAO,EAAK,UACvB,EAAU,EAAK,OAAO,EACtB,EAAU,EAAK,OAAO,EAGxB,IAAM,GAAQ,KAAK,OAAO,EAAI,GAAW,EAAK,GACxC,EAAQ,KAAK,OAAO,EAAI,GAAW,EAAK,EAK9C,QACE,EAJW,KAAK,IAAI,EAAO,KAAM,KAAK,IAAI,EAAO,MAAQ,EAAQ,EAAK,EAAI,IAK1E,EAJW,KAAK,IAAI,EAAO,IAAM,KAAK,IAAI,EAAO,OAAQ,EAAQ,EAAK,EAAI,IAK1E,MAAO,EAAK,SAKlB,EAAU,KAAO,EACjB,EAAU,MAAM,KAAK,QAErB,EAAe,UAAU,KAAO,EAAK,SAErC,EAAO,QAAU,yGCjOjB,IAAM,GAAiB,EAAQ,WACzB,EAAiB,EAAQ,UACzB,EAAiB,EAAQ,qBACzB,EAAiB,EAAQ,qBACzB,EAAiB,EAAQ,aAEzB,GACJ,UACE,SAAS,EACT,SAAS,EACT,MAAS,EAAA,EACT,QAAS,KACT,QAAS,MAGX,UAAW,SAAU,GAAK,GAChB,GAAyB,EAAzB,YAAa,EAAY,EAAZ,QACf,EAAQ,EAAY,SAAS,KAEnC,IAAK,EAAL,CAEA,EAAI,SACF,iBACE,EAAG,EAAM,KAAM,EAAI,EACnB,EAAG,EAAM,IAAM,EAAI,IAErB,QAAU,EAAG,EAAG,EAAG,GACnB,OAAQ,OACR,MAAO,EAAQ,MAGjB,IAAM,GAAU,EAAK,UAAU,EAG/B,OAFA,GAAI,QAAU,EAEP,IAGT,IAAK,SAAU,GAAK,GACV,GAA6C,EAA7C,YAAa,EAAgC,EAAhC,QAAS,EAAuB,EAAvB,OAAQ,EAAe,EAAf,WAChC,EAAO,EAAM,UAAW,GACxB,EAAY,EAAK,EAAI,EAAO,GAAG,EAC/B,EAAY,EAAK,EAAI,EAAO,GAAG,CAErC,GAAI,QAAU,EAAM,UAAW,GAC/B,EAAI,QAAQ,UAEZ,KAAA,GAAA,GAAyB,EAAQ,QAAjC,EAAA,MAAA,QAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,OAAA,cAA0C,CAAA,GAAA,EAAA,IAAA,EAAA,CAAA,GAAA,GAAA,EAAA,OAAA,KAAA,GAAA,EAAA,SAAA,CAAA,GAAA,EAAA,EAAA,OAAA,EAAA,KAAA,KAAA,GAAA,EAAA,MAAA,GAA/B,GAA+B,EACpC,MAAA,EAGF,GADE,EAAM,GAAG,SAAS,GACX,EAAW,EAAW,EAAW,GAGjC,EAGN,IAED,SAAW,IAAU,UAAY,KACnC,EAAO,EAAI,EAAO,MAClB,EAAO,EAAI,EAAO;cAGpB,EAAI,QAAQ,QAAQ,KAAK,IAG3B,EAAK,IAAI,IAGX,aAAc,SAAU,GAAK,GACnB,GAAY,EAAZ,OAER,GAAI,QAAU,EAAM,UAAW,GAC/B,EAAI,QAAQ,QAAU,EAAQ,QAC9B,EAAI,QAAQ,gBAAkB,MAE9B,EAAK,aAAa,IAItB,GAAU,SAAW,EACrB,EAAU,MAAM,KAAK,YAErB,EAAe,UAAU,SAAW,EAAS,SAC7C,EAAO,SAAS,SAAoB,EAAS,SAE7C,EAAO,QAAU,2NCzFjB,GAAM,GAAe,EAAQ,wBAE7B,GAAO,QAAP,WACE,QAAA,GAAa,EAAM,EAAS,EAAO,EAAa,GAiB9C,GAjB2D,EAAA,KAAA,GAC3D,EAAa,cAAc,KAAM,GAE7B,IAAU,GACZ,EAAa,cAAc,KAAM,GAGnC,KAAK,YAAc,EAEnB,KAAK,WAAgB,GAAI,OAAO,UAChC,KAAK,cAAgB,EACrB,KAAK,KAAgB,EACrB,KAAK,UAAgB,EAAa,aAAa,GAC/C,KAAK,YAAgB,EAAa,eAAe,GACjD,KAAK,OAAgB,EACrB,KAAK,cAAgB,KAER,QAAT,EAAgB,CAClB,GAAM,GAAe,EAAY,gBAAgB,EACjD,MAAK,GAAK,KAAK,UAAY,EAAY,UAAU,EAEjD,IAAM,GAAW,KAAK,UAAY,EAAY,OAE9C,MAAK,UAAY,EAAY,SACK,cAA7B,EAAY,QAAQ,MACpB,EAAY,QAAQ,SAAW,KAAK,QACpC,EAAW,SAEA,cAAT,IACP,KAAK,GAAK,EAAQ,UAAY,EAAY,SA9BhD,MAAA,GAAA,UAkCE,eAlCF,SAAA,GAkC8C,GAAvB,GAAuB,EAA1B,EAAe,EAAW,EAAd,CAM5B,OALA,MAAK,OAAW,EAChB,KAAK,OAAW,EAChB,KAAK,SAAW,EAChB,KAAK,SAAW,EAET,MAxCX,EAAA,UA2CE,UA3CF,SAAA,GA2CyC,GAAvB,GAAuB,EAA1B,EAAe,EAAW,EAAd,CAMvB,OALA,MAAK,OAAW,EAChB,KAAK,OAAW,EAChB,KAAK,SAAW,EAChB,KAAK,SAAW,EAET,MAjDX,EAAA,UAoDE,eApDF,WAqDI,KAAK,cAAc,kBArDvB,EAAA,UAwDE,gBAxDF,WAyDI,KAAK,oBAAqB,GAzD9B,EAAA,UA4DE,yBA5DF,WA6DI,KAAK,4BAA8B,KAAK,oBAAqB,GA7DjE,oEC+BA,SAAS,GAAM,GAkBb,IAAK,GAhBH,GAIE,EAJF,YAAa,EAIX,EAJW,QAAS,EAIpB,EAJoB,MAAO,EAI3B,EAJ2B,YAFb,EAMd,EAHF,KAAA,MAHgB,KAAA,EAGT,EAAI,aAAa,KAHR,EAAA,EAMd,EAFF,QAAA,MAJgB,KAAA,EAIN,EAAoB,GAJd,EAAA,EAMd,EADF,aAAA,MALgB,KAAA,EAKD,GAAI,GAAa,EAAM,EAAS,EAAO,EAAa,GALnD,EAQZ,GACJ,YAAA,EACA,QAAA,EACA,MAAA,EACA,YAAA,EACA,QAAA,EACA,KAAA,EACA,aAAA,GAGO,EAAI,EAAG,EAAI,EAAQ,OAAQ,IAAK,CACvC,GAAM,GAAS,EAAQ,EAEvB,KAAK,GAAM,KAAQ,GAAO,UACxB,EAAa,GAAQ,EAAO,MAAM,EAGpC,IAAM,GAAS,EAAM,YAAY,EAAO,UAAW,EAAO,QAU1D,IARA,EAAa,eAAe,GAC5B,EAAa,UAAY,EAAO,UAChC,EAAa,cAAgB,EAAO,QAEpC,EAAO,UAAU,KAAK,GAEtB,EAAa,UAAU,GAEnB,EAAa,6BACT,EAAa,oBACT,EAAI,EAAK,EAAQ,QAAU,EAAQ,EAAI,GAAG,UAAY,EAAa,cAC7E,MAMJ,GAFA,EAAQ,KAAK,QAAS,GAET,QAAT,EAAgB,CAGlB,GAAM,GAAU,EAAa,OACzB,GACA,YAAA,EAAa,QAAA,EAAS,MAAA,EAAO,YAAA,EAC7B,KAAM,cAEN,CAEJ,GAAY,QAAU,EACtB,EAAY,QAAU,EAAQ,UAGhC,MAAO,GAGT,QAAS,GAAT,GAAkF,GAAlD,GAAkD,EAAlD,YAAa,EAAqC,EAArC,QAAS,EAA4B,EAA5B,MAAO,EAAqB,EAArB,YAAa,EAAQ,EAAR,KAClE,EAAe,EAAY,gBAAgB,EAGjD,IAAa,QAAT,IAAmB,EAAY,kBAE1B,EAAY,YAAY,IAAiB,EAAY,YAAY,KAAkB,GAC1F,QAeF,KAAA,GAZM,GAAO,EAAM,QAAQ,GACrB,GACJ,YAAA,EACA,QAAA,EACA,MAAA,EACA,YAAA,EACA,KAAA,EACA,KAAA,EACA,WACA,QAAS,MAGX,EAAsB,EAAtB,EAAA,MAAA,QAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,OAAA,cAA4B,CAAA,GAAA,EAAA,IAAA,EAAA,CAAA,GAAA,GAAA,EAAA,OAAA,KAAA,GAAA,EAAA,SAAA,CAAA,GAAA,EAAA,EAAA,OAAA,EAAA,KAAA,KAAA,GAAA,EAAA,MAAA,GAAjB,GAAiB,CAC1B,GAAU,QAAU,EAEpB,EAAQ,KAAK,kBAAmB,GAQlC,MALa,SAAT,IACF,EAAU,QAAU,EAAO,EAAU,QAAS,SAAA,GAAA,MAC5C,GAAO,UAAU,QAAQ,eAAiB,EAAY,WAAW,GAAc,YAG5E,EAAU,QA/HnB,GAAM,GAAe,EAAQ,kBACvB,EAAe,EAAQ,kBACvB,EAAe,EAAQ,YACvB,EAAe,EAAQ,oBACvB,EAAe,EAAQ,qBACvB,EAAe,EAAQ,oBAAoB,QAC5B,EAAQ,gBAArB,IAAA,OAEF,GAAkB,OAAQ,KAAM,UAChC,GAAkB,OAAQ,KAAM,UAEhC,GACJ,aAAA,EACA,KAAA,EACA,oBAAA,EACA,QAAA,EACA,UACE,aAAc,IACd,WAAc,KACd,UAAc,KACd,QAAgB,EAAG,EAAG,EAAG,IAE3B,OACE,OACA,OACA,KACA,SACA,MACA,YACA,QAqGJ,GAAY,QAAQ,GAAG,sBAAuB,SAAA,GAAyC,GAA7B,GAA6B,EAA7B,YAAa,EAAgB,EAAhB,YACrE,GAAY,WAAW,IAAkB,SAAU,EAAA,EAAU,QAAS,QAGxE,EAAY,QAAQ,GAAG,iBAAkB,SAAA,GAAyC,GAA7B,GAA6B,EAA7B,YAAa,EAAgB,EAAhB,YAChE,GAAY,WAAW,OAAO,EAAc,KAG9C,EAAY,QAAQ,GAAG,OAAQ,SAAA,GAAuE,GAA3D,GAA2D,EAA3D,YAAa,EAA8C,EAA9C,QAAS,EAAqC,EAArC,MAAO,EAA8B,EAA9B,YAAa,EAAiB,EAAjB,cAC7E,EAAe,EAAY,gBAAgB,EAE5C,IAAmB,EAAY,gBAAiB,EAAY,kBAC3D,EAAY,eACd,aAAa,EAAY,WAAW,GAAc,SAGpD,GACE,YAAA,EAAa,QAAA,EAAS,MAAA,EAAO,YAAA,EAC7B,KAAM,YAKZ,EAAY,QAAQ,GAAG,OAAQ,SAAA,GAiB7B,IAAA,GAjByC,GAA0D,EAA1D,YAAa,EAA6C,EAA7C,QAAS,EAAoC,EAApC,MAAO,EAA6B,EAA7B,YAAa,EAAgB,EAAhB,aAE7E,EAAY,EAAQ,MAAO,EAAM,UAAW,GAAS,EAErD,EAAQ,EAAY,WAAW,GAC/B,EAAO,EAAM,QAAQ,GACrB,GACJ,YAAA,EACA,QAAA,EACA,MAAA,EACA,YAAA,EACA,KAAM,OACN,WACA,KAAA,EACA,QAAS,MAGX,EAAsB,EAAtB,EAAA,MAAA,QAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,OAAA,cAA4B,CAAA,GAAA,EAAA,IAAA,EAAA,CAAA,GAAA,GAAA,EAAA,OAAA,KAAA,GAAA,EAAA,SAAA,CAAA,GAAA,EAAA,EAAA,OAAA,EAAA,KAAA,KAAA,GAAA,EAAA,MAAA,GAAjB,GAAiB,CAC1B,GAAU,QAAU,EAEpB,EAAQ,KAAK,kBAAmB,GAGlC,GAAK,EAAU,QAAQ,OAAvB,CAIA,IAAK,GAFD,GAAc,EAAA,EAET,EAAI,EAAG,EAAI,EAAU,QAAQ,OAAQ,IAAK,CACjD,GAAM,GAAS,EAAU,QAAQ,GAC3B,EAAe,EAAO,UAAU,QAAQ,YAE1C,GAAe,IACjB,EAAc,GAIlB,EAAM,SAAW,EACjB,EAAM,QAAU,WAAW,WACzB,GACE,YAAA,EACA,YAAA,EACA,QAAS,EAAQ,MAAO,EAAY,EACpC,MAAO,EACP,KAAM,UAEP,MAGL,EAAY,QAAQ,GAAG,KAAM,SAAA,GAAkD,GAA/C,GAA+C,EAA/C,YAAa,EAAkC,EAAlC,QAAS,EAAyB,EAAzB,MAAO,EAAkB,EAAlB,WACtD,GAAY,iBACf,GAAO,YAAA,EAAa,YAAA,EAAa,QAAA,EAAS,MAAA,EAAO,KAAM,WAI1D,KAAM,UAAU,QAAQ,SAAU,GACjC,EAAY,QAAQ,GAAG,EAAY,SAAA,GAAyC,GAA7B,GAA6B,EAA7B,YAAa,EAAgB,EAAhB,YACtD,GAAY,WAAW,IACzB,aAAa,EAAY,WAAW,GAAc,YAWxD,KAAK,GAAI,GAAI,EAAG,EAAI,EAAc,OAAQ,IACxC,EAAY,QAAQ,GAAG,EAAc,GAPvC,SAA+B,GAC7B,MAAO,UAAA,GAAwD,GAA5C,GAA4C,EAA5C,YAAa,EAA+B,EAA/B,QAAS,EAAsB,EAAtB,KACvC,IAAO,YAAA,EAAa,YADyC,EAAf,YACb,QAAA,EAAS,MAAA,EAAO,KAAA,MAKW,EAAa,IAG7E,GAAY,QAAQ,GAAG,MAAO,SAAU,GACtC,EAAY,QAAa,KACzB,EAAY,QAAa,EACzB,EAAY,gBAGd,EAAS,cAAgB,EAAc,SACvC,EAAO,QAAU,gLC9NjB,SAAS,GAAT,GAAkC,GAAhB,GAAgB,EAAhB,YACU,UAAtB,EAAa,OAEjB,EAAa,OAAS,EAAa,OAAS,GAAK,GAGnD,QAAS,GAAT,GAAuE,GAAnD,GAAmD,EAAnD,YAAa,EAAsC,EAAtC,aAAc,EAAwB,EAAxB,YAAa,EAAW,EAAX,OAC1D,IAA0B,SAAtB,EAAa,MAAoB,EAAQ,OAA7C,CAGA,GAAM,GAAW,EAAQ,GAAG,UAAU,QAAQ,kBAG1C,IAAY,IAGhB,EAAY,mBAAqB,WAAW,WAC1C,EAAc,MACZ,YAAA,EACA,YAAA,EACA,KAAM,OACN,QAAS,EACT,MAAO,KAER,KAGL,QAAS,GAAT,GAAyC,GAAf,GAAe,EAAf,WAGpB,GAAY,qBACd,cAAc,EAAY,oBAC1B,EAAY,mBAAqB,MA1CrC,GAAM,GAAgB,EAAQ,UACxB,EAAgB,EAAQ,iBAE9B,GAAc,QAAQ,GAAG,MAAO,GAChC,EAAc,QAAQ,GAAG,QAAS,EAElC,KAAA,OAAsB,OAAQ,KAAM,SAAU,UAA9C,EAAA,EAAA,EAAA,EAAA,OAAA,IAAyD,CAApD,GAAM,GAAA,EAAA,EACT,GAAY,QAAQ,GAAG,EAAQ,GAwCjC,EAAc,SAAS,mBAAqB,EAC5C,EAAc,MAAM,KAAK,cAEzB,EAAO,SACL,MAAA,EACA,QAAA,EACA,cAAA,sECrDF,IAAM,GAAgB,EAAQ,UACxB,EAAgB,EAAQ,mBACxB,EAAgB,EAAQ,oBACxB,EAAgB,EAAQ,eACxB,EAAgB,EAAQ,qBACxB,EAAgB,EAAQ,YACxB,EAAgB,EAAQ,qBACR,EAAQ,gBAAtB,IAAA,KAER,GAAc,QAAQ,GAAG,kBAAmB,SAAA,GAC1C,QAAS,GAAkB,EAAc,EAAU,GACjD,GAAM,GAAM,EAAQ,2BACd,EAAQ,iBAAiB,OACzB,GAEA,EAAY,EAAa,OACzB,EAAU,EAAU,OAEtB,GAAU,IACP,EAAG,QAAQ,IACX,EAAS,gBAAgB,EAAS,EAAU,IAC5C,EAAa,gBAAgB,EAAS,EAAS,IAEpD,EAAQ,MACN,QAAA,EACA,UAAA,EACA,OAAS,aAAA,KAjB8E,GAAvC,GAAuC,EAAvC,QAAS,EAA8B,EAA9B,QAAS,EAAqB,EAArB,KAAM,EAAe,EAAf,YAsBxE,EAAe,EAAM,cAAc,IAAI,EAE7C,IAAI,EAAc,CAChB,GAAM,GAAY,EAAa,OACzB,EAAU,EAAU,OAEtB,GAAU,IACP,EAAa,gBAAgB,EAAS,EAAS,IACpD,EAAQ,MACN,QAAA,EACA,UAAA,EACA,OAAS,aAAA,KAKf,EAAM,cAAc,gBAAgB,EAAkB,KAGxD,EAAa,QAAQ,GAAG,MAAO,SAAA,GAA4B,GAAhB,GAAgB,EAAhB,YACzC,GAAa,OAAO,QAAU,SAAU,GACtC,MAAO,GAAa,QAAQ,MAIhC,EAAa,QAAQ,GAAG,MAAO,SAAA,GAAqC,GAAzB,GAAyB,EAAzB,aAAc,EAAW,EAAX,OACvD,GAAO,EAAa,OAAO,QAAS,EAAc,UAClD,EAAO,EAAa,OAAO,QAAS,KAGtC,EAAM,EAAa,WAAY,EAAc,OAE7C,EAAa,UAAU,cAAgB,SAAU,GAG/C,MAFA,GAAO,KAAK,OAAO,QAAS,GAErB,KAGT,IAAM,GAAqB,EAAa,UAAU,iBAElD,GAAa,UAAU,kBAAoB,SAAU,EAAY,GAC/D,GAAM,GAAM,EAAmB,KAAK,KAAM,EAAY,EAMtD,OAJI,KAAQ,OACV,KAAK,OAAO,QAAQ,GAAc,GAG7B,GAGT,EAAa,gBAAgB,KAAK,wMCjFlC,IAAM,GAAU,EAAQ,WAClB,EAAU,EAAQ,kBAClB,EAAU,EAAQ,mBAAmB,MAErC,GACJ,QAAA,EACA,OAAA,EACA,MAAA,EAGA,SAAU,EAAQ,sBAAsB,SAExC,aAEA,YAAa,SAAU,EAAK,GAE1B,GAAI,EAAM,SAAS,EAAM,UAAW,GAAQ,OAAO,CAEnD,GAAM,GAAO,EAAM,UAAU,GAE7B,EAAM,UAAU,KAAK,GACrB,EAAO,UAAU,KAAK,GAIlB,IAAQ,EAAM,UAChB,EAAO,IAAI,EAAK,SAAU,EAAM,gBAGlC,EAAQ,KAAK,gBAAkB,IAAA,EAAK,IAAA,KAGtC,eAAgB,SAAU,EAAK,GAC7B,GAAM,GAAQ,EAAM,QAAQ,EAAM,UAAW,EAE7C,GAAM,GAAO,EAAM,UAAU,GAE7B,EAAO,OAAO,EAAK,SAAU,EAAM,gBAEnC,EAAM,UAAU,OAAO,EAAO,GAC9B,EAAO,UAAU,OAAO,EAAO,GAE/B,EAAQ,KAAK,mBAAqB,IAAA,EAAK,IAAA,KAGzC,eAAgB,WACd,EAAM,eAAe,KAAK,SAAU,OAIxC,GAAO,QAAU,yNClDG,EAAQ,SAApB,IAAA,QAEF,aACJ,QAAA,KAAe,EAAA,KAAA,GACb,KAAK,gCAKP,YAAI,EAAM,GACR,IAAK,KAAK,UAAU,GAElB,YADA,KAAK,UAAU,IAAS,GAI1B,MAAK,UAAU,GAAM,KAAK,gBAG5B,aAAK,EAAM,GACT,GAAK,KAAK,UAAU,GAApB,CAEA,GAAM,GAAQ,EAAQ,KAAK,UAAU,GAAO,IAE7B,IAAX,GACF,KAAK,UAAU,GAAM,OAAO,EAAO,iBAIvC,cAAM,EAAM,GACV,GAAM,GAAkB,KAAK,UAAU,EAEvC,IAAK,EAEL,IAAK,GAAI,GAAI,EAAG,EAAI,EAAgB,OAAQ,IAC1C,IAAsC,IAAlC,EAAgB,GAAG,EAAK,GAC1B,YAMR,GAAQ,IAAM,WACZ,MAAO,IAAI,IAGb,EAAO,QAAU,iDC7CjB,SAAS,GAAS,EAAO,GACvB,IAAK,GAAI,GAAI,EAAG,EAAM,EAAM,OAAQ,EAAI,EAAK,IAC3C,GAAI,EAAM,KAAO,EACf,MAAO,EAIX,QAAQ,EAGV,QAAS,GAAU,EAAO,GACxB,OAAmC,IAA5B,EAAQ,EAAO,GAGxB,QAAS,GAAO,EAAQ,GACtB,IAAK,GAAI,GAAI,EAAG,EAAI,EAAO,OAAQ,IACjC,EAAO,KAAK,EAAO,GAGrB,OAAO,GAGT,QAAS,GAAQ,EAAO,GAGtB,IAAK,GAFC,MAEG,EAAI,EAAG,EAAI,EAAM,OAAQ,IAC5B,EAAK,EAAM,KACb,EAAO,KAAK,EAAM,GAItB,OAAO,GAGT,EAAO,SACL,QAAA,EACA,SAAA,EACA,MAAA,EACA,OAAA,+CCtCiB,EAAQ,YAAnB,IAAA,OACF,EAAS,EAAQ,QACjB,EAAa,EAAQ,gBAErB,EAAU,EAAW,QACrB,EAAa,EAAO,UAEpB,GAEJ,iBAAmB,gBAAkB,IAAW,EAAG,SAAS,EAAO,gBAC7C,EAAW,mBAAoB,GAAO,eAG5D,uBAAwB,EAAW,aAEnC,MAAQ,eAAiB,MAAa,oBAAsB,IAG5D,cAAsC,UAAtB,EAAU,SACnB,EAAQ,eACR,EAAU,UAAU,MAAM,UAGjC,OAAS,iBAAiB,KAAK,EAAU,WAC7B,YAAY,KAAK,EAAU,YAEvC,aAAc,aAAa,KAAK,EAAU,WAG1C,wBAAyB,WAAa,GAAQ,UAC1C,UAAW,yBAA2B,GAAQ,UAC9C,wBAAyB,sBAAwB,GAAQ,UACzD,qBAAsB,oBAAsB,GAAQ,UACpD,mBAAoB,oBAExB,4BAA4B,EAE5B,YAAc,EAAW,aACpB,EAAW,eAAiB,EAAO,gBAElC,GAAQ,cACR,KAAQ,gBACR,KAAQ,YACR,IAAQ,WACR,KAAQ,gBACR,OAAQ,oBAGR,GAAQ,YACR,KAAQ,cACR,KAAQ,cACR,IAAQ,aACR,KAAQ,cACR,OAAQ,iBAEV,KAGJ,WAAY,gBAAkB,GAAW,SAAU,aAAc,QAInE,GAAQ,4BAA8B,EAAG,SAAS,EAAQ,UAAU,EAAQ,0BAE5E,EAAO,QAAU,gFC7DjB,SAAS,MAHT,GAAM,MACA,EAAM,EAAQ,YAAY,MAIhC,GAAW,SAAqB,EAAI,SACpC,EAAW,iBAAqB,EAAI,kBAAsB,EAC1D,EAAW,WAAqB,EAAI,YAAsB,EAC1D,EAAW,cAAqB,EAAI,eAAsB,EAC1D,EAAW,mBAAqB,EAAI,oBAAsB,EAC1D,EAAW,QAAqB,EAAI,SAAsB,EAC1D,EAAW,YAAqB,EAAI,aAAsB,EAAW,QAErE,EAAW,MAAe,EAAI,MAC9B,EAAW,MAAe,EAAI,OAAS,EACvC,EAAW,aAAgB,EAAI,cAAgB,EAAI,eAEnD,EAAO,QAAU,oDCjBjB,IAAM,GAAa,EAAQ,YACrB,EAAa,EAAQ,aACrB,EAAa,EAAQ,QACrB,EAAa,EAAQ,gBAErB,GACJ,aAAc,SAAU,EAAQ,GAC9B,KAAO,GAAO,CACZ,GAAI,IAAU,EACZ,OAAO,CAGT,GAAQ,EAAM,WAGhB,OAAO,GAGT,QAAS,SAAU,EAAS,GAC1B,KAAO,EAAG,QAAQ,IAAU,CAC1B,GAAI,EAAS,gBAAgB,EAAS,GAAa,MAAO,EAE1D,GAAU,EAAS,WAAW,GAGhC,MAAO,OAGT,WAAY,SAAU,GACpB,GAAI,GAAS,EAAK,UAElB,IAAI,EAAG,QAAQ,GAAS,CAEtB,MAAQ,EAAS,EAAO,OAAS,EAAG,QAAQ,KAI5C,MAAO,GAGT,MAAO,IAIT,wBAAyB,EAAQ,2BAC7B,SAAU,EAAS,EAAU,GAC7B,EAAQ,GAAS,EAAQ,WAAW,iBAAiB,EAErD,KAAK,GAAI,GAAI,EAAG,EAAM,EAAM,OAAQ,EAAI,EAAK,IAC3C,GAAI,EAAM,KAAO,EACf,OAAO,CAIX,QAAO,GAEP,KAEJ,gBAAiB,SAAU,EAAS,EAAU,GAC5C,MAAI,GAAQ,2BACH,EAAS,wBAAwB,EAAS,EAAU,IAIzD,EAAI,SAAW,EAAI,aACrB,EAAW,EAAS,QAAQ,YAAa,MAGpC,EAAQ,EAAQ,yBAAyB,KAIlD,sBAAuB,SAAU,GAC/B,GAAI,MACA,KACA,MAAA,GACA,EAAc,EAAS,GACvB,EAAQ,EAAa,GAAI,EACzB,MAAA,GACA,MAAA,GACA,MAAA,GACA,MAAA,EAEJ,KAAK,EAAI,EAAG,EAAI,EAAS,OAAQ,IAI/B,IAHA,EAAW,EAAS,KAGH,IAAa,EAI9B,GAAK,GAQL,GAAI,EAAS,aAAe,EAAS,cAIhC,GAAI,EAAY,aAAe,EAAS,cAAxC,CAML,IAAK,EAAmB,OAEtB,IADA,EAAS,EACF,EAAO,YAAc,EAAO,aAAe,EAAO,eACvD,EAAmB,QAAQ,GAC3B,EAAS,EAAO,UAMpB,IAAI,YAAuB,GAAW,aAC/B,YAAoB,GAAW,cAC7B,YAAoB,GAAW,eAAgB,CAEtD,GAAI,IAAa,EAAY,WAC3B,QAGF,GAAS,EAAS,oBAGlB,GAAS,CAKX,KAFA,KAEO,EAAO,aAAe,EAAO,eAClC,EAAgB,QAAQ,GACxB,EAAS,EAAO,UAMlB,KAHA,EAAI,EAGG,EAAgB,IAAM,EAAgB,KAAO,EAAmB,IACrE,GAGF,IAAM,IACJ,EAAgB,EAAI,GACpB,EAAgB,GAChB,EAAmB,GAKrB,KAFA,EAAQ,EAAQ,GAAG,UAEZ,GAAO,CACZ,GAAI,IAAU,EAAQ,GAAI,CACxB,EAAc,EACd,EAAQ,EACR,IAEA,OAEG,GAAI,IAAU,EAAQ,GACzB,KAGF,GAAQ,EAAM,qBA/Dd,GAAc,EACd,EAAQ,MAbR,GAAc,EACd,EAAQ,CA8EZ,OAAO,IAGT,YAAa,SAAU,EAAS,EAAU,GACxC,KAAO,EAAG,QAAQ,IAAU,CAC1B,GAAI,EAAS,gBAAgB,EAAS,GACpC,OAAO,CAKT,KAFA,EAAU,EAAS,WAAW,MAEd,EACd,MAAO,GAAS,gBAAgB,EAAS,GAI7C,OAAO,GAGT,iBAAkB,SAAU,GAC1B,MAAQ,aAAmB,GAAW,mBAClC,EAAQ,wBACR,GAGN,YAAa,SAAU,GAErB,MADA,GAAiB,GAAkB,EAAI,QAErC,EAAG,EAAe,SAAW,EAAe,SAAS,gBAAgB,WACrE,EAAG,EAAe,SAAW,EAAe,SAAS,gBAAgB,YAIzE,qBAAsB,SAAU,GAC9B,GAAM,GAAc,YAAmB,GAAW,WAC9C,EAAQ,wBACR,EAAQ,iBAAiB,EAE7B,OAAO,KACL,KAAQ,EAAW,KACnB,MAAQ,EAAW,MACnB,IAAQ,EAAW,IACnB,OAAQ,EAAW,OACnB,MAAQ,EAAW,OAAU,EAAW,MAAS,EAAW,KAC5D,OAAQ,EAAW,QAAU,EAAW,OAAS,EAAW,MAIhE,eAAgB,SAAU,GACxB,GAAM,GAAa,EAAS,qBAAqB,EAEjD,KAAK,EAAQ,QAAU,EAAY,CACjC,GAAM,GAAS,EAAS,YAAY,EAAI,UAAU,GAElD,GAAW,MAAU,EAAO,EAC5B,EAAW,OAAU,EAAO,EAC5B,EAAW,KAAU,EAAO,EAC5B,EAAW,QAAU,EAAO,EAG9B,MAAO,IAGT,QAAS,SAAU,GAGjB,IAFA,GAAM,MAEC,GACL,EAAK,KAAK,GACV,EAAU,EAAS,WAAW,EAGhC,OAAO,IAGT,YAAa,SAAA,GACX,QAAK,EAAG,OAAO,KAGf,EAAW,SAAS,cAAc,IAC3B,IAIX,GAAO,QAAU,+FCzNjB,SAAS,GAAK,EAAS,EAAM,EAAU,GACrC,GAAM,GAAU,EAAW,GACvB,EAAe,EAAQ,EAAU,GACjC,EAAS,EAAQ,EAyBrB,IAvBK,IACH,GACE,UACA,UAAW,GAGb,EAAe,EAAS,KAAK,GAAW,EACxC,EAAQ,KAAK,GAEb,EAAkB,KAAK,GAEnB,YACA,WACA,aAEA,OAGD,EAAO,OAAO,KACjB,EAAO,OAAO,MACd,EAAO,cAGJ,EAAS,EAAO,OAAO,GAAO,GAAW,CAC5C,GAAI,OAAA,EAEJ,IAAI,EAAgB,CAAA,GAAA,GACsB,EAAkB,GAAlD,EADU,EACV,SAAU,EADA,EACA,QAAS,EADT,EACS,SACrB,EAAgB,EAAQ,EAAU,GAElC,EAAkB,EAAQ,IAAkB,SAAU,GACrD,EAAM,8BACT,EAAM,OAAS,EAAM,WACrB,EAAM,cAAgB,EAEtB,EAAM,eAA2B,EAAM,gBAA4B,EACnE,EAAM,gBAA2B,EAAM,iBAA4B,EACnE,EAAM,yBAA2B,EAAM,0BAA4B,EAE/D,cAAc,KAAK,EAAM,QAC3B,EAAM,MAAQ,EAAM,QAAU,EAAU,GAAS,SAAS,gBAAgB,WAC1E,EAAM,MAAQ,EAAM,QAAU,EAAU,GAAS,SAAS,gBAAgB,WAG5E,EAAS,IAIb,GAAM,EAAQ,GAAU,EAAK,EAAM,IAAmB,EAAQ,UAEvC,IAAnB,GACF,EAAS,KAAK,GACd,EAAQ,KAAK,GACb,EAAS,KAAK,IAGd,EAAS,SAIX,GAAM,EAAQ,GAAU,EAAM,EAAU,EAAiB,IAAY,EAAQ,QAI/E,OAFA,GAAO,OAAO,GAAM,KAAK,GAElB,GAIX,QAAS,GAAQ,EAAS,EAAM,EAAU,GACxC,GAAM,GAAU,EAAW,GACrB,EAAe,EAAQ,EAAU,GACjC,EAAS,EAAQ,EAEvB,IAAK,GAAW,EAAO,OAAvB,CAIA,GAAI,GAAkB,EAClB,MAAA,GACA,MAAA,EAQJ,IANI,IACF,EAAY,EAAkB,GAC9B,EAAgB,EAAQ,EAAU,SAAU,GAC5C,EAAkB,EAAU,QAAQ,IAGzB,QAAT,EAAJ,CASA,GAAI,EAAO,OAAO,GAAO,CACvB,GAAM,GAAM,EAAO,OAAO,GAAM,MAEhC,IAAiB,QAAb,EAAoB,CACtB,IAAK,GAAI,GAAI,EAAG,EAAI,EAAK,IACvB,EAAO,EAAS,EAAM,EAAO,OAAO,GAAM,GAAI,EAEhD,QAGA,IAAK,GAAI,GAAI,EAAG,EAAI,EAAK,IACvB,GAAI,EAAO,OAAO,GAAM,KAAO,EAAU,CACvC,EAAQ,GAAa,EAAK,EAAM,EAAiB,EAAiB,IAAY,EAAQ,SACtF,EAAO,OAAO,GAAM,OAAO,EAAG,GAE1B,GAAkB,GAEsB,MAD1C,EAAU,SAAS,KAEjB,EAAU,SAAS,OAAO,EAAe,GACzC,EAAU,QAAQ,OAAO,EAAe,GACxC,EAAU,SAAS,OAAO,EAAe,GAI7C,OAKF,EAAO,OAAO,IAAwC,IAA/B,EAAO,OAAO,GAAM,SAC7C,EAAO,OAAO,GAAQ,KACtB,EAAO,aAIN,EAAO,YACV,EAAQ,OAAO,EAAc,GAC7B,EAAS,OAAO,EAAc,GAC9B,EAAkB,OAAO,EAAc,QA9CvC,KAAK,IAAQ,GAAO,OACd,EAAO,OAAO,eAAe,IAC/B,EAAO,EAAS,EAAM,QAgD9B,QAAS,GAAa,EAAU,EAAS,EAAM,EAAU,GACvD,GAAM,GAAU,EAAW,EAC3B,KAAK,EAAgB,GAAO,CAC1B,EAAgB,IACd,aACA,YACA,aAIF,KAAK,GAAI,GAAI,EAAG,EAAI,EAAU,OAAQ,IACpC,EAAI,EAAU,GAAI,EAAM,GACxB,EAAI,EAAU,GAAI,EAAM,GAAoB,GAIhD,GAAM,GAAY,EAAgB,GAC9B,MAAA,EAEJ,KAAK,EAAQ,EAAU,UAAU,OAAS,EAAG,GAAS,IAChD,EAAU,UAAU,KAAW,GAC5B,EAAU,SAAS,KAAW,GAFkB,MAO1C,IAAX,IACF,EAAQ,EAAU,UAAU,OAE5B,EAAU,UAAU,KAAK,GACzB,EAAU,SAAU,KAAK,GACzB,EAAU,UAAU,UAItB,EAAU,UAAU,GAAO,MAAM,IAAY,EAAQ,QAAS,EAAQ,UAGxE,QAAS,GAAgB,EAAU,EAAS,EAAM,EAAU,GAC1D,GAAM,GAAU,EAAW,GACrB,EAAY,EAAgB,GAC9B,GAAa,EACb,MAAA,EAEJ,IAAK,EAGL,IAAK,EAAQ,EAAU,UAAU,OAAS,EAAG,GAAS,EAAG,IAEvD,GAAI,EAAU,UAAU,KAAW,GAC5B,EAAU,SAAS,KAAW,EAAS,CAK5C,IAAK,GAHC,GAAY,EAAU,UAAU,GAG7B,EAAI,EAAU,OAAS,EAAG,GAAK,EAAG,IAAK,CAAA,GAAA,GACf,EAAU,GAAlC,EADuC,EAAA,GACnC,EADmC,EAAA,GAC1B,EAD0B,EAAA,EAI9C,IAAI,IAAO,GAAY,MAAc,EAAQ,SAAW,IAAY,EAAQ,QAAS,CAEnF,EAAU,OAAO,EAAG,GAIf,EAAU,SACb,EAAU,UAAU,OAAO,EAAO,GAClC,EAAU,SAAU,OAAO,EAAO,GAClC,EAAU,UAAU,OAAO,EAAO,GAGlC,EAAO,EAAS,EAAM,GACtB,EAAO,EAAS,EAAM,GAAoB,GAGrC,EAAU,UAAU,SACvB,EAAgB,GAAQ,OAK5B,GAAa,CACb,QAIJ,GAAI,EAAc,OAOxB,QAAS,GAAkB,EAAO,GAChC,GAAM,GAAU,EAAW,GACrB,KACA,EAAY,EAAgB,EAAM,MAClC,EAAe,EAAS,iBAAiB,EAAM,KACjD,EAAM,KAAK,GACX,EAAM,QACN,EAAU,CASd,KANA,EAAQ,EAAW,GAEnB,EAAU,cAAgB,EAC1B,EAAU,eAAiB,EAGpB,EAAG,QAAQ,IAAU,CAC1B,IAAK,GAAI,GAAI,EAAG,EAAI,EAAU,UAAU,OAAQ,IAAK,CACnD,GAAM,GAAW,EAAU,UAAU,GAC/B,EAAU,EAAU,SAAS,EAEnC,IAAI,EAAS,gBAAgB,EAAS,IAC/B,EAAS,aAAa,EAAS,IAC/B,EAAS,aAAa,EAAS,GAAU,CAE9C,GAAM,GAAY,EAAU,UAAU,EAEtC,GAAU,cAAgB,CAE1B,KAAK,GAAI,GAAI,EAAG,EAAI,EAAU,OAAQ,IAAK,CAAA,GAAA,GACV,EAAU,GAAlC,EADkC,EAAA,GAC9B,EAD8B,EAAA,GACrB,EADqB,EAAA,EAGrC,OAAc,EAAQ,SAAW,IAAY,EAAQ,SACvD,EAAG,KAMX,EAAU,EAAS,WAAW,IAIlC,QAAS,GAAoB,GAC3B,MAAO,GAAiB,KAAK,KAAM,GAAO,GAG5C,QAAS,KACP,KAAK,aAAc,EAGrB,QAAS,KACP,KAAK,cAAc,iBAGrB,QAAS,KACP,KAAK,cAAe,EAGtB,QAAS,KACP,KAAK,cAAe,EACpB,KAAK,6BAA8B,EAGrC,QAAS,GAAY,GACnB,MAAO,GAAG,OAAO,GAAQ,GAAU,QAAS,GAlV9C,GAAM,GAAO,EAAQ,QACf,EAAW,EAAQ,cACnB,EAAW,EAAQ,qBAEM,EAAQ,YAA/B,IAAA,OAAQ,IAAA,YACc,EAAQ,SAA9B,IAAA,QAAS,IAAA,SAEX,EAAkB,eAAiB,MAAa,oBAAsB,IACtE,EAAiB,EAAiB,cAAe,mBACjD,EAAiB,EAAiB,cAAe,sBACjD,EAAiB,EAAgB,KAAM,GAEvC,KACA,KACA,KASA,KAEA,KAEA,GAAmB,GAAmB,WAC1C,GAAI,IAAY,CAMhB,OAJA,GAAO,SAAS,cAAc,OAAO,iBAAiB,OAAQ,MAC5D,cAAiB,GAAY,KAGxB,IAmTT,GAAO,SACL,IAAA,EACA,OAAA,EAEA,YAAA,EACA,eAAA,EAEA,iBAAA,EACA,mBAAA,EACA,gBAAA,EACA,UAAA,EAEA,eAAA,EACA,gBAAA,EAEA,UAAW,EACX,SAAU,EACV,mBAAoB,+GCtWtB,GAAO,QAAU,SAAiB,EAAM,GACtC,IAAK,GAAM,KAAQ,GACjB,EAAK,GAAQ,EAAO,EAEtB,OAAO,gDCDL,EAAQ,UAFV,IAAA,gBACA,IAAA,QAGF,GAAO,QAAU,SAAU,EAAQ,EAAS,GAC1C,GAAM,GAAgB,EAAO,QAAQ,GAC/B,EAAe,GAAiB,EAAc,OAC9C,EAAS,GAAgB,EAAO,QAAQ,OAExC,EAAa,EAAgB,EAAQ,EAAQ,GAAU,GAAU,GAEvE,OAAO,GAAS,KAAiB,EAAG,EAAG,EAAG,oDCZ5C,GAAO,QAAU,SAAC,EAAG,GAAJ,MAAW,MAAK,KAAK,EAAI,EAAI,EAAI,yCCAlD,IAAM,GAAS,EAAQ,YACjB,EAAS,EAAQ,YAEjB,GACJ,SAAU,SAAU,EAAQ,GAC1B,GAAI,IAAS,CAEb,OAAO,YAML,MALK,KACH,EAAI,OAAO,QAAQ,KAAK,GACxB,GAAS,GAGJ,EAAO,MAAM,KAAM,aAK9B,iBAAkB,SAAU,EAAG,EAAI,EAAI,GACrC,GAAM,GAAK,EAAI,CACf,OAAO,GAAK,EAAK,EAAK,EAAI,EAAK,EAAI,EAAK,EAAI,EAAI,GAGlD,uBAAwB,SAAU,EAAQ,EAAQ,EAAK,EAAK,EAAM,EAAM,GACtE,OACE,EAAI,EAAM,iBAAiB,EAAU,EAAQ,EAAK,GAClD,EAAI,EAAM,iBAAiB,EAAU,EAAQ,EAAK,KAKtD,YAAa,SAAU,EAAG,EAAG,EAAG,GAE9B,MADA,IAAK,GACG,EAAI,GAAG,EAAE,GAAK,GAGxB,WAAY,SAAU,EAAM,GAK1B,MAJA,GAAK,KAAQ,EAAI,KACjB,EAAK,KAAQ,EAAI,KACjB,EAAK,MAAQ,EAAI,MAEV,GAGT,GAAa,EAAQ,QACrB,OAAa,EACb,MAAa,EAAQ,WACrB,YAAa,EAAQ,iBAGvB,GAAO,EAAO,EAAQ,UACtB,EAAO,EAAO,EAAQ,eACtB,EAAO,EAAO,EAAQ,mBACtB,EAAO,EAAO,EAAQ,WAEtB,EAAO,QAAU,uKCvDjB,IAAM,GAAU,EAAQ,YAClB,EAAU,EAAQ,WAElB,GACJ,aAAe,mBAAoB,aAAc,aAAc,QAE/D,OAAQ,SAAU,EAAS,EAAW,GAKpC,IAAA,GAJM,GAAc,EAAM,eAAe,GACnC,EAAY,EAAM,aAAa,GAC/B,GAAY,QAAA,EAAS,UAAA,EAAW,YAAA,EAAa,UAAA,EAAW,YAAA,GAE9D,EAAqB,EAAO,YAA5B,EAAA,MAAA,QAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,OAAA,cAAyC,CAAA,GAAA,EAAA,IAAA,EAAA,CAAA,GAAA,GAAA,EAAA,OAAA,KAAA,GAAA,EAAA,SAAA,CAAA,GAAA,EAAA,EAAA,OAAA,EAAA,KAAA,KAAA,GAAA,EAAA,MAAA,GAA9B,GAA8B,EACjC,EAAc,EAAO,GAAQ,EAEnC,IAAI,EACF,MAAO,KAMb,iBAAkB,SAAA,GAAmD,GAAvC,GAAuC,EAAvC,YAAa,EAA0B,EAA1B,UAAW,EAAe,EAAf,WACpD,KAAK,cAAc,KAAK,GACtB,MAAO,KAGT,KAAA,GAAA,GAA0B,EAAM,aAAhC,EAAA,MAAA,QAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,OAAA,cAA8C,CAAA,GAAA,EAAA,IAAA,EAAA,CAAA,GAAA,GAAA,EAAA,OAAA,KAAA,GAAA,EAAA,SAAA,CAAA,GAAA,EAAA,EAAA,OAAA,EAAA,KAAA,KAAA,GAAA,EAAA,MAAA,GAAnC,GAAmC,EACxC,EAAU,CAEd,IAAI,EAAY,YAAc,EAAY,WAAW,aAC7C,EAAY,cAAgB,EAClC,KAAO,GAAS,CAEd,GAAI,IAAY,EAAY,QAC1B,MAAO,EAET,GAAU,EAAM,WAAW,IAKjC,MAAO,OAIT,WAAY,SAAA,GAAiD,GAArC,GAAqC,EAArC,UAAW,EAA0B,EAA1B,YAAa,EAAa,EAAb,SAC9C,IAAoB,UAAhB,GAA2C,QAAhB,EAC7B,MAAO,KAKT,KAAA,GAFI,OAAA,GAEJ,EAA0B,EAAM,aAAhC,EAAA,MAAA,QAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,OAAA,cAA8C,CAAA,GAAA,EAAA,IAAA,EAAA,CAAA,GAAA,GAAA,EAAA,OAAA,KAAA,GAAA,EAAA,SAAA,CAAA,GAAA,EAAA,EAAA,OAAA,EAAA,KAAA,KAAA,GAAA,EAAA,MAAA,GAAnC,GAAmC,CAC5C,IAAI,EAAY,cAAgB,EAAa,CAE3C,GAAI,EAAY,aAAe,EAAM,SAAS,EAAY,WAAY,GAAc,QAGpF,IAAI,EAAY,cACd,MAAO,EAGC,KACR,EAAiB,IAOvB,GAAI,EACF,MAAO,EAMT,KAAA,GAAA,GAA0B,EAAM,aAAhC,EAAA,MAAA,QAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,OAAA,cAA8C,CAAA,GAAA,EAAA,IAAA,EAAA,CAAA,GAAA,GAAA,EAAA,OAAA,KAAA,GAAA,EAAA,SAAA,CAAA,GAAA,EAAA,EAAA,OAAA,EAAA,KAAA,KAAA,GAAA,EAAA,MAAA,GAAnC,GAAmC,CAC5C,MAAI,EAAY,cAAgB,GAAiB,QAAQ,KAAK,IAAc,EAAY,YACtF,MAAO,GAIX,MAAO,OAIT,WAAY,SAAA,GACV,IAAA,GADsB,GAAa,EAAb,UACtB,EAA0B,EAAM,aAAhC,EAAA,MAAA,QAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,OAAA,cAA8C,CAAA,GAAA,EAAA,IAAA,EAAA,CAAA,GAAA,GAAA,EAAA,OAAA,KAAA,GAAA,EAAA,SAAA,CAAA,GAAA,EAAA,EAAA,OAAA,EAAA,KAAA,KAAA,GAAA,EAAA,MAAA,GAAnC,GAAmC,CAC5C,IAAI,EAAM,SAAS,EAAY,WAAY,GACzC,MAAO,KAMb,KAAM,SAAA,GACJ,IAAA,GADgB,GAAe,EAAf,YAChB,EAA0B,EAAM,aAAhC,EAAA,MAAA,QAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,OAAA,cAA8C,CAAA,GAAA,EAAA,IAAA,EAAA,CAAA,GAAA,GAAA,EAAA,OAAA,KAAA,GAAA,EAAA,SAAA,CAAA,GAAA,EAAA,EAAA,OAAA,EAAA,KAAA,KAAA,GAAA,EAAA,MAAA,GAAnC,GAAmC,CAE5C,IAAsC,IAAlC,EAAY,WAAW,OAAc,CACvC,GAAM,GAAS,EAAY,MAG3B,IAAI,IAAW,EAAO,QAAQ,QAAQ,QACpC,aAIC,IAAI,EAAY,WAAW,QAAU,EACxC,QAGF,KAAK,EAAY,eAAkB,IAAgB,EAAY,YAC7D,MAAO,GAIX,MAAO,OAIX,GAAO,QAAU,kRCzHX,EAAa,EAAQ,YACrB,EAAa,EAAQ,cAErB,GACJ,MAAU,aAEV,OAAU,SAAA,GAAA,MAAS,KAAU,EAAI,QAAU,EAAS,IAEpD,QAAU,SAAA,GAAA,MAAS,GAAG,OAAO,IAA6B,KAAnB,EAAM,UAE7C,OAAU,SAAA,GAAA,QAAW,GAA2B,gBAAjB,KAAO,EAAP,YAAA,EAAO,KAEtC,SAAU,SAAA,GAAA,MAA0B,kBAAV,IAE1B,OAAU,SAAA,GAAA,MAA0B,gBAAV,IAE1B,KAAU,SAAA,GAAA,MAA0B,iBAAV,IAE1B,OAAU,SAAA,GAAA,MAA0B,gBAAV,IAE1B,QAAS,SAAA,GACP,IAAK,GAA2B,gBAAjB,KAAO,EAAP,YAAA,EAAO,IAAuB,OAAO,CAEpD,IAAM,GAAU,EAAI,UAAU,IAAU,EAAI,MAE5C,OAAQ,kBAAkB,KAAlB,EAA8B,EAAQ,UAC1C,YAAiB,GAAQ,QACN,IAAnB,EAAM,UAA4C,gBAAnB,GAAM,UAI7C,GAAG,MAAQ,SAAA,GAAA,MAAU,GAAG,OAAO,QACD,KAAjB,EAAM,QACd,EAAG,SAAS,EAAM,SAEvB,EAAO,QAAU,oECnCjB,GAAO,QAAU,SAAC,GAAD,SAAc,IAAS,EAAM,SAAY,YAAiB,GAAM,6CCAjF,SAAS,GAAe,EAAM,GAC5B,IAAK,GAAM,KAAQ,GAAQ,CACzB,GAAM,GAAkB,EAAO,QAAQ,gBACnC,GAAa,CAGjB,KAAK,GAAM,KAAU,GACnB,GAA6B,IAAzB,EAAK,QAAQ,IAAiB,EAAgB,GAAQ,KAAK,GAAO,CACpE,GAAa,CACb,OAIC,GAAsC,kBAAjB,GAAO,KAC/B,EAAK,GAAQ,EAAO,IAGxB,MAAO,GAGT,EAAc,iBACZ,OAAQ,kDAGV,EAAO,QAAU,uCCxBjB,IAAM,GAAgB,EAAQ,WACxB,EAAgB,EAAQ,aACxB,EAAgB,EAAQ,gBACxB,EAAgB,EAAQ,cACxB,EAAgB,EAAQ,gBACxB,EAAgB,EAAQ,QACxB,EAAgB,EAAQ,mBAExB,GACJ,WAAY,SAAU,EAAM,GAC1B,EAAK,KAAO,EAAK,SACjB,EAAK,KAAK,EAAI,EAAI,KAAK,EACvB,EAAK,KAAK,EAAI,EAAI,KAAK,EAEvB,EAAK,OAAS,EAAK,WACnB,EAAK,OAAO,EAAI,EAAI,OAAO,EAC3B,EAAK,OAAO,EAAI,EAAI,OAAO,EAE3B,EAAK,UAAY,EAAI,WAGvB,eAAgB,SAAU,EAAW,EAAM,GACzC,EAAU,KAAK,EAAO,EAAI,KAAK,EAAO,EAAK,KAAK,EAChD,EAAU,KAAK,EAAO,EAAI,KAAK,EAAO,EAAK,KAAK,EAChD,EAAU,OAAO,EAAK,EAAI,OAAO,EAAK,EAAK,OAAO,EAClD,EAAU,OAAO,EAAK,EAAI,OAAO,EAAK,EAAK,OAAO,EAClD,EAAU,UAAY,EAAI,UAAY,EAAK,SAG3C,IAAM,GAAK,KAAK,IAAI,EAAU,UAAY,IAAM,KAEhD,GAAU,KAAK,MAAU,EAAM,EAAU,KAAK,EAAG,EAAU,KAAK,GAAK,EACrE,EAAU,KAAK,GAAU,EAAU,KAAK,EAAI,EAC5C,EAAU,KAAK,GAAU,EAAU,KAAK,EAAI,EAE5C,EAAU,OAAO,MAAQ,EAAM,EAAU,OAAO,EAAG,EAAU,KAAK,GAAK,EACvE,EAAU,OAAO,GAAQ,EAAU,OAAO,EAAI,EAC9C,EAAU,OAAO,GAAQ,EAAU,OAAO,EAAI,GAGhD,gBAAiB,SAAW,GAC1B,MAAQ,aAAmB,GAAI,OAAS,YAAmB,GAAI,OAIjE,MAAO,SAAU,EAAM,EAAS,GAO9B,MANA,GAAK,MACL,EAAO,GAAQ,OAEf,EAAG,EAAI,EAAQ,EAAO,KACtB,EAAG,EAAI,EAAQ,EAAO,KAEf,GAGT,UAAW,SAAU,EAAS,GAc5B,MAbA,GAAO,MAGH,EAAQ,eAAiB,EAAa,gBAAgB,IACxD,EAAa,MAAM,SAAU,EAAS,GAEtC,EAAK,GAAK,OAAO,QACjB,EAAK,GAAK,OAAO,SAGjB,EAAa,MAAM,OAAQ,EAAS,GAG/B,GAGT,YAAa,SAAU,EAAS,GAW9B,MAVA,GAAS,MAEL,EAAQ,eAAiB,EAAa,gBAAgB,GAExD,EAAa,MAAM,SAAU,EAAS,GAGtC,EAAa,MAAM,SAAU,EAAS,GAGjC,GAGT,aAAc,SAAU,GACtB,MAAO,GAAG,OAAO,EAAQ,WAAY,EAAQ,UAAY,EAAQ,YAGnE,UAAW,SAAU,EAAW,EAAU,GACxC,GAAM,GAAW,EAAS,OAAS,EAChB,EAAa,eAAe,GAC5B,EAAS,GAEtB,IAEN,GAAa,UAAU,EAAS,GAChC,EAAU,KAAK,EAAI,EAAM,EACzB,EAAU,KAAK,EAAI,EAAM,EAEzB,EAAa,YAAY,EAAS,GAClC,EAAU,OAAO,EAAI,EAAM,EAC3B,EAAU,OAAO,EAAI,EAAM,EAE3B,EAAU,UAAY,EAAG,OAAO,GAAa,GAAW,GAAI,OAAO,WAGrE,cAAe,EAEf,aAAc,SAAU,GACtB,GAAM,KAyBN,OAtBI,GAAG,MAAM,IACX,EAAQ,GAAK,EAAM,GACnB,EAAQ,GAAK,EAAM,IAIA,aAAf,EAAM,KACqB,IAAzB,EAAM,QAAQ,QAChB,EAAQ,GAAK,EAAM,QAAQ,GAC3B,EAAQ,GAAK,EAAM,eAAe,IAEF,IAAzB,EAAM,QAAQ,SACrB,EAAQ,GAAK,EAAM,eAAe,GAClC,EAAQ,GAAK,EAAM,eAAe,KAIpC,EAAQ,GAAK,EAAM,QAAQ,GAC3B,EAAQ,GAAK,EAAM,QAAQ,IAIxB,GAGT,eAAgB,SAAU,GAUxB,IAAA,GATM,IACJ,MAAS,EACT,MAAS,EACT,QAAS,EACT,QAAS,EACT,QAAS,EACT,QAAS,GAGX,EAAsB,EAAtB,EAAA,MAAA,QAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,OAAA,cAAgC,CAAA,GAAA,EAAA,IAAA,EAAA,CAAA,GAAA,GAAA,EAAA,OAAA,KAAA,GAAA,EAAA,SAAA,CAAA,GAAA,EAAA,EAAA,OAAA,EAAA,KAAA,KAAA,GAAA,EAAA,MAAA,GAArB,GAAqB,CAC9B,KAAK,GAAM,KAAQ,GACjB,EAAQ,IAAS,EAAQ,GAG7B,IAAK,GAAM,KAAQ,GACjB,EAAQ,IAAS,EAAS,MAG5B,OAAO,IAGT,UAAW,SAAU,GACnB,GAAK,EAAM,QAAY,EAAM,SAAW,EAAM,QAAQ,OAAS,EAA/D,CAIA,GAAM,GAAU,EAAa,aAAa,GACpC,EAAO,KAAK,IAAI,EAAQ,GAAG,MAAO,EAAQ,GAAG,OAC7C,EAAO,KAAK,IAAI,EAAQ,GAAG,MAAO,EAAQ,GAAG,MAInD,QACE,EAAG,EACH,EAAG,EACH,KAAM,EACN,IAAK,EACL,MARW,KAAK,IAAI,EAAQ,GAAG,MAAO,EAAQ,GAAG,OAQnC,EACd,OARW,KAAK,IAAI,EAAQ,GAAG,MAAO,EAAQ,GAAG,OAQlC,KAInB,cAAe,SAAU,EAAO,GAC9B,GAAM,GAAU,EAAc,IACxB,EAAU,EAAc,IACxB,EAAU,EAAa,aAAa,GAGpC,EAAK,EAAQ,GAAG,GAAW,EAAQ,GAAG,GACtC,EAAK,EAAQ,GAAG,GAAW,EAAQ,GAAG,EAE5C,OAAO,GAAM,EAAI,IAGnB,WAAY,SAAU,EAAO,EAAW,GACtC,GAAM,GAAU,EAAc,IACxB,EAAU,EAAc,IACxB,EAAU,EAAa,aAAa,GACpC,EAAK,EAAQ,GAAG,GAAW,EAAQ,GAAG,GACtC,EAAK,EAAQ,GAAG,GAAW,EAAQ,GAAG,EAG5C,OAFc,KAAM,KAAK,MAAM,EAAK,GAAM,KAAK,IAKjD,eAAgB,SAAU,GACxB,MAAO,GAAG,OAAO,EAAQ,aACrB,EAAQ,YACR,EAAG,OAAO,EAAQ,kBACf,OAAW,GAAU,QAAS,MAAO,SAAS,EAAQ,aAGrD,QAAQ,KAAK,EAAQ,OAAS,YAAmB,GAAW,MAC1D,QACA,SAIZ,gBAAiB,SAAU,GACzB,OACE,EAAS,iBAAiB,EAAM,KAAO,EAAM,KAAK,GAAK,EAAM,QAC7D,EAAS,iBAAiB,EAAM,iBAKtC,GAAO,QAAU,mIC3NjB,KAAK,MAPc,EAAQ,YAAnB,IAAA,OAEF,GAAW,KAAM,MAAO,SAAU,KACpC,EAAW,EACX,MAAA,GACA,MAAA,GAEK,EAAI,EAAG,EAAI,EAAQ,SAAW,EAAO,sBAAuB,IACnE,EAAU,EAAO,EAAQ,GAAK,yBAC9B,EAAS,EAAO,EAAQ,GAAI,yBAA2B,EAAO,EAAQ,GAAK,8BAGxE,KACH,EAAU,SAAU,GAClB,GAAM,IAAW,GAAI,OAAO,UACtB,EAAa,KAAK,IAAI,EAAG,IAAM,EAAW,IAC1C,EAAK,WAAW,WAAc,EAAS,EAAW,IAClC,EAGtB,OADA,GAAW,EAAW,EACf,IAIN,IACH,EAAS,SAAU,GACjB,aAAa,KAIjB,EAAO,SACL,QAAA,EACA,OAAA,qDChCF,IAAM,GAAS,EAAQ,YACjB,EAAK,EAAQ,UAKf,EAAQ,cAHV,IAAA,QACA,IAAA,WACA,IAAA,eAGI,GACJ,sBAAuB,SAAU,EAAO,EAAc,GACpD,MAAK,GAAG,OAAO,GAKb,EADY,WAAV,EACM,EAAW,GAEF,SAAV,EACC,EAAa,QAAQ,GAGrB,EAAQ,EAAS,GAVlB,MAgBX,gBAAiB,SAAU,EAAO,EAAc,EAAS,GAWvD,MAVA,GAAQ,EAAU,sBAAsB,EAAO,EAAc,IAAY,EAErE,EAAG,SAAS,KACd,EAAQ,EAAM,MAAM,KAAM,IAGxB,EAAG,QAAQ,KACb,EAAQ,EAAe,IAGlB,GAGT,SAAU,SAAU,GAClB,MAAQ,KACN,EAAG,KAAO,GAAO,EAAK,EAAI,EAAK,KAC/B,EAAG,KAAO,GAAO,EAAK,EAAI,EAAK,MAInC,WAAY,SAAU,GAUpB,OATI,GAAU,QAAU,IAAQ,OAAS,KACvC,EAAO,KAAW,GAElB,EAAK,KAAS,EAAK,GAAK,EACxB,EAAK,IAAS,EAAK,GAAK,EACxB,EAAK,MAAS,EAAK,OAAY,EAAK,KAAO,EAAK,MAChD,EAAK,OAAS,EAAK,QAAY,EAAK,IAAM,EAAK,QAG1C,GAGT,WAAY,SAAU,GAUpB,OATI,GAAU,KAAO,IAAQ,KAAO,KAClC,EAAO,KAAW,GAElB,EAAK,EAAS,EAAK,MAAQ,EAC3B,EAAK,IAAS,EAAK,KAAQ,EAC3B,EAAK,MAAS,EAAK,OAAW,EAAK,MAAS,EAAK,EACjD,EAAK,OAAS,EAAK,QAAW,EAAK,OAAS,EAAK,GAG5C,GAIX,GAAO,QAAU,8ECxEjB,SAAS,GAAM,GAGb,EAAI,WAAa,CAGjB,IAAM,GAAK,EAAO,SAAS,eAAe,GAGtC,GAAG,gBAAkB,EAAO,UACF,kBAAhB,GAAO,MAChB,EAAO,KAAK,KAAQ,IAEvB,EAAS,EAAO,KAAK,IAGvB,EAAI,OAAS,EAnBf,GAAM,GAAM,EAAO,QACb,EAAW,EAAQ,aAqBH,oBAAX,SACT,EAAI,WAAa,GACjB,EAAI,eAAa,IAGjB,EAAK,QAGP,EAAI,UAAY,SAAoB,GAClC,GAAI,EAAS,GACX,MAAO,EAGT,IAAM,GAAY,EAAK,eAAiB,CAExC,OAAO,GAAS,aAAe,EAAS,cAAgB,EAAI,QAG9D,EAAI,KAAO","file":"interact.min.js","sourceRoot":"","sourcesContent":["/* interact.js v1.3.0-alpha.4+sha.7970416-dirty | https://raw.github.com/taye/interact.js/master/LICENSE */\n","/**\n * interact.js v1.3.0-alpha.4+sha.7970416-dirty\n *\n * Copyright (c) 2012-2017 Taye Adeyemi \n * Open source under the MIT License.\n * https://raw.github.com/taye/interact.js/master/LICENSE\n */\n","/*\n * In a (windowless) server environment this file exports a factory function\n * that takes the window to use.\n *\n * var interact = require('interact.js')(windowObject);\n *\n * See https://github.com/taye/interact.js/issues/187\n */\nif (typeof window === 'undefined') {\n module.exports = function (window) {\n require('./src/utils/window').init(window);\n\n return require('./src/index');\n };\n}\nelse {\n module.exports = require('./src/index');\n}\n","const { indexOf } = require('./utils/arr');\nconst extend = require('./utils/extend.js');\n\nfunction fireUntilImmediateStopped (event, listeners) {\n for (let i = 0, len = listeners.length; i < len && !event.immediatePropagationStopped; i++) {\n listeners[i](event);\n }\n}\n\nclass Eventable {\n\n constructor (options) {\n this.options = extend({}, options || {});\n }\n\n fire (event) {\n let listeners;\n const onEvent = 'on' + event.type;\n const global = this.global;\n\n // Interactable#on() listeners\n if ((listeners = this[event.type])) {\n fireUntilImmediateStopped(event, listeners);\n }\n\n // interactable.onevent listener\n if (this[onEvent]) {\n this[onEvent](event);\n }\n\n // interact.on() listeners\n if (!event.propagationStopped && global && (listeners = global[event.type])) {\n fireUntilImmediateStopped(event, listeners);\n }\n }\n\n on (eventType, listener) {\n // if this type of event was never bound\n if (this[eventType]) {\n this[eventType].push(listener);\n }\n else {\n this[eventType] = [listener];\n }\n }\n\n off (eventType, listener) {\n // if it is an action event type\n const eventList = this[eventType];\n const index = eventList? indexOf(eventList, listener) : -1;\n\n if (index !== -1) {\n eventList.splice(index, 1);\n }\n\n if (eventList && eventList.length === 0 || !listener) {\n this[eventType] = listener;\n }\n }\n}\n\nmodule.exports = Eventable;\n","const extend = require('./utils/extend');\nconst getOriginXY = require('./utils/getOriginXY');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nclass InteractEvent {\n constructor (interaction, event, action, phase, element, related, preEnd = false) {\n const target = interaction.target;\n const deltaSource = (target && target.options || defaults).deltaSource;\n const origin = getOriginXY(target, element, action);\n const starting = phase === 'start';\n const ending = phase === 'end';\n const coords = starting? interaction.startCoords : interaction.curCoords;\n const prevEvent = interaction.prevEvent;\n\n element = element || interaction.element;\n\n const page = extend({}, coords.page);\n const client = extend({}, coords.client);\n\n page.x -= origin.x;\n page.y -= origin.y;\n\n client.x -= origin.x;\n client.y -= origin.y;\n\n this.ctrlKey = event.ctrlKey;\n this.altKey = event.altKey;\n this.shiftKey = event.shiftKey;\n this.metaKey = event.metaKey;\n this.button = event.button;\n this.buttons = event.buttons;\n this.target = element;\n this.currentTarget = element;\n this.relatedTarget = related || null;\n this.preEnd = preEnd;\n this.type = action + (phase || '');\n this.interaction = interaction;\n this.interactable = target;\n\n this.t0 = starting ? interaction.downTimes[interaction.downTimes.length - 1]\n : prevEvent.t0;\n\n const signalArg = {\n interaction,\n event,\n action,\n phase,\n element,\n related,\n page,\n client,\n coords,\n starting,\n ending,\n deltaSource,\n iEvent: this,\n };\n\n signals.fire('set-xy', signalArg);\n\n if (ending) {\n // use previous coords when ending\n this.pageX = prevEvent.pageX;\n this.pageY = prevEvent.pageY;\n this.clientX = prevEvent.clientX;\n this.clientY = prevEvent.clientY;\n }\n else {\n this.pageX = page.x;\n this.pageY = page.y;\n this.clientX = client.x;\n this.clientY = client.y;\n }\n\n this.x0 = interaction.startCoords.page.x - origin.x;\n this.y0 = interaction.startCoords.page.y - origin.y;\n this.clientX0 = interaction.startCoords.client.x - origin.x;\n this.clientY0 = interaction.startCoords.client.y - origin.y;\n\n signals.fire('set-delta', signalArg);\n\n this.timeStamp = coords.timeStamp;\n this.dt = interaction.pointerDelta.timeStamp;\n this.duration = this.timeStamp - this.t0;\n\n // speed and velocity in pixels per second\n this.speed = interaction.pointerDelta[deltaSource].speed;\n this.velocityX = interaction.pointerDelta[deltaSource].vx;\n this.velocityY = interaction.pointerDelta[deltaSource].vy;\n\n this.swipe = (ending || phase === 'inertiastart')? this.getSwipe() : null;\n\n signals.fire('new', signalArg);\n }\n\n getSwipe () {\n const interaction = this.interaction;\n\n if (interaction.prevEvent.speed < 600\n || this.timeStamp - interaction.prevEvent.timeStamp > 150) {\n return null;\n }\n\n let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI;\n const overlap = 22.5;\n\n if (angle < 0) {\n angle += 360;\n }\n\n const left = 135 - overlap <= angle && angle < 225 + overlap;\n const up = 225 - overlap <= angle && angle < 315 + overlap;\n\n const right = !left && (315 - overlap <= angle || angle < 45 + overlap);\n const down = !up && 45 - overlap <= angle && angle < 135 + overlap;\n\n return {\n up,\n down,\n left,\n right,\n angle,\n speed: interaction.prevEvent.speed,\n velocity: {\n x: interaction.prevEvent.velocityX,\n y: interaction.prevEvent.velocityY,\n },\n };\n }\n\n preventDefault () {}\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n}\n\nsignals.on('set-delta', function ({ iEvent, interaction, starting, deltaSource }) {\n const prevEvent = starting? iEvent : interaction.prevEvent;\n\n if (deltaSource === 'client') {\n iEvent.dx = iEvent.clientX - prevEvent.clientX;\n iEvent.dy = iEvent.clientY - prevEvent.clientY;\n }\n else {\n iEvent.dx = iEvent.pageX - prevEvent.pageX;\n iEvent.dy = iEvent.pageY - prevEvent.pageY;\n }\n});\n\nInteractEvent.signals = signals;\n\nmodule.exports = InteractEvent;\n","const is = require('./utils/is');\nconst events = require('./utils/events');\nconst extend = require('./utils/extend');\nconst actions = require('./actions/base');\nconst scope = require('./scope');\nconst Eventable = require('./Eventable');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nconst {\n getElementRect,\n nodeContains,\n trySelector,\n} = require('./utils/domUtils');\nconst { getWindow } = require('./utils/window');\nconst { indexOf, contains } = require('./utils/arr');\nconst { wheelEvent } = require('./utils/browser');\n\n// all set interactables\nscope.interactables = [];\n\n/*\\\n * Interactable\n [ property ]\n **\n * Object type returned by @interact\n\\*/\nclass Interactable {\n constructor (target, options) {\n options = options || {};\n\n this.target = target;\n this.events = new Eventable();\n this._context = options.context || scope.document;\n this._win = getWindow(trySelector(target)? this._context : target);\n this._doc = this._win.document;\n\n signals.fire('new', {\n target,\n options,\n interactable: this,\n win: this._win,\n });\n\n scope.addDocument( this._doc, this._win );\n\n scope.interactables.push(this);\n\n this.set(options);\n }\n\n setOnEvents (action, phases) {\n const onAction = 'on' + action;\n\n if (is.function(phases.onstart) ) { this.events[onAction + 'start' ] = phases.onstart ; }\n if (is.function(phases.onmove) ) { this.events[onAction + 'move' ] = phases.onmove ; }\n if (is.function(phases.onend) ) { this.events[onAction + 'end' ] = phases.onend ; }\n if (is.function(phases.oninertiastart)) { this.events[onAction + 'inertiastart' ] = phases.oninertiastart ; }\n\n return this;\n }\n\n setPerAction (action, options) {\n // for all the default per-action options\n for (const option in options) {\n // if this option exists for this action\n if (option in defaults[action]) {\n // if the option in the options arg is an object value\n if (is.object(options[option])) {\n // duplicate the object\n this.options[action][option] = extend(this.options[action][option] || {}, options[option]);\n\n if (is.object(defaults.perAction[option]) && 'enabled' in defaults.perAction[option]) {\n this.options[action][option].enabled = options[option].enabled === false? false : true;\n }\n }\n else if (is.bool(options[option]) && is.object(defaults.perAction[option])) {\n this.options[action][option].enabled = options[option];\n }\n else if (options[option] !== undefined) {\n // or if it's not undefined, do a plain assignment\n this.options[action][option] = options[option];\n }\n }\n }\n }\n\n /*\\\n * Interactable.getRect\n [ method ]\n *\n * The default function to get an Interactables bounding rect. Can be\n * overridden using @Interactable.rectChecker.\n *\n - element (Element) #optional The element to measure.\n = (object) The object's bounding rectangle.\n o {\n o top : 0,\n o left : 0,\n o bottom: 0,\n o right : 0,\n o width : 0,\n o height: 0\n o }\n \\*/\n getRect (element) {\n element = element || this.target;\n\n if (is.string(this.target) && !(is.element(element))) {\n element = this._context.querySelector(this.target);\n }\n\n return getElementRect(element);\n }\n\n /*\\\n * Interactable.rectChecker\n [ method ]\n *\n * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n - checker (function) #optional A function which returns this Interactable's bounding rectangle. See @Interactable.getRect\n = (function | object) The checker function or this Interactable\n \\*/\n rectChecker (checker) {\n if (is.function(checker)) {\n this.getRect = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.getRect;\n\n return this;\n }\n\n return this.getRect;\n }\n\n _backCompatOption (optionName, newValue) {\n if (trySelector(newValue) || is.object(newValue)) {\n this.options[optionName] = newValue;\n\n for (const action of actions.names) {\n this.options[action][optionName] = newValue;\n }\n\n return this;\n }\n\n return this.options[optionName];\n }\n\n /*\\\n * Interactable.origin\n [ method ]\n *\n * Gets or sets the origin of the Interactable's element. The x and y\n * of the origin will be subtracted from action event coordinates.\n *\n - origin (object | string) #optional An object eg. { x: 0, y: 0 } or string 'parent', 'self' or any CSS selector\n * OR\n - origin (Element) #optional An HTML or SVG Element whose rect will be used\n **\n = (object) The current origin or this Interactable\n \\*/\n origin (newValue) {\n return this._backCompatOption('origin', newValue);\n }\n\n /*\\\n * Interactable.deltaSource\n [ method ]\n *\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n - newValue (string) #optional Use 'client' if you will be scrolling while interacting; Use 'page' if you want autoScroll to work\n = (string | object) The current deltaSource or this Interactable\n \\*/\n deltaSource (newValue) {\n if (newValue === 'page' || newValue === 'client') {\n this.options.deltaSource = newValue;\n\n return this;\n }\n\n return this.options.deltaSource;\n }\n\n /*\\\n * Interactable.context\n [ method ]\n *\n * Gets the selector context Node of the Interactable. The default is `window.document`.\n *\n = (Node) The context Node of this Interactable\n **\n \\*/\n context () {\n return this._context;\n }\n\n inContext (element) {\n return (this._context === element.ownerDocument\n || nodeContains(this._context, element));\n }\n\n /*\\\n * Interactable.fire\n [ method ]\n *\n * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n - iEvent (InteractEvent) The InteractEvent object to be fired on this Interactable\n = (Interactable) this Interactable\n \\*/\n fire (iEvent) {\n this.events.fire(iEvent);\n\n return this;\n }\n\n _onOffMultiple (method, eventType, listener, options) {\n if (is.string(eventType) && eventType.search(' ') !== -1) {\n eventType = eventType.trim().split(/ +/);\n }\n\n if (is.array(eventType)) {\n for (let i = 0; i < eventType.length; i++) {\n this[method](eventType[i], listener, options);\n }\n\n return true;\n }\n\n if (is.object(eventType)) {\n for (const prop in eventType) {\n this[method](prop, eventType[prop], listener);\n }\n\n return true;\n }\n }\n\n /*\\\n * Interactable.on\n [ method ]\n *\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n - eventType (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) This Interactable\n \\*/\n on (eventType, listener, options) {\n if (this._onOffMultiple('on', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.on(eventType, listener);\n }\n // delegated event for selector\n else if (is.string(this.target)) {\n events.addDelegate(this.target, this._context, eventType, listener, options);\n }\n else {\n events.add(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.off\n [ method ]\n *\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n - eventType (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) This Interactable\n \\*/\n off (eventType, listener, options) {\n if (this._onOffMultiple('off', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n // if it is an action event type\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.off(eventType, listener);\n }\n // delegated event\n else if (is.string(this.target)) {\n events.removeDelegate(this.target, this._context, eventType, listener, options);\n }\n // remove listener from this Interatable's element\n else {\n events.remove(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.set\n [ method ]\n *\n * Reset the options of this Interactable\n - options (object) The new settings to apply\n = (object) This Interactable\n \\*/\n set (options) {\n if (!is.object(options)) {\n options = {};\n }\n\n this.options = extend({}, defaults.base);\n\n const perActions = extend({}, defaults.perAction);\n\n for (const actionName in actions.methodDict) {\n const methodName = actions.methodDict[actionName];\n\n this.options[actionName] = extend({}, defaults[actionName]);\n\n this.setPerAction(actionName, perActions);\n\n this[methodName](options[actionName]);\n }\n\n for (const setting of Interactable.settingsMethods) {\n this.options[setting] = defaults.base[setting];\n\n if (setting in options) {\n this[setting](options[setting]);\n }\n }\n\n signals.fire('set', {\n options,\n interactable: this,\n });\n\n return this;\n }\n\n /*\\\n * Interactable.unset\n [ method ]\n *\n * Remove this interactable from the list of interactables and remove\n * it's action capabilities and event listeners\n *\n = (object) @interact\n \\*/\n unset () {\n events.remove(this.target, 'all');\n\n if (is.string(this.target)) {\n // remove delegated events\n for (const type in events.delegatedEvents) {\n const delegated = events.delegatedEvents[type];\n\n if (delegated.selectors[0] === this.target\n && delegated.contexts[0] === this._context) {\n\n delegated.selectors.splice(0, 1);\n delegated.contexts .splice(0, 1);\n delegated.listeners.splice(0, 1);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegated[type] = null;\n }\n }\n\n events.remove(this._context, type, events.delegateListener);\n events.remove(this._context, type, events.delegateUseCapture, true);\n }\n }\n else {\n events.remove(this, 'all');\n }\n\n signals.fire('unset', { interactable: this });\n\n scope.interactables.splice(indexOf(scope.interactables, this), 1);\n\n // Stop related interactions when an Interactable is unset\n for (const interaction of scope.interactions || []) {\n if (interaction.target === this && interaction.interacting()) {\n interaction.stop();\n }\n }\n\n return scope.interact;\n }\n}\n\nscope.interactables.indexOfElement = function indexOfElement (target, context) {\n context = context || scope.document;\n\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n if (interactable.target === target && interactable._context === context) {\n return i;\n }\n }\n return -1;\n};\n\nscope.interactables.get = function interactableGet (element, options, dontCheckInContext) {\n const ret = this[this.indexOfElement(element, options && options.context)];\n\n return ret && (is.string(element) || dontCheckInContext || ret.inContext(element))? ret : null;\n};\n\nscope.interactables.forEachSelector = function (callback, element) {\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n // skip non CSS selector targets and out of context elements\n if (!is.string(interactable.target)\n || (element && !interactable.inContext(element))) {\n continue;\n }\n\n const ret = callback(interactable, interactable.target, interactable._context, i, this);\n\n if (ret !== undefined) {\n return ret;\n }\n }\n};\n\n// all interact.js eventTypes\nInteractable.eventTypes = scope.eventTypes = [];\n\nInteractable.signals = signals;\n\nInteractable.settingsMethods = [ 'deltaSource', 'origin', 'preventDefault', 'rectChecker' ];\n\nmodule.exports = Interactable;\n","const scope = require('./scope');\nconst utils = require('./utils');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst domObjects = require('./utils/domObjects');\nconst finder = require('./utils/interactionFinder');\nconst signals = require('./utils/Signals').new();\n\nconst listeners = {};\nconst methodNames = [\n 'pointerDown', 'pointerMove', 'pointerUp',\n 'updatePointer', 'removePointer',\n];\n\n// for ignoring browser's simulated mouse events\nlet prevTouchTime = 0;\n\n// all active and idle interactions\nscope.interactions = [];\n\nclass Interaction {\n constructor ({ pointerType }) {\n this.target = null; // current interactable being interacted with\n this.element = null; // the target element of the interactable\n\n this.prepared = { // action that's ready to be fired on next move event\n name : null,\n axis : null,\n edges: null,\n };\n\n // keep track of added pointers\n this.pointers = [];\n this.pointerIds = [];\n this.downTargets = [];\n this.downTimes = [];\n\n // Previous native pointer move event coordinates\n this.prevCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n // current native pointer move event coordinates\n this.curCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Starting InteractEvent pointer coordinates\n this.startCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Change in coordinates and time of the pointer\n this.pointerDelta = {\n page : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n client : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n timeStamp: 0,\n };\n\n this.downEvent = null; // pointerdown/mousedown/touchstart event\n this.downPointer = {};\n\n this._eventTarget = null;\n this._curEventTarget = null;\n\n this.prevEvent = null; // previous action event\n\n this.pointerIsDown = false;\n this.pointerWasMoved = false;\n this._interacting = false;\n\n this.pointerType = pointerType;\n\n signals.fire('new', this);\n\n scope.interactions.push(this);\n }\n\n pointerDown (pointer, event, eventTarget) {\n const pointerIndex = this.updatePointer(pointer, event, true);\n\n signals.fire('down', {\n pointer,\n event,\n eventTarget,\n pointerIndex,\n interaction: this,\n });\n }\n\n /*\\\n * Interaction.start\n [ method ]\n *\n * Start an action with the given Interactable and Element as tartgets. The\n * action must be enabled for the target Interactable and an appropriate number\n * of pointers must be held down - 1 for drag/resize, 2 for gesture.\n *\n * Use it with `interactable.able({ manualStart: false })` to always\n * [start actions manually](https://github.com/taye/interact.js/issues/114)\n *\n - action (object) The action to be performed - drag, resize, etc.\n - target (Interactable) The Interactable to target\n - element (Element) The DOM Element to target\n = (object) interact\n **\n | interact(target)\n | .draggable({\n | // disable the default drag start by down->move\n | manualStart: true\n | })\n | // start dragging after the user holds the pointer down\n | .on('hold', function (event) {\n | var interaction = event.interaction;\n |\n | if (!interaction.interacting()) {\n | interaction.start({ name: 'drag' },\n | event.interactable,\n | event.currentTarget);\n | }\n | });\n \\*/\n start (action, target, element) {\n if (this.interacting()\n || !this.pointerIsDown\n || this.pointerIds.length < (action.name === 'gesture'? 2 : 1)) {\n return;\n }\n\n // if this interaction had been removed after stopping\n // add it back\n if (utils.indexOf(scope.interactions, this) === -1) {\n scope.interactions.push(this);\n }\n\n utils.copyAction(this.prepared, action);\n this.target = target;\n this.element = element;\n\n signals.fire('action-start', {\n interaction: this,\n event: this.downEvent,\n });\n }\n\n pointerMove (pointer, event, eventTarget) {\n if (!this.simulation) {\n this.updatePointer(pointer);\n utils.setCoords(this.curCoords, this.pointers);\n }\n\n const duplicateMove = (this.curCoords.page.x === this.prevCoords.page.x\n && this.curCoords.page.y === this.prevCoords.page.y\n && this.curCoords.client.x === this.prevCoords.client.x\n && this.curCoords.client.y === this.prevCoords.client.y);\n\n let dx;\n let dy;\n\n // register movement greater than pointerMoveTolerance\n if (this.pointerIsDown && !this.pointerWasMoved) {\n dx = this.curCoords.client.x - this.startCoords.client.x;\n dy = this.curCoords.client.y - this.startCoords.client.y;\n\n this.pointerWasMoved = utils.hypot(dx, dy) > Interaction.pointerMoveTolerance;\n }\n\n const signalArg = {\n pointer,\n pointerIndex: this.getPointerIndex(pointer),\n event,\n eventTarget,\n dx,\n dy,\n duplicate: duplicateMove,\n interaction: this,\n interactingBeforeMove: this.interacting(),\n };\n\n if (!duplicateMove) {\n // set pointer coordinate, time changes and speeds\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n }\n\n signals.fire('move', signalArg);\n\n if (!duplicateMove) {\n // if interacting, fire an 'action-move' signal etc\n if (this.interacting()) {\n this.doMove(signalArg);\n }\n\n if (this.pointerWasMoved) {\n utils.copyCoords(this.prevCoords, this.curCoords);\n }\n }\n }\n\n /*\\\n * Interaction.doMove\n [ method ]\n *\n * Force a move of the current action at the same coordinates. Useful if\n * snap/restrict has been changed and you want a movement with the new\n * settings.\n *\n **\n | interact(target)\n | .draggable(true)\n | .on('dragmove', function (event) {\n | if (someCondition) {\n | // change the snap settings\n | event.interactable.draggable({ snap: { targets: [] }});\n | // fire another move event with re-calculated snap\n | event.interaction.doMove();\n | }\n | });\n \\*/\n doMove (signalArg) {\n signalArg = utils.extend({\n pointer: this.pointers[0],\n event: this.prevEvent,\n eventTarget: this._eventTarget,\n interaction: this,\n }, signalArg || {});\n\n signals.fire('before-action-move', signalArg);\n\n if (!this._dontFireMove) {\n signals.fire('action-move', signalArg);\n }\n\n this._dontFireMove = false;\n }\n\n // End interact move events and stop auto-scroll unless simulation is running\n pointerUp (pointer, event, eventTarget, curEventTarget) {\n const pointerIndex = this.getPointerIndex(pointer);\n\n signals.fire(/cancel$/i.test(event.type)? 'cancel' : 'up', {\n pointer,\n pointerIndex,\n event,\n eventTarget,\n curEventTarget,\n interaction: this,\n });\n\n if (!this.simulation) {\n this.end(event);\n }\n\n this.pointerIsDown = false;\n this.removePointer(pointer, event);\n }\n\n /*\\\n * Interaction.end\n [ method ]\n *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n - event (PointerEvent) #optional\n **\n | interact(target)\n | .draggable(true)\n | .on('move', function (event) {\n | if (event.pageX > 1000) {\n | // end the current action\n | event.interaction.end();\n | // stop all further listeners from being called\n | event.stopImmediatePropagation();\n | }\n | });\n \\*/\n end (event) {\n event = event || this.prevEvent;\n\n if (this.interacting()) {\n signals.fire('action-end', {\n event,\n interaction: this,\n });\n }\n\n this.stop();\n }\n\n currentAction () {\n return this._interacting? this.prepared.name: null;\n }\n\n interacting () {\n return this._interacting;\n }\n\n stop () {\n signals.fire('stop', { interaction: this });\n\n if (this._interacting) {\n signals.fire('stop-active', { interaction: this });\n signals.fire('stop-' + this.prepared.name, { interaction: this });\n }\n\n this.target = this.element = null;\n\n this._interacting = false;\n this.prepared.name = this.prevEvent = null;\n }\n\n getPointerIndex (pointer) {\n // mouse and pen interactions may have only one pointer\n if (this.pointerType === 'mouse' || this.pointerType === 'pen') {\n return 0;\n }\n\n return utils.indexOf(this.pointerIds, utils.getPointerId(pointer));\n }\n\n updatePointer (pointer, event, down = event && /(down|start)$/i.test(event.type)) {\n const id = utils.getPointerId(pointer);\n let index = this.getPointerIndex(pointer);\n\n if (index === -1) {\n index = this.pointerIds.length;\n this.pointerIds[index] = id;\n }\n\n if (down) {\n signals.fire('update-pointer-down', {\n pointer,\n event,\n down,\n pointerId: id,\n pointerIndex: index,\n interaction: this,\n });\n }\n\n this.pointers[index] = pointer;\n\n return index;\n }\n\n removePointer (pointer, event) {\n const index = this.getPointerIndex(pointer);\n\n if (index === -1) { return; }\n\n signals.fire('remove-pointer', {\n pointer,\n event,\n pointerIndex: index,\n interaction: this,\n });\n\n this.pointers .splice(index, 1);\n this.pointerIds .splice(index, 1);\n this.downTargets.splice(index, 1);\n this.downTimes .splice(index, 1);\n }\n\n _updateEventTargets (target, currentTarget) {\n this._eventTarget = target;\n this._curEventTarget = currentTarget;\n }\n}\n\nfor (let i = 0, len = methodNames.length; i < len; i++) {\n const method = methodNames[i];\n\n listeners[method] = doOnInteractions(method);\n}\n\nfunction doOnInteractions (method) {\n return (function (event) {\n const pointerType = utils.getPointerType(event);\n const [eventTarget, curEventTarget] = utils.getEventTargets(event);\n const matches = []; // [ [pointer, interaction], ...]\n\n if (browser.supportsTouch && /touch/.test(event.type)) {\n prevTouchTime = new Date().getTime();\n\n for (let i = 0; i < event.changedTouches.length; i++) {\n const pointer = event.changedTouches[i];\n const interaction = finder.search(pointer, event.type, eventTarget);\n\n matches.push([pointer, interaction || new Interaction({ pointerType })]);\n }\n }\n else {\n let invalidPointer = false;\n\n if (!browser.supportsPointerEvent && /mouse/.test(event.type)) {\n // ignore mouse events while touch interactions are active\n for (let i = 0; i < scope.interactions.length && !invalidPointer; i++) {\n invalidPointer = scope.interactions[i].pointerType !== 'mouse' && scope.interactions[i].pointerIsDown;\n }\n\n // try to ignore mouse events that are simulated by the browser\n // after a touch event\n invalidPointer = invalidPointer\n || (new Date().getTime() - prevTouchTime < 500)\n // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated\n || event.timeStamp === 0;\n }\n\n if (!invalidPointer) {\n let interaction = finder.search(event, event.type, eventTarget);\n\n if (!interaction) {\n interaction = new Interaction({ pointerType });\n }\n\n matches.push([event, interaction]);\n }\n }\n\n for (const [pointer, interaction] of matches) {\n interaction._updateEventTargets(eventTarget, curEventTarget);\n interaction[method](pointer, event, eventTarget, curEventTarget);\n }\n });\n}\n\nfunction endAll (event) {\n for (let i = 0; i < scope.interactions.length; i++) {\n const interaction = scope.interactions[i];\n\n interaction.end(event);\n signals.fire('endall', { event, interaction });\n }\n}\n\nconst docEvents = { /* 'eventType': listenerFunc */ };\nconst pEventTypes = browser.pEventTypes;\n\nif (domObjects.PointerEvent) {\n docEvents[pEventTypes.down ] = listeners.pointerDown;\n docEvents[pEventTypes.move ] = listeners.pointerMove;\n docEvents[pEventTypes.up ] = listeners.pointerUp;\n docEvents[pEventTypes.cancel] = listeners.pointerUp;\n}\nelse {\n docEvents.mousedown = listeners.pointerDown;\n docEvents.mousemove = listeners.pointerMove;\n docEvents.mouseup = listeners.pointerUp;\n\n docEvents.touchstart = listeners.pointerDown;\n docEvents.touchmove = listeners.pointerMove;\n docEvents.touchend = listeners.pointerUp;\n docEvents.touchcancel = listeners.pointerUp;\n}\n\ndocEvents.blur = endAll;\n\nfunction onDocSignal ({ doc }, signalName) {\n const eventMethod = signalName.indexOf('add') === 0\n ? events.add : events.remove;\n\n // delegate event listener\n for (const eventType in scope.delegatedEvents) {\n eventMethod(doc, eventType, events.delegateListener);\n eventMethod(doc, eventType, events.delegateUseCapture, true);\n }\n\n for (const eventType in docEvents) {\n eventMethod(doc, eventType, docEvents[eventType]);\n }\n}\n\nsignals.on('update-pointer-down', ({ interaction, pointer, pointerId, pointerIndex, event, eventTarget, down }) => {\n interaction.pointerIds[pointerIndex] = pointerId;\n interaction.pointers[pointerIndex] = pointer;\n\n if (down) {\n interaction.pointerIsDown = true;\n }\n\n if (!interaction.interacting()) {\n utils.setCoords(interaction.startCoords, interaction.pointers);\n\n utils.copyCoords(interaction.curCoords , interaction.startCoords);\n utils.copyCoords(interaction.prevCoords, interaction.startCoords);\n\n interaction.downEvent = event;\n interaction.downTimes[pointerIndex] = interaction.curCoords.timeStamp;\n interaction.downTargets[pointerIndex] = eventTarget || event && utils.getEventTargets(event)[0];\n interaction.pointerWasMoved = false;\n\n utils.pointerExtend(interaction.downPointer, pointer);\n }\n});\n\nscope.signals.on('add-document' , onDocSignal);\nscope.signals.on('remove-document', onDocSignal);\n\nInteraction.pointerMoveTolerance = 1;\nInteraction.doOnInteractions = doOnInteractions;\nInteraction.endAll = endAll;\nInteraction.signals = signals;\nInteraction.docEvents = docEvents;\n\nscope.endAllInteractions = endAll;\n\nmodule.exports = Interaction;\n","const Interaction = require('../Interaction');\nconst InteractEvent = require('../InteractEvent');\n\nconst actions = {\n firePrepared,\n names: [],\n methodDict: {},\n};\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n interaction._interacting = true;\n firePrepared(interaction, event, 'start');\n});\n\nInteraction.signals.on('action-move', function ({ interaction, event, preEnd }) {\n firePrepared(interaction, event, 'move', preEnd);\n\n // if the action was ended in a listener\n if (!interaction.interacting()) { return false; }\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n firePrepared(interaction, event, 'end');\n});\n\nfunction firePrepared (interaction, event, phase, preEnd) {\n const actionName = interaction.prepared.name;\n\n const newEvent = new InteractEvent(interaction, event, actionName, phase, interaction.element, null, preEnd);\n\n interaction.target.fire(newEvent);\n interaction.prevEvent = newEvent;\n}\n\nmodule.exports = actions;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drag = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n startAxis : 'xy',\n lockAxis : 'xy',\n },\n\n checker: function (pointer, event, interactable) {\n const dragOptions = interactable.options.drag;\n\n return dragOptions.enabled\n ? { name: 'drag', axis: (dragOptions.lockAxis === 'start'\n ? dragOptions.startAxis\n : dragOptions.lockAxis)}\n : null;\n },\n\n getCursor: function () {\n return 'move';\n },\n};\n\nInteraction.signals.on('before-action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n interaction.curCoords.page.y = interaction.startCoords.page.y;\n interaction.curCoords.client.y = interaction.startCoords.client.y;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vx);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vx);\n interaction.pointerDelta.client.vy = 0;\n interaction.pointerDelta.page.vy = 0;\n }\n else if (axis === 'y') {\n interaction.curCoords.page.x = interaction.startCoords.page.x;\n interaction.curCoords.client.x = interaction.startCoords.client.x;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vy);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vy);\n interaction.pointerDelta.client.vx = 0;\n interaction.pointerDelta.page.vx = 0;\n }\n});\n\n// dragmove\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'dragmove') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n iEvent.pageY = interaction.startCoords.page.y;\n iEvent.clientY = interaction.startCoords.client.y;\n iEvent.dy = 0;\n }\n else if (axis === 'y') {\n iEvent.pageX = interaction.startCoords.page.x;\n iEvent.clientX = interaction.startCoords.client.x;\n iEvent.dx = 0;\n }\n});\n\n/*\\\n * Interactable.draggable\n [ method ]\n *\n * Gets or sets whether drag actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of drag events\n | var isDraggable = interact('ul li').draggable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on drag events (object makes the Interactable draggable)\n = (object) This Interactable\n | interact(element).draggable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // the axis in which the first movement must be\n | // for the drag sequence to start\n | // 'xy' by default - any direction\n | startAxis: 'x' || 'y' || 'xy',\n |\n | // 'xy' by default - don't restrict to one axis (move in any direction)\n | // 'x' or 'y' to restrict movement to either axis\n | // 'start' to restrict movement to the axis the drag started in\n | lockAxis: 'x' || 'y' || 'xy' || 'start',\n |\n | // max number of drags that can happen concurrently\n | // with elements of this Interactable. Infinity by default\n | max: Infinity,\n |\n | // max number of drags that can target the same element+Interactable\n | // 1 by default\n | maxPerElement: 2\n | });\n\\*/\nInteractable.prototype.draggable = function (options) {\n if (utils.is.object(options)) {\n this.options.drag.enabled = options.enabled === false? false: true;\n this.setPerAction('drag', options);\n this.setOnEvents('drag', options);\n\n if (/^(xy|x|y|start)$/.test(options.lockAxis)) {\n this.options.drag.lockAxis = options.lockAxis;\n }\n if (/^(xy|x|y)$/.test(options.startAxis)) {\n this.options.drag.startAxis = options.startAxis;\n }\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drag.enabled = options;\n\n if (!options) {\n this.ondragstart = this.ondragstart = this.ondragend = null;\n }\n\n return this;\n }\n\n return this.options.drag;\n};\n\nactions.drag = drag;\nactions.names.push('drag');\nutils.merge(Interactable.eventTypes, [\n 'dragstart',\n 'dragmove',\n 'draginertiastart',\n 'draginertiaresume',\n 'dragend',\n]);\nactions.methodDict.drag = 'draggable';\n\ndefaultOptions.drag = drag.defaults;\n\nmodule.exports = drag;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst scope = require('../scope');\nconst interact = require('../interact');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drop = {\n defaults: {\n enabled: false,\n accept : null,\n overlap: 'pointer',\n },\n};\n\nlet dynamicDrop = false;\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // reset active dropzones\n interaction.activeDrops.dropzones = [];\n interaction.activeDrops.elements = [];\n interaction.activeDrops.rects = [];\n\n interaction.dropEvents = null;\n\n if (!interaction.dynamicDrop) {\n setActiveDrops(interaction, interaction.element);\n }\n\n const dragEvent = interaction.prevEvent;\n const dropEvents = getDropEvents(interaction, event, dragEvent);\n\n if (dropEvents.activate) {\n fireActiveDrops(interaction, dropEvents.activate);\n }\n});\n\nInteractEvent.signals.on('new', function ({ interaction, iEvent, event }) {\n if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { return; }\n\n const draggableElement = interaction.element;\n const dragEvent = iEvent;\n const dropResult = getDrop(dragEvent, event, draggableElement);\n\n interaction.dropTarget = dropResult.dropzone;\n interaction.dropElement = dropResult.element;\n\n interaction.dropEvents = getDropEvents(interaction, event, dragEvent);\n});\n\nInteraction.signals.on('action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n fireDropEvents(interaction, interaction.dropEvents);\n});\n\nInteraction.signals.on('action-end', function ({ interaction }) {\n if (interaction.prepared.name === 'drag') {\n fireDropEvents(interaction, interaction.dropEvents);\n }\n});\n\nInteraction.signals.on('stop-drag', function ({ interaction }) {\n interaction.activeDrops.dropzones =\n interaction.activeDrops.elements =\n interaction.activeDrops.rects =\n interaction.dropEvents = null;\n});\n\nfunction collectDrops (interaction, element) {\n const drops = [];\n const elements = [];\n\n element = element || interaction.element;\n\n // collect all dropzones and their elements which qualify for a drop\n for (const current of scope.interactables) {\n if (!current.options.drop.enabled) { continue; }\n\n const accept = current.options.drop.accept;\n\n // test the draggable element against the dropzone's accept setting\n if ((utils.is.element(accept) && accept !== element)\n || (utils.is.string(accept)\n && !utils.matchesSelector(element, accept))) {\n\n continue;\n }\n\n // query for new elements if necessary\n const dropElements = utils.is.string(current.target)\n ? current._context.querySelectorAll(current.target)\n : [current.target];\n\n for (let i = 0; i < dropElements.length; i++) {\n const currentElement = dropElements[i];\n\n if (currentElement !== element) {\n drops.push(current);\n elements.push(currentElement);\n }\n }\n }\n\n return {\n elements,\n dropzones: drops,\n };\n}\n\nfunction fireActiveDrops (interaction, event) {\n let prevElement;\n\n // loop through all active dropzones and trigger event\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n const current = interaction.activeDrops.dropzones[i];\n const currentElement = interaction.activeDrops.elements [i];\n\n // prevent trigger of duplicate events on same element\n if (currentElement !== prevElement) {\n // set current element as event target\n event.target = currentElement;\n current.fire(event);\n }\n prevElement = currentElement;\n }\n}\n\n// Collect a new set of possible drops and save them in activeDrops.\n// setActiveDrops should always be called when a drag has just started or a\n// drag event happens while dynamicDrop is true\nfunction setActiveDrops (interaction, dragElement) {\n // get dropzones and their elements that could receive the draggable\n const possibleDrops = collectDrops(interaction, dragElement, true);\n\n interaction.activeDrops.dropzones = possibleDrops.dropzones;\n interaction.activeDrops.elements = possibleDrops.elements;\n interaction.activeDrops.rects = [];\n\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n interaction.activeDrops.rects[i] =\n interaction.activeDrops.dropzones[i].getRect(interaction.activeDrops.elements[i]);\n }\n}\n\nfunction getDrop (dragEvent, event, dragElement) {\n const interaction = dragEvent.interaction;\n const validDrops = [];\n\n if (dynamicDrop) {\n setActiveDrops(interaction, dragElement);\n }\n\n // collect all dropzones and their elements which qualify for a drop\n for (let j = 0; j < interaction.activeDrops.dropzones.length; j++) {\n const current = interaction.activeDrops.dropzones[j];\n const currentElement = interaction.activeDrops.elements [j];\n const rect = interaction.activeDrops.rects [j];\n\n validDrops.push(current.dropCheck(dragEvent, event, interaction.target, dragElement, currentElement, rect)\n ? currentElement\n : null);\n }\n\n // get the most appropriate dropzone based on DOM depth and order\n const dropIndex = utils.indexOfDeepestElement(validDrops);\n\n return {\n dropzone: interaction.activeDrops.dropzones[dropIndex] || null,\n element : interaction.activeDrops.elements [dropIndex] || null,\n };\n}\n\nfunction getDropEvents (interaction, pointerEvent, dragEvent) {\n const dropEvents = {\n enter : null,\n leave : null,\n activate : null,\n deactivate: null,\n move : null,\n drop : null,\n };\n\n const tmpl = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n };\n\n if (interaction.dropElement !== interaction.prevDropElement) {\n // if there was a prevDropTarget, create a dragleave event\n if (interaction.prevDropTarget) {\n dropEvents.leave = utils.extend({ type: 'dragleave' }, tmpl);\n\n dragEvent.dragLeave = dropEvents.leave.target = interaction.prevDropElement;\n dragEvent.prevDropzone = dropEvents.leave.dropzone = interaction.prevDropTarget;\n }\n // if the dropTarget is not null, create a dragenter event\n if (interaction.dropTarget) {\n dropEvents.enter = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n type : 'dragenter',\n };\n\n dragEvent.dragEnter = interaction.dropElement;\n dragEvent.dropzone = interaction.dropTarget;\n }\n }\n\n if (dragEvent.type === 'dragend' && interaction.dropTarget) {\n dropEvents.drop = utils.extend({ type: 'drop' }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n dragEvent.relatedTarget = interaction.dropElement;\n }\n if (dragEvent.type === 'dragstart') {\n dropEvents.activate = utils.extend({ type: 'dropactivate' }, tmpl);\n\n dropEvents.activate.target = null;\n dropEvents.activate.dropzone = null;\n }\n if (dragEvent.type === 'dragend') {\n dropEvents.deactivate = utils.extend({ type: 'dropdeactivate' }, tmpl);\n\n dropEvents.deactivate.target = null;\n dropEvents.deactivate.dropzone = null;\n }\n if (dragEvent.type === 'dragmove' && interaction.dropTarget) {\n dropEvents.move = utils.extend({\n dragmove : dragEvent,\n type : 'dropmove',\n }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n }\n\n return dropEvents;\n}\n\nfunction fireDropEvents (interaction, dropEvents) {\n if (dropEvents.leave) { interaction.prevDropTarget.fire(dropEvents.leave); }\n if (dropEvents.move ) { interaction.dropTarget.fire(dropEvents.move ); }\n if (dropEvents.enter) { interaction.dropTarget.fire(dropEvents.enter); }\n if (dropEvents.drop ) { interaction.dropTarget.fire(dropEvents.drop ); }\n if (dropEvents.deactivate) {\n fireActiveDrops(interaction, dropEvents.deactivate);\n }\n\n interaction.prevDropTarget = interaction.dropTarget;\n interaction.prevDropElement = interaction.dropElement;\n}\n\n/*\\\n * Interactable.dropzone\n [ method ]\n *\n * Returns or sets whether elements can be dropped onto this\n * Interactable to trigger drop events\n *\n * Dropzones can receive the following events:\n * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends\n * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone\n * - `dragmove` when a draggable that has entered the dropzone is moved\n * - `drop` when a draggable is dropped into this dropzone\n *\n * Use the `accept` option to allow only elements that match the given CSS\n * selector or element. The value can be:\n *\n * - **an Element** - only that element can be dropped into this dropzone.\n * - **a string**, - the element being dragged must match it as a CSS selector.\n * - **`null`** - accept options is cleared - it accepts any element.\n *\n * Use the `overlap` option to set how drops are checked for. The allowed\n * values are:\n *\n * - `'pointer'`, the pointer must be over the dropzone (default)\n * - `'center'`, the draggable element's center must be over the dropzone\n * - a number from 0-1 which is the `(intersection area) / (draggable area)`.\n * e.g. `0.5` for drop to happen when half of the area of the draggable is\n * over the dropzone\n *\n * Use the `checker` option to specify a function to check if a dragged\n * element is over this Interactable.\n *\n | interact(target)\n | .dropChecker(function(dragEvent, // related dragmove or dragend event\n | event, // TouchEvent/PointerEvent/MouseEvent\n | dropped, // bool result of the default checker\n | dropzone, // dropzone Interactable\n | dropElement, // dropzone elemnt\n | draggable, // draggable Interactable\n | draggableElement) {// draggable element\n |\n | return dropped && event.target.hasAttribute('allow-drop');\n | }\n *\n *\n - options (boolean | object | null) #optional The new value to be set.\n | interact('.drop').dropzone({\n | accept: '.can-drop' || document.getElementById('single-drop'),\n | overlap: 'pointer' || 'center' || zeroToOne\n | }\n = (boolean | object) The current setting or this Interactable\n\\*/\nInteractable.prototype.dropzone = function (options) {\n if (utils.is.object(options)) {\n this.options.drop.enabled = options.enabled === false? false: true;\n\n if (utils.is.function(options.ondrop) ) { this.events.ondrop = options.ondrop ; }\n if (utils.is.function(options.ondropactivate) ) { this.events.ondropactivate = options.ondropactivate ; }\n if (utils.is.function(options.ondropdeactivate)) { this.events.ondropdeactivate = options.ondropdeactivate; }\n if (utils.is.function(options.ondragenter) ) { this.events.ondragenter = options.ondragenter ; }\n if (utils.is.function(options.ondragleave) ) { this.events.ondragleave = options.ondragleave ; }\n if (utils.is.function(options.ondropmove) ) { this.events.ondropmove = options.ondropmove ; }\n\n if (/^(pointer|center)$/.test(options.overlap)) {\n this.options.drop.overlap = options.overlap;\n }\n else if (utils.is.number(options.overlap)) {\n this.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0);\n }\n if ('accept' in options) {\n this.options.drop.accept = options.accept;\n }\n if ('checker' in options) {\n this.options.drop.checker = options.checker;\n }\n\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drop.enabled = options;\n\n if (!options) {\n this.ondragenter = this.ondragleave = this.ondrop\n = this.ondropactivate = this.ondropdeactivate = null;\n }\n\n return this;\n }\n\n return this.options.drop;\n};\n\nInteractable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) {\n let dropped = false;\n\n // if the dropzone has no rect (eg. display: none)\n // call the custom dropChecker or just return false\n if (!(rect = rect || this.getRect(dropElement))) {\n return (this.options.drop.checker\n ? this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement)\n : false);\n }\n\n const dropOverlap = this.options.drop.overlap;\n\n if (dropOverlap === 'pointer') {\n const origin = utils.getOriginXY(draggable, draggableElement, 'drag');\n const page = utils.getPageXY(dragEvent);\n\n page.x += origin.x;\n page.y += origin.y;\n\n const horizontal = (page.x > rect.left) && (page.x < rect.right);\n const vertical = (page.y > rect.top ) && (page.y < rect.bottom);\n\n dropped = horizontal && vertical;\n }\n\n const dragRect = draggable.getRect(draggableElement);\n\n if (dragRect && dropOverlap === 'center') {\n const cx = dragRect.left + dragRect.width / 2;\n const cy = dragRect.top + dragRect.height / 2;\n\n dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom;\n }\n\n if (dragRect && utils.is.number(dropOverlap)) {\n const overlapArea = (Math.max(0, Math.min(rect.right , dragRect.right ) - Math.max(rect.left, dragRect.left))\n * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top , dragRect.top )));\n\n const overlapRatio = overlapArea / (dragRect.width * dragRect.height);\n\n dropped = overlapRatio >= dropOverlap;\n }\n\n if (this.options.drop.checker) {\n dropped = this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement);\n }\n\n return dropped;\n};\n\nInteractable.signals.on('unset', function ({ interactable }) {\n interactable.dropzone(false);\n});\n\nInteractable.settingsMethods.push('dropChecker');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.dropTarget = null; // the dropzone a drag target might be dropped into\n interaction.dropElement = null; // the element at the time of checking\n interaction.prevDropTarget = null; // the dropzone that was recently dragged away from\n interaction.prevDropElement = null; // the element at the time of checking\n interaction.dropEvents = null; // the dropEvents related to the current drag event\n\n interaction.activeDrops = {\n dropzones: [], // the dropzones that are mentioned below\n elements : [], // elements of dropzones that accept the target draggable\n rects : [], // the rects of the elements mentioned above\n };\n\n});\n\nInteraction.signals.on('stop', function ({ interaction }) {\n interaction.dropTarget = interaction.dropElement =\n interaction.prevDropTarget = interaction.prevDropElement = null;\n});\n\n/*\\\n * interact.dynamicDrop\n [ method ]\n *\n * Returns or sets whether the dimensions of dropzone elements are\n * calculated on every dragmove or only on dragstart for the default\n * dropChecker\n *\n - newValue (boolean) #optional True to check on each move. False to check only before start\n = (boolean | interact) The current setting or interact\n\\*/\ninteract.dynamicDrop = function (newValue) {\n if (utils.is.bool(newValue)) {\n //if (dragging && dynamicDrop !== newValue && !newValue) {\n //calcRects(dropzones);\n //}\n\n dynamicDrop = newValue;\n\n return interact;\n }\n return dynamicDrop;\n};\n\nutils.merge(Interactable.eventTypes, [\n 'dragenter',\n 'dragleave',\n 'dropactivate',\n 'dropdeactivate',\n 'dropmove',\n 'drop',\n]);\nactions.methodDict.drop = 'dropzone';\n\ndefaultOptions.drop = drop.defaults;\n\nmodule.exports = drop;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst gesture = {\n defaults: {\n enabled : false,\n origin : null,\n restrict: null,\n },\n\n checker: function (pointer, event, interactable, element, interaction) {\n if (interaction.pointerIds.length >= 2) {\n return { name: 'gesture' };\n }\n\n return null;\n },\n\n getCursor: function () {\n return '';\n },\n};\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturestart') { return; }\n iEvent.ds = 0;\n\n interaction.gesture.startDistance = interaction.gesture.prevDistance = iEvent.distance;\n interaction.gesture.startAngle = interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.scale = 1;\n});\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturemove') { return; }\n\n iEvent.ds = iEvent.scale - interaction.gesture.scale;\n\n interaction.target.fire(iEvent);\n\n interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.prevDistance = iEvent.distance;\n\n if (iEvent.scale !== Infinity\n && iEvent.scale !== null\n && iEvent.scale !== undefined\n && !isNaN(iEvent.scale)) {\n\n interaction.gesture.scale = iEvent.scale;\n }\n});\n\n/*\\\n * Interactable.gesturable\n [ method ]\n *\n * Gets or sets whether multitouch gestures can be performed on the\n * Interactable's element\n *\n = (boolean) Indicates if this can be the target of gesture events\n | var isGestureable = interact(element).gesturable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on gesture events (makes the Interactable gesturable)\n = (object) this Interactable\n | interact(element).gesturable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // limit multiple gestures.\n | // See the explanation in @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n\\*/\nInteractable.prototype.gesturable = function (options) {\n if (utils.is.object(options)) {\n this.options.gesture.enabled = options.enabled === false? false: true;\n this.setPerAction('gesture', options);\n this.setOnEvents('gesture', options);\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.gesture.enabled = options;\n\n if (!options) {\n this.ongesturestart = this.ongesturestart = this.ongestureend = null;\n }\n\n return this;\n }\n\n return this.options.gesture;\n};\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action, event, starting, ending, deltaSource }) {\n if (action !== 'gesture') { return; }\n\n const pointers = interaction.pointers;\n\n iEvent.touches = [pointers[0], pointers[1]];\n\n if (starting) {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = 1;\n iEvent.ds = 0;\n iEvent.angle = utils.touchAngle(pointers, undefined, deltaSource);\n iEvent.da = 0;\n }\n else if (ending || event instanceof InteractEvent) {\n iEvent.distance = interaction.prevEvent.distance;\n iEvent.box = interaction.prevEvent.box;\n iEvent.scale = interaction.prevEvent.scale;\n iEvent.ds = iEvent.scale - 1;\n iEvent.angle = interaction.prevEvent.angle;\n iEvent.da = iEvent.angle - interaction.gesture.startAngle;\n }\n else {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = iEvent.distance / interaction.gesture.startDistance;\n iEvent.angle = utils.touchAngle(pointers, interaction.gesture.prevAngle, deltaSource);\n\n iEvent.ds = iEvent.scale - interaction.gesture.prevScale;\n iEvent.da = iEvent.angle - interaction.gesture.prevAngle;\n }\n});\n\nInteraction.signals.on('new', function (interaction) {\n interaction.gesture = {\n start: { x: 0, y: 0 },\n\n startDistance: 0, // distance between two touches of touchStart\n prevDistance : 0,\n distance : 0,\n\n scale: 1, // gesture.distance / gesture.startDistance\n\n startAngle: 0, // angle of line joining two touches\n prevAngle : 0, // angle of the previous gesture event\n };\n});\n\nactions.gesture = gesture;\nactions.names.push('gesture');\nutils.merge(Interactable.eventTypes, [\n 'gesturestart',\n 'gesturemove',\n 'gestureend',\n]);\nactions.methodDict.gesture = 'gesturable';\n\ndefaultOptions.gesture = gesture.defaults;\n\nmodule.exports = gesture;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\n// Less Precision with touch input\nconst defaultMargin = browser.supportsTouch || browser.supportsPointerEvent? 20: 10;\n\nconst resize = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n square: false,\n preserveAspectRatio: false,\n axis: 'xy',\n\n // use default margin\n margin: NaN,\n\n // object with props left, right, top, bottom which are\n // true/false values to resize when the pointer is over that edge,\n // CSS selectors to match the handles for each direction\n // or the Elements for each handle\n edges: null,\n\n // a value of 'none' will limit the resize rect to a minimum of 0x0\n // 'negate' will alow the rect to have negative width/height\n // 'reposition' will keep the width/height positive by swapping\n // the top and bottom edges and/or swapping the left and right edges\n invert: 'none',\n },\n\n checker: function (pointer, event, interactable, element, interaction, rect) {\n if (!rect) { return null; }\n\n const page = utils.extend({}, interaction.curCoords.page);\n const options = interactable.options;\n\n if (options.resize.enabled) {\n const resizeOptions = options.resize;\n const resizeEdges = { left: false, right: false, top: false, bottom: false };\n\n // if using resize.edges\n if (utils.is.object(resizeOptions.edges)) {\n for (const edge in resizeEdges) {\n resizeEdges[edge] = checkResizeEdge(edge,\n resizeOptions.edges[edge],\n page,\n interaction._eventTarget,\n element,\n rect,\n resizeOptions.margin || defaultMargin);\n }\n\n resizeEdges.left = resizeEdges.left && !resizeEdges.right;\n resizeEdges.top = resizeEdges.top && !resizeEdges.bottom;\n\n if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) {\n return {\n name: 'resize',\n edges: resizeEdges,\n };\n }\n }\n else {\n const right = options.resize.axis !== 'y' && page.x > (rect.right - defaultMargin);\n const bottom = options.resize.axis !== 'x' && page.y > (rect.bottom - defaultMargin);\n\n if (right || bottom) {\n return {\n name: 'resize',\n axes: (right? 'x' : '') + (bottom? 'y' : ''),\n };\n }\n }\n }\n\n return null;\n },\n\n cursors: (browser.isIe9OrOlder ? {\n x : 'e-resize',\n y : 's-resize',\n xy: 'se-resize',\n\n top : 'n-resize',\n left : 'w-resize',\n bottom : 's-resize',\n right : 'e-resize',\n topleft : 'se-resize',\n bottomright: 'se-resize',\n topright : 'ne-resize',\n bottomleft : 'ne-resize',\n } : {\n x : 'ew-resize',\n y : 'ns-resize',\n xy: 'nwse-resize',\n\n top : 'ns-resize',\n left : 'ew-resize',\n bottom : 'ns-resize',\n right : 'ew-resize',\n topleft : 'nwse-resize',\n bottomright: 'nwse-resize',\n topright : 'nesw-resize',\n bottomleft : 'nesw-resize',\n }),\n\n getCursor: function (action) {\n if (action.axis) {\n return resize.cursors[action.name + action.axis];\n }\n else if (action.edges) {\n let cursorKey = '';\n const edgeNames = ['top', 'bottom', 'left', 'right'];\n\n for (let i = 0; i < 4; i++) {\n if (action.edges[edgeNames[i]]) {\n cursorKey += edgeNames[i];\n }\n }\n\n return resize.cursors[cursorKey];\n }\n },\n};\n\n// resizestart\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'resizestart' || !interaction.prepared.edges) {\n return;\n }\n\n const startRect = interaction.target.getRect(interaction.element);\n const resizeOptions = interaction.target.options.resize;\n\n /*\n * When using the `resizable.square` or `resizable.preserveAspectRatio` options, resizing from one edge\n * will affect another. E.g. with `resizable.square`, resizing to make the right edge larger will make\n * the bottom edge larger by the same amount. We call these 'linked' edges. Any linked edges will depend\n * on the active edges and the edge being interacted with.\n */\n if (resizeOptions.square || resizeOptions.preserveAspectRatio) {\n const linkedEdges = utils.extend({}, interaction.prepared.edges);\n\n linkedEdges.top = linkedEdges.top || (linkedEdges.left && !linkedEdges.bottom);\n linkedEdges.left = linkedEdges.left || (linkedEdges.top && !linkedEdges.right );\n linkedEdges.bottom = linkedEdges.bottom || (linkedEdges.right && !linkedEdges.top );\n linkedEdges.right = linkedEdges.right || (linkedEdges.bottom && !linkedEdges.left );\n\n interaction.prepared._linkedEdges = linkedEdges;\n }\n else {\n interaction.prepared._linkedEdges = null;\n }\n\n // if using `resizable.preserveAspectRatio` option, record aspect ratio at the start of the resize\n if (resizeOptions.preserveAspectRatio) {\n interaction.resizeStartAspectRatio = startRect.width / startRect.height;\n }\n\n interaction.resizeRects = {\n start : startRect,\n current : utils.extend({}, startRect),\n inverted : utils.extend({}, startRect),\n previous : utils.extend({}, startRect),\n delta : {\n left: 0, right : 0, width : 0,\n top : 0, bottom: 0, height: 0,\n },\n };\n\n iEvent.rect = interaction.resizeRects.inverted;\n iEvent.deltaRect = interaction.resizeRects.delta;\n});\n\n// resizemove\nInteractEvent.signals.on('new', function ({ iEvent, phase, interaction }) {\n if (phase !== 'move' || !interaction.prepared.edges) { return; }\n\n const resizeOptions = interaction.target.options.resize;\n const invert = resizeOptions.invert;\n const invertible = invert === 'reposition' || invert === 'negate';\n\n let edges = interaction.prepared.edges;\n\n const start = interaction.resizeRects.start;\n const current = interaction.resizeRects.current;\n const inverted = interaction.resizeRects.inverted;\n const delta = interaction.resizeRects.delta;\n const previous = utils.extend(interaction.resizeRects.previous, inverted);\n const originalEdges = edges;\n\n let dx = iEvent.dx;\n let dy = iEvent.dy;\n\n if (resizeOptions.preserveAspectRatio || resizeOptions.square) {\n // `resize.preserveAspectRatio` takes precedence over `resize.square`\n const startAspectRatio = resizeOptions.preserveAspectRatio\n ? interaction.resizeStartAspectRatio\n : 1;\n\n edges = interaction.prepared._linkedEdges;\n\n if ((originalEdges.left && originalEdges.bottom)\n || (originalEdges.right && originalEdges.top)) {\n dy = -dx / startAspectRatio;\n }\n else if (originalEdges.left || originalEdges.right ) { dy = dx / startAspectRatio; }\n else if (originalEdges.top || originalEdges.bottom) { dx = dy * startAspectRatio; }\n }\n\n // update the 'current' rect without modifications\n if (edges.top ) { current.top += dy; }\n if (edges.bottom) { current.bottom += dy; }\n if (edges.left ) { current.left += dx; }\n if (edges.right ) { current.right += dx; }\n\n if (invertible) {\n // if invertible, copy the current rect\n utils.extend(inverted, current);\n\n if (invert === 'reposition') {\n // swap edge values if necessary to keep width/height positive\n let swap;\n\n if (inverted.top > inverted.bottom) {\n swap = inverted.top;\n\n inverted.top = inverted.bottom;\n inverted.bottom = swap;\n }\n if (inverted.left > inverted.right) {\n swap = inverted.left;\n\n inverted.left = inverted.right;\n inverted.right = swap;\n }\n }\n }\n else {\n // if not invertible, restrict to minimum of 0x0 rect\n inverted.top = Math.min(current.top, start.bottom);\n inverted.bottom = Math.max(current.bottom, start.top);\n inverted.left = Math.min(current.left, start.right);\n inverted.right = Math.max(current.right, start.left);\n }\n\n inverted.width = inverted.right - inverted.left;\n inverted.height = inverted.bottom - inverted.top ;\n\n for (const edge in inverted) {\n delta[edge] = inverted[edge] - previous[edge];\n }\n\n iEvent.edges = interaction.prepared.edges;\n iEvent.rect = inverted;\n iEvent.deltaRect = delta;\n});\n\n/*\\\n * Interactable.resizable\n [ method ]\n *\n * Gets or sets whether resize actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of resize elements\n | var isResizeable = interact('input[type=text]').resizable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on resize events (object makes the Interactable resizable)\n = (object) This Interactable\n | interact(element).resizable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | edges: {\n | top : true, // Use pointer coords to check for resize.\n | left : false, // Disable resizing from left edge.\n | bottom: '.resize-s',// Resize if pointer target matches selector\n | right : handleEl // Resize if pointer target is the given Element\n | },\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height are adjusted at a 1:1 ratio.\n | square: false,\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height maintain the aspect ratio they had when resizing started.\n | preserveAspectRatio: false,\n |\n | // a value of 'none' will limit the resize rect to a minimum of 0x0\n | // 'negate' will allow the rect to have negative width/height\n | // 'reposition' will keep the width/height positive by swapping\n | // the top and bottom edges and/or swapping the left and right edges\n | invert: 'none' || 'negate' || 'reposition'\n |\n | // limit multiple resizes.\n | // See the explanation in the @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n \\*/\nInteractable.prototype.resizable = function (options) {\n if (utils.is.object(options)) {\n this.options.resize.enabled = options.enabled === false? false: true;\n this.setPerAction('resize', options);\n this.setOnEvents('resize', options);\n\n if (/^x$|^y$|^xy$/.test(options.axis)) {\n this.options.resize.axis = options.axis;\n }\n else if (options.axis === null) {\n this.options.resize.axis = defaultOptions.resize.axis;\n }\n\n if (utils.is.bool(options.preserveAspectRatio)) {\n this.options.resize.preserveAspectRatio = options.preserveAspectRatio;\n }\n else if (utils.is.bool(options.square)) {\n this.options.resize.square = options.square;\n }\n\n return this;\n }\n if (utils.is.bool(options)) {\n this.options.resize.enabled = options;\n\n if (!options) {\n this.onresizestart = this.onresizestart = this.onresizeend = null;\n }\n\n return this;\n }\n return this.options.resize;\n};\n\nfunction checkResizeEdge (name, value, page, element, interactableElement, rect, margin) {\n // false, '', undefined, null\n if (!value) { return false; }\n\n // true value, use pointer coords and element rect\n if (value === true) {\n // if dimensions are negative, \"switch\" edges\n const width = utils.is.number(rect.width )? rect.width : rect.right - rect.left;\n const height = utils.is.number(rect.height)? rect.height : rect.bottom - rect.top ;\n\n if (width < 0) {\n if (name === 'left' ) { name = 'right'; }\n else if (name === 'right') { name = 'left' ; }\n }\n if (height < 0) {\n if (name === 'top' ) { name = 'bottom'; }\n else if (name === 'bottom') { name = 'top' ; }\n }\n\n if (name === 'left' ) { return page.x < ((width >= 0? rect.left: rect.right ) + margin); }\n if (name === 'top' ) { return page.y < ((height >= 0? rect.top : rect.bottom) + margin); }\n\n if (name === 'right' ) { return page.x > ((width >= 0? rect.right : rect.left) - margin); }\n if (name === 'bottom') { return page.y > ((height >= 0? rect.bottom: rect.top ) - margin); }\n }\n\n // the remaining checks require an element\n if (!utils.is.element(element)) { return false; }\n\n return utils.is.element(value)\n // the value is an element to use as a resize handle\n ? value === element\n // otherwise check if element matches value as selector\n : utils.matchesUpTo(element, value, interactableElement);\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.resizeAxes = 'xy';\n});\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action }) {\n if (action !== 'resize' || !interaction.resizeAxes) { return; }\n\n const options = interaction.target.options;\n\n if (options.resize.square) {\n if (interaction.resizeAxes === 'y') {\n iEvent.dx = iEvent.dy;\n }\n else {\n iEvent.dy = iEvent.dx;\n }\n iEvent.axes = 'xy';\n }\n else {\n iEvent.axes = interaction.resizeAxes;\n\n if (interaction.resizeAxes === 'x') {\n iEvent.dy = 0;\n }\n else if (interaction.resizeAxes === 'y') {\n iEvent.dx = 0;\n }\n }\n});\n\nactions.resize = resize;\nactions.names.push('resize');\nutils.merge(Interactable.eventTypes, [\n 'resizestart',\n 'resizemove',\n 'resizeinertiastart',\n 'resizeinertiaresume',\n 'resizeend',\n]);\nactions.methodDict.resize = 'resizable';\n\ndefaultOptions.resize = resize.defaults;\n\nmodule.exports = resize;\n","const raf = require('./utils/raf');\nconst getWindow = require('./utils/window').getWindow;\nconst is = require('./utils/is');\nconst domUtils = require('./utils/domUtils');\nconst Interaction = require('./Interaction');\nconst defaultOptions = require('./defaultOptions');\n\nconst autoScroll = {\n defaults: {\n enabled : false,\n container: null, // the item that is scrolled (Window or HTMLElement)\n margin : 60,\n speed : 300, // the scroll speed in pixels per second\n },\n\n interaction: null,\n i: null, // the handle returned by window.setInterval\n x: 0, y: 0, // Direction each pulse is to scroll in\n\n isScrolling: false,\n prevTime: 0,\n\n start: function (interaction) {\n autoScroll.isScrolling = true;\n raf.cancel(autoScroll.i);\n\n autoScroll.interaction = interaction;\n autoScroll.prevTime = new Date().getTime();\n autoScroll.i = raf.request(autoScroll.scroll);\n },\n\n stop: function () {\n autoScroll.isScrolling = false;\n raf.cancel(autoScroll.i);\n },\n\n // scroll the window by the values in scroll.x/y\n scroll: function () {\n const options = autoScroll.interaction.target.options[autoScroll.interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(autoScroll.interaction.element);\n const now = new Date().getTime();\n // change in time in seconds\n const dt = (now - autoScroll.prevTime) / 1000;\n // displacement\n const s = options.speed * dt;\n\n if (s >= 1) {\n if (is.window(container)) {\n container.scrollBy(autoScroll.x * s, autoScroll.y * s);\n }\n else if (container) {\n container.scrollLeft += autoScroll.x * s;\n container.scrollTop += autoScroll.y * s;\n }\n\n autoScroll.prevTime = now;\n }\n\n if (autoScroll.isScrolling) {\n raf.cancel(autoScroll.i);\n autoScroll.i = raf.request(autoScroll.scroll);\n }\n },\n check: function (interactable, actionName) {\n const options = interactable.options;\n\n return options[actionName].autoScroll && options[actionName].autoScroll.enabled;\n },\n onInteractionMove: function ({ interaction, pointer }) {\n if (!(interaction.interacting()\n && autoScroll.check(interaction.target, interaction.prepared.name))) {\n return;\n }\n\n if (interaction.simulation) {\n autoScroll.x = autoScroll.y = 0;\n return;\n }\n\n let top;\n let right;\n let bottom;\n let left;\n\n const options = interaction.target.options[interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(interaction.element);\n\n if (is.window(container)) {\n left = pointer.clientX < autoScroll.margin;\n top = pointer.clientY < autoScroll.margin;\n right = pointer.clientX > container.innerWidth - autoScroll.margin;\n bottom = pointer.clientY > container.innerHeight - autoScroll.margin;\n }\n else {\n const rect = domUtils.getElementClientRect(container);\n\n left = pointer.clientX < rect.left + autoScroll.margin;\n top = pointer.clientY < rect.top + autoScroll.margin;\n right = pointer.clientX > rect.right - autoScroll.margin;\n bottom = pointer.clientY > rect.bottom - autoScroll.margin;\n }\n\n autoScroll.x = (right ? 1: left? -1: 0);\n autoScroll.y = (bottom? 1: top? -1: 0);\n\n if (!autoScroll.isScrolling) {\n // set the autoScroll properties to those of the target\n autoScroll.margin = options.margin;\n autoScroll.speed = options.speed;\n\n autoScroll.start(interaction);\n }\n },\n};\n\nInteraction.signals.on('stop-active', function () {\n autoScroll.stop();\n});\n\nInteraction.signals.on('action-move', autoScroll.onInteractionMove);\n\ndefaultOptions.perAction.autoScroll = autoScroll.defaults;\n\nmodule.exports = autoScroll;\n","const Interactable = require('../Interactable');\nconst actions = require('../actions/base');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.ignoreFrom\n [ method ]\n *\n * If the target of the `mousedown`, `pointerdown` or `touchstart`\n * event or any of it's parents match the given CSS selector or\n * Element, no drag/resize/gesture is started.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to not ignore any elements\n = (string | Element | object) The current ignoreFrom value or this Interactable\n **\n | interact(element, { ignoreFrom: document.getElementById('no-action') });\n | // or\n | interact(element).ignoreFrom('input, textarea, a');\n\\*/\nInteractable.prototype.ignoreFrom = function (newValue) {\n return this._backCompatOption('ignoreFrom', newValue);\n};\n\n/*\\\n * Interactable.allowFrom\n [ method ]\n *\n * A drag/resize/gesture is started only If the target of the\n * `mousedown`, `pointerdown` or `touchstart` event or any of it's\n * parents match the given CSS selector or Element.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to allow from any element\n = (string | Element | object) The current allowFrom value or this Interactable\n **\n | interact(element, { allowFrom: document.getElementById('drag-handle') });\n | // or\n | interact(element).allowFrom('.handle');\n\\*/\nInteractable.prototype.allowFrom = function (newValue) {\n return this._backCompatOption('allowFrom', newValue);\n};\n\nInteractable.prototype.testIgnore = function (ignoreFrom, interactableElement, element) {\n if (!ignoreFrom || !is.element(element)) { return false; }\n\n if (is.string(ignoreFrom)) {\n return domUtils.matchesUpTo(element, ignoreFrom, interactableElement);\n }\n else if (is.element(ignoreFrom)) {\n return domUtils.nodeContains(ignoreFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testAllow = function (allowFrom, interactableElement, element) {\n if (!allowFrom) { return true; }\n\n if (!is.element(element)) { return false; }\n\n if (is.string(allowFrom)) {\n return domUtils.matchesUpTo(element, allowFrom, interactableElement);\n }\n else if (is.element(allowFrom)) {\n return domUtils.nodeContains(allowFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testIgnoreAllow = function (options, interactableElement, eventTarget) {\n return (!this.testIgnore(options.ignoreFrom, interactableElement, eventTarget)\n && this.testAllow(options.allowFrom, interactableElement, eventTarget));\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (event.buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\n","const interact = require('../interact');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst actions = require('../actions/base');\nconst defaultOptions = require('../defaultOptions');\nconst browser = require('../utils/browser');\nconst scope = require('../scope');\nconst utils = require('../utils');\nconst signals = require('../utils/Signals').new();\n\nrequire('./InteractableMethods');\n\nconst autoStart = {\n signals,\n withinInteractionLimit,\n // Allow this many interactions to happen simultaneously\n maxInteractions: Infinity,\n defaults: {\n perAction: {\n manualStart: false,\n max: Infinity,\n maxPerElement: 1,\n allowFrom: null,\n ignoreFrom: null,\n },\n },\n setActionDefaults: function (action) {\n utils.extend(action.defaults, autoStart.defaults.perAction);\n },\n};\n\n// set cursor style on mousedown\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget }) {\n if (interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\n// set cursor style on mousemove\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget }) {\n if (!interaction.mouse\n || interaction.pointerIsDown\n || interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\nInteraction.signals.on('move', function (arg) {\n const { interaction, event } = arg;\n\n if (!interaction.pointerIsDown\n || interaction.interacting()\n || !interaction.pointerWasMoved\n || !interaction.prepared.name) {\n return;\n }\n\n signals.fire('before-start', arg);\n\n const target = interaction.target;\n\n if (interaction.prepared.name && target) {\n // check manualStart and interaction limit\n if (target.options[interaction.prepared.name].manualStart\n || !withinInteractionLimit(target, interaction.element, interaction.prepared)) {\n interaction.stop(event);\n }\n else {\n interaction.start(interaction.prepared, target, interaction.element);\n }\n }\n});\n\n// Check if the current target supports the action.\n// If so, return the validated action. Otherwise, return null\nfunction validateAction (action, interactable, element, eventTarget) {\n if (utils.is.object(action)\n && interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget)\n && interactable.options[action.name].enabled\n && withinInteractionLimit(interactable, element, action)) {\n return action;\n }\n\n return null;\n}\n\nfunction validateSelector (interaction, pointer, event, matches, matchElements, eventTarget) {\n for (let i = 0, len = matches.length; i < len; i++) {\n const match = matches[i];\n const matchElement = matchElements[i];\n const action = validateAction(match.getAction(pointer, event, interaction, matchElement),\n match,\n matchElement,\n eventTarget);\n\n if (action) {\n return {\n action,\n target: match,\n element: matchElement,\n };\n }\n }\n\n return {};\n}\n\nfunction getActionInfo (interaction, pointer, event, eventTarget) {\n let matches = [];\n let matchElements = [];\n\n let element = eventTarget;\n let action = null;\n\n function pushMatches (interactable, selector, context) {\n const elements = (browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined);\n\n if (utils.matchesSelector(element, selector, elements)) {\n\n matches.push(interactable);\n matchElements.push(element);\n }\n }\n\n while (utils.is.element(element)) {\n matches = [];\n matchElements = [];\n\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && (action = validateAction(elementInteractable.getAction(pointer, event, interaction, element, eventTarget),\n elementInteractable,\n element,\n eventTarget))\n && !elementInteractable.options[action.name].manualStart) {\n return {\n element,\n action,\n target: elementInteractable,\n };\n }\n else {\n scope.interactables.forEachSelector(pushMatches, element);\n\n const actionInfo = validateSelector(interaction, pointer, event, matches, matchElements, eventTarget);\n\n if (actionInfo.action\n && !actionInfo.target.options[actionInfo.action.name].manualStart) {\n return actionInfo;\n }\n }\n\n element = utils.parentNode(element);\n }\n\n return {};\n}\n\nfunction prepare (interaction, { action, target, element }) {\n action = action || {};\n\n if (interaction.target && interaction.target.options.styleCursor) {\n interaction.target._doc.documentElement.style.cursor = '';\n }\n\n interaction.target = target;\n interaction.element = element;\n utils.copyAction(interaction.prepared, action);\n\n if (target && target.options.styleCursor) {\n const cursor = action? actions[action.name].getCursor(action) : '';\n interaction.target._doc.documentElement.style.cursor = cursor;\n }\n\n signals.fire('prepared', { interaction: interaction });\n}\n\nInteraction.signals.on('stop', function ({ interaction }) {\n const target = interaction.target;\n\n if (target && target.options.styleCursor) {\n target._doc.documentElement.style.cursor = '';\n }\n});\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (utils.is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (utils.is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n const buttons = event.buttons || ({\n 0: 1,\n 1: 4,\n 3: 8,\n 4: 16,\n })[event.button];\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\nfunction withinInteractionLimit (interactable, element, action) {\n const options = interactable.options;\n const maxActions = options[action.name].max;\n const maxPerElement = options[action.name].maxPerElement;\n let activeInteractions = 0;\n let targetCount = 0;\n let targetElementCount = 0;\n\n // no actions if any of these values == 0\n if (!(maxActions && maxPerElement && autoStart.maxInteractions)) { return; }\n\n for (let i = 0, len = scope.interactions.length; i < len; i++) {\n const interaction = scope.interactions[i];\n const otherAction = interaction.prepared.name;\n\n if (!interaction.interacting()) { continue; }\n\n activeInteractions++;\n\n if (activeInteractions >= autoStart.maxInteractions) {\n return false;\n }\n\n if (interaction.target !== interactable) { continue; }\n\n targetCount += (otherAction === action.name)|0;\n\n if (targetCount >= maxActions) {\n return false;\n }\n\n if (interaction.element === element) {\n targetElementCount++;\n\n if (otherAction !== action.name || targetElementCount >= maxPerElement) {\n return false;\n }\n }\n }\n\n return autoStart.maxInteractions > 0;\n}\n\n/*\\\n * interact.maxInteractions\n [ method ]\n **\n * Returns or sets the maximum number of concurrent interactions allowed.\n * By default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables\n * and elements, you need to enable it in the draggable, resizable and\n * gesturable `'max'` and `'maxPerElement'` options.\n **\n - newValue (number) #optional Any number. newValue <= 0 means no interactions.\n\\*/\ninteract.maxInteractions = function (newValue) {\n if (utils.is.number(newValue)) {\n autoStart.maxInteractions = newValue;\n\n return this;\n }\n\n return autoStart.maxInteractions;\n};\n\nInteractable.settingsMethods.push('styleCursor');\nInteractable.settingsMethods.push('actionChecker');\nInteractable.settingsMethods.push('ignoreFrom');\nInteractable.settingsMethods.push('allowFrom');\n\ndefaultOptions.base.actionChecker = null;\ndefaultOptions.base.styleCursor = true;\n\nutils.extend(defaultOptions.perAction, autoStart.defaults.perAction);\n\nmodule.exports = autoStart;\n","const autoStart = require('./base');\nconst Interaction = require('../Interaction');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.delayTimer = null;\n});\n\nautoStart.signals.on('prepared', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.delayTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.target, interaction.element);\n }, delay);\n }\n});\n\nInteraction.signals.on('move', function ({ interaction, duplicate }) {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.delayTimer);\n }\n});\n\n// prevent regular down->move autoStart\nautoStart.signals.on('before-start', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.prepared.name = null;\n }\n});\n","const autoStart = require('./base');\nconst scope = require('../scope');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\n\nconst { matchesSelector, parentNode } = require('../utils/domUtils');\n\nautoStart.setActionDefaults(require('../actions/drag'));\n\nautoStart.signals.on('before-start', function ({ interaction, eventTarget, dx, dy }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // check if a drag is in the correct axis\n const absX = Math.abs(dx);\n const absY = Math.abs(dy);\n const options = interaction.target.options.drag;\n const startAxis = options.startAxis;\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy');\n\n interaction.prepared.axis = options.lockAxis === 'start'\n ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n : options.lockAxis;\n\n // if the movement isn't in the startAxis of the interactable\n if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) {\n // cancel the prepared action\n interaction.prepared.name = null;\n\n // then try to get a drag from another ineractable\n\n if (!interaction.prepared.name) {\n\n let element = eventTarget;\n\n const getDraggable = function (interactable, selector, context) {\n const elements = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n if (interactable === interaction.target) { return; }\n\n if (!options.manualStart\n && !interactable.testIgnoreAllow(options, element, eventTarget)\n && matchesSelector(element, selector, elements)) {\n\n const action = interactable.getAction(interaction.downPointer,\n interaction.downEvent,\n interaction,\n element);\n\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, interactable)\n && autoStart.validateAction(action, interactable, element, eventTarget)) {\n\n return interactable;\n }\n }\n };\n\n let action = null;\n\n // check all interactables\n while (is.element(element)) {\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && elementInteractable !== interaction.target\n && !elementInteractable.options.drag.manualStart) {\n\n action = elementInteractable.getAction(interaction.downPointer, interaction.downEvent, interaction, element);\n }\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, elementInteractable)) {\n\n interaction.prepared.name = 'drag';\n interaction.target = elementInteractable;\n interaction.element = element;\n break;\n }\n\n const selectorInteractable = scope.interactables.forEachSelector(getDraggable, element);\n\n if (selectorInteractable) {\n interaction.prepared.name = 'drag';\n interaction.target = selectorInteractable;\n interaction.element = element;\n break;\n }\n\n element = parentNode(element);\n }\n }\n }\n});\n\nfunction checkStartAxis (startAxis, interactable) {\n if (!interactable) { return false; }\n\n const thisAxis = interactable.options.drag.startAxis;\n\n return (startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis);\n}\n","require('./base').setActionDefaults(require('../actions/gesture'));\n","require('./base').setActionDefaults(require('../actions/resize'));\n","module.exports = {\n base: {\n accept : null,\n preventDefault: 'auto',\n deltaSource : 'page',\n },\n\n perAction: {\n origin: { x: 0, y: 0 },\n\n // only allow left button by default\n // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n mouseButtons: 1,\n\n inertia: {\n enabled : false,\n resistance : 10, // the lambda in exponential decay\n minSpeed : 100, // target speed must be above this for inertia to start\n endSpeed : 10, // the speed at which inertia is slow enough to stop\n allowResume : true, // allow resuming an action in inertia phase\n smoothEndDuration: 300, // animate to snap/restrict endOnly if there's no inertia\n },\n },\n};\n","/* browser entry point */\n\n// Legacy browser support\nrequire('./legacyBrowsers');\n\n// inertia\nrequire('./inertia');\n\n// modifiers\nrequire('./modifiers/snap');\nrequire('./modifiers/restrict');\n\n// pointerEvents\nrequire('./pointerEvents/base');\nrequire('./pointerEvents/holdRepeat');\nrequire('./pointerEvents/interactableTargets');\n\n// delay\nrequire('./autoStart/delay');\n\n// actions\nrequire('./actions/gesture');\nrequire('./actions/resize');\nrequire('./actions/drag');\nrequire('./actions/drop');\n\n// load these modifiers after resize is loaded\nrequire('./modifiers/snapSize');\nrequire('./modifiers/restrictEdges');\nrequire('./modifiers/restrictSize');\n\n// autoStart actions\nrequire('./autoStart/gesture');\nrequire('./autoStart/resize');\nrequire('./autoStart/drag');\n\n// Interactable preventDefault setting\nrequire('./interactablePreventDefault.js');\n\n// autoScroll\nrequire('./autoScroll');\n\n// export interact\nmodule.exports = require('./interact');\n","const InteractEvent = require('./InteractEvent');\nconst Interaction = require('./Interaction');\nconst modifiers = require('./modifiers');\nconst utils = require('./utils');\nconst animationFrame = require('./utils/raf');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.inertiaStatus = {\n active : false,\n smoothEnd : false,\n allowResume: false,\n\n startEvent: null,\n upCoords : {},\n\n xe: 0, ye: 0,\n sx: 0, sy: 0,\n\n t0: 0,\n vx0: 0, vys: 0,\n duration: 0,\n\n lambda_v0: 0,\n one_ve_v0: 0,\n i : null,\n };\n\n interaction.boundInertiaFrame = () => inertiaFrame .apply(interaction);\n interaction.boundSmoothEndFrame = () => smoothEndFrame.apply(interaction);\n});\n\nInteraction.signals.on('down', function ({ interaction, event, pointer, eventTarget }) {\n const status = interaction.inertiaStatus;\n\n // Check if the down event hits the current inertia target\n if (status.active) {\n let element = eventTarget;\n\n // climb up the DOM tree from the event target\n while (utils.is.element(element)) {\n\n // if interaction element is the current inertia target element\n if (element === interaction.element) {\n // stop inertia\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n\n // update pointers to the down event's coordinates\n interaction.updatePointer(pointer);\n utils.setCoords(interaction.curCoords, interaction.pointers);\n\n // fire appropriate signals\n const signalArg = { interaction };\n Interaction.signals.fire('before-action-move', signalArg);\n Interaction.signals.fire('action-resume' , signalArg);\n\n // fire a reume event\n const resumeEvent = new InteractEvent(interaction,\n event,\n interaction.prepared.name,\n 'inertiaresume',\n interaction.element);\n\n interaction.target.fire(resumeEvent);\n interaction.prevEvent = resumeEvent;\n modifiers.resetStatuses(interaction.modifierStatuses);\n\n utils.copyCoords(interaction.prevCoords, interaction.curCoords);\n break;\n }\n\n element = utils.parentNode(element);\n }\n }\n});\n\nInteraction.signals.on('up', function ({ interaction, event }) {\n const status = interaction.inertiaStatus;\n\n if (!interaction.interacting() || status.active) { return; }\n\n const target = interaction.target;\n const options = target && target.options;\n const inertiaOptions = options && interaction.prepared.name && options[interaction.prepared.name].inertia;\n\n const now = new Date().getTime();\n const statuses = {};\n const page = utils.extend({}, interaction.curCoords.page);\n const pointerSpeed = interaction.pointerDelta.client.speed;\n\n let smoothEnd = false;\n let modifierResult;\n\n // check if inertia should be started\n const inertiaPossible = (inertiaOptions && inertiaOptions.enabled\n && interaction.prepared.name !== 'gesture'\n && event !== status.startEvent);\n\n const inertia = (inertiaPossible\n && (now - interaction.curCoords.timeStamp) < 50\n && pointerSpeed > inertiaOptions.minSpeed\n && pointerSpeed > inertiaOptions.endSpeed);\n\n const modifierArg = {\n interaction,\n pageCoords: page,\n statuses,\n preEnd: true,\n requireEndOnly: true,\n };\n\n // smoothEnd\n if (inertiaPossible && !inertia) {\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n if (modifierResult.shouldMove && modifierResult.locked) {\n smoothEnd = true;\n }\n }\n\n if (!(inertia || smoothEnd)) { return; }\n\n utils.copyCoords(status.upCoords, interaction.curCoords);\n\n interaction.pointers[0] = status.startEvent =\n new InteractEvent(interaction, event, interaction.prepared.name, 'inertiastart', interaction.element);\n\n status.t0 = now;\n\n status.active = true;\n status.allowResume = inertiaOptions.allowResume;\n interaction.simulation = status;\n\n target.fire(status.startEvent);\n\n if (inertia) {\n status.vx0 = interaction.pointerDelta.client.vx;\n status.vy0 = interaction.pointerDelta.client.vy;\n status.v0 = pointerSpeed;\n\n calcInertia(interaction, status);\n\n utils.extend(page, interaction.curCoords.page);\n\n page.x += status.xe;\n page.y += status.ye;\n\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n status.modifiedXe += modifierResult.dx;\n status.modifiedYe += modifierResult.dy;\n\n status.i = animationFrame.request(interaction.boundInertiaFrame);\n }\n else {\n status.smoothEnd = true;\n status.xe = modifierResult.dx;\n status.ye = modifierResult.dy;\n\n status.sx = status.sy = 0;\n\n status.i = animationFrame.request(interaction.boundSmoothEndFrame);\n }\n});\n\nInteraction.signals.on('stop-active', function ({ interaction }) {\n const status = interaction.inertiaStatus;\n\n if (status.active) {\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n }\n});\n\nfunction calcInertia (interaction, status) {\n const inertiaOptions = interaction.target.options[interaction.prepared.name].inertia;\n const lambda = inertiaOptions.resistance;\n const inertiaDur = -Math.log(inertiaOptions.endSpeed / status.v0) / lambda;\n\n status.x0 = interaction.prevEvent.pageX;\n status.y0 = interaction.prevEvent.pageY;\n status.t0 = status.startEvent.timeStamp / 1000;\n status.sx = status.sy = 0;\n\n status.modifiedXe = status.xe = (status.vx0 - inertiaDur) / lambda;\n status.modifiedYe = status.ye = (status.vy0 - inertiaDur) / lambda;\n status.te = inertiaDur;\n\n status.lambda_v0 = lambda / status.v0;\n status.one_ve_v0 = 1 - inertiaOptions.endSpeed / status.v0;\n}\n\nfunction inertiaFrame () {\n updateInertiaCoords(this);\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n\n const status = this.inertiaStatus;\n const options = this.target.options[this.prepared.name].inertia;\n const lambda = options.resistance;\n const t = new Date().getTime() / 1000 - status.t0;\n\n if (t < status.te) {\n\n const progress = 1 - (Math.exp(-lambda * t) - status.lambda_v0) / status.one_ve_v0;\n\n if (status.modifiedXe === status.xe && status.modifiedYe === status.ye) {\n status.sx = status.xe * progress;\n status.sy = status.ye * progress;\n }\n else {\n const quadPoint = utils.getQuadraticCurvePoint(0, 0,\n status.xe,\n status.ye,\n status.modifiedXe,\n status.modifiedYe,\n progress);\n\n status.sx = quadPoint.x;\n status.sy = quadPoint.y;\n }\n\n this.doMove();\n\n status.i = animationFrame.request(this.boundInertiaFrame);\n }\n else {\n status.sx = status.modifiedXe;\n status.sy = status.modifiedYe;\n\n this.doMove();\n this.end(status.startEvent);\n status.active = false;\n this.simulation = null;\n }\n\n utils.copyCoords(this.prevCoords, this.curCoords);\n}\n\nfunction smoothEndFrame () {\n updateInertiaCoords(this);\n\n const status = this.inertiaStatus;\n const t = new Date().getTime() - status.t0;\n const duration = this.target.options[this.prepared.name].inertia.smoothEndDuration;\n\n if (t < duration) {\n status.sx = utils.easeOutQuad(t, 0, status.xe, duration);\n status.sy = utils.easeOutQuad(t, 0, status.ye, duration);\n\n this.pointerMove(status.startEvent, status.startEvent);\n\n status.i = animationFrame.request(this.boundSmoothEndFrame);\n }\n else {\n status.sx = status.xe;\n status.sy = status.ye;\n\n this.pointerMove(status.startEvent, status.startEvent);\n this.end(status.startEvent);\n\n status.smoothEnd =\n status.active = false;\n this.simulation = null;\n }\n}\n\nfunction updateInertiaCoords (interaction) {\n const status = interaction.inertiaStatus;\n\n // return if inertia isn't running\n if (!status.active) { return; }\n\n const pageUp = status.upCoords.page;\n const clientUp = status.upCoords.client;\n\n utils.setCoords(interaction.curCoords, [ {\n pageX : pageUp.x + status.sx,\n pageY : pageUp.y + status.sy,\n clientX: clientUp.x + status.sx,\n clientY: clientUp.y + status.sy,\n } ]);\n}\n","const browser = require('./utils/browser');\nconst events = require('./utils/events');\nconst utils = require('./utils');\nconst scope = require('./scope');\nconst Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\n\nconst globalEvents = {};\n\n/*\\\n * interact\n [ method ]\n *\n * The methods of this variable can be used to set elements as\n * interactables and also to change various default settings.\n *\n * Calling it as a function and passing an element or a valid CSS selector\n * string returns an Interactable object which has various methods to\n * configure it.\n *\n - element (Element | string) The HTML or SVG Element to interact with or CSS selector\n = (object) An @Interactable\n *\n > Usage\n | interact('#draggable').draggable(true);\n |\n | var rectables = interact('rect');\n | rectables\n | .gesturable(true)\n | .on('gesturemove', function (event) {\n | // ...\n | });\n\\*/\nfunction interact (element, options) {\n let interactable = scope.interactables.get(element, options);\n\n if (!interactable) {\n interactable = new Interactable(element, options);\n interactable.events.global = globalEvents;\n }\n\n return interactable;\n}\n\n/*\\\n * interact.isSet\n [ method ]\n *\n * Check if an element has been set\n - element (Element) The Element being searched for\n = (boolean) Indicates if the element or CSS selector was previously passed to interact\n\\*/\ninteract.isSet = function (element, options) {\n return scope.interactables.indexOfElement(element, options && options.context) !== -1;\n};\n\n/*\\\n * interact.on\n [ method ]\n *\n * Adds a global listener for an InteractEvent or adds a DOM event to\n * `document`\n *\n - type (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) interact\n\\*/\ninteract.on = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.on(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.on(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n // if it is an InteractEvent type, add listener to globalEvents\n if (utils.contains(Interactable.eventTypes, type)) {\n // if this type of event was never bound\n if (!globalEvents[type]) {\n globalEvents[type] = [listener];\n }\n else {\n globalEvents[type].push(listener);\n }\n }\n // If non InteractEvent type, addEventListener to document\n else {\n events.add(scope.document, type, listener, { options });\n }\n\n return interact;\n};\n\n/*\\\n * interact.off\n [ method ]\n *\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n - type (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) interact\n \\*/\ninteract.off = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.off(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.off(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n if (!utils.contains(Interactable.eventTypes, type)) {\n events.remove(scope.document, type, listener, options);\n }\n else {\n let index;\n\n if (type in globalEvents\n && (index = utils.indexOf(globalEvents[type], listener)) !== -1) {\n globalEvents[type].splice(index, 1);\n }\n }\n\n return interact;\n};\n\n/*\\\n * interact.debug\n [ method ]\n *\n * Returns an object which exposes internal data\n = (object) An object with properties that outline the current state and expose internal functions and variables\n\\*/\ninteract.debug = function () {\n return scope;\n};\n\n// expose the functions used to calculate multi-touch properties\ninteract.getPointerAverage = utils.pointerAverage;\ninteract.getTouchBBox = utils.touchBBox;\ninteract.getTouchDistance = utils.touchDistance;\ninteract.getTouchAngle = utils.touchAngle;\n\ninteract.getElementRect = utils.getElementRect;\ninteract.getElementClientRect = utils.getElementClientRect;\ninteract.matchesSelector = utils.matchesSelector;\ninteract.closest = utils.closest;\n\n/*\\\n * interact.supportsTouch\n [ method ]\n *\n = (boolean) Whether or not the browser supports touch input\n\\*/\ninteract.supportsTouch = function () {\n return browser.supportsTouch;\n};\n\n/*\\\n * interact.supportsPointerEvent\n [ method ]\n *\n = (boolean) Whether or not the browser supports PointerEvents\n\\*/\ninteract.supportsPointerEvent = function () {\n return browser.supportsPointerEvent;\n};\n\n/*\\\n * interact.stop\n [ method ]\n *\n * Cancels all interactions (end events are not fired)\n *\n - event (Event) An event on which to call preventDefault()\n = (object) interact\n\\*/\ninteract.stop = function (event) {\n for (let i = scope.interactions.length - 1; i >= 0; i--) {\n scope.interactions[i].stop(event);\n }\n\n return interact;\n};\n\n/*\\\n * interact.pointerMoveTolerance\n [ method ]\n * Returns or sets the distance the pointer must be moved before an action\n * sequence occurs. This also affects tolerance for tap events.\n *\n - newValue (number) #optional The movement from the start position must be greater than this value\n = (number | Interactable) The current setting or interact\n\\*/\ninteract.pointerMoveTolerance = function (newValue) {\n if (utils.is.number(newValue)) {\n Interaction.pointerMoveTolerance = newValue;\n\n return this;\n }\n\n return Interaction.pointerMoveTolerance;\n};\n\ninteract.addDocument = scope.addDocument;\ninteract.removeDocument = scope.removeDocument;\n\nscope.interact = interact;\n\nmodule.exports = interact;\n","const Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\nconst scope = require('./scope');\nconst is = require('./utils/is');\nconst events = require('./utils/events');\n\nconst { nodeContains, matchesSelector } = require('./utils/domUtils');\n\n/*\\\n * Interactable.preventDefault\n [ method ]\n *\n * Returns or sets whether to prevent the browser's default behaviour\n * in response to pointer events. Can be set to:\n * - `'always'` to always prevent\n * - `'never'` to never prevent\n * - `'auto'` to let interact.js try to determine what would be best\n *\n - newValue (string) #optional `true`, `false` or `'auto'`\n = (string | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.preventDefault = function (newValue) {\n if (/^(always|never|auto)$/.test(newValue)) {\n this.options.preventDefault = newValue;\n return this;\n }\n\n if (is.bool(newValue)) {\n this.options.preventDefault = newValue? 'always' : 'never';\n return this;\n }\n\n return this.options.preventDefault;\n};\n\nInteractable.prototype.checkAndPreventDefault = function (event) {\n const setting = this.options.preventDefault;\n\n if (setting === 'never') { return; }\n\n if (setting === 'always') {\n event.preventDefault();\n return;\n }\n\n // setting === 'auto'\n\n // don't preventDefault if the browser supports passiveEvents\n // CSS touch-action and user-selecct should be used instead\n if (events.supportsOptions) {\n return;\n }\n\n // don't preventDefault of pointerdown events\n if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) {\n return;\n }\n\n // don't preventDefault on editable elements\n if (is.element(event.target)\n && matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) {\n return;\n }\n\n event.preventDefault();\n};\n\nfunction onInteractionEvent ({ interaction, event }) {\n if (interaction.target) {\n interaction.target.checkAndPreventDefault(event);\n }\n}\n\nfor (const eventSignal of ['down', 'move', 'up', 'cancel']) {\n Interaction.signals.on(eventSignal, onInteractionEvent);\n}\n\n// prevent native HTML5 drag on interact.js target elements\nInteraction.docEvents.dragstart = function preventNativeDrag (event) {\n for (const interaction of scope.interactions) {\n\n if (interaction.element\n && (interaction.element === event.target\n || nodeContains(interaction.element, event.target))) {\n\n interaction.target.checkAndPreventDefault(event);\n return;\n }\n }\n};\n","const scope = require('./scope');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst iFinder = require('./utils/interactionFinder');\nconst pointerEvents = require('./pointerEvents/base');\n\nconst { window } = require('./utils/window');\n\nconst toString = Object.prototype.toString;\n\nif (!window.Array.isArray) {\n window.Array.isArray = function (obj) {\n return toString.call(obj) === '[object Array]';\n };\n}\n\nif (!String.prototype.trim) {\n String.prototype.trim = function () {\n return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n };\n}\n\n// http://www.quirksmode.org/dom/events/click.html\n// >Events leading to dblclick\n//\n// IE8 doesn't fire down event before dblclick.\n// This workaround tries to fire a tap and doubletap after dblclick\nfunction onIE8Dblclick (event) {\n const eventTarget = event.target;\n const interaction = iFinder.search(event, event.type, eventTarget);\n\n if (!interaction) { return; }\n\n if (interaction.prevTap\n && event.clientX === interaction.prevTap.clientX\n && event.clientY === interaction.prevTap.clientY\n && eventTarget === interaction.prevTap.target) {\n\n interaction.downTargets[0] = eventTarget;\n interaction.downTimes [0] = new Date().getTime();\n\n pointerEvents.fire({\n interaction,\n event,\n eventTarget,\n pointer: event,\n type: 'tap',\n });\n }\n}\n\nif (browser.isIE8) {\n const selectFix = function (event) {\n for (const interaction of scope.interactions) {\n if (interaction.interacting()) {\n interaction.target.checkAndPreventDefault(event);\n }\n }\n };\n\n const onDocIE8 = function onDocIE8 ({ doc, win }, signalName) {\n const eventMethod = signalName.indexOf('listen') === 0\n ? events.add : events.remove;\n\n // For IE's lack of Event#preventDefault\n eventMethod(doc, 'selectstart', selectFix);\n\n if (pointerEvents) {\n eventMethod(doc, 'dblclick', onIE8Dblclick);\n }\n };\n\n scope.signals.on('add-document' , onDocIE8);\n scope.signals.on('remove-document', onDocIE8);\n}\n\nmodule.exports = null;\n","const InteractEvent = require('../InteractEvent');\nconst Interaction = require('../Interaction');\nconst extend = require('../utils/extend');\n\nconst modifiers = {\n names: [],\n\n setOffsets: function (arg) {\n const { interaction, pageCoords: page } = arg;\n const { target, element, startOffset } = interaction;\n const rect = target.getRect(element);\n\n if (rect) {\n startOffset.left = page.x - rect.left;\n startOffset.top = page.y - rect.top;\n\n startOffset.right = rect.right - page.x;\n startOffset.bottom = rect.bottom - page.y;\n\n if (!('width' in rect)) { rect.width = rect.right - rect.left; }\n if (!('height' in rect)) { rect.height = rect.bottom - rect.top ; }\n }\n else {\n startOffset.left = startOffset.top = startOffset.right = startOffset.bottom = 0;\n }\n\n arg.rect = rect;\n arg.interactable = target;\n arg.element = element;\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n\n arg.options = target.options[interaction.prepared.name][modifierName];\n\n if (!arg.options) {\n continue;\n }\n\n interaction.modifierOffsets[modifierName] = modifiers[modifierName].setOffset(arg);\n }\n },\n\n setAll: function (arg) {\n const { interaction, statuses, preEnd, requireEndOnly } = arg;\n const coords = extend({}, arg.pageCoords);\n const result = {\n dx: 0,\n dy: 0,\n changed: false,\n locked: false,\n shouldMove: true,\n };\n\n for (const modifierName of modifiers.names) {\n const modifier = modifiers[modifierName];\n const options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!shouldDo(options, preEnd, requireEndOnly)) { continue; }\n\n arg.status = arg.status = statuses[modifierName];\n arg.options = options;\n arg.offset = arg.interaction.modifierOffsets[modifierName];\n\n modifier.set(arg);\n\n if (arg.status.locked) {\n coords.x += arg.status.dx;\n coords.y += arg.status.dy;\n\n result.dx += arg.status.dx;\n result.dy += arg.status.dy;\n\n result.locked = true;\n }\n }\n\n // a move should be fired if:\n // - there are no modifiers enabled,\n // - no modifiers are \"locked\" i.e. have changed the pointer's coordinates, or\n // - the locked coords have changed since the last pointer move\n result.shouldMove = !arg.status || !result.locked || arg.status.changed;\n\n return result;\n },\n\n resetStatuses: function (statuses) {\n for (const modifierName of modifiers.names) {\n const status = statuses[modifierName] || {};\n\n status.dx = status.dy = 0;\n status.modifiedX = status.modifiedY = NaN;\n status.locked = false;\n status.changed = true;\n\n statuses[modifierName] = status;\n }\n\n return statuses;\n },\n\n start: function ({ interaction }, signalName) {\n const arg = {\n interaction,\n pageCoords: (signalName === 'action-resume' ?\n interaction.curCoords : interaction.startCoords).page,\n startOffset: interaction.startOffset,\n statuses: interaction.modifierStatuses,\n preEnd: false,\n requireEndOnly: false,\n };\n\n modifiers.setOffsets(arg);\n modifiers.resetStatuses(arg.statuses);\n\n arg.pageCoords = extend({}, interaction.startCoords.page);\n interaction.modifierResult = modifiers.setAll(arg);\n },\n};\n\nInteraction.signals.on('new', function (interaction) {\n interaction.startOffset = { left: 0, right: 0, top: 0, bottom: 0 };\n interaction.modifierOffsets = {};\n interaction.modifierStatuses = modifiers.resetStatuses({});\n interaction.modifierResult = null;\n});\n\nInteraction.signals.on('action-start' , modifiers.start);\nInteraction.signals.on('action-resume', modifiers.start);\n\nInteraction.signals.on('before-action-move', function ({ interaction, preEnd, interactingBeforeMove }) {\n const modifierResult = modifiers.setAll({\n interaction,\n preEnd,\n pageCoords: interaction.curCoords.page,\n statuses: interaction.modifierStatuses,\n requireEndOnly: false,\n });\n\n // don't fire an action move if a modifier would keep the event in the same\n // cordinates as before\n if (!modifierResult.shouldMove && interactingBeforeMove) {\n interaction._dontFireMove = true;\n }\n\n interaction.modifierResult = modifierResult;\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n for (let i = 0; i < modifiers.names.length; i++) {\n const options = interaction.target.options[interaction.prepared.name][modifiers.names[i]];\n\n // if the endOnly option is true for any modifier\n if (shouldDo(options, true, true)) {\n // fire a move event at the modified coordinates\n interaction.doMove({ event, preEnd: true });\n break;\n }\n }\n});\n\nInteractEvent.signals.on('set-xy', function (arg) {\n const { iEvent, interaction } = arg;\n const modifierArg = extend({}, arg);\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n modifierArg.options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!modifierArg.options) {\n continue;\n }\n\n const modifier = modifiers[modifierName];\n\n modifierArg.status = interaction.modifierStatuses[modifierName];\n\n iEvent[modifierName] = modifier.modifyCoords(modifierArg);\n }\n});\n\nfunction shouldDo (options, preEnd, requireEndOnly) {\n return (options && options.enabled\n && (preEnd || !options.endOnly)\n && (!requireEndOnly || options.endOnly));\n}\n\nmodule.exports = modifiers;\n","const modifiers = require('./index');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst restrict = {\n defaults: {\n enabled : false,\n endOnly : false,\n restriction: null,\n elementRect: null,\n },\n\n setOffset: function ({ rect, startOffset, options }) {\n const elementRect = options && options.elementRect;\n const offset = {};\n\n if (rect && elementRect) {\n offset.left = startOffset.left - (rect.width * elementRect.left);\n offset.top = startOffset.top - (rect.height * elementRect.top);\n\n offset.right = startOffset.right - (rect.width * (1 - elementRect.right));\n offset.bottom = startOffset.bottom - (rect.height * (1 - elementRect.bottom));\n }\n else {\n offset.left = offset.top = offset.right = offset.bottom = 0;\n }\n\n return offset;\n },\n\n set: function ({ pageCoords, interaction, status, options }) {\n if (!options) { return status; }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n\n const restriction = getRestrictionRect(options.restriction, interaction, page);\n\n if (!restriction) { return status; }\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n const rect = restriction;\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n const offset = interaction.modifierOffsets.restrict;\n\n // object is assumed to have\n // x, y, width, height or\n // left, top, right, bottom\n if ('x' in restriction && 'y' in restriction) {\n modifiedX = Math.max(Math.min(rect.x + rect.width - offset.right , page.x), rect.x + offset.left);\n modifiedY = Math.max(Math.min(rect.y + rect.height - offset.bottom, page.y), rect.y + offset.top );\n }\n else {\n modifiedX = Math.max(Math.min(rect.right - offset.right , page.x), rect.left + offset.left);\n modifiedY = Math.max(Math.min(rect.bottom - offset.bottom, page.y), rect.top + offset.top );\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const elementRect = options && options.elementRect;\n\n if (options && options.enabled\n && !(phase === 'start' && elementRect && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n getRestrictionRect,\n};\n\nfunction getRestrictionRect (value, interaction, page) {\n if (utils.is.function(value)) {\n return utils.resolveRectLike(value, interaction.target, interaction.element, [page.x, page.y, interaction]);\n } else {\n return utils.resolveRectLike(value, interaction.target, interaction.element);\n }\n}\n\nmodifiers.restrict = restrict;\nmodifiers.names.push('restrict');\n\ndefaultOptions.perAction.restrict = restrict.defaults;\n\nmodule.exports = restrict;\n","// This module adds the options.resize.restrictEdges setting which sets min and\n// max for the top, left, bottom and right edges of the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictEdges: {\n// inner: { top: 200, left: 200, right: 400, bottom: 400 },\n// outer: { top: 0, left: 0, right: 600, bottom: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst { getRestrictionRect } = require('./restrict');\n\nconst noInner = { top: +Infinity, left: +Infinity, bottom: -Infinity, right: -Infinity };\nconst noOuter = { top: -Infinity, left: -Infinity, bottom: +Infinity, right: +Infinity };\n\nconst restrictEdges = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n offset: null,\n },\n\n setOffset: function ({ interaction, startOffset, options }) {\n if (!options) {\n return utils.extend({}, startOffset);\n }\n\n const offset = getRestrictionRect(options.offset, interaction, interaction.startCoords.page);\n\n if (offset) {\n return {\n top: startOffset.top + offset.y,\n left: startOffset.left + offset.x,\n bottom: startOffset.bottom + offset.y,\n right: startOffset.right + offset.x,\n };\n }\n\n return startOffset;\n },\n\n set: function ({ pageCoords, interaction, status, offset, options }) {\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n const inner = rectUtils.xywhToTlbr(getRestrictionRect(options.inner, interaction, page)) || noInner;\n const outer = rectUtils.xywhToTlbr(getRestrictionRect(options.outer, interaction, page)) || noOuter;\n\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n if (edges.top) {\n modifiedY = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top);\n }\n else if (edges.bottom) {\n modifiedY = Math.max(Math.min(outer.bottom - offset.bottom, page.y), inner.bottom - offset.bottom);\n }\n if (edges.left) {\n modifiedX = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left);\n }\n else if (edges.right) {\n modifiedX = Math.max(Math.min(outer.right - offset.right, page.x), inner.right - offset.right);\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n if (options && options.enabled\n && !(phase === 'start' && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n noInner,\n noOuter,\n getRestrictionRect,\n};\n\nmodifiers.restrictEdges = restrictEdges;\nmodifiers.names.push('restrictEdges');\n\ndefaultOptions.perAction.restrictEdges = restrictEdges.defaults;\nresize.defaults.restrictEdges = restrictEdges.defaults;\n\nmodule.exports = restrictEdges;\n","// This module adds the options.resize.restrictSize setting which sets min and\n// max width and height for the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictSize: {\n// min: { width: -600, height: -600 },\n// max: { width: 600, height: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst restrictEdges = require('./restrictEdges');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst noMin = { width: -Infinity, height: -Infinity };\nconst noMax = { width: +Infinity, height: +Infinity };\n\nconst restrictSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n },\n\n setOffset: function ({ interaction }) {\n return interaction.startOffset;\n },\n\n set: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const rect = rectUtils.xywhToTlbr(interaction.resizeRects.inverted);\n\n const minSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.min, interaction)) || noMin;\n const maxSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.max, interaction)) || noMax;\n\n arg.options = {\n enabled: options.enabled,\n endOnly: options.endOnly,\n inner: utils.extend({}, restrictEdges.noInner),\n outer: utils.extend({}, restrictEdges.noOuter),\n };\n\n if (edges.top) {\n arg.options.inner.top = rect.bottom - minSize.height;\n arg.options.outer.top = rect.bottom - maxSize.height;\n }\n else if (edges.bottom) {\n arg.options.inner.bottom = rect.top + minSize.height;\n arg.options.outer.bottom = rect.top + maxSize.height;\n }\n if (edges.left) {\n arg.options.inner.left = rect.right - minSize.width;\n arg.options.outer.left = rect.right - maxSize.width;\n }\n else if (edges.right) {\n arg.options.inner.right = rect.left + minSize.width;\n arg.options.outer.right = rect.left + maxSize.width;\n }\n\n restrictEdges.set(arg);\n },\n\n modifyCoords: restrictEdges.modifyCoords,\n};\n\nmodifiers.restrictSize = restrictSize;\nmodifiers.names.push('restrictSize');\n\ndefaultOptions.perAction.restrictSize = restrictSize.defaults;\nresize.defaults.restrictSize = restrictSize.defaults;\n\nmodule.exports = restrictSize;\n","const modifiers = require('./index');\nconst interact = require('../interact');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst snap = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n\n relativePoints: null,\n },\n\n setOffset: function ({ interaction, interactable, element, rect, startOffset, options }) {\n const offsets = [];\n const optionsOrigin = utils.rectToXY(utils.resolveRectLike(options.origin));\n const origin = optionsOrigin || utils.getOriginXY(interactable, element, interaction.prepared.name);\n options = options || interactable.options[interaction.prepared.name].snap || {};\n\n let snapOffset;\n\n if (options.offset === 'startCoords') {\n snapOffset = {\n x: interaction.startCoords.page.x - origin.x,\n y: interaction.startCoords.page.y - origin.y,\n };\n }\n else {\n const offsetRect = utils.resolveRectLike(options.offset, interactable, element, [interaction]);\n\n snapOffset = utils.rectToXY(offsetRect) || { x: 0, y: 0 };\n }\n\n if (rect && options.relativePoints && options.relativePoints.length) {\n for (const { x: relativeX, y: relativeY } of options.relativePoints) {\n offsets.push({\n x: startOffset.left - (rect.width * relativeX) + snapOffset.x,\n y: startOffset.top - (rect.height * relativeY) + snapOffset.y,\n });\n }\n }\n else {\n offsets.push(snapOffset);\n }\n\n return offsets;\n },\n\n set: function ({ interaction, pageCoords, status, options, offset: offsets }) {\n const targets = [];\n let target;\n let page;\n let i;\n\n if (status.useStatusXY) {\n page = { x: status.x, y: status.y };\n }\n else {\n const origin = utils.getOriginXY(interaction.target, interaction.element, interaction.prepared.name);\n\n page = utils.extend({}, pageCoords);\n\n page.x -= origin.x;\n page.y -= origin.y;\n }\n\n status.realX = page.x;\n status.realY = page.y;\n\n let len = options.targets? options.targets.length : 0;\n\n for (const { x: offsetX, y: offsetY } of offsets) {\n const relativeX = page.x - offsetX;\n const relativeY = page.y - offsetY;\n\n for (const snapTarget of options.targets) {\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n targets.push({\n x: utils.is.number(target.x) ? (target.x + offsetX) : relativeX,\n y: utils.is.number(target.y) ? (target.y + offsetY) : relativeY,\n\n range: utils.is.number(target.range)? target.range: options.range,\n });\n }\n }\n\n const closest = {\n target: null,\n inRange: false,\n distance: 0,\n range: 0,\n dx: 0,\n dy: 0,\n };\n\n for (i = 0, len = targets.length; i < len; i++) {\n target = targets[i];\n\n const range = target.range;\n const dx = target.x - page.x;\n const dy = target.y - page.y;\n const distance = utils.hypot(dx, dy);\n let inRange = distance <= range;\n\n // Infinite targets count as being out of range\n // compared to non infinite ones that are in range\n if (range === Infinity && closest.inRange && closest.range !== Infinity) {\n inRange = false;\n }\n\n if (!closest.target || (inRange\n // is the closest target in range?\n ? (closest.inRange && range !== Infinity\n // the pointer is relatively deeper in this target\n ? distance / range < closest.distance / closest.range\n // this target has Infinite range and the closest doesn't\n : (range === Infinity && closest.range !== Infinity)\n // OR this target is closer that the previous closest\n || distance < closest.distance)\n // The other is not in range and the pointer is closer to this target\n : (!closest.inRange && distance < closest.distance))) {\n\n closest.target = target;\n closest.distance = distance;\n closest.range = range;\n closest.inRange = inRange;\n closest.dx = dx;\n closest.dy = dy;\n\n status.range = range;\n }\n }\n\n let snapChanged;\n\n if (closest.target) {\n snapChanged = (status.modifiedX !== closest.target.x || status.modifiedY !== closest.target.y);\n\n status.modifiedX = closest.target.x;\n status.modifiedY = closest.target.y;\n }\n else {\n snapChanged = true;\n\n status.modifiedX = NaN;\n status.modifiedY = NaN;\n }\n\n status.dx = closest.dx;\n status.dy = closest.dy;\n\n status.changed = (snapChanged || (closest.inRange && !status.locked));\n status.locked = closest.inRange;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const relativePoints = options && options.relativePoints;\n\n if (options && options.enabled\n && !(phase === 'start' && relativePoints && relativePoints.length)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n }\n\n return {\n range : status.range,\n locked : status.locked,\n x : status.modifiedX,\n y : status.modifiedY,\n realX : status.realX,\n realY : status.realY,\n dx : status.dx,\n dy : status.dy,\n };\n }\n },\n};\n\ninteract.createSnapGrid = function (grid) {\n return function (x, y) {\n const limits = grid.limits || {\n left : -Infinity,\n right : Infinity,\n top : -Infinity,\n bottom: Infinity,\n };\n let offsetX = 0;\n let offsetY = 0;\n\n if (utils.is.object(grid.offset)) {\n offsetX = grid.offset.x;\n offsetY = grid.offset.y;\n }\n\n const gridx = Math.round((x - offsetX) / grid.x);\n const gridy = Math.round((y - offsetY) / grid.y);\n\n const newX = Math.max(limits.left, Math.min(limits.right , gridx * grid.x + offsetX));\n const newY = Math.max(limits.top , Math.min(limits.bottom, gridy * grid.y + offsetY));\n\n return {\n x: newX,\n y: newY,\n range: grid.range,\n };\n };\n};\n\nmodifiers.snap = snap;\nmodifiers.names.push('snap');\n\ndefaultOptions.perAction.snap = snap.defaults;\n\nmodule.exports = snap;\n","// This module allows snapping of the size of targets during resize\n// interactions.\n\nconst modifiers = require('./index');\nconst snap = require('./snap');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\nconst utils = require('../utils/');\n\nconst snapSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n },\n\n setOffset: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.edges;\n\n if (!edges) { return; }\n\n arg.options = {\n relativePoints: [{\n x: edges.left? 0 : 1,\n y: edges.top ? 0 : 1,\n }],\n origin: { x: 0, y: 0 },\n offset: 'self',\n range: options.range,\n };\n\n const offsets = snap.setOffset(arg);\n arg.options = options;\n\n return offsets;\n },\n\n set: function (arg) {\n const { interaction, options, offset, pageCoords } = arg;\n const page = utils.extend({}, pageCoords);\n const relativeX = page.x - offset[0].x;\n const relativeY = page.y - offset[0].y;\n\n arg.options = utils.extend({}, options);\n arg.options.targets = [];\n\n for (const snapTarget of options.targets) {\n let target;\n\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n if ('width' in target && 'height' in target) {\n target.x = target.width;\n target.y = target.height;\n }\n\n arg.options.targets.push(target);\n }\n\n snap.set(arg);\n },\n\n modifyCoords: function (arg) {\n const { options } = arg;\n\n arg.options = utils.extend({}, options);\n arg.options.enabled = options.enabled;\n arg.options.relativePoints = [null];\n\n snap.modifyCoords(arg);\n },\n};\n\nmodifiers.snapSize = snapSize;\nmodifiers.names.push('snapSize');\n\ndefaultOptions.perAction.snapSize = snapSize.defaults;\nresize.defaults.snapSize = snapSize.defaults;\n\nmodule.exports = snapSize;\n","const pointerUtils = require('../utils/pointerUtils');\n\nmodule.exports = class PointerEvent {\n constructor (type, pointer, event, eventTarget, interaction) {\n pointerUtils.pointerExtend(this, event);\n\n if (event !== pointer) {\n pointerUtils.pointerExtend(this, pointer);\n }\n\n this.interaction = interaction;\n\n this.timeStamp = new Date().getTime();\n this.originalEvent = event;\n this.type = type;\n this.pointerId = pointerUtils.getPointerId(pointer);\n this.pointerType = pointerUtils.getPointerType(pointer);\n this.target = eventTarget;\n this.currentTarget = null;\n\n if (type === 'tap') {\n const pointerIndex = interaction.getPointerIndex(pointer);\n this.dt = this.timeStamp - interaction.downTimes[pointerIndex];\n\n const interval = this.timeStamp - interaction.tapTime;\n\n this.double = !!(interaction.prevTap\n && interaction.prevTap.type !== 'doubletap'\n && interaction.prevTap.target === this.target\n && interval < 500);\n }\n else if (type === 'doubletap') {\n this.dt = pointer.timeStamp - interaction.tapTime;\n }\n }\n\n subtractOrigin ({ x: originX, y: originY }) {\n this.pageX -= originX;\n this.pageY -= originY;\n this.clientX -= originX;\n this.clientY -= originY;\n\n return this;\n }\n\n addOrigin ({ x: originX, y: originY }) {\n this.pageX += originX;\n this.pageY += originY;\n this.clientX += originX;\n this.clientY += originY;\n\n return this;\n }\n\n preventDefault () {\n this.originalEvent.preventDefault();\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n};\n","const PointerEvent = require('./PointerEvent');\nconst Interaction = require('../Interaction');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst defaults = require('../defaultOptions');\nconst signals = require('../utils/Signals').new();\nconst { filter } = require('../utils/arr');\n\nconst simpleSignals = [ 'down', 'up', 'cancel' ];\nconst simpleEvents = [ 'down', 'up', 'cancel' ];\n\nconst pointerEvents = {\n PointerEvent,\n fire,\n collectEventTargets,\n signals,\n defaults: {\n holdDuration: 600,\n ignoreFrom : null,\n allowFrom : null,\n origin : { x: 0, y: 0 },\n },\n types: [\n 'down',\n 'move',\n 'up',\n 'cancel',\n 'tap',\n 'doubletap',\n 'hold',\n ],\n};\n\nfunction fire (arg) {\n const {\n interaction, pointer, event, eventTarget,\n type = arg.pointerEvent.type,\n targets = collectEventTargets(arg),\n pointerEvent = new PointerEvent(type, pointer, event, eventTarget, interaction),\n } = arg;\n\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n targets,\n type,\n pointerEvent,\n };\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n\n for (const prop in target.props || {}) {\n pointerEvent[prop] = target.props[prop];\n }\n\n const origin = utils.getOriginXY(target.eventable, target.element);\n\n pointerEvent.subtractOrigin(origin);\n pointerEvent.eventable = target.eventable;\n pointerEvent.currentTarget = target.element;\n\n target.eventable.fire(pointerEvent);\n\n pointerEvent.addOrigin(origin);\n\n if (pointerEvent.immediatePropagationStopped\n || (pointerEvent.propagationStopped\n && (i + 1) < targets.length && targets[i + 1].element !== pointerEvent.currentTarget)) {\n break;\n }\n }\n\n signals.fire('fired', signalArg);\n\n if (type === 'tap') {\n // if pointerEvent should make a double tap, create and fire a doubletap\n // PointerEvent and use that as the prevTap\n const prevTap = pointerEvent.double\n ? fire({\n interaction, pointer, event, eventTarget,\n type: 'doubletap',\n })\n : pointerEvent;\n\n interaction.prevTap = prevTap;\n interaction.tapTime = prevTap.timeStamp;\n }\n\n return pointerEvent;\n}\n\nfunction collectEventTargets ({ interaction, pointer, event, eventTarget, type }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n // do not fire a tap event if the pointer was moved before being lifted\n if (type === 'tap' && (interaction.pointerWasMoved\n // or if the pointerup target is different to the pointerdown target\n || !(interaction.downTargets[pointerIndex] && interaction.downTargets[pointerIndex] === eventTarget))) {\n return [];\n }\n\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n path,\n targets: [],\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (type === 'hold') {\n signalArg.targets = filter(signalArg.targets, target =>\n target.eventable.options.holdDuration === interaction.holdTimers[pointerIndex].duration);\n }\n\n return signalArg.targets;\n}\n\nInteraction.signals.on('update-pointer-down', function ({ interaction, pointerIndex }) {\n interaction.holdTimers[pointerIndex] = { duration: Infinity, timeout: null };\n});\n\nInteraction.signals.on('remove-pointer', function ({ interaction, pointerIndex }) {\n interaction.holdTimers.splice(pointerIndex, 1);\n});\n\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget, duplicateMove }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n if (!duplicateMove && (!interaction.pointerIsDown || interaction.pointerWasMoved)) {\n if (interaction.pointerIsDown) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n\n fire({\n interaction, pointer, event, eventTarget,\n type: 'move',\n });\n }\n});\n\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget, pointerIndex }) {\n // copy event to be used in timeout for IE8\n const eventCopy = browser.isIE8? utils.extend({}, event) : event;\n\n const timer = interaction.holdTimers[pointerIndex];\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'hold',\n targets: [],\n path,\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (!signalArg.targets.length) { return; }\n\n let minDuration = Infinity;\n\n for (let i = 0; i < signalArg.targets.length; i++) {\n const target = signalArg.targets[i];\n const holdDuration = target.eventable.options.holdDuration;\n\n if (holdDuration < minDuration) {\n minDuration = holdDuration;\n }\n }\n\n timer.duration = minDuration;\n timer.timeout = setTimeout(function () {\n fire({\n interaction,\n eventTarget,\n pointer: browser.isIE8? eventCopy : pointer,\n event: eventCopy,\n type: 'hold',\n });\n }, minDuration);\n});\n\nInteraction.signals.on('up', ({ interaction, pointer, event, eventTarget }) => {\n if (!interaction.pointerWasMoved) {\n fire({ interaction, eventTarget, pointer, event, type: 'tap' });\n }\n});\n\n['up', 'cancel'].forEach(function (signalName) {\n Interaction.signals.on(signalName, function ({ interaction, pointerIndex }) {\n if (interaction.holdTimers[pointerIndex]) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n });\n});\n\nfunction createSignalListener (type) {\n return function ({ interaction, pointer, event, eventTarget }) {\n fire({ interaction, eventTarget, pointer, event, type });\n };\n}\n\nfor (let i = 0; i < simpleSignals.length; i++) {\n Interaction.signals.on(simpleSignals[i], createSignalListener(simpleEvents[i]));\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.prevTap = null; // the most recent tap event on this interaction\n interaction.tapTime = 0; // time of the most recent tap event\n interaction.holdTimers = []; // [{ duration, timeout }]\n});\n\ndefaults.pointerEvents = pointerEvents.defaults;\nmodule.exports = pointerEvents;\n","const pointerEvents = require('./base');\nconst Interaction = require('../Interaction');\n\npointerEvents.signals.on('new', onNew);\npointerEvents.signals.on('fired', onFired);\n\nfor (const signal of ['move', 'up', 'cancel', 'endall']) {\n Interaction.signals.on(signal, endHoldRepeat);\n}\n\nfunction onNew ({ pointerEvent }) {\n if (pointerEvent.type !== 'hold') { return; }\n\n pointerEvent.count = (pointerEvent.count || 0) + 1;\n}\n\nfunction onFired ({ interaction, pointerEvent, eventTarget, targets }) {\n if (pointerEvent.type !== 'hold' || !targets.length) { return; }\n\n // get the repeat interval from the first eventable\n const interval = targets[0].eventable.options.holdRepeatInterval;\n\n // don't repeat if the interval is 0 or less\n if (interval <= 0) { return; }\n\n // set a timeout to fire the holdrepeat event\n interaction.holdIntervalHandle = setTimeout(function () {\n pointerEvents.fire({\n interaction,\n eventTarget,\n type: 'hold',\n pointer: pointerEvent,\n event: pointerEvent,\n });\n }, interval);\n}\n\nfunction endHoldRepeat ({ interaction }) {\n // set the interaction's holdStopTime property\n // to stop further holdRepeat events\n if (interaction.holdIntervalHandle) {\n clearInterval(interaction.holdIntervalHandle);\n interaction.holdIntervalHandle = null;\n }\n}\n\n// don't repeat by default\npointerEvents.defaults.holdRepeatInterval = 0;\npointerEvents.types.push('holdrepeat');\n\nmodule.exports = {\n onNew,\n onFired,\n endHoldRepeat,\n};\n","const pointerEvents = require('./base');\nconst Interactable = require('../Interactable');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\nconst scope = require('../scope');\nconst extend = require('../utils/extend');\nconst { merge } = require('../utils/arr');\n\npointerEvents.signals.on('collect-targets', function ({ targets, element, type, eventTarget }) {\n function collectSelectors (interactable, selector, context) {\n const els = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && is.element(element)\n && domUtils.matchesSelector(element, selector, els)\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n const interactable = scope.interactables.get(element);\n\n if (interactable) {\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n scope.interactables.forEachSelector(collectSelectors, element);\n});\n\nInteractable.signals.on('new', function ({ interactable }) {\n interactable.events.getRect = function (element) {\n return interactable.getRect(element);\n };\n});\n\nInteractable.signals.on('set', function ({ interactable, options }) {\n extend(interactable.events.options, pointerEvents.defaults);\n extend(interactable.events.options, options);\n});\n\nmerge(Interactable.eventTypes, pointerEvents.types);\n\nInteractable.prototype.pointerEvents = function (options) {\n extend(this.events.options, options);\n\n return this;\n};\n\nconst __backCompatOption = Interactable.prototype._backCompatOption;\n\nInteractable.prototype._backCompatOption = function (optionName, newValue) {\n const ret = __backCompatOption.call(this, optionName, newValue);\n\n if (ret === this) {\n this.events.options[optionName] = newValue;\n }\n\n return ret;\n};\n\nInteractable.settingsMethods.push('pointerEvents');\n","const utils = require('./utils');\nconst events = require('./utils/events');\nconst signals = require('./utils/Signals').new();\n\nconst scope = {\n signals,\n events,\n utils,\n\n // main document\n document: require('./utils/domObjects').document,\n // all documents being listened to\n documents: [],\n\n addDocument: function (doc, win) {\n // do nothing if document is already known\n if (utils.contains(scope.documents, doc)) { return false; }\n\n win = win || scope.getWindow(doc);\n\n scope.documents.push(doc);\n events.documents.push(doc);\n\n // don't add an unload event for the main document\n // so that the page may be cached in browser history\n if (doc !== scope.document) {\n events.add(win, 'unload', scope.onWindowUnload);\n }\n\n signals.fire('add-document', { doc, win });\n },\n\n removeDocument: function (doc, win) {\n const index = utils.indexOf(scope.documents, doc);\n\n win = win || scope.getWindow(doc);\n\n events.remove(win, 'unload', scope.onWindowUnload);\n\n scope.documents.splice(index, 1);\n events.documents.splice(index, 1);\n\n signals.fire('remove-document', { win, doc });\n },\n\n onWindowUnload: function () {\n scope.removeDocument(this.document, this);\n },\n};\n\nmodule.exports = scope;\n","const { indexOf } = require('./arr');\n\nclass Signals {\n constructor () {\n this.listeners = {\n // signalName: [listeners],\n };\n }\n\n on (name, listener) {\n if (!this.listeners[name]) {\n this.listeners[name] = [listener];\n return;\n }\n\n this.listeners[name].push(listener);\n }\n\n off (name, listener) {\n if (!this.listeners[name]) { return; }\n\n const index = indexOf(this.listeners[name], listener);\n\n if (index !== -1) {\n this.listeners[name].splice(index, 1);\n }\n }\n\n fire (name, arg) {\n const targetListeners = this.listeners[name];\n\n if (!targetListeners) { return; }\n\n for (let i = 0; i < targetListeners.length; i++) {\n if (targetListeners[i](arg, name) === false) {\n return;\n }\n }\n }\n}\n\nSignals.new = function () {\n return new Signals();\n};\n\nmodule.exports = Signals;\n","function indexOf (array, target) {\n for (let i = 0, len = array.length; i < len; i++) {\n if (array[i] === target) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction contains (array, target) {\n return indexOf(array, target) !== -1;\n}\n\nfunction merge (target, source) {\n for (let i = 0; i < source.length; i++) {\n target.push(source[i]);\n }\n\n return target;\n}\n\nfunction filter (array, test) {\n const result = [];\n\n for (let i = 0; i < array.length; i++) {\n if (test(array[i])) {\n result.push(array[i]);\n }\n }\n\n return result;\n}\n\nmodule.exports = {\n indexOf,\n contains,\n merge,\n filter,\n};\n","const { window } = require('./window');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst Element = domObjects.Element;\nconst navigator = window.navigator;\n\nconst browser = {\n // Does the browser support touch input?\n supportsTouch: !!(('ontouchstart' in window) || is.function(window.DocumentTouch)\n && domObjects.document instanceof window.DocumentTouch),\n\n // Does the browser support PointerEvents\n supportsPointerEvent: !!domObjects.PointerEvent,\n\n isIE8: ('attachEvent' in window) && !('addEventListener' in window),\n\n // Opera Mobile must be handled differently\n isOperaMobile: (navigator.appName === 'Opera'\n && browser.supportsTouch\n && navigator.userAgent.match('Presto')),\n\n // scrolling doesn't change the result of getClientRects on iOS 7\n isIOS7: (/iP(hone|od|ad)/.test(navigator.platform)\n && /OS 7[^\\d]/.test(navigator.appVersion)),\n\n isIe9OrOlder: /MSIE (8|9)/.test(navigator.userAgent),\n\n // prefix matchesSelector\n prefixedMatchesSelector: 'matches' in Element.prototype\n ? 'matches': 'webkitMatchesSelector' in Element.prototype\n ? 'webkitMatchesSelector': 'mozMatchesSelector' in Element.prototype\n ? 'mozMatchesSelector': 'oMatchesSelector' in Element.prototype\n ? 'oMatchesSelector': 'msMatchesSelector',\n\n useMatchesSelectorPolyfill: false,\n\n pEventTypes: (domObjects.PointerEvent\n ? (domObjects.PointerEvent === window.MSPointerEvent\n ? {\n up: 'MSPointerUp',\n down: 'MSPointerDown',\n over: 'mouseover',\n out: 'mouseout',\n move: 'MSPointerMove',\n cancel: 'MSPointerCancel',\n }\n : {\n up: 'pointerup',\n down: 'pointerdown',\n over: 'pointerover',\n out: 'pointerout',\n move: 'pointermove',\n cancel: 'pointercancel',\n })\n : null),\n\n // because Webkit and Opera still use 'mousewheel' event type\n wheelEvent: 'onmousewheel' in domObjects.document? 'mousewheel': 'wheel',\n\n};\n\nbrowser.useMatchesSelectorPolyfill = !is.function(Element.prototype[browser.prefixedMatchesSelector]);\n\nmodule.exports = browser;\n","const domObjects = {};\nconst win = require('./window').window;\n\nfunction blank () {}\n\ndomObjects.document = win.document;\ndomObjects.DocumentFragment = win.DocumentFragment || blank;\ndomObjects.SVGElement = win.SVGElement || blank;\ndomObjects.SVGSVGElement = win.SVGSVGElement || blank;\ndomObjects.SVGElementInstance = win.SVGElementInstance || blank;\ndomObjects.Element = win.Element || blank;\ndomObjects.HTMLElement = win.HTMLElement || domObjects.Element;\n\ndomObjects.Event = win.Event;\ndomObjects.Touch = win.Touch || blank;\ndomObjects.PointerEvent = (win.PointerEvent || win.MSPointerEvent);\n\nmodule.exports = domObjects;\n","const win = require('./window');\nconst browser = require('./browser');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst domUtils = {\n nodeContains: function (parent, child) {\n while (child) {\n if (child === parent) {\n return true;\n }\n\n child = child.parentNode;\n }\n\n return false;\n },\n\n closest: function (element, selector) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) { return element; }\n\n element = domUtils.parentNode(element);\n }\n\n return null;\n },\n\n parentNode: function (node) {\n let parent = node.parentNode;\n\n if (is.docFrag(parent)) {\n // skip past #shado-root fragments\n while ((parent = parent.host) && is.docFrag(parent)) {\n continue;\n }\n\n return parent;\n }\n\n return parent;\n },\n\n // taken from http://tanalin.com/en/blog/2012/12/matches-selector-ie8/ and modified\n matchesSelectorPolyfill: browser.useMatchesSelectorPolyfill\n ? function (element, selector, elems) {\n elems = elems || element.parentNode.querySelectorAll(selector);\n\n for (let i = 0, len = elems.length; i < len; i++) {\n if (elems[i] === element) {\n return true;\n }\n }\n\n return false;\n }\n : null,\n\n matchesSelector: function (element, selector, nodeList) {\n if (browser.useMatchesSelectorPolyfill) {\n return domUtils.matchesSelectorPolyfill(element, selector, nodeList);\n }\n\n // remove /deep/ from selectors if shadowDOM polyfill is used\n if (win.window !== win.realWindow) {\n selector = selector.replace(/\\/deep\\//g, ' ');\n }\n\n return element[browser.prefixedMatchesSelector](selector);\n },\n\n // Test for the element that's \"above\" all other qualifiers\n indexOfDeepestElement: function (elements) {\n let deepestZoneParents = [];\n let dropzoneParents = [];\n let dropzone;\n let deepestZone = elements[0];\n let index = deepestZone? 0: -1;\n let parent;\n let child;\n let i;\n let n;\n\n for (i = 1; i < elements.length; i++) {\n dropzone = elements[i];\n\n // an element might belong to multiple selector dropzones\n if (!dropzone || dropzone === deepestZone) {\n continue;\n }\n\n if (!deepestZone) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n // check if the deepest or current are document.documentElement or document.rootElement\n // - if the current dropzone is, do nothing and continue\n if (dropzone.parentNode === dropzone.ownerDocument) {\n continue;\n }\n // - if deepest is, update with the current dropzone and continue to next\n else if (deepestZone.parentNode === dropzone.ownerDocument) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n if (!deepestZoneParents.length) {\n parent = deepestZone;\n while (parent.parentNode && parent.parentNode !== parent.ownerDocument) {\n deepestZoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n }\n\n // if this element is an svg element and the current deepest is\n // an HTMLElement\n if (deepestZone instanceof domObjects.HTMLElement\n && dropzone instanceof domObjects.SVGElement\n && !(dropzone instanceof domObjects.SVGSVGElement)) {\n\n if (dropzone === deepestZone.parentNode) {\n continue;\n }\n\n parent = dropzone.ownerSVGElement;\n }\n else {\n parent = dropzone;\n }\n\n dropzoneParents = [];\n\n while (parent.parentNode !== parent.ownerDocument) {\n dropzoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n\n n = 0;\n\n // get (position of last common ancestor) + 1\n while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) {\n n++;\n }\n\n const parents = [\n dropzoneParents[n - 1],\n dropzoneParents[n],\n deepestZoneParents[n],\n ];\n\n child = parents[0].lastChild;\n\n while (child) {\n if (child === parents[1]) {\n deepestZone = dropzone;\n index = i;\n deepestZoneParents = [];\n\n break;\n }\n else if (child === parents[2]) {\n break;\n }\n\n child = child.previousSibling;\n }\n }\n\n return index;\n },\n\n matchesUpTo: function (element, selector, limit) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) {\n return true;\n }\n\n element = domUtils.parentNode(element);\n\n if (element === limit) {\n return domUtils.matchesSelector(element, selector);\n }\n }\n\n return false;\n },\n\n getActualElement: function (element) {\n return (element instanceof domObjects.SVGElementInstance\n ? element.correspondingUseElement\n : element);\n },\n\n getScrollXY: function (relevantWindow) {\n relevantWindow = relevantWindow || win.window;\n return {\n x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft,\n y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop,\n };\n },\n\n getElementClientRect: function (element) {\n const clientRect = (element instanceof domObjects.SVGElement\n ? element.getBoundingClientRect()\n : element.getClientRects()[0]);\n\n return clientRect && {\n left : clientRect.left,\n right : clientRect.right,\n top : clientRect.top,\n bottom: clientRect.bottom,\n width : clientRect.width || clientRect.right - clientRect.left,\n height: clientRect.height || clientRect.bottom - clientRect.top,\n };\n },\n\n getElementRect: function (element) {\n const clientRect = domUtils.getElementClientRect(element);\n\n if (!browser.isIOS7 && clientRect) {\n const scroll = domUtils.getScrollXY(win.getWindow(element));\n\n clientRect.left += scroll.x;\n clientRect.right += scroll.x;\n clientRect.top += scroll.y;\n clientRect.bottom += scroll.y;\n }\n\n return clientRect;\n },\n\n getPath: function (element) {\n const path = [];\n\n while (element) {\n path.push(element);\n element = domUtils.parentNode(element);\n }\n\n return path;\n },\n\n trySelector: value => {\n if (!is.string(value)) { return false; }\n\n // an exception will be raised if it is invalid\n domObjects.document.querySelector(value);\n return true;\n },\n};\n\nmodule.exports = domUtils;\n","const is = require('./is');\nconst domUtils = require('./domUtils');\nconst pExtend = require('./pointerExtend');\n\nconst { window, getWindow } = require('./window');\nconst { indexOf, contains } = require('./arr');\n\nconst useAttachEvent = ('attachEvent' in window) && !('addEventListener' in window);\nconst addEvent = useAttachEvent? 'attachEvent': 'addEventListener';\nconst removeEvent = useAttachEvent? 'detachEvent': 'removeEventListener';\nconst on = useAttachEvent? 'on': '';\n\nconst elements = [];\nconst targets = [];\nconst attachedListeners = [];\n\n// {\n// type: {\n// selectors: ['selector', ...],\n// contexts : [document, ...],\n// listeners: [[listener, capture, passive], ...]\n// }\n// }\nconst delegatedEvents = {};\n\nconst documents = [];\n\nconst supportsOptions = !useAttachEvent && (() => {\n let supported = false;\n\n window.document.createElement('div').addEventListener('test', null, {\n get capture () { supported = true; },\n });\n\n return supported;\n})();\n\nfunction add (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n let elementIndex = indexOf(elements, element);\n let target = targets[elementIndex];\n\n if (!target) {\n target = {\n events: {},\n typeCount: 0,\n };\n\n elementIndex = elements.push(element) - 1;\n targets.push(target);\n\n attachedListeners.push(useAttachEvent\n ? {\n supplied: [],\n wrapped : [],\n useCount: [],\n }\n : null);\n }\n\n if (!target.events[type]) {\n target.events[type] = [];\n target.typeCount++;\n }\n\n if (!contains(target.events[type], listener)) {\n let ret;\n\n if (useAttachEvent) {\n const { supplied, wrapped, useCount } = attachedListeners[elementIndex];\n const listenerIndex = indexOf(supplied, listener);\n\n const wrappedListener = wrapped[listenerIndex] || function (event) {\n if (!event.immediatePropagationStopped) {\n event.target = event.srcElement;\n event.currentTarget = element;\n\n event.preventDefault = event.preventDefault || preventDef;\n event.stopPropagation = event.stopPropagation || stopProp;\n event.stopImmediatePropagation = event.stopImmediatePropagation || stopImmProp;\n\n if (/mouse|click/.test(event.type)) {\n event.pageX = event.clientX + getWindow(element).document.documentElement.scrollLeft;\n event.pageY = event.clientY + getWindow(element).document.documentElement.scrollTop;\n }\n\n listener(event);\n }\n };\n\n ret = element[addEvent](on + type, wrappedListener, !!options.capture);\n\n if (listenerIndex === -1) {\n supplied.push(listener);\n wrapped.push(wrappedListener);\n useCount.push(1);\n }\n else {\n useCount[listenerIndex]++;\n }\n }\n else {\n ret = element[addEvent](type, listener, supportsOptions? options : !!options.capture);\n }\n target.events[type].push(listener);\n\n return ret;\n }\n}\n\nfunction remove (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const elementIndex = indexOf(elements, element);\n const target = targets[elementIndex];\n\n if (!target || !target.events) {\n return;\n }\n\n let wrappedListener = listener;\n let listeners;\n let listenerIndex;\n\n if (useAttachEvent) {\n listeners = attachedListeners[elementIndex];\n listenerIndex = indexOf(listeners.supplied, listener);\n wrappedListener = listeners.wrapped[listenerIndex];\n }\n\n if (type === 'all') {\n for (type in target.events) {\n if (target.events.hasOwnProperty(type)) {\n remove(element, type, 'all');\n }\n }\n return;\n }\n\n if (target.events[type]) {\n const len = target.events[type].length;\n\n if (listener === 'all') {\n for (let i = 0; i < len; i++) {\n remove(element, type, target.events[type][i], options);\n }\n return;\n }\n else {\n for (let i = 0; i < len; i++) {\n if (target.events[type][i] === listener) {\n element[removeEvent](on + type, wrappedListener, supportsOptions? options : !!options.capture);\n target.events[type].splice(i, 1);\n\n if (useAttachEvent && listeners) {\n listeners.useCount[listenerIndex]--;\n if (listeners.useCount[listenerIndex] === 0) {\n listeners.supplied.splice(listenerIndex, 1);\n listeners.wrapped.splice(listenerIndex, 1);\n listeners.useCount.splice(listenerIndex, 1);\n }\n }\n\n break;\n }\n }\n }\n\n if (target.events[type] && target.events[type].length === 0) {\n target.events[type] = null;\n target.typeCount--;\n }\n }\n\n if (!target.typeCount) {\n targets.splice(elementIndex, 1);\n elements.splice(elementIndex, 1);\n attachedListeners.splice(elementIndex, 1);\n }\n}\n\nfunction addDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n if (!delegatedEvents[type]) {\n delegatedEvents[type] = {\n selectors: [],\n contexts : [],\n listeners: [],\n };\n\n // add delegate listener functions\n for (let i = 0; i < documents.length; i++) {\n add(documents[i], type, delegateListener);\n add(documents[i], type, delegateUseCapture, true);\n }\n }\n\n const delegated = delegatedEvents[type];\n let index;\n\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n break;\n }\n }\n\n if (index === -1) {\n index = delegated.selectors.length;\n\n delegated.selectors.push(selector);\n delegated.contexts .push(context);\n delegated.listeners.push([]);\n }\n\n // keep listener and capture and passive flags\n delegated.listeners[index].push([listener, !!options.capture, options.passive]);\n}\n\nfunction removeDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const delegated = delegatedEvents[type];\n let matchFound = false;\n let index;\n\n if (!delegated) { return; }\n\n // count from last index of delegated to 0\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n // look for matching selector and context Node\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n\n const listeners = delegated.listeners[index];\n\n // each item of the listeners array is an array: [function, capture, passive]\n for (let i = listeners.length - 1; i >= 0; i--) {\n const [fn, capture, passive] = listeners[i];\n\n // check if the listener functions and capture and passive flags match\n if (fn === listener && capture === !!options.capture && passive === options.passive) {\n // remove the listener from the array of listeners\n listeners.splice(i, 1);\n\n // if all listeners for this interactable have been removed\n // remove the interactable from the delegated arrays\n if (!listeners.length) {\n delegated.selectors.splice(index, 1);\n delegated.contexts .splice(index, 1);\n delegated.listeners.splice(index, 1);\n\n // remove delegate function from context\n remove(context, type, delegateListener);\n remove(context, type, delegateUseCapture, true);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegatedEvents[type] = null;\n }\n }\n\n // only remove one listener\n matchFound = true;\n break;\n }\n }\n\n if (matchFound) { break; }\n }\n }\n}\n\n// bound to the interactable context when a DOM event\n// listener is added to a selector interactable\nfunction delegateListener (event, optionalArg) {\n const options = getOptions(optionalArg);\n const fakeEvent = {};\n const delegated = delegatedEvents[event.type];\n const eventTarget = (domUtils.getActualElement(event.path\n ? event.path[0]\n : event.target));\n let element = eventTarget;\n\n // duplicate the event so that currentTarget can be changed\n pExtend(fakeEvent, event);\n\n fakeEvent.originalEvent = event;\n fakeEvent.preventDefault = preventOriginalDefault;\n\n // climb up document tree looking for selector matches\n while (is.element(element)) {\n for (let i = 0; i < delegated.selectors.length; i++) {\n const selector = delegated.selectors[i];\n const context = delegated.contexts[i];\n\n if (domUtils.matchesSelector(element, selector)\n && domUtils.nodeContains(context, eventTarget)\n && domUtils.nodeContains(context, element)) {\n\n const listeners = delegated.listeners[i];\n\n fakeEvent.currentTarget = element;\n\n for (let j = 0; j < listeners.length; j++) {\n const [fn, capture, passive] = listeners[j];\n\n if (capture === !!options.capture && passive === options.passive) {\n fn(fakeEvent);\n }\n }\n }\n }\n\n element = domUtils.parentNode(element);\n }\n}\n\nfunction delegateUseCapture (event) {\n return delegateListener.call(this, event, true);\n}\n\nfunction preventDef () {\n this.returnValue = false;\n}\n\nfunction preventOriginalDefault () {\n this.originalEvent.preventDefault();\n}\n\nfunction stopProp () {\n this.cancelBubble = true;\n}\n\nfunction stopImmProp () {\n this.cancelBubble = true;\n this.immediatePropagationStopped = true;\n}\n\nfunction getOptions (param) {\n return is.object(param)? param : { capture: param };\n}\n\nmodule.exports = {\n add,\n remove,\n\n addDelegate,\n removeDelegate,\n\n delegateListener,\n delegateUseCapture,\n delegatedEvents,\n documents,\n\n useAttachEvent,\n supportsOptions,\n\n _elements: elements,\n _targets: targets,\n _attachedListeners: attachedListeners,\n};\n","module.exports = function extend (dest, source) {\n for (const prop in source) {\n dest[prop] = source[prop];\n }\n return dest;\n};\n","const {\n resolveRectLike,\n rectToXY,\n} = require('./rect');\n\nmodule.exports = function (target, element, action) {\n const actionOptions = target.options[action];\n const actionOrigin = actionOptions && actionOptions.origin;\n const origin = actionOrigin || target.options.origin;\n\n const originRect = resolveRectLike(origin, target, element, [target && element]);\n\n return rectToXY(originRect) || { x: 0, y: 0 };\n};\n","module.exports = (x, y) => Math.sqrt(x * x + y * y);\n","const extend = require('./extend');\nconst win = require('./window');\n\nconst utils = {\n warnOnce: function (method, message) {\n let warned = false;\n\n return function () {\n if (!warned) {\n win.window.console.warn(message);\n warned = true;\n }\n\n return method.apply(this, arguments);\n };\n },\n\n // http://stackoverflow.com/a/5634528/2280888\n _getQBezierValue: function (t, p1, p2, p3) {\n const iT = 1 - t;\n return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3;\n },\n\n getQuadraticCurvePoint: function (startX, startY, cpX, cpY, endX, endY, position) {\n return {\n x: utils._getQBezierValue(position, startX, cpX, endX),\n y: utils._getQBezierValue(position, startY, cpY, endY),\n };\n },\n\n // http://gizma.com/easing/\n easeOutQuad: function (t, b, c, d) {\n t /= d;\n return -c * t*(t-2) + b;\n },\n\n copyAction: function (dest, src) {\n dest.name = src.name;\n dest.axis = src.axis;\n dest.edges = src.edges;\n\n return dest;\n },\n\n is : require('./is'),\n extend : extend,\n hypot : require('./hypot'),\n getOriginXY: require('./getOriginXY'),\n};\n\nextend(utils, require('./arr'));\nextend(utils, require('./domUtils'));\nextend(utils, require('./pointerUtils'));\nextend(utils, require('./rect'));\n\nmodule.exports = utils;\n","const scope = require('../scope');\nconst utils = require('./index');\n\nconst finder = {\n methodOrder: [ 'simulationResume', 'mouseOrPen', 'hasPointer', 'idle' ],\n\n search: function (pointer, eventType, eventTarget) {\n const pointerType = utils.getPointerType(pointer);\n const pointerId = utils.getPointerId(pointer);\n const details = { pointer, pointerId, pointerType, eventType, eventTarget };\n\n for (const method of finder.methodOrder) {\n const interaction = finder[method](details);\n\n if (interaction) {\n return interaction;\n }\n }\n },\n\n // try to resume simulation with a new pointer\n simulationResume: function ({ pointerType, eventType, eventTarget }) {\n if (!/down|start/i.test(eventType)) {\n return null;\n }\n\n for (const interaction of scope.interactions) {\n let element = eventTarget;\n\n if (interaction.simulation && interaction.simulation.allowResume\n && (interaction.pointerType === pointerType)) {\n while (element) {\n // if the element is the interaction element\n if (element === interaction.element) {\n return interaction;\n }\n element = utils.parentNode(element);\n }\n }\n }\n\n return null;\n },\n\n // if it's a mouse or pen interaction\n mouseOrPen: function ({ pointerId, pointerType, eventType }) {\n if (pointerType !== 'mouse' && pointerType !== 'pen') {\n return null;\n }\n\n let firstNonActive;\n\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType) {\n // if it's a down event, skip interactions with running simulations\n if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; }\n\n // if the interaction is active, return it immediately\n if (interaction.interacting()) {\n return interaction;\n }\n // otherwise save it and look for another active interaction\n else if (!firstNonActive) {\n firstNonActive = interaction;\n }\n }\n }\n\n // if no active mouse interaction was found use the first inactive mouse\n // interaction\n if (firstNonActive) {\n return firstNonActive;\n }\n\n // find any mouse or pen interaction.\n // ignore the interaction if the eventType is a *down, and a simulation\n // is active\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType && !(/down/i.test(eventType) && interaction.simulation)) {\n return interaction;\n }\n }\n\n return null;\n },\n\n // get interaction that has this pointer\n hasPointer: function ({ pointerId }) {\n for (const interaction of scope.interactions) {\n if (utils.contains(interaction.pointerIds, pointerId)) {\n return interaction;\n }\n }\n },\n\n // get first idle interaction with a matching pointerType\n idle: function ({ pointerType }) {\n for (const interaction of scope.interactions) {\n // if there's already a pointer held down\n if (interaction.pointerIds.length === 1) {\n const target = interaction.target;\n // don't add this pointer if there is a target interactable and it\n // isn't gesturable\n if (target && !target.options.gesture.enabled) {\n continue;\n }\n }\n // maximum of 2 pointers per interaction\n else if (interaction.pointerIds.length >= 2) {\n continue;\n }\n\n if (!interaction.interacting() && (pointerType === interaction.pointerType)) {\n return interaction;\n }\n }\n\n return null;\n },\n};\n\nmodule.exports = finder;\n","const win = require('./window');\nconst isWindow = require('./isWindow');\n\nconst is = {\n array : () => {},\n\n window : thing => thing === win.window || isWindow(thing),\n\n docFrag : thing => is.object(thing) && thing.nodeType === 11,\n\n object : thing => !!thing && (typeof thing === 'object'),\n\n function: thing => typeof thing === 'function',\n\n number : thing => typeof thing === 'number' ,\n\n bool : thing => typeof thing === 'boolean' ,\n\n string : thing => typeof thing === 'string' ,\n\n element: thing => {\n if (!thing || (typeof thing !== 'object')) { return false; }\n\n const _window = win.getWindow(thing) || win.window;\n\n return (/object|function/.test(typeof _window.Element)\n ? thing instanceof _window.Element //DOM2\n : thing.nodeType === 1 && typeof thing.nodeName === 'string');\n },\n};\n\nis.array = thing => (is.object(thing)\n && (typeof thing.length !== 'undefined')\n && is.function(thing.splice));\n\nmodule.exports = is;\n","module.exports = (thing) => !!(thing && thing.Window) && (thing instanceof thing.Window);\n","function pointerExtend (dest, source) {\n for (const prop in source) {\n const prefixedPropREs = module.exports.prefixedPropREs;\n let deprecated = false;\n\n // skip deprecated prefixed properties\n for (const vendor in prefixedPropREs) {\n if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) {\n deprecated = true;\n break;\n }\n }\n\n if (!deprecated && typeof source[prop] !== 'function') {\n dest[prop] = source[prop];\n }\n }\n return dest;\n}\n\npointerExtend.prefixedPropREs = {\n webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/,\n};\n\nmodule.exports = pointerExtend;\n","const hypot = require('./hypot');\nconst browser = require('./browser');\nconst dom = require('./domObjects');\nconst domUtils = require('./domUtils');\nconst domObjects = require('./domObjects');\nconst is = require('./is');\nconst pointerExtend = require('./pointerExtend');\n\nconst pointerUtils = {\n copyCoords: function (dest, src) {\n dest.page = dest.page || {};\n dest.page.x = src.page.x;\n dest.page.y = src.page.y;\n\n dest.client = dest.client || {};\n dest.client.x = src.client.x;\n dest.client.y = src.client.y;\n\n dest.timeStamp = src.timeStamp;\n },\n\n setCoordDeltas: function (targetObj, prev, cur) {\n targetObj.page.x = cur.page.x - prev.page.x;\n targetObj.page.y = cur.page.y - prev.page.y;\n targetObj.client.x = cur.client.x - prev.client.x;\n targetObj.client.y = cur.client.y - prev.client.y;\n targetObj.timeStamp = cur.timeStamp - prev.timeStamp;\n\n // set pointer velocity\n const dt = Math.max(targetObj.timeStamp / 1000, 0.001);\n\n targetObj.page.speed = hypot(targetObj.page.x, targetObj.page.y) / dt;\n targetObj.page.vx = targetObj.page.x / dt;\n targetObj.page.vy = targetObj.page.y / dt;\n\n targetObj.client.speed = hypot(targetObj.client.x, targetObj.page.y) / dt;\n targetObj.client.vx = targetObj.client.x / dt;\n targetObj.client.vy = targetObj.client.y / dt;\n },\n\n isNativePointer: function (pointer) {\n return (pointer instanceof dom.Event || pointer instanceof dom.Touch);\n },\n\n // Get specified X/Y coords for mouse or event.touches[0]\n getXY: function (type, pointer, xy) {\n xy = xy || {};\n type = type || 'page';\n\n xy.x = pointer[type + 'X'];\n xy.y = pointer[type + 'Y'];\n\n return xy;\n },\n\n getPageXY: function (pointer, page) {\n page = page || {};\n\n // Opera Mobile handles the viewport and scrolling oddly\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n pointerUtils.getXY('screen', pointer, page);\n\n page.x += window.scrollX;\n page.y += window.scrollY;\n }\n else {\n pointerUtils.getXY('page', pointer, page);\n }\n\n return page;\n },\n\n getClientXY: function (pointer, client) {\n client = client || {};\n\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n // Opera Mobile handles the viewport and scrolling oddly\n pointerUtils.getXY('screen', pointer, client);\n }\n else {\n pointerUtils.getXY('client', pointer, client);\n }\n\n return client;\n },\n\n getPointerId: function (pointer) {\n return is.number(pointer.pointerId)? pointer.pointerId : pointer.identifier;\n },\n\n setCoords: function (targetObj, pointers, timeStamp) {\n const pointer = (pointers.length > 1\n ? pointerUtils.pointerAverage(pointers)\n : pointers[0]);\n\n const tmpXY = {};\n\n pointerUtils.getPageXY(pointer, tmpXY);\n targetObj.page.x = tmpXY.x;\n targetObj.page.y = tmpXY.y;\n\n pointerUtils.getClientXY(pointer, tmpXY);\n targetObj.client.x = tmpXY.x;\n targetObj.client.y = tmpXY.y;\n\n targetObj.timeStamp = is.number(timeStamp) ? timeStamp :new Date().getTime();\n },\n\n pointerExtend: pointerExtend,\n\n getTouchPair: function (event) {\n const touches = [];\n\n // array of touches is supplied\n if (is.array(event)) {\n touches[0] = event[0];\n touches[1] = event[1];\n }\n // an event\n else {\n if (event.type === 'touchend') {\n if (event.touches.length === 1) {\n touches[0] = event.touches[0];\n touches[1] = event.changedTouches[0];\n }\n else if (event.touches.length === 0) {\n touches[0] = event.changedTouches[0];\n touches[1] = event.changedTouches[1];\n }\n }\n else {\n touches[0] = event.touches[0];\n touches[1] = event.touches[1];\n }\n }\n\n return touches;\n },\n\n pointerAverage: function (pointers) {\n const average = {\n pageX : 0,\n pageY : 0,\n clientX: 0,\n clientY: 0,\n screenX: 0,\n screenY: 0,\n };\n\n for (const pointer of pointers) {\n for (const prop in average) {\n average[prop] += pointer[prop];\n }\n }\n for (const prop in average) {\n average[prop] /= pointers.length;\n }\n\n return average;\n },\n\n touchBBox: function (event) {\n if (!event.length && !(event.touches && event.touches.length > 1)) {\n return;\n }\n\n const touches = pointerUtils.getTouchPair(event);\n const minX = Math.min(touches[0].pageX, touches[1].pageX);\n const minY = Math.min(touches[0].pageY, touches[1].pageY);\n const maxX = Math.max(touches[0].pageX, touches[1].pageX);\n const maxY = Math.max(touches[0].pageY, touches[1].pageY);\n\n return {\n x: minX,\n y: minY,\n left: minX,\n top: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n },\n\n touchDistance: function (event, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n\n\n const dx = touches[0][sourceX] - touches[1][sourceX];\n const dy = touches[0][sourceY] - touches[1][sourceY];\n\n return hypot(dx, dy);\n },\n\n touchAngle: function (event, prevAngle, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n const dx = touches[1][sourceX] - touches[0][sourceX];\n const dy = touches[1][sourceY] - touches[0][sourceY];\n const angle = 180 * Math.atan2(dy , dx) / Math.PI;\n\n return angle;\n },\n\n getPointerType: function (pointer) {\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : is.number(pointer.pointerType)\n ? [undefined, undefined,'touch', 'pen', 'mouse'][pointer.pointerType]\n // if the PointerEvent API isn't available, then the \"pointer\" must\n // be either a MouseEvent, TouchEvent, or Touch object\n : /touch/.test(pointer.type) || pointer instanceof domObjects.Touch\n ? 'touch'\n : 'mouse';\n },\n\n // [ event.target, event.currentTarget ]\n getEventTargets: function (event) {\n return [\n domUtils.getActualElement(event.path ? event.path[0] : event.target),\n domUtils.getActualElement(event.currentTarget),\n ];\n },\n};\n\nmodule.exports = pointerUtils;\n","const { window } = require('./window');\n\nconst vendors = ['ms', 'moz', 'webkit', 'o'];\nlet lastTime = 0;\nlet request;\nlet cancel;\n\nfor (let x = 0; x < vendors.length && !window.requestAnimationFrame; x++) {\n request = window[vendors[x] + 'RequestAnimationFrame'];\n cancel = window[vendors[x] +'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n}\n\nif (!request) {\n request = function (callback) {\n const currTime = new Date().getTime();\n const timeToCall = Math.max(0, 16 - (currTime - lastTime));\n const id = setTimeout(function () { callback(currTime + timeToCall); },\n timeToCall);\n\n lastTime = currTime + timeToCall;\n return id;\n };\n}\n\nif (!cancel) {\n cancel = function (id) {\n clearTimeout(id);\n };\n}\n\nmodule.exports = {\n request,\n cancel,\n};\n","const extend = require('./extend');\nconst is = require('./is');\nconst {\n closest,\n parentNode,\n getElementRect,\n} = require('./domUtils');\n\nconst rectUtils = {\n getStringOptionResult: function (value, interactable, element) {\n if (!is.string(value)) {\n return null;\n }\n\n if (value === 'parent') {\n value = parentNode(element);\n }\n else if (value === 'self') {\n value = interactable.getRect(element);\n }\n else {\n value = closest(element, value);\n }\n\n return value;\n },\n\n resolveRectLike: function (value, interactable, element, functionArgs) {\n value = rectUtils.getStringOptionResult(value, interactable, element) || value;\n\n if (is.function(value)) {\n value = value.apply(null, functionArgs);\n }\n\n if (is.element(value)) {\n value = getElementRect(value);\n }\n\n return value;\n },\n\n rectToXY: function (rect) {\n return rect && {\n x: 'x' in rect ? rect.x : rect.left,\n y: 'y' in rect ? rect.y : rect.top,\n };\n },\n\n xywhToTlbr: function (rect) {\n if (rect && !('left' in rect && 'top' in rect)) {\n rect = extend({}, rect);\n\n rect.left = rect.x || 0;\n rect.top = rect.y || 0;\n rect.right = rect.right || (rect.left + rect.width);\n rect.bottom = rect.bottom || (rect.top + rect.height);\n }\n\n return rect;\n },\n\n tlbrToXywh: function (rect) {\n if (rect && !('x' in rect && 'y' in rect)) {\n rect = extend({}, rect);\n\n rect.x = rect.left || 0;\n rect.top = rect.top || 0;\n rect.width = rect.width || (rect.right - rect.x);\n rect.height = rect.height || (rect.bottom - rect.y);\n }\n\n return rect;\n },\n};\n\nmodule.exports = rectUtils;\n","const win = module.exports;\nconst isWindow = require('./isWindow');\n\nfunction init (window) {\n // get wrapped window if using Shadow DOM polyfill\n\n win.realWindow = window;\n\n // create a TextNode\n const el = window.document.createTextNode('');\n\n // check if it's wrapped by a polyfill\n if (el.ownerDocument !== window.document\n && typeof window.wrap === 'function'\n && window.wrap(el) === el) {\n // use wrapped window\n window = window.wrap(window);\n }\n\n win.window = window;\n}\n\nif (typeof window === 'undefined') {\n win.window = undefined;\n win.realWindow = undefined;\n}\nelse {\n init(window);\n}\n\nwin.getWindow = function getWindow (node) {\n if (isWindow(node)) {\n return node;\n }\n\n const rootNode = (node.ownerDocument || node);\n\n return rootNode.defaultView || rootNode.parentWindow || win.window;\n};\n\nwin.init = init;\n"]} \ No newline at end of file diff --git a/package.json b/package.json index 76f3e9969..f39704e99 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "interactjs", - "version": "1.3.0-alpha.3+sha.9595c40", + "version": "1.3.0-alpha.4+sha.7970416", "repository": { "type": "git", "url": "https://github.com/taye/interact.js.git"
- Interactable.off(eventType, listener, [options])⚓➭ + Interactable.off(eventType, listener, [options])⚓➭ @@ -1339,7 +1339,7 @@ Parameters - Interactable.set(options)⚓➭ + Interactable.set(options)⚓➭ @@ -1399,7 +1399,7 @@ Parameters - Interactable.unset()⚓➭ + Interactable.unset()⚓➭ @@ -1442,7 +1442,7 @@ Interactable.unset() - Interactable.actionChecker([checker])⚓➭ + Interactable.actionChecker([checker])⚓➭ @@ -1542,7 +1542,7 @@ Parameters - Interactable.styleCursor([newValue])⚓➭ + Interactable.styleCursor([newValue])⚓➭ @@ -1605,7 +1605,7 @@ Parameters - interact.maxInteractions([newValue])⚓➭ + interact.maxInteractions([newValue])⚓➭ @@ -1652,7 +1652,7 @@ Parameters - Interactable.preventDefault([newValue])⚓➭ + Interactable.preventDefault([newValue])⚓➭ @@ -1718,7 +1718,7 @@ Parameters - interact(element)⚓➭ + interact(element)⚓➭ @@ -1821,7 +1821,7 @@ Usage - interact.isSet(element)⚓➭ + interact.isSet(element)⚓➭ @@ -1881,7 +1881,7 @@ Parameters - interact.on(type, listener, [options])⚓➭ + interact.on(type, listener, [options])⚓➭ @@ -1948,7 +1948,7 @@ Parameters - interact.off(type, listener, [options])⚓➭ + interact.off(type, listener, [options])⚓➭ @@ -2014,7 +2014,7 @@ Parameters - interact.debug()⚓➭ + interact.debug()⚓➭ @@ -2056,7 +2056,7 @@ interact.debug() - interact.supportsTouch()⚓➭ + interact.supportsTouch()⚓➭ @@ -2097,7 +2097,7 @@ interact.supportsTouch() - interact.supportsPointerEvent()⚓➭ + interact.supportsPointerEvent()⚓➭ @@ -2138,7 +2138,7 @@ interact.supportsPointerEvent() - interact.stop(event)⚓➭ + interact.stop(event)⚓➭ @@ -2198,7 +2198,7 @@ Parameters - interact.pointerMoveTolerance([newValue])⚓➭ + interact.pointerMoveTolerance([newValue])⚓➭ @@ -2261,7 +2261,7 @@ Parameters - Interaction.start(action, target, element)⚓➭ + Interaction.start(action, target, element)⚓➭ @@ -2356,7 +2356,7 @@ Parameters - Interaction.doMove()⚓➭ + Interaction.doMove()⚓➭ @@ -2403,7 +2403,7 @@ Interaction.doMove() - Interaction.end([event])⚓➭ + Interaction.end([event])⚓➭ diff --git a/dist/interact.js b/dist/interact.js index e8ae35c3b..c78a3c751 100644 --- a/dist/interact.js +++ b/dist/interact.js @@ -1,5 +1,5 @@ /** - * interact.js v1.3.0-alpha.3+sha.9595c40 + * interact.js v1.3.0-alpha.4+sha.7970416-dirty * * Copyright (c) 2012-2017 Taye Adeyemi * Open source under the MIT License. @@ -816,6 +816,7 @@ var scope = require('./scope'); var utils = require('./utils'); var events = require('./utils/events'); var browser = require('./utils/browser'); +var domObjects = require('./utils/domObjects'); var finder = require('./utils/interactionFinder'); var signals = require('./utils/Signals').new(); @@ -829,7 +830,9 @@ var prevTouchTime = 0; scope.interactions = []; var Interaction = function () { - function Interaction() { + function Interaction(_ref) { + var pointerType = _ref.pointerType; + _classCallCheck(this, Interaction); this.target = null; // current interactable being interacted with @@ -886,7 +889,7 @@ var Interaction = function () { this.pointerWasMoved = false; this._interacting = false; - this.mouse = false; + this.pointerType = pointerType; signals.fire('new', this); @@ -1130,6 +1133,11 @@ var Interaction = function () { }; Interaction.prototype.getPointerIndex = function getPointerIndex(pointer) { + // mouse and pen interactions may have only one pointer + if (this.pointerType === 'mouse' || this.pointerType === 'pen') { + return 0; + } + return utils.indexOf(this.pointerIds, utils.getPointerId(pointer)); }; @@ -1161,8 +1169,7 @@ var Interaction = function () { }; Interaction.prototype.removePointer = function removePointer(pointer, event) { - var id = utils.getPointerId(pointer); - var index = this.mouse ? 0 : utils.indexOf(this.pointerIds, id); + var index = this.getPointerIndex(pointer); if (index === -1) { return; @@ -1197,6 +1204,8 @@ for (var i = 0, len = methodNames.length; i < len; i++) { function doOnInteractions(method) { return function (event) { + var pointerType = utils.getPointerType(event); + var _utils$getEventTarget = utils.getEventTargets(event), eventTarget = _utils$getEventTarget[0], curEventTarget = _utils$getEventTarget[1]; @@ -1210,7 +1219,7 @@ function doOnInteractions(method) { var pointer = event.changedTouches[_i]; var interaction = finder.search(pointer, event.type, eventTarget); - matches.push([pointer, interaction || new Interaction()]); + matches.push([pointer, interaction || new Interaction({ pointerType: pointerType })]); } } else { var invalidPointer = false; @@ -1218,7 +1227,7 @@ function doOnInteractions(method) { if (!browser.supportsPointerEvent && /mouse/.test(event.type)) { // ignore mouse events while touch interactions are active for (var _i2 = 0; _i2 < scope.interactions.length && !invalidPointer; _i2++) { - invalidPointer = !scope.interactions[_i2].mouse && scope.interactions[_i2].pointerIsDown; + invalidPointer = scope.interactions[_i2].pointerType !== 'mouse' && scope.interactions[_i2].pointerIsDown; } // try to ignore mouse events that are simulated by the browser @@ -1232,11 +1241,7 @@ function doOnInteractions(method) { var _interaction = finder.search(event, event.type, eventTarget); if (!_interaction) { - - _interaction = new Interaction(); - _interaction.mouse = /mouse/i.test(event.pointerType || event.type) - // MSPointerEvent.MSPOINTER_TYPE_MOUSE - || event.pointerType === 4 || !event.pointerType; + _interaction = new Interaction({ pointerType: pointerType }); } matches.push([event, _interaction]); @@ -1244,20 +1249,20 @@ function doOnInteractions(method) { } for (var _iterator = matches, _isArray = Array.isArray(_iterator), _i3 = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { - var _ref; + var _ref2; if (_isArray) { if (_i3 >= _iterator.length) break; - _ref = _iterator[_i3++]; + _ref2 = _iterator[_i3++]; } else { _i3 = _iterator.next(); if (_i3.done) break; - _ref = _i3.value; + _ref2 = _i3.value; } - var _ref2 = _ref, - _pointer = _ref2[0], - _interaction2 = _ref2[1]; + var _ref3 = _ref2, + _pointer = _ref3[0], + _interaction2 = _ref3[1]; _interaction2._updateEventTargets(eventTarget, curEventTarget); _interaction2[method](_pointer, event, eventTarget, curEventTarget); @@ -1277,7 +1282,7 @@ function endAll(event) { var docEvents = {/* 'eventType': listenerFunc */}; var pEventTypes = browser.pEventTypes; -if (scope.PointerEvent) { +if (domObjects.PointerEvent) { docEvents[pEventTypes.down] = listeners.pointerDown; docEvents[pEventTypes.move] = listeners.pointerMove; docEvents[pEventTypes.up] = listeners.pointerUp; @@ -1295,8 +1300,8 @@ if (scope.PointerEvent) { docEvents.blur = endAll; -function onDocSignal(_ref3, signalName) { - var doc = _ref3.doc; +function onDocSignal(_ref4, signalName) { + var doc = _ref4.doc; var eventMethod = signalName.indexOf('add') === 0 ? events.add : events.remove; @@ -1311,14 +1316,14 @@ function onDocSignal(_ref3, signalName) { } } -signals.on('update-pointer-down', function (_ref4) { - var interaction = _ref4.interaction, - pointer = _ref4.pointer, - pointerId = _ref4.pointerId, - pointerIndex = _ref4.pointerIndex, - event = _ref4.event, - eventTarget = _ref4.eventTarget, - down = _ref4.down; +signals.on('update-pointer-down', function (_ref5) { + var interaction = _ref5.interaction, + pointer = _ref5.pointer, + pointerId = _ref5.pointerId, + pointerIndex = _ref5.pointerIndex, + event = _ref5.event, + eventTarget = _ref5.eventTarget, + down = _ref5.down; interaction.pointerIds[pointerIndex] = pointerId; interaction.pointers[pointerIndex] = pointer; @@ -1355,7 +1360,7 @@ scope.endAllInteractions = endAll; module.exports = Interaction; -},{"./scope":34,"./utils":44,"./utils/Signals":35,"./utils/browser":37,"./utils/events":40,"./utils/interactionFinder":45}],6:[function(require,module,exports){ +},{"./scope":34,"./utils":44,"./utils/Signals":35,"./utils/browser":37,"./utils/domObjects":38,"./utils/events":40,"./utils/interactionFinder":45}],6:[function(require,module,exports){ 'use strict'; var Interaction = require('../Interaction'); @@ -5460,7 +5465,7 @@ module.exports = function () { this.originalEvent = event; this.type = type; this.pointerId = pointerUtils.getPointerId(pointer); - this.pointerType = pointerUtils.getPointerType(pointer, interaction); + this.pointerType = pointerUtils.getPointerType(pointer); this.target = eventTarget; this.currentTarget = null; @@ -5758,8 +5763,10 @@ Interaction.signals.on('down', function (_ref6) { timer.duration = minDuration; timer.timeout = setTimeout(function () { fire({ - interaction: interaction, eventCopy: eventCopy, eventTarget: eventTarget, + interaction: interaction, + eventTarget: eventTarget, pointer: browser.isIE8 ? eventCopy : pointer, + event: eventCopy, type: 'hold' }); }, minDuration); @@ -6946,17 +6953,14 @@ module.exports = utils; var scope = require('../scope'); var utils = require('./index'); -var browser = require('./browser'); var finder = { - methodOrder: ['simulationResume', 'mouse', 'hasPointer', 'idle'], + methodOrder: ['simulationResume', 'mouseOrPen', 'hasPointer', 'idle'], search: function search(pointer, eventType, eventTarget) { - var mouseEvent = /mouse/i.test(pointer.pointerType || eventType) - // MSPointerEvent.MSPOINTER_TYPE_MOUSE - || pointer.pointerType === 4; + var pointerType = utils.getPointerType(pointer); var pointerId = utils.getPointerId(pointer); - var details = { pointer: pointer, pointerId: pointerId, mouseEvent: mouseEvent, eventType: eventType, eventTarget: eventTarget }; + var details = { pointer: pointer, pointerId: pointerId, pointerType: pointerType, eventType: eventType, eventTarget: eventTarget }; for (var _iterator = finder.methodOrder, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { var _ref; @@ -6982,7 +6986,7 @@ var finder = { // try to resume simulation with a new pointer simulationResume: function simulationResume(_ref2) { - var mouseEvent = _ref2.mouseEvent, + var pointerType = _ref2.pointerType, eventType = _ref2.eventType, eventTarget = _ref2.eventTarget; @@ -7006,7 +7010,7 @@ var finder = { var element = eventTarget; - if (interaction.simulation && interaction.simulation.allowResume && interaction.mouse === mouseEvent) { + if (interaction.simulation && interaction.simulation.allowResume && interaction.pointerType === pointerType) { while (element) { // if the element is the interaction element if (element === interaction.element) { @@ -7020,13 +7024,13 @@ var finder = { return null; }, - // if it's a mouse interaction - mouse: function mouse(_ref4) { + // if it's a mouse or pen interaction + mouseOrPen: function mouseOrPen(_ref4) { var pointerId = _ref4.pointerId, - mouseEvent = _ref4.mouseEvent, + pointerType = _ref4.pointerType, eventType = _ref4.eventType; - if (!mouseEvent && (browser.supportsTouch || browser.supportsPointerEvent)) { + if (pointerType !== 'mouse' && pointerType !== 'pen') { return null; } @@ -7046,7 +7050,7 @@ var finder = { var interaction = _ref5; - if (interaction.mouse) { + if (interaction.pointerType === pointerType) { // if it's a down event, skip interactions with running simulations if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; @@ -7069,8 +7073,8 @@ var finder = { return firstNonActive; } - // Find any interaction specifically for mouse. - // ignore the interaction if the eventType is a mousedown, and a simulation + // find any mouse or pen interaction. + // ignore the interaction if the eventType is a *down, and a simulation // is active for (var _iterator4 = scope.interactions, _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) { var _ref6; @@ -7086,7 +7090,7 @@ var finder = { var _interaction = _ref6; - if (_interaction.mouse && !(/down/.test(eventType) && _interaction.simulation)) { + if (_interaction.pointerType === pointerType && !(/down/i.test(eventType) && _interaction.simulation)) { return _interaction; } } @@ -7118,9 +7122,9 @@ var finder = { } }, - // get first idle interaction + // get first idle interaction with a matching pointerType idle: function idle(_ref9) { - var mouseEvent = _ref9.mouseEvent; + var pointerType = _ref9.pointerType; for (var _iterator6 = scope.interactions, _isArray6 = Array.isArray(_iterator6), _i6 = 0, _iterator6 = _isArray6 ? _iterator6 : _iterator6[Symbol.iterator]();;) { var _ref10; @@ -7150,7 +7154,7 @@ var finder = { continue; } - if (!interaction.interacting() && mouseEvent === interaction.mouse) { + if (!interaction.interacting() && pointerType === interaction.pointerType) { return interaction; } } @@ -7161,7 +7165,7 @@ var finder = { module.exports = finder; -},{"../scope":34,"./browser":37,"./index":44}],46:[function(require,module,exports){ +},{"../scope":34,"./index":44}],46:[function(require,module,exports){ 'use strict'; var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; @@ -7262,6 +7266,7 @@ var hypot = require('./hypot'); var browser = require('./browser'); var dom = require('./domObjects'); var domUtils = require('./domUtils'); +var domObjects = require('./domObjects'); var is = require('./is'); var pointerExtend = require('./pointerExtend'); @@ -7468,17 +7473,11 @@ var pointerUtils = { return angle; }, - getPointerType: function getPointerType(pointer, interaction) { - // if the PointerEvent API isn't available, then the pointer must be ither - // a MouseEvent or TouchEvent - if (interaction.mouse) { - return 'mouse'; - } - if (!browser.supportsPointerEvent) { - return 'touch'; - } - - return is.string(pointer.pointerType) ? pointer.pointerType : [undefined, undefined, 'touch', 'pen', 'mouse'][pointer.pointerType]; + getPointerType: function getPointerType(pointer) { + return is.string(pointer.pointerType) ? pointer.pointerType : is.number(pointer.pointerType) ? [undefined, undefined, 'touch', 'pen', 'mouse'][pointer.pointerType] + // if the PointerEvent API isn't available, then the "pointer" must + // be either a MouseEvent, TouchEvent, or Touch object + : /touch/.test(pointer.type) || pointer instanceof domObjects.Touch ? 'touch' : 'mouse'; }, // [ event.target, event.currentTarget ] diff --git a/dist/interact.js.map b/dist/interact.js.map index 60832b766..4f3a62ba8 100644 --- a/dist/interact.js.map +++ b/dist/interact.js.map @@ -1 +1 @@ -{"version":3,"sources":["src/header.js","node_modules/browser-pack/_prelude.js","index.js","src/Eventable.js","src/InteractEvent.js","src/Interactable.js","src/Interaction.js","src/actions/base.js","src/actions/drag.js","src/actions/drop.js","src/actions/gesture.js","src/actions/resize.js","src/autoScroll.js","src/autoStart/InteractableMethods.js","src/autoStart/base.js","src/autoStart/delay.js","src/autoStart/drag.js","src/autoStart/gesture.js","src/autoStart/resize.js","src/defaultOptions.js","src/index.js","src/inertia.js","src/interact.js","src/interactablePreventDefault.js","src/legacyBrowsers.js","src/modifiers/index.js","src/modifiers/restrict.js","src/modifiers/restrictEdges.js","src/modifiers/restrictSize.js","src/modifiers/snap.js","src/modifiers/snapSize.js","src/pointerEvents/PointerEvent.js","src/pointerEvents/base.js","src/pointerEvents/holdRepeat.js","src/pointerEvents/interactableTargets.js","src/scope.js","src/utils/Signals.js","src/utils/arr.js","src/utils/browser.js","src/utils/domObjects.js","src/utils/domUtils.js","src/utils/events.js","src/utils/extend.js","src/utils/getOriginXY.js","src/utils/hypot.js","src/utils/index.js","src/utils/interactionFinder.js","src/utils/is.js","src/utils/isWindow.js","src/utils/pointerExtend.js","src/utils/pointerUtils.js","src/utils/raf.js","src/utils/rect.js","src/utils/window.js"],"names":[],"mappings":";AAAA;AACA;AACA;AACA;AACA;AACA;ACLA,ADMA;AACA;;AEPA;;;;;;;;AAQA,IAAI,OAAO,MAAP,KAAkB,WAAtB,EAAmC;AACjC,SAAO,OAAP,GAAiB,UAAU,MAAV,EAAkB;AACjC,YAAQ,oBAAR,EAA8B,IAA9B,CAAmC,MAAnC;;AAEA,WAAO,QAAQ,aAAR,CAAP;AACD,GAJD;AAKD,CAND,MAOK;AACH,SAAO,OAAP,GAAiB,QAAQ,aAAR,CAAjB;AACD;;;;;;;eCjBmB,QAAQ,aAAR,C;IAAZ,O,YAAA,O;;AACR,IAAM,SAAS,QAAQ,mBAAR,CAAf;;AAEA,SAAS,yBAAT,CAAoC,KAApC,EAA2C,SAA3C,EAAsD;AACpD,OAAK,IAAI,IAAI,CAAR,EAAW,MAAM,UAAU,MAAhC,EAAwC,IAAI,GAAJ,IAAW,CAAC,MAAM,2BAA1D,EAAuF,GAAvF,EAA4F;AAC1F,cAAU,CAAV,EAAa,KAAb;AACD;AACF;;IAEK,S;AAEJ,qBAAa,OAAb,EAAsB;AAAA;;AACpB,SAAK,OAAL,GAAe,OAAO,EAAP,EAAW,WAAW,EAAtB,CAAf;AACD;;sBAED,I,iBAAM,K,EAAO;AACX,QAAI,kBAAJ;AACA,QAAM,UAAU,OAAO,MAAM,IAA7B;AACA,QAAM,SAAS,KAAK,MAApB;;AAEA;AACA,QAAK,YAAY,KAAK,MAAM,IAAX,CAAjB,EAAoC;AAClC,gCAA0B,KAA1B,EAAiC,SAAjC;AACD;;AAED;AACA,QAAI,KAAK,OAAL,CAAJ,EAAmB;AACjB,WAAK,OAAL,EAAc,KAAd;AACD;;AAED;AACA,QAAI,CAAC,MAAM,kBAAP,IAA6B,MAA7B,KAAwC,YAAY,OAAO,MAAM,IAAb,CAApD,CAAJ,EAA8E;AAC5E,gCAA0B,KAA1B,EAAiC,SAAjC;AACD;AACF,G;;sBAED,E,eAAI,S,EAAW,Q,EAAU;AACvB;AACA,QAAI,KAAK,SAAL,CAAJ,EAAqB;AACnB,WAAK,SAAL,EAAgB,IAAhB,CAAqB,QAArB;AACD,KAFD,MAGK;AACH,WAAK,SAAL,IAAkB,CAAC,QAAD,CAAlB;AACD;AACF,G;;sBAED,G,gBAAK,S,EAAW,Q,EAAU;AACxB;AACA,QAAM,YAAY,KAAK,SAAL,CAAlB;AACA,QAAM,QAAY,YAAW,QAAQ,SAAR,EAAmB,QAAnB,CAAX,GAA0C,CAAC,CAA7D;;AAEA,QAAI,UAAU,CAAC,CAAf,EAAkB;AAChB,gBAAU,MAAV,CAAiB,KAAjB,EAAwB,CAAxB;AACD;;AAED,QAAI,aAAa,UAAU,MAAV,KAAqB,CAAlC,IAAuC,CAAC,QAA5C,EAAsD;AACpD,WAAK,SAAL,IAAkB,QAAlB;AACD;AACF,G;;;;;AAGH,OAAO,OAAP,GAAiB,SAAjB;;;;;;;AC7DA,IAAM,SAAc,QAAQ,gBAAR,CAApB;AACA,IAAM,cAAc,QAAQ,qBAAR,CAApB;AACA,IAAM,WAAc,QAAQ,kBAAR,CAApB;AACA,IAAM,UAAc,QAAQ,iBAAR,EAA2B,GAA3B,EAApB;;IAEM,a;AACJ,yBAAa,WAAb,EAA0B,KAA1B,EAAiC,MAAjC,EAAyC,KAAzC,EAAgD,OAAhD,EAAyD,OAAzD,EAAkF;AAAA,QAAhB,MAAgB,uEAAP,KAAO;;AAAA;;AAChF,QAAM,SAAc,YAAY,MAAhC;AACA,QAAM,cAAc,CAAC,UAAU,OAAO,OAAjB,IAA4B,QAA7B,EAAuC,WAA3D;AACA,QAAM,SAAc,YAAY,MAAZ,EAAoB,OAApB,EAA6B,MAA7B,CAApB;AACA,QAAM,WAAc,UAAU,OAA9B;AACA,QAAM,SAAc,UAAU,KAA9B;AACA,QAAM,SAAc,WAAU,YAAY,WAAtB,GAAoC,YAAY,SAApE;AACA,QAAM,YAAc,YAAY,SAAhC;;AAEA,cAAU,WAAW,YAAY,OAAjC;;AAEA,QAAM,OAAS,OAAO,EAAP,EAAW,OAAO,IAAlB,CAAf;AACA,QAAM,SAAS,OAAO,EAAP,EAAW,OAAO,MAAlB,CAAf;;AAEA,SAAK,CAAL,IAAU,OAAO,CAAjB;AACA,SAAK,CAAL,IAAU,OAAO,CAAjB;;AAEA,WAAO,CAAP,IAAY,OAAO,CAAnB;AACA,WAAO,CAAP,IAAY,OAAO,CAAnB;;AAEA,SAAK,OAAL,GAAqB,MAAM,OAA3B;AACA,SAAK,MAAL,GAAqB,MAAM,MAA3B;AACA,SAAK,QAAL,GAAqB,MAAM,QAA3B;AACA,SAAK,OAAL,GAAqB,MAAM,OAA3B;AACA,SAAK,MAAL,GAAqB,MAAM,MAA3B;AACA,SAAK,OAAL,GAAqB,MAAM,OAA3B;AACA,SAAK,MAAL,GAAqB,OAArB;AACA,SAAK,aAAL,GAAqB,OAArB;AACA,SAAK,aAAL,GAAqB,WAAW,IAAhC;AACA,SAAK,MAAL,GAAqB,MAArB;AACA,SAAK,IAAL,GAAqB,UAAU,SAAS,EAAnB,CAArB;AACA,SAAK,WAAL,GAAqB,WAArB;AACA,SAAK,YAAL,GAAqB,MAArB;;AAEA,SAAK,EAAL,GAAU,WAAW,YAAY,SAAZ,CAAsB,YAAY,SAAZ,CAAsB,MAAtB,GAA+B,CAArD,CAAX,GACW,UAAU,EAD/B;;AAGA,QAAM,YAAY;AAChB,8BADgB;AAEhB,kBAFgB;AAGhB,oBAHgB;AAIhB,kBAJgB;AAKhB,sBALgB;AAMhB,sBANgB;AAOhB,gBAPgB;AAQhB,oBARgB;AAShB,oBATgB;AAUhB,wBAVgB;AAWhB,oBAXgB;AAYhB,8BAZgB;AAahB,cAAQ;AAbQ,KAAlB;;AAgBA,YAAQ,IAAR,CAAa,QAAb,EAAuB,SAAvB;;AAEA,QAAI,MAAJ,EAAY;AACV;AACA,WAAK,KAAL,GAAa,UAAU,KAAvB;AACA,WAAK,KAAL,GAAa,UAAU,KAAvB;AACA,WAAK,OAAL,GAAe,UAAU,OAAzB;AACA,WAAK,OAAL,GAAe,UAAU,OAAzB;AACD,KAND,MAOK;AACH,WAAK,KAAL,GAAiB,KAAK,CAAtB;AACA,WAAK,KAAL,GAAiB,KAAK,CAAtB;AACA,WAAK,OAAL,GAAiB,OAAO,CAAxB;AACA,WAAK,OAAL,GAAiB,OAAO,CAAxB;AACD;;AAED,SAAK,EAAL,GAAiB,YAAY,WAAZ,CAAwB,IAAxB,CAA6B,CAA7B,GAAiC,OAAO,CAAzD;AACA,SAAK,EAAL,GAAiB,YAAY,WAAZ,CAAwB,IAAxB,CAA6B,CAA7B,GAAiC,OAAO,CAAzD;AACA,SAAK,QAAL,GAAiB,YAAY,WAAZ,CAAwB,MAAxB,CAA+B,CAA/B,GAAmC,OAAO,CAA3D;AACA,SAAK,QAAL,GAAiB,YAAY,WAAZ,CAAwB,MAAxB,CAA+B,CAA/B,GAAmC,OAAO,CAA3D;;AAEA,YAAQ,IAAR,CAAa,WAAb,EAA0B,SAA1B;;AAEA,SAAK,SAAL,GAAiB,OAAO,SAAxB;AACA,SAAK,EAAL,GAAiB,YAAY,YAAZ,CAAyB,SAA1C;AACA,SAAK,QAAL,GAAiB,KAAK,SAAL,GAAiB,KAAK,EAAvC;;AAEA;AACA,SAAK,KAAL,GAAa,YAAY,YAAZ,CAAyB,WAAzB,EAAsC,KAAnD;AACA,SAAK,SAAL,GAAiB,YAAY,YAAZ,CAAyB,WAAzB,EAAsC,EAAvD;AACA,SAAK,SAAL,GAAiB,YAAY,YAAZ,CAAyB,WAAzB,EAAsC,EAAvD;;AAEA,SAAK,KAAL,GAAc,UAAU,UAAU,cAArB,GAAsC,KAAK,QAAL,EAAtC,GAAwD,IAArE;;AAEA,YAAQ,IAAR,CAAa,KAAb,EAAoB,SAApB;AACD;;0BAED,Q,uBAAY;AACV,QAAM,cAAc,KAAK,WAAzB;;AAEA,QAAI,YAAY,SAAZ,CAAsB,KAAtB,GAA8B,GAA9B,IACG,KAAK,SAAL,GAAiB,YAAY,SAAZ,CAAsB,SAAvC,GAAmD,GAD1D,EAC+D;AAC7D,aAAO,IAAP;AACD;;AAED,QAAI,QAAQ,MAAM,KAAK,KAAL,CAAW,YAAY,SAAZ,CAAsB,SAAjC,EAA4C,YAAY,SAAZ,CAAsB,SAAlE,CAAN,GAAqF,KAAK,EAAtG;AACA,QAAM,UAAU,IAAhB;;AAEA,QAAI,QAAQ,CAAZ,EAAe;AACb,eAAS,GAAT;AACD;;AAED,QAAM,OAAO,MAAM,OAAN,IAAiB,KAAjB,IAA0B,QAAQ,MAAM,OAArD;AACA,QAAM,KAAO,MAAM,OAAN,IAAiB,KAAjB,IAA0B,QAAQ,MAAM,OAArD;;AAEA,QAAM,QAAQ,CAAC,IAAD,KAAU,MAAM,OAAN,IAAiB,KAAjB,IAA0B,QAAS,KAAK,OAAlD,CAAd;AACA,QAAM,OAAQ,CAAC,EAAD,IAAW,KAAK,OAAL,IAAgB,KAA3B,IAAoC,QAAQ,MAAM,OAAhE;;AAEA,WAAO;AACL,YADK;AAEL,gBAFK;AAGL,gBAHK;AAIL,kBAJK;AAKL,kBALK;AAML,aAAO,YAAY,SAAZ,CAAsB,KANxB;AAOL,gBAAU;AACR,WAAG,YAAY,SAAZ,CAAsB,SADjB;AAER,WAAG,YAAY,SAAZ,CAAsB;AAFjB;AAPL,KAAP;AAYD,G;;0BAED,c,6BAAkB,CAAE,C;;0BAEpB,wB,uCAA4B;AAC1B,SAAK,2BAAL,GAAmC,KAAK,kBAAL,GAA0B,IAA7D;AACD,G;;0BAED,e,8BAAmB;AACjB,SAAK,kBAAL,GAA0B,IAA1B;AACD,G;;;;;AAGH,QAAQ,EAAR,CAAW,WAAX,EAAwB,gBAA0D;AAAA,MAA9C,MAA8C,QAA9C,MAA8C;AAAA,MAAtC,WAAsC,QAAtC,WAAsC;AAAA,MAAzB,QAAyB,QAAzB,QAAyB;AAAA,MAAf,WAAe,QAAf,WAAe;;AAChF,MAAM,YAAY,WAAU,MAAV,GAAmB,YAAY,SAAjD;;AAEA,MAAI,gBAAgB,QAApB,EAA8B;AAC5B,WAAO,EAAP,GAAY,OAAO,OAAP,GAAiB,UAAU,OAAvC;AACA,WAAO,EAAP,GAAY,OAAO,OAAP,GAAiB,UAAU,OAAvC;AACD,GAHD,MAIK;AACH,WAAO,EAAP,GAAY,OAAO,KAAP,GAAe,UAAU,KAArC;AACA,WAAO,EAAP,GAAY,OAAO,KAAP,GAAe,UAAU,KAArC;AACD;AACF,CAXD;;AAaA,cAAc,OAAd,GAAwB,OAAxB;;AAEA,OAAO,OAAP,GAAiB,aAAjB;;;;;;;AC7JA,IAAM,KAAY,QAAQ,YAAR,CAAlB;AACA,IAAM,SAAY,QAAQ,gBAAR,CAAlB;AACA,IAAM,SAAY,QAAQ,gBAAR,CAAlB;AACA,IAAM,UAAY,QAAQ,gBAAR,CAAlB;AACA,IAAM,QAAY,QAAQ,SAAR,CAAlB;AACA,IAAM,YAAY,QAAQ,aAAR,CAAlB;AACA,IAAM,WAAY,QAAQ,kBAAR,CAAlB;AACA,IAAM,UAAY,QAAQ,iBAAR,EAA2B,GAA3B,EAAlB;;eAM8B,QAAQ,kBAAR,C;IAH5B,c,YAAA,c;IACA,Y,YAAA,Y;IACA,W,YAAA,W;;gBAE4B,QAAQ,gBAAR,C;IAAtB,S,aAAA,S;;gBACsB,QAAQ,aAAR,C;IAAtB,O,aAAA,O;IAAS,Q,aAAA,Q;;gBACa,QAAQ,iBAAR,C;IAAtB,U,aAAA,U;;AAER;;;AACA,MAAM,aAAN,GAAsB,EAAtB;;AAEA;;;;;;;IAMM,Y;AACJ,wBAAa,MAAb,EAAqB,OAArB,EAA8B;AAAA;;AAC5B,cAAU,WAAW,EAArB;;AAEA,SAAK,MAAL,GAAgB,MAAhB;AACA,SAAK,MAAL,GAAgB,IAAI,SAAJ,EAAhB;AACA,SAAK,QAAL,GAAgB,QAAQ,OAAR,IAAmB,MAAM,QAAzC;AACA,SAAK,IAAL,GAAgB,UAAU,YAAY,MAAZ,IAAqB,KAAK,QAA1B,GAAqC,MAA/C,CAAhB;AACA,SAAK,IAAL,GAAgB,KAAK,IAAL,CAAU,QAA1B;;AAEA,YAAQ,IAAR,CAAa,KAAb,EAAoB;AAClB,oBADkB;AAElB,sBAFkB;AAGlB,oBAAc,IAHI;AAIlB,WAAK,KAAK;AAJQ,KAApB;;AAOA,UAAM,WAAN,CAAmB,KAAK,IAAxB,EAA8B,KAAK,IAAnC;;AAEA,UAAM,aAAN,CAAoB,IAApB,CAAyB,IAAzB;;AAEA,SAAK,GAAL,CAAS,OAAT;AACD;;yBAED,W,wBAAa,M,EAAQ,M,EAAQ;AAC3B,QAAM,WAAW,OAAO,MAAxB;;AAEA,QAAI,GAAG,QAAH,CAAY,OAAO,OAAnB,CAAJ,EAAwC;AAAE,WAAK,MAAL,CAAY,WAAW,OAAvB,IAA0C,OAAO,OAAjD;AAAoE;AAC9G,QAAI,GAAG,QAAH,CAAY,OAAO,MAAnB,CAAJ,EAAwC;AAAE,WAAK,MAAL,CAAY,WAAW,MAAvB,IAA0C,OAAO,MAAjD;AAAoE;AAC9G,QAAI,GAAG,QAAH,CAAY,OAAO,KAAnB,CAAJ,EAAwC;AAAE,WAAK,MAAL,CAAY,WAAW,KAAvB,IAA0C,OAAO,KAAjD;AAAoE;AAC9G,QAAI,GAAG,QAAH,CAAY,OAAO,cAAnB,CAAJ,EAAwC;AAAE,WAAK,MAAL,CAAY,WAAW,cAAvB,IAA0C,OAAO,cAAjD;AAAoE;;AAE9G,WAAO,IAAP;AACD,G;;yBAED,Y,yBAAc,M,EAAQ,O,EAAS;AAC7B;AACA,SAAK,IAAM,MAAX,IAAqB,OAArB,EAA8B;AAC5B;AACA,UAAI,UAAU,SAAS,MAAT,CAAd,EAAgC;AAC9B;AACA,YAAI,GAAG,MAAH,CAAU,QAAQ,MAAR,CAAV,CAAJ,EAAgC;AAC9B;AACA,eAAK,OAAL,CAAa,MAAb,EAAqB,MAArB,IAA+B,OAAO,KAAK,OAAL,CAAa,MAAb,EAAqB,MAArB,KAAgC,EAAvC,EAA2C,QAAQ,MAAR,CAA3C,CAA/B;;AAEA,cAAI,GAAG,MAAH,CAAU,SAAS,SAAT,CAAmB,MAAnB,CAAV,KAAyC,aAAa,SAAS,SAAT,CAAmB,MAAnB,CAA1D,EAAsF;AACpF,iBAAK,OAAL,CAAa,MAAb,EAAqB,MAArB,EAA6B,OAA7B,GAAuC,QAAQ,MAAR,EAAgB,OAAhB,KAA4B,KAA5B,GAAmC,KAAnC,GAA2C,IAAlF;AACD;AACF,SAPD,MAQK,IAAI,GAAG,IAAH,CAAQ,QAAQ,MAAR,CAAR,KAA4B,GAAG,MAAH,CAAU,SAAS,SAAT,CAAmB,MAAnB,CAAV,CAAhC,EAAuE;AAC1E,eAAK,OAAL,CAAa,MAAb,EAAqB,MAArB,EAA6B,OAA7B,GAAuC,QAAQ,MAAR,CAAvC;AACD,SAFI,MAGA,IAAI,QAAQ,MAAR,MAAoB,SAAxB,EAAmC;AACtC;AACA,eAAK,OAAL,CAAa,MAAb,EAAqB,MAArB,IAA+B,QAAQ,MAAR,CAA/B;AACD;AACF;AACF;AACF,G;;AAED;;;;;;;;;;;;;;;;;;;;yBAkBA,O,oBAAS,O,EAAS;AAChB,cAAU,WAAW,KAAK,MAA1B;;AAEA,QAAI,GAAG,MAAH,CAAU,KAAK,MAAf,KAA0B,CAAE,GAAG,OAAH,CAAW,OAAX,CAAhC,EAAsD;AACpD,gBAAU,KAAK,QAAL,CAAc,aAAd,CAA4B,KAAK,MAAjC,CAAV;AACD;;AAED,WAAO,eAAe,OAAf,CAAP;AACD,G;;AAED;;;;;;;;;;;;yBAUA,W,wBAAa,O,EAAS;AACpB,QAAI,GAAG,QAAH,CAAY,OAAZ,CAAJ,EAA0B;AACxB,WAAK,OAAL,GAAe,OAAf;;AAEA,aAAO,IAAP;AACD;;AAED,QAAI,YAAY,IAAhB,EAAsB;AACpB,aAAO,KAAK,OAAL,CAAa,OAApB;;AAEA,aAAO,IAAP;AACD;;AAED,WAAO,KAAK,OAAZ;AACD,G;;yBAED,iB,8BAAmB,U,EAAY,Q,EAAU;AACvC,QAAI,YAAY,QAAZ,KAAyB,GAAG,MAAH,CAAU,QAAV,CAA7B,EAAkD;AAChD,WAAK,OAAL,CAAa,UAAb,IAA2B,QAA3B;;AAEA,2BAAqB,QAAQ,KAA7B,kHAAoC;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,YAAzB,MAAyB;;AAClC,aAAK,OAAL,CAAa,MAAb,EAAqB,UAArB,IAAmC,QAAnC;AACD;;AAED,aAAO,IAAP;AACD;;AAED,WAAO,KAAK,OAAL,CAAa,UAAb,CAAP;AACD,G;;AAED;;;;;;;;;;;;;;;yBAaA,M,mBAAQ,Q,EAAU;AAChB,WAAO,KAAK,iBAAL,CAAuB,QAAvB,EAAiC,QAAjC,CAAP;AACD,G;;AAED;;;;;;;;;;;;yBAUA,W,wBAAa,Q,EAAU;AACrB,QAAI,aAAa,MAAb,IAAuB,aAAa,QAAxC,EAAkD;AAChD,WAAK,OAAL,CAAa,WAAb,GAA2B,QAA3B;;AAEA,aAAO,IAAP;AACD;;AAED,WAAO,KAAK,OAAL,CAAa,WAApB;AACD,G;;AAED;;;;;;;;;;;yBASA,O,sBAAW;AACT,WAAO,KAAK,QAAZ;AACD,G;;yBAED,S,sBAAW,O,EAAS;AAClB,WAAQ,KAAK,QAAL,KAAkB,QAAQ,aAA1B,IACG,aAAa,KAAK,QAAlB,EAA4B,OAA5B,CADX;AAED,G;;AAED;;;;;;;;;;;;yBAUA,I,iBAAM,M,EAAQ;AACZ,SAAK,MAAL,CAAY,IAAZ,CAAiB,MAAjB;;AAEA,WAAO,IAAP;AACD,G;;yBAED,c,2BAAgB,M,EAAQ,S,EAAW,Q,EAAU,O,EAAS;AACpD,QAAI,GAAG,MAAH,CAAU,SAAV,KAAwB,UAAU,MAAV,CAAiB,GAAjB,MAA0B,CAAC,CAAvD,EAA0D;AACxD,kBAAY,UAAU,IAAV,GAAiB,KAAjB,CAAuB,IAAvB,CAAZ;AACD;;AAED,QAAI,GAAG,KAAH,CAAS,SAAT,CAAJ,EAAyB;AACvB,WAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,UAAU,MAA9B,EAAsC,GAAtC,EAA2C;AACzC,aAAK,MAAL,EAAa,UAAU,CAAV,CAAb,EAA2B,QAA3B,EAAqC,OAArC;AACD;;AAED,aAAO,IAAP;AACD;;AAED,QAAI,GAAG,MAAH,CAAU,SAAV,CAAJ,EAA0B;AACxB,WAAK,IAAM,IAAX,IAAmB,SAAnB,EAA8B;AAC5B,aAAK,MAAL,EAAa,IAAb,EAAmB,UAAU,IAAV,CAAnB,EAAoC,QAApC;AACD;;AAED,aAAO,IAAP;AACD;AACF,G;;AAED;;;;;;;;;;;;;yBAWA,E,eAAI,S,EAAW,Q,EAAU,O,EAAS;AAChC,QAAI,KAAK,cAAL,CAAoB,IAApB,EAA0B,SAA1B,EAAqC,QAArC,EAA+C,OAA/C,CAAJ,EAA6D;AAC3D,aAAO,IAAP;AACD;;AAED,QAAI,cAAc,OAAlB,EAA2B;AAAE,kBAAY,UAAZ;AAAyB;;AAEtD,QAAI,SAAS,aAAa,UAAtB,EAAkC,SAAlC,CAAJ,EAAkD;AAChD,WAAK,MAAL,CAAY,EAAZ,CAAe,SAAf,EAA0B,QAA1B;AACD;AACD;AAHA,SAIK,IAAI,GAAG,MAAH,CAAU,KAAK,MAAf,CAAJ,EAA4B;AAC/B,eAAO,WAAP,CAAmB,KAAK,MAAxB,EAAgC,KAAK,QAArC,EAA+C,SAA/C,EAA0D,QAA1D,EAAoE,OAApE;AACD,OAFI,MAGA;AACH,eAAO,GAAP,CAAW,KAAK,MAAhB,EAAwB,SAAxB,EAAmC,QAAnC,EAA6C,OAA7C;AACD;;AAED,WAAO,IAAP;AACD,G;;AAED;;;;;;;;;;;;;yBAWA,G,gBAAK,S,EAAW,Q,EAAU,O,EAAS;AACjC,QAAI,KAAK,cAAL,CAAoB,KAApB,EAA2B,SAA3B,EAAsC,QAAtC,EAAgD,OAAhD,CAAJ,EAA8D;AAC5D,aAAO,IAAP;AACD;;AAED,QAAI,cAAc,OAAlB,EAA2B;AAAE,kBAAY,UAAZ;AAAyB;;AAEtD;AACA,QAAI,SAAS,aAAa,UAAtB,EAAkC,SAAlC,CAAJ,EAAkD;AAChD,WAAK,MAAL,CAAY,GAAZ,CAAgB,SAAhB,EAA2B,QAA3B;AACD;AACD;AAHA,SAIK,IAAI,GAAG,MAAH,CAAU,KAAK,MAAf,CAAJ,EAA4B;AAC/B,eAAO,cAAP,CAAsB,KAAK,MAA3B,EAAmC,KAAK,QAAxC,EAAkD,SAAlD,EAA6D,QAA7D,EAAuE,OAAvE;AACD;AACD;AAHK,WAIA;AACH,iBAAO,MAAP,CAAc,KAAK,MAAnB,EAA2B,SAA3B,EAAsC,QAAtC,EAAgD,OAAhD;AACD;;AAED,WAAO,IAAP;AACD,G;;AAED;;;;;;;;;;yBAQA,G,gBAAK,O,EAAS;AACZ,QAAI,CAAC,GAAG,MAAH,CAAU,OAAV,CAAL,EAAyB;AACvB,gBAAU,EAAV;AACD;;AAED,SAAK,OAAL,GAAe,OAAO,EAAP,EAAW,SAAS,IAApB,CAAf;;AAEA,QAAM,aAAa,OAAO,EAAP,EAAW,SAAS,SAApB,CAAnB;;AAEA,SAAK,IAAM,UAAX,IAAyB,QAAQ,UAAjC,EAA6C;AAC3C,UAAM,aAAa,QAAQ,UAAR,CAAmB,UAAnB,CAAnB;;AAEA,WAAK,OAAL,CAAa,UAAb,IAA2B,OAAO,EAAP,EAAW,SAAS,UAAT,CAAX,CAA3B;;AAEA,WAAK,YAAL,CAAkB,UAAlB,EAA8B,UAA9B;;AAEA,WAAK,UAAL,EAAiB,QAAQ,UAAR,CAAjB;AACD;;AAED,0BAAsB,aAAa,eAAnC,yHAAoD;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAAzC,OAAyC;;AAClD,WAAK,OAAL,CAAa,OAAb,IAAwB,SAAS,IAAT,CAAc,OAAd,CAAxB;;AAEA,UAAI,WAAW,OAAf,EAAwB;AACtB,aAAK,OAAL,EAAc,QAAQ,OAAR,CAAd;AACD;AACF;;AAED,YAAQ,IAAR,CAAa,KAAb,EAAoB;AAClB,sBADkB;AAElB,oBAAc;AAFI,KAApB;;AAKA,WAAO,IAAP;AACD,G;;AAED;;;;;;;;;;;yBASA,K,oBAAS;AACP,WAAO,MAAP,CAAc,KAAK,MAAnB,EAA2B,KAA3B;;AAEA,QAAI,GAAG,MAAH,CAAU,KAAK,MAAf,CAAJ,EAA4B;AAC1B;AACA,WAAK,IAAM,IAAX,IAAmB,OAAO,eAA1B,EAA2C;AACzC,YAAM,YAAY,OAAO,eAAP,CAAuB,IAAvB,CAAlB;;AAEA,YAAI,UAAU,SAAV,CAAoB,CAApB,MAA2B,KAAK,MAAhC,IACG,UAAU,QAAV,CAAmB,CAAnB,MAA0B,KAAK,QADtC,EACgD;;AAE9C,oBAAU,SAAV,CAAoB,MAApB,CAA2B,CAA3B,EAA8B,CAA9B;AACA,oBAAU,QAAV,CAAoB,MAApB,CAA2B,CAA3B,EAA8B,CAA9B;AACA,oBAAU,SAAV,CAAoB,MAApB,CAA2B,CAA3B,EAA8B,CAA9B;;AAEA;AACA,cAAI,CAAC,UAAU,SAAV,CAAoB,MAAzB,EAAiC;AAC/B,sBAAU,IAAV,IAAkB,IAAlB;AACD;AACF;;AAED,eAAO,MAAP,CAAc,KAAK,QAAnB,EAA6B,IAA7B,EAAmC,OAAO,gBAA1C;AACA,eAAO,MAAP,CAAc,KAAK,QAAnB,EAA6B,IAA7B,EAAmC,OAAO,kBAA1C,EAA8D,IAA9D;AACD;AACF,KArBD,MAsBK;AACH,aAAO,MAAP,CAAc,IAAd,EAAoB,KAApB;AACD;;AAED,YAAQ,IAAR,CAAa,OAAb,EAAsB,EAAE,cAAc,IAAhB,EAAtB;;AAEA,UAAM,aAAN,CAAoB,MAApB,CAA2B,QAAQ,MAAM,aAAd,EAA6B,IAA7B,CAA3B,EAA+D,CAA/D;;AAEA;AACA,0BAA0B,MAAM,YAAN,IAAsB,EAAhD,yHAAoD;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAAzC,WAAyC;;AAClD,UAAI,YAAY,MAAZ,KAAuB,IAAvB,IAA+B,YAAY,WAAZ,EAAnC,EAA8D;AAC5D,oBAAY,IAAZ;AACD;AACF;;AAED,WAAO,MAAM,QAAb;AACD,G;;;;;AAGH,MAAM,aAAN,CAAoB,cAApB,GAAqC,SAAS,cAAT,CAAyB,MAAzB,EAAiC,OAAjC,EAA0C;AAC7E,YAAU,WAAW,MAAM,QAA3B;;AAEA,OAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,KAAK,MAAzB,EAAiC,GAAjC,EAAsC;AACpC,QAAM,eAAe,KAAK,CAAL,CAArB;;AAEA,QAAI,aAAa,MAAb,KAAwB,MAAxB,IAAkC,aAAa,QAAb,KAA0B,OAAhE,EAAyE;AACvE,aAAO,CAAP;AACD;AACF;AACD,SAAO,CAAC,CAAR;AACD,CAXD;;AAaA,MAAM,aAAN,CAAoB,GAApB,GAA0B,SAAS,eAAT,CAA0B,OAA1B,EAAmC,OAAnC,EAA4C,kBAA5C,EAAgE;AACxF,MAAM,MAAM,KAAK,KAAK,cAAL,CAAoB,OAApB,EAA6B,WAAW,QAAQ,OAAhD,CAAL,CAAZ;;AAEA,SAAO,QAAQ,GAAG,MAAH,CAAU,OAAV,KAAsB,kBAAtB,IAA4C,IAAI,SAAJ,CAAc,OAAd,CAApD,IAA6E,GAA7E,GAAmF,IAA1F;AACD,CAJD;;AAMA,MAAM,aAAN,CAAoB,eAApB,GAAsC,UAAU,QAAV,EAAoB,OAApB,EAA6B;AACjE,OAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,KAAK,MAAzB,EAAiC,GAAjC,EAAsC;AACpC,QAAM,eAAe,KAAK,CAAL,CAArB;;AAEA;AACA,QAAI,CAAC,GAAG,MAAH,CAAU,aAAa,MAAvB,CAAD,IACI,WAAW,CAAC,aAAa,SAAb,CAAuB,OAAvB,CADpB,EACsD;AACpD;AACD;;AAED,QAAM,MAAM,SAAS,YAAT,EAAuB,aAAa,MAApC,EAA4C,aAAa,QAAzD,EAAmE,CAAnE,EAAsE,IAAtE,CAAZ;;AAEA,QAAI,QAAQ,SAAZ,EAAuB;AACrB,aAAO,GAAP;AACD;AACF;AACF,CAhBD;;AAkBA;AACA,aAAa,UAAb,GAA0B,MAAM,UAAN,GAAmB,EAA7C;;AAEA,aAAa,OAAb,GAAuB,OAAvB;;AAEA,aAAa,eAAb,GAA+B,CAAE,aAAF,EAAiB,QAAjB,EAA2B,gBAA3B,EAA6C,aAA7C,CAA/B;;AAEA,OAAO,OAAP,GAAiB,YAAjB;;;;;;;ACtcA,IAAM,QAAU,QAAQ,SAAR,CAAhB;AACA,IAAM,QAAU,QAAQ,SAAR,CAAhB;AACA,IAAM,SAAU,QAAQ,gBAAR,CAAhB;AACA,IAAM,UAAU,QAAQ,iBAAR,CAAhB;AACA,IAAM,SAAU,QAAQ,2BAAR,CAAhB;AACA,IAAM,UAAU,QAAQ,iBAAR,EAA2B,GAA3B,EAAhB;;AAEA,IAAM,YAAc,EAApB;AACA,IAAM,cAAc,CAClB,aADkB,EACH,aADG,EACY,WADZ,EAElB,eAFkB,EAED,eAFC,CAApB;;AAKA;AACA,IAAI,gBAAgB,CAApB;;AAEA;AACA,MAAM,YAAN,GAAqB,EAArB;;IAEM,W;AACJ,yBAAe;AAAA;;AACb,SAAK,MAAL,GAAqB,IAArB,CADa,CACc;AAC3B,SAAK,OAAL,GAAqB,IAArB,CAFa,CAEc;;AAE3B,SAAK,QAAL,GAAqB,EAAM;AACzB,YAAO,IADY;AAEnB,YAAO,IAFY;AAGnB,aAAO;AAHY,KAArB;;AAMA;AACA,SAAK,QAAL,GAAmB,EAAnB;AACA,SAAK,UAAL,GAAmB,EAAnB;AACA,SAAK,WAAL,GAAmB,EAAnB;AACA,SAAK,SAAL,GAAmB,EAAnB;;AAEA;AACA,SAAK,UAAL,GAAkB;AAChB,YAAW,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EADK;AAEhB,cAAW,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EAFK;AAGhB,iBAAW;AAHK,KAAlB;AAKA;AACA,SAAK,SAAL,GAAiB;AACf,YAAW,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EADI;AAEf,cAAW,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EAFI;AAGf,iBAAW;AAHI,KAAjB;;AAMA;AACA,SAAK,WAAL,GAAmB;AACjB,YAAW,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EADM;AAEjB,cAAW,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EAFM;AAGjB,iBAAW;AAHM,KAAnB;;AAMA;AACA,SAAK,YAAL,GAAoB;AAClB,YAAW,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EAAc,IAAI,CAAlB,EAAqB,IAAI,CAAzB,EAA4B,OAAO,CAAnC,EADO;AAElB,cAAW,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EAAc,IAAI,CAAlB,EAAqB,IAAI,CAAzB,EAA4B,OAAO,CAAnC,EAFO;AAGlB,iBAAW;AAHO,KAApB;;AAMA,SAAK,SAAL,GAAmB,IAAnB,CA3Ca,CA2Ce;AAC5B,SAAK,WAAL,GAAmB,EAAnB;;AAEA,SAAK,YAAL,GAAuB,IAAvB;AACA,SAAK,eAAL,GAAuB,IAAvB;;AAEA,SAAK,SAAL,GAAiB,IAAjB,CAjDa,CAiDe;;AAE5B,SAAK,aAAL,GAAuB,KAAvB;AACA,SAAK,eAAL,GAAuB,KAAvB;AACA,SAAK,YAAL,GAAuB,KAAvB;;AAEA,SAAK,KAAL,GAAa,KAAb;;AAEA,YAAQ,IAAR,CAAa,KAAb,EAAoB,IAApB;;AAEA,UAAM,YAAN,CAAmB,IAAnB,CAAwB,IAAxB;AACD;;wBAED,W,wBAAa,O,EAAS,K,EAAO,W,EAAa;AACxC,QAAM,eAAe,KAAK,aAAL,CAAmB,OAAnB,EAA4B,KAA5B,EAAmC,IAAnC,CAArB;;AAEA,YAAQ,IAAR,CAAa,MAAb,EAAqB;AACnB,sBADmB;AAEnB,kBAFmB;AAGnB,8BAHmB;AAInB,gCAJmB;AAKnB,mBAAa;AALM,KAArB;AAOD,G;;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wBAgCA,K,kBAAO,M,EAAQ,M,EAAQ,O,EAAS;AAC9B,QAAI,KAAK,WAAL,MACG,CAAC,KAAK,aADT,IAEG,KAAK,UAAL,CAAgB,MAAhB,IAA0B,OAAO,IAAP,KAAgB,SAAhB,GAA2B,CAA3B,GAA+B,CAAzD,CAFP,EAEoE;AAClE;AACD;;AAED;AACA;AACA,QAAI,MAAM,OAAN,CAAc,MAAM,YAApB,EAAkC,IAAlC,MAA4C,CAAC,CAAjD,EAAoD;AAClD,YAAM,YAAN,CAAmB,IAAnB,CAAwB,IAAxB;AACD;;AAED,UAAM,UAAN,CAAiB,KAAK,QAAtB,EAAgC,MAAhC;AACA,SAAK,MAAL,GAAsB,MAAtB;AACA,SAAK,OAAL,GAAsB,OAAtB;;AAEA,YAAQ,IAAR,CAAa,cAAb,EAA6B;AAC3B,mBAAa,IADc;AAE3B,aAAO,KAAK;AAFe,KAA7B;AAID,G;;wBAED,W,wBAAa,O,EAAS,K,EAAO,W,EAAa;AACxC,QAAI,CAAC,KAAK,UAAV,EAAsB;AACpB,WAAK,aAAL,CAAmB,OAAnB;AACA,YAAM,SAAN,CAAgB,KAAK,SAArB,EAAgC,KAAK,QAArC;AACD;;AAED,QAAM,gBAAiB,KAAK,SAAL,CAAe,IAAf,CAAoB,CAApB,KAA0B,KAAK,UAAL,CAAgB,IAAhB,CAAqB,CAA/C,IACG,KAAK,SAAL,CAAe,IAAf,CAAoB,CAApB,KAA0B,KAAK,UAAL,CAAgB,IAAhB,CAAqB,CADlD,IAEG,KAAK,SAAL,CAAe,MAAf,CAAsB,CAAtB,KAA4B,KAAK,UAAL,CAAgB,MAAhB,CAAuB,CAFtD,IAGG,KAAK,SAAL,CAAe,MAAf,CAAsB,CAAtB,KAA4B,KAAK,UAAL,CAAgB,MAAhB,CAAuB,CAH7E;;AAKA,QAAI,WAAJ;AACA,QAAI,WAAJ;;AAEA;AACA,QAAI,KAAK,aAAL,IAAsB,CAAC,KAAK,eAAhC,EAAiD;AAC/C,WAAK,KAAK,SAAL,CAAe,MAAf,CAAsB,CAAtB,GAA0B,KAAK,WAAL,CAAiB,MAAjB,CAAwB,CAAvD;AACA,WAAK,KAAK,SAAL,CAAe,MAAf,CAAsB,CAAtB,GAA0B,KAAK,WAAL,CAAiB,MAAjB,CAAwB,CAAvD;;AAEA,WAAK,eAAL,GAAuB,MAAM,KAAN,CAAY,EAAZ,EAAgB,EAAhB,IAAsB,YAAY,oBAAzD;AACD;;AAED,QAAM,YAAY;AAChB,sBADgB;AAEhB,oBAAc,KAAK,eAAL,CAAqB,OAArB,CAFE;AAGhB,kBAHgB;AAIhB,8BAJgB;AAKhB,YALgB;AAMhB,YANgB;AAOhB,iBAAW,aAPK;AAQhB,mBAAa,IARG;AAShB,6BAAuB,KAAK,WAAL;AATP,KAAlB;;AAYA,QAAI,CAAC,aAAL,EAAoB;AAClB;AACA,YAAM,cAAN,CAAqB,KAAK,YAA1B,EAAwC,KAAK,UAA7C,EAAyD,KAAK,SAA9D;AACD;;AAED,YAAQ,IAAR,CAAa,MAAb,EAAqB,SAArB;;AAEA,QAAI,CAAC,aAAL,EAAoB;AAClB;AACA,UAAI,KAAK,WAAL,EAAJ,EAAwB;AACtB,aAAK,MAAL,CAAY,SAAZ;AACD;;AAED,UAAI,KAAK,eAAT,EAA0B;AACxB,cAAM,UAAN,CAAiB,KAAK,UAAtB,EAAkC,KAAK,SAAvC;AACD;AACF;AACF,G;;AAED;;;;;;;;;;;;;;;;;;;;;;wBAoBA,M,mBAAQ,S,EAAW;AACjB,gBAAY,MAAM,MAAN,CAAa;AACvB,eAAS,KAAK,QAAL,CAAc,CAAd,CADc;AAEvB,aAAO,KAAK,SAFW;AAGvB,mBAAa,KAAK,YAHK;AAIvB,mBAAa;AAJU,KAAb,EAKT,aAAa,EALJ,CAAZ;;AAOA,YAAQ,IAAR,CAAa,oBAAb,EAAmC,SAAnC;;AAEA,QAAI,CAAC,KAAK,aAAV,EAAyB;AACvB,cAAQ,IAAR,CAAa,aAAb,EAA4B,SAA5B;AACD;;AAED,SAAK,aAAL,GAAqB,KAArB;AACD,G;;AAED;;;wBACA,S,sBAAW,O,EAAS,K,EAAO,W,EAAa,c,EAAgB;AACtD,QAAM,eAAe,KAAK,eAAL,CAAqB,OAArB,CAArB;;AAEA,YAAQ,IAAR,CAAa,WAAW,IAAX,CAAgB,MAAM,IAAtB,IAA6B,QAA7B,GAAwC,IAArD,EAA2D;AACzD,sBADyD;AAEzD,gCAFyD;AAGzD,kBAHyD;AAIzD,8BAJyD;AAKzD,oCALyD;AAMzD,mBAAa;AAN4C,KAA3D;;AASA,QAAI,CAAC,KAAK,UAAV,EAAsB;AACpB,WAAK,GAAL,CAAS,KAAT;AACD;;AAED,SAAK,aAAL,GAAqB,KAArB;AACA,SAAK,aAAL,CAAmB,OAAnB,EAA4B,KAA5B;AACD,G;;AAED;;;;;;;;;;;;;;;;;;;;;;wBAoBA,G,gBAAK,K,EAAO;AACV,YAAQ,SAAS,KAAK,SAAtB;;AAEA,QAAI,KAAK,WAAL,EAAJ,EAAwB;AACtB,cAAQ,IAAR,CAAa,YAAb,EAA2B;AACzB,oBADyB;AAEzB,qBAAa;AAFY,OAA3B;AAID;;AAED,SAAK,IAAL;AACD,G;;wBAED,a,4BAAiB;AACf,WAAO,KAAK,YAAL,GAAmB,KAAK,QAAL,CAAc,IAAjC,GAAuC,IAA9C;AACD,G;;wBAED,W,0BAAe;AACb,WAAO,KAAK,YAAZ;AACD,G;;wBAED,I,mBAAQ;AACN,YAAQ,IAAR,CAAa,MAAb,EAAqB,EAAE,aAAa,IAAf,EAArB;;AAEA,QAAI,KAAK,YAAT,EAAuB;AACrB,cAAQ,IAAR,CAAa,aAAb,EAA4B,EAAE,aAAa,IAAf,EAA5B;AACA,cAAQ,IAAR,CAAa,UAAU,KAAK,QAAL,CAAc,IAArC,EAA2C,EAAE,aAAa,IAAf,EAA3C;AACD;;AAED,SAAK,MAAL,GAAc,KAAK,OAAL,GAAe,IAA7B;;AAEA,SAAK,YAAL,GAAoB,KAApB;AACA,SAAK,QAAL,CAAc,IAAd,GAAqB,KAAK,SAAL,GAAiB,IAAtC;AACD,G;;wBAED,e,4BAAiB,O,EAAS;AACxB,WAAO,MAAM,OAAN,CAAc,KAAK,UAAnB,EAA+B,MAAM,YAAN,CAAmB,OAAnB,CAA/B,CAAP;AACD,G;;wBAED,a,0BAAe,O,EAAS,K,EAA0D;AAAA,QAAnD,IAAmD,uEAA5C,SAAS,iBAAiB,IAAjB,CAAsB,MAAM,IAA5B,CAAmC;;AAChF,QAAM,KAAK,MAAM,YAAN,CAAmB,OAAnB,CAAX;AACA,QAAI,QAAQ,KAAK,eAAL,CAAqB,OAArB,CAAZ;;AAEA,QAAI,UAAU,CAAC,CAAf,EAAkB;AAChB,cAAQ,KAAK,UAAL,CAAgB,MAAxB;AACA,WAAK,UAAL,CAAgB,KAAhB,IAAyB,EAAzB;AACD;;AAED,QAAI,IAAJ,EAAU;AACR,cAAQ,IAAR,CAAa,qBAAb,EAAoC;AAClC,wBADkC;AAElC,oBAFkC;AAGlC,kBAHkC;AAIlC,mBAAW,EAJuB;AAKlC,sBAAc,KALoB;AAMlC,qBAAa;AANqB,OAApC;AAQD;;AAED,SAAK,QAAL,CAAc,KAAd,IAAuB,OAAvB;;AAEA,WAAO,KAAP;AACD,G;;wBAED,a,0BAAe,O,EAAS,K,EAAO;AAC7B,QAAM,KAAK,MAAM,YAAN,CAAmB,OAAnB,CAAX;AACA,QAAM,QAAQ,KAAK,KAAL,GAAY,CAAZ,GAAgB,MAAM,OAAN,CAAc,KAAK,UAAnB,EAA+B,EAA/B,CAA9B;;AAEA,QAAI,UAAU,CAAC,CAAf,EAAkB;AAAE;AAAS;;AAE7B,YAAQ,IAAR,CAAa,gBAAb,EAA+B;AAC7B,sBAD6B;AAE7B,kBAF6B;AAG7B,oBAAc,KAHe;AAI7B,mBAAa;AAJgB,KAA/B;;AAOA,SAAK,QAAL,CAAiB,MAAjB,CAAwB,KAAxB,EAA+B,CAA/B;AACA,SAAK,UAAL,CAAiB,MAAjB,CAAwB,KAAxB,EAA+B,CAA/B;AACA,SAAK,WAAL,CAAiB,MAAjB,CAAwB,KAAxB,EAA+B,CAA/B;AACA,SAAK,SAAL,CAAiB,MAAjB,CAAwB,KAAxB,EAA+B,CAA/B;AACD,G;;wBAED,mB,gCAAqB,M,EAAQ,a,EAAe;AAC1C,SAAK,YAAL,GAAuB,MAAvB;AACA,SAAK,eAAL,GAAuB,aAAvB;AACD,G;;;;;AAGH,KAAK,IAAI,IAAI,CAAR,EAAW,MAAM,YAAY,MAAlC,EAA0C,IAAI,GAA9C,EAAmD,GAAnD,EAAwD;AACtD,MAAM,SAAS,YAAY,CAAZ,CAAf;;AAEA,YAAU,MAAV,IAAoB,iBAAiB,MAAjB,CAApB;AACD;;AAED,SAAS,gBAAT,CAA2B,MAA3B,EAAmC;AACjC,SAAQ,UAAU,KAAV,EAAiB;AAAA,gCACe,MAAM,eAAN,CAAsB,KAAtB,CADf;AAAA,QAChB,WADgB;AAAA,QACH,cADG;;AAEvB,QAAM,UAAU,EAAhB,CAFuB,CAEH;;AAEpB,QAAI,QAAQ,aAAR,IAAyB,QAAQ,IAAR,CAAa,MAAM,IAAnB,CAA7B,EAAuD;AACrD,sBAAgB,IAAI,IAAJ,GAAW,OAAX,EAAhB;;AAEA,WAAK,IAAI,KAAI,CAAb,EAAgB,KAAI,MAAM,cAAN,CAAqB,MAAzC,EAAiD,IAAjD,EAAsD;AACpD,YAAM,UAAU,MAAM,cAAN,CAAqB,EAArB,CAAhB;AACA,YAAM,cAAc,OAAO,MAAP,CAAc,OAAd,EAAuB,MAAM,IAA7B,EAAmC,WAAnC,CAApB;;AAEA,gBAAQ,IAAR,CAAa,CAAC,OAAD,EAAU,eAAe,IAAI,WAAJ,EAAzB,CAAb;AACD;AACF,KATD,MAUK;AACH,UAAI,iBAAiB,KAArB;;AAEA,UAAI,CAAC,QAAQ,oBAAT,IAAiC,QAAQ,IAAR,CAAa,MAAM,IAAnB,CAArC,EAA+D;AAC7D;AACA,aAAK,IAAI,MAAI,CAAb,EAAgB,MAAI,MAAM,YAAN,CAAmB,MAAvB,IAAiC,CAAC,cAAlD,EAAkE,KAAlE,EAAuE;AACrE,2BAAiB,CAAC,MAAM,YAAN,CAAmB,GAAnB,EAAsB,KAAvB,IAAgC,MAAM,YAAN,CAAmB,GAAnB,EAAsB,aAAvE;AACD;;AAED;AACA;AACA,yBAAiB,kBACX,IAAI,IAAJ,GAAW,OAAX,KAAuB,aAAvB,GAAuC;AAC3C;AAFe,WAGZ,MAAM,SAAN,KAAoB,CAHzB;AAID;;AAED,UAAI,CAAC,cAAL,EAAqB;AACnB,YAAI,eAAc,OAAO,MAAP,CAAc,KAAd,EAAqB,MAAM,IAA3B,EAAiC,WAAjC,CAAlB;;AAEA,YAAI,CAAC,YAAL,EAAkB;;AAEhB,yBAAc,IAAI,WAAJ,EAAd;AACA,uBAAY,KAAZ,GAAqB,SAAS,IAAT,CAAc,MAAM,WAAN,IAAqB,MAAM,IAAzC;AACA;AADA,aAEG,MAAM,WAAN,KAAsB,CAFzB,IAGG,CAAC,MAAM,WAH/B;AAID;;AAED,gBAAQ,IAAR,CAAa,CAAC,KAAD,EAAQ,YAAR,CAAb;AACD;AACF;;AAED,yBAAqC,OAArC,mHAA8C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,UAAlC,QAAkC;AAAA,UAAzB,aAAyB;;AAC5C,oBAAY,mBAAZ,CAAgC,WAAhC,EAA6C,cAA7C;AACA,oBAAY,MAAZ,EAAoB,QAApB,EAA6B,KAA7B,EAAoC,WAApC,EAAiD,cAAjD;AACD;AACF,GAnDD;AAoDD;;AAED,SAAS,MAAT,CAAiB,KAAjB,EAAwB;AACtB,OAAK,IAAI,MAAI,CAAb,EAAgB,MAAI,MAAM,YAAN,CAAmB,MAAvC,EAA+C,KAA/C,EAAoD;AAClD,QAAM,cAAc,MAAM,YAAN,CAAmB,GAAnB,CAApB;;AAEA,gBAAY,GAAZ,CAAgB,KAAhB;AACA,YAAQ,IAAR,CAAa,QAAb,EAAuB,EAAE,YAAF,EAAS,wBAAT,EAAvB;AACD;AACF;;AAED,IAAM,YAAY,CAAE,+BAAF,CAAlB;AACA,IAAM,cAAc,QAAQ,WAA5B;;AAEA,IAAI,MAAM,YAAV,EAAwB;AACtB,YAAU,YAAY,IAAtB,IAAgC,UAAU,WAA1C;AACA,YAAU,YAAY,IAAtB,IAAgC,UAAU,WAA1C;AACA,YAAU,YAAY,EAAtB,IAAgC,UAAU,SAA1C;AACA,YAAU,YAAY,MAAtB,IAAgC,UAAU,SAA1C;AACD,CALD,MAMK;AACH,YAAU,SAAV,GAAwB,UAAU,WAAlC;AACA,YAAU,SAAV,GAAwB,UAAU,WAAlC;AACA,YAAU,OAAV,GAAwB,UAAU,SAAlC;;AAEA,YAAU,UAAV,GAAwB,UAAU,WAAlC;AACA,YAAU,SAAV,GAAwB,UAAU,WAAlC;AACA,YAAU,QAAV,GAAwB,UAAU,SAAlC;AACA,YAAU,WAAV,GAAwB,UAAU,SAAlC;AACD;;AAED,UAAU,IAAV,GAAiB,MAAjB;;AAEA,SAAS,WAAT,QAA+B,UAA/B,EAA2C;AAAA,MAAnB,GAAmB,SAAnB,GAAmB;;AACzC,MAAM,cAAc,WAAW,OAAX,CAAmB,KAAnB,MAA8B,CAA9B,GAChB,OAAO,GADS,GACH,OAAO,MADxB;;AAGA;AACA,OAAK,IAAM,SAAX,IAAwB,MAAM,eAA9B,EAA+C;AAC7C,gBAAY,GAAZ,EAAiB,SAAjB,EAA4B,OAAO,gBAAnC;AACA,gBAAY,GAAZ,EAAiB,SAAjB,EAA4B,OAAO,kBAAnC,EAAuD,IAAvD;AACD;;AAED,OAAK,IAAM,UAAX,IAAwB,SAAxB,EAAmC;AACjC,gBAAY,GAAZ,EAAiB,UAAjB,EAA4B,UAAU,UAAV,CAA5B;AACD;AACF;;AAED,QAAQ,EAAR,CAAW,qBAAX,EAAkC,iBAAiF;AAAA,MAA9E,WAA8E,SAA9E,WAA8E;AAAA,MAAjE,OAAiE,SAAjE,OAAiE;AAAA,MAAxD,SAAwD,SAAxD,SAAwD;AAAA,MAA7C,YAA6C,SAA7C,YAA6C;AAAA,MAA/B,KAA+B,SAA/B,KAA+B;AAAA,MAAxB,WAAwB,SAAxB,WAAwB;AAAA,MAAX,IAAW,SAAX,IAAW;;AACjH,cAAY,UAAZ,CAAuB,YAAvB,IAAuC,SAAvC;AACA,cAAY,QAAZ,CAAqB,YAArB,IAAqC,OAArC;;AAEA,MAAI,IAAJ,EAAU;AACR,gBAAY,aAAZ,GAA4B,IAA5B;AACD;;AAED,MAAI,CAAC,YAAY,WAAZ,EAAL,EAAgC;AAC9B,UAAM,SAAN,CAAgB,YAAY,WAA5B,EAAyC,YAAY,QAArD;;AAEA,UAAM,UAAN,CAAiB,YAAY,SAA7B,EAAyC,YAAY,WAArD;AACA,UAAM,UAAN,CAAiB,YAAY,UAA7B,EAAyC,YAAY,WAArD;;AAEA,gBAAY,SAAZ,GAAwC,KAAxC;AACA,gBAAY,SAAZ,CAAsB,YAAtB,IAAwC,YAAY,SAAZ,CAAsB,SAA9D;AACA,gBAAY,WAAZ,CAAwB,YAAxB,IAAwC,eAAe,SAAS,MAAM,eAAN,CAAsB,KAAtB,EAA6B,CAA7B,CAAhE;AACA,gBAAY,eAAZ,GAAwC,KAAxC;;AAEA,UAAM,aAAN,CAAoB,YAAY,WAAhC,EAA6C,OAA7C;AACD;AACF,CArBD;;AAuBA,MAAM,OAAN,CAAc,EAAd,CAAiB,cAAjB,EAAoC,WAApC;AACA,MAAM,OAAN,CAAc,EAAd,CAAiB,iBAAjB,EAAoC,WAApC;;AAEA,YAAY,oBAAZ,GAAmC,CAAnC;AACA,YAAY,gBAAZ,GAA+B,gBAA/B;AACA,YAAY,MAAZ,GAAqB,MAArB;AACA,YAAY,OAAZ,GAAsB,OAAtB;AACA,YAAY,SAAZ,GAAwB,SAAxB;;AAEA,MAAM,kBAAN,GAA2B,MAA3B;;AAEA,OAAO,OAAP,GAAiB,WAAjB;;;;;AC9fA,IAAM,cAAgB,QAAQ,gBAAR,CAAtB;AACA,IAAM,gBAAgB,QAAQ,kBAAR,CAAtB;;AAEA,IAAM,UAAU;AACd,4BADc;AAEd,SAAO,EAFO;AAGd,cAAY;AAHE,CAAhB;;AAMA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,cAAvB,EAAuC,gBAAkC;AAAA,MAAtB,WAAsB,QAAtB,WAAsB;AAAA,MAAT,KAAS,QAAT,KAAS;;AACvE,cAAY,YAAZ,GAA2B,IAA3B;AACA,eAAa,WAAb,EAA0B,KAA1B,EAAiC,OAAjC;AACD,CAHD;;AAKA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,aAAvB,EAAsC,iBAA0C;AAAA,MAA9B,WAA8B,SAA9B,WAA8B;AAAA,MAAjB,KAAiB,SAAjB,KAAiB;AAAA,MAAV,MAAU,SAAV,MAAU;;AAC9E,eAAa,WAAb,EAA0B,KAA1B,EAAiC,MAAjC,EAAyC,MAAzC;;AAEA;AACA,MAAI,CAAC,YAAY,WAAZ,EAAL,EAAgC;AAAE,WAAO,KAAP;AAAe;AAClD,CALD;;AAOA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,YAAvB,EAAqC,iBAAkC;AAAA,MAAtB,WAAsB,SAAtB,WAAsB;AAAA,MAAT,KAAS,SAAT,KAAS;;AACrE,eAAa,WAAb,EAA0B,KAA1B,EAAiC,KAAjC;AACD,CAFD;;AAIA,SAAS,YAAT,CAAuB,WAAvB,EAAoC,KAApC,EAA2C,KAA3C,EAAkD,MAAlD,EAA0D;AACxD,MAAM,aAAa,YAAY,QAAZ,CAAqB,IAAxC;;AAEA,MAAM,WAAW,IAAI,aAAJ,CAAkB,WAAlB,EAA+B,KAA/B,EAAsC,UAAtC,EAAkD,KAAlD,EAAyD,YAAY,OAArE,EAA8E,IAA9E,EAAoF,MAApF,CAAjB;;AAEA,cAAY,MAAZ,CAAmB,IAAnB,CAAwB,QAAxB;AACA,cAAY,SAAZ,GAAwB,QAAxB;AACD;;AAED,OAAO,OAAP,GAAiB,OAAjB;;;;;AClCA,IAAM,UAAiB,QAAQ,QAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,UAAR,CAAvB;AACA,IAAM,gBAAiB,QAAQ,kBAAR,CAAvB;AACA,IAAM,eAAiB,QAAQ,iBAAR,CAAvB;AACA,IAAM,cAAiB,QAAQ,gBAAR,CAAvB;AACA,IAAM,iBAAiB,QAAQ,mBAAR,CAAvB;;AAEA,IAAM,OAAO;AACX,YAAU;AACR,aAAc,KADN;AAER,kBAAc,IAFN;;AAIR,YAAY,IAJJ;AAKR,UAAY,IALJ;AAMR,cAAY,IANJ;AAOR,aAAY,IAPJ;AAQR,gBAAY,IARJ;;AAUR,eAAY,IAVJ;AAWR,cAAY;AAXJ,GADC;;AAeX,WAAS,iBAAU,OAAV,EAAmB,KAAnB,EAA0B,YAA1B,EAAwC;AAC/C,QAAM,cAAc,aAAa,OAAb,CAAqB,IAAzC;;AAEA,WAAO,YAAY,OAAZ,GACH,EAAE,MAAM,MAAR,EAAgB,MAAO,YAAY,QAAZ,KAAyB,OAAzB,GACE,YAAY,SADd,GAEE,YAAY,QAFrC,EADG,GAIH,IAJJ;AAKD,GAvBU;;AAyBX,aAAW,qBAAY;AACrB,WAAO,MAAP;AACD;AA3BU,CAAb;;AA8BA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,oBAAvB,EAA6C,gBAA2B;AAAA,MAAf,WAAe,QAAf,WAAe;;AACtE,MAAI,YAAY,QAAZ,CAAqB,IAArB,KAA8B,MAAlC,EAA0C;AAAE;AAAS;;AAErD,MAAM,OAAO,YAAY,QAAZ,CAAqB,IAAlC;;AAEA,MAAI,SAAS,GAAb,EAAkB;AAChB,gBAAY,SAAZ,CAAsB,IAAtB,CAA2B,CAA3B,GAAiC,YAAY,WAAZ,CAAwB,IAAxB,CAA6B,CAA9D;AACA,gBAAY,SAAZ,CAAsB,MAAtB,CAA6B,CAA7B,GAAiC,YAAY,WAAZ,CAAwB,MAAxB,CAA+B,CAAhE;;AAEA,gBAAY,YAAZ,CAAyB,IAAzB,CAA8B,KAA9B,GAAwC,KAAK,GAAL,CAAS,YAAY,YAAZ,CAAyB,IAAzB,CAA8B,EAAvC,CAAxC;AACA,gBAAY,YAAZ,CAAyB,MAAzB,CAAgC,KAAhC,GAAwC,KAAK,GAAL,CAAS,YAAY,YAAZ,CAAyB,MAAzB,CAAgC,EAAzC,CAAxC;AACA,gBAAY,YAAZ,CAAyB,MAAzB,CAAgC,EAAhC,GAAqC,CAArC;AACA,gBAAY,YAAZ,CAAyB,IAAzB,CAA8B,EAA9B,GAAqC,CAArC;AACD,GARD,MASK,IAAI,SAAS,GAAb,EAAkB;AACrB,gBAAY,SAAZ,CAAsB,IAAtB,CAA2B,CAA3B,GAAiC,YAAY,WAAZ,CAAwB,IAAxB,CAA6B,CAA9D;AACA,gBAAY,SAAZ,CAAsB,MAAtB,CAA6B,CAA7B,GAAiC,YAAY,WAAZ,CAAwB,MAAxB,CAA+B,CAAhE;;AAEA,gBAAY,YAAZ,CAAyB,IAAzB,CAA8B,KAA9B,GAAwC,KAAK,GAAL,CAAS,YAAY,YAAZ,CAAyB,IAAzB,CAA8B,EAAvC,CAAxC;AACA,gBAAY,YAAZ,CAAyB,MAAzB,CAAgC,KAAhC,GAAwC,KAAK,GAAL,CAAS,YAAY,YAAZ,CAAyB,MAAzB,CAAgC,EAAzC,CAAxC;AACA,gBAAY,YAAZ,CAAyB,MAAzB,CAAgC,EAAhC,GAAqC,CAArC;AACA,gBAAY,YAAZ,CAAyB,IAAzB,CAA8B,EAA9B,GAAqC,CAArC;AACD;AACF,CAvBD;;AAyBA;AACA,cAAc,OAAd,CAAsB,EAAtB,CAAyB,KAAzB,EAAgC,iBAAmC;AAAA,MAAvB,MAAuB,SAAvB,MAAuB;AAAA,MAAf,WAAe,SAAf,WAAe;;AACjE,MAAI,OAAO,IAAP,KAAgB,UAApB,EAAgC;AAAE;AAAS;;AAE3C,MAAM,OAAO,YAAY,QAAZ,CAAqB,IAAlC;;AAEA,MAAI,SAAS,GAAb,EAAkB;AAChB,WAAO,KAAP,GAAiB,YAAY,WAAZ,CAAwB,IAAxB,CAA6B,CAA9C;AACA,WAAO,OAAP,GAAiB,YAAY,WAAZ,CAAwB,MAAxB,CAA+B,CAAhD;AACA,WAAO,EAAP,GAAY,CAAZ;AACD,GAJD,MAKK,IAAI,SAAS,GAAb,EAAkB;AACrB,WAAO,KAAP,GAAiB,YAAY,WAAZ,CAAwB,IAAxB,CAA6B,CAA9C;AACA,WAAO,OAAP,GAAiB,YAAY,WAAZ,CAAwB,MAAxB,CAA+B,CAAhD;AACA,WAAO,EAAP,GAAY,CAAZ;AACD;AACF,CAfD;;AAiBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoCA,aAAa,SAAb,CAAuB,SAAvB,GAAmC,UAAU,OAAV,EAAmB;AACpD,MAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,OAAhB,CAAJ,EAA8B;AAC5B,SAAK,OAAL,CAAa,IAAb,CAAkB,OAAlB,GAA4B,QAAQ,OAAR,KAAoB,KAApB,GAA2B,KAA3B,GAAkC,IAA9D;AACA,SAAK,YAAL,CAAkB,MAAlB,EAA0B,OAA1B;AACA,SAAK,WAAL,CAAiB,MAAjB,EAAyB,OAAzB;;AAEA,QAAI,mBAAmB,IAAnB,CAAwB,QAAQ,QAAhC,CAAJ,EAA+C;AAC7C,WAAK,OAAL,CAAa,IAAb,CAAkB,QAAlB,GAA6B,QAAQ,QAArC;AACD;AACD,QAAI,aAAa,IAAb,CAAkB,QAAQ,SAA1B,CAAJ,EAA0C;AACxC,WAAK,OAAL,CAAa,IAAb,CAAkB,SAAlB,GAA8B,QAAQ,SAAtC;AACD;;AAED,WAAO,IAAP;AACD;;AAED,MAAI,MAAM,EAAN,CAAS,IAAT,CAAc,OAAd,CAAJ,EAA4B;AAC1B,SAAK,OAAL,CAAa,IAAb,CAAkB,OAAlB,GAA4B,OAA5B;;AAEA,QAAI,CAAC,OAAL,EAAc;AACZ,WAAK,WAAL,GAAmB,KAAK,WAAL,GAAmB,KAAK,SAAL,GAAiB,IAAvD;AACD;;AAED,WAAO,IAAP;AACD;;AAED,SAAO,KAAK,OAAL,CAAa,IAApB;AACD,CA3BD;;AA6BA,QAAQ,IAAR,GAAe,IAAf;AACA,QAAQ,KAAR,CAAc,IAAd,CAAmB,MAAnB;AACA,MAAM,KAAN,CAAY,aAAa,UAAzB,EAAqC,CACnC,WADmC,EAEnC,UAFmC,EAGnC,kBAHmC,EAInC,mBAJmC,EAKnC,SALmC,CAArC;AAOA,QAAQ,UAAR,CAAmB,IAAnB,GAA0B,WAA1B;;AAEA,eAAe,IAAf,GAAsB,KAAK,QAA3B;;AAEA,OAAO,OAAP,GAAiB,IAAjB;;;;;AC9JA,IAAM,UAAiB,QAAQ,QAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,UAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,UAAR,CAAvB;AACA,IAAM,WAAiB,QAAQ,aAAR,CAAvB;AACA,IAAM,gBAAiB,QAAQ,kBAAR,CAAvB;AACA,IAAM,eAAiB,QAAQ,iBAAR,CAAvB;AACA,IAAM,cAAiB,QAAQ,gBAAR,CAAvB;AACA,IAAM,iBAAiB,QAAQ,mBAAR,CAAvB;;AAEA,IAAM,OAAO;AACX,YAAU;AACR,aAAS,KADD;AAER,YAAS,IAFD;AAGR,aAAS;AAHD;AADC,CAAb;;AAQA,IAAI,cAAc,KAAlB;;AAEA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,cAAvB,EAAuC,gBAAkC;AAAA,MAAtB,WAAsB,QAAtB,WAAsB;AAAA,MAAT,KAAS,QAAT,KAAS;;AACvE,MAAI,YAAY,QAAZ,CAAqB,IAArB,KAA8B,MAAlC,EAA0C;AAAE;AAAS;;AAErD;AACA,cAAY,WAAZ,CAAwB,SAAxB,GAAoC,EAApC;AACA,cAAY,WAAZ,CAAwB,QAAxB,GAAoC,EAApC;AACA,cAAY,WAAZ,CAAwB,KAAxB,GAAoC,EAApC;;AAEA,cAAY,UAAZ,GAAyB,IAAzB;;AAEA,MAAI,CAAC,YAAY,WAAjB,EAA8B;AAC5B,mBAAe,WAAf,EAA4B,YAAY,OAAxC;AACD;;AAED,MAAM,YAAY,YAAY,SAA9B;AACA,MAAM,aAAa,cAAc,WAAd,EAA2B,KAA3B,EAAkC,SAAlC,CAAnB;;AAEA,MAAI,WAAW,QAAf,EAAyB;AACvB,oBAAgB,WAAhB,EAA6B,WAAW,QAAxC;AACD;AACF,CApBD;;AAsBA,cAAc,OAAd,CAAsB,EAAtB,CAAyB,KAAzB,EAAgC,iBAA0C;AAAA,MAA9B,WAA8B,SAA9B,WAA8B;AAAA,MAAjB,MAAiB,SAAjB,MAAiB;AAAA,MAAT,KAAS,SAAT,KAAS;;AACxE,MAAI,OAAO,IAAP,KAAgB,UAAhB,IAA8B,OAAO,IAAP,KAAgB,SAAlD,EAA6D;AAAE;AAAS;;AAExE,MAAM,mBAAmB,YAAY,OAArC;AACA,MAAM,YAAY,MAAlB;AACA,MAAM,aAAa,QAAQ,SAAR,EAAmB,KAAnB,EAA0B,gBAA1B,CAAnB;;AAEA,cAAY,UAAZ,GAA0B,WAAW,QAArC;AACA,cAAY,WAAZ,GAA0B,WAAW,OAArC;;AAEA,cAAY,UAAZ,GAAyB,cAAc,WAAd,EAA2B,KAA3B,EAAkC,SAAlC,CAAzB;AACD,CAXD;;AAaA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,aAAvB,EAAsC,iBAA2B;AAAA,MAAf,WAAe,SAAf,WAAe;;AAC/D,MAAI,YAAY,QAAZ,CAAqB,IAArB,KAA8B,MAAlC,EAA0C;AAAE;AAAS;;AAErD,iBAAe,WAAf,EAA4B,YAAY,UAAxC;AACD,CAJD;;AAMA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,YAAvB,EAAqC,iBAA2B;AAAA,MAAf,WAAe,SAAf,WAAe;;AAC9D,MAAI,YAAY,QAAZ,CAAqB,IAArB,KAA8B,MAAlC,EAA0C;AACxC,mBAAe,WAAf,EAA4B,YAAY,UAAxC;AACD;AACF,CAJD;;AAMA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,WAAvB,EAAoC,iBAA2B;AAAA,MAAf,WAAe,SAAf,WAAe;;AAC7D,cAAY,WAAZ,CAAwB,SAAxB,GACE,YAAY,WAAZ,CAAwB,QAAxB,GACA,YAAY,WAAZ,CAAwB,KAAxB,GACA,YAAY,UAAZ,GAAyB,IAH3B;AAID,CALD;;AAOA,SAAS,YAAT,CAAuB,WAAvB,EAAoC,OAApC,EAA6C;AAC3C,MAAM,QAAQ,EAAd;AACA,MAAM,WAAW,EAAjB;;AAEA,YAAU,WAAW,YAAY,OAAjC;;AAEA;AACA,uBAAsB,MAAM,aAA5B,kHAA2C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,QAAhC,OAAgC;;AACzC,QAAI,CAAC,QAAQ,OAAR,CAAgB,IAAhB,CAAqB,OAA1B,EAAmC;AAAE;AAAW;;AAEhD,QAAM,SAAS,QAAQ,OAAR,CAAgB,IAAhB,CAAqB,MAApC;;AAEA;AACA,QAAK,MAAM,EAAN,CAAS,OAAT,CAAiB,MAAjB,KAA4B,WAAW,OAAxC,IACI,MAAM,EAAN,CAAS,MAAT,CAAgB,MAAhB,KACD,CAAC,MAAM,eAAN,CAAsB,OAAtB,EAA+B,MAA/B,CAFR,EAEiD;;AAE/C;AACD;;AAED;AACA,QAAM,eAAe,MAAM,EAAN,CAAS,MAAT,CAAgB,QAAQ,MAAxB,IACjB,QAAQ,QAAR,CAAiB,gBAAjB,CAAkC,QAAQ,MAA1C,CADiB,GAEjB,CAAC,QAAQ,MAAT,CAFJ;;AAIA,SAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,aAAa,MAAjC,EAAyC,GAAzC,EAA8C;AAC5C,UAAM,iBAAiB,aAAa,CAAb,CAAvB;;AAEA,UAAI,mBAAmB,OAAvB,EAAgC;AAC9B,cAAM,IAAN,CAAW,OAAX;AACA,iBAAS,IAAT,CAAc,cAAd;AACD;AACF;AACF;;AAED,SAAO;AACL,sBADK;AAEL,eAAW;AAFN,GAAP;AAID;;AAED,SAAS,eAAT,CAA0B,WAA1B,EAAuC,KAAvC,EAA8C;AAC5C,MAAI,oBAAJ;;AAEA;AACA,OAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,YAAY,WAAZ,CAAwB,SAAxB,CAAkC,MAAtD,EAA8D,GAA9D,EAAmE;AACjE,QAAM,UAAU,YAAY,WAAZ,CAAwB,SAAxB,CAAkC,CAAlC,CAAhB;AACA,QAAM,iBAAiB,YAAY,WAAZ,CAAwB,QAAxB,CAAkC,CAAlC,CAAvB;;AAEA;AACA,QAAI,mBAAmB,WAAvB,EAAoC;AAClC;AACA,YAAM,MAAN,GAAe,cAAf;AACA,cAAQ,IAAR,CAAa,KAAb;AACD;AACD,kBAAc,cAAd;AACD;AACF;;AAED;AACA;AACA;AACA,SAAS,cAAT,CAAyB,WAAzB,EAAsC,WAAtC,EAAmD;AACjD;AACA,MAAM,gBAAgB,aAAa,WAAb,EAA0B,WAA1B,EAAuC,IAAvC,CAAtB;;AAEA,cAAY,WAAZ,CAAwB,SAAxB,GAAoC,cAAc,SAAlD;AACA,cAAY,WAAZ,CAAwB,QAAxB,GAAoC,cAAc,QAAlD;AACA,cAAY,WAAZ,CAAwB,KAAxB,GAAoC,EAApC;;AAEA,OAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,YAAY,WAAZ,CAAwB,SAAxB,CAAkC,MAAtD,EAA8D,GAA9D,EAAmE;AACjE,gBAAY,WAAZ,CAAwB,KAAxB,CAA8B,CAA9B,IACE,YAAY,WAAZ,CAAwB,SAAxB,CAAkC,CAAlC,EAAqC,OAArC,CAA6C,YAAY,WAAZ,CAAwB,QAAxB,CAAiC,CAAjC,CAA7C,CADF;AAED;AACF;;AAED,SAAS,OAAT,CAAkB,SAAlB,EAA6B,KAA7B,EAAoC,WAApC,EAAiD;AAC/C,MAAM,cAAc,UAAU,WAA9B;AACA,MAAM,aAAa,EAAnB;;AAEA,MAAI,WAAJ,EAAiB;AACf,mBAAe,WAAf,EAA4B,WAA5B;AACD;;AAED;AACA,OAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,YAAY,WAAZ,CAAwB,SAAxB,CAAkC,MAAtD,EAA8D,GAA9D,EAAmE;AACjE,QAAM,UAAiB,YAAY,WAAZ,CAAwB,SAAxB,CAAkC,CAAlC,CAAvB;AACA,QAAM,iBAAiB,YAAY,WAAZ,CAAwB,QAAxB,CAAkC,CAAlC,CAAvB;AACA,QAAM,OAAiB,YAAY,WAAZ,CAAwB,KAAxB,CAAkC,CAAlC,CAAvB;;AAEA,eAAW,IAAX,CAAgB,QAAQ,SAAR,CAAkB,SAAlB,EAA6B,KAA7B,EAAoC,YAAY,MAAhD,EAAwD,WAAxD,EAAqE,cAArE,EAAqF,IAArF,IACZ,cADY,GAEZ,IAFJ;AAGD;;AAED;AACA,MAAM,YAAY,MAAM,qBAAN,CAA4B,UAA5B,CAAlB;;AAEA,SAAO;AACL,cAAU,YAAY,WAAZ,CAAwB,SAAxB,CAAkC,SAAlC,KAAgD,IADrD;AAEL,aAAU,YAAY,WAAZ,CAAwB,QAAxB,CAAkC,SAAlC,KAAgD;AAFrD,GAAP;AAID;;AAED,SAAS,aAAT,CAAwB,WAAxB,EAAqC,YAArC,EAAmD,SAAnD,EAA8D;AAC5D,MAAM,aAAa;AACjB,WAAY,IADK;AAEjB,WAAY,IAFK;AAGjB,cAAY,IAHK;AAIjB,gBAAY,IAJK;AAKjB,UAAY,IALK;AAMjB,UAAY;AANK,GAAnB;;AASA,MAAM,OAAO;AACX,wBADW;AAEX,4BAFW;AAGX,YAAe,YAAY,WAHhB;AAIX,cAAe,YAAY,UAJhB;AAKX,mBAAe,UAAU,MALd;AAMX,eAAe,UAAU,YANd;AAOX,eAAe,UAAU;AAPd,GAAb;;AAUA,MAAI,YAAY,WAAZ,KAA4B,YAAY,eAA5C,EAA6D;AAC3D;AACA,QAAI,YAAY,cAAhB,EAAgC;AAC9B,iBAAW,KAAX,GAAmB,MAAM,MAAN,CAAa,EAAE,MAAM,WAAR,EAAb,EAAoC,IAApC,CAAnB;;AAEA,gBAAU,SAAV,GAAyB,WAAW,KAAX,CAAiB,MAAjB,GAA4B,YAAY,eAAjE;AACA,gBAAU,YAAV,GAAyB,WAAW,KAAX,CAAiB,QAAjB,GAA4B,YAAY,cAAjE;AACD;AACD;AACA,QAAI,YAAY,UAAhB,EAA4B;AAC1B,iBAAW,KAAX,GAAmB;AACjB,4BADiB;AAEjB,gCAFiB;AAGjB,gBAAe,YAAY,WAHV;AAIjB,kBAAe,YAAY,UAJV;AAKjB,uBAAe,UAAU,MALR;AAMjB,mBAAe,UAAU,YANR;AAOjB,mBAAe,UAAU,SAPR;AAQjB,cAAe;AARE,OAAnB;;AAWA,gBAAU,SAAV,GAAsB,YAAY,WAAlC;AACA,gBAAU,QAAV,GAAqB,YAAY,UAAjC;AACD;AACF;;AAED,MAAI,UAAU,IAAV,KAAmB,SAAnB,IAAgC,YAAY,UAAhD,EAA4D;AAC1D,eAAW,IAAX,GAAkB,MAAM,MAAN,CAAa,EAAE,MAAM,MAAR,EAAb,EAA+B,IAA/B,CAAlB;;AAEA,cAAU,QAAV,GAAqB,YAAY,UAAjC;AACA,cAAU,aAAV,GAA0B,YAAY,WAAtC;AACD;AACD,MAAI,UAAU,IAAV,KAAmB,WAAvB,EAAoC;AAClC,eAAW,QAAX,GAAsB,MAAM,MAAN,CAAa,EAAE,MAAM,cAAR,EAAb,EAAuC,IAAvC,CAAtB;;AAEA,eAAW,QAAX,CAAoB,MAApB,GAA+B,IAA/B;AACA,eAAW,QAAX,CAAoB,QAApB,GAA+B,IAA/B;AACD;AACD,MAAI,UAAU,IAAV,KAAmB,SAAvB,EAAkC;AAChC,eAAW,UAAX,GAAwB,MAAM,MAAN,CAAa,EAAE,MAAM,gBAAR,EAAb,EAAyC,IAAzC,CAAxB;;AAEA,eAAW,UAAX,CAAsB,MAAtB,GAAiC,IAAjC;AACA,eAAW,UAAX,CAAsB,QAAtB,GAAiC,IAAjC;AACD;AACD,MAAI,UAAU,IAAV,KAAmB,UAAnB,IAAiC,YAAY,UAAjD,EAA6D;AAC3D,eAAW,IAAX,GAAkB,MAAM,MAAN,CAAa;AAC7B,gBAAe,SADc;AAE7B,YAAe;AAFc,KAAb,EAGf,IAHe,CAAlB;;AAKA,cAAU,QAAV,GAAqB,YAAY,UAAjC;AACD;;AAED,SAAO,UAAP;AACD;;AAED,SAAS,cAAT,CAAyB,WAAzB,EAAsC,UAAtC,EAAkD;AAChD,MAAI,WAAW,KAAf,EAAsB;AAAE,gBAAY,cAAZ,CAA2B,IAA3B,CAAgC,WAAW,KAA3C;AAAoD;AAC5E,MAAI,WAAW,IAAf,EAAsB;AAAM,gBAAY,UAAZ,CAAuB,IAAvB,CAA4B,WAAW,IAAvC;AAAgD;AAC5E,MAAI,WAAW,KAAf,EAAsB;AAAM,gBAAY,UAAZ,CAAuB,IAAvB,CAA4B,WAAW,KAAvC;AAAgD;AAC5E,MAAI,WAAW,IAAf,EAAsB;AAAM,gBAAY,UAAZ,CAAuB,IAAvB,CAA4B,WAAW,IAAvC;AAAgD;AAC5E,MAAI,WAAW,UAAf,EAA2B;AACzB,oBAAgB,WAAhB,EAA6B,WAAW,UAAxC;AACD;;AAED,cAAY,cAAZ,GAA8B,YAAY,UAA1C;AACA,cAAY,eAAZ,GAA8B,YAAY,WAA1C;AACD;;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoDA,aAAa,SAAb,CAAuB,QAAvB,GAAkC,UAAU,OAAV,EAAmB;AACnD,MAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,OAAhB,CAAJ,EAA8B;AAC5B,SAAK,OAAL,CAAa,IAAb,CAAkB,OAAlB,GAA4B,QAAQ,OAAR,KAAoB,KAApB,GAA2B,KAA3B,GAAkC,IAA9D;;AAEA,QAAI,MAAM,EAAN,CAAS,QAAT,CAAkB,QAAQ,MAA1B,CAAJ,EAAiD;AAAE,WAAK,MAAL,CAAY,MAAZ,GAA+B,QAAQ,MAAvC;AAA0D;AAC7G,QAAI,MAAM,EAAN,CAAS,QAAT,CAAkB,QAAQ,cAA1B,CAAJ,EAAiD;AAAE,WAAK,MAAL,CAAY,cAAZ,GAA+B,QAAQ,cAAvC;AAA0D;AAC7G,QAAI,MAAM,EAAN,CAAS,QAAT,CAAkB,QAAQ,gBAA1B,CAAJ,EAAiD;AAAE,WAAK,MAAL,CAAY,gBAAZ,GAA+B,QAAQ,gBAAvC;AAA0D;AAC7G,QAAI,MAAM,EAAN,CAAS,QAAT,CAAkB,QAAQ,WAA1B,CAAJ,EAAiD;AAAE,WAAK,MAAL,CAAY,WAAZ,GAA+B,QAAQ,WAAvC;AAA0D;AAC7G,QAAI,MAAM,EAAN,CAAS,QAAT,CAAkB,QAAQ,WAA1B,CAAJ,EAAiD;AAAE,WAAK,MAAL,CAAY,WAAZ,GAA+B,QAAQ,WAAvC;AAA0D;AAC7G,QAAI,MAAM,EAAN,CAAS,QAAT,CAAkB,QAAQ,UAA1B,CAAJ,EAAiD;AAAE,WAAK,MAAL,CAAY,UAAZ,GAA+B,QAAQ,UAAvC;AAA0D;;AAE7G,QAAI,qBAAqB,IAArB,CAA0B,QAAQ,OAAlC,CAAJ,EAAgD;AAC9C,WAAK,OAAL,CAAa,IAAb,CAAkB,OAAlB,GAA4B,QAAQ,OAApC;AACD,KAFD,MAGK,IAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,QAAQ,OAAxB,CAAJ,EAAsC;AACzC,WAAK,OAAL,CAAa,IAAb,CAAkB,OAAlB,GAA4B,KAAK,GAAL,CAAS,KAAK,GAAL,CAAS,CAAT,EAAY,QAAQ,OAApB,CAAT,EAAuC,CAAvC,CAA5B;AACD;AACD,QAAI,YAAY,OAAhB,EAAyB;AACvB,WAAK,OAAL,CAAa,IAAb,CAAkB,MAAlB,GAA2B,QAAQ,MAAnC;AACD;AACD,QAAI,aAAa,OAAjB,EAA0B;AACxB,WAAK,OAAL,CAAa,IAAb,CAAkB,OAAlB,GAA4B,QAAQ,OAApC;AACD;;AAGD,WAAO,IAAP;AACD;;AAED,MAAI,MAAM,EAAN,CAAS,IAAT,CAAc,OAAd,CAAJ,EAA4B;AAC1B,SAAK,OAAL,CAAa,IAAb,CAAkB,OAAlB,GAA4B,OAA5B;;AAEA,QAAI,CAAC,OAAL,EAAc;AACZ,WAAK,WAAL,GAAmB,KAAK,WAAL,GAAmB,KAAK,MAAL,GAClC,KAAK,cAAL,GAAsB,KAAK,gBAAL,GAAwB,IADlD;AAED;;AAED,WAAO,IAAP;AACD;;AAED,SAAO,KAAK,OAAL,CAAa,IAApB;AACD,CAxCD;;AA0CA,aAAa,SAAb,CAAuB,SAAvB,GAAmC,UAAU,SAAV,EAAqB,KAArB,EAA4B,SAA5B,EAAuC,gBAAvC,EAAyD,WAAzD,EAAsE,IAAtE,EAA4E;AAC7G,MAAI,UAAU,KAAd;;AAEA;AACA;AACA,MAAI,EAAE,OAAO,QAAQ,KAAK,OAAL,CAAa,WAAb,CAAjB,CAAJ,EAAiD;AAC/C,WAAQ,KAAK,OAAL,CAAa,IAAb,CAAkB,OAAlB,GACJ,KAAK,OAAL,CAAa,IAAb,CAAkB,OAAlB,CAA0B,SAA1B,EAAqC,KAArC,EAA4C,OAA5C,EAAqD,IAArD,EAA2D,WAA3D,EAAwE,SAAxE,EAAmF,gBAAnF,CADI,GAEJ,KAFJ;AAGD;;AAED,MAAM,cAAc,KAAK,OAAL,CAAa,IAAb,CAAkB,OAAtC;;AAEA,MAAI,gBAAgB,SAApB,EAA+B;AAC7B,QAAM,SAAS,MAAM,WAAN,CAAkB,SAAlB,EAA6B,gBAA7B,EAA+C,MAA/C,CAAf;AACA,QAAM,OAAO,MAAM,SAAN,CAAgB,SAAhB,CAAb;;AAEA,SAAK,CAAL,IAAU,OAAO,CAAjB;AACA,SAAK,CAAL,IAAU,OAAO,CAAjB;;AAEA,QAAM,aAAc,KAAK,CAAL,GAAS,KAAK,IAAf,IAAyB,KAAK,CAAL,GAAS,KAAK,KAA1D;AACA,QAAM,WAAc,KAAK,CAAL,GAAS,KAAK,GAAf,IAAyB,KAAK,CAAL,GAAS,KAAK,MAA1D;;AAEA,cAAU,cAAc,QAAxB;AACD;;AAED,MAAM,WAAW,UAAU,OAAV,CAAkB,gBAAlB,CAAjB;;AAEA,MAAI,YAAY,gBAAgB,QAAhC,EAA0C;AACxC,QAAM,KAAK,SAAS,IAAT,GAAgB,SAAS,KAAT,GAAkB,CAA7C;AACA,QAAM,KAAK,SAAS,GAAT,GAAgB,SAAS,MAAT,GAAkB,CAA7C;;AAEA,cAAU,MAAM,KAAK,IAAX,IAAmB,MAAM,KAAK,KAA9B,IAAuC,MAAM,KAAK,GAAlD,IAAyD,MAAM,KAAK,MAA9E;AACD;;AAED,MAAI,YAAY,MAAM,EAAN,CAAS,MAAT,CAAgB,WAAhB,CAAhB,EAA8C;AAC5C,QAAM,cAAgB,KAAK,GAAL,CAAS,CAAT,EAAY,KAAK,GAAL,CAAS,KAAK,KAAd,EAAsB,SAAS,KAA/B,IAAyC,KAAK,GAAL,CAAS,KAAK,IAAd,EAAoB,SAAS,IAA7B,CAArD,IACE,KAAK,GAAL,CAAS,CAAT,EAAY,KAAK,GAAL,CAAS,KAAK,MAAd,EAAsB,SAAS,MAA/B,IAAyC,KAAK,GAAL,CAAS,KAAK,GAAd,EAAoB,SAAS,GAA7B,CAArD,CADxB;;AAGA,QAAM,eAAe,eAAe,SAAS,KAAT,GAAiB,SAAS,MAAzC,CAArB;;AAEA,cAAU,gBAAgB,WAA1B;AACD;;AAED,MAAI,KAAK,OAAL,CAAa,IAAb,CAAkB,OAAtB,EAA+B;AAC7B,cAAU,KAAK,OAAL,CAAa,IAAb,CAAkB,OAAlB,CAA0B,SAA1B,EAAqC,KAArC,EAA4C,OAA5C,EAAqD,IAArD,EAA2D,WAA3D,EAAwE,SAAxE,EAAmF,gBAAnF,CAAV;AACD;;AAED,SAAO,OAAP;AACD,CAjDD;;AAmDA,aAAa,OAAb,CAAqB,EAArB,CAAwB,OAAxB,EAAiC,iBAA4B;AAAA,MAAhB,YAAgB,SAAhB,YAAgB;;AAC3D,eAAa,QAAb,CAAsB,KAAtB;AACD,CAFD;;AAIA,aAAa,eAAb,CAA6B,IAA7B,CAAkC,aAAlC;;AAEA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,KAAvB,EAA8B,UAAU,WAAV,EAAuB;AACnD,cAAY,UAAZ,GAA8B,IAA9B,CADmD,CACf;AACpC,cAAY,WAAZ,GAA8B,IAA9B,CAFmD,CAEf;AACpC,cAAY,cAAZ,GAA8B,IAA9B,CAHmD,CAGf;AACpC,cAAY,eAAZ,GAA8B,IAA9B,CAJmD,CAIf;AACpC,cAAY,UAAZ,GAA8B,IAA9B,CALmD,CAKf;;AAEpC,cAAY,WAAZ,GAA0B;AACxB,eAAW,EADa,EACJ;AACpB,cAAW,EAFa,EAEJ;AACpB,WAAW,EAHa,CAGJ;AAHI,GAA1B;AAMD,CAbD;;AAeA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,MAAvB,EAA+B,iBAA2B;AAAA,MAAf,WAAe,SAAf,WAAe;;AACxD,cAAY,UAAZ,GAAyB,YAAY,WAAZ,GACvB,YAAY,cAAZ,GAA6B,YAAY,eAAZ,GAA8B,IAD7D;AAED,CAHD;;AAKA;;;;;;;;;;;AAWA,SAAS,WAAT,GAAuB,UAAU,QAAV,EAAoB;AACzC,MAAI,MAAM,EAAN,CAAS,IAAT,CAAc,QAAd,CAAJ,EAA6B;AAC3B;AACE;AACF;;AAEA,kBAAc,QAAd;;AAEA,WAAO,QAAP;AACD;AACD,SAAO,WAAP;AACD,CAXD;;AAaA,MAAM,KAAN,CAAY,aAAa,UAAzB,EAAqC,CACnC,WADmC,EAEnC,WAFmC,EAGnC,cAHmC,EAInC,gBAJmC,EAKnC,UALmC,EAMnC,MANmC,CAArC;AAQA,QAAQ,UAAR,CAAmB,IAAnB,GAA0B,UAA1B;;AAEA,eAAe,IAAf,GAAsB,KAAK,QAA3B;;AAEA,OAAO,OAAP,GAAiB,IAAjB;;;;;ACzdA,IAAM,UAAiB,QAAQ,QAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,UAAR,CAAvB;AACA,IAAM,gBAAiB,QAAQ,kBAAR,CAAvB;AACA,IAAM,eAAiB,QAAQ,iBAAR,CAAvB;AACA,IAAM,cAAiB,QAAQ,gBAAR,CAAvB;AACA,IAAM,iBAAiB,QAAQ,mBAAR,CAAvB;;AAEA,IAAM,UAAU;AACd,YAAU;AACR,aAAU,KADF;AAER,YAAU,IAFF;AAGR,cAAU;AAHF,GADI;;AAOd,WAAS,iBAAU,OAAV,EAAmB,KAAnB,EAA0B,YAA1B,EAAwC,OAAxC,EAAiD,WAAjD,EAA8D;AACrE,QAAI,YAAY,UAAZ,CAAuB,MAAvB,IAAiC,CAArC,EAAwC;AACtC,aAAO,EAAE,MAAM,SAAR,EAAP;AACD;;AAED,WAAO,IAAP;AACD,GAba;;AAed,aAAW,qBAAY;AACrB,WAAO,EAAP;AACD;AAjBa,CAAhB;;AAoBA,cAAc,OAAd,CAAsB,EAAtB,CAAyB,KAAzB,EAAgC,gBAAmC;AAAA,MAAvB,MAAuB,QAAvB,MAAuB;AAAA,MAAf,WAAe,QAAf,WAAe;;AACjE,MAAI,OAAO,IAAP,KAAgB,cAApB,EAAoC;AAAE;AAAS;AAC/C,SAAO,EAAP,GAAY,CAAZ;;AAEA,cAAY,OAAZ,CAAoB,aAApB,GAAoC,YAAY,OAAZ,CAAoB,YAApB,GAAmC,OAAO,QAA9E;AACA,cAAY,OAAZ,CAAoB,UAApB,GAAiC,YAAY,OAAZ,CAAoB,SAApB,GAAgC,OAAO,KAAxE;AACA,cAAY,OAAZ,CAAoB,KAApB,GAA4B,CAA5B;AACD,CAPD;;AASA,cAAc,OAAd,CAAsB,EAAtB,CAAyB,KAAzB,EAAgC,iBAAmC;AAAA,MAAvB,MAAuB,SAAvB,MAAuB;AAAA,MAAf,WAAe,SAAf,WAAe;;AACjE,MAAI,OAAO,IAAP,KAAgB,aAApB,EAAmC;AAAE;AAAS;;AAE9C,SAAO,EAAP,GAAY,OAAO,KAAP,GAAe,YAAY,OAAZ,CAAoB,KAA/C;;AAEA,cAAY,MAAZ,CAAmB,IAAnB,CAAwB,MAAxB;;AAEA,cAAY,OAAZ,CAAoB,SAApB,GAAgC,OAAO,KAAvC;AACA,cAAY,OAAZ,CAAoB,YAApB,GAAmC,OAAO,QAA1C;;AAEA,MAAI,OAAO,KAAP,KAAiB,QAAjB,IACG,OAAO,KAAP,KAAiB,IADpB,IAEG,OAAO,KAAP,KAAiB,SAFpB,IAGG,CAAC,MAAM,OAAO,KAAb,CAHR,EAG6B;;AAE3B,gBAAY,OAAZ,CAAoB,KAApB,GAA4B,OAAO,KAAnC;AACD;AACF,CAjBD;;AAmBA;;;;;;;;;;;;;;;;;;;;;;;AAuBA,aAAa,SAAb,CAAuB,UAAvB,GAAoC,UAAU,OAAV,EAAmB;AACrD,MAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,OAAhB,CAAJ,EAA8B;AAC5B,SAAK,OAAL,CAAa,OAAb,CAAqB,OAArB,GAA+B,QAAQ,OAAR,KAAoB,KAApB,GAA2B,KAA3B,GAAkC,IAAjE;AACA,SAAK,YAAL,CAAkB,SAAlB,EAA6B,OAA7B;AACA,SAAK,WAAL,CAAiB,SAAjB,EAA4B,OAA5B;;AAEA,WAAO,IAAP;AACD;;AAED,MAAI,MAAM,EAAN,CAAS,IAAT,CAAc,OAAd,CAAJ,EAA4B;AAC1B,SAAK,OAAL,CAAa,OAAb,CAAqB,OAArB,GAA+B,OAA/B;;AAEA,QAAI,CAAC,OAAL,EAAc;AACZ,WAAK,cAAL,GAAsB,KAAK,cAAL,GAAsB,KAAK,YAAL,GAAoB,IAAhE;AACD;;AAED,WAAO,IAAP;AACD;;AAED,SAAO,KAAK,OAAL,CAAa,OAApB;AACD,CApBD;;AAsBA,cAAc,OAAd,CAAsB,EAAtB,CAAyB,WAAzB,EAAsC,iBAAiF;AAAA,MAArE,WAAqE,SAArE,WAAqE;AAAA,MAAxD,MAAwD,SAAxD,MAAwD;AAAA,MAAhD,MAAgD,SAAhD,MAAgD;AAAA,MAAxC,KAAwC,SAAxC,KAAwC;AAAA,MAAjC,QAAiC,SAAjC,QAAiC;AAAA,MAAvB,MAAuB,SAAvB,MAAuB;AAAA,MAAf,WAAe,SAAf,WAAe;;AACrH,MAAI,WAAW,SAAf,EAA0B;AAAE;AAAS;;AAErC,MAAM,WAAW,YAAY,QAA7B;;AAEA,SAAO,OAAP,GAAiB,CAAC,SAAS,CAAT,CAAD,EAAc,SAAS,CAAT,CAAd,CAAjB;;AAEA,MAAI,QAAJ,EAAc;AACZ,WAAO,QAAP,GAAkB,MAAM,aAAN,CAAoB,QAApB,EAA8B,WAA9B,CAAlB;AACA,WAAO,GAAP,GAAkB,MAAM,SAAN,CAAgB,QAAhB,CAAlB;AACA,WAAO,KAAP,GAAkB,CAAlB;AACA,WAAO,EAAP,GAAkB,CAAlB;AACA,WAAO,KAAP,GAAkB,MAAM,UAAN,CAAiB,QAAjB,EAA2B,SAA3B,EAAsC,WAAtC,CAAlB;AACA,WAAO,EAAP,GAAkB,CAAlB;AACD,GAPD,MAQK,IAAI,UAAU,iBAAiB,aAA/B,EAA8C;AACjD,WAAO,QAAP,GAAkB,YAAY,SAAZ,CAAsB,QAAxC;AACA,WAAO,GAAP,GAAkB,YAAY,SAAZ,CAAsB,GAAxC;AACA,WAAO,KAAP,GAAkB,YAAY,SAAZ,CAAsB,KAAxC;AACA,WAAO,EAAP,GAAkB,OAAO,KAAP,GAAe,CAAjC;AACA,WAAO,KAAP,GAAkB,YAAY,SAAZ,CAAsB,KAAxC;AACA,WAAO,EAAP,GAAkB,OAAO,KAAP,GAAe,YAAY,OAAZ,CAAoB,UAArD;AACD,GAPI,MAQA;AACH,WAAO,QAAP,GAAkB,MAAM,aAAN,CAAoB,QAApB,EAA8B,WAA9B,CAAlB;AACA,WAAO,GAAP,GAAkB,MAAM,SAAN,CAAgB,QAAhB,CAAlB;AACA,WAAO,KAAP,GAAkB,OAAO,QAAP,GAAkB,YAAY,OAAZ,CAAoB,aAAxD;AACA,WAAO,KAAP,GAAkB,MAAM,UAAN,CAAiB,QAAjB,EAA2B,YAAY,OAAZ,CAAoB,SAA/C,EAA0D,WAA1D,CAAlB;;AAEA,WAAO,EAAP,GAAY,OAAO,KAAP,GAAe,YAAY,OAAZ,CAAoB,SAA/C;AACA,WAAO,EAAP,GAAY,OAAO,KAAP,GAAe,YAAY,OAAZ,CAAoB,SAA/C;AACD;AACF,CAhCD;;AAkCA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,KAAvB,EAA8B,UAAU,WAAV,EAAuB;AACnD,cAAY,OAAZ,GAAsB;AACpB,WAAO,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EADa;;AAGpB,mBAAe,CAHK,EAGA;AACpB,kBAAe,CAJK;AAKpB,cAAe,CALK;;AAOpB,WAAO,CAPa,EAOA;;AAEpB,gBAAY,CATQ,EASA;AACpB,eAAY,CAVQ,CAUA;AAVA,GAAtB;AAYD,CAbD;;AAeA,QAAQ,OAAR,GAAkB,OAAlB;AACA,QAAQ,KAAR,CAAc,IAAd,CAAmB,SAAnB;AACA,MAAM,KAAN,CAAY,aAAa,UAAzB,EAAqC,CACnC,cADmC,EAEnC,aAFmC,EAGnC,YAHmC,CAArC;AAKA,QAAQ,UAAR,CAAmB,OAAnB,GAA6B,YAA7B;;AAEA,eAAe,OAAf,GAAyB,QAAQ,QAAjC;;AAEA,OAAO,OAAP,GAAiB,OAAjB;;;;;AChKA,IAAM,UAAiB,QAAQ,QAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,UAAR,CAAvB;AACA,IAAM,UAAiB,QAAQ,kBAAR,CAAvB;AACA,IAAM,gBAAiB,QAAQ,kBAAR,CAAvB;AACA,IAAM,eAAiB,QAAQ,iBAAR,CAAvB;AACA,IAAM,cAAiB,QAAQ,gBAAR,CAAvB;AACA,IAAM,iBAAiB,QAAQ,mBAAR,CAAvB;;AAEA;AACA,IAAM,gBAAgB,QAAQ,aAAR,IAAyB,QAAQ,oBAAjC,GAAuD,EAAvD,GAA2D,EAAjF;;AAEA,IAAM,SAAS;AACb,YAAU;AACR,aAAc,KADN;AAER,kBAAc,IAFN;;AAIR,YAAY,IAJJ;AAKR,UAAY,IALJ;AAMR,cAAY,IANJ;AAOR,aAAY,IAPJ;AAQR,gBAAY,IARJ;;AAUR,YAAQ,KAVA;AAWR,yBAAqB,KAXb;AAYR,UAAM,IAZE;;AAcR;AACA,YAAQ,GAfA;;AAiBR;AACA;AACA;AACA;AACA,WAAO,IArBC;;AAuBR;AACA;AACA;AACA;AACA,YAAQ;AA3BA,GADG;;AA+Bb,WAAS,iBAAU,OAAV,EAAmB,KAAnB,EAA0B,YAA1B,EAAwC,OAAxC,EAAiD,WAAjD,EAA8D,IAA9D,EAAoE;AAC3E,QAAI,CAAC,IAAL,EAAW;AAAE,aAAO,IAAP;AAAc;;AAE3B,QAAM,OAAO,MAAM,MAAN,CAAa,EAAb,EAAiB,YAAY,SAAZ,CAAsB,IAAvC,CAAb;AACA,QAAM,UAAU,aAAa,OAA7B;;AAEA,QAAI,QAAQ,MAAR,CAAe,OAAnB,EAA4B;AAC1B,UAAM,gBAAgB,QAAQ,MAA9B;AACA,UAAM,cAAc,EAAE,MAAM,KAAR,EAAe,OAAO,KAAtB,EAA6B,KAAK,KAAlC,EAAyC,QAAQ,KAAjD,EAApB;;AAEA;AACA,UAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,cAAc,KAA9B,CAAJ,EAA0C;AACxC,aAAK,IAAM,IAAX,IAAmB,WAAnB,EAAgC;AAC9B,sBAAY,IAAZ,IAAoB,gBAAgB,IAAhB,EACgB,cAAc,KAAd,CAAoB,IAApB,CADhB,EAEgB,IAFhB,EAGgB,YAAY,YAH5B,EAIgB,OAJhB,EAKgB,IALhB,EAMgB,cAAc,MAAd,IAAwB,aANxC,CAApB;AAOD;;AAED,oBAAY,IAAZ,GAAmB,YAAY,IAAZ,IAAoB,CAAC,YAAY,KAApD;AACA,oBAAY,GAAZ,GAAmB,YAAY,GAAZ,IAAoB,CAAC,YAAY,MAApD;;AAEA,YAAI,YAAY,IAAZ,IAAoB,YAAY,KAAhC,IAAyC,YAAY,GAArD,IAA4D,YAAY,MAA5E,EAAoF;AAClF,iBAAO;AACL,kBAAM,QADD;AAEL,mBAAO;AAFF,WAAP;AAID;AACF,OApBD,MAqBK;AACH,YAAM,QAAS,QAAQ,MAAR,CAAe,IAAf,KAAwB,GAAxB,IAA+B,KAAK,CAAL,GAAU,KAAK,KAAL,GAAc,aAAtE;AACA,YAAM,SAAS,QAAQ,MAAR,CAAe,IAAf,KAAwB,GAAxB,IAA+B,KAAK,CAAL,GAAU,KAAK,MAAL,GAAc,aAAtE;;AAEA,YAAI,SAAS,MAAb,EAAqB;AACnB,iBAAO;AACL,kBAAM,QADD;AAEL,kBAAM,CAAC,QAAO,GAAP,GAAa,EAAd,KAAqB,SAAQ,GAAR,GAAc,EAAnC;AAFD,WAAP;AAID;AACF;AACF;;AAED,WAAO,IAAP;AACD,GA7EY;;AA+Eb,WAAU,QAAQ,YAAR,GAAuB;AAC/B,OAAI,UAD2B;AAE/B,OAAI,UAF2B;AAG/B,QAAI,WAH2B;;AAK/B,SAAa,UALkB;AAM/B,UAAa,UANkB;AAO/B,YAAa,UAPkB;AAQ/B,WAAa,UARkB;AAS/B,aAAa,WATkB;AAU/B,iBAAa,WAVkB;AAW/B,cAAa,WAXkB;AAY/B,gBAAa;AAZkB,GAAvB,GAaN;AACF,OAAI,WADF;AAEF,OAAI,WAFF;AAGF,QAAI,aAHF;;AAKF,SAAa,WALX;AAMF,UAAa,WANX;AAOF,YAAa,WAPX;AAQF,WAAa,WARX;AASF,aAAa,aATX;AAUF,iBAAa,aAVX;AAWF,cAAa,aAXX;AAYF,gBAAa;AAZX,GA5FS;;AA2Gb,aAAW,mBAAU,MAAV,EAAkB;AAC3B,QAAI,OAAO,IAAX,EAAiB;AACf,aAAO,OAAO,OAAP,CAAe,OAAO,IAAP,GAAc,OAAO,IAApC,CAAP;AACD,KAFD,MAGK,IAAI,OAAO,KAAX,EAAkB;AACrB,UAAI,YAAY,EAAhB;AACA,UAAM,YAAY,CAAC,KAAD,EAAQ,QAAR,EAAkB,MAAlB,EAA0B,OAA1B,CAAlB;;AAEA,WAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,CAApB,EAAuB,GAAvB,EAA4B;AAC1B,YAAI,OAAO,KAAP,CAAa,UAAU,CAAV,CAAb,CAAJ,EAAgC;AAC9B,uBAAa,UAAU,CAAV,CAAb;AACD;AACF;;AAED,aAAO,OAAO,OAAP,CAAe,SAAf,CAAP;AACD;AACF;AA3HY,CAAf;;AA8HA;AACA,cAAc,OAAd,CAAsB,EAAtB,CAAyB,KAAzB,EAAgC,gBAAmC;AAAA,MAAvB,MAAuB,QAAvB,MAAuB;AAAA,MAAf,WAAe,QAAf,WAAe;;AACjE,MAAI,OAAO,IAAP,KAAgB,aAAhB,IAAiC,CAAC,YAAY,QAAZ,CAAqB,KAA3D,EAAkE;AAChE;AACD;;AAED,MAAM,YAAY,YAAY,MAAZ,CAAmB,OAAnB,CAA2B,YAAY,OAAvC,CAAlB;AACA,MAAM,gBAAgB,YAAY,MAAZ,CAAmB,OAAnB,CAA2B,MAAjD;;AAEA;;;;;;AAMA,MAAI,cAAc,MAAd,IAAwB,cAAc,mBAA1C,EAA+D;AAC7D,QAAM,cAAc,MAAM,MAAN,CAAa,EAAb,EAAiB,YAAY,QAAZ,CAAqB,KAAtC,CAApB;;AAEA,gBAAY,GAAZ,GAAqB,YAAY,GAAZ,IAAuB,YAAY,IAAZ,IAAsB,CAAC,YAAY,MAA/E;AACA,gBAAY,IAAZ,GAAqB,YAAY,IAAZ,IAAuB,YAAY,GAAZ,IAAsB,CAAC,YAAY,KAA/E;AACA,gBAAY,MAAZ,GAAqB,YAAY,MAAZ,IAAuB,YAAY,KAAZ,IAAsB,CAAC,YAAY,GAA/E;AACA,gBAAY,KAAZ,GAAqB,YAAY,KAAZ,IAAuB,YAAY,MAAZ,IAAsB,CAAC,YAAY,IAA/E;;AAEA,gBAAY,QAAZ,CAAqB,YAArB,GAAoC,WAApC;AACD,GATD,MAUK;AACH,gBAAY,QAAZ,CAAqB,YAArB,GAAoC,IAApC;AACD;;AAED;AACA,MAAI,cAAc,mBAAlB,EAAuC;AACrC,gBAAY,sBAAZ,GAAqC,UAAU,KAAV,GAAkB,UAAU,MAAjE;AACD;;AAED,cAAY,WAAZ,GAA0B;AACxB,WAAY,SADY;AAExB,aAAY,MAAM,MAAN,CAAa,EAAb,EAAiB,SAAjB,CAFY;AAGxB,cAAY,MAAM,MAAN,CAAa,EAAb,EAAiB,SAAjB,CAHY;AAIxB,cAAY,MAAM,MAAN,CAAa,EAAb,EAAiB,SAAjB,CAJY;AAKxB,WAAY;AACV,YAAM,CADI,EACD,OAAQ,CADP,EACU,OAAQ,CADlB;AAEV,WAAM,CAFI,EAED,QAAQ,CAFP,EAEU,QAAQ;AAFlB;AALY,GAA1B;;AAWA,SAAO,IAAP,GAAc,YAAY,WAAZ,CAAwB,QAAtC;AACA,SAAO,SAAP,GAAmB,YAAY,WAAZ,CAAwB,KAA3C;AACD,CA9CD;;AAgDA;AACA,cAAc,OAAd,CAAsB,EAAtB,CAAyB,KAAzB,EAAgC,iBAA0C;AAAA,MAA9B,MAA8B,SAA9B,MAA8B;AAAA,MAAtB,KAAsB,SAAtB,KAAsB;AAAA,MAAf,WAAe,SAAf,WAAe;;AACxE,MAAI,UAAU,MAAV,IAAoB,CAAC,YAAY,QAAZ,CAAqB,KAA9C,EAAqD;AAAE;AAAS;;AAEhE,MAAM,gBAAgB,YAAY,MAAZ,CAAmB,OAAnB,CAA2B,MAAjD;AACA,MAAM,SAAS,cAAc,MAA7B;AACA,MAAM,aAAa,WAAW,YAAX,IAA2B,WAAW,QAAzD;;AAEA,MAAI,QAAQ,YAAY,QAAZ,CAAqB,KAAjC;;AAEA,MAAM,QAAa,YAAY,WAAZ,CAAwB,KAA3C;AACA,MAAM,UAAa,YAAY,WAAZ,CAAwB,OAA3C;AACA,MAAM,WAAa,YAAY,WAAZ,CAAwB,QAA3C;AACA,MAAM,QAAa,YAAY,WAAZ,CAAwB,KAA3C;AACA,MAAM,WAAa,MAAM,MAAN,CAAa,YAAY,WAAZ,CAAwB,QAArC,EAA+C,QAA/C,CAAnB;AACA,MAAM,gBAAgB,KAAtB;;AAEA,MAAI,KAAK,OAAO,EAAhB;AACA,MAAI,KAAK,OAAO,EAAhB;;AAEA,MAAI,cAAc,mBAAd,IAAqC,cAAc,MAAvD,EAA+D;AAC7D;AACA,QAAM,mBAAmB,cAAc,mBAAd,GACrB,YAAY,sBADS,GAErB,CAFJ;;AAIA,YAAQ,YAAY,QAAZ,CAAqB,YAA7B;;AAEA,QAAK,cAAc,IAAd,IAAsB,cAAc,MAArC,IACI,cAAc,KAAd,IAAuB,cAAc,GAD7C,EACmD;AACjD,WAAK,CAAC,EAAD,GAAM,gBAAX;AACD,KAHD,MAIK,IAAI,cAAc,IAAd,IAAsB,cAAc,KAAxC,EAAgD;AAAE,WAAK,KAAK,gBAAV;AAA6B,KAA/E,MACA,IAAI,cAAc,GAAd,IAAsB,cAAc,MAAxC,EAAgD;AAAE,WAAK,KAAK,gBAAV;AAA6B;AACrF;;AAED;AACA,MAAI,MAAM,GAAV,EAAkB;AAAE,YAAQ,GAAR,IAAkB,EAAlB;AAAuB;AAC3C,MAAI,MAAM,MAAV,EAAkB;AAAE,YAAQ,MAAR,IAAkB,EAAlB;AAAuB;AAC3C,MAAI,MAAM,IAAV,EAAkB;AAAE,YAAQ,IAAR,IAAkB,EAAlB;AAAuB;AAC3C,MAAI,MAAM,KAAV,EAAkB;AAAE,YAAQ,KAAR,IAAkB,EAAlB;AAAuB;;AAE3C,MAAI,UAAJ,EAAgB;AACd;AACA,UAAM,MAAN,CAAa,QAAb,EAAuB,OAAvB;;AAEA,QAAI,WAAW,YAAf,EAA6B;AAC3B;AACA,UAAI,aAAJ;;AAEA,UAAI,SAAS,GAAT,GAAe,SAAS,MAA5B,EAAoC;AAClC,eAAO,SAAS,GAAhB;;AAEA,iBAAS,GAAT,GAAe,SAAS,MAAxB;AACA,iBAAS,MAAT,GAAkB,IAAlB;AACD;AACD,UAAI,SAAS,IAAT,GAAgB,SAAS,KAA7B,EAAoC;AAClC,eAAO,SAAS,IAAhB;;AAEA,iBAAS,IAAT,GAAgB,SAAS,KAAzB;AACA,iBAAS,KAAT,GAAiB,IAAjB;AACD;AACF;AACF,GArBD,MAsBK;AACH;AACA,aAAS,GAAT,GAAkB,KAAK,GAAL,CAAS,QAAQ,GAAjB,EAAsB,MAAM,MAA5B,CAAlB;AACA,aAAS,MAAT,GAAkB,KAAK,GAAL,CAAS,QAAQ,MAAjB,EAAyB,MAAM,GAA/B,CAAlB;AACA,aAAS,IAAT,GAAkB,KAAK,GAAL,CAAS,QAAQ,IAAjB,EAAuB,MAAM,KAA7B,CAAlB;AACA,aAAS,KAAT,GAAkB,KAAK,GAAL,CAAS,QAAQ,KAAjB,EAAwB,MAAM,IAA9B,CAAlB;AACD;;AAED,WAAS,KAAT,GAAkB,SAAS,KAAT,GAAkB,SAAS,IAA7C;AACA,WAAS,MAAT,GAAkB,SAAS,MAAT,GAAkB,SAAS,GAA7C;;AAEA,OAAK,IAAM,IAAX,IAAmB,QAAnB,EAA6B;AAC3B,UAAM,IAAN,IAAc,SAAS,IAAT,IAAiB,SAAS,IAAT,CAA/B;AACD;;AAED,SAAO,KAAP,GAAe,YAAY,QAAZ,CAAqB,KAApC;AACA,SAAO,IAAP,GAAc,QAAd;AACA,SAAO,SAAP,GAAmB,KAAnB;AACD,CAjFD;;AAmFA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4CA,aAAa,SAAb,CAAuB,SAAvB,GAAmC,UAAU,OAAV,EAAmB;AACpD,MAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,OAAhB,CAAJ,EAA8B;AAC5B,SAAK,OAAL,CAAa,MAAb,CAAoB,OAApB,GAA8B,QAAQ,OAAR,KAAoB,KAApB,GAA2B,KAA3B,GAAkC,IAAhE;AACA,SAAK,YAAL,CAAkB,QAAlB,EAA4B,OAA5B;AACA,SAAK,WAAL,CAAiB,QAAjB,EAA2B,OAA3B;;AAEA,QAAI,eAAe,IAAf,CAAoB,QAAQ,IAA5B,CAAJ,EAAuC;AACrC,WAAK,OAAL,CAAa,MAAb,CAAoB,IAApB,GAA2B,QAAQ,IAAnC;AACD,KAFD,MAGK,IAAI,QAAQ,IAAR,KAAiB,IAArB,EAA2B;AAC9B,WAAK,OAAL,CAAa,MAAb,CAAoB,IAApB,GAA2B,eAAe,MAAf,CAAsB,IAAjD;AACD;;AAED,QAAI,MAAM,EAAN,CAAS,IAAT,CAAc,QAAQ,mBAAtB,CAAJ,EAAgD;AAC9C,WAAK,OAAL,CAAa,MAAb,CAAoB,mBAApB,GAA0C,QAAQ,mBAAlD;AACD,KAFD,MAGK,IAAI,MAAM,EAAN,CAAS,IAAT,CAAc,QAAQ,MAAtB,CAAJ,EAAmC;AACtC,WAAK,OAAL,CAAa,MAAb,CAAoB,MAApB,GAA6B,QAAQ,MAArC;AACD;;AAED,WAAO,IAAP;AACD;AACD,MAAI,MAAM,EAAN,CAAS,IAAT,CAAc,OAAd,CAAJ,EAA4B;AAC1B,SAAK,OAAL,CAAa,MAAb,CAAoB,OAApB,GAA8B,OAA9B;;AAEA,QAAI,CAAC,OAAL,EAAc;AACZ,WAAK,aAAL,GAAqB,KAAK,aAAL,GAAqB,KAAK,WAAL,GAAmB,IAA7D;AACD;;AAED,WAAO,IAAP;AACD;AACD,SAAO,KAAK,OAAL,CAAa,MAApB;AACD,CAhCD;;AAkCA,SAAS,eAAT,CAA0B,IAA1B,EAAgC,KAAhC,EAAuC,IAAvC,EAA6C,OAA7C,EAAsD,mBAAtD,EAA2E,IAA3E,EAAiF,MAAjF,EAAyF;AACvF;AACA,MAAI,CAAC,KAAL,EAAY;AAAE,WAAO,KAAP;AAAe;;AAE7B;AACA,MAAI,UAAU,IAAd,EAAoB;AAClB;AACA,QAAM,QAAS,MAAM,EAAN,CAAS,MAAT,CAAgB,KAAK,KAArB,IAA8B,KAAK,KAAnC,GAA4C,KAAK,KAAL,GAAc,KAAK,IAA9E;AACA,QAAM,SAAS,MAAM,EAAN,CAAS,MAAT,CAAgB,KAAK,MAArB,IAA8B,KAAK,MAAnC,GAA4C,KAAK,MAAL,GAAc,KAAK,GAA9E;;AAEA,QAAI,QAAQ,CAAZ,EAAe;AACb,UAAS,SAAS,MAAlB,EAA2B;AAAE,eAAO,OAAP;AAAiB,OAA9C,MACK,IAAI,SAAS,OAAb,EAAsB;AAAE,eAAO,MAAP;AAAiB;AAC/C;AACD,QAAI,SAAS,CAAb,EAAgB;AACd,UAAS,SAAS,KAAlB,EAA4B;AAAE,eAAO,QAAP;AAAkB,OAAhD,MACK,IAAI,SAAS,QAAb,EAAuB;AAAE,eAAO,KAAP;AAAkB;AACjD;;AAED,QAAI,SAAS,MAAb,EAAuB;AAAE,aAAO,KAAK,CAAL,GAAU,CAAC,SAAU,CAAV,GAAa,KAAK,IAAlB,GAAwB,KAAK,KAA9B,IAAwC,MAAzD;AAAmE;AAC5F,QAAI,SAAS,KAAb,EAAuB;AAAE,aAAO,KAAK,CAAL,GAAU,CAAC,UAAU,CAAV,GAAa,KAAK,GAAlB,GAAwB,KAAK,MAA9B,IAAwC,MAAzD;AAAmE;;AAE5F,QAAI,SAAS,OAAb,EAAuB;AAAE,aAAO,KAAK,CAAL,GAAU,CAAC,SAAU,CAAV,GAAa,KAAK,KAAlB,GAA0B,KAAK,IAAhC,IAAwC,MAAzD;AAAmE;AAC5F,QAAI,SAAS,QAAb,EAAuB;AAAE,aAAO,KAAK,CAAL,GAAU,CAAC,UAAU,CAAV,GAAa,KAAK,MAAlB,GAA0B,KAAK,GAAhC,IAAwC,MAAzD;AAAmE;AAC7F;;AAED;AACA,MAAI,CAAC,MAAM,EAAN,CAAS,OAAT,CAAiB,OAAjB,CAAL,EAAgC;AAAE,WAAO,KAAP;AAAe;;AAEjD,SAAO,MAAM,EAAN,CAAS,OAAT,CAAiB,KAAjB;AACP;AADO,IAEH,UAAU;AACZ;AAHK,IAIH,MAAM,WAAN,CAAkB,OAAlB,EAA2B,KAA3B,EAAkC,mBAAlC,CAJJ;AAKD;;AAED,YAAY,OAAZ,CAAoB,EAApB,CAAuB,KAAvB,EAA8B,UAAU,WAAV,EAAuB;AACnD,cAAY,UAAZ,GAAyB,IAAzB;AACD,CAFD;;AAIA,cAAc,OAAd,CAAsB,EAAtB,CAAyB,WAAzB,EAAsC,iBAA2C;AAAA,MAA/B,WAA+B,SAA/B,WAA+B;AAAA,MAAlB,MAAkB,SAAlB,MAAkB;AAAA,MAAV,MAAU,SAAV,MAAU;;AAC/E,MAAI,WAAW,QAAX,IAAuB,CAAC,YAAY,UAAxC,EAAoD;AAAE;AAAS;;AAE/D,MAAM,UAAU,YAAY,MAAZ,CAAmB,OAAnC;;AAEA,MAAI,QAAQ,MAAR,CAAe,MAAnB,EAA2B;AACzB,QAAI,YAAY,UAAZ,KAA2B,GAA/B,EAAoC;AAClC,aAAO,EAAP,GAAY,OAAO,EAAnB;AACD,KAFD,MAGK;AACH,aAAO,EAAP,GAAY,OAAO,EAAnB;AACD;AACD,WAAO,IAAP,GAAc,IAAd;AACD,GARD,MASK;AACH,WAAO,IAAP,GAAc,YAAY,UAA1B;;AAEA,QAAI,YAAY,UAAZ,KAA2B,GAA/B,EAAoC;AAClC,aAAO,EAAP,GAAY,CAAZ;AACD,KAFD,MAGK,IAAI,YAAY,UAAZ,KAA2B,GAA/B,EAAoC;AACvC,aAAO,EAAP,GAAY,CAAZ;AACD;AACF;AACF,CAxBD;;AA0BA,QAAQ,MAAR,GAAiB,MAAjB;AACA,QAAQ,KAAR,CAAc,IAAd,CAAmB,QAAnB;AACA,MAAM,KAAN,CAAY,aAAa,UAAzB,EAAqC,CACnC,aADmC,EAEnC,YAFmC,EAGnC,oBAHmC,EAInC,qBAJmC,EAKnC,WALmC,CAArC;AAOA,QAAQ,UAAR,CAAmB,MAAnB,GAA4B,WAA5B;;AAEA,eAAe,MAAf,GAAwB,OAAO,QAA/B;;AAEA,OAAO,OAAP,GAAiB,MAAjB;;;;;AC3aA,IAAM,MAAiB,QAAQ,aAAR,CAAvB;AACA,IAAM,YAAiB,QAAQ,gBAAR,EAA0B,SAAjD;AACA,IAAM,KAAiB,QAAQ,YAAR,CAAvB;AACA,IAAM,WAAiB,QAAQ,kBAAR,CAAvB;AACA,IAAM,cAAiB,QAAQ,eAAR,CAAvB;AACA,IAAM,iBAAiB,QAAQ,kBAAR,CAAvB;;AAEA,IAAM,aAAa;AACjB,YAAU;AACR,aAAW,KADH;AAER,eAAW,IAFH,EAEa;AACrB,YAAW,EAHH;AAIR,WAAW,GAJH,CAIa;AAJb,GADO;;AAQjB,eAAa,IARI;AASjB,KAAG,IATc,EASL;AACZ,KAAG,CAVc,EAUX,GAAG,CAVQ,EAUL;;AAEZ,eAAa,KAZI;AAajB,YAAU,CAbO;;AAejB,SAAO,eAAU,WAAV,EAAuB;AAC5B,eAAW,WAAX,GAAyB,IAAzB;AACA,QAAI,MAAJ,CAAW,WAAW,CAAtB;;AAEA,eAAW,WAAX,GAAyB,WAAzB;AACA,eAAW,QAAX,GAAsB,IAAI,IAAJ,GAAW,OAAX,EAAtB;AACA,eAAW,CAAX,GAAe,IAAI,OAAJ,CAAY,WAAW,MAAvB,CAAf;AACD,GAtBgB;;AAwBjB,QAAM,gBAAY;AAChB,eAAW,WAAX,GAAyB,KAAzB;AACA,QAAI,MAAJ,CAAW,WAAW,CAAtB;AACD,GA3BgB;;AA6BjB;AACA,UAAQ,kBAAY;AAClB,QAAM,UAAU,WAAW,WAAX,CAAuB,MAAvB,CAA8B,OAA9B,CAAsC,WAAW,WAAX,CAAuB,QAAvB,CAAgC,IAAtE,EAA4E,UAA5F;AACA,QAAM,YAAY,QAAQ,SAAR,IAAqB,UAAU,WAAW,WAAX,CAAuB,OAAjC,CAAvC;AACA,QAAM,MAAM,IAAI,IAAJ,GAAW,OAAX,EAAZ;AACA;AACA,QAAM,KAAK,CAAC,MAAM,WAAW,QAAlB,IAA8B,IAAzC;AACA;AACA,QAAM,IAAI,QAAQ,KAAR,GAAgB,EAA1B;;AAEA,QAAI,KAAK,CAAT,EAAY;AACV,UAAI,GAAG,MAAH,CAAU,SAAV,CAAJ,EAA0B;AACxB,kBAAU,QAAV,CAAmB,WAAW,CAAX,GAAe,CAAlC,EAAqC,WAAW,CAAX,GAAe,CAApD;AACD,OAFD,MAGK,IAAI,SAAJ,EAAe;AAClB,kBAAU,UAAV,IAAwB,WAAW,CAAX,GAAe,CAAvC;AACA,kBAAU,SAAV,IAAwB,WAAW,CAAX,GAAe,CAAvC;AACD;;AAED,iBAAW,QAAX,GAAsB,GAAtB;AACD;;AAED,QAAI,WAAW,WAAf,EAA4B;AAC1B,UAAI,MAAJ,CAAW,WAAW,CAAtB;AACA,iBAAW,CAAX,GAAe,IAAI,OAAJ,CAAY,WAAW,MAAvB,CAAf;AACD;AACF,GAvDgB;AAwDjB,SAAO,eAAU,YAAV,EAAwB,UAAxB,EAAoC;AACzC,QAAM,UAAU,aAAa,OAA7B;;AAEA,WAAO,QAAQ,UAAR,EAAoB,UAApB,IAAkC,QAAQ,UAAR,EAAoB,UAApB,CAA+B,OAAxE;AACD,GA5DgB;AA6DjB,qBAAmB,iCAAoC;AAAA,QAAxB,WAAwB,QAAxB,WAAwB;AAAA,QAAX,OAAW,QAAX,OAAW;;AACrD,QAAI,EAAE,YAAY,WAAZ,MACG,WAAW,KAAX,CAAiB,YAAY,MAA7B,EAAqC,YAAY,QAAZ,CAAqB,IAA1D,CADL,CAAJ,EAC2E;AACzE;AACD;;AAED,QAAI,YAAY,UAAhB,EAA4B;AAC1B,iBAAW,CAAX,GAAe,WAAW,CAAX,GAAe,CAA9B;AACA;AACD;;AAED,QAAI,YAAJ;AACA,QAAI,cAAJ;AACA,QAAI,eAAJ;AACA,QAAI,aAAJ;;AAEA,QAAM,UAAU,YAAY,MAAZ,CAAmB,OAAnB,CAA2B,YAAY,QAAZ,CAAqB,IAAhD,EAAsD,UAAtE;AACA,QAAM,YAAY,QAAQ,SAAR,IAAqB,UAAU,YAAY,OAAtB,CAAvC;;AAEA,QAAI,GAAG,MAAH,CAAU,SAAV,CAAJ,EAA0B;AACxB,aAAS,QAAQ,OAAR,GAAkB,WAAW,MAAtC;AACA,YAAS,QAAQ,OAAR,GAAkB,WAAW,MAAtC;AACA,cAAS,QAAQ,OAAR,GAAkB,UAAU,UAAV,GAAwB,WAAW,MAA9D;AACA,eAAS,QAAQ,OAAR,GAAkB,UAAU,WAAV,GAAwB,WAAW,MAA9D;AACD,KALD,MAMK;AACH,UAAM,OAAO,SAAS,oBAAT,CAA8B,SAA9B,CAAb;;AAEA,aAAS,QAAQ,OAAR,GAAkB,KAAK,IAAL,GAAc,WAAW,MAApD;AACA,YAAS,QAAQ,OAAR,GAAkB,KAAK,GAAL,GAAc,WAAW,MAApD;AACA,cAAS,QAAQ,OAAR,GAAkB,KAAK,KAAL,GAAc,WAAW,MAApD;AACA,eAAS,QAAQ,OAAR,GAAkB,KAAK,MAAL,GAAc,WAAW,MAApD;AACD;;AAED,eAAW,CAAX,GAAgB,QAAQ,CAAR,GAAW,OAAM,CAAC,CAAP,GAAU,CAArC;AACA,eAAW,CAAX,GAAgB,SAAQ,CAAR,GAAY,MAAK,CAAC,CAAN,GAAS,CAArC;;AAEA,QAAI,CAAC,WAAW,WAAhB,EAA6B;AAC3B;AACA,iBAAW,MAAX,GAAoB,QAAQ,MAA5B;AACA,iBAAW,KAAX,GAAoB,QAAQ,KAA5B;;AAEA,iBAAW,KAAX,CAAiB,WAAjB;AACD;AACF;AAzGgB,CAAnB;;AA4GA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,aAAvB,EAAsC,YAAY;AAChD,aAAW,IAAX;AACD,CAFD;;AAIA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,aAAvB,EAAsC,WAAW,iBAAjD;;AAEA,eAAe,SAAf,CAAyB,UAAzB,GAAsC,WAAW,QAAjD;;AAEA,OAAO,OAAP,GAAiB,UAAjB;;;;;AC3HA,IAAM,eAAe,QAAQ,iBAAR,CAArB;AACA,IAAM,UAAe,QAAQ,iBAAR,CAArB;AACA,IAAM,KAAe,QAAQ,aAAR,CAArB;AACA,IAAM,WAAe,QAAQ,mBAAR,CAArB;;AAEA,aAAa,SAAb,CAAuB,SAAvB,GAAmC,UAAU,OAAV,EAAmB,KAAnB,EAA0B,WAA1B,EAAuC,OAAvC,EAAgD;AACjF,MAAM,SAAS,KAAK,oBAAL,CAA0B,OAA1B,EAAmC,KAAnC,EAA0C,WAA1C,EAAuD,OAAvD,CAAf;;AAEA,MAAI,KAAK,OAAL,CAAa,aAAjB,EAAgC;AAC9B,WAAO,KAAK,OAAL,CAAa,aAAb,CAA2B,OAA3B,EAAoC,KAApC,EAA2C,MAA3C,EAAmD,IAAnD,EAAyD,OAAzD,EAAkE,WAAlE,CAAP;AACD;;AAED,SAAO,MAAP;AACD,CARD;;AAUA;;;;;;;;;;;;;;;AAeA,aAAa,SAAb,CAAuB,UAAvB,GAAoC,UAAU,QAAV,EAAoB;AACtD,SAAO,KAAK,iBAAL,CAAuB,YAAvB,EAAqC,QAArC,CAAP;AACD,CAFD;;AAIA;;;;;;;;;;;;;;;AAeA,aAAa,SAAb,CAAuB,SAAvB,GAAmC,UAAU,QAAV,EAAoB;AACrD,SAAO,KAAK,iBAAL,CAAuB,WAAvB,EAAoC,QAApC,CAAP;AACD,CAFD;;AAIA,aAAa,SAAb,CAAuB,UAAvB,GAAoC,UAAU,UAAV,EAAsB,mBAAtB,EAA2C,OAA3C,EAAoD;AACtF,MAAI,CAAC,UAAD,IAAe,CAAC,GAAG,OAAH,CAAW,OAAX,CAApB,EAAyC;AAAE,WAAO,KAAP;AAAe;;AAE1D,MAAI,GAAG,MAAH,CAAU,UAAV,CAAJ,EAA2B;AACzB,WAAO,SAAS,WAAT,CAAqB,OAArB,EAA8B,UAA9B,EAA0C,mBAA1C,CAAP;AACD,GAFD,MAGK,IAAI,GAAG,OAAH,CAAW,UAAX,CAAJ,EAA4B;AAC/B,WAAO,SAAS,YAAT,CAAsB,UAAtB,EAAkC,OAAlC,CAAP;AACD;;AAED,SAAO,KAAP;AACD,CAXD;;AAaA,aAAa,SAAb,CAAuB,SAAvB,GAAmC,UAAU,SAAV,EAAqB,mBAArB,EAA0C,OAA1C,EAAmD;AACpF,MAAI,CAAC,SAAL,EAAgB;AAAE,WAAO,IAAP;AAAc;;AAEhC,MAAI,CAAC,GAAG,OAAH,CAAW,OAAX,CAAL,EAA0B;AAAE,WAAO,KAAP;AAAe;;AAE3C,MAAI,GAAG,MAAH,CAAU,SAAV,CAAJ,EAA0B;AACxB,WAAO,SAAS,WAAT,CAAqB,OAArB,EAA8B,SAA9B,EAAyC,mBAAzC,CAAP;AACD,GAFD,MAGK,IAAI,GAAG,OAAH,CAAW,SAAX,CAAJ,EAA2B;AAC9B,WAAO,SAAS,YAAT,CAAsB,SAAtB,EAAiC,OAAjC,CAAP;AACD;;AAED,SAAO,KAAP;AACD,CAbD;;AAeA,aAAa,SAAb,CAAuB,eAAvB,GAAyC,UAAU,OAAV,EAAmB,mBAAnB,EAAwC,WAAxC,EAAqD;AAC5F,SAAQ,CAAC,KAAK,UAAL,CAAgB,QAAQ,UAAxB,EAAoC,mBAApC,EAAyD,WAAzD,CAAD,IACH,KAAK,SAAL,CAAe,QAAQ,SAAvB,EAAkC,mBAAlC,EAAuD,WAAvD,CADL;AAED,CAHD;;AAKA;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4BA,aAAa,SAAb,CAAuB,aAAvB,GAAuC,UAAU,OAAV,EAAmB;AACxD,MAAI,GAAG,QAAH,CAAY,OAAZ,CAAJ,EAA0B;AACxB,SAAK,OAAL,CAAa,aAAb,GAA6B,OAA7B;;AAEA,WAAO,IAAP;AACD;;AAED,MAAI,YAAY,IAAhB,EAAsB;AACpB,WAAO,KAAK,OAAL,CAAa,aAApB;;AAEA,WAAO,IAAP;AACD;;AAED,SAAO,KAAK,OAAL,CAAa,aAApB;AACD,CAdD;;AAgBA;;;;;;;;;;AAUA,aAAa,SAAb,CAAuB,WAAvB,GAAqC,UAAU,QAAV,EAAoB;AACvD,MAAI,GAAG,IAAH,CAAQ,QAAR,CAAJ,EAAuB;AACrB,SAAK,OAAL,CAAa,WAAb,GAA2B,QAA3B;;AAEA,WAAO,IAAP;AACD;;AAED,MAAI,aAAa,IAAjB,EAAuB;AACrB,WAAO,KAAK,OAAL,CAAa,WAApB;;AAEA,WAAO,IAAP;AACD;;AAED,SAAO,KAAK,OAAL,CAAa,WAApB;AACD,CAdD;;AAgBA,aAAa,SAAb,CAAuB,oBAAvB,GAA8C,UAAU,OAAV,EAAmB,KAAnB,EAA0B,WAA1B,EAAuC,OAAvC,EAAgD;AAC5F,MAAM,OAAO,KAAK,OAAL,CAAa,OAAb,CAAb;AACA,MAAI,SAAS,IAAb;;AAEA,uBAAyB,QAAQ,KAAjC,kHAAwC;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,QAA7B,UAA6B;;AACtC;AACA,QAAI,YAAY,aAAZ,IACG,YAAY,KADf,IAEG,CAAC,MAAM,OAAN,GAAgB,KAAK,OAAL,CAAa,UAAb,EAAyB,YAA1C,MAA4D,CAFnE,EAEsE;AACpE;AACD;;AAED,aAAS,QAAQ,UAAR,EAAoB,OAApB,CAA4B,OAA5B,EAAqC,KAArC,EAA4C,IAA5C,EAAkD,OAAlD,EAA2D,WAA3D,EAAwE,IAAxE,CAAT;;AAEA,QAAI,MAAJ,EAAY;AACV,aAAO,MAAP;AACD;AACF;AACF,CAlBD;;;;;AC5JA,IAAM,WAAiB,QAAQ,aAAR,CAAvB;AACA,IAAM,eAAiB,QAAQ,iBAAR,CAAvB;AACA,IAAM,cAAiB,QAAQ,gBAAR,CAAvB;AACA,IAAM,UAAiB,QAAQ,iBAAR,CAAvB;AACA,IAAM,iBAAiB,QAAQ,mBAAR,CAAvB;AACA,IAAM,UAAiB,QAAQ,kBAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,UAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,UAAR,CAAvB;AACA,IAAM,UAAiB,QAAQ,kBAAR,EAA4B,GAA5B,EAAvB;;AAEA,QAAQ,uBAAR;;AAEA,IAAM,YAAY;AAChB,kBADgB;AAEhB,gDAFgB;AAGhB;AACA,mBAAiB,QAJD;AAKhB,YAAU;AACR,eAAW;AACT,mBAAa,KADJ;AAET,WAAK,QAFI;AAGT,qBAAe,CAHN;AAIT,iBAAY,IAJH;AAKT,kBAAY;AALH;AADH,GALM;AAchB,qBAAmB,2BAAU,MAAV,EAAkB;AACnC,UAAM,MAAN,CAAa,OAAO,QAApB,EAA8B,UAAU,QAAV,CAAmB,SAAjD;AACD;AAhBe,CAAlB;;AAmBA;AACA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,MAAvB,EAA+B,gBAAwD;AAAA,MAA5C,WAA4C,QAA5C,WAA4C;AAAA,MAA/B,OAA+B,QAA/B,OAA+B;AAAA,MAAtB,KAAsB,QAAtB,KAAsB;AAAA,MAAf,WAAe,QAAf,WAAe;;AACrF,MAAI,YAAY,WAAZ,EAAJ,EAA+B;AAAE;AAAS;;AAE1C,MAAM,aAAa,cAAc,WAAd,EAA2B,OAA3B,EAAoC,KAApC,EAA2C,WAA3C,CAAnB;AACA,UAAQ,WAAR,EAAqB,UAArB;AACD,CALD;;AAOA;AACA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,MAAvB,EAA+B,iBAAwD;AAAA,MAA5C,WAA4C,SAA5C,WAA4C;AAAA,MAA/B,OAA+B,SAA/B,OAA+B;AAAA,MAAtB,KAAsB,SAAtB,KAAsB;AAAA,MAAf,WAAe,SAAf,WAAe;;AACrF,MAAI,CAAC,YAAY,KAAb,IACG,YAAY,aADf,IAEG,YAAY,WAAZ,EAFP,EAEkC;AAAE;AAAS;;AAE7C,MAAM,aAAa,cAAc,WAAd,EAA2B,OAA3B,EAAoC,KAApC,EAA2C,WAA3C,CAAnB;AACA,UAAQ,WAAR,EAAqB,UAArB;AACD,CAPD;;AASA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,MAAvB,EAA+B,UAAU,GAAV,EAAe;AAAA,MACpC,WADoC,GACb,GADa,CACpC,WADoC;AAAA,MACvB,KADuB,GACb,GADa,CACvB,KADuB;;;AAG5C,MAAI,CAAC,YAAY,aAAb,IACG,YAAY,WAAZ,EADH,IAEG,CAAC,YAAY,eAFhB,IAGG,CAAC,YAAY,QAAZ,CAAqB,IAH7B,EAGmC;AACjC;AACD;;AAED,UAAQ,IAAR,CAAa,cAAb,EAA6B,GAA7B;;AAEA,MAAM,SAAS,YAAY,MAA3B;;AAEA,MAAI,YAAY,QAAZ,CAAqB,IAArB,IAA6B,MAAjC,EAAyC;AACvC;AACA,QAAI,OAAO,OAAP,CAAe,YAAY,QAAZ,CAAqB,IAApC,EAA0C,WAA1C,IACG,CAAC,uBAAuB,MAAvB,EAA+B,YAAY,OAA3C,EAAoD,YAAY,QAAhE,CADR,EACmF;AACjF,kBAAY,IAAZ,CAAiB,KAAjB;AACD,KAHD,MAIK;AACH,kBAAY,KAAZ,CAAkB,YAAY,QAA9B,EAAwC,MAAxC,EAAgD,YAAY,OAA5D;AACD;AACF;AACF,CAxBD;;AA0BA;AACA;AACA,SAAS,cAAT,CAAyB,MAAzB,EAAiC,YAAjC,EAA+C,OAA/C,EAAwD,WAAxD,EAAqE;AACnE,MAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,MAAhB,KACG,aAAa,eAAb,CAA6B,aAAa,OAAb,CAAqB,OAAO,IAA5B,CAA7B,EAAgE,OAAhE,EAAyE,WAAzE,CADH,IAEG,aAAa,OAAb,CAAqB,OAAO,IAA5B,EAAkC,OAFrC,IAGG,uBAAuB,YAAvB,EAAqC,OAArC,EAA8C,MAA9C,CAHP,EAG8D;AAC5D,WAAO,MAAP;AACD;;AAED,SAAO,IAAP;AACD;;AAED,SAAS,gBAAT,CAA2B,WAA3B,EAAwC,OAAxC,EAAiD,KAAjD,EAAwD,OAAxD,EAAiE,aAAjE,EAAgF,WAAhF,EAA6F;AAC3F,OAAK,IAAI,IAAI,CAAR,EAAW,MAAM,QAAQ,MAA9B,EAAsC,IAAI,GAA1C,EAA+C,GAA/C,EAAoD;AAClD,QAAM,QAAQ,QAAQ,CAAR,CAAd;AACA,QAAM,eAAe,cAAc,CAAd,CAArB;AACA,QAAM,SAAS,eAAe,MAAM,SAAN,CAAgB,OAAhB,EAAyB,KAAzB,EAAgC,WAAhC,EAA6C,YAA7C,CAAf,EACe,KADf,EAEe,YAFf,EAGe,WAHf,CAAf;;AAKA,QAAI,MAAJ,EAAY;AACV,aAAO;AACL,sBADK;AAEL,gBAAQ,KAFH;AAGL,iBAAS;AAHJ,OAAP;AAKD;AACF;;AAED,SAAO,EAAP;AACD;;AAED,SAAS,aAAT,CAAwB,WAAxB,EAAqC,OAArC,EAA8C,KAA9C,EAAqD,WAArD,EAAkE;AAChE,MAAI,UAAU,EAAd;AACA,MAAI,gBAAgB,EAApB;;AAEA,MAAI,UAAU,WAAd;AACA,MAAI,SAAS,IAAb;;AAEA,WAAS,WAAT,CAAsB,YAAtB,EAAoC,QAApC,EAA8C,OAA9C,EAAuD;AACrD,QAAM,WAAY,QAAQ,0BAAR,GACd,QAAQ,gBAAR,CAAyB,QAAzB,CADc,GAEd,SAFJ;;AAIA,QAAI,MAAM,eAAN,CAAsB,OAAtB,EAA+B,QAA/B,EAAyC,QAAzC,CAAJ,EAAwD;;AAEtD,cAAQ,IAAR,CAAa,YAAb;AACA,oBAAc,IAAd,CAAmB,OAAnB;AACD;AACF;;AAED,SAAO,MAAM,EAAN,CAAS,OAAT,CAAiB,OAAjB,CAAP,EAAkC;AAChC,cAAU,EAAV;AACA,oBAAgB,EAAhB;;AAEA,QAAM,sBAAsB,MAAM,aAAN,CAAoB,GAApB,CAAwB,OAAxB,CAA5B;;AAEA,QAAI,wBACI,SAAS,eAAe,oBAAoB,SAApB,CAA8B,OAA9B,EAAuC,KAAvC,EAA8C,WAA9C,EAA2D,OAA3D,EAAoE,WAApE,CAAf,EACe,mBADf,EAEe,OAFf,EAGe,WAHf,CADb,KAKG,CAAC,oBAAoB,OAApB,CAA4B,OAAO,IAAnC,EAAyC,WALjD,EAK8D;AAC5D,aAAO;AACL,wBADK;AAEL,sBAFK;AAGL,gBAAQ;AAHH,OAAP;AAKD,KAXD,MAYK;AACH,YAAM,aAAN,CAAoB,eAApB,CAAoC,WAApC,EAAiD,OAAjD;;AAEA,UAAM,aAAa,iBAAiB,WAAjB,EAA8B,OAA9B,EAAuC,KAAvC,EAA8C,OAA9C,EAAuD,aAAvD,EAAsE,WAAtE,CAAnB;;AAEA,UAAI,WAAW,MAAX,IACG,CAAC,WAAW,MAAX,CAAkB,OAAlB,CAA0B,WAAW,MAAX,CAAkB,IAA5C,EAAkD,WAD1D,EACuE;AACrE,eAAO,UAAP;AACD;AACF;;AAED,cAAU,MAAM,UAAN,CAAiB,OAAjB,CAAV;AACD;;AAED,SAAO,EAAP;AACD;;AAED,SAAS,OAAT,CAAkB,WAAlB,SAA4D;AAAA,MAA3B,MAA2B,SAA3B,MAA2B;AAAA,MAAnB,MAAmB,SAAnB,MAAmB;AAAA,MAAX,OAAW,SAAX,OAAW;;AAC1D,WAAS,UAAU,EAAnB;;AAEA,MAAI,YAAY,MAAZ,IAAsB,YAAY,MAAZ,CAAmB,OAAnB,CAA2B,WAArD,EAAkE;AAChE,gBAAY,MAAZ,CAAmB,IAAnB,CAAwB,eAAxB,CAAwC,KAAxC,CAA8C,MAA9C,GAAuD,EAAvD;AACD;;AAED,cAAY,MAAZ,GAAqB,MAArB;AACA,cAAY,OAAZ,GAAsB,OAAtB;AACA,QAAM,UAAN,CAAiB,YAAY,QAA7B,EAAuC,MAAvC;;AAEA,MAAI,UAAU,OAAO,OAAP,CAAe,WAA7B,EAA0C;AACxC,QAAM,SAAS,SAAQ,QAAQ,OAAO,IAAf,EAAqB,SAArB,CAA+B,MAA/B,CAAR,GAAiD,EAAhE;AACA,gBAAY,MAAZ,CAAmB,IAAnB,CAAwB,eAAxB,CAAwC,KAAxC,CAA8C,MAA9C,GAAuD,MAAvD;AACD;;AAED,UAAQ,IAAR,CAAa,UAAb,EAAyB,EAAE,aAAa,WAAf,EAAzB;AACD;;AAED,YAAY,OAAZ,CAAoB,EAApB,CAAuB,MAAvB,EAA+B,iBAA2B;AAAA,MAAf,WAAe,SAAf,WAAe;;AACxD,MAAM,SAAS,YAAY,MAA3B;;AAEA,MAAI,UAAU,OAAO,OAAP,CAAe,WAA7B,EAA0C;AACxC,WAAO,IAAP,CAAY,eAAZ,CAA4B,KAA5B,CAAkC,MAAlC,GAA2C,EAA3C;AACD;AACF,CAND;;AAQA,aAAa,SAAb,CAAuB,SAAvB,GAAmC,UAAU,OAAV,EAAmB,KAAnB,EAA0B,WAA1B,EAAuC,OAAvC,EAAgD;AACjF,MAAM,SAAS,KAAK,oBAAL,CAA0B,OAA1B,EAAmC,KAAnC,EAA0C,WAA1C,EAAuD,OAAvD,CAAf;;AAEA,MAAI,KAAK,OAAL,CAAa,aAAjB,EAAgC;AAC9B,WAAO,KAAK,OAAL,CAAa,aAAb,CAA2B,OAA3B,EAAoC,KAApC,EAA2C,MAA3C,EAAmD,IAAnD,EAAyD,OAAzD,EAAkE,WAAlE,CAAP;AACD;;AAED,SAAO,MAAP;AACD,CARD;;AAUA;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4BA,aAAa,SAAb,CAAuB,aAAvB,GAAuC,UAAU,OAAV,EAAmB;AACxD,MAAI,MAAM,EAAN,CAAS,QAAT,CAAkB,OAAlB,CAAJ,EAAgC;AAC9B,SAAK,OAAL,CAAa,aAAb,GAA6B,OAA7B;;AAEA,WAAO,IAAP;AACD;;AAED,MAAI,YAAY,IAAhB,EAAsB;AACpB,WAAO,KAAK,OAAL,CAAa,aAApB;;AAEA,WAAO,IAAP;AACD;;AAED,SAAO,KAAK,OAAL,CAAa,aAApB;AACD,CAdD;;AAgBA;;;;;;;;;;AAUA,aAAa,SAAb,CAAuB,WAAvB,GAAqC,UAAU,QAAV,EAAoB;AACvD,MAAI,MAAM,EAAN,CAAS,IAAT,CAAc,QAAd,CAAJ,EAA6B;AAC3B,SAAK,OAAL,CAAa,WAAb,GAA2B,QAA3B;;AAEA,WAAO,IAAP;AACD;;AAED,MAAI,aAAa,IAAjB,EAAuB;AACrB,WAAO,KAAK,OAAL,CAAa,WAApB;;AAEA,WAAO,IAAP;AACD;;AAED,SAAO,KAAK,OAAL,CAAa,WAApB;AACD,CAdD;;AAgBA,aAAa,SAAb,CAAuB,oBAAvB,GAA8C,UAAU,OAAV,EAAmB,KAAnB,EAA0B,WAA1B,EAAuC,OAAvC,EAAgD;AAC5F,MAAM,OAAO,KAAK,OAAL,CAAa,OAAb,CAAb;AACA,MAAM,UAAU,MAAM,OAAN,IAAkB;AAChC,OAAG,CAD6B;AAEhC,OAAG,CAF6B;AAGhC,OAAG,CAH6B;AAIhC,OAAG;AAJ6B,GAAD,CAK9B,MAAM,MALwB,CAAjC;AAMA,MAAI,SAAS,IAAb;;AAEA,uBAAyB,QAAQ,KAAjC,kHAAwC;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,QAA7B,UAA6B;;AACtC;AACA,QAAI,YAAY,aAAZ,IACG,YAAY,KADf,IAEG,CAAC,UAAU,KAAK,OAAL,CAAa,UAAb,EAAyB,YAApC,MAAsD,CAF7D,EAEgE;AAC9D;AACD;;AAED,aAAS,QAAQ,UAAR,EAAoB,OAApB,CAA4B,OAA5B,EAAqC,KAArC,EAA4C,IAA5C,EAAkD,OAAlD,EAA2D,WAA3D,EAAwE,IAAxE,CAAT;;AAEA,QAAI,MAAJ,EAAY;AACV,aAAO,MAAP;AACD;AACF;AACF,CAxBD;;AA0BA,SAAS,sBAAT,CAAiC,YAAjC,EAA+C,OAA/C,EAAwD,MAAxD,EAAgE;AAC9D,MAAM,UAAU,aAAa,OAA7B;AACA,MAAM,aAAa,QAAQ,OAAO,IAAf,EAAqB,GAAxC;AACA,MAAM,gBAAgB,QAAQ,OAAO,IAAf,EAAqB,aAA3C;AACA,MAAI,qBAAqB,CAAzB;AACA,MAAI,cAAc,CAAlB;AACA,MAAI,qBAAqB,CAAzB;;AAEA;AACA,MAAI,EAAE,cAAc,aAAd,IAA+B,UAAU,eAA3C,CAAJ,EAAiE;AAAE;AAAS;;AAE5E,OAAK,IAAI,IAAI,CAAR,EAAW,MAAM,MAAM,YAAN,CAAmB,MAAzC,EAAiD,IAAI,GAArD,EAA0D,GAA1D,EAA+D;AAC7D,QAAM,cAAc,MAAM,YAAN,CAAmB,CAAnB,CAApB;AACA,QAAM,cAAc,YAAY,QAAZ,CAAqB,IAAzC;;AAEA,QAAI,CAAC,YAAY,WAAZ,EAAL,EAAgC;AAAE;AAAW;;AAE7C;;AAEA,QAAI,sBAAsB,UAAU,eAApC,EAAqD;AACnD,aAAO,KAAP;AACD;;AAED,QAAI,YAAY,MAAZ,KAAuB,YAA3B,EAAyC;AAAE;AAAW;;AAEtD,mBAAgB,gBAAgB,OAAO,IAAxB,GAA8B,CAA7C;;AAEA,QAAI,eAAe,UAAnB,EAA+B;AAC7B,aAAO,KAAP;AACD;;AAED,QAAI,YAAY,OAAZ,KAAwB,OAA5B,EAAqC;AACnC;;AAEA,UAAI,gBAAgB,OAAO,IAAvB,IAA+B,sBAAsB,aAAzD,EAAwE;AACtE,eAAO,KAAP;AACD;AACF;AACF;;AAED,SAAO,UAAU,eAAV,GAA4B,CAAnC;AACD;;AAED;;;;;;;;;;;;AAYA,SAAS,eAAT,GAA2B,UAAU,QAAV,EAAoB;AAC7C,MAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,QAAhB,CAAJ,EAA+B;AAC7B,cAAU,eAAV,GAA4B,QAA5B;;AAEA,WAAO,IAAP;AACD;;AAED,SAAO,UAAU,eAAjB;AACD,CARD;;AAUA,aAAa,eAAb,CAA6B,IAA7B,CAAkC,aAAlC;AACA,aAAa,eAAb,CAA6B,IAA7B,CAAkC,eAAlC;AACA,aAAa,eAAb,CAA6B,IAA7B,CAAkC,YAAlC;AACA,aAAa,eAAb,CAA6B,IAA7B,CAAkC,WAAlC;;AAEA,eAAe,IAAf,CAAoB,aAApB,GAAoC,IAApC;AACA,eAAe,IAAf,CAAoB,WAApB,GAAkC,IAAlC;;AAEA,MAAM,MAAN,CAAa,eAAe,SAA5B,EAAuC,UAAU,QAAV,CAAmB,SAA1D;;AAEA,OAAO,OAAP,GAAiB,SAAjB;;;;;ACnXA,IAAM,YAAc,QAAQ,QAAR,CAApB;AACA,IAAM,cAAc,QAAQ,gBAAR,CAApB;;AAEA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,KAAvB,EAA8B,UAAU,WAAV,EAAuB;AACnD,cAAY,UAAZ,GAAyB,IAAzB;AACD,CAFD;;AAIA,UAAU,OAAV,CAAkB,EAAlB,CAAqB,UAArB,EAAiC,gBAA2B;AAAA,MAAf,WAAe,QAAf,WAAe;;AAC1D,MAAM,aAAa,YAAY,QAAZ,CAAqB,IAAxC;;AAEA,MAAI,CAAC,UAAL,EAAiB;AAAE;AAAS;;AAE5B,MAAM,QAAQ,YAAY,MAAZ,CAAmB,OAAnB,CAA2B,UAA3B,EAAuC,KAArD;;AAEA,MAAI,QAAQ,CAAZ,EAAe;AACb,gBAAY,UAAZ,GAAyB,WAAW,YAAM;AACxC,kBAAY,KAAZ,CAAkB,YAAY,QAA9B,EAAwC,YAAY,MAApD,EAA4D,YAAY,OAAxE;AACD,KAFwB,EAEtB,KAFsB,CAAzB;AAGD;AACF,CAZD;;AAcA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,MAAvB,EAA+B,iBAAsC;AAAA,MAA1B,WAA0B,SAA1B,WAA0B;AAAA,MAAb,SAAa,SAAb,SAAa;;AACnE,MAAI,YAAY,eAAZ,IAA+B,CAAC,SAApC,EAA+C;AAC7C,iBAAa,YAAY,UAAzB;AACD;AACF,CAJD;;AAMA;AACA,UAAU,OAAV,CAAkB,EAAlB,CAAqB,cAArB,EAAqC,iBAA2B;AAAA,MAAf,WAAe,SAAf,WAAe;;AAC9D,MAAM,aAAa,YAAY,QAAZ,CAAqB,IAAxC;;AAEA,MAAI,CAAC,UAAL,EAAiB;AAAE;AAAS;;AAE5B,MAAM,QAAQ,YAAY,MAAZ,CAAmB,OAAnB,CAA2B,UAA3B,EAAuC,KAArD;;AAEA,MAAI,QAAQ,CAAZ,EAAe;AACb,gBAAY,QAAZ,CAAqB,IAArB,GAA4B,IAA5B;AACD;AACF,CAVD;;;;;AC5BA,IAAM,YAAY,QAAQ,QAAR,CAAlB;AACA,IAAM,QAAY,QAAQ,UAAR,CAAlB;AACA,IAAM,UAAY,QAAQ,kBAAR,CAAlB;AACA,IAAM,KAAY,QAAQ,aAAR,CAAlB;;eAEwC,QAAQ,mBAAR,C;IAAhC,e,YAAA,e;IAAiB,U,YAAA,U;;AAEzB,UAAU,iBAAV,CAA4B,QAAQ,iBAAR,CAA5B;;AAEA,UAAU,OAAV,CAAkB,EAAlB,CAAqB,cAArB,EAAsC,gBAAgD;AAAA,MAApC,WAAoC,QAApC,WAAoC;AAAA,MAAvB,WAAuB,QAAvB,WAAuB;AAAA,MAAV,EAAU,QAAV,EAAU;AAAA,MAAN,EAAM,QAAN,EAAM;;AACpF,MAAI,YAAY,QAAZ,CAAqB,IAArB,KAA8B,MAAlC,EAA0C;AAAE;AAAS;;AAErD;AACA,MAAM,OAAO,KAAK,GAAL,CAAS,EAAT,CAAb;AACA,MAAM,OAAO,KAAK,GAAL,CAAS,EAAT,CAAb;AACA,MAAM,UAAU,YAAY,MAAZ,CAAmB,OAAnB,CAA2B,IAA3C;AACA,MAAM,YAAY,QAAQ,SAA1B;AACA,MAAM,cAAe,OAAO,IAAP,GAAc,GAAd,GAAoB,OAAO,IAAP,GAAc,GAAd,GAAoB,IAA7D;;AAEA,cAAY,QAAZ,CAAqB,IAArB,GAA4B,QAAQ,QAAR,KAAqB,OAArB,GACxB,YAAY,CAAZ,CADwB,CACT;AADS,IAExB,QAAQ,QAFZ;;AAIA;AACA,MAAI,gBAAgB,IAAhB,IAAwB,cAAc,IAAtC,IAA8C,cAAc,WAAhE,EAA6E;AAC3E;AACA,gBAAY,QAAZ,CAAqB,IAArB,GAA4B,IAA5B;;AAEA;;AAEA,QAAI,CAAC,YAAY,QAAZ,CAAqB,IAA1B,EAAgC;;AAE9B,UAAI,UAAU,WAAd;;AAEA,UAAM,eAAe,SAAf,YAAe,CAAU,YAAV,EAAwB,QAAxB,EAAkC,OAAlC,EAA2C;AAC9D,YAAM,WAAW,QAAQ,0BAAR,GACX,QAAQ,gBAAR,CAAyB,QAAzB,CADW,GAEX,SAFN;;AAIA,YAAI,iBAAiB,YAAY,MAAjC,EAAyC;AAAE;AAAS;;AAEpD,YAAI,CAAC,QAAQ,WAAT,IACG,CAAC,aAAa,eAAb,CAA6B,OAA7B,EAAsC,OAAtC,EAA+C,WAA/C,CADJ,IAEG,gBAAgB,OAAhB,EAAyB,QAAzB,EAAmC,QAAnC,CAFP,EAEqD;;AAEnD,cAAM,UAAS,aAAa,SAAb,CAAuB,YAAY,WAAnC,EACuB,YAAY,SADnC,EAEuB,WAFvB,EAGuB,OAHvB,CAAf;;AAKA,cAAI,WACG,QAAO,IAAP,KAAgB,MADnB,IAEG,eAAe,WAAf,EAA4B,YAA5B,CAFH,IAGG,UAAU,cAAV,CAAyB,OAAzB,EAAiC,YAAjC,EAA+C,OAA/C,EAAwD,WAAxD,CAHP,EAG6E;;AAE3E,mBAAO,YAAP;AACD;AACF;AACF,OAxBD;;AA0BA,UAAI,SAAS,IAAb;;AAEA;AACA,aAAO,GAAG,OAAH,CAAW,OAAX,CAAP,EAA4B;AAC1B,YAAM,sBAAsB,MAAM,aAAN,CAAoB,GAApB,CAAwB,OAAxB,CAA5B;;AAEA,YAAI,uBACG,wBAAwB,YAAY,MADvC,IAEG,CAAC,oBAAoB,OAApB,CAA4B,IAA5B,CAAiC,WAFzC,EAEsD;;AAEpD,mBAAS,oBAAoB,SAApB,CAA8B,YAAY,WAA1C,EAAuD,YAAY,SAAnE,EAA8E,WAA9E,EAA2F,OAA3F,CAAT;AACD;AACD,YAAI,UACG,OAAO,IAAP,KAAgB,MADnB,IAEG,eAAe,WAAf,EAA4B,mBAA5B,CAFP,EAEyD;;AAEvD,sBAAY,QAAZ,CAAqB,IAArB,GAA4B,MAA5B;AACA,sBAAY,MAAZ,GAAqB,mBAArB;AACA,sBAAY,OAAZ,GAAsB,OAAtB;AACA;AACD;;AAED,YAAM,uBAAuB,MAAM,aAAN,CAAoB,eAApB,CAAoC,YAApC,EAAkD,OAAlD,CAA7B;;AAEA,YAAI,oBAAJ,EAA0B;AACxB,sBAAY,QAAZ,CAAqB,IAArB,GAA4B,MAA5B;AACA,sBAAY,MAAZ,GAAqB,oBAArB;AACA,sBAAY,OAAZ,GAAsB,OAAtB;AACA;AACD;;AAED,kBAAU,WAAW,OAAX,CAAV;AACD;AACF;AACF;AACF,CAtFD;;AAwFA,SAAS,cAAT,CAAyB,SAAzB,EAAoC,YAApC,EAAkD;AAChD,MAAI,CAAC,YAAL,EAAmB;AAAE,WAAO,KAAP;AAAe;;AAEpC,MAAM,WAAW,aAAa,OAAb,CAAqB,IAArB,CAA0B,SAA3C;;AAEA,SAAQ,cAAc,IAAd,IAAsB,aAAa,IAAnC,IAA2C,aAAa,SAAhE;AACD;;;;;ACvGD,QAAQ,QAAR,EAAkB,iBAAlB,CAAoC,QAAQ,oBAAR,CAApC;;;;;ACAA,QAAQ,QAAR,EAAkB,iBAAlB,CAAoC,QAAQ,mBAAR,CAApC;;;;;ACAA,OAAO,OAAP,GAAiB;AACf,QAAM;AACJ,YAAgB,IADZ;AAEJ,oBAAgB,MAFZ;AAGJ,iBAAgB;AAHZ,GADS;;AAOf,aAAW;AACT,YAAQ,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EADC;;AAGT;AACA;AACA,kBAAc,CALL;;AAOT,aAAS;AACP,eAAmB,KADZ;AAEP,kBAAmB,EAFZ,EAEmB;AAC1B,gBAAmB,GAHZ,EAGmB;AAC1B,gBAAmB,EAJZ,EAImB;AAC1B,mBAAmB,IALZ,EAKmB;AAC1B,yBAAmB,GANZ,CAMmB;AANnB;AAPA;AAPI,CAAjB;;;;;ACAA;;AAEA;AACA,QAAQ,kBAAR;;AAEA;AACA,QAAQ,WAAR;;AAEA;AACA,QAAQ,kBAAR;AACA,QAAQ,sBAAR;;AAEA;AACA,QAAQ,sBAAR;AACA,QAAQ,4BAAR;AACA,QAAQ,qCAAR;;AAEA;AACA,QAAQ,mBAAR;;AAEA;AACA,QAAQ,mBAAR;AACA,QAAQ,kBAAR;AACA,QAAQ,gBAAR;AACA,QAAQ,gBAAR;;AAEA;AACA,QAAQ,sBAAR;AACA,QAAQ,2BAAR;AACA,QAAQ,0BAAR;;AAEA;AACA,QAAQ,qBAAR;AACA,QAAQ,oBAAR;AACA,QAAQ,kBAAR;;AAEA;AACA,QAAQ,iCAAR;;AAEA;AACA,QAAQ,cAAR;;AAEA;AACA,OAAO,OAAP,GAAiB,QAAQ,YAAR,CAAjB;;;;;AC3CA,IAAM,gBAAiB,QAAQ,iBAAR,CAAvB;AACA,IAAM,cAAiB,QAAQ,eAAR,CAAvB;AACA,IAAM,YAAiB,QAAQ,aAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,SAAR,CAAvB;AACA,IAAM,iBAAiB,QAAQ,aAAR,CAAvB;;AAEA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,KAAvB,EAA8B,UAAU,WAAV,EAAuB;AACnD,cAAY,aAAZ,GAA4B;AAC1B,YAAa,KADa;AAE1B,eAAa,KAFa;AAG1B,iBAAa,KAHa;;AAK1B,gBAAY,IALc;AAM1B,cAAY,EANc;;AAQ1B,QAAI,CARsB,EAQnB,IAAI,CARe;AAS1B,QAAI,CATsB,EASnB,IAAI,CATe;;AAW1B,QAAI,CAXsB;AAY1B,SAAK,CAZqB,EAYlB,KAAK,CAZa;AAa1B,cAAU,CAbgB;;AAe1B,eAAW,CAfe;AAgB1B,eAAW,CAhBe;AAiB1B,OAAK;AAjBqB,GAA5B;;AAoBA,cAAY,iBAAZ,GAAkC;AAAA,WAAM,aAAe,KAAf,CAAqB,WAArB,CAAN;AAAA,GAAlC;AACA,cAAY,mBAAZ,GAAkC;AAAA,WAAM,eAAe,KAAf,CAAqB,WAArB,CAAN;AAAA,GAAlC;AACD,CAvBD;;AAyBA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,MAAvB,EAA+B,gBAAwD;AAAA,MAA5C,WAA4C,QAA5C,WAA4C;AAAA,MAA/B,KAA+B,QAA/B,KAA+B;AAAA,MAAxB,OAAwB,QAAxB,OAAwB;AAAA,MAAf,WAAe,QAAf,WAAe;;AACrF,MAAM,SAAS,YAAY,aAA3B;;AAEA;AACA,MAAI,OAAO,MAAX,EAAmB;AACjB,QAAI,UAAU,WAAd;;AAEA;AACA,WAAO,MAAM,EAAN,CAAS,OAAT,CAAiB,OAAjB,CAAP,EAAkC;;AAEhC;AACA,UAAI,YAAY,YAAY,OAA5B,EAAqC;AACnC;AACA,uBAAe,MAAf,CAAsB,OAAO,CAA7B;AACA,eAAO,MAAP,GAAgB,KAAhB;AACA,oBAAY,UAAZ,GAAyB,IAAzB;;AAEA;AACA,oBAAY,aAAZ,CAA0B,OAA1B;AACA,cAAM,SAAN,CAAgB,YAAY,SAA5B,EAAuC,YAAY,QAAnD;;AAEA;AACA,YAAM,YAAY,EAAE,wBAAF,EAAlB;AACA,oBAAY,OAAZ,CAAoB,IAApB,CAAyB,oBAAzB,EAA+C,SAA/C;AACA,oBAAY,OAAZ,CAAoB,IAApB,CAAyB,eAAzB,EAA+C,SAA/C;;AAEA;AACA,YAAM,cAAc,IAAI,aAAJ,CAAkB,WAAlB,EACkB,KADlB,EAEkB,YAAY,QAAZ,CAAqB,IAFvC,EAGkB,eAHlB,EAIkB,YAAY,OAJ9B,CAApB;;AAMA,oBAAY,MAAZ,CAAmB,IAAnB,CAAwB,WAAxB;AACA,oBAAY,SAAZ,GAAwB,WAAxB;AACA,kBAAU,aAAV,CAAwB,YAAY,gBAApC;;AAEA,cAAM,UAAN,CAAiB,YAAY,UAA7B,EAAyC,YAAY,SAArD;AACA;AACD;;AAED,gBAAU,MAAM,UAAN,CAAiB,OAAjB,CAAV;AACD;AACF;AACF,CA5CD;;AA8CA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,IAAvB,EAA6B,iBAAkC;AAAA,MAAtB,WAAsB,SAAtB,WAAsB;AAAA,MAAT,KAAS,SAAT,KAAS;;AAC7D,MAAM,SAAS,YAAY,aAA3B;;AAEA,MAAI,CAAC,YAAY,WAAZ,EAAD,IAA8B,OAAO,MAAzC,EAAiD;AAAE;AAAS;;AAE5D,MAAM,SAAS,YAAY,MAA3B;AACA,MAAM,UAAU,UAAU,OAAO,OAAjC;AACA,MAAM,iBAAiB,WAAW,YAAY,QAAZ,CAAqB,IAAhC,IAAwC,QAAQ,YAAY,QAAZ,CAAqB,IAA7B,EAAmC,OAAlG;;AAEA,MAAM,MAAM,IAAI,IAAJ,GAAW,OAAX,EAAZ;AACA,MAAM,WAAW,EAAjB;AACA,MAAM,OAAO,MAAM,MAAN,CAAa,EAAb,EAAiB,YAAY,SAAZ,CAAsB,IAAvC,CAAb;AACA,MAAM,eAAe,YAAY,YAAZ,CAAyB,MAAzB,CAAgC,KAArD;;AAEA,MAAI,YAAY,KAAhB;AACA,MAAI,uBAAJ;;AAEA;AACA,MAAM,kBAAmB,kBAAkB,eAAe,OAAjC,IACH,YAAY,QAAZ,CAAqB,IAArB,KAA8B,SAD3B,IAEH,UAAU,OAAO,UAFvC;;AAIA,MAAM,UAAW,mBACX,MAAM,YAAY,SAAZ,CAAsB,SAA7B,GAA0C,EAD9B,IAEZ,eAAe,eAAe,QAFlB,IAGZ,eAAe,eAAe,QAHnC;;AAKA,MAAM,cAAc;AAClB,4BADkB;AAElB,gBAAY,IAFM;AAGlB,sBAHkB;AAIlB,YAAQ,IAJU;AAKlB,oBAAgB;AALE,GAApB;;AAQA;AACA,MAAI,mBAAmB,CAAC,OAAxB,EAAiC;AAC/B,cAAU,aAAV,CAAwB,QAAxB;;AAEA,qBAAiB,UAAU,MAAV,CAAiB,WAAjB,CAAjB;;AAEA,QAAI,eAAe,UAAf,IAA6B,eAAe,MAAhD,EAAwD;AACtD,kBAAY,IAAZ;AACD;AACF;;AAED,MAAI,EAAE,WAAW,SAAb,CAAJ,EAA6B;AAAE;AAAS;;AAExC,QAAM,UAAN,CAAiB,OAAO,QAAxB,EAAkC,YAAY,SAA9C;;AAEA,cAAY,QAAZ,CAAqB,CAArB,IAA0B,OAAO,UAAP,GACxB,IAAI,aAAJ,CAAkB,WAAlB,EAA+B,KAA/B,EAAsC,YAAY,QAAZ,CAAqB,IAA3D,EAAiE,cAAjE,EAAiF,YAAY,OAA7F,CADF;;AAGA,SAAO,EAAP,GAAY,GAAZ;;AAEA,SAAO,MAAP,GAAgB,IAAhB;AACA,SAAO,WAAP,GAAqB,eAAe,WAApC;AACA,cAAY,UAAZ,GAAyB,MAAzB;;AAEA,SAAO,IAAP,CAAY,OAAO,UAAnB;;AAEA,MAAI,OAAJ,EAAa;AACX,WAAO,GAAP,GAAa,YAAY,YAAZ,CAAyB,MAAzB,CAAgC,EAA7C;AACA,WAAO,GAAP,GAAa,YAAY,YAAZ,CAAyB,MAAzB,CAAgC,EAA7C;AACA,WAAO,EAAP,GAAY,YAAZ;;AAEA,gBAAY,WAAZ,EAAyB,MAAzB;;AAEA,UAAM,MAAN,CAAa,IAAb,EAAmB,YAAY,SAAZ,CAAsB,IAAzC;;AAEA,SAAK,CAAL,IAAU,OAAO,EAAjB;AACA,SAAK,CAAL,IAAU,OAAO,EAAjB;;AAEA,cAAU,aAAV,CAAwB,QAAxB;;AAEA,qBAAiB,UAAU,MAAV,CAAiB,WAAjB,CAAjB;;AAEA,WAAO,UAAP,IAAqB,eAAe,EAApC;AACA,WAAO,UAAP,IAAqB,eAAe,EAApC;;AAEA,WAAO,CAAP,GAAW,eAAe,OAAf,CAAuB,YAAY,iBAAnC,CAAX;AACD,GApBD,MAqBK;AACH,WAAO,SAAP,GAAmB,IAAnB;AACA,WAAO,EAAP,GAAY,eAAe,EAA3B;AACA,WAAO,EAAP,GAAY,eAAe,EAA3B;;AAEA,WAAO,EAAP,GAAY,OAAO,EAAP,GAAY,CAAxB;;AAEA,WAAO,CAAP,GAAW,eAAe,OAAf,CAAuB,YAAY,mBAAnC,CAAX;AACD;AACF,CA3FD;;AA6FA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,aAAvB,EAAsC,iBAA2B;AAAA,MAAf,WAAe,SAAf,WAAe;;AAC/D,MAAM,SAAS,YAAY,aAA3B;;AAEA,MAAI,OAAO,MAAX,EAAmB;AACjB,mBAAe,MAAf,CAAsB,OAAO,CAA7B;AACA,WAAO,MAAP,GAAgB,KAAhB;AACA,gBAAY,UAAZ,GAAyB,IAAzB;AACD;AACF,CARD;;AAUA,SAAS,WAAT,CAAsB,WAAtB,EAAmC,MAAnC,EAA2C;AACzC,MAAM,iBAAiB,YAAY,MAAZ,CAAmB,OAAnB,CAA2B,YAAY,QAAZ,CAAqB,IAAhD,EAAsD,OAA7E;AACA,MAAM,SAAS,eAAe,UAA9B;AACA,MAAM,aAAa,CAAC,KAAK,GAAL,CAAS,eAAe,QAAf,GAA0B,OAAO,EAA1C,CAAD,GAAiD,MAApE;;AAEA,SAAO,EAAP,GAAY,YAAY,SAAZ,CAAsB,KAAlC;AACA,SAAO,EAAP,GAAY,YAAY,SAAZ,CAAsB,KAAlC;AACA,SAAO,EAAP,GAAY,OAAO,UAAP,CAAkB,SAAlB,GAA8B,IAA1C;AACA,SAAO,EAAP,GAAY,OAAO,EAAP,GAAY,CAAxB;;AAEA,SAAO,UAAP,GAAoB,OAAO,EAAP,GAAY,CAAC,OAAO,GAAP,GAAa,UAAd,IAA4B,MAA5D;AACA,SAAO,UAAP,GAAoB,OAAO,EAAP,GAAY,CAAC,OAAO,GAAP,GAAa,UAAd,IAA4B,MAA5D;AACA,SAAO,EAAP,GAAY,UAAZ;;AAEA,SAAO,SAAP,GAAmB,SAAS,OAAO,EAAnC;AACA,SAAO,SAAP,GAAmB,IAAI,eAAe,QAAf,GAA0B,OAAO,EAAxD;AACD;;AAED,SAAS,YAAT,GAAyB;AACvB,sBAAoB,IAApB;AACA,QAAM,cAAN,CAAqB,KAAK,YAA1B,EAAwC,KAAK,UAA7C,EAAyD,KAAK,SAA9D;;AAEA,MAAM,SAAS,KAAK,aAApB;AACA,MAAM,UAAU,KAAK,MAAL,CAAY,OAAZ,CAAoB,KAAK,QAAL,CAAc,IAAlC,EAAwC,OAAxD;AACA,MAAM,SAAS,QAAQ,UAAvB;AACA,MAAM,IAAI,IAAI,IAAJ,GAAW,OAAX,KAAuB,IAAvB,GAA8B,OAAO,EAA/C;;AAEA,MAAI,IAAI,OAAO,EAAf,EAAmB;;AAEjB,QAAM,WAAY,IAAI,CAAC,KAAK,GAAL,CAAS,CAAC,MAAD,GAAU,CAAnB,IAAwB,OAAO,SAAhC,IAA6C,OAAO,SAA1E;;AAEA,QAAI,OAAO,UAAP,KAAsB,OAAO,EAA7B,IAAmC,OAAO,UAAP,KAAsB,OAAO,EAApE,EAAwE;AACtE,aAAO,EAAP,GAAY,OAAO,EAAP,GAAY,QAAxB;AACA,aAAO,EAAP,GAAY,OAAO,EAAP,GAAY,QAAxB;AACD,KAHD,MAIK;AACH,UAAM,YAAY,MAAM,sBAAN,CAA6B,CAA7B,EAAgC,CAAhC,EAC6B,OAAO,EADpC,EAE6B,OAAO,EAFpC,EAG6B,OAAO,UAHpC,EAI6B,OAAO,UAJpC,EAK6B,QAL7B,CAAlB;;AAOA,aAAO,EAAP,GAAY,UAAU,CAAtB;AACA,aAAO,EAAP,GAAY,UAAU,CAAtB;AACD;;AAED,SAAK,MAAL;;AAEA,WAAO,CAAP,GAAW,eAAe,OAAf,CAAuB,KAAK,iBAA5B,CAAX;AACD,GAvBD,MAwBK;AACH,WAAO,EAAP,GAAY,OAAO,UAAnB;AACA,WAAO,EAAP,GAAY,OAAO,UAAnB;;AAEA,SAAK,MAAL;AACA,SAAK,GAAL,CAAS,OAAO,UAAhB;AACA,WAAO,MAAP,GAAgB,KAAhB;AACA,SAAK,UAAL,GAAkB,IAAlB;AACD;;AAED,QAAM,UAAN,CAAiB,KAAK,UAAtB,EAAkC,KAAK,SAAvC;AACD;;AAED,SAAS,cAAT,GAA2B;AACzB,sBAAoB,IAApB;;AAEA,MAAM,SAAS,KAAK,aAApB;AACA,MAAM,IAAI,IAAI,IAAJ,GAAW,OAAX,KAAuB,OAAO,EAAxC;AACA,MAAM,WAAW,KAAK,MAAL,CAAY,OAAZ,CAAoB,KAAK,QAAL,CAAc,IAAlC,EAAwC,OAAxC,CAAgD,iBAAjE;;AAEA,MAAI,IAAI,QAAR,EAAkB;AAChB,WAAO,EAAP,GAAY,MAAM,WAAN,CAAkB,CAAlB,EAAqB,CAArB,EAAwB,OAAO,EAA/B,EAAmC,QAAnC,CAAZ;AACA,WAAO,EAAP,GAAY,MAAM,WAAN,CAAkB,CAAlB,EAAqB,CAArB,EAAwB,OAAO,EAA/B,EAAmC,QAAnC,CAAZ;;AAEA,SAAK,WAAL,CAAiB,OAAO,UAAxB,EAAoC,OAAO,UAA3C;;AAEA,WAAO,CAAP,GAAW,eAAe,OAAf,CAAuB,KAAK,mBAA5B,CAAX;AACD,GAPD,MAQK;AACH,WAAO,EAAP,GAAY,OAAO,EAAnB;AACA,WAAO,EAAP,GAAY,OAAO,EAAnB;;AAEA,SAAK,WAAL,CAAiB,OAAO,UAAxB,EAAoC,OAAO,UAA3C;AACA,SAAK,GAAL,CAAS,OAAO,UAAhB;;AAEA,WAAO,SAAP,GACE,OAAO,MAAP,GAAgB,KADlB;AAEA,SAAK,UAAL,GAAkB,IAAlB;AACD;AACF;;AAED,SAAS,mBAAT,CAA8B,WAA9B,EAA2C;AACzC,MAAM,SAAS,YAAY,aAA3B;;AAEA;AACA,MAAI,CAAC,OAAO,MAAZ,EAAoB;AAAE;AAAS;;AAE/B,MAAM,SAAW,OAAO,QAAP,CAAgB,IAAjC;AACA,MAAM,WAAW,OAAO,QAAP,CAAgB,MAAjC;;AAEA,QAAM,SAAN,CAAgB,YAAY,SAA5B,EAAuC,CAAE;AACvC,WAAS,OAAO,CAAP,GAAa,OAAO,EADU;AAEvC,WAAS,OAAO,CAAP,GAAa,OAAO,EAFU;AAGvC,aAAS,SAAS,CAAT,GAAa,OAAO,EAHU;AAIvC,aAAS,SAAS,CAAT,GAAa,OAAO;AAJU,GAAF,CAAvC;AAMD;;;;;AC/RD,IAAM,UAAe,QAAQ,iBAAR,CAArB;AACA,IAAM,SAAe,QAAQ,gBAAR,CAArB;AACA,IAAM,QAAe,QAAQ,SAAR,CAArB;AACA,IAAM,QAAe,QAAQ,SAAR,CAArB;AACA,IAAM,eAAe,QAAQ,gBAAR,CAArB;AACA,IAAM,cAAe,QAAQ,eAAR,CAArB;;AAEA,IAAM,eAAe,EAArB;;AAEA;;;;;;;;;;;;;;;;;;;;;;;;AAwBA,SAAS,QAAT,CAAmB,OAAnB,EAA4B,OAA5B,EAAqC;AACnC,MAAI,eAAe,MAAM,aAAN,CAAoB,GAApB,CAAwB,OAAxB,EAAiC,OAAjC,CAAnB;;AAEA,MAAI,CAAC,YAAL,EAAmB;AACjB,mBAAe,IAAI,YAAJ,CAAiB,OAAjB,EAA0B,OAA1B,CAAf;AACA,iBAAa,MAAb,CAAoB,MAApB,GAA6B,YAA7B;AACD;;AAED,SAAO,YAAP;AACD;;AAED;;;;;;;;AAQA,SAAS,KAAT,GAAiB,UAAU,OAAV,EAAmB,OAAnB,EAA4B;AAC3C,SAAO,MAAM,aAAN,CAAoB,cAApB,CAAmC,OAAnC,EAA4C,WAAW,QAAQ,OAA/D,MAA4E,CAAC,CAApF;AACD,CAFD;;AAIA;;;;;;;;;;;;AAYA,SAAS,EAAT,GAAc,UAAU,IAAV,EAAgB,QAAhB,EAA0B,OAA1B,EAAmC;AAC/C,MAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,IAAhB,KAAyB,KAAK,MAAL,CAAY,GAAZ,MAAqB,CAAC,CAAnD,EAAsD;AACpD,WAAO,KAAK,IAAL,GAAY,KAAZ,CAAkB,IAAlB,CAAP;AACD;;AAED,MAAI,MAAM,EAAN,CAAS,KAAT,CAAe,IAAf,CAAJ,EAA0B;AACxB,yBAAwB,IAAxB,kHAA8B;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAAnB,SAAmB;;AAC5B,eAAS,EAAT,CAAY,SAAZ,EAAuB,QAAvB,EAAiC,OAAjC;AACD;;AAED,WAAO,QAAP;AACD;;AAED,MAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,IAAhB,CAAJ,EAA2B;AACzB,SAAK,IAAM,IAAX,IAAmB,IAAnB,EAAyB;AACvB,eAAS,EAAT,CAAY,IAAZ,EAAkB,KAAK,IAAL,CAAlB,EAA8B,QAA9B;AACD;;AAED,WAAO,QAAP;AACD;;AAED;AACA,MAAI,MAAM,QAAN,CAAe,aAAa,UAA5B,EAAwC,IAAxC,CAAJ,EAAmD;AACjD;AACA,QAAI,CAAC,aAAa,IAAb,CAAL,EAAyB;AACvB,mBAAa,IAAb,IAAqB,CAAC,QAAD,CAArB;AACD,KAFD,MAGK;AACH,mBAAa,IAAb,EAAmB,IAAnB,CAAwB,QAAxB;AACD;AACF;AACD;AATA,OAUK;AACH,aAAO,GAAP,CAAW,MAAM,QAAjB,EAA2B,IAA3B,EAAiC,QAAjC,EAA2C,EAAE,gBAAF,EAA3C;AACD;;AAED,SAAO,QAAP;AACD,CArCD;;AAuCA;;;;;;;;;;;AAWA,SAAS,GAAT,GAAe,UAAU,IAAV,EAAgB,QAAhB,EAA0B,OAA1B,EAAmC;AAChD,MAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,IAAhB,KAAyB,KAAK,MAAL,CAAY,GAAZ,MAAqB,CAAC,CAAnD,EAAsD;AACpD,WAAO,KAAK,IAAL,GAAY,KAAZ,CAAkB,IAAlB,CAAP;AACD;;AAED,MAAI,MAAM,EAAN,CAAS,KAAT,CAAe,IAAf,CAAJ,EAA0B;AACxB,0BAAwB,IAAxB,yHAA8B;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAAnB,SAAmB;;AAC5B,eAAS,GAAT,CAAa,SAAb,EAAwB,QAAxB,EAAkC,OAAlC;AACD;;AAED,WAAO,QAAP;AACD;;AAED,MAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,IAAhB,CAAJ,EAA2B;AACzB,SAAK,IAAM,IAAX,IAAmB,IAAnB,EAAyB;AACvB,eAAS,GAAT,CAAa,IAAb,EAAmB,KAAK,IAAL,CAAnB,EAA+B,QAA/B;AACD;;AAED,WAAO,QAAP;AACD;;AAED,MAAI,CAAC,MAAM,QAAN,CAAe,aAAa,UAA5B,EAAwC,IAAxC,CAAL,EAAoD;AAClD,WAAO,MAAP,CAAc,MAAM,QAApB,EAA8B,IAA9B,EAAoC,QAApC,EAA8C,OAA9C;AACD,GAFD,MAGK;AACH,QAAI,cAAJ;;AAEA,QAAI,QAAQ,YAAR,IACG,CAAC,QAAQ,MAAM,OAAN,CAAc,aAAa,IAAb,CAAd,EAAkC,QAAlC,CAAT,MAA0D,CAAC,CADlE,EACqE;AACnE,mBAAa,IAAb,EAAmB,MAAnB,CAA0B,KAA1B,EAAiC,CAAjC;AACD;AACF;;AAED,SAAO,QAAP;AACD,CAlCD;;AAoCA;;;;;;;AAOA,SAAS,KAAT,GAAiB,YAAY;AAC3B,SAAO,KAAP;AACD,CAFD;;AAIA;AACA,SAAS,iBAAT,GAA8B,MAAM,cAApC;AACA,SAAS,YAAT,GAA8B,MAAM,SAApC;AACA,SAAS,gBAAT,GAA8B,MAAM,aAApC;AACA,SAAS,aAAT,GAA8B,MAAM,UAApC;;AAEA,SAAS,cAAT,GAAgC,MAAM,cAAtC;AACA,SAAS,oBAAT,GAAgC,MAAM,oBAAtC;AACA,SAAS,eAAT,GAAgC,MAAM,eAAtC;AACA,SAAS,OAAT,GAAgC,MAAM,OAAtC;;AAEA;;;;;;AAMA,SAAS,aAAT,GAAyB,YAAY;AACnC,SAAO,QAAQ,aAAf;AACD,CAFD;;AAIA;;;;;;AAMA,SAAS,oBAAT,GAAgC,YAAY;AAC1C,SAAO,QAAQ,oBAAf;AACD,CAFD;;AAIA;;;;;;;;;AASA,SAAS,IAAT,GAAgB,UAAU,KAAV,EAAiB;AAC/B,OAAK,IAAI,IAAI,MAAM,YAAN,CAAmB,MAAnB,GAA4B,CAAzC,EAA4C,KAAK,CAAjD,EAAoD,GAApD,EAAyD;AACvD,UAAM,YAAN,CAAmB,CAAnB,EAAsB,IAAtB,CAA2B,KAA3B;AACD;;AAED,SAAO,QAAP;AACD,CAND;;AAQA;;;;;;;;;AASA,SAAS,oBAAT,GAAgC,UAAU,QAAV,EAAoB;AAClD,MAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,QAAhB,CAAJ,EAA+B;AAC7B,gBAAY,oBAAZ,GAAmC,QAAnC;;AAEA,WAAO,IAAP;AACD;;AAED,SAAO,YAAY,oBAAnB;AACD,CARD;;AAUA,SAAS,WAAT,GAA0B,MAAM,WAAhC;AACA,SAAS,cAAT,GAA0B,MAAM,cAAhC;;AAEA,MAAM,QAAN,GAAiB,QAAjB;;AAEA,OAAO,OAAP,GAAiB,QAAjB;;;;;AC7OA,IAAM,eAAe,QAAQ,gBAAR,CAArB;AACA,IAAM,cAAe,QAAQ,eAAR,CAArB;AACA,IAAM,QAAe,QAAQ,SAAR,CAArB;AACA,IAAM,KAAe,QAAQ,YAAR,CAArB;AACA,IAAM,SAAe,QAAQ,gBAAR,CAArB;;eAE0C,QAAQ,kBAAR,C;IAAlC,Y,YAAA,Y;IAAc,e,YAAA,e;;AAEtB;;;;;;;;;;;;;;;AAaA,aAAa,SAAb,CAAuB,cAAvB,GAAwC,UAAU,QAAV,EAAoB;AAC1D,MAAI,wBAAwB,IAAxB,CAA6B,QAA7B,CAAJ,EAA4C;AAC1C,SAAK,OAAL,CAAa,cAAb,GAA8B,QAA9B;AACA,WAAO,IAAP;AACD;;AAED,MAAI,GAAG,IAAH,CAAQ,QAAR,CAAJ,EAAuB;AACrB,SAAK,OAAL,CAAa,cAAb,GAA8B,WAAU,QAAV,GAAqB,OAAnD;AACA,WAAO,IAAP;AACD;;AAED,SAAO,KAAK,OAAL,CAAa,cAApB;AACD,CAZD;;AAcA,aAAa,SAAb,CAAuB,sBAAvB,GAAgD,UAAU,KAAV,EAAiB;AAC/D,MAAM,UAAU,KAAK,OAAL,CAAa,cAA7B;;AAEA,MAAI,YAAY,OAAhB,EAAyB;AAAE;AAAS;;AAEpC,MAAI,YAAY,QAAhB,EAA0B;AACxB,UAAM,cAAN;AACA;AACD;;AAED;;AAEA;AACA;AACA,MAAI,OAAO,eAAX,EAA4B;AAC1B;AACD;;AAED;AACA,MAAI,uCAAuC,IAAvC,CAA4C,MAAM,IAAlD,CAAJ,EAA6D;AAC3D;AACD;;AAED;AACA,MAAI,GAAG,OAAH,CAAW,MAAM,MAAjB,KACG,gBAAgB,MAAM,MAAtB,EAA8B,uEAA9B,CADP,EAC+G;AAC7G;AACD;;AAED,QAAM,cAAN;AACD,CA9BD;;AAgCA,SAAS,kBAAT,OAAqD;AAAA,MAAtB,WAAsB,QAAtB,WAAsB;AAAA,MAAT,KAAS,QAAT,KAAS;;AACnD,MAAI,YAAY,MAAhB,EAAwB;AACtB,gBAAY,MAAZ,CAAmB,sBAAnB,CAA0C,KAA1C;AACD;AACF;;WAEyB,CAAC,MAAD,EAAS,MAAT,EAAiB,IAAjB,EAAuB,QAAvB,C;AAA1B,yCAA4D;AAAvD,MAAM,sBAAN;AACH,cAAY,OAAZ,CAAoB,EAApB,CAAuB,WAAvB,EAAoC,kBAApC;AACD;;AAED;AACA,YAAY,SAAZ,CAAsB,SAAtB,GAAkC,SAAS,iBAAT,CAA4B,KAA5B,EAAmC;AACnE,uBAA0B,MAAM,YAAhC,mHAA8C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,QAAnC,WAAmC;;;AAE5C,QAAI,YAAY,OAAZ,KACI,YAAY,OAAZ,KAAwB,MAAM,MAA9B,IACG,aAAa,YAAY,OAAzB,EAAkC,MAAM,MAAxC,CAFP,CAAJ,EAE6D;;AAE3D,kBAAY,MAAZ,CAAmB,sBAAnB,CAA0C,KAA1C;AACA;AACD;AACF;AACF,CAXD;;;;;AC9EA,IAAM,QAAgB,QAAQ,SAAR,CAAtB;AACA,IAAM,SAAgB,QAAQ,gBAAR,CAAtB;AACA,IAAM,UAAgB,QAAQ,iBAAR,CAAtB;AACA,IAAM,UAAgB,QAAQ,2BAAR,CAAtB;AACA,IAAM,gBAAgB,QAAQ,sBAAR,CAAtB;;eAEmB,QAAQ,gBAAR,C;IAAX,M,YAAA,M;;AAER,IAAM,WAAW,OAAO,SAAP,CAAiB,QAAlC;;AAEA,IAAI,CAAC,OAAO,KAAP,CAAa,OAAlB,EAA2B;AACzB,SAAO,KAAP,CAAa,OAAb,GAAuB,UAAU,GAAV,EAAe;AACpC,WAAO,SAAS,IAAT,CAAc,GAAd,MAAuB,gBAA9B;AACD,GAFD;AAGD;;AAED,IAAI,CAAC,OAAO,SAAP,CAAiB,IAAtB,EAA4B;AAC1B,SAAO,SAAP,CAAiB,IAAjB,GAAwB,YAAY;AAClC,WAAO,KAAK,OAAL,CAAa,oCAAb,EAAmD,EAAnD,CAAP;AACD,GAFD;AAGD;;AAED;AACA;AACA;AACA;AACA;AACA,SAAS,aAAT,CAAwB,KAAxB,EAA+B;AAC7B,MAAM,cAAc,MAAM,MAA1B;AACA,MAAM,cAAc,QAAQ,MAAR,CAAe,KAAf,EAAsB,MAAM,IAA5B,EAAkC,WAAlC,CAApB;;AAEA,MAAI,CAAC,WAAL,EAAkB;AAAE;AAAS;;AAE7B,MAAI,YAAY,OAAZ,IACG,MAAM,OAAN,KAAkB,YAAY,OAAZ,CAAoB,OADzC,IAEG,MAAM,OAAN,KAAkB,YAAY,OAAZ,CAAoB,OAFzC,IAGG,gBAAkB,YAAY,OAAZ,CAAoB,MAH7C,EAGqD;;AAEnD,gBAAY,WAAZ,CAAwB,CAAxB,IAA6B,WAA7B;AACA,gBAAY,SAAZ,CAAwB,CAAxB,IAA6B,IAAI,IAAJ,GAAW,OAAX,EAA7B;;AAEA,kBAAc,IAAd,CAAmB;AACjB,8BADiB;AAEjB,kBAFiB;AAGjB,8BAHiB;AAIjB,eAAS,KAJQ;AAKjB,YAAM;AALW,KAAnB;AAOD;AACF;;AAED,IAAI,QAAQ,KAAZ,EAAmB;AACjB,MAAM,YAAY,SAAZ,SAAY,CAAU,KAAV,EAAiB;AACjC,yBAA0B,MAAM,YAAhC,kHAA8C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAAnC,WAAmC;;AAC5C,UAAI,YAAY,WAAZ,EAAJ,EAA+B;AAC7B,oBAAY,MAAZ,CAAmB,sBAAnB,CAA0C,KAA1C;AACD;AACF;AACF,GAND;;AAQA,MAAM,WAAW,SAAS,QAAT,QAAiC,UAAjC,EAA6C;AAAA,QAAxB,GAAwB,SAAxB,GAAwB;AAAA,QAAnB,GAAmB,SAAnB,GAAmB;;AAC5D,QAAM,cAAc,WAAW,OAAX,CAAmB,QAAnB,MAAiC,CAAjC,GAChB,OAAO,GADS,GACH,OAAO,MADxB;;AAGA;AACA,gBAAY,GAAZ,EAAiB,aAAjB,EAAgC,SAAhC;;AAEA,QAAI,aAAJ,EAAmB;AACjB,kBAAY,GAAZ,EAAiB,UAAjB,EAA6B,aAA7B;AACD;AACF,GAVD;;AAYA,QAAM,OAAN,CAAc,EAAd,CAAiB,cAAjB,EAAoC,QAApC;AACA,QAAM,OAAN,CAAc,EAAd,CAAiB,iBAAjB,EAAoC,QAApC;AACD;;AAED,OAAO,OAAP,GAAiB,IAAjB;;;;;AC5EA,IAAM,gBAAgB,QAAQ,kBAAR,CAAtB;AACA,IAAM,cAAgB,QAAQ,gBAAR,CAAtB;AACA,IAAM,SAAgB,QAAQ,iBAAR,CAAtB;;AAEA,IAAM,YAAY;AAChB,SAAO,EADS;;AAGhB,cAAY,oBAAU,GAAV,EAAe;AAAA,QACjB,WADiB,GACiB,GADjB,CACjB,WADiB;AAAA,QACQ,IADR,GACiB,GADjB,CACJ,UADI;AAAA,QAEjB,MAFiB,GAEgB,WAFhB,CAEjB,MAFiB;AAAA,QAET,OAFS,GAEgB,WAFhB,CAET,OAFS;AAAA,QAEA,WAFA,GAEgB,WAFhB,CAEA,WAFA;;AAGzB,QAAM,OAAO,OAAO,OAAP,CAAe,OAAf,CAAb;;AAEA,QAAI,IAAJ,EAAU;AACR,kBAAY,IAAZ,GAAmB,KAAK,CAAL,GAAS,KAAK,IAAjC;AACA,kBAAY,GAAZ,GAAmB,KAAK,CAAL,GAAS,KAAK,GAAjC;;AAEA,kBAAY,KAAZ,GAAqB,KAAK,KAAL,GAAc,KAAK,CAAxC;AACA,kBAAY,MAAZ,GAAqB,KAAK,MAAL,GAAc,KAAK,CAAxC;;AAEA,UAAI,EAAE,WAAY,IAAd,CAAJ,EAAyB;AAAE,aAAK,KAAL,GAAc,KAAK,KAAL,GAAc,KAAK,IAAjC;AAAwC;AACnE,UAAI,EAAE,YAAY,IAAd,CAAJ,EAAyB;AAAE,aAAK,MAAL,GAAc,KAAK,MAAL,GAAc,KAAK,GAAjC;AAAwC;AACpE,KATD,MAUK;AACH,kBAAY,IAAZ,GAAmB,YAAY,GAAZ,GAAkB,YAAY,KAAZ,GAAoB,YAAY,MAAZ,GAAqB,CAA9E;AACD;;AAED,QAAI,IAAJ,GAAW,IAAX;AACA,QAAI,YAAJ,GAAmB,MAAnB;AACA,QAAI,OAAJ,GAAc,OAAd;;AAEA,SAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,UAAU,KAAV,CAAgB,MAApC,EAA4C,GAA5C,EAAiD;AAC/C,UAAM,eAAe,UAAU,KAAV,CAAgB,CAAhB,CAArB;;AAEA,UAAI,OAAJ,GAAc,OAAO,OAAP,CAAe,YAAY,QAAZ,CAAqB,IAApC,EAA0C,YAA1C,CAAd;;AAEA,UAAI,CAAC,IAAI,OAAT,EAAkB;AAChB;AACD;;AAED,kBAAY,eAAZ,CAA4B,YAA5B,IAA4C,UAAU,YAAV,EAAwB,SAAxB,CAAkC,GAAlC,CAA5C;AACD;AACF,GArCe;;AAuChB,UAAQ,gBAAU,GAAV,EAAe;AAAA,QACb,WADa,GACqC,GADrC,CACb,WADa;AAAA,QACA,QADA,GACqC,GADrC,CACA,QADA;AAAA,QACU,MADV,GACqC,GADrC,CACU,MADV;AAAA,QACkB,cADlB,GACqC,GADrC,CACkB,cADlB;;AAErB,QAAM,SAAS,OAAO,EAAP,EAAW,IAAI,UAAf,CAAf;AACA,QAAM,SAAS;AACb,UAAI,CADS;AAEb,UAAI,CAFS;AAGb,eAAS,KAHI;AAIb,cAAQ,KAJK;AAKb,kBAAY;AALC,KAAf;;AAQA,yBAA2B,UAAU,KAArC,kHAA4C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAAjC,YAAiC;;AAC1C,UAAM,WAAW,UAAU,YAAV,CAAjB;AACA,UAAM,UAAU,YAAY,MAAZ,CAAmB,OAAnB,CAA2B,YAAY,QAAZ,CAAqB,IAAhD,EAAsD,YAAtD,CAAhB;;AAEA,UAAI,CAAC,SAAS,OAAT,EAAkB,MAAlB,EAA0B,cAA1B,CAAL,EAAgD;AAAE;AAAW;;AAE7D,UAAI,MAAJ,GAAa,IAAI,MAAJ,GAAa,SAAS,YAAT,CAA1B;AACA,UAAI,OAAJ,GAAc,OAAd;AACA,UAAI,MAAJ,GAAa,IAAI,WAAJ,CAAgB,eAAhB,CAAgC,YAAhC,CAAb;;AAEA,eAAS,GAAT,CAAa,GAAb;;AAEA,UAAI,IAAI,MAAJ,CAAW,MAAf,EAAuB;AACrB,eAAO,CAAP,IAAY,IAAI,MAAJ,CAAW,EAAvB;AACA,eAAO,CAAP,IAAY,IAAI,MAAJ,CAAW,EAAvB;;AAEA,eAAO,EAAP,IAAa,IAAI,MAAJ,CAAW,EAAxB;AACA,eAAO,EAAP,IAAa,IAAI,MAAJ,CAAW,EAAxB;;AAEA,eAAO,MAAP,GAAgB,IAAhB;AACD;AACF;;AAED;AACA;AACA;AACA;AACA,WAAO,UAAP,GAAoB,CAAC,IAAI,MAAL,IAAe,CAAC,OAAO,MAAvB,IAAiC,IAAI,MAAJ,CAAW,OAAhE;;AAEA,WAAO,MAAP;AACD,GAhFe;;AAkFhB,iBAAe,uBAAU,QAAV,EAAoB;AACjC,0BAA2B,UAAU,KAArC,yHAA4C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAAjC,YAAiC;;AAC1C,UAAM,SAAS,SAAS,YAAT,KAA0B,EAAzC;;AAEA,aAAO,EAAP,GAAY,OAAO,EAAP,GAAY,CAAxB;AACA,aAAO,SAAP,GAAmB,OAAO,SAAP,GAAmB,GAAtC;AACA,aAAO,MAAP,GAAgB,KAAhB;AACA,aAAO,OAAP,GAAiB,IAAjB;;AAEA,eAAS,YAAT,IAAyB,MAAzB;AACD;;AAED,WAAO,QAAP;AACD,GA/Fe;;AAiGhB,SAAO,sBAA2B,UAA3B,EAAuC;AAAA,QAA3B,WAA2B,SAA3B,WAA2B;;AAC5C,QAAM,MAAM;AACV,8BADU;AAEV,kBAAY,CAAC,eAAe,eAAf,GACA,YAAY,SADZ,GACwB,YAAY,WADrC,EACkD,IAHpD;AAIV,mBAAa,YAAY,WAJf;AAKV,gBAAU,YAAY,gBALZ;AAMV,cAAQ,KANE;AAOV,sBAAgB;AAPN,KAAZ;;AAUA,cAAU,UAAV,CAAqB,GAArB;AACA,cAAU,aAAV,CAAwB,IAAI,QAA5B;;AAEA,QAAI,UAAJ,GAAiB,OAAO,EAAP,EAAW,YAAY,WAAZ,CAAwB,IAAnC,CAAjB;AACA,gBAAY,cAAZ,GAA6B,UAAU,MAAV,CAAiB,GAAjB,CAA7B;AACD;AAjHe,CAAlB;;AAoHA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,KAAvB,EAA8B,UAAU,WAAV,EAAuB;AACnD,cAAY,WAAZ,GAA+B,EAAE,MAAM,CAAR,EAAW,OAAO,CAAlB,EAAqB,KAAK,CAA1B,EAA6B,QAAQ,CAArC,EAA/B;AACA,cAAY,eAAZ,GAA+B,EAA/B;AACA,cAAY,gBAAZ,GAA+B,UAAU,aAAV,CAAwB,EAAxB,CAA/B;AACA,cAAY,cAAZ,GAA+B,IAA/B;AACD,CALD;;AAOA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,cAAvB,EAAwC,UAAU,KAAlD;AACA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,eAAvB,EAAwC,UAAU,KAAlD;;AAEA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,oBAAvB,EAA6C,iBAA0D;AAAA,MAA9C,WAA8C,SAA9C,WAA8C;AAAA,MAAjC,MAAiC,SAAjC,MAAiC;AAAA,MAAzB,qBAAyB,SAAzB,qBAAyB;;AACrG,MAAM,iBAAiB,UAAU,MAAV,CAAiB;AACtC,4BADsC;AAEtC,kBAFsC;AAGtC,gBAAY,YAAY,SAAZ,CAAsB,IAHI;AAItC,cAAU,YAAY,gBAJgB;AAKtC,oBAAgB;AALsB,GAAjB,CAAvB;;AAQA;AACA;AACA,MAAI,CAAC,eAAe,UAAhB,IAA8B,qBAAlC,EAAyD;AACvD,gBAAY,aAAZ,GAA4B,IAA5B;AACD;;AAED,cAAY,cAAZ,GAA6B,cAA7B;AACD,CAhBD;;AAkBA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,YAAvB,EAAqC,iBAAkC;AAAA,MAAtB,WAAsB,SAAtB,WAAsB;AAAA,MAAT,KAAS,SAAT,KAAS;;AACrE,OAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,UAAU,KAAV,CAAgB,MAApC,EAA4C,GAA5C,EAAiD;AAC/C,QAAM,UAAU,YAAY,MAAZ,CAAmB,OAAnB,CAA2B,YAAY,QAAZ,CAAqB,IAAhD,EAAsD,UAAU,KAAV,CAAgB,CAAhB,CAAtD,CAAhB;;AAEA;AACA,QAAI,SAAS,OAAT,EAAkB,IAAlB,EAAwB,IAAxB,CAAJ,EAAmC;AACjC;AACA,kBAAY,MAAZ,CAAmB,EAAE,YAAF,EAAS,QAAQ,IAAjB,EAAnB;AACA;AACD;AACF;AACF,CAXD;;AAaA,cAAc,OAAd,CAAsB,EAAtB,CAAyB,QAAzB,EAAmC,UAAU,GAAV,EAAe;AAAA,MACxC,MADwC,GAChB,GADgB,CACxC,MADwC;AAAA,MAChC,WADgC,GAChB,GADgB,CAChC,WADgC;;AAEhD,MAAM,cAAc,OAAO,EAAP,EAAW,GAAX,CAApB;;AAEA,OAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,UAAU,KAAV,CAAgB,MAApC,EAA4C,GAA5C,EAAiD;AAC/C,QAAM,eAAe,UAAU,KAAV,CAAgB,CAAhB,CAArB;AACA,gBAAY,OAAZ,GAAsB,YAAY,MAAZ,CAAmB,OAAnB,CAA2B,YAAY,QAAZ,CAAqB,IAAhD,EAAsD,YAAtD,CAAtB;;AAEA,QAAI,CAAC,YAAY,OAAjB,EAA0B;AACxB;AACD;;AAED,QAAM,WAAW,UAAU,YAAV,CAAjB;;AAEA,gBAAY,MAAZ,GAAqB,YAAY,gBAAZ,CAA6B,YAA7B,CAArB;;AAEA,WAAO,YAAP,IAAuB,SAAS,YAAT,CAAsB,WAAtB,CAAvB;AACD;AACF,CAlBD;;AAoBA,SAAS,QAAT,CAAmB,OAAnB,EAA4B,MAA5B,EAAoC,cAApC,EAAoD;AAClD,SAAQ,WAAW,QAAQ,OAAnB,KACI,UAAU,CAAC,QAAQ,OADvB,MAEI,CAAC,cAAD,IAAmB,QAAQ,OAF/B,CAAR;AAGD;;AAED,OAAO,OAAP,GAAiB,SAAjB;;;;;AC3LA,IAAM,YAAiB,QAAQ,SAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,UAAR,CAAvB;AACA,IAAM,iBAAiB,QAAQ,mBAAR,CAAvB;;AAEA,IAAM,WAAW;AACf,YAAU;AACR,aAAa,KADL;AAER,aAAa,KAFL;AAGR,iBAAa,IAHL;AAIR,iBAAa;AAJL,GADK;;AAQf,aAAW,yBAA0C;AAAA,QAA9B,IAA8B,QAA9B,IAA8B;AAAA,QAAxB,WAAwB,QAAxB,WAAwB;AAAA,QAAX,OAAW,QAAX,OAAW;;AACnD,QAAM,cAAc,WAAW,QAAQ,WAAvC;AACA,QAAM,SAAS,EAAf;;AAEA,QAAI,QAAQ,WAAZ,EAAyB;AACvB,aAAO,IAAP,GAAc,YAAY,IAAZ,GAAoB,KAAK,KAAL,GAAc,YAAY,IAA5D;AACA,aAAO,GAAP,GAAc,YAAY,GAAZ,GAAoB,KAAK,MAAL,GAAc,YAAY,GAA5D;;AAEA,aAAO,KAAP,GAAgB,YAAY,KAAZ,GAAsB,KAAK,KAAL,IAAe,IAAI,YAAY,KAA/B,CAAtC;AACA,aAAO,MAAP,GAAgB,YAAY,MAAZ,GAAsB,KAAK,MAAL,IAAe,IAAI,YAAY,MAA/B,CAAtC;AACD,KAND,MAOK;AACH,aAAO,IAAP,GAAc,OAAO,GAAP,GAAa,OAAO,KAAP,GAAe,OAAO,MAAP,GAAgB,CAA1D;AACD;;AAED,WAAO,MAAP;AACD,GAxBc;;AA0Bf,OAAK,oBAAwD;AAAA,QAA5C,UAA4C,SAA5C,UAA4C;AAAA,QAAhC,WAAgC,SAAhC,WAAgC;AAAA,QAAnB,MAAmB,SAAnB,MAAmB;AAAA,QAAX,OAAW,SAAX,OAAW;;AAC3D,QAAI,CAAC,OAAL,EAAc;AAAE,aAAO,MAAP;AAAgB;;AAEhC,QAAM,OAAO,OAAO,WAAP,GACT,EAAE,GAAG,OAAO,CAAZ,EAAe,GAAG,OAAO,CAAzB,EADS,GAET,MAAM,MAAN,CAAa,EAAb,EAAiB,UAAjB,CAFJ;;AAIA,QAAM,cAAc,mBAAmB,QAAQ,WAA3B,EAAwC,WAAxC,EAAqD,IAArD,CAApB;;AAEA,QAAI,CAAC,WAAL,EAAkB;AAAE,aAAO,MAAP;AAAgB;;AAEpC,WAAO,EAAP,GAAY,CAAZ;AACA,WAAO,EAAP,GAAY,CAAZ;AACA,WAAO,MAAP,GAAgB,KAAhB;;AAEA,QAAM,OAAO,WAAb;AACA,QAAI,YAAY,KAAK,CAArB;AACA,QAAI,YAAY,KAAK,CAArB;;AAEA,QAAM,SAAS,YAAY,eAAZ,CAA4B,QAA3C;;AAEA;AACA;AACA;AACA,QAAI,OAAO,WAAP,IAAsB,OAAO,WAAjC,EAA8C;AAC5C,kBAAY,KAAK,GAAL,CAAS,KAAK,GAAL,CAAS,KAAK,CAAL,GAAS,KAAK,KAAd,GAAuB,OAAO,KAAvC,EAA+C,KAAK,CAApD,CAAT,EAAiE,KAAK,CAAL,GAAS,OAAO,IAAjF,CAAZ;AACA,kBAAY,KAAK,GAAL,CAAS,KAAK,GAAL,CAAS,KAAK,CAAL,GAAS,KAAK,MAAd,GAAuB,OAAO,MAAvC,EAA+C,KAAK,CAApD,CAAT,EAAiE,KAAK,CAAL,GAAS,OAAO,GAAjF,CAAZ;AACD,KAHD,MAIK;AACH,kBAAY,KAAK,GAAL,CAAS,KAAK,GAAL,CAAS,KAAK,KAAL,GAAc,OAAO,KAA9B,EAAsC,KAAK,CAA3C,CAAT,EAAwD,KAAK,IAAL,GAAY,OAAO,IAA3E,CAAZ;AACA,kBAAY,KAAK,GAAL,CAAS,KAAK,GAAL,CAAS,KAAK,MAAL,GAAc,OAAO,MAA9B,EAAsC,KAAK,CAA3C,CAAT,EAAwD,KAAK,GAAL,GAAY,OAAO,GAA3E,CAAZ;AACD;;AAED,WAAO,EAAP,GAAY,YAAY,KAAK,CAA7B;AACA,WAAO,EAAP,GAAY,YAAY,KAAK,CAA7B;;AAEA,WAAO,OAAP,GAAiB,OAAO,SAAP,KAAqB,SAArB,IAAkC,OAAO,SAAP,KAAqB,SAAxE;AACA,WAAO,MAAP,GAAgB,CAAC,EAAE,OAAO,EAAP,IAAa,OAAO,EAAtB,CAAjB;;AAEA,WAAO,SAAP,GAAmB,SAAnB;AACA,WAAO,SAAP,GAAmB,SAAnB;AACD,GAnEc;;AAqEf,gBAAc,6BAAoD;AAAA,QAAxC,IAAwC,SAAxC,IAAwC;AAAA,QAAlC,MAAkC,SAAlC,MAAkC;AAAA,QAA1B,MAA0B,SAA1B,MAA0B;AAAA,QAAlB,KAAkB,SAAlB,KAAkB;AAAA,QAAX,OAAW,SAAX,OAAW;;AAChE,QAAM,cAAc,WAAW,QAAQ,WAAvC;;AAEA,QAAI,WAAW,QAAQ,OAAnB,IACG,EAAE,UAAU,OAAV,IAAqB,WAArB,IAAoC,OAAO,MAA7C,CADP,EAC6D;;AAE3D,UAAI,OAAO,MAAX,EAAmB;AACjB,aAAK,CAAL,IAAU,OAAO,EAAjB;AACA,aAAK,CAAL,IAAU,OAAO,EAAjB;AACA,eAAO,CAAP,IAAY,OAAO,EAAnB;AACA,eAAO,CAAP,IAAY,OAAO,EAAnB;;AAEA,eAAO;AACL,cAAI,OAAO,EADN;AAEL,cAAI,OAAO;AAFN,SAAP;AAID;AACF;AACF,GAvFc;;AAyFf;AAzFe,CAAjB;;AA4FA,SAAS,kBAAT,CAA6B,KAA7B,EAAoC,WAApC,EAAiD,IAAjD,EAAuD;AACrD,MAAI,MAAM,EAAN,CAAS,QAAT,CAAkB,KAAlB,CAAJ,EAA8B;AAC5B,WAAO,MAAM,eAAN,CAAsB,KAAtB,EAA6B,YAAY,MAAzC,EAAiD,YAAY,OAA7D,EAAsE,CAAC,KAAK,CAAN,EAAS,KAAK,CAAd,EAAiB,WAAjB,CAAtE,CAAP;AACD,GAFD,MAEO;AACL,WAAO,MAAM,eAAN,CAAsB,KAAtB,EAA6B,YAAY,MAAzC,EAAiD,YAAY,OAA7D,CAAP;AACD;AACF;;AAED,UAAU,QAAV,GAAqB,QAArB;AACA,UAAU,KAAV,CAAgB,IAAhB,CAAqB,UAArB;;AAEA,eAAe,SAAf,CAAyB,QAAzB,GAAoC,SAAS,QAA7C;;AAEA,OAAO,OAAP,GAAiB,QAAjB;;;;;AC7GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,IAAM,YAAiB,QAAQ,SAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,UAAR,CAAvB;AACA,IAAM,YAAiB,QAAQ,eAAR,CAAvB;AACA,IAAM,iBAAiB,QAAQ,mBAAR,CAAvB;AACA,IAAM,SAAiB,QAAQ,mBAAR,CAAvB;;eAE+B,QAAQ,YAAR,C;IAAvB,kB,YAAA,kB;;AAER,IAAM,UAAU,EAAE,KAAK,CAAC,QAAR,EAAkB,MAAM,CAAC,QAAzB,EAAmC,QAAQ,CAAC,QAA5C,EAAsD,OAAO,CAAC,QAA9D,EAAhB;AACA,IAAM,UAAU,EAAE,KAAK,CAAC,QAAR,EAAkB,MAAM,CAAC,QAAzB,EAAmC,QAAQ,CAAC,QAA5C,EAAsD,OAAO,CAAC,QAA9D,EAAhB;;AAEA,IAAM,gBAAgB;AACpB,YAAU;AACR,aAAS,KADD;AAER,aAAS,KAFD;AAGR,SAAK,IAHG;AAIR,SAAK,IAJG;AAKR,YAAQ;AALA,GADU;;AASpB,aAAW,yBAAiD;AAAA,QAArC,WAAqC,QAArC,WAAqC;AAAA,QAAxB,WAAwB,QAAxB,WAAwB;AAAA,QAAX,OAAW,QAAX,OAAW;;AAC1D,QAAI,CAAC,OAAL,EAAc;AACZ,aAAO,MAAM,MAAN,CAAa,EAAb,EAAiB,WAAjB,CAAP;AACD;;AAED,QAAM,SAAS,mBAAmB,QAAQ,MAA3B,EAAmC,WAAnC,EAAgD,YAAY,WAAZ,CAAwB,IAAxE,CAAf;;AAEA,QAAI,MAAJ,EAAY;AACV,aAAO;AACL,aAAQ,YAAY,GAAZ,GAAqB,OAAO,CAD/B;AAEL,cAAQ,YAAY,IAAZ,GAAqB,OAAO,CAF/B;AAGL,gBAAQ,YAAY,MAAZ,GAAqB,OAAO,CAH/B;AAIL,eAAQ,YAAY,KAAZ,GAAqB,OAAO;AAJ/B,OAAP;AAMD;;AAED,WAAO,WAAP;AACD,GA1BmB;;AA4BpB,OAAK,oBAAgE;AAAA,QAApD,UAAoD,SAApD,UAAoD;AAAA,QAAxC,WAAwC,SAAxC,WAAwC;AAAA,QAA3B,MAA2B,SAA3B,MAA2B;AAAA,QAAnB,MAAmB,SAAnB,MAAmB;AAAA,QAAX,OAAW,SAAX,OAAW;;AACnE,QAAM,QAAQ,YAAY,QAAZ,CAAqB,WAArB,IAAoC,YAAY,QAAZ,CAAqB,KAAvE;;AAEA,QAAI,CAAC,YAAY,WAAZ,EAAD,IAA8B,CAAC,KAAnC,EAA0C;AACxC;AACD;;AAED,QAAM,OAAO,OAAO,WAAP,GACT,EAAE,GAAG,OAAO,CAAZ,EAAe,GAAG,OAAO,CAAzB,EADS,GAET,MAAM,MAAN,CAAa,EAAb,EAAiB,UAAjB,CAFJ;AAGA,QAAM,QAAQ,UAAU,UAAV,CAAqB,mBAAmB,QAAQ,KAA3B,EAAkC,WAAlC,EAA+C,IAA/C,CAArB,KAA8E,OAA5F;AACA,QAAM,QAAQ,UAAU,UAAV,CAAqB,mBAAmB,QAAQ,KAA3B,EAAkC,WAAlC,EAA+C,IAA/C,CAArB,KAA8E,OAA5F;;AAEA,QAAI,YAAY,KAAK,CAArB;AACA,QAAI,YAAY,KAAK,CAArB;;AAEA,WAAO,EAAP,GAAY,CAAZ;AACA,WAAO,EAAP,GAAY,CAAZ;AACA,WAAO,MAAP,GAAgB,KAAhB;;AAEA,QAAI,MAAM,GAAV,EAAe;AACb,kBAAY,KAAK,GAAL,CAAS,KAAK,GAAL,CAAS,MAAM,GAAN,GAAe,OAAO,GAA/B,EAAuC,KAAK,CAA5C,CAAT,EAAyD,MAAM,GAAN,GAAe,OAAO,GAA/E,CAAZ;AACD,KAFD,MAGK,IAAI,MAAM,MAAV,EAAkB;AACrB,kBAAY,KAAK,GAAL,CAAS,KAAK,GAAL,CAAS,MAAM,MAAN,GAAe,OAAO,MAA/B,EAAuC,KAAK,CAA5C,CAAT,EAAyD,MAAM,MAAN,GAAe,OAAO,MAA/E,CAAZ;AACD;AACD,QAAI,MAAM,IAAV,EAAgB;AACd,kBAAY,KAAK,GAAL,CAAS,KAAK,GAAL,CAAS,MAAM,IAAN,GAAe,OAAO,IAA/B,EAAuC,KAAK,CAA5C,CAAT,EAAyD,MAAM,IAAN,GAAe,OAAO,IAA/E,CAAZ;AACD,KAFD,MAGK,IAAI,MAAM,KAAV,EAAiB;AACpB,kBAAY,KAAK,GAAL,CAAS,KAAK,GAAL,CAAS,MAAM,KAAN,GAAe,OAAO,KAA/B,EAAuC,KAAK,CAA5C,CAAT,EAAyD,MAAM,KAAN,GAAe,OAAO,KAA/E,CAAZ;AACD;;AAED,WAAO,EAAP,GAAY,YAAY,KAAK,CAA7B;AACA,WAAO,EAAP,GAAY,YAAY,KAAK,CAA7B;;AAEA,WAAO,OAAP,GAAiB,OAAO,SAAP,KAAqB,SAArB,IAAkC,OAAO,SAAP,KAAqB,SAAxE;AACA,WAAO,MAAP,GAAgB,CAAC,EAAE,OAAO,EAAP,IAAa,OAAO,EAAtB,CAAjB;;AAEA,WAAO,SAAP,GAAmB,SAAnB;AACA,WAAO,SAAP,GAAmB,SAAnB;AACD,GArEmB;;AAuEpB,gBAAc,6BAAoD;AAAA,QAAxC,IAAwC,SAAxC,IAAwC;AAAA,QAAlC,MAAkC,SAAlC,MAAkC;AAAA,QAA1B,MAA0B,SAA1B,MAA0B;AAAA,QAAlB,KAAkB,SAAlB,KAAkB;AAAA,QAAX,OAAW,SAAX,OAAW;;AAChE,QAAI,WAAW,QAAQ,OAAnB,IACG,EAAE,UAAU,OAAV,IAAqB,OAAO,MAA9B,CADP,EAC8C;;AAE5C,UAAI,OAAO,MAAX,EAAmB;AACjB,aAAK,CAAL,IAAU,OAAO,EAAjB;AACA,aAAK,CAAL,IAAU,OAAO,EAAjB;AACA,eAAO,CAAP,IAAY,OAAO,EAAnB;AACA,eAAO,CAAP,IAAY,OAAO,EAAnB;;AAEA,eAAO;AACL,cAAI,OAAO,EADN;AAEL,cAAI,OAAO;AAFN,SAAP;AAID;AACF;AACF,GAvFmB;;AAyFpB,kBAzFoB;AA0FpB,kBA1FoB;AA2FpB;AA3FoB,CAAtB;;AA8FA,UAAU,aAAV,GAA0B,aAA1B;AACA,UAAU,KAAV,CAAgB,IAAhB,CAAqB,eAArB;;AAEA,eAAe,SAAf,CAAyB,aAAzB,GAAyC,cAAc,QAAvD;AACA,OAAO,QAAP,CAAgB,aAAhB,GAAyC,cAAc,QAAvD;;AAEA,OAAO,OAAP,GAAiB,aAAjB;;;;;AC1HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,IAAM,YAAiB,QAAQ,SAAR,CAAvB;AACA,IAAM,gBAAiB,QAAQ,iBAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,UAAR,CAAvB;AACA,IAAM,YAAiB,QAAQ,eAAR,CAAvB;AACA,IAAM,iBAAiB,QAAQ,mBAAR,CAAvB;AACA,IAAM,SAAiB,QAAQ,mBAAR,CAAvB;;AAEA,IAAM,QAAQ,EAAE,OAAO,CAAC,QAAV,EAAoB,QAAQ,CAAC,QAA7B,EAAd;AACA,IAAM,QAAQ,EAAE,OAAO,CAAC,QAAV,EAAoB,QAAQ,CAAC,QAA7B,EAAd;;AAEA,IAAM,eAAe;AACnB,YAAU;AACR,aAAS,KADD;AAER,aAAS,KAFD;AAGR,SAAK,IAHG;AAIR,SAAK;AAJG,GADS;;AAQnB,aAAW,yBAA2B;AAAA,QAAf,WAAe,QAAf,WAAe;;AACpC,WAAO,YAAY,WAAnB;AACD,GAVkB;;AAYnB,OAAK,aAAU,GAAV,EAAe;AAAA,QACV,WADU,GACe,GADf,CACV,WADU;AAAA,QACG,OADH,GACe,GADf,CACG,OADH;;AAElB,QAAM,QAAQ,YAAY,QAAZ,CAAqB,WAArB,IAAoC,YAAY,QAAZ,CAAqB,KAAvE;;AAEA,QAAI,CAAC,YAAY,WAAZ,EAAD,IAA8B,CAAC,KAAnC,EAA0C;AACxC;AACD;;AAED,QAAM,OAAO,UAAU,UAAV,CAAqB,YAAY,WAAZ,CAAwB,QAA7C,CAAb;;AAEA,QAAM,UAAU,UAAU,UAAV,CAAqB,cAAc,kBAAd,CAAiC,QAAQ,GAAzC,EAA8C,WAA9C,CAArB,KAAoF,KAApG;AACA,QAAM,UAAU,UAAU,UAAV,CAAqB,cAAc,kBAAd,CAAiC,QAAQ,GAAzC,EAA8C,WAA9C,CAArB,KAAoF,KAApG;;AAEA,QAAI,OAAJ,GAAc;AACZ,eAAS,QAAQ,OADL;AAEZ,eAAS,QAAQ,OAFL;AAGZ,aAAO,MAAM,MAAN,CAAa,EAAb,EAAiB,cAAc,OAA/B,CAHK;AAIZ,aAAO,MAAM,MAAN,CAAa,EAAb,EAAiB,cAAc,OAA/B;AAJK,KAAd;;AAOA,QAAI,MAAM,GAAV,EAAe;AACb,UAAI,OAAJ,CAAY,KAAZ,CAAkB,GAAlB,GAAwB,KAAK,MAAL,GAAc,QAAQ,MAA9C;AACA,UAAI,OAAJ,CAAY,KAAZ,CAAkB,GAAlB,GAAwB,KAAK,MAAL,GAAc,QAAQ,MAA9C;AACD,KAHD,MAIK,IAAI,MAAM,MAAV,EAAkB;AACrB,UAAI,OAAJ,CAAY,KAAZ,CAAkB,MAAlB,GAA2B,KAAK,GAAL,GAAW,QAAQ,MAA9C;AACA,UAAI,OAAJ,CAAY,KAAZ,CAAkB,MAAlB,GAA2B,KAAK,GAAL,GAAW,QAAQ,MAA9C;AACD;AACD,QAAI,MAAM,IAAV,EAAgB;AACd,UAAI,OAAJ,CAAY,KAAZ,CAAkB,IAAlB,GAAyB,KAAK,KAAL,GAAa,QAAQ,KAA9C;AACA,UAAI,OAAJ,CAAY,KAAZ,CAAkB,IAAlB,GAAyB,KAAK,KAAL,GAAa,QAAQ,KAA9C;AACD,KAHD,MAIK,IAAI,MAAM,KAAV,EAAiB;AACpB,UAAI,OAAJ,CAAY,KAAZ,CAAkB,KAAlB,GAA0B,KAAK,IAAL,GAAY,QAAQ,KAA9C;AACA,UAAI,OAAJ,CAAY,KAAZ,CAAkB,KAAlB,GAA0B,KAAK,IAAL,GAAY,QAAQ,KAA9C;AACD;;AAED,kBAAc,GAAd,CAAkB,GAAlB;AACD,GAlDkB;;AAoDnB,gBAAc,cAAc;AApDT,CAArB;;AAuDA,UAAU,YAAV,GAAyB,YAAzB;AACA,UAAU,KAAV,CAAgB,IAAhB,CAAqB,cAArB;;AAEA,eAAe,SAAf,CAAyB,YAAzB,GAAwC,aAAa,QAArD;AACA,OAAO,QAAP,CAAgB,YAAhB,GAAwC,aAAa,QAArD;;AAEA,OAAO,OAAP,GAAiB,YAAjB;;;;;AClFA,IAAM,YAAiB,QAAQ,SAAR,CAAvB;AACA,IAAM,WAAiB,QAAQ,aAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,UAAR,CAAvB;AACA,IAAM,iBAAiB,QAAQ,mBAAR,CAAvB;;AAEA,IAAM,OAAO;AACX,YAAU;AACR,aAAS,KADD;AAER,aAAS,KAFD;AAGR,WAAS,QAHD;AAIR,aAAS,IAJD;AAKR,aAAS,IALD;;AAOR,oBAAgB;AAPR,GADC;;AAWX,aAAW,yBAA8E;AAAA,QAAlE,WAAkE,QAAlE,WAAkE;AAAA,QAArD,YAAqD,QAArD,YAAqD;AAAA,QAAvC,OAAuC,QAAvC,OAAuC;AAAA,QAA9B,IAA8B,QAA9B,IAA8B;AAAA,QAAxB,WAAwB,QAAxB,WAAwB;AAAA,QAAX,OAAW,QAAX,OAAW;;AACvF,QAAM,UAAU,EAAhB;AACA,QAAM,gBAAgB,MAAM,QAAN,CAAe,MAAM,eAAN,CAAsB,QAAQ,MAA9B,CAAf,CAAtB;AACA,QAAM,SAAS,iBAAiB,MAAM,WAAN,CAAkB,YAAlB,EAAgC,OAAhC,EAAyC,YAAY,QAAZ,CAAqB,IAA9D,CAAhC;AACA,cAAU,WAAW,aAAa,OAAb,CAAqB,YAAY,QAAZ,CAAqB,IAA1C,EAAgD,IAA3D,IAAmE,EAA7E;;AAEA,QAAI,mBAAJ;;AAEA,QAAI,QAAQ,MAAR,KAAmB,aAAvB,EAAsC;AACpC,mBAAa;AACX,WAAG,YAAY,WAAZ,CAAwB,IAAxB,CAA6B,CAA7B,GAAiC,OAAO,CADhC;AAEX,WAAG,YAAY,WAAZ,CAAwB,IAAxB,CAA6B,CAA7B,GAAiC,OAAO;AAFhC,OAAb;AAID,KALD,MAMM;AACJ,UAAM,aAAa,MAAM,eAAN,CAAsB,QAAQ,MAA9B,EAAsC,YAAtC,EAAoD,OAApD,EAA6D,CAAC,WAAD,CAA7D,CAAnB;;AAEA,mBAAa,MAAM,QAAN,CAAe,UAAf,KAA8B,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EAA3C;AACD;;AAED,QAAI,QAAQ,QAAQ,cAAhB,IAAkC,QAAQ,cAAR,CAAuB,MAA7D,EAAqE;AACnE,2BAA6C,QAAQ,cAArD,kHAAqE;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,YAArD,SAAqD,SAAxD,CAAwD;AAAA,YAAvC,SAAuC,SAA1C,CAA0C;;AACnE,gBAAQ,IAAR,CAAa;AACX,aAAG,YAAY,IAAZ,GAAoB,KAAK,KAAL,GAAc,SAAlC,GAA+C,WAAW,CADlD;AAEX,aAAG,YAAY,GAAZ,GAAoB,KAAK,MAAL,GAAc,SAAlC,GAA+C,WAAW;AAFlD,SAAb;AAID;AACF,KAPD,MAQK;AACH,cAAQ,IAAR,CAAa,UAAb;AACD;;AAED,WAAO,OAAP;AACD,GA5CU;;AA8CX,OAAK,oBAAyE;AAAA,QAA7D,WAA6D,SAA7D,WAA6D;AAAA,QAAhD,UAAgD,SAAhD,UAAgD;AAAA,QAApC,MAAoC,SAApC,MAAoC;AAAA,QAA5B,OAA4B,SAA5B,OAA4B;AAAA,QAAX,OAAW,SAAnB,MAAmB;;AAC5E,QAAM,UAAU,EAAhB;AACA,QAAI,eAAJ;AACA,QAAI,aAAJ;AACA,QAAI,UAAJ;;AAEA,QAAI,OAAO,WAAX,EAAwB;AACtB,aAAO,EAAE,GAAG,OAAO,CAAZ,EAAe,GAAG,OAAO,CAAzB,EAAP;AACD,KAFD,MAGK;AACH,UAAM,SAAS,MAAM,WAAN,CAAkB,YAAY,MAA9B,EAAsC,YAAY,OAAlD,EAA2D,YAAY,QAAZ,CAAqB,IAAhF,CAAf;;AAEA,aAAO,MAAM,MAAN,CAAa,EAAb,EAAiB,UAAjB,CAAP;;AAEA,WAAK,CAAL,IAAU,OAAO,CAAjB;AACA,WAAK,CAAL,IAAU,OAAO,CAAjB;AACD;;AAED,WAAO,KAAP,GAAe,KAAK,CAApB;AACA,WAAO,KAAP,GAAe,KAAK,CAApB;;AAEA,QAAI,MAAM,QAAQ,OAAR,GAAiB,QAAQ,OAAR,CAAgB,MAAjC,GAA0C,CAApD;;AAEA,0BAAyC,OAAzC,yHAAkD;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,UAAlC,OAAkC,SAArC,CAAqC;AAAA,UAAtB,OAAsB,SAAzB,CAAyB;;AAChD,UAAM,YAAY,KAAK,CAAL,GAAS,OAA3B;AACA,UAAM,YAAY,KAAK,CAAL,GAAS,OAA3B;;AAEA,4BAAyB,QAAQ,OAAjC,yHAA0C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,YAA/B,UAA+B;;AACxC,YAAI,MAAM,EAAN,CAAS,QAAT,CAAkB,UAAlB,CAAJ,EAAmC;AACjC,mBAAS,WAAW,SAAX,EAAsB,SAAtB,EAAiC,WAAjC,CAAT;AACD,SAFD,MAGK;AACH,mBAAS,UAAT;AACD;;AAED,YAAI,CAAC,MAAL,EAAa;AAAE;AAAW;;AAE1B,gBAAQ,IAAR,CAAa;AACX,aAAG,MAAM,EAAN,CAAS,MAAT,CAAgB,OAAO,CAAvB,IAA6B,OAAO,CAAP,GAAW,OAAxC,GAAmD,SAD3C;AAEX,aAAG,MAAM,EAAN,CAAS,MAAT,CAAgB,OAAO,CAAvB,IAA6B,OAAO,CAAP,GAAW,OAAxC,GAAmD,SAF3C;;AAIX,iBAAO,MAAM,EAAN,CAAS,MAAT,CAAgB,OAAO,KAAvB,IAA+B,OAAO,KAAtC,GAA6C,QAAQ;AAJjD,SAAb;AAMD;AACF;;AAED,QAAM,UAAU;AACd,cAAQ,IADM;AAEd,eAAS,KAFK;AAGd,gBAAU,CAHI;AAId,aAAO,CAJO;AAKd,UAAI,CALU;AAMd,UAAI;AANU,KAAhB;;AASA,SAAK,IAAI,CAAJ,EAAO,MAAM,QAAQ,MAA1B,EAAkC,IAAI,GAAtC,EAA2C,GAA3C,EAAgD;AAC9C,eAAS,QAAQ,CAAR,CAAT;;AAEA,UAAM,QAAQ,OAAO,KAArB;AACA,UAAM,KAAK,OAAO,CAAP,GAAW,KAAK,CAA3B;AACA,UAAM,KAAK,OAAO,CAAP,GAAW,KAAK,CAA3B;AACA,UAAM,WAAW,MAAM,KAAN,CAAY,EAAZ,EAAgB,EAAhB,CAAjB;AACA,UAAI,UAAU,YAAY,KAA1B;;AAEA;AACA;AACA,UAAI,UAAU,QAAV,IAAsB,QAAQ,OAA9B,IAAyC,QAAQ,KAAR,KAAkB,QAA/D,EAAyE;AACvE,kBAAU,KAAV;AACD;;AAED,UAAI,CAAC,QAAQ,MAAT,KAAoB;AACpB;AADoB,QAEjB,QAAQ,OAAR,IAAmB,UAAU;AAChC;AADG,QAED,WAAW,KAAX,GAAmB,QAAQ,QAAR,GAAmB,QAAQ;AAChD;AAHG,QAIA,UAAU,QAAV,IAAsB,QAAQ,KAAR,KAAkB,QAAzC;AACF;AACC,iBAAW,QAAQ,QARA;AASpB;AACG,OAAC,QAAQ,OAAT,IAAoB,WAAW,QAAQ,QAV1C,CAAJ,EAU0D;;AAExD,gBAAQ,MAAR,GAAiB,MAAjB;AACA,gBAAQ,QAAR,GAAmB,QAAnB;AACA,gBAAQ,KAAR,GAAgB,KAAhB;AACA,gBAAQ,OAAR,GAAkB,OAAlB;AACA,gBAAQ,EAAR,GAAa,EAAb;AACA,gBAAQ,EAAR,GAAa,EAAb;;AAEA,eAAO,KAAP,GAAe,KAAf;AACD;AACF;;AAED,QAAI,oBAAJ;;AAEA,QAAI,QAAQ,MAAZ,EAAoB;AAClB,oBAAe,OAAO,SAAP,KAAqB,QAAQ,MAAR,CAAe,CAApC,IAAyC,OAAO,SAAP,KAAqB,QAAQ,MAAR,CAAe,CAA5F;;AAEA,aAAO,SAAP,GAAmB,QAAQ,MAAR,CAAe,CAAlC;AACA,aAAO,SAAP,GAAmB,QAAQ,MAAR,CAAe,CAAlC;AACD,KALD,MAMK;AACH,oBAAc,IAAd;;AAEA,aAAO,SAAP,GAAmB,GAAnB;AACA,aAAO,SAAP,GAAmB,GAAnB;AACD;;AAED,WAAO,EAAP,GAAY,QAAQ,EAApB;AACA,WAAO,EAAP,GAAY,QAAQ,EAApB;;AAEA,WAAO,OAAP,GAAkB,eAAgB,QAAQ,OAAR,IAAmB,CAAC,OAAO,MAA7D;AACA,WAAO,MAAP,GAAgB,QAAQ,OAAxB;AACD,GA/JU;;AAiKX,gBAAc,6BAAoD;AAAA,QAAxC,IAAwC,SAAxC,IAAwC;AAAA,QAAlC,MAAkC,SAAlC,MAAkC;AAAA,QAA1B,MAA0B,SAA1B,MAA0B;AAAA,QAAlB,KAAkB,SAAlB,KAAkB;AAAA,QAAX,OAAW,SAAX,OAAW;;AAChE,QAAM,iBAAiB,WAAW,QAAQ,cAA1C;;AAEA,QAAI,WAAW,QAAQ,OAAnB,IACG,EAAE,UAAU,OAAV,IAAqB,cAArB,IAAuC,eAAe,MAAxD,CADP,EACwE;;AAEtE,UAAI,OAAO,MAAX,EAAmB;AACjB,aAAK,CAAL,IAAU,OAAO,EAAjB;AACA,aAAK,CAAL,IAAU,OAAO,EAAjB;AACA,eAAO,CAAP,IAAY,OAAO,EAAnB;AACA,eAAO,CAAP,IAAY,OAAO,EAAnB;AACD;;AAED,aAAO;AACL,eAAS,OAAO,KADX;AAEL,gBAAS,OAAO,MAFX;AAGL,WAAS,OAAO,SAHX;AAIL,WAAS,OAAO,SAJX;AAKL,eAAS,OAAO,KALX;AAML,eAAS,OAAO,KANX;AAOL,YAAS,OAAO,EAPX;AAQL,YAAS,OAAO;AARX,OAAP;AAUD;AACF;AAzLU,CAAb;;AA4LA,SAAS,cAAT,GAA0B,UAAU,IAAV,EAAgB;AACxC,SAAO,UAAU,CAAV,EAAa,CAAb,EAAgB;AACrB,QAAM,SAAS,KAAK,MAAL,IAAe;AAC5B,YAAQ,CAAC,QADmB;AAE5B,aAAS,QAFmB;AAG5B,WAAQ,CAAC,QAHmB;AAI5B,cAAS;AAJmB,KAA9B;AAMA,QAAI,UAAU,CAAd;AACA,QAAI,UAAU,CAAd;;AAEA,QAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,KAAK,MAArB,CAAJ,EAAkC;AAChC,gBAAU,KAAK,MAAL,CAAY,CAAtB;AACA,gBAAU,KAAK,MAAL,CAAY,CAAtB;AACD;;AAED,QAAM,QAAQ,KAAK,KAAL,CAAW,CAAC,IAAI,OAAL,IAAgB,KAAK,CAAhC,CAAd;AACA,QAAM,QAAQ,KAAK,KAAL,CAAW,CAAC,IAAI,OAAL,IAAgB,KAAK,CAAhC,CAAd;;AAEA,QAAM,OAAO,KAAK,GAAL,CAAS,OAAO,IAAhB,EAAsB,KAAK,GAAL,CAAS,OAAO,KAAhB,EAAwB,QAAQ,KAAK,CAAb,GAAiB,OAAzC,CAAtB,CAAb;AACA,QAAM,OAAO,KAAK,GAAL,CAAS,OAAO,GAAhB,EAAsB,KAAK,GAAL,CAAS,OAAO,MAAhB,EAAwB,QAAQ,KAAK,CAAb,GAAiB,OAAzC,CAAtB,CAAb;;AAEA,WAAO;AACL,SAAG,IADE;AAEL,SAAG,IAFE;AAGL,aAAO,KAAK;AAHP,KAAP;AAKD,GA1BD;AA2BD,CA5BD;;AA8BA,UAAU,IAAV,GAAiB,IAAjB;AACA,UAAU,KAAV,CAAgB,IAAhB,CAAqB,MAArB;;AAEA,eAAe,SAAf,CAAyB,IAAzB,GAAgC,KAAK,QAArC;;AAEA,OAAO,OAAP,GAAiB,IAAjB;;;;;ACpOA;AACA;;AAEA,IAAM,YAAiB,QAAQ,SAAR,CAAvB;AACA,IAAM,OAAiB,QAAQ,QAAR,CAAvB;AACA,IAAM,iBAAiB,QAAQ,mBAAR,CAAvB;AACA,IAAM,SAAiB,QAAQ,mBAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,WAAR,CAAvB;;AAEA,IAAM,WAAW;AACf,YAAU;AACR,aAAS,KADD;AAER,aAAS,KAFD;AAGR,WAAS,QAHD;AAIR,aAAS,IAJD;AAKR,aAAS;AALD,GADK;;AASf,aAAW,mBAAU,GAAV,EAAe;AAAA,QAChB,WADgB,GACS,GADT,CAChB,WADgB;AAAA,QACH,OADG,GACS,GADT,CACH,OADG;;AAExB,QAAM,QAAQ,YAAY,QAAZ,CAAqB,KAAnC;;AAEA,QAAI,CAAC,KAAL,EAAY;AAAE;AAAS;;AAEvB,QAAI,OAAJ,GAAc;AACZ,sBAAgB,CAAC;AACf,WAAG,MAAM,IAAN,GAAY,CAAZ,GAAgB,CADJ;AAEf,WAAG,MAAM,GAAN,GAAY,CAAZ,GAAgB;AAFJ,OAAD,CADJ;AAKZ,cAAQ,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EALI;AAMZ,cAAQ,MANI;AAOZ,aAAO,QAAQ;AAPH,KAAd;;AAUA,QAAM,UAAU,KAAK,SAAL,CAAe,GAAf,CAAhB;AACA,QAAI,OAAJ,GAAc,OAAd;;AAEA,WAAO,OAAP;AACD,GA7Bc;;AA+Bf,OAAK,aAAU,GAAV,EAAe;AAAA,QACV,WADU,GACmC,GADnC,CACV,WADU;AAAA,QACG,OADH,GACmC,GADnC,CACG,OADH;AAAA,QACY,MADZ,GACmC,GADnC,CACY,MADZ;AAAA,QACoB,UADpB,GACmC,GADnC,CACoB,UADpB;;AAElB,QAAM,OAAO,MAAM,MAAN,CAAa,EAAb,EAAiB,UAAjB,CAAb;AACA,QAAM,YAAY,KAAK,CAAL,GAAS,OAAO,CAAP,EAAU,CAArC;AACA,QAAM,YAAY,KAAK,CAAL,GAAS,OAAO,CAAP,EAAU,CAArC;;AAEA,QAAI,OAAJ,GAAc,MAAM,MAAN,CAAa,EAAb,EAAiB,OAAjB,CAAd;AACA,QAAI,OAAJ,CAAY,OAAZ,GAAsB,EAAtB;;AAEA,yBAAyB,QAAQ,OAAjC,kHAA0C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAA/B,UAA+B;;AACxC,UAAI,eAAJ;;AAEA,UAAI,MAAM,EAAN,CAAS,QAAT,CAAkB,UAAlB,CAAJ,EAAmC;AACjC,iBAAS,WAAW,SAAX,EAAsB,SAAtB,EAAiC,WAAjC,CAAT;AACD,OAFD,MAGK;AACH,iBAAS,UAAT;AACD;;AAED,UAAI,CAAC,MAAL,EAAa;AAAE;AAAW;;AAE1B,UAAI,WAAW,MAAX,IAAqB,YAAY,MAArC,EAA6C;AAC3C,eAAO,CAAP,GAAW,OAAO,KAAlB;AACA,eAAO,CAAP,GAAW,OAAO,MAAlB;AACD;;AAED,UAAI,OAAJ,CAAY,OAAZ,CAAoB,IAApB,CAAyB,MAAzB;AACD;;AAED,SAAK,GAAL,CAAS,GAAT;AACD,GA7Dc;;AA+Df,gBAAc,sBAAU,GAAV,EAAe;AAAA,QACnB,OADmB,GACP,GADO,CACnB,OADmB;;;AAG3B,QAAI,OAAJ,GAAc,MAAM,MAAN,CAAa,EAAb,EAAiB,OAAjB,CAAd;AACA,QAAI,OAAJ,CAAY,OAAZ,GAAsB,QAAQ,OAA9B;AACA,QAAI,OAAJ,CAAY,cAAZ,GAA6B,CAAC,IAAD,CAA7B;;AAEA,SAAK,YAAL,CAAkB,GAAlB;AACD;AAvEc,CAAjB;;AA0EA,UAAU,QAAV,GAAqB,QAArB;AACA,UAAU,KAAV,CAAgB,IAAhB,CAAqB,UAArB;;AAEA,eAAe,SAAf,CAAyB,QAAzB,GAAoC,SAAS,QAA7C;AACA,OAAO,QAAP,CAAgB,QAAhB,GAAoC,SAAS,QAA7C;;AAEA,OAAO,OAAP,GAAiB,QAAjB;;;;;;;ACzFA,IAAM,eAAe,QAAQ,uBAAR,CAArB;;AAEA,OAAO,OAAP;AACE,wBAAa,IAAb,EAAmB,OAAnB,EAA4B,KAA5B,EAAmC,WAAnC,EAAgD,WAAhD,EAA6D;AAAA;;AAC3D,iBAAa,aAAb,CAA2B,IAA3B,EAAiC,KAAjC;;AAEA,QAAI,UAAU,OAAd,EAAuB;AACrB,mBAAa,aAAb,CAA2B,IAA3B,EAAiC,OAAjC;AACD;;AAED,SAAK,WAAL,GAAmB,WAAnB;;AAEA,SAAK,SAAL,GAAqB,IAAI,IAAJ,GAAW,OAAX,EAArB;AACA,SAAK,aAAL,GAAqB,KAArB;AACA,SAAK,IAAL,GAAqB,IAArB;AACA,SAAK,SAAL,GAAqB,aAAa,YAAb,CAA0B,OAA1B,CAArB;AACA,SAAK,WAAL,GAAqB,aAAa,cAAb,CAA4B,OAA5B,EAAqC,WAArC,CAArB;AACA,SAAK,MAAL,GAAqB,WAArB;AACA,SAAK,aAAL,GAAqB,IAArB;;AAEA,QAAI,SAAS,KAAb,EAAoB;AAClB,UAAM,eAAe,YAAY,eAAZ,CAA4B,OAA5B,CAArB;AACA,WAAK,EAAL,GAAU,KAAK,SAAL,GAAiB,YAAY,SAAZ,CAAsB,YAAtB,CAA3B;;AAEA,UAAM,WAAW,KAAK,SAAL,GAAiB,YAAY,OAA9C;;AAEA,WAAK,MAAL,GAAc,CAAC,EAAE,YAAY,OAAZ,IACZ,YAAY,OAAZ,CAAoB,IAApB,KAA6B,WADjB,IAEZ,YAAY,OAAZ,CAAoB,MAApB,KAA+B,KAAK,MAFxB,IAGZ,WAAW,GAHD,CAAf;AAID,KAVD,MAWK,IAAI,SAAS,WAAb,EAA0B;AAC7B,WAAK,EAAL,GAAU,QAAQ,SAAR,GAAoB,YAAY,OAA1C;AACD;AACF;;AAhCH,yBAkCE,cAlCF,iCAkC8C;AAAA,QAAvB,OAAuB,QAA1B,CAA0B;AAAA,QAAX,OAAW,QAAd,CAAc;;AAC1C,SAAK,KAAL,IAAgB,OAAhB;AACA,SAAK,KAAL,IAAgB,OAAhB;AACA,SAAK,OAAL,IAAgB,OAAhB;AACA,SAAK,OAAL,IAAgB,OAAhB;;AAEA,WAAO,IAAP;AACD,GAzCH;;AAAA,yBA2CE,SA3CF,6BA2CyC;AAAA,QAAvB,OAAuB,SAA1B,CAA0B;AAAA,QAAX,OAAW,SAAd,CAAc;;AACrC,SAAK,KAAL,IAAgB,OAAhB;AACA,SAAK,KAAL,IAAgB,OAAhB;AACA,SAAK,OAAL,IAAgB,OAAhB;AACA,SAAK,OAAL,IAAgB,OAAhB;;AAEA,WAAO,IAAP;AACD,GAlDH;;AAAA,yBAoDE,cApDF,6BAoDoB;AAChB,SAAK,aAAL,CAAmB,cAAnB;AACD,GAtDH;;AAAA,yBAwDE,eAxDF,8BAwDqB;AACjB,SAAK,kBAAL,GAA0B,IAA1B;AACD,GA1DH;;AAAA,yBA4DE,wBA5DF,uCA4D8B;AAC1B,SAAK,2BAAL,GAAmC,KAAK,kBAAL,GAA0B,IAA7D;AACD,GA9DH;;AAAA;AAAA;;;;;ACFA,IAAM,eAAe,QAAQ,gBAAR,CAArB;AACA,IAAM,cAAe,QAAQ,gBAAR,CAArB;AACA,IAAM,QAAe,QAAQ,UAAR,CAArB;AACA,IAAM,UAAe,QAAQ,kBAAR,CAArB;AACA,IAAM,WAAe,QAAQ,mBAAR,CAArB;AACA,IAAM,UAAe,QAAQ,kBAAR,EAA4B,GAA5B,EAArB;;eACqB,QAAQ,cAAR,C;IAAb,M,YAAA,M;;AAER,IAAM,gBAAgB,CAAE,MAAF,EAAU,IAAV,EAAgB,QAAhB,CAAtB;AACA,IAAM,eAAgB,CAAE,MAAF,EAAU,IAAV,EAAgB,QAAhB,CAAtB;;AAEA,IAAM,gBAAgB;AACpB,4BADoB;AAEpB,YAFoB;AAGpB,0CAHoB;AAIpB,kBAJoB;AAKpB,YAAU;AACR,kBAAc,GADN;AAER,gBAAc,IAFN;AAGR,eAAc,IAHN;AAIR,YAAc,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX;AAJN,GALU;AAWpB,SAAO,CACL,MADK,EAEL,MAFK,EAGL,IAHK,EAIL,QAJK,EAKL,KALK,EAML,WANK,EAOL,MAPK;AAXa,CAAtB;;AAsBA,SAAS,IAAT,CAAe,GAAf,EAAoB;AAAA,MAEhB,WAFgB,GAMd,GANc,CAEhB,WAFgB;AAAA,MAEH,OAFG,GAMd,GANc,CAEH,OAFG;AAAA,MAEM,KAFN,GAMd,GANc,CAEM,KAFN;AAAA,MAEa,WAFb,GAMd,GANc,CAEa,WAFb;AAAA,kBAMd,GANc,CAGhB,IAHgB;AAAA,MAGhB,IAHgB,6BAGT,IAAI,YAAJ,CAAiB,IAHR;AAAA,qBAMd,GANc,CAIhB,OAJgB;AAAA,MAIhB,OAJgB,gCAIN,oBAAoB,GAApB,CAJM;AAAA,0BAMd,GANc,CAKhB,YALgB;AAAA,MAKhB,YALgB,qCAKD,IAAI,YAAJ,CAAiB,IAAjB,EAAuB,OAAvB,EAAgC,KAAhC,EAAuC,WAAvC,EAAoD,WAApD,CALC;;;AAQlB,MAAM,YAAY;AAChB,4BADgB;AAEhB,oBAFgB;AAGhB,gBAHgB;AAIhB,4BAJgB;AAKhB,oBALgB;AAMhB,cANgB;AAOhB;AAPgB,GAAlB;;AAUA,OAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,QAAQ,MAA5B,EAAoC,GAApC,EAAyC;AACvC,QAAM,SAAS,QAAQ,CAAR,CAAf;;AAEA,SAAK,IAAM,IAAX,IAAmB,OAAO,KAAP,IAAgB,EAAnC,EAAuC;AACrC,mBAAa,IAAb,IAAqB,OAAO,KAAP,CAAa,IAAb,CAArB;AACD;;AAED,QAAM,SAAS,MAAM,WAAN,CAAkB,OAAO,SAAzB,EAAoC,OAAO,OAA3C,CAAf;;AAEA,iBAAa,cAAb,CAA4B,MAA5B;AACA,iBAAa,SAAb,GAAyB,OAAO,SAAhC;AACA,iBAAa,aAAb,GAA6B,OAAO,OAApC;;AAEA,WAAO,SAAP,CAAiB,IAAjB,CAAsB,YAAtB;;AAEA,iBAAa,SAAb,CAAuB,MAAvB;;AAEA,QAAI,aAAa,2BAAb,IACI,aAAa,kBAAb,IACI,IAAI,CAAL,GAAU,QAAQ,MADrB,IAC+B,QAAQ,IAAI,CAAZ,EAAe,OAAf,KAA2B,aAAa,aAF/E,EAE+F;AAC7F;AACD;AACF;;AAED,UAAQ,IAAR,CAAa,OAAb,EAAsB,SAAtB;;AAEA,MAAI,SAAS,KAAb,EAAoB;AAClB;AACA;AACA,QAAM,UAAU,aAAa,MAAb,GACZ,KAAK;AACL,8BADK,EACQ,gBADR,EACiB,YADjB,EACwB,wBADxB;AAEL,YAAM;AAFD,KAAL,CADY,GAKZ,YALJ;;AAOA,gBAAY,OAAZ,GAAsB,OAAtB;AACA,gBAAY,OAAZ,GAAsB,QAAQ,SAA9B;AACD;;AAED,SAAO,YAAP;AACD;;AAED,SAAS,mBAAT,OAAkF;AAAA,MAAlD,WAAkD,QAAlD,WAAkD;AAAA,MAArC,OAAqC,QAArC,OAAqC;AAAA,MAA5B,KAA4B,QAA5B,KAA4B;AAAA,MAArB,WAAqB,QAArB,WAAqB;AAAA,MAAR,IAAQ,QAAR,IAAQ;;AAChF,MAAM,eAAe,YAAY,eAAZ,CAA4B,OAA5B,CAArB;;AAEA;AACA,MAAI,SAAS,KAAT,KAAmB,YAAY;AAC/B;AADmB,KAEhB,EAAE,YAAY,WAAZ,CAAwB,YAAxB,KAAyC,YAAY,WAAZ,CAAwB,YAAxB,MAA0C,WAArF,CAFH,CAAJ,EAE2G;AACzG,WAAO,EAAP;AACD;;AAED,MAAM,OAAO,MAAM,OAAN,CAAc,WAAd,CAAb;AACA,MAAM,YAAY;AAChB,4BADgB;AAEhB,oBAFgB;AAGhB,gBAHgB;AAIhB,4BAJgB;AAKhB,cALgB;AAMhB,cANgB;AAOhB,aAAS,EAPO;AAQhB,aAAS;AARO,GAAlB;;AAWA,uBAAsB,IAAtB,kHAA4B;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,QAAjB,OAAiB;;AAC1B,cAAU,OAAV,GAAoB,OAApB;;AAEA,YAAQ,IAAR,CAAa,iBAAb,EAAgC,SAAhC;AACD;;AAED,MAAI,SAAS,MAAb,EAAqB;AACnB,cAAU,OAAV,GAAoB,OAAO,UAAU,OAAjB,EAA0B;AAAA,aAC5C,OAAO,SAAP,CAAiB,OAAjB,CAAyB,YAAzB,KAA0C,YAAY,UAAZ,CAAuB,YAAvB,EAAqC,QADnC;AAAA,KAA1B,CAApB;AAED;;AAED,SAAO,UAAU,OAAjB;AACD;;AAED,YAAY,OAAZ,CAAoB,EAApB,CAAuB,qBAAvB,EAA8C,iBAAyC;AAAA,MAA7B,WAA6B,SAA7B,WAA6B;AAAA,MAAhB,YAAgB,SAAhB,YAAgB;;AACrF,cAAY,UAAZ,CAAuB,YAAvB,IAAuC,EAAE,UAAU,QAAZ,EAAsB,SAAS,IAA/B,EAAvC;AACD,CAFD;;AAIA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,gBAAvB,EAAyC,iBAAyC;AAAA,MAA7B,WAA6B,SAA7B,WAA6B;AAAA,MAAhB,YAAgB,SAAhB,YAAgB;;AAChF,cAAY,UAAZ,CAAuB,MAAvB,CAA8B,YAA9B,EAA4C,CAA5C;AACD,CAFD;;AAIA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,MAAvB,EAA+B,iBAAuE;AAAA,MAA3D,WAA2D,SAA3D,WAA2D;AAAA,MAA9C,OAA8C,SAA9C,OAA8C;AAAA,MAArC,KAAqC,SAArC,KAAqC;AAAA,MAA9B,WAA8B,SAA9B,WAA8B;AAAA,MAAjB,aAAiB,SAAjB,aAAiB;;AACpG,MAAM,eAAe,YAAY,eAAZ,CAA4B,OAA5B,CAArB;;AAEA,MAAI,CAAC,aAAD,KAAmB,CAAC,YAAY,aAAb,IAA8B,YAAY,eAA7D,CAAJ,EAAmF;AACjF,QAAI,YAAY,aAAhB,EAA+B;AAC7B,mBAAa,YAAY,UAAZ,CAAuB,YAAvB,EAAqC,OAAlD;AACD;;AAED,SAAK;AACH,8BADG,EACU,gBADV,EACmB,YADnB,EAC0B,wBAD1B;AAEH,YAAM;AAFH,KAAL;AAID;AACF,CAbD;;AAeA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,MAAvB,EAA+B,iBAAsE;AAAA,MAA1D,WAA0D,SAA1D,WAA0D;AAAA,MAA7C,OAA6C,SAA7C,OAA6C;AAAA,MAApC,KAAoC,SAApC,KAAoC;AAAA,MAA7B,WAA6B,SAA7B,WAA6B;AAAA,MAAhB,YAAgB,SAAhB,YAAgB;;AACnG;AACA,MAAM,YAAY,QAAQ,KAAR,GAAe,MAAM,MAAN,CAAa,EAAb,EAAiB,KAAjB,CAAf,GAAyC,KAA3D;;AAEA,MAAM,QAAQ,YAAY,UAAZ,CAAuB,YAAvB,CAAd;AACA,MAAM,OAAO,MAAM,OAAN,CAAc,WAAd,CAAb;AACA,MAAM,YAAY;AAChB,4BADgB;AAEhB,oBAFgB;AAGhB,gBAHgB;AAIhB,4BAJgB;AAKhB,UAAM,MALU;AAMhB,aAAS,EANO;AAOhB,cAPgB;AAQhB,aAAS;AARO,GAAlB;;AAWA,wBAAsB,IAAtB,yHAA4B;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,QAAjB,OAAiB;;AAC1B,cAAU,OAAV,GAAoB,OAApB;;AAEA,YAAQ,IAAR,CAAa,iBAAb,EAAgC,SAAhC;AACD;;AAED,MAAI,CAAC,UAAU,OAAV,CAAkB,MAAvB,EAA+B;AAAE;AAAS;;AAE1C,MAAI,cAAc,QAAlB;;AAEA,OAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,UAAU,OAAV,CAAkB,MAAtC,EAA8C,GAA9C,EAAmD;AACjD,QAAM,SAAS,UAAU,OAAV,CAAkB,CAAlB,CAAf;AACA,QAAM,eAAe,OAAO,SAAP,CAAiB,OAAjB,CAAyB,YAA9C;;AAEA,QAAI,eAAe,WAAnB,EAAgC;AAC9B,oBAAc,YAAd;AACD;AACF;;AAED,QAAM,QAAN,GAAiB,WAAjB;AACA,QAAM,OAAN,GAAgB,WAAW,YAAY;AACrC,SAAK;AACH,8BADG,EACU,oBADV,EACqB,wBADrB;AAEH,eAAS,QAAQ,KAAR,GAAe,SAAf,GAA2B,OAFjC;AAGH,YAAM;AAHH,KAAL;AAKD,GANe,EAMb,WANa,CAAhB;AAOD,CA5CD;;AA8CA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,IAAvB,EAA6B,iBAAkD;AAAA,MAA/C,WAA+C,SAA/C,WAA+C;AAAA,MAAlC,OAAkC,SAAlC,OAAkC;AAAA,MAAzB,KAAyB,SAAzB,KAAyB;AAAA,MAAlB,WAAkB,SAAlB,WAAkB;;AAC7E,MAAI,CAAC,YAAY,eAAjB,EAAkC;AAChC,SAAK,EAAE,wBAAF,EAAe,wBAAf,EAA4B,gBAA5B,EAAqC,YAArC,EAA4C,MAAM,KAAlD,EAAL;AACD;AACF,CAJD;;AAMA,CAAC,IAAD,EAAO,QAAP,EAAiB,OAAjB,CAAyB,UAAU,UAAV,EAAsB;AAC7C,cAAY,OAAZ,CAAoB,EAApB,CAAuB,UAAvB,EAAmC,iBAAyC;AAAA,QAA7B,WAA6B,SAA7B,WAA6B;AAAA,QAAhB,YAAgB,SAAhB,YAAgB;;AAC1E,QAAI,YAAY,UAAZ,CAAuB,YAAvB,CAAJ,EAA0C;AACxC,mBAAa,YAAY,UAAZ,CAAuB,YAAvB,EAAqC,OAAlD;AACD;AACF,GAJD;AAKD,CAND;;AAQA,SAAS,oBAAT,CAA+B,IAA/B,EAAqC;AACnC,SAAO,kBAAwD;AAAA,QAA5C,WAA4C,UAA5C,WAA4C;AAAA,QAA/B,OAA+B,UAA/B,OAA+B;AAAA,QAAtB,KAAsB,UAAtB,KAAsB;AAAA,QAAf,WAAe,UAAf,WAAe;;AAC7D,SAAK,EAAE,wBAAF,EAAe,wBAAf,EAA4B,gBAA5B,EAAqC,YAArC,EAA4C,UAA5C,EAAL;AACD,GAFD;AAGD;;AAED,KAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,cAAc,MAAlC,EAA0C,GAA1C,EAA+C;AAC7C,cAAY,OAAZ,CAAoB,EAApB,CAAuB,cAAc,CAAd,CAAvB,EAAyC,qBAAqB,aAAa,CAAb,CAArB,CAAzC;AACD;;AAED,YAAY,OAAZ,CAAoB,EAApB,CAAuB,KAAvB,EAA8B,UAAU,WAAV,EAAuB;AACnD,cAAY,OAAZ,GAAyB,IAAzB,CADmD,CACnB;AAChC,cAAY,OAAZ,GAAyB,CAAzB,CAFmD,CAEnB;AAChC,cAAY,UAAZ,GAAyB,EAAzB,CAHmD,CAGnB;AACjC,CAJD;;AAMA,SAAS,aAAT,GAAyB,cAAc,QAAvC;AACA,OAAO,OAAP,GAAiB,aAAjB;;;;;ACtOA,IAAM,gBAAgB,QAAQ,QAAR,CAAtB;AACA,IAAM,cAAgB,QAAQ,gBAAR,CAAtB;;AAEA,cAAc,OAAd,CAAsB,EAAtB,CAAyB,KAAzB,EAAgC,KAAhC;AACA,cAAc,OAAd,CAAsB,EAAtB,CAAyB,OAAzB,EAAkC,OAAlC;;WAEqB,CAAC,MAAD,EAAS,IAAT,EAAe,QAAf,EAAyB,QAAzB,C;AAArB,yCAAyD;AAApD,MAAM,iBAAN;AACH,cAAY,OAAZ,CAAoB,EAApB,CAAuB,MAAvB,EAA+B,aAA/B;AACD;;AAED,SAAS,KAAT,OAAkC;AAAA,MAAhB,YAAgB,QAAhB,YAAgB;;AAChC,MAAI,aAAa,IAAb,KAAsB,MAA1B,EAAkC;AAAE;AAAS;;AAE7C,eAAa,KAAb,GAAqB,CAAC,aAAa,KAAb,IAAsB,CAAvB,IAA4B,CAAjD;AACD;;AAED,SAAS,OAAT,QAAuE;AAAA,MAAnD,WAAmD,SAAnD,WAAmD;AAAA,MAAtC,YAAsC,SAAtC,YAAsC;AAAA,MAAxB,WAAwB,SAAxB,WAAwB;AAAA,MAAX,OAAW,SAAX,OAAW;;AACrE,MAAI,aAAa,IAAb,KAAsB,MAAtB,IAAgC,CAAC,QAAQ,MAA7C,EAAqD;AAAE;AAAS;;AAEhE;AACA,MAAM,WAAW,QAAQ,CAAR,EAAW,SAAX,CAAqB,OAArB,CAA6B,kBAA9C;;AAEA;AACA,MAAI,YAAY,CAAhB,EAAmB;AAAE;AAAS;;AAE9B;AACA,cAAY,kBAAZ,GAAiC,WAAW,YAAY;AACtD,kBAAc,IAAd,CAAmB;AACjB,8BADiB;AAEjB,8BAFiB;AAGjB,YAAM,MAHW;AAIjB,eAAS,YAJQ;AAKjB,aAAO;AALU,KAAnB;AAOD,GARgC,EAQ9B,QAR8B,CAAjC;AASD;;AAED,SAAS,aAAT,QAAyC;AAAA,MAAf,WAAe,SAAf,WAAe;;AACvC;AACA;AACA,MAAI,YAAY,kBAAhB,EAAoC;AAClC,kBAAc,YAAY,kBAA1B;AACA,gBAAY,kBAAZ,GAAiC,IAAjC;AACD;AACF;;AAED;AACA,cAAc,QAAd,CAAuB,kBAAvB,GAA4C,CAA5C;AACA,cAAc,KAAd,CAAoB,IAApB,CAAyB,YAAzB;;AAEA,OAAO,OAAP,GAAiB;AACf,cADe;AAEf,kBAFe;AAGf;AAHe,CAAjB;;;;;AClDA,IAAM,gBAAgB,QAAQ,QAAR,CAAtB;AACA,IAAM,eAAgB,QAAQ,iBAAR,CAAtB;AACA,IAAM,UAAgB,QAAQ,kBAAR,CAAtB;AACA,IAAM,KAAgB,QAAQ,aAAR,CAAtB;AACA,IAAM,WAAgB,QAAQ,mBAAR,CAAtB;AACA,IAAM,QAAgB,QAAQ,UAAR,CAAtB;AACA,IAAM,SAAgB,QAAQ,iBAAR,CAAtB;;eACsB,QAAQ,cAAR,C;IAAd,K,YAAA,K;;AAER,cAAc,OAAd,CAAsB,EAAtB,CAAyB,iBAAzB,EAA4C,gBAAmD;AAAA,MAAvC,OAAuC,QAAvC,OAAuC;AAAA,MAA9B,OAA8B,QAA9B,OAA8B;AAAA,MAArB,IAAqB,QAArB,IAAqB;AAAA,MAAf,WAAe,QAAf,WAAe;;AAC7F,WAAS,gBAAT,CAA2B,YAA3B,EAAyC,QAAzC,EAAmD,OAAnD,EAA4D;AAC1D,QAAM,MAAM,QAAQ,0BAAR,GACN,QAAQ,gBAAR,CAAyB,QAAzB,CADM,GAEN,SAFN;;AAIA,QAAM,YAAY,aAAa,MAA/B;AACA,QAAM,UAAU,UAAU,OAA1B;;AAEA,QAAI,UAAU,IAAV,KACG,GAAG,OAAH,CAAW,OAAX,CADH,IAEG,SAAS,eAAT,CAAyB,OAAzB,EAAkC,QAAlC,EAA4C,GAA5C,CAFH,IAGG,aAAa,eAAb,CAA6B,OAA7B,EAAsC,OAAtC,EAA+C,WAA/C,CAHP,EAGoE;;AAElE,cAAQ,IAAR,CAAa;AACX,wBADW;AAEX,4BAFW;AAGX,eAAO,EAAE,0BAAF;AAHI,OAAb;AAKD;AACF;;AAED,MAAM,eAAe,MAAM,aAAN,CAAoB,GAApB,CAAwB,OAAxB,CAArB;;AAEA,MAAI,YAAJ,EAAkB;AAChB,QAAM,YAAY,aAAa,MAA/B;AACA,QAAM,UAAU,UAAU,OAA1B;;AAEA,QAAI,UAAU,IAAV,KACG,aAAa,eAAb,CAA6B,OAA7B,EAAsC,OAAtC,EAA+C,WAA/C,CADP,EACoE;AAClE,cAAQ,IAAR,CAAa;AACX,wBADW;AAEX,4BAFW;AAGX,eAAO,EAAE,0BAAF;AAHI,OAAb;AAKD;AACF;;AAED,QAAM,aAAN,CAAoB,eAApB,CAAoC,gBAApC,EAAsD,OAAtD;AACD,CAvCD;;AAyCA,aAAa,OAAb,CAAqB,EAArB,CAAwB,KAAxB,EAA+B,iBAA4B;AAAA,MAAhB,YAAgB,SAAhB,YAAgB;;AACzD,eAAa,MAAb,CAAoB,OAApB,GAA8B,UAAU,OAAV,EAAmB;AAC/C,WAAO,aAAa,OAAb,CAAqB,OAArB,CAAP;AACD,GAFD;AAGD,CAJD;;AAMA,aAAa,OAAb,CAAqB,EAArB,CAAwB,KAAxB,EAA+B,iBAAqC;AAAA,MAAzB,YAAyB,SAAzB,YAAyB;AAAA,MAAX,OAAW,SAAX,OAAW;;AAClE,SAAO,aAAa,MAAb,CAAoB,OAA3B,EAAoC,cAAc,QAAlD;AACA,SAAO,aAAa,MAAb,CAAoB,OAA3B,EAAoC,OAApC;AACD,CAHD;;AAKA,MAAM,aAAa,UAAnB,EAA+B,cAAc,KAA7C;;AAEA,aAAa,SAAb,CAAuB,aAAvB,GAAuC,UAAU,OAAV,EAAmB;AACxD,SAAO,KAAK,MAAL,CAAY,OAAnB,EAA4B,OAA5B;;AAEA,SAAO,IAAP;AACD,CAJD;;AAMA,IAAM,qBAAqB,aAAa,SAAb,CAAuB,iBAAlD;;AAEA,aAAa,SAAb,CAAuB,iBAAvB,GAA2C,UAAU,UAAV,EAAsB,QAAtB,EAAgC;AACzE,MAAM,MAAM,mBAAmB,IAAnB,CAAwB,IAAxB,EAA8B,UAA9B,EAA0C,QAA1C,CAAZ;;AAEA,MAAI,QAAQ,IAAZ,EAAkB;AAChB,SAAK,MAAL,CAAY,OAAZ,CAAoB,UAApB,IAAkC,QAAlC;AACD;;AAED,SAAO,GAAP;AACD,CARD;;AAUA,aAAa,eAAb,CAA6B,IAA7B,CAAkC,eAAlC;;;;;ACjFA,IAAM,QAAU,QAAQ,SAAR,CAAhB;AACA,IAAM,SAAU,QAAQ,gBAAR,CAAhB;AACA,IAAM,UAAU,QAAQ,iBAAR,EAA2B,GAA3B,EAAhB;;AAEA,IAAM,QAAQ;AACZ,kBADY;AAEZ,gBAFY;AAGZ,cAHY;;AAKZ;AACA,YAAU,QAAQ,oBAAR,EAA8B,QAN5B;AAOZ;AACA,aAAW,EARC;;AAUZ,eAAa,qBAAU,GAAV,EAAe,GAAf,EAAoB;AAC/B;AACA,QAAI,MAAM,QAAN,CAAe,MAAM,SAArB,EAAgC,GAAhC,CAAJ,EAA0C;AAAE,aAAO,KAAP;AAAe;;AAE3D,UAAM,OAAO,MAAM,SAAN,CAAgB,GAAhB,CAAb;;AAEA,UAAM,SAAN,CAAgB,IAAhB,CAAqB,GAArB;AACA,WAAO,SAAP,CAAiB,IAAjB,CAAsB,GAAtB;;AAEA;AACA;AACA,QAAI,QAAQ,MAAM,QAAlB,EAA4B;AAC1B,aAAO,GAAP,CAAW,GAAX,EAAgB,QAAhB,EAA0B,MAAM,cAAhC;AACD;;AAED,YAAQ,IAAR,CAAa,cAAb,EAA6B,EAAE,QAAF,EAAO,QAAP,EAA7B;AACD,GA1BW;;AA4BZ,kBAAgB,wBAAU,GAAV,EAAe,GAAf,EAAoB;AAClC,QAAM,QAAQ,MAAM,OAAN,CAAc,MAAM,SAApB,EAA+B,GAA/B,CAAd;;AAEA,UAAM,OAAO,MAAM,SAAN,CAAgB,GAAhB,CAAb;;AAEA,WAAO,MAAP,CAAc,GAAd,EAAmB,QAAnB,EAA6B,MAAM,cAAnC;;AAEA,UAAM,SAAN,CAAgB,MAAhB,CAAuB,KAAvB,EAA8B,CAA9B;AACA,WAAO,SAAP,CAAiB,MAAjB,CAAwB,KAAxB,EAA+B,CAA/B;;AAEA,YAAQ,IAAR,CAAa,iBAAb,EAAgC,EAAE,QAAF,EAAO,QAAP,EAAhC;AACD,GAvCW;;AAyCZ,kBAAgB,0BAAY;AAC1B,UAAM,cAAN,CAAqB,KAAK,QAA1B,EAAoC,IAApC;AACD;AA3CW,CAAd;;AA8CA,OAAO,OAAP,GAAiB,KAAjB;;;;;;;eClDoB,QAAQ,OAAR,C;IAAZ,O,YAAA,O;;IAEF,O;AACJ,qBAAe;AAAA;;AACb,SAAK,SAAL,GAAiB;AACf;AADe,KAAjB;AAGD;;oBAED,E,eAAI,I,EAAM,Q,EAAU;AAClB,QAAI,CAAC,KAAK,SAAL,CAAe,IAAf,CAAL,EAA2B;AACzB,WAAK,SAAL,CAAe,IAAf,IAAuB,CAAC,QAAD,CAAvB;AACA;AACD;;AAED,SAAK,SAAL,CAAe,IAAf,EAAqB,IAArB,CAA0B,QAA1B;AACD,G;;oBAED,G,gBAAK,I,EAAM,Q,EAAU;AACnB,QAAI,CAAC,KAAK,SAAL,CAAe,IAAf,CAAL,EAA2B;AAAE;AAAS;;AAEtC,QAAM,QAAQ,QAAQ,KAAK,SAAL,CAAe,IAAf,CAAR,EAA8B,QAA9B,CAAd;;AAEA,QAAI,UAAU,CAAC,CAAf,EAAkB;AAChB,WAAK,SAAL,CAAe,IAAf,EAAqB,MAArB,CAA4B,KAA5B,EAAmC,CAAnC;AACD;AACF,G;;oBAED,I,iBAAM,I,EAAM,G,EAAK;AACf,QAAM,kBAAkB,KAAK,SAAL,CAAe,IAAf,CAAxB;;AAEA,QAAI,CAAC,eAAL,EAAsB;AAAE;AAAS;;AAEjC,SAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,gBAAgB,MAApC,EAA4C,GAA5C,EAAiD;AAC/C,UAAI,gBAAgB,CAAhB,EAAmB,GAAnB,EAAwB,IAAxB,MAAkC,KAAtC,EAA6C;AAC3C;AACD;AACF;AACF,G;;;;;AAGH,QAAQ,GAAR,GAAc,YAAY;AACxB,SAAO,IAAI,OAAJ,EAAP;AACD,CAFD;;AAIA,OAAO,OAAP,GAAiB,OAAjB;;;;;AC7CA,SAAS,OAAT,CAAkB,KAAlB,EAAyB,MAAzB,EAAiC;AAC/B,OAAK,IAAI,IAAI,CAAR,EAAW,MAAM,MAAM,MAA5B,EAAoC,IAAI,GAAxC,EAA6C,GAA7C,EAAkD;AAChD,QAAI,MAAM,CAAN,MAAa,MAAjB,EAAyB;AACvB,aAAO,CAAP;AACD;AACF;;AAED,SAAO,CAAC,CAAR;AACD;;AAED,SAAS,QAAT,CAAmB,KAAnB,EAA0B,MAA1B,EAAkC;AAChC,SAAO,QAAQ,KAAR,EAAe,MAAf,MAA2B,CAAC,CAAnC;AACD;;AAED,SAAS,KAAT,CAAgB,MAAhB,EAAwB,MAAxB,EAAgC;AAC9B,OAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,OAAO,MAA3B,EAAmC,GAAnC,EAAwC;AACtC,WAAO,IAAP,CAAY,OAAO,CAAP,CAAZ;AACD;;AAED,SAAO,MAAP;AACD;;AAED,SAAS,MAAT,CAAiB,KAAjB,EAAwB,IAAxB,EAA8B;AAC5B,MAAM,SAAS,EAAf;;AAEA,OAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,MAAM,MAA1B,EAAkC,GAAlC,EAAuC;AACrC,QAAI,KAAK,MAAM,CAAN,CAAL,CAAJ,EAAoB;AAClB,aAAO,IAAP,CAAY,MAAM,CAAN,CAAZ;AACD;AACF;;AAED,SAAO,MAAP;AACD;;AAED,OAAO,OAAP,GAAiB;AACf,kBADe;AAEf,oBAFe;AAGf,cAHe;AAIf;AAJe,CAAjB;;;;;eClCmB,QAAQ,UAAR,C;IAAX,M,YAAA,M;;AACR,IAAM,KAAS,QAAQ,MAAR,CAAf;AACA,IAAM,aAAa,QAAQ,cAAR,CAAnB;;AAEA,IAAM,UAAU,WAAW,OAA3B;AACA,IAAM,YAAa,OAAO,SAA1B;;AAEA,IAAM,UAAU;AACd;AACA,iBAAe,CAAC,EAAG,kBAAkB,MAAnB,IAA8B,GAAG,QAAH,CAAY,OAAO,aAAnB,KAC1B,WAAW,QAAX,YAA+B,OAAO,aAD5C,CAFF;;AAKd;AACA,wBAAsB,CAAC,CAAC,WAAW,YANrB;;AAQd,SAAQ,iBAAiB,MAAlB,IAA6B,EAAE,sBAAsB,MAAxB,CARtB;;AAUd;AACA,iBAAgB,UAAU,OAAV,KAAsB,OAAtB,IACT,QAAQ,aADC,IAET,UAAU,SAAV,CAAoB,KAApB,CAA0B,QAA1B,CAbO;;AAed;AACA,UAAS,iBAAiB,IAAjB,CAAsB,UAAU,QAAhC,KACG,YAAY,IAAZ,CAAiB,UAAU,UAA3B,CAjBE;;AAmBd,gBAAc,aAAa,IAAb,CAAkB,UAAU,SAA5B,CAnBA;;AAqBd;AACA,2BAAyB,aAAa,QAAQ,SAArB,GACrB,SADqB,GACV,2BAA2B,QAAQ,SAAnC,GACX,uBADW,GACc,wBAAwB,QAAQ,SAAhC,GACzB,oBADyB,GACH,sBAAsB,QAAQ,SAA9B,GACtB,kBADsB,GACF,mBA1BV;;AA4Bd,8BAA4B,KA5Bd;;AA8Bd,eAAc,WAAW,YAAX,GACT,WAAW,YAAX,KAA4B,OAAO,cAAnC,GACC;AACA,QAAQ,aADR;AAEA,UAAQ,eAFR;AAGA,UAAQ,WAHR;AAIA,SAAQ,UAJR;AAKA,UAAQ,eALR;AAMA,YAAQ;AANR,GADD,GASC;AACA,QAAQ,WADR;AAEA,UAAQ,aAFR;AAGA,UAAQ,aAHR;AAIA,SAAQ,YAJR;AAKA,UAAQ,aALR;AAMA,YAAQ;AANR,GAVQ,GAkBV,IAhDU;;AAkDd;AACA,cAAY,kBAAkB,WAAW,QAA7B,GAAuC,YAAvC,GAAqD;;AAnDnD,CAAhB;;AAuDA,QAAQ,0BAAR,GAAqC,CAAC,GAAG,QAAH,CAAY,QAAQ,SAAR,CAAkB,QAAQ,uBAA1B,CAAZ,CAAtC;;AAEA,OAAO,OAAP,GAAiB,OAAjB;;;;;AChEA,IAAM,aAAa,EAAnB;AACA,IAAM,MAAM,QAAQ,UAAR,EAAoB,MAAhC;;AAEA,SAAS,KAAT,GAAkB,CAAE;;AAEpB,WAAW,QAAX,GAAgC,IAAI,QAApC;AACA,WAAW,gBAAX,GAAgC,IAAI,gBAAJ,IAA0B,KAA1D;AACA,WAAW,UAAX,GAAgC,IAAI,UAAJ,IAA0B,KAA1D;AACA,WAAW,aAAX,GAAgC,IAAI,aAAJ,IAA0B,KAA1D;AACA,WAAW,kBAAX,GAAgC,IAAI,kBAAJ,IAA0B,KAA1D;AACA,WAAW,OAAX,GAAgC,IAAI,OAAJ,IAA0B,KAA1D;AACA,WAAW,WAAX,GAAgC,IAAI,WAAJ,IAA0B,WAAW,OAArE;;AAEA,WAAW,KAAX,GAA0B,IAAI,KAA9B;AACA,WAAW,KAAX,GAA0B,IAAI,KAAJ,IAAa,KAAvC;AACA,WAAW,YAAX,GAA2B,IAAI,YAAJ,IAAoB,IAAI,cAAnD;;AAEA,OAAO,OAAP,GAAiB,UAAjB;;;;;ACjBA,IAAM,MAAa,QAAQ,UAAR,CAAnB;AACA,IAAM,UAAa,QAAQ,WAAR,CAAnB;AACA,IAAM,KAAa,QAAQ,MAAR,CAAnB;AACA,IAAM,aAAa,QAAQ,cAAR,CAAnB;;AAEA,IAAM,WAAW;AACf,gBAAc,sBAAU,MAAV,EAAkB,KAAlB,EAAyB;AACrC,WAAO,KAAP,EAAc;AACZ,UAAI,UAAU,MAAd,EAAsB;AACpB,eAAO,IAAP;AACD;;AAED,cAAQ,MAAM,UAAd;AACD;;AAED,WAAO,KAAP;AACD,GAXc;;AAaf,WAAS,iBAAU,OAAV,EAAmB,QAAnB,EAA6B;AACpC,WAAO,GAAG,OAAH,CAAW,OAAX,CAAP,EAA4B;AAC1B,UAAI,SAAS,eAAT,CAAyB,OAAzB,EAAkC,QAAlC,CAAJ,EAAiD;AAAE,eAAO,OAAP;AAAiB;;AAEpE,gBAAU,SAAS,UAAT,CAAoB,OAApB,CAAV;AACD;;AAED,WAAO,IAAP;AACD,GArBc;;AAuBf,cAAY,oBAAU,IAAV,EAAgB;AAC1B,QAAI,SAAS,KAAK,UAAlB;;AAEA,QAAI,GAAG,OAAH,CAAW,MAAX,CAAJ,EAAwB;AACtB;AACA,aAAO,CAAC,SAAS,OAAO,IAAjB,KAA0B,GAAG,OAAH,CAAW,MAAX,CAAjC,EAAqD;AACnD;AACD;;AAED,aAAO,MAAP;AACD;;AAED,WAAO,MAAP;AACD,GApCc;;AAsCf;AACA,2BAAyB,QAAQ,0BAAR,GACrB,UAAU,OAAV,EAAmB,QAAnB,EAA6B,KAA7B,EAAoC;AACpC,YAAQ,SAAS,QAAQ,UAAR,CAAmB,gBAAnB,CAAoC,QAApC,CAAjB;;AAEA,SAAK,IAAI,IAAI,CAAR,EAAW,MAAM,MAAM,MAA5B,EAAoC,IAAI,GAAxC,EAA6C,GAA7C,EAAkD;AAChD,UAAI,MAAM,CAAN,MAAa,OAAjB,EAA0B;AACxB,eAAO,IAAP;AACD;AACF;;AAED,WAAO,KAAP;AACD,GAXsB,GAYrB,IAnDW;;AAqDf,mBAAiB,yBAAU,OAAV,EAAmB,QAAnB,EAA6B,QAA7B,EAAuC;AACtD,QAAI,QAAQ,0BAAZ,EAAwC;AACtC,aAAO,SAAS,uBAAT,CAAiC,OAAjC,EAA0C,QAA1C,EAAoD,QAApD,CAAP;AACD;;AAED;AACA,QAAI,IAAI,MAAJ,KAAe,IAAI,UAAvB,EAAmC;AACjC,iBAAW,SAAS,OAAT,CAAiB,WAAjB,EAA8B,GAA9B,CAAX;AACD;;AAED,WAAO,QAAQ,QAAQ,uBAAhB,EAAyC,QAAzC,CAAP;AACD,GAhEc;;AAkEf;AACA,yBAAuB,+BAAU,QAAV,EAAoB;AACzC,QAAI,qBAAqB,EAAzB;AACA,QAAI,kBAAkB,EAAtB;AACA,QAAI,iBAAJ;AACA,QAAI,cAAc,SAAS,CAAT,CAAlB;AACA,QAAI,QAAQ,cAAa,CAAb,GAAgB,CAAC,CAA7B;AACA,QAAI,eAAJ;AACA,QAAI,cAAJ;AACA,QAAI,UAAJ;AACA,QAAI,UAAJ;;AAEA,SAAK,IAAI,CAAT,EAAY,IAAI,SAAS,MAAzB,EAAiC,GAAjC,EAAsC;AACpC,iBAAW,SAAS,CAAT,CAAX;;AAEA;AACA,UAAI,CAAC,QAAD,IAAa,aAAa,WAA9B,EAA2C;AACzC;AACD;;AAED,UAAI,CAAC,WAAL,EAAkB;AAChB,sBAAc,QAAd;AACA,gBAAQ,CAAR;AACA;AACD;;AAED;AACA;AACA,UAAI,SAAS,UAAT,KAAwB,SAAS,aAArC,EAAoD;AAClD;AACD;AACD;AAHA,WAIK,IAAI,YAAY,UAAZ,KAA2B,SAAS,aAAxC,EAAuD;AAC1D,wBAAc,QAAd;AACA,kBAAQ,CAAR;AACA;AACD;;AAED,UAAI,CAAC,mBAAmB,MAAxB,EAAgC;AAC9B,iBAAS,WAAT;AACA,eAAO,OAAO,UAAP,IAAqB,OAAO,UAAP,KAAsB,OAAO,aAAzD,EAAwE;AACtE,6BAAmB,OAAnB,CAA2B,MAA3B;AACA,mBAAS,OAAO,UAAhB;AACD;AACF;;AAED;AACA;AACA,UAAI,uBAAuB,WAAW,WAAlC,IACG,oBAAoB,WAAW,UADlC,IAEG,EAAE,oBAAoB,WAAW,aAAjC,CAFP,EAEwD;;AAEtD,YAAI,aAAa,YAAY,UAA7B,EAAyC;AACvC;AACD;;AAED,iBAAS,SAAS,eAAlB;AACD,OATD,MAUK;AACH,iBAAS,QAAT;AACD;;AAED,wBAAkB,EAAlB;;AAEA,aAAO,OAAO,UAAP,KAAsB,OAAO,aAApC,EAAmD;AACjD,wBAAgB,OAAhB,CAAwB,MAAxB;AACA,iBAAS,OAAO,UAAhB;AACD;;AAED,UAAI,CAAJ;;AAEA;AACA,aAAO,gBAAgB,CAAhB,KAAsB,gBAAgB,CAAhB,MAAuB,mBAAmB,CAAnB,CAApD,EAA2E;AACzE;AACD;;AAED,UAAM,UAAU,CACd,gBAAgB,IAAI,CAApB,CADc,EAEd,gBAAgB,CAAhB,CAFc,EAGd,mBAAmB,CAAnB,CAHc,CAAhB;;AAMA,cAAQ,QAAQ,CAAR,EAAW,SAAnB;;AAEA,aAAO,KAAP,EAAc;AACZ,YAAI,UAAU,QAAQ,CAAR,CAAd,EAA0B;AACxB,wBAAc,QAAd;AACA,kBAAQ,CAAR;AACA,+BAAqB,EAArB;;AAEA;AACD,SAND,MAOK,IAAI,UAAU,QAAQ,CAAR,CAAd,EAA0B;AAC7B;AACD;;AAED,gBAAQ,MAAM,eAAd;AACD;AACF;;AAED,WAAO,KAAP;AACD,GAvKc;;AAyKf,eAAa,qBAAU,OAAV,EAAmB,QAAnB,EAA6B,KAA7B,EAAoC;AAC/C,WAAO,GAAG,OAAH,CAAW,OAAX,CAAP,EAA4B;AAC1B,UAAI,SAAS,eAAT,CAAyB,OAAzB,EAAkC,QAAlC,CAAJ,EAAiD;AAC/C,eAAO,IAAP;AACD;;AAED,gBAAU,SAAS,UAAT,CAAoB,OAApB,CAAV;;AAEA,UAAI,YAAY,KAAhB,EAAuB;AACrB,eAAO,SAAS,eAAT,CAAyB,OAAzB,EAAkC,QAAlC,CAAP;AACD;AACF;;AAED,WAAO,KAAP;AACD,GAvLc;;AAyLf,oBAAkB,0BAAU,OAAV,EAAmB;AACnC,WAAQ,mBAAmB,WAAW,kBAA9B,GACJ,QAAQ,uBADJ,GAEJ,OAFJ;AAGD,GA7Lc;;AA+Lf,eAAa,qBAAU,cAAV,EAA0B;AACrC,qBAAiB,kBAAkB,IAAI,MAAvC;AACA,WAAO;AACL,SAAG,eAAe,OAAf,IAA0B,eAAe,QAAf,CAAwB,eAAxB,CAAwC,UADhE;AAEL,SAAG,eAAe,OAAf,IAA0B,eAAe,QAAf,CAAwB,eAAxB,CAAwC;AAFhE,KAAP;AAID,GArMc;;AAuMf,wBAAsB,8BAAU,OAAV,EAAmB;AACvC,QAAM,aAAc,mBAAmB,WAAW,UAA9B,GAChB,QAAQ,qBAAR,EADgB,GAEhB,QAAQ,cAAR,GAAyB,CAAzB,CAFJ;;AAIA,WAAO,cAAc;AACnB,YAAQ,WAAW,IADA;AAEnB,aAAQ,WAAW,KAFA;AAGnB,WAAQ,WAAW,GAHA;AAInB,cAAQ,WAAW,MAJA;AAKnB,aAAQ,WAAW,KAAX,IAAqB,WAAW,KAAX,GAAoB,WAAW,IALzC;AAMnB,cAAQ,WAAW,MAAX,IAAqB,WAAW,MAAX,GAAoB,WAAW;AANzC,KAArB;AAQD,GApNc;;AAsNf,kBAAgB,wBAAU,OAAV,EAAmB;AACjC,QAAM,aAAa,SAAS,oBAAT,CAA8B,OAA9B,CAAnB;;AAEA,QAAI,CAAC,QAAQ,MAAT,IAAmB,UAAvB,EAAmC;AACjC,UAAM,SAAS,SAAS,WAAT,CAAqB,IAAI,SAAJ,CAAc,OAAd,CAArB,CAAf;;AAEA,iBAAW,IAAX,IAAqB,OAAO,CAA5B;AACA,iBAAW,KAAX,IAAqB,OAAO,CAA5B;AACA,iBAAW,GAAX,IAAqB,OAAO,CAA5B;AACA,iBAAW,MAAX,IAAqB,OAAO,CAA5B;AACD;;AAED,WAAO,UAAP;AACD,GAnOc;;AAqOf,WAAS,iBAAU,OAAV,EAAmB;AAC1B,QAAM,OAAO,EAAb;;AAEA,WAAO,OAAP,EAAgB;AACd,WAAK,IAAL,CAAU,OAAV;AACA,gBAAU,SAAS,UAAT,CAAoB,OAApB,CAAV;AACD;;AAED,WAAO,IAAP;AACD,GA9Oc;;AAgPf,eAAa,4BAAS;AACpB,QAAI,CAAC,GAAG,MAAH,CAAU,KAAV,CAAL,EAAuB;AAAE,aAAO,KAAP;AAAe;;AAExC;AACA,eAAW,QAAX,CAAoB,aAApB,CAAkC,KAAlC;AACA,WAAO,IAAP;AACD;AAtPc,CAAjB;;AAyPA,OAAO,OAAP,GAAiB,QAAjB;;;;;AC9PA,IAAM,KAAO,QAAQ,MAAR,CAAb;AACA,IAAM,WAAW,QAAQ,YAAR,CAAjB;AACA,IAAM,UAAW,QAAQ,iBAAR,CAAjB;;eAE+B,QAAQ,UAAR,C;IAAvB,M,YAAA,M;IAAQ,S,YAAA,S;;gBACc,QAAQ,OAAR,C;IAAtB,O,aAAA,O;IAAS,Q,aAAA,Q;;AAEjB,IAAM,iBAAkB,iBAAiB,MAAlB,IAA6B,EAAE,sBAAsB,MAAxB,CAApD;AACA,IAAM,WAAiB,iBAAiB,aAAjB,GAAgC,kBAAvD;AACA,IAAM,cAAiB,iBAAiB,aAAjB,GAAgC,qBAAvD;AACA,IAAM,KAAiB,iBAAgB,IAAhB,GAAsB,EAA7C;;AAEA,IAAM,WAAoB,EAA1B;AACA,IAAM,UAAoB,EAA1B;AACA,IAAM,oBAAoB,EAA1B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAM,kBAAkB,EAAxB;;AAEA,IAAM,YAAY,EAAlB;;AAEA,IAAM,kBAAkB,CAAC,cAAD,IAAoB,YAAM;AAChD,MAAI,YAAY,KAAhB;;AAEA,SAAO,QAAP,CAAgB,aAAhB,CAA8B,KAA9B,EAAqC,gBAArC,CAAsD,MAAtD,EAA8D,IAA9D,EAAoE;AAClE,QAAI,OAAJ,GAAe;AAAE,kBAAY,IAAZ;AAAmB;AAD8B,GAApE;;AAIA,SAAO,SAAP;AACD,CAR0C,EAA3C;;AAUA,SAAS,GAAT,CAAc,OAAd,EAAuB,IAAvB,EAA6B,QAA7B,EAAuC,WAAvC,EAAoD;AAClD,MAAM,UAAU,WAAW,WAAX,CAAhB;AACA,MAAI,eAAe,QAAQ,QAAR,EAAkB,OAAlB,CAAnB;AACA,MAAI,SAAS,QAAQ,YAAR,CAAb;;AAEA,MAAI,CAAC,MAAL,EAAa;AACX,aAAS;AACP,cAAQ,EADD;AAEP,iBAAW;AAFJ,KAAT;;AAKA,mBAAe,SAAS,IAAT,CAAc,OAAd,IAAyB,CAAxC;AACA,YAAQ,IAAR,CAAa,MAAb;;AAEA,sBAAkB,IAAlB,CAAuB,iBACnB;AACA,gBAAU,EADV;AAEA,eAAU,EAFV;AAGA,gBAAU;AAHV,KADmB,GAMnB,IANJ;AAOD;;AAED,MAAI,CAAC,OAAO,MAAP,CAAc,IAAd,CAAL,EAA0B;AACxB,WAAO,MAAP,CAAc,IAAd,IAAsB,EAAtB;AACA,WAAO,SAAP;AACD;;AAED,MAAI,CAAC,SAAS,OAAO,MAAP,CAAc,IAAd,CAAT,EAA8B,QAA9B,CAAL,EAA8C;AAC5C,QAAI,YAAJ;;AAEA,QAAI,cAAJ,EAAoB;AAAA,kCACsB,kBAAkB,YAAlB,CADtB;AAAA,UACV,QADU,yBACV,QADU;AAAA,UACA,OADA,yBACA,OADA;AAAA,UACS,QADT,yBACS,QADT;;AAElB,UAAM,gBAAgB,QAAQ,QAAR,EAAkB,QAAlB,CAAtB;;AAEA,UAAM,kBAAkB,QAAQ,aAAR,KAA0B,UAAU,KAAV,EAAiB;AACjE,YAAI,CAAC,MAAM,2BAAX,EAAwC;AACtC,gBAAM,MAAN,GAAe,MAAM,UAArB;AACA,gBAAM,aAAN,GAAsB,OAAtB;;AAEA,gBAAM,cAAN,GAAiC,MAAM,cAAN,IAAkC,UAAnE;AACA,gBAAM,eAAN,GAAiC,MAAM,eAAN,IAAkC,QAAnE;AACA,gBAAM,wBAAN,GAAiC,MAAM,wBAAN,IAAkC,WAAnE;;AAEA,cAAI,cAAc,IAAd,CAAmB,MAAM,IAAzB,CAAJ,EAAoC;AAClC,kBAAM,KAAN,GAAc,MAAM,OAAN,GAAgB,UAAU,OAAV,EAAmB,QAAnB,CAA4B,eAA5B,CAA4C,UAA1E;AACA,kBAAM,KAAN,GAAc,MAAM,OAAN,GAAgB,UAAU,OAAV,EAAmB,QAAnB,CAA4B,eAA5B,CAA4C,SAA1E;AACD;;AAED,mBAAS,KAAT;AACD;AACF,OAhBD;;AAkBA,YAAM,QAAQ,QAAR,EAAkB,KAAK,IAAvB,EAA6B,eAA7B,EAA8C,CAAC,CAAC,QAAQ,OAAxD,CAAN;;AAEA,UAAI,kBAAkB,CAAC,CAAvB,EAA0B;AACxB,iBAAS,IAAT,CAAc,QAAd;AACA,gBAAQ,IAAR,CAAa,eAAb;AACA,iBAAS,IAAT,CAAc,CAAd;AACD,OAJD,MAKK;AACH,iBAAS,aAAT;AACD;AACF,KAhCD,MAiCK;AACH,YAAM,QAAQ,QAAR,EAAkB,IAAlB,EAAwB,QAAxB,EAAkC,kBAAiB,OAAjB,GAA2B,CAAC,CAAC,QAAQ,OAAvE,CAAN;AACD;AACD,WAAO,MAAP,CAAc,IAAd,EAAoB,IAApB,CAAyB,QAAzB;;AAEA,WAAO,GAAP;AACD;AACF;;AAED,SAAS,MAAT,CAAiB,OAAjB,EAA0B,IAA1B,EAAgC,QAAhC,EAA0C,WAA1C,EAAuD;AACrD,MAAM,UAAU,WAAW,WAAX,CAAhB;AACA,MAAM,eAAe,QAAQ,QAAR,EAAkB,OAAlB,CAArB;AACA,MAAM,SAAS,QAAQ,YAAR,CAAf;;AAEA,MAAI,CAAC,MAAD,IAAW,CAAC,OAAO,MAAvB,EAA+B;AAC7B;AACD;;AAED,MAAI,kBAAkB,QAAtB;AACA,MAAI,kBAAJ;AACA,MAAI,sBAAJ;;AAEA,MAAI,cAAJ,EAAoB;AAClB,gBAAY,kBAAkB,YAAlB,CAAZ;AACA,oBAAgB,QAAQ,UAAU,QAAlB,EAA4B,QAA5B,CAAhB;AACA,sBAAkB,UAAU,OAAV,CAAkB,aAAlB,CAAlB;AACD;;AAED,MAAI,SAAS,KAAb,EAAoB;AAClB,SAAK,IAAL,IAAa,OAAO,MAApB,EAA4B;AAC1B,UAAI,OAAO,MAAP,CAAc,cAAd,CAA6B,IAA7B,CAAJ,EAAwC;AACtC,eAAO,OAAP,EAAgB,IAAhB,EAAsB,KAAtB;AACD;AACF;AACD;AACD;;AAED,MAAI,OAAO,MAAP,CAAc,IAAd,CAAJ,EAAyB;AACvB,QAAM,MAAM,OAAO,MAAP,CAAc,IAAd,EAAoB,MAAhC;;AAEA,QAAI,aAAa,KAAjB,EAAwB;AACtB,WAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,GAApB,EAAyB,GAAzB,EAA8B;AAC5B,eAAO,OAAP,EAAgB,IAAhB,EAAsB,OAAO,MAAP,CAAc,IAAd,EAAoB,CAApB,CAAtB,EAA8C,OAA9C;AACD;AACD;AACD,KALD,MAMK;AACH,WAAK,IAAI,KAAI,CAAb,EAAgB,KAAI,GAApB,EAAyB,IAAzB,EAA8B;AAC5B,YAAI,OAAO,MAAP,CAAc,IAAd,EAAoB,EAApB,MAA2B,QAA/B,EAAyC;AACvC,kBAAQ,WAAR,EAAqB,KAAK,IAA1B,EAAgC,eAAhC,EAAiD,kBAAiB,OAAjB,GAA2B,CAAC,CAAC,QAAQ,OAAtF;AACA,iBAAO,MAAP,CAAc,IAAd,EAAoB,MAApB,CAA2B,EAA3B,EAA8B,CAA9B;;AAEA,cAAI,kBAAkB,SAAtB,EAAiC;AAC/B,sBAAU,QAAV,CAAmB,aAAnB;AACA,gBAAI,UAAU,QAAV,CAAmB,aAAnB,MAAsC,CAA1C,EAA6C;AAC3C,wBAAU,QAAV,CAAmB,MAAnB,CAA0B,aAA1B,EAAyC,CAAzC;AACA,wBAAU,OAAV,CAAkB,MAAlB,CAAyB,aAAzB,EAAwC,CAAxC;AACA,wBAAU,QAAV,CAAmB,MAAnB,CAA0B,aAA1B,EAAyC,CAAzC;AACD;AACF;;AAED;AACD;AACF;AACF;;AAED,QAAI,OAAO,MAAP,CAAc,IAAd,KAAuB,OAAO,MAAP,CAAc,IAAd,EAAoB,MAApB,KAA+B,CAA1D,EAA6D;AAC3D,aAAO,MAAP,CAAc,IAAd,IAAsB,IAAtB;AACA,aAAO,SAAP;AACD;AACF;;AAED,MAAI,CAAC,OAAO,SAAZ,EAAuB;AACrB,YAAQ,MAAR,CAAe,YAAf,EAA6B,CAA7B;AACA,aAAS,MAAT,CAAgB,YAAhB,EAA8B,CAA9B;AACA,sBAAkB,MAAlB,CAAyB,YAAzB,EAAuC,CAAvC;AACD;AACF;;AAED,SAAS,WAAT,CAAsB,QAAtB,EAAgC,OAAhC,EAAyC,IAAzC,EAA+C,QAA/C,EAAyD,WAAzD,EAAsE;AACpE,MAAM,UAAU,WAAW,WAAX,CAAhB;AACA,MAAI,CAAC,gBAAgB,IAAhB,CAAL,EAA4B;AAC1B,oBAAgB,IAAhB,IAAwB;AACtB,iBAAW,EADW;AAEtB,gBAAW,EAFW;AAGtB,iBAAW;AAHW,KAAxB;;AAMA;AACA,SAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,UAAU,MAA9B,EAAsC,GAAtC,EAA2C;AACzC,UAAI,UAAU,CAAV,CAAJ,EAAkB,IAAlB,EAAwB,gBAAxB;AACA,UAAI,UAAU,CAAV,CAAJ,EAAkB,IAAlB,EAAwB,kBAAxB,EAA4C,IAA5C;AACD;AACF;;AAED,MAAM,YAAY,gBAAgB,IAAhB,CAAlB;AACA,MAAI,cAAJ;;AAEA,OAAK,QAAQ,UAAU,SAAV,CAAoB,MAApB,GAA6B,CAA1C,EAA6C,SAAS,CAAtD,EAAyD,OAAzD,EAAkE;AAChE,QAAI,UAAU,SAAV,CAAoB,KAApB,MAA+B,QAA/B,IACG,UAAU,QAAV,CAAmB,KAAnB,MAA8B,OADrC,EAC8C;AAC5C;AACD;AACF;;AAED,MAAI,UAAU,CAAC,CAAf,EAAkB;AAChB,YAAQ,UAAU,SAAV,CAAoB,MAA5B;;AAEA,cAAU,SAAV,CAAoB,IAApB,CAAyB,QAAzB;AACA,cAAU,QAAV,CAAoB,IAApB,CAAyB,OAAzB;AACA,cAAU,SAAV,CAAoB,IAApB,CAAyB,EAAzB;AACD;;AAED;AACA,YAAU,SAAV,CAAoB,KAApB,EAA2B,IAA3B,CAAgC,CAAC,QAAD,EAAW,CAAC,CAAC,QAAQ,OAArB,EAA8B,QAAQ,OAAtC,CAAhC;AACD;;AAED,SAAS,cAAT,CAAyB,QAAzB,EAAmC,OAAnC,EAA4C,IAA5C,EAAkD,QAAlD,EAA4D,WAA5D,EAAyE;AACvE,MAAM,UAAU,WAAW,WAAX,CAAhB;AACA,MAAM,YAAY,gBAAgB,IAAhB,CAAlB;AACA,MAAI,aAAa,KAAjB;AACA,MAAI,cAAJ;;AAEA,MAAI,CAAC,SAAL,EAAgB;AAAE;AAAS;;AAE3B;AACA,OAAK,QAAQ,UAAU,SAAV,CAAoB,MAApB,GAA6B,CAA1C,EAA6C,SAAS,CAAtD,EAAyD,OAAzD,EAAkE;AAChE;AACA,QAAI,UAAU,SAAV,CAAoB,KAApB,MAA+B,QAA/B,IACG,UAAU,QAAV,CAAmB,KAAnB,MAA8B,OADrC,EAC8C;;AAE5C,UAAM,YAAY,UAAU,SAAV,CAAoB,KAApB,CAAlB;;AAEA;AACA,WAAK,IAAI,IAAI,UAAU,MAAV,GAAmB,CAAhC,EAAmC,KAAK,CAAxC,EAA2C,GAA3C,EAAgD;AAAA,2BACf,UAAU,CAAV,CADe;AAAA,YACvC,EADuC;AAAA,YACnC,OADmC;AAAA,YAC1B,OAD0B;;AAG9C;;AACA,YAAI,OAAO,QAAP,IAAmB,YAAY,CAAC,CAAC,QAAQ,OAAzC,IAAoD,YAAY,QAAQ,OAA5E,EAAqF;AACnF;AACA,oBAAU,MAAV,CAAiB,CAAjB,EAAoB,CAApB;;AAEA;AACA;AACA,cAAI,CAAC,UAAU,MAAf,EAAuB;AACrB,sBAAU,SAAV,CAAoB,MAApB,CAA2B,KAA3B,EAAkC,CAAlC;AACA,sBAAU,QAAV,CAAoB,MAApB,CAA2B,KAA3B,EAAkC,CAAlC;AACA,sBAAU,SAAV,CAAoB,MAApB,CAA2B,KAA3B,EAAkC,CAAlC;;AAEA;AACA,mBAAO,OAAP,EAAgB,IAAhB,EAAsB,gBAAtB;AACA,mBAAO,OAAP,EAAgB,IAAhB,EAAsB,kBAAtB,EAA0C,IAA1C;;AAEA;AACA,gBAAI,CAAC,UAAU,SAAV,CAAoB,MAAzB,EAAiC;AAC/B,8BAAgB,IAAhB,IAAwB,IAAxB;AACD;AACF;;AAED;AACA,uBAAa,IAAb;AACA;AACD;AACF;;AAED,UAAI,UAAJ,EAAgB;AAAE;AAAQ;AAC3B;AACF;AACF;;AAED;AACA;AACA,SAAS,gBAAT,CAA2B,KAA3B,EAAkC,WAAlC,EAA+C;AAC7C,MAAM,UAAU,WAAW,WAAX,CAAhB;AACA,MAAM,YAAY,EAAlB;AACA,MAAM,YAAY,gBAAgB,MAAM,IAAtB,CAAlB;AACA,MAAM,cAAe,SAAS,gBAAT,CAA0B,MAAM,IAAN,GAC3C,MAAM,IAAN,CAAW,CAAX,CAD2C,GAE3C,MAAM,MAFW,CAArB;AAGA,MAAI,UAAU,WAAd;;AAEA;AACA,UAAQ,SAAR,EAAmB,KAAnB;;AAEA,YAAU,aAAV,GAA0B,KAA1B;AACA,YAAU,cAAV,GAA2B,sBAA3B;;AAEA;AACA,SAAO,GAAG,OAAH,CAAW,OAAX,CAAP,EAA4B;AAC1B,SAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,UAAU,SAAV,CAAoB,MAAxC,EAAgD,GAAhD,EAAqD;AACnD,UAAM,WAAW,UAAU,SAAV,CAAoB,CAApB,CAAjB;AACA,UAAM,UAAU,UAAU,QAAV,CAAmB,CAAnB,CAAhB;;AAEA,UAAI,SAAS,eAAT,CAAyB,OAAzB,EAAkC,QAAlC,KACG,SAAS,YAAT,CAAsB,OAAtB,EAA+B,WAA/B,CADH,IAEG,SAAS,YAAT,CAAsB,OAAtB,EAA+B,OAA/B,CAFP,EAEgD;;AAE9C,YAAM,YAAY,UAAU,SAAV,CAAoB,CAApB,CAAlB;;AAEA,kBAAU,aAAV,GAA0B,OAA1B;;AAEA,aAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,UAAU,MAA9B,EAAsC,GAAtC,EAA2C;AAAA,6BACV,UAAU,CAAV,CADU;AAAA,cAClC,EADkC;AAAA,cAC9B,OAD8B;AAAA,cACrB,OADqB;;;AAGzC,cAAI,YAAY,CAAC,CAAC,QAAQ,OAAtB,IAAiC,YAAY,QAAQ,OAAzD,EAAkE;AAChE,eAAG,SAAH;AACD;AACF;AACF;AACF;;AAED,cAAU,SAAS,UAAT,CAAoB,OAApB,CAAV;AACD;AACF;;AAED,SAAS,kBAAT,CAA6B,KAA7B,EAAoC;AAClC,SAAO,iBAAiB,IAAjB,CAAsB,IAAtB,EAA4B,KAA5B,EAAmC,IAAnC,CAAP;AACD;;AAED,SAAS,UAAT,GAAuB;AACrB,OAAK,WAAL,GAAmB,KAAnB;AACD;;AAED,SAAS,sBAAT,GAAmC;AACjC,OAAK,aAAL,CAAmB,cAAnB;AACD;;AAED,SAAS,QAAT,GAAqB;AACnB,OAAK,YAAL,GAAoB,IAApB;AACD;;AAED,SAAS,WAAT,GAAwB;AACtB,OAAK,YAAL,GAAoB,IAApB;AACA,OAAK,2BAAL,GAAmC,IAAnC;AACD;;AAED,SAAS,UAAT,CAAqB,KAArB,EAA4B;AAC1B,SAAO,GAAG,MAAH,CAAU,KAAV,IAAkB,KAAlB,GAA0B,EAAE,SAAS,KAAX,EAAjC;AACD;;AAED,OAAO,OAAP,GAAiB;AACf,UADe;AAEf,gBAFe;;AAIf,0BAJe;AAKf,gCALe;;AAOf,oCAPe;AAQf,wCARe;AASf,kCATe;AAUf,sBAVe;;AAYf,gCAZe;AAaf,kCAbe;;AAef,aAAW,QAfI;AAgBf,YAAU,OAhBK;AAiBf,sBAAoB;AAjBL,CAAjB;;;;;ACrVA,OAAO,OAAP,GAAiB,SAAS,MAAT,CAAiB,IAAjB,EAAuB,MAAvB,EAA+B;AAC9C,OAAK,IAAM,IAAX,IAAmB,MAAnB,EAA2B;AACzB,SAAK,IAAL,IAAa,OAAO,IAAP,CAAb;AACD;AACD,SAAO,IAAP;AACD,CALD;;;;;eCGI,QAAQ,QAAR,C;IAFF,e,YAAA,e;IACA,Q,YAAA,Q;;AAGF,OAAO,OAAP,GAAiB,UAAU,MAAV,EAAkB,OAAlB,EAA2B,MAA3B,EAAmC;AAClD,MAAM,gBAAgB,OAAO,OAAP,CAAe,MAAf,CAAtB;AACA,MAAM,eAAe,iBAAiB,cAAc,MAApD;AACA,MAAM,SAAS,gBAAgB,OAAO,OAAP,CAAe,MAA9C;;AAEA,MAAM,aAAa,gBAAgB,MAAhB,EAAwB,MAAxB,EAAgC,OAAhC,EAAyC,CAAC,UAAU,OAAX,CAAzC,CAAnB;;AAEA,SAAO,SAAS,UAAT,KAAwB,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EAA/B;AACD,CARD;;;;;ACLA,OAAO,OAAP,GAAiB,UAAC,CAAD,EAAI,CAAJ;AAAA,SAAW,KAAK,IAAL,CAAU,IAAI,CAAJ,GAAQ,IAAI,CAAtB,CAAX;AAAA,CAAjB;;;;;ACAA,IAAM,SAAS,QAAQ,UAAR,CAAf;AACA,IAAM,MAAS,QAAQ,UAAR,CAAf;;AAEA,IAAM,QAAQ;AACZ,YAAU,kBAAU,MAAV,EAAkB,OAAlB,EAA2B;AACnC,QAAI,SAAS,KAAb;;AAEA,WAAO,YAAY;AACjB,UAAI,CAAC,MAAL,EAAa;AACX,YAAI,MAAJ,CAAW,OAAX,CAAmB,IAAnB,CAAwB,OAAxB;AACA,iBAAS,IAAT;AACD;;AAED,aAAO,OAAO,KAAP,CAAa,IAAb,EAAmB,SAAnB,CAAP;AACD,KAPD;AAQD,GAZW;;AAcZ;AACA,oBAAkB,0BAAU,CAAV,EAAa,EAAb,EAAiB,EAAjB,EAAqB,EAArB,EAAyB;AACzC,QAAM,KAAK,IAAI,CAAf;AACA,WAAO,KAAK,EAAL,GAAU,EAAV,GAAe,IAAI,EAAJ,GAAS,CAAT,GAAa,EAA5B,GAAiC,IAAI,CAAJ,GAAQ,EAAhD;AACD,GAlBW;;AAoBZ,0BAAwB,gCAAU,MAAV,EAAkB,MAAlB,EAA0B,GAA1B,EAA+B,GAA/B,EAAoC,IAApC,EAA0C,IAA1C,EAAgD,QAAhD,EAA0D;AAChF,WAAO;AACL,SAAI,MAAM,gBAAN,CAAuB,QAAvB,EAAiC,MAAjC,EAAyC,GAAzC,EAA8C,IAA9C,CADC;AAEL,SAAI,MAAM,gBAAN,CAAuB,QAAvB,EAAiC,MAAjC,EAAyC,GAAzC,EAA8C,IAA9C;AAFC,KAAP;AAID,GAzBW;;AA2BZ;AACA,eAAa,qBAAU,CAAV,EAAa,CAAb,EAAgB,CAAhB,EAAmB,CAAnB,EAAsB;AACjC,SAAK,CAAL;AACA,WAAO,CAAC,CAAD,GAAK,CAAL,IAAQ,IAAE,CAAV,IAAe,CAAtB;AACD,GA/BW;;AAiCZ,cAAY,oBAAU,IAAV,EAAgB,GAAhB,EAAqB;AAC/B,SAAK,IAAL,GAAa,IAAI,IAAjB;AACA,SAAK,IAAL,GAAa,IAAI,IAAjB;AACA,SAAK,KAAL,GAAa,IAAI,KAAjB;;AAEA,WAAO,IAAP;AACD,GAvCW;;AAyCZ,MAAa,QAAQ,MAAR,CAzCD;AA0CZ,UAAa,MA1CD;AA2CZ,SAAa,QAAQ,SAAR,CA3CD;AA4CZ,eAAa,QAAQ,eAAR;AA5CD,CAAd;;AA+CA,OAAO,KAAP,EAAc,QAAQ,OAAR,CAAd;AACA,OAAO,KAAP,EAAc,QAAQ,YAAR,CAAd;AACA,OAAO,KAAP,EAAc,QAAQ,gBAAR,CAAd;AACA,OAAO,KAAP,EAAc,QAAQ,QAAR,CAAd;;AAEA,OAAO,OAAP,GAAiB,KAAjB;;;;;ACvDA,IAAM,QAAU,QAAQ,UAAR,CAAhB;AACA,IAAM,QAAU,QAAQ,SAAR,CAAhB;AACA,IAAM,UAAU,QAAQ,WAAR,CAAhB;;AAEA,IAAM,SAAS;AACb,eAAa,CAAE,kBAAF,EAAsB,OAAtB,EAA+B,YAA/B,EAA6C,MAA7C,CADA;;AAGb,UAAQ,gBAAU,OAAV,EAAmB,SAAnB,EAA8B,WAA9B,EAA2C;AACjD,QAAM,aAAc,SAAS,IAAT,CAAc,QAAQ,WAAR,IAAuB,SAArC;AACA;AADA,OAEG,QAAQ,WAAR,KAAwB,CAF/C;AAGA,QAAM,YAAY,MAAM,YAAN,CAAmB,OAAnB,CAAlB;AACA,QAAM,UAAU,EAAE,gBAAF,EAAW,oBAAX,EAAsB,sBAAtB,EAAkC,oBAAlC,EAA6C,wBAA7C,EAAhB;;AAEA,yBAAqB,OAAO,WAA5B,kHAAyC;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAA9B,MAA8B;;AACvC,UAAM,cAAc,OAAO,MAAP,EAAe,OAAf,CAApB;;AAEA,UAAI,WAAJ,EAAiB;AACf,eAAO,WAAP;AACD;AACF;AACF,GAjBY;;AAmBb;AACA,oBAAkB,iCAAkD;AAAA,QAAtC,UAAsC,SAAtC,UAAsC;AAAA,QAA1B,SAA0B,SAA1B,SAA0B;AAAA,QAAf,WAAe,SAAf,WAAe;;AAClE,QAAI,CAAC,cAAc,IAAd,CAAmB,SAAnB,CAAL,EAAoC;AAClC,aAAO,IAAP;AACD;;AAED,0BAA0B,MAAM,YAAhC,yHAA8C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAAnC,WAAmC;;AAC5C,UAAI,UAAU,WAAd;;AAEA,UAAI,YAAY,UAAZ,IAA0B,YAAY,UAAZ,CAAuB,WAAjD,IACI,YAAY,KAAZ,KAAsB,UAD9B,EAC2C;AACzC,eAAO,OAAP,EAAgB;AACd;AACA,cAAI,YAAY,YAAY,OAA5B,EAAqC;AACnC,mBAAO,WAAP;AACD;AACD,oBAAU,MAAM,UAAN,CAAiB,OAAjB,CAAV;AACD;AACF;AACF;;AAED,WAAO,IAAP;AACD,GAzCY;;AA2Cb;AACA,SAAO,sBAAgD;AAAA,QAApC,SAAoC,SAApC,SAAoC;AAAA,QAAzB,UAAyB,SAAzB,UAAyB;AAAA,QAAb,SAAa,SAAb,SAAa;;AACrD,QAAI,CAAC,UAAD,KAAgB,QAAQ,aAAR,IAAyB,QAAQ,oBAAjD,CAAJ,EAA4E;AAC1E,aAAO,IAAP;AACD;;AAED,QAAI,uBAAJ;;AAEA,0BAA0B,MAAM,YAAhC,yHAA8C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAAnC,WAAmC;;AAC5C,UAAI,YAAY,KAAhB,EAAuB;AACrB;AACA,YAAI,YAAY,UAAZ,IAA0B,CAAC,MAAM,QAAN,CAAe,YAAY,UAA3B,EAAuC,SAAvC,CAA/B,EAAkF;AAAE;AAAW;;AAE/F;AACA,YAAI,YAAY,WAAZ,EAAJ,EAA+B;AAC7B,iBAAO,WAAP;AACD;AACD;AAHA,aAIK,IAAI,CAAC,cAAL,EAAqB;AACxB,6BAAiB,WAAjB;AACD;AACF;AACF;;AAED;AACA;AACA,QAAI,cAAJ,EAAoB;AAClB,aAAO,cAAP;AACD;;AAED;AACA;AACA;AACA,0BAA0B,MAAM,YAAhC,yHAA8C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAAnC,YAAmC;;AAC5C,UAAI,aAAY,KAAZ,IAAqB,EAAE,OAAO,IAAP,CAAY,SAAZ,KAA0B,aAAY,UAAxC,CAAzB,EAA8E;AAC5E,eAAO,YAAP;AACD;AACF;;AAED,WAAO,IAAP;AACD,GAnFY;;AAqFb;AACA,cAAY,2BAAyB;AAAA,QAAb,SAAa,SAAb,SAAa;;AACnC,0BAA0B,MAAM,YAAhC,yHAA8C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAAnC,WAAmC;;AAC5C,UAAI,MAAM,QAAN,CAAe,YAAY,UAA3B,EAAuC,SAAvC,CAAJ,EAAuD;AACrD,eAAO,WAAP;AACD;AACF;AACF,GA5FY;;AA8Fb;AACA,QAAM,qBAA0B;AAAA,QAAd,UAAc,SAAd,UAAc;;AAC9B,0BAA0B,MAAM,YAAhC,yHAA8C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAAnC,WAAmC;;AAC5C;AACA,UAAI,YAAY,UAAZ,CAAuB,MAAvB,KAAkC,CAAtC,EAAyC;AACvC,YAAM,SAAS,YAAY,MAA3B;AACA;AACA;AACA,YAAI,UAAU,CAAC,OAAO,OAAP,CAAe,OAAf,CAAuB,OAAtC,EAA+C;AAC7C;AACD;AACF;AACD;AARA,WASK,IAAI,YAAY,UAAZ,CAAuB,MAAvB,IAAiC,CAArC,EAAwC;AAC3C;AACD;;AAED,UAAI,CAAC,YAAY,WAAZ,EAAD,IAA+B,eAAe,YAAY,KAA9D,EAAsE;AACpE,eAAO,WAAP;AACD;AACF;;AAED,WAAO,IAAP;AACD;AArHY,CAAf;;AAwHA,OAAO,OAAP,GAAiB,MAAjB;;;;;;;AC5HA,IAAM,MAAa,QAAQ,UAAR,CAAnB;AACA,IAAM,WAAa,QAAQ,YAAR,CAAnB;;AAEA,IAAM,KAAK;AACT,SAAU,iBAAM,CAAE,CADT;;AAGT,UAAU;AAAA,WAAS,UAAU,IAAI,MAAd,IAAwB,SAAS,KAAT,CAAjC;AAAA,GAHD;;AAKT,WAAU;AAAA,WAAS,GAAG,MAAH,CAAU,KAAV,KAAoB,MAAM,QAAN,KAAmB,EAAhD;AAAA,GALD;;AAOT,UAAU;AAAA,WAAS,CAAC,CAAC,KAAF,IAAY,QAAO,KAAP,yCAAO,KAAP,OAAiB,QAAtC;AAAA,GAPD;;AAST,YAAU;AAAA,WAAS,OAAO,KAAP,KAAiB,UAA1B;AAAA,GATD;;AAWT,UAAU;AAAA,WAAS,OAAO,KAAP,KAAiB,QAA1B;AAAA,GAXD;;AAaT,QAAU;AAAA,WAAS,OAAO,KAAP,KAAiB,SAA1B;AAAA,GAbD;;AAeT,UAAU;AAAA,WAAS,OAAO,KAAP,KAAiB,QAA1B;AAAA,GAfD;;AAiBT,WAAS,wBAAS;AAChB,QAAI,CAAC,KAAD,IAAW,QAAO,KAAP,yCAAO,KAAP,OAAiB,QAAhC,EAA2C;AAAE,aAAO,KAAP;AAAe;;AAE5D,QAAM,UAAU,IAAI,SAAJ,CAAc,KAAd,KAAwB,IAAI,MAA5C;;AAEA,WAAQ,mBAAkB,IAAlB,SAA8B,QAAQ,OAAtC,KACJ,iBAAiB,QAAQ,OADrB,CAC6B;AAD7B,QAEJ,MAAM,QAAN,KAAmB,CAAnB,IAAwB,OAAO,MAAM,QAAb,KAA0B;AAFtD;AAGD;AAzBQ,CAAX;;AA4BA,GAAG,KAAH,GAAW;AAAA,SAAU,GAAG,MAAH,CAAU,KAAV,KACf,OAAO,MAAM,MAAb,KAAwB,WADT,IAEhB,GAAG,QAAH,CAAY,MAAM,MAAlB,CAFM;AAAA,CAAX;;AAIA,OAAO,OAAP,GAAiB,EAAjB;;;;;ACnCA,OAAO,OAAP,GAAiB,UAAC,KAAD;AAAA,SAAW,CAAC,EAAE,SAAS,MAAM,MAAjB,CAAD,IAA8B,iBAAiB,MAAM,MAAhE;AAAA,CAAjB;;;;;ACAA,SAAS,aAAT,CAAwB,IAAxB,EAA8B,MAA9B,EAAsC;AACpC,OAAK,IAAM,IAAX,IAAmB,MAAnB,EAA2B;AACzB,QAAM,kBAAkB,OAAO,OAAP,CAAe,eAAvC;AACA,QAAI,aAAa,KAAjB;;AAEA;AACA,SAAK,IAAM,MAAX,IAAqB,eAArB,EAAsC;AACpC,UAAI,KAAK,OAAL,CAAa,MAAb,MAAyB,CAAzB,IAA8B,gBAAgB,MAAhB,EAAwB,IAAxB,CAA6B,IAA7B,CAAlC,EAAsE;AACpE,qBAAa,IAAb;AACA;AACD;AACF;;AAED,QAAI,CAAC,UAAD,IAAe,OAAO,OAAO,IAAP,CAAP,KAAwB,UAA3C,EAAuD;AACrD,WAAK,IAAL,IAAa,OAAO,IAAP,CAAb;AACD;AACF;AACD,SAAO,IAAP;AACD;;AAED,cAAc,eAAd,GAAgC;AAC9B,UAAQ;AADsB,CAAhC;;AAIA,OAAO,OAAP,GAAiB,aAAjB;;;;;ACxBA,IAAM,QAAgB,QAAQ,SAAR,CAAtB;AACA,IAAM,UAAgB,QAAQ,WAAR,CAAtB;AACA,IAAM,MAAgB,QAAQ,cAAR,CAAtB;AACA,IAAM,WAAgB,QAAQ,YAAR,CAAtB;AACA,IAAM,KAAgB,QAAQ,MAAR,CAAtB;AACA,IAAM,gBAAgB,QAAQ,iBAAR,CAAtB;;AAEA,IAAM,eAAe;AACnB,cAAY,oBAAU,IAAV,EAAgB,GAAhB,EAAqB;AAC/B,SAAK,IAAL,GAAY,KAAK,IAAL,IAAa,EAAzB;AACA,SAAK,IAAL,CAAU,CAAV,GAAc,IAAI,IAAJ,CAAS,CAAvB;AACA,SAAK,IAAL,CAAU,CAAV,GAAc,IAAI,IAAJ,CAAS,CAAvB;;AAEA,SAAK,MAAL,GAAc,KAAK,MAAL,IAAe,EAA7B;AACA,SAAK,MAAL,CAAY,CAAZ,GAAgB,IAAI,MAAJ,CAAW,CAA3B;AACA,SAAK,MAAL,CAAY,CAAZ,GAAgB,IAAI,MAAJ,CAAW,CAA3B;;AAEA,SAAK,SAAL,GAAiB,IAAI,SAArB;AACD,GAXkB;;AAanB,kBAAgB,wBAAU,SAAV,EAAqB,IAArB,EAA2B,GAA3B,EAAgC;AAC9C,cAAU,IAAV,CAAe,CAAf,GAAsB,IAAI,IAAJ,CAAS,CAAT,GAAgB,KAAK,IAAL,CAAU,CAAhD;AACA,cAAU,IAAV,CAAe,CAAf,GAAsB,IAAI,IAAJ,CAAS,CAAT,GAAgB,KAAK,IAAL,CAAU,CAAhD;AACA,cAAU,MAAV,CAAiB,CAAjB,GAAsB,IAAI,MAAJ,CAAW,CAAX,GAAgB,KAAK,MAAL,CAAY,CAAlD;AACA,cAAU,MAAV,CAAiB,CAAjB,GAAsB,IAAI,MAAJ,CAAW,CAAX,GAAgB,KAAK,MAAL,CAAY,CAAlD;AACA,cAAU,SAAV,GAAsB,IAAI,SAAJ,GAAgB,KAAK,SAA3C;;AAEA;AACA,QAAM,KAAK,KAAK,GAAL,CAAS,UAAU,SAAV,GAAsB,IAA/B,EAAqC,KAArC,CAAX;;AAEA,cAAU,IAAV,CAAe,KAAf,GAAyB,MAAM,UAAU,IAAV,CAAe,CAArB,EAAwB,UAAU,IAAV,CAAe,CAAvC,IAA4C,EAArE;AACA,cAAU,IAAV,CAAe,EAAf,GAAyB,UAAU,IAAV,CAAe,CAAf,GAAmB,EAA5C;AACA,cAAU,IAAV,CAAe,EAAf,GAAyB,UAAU,IAAV,CAAe,CAAf,GAAmB,EAA5C;;AAEA,cAAU,MAAV,CAAiB,KAAjB,GAAyB,MAAM,UAAU,MAAV,CAAiB,CAAvB,EAA0B,UAAU,IAAV,CAAe,CAAzC,IAA8C,EAAvE;AACA,cAAU,MAAV,CAAiB,EAAjB,GAAyB,UAAU,MAAV,CAAiB,CAAjB,GAAqB,EAA9C;AACA,cAAU,MAAV,CAAiB,EAAjB,GAAyB,UAAU,MAAV,CAAiB,CAAjB,GAAqB,EAA9C;AACD,GA9BkB;;AAgCnB,mBAAiB,yBAAW,OAAX,EAAoB;AACnC,WAAQ,mBAAmB,IAAI,KAAvB,IAAgC,mBAAmB,IAAI,KAA/D;AACD,GAlCkB;;AAoCnB;AACA,SAAO,eAAU,IAAV,EAAgB,OAAhB,EAAyB,EAAzB,EAA6B;AAClC,SAAK,MAAM,EAAX;AACA,WAAO,QAAQ,MAAf;;AAEA,OAAG,CAAH,GAAO,QAAQ,OAAO,GAAf,CAAP;AACA,OAAG,CAAH,GAAO,QAAQ,OAAO,GAAf,CAAP;;AAEA,WAAO,EAAP;AACD,GA7CkB;;AA+CnB,aAAW,mBAAU,OAAV,EAAmB,IAAnB,EAAyB;AAClC,WAAO,QAAQ,EAAf;;AAEA;AACA,QAAI,QAAQ,aAAR,IAAyB,aAAa,eAAb,CAA6B,OAA7B,CAA7B,EAAoE;AAClE,mBAAa,KAAb,CAAmB,QAAnB,EAA6B,OAA7B,EAAsC,IAAtC;;AAEA,WAAK,CAAL,IAAU,OAAO,OAAjB;AACA,WAAK,CAAL,IAAU,OAAO,OAAjB;AACD,KALD,MAMK;AACH,mBAAa,KAAb,CAAmB,MAAnB,EAA2B,OAA3B,EAAoC,IAApC;AACD;;AAED,WAAO,IAAP;AACD,GA9DkB;;AAgEnB,eAAa,qBAAU,OAAV,EAAmB,MAAnB,EAA2B;AACtC,aAAS,UAAU,EAAnB;;AAEA,QAAI,QAAQ,aAAR,IAAyB,aAAa,eAAb,CAA6B,OAA7B,CAA7B,EAAoE;AAClE;AACA,mBAAa,KAAb,CAAmB,QAAnB,EAA6B,OAA7B,EAAsC,MAAtC;AACD,KAHD,MAIK;AACH,mBAAa,KAAb,CAAmB,QAAnB,EAA6B,OAA7B,EAAsC,MAAtC;AACD;;AAED,WAAO,MAAP;AACD,GA5EkB;;AA8EnB,gBAAc,sBAAU,OAAV,EAAmB;AAC/B,WAAO,GAAG,MAAH,CAAU,QAAQ,SAAlB,IAA8B,QAAQ,SAAtC,GAAkD,QAAQ,UAAjE;AACD,GAhFkB;;AAkFnB,aAAW,mBAAU,SAAV,EAAqB,QAArB,EAA+B,SAA/B,EAA0C;AACnD,QAAM,UAAW,SAAS,MAAT,GAAkB,CAAlB,GACE,aAAa,cAAb,CAA4B,QAA5B,CADF,GAEE,SAAS,CAAT,CAFnB;;AAIA,QAAM,QAAQ,EAAd;;AAEA,iBAAa,SAAb,CAAuB,OAAvB,EAAgC,KAAhC;AACA,cAAU,IAAV,CAAe,CAAf,GAAmB,MAAM,CAAzB;AACA,cAAU,IAAV,CAAe,CAAf,GAAmB,MAAM,CAAzB;;AAEA,iBAAa,WAAb,CAAyB,OAAzB,EAAkC,KAAlC;AACA,cAAU,MAAV,CAAiB,CAAjB,GAAqB,MAAM,CAA3B;AACA,cAAU,MAAV,CAAiB,CAAjB,GAAqB,MAAM,CAA3B;;AAEA,cAAU,SAAV,GAAsB,GAAG,MAAH,CAAU,SAAV,IAAuB,SAAvB,GAAkC,IAAI,IAAJ,GAAW,OAAX,EAAxD;AACD,GAlGkB;;AAoGnB,iBAAe,aApGI;;AAsGnB,gBAAc,sBAAU,KAAV,EAAiB;AAC7B,QAAM,UAAU,EAAhB;;AAEA;AACA,QAAI,GAAG,KAAH,CAAS,KAAT,CAAJ,EAAqB;AACnB,cAAQ,CAAR,IAAa,MAAM,CAAN,CAAb;AACA,cAAQ,CAAR,IAAa,MAAM,CAAN,CAAb;AACD;AACD;AAJA,SAKK;AACH,YAAI,MAAM,IAAN,KAAe,UAAnB,EAA+B;AAC7B,cAAI,MAAM,OAAN,CAAc,MAAd,KAAyB,CAA7B,EAAgC;AAC9B,oBAAQ,CAAR,IAAa,MAAM,OAAN,CAAc,CAAd,CAAb;AACA,oBAAQ,CAAR,IAAa,MAAM,cAAN,CAAqB,CAArB,CAAb;AACD,WAHD,MAIK,IAAI,MAAM,OAAN,CAAc,MAAd,KAAyB,CAA7B,EAAgC;AACnC,oBAAQ,CAAR,IAAa,MAAM,cAAN,CAAqB,CAArB,CAAb;AACA,oBAAQ,CAAR,IAAa,MAAM,cAAN,CAAqB,CAArB,CAAb;AACD;AACF,SATD,MAUK;AACH,kBAAQ,CAAR,IAAa,MAAM,OAAN,CAAc,CAAd,CAAb;AACA,kBAAQ,CAAR,IAAa,MAAM,OAAN,CAAc,CAAd,CAAb;AACD;AACF;;AAED,WAAO,OAAP;AACD,GAjIkB;;AAmInB,kBAAgB,wBAAU,QAAV,EAAoB;AAClC,QAAM,UAAU;AACd,aAAS,CADK;AAEd,aAAS,CAFK;AAGd,eAAS,CAHK;AAId,eAAS,CAJK;AAKd,eAAS,CALK;AAMd,eAAS;AANK,KAAhB;;AASA,yBAAsB,QAAtB,kHAAgC;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAArB,OAAqB;;AAC9B,WAAK,IAAM,KAAX,IAAmB,OAAnB,EAA4B;AAC1B,gBAAQ,KAAR,KAAiB,QAAQ,KAAR,CAAjB;AACD;AACF;AACD,SAAK,IAAM,IAAX,IAAmB,OAAnB,EAA4B;AAC1B,cAAQ,IAAR,KAAiB,SAAS,MAA1B;AACD;;AAED,WAAO,OAAP;AACD,GAvJkB;;AAyJnB,aAAW,mBAAU,KAAV,EAAiB;AAC1B,QAAI,CAAC,MAAM,MAAP,IAAiB,EAAE,MAAM,OAAN,IAAiB,MAAM,OAAN,CAAc,MAAd,GAAuB,CAA1C,CAArB,EAAmE;AACjE;AACD;;AAED,QAAM,UAAU,aAAa,YAAb,CAA0B,KAA1B,CAAhB;AACA,QAAM,OAAO,KAAK,GAAL,CAAS,QAAQ,CAAR,EAAW,KAApB,EAA2B,QAAQ,CAAR,EAAW,KAAtC,CAAb;AACA,QAAM,OAAO,KAAK,GAAL,CAAS,QAAQ,CAAR,EAAW,KAApB,EAA2B,QAAQ,CAAR,EAAW,KAAtC,CAAb;AACA,QAAM,OAAO,KAAK,GAAL,CAAS,QAAQ,CAAR,EAAW,KAApB,EAA2B,QAAQ,CAAR,EAAW,KAAtC,CAAb;AACA,QAAM,OAAO,KAAK,GAAL,CAAS,QAAQ,CAAR,EAAW,KAApB,EAA2B,QAAQ,CAAR,EAAW,KAAtC,CAAb;;AAEA,WAAO;AACL,SAAG,IADE;AAEL,SAAG,IAFE;AAGL,YAAM,IAHD;AAIL,WAAK,IAJA;AAKL,aAAO,OAAO,IALT;AAML,cAAQ,OAAO;AANV,KAAP;AAQD,GA5KkB;;AA8KnB,iBAAe,uBAAU,KAAV,EAAiB,WAAjB,EAA8B;AAC3C,QAAM,UAAU,cAAc,GAA9B;AACA,QAAM,UAAU,cAAc,GAA9B;AACA,QAAM,UAAU,aAAa,YAAb,CAA0B,KAA1B,CAAhB;;AAGA,QAAM,KAAK,QAAQ,CAAR,EAAW,OAAX,IAAsB,QAAQ,CAAR,EAAW,OAAX,CAAjC;AACA,QAAM,KAAK,QAAQ,CAAR,EAAW,OAAX,IAAsB,QAAQ,CAAR,EAAW,OAAX,CAAjC;;AAEA,WAAO,MAAM,EAAN,EAAU,EAAV,CAAP;AACD,GAxLkB;;AA0LnB,cAAY,oBAAU,KAAV,EAAiB,SAAjB,EAA4B,WAA5B,EAAyC;AACnD,QAAM,UAAU,cAAc,GAA9B;AACA,QAAM,UAAU,cAAc,GAA9B;AACA,QAAM,UAAU,aAAa,YAAb,CAA0B,KAA1B,CAAhB;AACA,QAAM,KAAK,QAAQ,CAAR,EAAW,OAAX,IAAsB,QAAQ,CAAR,EAAW,OAAX,CAAjC;AACA,QAAM,KAAK,QAAQ,CAAR,EAAW,OAAX,IAAsB,QAAQ,CAAR,EAAW,OAAX,CAAjC;AACA,QAAM,QAAQ,MAAM,KAAK,KAAL,CAAW,EAAX,EAAgB,EAAhB,CAAN,GAA4B,KAAK,EAA/C;;AAEA,WAAQ,KAAR;AACD,GAnMkB;;AAqMnB,kBAAgB,wBAAU,OAAV,EAAmB,WAAnB,EAAgC;AAC9C;AACA;AACA,QAAI,YAAY,KAAhB,EAAmC;AAAE,aAAO,OAAP;AAAiB;AACtD,QAAI,CAAC,QAAQ,oBAAb,EAAmC;AAAE,aAAO,OAAP;AAAiB;;AAEtD,WAAO,GAAG,MAAH,CAAU,QAAQ,WAAlB,IACH,QAAQ,WADL,GAEH,CAAC,SAAD,EAAY,SAAZ,EAAsB,OAAtB,EAA+B,KAA/B,EAAsC,OAAtC,EAA+C,QAAQ,WAAvD,CAFJ;AAGD,GA9MkB;;AAgNnB;AACA,mBAAiB,yBAAU,KAAV,EAAiB;AAChC,WAAO,CACL,SAAS,gBAAT,CAA0B,MAAM,IAAN,GAAa,MAAM,IAAN,CAAW,CAAX,CAAb,GAA6B,MAAM,MAA7D,CADK,EAEL,SAAS,gBAAT,CAA0B,MAAM,aAAhC,CAFK,CAAP;AAID;AAtNkB,CAArB;;AAyNA,OAAO,OAAP,GAAiB,YAAjB;;;;;eChOmB,QAAQ,UAAR,C;IAAX,M,YAAA,M;;AAER,IAAM,UAAU,CAAC,IAAD,EAAO,KAAP,EAAc,QAAd,EAAwB,GAAxB,CAAhB;AACA,IAAI,WAAW,CAAf;AACA,IAAI,gBAAJ;AACA,IAAI,eAAJ;;AAEA,KAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,QAAQ,MAAZ,IAAsB,CAAC,OAAO,qBAA9C,EAAqE,GAArE,EAA0E;AACxE,YAAU,OAAO,QAAQ,CAAR,IAAa,uBAApB,CAAV;AACA,WAAS,OAAO,QAAQ,CAAR,IAAY,sBAAnB,KAA8C,OAAO,QAAQ,CAAR,IAAa,6BAApB,CAAvD;AACD;;AAED,IAAI,CAAC,OAAL,EAAc;AACZ,YAAU,iBAAU,QAAV,EAAoB;AAC5B,QAAM,WAAW,IAAI,IAAJ,GAAW,OAAX,EAAjB;AACA,QAAM,aAAa,KAAK,GAAL,CAAS,CAAT,EAAY,MAAM,WAAW,QAAjB,CAAZ,CAAnB;AACA,QAAM,KAAK,WAAW,YAAY;AAAE,eAAS,WAAW,UAApB;AAAkC,KAA3D,EACW,UADX,CAAX;;AAGA,eAAW,WAAW,UAAtB;AACA,WAAO,EAAP;AACD,GARD;AASD;;AAED,IAAI,CAAC,MAAL,EAAa;AACX,WAAS,gBAAU,EAAV,EAAc;AACrB,iBAAa,EAAb;AACD,GAFD;AAGD;;AAED,OAAO,OAAP,GAAiB;AACf,kBADe;AAEf;AAFe,CAAjB;;;;;AC9BA,IAAM,SAAS,QAAQ,UAAR,CAAf;AACA,IAAM,KAAK,QAAQ,MAAR,CAAX;;eAKI,QAAQ,YAAR,C;IAHF,O,YAAA,O;IACA,U,YAAA,U;IACA,c,YAAA,c;;AAGF,IAAM,YAAY;AAChB,yBAAuB,+BAAU,KAAV,EAAiB,YAAjB,EAA+B,OAA/B,EAAwC;AAC7D,QAAI,CAAC,GAAG,MAAH,CAAU,KAAV,CAAL,EAAuB;AACrB,aAAO,IAAP;AACD;;AAED,QAAI,UAAU,QAAd,EAAwB;AACtB,cAAQ,WAAW,OAAX,CAAR;AACD,KAFD,MAGK,IAAI,UAAU,MAAd,EAAsB;AACzB,cAAQ,aAAa,OAAb,CAAqB,OAArB,CAAR;AACD,KAFI,MAGA;AACH,cAAQ,QAAQ,OAAR,EAAiB,KAAjB,CAAR;AACD;;AAED,WAAO,KAAP;AACD,GAjBe;;AAmBhB,mBAAiB,yBAAU,KAAV,EAAiB,YAAjB,EAA+B,OAA/B,EAAwC,YAAxC,EAAsD;AACrE,YAAQ,UAAU,qBAAV,CAAgC,KAAhC,EAAuC,YAAvC,EAAqD,OAArD,KAAiE,KAAzE;;AAEA,QAAI,GAAG,QAAH,CAAY,KAAZ,CAAJ,EAAwB;AACtB,cAAQ,MAAM,KAAN,CAAY,IAAZ,EAAkB,YAAlB,CAAR;AACD;;AAED,QAAI,GAAG,OAAH,CAAW,KAAX,CAAJ,EAAuB;AACrB,cAAQ,eAAe,KAAf,CAAR;AACD;;AAED,WAAO,KAAP;AACD,GA/Be;;AAiChB,YAAU,kBAAU,IAAV,EAAgB;AACxB,WAAQ,QAAQ;AACd,SAAG,OAAO,IAAP,GAAc,KAAK,CAAnB,GAAuB,KAAK,IADjB;AAEd,SAAG,OAAO,IAAP,GAAc,KAAK,CAAnB,GAAuB,KAAK;AAFjB,KAAhB;AAID,GAtCe;;AAwChB,cAAY,oBAAU,IAAV,EAAgB;AAC1B,QAAI,QAAQ,EAAE,UAAU,IAAV,IAAkB,SAAS,IAA7B,CAAZ,EAAgD;AAC9C,aAAO,OAAO,EAAP,EAAW,IAAX,CAAP;;AAEA,WAAK,IAAL,GAAc,KAAK,CAAL,IAAU,CAAxB;AACA,WAAK,GAAL,GAAc,KAAK,CAAL,IAAU,CAAxB;AACA,WAAK,KAAL,GAAc,KAAK,KAAL,IAAiB,KAAK,IAAL,GAAY,KAAK,KAAhD;AACA,WAAK,MAAL,GAAc,KAAK,MAAL,IAAiB,KAAK,GAAL,GAAW,KAAK,MAA/C;AACD;;AAED,WAAO,IAAP;AACD,GAnDe;;AAqDhB,cAAY,oBAAU,IAAV,EAAgB;AAC1B,QAAI,QAAQ,EAAE,OAAO,IAAP,IAAe,OAAO,IAAxB,CAAZ,EAA2C;AACzC,aAAO,OAAO,EAAP,EAAW,IAAX,CAAP;;AAEA,WAAK,CAAL,GAAc,KAAK,IAAL,IAAa,CAA3B;AACA,WAAK,GAAL,GAAc,KAAK,GAAL,IAAa,CAA3B;AACA,WAAK,KAAL,GAAc,KAAK,KAAL,IAAgB,KAAK,KAAL,GAAc,KAAK,CAAjD;AACA,WAAK,MAAL,GAAc,KAAK,MAAL,IAAgB,KAAK,MAAL,GAAc,KAAK,CAAjD;AACD;;AAED,WAAO,IAAP;AACD;AAhEe,CAAlB;;AAmEA,OAAO,OAAP,GAAiB,SAAjB;;;;;AC3EA,IAAM,MAAM,OAAO,OAAnB;AACA,IAAM,WAAW,QAAQ,YAAR,CAAjB;;AAEA,SAAS,IAAT,CAAe,MAAf,EAAuB;AACrB;;AAEA,MAAI,UAAJ,GAAiB,MAAjB;;AAEA;AACA,MAAM,KAAK,OAAO,QAAP,CAAgB,cAAhB,CAA+B,EAA/B,CAAX;;AAEA;AACA,MAAI,GAAG,aAAH,KAAqB,OAAO,QAA5B,IACG,OAAO,OAAO,IAAd,KAAuB,UAD1B,IAEC,OAAO,IAAP,CAAY,EAAZ,MAAoB,EAFzB,EAE6B;AAC3B;AACA,aAAS,OAAO,IAAP,CAAY,MAAZ,CAAT;AACD;;AAED,MAAI,MAAJ,GAAa,MAAb;AACD;;AAED,IAAI,OAAO,MAAP,KAAkB,WAAtB,EAAmC;AACjC,MAAI,MAAJ,GAAiB,SAAjB;AACA,MAAI,UAAJ,GAAiB,SAAjB;AACD,CAHD,MAIK;AACH,OAAK,MAAL;AACD;;AAED,IAAI,SAAJ,GAAgB,SAAS,SAAT,CAAoB,IAApB,EAA0B;AACxC,MAAI,SAAS,IAAT,CAAJ,EAAoB;AAClB,WAAO,IAAP;AACD;;AAED,MAAM,WAAY,KAAK,aAAL,IAAsB,IAAxC;;AAEA,SAAO,SAAS,WAAT,IAAwB,SAAS,YAAjC,IAAiD,IAAI,MAA5D;AACD,CARD;;AAUA,IAAI,IAAJ,GAAW,IAAX","file":"interact.js","sourceRoot":"","sourcesContent":["/**\n * interact.js v1.3.0-alpha.3+sha.9595c40\n *\n * Copyright (c) 2012-2017 Taye Adeyemi \n * Open source under the MIT License.\n * https://raw.github.com/taye/interact.js/master/LICENSE\n */\n","(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o 150) {\n return null;\n }\n\n let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI;\n const overlap = 22.5;\n\n if (angle < 0) {\n angle += 360;\n }\n\n const left = 135 - overlap <= angle && angle < 225 + overlap;\n const up = 225 - overlap <= angle && angle < 315 + overlap;\n\n const right = !left && (315 - overlap <= angle || angle < 45 + overlap);\n const down = !up && 45 - overlap <= angle && angle < 135 + overlap;\n\n return {\n up,\n down,\n left,\n right,\n angle,\n speed: interaction.prevEvent.speed,\n velocity: {\n x: interaction.prevEvent.velocityX,\n y: interaction.prevEvent.velocityY,\n },\n };\n }\n\n preventDefault () {}\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n}\n\nsignals.on('set-delta', function ({ iEvent, interaction, starting, deltaSource }) {\n const prevEvent = starting? iEvent : interaction.prevEvent;\n\n if (deltaSource === 'client') {\n iEvent.dx = iEvent.clientX - prevEvent.clientX;\n iEvent.dy = iEvent.clientY - prevEvent.clientY;\n }\n else {\n iEvent.dx = iEvent.pageX - prevEvent.pageX;\n iEvent.dy = iEvent.pageY - prevEvent.pageY;\n }\n});\n\nInteractEvent.signals = signals;\n\nmodule.exports = InteractEvent;\n","const is = require('./utils/is');\nconst events = require('./utils/events');\nconst extend = require('./utils/extend');\nconst actions = require('./actions/base');\nconst scope = require('./scope');\nconst Eventable = require('./Eventable');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nconst {\n getElementRect,\n nodeContains,\n trySelector,\n} = require('./utils/domUtils');\nconst { getWindow } = require('./utils/window');\nconst { indexOf, contains } = require('./utils/arr');\nconst { wheelEvent } = require('./utils/browser');\n\n// all set interactables\nscope.interactables = [];\n\n/*\\\n * Interactable\n [ property ]\n **\n * Object type returned by @interact\n\\*/\nclass Interactable {\n constructor (target, options) {\n options = options || {};\n\n this.target = target;\n this.events = new Eventable();\n this._context = options.context || scope.document;\n this._win = getWindow(trySelector(target)? this._context : target);\n this._doc = this._win.document;\n\n signals.fire('new', {\n target,\n options,\n interactable: this,\n win: this._win,\n });\n\n scope.addDocument( this._doc, this._win );\n\n scope.interactables.push(this);\n\n this.set(options);\n }\n\n setOnEvents (action, phases) {\n const onAction = 'on' + action;\n\n if (is.function(phases.onstart) ) { this.events[onAction + 'start' ] = phases.onstart ; }\n if (is.function(phases.onmove) ) { this.events[onAction + 'move' ] = phases.onmove ; }\n if (is.function(phases.onend) ) { this.events[onAction + 'end' ] = phases.onend ; }\n if (is.function(phases.oninertiastart)) { this.events[onAction + 'inertiastart' ] = phases.oninertiastart ; }\n\n return this;\n }\n\n setPerAction (action, options) {\n // for all the default per-action options\n for (const option in options) {\n // if this option exists for this action\n if (option in defaults[action]) {\n // if the option in the options arg is an object value\n if (is.object(options[option])) {\n // duplicate the object\n this.options[action][option] = extend(this.options[action][option] || {}, options[option]);\n\n if (is.object(defaults.perAction[option]) && 'enabled' in defaults.perAction[option]) {\n this.options[action][option].enabled = options[option].enabled === false? false : true;\n }\n }\n else if (is.bool(options[option]) && is.object(defaults.perAction[option])) {\n this.options[action][option].enabled = options[option];\n }\n else if (options[option] !== undefined) {\n // or if it's not undefined, do a plain assignment\n this.options[action][option] = options[option];\n }\n }\n }\n }\n\n /*\\\n * Interactable.getRect\n [ method ]\n *\n * The default function to get an Interactables bounding rect. Can be\n * overridden using @Interactable.rectChecker.\n *\n - element (Element) #optional The element to measure.\n = (object) The object's bounding rectangle.\n o {\n o top : 0,\n o left : 0,\n o bottom: 0,\n o right : 0,\n o width : 0,\n o height: 0\n o }\n \\*/\n getRect (element) {\n element = element || this.target;\n\n if (is.string(this.target) && !(is.element(element))) {\n element = this._context.querySelector(this.target);\n }\n\n return getElementRect(element);\n }\n\n /*\\\n * Interactable.rectChecker\n [ method ]\n *\n * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n - checker (function) #optional A function which returns this Interactable's bounding rectangle. See @Interactable.getRect\n = (function | object) The checker function or this Interactable\n \\*/\n rectChecker (checker) {\n if (is.function(checker)) {\n this.getRect = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.getRect;\n\n return this;\n }\n\n return this.getRect;\n }\n\n _backCompatOption (optionName, newValue) {\n if (trySelector(newValue) || is.object(newValue)) {\n this.options[optionName] = newValue;\n\n for (const action of actions.names) {\n this.options[action][optionName] = newValue;\n }\n\n return this;\n }\n\n return this.options[optionName];\n }\n\n /*\\\n * Interactable.origin\n [ method ]\n *\n * Gets or sets the origin of the Interactable's element. The x and y\n * of the origin will be subtracted from action event coordinates.\n *\n - origin (object | string) #optional An object eg. { x: 0, y: 0 } or string 'parent', 'self' or any CSS selector\n * OR\n - origin (Element) #optional An HTML or SVG Element whose rect will be used\n **\n = (object) The current origin or this Interactable\n \\*/\n origin (newValue) {\n return this._backCompatOption('origin', newValue);\n }\n\n /*\\\n * Interactable.deltaSource\n [ method ]\n *\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n - newValue (string) #optional Use 'client' if you will be scrolling while interacting; Use 'page' if you want autoScroll to work\n = (string | object) The current deltaSource or this Interactable\n \\*/\n deltaSource (newValue) {\n if (newValue === 'page' || newValue === 'client') {\n this.options.deltaSource = newValue;\n\n return this;\n }\n\n return this.options.deltaSource;\n }\n\n /*\\\n * Interactable.context\n [ method ]\n *\n * Gets the selector context Node of the Interactable. The default is `window.document`.\n *\n = (Node) The context Node of this Interactable\n **\n \\*/\n context () {\n return this._context;\n }\n\n inContext (element) {\n return (this._context === element.ownerDocument\n || nodeContains(this._context, element));\n }\n\n /*\\\n * Interactable.fire\n [ method ]\n *\n * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n - iEvent (InteractEvent) The InteractEvent object to be fired on this Interactable\n = (Interactable) this Interactable\n \\*/\n fire (iEvent) {\n this.events.fire(iEvent);\n\n return this;\n }\n\n _onOffMultiple (method, eventType, listener, options) {\n if (is.string(eventType) && eventType.search(' ') !== -1) {\n eventType = eventType.trim().split(/ +/);\n }\n\n if (is.array(eventType)) {\n for (let i = 0; i < eventType.length; i++) {\n this[method](eventType[i], listener, options);\n }\n\n return true;\n }\n\n if (is.object(eventType)) {\n for (const prop in eventType) {\n this[method](prop, eventType[prop], listener);\n }\n\n return true;\n }\n }\n\n /*\\\n * Interactable.on\n [ method ]\n *\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n - eventType (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) This Interactable\n \\*/\n on (eventType, listener, options) {\n if (this._onOffMultiple('on', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.on(eventType, listener);\n }\n // delegated event for selector\n else if (is.string(this.target)) {\n events.addDelegate(this.target, this._context, eventType, listener, options);\n }\n else {\n events.add(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.off\n [ method ]\n *\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n - eventType (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) This Interactable\n \\*/\n off (eventType, listener, options) {\n if (this._onOffMultiple('off', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n // if it is an action event type\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.off(eventType, listener);\n }\n // delegated event\n else if (is.string(this.target)) {\n events.removeDelegate(this.target, this._context, eventType, listener, options);\n }\n // remove listener from this Interatable's element\n else {\n events.remove(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.set\n [ method ]\n *\n * Reset the options of this Interactable\n - options (object) The new settings to apply\n = (object) This Interactable\n \\*/\n set (options) {\n if (!is.object(options)) {\n options = {};\n }\n\n this.options = extend({}, defaults.base);\n\n const perActions = extend({}, defaults.perAction);\n\n for (const actionName in actions.methodDict) {\n const methodName = actions.methodDict[actionName];\n\n this.options[actionName] = extend({}, defaults[actionName]);\n\n this.setPerAction(actionName, perActions);\n\n this[methodName](options[actionName]);\n }\n\n for (const setting of Interactable.settingsMethods) {\n this.options[setting] = defaults.base[setting];\n\n if (setting in options) {\n this[setting](options[setting]);\n }\n }\n\n signals.fire('set', {\n options,\n interactable: this,\n });\n\n return this;\n }\n\n /*\\\n * Interactable.unset\n [ method ]\n *\n * Remove this interactable from the list of interactables and remove\n * it's action capabilities and event listeners\n *\n = (object) @interact\n \\*/\n unset () {\n events.remove(this.target, 'all');\n\n if (is.string(this.target)) {\n // remove delegated events\n for (const type in events.delegatedEvents) {\n const delegated = events.delegatedEvents[type];\n\n if (delegated.selectors[0] === this.target\n && delegated.contexts[0] === this._context) {\n\n delegated.selectors.splice(0, 1);\n delegated.contexts .splice(0, 1);\n delegated.listeners.splice(0, 1);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegated[type] = null;\n }\n }\n\n events.remove(this._context, type, events.delegateListener);\n events.remove(this._context, type, events.delegateUseCapture, true);\n }\n }\n else {\n events.remove(this, 'all');\n }\n\n signals.fire('unset', { interactable: this });\n\n scope.interactables.splice(indexOf(scope.interactables, this), 1);\n\n // Stop related interactions when an Interactable is unset\n for (const interaction of scope.interactions || []) {\n if (interaction.target === this && interaction.interacting()) {\n interaction.stop();\n }\n }\n\n return scope.interact;\n }\n}\n\nscope.interactables.indexOfElement = function indexOfElement (target, context) {\n context = context || scope.document;\n\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n if (interactable.target === target && interactable._context === context) {\n return i;\n }\n }\n return -1;\n};\n\nscope.interactables.get = function interactableGet (element, options, dontCheckInContext) {\n const ret = this[this.indexOfElement(element, options && options.context)];\n\n return ret && (is.string(element) || dontCheckInContext || ret.inContext(element))? ret : null;\n};\n\nscope.interactables.forEachSelector = function (callback, element) {\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n // skip non CSS selector targets and out of context elements\n if (!is.string(interactable.target)\n || (element && !interactable.inContext(element))) {\n continue;\n }\n\n const ret = callback(interactable, interactable.target, interactable._context, i, this);\n\n if (ret !== undefined) {\n return ret;\n }\n }\n};\n\n// all interact.js eventTypes\nInteractable.eventTypes = scope.eventTypes = [];\n\nInteractable.signals = signals;\n\nInteractable.settingsMethods = [ 'deltaSource', 'origin', 'preventDefault', 'rectChecker' ];\n\nmodule.exports = Interactable;\n","const scope = require('./scope');\nconst utils = require('./utils');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst finder = require('./utils/interactionFinder');\nconst signals = require('./utils/Signals').new();\n\nconst listeners = {};\nconst methodNames = [\n 'pointerDown', 'pointerMove', 'pointerUp',\n 'updatePointer', 'removePointer',\n];\n\n// for ignoring browser's simulated mouse events\nlet prevTouchTime = 0;\n\n// all active and idle interactions\nscope.interactions = [];\n\nclass Interaction {\n constructor () {\n this.target = null; // current interactable being interacted with\n this.element = null; // the target element of the interactable\n\n this.prepared = { // action that's ready to be fired on next move event\n name : null,\n axis : null,\n edges: null,\n };\n\n // keep track of added pointers\n this.pointers = [];\n this.pointerIds = [];\n this.downTargets = [];\n this.downTimes = [];\n\n // Previous native pointer move event coordinates\n this.prevCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n // current native pointer move event coordinates\n this.curCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Starting InteractEvent pointer coordinates\n this.startCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Change in coordinates and time of the pointer\n this.pointerDelta = {\n page : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n client : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n timeStamp: 0,\n };\n\n this.downEvent = null; // pointerdown/mousedown/touchstart event\n this.downPointer = {};\n\n this._eventTarget = null;\n this._curEventTarget = null;\n\n this.prevEvent = null; // previous action event\n\n this.pointerIsDown = false;\n this.pointerWasMoved = false;\n this._interacting = false;\n\n this.mouse = false;\n\n signals.fire('new', this);\n\n scope.interactions.push(this);\n }\n\n pointerDown (pointer, event, eventTarget) {\n const pointerIndex = this.updatePointer(pointer, event, true);\n\n signals.fire('down', {\n pointer,\n event,\n eventTarget,\n pointerIndex,\n interaction: this,\n });\n }\n\n /*\\\n * Interaction.start\n [ method ]\n *\n * Start an action with the given Interactable and Element as tartgets. The\n * action must be enabled for the target Interactable and an appropriate number\n * of pointers must be held down - 1 for drag/resize, 2 for gesture.\n *\n * Use it with `interactable.able({ manualStart: false })` to always\n * [start actions manually](https://github.com/taye/interact.js/issues/114)\n *\n - action (object) The action to be performed - drag, resize, etc.\n - target (Interactable) The Interactable to target\n - element (Element) The DOM Element to target\n = (object) interact\n **\n | interact(target)\n | .draggable({\n | // disable the default drag start by down->move\n | manualStart: true\n | })\n | // start dragging after the user holds the pointer down\n | .on('hold', function (event) {\n | var interaction = event.interaction;\n |\n | if (!interaction.interacting()) {\n | interaction.start({ name: 'drag' },\n | event.interactable,\n | event.currentTarget);\n | }\n | });\n \\*/\n start (action, target, element) {\n if (this.interacting()\n || !this.pointerIsDown\n || this.pointerIds.length < (action.name === 'gesture'? 2 : 1)) {\n return;\n }\n\n // if this interaction had been removed after stopping\n // add it back\n if (utils.indexOf(scope.interactions, this) === -1) {\n scope.interactions.push(this);\n }\n\n utils.copyAction(this.prepared, action);\n this.target = target;\n this.element = element;\n\n signals.fire('action-start', {\n interaction: this,\n event: this.downEvent,\n });\n }\n\n pointerMove (pointer, event, eventTarget) {\n if (!this.simulation) {\n this.updatePointer(pointer);\n utils.setCoords(this.curCoords, this.pointers);\n }\n\n const duplicateMove = (this.curCoords.page.x === this.prevCoords.page.x\n && this.curCoords.page.y === this.prevCoords.page.y\n && this.curCoords.client.x === this.prevCoords.client.x\n && this.curCoords.client.y === this.prevCoords.client.y);\n\n let dx;\n let dy;\n\n // register movement greater than pointerMoveTolerance\n if (this.pointerIsDown && !this.pointerWasMoved) {\n dx = this.curCoords.client.x - this.startCoords.client.x;\n dy = this.curCoords.client.y - this.startCoords.client.y;\n\n this.pointerWasMoved = utils.hypot(dx, dy) > Interaction.pointerMoveTolerance;\n }\n\n const signalArg = {\n pointer,\n pointerIndex: this.getPointerIndex(pointer),\n event,\n eventTarget,\n dx,\n dy,\n duplicate: duplicateMove,\n interaction: this,\n interactingBeforeMove: this.interacting(),\n };\n\n if (!duplicateMove) {\n // set pointer coordinate, time changes and speeds\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n }\n\n signals.fire('move', signalArg);\n\n if (!duplicateMove) {\n // if interacting, fire an 'action-move' signal etc\n if (this.interacting()) {\n this.doMove(signalArg);\n }\n\n if (this.pointerWasMoved) {\n utils.copyCoords(this.prevCoords, this.curCoords);\n }\n }\n }\n\n /*\\\n * Interaction.doMove\n [ method ]\n *\n * Force a move of the current action at the same coordinates. Useful if\n * snap/restrict has been changed and you want a movement with the new\n * settings.\n *\n **\n | interact(target)\n | .draggable(true)\n | .on('dragmove', function (event) {\n | if (someCondition) {\n | // change the snap settings\n | event.interactable.draggable({ snap: { targets: [] }});\n | // fire another move event with re-calculated snap\n | event.interaction.doMove();\n | }\n | });\n \\*/\n doMove (signalArg) {\n signalArg = utils.extend({\n pointer: this.pointers[0],\n event: this.prevEvent,\n eventTarget: this._eventTarget,\n interaction: this,\n }, signalArg || {});\n\n signals.fire('before-action-move', signalArg);\n\n if (!this._dontFireMove) {\n signals.fire('action-move', signalArg);\n }\n\n this._dontFireMove = false;\n }\n\n // End interact move events and stop auto-scroll unless simulation is running\n pointerUp (pointer, event, eventTarget, curEventTarget) {\n const pointerIndex = this.getPointerIndex(pointer);\n\n signals.fire(/cancel$/i.test(event.type)? 'cancel' : 'up', {\n pointer,\n pointerIndex,\n event,\n eventTarget,\n curEventTarget,\n interaction: this,\n });\n\n if (!this.simulation) {\n this.end(event);\n }\n\n this.pointerIsDown = false;\n this.removePointer(pointer, event);\n }\n\n /*\\\n * Interaction.end\n [ method ]\n *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n - event (PointerEvent) #optional\n **\n | interact(target)\n | .draggable(true)\n | .on('move', function (event) {\n | if (event.pageX > 1000) {\n | // end the current action\n | event.interaction.end();\n | // stop all further listeners from being called\n | event.stopImmediatePropagation();\n | }\n | });\n \\*/\n end (event) {\n event = event || this.prevEvent;\n\n if (this.interacting()) {\n signals.fire('action-end', {\n event,\n interaction: this,\n });\n }\n\n this.stop();\n }\n\n currentAction () {\n return this._interacting? this.prepared.name: null;\n }\n\n interacting () {\n return this._interacting;\n }\n\n stop () {\n signals.fire('stop', { interaction: this });\n\n if (this._interacting) {\n signals.fire('stop-active', { interaction: this });\n signals.fire('stop-' + this.prepared.name, { interaction: this });\n }\n\n this.target = this.element = null;\n\n this._interacting = false;\n this.prepared.name = this.prevEvent = null;\n }\n\n getPointerIndex (pointer) {\n return utils.indexOf(this.pointerIds, utils.getPointerId(pointer));\n }\n\n updatePointer (pointer, event, down = event && /(down|start)$/i.test(event.type)) {\n const id = utils.getPointerId(pointer);\n let index = this.getPointerIndex(pointer);\n\n if (index === -1) {\n index = this.pointerIds.length;\n this.pointerIds[index] = id;\n }\n\n if (down) {\n signals.fire('update-pointer-down', {\n pointer,\n event,\n down,\n pointerId: id,\n pointerIndex: index,\n interaction: this,\n });\n }\n\n this.pointers[index] = pointer;\n\n return index;\n }\n\n removePointer (pointer, event) {\n const id = utils.getPointerId(pointer);\n const index = this.mouse? 0 : utils.indexOf(this.pointerIds, id);\n\n if (index === -1) { return; }\n\n signals.fire('remove-pointer', {\n pointer,\n event,\n pointerIndex: index,\n interaction: this,\n });\n\n this.pointers .splice(index, 1);\n this.pointerIds .splice(index, 1);\n this.downTargets.splice(index, 1);\n this.downTimes .splice(index, 1);\n }\n\n _updateEventTargets (target, currentTarget) {\n this._eventTarget = target;\n this._curEventTarget = currentTarget;\n }\n}\n\nfor (let i = 0, len = methodNames.length; i < len; i++) {\n const method = methodNames[i];\n\n listeners[method] = doOnInteractions(method);\n}\n\nfunction doOnInteractions (method) {\n return (function (event) {\n const [eventTarget, curEventTarget] = utils.getEventTargets(event);\n const matches = []; // [ [pointer, interaction], ...]\n\n if (browser.supportsTouch && /touch/.test(event.type)) {\n prevTouchTime = new Date().getTime();\n\n for (let i = 0; i < event.changedTouches.length; i++) {\n const pointer = event.changedTouches[i];\n const interaction = finder.search(pointer, event.type, eventTarget);\n\n matches.push([pointer, interaction || new Interaction()]);\n }\n }\n else {\n let invalidPointer = false;\n\n if (!browser.supportsPointerEvent && /mouse/.test(event.type)) {\n // ignore mouse events while touch interactions are active\n for (let i = 0; i < scope.interactions.length && !invalidPointer; i++) {\n invalidPointer = !scope.interactions[i].mouse && scope.interactions[i].pointerIsDown;\n }\n\n // try to ignore mouse events that are simulated by the browser\n // after a touch event\n invalidPointer = invalidPointer\n || (new Date().getTime() - prevTouchTime < 500)\n // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated\n || event.timeStamp === 0;\n }\n\n if (!invalidPointer) {\n let interaction = finder.search(event, event.type, eventTarget);\n\n if (!interaction) {\n\n interaction = new Interaction();\n interaction.mouse = (/mouse/i.test(event.pointerType || event.type)\n // MSPointerEvent.MSPOINTER_TYPE_MOUSE\n || event.pointerType === 4\n || !event.pointerType);\n }\n\n matches.push([event, interaction]);\n }\n }\n\n for (const [pointer, interaction] of matches) {\n interaction._updateEventTargets(eventTarget, curEventTarget);\n interaction[method](pointer, event, eventTarget, curEventTarget);\n }\n });\n}\n\nfunction endAll (event) {\n for (let i = 0; i < scope.interactions.length; i++) {\n const interaction = scope.interactions[i];\n\n interaction.end(event);\n signals.fire('endall', { event, interaction });\n }\n}\n\nconst docEvents = { /* 'eventType': listenerFunc */ };\nconst pEventTypes = browser.pEventTypes;\n\nif (scope.PointerEvent) {\n docEvents[pEventTypes.down ] = listeners.pointerDown;\n docEvents[pEventTypes.move ] = listeners.pointerMove;\n docEvents[pEventTypes.up ] = listeners.pointerUp;\n docEvents[pEventTypes.cancel] = listeners.pointerUp;\n}\nelse {\n docEvents.mousedown = listeners.pointerDown;\n docEvents.mousemove = listeners.pointerMove;\n docEvents.mouseup = listeners.pointerUp;\n\n docEvents.touchstart = listeners.pointerDown;\n docEvents.touchmove = listeners.pointerMove;\n docEvents.touchend = listeners.pointerUp;\n docEvents.touchcancel = listeners.pointerUp;\n}\n\ndocEvents.blur = endAll;\n\nfunction onDocSignal ({ doc }, signalName) {\n const eventMethod = signalName.indexOf('add') === 0\n ? events.add : events.remove;\n\n // delegate event listener\n for (const eventType in scope.delegatedEvents) {\n eventMethod(doc, eventType, events.delegateListener);\n eventMethod(doc, eventType, events.delegateUseCapture, true);\n }\n\n for (const eventType in docEvents) {\n eventMethod(doc, eventType, docEvents[eventType]);\n }\n}\n\nsignals.on('update-pointer-down', ({ interaction, pointer, pointerId, pointerIndex, event, eventTarget, down }) => {\n interaction.pointerIds[pointerIndex] = pointerId;\n interaction.pointers[pointerIndex] = pointer;\n\n if (down) {\n interaction.pointerIsDown = true;\n }\n\n if (!interaction.interacting()) {\n utils.setCoords(interaction.startCoords, interaction.pointers);\n\n utils.copyCoords(interaction.curCoords , interaction.startCoords);\n utils.copyCoords(interaction.prevCoords, interaction.startCoords);\n\n interaction.downEvent = event;\n interaction.downTimes[pointerIndex] = interaction.curCoords.timeStamp;\n interaction.downTargets[pointerIndex] = eventTarget || event && utils.getEventTargets(event)[0];\n interaction.pointerWasMoved = false;\n\n utils.pointerExtend(interaction.downPointer, pointer);\n }\n});\n\nscope.signals.on('add-document' , onDocSignal);\nscope.signals.on('remove-document', onDocSignal);\n\nInteraction.pointerMoveTolerance = 1;\nInteraction.doOnInteractions = doOnInteractions;\nInteraction.endAll = endAll;\nInteraction.signals = signals;\nInteraction.docEvents = docEvents;\n\nscope.endAllInteractions = endAll;\n\nmodule.exports = Interaction;\n","const Interaction = require('../Interaction');\nconst InteractEvent = require('../InteractEvent');\n\nconst actions = {\n firePrepared,\n names: [],\n methodDict: {},\n};\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n interaction._interacting = true;\n firePrepared(interaction, event, 'start');\n});\n\nInteraction.signals.on('action-move', function ({ interaction, event, preEnd }) {\n firePrepared(interaction, event, 'move', preEnd);\n\n // if the action was ended in a listener\n if (!interaction.interacting()) { return false; }\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n firePrepared(interaction, event, 'end');\n});\n\nfunction firePrepared (interaction, event, phase, preEnd) {\n const actionName = interaction.prepared.name;\n\n const newEvent = new InteractEvent(interaction, event, actionName, phase, interaction.element, null, preEnd);\n\n interaction.target.fire(newEvent);\n interaction.prevEvent = newEvent;\n}\n\nmodule.exports = actions;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drag = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n startAxis : 'xy',\n lockAxis : 'xy',\n },\n\n checker: function (pointer, event, interactable) {\n const dragOptions = interactable.options.drag;\n\n return dragOptions.enabled\n ? { name: 'drag', axis: (dragOptions.lockAxis === 'start'\n ? dragOptions.startAxis\n : dragOptions.lockAxis)}\n : null;\n },\n\n getCursor: function () {\n return 'move';\n },\n};\n\nInteraction.signals.on('before-action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n interaction.curCoords.page.y = interaction.startCoords.page.y;\n interaction.curCoords.client.y = interaction.startCoords.client.y;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vx);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vx);\n interaction.pointerDelta.client.vy = 0;\n interaction.pointerDelta.page.vy = 0;\n }\n else if (axis === 'y') {\n interaction.curCoords.page.x = interaction.startCoords.page.x;\n interaction.curCoords.client.x = interaction.startCoords.client.x;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vy);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vy);\n interaction.pointerDelta.client.vx = 0;\n interaction.pointerDelta.page.vx = 0;\n }\n});\n\n// dragmove\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'dragmove') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n iEvent.pageY = interaction.startCoords.page.y;\n iEvent.clientY = interaction.startCoords.client.y;\n iEvent.dy = 0;\n }\n else if (axis === 'y') {\n iEvent.pageX = interaction.startCoords.page.x;\n iEvent.clientX = interaction.startCoords.client.x;\n iEvent.dx = 0;\n }\n});\n\n/*\\\n * Interactable.draggable\n [ method ]\n *\n * Gets or sets whether drag actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of drag events\n | var isDraggable = interact('ul li').draggable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on drag events (object makes the Interactable draggable)\n = (object) This Interactable\n | interact(element).draggable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // the axis in which the first movement must be\n | // for the drag sequence to start\n | // 'xy' by default - any direction\n | startAxis: 'x' || 'y' || 'xy',\n |\n | // 'xy' by default - don't restrict to one axis (move in any direction)\n | // 'x' or 'y' to restrict movement to either axis\n | // 'start' to restrict movement to the axis the drag started in\n | lockAxis: 'x' || 'y' || 'xy' || 'start',\n |\n | // max number of drags that can happen concurrently\n | // with elements of this Interactable. Infinity by default\n | max: Infinity,\n |\n | // max number of drags that can target the same element+Interactable\n | // 1 by default\n | maxPerElement: 2\n | });\n\\*/\nInteractable.prototype.draggable = function (options) {\n if (utils.is.object(options)) {\n this.options.drag.enabled = options.enabled === false? false: true;\n this.setPerAction('drag', options);\n this.setOnEvents('drag', options);\n\n if (/^(xy|x|y|start)$/.test(options.lockAxis)) {\n this.options.drag.lockAxis = options.lockAxis;\n }\n if (/^(xy|x|y)$/.test(options.startAxis)) {\n this.options.drag.startAxis = options.startAxis;\n }\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drag.enabled = options;\n\n if (!options) {\n this.ondragstart = this.ondragstart = this.ondragend = null;\n }\n\n return this;\n }\n\n return this.options.drag;\n};\n\nactions.drag = drag;\nactions.names.push('drag');\nutils.merge(Interactable.eventTypes, [\n 'dragstart',\n 'dragmove',\n 'draginertiastart',\n 'draginertiaresume',\n 'dragend',\n]);\nactions.methodDict.drag = 'draggable';\n\ndefaultOptions.drag = drag.defaults;\n\nmodule.exports = drag;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst scope = require('../scope');\nconst interact = require('../interact');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drop = {\n defaults: {\n enabled: false,\n accept : null,\n overlap: 'pointer',\n },\n};\n\nlet dynamicDrop = false;\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // reset active dropzones\n interaction.activeDrops.dropzones = [];\n interaction.activeDrops.elements = [];\n interaction.activeDrops.rects = [];\n\n interaction.dropEvents = null;\n\n if (!interaction.dynamicDrop) {\n setActiveDrops(interaction, interaction.element);\n }\n\n const dragEvent = interaction.prevEvent;\n const dropEvents = getDropEvents(interaction, event, dragEvent);\n\n if (dropEvents.activate) {\n fireActiveDrops(interaction, dropEvents.activate);\n }\n});\n\nInteractEvent.signals.on('new', function ({ interaction, iEvent, event }) {\n if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { return; }\n\n const draggableElement = interaction.element;\n const dragEvent = iEvent;\n const dropResult = getDrop(dragEvent, event, draggableElement);\n\n interaction.dropTarget = dropResult.dropzone;\n interaction.dropElement = dropResult.element;\n\n interaction.dropEvents = getDropEvents(interaction, event, dragEvent);\n});\n\nInteraction.signals.on('action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n fireDropEvents(interaction, interaction.dropEvents);\n});\n\nInteraction.signals.on('action-end', function ({ interaction }) {\n if (interaction.prepared.name === 'drag') {\n fireDropEvents(interaction, interaction.dropEvents);\n }\n});\n\nInteraction.signals.on('stop-drag', function ({ interaction }) {\n interaction.activeDrops.dropzones =\n interaction.activeDrops.elements =\n interaction.activeDrops.rects =\n interaction.dropEvents = null;\n});\n\nfunction collectDrops (interaction, element) {\n const drops = [];\n const elements = [];\n\n element = element || interaction.element;\n\n // collect all dropzones and their elements which qualify for a drop\n for (const current of scope.interactables) {\n if (!current.options.drop.enabled) { continue; }\n\n const accept = current.options.drop.accept;\n\n // test the draggable element against the dropzone's accept setting\n if ((utils.is.element(accept) && accept !== element)\n || (utils.is.string(accept)\n && !utils.matchesSelector(element, accept))) {\n\n continue;\n }\n\n // query for new elements if necessary\n const dropElements = utils.is.string(current.target)\n ? current._context.querySelectorAll(current.target)\n : [current.target];\n\n for (let i = 0; i < dropElements.length; i++) {\n const currentElement = dropElements[i];\n\n if (currentElement !== element) {\n drops.push(current);\n elements.push(currentElement);\n }\n }\n }\n\n return {\n elements,\n dropzones: drops,\n };\n}\n\nfunction fireActiveDrops (interaction, event) {\n let prevElement;\n\n // loop through all active dropzones and trigger event\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n const current = interaction.activeDrops.dropzones[i];\n const currentElement = interaction.activeDrops.elements [i];\n\n // prevent trigger of duplicate events on same element\n if (currentElement !== prevElement) {\n // set current element as event target\n event.target = currentElement;\n current.fire(event);\n }\n prevElement = currentElement;\n }\n}\n\n// Collect a new set of possible drops and save them in activeDrops.\n// setActiveDrops should always be called when a drag has just started or a\n// drag event happens while dynamicDrop is true\nfunction setActiveDrops (interaction, dragElement) {\n // get dropzones and their elements that could receive the draggable\n const possibleDrops = collectDrops(interaction, dragElement, true);\n\n interaction.activeDrops.dropzones = possibleDrops.dropzones;\n interaction.activeDrops.elements = possibleDrops.elements;\n interaction.activeDrops.rects = [];\n\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n interaction.activeDrops.rects[i] =\n interaction.activeDrops.dropzones[i].getRect(interaction.activeDrops.elements[i]);\n }\n}\n\nfunction getDrop (dragEvent, event, dragElement) {\n const interaction = dragEvent.interaction;\n const validDrops = [];\n\n if (dynamicDrop) {\n setActiveDrops(interaction, dragElement);\n }\n\n // collect all dropzones and their elements which qualify for a drop\n for (let j = 0; j < interaction.activeDrops.dropzones.length; j++) {\n const current = interaction.activeDrops.dropzones[j];\n const currentElement = interaction.activeDrops.elements [j];\n const rect = interaction.activeDrops.rects [j];\n\n validDrops.push(current.dropCheck(dragEvent, event, interaction.target, dragElement, currentElement, rect)\n ? currentElement\n : null);\n }\n\n // get the most appropriate dropzone based on DOM depth and order\n const dropIndex = utils.indexOfDeepestElement(validDrops);\n\n return {\n dropzone: interaction.activeDrops.dropzones[dropIndex] || null,\n element : interaction.activeDrops.elements [dropIndex] || null,\n };\n}\n\nfunction getDropEvents (interaction, pointerEvent, dragEvent) {\n const dropEvents = {\n enter : null,\n leave : null,\n activate : null,\n deactivate: null,\n move : null,\n drop : null,\n };\n\n const tmpl = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n };\n\n if (interaction.dropElement !== interaction.prevDropElement) {\n // if there was a prevDropTarget, create a dragleave event\n if (interaction.prevDropTarget) {\n dropEvents.leave = utils.extend({ type: 'dragleave' }, tmpl);\n\n dragEvent.dragLeave = dropEvents.leave.target = interaction.prevDropElement;\n dragEvent.prevDropzone = dropEvents.leave.dropzone = interaction.prevDropTarget;\n }\n // if the dropTarget is not null, create a dragenter event\n if (interaction.dropTarget) {\n dropEvents.enter = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n type : 'dragenter',\n };\n\n dragEvent.dragEnter = interaction.dropElement;\n dragEvent.dropzone = interaction.dropTarget;\n }\n }\n\n if (dragEvent.type === 'dragend' && interaction.dropTarget) {\n dropEvents.drop = utils.extend({ type: 'drop' }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n dragEvent.relatedTarget = interaction.dropElement;\n }\n if (dragEvent.type === 'dragstart') {\n dropEvents.activate = utils.extend({ type: 'dropactivate' }, tmpl);\n\n dropEvents.activate.target = null;\n dropEvents.activate.dropzone = null;\n }\n if (dragEvent.type === 'dragend') {\n dropEvents.deactivate = utils.extend({ type: 'dropdeactivate' }, tmpl);\n\n dropEvents.deactivate.target = null;\n dropEvents.deactivate.dropzone = null;\n }\n if (dragEvent.type === 'dragmove' && interaction.dropTarget) {\n dropEvents.move = utils.extend({\n dragmove : dragEvent,\n type : 'dropmove',\n }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n }\n\n return dropEvents;\n}\n\nfunction fireDropEvents (interaction, dropEvents) {\n if (dropEvents.leave) { interaction.prevDropTarget.fire(dropEvents.leave); }\n if (dropEvents.move ) { interaction.dropTarget.fire(dropEvents.move ); }\n if (dropEvents.enter) { interaction.dropTarget.fire(dropEvents.enter); }\n if (dropEvents.drop ) { interaction.dropTarget.fire(dropEvents.drop ); }\n if (dropEvents.deactivate) {\n fireActiveDrops(interaction, dropEvents.deactivate);\n }\n\n interaction.prevDropTarget = interaction.dropTarget;\n interaction.prevDropElement = interaction.dropElement;\n}\n\n/*\\\n * Interactable.dropzone\n [ method ]\n *\n * Returns or sets whether elements can be dropped onto this\n * Interactable to trigger drop events\n *\n * Dropzones can receive the following events:\n * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends\n * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone\n * - `dragmove` when a draggable that has entered the dropzone is moved\n * - `drop` when a draggable is dropped into this dropzone\n *\n * Use the `accept` option to allow only elements that match the given CSS\n * selector or element. The value can be:\n *\n * - **an Element** - only that element can be dropped into this dropzone.\n * - **a string**, - the element being dragged must match it as a CSS selector.\n * - **`null`** - accept options is cleared - it accepts any element.\n *\n * Use the `overlap` option to set how drops are checked for. The allowed\n * values are:\n *\n * - `'pointer'`, the pointer must be over the dropzone (default)\n * - `'center'`, the draggable element's center must be over the dropzone\n * - a number from 0-1 which is the `(intersection area) / (draggable area)`.\n * e.g. `0.5` for drop to happen when half of the area of the draggable is\n * over the dropzone\n *\n * Use the `checker` option to specify a function to check if a dragged\n * element is over this Interactable.\n *\n | interact(target)\n | .dropChecker(function(dragEvent, // related dragmove or dragend event\n | event, // TouchEvent/PointerEvent/MouseEvent\n | dropped, // bool result of the default checker\n | dropzone, // dropzone Interactable\n | dropElement, // dropzone elemnt\n | draggable, // draggable Interactable\n | draggableElement) {// draggable element\n |\n | return dropped && event.target.hasAttribute('allow-drop');\n | }\n *\n *\n - options (boolean | object | null) #optional The new value to be set.\n | interact('.drop').dropzone({\n | accept: '.can-drop' || document.getElementById('single-drop'),\n | overlap: 'pointer' || 'center' || zeroToOne\n | }\n = (boolean | object) The current setting or this Interactable\n\\*/\nInteractable.prototype.dropzone = function (options) {\n if (utils.is.object(options)) {\n this.options.drop.enabled = options.enabled === false? false: true;\n\n if (utils.is.function(options.ondrop) ) { this.events.ondrop = options.ondrop ; }\n if (utils.is.function(options.ondropactivate) ) { this.events.ondropactivate = options.ondropactivate ; }\n if (utils.is.function(options.ondropdeactivate)) { this.events.ondropdeactivate = options.ondropdeactivate; }\n if (utils.is.function(options.ondragenter) ) { this.events.ondragenter = options.ondragenter ; }\n if (utils.is.function(options.ondragleave) ) { this.events.ondragleave = options.ondragleave ; }\n if (utils.is.function(options.ondropmove) ) { this.events.ondropmove = options.ondropmove ; }\n\n if (/^(pointer|center)$/.test(options.overlap)) {\n this.options.drop.overlap = options.overlap;\n }\n else if (utils.is.number(options.overlap)) {\n this.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0);\n }\n if ('accept' in options) {\n this.options.drop.accept = options.accept;\n }\n if ('checker' in options) {\n this.options.drop.checker = options.checker;\n }\n\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drop.enabled = options;\n\n if (!options) {\n this.ondragenter = this.ondragleave = this.ondrop\n = this.ondropactivate = this.ondropdeactivate = null;\n }\n\n return this;\n }\n\n return this.options.drop;\n};\n\nInteractable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) {\n let dropped = false;\n\n // if the dropzone has no rect (eg. display: none)\n // call the custom dropChecker or just return false\n if (!(rect = rect || this.getRect(dropElement))) {\n return (this.options.drop.checker\n ? this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement)\n : false);\n }\n\n const dropOverlap = this.options.drop.overlap;\n\n if (dropOverlap === 'pointer') {\n const origin = utils.getOriginXY(draggable, draggableElement, 'drag');\n const page = utils.getPageXY(dragEvent);\n\n page.x += origin.x;\n page.y += origin.y;\n\n const horizontal = (page.x > rect.left) && (page.x < rect.right);\n const vertical = (page.y > rect.top ) && (page.y < rect.bottom);\n\n dropped = horizontal && vertical;\n }\n\n const dragRect = draggable.getRect(draggableElement);\n\n if (dragRect && dropOverlap === 'center') {\n const cx = dragRect.left + dragRect.width / 2;\n const cy = dragRect.top + dragRect.height / 2;\n\n dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom;\n }\n\n if (dragRect && utils.is.number(dropOverlap)) {\n const overlapArea = (Math.max(0, Math.min(rect.right , dragRect.right ) - Math.max(rect.left, dragRect.left))\n * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top , dragRect.top )));\n\n const overlapRatio = overlapArea / (dragRect.width * dragRect.height);\n\n dropped = overlapRatio >= dropOverlap;\n }\n\n if (this.options.drop.checker) {\n dropped = this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement);\n }\n\n return dropped;\n};\n\nInteractable.signals.on('unset', function ({ interactable }) {\n interactable.dropzone(false);\n});\n\nInteractable.settingsMethods.push('dropChecker');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.dropTarget = null; // the dropzone a drag target might be dropped into\n interaction.dropElement = null; // the element at the time of checking\n interaction.prevDropTarget = null; // the dropzone that was recently dragged away from\n interaction.prevDropElement = null; // the element at the time of checking\n interaction.dropEvents = null; // the dropEvents related to the current drag event\n\n interaction.activeDrops = {\n dropzones: [], // the dropzones that are mentioned below\n elements : [], // elements of dropzones that accept the target draggable\n rects : [], // the rects of the elements mentioned above\n };\n\n});\n\nInteraction.signals.on('stop', function ({ interaction }) {\n interaction.dropTarget = interaction.dropElement =\n interaction.prevDropTarget = interaction.prevDropElement = null;\n});\n\n/*\\\n * interact.dynamicDrop\n [ method ]\n *\n * Returns or sets whether the dimensions of dropzone elements are\n * calculated on every dragmove or only on dragstart for the default\n * dropChecker\n *\n - newValue (boolean) #optional True to check on each move. False to check only before start\n = (boolean | interact) The current setting or interact\n\\*/\ninteract.dynamicDrop = function (newValue) {\n if (utils.is.bool(newValue)) {\n //if (dragging && dynamicDrop !== newValue && !newValue) {\n //calcRects(dropzones);\n //}\n\n dynamicDrop = newValue;\n\n return interact;\n }\n return dynamicDrop;\n};\n\nutils.merge(Interactable.eventTypes, [\n 'dragenter',\n 'dragleave',\n 'dropactivate',\n 'dropdeactivate',\n 'dropmove',\n 'drop',\n]);\nactions.methodDict.drop = 'dropzone';\n\ndefaultOptions.drop = drop.defaults;\n\nmodule.exports = drop;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst gesture = {\n defaults: {\n enabled : false,\n origin : null,\n restrict: null,\n },\n\n checker: function (pointer, event, interactable, element, interaction) {\n if (interaction.pointerIds.length >= 2) {\n return { name: 'gesture' };\n }\n\n return null;\n },\n\n getCursor: function () {\n return '';\n },\n};\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturestart') { return; }\n iEvent.ds = 0;\n\n interaction.gesture.startDistance = interaction.gesture.prevDistance = iEvent.distance;\n interaction.gesture.startAngle = interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.scale = 1;\n});\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturemove') { return; }\n\n iEvent.ds = iEvent.scale - interaction.gesture.scale;\n\n interaction.target.fire(iEvent);\n\n interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.prevDistance = iEvent.distance;\n\n if (iEvent.scale !== Infinity\n && iEvent.scale !== null\n && iEvent.scale !== undefined\n && !isNaN(iEvent.scale)) {\n\n interaction.gesture.scale = iEvent.scale;\n }\n});\n\n/*\\\n * Interactable.gesturable\n [ method ]\n *\n * Gets or sets whether multitouch gestures can be performed on the\n * Interactable's element\n *\n = (boolean) Indicates if this can be the target of gesture events\n | var isGestureable = interact(element).gesturable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on gesture events (makes the Interactable gesturable)\n = (object) this Interactable\n | interact(element).gesturable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // limit multiple gestures.\n | // See the explanation in @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n\\*/\nInteractable.prototype.gesturable = function (options) {\n if (utils.is.object(options)) {\n this.options.gesture.enabled = options.enabled === false? false: true;\n this.setPerAction('gesture', options);\n this.setOnEvents('gesture', options);\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.gesture.enabled = options;\n\n if (!options) {\n this.ongesturestart = this.ongesturestart = this.ongestureend = null;\n }\n\n return this;\n }\n\n return this.options.gesture;\n};\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action, event, starting, ending, deltaSource }) {\n if (action !== 'gesture') { return; }\n\n const pointers = interaction.pointers;\n\n iEvent.touches = [pointers[0], pointers[1]];\n\n if (starting) {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = 1;\n iEvent.ds = 0;\n iEvent.angle = utils.touchAngle(pointers, undefined, deltaSource);\n iEvent.da = 0;\n }\n else if (ending || event instanceof InteractEvent) {\n iEvent.distance = interaction.prevEvent.distance;\n iEvent.box = interaction.prevEvent.box;\n iEvent.scale = interaction.prevEvent.scale;\n iEvent.ds = iEvent.scale - 1;\n iEvent.angle = interaction.prevEvent.angle;\n iEvent.da = iEvent.angle - interaction.gesture.startAngle;\n }\n else {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = iEvent.distance / interaction.gesture.startDistance;\n iEvent.angle = utils.touchAngle(pointers, interaction.gesture.prevAngle, deltaSource);\n\n iEvent.ds = iEvent.scale - interaction.gesture.prevScale;\n iEvent.da = iEvent.angle - interaction.gesture.prevAngle;\n }\n});\n\nInteraction.signals.on('new', function (interaction) {\n interaction.gesture = {\n start: { x: 0, y: 0 },\n\n startDistance: 0, // distance between two touches of touchStart\n prevDistance : 0,\n distance : 0,\n\n scale: 1, // gesture.distance / gesture.startDistance\n\n startAngle: 0, // angle of line joining two touches\n prevAngle : 0, // angle of the previous gesture event\n };\n});\n\nactions.gesture = gesture;\nactions.names.push('gesture');\nutils.merge(Interactable.eventTypes, [\n 'gesturestart',\n 'gesturemove',\n 'gestureend',\n]);\nactions.methodDict.gesture = 'gesturable';\n\ndefaultOptions.gesture = gesture.defaults;\n\nmodule.exports = gesture;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\n// Less Precision with touch input\nconst defaultMargin = browser.supportsTouch || browser.supportsPointerEvent? 20: 10;\n\nconst resize = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n square: false,\n preserveAspectRatio: false,\n axis: 'xy',\n\n // use default margin\n margin: NaN,\n\n // object with props left, right, top, bottom which are\n // true/false values to resize when the pointer is over that edge,\n // CSS selectors to match the handles for each direction\n // or the Elements for each handle\n edges: null,\n\n // a value of 'none' will limit the resize rect to a minimum of 0x0\n // 'negate' will alow the rect to have negative width/height\n // 'reposition' will keep the width/height positive by swapping\n // the top and bottom edges and/or swapping the left and right edges\n invert: 'none',\n },\n\n checker: function (pointer, event, interactable, element, interaction, rect) {\n if (!rect) { return null; }\n\n const page = utils.extend({}, interaction.curCoords.page);\n const options = interactable.options;\n\n if (options.resize.enabled) {\n const resizeOptions = options.resize;\n const resizeEdges = { left: false, right: false, top: false, bottom: false };\n\n // if using resize.edges\n if (utils.is.object(resizeOptions.edges)) {\n for (const edge in resizeEdges) {\n resizeEdges[edge] = checkResizeEdge(edge,\n resizeOptions.edges[edge],\n page,\n interaction._eventTarget,\n element,\n rect,\n resizeOptions.margin || defaultMargin);\n }\n\n resizeEdges.left = resizeEdges.left && !resizeEdges.right;\n resizeEdges.top = resizeEdges.top && !resizeEdges.bottom;\n\n if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) {\n return {\n name: 'resize',\n edges: resizeEdges,\n };\n }\n }\n else {\n const right = options.resize.axis !== 'y' && page.x > (rect.right - defaultMargin);\n const bottom = options.resize.axis !== 'x' && page.y > (rect.bottom - defaultMargin);\n\n if (right || bottom) {\n return {\n name: 'resize',\n axes: (right? 'x' : '') + (bottom? 'y' : ''),\n };\n }\n }\n }\n\n return null;\n },\n\n cursors: (browser.isIe9OrOlder ? {\n x : 'e-resize',\n y : 's-resize',\n xy: 'se-resize',\n\n top : 'n-resize',\n left : 'w-resize',\n bottom : 's-resize',\n right : 'e-resize',\n topleft : 'se-resize',\n bottomright: 'se-resize',\n topright : 'ne-resize',\n bottomleft : 'ne-resize',\n } : {\n x : 'ew-resize',\n y : 'ns-resize',\n xy: 'nwse-resize',\n\n top : 'ns-resize',\n left : 'ew-resize',\n bottom : 'ns-resize',\n right : 'ew-resize',\n topleft : 'nwse-resize',\n bottomright: 'nwse-resize',\n topright : 'nesw-resize',\n bottomleft : 'nesw-resize',\n }),\n\n getCursor: function (action) {\n if (action.axis) {\n return resize.cursors[action.name + action.axis];\n }\n else if (action.edges) {\n let cursorKey = '';\n const edgeNames = ['top', 'bottom', 'left', 'right'];\n\n for (let i = 0; i < 4; i++) {\n if (action.edges[edgeNames[i]]) {\n cursorKey += edgeNames[i];\n }\n }\n\n return resize.cursors[cursorKey];\n }\n },\n};\n\n// resizestart\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'resizestart' || !interaction.prepared.edges) {\n return;\n }\n\n const startRect = interaction.target.getRect(interaction.element);\n const resizeOptions = interaction.target.options.resize;\n\n /*\n * When using the `resizable.square` or `resizable.preserveAspectRatio` options, resizing from one edge\n * will affect another. E.g. with `resizable.square`, resizing to make the right edge larger will make\n * the bottom edge larger by the same amount. We call these 'linked' edges. Any linked edges will depend\n * on the active edges and the edge being interacted with.\n */\n if (resizeOptions.square || resizeOptions.preserveAspectRatio) {\n const linkedEdges = utils.extend({}, interaction.prepared.edges);\n\n linkedEdges.top = linkedEdges.top || (linkedEdges.left && !linkedEdges.bottom);\n linkedEdges.left = linkedEdges.left || (linkedEdges.top && !linkedEdges.right );\n linkedEdges.bottom = linkedEdges.bottom || (linkedEdges.right && !linkedEdges.top );\n linkedEdges.right = linkedEdges.right || (linkedEdges.bottom && !linkedEdges.left );\n\n interaction.prepared._linkedEdges = linkedEdges;\n }\n else {\n interaction.prepared._linkedEdges = null;\n }\n\n // if using `resizable.preserveAspectRatio` option, record aspect ratio at the start of the resize\n if (resizeOptions.preserveAspectRatio) {\n interaction.resizeStartAspectRatio = startRect.width / startRect.height;\n }\n\n interaction.resizeRects = {\n start : startRect,\n current : utils.extend({}, startRect),\n inverted : utils.extend({}, startRect),\n previous : utils.extend({}, startRect),\n delta : {\n left: 0, right : 0, width : 0,\n top : 0, bottom: 0, height: 0,\n },\n };\n\n iEvent.rect = interaction.resizeRects.inverted;\n iEvent.deltaRect = interaction.resizeRects.delta;\n});\n\n// resizemove\nInteractEvent.signals.on('new', function ({ iEvent, phase, interaction }) {\n if (phase !== 'move' || !interaction.prepared.edges) { return; }\n\n const resizeOptions = interaction.target.options.resize;\n const invert = resizeOptions.invert;\n const invertible = invert === 'reposition' || invert === 'negate';\n\n let edges = interaction.prepared.edges;\n\n const start = interaction.resizeRects.start;\n const current = interaction.resizeRects.current;\n const inverted = interaction.resizeRects.inverted;\n const delta = interaction.resizeRects.delta;\n const previous = utils.extend(interaction.resizeRects.previous, inverted);\n const originalEdges = edges;\n\n let dx = iEvent.dx;\n let dy = iEvent.dy;\n\n if (resizeOptions.preserveAspectRatio || resizeOptions.square) {\n // `resize.preserveAspectRatio` takes precedence over `resize.square`\n const startAspectRatio = resizeOptions.preserveAspectRatio\n ? interaction.resizeStartAspectRatio\n : 1;\n\n edges = interaction.prepared._linkedEdges;\n\n if ((originalEdges.left && originalEdges.bottom)\n || (originalEdges.right && originalEdges.top)) {\n dy = -dx / startAspectRatio;\n }\n else if (originalEdges.left || originalEdges.right ) { dy = dx / startAspectRatio; }\n else if (originalEdges.top || originalEdges.bottom) { dx = dy * startAspectRatio; }\n }\n\n // update the 'current' rect without modifications\n if (edges.top ) { current.top += dy; }\n if (edges.bottom) { current.bottom += dy; }\n if (edges.left ) { current.left += dx; }\n if (edges.right ) { current.right += dx; }\n\n if (invertible) {\n // if invertible, copy the current rect\n utils.extend(inverted, current);\n\n if (invert === 'reposition') {\n // swap edge values if necessary to keep width/height positive\n let swap;\n\n if (inverted.top > inverted.bottom) {\n swap = inverted.top;\n\n inverted.top = inverted.bottom;\n inverted.bottom = swap;\n }\n if (inverted.left > inverted.right) {\n swap = inverted.left;\n\n inverted.left = inverted.right;\n inverted.right = swap;\n }\n }\n }\n else {\n // if not invertible, restrict to minimum of 0x0 rect\n inverted.top = Math.min(current.top, start.bottom);\n inverted.bottom = Math.max(current.bottom, start.top);\n inverted.left = Math.min(current.left, start.right);\n inverted.right = Math.max(current.right, start.left);\n }\n\n inverted.width = inverted.right - inverted.left;\n inverted.height = inverted.bottom - inverted.top ;\n\n for (const edge in inverted) {\n delta[edge] = inverted[edge] - previous[edge];\n }\n\n iEvent.edges = interaction.prepared.edges;\n iEvent.rect = inverted;\n iEvent.deltaRect = delta;\n});\n\n/*\\\n * Interactable.resizable\n [ method ]\n *\n * Gets or sets whether resize actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of resize elements\n | var isResizeable = interact('input[type=text]').resizable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on resize events (object makes the Interactable resizable)\n = (object) This Interactable\n | interact(element).resizable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | edges: {\n | top : true, // Use pointer coords to check for resize.\n | left : false, // Disable resizing from left edge.\n | bottom: '.resize-s',// Resize if pointer target matches selector\n | right : handleEl // Resize if pointer target is the given Element\n | },\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height are adjusted at a 1:1 ratio.\n | square: false,\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height maintain the aspect ratio they had when resizing started.\n | preserveAspectRatio: false,\n |\n | // a value of 'none' will limit the resize rect to a minimum of 0x0\n | // 'negate' will allow the rect to have negative width/height\n | // 'reposition' will keep the width/height positive by swapping\n | // the top and bottom edges and/or swapping the left and right edges\n | invert: 'none' || 'negate' || 'reposition'\n |\n | // limit multiple resizes.\n | // See the explanation in the @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n \\*/\nInteractable.prototype.resizable = function (options) {\n if (utils.is.object(options)) {\n this.options.resize.enabled = options.enabled === false? false: true;\n this.setPerAction('resize', options);\n this.setOnEvents('resize', options);\n\n if (/^x$|^y$|^xy$/.test(options.axis)) {\n this.options.resize.axis = options.axis;\n }\n else if (options.axis === null) {\n this.options.resize.axis = defaultOptions.resize.axis;\n }\n\n if (utils.is.bool(options.preserveAspectRatio)) {\n this.options.resize.preserveAspectRatio = options.preserveAspectRatio;\n }\n else if (utils.is.bool(options.square)) {\n this.options.resize.square = options.square;\n }\n\n return this;\n }\n if (utils.is.bool(options)) {\n this.options.resize.enabled = options;\n\n if (!options) {\n this.onresizestart = this.onresizestart = this.onresizeend = null;\n }\n\n return this;\n }\n return this.options.resize;\n};\n\nfunction checkResizeEdge (name, value, page, element, interactableElement, rect, margin) {\n // false, '', undefined, null\n if (!value) { return false; }\n\n // true value, use pointer coords and element rect\n if (value === true) {\n // if dimensions are negative, \"switch\" edges\n const width = utils.is.number(rect.width )? rect.width : rect.right - rect.left;\n const height = utils.is.number(rect.height)? rect.height : rect.bottom - rect.top ;\n\n if (width < 0) {\n if (name === 'left' ) { name = 'right'; }\n else if (name === 'right') { name = 'left' ; }\n }\n if (height < 0) {\n if (name === 'top' ) { name = 'bottom'; }\n else if (name === 'bottom') { name = 'top' ; }\n }\n\n if (name === 'left' ) { return page.x < ((width >= 0? rect.left: rect.right ) + margin); }\n if (name === 'top' ) { return page.y < ((height >= 0? rect.top : rect.bottom) + margin); }\n\n if (name === 'right' ) { return page.x > ((width >= 0? rect.right : rect.left) - margin); }\n if (name === 'bottom') { return page.y > ((height >= 0? rect.bottom: rect.top ) - margin); }\n }\n\n // the remaining checks require an element\n if (!utils.is.element(element)) { return false; }\n\n return utils.is.element(value)\n // the value is an element to use as a resize handle\n ? value === element\n // otherwise check if element matches value as selector\n : utils.matchesUpTo(element, value, interactableElement);\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.resizeAxes = 'xy';\n});\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action }) {\n if (action !== 'resize' || !interaction.resizeAxes) { return; }\n\n const options = interaction.target.options;\n\n if (options.resize.square) {\n if (interaction.resizeAxes === 'y') {\n iEvent.dx = iEvent.dy;\n }\n else {\n iEvent.dy = iEvent.dx;\n }\n iEvent.axes = 'xy';\n }\n else {\n iEvent.axes = interaction.resizeAxes;\n\n if (interaction.resizeAxes === 'x') {\n iEvent.dy = 0;\n }\n else if (interaction.resizeAxes === 'y') {\n iEvent.dx = 0;\n }\n }\n});\n\nactions.resize = resize;\nactions.names.push('resize');\nutils.merge(Interactable.eventTypes, [\n 'resizestart',\n 'resizemove',\n 'resizeinertiastart',\n 'resizeinertiaresume',\n 'resizeend',\n]);\nactions.methodDict.resize = 'resizable';\n\ndefaultOptions.resize = resize.defaults;\n\nmodule.exports = resize;\n","const raf = require('./utils/raf');\nconst getWindow = require('./utils/window').getWindow;\nconst is = require('./utils/is');\nconst domUtils = require('./utils/domUtils');\nconst Interaction = require('./Interaction');\nconst defaultOptions = require('./defaultOptions');\n\nconst autoScroll = {\n defaults: {\n enabled : false,\n container: null, // the item that is scrolled (Window or HTMLElement)\n margin : 60,\n speed : 300, // the scroll speed in pixels per second\n },\n\n interaction: null,\n i: null, // the handle returned by window.setInterval\n x: 0, y: 0, // Direction each pulse is to scroll in\n\n isScrolling: false,\n prevTime: 0,\n\n start: function (interaction) {\n autoScroll.isScrolling = true;\n raf.cancel(autoScroll.i);\n\n autoScroll.interaction = interaction;\n autoScroll.prevTime = new Date().getTime();\n autoScroll.i = raf.request(autoScroll.scroll);\n },\n\n stop: function () {\n autoScroll.isScrolling = false;\n raf.cancel(autoScroll.i);\n },\n\n // scroll the window by the values in scroll.x/y\n scroll: function () {\n const options = autoScroll.interaction.target.options[autoScroll.interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(autoScroll.interaction.element);\n const now = new Date().getTime();\n // change in time in seconds\n const dt = (now - autoScroll.prevTime) / 1000;\n // displacement\n const s = options.speed * dt;\n\n if (s >= 1) {\n if (is.window(container)) {\n container.scrollBy(autoScroll.x * s, autoScroll.y * s);\n }\n else if (container) {\n container.scrollLeft += autoScroll.x * s;\n container.scrollTop += autoScroll.y * s;\n }\n\n autoScroll.prevTime = now;\n }\n\n if (autoScroll.isScrolling) {\n raf.cancel(autoScroll.i);\n autoScroll.i = raf.request(autoScroll.scroll);\n }\n },\n check: function (interactable, actionName) {\n const options = interactable.options;\n\n return options[actionName].autoScroll && options[actionName].autoScroll.enabled;\n },\n onInteractionMove: function ({ interaction, pointer }) {\n if (!(interaction.interacting()\n && autoScroll.check(interaction.target, interaction.prepared.name))) {\n return;\n }\n\n if (interaction.simulation) {\n autoScroll.x = autoScroll.y = 0;\n return;\n }\n\n let top;\n let right;\n let bottom;\n let left;\n\n const options = interaction.target.options[interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(interaction.element);\n\n if (is.window(container)) {\n left = pointer.clientX < autoScroll.margin;\n top = pointer.clientY < autoScroll.margin;\n right = pointer.clientX > container.innerWidth - autoScroll.margin;\n bottom = pointer.clientY > container.innerHeight - autoScroll.margin;\n }\n else {\n const rect = domUtils.getElementClientRect(container);\n\n left = pointer.clientX < rect.left + autoScroll.margin;\n top = pointer.clientY < rect.top + autoScroll.margin;\n right = pointer.clientX > rect.right - autoScroll.margin;\n bottom = pointer.clientY > rect.bottom - autoScroll.margin;\n }\n\n autoScroll.x = (right ? 1: left? -1: 0);\n autoScroll.y = (bottom? 1: top? -1: 0);\n\n if (!autoScroll.isScrolling) {\n // set the autoScroll properties to those of the target\n autoScroll.margin = options.margin;\n autoScroll.speed = options.speed;\n\n autoScroll.start(interaction);\n }\n },\n};\n\nInteraction.signals.on('stop-active', function () {\n autoScroll.stop();\n});\n\nInteraction.signals.on('action-move', autoScroll.onInteractionMove);\n\ndefaultOptions.perAction.autoScroll = autoScroll.defaults;\n\nmodule.exports = autoScroll;\n","const Interactable = require('../Interactable');\nconst actions = require('../actions/base');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.ignoreFrom\n [ method ]\n *\n * If the target of the `mousedown`, `pointerdown` or `touchstart`\n * event or any of it's parents match the given CSS selector or\n * Element, no drag/resize/gesture is started.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to not ignore any elements\n = (string | Element | object) The current ignoreFrom value or this Interactable\n **\n | interact(element, { ignoreFrom: document.getElementById('no-action') });\n | // or\n | interact(element).ignoreFrom('input, textarea, a');\n\\*/\nInteractable.prototype.ignoreFrom = function (newValue) {\n return this._backCompatOption('ignoreFrom', newValue);\n};\n\n/*\\\n * Interactable.allowFrom\n [ method ]\n *\n * A drag/resize/gesture is started only If the target of the\n * `mousedown`, `pointerdown` or `touchstart` event or any of it's\n * parents match the given CSS selector or Element.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to allow from any element\n = (string | Element | object) The current allowFrom value or this Interactable\n **\n | interact(element, { allowFrom: document.getElementById('drag-handle') });\n | // or\n | interact(element).allowFrom('.handle');\n\\*/\nInteractable.prototype.allowFrom = function (newValue) {\n return this._backCompatOption('allowFrom', newValue);\n};\n\nInteractable.prototype.testIgnore = function (ignoreFrom, interactableElement, element) {\n if (!ignoreFrom || !is.element(element)) { return false; }\n\n if (is.string(ignoreFrom)) {\n return domUtils.matchesUpTo(element, ignoreFrom, interactableElement);\n }\n else if (is.element(ignoreFrom)) {\n return domUtils.nodeContains(ignoreFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testAllow = function (allowFrom, interactableElement, element) {\n if (!allowFrom) { return true; }\n\n if (!is.element(element)) { return false; }\n\n if (is.string(allowFrom)) {\n return domUtils.matchesUpTo(element, allowFrom, interactableElement);\n }\n else if (is.element(allowFrom)) {\n return domUtils.nodeContains(allowFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testIgnoreAllow = function (options, interactableElement, eventTarget) {\n return (!this.testIgnore(options.ignoreFrom, interactableElement, eventTarget)\n && this.testAllow(options.allowFrom, interactableElement, eventTarget));\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (event.buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\n","const interact = require('../interact');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst actions = require('../actions/base');\nconst defaultOptions = require('../defaultOptions');\nconst browser = require('../utils/browser');\nconst scope = require('../scope');\nconst utils = require('../utils');\nconst signals = require('../utils/Signals').new();\n\nrequire('./InteractableMethods');\n\nconst autoStart = {\n signals,\n withinInteractionLimit,\n // Allow this many interactions to happen simultaneously\n maxInteractions: Infinity,\n defaults: {\n perAction: {\n manualStart: false,\n max: Infinity,\n maxPerElement: 1,\n allowFrom: null,\n ignoreFrom: null,\n },\n },\n setActionDefaults: function (action) {\n utils.extend(action.defaults, autoStart.defaults.perAction);\n },\n};\n\n// set cursor style on mousedown\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget }) {\n if (interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\n// set cursor style on mousemove\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget }) {\n if (!interaction.mouse\n || interaction.pointerIsDown\n || interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\nInteraction.signals.on('move', function (arg) {\n const { interaction, event } = arg;\n\n if (!interaction.pointerIsDown\n || interaction.interacting()\n || !interaction.pointerWasMoved\n || !interaction.prepared.name) {\n return;\n }\n\n signals.fire('before-start', arg);\n\n const target = interaction.target;\n\n if (interaction.prepared.name && target) {\n // check manualStart and interaction limit\n if (target.options[interaction.prepared.name].manualStart\n || !withinInteractionLimit(target, interaction.element, interaction.prepared)) {\n interaction.stop(event);\n }\n else {\n interaction.start(interaction.prepared, target, interaction.element);\n }\n }\n});\n\n// Check if the current target supports the action.\n// If so, return the validated action. Otherwise, return null\nfunction validateAction (action, interactable, element, eventTarget) {\n if (utils.is.object(action)\n && interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget)\n && interactable.options[action.name].enabled\n && withinInteractionLimit(interactable, element, action)) {\n return action;\n }\n\n return null;\n}\n\nfunction validateSelector (interaction, pointer, event, matches, matchElements, eventTarget) {\n for (let i = 0, len = matches.length; i < len; i++) {\n const match = matches[i];\n const matchElement = matchElements[i];\n const action = validateAction(match.getAction(pointer, event, interaction, matchElement),\n match,\n matchElement,\n eventTarget);\n\n if (action) {\n return {\n action,\n target: match,\n element: matchElement,\n };\n }\n }\n\n return {};\n}\n\nfunction getActionInfo (interaction, pointer, event, eventTarget) {\n let matches = [];\n let matchElements = [];\n\n let element = eventTarget;\n let action = null;\n\n function pushMatches (interactable, selector, context) {\n const elements = (browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined);\n\n if (utils.matchesSelector(element, selector, elements)) {\n\n matches.push(interactable);\n matchElements.push(element);\n }\n }\n\n while (utils.is.element(element)) {\n matches = [];\n matchElements = [];\n\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && (action = validateAction(elementInteractable.getAction(pointer, event, interaction, element, eventTarget),\n elementInteractable,\n element,\n eventTarget))\n && !elementInteractable.options[action.name].manualStart) {\n return {\n element,\n action,\n target: elementInteractable,\n };\n }\n else {\n scope.interactables.forEachSelector(pushMatches, element);\n\n const actionInfo = validateSelector(interaction, pointer, event, matches, matchElements, eventTarget);\n\n if (actionInfo.action\n && !actionInfo.target.options[actionInfo.action.name].manualStart) {\n return actionInfo;\n }\n }\n\n element = utils.parentNode(element);\n }\n\n return {};\n}\n\nfunction prepare (interaction, { action, target, element }) {\n action = action || {};\n\n if (interaction.target && interaction.target.options.styleCursor) {\n interaction.target._doc.documentElement.style.cursor = '';\n }\n\n interaction.target = target;\n interaction.element = element;\n utils.copyAction(interaction.prepared, action);\n\n if (target && target.options.styleCursor) {\n const cursor = action? actions[action.name].getCursor(action) : '';\n interaction.target._doc.documentElement.style.cursor = cursor;\n }\n\n signals.fire('prepared', { interaction: interaction });\n}\n\nInteraction.signals.on('stop', function ({ interaction }) {\n const target = interaction.target;\n\n if (target && target.options.styleCursor) {\n target._doc.documentElement.style.cursor = '';\n }\n});\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (utils.is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (utils.is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n const buttons = event.buttons || ({\n 0: 1,\n 1: 4,\n 3: 8,\n 4: 16,\n })[event.button];\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\nfunction withinInteractionLimit (interactable, element, action) {\n const options = interactable.options;\n const maxActions = options[action.name].max;\n const maxPerElement = options[action.name].maxPerElement;\n let activeInteractions = 0;\n let targetCount = 0;\n let targetElementCount = 0;\n\n // no actions if any of these values == 0\n if (!(maxActions && maxPerElement && autoStart.maxInteractions)) { return; }\n\n for (let i = 0, len = scope.interactions.length; i < len; i++) {\n const interaction = scope.interactions[i];\n const otherAction = interaction.prepared.name;\n\n if (!interaction.interacting()) { continue; }\n\n activeInteractions++;\n\n if (activeInteractions >= autoStart.maxInteractions) {\n return false;\n }\n\n if (interaction.target !== interactable) { continue; }\n\n targetCount += (otherAction === action.name)|0;\n\n if (targetCount >= maxActions) {\n return false;\n }\n\n if (interaction.element === element) {\n targetElementCount++;\n\n if (otherAction !== action.name || targetElementCount >= maxPerElement) {\n return false;\n }\n }\n }\n\n return autoStart.maxInteractions > 0;\n}\n\n/*\\\n * interact.maxInteractions\n [ method ]\n **\n * Returns or sets the maximum number of concurrent interactions allowed.\n * By default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables\n * and elements, you need to enable it in the draggable, resizable and\n * gesturable `'max'` and `'maxPerElement'` options.\n **\n - newValue (number) #optional Any number. newValue <= 0 means no interactions.\n\\*/\ninteract.maxInteractions = function (newValue) {\n if (utils.is.number(newValue)) {\n autoStart.maxInteractions = newValue;\n\n return this;\n }\n\n return autoStart.maxInteractions;\n};\n\nInteractable.settingsMethods.push('styleCursor');\nInteractable.settingsMethods.push('actionChecker');\nInteractable.settingsMethods.push('ignoreFrom');\nInteractable.settingsMethods.push('allowFrom');\n\ndefaultOptions.base.actionChecker = null;\ndefaultOptions.base.styleCursor = true;\n\nutils.extend(defaultOptions.perAction, autoStart.defaults.perAction);\n\nmodule.exports = autoStart;\n","const autoStart = require('./base');\nconst Interaction = require('../Interaction');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.delayTimer = null;\n});\n\nautoStart.signals.on('prepared', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.delayTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.target, interaction.element);\n }, delay);\n }\n});\n\nInteraction.signals.on('move', function ({ interaction, duplicate }) {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.delayTimer);\n }\n});\n\n// prevent regular down->move autoStart\nautoStart.signals.on('before-start', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.prepared.name = null;\n }\n});\n","const autoStart = require('./base');\nconst scope = require('../scope');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\n\nconst { matchesSelector, parentNode } = require('../utils/domUtils');\n\nautoStart.setActionDefaults(require('../actions/drag'));\n\nautoStart.signals.on('before-start', function ({ interaction, eventTarget, dx, dy }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // check if a drag is in the correct axis\n const absX = Math.abs(dx);\n const absY = Math.abs(dy);\n const options = interaction.target.options.drag;\n const startAxis = options.startAxis;\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy');\n\n interaction.prepared.axis = options.lockAxis === 'start'\n ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n : options.lockAxis;\n\n // if the movement isn't in the startAxis of the interactable\n if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) {\n // cancel the prepared action\n interaction.prepared.name = null;\n\n // then try to get a drag from another ineractable\n\n if (!interaction.prepared.name) {\n\n let element = eventTarget;\n\n const getDraggable = function (interactable, selector, context) {\n const elements = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n if (interactable === interaction.target) { return; }\n\n if (!options.manualStart\n && !interactable.testIgnoreAllow(options, element, eventTarget)\n && matchesSelector(element, selector, elements)) {\n\n const action = interactable.getAction(interaction.downPointer,\n interaction.downEvent,\n interaction,\n element);\n\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, interactable)\n && autoStart.validateAction(action, interactable, element, eventTarget)) {\n\n return interactable;\n }\n }\n };\n\n let action = null;\n\n // check all interactables\n while (is.element(element)) {\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && elementInteractable !== interaction.target\n && !elementInteractable.options.drag.manualStart) {\n\n action = elementInteractable.getAction(interaction.downPointer, interaction.downEvent, interaction, element);\n }\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, elementInteractable)) {\n\n interaction.prepared.name = 'drag';\n interaction.target = elementInteractable;\n interaction.element = element;\n break;\n }\n\n const selectorInteractable = scope.interactables.forEachSelector(getDraggable, element);\n\n if (selectorInteractable) {\n interaction.prepared.name = 'drag';\n interaction.target = selectorInteractable;\n interaction.element = element;\n break;\n }\n\n element = parentNode(element);\n }\n }\n }\n});\n\nfunction checkStartAxis (startAxis, interactable) {\n if (!interactable) { return false; }\n\n const thisAxis = interactable.options.drag.startAxis;\n\n return (startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis);\n}\n","require('./base').setActionDefaults(require('../actions/gesture'));\n","require('./base').setActionDefaults(require('../actions/resize'));\n","module.exports = {\n base: {\n accept : null,\n preventDefault: 'auto',\n deltaSource : 'page',\n },\n\n perAction: {\n origin: { x: 0, y: 0 },\n\n // only allow left button by default\n // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n mouseButtons: 1,\n\n inertia: {\n enabled : false,\n resistance : 10, // the lambda in exponential decay\n minSpeed : 100, // target speed must be above this for inertia to start\n endSpeed : 10, // the speed at which inertia is slow enough to stop\n allowResume : true, // allow resuming an action in inertia phase\n smoothEndDuration: 300, // animate to snap/restrict endOnly if there's no inertia\n },\n },\n};\n","/* browser entry point */\n\n// Legacy browser support\nrequire('./legacyBrowsers');\n\n// inertia\nrequire('./inertia');\n\n// modifiers\nrequire('./modifiers/snap');\nrequire('./modifiers/restrict');\n\n// pointerEvents\nrequire('./pointerEvents/base');\nrequire('./pointerEvents/holdRepeat');\nrequire('./pointerEvents/interactableTargets');\n\n// delay\nrequire('./autoStart/delay');\n\n// actions\nrequire('./actions/gesture');\nrequire('./actions/resize');\nrequire('./actions/drag');\nrequire('./actions/drop');\n\n// load these modifiers after resize is loaded\nrequire('./modifiers/snapSize');\nrequire('./modifiers/restrictEdges');\nrequire('./modifiers/restrictSize');\n\n// autoStart actions\nrequire('./autoStart/gesture');\nrequire('./autoStart/resize');\nrequire('./autoStart/drag');\n\n// Interactable preventDefault setting\nrequire('./interactablePreventDefault.js');\n\n// autoScroll\nrequire('./autoScroll');\n\n// export interact\nmodule.exports = require('./interact');\n","const InteractEvent = require('./InteractEvent');\nconst Interaction = require('./Interaction');\nconst modifiers = require('./modifiers');\nconst utils = require('./utils');\nconst animationFrame = require('./utils/raf');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.inertiaStatus = {\n active : false,\n smoothEnd : false,\n allowResume: false,\n\n startEvent: null,\n upCoords : {},\n\n xe: 0, ye: 0,\n sx: 0, sy: 0,\n\n t0: 0,\n vx0: 0, vys: 0,\n duration: 0,\n\n lambda_v0: 0,\n one_ve_v0: 0,\n i : null,\n };\n\n interaction.boundInertiaFrame = () => inertiaFrame .apply(interaction);\n interaction.boundSmoothEndFrame = () => smoothEndFrame.apply(interaction);\n});\n\nInteraction.signals.on('down', function ({ interaction, event, pointer, eventTarget }) {\n const status = interaction.inertiaStatus;\n\n // Check if the down event hits the current inertia target\n if (status.active) {\n let element = eventTarget;\n\n // climb up the DOM tree from the event target\n while (utils.is.element(element)) {\n\n // if interaction element is the current inertia target element\n if (element === interaction.element) {\n // stop inertia\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n\n // update pointers to the down event's coordinates\n interaction.updatePointer(pointer);\n utils.setCoords(interaction.curCoords, interaction.pointers);\n\n // fire appropriate signals\n const signalArg = { interaction };\n Interaction.signals.fire('before-action-move', signalArg);\n Interaction.signals.fire('action-resume' , signalArg);\n\n // fire a reume event\n const resumeEvent = new InteractEvent(interaction,\n event,\n interaction.prepared.name,\n 'inertiaresume',\n interaction.element);\n\n interaction.target.fire(resumeEvent);\n interaction.prevEvent = resumeEvent;\n modifiers.resetStatuses(interaction.modifierStatuses);\n\n utils.copyCoords(interaction.prevCoords, interaction.curCoords);\n break;\n }\n\n element = utils.parentNode(element);\n }\n }\n});\n\nInteraction.signals.on('up', function ({ interaction, event }) {\n const status = interaction.inertiaStatus;\n\n if (!interaction.interacting() || status.active) { return; }\n\n const target = interaction.target;\n const options = target && target.options;\n const inertiaOptions = options && interaction.prepared.name && options[interaction.prepared.name].inertia;\n\n const now = new Date().getTime();\n const statuses = {};\n const page = utils.extend({}, interaction.curCoords.page);\n const pointerSpeed = interaction.pointerDelta.client.speed;\n\n let smoothEnd = false;\n let modifierResult;\n\n // check if inertia should be started\n const inertiaPossible = (inertiaOptions && inertiaOptions.enabled\n && interaction.prepared.name !== 'gesture'\n && event !== status.startEvent);\n\n const inertia = (inertiaPossible\n && (now - interaction.curCoords.timeStamp) < 50\n && pointerSpeed > inertiaOptions.minSpeed\n && pointerSpeed > inertiaOptions.endSpeed);\n\n const modifierArg = {\n interaction,\n pageCoords: page,\n statuses,\n preEnd: true,\n requireEndOnly: true,\n };\n\n // smoothEnd\n if (inertiaPossible && !inertia) {\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n if (modifierResult.shouldMove && modifierResult.locked) {\n smoothEnd = true;\n }\n }\n\n if (!(inertia || smoothEnd)) { return; }\n\n utils.copyCoords(status.upCoords, interaction.curCoords);\n\n interaction.pointers[0] = status.startEvent =\n new InteractEvent(interaction, event, interaction.prepared.name, 'inertiastart', interaction.element);\n\n status.t0 = now;\n\n status.active = true;\n status.allowResume = inertiaOptions.allowResume;\n interaction.simulation = status;\n\n target.fire(status.startEvent);\n\n if (inertia) {\n status.vx0 = interaction.pointerDelta.client.vx;\n status.vy0 = interaction.pointerDelta.client.vy;\n status.v0 = pointerSpeed;\n\n calcInertia(interaction, status);\n\n utils.extend(page, interaction.curCoords.page);\n\n page.x += status.xe;\n page.y += status.ye;\n\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n status.modifiedXe += modifierResult.dx;\n status.modifiedYe += modifierResult.dy;\n\n status.i = animationFrame.request(interaction.boundInertiaFrame);\n }\n else {\n status.smoothEnd = true;\n status.xe = modifierResult.dx;\n status.ye = modifierResult.dy;\n\n status.sx = status.sy = 0;\n\n status.i = animationFrame.request(interaction.boundSmoothEndFrame);\n }\n});\n\nInteraction.signals.on('stop-active', function ({ interaction }) {\n const status = interaction.inertiaStatus;\n\n if (status.active) {\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n }\n});\n\nfunction calcInertia (interaction, status) {\n const inertiaOptions = interaction.target.options[interaction.prepared.name].inertia;\n const lambda = inertiaOptions.resistance;\n const inertiaDur = -Math.log(inertiaOptions.endSpeed / status.v0) / lambda;\n\n status.x0 = interaction.prevEvent.pageX;\n status.y0 = interaction.prevEvent.pageY;\n status.t0 = status.startEvent.timeStamp / 1000;\n status.sx = status.sy = 0;\n\n status.modifiedXe = status.xe = (status.vx0 - inertiaDur) / lambda;\n status.modifiedYe = status.ye = (status.vy0 - inertiaDur) / lambda;\n status.te = inertiaDur;\n\n status.lambda_v0 = lambda / status.v0;\n status.one_ve_v0 = 1 - inertiaOptions.endSpeed / status.v0;\n}\n\nfunction inertiaFrame () {\n updateInertiaCoords(this);\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n\n const status = this.inertiaStatus;\n const options = this.target.options[this.prepared.name].inertia;\n const lambda = options.resistance;\n const t = new Date().getTime() / 1000 - status.t0;\n\n if (t < status.te) {\n\n const progress = 1 - (Math.exp(-lambda * t) - status.lambda_v0) / status.one_ve_v0;\n\n if (status.modifiedXe === status.xe && status.modifiedYe === status.ye) {\n status.sx = status.xe * progress;\n status.sy = status.ye * progress;\n }\n else {\n const quadPoint = utils.getQuadraticCurvePoint(0, 0,\n status.xe,\n status.ye,\n status.modifiedXe,\n status.modifiedYe,\n progress);\n\n status.sx = quadPoint.x;\n status.sy = quadPoint.y;\n }\n\n this.doMove();\n\n status.i = animationFrame.request(this.boundInertiaFrame);\n }\n else {\n status.sx = status.modifiedXe;\n status.sy = status.modifiedYe;\n\n this.doMove();\n this.end(status.startEvent);\n status.active = false;\n this.simulation = null;\n }\n\n utils.copyCoords(this.prevCoords, this.curCoords);\n}\n\nfunction smoothEndFrame () {\n updateInertiaCoords(this);\n\n const status = this.inertiaStatus;\n const t = new Date().getTime() - status.t0;\n const duration = this.target.options[this.prepared.name].inertia.smoothEndDuration;\n\n if (t < duration) {\n status.sx = utils.easeOutQuad(t, 0, status.xe, duration);\n status.sy = utils.easeOutQuad(t, 0, status.ye, duration);\n\n this.pointerMove(status.startEvent, status.startEvent);\n\n status.i = animationFrame.request(this.boundSmoothEndFrame);\n }\n else {\n status.sx = status.xe;\n status.sy = status.ye;\n\n this.pointerMove(status.startEvent, status.startEvent);\n this.end(status.startEvent);\n\n status.smoothEnd =\n status.active = false;\n this.simulation = null;\n }\n}\n\nfunction updateInertiaCoords (interaction) {\n const status = interaction.inertiaStatus;\n\n // return if inertia isn't running\n if (!status.active) { return; }\n\n const pageUp = status.upCoords.page;\n const clientUp = status.upCoords.client;\n\n utils.setCoords(interaction.curCoords, [ {\n pageX : pageUp.x + status.sx,\n pageY : pageUp.y + status.sy,\n clientX: clientUp.x + status.sx,\n clientY: clientUp.y + status.sy,\n } ]);\n}\n","const browser = require('./utils/browser');\nconst events = require('./utils/events');\nconst utils = require('./utils');\nconst scope = require('./scope');\nconst Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\n\nconst globalEvents = {};\n\n/*\\\n * interact\n [ method ]\n *\n * The methods of this variable can be used to set elements as\n * interactables and also to change various default settings.\n *\n * Calling it as a function and passing an element or a valid CSS selector\n * string returns an Interactable object which has various methods to\n * configure it.\n *\n - element (Element | string) The HTML or SVG Element to interact with or CSS selector\n = (object) An @Interactable\n *\n > Usage\n | interact('#draggable').draggable(true);\n |\n | var rectables = interact('rect');\n | rectables\n | .gesturable(true)\n | .on('gesturemove', function (event) {\n | // ...\n | });\n\\*/\nfunction interact (element, options) {\n let interactable = scope.interactables.get(element, options);\n\n if (!interactable) {\n interactable = new Interactable(element, options);\n interactable.events.global = globalEvents;\n }\n\n return interactable;\n}\n\n/*\\\n * interact.isSet\n [ method ]\n *\n * Check if an element has been set\n - element (Element) The Element being searched for\n = (boolean) Indicates if the element or CSS selector was previously passed to interact\n\\*/\ninteract.isSet = function (element, options) {\n return scope.interactables.indexOfElement(element, options && options.context) !== -1;\n};\n\n/*\\\n * interact.on\n [ method ]\n *\n * Adds a global listener for an InteractEvent or adds a DOM event to\n * `document`\n *\n - type (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) interact\n\\*/\ninteract.on = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.on(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.on(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n // if it is an InteractEvent type, add listener to globalEvents\n if (utils.contains(Interactable.eventTypes, type)) {\n // if this type of event was never bound\n if (!globalEvents[type]) {\n globalEvents[type] = [listener];\n }\n else {\n globalEvents[type].push(listener);\n }\n }\n // If non InteractEvent type, addEventListener to document\n else {\n events.add(scope.document, type, listener, { options });\n }\n\n return interact;\n};\n\n/*\\\n * interact.off\n [ method ]\n *\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n - type (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) interact\n \\*/\ninteract.off = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.off(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.off(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n if (!utils.contains(Interactable.eventTypes, type)) {\n events.remove(scope.document, type, listener, options);\n }\n else {\n let index;\n\n if (type in globalEvents\n && (index = utils.indexOf(globalEvents[type], listener)) !== -1) {\n globalEvents[type].splice(index, 1);\n }\n }\n\n return interact;\n};\n\n/*\\\n * interact.debug\n [ method ]\n *\n * Returns an object which exposes internal data\n = (object) An object with properties that outline the current state and expose internal functions and variables\n\\*/\ninteract.debug = function () {\n return scope;\n};\n\n// expose the functions used to calculate multi-touch properties\ninteract.getPointerAverage = utils.pointerAverage;\ninteract.getTouchBBox = utils.touchBBox;\ninteract.getTouchDistance = utils.touchDistance;\ninteract.getTouchAngle = utils.touchAngle;\n\ninteract.getElementRect = utils.getElementRect;\ninteract.getElementClientRect = utils.getElementClientRect;\ninteract.matchesSelector = utils.matchesSelector;\ninteract.closest = utils.closest;\n\n/*\\\n * interact.supportsTouch\n [ method ]\n *\n = (boolean) Whether or not the browser supports touch input\n\\*/\ninteract.supportsTouch = function () {\n return browser.supportsTouch;\n};\n\n/*\\\n * interact.supportsPointerEvent\n [ method ]\n *\n = (boolean) Whether or not the browser supports PointerEvents\n\\*/\ninteract.supportsPointerEvent = function () {\n return browser.supportsPointerEvent;\n};\n\n/*\\\n * interact.stop\n [ method ]\n *\n * Cancels all interactions (end events are not fired)\n *\n - event (Event) An event on which to call preventDefault()\n = (object) interact\n\\*/\ninteract.stop = function (event) {\n for (let i = scope.interactions.length - 1; i >= 0; i--) {\n scope.interactions[i].stop(event);\n }\n\n return interact;\n};\n\n/*\\\n * interact.pointerMoveTolerance\n [ method ]\n * Returns or sets the distance the pointer must be moved before an action\n * sequence occurs. This also affects tolerance for tap events.\n *\n - newValue (number) #optional The movement from the start position must be greater than this value\n = (number | Interactable) The current setting or interact\n\\*/\ninteract.pointerMoveTolerance = function (newValue) {\n if (utils.is.number(newValue)) {\n Interaction.pointerMoveTolerance = newValue;\n\n return this;\n }\n\n return Interaction.pointerMoveTolerance;\n};\n\ninteract.addDocument = scope.addDocument;\ninteract.removeDocument = scope.removeDocument;\n\nscope.interact = interact;\n\nmodule.exports = interact;\n","const Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\nconst scope = require('./scope');\nconst is = require('./utils/is');\nconst events = require('./utils/events');\n\nconst { nodeContains, matchesSelector } = require('./utils/domUtils');\n\n/*\\\n * Interactable.preventDefault\n [ method ]\n *\n * Returns or sets whether to prevent the browser's default behaviour\n * in response to pointer events. Can be set to:\n * - `'always'` to always prevent\n * - `'never'` to never prevent\n * - `'auto'` to let interact.js try to determine what would be best\n *\n - newValue (string) #optional `true`, `false` or `'auto'`\n = (string | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.preventDefault = function (newValue) {\n if (/^(always|never|auto)$/.test(newValue)) {\n this.options.preventDefault = newValue;\n return this;\n }\n\n if (is.bool(newValue)) {\n this.options.preventDefault = newValue? 'always' : 'never';\n return this;\n }\n\n return this.options.preventDefault;\n};\n\nInteractable.prototype.checkAndPreventDefault = function (event) {\n const setting = this.options.preventDefault;\n\n if (setting === 'never') { return; }\n\n if (setting === 'always') {\n event.preventDefault();\n return;\n }\n\n // setting === 'auto'\n\n // don't preventDefault if the browser supports passiveEvents\n // CSS touch-action and user-selecct should be used instead\n if (events.supportsOptions) {\n return;\n }\n\n // don't preventDefault of pointerdown events\n if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) {\n return;\n }\n\n // don't preventDefault on editable elements\n if (is.element(event.target)\n && matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) {\n return;\n }\n\n event.preventDefault();\n};\n\nfunction onInteractionEvent ({ interaction, event }) {\n if (interaction.target) {\n interaction.target.checkAndPreventDefault(event);\n }\n}\n\nfor (const eventSignal of ['down', 'move', 'up', 'cancel']) {\n Interaction.signals.on(eventSignal, onInteractionEvent);\n}\n\n// prevent native HTML5 drag on interact.js target elements\nInteraction.docEvents.dragstart = function preventNativeDrag (event) {\n for (const interaction of scope.interactions) {\n\n if (interaction.element\n && (interaction.element === event.target\n || nodeContains(interaction.element, event.target))) {\n\n interaction.target.checkAndPreventDefault(event);\n return;\n }\n }\n};\n","const scope = require('./scope');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst iFinder = require('./utils/interactionFinder');\nconst pointerEvents = require('./pointerEvents/base');\n\nconst { window } = require('./utils/window');\n\nconst toString = Object.prototype.toString;\n\nif (!window.Array.isArray) {\n window.Array.isArray = function (obj) {\n return toString.call(obj) === '[object Array]';\n };\n}\n\nif (!String.prototype.trim) {\n String.prototype.trim = function () {\n return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n };\n}\n\n// http://www.quirksmode.org/dom/events/click.html\n// >Events leading to dblclick\n//\n// IE8 doesn't fire down event before dblclick.\n// This workaround tries to fire a tap and doubletap after dblclick\nfunction onIE8Dblclick (event) {\n const eventTarget = event.target;\n const interaction = iFinder.search(event, event.type, eventTarget);\n\n if (!interaction) { return; }\n\n if (interaction.prevTap\n && event.clientX === interaction.prevTap.clientX\n && event.clientY === interaction.prevTap.clientY\n && eventTarget === interaction.prevTap.target) {\n\n interaction.downTargets[0] = eventTarget;\n interaction.downTimes [0] = new Date().getTime();\n\n pointerEvents.fire({\n interaction,\n event,\n eventTarget,\n pointer: event,\n type: 'tap',\n });\n }\n}\n\nif (browser.isIE8) {\n const selectFix = function (event) {\n for (const interaction of scope.interactions) {\n if (interaction.interacting()) {\n interaction.target.checkAndPreventDefault(event);\n }\n }\n };\n\n const onDocIE8 = function onDocIE8 ({ doc, win }, signalName) {\n const eventMethod = signalName.indexOf('listen') === 0\n ? events.add : events.remove;\n\n // For IE's lack of Event#preventDefault\n eventMethod(doc, 'selectstart', selectFix);\n\n if (pointerEvents) {\n eventMethod(doc, 'dblclick', onIE8Dblclick);\n }\n };\n\n scope.signals.on('add-document' , onDocIE8);\n scope.signals.on('remove-document', onDocIE8);\n}\n\nmodule.exports = null;\n","const InteractEvent = require('../InteractEvent');\nconst Interaction = require('../Interaction');\nconst extend = require('../utils/extend');\n\nconst modifiers = {\n names: [],\n\n setOffsets: function (arg) {\n const { interaction, pageCoords: page } = arg;\n const { target, element, startOffset } = interaction;\n const rect = target.getRect(element);\n\n if (rect) {\n startOffset.left = page.x - rect.left;\n startOffset.top = page.y - rect.top;\n\n startOffset.right = rect.right - page.x;\n startOffset.bottom = rect.bottom - page.y;\n\n if (!('width' in rect)) { rect.width = rect.right - rect.left; }\n if (!('height' in rect)) { rect.height = rect.bottom - rect.top ; }\n }\n else {\n startOffset.left = startOffset.top = startOffset.right = startOffset.bottom = 0;\n }\n\n arg.rect = rect;\n arg.interactable = target;\n arg.element = element;\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n\n arg.options = target.options[interaction.prepared.name][modifierName];\n\n if (!arg.options) {\n continue;\n }\n\n interaction.modifierOffsets[modifierName] = modifiers[modifierName].setOffset(arg);\n }\n },\n\n setAll: function (arg) {\n const { interaction, statuses, preEnd, requireEndOnly } = arg;\n const coords = extend({}, arg.pageCoords);\n const result = {\n dx: 0,\n dy: 0,\n changed: false,\n locked: false,\n shouldMove: true,\n };\n\n for (const modifierName of modifiers.names) {\n const modifier = modifiers[modifierName];\n const options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!shouldDo(options, preEnd, requireEndOnly)) { continue; }\n\n arg.status = arg.status = statuses[modifierName];\n arg.options = options;\n arg.offset = arg.interaction.modifierOffsets[modifierName];\n\n modifier.set(arg);\n\n if (arg.status.locked) {\n coords.x += arg.status.dx;\n coords.y += arg.status.dy;\n\n result.dx += arg.status.dx;\n result.dy += arg.status.dy;\n\n result.locked = true;\n }\n }\n\n // a move should be fired if:\n // - there are no modifiers enabled,\n // - no modifiers are \"locked\" i.e. have changed the pointer's coordinates, or\n // - the locked coords have changed since the last pointer move\n result.shouldMove = !arg.status || !result.locked || arg.status.changed;\n\n return result;\n },\n\n resetStatuses: function (statuses) {\n for (const modifierName of modifiers.names) {\n const status = statuses[modifierName] || {};\n\n status.dx = status.dy = 0;\n status.modifiedX = status.modifiedY = NaN;\n status.locked = false;\n status.changed = true;\n\n statuses[modifierName] = status;\n }\n\n return statuses;\n },\n\n start: function ({ interaction }, signalName) {\n const arg = {\n interaction,\n pageCoords: (signalName === 'action-resume' ?\n interaction.curCoords : interaction.startCoords).page,\n startOffset: interaction.startOffset,\n statuses: interaction.modifierStatuses,\n preEnd: false,\n requireEndOnly: false,\n };\n\n modifiers.setOffsets(arg);\n modifiers.resetStatuses(arg.statuses);\n\n arg.pageCoords = extend({}, interaction.startCoords.page);\n interaction.modifierResult = modifiers.setAll(arg);\n },\n};\n\nInteraction.signals.on('new', function (interaction) {\n interaction.startOffset = { left: 0, right: 0, top: 0, bottom: 0 };\n interaction.modifierOffsets = {};\n interaction.modifierStatuses = modifiers.resetStatuses({});\n interaction.modifierResult = null;\n});\n\nInteraction.signals.on('action-start' , modifiers.start);\nInteraction.signals.on('action-resume', modifiers.start);\n\nInteraction.signals.on('before-action-move', function ({ interaction, preEnd, interactingBeforeMove }) {\n const modifierResult = modifiers.setAll({\n interaction,\n preEnd,\n pageCoords: interaction.curCoords.page,\n statuses: interaction.modifierStatuses,\n requireEndOnly: false,\n });\n\n // don't fire an action move if a modifier would keep the event in the same\n // cordinates as before\n if (!modifierResult.shouldMove && interactingBeforeMove) {\n interaction._dontFireMove = true;\n }\n\n interaction.modifierResult = modifierResult;\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n for (let i = 0; i < modifiers.names.length; i++) {\n const options = interaction.target.options[interaction.prepared.name][modifiers.names[i]];\n\n // if the endOnly option is true for any modifier\n if (shouldDo(options, true, true)) {\n // fire a move event at the modified coordinates\n interaction.doMove({ event, preEnd: true });\n break;\n }\n }\n});\n\nInteractEvent.signals.on('set-xy', function (arg) {\n const { iEvent, interaction } = arg;\n const modifierArg = extend({}, arg);\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n modifierArg.options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!modifierArg.options) {\n continue;\n }\n\n const modifier = modifiers[modifierName];\n\n modifierArg.status = interaction.modifierStatuses[modifierName];\n\n iEvent[modifierName] = modifier.modifyCoords(modifierArg);\n }\n});\n\nfunction shouldDo (options, preEnd, requireEndOnly) {\n return (options && options.enabled\n && (preEnd || !options.endOnly)\n && (!requireEndOnly || options.endOnly));\n}\n\nmodule.exports = modifiers;\n","const modifiers = require('./index');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst restrict = {\n defaults: {\n enabled : false,\n endOnly : false,\n restriction: null,\n elementRect: null,\n },\n\n setOffset: function ({ rect, startOffset, options }) {\n const elementRect = options && options.elementRect;\n const offset = {};\n\n if (rect && elementRect) {\n offset.left = startOffset.left - (rect.width * elementRect.left);\n offset.top = startOffset.top - (rect.height * elementRect.top);\n\n offset.right = startOffset.right - (rect.width * (1 - elementRect.right));\n offset.bottom = startOffset.bottom - (rect.height * (1 - elementRect.bottom));\n }\n else {\n offset.left = offset.top = offset.right = offset.bottom = 0;\n }\n\n return offset;\n },\n\n set: function ({ pageCoords, interaction, status, options }) {\n if (!options) { return status; }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n\n const restriction = getRestrictionRect(options.restriction, interaction, page);\n\n if (!restriction) { return status; }\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n const rect = restriction;\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n const offset = interaction.modifierOffsets.restrict;\n\n // object is assumed to have\n // x, y, width, height or\n // left, top, right, bottom\n if ('x' in restriction && 'y' in restriction) {\n modifiedX = Math.max(Math.min(rect.x + rect.width - offset.right , page.x), rect.x + offset.left);\n modifiedY = Math.max(Math.min(rect.y + rect.height - offset.bottom, page.y), rect.y + offset.top );\n }\n else {\n modifiedX = Math.max(Math.min(rect.right - offset.right , page.x), rect.left + offset.left);\n modifiedY = Math.max(Math.min(rect.bottom - offset.bottom, page.y), rect.top + offset.top );\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const elementRect = options && options.elementRect;\n\n if (options && options.enabled\n && !(phase === 'start' && elementRect && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n getRestrictionRect,\n};\n\nfunction getRestrictionRect (value, interaction, page) {\n if (utils.is.function(value)) {\n return utils.resolveRectLike(value, interaction.target, interaction.element, [page.x, page.y, interaction]);\n } else {\n return utils.resolveRectLike(value, interaction.target, interaction.element);\n }\n}\n\nmodifiers.restrict = restrict;\nmodifiers.names.push('restrict');\n\ndefaultOptions.perAction.restrict = restrict.defaults;\n\nmodule.exports = restrict;\n","// This module adds the options.resize.restrictEdges setting which sets min and\n// max for the top, left, bottom and right edges of the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictEdges: {\n// inner: { top: 200, left: 200, right: 400, bottom: 400 },\n// outer: { top: 0, left: 0, right: 600, bottom: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst { getRestrictionRect } = require('./restrict');\n\nconst noInner = { top: +Infinity, left: +Infinity, bottom: -Infinity, right: -Infinity };\nconst noOuter = { top: -Infinity, left: -Infinity, bottom: +Infinity, right: +Infinity };\n\nconst restrictEdges = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n offset: null,\n },\n\n setOffset: function ({ interaction, startOffset, options }) {\n if (!options) {\n return utils.extend({}, startOffset);\n }\n\n const offset = getRestrictionRect(options.offset, interaction, interaction.startCoords.page);\n\n if (offset) {\n return {\n top: startOffset.top + offset.y,\n left: startOffset.left + offset.x,\n bottom: startOffset.bottom + offset.y,\n right: startOffset.right + offset.x,\n };\n }\n\n return startOffset;\n },\n\n set: function ({ pageCoords, interaction, status, offset, options }) {\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n const inner = rectUtils.xywhToTlbr(getRestrictionRect(options.inner, interaction, page)) || noInner;\n const outer = rectUtils.xywhToTlbr(getRestrictionRect(options.outer, interaction, page)) || noOuter;\n\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n if (edges.top) {\n modifiedY = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top);\n }\n else if (edges.bottom) {\n modifiedY = Math.max(Math.min(outer.bottom - offset.bottom, page.y), inner.bottom - offset.bottom);\n }\n if (edges.left) {\n modifiedX = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left);\n }\n else if (edges.right) {\n modifiedX = Math.max(Math.min(outer.right - offset.right, page.x), inner.right - offset.right);\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n if (options && options.enabled\n && !(phase === 'start' && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n noInner,\n noOuter,\n getRestrictionRect,\n};\n\nmodifiers.restrictEdges = restrictEdges;\nmodifiers.names.push('restrictEdges');\n\ndefaultOptions.perAction.restrictEdges = restrictEdges.defaults;\nresize.defaults.restrictEdges = restrictEdges.defaults;\n\nmodule.exports = restrictEdges;\n","// This module adds the options.resize.restrictSize setting which sets min and\n// max width and height for the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictSize: {\n// min: { width: -600, height: -600 },\n// max: { width: 600, height: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst restrictEdges = require('./restrictEdges');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst noMin = { width: -Infinity, height: -Infinity };\nconst noMax = { width: +Infinity, height: +Infinity };\n\nconst restrictSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n },\n\n setOffset: function ({ interaction }) {\n return interaction.startOffset;\n },\n\n set: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const rect = rectUtils.xywhToTlbr(interaction.resizeRects.inverted);\n\n const minSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.min, interaction)) || noMin;\n const maxSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.max, interaction)) || noMax;\n\n arg.options = {\n enabled: options.enabled,\n endOnly: options.endOnly,\n inner: utils.extend({}, restrictEdges.noInner),\n outer: utils.extend({}, restrictEdges.noOuter),\n };\n\n if (edges.top) {\n arg.options.inner.top = rect.bottom - minSize.height;\n arg.options.outer.top = rect.bottom - maxSize.height;\n }\n else if (edges.bottom) {\n arg.options.inner.bottom = rect.top + minSize.height;\n arg.options.outer.bottom = rect.top + maxSize.height;\n }\n if (edges.left) {\n arg.options.inner.left = rect.right - minSize.width;\n arg.options.outer.left = rect.right - maxSize.width;\n }\n else if (edges.right) {\n arg.options.inner.right = rect.left + minSize.width;\n arg.options.outer.right = rect.left + maxSize.width;\n }\n\n restrictEdges.set(arg);\n },\n\n modifyCoords: restrictEdges.modifyCoords,\n};\n\nmodifiers.restrictSize = restrictSize;\nmodifiers.names.push('restrictSize');\n\ndefaultOptions.perAction.restrictSize = restrictSize.defaults;\nresize.defaults.restrictSize = restrictSize.defaults;\n\nmodule.exports = restrictSize;\n","const modifiers = require('./index');\nconst interact = require('../interact');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst snap = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n\n relativePoints: null,\n },\n\n setOffset: function ({ interaction, interactable, element, rect, startOffset, options }) {\n const offsets = [];\n const optionsOrigin = utils.rectToXY(utils.resolveRectLike(options.origin));\n const origin = optionsOrigin || utils.getOriginXY(interactable, element, interaction.prepared.name);\n options = options || interactable.options[interaction.prepared.name].snap || {};\n\n let snapOffset;\n\n if (options.offset === 'startCoords') {\n snapOffset = {\n x: interaction.startCoords.page.x - origin.x,\n y: interaction.startCoords.page.y - origin.y,\n };\n }\n else {\n const offsetRect = utils.resolveRectLike(options.offset, interactable, element, [interaction]);\n\n snapOffset = utils.rectToXY(offsetRect) || { x: 0, y: 0 };\n }\n\n if (rect && options.relativePoints && options.relativePoints.length) {\n for (const { x: relativeX, y: relativeY } of options.relativePoints) {\n offsets.push({\n x: startOffset.left - (rect.width * relativeX) + snapOffset.x,\n y: startOffset.top - (rect.height * relativeY) + snapOffset.y,\n });\n }\n }\n else {\n offsets.push(snapOffset);\n }\n\n return offsets;\n },\n\n set: function ({ interaction, pageCoords, status, options, offset: offsets }) {\n const targets = [];\n let target;\n let page;\n let i;\n\n if (status.useStatusXY) {\n page = { x: status.x, y: status.y };\n }\n else {\n const origin = utils.getOriginXY(interaction.target, interaction.element, interaction.prepared.name);\n\n page = utils.extend({}, pageCoords);\n\n page.x -= origin.x;\n page.y -= origin.y;\n }\n\n status.realX = page.x;\n status.realY = page.y;\n\n let len = options.targets? options.targets.length : 0;\n\n for (const { x: offsetX, y: offsetY } of offsets) {\n const relativeX = page.x - offsetX;\n const relativeY = page.y - offsetY;\n\n for (const snapTarget of options.targets) {\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n targets.push({\n x: utils.is.number(target.x) ? (target.x + offsetX) : relativeX,\n y: utils.is.number(target.y) ? (target.y + offsetY) : relativeY,\n\n range: utils.is.number(target.range)? target.range: options.range,\n });\n }\n }\n\n const closest = {\n target: null,\n inRange: false,\n distance: 0,\n range: 0,\n dx: 0,\n dy: 0,\n };\n\n for (i = 0, len = targets.length; i < len; i++) {\n target = targets[i];\n\n const range = target.range;\n const dx = target.x - page.x;\n const dy = target.y - page.y;\n const distance = utils.hypot(dx, dy);\n let inRange = distance <= range;\n\n // Infinite targets count as being out of range\n // compared to non infinite ones that are in range\n if (range === Infinity && closest.inRange && closest.range !== Infinity) {\n inRange = false;\n }\n\n if (!closest.target || (inRange\n // is the closest target in range?\n ? (closest.inRange && range !== Infinity\n // the pointer is relatively deeper in this target\n ? distance / range < closest.distance / closest.range\n // this target has Infinite range and the closest doesn't\n : (range === Infinity && closest.range !== Infinity)\n // OR this target is closer that the previous closest\n || distance < closest.distance)\n // The other is not in range and the pointer is closer to this target\n : (!closest.inRange && distance < closest.distance))) {\n\n closest.target = target;\n closest.distance = distance;\n closest.range = range;\n closest.inRange = inRange;\n closest.dx = dx;\n closest.dy = dy;\n\n status.range = range;\n }\n }\n\n let snapChanged;\n\n if (closest.target) {\n snapChanged = (status.modifiedX !== closest.target.x || status.modifiedY !== closest.target.y);\n\n status.modifiedX = closest.target.x;\n status.modifiedY = closest.target.y;\n }\n else {\n snapChanged = true;\n\n status.modifiedX = NaN;\n status.modifiedY = NaN;\n }\n\n status.dx = closest.dx;\n status.dy = closest.dy;\n\n status.changed = (snapChanged || (closest.inRange && !status.locked));\n status.locked = closest.inRange;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const relativePoints = options && options.relativePoints;\n\n if (options && options.enabled\n && !(phase === 'start' && relativePoints && relativePoints.length)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n }\n\n return {\n range : status.range,\n locked : status.locked,\n x : status.modifiedX,\n y : status.modifiedY,\n realX : status.realX,\n realY : status.realY,\n dx : status.dx,\n dy : status.dy,\n };\n }\n },\n};\n\ninteract.createSnapGrid = function (grid) {\n return function (x, y) {\n const limits = grid.limits || {\n left : -Infinity,\n right : Infinity,\n top : -Infinity,\n bottom: Infinity,\n };\n let offsetX = 0;\n let offsetY = 0;\n\n if (utils.is.object(grid.offset)) {\n offsetX = grid.offset.x;\n offsetY = grid.offset.y;\n }\n\n const gridx = Math.round((x - offsetX) / grid.x);\n const gridy = Math.round((y - offsetY) / grid.y);\n\n const newX = Math.max(limits.left, Math.min(limits.right , gridx * grid.x + offsetX));\n const newY = Math.max(limits.top , Math.min(limits.bottom, gridy * grid.y + offsetY));\n\n return {\n x: newX,\n y: newY,\n range: grid.range,\n };\n };\n};\n\nmodifiers.snap = snap;\nmodifiers.names.push('snap');\n\ndefaultOptions.perAction.snap = snap.defaults;\n\nmodule.exports = snap;\n","// This module allows snapping of the size of targets during resize\n// interactions.\n\nconst modifiers = require('./index');\nconst snap = require('./snap');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\nconst utils = require('../utils/');\n\nconst snapSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n },\n\n setOffset: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.edges;\n\n if (!edges) { return; }\n\n arg.options = {\n relativePoints: [{\n x: edges.left? 0 : 1,\n y: edges.top ? 0 : 1,\n }],\n origin: { x: 0, y: 0 },\n offset: 'self',\n range: options.range,\n };\n\n const offsets = snap.setOffset(arg);\n arg.options = options;\n\n return offsets;\n },\n\n set: function (arg) {\n const { interaction, options, offset, pageCoords } = arg;\n const page = utils.extend({}, pageCoords);\n const relativeX = page.x - offset[0].x;\n const relativeY = page.y - offset[0].y;\n\n arg.options = utils.extend({}, options);\n arg.options.targets = [];\n\n for (const snapTarget of options.targets) {\n let target;\n\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n if ('width' in target && 'height' in target) {\n target.x = target.width;\n target.y = target.height;\n }\n\n arg.options.targets.push(target);\n }\n\n snap.set(arg);\n },\n\n modifyCoords: function (arg) {\n const { options } = arg;\n\n arg.options = utils.extend({}, options);\n arg.options.enabled = options.enabled;\n arg.options.relativePoints = [null];\n\n snap.modifyCoords(arg);\n },\n};\n\nmodifiers.snapSize = snapSize;\nmodifiers.names.push('snapSize');\n\ndefaultOptions.perAction.snapSize = snapSize.defaults;\nresize.defaults.snapSize = snapSize.defaults;\n\nmodule.exports = snapSize;\n","const pointerUtils = require('../utils/pointerUtils');\n\nmodule.exports = class PointerEvent {\n constructor (type, pointer, event, eventTarget, interaction) {\n pointerUtils.pointerExtend(this, event);\n\n if (event !== pointer) {\n pointerUtils.pointerExtend(this, pointer);\n }\n\n this.interaction = interaction;\n\n this.timeStamp = new Date().getTime();\n this.originalEvent = event;\n this.type = type;\n this.pointerId = pointerUtils.getPointerId(pointer);\n this.pointerType = pointerUtils.getPointerType(pointer, interaction);\n this.target = eventTarget;\n this.currentTarget = null;\n\n if (type === 'tap') {\n const pointerIndex = interaction.getPointerIndex(pointer);\n this.dt = this.timeStamp - interaction.downTimes[pointerIndex];\n\n const interval = this.timeStamp - interaction.tapTime;\n\n this.double = !!(interaction.prevTap\n && interaction.prevTap.type !== 'doubletap'\n && interaction.prevTap.target === this.target\n && interval < 500);\n }\n else if (type === 'doubletap') {\n this.dt = pointer.timeStamp - interaction.tapTime;\n }\n }\n\n subtractOrigin ({ x: originX, y: originY }) {\n this.pageX -= originX;\n this.pageY -= originY;\n this.clientX -= originX;\n this.clientY -= originY;\n\n return this;\n }\n\n addOrigin ({ x: originX, y: originY }) {\n this.pageX += originX;\n this.pageY += originY;\n this.clientX += originX;\n this.clientY += originY;\n\n return this;\n }\n\n preventDefault () {\n this.originalEvent.preventDefault();\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n};\n","const PointerEvent = require('./PointerEvent');\nconst Interaction = require('../Interaction');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst defaults = require('../defaultOptions');\nconst signals = require('../utils/Signals').new();\nconst { filter } = require('../utils/arr');\n\nconst simpleSignals = [ 'down', 'up', 'cancel' ];\nconst simpleEvents = [ 'down', 'up', 'cancel' ];\n\nconst pointerEvents = {\n PointerEvent,\n fire,\n collectEventTargets,\n signals,\n defaults: {\n holdDuration: 600,\n ignoreFrom : null,\n allowFrom : null,\n origin : { x: 0, y: 0 },\n },\n types: [\n 'down',\n 'move',\n 'up',\n 'cancel',\n 'tap',\n 'doubletap',\n 'hold',\n ],\n};\n\nfunction fire (arg) {\n const {\n interaction, pointer, event, eventTarget,\n type = arg.pointerEvent.type,\n targets = collectEventTargets(arg),\n pointerEvent = new PointerEvent(type, pointer, event, eventTarget, interaction),\n } = arg;\n\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n targets,\n type,\n pointerEvent,\n };\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n\n for (const prop in target.props || {}) {\n pointerEvent[prop] = target.props[prop];\n }\n\n const origin = utils.getOriginXY(target.eventable, target.element);\n\n pointerEvent.subtractOrigin(origin);\n pointerEvent.eventable = target.eventable;\n pointerEvent.currentTarget = target.element;\n\n target.eventable.fire(pointerEvent);\n\n pointerEvent.addOrigin(origin);\n\n if (pointerEvent.immediatePropagationStopped\n || (pointerEvent.propagationStopped\n && (i + 1) < targets.length && targets[i + 1].element !== pointerEvent.currentTarget)) {\n break;\n }\n }\n\n signals.fire('fired', signalArg);\n\n if (type === 'tap') {\n // if pointerEvent should make a double tap, create and fire a doubletap\n // PointerEvent and use that as the prevTap\n const prevTap = pointerEvent.double\n ? fire({\n interaction, pointer, event, eventTarget,\n type: 'doubletap',\n })\n : pointerEvent;\n\n interaction.prevTap = prevTap;\n interaction.tapTime = prevTap.timeStamp;\n }\n\n return pointerEvent;\n}\n\nfunction collectEventTargets ({ interaction, pointer, event, eventTarget, type }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n // do not fire a tap event if the pointer was moved before being lifted\n if (type === 'tap' && (interaction.pointerWasMoved\n // or if the pointerup target is different to the pointerdown target\n || !(interaction.downTargets[pointerIndex] && interaction.downTargets[pointerIndex] === eventTarget))) {\n return [];\n }\n\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n path,\n targets: [],\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (type === 'hold') {\n signalArg.targets = filter(signalArg.targets, target =>\n target.eventable.options.holdDuration === interaction.holdTimers[pointerIndex].duration);\n }\n\n return signalArg.targets;\n}\n\nInteraction.signals.on('update-pointer-down', function ({ interaction, pointerIndex }) {\n interaction.holdTimers[pointerIndex] = { duration: Infinity, timeout: null };\n});\n\nInteraction.signals.on('remove-pointer', function ({ interaction, pointerIndex }) {\n interaction.holdTimers.splice(pointerIndex, 1);\n});\n\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget, duplicateMove }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n if (!duplicateMove && (!interaction.pointerIsDown || interaction.pointerWasMoved)) {\n if (interaction.pointerIsDown) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n\n fire({\n interaction, pointer, event, eventTarget,\n type: 'move',\n });\n }\n});\n\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget, pointerIndex }) {\n // copy event to be used in timeout for IE8\n const eventCopy = browser.isIE8? utils.extend({}, event) : event;\n\n const timer = interaction.holdTimers[pointerIndex];\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'hold',\n targets: [],\n path,\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (!signalArg.targets.length) { return; }\n\n let minDuration = Infinity;\n\n for (let i = 0; i < signalArg.targets.length; i++) {\n const target = signalArg.targets[i];\n const holdDuration = target.eventable.options.holdDuration;\n\n if (holdDuration < minDuration) {\n minDuration = holdDuration;\n }\n }\n\n timer.duration = minDuration;\n timer.timeout = setTimeout(function () {\n fire({\n interaction, eventCopy, eventTarget,\n pointer: browser.isIE8? eventCopy : pointer,\n type: 'hold',\n });\n }, minDuration);\n});\n\nInteraction.signals.on('up', ({ interaction, pointer, event, eventTarget }) => {\n if (!interaction.pointerWasMoved) {\n fire({ interaction, eventTarget, pointer, event, type: 'tap' });\n }\n});\n\n['up', 'cancel'].forEach(function (signalName) {\n Interaction.signals.on(signalName, function ({ interaction, pointerIndex }) {\n if (interaction.holdTimers[pointerIndex]) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n });\n});\n\nfunction createSignalListener (type) {\n return function ({ interaction, pointer, event, eventTarget }) {\n fire({ interaction, eventTarget, pointer, event, type });\n };\n}\n\nfor (let i = 0; i < simpleSignals.length; i++) {\n Interaction.signals.on(simpleSignals[i], createSignalListener(simpleEvents[i]));\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.prevTap = null; // the most recent tap event on this interaction\n interaction.tapTime = 0; // time of the most recent tap event\n interaction.holdTimers = []; // [{ duration, timeout }]\n});\n\ndefaults.pointerEvents = pointerEvents.defaults;\nmodule.exports = pointerEvents;\n","const pointerEvents = require('./base');\nconst Interaction = require('../Interaction');\n\npointerEvents.signals.on('new', onNew);\npointerEvents.signals.on('fired', onFired);\n\nfor (const signal of ['move', 'up', 'cancel', 'endall']) {\n Interaction.signals.on(signal, endHoldRepeat);\n}\n\nfunction onNew ({ pointerEvent }) {\n if (pointerEvent.type !== 'hold') { return; }\n\n pointerEvent.count = (pointerEvent.count || 0) + 1;\n}\n\nfunction onFired ({ interaction, pointerEvent, eventTarget, targets }) {\n if (pointerEvent.type !== 'hold' || !targets.length) { return; }\n\n // get the repeat interval from the first eventable\n const interval = targets[0].eventable.options.holdRepeatInterval;\n\n // don't repeat if the interval is 0 or less\n if (interval <= 0) { return; }\n\n // set a timeout to fire the holdrepeat event\n interaction.holdIntervalHandle = setTimeout(function () {\n pointerEvents.fire({\n interaction,\n eventTarget,\n type: 'hold',\n pointer: pointerEvent,\n event: pointerEvent,\n });\n }, interval);\n}\n\nfunction endHoldRepeat ({ interaction }) {\n // set the interaction's holdStopTime property\n // to stop further holdRepeat events\n if (interaction.holdIntervalHandle) {\n clearInterval(interaction.holdIntervalHandle);\n interaction.holdIntervalHandle = null;\n }\n}\n\n// don't repeat by default\npointerEvents.defaults.holdRepeatInterval = 0;\npointerEvents.types.push('holdrepeat');\n\nmodule.exports = {\n onNew,\n onFired,\n endHoldRepeat,\n};\n","const pointerEvents = require('./base');\nconst Interactable = require('../Interactable');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\nconst scope = require('../scope');\nconst extend = require('../utils/extend');\nconst { merge } = require('../utils/arr');\n\npointerEvents.signals.on('collect-targets', function ({ targets, element, type, eventTarget }) {\n function collectSelectors (interactable, selector, context) {\n const els = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && is.element(element)\n && domUtils.matchesSelector(element, selector, els)\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n const interactable = scope.interactables.get(element);\n\n if (interactable) {\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n scope.interactables.forEachSelector(collectSelectors, element);\n});\n\nInteractable.signals.on('new', function ({ interactable }) {\n interactable.events.getRect = function (element) {\n return interactable.getRect(element);\n };\n});\n\nInteractable.signals.on('set', function ({ interactable, options }) {\n extend(interactable.events.options, pointerEvents.defaults);\n extend(interactable.events.options, options);\n});\n\nmerge(Interactable.eventTypes, pointerEvents.types);\n\nInteractable.prototype.pointerEvents = function (options) {\n extend(this.events.options, options);\n\n return this;\n};\n\nconst __backCompatOption = Interactable.prototype._backCompatOption;\n\nInteractable.prototype._backCompatOption = function (optionName, newValue) {\n const ret = __backCompatOption.call(this, optionName, newValue);\n\n if (ret === this) {\n this.events.options[optionName] = newValue;\n }\n\n return ret;\n};\n\nInteractable.settingsMethods.push('pointerEvents');\n","const utils = require('./utils');\nconst events = require('./utils/events');\nconst signals = require('./utils/Signals').new();\n\nconst scope = {\n signals,\n events,\n utils,\n\n // main document\n document: require('./utils/domObjects').document,\n // all documents being listened to\n documents: [],\n\n addDocument: function (doc, win) {\n // do nothing if document is already known\n if (utils.contains(scope.documents, doc)) { return false; }\n\n win = win || scope.getWindow(doc);\n\n scope.documents.push(doc);\n events.documents.push(doc);\n\n // don't add an unload event for the main document\n // so that the page may be cached in browser history\n if (doc !== scope.document) {\n events.add(win, 'unload', scope.onWindowUnload);\n }\n\n signals.fire('add-document', { doc, win });\n },\n\n removeDocument: function (doc, win) {\n const index = utils.indexOf(scope.documents, doc);\n\n win = win || scope.getWindow(doc);\n\n events.remove(win, 'unload', scope.onWindowUnload);\n\n scope.documents.splice(index, 1);\n events.documents.splice(index, 1);\n\n signals.fire('remove-document', { win, doc });\n },\n\n onWindowUnload: function () {\n scope.removeDocument(this.document, this);\n },\n};\n\nmodule.exports = scope;\n","const { indexOf } = require('./arr');\n\nclass Signals {\n constructor () {\n this.listeners = {\n // signalName: [listeners],\n };\n }\n\n on (name, listener) {\n if (!this.listeners[name]) {\n this.listeners[name] = [listener];\n return;\n }\n\n this.listeners[name].push(listener);\n }\n\n off (name, listener) {\n if (!this.listeners[name]) { return; }\n\n const index = indexOf(this.listeners[name], listener);\n\n if (index !== -1) {\n this.listeners[name].splice(index, 1);\n }\n }\n\n fire (name, arg) {\n const targetListeners = this.listeners[name];\n\n if (!targetListeners) { return; }\n\n for (let i = 0; i < targetListeners.length; i++) {\n if (targetListeners[i](arg, name) === false) {\n return;\n }\n }\n }\n}\n\nSignals.new = function () {\n return new Signals();\n};\n\nmodule.exports = Signals;\n","function indexOf (array, target) {\n for (let i = 0, len = array.length; i < len; i++) {\n if (array[i] === target) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction contains (array, target) {\n return indexOf(array, target) !== -1;\n}\n\nfunction merge (target, source) {\n for (let i = 0; i < source.length; i++) {\n target.push(source[i]);\n }\n\n return target;\n}\n\nfunction filter (array, test) {\n const result = [];\n\n for (let i = 0; i < array.length; i++) {\n if (test(array[i])) {\n result.push(array[i]);\n }\n }\n\n return result;\n}\n\nmodule.exports = {\n indexOf,\n contains,\n merge,\n filter,\n};\n","const { window } = require('./window');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst Element = domObjects.Element;\nconst navigator = window.navigator;\n\nconst browser = {\n // Does the browser support touch input?\n supportsTouch: !!(('ontouchstart' in window) || is.function(window.DocumentTouch)\n && domObjects.document instanceof window.DocumentTouch),\n\n // Does the browser support PointerEvents\n supportsPointerEvent: !!domObjects.PointerEvent,\n\n isIE8: ('attachEvent' in window) && !('addEventListener' in window),\n\n // Opera Mobile must be handled differently\n isOperaMobile: (navigator.appName === 'Opera'\n && browser.supportsTouch\n && navigator.userAgent.match('Presto')),\n\n // scrolling doesn't change the result of getClientRects on iOS 7\n isIOS7: (/iP(hone|od|ad)/.test(navigator.platform)\n && /OS 7[^\\d]/.test(navigator.appVersion)),\n\n isIe9OrOlder: /MSIE (8|9)/.test(navigator.userAgent),\n\n // prefix matchesSelector\n prefixedMatchesSelector: 'matches' in Element.prototype\n ? 'matches': 'webkitMatchesSelector' in Element.prototype\n ? 'webkitMatchesSelector': 'mozMatchesSelector' in Element.prototype\n ? 'mozMatchesSelector': 'oMatchesSelector' in Element.prototype\n ? 'oMatchesSelector': 'msMatchesSelector',\n\n useMatchesSelectorPolyfill: false,\n\n pEventTypes: (domObjects.PointerEvent\n ? (domObjects.PointerEvent === window.MSPointerEvent\n ? {\n up: 'MSPointerUp',\n down: 'MSPointerDown',\n over: 'mouseover',\n out: 'mouseout',\n move: 'MSPointerMove',\n cancel: 'MSPointerCancel',\n }\n : {\n up: 'pointerup',\n down: 'pointerdown',\n over: 'pointerover',\n out: 'pointerout',\n move: 'pointermove',\n cancel: 'pointercancel',\n })\n : null),\n\n // because Webkit and Opera still use 'mousewheel' event type\n wheelEvent: 'onmousewheel' in domObjects.document? 'mousewheel': 'wheel',\n\n};\n\nbrowser.useMatchesSelectorPolyfill = !is.function(Element.prototype[browser.prefixedMatchesSelector]);\n\nmodule.exports = browser;\n","const domObjects = {};\nconst win = require('./window').window;\n\nfunction blank () {}\n\ndomObjects.document = win.document;\ndomObjects.DocumentFragment = win.DocumentFragment || blank;\ndomObjects.SVGElement = win.SVGElement || blank;\ndomObjects.SVGSVGElement = win.SVGSVGElement || blank;\ndomObjects.SVGElementInstance = win.SVGElementInstance || blank;\ndomObjects.Element = win.Element || blank;\ndomObjects.HTMLElement = win.HTMLElement || domObjects.Element;\n\ndomObjects.Event = win.Event;\ndomObjects.Touch = win.Touch || blank;\ndomObjects.PointerEvent = (win.PointerEvent || win.MSPointerEvent);\n\nmodule.exports = domObjects;\n","const win = require('./window');\nconst browser = require('./browser');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst domUtils = {\n nodeContains: function (parent, child) {\n while (child) {\n if (child === parent) {\n return true;\n }\n\n child = child.parentNode;\n }\n\n return false;\n },\n\n closest: function (element, selector) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) { return element; }\n\n element = domUtils.parentNode(element);\n }\n\n return null;\n },\n\n parentNode: function (node) {\n let parent = node.parentNode;\n\n if (is.docFrag(parent)) {\n // skip past #shado-root fragments\n while ((parent = parent.host) && is.docFrag(parent)) {\n continue;\n }\n\n return parent;\n }\n\n return parent;\n },\n\n // taken from http://tanalin.com/en/blog/2012/12/matches-selector-ie8/ and modified\n matchesSelectorPolyfill: browser.useMatchesSelectorPolyfill\n ? function (element, selector, elems) {\n elems = elems || element.parentNode.querySelectorAll(selector);\n\n for (let i = 0, len = elems.length; i < len; i++) {\n if (elems[i] === element) {\n return true;\n }\n }\n\n return false;\n }\n : null,\n\n matchesSelector: function (element, selector, nodeList) {\n if (browser.useMatchesSelectorPolyfill) {\n return domUtils.matchesSelectorPolyfill(element, selector, nodeList);\n }\n\n // remove /deep/ from selectors if shadowDOM polyfill is used\n if (win.window !== win.realWindow) {\n selector = selector.replace(/\\/deep\\//g, ' ');\n }\n\n return element[browser.prefixedMatchesSelector](selector);\n },\n\n // Test for the element that's \"above\" all other qualifiers\n indexOfDeepestElement: function (elements) {\n let deepestZoneParents = [];\n let dropzoneParents = [];\n let dropzone;\n let deepestZone = elements[0];\n let index = deepestZone? 0: -1;\n let parent;\n let child;\n let i;\n let n;\n\n for (i = 1; i < elements.length; i++) {\n dropzone = elements[i];\n\n // an element might belong to multiple selector dropzones\n if (!dropzone || dropzone === deepestZone) {\n continue;\n }\n\n if (!deepestZone) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n // check if the deepest or current are document.documentElement or document.rootElement\n // - if the current dropzone is, do nothing and continue\n if (dropzone.parentNode === dropzone.ownerDocument) {\n continue;\n }\n // - if deepest is, update with the current dropzone and continue to next\n else if (deepestZone.parentNode === dropzone.ownerDocument) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n if (!deepestZoneParents.length) {\n parent = deepestZone;\n while (parent.parentNode && parent.parentNode !== parent.ownerDocument) {\n deepestZoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n }\n\n // if this element is an svg element and the current deepest is\n // an HTMLElement\n if (deepestZone instanceof domObjects.HTMLElement\n && dropzone instanceof domObjects.SVGElement\n && !(dropzone instanceof domObjects.SVGSVGElement)) {\n\n if (dropzone === deepestZone.parentNode) {\n continue;\n }\n\n parent = dropzone.ownerSVGElement;\n }\n else {\n parent = dropzone;\n }\n\n dropzoneParents = [];\n\n while (parent.parentNode !== parent.ownerDocument) {\n dropzoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n\n n = 0;\n\n // get (position of last common ancestor) + 1\n while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) {\n n++;\n }\n\n const parents = [\n dropzoneParents[n - 1],\n dropzoneParents[n],\n deepestZoneParents[n],\n ];\n\n child = parents[0].lastChild;\n\n while (child) {\n if (child === parents[1]) {\n deepestZone = dropzone;\n index = i;\n deepestZoneParents = [];\n\n break;\n }\n else if (child === parents[2]) {\n break;\n }\n\n child = child.previousSibling;\n }\n }\n\n return index;\n },\n\n matchesUpTo: function (element, selector, limit) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) {\n return true;\n }\n\n element = domUtils.parentNode(element);\n\n if (element === limit) {\n return domUtils.matchesSelector(element, selector);\n }\n }\n\n return false;\n },\n\n getActualElement: function (element) {\n return (element instanceof domObjects.SVGElementInstance\n ? element.correspondingUseElement\n : element);\n },\n\n getScrollXY: function (relevantWindow) {\n relevantWindow = relevantWindow || win.window;\n return {\n x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft,\n y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop,\n };\n },\n\n getElementClientRect: function (element) {\n const clientRect = (element instanceof domObjects.SVGElement\n ? element.getBoundingClientRect()\n : element.getClientRects()[0]);\n\n return clientRect && {\n left : clientRect.left,\n right : clientRect.right,\n top : clientRect.top,\n bottom: clientRect.bottom,\n width : clientRect.width || clientRect.right - clientRect.left,\n height: clientRect.height || clientRect.bottom - clientRect.top,\n };\n },\n\n getElementRect: function (element) {\n const clientRect = domUtils.getElementClientRect(element);\n\n if (!browser.isIOS7 && clientRect) {\n const scroll = domUtils.getScrollXY(win.getWindow(element));\n\n clientRect.left += scroll.x;\n clientRect.right += scroll.x;\n clientRect.top += scroll.y;\n clientRect.bottom += scroll.y;\n }\n\n return clientRect;\n },\n\n getPath: function (element) {\n const path = [];\n\n while (element) {\n path.push(element);\n element = domUtils.parentNode(element);\n }\n\n return path;\n },\n\n trySelector: value => {\n if (!is.string(value)) { return false; }\n\n // an exception will be raised if it is invalid\n domObjects.document.querySelector(value);\n return true;\n },\n};\n\nmodule.exports = domUtils;\n","const is = require('./is');\nconst domUtils = require('./domUtils');\nconst pExtend = require('./pointerExtend');\n\nconst { window, getWindow } = require('./window');\nconst { indexOf, contains } = require('./arr');\n\nconst useAttachEvent = ('attachEvent' in window) && !('addEventListener' in window);\nconst addEvent = useAttachEvent? 'attachEvent': 'addEventListener';\nconst removeEvent = useAttachEvent? 'detachEvent': 'removeEventListener';\nconst on = useAttachEvent? 'on': '';\n\nconst elements = [];\nconst targets = [];\nconst attachedListeners = [];\n\n// {\n// type: {\n// selectors: ['selector', ...],\n// contexts : [document, ...],\n// listeners: [[listener, capture, passive], ...]\n// }\n// }\nconst delegatedEvents = {};\n\nconst documents = [];\n\nconst supportsOptions = !useAttachEvent && (() => {\n let supported = false;\n\n window.document.createElement('div').addEventListener('test', null, {\n get capture () { supported = true; },\n });\n\n return supported;\n})();\n\nfunction add (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n let elementIndex = indexOf(elements, element);\n let target = targets[elementIndex];\n\n if (!target) {\n target = {\n events: {},\n typeCount: 0,\n };\n\n elementIndex = elements.push(element) - 1;\n targets.push(target);\n\n attachedListeners.push(useAttachEvent\n ? {\n supplied: [],\n wrapped : [],\n useCount: [],\n }\n : null);\n }\n\n if (!target.events[type]) {\n target.events[type] = [];\n target.typeCount++;\n }\n\n if (!contains(target.events[type], listener)) {\n let ret;\n\n if (useAttachEvent) {\n const { supplied, wrapped, useCount } = attachedListeners[elementIndex];\n const listenerIndex = indexOf(supplied, listener);\n\n const wrappedListener = wrapped[listenerIndex] || function (event) {\n if (!event.immediatePropagationStopped) {\n event.target = event.srcElement;\n event.currentTarget = element;\n\n event.preventDefault = event.preventDefault || preventDef;\n event.stopPropagation = event.stopPropagation || stopProp;\n event.stopImmediatePropagation = event.stopImmediatePropagation || stopImmProp;\n\n if (/mouse|click/.test(event.type)) {\n event.pageX = event.clientX + getWindow(element).document.documentElement.scrollLeft;\n event.pageY = event.clientY + getWindow(element).document.documentElement.scrollTop;\n }\n\n listener(event);\n }\n };\n\n ret = element[addEvent](on + type, wrappedListener, !!options.capture);\n\n if (listenerIndex === -1) {\n supplied.push(listener);\n wrapped.push(wrappedListener);\n useCount.push(1);\n }\n else {\n useCount[listenerIndex]++;\n }\n }\n else {\n ret = element[addEvent](type, listener, supportsOptions? options : !!options.capture);\n }\n target.events[type].push(listener);\n\n return ret;\n }\n}\n\nfunction remove (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const elementIndex = indexOf(elements, element);\n const target = targets[elementIndex];\n\n if (!target || !target.events) {\n return;\n }\n\n let wrappedListener = listener;\n let listeners;\n let listenerIndex;\n\n if (useAttachEvent) {\n listeners = attachedListeners[elementIndex];\n listenerIndex = indexOf(listeners.supplied, listener);\n wrappedListener = listeners.wrapped[listenerIndex];\n }\n\n if (type === 'all') {\n for (type in target.events) {\n if (target.events.hasOwnProperty(type)) {\n remove(element, type, 'all');\n }\n }\n return;\n }\n\n if (target.events[type]) {\n const len = target.events[type].length;\n\n if (listener === 'all') {\n for (let i = 0; i < len; i++) {\n remove(element, type, target.events[type][i], options);\n }\n return;\n }\n else {\n for (let i = 0; i < len; i++) {\n if (target.events[type][i] === listener) {\n element[removeEvent](on + type, wrappedListener, supportsOptions? options : !!options.capture);\n target.events[type].splice(i, 1);\n\n if (useAttachEvent && listeners) {\n listeners.useCount[listenerIndex]--;\n if (listeners.useCount[listenerIndex] === 0) {\n listeners.supplied.splice(listenerIndex, 1);\n listeners.wrapped.splice(listenerIndex, 1);\n listeners.useCount.splice(listenerIndex, 1);\n }\n }\n\n break;\n }\n }\n }\n\n if (target.events[type] && target.events[type].length === 0) {\n target.events[type] = null;\n target.typeCount--;\n }\n }\n\n if (!target.typeCount) {\n targets.splice(elementIndex, 1);\n elements.splice(elementIndex, 1);\n attachedListeners.splice(elementIndex, 1);\n }\n}\n\nfunction addDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n if (!delegatedEvents[type]) {\n delegatedEvents[type] = {\n selectors: [],\n contexts : [],\n listeners: [],\n };\n\n // add delegate listener functions\n for (let i = 0; i < documents.length; i++) {\n add(documents[i], type, delegateListener);\n add(documents[i], type, delegateUseCapture, true);\n }\n }\n\n const delegated = delegatedEvents[type];\n let index;\n\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n break;\n }\n }\n\n if (index === -1) {\n index = delegated.selectors.length;\n\n delegated.selectors.push(selector);\n delegated.contexts .push(context);\n delegated.listeners.push([]);\n }\n\n // keep listener and capture and passive flags\n delegated.listeners[index].push([listener, !!options.capture, options.passive]);\n}\n\nfunction removeDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const delegated = delegatedEvents[type];\n let matchFound = false;\n let index;\n\n if (!delegated) { return; }\n\n // count from last index of delegated to 0\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n // look for matching selector and context Node\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n\n const listeners = delegated.listeners[index];\n\n // each item of the listeners array is an array: [function, capture, passive]\n for (let i = listeners.length - 1; i >= 0; i--) {\n const [fn, capture, passive] = listeners[i];\n\n // check if the listener functions and capture and passive flags match\n if (fn === listener && capture === !!options.capture && passive === options.passive) {\n // remove the listener from the array of listeners\n listeners.splice(i, 1);\n\n // if all listeners for this interactable have been removed\n // remove the interactable from the delegated arrays\n if (!listeners.length) {\n delegated.selectors.splice(index, 1);\n delegated.contexts .splice(index, 1);\n delegated.listeners.splice(index, 1);\n\n // remove delegate function from context\n remove(context, type, delegateListener);\n remove(context, type, delegateUseCapture, true);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegatedEvents[type] = null;\n }\n }\n\n // only remove one listener\n matchFound = true;\n break;\n }\n }\n\n if (matchFound) { break; }\n }\n }\n}\n\n// bound to the interactable context when a DOM event\n// listener is added to a selector interactable\nfunction delegateListener (event, optionalArg) {\n const options = getOptions(optionalArg);\n const fakeEvent = {};\n const delegated = delegatedEvents[event.type];\n const eventTarget = (domUtils.getActualElement(event.path\n ? event.path[0]\n : event.target));\n let element = eventTarget;\n\n // duplicate the event so that currentTarget can be changed\n pExtend(fakeEvent, event);\n\n fakeEvent.originalEvent = event;\n fakeEvent.preventDefault = preventOriginalDefault;\n\n // climb up document tree looking for selector matches\n while (is.element(element)) {\n for (let i = 0; i < delegated.selectors.length; i++) {\n const selector = delegated.selectors[i];\n const context = delegated.contexts[i];\n\n if (domUtils.matchesSelector(element, selector)\n && domUtils.nodeContains(context, eventTarget)\n && domUtils.nodeContains(context, element)) {\n\n const listeners = delegated.listeners[i];\n\n fakeEvent.currentTarget = element;\n\n for (let j = 0; j < listeners.length; j++) {\n const [fn, capture, passive] = listeners[j];\n\n if (capture === !!options.capture && passive === options.passive) {\n fn(fakeEvent);\n }\n }\n }\n }\n\n element = domUtils.parentNode(element);\n }\n}\n\nfunction delegateUseCapture (event) {\n return delegateListener.call(this, event, true);\n}\n\nfunction preventDef () {\n this.returnValue = false;\n}\n\nfunction preventOriginalDefault () {\n this.originalEvent.preventDefault();\n}\n\nfunction stopProp () {\n this.cancelBubble = true;\n}\n\nfunction stopImmProp () {\n this.cancelBubble = true;\n this.immediatePropagationStopped = true;\n}\n\nfunction getOptions (param) {\n return is.object(param)? param : { capture: param };\n}\n\nmodule.exports = {\n add,\n remove,\n\n addDelegate,\n removeDelegate,\n\n delegateListener,\n delegateUseCapture,\n delegatedEvents,\n documents,\n\n useAttachEvent,\n supportsOptions,\n\n _elements: elements,\n _targets: targets,\n _attachedListeners: attachedListeners,\n};\n","module.exports = function extend (dest, source) {\n for (const prop in source) {\n dest[prop] = source[prop];\n }\n return dest;\n};\n","const {\n resolveRectLike,\n rectToXY,\n} = require('./rect');\n\nmodule.exports = function (target, element, action) {\n const actionOptions = target.options[action];\n const actionOrigin = actionOptions && actionOptions.origin;\n const origin = actionOrigin || target.options.origin;\n\n const originRect = resolveRectLike(origin, target, element, [target && element]);\n\n return rectToXY(originRect) || { x: 0, y: 0 };\n};\n","module.exports = (x, y) => Math.sqrt(x * x + y * y);\n","const extend = require('./extend');\nconst win = require('./window');\n\nconst utils = {\n warnOnce: function (method, message) {\n let warned = false;\n\n return function () {\n if (!warned) {\n win.window.console.warn(message);\n warned = true;\n }\n\n return method.apply(this, arguments);\n };\n },\n\n // http://stackoverflow.com/a/5634528/2280888\n _getQBezierValue: function (t, p1, p2, p3) {\n const iT = 1 - t;\n return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3;\n },\n\n getQuadraticCurvePoint: function (startX, startY, cpX, cpY, endX, endY, position) {\n return {\n x: utils._getQBezierValue(position, startX, cpX, endX),\n y: utils._getQBezierValue(position, startY, cpY, endY),\n };\n },\n\n // http://gizma.com/easing/\n easeOutQuad: function (t, b, c, d) {\n t /= d;\n return -c * t*(t-2) + b;\n },\n\n copyAction: function (dest, src) {\n dest.name = src.name;\n dest.axis = src.axis;\n dest.edges = src.edges;\n\n return dest;\n },\n\n is : require('./is'),\n extend : extend,\n hypot : require('./hypot'),\n getOriginXY: require('./getOriginXY'),\n};\n\nextend(utils, require('./arr'));\nextend(utils, require('./domUtils'));\nextend(utils, require('./pointerUtils'));\nextend(utils, require('./rect'));\n\nmodule.exports = utils;\n","const scope = require('../scope');\nconst utils = require('./index');\nconst browser = require('./browser');\n\nconst finder = {\n methodOrder: [ 'simulationResume', 'mouse', 'hasPointer', 'idle' ],\n\n search: function (pointer, eventType, eventTarget) {\n const mouseEvent = (/mouse/i.test(pointer.pointerType || eventType)\n // MSPointerEvent.MSPOINTER_TYPE_MOUSE\n || pointer.pointerType === 4);\n const pointerId = utils.getPointerId(pointer);\n const details = { pointer, pointerId, mouseEvent, eventType, eventTarget };\n\n for (const method of finder.methodOrder) {\n const interaction = finder[method](details);\n\n if (interaction) {\n return interaction;\n }\n }\n },\n\n // try to resume simulation with a new pointer\n simulationResume: function ({ mouseEvent, eventType, eventTarget }) {\n if (!/down|start/i.test(eventType)) {\n return null;\n }\n\n for (const interaction of scope.interactions) {\n let element = eventTarget;\n\n if (interaction.simulation && interaction.simulation.allowResume\n && (interaction.mouse === mouseEvent)) {\n while (element) {\n // if the element is the interaction element\n if (element === interaction.element) {\n return interaction;\n }\n element = utils.parentNode(element);\n }\n }\n }\n\n return null;\n },\n\n // if it's a mouse interaction\n mouse: function ({ pointerId, mouseEvent, eventType }) {\n if (!mouseEvent && (browser.supportsTouch || browser.supportsPointerEvent)) {\n return null;\n }\n\n let firstNonActive;\n\n for (const interaction of scope.interactions) {\n if (interaction.mouse) {\n // if it's a down event, skip interactions with running simulations\n if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; }\n\n // if the interaction is active, return it immediately\n if (interaction.interacting()) {\n return interaction;\n }\n // otherwise save it and look for another active interaction\n else if (!firstNonActive) {\n firstNonActive = interaction;\n }\n }\n }\n\n // if no active mouse interaction was found use the first inactive mouse\n // interaction\n if (firstNonActive) {\n return firstNonActive;\n }\n\n // Find any interaction specifically for mouse.\n // ignore the interaction if the eventType is a mousedown, and a simulation\n // is active\n for (const interaction of scope.interactions) {\n if (interaction.mouse && !(/down/.test(eventType) && interaction.simulation)) {\n return interaction;\n }\n }\n\n return null;\n },\n\n // get interaction that has this pointer\n hasPointer: function ({ pointerId }) {\n for (const interaction of scope.interactions) {\n if (utils.contains(interaction.pointerIds, pointerId)) {\n return interaction;\n }\n }\n },\n\n // get first idle interaction\n idle: function ({ mouseEvent }) {\n for (const interaction of scope.interactions) {\n // if there's already a pointer held down\n if (interaction.pointerIds.length === 1) {\n const target = interaction.target;\n // don't add this pointer if there is a target interactable and it\n // isn't gesturable\n if (target && !target.options.gesture.enabled) {\n continue;\n }\n }\n // maximum of 2 pointers per interaction\n else if (interaction.pointerIds.length >= 2) {\n continue;\n }\n\n if (!interaction.interacting() && (mouseEvent === interaction.mouse)) {\n return interaction;\n }\n }\n\n return null;\n },\n};\n\nmodule.exports = finder;\n","const win = require('./window');\nconst isWindow = require('./isWindow');\n\nconst is = {\n array : () => {},\n\n window : thing => thing === win.window || isWindow(thing),\n\n docFrag : thing => is.object(thing) && thing.nodeType === 11,\n\n object : thing => !!thing && (typeof thing === 'object'),\n\n function: thing => typeof thing === 'function',\n\n number : thing => typeof thing === 'number' ,\n\n bool : thing => typeof thing === 'boolean' ,\n\n string : thing => typeof thing === 'string' ,\n\n element: thing => {\n if (!thing || (typeof thing !== 'object')) { return false; }\n\n const _window = win.getWindow(thing) || win.window;\n\n return (/object|function/.test(typeof _window.Element)\n ? thing instanceof _window.Element //DOM2\n : thing.nodeType === 1 && typeof thing.nodeName === 'string');\n },\n};\n\nis.array = thing => (is.object(thing)\n && (typeof thing.length !== 'undefined')\n && is.function(thing.splice));\n\nmodule.exports = is;\n","module.exports = (thing) => !!(thing && thing.Window) && (thing instanceof thing.Window);\n","function pointerExtend (dest, source) {\n for (const prop in source) {\n const prefixedPropREs = module.exports.prefixedPropREs;\n let deprecated = false;\n\n // skip deprecated prefixed properties\n for (const vendor in prefixedPropREs) {\n if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) {\n deprecated = true;\n break;\n }\n }\n\n if (!deprecated && typeof source[prop] !== 'function') {\n dest[prop] = source[prop];\n }\n }\n return dest;\n}\n\npointerExtend.prefixedPropREs = {\n webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/,\n};\n\nmodule.exports = pointerExtend;\n","const hypot = require('./hypot');\nconst browser = require('./browser');\nconst dom = require('./domObjects');\nconst domUtils = require('./domUtils');\nconst is = require('./is');\nconst pointerExtend = require('./pointerExtend');\n\nconst pointerUtils = {\n copyCoords: function (dest, src) {\n dest.page = dest.page || {};\n dest.page.x = src.page.x;\n dest.page.y = src.page.y;\n\n dest.client = dest.client || {};\n dest.client.x = src.client.x;\n dest.client.y = src.client.y;\n\n dest.timeStamp = src.timeStamp;\n },\n\n setCoordDeltas: function (targetObj, prev, cur) {\n targetObj.page.x = cur.page.x - prev.page.x;\n targetObj.page.y = cur.page.y - prev.page.y;\n targetObj.client.x = cur.client.x - prev.client.x;\n targetObj.client.y = cur.client.y - prev.client.y;\n targetObj.timeStamp = cur.timeStamp - prev.timeStamp;\n\n // set pointer velocity\n const dt = Math.max(targetObj.timeStamp / 1000, 0.001);\n\n targetObj.page.speed = hypot(targetObj.page.x, targetObj.page.y) / dt;\n targetObj.page.vx = targetObj.page.x / dt;\n targetObj.page.vy = targetObj.page.y / dt;\n\n targetObj.client.speed = hypot(targetObj.client.x, targetObj.page.y) / dt;\n targetObj.client.vx = targetObj.client.x / dt;\n targetObj.client.vy = targetObj.client.y / dt;\n },\n\n isNativePointer: function (pointer) {\n return (pointer instanceof dom.Event || pointer instanceof dom.Touch);\n },\n\n // Get specified X/Y coords for mouse or event.touches[0]\n getXY: function (type, pointer, xy) {\n xy = xy || {};\n type = type || 'page';\n\n xy.x = pointer[type + 'X'];\n xy.y = pointer[type + 'Y'];\n\n return xy;\n },\n\n getPageXY: function (pointer, page) {\n page = page || {};\n\n // Opera Mobile handles the viewport and scrolling oddly\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n pointerUtils.getXY('screen', pointer, page);\n\n page.x += window.scrollX;\n page.y += window.scrollY;\n }\n else {\n pointerUtils.getXY('page', pointer, page);\n }\n\n return page;\n },\n\n getClientXY: function (pointer, client) {\n client = client || {};\n\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n // Opera Mobile handles the viewport and scrolling oddly\n pointerUtils.getXY('screen', pointer, client);\n }\n else {\n pointerUtils.getXY('client', pointer, client);\n }\n\n return client;\n },\n\n getPointerId: function (pointer) {\n return is.number(pointer.pointerId)? pointer.pointerId : pointer.identifier;\n },\n\n setCoords: function (targetObj, pointers, timeStamp) {\n const pointer = (pointers.length > 1\n ? pointerUtils.pointerAverage(pointers)\n : pointers[0]);\n\n const tmpXY = {};\n\n pointerUtils.getPageXY(pointer, tmpXY);\n targetObj.page.x = tmpXY.x;\n targetObj.page.y = tmpXY.y;\n\n pointerUtils.getClientXY(pointer, tmpXY);\n targetObj.client.x = tmpXY.x;\n targetObj.client.y = tmpXY.y;\n\n targetObj.timeStamp = is.number(timeStamp) ? timeStamp :new Date().getTime();\n },\n\n pointerExtend: pointerExtend,\n\n getTouchPair: function (event) {\n const touches = [];\n\n // array of touches is supplied\n if (is.array(event)) {\n touches[0] = event[0];\n touches[1] = event[1];\n }\n // an event\n else {\n if (event.type === 'touchend') {\n if (event.touches.length === 1) {\n touches[0] = event.touches[0];\n touches[1] = event.changedTouches[0];\n }\n else if (event.touches.length === 0) {\n touches[0] = event.changedTouches[0];\n touches[1] = event.changedTouches[1];\n }\n }\n else {\n touches[0] = event.touches[0];\n touches[1] = event.touches[1];\n }\n }\n\n return touches;\n },\n\n pointerAverage: function (pointers) {\n const average = {\n pageX : 0,\n pageY : 0,\n clientX: 0,\n clientY: 0,\n screenX: 0,\n screenY: 0,\n };\n\n for (const pointer of pointers) {\n for (const prop in average) {\n average[prop] += pointer[prop];\n }\n }\n for (const prop in average) {\n average[prop] /= pointers.length;\n }\n\n return average;\n },\n\n touchBBox: function (event) {\n if (!event.length && !(event.touches && event.touches.length > 1)) {\n return;\n }\n\n const touches = pointerUtils.getTouchPair(event);\n const minX = Math.min(touches[0].pageX, touches[1].pageX);\n const minY = Math.min(touches[0].pageY, touches[1].pageY);\n const maxX = Math.max(touches[0].pageX, touches[1].pageX);\n const maxY = Math.max(touches[0].pageY, touches[1].pageY);\n\n return {\n x: minX,\n y: minY,\n left: minX,\n top: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n },\n\n touchDistance: function (event, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n\n\n const dx = touches[0][sourceX] - touches[1][sourceX];\n const dy = touches[0][sourceY] - touches[1][sourceY];\n\n return hypot(dx, dy);\n },\n\n touchAngle: function (event, prevAngle, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n const dx = touches[1][sourceX] - touches[0][sourceX];\n const dy = touches[1][sourceY] - touches[0][sourceY];\n const angle = 180 * Math.atan2(dy , dx) / Math.PI;\n\n return angle;\n },\n\n getPointerType: function (pointer, interaction) {\n // if the PointerEvent API isn't available, then the pointer must be ither\n // a MouseEvent or TouchEvent\n if (interaction.mouse) { return 'mouse'; }\n if (!browser.supportsPointerEvent) { return 'touch'; }\n\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : [undefined, undefined,'touch', 'pen', 'mouse'][pointer.pointerType];\n },\n\n // [ event.target, event.currentTarget ]\n getEventTargets: function (event) {\n return [\n domUtils.getActualElement(event.path ? event.path[0] : event.target),\n domUtils.getActualElement(event.currentTarget),\n ];\n },\n};\n\nmodule.exports = pointerUtils;\n","const { window } = require('./window');\n\nconst vendors = ['ms', 'moz', 'webkit', 'o'];\nlet lastTime = 0;\nlet request;\nlet cancel;\n\nfor (let x = 0; x < vendors.length && !window.requestAnimationFrame; x++) {\n request = window[vendors[x] + 'RequestAnimationFrame'];\n cancel = window[vendors[x] +'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n}\n\nif (!request) {\n request = function (callback) {\n const currTime = new Date().getTime();\n const timeToCall = Math.max(0, 16 - (currTime - lastTime));\n const id = setTimeout(function () { callback(currTime + timeToCall); },\n timeToCall);\n\n lastTime = currTime + timeToCall;\n return id;\n };\n}\n\nif (!cancel) {\n cancel = function (id) {\n clearTimeout(id);\n };\n}\n\nmodule.exports = {\n request,\n cancel,\n};\n","const extend = require('./extend');\nconst is = require('./is');\nconst {\n closest,\n parentNode,\n getElementRect,\n} = require('./domUtils');\n\nconst rectUtils = {\n getStringOptionResult: function (value, interactable, element) {\n if (!is.string(value)) {\n return null;\n }\n\n if (value === 'parent') {\n value = parentNode(element);\n }\n else if (value === 'self') {\n value = interactable.getRect(element);\n }\n else {\n value = closest(element, value);\n }\n\n return value;\n },\n\n resolveRectLike: function (value, interactable, element, functionArgs) {\n value = rectUtils.getStringOptionResult(value, interactable, element) || value;\n\n if (is.function(value)) {\n value = value.apply(null, functionArgs);\n }\n\n if (is.element(value)) {\n value = getElementRect(value);\n }\n\n return value;\n },\n\n rectToXY: function (rect) {\n return rect && {\n x: 'x' in rect ? rect.x : rect.left,\n y: 'y' in rect ? rect.y : rect.top,\n };\n },\n\n xywhToTlbr: function (rect) {\n if (rect && !('left' in rect && 'top' in rect)) {\n rect = extend({}, rect);\n\n rect.left = rect.x || 0;\n rect.top = rect.y || 0;\n rect.right = rect.right || (rect.left + rect.width);\n rect.bottom = rect.bottom || (rect.top + rect.height);\n }\n\n return rect;\n },\n\n tlbrToXywh: function (rect) {\n if (rect && !('x' in rect && 'y' in rect)) {\n rect = extend({}, rect);\n\n rect.x = rect.left || 0;\n rect.top = rect.top || 0;\n rect.width = rect.width || (rect.right - rect.x);\n rect.height = rect.height || (rect.bottom - rect.y);\n }\n\n return rect;\n },\n};\n\nmodule.exports = rectUtils;\n","const win = module.exports;\nconst isWindow = require('./isWindow');\n\nfunction init (window) {\n // get wrapped window if using Shadow DOM polyfill\n\n win.realWindow = window;\n\n // create a TextNode\n const el = window.document.createTextNode('');\n\n // check if it's wrapped by a polyfill\n if (el.ownerDocument !== window.document\n && typeof window.wrap === 'function'\n && window.wrap(el) === el) {\n // use wrapped window\n window = window.wrap(window);\n }\n\n win.window = window;\n}\n\nif (typeof window === 'undefined') {\n win.window = undefined;\n win.realWindow = undefined;\n}\nelse {\n init(window);\n}\n\nwin.getWindow = function getWindow (node) {\n if (isWindow(node)) {\n return node;\n }\n\n const rootNode = (node.ownerDocument || node);\n\n return rootNode.defaultView || rootNode.parentWindow || win.window;\n};\n\nwin.init = init;\n"]} \ No newline at end of file +{"version":3,"sources":["src/header.js","node_modules/browser-pack/_prelude.js","index.js","src/Eventable.js","src/InteractEvent.js","src/Interactable.js","src/Interaction.js","src/actions/base.js","src/actions/drag.js","src/actions/drop.js","src/actions/gesture.js","src/actions/resize.js","src/autoScroll.js","src/autoStart/InteractableMethods.js","src/autoStart/base.js","src/autoStart/delay.js","src/autoStart/drag.js","src/autoStart/gesture.js","src/autoStart/resize.js","src/defaultOptions.js","src/index.js","src/inertia.js","src/interact.js","src/interactablePreventDefault.js","src/legacyBrowsers.js","src/modifiers/index.js","src/modifiers/restrict.js","src/modifiers/restrictEdges.js","src/modifiers/restrictSize.js","src/modifiers/snap.js","src/modifiers/snapSize.js","src/pointerEvents/PointerEvent.js","src/pointerEvents/base.js","src/pointerEvents/holdRepeat.js","src/pointerEvents/interactableTargets.js","src/scope.js","src/utils/Signals.js","src/utils/arr.js","src/utils/browser.js","src/utils/domObjects.js","src/utils/domUtils.js","src/utils/events.js","src/utils/extend.js","src/utils/getOriginXY.js","src/utils/hypot.js","src/utils/index.js","src/utils/interactionFinder.js","src/utils/is.js","src/utils/isWindow.js","src/utils/pointerExtend.js","src/utils/pointerUtils.js","src/utils/raf.js","src/utils/rect.js","src/utils/window.js"],"names":[],"mappings":";AAAA;AACA;AACA;AACA;AACA;AACA;ACLA,ADMA;AACA;;AEPA;;;;;;;;AAQA,IAAI,OAAO,MAAP,KAAkB,WAAtB,EAAmC;AACjC,SAAO,OAAP,GAAiB,UAAU,MAAV,EAAkB;AACjC,YAAQ,oBAAR,EAA8B,IAA9B,CAAmC,MAAnC;;AAEA,WAAO,QAAQ,aAAR,CAAP;AACD,GAJD;AAKD,CAND,MAOK;AACH,SAAO,OAAP,GAAiB,QAAQ,aAAR,CAAjB;AACD;;;;;;;eCjBmB,QAAQ,aAAR,C;IAAZ,O,YAAA,O;;AACR,IAAM,SAAS,QAAQ,mBAAR,CAAf;;AAEA,SAAS,yBAAT,CAAoC,KAApC,EAA2C,SAA3C,EAAsD;AACpD,OAAK,IAAI,IAAI,CAAR,EAAW,MAAM,UAAU,MAAhC,EAAwC,IAAI,GAAJ,IAAW,CAAC,MAAM,2BAA1D,EAAuF,GAAvF,EAA4F;AAC1F,cAAU,CAAV,EAAa,KAAb;AACD;AACF;;IAEK,S;AAEJ,qBAAa,OAAb,EAAsB;AAAA;;AACpB,SAAK,OAAL,GAAe,OAAO,EAAP,EAAW,WAAW,EAAtB,CAAf;AACD;;sBAED,I,iBAAM,K,EAAO;AACX,QAAI,kBAAJ;AACA,QAAM,UAAU,OAAO,MAAM,IAA7B;AACA,QAAM,SAAS,KAAK,MAApB;;AAEA;AACA,QAAK,YAAY,KAAK,MAAM,IAAX,CAAjB,EAAoC;AAClC,gCAA0B,KAA1B,EAAiC,SAAjC;AACD;;AAED;AACA,QAAI,KAAK,OAAL,CAAJ,EAAmB;AACjB,WAAK,OAAL,EAAc,KAAd;AACD;;AAED;AACA,QAAI,CAAC,MAAM,kBAAP,IAA6B,MAA7B,KAAwC,YAAY,OAAO,MAAM,IAAb,CAApD,CAAJ,EAA8E;AAC5E,gCAA0B,KAA1B,EAAiC,SAAjC;AACD;AACF,G;;sBAED,E,eAAI,S,EAAW,Q,EAAU;AACvB;AACA,QAAI,KAAK,SAAL,CAAJ,EAAqB;AACnB,WAAK,SAAL,EAAgB,IAAhB,CAAqB,QAArB;AACD,KAFD,MAGK;AACH,WAAK,SAAL,IAAkB,CAAC,QAAD,CAAlB;AACD;AACF,G;;sBAED,G,gBAAK,S,EAAW,Q,EAAU;AACxB;AACA,QAAM,YAAY,KAAK,SAAL,CAAlB;AACA,QAAM,QAAY,YAAW,QAAQ,SAAR,EAAmB,QAAnB,CAAX,GAA0C,CAAC,CAA7D;;AAEA,QAAI,UAAU,CAAC,CAAf,EAAkB;AAChB,gBAAU,MAAV,CAAiB,KAAjB,EAAwB,CAAxB;AACD;;AAED,QAAI,aAAa,UAAU,MAAV,KAAqB,CAAlC,IAAuC,CAAC,QAA5C,EAAsD;AACpD,WAAK,SAAL,IAAkB,QAAlB;AACD;AACF,G;;;;;AAGH,OAAO,OAAP,GAAiB,SAAjB;;;;;;;AC7DA,IAAM,SAAc,QAAQ,gBAAR,CAApB;AACA,IAAM,cAAc,QAAQ,qBAAR,CAApB;AACA,IAAM,WAAc,QAAQ,kBAAR,CAApB;AACA,IAAM,UAAc,QAAQ,iBAAR,EAA2B,GAA3B,EAApB;;IAEM,a;AACJ,yBAAa,WAAb,EAA0B,KAA1B,EAAiC,MAAjC,EAAyC,KAAzC,EAAgD,OAAhD,EAAyD,OAAzD,EAAkF;AAAA,QAAhB,MAAgB,uEAAP,KAAO;;AAAA;;AAChF,QAAM,SAAc,YAAY,MAAhC;AACA,QAAM,cAAc,CAAC,UAAU,OAAO,OAAjB,IAA4B,QAA7B,EAAuC,WAA3D;AACA,QAAM,SAAc,YAAY,MAAZ,EAAoB,OAApB,EAA6B,MAA7B,CAApB;AACA,QAAM,WAAc,UAAU,OAA9B;AACA,QAAM,SAAc,UAAU,KAA9B;AACA,QAAM,SAAc,WAAU,YAAY,WAAtB,GAAoC,YAAY,SAApE;AACA,QAAM,YAAc,YAAY,SAAhC;;AAEA,cAAU,WAAW,YAAY,OAAjC;;AAEA,QAAM,OAAS,OAAO,EAAP,EAAW,OAAO,IAAlB,CAAf;AACA,QAAM,SAAS,OAAO,EAAP,EAAW,OAAO,MAAlB,CAAf;;AAEA,SAAK,CAAL,IAAU,OAAO,CAAjB;AACA,SAAK,CAAL,IAAU,OAAO,CAAjB;;AAEA,WAAO,CAAP,IAAY,OAAO,CAAnB;AACA,WAAO,CAAP,IAAY,OAAO,CAAnB;;AAEA,SAAK,OAAL,GAAqB,MAAM,OAA3B;AACA,SAAK,MAAL,GAAqB,MAAM,MAA3B;AACA,SAAK,QAAL,GAAqB,MAAM,QAA3B;AACA,SAAK,OAAL,GAAqB,MAAM,OAA3B;AACA,SAAK,MAAL,GAAqB,MAAM,MAA3B;AACA,SAAK,OAAL,GAAqB,MAAM,OAA3B;AACA,SAAK,MAAL,GAAqB,OAArB;AACA,SAAK,aAAL,GAAqB,OAArB;AACA,SAAK,aAAL,GAAqB,WAAW,IAAhC;AACA,SAAK,MAAL,GAAqB,MAArB;AACA,SAAK,IAAL,GAAqB,UAAU,SAAS,EAAnB,CAArB;AACA,SAAK,WAAL,GAAqB,WAArB;AACA,SAAK,YAAL,GAAqB,MAArB;;AAEA,SAAK,EAAL,GAAU,WAAW,YAAY,SAAZ,CAAsB,YAAY,SAAZ,CAAsB,MAAtB,GAA+B,CAArD,CAAX,GACW,UAAU,EAD/B;;AAGA,QAAM,YAAY;AAChB,8BADgB;AAEhB,kBAFgB;AAGhB,oBAHgB;AAIhB,kBAJgB;AAKhB,sBALgB;AAMhB,sBANgB;AAOhB,gBAPgB;AAQhB,oBARgB;AAShB,oBATgB;AAUhB,wBAVgB;AAWhB,oBAXgB;AAYhB,8BAZgB;AAahB,cAAQ;AAbQ,KAAlB;;AAgBA,YAAQ,IAAR,CAAa,QAAb,EAAuB,SAAvB;;AAEA,QAAI,MAAJ,EAAY;AACV;AACA,WAAK,KAAL,GAAa,UAAU,KAAvB;AACA,WAAK,KAAL,GAAa,UAAU,KAAvB;AACA,WAAK,OAAL,GAAe,UAAU,OAAzB;AACA,WAAK,OAAL,GAAe,UAAU,OAAzB;AACD,KAND,MAOK;AACH,WAAK,KAAL,GAAiB,KAAK,CAAtB;AACA,WAAK,KAAL,GAAiB,KAAK,CAAtB;AACA,WAAK,OAAL,GAAiB,OAAO,CAAxB;AACA,WAAK,OAAL,GAAiB,OAAO,CAAxB;AACD;;AAED,SAAK,EAAL,GAAiB,YAAY,WAAZ,CAAwB,IAAxB,CAA6B,CAA7B,GAAiC,OAAO,CAAzD;AACA,SAAK,EAAL,GAAiB,YAAY,WAAZ,CAAwB,IAAxB,CAA6B,CAA7B,GAAiC,OAAO,CAAzD;AACA,SAAK,QAAL,GAAiB,YAAY,WAAZ,CAAwB,MAAxB,CAA+B,CAA/B,GAAmC,OAAO,CAA3D;AACA,SAAK,QAAL,GAAiB,YAAY,WAAZ,CAAwB,MAAxB,CAA+B,CAA/B,GAAmC,OAAO,CAA3D;;AAEA,YAAQ,IAAR,CAAa,WAAb,EAA0B,SAA1B;;AAEA,SAAK,SAAL,GAAiB,OAAO,SAAxB;AACA,SAAK,EAAL,GAAiB,YAAY,YAAZ,CAAyB,SAA1C;AACA,SAAK,QAAL,GAAiB,KAAK,SAAL,GAAiB,KAAK,EAAvC;;AAEA;AACA,SAAK,KAAL,GAAa,YAAY,YAAZ,CAAyB,WAAzB,EAAsC,KAAnD;AACA,SAAK,SAAL,GAAiB,YAAY,YAAZ,CAAyB,WAAzB,EAAsC,EAAvD;AACA,SAAK,SAAL,GAAiB,YAAY,YAAZ,CAAyB,WAAzB,EAAsC,EAAvD;;AAEA,SAAK,KAAL,GAAc,UAAU,UAAU,cAArB,GAAsC,KAAK,QAAL,EAAtC,GAAwD,IAArE;;AAEA,YAAQ,IAAR,CAAa,KAAb,EAAoB,SAApB;AACD;;0BAED,Q,uBAAY;AACV,QAAM,cAAc,KAAK,WAAzB;;AAEA,QAAI,YAAY,SAAZ,CAAsB,KAAtB,GAA8B,GAA9B,IACG,KAAK,SAAL,GAAiB,YAAY,SAAZ,CAAsB,SAAvC,GAAmD,GAD1D,EAC+D;AAC7D,aAAO,IAAP;AACD;;AAED,QAAI,QAAQ,MAAM,KAAK,KAAL,CAAW,YAAY,SAAZ,CAAsB,SAAjC,EAA4C,YAAY,SAAZ,CAAsB,SAAlE,CAAN,GAAqF,KAAK,EAAtG;AACA,QAAM,UAAU,IAAhB;;AAEA,QAAI,QAAQ,CAAZ,EAAe;AACb,eAAS,GAAT;AACD;;AAED,QAAM,OAAO,MAAM,OAAN,IAAiB,KAAjB,IAA0B,QAAQ,MAAM,OAArD;AACA,QAAM,KAAO,MAAM,OAAN,IAAiB,KAAjB,IAA0B,QAAQ,MAAM,OAArD;;AAEA,QAAM,QAAQ,CAAC,IAAD,KAAU,MAAM,OAAN,IAAiB,KAAjB,IAA0B,QAAS,KAAK,OAAlD,CAAd;AACA,QAAM,OAAQ,CAAC,EAAD,IAAW,KAAK,OAAL,IAAgB,KAA3B,IAAoC,QAAQ,MAAM,OAAhE;;AAEA,WAAO;AACL,YADK;AAEL,gBAFK;AAGL,gBAHK;AAIL,kBAJK;AAKL,kBALK;AAML,aAAO,YAAY,SAAZ,CAAsB,KANxB;AAOL,gBAAU;AACR,WAAG,YAAY,SAAZ,CAAsB,SADjB;AAER,WAAG,YAAY,SAAZ,CAAsB;AAFjB;AAPL,KAAP;AAYD,G;;0BAED,c,6BAAkB,CAAE,C;;0BAEpB,wB,uCAA4B;AAC1B,SAAK,2BAAL,GAAmC,KAAK,kBAAL,GAA0B,IAA7D;AACD,G;;0BAED,e,8BAAmB;AACjB,SAAK,kBAAL,GAA0B,IAA1B;AACD,G;;;;;AAGH,QAAQ,EAAR,CAAW,WAAX,EAAwB,gBAA0D;AAAA,MAA9C,MAA8C,QAA9C,MAA8C;AAAA,MAAtC,WAAsC,QAAtC,WAAsC;AAAA,MAAzB,QAAyB,QAAzB,QAAyB;AAAA,MAAf,WAAe,QAAf,WAAe;;AAChF,MAAM,YAAY,WAAU,MAAV,GAAmB,YAAY,SAAjD;;AAEA,MAAI,gBAAgB,QAApB,EAA8B;AAC5B,WAAO,EAAP,GAAY,OAAO,OAAP,GAAiB,UAAU,OAAvC;AACA,WAAO,EAAP,GAAY,OAAO,OAAP,GAAiB,UAAU,OAAvC;AACD,GAHD,MAIK;AACH,WAAO,EAAP,GAAY,OAAO,KAAP,GAAe,UAAU,KAArC;AACA,WAAO,EAAP,GAAY,OAAO,KAAP,GAAe,UAAU,KAArC;AACD;AACF,CAXD;;AAaA,cAAc,OAAd,GAAwB,OAAxB;;AAEA,OAAO,OAAP,GAAiB,aAAjB;;;;;;;AC7JA,IAAM,KAAY,QAAQ,YAAR,CAAlB;AACA,IAAM,SAAY,QAAQ,gBAAR,CAAlB;AACA,IAAM,SAAY,QAAQ,gBAAR,CAAlB;AACA,IAAM,UAAY,QAAQ,gBAAR,CAAlB;AACA,IAAM,QAAY,QAAQ,SAAR,CAAlB;AACA,IAAM,YAAY,QAAQ,aAAR,CAAlB;AACA,IAAM,WAAY,QAAQ,kBAAR,CAAlB;AACA,IAAM,UAAY,QAAQ,iBAAR,EAA2B,GAA3B,EAAlB;;eAM8B,QAAQ,kBAAR,C;IAH5B,c,YAAA,c;IACA,Y,YAAA,Y;IACA,W,YAAA,W;;gBAE4B,QAAQ,gBAAR,C;IAAtB,S,aAAA,S;;gBACsB,QAAQ,aAAR,C;IAAtB,O,aAAA,O;IAAS,Q,aAAA,Q;;gBACa,QAAQ,iBAAR,C;IAAtB,U,aAAA,U;;AAER;;;AACA,MAAM,aAAN,GAAsB,EAAtB;;AAEA;;;;;;;IAMM,Y;AACJ,wBAAa,MAAb,EAAqB,OAArB,EAA8B;AAAA;;AAC5B,cAAU,WAAW,EAArB;;AAEA,SAAK,MAAL,GAAgB,MAAhB;AACA,SAAK,MAAL,GAAgB,IAAI,SAAJ,EAAhB;AACA,SAAK,QAAL,GAAgB,QAAQ,OAAR,IAAmB,MAAM,QAAzC;AACA,SAAK,IAAL,GAAgB,UAAU,YAAY,MAAZ,IAAqB,KAAK,QAA1B,GAAqC,MAA/C,CAAhB;AACA,SAAK,IAAL,GAAgB,KAAK,IAAL,CAAU,QAA1B;;AAEA,YAAQ,IAAR,CAAa,KAAb,EAAoB;AAClB,oBADkB;AAElB,sBAFkB;AAGlB,oBAAc,IAHI;AAIlB,WAAK,KAAK;AAJQ,KAApB;;AAOA,UAAM,WAAN,CAAmB,KAAK,IAAxB,EAA8B,KAAK,IAAnC;;AAEA,UAAM,aAAN,CAAoB,IAApB,CAAyB,IAAzB;;AAEA,SAAK,GAAL,CAAS,OAAT;AACD;;yBAED,W,wBAAa,M,EAAQ,M,EAAQ;AAC3B,QAAM,WAAW,OAAO,MAAxB;;AAEA,QAAI,GAAG,QAAH,CAAY,OAAO,OAAnB,CAAJ,EAAwC;AAAE,WAAK,MAAL,CAAY,WAAW,OAAvB,IAA0C,OAAO,OAAjD;AAAoE;AAC9G,QAAI,GAAG,QAAH,CAAY,OAAO,MAAnB,CAAJ,EAAwC;AAAE,WAAK,MAAL,CAAY,WAAW,MAAvB,IAA0C,OAAO,MAAjD;AAAoE;AAC9G,QAAI,GAAG,QAAH,CAAY,OAAO,KAAnB,CAAJ,EAAwC;AAAE,WAAK,MAAL,CAAY,WAAW,KAAvB,IAA0C,OAAO,KAAjD;AAAoE;AAC9G,QAAI,GAAG,QAAH,CAAY,OAAO,cAAnB,CAAJ,EAAwC;AAAE,WAAK,MAAL,CAAY,WAAW,cAAvB,IAA0C,OAAO,cAAjD;AAAoE;;AAE9G,WAAO,IAAP;AACD,G;;yBAED,Y,yBAAc,M,EAAQ,O,EAAS;AAC7B;AACA,SAAK,IAAM,MAAX,IAAqB,OAArB,EAA8B;AAC5B;AACA,UAAI,UAAU,SAAS,MAAT,CAAd,EAAgC;AAC9B;AACA,YAAI,GAAG,MAAH,CAAU,QAAQ,MAAR,CAAV,CAAJ,EAAgC;AAC9B;AACA,eAAK,OAAL,CAAa,MAAb,EAAqB,MAArB,IAA+B,OAAO,KAAK,OAAL,CAAa,MAAb,EAAqB,MAArB,KAAgC,EAAvC,EAA2C,QAAQ,MAAR,CAA3C,CAA/B;;AAEA,cAAI,GAAG,MAAH,CAAU,SAAS,SAAT,CAAmB,MAAnB,CAAV,KAAyC,aAAa,SAAS,SAAT,CAAmB,MAAnB,CAA1D,EAAsF;AACpF,iBAAK,OAAL,CAAa,MAAb,EAAqB,MAArB,EAA6B,OAA7B,GAAuC,QAAQ,MAAR,EAAgB,OAAhB,KAA4B,KAA5B,GAAmC,KAAnC,GAA2C,IAAlF;AACD;AACF,SAPD,MAQK,IAAI,GAAG,IAAH,CAAQ,QAAQ,MAAR,CAAR,KAA4B,GAAG,MAAH,CAAU,SAAS,SAAT,CAAmB,MAAnB,CAAV,CAAhC,EAAuE;AAC1E,eAAK,OAAL,CAAa,MAAb,EAAqB,MAArB,EAA6B,OAA7B,GAAuC,QAAQ,MAAR,CAAvC;AACD,SAFI,MAGA,IAAI,QAAQ,MAAR,MAAoB,SAAxB,EAAmC;AACtC;AACA,eAAK,OAAL,CAAa,MAAb,EAAqB,MAArB,IAA+B,QAAQ,MAAR,CAA/B;AACD;AACF;AACF;AACF,G;;AAED;;;;;;;;;;;;;;;;;;;;yBAkBA,O,oBAAS,O,EAAS;AAChB,cAAU,WAAW,KAAK,MAA1B;;AAEA,QAAI,GAAG,MAAH,CAAU,KAAK,MAAf,KAA0B,CAAE,GAAG,OAAH,CAAW,OAAX,CAAhC,EAAsD;AACpD,gBAAU,KAAK,QAAL,CAAc,aAAd,CAA4B,KAAK,MAAjC,CAAV;AACD;;AAED,WAAO,eAAe,OAAf,CAAP;AACD,G;;AAED;;;;;;;;;;;;yBAUA,W,wBAAa,O,EAAS;AACpB,QAAI,GAAG,QAAH,CAAY,OAAZ,CAAJ,EAA0B;AACxB,WAAK,OAAL,GAAe,OAAf;;AAEA,aAAO,IAAP;AACD;;AAED,QAAI,YAAY,IAAhB,EAAsB;AACpB,aAAO,KAAK,OAAL,CAAa,OAApB;;AAEA,aAAO,IAAP;AACD;;AAED,WAAO,KAAK,OAAZ;AACD,G;;yBAED,iB,8BAAmB,U,EAAY,Q,EAAU;AACvC,QAAI,YAAY,QAAZ,KAAyB,GAAG,MAAH,CAAU,QAAV,CAA7B,EAAkD;AAChD,WAAK,OAAL,CAAa,UAAb,IAA2B,QAA3B;;AAEA,2BAAqB,QAAQ,KAA7B,kHAAoC;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,YAAzB,MAAyB;;AAClC,aAAK,OAAL,CAAa,MAAb,EAAqB,UAArB,IAAmC,QAAnC;AACD;;AAED,aAAO,IAAP;AACD;;AAED,WAAO,KAAK,OAAL,CAAa,UAAb,CAAP;AACD,G;;AAED;;;;;;;;;;;;;;;yBAaA,M,mBAAQ,Q,EAAU;AAChB,WAAO,KAAK,iBAAL,CAAuB,QAAvB,EAAiC,QAAjC,CAAP;AACD,G;;AAED;;;;;;;;;;;;yBAUA,W,wBAAa,Q,EAAU;AACrB,QAAI,aAAa,MAAb,IAAuB,aAAa,QAAxC,EAAkD;AAChD,WAAK,OAAL,CAAa,WAAb,GAA2B,QAA3B;;AAEA,aAAO,IAAP;AACD;;AAED,WAAO,KAAK,OAAL,CAAa,WAApB;AACD,G;;AAED;;;;;;;;;;;yBASA,O,sBAAW;AACT,WAAO,KAAK,QAAZ;AACD,G;;yBAED,S,sBAAW,O,EAAS;AAClB,WAAQ,KAAK,QAAL,KAAkB,QAAQ,aAA1B,IACG,aAAa,KAAK,QAAlB,EAA4B,OAA5B,CADX;AAED,G;;AAED;;;;;;;;;;;;yBAUA,I,iBAAM,M,EAAQ;AACZ,SAAK,MAAL,CAAY,IAAZ,CAAiB,MAAjB;;AAEA,WAAO,IAAP;AACD,G;;yBAED,c,2BAAgB,M,EAAQ,S,EAAW,Q,EAAU,O,EAAS;AACpD,QAAI,GAAG,MAAH,CAAU,SAAV,KAAwB,UAAU,MAAV,CAAiB,GAAjB,MAA0B,CAAC,CAAvD,EAA0D;AACxD,kBAAY,UAAU,IAAV,GAAiB,KAAjB,CAAuB,IAAvB,CAAZ;AACD;;AAED,QAAI,GAAG,KAAH,CAAS,SAAT,CAAJ,EAAyB;AACvB,WAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,UAAU,MAA9B,EAAsC,GAAtC,EAA2C;AACzC,aAAK,MAAL,EAAa,UAAU,CAAV,CAAb,EAA2B,QAA3B,EAAqC,OAArC;AACD;;AAED,aAAO,IAAP;AACD;;AAED,QAAI,GAAG,MAAH,CAAU,SAAV,CAAJ,EAA0B;AACxB,WAAK,IAAM,IAAX,IAAmB,SAAnB,EAA8B;AAC5B,aAAK,MAAL,EAAa,IAAb,EAAmB,UAAU,IAAV,CAAnB,EAAoC,QAApC;AACD;;AAED,aAAO,IAAP;AACD;AACF,G;;AAED;;;;;;;;;;;;;yBAWA,E,eAAI,S,EAAW,Q,EAAU,O,EAAS;AAChC,QAAI,KAAK,cAAL,CAAoB,IAApB,EAA0B,SAA1B,EAAqC,QAArC,EAA+C,OAA/C,CAAJ,EAA6D;AAC3D,aAAO,IAAP;AACD;;AAED,QAAI,cAAc,OAAlB,EAA2B;AAAE,kBAAY,UAAZ;AAAyB;;AAEtD,QAAI,SAAS,aAAa,UAAtB,EAAkC,SAAlC,CAAJ,EAAkD;AAChD,WAAK,MAAL,CAAY,EAAZ,CAAe,SAAf,EAA0B,QAA1B;AACD;AACD;AAHA,SAIK,IAAI,GAAG,MAAH,CAAU,KAAK,MAAf,CAAJ,EAA4B;AAC/B,eAAO,WAAP,CAAmB,KAAK,MAAxB,EAAgC,KAAK,QAArC,EAA+C,SAA/C,EAA0D,QAA1D,EAAoE,OAApE;AACD,OAFI,MAGA;AACH,eAAO,GAAP,CAAW,KAAK,MAAhB,EAAwB,SAAxB,EAAmC,QAAnC,EAA6C,OAA7C;AACD;;AAED,WAAO,IAAP;AACD,G;;AAED;;;;;;;;;;;;;yBAWA,G,gBAAK,S,EAAW,Q,EAAU,O,EAAS;AACjC,QAAI,KAAK,cAAL,CAAoB,KAApB,EAA2B,SAA3B,EAAsC,QAAtC,EAAgD,OAAhD,CAAJ,EAA8D;AAC5D,aAAO,IAAP;AACD;;AAED,QAAI,cAAc,OAAlB,EAA2B;AAAE,kBAAY,UAAZ;AAAyB;;AAEtD;AACA,QAAI,SAAS,aAAa,UAAtB,EAAkC,SAAlC,CAAJ,EAAkD;AAChD,WAAK,MAAL,CAAY,GAAZ,CAAgB,SAAhB,EAA2B,QAA3B;AACD;AACD;AAHA,SAIK,IAAI,GAAG,MAAH,CAAU,KAAK,MAAf,CAAJ,EAA4B;AAC/B,eAAO,cAAP,CAAsB,KAAK,MAA3B,EAAmC,KAAK,QAAxC,EAAkD,SAAlD,EAA6D,QAA7D,EAAuE,OAAvE;AACD;AACD;AAHK,WAIA;AACH,iBAAO,MAAP,CAAc,KAAK,MAAnB,EAA2B,SAA3B,EAAsC,QAAtC,EAAgD,OAAhD;AACD;;AAED,WAAO,IAAP;AACD,G;;AAED;;;;;;;;;;yBAQA,G,gBAAK,O,EAAS;AACZ,QAAI,CAAC,GAAG,MAAH,CAAU,OAAV,CAAL,EAAyB;AACvB,gBAAU,EAAV;AACD;;AAED,SAAK,OAAL,GAAe,OAAO,EAAP,EAAW,SAAS,IAApB,CAAf;;AAEA,QAAM,aAAa,OAAO,EAAP,EAAW,SAAS,SAApB,CAAnB;;AAEA,SAAK,IAAM,UAAX,IAAyB,QAAQ,UAAjC,EAA6C;AAC3C,UAAM,aAAa,QAAQ,UAAR,CAAmB,UAAnB,CAAnB;;AAEA,WAAK,OAAL,CAAa,UAAb,IAA2B,OAAO,EAAP,EAAW,SAAS,UAAT,CAAX,CAA3B;;AAEA,WAAK,YAAL,CAAkB,UAAlB,EAA8B,UAA9B;;AAEA,WAAK,UAAL,EAAiB,QAAQ,UAAR,CAAjB;AACD;;AAED,0BAAsB,aAAa,eAAnC,yHAAoD;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAAzC,OAAyC;;AAClD,WAAK,OAAL,CAAa,OAAb,IAAwB,SAAS,IAAT,CAAc,OAAd,CAAxB;;AAEA,UAAI,WAAW,OAAf,EAAwB;AACtB,aAAK,OAAL,EAAc,QAAQ,OAAR,CAAd;AACD;AACF;;AAED,YAAQ,IAAR,CAAa,KAAb,EAAoB;AAClB,sBADkB;AAElB,oBAAc;AAFI,KAApB;;AAKA,WAAO,IAAP;AACD,G;;AAED;;;;;;;;;;;yBASA,K,oBAAS;AACP,WAAO,MAAP,CAAc,KAAK,MAAnB,EAA2B,KAA3B;;AAEA,QAAI,GAAG,MAAH,CAAU,KAAK,MAAf,CAAJ,EAA4B;AAC1B;AACA,WAAK,IAAM,IAAX,IAAmB,OAAO,eAA1B,EAA2C;AACzC,YAAM,YAAY,OAAO,eAAP,CAAuB,IAAvB,CAAlB;;AAEA,YAAI,UAAU,SAAV,CAAoB,CAApB,MAA2B,KAAK,MAAhC,IACG,UAAU,QAAV,CAAmB,CAAnB,MAA0B,KAAK,QADtC,EACgD;;AAE9C,oBAAU,SAAV,CAAoB,MAApB,CAA2B,CAA3B,EAA8B,CAA9B;AACA,oBAAU,QAAV,CAAoB,MAApB,CAA2B,CAA3B,EAA8B,CAA9B;AACA,oBAAU,SAAV,CAAoB,MAApB,CAA2B,CAA3B,EAA8B,CAA9B;;AAEA;AACA,cAAI,CAAC,UAAU,SAAV,CAAoB,MAAzB,EAAiC;AAC/B,sBAAU,IAAV,IAAkB,IAAlB;AACD;AACF;;AAED,eAAO,MAAP,CAAc,KAAK,QAAnB,EAA6B,IAA7B,EAAmC,OAAO,gBAA1C;AACA,eAAO,MAAP,CAAc,KAAK,QAAnB,EAA6B,IAA7B,EAAmC,OAAO,kBAA1C,EAA8D,IAA9D;AACD;AACF,KArBD,MAsBK;AACH,aAAO,MAAP,CAAc,IAAd,EAAoB,KAApB;AACD;;AAED,YAAQ,IAAR,CAAa,OAAb,EAAsB,EAAE,cAAc,IAAhB,EAAtB;;AAEA,UAAM,aAAN,CAAoB,MAApB,CAA2B,QAAQ,MAAM,aAAd,EAA6B,IAA7B,CAA3B,EAA+D,CAA/D;;AAEA;AACA,0BAA0B,MAAM,YAAN,IAAsB,EAAhD,yHAAoD;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAAzC,WAAyC;;AAClD,UAAI,YAAY,MAAZ,KAAuB,IAAvB,IAA+B,YAAY,WAAZ,EAAnC,EAA8D;AAC5D,oBAAY,IAAZ;AACD;AACF;;AAED,WAAO,MAAM,QAAb;AACD,G;;;;;AAGH,MAAM,aAAN,CAAoB,cAApB,GAAqC,SAAS,cAAT,CAAyB,MAAzB,EAAiC,OAAjC,EAA0C;AAC7E,YAAU,WAAW,MAAM,QAA3B;;AAEA,OAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,KAAK,MAAzB,EAAiC,GAAjC,EAAsC;AACpC,QAAM,eAAe,KAAK,CAAL,CAArB;;AAEA,QAAI,aAAa,MAAb,KAAwB,MAAxB,IAAkC,aAAa,QAAb,KAA0B,OAAhE,EAAyE;AACvE,aAAO,CAAP;AACD;AACF;AACD,SAAO,CAAC,CAAR;AACD,CAXD;;AAaA,MAAM,aAAN,CAAoB,GAApB,GAA0B,SAAS,eAAT,CAA0B,OAA1B,EAAmC,OAAnC,EAA4C,kBAA5C,EAAgE;AACxF,MAAM,MAAM,KAAK,KAAK,cAAL,CAAoB,OAApB,EAA6B,WAAW,QAAQ,OAAhD,CAAL,CAAZ;;AAEA,SAAO,QAAQ,GAAG,MAAH,CAAU,OAAV,KAAsB,kBAAtB,IAA4C,IAAI,SAAJ,CAAc,OAAd,CAApD,IAA6E,GAA7E,GAAmF,IAA1F;AACD,CAJD;;AAMA,MAAM,aAAN,CAAoB,eAApB,GAAsC,UAAU,QAAV,EAAoB,OAApB,EAA6B;AACjE,OAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,KAAK,MAAzB,EAAiC,GAAjC,EAAsC;AACpC,QAAM,eAAe,KAAK,CAAL,CAArB;;AAEA;AACA,QAAI,CAAC,GAAG,MAAH,CAAU,aAAa,MAAvB,CAAD,IACI,WAAW,CAAC,aAAa,SAAb,CAAuB,OAAvB,CADpB,EACsD;AACpD;AACD;;AAED,QAAM,MAAM,SAAS,YAAT,EAAuB,aAAa,MAApC,EAA4C,aAAa,QAAzD,EAAmE,CAAnE,EAAsE,IAAtE,CAAZ;;AAEA,QAAI,QAAQ,SAAZ,EAAuB;AACrB,aAAO,GAAP;AACD;AACF;AACF,CAhBD;;AAkBA;AACA,aAAa,UAAb,GAA0B,MAAM,UAAN,GAAmB,EAA7C;;AAEA,aAAa,OAAb,GAAuB,OAAvB;;AAEA,aAAa,eAAb,GAA+B,CAAE,aAAF,EAAiB,QAAjB,EAA2B,gBAA3B,EAA6C,aAA7C,CAA/B;;AAEA,OAAO,OAAP,GAAiB,YAAjB;;;;;;;ACtcA,IAAM,QAAa,QAAQ,SAAR,CAAnB;AACA,IAAM,QAAa,QAAQ,SAAR,CAAnB;AACA,IAAM,SAAa,QAAQ,gBAAR,CAAnB;AACA,IAAM,UAAa,QAAQ,iBAAR,CAAnB;AACA,IAAM,aAAa,QAAQ,oBAAR,CAAnB;AACA,IAAM,SAAa,QAAQ,2BAAR,CAAnB;AACA,IAAM,UAAa,QAAQ,iBAAR,EAA2B,GAA3B,EAAnB;;AAEA,IAAM,YAAc,EAApB;AACA,IAAM,cAAc,CAClB,aADkB,EACH,aADG,EACY,WADZ,EAElB,eAFkB,EAED,eAFC,CAApB;;AAKA;AACA,IAAI,gBAAgB,CAApB;;AAEA;AACA,MAAM,YAAN,GAAqB,EAArB;;IAEM,W;AACJ,6BAA8B;AAAA,QAAf,WAAe,QAAf,WAAe;;AAAA;;AAC5B,SAAK,MAAL,GAAqB,IAArB,CAD4B,CACD;AAC3B,SAAK,OAAL,GAAqB,IAArB,CAF4B,CAED;;AAE3B,SAAK,QAAL,GAAqB,EAAM;AACzB,YAAO,IADY;AAEnB,YAAO,IAFY;AAGnB,aAAO;AAHY,KAArB;;AAMA;AACA,SAAK,QAAL,GAAmB,EAAnB;AACA,SAAK,UAAL,GAAmB,EAAnB;AACA,SAAK,WAAL,GAAmB,EAAnB;AACA,SAAK,SAAL,GAAmB,EAAnB;;AAEA;AACA,SAAK,UAAL,GAAkB;AAChB,YAAW,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EADK;AAEhB,cAAW,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EAFK;AAGhB,iBAAW;AAHK,KAAlB;AAKA;AACA,SAAK,SAAL,GAAiB;AACf,YAAW,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EADI;AAEf,cAAW,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EAFI;AAGf,iBAAW;AAHI,KAAjB;;AAMA;AACA,SAAK,WAAL,GAAmB;AACjB,YAAW,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EADM;AAEjB,cAAW,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EAFM;AAGjB,iBAAW;AAHM,KAAnB;;AAMA;AACA,SAAK,YAAL,GAAoB;AAClB,YAAW,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EAAc,IAAI,CAAlB,EAAqB,IAAI,CAAzB,EAA4B,OAAO,CAAnC,EADO;AAElB,cAAW,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EAAc,IAAI,CAAlB,EAAqB,IAAI,CAAzB,EAA4B,OAAO,CAAnC,EAFO;AAGlB,iBAAW;AAHO,KAApB;;AAMA,SAAK,SAAL,GAAmB,IAAnB,CA3C4B,CA2CA;AAC5B,SAAK,WAAL,GAAmB,EAAnB;;AAEA,SAAK,YAAL,GAAuB,IAAvB;AACA,SAAK,eAAL,GAAuB,IAAvB;;AAEA,SAAK,SAAL,GAAiB,IAAjB,CAjD4B,CAiDA;;AAE5B,SAAK,aAAL,GAAuB,KAAvB;AACA,SAAK,eAAL,GAAuB,KAAvB;AACA,SAAK,YAAL,GAAuB,KAAvB;;AAEA,SAAK,WAAL,GAAmB,WAAnB;;AAEA,YAAQ,IAAR,CAAa,KAAb,EAAoB,IAApB;;AAEA,UAAM,YAAN,CAAmB,IAAnB,CAAwB,IAAxB;AACD;;wBAED,W,wBAAa,O,EAAS,K,EAAO,W,EAAa;AACxC,QAAM,eAAe,KAAK,aAAL,CAAmB,OAAnB,EAA4B,KAA5B,EAAmC,IAAnC,CAArB;;AAEA,YAAQ,IAAR,CAAa,MAAb,EAAqB;AACnB,sBADmB;AAEnB,kBAFmB;AAGnB,8BAHmB;AAInB,gCAJmB;AAKnB,mBAAa;AALM,KAArB;AAOD,G;;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wBAgCA,K,kBAAO,M,EAAQ,M,EAAQ,O,EAAS;AAC9B,QAAI,KAAK,WAAL,MACG,CAAC,KAAK,aADT,IAEG,KAAK,UAAL,CAAgB,MAAhB,IAA0B,OAAO,IAAP,KAAgB,SAAhB,GAA2B,CAA3B,GAA+B,CAAzD,CAFP,EAEoE;AAClE;AACD;;AAED;AACA;AACA,QAAI,MAAM,OAAN,CAAc,MAAM,YAApB,EAAkC,IAAlC,MAA4C,CAAC,CAAjD,EAAoD;AAClD,YAAM,YAAN,CAAmB,IAAnB,CAAwB,IAAxB;AACD;;AAED,UAAM,UAAN,CAAiB,KAAK,QAAtB,EAAgC,MAAhC;AACA,SAAK,MAAL,GAAsB,MAAtB;AACA,SAAK,OAAL,GAAsB,OAAtB;;AAEA,YAAQ,IAAR,CAAa,cAAb,EAA6B;AAC3B,mBAAa,IADc;AAE3B,aAAO,KAAK;AAFe,KAA7B;AAID,G;;wBAED,W,wBAAa,O,EAAS,K,EAAO,W,EAAa;AACxC,QAAI,CAAC,KAAK,UAAV,EAAsB;AACpB,WAAK,aAAL,CAAmB,OAAnB;AACA,YAAM,SAAN,CAAgB,KAAK,SAArB,EAAgC,KAAK,QAArC;AACD;;AAED,QAAM,gBAAiB,KAAK,SAAL,CAAe,IAAf,CAAoB,CAApB,KAA0B,KAAK,UAAL,CAAgB,IAAhB,CAAqB,CAA/C,IACG,KAAK,SAAL,CAAe,IAAf,CAAoB,CAApB,KAA0B,KAAK,UAAL,CAAgB,IAAhB,CAAqB,CADlD,IAEG,KAAK,SAAL,CAAe,MAAf,CAAsB,CAAtB,KAA4B,KAAK,UAAL,CAAgB,MAAhB,CAAuB,CAFtD,IAGG,KAAK,SAAL,CAAe,MAAf,CAAsB,CAAtB,KAA4B,KAAK,UAAL,CAAgB,MAAhB,CAAuB,CAH7E;;AAKA,QAAI,WAAJ;AACA,QAAI,WAAJ;;AAEA;AACA,QAAI,KAAK,aAAL,IAAsB,CAAC,KAAK,eAAhC,EAAiD;AAC/C,WAAK,KAAK,SAAL,CAAe,MAAf,CAAsB,CAAtB,GAA0B,KAAK,WAAL,CAAiB,MAAjB,CAAwB,CAAvD;AACA,WAAK,KAAK,SAAL,CAAe,MAAf,CAAsB,CAAtB,GAA0B,KAAK,WAAL,CAAiB,MAAjB,CAAwB,CAAvD;;AAEA,WAAK,eAAL,GAAuB,MAAM,KAAN,CAAY,EAAZ,EAAgB,EAAhB,IAAsB,YAAY,oBAAzD;AACD;;AAED,QAAM,YAAY;AAChB,sBADgB;AAEhB,oBAAc,KAAK,eAAL,CAAqB,OAArB,CAFE;AAGhB,kBAHgB;AAIhB,8BAJgB;AAKhB,YALgB;AAMhB,YANgB;AAOhB,iBAAW,aAPK;AAQhB,mBAAa,IARG;AAShB,6BAAuB,KAAK,WAAL;AATP,KAAlB;;AAYA,QAAI,CAAC,aAAL,EAAoB;AAClB;AACA,YAAM,cAAN,CAAqB,KAAK,YAA1B,EAAwC,KAAK,UAA7C,EAAyD,KAAK,SAA9D;AACD;;AAED,YAAQ,IAAR,CAAa,MAAb,EAAqB,SAArB;;AAEA,QAAI,CAAC,aAAL,EAAoB;AAClB;AACA,UAAI,KAAK,WAAL,EAAJ,EAAwB;AACtB,aAAK,MAAL,CAAY,SAAZ;AACD;;AAED,UAAI,KAAK,eAAT,EAA0B;AACxB,cAAM,UAAN,CAAiB,KAAK,UAAtB,EAAkC,KAAK,SAAvC;AACD;AACF;AACF,G;;AAED;;;;;;;;;;;;;;;;;;;;;;wBAoBA,M,mBAAQ,S,EAAW;AACjB,gBAAY,MAAM,MAAN,CAAa;AACvB,eAAS,KAAK,QAAL,CAAc,CAAd,CADc;AAEvB,aAAO,KAAK,SAFW;AAGvB,mBAAa,KAAK,YAHK;AAIvB,mBAAa;AAJU,KAAb,EAKT,aAAa,EALJ,CAAZ;;AAOA,YAAQ,IAAR,CAAa,oBAAb,EAAmC,SAAnC;;AAEA,QAAI,CAAC,KAAK,aAAV,EAAyB;AACvB,cAAQ,IAAR,CAAa,aAAb,EAA4B,SAA5B;AACD;;AAED,SAAK,aAAL,GAAqB,KAArB;AACD,G;;AAED;;;wBACA,S,sBAAW,O,EAAS,K,EAAO,W,EAAa,c,EAAgB;AACtD,QAAM,eAAe,KAAK,eAAL,CAAqB,OAArB,CAArB;;AAEA,YAAQ,IAAR,CAAa,WAAW,IAAX,CAAgB,MAAM,IAAtB,IAA6B,QAA7B,GAAwC,IAArD,EAA2D;AACzD,sBADyD;AAEzD,gCAFyD;AAGzD,kBAHyD;AAIzD,8BAJyD;AAKzD,oCALyD;AAMzD,mBAAa;AAN4C,KAA3D;;AASA,QAAI,CAAC,KAAK,UAAV,EAAsB;AACpB,WAAK,GAAL,CAAS,KAAT;AACD;;AAED,SAAK,aAAL,GAAqB,KAArB;AACA,SAAK,aAAL,CAAmB,OAAnB,EAA4B,KAA5B;AACD,G;;AAED;;;;;;;;;;;;;;;;;;;;;;wBAoBA,G,gBAAK,K,EAAO;AACV,YAAQ,SAAS,KAAK,SAAtB;;AAEA,QAAI,KAAK,WAAL,EAAJ,EAAwB;AACtB,cAAQ,IAAR,CAAa,YAAb,EAA2B;AACzB,oBADyB;AAEzB,qBAAa;AAFY,OAA3B;AAID;;AAED,SAAK,IAAL;AACD,G;;wBAED,a,4BAAiB;AACf,WAAO,KAAK,YAAL,GAAmB,KAAK,QAAL,CAAc,IAAjC,GAAuC,IAA9C;AACD,G;;wBAED,W,0BAAe;AACb,WAAO,KAAK,YAAZ;AACD,G;;wBAED,I,mBAAQ;AACN,YAAQ,IAAR,CAAa,MAAb,EAAqB,EAAE,aAAa,IAAf,EAArB;;AAEA,QAAI,KAAK,YAAT,EAAuB;AACrB,cAAQ,IAAR,CAAa,aAAb,EAA4B,EAAE,aAAa,IAAf,EAA5B;AACA,cAAQ,IAAR,CAAa,UAAU,KAAK,QAAL,CAAc,IAArC,EAA2C,EAAE,aAAa,IAAf,EAA3C;AACD;;AAED,SAAK,MAAL,GAAc,KAAK,OAAL,GAAe,IAA7B;;AAEA,SAAK,YAAL,GAAoB,KAApB;AACA,SAAK,QAAL,CAAc,IAAd,GAAqB,KAAK,SAAL,GAAiB,IAAtC;AACD,G;;wBAED,e,4BAAiB,O,EAAS;AACxB;AACA,QAAI,KAAK,WAAL,KAAqB,OAArB,IAAgC,KAAK,WAAL,KAAqB,KAAzD,EAAgE;AAC9D,aAAO,CAAP;AACD;;AAED,WAAO,MAAM,OAAN,CAAc,KAAK,UAAnB,EAA+B,MAAM,YAAN,CAAmB,OAAnB,CAA/B,CAAP;AACD,G;;wBAED,a,0BAAe,O,EAAS,K,EAA0D;AAAA,QAAnD,IAAmD,uEAA5C,SAAS,iBAAiB,IAAjB,CAAsB,MAAM,IAA5B,CAAmC;;AAChF,QAAM,KAAK,MAAM,YAAN,CAAmB,OAAnB,CAAX;AACA,QAAI,QAAQ,KAAK,eAAL,CAAqB,OAArB,CAAZ;;AAEA,QAAI,UAAU,CAAC,CAAf,EAAkB;AAChB,cAAQ,KAAK,UAAL,CAAgB,MAAxB;AACA,WAAK,UAAL,CAAgB,KAAhB,IAAyB,EAAzB;AACD;;AAED,QAAI,IAAJ,EAAU;AACR,cAAQ,IAAR,CAAa,qBAAb,EAAoC;AAClC,wBADkC;AAElC,oBAFkC;AAGlC,kBAHkC;AAIlC,mBAAW,EAJuB;AAKlC,sBAAc,KALoB;AAMlC,qBAAa;AANqB,OAApC;AAQD;;AAED,SAAK,QAAL,CAAc,KAAd,IAAuB,OAAvB;;AAEA,WAAO,KAAP;AACD,G;;wBAED,a,0BAAe,O,EAAS,K,EAAO;AAC7B,QAAM,QAAQ,KAAK,eAAL,CAAqB,OAArB,CAAd;;AAEA,QAAI,UAAU,CAAC,CAAf,EAAkB;AAAE;AAAS;;AAE7B,YAAQ,IAAR,CAAa,gBAAb,EAA+B;AAC7B,sBAD6B;AAE7B,kBAF6B;AAG7B,oBAAc,KAHe;AAI7B,mBAAa;AAJgB,KAA/B;;AAOA,SAAK,QAAL,CAAiB,MAAjB,CAAwB,KAAxB,EAA+B,CAA/B;AACA,SAAK,UAAL,CAAiB,MAAjB,CAAwB,KAAxB,EAA+B,CAA/B;AACA,SAAK,WAAL,CAAiB,MAAjB,CAAwB,KAAxB,EAA+B,CAA/B;AACA,SAAK,SAAL,CAAiB,MAAjB,CAAwB,KAAxB,EAA+B,CAA/B;AACD,G;;wBAED,mB,gCAAqB,M,EAAQ,a,EAAe;AAC1C,SAAK,YAAL,GAAuB,MAAvB;AACA,SAAK,eAAL,GAAuB,aAAvB;AACD,G;;;;;AAGH,KAAK,IAAI,IAAI,CAAR,EAAW,MAAM,YAAY,MAAlC,EAA0C,IAAI,GAA9C,EAAmD,GAAnD,EAAwD;AACtD,MAAM,SAAS,YAAY,CAAZ,CAAf;;AAEA,YAAU,MAAV,IAAoB,iBAAiB,MAAjB,CAApB;AACD;;AAED,SAAS,gBAAT,CAA2B,MAA3B,EAAmC;AACjC,SAAQ,UAAU,KAAV,EAAiB;AACvB,QAAM,cAAc,MAAM,cAAN,CAAqB,KAArB,CAApB;;AADuB,gCAEe,MAAM,eAAN,CAAsB,KAAtB,CAFf;AAAA,QAEhB,WAFgB;AAAA,QAEH,cAFG;;AAGvB,QAAM,UAAU,EAAhB,CAHuB,CAGH;;AAEpB,QAAI,QAAQ,aAAR,IAAyB,QAAQ,IAAR,CAAa,MAAM,IAAnB,CAA7B,EAAuD;AACrD,sBAAgB,IAAI,IAAJ,GAAW,OAAX,EAAhB;;AAEA,WAAK,IAAI,KAAI,CAAb,EAAgB,KAAI,MAAM,cAAN,CAAqB,MAAzC,EAAiD,IAAjD,EAAsD;AACpD,YAAM,UAAU,MAAM,cAAN,CAAqB,EAArB,CAAhB;AACA,YAAM,cAAc,OAAO,MAAP,CAAc,OAAd,EAAuB,MAAM,IAA7B,EAAmC,WAAnC,CAApB;;AAEA,gBAAQ,IAAR,CAAa,CAAC,OAAD,EAAU,eAAe,IAAI,WAAJ,CAAgB,EAAE,wBAAF,EAAhB,CAAzB,CAAb;AACD;AACF,KATD,MAUK;AACH,UAAI,iBAAiB,KAArB;;AAEA,UAAI,CAAC,QAAQ,oBAAT,IAAiC,QAAQ,IAAR,CAAa,MAAM,IAAnB,CAArC,EAA+D;AAC7D;AACA,aAAK,IAAI,MAAI,CAAb,EAAgB,MAAI,MAAM,YAAN,CAAmB,MAAvB,IAAiC,CAAC,cAAlD,EAAkE,KAAlE,EAAuE;AACrE,2BAAiB,MAAM,YAAN,CAAmB,GAAnB,EAAsB,WAAtB,KAAsC,OAAtC,IAAiD,MAAM,YAAN,CAAmB,GAAnB,EAAsB,aAAxF;AACD;;AAED;AACA;AACA,yBAAiB,kBACX,IAAI,IAAJ,GAAW,OAAX,KAAuB,aAAvB,GAAuC;AAC3C;AAFe,WAGZ,MAAM,SAAN,KAAoB,CAHzB;AAID;;AAED,UAAI,CAAC,cAAL,EAAqB;AACnB,YAAI,eAAc,OAAO,MAAP,CAAc,KAAd,EAAqB,MAAM,IAA3B,EAAiC,WAAjC,CAAlB;;AAEA,YAAI,CAAC,YAAL,EAAkB;AAChB,yBAAc,IAAI,WAAJ,CAAgB,EAAE,wBAAF,EAAhB,CAAd;AACD;;AAED,gBAAQ,IAAR,CAAa,CAAC,KAAD,EAAQ,YAAR,CAAb;AACD;AACF;;AAED,yBAAqC,OAArC,mHAA8C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,UAAlC,QAAkC;AAAA,UAAzB,aAAyB;;AAC5C,oBAAY,mBAAZ,CAAgC,WAAhC,EAA6C,cAA7C;AACA,oBAAY,MAAZ,EAAoB,QAApB,EAA6B,KAA7B,EAAoC,WAApC,EAAiD,cAAjD;AACD;AACF,GA/CD;AAgDD;;AAED,SAAS,MAAT,CAAiB,KAAjB,EAAwB;AACtB,OAAK,IAAI,MAAI,CAAb,EAAgB,MAAI,MAAM,YAAN,CAAmB,MAAvC,EAA+C,KAA/C,EAAoD;AAClD,QAAM,cAAc,MAAM,YAAN,CAAmB,GAAnB,CAApB;;AAEA,gBAAY,GAAZ,CAAgB,KAAhB;AACA,YAAQ,IAAR,CAAa,QAAb,EAAuB,EAAE,YAAF,EAAS,wBAAT,EAAvB;AACD;AACF;;AAED,IAAM,YAAY,CAAE,+BAAF,CAAlB;AACA,IAAM,cAAc,QAAQ,WAA5B;;AAEA,IAAI,WAAW,YAAf,EAA6B;AAC3B,YAAU,YAAY,IAAtB,IAAgC,UAAU,WAA1C;AACA,YAAU,YAAY,IAAtB,IAAgC,UAAU,WAA1C;AACA,YAAU,YAAY,EAAtB,IAAgC,UAAU,SAA1C;AACA,YAAU,YAAY,MAAtB,IAAgC,UAAU,SAA1C;AACD,CALD,MAMK;AACH,YAAU,SAAV,GAAwB,UAAU,WAAlC;AACA,YAAU,SAAV,GAAwB,UAAU,WAAlC;AACA,YAAU,OAAV,GAAwB,UAAU,SAAlC;;AAEA,YAAU,UAAV,GAAwB,UAAU,WAAlC;AACA,YAAU,SAAV,GAAwB,UAAU,WAAlC;AACA,YAAU,QAAV,GAAwB,UAAU,SAAlC;AACA,YAAU,WAAV,GAAwB,UAAU,SAAlC;AACD;;AAED,UAAU,IAAV,GAAiB,MAAjB;;AAEA,SAAS,WAAT,QAA+B,UAA/B,EAA2C;AAAA,MAAnB,GAAmB,SAAnB,GAAmB;;AACzC,MAAM,cAAc,WAAW,OAAX,CAAmB,KAAnB,MAA8B,CAA9B,GAChB,OAAO,GADS,GACH,OAAO,MADxB;;AAGA;AACA,OAAK,IAAM,SAAX,IAAwB,MAAM,eAA9B,EAA+C;AAC7C,gBAAY,GAAZ,EAAiB,SAAjB,EAA4B,OAAO,gBAAnC;AACA,gBAAY,GAAZ,EAAiB,SAAjB,EAA4B,OAAO,kBAAnC,EAAuD,IAAvD;AACD;;AAED,OAAK,IAAM,UAAX,IAAwB,SAAxB,EAAmC;AACjC,gBAAY,GAAZ,EAAiB,UAAjB,EAA4B,UAAU,UAAV,CAA5B;AACD;AACF;;AAED,QAAQ,EAAR,CAAW,qBAAX,EAAkC,iBAAiF;AAAA,MAA9E,WAA8E,SAA9E,WAA8E;AAAA,MAAjE,OAAiE,SAAjE,OAAiE;AAAA,MAAxD,SAAwD,SAAxD,SAAwD;AAAA,MAA7C,YAA6C,SAA7C,YAA6C;AAAA,MAA/B,KAA+B,SAA/B,KAA+B;AAAA,MAAxB,WAAwB,SAAxB,WAAwB;AAAA,MAAX,IAAW,SAAX,IAAW;;AACjH,cAAY,UAAZ,CAAuB,YAAvB,IAAuC,SAAvC;AACA,cAAY,QAAZ,CAAqB,YAArB,IAAqC,OAArC;;AAEA,MAAI,IAAJ,EAAU;AACR,gBAAY,aAAZ,GAA4B,IAA5B;AACD;;AAED,MAAI,CAAC,YAAY,WAAZ,EAAL,EAAgC;AAC9B,UAAM,SAAN,CAAgB,YAAY,WAA5B,EAAyC,YAAY,QAArD;;AAEA,UAAM,UAAN,CAAiB,YAAY,SAA7B,EAAyC,YAAY,WAArD;AACA,UAAM,UAAN,CAAiB,YAAY,UAA7B,EAAyC,YAAY,WAArD;;AAEA,gBAAY,SAAZ,GAAwC,KAAxC;AACA,gBAAY,SAAZ,CAAsB,YAAtB,IAAwC,YAAY,SAAZ,CAAsB,SAA9D;AACA,gBAAY,WAAZ,CAAwB,YAAxB,IAAwC,eAAe,SAAS,MAAM,eAAN,CAAsB,KAAtB,EAA6B,CAA7B,CAAhE;AACA,gBAAY,eAAZ,GAAwC,KAAxC;;AAEA,UAAM,aAAN,CAAoB,YAAY,WAAhC,EAA6C,OAA7C;AACD;AACF,CArBD;;AAuBA,MAAM,OAAN,CAAc,EAAd,CAAiB,cAAjB,EAAoC,WAApC;AACA,MAAM,OAAN,CAAc,EAAd,CAAiB,iBAAjB,EAAoC,WAApC;;AAEA,YAAY,oBAAZ,GAAmC,CAAnC;AACA,YAAY,gBAAZ,GAA+B,gBAA/B;AACA,YAAY,MAAZ,GAAqB,MAArB;AACA,YAAY,OAAZ,GAAsB,OAAtB;AACA,YAAY,SAAZ,GAAwB,SAAxB;;AAEA,MAAM,kBAAN,GAA2B,MAA3B;;AAEA,OAAO,OAAP,GAAiB,WAAjB;;;;;AC/fA,IAAM,cAAgB,QAAQ,gBAAR,CAAtB;AACA,IAAM,gBAAgB,QAAQ,kBAAR,CAAtB;;AAEA,IAAM,UAAU;AACd,4BADc;AAEd,SAAO,EAFO;AAGd,cAAY;AAHE,CAAhB;;AAMA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,cAAvB,EAAuC,gBAAkC;AAAA,MAAtB,WAAsB,QAAtB,WAAsB;AAAA,MAAT,KAAS,QAAT,KAAS;;AACvE,cAAY,YAAZ,GAA2B,IAA3B;AACA,eAAa,WAAb,EAA0B,KAA1B,EAAiC,OAAjC;AACD,CAHD;;AAKA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,aAAvB,EAAsC,iBAA0C;AAAA,MAA9B,WAA8B,SAA9B,WAA8B;AAAA,MAAjB,KAAiB,SAAjB,KAAiB;AAAA,MAAV,MAAU,SAAV,MAAU;;AAC9E,eAAa,WAAb,EAA0B,KAA1B,EAAiC,MAAjC,EAAyC,MAAzC;;AAEA;AACA,MAAI,CAAC,YAAY,WAAZ,EAAL,EAAgC;AAAE,WAAO,KAAP;AAAe;AAClD,CALD;;AAOA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,YAAvB,EAAqC,iBAAkC;AAAA,MAAtB,WAAsB,SAAtB,WAAsB;AAAA,MAAT,KAAS,SAAT,KAAS;;AACrE,eAAa,WAAb,EAA0B,KAA1B,EAAiC,KAAjC;AACD,CAFD;;AAIA,SAAS,YAAT,CAAuB,WAAvB,EAAoC,KAApC,EAA2C,KAA3C,EAAkD,MAAlD,EAA0D;AACxD,MAAM,aAAa,YAAY,QAAZ,CAAqB,IAAxC;;AAEA,MAAM,WAAW,IAAI,aAAJ,CAAkB,WAAlB,EAA+B,KAA/B,EAAsC,UAAtC,EAAkD,KAAlD,EAAyD,YAAY,OAArE,EAA8E,IAA9E,EAAoF,MAApF,CAAjB;;AAEA,cAAY,MAAZ,CAAmB,IAAnB,CAAwB,QAAxB;AACA,cAAY,SAAZ,GAAwB,QAAxB;AACD;;AAED,OAAO,OAAP,GAAiB,OAAjB;;;;;AClCA,IAAM,UAAiB,QAAQ,QAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,UAAR,CAAvB;AACA,IAAM,gBAAiB,QAAQ,kBAAR,CAAvB;AACA,IAAM,eAAiB,QAAQ,iBAAR,CAAvB;AACA,IAAM,cAAiB,QAAQ,gBAAR,CAAvB;AACA,IAAM,iBAAiB,QAAQ,mBAAR,CAAvB;;AAEA,IAAM,OAAO;AACX,YAAU;AACR,aAAc,KADN;AAER,kBAAc,IAFN;;AAIR,YAAY,IAJJ;AAKR,UAAY,IALJ;AAMR,cAAY,IANJ;AAOR,aAAY,IAPJ;AAQR,gBAAY,IARJ;;AAUR,eAAY,IAVJ;AAWR,cAAY;AAXJ,GADC;;AAeX,WAAS,iBAAU,OAAV,EAAmB,KAAnB,EAA0B,YAA1B,EAAwC;AAC/C,QAAM,cAAc,aAAa,OAAb,CAAqB,IAAzC;;AAEA,WAAO,YAAY,OAAZ,GACH,EAAE,MAAM,MAAR,EAAgB,MAAO,YAAY,QAAZ,KAAyB,OAAzB,GACE,YAAY,SADd,GAEE,YAAY,QAFrC,EADG,GAIH,IAJJ;AAKD,GAvBU;;AAyBX,aAAW,qBAAY;AACrB,WAAO,MAAP;AACD;AA3BU,CAAb;;AA8BA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,oBAAvB,EAA6C,gBAA2B;AAAA,MAAf,WAAe,QAAf,WAAe;;AACtE,MAAI,YAAY,QAAZ,CAAqB,IAArB,KAA8B,MAAlC,EAA0C;AAAE;AAAS;;AAErD,MAAM,OAAO,YAAY,QAAZ,CAAqB,IAAlC;;AAEA,MAAI,SAAS,GAAb,EAAkB;AAChB,gBAAY,SAAZ,CAAsB,IAAtB,CAA2B,CAA3B,GAAiC,YAAY,WAAZ,CAAwB,IAAxB,CAA6B,CAA9D;AACA,gBAAY,SAAZ,CAAsB,MAAtB,CAA6B,CAA7B,GAAiC,YAAY,WAAZ,CAAwB,MAAxB,CAA+B,CAAhE;;AAEA,gBAAY,YAAZ,CAAyB,IAAzB,CAA8B,KAA9B,GAAwC,KAAK,GAAL,CAAS,YAAY,YAAZ,CAAyB,IAAzB,CAA8B,EAAvC,CAAxC;AACA,gBAAY,YAAZ,CAAyB,MAAzB,CAAgC,KAAhC,GAAwC,KAAK,GAAL,CAAS,YAAY,YAAZ,CAAyB,MAAzB,CAAgC,EAAzC,CAAxC;AACA,gBAAY,YAAZ,CAAyB,MAAzB,CAAgC,EAAhC,GAAqC,CAArC;AACA,gBAAY,YAAZ,CAAyB,IAAzB,CAA8B,EAA9B,GAAqC,CAArC;AACD,GARD,MASK,IAAI,SAAS,GAAb,EAAkB;AACrB,gBAAY,SAAZ,CAAsB,IAAtB,CAA2B,CAA3B,GAAiC,YAAY,WAAZ,CAAwB,IAAxB,CAA6B,CAA9D;AACA,gBAAY,SAAZ,CAAsB,MAAtB,CAA6B,CAA7B,GAAiC,YAAY,WAAZ,CAAwB,MAAxB,CAA+B,CAAhE;;AAEA,gBAAY,YAAZ,CAAyB,IAAzB,CAA8B,KAA9B,GAAwC,KAAK,GAAL,CAAS,YAAY,YAAZ,CAAyB,IAAzB,CAA8B,EAAvC,CAAxC;AACA,gBAAY,YAAZ,CAAyB,MAAzB,CAAgC,KAAhC,GAAwC,KAAK,GAAL,CAAS,YAAY,YAAZ,CAAyB,MAAzB,CAAgC,EAAzC,CAAxC;AACA,gBAAY,YAAZ,CAAyB,MAAzB,CAAgC,EAAhC,GAAqC,CAArC;AACA,gBAAY,YAAZ,CAAyB,IAAzB,CAA8B,EAA9B,GAAqC,CAArC;AACD;AACF,CAvBD;;AAyBA;AACA,cAAc,OAAd,CAAsB,EAAtB,CAAyB,KAAzB,EAAgC,iBAAmC;AAAA,MAAvB,MAAuB,SAAvB,MAAuB;AAAA,MAAf,WAAe,SAAf,WAAe;;AACjE,MAAI,OAAO,IAAP,KAAgB,UAApB,EAAgC;AAAE;AAAS;;AAE3C,MAAM,OAAO,YAAY,QAAZ,CAAqB,IAAlC;;AAEA,MAAI,SAAS,GAAb,EAAkB;AAChB,WAAO,KAAP,GAAiB,YAAY,WAAZ,CAAwB,IAAxB,CAA6B,CAA9C;AACA,WAAO,OAAP,GAAiB,YAAY,WAAZ,CAAwB,MAAxB,CAA+B,CAAhD;AACA,WAAO,EAAP,GAAY,CAAZ;AACD,GAJD,MAKK,IAAI,SAAS,GAAb,EAAkB;AACrB,WAAO,KAAP,GAAiB,YAAY,WAAZ,CAAwB,IAAxB,CAA6B,CAA9C;AACA,WAAO,OAAP,GAAiB,YAAY,WAAZ,CAAwB,MAAxB,CAA+B,CAAhD;AACA,WAAO,EAAP,GAAY,CAAZ;AACD;AACF,CAfD;;AAiBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoCA,aAAa,SAAb,CAAuB,SAAvB,GAAmC,UAAU,OAAV,EAAmB;AACpD,MAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,OAAhB,CAAJ,EAA8B;AAC5B,SAAK,OAAL,CAAa,IAAb,CAAkB,OAAlB,GAA4B,QAAQ,OAAR,KAAoB,KAApB,GAA2B,KAA3B,GAAkC,IAA9D;AACA,SAAK,YAAL,CAAkB,MAAlB,EAA0B,OAA1B;AACA,SAAK,WAAL,CAAiB,MAAjB,EAAyB,OAAzB;;AAEA,QAAI,mBAAmB,IAAnB,CAAwB,QAAQ,QAAhC,CAAJ,EAA+C;AAC7C,WAAK,OAAL,CAAa,IAAb,CAAkB,QAAlB,GAA6B,QAAQ,QAArC;AACD;AACD,QAAI,aAAa,IAAb,CAAkB,QAAQ,SAA1B,CAAJ,EAA0C;AACxC,WAAK,OAAL,CAAa,IAAb,CAAkB,SAAlB,GAA8B,QAAQ,SAAtC;AACD;;AAED,WAAO,IAAP;AACD;;AAED,MAAI,MAAM,EAAN,CAAS,IAAT,CAAc,OAAd,CAAJ,EAA4B;AAC1B,SAAK,OAAL,CAAa,IAAb,CAAkB,OAAlB,GAA4B,OAA5B;;AAEA,QAAI,CAAC,OAAL,EAAc;AACZ,WAAK,WAAL,GAAmB,KAAK,WAAL,GAAmB,KAAK,SAAL,GAAiB,IAAvD;AACD;;AAED,WAAO,IAAP;AACD;;AAED,SAAO,KAAK,OAAL,CAAa,IAApB;AACD,CA3BD;;AA6BA,QAAQ,IAAR,GAAe,IAAf;AACA,QAAQ,KAAR,CAAc,IAAd,CAAmB,MAAnB;AACA,MAAM,KAAN,CAAY,aAAa,UAAzB,EAAqC,CACnC,WADmC,EAEnC,UAFmC,EAGnC,kBAHmC,EAInC,mBAJmC,EAKnC,SALmC,CAArC;AAOA,QAAQ,UAAR,CAAmB,IAAnB,GAA0B,WAA1B;;AAEA,eAAe,IAAf,GAAsB,KAAK,QAA3B;;AAEA,OAAO,OAAP,GAAiB,IAAjB;;;;;AC9JA,IAAM,UAAiB,QAAQ,QAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,UAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,UAAR,CAAvB;AACA,IAAM,WAAiB,QAAQ,aAAR,CAAvB;AACA,IAAM,gBAAiB,QAAQ,kBAAR,CAAvB;AACA,IAAM,eAAiB,QAAQ,iBAAR,CAAvB;AACA,IAAM,cAAiB,QAAQ,gBAAR,CAAvB;AACA,IAAM,iBAAiB,QAAQ,mBAAR,CAAvB;;AAEA,IAAM,OAAO;AACX,YAAU;AACR,aAAS,KADD;AAER,YAAS,IAFD;AAGR,aAAS;AAHD;AADC,CAAb;;AAQA,IAAI,cAAc,KAAlB;;AAEA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,cAAvB,EAAuC,gBAAkC;AAAA,MAAtB,WAAsB,QAAtB,WAAsB;AAAA,MAAT,KAAS,QAAT,KAAS;;AACvE,MAAI,YAAY,QAAZ,CAAqB,IAArB,KAA8B,MAAlC,EAA0C;AAAE;AAAS;;AAErD;AACA,cAAY,WAAZ,CAAwB,SAAxB,GAAoC,EAApC;AACA,cAAY,WAAZ,CAAwB,QAAxB,GAAoC,EAApC;AACA,cAAY,WAAZ,CAAwB,KAAxB,GAAoC,EAApC;;AAEA,cAAY,UAAZ,GAAyB,IAAzB;;AAEA,MAAI,CAAC,YAAY,WAAjB,EAA8B;AAC5B,mBAAe,WAAf,EAA4B,YAAY,OAAxC;AACD;;AAED,MAAM,YAAY,YAAY,SAA9B;AACA,MAAM,aAAa,cAAc,WAAd,EAA2B,KAA3B,EAAkC,SAAlC,CAAnB;;AAEA,MAAI,WAAW,QAAf,EAAyB;AACvB,oBAAgB,WAAhB,EAA6B,WAAW,QAAxC;AACD;AACF,CApBD;;AAsBA,cAAc,OAAd,CAAsB,EAAtB,CAAyB,KAAzB,EAAgC,iBAA0C;AAAA,MAA9B,WAA8B,SAA9B,WAA8B;AAAA,MAAjB,MAAiB,SAAjB,MAAiB;AAAA,MAAT,KAAS,SAAT,KAAS;;AACxE,MAAI,OAAO,IAAP,KAAgB,UAAhB,IAA8B,OAAO,IAAP,KAAgB,SAAlD,EAA6D;AAAE;AAAS;;AAExE,MAAM,mBAAmB,YAAY,OAArC;AACA,MAAM,YAAY,MAAlB;AACA,MAAM,aAAa,QAAQ,SAAR,EAAmB,KAAnB,EAA0B,gBAA1B,CAAnB;;AAEA,cAAY,UAAZ,GAA0B,WAAW,QAArC;AACA,cAAY,WAAZ,GAA0B,WAAW,OAArC;;AAEA,cAAY,UAAZ,GAAyB,cAAc,WAAd,EAA2B,KAA3B,EAAkC,SAAlC,CAAzB;AACD,CAXD;;AAaA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,aAAvB,EAAsC,iBAA2B;AAAA,MAAf,WAAe,SAAf,WAAe;;AAC/D,MAAI,YAAY,QAAZ,CAAqB,IAArB,KAA8B,MAAlC,EAA0C;AAAE;AAAS;;AAErD,iBAAe,WAAf,EAA4B,YAAY,UAAxC;AACD,CAJD;;AAMA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,YAAvB,EAAqC,iBAA2B;AAAA,MAAf,WAAe,SAAf,WAAe;;AAC9D,MAAI,YAAY,QAAZ,CAAqB,IAArB,KAA8B,MAAlC,EAA0C;AACxC,mBAAe,WAAf,EAA4B,YAAY,UAAxC;AACD;AACF,CAJD;;AAMA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,WAAvB,EAAoC,iBAA2B;AAAA,MAAf,WAAe,SAAf,WAAe;;AAC7D,cAAY,WAAZ,CAAwB,SAAxB,GACE,YAAY,WAAZ,CAAwB,QAAxB,GACA,YAAY,WAAZ,CAAwB,KAAxB,GACA,YAAY,UAAZ,GAAyB,IAH3B;AAID,CALD;;AAOA,SAAS,YAAT,CAAuB,WAAvB,EAAoC,OAApC,EAA6C;AAC3C,MAAM,QAAQ,EAAd;AACA,MAAM,WAAW,EAAjB;;AAEA,YAAU,WAAW,YAAY,OAAjC;;AAEA;AACA,uBAAsB,MAAM,aAA5B,kHAA2C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,QAAhC,OAAgC;;AACzC,QAAI,CAAC,QAAQ,OAAR,CAAgB,IAAhB,CAAqB,OAA1B,EAAmC;AAAE;AAAW;;AAEhD,QAAM,SAAS,QAAQ,OAAR,CAAgB,IAAhB,CAAqB,MAApC;;AAEA;AACA,QAAK,MAAM,EAAN,CAAS,OAAT,CAAiB,MAAjB,KAA4B,WAAW,OAAxC,IACI,MAAM,EAAN,CAAS,MAAT,CAAgB,MAAhB,KACD,CAAC,MAAM,eAAN,CAAsB,OAAtB,EAA+B,MAA/B,CAFR,EAEiD;;AAE/C;AACD;;AAED;AACA,QAAM,eAAe,MAAM,EAAN,CAAS,MAAT,CAAgB,QAAQ,MAAxB,IACjB,QAAQ,QAAR,CAAiB,gBAAjB,CAAkC,QAAQ,MAA1C,CADiB,GAEjB,CAAC,QAAQ,MAAT,CAFJ;;AAIA,SAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,aAAa,MAAjC,EAAyC,GAAzC,EAA8C;AAC5C,UAAM,iBAAiB,aAAa,CAAb,CAAvB;;AAEA,UAAI,mBAAmB,OAAvB,EAAgC;AAC9B,cAAM,IAAN,CAAW,OAAX;AACA,iBAAS,IAAT,CAAc,cAAd;AACD;AACF;AACF;;AAED,SAAO;AACL,sBADK;AAEL,eAAW;AAFN,GAAP;AAID;;AAED,SAAS,eAAT,CAA0B,WAA1B,EAAuC,KAAvC,EAA8C;AAC5C,MAAI,oBAAJ;;AAEA;AACA,OAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,YAAY,WAAZ,CAAwB,SAAxB,CAAkC,MAAtD,EAA8D,GAA9D,EAAmE;AACjE,QAAM,UAAU,YAAY,WAAZ,CAAwB,SAAxB,CAAkC,CAAlC,CAAhB;AACA,QAAM,iBAAiB,YAAY,WAAZ,CAAwB,QAAxB,CAAkC,CAAlC,CAAvB;;AAEA;AACA,QAAI,mBAAmB,WAAvB,EAAoC;AAClC;AACA,YAAM,MAAN,GAAe,cAAf;AACA,cAAQ,IAAR,CAAa,KAAb;AACD;AACD,kBAAc,cAAd;AACD;AACF;;AAED;AACA;AACA;AACA,SAAS,cAAT,CAAyB,WAAzB,EAAsC,WAAtC,EAAmD;AACjD;AACA,MAAM,gBAAgB,aAAa,WAAb,EAA0B,WAA1B,EAAuC,IAAvC,CAAtB;;AAEA,cAAY,WAAZ,CAAwB,SAAxB,GAAoC,cAAc,SAAlD;AACA,cAAY,WAAZ,CAAwB,QAAxB,GAAoC,cAAc,QAAlD;AACA,cAAY,WAAZ,CAAwB,KAAxB,GAAoC,EAApC;;AAEA,OAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,YAAY,WAAZ,CAAwB,SAAxB,CAAkC,MAAtD,EAA8D,GAA9D,EAAmE;AACjE,gBAAY,WAAZ,CAAwB,KAAxB,CAA8B,CAA9B,IACE,YAAY,WAAZ,CAAwB,SAAxB,CAAkC,CAAlC,EAAqC,OAArC,CAA6C,YAAY,WAAZ,CAAwB,QAAxB,CAAiC,CAAjC,CAA7C,CADF;AAED;AACF;;AAED,SAAS,OAAT,CAAkB,SAAlB,EAA6B,KAA7B,EAAoC,WAApC,EAAiD;AAC/C,MAAM,cAAc,UAAU,WAA9B;AACA,MAAM,aAAa,EAAnB;;AAEA,MAAI,WAAJ,EAAiB;AACf,mBAAe,WAAf,EAA4B,WAA5B;AACD;;AAED;AACA,OAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,YAAY,WAAZ,CAAwB,SAAxB,CAAkC,MAAtD,EAA8D,GAA9D,EAAmE;AACjE,QAAM,UAAiB,YAAY,WAAZ,CAAwB,SAAxB,CAAkC,CAAlC,CAAvB;AACA,QAAM,iBAAiB,YAAY,WAAZ,CAAwB,QAAxB,CAAkC,CAAlC,CAAvB;AACA,QAAM,OAAiB,YAAY,WAAZ,CAAwB,KAAxB,CAAkC,CAAlC,CAAvB;;AAEA,eAAW,IAAX,CAAgB,QAAQ,SAAR,CAAkB,SAAlB,EAA6B,KAA7B,EAAoC,YAAY,MAAhD,EAAwD,WAAxD,EAAqE,cAArE,EAAqF,IAArF,IACZ,cADY,GAEZ,IAFJ;AAGD;;AAED;AACA,MAAM,YAAY,MAAM,qBAAN,CAA4B,UAA5B,CAAlB;;AAEA,SAAO;AACL,cAAU,YAAY,WAAZ,CAAwB,SAAxB,CAAkC,SAAlC,KAAgD,IADrD;AAEL,aAAU,YAAY,WAAZ,CAAwB,QAAxB,CAAkC,SAAlC,KAAgD;AAFrD,GAAP;AAID;;AAED,SAAS,aAAT,CAAwB,WAAxB,EAAqC,YAArC,EAAmD,SAAnD,EAA8D;AAC5D,MAAM,aAAa;AACjB,WAAY,IADK;AAEjB,WAAY,IAFK;AAGjB,cAAY,IAHK;AAIjB,gBAAY,IAJK;AAKjB,UAAY,IALK;AAMjB,UAAY;AANK,GAAnB;;AASA,MAAM,OAAO;AACX,wBADW;AAEX,4BAFW;AAGX,YAAe,YAAY,WAHhB;AAIX,cAAe,YAAY,UAJhB;AAKX,mBAAe,UAAU,MALd;AAMX,eAAe,UAAU,YANd;AAOX,eAAe,UAAU;AAPd,GAAb;;AAUA,MAAI,YAAY,WAAZ,KAA4B,YAAY,eAA5C,EAA6D;AAC3D;AACA,QAAI,YAAY,cAAhB,EAAgC;AAC9B,iBAAW,KAAX,GAAmB,MAAM,MAAN,CAAa,EAAE,MAAM,WAAR,EAAb,EAAoC,IAApC,CAAnB;;AAEA,gBAAU,SAAV,GAAyB,WAAW,KAAX,CAAiB,MAAjB,GAA4B,YAAY,eAAjE;AACA,gBAAU,YAAV,GAAyB,WAAW,KAAX,CAAiB,QAAjB,GAA4B,YAAY,cAAjE;AACD;AACD;AACA,QAAI,YAAY,UAAhB,EAA4B;AAC1B,iBAAW,KAAX,GAAmB;AACjB,4BADiB;AAEjB,gCAFiB;AAGjB,gBAAe,YAAY,WAHV;AAIjB,kBAAe,YAAY,UAJV;AAKjB,uBAAe,UAAU,MALR;AAMjB,mBAAe,UAAU,YANR;AAOjB,mBAAe,UAAU,SAPR;AAQjB,cAAe;AARE,OAAnB;;AAWA,gBAAU,SAAV,GAAsB,YAAY,WAAlC;AACA,gBAAU,QAAV,GAAqB,YAAY,UAAjC;AACD;AACF;;AAED,MAAI,UAAU,IAAV,KAAmB,SAAnB,IAAgC,YAAY,UAAhD,EAA4D;AAC1D,eAAW,IAAX,GAAkB,MAAM,MAAN,CAAa,EAAE,MAAM,MAAR,EAAb,EAA+B,IAA/B,CAAlB;;AAEA,cAAU,QAAV,GAAqB,YAAY,UAAjC;AACA,cAAU,aAAV,GAA0B,YAAY,WAAtC;AACD;AACD,MAAI,UAAU,IAAV,KAAmB,WAAvB,EAAoC;AAClC,eAAW,QAAX,GAAsB,MAAM,MAAN,CAAa,EAAE,MAAM,cAAR,EAAb,EAAuC,IAAvC,CAAtB;;AAEA,eAAW,QAAX,CAAoB,MAApB,GAA+B,IAA/B;AACA,eAAW,QAAX,CAAoB,QAApB,GAA+B,IAA/B;AACD;AACD,MAAI,UAAU,IAAV,KAAmB,SAAvB,EAAkC;AAChC,eAAW,UAAX,GAAwB,MAAM,MAAN,CAAa,EAAE,MAAM,gBAAR,EAAb,EAAyC,IAAzC,CAAxB;;AAEA,eAAW,UAAX,CAAsB,MAAtB,GAAiC,IAAjC;AACA,eAAW,UAAX,CAAsB,QAAtB,GAAiC,IAAjC;AACD;AACD,MAAI,UAAU,IAAV,KAAmB,UAAnB,IAAiC,YAAY,UAAjD,EAA6D;AAC3D,eAAW,IAAX,GAAkB,MAAM,MAAN,CAAa;AAC7B,gBAAe,SADc;AAE7B,YAAe;AAFc,KAAb,EAGf,IAHe,CAAlB;;AAKA,cAAU,QAAV,GAAqB,YAAY,UAAjC;AACD;;AAED,SAAO,UAAP;AACD;;AAED,SAAS,cAAT,CAAyB,WAAzB,EAAsC,UAAtC,EAAkD;AAChD,MAAI,WAAW,KAAf,EAAsB;AAAE,gBAAY,cAAZ,CAA2B,IAA3B,CAAgC,WAAW,KAA3C;AAAoD;AAC5E,MAAI,WAAW,IAAf,EAAsB;AAAM,gBAAY,UAAZ,CAAuB,IAAvB,CAA4B,WAAW,IAAvC;AAAgD;AAC5E,MAAI,WAAW,KAAf,EAAsB;AAAM,gBAAY,UAAZ,CAAuB,IAAvB,CAA4B,WAAW,KAAvC;AAAgD;AAC5E,MAAI,WAAW,IAAf,EAAsB;AAAM,gBAAY,UAAZ,CAAuB,IAAvB,CAA4B,WAAW,IAAvC;AAAgD;AAC5E,MAAI,WAAW,UAAf,EAA2B;AACzB,oBAAgB,WAAhB,EAA6B,WAAW,UAAxC;AACD;;AAED,cAAY,cAAZ,GAA8B,YAAY,UAA1C;AACA,cAAY,eAAZ,GAA8B,YAAY,WAA1C;AACD;;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoDA,aAAa,SAAb,CAAuB,QAAvB,GAAkC,UAAU,OAAV,EAAmB;AACnD,MAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,OAAhB,CAAJ,EAA8B;AAC5B,SAAK,OAAL,CAAa,IAAb,CAAkB,OAAlB,GAA4B,QAAQ,OAAR,KAAoB,KAApB,GAA2B,KAA3B,GAAkC,IAA9D;;AAEA,QAAI,MAAM,EAAN,CAAS,QAAT,CAAkB,QAAQ,MAA1B,CAAJ,EAAiD;AAAE,WAAK,MAAL,CAAY,MAAZ,GAA+B,QAAQ,MAAvC;AAA0D;AAC7G,QAAI,MAAM,EAAN,CAAS,QAAT,CAAkB,QAAQ,cAA1B,CAAJ,EAAiD;AAAE,WAAK,MAAL,CAAY,cAAZ,GAA+B,QAAQ,cAAvC;AAA0D;AAC7G,QAAI,MAAM,EAAN,CAAS,QAAT,CAAkB,QAAQ,gBAA1B,CAAJ,EAAiD;AAAE,WAAK,MAAL,CAAY,gBAAZ,GAA+B,QAAQ,gBAAvC;AAA0D;AAC7G,QAAI,MAAM,EAAN,CAAS,QAAT,CAAkB,QAAQ,WAA1B,CAAJ,EAAiD;AAAE,WAAK,MAAL,CAAY,WAAZ,GAA+B,QAAQ,WAAvC;AAA0D;AAC7G,QAAI,MAAM,EAAN,CAAS,QAAT,CAAkB,QAAQ,WAA1B,CAAJ,EAAiD;AAAE,WAAK,MAAL,CAAY,WAAZ,GAA+B,QAAQ,WAAvC;AAA0D;AAC7G,QAAI,MAAM,EAAN,CAAS,QAAT,CAAkB,QAAQ,UAA1B,CAAJ,EAAiD;AAAE,WAAK,MAAL,CAAY,UAAZ,GAA+B,QAAQ,UAAvC;AAA0D;;AAE7G,QAAI,qBAAqB,IAArB,CAA0B,QAAQ,OAAlC,CAAJ,EAAgD;AAC9C,WAAK,OAAL,CAAa,IAAb,CAAkB,OAAlB,GAA4B,QAAQ,OAApC;AACD,KAFD,MAGK,IAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,QAAQ,OAAxB,CAAJ,EAAsC;AACzC,WAAK,OAAL,CAAa,IAAb,CAAkB,OAAlB,GAA4B,KAAK,GAAL,CAAS,KAAK,GAAL,CAAS,CAAT,EAAY,QAAQ,OAApB,CAAT,EAAuC,CAAvC,CAA5B;AACD;AACD,QAAI,YAAY,OAAhB,EAAyB;AACvB,WAAK,OAAL,CAAa,IAAb,CAAkB,MAAlB,GAA2B,QAAQ,MAAnC;AACD;AACD,QAAI,aAAa,OAAjB,EAA0B;AACxB,WAAK,OAAL,CAAa,IAAb,CAAkB,OAAlB,GAA4B,QAAQ,OAApC;AACD;;AAGD,WAAO,IAAP;AACD;;AAED,MAAI,MAAM,EAAN,CAAS,IAAT,CAAc,OAAd,CAAJ,EAA4B;AAC1B,SAAK,OAAL,CAAa,IAAb,CAAkB,OAAlB,GAA4B,OAA5B;;AAEA,QAAI,CAAC,OAAL,EAAc;AACZ,WAAK,WAAL,GAAmB,KAAK,WAAL,GAAmB,KAAK,MAAL,GAClC,KAAK,cAAL,GAAsB,KAAK,gBAAL,GAAwB,IADlD;AAED;;AAED,WAAO,IAAP;AACD;;AAED,SAAO,KAAK,OAAL,CAAa,IAApB;AACD,CAxCD;;AA0CA,aAAa,SAAb,CAAuB,SAAvB,GAAmC,UAAU,SAAV,EAAqB,KAArB,EAA4B,SAA5B,EAAuC,gBAAvC,EAAyD,WAAzD,EAAsE,IAAtE,EAA4E;AAC7G,MAAI,UAAU,KAAd;;AAEA;AACA;AACA,MAAI,EAAE,OAAO,QAAQ,KAAK,OAAL,CAAa,WAAb,CAAjB,CAAJ,EAAiD;AAC/C,WAAQ,KAAK,OAAL,CAAa,IAAb,CAAkB,OAAlB,GACJ,KAAK,OAAL,CAAa,IAAb,CAAkB,OAAlB,CAA0B,SAA1B,EAAqC,KAArC,EAA4C,OAA5C,EAAqD,IAArD,EAA2D,WAA3D,EAAwE,SAAxE,EAAmF,gBAAnF,CADI,GAEJ,KAFJ;AAGD;;AAED,MAAM,cAAc,KAAK,OAAL,CAAa,IAAb,CAAkB,OAAtC;;AAEA,MAAI,gBAAgB,SAApB,EAA+B;AAC7B,QAAM,SAAS,MAAM,WAAN,CAAkB,SAAlB,EAA6B,gBAA7B,EAA+C,MAA/C,CAAf;AACA,QAAM,OAAO,MAAM,SAAN,CAAgB,SAAhB,CAAb;;AAEA,SAAK,CAAL,IAAU,OAAO,CAAjB;AACA,SAAK,CAAL,IAAU,OAAO,CAAjB;;AAEA,QAAM,aAAc,KAAK,CAAL,GAAS,KAAK,IAAf,IAAyB,KAAK,CAAL,GAAS,KAAK,KAA1D;AACA,QAAM,WAAc,KAAK,CAAL,GAAS,KAAK,GAAf,IAAyB,KAAK,CAAL,GAAS,KAAK,MAA1D;;AAEA,cAAU,cAAc,QAAxB;AACD;;AAED,MAAM,WAAW,UAAU,OAAV,CAAkB,gBAAlB,CAAjB;;AAEA,MAAI,YAAY,gBAAgB,QAAhC,EAA0C;AACxC,QAAM,KAAK,SAAS,IAAT,GAAgB,SAAS,KAAT,GAAkB,CAA7C;AACA,QAAM,KAAK,SAAS,GAAT,GAAgB,SAAS,MAAT,GAAkB,CAA7C;;AAEA,cAAU,MAAM,KAAK,IAAX,IAAmB,MAAM,KAAK,KAA9B,IAAuC,MAAM,KAAK,GAAlD,IAAyD,MAAM,KAAK,MAA9E;AACD;;AAED,MAAI,YAAY,MAAM,EAAN,CAAS,MAAT,CAAgB,WAAhB,CAAhB,EAA8C;AAC5C,QAAM,cAAgB,KAAK,GAAL,CAAS,CAAT,EAAY,KAAK,GAAL,CAAS,KAAK,KAAd,EAAsB,SAAS,KAA/B,IAAyC,KAAK,GAAL,CAAS,KAAK,IAAd,EAAoB,SAAS,IAA7B,CAArD,IACE,KAAK,GAAL,CAAS,CAAT,EAAY,KAAK,GAAL,CAAS,KAAK,MAAd,EAAsB,SAAS,MAA/B,IAAyC,KAAK,GAAL,CAAS,KAAK,GAAd,EAAoB,SAAS,GAA7B,CAArD,CADxB;;AAGA,QAAM,eAAe,eAAe,SAAS,KAAT,GAAiB,SAAS,MAAzC,CAArB;;AAEA,cAAU,gBAAgB,WAA1B;AACD;;AAED,MAAI,KAAK,OAAL,CAAa,IAAb,CAAkB,OAAtB,EAA+B;AAC7B,cAAU,KAAK,OAAL,CAAa,IAAb,CAAkB,OAAlB,CAA0B,SAA1B,EAAqC,KAArC,EAA4C,OAA5C,EAAqD,IAArD,EAA2D,WAA3D,EAAwE,SAAxE,EAAmF,gBAAnF,CAAV;AACD;;AAED,SAAO,OAAP;AACD,CAjDD;;AAmDA,aAAa,OAAb,CAAqB,EAArB,CAAwB,OAAxB,EAAiC,iBAA4B;AAAA,MAAhB,YAAgB,SAAhB,YAAgB;;AAC3D,eAAa,QAAb,CAAsB,KAAtB;AACD,CAFD;;AAIA,aAAa,eAAb,CAA6B,IAA7B,CAAkC,aAAlC;;AAEA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,KAAvB,EAA8B,UAAU,WAAV,EAAuB;AACnD,cAAY,UAAZ,GAA8B,IAA9B,CADmD,CACf;AACpC,cAAY,WAAZ,GAA8B,IAA9B,CAFmD,CAEf;AACpC,cAAY,cAAZ,GAA8B,IAA9B,CAHmD,CAGf;AACpC,cAAY,eAAZ,GAA8B,IAA9B,CAJmD,CAIf;AACpC,cAAY,UAAZ,GAA8B,IAA9B,CALmD,CAKf;;AAEpC,cAAY,WAAZ,GAA0B;AACxB,eAAW,EADa,EACJ;AACpB,cAAW,EAFa,EAEJ;AACpB,WAAW,EAHa,CAGJ;AAHI,GAA1B;AAMD,CAbD;;AAeA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,MAAvB,EAA+B,iBAA2B;AAAA,MAAf,WAAe,SAAf,WAAe;;AACxD,cAAY,UAAZ,GAAyB,YAAY,WAAZ,GACvB,YAAY,cAAZ,GAA6B,YAAY,eAAZ,GAA8B,IAD7D;AAED,CAHD;;AAKA;;;;;;;;;;;AAWA,SAAS,WAAT,GAAuB,UAAU,QAAV,EAAoB;AACzC,MAAI,MAAM,EAAN,CAAS,IAAT,CAAc,QAAd,CAAJ,EAA6B;AAC3B;AACE;AACF;;AAEA,kBAAc,QAAd;;AAEA,WAAO,QAAP;AACD;AACD,SAAO,WAAP;AACD,CAXD;;AAaA,MAAM,KAAN,CAAY,aAAa,UAAzB,EAAqC,CACnC,WADmC,EAEnC,WAFmC,EAGnC,cAHmC,EAInC,gBAJmC,EAKnC,UALmC,EAMnC,MANmC,CAArC;AAQA,QAAQ,UAAR,CAAmB,IAAnB,GAA0B,UAA1B;;AAEA,eAAe,IAAf,GAAsB,KAAK,QAA3B;;AAEA,OAAO,OAAP,GAAiB,IAAjB;;;;;ACzdA,IAAM,UAAiB,QAAQ,QAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,UAAR,CAAvB;AACA,IAAM,gBAAiB,QAAQ,kBAAR,CAAvB;AACA,IAAM,eAAiB,QAAQ,iBAAR,CAAvB;AACA,IAAM,cAAiB,QAAQ,gBAAR,CAAvB;AACA,IAAM,iBAAiB,QAAQ,mBAAR,CAAvB;;AAEA,IAAM,UAAU;AACd,YAAU;AACR,aAAU,KADF;AAER,YAAU,IAFF;AAGR,cAAU;AAHF,GADI;;AAOd,WAAS,iBAAU,OAAV,EAAmB,KAAnB,EAA0B,YAA1B,EAAwC,OAAxC,EAAiD,WAAjD,EAA8D;AACrE,QAAI,YAAY,UAAZ,CAAuB,MAAvB,IAAiC,CAArC,EAAwC;AACtC,aAAO,EAAE,MAAM,SAAR,EAAP;AACD;;AAED,WAAO,IAAP;AACD,GAba;;AAed,aAAW,qBAAY;AACrB,WAAO,EAAP;AACD;AAjBa,CAAhB;;AAoBA,cAAc,OAAd,CAAsB,EAAtB,CAAyB,KAAzB,EAAgC,gBAAmC;AAAA,MAAvB,MAAuB,QAAvB,MAAuB;AAAA,MAAf,WAAe,QAAf,WAAe;;AACjE,MAAI,OAAO,IAAP,KAAgB,cAApB,EAAoC;AAAE;AAAS;AAC/C,SAAO,EAAP,GAAY,CAAZ;;AAEA,cAAY,OAAZ,CAAoB,aAApB,GAAoC,YAAY,OAAZ,CAAoB,YAApB,GAAmC,OAAO,QAA9E;AACA,cAAY,OAAZ,CAAoB,UAApB,GAAiC,YAAY,OAAZ,CAAoB,SAApB,GAAgC,OAAO,KAAxE;AACA,cAAY,OAAZ,CAAoB,KAApB,GAA4B,CAA5B;AACD,CAPD;;AASA,cAAc,OAAd,CAAsB,EAAtB,CAAyB,KAAzB,EAAgC,iBAAmC;AAAA,MAAvB,MAAuB,SAAvB,MAAuB;AAAA,MAAf,WAAe,SAAf,WAAe;;AACjE,MAAI,OAAO,IAAP,KAAgB,aAApB,EAAmC;AAAE;AAAS;;AAE9C,SAAO,EAAP,GAAY,OAAO,KAAP,GAAe,YAAY,OAAZ,CAAoB,KAA/C;;AAEA,cAAY,MAAZ,CAAmB,IAAnB,CAAwB,MAAxB;;AAEA,cAAY,OAAZ,CAAoB,SAApB,GAAgC,OAAO,KAAvC;AACA,cAAY,OAAZ,CAAoB,YAApB,GAAmC,OAAO,QAA1C;;AAEA,MAAI,OAAO,KAAP,KAAiB,QAAjB,IACG,OAAO,KAAP,KAAiB,IADpB,IAEG,OAAO,KAAP,KAAiB,SAFpB,IAGG,CAAC,MAAM,OAAO,KAAb,CAHR,EAG6B;;AAE3B,gBAAY,OAAZ,CAAoB,KAApB,GAA4B,OAAO,KAAnC;AACD;AACF,CAjBD;;AAmBA;;;;;;;;;;;;;;;;;;;;;;;AAuBA,aAAa,SAAb,CAAuB,UAAvB,GAAoC,UAAU,OAAV,EAAmB;AACrD,MAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,OAAhB,CAAJ,EAA8B;AAC5B,SAAK,OAAL,CAAa,OAAb,CAAqB,OAArB,GAA+B,QAAQ,OAAR,KAAoB,KAApB,GAA2B,KAA3B,GAAkC,IAAjE;AACA,SAAK,YAAL,CAAkB,SAAlB,EAA6B,OAA7B;AACA,SAAK,WAAL,CAAiB,SAAjB,EAA4B,OAA5B;;AAEA,WAAO,IAAP;AACD;;AAED,MAAI,MAAM,EAAN,CAAS,IAAT,CAAc,OAAd,CAAJ,EAA4B;AAC1B,SAAK,OAAL,CAAa,OAAb,CAAqB,OAArB,GAA+B,OAA/B;;AAEA,QAAI,CAAC,OAAL,EAAc;AACZ,WAAK,cAAL,GAAsB,KAAK,cAAL,GAAsB,KAAK,YAAL,GAAoB,IAAhE;AACD;;AAED,WAAO,IAAP;AACD;;AAED,SAAO,KAAK,OAAL,CAAa,OAApB;AACD,CApBD;;AAsBA,cAAc,OAAd,CAAsB,EAAtB,CAAyB,WAAzB,EAAsC,iBAAiF;AAAA,MAArE,WAAqE,SAArE,WAAqE;AAAA,MAAxD,MAAwD,SAAxD,MAAwD;AAAA,MAAhD,MAAgD,SAAhD,MAAgD;AAAA,MAAxC,KAAwC,SAAxC,KAAwC;AAAA,MAAjC,QAAiC,SAAjC,QAAiC;AAAA,MAAvB,MAAuB,SAAvB,MAAuB;AAAA,MAAf,WAAe,SAAf,WAAe;;AACrH,MAAI,WAAW,SAAf,EAA0B;AAAE;AAAS;;AAErC,MAAM,WAAW,YAAY,QAA7B;;AAEA,SAAO,OAAP,GAAiB,CAAC,SAAS,CAAT,CAAD,EAAc,SAAS,CAAT,CAAd,CAAjB;;AAEA,MAAI,QAAJ,EAAc;AACZ,WAAO,QAAP,GAAkB,MAAM,aAAN,CAAoB,QAApB,EAA8B,WAA9B,CAAlB;AACA,WAAO,GAAP,GAAkB,MAAM,SAAN,CAAgB,QAAhB,CAAlB;AACA,WAAO,KAAP,GAAkB,CAAlB;AACA,WAAO,EAAP,GAAkB,CAAlB;AACA,WAAO,KAAP,GAAkB,MAAM,UAAN,CAAiB,QAAjB,EAA2B,SAA3B,EAAsC,WAAtC,CAAlB;AACA,WAAO,EAAP,GAAkB,CAAlB;AACD,GAPD,MAQK,IAAI,UAAU,iBAAiB,aAA/B,EAA8C;AACjD,WAAO,QAAP,GAAkB,YAAY,SAAZ,CAAsB,QAAxC;AACA,WAAO,GAAP,GAAkB,YAAY,SAAZ,CAAsB,GAAxC;AACA,WAAO,KAAP,GAAkB,YAAY,SAAZ,CAAsB,KAAxC;AACA,WAAO,EAAP,GAAkB,OAAO,KAAP,GAAe,CAAjC;AACA,WAAO,KAAP,GAAkB,YAAY,SAAZ,CAAsB,KAAxC;AACA,WAAO,EAAP,GAAkB,OAAO,KAAP,GAAe,YAAY,OAAZ,CAAoB,UAArD;AACD,GAPI,MAQA;AACH,WAAO,QAAP,GAAkB,MAAM,aAAN,CAAoB,QAApB,EAA8B,WAA9B,CAAlB;AACA,WAAO,GAAP,GAAkB,MAAM,SAAN,CAAgB,QAAhB,CAAlB;AACA,WAAO,KAAP,GAAkB,OAAO,QAAP,GAAkB,YAAY,OAAZ,CAAoB,aAAxD;AACA,WAAO,KAAP,GAAkB,MAAM,UAAN,CAAiB,QAAjB,EAA2B,YAAY,OAAZ,CAAoB,SAA/C,EAA0D,WAA1D,CAAlB;;AAEA,WAAO,EAAP,GAAY,OAAO,KAAP,GAAe,YAAY,OAAZ,CAAoB,SAA/C;AACA,WAAO,EAAP,GAAY,OAAO,KAAP,GAAe,YAAY,OAAZ,CAAoB,SAA/C;AACD;AACF,CAhCD;;AAkCA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,KAAvB,EAA8B,UAAU,WAAV,EAAuB;AACnD,cAAY,OAAZ,GAAsB;AACpB,WAAO,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EADa;;AAGpB,mBAAe,CAHK,EAGA;AACpB,kBAAe,CAJK;AAKpB,cAAe,CALK;;AAOpB,WAAO,CAPa,EAOA;;AAEpB,gBAAY,CATQ,EASA;AACpB,eAAY,CAVQ,CAUA;AAVA,GAAtB;AAYD,CAbD;;AAeA,QAAQ,OAAR,GAAkB,OAAlB;AACA,QAAQ,KAAR,CAAc,IAAd,CAAmB,SAAnB;AACA,MAAM,KAAN,CAAY,aAAa,UAAzB,EAAqC,CACnC,cADmC,EAEnC,aAFmC,EAGnC,YAHmC,CAArC;AAKA,QAAQ,UAAR,CAAmB,OAAnB,GAA6B,YAA7B;;AAEA,eAAe,OAAf,GAAyB,QAAQ,QAAjC;;AAEA,OAAO,OAAP,GAAiB,OAAjB;;;;;AChKA,IAAM,UAAiB,QAAQ,QAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,UAAR,CAAvB;AACA,IAAM,UAAiB,QAAQ,kBAAR,CAAvB;AACA,IAAM,gBAAiB,QAAQ,kBAAR,CAAvB;AACA,IAAM,eAAiB,QAAQ,iBAAR,CAAvB;AACA,IAAM,cAAiB,QAAQ,gBAAR,CAAvB;AACA,IAAM,iBAAiB,QAAQ,mBAAR,CAAvB;;AAEA;AACA,IAAM,gBAAgB,QAAQ,aAAR,IAAyB,QAAQ,oBAAjC,GAAuD,EAAvD,GAA2D,EAAjF;;AAEA,IAAM,SAAS;AACb,YAAU;AACR,aAAc,KADN;AAER,kBAAc,IAFN;;AAIR,YAAY,IAJJ;AAKR,UAAY,IALJ;AAMR,cAAY,IANJ;AAOR,aAAY,IAPJ;AAQR,gBAAY,IARJ;;AAUR,YAAQ,KAVA;AAWR,yBAAqB,KAXb;AAYR,UAAM,IAZE;;AAcR;AACA,YAAQ,GAfA;;AAiBR;AACA;AACA;AACA;AACA,WAAO,IArBC;;AAuBR;AACA;AACA;AACA;AACA,YAAQ;AA3BA,GADG;;AA+Bb,WAAS,iBAAU,OAAV,EAAmB,KAAnB,EAA0B,YAA1B,EAAwC,OAAxC,EAAiD,WAAjD,EAA8D,IAA9D,EAAoE;AAC3E,QAAI,CAAC,IAAL,EAAW;AAAE,aAAO,IAAP;AAAc;;AAE3B,QAAM,OAAO,MAAM,MAAN,CAAa,EAAb,EAAiB,YAAY,SAAZ,CAAsB,IAAvC,CAAb;AACA,QAAM,UAAU,aAAa,OAA7B;;AAEA,QAAI,QAAQ,MAAR,CAAe,OAAnB,EAA4B;AAC1B,UAAM,gBAAgB,QAAQ,MAA9B;AACA,UAAM,cAAc,EAAE,MAAM,KAAR,EAAe,OAAO,KAAtB,EAA6B,KAAK,KAAlC,EAAyC,QAAQ,KAAjD,EAApB;;AAEA;AACA,UAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,cAAc,KAA9B,CAAJ,EAA0C;AACxC,aAAK,IAAM,IAAX,IAAmB,WAAnB,EAAgC;AAC9B,sBAAY,IAAZ,IAAoB,gBAAgB,IAAhB,EACgB,cAAc,KAAd,CAAoB,IAApB,CADhB,EAEgB,IAFhB,EAGgB,YAAY,YAH5B,EAIgB,OAJhB,EAKgB,IALhB,EAMgB,cAAc,MAAd,IAAwB,aANxC,CAApB;AAOD;;AAED,oBAAY,IAAZ,GAAmB,YAAY,IAAZ,IAAoB,CAAC,YAAY,KAApD;AACA,oBAAY,GAAZ,GAAmB,YAAY,GAAZ,IAAoB,CAAC,YAAY,MAApD;;AAEA,YAAI,YAAY,IAAZ,IAAoB,YAAY,KAAhC,IAAyC,YAAY,GAArD,IAA4D,YAAY,MAA5E,EAAoF;AAClF,iBAAO;AACL,kBAAM,QADD;AAEL,mBAAO;AAFF,WAAP;AAID;AACF,OApBD,MAqBK;AACH,YAAM,QAAS,QAAQ,MAAR,CAAe,IAAf,KAAwB,GAAxB,IAA+B,KAAK,CAAL,GAAU,KAAK,KAAL,GAAc,aAAtE;AACA,YAAM,SAAS,QAAQ,MAAR,CAAe,IAAf,KAAwB,GAAxB,IAA+B,KAAK,CAAL,GAAU,KAAK,MAAL,GAAc,aAAtE;;AAEA,YAAI,SAAS,MAAb,EAAqB;AACnB,iBAAO;AACL,kBAAM,QADD;AAEL,kBAAM,CAAC,QAAO,GAAP,GAAa,EAAd,KAAqB,SAAQ,GAAR,GAAc,EAAnC;AAFD,WAAP;AAID;AACF;AACF;;AAED,WAAO,IAAP;AACD,GA7EY;;AA+Eb,WAAU,QAAQ,YAAR,GAAuB;AAC/B,OAAI,UAD2B;AAE/B,OAAI,UAF2B;AAG/B,QAAI,WAH2B;;AAK/B,SAAa,UALkB;AAM/B,UAAa,UANkB;AAO/B,YAAa,UAPkB;AAQ/B,WAAa,UARkB;AAS/B,aAAa,WATkB;AAU/B,iBAAa,WAVkB;AAW/B,cAAa,WAXkB;AAY/B,gBAAa;AAZkB,GAAvB,GAaN;AACF,OAAI,WADF;AAEF,OAAI,WAFF;AAGF,QAAI,aAHF;;AAKF,SAAa,WALX;AAMF,UAAa,WANX;AAOF,YAAa,WAPX;AAQF,WAAa,WARX;AASF,aAAa,aATX;AAUF,iBAAa,aAVX;AAWF,cAAa,aAXX;AAYF,gBAAa;AAZX,GA5FS;;AA2Gb,aAAW,mBAAU,MAAV,EAAkB;AAC3B,QAAI,OAAO,IAAX,EAAiB;AACf,aAAO,OAAO,OAAP,CAAe,OAAO,IAAP,GAAc,OAAO,IAApC,CAAP;AACD,KAFD,MAGK,IAAI,OAAO,KAAX,EAAkB;AACrB,UAAI,YAAY,EAAhB;AACA,UAAM,YAAY,CAAC,KAAD,EAAQ,QAAR,EAAkB,MAAlB,EAA0B,OAA1B,CAAlB;;AAEA,WAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,CAApB,EAAuB,GAAvB,EAA4B;AAC1B,YAAI,OAAO,KAAP,CAAa,UAAU,CAAV,CAAb,CAAJ,EAAgC;AAC9B,uBAAa,UAAU,CAAV,CAAb;AACD;AACF;;AAED,aAAO,OAAO,OAAP,CAAe,SAAf,CAAP;AACD;AACF;AA3HY,CAAf;;AA8HA;AACA,cAAc,OAAd,CAAsB,EAAtB,CAAyB,KAAzB,EAAgC,gBAAmC;AAAA,MAAvB,MAAuB,QAAvB,MAAuB;AAAA,MAAf,WAAe,QAAf,WAAe;;AACjE,MAAI,OAAO,IAAP,KAAgB,aAAhB,IAAiC,CAAC,YAAY,QAAZ,CAAqB,KAA3D,EAAkE;AAChE;AACD;;AAED,MAAM,YAAY,YAAY,MAAZ,CAAmB,OAAnB,CAA2B,YAAY,OAAvC,CAAlB;AACA,MAAM,gBAAgB,YAAY,MAAZ,CAAmB,OAAnB,CAA2B,MAAjD;;AAEA;;;;;;AAMA,MAAI,cAAc,MAAd,IAAwB,cAAc,mBAA1C,EAA+D;AAC7D,QAAM,cAAc,MAAM,MAAN,CAAa,EAAb,EAAiB,YAAY,QAAZ,CAAqB,KAAtC,CAApB;;AAEA,gBAAY,GAAZ,GAAqB,YAAY,GAAZ,IAAuB,YAAY,IAAZ,IAAsB,CAAC,YAAY,MAA/E;AACA,gBAAY,IAAZ,GAAqB,YAAY,IAAZ,IAAuB,YAAY,GAAZ,IAAsB,CAAC,YAAY,KAA/E;AACA,gBAAY,MAAZ,GAAqB,YAAY,MAAZ,IAAuB,YAAY,KAAZ,IAAsB,CAAC,YAAY,GAA/E;AACA,gBAAY,KAAZ,GAAqB,YAAY,KAAZ,IAAuB,YAAY,MAAZ,IAAsB,CAAC,YAAY,IAA/E;;AAEA,gBAAY,QAAZ,CAAqB,YAArB,GAAoC,WAApC;AACD,GATD,MAUK;AACH,gBAAY,QAAZ,CAAqB,YAArB,GAAoC,IAApC;AACD;;AAED;AACA,MAAI,cAAc,mBAAlB,EAAuC;AACrC,gBAAY,sBAAZ,GAAqC,UAAU,KAAV,GAAkB,UAAU,MAAjE;AACD;;AAED,cAAY,WAAZ,GAA0B;AACxB,WAAY,SADY;AAExB,aAAY,MAAM,MAAN,CAAa,EAAb,EAAiB,SAAjB,CAFY;AAGxB,cAAY,MAAM,MAAN,CAAa,EAAb,EAAiB,SAAjB,CAHY;AAIxB,cAAY,MAAM,MAAN,CAAa,EAAb,EAAiB,SAAjB,CAJY;AAKxB,WAAY;AACV,YAAM,CADI,EACD,OAAQ,CADP,EACU,OAAQ,CADlB;AAEV,WAAM,CAFI,EAED,QAAQ,CAFP,EAEU,QAAQ;AAFlB;AALY,GAA1B;;AAWA,SAAO,IAAP,GAAc,YAAY,WAAZ,CAAwB,QAAtC;AACA,SAAO,SAAP,GAAmB,YAAY,WAAZ,CAAwB,KAA3C;AACD,CA9CD;;AAgDA;AACA,cAAc,OAAd,CAAsB,EAAtB,CAAyB,KAAzB,EAAgC,iBAA0C;AAAA,MAA9B,MAA8B,SAA9B,MAA8B;AAAA,MAAtB,KAAsB,SAAtB,KAAsB;AAAA,MAAf,WAAe,SAAf,WAAe;;AACxE,MAAI,UAAU,MAAV,IAAoB,CAAC,YAAY,QAAZ,CAAqB,KAA9C,EAAqD;AAAE;AAAS;;AAEhE,MAAM,gBAAgB,YAAY,MAAZ,CAAmB,OAAnB,CAA2B,MAAjD;AACA,MAAM,SAAS,cAAc,MAA7B;AACA,MAAM,aAAa,WAAW,YAAX,IAA2B,WAAW,QAAzD;;AAEA,MAAI,QAAQ,YAAY,QAAZ,CAAqB,KAAjC;;AAEA,MAAM,QAAa,YAAY,WAAZ,CAAwB,KAA3C;AACA,MAAM,UAAa,YAAY,WAAZ,CAAwB,OAA3C;AACA,MAAM,WAAa,YAAY,WAAZ,CAAwB,QAA3C;AACA,MAAM,QAAa,YAAY,WAAZ,CAAwB,KAA3C;AACA,MAAM,WAAa,MAAM,MAAN,CAAa,YAAY,WAAZ,CAAwB,QAArC,EAA+C,QAA/C,CAAnB;AACA,MAAM,gBAAgB,KAAtB;;AAEA,MAAI,KAAK,OAAO,EAAhB;AACA,MAAI,KAAK,OAAO,EAAhB;;AAEA,MAAI,cAAc,mBAAd,IAAqC,cAAc,MAAvD,EAA+D;AAC7D;AACA,QAAM,mBAAmB,cAAc,mBAAd,GACrB,YAAY,sBADS,GAErB,CAFJ;;AAIA,YAAQ,YAAY,QAAZ,CAAqB,YAA7B;;AAEA,QAAK,cAAc,IAAd,IAAsB,cAAc,MAArC,IACI,cAAc,KAAd,IAAuB,cAAc,GAD7C,EACmD;AACjD,WAAK,CAAC,EAAD,GAAM,gBAAX;AACD,KAHD,MAIK,IAAI,cAAc,IAAd,IAAsB,cAAc,KAAxC,EAAgD;AAAE,WAAK,KAAK,gBAAV;AAA6B,KAA/E,MACA,IAAI,cAAc,GAAd,IAAsB,cAAc,MAAxC,EAAgD;AAAE,WAAK,KAAK,gBAAV;AAA6B;AACrF;;AAED;AACA,MAAI,MAAM,GAAV,EAAkB;AAAE,YAAQ,GAAR,IAAkB,EAAlB;AAAuB;AAC3C,MAAI,MAAM,MAAV,EAAkB;AAAE,YAAQ,MAAR,IAAkB,EAAlB;AAAuB;AAC3C,MAAI,MAAM,IAAV,EAAkB;AAAE,YAAQ,IAAR,IAAkB,EAAlB;AAAuB;AAC3C,MAAI,MAAM,KAAV,EAAkB;AAAE,YAAQ,KAAR,IAAkB,EAAlB;AAAuB;;AAE3C,MAAI,UAAJ,EAAgB;AACd;AACA,UAAM,MAAN,CAAa,QAAb,EAAuB,OAAvB;;AAEA,QAAI,WAAW,YAAf,EAA6B;AAC3B;AACA,UAAI,aAAJ;;AAEA,UAAI,SAAS,GAAT,GAAe,SAAS,MAA5B,EAAoC;AAClC,eAAO,SAAS,GAAhB;;AAEA,iBAAS,GAAT,GAAe,SAAS,MAAxB;AACA,iBAAS,MAAT,GAAkB,IAAlB;AACD;AACD,UAAI,SAAS,IAAT,GAAgB,SAAS,KAA7B,EAAoC;AAClC,eAAO,SAAS,IAAhB;;AAEA,iBAAS,IAAT,GAAgB,SAAS,KAAzB;AACA,iBAAS,KAAT,GAAiB,IAAjB;AACD;AACF;AACF,GArBD,MAsBK;AACH;AACA,aAAS,GAAT,GAAkB,KAAK,GAAL,CAAS,QAAQ,GAAjB,EAAsB,MAAM,MAA5B,CAAlB;AACA,aAAS,MAAT,GAAkB,KAAK,GAAL,CAAS,QAAQ,MAAjB,EAAyB,MAAM,GAA/B,CAAlB;AACA,aAAS,IAAT,GAAkB,KAAK,GAAL,CAAS,QAAQ,IAAjB,EAAuB,MAAM,KAA7B,CAAlB;AACA,aAAS,KAAT,GAAkB,KAAK,GAAL,CAAS,QAAQ,KAAjB,EAAwB,MAAM,IAA9B,CAAlB;AACD;;AAED,WAAS,KAAT,GAAkB,SAAS,KAAT,GAAkB,SAAS,IAA7C;AACA,WAAS,MAAT,GAAkB,SAAS,MAAT,GAAkB,SAAS,GAA7C;;AAEA,OAAK,IAAM,IAAX,IAAmB,QAAnB,EAA6B;AAC3B,UAAM,IAAN,IAAc,SAAS,IAAT,IAAiB,SAAS,IAAT,CAA/B;AACD;;AAED,SAAO,KAAP,GAAe,YAAY,QAAZ,CAAqB,KAApC;AACA,SAAO,IAAP,GAAc,QAAd;AACA,SAAO,SAAP,GAAmB,KAAnB;AACD,CAjFD;;AAmFA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4CA,aAAa,SAAb,CAAuB,SAAvB,GAAmC,UAAU,OAAV,EAAmB;AACpD,MAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,OAAhB,CAAJ,EAA8B;AAC5B,SAAK,OAAL,CAAa,MAAb,CAAoB,OAApB,GAA8B,QAAQ,OAAR,KAAoB,KAApB,GAA2B,KAA3B,GAAkC,IAAhE;AACA,SAAK,YAAL,CAAkB,QAAlB,EAA4B,OAA5B;AACA,SAAK,WAAL,CAAiB,QAAjB,EAA2B,OAA3B;;AAEA,QAAI,eAAe,IAAf,CAAoB,QAAQ,IAA5B,CAAJ,EAAuC;AACrC,WAAK,OAAL,CAAa,MAAb,CAAoB,IAApB,GAA2B,QAAQ,IAAnC;AACD,KAFD,MAGK,IAAI,QAAQ,IAAR,KAAiB,IAArB,EAA2B;AAC9B,WAAK,OAAL,CAAa,MAAb,CAAoB,IAApB,GAA2B,eAAe,MAAf,CAAsB,IAAjD;AACD;;AAED,QAAI,MAAM,EAAN,CAAS,IAAT,CAAc,QAAQ,mBAAtB,CAAJ,EAAgD;AAC9C,WAAK,OAAL,CAAa,MAAb,CAAoB,mBAApB,GAA0C,QAAQ,mBAAlD;AACD,KAFD,MAGK,IAAI,MAAM,EAAN,CAAS,IAAT,CAAc,QAAQ,MAAtB,CAAJ,EAAmC;AACtC,WAAK,OAAL,CAAa,MAAb,CAAoB,MAApB,GAA6B,QAAQ,MAArC;AACD;;AAED,WAAO,IAAP;AACD;AACD,MAAI,MAAM,EAAN,CAAS,IAAT,CAAc,OAAd,CAAJ,EAA4B;AAC1B,SAAK,OAAL,CAAa,MAAb,CAAoB,OAApB,GAA8B,OAA9B;;AAEA,QAAI,CAAC,OAAL,EAAc;AACZ,WAAK,aAAL,GAAqB,KAAK,aAAL,GAAqB,KAAK,WAAL,GAAmB,IAA7D;AACD;;AAED,WAAO,IAAP;AACD;AACD,SAAO,KAAK,OAAL,CAAa,MAApB;AACD,CAhCD;;AAkCA,SAAS,eAAT,CAA0B,IAA1B,EAAgC,KAAhC,EAAuC,IAAvC,EAA6C,OAA7C,EAAsD,mBAAtD,EAA2E,IAA3E,EAAiF,MAAjF,EAAyF;AACvF;AACA,MAAI,CAAC,KAAL,EAAY;AAAE,WAAO,KAAP;AAAe;;AAE7B;AACA,MAAI,UAAU,IAAd,EAAoB;AAClB;AACA,QAAM,QAAS,MAAM,EAAN,CAAS,MAAT,CAAgB,KAAK,KAArB,IAA8B,KAAK,KAAnC,GAA4C,KAAK,KAAL,GAAc,KAAK,IAA9E;AACA,QAAM,SAAS,MAAM,EAAN,CAAS,MAAT,CAAgB,KAAK,MAArB,IAA8B,KAAK,MAAnC,GAA4C,KAAK,MAAL,GAAc,KAAK,GAA9E;;AAEA,QAAI,QAAQ,CAAZ,EAAe;AACb,UAAS,SAAS,MAAlB,EAA2B;AAAE,eAAO,OAAP;AAAiB,OAA9C,MACK,IAAI,SAAS,OAAb,EAAsB;AAAE,eAAO,MAAP;AAAiB;AAC/C;AACD,QAAI,SAAS,CAAb,EAAgB;AACd,UAAS,SAAS,KAAlB,EAA4B;AAAE,eAAO,QAAP;AAAkB,OAAhD,MACK,IAAI,SAAS,QAAb,EAAuB;AAAE,eAAO,KAAP;AAAkB;AACjD;;AAED,QAAI,SAAS,MAAb,EAAuB;AAAE,aAAO,KAAK,CAAL,GAAU,CAAC,SAAU,CAAV,GAAa,KAAK,IAAlB,GAAwB,KAAK,KAA9B,IAAwC,MAAzD;AAAmE;AAC5F,QAAI,SAAS,KAAb,EAAuB;AAAE,aAAO,KAAK,CAAL,GAAU,CAAC,UAAU,CAAV,GAAa,KAAK,GAAlB,GAAwB,KAAK,MAA9B,IAAwC,MAAzD;AAAmE;;AAE5F,QAAI,SAAS,OAAb,EAAuB;AAAE,aAAO,KAAK,CAAL,GAAU,CAAC,SAAU,CAAV,GAAa,KAAK,KAAlB,GAA0B,KAAK,IAAhC,IAAwC,MAAzD;AAAmE;AAC5F,QAAI,SAAS,QAAb,EAAuB;AAAE,aAAO,KAAK,CAAL,GAAU,CAAC,UAAU,CAAV,GAAa,KAAK,MAAlB,GAA0B,KAAK,GAAhC,IAAwC,MAAzD;AAAmE;AAC7F;;AAED;AACA,MAAI,CAAC,MAAM,EAAN,CAAS,OAAT,CAAiB,OAAjB,CAAL,EAAgC;AAAE,WAAO,KAAP;AAAe;;AAEjD,SAAO,MAAM,EAAN,CAAS,OAAT,CAAiB,KAAjB;AACP;AADO,IAEH,UAAU;AACZ;AAHK,IAIH,MAAM,WAAN,CAAkB,OAAlB,EAA2B,KAA3B,EAAkC,mBAAlC,CAJJ;AAKD;;AAED,YAAY,OAAZ,CAAoB,EAApB,CAAuB,KAAvB,EAA8B,UAAU,WAAV,EAAuB;AACnD,cAAY,UAAZ,GAAyB,IAAzB;AACD,CAFD;;AAIA,cAAc,OAAd,CAAsB,EAAtB,CAAyB,WAAzB,EAAsC,iBAA2C;AAAA,MAA/B,WAA+B,SAA/B,WAA+B;AAAA,MAAlB,MAAkB,SAAlB,MAAkB;AAAA,MAAV,MAAU,SAAV,MAAU;;AAC/E,MAAI,WAAW,QAAX,IAAuB,CAAC,YAAY,UAAxC,EAAoD;AAAE;AAAS;;AAE/D,MAAM,UAAU,YAAY,MAAZ,CAAmB,OAAnC;;AAEA,MAAI,QAAQ,MAAR,CAAe,MAAnB,EAA2B;AACzB,QAAI,YAAY,UAAZ,KAA2B,GAA/B,EAAoC;AAClC,aAAO,EAAP,GAAY,OAAO,EAAnB;AACD,KAFD,MAGK;AACH,aAAO,EAAP,GAAY,OAAO,EAAnB;AACD;AACD,WAAO,IAAP,GAAc,IAAd;AACD,GARD,MASK;AACH,WAAO,IAAP,GAAc,YAAY,UAA1B;;AAEA,QAAI,YAAY,UAAZ,KAA2B,GAA/B,EAAoC;AAClC,aAAO,EAAP,GAAY,CAAZ;AACD,KAFD,MAGK,IAAI,YAAY,UAAZ,KAA2B,GAA/B,EAAoC;AACvC,aAAO,EAAP,GAAY,CAAZ;AACD;AACF;AACF,CAxBD;;AA0BA,QAAQ,MAAR,GAAiB,MAAjB;AACA,QAAQ,KAAR,CAAc,IAAd,CAAmB,QAAnB;AACA,MAAM,KAAN,CAAY,aAAa,UAAzB,EAAqC,CACnC,aADmC,EAEnC,YAFmC,EAGnC,oBAHmC,EAInC,qBAJmC,EAKnC,WALmC,CAArC;AAOA,QAAQ,UAAR,CAAmB,MAAnB,GAA4B,WAA5B;;AAEA,eAAe,MAAf,GAAwB,OAAO,QAA/B;;AAEA,OAAO,OAAP,GAAiB,MAAjB;;;;;AC3aA,IAAM,MAAiB,QAAQ,aAAR,CAAvB;AACA,IAAM,YAAiB,QAAQ,gBAAR,EAA0B,SAAjD;AACA,IAAM,KAAiB,QAAQ,YAAR,CAAvB;AACA,IAAM,WAAiB,QAAQ,kBAAR,CAAvB;AACA,IAAM,cAAiB,QAAQ,eAAR,CAAvB;AACA,IAAM,iBAAiB,QAAQ,kBAAR,CAAvB;;AAEA,IAAM,aAAa;AACjB,YAAU;AACR,aAAW,KADH;AAER,eAAW,IAFH,EAEa;AACrB,YAAW,EAHH;AAIR,WAAW,GAJH,CAIa;AAJb,GADO;;AAQjB,eAAa,IARI;AASjB,KAAG,IATc,EASL;AACZ,KAAG,CAVc,EAUX,GAAG,CAVQ,EAUL;;AAEZ,eAAa,KAZI;AAajB,YAAU,CAbO;;AAejB,SAAO,eAAU,WAAV,EAAuB;AAC5B,eAAW,WAAX,GAAyB,IAAzB;AACA,QAAI,MAAJ,CAAW,WAAW,CAAtB;;AAEA,eAAW,WAAX,GAAyB,WAAzB;AACA,eAAW,QAAX,GAAsB,IAAI,IAAJ,GAAW,OAAX,EAAtB;AACA,eAAW,CAAX,GAAe,IAAI,OAAJ,CAAY,WAAW,MAAvB,CAAf;AACD,GAtBgB;;AAwBjB,QAAM,gBAAY;AAChB,eAAW,WAAX,GAAyB,KAAzB;AACA,QAAI,MAAJ,CAAW,WAAW,CAAtB;AACD,GA3BgB;;AA6BjB;AACA,UAAQ,kBAAY;AAClB,QAAM,UAAU,WAAW,WAAX,CAAuB,MAAvB,CAA8B,OAA9B,CAAsC,WAAW,WAAX,CAAuB,QAAvB,CAAgC,IAAtE,EAA4E,UAA5F;AACA,QAAM,YAAY,QAAQ,SAAR,IAAqB,UAAU,WAAW,WAAX,CAAuB,OAAjC,CAAvC;AACA,QAAM,MAAM,IAAI,IAAJ,GAAW,OAAX,EAAZ;AACA;AACA,QAAM,KAAK,CAAC,MAAM,WAAW,QAAlB,IAA8B,IAAzC;AACA;AACA,QAAM,IAAI,QAAQ,KAAR,GAAgB,EAA1B;;AAEA,QAAI,KAAK,CAAT,EAAY;AACV,UAAI,GAAG,MAAH,CAAU,SAAV,CAAJ,EAA0B;AACxB,kBAAU,QAAV,CAAmB,WAAW,CAAX,GAAe,CAAlC,EAAqC,WAAW,CAAX,GAAe,CAApD;AACD,OAFD,MAGK,IAAI,SAAJ,EAAe;AAClB,kBAAU,UAAV,IAAwB,WAAW,CAAX,GAAe,CAAvC;AACA,kBAAU,SAAV,IAAwB,WAAW,CAAX,GAAe,CAAvC;AACD;;AAED,iBAAW,QAAX,GAAsB,GAAtB;AACD;;AAED,QAAI,WAAW,WAAf,EAA4B;AAC1B,UAAI,MAAJ,CAAW,WAAW,CAAtB;AACA,iBAAW,CAAX,GAAe,IAAI,OAAJ,CAAY,WAAW,MAAvB,CAAf;AACD;AACF,GAvDgB;AAwDjB,SAAO,eAAU,YAAV,EAAwB,UAAxB,EAAoC;AACzC,QAAM,UAAU,aAAa,OAA7B;;AAEA,WAAO,QAAQ,UAAR,EAAoB,UAApB,IAAkC,QAAQ,UAAR,EAAoB,UAApB,CAA+B,OAAxE;AACD,GA5DgB;AA6DjB,qBAAmB,iCAAoC;AAAA,QAAxB,WAAwB,QAAxB,WAAwB;AAAA,QAAX,OAAW,QAAX,OAAW;;AACrD,QAAI,EAAE,YAAY,WAAZ,MACG,WAAW,KAAX,CAAiB,YAAY,MAA7B,EAAqC,YAAY,QAAZ,CAAqB,IAA1D,CADL,CAAJ,EAC2E;AACzE;AACD;;AAED,QAAI,YAAY,UAAhB,EAA4B;AAC1B,iBAAW,CAAX,GAAe,WAAW,CAAX,GAAe,CAA9B;AACA;AACD;;AAED,QAAI,YAAJ;AACA,QAAI,cAAJ;AACA,QAAI,eAAJ;AACA,QAAI,aAAJ;;AAEA,QAAM,UAAU,YAAY,MAAZ,CAAmB,OAAnB,CAA2B,YAAY,QAAZ,CAAqB,IAAhD,EAAsD,UAAtE;AACA,QAAM,YAAY,QAAQ,SAAR,IAAqB,UAAU,YAAY,OAAtB,CAAvC;;AAEA,QAAI,GAAG,MAAH,CAAU,SAAV,CAAJ,EAA0B;AACxB,aAAS,QAAQ,OAAR,GAAkB,WAAW,MAAtC;AACA,YAAS,QAAQ,OAAR,GAAkB,WAAW,MAAtC;AACA,cAAS,QAAQ,OAAR,GAAkB,UAAU,UAAV,GAAwB,WAAW,MAA9D;AACA,eAAS,QAAQ,OAAR,GAAkB,UAAU,WAAV,GAAwB,WAAW,MAA9D;AACD,KALD,MAMK;AACH,UAAM,OAAO,SAAS,oBAAT,CAA8B,SAA9B,CAAb;;AAEA,aAAS,QAAQ,OAAR,GAAkB,KAAK,IAAL,GAAc,WAAW,MAApD;AACA,YAAS,QAAQ,OAAR,GAAkB,KAAK,GAAL,GAAc,WAAW,MAApD;AACA,cAAS,QAAQ,OAAR,GAAkB,KAAK,KAAL,GAAc,WAAW,MAApD;AACA,eAAS,QAAQ,OAAR,GAAkB,KAAK,MAAL,GAAc,WAAW,MAApD;AACD;;AAED,eAAW,CAAX,GAAgB,QAAQ,CAAR,GAAW,OAAM,CAAC,CAAP,GAAU,CAArC;AACA,eAAW,CAAX,GAAgB,SAAQ,CAAR,GAAY,MAAK,CAAC,CAAN,GAAS,CAArC;;AAEA,QAAI,CAAC,WAAW,WAAhB,EAA6B;AAC3B;AACA,iBAAW,MAAX,GAAoB,QAAQ,MAA5B;AACA,iBAAW,KAAX,GAAoB,QAAQ,KAA5B;;AAEA,iBAAW,KAAX,CAAiB,WAAjB;AACD;AACF;AAzGgB,CAAnB;;AA4GA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,aAAvB,EAAsC,YAAY;AAChD,aAAW,IAAX;AACD,CAFD;;AAIA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,aAAvB,EAAsC,WAAW,iBAAjD;;AAEA,eAAe,SAAf,CAAyB,UAAzB,GAAsC,WAAW,QAAjD;;AAEA,OAAO,OAAP,GAAiB,UAAjB;;;;;AC3HA,IAAM,eAAe,QAAQ,iBAAR,CAArB;AACA,IAAM,UAAe,QAAQ,iBAAR,CAArB;AACA,IAAM,KAAe,QAAQ,aAAR,CAArB;AACA,IAAM,WAAe,QAAQ,mBAAR,CAArB;;AAEA,aAAa,SAAb,CAAuB,SAAvB,GAAmC,UAAU,OAAV,EAAmB,KAAnB,EAA0B,WAA1B,EAAuC,OAAvC,EAAgD;AACjF,MAAM,SAAS,KAAK,oBAAL,CAA0B,OAA1B,EAAmC,KAAnC,EAA0C,WAA1C,EAAuD,OAAvD,CAAf;;AAEA,MAAI,KAAK,OAAL,CAAa,aAAjB,EAAgC;AAC9B,WAAO,KAAK,OAAL,CAAa,aAAb,CAA2B,OAA3B,EAAoC,KAApC,EAA2C,MAA3C,EAAmD,IAAnD,EAAyD,OAAzD,EAAkE,WAAlE,CAAP;AACD;;AAED,SAAO,MAAP;AACD,CARD;;AAUA;;;;;;;;;;;;;;;AAeA,aAAa,SAAb,CAAuB,UAAvB,GAAoC,UAAU,QAAV,EAAoB;AACtD,SAAO,KAAK,iBAAL,CAAuB,YAAvB,EAAqC,QAArC,CAAP;AACD,CAFD;;AAIA;;;;;;;;;;;;;;;AAeA,aAAa,SAAb,CAAuB,SAAvB,GAAmC,UAAU,QAAV,EAAoB;AACrD,SAAO,KAAK,iBAAL,CAAuB,WAAvB,EAAoC,QAApC,CAAP;AACD,CAFD;;AAIA,aAAa,SAAb,CAAuB,UAAvB,GAAoC,UAAU,UAAV,EAAsB,mBAAtB,EAA2C,OAA3C,EAAoD;AACtF,MAAI,CAAC,UAAD,IAAe,CAAC,GAAG,OAAH,CAAW,OAAX,CAApB,EAAyC;AAAE,WAAO,KAAP;AAAe;;AAE1D,MAAI,GAAG,MAAH,CAAU,UAAV,CAAJ,EAA2B;AACzB,WAAO,SAAS,WAAT,CAAqB,OAArB,EAA8B,UAA9B,EAA0C,mBAA1C,CAAP;AACD,GAFD,MAGK,IAAI,GAAG,OAAH,CAAW,UAAX,CAAJ,EAA4B;AAC/B,WAAO,SAAS,YAAT,CAAsB,UAAtB,EAAkC,OAAlC,CAAP;AACD;;AAED,SAAO,KAAP;AACD,CAXD;;AAaA,aAAa,SAAb,CAAuB,SAAvB,GAAmC,UAAU,SAAV,EAAqB,mBAArB,EAA0C,OAA1C,EAAmD;AACpF,MAAI,CAAC,SAAL,EAAgB;AAAE,WAAO,IAAP;AAAc;;AAEhC,MAAI,CAAC,GAAG,OAAH,CAAW,OAAX,CAAL,EAA0B;AAAE,WAAO,KAAP;AAAe;;AAE3C,MAAI,GAAG,MAAH,CAAU,SAAV,CAAJ,EAA0B;AACxB,WAAO,SAAS,WAAT,CAAqB,OAArB,EAA8B,SAA9B,EAAyC,mBAAzC,CAAP;AACD,GAFD,MAGK,IAAI,GAAG,OAAH,CAAW,SAAX,CAAJ,EAA2B;AAC9B,WAAO,SAAS,YAAT,CAAsB,SAAtB,EAAiC,OAAjC,CAAP;AACD;;AAED,SAAO,KAAP;AACD,CAbD;;AAeA,aAAa,SAAb,CAAuB,eAAvB,GAAyC,UAAU,OAAV,EAAmB,mBAAnB,EAAwC,WAAxC,EAAqD;AAC5F,SAAQ,CAAC,KAAK,UAAL,CAAgB,QAAQ,UAAxB,EAAoC,mBAApC,EAAyD,WAAzD,CAAD,IACH,KAAK,SAAL,CAAe,QAAQ,SAAvB,EAAkC,mBAAlC,EAAuD,WAAvD,CADL;AAED,CAHD;;AAKA;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4BA,aAAa,SAAb,CAAuB,aAAvB,GAAuC,UAAU,OAAV,EAAmB;AACxD,MAAI,GAAG,QAAH,CAAY,OAAZ,CAAJ,EAA0B;AACxB,SAAK,OAAL,CAAa,aAAb,GAA6B,OAA7B;;AAEA,WAAO,IAAP;AACD;;AAED,MAAI,YAAY,IAAhB,EAAsB;AACpB,WAAO,KAAK,OAAL,CAAa,aAApB;;AAEA,WAAO,IAAP;AACD;;AAED,SAAO,KAAK,OAAL,CAAa,aAApB;AACD,CAdD;;AAgBA;;;;;;;;;;AAUA,aAAa,SAAb,CAAuB,WAAvB,GAAqC,UAAU,QAAV,EAAoB;AACvD,MAAI,GAAG,IAAH,CAAQ,QAAR,CAAJ,EAAuB;AACrB,SAAK,OAAL,CAAa,WAAb,GAA2B,QAA3B;;AAEA,WAAO,IAAP;AACD;;AAED,MAAI,aAAa,IAAjB,EAAuB;AACrB,WAAO,KAAK,OAAL,CAAa,WAApB;;AAEA,WAAO,IAAP;AACD;;AAED,SAAO,KAAK,OAAL,CAAa,WAApB;AACD,CAdD;;AAgBA,aAAa,SAAb,CAAuB,oBAAvB,GAA8C,UAAU,OAAV,EAAmB,KAAnB,EAA0B,WAA1B,EAAuC,OAAvC,EAAgD;AAC5F,MAAM,OAAO,KAAK,OAAL,CAAa,OAAb,CAAb;AACA,MAAI,SAAS,IAAb;;AAEA,uBAAyB,QAAQ,KAAjC,kHAAwC;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,QAA7B,UAA6B;;AACtC;AACA,QAAI,YAAY,aAAZ,IACG,YAAY,KADf,IAEG,CAAC,MAAM,OAAN,GAAgB,KAAK,OAAL,CAAa,UAAb,EAAyB,YAA1C,MAA4D,CAFnE,EAEsE;AACpE;AACD;;AAED,aAAS,QAAQ,UAAR,EAAoB,OAApB,CAA4B,OAA5B,EAAqC,KAArC,EAA4C,IAA5C,EAAkD,OAAlD,EAA2D,WAA3D,EAAwE,IAAxE,CAAT;;AAEA,QAAI,MAAJ,EAAY;AACV,aAAO,MAAP;AACD;AACF;AACF,CAlBD;;;;;AC5JA,IAAM,WAAiB,QAAQ,aAAR,CAAvB;AACA,IAAM,eAAiB,QAAQ,iBAAR,CAAvB;AACA,IAAM,cAAiB,QAAQ,gBAAR,CAAvB;AACA,IAAM,UAAiB,QAAQ,iBAAR,CAAvB;AACA,IAAM,iBAAiB,QAAQ,mBAAR,CAAvB;AACA,IAAM,UAAiB,QAAQ,kBAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,UAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,UAAR,CAAvB;AACA,IAAM,UAAiB,QAAQ,kBAAR,EAA4B,GAA5B,EAAvB;;AAEA,QAAQ,uBAAR;;AAEA,IAAM,YAAY;AAChB,kBADgB;AAEhB,gDAFgB;AAGhB;AACA,mBAAiB,QAJD;AAKhB,YAAU;AACR,eAAW;AACT,mBAAa,KADJ;AAET,WAAK,QAFI;AAGT,qBAAe,CAHN;AAIT,iBAAY,IAJH;AAKT,kBAAY;AALH;AADH,GALM;AAchB,qBAAmB,2BAAU,MAAV,EAAkB;AACnC,UAAM,MAAN,CAAa,OAAO,QAApB,EAA8B,UAAU,QAAV,CAAmB,SAAjD;AACD;AAhBe,CAAlB;;AAmBA;AACA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,MAAvB,EAA+B,gBAAwD;AAAA,MAA5C,WAA4C,QAA5C,WAA4C;AAAA,MAA/B,OAA+B,QAA/B,OAA+B;AAAA,MAAtB,KAAsB,QAAtB,KAAsB;AAAA,MAAf,WAAe,QAAf,WAAe;;AACrF,MAAI,YAAY,WAAZ,EAAJ,EAA+B;AAAE;AAAS;;AAE1C,MAAM,aAAa,cAAc,WAAd,EAA2B,OAA3B,EAAoC,KAApC,EAA2C,WAA3C,CAAnB;AACA,UAAQ,WAAR,EAAqB,UAArB;AACD,CALD;;AAOA;AACA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,MAAvB,EAA+B,iBAAwD;AAAA,MAA5C,WAA4C,SAA5C,WAA4C;AAAA,MAA/B,OAA+B,SAA/B,OAA+B;AAAA,MAAtB,KAAsB,SAAtB,KAAsB;AAAA,MAAf,WAAe,SAAf,WAAe;;AACrF,MAAI,CAAC,YAAY,KAAb,IACG,YAAY,aADf,IAEG,YAAY,WAAZ,EAFP,EAEkC;AAAE;AAAS;;AAE7C,MAAM,aAAa,cAAc,WAAd,EAA2B,OAA3B,EAAoC,KAApC,EAA2C,WAA3C,CAAnB;AACA,UAAQ,WAAR,EAAqB,UAArB;AACD,CAPD;;AASA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,MAAvB,EAA+B,UAAU,GAAV,EAAe;AAAA,MACpC,WADoC,GACb,GADa,CACpC,WADoC;AAAA,MACvB,KADuB,GACb,GADa,CACvB,KADuB;;;AAG5C,MAAI,CAAC,YAAY,aAAb,IACG,YAAY,WAAZ,EADH,IAEG,CAAC,YAAY,eAFhB,IAGG,CAAC,YAAY,QAAZ,CAAqB,IAH7B,EAGmC;AACjC;AACD;;AAED,UAAQ,IAAR,CAAa,cAAb,EAA6B,GAA7B;;AAEA,MAAM,SAAS,YAAY,MAA3B;;AAEA,MAAI,YAAY,QAAZ,CAAqB,IAArB,IAA6B,MAAjC,EAAyC;AACvC;AACA,QAAI,OAAO,OAAP,CAAe,YAAY,QAAZ,CAAqB,IAApC,EAA0C,WAA1C,IACG,CAAC,uBAAuB,MAAvB,EAA+B,YAAY,OAA3C,EAAoD,YAAY,QAAhE,CADR,EACmF;AACjF,kBAAY,IAAZ,CAAiB,KAAjB;AACD,KAHD,MAIK;AACH,kBAAY,KAAZ,CAAkB,YAAY,QAA9B,EAAwC,MAAxC,EAAgD,YAAY,OAA5D;AACD;AACF;AACF,CAxBD;;AA0BA;AACA;AACA,SAAS,cAAT,CAAyB,MAAzB,EAAiC,YAAjC,EAA+C,OAA/C,EAAwD,WAAxD,EAAqE;AACnE,MAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,MAAhB,KACG,aAAa,eAAb,CAA6B,aAAa,OAAb,CAAqB,OAAO,IAA5B,CAA7B,EAAgE,OAAhE,EAAyE,WAAzE,CADH,IAEG,aAAa,OAAb,CAAqB,OAAO,IAA5B,EAAkC,OAFrC,IAGG,uBAAuB,YAAvB,EAAqC,OAArC,EAA8C,MAA9C,CAHP,EAG8D;AAC5D,WAAO,MAAP;AACD;;AAED,SAAO,IAAP;AACD;;AAED,SAAS,gBAAT,CAA2B,WAA3B,EAAwC,OAAxC,EAAiD,KAAjD,EAAwD,OAAxD,EAAiE,aAAjE,EAAgF,WAAhF,EAA6F;AAC3F,OAAK,IAAI,IAAI,CAAR,EAAW,MAAM,QAAQ,MAA9B,EAAsC,IAAI,GAA1C,EAA+C,GAA/C,EAAoD;AAClD,QAAM,QAAQ,QAAQ,CAAR,CAAd;AACA,QAAM,eAAe,cAAc,CAAd,CAArB;AACA,QAAM,SAAS,eAAe,MAAM,SAAN,CAAgB,OAAhB,EAAyB,KAAzB,EAAgC,WAAhC,EAA6C,YAA7C,CAAf,EACe,KADf,EAEe,YAFf,EAGe,WAHf,CAAf;;AAKA,QAAI,MAAJ,EAAY;AACV,aAAO;AACL,sBADK;AAEL,gBAAQ,KAFH;AAGL,iBAAS;AAHJ,OAAP;AAKD;AACF;;AAED,SAAO,EAAP;AACD;;AAED,SAAS,aAAT,CAAwB,WAAxB,EAAqC,OAArC,EAA8C,KAA9C,EAAqD,WAArD,EAAkE;AAChE,MAAI,UAAU,EAAd;AACA,MAAI,gBAAgB,EAApB;;AAEA,MAAI,UAAU,WAAd;AACA,MAAI,SAAS,IAAb;;AAEA,WAAS,WAAT,CAAsB,YAAtB,EAAoC,QAApC,EAA8C,OAA9C,EAAuD;AACrD,QAAM,WAAY,QAAQ,0BAAR,GACd,QAAQ,gBAAR,CAAyB,QAAzB,CADc,GAEd,SAFJ;;AAIA,QAAI,MAAM,eAAN,CAAsB,OAAtB,EAA+B,QAA/B,EAAyC,QAAzC,CAAJ,EAAwD;;AAEtD,cAAQ,IAAR,CAAa,YAAb;AACA,oBAAc,IAAd,CAAmB,OAAnB;AACD;AACF;;AAED,SAAO,MAAM,EAAN,CAAS,OAAT,CAAiB,OAAjB,CAAP,EAAkC;AAChC,cAAU,EAAV;AACA,oBAAgB,EAAhB;;AAEA,QAAM,sBAAsB,MAAM,aAAN,CAAoB,GAApB,CAAwB,OAAxB,CAA5B;;AAEA,QAAI,wBACI,SAAS,eAAe,oBAAoB,SAApB,CAA8B,OAA9B,EAAuC,KAAvC,EAA8C,WAA9C,EAA2D,OAA3D,EAAoE,WAApE,CAAf,EACe,mBADf,EAEe,OAFf,EAGe,WAHf,CADb,KAKG,CAAC,oBAAoB,OAApB,CAA4B,OAAO,IAAnC,EAAyC,WALjD,EAK8D;AAC5D,aAAO;AACL,wBADK;AAEL,sBAFK;AAGL,gBAAQ;AAHH,OAAP;AAKD,KAXD,MAYK;AACH,YAAM,aAAN,CAAoB,eAApB,CAAoC,WAApC,EAAiD,OAAjD;;AAEA,UAAM,aAAa,iBAAiB,WAAjB,EAA8B,OAA9B,EAAuC,KAAvC,EAA8C,OAA9C,EAAuD,aAAvD,EAAsE,WAAtE,CAAnB;;AAEA,UAAI,WAAW,MAAX,IACG,CAAC,WAAW,MAAX,CAAkB,OAAlB,CAA0B,WAAW,MAAX,CAAkB,IAA5C,EAAkD,WAD1D,EACuE;AACrE,eAAO,UAAP;AACD;AACF;;AAED,cAAU,MAAM,UAAN,CAAiB,OAAjB,CAAV;AACD;;AAED,SAAO,EAAP;AACD;;AAED,SAAS,OAAT,CAAkB,WAAlB,SAA4D;AAAA,MAA3B,MAA2B,SAA3B,MAA2B;AAAA,MAAnB,MAAmB,SAAnB,MAAmB;AAAA,MAAX,OAAW,SAAX,OAAW;;AAC1D,WAAS,UAAU,EAAnB;;AAEA,MAAI,YAAY,MAAZ,IAAsB,YAAY,MAAZ,CAAmB,OAAnB,CAA2B,WAArD,EAAkE;AAChE,gBAAY,MAAZ,CAAmB,IAAnB,CAAwB,eAAxB,CAAwC,KAAxC,CAA8C,MAA9C,GAAuD,EAAvD;AACD;;AAED,cAAY,MAAZ,GAAqB,MAArB;AACA,cAAY,OAAZ,GAAsB,OAAtB;AACA,QAAM,UAAN,CAAiB,YAAY,QAA7B,EAAuC,MAAvC;;AAEA,MAAI,UAAU,OAAO,OAAP,CAAe,WAA7B,EAA0C;AACxC,QAAM,SAAS,SAAQ,QAAQ,OAAO,IAAf,EAAqB,SAArB,CAA+B,MAA/B,CAAR,GAAiD,EAAhE;AACA,gBAAY,MAAZ,CAAmB,IAAnB,CAAwB,eAAxB,CAAwC,KAAxC,CAA8C,MAA9C,GAAuD,MAAvD;AACD;;AAED,UAAQ,IAAR,CAAa,UAAb,EAAyB,EAAE,aAAa,WAAf,EAAzB;AACD;;AAED,YAAY,OAAZ,CAAoB,EAApB,CAAuB,MAAvB,EAA+B,iBAA2B;AAAA,MAAf,WAAe,SAAf,WAAe;;AACxD,MAAM,SAAS,YAAY,MAA3B;;AAEA,MAAI,UAAU,OAAO,OAAP,CAAe,WAA7B,EAA0C;AACxC,WAAO,IAAP,CAAY,eAAZ,CAA4B,KAA5B,CAAkC,MAAlC,GAA2C,EAA3C;AACD;AACF,CAND;;AAQA,aAAa,SAAb,CAAuB,SAAvB,GAAmC,UAAU,OAAV,EAAmB,KAAnB,EAA0B,WAA1B,EAAuC,OAAvC,EAAgD;AACjF,MAAM,SAAS,KAAK,oBAAL,CAA0B,OAA1B,EAAmC,KAAnC,EAA0C,WAA1C,EAAuD,OAAvD,CAAf;;AAEA,MAAI,KAAK,OAAL,CAAa,aAAjB,EAAgC;AAC9B,WAAO,KAAK,OAAL,CAAa,aAAb,CAA2B,OAA3B,EAAoC,KAApC,EAA2C,MAA3C,EAAmD,IAAnD,EAAyD,OAAzD,EAAkE,WAAlE,CAAP;AACD;;AAED,SAAO,MAAP;AACD,CARD;;AAUA;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4BA,aAAa,SAAb,CAAuB,aAAvB,GAAuC,UAAU,OAAV,EAAmB;AACxD,MAAI,MAAM,EAAN,CAAS,QAAT,CAAkB,OAAlB,CAAJ,EAAgC;AAC9B,SAAK,OAAL,CAAa,aAAb,GAA6B,OAA7B;;AAEA,WAAO,IAAP;AACD;;AAED,MAAI,YAAY,IAAhB,EAAsB;AACpB,WAAO,KAAK,OAAL,CAAa,aAApB;;AAEA,WAAO,IAAP;AACD;;AAED,SAAO,KAAK,OAAL,CAAa,aAApB;AACD,CAdD;;AAgBA;;;;;;;;;;AAUA,aAAa,SAAb,CAAuB,WAAvB,GAAqC,UAAU,QAAV,EAAoB;AACvD,MAAI,MAAM,EAAN,CAAS,IAAT,CAAc,QAAd,CAAJ,EAA6B;AAC3B,SAAK,OAAL,CAAa,WAAb,GAA2B,QAA3B;;AAEA,WAAO,IAAP;AACD;;AAED,MAAI,aAAa,IAAjB,EAAuB;AACrB,WAAO,KAAK,OAAL,CAAa,WAApB;;AAEA,WAAO,IAAP;AACD;;AAED,SAAO,KAAK,OAAL,CAAa,WAApB;AACD,CAdD;;AAgBA,aAAa,SAAb,CAAuB,oBAAvB,GAA8C,UAAU,OAAV,EAAmB,KAAnB,EAA0B,WAA1B,EAAuC,OAAvC,EAAgD;AAC5F,MAAM,OAAO,KAAK,OAAL,CAAa,OAAb,CAAb;AACA,MAAM,UAAU,MAAM,OAAN,IAAkB;AAChC,OAAG,CAD6B;AAEhC,OAAG,CAF6B;AAGhC,OAAG,CAH6B;AAIhC,OAAG;AAJ6B,GAAD,CAK9B,MAAM,MALwB,CAAjC;AAMA,MAAI,SAAS,IAAb;;AAEA,uBAAyB,QAAQ,KAAjC,kHAAwC;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,QAA7B,UAA6B;;AACtC;AACA,QAAI,YAAY,aAAZ,IACG,YAAY,KADf,IAEG,CAAC,UAAU,KAAK,OAAL,CAAa,UAAb,EAAyB,YAApC,MAAsD,CAF7D,EAEgE;AAC9D;AACD;;AAED,aAAS,QAAQ,UAAR,EAAoB,OAApB,CAA4B,OAA5B,EAAqC,KAArC,EAA4C,IAA5C,EAAkD,OAAlD,EAA2D,WAA3D,EAAwE,IAAxE,CAAT;;AAEA,QAAI,MAAJ,EAAY;AACV,aAAO,MAAP;AACD;AACF;AACF,CAxBD;;AA0BA,SAAS,sBAAT,CAAiC,YAAjC,EAA+C,OAA/C,EAAwD,MAAxD,EAAgE;AAC9D,MAAM,UAAU,aAAa,OAA7B;AACA,MAAM,aAAa,QAAQ,OAAO,IAAf,EAAqB,GAAxC;AACA,MAAM,gBAAgB,QAAQ,OAAO,IAAf,EAAqB,aAA3C;AACA,MAAI,qBAAqB,CAAzB;AACA,MAAI,cAAc,CAAlB;AACA,MAAI,qBAAqB,CAAzB;;AAEA;AACA,MAAI,EAAE,cAAc,aAAd,IAA+B,UAAU,eAA3C,CAAJ,EAAiE;AAAE;AAAS;;AAE5E,OAAK,IAAI,IAAI,CAAR,EAAW,MAAM,MAAM,YAAN,CAAmB,MAAzC,EAAiD,IAAI,GAArD,EAA0D,GAA1D,EAA+D;AAC7D,QAAM,cAAc,MAAM,YAAN,CAAmB,CAAnB,CAApB;AACA,QAAM,cAAc,YAAY,QAAZ,CAAqB,IAAzC;;AAEA,QAAI,CAAC,YAAY,WAAZ,EAAL,EAAgC;AAAE;AAAW;;AAE7C;;AAEA,QAAI,sBAAsB,UAAU,eAApC,EAAqD;AACnD,aAAO,KAAP;AACD;;AAED,QAAI,YAAY,MAAZ,KAAuB,YAA3B,EAAyC;AAAE;AAAW;;AAEtD,mBAAgB,gBAAgB,OAAO,IAAxB,GAA8B,CAA7C;;AAEA,QAAI,eAAe,UAAnB,EAA+B;AAC7B,aAAO,KAAP;AACD;;AAED,QAAI,YAAY,OAAZ,KAAwB,OAA5B,EAAqC;AACnC;;AAEA,UAAI,gBAAgB,OAAO,IAAvB,IAA+B,sBAAsB,aAAzD,EAAwE;AACtE,eAAO,KAAP;AACD;AACF;AACF;;AAED,SAAO,UAAU,eAAV,GAA4B,CAAnC;AACD;;AAED;;;;;;;;;;;;AAYA,SAAS,eAAT,GAA2B,UAAU,QAAV,EAAoB;AAC7C,MAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,QAAhB,CAAJ,EAA+B;AAC7B,cAAU,eAAV,GAA4B,QAA5B;;AAEA,WAAO,IAAP;AACD;;AAED,SAAO,UAAU,eAAjB;AACD,CARD;;AAUA,aAAa,eAAb,CAA6B,IAA7B,CAAkC,aAAlC;AACA,aAAa,eAAb,CAA6B,IAA7B,CAAkC,eAAlC;AACA,aAAa,eAAb,CAA6B,IAA7B,CAAkC,YAAlC;AACA,aAAa,eAAb,CAA6B,IAA7B,CAAkC,WAAlC;;AAEA,eAAe,IAAf,CAAoB,aAApB,GAAoC,IAApC;AACA,eAAe,IAAf,CAAoB,WAApB,GAAkC,IAAlC;;AAEA,MAAM,MAAN,CAAa,eAAe,SAA5B,EAAuC,UAAU,QAAV,CAAmB,SAA1D;;AAEA,OAAO,OAAP,GAAiB,SAAjB;;;;;ACnXA,IAAM,YAAc,QAAQ,QAAR,CAApB;AACA,IAAM,cAAc,QAAQ,gBAAR,CAApB;;AAEA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,KAAvB,EAA8B,UAAU,WAAV,EAAuB;AACnD,cAAY,UAAZ,GAAyB,IAAzB;AACD,CAFD;;AAIA,UAAU,OAAV,CAAkB,EAAlB,CAAqB,UAArB,EAAiC,gBAA2B;AAAA,MAAf,WAAe,QAAf,WAAe;;AAC1D,MAAM,aAAa,YAAY,QAAZ,CAAqB,IAAxC;;AAEA,MAAI,CAAC,UAAL,EAAiB;AAAE;AAAS;;AAE5B,MAAM,QAAQ,YAAY,MAAZ,CAAmB,OAAnB,CAA2B,UAA3B,EAAuC,KAArD;;AAEA,MAAI,QAAQ,CAAZ,EAAe;AACb,gBAAY,UAAZ,GAAyB,WAAW,YAAM;AACxC,kBAAY,KAAZ,CAAkB,YAAY,QAA9B,EAAwC,YAAY,MAApD,EAA4D,YAAY,OAAxE;AACD,KAFwB,EAEtB,KAFsB,CAAzB;AAGD;AACF,CAZD;;AAcA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,MAAvB,EAA+B,iBAAsC;AAAA,MAA1B,WAA0B,SAA1B,WAA0B;AAAA,MAAb,SAAa,SAAb,SAAa;;AACnE,MAAI,YAAY,eAAZ,IAA+B,CAAC,SAApC,EAA+C;AAC7C,iBAAa,YAAY,UAAzB;AACD;AACF,CAJD;;AAMA;AACA,UAAU,OAAV,CAAkB,EAAlB,CAAqB,cAArB,EAAqC,iBAA2B;AAAA,MAAf,WAAe,SAAf,WAAe;;AAC9D,MAAM,aAAa,YAAY,QAAZ,CAAqB,IAAxC;;AAEA,MAAI,CAAC,UAAL,EAAiB;AAAE;AAAS;;AAE5B,MAAM,QAAQ,YAAY,MAAZ,CAAmB,OAAnB,CAA2B,UAA3B,EAAuC,KAArD;;AAEA,MAAI,QAAQ,CAAZ,EAAe;AACb,gBAAY,QAAZ,CAAqB,IAArB,GAA4B,IAA5B;AACD;AACF,CAVD;;;;;AC5BA,IAAM,YAAY,QAAQ,QAAR,CAAlB;AACA,IAAM,QAAY,QAAQ,UAAR,CAAlB;AACA,IAAM,UAAY,QAAQ,kBAAR,CAAlB;AACA,IAAM,KAAY,QAAQ,aAAR,CAAlB;;eAEwC,QAAQ,mBAAR,C;IAAhC,e,YAAA,e;IAAiB,U,YAAA,U;;AAEzB,UAAU,iBAAV,CAA4B,QAAQ,iBAAR,CAA5B;;AAEA,UAAU,OAAV,CAAkB,EAAlB,CAAqB,cAArB,EAAsC,gBAAgD;AAAA,MAApC,WAAoC,QAApC,WAAoC;AAAA,MAAvB,WAAuB,QAAvB,WAAuB;AAAA,MAAV,EAAU,QAAV,EAAU;AAAA,MAAN,EAAM,QAAN,EAAM;;AACpF,MAAI,YAAY,QAAZ,CAAqB,IAArB,KAA8B,MAAlC,EAA0C;AAAE;AAAS;;AAErD;AACA,MAAM,OAAO,KAAK,GAAL,CAAS,EAAT,CAAb;AACA,MAAM,OAAO,KAAK,GAAL,CAAS,EAAT,CAAb;AACA,MAAM,UAAU,YAAY,MAAZ,CAAmB,OAAnB,CAA2B,IAA3C;AACA,MAAM,YAAY,QAAQ,SAA1B;AACA,MAAM,cAAe,OAAO,IAAP,GAAc,GAAd,GAAoB,OAAO,IAAP,GAAc,GAAd,GAAoB,IAA7D;;AAEA,cAAY,QAAZ,CAAqB,IAArB,GAA4B,QAAQ,QAAR,KAAqB,OAArB,GACxB,YAAY,CAAZ,CADwB,CACT;AADS,IAExB,QAAQ,QAFZ;;AAIA;AACA,MAAI,gBAAgB,IAAhB,IAAwB,cAAc,IAAtC,IAA8C,cAAc,WAAhE,EAA6E;AAC3E;AACA,gBAAY,QAAZ,CAAqB,IAArB,GAA4B,IAA5B;;AAEA;;AAEA,QAAI,CAAC,YAAY,QAAZ,CAAqB,IAA1B,EAAgC;;AAE9B,UAAI,UAAU,WAAd;;AAEA,UAAM,eAAe,SAAf,YAAe,CAAU,YAAV,EAAwB,QAAxB,EAAkC,OAAlC,EAA2C;AAC9D,YAAM,WAAW,QAAQ,0BAAR,GACX,QAAQ,gBAAR,CAAyB,QAAzB,CADW,GAEX,SAFN;;AAIA,YAAI,iBAAiB,YAAY,MAAjC,EAAyC;AAAE;AAAS;;AAEpD,YAAI,CAAC,QAAQ,WAAT,IACG,CAAC,aAAa,eAAb,CAA6B,OAA7B,EAAsC,OAAtC,EAA+C,WAA/C,CADJ,IAEG,gBAAgB,OAAhB,EAAyB,QAAzB,EAAmC,QAAnC,CAFP,EAEqD;;AAEnD,cAAM,UAAS,aAAa,SAAb,CAAuB,YAAY,WAAnC,EACuB,YAAY,SADnC,EAEuB,WAFvB,EAGuB,OAHvB,CAAf;;AAKA,cAAI,WACG,QAAO,IAAP,KAAgB,MADnB,IAEG,eAAe,WAAf,EAA4B,YAA5B,CAFH,IAGG,UAAU,cAAV,CAAyB,OAAzB,EAAiC,YAAjC,EAA+C,OAA/C,EAAwD,WAAxD,CAHP,EAG6E;;AAE3E,mBAAO,YAAP;AACD;AACF;AACF,OAxBD;;AA0BA,UAAI,SAAS,IAAb;;AAEA;AACA,aAAO,GAAG,OAAH,CAAW,OAAX,CAAP,EAA4B;AAC1B,YAAM,sBAAsB,MAAM,aAAN,CAAoB,GAApB,CAAwB,OAAxB,CAA5B;;AAEA,YAAI,uBACG,wBAAwB,YAAY,MADvC,IAEG,CAAC,oBAAoB,OAApB,CAA4B,IAA5B,CAAiC,WAFzC,EAEsD;;AAEpD,mBAAS,oBAAoB,SAApB,CAA8B,YAAY,WAA1C,EAAuD,YAAY,SAAnE,EAA8E,WAA9E,EAA2F,OAA3F,CAAT;AACD;AACD,YAAI,UACG,OAAO,IAAP,KAAgB,MADnB,IAEG,eAAe,WAAf,EAA4B,mBAA5B,CAFP,EAEyD;;AAEvD,sBAAY,QAAZ,CAAqB,IAArB,GAA4B,MAA5B;AACA,sBAAY,MAAZ,GAAqB,mBAArB;AACA,sBAAY,OAAZ,GAAsB,OAAtB;AACA;AACD;;AAED,YAAM,uBAAuB,MAAM,aAAN,CAAoB,eAApB,CAAoC,YAApC,EAAkD,OAAlD,CAA7B;;AAEA,YAAI,oBAAJ,EAA0B;AACxB,sBAAY,QAAZ,CAAqB,IAArB,GAA4B,MAA5B;AACA,sBAAY,MAAZ,GAAqB,oBAArB;AACA,sBAAY,OAAZ,GAAsB,OAAtB;AACA;AACD;;AAED,kBAAU,WAAW,OAAX,CAAV;AACD;AACF;AACF;AACF,CAtFD;;AAwFA,SAAS,cAAT,CAAyB,SAAzB,EAAoC,YAApC,EAAkD;AAChD,MAAI,CAAC,YAAL,EAAmB;AAAE,WAAO,KAAP;AAAe;;AAEpC,MAAM,WAAW,aAAa,OAAb,CAAqB,IAArB,CAA0B,SAA3C;;AAEA,SAAQ,cAAc,IAAd,IAAsB,aAAa,IAAnC,IAA2C,aAAa,SAAhE;AACD;;;;;ACvGD,QAAQ,QAAR,EAAkB,iBAAlB,CAAoC,QAAQ,oBAAR,CAApC;;;;;ACAA,QAAQ,QAAR,EAAkB,iBAAlB,CAAoC,QAAQ,mBAAR,CAApC;;;;;ACAA,OAAO,OAAP,GAAiB;AACf,QAAM;AACJ,YAAgB,IADZ;AAEJ,oBAAgB,MAFZ;AAGJ,iBAAgB;AAHZ,GADS;;AAOf,aAAW;AACT,YAAQ,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EADC;;AAGT;AACA;AACA,kBAAc,CALL;;AAOT,aAAS;AACP,eAAmB,KADZ;AAEP,kBAAmB,EAFZ,EAEmB;AAC1B,gBAAmB,GAHZ,EAGmB;AAC1B,gBAAmB,EAJZ,EAImB;AAC1B,mBAAmB,IALZ,EAKmB;AAC1B,yBAAmB,GANZ,CAMmB;AANnB;AAPA;AAPI,CAAjB;;;;;ACAA;;AAEA;AACA,QAAQ,kBAAR;;AAEA;AACA,QAAQ,WAAR;;AAEA;AACA,QAAQ,kBAAR;AACA,QAAQ,sBAAR;;AAEA;AACA,QAAQ,sBAAR;AACA,QAAQ,4BAAR;AACA,QAAQ,qCAAR;;AAEA;AACA,QAAQ,mBAAR;;AAEA;AACA,QAAQ,mBAAR;AACA,QAAQ,kBAAR;AACA,QAAQ,gBAAR;AACA,QAAQ,gBAAR;;AAEA;AACA,QAAQ,sBAAR;AACA,QAAQ,2BAAR;AACA,QAAQ,0BAAR;;AAEA;AACA,QAAQ,qBAAR;AACA,QAAQ,oBAAR;AACA,QAAQ,kBAAR;;AAEA;AACA,QAAQ,iCAAR;;AAEA;AACA,QAAQ,cAAR;;AAEA;AACA,OAAO,OAAP,GAAiB,QAAQ,YAAR,CAAjB;;;;;AC3CA,IAAM,gBAAiB,QAAQ,iBAAR,CAAvB;AACA,IAAM,cAAiB,QAAQ,eAAR,CAAvB;AACA,IAAM,YAAiB,QAAQ,aAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,SAAR,CAAvB;AACA,IAAM,iBAAiB,QAAQ,aAAR,CAAvB;;AAEA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,KAAvB,EAA8B,UAAU,WAAV,EAAuB;AACnD,cAAY,aAAZ,GAA4B;AAC1B,YAAa,KADa;AAE1B,eAAa,KAFa;AAG1B,iBAAa,KAHa;;AAK1B,gBAAY,IALc;AAM1B,cAAY,EANc;;AAQ1B,QAAI,CARsB,EAQnB,IAAI,CARe;AAS1B,QAAI,CATsB,EASnB,IAAI,CATe;;AAW1B,QAAI,CAXsB;AAY1B,SAAK,CAZqB,EAYlB,KAAK,CAZa;AAa1B,cAAU,CAbgB;;AAe1B,eAAW,CAfe;AAgB1B,eAAW,CAhBe;AAiB1B,OAAK;AAjBqB,GAA5B;;AAoBA,cAAY,iBAAZ,GAAkC;AAAA,WAAM,aAAe,KAAf,CAAqB,WAArB,CAAN;AAAA,GAAlC;AACA,cAAY,mBAAZ,GAAkC;AAAA,WAAM,eAAe,KAAf,CAAqB,WAArB,CAAN;AAAA,GAAlC;AACD,CAvBD;;AAyBA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,MAAvB,EAA+B,gBAAwD;AAAA,MAA5C,WAA4C,QAA5C,WAA4C;AAAA,MAA/B,KAA+B,QAA/B,KAA+B;AAAA,MAAxB,OAAwB,QAAxB,OAAwB;AAAA,MAAf,WAAe,QAAf,WAAe;;AACrF,MAAM,SAAS,YAAY,aAA3B;;AAEA;AACA,MAAI,OAAO,MAAX,EAAmB;AACjB,QAAI,UAAU,WAAd;;AAEA;AACA,WAAO,MAAM,EAAN,CAAS,OAAT,CAAiB,OAAjB,CAAP,EAAkC;;AAEhC;AACA,UAAI,YAAY,YAAY,OAA5B,EAAqC;AACnC;AACA,uBAAe,MAAf,CAAsB,OAAO,CAA7B;AACA,eAAO,MAAP,GAAgB,KAAhB;AACA,oBAAY,UAAZ,GAAyB,IAAzB;;AAEA;AACA,oBAAY,aAAZ,CAA0B,OAA1B;AACA,cAAM,SAAN,CAAgB,YAAY,SAA5B,EAAuC,YAAY,QAAnD;;AAEA;AACA,YAAM,YAAY,EAAE,wBAAF,EAAlB;AACA,oBAAY,OAAZ,CAAoB,IAApB,CAAyB,oBAAzB,EAA+C,SAA/C;AACA,oBAAY,OAAZ,CAAoB,IAApB,CAAyB,eAAzB,EAA+C,SAA/C;;AAEA;AACA,YAAM,cAAc,IAAI,aAAJ,CAAkB,WAAlB,EACkB,KADlB,EAEkB,YAAY,QAAZ,CAAqB,IAFvC,EAGkB,eAHlB,EAIkB,YAAY,OAJ9B,CAApB;;AAMA,oBAAY,MAAZ,CAAmB,IAAnB,CAAwB,WAAxB;AACA,oBAAY,SAAZ,GAAwB,WAAxB;AACA,kBAAU,aAAV,CAAwB,YAAY,gBAApC;;AAEA,cAAM,UAAN,CAAiB,YAAY,UAA7B,EAAyC,YAAY,SAArD;AACA;AACD;;AAED,gBAAU,MAAM,UAAN,CAAiB,OAAjB,CAAV;AACD;AACF;AACF,CA5CD;;AA8CA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,IAAvB,EAA6B,iBAAkC;AAAA,MAAtB,WAAsB,SAAtB,WAAsB;AAAA,MAAT,KAAS,SAAT,KAAS;;AAC7D,MAAM,SAAS,YAAY,aAA3B;;AAEA,MAAI,CAAC,YAAY,WAAZ,EAAD,IAA8B,OAAO,MAAzC,EAAiD;AAAE;AAAS;;AAE5D,MAAM,SAAS,YAAY,MAA3B;AACA,MAAM,UAAU,UAAU,OAAO,OAAjC;AACA,MAAM,iBAAiB,WAAW,YAAY,QAAZ,CAAqB,IAAhC,IAAwC,QAAQ,YAAY,QAAZ,CAAqB,IAA7B,EAAmC,OAAlG;;AAEA,MAAM,MAAM,IAAI,IAAJ,GAAW,OAAX,EAAZ;AACA,MAAM,WAAW,EAAjB;AACA,MAAM,OAAO,MAAM,MAAN,CAAa,EAAb,EAAiB,YAAY,SAAZ,CAAsB,IAAvC,CAAb;AACA,MAAM,eAAe,YAAY,YAAZ,CAAyB,MAAzB,CAAgC,KAArD;;AAEA,MAAI,YAAY,KAAhB;AACA,MAAI,uBAAJ;;AAEA;AACA,MAAM,kBAAmB,kBAAkB,eAAe,OAAjC,IACH,YAAY,QAAZ,CAAqB,IAArB,KAA8B,SAD3B,IAEH,UAAU,OAAO,UAFvC;;AAIA,MAAM,UAAW,mBACX,MAAM,YAAY,SAAZ,CAAsB,SAA7B,GAA0C,EAD9B,IAEZ,eAAe,eAAe,QAFlB,IAGZ,eAAe,eAAe,QAHnC;;AAKA,MAAM,cAAc;AAClB,4BADkB;AAElB,gBAAY,IAFM;AAGlB,sBAHkB;AAIlB,YAAQ,IAJU;AAKlB,oBAAgB;AALE,GAApB;;AAQA;AACA,MAAI,mBAAmB,CAAC,OAAxB,EAAiC;AAC/B,cAAU,aAAV,CAAwB,QAAxB;;AAEA,qBAAiB,UAAU,MAAV,CAAiB,WAAjB,CAAjB;;AAEA,QAAI,eAAe,UAAf,IAA6B,eAAe,MAAhD,EAAwD;AACtD,kBAAY,IAAZ;AACD;AACF;;AAED,MAAI,EAAE,WAAW,SAAb,CAAJ,EAA6B;AAAE;AAAS;;AAExC,QAAM,UAAN,CAAiB,OAAO,QAAxB,EAAkC,YAAY,SAA9C;;AAEA,cAAY,QAAZ,CAAqB,CAArB,IAA0B,OAAO,UAAP,GACxB,IAAI,aAAJ,CAAkB,WAAlB,EAA+B,KAA/B,EAAsC,YAAY,QAAZ,CAAqB,IAA3D,EAAiE,cAAjE,EAAiF,YAAY,OAA7F,CADF;;AAGA,SAAO,EAAP,GAAY,GAAZ;;AAEA,SAAO,MAAP,GAAgB,IAAhB;AACA,SAAO,WAAP,GAAqB,eAAe,WAApC;AACA,cAAY,UAAZ,GAAyB,MAAzB;;AAEA,SAAO,IAAP,CAAY,OAAO,UAAnB;;AAEA,MAAI,OAAJ,EAAa;AACX,WAAO,GAAP,GAAa,YAAY,YAAZ,CAAyB,MAAzB,CAAgC,EAA7C;AACA,WAAO,GAAP,GAAa,YAAY,YAAZ,CAAyB,MAAzB,CAAgC,EAA7C;AACA,WAAO,EAAP,GAAY,YAAZ;;AAEA,gBAAY,WAAZ,EAAyB,MAAzB;;AAEA,UAAM,MAAN,CAAa,IAAb,EAAmB,YAAY,SAAZ,CAAsB,IAAzC;;AAEA,SAAK,CAAL,IAAU,OAAO,EAAjB;AACA,SAAK,CAAL,IAAU,OAAO,EAAjB;;AAEA,cAAU,aAAV,CAAwB,QAAxB;;AAEA,qBAAiB,UAAU,MAAV,CAAiB,WAAjB,CAAjB;;AAEA,WAAO,UAAP,IAAqB,eAAe,EAApC;AACA,WAAO,UAAP,IAAqB,eAAe,EAApC;;AAEA,WAAO,CAAP,GAAW,eAAe,OAAf,CAAuB,YAAY,iBAAnC,CAAX;AACD,GApBD,MAqBK;AACH,WAAO,SAAP,GAAmB,IAAnB;AACA,WAAO,EAAP,GAAY,eAAe,EAA3B;AACA,WAAO,EAAP,GAAY,eAAe,EAA3B;;AAEA,WAAO,EAAP,GAAY,OAAO,EAAP,GAAY,CAAxB;;AAEA,WAAO,CAAP,GAAW,eAAe,OAAf,CAAuB,YAAY,mBAAnC,CAAX;AACD;AACF,CA3FD;;AA6FA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,aAAvB,EAAsC,iBAA2B;AAAA,MAAf,WAAe,SAAf,WAAe;;AAC/D,MAAM,SAAS,YAAY,aAA3B;;AAEA,MAAI,OAAO,MAAX,EAAmB;AACjB,mBAAe,MAAf,CAAsB,OAAO,CAA7B;AACA,WAAO,MAAP,GAAgB,KAAhB;AACA,gBAAY,UAAZ,GAAyB,IAAzB;AACD;AACF,CARD;;AAUA,SAAS,WAAT,CAAsB,WAAtB,EAAmC,MAAnC,EAA2C;AACzC,MAAM,iBAAiB,YAAY,MAAZ,CAAmB,OAAnB,CAA2B,YAAY,QAAZ,CAAqB,IAAhD,EAAsD,OAA7E;AACA,MAAM,SAAS,eAAe,UAA9B;AACA,MAAM,aAAa,CAAC,KAAK,GAAL,CAAS,eAAe,QAAf,GAA0B,OAAO,EAA1C,CAAD,GAAiD,MAApE;;AAEA,SAAO,EAAP,GAAY,YAAY,SAAZ,CAAsB,KAAlC;AACA,SAAO,EAAP,GAAY,YAAY,SAAZ,CAAsB,KAAlC;AACA,SAAO,EAAP,GAAY,OAAO,UAAP,CAAkB,SAAlB,GAA8B,IAA1C;AACA,SAAO,EAAP,GAAY,OAAO,EAAP,GAAY,CAAxB;;AAEA,SAAO,UAAP,GAAoB,OAAO,EAAP,GAAY,CAAC,OAAO,GAAP,GAAa,UAAd,IAA4B,MAA5D;AACA,SAAO,UAAP,GAAoB,OAAO,EAAP,GAAY,CAAC,OAAO,GAAP,GAAa,UAAd,IAA4B,MAA5D;AACA,SAAO,EAAP,GAAY,UAAZ;;AAEA,SAAO,SAAP,GAAmB,SAAS,OAAO,EAAnC;AACA,SAAO,SAAP,GAAmB,IAAI,eAAe,QAAf,GAA0B,OAAO,EAAxD;AACD;;AAED,SAAS,YAAT,GAAyB;AACvB,sBAAoB,IAApB;AACA,QAAM,cAAN,CAAqB,KAAK,YAA1B,EAAwC,KAAK,UAA7C,EAAyD,KAAK,SAA9D;;AAEA,MAAM,SAAS,KAAK,aAApB;AACA,MAAM,UAAU,KAAK,MAAL,CAAY,OAAZ,CAAoB,KAAK,QAAL,CAAc,IAAlC,EAAwC,OAAxD;AACA,MAAM,SAAS,QAAQ,UAAvB;AACA,MAAM,IAAI,IAAI,IAAJ,GAAW,OAAX,KAAuB,IAAvB,GAA8B,OAAO,EAA/C;;AAEA,MAAI,IAAI,OAAO,EAAf,EAAmB;;AAEjB,QAAM,WAAY,IAAI,CAAC,KAAK,GAAL,CAAS,CAAC,MAAD,GAAU,CAAnB,IAAwB,OAAO,SAAhC,IAA6C,OAAO,SAA1E;;AAEA,QAAI,OAAO,UAAP,KAAsB,OAAO,EAA7B,IAAmC,OAAO,UAAP,KAAsB,OAAO,EAApE,EAAwE;AACtE,aAAO,EAAP,GAAY,OAAO,EAAP,GAAY,QAAxB;AACA,aAAO,EAAP,GAAY,OAAO,EAAP,GAAY,QAAxB;AACD,KAHD,MAIK;AACH,UAAM,YAAY,MAAM,sBAAN,CAA6B,CAA7B,EAAgC,CAAhC,EAC6B,OAAO,EADpC,EAE6B,OAAO,EAFpC,EAG6B,OAAO,UAHpC,EAI6B,OAAO,UAJpC,EAK6B,QAL7B,CAAlB;;AAOA,aAAO,EAAP,GAAY,UAAU,CAAtB;AACA,aAAO,EAAP,GAAY,UAAU,CAAtB;AACD;;AAED,SAAK,MAAL;;AAEA,WAAO,CAAP,GAAW,eAAe,OAAf,CAAuB,KAAK,iBAA5B,CAAX;AACD,GAvBD,MAwBK;AACH,WAAO,EAAP,GAAY,OAAO,UAAnB;AACA,WAAO,EAAP,GAAY,OAAO,UAAnB;;AAEA,SAAK,MAAL;AACA,SAAK,GAAL,CAAS,OAAO,UAAhB;AACA,WAAO,MAAP,GAAgB,KAAhB;AACA,SAAK,UAAL,GAAkB,IAAlB;AACD;;AAED,QAAM,UAAN,CAAiB,KAAK,UAAtB,EAAkC,KAAK,SAAvC;AACD;;AAED,SAAS,cAAT,GAA2B;AACzB,sBAAoB,IAApB;;AAEA,MAAM,SAAS,KAAK,aAApB;AACA,MAAM,IAAI,IAAI,IAAJ,GAAW,OAAX,KAAuB,OAAO,EAAxC;AACA,MAAM,WAAW,KAAK,MAAL,CAAY,OAAZ,CAAoB,KAAK,QAAL,CAAc,IAAlC,EAAwC,OAAxC,CAAgD,iBAAjE;;AAEA,MAAI,IAAI,QAAR,EAAkB;AAChB,WAAO,EAAP,GAAY,MAAM,WAAN,CAAkB,CAAlB,EAAqB,CAArB,EAAwB,OAAO,EAA/B,EAAmC,QAAnC,CAAZ;AACA,WAAO,EAAP,GAAY,MAAM,WAAN,CAAkB,CAAlB,EAAqB,CAArB,EAAwB,OAAO,EAA/B,EAAmC,QAAnC,CAAZ;;AAEA,SAAK,WAAL,CAAiB,OAAO,UAAxB,EAAoC,OAAO,UAA3C;;AAEA,WAAO,CAAP,GAAW,eAAe,OAAf,CAAuB,KAAK,mBAA5B,CAAX;AACD,GAPD,MAQK;AACH,WAAO,EAAP,GAAY,OAAO,EAAnB;AACA,WAAO,EAAP,GAAY,OAAO,EAAnB;;AAEA,SAAK,WAAL,CAAiB,OAAO,UAAxB,EAAoC,OAAO,UAA3C;AACA,SAAK,GAAL,CAAS,OAAO,UAAhB;;AAEA,WAAO,SAAP,GACE,OAAO,MAAP,GAAgB,KADlB;AAEA,SAAK,UAAL,GAAkB,IAAlB;AACD;AACF;;AAED,SAAS,mBAAT,CAA8B,WAA9B,EAA2C;AACzC,MAAM,SAAS,YAAY,aAA3B;;AAEA;AACA,MAAI,CAAC,OAAO,MAAZ,EAAoB;AAAE;AAAS;;AAE/B,MAAM,SAAW,OAAO,QAAP,CAAgB,IAAjC;AACA,MAAM,WAAW,OAAO,QAAP,CAAgB,MAAjC;;AAEA,QAAM,SAAN,CAAgB,YAAY,SAA5B,EAAuC,CAAE;AACvC,WAAS,OAAO,CAAP,GAAa,OAAO,EADU;AAEvC,WAAS,OAAO,CAAP,GAAa,OAAO,EAFU;AAGvC,aAAS,SAAS,CAAT,GAAa,OAAO,EAHU;AAIvC,aAAS,SAAS,CAAT,GAAa,OAAO;AAJU,GAAF,CAAvC;AAMD;;;;;AC/RD,IAAM,UAAe,QAAQ,iBAAR,CAArB;AACA,IAAM,SAAe,QAAQ,gBAAR,CAArB;AACA,IAAM,QAAe,QAAQ,SAAR,CAArB;AACA,IAAM,QAAe,QAAQ,SAAR,CAArB;AACA,IAAM,eAAe,QAAQ,gBAAR,CAArB;AACA,IAAM,cAAe,QAAQ,eAAR,CAArB;;AAEA,IAAM,eAAe,EAArB;;AAEA;;;;;;;;;;;;;;;;;;;;;;;;AAwBA,SAAS,QAAT,CAAmB,OAAnB,EAA4B,OAA5B,EAAqC;AACnC,MAAI,eAAe,MAAM,aAAN,CAAoB,GAApB,CAAwB,OAAxB,EAAiC,OAAjC,CAAnB;;AAEA,MAAI,CAAC,YAAL,EAAmB;AACjB,mBAAe,IAAI,YAAJ,CAAiB,OAAjB,EAA0B,OAA1B,CAAf;AACA,iBAAa,MAAb,CAAoB,MAApB,GAA6B,YAA7B;AACD;;AAED,SAAO,YAAP;AACD;;AAED;;;;;;;;AAQA,SAAS,KAAT,GAAiB,UAAU,OAAV,EAAmB,OAAnB,EAA4B;AAC3C,SAAO,MAAM,aAAN,CAAoB,cAApB,CAAmC,OAAnC,EAA4C,WAAW,QAAQ,OAA/D,MAA4E,CAAC,CAApF;AACD,CAFD;;AAIA;;;;;;;;;;;;AAYA,SAAS,EAAT,GAAc,UAAU,IAAV,EAAgB,QAAhB,EAA0B,OAA1B,EAAmC;AAC/C,MAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,IAAhB,KAAyB,KAAK,MAAL,CAAY,GAAZ,MAAqB,CAAC,CAAnD,EAAsD;AACpD,WAAO,KAAK,IAAL,GAAY,KAAZ,CAAkB,IAAlB,CAAP;AACD;;AAED,MAAI,MAAM,EAAN,CAAS,KAAT,CAAe,IAAf,CAAJ,EAA0B;AACxB,yBAAwB,IAAxB,kHAA8B;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAAnB,SAAmB;;AAC5B,eAAS,EAAT,CAAY,SAAZ,EAAuB,QAAvB,EAAiC,OAAjC;AACD;;AAED,WAAO,QAAP;AACD;;AAED,MAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,IAAhB,CAAJ,EAA2B;AACzB,SAAK,IAAM,IAAX,IAAmB,IAAnB,EAAyB;AACvB,eAAS,EAAT,CAAY,IAAZ,EAAkB,KAAK,IAAL,CAAlB,EAA8B,QAA9B;AACD;;AAED,WAAO,QAAP;AACD;;AAED;AACA,MAAI,MAAM,QAAN,CAAe,aAAa,UAA5B,EAAwC,IAAxC,CAAJ,EAAmD;AACjD;AACA,QAAI,CAAC,aAAa,IAAb,CAAL,EAAyB;AACvB,mBAAa,IAAb,IAAqB,CAAC,QAAD,CAArB;AACD,KAFD,MAGK;AACH,mBAAa,IAAb,EAAmB,IAAnB,CAAwB,QAAxB;AACD;AACF;AACD;AATA,OAUK;AACH,aAAO,GAAP,CAAW,MAAM,QAAjB,EAA2B,IAA3B,EAAiC,QAAjC,EAA2C,EAAE,gBAAF,EAA3C;AACD;;AAED,SAAO,QAAP;AACD,CArCD;;AAuCA;;;;;;;;;;;AAWA,SAAS,GAAT,GAAe,UAAU,IAAV,EAAgB,QAAhB,EAA0B,OAA1B,EAAmC;AAChD,MAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,IAAhB,KAAyB,KAAK,MAAL,CAAY,GAAZ,MAAqB,CAAC,CAAnD,EAAsD;AACpD,WAAO,KAAK,IAAL,GAAY,KAAZ,CAAkB,IAAlB,CAAP;AACD;;AAED,MAAI,MAAM,EAAN,CAAS,KAAT,CAAe,IAAf,CAAJ,EAA0B;AACxB,0BAAwB,IAAxB,yHAA8B;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAAnB,SAAmB;;AAC5B,eAAS,GAAT,CAAa,SAAb,EAAwB,QAAxB,EAAkC,OAAlC;AACD;;AAED,WAAO,QAAP;AACD;;AAED,MAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,IAAhB,CAAJ,EAA2B;AACzB,SAAK,IAAM,IAAX,IAAmB,IAAnB,EAAyB;AACvB,eAAS,GAAT,CAAa,IAAb,EAAmB,KAAK,IAAL,CAAnB,EAA+B,QAA/B;AACD;;AAED,WAAO,QAAP;AACD;;AAED,MAAI,CAAC,MAAM,QAAN,CAAe,aAAa,UAA5B,EAAwC,IAAxC,CAAL,EAAoD;AAClD,WAAO,MAAP,CAAc,MAAM,QAApB,EAA8B,IAA9B,EAAoC,QAApC,EAA8C,OAA9C;AACD,GAFD,MAGK;AACH,QAAI,cAAJ;;AAEA,QAAI,QAAQ,YAAR,IACG,CAAC,QAAQ,MAAM,OAAN,CAAc,aAAa,IAAb,CAAd,EAAkC,QAAlC,CAAT,MAA0D,CAAC,CADlE,EACqE;AACnE,mBAAa,IAAb,EAAmB,MAAnB,CAA0B,KAA1B,EAAiC,CAAjC;AACD;AACF;;AAED,SAAO,QAAP;AACD,CAlCD;;AAoCA;;;;;;;AAOA,SAAS,KAAT,GAAiB,YAAY;AAC3B,SAAO,KAAP;AACD,CAFD;;AAIA;AACA,SAAS,iBAAT,GAA8B,MAAM,cAApC;AACA,SAAS,YAAT,GAA8B,MAAM,SAApC;AACA,SAAS,gBAAT,GAA8B,MAAM,aAApC;AACA,SAAS,aAAT,GAA8B,MAAM,UAApC;;AAEA,SAAS,cAAT,GAAgC,MAAM,cAAtC;AACA,SAAS,oBAAT,GAAgC,MAAM,oBAAtC;AACA,SAAS,eAAT,GAAgC,MAAM,eAAtC;AACA,SAAS,OAAT,GAAgC,MAAM,OAAtC;;AAEA;;;;;;AAMA,SAAS,aAAT,GAAyB,YAAY;AACnC,SAAO,QAAQ,aAAf;AACD,CAFD;;AAIA;;;;;;AAMA,SAAS,oBAAT,GAAgC,YAAY;AAC1C,SAAO,QAAQ,oBAAf;AACD,CAFD;;AAIA;;;;;;;;;AASA,SAAS,IAAT,GAAgB,UAAU,KAAV,EAAiB;AAC/B,OAAK,IAAI,IAAI,MAAM,YAAN,CAAmB,MAAnB,GAA4B,CAAzC,EAA4C,KAAK,CAAjD,EAAoD,GAApD,EAAyD;AACvD,UAAM,YAAN,CAAmB,CAAnB,EAAsB,IAAtB,CAA2B,KAA3B;AACD;;AAED,SAAO,QAAP;AACD,CAND;;AAQA;;;;;;;;;AASA,SAAS,oBAAT,GAAgC,UAAU,QAAV,EAAoB;AAClD,MAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,QAAhB,CAAJ,EAA+B;AAC7B,gBAAY,oBAAZ,GAAmC,QAAnC;;AAEA,WAAO,IAAP;AACD;;AAED,SAAO,YAAY,oBAAnB;AACD,CARD;;AAUA,SAAS,WAAT,GAA0B,MAAM,WAAhC;AACA,SAAS,cAAT,GAA0B,MAAM,cAAhC;;AAEA,MAAM,QAAN,GAAiB,QAAjB;;AAEA,OAAO,OAAP,GAAiB,QAAjB;;;;;AC7OA,IAAM,eAAe,QAAQ,gBAAR,CAArB;AACA,IAAM,cAAe,QAAQ,eAAR,CAArB;AACA,IAAM,QAAe,QAAQ,SAAR,CAArB;AACA,IAAM,KAAe,QAAQ,YAAR,CAArB;AACA,IAAM,SAAe,QAAQ,gBAAR,CAArB;;eAE0C,QAAQ,kBAAR,C;IAAlC,Y,YAAA,Y;IAAc,e,YAAA,e;;AAEtB;;;;;;;;;;;;;;;AAaA,aAAa,SAAb,CAAuB,cAAvB,GAAwC,UAAU,QAAV,EAAoB;AAC1D,MAAI,wBAAwB,IAAxB,CAA6B,QAA7B,CAAJ,EAA4C;AAC1C,SAAK,OAAL,CAAa,cAAb,GAA8B,QAA9B;AACA,WAAO,IAAP;AACD;;AAED,MAAI,GAAG,IAAH,CAAQ,QAAR,CAAJ,EAAuB;AACrB,SAAK,OAAL,CAAa,cAAb,GAA8B,WAAU,QAAV,GAAqB,OAAnD;AACA,WAAO,IAAP;AACD;;AAED,SAAO,KAAK,OAAL,CAAa,cAApB;AACD,CAZD;;AAcA,aAAa,SAAb,CAAuB,sBAAvB,GAAgD,UAAU,KAAV,EAAiB;AAC/D,MAAM,UAAU,KAAK,OAAL,CAAa,cAA7B;;AAEA,MAAI,YAAY,OAAhB,EAAyB;AAAE;AAAS;;AAEpC,MAAI,YAAY,QAAhB,EAA0B;AACxB,UAAM,cAAN;AACA;AACD;;AAED;;AAEA;AACA;AACA,MAAI,OAAO,eAAX,EAA4B;AAC1B;AACD;;AAED;AACA,MAAI,uCAAuC,IAAvC,CAA4C,MAAM,IAAlD,CAAJ,EAA6D;AAC3D;AACD;;AAED;AACA,MAAI,GAAG,OAAH,CAAW,MAAM,MAAjB,KACG,gBAAgB,MAAM,MAAtB,EAA8B,uEAA9B,CADP,EAC+G;AAC7G;AACD;;AAED,QAAM,cAAN;AACD,CA9BD;;AAgCA,SAAS,kBAAT,OAAqD;AAAA,MAAtB,WAAsB,QAAtB,WAAsB;AAAA,MAAT,KAAS,QAAT,KAAS;;AACnD,MAAI,YAAY,MAAhB,EAAwB;AACtB,gBAAY,MAAZ,CAAmB,sBAAnB,CAA0C,KAA1C;AACD;AACF;;WAEyB,CAAC,MAAD,EAAS,MAAT,EAAiB,IAAjB,EAAuB,QAAvB,C;AAA1B,yCAA4D;AAAvD,MAAM,sBAAN;AACH,cAAY,OAAZ,CAAoB,EAApB,CAAuB,WAAvB,EAAoC,kBAApC;AACD;;AAED;AACA,YAAY,SAAZ,CAAsB,SAAtB,GAAkC,SAAS,iBAAT,CAA4B,KAA5B,EAAmC;AACnE,uBAA0B,MAAM,YAAhC,mHAA8C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,QAAnC,WAAmC;;;AAE5C,QAAI,YAAY,OAAZ,KACI,YAAY,OAAZ,KAAwB,MAAM,MAA9B,IACG,aAAa,YAAY,OAAzB,EAAkC,MAAM,MAAxC,CAFP,CAAJ,EAE6D;;AAE3D,kBAAY,MAAZ,CAAmB,sBAAnB,CAA0C,KAA1C;AACA;AACD;AACF;AACF,CAXD;;;;;AC9EA,IAAM,QAAgB,QAAQ,SAAR,CAAtB;AACA,IAAM,SAAgB,QAAQ,gBAAR,CAAtB;AACA,IAAM,UAAgB,QAAQ,iBAAR,CAAtB;AACA,IAAM,UAAgB,QAAQ,2BAAR,CAAtB;AACA,IAAM,gBAAgB,QAAQ,sBAAR,CAAtB;;eAEmB,QAAQ,gBAAR,C;IAAX,M,YAAA,M;;AAER,IAAM,WAAW,OAAO,SAAP,CAAiB,QAAlC;;AAEA,IAAI,CAAC,OAAO,KAAP,CAAa,OAAlB,EAA2B;AACzB,SAAO,KAAP,CAAa,OAAb,GAAuB,UAAU,GAAV,EAAe;AACpC,WAAO,SAAS,IAAT,CAAc,GAAd,MAAuB,gBAA9B;AACD,GAFD;AAGD;;AAED,IAAI,CAAC,OAAO,SAAP,CAAiB,IAAtB,EAA4B;AAC1B,SAAO,SAAP,CAAiB,IAAjB,GAAwB,YAAY;AAClC,WAAO,KAAK,OAAL,CAAa,oCAAb,EAAmD,EAAnD,CAAP;AACD,GAFD;AAGD;;AAED;AACA;AACA;AACA;AACA;AACA,SAAS,aAAT,CAAwB,KAAxB,EAA+B;AAC7B,MAAM,cAAc,MAAM,MAA1B;AACA,MAAM,cAAc,QAAQ,MAAR,CAAe,KAAf,EAAsB,MAAM,IAA5B,EAAkC,WAAlC,CAApB;;AAEA,MAAI,CAAC,WAAL,EAAkB;AAAE;AAAS;;AAE7B,MAAI,YAAY,OAAZ,IACG,MAAM,OAAN,KAAkB,YAAY,OAAZ,CAAoB,OADzC,IAEG,MAAM,OAAN,KAAkB,YAAY,OAAZ,CAAoB,OAFzC,IAGG,gBAAkB,YAAY,OAAZ,CAAoB,MAH7C,EAGqD;;AAEnD,gBAAY,WAAZ,CAAwB,CAAxB,IAA6B,WAA7B;AACA,gBAAY,SAAZ,CAAwB,CAAxB,IAA6B,IAAI,IAAJ,GAAW,OAAX,EAA7B;;AAEA,kBAAc,IAAd,CAAmB;AACjB,8BADiB;AAEjB,kBAFiB;AAGjB,8BAHiB;AAIjB,eAAS,KAJQ;AAKjB,YAAM;AALW,KAAnB;AAOD;AACF;;AAED,IAAI,QAAQ,KAAZ,EAAmB;AACjB,MAAM,YAAY,SAAZ,SAAY,CAAU,KAAV,EAAiB;AACjC,yBAA0B,MAAM,YAAhC,kHAA8C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAAnC,WAAmC;;AAC5C,UAAI,YAAY,WAAZ,EAAJ,EAA+B;AAC7B,oBAAY,MAAZ,CAAmB,sBAAnB,CAA0C,KAA1C;AACD;AACF;AACF,GAND;;AAQA,MAAM,WAAW,SAAS,QAAT,QAAiC,UAAjC,EAA6C;AAAA,QAAxB,GAAwB,SAAxB,GAAwB;AAAA,QAAnB,GAAmB,SAAnB,GAAmB;;AAC5D,QAAM,cAAc,WAAW,OAAX,CAAmB,QAAnB,MAAiC,CAAjC,GAChB,OAAO,GADS,GACH,OAAO,MADxB;;AAGA;AACA,gBAAY,GAAZ,EAAiB,aAAjB,EAAgC,SAAhC;;AAEA,QAAI,aAAJ,EAAmB;AACjB,kBAAY,GAAZ,EAAiB,UAAjB,EAA6B,aAA7B;AACD;AACF,GAVD;;AAYA,QAAM,OAAN,CAAc,EAAd,CAAiB,cAAjB,EAAoC,QAApC;AACA,QAAM,OAAN,CAAc,EAAd,CAAiB,iBAAjB,EAAoC,QAApC;AACD;;AAED,OAAO,OAAP,GAAiB,IAAjB;;;;;AC5EA,IAAM,gBAAgB,QAAQ,kBAAR,CAAtB;AACA,IAAM,cAAgB,QAAQ,gBAAR,CAAtB;AACA,IAAM,SAAgB,QAAQ,iBAAR,CAAtB;;AAEA,IAAM,YAAY;AAChB,SAAO,EADS;;AAGhB,cAAY,oBAAU,GAAV,EAAe;AAAA,QACjB,WADiB,GACiB,GADjB,CACjB,WADiB;AAAA,QACQ,IADR,GACiB,GADjB,CACJ,UADI;AAAA,QAEjB,MAFiB,GAEgB,WAFhB,CAEjB,MAFiB;AAAA,QAET,OAFS,GAEgB,WAFhB,CAET,OAFS;AAAA,QAEA,WAFA,GAEgB,WAFhB,CAEA,WAFA;;AAGzB,QAAM,OAAO,OAAO,OAAP,CAAe,OAAf,CAAb;;AAEA,QAAI,IAAJ,EAAU;AACR,kBAAY,IAAZ,GAAmB,KAAK,CAAL,GAAS,KAAK,IAAjC;AACA,kBAAY,GAAZ,GAAmB,KAAK,CAAL,GAAS,KAAK,GAAjC;;AAEA,kBAAY,KAAZ,GAAqB,KAAK,KAAL,GAAc,KAAK,CAAxC;AACA,kBAAY,MAAZ,GAAqB,KAAK,MAAL,GAAc,KAAK,CAAxC;;AAEA,UAAI,EAAE,WAAY,IAAd,CAAJ,EAAyB;AAAE,aAAK,KAAL,GAAc,KAAK,KAAL,GAAc,KAAK,IAAjC;AAAwC;AACnE,UAAI,EAAE,YAAY,IAAd,CAAJ,EAAyB;AAAE,aAAK,MAAL,GAAc,KAAK,MAAL,GAAc,KAAK,GAAjC;AAAwC;AACpE,KATD,MAUK;AACH,kBAAY,IAAZ,GAAmB,YAAY,GAAZ,GAAkB,YAAY,KAAZ,GAAoB,YAAY,MAAZ,GAAqB,CAA9E;AACD;;AAED,QAAI,IAAJ,GAAW,IAAX;AACA,QAAI,YAAJ,GAAmB,MAAnB;AACA,QAAI,OAAJ,GAAc,OAAd;;AAEA,SAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,UAAU,KAAV,CAAgB,MAApC,EAA4C,GAA5C,EAAiD;AAC/C,UAAM,eAAe,UAAU,KAAV,CAAgB,CAAhB,CAArB;;AAEA,UAAI,OAAJ,GAAc,OAAO,OAAP,CAAe,YAAY,QAAZ,CAAqB,IAApC,EAA0C,YAA1C,CAAd;;AAEA,UAAI,CAAC,IAAI,OAAT,EAAkB;AAChB;AACD;;AAED,kBAAY,eAAZ,CAA4B,YAA5B,IAA4C,UAAU,YAAV,EAAwB,SAAxB,CAAkC,GAAlC,CAA5C;AACD;AACF,GArCe;;AAuChB,UAAQ,gBAAU,GAAV,EAAe;AAAA,QACb,WADa,GACqC,GADrC,CACb,WADa;AAAA,QACA,QADA,GACqC,GADrC,CACA,QADA;AAAA,QACU,MADV,GACqC,GADrC,CACU,MADV;AAAA,QACkB,cADlB,GACqC,GADrC,CACkB,cADlB;;AAErB,QAAM,SAAS,OAAO,EAAP,EAAW,IAAI,UAAf,CAAf;AACA,QAAM,SAAS;AACb,UAAI,CADS;AAEb,UAAI,CAFS;AAGb,eAAS,KAHI;AAIb,cAAQ,KAJK;AAKb,kBAAY;AALC,KAAf;;AAQA,yBAA2B,UAAU,KAArC,kHAA4C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAAjC,YAAiC;;AAC1C,UAAM,WAAW,UAAU,YAAV,CAAjB;AACA,UAAM,UAAU,YAAY,MAAZ,CAAmB,OAAnB,CAA2B,YAAY,QAAZ,CAAqB,IAAhD,EAAsD,YAAtD,CAAhB;;AAEA,UAAI,CAAC,SAAS,OAAT,EAAkB,MAAlB,EAA0B,cAA1B,CAAL,EAAgD;AAAE;AAAW;;AAE7D,UAAI,MAAJ,GAAa,IAAI,MAAJ,GAAa,SAAS,YAAT,CAA1B;AACA,UAAI,OAAJ,GAAc,OAAd;AACA,UAAI,MAAJ,GAAa,IAAI,WAAJ,CAAgB,eAAhB,CAAgC,YAAhC,CAAb;;AAEA,eAAS,GAAT,CAAa,GAAb;;AAEA,UAAI,IAAI,MAAJ,CAAW,MAAf,EAAuB;AACrB,eAAO,CAAP,IAAY,IAAI,MAAJ,CAAW,EAAvB;AACA,eAAO,CAAP,IAAY,IAAI,MAAJ,CAAW,EAAvB;;AAEA,eAAO,EAAP,IAAa,IAAI,MAAJ,CAAW,EAAxB;AACA,eAAO,EAAP,IAAa,IAAI,MAAJ,CAAW,EAAxB;;AAEA,eAAO,MAAP,GAAgB,IAAhB;AACD;AACF;;AAED;AACA;AACA;AACA;AACA,WAAO,UAAP,GAAoB,CAAC,IAAI,MAAL,IAAe,CAAC,OAAO,MAAvB,IAAiC,IAAI,MAAJ,CAAW,OAAhE;;AAEA,WAAO,MAAP;AACD,GAhFe;;AAkFhB,iBAAe,uBAAU,QAAV,EAAoB;AACjC,0BAA2B,UAAU,KAArC,yHAA4C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAAjC,YAAiC;;AAC1C,UAAM,SAAS,SAAS,YAAT,KAA0B,EAAzC;;AAEA,aAAO,EAAP,GAAY,OAAO,EAAP,GAAY,CAAxB;AACA,aAAO,SAAP,GAAmB,OAAO,SAAP,GAAmB,GAAtC;AACA,aAAO,MAAP,GAAgB,KAAhB;AACA,aAAO,OAAP,GAAiB,IAAjB;;AAEA,eAAS,YAAT,IAAyB,MAAzB;AACD;;AAED,WAAO,QAAP;AACD,GA/Fe;;AAiGhB,SAAO,sBAA2B,UAA3B,EAAuC;AAAA,QAA3B,WAA2B,SAA3B,WAA2B;;AAC5C,QAAM,MAAM;AACV,8BADU;AAEV,kBAAY,CAAC,eAAe,eAAf,GACA,YAAY,SADZ,GACwB,YAAY,WADrC,EACkD,IAHpD;AAIV,mBAAa,YAAY,WAJf;AAKV,gBAAU,YAAY,gBALZ;AAMV,cAAQ,KANE;AAOV,sBAAgB;AAPN,KAAZ;;AAUA,cAAU,UAAV,CAAqB,GAArB;AACA,cAAU,aAAV,CAAwB,IAAI,QAA5B;;AAEA,QAAI,UAAJ,GAAiB,OAAO,EAAP,EAAW,YAAY,WAAZ,CAAwB,IAAnC,CAAjB;AACA,gBAAY,cAAZ,GAA6B,UAAU,MAAV,CAAiB,GAAjB,CAA7B;AACD;AAjHe,CAAlB;;AAoHA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,KAAvB,EAA8B,UAAU,WAAV,EAAuB;AACnD,cAAY,WAAZ,GAA+B,EAAE,MAAM,CAAR,EAAW,OAAO,CAAlB,EAAqB,KAAK,CAA1B,EAA6B,QAAQ,CAArC,EAA/B;AACA,cAAY,eAAZ,GAA+B,EAA/B;AACA,cAAY,gBAAZ,GAA+B,UAAU,aAAV,CAAwB,EAAxB,CAA/B;AACA,cAAY,cAAZ,GAA+B,IAA/B;AACD,CALD;;AAOA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,cAAvB,EAAwC,UAAU,KAAlD;AACA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,eAAvB,EAAwC,UAAU,KAAlD;;AAEA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,oBAAvB,EAA6C,iBAA0D;AAAA,MAA9C,WAA8C,SAA9C,WAA8C;AAAA,MAAjC,MAAiC,SAAjC,MAAiC;AAAA,MAAzB,qBAAyB,SAAzB,qBAAyB;;AACrG,MAAM,iBAAiB,UAAU,MAAV,CAAiB;AACtC,4BADsC;AAEtC,kBAFsC;AAGtC,gBAAY,YAAY,SAAZ,CAAsB,IAHI;AAItC,cAAU,YAAY,gBAJgB;AAKtC,oBAAgB;AALsB,GAAjB,CAAvB;;AAQA;AACA;AACA,MAAI,CAAC,eAAe,UAAhB,IAA8B,qBAAlC,EAAyD;AACvD,gBAAY,aAAZ,GAA4B,IAA5B;AACD;;AAED,cAAY,cAAZ,GAA6B,cAA7B;AACD,CAhBD;;AAkBA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,YAAvB,EAAqC,iBAAkC;AAAA,MAAtB,WAAsB,SAAtB,WAAsB;AAAA,MAAT,KAAS,SAAT,KAAS;;AACrE,OAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,UAAU,KAAV,CAAgB,MAApC,EAA4C,GAA5C,EAAiD;AAC/C,QAAM,UAAU,YAAY,MAAZ,CAAmB,OAAnB,CAA2B,YAAY,QAAZ,CAAqB,IAAhD,EAAsD,UAAU,KAAV,CAAgB,CAAhB,CAAtD,CAAhB;;AAEA;AACA,QAAI,SAAS,OAAT,EAAkB,IAAlB,EAAwB,IAAxB,CAAJ,EAAmC;AACjC;AACA,kBAAY,MAAZ,CAAmB,EAAE,YAAF,EAAS,QAAQ,IAAjB,EAAnB;AACA;AACD;AACF;AACF,CAXD;;AAaA,cAAc,OAAd,CAAsB,EAAtB,CAAyB,QAAzB,EAAmC,UAAU,GAAV,EAAe;AAAA,MACxC,MADwC,GAChB,GADgB,CACxC,MADwC;AAAA,MAChC,WADgC,GAChB,GADgB,CAChC,WADgC;;AAEhD,MAAM,cAAc,OAAO,EAAP,EAAW,GAAX,CAApB;;AAEA,OAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,UAAU,KAAV,CAAgB,MAApC,EAA4C,GAA5C,EAAiD;AAC/C,QAAM,eAAe,UAAU,KAAV,CAAgB,CAAhB,CAArB;AACA,gBAAY,OAAZ,GAAsB,YAAY,MAAZ,CAAmB,OAAnB,CAA2B,YAAY,QAAZ,CAAqB,IAAhD,EAAsD,YAAtD,CAAtB;;AAEA,QAAI,CAAC,YAAY,OAAjB,EAA0B;AACxB;AACD;;AAED,QAAM,WAAW,UAAU,YAAV,CAAjB;;AAEA,gBAAY,MAAZ,GAAqB,YAAY,gBAAZ,CAA6B,YAA7B,CAArB;;AAEA,WAAO,YAAP,IAAuB,SAAS,YAAT,CAAsB,WAAtB,CAAvB;AACD;AACF,CAlBD;;AAoBA,SAAS,QAAT,CAAmB,OAAnB,EAA4B,MAA5B,EAAoC,cAApC,EAAoD;AAClD,SAAQ,WAAW,QAAQ,OAAnB,KACI,UAAU,CAAC,QAAQ,OADvB,MAEI,CAAC,cAAD,IAAmB,QAAQ,OAF/B,CAAR;AAGD;;AAED,OAAO,OAAP,GAAiB,SAAjB;;;;;AC3LA,IAAM,YAAiB,QAAQ,SAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,UAAR,CAAvB;AACA,IAAM,iBAAiB,QAAQ,mBAAR,CAAvB;;AAEA,IAAM,WAAW;AACf,YAAU;AACR,aAAa,KADL;AAER,aAAa,KAFL;AAGR,iBAAa,IAHL;AAIR,iBAAa;AAJL,GADK;;AAQf,aAAW,yBAA0C;AAAA,QAA9B,IAA8B,QAA9B,IAA8B;AAAA,QAAxB,WAAwB,QAAxB,WAAwB;AAAA,QAAX,OAAW,QAAX,OAAW;;AACnD,QAAM,cAAc,WAAW,QAAQ,WAAvC;AACA,QAAM,SAAS,EAAf;;AAEA,QAAI,QAAQ,WAAZ,EAAyB;AACvB,aAAO,IAAP,GAAc,YAAY,IAAZ,GAAoB,KAAK,KAAL,GAAc,YAAY,IAA5D;AACA,aAAO,GAAP,GAAc,YAAY,GAAZ,GAAoB,KAAK,MAAL,GAAc,YAAY,GAA5D;;AAEA,aAAO,KAAP,GAAgB,YAAY,KAAZ,GAAsB,KAAK,KAAL,IAAe,IAAI,YAAY,KAA/B,CAAtC;AACA,aAAO,MAAP,GAAgB,YAAY,MAAZ,GAAsB,KAAK,MAAL,IAAe,IAAI,YAAY,MAA/B,CAAtC;AACD,KAND,MAOK;AACH,aAAO,IAAP,GAAc,OAAO,GAAP,GAAa,OAAO,KAAP,GAAe,OAAO,MAAP,GAAgB,CAA1D;AACD;;AAED,WAAO,MAAP;AACD,GAxBc;;AA0Bf,OAAK,oBAAwD;AAAA,QAA5C,UAA4C,SAA5C,UAA4C;AAAA,QAAhC,WAAgC,SAAhC,WAAgC;AAAA,QAAnB,MAAmB,SAAnB,MAAmB;AAAA,QAAX,OAAW,SAAX,OAAW;;AAC3D,QAAI,CAAC,OAAL,EAAc;AAAE,aAAO,MAAP;AAAgB;;AAEhC,QAAM,OAAO,OAAO,WAAP,GACT,EAAE,GAAG,OAAO,CAAZ,EAAe,GAAG,OAAO,CAAzB,EADS,GAET,MAAM,MAAN,CAAa,EAAb,EAAiB,UAAjB,CAFJ;;AAIA,QAAM,cAAc,mBAAmB,QAAQ,WAA3B,EAAwC,WAAxC,EAAqD,IAArD,CAApB;;AAEA,QAAI,CAAC,WAAL,EAAkB;AAAE,aAAO,MAAP;AAAgB;;AAEpC,WAAO,EAAP,GAAY,CAAZ;AACA,WAAO,EAAP,GAAY,CAAZ;AACA,WAAO,MAAP,GAAgB,KAAhB;;AAEA,QAAM,OAAO,WAAb;AACA,QAAI,YAAY,KAAK,CAArB;AACA,QAAI,YAAY,KAAK,CAArB;;AAEA,QAAM,SAAS,YAAY,eAAZ,CAA4B,QAA3C;;AAEA;AACA;AACA;AACA,QAAI,OAAO,WAAP,IAAsB,OAAO,WAAjC,EAA8C;AAC5C,kBAAY,KAAK,GAAL,CAAS,KAAK,GAAL,CAAS,KAAK,CAAL,GAAS,KAAK,KAAd,GAAuB,OAAO,KAAvC,EAA+C,KAAK,CAApD,CAAT,EAAiE,KAAK,CAAL,GAAS,OAAO,IAAjF,CAAZ;AACA,kBAAY,KAAK,GAAL,CAAS,KAAK,GAAL,CAAS,KAAK,CAAL,GAAS,KAAK,MAAd,GAAuB,OAAO,MAAvC,EAA+C,KAAK,CAApD,CAAT,EAAiE,KAAK,CAAL,GAAS,OAAO,GAAjF,CAAZ;AACD,KAHD,MAIK;AACH,kBAAY,KAAK,GAAL,CAAS,KAAK,GAAL,CAAS,KAAK,KAAL,GAAc,OAAO,KAA9B,EAAsC,KAAK,CAA3C,CAAT,EAAwD,KAAK,IAAL,GAAY,OAAO,IAA3E,CAAZ;AACA,kBAAY,KAAK,GAAL,CAAS,KAAK,GAAL,CAAS,KAAK,MAAL,GAAc,OAAO,MAA9B,EAAsC,KAAK,CAA3C,CAAT,EAAwD,KAAK,GAAL,GAAY,OAAO,GAA3E,CAAZ;AACD;;AAED,WAAO,EAAP,GAAY,YAAY,KAAK,CAA7B;AACA,WAAO,EAAP,GAAY,YAAY,KAAK,CAA7B;;AAEA,WAAO,OAAP,GAAiB,OAAO,SAAP,KAAqB,SAArB,IAAkC,OAAO,SAAP,KAAqB,SAAxE;AACA,WAAO,MAAP,GAAgB,CAAC,EAAE,OAAO,EAAP,IAAa,OAAO,EAAtB,CAAjB;;AAEA,WAAO,SAAP,GAAmB,SAAnB;AACA,WAAO,SAAP,GAAmB,SAAnB;AACD,GAnEc;;AAqEf,gBAAc,6BAAoD;AAAA,QAAxC,IAAwC,SAAxC,IAAwC;AAAA,QAAlC,MAAkC,SAAlC,MAAkC;AAAA,QAA1B,MAA0B,SAA1B,MAA0B;AAAA,QAAlB,KAAkB,SAAlB,KAAkB;AAAA,QAAX,OAAW,SAAX,OAAW;;AAChE,QAAM,cAAc,WAAW,QAAQ,WAAvC;;AAEA,QAAI,WAAW,QAAQ,OAAnB,IACG,EAAE,UAAU,OAAV,IAAqB,WAArB,IAAoC,OAAO,MAA7C,CADP,EAC6D;;AAE3D,UAAI,OAAO,MAAX,EAAmB;AACjB,aAAK,CAAL,IAAU,OAAO,EAAjB;AACA,aAAK,CAAL,IAAU,OAAO,EAAjB;AACA,eAAO,CAAP,IAAY,OAAO,EAAnB;AACA,eAAO,CAAP,IAAY,OAAO,EAAnB;;AAEA,eAAO;AACL,cAAI,OAAO,EADN;AAEL,cAAI,OAAO;AAFN,SAAP;AAID;AACF;AACF,GAvFc;;AAyFf;AAzFe,CAAjB;;AA4FA,SAAS,kBAAT,CAA6B,KAA7B,EAAoC,WAApC,EAAiD,IAAjD,EAAuD;AACrD,MAAI,MAAM,EAAN,CAAS,QAAT,CAAkB,KAAlB,CAAJ,EAA8B;AAC5B,WAAO,MAAM,eAAN,CAAsB,KAAtB,EAA6B,YAAY,MAAzC,EAAiD,YAAY,OAA7D,EAAsE,CAAC,KAAK,CAAN,EAAS,KAAK,CAAd,EAAiB,WAAjB,CAAtE,CAAP;AACD,GAFD,MAEO;AACL,WAAO,MAAM,eAAN,CAAsB,KAAtB,EAA6B,YAAY,MAAzC,EAAiD,YAAY,OAA7D,CAAP;AACD;AACF;;AAED,UAAU,QAAV,GAAqB,QAArB;AACA,UAAU,KAAV,CAAgB,IAAhB,CAAqB,UAArB;;AAEA,eAAe,SAAf,CAAyB,QAAzB,GAAoC,SAAS,QAA7C;;AAEA,OAAO,OAAP,GAAiB,QAAjB;;;;;AC7GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,IAAM,YAAiB,QAAQ,SAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,UAAR,CAAvB;AACA,IAAM,YAAiB,QAAQ,eAAR,CAAvB;AACA,IAAM,iBAAiB,QAAQ,mBAAR,CAAvB;AACA,IAAM,SAAiB,QAAQ,mBAAR,CAAvB;;eAE+B,QAAQ,YAAR,C;IAAvB,kB,YAAA,kB;;AAER,IAAM,UAAU,EAAE,KAAK,CAAC,QAAR,EAAkB,MAAM,CAAC,QAAzB,EAAmC,QAAQ,CAAC,QAA5C,EAAsD,OAAO,CAAC,QAA9D,EAAhB;AACA,IAAM,UAAU,EAAE,KAAK,CAAC,QAAR,EAAkB,MAAM,CAAC,QAAzB,EAAmC,QAAQ,CAAC,QAA5C,EAAsD,OAAO,CAAC,QAA9D,EAAhB;;AAEA,IAAM,gBAAgB;AACpB,YAAU;AACR,aAAS,KADD;AAER,aAAS,KAFD;AAGR,SAAK,IAHG;AAIR,SAAK,IAJG;AAKR,YAAQ;AALA,GADU;;AASpB,aAAW,yBAAiD;AAAA,QAArC,WAAqC,QAArC,WAAqC;AAAA,QAAxB,WAAwB,QAAxB,WAAwB;AAAA,QAAX,OAAW,QAAX,OAAW;;AAC1D,QAAI,CAAC,OAAL,EAAc;AACZ,aAAO,MAAM,MAAN,CAAa,EAAb,EAAiB,WAAjB,CAAP;AACD;;AAED,QAAM,SAAS,mBAAmB,QAAQ,MAA3B,EAAmC,WAAnC,EAAgD,YAAY,WAAZ,CAAwB,IAAxE,CAAf;;AAEA,QAAI,MAAJ,EAAY;AACV,aAAO;AACL,aAAQ,YAAY,GAAZ,GAAqB,OAAO,CAD/B;AAEL,cAAQ,YAAY,IAAZ,GAAqB,OAAO,CAF/B;AAGL,gBAAQ,YAAY,MAAZ,GAAqB,OAAO,CAH/B;AAIL,eAAQ,YAAY,KAAZ,GAAqB,OAAO;AAJ/B,OAAP;AAMD;;AAED,WAAO,WAAP;AACD,GA1BmB;;AA4BpB,OAAK,oBAAgE;AAAA,QAApD,UAAoD,SAApD,UAAoD;AAAA,QAAxC,WAAwC,SAAxC,WAAwC;AAAA,QAA3B,MAA2B,SAA3B,MAA2B;AAAA,QAAnB,MAAmB,SAAnB,MAAmB;AAAA,QAAX,OAAW,SAAX,OAAW;;AACnE,QAAM,QAAQ,YAAY,QAAZ,CAAqB,WAArB,IAAoC,YAAY,QAAZ,CAAqB,KAAvE;;AAEA,QAAI,CAAC,YAAY,WAAZ,EAAD,IAA8B,CAAC,KAAnC,EAA0C;AACxC;AACD;;AAED,QAAM,OAAO,OAAO,WAAP,GACT,EAAE,GAAG,OAAO,CAAZ,EAAe,GAAG,OAAO,CAAzB,EADS,GAET,MAAM,MAAN,CAAa,EAAb,EAAiB,UAAjB,CAFJ;AAGA,QAAM,QAAQ,UAAU,UAAV,CAAqB,mBAAmB,QAAQ,KAA3B,EAAkC,WAAlC,EAA+C,IAA/C,CAArB,KAA8E,OAA5F;AACA,QAAM,QAAQ,UAAU,UAAV,CAAqB,mBAAmB,QAAQ,KAA3B,EAAkC,WAAlC,EAA+C,IAA/C,CAArB,KAA8E,OAA5F;;AAEA,QAAI,YAAY,KAAK,CAArB;AACA,QAAI,YAAY,KAAK,CAArB;;AAEA,WAAO,EAAP,GAAY,CAAZ;AACA,WAAO,EAAP,GAAY,CAAZ;AACA,WAAO,MAAP,GAAgB,KAAhB;;AAEA,QAAI,MAAM,GAAV,EAAe;AACb,kBAAY,KAAK,GAAL,CAAS,KAAK,GAAL,CAAS,MAAM,GAAN,GAAe,OAAO,GAA/B,EAAuC,KAAK,CAA5C,CAAT,EAAyD,MAAM,GAAN,GAAe,OAAO,GAA/E,CAAZ;AACD,KAFD,MAGK,IAAI,MAAM,MAAV,EAAkB;AACrB,kBAAY,KAAK,GAAL,CAAS,KAAK,GAAL,CAAS,MAAM,MAAN,GAAe,OAAO,MAA/B,EAAuC,KAAK,CAA5C,CAAT,EAAyD,MAAM,MAAN,GAAe,OAAO,MAA/E,CAAZ;AACD;AACD,QAAI,MAAM,IAAV,EAAgB;AACd,kBAAY,KAAK,GAAL,CAAS,KAAK,GAAL,CAAS,MAAM,IAAN,GAAe,OAAO,IAA/B,EAAuC,KAAK,CAA5C,CAAT,EAAyD,MAAM,IAAN,GAAe,OAAO,IAA/E,CAAZ;AACD,KAFD,MAGK,IAAI,MAAM,KAAV,EAAiB;AACpB,kBAAY,KAAK,GAAL,CAAS,KAAK,GAAL,CAAS,MAAM,KAAN,GAAe,OAAO,KAA/B,EAAuC,KAAK,CAA5C,CAAT,EAAyD,MAAM,KAAN,GAAe,OAAO,KAA/E,CAAZ;AACD;;AAED,WAAO,EAAP,GAAY,YAAY,KAAK,CAA7B;AACA,WAAO,EAAP,GAAY,YAAY,KAAK,CAA7B;;AAEA,WAAO,OAAP,GAAiB,OAAO,SAAP,KAAqB,SAArB,IAAkC,OAAO,SAAP,KAAqB,SAAxE;AACA,WAAO,MAAP,GAAgB,CAAC,EAAE,OAAO,EAAP,IAAa,OAAO,EAAtB,CAAjB;;AAEA,WAAO,SAAP,GAAmB,SAAnB;AACA,WAAO,SAAP,GAAmB,SAAnB;AACD,GArEmB;;AAuEpB,gBAAc,6BAAoD;AAAA,QAAxC,IAAwC,SAAxC,IAAwC;AAAA,QAAlC,MAAkC,SAAlC,MAAkC;AAAA,QAA1B,MAA0B,SAA1B,MAA0B;AAAA,QAAlB,KAAkB,SAAlB,KAAkB;AAAA,QAAX,OAAW,SAAX,OAAW;;AAChE,QAAI,WAAW,QAAQ,OAAnB,IACG,EAAE,UAAU,OAAV,IAAqB,OAAO,MAA9B,CADP,EAC8C;;AAE5C,UAAI,OAAO,MAAX,EAAmB;AACjB,aAAK,CAAL,IAAU,OAAO,EAAjB;AACA,aAAK,CAAL,IAAU,OAAO,EAAjB;AACA,eAAO,CAAP,IAAY,OAAO,EAAnB;AACA,eAAO,CAAP,IAAY,OAAO,EAAnB;;AAEA,eAAO;AACL,cAAI,OAAO,EADN;AAEL,cAAI,OAAO;AAFN,SAAP;AAID;AACF;AACF,GAvFmB;;AAyFpB,kBAzFoB;AA0FpB,kBA1FoB;AA2FpB;AA3FoB,CAAtB;;AA8FA,UAAU,aAAV,GAA0B,aAA1B;AACA,UAAU,KAAV,CAAgB,IAAhB,CAAqB,eAArB;;AAEA,eAAe,SAAf,CAAyB,aAAzB,GAAyC,cAAc,QAAvD;AACA,OAAO,QAAP,CAAgB,aAAhB,GAAyC,cAAc,QAAvD;;AAEA,OAAO,OAAP,GAAiB,aAAjB;;;;;AC1HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,IAAM,YAAiB,QAAQ,SAAR,CAAvB;AACA,IAAM,gBAAiB,QAAQ,iBAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,UAAR,CAAvB;AACA,IAAM,YAAiB,QAAQ,eAAR,CAAvB;AACA,IAAM,iBAAiB,QAAQ,mBAAR,CAAvB;AACA,IAAM,SAAiB,QAAQ,mBAAR,CAAvB;;AAEA,IAAM,QAAQ,EAAE,OAAO,CAAC,QAAV,EAAoB,QAAQ,CAAC,QAA7B,EAAd;AACA,IAAM,QAAQ,EAAE,OAAO,CAAC,QAAV,EAAoB,QAAQ,CAAC,QAA7B,EAAd;;AAEA,IAAM,eAAe;AACnB,YAAU;AACR,aAAS,KADD;AAER,aAAS,KAFD;AAGR,SAAK,IAHG;AAIR,SAAK;AAJG,GADS;;AAQnB,aAAW,yBAA2B;AAAA,QAAf,WAAe,QAAf,WAAe;;AACpC,WAAO,YAAY,WAAnB;AACD,GAVkB;;AAYnB,OAAK,aAAU,GAAV,EAAe;AAAA,QACV,WADU,GACe,GADf,CACV,WADU;AAAA,QACG,OADH,GACe,GADf,CACG,OADH;;AAElB,QAAM,QAAQ,YAAY,QAAZ,CAAqB,WAArB,IAAoC,YAAY,QAAZ,CAAqB,KAAvE;;AAEA,QAAI,CAAC,YAAY,WAAZ,EAAD,IAA8B,CAAC,KAAnC,EAA0C;AACxC;AACD;;AAED,QAAM,OAAO,UAAU,UAAV,CAAqB,YAAY,WAAZ,CAAwB,QAA7C,CAAb;;AAEA,QAAM,UAAU,UAAU,UAAV,CAAqB,cAAc,kBAAd,CAAiC,QAAQ,GAAzC,EAA8C,WAA9C,CAArB,KAAoF,KAApG;AACA,QAAM,UAAU,UAAU,UAAV,CAAqB,cAAc,kBAAd,CAAiC,QAAQ,GAAzC,EAA8C,WAA9C,CAArB,KAAoF,KAApG;;AAEA,QAAI,OAAJ,GAAc;AACZ,eAAS,QAAQ,OADL;AAEZ,eAAS,QAAQ,OAFL;AAGZ,aAAO,MAAM,MAAN,CAAa,EAAb,EAAiB,cAAc,OAA/B,CAHK;AAIZ,aAAO,MAAM,MAAN,CAAa,EAAb,EAAiB,cAAc,OAA/B;AAJK,KAAd;;AAOA,QAAI,MAAM,GAAV,EAAe;AACb,UAAI,OAAJ,CAAY,KAAZ,CAAkB,GAAlB,GAAwB,KAAK,MAAL,GAAc,QAAQ,MAA9C;AACA,UAAI,OAAJ,CAAY,KAAZ,CAAkB,GAAlB,GAAwB,KAAK,MAAL,GAAc,QAAQ,MAA9C;AACD,KAHD,MAIK,IAAI,MAAM,MAAV,EAAkB;AACrB,UAAI,OAAJ,CAAY,KAAZ,CAAkB,MAAlB,GAA2B,KAAK,GAAL,GAAW,QAAQ,MAA9C;AACA,UAAI,OAAJ,CAAY,KAAZ,CAAkB,MAAlB,GAA2B,KAAK,GAAL,GAAW,QAAQ,MAA9C;AACD;AACD,QAAI,MAAM,IAAV,EAAgB;AACd,UAAI,OAAJ,CAAY,KAAZ,CAAkB,IAAlB,GAAyB,KAAK,KAAL,GAAa,QAAQ,KAA9C;AACA,UAAI,OAAJ,CAAY,KAAZ,CAAkB,IAAlB,GAAyB,KAAK,KAAL,GAAa,QAAQ,KAA9C;AACD,KAHD,MAIK,IAAI,MAAM,KAAV,EAAiB;AACpB,UAAI,OAAJ,CAAY,KAAZ,CAAkB,KAAlB,GAA0B,KAAK,IAAL,GAAY,QAAQ,KAA9C;AACA,UAAI,OAAJ,CAAY,KAAZ,CAAkB,KAAlB,GAA0B,KAAK,IAAL,GAAY,QAAQ,KAA9C;AACD;;AAED,kBAAc,GAAd,CAAkB,GAAlB;AACD,GAlDkB;;AAoDnB,gBAAc,cAAc;AApDT,CAArB;;AAuDA,UAAU,YAAV,GAAyB,YAAzB;AACA,UAAU,KAAV,CAAgB,IAAhB,CAAqB,cAArB;;AAEA,eAAe,SAAf,CAAyB,YAAzB,GAAwC,aAAa,QAArD;AACA,OAAO,QAAP,CAAgB,YAAhB,GAAwC,aAAa,QAArD;;AAEA,OAAO,OAAP,GAAiB,YAAjB;;;;;AClFA,IAAM,YAAiB,QAAQ,SAAR,CAAvB;AACA,IAAM,WAAiB,QAAQ,aAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,UAAR,CAAvB;AACA,IAAM,iBAAiB,QAAQ,mBAAR,CAAvB;;AAEA,IAAM,OAAO;AACX,YAAU;AACR,aAAS,KADD;AAER,aAAS,KAFD;AAGR,WAAS,QAHD;AAIR,aAAS,IAJD;AAKR,aAAS,IALD;;AAOR,oBAAgB;AAPR,GADC;;AAWX,aAAW,yBAA8E;AAAA,QAAlE,WAAkE,QAAlE,WAAkE;AAAA,QAArD,YAAqD,QAArD,YAAqD;AAAA,QAAvC,OAAuC,QAAvC,OAAuC;AAAA,QAA9B,IAA8B,QAA9B,IAA8B;AAAA,QAAxB,WAAwB,QAAxB,WAAwB;AAAA,QAAX,OAAW,QAAX,OAAW;;AACvF,QAAM,UAAU,EAAhB;AACA,QAAM,gBAAgB,MAAM,QAAN,CAAe,MAAM,eAAN,CAAsB,QAAQ,MAA9B,CAAf,CAAtB;AACA,QAAM,SAAS,iBAAiB,MAAM,WAAN,CAAkB,YAAlB,EAAgC,OAAhC,EAAyC,YAAY,QAAZ,CAAqB,IAA9D,CAAhC;AACA,cAAU,WAAW,aAAa,OAAb,CAAqB,YAAY,QAAZ,CAAqB,IAA1C,EAAgD,IAA3D,IAAmE,EAA7E;;AAEA,QAAI,mBAAJ;;AAEA,QAAI,QAAQ,MAAR,KAAmB,aAAvB,EAAsC;AACpC,mBAAa;AACX,WAAG,YAAY,WAAZ,CAAwB,IAAxB,CAA6B,CAA7B,GAAiC,OAAO,CADhC;AAEX,WAAG,YAAY,WAAZ,CAAwB,IAAxB,CAA6B,CAA7B,GAAiC,OAAO;AAFhC,OAAb;AAID,KALD,MAMM;AACJ,UAAM,aAAa,MAAM,eAAN,CAAsB,QAAQ,MAA9B,EAAsC,YAAtC,EAAoD,OAApD,EAA6D,CAAC,WAAD,CAA7D,CAAnB;;AAEA,mBAAa,MAAM,QAAN,CAAe,UAAf,KAA8B,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EAA3C;AACD;;AAED,QAAI,QAAQ,QAAQ,cAAhB,IAAkC,QAAQ,cAAR,CAAuB,MAA7D,EAAqE;AACnE,2BAA6C,QAAQ,cAArD,kHAAqE;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,YAArD,SAAqD,SAAxD,CAAwD;AAAA,YAAvC,SAAuC,SAA1C,CAA0C;;AACnE,gBAAQ,IAAR,CAAa;AACX,aAAG,YAAY,IAAZ,GAAoB,KAAK,KAAL,GAAc,SAAlC,GAA+C,WAAW,CADlD;AAEX,aAAG,YAAY,GAAZ,GAAoB,KAAK,MAAL,GAAc,SAAlC,GAA+C,WAAW;AAFlD,SAAb;AAID;AACF,KAPD,MAQK;AACH,cAAQ,IAAR,CAAa,UAAb;AACD;;AAED,WAAO,OAAP;AACD,GA5CU;;AA8CX,OAAK,oBAAyE;AAAA,QAA7D,WAA6D,SAA7D,WAA6D;AAAA,QAAhD,UAAgD,SAAhD,UAAgD;AAAA,QAApC,MAAoC,SAApC,MAAoC;AAAA,QAA5B,OAA4B,SAA5B,OAA4B;AAAA,QAAX,OAAW,SAAnB,MAAmB;;AAC5E,QAAM,UAAU,EAAhB;AACA,QAAI,eAAJ;AACA,QAAI,aAAJ;AACA,QAAI,UAAJ;;AAEA,QAAI,OAAO,WAAX,EAAwB;AACtB,aAAO,EAAE,GAAG,OAAO,CAAZ,EAAe,GAAG,OAAO,CAAzB,EAAP;AACD,KAFD,MAGK;AACH,UAAM,SAAS,MAAM,WAAN,CAAkB,YAAY,MAA9B,EAAsC,YAAY,OAAlD,EAA2D,YAAY,QAAZ,CAAqB,IAAhF,CAAf;;AAEA,aAAO,MAAM,MAAN,CAAa,EAAb,EAAiB,UAAjB,CAAP;;AAEA,WAAK,CAAL,IAAU,OAAO,CAAjB;AACA,WAAK,CAAL,IAAU,OAAO,CAAjB;AACD;;AAED,WAAO,KAAP,GAAe,KAAK,CAApB;AACA,WAAO,KAAP,GAAe,KAAK,CAApB;;AAEA,QAAI,MAAM,QAAQ,OAAR,GAAiB,QAAQ,OAAR,CAAgB,MAAjC,GAA0C,CAApD;;AAEA,0BAAyC,OAAzC,yHAAkD;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,UAAlC,OAAkC,SAArC,CAAqC;AAAA,UAAtB,OAAsB,SAAzB,CAAyB;;AAChD,UAAM,YAAY,KAAK,CAAL,GAAS,OAA3B;AACA,UAAM,YAAY,KAAK,CAAL,GAAS,OAA3B;;AAEA,4BAAyB,QAAQ,OAAjC,yHAA0C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,YAA/B,UAA+B;;AACxC,YAAI,MAAM,EAAN,CAAS,QAAT,CAAkB,UAAlB,CAAJ,EAAmC;AACjC,mBAAS,WAAW,SAAX,EAAsB,SAAtB,EAAiC,WAAjC,CAAT;AACD,SAFD,MAGK;AACH,mBAAS,UAAT;AACD;;AAED,YAAI,CAAC,MAAL,EAAa;AAAE;AAAW;;AAE1B,gBAAQ,IAAR,CAAa;AACX,aAAG,MAAM,EAAN,CAAS,MAAT,CAAgB,OAAO,CAAvB,IAA6B,OAAO,CAAP,GAAW,OAAxC,GAAmD,SAD3C;AAEX,aAAG,MAAM,EAAN,CAAS,MAAT,CAAgB,OAAO,CAAvB,IAA6B,OAAO,CAAP,GAAW,OAAxC,GAAmD,SAF3C;;AAIX,iBAAO,MAAM,EAAN,CAAS,MAAT,CAAgB,OAAO,KAAvB,IAA+B,OAAO,KAAtC,GAA6C,QAAQ;AAJjD,SAAb;AAMD;AACF;;AAED,QAAM,UAAU;AACd,cAAQ,IADM;AAEd,eAAS,KAFK;AAGd,gBAAU,CAHI;AAId,aAAO,CAJO;AAKd,UAAI,CALU;AAMd,UAAI;AANU,KAAhB;;AASA,SAAK,IAAI,CAAJ,EAAO,MAAM,QAAQ,MAA1B,EAAkC,IAAI,GAAtC,EAA2C,GAA3C,EAAgD;AAC9C,eAAS,QAAQ,CAAR,CAAT;;AAEA,UAAM,QAAQ,OAAO,KAArB;AACA,UAAM,KAAK,OAAO,CAAP,GAAW,KAAK,CAA3B;AACA,UAAM,KAAK,OAAO,CAAP,GAAW,KAAK,CAA3B;AACA,UAAM,WAAW,MAAM,KAAN,CAAY,EAAZ,EAAgB,EAAhB,CAAjB;AACA,UAAI,UAAU,YAAY,KAA1B;;AAEA;AACA;AACA,UAAI,UAAU,QAAV,IAAsB,QAAQ,OAA9B,IAAyC,QAAQ,KAAR,KAAkB,QAA/D,EAAyE;AACvE,kBAAU,KAAV;AACD;;AAED,UAAI,CAAC,QAAQ,MAAT,KAAoB;AACpB;AADoB,QAEjB,QAAQ,OAAR,IAAmB,UAAU;AAChC;AADG,QAED,WAAW,KAAX,GAAmB,QAAQ,QAAR,GAAmB,QAAQ;AAChD;AAHG,QAIA,UAAU,QAAV,IAAsB,QAAQ,KAAR,KAAkB,QAAzC;AACF;AACC,iBAAW,QAAQ,QARA;AASpB;AACG,OAAC,QAAQ,OAAT,IAAoB,WAAW,QAAQ,QAV1C,CAAJ,EAU0D;;AAExD,gBAAQ,MAAR,GAAiB,MAAjB;AACA,gBAAQ,QAAR,GAAmB,QAAnB;AACA,gBAAQ,KAAR,GAAgB,KAAhB;AACA,gBAAQ,OAAR,GAAkB,OAAlB;AACA,gBAAQ,EAAR,GAAa,EAAb;AACA,gBAAQ,EAAR,GAAa,EAAb;;AAEA,eAAO,KAAP,GAAe,KAAf;AACD;AACF;;AAED,QAAI,oBAAJ;;AAEA,QAAI,QAAQ,MAAZ,EAAoB;AAClB,oBAAe,OAAO,SAAP,KAAqB,QAAQ,MAAR,CAAe,CAApC,IAAyC,OAAO,SAAP,KAAqB,QAAQ,MAAR,CAAe,CAA5F;;AAEA,aAAO,SAAP,GAAmB,QAAQ,MAAR,CAAe,CAAlC;AACA,aAAO,SAAP,GAAmB,QAAQ,MAAR,CAAe,CAAlC;AACD,KALD,MAMK;AACH,oBAAc,IAAd;;AAEA,aAAO,SAAP,GAAmB,GAAnB;AACA,aAAO,SAAP,GAAmB,GAAnB;AACD;;AAED,WAAO,EAAP,GAAY,QAAQ,EAApB;AACA,WAAO,EAAP,GAAY,QAAQ,EAApB;;AAEA,WAAO,OAAP,GAAkB,eAAgB,QAAQ,OAAR,IAAmB,CAAC,OAAO,MAA7D;AACA,WAAO,MAAP,GAAgB,QAAQ,OAAxB;AACD,GA/JU;;AAiKX,gBAAc,6BAAoD;AAAA,QAAxC,IAAwC,SAAxC,IAAwC;AAAA,QAAlC,MAAkC,SAAlC,MAAkC;AAAA,QAA1B,MAA0B,SAA1B,MAA0B;AAAA,QAAlB,KAAkB,SAAlB,KAAkB;AAAA,QAAX,OAAW,SAAX,OAAW;;AAChE,QAAM,iBAAiB,WAAW,QAAQ,cAA1C;;AAEA,QAAI,WAAW,QAAQ,OAAnB,IACG,EAAE,UAAU,OAAV,IAAqB,cAArB,IAAuC,eAAe,MAAxD,CADP,EACwE;;AAEtE,UAAI,OAAO,MAAX,EAAmB;AACjB,aAAK,CAAL,IAAU,OAAO,EAAjB;AACA,aAAK,CAAL,IAAU,OAAO,EAAjB;AACA,eAAO,CAAP,IAAY,OAAO,EAAnB;AACA,eAAO,CAAP,IAAY,OAAO,EAAnB;AACD;;AAED,aAAO;AACL,eAAS,OAAO,KADX;AAEL,gBAAS,OAAO,MAFX;AAGL,WAAS,OAAO,SAHX;AAIL,WAAS,OAAO,SAJX;AAKL,eAAS,OAAO,KALX;AAML,eAAS,OAAO,KANX;AAOL,YAAS,OAAO,EAPX;AAQL,YAAS,OAAO;AARX,OAAP;AAUD;AACF;AAzLU,CAAb;;AA4LA,SAAS,cAAT,GAA0B,UAAU,IAAV,EAAgB;AACxC,SAAO,UAAU,CAAV,EAAa,CAAb,EAAgB;AACrB,QAAM,SAAS,KAAK,MAAL,IAAe;AAC5B,YAAQ,CAAC,QADmB;AAE5B,aAAS,QAFmB;AAG5B,WAAQ,CAAC,QAHmB;AAI5B,cAAS;AAJmB,KAA9B;AAMA,QAAI,UAAU,CAAd;AACA,QAAI,UAAU,CAAd;;AAEA,QAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,KAAK,MAArB,CAAJ,EAAkC;AAChC,gBAAU,KAAK,MAAL,CAAY,CAAtB;AACA,gBAAU,KAAK,MAAL,CAAY,CAAtB;AACD;;AAED,QAAM,QAAQ,KAAK,KAAL,CAAW,CAAC,IAAI,OAAL,IAAgB,KAAK,CAAhC,CAAd;AACA,QAAM,QAAQ,KAAK,KAAL,CAAW,CAAC,IAAI,OAAL,IAAgB,KAAK,CAAhC,CAAd;;AAEA,QAAM,OAAO,KAAK,GAAL,CAAS,OAAO,IAAhB,EAAsB,KAAK,GAAL,CAAS,OAAO,KAAhB,EAAwB,QAAQ,KAAK,CAAb,GAAiB,OAAzC,CAAtB,CAAb;AACA,QAAM,OAAO,KAAK,GAAL,CAAS,OAAO,GAAhB,EAAsB,KAAK,GAAL,CAAS,OAAO,MAAhB,EAAwB,QAAQ,KAAK,CAAb,GAAiB,OAAzC,CAAtB,CAAb;;AAEA,WAAO;AACL,SAAG,IADE;AAEL,SAAG,IAFE;AAGL,aAAO,KAAK;AAHP,KAAP;AAKD,GA1BD;AA2BD,CA5BD;;AA8BA,UAAU,IAAV,GAAiB,IAAjB;AACA,UAAU,KAAV,CAAgB,IAAhB,CAAqB,MAArB;;AAEA,eAAe,SAAf,CAAyB,IAAzB,GAAgC,KAAK,QAArC;;AAEA,OAAO,OAAP,GAAiB,IAAjB;;;;;ACpOA;AACA;;AAEA,IAAM,YAAiB,QAAQ,SAAR,CAAvB;AACA,IAAM,OAAiB,QAAQ,QAAR,CAAvB;AACA,IAAM,iBAAiB,QAAQ,mBAAR,CAAvB;AACA,IAAM,SAAiB,QAAQ,mBAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,WAAR,CAAvB;;AAEA,IAAM,WAAW;AACf,YAAU;AACR,aAAS,KADD;AAER,aAAS,KAFD;AAGR,WAAS,QAHD;AAIR,aAAS,IAJD;AAKR,aAAS;AALD,GADK;;AASf,aAAW,mBAAU,GAAV,EAAe;AAAA,QAChB,WADgB,GACS,GADT,CAChB,WADgB;AAAA,QACH,OADG,GACS,GADT,CACH,OADG;;AAExB,QAAM,QAAQ,YAAY,QAAZ,CAAqB,KAAnC;;AAEA,QAAI,CAAC,KAAL,EAAY;AAAE;AAAS;;AAEvB,QAAI,OAAJ,GAAc;AACZ,sBAAgB,CAAC;AACf,WAAG,MAAM,IAAN,GAAY,CAAZ,GAAgB,CADJ;AAEf,WAAG,MAAM,GAAN,GAAY,CAAZ,GAAgB;AAFJ,OAAD,CADJ;AAKZ,cAAQ,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EALI;AAMZ,cAAQ,MANI;AAOZ,aAAO,QAAQ;AAPH,KAAd;;AAUA,QAAM,UAAU,KAAK,SAAL,CAAe,GAAf,CAAhB;AACA,QAAI,OAAJ,GAAc,OAAd;;AAEA,WAAO,OAAP;AACD,GA7Bc;;AA+Bf,OAAK,aAAU,GAAV,EAAe;AAAA,QACV,WADU,GACmC,GADnC,CACV,WADU;AAAA,QACG,OADH,GACmC,GADnC,CACG,OADH;AAAA,QACY,MADZ,GACmC,GADnC,CACY,MADZ;AAAA,QACoB,UADpB,GACmC,GADnC,CACoB,UADpB;;AAElB,QAAM,OAAO,MAAM,MAAN,CAAa,EAAb,EAAiB,UAAjB,CAAb;AACA,QAAM,YAAY,KAAK,CAAL,GAAS,OAAO,CAAP,EAAU,CAArC;AACA,QAAM,YAAY,KAAK,CAAL,GAAS,OAAO,CAAP,EAAU,CAArC;;AAEA,QAAI,OAAJ,GAAc,MAAM,MAAN,CAAa,EAAb,EAAiB,OAAjB,CAAd;AACA,QAAI,OAAJ,CAAY,OAAZ,GAAsB,EAAtB;;AAEA,yBAAyB,QAAQ,OAAjC,kHAA0C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAA/B,UAA+B;;AACxC,UAAI,eAAJ;;AAEA,UAAI,MAAM,EAAN,CAAS,QAAT,CAAkB,UAAlB,CAAJ,EAAmC;AACjC,iBAAS,WAAW,SAAX,EAAsB,SAAtB,EAAiC,WAAjC,CAAT;AACD,OAFD,MAGK;AACH,iBAAS,UAAT;AACD;;AAED,UAAI,CAAC,MAAL,EAAa;AAAE;AAAW;;AAE1B,UAAI,WAAW,MAAX,IAAqB,YAAY,MAArC,EAA6C;AAC3C,eAAO,CAAP,GAAW,OAAO,KAAlB;AACA,eAAO,CAAP,GAAW,OAAO,MAAlB;AACD;;AAED,UAAI,OAAJ,CAAY,OAAZ,CAAoB,IAApB,CAAyB,MAAzB;AACD;;AAED,SAAK,GAAL,CAAS,GAAT;AACD,GA7Dc;;AA+Df,gBAAc,sBAAU,GAAV,EAAe;AAAA,QACnB,OADmB,GACP,GADO,CACnB,OADmB;;;AAG3B,QAAI,OAAJ,GAAc,MAAM,MAAN,CAAa,EAAb,EAAiB,OAAjB,CAAd;AACA,QAAI,OAAJ,CAAY,OAAZ,GAAsB,QAAQ,OAA9B;AACA,QAAI,OAAJ,CAAY,cAAZ,GAA6B,CAAC,IAAD,CAA7B;;AAEA,SAAK,YAAL,CAAkB,GAAlB;AACD;AAvEc,CAAjB;;AA0EA,UAAU,QAAV,GAAqB,QAArB;AACA,UAAU,KAAV,CAAgB,IAAhB,CAAqB,UAArB;;AAEA,eAAe,SAAf,CAAyB,QAAzB,GAAoC,SAAS,QAA7C;AACA,OAAO,QAAP,CAAgB,QAAhB,GAAoC,SAAS,QAA7C;;AAEA,OAAO,OAAP,GAAiB,QAAjB;;;;;;;ACzFA,IAAM,eAAe,QAAQ,uBAAR,CAArB;;AAEA,OAAO,OAAP;AACE,wBAAa,IAAb,EAAmB,OAAnB,EAA4B,KAA5B,EAAmC,WAAnC,EAAgD,WAAhD,EAA6D;AAAA;;AAC3D,iBAAa,aAAb,CAA2B,IAA3B,EAAiC,KAAjC;;AAEA,QAAI,UAAU,OAAd,EAAuB;AACrB,mBAAa,aAAb,CAA2B,IAA3B,EAAiC,OAAjC;AACD;;AAED,SAAK,WAAL,GAAmB,WAAnB;;AAEA,SAAK,SAAL,GAAqB,IAAI,IAAJ,GAAW,OAAX,EAArB;AACA,SAAK,aAAL,GAAqB,KAArB;AACA,SAAK,IAAL,GAAqB,IAArB;AACA,SAAK,SAAL,GAAqB,aAAa,YAAb,CAA0B,OAA1B,CAArB;AACA,SAAK,WAAL,GAAqB,aAAa,cAAb,CAA4B,OAA5B,CAArB;AACA,SAAK,MAAL,GAAqB,WAArB;AACA,SAAK,aAAL,GAAqB,IAArB;;AAEA,QAAI,SAAS,KAAb,EAAoB;AAClB,UAAM,eAAe,YAAY,eAAZ,CAA4B,OAA5B,CAArB;AACA,WAAK,EAAL,GAAU,KAAK,SAAL,GAAiB,YAAY,SAAZ,CAAsB,YAAtB,CAA3B;;AAEA,UAAM,WAAW,KAAK,SAAL,GAAiB,YAAY,OAA9C;;AAEA,WAAK,MAAL,GAAc,CAAC,EAAE,YAAY,OAAZ,IACZ,YAAY,OAAZ,CAAoB,IAApB,KAA6B,WADjB,IAEZ,YAAY,OAAZ,CAAoB,MAApB,KAA+B,KAAK,MAFxB,IAGZ,WAAW,GAHD,CAAf;AAID,KAVD,MAWK,IAAI,SAAS,WAAb,EAA0B;AAC7B,WAAK,EAAL,GAAU,QAAQ,SAAR,GAAoB,YAAY,OAA1C;AACD;AACF;;AAhCH,yBAkCE,cAlCF,iCAkC8C;AAAA,QAAvB,OAAuB,QAA1B,CAA0B;AAAA,QAAX,OAAW,QAAd,CAAc;;AAC1C,SAAK,KAAL,IAAgB,OAAhB;AACA,SAAK,KAAL,IAAgB,OAAhB;AACA,SAAK,OAAL,IAAgB,OAAhB;AACA,SAAK,OAAL,IAAgB,OAAhB;;AAEA,WAAO,IAAP;AACD,GAzCH;;AAAA,yBA2CE,SA3CF,6BA2CyC;AAAA,QAAvB,OAAuB,SAA1B,CAA0B;AAAA,QAAX,OAAW,SAAd,CAAc;;AACrC,SAAK,KAAL,IAAgB,OAAhB;AACA,SAAK,KAAL,IAAgB,OAAhB;AACA,SAAK,OAAL,IAAgB,OAAhB;AACA,SAAK,OAAL,IAAgB,OAAhB;;AAEA,WAAO,IAAP;AACD,GAlDH;;AAAA,yBAoDE,cApDF,6BAoDoB;AAChB,SAAK,aAAL,CAAmB,cAAnB;AACD,GAtDH;;AAAA,yBAwDE,eAxDF,8BAwDqB;AACjB,SAAK,kBAAL,GAA0B,IAA1B;AACD,GA1DH;;AAAA,yBA4DE,wBA5DF,uCA4D8B;AAC1B,SAAK,2BAAL,GAAmC,KAAK,kBAAL,GAA0B,IAA7D;AACD,GA9DH;;AAAA;AAAA;;;;;ACFA,IAAM,eAAe,QAAQ,gBAAR,CAArB;AACA,IAAM,cAAe,QAAQ,gBAAR,CAArB;AACA,IAAM,QAAe,QAAQ,UAAR,CAArB;AACA,IAAM,UAAe,QAAQ,kBAAR,CAArB;AACA,IAAM,WAAe,QAAQ,mBAAR,CAArB;AACA,IAAM,UAAe,QAAQ,kBAAR,EAA4B,GAA5B,EAArB;;eACqB,QAAQ,cAAR,C;IAAb,M,YAAA,M;;AAER,IAAM,gBAAgB,CAAE,MAAF,EAAU,IAAV,EAAgB,QAAhB,CAAtB;AACA,IAAM,eAAgB,CAAE,MAAF,EAAU,IAAV,EAAgB,QAAhB,CAAtB;;AAEA,IAAM,gBAAgB;AACpB,4BADoB;AAEpB,YAFoB;AAGpB,0CAHoB;AAIpB,kBAJoB;AAKpB,YAAU;AACR,kBAAc,GADN;AAER,gBAAc,IAFN;AAGR,eAAc,IAHN;AAIR,YAAc,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX;AAJN,GALU;AAWpB,SAAO,CACL,MADK,EAEL,MAFK,EAGL,IAHK,EAIL,QAJK,EAKL,KALK,EAML,WANK,EAOL,MAPK;AAXa,CAAtB;;AAsBA,SAAS,IAAT,CAAe,GAAf,EAAoB;AAAA,MAEhB,WAFgB,GAMd,GANc,CAEhB,WAFgB;AAAA,MAEH,OAFG,GAMd,GANc,CAEH,OAFG;AAAA,MAEM,KAFN,GAMd,GANc,CAEM,KAFN;AAAA,MAEa,WAFb,GAMd,GANc,CAEa,WAFb;AAAA,kBAMd,GANc,CAGhB,IAHgB;AAAA,MAGhB,IAHgB,6BAGT,IAAI,YAAJ,CAAiB,IAHR;AAAA,qBAMd,GANc,CAIhB,OAJgB;AAAA,MAIhB,OAJgB,gCAIN,oBAAoB,GAApB,CAJM;AAAA,0BAMd,GANc,CAKhB,YALgB;AAAA,MAKhB,YALgB,qCAKD,IAAI,YAAJ,CAAiB,IAAjB,EAAuB,OAAvB,EAAgC,KAAhC,EAAuC,WAAvC,EAAoD,WAApD,CALC;;;AAQlB,MAAM,YAAY;AAChB,4BADgB;AAEhB,oBAFgB;AAGhB,gBAHgB;AAIhB,4BAJgB;AAKhB,oBALgB;AAMhB,cANgB;AAOhB;AAPgB,GAAlB;;AAUA,OAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,QAAQ,MAA5B,EAAoC,GAApC,EAAyC;AACvC,QAAM,SAAS,QAAQ,CAAR,CAAf;;AAEA,SAAK,IAAM,IAAX,IAAmB,OAAO,KAAP,IAAgB,EAAnC,EAAuC;AACrC,mBAAa,IAAb,IAAqB,OAAO,KAAP,CAAa,IAAb,CAArB;AACD;;AAED,QAAM,SAAS,MAAM,WAAN,CAAkB,OAAO,SAAzB,EAAoC,OAAO,OAA3C,CAAf;;AAEA,iBAAa,cAAb,CAA4B,MAA5B;AACA,iBAAa,SAAb,GAAyB,OAAO,SAAhC;AACA,iBAAa,aAAb,GAA6B,OAAO,OAApC;;AAEA,WAAO,SAAP,CAAiB,IAAjB,CAAsB,YAAtB;;AAEA,iBAAa,SAAb,CAAuB,MAAvB;;AAEA,QAAI,aAAa,2BAAb,IACI,aAAa,kBAAb,IACI,IAAI,CAAL,GAAU,QAAQ,MADrB,IAC+B,QAAQ,IAAI,CAAZ,EAAe,OAAf,KAA2B,aAAa,aAF/E,EAE+F;AAC7F;AACD;AACF;;AAED,UAAQ,IAAR,CAAa,OAAb,EAAsB,SAAtB;;AAEA,MAAI,SAAS,KAAb,EAAoB;AAClB;AACA;AACA,QAAM,UAAU,aAAa,MAAb,GACZ,KAAK;AACL,8BADK,EACQ,gBADR,EACiB,YADjB,EACwB,wBADxB;AAEL,YAAM;AAFD,KAAL,CADY,GAKZ,YALJ;;AAOA,gBAAY,OAAZ,GAAsB,OAAtB;AACA,gBAAY,OAAZ,GAAsB,QAAQ,SAA9B;AACD;;AAED,SAAO,YAAP;AACD;;AAED,SAAS,mBAAT,OAAkF;AAAA,MAAlD,WAAkD,QAAlD,WAAkD;AAAA,MAArC,OAAqC,QAArC,OAAqC;AAAA,MAA5B,KAA4B,QAA5B,KAA4B;AAAA,MAArB,WAAqB,QAArB,WAAqB;AAAA,MAAR,IAAQ,QAAR,IAAQ;;AAChF,MAAM,eAAe,YAAY,eAAZ,CAA4B,OAA5B,CAArB;;AAEA;AACA,MAAI,SAAS,KAAT,KAAmB,YAAY;AAC/B;AADmB,KAEhB,EAAE,YAAY,WAAZ,CAAwB,YAAxB,KAAyC,YAAY,WAAZ,CAAwB,YAAxB,MAA0C,WAArF,CAFH,CAAJ,EAE2G;AACzG,WAAO,EAAP;AACD;;AAED,MAAM,OAAO,MAAM,OAAN,CAAc,WAAd,CAAb;AACA,MAAM,YAAY;AAChB,4BADgB;AAEhB,oBAFgB;AAGhB,gBAHgB;AAIhB,4BAJgB;AAKhB,cALgB;AAMhB,cANgB;AAOhB,aAAS,EAPO;AAQhB,aAAS;AARO,GAAlB;;AAWA,uBAAsB,IAAtB,kHAA4B;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,QAAjB,OAAiB;;AAC1B,cAAU,OAAV,GAAoB,OAApB;;AAEA,YAAQ,IAAR,CAAa,iBAAb,EAAgC,SAAhC;AACD;;AAED,MAAI,SAAS,MAAb,EAAqB;AACnB,cAAU,OAAV,GAAoB,OAAO,UAAU,OAAjB,EAA0B;AAAA,aAC5C,OAAO,SAAP,CAAiB,OAAjB,CAAyB,YAAzB,KAA0C,YAAY,UAAZ,CAAuB,YAAvB,EAAqC,QADnC;AAAA,KAA1B,CAApB;AAED;;AAED,SAAO,UAAU,OAAjB;AACD;;AAED,YAAY,OAAZ,CAAoB,EAApB,CAAuB,qBAAvB,EAA8C,iBAAyC;AAAA,MAA7B,WAA6B,SAA7B,WAA6B;AAAA,MAAhB,YAAgB,SAAhB,YAAgB;;AACrF,cAAY,UAAZ,CAAuB,YAAvB,IAAuC,EAAE,UAAU,QAAZ,EAAsB,SAAS,IAA/B,EAAvC;AACD,CAFD;;AAIA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,gBAAvB,EAAyC,iBAAyC;AAAA,MAA7B,WAA6B,SAA7B,WAA6B;AAAA,MAAhB,YAAgB,SAAhB,YAAgB;;AAChF,cAAY,UAAZ,CAAuB,MAAvB,CAA8B,YAA9B,EAA4C,CAA5C;AACD,CAFD;;AAIA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,MAAvB,EAA+B,iBAAuE;AAAA,MAA3D,WAA2D,SAA3D,WAA2D;AAAA,MAA9C,OAA8C,SAA9C,OAA8C;AAAA,MAArC,KAAqC,SAArC,KAAqC;AAAA,MAA9B,WAA8B,SAA9B,WAA8B;AAAA,MAAjB,aAAiB,SAAjB,aAAiB;;AACpG,MAAM,eAAe,YAAY,eAAZ,CAA4B,OAA5B,CAArB;;AAEA,MAAI,CAAC,aAAD,KAAmB,CAAC,YAAY,aAAb,IAA8B,YAAY,eAA7D,CAAJ,EAAmF;AACjF,QAAI,YAAY,aAAhB,EAA+B;AAC7B,mBAAa,YAAY,UAAZ,CAAuB,YAAvB,EAAqC,OAAlD;AACD;;AAED,SAAK;AACH,8BADG,EACU,gBADV,EACmB,YADnB,EAC0B,wBAD1B;AAEH,YAAM;AAFH,KAAL;AAID;AACF,CAbD;;AAeA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,MAAvB,EAA+B,iBAAsE;AAAA,MAA1D,WAA0D,SAA1D,WAA0D;AAAA,MAA7C,OAA6C,SAA7C,OAA6C;AAAA,MAApC,KAAoC,SAApC,KAAoC;AAAA,MAA7B,WAA6B,SAA7B,WAA6B;AAAA,MAAhB,YAAgB,SAAhB,YAAgB;;AACnG;AACA,MAAM,YAAY,QAAQ,KAAR,GAAe,MAAM,MAAN,CAAa,EAAb,EAAiB,KAAjB,CAAf,GAAyC,KAA3D;;AAEA,MAAM,QAAQ,YAAY,UAAZ,CAAuB,YAAvB,CAAd;AACA,MAAM,OAAO,MAAM,OAAN,CAAc,WAAd,CAAb;AACA,MAAM,YAAY;AAChB,4BADgB;AAEhB,oBAFgB;AAGhB,gBAHgB;AAIhB,4BAJgB;AAKhB,UAAM,MALU;AAMhB,aAAS,EANO;AAOhB,cAPgB;AAQhB,aAAS;AARO,GAAlB;;AAWA,wBAAsB,IAAtB,yHAA4B;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,QAAjB,OAAiB;;AAC1B,cAAU,OAAV,GAAoB,OAApB;;AAEA,YAAQ,IAAR,CAAa,iBAAb,EAAgC,SAAhC;AACD;;AAED,MAAI,CAAC,UAAU,OAAV,CAAkB,MAAvB,EAA+B;AAAE;AAAS;;AAE1C,MAAI,cAAc,QAAlB;;AAEA,OAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,UAAU,OAAV,CAAkB,MAAtC,EAA8C,GAA9C,EAAmD;AACjD,QAAM,SAAS,UAAU,OAAV,CAAkB,CAAlB,CAAf;AACA,QAAM,eAAe,OAAO,SAAP,CAAiB,OAAjB,CAAyB,YAA9C;;AAEA,QAAI,eAAe,WAAnB,EAAgC;AAC9B,oBAAc,YAAd;AACD;AACF;;AAED,QAAM,QAAN,GAAiB,WAAjB;AACA,QAAM,OAAN,GAAgB,WAAW,YAAY;AACrC,SAAK;AACH,8BADG;AAEH,8BAFG;AAGH,eAAS,QAAQ,KAAR,GAAe,SAAf,GAA2B,OAHjC;AAIH,aAAO,SAJJ;AAKH,YAAM;AALH,KAAL;AAOD,GARe,EAQb,WARa,CAAhB;AASD,CA9CD;;AAgDA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,IAAvB,EAA6B,iBAAkD;AAAA,MAA/C,WAA+C,SAA/C,WAA+C;AAAA,MAAlC,OAAkC,SAAlC,OAAkC;AAAA,MAAzB,KAAyB,SAAzB,KAAyB;AAAA,MAAlB,WAAkB,SAAlB,WAAkB;;AAC7E,MAAI,CAAC,YAAY,eAAjB,EAAkC;AAChC,SAAK,EAAE,wBAAF,EAAe,wBAAf,EAA4B,gBAA5B,EAAqC,YAArC,EAA4C,MAAM,KAAlD,EAAL;AACD;AACF,CAJD;;AAMA,CAAC,IAAD,EAAO,QAAP,EAAiB,OAAjB,CAAyB,UAAU,UAAV,EAAsB;AAC7C,cAAY,OAAZ,CAAoB,EAApB,CAAuB,UAAvB,EAAmC,iBAAyC;AAAA,QAA7B,WAA6B,SAA7B,WAA6B;AAAA,QAAhB,YAAgB,SAAhB,YAAgB;;AAC1E,QAAI,YAAY,UAAZ,CAAuB,YAAvB,CAAJ,EAA0C;AACxC,mBAAa,YAAY,UAAZ,CAAuB,YAAvB,EAAqC,OAAlD;AACD;AACF,GAJD;AAKD,CAND;;AAQA,SAAS,oBAAT,CAA+B,IAA/B,EAAqC;AACnC,SAAO,kBAAwD;AAAA,QAA5C,WAA4C,UAA5C,WAA4C;AAAA,QAA/B,OAA+B,UAA/B,OAA+B;AAAA,QAAtB,KAAsB,UAAtB,KAAsB;AAAA,QAAf,WAAe,UAAf,WAAe;;AAC7D,SAAK,EAAE,wBAAF,EAAe,wBAAf,EAA4B,gBAA5B,EAAqC,YAArC,EAA4C,UAA5C,EAAL;AACD,GAFD;AAGD;;AAED,KAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,cAAc,MAAlC,EAA0C,GAA1C,EAA+C;AAC7C,cAAY,OAAZ,CAAoB,EAApB,CAAuB,cAAc,CAAd,CAAvB,EAAyC,qBAAqB,aAAa,CAAb,CAArB,CAAzC;AACD;;AAED,YAAY,OAAZ,CAAoB,EAApB,CAAuB,KAAvB,EAA8B,UAAU,WAAV,EAAuB;AACnD,cAAY,OAAZ,GAAyB,IAAzB,CADmD,CACnB;AAChC,cAAY,OAAZ,GAAyB,CAAzB,CAFmD,CAEnB;AAChC,cAAY,UAAZ,GAAyB,EAAzB,CAHmD,CAGnB;AACjC,CAJD;;AAMA,SAAS,aAAT,GAAyB,cAAc,QAAvC;AACA,OAAO,OAAP,GAAiB,aAAjB;;;;;ACxOA,IAAM,gBAAgB,QAAQ,QAAR,CAAtB;AACA,IAAM,cAAgB,QAAQ,gBAAR,CAAtB;;AAEA,cAAc,OAAd,CAAsB,EAAtB,CAAyB,KAAzB,EAAgC,KAAhC;AACA,cAAc,OAAd,CAAsB,EAAtB,CAAyB,OAAzB,EAAkC,OAAlC;;WAEqB,CAAC,MAAD,EAAS,IAAT,EAAe,QAAf,EAAyB,QAAzB,C;AAArB,yCAAyD;AAApD,MAAM,iBAAN;AACH,cAAY,OAAZ,CAAoB,EAApB,CAAuB,MAAvB,EAA+B,aAA/B;AACD;;AAED,SAAS,KAAT,OAAkC;AAAA,MAAhB,YAAgB,QAAhB,YAAgB;;AAChC,MAAI,aAAa,IAAb,KAAsB,MAA1B,EAAkC;AAAE;AAAS;;AAE7C,eAAa,KAAb,GAAqB,CAAC,aAAa,KAAb,IAAsB,CAAvB,IAA4B,CAAjD;AACD;;AAED,SAAS,OAAT,QAAuE;AAAA,MAAnD,WAAmD,SAAnD,WAAmD;AAAA,MAAtC,YAAsC,SAAtC,YAAsC;AAAA,MAAxB,WAAwB,SAAxB,WAAwB;AAAA,MAAX,OAAW,SAAX,OAAW;;AACrE,MAAI,aAAa,IAAb,KAAsB,MAAtB,IAAgC,CAAC,QAAQ,MAA7C,EAAqD;AAAE;AAAS;;AAEhE;AACA,MAAM,WAAW,QAAQ,CAAR,EAAW,SAAX,CAAqB,OAArB,CAA6B,kBAA9C;;AAEA;AACA,MAAI,YAAY,CAAhB,EAAmB;AAAE;AAAS;;AAE9B;AACA,cAAY,kBAAZ,GAAiC,WAAW,YAAY;AACtD,kBAAc,IAAd,CAAmB;AACjB,8BADiB;AAEjB,8BAFiB;AAGjB,YAAM,MAHW;AAIjB,eAAS,YAJQ;AAKjB,aAAO;AALU,KAAnB;AAOD,GARgC,EAQ9B,QAR8B,CAAjC;AASD;;AAED,SAAS,aAAT,QAAyC;AAAA,MAAf,WAAe,SAAf,WAAe;;AACvC;AACA;AACA,MAAI,YAAY,kBAAhB,EAAoC;AAClC,kBAAc,YAAY,kBAA1B;AACA,gBAAY,kBAAZ,GAAiC,IAAjC;AACD;AACF;;AAED;AACA,cAAc,QAAd,CAAuB,kBAAvB,GAA4C,CAA5C;AACA,cAAc,KAAd,CAAoB,IAApB,CAAyB,YAAzB;;AAEA,OAAO,OAAP,GAAiB;AACf,cADe;AAEf,kBAFe;AAGf;AAHe,CAAjB;;;;;AClDA,IAAM,gBAAgB,QAAQ,QAAR,CAAtB;AACA,IAAM,eAAgB,QAAQ,iBAAR,CAAtB;AACA,IAAM,UAAgB,QAAQ,kBAAR,CAAtB;AACA,IAAM,KAAgB,QAAQ,aAAR,CAAtB;AACA,IAAM,WAAgB,QAAQ,mBAAR,CAAtB;AACA,IAAM,QAAgB,QAAQ,UAAR,CAAtB;AACA,IAAM,SAAgB,QAAQ,iBAAR,CAAtB;;eACsB,QAAQ,cAAR,C;IAAd,K,YAAA,K;;AAER,cAAc,OAAd,CAAsB,EAAtB,CAAyB,iBAAzB,EAA4C,gBAAmD;AAAA,MAAvC,OAAuC,QAAvC,OAAuC;AAAA,MAA9B,OAA8B,QAA9B,OAA8B;AAAA,MAArB,IAAqB,QAArB,IAAqB;AAAA,MAAf,WAAe,QAAf,WAAe;;AAC7F,WAAS,gBAAT,CAA2B,YAA3B,EAAyC,QAAzC,EAAmD,OAAnD,EAA4D;AAC1D,QAAM,MAAM,QAAQ,0BAAR,GACN,QAAQ,gBAAR,CAAyB,QAAzB,CADM,GAEN,SAFN;;AAIA,QAAM,YAAY,aAAa,MAA/B;AACA,QAAM,UAAU,UAAU,OAA1B;;AAEA,QAAI,UAAU,IAAV,KACG,GAAG,OAAH,CAAW,OAAX,CADH,IAEG,SAAS,eAAT,CAAyB,OAAzB,EAAkC,QAAlC,EAA4C,GAA5C,CAFH,IAGG,aAAa,eAAb,CAA6B,OAA7B,EAAsC,OAAtC,EAA+C,WAA/C,CAHP,EAGoE;;AAElE,cAAQ,IAAR,CAAa;AACX,wBADW;AAEX,4BAFW;AAGX,eAAO,EAAE,0BAAF;AAHI,OAAb;AAKD;AACF;;AAED,MAAM,eAAe,MAAM,aAAN,CAAoB,GAApB,CAAwB,OAAxB,CAArB;;AAEA,MAAI,YAAJ,EAAkB;AAChB,QAAM,YAAY,aAAa,MAA/B;AACA,QAAM,UAAU,UAAU,OAA1B;;AAEA,QAAI,UAAU,IAAV,KACG,aAAa,eAAb,CAA6B,OAA7B,EAAsC,OAAtC,EAA+C,WAA/C,CADP,EACoE;AAClE,cAAQ,IAAR,CAAa;AACX,wBADW;AAEX,4BAFW;AAGX,eAAO,EAAE,0BAAF;AAHI,OAAb;AAKD;AACF;;AAED,QAAM,aAAN,CAAoB,eAApB,CAAoC,gBAApC,EAAsD,OAAtD;AACD,CAvCD;;AAyCA,aAAa,OAAb,CAAqB,EAArB,CAAwB,KAAxB,EAA+B,iBAA4B;AAAA,MAAhB,YAAgB,SAAhB,YAAgB;;AACzD,eAAa,MAAb,CAAoB,OAApB,GAA8B,UAAU,OAAV,EAAmB;AAC/C,WAAO,aAAa,OAAb,CAAqB,OAArB,CAAP;AACD,GAFD;AAGD,CAJD;;AAMA,aAAa,OAAb,CAAqB,EAArB,CAAwB,KAAxB,EAA+B,iBAAqC;AAAA,MAAzB,YAAyB,SAAzB,YAAyB;AAAA,MAAX,OAAW,SAAX,OAAW;;AAClE,SAAO,aAAa,MAAb,CAAoB,OAA3B,EAAoC,cAAc,QAAlD;AACA,SAAO,aAAa,MAAb,CAAoB,OAA3B,EAAoC,OAApC;AACD,CAHD;;AAKA,MAAM,aAAa,UAAnB,EAA+B,cAAc,KAA7C;;AAEA,aAAa,SAAb,CAAuB,aAAvB,GAAuC,UAAU,OAAV,EAAmB;AACxD,SAAO,KAAK,MAAL,CAAY,OAAnB,EAA4B,OAA5B;;AAEA,SAAO,IAAP;AACD,CAJD;;AAMA,IAAM,qBAAqB,aAAa,SAAb,CAAuB,iBAAlD;;AAEA,aAAa,SAAb,CAAuB,iBAAvB,GAA2C,UAAU,UAAV,EAAsB,QAAtB,EAAgC;AACzE,MAAM,MAAM,mBAAmB,IAAnB,CAAwB,IAAxB,EAA8B,UAA9B,EAA0C,QAA1C,CAAZ;;AAEA,MAAI,QAAQ,IAAZ,EAAkB;AAChB,SAAK,MAAL,CAAY,OAAZ,CAAoB,UAApB,IAAkC,QAAlC;AACD;;AAED,SAAO,GAAP;AACD,CARD;;AAUA,aAAa,eAAb,CAA6B,IAA7B,CAAkC,eAAlC;;;;;ACjFA,IAAM,QAAU,QAAQ,SAAR,CAAhB;AACA,IAAM,SAAU,QAAQ,gBAAR,CAAhB;AACA,IAAM,UAAU,QAAQ,iBAAR,EAA2B,GAA3B,EAAhB;;AAEA,IAAM,QAAQ;AACZ,kBADY;AAEZ,gBAFY;AAGZ,cAHY;;AAKZ;AACA,YAAU,QAAQ,oBAAR,EAA8B,QAN5B;AAOZ;AACA,aAAW,EARC;;AAUZ,eAAa,qBAAU,GAAV,EAAe,GAAf,EAAoB;AAC/B;AACA,QAAI,MAAM,QAAN,CAAe,MAAM,SAArB,EAAgC,GAAhC,CAAJ,EAA0C;AAAE,aAAO,KAAP;AAAe;;AAE3D,UAAM,OAAO,MAAM,SAAN,CAAgB,GAAhB,CAAb;;AAEA,UAAM,SAAN,CAAgB,IAAhB,CAAqB,GAArB;AACA,WAAO,SAAP,CAAiB,IAAjB,CAAsB,GAAtB;;AAEA;AACA;AACA,QAAI,QAAQ,MAAM,QAAlB,EAA4B;AAC1B,aAAO,GAAP,CAAW,GAAX,EAAgB,QAAhB,EAA0B,MAAM,cAAhC;AACD;;AAED,YAAQ,IAAR,CAAa,cAAb,EAA6B,EAAE,QAAF,EAAO,QAAP,EAA7B;AACD,GA1BW;;AA4BZ,kBAAgB,wBAAU,GAAV,EAAe,GAAf,EAAoB;AAClC,QAAM,QAAQ,MAAM,OAAN,CAAc,MAAM,SAApB,EAA+B,GAA/B,CAAd;;AAEA,UAAM,OAAO,MAAM,SAAN,CAAgB,GAAhB,CAAb;;AAEA,WAAO,MAAP,CAAc,GAAd,EAAmB,QAAnB,EAA6B,MAAM,cAAnC;;AAEA,UAAM,SAAN,CAAgB,MAAhB,CAAuB,KAAvB,EAA8B,CAA9B;AACA,WAAO,SAAP,CAAiB,MAAjB,CAAwB,KAAxB,EAA+B,CAA/B;;AAEA,YAAQ,IAAR,CAAa,iBAAb,EAAgC,EAAE,QAAF,EAAO,QAAP,EAAhC;AACD,GAvCW;;AAyCZ,kBAAgB,0BAAY;AAC1B,UAAM,cAAN,CAAqB,KAAK,QAA1B,EAAoC,IAApC;AACD;AA3CW,CAAd;;AA8CA,OAAO,OAAP,GAAiB,KAAjB;;;;;;;eClDoB,QAAQ,OAAR,C;IAAZ,O,YAAA,O;;IAEF,O;AACJ,qBAAe;AAAA;;AACb,SAAK,SAAL,GAAiB;AACf;AADe,KAAjB;AAGD;;oBAED,E,eAAI,I,EAAM,Q,EAAU;AAClB,QAAI,CAAC,KAAK,SAAL,CAAe,IAAf,CAAL,EAA2B;AACzB,WAAK,SAAL,CAAe,IAAf,IAAuB,CAAC,QAAD,CAAvB;AACA;AACD;;AAED,SAAK,SAAL,CAAe,IAAf,EAAqB,IAArB,CAA0B,QAA1B;AACD,G;;oBAED,G,gBAAK,I,EAAM,Q,EAAU;AACnB,QAAI,CAAC,KAAK,SAAL,CAAe,IAAf,CAAL,EAA2B;AAAE;AAAS;;AAEtC,QAAM,QAAQ,QAAQ,KAAK,SAAL,CAAe,IAAf,CAAR,EAA8B,QAA9B,CAAd;;AAEA,QAAI,UAAU,CAAC,CAAf,EAAkB;AAChB,WAAK,SAAL,CAAe,IAAf,EAAqB,MAArB,CAA4B,KAA5B,EAAmC,CAAnC;AACD;AACF,G;;oBAED,I,iBAAM,I,EAAM,G,EAAK;AACf,QAAM,kBAAkB,KAAK,SAAL,CAAe,IAAf,CAAxB;;AAEA,QAAI,CAAC,eAAL,EAAsB;AAAE;AAAS;;AAEjC,SAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,gBAAgB,MAApC,EAA4C,GAA5C,EAAiD;AAC/C,UAAI,gBAAgB,CAAhB,EAAmB,GAAnB,EAAwB,IAAxB,MAAkC,KAAtC,EAA6C;AAC3C;AACD;AACF;AACF,G;;;;;AAGH,QAAQ,GAAR,GAAc,YAAY;AACxB,SAAO,IAAI,OAAJ,EAAP;AACD,CAFD;;AAIA,OAAO,OAAP,GAAiB,OAAjB;;;;;AC7CA,SAAS,OAAT,CAAkB,KAAlB,EAAyB,MAAzB,EAAiC;AAC/B,OAAK,IAAI,IAAI,CAAR,EAAW,MAAM,MAAM,MAA5B,EAAoC,IAAI,GAAxC,EAA6C,GAA7C,EAAkD;AAChD,QAAI,MAAM,CAAN,MAAa,MAAjB,EAAyB;AACvB,aAAO,CAAP;AACD;AACF;;AAED,SAAO,CAAC,CAAR;AACD;;AAED,SAAS,QAAT,CAAmB,KAAnB,EAA0B,MAA1B,EAAkC;AAChC,SAAO,QAAQ,KAAR,EAAe,MAAf,MAA2B,CAAC,CAAnC;AACD;;AAED,SAAS,KAAT,CAAgB,MAAhB,EAAwB,MAAxB,EAAgC;AAC9B,OAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,OAAO,MAA3B,EAAmC,GAAnC,EAAwC;AACtC,WAAO,IAAP,CAAY,OAAO,CAAP,CAAZ;AACD;;AAED,SAAO,MAAP;AACD;;AAED,SAAS,MAAT,CAAiB,KAAjB,EAAwB,IAAxB,EAA8B;AAC5B,MAAM,SAAS,EAAf;;AAEA,OAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,MAAM,MAA1B,EAAkC,GAAlC,EAAuC;AACrC,QAAI,KAAK,MAAM,CAAN,CAAL,CAAJ,EAAoB;AAClB,aAAO,IAAP,CAAY,MAAM,CAAN,CAAZ;AACD;AACF;;AAED,SAAO,MAAP;AACD;;AAED,OAAO,OAAP,GAAiB;AACf,kBADe;AAEf,oBAFe;AAGf,cAHe;AAIf;AAJe,CAAjB;;;;;eClCmB,QAAQ,UAAR,C;IAAX,M,YAAA,M;;AACR,IAAM,KAAS,QAAQ,MAAR,CAAf;AACA,IAAM,aAAa,QAAQ,cAAR,CAAnB;;AAEA,IAAM,UAAU,WAAW,OAA3B;AACA,IAAM,YAAa,OAAO,SAA1B;;AAEA,IAAM,UAAU;AACd;AACA,iBAAe,CAAC,EAAG,kBAAkB,MAAnB,IAA8B,GAAG,QAAH,CAAY,OAAO,aAAnB,KAC1B,WAAW,QAAX,YAA+B,OAAO,aAD5C,CAFF;;AAKd;AACA,wBAAsB,CAAC,CAAC,WAAW,YANrB;;AAQd,SAAQ,iBAAiB,MAAlB,IAA6B,EAAE,sBAAsB,MAAxB,CARtB;;AAUd;AACA,iBAAgB,UAAU,OAAV,KAAsB,OAAtB,IACT,QAAQ,aADC,IAET,UAAU,SAAV,CAAoB,KAApB,CAA0B,QAA1B,CAbO;;AAed;AACA,UAAS,iBAAiB,IAAjB,CAAsB,UAAU,QAAhC,KACG,YAAY,IAAZ,CAAiB,UAAU,UAA3B,CAjBE;;AAmBd,gBAAc,aAAa,IAAb,CAAkB,UAAU,SAA5B,CAnBA;;AAqBd;AACA,2BAAyB,aAAa,QAAQ,SAArB,GACrB,SADqB,GACV,2BAA2B,QAAQ,SAAnC,GACX,uBADW,GACc,wBAAwB,QAAQ,SAAhC,GACzB,oBADyB,GACH,sBAAsB,QAAQ,SAA9B,GACtB,kBADsB,GACF,mBA1BV;;AA4Bd,8BAA4B,KA5Bd;;AA8Bd,eAAc,WAAW,YAAX,GACT,WAAW,YAAX,KAA4B,OAAO,cAAnC,GACC;AACA,QAAQ,aADR;AAEA,UAAQ,eAFR;AAGA,UAAQ,WAHR;AAIA,SAAQ,UAJR;AAKA,UAAQ,eALR;AAMA,YAAQ;AANR,GADD,GASC;AACA,QAAQ,WADR;AAEA,UAAQ,aAFR;AAGA,UAAQ,aAHR;AAIA,SAAQ,YAJR;AAKA,UAAQ,aALR;AAMA,YAAQ;AANR,GAVQ,GAkBV,IAhDU;;AAkDd;AACA,cAAY,kBAAkB,WAAW,QAA7B,GAAuC,YAAvC,GAAqD;;AAnDnD,CAAhB;;AAuDA,QAAQ,0BAAR,GAAqC,CAAC,GAAG,QAAH,CAAY,QAAQ,SAAR,CAAkB,QAAQ,uBAA1B,CAAZ,CAAtC;;AAEA,OAAO,OAAP,GAAiB,OAAjB;;;;;AChEA,IAAM,aAAa,EAAnB;AACA,IAAM,MAAM,QAAQ,UAAR,EAAoB,MAAhC;;AAEA,SAAS,KAAT,GAAkB,CAAE;;AAEpB,WAAW,QAAX,GAAgC,IAAI,QAApC;AACA,WAAW,gBAAX,GAAgC,IAAI,gBAAJ,IAA0B,KAA1D;AACA,WAAW,UAAX,GAAgC,IAAI,UAAJ,IAA0B,KAA1D;AACA,WAAW,aAAX,GAAgC,IAAI,aAAJ,IAA0B,KAA1D;AACA,WAAW,kBAAX,GAAgC,IAAI,kBAAJ,IAA0B,KAA1D;AACA,WAAW,OAAX,GAAgC,IAAI,OAAJ,IAA0B,KAA1D;AACA,WAAW,WAAX,GAAgC,IAAI,WAAJ,IAA0B,WAAW,OAArE;;AAEA,WAAW,KAAX,GAA0B,IAAI,KAA9B;AACA,WAAW,KAAX,GAA0B,IAAI,KAAJ,IAAa,KAAvC;AACA,WAAW,YAAX,GAA2B,IAAI,YAAJ,IAAoB,IAAI,cAAnD;;AAEA,OAAO,OAAP,GAAiB,UAAjB;;;;;ACjBA,IAAM,MAAa,QAAQ,UAAR,CAAnB;AACA,IAAM,UAAa,QAAQ,WAAR,CAAnB;AACA,IAAM,KAAa,QAAQ,MAAR,CAAnB;AACA,IAAM,aAAa,QAAQ,cAAR,CAAnB;;AAEA,IAAM,WAAW;AACf,gBAAc,sBAAU,MAAV,EAAkB,KAAlB,EAAyB;AACrC,WAAO,KAAP,EAAc;AACZ,UAAI,UAAU,MAAd,EAAsB;AACpB,eAAO,IAAP;AACD;;AAED,cAAQ,MAAM,UAAd;AACD;;AAED,WAAO,KAAP;AACD,GAXc;;AAaf,WAAS,iBAAU,OAAV,EAAmB,QAAnB,EAA6B;AACpC,WAAO,GAAG,OAAH,CAAW,OAAX,CAAP,EAA4B;AAC1B,UAAI,SAAS,eAAT,CAAyB,OAAzB,EAAkC,QAAlC,CAAJ,EAAiD;AAAE,eAAO,OAAP;AAAiB;;AAEpE,gBAAU,SAAS,UAAT,CAAoB,OAApB,CAAV;AACD;;AAED,WAAO,IAAP;AACD,GArBc;;AAuBf,cAAY,oBAAU,IAAV,EAAgB;AAC1B,QAAI,SAAS,KAAK,UAAlB;;AAEA,QAAI,GAAG,OAAH,CAAW,MAAX,CAAJ,EAAwB;AACtB;AACA,aAAO,CAAC,SAAS,OAAO,IAAjB,KAA0B,GAAG,OAAH,CAAW,MAAX,CAAjC,EAAqD;AACnD;AACD;;AAED,aAAO,MAAP;AACD;;AAED,WAAO,MAAP;AACD,GApCc;;AAsCf;AACA,2BAAyB,QAAQ,0BAAR,GACrB,UAAU,OAAV,EAAmB,QAAnB,EAA6B,KAA7B,EAAoC;AACpC,YAAQ,SAAS,QAAQ,UAAR,CAAmB,gBAAnB,CAAoC,QAApC,CAAjB;;AAEA,SAAK,IAAI,IAAI,CAAR,EAAW,MAAM,MAAM,MAA5B,EAAoC,IAAI,GAAxC,EAA6C,GAA7C,EAAkD;AAChD,UAAI,MAAM,CAAN,MAAa,OAAjB,EAA0B;AACxB,eAAO,IAAP;AACD;AACF;;AAED,WAAO,KAAP;AACD,GAXsB,GAYrB,IAnDW;;AAqDf,mBAAiB,yBAAU,OAAV,EAAmB,QAAnB,EAA6B,QAA7B,EAAuC;AACtD,QAAI,QAAQ,0BAAZ,EAAwC;AACtC,aAAO,SAAS,uBAAT,CAAiC,OAAjC,EAA0C,QAA1C,EAAoD,QAApD,CAAP;AACD;;AAED;AACA,QAAI,IAAI,MAAJ,KAAe,IAAI,UAAvB,EAAmC;AACjC,iBAAW,SAAS,OAAT,CAAiB,WAAjB,EAA8B,GAA9B,CAAX;AACD;;AAED,WAAO,QAAQ,QAAQ,uBAAhB,EAAyC,QAAzC,CAAP;AACD,GAhEc;;AAkEf;AACA,yBAAuB,+BAAU,QAAV,EAAoB;AACzC,QAAI,qBAAqB,EAAzB;AACA,QAAI,kBAAkB,EAAtB;AACA,QAAI,iBAAJ;AACA,QAAI,cAAc,SAAS,CAAT,CAAlB;AACA,QAAI,QAAQ,cAAa,CAAb,GAAgB,CAAC,CAA7B;AACA,QAAI,eAAJ;AACA,QAAI,cAAJ;AACA,QAAI,UAAJ;AACA,QAAI,UAAJ;;AAEA,SAAK,IAAI,CAAT,EAAY,IAAI,SAAS,MAAzB,EAAiC,GAAjC,EAAsC;AACpC,iBAAW,SAAS,CAAT,CAAX;;AAEA;AACA,UAAI,CAAC,QAAD,IAAa,aAAa,WAA9B,EAA2C;AACzC;AACD;;AAED,UAAI,CAAC,WAAL,EAAkB;AAChB,sBAAc,QAAd;AACA,gBAAQ,CAAR;AACA;AACD;;AAED;AACA;AACA,UAAI,SAAS,UAAT,KAAwB,SAAS,aAArC,EAAoD;AAClD;AACD;AACD;AAHA,WAIK,IAAI,YAAY,UAAZ,KAA2B,SAAS,aAAxC,EAAuD;AAC1D,wBAAc,QAAd;AACA,kBAAQ,CAAR;AACA;AACD;;AAED,UAAI,CAAC,mBAAmB,MAAxB,EAAgC;AAC9B,iBAAS,WAAT;AACA,eAAO,OAAO,UAAP,IAAqB,OAAO,UAAP,KAAsB,OAAO,aAAzD,EAAwE;AACtE,6BAAmB,OAAnB,CAA2B,MAA3B;AACA,mBAAS,OAAO,UAAhB;AACD;AACF;;AAED;AACA;AACA,UAAI,uBAAuB,WAAW,WAAlC,IACG,oBAAoB,WAAW,UADlC,IAEG,EAAE,oBAAoB,WAAW,aAAjC,CAFP,EAEwD;;AAEtD,YAAI,aAAa,YAAY,UAA7B,EAAyC;AACvC;AACD;;AAED,iBAAS,SAAS,eAAlB;AACD,OATD,MAUK;AACH,iBAAS,QAAT;AACD;;AAED,wBAAkB,EAAlB;;AAEA,aAAO,OAAO,UAAP,KAAsB,OAAO,aAApC,EAAmD;AACjD,wBAAgB,OAAhB,CAAwB,MAAxB;AACA,iBAAS,OAAO,UAAhB;AACD;;AAED,UAAI,CAAJ;;AAEA;AACA,aAAO,gBAAgB,CAAhB,KAAsB,gBAAgB,CAAhB,MAAuB,mBAAmB,CAAnB,CAApD,EAA2E;AACzE;AACD;;AAED,UAAM,UAAU,CACd,gBAAgB,IAAI,CAApB,CADc,EAEd,gBAAgB,CAAhB,CAFc,EAGd,mBAAmB,CAAnB,CAHc,CAAhB;;AAMA,cAAQ,QAAQ,CAAR,EAAW,SAAnB;;AAEA,aAAO,KAAP,EAAc;AACZ,YAAI,UAAU,QAAQ,CAAR,CAAd,EAA0B;AACxB,wBAAc,QAAd;AACA,kBAAQ,CAAR;AACA,+BAAqB,EAArB;;AAEA;AACD,SAND,MAOK,IAAI,UAAU,QAAQ,CAAR,CAAd,EAA0B;AAC7B;AACD;;AAED,gBAAQ,MAAM,eAAd;AACD;AACF;;AAED,WAAO,KAAP;AACD,GAvKc;;AAyKf,eAAa,qBAAU,OAAV,EAAmB,QAAnB,EAA6B,KAA7B,EAAoC;AAC/C,WAAO,GAAG,OAAH,CAAW,OAAX,CAAP,EAA4B;AAC1B,UAAI,SAAS,eAAT,CAAyB,OAAzB,EAAkC,QAAlC,CAAJ,EAAiD;AAC/C,eAAO,IAAP;AACD;;AAED,gBAAU,SAAS,UAAT,CAAoB,OAApB,CAAV;;AAEA,UAAI,YAAY,KAAhB,EAAuB;AACrB,eAAO,SAAS,eAAT,CAAyB,OAAzB,EAAkC,QAAlC,CAAP;AACD;AACF;;AAED,WAAO,KAAP;AACD,GAvLc;;AAyLf,oBAAkB,0BAAU,OAAV,EAAmB;AACnC,WAAQ,mBAAmB,WAAW,kBAA9B,GACJ,QAAQ,uBADJ,GAEJ,OAFJ;AAGD,GA7Lc;;AA+Lf,eAAa,qBAAU,cAAV,EAA0B;AACrC,qBAAiB,kBAAkB,IAAI,MAAvC;AACA,WAAO;AACL,SAAG,eAAe,OAAf,IAA0B,eAAe,QAAf,CAAwB,eAAxB,CAAwC,UADhE;AAEL,SAAG,eAAe,OAAf,IAA0B,eAAe,QAAf,CAAwB,eAAxB,CAAwC;AAFhE,KAAP;AAID,GArMc;;AAuMf,wBAAsB,8BAAU,OAAV,EAAmB;AACvC,QAAM,aAAc,mBAAmB,WAAW,UAA9B,GAChB,QAAQ,qBAAR,EADgB,GAEhB,QAAQ,cAAR,GAAyB,CAAzB,CAFJ;;AAIA,WAAO,cAAc;AACnB,YAAQ,WAAW,IADA;AAEnB,aAAQ,WAAW,KAFA;AAGnB,WAAQ,WAAW,GAHA;AAInB,cAAQ,WAAW,MAJA;AAKnB,aAAQ,WAAW,KAAX,IAAqB,WAAW,KAAX,GAAoB,WAAW,IALzC;AAMnB,cAAQ,WAAW,MAAX,IAAqB,WAAW,MAAX,GAAoB,WAAW;AANzC,KAArB;AAQD,GApNc;;AAsNf,kBAAgB,wBAAU,OAAV,EAAmB;AACjC,QAAM,aAAa,SAAS,oBAAT,CAA8B,OAA9B,CAAnB;;AAEA,QAAI,CAAC,QAAQ,MAAT,IAAmB,UAAvB,EAAmC;AACjC,UAAM,SAAS,SAAS,WAAT,CAAqB,IAAI,SAAJ,CAAc,OAAd,CAArB,CAAf;;AAEA,iBAAW,IAAX,IAAqB,OAAO,CAA5B;AACA,iBAAW,KAAX,IAAqB,OAAO,CAA5B;AACA,iBAAW,GAAX,IAAqB,OAAO,CAA5B;AACA,iBAAW,MAAX,IAAqB,OAAO,CAA5B;AACD;;AAED,WAAO,UAAP;AACD,GAnOc;;AAqOf,WAAS,iBAAU,OAAV,EAAmB;AAC1B,QAAM,OAAO,EAAb;;AAEA,WAAO,OAAP,EAAgB;AACd,WAAK,IAAL,CAAU,OAAV;AACA,gBAAU,SAAS,UAAT,CAAoB,OAApB,CAAV;AACD;;AAED,WAAO,IAAP;AACD,GA9Oc;;AAgPf,eAAa,4BAAS;AACpB,QAAI,CAAC,GAAG,MAAH,CAAU,KAAV,CAAL,EAAuB;AAAE,aAAO,KAAP;AAAe;;AAExC;AACA,eAAW,QAAX,CAAoB,aAApB,CAAkC,KAAlC;AACA,WAAO,IAAP;AACD;AAtPc,CAAjB;;AAyPA,OAAO,OAAP,GAAiB,QAAjB;;;;;AC9PA,IAAM,KAAO,QAAQ,MAAR,CAAb;AACA,IAAM,WAAW,QAAQ,YAAR,CAAjB;AACA,IAAM,UAAW,QAAQ,iBAAR,CAAjB;;eAE+B,QAAQ,UAAR,C;IAAvB,M,YAAA,M;IAAQ,S,YAAA,S;;gBACc,QAAQ,OAAR,C;IAAtB,O,aAAA,O;IAAS,Q,aAAA,Q;;AAEjB,IAAM,iBAAkB,iBAAiB,MAAlB,IAA6B,EAAE,sBAAsB,MAAxB,CAApD;AACA,IAAM,WAAiB,iBAAiB,aAAjB,GAAgC,kBAAvD;AACA,IAAM,cAAiB,iBAAiB,aAAjB,GAAgC,qBAAvD;AACA,IAAM,KAAiB,iBAAgB,IAAhB,GAAsB,EAA7C;;AAEA,IAAM,WAAoB,EAA1B;AACA,IAAM,UAAoB,EAA1B;AACA,IAAM,oBAAoB,EAA1B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAM,kBAAkB,EAAxB;;AAEA,IAAM,YAAY,EAAlB;;AAEA,IAAM,kBAAkB,CAAC,cAAD,IAAoB,YAAM;AAChD,MAAI,YAAY,KAAhB;;AAEA,SAAO,QAAP,CAAgB,aAAhB,CAA8B,KAA9B,EAAqC,gBAArC,CAAsD,MAAtD,EAA8D,IAA9D,EAAoE;AAClE,QAAI,OAAJ,GAAe;AAAE,kBAAY,IAAZ;AAAmB;AAD8B,GAApE;;AAIA,SAAO,SAAP;AACD,CAR0C,EAA3C;;AAUA,SAAS,GAAT,CAAc,OAAd,EAAuB,IAAvB,EAA6B,QAA7B,EAAuC,WAAvC,EAAoD;AAClD,MAAM,UAAU,WAAW,WAAX,CAAhB;AACA,MAAI,eAAe,QAAQ,QAAR,EAAkB,OAAlB,CAAnB;AACA,MAAI,SAAS,QAAQ,YAAR,CAAb;;AAEA,MAAI,CAAC,MAAL,EAAa;AACX,aAAS;AACP,cAAQ,EADD;AAEP,iBAAW;AAFJ,KAAT;;AAKA,mBAAe,SAAS,IAAT,CAAc,OAAd,IAAyB,CAAxC;AACA,YAAQ,IAAR,CAAa,MAAb;;AAEA,sBAAkB,IAAlB,CAAuB,iBACnB;AACA,gBAAU,EADV;AAEA,eAAU,EAFV;AAGA,gBAAU;AAHV,KADmB,GAMnB,IANJ;AAOD;;AAED,MAAI,CAAC,OAAO,MAAP,CAAc,IAAd,CAAL,EAA0B;AACxB,WAAO,MAAP,CAAc,IAAd,IAAsB,EAAtB;AACA,WAAO,SAAP;AACD;;AAED,MAAI,CAAC,SAAS,OAAO,MAAP,CAAc,IAAd,CAAT,EAA8B,QAA9B,CAAL,EAA8C;AAC5C,QAAI,YAAJ;;AAEA,QAAI,cAAJ,EAAoB;AAAA,kCACsB,kBAAkB,YAAlB,CADtB;AAAA,UACV,QADU,yBACV,QADU;AAAA,UACA,OADA,yBACA,OADA;AAAA,UACS,QADT,yBACS,QADT;;AAElB,UAAM,gBAAgB,QAAQ,QAAR,EAAkB,QAAlB,CAAtB;;AAEA,UAAM,kBAAkB,QAAQ,aAAR,KAA0B,UAAU,KAAV,EAAiB;AACjE,YAAI,CAAC,MAAM,2BAAX,EAAwC;AACtC,gBAAM,MAAN,GAAe,MAAM,UAArB;AACA,gBAAM,aAAN,GAAsB,OAAtB;;AAEA,gBAAM,cAAN,GAAiC,MAAM,cAAN,IAAkC,UAAnE;AACA,gBAAM,eAAN,GAAiC,MAAM,eAAN,IAAkC,QAAnE;AACA,gBAAM,wBAAN,GAAiC,MAAM,wBAAN,IAAkC,WAAnE;;AAEA,cAAI,cAAc,IAAd,CAAmB,MAAM,IAAzB,CAAJ,EAAoC;AAClC,kBAAM,KAAN,GAAc,MAAM,OAAN,GAAgB,UAAU,OAAV,EAAmB,QAAnB,CAA4B,eAA5B,CAA4C,UAA1E;AACA,kBAAM,KAAN,GAAc,MAAM,OAAN,GAAgB,UAAU,OAAV,EAAmB,QAAnB,CAA4B,eAA5B,CAA4C,SAA1E;AACD;;AAED,mBAAS,KAAT;AACD;AACF,OAhBD;;AAkBA,YAAM,QAAQ,QAAR,EAAkB,KAAK,IAAvB,EAA6B,eAA7B,EAA8C,CAAC,CAAC,QAAQ,OAAxD,CAAN;;AAEA,UAAI,kBAAkB,CAAC,CAAvB,EAA0B;AACxB,iBAAS,IAAT,CAAc,QAAd;AACA,gBAAQ,IAAR,CAAa,eAAb;AACA,iBAAS,IAAT,CAAc,CAAd;AACD,OAJD,MAKK;AACH,iBAAS,aAAT;AACD;AACF,KAhCD,MAiCK;AACH,YAAM,QAAQ,QAAR,EAAkB,IAAlB,EAAwB,QAAxB,EAAkC,kBAAiB,OAAjB,GAA2B,CAAC,CAAC,QAAQ,OAAvE,CAAN;AACD;AACD,WAAO,MAAP,CAAc,IAAd,EAAoB,IAApB,CAAyB,QAAzB;;AAEA,WAAO,GAAP;AACD;AACF;;AAED,SAAS,MAAT,CAAiB,OAAjB,EAA0B,IAA1B,EAAgC,QAAhC,EAA0C,WAA1C,EAAuD;AACrD,MAAM,UAAU,WAAW,WAAX,CAAhB;AACA,MAAM,eAAe,QAAQ,QAAR,EAAkB,OAAlB,CAArB;AACA,MAAM,SAAS,QAAQ,YAAR,CAAf;;AAEA,MAAI,CAAC,MAAD,IAAW,CAAC,OAAO,MAAvB,EAA+B;AAC7B;AACD;;AAED,MAAI,kBAAkB,QAAtB;AACA,MAAI,kBAAJ;AACA,MAAI,sBAAJ;;AAEA,MAAI,cAAJ,EAAoB;AAClB,gBAAY,kBAAkB,YAAlB,CAAZ;AACA,oBAAgB,QAAQ,UAAU,QAAlB,EAA4B,QAA5B,CAAhB;AACA,sBAAkB,UAAU,OAAV,CAAkB,aAAlB,CAAlB;AACD;;AAED,MAAI,SAAS,KAAb,EAAoB;AAClB,SAAK,IAAL,IAAa,OAAO,MAApB,EAA4B;AAC1B,UAAI,OAAO,MAAP,CAAc,cAAd,CAA6B,IAA7B,CAAJ,EAAwC;AACtC,eAAO,OAAP,EAAgB,IAAhB,EAAsB,KAAtB;AACD;AACF;AACD;AACD;;AAED,MAAI,OAAO,MAAP,CAAc,IAAd,CAAJ,EAAyB;AACvB,QAAM,MAAM,OAAO,MAAP,CAAc,IAAd,EAAoB,MAAhC;;AAEA,QAAI,aAAa,KAAjB,EAAwB;AACtB,WAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,GAApB,EAAyB,GAAzB,EAA8B;AAC5B,eAAO,OAAP,EAAgB,IAAhB,EAAsB,OAAO,MAAP,CAAc,IAAd,EAAoB,CAApB,CAAtB,EAA8C,OAA9C;AACD;AACD;AACD,KALD,MAMK;AACH,WAAK,IAAI,KAAI,CAAb,EAAgB,KAAI,GAApB,EAAyB,IAAzB,EAA8B;AAC5B,YAAI,OAAO,MAAP,CAAc,IAAd,EAAoB,EAApB,MAA2B,QAA/B,EAAyC;AACvC,kBAAQ,WAAR,EAAqB,KAAK,IAA1B,EAAgC,eAAhC,EAAiD,kBAAiB,OAAjB,GAA2B,CAAC,CAAC,QAAQ,OAAtF;AACA,iBAAO,MAAP,CAAc,IAAd,EAAoB,MAApB,CAA2B,EAA3B,EAA8B,CAA9B;;AAEA,cAAI,kBAAkB,SAAtB,EAAiC;AAC/B,sBAAU,QAAV,CAAmB,aAAnB;AACA,gBAAI,UAAU,QAAV,CAAmB,aAAnB,MAAsC,CAA1C,EAA6C;AAC3C,wBAAU,QAAV,CAAmB,MAAnB,CAA0B,aAA1B,EAAyC,CAAzC;AACA,wBAAU,OAAV,CAAkB,MAAlB,CAAyB,aAAzB,EAAwC,CAAxC;AACA,wBAAU,QAAV,CAAmB,MAAnB,CAA0B,aAA1B,EAAyC,CAAzC;AACD;AACF;;AAED;AACD;AACF;AACF;;AAED,QAAI,OAAO,MAAP,CAAc,IAAd,KAAuB,OAAO,MAAP,CAAc,IAAd,EAAoB,MAApB,KAA+B,CAA1D,EAA6D;AAC3D,aAAO,MAAP,CAAc,IAAd,IAAsB,IAAtB;AACA,aAAO,SAAP;AACD;AACF;;AAED,MAAI,CAAC,OAAO,SAAZ,EAAuB;AACrB,YAAQ,MAAR,CAAe,YAAf,EAA6B,CAA7B;AACA,aAAS,MAAT,CAAgB,YAAhB,EAA8B,CAA9B;AACA,sBAAkB,MAAlB,CAAyB,YAAzB,EAAuC,CAAvC;AACD;AACF;;AAED,SAAS,WAAT,CAAsB,QAAtB,EAAgC,OAAhC,EAAyC,IAAzC,EAA+C,QAA/C,EAAyD,WAAzD,EAAsE;AACpE,MAAM,UAAU,WAAW,WAAX,CAAhB;AACA,MAAI,CAAC,gBAAgB,IAAhB,CAAL,EAA4B;AAC1B,oBAAgB,IAAhB,IAAwB;AACtB,iBAAW,EADW;AAEtB,gBAAW,EAFW;AAGtB,iBAAW;AAHW,KAAxB;;AAMA;AACA,SAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,UAAU,MAA9B,EAAsC,GAAtC,EAA2C;AACzC,UAAI,UAAU,CAAV,CAAJ,EAAkB,IAAlB,EAAwB,gBAAxB;AACA,UAAI,UAAU,CAAV,CAAJ,EAAkB,IAAlB,EAAwB,kBAAxB,EAA4C,IAA5C;AACD;AACF;;AAED,MAAM,YAAY,gBAAgB,IAAhB,CAAlB;AACA,MAAI,cAAJ;;AAEA,OAAK,QAAQ,UAAU,SAAV,CAAoB,MAApB,GAA6B,CAA1C,EAA6C,SAAS,CAAtD,EAAyD,OAAzD,EAAkE;AAChE,QAAI,UAAU,SAAV,CAAoB,KAApB,MAA+B,QAA/B,IACG,UAAU,QAAV,CAAmB,KAAnB,MAA8B,OADrC,EAC8C;AAC5C;AACD;AACF;;AAED,MAAI,UAAU,CAAC,CAAf,EAAkB;AAChB,YAAQ,UAAU,SAAV,CAAoB,MAA5B;;AAEA,cAAU,SAAV,CAAoB,IAApB,CAAyB,QAAzB;AACA,cAAU,QAAV,CAAoB,IAApB,CAAyB,OAAzB;AACA,cAAU,SAAV,CAAoB,IAApB,CAAyB,EAAzB;AACD;;AAED;AACA,YAAU,SAAV,CAAoB,KAApB,EAA2B,IAA3B,CAAgC,CAAC,QAAD,EAAW,CAAC,CAAC,QAAQ,OAArB,EAA8B,QAAQ,OAAtC,CAAhC;AACD;;AAED,SAAS,cAAT,CAAyB,QAAzB,EAAmC,OAAnC,EAA4C,IAA5C,EAAkD,QAAlD,EAA4D,WAA5D,EAAyE;AACvE,MAAM,UAAU,WAAW,WAAX,CAAhB;AACA,MAAM,YAAY,gBAAgB,IAAhB,CAAlB;AACA,MAAI,aAAa,KAAjB;AACA,MAAI,cAAJ;;AAEA,MAAI,CAAC,SAAL,EAAgB;AAAE;AAAS;;AAE3B;AACA,OAAK,QAAQ,UAAU,SAAV,CAAoB,MAApB,GAA6B,CAA1C,EAA6C,SAAS,CAAtD,EAAyD,OAAzD,EAAkE;AAChE;AACA,QAAI,UAAU,SAAV,CAAoB,KAApB,MAA+B,QAA/B,IACG,UAAU,QAAV,CAAmB,KAAnB,MAA8B,OADrC,EAC8C;;AAE5C,UAAM,YAAY,UAAU,SAAV,CAAoB,KAApB,CAAlB;;AAEA;AACA,WAAK,IAAI,IAAI,UAAU,MAAV,GAAmB,CAAhC,EAAmC,KAAK,CAAxC,EAA2C,GAA3C,EAAgD;AAAA,2BACf,UAAU,CAAV,CADe;AAAA,YACvC,EADuC;AAAA,YACnC,OADmC;AAAA,YAC1B,OAD0B;;AAG9C;;AACA,YAAI,OAAO,QAAP,IAAmB,YAAY,CAAC,CAAC,QAAQ,OAAzC,IAAoD,YAAY,QAAQ,OAA5E,EAAqF;AACnF;AACA,oBAAU,MAAV,CAAiB,CAAjB,EAAoB,CAApB;;AAEA;AACA;AACA,cAAI,CAAC,UAAU,MAAf,EAAuB;AACrB,sBAAU,SAAV,CAAoB,MAApB,CAA2B,KAA3B,EAAkC,CAAlC;AACA,sBAAU,QAAV,CAAoB,MAApB,CAA2B,KAA3B,EAAkC,CAAlC;AACA,sBAAU,SAAV,CAAoB,MAApB,CAA2B,KAA3B,EAAkC,CAAlC;;AAEA;AACA,mBAAO,OAAP,EAAgB,IAAhB,EAAsB,gBAAtB;AACA,mBAAO,OAAP,EAAgB,IAAhB,EAAsB,kBAAtB,EAA0C,IAA1C;;AAEA;AACA,gBAAI,CAAC,UAAU,SAAV,CAAoB,MAAzB,EAAiC;AAC/B,8BAAgB,IAAhB,IAAwB,IAAxB;AACD;AACF;;AAED;AACA,uBAAa,IAAb;AACA;AACD;AACF;;AAED,UAAI,UAAJ,EAAgB;AAAE;AAAQ;AAC3B;AACF;AACF;;AAED;AACA;AACA,SAAS,gBAAT,CAA2B,KAA3B,EAAkC,WAAlC,EAA+C;AAC7C,MAAM,UAAU,WAAW,WAAX,CAAhB;AACA,MAAM,YAAY,EAAlB;AACA,MAAM,YAAY,gBAAgB,MAAM,IAAtB,CAAlB;AACA,MAAM,cAAe,SAAS,gBAAT,CAA0B,MAAM,IAAN,GAC3C,MAAM,IAAN,CAAW,CAAX,CAD2C,GAE3C,MAAM,MAFW,CAArB;AAGA,MAAI,UAAU,WAAd;;AAEA;AACA,UAAQ,SAAR,EAAmB,KAAnB;;AAEA,YAAU,aAAV,GAA0B,KAA1B;AACA,YAAU,cAAV,GAA2B,sBAA3B;;AAEA;AACA,SAAO,GAAG,OAAH,CAAW,OAAX,CAAP,EAA4B;AAC1B,SAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,UAAU,SAAV,CAAoB,MAAxC,EAAgD,GAAhD,EAAqD;AACnD,UAAM,WAAW,UAAU,SAAV,CAAoB,CAApB,CAAjB;AACA,UAAM,UAAU,UAAU,QAAV,CAAmB,CAAnB,CAAhB;;AAEA,UAAI,SAAS,eAAT,CAAyB,OAAzB,EAAkC,QAAlC,KACG,SAAS,YAAT,CAAsB,OAAtB,EAA+B,WAA/B,CADH,IAEG,SAAS,YAAT,CAAsB,OAAtB,EAA+B,OAA/B,CAFP,EAEgD;;AAE9C,YAAM,YAAY,UAAU,SAAV,CAAoB,CAApB,CAAlB;;AAEA,kBAAU,aAAV,GAA0B,OAA1B;;AAEA,aAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,UAAU,MAA9B,EAAsC,GAAtC,EAA2C;AAAA,6BACV,UAAU,CAAV,CADU;AAAA,cAClC,EADkC;AAAA,cAC9B,OAD8B;AAAA,cACrB,OADqB;;;AAGzC,cAAI,YAAY,CAAC,CAAC,QAAQ,OAAtB,IAAiC,YAAY,QAAQ,OAAzD,EAAkE;AAChE,eAAG,SAAH;AACD;AACF;AACF;AACF;;AAED,cAAU,SAAS,UAAT,CAAoB,OAApB,CAAV;AACD;AACF;;AAED,SAAS,kBAAT,CAA6B,KAA7B,EAAoC;AAClC,SAAO,iBAAiB,IAAjB,CAAsB,IAAtB,EAA4B,KAA5B,EAAmC,IAAnC,CAAP;AACD;;AAED,SAAS,UAAT,GAAuB;AACrB,OAAK,WAAL,GAAmB,KAAnB;AACD;;AAED,SAAS,sBAAT,GAAmC;AACjC,OAAK,aAAL,CAAmB,cAAnB;AACD;;AAED,SAAS,QAAT,GAAqB;AACnB,OAAK,YAAL,GAAoB,IAApB;AACD;;AAED,SAAS,WAAT,GAAwB;AACtB,OAAK,YAAL,GAAoB,IAApB;AACA,OAAK,2BAAL,GAAmC,IAAnC;AACD;;AAED,SAAS,UAAT,CAAqB,KAArB,EAA4B;AAC1B,SAAO,GAAG,MAAH,CAAU,KAAV,IAAkB,KAAlB,GAA0B,EAAE,SAAS,KAAX,EAAjC;AACD;;AAED,OAAO,OAAP,GAAiB;AACf,UADe;AAEf,gBAFe;;AAIf,0BAJe;AAKf,gCALe;;AAOf,oCAPe;AAQf,wCARe;AASf,kCATe;AAUf,sBAVe;;AAYf,gCAZe;AAaf,kCAbe;;AAef,aAAW,QAfI;AAgBf,YAAU,OAhBK;AAiBf,sBAAoB;AAjBL,CAAjB;;;;;ACrVA,OAAO,OAAP,GAAiB,SAAS,MAAT,CAAiB,IAAjB,EAAuB,MAAvB,EAA+B;AAC9C,OAAK,IAAM,IAAX,IAAmB,MAAnB,EAA2B;AACzB,SAAK,IAAL,IAAa,OAAO,IAAP,CAAb;AACD;AACD,SAAO,IAAP;AACD,CALD;;;;;eCGI,QAAQ,QAAR,C;IAFF,e,YAAA,e;IACA,Q,YAAA,Q;;AAGF,OAAO,OAAP,GAAiB,UAAU,MAAV,EAAkB,OAAlB,EAA2B,MAA3B,EAAmC;AAClD,MAAM,gBAAgB,OAAO,OAAP,CAAe,MAAf,CAAtB;AACA,MAAM,eAAe,iBAAiB,cAAc,MAApD;AACA,MAAM,SAAS,gBAAgB,OAAO,OAAP,CAAe,MAA9C;;AAEA,MAAM,aAAa,gBAAgB,MAAhB,EAAwB,MAAxB,EAAgC,OAAhC,EAAyC,CAAC,UAAU,OAAX,CAAzC,CAAnB;;AAEA,SAAO,SAAS,UAAT,KAAwB,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EAA/B;AACD,CARD;;;;;ACLA,OAAO,OAAP,GAAiB,UAAC,CAAD,EAAI,CAAJ;AAAA,SAAW,KAAK,IAAL,CAAU,IAAI,CAAJ,GAAQ,IAAI,CAAtB,CAAX;AAAA,CAAjB;;;;;ACAA,IAAM,SAAS,QAAQ,UAAR,CAAf;AACA,IAAM,MAAS,QAAQ,UAAR,CAAf;;AAEA,IAAM,QAAQ;AACZ,YAAU,kBAAU,MAAV,EAAkB,OAAlB,EAA2B;AACnC,QAAI,SAAS,KAAb;;AAEA,WAAO,YAAY;AACjB,UAAI,CAAC,MAAL,EAAa;AACX,YAAI,MAAJ,CAAW,OAAX,CAAmB,IAAnB,CAAwB,OAAxB;AACA,iBAAS,IAAT;AACD;;AAED,aAAO,OAAO,KAAP,CAAa,IAAb,EAAmB,SAAnB,CAAP;AACD,KAPD;AAQD,GAZW;;AAcZ;AACA,oBAAkB,0BAAU,CAAV,EAAa,EAAb,EAAiB,EAAjB,EAAqB,EAArB,EAAyB;AACzC,QAAM,KAAK,IAAI,CAAf;AACA,WAAO,KAAK,EAAL,GAAU,EAAV,GAAe,IAAI,EAAJ,GAAS,CAAT,GAAa,EAA5B,GAAiC,IAAI,CAAJ,GAAQ,EAAhD;AACD,GAlBW;;AAoBZ,0BAAwB,gCAAU,MAAV,EAAkB,MAAlB,EAA0B,GAA1B,EAA+B,GAA/B,EAAoC,IAApC,EAA0C,IAA1C,EAAgD,QAAhD,EAA0D;AAChF,WAAO;AACL,SAAI,MAAM,gBAAN,CAAuB,QAAvB,EAAiC,MAAjC,EAAyC,GAAzC,EAA8C,IAA9C,CADC;AAEL,SAAI,MAAM,gBAAN,CAAuB,QAAvB,EAAiC,MAAjC,EAAyC,GAAzC,EAA8C,IAA9C;AAFC,KAAP;AAID,GAzBW;;AA2BZ;AACA,eAAa,qBAAU,CAAV,EAAa,CAAb,EAAgB,CAAhB,EAAmB,CAAnB,EAAsB;AACjC,SAAK,CAAL;AACA,WAAO,CAAC,CAAD,GAAK,CAAL,IAAQ,IAAE,CAAV,IAAe,CAAtB;AACD,GA/BW;;AAiCZ,cAAY,oBAAU,IAAV,EAAgB,GAAhB,EAAqB;AAC/B,SAAK,IAAL,GAAa,IAAI,IAAjB;AACA,SAAK,IAAL,GAAa,IAAI,IAAjB;AACA,SAAK,KAAL,GAAa,IAAI,KAAjB;;AAEA,WAAO,IAAP;AACD,GAvCW;;AAyCZ,MAAa,QAAQ,MAAR,CAzCD;AA0CZ,UAAa,MA1CD;AA2CZ,SAAa,QAAQ,SAAR,CA3CD;AA4CZ,eAAa,QAAQ,eAAR;AA5CD,CAAd;;AA+CA,OAAO,KAAP,EAAc,QAAQ,OAAR,CAAd;AACA,OAAO,KAAP,EAAc,QAAQ,YAAR,CAAd;AACA,OAAO,KAAP,EAAc,QAAQ,gBAAR,CAAd;AACA,OAAO,KAAP,EAAc,QAAQ,QAAR,CAAd;;AAEA,OAAO,OAAP,GAAiB,KAAjB;;;;;ACvDA,IAAM,QAAU,QAAQ,UAAR,CAAhB;AACA,IAAM,QAAU,QAAQ,SAAR,CAAhB;;AAEA,IAAM,SAAS;AACb,eAAa,CAAE,kBAAF,EAAsB,YAAtB,EAAoC,YAApC,EAAkD,MAAlD,CADA;;AAGb,UAAQ,gBAAU,OAAV,EAAmB,SAAnB,EAA8B,WAA9B,EAA2C;AACjD,QAAM,cAAc,MAAM,cAAN,CAAqB,OAArB,CAApB;AACA,QAAM,YAAY,MAAM,YAAN,CAAmB,OAAnB,CAAlB;AACA,QAAM,UAAU,EAAE,gBAAF,EAAW,oBAAX,EAAsB,wBAAtB,EAAmC,oBAAnC,EAA8C,wBAA9C,EAAhB;;AAEA,yBAAqB,OAAO,WAA5B,kHAAyC;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAA9B,MAA8B;;AACvC,UAAM,cAAc,OAAO,MAAP,EAAe,OAAf,CAApB;;AAEA,UAAI,WAAJ,EAAiB;AACf,eAAO,WAAP;AACD;AACF;AACF,GAfY;;AAiBb;AACA,oBAAkB,iCAAmD;AAAA,QAAvC,WAAuC,SAAvC,WAAuC;AAAA,QAA1B,SAA0B,SAA1B,SAA0B;AAAA,QAAf,WAAe,SAAf,WAAe;;AACnE,QAAI,CAAC,cAAc,IAAd,CAAmB,SAAnB,CAAL,EAAoC;AAClC,aAAO,IAAP;AACD;;AAED,0BAA0B,MAAM,YAAhC,yHAA8C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAAnC,WAAmC;;AAC5C,UAAI,UAAU,WAAd;;AAEA,UAAI,YAAY,UAAZ,IAA0B,YAAY,UAAZ,CAAuB,WAAjD,IACI,YAAY,WAAZ,KAA4B,WADpC,EACkD;AAChD,eAAO,OAAP,EAAgB;AACd;AACA,cAAI,YAAY,YAAY,OAA5B,EAAqC;AACnC,mBAAO,WAAP;AACD;AACD,oBAAU,MAAM,UAAN,CAAiB,OAAjB,CAAV;AACD;AACF;AACF;;AAED,WAAO,IAAP;AACD,GAvCY;;AAyCb;AACA,cAAY,2BAAiD;AAAA,QAArC,SAAqC,SAArC,SAAqC;AAAA,QAA1B,WAA0B,SAA1B,WAA0B;AAAA,QAAb,SAAa,SAAb,SAAa;;AAC3D,QAAI,gBAAgB,OAAhB,IAA2B,gBAAgB,KAA/C,EAAsD;AACpD,aAAO,IAAP;AACD;;AAED,QAAI,uBAAJ;;AAEA,0BAA0B,MAAM,YAAhC,yHAA8C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAAnC,WAAmC;;AAC5C,UAAI,YAAY,WAAZ,KAA4B,WAAhC,EAA6C;AAC3C;AACA,YAAI,YAAY,UAAZ,IAA0B,CAAC,MAAM,QAAN,CAAe,YAAY,UAA3B,EAAuC,SAAvC,CAA/B,EAAkF;AAAE;AAAW;;AAE/F;AACA,YAAI,YAAY,WAAZ,EAAJ,EAA+B;AAC7B,iBAAO,WAAP;AACD;AACD;AAHA,aAIK,IAAI,CAAC,cAAL,EAAqB;AACxB,6BAAiB,WAAjB;AACD;AACF;AACF;;AAED;AACA;AACA,QAAI,cAAJ,EAAoB;AAClB,aAAO,cAAP;AACD;;AAED;AACA;AACA;AACA,0BAA0B,MAAM,YAAhC,yHAA8C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAAnC,YAAmC;;AAC5C,UAAI,aAAY,WAAZ,KAA4B,WAA5B,IAA2C,EAAE,QAAQ,IAAR,CAAa,SAAb,KAA2B,aAAY,UAAzC,CAA/C,EAAqG;AACnG,eAAO,YAAP;AACD;AACF;;AAED,WAAO,IAAP;AACD,GAjFY;;AAmFb;AACA,cAAY,2BAAyB;AAAA,QAAb,SAAa,SAAb,SAAa;;AACnC,0BAA0B,MAAM,YAAhC,yHAA8C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAAnC,WAAmC;;AAC5C,UAAI,MAAM,QAAN,CAAe,YAAY,UAA3B,EAAuC,SAAvC,CAAJ,EAAuD;AACrD,eAAO,WAAP;AACD;AACF;AACF,GA1FY;;AA4Fb;AACA,QAAM,qBAA2B;AAAA,QAAf,WAAe,SAAf,WAAe;;AAC/B,0BAA0B,MAAM,YAAhC,yHAA8C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAAnC,WAAmC;;AAC5C;AACA,UAAI,YAAY,UAAZ,CAAuB,MAAvB,KAAkC,CAAtC,EAAyC;AACvC,YAAM,SAAS,YAAY,MAA3B;AACA;AACA;AACA,YAAI,UAAU,CAAC,OAAO,OAAP,CAAe,OAAf,CAAuB,OAAtC,EAA+C;AAC7C;AACD;AACF;AACD;AARA,WASK,IAAI,YAAY,UAAZ,CAAuB,MAAvB,IAAiC,CAArC,EAAwC;AAC3C;AACD;;AAED,UAAI,CAAC,YAAY,WAAZ,EAAD,IAA+B,gBAAgB,YAAY,WAA/D,EAA6E;AAC3E,eAAO,WAAP;AACD;AACF;;AAED,WAAO,IAAP;AACD;AAnHY,CAAf;;AAsHA,OAAO,OAAP,GAAiB,MAAjB;;;;;;;ACzHA,IAAM,MAAa,QAAQ,UAAR,CAAnB;AACA,IAAM,WAAa,QAAQ,YAAR,CAAnB;;AAEA,IAAM,KAAK;AACT,SAAU,iBAAM,CAAE,CADT;;AAGT,UAAU;AAAA,WAAS,UAAU,IAAI,MAAd,IAAwB,SAAS,KAAT,CAAjC;AAAA,GAHD;;AAKT,WAAU;AAAA,WAAS,GAAG,MAAH,CAAU,KAAV,KAAoB,MAAM,QAAN,KAAmB,EAAhD;AAAA,GALD;;AAOT,UAAU;AAAA,WAAS,CAAC,CAAC,KAAF,IAAY,QAAO,KAAP,yCAAO,KAAP,OAAiB,QAAtC;AAAA,GAPD;;AAST,YAAU;AAAA,WAAS,OAAO,KAAP,KAAiB,UAA1B;AAAA,GATD;;AAWT,UAAU;AAAA,WAAS,OAAO,KAAP,KAAiB,QAA1B;AAAA,GAXD;;AAaT,QAAU;AAAA,WAAS,OAAO,KAAP,KAAiB,SAA1B;AAAA,GAbD;;AAeT,UAAU;AAAA,WAAS,OAAO,KAAP,KAAiB,QAA1B;AAAA,GAfD;;AAiBT,WAAS,wBAAS;AAChB,QAAI,CAAC,KAAD,IAAW,QAAO,KAAP,yCAAO,KAAP,OAAiB,QAAhC,EAA2C;AAAE,aAAO,KAAP;AAAe;;AAE5D,QAAM,UAAU,IAAI,SAAJ,CAAc,KAAd,KAAwB,IAAI,MAA5C;;AAEA,WAAQ,mBAAkB,IAAlB,SAA8B,QAAQ,OAAtC,KACJ,iBAAiB,QAAQ,OADrB,CAC6B;AAD7B,QAEJ,MAAM,QAAN,KAAmB,CAAnB,IAAwB,OAAO,MAAM,QAAb,KAA0B;AAFtD;AAGD;AAzBQ,CAAX;;AA4BA,GAAG,KAAH,GAAW;AAAA,SAAU,GAAG,MAAH,CAAU,KAAV,KACf,OAAO,MAAM,MAAb,KAAwB,WADT,IAEhB,GAAG,QAAH,CAAY,MAAM,MAAlB,CAFM;AAAA,CAAX;;AAIA,OAAO,OAAP,GAAiB,EAAjB;;;;;ACnCA,OAAO,OAAP,GAAiB,UAAC,KAAD;AAAA,SAAW,CAAC,EAAE,SAAS,MAAM,MAAjB,CAAD,IAA8B,iBAAiB,MAAM,MAAhE;AAAA,CAAjB;;;;;ACAA,SAAS,aAAT,CAAwB,IAAxB,EAA8B,MAA9B,EAAsC;AACpC,OAAK,IAAM,IAAX,IAAmB,MAAnB,EAA2B;AACzB,QAAM,kBAAkB,OAAO,OAAP,CAAe,eAAvC;AACA,QAAI,aAAa,KAAjB;;AAEA;AACA,SAAK,IAAM,MAAX,IAAqB,eAArB,EAAsC;AACpC,UAAI,KAAK,OAAL,CAAa,MAAb,MAAyB,CAAzB,IAA8B,gBAAgB,MAAhB,EAAwB,IAAxB,CAA6B,IAA7B,CAAlC,EAAsE;AACpE,qBAAa,IAAb;AACA;AACD;AACF;;AAED,QAAI,CAAC,UAAD,IAAe,OAAO,OAAO,IAAP,CAAP,KAAwB,UAA3C,EAAuD;AACrD,WAAK,IAAL,IAAa,OAAO,IAAP,CAAb;AACD;AACF;AACD,SAAO,IAAP;AACD;;AAED,cAAc,eAAd,GAAgC;AAC9B,UAAQ;AADsB,CAAhC;;AAIA,OAAO,OAAP,GAAiB,aAAjB;;;;;ACxBA,IAAM,QAAgB,QAAQ,SAAR,CAAtB;AACA,IAAM,UAAgB,QAAQ,WAAR,CAAtB;AACA,IAAM,MAAgB,QAAQ,cAAR,CAAtB;AACA,IAAM,WAAgB,QAAQ,YAAR,CAAtB;AACA,IAAM,aAAgB,QAAQ,cAAR,CAAtB;AACA,IAAM,KAAgB,QAAQ,MAAR,CAAtB;AACA,IAAM,gBAAgB,QAAQ,iBAAR,CAAtB;;AAEA,IAAM,eAAe;AACnB,cAAY,oBAAU,IAAV,EAAgB,GAAhB,EAAqB;AAC/B,SAAK,IAAL,GAAY,KAAK,IAAL,IAAa,EAAzB;AACA,SAAK,IAAL,CAAU,CAAV,GAAc,IAAI,IAAJ,CAAS,CAAvB;AACA,SAAK,IAAL,CAAU,CAAV,GAAc,IAAI,IAAJ,CAAS,CAAvB;;AAEA,SAAK,MAAL,GAAc,KAAK,MAAL,IAAe,EAA7B;AACA,SAAK,MAAL,CAAY,CAAZ,GAAgB,IAAI,MAAJ,CAAW,CAA3B;AACA,SAAK,MAAL,CAAY,CAAZ,GAAgB,IAAI,MAAJ,CAAW,CAA3B;;AAEA,SAAK,SAAL,GAAiB,IAAI,SAArB;AACD,GAXkB;;AAanB,kBAAgB,wBAAU,SAAV,EAAqB,IAArB,EAA2B,GAA3B,EAAgC;AAC9C,cAAU,IAAV,CAAe,CAAf,GAAsB,IAAI,IAAJ,CAAS,CAAT,GAAgB,KAAK,IAAL,CAAU,CAAhD;AACA,cAAU,IAAV,CAAe,CAAf,GAAsB,IAAI,IAAJ,CAAS,CAAT,GAAgB,KAAK,IAAL,CAAU,CAAhD;AACA,cAAU,MAAV,CAAiB,CAAjB,GAAsB,IAAI,MAAJ,CAAW,CAAX,GAAgB,KAAK,MAAL,CAAY,CAAlD;AACA,cAAU,MAAV,CAAiB,CAAjB,GAAsB,IAAI,MAAJ,CAAW,CAAX,GAAgB,KAAK,MAAL,CAAY,CAAlD;AACA,cAAU,SAAV,GAAsB,IAAI,SAAJ,GAAgB,KAAK,SAA3C;;AAEA;AACA,QAAM,KAAK,KAAK,GAAL,CAAS,UAAU,SAAV,GAAsB,IAA/B,EAAqC,KAArC,CAAX;;AAEA,cAAU,IAAV,CAAe,KAAf,GAAyB,MAAM,UAAU,IAAV,CAAe,CAArB,EAAwB,UAAU,IAAV,CAAe,CAAvC,IAA4C,EAArE;AACA,cAAU,IAAV,CAAe,EAAf,GAAyB,UAAU,IAAV,CAAe,CAAf,GAAmB,EAA5C;AACA,cAAU,IAAV,CAAe,EAAf,GAAyB,UAAU,IAAV,CAAe,CAAf,GAAmB,EAA5C;;AAEA,cAAU,MAAV,CAAiB,KAAjB,GAAyB,MAAM,UAAU,MAAV,CAAiB,CAAvB,EAA0B,UAAU,IAAV,CAAe,CAAzC,IAA8C,EAAvE;AACA,cAAU,MAAV,CAAiB,EAAjB,GAAyB,UAAU,MAAV,CAAiB,CAAjB,GAAqB,EAA9C;AACA,cAAU,MAAV,CAAiB,EAAjB,GAAyB,UAAU,MAAV,CAAiB,CAAjB,GAAqB,EAA9C;AACD,GA9BkB;;AAgCnB,mBAAiB,yBAAW,OAAX,EAAoB;AACnC,WAAQ,mBAAmB,IAAI,KAAvB,IAAgC,mBAAmB,IAAI,KAA/D;AACD,GAlCkB;;AAoCnB;AACA,SAAO,eAAU,IAAV,EAAgB,OAAhB,EAAyB,EAAzB,EAA6B;AAClC,SAAK,MAAM,EAAX;AACA,WAAO,QAAQ,MAAf;;AAEA,OAAG,CAAH,GAAO,QAAQ,OAAO,GAAf,CAAP;AACA,OAAG,CAAH,GAAO,QAAQ,OAAO,GAAf,CAAP;;AAEA,WAAO,EAAP;AACD,GA7CkB;;AA+CnB,aAAW,mBAAU,OAAV,EAAmB,IAAnB,EAAyB;AAClC,WAAO,QAAQ,EAAf;;AAEA;AACA,QAAI,QAAQ,aAAR,IAAyB,aAAa,eAAb,CAA6B,OAA7B,CAA7B,EAAoE;AAClE,mBAAa,KAAb,CAAmB,QAAnB,EAA6B,OAA7B,EAAsC,IAAtC;;AAEA,WAAK,CAAL,IAAU,OAAO,OAAjB;AACA,WAAK,CAAL,IAAU,OAAO,OAAjB;AACD,KALD,MAMK;AACH,mBAAa,KAAb,CAAmB,MAAnB,EAA2B,OAA3B,EAAoC,IAApC;AACD;;AAED,WAAO,IAAP;AACD,GA9DkB;;AAgEnB,eAAa,qBAAU,OAAV,EAAmB,MAAnB,EAA2B;AACtC,aAAS,UAAU,EAAnB;;AAEA,QAAI,QAAQ,aAAR,IAAyB,aAAa,eAAb,CAA6B,OAA7B,CAA7B,EAAoE;AAClE;AACA,mBAAa,KAAb,CAAmB,QAAnB,EAA6B,OAA7B,EAAsC,MAAtC;AACD,KAHD,MAIK;AACH,mBAAa,KAAb,CAAmB,QAAnB,EAA6B,OAA7B,EAAsC,MAAtC;AACD;;AAED,WAAO,MAAP;AACD,GA5EkB;;AA8EnB,gBAAc,sBAAU,OAAV,EAAmB;AAC/B,WAAO,GAAG,MAAH,CAAU,QAAQ,SAAlB,IAA8B,QAAQ,SAAtC,GAAkD,QAAQ,UAAjE;AACD,GAhFkB;;AAkFnB,aAAW,mBAAU,SAAV,EAAqB,QAArB,EAA+B,SAA/B,EAA0C;AACnD,QAAM,UAAW,SAAS,MAAT,GAAkB,CAAlB,GACE,aAAa,cAAb,CAA4B,QAA5B,CADF,GAEE,SAAS,CAAT,CAFnB;;AAIA,QAAM,QAAQ,EAAd;;AAEA,iBAAa,SAAb,CAAuB,OAAvB,EAAgC,KAAhC;AACA,cAAU,IAAV,CAAe,CAAf,GAAmB,MAAM,CAAzB;AACA,cAAU,IAAV,CAAe,CAAf,GAAmB,MAAM,CAAzB;;AAEA,iBAAa,WAAb,CAAyB,OAAzB,EAAkC,KAAlC;AACA,cAAU,MAAV,CAAiB,CAAjB,GAAqB,MAAM,CAA3B;AACA,cAAU,MAAV,CAAiB,CAAjB,GAAqB,MAAM,CAA3B;;AAEA,cAAU,SAAV,GAAsB,GAAG,MAAH,CAAU,SAAV,IAAuB,SAAvB,GAAkC,IAAI,IAAJ,GAAW,OAAX,EAAxD;AACD,GAlGkB;;AAoGnB,iBAAe,aApGI;;AAsGnB,gBAAc,sBAAU,KAAV,EAAiB;AAC7B,QAAM,UAAU,EAAhB;;AAEA;AACA,QAAI,GAAG,KAAH,CAAS,KAAT,CAAJ,EAAqB;AACnB,cAAQ,CAAR,IAAa,MAAM,CAAN,CAAb;AACA,cAAQ,CAAR,IAAa,MAAM,CAAN,CAAb;AACD;AACD;AAJA,SAKK;AACH,YAAI,MAAM,IAAN,KAAe,UAAnB,EAA+B;AAC7B,cAAI,MAAM,OAAN,CAAc,MAAd,KAAyB,CAA7B,EAAgC;AAC9B,oBAAQ,CAAR,IAAa,MAAM,OAAN,CAAc,CAAd,CAAb;AACA,oBAAQ,CAAR,IAAa,MAAM,cAAN,CAAqB,CAArB,CAAb;AACD,WAHD,MAIK,IAAI,MAAM,OAAN,CAAc,MAAd,KAAyB,CAA7B,EAAgC;AACnC,oBAAQ,CAAR,IAAa,MAAM,cAAN,CAAqB,CAArB,CAAb;AACA,oBAAQ,CAAR,IAAa,MAAM,cAAN,CAAqB,CAArB,CAAb;AACD;AACF,SATD,MAUK;AACH,kBAAQ,CAAR,IAAa,MAAM,OAAN,CAAc,CAAd,CAAb;AACA,kBAAQ,CAAR,IAAa,MAAM,OAAN,CAAc,CAAd,CAAb;AACD;AACF;;AAED,WAAO,OAAP;AACD,GAjIkB;;AAmInB,kBAAgB,wBAAU,QAAV,EAAoB;AAClC,QAAM,UAAU;AACd,aAAS,CADK;AAEd,aAAS,CAFK;AAGd,eAAS,CAHK;AAId,eAAS,CAJK;AAKd,eAAS,CALK;AAMd,eAAS;AANK,KAAhB;;AASA,yBAAsB,QAAtB,kHAAgC;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAArB,OAAqB;;AAC9B,WAAK,IAAM,KAAX,IAAmB,OAAnB,EAA4B;AAC1B,gBAAQ,KAAR,KAAiB,QAAQ,KAAR,CAAjB;AACD;AACF;AACD,SAAK,IAAM,IAAX,IAAmB,OAAnB,EAA4B;AAC1B,cAAQ,IAAR,KAAiB,SAAS,MAA1B;AACD;;AAED,WAAO,OAAP;AACD,GAvJkB;;AAyJnB,aAAW,mBAAU,KAAV,EAAiB;AAC1B,QAAI,CAAC,MAAM,MAAP,IAAiB,EAAE,MAAM,OAAN,IAAiB,MAAM,OAAN,CAAc,MAAd,GAAuB,CAA1C,CAArB,EAAmE;AACjE;AACD;;AAED,QAAM,UAAU,aAAa,YAAb,CAA0B,KAA1B,CAAhB;AACA,QAAM,OAAO,KAAK,GAAL,CAAS,QAAQ,CAAR,EAAW,KAApB,EAA2B,QAAQ,CAAR,EAAW,KAAtC,CAAb;AACA,QAAM,OAAO,KAAK,GAAL,CAAS,QAAQ,CAAR,EAAW,KAApB,EAA2B,QAAQ,CAAR,EAAW,KAAtC,CAAb;AACA,QAAM,OAAO,KAAK,GAAL,CAAS,QAAQ,CAAR,EAAW,KAApB,EAA2B,QAAQ,CAAR,EAAW,KAAtC,CAAb;AACA,QAAM,OAAO,KAAK,GAAL,CAAS,QAAQ,CAAR,EAAW,KAApB,EAA2B,QAAQ,CAAR,EAAW,KAAtC,CAAb;;AAEA,WAAO;AACL,SAAG,IADE;AAEL,SAAG,IAFE;AAGL,YAAM,IAHD;AAIL,WAAK,IAJA;AAKL,aAAO,OAAO,IALT;AAML,cAAQ,OAAO;AANV,KAAP;AAQD,GA5KkB;;AA8KnB,iBAAe,uBAAU,KAAV,EAAiB,WAAjB,EAA8B;AAC3C,QAAM,UAAU,cAAc,GAA9B;AACA,QAAM,UAAU,cAAc,GAA9B;AACA,QAAM,UAAU,aAAa,YAAb,CAA0B,KAA1B,CAAhB;;AAGA,QAAM,KAAK,QAAQ,CAAR,EAAW,OAAX,IAAsB,QAAQ,CAAR,EAAW,OAAX,CAAjC;AACA,QAAM,KAAK,QAAQ,CAAR,EAAW,OAAX,IAAsB,QAAQ,CAAR,EAAW,OAAX,CAAjC;;AAEA,WAAO,MAAM,EAAN,EAAU,EAAV,CAAP;AACD,GAxLkB;;AA0LnB,cAAY,oBAAU,KAAV,EAAiB,SAAjB,EAA4B,WAA5B,EAAyC;AACnD,QAAM,UAAU,cAAc,GAA9B;AACA,QAAM,UAAU,cAAc,GAA9B;AACA,QAAM,UAAU,aAAa,YAAb,CAA0B,KAA1B,CAAhB;AACA,QAAM,KAAK,QAAQ,CAAR,EAAW,OAAX,IAAsB,QAAQ,CAAR,EAAW,OAAX,CAAjC;AACA,QAAM,KAAK,QAAQ,CAAR,EAAW,OAAX,IAAsB,QAAQ,CAAR,EAAW,OAAX,CAAjC;AACA,QAAM,QAAQ,MAAM,KAAK,KAAL,CAAW,EAAX,EAAgB,EAAhB,CAAN,GAA4B,KAAK,EAA/C;;AAEA,WAAQ,KAAR;AACD,GAnMkB;;AAqMnB,kBAAgB,wBAAU,OAAV,EAAmB;AACjC,WAAO,GAAG,MAAH,CAAU,QAAQ,WAAlB,IACH,QAAQ,WADL,GAEH,GAAG,MAAH,CAAU,QAAQ,WAAlB,IACE,CAAC,SAAD,EAAY,SAAZ,EAAsB,OAAtB,EAA+B,KAA/B,EAAsC,OAAtC,EAA+C,QAAQ,WAAvD;AACA;AACA;AAHF,MAII,QAAQ,IAAR,CAAa,QAAQ,IAArB,KAA8B,mBAAmB,WAAW,KAA5D,GACE,OADF,GAEE,OARV;AASD,GA/MkB;;AAiNnB;AACA,mBAAiB,yBAAU,KAAV,EAAiB;AAChC,WAAO,CACL,SAAS,gBAAT,CAA0B,MAAM,IAAN,GAAa,MAAM,IAAN,CAAW,CAAX,CAAb,GAA6B,MAAM,MAA7D,CADK,EAEL,SAAS,gBAAT,CAA0B,MAAM,aAAhC,CAFK,CAAP;AAID;AAvNkB,CAArB;;AA0NA,OAAO,OAAP,GAAiB,YAAjB;;;;;eClOmB,QAAQ,UAAR,C;IAAX,M,YAAA,M;;AAER,IAAM,UAAU,CAAC,IAAD,EAAO,KAAP,EAAc,QAAd,EAAwB,GAAxB,CAAhB;AACA,IAAI,WAAW,CAAf;AACA,IAAI,gBAAJ;AACA,IAAI,eAAJ;;AAEA,KAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,QAAQ,MAAZ,IAAsB,CAAC,OAAO,qBAA9C,EAAqE,GAArE,EAA0E;AACxE,YAAU,OAAO,QAAQ,CAAR,IAAa,uBAApB,CAAV;AACA,WAAS,OAAO,QAAQ,CAAR,IAAY,sBAAnB,KAA8C,OAAO,QAAQ,CAAR,IAAa,6BAApB,CAAvD;AACD;;AAED,IAAI,CAAC,OAAL,EAAc;AACZ,YAAU,iBAAU,QAAV,EAAoB;AAC5B,QAAM,WAAW,IAAI,IAAJ,GAAW,OAAX,EAAjB;AACA,QAAM,aAAa,KAAK,GAAL,CAAS,CAAT,EAAY,MAAM,WAAW,QAAjB,CAAZ,CAAnB;AACA,QAAM,KAAK,WAAW,YAAY;AAAE,eAAS,WAAW,UAApB;AAAkC,KAA3D,EACW,UADX,CAAX;;AAGA,eAAW,WAAW,UAAtB;AACA,WAAO,EAAP;AACD,GARD;AASD;;AAED,IAAI,CAAC,MAAL,EAAa;AACX,WAAS,gBAAU,EAAV,EAAc;AACrB,iBAAa,EAAb;AACD,GAFD;AAGD;;AAED,OAAO,OAAP,GAAiB;AACf,kBADe;AAEf;AAFe,CAAjB;;;;;AC9BA,IAAM,SAAS,QAAQ,UAAR,CAAf;AACA,IAAM,KAAK,QAAQ,MAAR,CAAX;;eAKI,QAAQ,YAAR,C;IAHF,O,YAAA,O;IACA,U,YAAA,U;IACA,c,YAAA,c;;AAGF,IAAM,YAAY;AAChB,yBAAuB,+BAAU,KAAV,EAAiB,YAAjB,EAA+B,OAA/B,EAAwC;AAC7D,QAAI,CAAC,GAAG,MAAH,CAAU,KAAV,CAAL,EAAuB;AACrB,aAAO,IAAP;AACD;;AAED,QAAI,UAAU,QAAd,EAAwB;AACtB,cAAQ,WAAW,OAAX,CAAR;AACD,KAFD,MAGK,IAAI,UAAU,MAAd,EAAsB;AACzB,cAAQ,aAAa,OAAb,CAAqB,OAArB,CAAR;AACD,KAFI,MAGA;AACH,cAAQ,QAAQ,OAAR,EAAiB,KAAjB,CAAR;AACD;;AAED,WAAO,KAAP;AACD,GAjBe;;AAmBhB,mBAAiB,yBAAU,KAAV,EAAiB,YAAjB,EAA+B,OAA/B,EAAwC,YAAxC,EAAsD;AACrE,YAAQ,UAAU,qBAAV,CAAgC,KAAhC,EAAuC,YAAvC,EAAqD,OAArD,KAAiE,KAAzE;;AAEA,QAAI,GAAG,QAAH,CAAY,KAAZ,CAAJ,EAAwB;AACtB,cAAQ,MAAM,KAAN,CAAY,IAAZ,EAAkB,YAAlB,CAAR;AACD;;AAED,QAAI,GAAG,OAAH,CAAW,KAAX,CAAJ,EAAuB;AACrB,cAAQ,eAAe,KAAf,CAAR;AACD;;AAED,WAAO,KAAP;AACD,GA/Be;;AAiChB,YAAU,kBAAU,IAAV,EAAgB;AACxB,WAAQ,QAAQ;AACd,SAAG,OAAO,IAAP,GAAc,KAAK,CAAnB,GAAuB,KAAK,IADjB;AAEd,SAAG,OAAO,IAAP,GAAc,KAAK,CAAnB,GAAuB,KAAK;AAFjB,KAAhB;AAID,GAtCe;;AAwChB,cAAY,oBAAU,IAAV,EAAgB;AAC1B,QAAI,QAAQ,EAAE,UAAU,IAAV,IAAkB,SAAS,IAA7B,CAAZ,EAAgD;AAC9C,aAAO,OAAO,EAAP,EAAW,IAAX,CAAP;;AAEA,WAAK,IAAL,GAAc,KAAK,CAAL,IAAU,CAAxB;AACA,WAAK,GAAL,GAAc,KAAK,CAAL,IAAU,CAAxB;AACA,WAAK,KAAL,GAAc,KAAK,KAAL,IAAiB,KAAK,IAAL,GAAY,KAAK,KAAhD;AACA,WAAK,MAAL,GAAc,KAAK,MAAL,IAAiB,KAAK,GAAL,GAAW,KAAK,MAA/C;AACD;;AAED,WAAO,IAAP;AACD,GAnDe;;AAqDhB,cAAY,oBAAU,IAAV,EAAgB;AAC1B,QAAI,QAAQ,EAAE,OAAO,IAAP,IAAe,OAAO,IAAxB,CAAZ,EAA2C;AACzC,aAAO,OAAO,EAAP,EAAW,IAAX,CAAP;;AAEA,WAAK,CAAL,GAAc,KAAK,IAAL,IAAa,CAA3B;AACA,WAAK,GAAL,GAAc,KAAK,GAAL,IAAa,CAA3B;AACA,WAAK,KAAL,GAAc,KAAK,KAAL,IAAgB,KAAK,KAAL,GAAc,KAAK,CAAjD;AACA,WAAK,MAAL,GAAc,KAAK,MAAL,IAAgB,KAAK,MAAL,GAAc,KAAK,CAAjD;AACD;;AAED,WAAO,IAAP;AACD;AAhEe,CAAlB;;AAmEA,OAAO,OAAP,GAAiB,SAAjB;;;;;AC3EA,IAAM,MAAM,OAAO,OAAnB;AACA,IAAM,WAAW,QAAQ,YAAR,CAAjB;;AAEA,SAAS,IAAT,CAAe,MAAf,EAAuB;AACrB;;AAEA,MAAI,UAAJ,GAAiB,MAAjB;;AAEA;AACA,MAAM,KAAK,OAAO,QAAP,CAAgB,cAAhB,CAA+B,EAA/B,CAAX;;AAEA;AACA,MAAI,GAAG,aAAH,KAAqB,OAAO,QAA5B,IACG,OAAO,OAAO,IAAd,KAAuB,UAD1B,IAEC,OAAO,IAAP,CAAY,EAAZ,MAAoB,EAFzB,EAE6B;AAC3B;AACA,aAAS,OAAO,IAAP,CAAY,MAAZ,CAAT;AACD;;AAED,MAAI,MAAJ,GAAa,MAAb;AACD;;AAED,IAAI,OAAO,MAAP,KAAkB,WAAtB,EAAmC;AACjC,MAAI,MAAJ,GAAiB,SAAjB;AACA,MAAI,UAAJ,GAAiB,SAAjB;AACD,CAHD,MAIK;AACH,OAAK,MAAL;AACD;;AAED,IAAI,SAAJ,GAAgB,SAAS,SAAT,CAAoB,IAApB,EAA0B;AACxC,MAAI,SAAS,IAAT,CAAJ,EAAoB;AAClB,WAAO,IAAP;AACD;;AAED,MAAM,WAAY,KAAK,aAAL,IAAsB,IAAxC;;AAEA,SAAO,SAAS,WAAT,IAAwB,SAAS,YAAjC,IAAiD,IAAI,MAA5D;AACD,CARD;;AAUA,IAAI,IAAJ,GAAW,IAAX","file":"interact.js","sourceRoot":"","sourcesContent":["/**\n * interact.js v1.3.0-alpha.4+sha.7970416-dirty\n *\n * Copyright (c) 2012-2017 Taye Adeyemi \n * Open source under the MIT License.\n * https://raw.github.com/taye/interact.js/master/LICENSE\n */\n","(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o 150) {\n return null;\n }\n\n let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI;\n const overlap = 22.5;\n\n if (angle < 0) {\n angle += 360;\n }\n\n const left = 135 - overlap <= angle && angle < 225 + overlap;\n const up = 225 - overlap <= angle && angle < 315 + overlap;\n\n const right = !left && (315 - overlap <= angle || angle < 45 + overlap);\n const down = !up && 45 - overlap <= angle && angle < 135 + overlap;\n\n return {\n up,\n down,\n left,\n right,\n angle,\n speed: interaction.prevEvent.speed,\n velocity: {\n x: interaction.prevEvent.velocityX,\n y: interaction.prevEvent.velocityY,\n },\n };\n }\n\n preventDefault () {}\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n}\n\nsignals.on('set-delta', function ({ iEvent, interaction, starting, deltaSource }) {\n const prevEvent = starting? iEvent : interaction.prevEvent;\n\n if (deltaSource === 'client') {\n iEvent.dx = iEvent.clientX - prevEvent.clientX;\n iEvent.dy = iEvent.clientY - prevEvent.clientY;\n }\n else {\n iEvent.dx = iEvent.pageX - prevEvent.pageX;\n iEvent.dy = iEvent.pageY - prevEvent.pageY;\n }\n});\n\nInteractEvent.signals = signals;\n\nmodule.exports = InteractEvent;\n","const is = require('./utils/is');\nconst events = require('./utils/events');\nconst extend = require('./utils/extend');\nconst actions = require('./actions/base');\nconst scope = require('./scope');\nconst Eventable = require('./Eventable');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nconst {\n getElementRect,\n nodeContains,\n trySelector,\n} = require('./utils/domUtils');\nconst { getWindow } = require('./utils/window');\nconst { indexOf, contains } = require('./utils/arr');\nconst { wheelEvent } = require('./utils/browser');\n\n// all set interactables\nscope.interactables = [];\n\n/*\\\n * Interactable\n [ property ]\n **\n * Object type returned by @interact\n\\*/\nclass Interactable {\n constructor (target, options) {\n options = options || {};\n\n this.target = target;\n this.events = new Eventable();\n this._context = options.context || scope.document;\n this._win = getWindow(trySelector(target)? this._context : target);\n this._doc = this._win.document;\n\n signals.fire('new', {\n target,\n options,\n interactable: this,\n win: this._win,\n });\n\n scope.addDocument( this._doc, this._win );\n\n scope.interactables.push(this);\n\n this.set(options);\n }\n\n setOnEvents (action, phases) {\n const onAction = 'on' + action;\n\n if (is.function(phases.onstart) ) { this.events[onAction + 'start' ] = phases.onstart ; }\n if (is.function(phases.onmove) ) { this.events[onAction + 'move' ] = phases.onmove ; }\n if (is.function(phases.onend) ) { this.events[onAction + 'end' ] = phases.onend ; }\n if (is.function(phases.oninertiastart)) { this.events[onAction + 'inertiastart' ] = phases.oninertiastart ; }\n\n return this;\n }\n\n setPerAction (action, options) {\n // for all the default per-action options\n for (const option in options) {\n // if this option exists for this action\n if (option in defaults[action]) {\n // if the option in the options arg is an object value\n if (is.object(options[option])) {\n // duplicate the object\n this.options[action][option] = extend(this.options[action][option] || {}, options[option]);\n\n if (is.object(defaults.perAction[option]) && 'enabled' in defaults.perAction[option]) {\n this.options[action][option].enabled = options[option].enabled === false? false : true;\n }\n }\n else if (is.bool(options[option]) && is.object(defaults.perAction[option])) {\n this.options[action][option].enabled = options[option];\n }\n else if (options[option] !== undefined) {\n // or if it's not undefined, do a plain assignment\n this.options[action][option] = options[option];\n }\n }\n }\n }\n\n /*\\\n * Interactable.getRect\n [ method ]\n *\n * The default function to get an Interactables bounding rect. Can be\n * overridden using @Interactable.rectChecker.\n *\n - element (Element) #optional The element to measure.\n = (object) The object's bounding rectangle.\n o {\n o top : 0,\n o left : 0,\n o bottom: 0,\n o right : 0,\n o width : 0,\n o height: 0\n o }\n \\*/\n getRect (element) {\n element = element || this.target;\n\n if (is.string(this.target) && !(is.element(element))) {\n element = this._context.querySelector(this.target);\n }\n\n return getElementRect(element);\n }\n\n /*\\\n * Interactable.rectChecker\n [ method ]\n *\n * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n - checker (function) #optional A function which returns this Interactable's bounding rectangle. See @Interactable.getRect\n = (function | object) The checker function or this Interactable\n \\*/\n rectChecker (checker) {\n if (is.function(checker)) {\n this.getRect = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.getRect;\n\n return this;\n }\n\n return this.getRect;\n }\n\n _backCompatOption (optionName, newValue) {\n if (trySelector(newValue) || is.object(newValue)) {\n this.options[optionName] = newValue;\n\n for (const action of actions.names) {\n this.options[action][optionName] = newValue;\n }\n\n return this;\n }\n\n return this.options[optionName];\n }\n\n /*\\\n * Interactable.origin\n [ method ]\n *\n * Gets or sets the origin of the Interactable's element. The x and y\n * of the origin will be subtracted from action event coordinates.\n *\n - origin (object | string) #optional An object eg. { x: 0, y: 0 } or string 'parent', 'self' or any CSS selector\n * OR\n - origin (Element) #optional An HTML or SVG Element whose rect will be used\n **\n = (object) The current origin or this Interactable\n \\*/\n origin (newValue) {\n return this._backCompatOption('origin', newValue);\n }\n\n /*\\\n * Interactable.deltaSource\n [ method ]\n *\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n - newValue (string) #optional Use 'client' if you will be scrolling while interacting; Use 'page' if you want autoScroll to work\n = (string | object) The current deltaSource or this Interactable\n \\*/\n deltaSource (newValue) {\n if (newValue === 'page' || newValue === 'client') {\n this.options.deltaSource = newValue;\n\n return this;\n }\n\n return this.options.deltaSource;\n }\n\n /*\\\n * Interactable.context\n [ method ]\n *\n * Gets the selector context Node of the Interactable. The default is `window.document`.\n *\n = (Node) The context Node of this Interactable\n **\n \\*/\n context () {\n return this._context;\n }\n\n inContext (element) {\n return (this._context === element.ownerDocument\n || nodeContains(this._context, element));\n }\n\n /*\\\n * Interactable.fire\n [ method ]\n *\n * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n - iEvent (InteractEvent) The InteractEvent object to be fired on this Interactable\n = (Interactable) this Interactable\n \\*/\n fire (iEvent) {\n this.events.fire(iEvent);\n\n return this;\n }\n\n _onOffMultiple (method, eventType, listener, options) {\n if (is.string(eventType) && eventType.search(' ') !== -1) {\n eventType = eventType.trim().split(/ +/);\n }\n\n if (is.array(eventType)) {\n for (let i = 0; i < eventType.length; i++) {\n this[method](eventType[i], listener, options);\n }\n\n return true;\n }\n\n if (is.object(eventType)) {\n for (const prop in eventType) {\n this[method](prop, eventType[prop], listener);\n }\n\n return true;\n }\n }\n\n /*\\\n * Interactable.on\n [ method ]\n *\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n - eventType (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) This Interactable\n \\*/\n on (eventType, listener, options) {\n if (this._onOffMultiple('on', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.on(eventType, listener);\n }\n // delegated event for selector\n else if (is.string(this.target)) {\n events.addDelegate(this.target, this._context, eventType, listener, options);\n }\n else {\n events.add(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.off\n [ method ]\n *\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n - eventType (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) This Interactable\n \\*/\n off (eventType, listener, options) {\n if (this._onOffMultiple('off', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n // if it is an action event type\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.off(eventType, listener);\n }\n // delegated event\n else if (is.string(this.target)) {\n events.removeDelegate(this.target, this._context, eventType, listener, options);\n }\n // remove listener from this Interatable's element\n else {\n events.remove(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.set\n [ method ]\n *\n * Reset the options of this Interactable\n - options (object) The new settings to apply\n = (object) This Interactable\n \\*/\n set (options) {\n if (!is.object(options)) {\n options = {};\n }\n\n this.options = extend({}, defaults.base);\n\n const perActions = extend({}, defaults.perAction);\n\n for (const actionName in actions.methodDict) {\n const methodName = actions.methodDict[actionName];\n\n this.options[actionName] = extend({}, defaults[actionName]);\n\n this.setPerAction(actionName, perActions);\n\n this[methodName](options[actionName]);\n }\n\n for (const setting of Interactable.settingsMethods) {\n this.options[setting] = defaults.base[setting];\n\n if (setting in options) {\n this[setting](options[setting]);\n }\n }\n\n signals.fire('set', {\n options,\n interactable: this,\n });\n\n return this;\n }\n\n /*\\\n * Interactable.unset\n [ method ]\n *\n * Remove this interactable from the list of interactables and remove\n * it's action capabilities and event listeners\n *\n = (object) @interact\n \\*/\n unset () {\n events.remove(this.target, 'all');\n\n if (is.string(this.target)) {\n // remove delegated events\n for (const type in events.delegatedEvents) {\n const delegated = events.delegatedEvents[type];\n\n if (delegated.selectors[0] === this.target\n && delegated.contexts[0] === this._context) {\n\n delegated.selectors.splice(0, 1);\n delegated.contexts .splice(0, 1);\n delegated.listeners.splice(0, 1);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegated[type] = null;\n }\n }\n\n events.remove(this._context, type, events.delegateListener);\n events.remove(this._context, type, events.delegateUseCapture, true);\n }\n }\n else {\n events.remove(this, 'all');\n }\n\n signals.fire('unset', { interactable: this });\n\n scope.interactables.splice(indexOf(scope.interactables, this), 1);\n\n // Stop related interactions when an Interactable is unset\n for (const interaction of scope.interactions || []) {\n if (interaction.target === this && interaction.interacting()) {\n interaction.stop();\n }\n }\n\n return scope.interact;\n }\n}\n\nscope.interactables.indexOfElement = function indexOfElement (target, context) {\n context = context || scope.document;\n\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n if (interactable.target === target && interactable._context === context) {\n return i;\n }\n }\n return -1;\n};\n\nscope.interactables.get = function interactableGet (element, options, dontCheckInContext) {\n const ret = this[this.indexOfElement(element, options && options.context)];\n\n return ret && (is.string(element) || dontCheckInContext || ret.inContext(element))? ret : null;\n};\n\nscope.interactables.forEachSelector = function (callback, element) {\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n // skip non CSS selector targets and out of context elements\n if (!is.string(interactable.target)\n || (element && !interactable.inContext(element))) {\n continue;\n }\n\n const ret = callback(interactable, interactable.target, interactable._context, i, this);\n\n if (ret !== undefined) {\n return ret;\n }\n }\n};\n\n// all interact.js eventTypes\nInteractable.eventTypes = scope.eventTypes = [];\n\nInteractable.signals = signals;\n\nInteractable.settingsMethods = [ 'deltaSource', 'origin', 'preventDefault', 'rectChecker' ];\n\nmodule.exports = Interactable;\n","const scope = require('./scope');\nconst utils = require('./utils');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst domObjects = require('./utils/domObjects');\nconst finder = require('./utils/interactionFinder');\nconst signals = require('./utils/Signals').new();\n\nconst listeners = {};\nconst methodNames = [\n 'pointerDown', 'pointerMove', 'pointerUp',\n 'updatePointer', 'removePointer',\n];\n\n// for ignoring browser's simulated mouse events\nlet prevTouchTime = 0;\n\n// all active and idle interactions\nscope.interactions = [];\n\nclass Interaction {\n constructor ({ pointerType }) {\n this.target = null; // current interactable being interacted with\n this.element = null; // the target element of the interactable\n\n this.prepared = { // action that's ready to be fired on next move event\n name : null,\n axis : null,\n edges: null,\n };\n\n // keep track of added pointers\n this.pointers = [];\n this.pointerIds = [];\n this.downTargets = [];\n this.downTimes = [];\n\n // Previous native pointer move event coordinates\n this.prevCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n // current native pointer move event coordinates\n this.curCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Starting InteractEvent pointer coordinates\n this.startCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Change in coordinates and time of the pointer\n this.pointerDelta = {\n page : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n client : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n timeStamp: 0,\n };\n\n this.downEvent = null; // pointerdown/mousedown/touchstart event\n this.downPointer = {};\n\n this._eventTarget = null;\n this._curEventTarget = null;\n\n this.prevEvent = null; // previous action event\n\n this.pointerIsDown = false;\n this.pointerWasMoved = false;\n this._interacting = false;\n\n this.pointerType = pointerType;\n\n signals.fire('new', this);\n\n scope.interactions.push(this);\n }\n\n pointerDown (pointer, event, eventTarget) {\n const pointerIndex = this.updatePointer(pointer, event, true);\n\n signals.fire('down', {\n pointer,\n event,\n eventTarget,\n pointerIndex,\n interaction: this,\n });\n }\n\n /*\\\n * Interaction.start\n [ method ]\n *\n * Start an action with the given Interactable and Element as tartgets. The\n * action must be enabled for the target Interactable and an appropriate number\n * of pointers must be held down - 1 for drag/resize, 2 for gesture.\n *\n * Use it with `interactable.able({ manualStart: false })` to always\n * [start actions manually](https://github.com/taye/interact.js/issues/114)\n *\n - action (object) The action to be performed - drag, resize, etc.\n - target (Interactable) The Interactable to target\n - element (Element) The DOM Element to target\n = (object) interact\n **\n | interact(target)\n | .draggable({\n | // disable the default drag start by down->move\n | manualStart: true\n | })\n | // start dragging after the user holds the pointer down\n | .on('hold', function (event) {\n | var interaction = event.interaction;\n |\n | if (!interaction.interacting()) {\n | interaction.start({ name: 'drag' },\n | event.interactable,\n | event.currentTarget);\n | }\n | });\n \\*/\n start (action, target, element) {\n if (this.interacting()\n || !this.pointerIsDown\n || this.pointerIds.length < (action.name === 'gesture'? 2 : 1)) {\n return;\n }\n\n // if this interaction had been removed after stopping\n // add it back\n if (utils.indexOf(scope.interactions, this) === -1) {\n scope.interactions.push(this);\n }\n\n utils.copyAction(this.prepared, action);\n this.target = target;\n this.element = element;\n\n signals.fire('action-start', {\n interaction: this,\n event: this.downEvent,\n });\n }\n\n pointerMove (pointer, event, eventTarget) {\n if (!this.simulation) {\n this.updatePointer(pointer);\n utils.setCoords(this.curCoords, this.pointers);\n }\n\n const duplicateMove = (this.curCoords.page.x === this.prevCoords.page.x\n && this.curCoords.page.y === this.prevCoords.page.y\n && this.curCoords.client.x === this.prevCoords.client.x\n && this.curCoords.client.y === this.prevCoords.client.y);\n\n let dx;\n let dy;\n\n // register movement greater than pointerMoveTolerance\n if (this.pointerIsDown && !this.pointerWasMoved) {\n dx = this.curCoords.client.x - this.startCoords.client.x;\n dy = this.curCoords.client.y - this.startCoords.client.y;\n\n this.pointerWasMoved = utils.hypot(dx, dy) > Interaction.pointerMoveTolerance;\n }\n\n const signalArg = {\n pointer,\n pointerIndex: this.getPointerIndex(pointer),\n event,\n eventTarget,\n dx,\n dy,\n duplicate: duplicateMove,\n interaction: this,\n interactingBeforeMove: this.interacting(),\n };\n\n if (!duplicateMove) {\n // set pointer coordinate, time changes and speeds\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n }\n\n signals.fire('move', signalArg);\n\n if (!duplicateMove) {\n // if interacting, fire an 'action-move' signal etc\n if (this.interacting()) {\n this.doMove(signalArg);\n }\n\n if (this.pointerWasMoved) {\n utils.copyCoords(this.prevCoords, this.curCoords);\n }\n }\n }\n\n /*\\\n * Interaction.doMove\n [ method ]\n *\n * Force a move of the current action at the same coordinates. Useful if\n * snap/restrict has been changed and you want a movement with the new\n * settings.\n *\n **\n | interact(target)\n | .draggable(true)\n | .on('dragmove', function (event) {\n | if (someCondition) {\n | // change the snap settings\n | event.interactable.draggable({ snap: { targets: [] }});\n | // fire another move event with re-calculated snap\n | event.interaction.doMove();\n | }\n | });\n \\*/\n doMove (signalArg) {\n signalArg = utils.extend({\n pointer: this.pointers[0],\n event: this.prevEvent,\n eventTarget: this._eventTarget,\n interaction: this,\n }, signalArg || {});\n\n signals.fire('before-action-move', signalArg);\n\n if (!this._dontFireMove) {\n signals.fire('action-move', signalArg);\n }\n\n this._dontFireMove = false;\n }\n\n // End interact move events and stop auto-scroll unless simulation is running\n pointerUp (pointer, event, eventTarget, curEventTarget) {\n const pointerIndex = this.getPointerIndex(pointer);\n\n signals.fire(/cancel$/i.test(event.type)? 'cancel' : 'up', {\n pointer,\n pointerIndex,\n event,\n eventTarget,\n curEventTarget,\n interaction: this,\n });\n\n if (!this.simulation) {\n this.end(event);\n }\n\n this.pointerIsDown = false;\n this.removePointer(pointer, event);\n }\n\n /*\\\n * Interaction.end\n [ method ]\n *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n - event (PointerEvent) #optional\n **\n | interact(target)\n | .draggable(true)\n | .on('move', function (event) {\n | if (event.pageX > 1000) {\n | // end the current action\n | event.interaction.end();\n | // stop all further listeners from being called\n | event.stopImmediatePropagation();\n | }\n | });\n \\*/\n end (event) {\n event = event || this.prevEvent;\n\n if (this.interacting()) {\n signals.fire('action-end', {\n event,\n interaction: this,\n });\n }\n\n this.stop();\n }\n\n currentAction () {\n return this._interacting? this.prepared.name: null;\n }\n\n interacting () {\n return this._interacting;\n }\n\n stop () {\n signals.fire('stop', { interaction: this });\n\n if (this._interacting) {\n signals.fire('stop-active', { interaction: this });\n signals.fire('stop-' + this.prepared.name, { interaction: this });\n }\n\n this.target = this.element = null;\n\n this._interacting = false;\n this.prepared.name = this.prevEvent = null;\n }\n\n getPointerIndex (pointer) {\n // mouse and pen interactions may have only one pointer\n if (this.pointerType === 'mouse' || this.pointerType === 'pen') {\n return 0;\n }\n\n return utils.indexOf(this.pointerIds, utils.getPointerId(pointer));\n }\n\n updatePointer (pointer, event, down = event && /(down|start)$/i.test(event.type)) {\n const id = utils.getPointerId(pointer);\n let index = this.getPointerIndex(pointer);\n\n if (index === -1) {\n index = this.pointerIds.length;\n this.pointerIds[index] = id;\n }\n\n if (down) {\n signals.fire('update-pointer-down', {\n pointer,\n event,\n down,\n pointerId: id,\n pointerIndex: index,\n interaction: this,\n });\n }\n\n this.pointers[index] = pointer;\n\n return index;\n }\n\n removePointer (pointer, event) {\n const index = this.getPointerIndex(pointer);\n\n if (index === -1) { return; }\n\n signals.fire('remove-pointer', {\n pointer,\n event,\n pointerIndex: index,\n interaction: this,\n });\n\n this.pointers .splice(index, 1);\n this.pointerIds .splice(index, 1);\n this.downTargets.splice(index, 1);\n this.downTimes .splice(index, 1);\n }\n\n _updateEventTargets (target, currentTarget) {\n this._eventTarget = target;\n this._curEventTarget = currentTarget;\n }\n}\n\nfor (let i = 0, len = methodNames.length; i < len; i++) {\n const method = methodNames[i];\n\n listeners[method] = doOnInteractions(method);\n}\n\nfunction doOnInteractions (method) {\n return (function (event) {\n const pointerType = utils.getPointerType(event);\n const [eventTarget, curEventTarget] = utils.getEventTargets(event);\n const matches = []; // [ [pointer, interaction], ...]\n\n if (browser.supportsTouch && /touch/.test(event.type)) {\n prevTouchTime = new Date().getTime();\n\n for (let i = 0; i < event.changedTouches.length; i++) {\n const pointer = event.changedTouches[i];\n const interaction = finder.search(pointer, event.type, eventTarget);\n\n matches.push([pointer, interaction || new Interaction({ pointerType })]);\n }\n }\n else {\n let invalidPointer = false;\n\n if (!browser.supportsPointerEvent && /mouse/.test(event.type)) {\n // ignore mouse events while touch interactions are active\n for (let i = 0; i < scope.interactions.length && !invalidPointer; i++) {\n invalidPointer = scope.interactions[i].pointerType !== 'mouse' && scope.interactions[i].pointerIsDown;\n }\n\n // try to ignore mouse events that are simulated by the browser\n // after a touch event\n invalidPointer = invalidPointer\n || (new Date().getTime() - prevTouchTime < 500)\n // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated\n || event.timeStamp === 0;\n }\n\n if (!invalidPointer) {\n let interaction = finder.search(event, event.type, eventTarget);\n\n if (!interaction) {\n interaction = new Interaction({ pointerType });\n }\n\n matches.push([event, interaction]);\n }\n }\n\n for (const [pointer, interaction] of matches) {\n interaction._updateEventTargets(eventTarget, curEventTarget);\n interaction[method](pointer, event, eventTarget, curEventTarget);\n }\n });\n}\n\nfunction endAll (event) {\n for (let i = 0; i < scope.interactions.length; i++) {\n const interaction = scope.interactions[i];\n\n interaction.end(event);\n signals.fire('endall', { event, interaction });\n }\n}\n\nconst docEvents = { /* 'eventType': listenerFunc */ };\nconst pEventTypes = browser.pEventTypes;\n\nif (domObjects.PointerEvent) {\n docEvents[pEventTypes.down ] = listeners.pointerDown;\n docEvents[pEventTypes.move ] = listeners.pointerMove;\n docEvents[pEventTypes.up ] = listeners.pointerUp;\n docEvents[pEventTypes.cancel] = listeners.pointerUp;\n}\nelse {\n docEvents.mousedown = listeners.pointerDown;\n docEvents.mousemove = listeners.pointerMove;\n docEvents.mouseup = listeners.pointerUp;\n\n docEvents.touchstart = listeners.pointerDown;\n docEvents.touchmove = listeners.pointerMove;\n docEvents.touchend = listeners.pointerUp;\n docEvents.touchcancel = listeners.pointerUp;\n}\n\ndocEvents.blur = endAll;\n\nfunction onDocSignal ({ doc }, signalName) {\n const eventMethod = signalName.indexOf('add') === 0\n ? events.add : events.remove;\n\n // delegate event listener\n for (const eventType in scope.delegatedEvents) {\n eventMethod(doc, eventType, events.delegateListener);\n eventMethod(doc, eventType, events.delegateUseCapture, true);\n }\n\n for (const eventType in docEvents) {\n eventMethod(doc, eventType, docEvents[eventType]);\n }\n}\n\nsignals.on('update-pointer-down', ({ interaction, pointer, pointerId, pointerIndex, event, eventTarget, down }) => {\n interaction.pointerIds[pointerIndex] = pointerId;\n interaction.pointers[pointerIndex] = pointer;\n\n if (down) {\n interaction.pointerIsDown = true;\n }\n\n if (!interaction.interacting()) {\n utils.setCoords(interaction.startCoords, interaction.pointers);\n\n utils.copyCoords(interaction.curCoords , interaction.startCoords);\n utils.copyCoords(interaction.prevCoords, interaction.startCoords);\n\n interaction.downEvent = event;\n interaction.downTimes[pointerIndex] = interaction.curCoords.timeStamp;\n interaction.downTargets[pointerIndex] = eventTarget || event && utils.getEventTargets(event)[0];\n interaction.pointerWasMoved = false;\n\n utils.pointerExtend(interaction.downPointer, pointer);\n }\n});\n\nscope.signals.on('add-document' , onDocSignal);\nscope.signals.on('remove-document', onDocSignal);\n\nInteraction.pointerMoveTolerance = 1;\nInteraction.doOnInteractions = doOnInteractions;\nInteraction.endAll = endAll;\nInteraction.signals = signals;\nInteraction.docEvents = docEvents;\n\nscope.endAllInteractions = endAll;\n\nmodule.exports = Interaction;\n","const Interaction = require('../Interaction');\nconst InteractEvent = require('../InteractEvent');\n\nconst actions = {\n firePrepared,\n names: [],\n methodDict: {},\n};\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n interaction._interacting = true;\n firePrepared(interaction, event, 'start');\n});\n\nInteraction.signals.on('action-move', function ({ interaction, event, preEnd }) {\n firePrepared(interaction, event, 'move', preEnd);\n\n // if the action was ended in a listener\n if (!interaction.interacting()) { return false; }\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n firePrepared(interaction, event, 'end');\n});\n\nfunction firePrepared (interaction, event, phase, preEnd) {\n const actionName = interaction.prepared.name;\n\n const newEvent = new InteractEvent(interaction, event, actionName, phase, interaction.element, null, preEnd);\n\n interaction.target.fire(newEvent);\n interaction.prevEvent = newEvent;\n}\n\nmodule.exports = actions;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drag = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n startAxis : 'xy',\n lockAxis : 'xy',\n },\n\n checker: function (pointer, event, interactable) {\n const dragOptions = interactable.options.drag;\n\n return dragOptions.enabled\n ? { name: 'drag', axis: (dragOptions.lockAxis === 'start'\n ? dragOptions.startAxis\n : dragOptions.lockAxis)}\n : null;\n },\n\n getCursor: function () {\n return 'move';\n },\n};\n\nInteraction.signals.on('before-action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n interaction.curCoords.page.y = interaction.startCoords.page.y;\n interaction.curCoords.client.y = interaction.startCoords.client.y;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vx);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vx);\n interaction.pointerDelta.client.vy = 0;\n interaction.pointerDelta.page.vy = 0;\n }\n else if (axis === 'y') {\n interaction.curCoords.page.x = interaction.startCoords.page.x;\n interaction.curCoords.client.x = interaction.startCoords.client.x;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vy);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vy);\n interaction.pointerDelta.client.vx = 0;\n interaction.pointerDelta.page.vx = 0;\n }\n});\n\n// dragmove\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'dragmove') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n iEvent.pageY = interaction.startCoords.page.y;\n iEvent.clientY = interaction.startCoords.client.y;\n iEvent.dy = 0;\n }\n else if (axis === 'y') {\n iEvent.pageX = interaction.startCoords.page.x;\n iEvent.clientX = interaction.startCoords.client.x;\n iEvent.dx = 0;\n }\n});\n\n/*\\\n * Interactable.draggable\n [ method ]\n *\n * Gets or sets whether drag actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of drag events\n | var isDraggable = interact('ul li').draggable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on drag events (object makes the Interactable draggable)\n = (object) This Interactable\n | interact(element).draggable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // the axis in which the first movement must be\n | // for the drag sequence to start\n | // 'xy' by default - any direction\n | startAxis: 'x' || 'y' || 'xy',\n |\n | // 'xy' by default - don't restrict to one axis (move in any direction)\n | // 'x' or 'y' to restrict movement to either axis\n | // 'start' to restrict movement to the axis the drag started in\n | lockAxis: 'x' || 'y' || 'xy' || 'start',\n |\n | // max number of drags that can happen concurrently\n | // with elements of this Interactable. Infinity by default\n | max: Infinity,\n |\n | // max number of drags that can target the same element+Interactable\n | // 1 by default\n | maxPerElement: 2\n | });\n\\*/\nInteractable.prototype.draggable = function (options) {\n if (utils.is.object(options)) {\n this.options.drag.enabled = options.enabled === false? false: true;\n this.setPerAction('drag', options);\n this.setOnEvents('drag', options);\n\n if (/^(xy|x|y|start)$/.test(options.lockAxis)) {\n this.options.drag.lockAxis = options.lockAxis;\n }\n if (/^(xy|x|y)$/.test(options.startAxis)) {\n this.options.drag.startAxis = options.startAxis;\n }\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drag.enabled = options;\n\n if (!options) {\n this.ondragstart = this.ondragstart = this.ondragend = null;\n }\n\n return this;\n }\n\n return this.options.drag;\n};\n\nactions.drag = drag;\nactions.names.push('drag');\nutils.merge(Interactable.eventTypes, [\n 'dragstart',\n 'dragmove',\n 'draginertiastart',\n 'draginertiaresume',\n 'dragend',\n]);\nactions.methodDict.drag = 'draggable';\n\ndefaultOptions.drag = drag.defaults;\n\nmodule.exports = drag;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst scope = require('../scope');\nconst interact = require('../interact');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drop = {\n defaults: {\n enabled: false,\n accept : null,\n overlap: 'pointer',\n },\n};\n\nlet dynamicDrop = false;\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // reset active dropzones\n interaction.activeDrops.dropzones = [];\n interaction.activeDrops.elements = [];\n interaction.activeDrops.rects = [];\n\n interaction.dropEvents = null;\n\n if (!interaction.dynamicDrop) {\n setActiveDrops(interaction, interaction.element);\n }\n\n const dragEvent = interaction.prevEvent;\n const dropEvents = getDropEvents(interaction, event, dragEvent);\n\n if (dropEvents.activate) {\n fireActiveDrops(interaction, dropEvents.activate);\n }\n});\n\nInteractEvent.signals.on('new', function ({ interaction, iEvent, event }) {\n if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { return; }\n\n const draggableElement = interaction.element;\n const dragEvent = iEvent;\n const dropResult = getDrop(dragEvent, event, draggableElement);\n\n interaction.dropTarget = dropResult.dropzone;\n interaction.dropElement = dropResult.element;\n\n interaction.dropEvents = getDropEvents(interaction, event, dragEvent);\n});\n\nInteraction.signals.on('action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n fireDropEvents(interaction, interaction.dropEvents);\n});\n\nInteraction.signals.on('action-end', function ({ interaction }) {\n if (interaction.prepared.name === 'drag') {\n fireDropEvents(interaction, interaction.dropEvents);\n }\n});\n\nInteraction.signals.on('stop-drag', function ({ interaction }) {\n interaction.activeDrops.dropzones =\n interaction.activeDrops.elements =\n interaction.activeDrops.rects =\n interaction.dropEvents = null;\n});\n\nfunction collectDrops (interaction, element) {\n const drops = [];\n const elements = [];\n\n element = element || interaction.element;\n\n // collect all dropzones and their elements which qualify for a drop\n for (const current of scope.interactables) {\n if (!current.options.drop.enabled) { continue; }\n\n const accept = current.options.drop.accept;\n\n // test the draggable element against the dropzone's accept setting\n if ((utils.is.element(accept) && accept !== element)\n || (utils.is.string(accept)\n && !utils.matchesSelector(element, accept))) {\n\n continue;\n }\n\n // query for new elements if necessary\n const dropElements = utils.is.string(current.target)\n ? current._context.querySelectorAll(current.target)\n : [current.target];\n\n for (let i = 0; i < dropElements.length; i++) {\n const currentElement = dropElements[i];\n\n if (currentElement !== element) {\n drops.push(current);\n elements.push(currentElement);\n }\n }\n }\n\n return {\n elements,\n dropzones: drops,\n };\n}\n\nfunction fireActiveDrops (interaction, event) {\n let prevElement;\n\n // loop through all active dropzones and trigger event\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n const current = interaction.activeDrops.dropzones[i];\n const currentElement = interaction.activeDrops.elements [i];\n\n // prevent trigger of duplicate events on same element\n if (currentElement !== prevElement) {\n // set current element as event target\n event.target = currentElement;\n current.fire(event);\n }\n prevElement = currentElement;\n }\n}\n\n// Collect a new set of possible drops and save them in activeDrops.\n// setActiveDrops should always be called when a drag has just started or a\n// drag event happens while dynamicDrop is true\nfunction setActiveDrops (interaction, dragElement) {\n // get dropzones and their elements that could receive the draggable\n const possibleDrops = collectDrops(interaction, dragElement, true);\n\n interaction.activeDrops.dropzones = possibleDrops.dropzones;\n interaction.activeDrops.elements = possibleDrops.elements;\n interaction.activeDrops.rects = [];\n\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n interaction.activeDrops.rects[i] =\n interaction.activeDrops.dropzones[i].getRect(interaction.activeDrops.elements[i]);\n }\n}\n\nfunction getDrop (dragEvent, event, dragElement) {\n const interaction = dragEvent.interaction;\n const validDrops = [];\n\n if (dynamicDrop) {\n setActiveDrops(interaction, dragElement);\n }\n\n // collect all dropzones and their elements which qualify for a drop\n for (let j = 0; j < interaction.activeDrops.dropzones.length; j++) {\n const current = interaction.activeDrops.dropzones[j];\n const currentElement = interaction.activeDrops.elements [j];\n const rect = interaction.activeDrops.rects [j];\n\n validDrops.push(current.dropCheck(dragEvent, event, interaction.target, dragElement, currentElement, rect)\n ? currentElement\n : null);\n }\n\n // get the most appropriate dropzone based on DOM depth and order\n const dropIndex = utils.indexOfDeepestElement(validDrops);\n\n return {\n dropzone: interaction.activeDrops.dropzones[dropIndex] || null,\n element : interaction.activeDrops.elements [dropIndex] || null,\n };\n}\n\nfunction getDropEvents (interaction, pointerEvent, dragEvent) {\n const dropEvents = {\n enter : null,\n leave : null,\n activate : null,\n deactivate: null,\n move : null,\n drop : null,\n };\n\n const tmpl = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n };\n\n if (interaction.dropElement !== interaction.prevDropElement) {\n // if there was a prevDropTarget, create a dragleave event\n if (interaction.prevDropTarget) {\n dropEvents.leave = utils.extend({ type: 'dragleave' }, tmpl);\n\n dragEvent.dragLeave = dropEvents.leave.target = interaction.prevDropElement;\n dragEvent.prevDropzone = dropEvents.leave.dropzone = interaction.prevDropTarget;\n }\n // if the dropTarget is not null, create a dragenter event\n if (interaction.dropTarget) {\n dropEvents.enter = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n type : 'dragenter',\n };\n\n dragEvent.dragEnter = interaction.dropElement;\n dragEvent.dropzone = interaction.dropTarget;\n }\n }\n\n if (dragEvent.type === 'dragend' && interaction.dropTarget) {\n dropEvents.drop = utils.extend({ type: 'drop' }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n dragEvent.relatedTarget = interaction.dropElement;\n }\n if (dragEvent.type === 'dragstart') {\n dropEvents.activate = utils.extend({ type: 'dropactivate' }, tmpl);\n\n dropEvents.activate.target = null;\n dropEvents.activate.dropzone = null;\n }\n if (dragEvent.type === 'dragend') {\n dropEvents.deactivate = utils.extend({ type: 'dropdeactivate' }, tmpl);\n\n dropEvents.deactivate.target = null;\n dropEvents.deactivate.dropzone = null;\n }\n if (dragEvent.type === 'dragmove' && interaction.dropTarget) {\n dropEvents.move = utils.extend({\n dragmove : dragEvent,\n type : 'dropmove',\n }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n }\n\n return dropEvents;\n}\n\nfunction fireDropEvents (interaction, dropEvents) {\n if (dropEvents.leave) { interaction.prevDropTarget.fire(dropEvents.leave); }\n if (dropEvents.move ) { interaction.dropTarget.fire(dropEvents.move ); }\n if (dropEvents.enter) { interaction.dropTarget.fire(dropEvents.enter); }\n if (dropEvents.drop ) { interaction.dropTarget.fire(dropEvents.drop ); }\n if (dropEvents.deactivate) {\n fireActiveDrops(interaction, dropEvents.deactivate);\n }\n\n interaction.prevDropTarget = interaction.dropTarget;\n interaction.prevDropElement = interaction.dropElement;\n}\n\n/*\\\n * Interactable.dropzone\n [ method ]\n *\n * Returns or sets whether elements can be dropped onto this\n * Interactable to trigger drop events\n *\n * Dropzones can receive the following events:\n * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends\n * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone\n * - `dragmove` when a draggable that has entered the dropzone is moved\n * - `drop` when a draggable is dropped into this dropzone\n *\n * Use the `accept` option to allow only elements that match the given CSS\n * selector or element. The value can be:\n *\n * - **an Element** - only that element can be dropped into this dropzone.\n * - **a string**, - the element being dragged must match it as a CSS selector.\n * - **`null`** - accept options is cleared - it accepts any element.\n *\n * Use the `overlap` option to set how drops are checked for. The allowed\n * values are:\n *\n * - `'pointer'`, the pointer must be over the dropzone (default)\n * - `'center'`, the draggable element's center must be over the dropzone\n * - a number from 0-1 which is the `(intersection area) / (draggable area)`.\n * e.g. `0.5` for drop to happen when half of the area of the draggable is\n * over the dropzone\n *\n * Use the `checker` option to specify a function to check if a dragged\n * element is over this Interactable.\n *\n | interact(target)\n | .dropChecker(function(dragEvent, // related dragmove or dragend event\n | event, // TouchEvent/PointerEvent/MouseEvent\n | dropped, // bool result of the default checker\n | dropzone, // dropzone Interactable\n | dropElement, // dropzone elemnt\n | draggable, // draggable Interactable\n | draggableElement) {// draggable element\n |\n | return dropped && event.target.hasAttribute('allow-drop');\n | }\n *\n *\n - options (boolean | object | null) #optional The new value to be set.\n | interact('.drop').dropzone({\n | accept: '.can-drop' || document.getElementById('single-drop'),\n | overlap: 'pointer' || 'center' || zeroToOne\n | }\n = (boolean | object) The current setting or this Interactable\n\\*/\nInteractable.prototype.dropzone = function (options) {\n if (utils.is.object(options)) {\n this.options.drop.enabled = options.enabled === false? false: true;\n\n if (utils.is.function(options.ondrop) ) { this.events.ondrop = options.ondrop ; }\n if (utils.is.function(options.ondropactivate) ) { this.events.ondropactivate = options.ondropactivate ; }\n if (utils.is.function(options.ondropdeactivate)) { this.events.ondropdeactivate = options.ondropdeactivate; }\n if (utils.is.function(options.ondragenter) ) { this.events.ondragenter = options.ondragenter ; }\n if (utils.is.function(options.ondragleave) ) { this.events.ondragleave = options.ondragleave ; }\n if (utils.is.function(options.ondropmove) ) { this.events.ondropmove = options.ondropmove ; }\n\n if (/^(pointer|center)$/.test(options.overlap)) {\n this.options.drop.overlap = options.overlap;\n }\n else if (utils.is.number(options.overlap)) {\n this.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0);\n }\n if ('accept' in options) {\n this.options.drop.accept = options.accept;\n }\n if ('checker' in options) {\n this.options.drop.checker = options.checker;\n }\n\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drop.enabled = options;\n\n if (!options) {\n this.ondragenter = this.ondragleave = this.ondrop\n = this.ondropactivate = this.ondropdeactivate = null;\n }\n\n return this;\n }\n\n return this.options.drop;\n};\n\nInteractable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) {\n let dropped = false;\n\n // if the dropzone has no rect (eg. display: none)\n // call the custom dropChecker or just return false\n if (!(rect = rect || this.getRect(dropElement))) {\n return (this.options.drop.checker\n ? this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement)\n : false);\n }\n\n const dropOverlap = this.options.drop.overlap;\n\n if (dropOverlap === 'pointer') {\n const origin = utils.getOriginXY(draggable, draggableElement, 'drag');\n const page = utils.getPageXY(dragEvent);\n\n page.x += origin.x;\n page.y += origin.y;\n\n const horizontal = (page.x > rect.left) && (page.x < rect.right);\n const vertical = (page.y > rect.top ) && (page.y < rect.bottom);\n\n dropped = horizontal && vertical;\n }\n\n const dragRect = draggable.getRect(draggableElement);\n\n if (dragRect && dropOverlap === 'center') {\n const cx = dragRect.left + dragRect.width / 2;\n const cy = dragRect.top + dragRect.height / 2;\n\n dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom;\n }\n\n if (dragRect && utils.is.number(dropOverlap)) {\n const overlapArea = (Math.max(0, Math.min(rect.right , dragRect.right ) - Math.max(rect.left, dragRect.left))\n * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top , dragRect.top )));\n\n const overlapRatio = overlapArea / (dragRect.width * dragRect.height);\n\n dropped = overlapRatio >= dropOverlap;\n }\n\n if (this.options.drop.checker) {\n dropped = this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement);\n }\n\n return dropped;\n};\n\nInteractable.signals.on('unset', function ({ interactable }) {\n interactable.dropzone(false);\n});\n\nInteractable.settingsMethods.push('dropChecker');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.dropTarget = null; // the dropzone a drag target might be dropped into\n interaction.dropElement = null; // the element at the time of checking\n interaction.prevDropTarget = null; // the dropzone that was recently dragged away from\n interaction.prevDropElement = null; // the element at the time of checking\n interaction.dropEvents = null; // the dropEvents related to the current drag event\n\n interaction.activeDrops = {\n dropzones: [], // the dropzones that are mentioned below\n elements : [], // elements of dropzones that accept the target draggable\n rects : [], // the rects of the elements mentioned above\n };\n\n});\n\nInteraction.signals.on('stop', function ({ interaction }) {\n interaction.dropTarget = interaction.dropElement =\n interaction.prevDropTarget = interaction.prevDropElement = null;\n});\n\n/*\\\n * interact.dynamicDrop\n [ method ]\n *\n * Returns or sets whether the dimensions of dropzone elements are\n * calculated on every dragmove or only on dragstart for the default\n * dropChecker\n *\n - newValue (boolean) #optional True to check on each move. False to check only before start\n = (boolean | interact) The current setting or interact\n\\*/\ninteract.dynamicDrop = function (newValue) {\n if (utils.is.bool(newValue)) {\n //if (dragging && dynamicDrop !== newValue && !newValue) {\n //calcRects(dropzones);\n //}\n\n dynamicDrop = newValue;\n\n return interact;\n }\n return dynamicDrop;\n};\n\nutils.merge(Interactable.eventTypes, [\n 'dragenter',\n 'dragleave',\n 'dropactivate',\n 'dropdeactivate',\n 'dropmove',\n 'drop',\n]);\nactions.methodDict.drop = 'dropzone';\n\ndefaultOptions.drop = drop.defaults;\n\nmodule.exports = drop;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst gesture = {\n defaults: {\n enabled : false,\n origin : null,\n restrict: null,\n },\n\n checker: function (pointer, event, interactable, element, interaction) {\n if (interaction.pointerIds.length >= 2) {\n return { name: 'gesture' };\n }\n\n return null;\n },\n\n getCursor: function () {\n return '';\n },\n};\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturestart') { return; }\n iEvent.ds = 0;\n\n interaction.gesture.startDistance = interaction.gesture.prevDistance = iEvent.distance;\n interaction.gesture.startAngle = interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.scale = 1;\n});\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturemove') { return; }\n\n iEvent.ds = iEvent.scale - interaction.gesture.scale;\n\n interaction.target.fire(iEvent);\n\n interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.prevDistance = iEvent.distance;\n\n if (iEvent.scale !== Infinity\n && iEvent.scale !== null\n && iEvent.scale !== undefined\n && !isNaN(iEvent.scale)) {\n\n interaction.gesture.scale = iEvent.scale;\n }\n});\n\n/*\\\n * Interactable.gesturable\n [ method ]\n *\n * Gets or sets whether multitouch gestures can be performed on the\n * Interactable's element\n *\n = (boolean) Indicates if this can be the target of gesture events\n | var isGestureable = interact(element).gesturable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on gesture events (makes the Interactable gesturable)\n = (object) this Interactable\n | interact(element).gesturable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // limit multiple gestures.\n | // See the explanation in @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n\\*/\nInteractable.prototype.gesturable = function (options) {\n if (utils.is.object(options)) {\n this.options.gesture.enabled = options.enabled === false? false: true;\n this.setPerAction('gesture', options);\n this.setOnEvents('gesture', options);\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.gesture.enabled = options;\n\n if (!options) {\n this.ongesturestart = this.ongesturestart = this.ongestureend = null;\n }\n\n return this;\n }\n\n return this.options.gesture;\n};\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action, event, starting, ending, deltaSource }) {\n if (action !== 'gesture') { return; }\n\n const pointers = interaction.pointers;\n\n iEvent.touches = [pointers[0], pointers[1]];\n\n if (starting) {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = 1;\n iEvent.ds = 0;\n iEvent.angle = utils.touchAngle(pointers, undefined, deltaSource);\n iEvent.da = 0;\n }\n else if (ending || event instanceof InteractEvent) {\n iEvent.distance = interaction.prevEvent.distance;\n iEvent.box = interaction.prevEvent.box;\n iEvent.scale = interaction.prevEvent.scale;\n iEvent.ds = iEvent.scale - 1;\n iEvent.angle = interaction.prevEvent.angle;\n iEvent.da = iEvent.angle - interaction.gesture.startAngle;\n }\n else {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = iEvent.distance / interaction.gesture.startDistance;\n iEvent.angle = utils.touchAngle(pointers, interaction.gesture.prevAngle, deltaSource);\n\n iEvent.ds = iEvent.scale - interaction.gesture.prevScale;\n iEvent.da = iEvent.angle - interaction.gesture.prevAngle;\n }\n});\n\nInteraction.signals.on('new', function (interaction) {\n interaction.gesture = {\n start: { x: 0, y: 0 },\n\n startDistance: 0, // distance between two touches of touchStart\n prevDistance : 0,\n distance : 0,\n\n scale: 1, // gesture.distance / gesture.startDistance\n\n startAngle: 0, // angle of line joining two touches\n prevAngle : 0, // angle of the previous gesture event\n };\n});\n\nactions.gesture = gesture;\nactions.names.push('gesture');\nutils.merge(Interactable.eventTypes, [\n 'gesturestart',\n 'gesturemove',\n 'gestureend',\n]);\nactions.methodDict.gesture = 'gesturable';\n\ndefaultOptions.gesture = gesture.defaults;\n\nmodule.exports = gesture;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\n// Less Precision with touch input\nconst defaultMargin = browser.supportsTouch || browser.supportsPointerEvent? 20: 10;\n\nconst resize = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n square: false,\n preserveAspectRatio: false,\n axis: 'xy',\n\n // use default margin\n margin: NaN,\n\n // object with props left, right, top, bottom which are\n // true/false values to resize when the pointer is over that edge,\n // CSS selectors to match the handles for each direction\n // or the Elements for each handle\n edges: null,\n\n // a value of 'none' will limit the resize rect to a minimum of 0x0\n // 'negate' will alow the rect to have negative width/height\n // 'reposition' will keep the width/height positive by swapping\n // the top and bottom edges and/or swapping the left and right edges\n invert: 'none',\n },\n\n checker: function (pointer, event, interactable, element, interaction, rect) {\n if (!rect) { return null; }\n\n const page = utils.extend({}, interaction.curCoords.page);\n const options = interactable.options;\n\n if (options.resize.enabled) {\n const resizeOptions = options.resize;\n const resizeEdges = { left: false, right: false, top: false, bottom: false };\n\n // if using resize.edges\n if (utils.is.object(resizeOptions.edges)) {\n for (const edge in resizeEdges) {\n resizeEdges[edge] = checkResizeEdge(edge,\n resizeOptions.edges[edge],\n page,\n interaction._eventTarget,\n element,\n rect,\n resizeOptions.margin || defaultMargin);\n }\n\n resizeEdges.left = resizeEdges.left && !resizeEdges.right;\n resizeEdges.top = resizeEdges.top && !resizeEdges.bottom;\n\n if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) {\n return {\n name: 'resize',\n edges: resizeEdges,\n };\n }\n }\n else {\n const right = options.resize.axis !== 'y' && page.x > (rect.right - defaultMargin);\n const bottom = options.resize.axis !== 'x' && page.y > (rect.bottom - defaultMargin);\n\n if (right || bottom) {\n return {\n name: 'resize',\n axes: (right? 'x' : '') + (bottom? 'y' : ''),\n };\n }\n }\n }\n\n return null;\n },\n\n cursors: (browser.isIe9OrOlder ? {\n x : 'e-resize',\n y : 's-resize',\n xy: 'se-resize',\n\n top : 'n-resize',\n left : 'w-resize',\n bottom : 's-resize',\n right : 'e-resize',\n topleft : 'se-resize',\n bottomright: 'se-resize',\n topright : 'ne-resize',\n bottomleft : 'ne-resize',\n } : {\n x : 'ew-resize',\n y : 'ns-resize',\n xy: 'nwse-resize',\n\n top : 'ns-resize',\n left : 'ew-resize',\n bottom : 'ns-resize',\n right : 'ew-resize',\n topleft : 'nwse-resize',\n bottomright: 'nwse-resize',\n topright : 'nesw-resize',\n bottomleft : 'nesw-resize',\n }),\n\n getCursor: function (action) {\n if (action.axis) {\n return resize.cursors[action.name + action.axis];\n }\n else if (action.edges) {\n let cursorKey = '';\n const edgeNames = ['top', 'bottom', 'left', 'right'];\n\n for (let i = 0; i < 4; i++) {\n if (action.edges[edgeNames[i]]) {\n cursorKey += edgeNames[i];\n }\n }\n\n return resize.cursors[cursorKey];\n }\n },\n};\n\n// resizestart\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'resizestart' || !interaction.prepared.edges) {\n return;\n }\n\n const startRect = interaction.target.getRect(interaction.element);\n const resizeOptions = interaction.target.options.resize;\n\n /*\n * When using the `resizable.square` or `resizable.preserveAspectRatio` options, resizing from one edge\n * will affect another. E.g. with `resizable.square`, resizing to make the right edge larger will make\n * the bottom edge larger by the same amount. We call these 'linked' edges. Any linked edges will depend\n * on the active edges and the edge being interacted with.\n */\n if (resizeOptions.square || resizeOptions.preserveAspectRatio) {\n const linkedEdges = utils.extend({}, interaction.prepared.edges);\n\n linkedEdges.top = linkedEdges.top || (linkedEdges.left && !linkedEdges.bottom);\n linkedEdges.left = linkedEdges.left || (linkedEdges.top && !linkedEdges.right );\n linkedEdges.bottom = linkedEdges.bottom || (linkedEdges.right && !linkedEdges.top );\n linkedEdges.right = linkedEdges.right || (linkedEdges.bottom && !linkedEdges.left );\n\n interaction.prepared._linkedEdges = linkedEdges;\n }\n else {\n interaction.prepared._linkedEdges = null;\n }\n\n // if using `resizable.preserveAspectRatio` option, record aspect ratio at the start of the resize\n if (resizeOptions.preserveAspectRatio) {\n interaction.resizeStartAspectRatio = startRect.width / startRect.height;\n }\n\n interaction.resizeRects = {\n start : startRect,\n current : utils.extend({}, startRect),\n inverted : utils.extend({}, startRect),\n previous : utils.extend({}, startRect),\n delta : {\n left: 0, right : 0, width : 0,\n top : 0, bottom: 0, height: 0,\n },\n };\n\n iEvent.rect = interaction.resizeRects.inverted;\n iEvent.deltaRect = interaction.resizeRects.delta;\n});\n\n// resizemove\nInteractEvent.signals.on('new', function ({ iEvent, phase, interaction }) {\n if (phase !== 'move' || !interaction.prepared.edges) { return; }\n\n const resizeOptions = interaction.target.options.resize;\n const invert = resizeOptions.invert;\n const invertible = invert === 'reposition' || invert === 'negate';\n\n let edges = interaction.prepared.edges;\n\n const start = interaction.resizeRects.start;\n const current = interaction.resizeRects.current;\n const inverted = interaction.resizeRects.inverted;\n const delta = interaction.resizeRects.delta;\n const previous = utils.extend(interaction.resizeRects.previous, inverted);\n const originalEdges = edges;\n\n let dx = iEvent.dx;\n let dy = iEvent.dy;\n\n if (resizeOptions.preserveAspectRatio || resizeOptions.square) {\n // `resize.preserveAspectRatio` takes precedence over `resize.square`\n const startAspectRatio = resizeOptions.preserveAspectRatio\n ? interaction.resizeStartAspectRatio\n : 1;\n\n edges = interaction.prepared._linkedEdges;\n\n if ((originalEdges.left && originalEdges.bottom)\n || (originalEdges.right && originalEdges.top)) {\n dy = -dx / startAspectRatio;\n }\n else if (originalEdges.left || originalEdges.right ) { dy = dx / startAspectRatio; }\n else if (originalEdges.top || originalEdges.bottom) { dx = dy * startAspectRatio; }\n }\n\n // update the 'current' rect without modifications\n if (edges.top ) { current.top += dy; }\n if (edges.bottom) { current.bottom += dy; }\n if (edges.left ) { current.left += dx; }\n if (edges.right ) { current.right += dx; }\n\n if (invertible) {\n // if invertible, copy the current rect\n utils.extend(inverted, current);\n\n if (invert === 'reposition') {\n // swap edge values if necessary to keep width/height positive\n let swap;\n\n if (inverted.top > inverted.bottom) {\n swap = inverted.top;\n\n inverted.top = inverted.bottom;\n inverted.bottom = swap;\n }\n if (inverted.left > inverted.right) {\n swap = inverted.left;\n\n inverted.left = inverted.right;\n inverted.right = swap;\n }\n }\n }\n else {\n // if not invertible, restrict to minimum of 0x0 rect\n inverted.top = Math.min(current.top, start.bottom);\n inverted.bottom = Math.max(current.bottom, start.top);\n inverted.left = Math.min(current.left, start.right);\n inverted.right = Math.max(current.right, start.left);\n }\n\n inverted.width = inverted.right - inverted.left;\n inverted.height = inverted.bottom - inverted.top ;\n\n for (const edge in inverted) {\n delta[edge] = inverted[edge] - previous[edge];\n }\n\n iEvent.edges = interaction.prepared.edges;\n iEvent.rect = inverted;\n iEvent.deltaRect = delta;\n});\n\n/*\\\n * Interactable.resizable\n [ method ]\n *\n * Gets or sets whether resize actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of resize elements\n | var isResizeable = interact('input[type=text]').resizable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on resize events (object makes the Interactable resizable)\n = (object) This Interactable\n | interact(element).resizable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | edges: {\n | top : true, // Use pointer coords to check for resize.\n | left : false, // Disable resizing from left edge.\n | bottom: '.resize-s',// Resize if pointer target matches selector\n | right : handleEl // Resize if pointer target is the given Element\n | },\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height are adjusted at a 1:1 ratio.\n | square: false,\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height maintain the aspect ratio they had when resizing started.\n | preserveAspectRatio: false,\n |\n | // a value of 'none' will limit the resize rect to a minimum of 0x0\n | // 'negate' will allow the rect to have negative width/height\n | // 'reposition' will keep the width/height positive by swapping\n | // the top and bottom edges and/or swapping the left and right edges\n | invert: 'none' || 'negate' || 'reposition'\n |\n | // limit multiple resizes.\n | // See the explanation in the @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n \\*/\nInteractable.prototype.resizable = function (options) {\n if (utils.is.object(options)) {\n this.options.resize.enabled = options.enabled === false? false: true;\n this.setPerAction('resize', options);\n this.setOnEvents('resize', options);\n\n if (/^x$|^y$|^xy$/.test(options.axis)) {\n this.options.resize.axis = options.axis;\n }\n else if (options.axis === null) {\n this.options.resize.axis = defaultOptions.resize.axis;\n }\n\n if (utils.is.bool(options.preserveAspectRatio)) {\n this.options.resize.preserveAspectRatio = options.preserveAspectRatio;\n }\n else if (utils.is.bool(options.square)) {\n this.options.resize.square = options.square;\n }\n\n return this;\n }\n if (utils.is.bool(options)) {\n this.options.resize.enabled = options;\n\n if (!options) {\n this.onresizestart = this.onresizestart = this.onresizeend = null;\n }\n\n return this;\n }\n return this.options.resize;\n};\n\nfunction checkResizeEdge (name, value, page, element, interactableElement, rect, margin) {\n // false, '', undefined, null\n if (!value) { return false; }\n\n // true value, use pointer coords and element rect\n if (value === true) {\n // if dimensions are negative, \"switch\" edges\n const width = utils.is.number(rect.width )? rect.width : rect.right - rect.left;\n const height = utils.is.number(rect.height)? rect.height : rect.bottom - rect.top ;\n\n if (width < 0) {\n if (name === 'left' ) { name = 'right'; }\n else if (name === 'right') { name = 'left' ; }\n }\n if (height < 0) {\n if (name === 'top' ) { name = 'bottom'; }\n else if (name === 'bottom') { name = 'top' ; }\n }\n\n if (name === 'left' ) { return page.x < ((width >= 0? rect.left: rect.right ) + margin); }\n if (name === 'top' ) { return page.y < ((height >= 0? rect.top : rect.bottom) + margin); }\n\n if (name === 'right' ) { return page.x > ((width >= 0? rect.right : rect.left) - margin); }\n if (name === 'bottom') { return page.y > ((height >= 0? rect.bottom: rect.top ) - margin); }\n }\n\n // the remaining checks require an element\n if (!utils.is.element(element)) { return false; }\n\n return utils.is.element(value)\n // the value is an element to use as a resize handle\n ? value === element\n // otherwise check if element matches value as selector\n : utils.matchesUpTo(element, value, interactableElement);\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.resizeAxes = 'xy';\n});\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action }) {\n if (action !== 'resize' || !interaction.resizeAxes) { return; }\n\n const options = interaction.target.options;\n\n if (options.resize.square) {\n if (interaction.resizeAxes === 'y') {\n iEvent.dx = iEvent.dy;\n }\n else {\n iEvent.dy = iEvent.dx;\n }\n iEvent.axes = 'xy';\n }\n else {\n iEvent.axes = interaction.resizeAxes;\n\n if (interaction.resizeAxes === 'x') {\n iEvent.dy = 0;\n }\n else if (interaction.resizeAxes === 'y') {\n iEvent.dx = 0;\n }\n }\n});\n\nactions.resize = resize;\nactions.names.push('resize');\nutils.merge(Interactable.eventTypes, [\n 'resizestart',\n 'resizemove',\n 'resizeinertiastart',\n 'resizeinertiaresume',\n 'resizeend',\n]);\nactions.methodDict.resize = 'resizable';\n\ndefaultOptions.resize = resize.defaults;\n\nmodule.exports = resize;\n","const raf = require('./utils/raf');\nconst getWindow = require('./utils/window').getWindow;\nconst is = require('./utils/is');\nconst domUtils = require('./utils/domUtils');\nconst Interaction = require('./Interaction');\nconst defaultOptions = require('./defaultOptions');\n\nconst autoScroll = {\n defaults: {\n enabled : false,\n container: null, // the item that is scrolled (Window or HTMLElement)\n margin : 60,\n speed : 300, // the scroll speed in pixels per second\n },\n\n interaction: null,\n i: null, // the handle returned by window.setInterval\n x: 0, y: 0, // Direction each pulse is to scroll in\n\n isScrolling: false,\n prevTime: 0,\n\n start: function (interaction) {\n autoScroll.isScrolling = true;\n raf.cancel(autoScroll.i);\n\n autoScroll.interaction = interaction;\n autoScroll.prevTime = new Date().getTime();\n autoScroll.i = raf.request(autoScroll.scroll);\n },\n\n stop: function () {\n autoScroll.isScrolling = false;\n raf.cancel(autoScroll.i);\n },\n\n // scroll the window by the values in scroll.x/y\n scroll: function () {\n const options = autoScroll.interaction.target.options[autoScroll.interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(autoScroll.interaction.element);\n const now = new Date().getTime();\n // change in time in seconds\n const dt = (now - autoScroll.prevTime) / 1000;\n // displacement\n const s = options.speed * dt;\n\n if (s >= 1) {\n if (is.window(container)) {\n container.scrollBy(autoScroll.x * s, autoScroll.y * s);\n }\n else if (container) {\n container.scrollLeft += autoScroll.x * s;\n container.scrollTop += autoScroll.y * s;\n }\n\n autoScroll.prevTime = now;\n }\n\n if (autoScroll.isScrolling) {\n raf.cancel(autoScroll.i);\n autoScroll.i = raf.request(autoScroll.scroll);\n }\n },\n check: function (interactable, actionName) {\n const options = interactable.options;\n\n return options[actionName].autoScroll && options[actionName].autoScroll.enabled;\n },\n onInteractionMove: function ({ interaction, pointer }) {\n if (!(interaction.interacting()\n && autoScroll.check(interaction.target, interaction.prepared.name))) {\n return;\n }\n\n if (interaction.simulation) {\n autoScroll.x = autoScroll.y = 0;\n return;\n }\n\n let top;\n let right;\n let bottom;\n let left;\n\n const options = interaction.target.options[interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(interaction.element);\n\n if (is.window(container)) {\n left = pointer.clientX < autoScroll.margin;\n top = pointer.clientY < autoScroll.margin;\n right = pointer.clientX > container.innerWidth - autoScroll.margin;\n bottom = pointer.clientY > container.innerHeight - autoScroll.margin;\n }\n else {\n const rect = domUtils.getElementClientRect(container);\n\n left = pointer.clientX < rect.left + autoScroll.margin;\n top = pointer.clientY < rect.top + autoScroll.margin;\n right = pointer.clientX > rect.right - autoScroll.margin;\n bottom = pointer.clientY > rect.bottom - autoScroll.margin;\n }\n\n autoScroll.x = (right ? 1: left? -1: 0);\n autoScroll.y = (bottom? 1: top? -1: 0);\n\n if (!autoScroll.isScrolling) {\n // set the autoScroll properties to those of the target\n autoScroll.margin = options.margin;\n autoScroll.speed = options.speed;\n\n autoScroll.start(interaction);\n }\n },\n};\n\nInteraction.signals.on('stop-active', function () {\n autoScroll.stop();\n});\n\nInteraction.signals.on('action-move', autoScroll.onInteractionMove);\n\ndefaultOptions.perAction.autoScroll = autoScroll.defaults;\n\nmodule.exports = autoScroll;\n","const Interactable = require('../Interactable');\nconst actions = require('../actions/base');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.ignoreFrom\n [ method ]\n *\n * If the target of the `mousedown`, `pointerdown` or `touchstart`\n * event or any of it's parents match the given CSS selector or\n * Element, no drag/resize/gesture is started.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to not ignore any elements\n = (string | Element | object) The current ignoreFrom value or this Interactable\n **\n | interact(element, { ignoreFrom: document.getElementById('no-action') });\n | // or\n | interact(element).ignoreFrom('input, textarea, a');\n\\*/\nInteractable.prototype.ignoreFrom = function (newValue) {\n return this._backCompatOption('ignoreFrom', newValue);\n};\n\n/*\\\n * Interactable.allowFrom\n [ method ]\n *\n * A drag/resize/gesture is started only If the target of the\n * `mousedown`, `pointerdown` or `touchstart` event or any of it's\n * parents match the given CSS selector or Element.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to allow from any element\n = (string | Element | object) The current allowFrom value or this Interactable\n **\n | interact(element, { allowFrom: document.getElementById('drag-handle') });\n | // or\n | interact(element).allowFrom('.handle');\n\\*/\nInteractable.prototype.allowFrom = function (newValue) {\n return this._backCompatOption('allowFrom', newValue);\n};\n\nInteractable.prototype.testIgnore = function (ignoreFrom, interactableElement, element) {\n if (!ignoreFrom || !is.element(element)) { return false; }\n\n if (is.string(ignoreFrom)) {\n return domUtils.matchesUpTo(element, ignoreFrom, interactableElement);\n }\n else if (is.element(ignoreFrom)) {\n return domUtils.nodeContains(ignoreFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testAllow = function (allowFrom, interactableElement, element) {\n if (!allowFrom) { return true; }\n\n if (!is.element(element)) { return false; }\n\n if (is.string(allowFrom)) {\n return domUtils.matchesUpTo(element, allowFrom, interactableElement);\n }\n else if (is.element(allowFrom)) {\n return domUtils.nodeContains(allowFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testIgnoreAllow = function (options, interactableElement, eventTarget) {\n return (!this.testIgnore(options.ignoreFrom, interactableElement, eventTarget)\n && this.testAllow(options.allowFrom, interactableElement, eventTarget));\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (event.buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\n","const interact = require('../interact');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst actions = require('../actions/base');\nconst defaultOptions = require('../defaultOptions');\nconst browser = require('../utils/browser');\nconst scope = require('../scope');\nconst utils = require('../utils');\nconst signals = require('../utils/Signals').new();\n\nrequire('./InteractableMethods');\n\nconst autoStart = {\n signals,\n withinInteractionLimit,\n // Allow this many interactions to happen simultaneously\n maxInteractions: Infinity,\n defaults: {\n perAction: {\n manualStart: false,\n max: Infinity,\n maxPerElement: 1,\n allowFrom: null,\n ignoreFrom: null,\n },\n },\n setActionDefaults: function (action) {\n utils.extend(action.defaults, autoStart.defaults.perAction);\n },\n};\n\n// set cursor style on mousedown\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget }) {\n if (interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\n// set cursor style on mousemove\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget }) {\n if (!interaction.mouse\n || interaction.pointerIsDown\n || interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\nInteraction.signals.on('move', function (arg) {\n const { interaction, event } = arg;\n\n if (!interaction.pointerIsDown\n || interaction.interacting()\n || !interaction.pointerWasMoved\n || !interaction.prepared.name) {\n return;\n }\n\n signals.fire('before-start', arg);\n\n const target = interaction.target;\n\n if (interaction.prepared.name && target) {\n // check manualStart and interaction limit\n if (target.options[interaction.prepared.name].manualStart\n || !withinInteractionLimit(target, interaction.element, interaction.prepared)) {\n interaction.stop(event);\n }\n else {\n interaction.start(interaction.prepared, target, interaction.element);\n }\n }\n});\n\n// Check if the current target supports the action.\n// If so, return the validated action. Otherwise, return null\nfunction validateAction (action, interactable, element, eventTarget) {\n if (utils.is.object(action)\n && interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget)\n && interactable.options[action.name].enabled\n && withinInteractionLimit(interactable, element, action)) {\n return action;\n }\n\n return null;\n}\n\nfunction validateSelector (interaction, pointer, event, matches, matchElements, eventTarget) {\n for (let i = 0, len = matches.length; i < len; i++) {\n const match = matches[i];\n const matchElement = matchElements[i];\n const action = validateAction(match.getAction(pointer, event, interaction, matchElement),\n match,\n matchElement,\n eventTarget);\n\n if (action) {\n return {\n action,\n target: match,\n element: matchElement,\n };\n }\n }\n\n return {};\n}\n\nfunction getActionInfo (interaction, pointer, event, eventTarget) {\n let matches = [];\n let matchElements = [];\n\n let element = eventTarget;\n let action = null;\n\n function pushMatches (interactable, selector, context) {\n const elements = (browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined);\n\n if (utils.matchesSelector(element, selector, elements)) {\n\n matches.push(interactable);\n matchElements.push(element);\n }\n }\n\n while (utils.is.element(element)) {\n matches = [];\n matchElements = [];\n\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && (action = validateAction(elementInteractable.getAction(pointer, event, interaction, element, eventTarget),\n elementInteractable,\n element,\n eventTarget))\n && !elementInteractable.options[action.name].manualStart) {\n return {\n element,\n action,\n target: elementInteractable,\n };\n }\n else {\n scope.interactables.forEachSelector(pushMatches, element);\n\n const actionInfo = validateSelector(interaction, pointer, event, matches, matchElements, eventTarget);\n\n if (actionInfo.action\n && !actionInfo.target.options[actionInfo.action.name].manualStart) {\n return actionInfo;\n }\n }\n\n element = utils.parentNode(element);\n }\n\n return {};\n}\n\nfunction prepare (interaction, { action, target, element }) {\n action = action || {};\n\n if (interaction.target && interaction.target.options.styleCursor) {\n interaction.target._doc.documentElement.style.cursor = '';\n }\n\n interaction.target = target;\n interaction.element = element;\n utils.copyAction(interaction.prepared, action);\n\n if (target && target.options.styleCursor) {\n const cursor = action? actions[action.name].getCursor(action) : '';\n interaction.target._doc.documentElement.style.cursor = cursor;\n }\n\n signals.fire('prepared', { interaction: interaction });\n}\n\nInteraction.signals.on('stop', function ({ interaction }) {\n const target = interaction.target;\n\n if (target && target.options.styleCursor) {\n target._doc.documentElement.style.cursor = '';\n }\n});\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (utils.is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (utils.is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n const buttons = event.buttons || ({\n 0: 1,\n 1: 4,\n 3: 8,\n 4: 16,\n })[event.button];\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\nfunction withinInteractionLimit (interactable, element, action) {\n const options = interactable.options;\n const maxActions = options[action.name].max;\n const maxPerElement = options[action.name].maxPerElement;\n let activeInteractions = 0;\n let targetCount = 0;\n let targetElementCount = 0;\n\n // no actions if any of these values == 0\n if (!(maxActions && maxPerElement && autoStart.maxInteractions)) { return; }\n\n for (let i = 0, len = scope.interactions.length; i < len; i++) {\n const interaction = scope.interactions[i];\n const otherAction = interaction.prepared.name;\n\n if (!interaction.interacting()) { continue; }\n\n activeInteractions++;\n\n if (activeInteractions >= autoStart.maxInteractions) {\n return false;\n }\n\n if (interaction.target !== interactable) { continue; }\n\n targetCount += (otherAction === action.name)|0;\n\n if (targetCount >= maxActions) {\n return false;\n }\n\n if (interaction.element === element) {\n targetElementCount++;\n\n if (otherAction !== action.name || targetElementCount >= maxPerElement) {\n return false;\n }\n }\n }\n\n return autoStart.maxInteractions > 0;\n}\n\n/*\\\n * interact.maxInteractions\n [ method ]\n **\n * Returns or sets the maximum number of concurrent interactions allowed.\n * By default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables\n * and elements, you need to enable it in the draggable, resizable and\n * gesturable `'max'` and `'maxPerElement'` options.\n **\n - newValue (number) #optional Any number. newValue <= 0 means no interactions.\n\\*/\ninteract.maxInteractions = function (newValue) {\n if (utils.is.number(newValue)) {\n autoStart.maxInteractions = newValue;\n\n return this;\n }\n\n return autoStart.maxInteractions;\n};\n\nInteractable.settingsMethods.push('styleCursor');\nInteractable.settingsMethods.push('actionChecker');\nInteractable.settingsMethods.push('ignoreFrom');\nInteractable.settingsMethods.push('allowFrom');\n\ndefaultOptions.base.actionChecker = null;\ndefaultOptions.base.styleCursor = true;\n\nutils.extend(defaultOptions.perAction, autoStart.defaults.perAction);\n\nmodule.exports = autoStart;\n","const autoStart = require('./base');\nconst Interaction = require('../Interaction');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.delayTimer = null;\n});\n\nautoStart.signals.on('prepared', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.delayTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.target, interaction.element);\n }, delay);\n }\n});\n\nInteraction.signals.on('move', function ({ interaction, duplicate }) {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.delayTimer);\n }\n});\n\n// prevent regular down->move autoStart\nautoStart.signals.on('before-start', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.prepared.name = null;\n }\n});\n","const autoStart = require('./base');\nconst scope = require('../scope');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\n\nconst { matchesSelector, parentNode } = require('../utils/domUtils');\n\nautoStart.setActionDefaults(require('../actions/drag'));\n\nautoStart.signals.on('before-start', function ({ interaction, eventTarget, dx, dy }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // check if a drag is in the correct axis\n const absX = Math.abs(dx);\n const absY = Math.abs(dy);\n const options = interaction.target.options.drag;\n const startAxis = options.startAxis;\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy');\n\n interaction.prepared.axis = options.lockAxis === 'start'\n ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n : options.lockAxis;\n\n // if the movement isn't in the startAxis of the interactable\n if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) {\n // cancel the prepared action\n interaction.prepared.name = null;\n\n // then try to get a drag from another ineractable\n\n if (!interaction.prepared.name) {\n\n let element = eventTarget;\n\n const getDraggable = function (interactable, selector, context) {\n const elements = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n if (interactable === interaction.target) { return; }\n\n if (!options.manualStart\n && !interactable.testIgnoreAllow(options, element, eventTarget)\n && matchesSelector(element, selector, elements)) {\n\n const action = interactable.getAction(interaction.downPointer,\n interaction.downEvent,\n interaction,\n element);\n\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, interactable)\n && autoStart.validateAction(action, interactable, element, eventTarget)) {\n\n return interactable;\n }\n }\n };\n\n let action = null;\n\n // check all interactables\n while (is.element(element)) {\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && elementInteractable !== interaction.target\n && !elementInteractable.options.drag.manualStart) {\n\n action = elementInteractable.getAction(interaction.downPointer, interaction.downEvent, interaction, element);\n }\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, elementInteractable)) {\n\n interaction.prepared.name = 'drag';\n interaction.target = elementInteractable;\n interaction.element = element;\n break;\n }\n\n const selectorInteractable = scope.interactables.forEachSelector(getDraggable, element);\n\n if (selectorInteractable) {\n interaction.prepared.name = 'drag';\n interaction.target = selectorInteractable;\n interaction.element = element;\n break;\n }\n\n element = parentNode(element);\n }\n }\n }\n});\n\nfunction checkStartAxis (startAxis, interactable) {\n if (!interactable) { return false; }\n\n const thisAxis = interactable.options.drag.startAxis;\n\n return (startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis);\n}\n","require('./base').setActionDefaults(require('../actions/gesture'));\n","require('./base').setActionDefaults(require('../actions/resize'));\n","module.exports = {\n base: {\n accept : null,\n preventDefault: 'auto',\n deltaSource : 'page',\n },\n\n perAction: {\n origin: { x: 0, y: 0 },\n\n // only allow left button by default\n // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n mouseButtons: 1,\n\n inertia: {\n enabled : false,\n resistance : 10, // the lambda in exponential decay\n minSpeed : 100, // target speed must be above this for inertia to start\n endSpeed : 10, // the speed at which inertia is slow enough to stop\n allowResume : true, // allow resuming an action in inertia phase\n smoothEndDuration: 300, // animate to snap/restrict endOnly if there's no inertia\n },\n },\n};\n","/* browser entry point */\n\n// Legacy browser support\nrequire('./legacyBrowsers');\n\n// inertia\nrequire('./inertia');\n\n// modifiers\nrequire('./modifiers/snap');\nrequire('./modifiers/restrict');\n\n// pointerEvents\nrequire('./pointerEvents/base');\nrequire('./pointerEvents/holdRepeat');\nrequire('./pointerEvents/interactableTargets');\n\n// delay\nrequire('./autoStart/delay');\n\n// actions\nrequire('./actions/gesture');\nrequire('./actions/resize');\nrequire('./actions/drag');\nrequire('./actions/drop');\n\n// load these modifiers after resize is loaded\nrequire('./modifiers/snapSize');\nrequire('./modifiers/restrictEdges');\nrequire('./modifiers/restrictSize');\n\n// autoStart actions\nrequire('./autoStart/gesture');\nrequire('./autoStart/resize');\nrequire('./autoStart/drag');\n\n// Interactable preventDefault setting\nrequire('./interactablePreventDefault.js');\n\n// autoScroll\nrequire('./autoScroll');\n\n// export interact\nmodule.exports = require('./interact');\n","const InteractEvent = require('./InteractEvent');\nconst Interaction = require('./Interaction');\nconst modifiers = require('./modifiers');\nconst utils = require('./utils');\nconst animationFrame = require('./utils/raf');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.inertiaStatus = {\n active : false,\n smoothEnd : false,\n allowResume: false,\n\n startEvent: null,\n upCoords : {},\n\n xe: 0, ye: 0,\n sx: 0, sy: 0,\n\n t0: 0,\n vx0: 0, vys: 0,\n duration: 0,\n\n lambda_v0: 0,\n one_ve_v0: 0,\n i : null,\n };\n\n interaction.boundInertiaFrame = () => inertiaFrame .apply(interaction);\n interaction.boundSmoothEndFrame = () => smoothEndFrame.apply(interaction);\n});\n\nInteraction.signals.on('down', function ({ interaction, event, pointer, eventTarget }) {\n const status = interaction.inertiaStatus;\n\n // Check if the down event hits the current inertia target\n if (status.active) {\n let element = eventTarget;\n\n // climb up the DOM tree from the event target\n while (utils.is.element(element)) {\n\n // if interaction element is the current inertia target element\n if (element === interaction.element) {\n // stop inertia\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n\n // update pointers to the down event's coordinates\n interaction.updatePointer(pointer);\n utils.setCoords(interaction.curCoords, interaction.pointers);\n\n // fire appropriate signals\n const signalArg = { interaction };\n Interaction.signals.fire('before-action-move', signalArg);\n Interaction.signals.fire('action-resume' , signalArg);\n\n // fire a reume event\n const resumeEvent = new InteractEvent(interaction,\n event,\n interaction.prepared.name,\n 'inertiaresume',\n interaction.element);\n\n interaction.target.fire(resumeEvent);\n interaction.prevEvent = resumeEvent;\n modifiers.resetStatuses(interaction.modifierStatuses);\n\n utils.copyCoords(interaction.prevCoords, interaction.curCoords);\n break;\n }\n\n element = utils.parentNode(element);\n }\n }\n});\n\nInteraction.signals.on('up', function ({ interaction, event }) {\n const status = interaction.inertiaStatus;\n\n if (!interaction.interacting() || status.active) { return; }\n\n const target = interaction.target;\n const options = target && target.options;\n const inertiaOptions = options && interaction.prepared.name && options[interaction.prepared.name].inertia;\n\n const now = new Date().getTime();\n const statuses = {};\n const page = utils.extend({}, interaction.curCoords.page);\n const pointerSpeed = interaction.pointerDelta.client.speed;\n\n let smoothEnd = false;\n let modifierResult;\n\n // check if inertia should be started\n const inertiaPossible = (inertiaOptions && inertiaOptions.enabled\n && interaction.prepared.name !== 'gesture'\n && event !== status.startEvent);\n\n const inertia = (inertiaPossible\n && (now - interaction.curCoords.timeStamp) < 50\n && pointerSpeed > inertiaOptions.minSpeed\n && pointerSpeed > inertiaOptions.endSpeed);\n\n const modifierArg = {\n interaction,\n pageCoords: page,\n statuses,\n preEnd: true,\n requireEndOnly: true,\n };\n\n // smoothEnd\n if (inertiaPossible && !inertia) {\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n if (modifierResult.shouldMove && modifierResult.locked) {\n smoothEnd = true;\n }\n }\n\n if (!(inertia || smoothEnd)) { return; }\n\n utils.copyCoords(status.upCoords, interaction.curCoords);\n\n interaction.pointers[0] = status.startEvent =\n new InteractEvent(interaction, event, interaction.prepared.name, 'inertiastart', interaction.element);\n\n status.t0 = now;\n\n status.active = true;\n status.allowResume = inertiaOptions.allowResume;\n interaction.simulation = status;\n\n target.fire(status.startEvent);\n\n if (inertia) {\n status.vx0 = interaction.pointerDelta.client.vx;\n status.vy0 = interaction.pointerDelta.client.vy;\n status.v0 = pointerSpeed;\n\n calcInertia(interaction, status);\n\n utils.extend(page, interaction.curCoords.page);\n\n page.x += status.xe;\n page.y += status.ye;\n\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n status.modifiedXe += modifierResult.dx;\n status.modifiedYe += modifierResult.dy;\n\n status.i = animationFrame.request(interaction.boundInertiaFrame);\n }\n else {\n status.smoothEnd = true;\n status.xe = modifierResult.dx;\n status.ye = modifierResult.dy;\n\n status.sx = status.sy = 0;\n\n status.i = animationFrame.request(interaction.boundSmoothEndFrame);\n }\n});\n\nInteraction.signals.on('stop-active', function ({ interaction }) {\n const status = interaction.inertiaStatus;\n\n if (status.active) {\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n }\n});\n\nfunction calcInertia (interaction, status) {\n const inertiaOptions = interaction.target.options[interaction.prepared.name].inertia;\n const lambda = inertiaOptions.resistance;\n const inertiaDur = -Math.log(inertiaOptions.endSpeed / status.v0) / lambda;\n\n status.x0 = interaction.prevEvent.pageX;\n status.y0 = interaction.prevEvent.pageY;\n status.t0 = status.startEvent.timeStamp / 1000;\n status.sx = status.sy = 0;\n\n status.modifiedXe = status.xe = (status.vx0 - inertiaDur) / lambda;\n status.modifiedYe = status.ye = (status.vy0 - inertiaDur) / lambda;\n status.te = inertiaDur;\n\n status.lambda_v0 = lambda / status.v0;\n status.one_ve_v0 = 1 - inertiaOptions.endSpeed / status.v0;\n}\n\nfunction inertiaFrame () {\n updateInertiaCoords(this);\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n\n const status = this.inertiaStatus;\n const options = this.target.options[this.prepared.name].inertia;\n const lambda = options.resistance;\n const t = new Date().getTime() / 1000 - status.t0;\n\n if (t < status.te) {\n\n const progress = 1 - (Math.exp(-lambda * t) - status.lambda_v0) / status.one_ve_v0;\n\n if (status.modifiedXe === status.xe && status.modifiedYe === status.ye) {\n status.sx = status.xe * progress;\n status.sy = status.ye * progress;\n }\n else {\n const quadPoint = utils.getQuadraticCurvePoint(0, 0,\n status.xe,\n status.ye,\n status.modifiedXe,\n status.modifiedYe,\n progress);\n\n status.sx = quadPoint.x;\n status.sy = quadPoint.y;\n }\n\n this.doMove();\n\n status.i = animationFrame.request(this.boundInertiaFrame);\n }\n else {\n status.sx = status.modifiedXe;\n status.sy = status.modifiedYe;\n\n this.doMove();\n this.end(status.startEvent);\n status.active = false;\n this.simulation = null;\n }\n\n utils.copyCoords(this.prevCoords, this.curCoords);\n}\n\nfunction smoothEndFrame () {\n updateInertiaCoords(this);\n\n const status = this.inertiaStatus;\n const t = new Date().getTime() - status.t0;\n const duration = this.target.options[this.prepared.name].inertia.smoothEndDuration;\n\n if (t < duration) {\n status.sx = utils.easeOutQuad(t, 0, status.xe, duration);\n status.sy = utils.easeOutQuad(t, 0, status.ye, duration);\n\n this.pointerMove(status.startEvent, status.startEvent);\n\n status.i = animationFrame.request(this.boundSmoothEndFrame);\n }\n else {\n status.sx = status.xe;\n status.sy = status.ye;\n\n this.pointerMove(status.startEvent, status.startEvent);\n this.end(status.startEvent);\n\n status.smoothEnd =\n status.active = false;\n this.simulation = null;\n }\n}\n\nfunction updateInertiaCoords (interaction) {\n const status = interaction.inertiaStatus;\n\n // return if inertia isn't running\n if (!status.active) { return; }\n\n const pageUp = status.upCoords.page;\n const clientUp = status.upCoords.client;\n\n utils.setCoords(interaction.curCoords, [ {\n pageX : pageUp.x + status.sx,\n pageY : pageUp.y + status.sy,\n clientX: clientUp.x + status.sx,\n clientY: clientUp.y + status.sy,\n } ]);\n}\n","const browser = require('./utils/browser');\nconst events = require('./utils/events');\nconst utils = require('./utils');\nconst scope = require('./scope');\nconst Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\n\nconst globalEvents = {};\n\n/*\\\n * interact\n [ method ]\n *\n * The methods of this variable can be used to set elements as\n * interactables and also to change various default settings.\n *\n * Calling it as a function and passing an element or a valid CSS selector\n * string returns an Interactable object which has various methods to\n * configure it.\n *\n - element (Element | string) The HTML or SVG Element to interact with or CSS selector\n = (object) An @Interactable\n *\n > Usage\n | interact('#draggable').draggable(true);\n |\n | var rectables = interact('rect');\n | rectables\n | .gesturable(true)\n | .on('gesturemove', function (event) {\n | // ...\n | });\n\\*/\nfunction interact (element, options) {\n let interactable = scope.interactables.get(element, options);\n\n if (!interactable) {\n interactable = new Interactable(element, options);\n interactable.events.global = globalEvents;\n }\n\n return interactable;\n}\n\n/*\\\n * interact.isSet\n [ method ]\n *\n * Check if an element has been set\n - element (Element) The Element being searched for\n = (boolean) Indicates if the element or CSS selector was previously passed to interact\n\\*/\ninteract.isSet = function (element, options) {\n return scope.interactables.indexOfElement(element, options && options.context) !== -1;\n};\n\n/*\\\n * interact.on\n [ method ]\n *\n * Adds a global listener for an InteractEvent or adds a DOM event to\n * `document`\n *\n - type (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) interact\n\\*/\ninteract.on = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.on(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.on(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n // if it is an InteractEvent type, add listener to globalEvents\n if (utils.contains(Interactable.eventTypes, type)) {\n // if this type of event was never bound\n if (!globalEvents[type]) {\n globalEvents[type] = [listener];\n }\n else {\n globalEvents[type].push(listener);\n }\n }\n // If non InteractEvent type, addEventListener to document\n else {\n events.add(scope.document, type, listener, { options });\n }\n\n return interact;\n};\n\n/*\\\n * interact.off\n [ method ]\n *\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n - type (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) interact\n \\*/\ninteract.off = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.off(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.off(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n if (!utils.contains(Interactable.eventTypes, type)) {\n events.remove(scope.document, type, listener, options);\n }\n else {\n let index;\n\n if (type in globalEvents\n && (index = utils.indexOf(globalEvents[type], listener)) !== -1) {\n globalEvents[type].splice(index, 1);\n }\n }\n\n return interact;\n};\n\n/*\\\n * interact.debug\n [ method ]\n *\n * Returns an object which exposes internal data\n = (object) An object with properties that outline the current state and expose internal functions and variables\n\\*/\ninteract.debug = function () {\n return scope;\n};\n\n// expose the functions used to calculate multi-touch properties\ninteract.getPointerAverage = utils.pointerAverage;\ninteract.getTouchBBox = utils.touchBBox;\ninteract.getTouchDistance = utils.touchDistance;\ninteract.getTouchAngle = utils.touchAngle;\n\ninteract.getElementRect = utils.getElementRect;\ninteract.getElementClientRect = utils.getElementClientRect;\ninteract.matchesSelector = utils.matchesSelector;\ninteract.closest = utils.closest;\n\n/*\\\n * interact.supportsTouch\n [ method ]\n *\n = (boolean) Whether or not the browser supports touch input\n\\*/\ninteract.supportsTouch = function () {\n return browser.supportsTouch;\n};\n\n/*\\\n * interact.supportsPointerEvent\n [ method ]\n *\n = (boolean) Whether or not the browser supports PointerEvents\n\\*/\ninteract.supportsPointerEvent = function () {\n return browser.supportsPointerEvent;\n};\n\n/*\\\n * interact.stop\n [ method ]\n *\n * Cancels all interactions (end events are not fired)\n *\n - event (Event) An event on which to call preventDefault()\n = (object) interact\n\\*/\ninteract.stop = function (event) {\n for (let i = scope.interactions.length - 1; i >= 0; i--) {\n scope.interactions[i].stop(event);\n }\n\n return interact;\n};\n\n/*\\\n * interact.pointerMoveTolerance\n [ method ]\n * Returns or sets the distance the pointer must be moved before an action\n * sequence occurs. This also affects tolerance for tap events.\n *\n - newValue (number) #optional The movement from the start position must be greater than this value\n = (number | Interactable) The current setting or interact\n\\*/\ninteract.pointerMoveTolerance = function (newValue) {\n if (utils.is.number(newValue)) {\n Interaction.pointerMoveTolerance = newValue;\n\n return this;\n }\n\n return Interaction.pointerMoveTolerance;\n};\n\ninteract.addDocument = scope.addDocument;\ninteract.removeDocument = scope.removeDocument;\n\nscope.interact = interact;\n\nmodule.exports = interact;\n","const Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\nconst scope = require('./scope');\nconst is = require('./utils/is');\nconst events = require('./utils/events');\n\nconst { nodeContains, matchesSelector } = require('./utils/domUtils');\n\n/*\\\n * Interactable.preventDefault\n [ method ]\n *\n * Returns or sets whether to prevent the browser's default behaviour\n * in response to pointer events. Can be set to:\n * - `'always'` to always prevent\n * - `'never'` to never prevent\n * - `'auto'` to let interact.js try to determine what would be best\n *\n - newValue (string) #optional `true`, `false` or `'auto'`\n = (string | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.preventDefault = function (newValue) {\n if (/^(always|never|auto)$/.test(newValue)) {\n this.options.preventDefault = newValue;\n return this;\n }\n\n if (is.bool(newValue)) {\n this.options.preventDefault = newValue? 'always' : 'never';\n return this;\n }\n\n return this.options.preventDefault;\n};\n\nInteractable.prototype.checkAndPreventDefault = function (event) {\n const setting = this.options.preventDefault;\n\n if (setting === 'never') { return; }\n\n if (setting === 'always') {\n event.preventDefault();\n return;\n }\n\n // setting === 'auto'\n\n // don't preventDefault if the browser supports passiveEvents\n // CSS touch-action and user-selecct should be used instead\n if (events.supportsOptions) {\n return;\n }\n\n // don't preventDefault of pointerdown events\n if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) {\n return;\n }\n\n // don't preventDefault on editable elements\n if (is.element(event.target)\n && matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) {\n return;\n }\n\n event.preventDefault();\n};\n\nfunction onInteractionEvent ({ interaction, event }) {\n if (interaction.target) {\n interaction.target.checkAndPreventDefault(event);\n }\n}\n\nfor (const eventSignal of ['down', 'move', 'up', 'cancel']) {\n Interaction.signals.on(eventSignal, onInteractionEvent);\n}\n\n// prevent native HTML5 drag on interact.js target elements\nInteraction.docEvents.dragstart = function preventNativeDrag (event) {\n for (const interaction of scope.interactions) {\n\n if (interaction.element\n && (interaction.element === event.target\n || nodeContains(interaction.element, event.target))) {\n\n interaction.target.checkAndPreventDefault(event);\n return;\n }\n }\n};\n","const scope = require('./scope');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst iFinder = require('./utils/interactionFinder');\nconst pointerEvents = require('./pointerEvents/base');\n\nconst { window } = require('./utils/window');\n\nconst toString = Object.prototype.toString;\n\nif (!window.Array.isArray) {\n window.Array.isArray = function (obj) {\n return toString.call(obj) === '[object Array]';\n };\n}\n\nif (!String.prototype.trim) {\n String.prototype.trim = function () {\n return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n };\n}\n\n// http://www.quirksmode.org/dom/events/click.html\n// >Events leading to dblclick\n//\n// IE8 doesn't fire down event before dblclick.\n// This workaround tries to fire a tap and doubletap after dblclick\nfunction onIE8Dblclick (event) {\n const eventTarget = event.target;\n const interaction = iFinder.search(event, event.type, eventTarget);\n\n if (!interaction) { return; }\n\n if (interaction.prevTap\n && event.clientX === interaction.prevTap.clientX\n && event.clientY === interaction.prevTap.clientY\n && eventTarget === interaction.prevTap.target) {\n\n interaction.downTargets[0] = eventTarget;\n interaction.downTimes [0] = new Date().getTime();\n\n pointerEvents.fire({\n interaction,\n event,\n eventTarget,\n pointer: event,\n type: 'tap',\n });\n }\n}\n\nif (browser.isIE8) {\n const selectFix = function (event) {\n for (const interaction of scope.interactions) {\n if (interaction.interacting()) {\n interaction.target.checkAndPreventDefault(event);\n }\n }\n };\n\n const onDocIE8 = function onDocIE8 ({ doc, win }, signalName) {\n const eventMethod = signalName.indexOf('listen') === 0\n ? events.add : events.remove;\n\n // For IE's lack of Event#preventDefault\n eventMethod(doc, 'selectstart', selectFix);\n\n if (pointerEvents) {\n eventMethod(doc, 'dblclick', onIE8Dblclick);\n }\n };\n\n scope.signals.on('add-document' , onDocIE8);\n scope.signals.on('remove-document', onDocIE8);\n}\n\nmodule.exports = null;\n","const InteractEvent = require('../InteractEvent');\nconst Interaction = require('../Interaction');\nconst extend = require('../utils/extend');\n\nconst modifiers = {\n names: [],\n\n setOffsets: function (arg) {\n const { interaction, pageCoords: page } = arg;\n const { target, element, startOffset } = interaction;\n const rect = target.getRect(element);\n\n if (rect) {\n startOffset.left = page.x - rect.left;\n startOffset.top = page.y - rect.top;\n\n startOffset.right = rect.right - page.x;\n startOffset.bottom = rect.bottom - page.y;\n\n if (!('width' in rect)) { rect.width = rect.right - rect.left; }\n if (!('height' in rect)) { rect.height = rect.bottom - rect.top ; }\n }\n else {\n startOffset.left = startOffset.top = startOffset.right = startOffset.bottom = 0;\n }\n\n arg.rect = rect;\n arg.interactable = target;\n arg.element = element;\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n\n arg.options = target.options[interaction.prepared.name][modifierName];\n\n if (!arg.options) {\n continue;\n }\n\n interaction.modifierOffsets[modifierName] = modifiers[modifierName].setOffset(arg);\n }\n },\n\n setAll: function (arg) {\n const { interaction, statuses, preEnd, requireEndOnly } = arg;\n const coords = extend({}, arg.pageCoords);\n const result = {\n dx: 0,\n dy: 0,\n changed: false,\n locked: false,\n shouldMove: true,\n };\n\n for (const modifierName of modifiers.names) {\n const modifier = modifiers[modifierName];\n const options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!shouldDo(options, preEnd, requireEndOnly)) { continue; }\n\n arg.status = arg.status = statuses[modifierName];\n arg.options = options;\n arg.offset = arg.interaction.modifierOffsets[modifierName];\n\n modifier.set(arg);\n\n if (arg.status.locked) {\n coords.x += arg.status.dx;\n coords.y += arg.status.dy;\n\n result.dx += arg.status.dx;\n result.dy += arg.status.dy;\n\n result.locked = true;\n }\n }\n\n // a move should be fired if:\n // - there are no modifiers enabled,\n // - no modifiers are \"locked\" i.e. have changed the pointer's coordinates, or\n // - the locked coords have changed since the last pointer move\n result.shouldMove = !arg.status || !result.locked || arg.status.changed;\n\n return result;\n },\n\n resetStatuses: function (statuses) {\n for (const modifierName of modifiers.names) {\n const status = statuses[modifierName] || {};\n\n status.dx = status.dy = 0;\n status.modifiedX = status.modifiedY = NaN;\n status.locked = false;\n status.changed = true;\n\n statuses[modifierName] = status;\n }\n\n return statuses;\n },\n\n start: function ({ interaction }, signalName) {\n const arg = {\n interaction,\n pageCoords: (signalName === 'action-resume' ?\n interaction.curCoords : interaction.startCoords).page,\n startOffset: interaction.startOffset,\n statuses: interaction.modifierStatuses,\n preEnd: false,\n requireEndOnly: false,\n };\n\n modifiers.setOffsets(arg);\n modifiers.resetStatuses(arg.statuses);\n\n arg.pageCoords = extend({}, interaction.startCoords.page);\n interaction.modifierResult = modifiers.setAll(arg);\n },\n};\n\nInteraction.signals.on('new', function (interaction) {\n interaction.startOffset = { left: 0, right: 0, top: 0, bottom: 0 };\n interaction.modifierOffsets = {};\n interaction.modifierStatuses = modifiers.resetStatuses({});\n interaction.modifierResult = null;\n});\n\nInteraction.signals.on('action-start' , modifiers.start);\nInteraction.signals.on('action-resume', modifiers.start);\n\nInteraction.signals.on('before-action-move', function ({ interaction, preEnd, interactingBeforeMove }) {\n const modifierResult = modifiers.setAll({\n interaction,\n preEnd,\n pageCoords: interaction.curCoords.page,\n statuses: interaction.modifierStatuses,\n requireEndOnly: false,\n });\n\n // don't fire an action move if a modifier would keep the event in the same\n // cordinates as before\n if (!modifierResult.shouldMove && interactingBeforeMove) {\n interaction._dontFireMove = true;\n }\n\n interaction.modifierResult = modifierResult;\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n for (let i = 0; i < modifiers.names.length; i++) {\n const options = interaction.target.options[interaction.prepared.name][modifiers.names[i]];\n\n // if the endOnly option is true for any modifier\n if (shouldDo(options, true, true)) {\n // fire a move event at the modified coordinates\n interaction.doMove({ event, preEnd: true });\n break;\n }\n }\n});\n\nInteractEvent.signals.on('set-xy', function (arg) {\n const { iEvent, interaction } = arg;\n const modifierArg = extend({}, arg);\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n modifierArg.options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!modifierArg.options) {\n continue;\n }\n\n const modifier = modifiers[modifierName];\n\n modifierArg.status = interaction.modifierStatuses[modifierName];\n\n iEvent[modifierName] = modifier.modifyCoords(modifierArg);\n }\n});\n\nfunction shouldDo (options, preEnd, requireEndOnly) {\n return (options && options.enabled\n && (preEnd || !options.endOnly)\n && (!requireEndOnly || options.endOnly));\n}\n\nmodule.exports = modifiers;\n","const modifiers = require('./index');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst restrict = {\n defaults: {\n enabled : false,\n endOnly : false,\n restriction: null,\n elementRect: null,\n },\n\n setOffset: function ({ rect, startOffset, options }) {\n const elementRect = options && options.elementRect;\n const offset = {};\n\n if (rect && elementRect) {\n offset.left = startOffset.left - (rect.width * elementRect.left);\n offset.top = startOffset.top - (rect.height * elementRect.top);\n\n offset.right = startOffset.right - (rect.width * (1 - elementRect.right));\n offset.bottom = startOffset.bottom - (rect.height * (1 - elementRect.bottom));\n }\n else {\n offset.left = offset.top = offset.right = offset.bottom = 0;\n }\n\n return offset;\n },\n\n set: function ({ pageCoords, interaction, status, options }) {\n if (!options) { return status; }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n\n const restriction = getRestrictionRect(options.restriction, interaction, page);\n\n if (!restriction) { return status; }\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n const rect = restriction;\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n const offset = interaction.modifierOffsets.restrict;\n\n // object is assumed to have\n // x, y, width, height or\n // left, top, right, bottom\n if ('x' in restriction && 'y' in restriction) {\n modifiedX = Math.max(Math.min(rect.x + rect.width - offset.right , page.x), rect.x + offset.left);\n modifiedY = Math.max(Math.min(rect.y + rect.height - offset.bottom, page.y), rect.y + offset.top );\n }\n else {\n modifiedX = Math.max(Math.min(rect.right - offset.right , page.x), rect.left + offset.left);\n modifiedY = Math.max(Math.min(rect.bottom - offset.bottom, page.y), rect.top + offset.top );\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const elementRect = options && options.elementRect;\n\n if (options && options.enabled\n && !(phase === 'start' && elementRect && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n getRestrictionRect,\n};\n\nfunction getRestrictionRect (value, interaction, page) {\n if (utils.is.function(value)) {\n return utils.resolveRectLike(value, interaction.target, interaction.element, [page.x, page.y, interaction]);\n } else {\n return utils.resolveRectLike(value, interaction.target, interaction.element);\n }\n}\n\nmodifiers.restrict = restrict;\nmodifiers.names.push('restrict');\n\ndefaultOptions.perAction.restrict = restrict.defaults;\n\nmodule.exports = restrict;\n","// This module adds the options.resize.restrictEdges setting which sets min and\n// max for the top, left, bottom and right edges of the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictEdges: {\n// inner: { top: 200, left: 200, right: 400, bottom: 400 },\n// outer: { top: 0, left: 0, right: 600, bottom: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst { getRestrictionRect } = require('./restrict');\n\nconst noInner = { top: +Infinity, left: +Infinity, bottom: -Infinity, right: -Infinity };\nconst noOuter = { top: -Infinity, left: -Infinity, bottom: +Infinity, right: +Infinity };\n\nconst restrictEdges = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n offset: null,\n },\n\n setOffset: function ({ interaction, startOffset, options }) {\n if (!options) {\n return utils.extend({}, startOffset);\n }\n\n const offset = getRestrictionRect(options.offset, interaction, interaction.startCoords.page);\n\n if (offset) {\n return {\n top: startOffset.top + offset.y,\n left: startOffset.left + offset.x,\n bottom: startOffset.bottom + offset.y,\n right: startOffset.right + offset.x,\n };\n }\n\n return startOffset;\n },\n\n set: function ({ pageCoords, interaction, status, offset, options }) {\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n const inner = rectUtils.xywhToTlbr(getRestrictionRect(options.inner, interaction, page)) || noInner;\n const outer = rectUtils.xywhToTlbr(getRestrictionRect(options.outer, interaction, page)) || noOuter;\n\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n if (edges.top) {\n modifiedY = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top);\n }\n else if (edges.bottom) {\n modifiedY = Math.max(Math.min(outer.bottom - offset.bottom, page.y), inner.bottom - offset.bottom);\n }\n if (edges.left) {\n modifiedX = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left);\n }\n else if (edges.right) {\n modifiedX = Math.max(Math.min(outer.right - offset.right, page.x), inner.right - offset.right);\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n if (options && options.enabled\n && !(phase === 'start' && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n noInner,\n noOuter,\n getRestrictionRect,\n};\n\nmodifiers.restrictEdges = restrictEdges;\nmodifiers.names.push('restrictEdges');\n\ndefaultOptions.perAction.restrictEdges = restrictEdges.defaults;\nresize.defaults.restrictEdges = restrictEdges.defaults;\n\nmodule.exports = restrictEdges;\n","// This module adds the options.resize.restrictSize setting which sets min and\n// max width and height for the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictSize: {\n// min: { width: -600, height: -600 },\n// max: { width: 600, height: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst restrictEdges = require('./restrictEdges');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst noMin = { width: -Infinity, height: -Infinity };\nconst noMax = { width: +Infinity, height: +Infinity };\n\nconst restrictSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n },\n\n setOffset: function ({ interaction }) {\n return interaction.startOffset;\n },\n\n set: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const rect = rectUtils.xywhToTlbr(interaction.resizeRects.inverted);\n\n const minSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.min, interaction)) || noMin;\n const maxSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.max, interaction)) || noMax;\n\n arg.options = {\n enabled: options.enabled,\n endOnly: options.endOnly,\n inner: utils.extend({}, restrictEdges.noInner),\n outer: utils.extend({}, restrictEdges.noOuter),\n };\n\n if (edges.top) {\n arg.options.inner.top = rect.bottom - minSize.height;\n arg.options.outer.top = rect.bottom - maxSize.height;\n }\n else if (edges.bottom) {\n arg.options.inner.bottom = rect.top + minSize.height;\n arg.options.outer.bottom = rect.top + maxSize.height;\n }\n if (edges.left) {\n arg.options.inner.left = rect.right - minSize.width;\n arg.options.outer.left = rect.right - maxSize.width;\n }\n else if (edges.right) {\n arg.options.inner.right = rect.left + minSize.width;\n arg.options.outer.right = rect.left + maxSize.width;\n }\n\n restrictEdges.set(arg);\n },\n\n modifyCoords: restrictEdges.modifyCoords,\n};\n\nmodifiers.restrictSize = restrictSize;\nmodifiers.names.push('restrictSize');\n\ndefaultOptions.perAction.restrictSize = restrictSize.defaults;\nresize.defaults.restrictSize = restrictSize.defaults;\n\nmodule.exports = restrictSize;\n","const modifiers = require('./index');\nconst interact = require('../interact');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst snap = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n\n relativePoints: null,\n },\n\n setOffset: function ({ interaction, interactable, element, rect, startOffset, options }) {\n const offsets = [];\n const optionsOrigin = utils.rectToXY(utils.resolveRectLike(options.origin));\n const origin = optionsOrigin || utils.getOriginXY(interactable, element, interaction.prepared.name);\n options = options || interactable.options[interaction.prepared.name].snap || {};\n\n let snapOffset;\n\n if (options.offset === 'startCoords') {\n snapOffset = {\n x: interaction.startCoords.page.x - origin.x,\n y: interaction.startCoords.page.y - origin.y,\n };\n }\n else {\n const offsetRect = utils.resolveRectLike(options.offset, interactable, element, [interaction]);\n\n snapOffset = utils.rectToXY(offsetRect) || { x: 0, y: 0 };\n }\n\n if (rect && options.relativePoints && options.relativePoints.length) {\n for (const { x: relativeX, y: relativeY } of options.relativePoints) {\n offsets.push({\n x: startOffset.left - (rect.width * relativeX) + snapOffset.x,\n y: startOffset.top - (rect.height * relativeY) + snapOffset.y,\n });\n }\n }\n else {\n offsets.push(snapOffset);\n }\n\n return offsets;\n },\n\n set: function ({ interaction, pageCoords, status, options, offset: offsets }) {\n const targets = [];\n let target;\n let page;\n let i;\n\n if (status.useStatusXY) {\n page = { x: status.x, y: status.y };\n }\n else {\n const origin = utils.getOriginXY(interaction.target, interaction.element, interaction.prepared.name);\n\n page = utils.extend({}, pageCoords);\n\n page.x -= origin.x;\n page.y -= origin.y;\n }\n\n status.realX = page.x;\n status.realY = page.y;\n\n let len = options.targets? options.targets.length : 0;\n\n for (const { x: offsetX, y: offsetY } of offsets) {\n const relativeX = page.x - offsetX;\n const relativeY = page.y - offsetY;\n\n for (const snapTarget of options.targets) {\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n targets.push({\n x: utils.is.number(target.x) ? (target.x + offsetX) : relativeX,\n y: utils.is.number(target.y) ? (target.y + offsetY) : relativeY,\n\n range: utils.is.number(target.range)? target.range: options.range,\n });\n }\n }\n\n const closest = {\n target: null,\n inRange: false,\n distance: 0,\n range: 0,\n dx: 0,\n dy: 0,\n };\n\n for (i = 0, len = targets.length; i < len; i++) {\n target = targets[i];\n\n const range = target.range;\n const dx = target.x - page.x;\n const dy = target.y - page.y;\n const distance = utils.hypot(dx, dy);\n let inRange = distance <= range;\n\n // Infinite targets count as being out of range\n // compared to non infinite ones that are in range\n if (range === Infinity && closest.inRange && closest.range !== Infinity) {\n inRange = false;\n }\n\n if (!closest.target || (inRange\n // is the closest target in range?\n ? (closest.inRange && range !== Infinity\n // the pointer is relatively deeper in this target\n ? distance / range < closest.distance / closest.range\n // this target has Infinite range and the closest doesn't\n : (range === Infinity && closest.range !== Infinity)\n // OR this target is closer that the previous closest\n || distance < closest.distance)\n // The other is not in range and the pointer is closer to this target\n : (!closest.inRange && distance < closest.distance))) {\n\n closest.target = target;\n closest.distance = distance;\n closest.range = range;\n closest.inRange = inRange;\n closest.dx = dx;\n closest.dy = dy;\n\n status.range = range;\n }\n }\n\n let snapChanged;\n\n if (closest.target) {\n snapChanged = (status.modifiedX !== closest.target.x || status.modifiedY !== closest.target.y);\n\n status.modifiedX = closest.target.x;\n status.modifiedY = closest.target.y;\n }\n else {\n snapChanged = true;\n\n status.modifiedX = NaN;\n status.modifiedY = NaN;\n }\n\n status.dx = closest.dx;\n status.dy = closest.dy;\n\n status.changed = (snapChanged || (closest.inRange && !status.locked));\n status.locked = closest.inRange;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const relativePoints = options && options.relativePoints;\n\n if (options && options.enabled\n && !(phase === 'start' && relativePoints && relativePoints.length)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n }\n\n return {\n range : status.range,\n locked : status.locked,\n x : status.modifiedX,\n y : status.modifiedY,\n realX : status.realX,\n realY : status.realY,\n dx : status.dx,\n dy : status.dy,\n };\n }\n },\n};\n\ninteract.createSnapGrid = function (grid) {\n return function (x, y) {\n const limits = grid.limits || {\n left : -Infinity,\n right : Infinity,\n top : -Infinity,\n bottom: Infinity,\n };\n let offsetX = 0;\n let offsetY = 0;\n\n if (utils.is.object(grid.offset)) {\n offsetX = grid.offset.x;\n offsetY = grid.offset.y;\n }\n\n const gridx = Math.round((x - offsetX) / grid.x);\n const gridy = Math.round((y - offsetY) / grid.y);\n\n const newX = Math.max(limits.left, Math.min(limits.right , gridx * grid.x + offsetX));\n const newY = Math.max(limits.top , Math.min(limits.bottom, gridy * grid.y + offsetY));\n\n return {\n x: newX,\n y: newY,\n range: grid.range,\n };\n };\n};\n\nmodifiers.snap = snap;\nmodifiers.names.push('snap');\n\ndefaultOptions.perAction.snap = snap.defaults;\n\nmodule.exports = snap;\n","// This module allows snapping of the size of targets during resize\n// interactions.\n\nconst modifiers = require('./index');\nconst snap = require('./snap');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\nconst utils = require('../utils/');\n\nconst snapSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n },\n\n setOffset: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.edges;\n\n if (!edges) { return; }\n\n arg.options = {\n relativePoints: [{\n x: edges.left? 0 : 1,\n y: edges.top ? 0 : 1,\n }],\n origin: { x: 0, y: 0 },\n offset: 'self',\n range: options.range,\n };\n\n const offsets = snap.setOffset(arg);\n arg.options = options;\n\n return offsets;\n },\n\n set: function (arg) {\n const { interaction, options, offset, pageCoords } = arg;\n const page = utils.extend({}, pageCoords);\n const relativeX = page.x - offset[0].x;\n const relativeY = page.y - offset[0].y;\n\n arg.options = utils.extend({}, options);\n arg.options.targets = [];\n\n for (const snapTarget of options.targets) {\n let target;\n\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n if ('width' in target && 'height' in target) {\n target.x = target.width;\n target.y = target.height;\n }\n\n arg.options.targets.push(target);\n }\n\n snap.set(arg);\n },\n\n modifyCoords: function (arg) {\n const { options } = arg;\n\n arg.options = utils.extend({}, options);\n arg.options.enabled = options.enabled;\n arg.options.relativePoints = [null];\n\n snap.modifyCoords(arg);\n },\n};\n\nmodifiers.snapSize = snapSize;\nmodifiers.names.push('snapSize');\n\ndefaultOptions.perAction.snapSize = snapSize.defaults;\nresize.defaults.snapSize = snapSize.defaults;\n\nmodule.exports = snapSize;\n","const pointerUtils = require('../utils/pointerUtils');\n\nmodule.exports = class PointerEvent {\n constructor (type, pointer, event, eventTarget, interaction) {\n pointerUtils.pointerExtend(this, event);\n\n if (event !== pointer) {\n pointerUtils.pointerExtend(this, pointer);\n }\n\n this.interaction = interaction;\n\n this.timeStamp = new Date().getTime();\n this.originalEvent = event;\n this.type = type;\n this.pointerId = pointerUtils.getPointerId(pointer);\n this.pointerType = pointerUtils.getPointerType(pointer);\n this.target = eventTarget;\n this.currentTarget = null;\n\n if (type === 'tap') {\n const pointerIndex = interaction.getPointerIndex(pointer);\n this.dt = this.timeStamp - interaction.downTimes[pointerIndex];\n\n const interval = this.timeStamp - interaction.tapTime;\n\n this.double = !!(interaction.prevTap\n && interaction.prevTap.type !== 'doubletap'\n && interaction.prevTap.target === this.target\n && interval < 500);\n }\n else if (type === 'doubletap') {\n this.dt = pointer.timeStamp - interaction.tapTime;\n }\n }\n\n subtractOrigin ({ x: originX, y: originY }) {\n this.pageX -= originX;\n this.pageY -= originY;\n this.clientX -= originX;\n this.clientY -= originY;\n\n return this;\n }\n\n addOrigin ({ x: originX, y: originY }) {\n this.pageX += originX;\n this.pageY += originY;\n this.clientX += originX;\n this.clientY += originY;\n\n return this;\n }\n\n preventDefault () {\n this.originalEvent.preventDefault();\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n};\n","const PointerEvent = require('./PointerEvent');\nconst Interaction = require('../Interaction');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst defaults = require('../defaultOptions');\nconst signals = require('../utils/Signals').new();\nconst { filter } = require('../utils/arr');\n\nconst simpleSignals = [ 'down', 'up', 'cancel' ];\nconst simpleEvents = [ 'down', 'up', 'cancel' ];\n\nconst pointerEvents = {\n PointerEvent,\n fire,\n collectEventTargets,\n signals,\n defaults: {\n holdDuration: 600,\n ignoreFrom : null,\n allowFrom : null,\n origin : { x: 0, y: 0 },\n },\n types: [\n 'down',\n 'move',\n 'up',\n 'cancel',\n 'tap',\n 'doubletap',\n 'hold',\n ],\n};\n\nfunction fire (arg) {\n const {\n interaction, pointer, event, eventTarget,\n type = arg.pointerEvent.type,\n targets = collectEventTargets(arg),\n pointerEvent = new PointerEvent(type, pointer, event, eventTarget, interaction),\n } = arg;\n\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n targets,\n type,\n pointerEvent,\n };\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n\n for (const prop in target.props || {}) {\n pointerEvent[prop] = target.props[prop];\n }\n\n const origin = utils.getOriginXY(target.eventable, target.element);\n\n pointerEvent.subtractOrigin(origin);\n pointerEvent.eventable = target.eventable;\n pointerEvent.currentTarget = target.element;\n\n target.eventable.fire(pointerEvent);\n\n pointerEvent.addOrigin(origin);\n\n if (pointerEvent.immediatePropagationStopped\n || (pointerEvent.propagationStopped\n && (i + 1) < targets.length && targets[i + 1].element !== pointerEvent.currentTarget)) {\n break;\n }\n }\n\n signals.fire('fired', signalArg);\n\n if (type === 'tap') {\n // if pointerEvent should make a double tap, create and fire a doubletap\n // PointerEvent and use that as the prevTap\n const prevTap = pointerEvent.double\n ? fire({\n interaction, pointer, event, eventTarget,\n type: 'doubletap',\n })\n : pointerEvent;\n\n interaction.prevTap = prevTap;\n interaction.tapTime = prevTap.timeStamp;\n }\n\n return pointerEvent;\n}\n\nfunction collectEventTargets ({ interaction, pointer, event, eventTarget, type }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n // do not fire a tap event if the pointer was moved before being lifted\n if (type === 'tap' && (interaction.pointerWasMoved\n // or if the pointerup target is different to the pointerdown target\n || !(interaction.downTargets[pointerIndex] && interaction.downTargets[pointerIndex] === eventTarget))) {\n return [];\n }\n\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n path,\n targets: [],\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (type === 'hold') {\n signalArg.targets = filter(signalArg.targets, target =>\n target.eventable.options.holdDuration === interaction.holdTimers[pointerIndex].duration);\n }\n\n return signalArg.targets;\n}\n\nInteraction.signals.on('update-pointer-down', function ({ interaction, pointerIndex }) {\n interaction.holdTimers[pointerIndex] = { duration: Infinity, timeout: null };\n});\n\nInteraction.signals.on('remove-pointer', function ({ interaction, pointerIndex }) {\n interaction.holdTimers.splice(pointerIndex, 1);\n});\n\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget, duplicateMove }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n if (!duplicateMove && (!interaction.pointerIsDown || interaction.pointerWasMoved)) {\n if (interaction.pointerIsDown) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n\n fire({\n interaction, pointer, event, eventTarget,\n type: 'move',\n });\n }\n});\n\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget, pointerIndex }) {\n // copy event to be used in timeout for IE8\n const eventCopy = browser.isIE8? utils.extend({}, event) : event;\n\n const timer = interaction.holdTimers[pointerIndex];\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'hold',\n targets: [],\n path,\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (!signalArg.targets.length) { return; }\n\n let minDuration = Infinity;\n\n for (let i = 0; i < signalArg.targets.length; i++) {\n const target = signalArg.targets[i];\n const holdDuration = target.eventable.options.holdDuration;\n\n if (holdDuration < minDuration) {\n minDuration = holdDuration;\n }\n }\n\n timer.duration = minDuration;\n timer.timeout = setTimeout(function () {\n fire({\n interaction,\n eventTarget,\n pointer: browser.isIE8? eventCopy : pointer,\n event: eventCopy,\n type: 'hold',\n });\n }, minDuration);\n});\n\nInteraction.signals.on('up', ({ interaction, pointer, event, eventTarget }) => {\n if (!interaction.pointerWasMoved) {\n fire({ interaction, eventTarget, pointer, event, type: 'tap' });\n }\n});\n\n['up', 'cancel'].forEach(function (signalName) {\n Interaction.signals.on(signalName, function ({ interaction, pointerIndex }) {\n if (interaction.holdTimers[pointerIndex]) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n });\n});\n\nfunction createSignalListener (type) {\n return function ({ interaction, pointer, event, eventTarget }) {\n fire({ interaction, eventTarget, pointer, event, type });\n };\n}\n\nfor (let i = 0; i < simpleSignals.length; i++) {\n Interaction.signals.on(simpleSignals[i], createSignalListener(simpleEvents[i]));\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.prevTap = null; // the most recent tap event on this interaction\n interaction.tapTime = 0; // time of the most recent tap event\n interaction.holdTimers = []; // [{ duration, timeout }]\n});\n\ndefaults.pointerEvents = pointerEvents.defaults;\nmodule.exports = pointerEvents;\n","const pointerEvents = require('./base');\nconst Interaction = require('../Interaction');\n\npointerEvents.signals.on('new', onNew);\npointerEvents.signals.on('fired', onFired);\n\nfor (const signal of ['move', 'up', 'cancel', 'endall']) {\n Interaction.signals.on(signal, endHoldRepeat);\n}\n\nfunction onNew ({ pointerEvent }) {\n if (pointerEvent.type !== 'hold') { return; }\n\n pointerEvent.count = (pointerEvent.count || 0) + 1;\n}\n\nfunction onFired ({ interaction, pointerEvent, eventTarget, targets }) {\n if (pointerEvent.type !== 'hold' || !targets.length) { return; }\n\n // get the repeat interval from the first eventable\n const interval = targets[0].eventable.options.holdRepeatInterval;\n\n // don't repeat if the interval is 0 or less\n if (interval <= 0) { return; }\n\n // set a timeout to fire the holdrepeat event\n interaction.holdIntervalHandle = setTimeout(function () {\n pointerEvents.fire({\n interaction,\n eventTarget,\n type: 'hold',\n pointer: pointerEvent,\n event: pointerEvent,\n });\n }, interval);\n}\n\nfunction endHoldRepeat ({ interaction }) {\n // set the interaction's holdStopTime property\n // to stop further holdRepeat events\n if (interaction.holdIntervalHandle) {\n clearInterval(interaction.holdIntervalHandle);\n interaction.holdIntervalHandle = null;\n }\n}\n\n// don't repeat by default\npointerEvents.defaults.holdRepeatInterval = 0;\npointerEvents.types.push('holdrepeat');\n\nmodule.exports = {\n onNew,\n onFired,\n endHoldRepeat,\n};\n","const pointerEvents = require('./base');\nconst Interactable = require('../Interactable');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\nconst scope = require('../scope');\nconst extend = require('../utils/extend');\nconst { merge } = require('../utils/arr');\n\npointerEvents.signals.on('collect-targets', function ({ targets, element, type, eventTarget }) {\n function collectSelectors (interactable, selector, context) {\n const els = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && is.element(element)\n && domUtils.matchesSelector(element, selector, els)\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n const interactable = scope.interactables.get(element);\n\n if (interactable) {\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n scope.interactables.forEachSelector(collectSelectors, element);\n});\n\nInteractable.signals.on('new', function ({ interactable }) {\n interactable.events.getRect = function (element) {\n return interactable.getRect(element);\n };\n});\n\nInteractable.signals.on('set', function ({ interactable, options }) {\n extend(interactable.events.options, pointerEvents.defaults);\n extend(interactable.events.options, options);\n});\n\nmerge(Interactable.eventTypes, pointerEvents.types);\n\nInteractable.prototype.pointerEvents = function (options) {\n extend(this.events.options, options);\n\n return this;\n};\n\nconst __backCompatOption = Interactable.prototype._backCompatOption;\n\nInteractable.prototype._backCompatOption = function (optionName, newValue) {\n const ret = __backCompatOption.call(this, optionName, newValue);\n\n if (ret === this) {\n this.events.options[optionName] = newValue;\n }\n\n return ret;\n};\n\nInteractable.settingsMethods.push('pointerEvents');\n","const utils = require('./utils');\nconst events = require('./utils/events');\nconst signals = require('./utils/Signals').new();\n\nconst scope = {\n signals,\n events,\n utils,\n\n // main document\n document: require('./utils/domObjects').document,\n // all documents being listened to\n documents: [],\n\n addDocument: function (doc, win) {\n // do nothing if document is already known\n if (utils.contains(scope.documents, doc)) { return false; }\n\n win = win || scope.getWindow(doc);\n\n scope.documents.push(doc);\n events.documents.push(doc);\n\n // don't add an unload event for the main document\n // so that the page may be cached in browser history\n if (doc !== scope.document) {\n events.add(win, 'unload', scope.onWindowUnload);\n }\n\n signals.fire('add-document', { doc, win });\n },\n\n removeDocument: function (doc, win) {\n const index = utils.indexOf(scope.documents, doc);\n\n win = win || scope.getWindow(doc);\n\n events.remove(win, 'unload', scope.onWindowUnload);\n\n scope.documents.splice(index, 1);\n events.documents.splice(index, 1);\n\n signals.fire('remove-document', { win, doc });\n },\n\n onWindowUnload: function () {\n scope.removeDocument(this.document, this);\n },\n};\n\nmodule.exports = scope;\n","const { indexOf } = require('./arr');\n\nclass Signals {\n constructor () {\n this.listeners = {\n // signalName: [listeners],\n };\n }\n\n on (name, listener) {\n if (!this.listeners[name]) {\n this.listeners[name] = [listener];\n return;\n }\n\n this.listeners[name].push(listener);\n }\n\n off (name, listener) {\n if (!this.listeners[name]) { return; }\n\n const index = indexOf(this.listeners[name], listener);\n\n if (index !== -1) {\n this.listeners[name].splice(index, 1);\n }\n }\n\n fire (name, arg) {\n const targetListeners = this.listeners[name];\n\n if (!targetListeners) { return; }\n\n for (let i = 0; i < targetListeners.length; i++) {\n if (targetListeners[i](arg, name) === false) {\n return;\n }\n }\n }\n}\n\nSignals.new = function () {\n return new Signals();\n};\n\nmodule.exports = Signals;\n","function indexOf (array, target) {\n for (let i = 0, len = array.length; i < len; i++) {\n if (array[i] === target) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction contains (array, target) {\n return indexOf(array, target) !== -1;\n}\n\nfunction merge (target, source) {\n for (let i = 0; i < source.length; i++) {\n target.push(source[i]);\n }\n\n return target;\n}\n\nfunction filter (array, test) {\n const result = [];\n\n for (let i = 0; i < array.length; i++) {\n if (test(array[i])) {\n result.push(array[i]);\n }\n }\n\n return result;\n}\n\nmodule.exports = {\n indexOf,\n contains,\n merge,\n filter,\n};\n","const { window } = require('./window');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst Element = domObjects.Element;\nconst navigator = window.navigator;\n\nconst browser = {\n // Does the browser support touch input?\n supportsTouch: !!(('ontouchstart' in window) || is.function(window.DocumentTouch)\n && domObjects.document instanceof window.DocumentTouch),\n\n // Does the browser support PointerEvents\n supportsPointerEvent: !!domObjects.PointerEvent,\n\n isIE8: ('attachEvent' in window) && !('addEventListener' in window),\n\n // Opera Mobile must be handled differently\n isOperaMobile: (navigator.appName === 'Opera'\n && browser.supportsTouch\n && navigator.userAgent.match('Presto')),\n\n // scrolling doesn't change the result of getClientRects on iOS 7\n isIOS7: (/iP(hone|od|ad)/.test(navigator.platform)\n && /OS 7[^\\d]/.test(navigator.appVersion)),\n\n isIe9OrOlder: /MSIE (8|9)/.test(navigator.userAgent),\n\n // prefix matchesSelector\n prefixedMatchesSelector: 'matches' in Element.prototype\n ? 'matches': 'webkitMatchesSelector' in Element.prototype\n ? 'webkitMatchesSelector': 'mozMatchesSelector' in Element.prototype\n ? 'mozMatchesSelector': 'oMatchesSelector' in Element.prototype\n ? 'oMatchesSelector': 'msMatchesSelector',\n\n useMatchesSelectorPolyfill: false,\n\n pEventTypes: (domObjects.PointerEvent\n ? (domObjects.PointerEvent === window.MSPointerEvent\n ? {\n up: 'MSPointerUp',\n down: 'MSPointerDown',\n over: 'mouseover',\n out: 'mouseout',\n move: 'MSPointerMove',\n cancel: 'MSPointerCancel',\n }\n : {\n up: 'pointerup',\n down: 'pointerdown',\n over: 'pointerover',\n out: 'pointerout',\n move: 'pointermove',\n cancel: 'pointercancel',\n })\n : null),\n\n // because Webkit and Opera still use 'mousewheel' event type\n wheelEvent: 'onmousewheel' in domObjects.document? 'mousewheel': 'wheel',\n\n};\n\nbrowser.useMatchesSelectorPolyfill = !is.function(Element.prototype[browser.prefixedMatchesSelector]);\n\nmodule.exports = browser;\n","const domObjects = {};\nconst win = require('./window').window;\n\nfunction blank () {}\n\ndomObjects.document = win.document;\ndomObjects.DocumentFragment = win.DocumentFragment || blank;\ndomObjects.SVGElement = win.SVGElement || blank;\ndomObjects.SVGSVGElement = win.SVGSVGElement || blank;\ndomObjects.SVGElementInstance = win.SVGElementInstance || blank;\ndomObjects.Element = win.Element || blank;\ndomObjects.HTMLElement = win.HTMLElement || domObjects.Element;\n\ndomObjects.Event = win.Event;\ndomObjects.Touch = win.Touch || blank;\ndomObjects.PointerEvent = (win.PointerEvent || win.MSPointerEvent);\n\nmodule.exports = domObjects;\n","const win = require('./window');\nconst browser = require('./browser');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst domUtils = {\n nodeContains: function (parent, child) {\n while (child) {\n if (child === parent) {\n return true;\n }\n\n child = child.parentNode;\n }\n\n return false;\n },\n\n closest: function (element, selector) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) { return element; }\n\n element = domUtils.parentNode(element);\n }\n\n return null;\n },\n\n parentNode: function (node) {\n let parent = node.parentNode;\n\n if (is.docFrag(parent)) {\n // skip past #shado-root fragments\n while ((parent = parent.host) && is.docFrag(parent)) {\n continue;\n }\n\n return parent;\n }\n\n return parent;\n },\n\n // taken from http://tanalin.com/en/blog/2012/12/matches-selector-ie8/ and modified\n matchesSelectorPolyfill: browser.useMatchesSelectorPolyfill\n ? function (element, selector, elems) {\n elems = elems || element.parentNode.querySelectorAll(selector);\n\n for (let i = 0, len = elems.length; i < len; i++) {\n if (elems[i] === element) {\n return true;\n }\n }\n\n return false;\n }\n : null,\n\n matchesSelector: function (element, selector, nodeList) {\n if (browser.useMatchesSelectorPolyfill) {\n return domUtils.matchesSelectorPolyfill(element, selector, nodeList);\n }\n\n // remove /deep/ from selectors if shadowDOM polyfill is used\n if (win.window !== win.realWindow) {\n selector = selector.replace(/\\/deep\\//g, ' ');\n }\n\n return element[browser.prefixedMatchesSelector](selector);\n },\n\n // Test for the element that's \"above\" all other qualifiers\n indexOfDeepestElement: function (elements) {\n let deepestZoneParents = [];\n let dropzoneParents = [];\n let dropzone;\n let deepestZone = elements[0];\n let index = deepestZone? 0: -1;\n let parent;\n let child;\n let i;\n let n;\n\n for (i = 1; i < elements.length; i++) {\n dropzone = elements[i];\n\n // an element might belong to multiple selector dropzones\n if (!dropzone || dropzone === deepestZone) {\n continue;\n }\n\n if (!deepestZone) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n // check if the deepest or current are document.documentElement or document.rootElement\n // - if the current dropzone is, do nothing and continue\n if (dropzone.parentNode === dropzone.ownerDocument) {\n continue;\n }\n // - if deepest is, update with the current dropzone and continue to next\n else if (deepestZone.parentNode === dropzone.ownerDocument) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n if (!deepestZoneParents.length) {\n parent = deepestZone;\n while (parent.parentNode && parent.parentNode !== parent.ownerDocument) {\n deepestZoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n }\n\n // if this element is an svg element and the current deepest is\n // an HTMLElement\n if (deepestZone instanceof domObjects.HTMLElement\n && dropzone instanceof domObjects.SVGElement\n && !(dropzone instanceof domObjects.SVGSVGElement)) {\n\n if (dropzone === deepestZone.parentNode) {\n continue;\n }\n\n parent = dropzone.ownerSVGElement;\n }\n else {\n parent = dropzone;\n }\n\n dropzoneParents = [];\n\n while (parent.parentNode !== parent.ownerDocument) {\n dropzoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n\n n = 0;\n\n // get (position of last common ancestor) + 1\n while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) {\n n++;\n }\n\n const parents = [\n dropzoneParents[n - 1],\n dropzoneParents[n],\n deepestZoneParents[n],\n ];\n\n child = parents[0].lastChild;\n\n while (child) {\n if (child === parents[1]) {\n deepestZone = dropzone;\n index = i;\n deepestZoneParents = [];\n\n break;\n }\n else if (child === parents[2]) {\n break;\n }\n\n child = child.previousSibling;\n }\n }\n\n return index;\n },\n\n matchesUpTo: function (element, selector, limit) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) {\n return true;\n }\n\n element = domUtils.parentNode(element);\n\n if (element === limit) {\n return domUtils.matchesSelector(element, selector);\n }\n }\n\n return false;\n },\n\n getActualElement: function (element) {\n return (element instanceof domObjects.SVGElementInstance\n ? element.correspondingUseElement\n : element);\n },\n\n getScrollXY: function (relevantWindow) {\n relevantWindow = relevantWindow || win.window;\n return {\n x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft,\n y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop,\n };\n },\n\n getElementClientRect: function (element) {\n const clientRect = (element instanceof domObjects.SVGElement\n ? element.getBoundingClientRect()\n : element.getClientRects()[0]);\n\n return clientRect && {\n left : clientRect.left,\n right : clientRect.right,\n top : clientRect.top,\n bottom: clientRect.bottom,\n width : clientRect.width || clientRect.right - clientRect.left,\n height: clientRect.height || clientRect.bottom - clientRect.top,\n };\n },\n\n getElementRect: function (element) {\n const clientRect = domUtils.getElementClientRect(element);\n\n if (!browser.isIOS7 && clientRect) {\n const scroll = domUtils.getScrollXY(win.getWindow(element));\n\n clientRect.left += scroll.x;\n clientRect.right += scroll.x;\n clientRect.top += scroll.y;\n clientRect.bottom += scroll.y;\n }\n\n return clientRect;\n },\n\n getPath: function (element) {\n const path = [];\n\n while (element) {\n path.push(element);\n element = domUtils.parentNode(element);\n }\n\n return path;\n },\n\n trySelector: value => {\n if (!is.string(value)) { return false; }\n\n // an exception will be raised if it is invalid\n domObjects.document.querySelector(value);\n return true;\n },\n};\n\nmodule.exports = domUtils;\n","const is = require('./is');\nconst domUtils = require('./domUtils');\nconst pExtend = require('./pointerExtend');\n\nconst { window, getWindow } = require('./window');\nconst { indexOf, contains } = require('./arr');\n\nconst useAttachEvent = ('attachEvent' in window) && !('addEventListener' in window);\nconst addEvent = useAttachEvent? 'attachEvent': 'addEventListener';\nconst removeEvent = useAttachEvent? 'detachEvent': 'removeEventListener';\nconst on = useAttachEvent? 'on': '';\n\nconst elements = [];\nconst targets = [];\nconst attachedListeners = [];\n\n// {\n// type: {\n// selectors: ['selector', ...],\n// contexts : [document, ...],\n// listeners: [[listener, capture, passive], ...]\n// }\n// }\nconst delegatedEvents = {};\n\nconst documents = [];\n\nconst supportsOptions = !useAttachEvent && (() => {\n let supported = false;\n\n window.document.createElement('div').addEventListener('test', null, {\n get capture () { supported = true; },\n });\n\n return supported;\n})();\n\nfunction add (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n let elementIndex = indexOf(elements, element);\n let target = targets[elementIndex];\n\n if (!target) {\n target = {\n events: {},\n typeCount: 0,\n };\n\n elementIndex = elements.push(element) - 1;\n targets.push(target);\n\n attachedListeners.push(useAttachEvent\n ? {\n supplied: [],\n wrapped : [],\n useCount: [],\n }\n : null);\n }\n\n if (!target.events[type]) {\n target.events[type] = [];\n target.typeCount++;\n }\n\n if (!contains(target.events[type], listener)) {\n let ret;\n\n if (useAttachEvent) {\n const { supplied, wrapped, useCount } = attachedListeners[elementIndex];\n const listenerIndex = indexOf(supplied, listener);\n\n const wrappedListener = wrapped[listenerIndex] || function (event) {\n if (!event.immediatePropagationStopped) {\n event.target = event.srcElement;\n event.currentTarget = element;\n\n event.preventDefault = event.preventDefault || preventDef;\n event.stopPropagation = event.stopPropagation || stopProp;\n event.stopImmediatePropagation = event.stopImmediatePropagation || stopImmProp;\n\n if (/mouse|click/.test(event.type)) {\n event.pageX = event.clientX + getWindow(element).document.documentElement.scrollLeft;\n event.pageY = event.clientY + getWindow(element).document.documentElement.scrollTop;\n }\n\n listener(event);\n }\n };\n\n ret = element[addEvent](on + type, wrappedListener, !!options.capture);\n\n if (listenerIndex === -1) {\n supplied.push(listener);\n wrapped.push(wrappedListener);\n useCount.push(1);\n }\n else {\n useCount[listenerIndex]++;\n }\n }\n else {\n ret = element[addEvent](type, listener, supportsOptions? options : !!options.capture);\n }\n target.events[type].push(listener);\n\n return ret;\n }\n}\n\nfunction remove (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const elementIndex = indexOf(elements, element);\n const target = targets[elementIndex];\n\n if (!target || !target.events) {\n return;\n }\n\n let wrappedListener = listener;\n let listeners;\n let listenerIndex;\n\n if (useAttachEvent) {\n listeners = attachedListeners[elementIndex];\n listenerIndex = indexOf(listeners.supplied, listener);\n wrappedListener = listeners.wrapped[listenerIndex];\n }\n\n if (type === 'all') {\n for (type in target.events) {\n if (target.events.hasOwnProperty(type)) {\n remove(element, type, 'all');\n }\n }\n return;\n }\n\n if (target.events[type]) {\n const len = target.events[type].length;\n\n if (listener === 'all') {\n for (let i = 0; i < len; i++) {\n remove(element, type, target.events[type][i], options);\n }\n return;\n }\n else {\n for (let i = 0; i < len; i++) {\n if (target.events[type][i] === listener) {\n element[removeEvent](on + type, wrappedListener, supportsOptions? options : !!options.capture);\n target.events[type].splice(i, 1);\n\n if (useAttachEvent && listeners) {\n listeners.useCount[listenerIndex]--;\n if (listeners.useCount[listenerIndex] === 0) {\n listeners.supplied.splice(listenerIndex, 1);\n listeners.wrapped.splice(listenerIndex, 1);\n listeners.useCount.splice(listenerIndex, 1);\n }\n }\n\n break;\n }\n }\n }\n\n if (target.events[type] && target.events[type].length === 0) {\n target.events[type] = null;\n target.typeCount--;\n }\n }\n\n if (!target.typeCount) {\n targets.splice(elementIndex, 1);\n elements.splice(elementIndex, 1);\n attachedListeners.splice(elementIndex, 1);\n }\n}\n\nfunction addDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n if (!delegatedEvents[type]) {\n delegatedEvents[type] = {\n selectors: [],\n contexts : [],\n listeners: [],\n };\n\n // add delegate listener functions\n for (let i = 0; i < documents.length; i++) {\n add(documents[i], type, delegateListener);\n add(documents[i], type, delegateUseCapture, true);\n }\n }\n\n const delegated = delegatedEvents[type];\n let index;\n\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n break;\n }\n }\n\n if (index === -1) {\n index = delegated.selectors.length;\n\n delegated.selectors.push(selector);\n delegated.contexts .push(context);\n delegated.listeners.push([]);\n }\n\n // keep listener and capture and passive flags\n delegated.listeners[index].push([listener, !!options.capture, options.passive]);\n}\n\nfunction removeDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const delegated = delegatedEvents[type];\n let matchFound = false;\n let index;\n\n if (!delegated) { return; }\n\n // count from last index of delegated to 0\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n // look for matching selector and context Node\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n\n const listeners = delegated.listeners[index];\n\n // each item of the listeners array is an array: [function, capture, passive]\n for (let i = listeners.length - 1; i >= 0; i--) {\n const [fn, capture, passive] = listeners[i];\n\n // check if the listener functions and capture and passive flags match\n if (fn === listener && capture === !!options.capture && passive === options.passive) {\n // remove the listener from the array of listeners\n listeners.splice(i, 1);\n\n // if all listeners for this interactable have been removed\n // remove the interactable from the delegated arrays\n if (!listeners.length) {\n delegated.selectors.splice(index, 1);\n delegated.contexts .splice(index, 1);\n delegated.listeners.splice(index, 1);\n\n // remove delegate function from context\n remove(context, type, delegateListener);\n remove(context, type, delegateUseCapture, true);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegatedEvents[type] = null;\n }\n }\n\n // only remove one listener\n matchFound = true;\n break;\n }\n }\n\n if (matchFound) { break; }\n }\n }\n}\n\n// bound to the interactable context when a DOM event\n// listener is added to a selector interactable\nfunction delegateListener (event, optionalArg) {\n const options = getOptions(optionalArg);\n const fakeEvent = {};\n const delegated = delegatedEvents[event.type];\n const eventTarget = (domUtils.getActualElement(event.path\n ? event.path[0]\n : event.target));\n let element = eventTarget;\n\n // duplicate the event so that currentTarget can be changed\n pExtend(fakeEvent, event);\n\n fakeEvent.originalEvent = event;\n fakeEvent.preventDefault = preventOriginalDefault;\n\n // climb up document tree looking for selector matches\n while (is.element(element)) {\n for (let i = 0; i < delegated.selectors.length; i++) {\n const selector = delegated.selectors[i];\n const context = delegated.contexts[i];\n\n if (domUtils.matchesSelector(element, selector)\n && domUtils.nodeContains(context, eventTarget)\n && domUtils.nodeContains(context, element)) {\n\n const listeners = delegated.listeners[i];\n\n fakeEvent.currentTarget = element;\n\n for (let j = 0; j < listeners.length; j++) {\n const [fn, capture, passive] = listeners[j];\n\n if (capture === !!options.capture && passive === options.passive) {\n fn(fakeEvent);\n }\n }\n }\n }\n\n element = domUtils.parentNode(element);\n }\n}\n\nfunction delegateUseCapture (event) {\n return delegateListener.call(this, event, true);\n}\n\nfunction preventDef () {\n this.returnValue = false;\n}\n\nfunction preventOriginalDefault () {\n this.originalEvent.preventDefault();\n}\n\nfunction stopProp () {\n this.cancelBubble = true;\n}\n\nfunction stopImmProp () {\n this.cancelBubble = true;\n this.immediatePropagationStopped = true;\n}\n\nfunction getOptions (param) {\n return is.object(param)? param : { capture: param };\n}\n\nmodule.exports = {\n add,\n remove,\n\n addDelegate,\n removeDelegate,\n\n delegateListener,\n delegateUseCapture,\n delegatedEvents,\n documents,\n\n useAttachEvent,\n supportsOptions,\n\n _elements: elements,\n _targets: targets,\n _attachedListeners: attachedListeners,\n};\n","module.exports = function extend (dest, source) {\n for (const prop in source) {\n dest[prop] = source[prop];\n }\n return dest;\n};\n","const {\n resolveRectLike,\n rectToXY,\n} = require('./rect');\n\nmodule.exports = function (target, element, action) {\n const actionOptions = target.options[action];\n const actionOrigin = actionOptions && actionOptions.origin;\n const origin = actionOrigin || target.options.origin;\n\n const originRect = resolveRectLike(origin, target, element, [target && element]);\n\n return rectToXY(originRect) || { x: 0, y: 0 };\n};\n","module.exports = (x, y) => Math.sqrt(x * x + y * y);\n","const extend = require('./extend');\nconst win = require('./window');\n\nconst utils = {\n warnOnce: function (method, message) {\n let warned = false;\n\n return function () {\n if (!warned) {\n win.window.console.warn(message);\n warned = true;\n }\n\n return method.apply(this, arguments);\n };\n },\n\n // http://stackoverflow.com/a/5634528/2280888\n _getQBezierValue: function (t, p1, p2, p3) {\n const iT = 1 - t;\n return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3;\n },\n\n getQuadraticCurvePoint: function (startX, startY, cpX, cpY, endX, endY, position) {\n return {\n x: utils._getQBezierValue(position, startX, cpX, endX),\n y: utils._getQBezierValue(position, startY, cpY, endY),\n };\n },\n\n // http://gizma.com/easing/\n easeOutQuad: function (t, b, c, d) {\n t /= d;\n return -c * t*(t-2) + b;\n },\n\n copyAction: function (dest, src) {\n dest.name = src.name;\n dest.axis = src.axis;\n dest.edges = src.edges;\n\n return dest;\n },\n\n is : require('./is'),\n extend : extend,\n hypot : require('./hypot'),\n getOriginXY: require('./getOriginXY'),\n};\n\nextend(utils, require('./arr'));\nextend(utils, require('./domUtils'));\nextend(utils, require('./pointerUtils'));\nextend(utils, require('./rect'));\n\nmodule.exports = utils;\n","const scope = require('../scope');\nconst utils = require('./index');\n\nconst finder = {\n methodOrder: [ 'simulationResume', 'mouseOrPen', 'hasPointer', 'idle' ],\n\n search: function (pointer, eventType, eventTarget) {\n const pointerType = utils.getPointerType(pointer);\n const pointerId = utils.getPointerId(pointer);\n const details = { pointer, pointerId, pointerType, eventType, eventTarget };\n\n for (const method of finder.methodOrder) {\n const interaction = finder[method](details);\n\n if (interaction) {\n return interaction;\n }\n }\n },\n\n // try to resume simulation with a new pointer\n simulationResume: function ({ pointerType, eventType, eventTarget }) {\n if (!/down|start/i.test(eventType)) {\n return null;\n }\n\n for (const interaction of scope.interactions) {\n let element = eventTarget;\n\n if (interaction.simulation && interaction.simulation.allowResume\n && (interaction.pointerType === pointerType)) {\n while (element) {\n // if the element is the interaction element\n if (element === interaction.element) {\n return interaction;\n }\n element = utils.parentNode(element);\n }\n }\n }\n\n return null;\n },\n\n // if it's a mouse or pen interaction\n mouseOrPen: function ({ pointerId, pointerType, eventType }) {\n if (pointerType !== 'mouse' && pointerType !== 'pen') {\n return null;\n }\n\n let firstNonActive;\n\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType) {\n // if it's a down event, skip interactions with running simulations\n if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; }\n\n // if the interaction is active, return it immediately\n if (interaction.interacting()) {\n return interaction;\n }\n // otherwise save it and look for another active interaction\n else if (!firstNonActive) {\n firstNonActive = interaction;\n }\n }\n }\n\n // if no active mouse interaction was found use the first inactive mouse\n // interaction\n if (firstNonActive) {\n return firstNonActive;\n }\n\n // find any mouse or pen interaction.\n // ignore the interaction if the eventType is a *down, and a simulation\n // is active\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType && !(/down/i.test(eventType) && interaction.simulation)) {\n return interaction;\n }\n }\n\n return null;\n },\n\n // get interaction that has this pointer\n hasPointer: function ({ pointerId }) {\n for (const interaction of scope.interactions) {\n if (utils.contains(interaction.pointerIds, pointerId)) {\n return interaction;\n }\n }\n },\n\n // get first idle interaction with a matching pointerType\n idle: function ({ pointerType }) {\n for (const interaction of scope.interactions) {\n // if there's already a pointer held down\n if (interaction.pointerIds.length === 1) {\n const target = interaction.target;\n // don't add this pointer if there is a target interactable and it\n // isn't gesturable\n if (target && !target.options.gesture.enabled) {\n continue;\n }\n }\n // maximum of 2 pointers per interaction\n else if (interaction.pointerIds.length >= 2) {\n continue;\n }\n\n if (!interaction.interacting() && (pointerType === interaction.pointerType)) {\n return interaction;\n }\n }\n\n return null;\n },\n};\n\nmodule.exports = finder;\n","const win = require('./window');\nconst isWindow = require('./isWindow');\n\nconst is = {\n array : () => {},\n\n window : thing => thing === win.window || isWindow(thing),\n\n docFrag : thing => is.object(thing) && thing.nodeType === 11,\n\n object : thing => !!thing && (typeof thing === 'object'),\n\n function: thing => typeof thing === 'function',\n\n number : thing => typeof thing === 'number' ,\n\n bool : thing => typeof thing === 'boolean' ,\n\n string : thing => typeof thing === 'string' ,\n\n element: thing => {\n if (!thing || (typeof thing !== 'object')) { return false; }\n\n const _window = win.getWindow(thing) || win.window;\n\n return (/object|function/.test(typeof _window.Element)\n ? thing instanceof _window.Element //DOM2\n : thing.nodeType === 1 && typeof thing.nodeName === 'string');\n },\n};\n\nis.array = thing => (is.object(thing)\n && (typeof thing.length !== 'undefined')\n && is.function(thing.splice));\n\nmodule.exports = is;\n","module.exports = (thing) => !!(thing && thing.Window) && (thing instanceof thing.Window);\n","function pointerExtend (dest, source) {\n for (const prop in source) {\n const prefixedPropREs = module.exports.prefixedPropREs;\n let deprecated = false;\n\n // skip deprecated prefixed properties\n for (const vendor in prefixedPropREs) {\n if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) {\n deprecated = true;\n break;\n }\n }\n\n if (!deprecated && typeof source[prop] !== 'function') {\n dest[prop] = source[prop];\n }\n }\n return dest;\n}\n\npointerExtend.prefixedPropREs = {\n webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/,\n};\n\nmodule.exports = pointerExtend;\n","const hypot = require('./hypot');\nconst browser = require('./browser');\nconst dom = require('./domObjects');\nconst domUtils = require('./domUtils');\nconst domObjects = require('./domObjects');\nconst is = require('./is');\nconst pointerExtend = require('./pointerExtend');\n\nconst pointerUtils = {\n copyCoords: function (dest, src) {\n dest.page = dest.page || {};\n dest.page.x = src.page.x;\n dest.page.y = src.page.y;\n\n dest.client = dest.client || {};\n dest.client.x = src.client.x;\n dest.client.y = src.client.y;\n\n dest.timeStamp = src.timeStamp;\n },\n\n setCoordDeltas: function (targetObj, prev, cur) {\n targetObj.page.x = cur.page.x - prev.page.x;\n targetObj.page.y = cur.page.y - prev.page.y;\n targetObj.client.x = cur.client.x - prev.client.x;\n targetObj.client.y = cur.client.y - prev.client.y;\n targetObj.timeStamp = cur.timeStamp - prev.timeStamp;\n\n // set pointer velocity\n const dt = Math.max(targetObj.timeStamp / 1000, 0.001);\n\n targetObj.page.speed = hypot(targetObj.page.x, targetObj.page.y) / dt;\n targetObj.page.vx = targetObj.page.x / dt;\n targetObj.page.vy = targetObj.page.y / dt;\n\n targetObj.client.speed = hypot(targetObj.client.x, targetObj.page.y) / dt;\n targetObj.client.vx = targetObj.client.x / dt;\n targetObj.client.vy = targetObj.client.y / dt;\n },\n\n isNativePointer: function (pointer) {\n return (pointer instanceof dom.Event || pointer instanceof dom.Touch);\n },\n\n // Get specified X/Y coords for mouse or event.touches[0]\n getXY: function (type, pointer, xy) {\n xy = xy || {};\n type = type || 'page';\n\n xy.x = pointer[type + 'X'];\n xy.y = pointer[type + 'Y'];\n\n return xy;\n },\n\n getPageXY: function (pointer, page) {\n page = page || {};\n\n // Opera Mobile handles the viewport and scrolling oddly\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n pointerUtils.getXY('screen', pointer, page);\n\n page.x += window.scrollX;\n page.y += window.scrollY;\n }\n else {\n pointerUtils.getXY('page', pointer, page);\n }\n\n return page;\n },\n\n getClientXY: function (pointer, client) {\n client = client || {};\n\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n // Opera Mobile handles the viewport and scrolling oddly\n pointerUtils.getXY('screen', pointer, client);\n }\n else {\n pointerUtils.getXY('client', pointer, client);\n }\n\n return client;\n },\n\n getPointerId: function (pointer) {\n return is.number(pointer.pointerId)? pointer.pointerId : pointer.identifier;\n },\n\n setCoords: function (targetObj, pointers, timeStamp) {\n const pointer = (pointers.length > 1\n ? pointerUtils.pointerAverage(pointers)\n : pointers[0]);\n\n const tmpXY = {};\n\n pointerUtils.getPageXY(pointer, tmpXY);\n targetObj.page.x = tmpXY.x;\n targetObj.page.y = tmpXY.y;\n\n pointerUtils.getClientXY(pointer, tmpXY);\n targetObj.client.x = tmpXY.x;\n targetObj.client.y = tmpXY.y;\n\n targetObj.timeStamp = is.number(timeStamp) ? timeStamp :new Date().getTime();\n },\n\n pointerExtend: pointerExtend,\n\n getTouchPair: function (event) {\n const touches = [];\n\n // array of touches is supplied\n if (is.array(event)) {\n touches[0] = event[0];\n touches[1] = event[1];\n }\n // an event\n else {\n if (event.type === 'touchend') {\n if (event.touches.length === 1) {\n touches[0] = event.touches[0];\n touches[1] = event.changedTouches[0];\n }\n else if (event.touches.length === 0) {\n touches[0] = event.changedTouches[0];\n touches[1] = event.changedTouches[1];\n }\n }\n else {\n touches[0] = event.touches[0];\n touches[1] = event.touches[1];\n }\n }\n\n return touches;\n },\n\n pointerAverage: function (pointers) {\n const average = {\n pageX : 0,\n pageY : 0,\n clientX: 0,\n clientY: 0,\n screenX: 0,\n screenY: 0,\n };\n\n for (const pointer of pointers) {\n for (const prop in average) {\n average[prop] += pointer[prop];\n }\n }\n for (const prop in average) {\n average[prop] /= pointers.length;\n }\n\n return average;\n },\n\n touchBBox: function (event) {\n if (!event.length && !(event.touches && event.touches.length > 1)) {\n return;\n }\n\n const touches = pointerUtils.getTouchPair(event);\n const minX = Math.min(touches[0].pageX, touches[1].pageX);\n const minY = Math.min(touches[0].pageY, touches[1].pageY);\n const maxX = Math.max(touches[0].pageX, touches[1].pageX);\n const maxY = Math.max(touches[0].pageY, touches[1].pageY);\n\n return {\n x: minX,\n y: minY,\n left: minX,\n top: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n },\n\n touchDistance: function (event, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n\n\n const dx = touches[0][sourceX] - touches[1][sourceX];\n const dy = touches[0][sourceY] - touches[1][sourceY];\n\n return hypot(dx, dy);\n },\n\n touchAngle: function (event, prevAngle, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n const dx = touches[1][sourceX] - touches[0][sourceX];\n const dy = touches[1][sourceY] - touches[0][sourceY];\n const angle = 180 * Math.atan2(dy , dx) / Math.PI;\n\n return angle;\n },\n\n getPointerType: function (pointer) {\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : is.number(pointer.pointerType)\n ? [undefined, undefined,'touch', 'pen', 'mouse'][pointer.pointerType]\n // if the PointerEvent API isn't available, then the \"pointer\" must\n // be either a MouseEvent, TouchEvent, or Touch object\n : /touch/.test(pointer.type) || pointer instanceof domObjects.Touch\n ? 'touch'\n : 'mouse';\n },\n\n // [ event.target, event.currentTarget ]\n getEventTargets: function (event) {\n return [\n domUtils.getActualElement(event.path ? event.path[0] : event.target),\n domUtils.getActualElement(event.currentTarget),\n ];\n },\n};\n\nmodule.exports = pointerUtils;\n","const { window } = require('./window');\n\nconst vendors = ['ms', 'moz', 'webkit', 'o'];\nlet lastTime = 0;\nlet request;\nlet cancel;\n\nfor (let x = 0; x < vendors.length && !window.requestAnimationFrame; x++) {\n request = window[vendors[x] + 'RequestAnimationFrame'];\n cancel = window[vendors[x] +'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n}\n\nif (!request) {\n request = function (callback) {\n const currTime = new Date().getTime();\n const timeToCall = Math.max(0, 16 - (currTime - lastTime));\n const id = setTimeout(function () { callback(currTime + timeToCall); },\n timeToCall);\n\n lastTime = currTime + timeToCall;\n return id;\n };\n}\n\nif (!cancel) {\n cancel = function (id) {\n clearTimeout(id);\n };\n}\n\nmodule.exports = {\n request,\n cancel,\n};\n","const extend = require('./extend');\nconst is = require('./is');\nconst {\n closest,\n parentNode,\n getElementRect,\n} = require('./domUtils');\n\nconst rectUtils = {\n getStringOptionResult: function (value, interactable, element) {\n if (!is.string(value)) {\n return null;\n }\n\n if (value === 'parent') {\n value = parentNode(element);\n }\n else if (value === 'self') {\n value = interactable.getRect(element);\n }\n else {\n value = closest(element, value);\n }\n\n return value;\n },\n\n resolveRectLike: function (value, interactable, element, functionArgs) {\n value = rectUtils.getStringOptionResult(value, interactable, element) || value;\n\n if (is.function(value)) {\n value = value.apply(null, functionArgs);\n }\n\n if (is.element(value)) {\n value = getElementRect(value);\n }\n\n return value;\n },\n\n rectToXY: function (rect) {\n return rect && {\n x: 'x' in rect ? rect.x : rect.left,\n y: 'y' in rect ? rect.y : rect.top,\n };\n },\n\n xywhToTlbr: function (rect) {\n if (rect && !('left' in rect && 'top' in rect)) {\n rect = extend({}, rect);\n\n rect.left = rect.x || 0;\n rect.top = rect.y || 0;\n rect.right = rect.right || (rect.left + rect.width);\n rect.bottom = rect.bottom || (rect.top + rect.height);\n }\n\n return rect;\n },\n\n tlbrToXywh: function (rect) {\n if (rect && !('x' in rect && 'y' in rect)) {\n rect = extend({}, rect);\n\n rect.x = rect.left || 0;\n rect.top = rect.top || 0;\n rect.width = rect.width || (rect.right - rect.x);\n rect.height = rect.height || (rect.bottom - rect.y);\n }\n\n return rect;\n },\n};\n\nmodule.exports = rectUtils;\n","const win = module.exports;\nconst isWindow = require('./isWindow');\n\nfunction init (window) {\n // get wrapped window if using Shadow DOM polyfill\n\n win.realWindow = window;\n\n // create a TextNode\n const el = window.document.createTextNode('');\n\n // check if it's wrapped by a polyfill\n if (el.ownerDocument !== window.document\n && typeof window.wrap === 'function'\n && window.wrap(el) === el) {\n // use wrapped window\n window = window.wrap(window);\n }\n\n win.window = window;\n}\n\nif (typeof window === 'undefined') {\n win.window = undefined;\n win.realWindow = undefined;\n}\nelse {\n init(window);\n}\n\nwin.getWindow = function getWindow (node) {\n if (isWindow(node)) {\n return node;\n }\n\n const rootNode = (node.ownerDocument || node);\n\n return rootNode.defaultView || rootNode.parentWindow || win.window;\n};\n\nwin.init = init;\n"]} \ No newline at end of file diff --git a/dist/interact.min.js b/dist/interact.min.js index c0bb2476c..2d1f0fb62 100644 --- a/dist/interact.min.js +++ b/dist/interact.min.js @@ -1,6 +1,6 @@ -/* interact.js v1.3.0-alpha.3+sha.9595c40 | https://raw.github.com/taye/interact.js/master/LICENSE */ -!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var t;t="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,t.interact=e()}}(function(){return function e(t,n,r){function i(s,a){if(!n[s]){if(!t[s]){var l="function"==typeof require&&require;if(!a&&l)return l(s,!0);if(o)return o(s,!0);var c=new Error("Cannot find module '"+s+"'");throw c.code="MODULE_NOT_FOUND",c}var p=n[s]={exports:{}};t[s][0].call(p.exports,function(e){var n=t[s][1][e];return i(n||e)},p,p.exports,e,t,n,r)}return n[s].exports}for(var o="function"==typeof require&&require,s=0;s6&&void 0!==arguments[6]&&arguments[6];r(this,e);var f=t.target,v=(f&&f.options||s).deltaSource,g=o(f,p,l),h="start"===c,m="end"===c,y=h?t.startCoords:t.curCoords,x=t.prevEvent;p=p||t.element;var b=i({},y.page),w=i({},y.client);b.x-=g.x,b.y-=g.y,w.x-=g.x,w.y-=g.y,this.ctrlKey=n.ctrlKey,this.altKey=n.altKey,this.shiftKey=n.shiftKey,this.metaKey=n.metaKey,this.button=n.button,this.buttons=n.buttons,this.target=p,this.currentTarget=p,this.relatedTarget=u||null,this.preEnd=d,this.type=l+(c||""),this.interaction=t,this.interactable=f,this.t0=h?t.downTimes[t.downTimes.length-1]:x.t0;var E={interaction:t,event:n,action:l,phase:c,element:p,related:u,page:b,client:w,coords:y,starting:h,ending:m,deltaSource:v,iEvent:this};a.fire("set-xy",E),m?(this.pageX=x.pageX,this.pageY=x.pageY,this.clientX=x.clientX,this.clientY=x.clientY):(this.pageX=b.x,this.pageY=b.y,this.clientX=w.x,this.clientY=w.y),this.x0=t.startCoords.page.x-g.x,this.y0=t.startCoords.page.y-g.y,this.clientX0=t.startCoords.client.x-g.x,this.clientY0=t.startCoords.client.y-g.y,a.fire("set-delta",E),this.timeStamp=y.timeStamp,this.dt=t.pointerDelta.timeStamp,this.duration=this.timeStamp-this.t0,this.speed=t.pointerDelta[v].speed,this.velocityX=t.pointerDelta[v].vx,this.velocityY=t.pointerDelta[v].vy,this.swipe=m||"inertiastart"===c?this.getSwipe():null,a.fire("new",E)}return e.prototype.getSwipe=function(){var e=this.interaction;if(e.prevEvent.speed<600||this.timeStamp-e.prevEvent.timeStamp>150)return null;var t=180*Math.atan2(e.prevEvent.velocityY,e.prevEvent.velocityX)/Math.PI;t<0&&(t+=360);var n=112.5<=t&&t<247.5,r=202.5<=t&&t<337.5,i=!n&&(292.5<=t||t<67.5);return{up:r,down:!r&&22.5<=t&&t<157.5,left:n,right:i,angle:t,speed:e.prevEvent.speed,velocity:{x:e.prevEvent.velocityX,y:e.prevEvent.velocityY}}},e.prototype.preventDefault=function(){},e.prototype.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},e.prototype.stopPropagation=function(){this.propagationStopped=!0},e}();a.on("set-delta",function(e){var t=e.iEvent,n=e.interaction,r=e.starting,i=e.deltaSource,o=r?t:n.prevEvent;"client"===i?(t.dx=t.clientX-o.clientX,t.dy=t.clientY-o.clientY):(t.dx=t.pageX-o.pageX,t.dy=t.pageY-o.pageY)}),l.signals=a,t.exports=l},{"./defaultOptions":18,"./utils/Signals":35,"./utils/extend":41,"./utils/getOriginXY":42}],4:[function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=e("./utils/is"),o=e("./utils/events"),s=e("./utils/extend"),a=e("./actions/base"),l=e("./scope"),c=e("./Eventable"),p=e("./defaultOptions"),u=e("./utils/Signals").new(),d=e("./utils/domUtils"),f=d.getElementRect,v=d.nodeContains,g=d.trySelector,h=e("./utils/window"),m=h.getWindow,y=e("./utils/arr"),x=y.indexOf,b=y.contains,w=e("./utils/browser"),E=w.wheelEvent;l.interactables=[];var S=function(){function e(t,n){r(this,e),n=n||{},this.target=t,this.events=new c,this._context=n.context||l.document,this._win=m(g(t)?this._context:t),this._doc=this._win.document,u.fire("new",{target:t,options:n,interactable:this,win:this._win}),l.addDocument(this._doc,this._win),l.interactables.push(this),this.set(n)}return e.prototype.setOnEvents=function(e,t){var n="on"+e;return i.function(t.onstart)&&(this.events[n+"start"]=t.onstart),i.function(t.onmove)&&(this.events[n+"move"]=t.onmove),i.function(t.onend)&&(this.events[n+"end"]=t.onend),i.function(t.oninertiastart)&&(this.events[n+"inertiastart"]=t.oninertiastart),this},e.prototype.setPerAction=function(e,t){for(var n in t)n in p[e]&&(i.object(t[n])?(this.options[e][n]=s(this.options[e][n]||{},t[n]),i.object(p.perAction[n])&&"enabled"in p.perAction[n]&&(this.options[e][n].enabled=!1!==t[n].enabled)):i.bool(t[n])&&i.object(p.perAction[n])?this.options[e][n].enabled=t[n]:void 0!==t[n]&&(this.options[e][n]=t[n]))},e.prototype.getRect=function(e){return e=e||this.target,i.string(this.target)&&!i.element(e)&&(e=this._context.querySelector(this.target)),f(e)},e.prototype.rectChecker=function(e){return i.function(e)?(this.getRect=e,this):null===e?(delete this.options.getRect,this):this.getRect},e.prototype._backCompatOption=function(e,t){if(g(t)||i.object(t)){this.options[e]=t;for(var n=a.names,r=Array.isArray(n),o=0,n=r?n:n[Symbol.iterator]();;){var s;if(r){if(o>=n.length)break;s=n[o++]}else{if(o=n.next(),o.done)break;s=o.value}var l=s;this.options[l][e]=t}return this}return this.options[e]},e.prototype.origin=function(e){return this._backCompatOption("origin",e)},e.prototype.deltaSource=function(e){return"page"===e||"client"===e?(this.options.deltaSource=e,this):this.options.deltaSource},e.prototype.context=function(){return this._context},e.prototype.inContext=function(e){return this._context===e.ownerDocument||v(this._context,e)},e.prototype.fire=function(e){return this.events.fire(e),this},e.prototype._onOffMultiple=function(e,t,n,r){if(i.string(t)&&-1!==t.search(" ")&&(t=t.trim().split(/ +/)),i.array(t)){for(var o=0;o=l.length)break;f=l[d++]}else{if(d=l.next(),d.done)break;f=d.value}var v=f;this.options[v]=p.base[v],v in t&&this[v](t[v])}return u.fire("set",{options:t,interactable:this}),this},e.prototype.unset=function(){if(o.remove(this.target,"all"),i.string(this.target))for(var e in o.delegatedEvents){var t=o.delegatedEvents[e];t.selectors[0]===this.target&&t.contexts[0]===this._context&&(t.selectors.splice(0,1),t.contexts.splice(0,1),t.listeners.splice(0,1),t.selectors.length||(t[e]=null)),o.remove(this._context,e,o.delegateListener),o.remove(this._context,e,o.delegateUseCapture,!0)}else o.remove(this,"all");u.fire("unset",{interactable:this}),l.interactables.splice(x(l.interactables,this),1);for(var n=l.interactions||[],r=Array.isArray(n),s=0,n=r?n:n[Symbol.iterator]();;){var a;if(r){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var c=a;c.target===this&&c.interacting()&&c.stop()}return l.interact},e}();l.interactables.indexOfElement=function(e,t){t=t||l.document;for(var n=0;n=y.length)break;w=y[b++]}else{if(b=y.next(),b.done)break;w=b.value}var E=w,S=E[0],T=E[1];T._updateEventTargets(r,i),T[e](S,t,r,i)}}}function o(e){for(var t=0;te.pointerMoveTolerance);var a={pointer:t,pointerIndex:this.getPointerIndex(t),event:n,eventTarget:r,dx:o,dy:s,duplicate:i,interaction:this,interactingBeforeMove:this.interacting()};i||l.setCoordDeltas(this.pointerDelta,this.prevCoords,this.curCoords),d.fire("move",a),i||(this.interacting()&&this.doMove(a),this.pointerWasMoved&&l.copyCoords(this.prevCoords,this.curCoords))},e.prototype.doMove=function(e){e=l.extend({pointer:this.pointers[0],event:this.prevEvent,eventTarget:this._eventTarget,interaction:this},e||{}),d.fire("before-action-move",e),this._dontFireMove||d.fire("action-move",e),this._dontFireMove=!1},e.prototype.pointerUp=function(e,t,n,r){var i=this.getPointerIndex(e);d.fire(/cancel$/i.test(t.type)?"cancel":"up",{pointer:e,pointerIndex:i,event:t,eventTarget:n,curEventTarget:r,interaction:this}),this.simulation||this.end(t),this.pointerIsDown=!1,this.removePointer(e,t)},e.prototype.end=function(e){e=e||this.prevEvent,this.interacting()&&d.fire("action-end",{event:e,interaction:this}),this.stop()},e.prototype.currentAction=function(){return this._interacting?this.prepared.name:null},e.prototype.interacting=function(){return this._interacting},e.prototype.stop=function(){d.fire("stop",{interaction:this}),this._interacting&&(d.fire("stop-active",{interaction:this}),d.fire("stop-"+this.prepared.name,{interaction:this})),this.target=this.element=null,this._interacting=!1,this.prepared.name=this.prevEvent=null},e.prototype.getPointerIndex=function(e){return l.indexOf(this.pointerIds,l.getPointerId(e))},e.prototype.updatePointer=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:t&&/(down|start)$/i.test(t.type),r=l.getPointerId(e),i=this.getPointerIndex(e);return-1===i&&(i=this.pointerIds.length,this.pointerIds[i]=r),n&&d.fire("update-pointer-down",{pointer:e,event:t,down:n,pointerId:r,pointerIndex:i,interaction:this}),this.pointers[i]=e,i},e.prototype.removePointer=function(e,t){var n=l.getPointerId(e),r=this.mouse?0:l.indexOf(this.pointerIds,n);-1!==r&&(d.fire("remove-pointer",{pointer:e,event:t,pointerIndex:r,interaction:this}),this.pointers.splice(r,1),this.pointerIds.splice(r,1),this.downTargets.splice(r,1),this.downTimes.splice(r,1))},e.prototype._updateEventTargets=function(e,t){this._eventTarget=e,this._curEventTarget=t},e}(),m=0,y=v.length;m=i.length)break;a=i[s++]}else{if(s=i.next(),s.done)break;a=s.value}var l=a;if(l.options.drop.enabled){var c=l.options.drop.accept;if(!(p.is.element(c)&&c!==t||p.is.string(c)&&!p.matchesSelector(t,c)))for(var d=p.is.string(l.target)?l._context.querySelectorAll(l.target):[l.target],f=0;fo.left&&c.xo.top&&c.y=o.left&&v<=o.right&&g>=o.top&&g<=o.bottom}if(f&&p.is.number(a)){s=Math.max(0,Math.min(o.right,f.right)-Math.max(o.left,f.left))*Math.max(0,Math.min(o.bottom,f.bottom)-Math.max(o.top,f.top))/(f.width*f.height)>=a}return this.options.drop.checker&&(s=this.options.drop.checker(e,t,s,this,i,n,r)),s},v.signals.on("unset",function(e){e.interactable.dropzone(!1)}),v.settingsMethods.push("dropChecker"),g.signals.on("new",function(e){e.dropTarget=null,e.dropElement=null,e.prevDropTarget=null,e.prevDropElement=null,e.dropEvents=null,e.activeDrops={dropzones:[],elements:[],rects:[]}}),g.signals.on("stop",function(e){var t=e.interaction;t.dropTarget=t.dropElement=t.prevDropTarget=t.prevDropElement=null}),d.dynamicDrop=function(e){return p.is.bool(e)?(y=e,d):y},p.merge(v.eventTypes,["dragenter","dragleave","dropactivate","dropdeactivate","dropmove","drop"]),c.methodDict.drop="dropzone",h.drop=m.defaults,t.exports=m},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../interact":21,"../scope":34,"../utils":44,"./base":6}],9:[function(e,t,n){"use strict";var r=e("./base"),i=e("../utils"),o=e("../InteractEvent"),s=e("../Interactable"),a=e("../Interaction"),l=e("../defaultOptions"),c={defaults:{enabled:!1,origin:null,restrict:null},checker:function(e,t,n,r,i){return i.pointerIds.length>=2?{name:"gesture"}:null},getCursor:function(){return""}};o.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;"gesturestart"===t.type&&(t.ds=0,n.gesture.startDistance=n.gesture.prevDistance=t.distance,n.gesture.startAngle=n.gesture.prevAngle=t.angle,n.gesture.scale=1)}),o.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;"gesturemove"===t.type&&(t.ds=t.scale-n.gesture.scale,n.target.fire(t),n.gesture.prevAngle=t.angle,n.gesture.prevDistance=t.distance,t.scale===1/0||null===t.scale||void 0===t.scale||isNaN(t.scale)||(n.gesture.scale=t.scale))}),s.prototype.gesturable=function(e){return i.is.object(e)?(this.options.gesture.enabled=!1!==e.enabled,this.setPerAction("gesture",e),this.setOnEvents("gesture",e),this):i.is.bool(e)?(this.options.gesture.enabled=e,e||(this.ongesturestart=this.ongesturestart=this.ongestureend=null),this):this.options.gesture},o.signals.on("set-delta",function(e){var t=e.interaction,n=e.iEvent,r=e.action,s=e.event,a=e.starting,l=e.ending,c=e.deltaSource;if("gesture"===r){var p=t.pointers;n.touches=[p[0],p[1]],a?(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=1,n.ds=0,n.angle=i.touchAngle(p,void 0,c),n.da=0):l||s instanceof o?(n.distance=t.prevEvent.distance,n.box=t.prevEvent.box,n.scale=t.prevEvent.scale,n.ds=n.scale-1,n.angle=t.prevEvent.angle,n.da=n.angle-t.gesture.startAngle):(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=n.distance/t.gesture.startDistance,n.angle=i.touchAngle(p,t.gesture.prevAngle,c),n.ds=n.scale-t.gesture.prevScale,n.da=n.angle-t.gesture.prevAngle)}}),a.signals.on("new",function(e){e.gesture={start:{x:0,y:0},startDistance:0,prevDistance:0,distance:0,scale:1,startAngle:0,prevAngle:0}}),r.gesture=c,r.names.push("gesture"),i.merge(s.eventTypes,["gesturestart","gesturemove","gestureend"]),r.methodDict.gesture="gesturable",l.gesture=c.defaults,t.exports=c},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"./base":6}],10:[function(e,t,n){"use strict";function r(e,t,n,r,i,s,a){if(!t)return!1;if(!0===t){var l=o.is.number(s.width)?s.width:s.right-s.left,c=o.is.number(s.height)?s.height:s.bottom-s.top;if(l<0&&("left"===e?e="right":"right"===e&&(e="left")),c<0&&("top"===e?e="bottom":"bottom"===e&&(e="top")),"left"===e)return n.x<(l>=0?s.left:s.right)+a;if("top"===e)return n.y<(c>=0?s.top:s.bottom)+a;if("right"===e)return n.x>(l>=0?s.right:s.left)-a;if("bottom"===e)return n.y>(c>=0?s.bottom:s.top)-a}return!!o.is.element(r)&&(o.is.element(t)?t===r:o.matchesUpTo(r,t,i))}var i=e("./base"),o=e("../utils"),s=e("../utils/browser"),a=e("../InteractEvent"),l=e("../Interactable"),c=e("../Interaction"),p=e("../defaultOptions"),u=s.supportsTouch||s.supportsPointerEvent?20:10,d={defaults:{enabled:!1,mouseButtons:null,origin:null,snap:null,restrict:null,inertia:null,autoScroll:null,square:!1,preserveAspectRatio:!1,axis:"xy",margin:NaN,edges:null,invert:"none"},checker:function(e,t,n,i,s,a){if(!a)return null;var l=o.extend({},s.curCoords.page),c=n.options;if(c.resize.enabled){var p=c.resize,d={left:!1,right:!1,top:!1,bottom:!1};if(o.is.object(p.edges)){for(var f in d)d[f]=r(f,p.edges[f],l,s._eventTarget,i,a,p.margin||u);if(d.left=d.left&&!d.right,d.top=d.top&&!d.bottom,d.left||d.right||d.top||d.bottom)return{name:"resize",edges:d}}else{var v="y"!==c.resize.axis&&l.x>a.right-u,g="x"!==c.resize.axis&&l.y>a.bottom-u;if(v||g)return{name:"resize",axes:(v?"x":"")+(g?"y":"")}}}return null},cursors:s.isIe9OrOlder?{x:"e-resize",y:"s-resize",xy:"se-resize",top:"n-resize",left:"w-resize",bottom:"s-resize",right:"e-resize",topleft:"se-resize",bottomright:"se-resize",topright:"ne-resize",bottomleft:"ne-resize"}:{x:"ew-resize",y:"ns-resize",xy:"nwse-resize",top:"ns-resize",left:"ew-resize",bottom:"ns-resize",right:"ew-resize",topleft:"nwse-resize",bottomright:"nwse-resize",topright:"nesw-resize",bottomleft:"nesw-resize"},getCursor:function(e){if(e.axis)return d.cursors[e.name+e.axis];if(e.edges){for(var t="",n=["top","bottom","left","right"],r=0;r<4;r++)e.edges[n[r]]&&(t+=n[r]);return d.cursors[t]}}};a.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;if("resizestart"===t.type&&n.prepared.edges){var r=n.target.getRect(n.element),i=n.target.options.resize;if(i.square||i.preserveAspectRatio){var s=o.extend({},n.prepared.edges);s.top=s.top||s.left&&!s.bottom,s.left=s.left||s.top&&!s.right,s.bottom=s.bottom||s.right&&!s.top,s.right=s.right||s.bottom&&!s.left,n.prepared._linkedEdges=s}else n.prepared._linkedEdges=null;i.preserveAspectRatio&&(n.resizeStartAspectRatio=r.width/r.height),n.resizeRects={start:r,current:o.extend({},r),inverted:o.extend({},r),previous:o.extend({},r),delta:{left:0,right:0,width:0,top:0,bottom:0,height:0}},t.rect=n.resizeRects.inverted,t.deltaRect=n.resizeRects.delta}}),a.signals.on("new",function(e){var t=e.iEvent,n=e.phase,r=e.interaction;if("move"===n&&r.prepared.edges){var i=r.target.options.resize,s=i.invert,a="reposition"===s||"negate"===s,l=r.prepared.edges,c=r.resizeRects.start,p=r.resizeRects.current,u=r.resizeRects.inverted,d=r.resizeRects.delta,f=o.extend(r.resizeRects.previous,u),v=l,g=t.dx,h=t.dy;if(i.preserveAspectRatio||i.square){var m=i.preserveAspectRatio?r.resizeStartAspectRatio:1;l=r.prepared._linkedEdges,v.left&&v.bottom||v.right&&v.top?h=-g/m:v.left||v.right?h=g/m:(v.top||v.bottom)&&(g=h*m)}if(l.top&&(p.top+=h),l.bottom&&(p.bottom+=h),l.left&&(p.left+=g),l.right&&(p.right+=g),a){if(o.extend(u,p),"reposition"===s){var y=void 0;u.top>u.bottom&&(y=u.top,u.top=u.bottom,u.bottom=y),u.left>u.right&&(y=u.left,u.left=u.right,u.right=y)}}else u.top=Math.min(p.top,c.bottom),u.bottom=Math.max(p.bottom,c.top),u.left=Math.min(p.left,c.right),u.right=Math.max(p.right,c.left);u.width=u.right-u.left,u.height=u.bottom-u.top;for(var x in u)d[x]=u[x]-f[x];t.edges=r.prepared.edges,t.rect=u,t.deltaRect=d}}),l.prototype.resizable=function(e){return o.is.object(e)?(this.options.resize.enabled=!1!==e.enabled,this.setPerAction("resize",e),this.setOnEvents("resize",e),/^x$|^y$|^xy$/.test(e.axis)?this.options.resize.axis=e.axis:null===e.axis&&(this.options.resize.axis=p.resize.axis),o.is.bool(e.preserveAspectRatio)?this.options.resize.preserveAspectRatio=e.preserveAspectRatio:o.is.bool(e.square)&&(this.options.resize.square=e.square),this):o.is.bool(e)?(this.options.resize.enabled=e,e||(this.onresizestart=this.onresizestart=this.onresizeend=null),this):this.options.resize},c.signals.on("new",function(e){ -e.resizeAxes="xy"}),a.signals.on("set-delta",function(e){var t=e.interaction,n=e.iEvent;"resize"===e.action&&t.resizeAxes&&(t.target.options.resize.square?("y"===t.resizeAxes?n.dx=n.dy:n.dy=n.dx,n.axes="xy"):(n.axes=t.resizeAxes,"x"===t.resizeAxes?n.dy=0:"y"===t.resizeAxes&&(n.dx=0)))}),i.resize=d,i.names.push("resize"),o.merge(l.eventTypes,["resizestart","resizemove","resizeinertiastart","resizeinertiaresume","resizeend"]),i.methodDict.resize="resizable",p.resize=d.defaults,t.exports=d},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"../utils/browser":37,"./base":6}],11:[function(e,t,n){"use strict";var r=e("./utils/raf"),i=e("./utils/window").getWindow,o=e("./utils/is"),s=e("./utils/domUtils"),a=e("./Interaction"),l=e("./defaultOptions"),c={defaults:{enabled:!1,container:null,margin:60,speed:300},interaction:null,i:null,x:0,y:0,isScrolling:!1,prevTime:0,start:function(e){c.isScrolling=!0,r.cancel(c.i),c.interaction=e,c.prevTime=(new Date).getTime(),c.i=r.request(c.scroll)},stop:function(){c.isScrolling=!1,r.cancel(c.i)},scroll:function(){var e=c.interaction.target.options[c.interaction.prepared.name].autoScroll,t=e.container||i(c.interaction.element),n=(new Date).getTime(),s=(n-c.prevTime)/1e3,a=e.speed*s;a>=1&&(o.window(t)?t.scrollBy(c.x*a,c.y*a):t&&(t.scrollLeft+=c.x*a,t.scrollTop+=c.y*a),c.prevTime=n),c.isScrolling&&(r.cancel(c.i),c.i=r.request(c.scroll))},check:function(e,t){var n=e.options;return n[t].autoScroll&&n[t].autoScroll.enabled},onInteractionMove:function(e){var t=e.interaction,n=e.pointer;if(t.interacting()&&c.check(t.target,t.prepared.name)){if(t.simulation)return void(c.x=c.y=0);var r=void 0,a=void 0,l=void 0,p=void 0,u=t.target.options[t.prepared.name].autoScroll,d=u.container||i(t.element);if(o.window(d))p=n.clientXd.innerWidth-c.margin,l=n.clientY>d.innerHeight-c.margin;else{var f=s.getElementClientRect(d);p=n.clientXf.right-c.margin,l=n.clientY>f.bottom-c.margin}c.x=a?1:p?-1:0,c.y=l?1:r?-1:0,c.isScrolling||(c.margin=u.margin,c.speed=u.speed,c.start(t))}}};a.signals.on("stop-active",function(){c.stop()}),a.signals.on("action-move",c.onInteractionMove),l.perAction.autoScroll=c.defaults,t.exports=c},{"./Interaction":5,"./defaultOptions":18,"./utils/domUtils":39,"./utils/is":46,"./utils/raf":50,"./utils/window":52}],12:[function(e,t,n){"use strict";var r=e("../Interactable"),i=e("../actions/base"),o=e("../utils/is"),s=e("../utils/domUtils");r.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},r.prototype.ignoreFrom=function(e){return this._backCompatOption("ignoreFrom",e)},r.prototype.allowFrom=function(e){return this._backCompatOption("allowFrom",e)},r.prototype.testIgnore=function(e,t,n){return!(!e||!o.element(n))&&(o.string(e)?s.matchesUpTo(n,e,t):!!o.element(e)&&s.nodeContains(e,n))},r.prototype.testAllow=function(e,t,n){return!e||!!o.element(n)&&(o.string(e)?s.matchesUpTo(n,e,t):!!o.element(e)&&s.nodeContains(e,n))},r.prototype.testIgnoreAllow=function(e,t,n){return!this.testIgnore(e.ignoreFrom,t,n)&&this.testAllow(e.allowFrom,t,n)},r.prototype.actionChecker=function(e){return o.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},r.prototype.styleCursor=function(e){return o.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},r.prototype.defaultActionChecker=function(e,t,n,r){for(var o=this.getRect(r),s=null,a=i.names,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var u=p;if((!n.pointerIsDown||!n.mouse||0!=(t.buttons&this.options[u].mouseButtons))&&(s=i[u].checker(e,t,this,r,n,o)))return s}}},{"../Interactable":4,"../actions/base":6,"../utils/domUtils":39,"../utils/is":46}],13:[function(e,t,n){"use strict";function r(e,t,n,r){return g.is.object(e)&&t.testIgnoreAllow(t.options[e.name],n,r)&&t.options[e.name].enabled&&a(t,n,e)?e:null}function i(e,t,n,i,o,s){for(var a=0,l=i.length;a=m.maxInteractions)return!1;if(u.target===e){if((a+=d===n.name|0)>=i)return!1;if(u.element===t&&(l++,d!==n.name||l>=o))return!1}}}return m.maxInteractions>0}}var l=e("../interact"),c=e("../Interactable"),p=e("../Interaction"),u=e("../actions/base"),d=e("../defaultOptions"),f=e("../utils/browser"),v=e("../scope"),g=e("../utils"),h=e("../utils/Signals").new();e("./InteractableMethods");var m={signals:h,withinInteractionLimit:a,maxInteractions:1/0,defaults:{perAction:{manualStart:!1,max:1/0,maxPerElement:1,allowFrom:null,ignoreFrom:null}},setActionDefaults:function(e){g.extend(e.defaults,m.defaults.perAction)}};p.signals.on("down",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;if(!t.interacting()){s(t,o(t,n,r,i))}}),p.signals.on("move",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;if(t.mouse&&!t.pointerIsDown&&!t.interacting()){s(t,o(t,n,r,i))}}),p.signals.on("move",function(e){var t=e.interaction,n=e.event;if(t.pointerIsDown&&!t.interacting()&&t.pointerWasMoved&&t.prepared.name){h.fire("before-start",e);var r=t.target;t.prepared.name&&r&&(r.options[t.prepared.name].manualStart||!a(r,t.element,t.prepared)?t.stop(n):t.start(t.prepared,r,t.element))}}),p.signals.on("stop",function(e){var t=e.interaction,n=t.target;n&&n.options.styleCursor&&(n._doc.documentElement.style.cursor="")}),c.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},c.prototype.actionChecker=function(e){return g.is.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},c.prototype.styleCursor=function(e){return g.is.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},c.prototype.defaultActionChecker=function(e,t,n,r){for(var i=this.getRect(r),o=t.buttons||{0:1,1:4,3:8,4:16}[t.button],s=null,a=u.names,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var d=p;if((!n.pointerIsDown||!n.mouse||0!=(o&this.options[d].mouseButtons))&&(s=u[d].checker(e,t,this,r,n,i)))return s}},l.maxInteractions=function(e){return g.is.number(e)?(m.maxInteractions=e,this):m.maxInteractions},c.settingsMethods.push("styleCursor"),c.settingsMethods.push("actionChecker"),c.settingsMethods.push("ignoreFrom"),c.settingsMethods.push("allowFrom"),d.base.actionChecker=null,d.base.styleCursor=!0,g.extend(d.perAction,m.defaults.perAction),t.exports=m},{"../Interactable":4,"../Interaction":5,"../actions/base":6,"../defaultOptions":18,"../interact":21,"../scope":34,"../utils":44,"../utils/Signals":35,"../utils/browser":37,"./InteractableMethods":12}],14:[function(e,t,n){"use strict";var r=e("./base"),i=e("../Interaction");i.signals.on("new",function(e){e.delayTimer=null}),r.signals.on("prepared",function(e){var t=e.interaction,n=t.prepared.name;if(n){var r=t.target.options[n].delay;r>0&&(t.delayTimer=setTimeout(function(){t.start(t.prepared,t.target,t.element)},r))}}),i.signals.on("move",function(e){var t=e.interaction,n=e.duplicate;t.pointerWasMoved&&!n&&clearTimeout(t.delayTimer)}),r.signals.on("before-start",function(e){var t=e.interaction,n=t.prepared.name;if(n){t.target.options[n].delay>0&&(t.prepared.name=null)}})},{"../Interaction":5,"./base":13}],15:[function(e,t,n){"use strict";function r(e,t){if(!t)return!1;var n=t.options.drag.startAxis;return"xy"===e||"xy"===n||n===e}var i=e("./base"),o=e("../scope"),s=e("../utils/browser"),a=e("../utils/is"),l=e("../utils/domUtils"),c=l.matchesSelector,p=l.parentNode;i.setActionDefaults(e("../actions/drag")),i.signals.on("before-start",function(e){var t=e.interaction,n=e.eventTarget,l=e.dx,u=e.dy;if("drag"===t.prepared.name){var d=Math.abs(l),f=Math.abs(u),v=t.target.options.drag,g=v.startAxis,h=d>f?"x":dl.minSpeed&&g>l.endSpeed,b={interaction:t,pageCoords:v,statuses:f,preEnd:!0,requireEndOnly:!0};y&&!x&&(c.resetStatuses(f),m=c.setAll(b),m.shouldMove&&m.locked&&(h=!0)),(x||h)&&(p.copyCoords(i.upCoords,t.curCoords),t.pointers[0]=i.startEvent=new a(t,n,t.prepared.name,"inertiastart",t.element),i.t0=d,i.active=!0,i.allowResume=l.allowResume,t.simulation=i,o.fire(i.startEvent),x?(i.vx0=t.pointerDelta.client.vx,i.vy0=t.pointerDelta.client.vy,i.v0=g,r(t,i),p.extend(v,t.curCoords.page),v.x+=i.xe,v.y+=i.ye,c.resetStatuses(f),m=c.setAll(b),i.modifiedXe+=m.dx,i.modifiedYe+=m.dy,i.i=u.request(t.boundInertiaFrame)):(i.smoothEnd=!0,i.xe=m.dx,i.ye=m.dy,i.sx=i.sy=0,i.i=u.request(t.boundSmoothEndFrame)))}}),l.signals.on("stop-active",function(e){var t=e.interaction,n=t.inertiaStatus;n.active&&(u.cancel(n.i),n.active=!1,t.simulation=null)})},{"./InteractEvent":3,"./Interaction":5,"./modifiers":24,"./utils":44,"./utils/raf":50}],21:[function(e,t,n){"use strict";function r(e,t){var n=a.interactables.get(e,t);return n||(n=new l(e,t),n.events.global=p),n}var i=e("./utils/browser"),o=e("./utils/events"),s=e("./utils"),a=e("./scope"),l=e("./Interactable"),c=e("./Interaction"),p={};r.isSet=function(e,t){return-1!==a.interactables.indexOfElement(e,t&&t.context)},r.on=function(e,t,n){if(s.is.string(e)&&-1!==e.search(" ")&&(e=e.trim().split(/ +/)),s.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.on(f,t,n)}return r}if(s.is.object(e)){for(var v in e)r.on(v,e[v],t);return r}return s.contains(l.eventTypes,e)?p[e]?p[e].push(t):p[e]=[t]:o.add(a.document,e,t,{options:n}),r},r.off=function(e,t,n){if(s.is.string(e)&&-1!==e.search(" ")&&(e=e.trim().split(/ +/)),s.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.off(f,t,n)}return r}if(s.is.object(e)){for(var v in e)r.off(v,e[v],t);return r}if(s.contains(l.eventTypes,e)){var g=void 0;e in p&&-1!==(g=s.indexOf(p[e],t))&&p[e].splice(g,1)}else o.remove(a.document,e,t,n);return r},r.debug=function(){return a},r.getPointerAverage=s.pointerAverage,r.getTouchBBox=s.touchBBox,r.getTouchDistance=s.touchDistance,r.getTouchAngle=s.touchAngle,r.getElementRect=s.getElementRect,r.getElementClientRect=s.getElementClientRect,r.matchesSelector=s.matchesSelector,r.closest=s.closest,r.supportsTouch=function(){return i.supportsTouch},r.supportsPointerEvent=function(){return i.supportsPointerEvent},r.stop=function(e){for(var t=a.interactions.length-1;t>=0;t--)a.interactions[t].stop(e);return r},r.pointerMoveTolerance=function(e){return s.is.number(e)?(c.pointerMoveTolerance=e,this):c.pointerMoveTolerance},r.addDocument=a.addDocument,r.removeDocument=a.removeDocument,a.interact=r,t.exports=r},{"./Interactable":4,"./Interaction":5,"./scope":34,"./utils":44,"./utils/browser":37,"./utils/events":40}],22:[function(e,t,n){"use strict";function r(e){var t=e.interaction,n=e.event;t.target&&t.target.checkAndPreventDefault(n)}var i=e("./Interactable"),o=e("./Interaction"),s=e("./scope"),a=e("./utils/is"),l=e("./utils/events"),c=e("./utils/domUtils"),p=c.nodeContains,u=c.matchesSelector;i.prototype.preventDefault=function(e){return/^(always|never|auto)$/.test(e)?(this.options.preventDefault=e,this):a.bool(e)?(this.options.preventDefault=e?"always":"never",this):this.options.preventDefault},i.prototype.checkAndPreventDefault=function(e){var t=this.options.preventDefault;if("never"!==t)return"always"===t?void e.preventDefault():void(l.supportsOptions||/^(mouse|pointer|touch)*(down|start)/i.test(e.type)||a.element(e.target)&&u(e.target,"input,select,textarea,[contenteditable=true],[contenteditable=true] *")||e.preventDefault())};for(var d=["down","move","up","cancel"],f=0;f=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i;if(o.element&&(o.element===e.target||p(o.element,e.target)))return void o.target.checkAndPreventDefault(e)}}},{"./Interactable":4,"./Interaction":5,"./scope":34,"./utils/domUtils":39,"./utils/events":40,"./utils/is":46}],23:[function(e,t,n){"use strict";function r(e){var t=e.target,n=a.search(e,e.type,t);n&&n.prevTap&&e.clientX===n.prevTap.clientX&&e.clientY===n.prevTap.clientY&&t===n.prevTap.target&&(n.downTargets[0]=t,n.downTimes[0]=(new Date).getTime(),l.fire({interaction:n,event:e,eventTarget:t,pointer:e,type:"tap"}))}var i=e("./scope"),o=e("./utils/events"),s=e("./utils/browser"),a=e("./utils/interactionFinder"),l=e("./pointerEvents/base"),c=e("./utils/window"),p=c.window,u=Object.prototype.toString;if(p.Array.isArray||(p.Array.isArray=function(e){return"[object Array]"===u.call(e)}),String.prototype.trim||(String.prototype.trim=function(){return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")}),s.isIE8){var d=function(e){for(var t=i.interactions,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var o;if(n){if(r>=t.length)break;o=t[r++]}else{if(r=t.next(),r.done)break;o=r.value}var s=o;s.interacting()&&s.target.checkAndPreventDefault(e)}},f=function(e,t){var n=e.doc,i=(e.win,0===t.indexOf("listen")?o.add:o.remove);i(n,"selectstart",d),l&&i(n,"dblclick",r)};i.signals.on("add-document",f),i.signals.on("remove-document",f)}t.exports=null},{"./pointerEvents/base":31,"./scope":34,"./utils/browser":37,"./utils/events":40,"./utils/interactionFinder":45,"./utils/window":52}],24:[function(e,t,n){"use strict";function r(e,t,n){return e&&e.enabled&&(t||!e.endOnly)&&(!n||e.endOnly)}var i=e("../InteractEvent"),o=e("../Interaction"),s=e("../utils/extend"),a={names:[],setOffsets:function(e){var t=e.interaction,n=e.pageCoords,r=t.target,i=t.element,o=t.startOffset,s=r.getRect(i);s?(o.left=n.x-s.left,o.top=n.y-s.top,o.right=s.right-n.x,o.bottom=s.bottom-n.y,"width"in s||(s.width=s.right-s.left),"height"in s||(s.height=s.bottom-s.top)):o.left=o.top=o.right=o.bottom=0,e.rect=s,e.interactable=r,e.element=i;for(var l=0;l=p.length)break;f=p[d++]}else{if(d=p.next(),d.done)break;f=d.value}var v=f,g=a[v],h=t.target.options[t.prepared.name][v];r(h,i,o)&&(e.status=e.status=n[v],e.options=h,e.offset=e.interaction.modifierOffsets[v],g.set(e),e.status.locked&&(l.x+=e.status.dx,l.y+=e.status.dy,c.dx+=e.status.dx,c.dy+=e.status.dy,c.locked=!0))}return c.shouldMove=!e.status||!c.locked||e.status.changed,c},resetStatuses:function(e){for(var t=a.names,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var i;if(n){if(r>=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i,s=e[o]||{};s.dx=s.dy=0,s.modifiedX=s.modifiedY=NaN,s.locked=!1,s.changed=!0,e[o]=s}return e},start:function(e,t){var n=e.interaction,r={interaction:n,pageCoords:("action-resume"===t?n.curCoords:n.startCoords).page,startOffset:n.startOffset,statuses:n.modifierStatuses,preEnd:!1,requireEndOnly:!1};a.setOffsets(r),a.resetStatuses(r.statuses),r.pageCoords=s({},n.startCoords.page),n.modifierResult=a.setAll(r)}};o.signals.on("new",function(e){e.startOffset={left:0,right:0,top:0,bottom:0},e.modifierOffsets={},e.modifierStatuses=a.resetStatuses({}),e.modifierResult=null}),o.signals.on("action-start",a.start),o.signals.on("action-resume",a.start),o.signals.on("before-action-move",function(e){var t=e.interaction,n=e.preEnd,r=e.interactingBeforeMove,i=a.setAll({interaction:t,preEnd:n,pageCoords:t.curCoords.page,statuses:t.modifierStatuses,requireEndOnly:!1});!i.shouldMove&&r&&(t._dontFireMove=!0),t.modifierResult=i}),o.signals.on("action-end",function(e){for(var t=e.interaction,n=e.event,i=0;i=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}var m=h,y=m.x,x=m.y;l.push({x:s.left-i.width*y+u.x,y:s.top-i.height*x+u.y})}else l.push(u);return l},set:function(e){var t=e.interaction,n=e.pageCoords,r=e.status,i=e.options,s=e.offset,a=[],l=void 0,c=void 0,p=void 0;if(r.useStatusXY)c={x:r.x,y:r.y};else{var u=o.getOriginXY(t.target,t.element,t.prepared.name);c=o.extend({},n),c.x-=u.x,c.y-=u.y}r.realX=c.x,r.realY=c.y;for(var d=i.targets?i.targets.length:0,f=s,v=Array.isArray(f),g=0,f=v?f:f[Symbol.iterator]();;){var h;if(v){if(g>=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}for(var m=h,y=m.x,x=m.y,b=c.x-y,w=c.y-x,E=i.targets,S=Array.isArray(E),T=0,E=S?E:E[Symbol.iterator]();;){var C;if(S){if(T>=E.length)break;C=E[T++]}else{if(T=E.next(),T.done)break;C=T.value}var A=C;l=o.is.function(A)?A(b,w,t):A,l&&a.push({x:o.is.number(l.x)?l.x+y:b,y:o.is.number(l.y)?l.y+x:w,range:o.is.number(l.range)?l.range:i.range})}}var D={target:null,inRange:!1,distance:0,range:0,dx:0,dy:0};for(p=0,d=a.length;p=p.length)break;f=p[d++]}else{if(d=p.next(),d.done)break;f=d.value}var v=f,g=void 0;g=a.is.function(v)?v(l,c,t):v,g&&("width"in g&&"height"in g&&(g.x=g.width,g.y=g.height),e.options.targets.push(g))}i.set(e)},modifyCoords:function(e){var t=e.options;e.options=a.extend({},t), -e.options.enabled=t.enabled,e.options.relativePoints=[null],i.modifyCoords(e)}};r.snapSize=l,r.names.push("snapSize"),o.perAction.snapSize=l.defaults,s.defaults.snapSize=l.defaults,t.exports=l},{"../actions/resize":10,"../defaultOptions":18,"../utils/":44,"./index":24,"./snap":28}],30:[function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=e("../utils/pointerUtils");t.exports=function(){function e(t,n,o,s,a){if(r(this,e),i.pointerExtend(this,o),o!==n&&i.pointerExtend(this,n),this.interaction=a,this.timeStamp=(new Date).getTime(),this.originalEvent=o,this.type=t,this.pointerId=i.getPointerId(n),this.pointerType=i.getPointerType(n,a),this.target=s,this.currentTarget=null,"tap"===t){var l=a.getPointerIndex(n);this.dt=this.timeStamp-a.downTimes[l];var c=this.timeStamp-a.tapTime;this.double=!!(a.prevTap&&"doubletap"!==a.prevTap.type&&a.prevTap.target===this.target&&c<500)}else"doubletap"===t&&(this.dt=n.timeStamp-a.tapTime)}return e.prototype.subtractOrigin=function(e){var t=e.x,n=e.y;return this.pageX-=t,this.pageY-=n,this.clientX-=t,this.clientY-=n,this},e.prototype.addOrigin=function(e){var t=e.x,n=e.y;return this.pageX+=t,this.pageY+=n,this.clientX+=t,this.clientY+=n,this},e.prototype.preventDefault=function(){this.originalEvent.preventDefault()},e.prototype.stopPropagation=function(){this.propagationStopped=!0},e.prototype.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},e}()},{"../utils/pointerUtils":49}],31:[function(e,t,n){"use strict";function r(e){for(var t=e.interaction,n=e.pointer,s=e.event,l=e.eventTarget,c=e.type,u=void 0===c?e.pointerEvent.type:c,d=e.targets,f=void 0===d?i(e):d,v=e.pointerEvent,g=void 0===v?new o(u,n,s,l,t):v,h={interaction:t,pointer:n,event:s,eventTarget:l,targets:f,type:u,pointerEvent:g},m=0;m=u.length)break;g=u[v++]}else{if(v=u.next(),v.done)break;g=v.value}var h=g;c.element=h,p.fire("collect-targets",c)}return"hold"===o&&(c.targets=d(c.targets,function(e){return e.eventable.options.holdDuration===t.holdTimers[s].duration})),c.targets}var o=e("./PointerEvent"),s=e("../Interaction"),a=e("../utils"),l=e("../utils/browser"),c=e("../defaultOptions"),p=e("../utils/Signals").new(),u=e("../utils/arr"),d=u.filter,f=["down","up","cancel"],v=["down","up","cancel"],g={PointerEvent:o,fire:r,collectEventTargets:i,signals:p,defaults:{holdDuration:600,ignoreFrom:null,allowFrom:null,origin:{x:0,y:0}},types:["down","move","up","cancel","tap","doubletap","hold"]};s.signals.on("update-pointer-down",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers[n]={duration:1/0,timeout:null}}),s.signals.on("remove-pointer",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers.splice(n,1)}),s.signals.on("move",function(e){var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,s=e.duplicateMove,a=t.getPointerIndex(n);s||t.pointerIsDown&&!t.pointerWasMoved||(t.pointerIsDown&&clearTimeout(t.holdTimers[a].timeout),r({interaction:t,pointer:n,event:i,eventTarget:o,type:"move"}))}),s.signals.on("down",function(e){for(var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,s=e.pointerIndex,c=l.isIE8?a.extend({},i):i,u=t.holdTimers[s],d=a.getPath(o),f={interaction:t,pointer:n,event:i,eventTarget:o,type:"hold",targets:[],path:d,element:null},v=d,g=Array.isArray(v),h=0,v=g?v:v[Symbol.iterator]();;){var m;if(g){if(h>=v.length)break;m=v[h++]}else{if(h=v.next(),h.done)break;m=h.value}var y=m;f.element=y,p.fire("collect-targets",f)}if(f.targets.length){for(var x=1/0,b=0;b=0&&(p.selectors[u]!==e||p.contexts[u]!==t);u--);-1===u&&(u=p.selectors.length,p.selectors.push(e),p.contexts.push(t),p.listeners.push([])),p.listeners[u].push([i,!!s.capture,s.passive])}function s(e,t,n,r,o){var s=f(o),c=O[n],p=!1,u=void 0;if(c)for(u=c.selectors.length-1;u>=0;u--)if(c.selectors[u]===e&&c.contexts[u]===t){for(var d=c.listeners[u],v=d.length-1;v>=0;v--){var g=d[v],h=g[0],m=g[1],y=g[2];if(h===r&&m===!!s.capture&&y===s.passive){d.splice(v,1),d.length||(c.selectors.splice(u,1),c.contexts.splice(u,1),c.listeners.splice(u,1),i(t,n,a),i(t,n,l,!0),c.selectors.length||(O[n]=null)),p=!0;break}}if(p)break}}function a(e,t){var n=f(t),r={},i=O[e.type],o=g.getActualElement(e.path?e.path[0]:e.target),s=o;for(h(r,e),r.originalEvent=e,r.preventDefault=p;v.element(s);){for(var a=0;a=l.length)break;u=l[p++]}else{if(p=l.next(),p.done)break;u=p.value}var d=u,f=s[d](a);if(f)return f}},simulationResume:function(e){var t=e.mouseEvent,n=e.eventType,o=e.eventTarget;if(!/down|start/i.test(n))return null;for(var s=r.interactions,a=Array.isArray(s),l=0,s=a?s:s[Symbol.iterator]();;){var c;if(a){if(l>=s.length)break;c=s[l++]}else{if(l=s.next(),l.done)break;c=l.value}var p=c,u=o;if(p.simulation&&p.simulation.allowResume&&p.mouse===t)for(;u;){if(u===p.element)return p;u=i.parentNode(u)}}return null},mouse:function(e){var t=e.pointerId,n=e.mouseEvent,s=e.eventType;if(!n&&(o.supportsTouch||o.supportsPointerEvent))return null;for(var a=void 0,l=r.interactions,c=Array.isArray(l),p=0,l=c?l:l[Symbol.iterator]();;){var u;if(c){if(p>=l.length)break;u=l[p++]}else{if(p=l.next(),p.done)break;u=p.value}var d=u;if(d.mouse){if(d.simulation&&!i.contains(d.pointerIds,t))continue;if(d.interacting())return d;a||(a=d)}}if(a)return a;for(var f=r.interactions,v=Array.isArray(f),g=0,f=v?f:f[Symbol.iterator]();;){var h;if(v){if(g>=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}var m=h;if(m.mouse&&(!/down/.test(s)||!m.simulation))return m}return null},hasPointer:function(e){for(var t=e.pointerId,n=r.interactions,o=Array.isArray(n),s=0,n=o?n:n[Symbol.iterator]();;){var a;if(o){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var l=a;if(i.contains(l.pointerIds,t))return l}},idle:function(e){for(var t=e.mouseEvent,n=r.interactions,i=Array.isArray(n),o=0,n=i?n:n[Symbol.iterator]();;){var s;if(i){if(o>=n.length)break;s=n[o++]}else{if(o=n.next(),o.done)break;s=o.value}var a=s;if(1===a.pointerIds.length){var l=a.target;if(l&&!l.options.gesture.enabled)continue}else if(a.pointerIds.length>=2)continue;if(!a.interacting()&&t===a.mouse)return a}return null}};t.exports=s},{"../scope":34,"./browser":37,"./index":44}],46:[function(e,t,n){"use strict";var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},i=e("./window"),o=e("./isWindow"),s={array:function(){},window:function(e){return e===i.window||o(e)},docFrag:function(e){return s.object(e)&&11===e.nodeType},object:function(e){return!!e&&"object"===(void 0===e?"undefined":r(e))},function:function(e){return"function"==typeof e},number:function(e){return"number"==typeof e},bool:function(e){return"boolean"==typeof e},string:function(e){return"string"==typeof e},element:function(e){if(!e||"object"!==(void 0===e?"undefined":r(e)))return!1;var t=i.getWindow(e)||i.window;return/object|function/.test(r(t.Element))?e instanceof t.Element:1===e.nodeType&&"string"==typeof e.nodeName}};s.array=function(e){return s.object(e)&&void 0!==e.length&&s.function(e.splice)},t.exports=s},{"./isWindow":47,"./window":52}],47:[function(e,t,n){"use strict";t.exports=function(e){return!(!e||!e.Window)&&e instanceof e.Window}},{}],48:[function(e,t,n){"use strict";function r(e,n){for(var r in n){var i=t.exports.prefixedPropREs,o=!1;for(var s in i)if(0===r.indexOf(s)&&i[s].test(r)){o=!0;break}o||"function"==typeof n[r]||(e[r]=n[r])}return e}r.prefixedPropREs={webkit:/(Movement[XY]|Radius[XY]|RotationAngle|Force)$/},t.exports=r},{}],49:[function(e,t,n){"use strict";var r=e("./hypot"),i=e("./browser"),o=e("./domObjects"),s=e("./domUtils"),a=e("./is"),l=e("./pointerExtend"),c={copyCoords:function(e,t){e.page=e.page||{},e.page.x=t.page.x,e.page.y=t.page.y,e.client=e.client||{},e.client.x=t.client.x,e.client.y=t.client.y,e.timeStamp=t.timeStamp},setCoordDeltas:function(e,t,n){e.page.x=n.page.x-t.page.x,e.page.y=n.page.y-t.page.y,e.client.x=n.client.x-t.client.x,e.client.y=n.client.y-t.client.y,e.timeStamp=n.timeStamp-t.timeStamp;var i=Math.max(e.timeStamp/1e3,.001);e.page.speed=r(e.page.x,e.page.y)/i,e.page.vx=e.page.x/i,e.page.vy=e.page.y/i,e.client.speed=r(e.client.x,e.page.y)/i,e.client.vx=e.client.x/i,e.client.vy=e.client.y/i},isNativePointer:function(e){return e instanceof o.Event||e instanceof o.Touch},getXY:function(e,t,n){return n=n||{},e=e||"page",n.x=t[e+"X"],n.y=t[e+"Y"],n},getPageXY:function(e,t){return t=t||{},i.isOperaMobile&&c.isNativePointer(e)?(c.getXY("screen",e,t),t.x+=window.scrollX,t.y+=window.scrollY):c.getXY("page",e,t),t},getClientXY:function(e,t){return t=t||{},i.isOperaMobile&&c.isNativePointer(e)?c.getXY("screen",e,t):c.getXY("client",e,t),t},getPointerId:function(e){return a.number(e.pointerId)?e.pointerId:e.identifier},setCoords:function(e,t,n){var r=t.length>1?c.pointerAverage(t):t[0],i={};c.getPageXY(r,i),e.page.x=i.x,e.page.y=i.y,c.getClientXY(r,i),e.client.x=i.x,e.client.y=i.y,e.timeStamp=a.number(n)?n:(new Date).getTime()},pointerExtend:l,getTouchPair:function(e){var t=[];return a.array(e)?(t[0]=e[0],t[1]=e[1]):"touchend"===e.type?1===e.touches.length?(t[0]=e.touches[0],t[1]=e.changedTouches[0]):0===e.touches.length&&(t[0]=e.changedTouches[0],t[1]=e.changedTouches[1]):(t[0]=e.touches[0],t[1]=e.touches[1]),t},pointerAverage:function(e){for(var t={pageX:0,pageY:0,clientX:0,clientY:0,screenX:0,screenY:0},n=e,r=Array.isArray(n),i=0,n=r?n:n[Symbol.iterator]();;){var o;if(r){if(i>=n.length)break;o=n[i++]}else{if(i=n.next(),i.done)break;o=i.value}var s=o;for(var a in t)t[a]+=s[a]}for(var l in t)t[l]/=e.length;return t},touchBBox:function(e){if(e.length||e.touches&&e.touches.length>1){var t=c.getTouchPair(e),n=Math.min(t[0].pageX,t[1].pageX),r=Math.min(t[0].pageY,t[1].pageY);return{x:n,y:r,left:n,top:r,width:Math.max(t[0].pageX,t[1].pageX)-n,height:Math.max(t[0].pageY,t[1].pageY)-r}}},touchDistance:function(e,t){var n=t+"X",i=t+"Y",o=c.getTouchPair(e),s=o[0][n]-o[1][n],a=o[0][i]-o[1][i];return r(s,a)},touchAngle:function(e,t,n){var r=n+"X",i=n+"Y",o=c.getTouchPair(e),s=o[1][r]-o[0][r],a=o[1][i]-o[0][i];return 180*Math.atan2(a,s)/Math.PI},getPointerType:function(e,t){return t.mouse?"mouse":i.supportsPointerEvent?a.string(e.pointerType)?e.pointerType:[void 0,void 0,"touch","pen","mouse"][e.pointerType]:"touch"},getEventTargets:function(e){return[s.getActualElement(e.path?e.path[0]:e.target),s.getActualElement(e.currentTarget)]}};t.exports=c},{"./browser":37,"./domObjects":38,"./domUtils":39,"./hypot":43,"./is":46,"./pointerExtend":48}],50:[function(e,t,n){"use strict";for(var r=e("./window"),i=r.window,o=["ms","moz","webkit","o"],s=0,a=void 0,l=void 0,c=0;c6&&void 0!==arguments[6]&&arguments[6];r(this,e);var f=t.target,v=(f&&f.options||s).deltaSource,g=o(f,p,l),h="start"===c,m="end"===c,y=h?t.startCoords:t.curCoords,x=t.prevEvent;p=p||t.element;var b=i({},y.page),w=i({},y.client);b.x-=g.x,b.y-=g.y,w.x-=g.x,w.y-=g.y,this.ctrlKey=n.ctrlKey,this.altKey=n.altKey,this.shiftKey=n.shiftKey,this.metaKey=n.metaKey,this.button=n.button,this.buttons=n.buttons,this.target=p,this.currentTarget=p,this.relatedTarget=u||null,this.preEnd=d,this.type=l+(c||""),this.interaction=t,this.interactable=f,this.t0=h?t.downTimes[t.downTimes.length-1]:x.t0;var E={interaction:t,event:n,action:l,phase:c,element:p,related:u,page:b,client:w,coords:y,starting:h,ending:m,deltaSource:v,iEvent:this};a.fire("set-xy",E),m?(this.pageX=x.pageX,this.pageY=x.pageY,this.clientX=x.clientX,this.clientY=x.clientY):(this.pageX=b.x,this.pageY=b.y,this.clientX=w.x,this.clientY=w.y),this.x0=t.startCoords.page.x-g.x,this.y0=t.startCoords.page.y-g.y,this.clientX0=t.startCoords.client.x-g.x,this.clientY0=t.startCoords.client.y-g.y,a.fire("set-delta",E),this.timeStamp=y.timeStamp,this.dt=t.pointerDelta.timeStamp,this.duration=this.timeStamp-this.t0,this.speed=t.pointerDelta[v].speed,this.velocityX=t.pointerDelta[v].vx,this.velocityY=t.pointerDelta[v].vy,this.swipe=m||"inertiastart"===c?this.getSwipe():null,a.fire("new",E)}return e.prototype.getSwipe=function(){var e=this.interaction;if(e.prevEvent.speed<600||this.timeStamp-e.prevEvent.timeStamp>150)return null;var t=180*Math.atan2(e.prevEvent.velocityY,e.prevEvent.velocityX)/Math.PI;t<0&&(t+=360);var n=112.5<=t&&t<247.5,r=202.5<=t&&t<337.5,i=!n&&(292.5<=t||t<67.5);return{up:r,down:!r&&22.5<=t&&t<157.5,left:n,right:i,angle:t,speed:e.prevEvent.speed,velocity:{x:e.prevEvent.velocityX,y:e.prevEvent.velocityY}}},e.prototype.preventDefault=function(){},e.prototype.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},e.prototype.stopPropagation=function(){this.propagationStopped=!0},e}();a.on("set-delta",function(e){var t=e.iEvent,n=e.interaction,r=e.starting,i=e.deltaSource,o=r?t:n.prevEvent;"client"===i?(t.dx=t.clientX-o.clientX,t.dy=t.clientY-o.clientY):(t.dx=t.pageX-o.pageX,t.dy=t.pageY-o.pageY)}),l.signals=a,t.exports=l},{"./defaultOptions":18,"./utils/Signals":35,"./utils/extend":41,"./utils/getOriginXY":42}],4:[function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=e("./utils/is"),o=e("./utils/events"),s=e("./utils/extend"),a=e("./actions/base"),l=e("./scope"),c=e("./Eventable"),p=e("./defaultOptions"),u=e("./utils/Signals").new(),d=e("./utils/domUtils"),f=d.getElementRect,v=d.nodeContains,g=d.trySelector,h=e("./utils/window"),m=h.getWindow,y=e("./utils/arr"),x=y.indexOf,b=y.contains,w=e("./utils/browser"),E=w.wheelEvent;l.interactables=[];var S=function(){function e(t,n){r(this,e),n=n||{},this.target=t,this.events=new c,this._context=n.context||l.document,this._win=m(g(t)?this._context:t),this._doc=this._win.document,u.fire("new",{target:t,options:n,interactable:this,win:this._win}),l.addDocument(this._doc,this._win),l.interactables.push(this),this.set(n)}return e.prototype.setOnEvents=function(e,t){var n="on"+e;return i.function(t.onstart)&&(this.events[n+"start"]=t.onstart),i.function(t.onmove)&&(this.events[n+"move"]=t.onmove),i.function(t.onend)&&(this.events[n+"end"]=t.onend),i.function(t.oninertiastart)&&(this.events[n+"inertiastart"]=t.oninertiastart),this},e.prototype.setPerAction=function(e,t){for(var n in t)n in p[e]&&(i.object(t[n])?(this.options[e][n]=s(this.options[e][n]||{},t[n]),i.object(p.perAction[n])&&"enabled"in p.perAction[n]&&(this.options[e][n].enabled=!1!==t[n].enabled)):i.bool(t[n])&&i.object(p.perAction[n])?this.options[e][n].enabled=t[n]:void 0!==t[n]&&(this.options[e][n]=t[n]))},e.prototype.getRect=function(e){return e=e||this.target,i.string(this.target)&&!i.element(e)&&(e=this._context.querySelector(this.target)),f(e)},e.prototype.rectChecker=function(e){return i.function(e)?(this.getRect=e,this):null===e?(delete this.options.getRect,this):this.getRect},e.prototype._backCompatOption=function(e,t){if(g(t)||i.object(t)){this.options[e]=t;for(var n=a.names,r=Array.isArray(n),o=0,n=r?n:n[Symbol.iterator]();;){var s;if(r){if(o>=n.length)break;s=n[o++]}else{if(o=n.next(),o.done)break;s=o.value}var l=s;this.options[l][e]=t}return this}return this.options[e]},e.prototype.origin=function(e){return this._backCompatOption("origin",e)},e.prototype.deltaSource=function(e){return"page"===e||"client"===e?(this.options.deltaSource=e,this):this.options.deltaSource},e.prototype.context=function(){return this._context},e.prototype.inContext=function(e){return this._context===e.ownerDocument||v(this._context,e)},e.prototype.fire=function(e){return this.events.fire(e),this},e.prototype._onOffMultiple=function(e,t,n,r){if(i.string(t)&&-1!==t.search(" ")&&(t=t.trim().split(/ +/)),i.array(t)){for(var o=0;o=l.length)break;f=l[d++]}else{if(d=l.next(),d.done)break;f=d.value}var v=f;this.options[v]=p.base[v],v in t&&this[v](t[v])}return u.fire("set",{options:t,interactable:this}),this},e.prototype.unset=function(){if(o.remove(this.target,"all"),i.string(this.target))for(var e in o.delegatedEvents){var t=o.delegatedEvents[e];t.selectors[0]===this.target&&t.contexts[0]===this._context&&(t.selectors.splice(0,1),t.contexts.splice(0,1),t.listeners.splice(0,1),t.selectors.length||(t[e]=null)),o.remove(this._context,e,o.delegateListener),o.remove(this._context,e,o.delegateUseCapture,!0)}else o.remove(this,"all");u.fire("unset",{interactable:this}),l.interactables.splice(x(l.interactables,this),1);for(var n=l.interactions||[],r=Array.isArray(n),s=0,n=r?n:n[Symbol.iterator]();;){var a;if(r){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var c=a;c.target===this&&c.interacting()&&c.stop()}return l.interact},e}();l.interactables.indexOfElement=function(e,t){t=t||l.document;for(var n=0;n=x.length)break;E=x[w++]}else{if(w=x.next(),w.done)break;E=w.value}var S=E,T=S[0],C=S[1];C._updateEventTargets(i,o),C[e](T,t,i,o)}}}function o(e){for(var t=0;te.pointerMoveTolerance);var a={pointer:t,pointerIndex:this.getPointerIndex(t),event:n,eventTarget:r,dx:o,dy:s,duplicate:i,interaction:this,interactingBeforeMove:this.interacting()};i||l.setCoordDeltas(this.pointerDelta,this.prevCoords,this.curCoords),f.fire("move",a),i||(this.interacting()&&this.doMove(a),this.pointerWasMoved&&l.copyCoords(this.prevCoords,this.curCoords))},e.prototype.doMove=function(e){e=l.extend({pointer:this.pointers[0],event:this.prevEvent,eventTarget:this._eventTarget,interaction:this},e||{}),f.fire("before-action-move",e),this._dontFireMove||f.fire("action-move",e),this._dontFireMove=!1},e.prototype.pointerUp=function(e,t,n,r){var i=this.getPointerIndex(e);f.fire(/cancel$/i.test(t.type)?"cancel":"up",{pointer:e,pointerIndex:i,event:t,eventTarget:n,curEventTarget:r,interaction:this}),this.simulation||this.end(t),this.pointerIsDown=!1,this.removePointer(e,t)},e.prototype.end=function(e){e=e||this.prevEvent,this.interacting()&&f.fire("action-end",{event:e,interaction:this}),this.stop()},e.prototype.currentAction=function(){return this._interacting?this.prepared.name:null},e.prototype.interacting=function(){return this._interacting},e.prototype.stop=function(){f.fire("stop",{interaction:this}),this._interacting&&(f.fire("stop-active",{interaction:this}),f.fire("stop-"+this.prepared.name,{interaction:this})),this.target=this.element=null,this._interacting=!1,this.prepared.name=this.prevEvent=null},e.prototype.getPointerIndex=function(e){return"mouse"===this.pointerType||"pen"===this.pointerType?0:l.indexOf(this.pointerIds,l.getPointerId(e))},e.prototype.updatePointer=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:t&&/(down|start)$/i.test(t.type),r=l.getPointerId(e),i=this.getPointerIndex(e);return-1===i&&(i=this.pointerIds.length,this.pointerIds[i]=r),n&&f.fire("update-pointer-down",{pointer:e,event:t,down:n,pointerId:r,pointerIndex:i,interaction:this}),this.pointers[i]=e,i},e.prototype.removePointer=function(e,t){var n=this.getPointerIndex(e);-1!==n&&(f.fire("remove-pointer",{pointer:e,event:t,pointerIndex:n,interaction:this}),this.pointers.splice(n,1),this.pointerIds.splice(n,1),this.downTargets.splice(n,1),this.downTimes.splice(n,1))},e.prototype._updateEventTargets=function(e,t){this._eventTarget=e,this._curEventTarget=t},e}(),y=0,x=g.length;y=i.length)break;a=i[s++]}else{if(s=i.next(),s.done)break;a=s.value}var l=a;if(l.options.drop.enabled){var c=l.options.drop.accept;if(!(p.is.element(c)&&c!==t||p.is.string(c)&&!p.matchesSelector(t,c)))for(var d=p.is.string(l.target)?l._context.querySelectorAll(l.target):[l.target],f=0;fo.left&&c.xo.top&&c.y=o.left&&v<=o.right&&g>=o.top&&g<=o.bottom}if(f&&p.is.number(a)){s=Math.max(0,Math.min(o.right,f.right)-Math.max(o.left,f.left))*Math.max(0,Math.min(o.bottom,f.bottom)-Math.max(o.top,f.top))/(f.width*f.height)>=a}return this.options.drop.checker&&(s=this.options.drop.checker(e,t,s,this,i,n,r)),s},v.signals.on("unset",function(e){e.interactable.dropzone(!1)}),v.settingsMethods.push("dropChecker"),g.signals.on("new",function(e){e.dropTarget=null,e.dropElement=null,e.prevDropTarget=null,e.prevDropElement=null,e.dropEvents=null,e.activeDrops={dropzones:[],elements:[],rects:[]}}),g.signals.on("stop",function(e){var t=e.interaction;t.dropTarget=t.dropElement=t.prevDropTarget=t.prevDropElement=null}),d.dynamicDrop=function(e){return p.is.bool(e)?(y=e,d):y},p.merge(v.eventTypes,["dragenter","dragleave","dropactivate","dropdeactivate","dropmove","drop"]),c.methodDict.drop="dropzone",h.drop=m.defaults,t.exports=m},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../interact":21,"../scope":34,"../utils":44,"./base":6}],9:[function(e,t,n){"use strict";var r=e("./base"),i=e("../utils"),o=e("../InteractEvent"),s=e("../Interactable"),a=e("../Interaction"),l=e("../defaultOptions"),c={defaults:{enabled:!1,origin:null,restrict:null},checker:function(e,t,n,r,i){return i.pointerIds.length>=2?{name:"gesture"}:null},getCursor:function(){return""}};o.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;"gesturestart"===t.type&&(t.ds=0,n.gesture.startDistance=n.gesture.prevDistance=t.distance,n.gesture.startAngle=n.gesture.prevAngle=t.angle,n.gesture.scale=1)}),o.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;"gesturemove"===t.type&&(t.ds=t.scale-n.gesture.scale,n.target.fire(t),n.gesture.prevAngle=t.angle,n.gesture.prevDistance=t.distance,t.scale===1/0||null===t.scale||void 0===t.scale||isNaN(t.scale)||(n.gesture.scale=t.scale))}),s.prototype.gesturable=function(e){return i.is.object(e)?(this.options.gesture.enabled=!1!==e.enabled,this.setPerAction("gesture",e),this.setOnEvents("gesture",e),this):i.is.bool(e)?(this.options.gesture.enabled=e,e||(this.ongesturestart=this.ongesturestart=this.ongestureend=null),this):this.options.gesture},o.signals.on("set-delta",function(e){var t=e.interaction,n=e.iEvent,r=e.action,s=e.event,a=e.starting,l=e.ending,c=e.deltaSource;if("gesture"===r){var p=t.pointers;n.touches=[p[0],p[1]],a?(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=1,n.ds=0,n.angle=i.touchAngle(p,void 0,c),n.da=0):l||s instanceof o?(n.distance=t.prevEvent.distance,n.box=t.prevEvent.box,n.scale=t.prevEvent.scale,n.ds=n.scale-1,n.angle=t.prevEvent.angle,n.da=n.angle-t.gesture.startAngle):(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=n.distance/t.gesture.startDistance,n.angle=i.touchAngle(p,t.gesture.prevAngle,c),n.ds=n.scale-t.gesture.prevScale,n.da=n.angle-t.gesture.prevAngle)}}),a.signals.on("new",function(e){e.gesture={start:{x:0,y:0},startDistance:0,prevDistance:0,distance:0,scale:1,startAngle:0,prevAngle:0}}),r.gesture=c,r.names.push("gesture"),i.merge(s.eventTypes,["gesturestart","gesturemove","gestureend"]),r.methodDict.gesture="gesturable",l.gesture=c.defaults,t.exports=c},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"./base":6}],10:[function(e,t,n){"use strict";function r(e,t,n,r,i,s,a){if(!t)return!1;if(!0===t){var l=o.is.number(s.width)?s.width:s.right-s.left,c=o.is.number(s.height)?s.height:s.bottom-s.top;if(l<0&&("left"===e?e="right":"right"===e&&(e="left")),c<0&&("top"===e?e="bottom":"bottom"===e&&(e="top")),"left"===e)return n.x<(l>=0?s.left:s.right)+a;if("top"===e)return n.y<(c>=0?s.top:s.bottom)+a;if("right"===e)return n.x>(l>=0?s.right:s.left)-a;if("bottom"===e)return n.y>(c>=0?s.bottom:s.top)-a}return!!o.is.element(r)&&(o.is.element(t)?t===r:o.matchesUpTo(r,t,i))}var i=e("./base"),o=e("../utils"),s=e("../utils/browser"),a=e("../InteractEvent"),l=e("../Interactable"),c=e("../Interaction"),p=e("../defaultOptions"),u=s.supportsTouch||s.supportsPointerEvent?20:10,d={defaults:{enabled:!1,mouseButtons:null,origin:null,snap:null,restrict:null,inertia:null,autoScroll:null,square:!1,preserveAspectRatio:!1,axis:"xy",margin:NaN,edges:null,invert:"none"},checker:function(e,t,n,i,s,a){if(!a)return null;var l=o.extend({},s.curCoords.page),c=n.options;if(c.resize.enabled){var p=c.resize,d={left:!1,right:!1,top:!1,bottom:!1};if(o.is.object(p.edges)){for(var f in d)d[f]=r(f,p.edges[f],l,s._eventTarget,i,a,p.margin||u);if(d.left=d.left&&!d.right,d.top=d.top&&!d.bottom,d.left||d.right||d.top||d.bottom)return{name:"resize",edges:d}}else{var v="y"!==c.resize.axis&&l.x>a.right-u,g="x"!==c.resize.axis&&l.y>a.bottom-u;if(v||g)return{name:"resize",axes:(v?"x":"")+(g?"y":"")}}}return null},cursors:s.isIe9OrOlder?{x:"e-resize",y:"s-resize",xy:"se-resize",top:"n-resize",left:"w-resize",bottom:"s-resize",right:"e-resize",topleft:"se-resize",bottomright:"se-resize",topright:"ne-resize",bottomleft:"ne-resize"}:{x:"ew-resize",y:"ns-resize",xy:"nwse-resize",top:"ns-resize",left:"ew-resize",bottom:"ns-resize",right:"ew-resize",topleft:"nwse-resize",bottomright:"nwse-resize",topright:"nesw-resize",bottomleft:"nesw-resize"},getCursor:function(e){if(e.axis)return d.cursors[e.name+e.axis];if(e.edges){for(var t="",n=["top","bottom","left","right"],r=0;r<4;r++)e.edges[n[r]]&&(t+=n[r]);return d.cursors[t]}}};a.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;if("resizestart"===t.type&&n.prepared.edges){var r=n.target.getRect(n.element),i=n.target.options.resize;if(i.square||i.preserveAspectRatio){var s=o.extend({},n.prepared.edges);s.top=s.top||s.left&&!s.bottom,s.left=s.left||s.top&&!s.right,s.bottom=s.bottom||s.right&&!s.top,s.right=s.right||s.bottom&&!s.left,n.prepared._linkedEdges=s}else n.prepared._linkedEdges=null;i.preserveAspectRatio&&(n.resizeStartAspectRatio=r.width/r.height),n.resizeRects={start:r,current:o.extend({},r),inverted:o.extend({},r),previous:o.extend({},r),delta:{left:0,right:0,width:0,top:0,bottom:0,height:0}},t.rect=n.resizeRects.inverted,t.deltaRect=n.resizeRects.delta}}),a.signals.on("new",function(e){var t=e.iEvent,n=e.phase,r=e.interaction;if("move"===n&&r.prepared.edges){var i=r.target.options.resize,s=i.invert,a="reposition"===s||"negate"===s,l=r.prepared.edges,c=r.resizeRects.start,p=r.resizeRects.current,u=r.resizeRects.inverted,d=r.resizeRects.delta,f=o.extend(r.resizeRects.previous,u),v=l,g=t.dx,h=t.dy;if(i.preserveAspectRatio||i.square){var m=i.preserveAspectRatio?r.resizeStartAspectRatio:1;l=r.prepared._linkedEdges,v.left&&v.bottom||v.right&&v.top?h=-g/m:v.left||v.right?h=g/m:(v.top||v.bottom)&&(g=h*m)}if(l.top&&(p.top+=h),l.bottom&&(p.bottom+=h),l.left&&(p.left+=g),l.right&&(p.right+=g),a){if(o.extend(u,p),"reposition"===s){var y=void 0;u.top>u.bottom&&(y=u.top,u.top=u.bottom,u.bottom=y),u.left>u.right&&(y=u.left,u.left=u.right,u.right=y)}}else u.top=Math.min(p.top,c.bottom),u.bottom=Math.max(p.bottom,c.top),u.left=Math.min(p.left,c.right),u.right=Math.max(p.right,c.left);u.width=u.right-u.left,u.height=u.bottom-u.top;for(var x in u)d[x]=u[x]-f[x];t.edges=r.prepared.edges,t.rect=u,t.deltaRect=d}}),l.prototype.resizable=function(e){return o.is.object(e)?(this.options.resize.enabled=!1!==e.enabled,this.setPerAction("resize",e),this.setOnEvents("resize",e),/^x$|^y$|^xy$/.test(e.axis)?this.options.resize.axis=e.axis:null===e.axis&&(this.options.resize.axis=p.resize.axis),o.is.bool(e.preserveAspectRatio)?this.options.resize.preserveAspectRatio=e.preserveAspectRatio:o.is.bool(e.square)&&(this.options.resize.square=e.square),this):o.is.bool(e)?(this.options.resize.enabled=e, +e||(this.onresizestart=this.onresizestart=this.onresizeend=null),this):this.options.resize},c.signals.on("new",function(e){e.resizeAxes="xy"}),a.signals.on("set-delta",function(e){var t=e.interaction,n=e.iEvent;"resize"===e.action&&t.resizeAxes&&(t.target.options.resize.square?("y"===t.resizeAxes?n.dx=n.dy:n.dy=n.dx,n.axes="xy"):(n.axes=t.resizeAxes,"x"===t.resizeAxes?n.dy=0:"y"===t.resizeAxes&&(n.dx=0)))}),i.resize=d,i.names.push("resize"),o.merge(l.eventTypes,["resizestart","resizemove","resizeinertiastart","resizeinertiaresume","resizeend"]),i.methodDict.resize="resizable",p.resize=d.defaults,t.exports=d},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"../utils/browser":37,"./base":6}],11:[function(e,t,n){"use strict";var r=e("./utils/raf"),i=e("./utils/window").getWindow,o=e("./utils/is"),s=e("./utils/domUtils"),a=e("./Interaction"),l=e("./defaultOptions"),c={defaults:{enabled:!1,container:null,margin:60,speed:300},interaction:null,i:null,x:0,y:0,isScrolling:!1,prevTime:0,start:function(e){c.isScrolling=!0,r.cancel(c.i),c.interaction=e,c.prevTime=(new Date).getTime(),c.i=r.request(c.scroll)},stop:function(){c.isScrolling=!1,r.cancel(c.i)},scroll:function(){var e=c.interaction.target.options[c.interaction.prepared.name].autoScroll,t=e.container||i(c.interaction.element),n=(new Date).getTime(),s=(n-c.prevTime)/1e3,a=e.speed*s;a>=1&&(o.window(t)?t.scrollBy(c.x*a,c.y*a):t&&(t.scrollLeft+=c.x*a,t.scrollTop+=c.y*a),c.prevTime=n),c.isScrolling&&(r.cancel(c.i),c.i=r.request(c.scroll))},check:function(e,t){var n=e.options;return n[t].autoScroll&&n[t].autoScroll.enabled},onInteractionMove:function(e){var t=e.interaction,n=e.pointer;if(t.interacting()&&c.check(t.target,t.prepared.name)){if(t.simulation)return void(c.x=c.y=0);var r=void 0,a=void 0,l=void 0,p=void 0,u=t.target.options[t.prepared.name].autoScroll,d=u.container||i(t.element);if(o.window(d))p=n.clientXd.innerWidth-c.margin,l=n.clientY>d.innerHeight-c.margin;else{var f=s.getElementClientRect(d);p=n.clientXf.right-c.margin,l=n.clientY>f.bottom-c.margin}c.x=a?1:p?-1:0,c.y=l?1:r?-1:0,c.isScrolling||(c.margin=u.margin,c.speed=u.speed,c.start(t))}}};a.signals.on("stop-active",function(){c.stop()}),a.signals.on("action-move",c.onInteractionMove),l.perAction.autoScroll=c.defaults,t.exports=c},{"./Interaction":5,"./defaultOptions":18,"./utils/domUtils":39,"./utils/is":46,"./utils/raf":50,"./utils/window":52}],12:[function(e,t,n){"use strict";var r=e("../Interactable"),i=e("../actions/base"),o=e("../utils/is"),s=e("../utils/domUtils");r.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},r.prototype.ignoreFrom=function(e){return this._backCompatOption("ignoreFrom",e)},r.prototype.allowFrom=function(e){return this._backCompatOption("allowFrom",e)},r.prototype.testIgnore=function(e,t,n){return!(!e||!o.element(n))&&(o.string(e)?s.matchesUpTo(n,e,t):!!o.element(e)&&s.nodeContains(e,n))},r.prototype.testAllow=function(e,t,n){return!e||!!o.element(n)&&(o.string(e)?s.matchesUpTo(n,e,t):!!o.element(e)&&s.nodeContains(e,n))},r.prototype.testIgnoreAllow=function(e,t,n){return!this.testIgnore(e.ignoreFrom,t,n)&&this.testAllow(e.allowFrom,t,n)},r.prototype.actionChecker=function(e){return o.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},r.prototype.styleCursor=function(e){return o.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},r.prototype.defaultActionChecker=function(e,t,n,r){for(var o=this.getRect(r),s=null,a=i.names,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var u=p;if((!n.pointerIsDown||!n.mouse||0!=(t.buttons&this.options[u].mouseButtons))&&(s=i[u].checker(e,t,this,r,n,o)))return s}}},{"../Interactable":4,"../actions/base":6,"../utils/domUtils":39,"../utils/is":46}],13:[function(e,t,n){"use strict";function r(e,t,n,r){return g.is.object(e)&&t.testIgnoreAllow(t.options[e.name],n,r)&&t.options[e.name].enabled&&a(t,n,e)?e:null}function i(e,t,n,i,o,s){for(var a=0,l=i.length;a=m.maxInteractions)return!1;if(u.target===e){if((a+=d===n.name|0)>=i)return!1;if(u.element===t&&(l++,d!==n.name||l>=o))return!1}}}return m.maxInteractions>0}}var l=e("../interact"),c=e("../Interactable"),p=e("../Interaction"),u=e("../actions/base"),d=e("../defaultOptions"),f=e("../utils/browser"),v=e("../scope"),g=e("../utils"),h=e("../utils/Signals").new();e("./InteractableMethods");var m={signals:h,withinInteractionLimit:a,maxInteractions:1/0,defaults:{perAction:{manualStart:!1,max:1/0,maxPerElement:1,allowFrom:null,ignoreFrom:null}},setActionDefaults:function(e){g.extend(e.defaults,m.defaults.perAction)}};p.signals.on("down",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;if(!t.interacting()){s(t,o(t,n,r,i))}}),p.signals.on("move",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;if(t.mouse&&!t.pointerIsDown&&!t.interacting()){s(t,o(t,n,r,i))}}),p.signals.on("move",function(e){var t=e.interaction,n=e.event;if(t.pointerIsDown&&!t.interacting()&&t.pointerWasMoved&&t.prepared.name){h.fire("before-start",e);var r=t.target;t.prepared.name&&r&&(r.options[t.prepared.name].manualStart||!a(r,t.element,t.prepared)?t.stop(n):t.start(t.prepared,r,t.element))}}),p.signals.on("stop",function(e){var t=e.interaction,n=t.target;n&&n.options.styleCursor&&(n._doc.documentElement.style.cursor="")}),c.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},c.prototype.actionChecker=function(e){return g.is.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},c.prototype.styleCursor=function(e){return g.is.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},c.prototype.defaultActionChecker=function(e,t,n,r){for(var i=this.getRect(r),o=t.buttons||{0:1,1:4,3:8,4:16}[t.button],s=null,a=u.names,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var d=p;if((!n.pointerIsDown||!n.mouse||0!=(o&this.options[d].mouseButtons))&&(s=u[d].checker(e,t,this,r,n,i)))return s}},l.maxInteractions=function(e){return g.is.number(e)?(m.maxInteractions=e,this):m.maxInteractions},c.settingsMethods.push("styleCursor"),c.settingsMethods.push("actionChecker"),c.settingsMethods.push("ignoreFrom"),c.settingsMethods.push("allowFrom"),d.base.actionChecker=null,d.base.styleCursor=!0,g.extend(d.perAction,m.defaults.perAction),t.exports=m},{"../Interactable":4,"../Interaction":5,"../actions/base":6,"../defaultOptions":18,"../interact":21,"../scope":34,"../utils":44,"../utils/Signals":35,"../utils/browser":37,"./InteractableMethods":12}],14:[function(e,t,n){"use strict";var r=e("./base"),i=e("../Interaction");i.signals.on("new",function(e){e.delayTimer=null}),r.signals.on("prepared",function(e){var t=e.interaction,n=t.prepared.name;if(n){var r=t.target.options[n].delay;r>0&&(t.delayTimer=setTimeout(function(){t.start(t.prepared,t.target,t.element)},r))}}),i.signals.on("move",function(e){var t=e.interaction,n=e.duplicate;t.pointerWasMoved&&!n&&clearTimeout(t.delayTimer)}),r.signals.on("before-start",function(e){var t=e.interaction,n=t.prepared.name;if(n){t.target.options[n].delay>0&&(t.prepared.name=null)}})},{"../Interaction":5,"./base":13}],15:[function(e,t,n){"use strict";function r(e,t){if(!t)return!1;var n=t.options.drag.startAxis;return"xy"===e||"xy"===n||n===e}var i=e("./base"),o=e("../scope"),s=e("../utils/browser"),a=e("../utils/is"),l=e("../utils/domUtils"),c=l.matchesSelector,p=l.parentNode;i.setActionDefaults(e("../actions/drag")),i.signals.on("before-start",function(e){var t=e.interaction,n=e.eventTarget,l=e.dx,u=e.dy;if("drag"===t.prepared.name){var d=Math.abs(l),f=Math.abs(u),v=t.target.options.drag,g=v.startAxis,h=d>f?"x":dl.minSpeed&&g>l.endSpeed,b={interaction:t,pageCoords:v,statuses:f,preEnd:!0,requireEndOnly:!0};y&&!x&&(c.resetStatuses(f),m=c.setAll(b),m.shouldMove&&m.locked&&(h=!0)),(x||h)&&(p.copyCoords(i.upCoords,t.curCoords),t.pointers[0]=i.startEvent=new a(t,n,t.prepared.name,"inertiastart",t.element),i.t0=d,i.active=!0,i.allowResume=l.allowResume,t.simulation=i,o.fire(i.startEvent),x?(i.vx0=t.pointerDelta.client.vx,i.vy0=t.pointerDelta.client.vy,i.v0=g,r(t,i),p.extend(v,t.curCoords.page),v.x+=i.xe,v.y+=i.ye,c.resetStatuses(f),m=c.setAll(b),i.modifiedXe+=m.dx,i.modifiedYe+=m.dy,i.i=u.request(t.boundInertiaFrame)):(i.smoothEnd=!0,i.xe=m.dx,i.ye=m.dy,i.sx=i.sy=0,i.i=u.request(t.boundSmoothEndFrame)))}}),l.signals.on("stop-active",function(e){var t=e.interaction,n=t.inertiaStatus;n.active&&(u.cancel(n.i),n.active=!1,t.simulation=null)})},{"./InteractEvent":3,"./Interaction":5,"./modifiers":24,"./utils":44,"./utils/raf":50}],21:[function(e,t,n){"use strict";function r(e,t){var n=a.interactables.get(e,t);return n||(n=new l(e,t),n.events.global=p),n}var i=e("./utils/browser"),o=e("./utils/events"),s=e("./utils"),a=e("./scope"),l=e("./Interactable"),c=e("./Interaction"),p={};r.isSet=function(e,t){return-1!==a.interactables.indexOfElement(e,t&&t.context)},r.on=function(e,t,n){if(s.is.string(e)&&-1!==e.search(" ")&&(e=e.trim().split(/ +/)),s.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.on(f,t,n)}return r}if(s.is.object(e)){for(var v in e)r.on(v,e[v],t);return r}return s.contains(l.eventTypes,e)?p[e]?p[e].push(t):p[e]=[t]:o.add(a.document,e,t,{options:n}),r},r.off=function(e,t,n){if(s.is.string(e)&&-1!==e.search(" ")&&(e=e.trim().split(/ +/)),s.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.off(f,t,n)}return r}if(s.is.object(e)){for(var v in e)r.off(v,e[v],t);return r}if(s.contains(l.eventTypes,e)){var g=void 0;e in p&&-1!==(g=s.indexOf(p[e],t))&&p[e].splice(g,1)}else o.remove(a.document,e,t,n);return r},r.debug=function(){return a},r.getPointerAverage=s.pointerAverage,r.getTouchBBox=s.touchBBox,r.getTouchDistance=s.touchDistance,r.getTouchAngle=s.touchAngle,r.getElementRect=s.getElementRect,r.getElementClientRect=s.getElementClientRect,r.matchesSelector=s.matchesSelector,r.closest=s.closest,r.supportsTouch=function(){return i.supportsTouch},r.supportsPointerEvent=function(){return i.supportsPointerEvent},r.stop=function(e){for(var t=a.interactions.length-1;t>=0;t--)a.interactions[t].stop(e);return r},r.pointerMoveTolerance=function(e){return s.is.number(e)?(c.pointerMoveTolerance=e,this):c.pointerMoveTolerance},r.addDocument=a.addDocument,r.removeDocument=a.removeDocument,a.interact=r,t.exports=r},{"./Interactable":4,"./Interaction":5,"./scope":34,"./utils":44,"./utils/browser":37,"./utils/events":40}],22:[function(e,t,n){"use strict";function r(e){var t=e.interaction,n=e.event;t.target&&t.target.checkAndPreventDefault(n)}var i=e("./Interactable"),o=e("./Interaction"),s=e("./scope"),a=e("./utils/is"),l=e("./utils/events"),c=e("./utils/domUtils"),p=c.nodeContains,u=c.matchesSelector;i.prototype.preventDefault=function(e){return/^(always|never|auto)$/.test(e)?(this.options.preventDefault=e,this):a.bool(e)?(this.options.preventDefault=e?"always":"never",this):this.options.preventDefault},i.prototype.checkAndPreventDefault=function(e){var t=this.options.preventDefault;if("never"!==t)return"always"===t?void e.preventDefault():void(l.supportsOptions||/^(mouse|pointer|touch)*(down|start)/i.test(e.type)||a.element(e.target)&&u(e.target,"input,select,textarea,[contenteditable=true],[contenteditable=true] *")||e.preventDefault())};for(var d=["down","move","up","cancel"],f=0;f=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i;if(o.element&&(o.element===e.target||p(o.element,e.target)))return void o.target.checkAndPreventDefault(e)}}},{"./Interactable":4,"./Interaction":5,"./scope":34,"./utils/domUtils":39,"./utils/events":40,"./utils/is":46}],23:[function(e,t,n){"use strict";function r(e){var t=e.target,n=a.search(e,e.type,t);n&&n.prevTap&&e.clientX===n.prevTap.clientX&&e.clientY===n.prevTap.clientY&&t===n.prevTap.target&&(n.downTargets[0]=t,n.downTimes[0]=(new Date).getTime(),l.fire({interaction:n,event:e,eventTarget:t,pointer:e,type:"tap"}))}var i=e("./scope"),o=e("./utils/events"),s=e("./utils/browser"),a=e("./utils/interactionFinder"),l=e("./pointerEvents/base"),c=e("./utils/window"),p=c.window,u=Object.prototype.toString;if(p.Array.isArray||(p.Array.isArray=function(e){return"[object Array]"===u.call(e)}),String.prototype.trim||(String.prototype.trim=function(){return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")}),s.isIE8){var d=function(e){for(var t=i.interactions,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var o;if(n){if(r>=t.length)break;o=t[r++]}else{if(r=t.next(),r.done)break;o=r.value}var s=o;s.interacting()&&s.target.checkAndPreventDefault(e)}},f=function(e,t){var n=e.doc,i=(e.win,0===t.indexOf("listen")?o.add:o.remove);i(n,"selectstart",d),l&&i(n,"dblclick",r)};i.signals.on("add-document",f),i.signals.on("remove-document",f)}t.exports=null},{"./pointerEvents/base":31,"./scope":34,"./utils/browser":37,"./utils/events":40,"./utils/interactionFinder":45,"./utils/window":52}],24:[function(e,t,n){"use strict";function r(e,t,n){return e&&e.enabled&&(t||!e.endOnly)&&(!n||e.endOnly)}var i=e("../InteractEvent"),o=e("../Interaction"),s=e("../utils/extend"),a={names:[],setOffsets:function(e){var t=e.interaction,n=e.pageCoords,r=t.target,i=t.element,o=t.startOffset,s=r.getRect(i);s?(o.left=n.x-s.left,o.top=n.y-s.top,o.right=s.right-n.x,o.bottom=s.bottom-n.y,"width"in s||(s.width=s.right-s.left),"height"in s||(s.height=s.bottom-s.top)):o.left=o.top=o.right=o.bottom=0,e.rect=s,e.interactable=r,e.element=i;for(var l=0;l=p.length)break;f=p[d++]}else{if(d=p.next(),d.done)break;f=d.value}var v=f,g=a[v],h=t.target.options[t.prepared.name][v];r(h,i,o)&&(e.status=e.status=n[v],e.options=h,e.offset=e.interaction.modifierOffsets[v],g.set(e),e.status.locked&&(l.x+=e.status.dx,l.y+=e.status.dy,c.dx+=e.status.dx,c.dy+=e.status.dy,c.locked=!0))}return c.shouldMove=!e.status||!c.locked||e.status.changed,c},resetStatuses:function(e){for(var t=a.names,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var i;if(n){if(r>=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i,s=e[o]||{};s.dx=s.dy=0,s.modifiedX=s.modifiedY=NaN,s.locked=!1,s.changed=!0,e[o]=s}return e},start:function(e,t){var n=e.interaction,r={interaction:n,pageCoords:("action-resume"===t?n.curCoords:n.startCoords).page,startOffset:n.startOffset,statuses:n.modifierStatuses,preEnd:!1,requireEndOnly:!1};a.setOffsets(r),a.resetStatuses(r.statuses),r.pageCoords=s({},n.startCoords.page),n.modifierResult=a.setAll(r)}};o.signals.on("new",function(e){e.startOffset={left:0,right:0,top:0,bottom:0},e.modifierOffsets={},e.modifierStatuses=a.resetStatuses({}),e.modifierResult=null}),o.signals.on("action-start",a.start),o.signals.on("action-resume",a.start),o.signals.on("before-action-move",function(e){var t=e.interaction,n=e.preEnd,r=e.interactingBeforeMove,i=a.setAll({interaction:t,preEnd:n,pageCoords:t.curCoords.page,statuses:t.modifierStatuses,requireEndOnly:!1});!i.shouldMove&&r&&(t._dontFireMove=!0),t.modifierResult=i}),o.signals.on("action-end",function(e){for(var t=e.interaction,n=e.event,i=0;i=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}var m=h,y=m.x,x=m.y;l.push({x:s.left-i.width*y+u.x,y:s.top-i.height*x+u.y})}else l.push(u);return l},set:function(e){var t=e.interaction,n=e.pageCoords,r=e.status,i=e.options,s=e.offset,a=[],l=void 0,c=void 0,p=void 0;if(r.useStatusXY)c={x:r.x,y:r.y};else{var u=o.getOriginXY(t.target,t.element,t.prepared.name);c=o.extend({},n),c.x-=u.x,c.y-=u.y}r.realX=c.x,r.realY=c.y;for(var d=i.targets?i.targets.length:0,f=s,v=Array.isArray(f),g=0,f=v?f:f[Symbol.iterator]();;){var h;if(v){if(g>=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}for(var m=h,y=m.x,x=m.y,b=c.x-y,w=c.y-x,E=i.targets,S=Array.isArray(E),T=0,E=S?E:E[Symbol.iterator]();;){var C;if(S){if(T>=E.length)break;C=E[T++]}else{if(T=E.next(),T.done)break;C=T.value}var A=C;l=o.is.function(A)?A(b,w,t):A,l&&a.push({x:o.is.number(l.x)?l.x+y:b,y:o.is.number(l.y)?l.y+x:w,range:o.is.number(l.range)?l.range:i.range})}}var D={target:null,inRange:!1,distance:0,range:0,dx:0,dy:0};for(p=0,d=a.length;p=p.length)break;f=p[d++]}else{if(d=p.next(),d.done)break;f=d.value}var v=f,g=void 0;g=a.is.function(v)?v(l,c,t):v,g&&("width"in g&&"height"in g&&(g.x=g.width, +g.y=g.height),e.options.targets.push(g))}i.set(e)},modifyCoords:function(e){var t=e.options;e.options=a.extend({},t),e.options.enabled=t.enabled,e.options.relativePoints=[null],i.modifyCoords(e)}};r.snapSize=l,r.names.push("snapSize"),o.perAction.snapSize=l.defaults,s.defaults.snapSize=l.defaults,t.exports=l},{"../actions/resize":10,"../defaultOptions":18,"../utils/":44,"./index":24,"./snap":28}],30:[function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=e("../utils/pointerUtils");t.exports=function(){function e(t,n,o,s,a){if(r(this,e),i.pointerExtend(this,o),o!==n&&i.pointerExtend(this,n),this.interaction=a,this.timeStamp=(new Date).getTime(),this.originalEvent=o,this.type=t,this.pointerId=i.getPointerId(n),this.pointerType=i.getPointerType(n),this.target=s,this.currentTarget=null,"tap"===t){var l=a.getPointerIndex(n);this.dt=this.timeStamp-a.downTimes[l];var c=this.timeStamp-a.tapTime;this.double=!!(a.prevTap&&"doubletap"!==a.prevTap.type&&a.prevTap.target===this.target&&c<500)}else"doubletap"===t&&(this.dt=n.timeStamp-a.tapTime)}return e.prototype.subtractOrigin=function(e){var t=e.x,n=e.y;return this.pageX-=t,this.pageY-=n,this.clientX-=t,this.clientY-=n,this},e.prototype.addOrigin=function(e){var t=e.x,n=e.y;return this.pageX+=t,this.pageY+=n,this.clientX+=t,this.clientY+=n,this},e.prototype.preventDefault=function(){this.originalEvent.preventDefault()},e.prototype.stopPropagation=function(){this.propagationStopped=!0},e.prototype.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},e}()},{"../utils/pointerUtils":49}],31:[function(e,t,n){"use strict";function r(e){for(var t=e.interaction,n=e.pointer,s=e.event,l=e.eventTarget,c=e.type,u=void 0===c?e.pointerEvent.type:c,d=e.targets,f=void 0===d?i(e):d,v=e.pointerEvent,g=void 0===v?new o(u,n,s,l,t):v,h={interaction:t,pointer:n,event:s,eventTarget:l,targets:f,type:u,pointerEvent:g},m=0;m=u.length)break;g=u[v++]}else{if(v=u.next(),v.done)break;g=v.value}var h=g;c.element=h,p.fire("collect-targets",c)}return"hold"===o&&(c.targets=d(c.targets,function(e){return e.eventable.options.holdDuration===t.holdTimers[s].duration})),c.targets}var o=e("./PointerEvent"),s=e("../Interaction"),a=e("../utils"),l=e("../utils/browser"),c=e("../defaultOptions"),p=e("../utils/Signals").new(),u=e("../utils/arr"),d=u.filter,f=["down","up","cancel"],v=["down","up","cancel"],g={PointerEvent:o,fire:r,collectEventTargets:i,signals:p,defaults:{holdDuration:600,ignoreFrom:null,allowFrom:null,origin:{x:0,y:0}},types:["down","move","up","cancel","tap","doubletap","hold"]};s.signals.on("update-pointer-down",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers[n]={duration:1/0,timeout:null}}),s.signals.on("remove-pointer",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers.splice(n,1)}),s.signals.on("move",function(e){var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,s=e.duplicateMove,a=t.getPointerIndex(n);s||t.pointerIsDown&&!t.pointerWasMoved||(t.pointerIsDown&&clearTimeout(t.holdTimers[a].timeout),r({interaction:t,pointer:n,event:i,eventTarget:o,type:"move"}))}),s.signals.on("down",function(e){for(var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,s=e.pointerIndex,c=l.isIE8?a.extend({},i):i,u=t.holdTimers[s],d=a.getPath(o),f={interaction:t,pointer:n,event:i,eventTarget:o,type:"hold",targets:[],path:d,element:null},v=d,g=Array.isArray(v),h=0,v=g?v:v[Symbol.iterator]();;){var m;if(g){if(h>=v.length)break;m=v[h++]}else{if(h=v.next(),h.done)break;m=h.value}var y=m;f.element=y,p.fire("collect-targets",f)}if(f.targets.length){for(var x=1/0,b=0;b=0&&(p.selectors[u]!==e||p.contexts[u]!==t);u--);-1===u&&(u=p.selectors.length,p.selectors.push(e),p.contexts.push(t),p.listeners.push([])),p.listeners[u].push([i,!!s.capture,s.passive])}function s(e,t,n,r,o){var s=f(o),c=O[n],p=!1,u=void 0;if(c)for(u=c.selectors.length-1;u>=0;u--)if(c.selectors[u]===e&&c.contexts[u]===t){for(var d=c.listeners[u],v=d.length-1;v>=0;v--){var g=d[v],h=g[0],m=g[1],y=g[2];if(h===r&&m===!!s.capture&&y===s.passive){d.splice(v,1),d.length||(c.selectors.splice(u,1),c.contexts.splice(u,1),c.listeners.splice(u,1),i(t,n,a),i(t,n,l,!0),c.selectors.length||(O[n]=null)),p=!0;break}}if(p)break}}function a(e,t){var n=f(t),r={},i=O[e.type],o=g.getActualElement(e.path?e.path[0]:e.target),s=o;for(h(r,e),r.originalEvent=e,r.preventDefault=p;v.element(s);){for(var a=0;a=l.length)break;u=l[p++]}else{if(p=l.next(),p.done)break;u=p.value}var d=u,f=o[d](a);if(f)return f}},simulationResume:function(e){var t=e.pointerType,n=e.eventType,o=e.eventTarget;if(!/down|start/i.test(n))return null;for(var s=r.interactions,a=Array.isArray(s),l=0,s=a?s:s[Symbol.iterator]();;){var c;if(a){if(l>=s.length)break;c=s[l++]}else{if(l=s.next(),l.done)break;c=l.value}var p=c,u=o;if(p.simulation&&p.simulation.allowResume&&p.pointerType===t)for(;u;){if(u===p.element)return p;u=i.parentNode(u)}}return null},mouseOrPen:function(e){var t=e.pointerId,n=e.pointerType,o=e.eventType;if("mouse"!==n&&"pen"!==n)return null;for(var s=void 0,a=r.interactions,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var u=p;if(u.pointerType===n){if(u.simulation&&!i.contains(u.pointerIds,t))continue;if(u.interacting())return u;s||(s=u)}}if(s)return s;for(var d=r.interactions,f=Array.isArray(d),v=0,d=f?d:d[Symbol.iterator]();;){var g;if(f){if(v>=d.length)break;g=d[v++]}else{if(v=d.next(),v.done)break;g=v.value}var h=g;if(!(h.pointerType!==n||/down/i.test(o)&&h.simulation))return h}return null},hasPointer:function(e){for(var t=e.pointerId,n=r.interactions,o=Array.isArray(n),s=0,n=o?n:n[Symbol.iterator]();;){var a;if(o){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var l=a;if(i.contains(l.pointerIds,t))return l}},idle:function(e){for(var t=e.pointerType,n=r.interactions,i=Array.isArray(n),o=0,n=i?n:n[Symbol.iterator]();;){var s;if(i){if(o>=n.length)break;s=n[o++]}else{if(o=n.next(),o.done)break;s=o.value}var a=s;if(1===a.pointerIds.length){var l=a.target;if(l&&!l.options.gesture.enabled)continue}else if(a.pointerIds.length>=2)continue;if(!a.interacting()&&t===a.pointerType)return a}return null}};t.exports=o},{"../scope":34,"./index":44}],46:[function(e,t,n){"use strict";var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},i=e("./window"),o=e("./isWindow"),s={array:function(){},window:function(e){return e===i.window||o(e)},docFrag:function(e){return s.object(e)&&11===e.nodeType},object:function(e){return!!e&&"object"===(void 0===e?"undefined":r(e))},function:function(e){return"function"==typeof e},number:function(e){return"number"==typeof e},bool:function(e){return"boolean"==typeof e},string:function(e){return"string"==typeof e},element:function(e){if(!e||"object"!==(void 0===e?"undefined":r(e)))return!1;var t=i.getWindow(e)||i.window;return/object|function/.test(r(t.Element))?e instanceof t.Element:1===e.nodeType&&"string"==typeof e.nodeName}};s.array=function(e){return s.object(e)&&void 0!==e.length&&s.function(e.splice)},t.exports=s},{"./isWindow":47,"./window":52}],47:[function(e,t,n){"use strict";t.exports=function(e){return!(!e||!e.Window)&&e instanceof e.Window}},{}],48:[function(e,t,n){"use strict";function r(e,n){for(var r in n){var i=t.exports.prefixedPropREs,o=!1;for(var s in i)if(0===r.indexOf(s)&&i[s].test(r)){o=!0;break}o||"function"==typeof n[r]||(e[r]=n[r])}return e}r.prefixedPropREs={webkit:/(Movement[XY]|Radius[XY]|RotationAngle|Force)$/},t.exports=r},{}],49:[function(e,t,n){"use strict";var r=e("./hypot"),i=e("./browser"),o=e("./domObjects"),s=e("./domUtils"),a=e("./domObjects"),l=e("./is"),c=e("./pointerExtend"),p={copyCoords:function(e,t){e.page=e.page||{},e.page.x=t.page.x,e.page.y=t.page.y,e.client=e.client||{},e.client.x=t.client.x,e.client.y=t.client.y,e.timeStamp=t.timeStamp},setCoordDeltas:function(e,t,n){e.page.x=n.page.x-t.page.x,e.page.y=n.page.y-t.page.y,e.client.x=n.client.x-t.client.x,e.client.y=n.client.y-t.client.y,e.timeStamp=n.timeStamp-t.timeStamp;var i=Math.max(e.timeStamp/1e3,.001);e.page.speed=r(e.page.x,e.page.y)/i,e.page.vx=e.page.x/i,e.page.vy=e.page.y/i,e.client.speed=r(e.client.x,e.page.y)/i,e.client.vx=e.client.x/i,e.client.vy=e.client.y/i},isNativePointer:function(e){return e instanceof o.Event||e instanceof o.Touch},getXY:function(e,t,n){return n=n||{},e=e||"page",n.x=t[e+"X"],n.y=t[e+"Y"],n},getPageXY:function(e,t){return t=t||{},i.isOperaMobile&&p.isNativePointer(e)?(p.getXY("screen",e,t),t.x+=window.scrollX,t.y+=window.scrollY):p.getXY("page",e,t),t},getClientXY:function(e,t){return t=t||{},i.isOperaMobile&&p.isNativePointer(e)?p.getXY("screen",e,t):p.getXY("client",e,t),t},getPointerId:function(e){return l.number(e.pointerId)?e.pointerId:e.identifier},setCoords:function(e,t,n){var r=t.length>1?p.pointerAverage(t):t[0],i={};p.getPageXY(r,i),e.page.x=i.x,e.page.y=i.y,p.getClientXY(r,i),e.client.x=i.x,e.client.y=i.y,e.timeStamp=l.number(n)?n:(new Date).getTime()},pointerExtend:c,getTouchPair:function(e){var t=[];return l.array(e)?(t[0]=e[0],t[1]=e[1]):"touchend"===e.type?1===e.touches.length?(t[0]=e.touches[0],t[1]=e.changedTouches[0]):0===e.touches.length&&(t[0]=e.changedTouches[0],t[1]=e.changedTouches[1]):(t[0]=e.touches[0],t[1]=e.touches[1]),t},pointerAverage:function(e){for(var t={pageX:0,pageY:0,clientX:0,clientY:0,screenX:0,screenY:0},n=e,r=Array.isArray(n),i=0,n=r?n:n[Symbol.iterator]();;){var o;if(r){if(i>=n.length)break;o=n[i++]}else{if(i=n.next(),i.done)break;o=i.value}var s=o;for(var a in t)t[a]+=s[a]}for(var l in t)t[l]/=e.length;return t},touchBBox:function(e){if(e.length||e.touches&&e.touches.length>1){var t=p.getTouchPair(e),n=Math.min(t[0].pageX,t[1].pageX),r=Math.min(t[0].pageY,t[1].pageY);return{x:n,y:r,left:n,top:r,width:Math.max(t[0].pageX,t[1].pageX)-n,height:Math.max(t[0].pageY,t[1].pageY)-r}}},touchDistance:function(e,t){var n=t+"X",i=t+"Y",o=p.getTouchPair(e),s=o[0][n]-o[1][n],a=o[0][i]-o[1][i];return r(s,a)},touchAngle:function(e,t,n){var r=n+"X",i=n+"Y",o=p.getTouchPair(e),s=o[1][r]-o[0][r],a=o[1][i]-o[0][i];return 180*Math.atan2(a,s)/Math.PI},getPointerType:function(e){return l.string(e.pointerType)?e.pointerType:l.number(e.pointerType)?[void 0,void 0,"touch","pen","mouse"][e.pointerType]:/touch/.test(e.type)||e instanceof a.Touch?"touch":"mouse"},getEventTargets:function(e){return[s.getActualElement(e.path?e.path[0]:e.target),s.getActualElement(e.currentTarget)]}};t.exports=p},{"./browser":37,"./domObjects":38,"./domUtils":39,"./hypot":43,"./is":46,"./pointerExtend":48}],50:[function(e,t,n){"use strict";for(var r=e("./window"),i=r.window,o=["ms","moz","webkit","o"],s=0,a=void 0,l=void 0,c=0;c\n * Open source under the MIT License.\n * https://raw.github.com/taye/interact.js/master/LICENSE\n */\n","/*\n * In a (windowless) server environment this file exports a factory function\n * that takes the window to use.\n *\n * var interact = require('interact.js')(windowObject);\n *\n * See https://github.com/taye/interact.js/issues/187\n */\nif (typeof window === 'undefined') {\n module.exports = function (window) {\n require('./src/utils/window').init(window);\n\n return require('./src/index');\n };\n}\nelse {\n module.exports = require('./src/index');\n}\n","const { indexOf } = require('./utils/arr');\nconst extend = require('./utils/extend.js');\n\nfunction fireUntilImmediateStopped (event, listeners) {\n for (let i = 0, len = listeners.length; i < len && !event.immediatePropagationStopped; i++) {\n listeners[i](event);\n }\n}\n\nclass Eventable {\n\n constructor (options) {\n this.options = extend({}, options || {});\n }\n\n fire (event) {\n let listeners;\n const onEvent = 'on' + event.type;\n const global = this.global;\n\n // Interactable#on() listeners\n if ((listeners = this[event.type])) {\n fireUntilImmediateStopped(event, listeners);\n }\n\n // interactable.onevent listener\n if (this[onEvent]) {\n this[onEvent](event);\n }\n\n // interact.on() listeners\n if (!event.propagationStopped && global && (listeners = global[event.type])) {\n fireUntilImmediateStopped(event, listeners);\n }\n }\n\n on (eventType, listener) {\n // if this type of event was never bound\n if (this[eventType]) {\n this[eventType].push(listener);\n }\n else {\n this[eventType] = [listener];\n }\n }\n\n off (eventType, listener) {\n // if it is an action event type\n const eventList = this[eventType];\n const index = eventList? indexOf(eventList, listener) : -1;\n\n if (index !== -1) {\n eventList.splice(index, 1);\n }\n\n if (eventList && eventList.length === 0 || !listener) {\n this[eventType] = listener;\n }\n }\n}\n\nmodule.exports = Eventable;\n","const extend = require('./utils/extend');\nconst getOriginXY = require('./utils/getOriginXY');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nclass InteractEvent {\n constructor (interaction, event, action, phase, element, related, preEnd = false) {\n const target = interaction.target;\n const deltaSource = (target && target.options || defaults).deltaSource;\n const origin = getOriginXY(target, element, action);\n const starting = phase === 'start';\n const ending = phase === 'end';\n const coords = starting? interaction.startCoords : interaction.curCoords;\n const prevEvent = interaction.prevEvent;\n\n element = element || interaction.element;\n\n const page = extend({}, coords.page);\n const client = extend({}, coords.client);\n\n page.x -= origin.x;\n page.y -= origin.y;\n\n client.x -= origin.x;\n client.y -= origin.y;\n\n this.ctrlKey = event.ctrlKey;\n this.altKey = event.altKey;\n this.shiftKey = event.shiftKey;\n this.metaKey = event.metaKey;\n this.button = event.button;\n this.buttons = event.buttons;\n this.target = element;\n this.currentTarget = element;\n this.relatedTarget = related || null;\n this.preEnd = preEnd;\n this.type = action + (phase || '');\n this.interaction = interaction;\n this.interactable = target;\n\n this.t0 = starting ? interaction.downTimes[interaction.downTimes.length - 1]\n : prevEvent.t0;\n\n const signalArg = {\n interaction,\n event,\n action,\n phase,\n element,\n related,\n page,\n client,\n coords,\n starting,\n ending,\n deltaSource,\n iEvent: this,\n };\n\n signals.fire('set-xy', signalArg);\n\n if (ending) {\n // use previous coords when ending\n this.pageX = prevEvent.pageX;\n this.pageY = prevEvent.pageY;\n this.clientX = prevEvent.clientX;\n this.clientY = prevEvent.clientY;\n }\n else {\n this.pageX = page.x;\n this.pageY = page.y;\n this.clientX = client.x;\n this.clientY = client.y;\n }\n\n this.x0 = interaction.startCoords.page.x - origin.x;\n this.y0 = interaction.startCoords.page.y - origin.y;\n this.clientX0 = interaction.startCoords.client.x - origin.x;\n this.clientY0 = interaction.startCoords.client.y - origin.y;\n\n signals.fire('set-delta', signalArg);\n\n this.timeStamp = coords.timeStamp;\n this.dt = interaction.pointerDelta.timeStamp;\n this.duration = this.timeStamp - this.t0;\n\n // speed and velocity in pixels per second\n this.speed = interaction.pointerDelta[deltaSource].speed;\n this.velocityX = interaction.pointerDelta[deltaSource].vx;\n this.velocityY = interaction.pointerDelta[deltaSource].vy;\n\n this.swipe = (ending || phase === 'inertiastart')? this.getSwipe() : null;\n\n signals.fire('new', signalArg);\n }\n\n getSwipe () {\n const interaction = this.interaction;\n\n if (interaction.prevEvent.speed < 600\n || this.timeStamp - interaction.prevEvent.timeStamp > 150) {\n return null;\n }\n\n let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI;\n const overlap = 22.5;\n\n if (angle < 0) {\n angle += 360;\n }\n\n const left = 135 - overlap <= angle && angle < 225 + overlap;\n const up = 225 - overlap <= angle && angle < 315 + overlap;\n\n const right = !left && (315 - overlap <= angle || angle < 45 + overlap);\n const down = !up && 45 - overlap <= angle && angle < 135 + overlap;\n\n return {\n up,\n down,\n left,\n right,\n angle,\n speed: interaction.prevEvent.speed,\n velocity: {\n x: interaction.prevEvent.velocityX,\n y: interaction.prevEvent.velocityY,\n },\n };\n }\n\n preventDefault () {}\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n}\n\nsignals.on('set-delta', function ({ iEvent, interaction, starting, deltaSource }) {\n const prevEvent = starting? iEvent : interaction.prevEvent;\n\n if (deltaSource === 'client') {\n iEvent.dx = iEvent.clientX - prevEvent.clientX;\n iEvent.dy = iEvent.clientY - prevEvent.clientY;\n }\n else {\n iEvent.dx = iEvent.pageX - prevEvent.pageX;\n iEvent.dy = iEvent.pageY - prevEvent.pageY;\n }\n});\n\nInteractEvent.signals = signals;\n\nmodule.exports = InteractEvent;\n","const is = require('./utils/is');\nconst events = require('./utils/events');\nconst extend = require('./utils/extend');\nconst actions = require('./actions/base');\nconst scope = require('./scope');\nconst Eventable = require('./Eventable');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nconst {\n getElementRect,\n nodeContains,\n trySelector,\n} = require('./utils/domUtils');\nconst { getWindow } = require('./utils/window');\nconst { indexOf, contains } = require('./utils/arr');\nconst { wheelEvent } = require('./utils/browser');\n\n// all set interactables\nscope.interactables = [];\n\n/*\\\n * Interactable\n [ property ]\n **\n * Object type returned by @interact\n\\*/\nclass Interactable {\n constructor (target, options) {\n options = options || {};\n\n this.target = target;\n this.events = new Eventable();\n this._context = options.context || scope.document;\n this._win = getWindow(trySelector(target)? this._context : target);\n this._doc = this._win.document;\n\n signals.fire('new', {\n target,\n options,\n interactable: this,\n win: this._win,\n });\n\n scope.addDocument( this._doc, this._win );\n\n scope.interactables.push(this);\n\n this.set(options);\n }\n\n setOnEvents (action, phases) {\n const onAction = 'on' + action;\n\n if (is.function(phases.onstart) ) { this.events[onAction + 'start' ] = phases.onstart ; }\n if (is.function(phases.onmove) ) { this.events[onAction + 'move' ] = phases.onmove ; }\n if (is.function(phases.onend) ) { this.events[onAction + 'end' ] = phases.onend ; }\n if (is.function(phases.oninertiastart)) { this.events[onAction + 'inertiastart' ] = phases.oninertiastart ; }\n\n return this;\n }\n\n setPerAction (action, options) {\n // for all the default per-action options\n for (const option in options) {\n // if this option exists for this action\n if (option in defaults[action]) {\n // if the option in the options arg is an object value\n if (is.object(options[option])) {\n // duplicate the object\n this.options[action][option] = extend(this.options[action][option] || {}, options[option]);\n\n if (is.object(defaults.perAction[option]) && 'enabled' in defaults.perAction[option]) {\n this.options[action][option].enabled = options[option].enabled === false? false : true;\n }\n }\n else if (is.bool(options[option]) && is.object(defaults.perAction[option])) {\n this.options[action][option].enabled = options[option];\n }\n else if (options[option] !== undefined) {\n // or if it's not undefined, do a plain assignment\n this.options[action][option] = options[option];\n }\n }\n }\n }\n\n /*\\\n * Interactable.getRect\n [ method ]\n *\n * The default function to get an Interactables bounding rect. Can be\n * overridden using @Interactable.rectChecker.\n *\n - element (Element) #optional The element to measure.\n = (object) The object's bounding rectangle.\n o {\n o top : 0,\n o left : 0,\n o bottom: 0,\n o right : 0,\n o width : 0,\n o height: 0\n o }\n \\*/\n getRect (element) {\n element = element || this.target;\n\n if (is.string(this.target) && !(is.element(element))) {\n element = this._context.querySelector(this.target);\n }\n\n return getElementRect(element);\n }\n\n /*\\\n * Interactable.rectChecker\n [ method ]\n *\n * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n - checker (function) #optional A function which returns this Interactable's bounding rectangle. See @Interactable.getRect\n = (function | object) The checker function or this Interactable\n \\*/\n rectChecker (checker) {\n if (is.function(checker)) {\n this.getRect = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.getRect;\n\n return this;\n }\n\n return this.getRect;\n }\n\n _backCompatOption (optionName, newValue) {\n if (trySelector(newValue) || is.object(newValue)) {\n this.options[optionName] = newValue;\n\n for (const action of actions.names) {\n this.options[action][optionName] = newValue;\n }\n\n return this;\n }\n\n return this.options[optionName];\n }\n\n /*\\\n * Interactable.origin\n [ method ]\n *\n * Gets or sets the origin of the Interactable's element. The x and y\n * of the origin will be subtracted from action event coordinates.\n *\n - origin (object | string) #optional An object eg. { x: 0, y: 0 } or string 'parent', 'self' or any CSS selector\n * OR\n - origin (Element) #optional An HTML or SVG Element whose rect will be used\n **\n = (object) The current origin or this Interactable\n \\*/\n origin (newValue) {\n return this._backCompatOption('origin', newValue);\n }\n\n /*\\\n * Interactable.deltaSource\n [ method ]\n *\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n - newValue (string) #optional Use 'client' if you will be scrolling while interacting; Use 'page' if you want autoScroll to work\n = (string | object) The current deltaSource or this Interactable\n \\*/\n deltaSource (newValue) {\n if (newValue === 'page' || newValue === 'client') {\n this.options.deltaSource = newValue;\n\n return this;\n }\n\n return this.options.deltaSource;\n }\n\n /*\\\n * Interactable.context\n [ method ]\n *\n * Gets the selector context Node of the Interactable. The default is `window.document`.\n *\n = (Node) The context Node of this Interactable\n **\n \\*/\n context () {\n return this._context;\n }\n\n inContext (element) {\n return (this._context === element.ownerDocument\n || nodeContains(this._context, element));\n }\n\n /*\\\n * Interactable.fire\n [ method ]\n *\n * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n - iEvent (InteractEvent) The InteractEvent object to be fired on this Interactable\n = (Interactable) this Interactable\n \\*/\n fire (iEvent) {\n this.events.fire(iEvent);\n\n return this;\n }\n\n _onOffMultiple (method, eventType, listener, options) {\n if (is.string(eventType) && eventType.search(' ') !== -1) {\n eventType = eventType.trim().split(/ +/);\n }\n\n if (is.array(eventType)) {\n for (let i = 0; i < eventType.length; i++) {\n this[method](eventType[i], listener, options);\n }\n\n return true;\n }\n\n if (is.object(eventType)) {\n for (const prop in eventType) {\n this[method](prop, eventType[prop], listener);\n }\n\n return true;\n }\n }\n\n /*\\\n * Interactable.on\n [ method ]\n *\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n - eventType (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) This Interactable\n \\*/\n on (eventType, listener, options) {\n if (this._onOffMultiple('on', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.on(eventType, listener);\n }\n // delegated event for selector\n else if (is.string(this.target)) {\n events.addDelegate(this.target, this._context, eventType, listener, options);\n }\n else {\n events.add(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.off\n [ method ]\n *\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n - eventType (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) This Interactable\n \\*/\n off (eventType, listener, options) {\n if (this._onOffMultiple('off', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n // if it is an action event type\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.off(eventType, listener);\n }\n // delegated event\n else if (is.string(this.target)) {\n events.removeDelegate(this.target, this._context, eventType, listener, options);\n }\n // remove listener from this Interatable's element\n else {\n events.remove(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.set\n [ method ]\n *\n * Reset the options of this Interactable\n - options (object) The new settings to apply\n = (object) This Interactable\n \\*/\n set (options) {\n if (!is.object(options)) {\n options = {};\n }\n\n this.options = extend({}, defaults.base);\n\n const perActions = extend({}, defaults.perAction);\n\n for (const actionName in actions.methodDict) {\n const methodName = actions.methodDict[actionName];\n\n this.options[actionName] = extend({}, defaults[actionName]);\n\n this.setPerAction(actionName, perActions);\n\n this[methodName](options[actionName]);\n }\n\n for (const setting of Interactable.settingsMethods) {\n this.options[setting] = defaults.base[setting];\n\n if (setting in options) {\n this[setting](options[setting]);\n }\n }\n\n signals.fire('set', {\n options,\n interactable: this,\n });\n\n return this;\n }\n\n /*\\\n * Interactable.unset\n [ method ]\n *\n * Remove this interactable from the list of interactables and remove\n * it's action capabilities and event listeners\n *\n = (object) @interact\n \\*/\n unset () {\n events.remove(this.target, 'all');\n\n if (is.string(this.target)) {\n // remove delegated events\n for (const type in events.delegatedEvents) {\n const delegated = events.delegatedEvents[type];\n\n if (delegated.selectors[0] === this.target\n && delegated.contexts[0] === this._context) {\n\n delegated.selectors.splice(0, 1);\n delegated.contexts .splice(0, 1);\n delegated.listeners.splice(0, 1);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegated[type] = null;\n }\n }\n\n events.remove(this._context, type, events.delegateListener);\n events.remove(this._context, type, events.delegateUseCapture, true);\n }\n }\n else {\n events.remove(this, 'all');\n }\n\n signals.fire('unset', { interactable: this });\n\n scope.interactables.splice(indexOf(scope.interactables, this), 1);\n\n // Stop related interactions when an Interactable is unset\n for (const interaction of scope.interactions || []) {\n if (interaction.target === this && interaction.interacting()) {\n interaction.stop();\n }\n }\n\n return scope.interact;\n }\n}\n\nscope.interactables.indexOfElement = function indexOfElement (target, context) {\n context = context || scope.document;\n\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n if (interactable.target === target && interactable._context === context) {\n return i;\n }\n }\n return -1;\n};\n\nscope.interactables.get = function interactableGet (element, options, dontCheckInContext) {\n const ret = this[this.indexOfElement(element, options && options.context)];\n\n return ret && (is.string(element) || dontCheckInContext || ret.inContext(element))? ret : null;\n};\n\nscope.interactables.forEachSelector = function (callback, element) {\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n // skip non CSS selector targets and out of context elements\n if (!is.string(interactable.target)\n || (element && !interactable.inContext(element))) {\n continue;\n }\n\n const ret = callback(interactable, interactable.target, interactable._context, i, this);\n\n if (ret !== undefined) {\n return ret;\n }\n }\n};\n\n// all interact.js eventTypes\nInteractable.eventTypes = scope.eventTypes = [];\n\nInteractable.signals = signals;\n\nInteractable.settingsMethods = [ 'deltaSource', 'origin', 'preventDefault', 'rectChecker' ];\n\nmodule.exports = Interactable;\n","const scope = require('./scope');\nconst utils = require('./utils');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst finder = require('./utils/interactionFinder');\nconst signals = require('./utils/Signals').new();\n\nconst listeners = {};\nconst methodNames = [\n 'pointerDown', 'pointerMove', 'pointerUp',\n 'updatePointer', 'removePointer',\n];\n\n// for ignoring browser's simulated mouse events\nlet prevTouchTime = 0;\n\n// all active and idle interactions\nscope.interactions = [];\n\nclass Interaction {\n constructor () {\n this.target = null; // current interactable being interacted with\n this.element = null; // the target element of the interactable\n\n this.prepared = { // action that's ready to be fired on next move event\n name : null,\n axis : null,\n edges: null,\n };\n\n // keep track of added pointers\n this.pointers = [];\n this.pointerIds = [];\n this.downTargets = [];\n this.downTimes = [];\n\n // Previous native pointer move event coordinates\n this.prevCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n // current native pointer move event coordinates\n this.curCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Starting InteractEvent pointer coordinates\n this.startCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Change in coordinates and time of the pointer\n this.pointerDelta = {\n page : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n client : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n timeStamp: 0,\n };\n\n this.downEvent = null; // pointerdown/mousedown/touchstart event\n this.downPointer = {};\n\n this._eventTarget = null;\n this._curEventTarget = null;\n\n this.prevEvent = null; // previous action event\n\n this.pointerIsDown = false;\n this.pointerWasMoved = false;\n this._interacting = false;\n\n this.mouse = false;\n\n signals.fire('new', this);\n\n scope.interactions.push(this);\n }\n\n pointerDown (pointer, event, eventTarget) {\n const pointerIndex = this.updatePointer(pointer, event, true);\n\n signals.fire('down', {\n pointer,\n event,\n eventTarget,\n pointerIndex,\n interaction: this,\n });\n }\n\n /*\\\n * Interaction.start\n [ method ]\n *\n * Start an action with the given Interactable and Element as tartgets. The\n * action must be enabled for the target Interactable and an appropriate number\n * of pointers must be held down - 1 for drag/resize, 2 for gesture.\n *\n * Use it with `interactable.able({ manualStart: false })` to always\n * [start actions manually](https://github.com/taye/interact.js/issues/114)\n *\n - action (object) The action to be performed - drag, resize, etc.\n - target (Interactable) The Interactable to target\n - element (Element) The DOM Element to target\n = (object) interact\n **\n | interact(target)\n | .draggable({\n | // disable the default drag start by down->move\n | manualStart: true\n | })\n | // start dragging after the user holds the pointer down\n | .on('hold', function (event) {\n | var interaction = event.interaction;\n |\n | if (!interaction.interacting()) {\n | interaction.start({ name: 'drag' },\n | event.interactable,\n | event.currentTarget);\n | }\n | });\n \\*/\n start (action, target, element) {\n if (this.interacting()\n || !this.pointerIsDown\n || this.pointerIds.length < (action.name === 'gesture'? 2 : 1)) {\n return;\n }\n\n // if this interaction had been removed after stopping\n // add it back\n if (utils.indexOf(scope.interactions, this) === -1) {\n scope.interactions.push(this);\n }\n\n utils.copyAction(this.prepared, action);\n this.target = target;\n this.element = element;\n\n signals.fire('action-start', {\n interaction: this,\n event: this.downEvent,\n });\n }\n\n pointerMove (pointer, event, eventTarget) {\n if (!this.simulation) {\n this.updatePointer(pointer);\n utils.setCoords(this.curCoords, this.pointers);\n }\n\n const duplicateMove = (this.curCoords.page.x === this.prevCoords.page.x\n && this.curCoords.page.y === this.prevCoords.page.y\n && this.curCoords.client.x === this.prevCoords.client.x\n && this.curCoords.client.y === this.prevCoords.client.y);\n\n let dx;\n let dy;\n\n // register movement greater than pointerMoveTolerance\n if (this.pointerIsDown && !this.pointerWasMoved) {\n dx = this.curCoords.client.x - this.startCoords.client.x;\n dy = this.curCoords.client.y - this.startCoords.client.y;\n\n this.pointerWasMoved = utils.hypot(dx, dy) > Interaction.pointerMoveTolerance;\n }\n\n const signalArg = {\n pointer,\n pointerIndex: this.getPointerIndex(pointer),\n event,\n eventTarget,\n dx,\n dy,\n duplicate: duplicateMove,\n interaction: this,\n interactingBeforeMove: this.interacting(),\n };\n\n if (!duplicateMove) {\n // set pointer coordinate, time changes and speeds\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n }\n\n signals.fire('move', signalArg);\n\n if (!duplicateMove) {\n // if interacting, fire an 'action-move' signal etc\n if (this.interacting()) {\n this.doMove(signalArg);\n }\n\n if (this.pointerWasMoved) {\n utils.copyCoords(this.prevCoords, this.curCoords);\n }\n }\n }\n\n /*\\\n * Interaction.doMove\n [ method ]\n *\n * Force a move of the current action at the same coordinates. Useful if\n * snap/restrict has been changed and you want a movement with the new\n * settings.\n *\n **\n | interact(target)\n | .draggable(true)\n | .on('dragmove', function (event) {\n | if (someCondition) {\n | // change the snap settings\n | event.interactable.draggable({ snap: { targets: [] }});\n | // fire another move event with re-calculated snap\n | event.interaction.doMove();\n | }\n | });\n \\*/\n doMove (signalArg) {\n signalArg = utils.extend({\n pointer: this.pointers[0],\n event: this.prevEvent,\n eventTarget: this._eventTarget,\n interaction: this,\n }, signalArg || {});\n\n signals.fire('before-action-move', signalArg);\n\n if (!this._dontFireMove) {\n signals.fire('action-move', signalArg);\n }\n\n this._dontFireMove = false;\n }\n\n // End interact move events and stop auto-scroll unless simulation is running\n pointerUp (pointer, event, eventTarget, curEventTarget) {\n const pointerIndex = this.getPointerIndex(pointer);\n\n signals.fire(/cancel$/i.test(event.type)? 'cancel' : 'up', {\n pointer,\n pointerIndex,\n event,\n eventTarget,\n curEventTarget,\n interaction: this,\n });\n\n if (!this.simulation) {\n this.end(event);\n }\n\n this.pointerIsDown = false;\n this.removePointer(pointer, event);\n }\n\n /*\\\n * Interaction.end\n [ method ]\n *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n - event (PointerEvent) #optional\n **\n | interact(target)\n | .draggable(true)\n | .on('move', function (event) {\n | if (event.pageX > 1000) {\n | // end the current action\n | event.interaction.end();\n | // stop all further listeners from being called\n | event.stopImmediatePropagation();\n | }\n | });\n \\*/\n end (event) {\n event = event || this.prevEvent;\n\n if (this.interacting()) {\n signals.fire('action-end', {\n event,\n interaction: this,\n });\n }\n\n this.stop();\n }\n\n currentAction () {\n return this._interacting? this.prepared.name: null;\n }\n\n interacting () {\n return this._interacting;\n }\n\n stop () {\n signals.fire('stop', { interaction: this });\n\n if (this._interacting) {\n signals.fire('stop-active', { interaction: this });\n signals.fire('stop-' + this.prepared.name, { interaction: this });\n }\n\n this.target = this.element = null;\n\n this._interacting = false;\n this.prepared.name = this.prevEvent = null;\n }\n\n getPointerIndex (pointer) {\n return utils.indexOf(this.pointerIds, utils.getPointerId(pointer));\n }\n\n updatePointer (pointer, event, down = event && /(down|start)$/i.test(event.type)) {\n const id = utils.getPointerId(pointer);\n let index = this.getPointerIndex(pointer);\n\n if (index === -1) {\n index = this.pointerIds.length;\n this.pointerIds[index] = id;\n }\n\n if (down) {\n signals.fire('update-pointer-down', {\n pointer,\n event,\n down,\n pointerId: id,\n pointerIndex: index,\n interaction: this,\n });\n }\n\n this.pointers[index] = pointer;\n\n return index;\n }\n\n removePointer (pointer, event) {\n const id = utils.getPointerId(pointer);\n const index = this.mouse? 0 : utils.indexOf(this.pointerIds, id);\n\n if (index === -1) { return; }\n\n signals.fire('remove-pointer', {\n pointer,\n event,\n pointerIndex: index,\n interaction: this,\n });\n\n this.pointers .splice(index, 1);\n this.pointerIds .splice(index, 1);\n this.downTargets.splice(index, 1);\n this.downTimes .splice(index, 1);\n }\n\n _updateEventTargets (target, currentTarget) {\n this._eventTarget = target;\n this._curEventTarget = currentTarget;\n }\n}\n\nfor (let i = 0, len = methodNames.length; i < len; i++) {\n const method = methodNames[i];\n\n listeners[method] = doOnInteractions(method);\n}\n\nfunction doOnInteractions (method) {\n return (function (event) {\n const [eventTarget, curEventTarget] = utils.getEventTargets(event);\n const matches = []; // [ [pointer, interaction], ...]\n\n if (browser.supportsTouch && /touch/.test(event.type)) {\n prevTouchTime = new Date().getTime();\n\n for (let i = 0; i < event.changedTouches.length; i++) {\n const pointer = event.changedTouches[i];\n const interaction = finder.search(pointer, event.type, eventTarget);\n\n matches.push([pointer, interaction || new Interaction()]);\n }\n }\n else {\n let invalidPointer = false;\n\n if (!browser.supportsPointerEvent && /mouse/.test(event.type)) {\n // ignore mouse events while touch interactions are active\n for (let i = 0; i < scope.interactions.length && !invalidPointer; i++) {\n invalidPointer = !scope.interactions[i].mouse && scope.interactions[i].pointerIsDown;\n }\n\n // try to ignore mouse events that are simulated by the browser\n // after a touch event\n invalidPointer = invalidPointer\n || (new Date().getTime() - prevTouchTime < 500)\n // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated\n || event.timeStamp === 0;\n }\n\n if (!invalidPointer) {\n let interaction = finder.search(event, event.type, eventTarget);\n\n if (!interaction) {\n\n interaction = new Interaction();\n interaction.mouse = (/mouse/i.test(event.pointerType || event.type)\n // MSPointerEvent.MSPOINTER_TYPE_MOUSE\n || event.pointerType === 4\n || !event.pointerType);\n }\n\n matches.push([event, interaction]);\n }\n }\n\n for (const [pointer, interaction] of matches) {\n interaction._updateEventTargets(eventTarget, curEventTarget);\n interaction[method](pointer, event, eventTarget, curEventTarget);\n }\n });\n}\n\nfunction endAll (event) {\n for (let i = 0; i < scope.interactions.length; i++) {\n const interaction = scope.interactions[i];\n\n interaction.end(event);\n signals.fire('endall', { event, interaction });\n }\n}\n\nconst docEvents = { /* 'eventType': listenerFunc */ };\nconst pEventTypes = browser.pEventTypes;\n\nif (scope.PointerEvent) {\n docEvents[pEventTypes.down ] = listeners.pointerDown;\n docEvents[pEventTypes.move ] = listeners.pointerMove;\n docEvents[pEventTypes.up ] = listeners.pointerUp;\n docEvents[pEventTypes.cancel] = listeners.pointerUp;\n}\nelse {\n docEvents.mousedown = listeners.pointerDown;\n docEvents.mousemove = listeners.pointerMove;\n docEvents.mouseup = listeners.pointerUp;\n\n docEvents.touchstart = listeners.pointerDown;\n docEvents.touchmove = listeners.pointerMove;\n docEvents.touchend = listeners.pointerUp;\n docEvents.touchcancel = listeners.pointerUp;\n}\n\ndocEvents.blur = endAll;\n\nfunction onDocSignal ({ doc }, signalName) {\n const eventMethod = signalName.indexOf('add') === 0\n ? events.add : events.remove;\n\n // delegate event listener\n for (const eventType in scope.delegatedEvents) {\n eventMethod(doc, eventType, events.delegateListener);\n eventMethod(doc, eventType, events.delegateUseCapture, true);\n }\n\n for (const eventType in docEvents) {\n eventMethod(doc, eventType, docEvents[eventType]);\n }\n}\n\nsignals.on('update-pointer-down', ({ interaction, pointer, pointerId, pointerIndex, event, eventTarget, down }) => {\n interaction.pointerIds[pointerIndex] = pointerId;\n interaction.pointers[pointerIndex] = pointer;\n\n if (down) {\n interaction.pointerIsDown = true;\n }\n\n if (!interaction.interacting()) {\n utils.setCoords(interaction.startCoords, interaction.pointers);\n\n utils.copyCoords(interaction.curCoords , interaction.startCoords);\n utils.copyCoords(interaction.prevCoords, interaction.startCoords);\n\n interaction.downEvent = event;\n interaction.downTimes[pointerIndex] = interaction.curCoords.timeStamp;\n interaction.downTargets[pointerIndex] = eventTarget || event && utils.getEventTargets(event)[0];\n interaction.pointerWasMoved = false;\n\n utils.pointerExtend(interaction.downPointer, pointer);\n }\n});\n\nscope.signals.on('add-document' , onDocSignal);\nscope.signals.on('remove-document', onDocSignal);\n\nInteraction.pointerMoveTolerance = 1;\nInteraction.doOnInteractions = doOnInteractions;\nInteraction.endAll = endAll;\nInteraction.signals = signals;\nInteraction.docEvents = docEvents;\n\nscope.endAllInteractions = endAll;\n\nmodule.exports = Interaction;\n","const Interaction = require('../Interaction');\nconst InteractEvent = require('../InteractEvent');\n\nconst actions = {\n firePrepared,\n names: [],\n methodDict: {},\n};\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n interaction._interacting = true;\n firePrepared(interaction, event, 'start');\n});\n\nInteraction.signals.on('action-move', function ({ interaction, event, preEnd }) {\n firePrepared(interaction, event, 'move', preEnd);\n\n // if the action was ended in a listener\n if (!interaction.interacting()) { return false; }\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n firePrepared(interaction, event, 'end');\n});\n\nfunction firePrepared (interaction, event, phase, preEnd) {\n const actionName = interaction.prepared.name;\n\n const newEvent = new InteractEvent(interaction, event, actionName, phase, interaction.element, null, preEnd);\n\n interaction.target.fire(newEvent);\n interaction.prevEvent = newEvent;\n}\n\nmodule.exports = actions;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drag = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n startAxis : 'xy',\n lockAxis : 'xy',\n },\n\n checker: function (pointer, event, interactable) {\n const dragOptions = interactable.options.drag;\n\n return dragOptions.enabled\n ? { name: 'drag', axis: (dragOptions.lockAxis === 'start'\n ? dragOptions.startAxis\n : dragOptions.lockAxis)}\n : null;\n },\n\n getCursor: function () {\n return 'move';\n },\n};\n\nInteraction.signals.on('before-action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n interaction.curCoords.page.y = interaction.startCoords.page.y;\n interaction.curCoords.client.y = interaction.startCoords.client.y;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vx);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vx);\n interaction.pointerDelta.client.vy = 0;\n interaction.pointerDelta.page.vy = 0;\n }\n else if (axis === 'y') {\n interaction.curCoords.page.x = interaction.startCoords.page.x;\n interaction.curCoords.client.x = interaction.startCoords.client.x;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vy);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vy);\n interaction.pointerDelta.client.vx = 0;\n interaction.pointerDelta.page.vx = 0;\n }\n});\n\n// dragmove\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'dragmove') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n iEvent.pageY = interaction.startCoords.page.y;\n iEvent.clientY = interaction.startCoords.client.y;\n iEvent.dy = 0;\n }\n else if (axis === 'y') {\n iEvent.pageX = interaction.startCoords.page.x;\n iEvent.clientX = interaction.startCoords.client.x;\n iEvent.dx = 0;\n }\n});\n\n/*\\\n * Interactable.draggable\n [ method ]\n *\n * Gets or sets whether drag actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of drag events\n | var isDraggable = interact('ul li').draggable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on drag events (object makes the Interactable draggable)\n = (object) This Interactable\n | interact(element).draggable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // the axis in which the first movement must be\n | // for the drag sequence to start\n | // 'xy' by default - any direction\n | startAxis: 'x' || 'y' || 'xy',\n |\n | // 'xy' by default - don't restrict to one axis (move in any direction)\n | // 'x' or 'y' to restrict movement to either axis\n | // 'start' to restrict movement to the axis the drag started in\n | lockAxis: 'x' || 'y' || 'xy' || 'start',\n |\n | // max number of drags that can happen concurrently\n | // with elements of this Interactable. Infinity by default\n | max: Infinity,\n |\n | // max number of drags that can target the same element+Interactable\n | // 1 by default\n | maxPerElement: 2\n | });\n\\*/\nInteractable.prototype.draggable = function (options) {\n if (utils.is.object(options)) {\n this.options.drag.enabled = options.enabled === false? false: true;\n this.setPerAction('drag', options);\n this.setOnEvents('drag', options);\n\n if (/^(xy|x|y|start)$/.test(options.lockAxis)) {\n this.options.drag.lockAxis = options.lockAxis;\n }\n if (/^(xy|x|y)$/.test(options.startAxis)) {\n this.options.drag.startAxis = options.startAxis;\n }\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drag.enabled = options;\n\n if (!options) {\n this.ondragstart = this.ondragstart = this.ondragend = null;\n }\n\n return this;\n }\n\n return this.options.drag;\n};\n\nactions.drag = drag;\nactions.names.push('drag');\nutils.merge(Interactable.eventTypes, [\n 'dragstart',\n 'dragmove',\n 'draginertiastart',\n 'draginertiaresume',\n 'dragend',\n]);\nactions.methodDict.drag = 'draggable';\n\ndefaultOptions.drag = drag.defaults;\n\nmodule.exports = drag;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst scope = require('../scope');\nconst interact = require('../interact');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drop = {\n defaults: {\n enabled: false,\n accept : null,\n overlap: 'pointer',\n },\n};\n\nlet dynamicDrop = false;\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // reset active dropzones\n interaction.activeDrops.dropzones = [];\n interaction.activeDrops.elements = [];\n interaction.activeDrops.rects = [];\n\n interaction.dropEvents = null;\n\n if (!interaction.dynamicDrop) {\n setActiveDrops(interaction, interaction.element);\n }\n\n const dragEvent = interaction.prevEvent;\n const dropEvents = getDropEvents(interaction, event, dragEvent);\n\n if (dropEvents.activate) {\n fireActiveDrops(interaction, dropEvents.activate);\n }\n});\n\nInteractEvent.signals.on('new', function ({ interaction, iEvent, event }) {\n if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { return; }\n\n const draggableElement = interaction.element;\n const dragEvent = iEvent;\n const dropResult = getDrop(dragEvent, event, draggableElement);\n\n interaction.dropTarget = dropResult.dropzone;\n interaction.dropElement = dropResult.element;\n\n interaction.dropEvents = getDropEvents(interaction, event, dragEvent);\n});\n\nInteraction.signals.on('action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n fireDropEvents(interaction, interaction.dropEvents);\n});\n\nInteraction.signals.on('action-end', function ({ interaction }) {\n if (interaction.prepared.name === 'drag') {\n fireDropEvents(interaction, interaction.dropEvents);\n }\n});\n\nInteraction.signals.on('stop-drag', function ({ interaction }) {\n interaction.activeDrops.dropzones =\n interaction.activeDrops.elements =\n interaction.activeDrops.rects =\n interaction.dropEvents = null;\n});\n\nfunction collectDrops (interaction, element) {\n const drops = [];\n const elements = [];\n\n element = element || interaction.element;\n\n // collect all dropzones and their elements which qualify for a drop\n for (const current of scope.interactables) {\n if (!current.options.drop.enabled) { continue; }\n\n const accept = current.options.drop.accept;\n\n // test the draggable element against the dropzone's accept setting\n if ((utils.is.element(accept) && accept !== element)\n || (utils.is.string(accept)\n && !utils.matchesSelector(element, accept))) {\n\n continue;\n }\n\n // query for new elements if necessary\n const dropElements = utils.is.string(current.target)\n ? current._context.querySelectorAll(current.target)\n : [current.target];\n\n for (let i = 0; i < dropElements.length; i++) {\n const currentElement = dropElements[i];\n\n if (currentElement !== element) {\n drops.push(current);\n elements.push(currentElement);\n }\n }\n }\n\n return {\n elements,\n dropzones: drops,\n };\n}\n\nfunction fireActiveDrops (interaction, event) {\n let prevElement;\n\n // loop through all active dropzones and trigger event\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n const current = interaction.activeDrops.dropzones[i];\n const currentElement = interaction.activeDrops.elements [i];\n\n // prevent trigger of duplicate events on same element\n if (currentElement !== prevElement) {\n // set current element as event target\n event.target = currentElement;\n current.fire(event);\n }\n prevElement = currentElement;\n }\n}\n\n// Collect a new set of possible drops and save them in activeDrops.\n// setActiveDrops should always be called when a drag has just started or a\n// drag event happens while dynamicDrop is true\nfunction setActiveDrops (interaction, dragElement) {\n // get dropzones and their elements that could receive the draggable\n const possibleDrops = collectDrops(interaction, dragElement, true);\n\n interaction.activeDrops.dropzones = possibleDrops.dropzones;\n interaction.activeDrops.elements = possibleDrops.elements;\n interaction.activeDrops.rects = [];\n\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n interaction.activeDrops.rects[i] =\n interaction.activeDrops.dropzones[i].getRect(interaction.activeDrops.elements[i]);\n }\n}\n\nfunction getDrop (dragEvent, event, dragElement) {\n const interaction = dragEvent.interaction;\n const validDrops = [];\n\n if (dynamicDrop) {\n setActiveDrops(interaction, dragElement);\n }\n\n // collect all dropzones and their elements which qualify for a drop\n for (let j = 0; j < interaction.activeDrops.dropzones.length; j++) {\n const current = interaction.activeDrops.dropzones[j];\n const currentElement = interaction.activeDrops.elements [j];\n const rect = interaction.activeDrops.rects [j];\n\n validDrops.push(current.dropCheck(dragEvent, event, interaction.target, dragElement, currentElement, rect)\n ? currentElement\n : null);\n }\n\n // get the most appropriate dropzone based on DOM depth and order\n const dropIndex = utils.indexOfDeepestElement(validDrops);\n\n return {\n dropzone: interaction.activeDrops.dropzones[dropIndex] || null,\n element : interaction.activeDrops.elements [dropIndex] || null,\n };\n}\n\nfunction getDropEvents (interaction, pointerEvent, dragEvent) {\n const dropEvents = {\n enter : null,\n leave : null,\n activate : null,\n deactivate: null,\n move : null,\n drop : null,\n };\n\n const tmpl = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n };\n\n if (interaction.dropElement !== interaction.prevDropElement) {\n // if there was a prevDropTarget, create a dragleave event\n if (interaction.prevDropTarget) {\n dropEvents.leave = utils.extend({ type: 'dragleave' }, tmpl);\n\n dragEvent.dragLeave = dropEvents.leave.target = interaction.prevDropElement;\n dragEvent.prevDropzone = dropEvents.leave.dropzone = interaction.prevDropTarget;\n }\n // if the dropTarget is not null, create a dragenter event\n if (interaction.dropTarget) {\n dropEvents.enter = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n type : 'dragenter',\n };\n\n dragEvent.dragEnter = interaction.dropElement;\n dragEvent.dropzone = interaction.dropTarget;\n }\n }\n\n if (dragEvent.type === 'dragend' && interaction.dropTarget) {\n dropEvents.drop = utils.extend({ type: 'drop' }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n dragEvent.relatedTarget = interaction.dropElement;\n }\n if (dragEvent.type === 'dragstart') {\n dropEvents.activate = utils.extend({ type: 'dropactivate' }, tmpl);\n\n dropEvents.activate.target = null;\n dropEvents.activate.dropzone = null;\n }\n if (dragEvent.type === 'dragend') {\n dropEvents.deactivate = utils.extend({ type: 'dropdeactivate' }, tmpl);\n\n dropEvents.deactivate.target = null;\n dropEvents.deactivate.dropzone = null;\n }\n if (dragEvent.type === 'dragmove' && interaction.dropTarget) {\n dropEvents.move = utils.extend({\n dragmove : dragEvent,\n type : 'dropmove',\n }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n }\n\n return dropEvents;\n}\n\nfunction fireDropEvents (interaction, dropEvents) {\n if (dropEvents.leave) { interaction.prevDropTarget.fire(dropEvents.leave); }\n if (dropEvents.move ) { interaction.dropTarget.fire(dropEvents.move ); }\n if (dropEvents.enter) { interaction.dropTarget.fire(dropEvents.enter); }\n if (dropEvents.drop ) { interaction.dropTarget.fire(dropEvents.drop ); }\n if (dropEvents.deactivate) {\n fireActiveDrops(interaction, dropEvents.deactivate);\n }\n\n interaction.prevDropTarget = interaction.dropTarget;\n interaction.prevDropElement = interaction.dropElement;\n}\n\n/*\\\n * Interactable.dropzone\n [ method ]\n *\n * Returns or sets whether elements can be dropped onto this\n * Interactable to trigger drop events\n *\n * Dropzones can receive the following events:\n * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends\n * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone\n * - `dragmove` when a draggable that has entered the dropzone is moved\n * - `drop` when a draggable is dropped into this dropzone\n *\n * Use the `accept` option to allow only elements that match the given CSS\n * selector or element. The value can be:\n *\n * - **an Element** - only that element can be dropped into this dropzone.\n * - **a string**, - the element being dragged must match it as a CSS selector.\n * - **`null`** - accept options is cleared - it accepts any element.\n *\n * Use the `overlap` option to set how drops are checked for. The allowed\n * values are:\n *\n * - `'pointer'`, the pointer must be over the dropzone (default)\n * - `'center'`, the draggable element's center must be over the dropzone\n * - a number from 0-1 which is the `(intersection area) / (draggable area)`.\n * e.g. `0.5` for drop to happen when half of the area of the draggable is\n * over the dropzone\n *\n * Use the `checker` option to specify a function to check if a dragged\n * element is over this Interactable.\n *\n | interact(target)\n | .dropChecker(function(dragEvent, // related dragmove or dragend event\n | event, // TouchEvent/PointerEvent/MouseEvent\n | dropped, // bool result of the default checker\n | dropzone, // dropzone Interactable\n | dropElement, // dropzone elemnt\n | draggable, // draggable Interactable\n | draggableElement) {// draggable element\n |\n | return dropped && event.target.hasAttribute('allow-drop');\n | }\n *\n *\n - options (boolean | object | null) #optional The new value to be set.\n | interact('.drop').dropzone({\n | accept: '.can-drop' || document.getElementById('single-drop'),\n | overlap: 'pointer' || 'center' || zeroToOne\n | }\n = (boolean | object) The current setting or this Interactable\n\\*/\nInteractable.prototype.dropzone = function (options) {\n if (utils.is.object(options)) {\n this.options.drop.enabled = options.enabled === false? false: true;\n\n if (utils.is.function(options.ondrop) ) { this.events.ondrop = options.ondrop ; }\n if (utils.is.function(options.ondropactivate) ) { this.events.ondropactivate = options.ondropactivate ; }\n if (utils.is.function(options.ondropdeactivate)) { this.events.ondropdeactivate = options.ondropdeactivate; }\n if (utils.is.function(options.ondragenter) ) { this.events.ondragenter = options.ondragenter ; }\n if (utils.is.function(options.ondragleave) ) { this.events.ondragleave = options.ondragleave ; }\n if (utils.is.function(options.ondropmove) ) { this.events.ondropmove = options.ondropmove ; }\n\n if (/^(pointer|center)$/.test(options.overlap)) {\n this.options.drop.overlap = options.overlap;\n }\n else if (utils.is.number(options.overlap)) {\n this.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0);\n }\n if ('accept' in options) {\n this.options.drop.accept = options.accept;\n }\n if ('checker' in options) {\n this.options.drop.checker = options.checker;\n }\n\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drop.enabled = options;\n\n if (!options) {\n this.ondragenter = this.ondragleave = this.ondrop\n = this.ondropactivate = this.ondropdeactivate = null;\n }\n\n return this;\n }\n\n return this.options.drop;\n};\n\nInteractable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) {\n let dropped = false;\n\n // if the dropzone has no rect (eg. display: none)\n // call the custom dropChecker or just return false\n if (!(rect = rect || this.getRect(dropElement))) {\n return (this.options.drop.checker\n ? this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement)\n : false);\n }\n\n const dropOverlap = this.options.drop.overlap;\n\n if (dropOverlap === 'pointer') {\n const origin = utils.getOriginXY(draggable, draggableElement, 'drag');\n const page = utils.getPageXY(dragEvent);\n\n page.x += origin.x;\n page.y += origin.y;\n\n const horizontal = (page.x > rect.left) && (page.x < rect.right);\n const vertical = (page.y > rect.top ) && (page.y < rect.bottom);\n\n dropped = horizontal && vertical;\n }\n\n const dragRect = draggable.getRect(draggableElement);\n\n if (dragRect && dropOverlap === 'center') {\n const cx = dragRect.left + dragRect.width / 2;\n const cy = dragRect.top + dragRect.height / 2;\n\n dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom;\n }\n\n if (dragRect && utils.is.number(dropOverlap)) {\n const overlapArea = (Math.max(0, Math.min(rect.right , dragRect.right ) - Math.max(rect.left, dragRect.left))\n * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top , dragRect.top )));\n\n const overlapRatio = overlapArea / (dragRect.width * dragRect.height);\n\n dropped = overlapRatio >= dropOverlap;\n }\n\n if (this.options.drop.checker) {\n dropped = this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement);\n }\n\n return dropped;\n};\n\nInteractable.signals.on('unset', function ({ interactable }) {\n interactable.dropzone(false);\n});\n\nInteractable.settingsMethods.push('dropChecker');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.dropTarget = null; // the dropzone a drag target might be dropped into\n interaction.dropElement = null; // the element at the time of checking\n interaction.prevDropTarget = null; // the dropzone that was recently dragged away from\n interaction.prevDropElement = null; // the element at the time of checking\n interaction.dropEvents = null; // the dropEvents related to the current drag event\n\n interaction.activeDrops = {\n dropzones: [], // the dropzones that are mentioned below\n elements : [], // elements of dropzones that accept the target draggable\n rects : [], // the rects of the elements mentioned above\n };\n\n});\n\nInteraction.signals.on('stop', function ({ interaction }) {\n interaction.dropTarget = interaction.dropElement =\n interaction.prevDropTarget = interaction.prevDropElement = null;\n});\n\n/*\\\n * interact.dynamicDrop\n [ method ]\n *\n * Returns or sets whether the dimensions of dropzone elements are\n * calculated on every dragmove or only on dragstart for the default\n * dropChecker\n *\n - newValue (boolean) #optional True to check on each move. False to check only before start\n = (boolean | interact) The current setting or interact\n\\*/\ninteract.dynamicDrop = function (newValue) {\n if (utils.is.bool(newValue)) {\n //if (dragging && dynamicDrop !== newValue && !newValue) {\n //calcRects(dropzones);\n //}\n\n dynamicDrop = newValue;\n\n return interact;\n }\n return dynamicDrop;\n};\n\nutils.merge(Interactable.eventTypes, [\n 'dragenter',\n 'dragleave',\n 'dropactivate',\n 'dropdeactivate',\n 'dropmove',\n 'drop',\n]);\nactions.methodDict.drop = 'dropzone';\n\ndefaultOptions.drop = drop.defaults;\n\nmodule.exports = drop;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst gesture = {\n defaults: {\n enabled : false,\n origin : null,\n restrict: null,\n },\n\n checker: function (pointer, event, interactable, element, interaction) {\n if (interaction.pointerIds.length >= 2) {\n return { name: 'gesture' };\n }\n\n return null;\n },\n\n getCursor: function () {\n return '';\n },\n};\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturestart') { return; }\n iEvent.ds = 0;\n\n interaction.gesture.startDistance = interaction.gesture.prevDistance = iEvent.distance;\n interaction.gesture.startAngle = interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.scale = 1;\n});\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturemove') { return; }\n\n iEvent.ds = iEvent.scale - interaction.gesture.scale;\n\n interaction.target.fire(iEvent);\n\n interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.prevDistance = iEvent.distance;\n\n if (iEvent.scale !== Infinity\n && iEvent.scale !== null\n && iEvent.scale !== undefined\n && !isNaN(iEvent.scale)) {\n\n interaction.gesture.scale = iEvent.scale;\n }\n});\n\n/*\\\n * Interactable.gesturable\n [ method ]\n *\n * Gets or sets whether multitouch gestures can be performed on the\n * Interactable's element\n *\n = (boolean) Indicates if this can be the target of gesture events\n | var isGestureable = interact(element).gesturable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on gesture events (makes the Interactable gesturable)\n = (object) this Interactable\n | interact(element).gesturable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // limit multiple gestures.\n | // See the explanation in @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n\\*/\nInteractable.prototype.gesturable = function (options) {\n if (utils.is.object(options)) {\n this.options.gesture.enabled = options.enabled === false? false: true;\n this.setPerAction('gesture', options);\n this.setOnEvents('gesture', options);\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.gesture.enabled = options;\n\n if (!options) {\n this.ongesturestart = this.ongesturestart = this.ongestureend = null;\n }\n\n return this;\n }\n\n return this.options.gesture;\n};\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action, event, starting, ending, deltaSource }) {\n if (action !== 'gesture') { return; }\n\n const pointers = interaction.pointers;\n\n iEvent.touches = [pointers[0], pointers[1]];\n\n if (starting) {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = 1;\n iEvent.ds = 0;\n iEvent.angle = utils.touchAngle(pointers, undefined, deltaSource);\n iEvent.da = 0;\n }\n else if (ending || event instanceof InteractEvent) {\n iEvent.distance = interaction.prevEvent.distance;\n iEvent.box = interaction.prevEvent.box;\n iEvent.scale = interaction.prevEvent.scale;\n iEvent.ds = iEvent.scale - 1;\n iEvent.angle = interaction.prevEvent.angle;\n iEvent.da = iEvent.angle - interaction.gesture.startAngle;\n }\n else {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = iEvent.distance / interaction.gesture.startDistance;\n iEvent.angle = utils.touchAngle(pointers, interaction.gesture.prevAngle, deltaSource);\n\n iEvent.ds = iEvent.scale - interaction.gesture.prevScale;\n iEvent.da = iEvent.angle - interaction.gesture.prevAngle;\n }\n});\n\nInteraction.signals.on('new', function (interaction) {\n interaction.gesture = {\n start: { x: 0, y: 0 },\n\n startDistance: 0, // distance between two touches of touchStart\n prevDistance : 0,\n distance : 0,\n\n scale: 1, // gesture.distance / gesture.startDistance\n\n startAngle: 0, // angle of line joining two touches\n prevAngle : 0, // angle of the previous gesture event\n };\n});\n\nactions.gesture = gesture;\nactions.names.push('gesture');\nutils.merge(Interactable.eventTypes, [\n 'gesturestart',\n 'gesturemove',\n 'gestureend',\n]);\nactions.methodDict.gesture = 'gesturable';\n\ndefaultOptions.gesture = gesture.defaults;\n\nmodule.exports = gesture;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\n// Less Precision with touch input\nconst defaultMargin = browser.supportsTouch || browser.supportsPointerEvent? 20: 10;\n\nconst resize = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n square: false,\n preserveAspectRatio: false,\n axis: 'xy',\n\n // use default margin\n margin: NaN,\n\n // object with props left, right, top, bottom which are\n // true/false values to resize when the pointer is over that edge,\n // CSS selectors to match the handles for each direction\n // or the Elements for each handle\n edges: null,\n\n // a value of 'none' will limit the resize rect to a minimum of 0x0\n // 'negate' will alow the rect to have negative width/height\n // 'reposition' will keep the width/height positive by swapping\n // the top and bottom edges and/or swapping the left and right edges\n invert: 'none',\n },\n\n checker: function (pointer, event, interactable, element, interaction, rect) {\n if (!rect) { return null; }\n\n const page = utils.extend({}, interaction.curCoords.page);\n const options = interactable.options;\n\n if (options.resize.enabled) {\n const resizeOptions = options.resize;\n const resizeEdges = { left: false, right: false, top: false, bottom: false };\n\n // if using resize.edges\n if (utils.is.object(resizeOptions.edges)) {\n for (const edge in resizeEdges) {\n resizeEdges[edge] = checkResizeEdge(edge,\n resizeOptions.edges[edge],\n page,\n interaction._eventTarget,\n element,\n rect,\n resizeOptions.margin || defaultMargin);\n }\n\n resizeEdges.left = resizeEdges.left && !resizeEdges.right;\n resizeEdges.top = resizeEdges.top && !resizeEdges.bottom;\n\n if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) {\n return {\n name: 'resize',\n edges: resizeEdges,\n };\n }\n }\n else {\n const right = options.resize.axis !== 'y' && page.x > (rect.right - defaultMargin);\n const bottom = options.resize.axis !== 'x' && page.y > (rect.bottom - defaultMargin);\n\n if (right || bottom) {\n return {\n name: 'resize',\n axes: (right? 'x' : '') + (bottom? 'y' : ''),\n };\n }\n }\n }\n\n return null;\n },\n\n cursors: (browser.isIe9OrOlder ? {\n x : 'e-resize',\n y : 's-resize',\n xy: 'se-resize',\n\n top : 'n-resize',\n left : 'w-resize',\n bottom : 's-resize',\n right : 'e-resize',\n topleft : 'se-resize',\n bottomright: 'se-resize',\n topright : 'ne-resize',\n bottomleft : 'ne-resize',\n } : {\n x : 'ew-resize',\n y : 'ns-resize',\n xy: 'nwse-resize',\n\n top : 'ns-resize',\n left : 'ew-resize',\n bottom : 'ns-resize',\n right : 'ew-resize',\n topleft : 'nwse-resize',\n bottomright: 'nwse-resize',\n topright : 'nesw-resize',\n bottomleft : 'nesw-resize',\n }),\n\n getCursor: function (action) {\n if (action.axis) {\n return resize.cursors[action.name + action.axis];\n }\n else if (action.edges) {\n let cursorKey = '';\n const edgeNames = ['top', 'bottom', 'left', 'right'];\n\n for (let i = 0; i < 4; i++) {\n if (action.edges[edgeNames[i]]) {\n cursorKey += edgeNames[i];\n }\n }\n\n return resize.cursors[cursorKey];\n }\n },\n};\n\n// resizestart\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'resizestart' || !interaction.prepared.edges) {\n return;\n }\n\n const startRect = interaction.target.getRect(interaction.element);\n const resizeOptions = interaction.target.options.resize;\n\n /*\n * When using the `resizable.square` or `resizable.preserveAspectRatio` options, resizing from one edge\n * will affect another. E.g. with `resizable.square`, resizing to make the right edge larger will make\n * the bottom edge larger by the same amount. We call these 'linked' edges. Any linked edges will depend\n * on the active edges and the edge being interacted with.\n */\n if (resizeOptions.square || resizeOptions.preserveAspectRatio) {\n const linkedEdges = utils.extend({}, interaction.prepared.edges);\n\n linkedEdges.top = linkedEdges.top || (linkedEdges.left && !linkedEdges.bottom);\n linkedEdges.left = linkedEdges.left || (linkedEdges.top && !linkedEdges.right );\n linkedEdges.bottom = linkedEdges.bottom || (linkedEdges.right && !linkedEdges.top );\n linkedEdges.right = linkedEdges.right || (linkedEdges.bottom && !linkedEdges.left );\n\n interaction.prepared._linkedEdges = linkedEdges;\n }\n else {\n interaction.prepared._linkedEdges = null;\n }\n\n // if using `resizable.preserveAspectRatio` option, record aspect ratio at the start of the resize\n if (resizeOptions.preserveAspectRatio) {\n interaction.resizeStartAspectRatio = startRect.width / startRect.height;\n }\n\n interaction.resizeRects = {\n start : startRect,\n current : utils.extend({}, startRect),\n inverted : utils.extend({}, startRect),\n previous : utils.extend({}, startRect),\n delta : {\n left: 0, right : 0, width : 0,\n top : 0, bottom: 0, height: 0,\n },\n };\n\n iEvent.rect = interaction.resizeRects.inverted;\n iEvent.deltaRect = interaction.resizeRects.delta;\n});\n\n// resizemove\nInteractEvent.signals.on('new', function ({ iEvent, phase, interaction }) {\n if (phase !== 'move' || !interaction.prepared.edges) { return; }\n\n const resizeOptions = interaction.target.options.resize;\n const invert = resizeOptions.invert;\n const invertible = invert === 'reposition' || invert === 'negate';\n\n let edges = interaction.prepared.edges;\n\n const start = interaction.resizeRects.start;\n const current = interaction.resizeRects.current;\n const inverted = interaction.resizeRects.inverted;\n const delta = interaction.resizeRects.delta;\n const previous = utils.extend(interaction.resizeRects.previous, inverted);\n const originalEdges = edges;\n\n let dx = iEvent.dx;\n let dy = iEvent.dy;\n\n if (resizeOptions.preserveAspectRatio || resizeOptions.square) {\n // `resize.preserveAspectRatio` takes precedence over `resize.square`\n const startAspectRatio = resizeOptions.preserveAspectRatio\n ? interaction.resizeStartAspectRatio\n : 1;\n\n edges = interaction.prepared._linkedEdges;\n\n if ((originalEdges.left && originalEdges.bottom)\n || (originalEdges.right && originalEdges.top)) {\n dy = -dx / startAspectRatio;\n }\n else if (originalEdges.left || originalEdges.right ) { dy = dx / startAspectRatio; }\n else if (originalEdges.top || originalEdges.bottom) { dx = dy * startAspectRatio; }\n }\n\n // update the 'current' rect without modifications\n if (edges.top ) { current.top += dy; }\n if (edges.bottom) { current.bottom += dy; }\n if (edges.left ) { current.left += dx; }\n if (edges.right ) { current.right += dx; }\n\n if (invertible) {\n // if invertible, copy the current rect\n utils.extend(inverted, current);\n\n if (invert === 'reposition') {\n // swap edge values if necessary to keep width/height positive\n let swap;\n\n if (inverted.top > inverted.bottom) {\n swap = inverted.top;\n\n inverted.top = inverted.bottom;\n inverted.bottom = swap;\n }\n if (inverted.left > inverted.right) {\n swap = inverted.left;\n\n inverted.left = inverted.right;\n inverted.right = swap;\n }\n }\n }\n else {\n // if not invertible, restrict to minimum of 0x0 rect\n inverted.top = Math.min(current.top, start.bottom);\n inverted.bottom = Math.max(current.bottom, start.top);\n inverted.left = Math.min(current.left, start.right);\n inverted.right = Math.max(current.right, start.left);\n }\n\n inverted.width = inverted.right - inverted.left;\n inverted.height = inverted.bottom - inverted.top ;\n\n for (const edge in inverted) {\n delta[edge] = inverted[edge] - previous[edge];\n }\n\n iEvent.edges = interaction.prepared.edges;\n iEvent.rect = inverted;\n iEvent.deltaRect = delta;\n});\n\n/*\\\n * Interactable.resizable\n [ method ]\n *\n * Gets or sets whether resize actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of resize elements\n | var isResizeable = interact('input[type=text]').resizable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on resize events (object makes the Interactable resizable)\n = (object) This Interactable\n | interact(element).resizable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | edges: {\n | top : true, // Use pointer coords to check for resize.\n | left : false, // Disable resizing from left edge.\n | bottom: '.resize-s',// Resize if pointer target matches selector\n | right : handleEl // Resize if pointer target is the given Element\n | },\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height are adjusted at a 1:1 ratio.\n | square: false,\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height maintain the aspect ratio they had when resizing started.\n | preserveAspectRatio: false,\n |\n | // a value of 'none' will limit the resize rect to a minimum of 0x0\n | // 'negate' will allow the rect to have negative width/height\n | // 'reposition' will keep the width/height positive by swapping\n | // the top and bottom edges and/or swapping the left and right edges\n | invert: 'none' || 'negate' || 'reposition'\n |\n | // limit multiple resizes.\n | // See the explanation in the @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n \\*/\nInteractable.prototype.resizable = function (options) {\n if (utils.is.object(options)) {\n this.options.resize.enabled = options.enabled === false? false: true;\n this.setPerAction('resize', options);\n this.setOnEvents('resize', options);\n\n if (/^x$|^y$|^xy$/.test(options.axis)) {\n this.options.resize.axis = options.axis;\n }\n else if (options.axis === null) {\n this.options.resize.axis = defaultOptions.resize.axis;\n }\n\n if (utils.is.bool(options.preserveAspectRatio)) {\n this.options.resize.preserveAspectRatio = options.preserveAspectRatio;\n }\n else if (utils.is.bool(options.square)) {\n this.options.resize.square = options.square;\n }\n\n return this;\n }\n if (utils.is.bool(options)) {\n this.options.resize.enabled = options;\n\n if (!options) {\n this.onresizestart = this.onresizestart = this.onresizeend = null;\n }\n\n return this;\n }\n return this.options.resize;\n};\n\nfunction checkResizeEdge (name, value, page, element, interactableElement, rect, margin) {\n // false, '', undefined, null\n if (!value) { return false; }\n\n // true value, use pointer coords and element rect\n if (value === true) {\n // if dimensions are negative, \"switch\" edges\n const width = utils.is.number(rect.width )? rect.width : rect.right - rect.left;\n const height = utils.is.number(rect.height)? rect.height : rect.bottom - rect.top ;\n\n if (width < 0) {\n if (name === 'left' ) { name = 'right'; }\n else if (name === 'right') { name = 'left' ; }\n }\n if (height < 0) {\n if (name === 'top' ) { name = 'bottom'; }\n else if (name === 'bottom') { name = 'top' ; }\n }\n\n if (name === 'left' ) { return page.x < ((width >= 0? rect.left: rect.right ) + margin); }\n if (name === 'top' ) { return page.y < ((height >= 0? rect.top : rect.bottom) + margin); }\n\n if (name === 'right' ) { return page.x > ((width >= 0? rect.right : rect.left) - margin); }\n if (name === 'bottom') { return page.y > ((height >= 0? rect.bottom: rect.top ) - margin); }\n }\n\n // the remaining checks require an element\n if (!utils.is.element(element)) { return false; }\n\n return utils.is.element(value)\n // the value is an element to use as a resize handle\n ? value === element\n // otherwise check if element matches value as selector\n : utils.matchesUpTo(element, value, interactableElement);\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.resizeAxes = 'xy';\n});\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action }) {\n if (action !== 'resize' || !interaction.resizeAxes) { return; }\n\n const options = interaction.target.options;\n\n if (options.resize.square) {\n if (interaction.resizeAxes === 'y') {\n iEvent.dx = iEvent.dy;\n }\n else {\n iEvent.dy = iEvent.dx;\n }\n iEvent.axes = 'xy';\n }\n else {\n iEvent.axes = interaction.resizeAxes;\n\n if (interaction.resizeAxes === 'x') {\n iEvent.dy = 0;\n }\n else if (interaction.resizeAxes === 'y') {\n iEvent.dx = 0;\n }\n }\n});\n\nactions.resize = resize;\nactions.names.push('resize');\nutils.merge(Interactable.eventTypes, [\n 'resizestart',\n 'resizemove',\n 'resizeinertiastart',\n 'resizeinertiaresume',\n 'resizeend',\n]);\nactions.methodDict.resize = 'resizable';\n\ndefaultOptions.resize = resize.defaults;\n\nmodule.exports = resize;\n","const raf = require('./utils/raf');\nconst getWindow = require('./utils/window').getWindow;\nconst is = require('./utils/is');\nconst domUtils = require('./utils/domUtils');\nconst Interaction = require('./Interaction');\nconst defaultOptions = require('./defaultOptions');\n\nconst autoScroll = {\n defaults: {\n enabled : false,\n container: null, // the item that is scrolled (Window or HTMLElement)\n margin : 60,\n speed : 300, // the scroll speed in pixels per second\n },\n\n interaction: null,\n i: null, // the handle returned by window.setInterval\n x: 0, y: 0, // Direction each pulse is to scroll in\n\n isScrolling: false,\n prevTime: 0,\n\n start: function (interaction) {\n autoScroll.isScrolling = true;\n raf.cancel(autoScroll.i);\n\n autoScroll.interaction = interaction;\n autoScroll.prevTime = new Date().getTime();\n autoScroll.i = raf.request(autoScroll.scroll);\n },\n\n stop: function () {\n autoScroll.isScrolling = false;\n raf.cancel(autoScroll.i);\n },\n\n // scroll the window by the values in scroll.x/y\n scroll: function () {\n const options = autoScroll.interaction.target.options[autoScroll.interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(autoScroll.interaction.element);\n const now = new Date().getTime();\n // change in time in seconds\n const dt = (now - autoScroll.prevTime) / 1000;\n // displacement\n const s = options.speed * dt;\n\n if (s >= 1) {\n if (is.window(container)) {\n container.scrollBy(autoScroll.x * s, autoScroll.y * s);\n }\n else if (container) {\n container.scrollLeft += autoScroll.x * s;\n container.scrollTop += autoScroll.y * s;\n }\n\n autoScroll.prevTime = now;\n }\n\n if (autoScroll.isScrolling) {\n raf.cancel(autoScroll.i);\n autoScroll.i = raf.request(autoScroll.scroll);\n }\n },\n check: function (interactable, actionName) {\n const options = interactable.options;\n\n return options[actionName].autoScroll && options[actionName].autoScroll.enabled;\n },\n onInteractionMove: function ({ interaction, pointer }) {\n if (!(interaction.interacting()\n && autoScroll.check(interaction.target, interaction.prepared.name))) {\n return;\n }\n\n if (interaction.simulation) {\n autoScroll.x = autoScroll.y = 0;\n return;\n }\n\n let top;\n let right;\n let bottom;\n let left;\n\n const options = interaction.target.options[interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(interaction.element);\n\n if (is.window(container)) {\n left = pointer.clientX < autoScroll.margin;\n top = pointer.clientY < autoScroll.margin;\n right = pointer.clientX > container.innerWidth - autoScroll.margin;\n bottom = pointer.clientY > container.innerHeight - autoScroll.margin;\n }\n else {\n const rect = domUtils.getElementClientRect(container);\n\n left = pointer.clientX < rect.left + autoScroll.margin;\n top = pointer.clientY < rect.top + autoScroll.margin;\n right = pointer.clientX > rect.right - autoScroll.margin;\n bottom = pointer.clientY > rect.bottom - autoScroll.margin;\n }\n\n autoScroll.x = (right ? 1: left? -1: 0);\n autoScroll.y = (bottom? 1: top? -1: 0);\n\n if (!autoScroll.isScrolling) {\n // set the autoScroll properties to those of the target\n autoScroll.margin = options.margin;\n autoScroll.speed = options.speed;\n\n autoScroll.start(interaction);\n }\n },\n};\n\nInteraction.signals.on('stop-active', function () {\n autoScroll.stop();\n});\n\nInteraction.signals.on('action-move', autoScroll.onInteractionMove);\n\ndefaultOptions.perAction.autoScroll = autoScroll.defaults;\n\nmodule.exports = autoScroll;\n","const Interactable = require('../Interactable');\nconst actions = require('../actions/base');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.ignoreFrom\n [ method ]\n *\n * If the target of the `mousedown`, `pointerdown` or `touchstart`\n * event or any of it's parents match the given CSS selector or\n * Element, no drag/resize/gesture is started.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to not ignore any elements\n = (string | Element | object) The current ignoreFrom value or this Interactable\n **\n | interact(element, { ignoreFrom: document.getElementById('no-action') });\n | // or\n | interact(element).ignoreFrom('input, textarea, a');\n\\*/\nInteractable.prototype.ignoreFrom = function (newValue) {\n return this._backCompatOption('ignoreFrom', newValue);\n};\n\n/*\\\n * Interactable.allowFrom\n [ method ]\n *\n * A drag/resize/gesture is started only If the target of the\n * `mousedown`, `pointerdown` or `touchstart` event or any of it's\n * parents match the given CSS selector or Element.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to allow from any element\n = (string | Element | object) The current allowFrom value or this Interactable\n **\n | interact(element, { allowFrom: document.getElementById('drag-handle') });\n | // or\n | interact(element).allowFrom('.handle');\n\\*/\nInteractable.prototype.allowFrom = function (newValue) {\n return this._backCompatOption('allowFrom', newValue);\n};\n\nInteractable.prototype.testIgnore = function (ignoreFrom, interactableElement, element) {\n if (!ignoreFrom || !is.element(element)) { return false; }\n\n if (is.string(ignoreFrom)) {\n return domUtils.matchesUpTo(element, ignoreFrom, interactableElement);\n }\n else if (is.element(ignoreFrom)) {\n return domUtils.nodeContains(ignoreFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testAllow = function (allowFrom, interactableElement, element) {\n if (!allowFrom) { return true; }\n\n if (!is.element(element)) { return false; }\n\n if (is.string(allowFrom)) {\n return domUtils.matchesUpTo(element, allowFrom, interactableElement);\n }\n else if (is.element(allowFrom)) {\n return domUtils.nodeContains(allowFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testIgnoreAllow = function (options, interactableElement, eventTarget) {\n return (!this.testIgnore(options.ignoreFrom, interactableElement, eventTarget)\n && this.testAllow(options.allowFrom, interactableElement, eventTarget));\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (event.buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\n","const interact = require('../interact');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst actions = require('../actions/base');\nconst defaultOptions = require('../defaultOptions');\nconst browser = require('../utils/browser');\nconst scope = require('../scope');\nconst utils = require('../utils');\nconst signals = require('../utils/Signals').new();\n\nrequire('./InteractableMethods');\n\nconst autoStart = {\n signals,\n withinInteractionLimit,\n // Allow this many interactions to happen simultaneously\n maxInteractions: Infinity,\n defaults: {\n perAction: {\n manualStart: false,\n max: Infinity,\n maxPerElement: 1,\n allowFrom: null,\n ignoreFrom: null,\n },\n },\n setActionDefaults: function (action) {\n utils.extend(action.defaults, autoStart.defaults.perAction);\n },\n};\n\n// set cursor style on mousedown\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget }) {\n if (interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\n// set cursor style on mousemove\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget }) {\n if (!interaction.mouse\n || interaction.pointerIsDown\n || interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\nInteraction.signals.on('move', function (arg) {\n const { interaction, event } = arg;\n\n if (!interaction.pointerIsDown\n || interaction.interacting()\n || !interaction.pointerWasMoved\n || !interaction.prepared.name) {\n return;\n }\n\n signals.fire('before-start', arg);\n\n const target = interaction.target;\n\n if (interaction.prepared.name && target) {\n // check manualStart and interaction limit\n if (target.options[interaction.prepared.name].manualStart\n || !withinInteractionLimit(target, interaction.element, interaction.prepared)) {\n interaction.stop(event);\n }\n else {\n interaction.start(interaction.prepared, target, interaction.element);\n }\n }\n});\n\n// Check if the current target supports the action.\n// If so, return the validated action. Otherwise, return null\nfunction validateAction (action, interactable, element, eventTarget) {\n if (utils.is.object(action)\n && interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget)\n && interactable.options[action.name].enabled\n && withinInteractionLimit(interactable, element, action)) {\n return action;\n }\n\n return null;\n}\n\nfunction validateSelector (interaction, pointer, event, matches, matchElements, eventTarget) {\n for (let i = 0, len = matches.length; i < len; i++) {\n const match = matches[i];\n const matchElement = matchElements[i];\n const action = validateAction(match.getAction(pointer, event, interaction, matchElement),\n match,\n matchElement,\n eventTarget);\n\n if (action) {\n return {\n action,\n target: match,\n element: matchElement,\n };\n }\n }\n\n return {};\n}\n\nfunction getActionInfo (interaction, pointer, event, eventTarget) {\n let matches = [];\n let matchElements = [];\n\n let element = eventTarget;\n let action = null;\n\n function pushMatches (interactable, selector, context) {\n const elements = (browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined);\n\n if (utils.matchesSelector(element, selector, elements)) {\n\n matches.push(interactable);\n matchElements.push(element);\n }\n }\n\n while (utils.is.element(element)) {\n matches = [];\n matchElements = [];\n\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && (action = validateAction(elementInteractable.getAction(pointer, event, interaction, element, eventTarget),\n elementInteractable,\n element,\n eventTarget))\n && !elementInteractable.options[action.name].manualStart) {\n return {\n element,\n action,\n target: elementInteractable,\n };\n }\n else {\n scope.interactables.forEachSelector(pushMatches, element);\n\n const actionInfo = validateSelector(interaction, pointer, event, matches, matchElements, eventTarget);\n\n if (actionInfo.action\n && !actionInfo.target.options[actionInfo.action.name].manualStart) {\n return actionInfo;\n }\n }\n\n element = utils.parentNode(element);\n }\n\n return {};\n}\n\nfunction prepare (interaction, { action, target, element }) {\n action = action || {};\n\n if (interaction.target && interaction.target.options.styleCursor) {\n interaction.target._doc.documentElement.style.cursor = '';\n }\n\n interaction.target = target;\n interaction.element = element;\n utils.copyAction(interaction.prepared, action);\n\n if (target && target.options.styleCursor) {\n const cursor = action? actions[action.name].getCursor(action) : '';\n interaction.target._doc.documentElement.style.cursor = cursor;\n }\n\n signals.fire('prepared', { interaction: interaction });\n}\n\nInteraction.signals.on('stop', function ({ interaction }) {\n const target = interaction.target;\n\n if (target && target.options.styleCursor) {\n target._doc.documentElement.style.cursor = '';\n }\n});\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (utils.is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (utils.is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n const buttons = event.buttons || ({\n 0: 1,\n 1: 4,\n 3: 8,\n 4: 16,\n })[event.button];\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\nfunction withinInteractionLimit (interactable, element, action) {\n const options = interactable.options;\n const maxActions = options[action.name].max;\n const maxPerElement = options[action.name].maxPerElement;\n let activeInteractions = 0;\n let targetCount = 0;\n let targetElementCount = 0;\n\n // no actions if any of these values == 0\n if (!(maxActions && maxPerElement && autoStart.maxInteractions)) { return; }\n\n for (let i = 0, len = scope.interactions.length; i < len; i++) {\n const interaction = scope.interactions[i];\n const otherAction = interaction.prepared.name;\n\n if (!interaction.interacting()) { continue; }\n\n activeInteractions++;\n\n if (activeInteractions >= autoStart.maxInteractions) {\n return false;\n }\n\n if (interaction.target !== interactable) { continue; }\n\n targetCount += (otherAction === action.name)|0;\n\n if (targetCount >= maxActions) {\n return false;\n }\n\n if (interaction.element === element) {\n targetElementCount++;\n\n if (otherAction !== action.name || targetElementCount >= maxPerElement) {\n return false;\n }\n }\n }\n\n return autoStart.maxInteractions > 0;\n}\n\n/*\\\n * interact.maxInteractions\n [ method ]\n **\n * Returns or sets the maximum number of concurrent interactions allowed.\n * By default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables\n * and elements, you need to enable it in the draggable, resizable and\n * gesturable `'max'` and `'maxPerElement'` options.\n **\n - newValue (number) #optional Any number. newValue <= 0 means no interactions.\n\\*/\ninteract.maxInteractions = function (newValue) {\n if (utils.is.number(newValue)) {\n autoStart.maxInteractions = newValue;\n\n return this;\n }\n\n return autoStart.maxInteractions;\n};\n\nInteractable.settingsMethods.push('styleCursor');\nInteractable.settingsMethods.push('actionChecker');\nInteractable.settingsMethods.push('ignoreFrom');\nInteractable.settingsMethods.push('allowFrom');\n\ndefaultOptions.base.actionChecker = null;\ndefaultOptions.base.styleCursor = true;\n\nutils.extend(defaultOptions.perAction, autoStart.defaults.perAction);\n\nmodule.exports = autoStart;\n","const autoStart = require('./base');\nconst Interaction = require('../Interaction');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.delayTimer = null;\n});\n\nautoStart.signals.on('prepared', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.delayTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.target, interaction.element);\n }, delay);\n }\n});\n\nInteraction.signals.on('move', function ({ interaction, duplicate }) {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.delayTimer);\n }\n});\n\n// prevent regular down->move autoStart\nautoStart.signals.on('before-start', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.prepared.name = null;\n }\n});\n","const autoStart = require('./base');\nconst scope = require('../scope');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\n\nconst { matchesSelector, parentNode } = require('../utils/domUtils');\n\nautoStart.setActionDefaults(require('../actions/drag'));\n\nautoStart.signals.on('before-start', function ({ interaction, eventTarget, dx, dy }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // check if a drag is in the correct axis\n const absX = Math.abs(dx);\n const absY = Math.abs(dy);\n const options = interaction.target.options.drag;\n const startAxis = options.startAxis;\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy');\n\n interaction.prepared.axis = options.lockAxis === 'start'\n ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n : options.lockAxis;\n\n // if the movement isn't in the startAxis of the interactable\n if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) {\n // cancel the prepared action\n interaction.prepared.name = null;\n\n // then try to get a drag from another ineractable\n\n if (!interaction.prepared.name) {\n\n let element = eventTarget;\n\n const getDraggable = function (interactable, selector, context) {\n const elements = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n if (interactable === interaction.target) { return; }\n\n if (!options.manualStart\n && !interactable.testIgnoreAllow(options, element, eventTarget)\n && matchesSelector(element, selector, elements)) {\n\n const action = interactable.getAction(interaction.downPointer,\n interaction.downEvent,\n interaction,\n element);\n\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, interactable)\n && autoStart.validateAction(action, interactable, element, eventTarget)) {\n\n return interactable;\n }\n }\n };\n\n let action = null;\n\n // check all interactables\n while (is.element(element)) {\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && elementInteractable !== interaction.target\n && !elementInteractable.options.drag.manualStart) {\n\n action = elementInteractable.getAction(interaction.downPointer, interaction.downEvent, interaction, element);\n }\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, elementInteractable)) {\n\n interaction.prepared.name = 'drag';\n interaction.target = elementInteractable;\n interaction.element = element;\n break;\n }\n\n const selectorInteractable = scope.interactables.forEachSelector(getDraggable, element);\n\n if (selectorInteractable) {\n interaction.prepared.name = 'drag';\n interaction.target = selectorInteractable;\n interaction.element = element;\n break;\n }\n\n element = parentNode(element);\n }\n }\n }\n});\n\nfunction checkStartAxis (startAxis, interactable) {\n if (!interactable) { return false; }\n\n const thisAxis = interactable.options.drag.startAxis;\n\n return (startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis);\n}\n","require('./base').setActionDefaults(require('../actions/gesture'));\n","require('./base').setActionDefaults(require('../actions/resize'));\n","module.exports = {\n base: {\n accept : null,\n preventDefault: 'auto',\n deltaSource : 'page',\n },\n\n perAction: {\n origin: { x: 0, y: 0 },\n\n // only allow left button by default\n // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n mouseButtons: 1,\n\n inertia: {\n enabled : false,\n resistance : 10, // the lambda in exponential decay\n minSpeed : 100, // target speed must be above this for inertia to start\n endSpeed : 10, // the speed at which inertia is slow enough to stop\n allowResume : true, // allow resuming an action in inertia phase\n smoothEndDuration: 300, // animate to snap/restrict endOnly if there's no inertia\n },\n },\n};\n","/* browser entry point */\n\n// Legacy browser support\nrequire('./legacyBrowsers');\n\n// inertia\nrequire('./inertia');\n\n// modifiers\nrequire('./modifiers/snap');\nrequire('./modifiers/restrict');\n\n// pointerEvents\nrequire('./pointerEvents/base');\nrequire('./pointerEvents/holdRepeat');\nrequire('./pointerEvents/interactableTargets');\n\n// delay\nrequire('./autoStart/delay');\n\n// actions\nrequire('./actions/gesture');\nrequire('./actions/resize');\nrequire('./actions/drag');\nrequire('./actions/drop');\n\n// load these modifiers after resize is loaded\nrequire('./modifiers/snapSize');\nrequire('./modifiers/restrictEdges');\nrequire('./modifiers/restrictSize');\n\n// autoStart actions\nrequire('./autoStart/gesture');\nrequire('./autoStart/resize');\nrequire('./autoStart/drag');\n\n// Interactable preventDefault setting\nrequire('./interactablePreventDefault.js');\n\n// autoScroll\nrequire('./autoScroll');\n\n// export interact\nmodule.exports = require('./interact');\n","const InteractEvent = require('./InteractEvent');\nconst Interaction = require('./Interaction');\nconst modifiers = require('./modifiers');\nconst utils = require('./utils');\nconst animationFrame = require('./utils/raf');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.inertiaStatus = {\n active : false,\n smoothEnd : false,\n allowResume: false,\n\n startEvent: null,\n upCoords : {},\n\n xe: 0, ye: 0,\n sx: 0, sy: 0,\n\n t0: 0,\n vx0: 0, vys: 0,\n duration: 0,\n\n lambda_v0: 0,\n one_ve_v0: 0,\n i : null,\n };\n\n interaction.boundInertiaFrame = () => inertiaFrame .apply(interaction);\n interaction.boundSmoothEndFrame = () => smoothEndFrame.apply(interaction);\n});\n\nInteraction.signals.on('down', function ({ interaction, event, pointer, eventTarget }) {\n const status = interaction.inertiaStatus;\n\n // Check if the down event hits the current inertia target\n if (status.active) {\n let element = eventTarget;\n\n // climb up the DOM tree from the event target\n while (utils.is.element(element)) {\n\n // if interaction element is the current inertia target element\n if (element === interaction.element) {\n // stop inertia\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n\n // update pointers to the down event's coordinates\n interaction.updatePointer(pointer);\n utils.setCoords(interaction.curCoords, interaction.pointers);\n\n // fire appropriate signals\n const signalArg = { interaction };\n Interaction.signals.fire('before-action-move', signalArg);\n Interaction.signals.fire('action-resume' , signalArg);\n\n // fire a reume event\n const resumeEvent = new InteractEvent(interaction,\n event,\n interaction.prepared.name,\n 'inertiaresume',\n interaction.element);\n\n interaction.target.fire(resumeEvent);\n interaction.prevEvent = resumeEvent;\n modifiers.resetStatuses(interaction.modifierStatuses);\n\n utils.copyCoords(interaction.prevCoords, interaction.curCoords);\n break;\n }\n\n element = utils.parentNode(element);\n }\n }\n});\n\nInteraction.signals.on('up', function ({ interaction, event }) {\n const status = interaction.inertiaStatus;\n\n if (!interaction.interacting() || status.active) { return; }\n\n const target = interaction.target;\n const options = target && target.options;\n const inertiaOptions = options && interaction.prepared.name && options[interaction.prepared.name].inertia;\n\n const now = new Date().getTime();\n const statuses = {};\n const page = utils.extend({}, interaction.curCoords.page);\n const pointerSpeed = interaction.pointerDelta.client.speed;\n\n let smoothEnd = false;\n let modifierResult;\n\n // check if inertia should be started\n const inertiaPossible = (inertiaOptions && inertiaOptions.enabled\n && interaction.prepared.name !== 'gesture'\n && event !== status.startEvent);\n\n const inertia = (inertiaPossible\n && (now - interaction.curCoords.timeStamp) < 50\n && pointerSpeed > inertiaOptions.minSpeed\n && pointerSpeed > inertiaOptions.endSpeed);\n\n const modifierArg = {\n interaction,\n pageCoords: page,\n statuses,\n preEnd: true,\n requireEndOnly: true,\n };\n\n // smoothEnd\n if (inertiaPossible && !inertia) {\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n if (modifierResult.shouldMove && modifierResult.locked) {\n smoothEnd = true;\n }\n }\n\n if (!(inertia || smoothEnd)) { return; }\n\n utils.copyCoords(status.upCoords, interaction.curCoords);\n\n interaction.pointers[0] = status.startEvent =\n new InteractEvent(interaction, event, interaction.prepared.name, 'inertiastart', interaction.element);\n\n status.t0 = now;\n\n status.active = true;\n status.allowResume = inertiaOptions.allowResume;\n interaction.simulation = status;\n\n target.fire(status.startEvent);\n\n if (inertia) {\n status.vx0 = interaction.pointerDelta.client.vx;\n status.vy0 = interaction.pointerDelta.client.vy;\n status.v0 = pointerSpeed;\n\n calcInertia(interaction, status);\n\n utils.extend(page, interaction.curCoords.page);\n\n page.x += status.xe;\n page.y += status.ye;\n\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n status.modifiedXe += modifierResult.dx;\n status.modifiedYe += modifierResult.dy;\n\n status.i = animationFrame.request(interaction.boundInertiaFrame);\n }\n else {\n status.smoothEnd = true;\n status.xe = modifierResult.dx;\n status.ye = modifierResult.dy;\n\n status.sx = status.sy = 0;\n\n status.i = animationFrame.request(interaction.boundSmoothEndFrame);\n }\n});\n\nInteraction.signals.on('stop-active', function ({ interaction }) {\n const status = interaction.inertiaStatus;\n\n if (status.active) {\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n }\n});\n\nfunction calcInertia (interaction, status) {\n const inertiaOptions = interaction.target.options[interaction.prepared.name].inertia;\n const lambda = inertiaOptions.resistance;\n const inertiaDur = -Math.log(inertiaOptions.endSpeed / status.v0) / lambda;\n\n status.x0 = interaction.prevEvent.pageX;\n status.y0 = interaction.prevEvent.pageY;\n status.t0 = status.startEvent.timeStamp / 1000;\n status.sx = status.sy = 0;\n\n status.modifiedXe = status.xe = (status.vx0 - inertiaDur) / lambda;\n status.modifiedYe = status.ye = (status.vy0 - inertiaDur) / lambda;\n status.te = inertiaDur;\n\n status.lambda_v0 = lambda / status.v0;\n status.one_ve_v0 = 1 - inertiaOptions.endSpeed / status.v0;\n}\n\nfunction inertiaFrame () {\n updateInertiaCoords(this);\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n\n const status = this.inertiaStatus;\n const options = this.target.options[this.prepared.name].inertia;\n const lambda = options.resistance;\n const t = new Date().getTime() / 1000 - status.t0;\n\n if (t < status.te) {\n\n const progress = 1 - (Math.exp(-lambda * t) - status.lambda_v0) / status.one_ve_v0;\n\n if (status.modifiedXe === status.xe && status.modifiedYe === status.ye) {\n status.sx = status.xe * progress;\n status.sy = status.ye * progress;\n }\n else {\n const quadPoint = utils.getQuadraticCurvePoint(0, 0,\n status.xe,\n status.ye,\n status.modifiedXe,\n status.modifiedYe,\n progress);\n\n status.sx = quadPoint.x;\n status.sy = quadPoint.y;\n }\n\n this.doMove();\n\n status.i = animationFrame.request(this.boundInertiaFrame);\n }\n else {\n status.sx = status.modifiedXe;\n status.sy = status.modifiedYe;\n\n this.doMove();\n this.end(status.startEvent);\n status.active = false;\n this.simulation = null;\n }\n\n utils.copyCoords(this.prevCoords, this.curCoords);\n}\n\nfunction smoothEndFrame () {\n updateInertiaCoords(this);\n\n const status = this.inertiaStatus;\n const t = new Date().getTime() - status.t0;\n const duration = this.target.options[this.prepared.name].inertia.smoothEndDuration;\n\n if (t < duration) {\n status.sx = utils.easeOutQuad(t, 0, status.xe, duration);\n status.sy = utils.easeOutQuad(t, 0, status.ye, duration);\n\n this.pointerMove(status.startEvent, status.startEvent);\n\n status.i = animationFrame.request(this.boundSmoothEndFrame);\n }\n else {\n status.sx = status.xe;\n status.sy = status.ye;\n\n this.pointerMove(status.startEvent, status.startEvent);\n this.end(status.startEvent);\n\n status.smoothEnd =\n status.active = false;\n this.simulation = null;\n }\n}\n\nfunction updateInertiaCoords (interaction) {\n const status = interaction.inertiaStatus;\n\n // return if inertia isn't running\n if (!status.active) { return; }\n\n const pageUp = status.upCoords.page;\n const clientUp = status.upCoords.client;\n\n utils.setCoords(interaction.curCoords, [ {\n pageX : pageUp.x + status.sx,\n pageY : pageUp.y + status.sy,\n clientX: clientUp.x + status.sx,\n clientY: clientUp.y + status.sy,\n } ]);\n}\n","const browser = require('./utils/browser');\nconst events = require('./utils/events');\nconst utils = require('./utils');\nconst scope = require('./scope');\nconst Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\n\nconst globalEvents = {};\n\n/*\\\n * interact\n [ method ]\n *\n * The methods of this variable can be used to set elements as\n * interactables and also to change various default settings.\n *\n * Calling it as a function and passing an element or a valid CSS selector\n * string returns an Interactable object which has various methods to\n * configure it.\n *\n - element (Element | string) The HTML or SVG Element to interact with or CSS selector\n = (object) An @Interactable\n *\n > Usage\n | interact('#draggable').draggable(true);\n |\n | var rectables = interact('rect');\n | rectables\n | .gesturable(true)\n | .on('gesturemove', function (event) {\n | // ...\n | });\n\\*/\nfunction interact (element, options) {\n let interactable = scope.interactables.get(element, options);\n\n if (!interactable) {\n interactable = new Interactable(element, options);\n interactable.events.global = globalEvents;\n }\n\n return interactable;\n}\n\n/*\\\n * interact.isSet\n [ method ]\n *\n * Check if an element has been set\n - element (Element) The Element being searched for\n = (boolean) Indicates if the element or CSS selector was previously passed to interact\n\\*/\ninteract.isSet = function (element, options) {\n return scope.interactables.indexOfElement(element, options && options.context) !== -1;\n};\n\n/*\\\n * interact.on\n [ method ]\n *\n * Adds a global listener for an InteractEvent or adds a DOM event to\n * `document`\n *\n - type (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) interact\n\\*/\ninteract.on = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.on(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.on(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n // if it is an InteractEvent type, add listener to globalEvents\n if (utils.contains(Interactable.eventTypes, type)) {\n // if this type of event was never bound\n if (!globalEvents[type]) {\n globalEvents[type] = [listener];\n }\n else {\n globalEvents[type].push(listener);\n }\n }\n // If non InteractEvent type, addEventListener to document\n else {\n events.add(scope.document, type, listener, { options });\n }\n\n return interact;\n};\n\n/*\\\n * interact.off\n [ method ]\n *\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n - type (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) interact\n \\*/\ninteract.off = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.off(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.off(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n if (!utils.contains(Interactable.eventTypes, type)) {\n events.remove(scope.document, type, listener, options);\n }\n else {\n let index;\n\n if (type in globalEvents\n && (index = utils.indexOf(globalEvents[type], listener)) !== -1) {\n globalEvents[type].splice(index, 1);\n }\n }\n\n return interact;\n};\n\n/*\\\n * interact.debug\n [ method ]\n *\n * Returns an object which exposes internal data\n = (object) An object with properties that outline the current state and expose internal functions and variables\n\\*/\ninteract.debug = function () {\n return scope;\n};\n\n// expose the functions used to calculate multi-touch properties\ninteract.getPointerAverage = utils.pointerAverage;\ninteract.getTouchBBox = utils.touchBBox;\ninteract.getTouchDistance = utils.touchDistance;\ninteract.getTouchAngle = utils.touchAngle;\n\ninteract.getElementRect = utils.getElementRect;\ninteract.getElementClientRect = utils.getElementClientRect;\ninteract.matchesSelector = utils.matchesSelector;\ninteract.closest = utils.closest;\n\n/*\\\n * interact.supportsTouch\n [ method ]\n *\n = (boolean) Whether or not the browser supports touch input\n\\*/\ninteract.supportsTouch = function () {\n return browser.supportsTouch;\n};\n\n/*\\\n * interact.supportsPointerEvent\n [ method ]\n *\n = (boolean) Whether or not the browser supports PointerEvents\n\\*/\ninteract.supportsPointerEvent = function () {\n return browser.supportsPointerEvent;\n};\n\n/*\\\n * interact.stop\n [ method ]\n *\n * Cancels all interactions (end events are not fired)\n *\n - event (Event) An event on which to call preventDefault()\n = (object) interact\n\\*/\ninteract.stop = function (event) {\n for (let i = scope.interactions.length - 1; i >= 0; i--) {\n scope.interactions[i].stop(event);\n }\n\n return interact;\n};\n\n/*\\\n * interact.pointerMoveTolerance\n [ method ]\n * Returns or sets the distance the pointer must be moved before an action\n * sequence occurs. This also affects tolerance for tap events.\n *\n - newValue (number) #optional The movement from the start position must be greater than this value\n = (number | Interactable) The current setting or interact\n\\*/\ninteract.pointerMoveTolerance = function (newValue) {\n if (utils.is.number(newValue)) {\n Interaction.pointerMoveTolerance = newValue;\n\n return this;\n }\n\n return Interaction.pointerMoveTolerance;\n};\n\ninteract.addDocument = scope.addDocument;\ninteract.removeDocument = scope.removeDocument;\n\nscope.interact = interact;\n\nmodule.exports = interact;\n","const Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\nconst scope = require('./scope');\nconst is = require('./utils/is');\nconst events = require('./utils/events');\n\nconst { nodeContains, matchesSelector } = require('./utils/domUtils');\n\n/*\\\n * Interactable.preventDefault\n [ method ]\n *\n * Returns or sets whether to prevent the browser's default behaviour\n * in response to pointer events. Can be set to:\n * - `'always'` to always prevent\n * - `'never'` to never prevent\n * - `'auto'` to let interact.js try to determine what would be best\n *\n - newValue (string) #optional `true`, `false` or `'auto'`\n = (string | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.preventDefault = function (newValue) {\n if (/^(always|never|auto)$/.test(newValue)) {\n this.options.preventDefault = newValue;\n return this;\n }\n\n if (is.bool(newValue)) {\n this.options.preventDefault = newValue? 'always' : 'never';\n return this;\n }\n\n return this.options.preventDefault;\n};\n\nInteractable.prototype.checkAndPreventDefault = function (event) {\n const setting = this.options.preventDefault;\n\n if (setting === 'never') { return; }\n\n if (setting === 'always') {\n event.preventDefault();\n return;\n }\n\n // setting === 'auto'\n\n // don't preventDefault if the browser supports passiveEvents\n // CSS touch-action and user-selecct should be used instead\n if (events.supportsOptions) {\n return;\n }\n\n // don't preventDefault of pointerdown events\n if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) {\n return;\n }\n\n // don't preventDefault on editable elements\n if (is.element(event.target)\n && matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) {\n return;\n }\n\n event.preventDefault();\n};\n\nfunction onInteractionEvent ({ interaction, event }) {\n if (interaction.target) {\n interaction.target.checkAndPreventDefault(event);\n }\n}\n\nfor (const eventSignal of ['down', 'move', 'up', 'cancel']) {\n Interaction.signals.on(eventSignal, onInteractionEvent);\n}\n\n// prevent native HTML5 drag on interact.js target elements\nInteraction.docEvents.dragstart = function preventNativeDrag (event) {\n for (const interaction of scope.interactions) {\n\n if (interaction.element\n && (interaction.element === event.target\n || nodeContains(interaction.element, event.target))) {\n\n interaction.target.checkAndPreventDefault(event);\n return;\n }\n }\n};\n","const scope = require('./scope');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst iFinder = require('./utils/interactionFinder');\nconst pointerEvents = require('./pointerEvents/base');\n\nconst { window } = require('./utils/window');\n\nconst toString = Object.prototype.toString;\n\nif (!window.Array.isArray) {\n window.Array.isArray = function (obj) {\n return toString.call(obj) === '[object Array]';\n };\n}\n\nif (!String.prototype.trim) {\n String.prototype.trim = function () {\n return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n };\n}\n\n// http://www.quirksmode.org/dom/events/click.html\n// >Events leading to dblclick\n//\n// IE8 doesn't fire down event before dblclick.\n// This workaround tries to fire a tap and doubletap after dblclick\nfunction onIE8Dblclick (event) {\n const eventTarget = event.target;\n const interaction = iFinder.search(event, event.type, eventTarget);\n\n if (!interaction) { return; }\n\n if (interaction.prevTap\n && event.clientX === interaction.prevTap.clientX\n && event.clientY === interaction.prevTap.clientY\n && eventTarget === interaction.prevTap.target) {\n\n interaction.downTargets[0] = eventTarget;\n interaction.downTimes [0] = new Date().getTime();\n\n pointerEvents.fire({\n interaction,\n event,\n eventTarget,\n pointer: event,\n type: 'tap',\n });\n }\n}\n\nif (browser.isIE8) {\n const selectFix = function (event) {\n for (const interaction of scope.interactions) {\n if (interaction.interacting()) {\n interaction.target.checkAndPreventDefault(event);\n }\n }\n };\n\n const onDocIE8 = function onDocIE8 ({ doc, win }, signalName) {\n const eventMethod = signalName.indexOf('listen') === 0\n ? events.add : events.remove;\n\n // For IE's lack of Event#preventDefault\n eventMethod(doc, 'selectstart', selectFix);\n\n if (pointerEvents) {\n eventMethod(doc, 'dblclick', onIE8Dblclick);\n }\n };\n\n scope.signals.on('add-document' , onDocIE8);\n scope.signals.on('remove-document', onDocIE8);\n}\n\nmodule.exports = null;\n","const InteractEvent = require('../InteractEvent');\nconst Interaction = require('../Interaction');\nconst extend = require('../utils/extend');\n\nconst modifiers = {\n names: [],\n\n setOffsets: function (arg) {\n const { interaction, pageCoords: page } = arg;\n const { target, element, startOffset } = interaction;\n const rect = target.getRect(element);\n\n if (rect) {\n startOffset.left = page.x - rect.left;\n startOffset.top = page.y - rect.top;\n\n startOffset.right = rect.right - page.x;\n startOffset.bottom = rect.bottom - page.y;\n\n if (!('width' in rect)) { rect.width = rect.right - rect.left; }\n if (!('height' in rect)) { rect.height = rect.bottom - rect.top ; }\n }\n else {\n startOffset.left = startOffset.top = startOffset.right = startOffset.bottom = 0;\n }\n\n arg.rect = rect;\n arg.interactable = target;\n arg.element = element;\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n\n arg.options = target.options[interaction.prepared.name][modifierName];\n\n if (!arg.options) {\n continue;\n }\n\n interaction.modifierOffsets[modifierName] = modifiers[modifierName].setOffset(arg);\n }\n },\n\n setAll: function (arg) {\n const { interaction, statuses, preEnd, requireEndOnly } = arg;\n const coords = extend({}, arg.pageCoords);\n const result = {\n dx: 0,\n dy: 0,\n changed: false,\n locked: false,\n shouldMove: true,\n };\n\n for (const modifierName of modifiers.names) {\n const modifier = modifiers[modifierName];\n const options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!shouldDo(options, preEnd, requireEndOnly)) { continue; }\n\n arg.status = arg.status = statuses[modifierName];\n arg.options = options;\n arg.offset = arg.interaction.modifierOffsets[modifierName];\n\n modifier.set(arg);\n\n if (arg.status.locked) {\n coords.x += arg.status.dx;\n coords.y += arg.status.dy;\n\n result.dx += arg.status.dx;\n result.dy += arg.status.dy;\n\n result.locked = true;\n }\n }\n\n // a move should be fired if:\n // - there are no modifiers enabled,\n // - no modifiers are \"locked\" i.e. have changed the pointer's coordinates, or\n // - the locked coords have changed since the last pointer move\n result.shouldMove = !arg.status || !result.locked || arg.status.changed;\n\n return result;\n },\n\n resetStatuses: function (statuses) {\n for (const modifierName of modifiers.names) {\n const status = statuses[modifierName] || {};\n\n status.dx = status.dy = 0;\n status.modifiedX = status.modifiedY = NaN;\n status.locked = false;\n status.changed = true;\n\n statuses[modifierName] = status;\n }\n\n return statuses;\n },\n\n start: function ({ interaction }, signalName) {\n const arg = {\n interaction,\n pageCoords: (signalName === 'action-resume' ?\n interaction.curCoords : interaction.startCoords).page,\n startOffset: interaction.startOffset,\n statuses: interaction.modifierStatuses,\n preEnd: false,\n requireEndOnly: false,\n };\n\n modifiers.setOffsets(arg);\n modifiers.resetStatuses(arg.statuses);\n\n arg.pageCoords = extend({}, interaction.startCoords.page);\n interaction.modifierResult = modifiers.setAll(arg);\n },\n};\n\nInteraction.signals.on('new', function (interaction) {\n interaction.startOffset = { left: 0, right: 0, top: 0, bottom: 0 };\n interaction.modifierOffsets = {};\n interaction.modifierStatuses = modifiers.resetStatuses({});\n interaction.modifierResult = null;\n});\n\nInteraction.signals.on('action-start' , modifiers.start);\nInteraction.signals.on('action-resume', modifiers.start);\n\nInteraction.signals.on('before-action-move', function ({ interaction, preEnd, interactingBeforeMove }) {\n const modifierResult = modifiers.setAll({\n interaction,\n preEnd,\n pageCoords: interaction.curCoords.page,\n statuses: interaction.modifierStatuses,\n requireEndOnly: false,\n });\n\n // don't fire an action move if a modifier would keep the event in the same\n // cordinates as before\n if (!modifierResult.shouldMove && interactingBeforeMove) {\n interaction._dontFireMove = true;\n }\n\n interaction.modifierResult = modifierResult;\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n for (let i = 0; i < modifiers.names.length; i++) {\n const options = interaction.target.options[interaction.prepared.name][modifiers.names[i]];\n\n // if the endOnly option is true for any modifier\n if (shouldDo(options, true, true)) {\n // fire a move event at the modified coordinates\n interaction.doMove({ event, preEnd: true });\n break;\n }\n }\n});\n\nInteractEvent.signals.on('set-xy', function (arg) {\n const { iEvent, interaction } = arg;\n const modifierArg = extend({}, arg);\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n modifierArg.options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!modifierArg.options) {\n continue;\n }\n\n const modifier = modifiers[modifierName];\n\n modifierArg.status = interaction.modifierStatuses[modifierName];\n\n iEvent[modifierName] = modifier.modifyCoords(modifierArg);\n }\n});\n\nfunction shouldDo (options, preEnd, requireEndOnly) {\n return (options && options.enabled\n && (preEnd || !options.endOnly)\n && (!requireEndOnly || options.endOnly));\n}\n\nmodule.exports = modifiers;\n","const modifiers = require('./index');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst restrict = {\n defaults: {\n enabled : false,\n endOnly : false,\n restriction: null,\n elementRect: null,\n },\n\n setOffset: function ({ rect, startOffset, options }) {\n const elementRect = options && options.elementRect;\n const offset = {};\n\n if (rect && elementRect) {\n offset.left = startOffset.left - (rect.width * elementRect.left);\n offset.top = startOffset.top - (rect.height * elementRect.top);\n\n offset.right = startOffset.right - (rect.width * (1 - elementRect.right));\n offset.bottom = startOffset.bottom - (rect.height * (1 - elementRect.bottom));\n }\n else {\n offset.left = offset.top = offset.right = offset.bottom = 0;\n }\n\n return offset;\n },\n\n set: function ({ pageCoords, interaction, status, options }) {\n if (!options) { return status; }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n\n const restriction = getRestrictionRect(options.restriction, interaction, page);\n\n if (!restriction) { return status; }\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n const rect = restriction;\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n const offset = interaction.modifierOffsets.restrict;\n\n // object is assumed to have\n // x, y, width, height or\n // left, top, right, bottom\n if ('x' in restriction && 'y' in restriction) {\n modifiedX = Math.max(Math.min(rect.x + rect.width - offset.right , page.x), rect.x + offset.left);\n modifiedY = Math.max(Math.min(rect.y + rect.height - offset.bottom, page.y), rect.y + offset.top );\n }\n else {\n modifiedX = Math.max(Math.min(rect.right - offset.right , page.x), rect.left + offset.left);\n modifiedY = Math.max(Math.min(rect.bottom - offset.bottom, page.y), rect.top + offset.top );\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const elementRect = options && options.elementRect;\n\n if (options && options.enabled\n && !(phase === 'start' && elementRect && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n getRestrictionRect,\n};\n\nfunction getRestrictionRect (value, interaction, page) {\n if (utils.is.function(value)) {\n return utils.resolveRectLike(value, interaction.target, interaction.element, [page.x, page.y, interaction]);\n } else {\n return utils.resolveRectLike(value, interaction.target, interaction.element);\n }\n}\n\nmodifiers.restrict = restrict;\nmodifiers.names.push('restrict');\n\ndefaultOptions.perAction.restrict = restrict.defaults;\n\nmodule.exports = restrict;\n","// This module adds the options.resize.restrictEdges setting which sets min and\n// max for the top, left, bottom and right edges of the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictEdges: {\n// inner: { top: 200, left: 200, right: 400, bottom: 400 },\n// outer: { top: 0, left: 0, right: 600, bottom: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst { getRestrictionRect } = require('./restrict');\n\nconst noInner = { top: +Infinity, left: +Infinity, bottom: -Infinity, right: -Infinity };\nconst noOuter = { top: -Infinity, left: -Infinity, bottom: +Infinity, right: +Infinity };\n\nconst restrictEdges = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n offset: null,\n },\n\n setOffset: function ({ interaction, startOffset, options }) {\n if (!options) {\n return utils.extend({}, startOffset);\n }\n\n const offset = getRestrictionRect(options.offset, interaction, interaction.startCoords.page);\n\n if (offset) {\n return {\n top: startOffset.top + offset.y,\n left: startOffset.left + offset.x,\n bottom: startOffset.bottom + offset.y,\n right: startOffset.right + offset.x,\n };\n }\n\n return startOffset;\n },\n\n set: function ({ pageCoords, interaction, status, offset, options }) {\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n const inner = rectUtils.xywhToTlbr(getRestrictionRect(options.inner, interaction, page)) || noInner;\n const outer = rectUtils.xywhToTlbr(getRestrictionRect(options.outer, interaction, page)) || noOuter;\n\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n if (edges.top) {\n modifiedY = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top);\n }\n else if (edges.bottom) {\n modifiedY = Math.max(Math.min(outer.bottom - offset.bottom, page.y), inner.bottom - offset.bottom);\n }\n if (edges.left) {\n modifiedX = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left);\n }\n else if (edges.right) {\n modifiedX = Math.max(Math.min(outer.right - offset.right, page.x), inner.right - offset.right);\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n if (options && options.enabled\n && !(phase === 'start' && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n noInner,\n noOuter,\n getRestrictionRect,\n};\n\nmodifiers.restrictEdges = restrictEdges;\nmodifiers.names.push('restrictEdges');\n\ndefaultOptions.perAction.restrictEdges = restrictEdges.defaults;\nresize.defaults.restrictEdges = restrictEdges.defaults;\n\nmodule.exports = restrictEdges;\n","// This module adds the options.resize.restrictSize setting which sets min and\n// max width and height for the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictSize: {\n// min: { width: -600, height: -600 },\n// max: { width: 600, height: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst restrictEdges = require('./restrictEdges');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst noMin = { width: -Infinity, height: -Infinity };\nconst noMax = { width: +Infinity, height: +Infinity };\n\nconst restrictSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n },\n\n setOffset: function ({ interaction }) {\n return interaction.startOffset;\n },\n\n set: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const rect = rectUtils.xywhToTlbr(interaction.resizeRects.inverted);\n\n const minSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.min, interaction)) || noMin;\n const maxSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.max, interaction)) || noMax;\n\n arg.options = {\n enabled: options.enabled,\n endOnly: options.endOnly,\n inner: utils.extend({}, restrictEdges.noInner),\n outer: utils.extend({}, restrictEdges.noOuter),\n };\n\n if (edges.top) {\n arg.options.inner.top = rect.bottom - minSize.height;\n arg.options.outer.top = rect.bottom - maxSize.height;\n }\n else if (edges.bottom) {\n arg.options.inner.bottom = rect.top + minSize.height;\n arg.options.outer.bottom = rect.top + maxSize.height;\n }\n if (edges.left) {\n arg.options.inner.left = rect.right - minSize.width;\n arg.options.outer.left = rect.right - maxSize.width;\n }\n else if (edges.right) {\n arg.options.inner.right = rect.left + minSize.width;\n arg.options.outer.right = rect.left + maxSize.width;\n }\n\n restrictEdges.set(arg);\n },\n\n modifyCoords: restrictEdges.modifyCoords,\n};\n\nmodifiers.restrictSize = restrictSize;\nmodifiers.names.push('restrictSize');\n\ndefaultOptions.perAction.restrictSize = restrictSize.defaults;\nresize.defaults.restrictSize = restrictSize.defaults;\n\nmodule.exports = restrictSize;\n","const modifiers = require('./index');\nconst interact = require('../interact');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst snap = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n\n relativePoints: null,\n },\n\n setOffset: function ({ interaction, interactable, element, rect, startOffset, options }) {\n const offsets = [];\n const optionsOrigin = utils.rectToXY(utils.resolveRectLike(options.origin));\n const origin = optionsOrigin || utils.getOriginXY(interactable, element, interaction.prepared.name);\n options = options || interactable.options[interaction.prepared.name].snap || {};\n\n let snapOffset;\n\n if (options.offset === 'startCoords') {\n snapOffset = {\n x: interaction.startCoords.page.x - origin.x,\n y: interaction.startCoords.page.y - origin.y,\n };\n }\n else {\n const offsetRect = utils.resolveRectLike(options.offset, interactable, element, [interaction]);\n\n snapOffset = utils.rectToXY(offsetRect) || { x: 0, y: 0 };\n }\n\n if (rect && options.relativePoints && options.relativePoints.length) {\n for (const { x: relativeX, y: relativeY } of options.relativePoints) {\n offsets.push({\n x: startOffset.left - (rect.width * relativeX) + snapOffset.x,\n y: startOffset.top - (rect.height * relativeY) + snapOffset.y,\n });\n }\n }\n else {\n offsets.push(snapOffset);\n }\n\n return offsets;\n },\n\n set: function ({ interaction, pageCoords, status, options, offset: offsets }) {\n const targets = [];\n let target;\n let page;\n let i;\n\n if (status.useStatusXY) {\n page = { x: status.x, y: status.y };\n }\n else {\n const origin = utils.getOriginXY(interaction.target, interaction.element, interaction.prepared.name);\n\n page = utils.extend({}, pageCoords);\n\n page.x -= origin.x;\n page.y -= origin.y;\n }\n\n status.realX = page.x;\n status.realY = page.y;\n\n let len = options.targets? options.targets.length : 0;\n\n for (const { x: offsetX, y: offsetY } of offsets) {\n const relativeX = page.x - offsetX;\n const relativeY = page.y - offsetY;\n\n for (const snapTarget of options.targets) {\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n targets.push({\n x: utils.is.number(target.x) ? (target.x + offsetX) : relativeX,\n y: utils.is.number(target.y) ? (target.y + offsetY) : relativeY,\n\n range: utils.is.number(target.range)? target.range: options.range,\n });\n }\n }\n\n const closest = {\n target: null,\n inRange: false,\n distance: 0,\n range: 0,\n dx: 0,\n dy: 0,\n };\n\n for (i = 0, len = targets.length; i < len; i++) {\n target = targets[i];\n\n const range = target.range;\n const dx = target.x - page.x;\n const dy = target.y - page.y;\n const distance = utils.hypot(dx, dy);\n let inRange = distance <= range;\n\n // Infinite targets count as being out of range\n // compared to non infinite ones that are in range\n if (range === Infinity && closest.inRange && closest.range !== Infinity) {\n inRange = false;\n }\n\n if (!closest.target || (inRange\n // is the closest target in range?\n ? (closest.inRange && range !== Infinity\n // the pointer is relatively deeper in this target\n ? distance / range < closest.distance / closest.range\n // this target has Infinite range and the closest doesn't\n : (range === Infinity && closest.range !== Infinity)\n // OR this target is closer that the previous closest\n || distance < closest.distance)\n // The other is not in range and the pointer is closer to this target\n : (!closest.inRange && distance < closest.distance))) {\n\n closest.target = target;\n closest.distance = distance;\n closest.range = range;\n closest.inRange = inRange;\n closest.dx = dx;\n closest.dy = dy;\n\n status.range = range;\n }\n }\n\n let snapChanged;\n\n if (closest.target) {\n snapChanged = (status.modifiedX !== closest.target.x || status.modifiedY !== closest.target.y);\n\n status.modifiedX = closest.target.x;\n status.modifiedY = closest.target.y;\n }\n else {\n snapChanged = true;\n\n status.modifiedX = NaN;\n status.modifiedY = NaN;\n }\n\n status.dx = closest.dx;\n status.dy = closest.dy;\n\n status.changed = (snapChanged || (closest.inRange && !status.locked));\n status.locked = closest.inRange;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const relativePoints = options && options.relativePoints;\n\n if (options && options.enabled\n && !(phase === 'start' && relativePoints && relativePoints.length)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n }\n\n return {\n range : status.range,\n locked : status.locked,\n x : status.modifiedX,\n y : status.modifiedY,\n realX : status.realX,\n realY : status.realY,\n dx : status.dx,\n dy : status.dy,\n };\n }\n },\n};\n\ninteract.createSnapGrid = function (grid) {\n return function (x, y) {\n const limits = grid.limits || {\n left : -Infinity,\n right : Infinity,\n top : -Infinity,\n bottom: Infinity,\n };\n let offsetX = 0;\n let offsetY = 0;\n\n if (utils.is.object(grid.offset)) {\n offsetX = grid.offset.x;\n offsetY = grid.offset.y;\n }\n\n const gridx = Math.round((x - offsetX) / grid.x);\n const gridy = Math.round((y - offsetY) / grid.y);\n\n const newX = Math.max(limits.left, Math.min(limits.right , gridx * grid.x + offsetX));\n const newY = Math.max(limits.top , Math.min(limits.bottom, gridy * grid.y + offsetY));\n\n return {\n x: newX,\n y: newY,\n range: grid.range,\n };\n };\n};\n\nmodifiers.snap = snap;\nmodifiers.names.push('snap');\n\ndefaultOptions.perAction.snap = snap.defaults;\n\nmodule.exports = snap;\n","// This module allows snapping of the size of targets during resize\n// interactions.\n\nconst modifiers = require('./index');\nconst snap = require('./snap');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\nconst utils = require('../utils/');\n\nconst snapSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n },\n\n setOffset: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.edges;\n\n if (!edges) { return; }\n\n arg.options = {\n relativePoints: [{\n x: edges.left? 0 : 1,\n y: edges.top ? 0 : 1,\n }],\n origin: { x: 0, y: 0 },\n offset: 'self',\n range: options.range,\n };\n\n const offsets = snap.setOffset(arg);\n arg.options = options;\n\n return offsets;\n },\n\n set: function (arg) {\n const { interaction, options, offset, pageCoords } = arg;\n const page = utils.extend({}, pageCoords);\n const relativeX = page.x - offset[0].x;\n const relativeY = page.y - offset[0].y;\n\n arg.options = utils.extend({}, options);\n arg.options.targets = [];\n\n for (const snapTarget of options.targets) {\n let target;\n\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n if ('width' in target && 'height' in target) {\n target.x = target.width;\n target.y = target.height;\n }\n\n arg.options.targets.push(target);\n }\n\n snap.set(arg);\n },\n\n modifyCoords: function (arg) {\n const { options } = arg;\n\n arg.options = utils.extend({}, options);\n arg.options.enabled = options.enabled;\n arg.options.relativePoints = [null];\n\n snap.modifyCoords(arg);\n },\n};\n\nmodifiers.snapSize = snapSize;\nmodifiers.names.push('snapSize');\n\ndefaultOptions.perAction.snapSize = snapSize.defaults;\nresize.defaults.snapSize = snapSize.defaults;\n\nmodule.exports = snapSize;\n","const pointerUtils = require('../utils/pointerUtils');\n\nmodule.exports = class PointerEvent {\n constructor (type, pointer, event, eventTarget, interaction) {\n pointerUtils.pointerExtend(this, event);\n\n if (event !== pointer) {\n pointerUtils.pointerExtend(this, pointer);\n }\n\n this.interaction = interaction;\n\n this.timeStamp = new Date().getTime();\n this.originalEvent = event;\n this.type = type;\n this.pointerId = pointerUtils.getPointerId(pointer);\n this.pointerType = pointerUtils.getPointerType(pointer, interaction);\n this.target = eventTarget;\n this.currentTarget = null;\n\n if (type === 'tap') {\n const pointerIndex = interaction.getPointerIndex(pointer);\n this.dt = this.timeStamp - interaction.downTimes[pointerIndex];\n\n const interval = this.timeStamp - interaction.tapTime;\n\n this.double = !!(interaction.prevTap\n && interaction.prevTap.type !== 'doubletap'\n && interaction.prevTap.target === this.target\n && interval < 500);\n }\n else if (type === 'doubletap') {\n this.dt = pointer.timeStamp - interaction.tapTime;\n }\n }\n\n subtractOrigin ({ x: originX, y: originY }) {\n this.pageX -= originX;\n this.pageY -= originY;\n this.clientX -= originX;\n this.clientY -= originY;\n\n return this;\n }\n\n addOrigin ({ x: originX, y: originY }) {\n this.pageX += originX;\n this.pageY += originY;\n this.clientX += originX;\n this.clientY += originY;\n\n return this;\n }\n\n preventDefault () {\n this.originalEvent.preventDefault();\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n};\n","const PointerEvent = require('./PointerEvent');\nconst Interaction = require('../Interaction');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst defaults = require('../defaultOptions');\nconst signals = require('../utils/Signals').new();\nconst { filter } = require('../utils/arr');\n\nconst simpleSignals = [ 'down', 'up', 'cancel' ];\nconst simpleEvents = [ 'down', 'up', 'cancel' ];\n\nconst pointerEvents = {\n PointerEvent,\n fire,\n collectEventTargets,\n signals,\n defaults: {\n holdDuration: 600,\n ignoreFrom : null,\n allowFrom : null,\n origin : { x: 0, y: 0 },\n },\n types: [\n 'down',\n 'move',\n 'up',\n 'cancel',\n 'tap',\n 'doubletap',\n 'hold',\n ],\n};\n\nfunction fire (arg) {\n const {\n interaction, pointer, event, eventTarget,\n type = arg.pointerEvent.type,\n targets = collectEventTargets(arg),\n pointerEvent = new PointerEvent(type, pointer, event, eventTarget, interaction),\n } = arg;\n\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n targets,\n type,\n pointerEvent,\n };\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n\n for (const prop in target.props || {}) {\n pointerEvent[prop] = target.props[prop];\n }\n\n const origin = utils.getOriginXY(target.eventable, target.element);\n\n pointerEvent.subtractOrigin(origin);\n pointerEvent.eventable = target.eventable;\n pointerEvent.currentTarget = target.element;\n\n target.eventable.fire(pointerEvent);\n\n pointerEvent.addOrigin(origin);\n\n if (pointerEvent.immediatePropagationStopped\n || (pointerEvent.propagationStopped\n && (i + 1) < targets.length && targets[i + 1].element !== pointerEvent.currentTarget)) {\n break;\n }\n }\n\n signals.fire('fired', signalArg);\n\n if (type === 'tap') {\n // if pointerEvent should make a double tap, create and fire a doubletap\n // PointerEvent and use that as the prevTap\n const prevTap = pointerEvent.double\n ? fire({\n interaction, pointer, event, eventTarget,\n type: 'doubletap',\n })\n : pointerEvent;\n\n interaction.prevTap = prevTap;\n interaction.tapTime = prevTap.timeStamp;\n }\n\n return pointerEvent;\n}\n\nfunction collectEventTargets ({ interaction, pointer, event, eventTarget, type }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n // do not fire a tap event if the pointer was moved before being lifted\n if (type === 'tap' && (interaction.pointerWasMoved\n // or if the pointerup target is different to the pointerdown target\n || !(interaction.downTargets[pointerIndex] && interaction.downTargets[pointerIndex] === eventTarget))) {\n return [];\n }\n\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n path,\n targets: [],\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (type === 'hold') {\n signalArg.targets = filter(signalArg.targets, target =>\n target.eventable.options.holdDuration === interaction.holdTimers[pointerIndex].duration);\n }\n\n return signalArg.targets;\n}\n\nInteraction.signals.on('update-pointer-down', function ({ interaction, pointerIndex }) {\n interaction.holdTimers[pointerIndex] = { duration: Infinity, timeout: null };\n});\n\nInteraction.signals.on('remove-pointer', function ({ interaction, pointerIndex }) {\n interaction.holdTimers.splice(pointerIndex, 1);\n});\n\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget, duplicateMove }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n if (!duplicateMove && (!interaction.pointerIsDown || interaction.pointerWasMoved)) {\n if (interaction.pointerIsDown) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n\n fire({\n interaction, pointer, event, eventTarget,\n type: 'move',\n });\n }\n});\n\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget, pointerIndex }) {\n // copy event to be used in timeout for IE8\n const eventCopy = browser.isIE8? utils.extend({}, event) : event;\n\n const timer = interaction.holdTimers[pointerIndex];\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'hold',\n targets: [],\n path,\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (!signalArg.targets.length) { return; }\n\n let minDuration = Infinity;\n\n for (let i = 0; i < signalArg.targets.length; i++) {\n const target = signalArg.targets[i];\n const holdDuration = target.eventable.options.holdDuration;\n\n if (holdDuration < minDuration) {\n minDuration = holdDuration;\n }\n }\n\n timer.duration = minDuration;\n timer.timeout = setTimeout(function () {\n fire({\n interaction, eventCopy, eventTarget,\n pointer: browser.isIE8? eventCopy : pointer,\n type: 'hold',\n });\n }, minDuration);\n});\n\nInteraction.signals.on('up', ({ interaction, pointer, event, eventTarget }) => {\n if (!interaction.pointerWasMoved) {\n fire({ interaction, eventTarget, pointer, event, type: 'tap' });\n }\n});\n\n['up', 'cancel'].forEach(function (signalName) {\n Interaction.signals.on(signalName, function ({ interaction, pointerIndex }) {\n if (interaction.holdTimers[pointerIndex]) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n });\n});\n\nfunction createSignalListener (type) {\n return function ({ interaction, pointer, event, eventTarget }) {\n fire({ interaction, eventTarget, pointer, event, type });\n };\n}\n\nfor (let i = 0; i < simpleSignals.length; i++) {\n Interaction.signals.on(simpleSignals[i], createSignalListener(simpleEvents[i]));\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.prevTap = null; // the most recent tap event on this interaction\n interaction.tapTime = 0; // time of the most recent tap event\n interaction.holdTimers = []; // [{ duration, timeout }]\n});\n\ndefaults.pointerEvents = pointerEvents.defaults;\nmodule.exports = pointerEvents;\n","const pointerEvents = require('./base');\nconst Interaction = require('../Interaction');\n\npointerEvents.signals.on('new', onNew);\npointerEvents.signals.on('fired', onFired);\n\nfor (const signal of ['move', 'up', 'cancel', 'endall']) {\n Interaction.signals.on(signal, endHoldRepeat);\n}\n\nfunction onNew ({ pointerEvent }) {\n if (pointerEvent.type !== 'hold') { return; }\n\n pointerEvent.count = (pointerEvent.count || 0) + 1;\n}\n\nfunction onFired ({ interaction, pointerEvent, eventTarget, targets }) {\n if (pointerEvent.type !== 'hold' || !targets.length) { return; }\n\n // get the repeat interval from the first eventable\n const interval = targets[0].eventable.options.holdRepeatInterval;\n\n // don't repeat if the interval is 0 or less\n if (interval <= 0) { return; }\n\n // set a timeout to fire the holdrepeat event\n interaction.holdIntervalHandle = setTimeout(function () {\n pointerEvents.fire({\n interaction,\n eventTarget,\n type: 'hold',\n pointer: pointerEvent,\n event: pointerEvent,\n });\n }, interval);\n}\n\nfunction endHoldRepeat ({ interaction }) {\n // set the interaction's holdStopTime property\n // to stop further holdRepeat events\n if (interaction.holdIntervalHandle) {\n clearInterval(interaction.holdIntervalHandle);\n interaction.holdIntervalHandle = null;\n }\n}\n\n// don't repeat by default\npointerEvents.defaults.holdRepeatInterval = 0;\npointerEvents.types.push('holdrepeat');\n\nmodule.exports = {\n onNew,\n onFired,\n endHoldRepeat,\n};\n","const pointerEvents = require('./base');\nconst Interactable = require('../Interactable');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\nconst scope = require('../scope');\nconst extend = require('../utils/extend');\nconst { merge } = require('../utils/arr');\n\npointerEvents.signals.on('collect-targets', function ({ targets, element, type, eventTarget }) {\n function collectSelectors (interactable, selector, context) {\n const els = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && is.element(element)\n && domUtils.matchesSelector(element, selector, els)\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n const interactable = scope.interactables.get(element);\n\n if (interactable) {\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n scope.interactables.forEachSelector(collectSelectors, element);\n});\n\nInteractable.signals.on('new', function ({ interactable }) {\n interactable.events.getRect = function (element) {\n return interactable.getRect(element);\n };\n});\n\nInteractable.signals.on('set', function ({ interactable, options }) {\n extend(interactable.events.options, pointerEvents.defaults);\n extend(interactable.events.options, options);\n});\n\nmerge(Interactable.eventTypes, pointerEvents.types);\n\nInteractable.prototype.pointerEvents = function (options) {\n extend(this.events.options, options);\n\n return this;\n};\n\nconst __backCompatOption = Interactable.prototype._backCompatOption;\n\nInteractable.prototype._backCompatOption = function (optionName, newValue) {\n const ret = __backCompatOption.call(this, optionName, newValue);\n\n if (ret === this) {\n this.events.options[optionName] = newValue;\n }\n\n return ret;\n};\n\nInteractable.settingsMethods.push('pointerEvents');\n","const utils = require('./utils');\nconst events = require('./utils/events');\nconst signals = require('./utils/Signals').new();\n\nconst scope = {\n signals,\n events,\n utils,\n\n // main document\n document: require('./utils/domObjects').document,\n // all documents being listened to\n documents: [],\n\n addDocument: function (doc, win) {\n // do nothing if document is already known\n if (utils.contains(scope.documents, doc)) { return false; }\n\n win = win || scope.getWindow(doc);\n\n scope.documents.push(doc);\n events.documents.push(doc);\n\n // don't add an unload event for the main document\n // so that the page may be cached in browser history\n if (doc !== scope.document) {\n events.add(win, 'unload', scope.onWindowUnload);\n }\n\n signals.fire('add-document', { doc, win });\n },\n\n removeDocument: function (doc, win) {\n const index = utils.indexOf(scope.documents, doc);\n\n win = win || scope.getWindow(doc);\n\n events.remove(win, 'unload', scope.onWindowUnload);\n\n scope.documents.splice(index, 1);\n events.documents.splice(index, 1);\n\n signals.fire('remove-document', { win, doc });\n },\n\n onWindowUnload: function () {\n scope.removeDocument(this.document, this);\n },\n};\n\nmodule.exports = scope;\n","const { indexOf } = require('./arr');\n\nclass Signals {\n constructor () {\n this.listeners = {\n // signalName: [listeners],\n };\n }\n\n on (name, listener) {\n if (!this.listeners[name]) {\n this.listeners[name] = [listener];\n return;\n }\n\n this.listeners[name].push(listener);\n }\n\n off (name, listener) {\n if (!this.listeners[name]) { return; }\n\n const index = indexOf(this.listeners[name], listener);\n\n if (index !== -1) {\n this.listeners[name].splice(index, 1);\n }\n }\n\n fire (name, arg) {\n const targetListeners = this.listeners[name];\n\n if (!targetListeners) { return; }\n\n for (let i = 0; i < targetListeners.length; i++) {\n if (targetListeners[i](arg, name) === false) {\n return;\n }\n }\n }\n}\n\nSignals.new = function () {\n return new Signals();\n};\n\nmodule.exports = Signals;\n","function indexOf (array, target) {\n for (let i = 0, len = array.length; i < len; i++) {\n if (array[i] === target) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction contains (array, target) {\n return indexOf(array, target) !== -1;\n}\n\nfunction merge (target, source) {\n for (let i = 0; i < source.length; i++) {\n target.push(source[i]);\n }\n\n return target;\n}\n\nfunction filter (array, test) {\n const result = [];\n\n for (let i = 0; i < array.length; i++) {\n if (test(array[i])) {\n result.push(array[i]);\n }\n }\n\n return result;\n}\n\nmodule.exports = {\n indexOf,\n contains,\n merge,\n filter,\n};\n","const { window } = require('./window');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst Element = domObjects.Element;\nconst navigator = window.navigator;\n\nconst browser = {\n // Does the browser support touch input?\n supportsTouch: !!(('ontouchstart' in window) || is.function(window.DocumentTouch)\n && domObjects.document instanceof window.DocumentTouch),\n\n // Does the browser support PointerEvents\n supportsPointerEvent: !!domObjects.PointerEvent,\n\n isIE8: ('attachEvent' in window) && !('addEventListener' in window),\n\n // Opera Mobile must be handled differently\n isOperaMobile: (navigator.appName === 'Opera'\n && browser.supportsTouch\n && navigator.userAgent.match('Presto')),\n\n // scrolling doesn't change the result of getClientRects on iOS 7\n isIOS7: (/iP(hone|od|ad)/.test(navigator.platform)\n && /OS 7[^\\d]/.test(navigator.appVersion)),\n\n isIe9OrOlder: /MSIE (8|9)/.test(navigator.userAgent),\n\n // prefix matchesSelector\n prefixedMatchesSelector: 'matches' in Element.prototype\n ? 'matches': 'webkitMatchesSelector' in Element.prototype\n ? 'webkitMatchesSelector': 'mozMatchesSelector' in Element.prototype\n ? 'mozMatchesSelector': 'oMatchesSelector' in Element.prototype\n ? 'oMatchesSelector': 'msMatchesSelector',\n\n useMatchesSelectorPolyfill: false,\n\n pEventTypes: (domObjects.PointerEvent\n ? (domObjects.PointerEvent === window.MSPointerEvent\n ? {\n up: 'MSPointerUp',\n down: 'MSPointerDown',\n over: 'mouseover',\n out: 'mouseout',\n move: 'MSPointerMove',\n cancel: 'MSPointerCancel',\n }\n : {\n up: 'pointerup',\n down: 'pointerdown',\n over: 'pointerover',\n out: 'pointerout',\n move: 'pointermove',\n cancel: 'pointercancel',\n })\n : null),\n\n // because Webkit and Opera still use 'mousewheel' event type\n wheelEvent: 'onmousewheel' in domObjects.document? 'mousewheel': 'wheel',\n\n};\n\nbrowser.useMatchesSelectorPolyfill = !is.function(Element.prototype[browser.prefixedMatchesSelector]);\n\nmodule.exports = browser;\n","const domObjects = {};\nconst win = require('./window').window;\n\nfunction blank () {}\n\ndomObjects.document = win.document;\ndomObjects.DocumentFragment = win.DocumentFragment || blank;\ndomObjects.SVGElement = win.SVGElement || blank;\ndomObjects.SVGSVGElement = win.SVGSVGElement || blank;\ndomObjects.SVGElementInstance = win.SVGElementInstance || blank;\ndomObjects.Element = win.Element || blank;\ndomObjects.HTMLElement = win.HTMLElement || domObjects.Element;\n\ndomObjects.Event = win.Event;\ndomObjects.Touch = win.Touch || blank;\ndomObjects.PointerEvent = (win.PointerEvent || win.MSPointerEvent);\n\nmodule.exports = domObjects;\n","const win = require('./window');\nconst browser = require('./browser');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst domUtils = {\n nodeContains: function (parent, child) {\n while (child) {\n if (child === parent) {\n return true;\n }\n\n child = child.parentNode;\n }\n\n return false;\n },\n\n closest: function (element, selector) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) { return element; }\n\n element = domUtils.parentNode(element);\n }\n\n return null;\n },\n\n parentNode: function (node) {\n let parent = node.parentNode;\n\n if (is.docFrag(parent)) {\n // skip past #shado-root fragments\n while ((parent = parent.host) && is.docFrag(parent)) {\n continue;\n }\n\n return parent;\n }\n\n return parent;\n },\n\n // taken from http://tanalin.com/en/blog/2012/12/matches-selector-ie8/ and modified\n matchesSelectorPolyfill: browser.useMatchesSelectorPolyfill\n ? function (element, selector, elems) {\n elems = elems || element.parentNode.querySelectorAll(selector);\n\n for (let i = 0, len = elems.length; i < len; i++) {\n if (elems[i] === element) {\n return true;\n }\n }\n\n return false;\n }\n : null,\n\n matchesSelector: function (element, selector, nodeList) {\n if (browser.useMatchesSelectorPolyfill) {\n return domUtils.matchesSelectorPolyfill(element, selector, nodeList);\n }\n\n // remove /deep/ from selectors if shadowDOM polyfill is used\n if (win.window !== win.realWindow) {\n selector = selector.replace(/\\/deep\\//g, ' ');\n }\n\n return element[browser.prefixedMatchesSelector](selector);\n },\n\n // Test for the element that's \"above\" all other qualifiers\n indexOfDeepestElement: function (elements) {\n let deepestZoneParents = [];\n let dropzoneParents = [];\n let dropzone;\n let deepestZone = elements[0];\n let index = deepestZone? 0: -1;\n let parent;\n let child;\n let i;\n let n;\n\n for (i = 1; i < elements.length; i++) {\n dropzone = elements[i];\n\n // an element might belong to multiple selector dropzones\n if (!dropzone || dropzone === deepestZone) {\n continue;\n }\n\n if (!deepestZone) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n // check if the deepest or current are document.documentElement or document.rootElement\n // - if the current dropzone is, do nothing and continue\n if (dropzone.parentNode === dropzone.ownerDocument) {\n continue;\n }\n // - if deepest is, update with the current dropzone and continue to next\n else if (deepestZone.parentNode === dropzone.ownerDocument) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n if (!deepestZoneParents.length) {\n parent = deepestZone;\n while (parent.parentNode && parent.parentNode !== parent.ownerDocument) {\n deepestZoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n }\n\n // if this element is an svg element and the current deepest is\n // an HTMLElement\n if (deepestZone instanceof domObjects.HTMLElement\n && dropzone instanceof domObjects.SVGElement\n && !(dropzone instanceof domObjects.SVGSVGElement)) {\n\n if (dropzone === deepestZone.parentNode) {\n continue;\n }\n\n parent = dropzone.ownerSVGElement;\n }\n else {\n parent = dropzone;\n }\n\n dropzoneParents = [];\n\n while (parent.parentNode !== parent.ownerDocument) {\n dropzoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n\n n = 0;\n\n // get (position of last common ancestor) + 1\n while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) {\n n++;\n }\n\n const parents = [\n dropzoneParents[n - 1],\n dropzoneParents[n],\n deepestZoneParents[n],\n ];\n\n child = parents[0].lastChild;\n\n while (child) {\n if (child === parents[1]) {\n deepestZone = dropzone;\n index = i;\n deepestZoneParents = [];\n\n break;\n }\n else if (child === parents[2]) {\n break;\n }\n\n child = child.previousSibling;\n }\n }\n\n return index;\n },\n\n matchesUpTo: function (element, selector, limit) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) {\n return true;\n }\n\n element = domUtils.parentNode(element);\n\n if (element === limit) {\n return domUtils.matchesSelector(element, selector);\n }\n }\n\n return false;\n },\n\n getActualElement: function (element) {\n return (element instanceof domObjects.SVGElementInstance\n ? element.correspondingUseElement\n : element);\n },\n\n getScrollXY: function (relevantWindow) {\n relevantWindow = relevantWindow || win.window;\n return {\n x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft,\n y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop,\n };\n },\n\n getElementClientRect: function (element) {\n const clientRect = (element instanceof domObjects.SVGElement\n ? element.getBoundingClientRect()\n : element.getClientRects()[0]);\n\n return clientRect && {\n left : clientRect.left,\n right : clientRect.right,\n top : clientRect.top,\n bottom: clientRect.bottom,\n width : clientRect.width || clientRect.right - clientRect.left,\n height: clientRect.height || clientRect.bottom - clientRect.top,\n };\n },\n\n getElementRect: function (element) {\n const clientRect = domUtils.getElementClientRect(element);\n\n if (!browser.isIOS7 && clientRect) {\n const scroll = domUtils.getScrollXY(win.getWindow(element));\n\n clientRect.left += scroll.x;\n clientRect.right += scroll.x;\n clientRect.top += scroll.y;\n clientRect.bottom += scroll.y;\n }\n\n return clientRect;\n },\n\n getPath: function (element) {\n const path = [];\n\n while (element) {\n path.push(element);\n element = domUtils.parentNode(element);\n }\n\n return path;\n },\n\n trySelector: value => {\n if (!is.string(value)) { return false; }\n\n // an exception will be raised if it is invalid\n domObjects.document.querySelector(value);\n return true;\n },\n};\n\nmodule.exports = domUtils;\n","const is = require('./is');\nconst domUtils = require('./domUtils');\nconst pExtend = require('./pointerExtend');\n\nconst { window, getWindow } = require('./window');\nconst { indexOf, contains } = require('./arr');\n\nconst useAttachEvent = ('attachEvent' in window) && !('addEventListener' in window);\nconst addEvent = useAttachEvent? 'attachEvent': 'addEventListener';\nconst removeEvent = useAttachEvent? 'detachEvent': 'removeEventListener';\nconst on = useAttachEvent? 'on': '';\n\nconst elements = [];\nconst targets = [];\nconst attachedListeners = [];\n\n// {\n// type: {\n// selectors: ['selector', ...],\n// contexts : [document, ...],\n// listeners: [[listener, capture, passive], ...]\n// }\n// }\nconst delegatedEvents = {};\n\nconst documents = [];\n\nconst supportsOptions = !useAttachEvent && (() => {\n let supported = false;\n\n window.document.createElement('div').addEventListener('test', null, {\n get capture () { supported = true; },\n });\n\n return supported;\n})();\n\nfunction add (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n let elementIndex = indexOf(elements, element);\n let target = targets[elementIndex];\n\n if (!target) {\n target = {\n events: {},\n typeCount: 0,\n };\n\n elementIndex = elements.push(element) - 1;\n targets.push(target);\n\n attachedListeners.push(useAttachEvent\n ? {\n supplied: [],\n wrapped : [],\n useCount: [],\n }\n : null);\n }\n\n if (!target.events[type]) {\n target.events[type] = [];\n target.typeCount++;\n }\n\n if (!contains(target.events[type], listener)) {\n let ret;\n\n if (useAttachEvent) {\n const { supplied, wrapped, useCount } = attachedListeners[elementIndex];\n const listenerIndex = indexOf(supplied, listener);\n\n const wrappedListener = wrapped[listenerIndex] || function (event) {\n if (!event.immediatePropagationStopped) {\n event.target = event.srcElement;\n event.currentTarget = element;\n\n event.preventDefault = event.preventDefault || preventDef;\n event.stopPropagation = event.stopPropagation || stopProp;\n event.stopImmediatePropagation = event.stopImmediatePropagation || stopImmProp;\n\n if (/mouse|click/.test(event.type)) {\n event.pageX = event.clientX + getWindow(element).document.documentElement.scrollLeft;\n event.pageY = event.clientY + getWindow(element).document.documentElement.scrollTop;\n }\n\n listener(event);\n }\n };\n\n ret = element[addEvent](on + type, wrappedListener, !!options.capture);\n\n if (listenerIndex === -1) {\n supplied.push(listener);\n wrapped.push(wrappedListener);\n useCount.push(1);\n }\n else {\n useCount[listenerIndex]++;\n }\n }\n else {\n ret = element[addEvent](type, listener, supportsOptions? options : !!options.capture);\n }\n target.events[type].push(listener);\n\n return ret;\n }\n}\n\nfunction remove (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const elementIndex = indexOf(elements, element);\n const target = targets[elementIndex];\n\n if (!target || !target.events) {\n return;\n }\n\n let wrappedListener = listener;\n let listeners;\n let listenerIndex;\n\n if (useAttachEvent) {\n listeners = attachedListeners[elementIndex];\n listenerIndex = indexOf(listeners.supplied, listener);\n wrappedListener = listeners.wrapped[listenerIndex];\n }\n\n if (type === 'all') {\n for (type in target.events) {\n if (target.events.hasOwnProperty(type)) {\n remove(element, type, 'all');\n }\n }\n return;\n }\n\n if (target.events[type]) {\n const len = target.events[type].length;\n\n if (listener === 'all') {\n for (let i = 0; i < len; i++) {\n remove(element, type, target.events[type][i], options);\n }\n return;\n }\n else {\n for (let i = 0; i < len; i++) {\n if (target.events[type][i] === listener) {\n element[removeEvent](on + type, wrappedListener, supportsOptions? options : !!options.capture);\n target.events[type].splice(i, 1);\n\n if (useAttachEvent && listeners) {\n listeners.useCount[listenerIndex]--;\n if (listeners.useCount[listenerIndex] === 0) {\n listeners.supplied.splice(listenerIndex, 1);\n listeners.wrapped.splice(listenerIndex, 1);\n listeners.useCount.splice(listenerIndex, 1);\n }\n }\n\n break;\n }\n }\n }\n\n if (target.events[type] && target.events[type].length === 0) {\n target.events[type] = null;\n target.typeCount--;\n }\n }\n\n if (!target.typeCount) {\n targets.splice(elementIndex, 1);\n elements.splice(elementIndex, 1);\n attachedListeners.splice(elementIndex, 1);\n }\n}\n\nfunction addDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n if (!delegatedEvents[type]) {\n delegatedEvents[type] = {\n selectors: [],\n contexts : [],\n listeners: [],\n };\n\n // add delegate listener functions\n for (let i = 0; i < documents.length; i++) {\n add(documents[i], type, delegateListener);\n add(documents[i], type, delegateUseCapture, true);\n }\n }\n\n const delegated = delegatedEvents[type];\n let index;\n\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n break;\n }\n }\n\n if (index === -1) {\n index = delegated.selectors.length;\n\n delegated.selectors.push(selector);\n delegated.contexts .push(context);\n delegated.listeners.push([]);\n }\n\n // keep listener and capture and passive flags\n delegated.listeners[index].push([listener, !!options.capture, options.passive]);\n}\n\nfunction removeDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const delegated = delegatedEvents[type];\n let matchFound = false;\n let index;\n\n if (!delegated) { return; }\n\n // count from last index of delegated to 0\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n // look for matching selector and context Node\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n\n const listeners = delegated.listeners[index];\n\n // each item of the listeners array is an array: [function, capture, passive]\n for (let i = listeners.length - 1; i >= 0; i--) {\n const [fn, capture, passive] = listeners[i];\n\n // check if the listener functions and capture and passive flags match\n if (fn === listener && capture === !!options.capture && passive === options.passive) {\n // remove the listener from the array of listeners\n listeners.splice(i, 1);\n\n // if all listeners for this interactable have been removed\n // remove the interactable from the delegated arrays\n if (!listeners.length) {\n delegated.selectors.splice(index, 1);\n delegated.contexts .splice(index, 1);\n delegated.listeners.splice(index, 1);\n\n // remove delegate function from context\n remove(context, type, delegateListener);\n remove(context, type, delegateUseCapture, true);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegatedEvents[type] = null;\n }\n }\n\n // only remove one listener\n matchFound = true;\n break;\n }\n }\n\n if (matchFound) { break; }\n }\n }\n}\n\n// bound to the interactable context when a DOM event\n// listener is added to a selector interactable\nfunction delegateListener (event, optionalArg) {\n const options = getOptions(optionalArg);\n const fakeEvent = {};\n const delegated = delegatedEvents[event.type];\n const eventTarget = (domUtils.getActualElement(event.path\n ? event.path[0]\n : event.target));\n let element = eventTarget;\n\n // duplicate the event so that currentTarget can be changed\n pExtend(fakeEvent, event);\n\n fakeEvent.originalEvent = event;\n fakeEvent.preventDefault = preventOriginalDefault;\n\n // climb up document tree looking for selector matches\n while (is.element(element)) {\n for (let i = 0; i < delegated.selectors.length; i++) {\n const selector = delegated.selectors[i];\n const context = delegated.contexts[i];\n\n if (domUtils.matchesSelector(element, selector)\n && domUtils.nodeContains(context, eventTarget)\n && domUtils.nodeContains(context, element)) {\n\n const listeners = delegated.listeners[i];\n\n fakeEvent.currentTarget = element;\n\n for (let j = 0; j < listeners.length; j++) {\n const [fn, capture, passive] = listeners[j];\n\n if (capture === !!options.capture && passive === options.passive) {\n fn(fakeEvent);\n }\n }\n }\n }\n\n element = domUtils.parentNode(element);\n }\n}\n\nfunction delegateUseCapture (event) {\n return delegateListener.call(this, event, true);\n}\n\nfunction preventDef () {\n this.returnValue = false;\n}\n\nfunction preventOriginalDefault () {\n this.originalEvent.preventDefault();\n}\n\nfunction stopProp () {\n this.cancelBubble = true;\n}\n\nfunction stopImmProp () {\n this.cancelBubble = true;\n this.immediatePropagationStopped = true;\n}\n\nfunction getOptions (param) {\n return is.object(param)? param : { capture: param };\n}\n\nmodule.exports = {\n add,\n remove,\n\n addDelegate,\n removeDelegate,\n\n delegateListener,\n delegateUseCapture,\n delegatedEvents,\n documents,\n\n useAttachEvent,\n supportsOptions,\n\n _elements: elements,\n _targets: targets,\n _attachedListeners: attachedListeners,\n};\n","module.exports = function extend (dest, source) {\n for (const prop in source) {\n dest[prop] = source[prop];\n }\n return dest;\n};\n","const {\n resolveRectLike,\n rectToXY,\n} = require('./rect');\n\nmodule.exports = function (target, element, action) {\n const actionOptions = target.options[action];\n const actionOrigin = actionOptions && actionOptions.origin;\n const origin = actionOrigin || target.options.origin;\n\n const originRect = resolveRectLike(origin, target, element, [target && element]);\n\n return rectToXY(originRect) || { x: 0, y: 0 };\n};\n","module.exports = (x, y) => Math.sqrt(x * x + y * y);\n","const extend = require('./extend');\nconst win = require('./window');\n\nconst utils = {\n warnOnce: function (method, message) {\n let warned = false;\n\n return function () {\n if (!warned) {\n win.window.console.warn(message);\n warned = true;\n }\n\n return method.apply(this, arguments);\n };\n },\n\n // http://stackoverflow.com/a/5634528/2280888\n _getQBezierValue: function (t, p1, p2, p3) {\n const iT = 1 - t;\n return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3;\n },\n\n getQuadraticCurvePoint: function (startX, startY, cpX, cpY, endX, endY, position) {\n return {\n x: utils._getQBezierValue(position, startX, cpX, endX),\n y: utils._getQBezierValue(position, startY, cpY, endY),\n };\n },\n\n // http://gizma.com/easing/\n easeOutQuad: function (t, b, c, d) {\n t /= d;\n return -c * t*(t-2) + b;\n },\n\n copyAction: function (dest, src) {\n dest.name = src.name;\n dest.axis = src.axis;\n dest.edges = src.edges;\n\n return dest;\n },\n\n is : require('./is'),\n extend : extend,\n hypot : require('./hypot'),\n getOriginXY: require('./getOriginXY'),\n};\n\nextend(utils, require('./arr'));\nextend(utils, require('./domUtils'));\nextend(utils, require('./pointerUtils'));\nextend(utils, require('./rect'));\n\nmodule.exports = utils;\n","const scope = require('../scope');\nconst utils = require('./index');\nconst browser = require('./browser');\n\nconst finder = {\n methodOrder: [ 'simulationResume', 'mouse', 'hasPointer', 'idle' ],\n\n search: function (pointer, eventType, eventTarget) {\n const mouseEvent = (/mouse/i.test(pointer.pointerType || eventType)\n // MSPointerEvent.MSPOINTER_TYPE_MOUSE\n || pointer.pointerType === 4);\n const pointerId = utils.getPointerId(pointer);\n const details = { pointer, pointerId, mouseEvent, eventType, eventTarget };\n\n for (const method of finder.methodOrder) {\n const interaction = finder[method](details);\n\n if (interaction) {\n return interaction;\n }\n }\n },\n\n // try to resume simulation with a new pointer\n simulationResume: function ({ mouseEvent, eventType, eventTarget }) {\n if (!/down|start/i.test(eventType)) {\n return null;\n }\n\n for (const interaction of scope.interactions) {\n let element = eventTarget;\n\n if (interaction.simulation && interaction.simulation.allowResume\n && (interaction.mouse === mouseEvent)) {\n while (element) {\n // if the element is the interaction element\n if (element === interaction.element) {\n return interaction;\n }\n element = utils.parentNode(element);\n }\n }\n }\n\n return null;\n },\n\n // if it's a mouse interaction\n mouse: function ({ pointerId, mouseEvent, eventType }) {\n if (!mouseEvent && (browser.supportsTouch || browser.supportsPointerEvent)) {\n return null;\n }\n\n let firstNonActive;\n\n for (const interaction of scope.interactions) {\n if (interaction.mouse) {\n // if it's a down event, skip interactions with running simulations\n if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; }\n\n // if the interaction is active, return it immediately\n if (interaction.interacting()) {\n return interaction;\n }\n // otherwise save it and look for another active interaction\n else if (!firstNonActive) {\n firstNonActive = interaction;\n }\n }\n }\n\n // if no active mouse interaction was found use the first inactive mouse\n // interaction\n if (firstNonActive) {\n return firstNonActive;\n }\n\n // Find any interaction specifically for mouse.\n // ignore the interaction if the eventType is a mousedown, and a simulation\n // is active\n for (const interaction of scope.interactions) {\n if (interaction.mouse && !(/down/.test(eventType) && interaction.simulation)) {\n return interaction;\n }\n }\n\n return null;\n },\n\n // get interaction that has this pointer\n hasPointer: function ({ pointerId }) {\n for (const interaction of scope.interactions) {\n if (utils.contains(interaction.pointerIds, pointerId)) {\n return interaction;\n }\n }\n },\n\n // get first idle interaction\n idle: function ({ mouseEvent }) {\n for (const interaction of scope.interactions) {\n // if there's already a pointer held down\n if (interaction.pointerIds.length === 1) {\n const target = interaction.target;\n // don't add this pointer if there is a target interactable and it\n // isn't gesturable\n if (target && !target.options.gesture.enabled) {\n continue;\n }\n }\n // maximum of 2 pointers per interaction\n else if (interaction.pointerIds.length >= 2) {\n continue;\n }\n\n if (!interaction.interacting() && (mouseEvent === interaction.mouse)) {\n return interaction;\n }\n }\n\n return null;\n },\n};\n\nmodule.exports = finder;\n","const win = require('./window');\nconst isWindow = require('./isWindow');\n\nconst is = {\n array : () => {},\n\n window : thing => thing === win.window || isWindow(thing),\n\n docFrag : thing => is.object(thing) && thing.nodeType === 11,\n\n object : thing => !!thing && (typeof thing === 'object'),\n\n function: thing => typeof thing === 'function',\n\n number : thing => typeof thing === 'number' ,\n\n bool : thing => typeof thing === 'boolean' ,\n\n string : thing => typeof thing === 'string' ,\n\n element: thing => {\n if (!thing || (typeof thing !== 'object')) { return false; }\n\n const _window = win.getWindow(thing) || win.window;\n\n return (/object|function/.test(typeof _window.Element)\n ? thing instanceof _window.Element //DOM2\n : thing.nodeType === 1 && typeof thing.nodeName === 'string');\n },\n};\n\nis.array = thing => (is.object(thing)\n && (typeof thing.length !== 'undefined')\n && is.function(thing.splice));\n\nmodule.exports = is;\n","module.exports = (thing) => !!(thing && thing.Window) && (thing instanceof thing.Window);\n","function pointerExtend (dest, source) {\n for (const prop in source) {\n const prefixedPropREs = module.exports.prefixedPropREs;\n let deprecated = false;\n\n // skip deprecated prefixed properties\n for (const vendor in prefixedPropREs) {\n if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) {\n deprecated = true;\n break;\n }\n }\n\n if (!deprecated && typeof source[prop] !== 'function') {\n dest[prop] = source[prop];\n }\n }\n return dest;\n}\n\npointerExtend.prefixedPropREs = {\n webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/,\n};\n\nmodule.exports = pointerExtend;\n","const hypot = require('./hypot');\nconst browser = require('./browser');\nconst dom = require('./domObjects');\nconst domUtils = require('./domUtils');\nconst is = require('./is');\nconst pointerExtend = require('./pointerExtend');\n\nconst pointerUtils = {\n copyCoords: function (dest, src) {\n dest.page = dest.page || {};\n dest.page.x = src.page.x;\n dest.page.y = src.page.y;\n\n dest.client = dest.client || {};\n dest.client.x = src.client.x;\n dest.client.y = src.client.y;\n\n dest.timeStamp = src.timeStamp;\n },\n\n setCoordDeltas: function (targetObj, prev, cur) {\n targetObj.page.x = cur.page.x - prev.page.x;\n targetObj.page.y = cur.page.y - prev.page.y;\n targetObj.client.x = cur.client.x - prev.client.x;\n targetObj.client.y = cur.client.y - prev.client.y;\n targetObj.timeStamp = cur.timeStamp - prev.timeStamp;\n\n // set pointer velocity\n const dt = Math.max(targetObj.timeStamp / 1000, 0.001);\n\n targetObj.page.speed = hypot(targetObj.page.x, targetObj.page.y) / dt;\n targetObj.page.vx = targetObj.page.x / dt;\n targetObj.page.vy = targetObj.page.y / dt;\n\n targetObj.client.speed = hypot(targetObj.client.x, targetObj.page.y) / dt;\n targetObj.client.vx = targetObj.client.x / dt;\n targetObj.client.vy = targetObj.client.y / dt;\n },\n\n isNativePointer: function (pointer) {\n return (pointer instanceof dom.Event || pointer instanceof dom.Touch);\n },\n\n // Get specified X/Y coords for mouse or event.touches[0]\n getXY: function (type, pointer, xy) {\n xy = xy || {};\n type = type || 'page';\n\n xy.x = pointer[type + 'X'];\n xy.y = pointer[type + 'Y'];\n\n return xy;\n },\n\n getPageXY: function (pointer, page) {\n page = page || {};\n\n // Opera Mobile handles the viewport and scrolling oddly\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n pointerUtils.getXY('screen', pointer, page);\n\n page.x += window.scrollX;\n page.y += window.scrollY;\n }\n else {\n pointerUtils.getXY('page', pointer, page);\n }\n\n return page;\n },\n\n getClientXY: function (pointer, client) {\n client = client || {};\n\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n // Opera Mobile handles the viewport and scrolling oddly\n pointerUtils.getXY('screen', pointer, client);\n }\n else {\n pointerUtils.getXY('client', pointer, client);\n }\n\n return client;\n },\n\n getPointerId: function (pointer) {\n return is.number(pointer.pointerId)? pointer.pointerId : pointer.identifier;\n },\n\n setCoords: function (targetObj, pointers, timeStamp) {\n const pointer = (pointers.length > 1\n ? pointerUtils.pointerAverage(pointers)\n : pointers[0]);\n\n const tmpXY = {};\n\n pointerUtils.getPageXY(pointer, tmpXY);\n targetObj.page.x = tmpXY.x;\n targetObj.page.y = tmpXY.y;\n\n pointerUtils.getClientXY(pointer, tmpXY);\n targetObj.client.x = tmpXY.x;\n targetObj.client.y = tmpXY.y;\n\n targetObj.timeStamp = is.number(timeStamp) ? timeStamp :new Date().getTime();\n },\n\n pointerExtend: pointerExtend,\n\n getTouchPair: function (event) {\n const touches = [];\n\n // array of touches is supplied\n if (is.array(event)) {\n touches[0] = event[0];\n touches[1] = event[1];\n }\n // an event\n else {\n if (event.type === 'touchend') {\n if (event.touches.length === 1) {\n touches[0] = event.touches[0];\n touches[1] = event.changedTouches[0];\n }\n else if (event.touches.length === 0) {\n touches[0] = event.changedTouches[0];\n touches[1] = event.changedTouches[1];\n }\n }\n else {\n touches[0] = event.touches[0];\n touches[1] = event.touches[1];\n }\n }\n\n return touches;\n },\n\n pointerAverage: function (pointers) {\n const average = {\n pageX : 0,\n pageY : 0,\n clientX: 0,\n clientY: 0,\n screenX: 0,\n screenY: 0,\n };\n\n for (const pointer of pointers) {\n for (const prop in average) {\n average[prop] += pointer[prop];\n }\n }\n for (const prop in average) {\n average[prop] /= pointers.length;\n }\n\n return average;\n },\n\n touchBBox: function (event) {\n if (!event.length && !(event.touches && event.touches.length > 1)) {\n return;\n }\n\n const touches = pointerUtils.getTouchPair(event);\n const minX = Math.min(touches[0].pageX, touches[1].pageX);\n const minY = Math.min(touches[0].pageY, touches[1].pageY);\n const maxX = Math.max(touches[0].pageX, touches[1].pageX);\n const maxY = Math.max(touches[0].pageY, touches[1].pageY);\n\n return {\n x: minX,\n y: minY,\n left: minX,\n top: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n },\n\n touchDistance: function (event, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n\n\n const dx = touches[0][sourceX] - touches[1][sourceX];\n const dy = touches[0][sourceY] - touches[1][sourceY];\n\n return hypot(dx, dy);\n },\n\n touchAngle: function (event, prevAngle, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n const dx = touches[1][sourceX] - touches[0][sourceX];\n const dy = touches[1][sourceY] - touches[0][sourceY];\n const angle = 180 * Math.atan2(dy , dx) / Math.PI;\n\n return angle;\n },\n\n getPointerType: function (pointer, interaction) {\n // if the PointerEvent API isn't available, then the pointer must be ither\n // a MouseEvent or TouchEvent\n if (interaction.mouse) { return 'mouse'; }\n if (!browser.supportsPointerEvent) { return 'touch'; }\n\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : [undefined, undefined,'touch', 'pen', 'mouse'][pointer.pointerType];\n },\n\n // [ event.target, event.currentTarget ]\n getEventTargets: function (event) {\n return [\n domUtils.getActualElement(event.path ? event.path[0] : event.target),\n domUtils.getActualElement(event.currentTarget),\n ];\n },\n};\n\nmodule.exports = pointerUtils;\n","const { window } = require('./window');\n\nconst vendors = ['ms', 'moz', 'webkit', 'o'];\nlet lastTime = 0;\nlet request;\nlet cancel;\n\nfor (let x = 0; x < vendors.length && !window.requestAnimationFrame; x++) {\n request = window[vendors[x] + 'RequestAnimationFrame'];\n cancel = window[vendors[x] +'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n}\n\nif (!request) {\n request = function (callback) {\n const currTime = new Date().getTime();\n const timeToCall = Math.max(0, 16 - (currTime - lastTime));\n const id = setTimeout(function () { callback(currTime + timeToCall); },\n timeToCall);\n\n lastTime = currTime + timeToCall;\n return id;\n };\n}\n\nif (!cancel) {\n cancel = function (id) {\n clearTimeout(id);\n };\n}\n\nmodule.exports = {\n request,\n cancel,\n};\n","const extend = require('./extend');\nconst is = require('./is');\nconst {\n closest,\n parentNode,\n getElementRect,\n} = require('./domUtils');\n\nconst rectUtils = {\n getStringOptionResult: function (value, interactable, element) {\n if (!is.string(value)) {\n return null;\n }\n\n if (value === 'parent') {\n value = parentNode(element);\n }\n else if (value === 'self') {\n value = interactable.getRect(element);\n }\n else {\n value = closest(element, value);\n }\n\n return value;\n },\n\n resolveRectLike: function (value, interactable, element, functionArgs) {\n value = rectUtils.getStringOptionResult(value, interactable, element) || value;\n\n if (is.function(value)) {\n value = value.apply(null, functionArgs);\n }\n\n if (is.element(value)) {\n value = getElementRect(value);\n }\n\n return value;\n },\n\n rectToXY: function (rect) {\n return rect && {\n x: 'x' in rect ? rect.x : rect.left,\n y: 'y' in rect ? rect.y : rect.top,\n };\n },\n\n xywhToTlbr: function (rect) {\n if (rect && !('left' in rect && 'top' in rect)) {\n rect = extend({}, rect);\n\n rect.left = rect.x || 0;\n rect.top = rect.y || 0;\n rect.right = rect.right || (rect.left + rect.width);\n rect.bottom = rect.bottom || (rect.top + rect.height);\n }\n\n return rect;\n },\n\n tlbrToXywh: function (rect) {\n if (rect && !('x' in rect && 'y' in rect)) {\n rect = extend({}, rect);\n\n rect.x = rect.left || 0;\n rect.top = rect.top || 0;\n rect.width = rect.width || (rect.right - rect.x);\n rect.height = rect.height || (rect.bottom - rect.y);\n }\n\n return rect;\n },\n};\n\nmodule.exports = rectUtils;\n","const win = module.exports;\nconst isWindow = require('./isWindow');\n\nfunction init (window) {\n // get wrapped window if using Shadow DOM polyfill\n\n win.realWindow = window;\n\n // create a TextNode\n const el = window.document.createTextNode('');\n\n // check if it's wrapped by a polyfill\n if (el.ownerDocument !== window.document\n && typeof window.wrap === 'function'\n && window.wrap(el) === el) {\n // use wrapped window\n window = window.wrap(window);\n }\n\n win.window = window;\n}\n\nif (typeof window === 'undefined') {\n win.window = undefined;\n win.realWindow = undefined;\n}\nelse {\n init(window);\n}\n\nwin.getWindow = function getWindow (node) {\n if (isWindow(node)) {\n return node;\n }\n\n const rootNode = (node.ownerDocument || node);\n\n return rootNode.defaultView || rootNode.parentWindow || win.window;\n};\n\nwin.init = init;\n"]} \ No newline at end of file +{"version":3,"sources":["src/minHeader.js","src/header.js","index.js","src/Eventable.js","src/InteractEvent.js","src/Interactable.js","src/Interaction.js","src/actions/base.js","src/actions/drag.js","src/actions/drop.js","src/actions/gesture.js","src/actions/resize.js","src/autoScroll.js","src/autoStart/InteractableMethods.js","src/autoStart/base.js","src/autoStart/delay.js","src/autoStart/drag.js","src/autoStart/gesture.js","src/autoStart/resize.js","src/defaultOptions.js","src/index.js","src/inertia.js","src/interact.js","src/interactablePreventDefault.js","src/legacyBrowsers.js","src/modifiers/index.js","src/modifiers/restrict.js","src/modifiers/restrictEdges.js","src/modifiers/restrictSize.js","src/modifiers/snap.js","src/modifiers/snapSize.js","src/pointerEvents/PointerEvent.js","src/pointerEvents/base.js","src/pointerEvents/holdRepeat.js","src/pointerEvents/interactableTargets.js","src/scope.js","src/utils/Signals.js","src/utils/arr.js","src/utils/browser.js","src/utils/domObjects.js","src/utils/domUtils.js","src/utils/events.js","src/utils/extend.js","src/utils/getOriginXY.js","src/utils/hypot.js","src/utils/index.js","src/utils/interactionFinder.js","src/utils/is.js","src/utils/isWindow.js","src/utils/pointerExtend.js","src/utils/pointerUtils.js","src/utils/raf.js","src/utils/rect.js","src/utils/window.js"],"names":[],"mappings":"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","file":"interact.min.js","sourceRoot":"","sourcesContent":["/* interact.js v1.3.0-alpha.4+sha.7970416-dirty | https://raw.github.com/taye/interact.js/master/LICENSE */\n","/**\n * interact.js v1.3.0-alpha.4+sha.7970416-dirty\n *\n * Copyright (c) 2012-2017 Taye Adeyemi \n * Open source under the MIT License.\n * https://raw.github.com/taye/interact.js/master/LICENSE\n */\n","/*\n * In a (windowless) server environment this file exports a factory function\n * that takes the window to use.\n *\n * var interact = require('interact.js')(windowObject);\n *\n * See https://github.com/taye/interact.js/issues/187\n */\nif (typeof window === 'undefined') {\n module.exports = function (window) {\n require('./src/utils/window').init(window);\n\n return require('./src/index');\n };\n}\nelse {\n module.exports = require('./src/index');\n}\n","const { indexOf } = require('./utils/arr');\nconst extend = require('./utils/extend.js');\n\nfunction fireUntilImmediateStopped (event, listeners) {\n for (let i = 0, len = listeners.length; i < len && !event.immediatePropagationStopped; i++) {\n listeners[i](event);\n }\n}\n\nclass Eventable {\n\n constructor (options) {\n this.options = extend({}, options || {});\n }\n\n fire (event) {\n let listeners;\n const onEvent = 'on' + event.type;\n const global = this.global;\n\n // Interactable#on() listeners\n if ((listeners = this[event.type])) {\n fireUntilImmediateStopped(event, listeners);\n }\n\n // interactable.onevent listener\n if (this[onEvent]) {\n this[onEvent](event);\n }\n\n // interact.on() listeners\n if (!event.propagationStopped && global && (listeners = global[event.type])) {\n fireUntilImmediateStopped(event, listeners);\n }\n }\n\n on (eventType, listener) {\n // if this type of event was never bound\n if (this[eventType]) {\n this[eventType].push(listener);\n }\n else {\n this[eventType] = [listener];\n }\n }\n\n off (eventType, listener) {\n // if it is an action event type\n const eventList = this[eventType];\n const index = eventList? indexOf(eventList, listener) : -1;\n\n if (index !== -1) {\n eventList.splice(index, 1);\n }\n\n if (eventList && eventList.length === 0 || !listener) {\n this[eventType] = listener;\n }\n }\n}\n\nmodule.exports = Eventable;\n","const extend = require('./utils/extend');\nconst getOriginXY = require('./utils/getOriginXY');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nclass InteractEvent {\n constructor (interaction, event, action, phase, element, related, preEnd = false) {\n const target = interaction.target;\n const deltaSource = (target && target.options || defaults).deltaSource;\n const origin = getOriginXY(target, element, action);\n const starting = phase === 'start';\n const ending = phase === 'end';\n const coords = starting? interaction.startCoords : interaction.curCoords;\n const prevEvent = interaction.prevEvent;\n\n element = element || interaction.element;\n\n const page = extend({}, coords.page);\n const client = extend({}, coords.client);\n\n page.x -= origin.x;\n page.y -= origin.y;\n\n client.x -= origin.x;\n client.y -= origin.y;\n\n this.ctrlKey = event.ctrlKey;\n this.altKey = event.altKey;\n this.shiftKey = event.shiftKey;\n this.metaKey = event.metaKey;\n this.button = event.button;\n this.buttons = event.buttons;\n this.target = element;\n this.currentTarget = element;\n this.relatedTarget = related || null;\n this.preEnd = preEnd;\n this.type = action + (phase || '');\n this.interaction = interaction;\n this.interactable = target;\n\n this.t0 = starting ? interaction.downTimes[interaction.downTimes.length - 1]\n : prevEvent.t0;\n\n const signalArg = {\n interaction,\n event,\n action,\n phase,\n element,\n related,\n page,\n client,\n coords,\n starting,\n ending,\n deltaSource,\n iEvent: this,\n };\n\n signals.fire('set-xy', signalArg);\n\n if (ending) {\n // use previous coords when ending\n this.pageX = prevEvent.pageX;\n this.pageY = prevEvent.pageY;\n this.clientX = prevEvent.clientX;\n this.clientY = prevEvent.clientY;\n }\n else {\n this.pageX = page.x;\n this.pageY = page.y;\n this.clientX = client.x;\n this.clientY = client.y;\n }\n\n this.x0 = interaction.startCoords.page.x - origin.x;\n this.y0 = interaction.startCoords.page.y - origin.y;\n this.clientX0 = interaction.startCoords.client.x - origin.x;\n this.clientY0 = interaction.startCoords.client.y - origin.y;\n\n signals.fire('set-delta', signalArg);\n\n this.timeStamp = coords.timeStamp;\n this.dt = interaction.pointerDelta.timeStamp;\n this.duration = this.timeStamp - this.t0;\n\n // speed and velocity in pixels per second\n this.speed = interaction.pointerDelta[deltaSource].speed;\n this.velocityX = interaction.pointerDelta[deltaSource].vx;\n this.velocityY = interaction.pointerDelta[deltaSource].vy;\n\n this.swipe = (ending || phase === 'inertiastart')? this.getSwipe() : null;\n\n signals.fire('new', signalArg);\n }\n\n getSwipe () {\n const interaction = this.interaction;\n\n if (interaction.prevEvent.speed < 600\n || this.timeStamp - interaction.prevEvent.timeStamp > 150) {\n return null;\n }\n\n let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI;\n const overlap = 22.5;\n\n if (angle < 0) {\n angle += 360;\n }\n\n const left = 135 - overlap <= angle && angle < 225 + overlap;\n const up = 225 - overlap <= angle && angle < 315 + overlap;\n\n const right = !left && (315 - overlap <= angle || angle < 45 + overlap);\n const down = !up && 45 - overlap <= angle && angle < 135 + overlap;\n\n return {\n up,\n down,\n left,\n right,\n angle,\n speed: interaction.prevEvent.speed,\n velocity: {\n x: interaction.prevEvent.velocityX,\n y: interaction.prevEvent.velocityY,\n },\n };\n }\n\n preventDefault () {}\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n}\n\nsignals.on('set-delta', function ({ iEvent, interaction, starting, deltaSource }) {\n const prevEvent = starting? iEvent : interaction.prevEvent;\n\n if (deltaSource === 'client') {\n iEvent.dx = iEvent.clientX - prevEvent.clientX;\n iEvent.dy = iEvent.clientY - prevEvent.clientY;\n }\n else {\n iEvent.dx = iEvent.pageX - prevEvent.pageX;\n iEvent.dy = iEvent.pageY - prevEvent.pageY;\n }\n});\n\nInteractEvent.signals = signals;\n\nmodule.exports = InteractEvent;\n","const is = require('./utils/is');\nconst events = require('./utils/events');\nconst extend = require('./utils/extend');\nconst actions = require('./actions/base');\nconst scope = require('./scope');\nconst Eventable = require('./Eventable');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nconst {\n getElementRect,\n nodeContains,\n trySelector,\n} = require('./utils/domUtils');\nconst { getWindow } = require('./utils/window');\nconst { indexOf, contains } = require('./utils/arr');\nconst { wheelEvent } = require('./utils/browser');\n\n// all set interactables\nscope.interactables = [];\n\n/*\\\n * Interactable\n [ property ]\n **\n * Object type returned by @interact\n\\*/\nclass Interactable {\n constructor (target, options) {\n options = options || {};\n\n this.target = target;\n this.events = new Eventable();\n this._context = options.context || scope.document;\n this._win = getWindow(trySelector(target)? this._context : target);\n this._doc = this._win.document;\n\n signals.fire('new', {\n target,\n options,\n interactable: this,\n win: this._win,\n });\n\n scope.addDocument( this._doc, this._win );\n\n scope.interactables.push(this);\n\n this.set(options);\n }\n\n setOnEvents (action, phases) {\n const onAction = 'on' + action;\n\n if (is.function(phases.onstart) ) { this.events[onAction + 'start' ] = phases.onstart ; }\n if (is.function(phases.onmove) ) { this.events[onAction + 'move' ] = phases.onmove ; }\n if (is.function(phases.onend) ) { this.events[onAction + 'end' ] = phases.onend ; }\n if (is.function(phases.oninertiastart)) { this.events[onAction + 'inertiastart' ] = phases.oninertiastart ; }\n\n return this;\n }\n\n setPerAction (action, options) {\n // for all the default per-action options\n for (const option in options) {\n // if this option exists for this action\n if (option in defaults[action]) {\n // if the option in the options arg is an object value\n if (is.object(options[option])) {\n // duplicate the object\n this.options[action][option] = extend(this.options[action][option] || {}, options[option]);\n\n if (is.object(defaults.perAction[option]) && 'enabled' in defaults.perAction[option]) {\n this.options[action][option].enabled = options[option].enabled === false? false : true;\n }\n }\n else if (is.bool(options[option]) && is.object(defaults.perAction[option])) {\n this.options[action][option].enabled = options[option];\n }\n else if (options[option] !== undefined) {\n // or if it's not undefined, do a plain assignment\n this.options[action][option] = options[option];\n }\n }\n }\n }\n\n /*\\\n * Interactable.getRect\n [ method ]\n *\n * The default function to get an Interactables bounding rect. Can be\n * overridden using @Interactable.rectChecker.\n *\n - element (Element) #optional The element to measure.\n = (object) The object's bounding rectangle.\n o {\n o top : 0,\n o left : 0,\n o bottom: 0,\n o right : 0,\n o width : 0,\n o height: 0\n o }\n \\*/\n getRect (element) {\n element = element || this.target;\n\n if (is.string(this.target) && !(is.element(element))) {\n element = this._context.querySelector(this.target);\n }\n\n return getElementRect(element);\n }\n\n /*\\\n * Interactable.rectChecker\n [ method ]\n *\n * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n - checker (function) #optional A function which returns this Interactable's bounding rectangle. See @Interactable.getRect\n = (function | object) The checker function or this Interactable\n \\*/\n rectChecker (checker) {\n if (is.function(checker)) {\n this.getRect = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.getRect;\n\n return this;\n }\n\n return this.getRect;\n }\n\n _backCompatOption (optionName, newValue) {\n if (trySelector(newValue) || is.object(newValue)) {\n this.options[optionName] = newValue;\n\n for (const action of actions.names) {\n this.options[action][optionName] = newValue;\n }\n\n return this;\n }\n\n return this.options[optionName];\n }\n\n /*\\\n * Interactable.origin\n [ method ]\n *\n * Gets or sets the origin of the Interactable's element. The x and y\n * of the origin will be subtracted from action event coordinates.\n *\n - origin (object | string) #optional An object eg. { x: 0, y: 0 } or string 'parent', 'self' or any CSS selector\n * OR\n - origin (Element) #optional An HTML or SVG Element whose rect will be used\n **\n = (object) The current origin or this Interactable\n \\*/\n origin (newValue) {\n return this._backCompatOption('origin', newValue);\n }\n\n /*\\\n * Interactable.deltaSource\n [ method ]\n *\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n - newValue (string) #optional Use 'client' if you will be scrolling while interacting; Use 'page' if you want autoScroll to work\n = (string | object) The current deltaSource or this Interactable\n \\*/\n deltaSource (newValue) {\n if (newValue === 'page' || newValue === 'client') {\n this.options.deltaSource = newValue;\n\n return this;\n }\n\n return this.options.deltaSource;\n }\n\n /*\\\n * Interactable.context\n [ method ]\n *\n * Gets the selector context Node of the Interactable. The default is `window.document`.\n *\n = (Node) The context Node of this Interactable\n **\n \\*/\n context () {\n return this._context;\n }\n\n inContext (element) {\n return (this._context === element.ownerDocument\n || nodeContains(this._context, element));\n }\n\n /*\\\n * Interactable.fire\n [ method ]\n *\n * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n - iEvent (InteractEvent) The InteractEvent object to be fired on this Interactable\n = (Interactable) this Interactable\n \\*/\n fire (iEvent) {\n this.events.fire(iEvent);\n\n return this;\n }\n\n _onOffMultiple (method, eventType, listener, options) {\n if (is.string(eventType) && eventType.search(' ') !== -1) {\n eventType = eventType.trim().split(/ +/);\n }\n\n if (is.array(eventType)) {\n for (let i = 0; i < eventType.length; i++) {\n this[method](eventType[i], listener, options);\n }\n\n return true;\n }\n\n if (is.object(eventType)) {\n for (const prop in eventType) {\n this[method](prop, eventType[prop], listener);\n }\n\n return true;\n }\n }\n\n /*\\\n * Interactable.on\n [ method ]\n *\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n - eventType (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) This Interactable\n \\*/\n on (eventType, listener, options) {\n if (this._onOffMultiple('on', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.on(eventType, listener);\n }\n // delegated event for selector\n else if (is.string(this.target)) {\n events.addDelegate(this.target, this._context, eventType, listener, options);\n }\n else {\n events.add(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.off\n [ method ]\n *\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n - eventType (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) This Interactable\n \\*/\n off (eventType, listener, options) {\n if (this._onOffMultiple('off', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n // if it is an action event type\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.off(eventType, listener);\n }\n // delegated event\n else if (is.string(this.target)) {\n events.removeDelegate(this.target, this._context, eventType, listener, options);\n }\n // remove listener from this Interatable's element\n else {\n events.remove(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.set\n [ method ]\n *\n * Reset the options of this Interactable\n - options (object) The new settings to apply\n = (object) This Interactable\n \\*/\n set (options) {\n if (!is.object(options)) {\n options = {};\n }\n\n this.options = extend({}, defaults.base);\n\n const perActions = extend({}, defaults.perAction);\n\n for (const actionName in actions.methodDict) {\n const methodName = actions.methodDict[actionName];\n\n this.options[actionName] = extend({}, defaults[actionName]);\n\n this.setPerAction(actionName, perActions);\n\n this[methodName](options[actionName]);\n }\n\n for (const setting of Interactable.settingsMethods) {\n this.options[setting] = defaults.base[setting];\n\n if (setting in options) {\n this[setting](options[setting]);\n }\n }\n\n signals.fire('set', {\n options,\n interactable: this,\n });\n\n return this;\n }\n\n /*\\\n * Interactable.unset\n [ method ]\n *\n * Remove this interactable from the list of interactables and remove\n * it's action capabilities and event listeners\n *\n = (object) @interact\n \\*/\n unset () {\n events.remove(this.target, 'all');\n\n if (is.string(this.target)) {\n // remove delegated events\n for (const type in events.delegatedEvents) {\n const delegated = events.delegatedEvents[type];\n\n if (delegated.selectors[0] === this.target\n && delegated.contexts[0] === this._context) {\n\n delegated.selectors.splice(0, 1);\n delegated.contexts .splice(0, 1);\n delegated.listeners.splice(0, 1);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegated[type] = null;\n }\n }\n\n events.remove(this._context, type, events.delegateListener);\n events.remove(this._context, type, events.delegateUseCapture, true);\n }\n }\n else {\n events.remove(this, 'all');\n }\n\n signals.fire('unset', { interactable: this });\n\n scope.interactables.splice(indexOf(scope.interactables, this), 1);\n\n // Stop related interactions when an Interactable is unset\n for (const interaction of scope.interactions || []) {\n if (interaction.target === this && interaction.interacting()) {\n interaction.stop();\n }\n }\n\n return scope.interact;\n }\n}\n\nscope.interactables.indexOfElement = function indexOfElement (target, context) {\n context = context || scope.document;\n\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n if (interactable.target === target && interactable._context === context) {\n return i;\n }\n }\n return -1;\n};\n\nscope.interactables.get = function interactableGet (element, options, dontCheckInContext) {\n const ret = this[this.indexOfElement(element, options && options.context)];\n\n return ret && (is.string(element) || dontCheckInContext || ret.inContext(element))? ret : null;\n};\n\nscope.interactables.forEachSelector = function (callback, element) {\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n // skip non CSS selector targets and out of context elements\n if (!is.string(interactable.target)\n || (element && !interactable.inContext(element))) {\n continue;\n }\n\n const ret = callback(interactable, interactable.target, interactable._context, i, this);\n\n if (ret !== undefined) {\n return ret;\n }\n }\n};\n\n// all interact.js eventTypes\nInteractable.eventTypes = scope.eventTypes = [];\n\nInteractable.signals = signals;\n\nInteractable.settingsMethods = [ 'deltaSource', 'origin', 'preventDefault', 'rectChecker' ];\n\nmodule.exports = Interactable;\n","const scope = require('./scope');\nconst utils = require('./utils');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst domObjects = require('./utils/domObjects');\nconst finder = require('./utils/interactionFinder');\nconst signals = require('./utils/Signals').new();\n\nconst listeners = {};\nconst methodNames = [\n 'pointerDown', 'pointerMove', 'pointerUp',\n 'updatePointer', 'removePointer',\n];\n\n// for ignoring browser's simulated mouse events\nlet prevTouchTime = 0;\n\n// all active and idle interactions\nscope.interactions = [];\n\nclass Interaction {\n constructor ({ pointerType }) {\n this.target = null; // current interactable being interacted with\n this.element = null; // the target element of the interactable\n\n this.prepared = { // action that's ready to be fired on next move event\n name : null,\n axis : null,\n edges: null,\n };\n\n // keep track of added pointers\n this.pointers = [];\n this.pointerIds = [];\n this.downTargets = [];\n this.downTimes = [];\n\n // Previous native pointer move event coordinates\n this.prevCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n // current native pointer move event coordinates\n this.curCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Starting InteractEvent pointer coordinates\n this.startCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Change in coordinates and time of the pointer\n this.pointerDelta = {\n page : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n client : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n timeStamp: 0,\n };\n\n this.downEvent = null; // pointerdown/mousedown/touchstart event\n this.downPointer = {};\n\n this._eventTarget = null;\n this._curEventTarget = null;\n\n this.prevEvent = null; // previous action event\n\n this.pointerIsDown = false;\n this.pointerWasMoved = false;\n this._interacting = false;\n\n this.pointerType = pointerType;\n\n signals.fire('new', this);\n\n scope.interactions.push(this);\n }\n\n pointerDown (pointer, event, eventTarget) {\n const pointerIndex = this.updatePointer(pointer, event, true);\n\n signals.fire('down', {\n pointer,\n event,\n eventTarget,\n pointerIndex,\n interaction: this,\n });\n }\n\n /*\\\n * Interaction.start\n [ method ]\n *\n * Start an action with the given Interactable and Element as tartgets. The\n * action must be enabled for the target Interactable and an appropriate number\n * of pointers must be held down - 1 for drag/resize, 2 for gesture.\n *\n * Use it with `interactable.able({ manualStart: false })` to always\n * [start actions manually](https://github.com/taye/interact.js/issues/114)\n *\n - action (object) The action to be performed - drag, resize, etc.\n - target (Interactable) The Interactable to target\n - element (Element) The DOM Element to target\n = (object) interact\n **\n | interact(target)\n | .draggable({\n | // disable the default drag start by down->move\n | manualStart: true\n | })\n | // start dragging after the user holds the pointer down\n | .on('hold', function (event) {\n | var interaction = event.interaction;\n |\n | if (!interaction.interacting()) {\n | interaction.start({ name: 'drag' },\n | event.interactable,\n | event.currentTarget);\n | }\n | });\n \\*/\n start (action, target, element) {\n if (this.interacting()\n || !this.pointerIsDown\n || this.pointerIds.length < (action.name === 'gesture'? 2 : 1)) {\n return;\n }\n\n // if this interaction had been removed after stopping\n // add it back\n if (utils.indexOf(scope.interactions, this) === -1) {\n scope.interactions.push(this);\n }\n\n utils.copyAction(this.prepared, action);\n this.target = target;\n this.element = element;\n\n signals.fire('action-start', {\n interaction: this,\n event: this.downEvent,\n });\n }\n\n pointerMove (pointer, event, eventTarget) {\n if (!this.simulation) {\n this.updatePointer(pointer);\n utils.setCoords(this.curCoords, this.pointers);\n }\n\n const duplicateMove = (this.curCoords.page.x === this.prevCoords.page.x\n && this.curCoords.page.y === this.prevCoords.page.y\n && this.curCoords.client.x === this.prevCoords.client.x\n && this.curCoords.client.y === this.prevCoords.client.y);\n\n let dx;\n let dy;\n\n // register movement greater than pointerMoveTolerance\n if (this.pointerIsDown && !this.pointerWasMoved) {\n dx = this.curCoords.client.x - this.startCoords.client.x;\n dy = this.curCoords.client.y - this.startCoords.client.y;\n\n this.pointerWasMoved = utils.hypot(dx, dy) > Interaction.pointerMoveTolerance;\n }\n\n const signalArg = {\n pointer,\n pointerIndex: this.getPointerIndex(pointer),\n event,\n eventTarget,\n dx,\n dy,\n duplicate: duplicateMove,\n interaction: this,\n interactingBeforeMove: this.interacting(),\n };\n\n if (!duplicateMove) {\n // set pointer coordinate, time changes and speeds\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n }\n\n signals.fire('move', signalArg);\n\n if (!duplicateMove) {\n // if interacting, fire an 'action-move' signal etc\n if (this.interacting()) {\n this.doMove(signalArg);\n }\n\n if (this.pointerWasMoved) {\n utils.copyCoords(this.prevCoords, this.curCoords);\n }\n }\n }\n\n /*\\\n * Interaction.doMove\n [ method ]\n *\n * Force a move of the current action at the same coordinates. Useful if\n * snap/restrict has been changed and you want a movement with the new\n * settings.\n *\n **\n | interact(target)\n | .draggable(true)\n | .on('dragmove', function (event) {\n | if (someCondition) {\n | // change the snap settings\n | event.interactable.draggable({ snap: { targets: [] }});\n | // fire another move event with re-calculated snap\n | event.interaction.doMove();\n | }\n | });\n \\*/\n doMove (signalArg) {\n signalArg = utils.extend({\n pointer: this.pointers[0],\n event: this.prevEvent,\n eventTarget: this._eventTarget,\n interaction: this,\n }, signalArg || {});\n\n signals.fire('before-action-move', signalArg);\n\n if (!this._dontFireMove) {\n signals.fire('action-move', signalArg);\n }\n\n this._dontFireMove = false;\n }\n\n // End interact move events and stop auto-scroll unless simulation is running\n pointerUp (pointer, event, eventTarget, curEventTarget) {\n const pointerIndex = this.getPointerIndex(pointer);\n\n signals.fire(/cancel$/i.test(event.type)? 'cancel' : 'up', {\n pointer,\n pointerIndex,\n event,\n eventTarget,\n curEventTarget,\n interaction: this,\n });\n\n if (!this.simulation) {\n this.end(event);\n }\n\n this.pointerIsDown = false;\n this.removePointer(pointer, event);\n }\n\n /*\\\n * Interaction.end\n [ method ]\n *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n - event (PointerEvent) #optional\n **\n | interact(target)\n | .draggable(true)\n | .on('move', function (event) {\n | if (event.pageX > 1000) {\n | // end the current action\n | event.interaction.end();\n | // stop all further listeners from being called\n | event.stopImmediatePropagation();\n | }\n | });\n \\*/\n end (event) {\n event = event || this.prevEvent;\n\n if (this.interacting()) {\n signals.fire('action-end', {\n event,\n interaction: this,\n });\n }\n\n this.stop();\n }\n\n currentAction () {\n return this._interacting? this.prepared.name: null;\n }\n\n interacting () {\n return this._interacting;\n }\n\n stop () {\n signals.fire('stop', { interaction: this });\n\n if (this._interacting) {\n signals.fire('stop-active', { interaction: this });\n signals.fire('stop-' + this.prepared.name, { interaction: this });\n }\n\n this.target = this.element = null;\n\n this._interacting = false;\n this.prepared.name = this.prevEvent = null;\n }\n\n getPointerIndex (pointer) {\n // mouse and pen interactions may have only one pointer\n if (this.pointerType === 'mouse' || this.pointerType === 'pen') {\n return 0;\n }\n\n return utils.indexOf(this.pointerIds, utils.getPointerId(pointer));\n }\n\n updatePointer (pointer, event, down = event && /(down|start)$/i.test(event.type)) {\n const id = utils.getPointerId(pointer);\n let index = this.getPointerIndex(pointer);\n\n if (index === -1) {\n index = this.pointerIds.length;\n this.pointerIds[index] = id;\n }\n\n if (down) {\n signals.fire('update-pointer-down', {\n pointer,\n event,\n down,\n pointerId: id,\n pointerIndex: index,\n interaction: this,\n });\n }\n\n this.pointers[index] = pointer;\n\n return index;\n }\n\n removePointer (pointer, event) {\n const index = this.getPointerIndex(pointer);\n\n if (index === -1) { return; }\n\n signals.fire('remove-pointer', {\n pointer,\n event,\n pointerIndex: index,\n interaction: this,\n });\n\n this.pointers .splice(index, 1);\n this.pointerIds .splice(index, 1);\n this.downTargets.splice(index, 1);\n this.downTimes .splice(index, 1);\n }\n\n _updateEventTargets (target, currentTarget) {\n this._eventTarget = target;\n this._curEventTarget = currentTarget;\n }\n}\n\nfor (let i = 0, len = methodNames.length; i < len; i++) {\n const method = methodNames[i];\n\n listeners[method] = doOnInteractions(method);\n}\n\nfunction doOnInteractions (method) {\n return (function (event) {\n const pointerType = utils.getPointerType(event);\n const [eventTarget, curEventTarget] = utils.getEventTargets(event);\n const matches = []; // [ [pointer, interaction], ...]\n\n if (browser.supportsTouch && /touch/.test(event.type)) {\n prevTouchTime = new Date().getTime();\n\n for (let i = 0; i < event.changedTouches.length; i++) {\n const pointer = event.changedTouches[i];\n const interaction = finder.search(pointer, event.type, eventTarget);\n\n matches.push([pointer, interaction || new Interaction({ pointerType })]);\n }\n }\n else {\n let invalidPointer = false;\n\n if (!browser.supportsPointerEvent && /mouse/.test(event.type)) {\n // ignore mouse events while touch interactions are active\n for (let i = 0; i < scope.interactions.length && !invalidPointer; i++) {\n invalidPointer = scope.interactions[i].pointerType !== 'mouse' && scope.interactions[i].pointerIsDown;\n }\n\n // try to ignore mouse events that are simulated by the browser\n // after a touch event\n invalidPointer = invalidPointer\n || (new Date().getTime() - prevTouchTime < 500)\n // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated\n || event.timeStamp === 0;\n }\n\n if (!invalidPointer) {\n let interaction = finder.search(event, event.type, eventTarget);\n\n if (!interaction) {\n interaction = new Interaction({ pointerType });\n }\n\n matches.push([event, interaction]);\n }\n }\n\n for (const [pointer, interaction] of matches) {\n interaction._updateEventTargets(eventTarget, curEventTarget);\n interaction[method](pointer, event, eventTarget, curEventTarget);\n }\n });\n}\n\nfunction endAll (event) {\n for (let i = 0; i < scope.interactions.length; i++) {\n const interaction = scope.interactions[i];\n\n interaction.end(event);\n signals.fire('endall', { event, interaction });\n }\n}\n\nconst docEvents = { /* 'eventType': listenerFunc */ };\nconst pEventTypes = browser.pEventTypes;\n\nif (domObjects.PointerEvent) {\n docEvents[pEventTypes.down ] = listeners.pointerDown;\n docEvents[pEventTypes.move ] = listeners.pointerMove;\n docEvents[pEventTypes.up ] = listeners.pointerUp;\n docEvents[pEventTypes.cancel] = listeners.pointerUp;\n}\nelse {\n docEvents.mousedown = listeners.pointerDown;\n docEvents.mousemove = listeners.pointerMove;\n docEvents.mouseup = listeners.pointerUp;\n\n docEvents.touchstart = listeners.pointerDown;\n docEvents.touchmove = listeners.pointerMove;\n docEvents.touchend = listeners.pointerUp;\n docEvents.touchcancel = listeners.pointerUp;\n}\n\ndocEvents.blur = endAll;\n\nfunction onDocSignal ({ doc }, signalName) {\n const eventMethod = signalName.indexOf('add') === 0\n ? events.add : events.remove;\n\n // delegate event listener\n for (const eventType in scope.delegatedEvents) {\n eventMethod(doc, eventType, events.delegateListener);\n eventMethod(doc, eventType, events.delegateUseCapture, true);\n }\n\n for (const eventType in docEvents) {\n eventMethod(doc, eventType, docEvents[eventType]);\n }\n}\n\nsignals.on('update-pointer-down', ({ interaction, pointer, pointerId, pointerIndex, event, eventTarget, down }) => {\n interaction.pointerIds[pointerIndex] = pointerId;\n interaction.pointers[pointerIndex] = pointer;\n\n if (down) {\n interaction.pointerIsDown = true;\n }\n\n if (!interaction.interacting()) {\n utils.setCoords(interaction.startCoords, interaction.pointers);\n\n utils.copyCoords(interaction.curCoords , interaction.startCoords);\n utils.copyCoords(interaction.prevCoords, interaction.startCoords);\n\n interaction.downEvent = event;\n interaction.downTimes[pointerIndex] = interaction.curCoords.timeStamp;\n interaction.downTargets[pointerIndex] = eventTarget || event && utils.getEventTargets(event)[0];\n interaction.pointerWasMoved = false;\n\n utils.pointerExtend(interaction.downPointer, pointer);\n }\n});\n\nscope.signals.on('add-document' , onDocSignal);\nscope.signals.on('remove-document', onDocSignal);\n\nInteraction.pointerMoveTolerance = 1;\nInteraction.doOnInteractions = doOnInteractions;\nInteraction.endAll = endAll;\nInteraction.signals = signals;\nInteraction.docEvents = docEvents;\n\nscope.endAllInteractions = endAll;\n\nmodule.exports = Interaction;\n","const Interaction = require('../Interaction');\nconst InteractEvent = require('../InteractEvent');\n\nconst actions = {\n firePrepared,\n names: [],\n methodDict: {},\n};\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n interaction._interacting = true;\n firePrepared(interaction, event, 'start');\n});\n\nInteraction.signals.on('action-move', function ({ interaction, event, preEnd }) {\n firePrepared(interaction, event, 'move', preEnd);\n\n // if the action was ended in a listener\n if (!interaction.interacting()) { return false; }\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n firePrepared(interaction, event, 'end');\n});\n\nfunction firePrepared (interaction, event, phase, preEnd) {\n const actionName = interaction.prepared.name;\n\n const newEvent = new InteractEvent(interaction, event, actionName, phase, interaction.element, null, preEnd);\n\n interaction.target.fire(newEvent);\n interaction.prevEvent = newEvent;\n}\n\nmodule.exports = actions;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drag = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n startAxis : 'xy',\n lockAxis : 'xy',\n },\n\n checker: function (pointer, event, interactable) {\n const dragOptions = interactable.options.drag;\n\n return dragOptions.enabled\n ? { name: 'drag', axis: (dragOptions.lockAxis === 'start'\n ? dragOptions.startAxis\n : dragOptions.lockAxis)}\n : null;\n },\n\n getCursor: function () {\n return 'move';\n },\n};\n\nInteraction.signals.on('before-action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n interaction.curCoords.page.y = interaction.startCoords.page.y;\n interaction.curCoords.client.y = interaction.startCoords.client.y;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vx);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vx);\n interaction.pointerDelta.client.vy = 0;\n interaction.pointerDelta.page.vy = 0;\n }\n else if (axis === 'y') {\n interaction.curCoords.page.x = interaction.startCoords.page.x;\n interaction.curCoords.client.x = interaction.startCoords.client.x;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vy);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vy);\n interaction.pointerDelta.client.vx = 0;\n interaction.pointerDelta.page.vx = 0;\n }\n});\n\n// dragmove\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'dragmove') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n iEvent.pageY = interaction.startCoords.page.y;\n iEvent.clientY = interaction.startCoords.client.y;\n iEvent.dy = 0;\n }\n else if (axis === 'y') {\n iEvent.pageX = interaction.startCoords.page.x;\n iEvent.clientX = interaction.startCoords.client.x;\n iEvent.dx = 0;\n }\n});\n\n/*\\\n * Interactable.draggable\n [ method ]\n *\n * Gets or sets whether drag actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of drag events\n | var isDraggable = interact('ul li').draggable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on drag events (object makes the Interactable draggable)\n = (object) This Interactable\n | interact(element).draggable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // the axis in which the first movement must be\n | // for the drag sequence to start\n | // 'xy' by default - any direction\n | startAxis: 'x' || 'y' || 'xy',\n |\n | // 'xy' by default - don't restrict to one axis (move in any direction)\n | // 'x' or 'y' to restrict movement to either axis\n | // 'start' to restrict movement to the axis the drag started in\n | lockAxis: 'x' || 'y' || 'xy' || 'start',\n |\n | // max number of drags that can happen concurrently\n | // with elements of this Interactable. Infinity by default\n | max: Infinity,\n |\n | // max number of drags that can target the same element+Interactable\n | // 1 by default\n | maxPerElement: 2\n | });\n\\*/\nInteractable.prototype.draggable = function (options) {\n if (utils.is.object(options)) {\n this.options.drag.enabled = options.enabled === false? false: true;\n this.setPerAction('drag', options);\n this.setOnEvents('drag', options);\n\n if (/^(xy|x|y|start)$/.test(options.lockAxis)) {\n this.options.drag.lockAxis = options.lockAxis;\n }\n if (/^(xy|x|y)$/.test(options.startAxis)) {\n this.options.drag.startAxis = options.startAxis;\n }\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drag.enabled = options;\n\n if (!options) {\n this.ondragstart = this.ondragstart = this.ondragend = null;\n }\n\n return this;\n }\n\n return this.options.drag;\n};\n\nactions.drag = drag;\nactions.names.push('drag');\nutils.merge(Interactable.eventTypes, [\n 'dragstart',\n 'dragmove',\n 'draginertiastart',\n 'draginertiaresume',\n 'dragend',\n]);\nactions.methodDict.drag = 'draggable';\n\ndefaultOptions.drag = drag.defaults;\n\nmodule.exports = drag;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst scope = require('../scope');\nconst interact = require('../interact');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drop = {\n defaults: {\n enabled: false,\n accept : null,\n overlap: 'pointer',\n },\n};\n\nlet dynamicDrop = false;\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // reset active dropzones\n interaction.activeDrops.dropzones = [];\n interaction.activeDrops.elements = [];\n interaction.activeDrops.rects = [];\n\n interaction.dropEvents = null;\n\n if (!interaction.dynamicDrop) {\n setActiveDrops(interaction, interaction.element);\n }\n\n const dragEvent = interaction.prevEvent;\n const dropEvents = getDropEvents(interaction, event, dragEvent);\n\n if (dropEvents.activate) {\n fireActiveDrops(interaction, dropEvents.activate);\n }\n});\n\nInteractEvent.signals.on('new', function ({ interaction, iEvent, event }) {\n if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { return; }\n\n const draggableElement = interaction.element;\n const dragEvent = iEvent;\n const dropResult = getDrop(dragEvent, event, draggableElement);\n\n interaction.dropTarget = dropResult.dropzone;\n interaction.dropElement = dropResult.element;\n\n interaction.dropEvents = getDropEvents(interaction, event, dragEvent);\n});\n\nInteraction.signals.on('action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n fireDropEvents(interaction, interaction.dropEvents);\n});\n\nInteraction.signals.on('action-end', function ({ interaction }) {\n if (interaction.prepared.name === 'drag') {\n fireDropEvents(interaction, interaction.dropEvents);\n }\n});\n\nInteraction.signals.on('stop-drag', function ({ interaction }) {\n interaction.activeDrops.dropzones =\n interaction.activeDrops.elements =\n interaction.activeDrops.rects =\n interaction.dropEvents = null;\n});\n\nfunction collectDrops (interaction, element) {\n const drops = [];\n const elements = [];\n\n element = element || interaction.element;\n\n // collect all dropzones and their elements which qualify for a drop\n for (const current of scope.interactables) {\n if (!current.options.drop.enabled) { continue; }\n\n const accept = current.options.drop.accept;\n\n // test the draggable element against the dropzone's accept setting\n if ((utils.is.element(accept) && accept !== element)\n || (utils.is.string(accept)\n && !utils.matchesSelector(element, accept))) {\n\n continue;\n }\n\n // query for new elements if necessary\n const dropElements = utils.is.string(current.target)\n ? current._context.querySelectorAll(current.target)\n : [current.target];\n\n for (let i = 0; i < dropElements.length; i++) {\n const currentElement = dropElements[i];\n\n if (currentElement !== element) {\n drops.push(current);\n elements.push(currentElement);\n }\n }\n }\n\n return {\n elements,\n dropzones: drops,\n };\n}\n\nfunction fireActiveDrops (interaction, event) {\n let prevElement;\n\n // loop through all active dropzones and trigger event\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n const current = interaction.activeDrops.dropzones[i];\n const currentElement = interaction.activeDrops.elements [i];\n\n // prevent trigger of duplicate events on same element\n if (currentElement !== prevElement) {\n // set current element as event target\n event.target = currentElement;\n current.fire(event);\n }\n prevElement = currentElement;\n }\n}\n\n// Collect a new set of possible drops and save them in activeDrops.\n// setActiveDrops should always be called when a drag has just started or a\n// drag event happens while dynamicDrop is true\nfunction setActiveDrops (interaction, dragElement) {\n // get dropzones and their elements that could receive the draggable\n const possibleDrops = collectDrops(interaction, dragElement, true);\n\n interaction.activeDrops.dropzones = possibleDrops.dropzones;\n interaction.activeDrops.elements = possibleDrops.elements;\n interaction.activeDrops.rects = [];\n\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n interaction.activeDrops.rects[i] =\n interaction.activeDrops.dropzones[i].getRect(interaction.activeDrops.elements[i]);\n }\n}\n\nfunction getDrop (dragEvent, event, dragElement) {\n const interaction = dragEvent.interaction;\n const validDrops = [];\n\n if (dynamicDrop) {\n setActiveDrops(interaction, dragElement);\n }\n\n // collect all dropzones and their elements which qualify for a drop\n for (let j = 0; j < interaction.activeDrops.dropzones.length; j++) {\n const current = interaction.activeDrops.dropzones[j];\n const currentElement = interaction.activeDrops.elements [j];\n const rect = interaction.activeDrops.rects [j];\n\n validDrops.push(current.dropCheck(dragEvent, event, interaction.target, dragElement, currentElement, rect)\n ? currentElement\n : null);\n }\n\n // get the most appropriate dropzone based on DOM depth and order\n const dropIndex = utils.indexOfDeepestElement(validDrops);\n\n return {\n dropzone: interaction.activeDrops.dropzones[dropIndex] || null,\n element : interaction.activeDrops.elements [dropIndex] || null,\n };\n}\n\nfunction getDropEvents (interaction, pointerEvent, dragEvent) {\n const dropEvents = {\n enter : null,\n leave : null,\n activate : null,\n deactivate: null,\n move : null,\n drop : null,\n };\n\n const tmpl = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n };\n\n if (interaction.dropElement !== interaction.prevDropElement) {\n // if there was a prevDropTarget, create a dragleave event\n if (interaction.prevDropTarget) {\n dropEvents.leave = utils.extend({ type: 'dragleave' }, tmpl);\n\n dragEvent.dragLeave = dropEvents.leave.target = interaction.prevDropElement;\n dragEvent.prevDropzone = dropEvents.leave.dropzone = interaction.prevDropTarget;\n }\n // if the dropTarget is not null, create a dragenter event\n if (interaction.dropTarget) {\n dropEvents.enter = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n type : 'dragenter',\n };\n\n dragEvent.dragEnter = interaction.dropElement;\n dragEvent.dropzone = interaction.dropTarget;\n }\n }\n\n if (dragEvent.type === 'dragend' && interaction.dropTarget) {\n dropEvents.drop = utils.extend({ type: 'drop' }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n dragEvent.relatedTarget = interaction.dropElement;\n }\n if (dragEvent.type === 'dragstart') {\n dropEvents.activate = utils.extend({ type: 'dropactivate' }, tmpl);\n\n dropEvents.activate.target = null;\n dropEvents.activate.dropzone = null;\n }\n if (dragEvent.type === 'dragend') {\n dropEvents.deactivate = utils.extend({ type: 'dropdeactivate' }, tmpl);\n\n dropEvents.deactivate.target = null;\n dropEvents.deactivate.dropzone = null;\n }\n if (dragEvent.type === 'dragmove' && interaction.dropTarget) {\n dropEvents.move = utils.extend({\n dragmove : dragEvent,\n type : 'dropmove',\n }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n }\n\n return dropEvents;\n}\n\nfunction fireDropEvents (interaction, dropEvents) {\n if (dropEvents.leave) { interaction.prevDropTarget.fire(dropEvents.leave); }\n if (dropEvents.move ) { interaction.dropTarget.fire(dropEvents.move ); }\n if (dropEvents.enter) { interaction.dropTarget.fire(dropEvents.enter); }\n if (dropEvents.drop ) { interaction.dropTarget.fire(dropEvents.drop ); }\n if (dropEvents.deactivate) {\n fireActiveDrops(interaction, dropEvents.deactivate);\n }\n\n interaction.prevDropTarget = interaction.dropTarget;\n interaction.prevDropElement = interaction.dropElement;\n}\n\n/*\\\n * Interactable.dropzone\n [ method ]\n *\n * Returns or sets whether elements can be dropped onto this\n * Interactable to trigger drop events\n *\n * Dropzones can receive the following events:\n * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends\n * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone\n * - `dragmove` when a draggable that has entered the dropzone is moved\n * - `drop` when a draggable is dropped into this dropzone\n *\n * Use the `accept` option to allow only elements that match the given CSS\n * selector or element. The value can be:\n *\n * - **an Element** - only that element can be dropped into this dropzone.\n * - **a string**, - the element being dragged must match it as a CSS selector.\n * - **`null`** - accept options is cleared - it accepts any element.\n *\n * Use the `overlap` option to set how drops are checked for. The allowed\n * values are:\n *\n * - `'pointer'`, the pointer must be over the dropzone (default)\n * - `'center'`, the draggable element's center must be over the dropzone\n * - a number from 0-1 which is the `(intersection area) / (draggable area)`.\n * e.g. `0.5` for drop to happen when half of the area of the draggable is\n * over the dropzone\n *\n * Use the `checker` option to specify a function to check if a dragged\n * element is over this Interactable.\n *\n | interact(target)\n | .dropChecker(function(dragEvent, // related dragmove or dragend event\n | event, // TouchEvent/PointerEvent/MouseEvent\n | dropped, // bool result of the default checker\n | dropzone, // dropzone Interactable\n | dropElement, // dropzone elemnt\n | draggable, // draggable Interactable\n | draggableElement) {// draggable element\n |\n | return dropped && event.target.hasAttribute('allow-drop');\n | }\n *\n *\n - options (boolean | object | null) #optional The new value to be set.\n | interact('.drop').dropzone({\n | accept: '.can-drop' || document.getElementById('single-drop'),\n | overlap: 'pointer' || 'center' || zeroToOne\n | }\n = (boolean | object) The current setting or this Interactable\n\\*/\nInteractable.prototype.dropzone = function (options) {\n if (utils.is.object(options)) {\n this.options.drop.enabled = options.enabled === false? false: true;\n\n if (utils.is.function(options.ondrop) ) { this.events.ondrop = options.ondrop ; }\n if (utils.is.function(options.ondropactivate) ) { this.events.ondropactivate = options.ondropactivate ; }\n if (utils.is.function(options.ondropdeactivate)) { this.events.ondropdeactivate = options.ondropdeactivate; }\n if (utils.is.function(options.ondragenter) ) { this.events.ondragenter = options.ondragenter ; }\n if (utils.is.function(options.ondragleave) ) { this.events.ondragleave = options.ondragleave ; }\n if (utils.is.function(options.ondropmove) ) { this.events.ondropmove = options.ondropmove ; }\n\n if (/^(pointer|center)$/.test(options.overlap)) {\n this.options.drop.overlap = options.overlap;\n }\n else if (utils.is.number(options.overlap)) {\n this.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0);\n }\n if ('accept' in options) {\n this.options.drop.accept = options.accept;\n }\n if ('checker' in options) {\n this.options.drop.checker = options.checker;\n }\n\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drop.enabled = options;\n\n if (!options) {\n this.ondragenter = this.ondragleave = this.ondrop\n = this.ondropactivate = this.ondropdeactivate = null;\n }\n\n return this;\n }\n\n return this.options.drop;\n};\n\nInteractable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) {\n let dropped = false;\n\n // if the dropzone has no rect (eg. display: none)\n // call the custom dropChecker or just return false\n if (!(rect = rect || this.getRect(dropElement))) {\n return (this.options.drop.checker\n ? this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement)\n : false);\n }\n\n const dropOverlap = this.options.drop.overlap;\n\n if (dropOverlap === 'pointer') {\n const origin = utils.getOriginXY(draggable, draggableElement, 'drag');\n const page = utils.getPageXY(dragEvent);\n\n page.x += origin.x;\n page.y += origin.y;\n\n const horizontal = (page.x > rect.left) && (page.x < rect.right);\n const vertical = (page.y > rect.top ) && (page.y < rect.bottom);\n\n dropped = horizontal && vertical;\n }\n\n const dragRect = draggable.getRect(draggableElement);\n\n if (dragRect && dropOverlap === 'center') {\n const cx = dragRect.left + dragRect.width / 2;\n const cy = dragRect.top + dragRect.height / 2;\n\n dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom;\n }\n\n if (dragRect && utils.is.number(dropOverlap)) {\n const overlapArea = (Math.max(0, Math.min(rect.right , dragRect.right ) - Math.max(rect.left, dragRect.left))\n * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top , dragRect.top )));\n\n const overlapRatio = overlapArea / (dragRect.width * dragRect.height);\n\n dropped = overlapRatio >= dropOverlap;\n }\n\n if (this.options.drop.checker) {\n dropped = this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement);\n }\n\n return dropped;\n};\n\nInteractable.signals.on('unset', function ({ interactable }) {\n interactable.dropzone(false);\n});\n\nInteractable.settingsMethods.push('dropChecker');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.dropTarget = null; // the dropzone a drag target might be dropped into\n interaction.dropElement = null; // the element at the time of checking\n interaction.prevDropTarget = null; // the dropzone that was recently dragged away from\n interaction.prevDropElement = null; // the element at the time of checking\n interaction.dropEvents = null; // the dropEvents related to the current drag event\n\n interaction.activeDrops = {\n dropzones: [], // the dropzones that are mentioned below\n elements : [], // elements of dropzones that accept the target draggable\n rects : [], // the rects of the elements mentioned above\n };\n\n});\n\nInteraction.signals.on('stop', function ({ interaction }) {\n interaction.dropTarget = interaction.dropElement =\n interaction.prevDropTarget = interaction.prevDropElement = null;\n});\n\n/*\\\n * interact.dynamicDrop\n [ method ]\n *\n * Returns or sets whether the dimensions of dropzone elements are\n * calculated on every dragmove or only on dragstart for the default\n * dropChecker\n *\n - newValue (boolean) #optional True to check on each move. False to check only before start\n = (boolean | interact) The current setting or interact\n\\*/\ninteract.dynamicDrop = function (newValue) {\n if (utils.is.bool(newValue)) {\n //if (dragging && dynamicDrop !== newValue && !newValue) {\n //calcRects(dropzones);\n //}\n\n dynamicDrop = newValue;\n\n return interact;\n }\n return dynamicDrop;\n};\n\nutils.merge(Interactable.eventTypes, [\n 'dragenter',\n 'dragleave',\n 'dropactivate',\n 'dropdeactivate',\n 'dropmove',\n 'drop',\n]);\nactions.methodDict.drop = 'dropzone';\n\ndefaultOptions.drop = drop.defaults;\n\nmodule.exports = drop;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst gesture = {\n defaults: {\n enabled : false,\n origin : null,\n restrict: null,\n },\n\n checker: function (pointer, event, interactable, element, interaction) {\n if (interaction.pointerIds.length >= 2) {\n return { name: 'gesture' };\n }\n\n return null;\n },\n\n getCursor: function () {\n return '';\n },\n};\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturestart') { return; }\n iEvent.ds = 0;\n\n interaction.gesture.startDistance = interaction.gesture.prevDistance = iEvent.distance;\n interaction.gesture.startAngle = interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.scale = 1;\n});\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturemove') { return; }\n\n iEvent.ds = iEvent.scale - interaction.gesture.scale;\n\n interaction.target.fire(iEvent);\n\n interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.prevDistance = iEvent.distance;\n\n if (iEvent.scale !== Infinity\n && iEvent.scale !== null\n && iEvent.scale !== undefined\n && !isNaN(iEvent.scale)) {\n\n interaction.gesture.scale = iEvent.scale;\n }\n});\n\n/*\\\n * Interactable.gesturable\n [ method ]\n *\n * Gets or sets whether multitouch gestures can be performed on the\n * Interactable's element\n *\n = (boolean) Indicates if this can be the target of gesture events\n | var isGestureable = interact(element).gesturable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on gesture events (makes the Interactable gesturable)\n = (object) this Interactable\n | interact(element).gesturable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // limit multiple gestures.\n | // See the explanation in @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n\\*/\nInteractable.prototype.gesturable = function (options) {\n if (utils.is.object(options)) {\n this.options.gesture.enabled = options.enabled === false? false: true;\n this.setPerAction('gesture', options);\n this.setOnEvents('gesture', options);\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.gesture.enabled = options;\n\n if (!options) {\n this.ongesturestart = this.ongesturestart = this.ongestureend = null;\n }\n\n return this;\n }\n\n return this.options.gesture;\n};\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action, event, starting, ending, deltaSource }) {\n if (action !== 'gesture') { return; }\n\n const pointers = interaction.pointers;\n\n iEvent.touches = [pointers[0], pointers[1]];\n\n if (starting) {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = 1;\n iEvent.ds = 0;\n iEvent.angle = utils.touchAngle(pointers, undefined, deltaSource);\n iEvent.da = 0;\n }\n else if (ending || event instanceof InteractEvent) {\n iEvent.distance = interaction.prevEvent.distance;\n iEvent.box = interaction.prevEvent.box;\n iEvent.scale = interaction.prevEvent.scale;\n iEvent.ds = iEvent.scale - 1;\n iEvent.angle = interaction.prevEvent.angle;\n iEvent.da = iEvent.angle - interaction.gesture.startAngle;\n }\n else {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = iEvent.distance / interaction.gesture.startDistance;\n iEvent.angle = utils.touchAngle(pointers, interaction.gesture.prevAngle, deltaSource);\n\n iEvent.ds = iEvent.scale - interaction.gesture.prevScale;\n iEvent.da = iEvent.angle - interaction.gesture.prevAngle;\n }\n});\n\nInteraction.signals.on('new', function (interaction) {\n interaction.gesture = {\n start: { x: 0, y: 0 },\n\n startDistance: 0, // distance between two touches of touchStart\n prevDistance : 0,\n distance : 0,\n\n scale: 1, // gesture.distance / gesture.startDistance\n\n startAngle: 0, // angle of line joining two touches\n prevAngle : 0, // angle of the previous gesture event\n };\n});\n\nactions.gesture = gesture;\nactions.names.push('gesture');\nutils.merge(Interactable.eventTypes, [\n 'gesturestart',\n 'gesturemove',\n 'gestureend',\n]);\nactions.methodDict.gesture = 'gesturable';\n\ndefaultOptions.gesture = gesture.defaults;\n\nmodule.exports = gesture;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\n// Less Precision with touch input\nconst defaultMargin = browser.supportsTouch || browser.supportsPointerEvent? 20: 10;\n\nconst resize = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n square: false,\n preserveAspectRatio: false,\n axis: 'xy',\n\n // use default margin\n margin: NaN,\n\n // object with props left, right, top, bottom which are\n // true/false values to resize when the pointer is over that edge,\n // CSS selectors to match the handles for each direction\n // or the Elements for each handle\n edges: null,\n\n // a value of 'none' will limit the resize rect to a minimum of 0x0\n // 'negate' will alow the rect to have negative width/height\n // 'reposition' will keep the width/height positive by swapping\n // the top and bottom edges and/or swapping the left and right edges\n invert: 'none',\n },\n\n checker: function (pointer, event, interactable, element, interaction, rect) {\n if (!rect) { return null; }\n\n const page = utils.extend({}, interaction.curCoords.page);\n const options = interactable.options;\n\n if (options.resize.enabled) {\n const resizeOptions = options.resize;\n const resizeEdges = { left: false, right: false, top: false, bottom: false };\n\n // if using resize.edges\n if (utils.is.object(resizeOptions.edges)) {\n for (const edge in resizeEdges) {\n resizeEdges[edge] = checkResizeEdge(edge,\n resizeOptions.edges[edge],\n page,\n interaction._eventTarget,\n element,\n rect,\n resizeOptions.margin || defaultMargin);\n }\n\n resizeEdges.left = resizeEdges.left && !resizeEdges.right;\n resizeEdges.top = resizeEdges.top && !resizeEdges.bottom;\n\n if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) {\n return {\n name: 'resize',\n edges: resizeEdges,\n };\n }\n }\n else {\n const right = options.resize.axis !== 'y' && page.x > (rect.right - defaultMargin);\n const bottom = options.resize.axis !== 'x' && page.y > (rect.bottom - defaultMargin);\n\n if (right || bottom) {\n return {\n name: 'resize',\n axes: (right? 'x' : '') + (bottom? 'y' : ''),\n };\n }\n }\n }\n\n return null;\n },\n\n cursors: (browser.isIe9OrOlder ? {\n x : 'e-resize',\n y : 's-resize',\n xy: 'se-resize',\n\n top : 'n-resize',\n left : 'w-resize',\n bottom : 's-resize',\n right : 'e-resize',\n topleft : 'se-resize',\n bottomright: 'se-resize',\n topright : 'ne-resize',\n bottomleft : 'ne-resize',\n } : {\n x : 'ew-resize',\n y : 'ns-resize',\n xy: 'nwse-resize',\n\n top : 'ns-resize',\n left : 'ew-resize',\n bottom : 'ns-resize',\n right : 'ew-resize',\n topleft : 'nwse-resize',\n bottomright: 'nwse-resize',\n topright : 'nesw-resize',\n bottomleft : 'nesw-resize',\n }),\n\n getCursor: function (action) {\n if (action.axis) {\n return resize.cursors[action.name + action.axis];\n }\n else if (action.edges) {\n let cursorKey = '';\n const edgeNames = ['top', 'bottom', 'left', 'right'];\n\n for (let i = 0; i < 4; i++) {\n if (action.edges[edgeNames[i]]) {\n cursorKey += edgeNames[i];\n }\n }\n\n return resize.cursors[cursorKey];\n }\n },\n};\n\n// resizestart\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'resizestart' || !interaction.prepared.edges) {\n return;\n }\n\n const startRect = interaction.target.getRect(interaction.element);\n const resizeOptions = interaction.target.options.resize;\n\n /*\n * When using the `resizable.square` or `resizable.preserveAspectRatio` options, resizing from one edge\n * will affect another. E.g. with `resizable.square`, resizing to make the right edge larger will make\n * the bottom edge larger by the same amount. We call these 'linked' edges. Any linked edges will depend\n * on the active edges and the edge being interacted with.\n */\n if (resizeOptions.square || resizeOptions.preserveAspectRatio) {\n const linkedEdges = utils.extend({}, interaction.prepared.edges);\n\n linkedEdges.top = linkedEdges.top || (linkedEdges.left && !linkedEdges.bottom);\n linkedEdges.left = linkedEdges.left || (linkedEdges.top && !linkedEdges.right );\n linkedEdges.bottom = linkedEdges.bottom || (linkedEdges.right && !linkedEdges.top );\n linkedEdges.right = linkedEdges.right || (linkedEdges.bottom && !linkedEdges.left );\n\n interaction.prepared._linkedEdges = linkedEdges;\n }\n else {\n interaction.prepared._linkedEdges = null;\n }\n\n // if using `resizable.preserveAspectRatio` option, record aspect ratio at the start of the resize\n if (resizeOptions.preserveAspectRatio) {\n interaction.resizeStartAspectRatio = startRect.width / startRect.height;\n }\n\n interaction.resizeRects = {\n start : startRect,\n current : utils.extend({}, startRect),\n inverted : utils.extend({}, startRect),\n previous : utils.extend({}, startRect),\n delta : {\n left: 0, right : 0, width : 0,\n top : 0, bottom: 0, height: 0,\n },\n };\n\n iEvent.rect = interaction.resizeRects.inverted;\n iEvent.deltaRect = interaction.resizeRects.delta;\n});\n\n// resizemove\nInteractEvent.signals.on('new', function ({ iEvent, phase, interaction }) {\n if (phase !== 'move' || !interaction.prepared.edges) { return; }\n\n const resizeOptions = interaction.target.options.resize;\n const invert = resizeOptions.invert;\n const invertible = invert === 'reposition' || invert === 'negate';\n\n let edges = interaction.prepared.edges;\n\n const start = interaction.resizeRects.start;\n const current = interaction.resizeRects.current;\n const inverted = interaction.resizeRects.inverted;\n const delta = interaction.resizeRects.delta;\n const previous = utils.extend(interaction.resizeRects.previous, inverted);\n const originalEdges = edges;\n\n let dx = iEvent.dx;\n let dy = iEvent.dy;\n\n if (resizeOptions.preserveAspectRatio || resizeOptions.square) {\n // `resize.preserveAspectRatio` takes precedence over `resize.square`\n const startAspectRatio = resizeOptions.preserveAspectRatio\n ? interaction.resizeStartAspectRatio\n : 1;\n\n edges = interaction.prepared._linkedEdges;\n\n if ((originalEdges.left && originalEdges.bottom)\n || (originalEdges.right && originalEdges.top)) {\n dy = -dx / startAspectRatio;\n }\n else if (originalEdges.left || originalEdges.right ) { dy = dx / startAspectRatio; }\n else if (originalEdges.top || originalEdges.bottom) { dx = dy * startAspectRatio; }\n }\n\n // update the 'current' rect without modifications\n if (edges.top ) { current.top += dy; }\n if (edges.bottom) { current.bottom += dy; }\n if (edges.left ) { current.left += dx; }\n if (edges.right ) { current.right += dx; }\n\n if (invertible) {\n // if invertible, copy the current rect\n utils.extend(inverted, current);\n\n if (invert === 'reposition') {\n // swap edge values if necessary to keep width/height positive\n let swap;\n\n if (inverted.top > inverted.bottom) {\n swap = inverted.top;\n\n inverted.top = inverted.bottom;\n inverted.bottom = swap;\n }\n if (inverted.left > inverted.right) {\n swap = inverted.left;\n\n inverted.left = inverted.right;\n inverted.right = swap;\n }\n }\n }\n else {\n // if not invertible, restrict to minimum of 0x0 rect\n inverted.top = Math.min(current.top, start.bottom);\n inverted.bottom = Math.max(current.bottom, start.top);\n inverted.left = Math.min(current.left, start.right);\n inverted.right = Math.max(current.right, start.left);\n }\n\n inverted.width = inverted.right - inverted.left;\n inverted.height = inverted.bottom - inverted.top ;\n\n for (const edge in inverted) {\n delta[edge] = inverted[edge] - previous[edge];\n }\n\n iEvent.edges = interaction.prepared.edges;\n iEvent.rect = inverted;\n iEvent.deltaRect = delta;\n});\n\n/*\\\n * Interactable.resizable\n [ method ]\n *\n * Gets or sets whether resize actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of resize elements\n | var isResizeable = interact('input[type=text]').resizable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on resize events (object makes the Interactable resizable)\n = (object) This Interactable\n | interact(element).resizable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | edges: {\n | top : true, // Use pointer coords to check for resize.\n | left : false, // Disable resizing from left edge.\n | bottom: '.resize-s',// Resize if pointer target matches selector\n | right : handleEl // Resize if pointer target is the given Element\n | },\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height are adjusted at a 1:1 ratio.\n | square: false,\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height maintain the aspect ratio they had when resizing started.\n | preserveAspectRatio: false,\n |\n | // a value of 'none' will limit the resize rect to a minimum of 0x0\n | // 'negate' will allow the rect to have negative width/height\n | // 'reposition' will keep the width/height positive by swapping\n | // the top and bottom edges and/or swapping the left and right edges\n | invert: 'none' || 'negate' || 'reposition'\n |\n | // limit multiple resizes.\n | // See the explanation in the @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n \\*/\nInteractable.prototype.resizable = function (options) {\n if (utils.is.object(options)) {\n this.options.resize.enabled = options.enabled === false? false: true;\n this.setPerAction('resize', options);\n this.setOnEvents('resize', options);\n\n if (/^x$|^y$|^xy$/.test(options.axis)) {\n this.options.resize.axis = options.axis;\n }\n else if (options.axis === null) {\n this.options.resize.axis = defaultOptions.resize.axis;\n }\n\n if (utils.is.bool(options.preserveAspectRatio)) {\n this.options.resize.preserveAspectRatio = options.preserveAspectRatio;\n }\n else if (utils.is.bool(options.square)) {\n this.options.resize.square = options.square;\n }\n\n return this;\n }\n if (utils.is.bool(options)) {\n this.options.resize.enabled = options;\n\n if (!options) {\n this.onresizestart = this.onresizestart = this.onresizeend = null;\n }\n\n return this;\n }\n return this.options.resize;\n};\n\nfunction checkResizeEdge (name, value, page, element, interactableElement, rect, margin) {\n // false, '', undefined, null\n if (!value) { return false; }\n\n // true value, use pointer coords and element rect\n if (value === true) {\n // if dimensions are negative, \"switch\" edges\n const width = utils.is.number(rect.width )? rect.width : rect.right - rect.left;\n const height = utils.is.number(rect.height)? rect.height : rect.bottom - rect.top ;\n\n if (width < 0) {\n if (name === 'left' ) { name = 'right'; }\n else if (name === 'right') { name = 'left' ; }\n }\n if (height < 0) {\n if (name === 'top' ) { name = 'bottom'; }\n else if (name === 'bottom') { name = 'top' ; }\n }\n\n if (name === 'left' ) { return page.x < ((width >= 0? rect.left: rect.right ) + margin); }\n if (name === 'top' ) { return page.y < ((height >= 0? rect.top : rect.bottom) + margin); }\n\n if (name === 'right' ) { return page.x > ((width >= 0? rect.right : rect.left) - margin); }\n if (name === 'bottom') { return page.y > ((height >= 0? rect.bottom: rect.top ) - margin); }\n }\n\n // the remaining checks require an element\n if (!utils.is.element(element)) { return false; }\n\n return utils.is.element(value)\n // the value is an element to use as a resize handle\n ? value === element\n // otherwise check if element matches value as selector\n : utils.matchesUpTo(element, value, interactableElement);\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.resizeAxes = 'xy';\n});\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action }) {\n if (action !== 'resize' || !interaction.resizeAxes) { return; }\n\n const options = interaction.target.options;\n\n if (options.resize.square) {\n if (interaction.resizeAxes === 'y') {\n iEvent.dx = iEvent.dy;\n }\n else {\n iEvent.dy = iEvent.dx;\n }\n iEvent.axes = 'xy';\n }\n else {\n iEvent.axes = interaction.resizeAxes;\n\n if (interaction.resizeAxes === 'x') {\n iEvent.dy = 0;\n }\n else if (interaction.resizeAxes === 'y') {\n iEvent.dx = 0;\n }\n }\n});\n\nactions.resize = resize;\nactions.names.push('resize');\nutils.merge(Interactable.eventTypes, [\n 'resizestart',\n 'resizemove',\n 'resizeinertiastart',\n 'resizeinertiaresume',\n 'resizeend',\n]);\nactions.methodDict.resize = 'resizable';\n\ndefaultOptions.resize = resize.defaults;\n\nmodule.exports = resize;\n","const raf = require('./utils/raf');\nconst getWindow = require('./utils/window').getWindow;\nconst is = require('./utils/is');\nconst domUtils = require('./utils/domUtils');\nconst Interaction = require('./Interaction');\nconst defaultOptions = require('./defaultOptions');\n\nconst autoScroll = {\n defaults: {\n enabled : false,\n container: null, // the item that is scrolled (Window or HTMLElement)\n margin : 60,\n speed : 300, // the scroll speed in pixels per second\n },\n\n interaction: null,\n i: null, // the handle returned by window.setInterval\n x: 0, y: 0, // Direction each pulse is to scroll in\n\n isScrolling: false,\n prevTime: 0,\n\n start: function (interaction) {\n autoScroll.isScrolling = true;\n raf.cancel(autoScroll.i);\n\n autoScroll.interaction = interaction;\n autoScroll.prevTime = new Date().getTime();\n autoScroll.i = raf.request(autoScroll.scroll);\n },\n\n stop: function () {\n autoScroll.isScrolling = false;\n raf.cancel(autoScroll.i);\n },\n\n // scroll the window by the values in scroll.x/y\n scroll: function () {\n const options = autoScroll.interaction.target.options[autoScroll.interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(autoScroll.interaction.element);\n const now = new Date().getTime();\n // change in time in seconds\n const dt = (now - autoScroll.prevTime) / 1000;\n // displacement\n const s = options.speed * dt;\n\n if (s >= 1) {\n if (is.window(container)) {\n container.scrollBy(autoScroll.x * s, autoScroll.y * s);\n }\n else if (container) {\n container.scrollLeft += autoScroll.x * s;\n container.scrollTop += autoScroll.y * s;\n }\n\n autoScroll.prevTime = now;\n }\n\n if (autoScroll.isScrolling) {\n raf.cancel(autoScroll.i);\n autoScroll.i = raf.request(autoScroll.scroll);\n }\n },\n check: function (interactable, actionName) {\n const options = interactable.options;\n\n return options[actionName].autoScroll && options[actionName].autoScroll.enabled;\n },\n onInteractionMove: function ({ interaction, pointer }) {\n if (!(interaction.interacting()\n && autoScroll.check(interaction.target, interaction.prepared.name))) {\n return;\n }\n\n if (interaction.simulation) {\n autoScroll.x = autoScroll.y = 0;\n return;\n }\n\n let top;\n let right;\n let bottom;\n let left;\n\n const options = interaction.target.options[interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(interaction.element);\n\n if (is.window(container)) {\n left = pointer.clientX < autoScroll.margin;\n top = pointer.clientY < autoScroll.margin;\n right = pointer.clientX > container.innerWidth - autoScroll.margin;\n bottom = pointer.clientY > container.innerHeight - autoScroll.margin;\n }\n else {\n const rect = domUtils.getElementClientRect(container);\n\n left = pointer.clientX < rect.left + autoScroll.margin;\n top = pointer.clientY < rect.top + autoScroll.margin;\n right = pointer.clientX > rect.right - autoScroll.margin;\n bottom = pointer.clientY > rect.bottom - autoScroll.margin;\n }\n\n autoScroll.x = (right ? 1: left? -1: 0);\n autoScroll.y = (bottom? 1: top? -1: 0);\n\n if (!autoScroll.isScrolling) {\n // set the autoScroll properties to those of the target\n autoScroll.margin = options.margin;\n autoScroll.speed = options.speed;\n\n autoScroll.start(interaction);\n }\n },\n};\n\nInteraction.signals.on('stop-active', function () {\n autoScroll.stop();\n});\n\nInteraction.signals.on('action-move', autoScroll.onInteractionMove);\n\ndefaultOptions.perAction.autoScroll = autoScroll.defaults;\n\nmodule.exports = autoScroll;\n","const Interactable = require('../Interactable');\nconst actions = require('../actions/base');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.ignoreFrom\n [ method ]\n *\n * If the target of the `mousedown`, `pointerdown` or `touchstart`\n * event or any of it's parents match the given CSS selector or\n * Element, no drag/resize/gesture is started.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to not ignore any elements\n = (string | Element | object) The current ignoreFrom value or this Interactable\n **\n | interact(element, { ignoreFrom: document.getElementById('no-action') });\n | // or\n | interact(element).ignoreFrom('input, textarea, a');\n\\*/\nInteractable.prototype.ignoreFrom = function (newValue) {\n return this._backCompatOption('ignoreFrom', newValue);\n};\n\n/*\\\n * Interactable.allowFrom\n [ method ]\n *\n * A drag/resize/gesture is started only If the target of the\n * `mousedown`, `pointerdown` or `touchstart` event or any of it's\n * parents match the given CSS selector or Element.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to allow from any element\n = (string | Element | object) The current allowFrom value or this Interactable\n **\n | interact(element, { allowFrom: document.getElementById('drag-handle') });\n | // or\n | interact(element).allowFrom('.handle');\n\\*/\nInteractable.prototype.allowFrom = function (newValue) {\n return this._backCompatOption('allowFrom', newValue);\n};\n\nInteractable.prototype.testIgnore = function (ignoreFrom, interactableElement, element) {\n if (!ignoreFrom || !is.element(element)) { return false; }\n\n if (is.string(ignoreFrom)) {\n return domUtils.matchesUpTo(element, ignoreFrom, interactableElement);\n }\n else if (is.element(ignoreFrom)) {\n return domUtils.nodeContains(ignoreFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testAllow = function (allowFrom, interactableElement, element) {\n if (!allowFrom) { return true; }\n\n if (!is.element(element)) { return false; }\n\n if (is.string(allowFrom)) {\n return domUtils.matchesUpTo(element, allowFrom, interactableElement);\n }\n else if (is.element(allowFrom)) {\n return domUtils.nodeContains(allowFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testIgnoreAllow = function (options, interactableElement, eventTarget) {\n return (!this.testIgnore(options.ignoreFrom, interactableElement, eventTarget)\n && this.testAllow(options.allowFrom, interactableElement, eventTarget));\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (event.buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\n","const interact = require('../interact');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst actions = require('../actions/base');\nconst defaultOptions = require('../defaultOptions');\nconst browser = require('../utils/browser');\nconst scope = require('../scope');\nconst utils = require('../utils');\nconst signals = require('../utils/Signals').new();\n\nrequire('./InteractableMethods');\n\nconst autoStart = {\n signals,\n withinInteractionLimit,\n // Allow this many interactions to happen simultaneously\n maxInteractions: Infinity,\n defaults: {\n perAction: {\n manualStart: false,\n max: Infinity,\n maxPerElement: 1,\n allowFrom: null,\n ignoreFrom: null,\n },\n },\n setActionDefaults: function (action) {\n utils.extend(action.defaults, autoStart.defaults.perAction);\n },\n};\n\n// set cursor style on mousedown\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget }) {\n if (interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\n// set cursor style on mousemove\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget }) {\n if (!interaction.mouse\n || interaction.pointerIsDown\n || interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\nInteraction.signals.on('move', function (arg) {\n const { interaction, event } = arg;\n\n if (!interaction.pointerIsDown\n || interaction.interacting()\n || !interaction.pointerWasMoved\n || !interaction.prepared.name) {\n return;\n }\n\n signals.fire('before-start', arg);\n\n const target = interaction.target;\n\n if (interaction.prepared.name && target) {\n // check manualStart and interaction limit\n if (target.options[interaction.prepared.name].manualStart\n || !withinInteractionLimit(target, interaction.element, interaction.prepared)) {\n interaction.stop(event);\n }\n else {\n interaction.start(interaction.prepared, target, interaction.element);\n }\n }\n});\n\n// Check if the current target supports the action.\n// If so, return the validated action. Otherwise, return null\nfunction validateAction (action, interactable, element, eventTarget) {\n if (utils.is.object(action)\n && interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget)\n && interactable.options[action.name].enabled\n && withinInteractionLimit(interactable, element, action)) {\n return action;\n }\n\n return null;\n}\n\nfunction validateSelector (interaction, pointer, event, matches, matchElements, eventTarget) {\n for (let i = 0, len = matches.length; i < len; i++) {\n const match = matches[i];\n const matchElement = matchElements[i];\n const action = validateAction(match.getAction(pointer, event, interaction, matchElement),\n match,\n matchElement,\n eventTarget);\n\n if (action) {\n return {\n action,\n target: match,\n element: matchElement,\n };\n }\n }\n\n return {};\n}\n\nfunction getActionInfo (interaction, pointer, event, eventTarget) {\n let matches = [];\n let matchElements = [];\n\n let element = eventTarget;\n let action = null;\n\n function pushMatches (interactable, selector, context) {\n const elements = (browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined);\n\n if (utils.matchesSelector(element, selector, elements)) {\n\n matches.push(interactable);\n matchElements.push(element);\n }\n }\n\n while (utils.is.element(element)) {\n matches = [];\n matchElements = [];\n\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && (action = validateAction(elementInteractable.getAction(pointer, event, interaction, element, eventTarget),\n elementInteractable,\n element,\n eventTarget))\n && !elementInteractable.options[action.name].manualStart) {\n return {\n element,\n action,\n target: elementInteractable,\n };\n }\n else {\n scope.interactables.forEachSelector(pushMatches, element);\n\n const actionInfo = validateSelector(interaction, pointer, event, matches, matchElements, eventTarget);\n\n if (actionInfo.action\n && !actionInfo.target.options[actionInfo.action.name].manualStart) {\n return actionInfo;\n }\n }\n\n element = utils.parentNode(element);\n }\n\n return {};\n}\n\nfunction prepare (interaction, { action, target, element }) {\n action = action || {};\n\n if (interaction.target && interaction.target.options.styleCursor) {\n interaction.target._doc.documentElement.style.cursor = '';\n }\n\n interaction.target = target;\n interaction.element = element;\n utils.copyAction(interaction.prepared, action);\n\n if (target && target.options.styleCursor) {\n const cursor = action? actions[action.name].getCursor(action) : '';\n interaction.target._doc.documentElement.style.cursor = cursor;\n }\n\n signals.fire('prepared', { interaction: interaction });\n}\n\nInteraction.signals.on('stop', function ({ interaction }) {\n const target = interaction.target;\n\n if (target && target.options.styleCursor) {\n target._doc.documentElement.style.cursor = '';\n }\n});\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (utils.is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (utils.is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n const buttons = event.buttons || ({\n 0: 1,\n 1: 4,\n 3: 8,\n 4: 16,\n })[event.button];\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\nfunction withinInteractionLimit (interactable, element, action) {\n const options = interactable.options;\n const maxActions = options[action.name].max;\n const maxPerElement = options[action.name].maxPerElement;\n let activeInteractions = 0;\n let targetCount = 0;\n let targetElementCount = 0;\n\n // no actions if any of these values == 0\n if (!(maxActions && maxPerElement && autoStart.maxInteractions)) { return; }\n\n for (let i = 0, len = scope.interactions.length; i < len; i++) {\n const interaction = scope.interactions[i];\n const otherAction = interaction.prepared.name;\n\n if (!interaction.interacting()) { continue; }\n\n activeInteractions++;\n\n if (activeInteractions >= autoStart.maxInteractions) {\n return false;\n }\n\n if (interaction.target !== interactable) { continue; }\n\n targetCount += (otherAction === action.name)|0;\n\n if (targetCount >= maxActions) {\n return false;\n }\n\n if (interaction.element === element) {\n targetElementCount++;\n\n if (otherAction !== action.name || targetElementCount >= maxPerElement) {\n return false;\n }\n }\n }\n\n return autoStart.maxInteractions > 0;\n}\n\n/*\\\n * interact.maxInteractions\n [ method ]\n **\n * Returns or sets the maximum number of concurrent interactions allowed.\n * By default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables\n * and elements, you need to enable it in the draggable, resizable and\n * gesturable `'max'` and `'maxPerElement'` options.\n **\n - newValue (number) #optional Any number. newValue <= 0 means no interactions.\n\\*/\ninteract.maxInteractions = function (newValue) {\n if (utils.is.number(newValue)) {\n autoStart.maxInteractions = newValue;\n\n return this;\n }\n\n return autoStart.maxInteractions;\n};\n\nInteractable.settingsMethods.push('styleCursor');\nInteractable.settingsMethods.push('actionChecker');\nInteractable.settingsMethods.push('ignoreFrom');\nInteractable.settingsMethods.push('allowFrom');\n\ndefaultOptions.base.actionChecker = null;\ndefaultOptions.base.styleCursor = true;\n\nutils.extend(defaultOptions.perAction, autoStart.defaults.perAction);\n\nmodule.exports = autoStart;\n","const autoStart = require('./base');\nconst Interaction = require('../Interaction');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.delayTimer = null;\n});\n\nautoStart.signals.on('prepared', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.delayTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.target, interaction.element);\n }, delay);\n }\n});\n\nInteraction.signals.on('move', function ({ interaction, duplicate }) {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.delayTimer);\n }\n});\n\n// prevent regular down->move autoStart\nautoStart.signals.on('before-start', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.prepared.name = null;\n }\n});\n","const autoStart = require('./base');\nconst scope = require('../scope');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\n\nconst { matchesSelector, parentNode } = require('../utils/domUtils');\n\nautoStart.setActionDefaults(require('../actions/drag'));\n\nautoStart.signals.on('before-start', function ({ interaction, eventTarget, dx, dy }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // check if a drag is in the correct axis\n const absX = Math.abs(dx);\n const absY = Math.abs(dy);\n const options = interaction.target.options.drag;\n const startAxis = options.startAxis;\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy');\n\n interaction.prepared.axis = options.lockAxis === 'start'\n ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n : options.lockAxis;\n\n // if the movement isn't in the startAxis of the interactable\n if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) {\n // cancel the prepared action\n interaction.prepared.name = null;\n\n // then try to get a drag from another ineractable\n\n if (!interaction.prepared.name) {\n\n let element = eventTarget;\n\n const getDraggable = function (interactable, selector, context) {\n const elements = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n if (interactable === interaction.target) { return; }\n\n if (!options.manualStart\n && !interactable.testIgnoreAllow(options, element, eventTarget)\n && matchesSelector(element, selector, elements)) {\n\n const action = interactable.getAction(interaction.downPointer,\n interaction.downEvent,\n interaction,\n element);\n\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, interactable)\n && autoStart.validateAction(action, interactable, element, eventTarget)) {\n\n return interactable;\n }\n }\n };\n\n let action = null;\n\n // check all interactables\n while (is.element(element)) {\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && elementInteractable !== interaction.target\n && !elementInteractable.options.drag.manualStart) {\n\n action = elementInteractable.getAction(interaction.downPointer, interaction.downEvent, interaction, element);\n }\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, elementInteractable)) {\n\n interaction.prepared.name = 'drag';\n interaction.target = elementInteractable;\n interaction.element = element;\n break;\n }\n\n const selectorInteractable = scope.interactables.forEachSelector(getDraggable, element);\n\n if (selectorInteractable) {\n interaction.prepared.name = 'drag';\n interaction.target = selectorInteractable;\n interaction.element = element;\n break;\n }\n\n element = parentNode(element);\n }\n }\n }\n});\n\nfunction checkStartAxis (startAxis, interactable) {\n if (!interactable) { return false; }\n\n const thisAxis = interactable.options.drag.startAxis;\n\n return (startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis);\n}\n","require('./base').setActionDefaults(require('../actions/gesture'));\n","require('./base').setActionDefaults(require('../actions/resize'));\n","module.exports = {\n base: {\n accept : null,\n preventDefault: 'auto',\n deltaSource : 'page',\n },\n\n perAction: {\n origin: { x: 0, y: 0 },\n\n // only allow left button by default\n // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n mouseButtons: 1,\n\n inertia: {\n enabled : false,\n resistance : 10, // the lambda in exponential decay\n minSpeed : 100, // target speed must be above this for inertia to start\n endSpeed : 10, // the speed at which inertia is slow enough to stop\n allowResume : true, // allow resuming an action in inertia phase\n smoothEndDuration: 300, // animate to snap/restrict endOnly if there's no inertia\n },\n },\n};\n","/* browser entry point */\n\n// Legacy browser support\nrequire('./legacyBrowsers');\n\n// inertia\nrequire('./inertia');\n\n// modifiers\nrequire('./modifiers/snap');\nrequire('./modifiers/restrict');\n\n// pointerEvents\nrequire('./pointerEvents/base');\nrequire('./pointerEvents/holdRepeat');\nrequire('./pointerEvents/interactableTargets');\n\n// delay\nrequire('./autoStart/delay');\n\n// actions\nrequire('./actions/gesture');\nrequire('./actions/resize');\nrequire('./actions/drag');\nrequire('./actions/drop');\n\n// load these modifiers after resize is loaded\nrequire('./modifiers/snapSize');\nrequire('./modifiers/restrictEdges');\nrequire('./modifiers/restrictSize');\n\n// autoStart actions\nrequire('./autoStart/gesture');\nrequire('./autoStart/resize');\nrequire('./autoStart/drag');\n\n// Interactable preventDefault setting\nrequire('./interactablePreventDefault.js');\n\n// autoScroll\nrequire('./autoScroll');\n\n// export interact\nmodule.exports = require('./interact');\n","const InteractEvent = require('./InteractEvent');\nconst Interaction = require('./Interaction');\nconst modifiers = require('./modifiers');\nconst utils = require('./utils');\nconst animationFrame = require('./utils/raf');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.inertiaStatus = {\n active : false,\n smoothEnd : false,\n allowResume: false,\n\n startEvent: null,\n upCoords : {},\n\n xe: 0, ye: 0,\n sx: 0, sy: 0,\n\n t0: 0,\n vx0: 0, vys: 0,\n duration: 0,\n\n lambda_v0: 0,\n one_ve_v0: 0,\n i : null,\n };\n\n interaction.boundInertiaFrame = () => inertiaFrame .apply(interaction);\n interaction.boundSmoothEndFrame = () => smoothEndFrame.apply(interaction);\n});\n\nInteraction.signals.on('down', function ({ interaction, event, pointer, eventTarget }) {\n const status = interaction.inertiaStatus;\n\n // Check if the down event hits the current inertia target\n if (status.active) {\n let element = eventTarget;\n\n // climb up the DOM tree from the event target\n while (utils.is.element(element)) {\n\n // if interaction element is the current inertia target element\n if (element === interaction.element) {\n // stop inertia\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n\n // update pointers to the down event's coordinates\n interaction.updatePointer(pointer);\n utils.setCoords(interaction.curCoords, interaction.pointers);\n\n // fire appropriate signals\n const signalArg = { interaction };\n Interaction.signals.fire('before-action-move', signalArg);\n Interaction.signals.fire('action-resume' , signalArg);\n\n // fire a reume event\n const resumeEvent = new InteractEvent(interaction,\n event,\n interaction.prepared.name,\n 'inertiaresume',\n interaction.element);\n\n interaction.target.fire(resumeEvent);\n interaction.prevEvent = resumeEvent;\n modifiers.resetStatuses(interaction.modifierStatuses);\n\n utils.copyCoords(interaction.prevCoords, interaction.curCoords);\n break;\n }\n\n element = utils.parentNode(element);\n }\n }\n});\n\nInteraction.signals.on('up', function ({ interaction, event }) {\n const status = interaction.inertiaStatus;\n\n if (!interaction.interacting() || status.active) { return; }\n\n const target = interaction.target;\n const options = target && target.options;\n const inertiaOptions = options && interaction.prepared.name && options[interaction.prepared.name].inertia;\n\n const now = new Date().getTime();\n const statuses = {};\n const page = utils.extend({}, interaction.curCoords.page);\n const pointerSpeed = interaction.pointerDelta.client.speed;\n\n let smoothEnd = false;\n let modifierResult;\n\n // check if inertia should be started\n const inertiaPossible = (inertiaOptions && inertiaOptions.enabled\n && interaction.prepared.name !== 'gesture'\n && event !== status.startEvent);\n\n const inertia = (inertiaPossible\n && (now - interaction.curCoords.timeStamp) < 50\n && pointerSpeed > inertiaOptions.minSpeed\n && pointerSpeed > inertiaOptions.endSpeed);\n\n const modifierArg = {\n interaction,\n pageCoords: page,\n statuses,\n preEnd: true,\n requireEndOnly: true,\n };\n\n // smoothEnd\n if (inertiaPossible && !inertia) {\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n if (modifierResult.shouldMove && modifierResult.locked) {\n smoothEnd = true;\n }\n }\n\n if (!(inertia || smoothEnd)) { return; }\n\n utils.copyCoords(status.upCoords, interaction.curCoords);\n\n interaction.pointers[0] = status.startEvent =\n new InteractEvent(interaction, event, interaction.prepared.name, 'inertiastart', interaction.element);\n\n status.t0 = now;\n\n status.active = true;\n status.allowResume = inertiaOptions.allowResume;\n interaction.simulation = status;\n\n target.fire(status.startEvent);\n\n if (inertia) {\n status.vx0 = interaction.pointerDelta.client.vx;\n status.vy0 = interaction.pointerDelta.client.vy;\n status.v0 = pointerSpeed;\n\n calcInertia(interaction, status);\n\n utils.extend(page, interaction.curCoords.page);\n\n page.x += status.xe;\n page.y += status.ye;\n\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n status.modifiedXe += modifierResult.dx;\n status.modifiedYe += modifierResult.dy;\n\n status.i = animationFrame.request(interaction.boundInertiaFrame);\n }\n else {\n status.smoothEnd = true;\n status.xe = modifierResult.dx;\n status.ye = modifierResult.dy;\n\n status.sx = status.sy = 0;\n\n status.i = animationFrame.request(interaction.boundSmoothEndFrame);\n }\n});\n\nInteraction.signals.on('stop-active', function ({ interaction }) {\n const status = interaction.inertiaStatus;\n\n if (status.active) {\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n }\n});\n\nfunction calcInertia (interaction, status) {\n const inertiaOptions = interaction.target.options[interaction.prepared.name].inertia;\n const lambda = inertiaOptions.resistance;\n const inertiaDur = -Math.log(inertiaOptions.endSpeed / status.v0) / lambda;\n\n status.x0 = interaction.prevEvent.pageX;\n status.y0 = interaction.prevEvent.pageY;\n status.t0 = status.startEvent.timeStamp / 1000;\n status.sx = status.sy = 0;\n\n status.modifiedXe = status.xe = (status.vx0 - inertiaDur) / lambda;\n status.modifiedYe = status.ye = (status.vy0 - inertiaDur) / lambda;\n status.te = inertiaDur;\n\n status.lambda_v0 = lambda / status.v0;\n status.one_ve_v0 = 1 - inertiaOptions.endSpeed / status.v0;\n}\n\nfunction inertiaFrame () {\n updateInertiaCoords(this);\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n\n const status = this.inertiaStatus;\n const options = this.target.options[this.prepared.name].inertia;\n const lambda = options.resistance;\n const t = new Date().getTime() / 1000 - status.t0;\n\n if (t < status.te) {\n\n const progress = 1 - (Math.exp(-lambda * t) - status.lambda_v0) / status.one_ve_v0;\n\n if (status.modifiedXe === status.xe && status.modifiedYe === status.ye) {\n status.sx = status.xe * progress;\n status.sy = status.ye * progress;\n }\n else {\n const quadPoint = utils.getQuadraticCurvePoint(0, 0,\n status.xe,\n status.ye,\n status.modifiedXe,\n status.modifiedYe,\n progress);\n\n status.sx = quadPoint.x;\n status.sy = quadPoint.y;\n }\n\n this.doMove();\n\n status.i = animationFrame.request(this.boundInertiaFrame);\n }\n else {\n status.sx = status.modifiedXe;\n status.sy = status.modifiedYe;\n\n this.doMove();\n this.end(status.startEvent);\n status.active = false;\n this.simulation = null;\n }\n\n utils.copyCoords(this.prevCoords, this.curCoords);\n}\n\nfunction smoothEndFrame () {\n updateInertiaCoords(this);\n\n const status = this.inertiaStatus;\n const t = new Date().getTime() - status.t0;\n const duration = this.target.options[this.prepared.name].inertia.smoothEndDuration;\n\n if (t < duration) {\n status.sx = utils.easeOutQuad(t, 0, status.xe, duration);\n status.sy = utils.easeOutQuad(t, 0, status.ye, duration);\n\n this.pointerMove(status.startEvent, status.startEvent);\n\n status.i = animationFrame.request(this.boundSmoothEndFrame);\n }\n else {\n status.sx = status.xe;\n status.sy = status.ye;\n\n this.pointerMove(status.startEvent, status.startEvent);\n this.end(status.startEvent);\n\n status.smoothEnd =\n status.active = false;\n this.simulation = null;\n }\n}\n\nfunction updateInertiaCoords (interaction) {\n const status = interaction.inertiaStatus;\n\n // return if inertia isn't running\n if (!status.active) { return; }\n\n const pageUp = status.upCoords.page;\n const clientUp = status.upCoords.client;\n\n utils.setCoords(interaction.curCoords, [ {\n pageX : pageUp.x + status.sx,\n pageY : pageUp.y + status.sy,\n clientX: clientUp.x + status.sx,\n clientY: clientUp.y + status.sy,\n } ]);\n}\n","const browser = require('./utils/browser');\nconst events = require('./utils/events');\nconst utils = require('./utils');\nconst scope = require('./scope');\nconst Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\n\nconst globalEvents = {};\n\n/*\\\n * interact\n [ method ]\n *\n * The methods of this variable can be used to set elements as\n * interactables and also to change various default settings.\n *\n * Calling it as a function and passing an element or a valid CSS selector\n * string returns an Interactable object which has various methods to\n * configure it.\n *\n - element (Element | string) The HTML or SVG Element to interact with or CSS selector\n = (object) An @Interactable\n *\n > Usage\n | interact('#draggable').draggable(true);\n |\n | var rectables = interact('rect');\n | rectables\n | .gesturable(true)\n | .on('gesturemove', function (event) {\n | // ...\n | });\n\\*/\nfunction interact (element, options) {\n let interactable = scope.interactables.get(element, options);\n\n if (!interactable) {\n interactable = new Interactable(element, options);\n interactable.events.global = globalEvents;\n }\n\n return interactable;\n}\n\n/*\\\n * interact.isSet\n [ method ]\n *\n * Check if an element has been set\n - element (Element) The Element being searched for\n = (boolean) Indicates if the element or CSS selector was previously passed to interact\n\\*/\ninteract.isSet = function (element, options) {\n return scope.interactables.indexOfElement(element, options && options.context) !== -1;\n};\n\n/*\\\n * interact.on\n [ method ]\n *\n * Adds a global listener for an InteractEvent or adds a DOM event to\n * `document`\n *\n - type (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) interact\n\\*/\ninteract.on = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.on(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.on(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n // if it is an InteractEvent type, add listener to globalEvents\n if (utils.contains(Interactable.eventTypes, type)) {\n // if this type of event was never bound\n if (!globalEvents[type]) {\n globalEvents[type] = [listener];\n }\n else {\n globalEvents[type].push(listener);\n }\n }\n // If non InteractEvent type, addEventListener to document\n else {\n events.add(scope.document, type, listener, { options });\n }\n\n return interact;\n};\n\n/*\\\n * interact.off\n [ method ]\n *\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n - type (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) interact\n \\*/\ninteract.off = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.off(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.off(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n if (!utils.contains(Interactable.eventTypes, type)) {\n events.remove(scope.document, type, listener, options);\n }\n else {\n let index;\n\n if (type in globalEvents\n && (index = utils.indexOf(globalEvents[type], listener)) !== -1) {\n globalEvents[type].splice(index, 1);\n }\n }\n\n return interact;\n};\n\n/*\\\n * interact.debug\n [ method ]\n *\n * Returns an object which exposes internal data\n = (object) An object with properties that outline the current state and expose internal functions and variables\n\\*/\ninteract.debug = function () {\n return scope;\n};\n\n// expose the functions used to calculate multi-touch properties\ninteract.getPointerAverage = utils.pointerAverage;\ninteract.getTouchBBox = utils.touchBBox;\ninteract.getTouchDistance = utils.touchDistance;\ninteract.getTouchAngle = utils.touchAngle;\n\ninteract.getElementRect = utils.getElementRect;\ninteract.getElementClientRect = utils.getElementClientRect;\ninteract.matchesSelector = utils.matchesSelector;\ninteract.closest = utils.closest;\n\n/*\\\n * interact.supportsTouch\n [ method ]\n *\n = (boolean) Whether or not the browser supports touch input\n\\*/\ninteract.supportsTouch = function () {\n return browser.supportsTouch;\n};\n\n/*\\\n * interact.supportsPointerEvent\n [ method ]\n *\n = (boolean) Whether or not the browser supports PointerEvents\n\\*/\ninteract.supportsPointerEvent = function () {\n return browser.supportsPointerEvent;\n};\n\n/*\\\n * interact.stop\n [ method ]\n *\n * Cancels all interactions (end events are not fired)\n *\n - event (Event) An event on which to call preventDefault()\n = (object) interact\n\\*/\ninteract.stop = function (event) {\n for (let i = scope.interactions.length - 1; i >= 0; i--) {\n scope.interactions[i].stop(event);\n }\n\n return interact;\n};\n\n/*\\\n * interact.pointerMoveTolerance\n [ method ]\n * Returns or sets the distance the pointer must be moved before an action\n * sequence occurs. This also affects tolerance for tap events.\n *\n - newValue (number) #optional The movement from the start position must be greater than this value\n = (number | Interactable) The current setting or interact\n\\*/\ninteract.pointerMoveTolerance = function (newValue) {\n if (utils.is.number(newValue)) {\n Interaction.pointerMoveTolerance = newValue;\n\n return this;\n }\n\n return Interaction.pointerMoveTolerance;\n};\n\ninteract.addDocument = scope.addDocument;\ninteract.removeDocument = scope.removeDocument;\n\nscope.interact = interact;\n\nmodule.exports = interact;\n","const Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\nconst scope = require('./scope');\nconst is = require('./utils/is');\nconst events = require('./utils/events');\n\nconst { nodeContains, matchesSelector } = require('./utils/domUtils');\n\n/*\\\n * Interactable.preventDefault\n [ method ]\n *\n * Returns or sets whether to prevent the browser's default behaviour\n * in response to pointer events. Can be set to:\n * - `'always'` to always prevent\n * - `'never'` to never prevent\n * - `'auto'` to let interact.js try to determine what would be best\n *\n - newValue (string) #optional `true`, `false` or `'auto'`\n = (string | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.preventDefault = function (newValue) {\n if (/^(always|never|auto)$/.test(newValue)) {\n this.options.preventDefault = newValue;\n return this;\n }\n\n if (is.bool(newValue)) {\n this.options.preventDefault = newValue? 'always' : 'never';\n return this;\n }\n\n return this.options.preventDefault;\n};\n\nInteractable.prototype.checkAndPreventDefault = function (event) {\n const setting = this.options.preventDefault;\n\n if (setting === 'never') { return; }\n\n if (setting === 'always') {\n event.preventDefault();\n return;\n }\n\n // setting === 'auto'\n\n // don't preventDefault if the browser supports passiveEvents\n // CSS touch-action and user-selecct should be used instead\n if (events.supportsOptions) {\n return;\n }\n\n // don't preventDefault of pointerdown events\n if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) {\n return;\n }\n\n // don't preventDefault on editable elements\n if (is.element(event.target)\n && matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) {\n return;\n }\n\n event.preventDefault();\n};\n\nfunction onInteractionEvent ({ interaction, event }) {\n if (interaction.target) {\n interaction.target.checkAndPreventDefault(event);\n }\n}\n\nfor (const eventSignal of ['down', 'move', 'up', 'cancel']) {\n Interaction.signals.on(eventSignal, onInteractionEvent);\n}\n\n// prevent native HTML5 drag on interact.js target elements\nInteraction.docEvents.dragstart = function preventNativeDrag (event) {\n for (const interaction of scope.interactions) {\n\n if (interaction.element\n && (interaction.element === event.target\n || nodeContains(interaction.element, event.target))) {\n\n interaction.target.checkAndPreventDefault(event);\n return;\n }\n }\n};\n","const scope = require('./scope');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst iFinder = require('./utils/interactionFinder');\nconst pointerEvents = require('./pointerEvents/base');\n\nconst { window } = require('./utils/window');\n\nconst toString = Object.prototype.toString;\n\nif (!window.Array.isArray) {\n window.Array.isArray = function (obj) {\n return toString.call(obj) === '[object Array]';\n };\n}\n\nif (!String.prototype.trim) {\n String.prototype.trim = function () {\n return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n };\n}\n\n// http://www.quirksmode.org/dom/events/click.html\n// >Events leading to dblclick\n//\n// IE8 doesn't fire down event before dblclick.\n// This workaround tries to fire a tap and doubletap after dblclick\nfunction onIE8Dblclick (event) {\n const eventTarget = event.target;\n const interaction = iFinder.search(event, event.type, eventTarget);\n\n if (!interaction) { return; }\n\n if (interaction.prevTap\n && event.clientX === interaction.prevTap.clientX\n && event.clientY === interaction.prevTap.clientY\n && eventTarget === interaction.prevTap.target) {\n\n interaction.downTargets[0] = eventTarget;\n interaction.downTimes [0] = new Date().getTime();\n\n pointerEvents.fire({\n interaction,\n event,\n eventTarget,\n pointer: event,\n type: 'tap',\n });\n }\n}\n\nif (browser.isIE8) {\n const selectFix = function (event) {\n for (const interaction of scope.interactions) {\n if (interaction.interacting()) {\n interaction.target.checkAndPreventDefault(event);\n }\n }\n };\n\n const onDocIE8 = function onDocIE8 ({ doc, win }, signalName) {\n const eventMethod = signalName.indexOf('listen') === 0\n ? events.add : events.remove;\n\n // For IE's lack of Event#preventDefault\n eventMethod(doc, 'selectstart', selectFix);\n\n if (pointerEvents) {\n eventMethod(doc, 'dblclick', onIE8Dblclick);\n }\n };\n\n scope.signals.on('add-document' , onDocIE8);\n scope.signals.on('remove-document', onDocIE8);\n}\n\nmodule.exports = null;\n","const InteractEvent = require('../InteractEvent');\nconst Interaction = require('../Interaction');\nconst extend = require('../utils/extend');\n\nconst modifiers = {\n names: [],\n\n setOffsets: function (arg) {\n const { interaction, pageCoords: page } = arg;\n const { target, element, startOffset } = interaction;\n const rect = target.getRect(element);\n\n if (rect) {\n startOffset.left = page.x - rect.left;\n startOffset.top = page.y - rect.top;\n\n startOffset.right = rect.right - page.x;\n startOffset.bottom = rect.bottom - page.y;\n\n if (!('width' in rect)) { rect.width = rect.right - rect.left; }\n if (!('height' in rect)) { rect.height = rect.bottom - rect.top ; }\n }\n else {\n startOffset.left = startOffset.top = startOffset.right = startOffset.bottom = 0;\n }\n\n arg.rect = rect;\n arg.interactable = target;\n arg.element = element;\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n\n arg.options = target.options[interaction.prepared.name][modifierName];\n\n if (!arg.options) {\n continue;\n }\n\n interaction.modifierOffsets[modifierName] = modifiers[modifierName].setOffset(arg);\n }\n },\n\n setAll: function (arg) {\n const { interaction, statuses, preEnd, requireEndOnly } = arg;\n const coords = extend({}, arg.pageCoords);\n const result = {\n dx: 0,\n dy: 0,\n changed: false,\n locked: false,\n shouldMove: true,\n };\n\n for (const modifierName of modifiers.names) {\n const modifier = modifiers[modifierName];\n const options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!shouldDo(options, preEnd, requireEndOnly)) { continue; }\n\n arg.status = arg.status = statuses[modifierName];\n arg.options = options;\n arg.offset = arg.interaction.modifierOffsets[modifierName];\n\n modifier.set(arg);\n\n if (arg.status.locked) {\n coords.x += arg.status.dx;\n coords.y += arg.status.dy;\n\n result.dx += arg.status.dx;\n result.dy += arg.status.dy;\n\n result.locked = true;\n }\n }\n\n // a move should be fired if:\n // - there are no modifiers enabled,\n // - no modifiers are \"locked\" i.e. have changed the pointer's coordinates, or\n // - the locked coords have changed since the last pointer move\n result.shouldMove = !arg.status || !result.locked || arg.status.changed;\n\n return result;\n },\n\n resetStatuses: function (statuses) {\n for (const modifierName of modifiers.names) {\n const status = statuses[modifierName] || {};\n\n status.dx = status.dy = 0;\n status.modifiedX = status.modifiedY = NaN;\n status.locked = false;\n status.changed = true;\n\n statuses[modifierName] = status;\n }\n\n return statuses;\n },\n\n start: function ({ interaction }, signalName) {\n const arg = {\n interaction,\n pageCoords: (signalName === 'action-resume' ?\n interaction.curCoords : interaction.startCoords).page,\n startOffset: interaction.startOffset,\n statuses: interaction.modifierStatuses,\n preEnd: false,\n requireEndOnly: false,\n };\n\n modifiers.setOffsets(arg);\n modifiers.resetStatuses(arg.statuses);\n\n arg.pageCoords = extend({}, interaction.startCoords.page);\n interaction.modifierResult = modifiers.setAll(arg);\n },\n};\n\nInteraction.signals.on('new', function (interaction) {\n interaction.startOffset = { left: 0, right: 0, top: 0, bottom: 0 };\n interaction.modifierOffsets = {};\n interaction.modifierStatuses = modifiers.resetStatuses({});\n interaction.modifierResult = null;\n});\n\nInteraction.signals.on('action-start' , modifiers.start);\nInteraction.signals.on('action-resume', modifiers.start);\n\nInteraction.signals.on('before-action-move', function ({ interaction, preEnd, interactingBeforeMove }) {\n const modifierResult = modifiers.setAll({\n interaction,\n preEnd,\n pageCoords: interaction.curCoords.page,\n statuses: interaction.modifierStatuses,\n requireEndOnly: false,\n });\n\n // don't fire an action move if a modifier would keep the event in the same\n // cordinates as before\n if (!modifierResult.shouldMove && interactingBeforeMove) {\n interaction._dontFireMove = true;\n }\n\n interaction.modifierResult = modifierResult;\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n for (let i = 0; i < modifiers.names.length; i++) {\n const options = interaction.target.options[interaction.prepared.name][modifiers.names[i]];\n\n // if the endOnly option is true for any modifier\n if (shouldDo(options, true, true)) {\n // fire a move event at the modified coordinates\n interaction.doMove({ event, preEnd: true });\n break;\n }\n }\n});\n\nInteractEvent.signals.on('set-xy', function (arg) {\n const { iEvent, interaction } = arg;\n const modifierArg = extend({}, arg);\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n modifierArg.options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!modifierArg.options) {\n continue;\n }\n\n const modifier = modifiers[modifierName];\n\n modifierArg.status = interaction.modifierStatuses[modifierName];\n\n iEvent[modifierName] = modifier.modifyCoords(modifierArg);\n }\n});\n\nfunction shouldDo (options, preEnd, requireEndOnly) {\n return (options && options.enabled\n && (preEnd || !options.endOnly)\n && (!requireEndOnly || options.endOnly));\n}\n\nmodule.exports = modifiers;\n","const modifiers = require('./index');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst restrict = {\n defaults: {\n enabled : false,\n endOnly : false,\n restriction: null,\n elementRect: null,\n },\n\n setOffset: function ({ rect, startOffset, options }) {\n const elementRect = options && options.elementRect;\n const offset = {};\n\n if (rect && elementRect) {\n offset.left = startOffset.left - (rect.width * elementRect.left);\n offset.top = startOffset.top - (rect.height * elementRect.top);\n\n offset.right = startOffset.right - (rect.width * (1 - elementRect.right));\n offset.bottom = startOffset.bottom - (rect.height * (1 - elementRect.bottom));\n }\n else {\n offset.left = offset.top = offset.right = offset.bottom = 0;\n }\n\n return offset;\n },\n\n set: function ({ pageCoords, interaction, status, options }) {\n if (!options) { return status; }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n\n const restriction = getRestrictionRect(options.restriction, interaction, page);\n\n if (!restriction) { return status; }\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n const rect = restriction;\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n const offset = interaction.modifierOffsets.restrict;\n\n // object is assumed to have\n // x, y, width, height or\n // left, top, right, bottom\n if ('x' in restriction && 'y' in restriction) {\n modifiedX = Math.max(Math.min(rect.x + rect.width - offset.right , page.x), rect.x + offset.left);\n modifiedY = Math.max(Math.min(rect.y + rect.height - offset.bottom, page.y), rect.y + offset.top );\n }\n else {\n modifiedX = Math.max(Math.min(rect.right - offset.right , page.x), rect.left + offset.left);\n modifiedY = Math.max(Math.min(rect.bottom - offset.bottom, page.y), rect.top + offset.top );\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const elementRect = options && options.elementRect;\n\n if (options && options.enabled\n && !(phase === 'start' && elementRect && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n getRestrictionRect,\n};\n\nfunction getRestrictionRect (value, interaction, page) {\n if (utils.is.function(value)) {\n return utils.resolveRectLike(value, interaction.target, interaction.element, [page.x, page.y, interaction]);\n } else {\n return utils.resolveRectLike(value, interaction.target, interaction.element);\n }\n}\n\nmodifiers.restrict = restrict;\nmodifiers.names.push('restrict');\n\ndefaultOptions.perAction.restrict = restrict.defaults;\n\nmodule.exports = restrict;\n","// This module adds the options.resize.restrictEdges setting which sets min and\n// max for the top, left, bottom and right edges of the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictEdges: {\n// inner: { top: 200, left: 200, right: 400, bottom: 400 },\n// outer: { top: 0, left: 0, right: 600, bottom: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst { getRestrictionRect } = require('./restrict');\n\nconst noInner = { top: +Infinity, left: +Infinity, bottom: -Infinity, right: -Infinity };\nconst noOuter = { top: -Infinity, left: -Infinity, bottom: +Infinity, right: +Infinity };\n\nconst restrictEdges = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n offset: null,\n },\n\n setOffset: function ({ interaction, startOffset, options }) {\n if (!options) {\n return utils.extend({}, startOffset);\n }\n\n const offset = getRestrictionRect(options.offset, interaction, interaction.startCoords.page);\n\n if (offset) {\n return {\n top: startOffset.top + offset.y,\n left: startOffset.left + offset.x,\n bottom: startOffset.bottom + offset.y,\n right: startOffset.right + offset.x,\n };\n }\n\n return startOffset;\n },\n\n set: function ({ pageCoords, interaction, status, offset, options }) {\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n const inner = rectUtils.xywhToTlbr(getRestrictionRect(options.inner, interaction, page)) || noInner;\n const outer = rectUtils.xywhToTlbr(getRestrictionRect(options.outer, interaction, page)) || noOuter;\n\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n if (edges.top) {\n modifiedY = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top);\n }\n else if (edges.bottom) {\n modifiedY = Math.max(Math.min(outer.bottom - offset.bottom, page.y), inner.bottom - offset.bottom);\n }\n if (edges.left) {\n modifiedX = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left);\n }\n else if (edges.right) {\n modifiedX = Math.max(Math.min(outer.right - offset.right, page.x), inner.right - offset.right);\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n if (options && options.enabled\n && !(phase === 'start' && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n noInner,\n noOuter,\n getRestrictionRect,\n};\n\nmodifiers.restrictEdges = restrictEdges;\nmodifiers.names.push('restrictEdges');\n\ndefaultOptions.perAction.restrictEdges = restrictEdges.defaults;\nresize.defaults.restrictEdges = restrictEdges.defaults;\n\nmodule.exports = restrictEdges;\n","// This module adds the options.resize.restrictSize setting which sets min and\n// max width and height for the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictSize: {\n// min: { width: -600, height: -600 },\n// max: { width: 600, height: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst restrictEdges = require('./restrictEdges');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst noMin = { width: -Infinity, height: -Infinity };\nconst noMax = { width: +Infinity, height: +Infinity };\n\nconst restrictSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n },\n\n setOffset: function ({ interaction }) {\n return interaction.startOffset;\n },\n\n set: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const rect = rectUtils.xywhToTlbr(interaction.resizeRects.inverted);\n\n const minSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.min, interaction)) || noMin;\n const maxSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.max, interaction)) || noMax;\n\n arg.options = {\n enabled: options.enabled,\n endOnly: options.endOnly,\n inner: utils.extend({}, restrictEdges.noInner),\n outer: utils.extend({}, restrictEdges.noOuter),\n };\n\n if (edges.top) {\n arg.options.inner.top = rect.bottom - minSize.height;\n arg.options.outer.top = rect.bottom - maxSize.height;\n }\n else if (edges.bottom) {\n arg.options.inner.bottom = rect.top + minSize.height;\n arg.options.outer.bottom = rect.top + maxSize.height;\n }\n if (edges.left) {\n arg.options.inner.left = rect.right - minSize.width;\n arg.options.outer.left = rect.right - maxSize.width;\n }\n else if (edges.right) {\n arg.options.inner.right = rect.left + minSize.width;\n arg.options.outer.right = rect.left + maxSize.width;\n }\n\n restrictEdges.set(arg);\n },\n\n modifyCoords: restrictEdges.modifyCoords,\n};\n\nmodifiers.restrictSize = restrictSize;\nmodifiers.names.push('restrictSize');\n\ndefaultOptions.perAction.restrictSize = restrictSize.defaults;\nresize.defaults.restrictSize = restrictSize.defaults;\n\nmodule.exports = restrictSize;\n","const modifiers = require('./index');\nconst interact = require('../interact');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst snap = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n\n relativePoints: null,\n },\n\n setOffset: function ({ interaction, interactable, element, rect, startOffset, options }) {\n const offsets = [];\n const optionsOrigin = utils.rectToXY(utils.resolveRectLike(options.origin));\n const origin = optionsOrigin || utils.getOriginXY(interactable, element, interaction.prepared.name);\n options = options || interactable.options[interaction.prepared.name].snap || {};\n\n let snapOffset;\n\n if (options.offset === 'startCoords') {\n snapOffset = {\n x: interaction.startCoords.page.x - origin.x,\n y: interaction.startCoords.page.y - origin.y,\n };\n }\n else {\n const offsetRect = utils.resolveRectLike(options.offset, interactable, element, [interaction]);\n\n snapOffset = utils.rectToXY(offsetRect) || { x: 0, y: 0 };\n }\n\n if (rect && options.relativePoints && options.relativePoints.length) {\n for (const { x: relativeX, y: relativeY } of options.relativePoints) {\n offsets.push({\n x: startOffset.left - (rect.width * relativeX) + snapOffset.x,\n y: startOffset.top - (rect.height * relativeY) + snapOffset.y,\n });\n }\n }\n else {\n offsets.push(snapOffset);\n }\n\n return offsets;\n },\n\n set: function ({ interaction, pageCoords, status, options, offset: offsets }) {\n const targets = [];\n let target;\n let page;\n let i;\n\n if (status.useStatusXY) {\n page = { x: status.x, y: status.y };\n }\n else {\n const origin = utils.getOriginXY(interaction.target, interaction.element, interaction.prepared.name);\n\n page = utils.extend({}, pageCoords);\n\n page.x -= origin.x;\n page.y -= origin.y;\n }\n\n status.realX = page.x;\n status.realY = page.y;\n\n let len = options.targets? options.targets.length : 0;\n\n for (const { x: offsetX, y: offsetY } of offsets) {\n const relativeX = page.x - offsetX;\n const relativeY = page.y - offsetY;\n\n for (const snapTarget of options.targets) {\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n targets.push({\n x: utils.is.number(target.x) ? (target.x + offsetX) : relativeX,\n y: utils.is.number(target.y) ? (target.y + offsetY) : relativeY,\n\n range: utils.is.number(target.range)? target.range: options.range,\n });\n }\n }\n\n const closest = {\n target: null,\n inRange: false,\n distance: 0,\n range: 0,\n dx: 0,\n dy: 0,\n };\n\n for (i = 0, len = targets.length; i < len; i++) {\n target = targets[i];\n\n const range = target.range;\n const dx = target.x - page.x;\n const dy = target.y - page.y;\n const distance = utils.hypot(dx, dy);\n let inRange = distance <= range;\n\n // Infinite targets count as being out of range\n // compared to non infinite ones that are in range\n if (range === Infinity && closest.inRange && closest.range !== Infinity) {\n inRange = false;\n }\n\n if (!closest.target || (inRange\n // is the closest target in range?\n ? (closest.inRange && range !== Infinity\n // the pointer is relatively deeper in this target\n ? distance / range < closest.distance / closest.range\n // this target has Infinite range and the closest doesn't\n : (range === Infinity && closest.range !== Infinity)\n // OR this target is closer that the previous closest\n || distance < closest.distance)\n // The other is not in range and the pointer is closer to this target\n : (!closest.inRange && distance < closest.distance))) {\n\n closest.target = target;\n closest.distance = distance;\n closest.range = range;\n closest.inRange = inRange;\n closest.dx = dx;\n closest.dy = dy;\n\n status.range = range;\n }\n }\n\n let snapChanged;\n\n if (closest.target) {\n snapChanged = (status.modifiedX !== closest.target.x || status.modifiedY !== closest.target.y);\n\n status.modifiedX = closest.target.x;\n status.modifiedY = closest.target.y;\n }\n else {\n snapChanged = true;\n\n status.modifiedX = NaN;\n status.modifiedY = NaN;\n }\n\n status.dx = closest.dx;\n status.dy = closest.dy;\n\n status.changed = (snapChanged || (closest.inRange && !status.locked));\n status.locked = closest.inRange;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const relativePoints = options && options.relativePoints;\n\n if (options && options.enabled\n && !(phase === 'start' && relativePoints && relativePoints.length)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n }\n\n return {\n range : status.range,\n locked : status.locked,\n x : status.modifiedX,\n y : status.modifiedY,\n realX : status.realX,\n realY : status.realY,\n dx : status.dx,\n dy : status.dy,\n };\n }\n },\n};\n\ninteract.createSnapGrid = function (grid) {\n return function (x, y) {\n const limits = grid.limits || {\n left : -Infinity,\n right : Infinity,\n top : -Infinity,\n bottom: Infinity,\n };\n let offsetX = 0;\n let offsetY = 0;\n\n if (utils.is.object(grid.offset)) {\n offsetX = grid.offset.x;\n offsetY = grid.offset.y;\n }\n\n const gridx = Math.round((x - offsetX) / grid.x);\n const gridy = Math.round((y - offsetY) / grid.y);\n\n const newX = Math.max(limits.left, Math.min(limits.right , gridx * grid.x + offsetX));\n const newY = Math.max(limits.top , Math.min(limits.bottom, gridy * grid.y + offsetY));\n\n return {\n x: newX,\n y: newY,\n range: grid.range,\n };\n };\n};\n\nmodifiers.snap = snap;\nmodifiers.names.push('snap');\n\ndefaultOptions.perAction.snap = snap.defaults;\n\nmodule.exports = snap;\n","// This module allows snapping of the size of targets during resize\n// interactions.\n\nconst modifiers = require('./index');\nconst snap = require('./snap');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\nconst utils = require('../utils/');\n\nconst snapSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n },\n\n setOffset: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.edges;\n\n if (!edges) { return; }\n\n arg.options = {\n relativePoints: [{\n x: edges.left? 0 : 1,\n y: edges.top ? 0 : 1,\n }],\n origin: { x: 0, y: 0 },\n offset: 'self',\n range: options.range,\n };\n\n const offsets = snap.setOffset(arg);\n arg.options = options;\n\n return offsets;\n },\n\n set: function (arg) {\n const { interaction, options, offset, pageCoords } = arg;\n const page = utils.extend({}, pageCoords);\n const relativeX = page.x - offset[0].x;\n const relativeY = page.y - offset[0].y;\n\n arg.options = utils.extend({}, options);\n arg.options.targets = [];\n\n for (const snapTarget of options.targets) {\n let target;\n\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n if ('width' in target && 'height' in target) {\n target.x = target.width;\n target.y = target.height;\n }\n\n arg.options.targets.push(target);\n }\n\n snap.set(arg);\n },\n\n modifyCoords: function (arg) {\n const { options } = arg;\n\n arg.options = utils.extend({}, options);\n arg.options.enabled = options.enabled;\n arg.options.relativePoints = [null];\n\n snap.modifyCoords(arg);\n },\n};\n\nmodifiers.snapSize = snapSize;\nmodifiers.names.push('snapSize');\n\ndefaultOptions.perAction.snapSize = snapSize.defaults;\nresize.defaults.snapSize = snapSize.defaults;\n\nmodule.exports = snapSize;\n","const pointerUtils = require('../utils/pointerUtils');\n\nmodule.exports = class PointerEvent {\n constructor (type, pointer, event, eventTarget, interaction) {\n pointerUtils.pointerExtend(this, event);\n\n if (event !== pointer) {\n pointerUtils.pointerExtend(this, pointer);\n }\n\n this.interaction = interaction;\n\n this.timeStamp = new Date().getTime();\n this.originalEvent = event;\n this.type = type;\n this.pointerId = pointerUtils.getPointerId(pointer);\n this.pointerType = pointerUtils.getPointerType(pointer);\n this.target = eventTarget;\n this.currentTarget = null;\n\n if (type === 'tap') {\n const pointerIndex = interaction.getPointerIndex(pointer);\n this.dt = this.timeStamp - interaction.downTimes[pointerIndex];\n\n const interval = this.timeStamp - interaction.tapTime;\n\n this.double = !!(interaction.prevTap\n && interaction.prevTap.type !== 'doubletap'\n && interaction.prevTap.target === this.target\n && interval < 500);\n }\n else if (type === 'doubletap') {\n this.dt = pointer.timeStamp - interaction.tapTime;\n }\n }\n\n subtractOrigin ({ x: originX, y: originY }) {\n this.pageX -= originX;\n this.pageY -= originY;\n this.clientX -= originX;\n this.clientY -= originY;\n\n return this;\n }\n\n addOrigin ({ x: originX, y: originY }) {\n this.pageX += originX;\n this.pageY += originY;\n this.clientX += originX;\n this.clientY += originY;\n\n return this;\n }\n\n preventDefault () {\n this.originalEvent.preventDefault();\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n};\n","const PointerEvent = require('./PointerEvent');\nconst Interaction = require('../Interaction');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst defaults = require('../defaultOptions');\nconst signals = require('../utils/Signals').new();\nconst { filter } = require('../utils/arr');\n\nconst simpleSignals = [ 'down', 'up', 'cancel' ];\nconst simpleEvents = [ 'down', 'up', 'cancel' ];\n\nconst pointerEvents = {\n PointerEvent,\n fire,\n collectEventTargets,\n signals,\n defaults: {\n holdDuration: 600,\n ignoreFrom : null,\n allowFrom : null,\n origin : { x: 0, y: 0 },\n },\n types: [\n 'down',\n 'move',\n 'up',\n 'cancel',\n 'tap',\n 'doubletap',\n 'hold',\n ],\n};\n\nfunction fire (arg) {\n const {\n interaction, pointer, event, eventTarget,\n type = arg.pointerEvent.type,\n targets = collectEventTargets(arg),\n pointerEvent = new PointerEvent(type, pointer, event, eventTarget, interaction),\n } = arg;\n\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n targets,\n type,\n pointerEvent,\n };\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n\n for (const prop in target.props || {}) {\n pointerEvent[prop] = target.props[prop];\n }\n\n const origin = utils.getOriginXY(target.eventable, target.element);\n\n pointerEvent.subtractOrigin(origin);\n pointerEvent.eventable = target.eventable;\n pointerEvent.currentTarget = target.element;\n\n target.eventable.fire(pointerEvent);\n\n pointerEvent.addOrigin(origin);\n\n if (pointerEvent.immediatePropagationStopped\n || (pointerEvent.propagationStopped\n && (i + 1) < targets.length && targets[i + 1].element !== pointerEvent.currentTarget)) {\n break;\n }\n }\n\n signals.fire('fired', signalArg);\n\n if (type === 'tap') {\n // if pointerEvent should make a double tap, create and fire a doubletap\n // PointerEvent and use that as the prevTap\n const prevTap = pointerEvent.double\n ? fire({\n interaction, pointer, event, eventTarget,\n type: 'doubletap',\n })\n : pointerEvent;\n\n interaction.prevTap = prevTap;\n interaction.tapTime = prevTap.timeStamp;\n }\n\n return pointerEvent;\n}\n\nfunction collectEventTargets ({ interaction, pointer, event, eventTarget, type }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n // do not fire a tap event if the pointer was moved before being lifted\n if (type === 'tap' && (interaction.pointerWasMoved\n // or if the pointerup target is different to the pointerdown target\n || !(interaction.downTargets[pointerIndex] && interaction.downTargets[pointerIndex] === eventTarget))) {\n return [];\n }\n\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n path,\n targets: [],\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (type === 'hold') {\n signalArg.targets = filter(signalArg.targets, target =>\n target.eventable.options.holdDuration === interaction.holdTimers[pointerIndex].duration);\n }\n\n return signalArg.targets;\n}\n\nInteraction.signals.on('update-pointer-down', function ({ interaction, pointerIndex }) {\n interaction.holdTimers[pointerIndex] = { duration: Infinity, timeout: null };\n});\n\nInteraction.signals.on('remove-pointer', function ({ interaction, pointerIndex }) {\n interaction.holdTimers.splice(pointerIndex, 1);\n});\n\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget, duplicateMove }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n if (!duplicateMove && (!interaction.pointerIsDown || interaction.pointerWasMoved)) {\n if (interaction.pointerIsDown) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n\n fire({\n interaction, pointer, event, eventTarget,\n type: 'move',\n });\n }\n});\n\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget, pointerIndex }) {\n // copy event to be used in timeout for IE8\n const eventCopy = browser.isIE8? utils.extend({}, event) : event;\n\n const timer = interaction.holdTimers[pointerIndex];\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'hold',\n targets: [],\n path,\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (!signalArg.targets.length) { return; }\n\n let minDuration = Infinity;\n\n for (let i = 0; i < signalArg.targets.length; i++) {\n const target = signalArg.targets[i];\n const holdDuration = target.eventable.options.holdDuration;\n\n if (holdDuration < minDuration) {\n minDuration = holdDuration;\n }\n }\n\n timer.duration = minDuration;\n timer.timeout = setTimeout(function () {\n fire({\n interaction,\n eventTarget,\n pointer: browser.isIE8? eventCopy : pointer,\n event: eventCopy,\n type: 'hold',\n });\n }, minDuration);\n});\n\nInteraction.signals.on('up', ({ interaction, pointer, event, eventTarget }) => {\n if (!interaction.pointerWasMoved) {\n fire({ interaction, eventTarget, pointer, event, type: 'tap' });\n }\n});\n\n['up', 'cancel'].forEach(function (signalName) {\n Interaction.signals.on(signalName, function ({ interaction, pointerIndex }) {\n if (interaction.holdTimers[pointerIndex]) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n });\n});\n\nfunction createSignalListener (type) {\n return function ({ interaction, pointer, event, eventTarget }) {\n fire({ interaction, eventTarget, pointer, event, type });\n };\n}\n\nfor (let i = 0; i < simpleSignals.length; i++) {\n Interaction.signals.on(simpleSignals[i], createSignalListener(simpleEvents[i]));\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.prevTap = null; // the most recent tap event on this interaction\n interaction.tapTime = 0; // time of the most recent tap event\n interaction.holdTimers = []; // [{ duration, timeout }]\n});\n\ndefaults.pointerEvents = pointerEvents.defaults;\nmodule.exports = pointerEvents;\n","const pointerEvents = require('./base');\nconst Interaction = require('../Interaction');\n\npointerEvents.signals.on('new', onNew);\npointerEvents.signals.on('fired', onFired);\n\nfor (const signal of ['move', 'up', 'cancel', 'endall']) {\n Interaction.signals.on(signal, endHoldRepeat);\n}\n\nfunction onNew ({ pointerEvent }) {\n if (pointerEvent.type !== 'hold') { return; }\n\n pointerEvent.count = (pointerEvent.count || 0) + 1;\n}\n\nfunction onFired ({ interaction, pointerEvent, eventTarget, targets }) {\n if (pointerEvent.type !== 'hold' || !targets.length) { return; }\n\n // get the repeat interval from the first eventable\n const interval = targets[0].eventable.options.holdRepeatInterval;\n\n // don't repeat if the interval is 0 or less\n if (interval <= 0) { return; }\n\n // set a timeout to fire the holdrepeat event\n interaction.holdIntervalHandle = setTimeout(function () {\n pointerEvents.fire({\n interaction,\n eventTarget,\n type: 'hold',\n pointer: pointerEvent,\n event: pointerEvent,\n });\n }, interval);\n}\n\nfunction endHoldRepeat ({ interaction }) {\n // set the interaction's holdStopTime property\n // to stop further holdRepeat events\n if (interaction.holdIntervalHandle) {\n clearInterval(interaction.holdIntervalHandle);\n interaction.holdIntervalHandle = null;\n }\n}\n\n// don't repeat by default\npointerEvents.defaults.holdRepeatInterval = 0;\npointerEvents.types.push('holdrepeat');\n\nmodule.exports = {\n onNew,\n onFired,\n endHoldRepeat,\n};\n","const pointerEvents = require('./base');\nconst Interactable = require('../Interactable');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\nconst scope = require('../scope');\nconst extend = require('../utils/extend');\nconst { merge } = require('../utils/arr');\n\npointerEvents.signals.on('collect-targets', function ({ targets, element, type, eventTarget }) {\n function collectSelectors (interactable, selector, context) {\n const els = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && is.element(element)\n && domUtils.matchesSelector(element, selector, els)\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n const interactable = scope.interactables.get(element);\n\n if (interactable) {\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n scope.interactables.forEachSelector(collectSelectors, element);\n});\n\nInteractable.signals.on('new', function ({ interactable }) {\n interactable.events.getRect = function (element) {\n return interactable.getRect(element);\n };\n});\n\nInteractable.signals.on('set', function ({ interactable, options }) {\n extend(interactable.events.options, pointerEvents.defaults);\n extend(interactable.events.options, options);\n});\n\nmerge(Interactable.eventTypes, pointerEvents.types);\n\nInteractable.prototype.pointerEvents = function (options) {\n extend(this.events.options, options);\n\n return this;\n};\n\nconst __backCompatOption = Interactable.prototype._backCompatOption;\n\nInteractable.prototype._backCompatOption = function (optionName, newValue) {\n const ret = __backCompatOption.call(this, optionName, newValue);\n\n if (ret === this) {\n this.events.options[optionName] = newValue;\n }\n\n return ret;\n};\n\nInteractable.settingsMethods.push('pointerEvents');\n","const utils = require('./utils');\nconst events = require('./utils/events');\nconst signals = require('./utils/Signals').new();\n\nconst scope = {\n signals,\n events,\n utils,\n\n // main document\n document: require('./utils/domObjects').document,\n // all documents being listened to\n documents: [],\n\n addDocument: function (doc, win) {\n // do nothing if document is already known\n if (utils.contains(scope.documents, doc)) { return false; }\n\n win = win || scope.getWindow(doc);\n\n scope.documents.push(doc);\n events.documents.push(doc);\n\n // don't add an unload event for the main document\n // so that the page may be cached in browser history\n if (doc !== scope.document) {\n events.add(win, 'unload', scope.onWindowUnload);\n }\n\n signals.fire('add-document', { doc, win });\n },\n\n removeDocument: function (doc, win) {\n const index = utils.indexOf(scope.documents, doc);\n\n win = win || scope.getWindow(doc);\n\n events.remove(win, 'unload', scope.onWindowUnload);\n\n scope.documents.splice(index, 1);\n events.documents.splice(index, 1);\n\n signals.fire('remove-document', { win, doc });\n },\n\n onWindowUnload: function () {\n scope.removeDocument(this.document, this);\n },\n};\n\nmodule.exports = scope;\n","const { indexOf } = require('./arr');\n\nclass Signals {\n constructor () {\n this.listeners = {\n // signalName: [listeners],\n };\n }\n\n on (name, listener) {\n if (!this.listeners[name]) {\n this.listeners[name] = [listener];\n return;\n }\n\n this.listeners[name].push(listener);\n }\n\n off (name, listener) {\n if (!this.listeners[name]) { return; }\n\n const index = indexOf(this.listeners[name], listener);\n\n if (index !== -1) {\n this.listeners[name].splice(index, 1);\n }\n }\n\n fire (name, arg) {\n const targetListeners = this.listeners[name];\n\n if (!targetListeners) { return; }\n\n for (let i = 0; i < targetListeners.length; i++) {\n if (targetListeners[i](arg, name) === false) {\n return;\n }\n }\n }\n}\n\nSignals.new = function () {\n return new Signals();\n};\n\nmodule.exports = Signals;\n","function indexOf (array, target) {\n for (let i = 0, len = array.length; i < len; i++) {\n if (array[i] === target) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction contains (array, target) {\n return indexOf(array, target) !== -1;\n}\n\nfunction merge (target, source) {\n for (let i = 0; i < source.length; i++) {\n target.push(source[i]);\n }\n\n return target;\n}\n\nfunction filter (array, test) {\n const result = [];\n\n for (let i = 0; i < array.length; i++) {\n if (test(array[i])) {\n result.push(array[i]);\n }\n }\n\n return result;\n}\n\nmodule.exports = {\n indexOf,\n contains,\n merge,\n filter,\n};\n","const { window } = require('./window');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst Element = domObjects.Element;\nconst navigator = window.navigator;\n\nconst browser = {\n // Does the browser support touch input?\n supportsTouch: !!(('ontouchstart' in window) || is.function(window.DocumentTouch)\n && domObjects.document instanceof window.DocumentTouch),\n\n // Does the browser support PointerEvents\n supportsPointerEvent: !!domObjects.PointerEvent,\n\n isIE8: ('attachEvent' in window) && !('addEventListener' in window),\n\n // Opera Mobile must be handled differently\n isOperaMobile: (navigator.appName === 'Opera'\n && browser.supportsTouch\n && navigator.userAgent.match('Presto')),\n\n // scrolling doesn't change the result of getClientRects on iOS 7\n isIOS7: (/iP(hone|od|ad)/.test(navigator.platform)\n && /OS 7[^\\d]/.test(navigator.appVersion)),\n\n isIe9OrOlder: /MSIE (8|9)/.test(navigator.userAgent),\n\n // prefix matchesSelector\n prefixedMatchesSelector: 'matches' in Element.prototype\n ? 'matches': 'webkitMatchesSelector' in Element.prototype\n ? 'webkitMatchesSelector': 'mozMatchesSelector' in Element.prototype\n ? 'mozMatchesSelector': 'oMatchesSelector' in Element.prototype\n ? 'oMatchesSelector': 'msMatchesSelector',\n\n useMatchesSelectorPolyfill: false,\n\n pEventTypes: (domObjects.PointerEvent\n ? (domObjects.PointerEvent === window.MSPointerEvent\n ? {\n up: 'MSPointerUp',\n down: 'MSPointerDown',\n over: 'mouseover',\n out: 'mouseout',\n move: 'MSPointerMove',\n cancel: 'MSPointerCancel',\n }\n : {\n up: 'pointerup',\n down: 'pointerdown',\n over: 'pointerover',\n out: 'pointerout',\n move: 'pointermove',\n cancel: 'pointercancel',\n })\n : null),\n\n // because Webkit and Opera still use 'mousewheel' event type\n wheelEvent: 'onmousewheel' in domObjects.document? 'mousewheel': 'wheel',\n\n};\n\nbrowser.useMatchesSelectorPolyfill = !is.function(Element.prototype[browser.prefixedMatchesSelector]);\n\nmodule.exports = browser;\n","const domObjects = {};\nconst win = require('./window').window;\n\nfunction blank () {}\n\ndomObjects.document = win.document;\ndomObjects.DocumentFragment = win.DocumentFragment || blank;\ndomObjects.SVGElement = win.SVGElement || blank;\ndomObjects.SVGSVGElement = win.SVGSVGElement || blank;\ndomObjects.SVGElementInstance = win.SVGElementInstance || blank;\ndomObjects.Element = win.Element || blank;\ndomObjects.HTMLElement = win.HTMLElement || domObjects.Element;\n\ndomObjects.Event = win.Event;\ndomObjects.Touch = win.Touch || blank;\ndomObjects.PointerEvent = (win.PointerEvent || win.MSPointerEvent);\n\nmodule.exports = domObjects;\n","const win = require('./window');\nconst browser = require('./browser');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst domUtils = {\n nodeContains: function (parent, child) {\n while (child) {\n if (child === parent) {\n return true;\n }\n\n child = child.parentNode;\n }\n\n return false;\n },\n\n closest: function (element, selector) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) { return element; }\n\n element = domUtils.parentNode(element);\n }\n\n return null;\n },\n\n parentNode: function (node) {\n let parent = node.parentNode;\n\n if (is.docFrag(parent)) {\n // skip past #shado-root fragments\n while ((parent = parent.host) && is.docFrag(parent)) {\n continue;\n }\n\n return parent;\n }\n\n return parent;\n },\n\n // taken from http://tanalin.com/en/blog/2012/12/matches-selector-ie8/ and modified\n matchesSelectorPolyfill: browser.useMatchesSelectorPolyfill\n ? function (element, selector, elems) {\n elems = elems || element.parentNode.querySelectorAll(selector);\n\n for (let i = 0, len = elems.length; i < len; i++) {\n if (elems[i] === element) {\n return true;\n }\n }\n\n return false;\n }\n : null,\n\n matchesSelector: function (element, selector, nodeList) {\n if (browser.useMatchesSelectorPolyfill) {\n return domUtils.matchesSelectorPolyfill(element, selector, nodeList);\n }\n\n // remove /deep/ from selectors if shadowDOM polyfill is used\n if (win.window !== win.realWindow) {\n selector = selector.replace(/\\/deep\\//g, ' ');\n }\n\n return element[browser.prefixedMatchesSelector](selector);\n },\n\n // Test for the element that's \"above\" all other qualifiers\n indexOfDeepestElement: function (elements) {\n let deepestZoneParents = [];\n let dropzoneParents = [];\n let dropzone;\n let deepestZone = elements[0];\n let index = deepestZone? 0: -1;\n let parent;\n let child;\n let i;\n let n;\n\n for (i = 1; i < elements.length; i++) {\n dropzone = elements[i];\n\n // an element might belong to multiple selector dropzones\n if (!dropzone || dropzone === deepestZone) {\n continue;\n }\n\n if (!deepestZone) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n // check if the deepest or current are document.documentElement or document.rootElement\n // - if the current dropzone is, do nothing and continue\n if (dropzone.parentNode === dropzone.ownerDocument) {\n continue;\n }\n // - if deepest is, update with the current dropzone and continue to next\n else if (deepestZone.parentNode === dropzone.ownerDocument) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n if (!deepestZoneParents.length) {\n parent = deepestZone;\n while (parent.parentNode && parent.parentNode !== parent.ownerDocument) {\n deepestZoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n }\n\n // if this element is an svg element and the current deepest is\n // an HTMLElement\n if (deepestZone instanceof domObjects.HTMLElement\n && dropzone instanceof domObjects.SVGElement\n && !(dropzone instanceof domObjects.SVGSVGElement)) {\n\n if (dropzone === deepestZone.parentNode) {\n continue;\n }\n\n parent = dropzone.ownerSVGElement;\n }\n else {\n parent = dropzone;\n }\n\n dropzoneParents = [];\n\n while (parent.parentNode !== parent.ownerDocument) {\n dropzoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n\n n = 0;\n\n // get (position of last common ancestor) + 1\n while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) {\n n++;\n }\n\n const parents = [\n dropzoneParents[n - 1],\n dropzoneParents[n],\n deepestZoneParents[n],\n ];\n\n child = parents[0].lastChild;\n\n while (child) {\n if (child === parents[1]) {\n deepestZone = dropzone;\n index = i;\n deepestZoneParents = [];\n\n break;\n }\n else if (child === parents[2]) {\n break;\n }\n\n child = child.previousSibling;\n }\n }\n\n return index;\n },\n\n matchesUpTo: function (element, selector, limit) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) {\n return true;\n }\n\n element = domUtils.parentNode(element);\n\n if (element === limit) {\n return domUtils.matchesSelector(element, selector);\n }\n }\n\n return false;\n },\n\n getActualElement: function (element) {\n return (element instanceof domObjects.SVGElementInstance\n ? element.correspondingUseElement\n : element);\n },\n\n getScrollXY: function (relevantWindow) {\n relevantWindow = relevantWindow || win.window;\n return {\n x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft,\n y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop,\n };\n },\n\n getElementClientRect: function (element) {\n const clientRect = (element instanceof domObjects.SVGElement\n ? element.getBoundingClientRect()\n : element.getClientRects()[0]);\n\n return clientRect && {\n left : clientRect.left,\n right : clientRect.right,\n top : clientRect.top,\n bottom: clientRect.bottom,\n width : clientRect.width || clientRect.right - clientRect.left,\n height: clientRect.height || clientRect.bottom - clientRect.top,\n };\n },\n\n getElementRect: function (element) {\n const clientRect = domUtils.getElementClientRect(element);\n\n if (!browser.isIOS7 && clientRect) {\n const scroll = domUtils.getScrollXY(win.getWindow(element));\n\n clientRect.left += scroll.x;\n clientRect.right += scroll.x;\n clientRect.top += scroll.y;\n clientRect.bottom += scroll.y;\n }\n\n return clientRect;\n },\n\n getPath: function (element) {\n const path = [];\n\n while (element) {\n path.push(element);\n element = domUtils.parentNode(element);\n }\n\n return path;\n },\n\n trySelector: value => {\n if (!is.string(value)) { return false; }\n\n // an exception will be raised if it is invalid\n domObjects.document.querySelector(value);\n return true;\n },\n};\n\nmodule.exports = domUtils;\n","const is = require('./is');\nconst domUtils = require('./domUtils');\nconst pExtend = require('./pointerExtend');\n\nconst { window, getWindow } = require('./window');\nconst { indexOf, contains } = require('./arr');\n\nconst useAttachEvent = ('attachEvent' in window) && !('addEventListener' in window);\nconst addEvent = useAttachEvent? 'attachEvent': 'addEventListener';\nconst removeEvent = useAttachEvent? 'detachEvent': 'removeEventListener';\nconst on = useAttachEvent? 'on': '';\n\nconst elements = [];\nconst targets = [];\nconst attachedListeners = [];\n\n// {\n// type: {\n// selectors: ['selector', ...],\n// contexts : [document, ...],\n// listeners: [[listener, capture, passive], ...]\n// }\n// }\nconst delegatedEvents = {};\n\nconst documents = [];\n\nconst supportsOptions = !useAttachEvent && (() => {\n let supported = false;\n\n window.document.createElement('div').addEventListener('test', null, {\n get capture () { supported = true; },\n });\n\n return supported;\n})();\n\nfunction add (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n let elementIndex = indexOf(elements, element);\n let target = targets[elementIndex];\n\n if (!target) {\n target = {\n events: {},\n typeCount: 0,\n };\n\n elementIndex = elements.push(element) - 1;\n targets.push(target);\n\n attachedListeners.push(useAttachEvent\n ? {\n supplied: [],\n wrapped : [],\n useCount: [],\n }\n : null);\n }\n\n if (!target.events[type]) {\n target.events[type] = [];\n target.typeCount++;\n }\n\n if (!contains(target.events[type], listener)) {\n let ret;\n\n if (useAttachEvent) {\n const { supplied, wrapped, useCount } = attachedListeners[elementIndex];\n const listenerIndex = indexOf(supplied, listener);\n\n const wrappedListener = wrapped[listenerIndex] || function (event) {\n if (!event.immediatePropagationStopped) {\n event.target = event.srcElement;\n event.currentTarget = element;\n\n event.preventDefault = event.preventDefault || preventDef;\n event.stopPropagation = event.stopPropagation || stopProp;\n event.stopImmediatePropagation = event.stopImmediatePropagation || stopImmProp;\n\n if (/mouse|click/.test(event.type)) {\n event.pageX = event.clientX + getWindow(element).document.documentElement.scrollLeft;\n event.pageY = event.clientY + getWindow(element).document.documentElement.scrollTop;\n }\n\n listener(event);\n }\n };\n\n ret = element[addEvent](on + type, wrappedListener, !!options.capture);\n\n if (listenerIndex === -1) {\n supplied.push(listener);\n wrapped.push(wrappedListener);\n useCount.push(1);\n }\n else {\n useCount[listenerIndex]++;\n }\n }\n else {\n ret = element[addEvent](type, listener, supportsOptions? options : !!options.capture);\n }\n target.events[type].push(listener);\n\n return ret;\n }\n}\n\nfunction remove (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const elementIndex = indexOf(elements, element);\n const target = targets[elementIndex];\n\n if (!target || !target.events) {\n return;\n }\n\n let wrappedListener = listener;\n let listeners;\n let listenerIndex;\n\n if (useAttachEvent) {\n listeners = attachedListeners[elementIndex];\n listenerIndex = indexOf(listeners.supplied, listener);\n wrappedListener = listeners.wrapped[listenerIndex];\n }\n\n if (type === 'all') {\n for (type in target.events) {\n if (target.events.hasOwnProperty(type)) {\n remove(element, type, 'all');\n }\n }\n return;\n }\n\n if (target.events[type]) {\n const len = target.events[type].length;\n\n if (listener === 'all') {\n for (let i = 0; i < len; i++) {\n remove(element, type, target.events[type][i], options);\n }\n return;\n }\n else {\n for (let i = 0; i < len; i++) {\n if (target.events[type][i] === listener) {\n element[removeEvent](on + type, wrappedListener, supportsOptions? options : !!options.capture);\n target.events[type].splice(i, 1);\n\n if (useAttachEvent && listeners) {\n listeners.useCount[listenerIndex]--;\n if (listeners.useCount[listenerIndex] === 0) {\n listeners.supplied.splice(listenerIndex, 1);\n listeners.wrapped.splice(listenerIndex, 1);\n listeners.useCount.splice(listenerIndex, 1);\n }\n }\n\n break;\n }\n }\n }\n\n if (target.events[type] && target.events[type].length === 0) {\n target.events[type] = null;\n target.typeCount--;\n }\n }\n\n if (!target.typeCount) {\n targets.splice(elementIndex, 1);\n elements.splice(elementIndex, 1);\n attachedListeners.splice(elementIndex, 1);\n }\n}\n\nfunction addDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n if (!delegatedEvents[type]) {\n delegatedEvents[type] = {\n selectors: [],\n contexts : [],\n listeners: [],\n };\n\n // add delegate listener functions\n for (let i = 0; i < documents.length; i++) {\n add(documents[i], type, delegateListener);\n add(documents[i], type, delegateUseCapture, true);\n }\n }\n\n const delegated = delegatedEvents[type];\n let index;\n\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n break;\n }\n }\n\n if (index === -1) {\n index = delegated.selectors.length;\n\n delegated.selectors.push(selector);\n delegated.contexts .push(context);\n delegated.listeners.push([]);\n }\n\n // keep listener and capture and passive flags\n delegated.listeners[index].push([listener, !!options.capture, options.passive]);\n}\n\nfunction removeDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const delegated = delegatedEvents[type];\n let matchFound = false;\n let index;\n\n if (!delegated) { return; }\n\n // count from last index of delegated to 0\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n // look for matching selector and context Node\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n\n const listeners = delegated.listeners[index];\n\n // each item of the listeners array is an array: [function, capture, passive]\n for (let i = listeners.length - 1; i >= 0; i--) {\n const [fn, capture, passive] = listeners[i];\n\n // check if the listener functions and capture and passive flags match\n if (fn === listener && capture === !!options.capture && passive === options.passive) {\n // remove the listener from the array of listeners\n listeners.splice(i, 1);\n\n // if all listeners for this interactable have been removed\n // remove the interactable from the delegated arrays\n if (!listeners.length) {\n delegated.selectors.splice(index, 1);\n delegated.contexts .splice(index, 1);\n delegated.listeners.splice(index, 1);\n\n // remove delegate function from context\n remove(context, type, delegateListener);\n remove(context, type, delegateUseCapture, true);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegatedEvents[type] = null;\n }\n }\n\n // only remove one listener\n matchFound = true;\n break;\n }\n }\n\n if (matchFound) { break; }\n }\n }\n}\n\n// bound to the interactable context when a DOM event\n// listener is added to a selector interactable\nfunction delegateListener (event, optionalArg) {\n const options = getOptions(optionalArg);\n const fakeEvent = {};\n const delegated = delegatedEvents[event.type];\n const eventTarget = (domUtils.getActualElement(event.path\n ? event.path[0]\n : event.target));\n let element = eventTarget;\n\n // duplicate the event so that currentTarget can be changed\n pExtend(fakeEvent, event);\n\n fakeEvent.originalEvent = event;\n fakeEvent.preventDefault = preventOriginalDefault;\n\n // climb up document tree looking for selector matches\n while (is.element(element)) {\n for (let i = 0; i < delegated.selectors.length; i++) {\n const selector = delegated.selectors[i];\n const context = delegated.contexts[i];\n\n if (domUtils.matchesSelector(element, selector)\n && domUtils.nodeContains(context, eventTarget)\n && domUtils.nodeContains(context, element)) {\n\n const listeners = delegated.listeners[i];\n\n fakeEvent.currentTarget = element;\n\n for (let j = 0; j < listeners.length; j++) {\n const [fn, capture, passive] = listeners[j];\n\n if (capture === !!options.capture && passive === options.passive) {\n fn(fakeEvent);\n }\n }\n }\n }\n\n element = domUtils.parentNode(element);\n }\n}\n\nfunction delegateUseCapture (event) {\n return delegateListener.call(this, event, true);\n}\n\nfunction preventDef () {\n this.returnValue = false;\n}\n\nfunction preventOriginalDefault () {\n this.originalEvent.preventDefault();\n}\n\nfunction stopProp () {\n this.cancelBubble = true;\n}\n\nfunction stopImmProp () {\n this.cancelBubble = true;\n this.immediatePropagationStopped = true;\n}\n\nfunction getOptions (param) {\n return is.object(param)? param : { capture: param };\n}\n\nmodule.exports = {\n add,\n remove,\n\n addDelegate,\n removeDelegate,\n\n delegateListener,\n delegateUseCapture,\n delegatedEvents,\n documents,\n\n useAttachEvent,\n supportsOptions,\n\n _elements: elements,\n _targets: targets,\n _attachedListeners: attachedListeners,\n};\n","module.exports = function extend (dest, source) {\n for (const prop in source) {\n dest[prop] = source[prop];\n }\n return dest;\n};\n","const {\n resolveRectLike,\n rectToXY,\n} = require('./rect');\n\nmodule.exports = function (target, element, action) {\n const actionOptions = target.options[action];\n const actionOrigin = actionOptions && actionOptions.origin;\n const origin = actionOrigin || target.options.origin;\n\n const originRect = resolveRectLike(origin, target, element, [target && element]);\n\n return rectToXY(originRect) || { x: 0, y: 0 };\n};\n","module.exports = (x, y) => Math.sqrt(x * x + y * y);\n","const extend = require('./extend');\nconst win = require('./window');\n\nconst utils = {\n warnOnce: function (method, message) {\n let warned = false;\n\n return function () {\n if (!warned) {\n win.window.console.warn(message);\n warned = true;\n }\n\n return method.apply(this, arguments);\n };\n },\n\n // http://stackoverflow.com/a/5634528/2280888\n _getQBezierValue: function (t, p1, p2, p3) {\n const iT = 1 - t;\n return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3;\n },\n\n getQuadraticCurvePoint: function (startX, startY, cpX, cpY, endX, endY, position) {\n return {\n x: utils._getQBezierValue(position, startX, cpX, endX),\n y: utils._getQBezierValue(position, startY, cpY, endY),\n };\n },\n\n // http://gizma.com/easing/\n easeOutQuad: function (t, b, c, d) {\n t /= d;\n return -c * t*(t-2) + b;\n },\n\n copyAction: function (dest, src) {\n dest.name = src.name;\n dest.axis = src.axis;\n dest.edges = src.edges;\n\n return dest;\n },\n\n is : require('./is'),\n extend : extend,\n hypot : require('./hypot'),\n getOriginXY: require('./getOriginXY'),\n};\n\nextend(utils, require('./arr'));\nextend(utils, require('./domUtils'));\nextend(utils, require('./pointerUtils'));\nextend(utils, require('./rect'));\n\nmodule.exports = utils;\n","const scope = require('../scope');\nconst utils = require('./index');\n\nconst finder = {\n methodOrder: [ 'simulationResume', 'mouseOrPen', 'hasPointer', 'idle' ],\n\n search: function (pointer, eventType, eventTarget) {\n const pointerType = utils.getPointerType(pointer);\n const pointerId = utils.getPointerId(pointer);\n const details = { pointer, pointerId, pointerType, eventType, eventTarget };\n\n for (const method of finder.methodOrder) {\n const interaction = finder[method](details);\n\n if (interaction) {\n return interaction;\n }\n }\n },\n\n // try to resume simulation with a new pointer\n simulationResume: function ({ pointerType, eventType, eventTarget }) {\n if (!/down|start/i.test(eventType)) {\n return null;\n }\n\n for (const interaction of scope.interactions) {\n let element = eventTarget;\n\n if (interaction.simulation && interaction.simulation.allowResume\n && (interaction.pointerType === pointerType)) {\n while (element) {\n // if the element is the interaction element\n if (element === interaction.element) {\n return interaction;\n }\n element = utils.parentNode(element);\n }\n }\n }\n\n return null;\n },\n\n // if it's a mouse or pen interaction\n mouseOrPen: function ({ pointerId, pointerType, eventType }) {\n if (pointerType !== 'mouse' && pointerType !== 'pen') {\n return null;\n }\n\n let firstNonActive;\n\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType) {\n // if it's a down event, skip interactions with running simulations\n if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; }\n\n // if the interaction is active, return it immediately\n if (interaction.interacting()) {\n return interaction;\n }\n // otherwise save it and look for another active interaction\n else if (!firstNonActive) {\n firstNonActive = interaction;\n }\n }\n }\n\n // if no active mouse interaction was found use the first inactive mouse\n // interaction\n if (firstNonActive) {\n return firstNonActive;\n }\n\n // find any mouse or pen interaction.\n // ignore the interaction if the eventType is a *down, and a simulation\n // is active\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType && !(/down/i.test(eventType) && interaction.simulation)) {\n return interaction;\n }\n }\n\n return null;\n },\n\n // get interaction that has this pointer\n hasPointer: function ({ pointerId }) {\n for (const interaction of scope.interactions) {\n if (utils.contains(interaction.pointerIds, pointerId)) {\n return interaction;\n }\n }\n },\n\n // get first idle interaction with a matching pointerType\n idle: function ({ pointerType }) {\n for (const interaction of scope.interactions) {\n // if there's already a pointer held down\n if (interaction.pointerIds.length === 1) {\n const target = interaction.target;\n // don't add this pointer if there is a target interactable and it\n // isn't gesturable\n if (target && !target.options.gesture.enabled) {\n continue;\n }\n }\n // maximum of 2 pointers per interaction\n else if (interaction.pointerIds.length >= 2) {\n continue;\n }\n\n if (!interaction.interacting() && (pointerType === interaction.pointerType)) {\n return interaction;\n }\n }\n\n return null;\n },\n};\n\nmodule.exports = finder;\n","const win = require('./window');\nconst isWindow = require('./isWindow');\n\nconst is = {\n array : () => {},\n\n window : thing => thing === win.window || isWindow(thing),\n\n docFrag : thing => is.object(thing) && thing.nodeType === 11,\n\n object : thing => !!thing && (typeof thing === 'object'),\n\n function: thing => typeof thing === 'function',\n\n number : thing => typeof thing === 'number' ,\n\n bool : thing => typeof thing === 'boolean' ,\n\n string : thing => typeof thing === 'string' ,\n\n element: thing => {\n if (!thing || (typeof thing !== 'object')) { return false; }\n\n const _window = win.getWindow(thing) || win.window;\n\n return (/object|function/.test(typeof _window.Element)\n ? thing instanceof _window.Element //DOM2\n : thing.nodeType === 1 && typeof thing.nodeName === 'string');\n },\n};\n\nis.array = thing => (is.object(thing)\n && (typeof thing.length !== 'undefined')\n && is.function(thing.splice));\n\nmodule.exports = is;\n","module.exports = (thing) => !!(thing && thing.Window) && (thing instanceof thing.Window);\n","function pointerExtend (dest, source) {\n for (const prop in source) {\n const prefixedPropREs = module.exports.prefixedPropREs;\n let deprecated = false;\n\n // skip deprecated prefixed properties\n for (const vendor in prefixedPropREs) {\n if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) {\n deprecated = true;\n break;\n }\n }\n\n if (!deprecated && typeof source[prop] !== 'function') {\n dest[prop] = source[prop];\n }\n }\n return dest;\n}\n\npointerExtend.prefixedPropREs = {\n webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/,\n};\n\nmodule.exports = pointerExtend;\n","const hypot = require('./hypot');\nconst browser = require('./browser');\nconst dom = require('./domObjects');\nconst domUtils = require('./domUtils');\nconst domObjects = require('./domObjects');\nconst is = require('./is');\nconst pointerExtend = require('./pointerExtend');\n\nconst pointerUtils = {\n copyCoords: function (dest, src) {\n dest.page = dest.page || {};\n dest.page.x = src.page.x;\n dest.page.y = src.page.y;\n\n dest.client = dest.client || {};\n dest.client.x = src.client.x;\n dest.client.y = src.client.y;\n\n dest.timeStamp = src.timeStamp;\n },\n\n setCoordDeltas: function (targetObj, prev, cur) {\n targetObj.page.x = cur.page.x - prev.page.x;\n targetObj.page.y = cur.page.y - prev.page.y;\n targetObj.client.x = cur.client.x - prev.client.x;\n targetObj.client.y = cur.client.y - prev.client.y;\n targetObj.timeStamp = cur.timeStamp - prev.timeStamp;\n\n // set pointer velocity\n const dt = Math.max(targetObj.timeStamp / 1000, 0.001);\n\n targetObj.page.speed = hypot(targetObj.page.x, targetObj.page.y) / dt;\n targetObj.page.vx = targetObj.page.x / dt;\n targetObj.page.vy = targetObj.page.y / dt;\n\n targetObj.client.speed = hypot(targetObj.client.x, targetObj.page.y) / dt;\n targetObj.client.vx = targetObj.client.x / dt;\n targetObj.client.vy = targetObj.client.y / dt;\n },\n\n isNativePointer: function (pointer) {\n return (pointer instanceof dom.Event || pointer instanceof dom.Touch);\n },\n\n // Get specified X/Y coords for mouse or event.touches[0]\n getXY: function (type, pointer, xy) {\n xy = xy || {};\n type = type || 'page';\n\n xy.x = pointer[type + 'X'];\n xy.y = pointer[type + 'Y'];\n\n return xy;\n },\n\n getPageXY: function (pointer, page) {\n page = page || {};\n\n // Opera Mobile handles the viewport and scrolling oddly\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n pointerUtils.getXY('screen', pointer, page);\n\n page.x += window.scrollX;\n page.y += window.scrollY;\n }\n else {\n pointerUtils.getXY('page', pointer, page);\n }\n\n return page;\n },\n\n getClientXY: function (pointer, client) {\n client = client || {};\n\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n // Opera Mobile handles the viewport and scrolling oddly\n pointerUtils.getXY('screen', pointer, client);\n }\n else {\n pointerUtils.getXY('client', pointer, client);\n }\n\n return client;\n },\n\n getPointerId: function (pointer) {\n return is.number(pointer.pointerId)? pointer.pointerId : pointer.identifier;\n },\n\n setCoords: function (targetObj, pointers, timeStamp) {\n const pointer = (pointers.length > 1\n ? pointerUtils.pointerAverage(pointers)\n : pointers[0]);\n\n const tmpXY = {};\n\n pointerUtils.getPageXY(pointer, tmpXY);\n targetObj.page.x = tmpXY.x;\n targetObj.page.y = tmpXY.y;\n\n pointerUtils.getClientXY(pointer, tmpXY);\n targetObj.client.x = tmpXY.x;\n targetObj.client.y = tmpXY.y;\n\n targetObj.timeStamp = is.number(timeStamp) ? timeStamp :new Date().getTime();\n },\n\n pointerExtend: pointerExtend,\n\n getTouchPair: function (event) {\n const touches = [];\n\n // array of touches is supplied\n if (is.array(event)) {\n touches[0] = event[0];\n touches[1] = event[1];\n }\n // an event\n else {\n if (event.type === 'touchend') {\n if (event.touches.length === 1) {\n touches[0] = event.touches[0];\n touches[1] = event.changedTouches[0];\n }\n else if (event.touches.length === 0) {\n touches[0] = event.changedTouches[0];\n touches[1] = event.changedTouches[1];\n }\n }\n else {\n touches[0] = event.touches[0];\n touches[1] = event.touches[1];\n }\n }\n\n return touches;\n },\n\n pointerAverage: function (pointers) {\n const average = {\n pageX : 0,\n pageY : 0,\n clientX: 0,\n clientY: 0,\n screenX: 0,\n screenY: 0,\n };\n\n for (const pointer of pointers) {\n for (const prop in average) {\n average[prop] += pointer[prop];\n }\n }\n for (const prop in average) {\n average[prop] /= pointers.length;\n }\n\n return average;\n },\n\n touchBBox: function (event) {\n if (!event.length && !(event.touches && event.touches.length > 1)) {\n return;\n }\n\n const touches = pointerUtils.getTouchPair(event);\n const minX = Math.min(touches[0].pageX, touches[1].pageX);\n const minY = Math.min(touches[0].pageY, touches[1].pageY);\n const maxX = Math.max(touches[0].pageX, touches[1].pageX);\n const maxY = Math.max(touches[0].pageY, touches[1].pageY);\n\n return {\n x: minX,\n y: minY,\n left: minX,\n top: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n },\n\n touchDistance: function (event, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n\n\n const dx = touches[0][sourceX] - touches[1][sourceX];\n const dy = touches[0][sourceY] - touches[1][sourceY];\n\n return hypot(dx, dy);\n },\n\n touchAngle: function (event, prevAngle, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n const dx = touches[1][sourceX] - touches[0][sourceX];\n const dy = touches[1][sourceY] - touches[0][sourceY];\n const angle = 180 * Math.atan2(dy , dx) / Math.PI;\n\n return angle;\n },\n\n getPointerType: function (pointer) {\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : is.number(pointer.pointerType)\n ? [undefined, undefined,'touch', 'pen', 'mouse'][pointer.pointerType]\n // if the PointerEvent API isn't available, then the \"pointer\" must\n // be either a MouseEvent, TouchEvent, or Touch object\n : /touch/.test(pointer.type) || pointer instanceof domObjects.Touch\n ? 'touch'\n : 'mouse';\n },\n\n // [ event.target, event.currentTarget ]\n getEventTargets: function (event) {\n return [\n domUtils.getActualElement(event.path ? event.path[0] : event.target),\n domUtils.getActualElement(event.currentTarget),\n ];\n },\n};\n\nmodule.exports = pointerUtils;\n","const { window } = require('./window');\n\nconst vendors = ['ms', 'moz', 'webkit', 'o'];\nlet lastTime = 0;\nlet request;\nlet cancel;\n\nfor (let x = 0; x < vendors.length && !window.requestAnimationFrame; x++) {\n request = window[vendors[x] + 'RequestAnimationFrame'];\n cancel = window[vendors[x] +'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n}\n\nif (!request) {\n request = function (callback) {\n const currTime = new Date().getTime();\n const timeToCall = Math.max(0, 16 - (currTime - lastTime));\n const id = setTimeout(function () { callback(currTime + timeToCall); },\n timeToCall);\n\n lastTime = currTime + timeToCall;\n return id;\n };\n}\n\nif (!cancel) {\n cancel = function (id) {\n clearTimeout(id);\n };\n}\n\nmodule.exports = {\n request,\n cancel,\n};\n","const extend = require('./extend');\nconst is = require('./is');\nconst {\n closest,\n parentNode,\n getElementRect,\n} = require('./domUtils');\n\nconst rectUtils = {\n getStringOptionResult: function (value, interactable, element) {\n if (!is.string(value)) {\n return null;\n }\n\n if (value === 'parent') {\n value = parentNode(element);\n }\n else if (value === 'self') {\n value = interactable.getRect(element);\n }\n else {\n value = closest(element, value);\n }\n\n return value;\n },\n\n resolveRectLike: function (value, interactable, element, functionArgs) {\n value = rectUtils.getStringOptionResult(value, interactable, element) || value;\n\n if (is.function(value)) {\n value = value.apply(null, functionArgs);\n }\n\n if (is.element(value)) {\n value = getElementRect(value);\n }\n\n return value;\n },\n\n rectToXY: function (rect) {\n return rect && {\n x: 'x' in rect ? rect.x : rect.left,\n y: 'y' in rect ? rect.y : rect.top,\n };\n },\n\n xywhToTlbr: function (rect) {\n if (rect && !('left' in rect && 'top' in rect)) {\n rect = extend({}, rect);\n\n rect.left = rect.x || 0;\n rect.top = rect.y || 0;\n rect.right = rect.right || (rect.left + rect.width);\n rect.bottom = rect.bottom || (rect.top + rect.height);\n }\n\n return rect;\n },\n\n tlbrToXywh: function (rect) {\n if (rect && !('x' in rect && 'y' in rect)) {\n rect = extend({}, rect);\n\n rect.x = rect.left || 0;\n rect.top = rect.top || 0;\n rect.width = rect.width || (rect.right - rect.x);\n rect.height = rect.height || (rect.bottom - rect.y);\n }\n\n return rect;\n },\n};\n\nmodule.exports = rectUtils;\n","const win = module.exports;\nconst isWindow = require('./isWindow');\n\nfunction init (window) {\n // get wrapped window if using Shadow DOM polyfill\n\n win.realWindow = window;\n\n // create a TextNode\n const el = window.document.createTextNode('');\n\n // check if it's wrapped by a polyfill\n if (el.ownerDocument !== window.document\n && typeof window.wrap === 'function'\n && window.wrap(el) === el) {\n // use wrapped window\n window = window.wrap(window);\n }\n\n win.window = window;\n}\n\nif (typeof window === 'undefined') {\n win.window = undefined;\n win.realWindow = undefined;\n}\nelse {\n init(window);\n}\n\nwin.getWindow = function getWindow (node) {\n if (isWindow(node)) {\n return node;\n }\n\n const rootNode = (node.ownerDocument || node);\n\n return rootNode.defaultView || rootNode.parentWindow || win.window;\n};\n\nwin.init = init;\n"]} \ No newline at end of file diff --git a/package.json b/package.json index 76f3e9969..f39704e99 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "interactjs", - "version": "1.3.0-alpha.3+sha.9595c40", + "version": "1.3.0-alpha.4+sha.7970416", "repository": { "type": "git", "url": "https://github.com/taye/interact.js.git"
- Interactable.set(options)⚓➭ + Interactable.set(options)⚓➭ @@ -1399,7 +1399,7 @@ Parameters - Interactable.unset()⚓➭ + Interactable.unset()⚓➭ @@ -1442,7 +1442,7 @@ Interactable.unset() - Interactable.actionChecker([checker])⚓➭ + Interactable.actionChecker([checker])⚓➭ @@ -1542,7 +1542,7 @@ Parameters - Interactable.styleCursor([newValue])⚓➭ + Interactable.styleCursor([newValue])⚓➭ @@ -1605,7 +1605,7 @@ Parameters - interact.maxInteractions([newValue])⚓➭ + interact.maxInteractions([newValue])⚓➭ @@ -1652,7 +1652,7 @@ Parameters - Interactable.preventDefault([newValue])⚓➭ + Interactable.preventDefault([newValue])⚓➭ @@ -1718,7 +1718,7 @@ Parameters - interact(element)⚓➭ + interact(element)⚓➭ @@ -1821,7 +1821,7 @@ Usage - interact.isSet(element)⚓➭ + interact.isSet(element)⚓➭ @@ -1881,7 +1881,7 @@ Parameters - interact.on(type, listener, [options])⚓➭ + interact.on(type, listener, [options])⚓➭ @@ -1948,7 +1948,7 @@ Parameters - interact.off(type, listener, [options])⚓➭ + interact.off(type, listener, [options])⚓➭ @@ -2014,7 +2014,7 @@ Parameters - interact.debug()⚓➭ + interact.debug()⚓➭ @@ -2056,7 +2056,7 @@ interact.debug() - interact.supportsTouch()⚓➭ + interact.supportsTouch()⚓➭ @@ -2097,7 +2097,7 @@ interact.supportsTouch() - interact.supportsPointerEvent()⚓➭ + interact.supportsPointerEvent()⚓➭ @@ -2138,7 +2138,7 @@ interact.supportsPointerEvent() - interact.stop(event)⚓➭ + interact.stop(event)⚓➭ @@ -2198,7 +2198,7 @@ Parameters - interact.pointerMoveTolerance([newValue])⚓➭ + interact.pointerMoveTolerance([newValue])⚓➭ @@ -2261,7 +2261,7 @@ Parameters - Interaction.start(action, target, element)⚓➭ + Interaction.start(action, target, element)⚓➭ @@ -2356,7 +2356,7 @@ Parameters - Interaction.doMove()⚓➭ + Interaction.doMove()⚓➭ @@ -2403,7 +2403,7 @@ Interaction.doMove() - Interaction.end([event])⚓➭ + Interaction.end([event])⚓➭ diff --git a/dist/interact.js b/dist/interact.js index e8ae35c3b..c78a3c751 100644 --- a/dist/interact.js +++ b/dist/interact.js @@ -1,5 +1,5 @@ /** - * interact.js v1.3.0-alpha.3+sha.9595c40 + * interact.js v1.3.0-alpha.4+sha.7970416-dirty * * Copyright (c) 2012-2017 Taye Adeyemi * Open source under the MIT License. @@ -816,6 +816,7 @@ var scope = require('./scope'); var utils = require('./utils'); var events = require('./utils/events'); var browser = require('./utils/browser'); +var domObjects = require('./utils/domObjects'); var finder = require('./utils/interactionFinder'); var signals = require('./utils/Signals').new(); @@ -829,7 +830,9 @@ var prevTouchTime = 0; scope.interactions = []; var Interaction = function () { - function Interaction() { + function Interaction(_ref) { + var pointerType = _ref.pointerType; + _classCallCheck(this, Interaction); this.target = null; // current interactable being interacted with @@ -886,7 +889,7 @@ var Interaction = function () { this.pointerWasMoved = false; this._interacting = false; - this.mouse = false; + this.pointerType = pointerType; signals.fire('new', this); @@ -1130,6 +1133,11 @@ var Interaction = function () { }; Interaction.prototype.getPointerIndex = function getPointerIndex(pointer) { + // mouse and pen interactions may have only one pointer + if (this.pointerType === 'mouse' || this.pointerType === 'pen') { + return 0; + } + return utils.indexOf(this.pointerIds, utils.getPointerId(pointer)); }; @@ -1161,8 +1169,7 @@ var Interaction = function () { }; Interaction.prototype.removePointer = function removePointer(pointer, event) { - var id = utils.getPointerId(pointer); - var index = this.mouse ? 0 : utils.indexOf(this.pointerIds, id); + var index = this.getPointerIndex(pointer); if (index === -1) { return; @@ -1197,6 +1204,8 @@ for (var i = 0, len = methodNames.length; i < len; i++) { function doOnInteractions(method) { return function (event) { + var pointerType = utils.getPointerType(event); + var _utils$getEventTarget = utils.getEventTargets(event), eventTarget = _utils$getEventTarget[0], curEventTarget = _utils$getEventTarget[1]; @@ -1210,7 +1219,7 @@ function doOnInteractions(method) { var pointer = event.changedTouches[_i]; var interaction = finder.search(pointer, event.type, eventTarget); - matches.push([pointer, interaction || new Interaction()]); + matches.push([pointer, interaction || new Interaction({ pointerType: pointerType })]); } } else { var invalidPointer = false; @@ -1218,7 +1227,7 @@ function doOnInteractions(method) { if (!browser.supportsPointerEvent && /mouse/.test(event.type)) { // ignore mouse events while touch interactions are active for (var _i2 = 0; _i2 < scope.interactions.length && !invalidPointer; _i2++) { - invalidPointer = !scope.interactions[_i2].mouse && scope.interactions[_i2].pointerIsDown; + invalidPointer = scope.interactions[_i2].pointerType !== 'mouse' && scope.interactions[_i2].pointerIsDown; } // try to ignore mouse events that are simulated by the browser @@ -1232,11 +1241,7 @@ function doOnInteractions(method) { var _interaction = finder.search(event, event.type, eventTarget); if (!_interaction) { - - _interaction = new Interaction(); - _interaction.mouse = /mouse/i.test(event.pointerType || event.type) - // MSPointerEvent.MSPOINTER_TYPE_MOUSE - || event.pointerType === 4 || !event.pointerType; + _interaction = new Interaction({ pointerType: pointerType }); } matches.push([event, _interaction]); @@ -1244,20 +1249,20 @@ function doOnInteractions(method) { } for (var _iterator = matches, _isArray = Array.isArray(_iterator), _i3 = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { - var _ref; + var _ref2; if (_isArray) { if (_i3 >= _iterator.length) break; - _ref = _iterator[_i3++]; + _ref2 = _iterator[_i3++]; } else { _i3 = _iterator.next(); if (_i3.done) break; - _ref = _i3.value; + _ref2 = _i3.value; } - var _ref2 = _ref, - _pointer = _ref2[0], - _interaction2 = _ref2[1]; + var _ref3 = _ref2, + _pointer = _ref3[0], + _interaction2 = _ref3[1]; _interaction2._updateEventTargets(eventTarget, curEventTarget); _interaction2[method](_pointer, event, eventTarget, curEventTarget); @@ -1277,7 +1282,7 @@ function endAll(event) { var docEvents = {/* 'eventType': listenerFunc */}; var pEventTypes = browser.pEventTypes; -if (scope.PointerEvent) { +if (domObjects.PointerEvent) { docEvents[pEventTypes.down] = listeners.pointerDown; docEvents[pEventTypes.move] = listeners.pointerMove; docEvents[pEventTypes.up] = listeners.pointerUp; @@ -1295,8 +1300,8 @@ if (scope.PointerEvent) { docEvents.blur = endAll; -function onDocSignal(_ref3, signalName) { - var doc = _ref3.doc; +function onDocSignal(_ref4, signalName) { + var doc = _ref4.doc; var eventMethod = signalName.indexOf('add') === 0 ? events.add : events.remove; @@ -1311,14 +1316,14 @@ function onDocSignal(_ref3, signalName) { } } -signals.on('update-pointer-down', function (_ref4) { - var interaction = _ref4.interaction, - pointer = _ref4.pointer, - pointerId = _ref4.pointerId, - pointerIndex = _ref4.pointerIndex, - event = _ref4.event, - eventTarget = _ref4.eventTarget, - down = _ref4.down; +signals.on('update-pointer-down', function (_ref5) { + var interaction = _ref5.interaction, + pointer = _ref5.pointer, + pointerId = _ref5.pointerId, + pointerIndex = _ref5.pointerIndex, + event = _ref5.event, + eventTarget = _ref5.eventTarget, + down = _ref5.down; interaction.pointerIds[pointerIndex] = pointerId; interaction.pointers[pointerIndex] = pointer; @@ -1355,7 +1360,7 @@ scope.endAllInteractions = endAll; module.exports = Interaction; -},{"./scope":34,"./utils":44,"./utils/Signals":35,"./utils/browser":37,"./utils/events":40,"./utils/interactionFinder":45}],6:[function(require,module,exports){ +},{"./scope":34,"./utils":44,"./utils/Signals":35,"./utils/browser":37,"./utils/domObjects":38,"./utils/events":40,"./utils/interactionFinder":45}],6:[function(require,module,exports){ 'use strict'; var Interaction = require('../Interaction'); @@ -5460,7 +5465,7 @@ module.exports = function () { this.originalEvent = event; this.type = type; this.pointerId = pointerUtils.getPointerId(pointer); - this.pointerType = pointerUtils.getPointerType(pointer, interaction); + this.pointerType = pointerUtils.getPointerType(pointer); this.target = eventTarget; this.currentTarget = null; @@ -5758,8 +5763,10 @@ Interaction.signals.on('down', function (_ref6) { timer.duration = minDuration; timer.timeout = setTimeout(function () { fire({ - interaction: interaction, eventCopy: eventCopy, eventTarget: eventTarget, + interaction: interaction, + eventTarget: eventTarget, pointer: browser.isIE8 ? eventCopy : pointer, + event: eventCopy, type: 'hold' }); }, minDuration); @@ -6946,17 +6953,14 @@ module.exports = utils; var scope = require('../scope'); var utils = require('./index'); -var browser = require('./browser'); var finder = { - methodOrder: ['simulationResume', 'mouse', 'hasPointer', 'idle'], + methodOrder: ['simulationResume', 'mouseOrPen', 'hasPointer', 'idle'], search: function search(pointer, eventType, eventTarget) { - var mouseEvent = /mouse/i.test(pointer.pointerType || eventType) - // MSPointerEvent.MSPOINTER_TYPE_MOUSE - || pointer.pointerType === 4; + var pointerType = utils.getPointerType(pointer); var pointerId = utils.getPointerId(pointer); - var details = { pointer: pointer, pointerId: pointerId, mouseEvent: mouseEvent, eventType: eventType, eventTarget: eventTarget }; + var details = { pointer: pointer, pointerId: pointerId, pointerType: pointerType, eventType: eventType, eventTarget: eventTarget }; for (var _iterator = finder.methodOrder, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { var _ref; @@ -6982,7 +6986,7 @@ var finder = { // try to resume simulation with a new pointer simulationResume: function simulationResume(_ref2) { - var mouseEvent = _ref2.mouseEvent, + var pointerType = _ref2.pointerType, eventType = _ref2.eventType, eventTarget = _ref2.eventTarget; @@ -7006,7 +7010,7 @@ var finder = { var element = eventTarget; - if (interaction.simulation && interaction.simulation.allowResume && interaction.mouse === mouseEvent) { + if (interaction.simulation && interaction.simulation.allowResume && interaction.pointerType === pointerType) { while (element) { // if the element is the interaction element if (element === interaction.element) { @@ -7020,13 +7024,13 @@ var finder = { return null; }, - // if it's a mouse interaction - mouse: function mouse(_ref4) { + // if it's a mouse or pen interaction + mouseOrPen: function mouseOrPen(_ref4) { var pointerId = _ref4.pointerId, - mouseEvent = _ref4.mouseEvent, + pointerType = _ref4.pointerType, eventType = _ref4.eventType; - if (!mouseEvent && (browser.supportsTouch || browser.supportsPointerEvent)) { + if (pointerType !== 'mouse' && pointerType !== 'pen') { return null; } @@ -7046,7 +7050,7 @@ var finder = { var interaction = _ref5; - if (interaction.mouse) { + if (interaction.pointerType === pointerType) { // if it's a down event, skip interactions with running simulations if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; @@ -7069,8 +7073,8 @@ var finder = { return firstNonActive; } - // Find any interaction specifically for mouse. - // ignore the interaction if the eventType is a mousedown, and a simulation + // find any mouse or pen interaction. + // ignore the interaction if the eventType is a *down, and a simulation // is active for (var _iterator4 = scope.interactions, _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) { var _ref6; @@ -7086,7 +7090,7 @@ var finder = { var _interaction = _ref6; - if (_interaction.mouse && !(/down/.test(eventType) && _interaction.simulation)) { + if (_interaction.pointerType === pointerType && !(/down/i.test(eventType) && _interaction.simulation)) { return _interaction; } } @@ -7118,9 +7122,9 @@ var finder = { } }, - // get first idle interaction + // get first idle interaction with a matching pointerType idle: function idle(_ref9) { - var mouseEvent = _ref9.mouseEvent; + var pointerType = _ref9.pointerType; for (var _iterator6 = scope.interactions, _isArray6 = Array.isArray(_iterator6), _i6 = 0, _iterator6 = _isArray6 ? _iterator6 : _iterator6[Symbol.iterator]();;) { var _ref10; @@ -7150,7 +7154,7 @@ var finder = { continue; } - if (!interaction.interacting() && mouseEvent === interaction.mouse) { + if (!interaction.interacting() && pointerType === interaction.pointerType) { return interaction; } } @@ -7161,7 +7165,7 @@ var finder = { module.exports = finder; -},{"../scope":34,"./browser":37,"./index":44}],46:[function(require,module,exports){ +},{"../scope":34,"./index":44}],46:[function(require,module,exports){ 'use strict'; var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; @@ -7262,6 +7266,7 @@ var hypot = require('./hypot'); var browser = require('./browser'); var dom = require('./domObjects'); var domUtils = require('./domUtils'); +var domObjects = require('./domObjects'); var is = require('./is'); var pointerExtend = require('./pointerExtend'); @@ -7468,17 +7473,11 @@ var pointerUtils = { return angle; }, - getPointerType: function getPointerType(pointer, interaction) { - // if the PointerEvent API isn't available, then the pointer must be ither - // a MouseEvent or TouchEvent - if (interaction.mouse) { - return 'mouse'; - } - if (!browser.supportsPointerEvent) { - return 'touch'; - } - - return is.string(pointer.pointerType) ? pointer.pointerType : [undefined, undefined, 'touch', 'pen', 'mouse'][pointer.pointerType]; + getPointerType: function getPointerType(pointer) { + return is.string(pointer.pointerType) ? pointer.pointerType : is.number(pointer.pointerType) ? [undefined, undefined, 'touch', 'pen', 'mouse'][pointer.pointerType] + // if the PointerEvent API isn't available, then the "pointer" must + // be either a MouseEvent, TouchEvent, or Touch object + : /touch/.test(pointer.type) || pointer instanceof domObjects.Touch ? 'touch' : 'mouse'; }, // [ event.target, event.currentTarget ] diff --git a/dist/interact.js.map b/dist/interact.js.map index 60832b766..4f3a62ba8 100644 --- a/dist/interact.js.map +++ b/dist/interact.js.map @@ -1 +1 @@ -{"version":3,"sources":["src/header.js","node_modules/browser-pack/_prelude.js","index.js","src/Eventable.js","src/InteractEvent.js","src/Interactable.js","src/Interaction.js","src/actions/base.js","src/actions/drag.js","src/actions/drop.js","src/actions/gesture.js","src/actions/resize.js","src/autoScroll.js","src/autoStart/InteractableMethods.js","src/autoStart/base.js","src/autoStart/delay.js","src/autoStart/drag.js","src/autoStart/gesture.js","src/autoStart/resize.js","src/defaultOptions.js","src/index.js","src/inertia.js","src/interact.js","src/interactablePreventDefault.js","src/legacyBrowsers.js","src/modifiers/index.js","src/modifiers/restrict.js","src/modifiers/restrictEdges.js","src/modifiers/restrictSize.js","src/modifiers/snap.js","src/modifiers/snapSize.js","src/pointerEvents/PointerEvent.js","src/pointerEvents/base.js","src/pointerEvents/holdRepeat.js","src/pointerEvents/interactableTargets.js","src/scope.js","src/utils/Signals.js","src/utils/arr.js","src/utils/browser.js","src/utils/domObjects.js","src/utils/domUtils.js","src/utils/events.js","src/utils/extend.js","src/utils/getOriginXY.js","src/utils/hypot.js","src/utils/index.js","src/utils/interactionFinder.js","src/utils/is.js","src/utils/isWindow.js","src/utils/pointerExtend.js","src/utils/pointerUtils.js","src/utils/raf.js","src/utils/rect.js","src/utils/window.js"],"names":[],"mappings":"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","file":"interact.js","sourceRoot":"","sourcesContent":["/**\n * interact.js v1.3.0-alpha.3+sha.9595c40\n *\n * Copyright (c) 2012-2017 Taye Adeyemi \n * Open source under the MIT License.\n * https://raw.github.com/taye/interact.js/master/LICENSE\n */\n","(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o 150) {\n return null;\n }\n\n let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI;\n const overlap = 22.5;\n\n if (angle < 0) {\n angle += 360;\n }\n\n const left = 135 - overlap <= angle && angle < 225 + overlap;\n const up = 225 - overlap <= angle && angle < 315 + overlap;\n\n const right = !left && (315 - overlap <= angle || angle < 45 + overlap);\n const down = !up && 45 - overlap <= angle && angle < 135 + overlap;\n\n return {\n up,\n down,\n left,\n right,\n angle,\n speed: interaction.prevEvent.speed,\n velocity: {\n x: interaction.prevEvent.velocityX,\n y: interaction.prevEvent.velocityY,\n },\n };\n }\n\n preventDefault () {}\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n}\n\nsignals.on('set-delta', function ({ iEvent, interaction, starting, deltaSource }) {\n const prevEvent = starting? iEvent : interaction.prevEvent;\n\n if (deltaSource === 'client') {\n iEvent.dx = iEvent.clientX - prevEvent.clientX;\n iEvent.dy = iEvent.clientY - prevEvent.clientY;\n }\n else {\n iEvent.dx = iEvent.pageX - prevEvent.pageX;\n iEvent.dy = iEvent.pageY - prevEvent.pageY;\n }\n});\n\nInteractEvent.signals = signals;\n\nmodule.exports = InteractEvent;\n","const is = require('./utils/is');\nconst events = require('./utils/events');\nconst extend = require('./utils/extend');\nconst actions = require('./actions/base');\nconst scope = require('./scope');\nconst Eventable = require('./Eventable');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nconst {\n getElementRect,\n nodeContains,\n trySelector,\n} = require('./utils/domUtils');\nconst { getWindow } = require('./utils/window');\nconst { indexOf, contains } = require('./utils/arr');\nconst { wheelEvent } = require('./utils/browser');\n\n// all set interactables\nscope.interactables = [];\n\n/*\\\n * Interactable\n [ property ]\n **\n * Object type returned by @interact\n\\*/\nclass Interactable {\n constructor (target, options) {\n options = options || {};\n\n this.target = target;\n this.events = new Eventable();\n this._context = options.context || scope.document;\n this._win = getWindow(trySelector(target)? this._context : target);\n this._doc = this._win.document;\n\n signals.fire('new', {\n target,\n options,\n interactable: this,\n win: this._win,\n });\n\n scope.addDocument( this._doc, this._win );\n\n scope.interactables.push(this);\n\n this.set(options);\n }\n\n setOnEvents (action, phases) {\n const onAction = 'on' + action;\n\n if (is.function(phases.onstart) ) { this.events[onAction + 'start' ] = phases.onstart ; }\n if (is.function(phases.onmove) ) { this.events[onAction + 'move' ] = phases.onmove ; }\n if (is.function(phases.onend) ) { this.events[onAction + 'end' ] = phases.onend ; }\n if (is.function(phases.oninertiastart)) { this.events[onAction + 'inertiastart' ] = phases.oninertiastart ; }\n\n return this;\n }\n\n setPerAction (action, options) {\n // for all the default per-action options\n for (const option in options) {\n // if this option exists for this action\n if (option in defaults[action]) {\n // if the option in the options arg is an object value\n if (is.object(options[option])) {\n // duplicate the object\n this.options[action][option] = extend(this.options[action][option] || {}, options[option]);\n\n if (is.object(defaults.perAction[option]) && 'enabled' in defaults.perAction[option]) {\n this.options[action][option].enabled = options[option].enabled === false? false : true;\n }\n }\n else if (is.bool(options[option]) && is.object(defaults.perAction[option])) {\n this.options[action][option].enabled = options[option];\n }\n else if (options[option] !== undefined) {\n // or if it's not undefined, do a plain assignment\n this.options[action][option] = options[option];\n }\n }\n }\n }\n\n /*\\\n * Interactable.getRect\n [ method ]\n *\n * The default function to get an Interactables bounding rect. Can be\n * overridden using @Interactable.rectChecker.\n *\n - element (Element) #optional The element to measure.\n = (object) The object's bounding rectangle.\n o {\n o top : 0,\n o left : 0,\n o bottom: 0,\n o right : 0,\n o width : 0,\n o height: 0\n o }\n \\*/\n getRect (element) {\n element = element || this.target;\n\n if (is.string(this.target) && !(is.element(element))) {\n element = this._context.querySelector(this.target);\n }\n\n return getElementRect(element);\n }\n\n /*\\\n * Interactable.rectChecker\n [ method ]\n *\n * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n - checker (function) #optional A function which returns this Interactable's bounding rectangle. See @Interactable.getRect\n = (function | object) The checker function or this Interactable\n \\*/\n rectChecker (checker) {\n if (is.function(checker)) {\n this.getRect = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.getRect;\n\n return this;\n }\n\n return this.getRect;\n }\n\n _backCompatOption (optionName, newValue) {\n if (trySelector(newValue) || is.object(newValue)) {\n this.options[optionName] = newValue;\n\n for (const action of actions.names) {\n this.options[action][optionName] = newValue;\n }\n\n return this;\n }\n\n return this.options[optionName];\n }\n\n /*\\\n * Interactable.origin\n [ method ]\n *\n * Gets or sets the origin of the Interactable's element. The x and y\n * of the origin will be subtracted from action event coordinates.\n *\n - origin (object | string) #optional An object eg. { x: 0, y: 0 } or string 'parent', 'self' or any CSS selector\n * OR\n - origin (Element) #optional An HTML or SVG Element whose rect will be used\n **\n = (object) The current origin or this Interactable\n \\*/\n origin (newValue) {\n return this._backCompatOption('origin', newValue);\n }\n\n /*\\\n * Interactable.deltaSource\n [ method ]\n *\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n - newValue (string) #optional Use 'client' if you will be scrolling while interacting; Use 'page' if you want autoScroll to work\n = (string | object) The current deltaSource or this Interactable\n \\*/\n deltaSource (newValue) {\n if (newValue === 'page' || newValue === 'client') {\n this.options.deltaSource = newValue;\n\n return this;\n }\n\n return this.options.deltaSource;\n }\n\n /*\\\n * Interactable.context\n [ method ]\n *\n * Gets the selector context Node of the Interactable. The default is `window.document`.\n *\n = (Node) The context Node of this Interactable\n **\n \\*/\n context () {\n return this._context;\n }\n\n inContext (element) {\n return (this._context === element.ownerDocument\n || nodeContains(this._context, element));\n }\n\n /*\\\n * Interactable.fire\n [ method ]\n *\n * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n - iEvent (InteractEvent) The InteractEvent object to be fired on this Interactable\n = (Interactable) this Interactable\n \\*/\n fire (iEvent) {\n this.events.fire(iEvent);\n\n return this;\n }\n\n _onOffMultiple (method, eventType, listener, options) {\n if (is.string(eventType) && eventType.search(' ') !== -1) {\n eventType = eventType.trim().split(/ +/);\n }\n\n if (is.array(eventType)) {\n for (let i = 0; i < eventType.length; i++) {\n this[method](eventType[i], listener, options);\n }\n\n return true;\n }\n\n if (is.object(eventType)) {\n for (const prop in eventType) {\n this[method](prop, eventType[prop], listener);\n }\n\n return true;\n }\n }\n\n /*\\\n * Interactable.on\n [ method ]\n *\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n - eventType (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) This Interactable\n \\*/\n on (eventType, listener, options) {\n if (this._onOffMultiple('on', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.on(eventType, listener);\n }\n // delegated event for selector\n else if (is.string(this.target)) {\n events.addDelegate(this.target, this._context, eventType, listener, options);\n }\n else {\n events.add(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.off\n [ method ]\n *\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n - eventType (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) This Interactable\n \\*/\n off (eventType, listener, options) {\n if (this._onOffMultiple('off', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n // if it is an action event type\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.off(eventType, listener);\n }\n // delegated event\n else if (is.string(this.target)) {\n events.removeDelegate(this.target, this._context, eventType, listener, options);\n }\n // remove listener from this Interatable's element\n else {\n events.remove(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.set\n [ method ]\n *\n * Reset the options of this Interactable\n - options (object) The new settings to apply\n = (object) This Interactable\n \\*/\n set (options) {\n if (!is.object(options)) {\n options = {};\n }\n\n this.options = extend({}, defaults.base);\n\n const perActions = extend({}, defaults.perAction);\n\n for (const actionName in actions.methodDict) {\n const methodName = actions.methodDict[actionName];\n\n this.options[actionName] = extend({}, defaults[actionName]);\n\n this.setPerAction(actionName, perActions);\n\n this[methodName](options[actionName]);\n }\n\n for (const setting of Interactable.settingsMethods) {\n this.options[setting] = defaults.base[setting];\n\n if (setting in options) {\n this[setting](options[setting]);\n }\n }\n\n signals.fire('set', {\n options,\n interactable: this,\n });\n\n return this;\n }\n\n /*\\\n * Interactable.unset\n [ method ]\n *\n * Remove this interactable from the list of interactables and remove\n * it's action capabilities and event listeners\n *\n = (object) @interact\n \\*/\n unset () {\n events.remove(this.target, 'all');\n\n if (is.string(this.target)) {\n // remove delegated events\n for (const type in events.delegatedEvents) {\n const delegated = events.delegatedEvents[type];\n\n if (delegated.selectors[0] === this.target\n && delegated.contexts[0] === this._context) {\n\n delegated.selectors.splice(0, 1);\n delegated.contexts .splice(0, 1);\n delegated.listeners.splice(0, 1);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegated[type] = null;\n }\n }\n\n events.remove(this._context, type, events.delegateListener);\n events.remove(this._context, type, events.delegateUseCapture, true);\n }\n }\n else {\n events.remove(this, 'all');\n }\n\n signals.fire('unset', { interactable: this });\n\n scope.interactables.splice(indexOf(scope.interactables, this), 1);\n\n // Stop related interactions when an Interactable is unset\n for (const interaction of scope.interactions || []) {\n if (interaction.target === this && interaction.interacting()) {\n interaction.stop();\n }\n }\n\n return scope.interact;\n }\n}\n\nscope.interactables.indexOfElement = function indexOfElement (target, context) {\n context = context || scope.document;\n\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n if (interactable.target === target && interactable._context === context) {\n return i;\n }\n }\n return -1;\n};\n\nscope.interactables.get = function interactableGet (element, options, dontCheckInContext) {\n const ret = this[this.indexOfElement(element, options && options.context)];\n\n return ret && (is.string(element) || dontCheckInContext || ret.inContext(element))? ret : null;\n};\n\nscope.interactables.forEachSelector = function (callback, element) {\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n // skip non CSS selector targets and out of context elements\n if (!is.string(interactable.target)\n || (element && !interactable.inContext(element))) {\n continue;\n }\n\n const ret = callback(interactable, interactable.target, interactable._context, i, this);\n\n if (ret !== undefined) {\n return ret;\n }\n }\n};\n\n// all interact.js eventTypes\nInteractable.eventTypes = scope.eventTypes = [];\n\nInteractable.signals = signals;\n\nInteractable.settingsMethods = [ 'deltaSource', 'origin', 'preventDefault', 'rectChecker' ];\n\nmodule.exports = Interactable;\n","const scope = require('./scope');\nconst utils = require('./utils');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst finder = require('./utils/interactionFinder');\nconst signals = require('./utils/Signals').new();\n\nconst listeners = {};\nconst methodNames = [\n 'pointerDown', 'pointerMove', 'pointerUp',\n 'updatePointer', 'removePointer',\n];\n\n// for ignoring browser's simulated mouse events\nlet prevTouchTime = 0;\n\n// all active and idle interactions\nscope.interactions = [];\n\nclass Interaction {\n constructor () {\n this.target = null; // current interactable being interacted with\n this.element = null; // the target element of the interactable\n\n this.prepared = { // action that's ready to be fired on next move event\n name : null,\n axis : null,\n edges: null,\n };\n\n // keep track of added pointers\n this.pointers = [];\n this.pointerIds = [];\n this.downTargets = [];\n this.downTimes = [];\n\n // Previous native pointer move event coordinates\n this.prevCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n // current native pointer move event coordinates\n this.curCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Starting InteractEvent pointer coordinates\n this.startCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Change in coordinates and time of the pointer\n this.pointerDelta = {\n page : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n client : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n timeStamp: 0,\n };\n\n this.downEvent = null; // pointerdown/mousedown/touchstart event\n this.downPointer = {};\n\n this._eventTarget = null;\n this._curEventTarget = null;\n\n this.prevEvent = null; // previous action event\n\n this.pointerIsDown = false;\n this.pointerWasMoved = false;\n this._interacting = false;\n\n this.mouse = false;\n\n signals.fire('new', this);\n\n scope.interactions.push(this);\n }\n\n pointerDown (pointer, event, eventTarget) {\n const pointerIndex = this.updatePointer(pointer, event, true);\n\n signals.fire('down', {\n pointer,\n event,\n eventTarget,\n pointerIndex,\n interaction: this,\n });\n }\n\n /*\\\n * Interaction.start\n [ method ]\n *\n * Start an action with the given Interactable and Element as tartgets. The\n * action must be enabled for the target Interactable and an appropriate number\n * of pointers must be held down - 1 for drag/resize, 2 for gesture.\n *\n * Use it with `interactable.able({ manualStart: false })` to always\n * [start actions manually](https://github.com/taye/interact.js/issues/114)\n *\n - action (object) The action to be performed - drag, resize, etc.\n - target (Interactable) The Interactable to target\n - element (Element) The DOM Element to target\n = (object) interact\n **\n | interact(target)\n | .draggable({\n | // disable the default drag start by down->move\n | manualStart: true\n | })\n | // start dragging after the user holds the pointer down\n | .on('hold', function (event) {\n | var interaction = event.interaction;\n |\n | if (!interaction.interacting()) {\n | interaction.start({ name: 'drag' },\n | event.interactable,\n | event.currentTarget);\n | }\n | });\n \\*/\n start (action, target, element) {\n if (this.interacting()\n || !this.pointerIsDown\n || this.pointerIds.length < (action.name === 'gesture'? 2 : 1)) {\n return;\n }\n\n // if this interaction had been removed after stopping\n // add it back\n if (utils.indexOf(scope.interactions, this) === -1) {\n scope.interactions.push(this);\n }\n\n utils.copyAction(this.prepared, action);\n this.target = target;\n this.element = element;\n\n signals.fire('action-start', {\n interaction: this,\n event: this.downEvent,\n });\n }\n\n pointerMove (pointer, event, eventTarget) {\n if (!this.simulation) {\n this.updatePointer(pointer);\n utils.setCoords(this.curCoords, this.pointers);\n }\n\n const duplicateMove = (this.curCoords.page.x === this.prevCoords.page.x\n && this.curCoords.page.y === this.prevCoords.page.y\n && this.curCoords.client.x === this.prevCoords.client.x\n && this.curCoords.client.y === this.prevCoords.client.y);\n\n let dx;\n let dy;\n\n // register movement greater than pointerMoveTolerance\n if (this.pointerIsDown && !this.pointerWasMoved) {\n dx = this.curCoords.client.x - this.startCoords.client.x;\n dy = this.curCoords.client.y - this.startCoords.client.y;\n\n this.pointerWasMoved = utils.hypot(dx, dy) > Interaction.pointerMoveTolerance;\n }\n\n const signalArg = {\n pointer,\n pointerIndex: this.getPointerIndex(pointer),\n event,\n eventTarget,\n dx,\n dy,\n duplicate: duplicateMove,\n interaction: this,\n interactingBeforeMove: this.interacting(),\n };\n\n if (!duplicateMove) {\n // set pointer coordinate, time changes and speeds\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n }\n\n signals.fire('move', signalArg);\n\n if (!duplicateMove) {\n // if interacting, fire an 'action-move' signal etc\n if (this.interacting()) {\n this.doMove(signalArg);\n }\n\n if (this.pointerWasMoved) {\n utils.copyCoords(this.prevCoords, this.curCoords);\n }\n }\n }\n\n /*\\\n * Interaction.doMove\n [ method ]\n *\n * Force a move of the current action at the same coordinates. Useful if\n * snap/restrict has been changed and you want a movement with the new\n * settings.\n *\n **\n | interact(target)\n | .draggable(true)\n | .on('dragmove', function (event) {\n | if (someCondition) {\n | // change the snap settings\n | event.interactable.draggable({ snap: { targets: [] }});\n | // fire another move event with re-calculated snap\n | event.interaction.doMove();\n | }\n | });\n \\*/\n doMove (signalArg) {\n signalArg = utils.extend({\n pointer: this.pointers[0],\n event: this.prevEvent,\n eventTarget: this._eventTarget,\n interaction: this,\n }, signalArg || {});\n\n signals.fire('before-action-move', signalArg);\n\n if (!this._dontFireMove) {\n signals.fire('action-move', signalArg);\n }\n\n this._dontFireMove = false;\n }\n\n // End interact move events and stop auto-scroll unless simulation is running\n pointerUp (pointer, event, eventTarget, curEventTarget) {\n const pointerIndex = this.getPointerIndex(pointer);\n\n signals.fire(/cancel$/i.test(event.type)? 'cancel' : 'up', {\n pointer,\n pointerIndex,\n event,\n eventTarget,\n curEventTarget,\n interaction: this,\n });\n\n if (!this.simulation) {\n this.end(event);\n }\n\n this.pointerIsDown = false;\n this.removePointer(pointer, event);\n }\n\n /*\\\n * Interaction.end\n [ method ]\n *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n - event (PointerEvent) #optional\n **\n | interact(target)\n | .draggable(true)\n | .on('move', function (event) {\n | if (event.pageX > 1000) {\n | // end the current action\n | event.interaction.end();\n | // stop all further listeners from being called\n | event.stopImmediatePropagation();\n | }\n | });\n \\*/\n end (event) {\n event = event || this.prevEvent;\n\n if (this.interacting()) {\n signals.fire('action-end', {\n event,\n interaction: this,\n });\n }\n\n this.stop();\n }\n\n currentAction () {\n return this._interacting? this.prepared.name: null;\n }\n\n interacting () {\n return this._interacting;\n }\n\n stop () {\n signals.fire('stop', { interaction: this });\n\n if (this._interacting) {\n signals.fire('stop-active', { interaction: this });\n signals.fire('stop-' + this.prepared.name, { interaction: this });\n }\n\n this.target = this.element = null;\n\n this._interacting = false;\n this.prepared.name = this.prevEvent = null;\n }\n\n getPointerIndex (pointer) {\n return utils.indexOf(this.pointerIds, utils.getPointerId(pointer));\n }\n\n updatePointer (pointer, event, down = event && /(down|start)$/i.test(event.type)) {\n const id = utils.getPointerId(pointer);\n let index = this.getPointerIndex(pointer);\n\n if (index === -1) {\n index = this.pointerIds.length;\n this.pointerIds[index] = id;\n }\n\n if (down) {\n signals.fire('update-pointer-down', {\n pointer,\n event,\n down,\n pointerId: id,\n pointerIndex: index,\n interaction: this,\n });\n }\n\n this.pointers[index] = pointer;\n\n return index;\n }\n\n removePointer (pointer, event) {\n const id = utils.getPointerId(pointer);\n const index = this.mouse? 0 : utils.indexOf(this.pointerIds, id);\n\n if (index === -1) { return; }\n\n signals.fire('remove-pointer', {\n pointer,\n event,\n pointerIndex: index,\n interaction: this,\n });\n\n this.pointers .splice(index, 1);\n this.pointerIds .splice(index, 1);\n this.downTargets.splice(index, 1);\n this.downTimes .splice(index, 1);\n }\n\n _updateEventTargets (target, currentTarget) {\n this._eventTarget = target;\n this._curEventTarget = currentTarget;\n }\n}\n\nfor (let i = 0, len = methodNames.length; i < len; i++) {\n const method = methodNames[i];\n\n listeners[method] = doOnInteractions(method);\n}\n\nfunction doOnInteractions (method) {\n return (function (event) {\n const [eventTarget, curEventTarget] = utils.getEventTargets(event);\n const matches = []; // [ [pointer, interaction], ...]\n\n if (browser.supportsTouch && /touch/.test(event.type)) {\n prevTouchTime = new Date().getTime();\n\n for (let i = 0; i < event.changedTouches.length; i++) {\n const pointer = event.changedTouches[i];\n const interaction = finder.search(pointer, event.type, eventTarget);\n\n matches.push([pointer, interaction || new Interaction()]);\n }\n }\n else {\n let invalidPointer = false;\n\n if (!browser.supportsPointerEvent && /mouse/.test(event.type)) {\n // ignore mouse events while touch interactions are active\n for (let i = 0; i < scope.interactions.length && !invalidPointer; i++) {\n invalidPointer = !scope.interactions[i].mouse && scope.interactions[i].pointerIsDown;\n }\n\n // try to ignore mouse events that are simulated by the browser\n // after a touch event\n invalidPointer = invalidPointer\n || (new Date().getTime() - prevTouchTime < 500)\n // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated\n || event.timeStamp === 0;\n }\n\n if (!invalidPointer) {\n let interaction = finder.search(event, event.type, eventTarget);\n\n if (!interaction) {\n\n interaction = new Interaction();\n interaction.mouse = (/mouse/i.test(event.pointerType || event.type)\n // MSPointerEvent.MSPOINTER_TYPE_MOUSE\n || event.pointerType === 4\n || !event.pointerType);\n }\n\n matches.push([event, interaction]);\n }\n }\n\n for (const [pointer, interaction] of matches) {\n interaction._updateEventTargets(eventTarget, curEventTarget);\n interaction[method](pointer, event, eventTarget, curEventTarget);\n }\n });\n}\n\nfunction endAll (event) {\n for (let i = 0; i < scope.interactions.length; i++) {\n const interaction = scope.interactions[i];\n\n interaction.end(event);\n signals.fire('endall', { event, interaction });\n }\n}\n\nconst docEvents = { /* 'eventType': listenerFunc */ };\nconst pEventTypes = browser.pEventTypes;\n\nif (scope.PointerEvent) {\n docEvents[pEventTypes.down ] = listeners.pointerDown;\n docEvents[pEventTypes.move ] = listeners.pointerMove;\n docEvents[pEventTypes.up ] = listeners.pointerUp;\n docEvents[pEventTypes.cancel] = listeners.pointerUp;\n}\nelse {\n docEvents.mousedown = listeners.pointerDown;\n docEvents.mousemove = listeners.pointerMove;\n docEvents.mouseup = listeners.pointerUp;\n\n docEvents.touchstart = listeners.pointerDown;\n docEvents.touchmove = listeners.pointerMove;\n docEvents.touchend = listeners.pointerUp;\n docEvents.touchcancel = listeners.pointerUp;\n}\n\ndocEvents.blur = endAll;\n\nfunction onDocSignal ({ doc }, signalName) {\n const eventMethod = signalName.indexOf('add') === 0\n ? events.add : events.remove;\n\n // delegate event listener\n for (const eventType in scope.delegatedEvents) {\n eventMethod(doc, eventType, events.delegateListener);\n eventMethod(doc, eventType, events.delegateUseCapture, true);\n }\n\n for (const eventType in docEvents) {\n eventMethod(doc, eventType, docEvents[eventType]);\n }\n}\n\nsignals.on('update-pointer-down', ({ interaction, pointer, pointerId, pointerIndex, event, eventTarget, down }) => {\n interaction.pointerIds[pointerIndex] = pointerId;\n interaction.pointers[pointerIndex] = pointer;\n\n if (down) {\n interaction.pointerIsDown = true;\n }\n\n if (!interaction.interacting()) {\n utils.setCoords(interaction.startCoords, interaction.pointers);\n\n utils.copyCoords(interaction.curCoords , interaction.startCoords);\n utils.copyCoords(interaction.prevCoords, interaction.startCoords);\n\n interaction.downEvent = event;\n interaction.downTimes[pointerIndex] = interaction.curCoords.timeStamp;\n interaction.downTargets[pointerIndex] = eventTarget || event && utils.getEventTargets(event)[0];\n interaction.pointerWasMoved = false;\n\n utils.pointerExtend(interaction.downPointer, pointer);\n }\n});\n\nscope.signals.on('add-document' , onDocSignal);\nscope.signals.on('remove-document', onDocSignal);\n\nInteraction.pointerMoveTolerance = 1;\nInteraction.doOnInteractions = doOnInteractions;\nInteraction.endAll = endAll;\nInteraction.signals = signals;\nInteraction.docEvents = docEvents;\n\nscope.endAllInteractions = endAll;\n\nmodule.exports = Interaction;\n","const Interaction = require('../Interaction');\nconst InteractEvent = require('../InteractEvent');\n\nconst actions = {\n firePrepared,\n names: [],\n methodDict: {},\n};\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n interaction._interacting = true;\n firePrepared(interaction, event, 'start');\n});\n\nInteraction.signals.on('action-move', function ({ interaction, event, preEnd }) {\n firePrepared(interaction, event, 'move', preEnd);\n\n // if the action was ended in a listener\n if (!interaction.interacting()) { return false; }\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n firePrepared(interaction, event, 'end');\n});\n\nfunction firePrepared (interaction, event, phase, preEnd) {\n const actionName = interaction.prepared.name;\n\n const newEvent = new InteractEvent(interaction, event, actionName, phase, interaction.element, null, preEnd);\n\n interaction.target.fire(newEvent);\n interaction.prevEvent = newEvent;\n}\n\nmodule.exports = actions;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drag = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n startAxis : 'xy',\n lockAxis : 'xy',\n },\n\n checker: function (pointer, event, interactable) {\n const dragOptions = interactable.options.drag;\n\n return dragOptions.enabled\n ? { name: 'drag', axis: (dragOptions.lockAxis === 'start'\n ? dragOptions.startAxis\n : dragOptions.lockAxis)}\n : null;\n },\n\n getCursor: function () {\n return 'move';\n },\n};\n\nInteraction.signals.on('before-action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n interaction.curCoords.page.y = interaction.startCoords.page.y;\n interaction.curCoords.client.y = interaction.startCoords.client.y;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vx);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vx);\n interaction.pointerDelta.client.vy = 0;\n interaction.pointerDelta.page.vy = 0;\n }\n else if (axis === 'y') {\n interaction.curCoords.page.x = interaction.startCoords.page.x;\n interaction.curCoords.client.x = interaction.startCoords.client.x;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vy);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vy);\n interaction.pointerDelta.client.vx = 0;\n interaction.pointerDelta.page.vx = 0;\n }\n});\n\n// dragmove\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'dragmove') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n iEvent.pageY = interaction.startCoords.page.y;\n iEvent.clientY = interaction.startCoords.client.y;\n iEvent.dy = 0;\n }\n else if (axis === 'y') {\n iEvent.pageX = interaction.startCoords.page.x;\n iEvent.clientX = interaction.startCoords.client.x;\n iEvent.dx = 0;\n }\n});\n\n/*\\\n * Interactable.draggable\n [ method ]\n *\n * Gets or sets whether drag actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of drag events\n | var isDraggable = interact('ul li').draggable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on drag events (object makes the Interactable draggable)\n = (object) This Interactable\n | interact(element).draggable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // the axis in which the first movement must be\n | // for the drag sequence to start\n | // 'xy' by default - any direction\n | startAxis: 'x' || 'y' || 'xy',\n |\n | // 'xy' by default - don't restrict to one axis (move in any direction)\n | // 'x' or 'y' to restrict movement to either axis\n | // 'start' to restrict movement to the axis the drag started in\n | lockAxis: 'x' || 'y' || 'xy' || 'start',\n |\n | // max number of drags that can happen concurrently\n | // with elements of this Interactable. Infinity by default\n | max: Infinity,\n |\n | // max number of drags that can target the same element+Interactable\n | // 1 by default\n | maxPerElement: 2\n | });\n\\*/\nInteractable.prototype.draggable = function (options) {\n if (utils.is.object(options)) {\n this.options.drag.enabled = options.enabled === false? false: true;\n this.setPerAction('drag', options);\n this.setOnEvents('drag', options);\n\n if (/^(xy|x|y|start)$/.test(options.lockAxis)) {\n this.options.drag.lockAxis = options.lockAxis;\n }\n if (/^(xy|x|y)$/.test(options.startAxis)) {\n this.options.drag.startAxis = options.startAxis;\n }\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drag.enabled = options;\n\n if (!options) {\n this.ondragstart = this.ondragstart = this.ondragend = null;\n }\n\n return this;\n }\n\n return this.options.drag;\n};\n\nactions.drag = drag;\nactions.names.push('drag');\nutils.merge(Interactable.eventTypes, [\n 'dragstart',\n 'dragmove',\n 'draginertiastart',\n 'draginertiaresume',\n 'dragend',\n]);\nactions.methodDict.drag = 'draggable';\n\ndefaultOptions.drag = drag.defaults;\n\nmodule.exports = drag;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst scope = require('../scope');\nconst interact = require('../interact');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drop = {\n defaults: {\n enabled: false,\n accept : null,\n overlap: 'pointer',\n },\n};\n\nlet dynamicDrop = false;\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // reset active dropzones\n interaction.activeDrops.dropzones = [];\n interaction.activeDrops.elements = [];\n interaction.activeDrops.rects = [];\n\n interaction.dropEvents = null;\n\n if (!interaction.dynamicDrop) {\n setActiveDrops(interaction, interaction.element);\n }\n\n const dragEvent = interaction.prevEvent;\n const dropEvents = getDropEvents(interaction, event, dragEvent);\n\n if (dropEvents.activate) {\n fireActiveDrops(interaction, dropEvents.activate);\n }\n});\n\nInteractEvent.signals.on('new', function ({ interaction, iEvent, event }) {\n if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { return; }\n\n const draggableElement = interaction.element;\n const dragEvent = iEvent;\n const dropResult = getDrop(dragEvent, event, draggableElement);\n\n interaction.dropTarget = dropResult.dropzone;\n interaction.dropElement = dropResult.element;\n\n interaction.dropEvents = getDropEvents(interaction, event, dragEvent);\n});\n\nInteraction.signals.on('action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n fireDropEvents(interaction, interaction.dropEvents);\n});\n\nInteraction.signals.on('action-end', function ({ interaction }) {\n if (interaction.prepared.name === 'drag') {\n fireDropEvents(interaction, interaction.dropEvents);\n }\n});\n\nInteraction.signals.on('stop-drag', function ({ interaction }) {\n interaction.activeDrops.dropzones =\n interaction.activeDrops.elements =\n interaction.activeDrops.rects =\n interaction.dropEvents = null;\n});\n\nfunction collectDrops (interaction, element) {\n const drops = [];\n const elements = [];\n\n element = element || interaction.element;\n\n // collect all dropzones and their elements which qualify for a drop\n for (const current of scope.interactables) {\n if (!current.options.drop.enabled) { continue; }\n\n const accept = current.options.drop.accept;\n\n // test the draggable element against the dropzone's accept setting\n if ((utils.is.element(accept) && accept !== element)\n || (utils.is.string(accept)\n && !utils.matchesSelector(element, accept))) {\n\n continue;\n }\n\n // query for new elements if necessary\n const dropElements = utils.is.string(current.target)\n ? current._context.querySelectorAll(current.target)\n : [current.target];\n\n for (let i = 0; i < dropElements.length; i++) {\n const currentElement = dropElements[i];\n\n if (currentElement !== element) {\n drops.push(current);\n elements.push(currentElement);\n }\n }\n }\n\n return {\n elements,\n dropzones: drops,\n };\n}\n\nfunction fireActiveDrops (interaction, event) {\n let prevElement;\n\n // loop through all active dropzones and trigger event\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n const current = interaction.activeDrops.dropzones[i];\n const currentElement = interaction.activeDrops.elements [i];\n\n // prevent trigger of duplicate events on same element\n if (currentElement !== prevElement) {\n // set current element as event target\n event.target = currentElement;\n current.fire(event);\n }\n prevElement = currentElement;\n }\n}\n\n// Collect a new set of possible drops and save them in activeDrops.\n// setActiveDrops should always be called when a drag has just started or a\n// drag event happens while dynamicDrop is true\nfunction setActiveDrops (interaction, dragElement) {\n // get dropzones and their elements that could receive the draggable\n const possibleDrops = collectDrops(interaction, dragElement, true);\n\n interaction.activeDrops.dropzones = possibleDrops.dropzones;\n interaction.activeDrops.elements = possibleDrops.elements;\n interaction.activeDrops.rects = [];\n\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n interaction.activeDrops.rects[i] =\n interaction.activeDrops.dropzones[i].getRect(interaction.activeDrops.elements[i]);\n }\n}\n\nfunction getDrop (dragEvent, event, dragElement) {\n const interaction = dragEvent.interaction;\n const validDrops = [];\n\n if (dynamicDrop) {\n setActiveDrops(interaction, dragElement);\n }\n\n // collect all dropzones and their elements which qualify for a drop\n for (let j = 0; j < interaction.activeDrops.dropzones.length; j++) {\n const current = interaction.activeDrops.dropzones[j];\n const currentElement = interaction.activeDrops.elements [j];\n const rect = interaction.activeDrops.rects [j];\n\n validDrops.push(current.dropCheck(dragEvent, event, interaction.target, dragElement, currentElement, rect)\n ? currentElement\n : null);\n }\n\n // get the most appropriate dropzone based on DOM depth and order\n const dropIndex = utils.indexOfDeepestElement(validDrops);\n\n return {\n dropzone: interaction.activeDrops.dropzones[dropIndex] || null,\n element : interaction.activeDrops.elements [dropIndex] || null,\n };\n}\n\nfunction getDropEvents (interaction, pointerEvent, dragEvent) {\n const dropEvents = {\n enter : null,\n leave : null,\n activate : null,\n deactivate: null,\n move : null,\n drop : null,\n };\n\n const tmpl = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n };\n\n if (interaction.dropElement !== interaction.prevDropElement) {\n // if there was a prevDropTarget, create a dragleave event\n if (interaction.prevDropTarget) {\n dropEvents.leave = utils.extend({ type: 'dragleave' }, tmpl);\n\n dragEvent.dragLeave = dropEvents.leave.target = interaction.prevDropElement;\n dragEvent.prevDropzone = dropEvents.leave.dropzone = interaction.prevDropTarget;\n }\n // if the dropTarget is not null, create a dragenter event\n if (interaction.dropTarget) {\n dropEvents.enter = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n type : 'dragenter',\n };\n\n dragEvent.dragEnter = interaction.dropElement;\n dragEvent.dropzone = interaction.dropTarget;\n }\n }\n\n if (dragEvent.type === 'dragend' && interaction.dropTarget) {\n dropEvents.drop = utils.extend({ type: 'drop' }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n dragEvent.relatedTarget = interaction.dropElement;\n }\n if (dragEvent.type === 'dragstart') {\n dropEvents.activate = utils.extend({ type: 'dropactivate' }, tmpl);\n\n dropEvents.activate.target = null;\n dropEvents.activate.dropzone = null;\n }\n if (dragEvent.type === 'dragend') {\n dropEvents.deactivate = utils.extend({ type: 'dropdeactivate' }, tmpl);\n\n dropEvents.deactivate.target = null;\n dropEvents.deactivate.dropzone = null;\n }\n if (dragEvent.type === 'dragmove' && interaction.dropTarget) {\n dropEvents.move = utils.extend({\n dragmove : dragEvent,\n type : 'dropmove',\n }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n }\n\n return dropEvents;\n}\n\nfunction fireDropEvents (interaction, dropEvents) {\n if (dropEvents.leave) { interaction.prevDropTarget.fire(dropEvents.leave); }\n if (dropEvents.move ) { interaction.dropTarget.fire(dropEvents.move ); }\n if (dropEvents.enter) { interaction.dropTarget.fire(dropEvents.enter); }\n if (dropEvents.drop ) { interaction.dropTarget.fire(dropEvents.drop ); }\n if (dropEvents.deactivate) {\n fireActiveDrops(interaction, dropEvents.deactivate);\n }\n\n interaction.prevDropTarget = interaction.dropTarget;\n interaction.prevDropElement = interaction.dropElement;\n}\n\n/*\\\n * Interactable.dropzone\n [ method ]\n *\n * Returns or sets whether elements can be dropped onto this\n * Interactable to trigger drop events\n *\n * Dropzones can receive the following events:\n * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends\n * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone\n * - `dragmove` when a draggable that has entered the dropzone is moved\n * - `drop` when a draggable is dropped into this dropzone\n *\n * Use the `accept` option to allow only elements that match the given CSS\n * selector or element. The value can be:\n *\n * - **an Element** - only that element can be dropped into this dropzone.\n * - **a string**, - the element being dragged must match it as a CSS selector.\n * - **`null`** - accept options is cleared - it accepts any element.\n *\n * Use the `overlap` option to set how drops are checked for. The allowed\n * values are:\n *\n * - `'pointer'`, the pointer must be over the dropzone (default)\n * - `'center'`, the draggable element's center must be over the dropzone\n * - a number from 0-1 which is the `(intersection area) / (draggable area)`.\n * e.g. `0.5` for drop to happen when half of the area of the draggable is\n * over the dropzone\n *\n * Use the `checker` option to specify a function to check if a dragged\n * element is over this Interactable.\n *\n | interact(target)\n | .dropChecker(function(dragEvent, // related dragmove or dragend event\n | event, // TouchEvent/PointerEvent/MouseEvent\n | dropped, // bool result of the default checker\n | dropzone, // dropzone Interactable\n | dropElement, // dropzone elemnt\n | draggable, // draggable Interactable\n | draggableElement) {// draggable element\n |\n | return dropped && event.target.hasAttribute('allow-drop');\n | }\n *\n *\n - options (boolean | object | null) #optional The new value to be set.\n | interact('.drop').dropzone({\n | accept: '.can-drop' || document.getElementById('single-drop'),\n | overlap: 'pointer' || 'center' || zeroToOne\n | }\n = (boolean | object) The current setting or this Interactable\n\\*/\nInteractable.prototype.dropzone = function (options) {\n if (utils.is.object(options)) {\n this.options.drop.enabled = options.enabled === false? false: true;\n\n if (utils.is.function(options.ondrop) ) { this.events.ondrop = options.ondrop ; }\n if (utils.is.function(options.ondropactivate) ) { this.events.ondropactivate = options.ondropactivate ; }\n if (utils.is.function(options.ondropdeactivate)) { this.events.ondropdeactivate = options.ondropdeactivate; }\n if (utils.is.function(options.ondragenter) ) { this.events.ondragenter = options.ondragenter ; }\n if (utils.is.function(options.ondragleave) ) { this.events.ondragleave = options.ondragleave ; }\n if (utils.is.function(options.ondropmove) ) { this.events.ondropmove = options.ondropmove ; }\n\n if (/^(pointer|center)$/.test(options.overlap)) {\n this.options.drop.overlap = options.overlap;\n }\n else if (utils.is.number(options.overlap)) {\n this.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0);\n }\n if ('accept' in options) {\n this.options.drop.accept = options.accept;\n }\n if ('checker' in options) {\n this.options.drop.checker = options.checker;\n }\n\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drop.enabled = options;\n\n if (!options) {\n this.ondragenter = this.ondragleave = this.ondrop\n = this.ondropactivate = this.ondropdeactivate = null;\n }\n\n return this;\n }\n\n return this.options.drop;\n};\n\nInteractable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) {\n let dropped = false;\n\n // if the dropzone has no rect (eg. display: none)\n // call the custom dropChecker or just return false\n if (!(rect = rect || this.getRect(dropElement))) {\n return (this.options.drop.checker\n ? this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement)\n : false);\n }\n\n const dropOverlap = this.options.drop.overlap;\n\n if (dropOverlap === 'pointer') {\n const origin = utils.getOriginXY(draggable, draggableElement, 'drag');\n const page = utils.getPageXY(dragEvent);\n\n page.x += origin.x;\n page.y += origin.y;\n\n const horizontal = (page.x > rect.left) && (page.x < rect.right);\n const vertical = (page.y > rect.top ) && (page.y < rect.bottom);\n\n dropped = horizontal && vertical;\n }\n\n const dragRect = draggable.getRect(draggableElement);\n\n if (dragRect && dropOverlap === 'center') {\n const cx = dragRect.left + dragRect.width / 2;\n const cy = dragRect.top + dragRect.height / 2;\n\n dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom;\n }\n\n if (dragRect && utils.is.number(dropOverlap)) {\n const overlapArea = (Math.max(0, Math.min(rect.right , dragRect.right ) - Math.max(rect.left, dragRect.left))\n * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top , dragRect.top )));\n\n const overlapRatio = overlapArea / (dragRect.width * dragRect.height);\n\n dropped = overlapRatio >= dropOverlap;\n }\n\n if (this.options.drop.checker) {\n dropped = this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement);\n }\n\n return dropped;\n};\n\nInteractable.signals.on('unset', function ({ interactable }) {\n interactable.dropzone(false);\n});\n\nInteractable.settingsMethods.push('dropChecker');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.dropTarget = null; // the dropzone a drag target might be dropped into\n interaction.dropElement = null; // the element at the time of checking\n interaction.prevDropTarget = null; // the dropzone that was recently dragged away from\n interaction.prevDropElement = null; // the element at the time of checking\n interaction.dropEvents = null; // the dropEvents related to the current drag event\n\n interaction.activeDrops = {\n dropzones: [], // the dropzones that are mentioned below\n elements : [], // elements of dropzones that accept the target draggable\n rects : [], // the rects of the elements mentioned above\n };\n\n});\n\nInteraction.signals.on('stop', function ({ interaction }) {\n interaction.dropTarget = interaction.dropElement =\n interaction.prevDropTarget = interaction.prevDropElement = null;\n});\n\n/*\\\n * interact.dynamicDrop\n [ method ]\n *\n * Returns or sets whether the dimensions of dropzone elements are\n * calculated on every dragmove or only on dragstart for the default\n * dropChecker\n *\n - newValue (boolean) #optional True to check on each move. False to check only before start\n = (boolean | interact) The current setting or interact\n\\*/\ninteract.dynamicDrop = function (newValue) {\n if (utils.is.bool(newValue)) {\n //if (dragging && dynamicDrop !== newValue && !newValue) {\n //calcRects(dropzones);\n //}\n\n dynamicDrop = newValue;\n\n return interact;\n }\n return dynamicDrop;\n};\n\nutils.merge(Interactable.eventTypes, [\n 'dragenter',\n 'dragleave',\n 'dropactivate',\n 'dropdeactivate',\n 'dropmove',\n 'drop',\n]);\nactions.methodDict.drop = 'dropzone';\n\ndefaultOptions.drop = drop.defaults;\n\nmodule.exports = drop;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst gesture = {\n defaults: {\n enabled : false,\n origin : null,\n restrict: null,\n },\n\n checker: function (pointer, event, interactable, element, interaction) {\n if (interaction.pointerIds.length >= 2) {\n return { name: 'gesture' };\n }\n\n return null;\n },\n\n getCursor: function () {\n return '';\n },\n};\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturestart') { return; }\n iEvent.ds = 0;\n\n interaction.gesture.startDistance = interaction.gesture.prevDistance = iEvent.distance;\n interaction.gesture.startAngle = interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.scale = 1;\n});\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturemove') { return; }\n\n iEvent.ds = iEvent.scale - interaction.gesture.scale;\n\n interaction.target.fire(iEvent);\n\n interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.prevDistance = iEvent.distance;\n\n if (iEvent.scale !== Infinity\n && iEvent.scale !== null\n && iEvent.scale !== undefined\n && !isNaN(iEvent.scale)) {\n\n interaction.gesture.scale = iEvent.scale;\n }\n});\n\n/*\\\n * Interactable.gesturable\n [ method ]\n *\n * Gets or sets whether multitouch gestures can be performed on the\n * Interactable's element\n *\n = (boolean) Indicates if this can be the target of gesture events\n | var isGestureable = interact(element).gesturable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on gesture events (makes the Interactable gesturable)\n = (object) this Interactable\n | interact(element).gesturable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // limit multiple gestures.\n | // See the explanation in @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n\\*/\nInteractable.prototype.gesturable = function (options) {\n if (utils.is.object(options)) {\n this.options.gesture.enabled = options.enabled === false? false: true;\n this.setPerAction('gesture', options);\n this.setOnEvents('gesture', options);\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.gesture.enabled = options;\n\n if (!options) {\n this.ongesturestart = this.ongesturestart = this.ongestureend = null;\n }\n\n return this;\n }\n\n return this.options.gesture;\n};\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action, event, starting, ending, deltaSource }) {\n if (action !== 'gesture') { return; }\n\n const pointers = interaction.pointers;\n\n iEvent.touches = [pointers[0], pointers[1]];\n\n if (starting) {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = 1;\n iEvent.ds = 0;\n iEvent.angle = utils.touchAngle(pointers, undefined, deltaSource);\n iEvent.da = 0;\n }\n else if (ending || event instanceof InteractEvent) {\n iEvent.distance = interaction.prevEvent.distance;\n iEvent.box = interaction.prevEvent.box;\n iEvent.scale = interaction.prevEvent.scale;\n iEvent.ds = iEvent.scale - 1;\n iEvent.angle = interaction.prevEvent.angle;\n iEvent.da = iEvent.angle - interaction.gesture.startAngle;\n }\n else {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = iEvent.distance / interaction.gesture.startDistance;\n iEvent.angle = utils.touchAngle(pointers, interaction.gesture.prevAngle, deltaSource);\n\n iEvent.ds = iEvent.scale - interaction.gesture.prevScale;\n iEvent.da = iEvent.angle - interaction.gesture.prevAngle;\n }\n});\n\nInteraction.signals.on('new', function (interaction) {\n interaction.gesture = {\n start: { x: 0, y: 0 },\n\n startDistance: 0, // distance between two touches of touchStart\n prevDistance : 0,\n distance : 0,\n\n scale: 1, // gesture.distance / gesture.startDistance\n\n startAngle: 0, // angle of line joining two touches\n prevAngle : 0, // angle of the previous gesture event\n };\n});\n\nactions.gesture = gesture;\nactions.names.push('gesture');\nutils.merge(Interactable.eventTypes, [\n 'gesturestart',\n 'gesturemove',\n 'gestureend',\n]);\nactions.methodDict.gesture = 'gesturable';\n\ndefaultOptions.gesture = gesture.defaults;\n\nmodule.exports = gesture;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\n// Less Precision with touch input\nconst defaultMargin = browser.supportsTouch || browser.supportsPointerEvent? 20: 10;\n\nconst resize = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n square: false,\n preserveAspectRatio: false,\n axis: 'xy',\n\n // use default margin\n margin: NaN,\n\n // object with props left, right, top, bottom which are\n // true/false values to resize when the pointer is over that edge,\n // CSS selectors to match the handles for each direction\n // or the Elements for each handle\n edges: null,\n\n // a value of 'none' will limit the resize rect to a minimum of 0x0\n // 'negate' will alow the rect to have negative width/height\n // 'reposition' will keep the width/height positive by swapping\n // the top and bottom edges and/or swapping the left and right edges\n invert: 'none',\n },\n\n checker: function (pointer, event, interactable, element, interaction, rect) {\n if (!rect) { return null; }\n\n const page = utils.extend({}, interaction.curCoords.page);\n const options = interactable.options;\n\n if (options.resize.enabled) {\n const resizeOptions = options.resize;\n const resizeEdges = { left: false, right: false, top: false, bottom: false };\n\n // if using resize.edges\n if (utils.is.object(resizeOptions.edges)) {\n for (const edge in resizeEdges) {\n resizeEdges[edge] = checkResizeEdge(edge,\n resizeOptions.edges[edge],\n page,\n interaction._eventTarget,\n element,\n rect,\n resizeOptions.margin || defaultMargin);\n }\n\n resizeEdges.left = resizeEdges.left && !resizeEdges.right;\n resizeEdges.top = resizeEdges.top && !resizeEdges.bottom;\n\n if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) {\n return {\n name: 'resize',\n edges: resizeEdges,\n };\n }\n }\n else {\n const right = options.resize.axis !== 'y' && page.x > (rect.right - defaultMargin);\n const bottom = options.resize.axis !== 'x' && page.y > (rect.bottom - defaultMargin);\n\n if (right || bottom) {\n return {\n name: 'resize',\n axes: (right? 'x' : '') + (bottom? 'y' : ''),\n };\n }\n }\n }\n\n return null;\n },\n\n cursors: (browser.isIe9OrOlder ? {\n x : 'e-resize',\n y : 's-resize',\n xy: 'se-resize',\n\n top : 'n-resize',\n left : 'w-resize',\n bottom : 's-resize',\n right : 'e-resize',\n topleft : 'se-resize',\n bottomright: 'se-resize',\n topright : 'ne-resize',\n bottomleft : 'ne-resize',\n } : {\n x : 'ew-resize',\n y : 'ns-resize',\n xy: 'nwse-resize',\n\n top : 'ns-resize',\n left : 'ew-resize',\n bottom : 'ns-resize',\n right : 'ew-resize',\n topleft : 'nwse-resize',\n bottomright: 'nwse-resize',\n topright : 'nesw-resize',\n bottomleft : 'nesw-resize',\n }),\n\n getCursor: function (action) {\n if (action.axis) {\n return resize.cursors[action.name + action.axis];\n }\n else if (action.edges) {\n let cursorKey = '';\n const edgeNames = ['top', 'bottom', 'left', 'right'];\n\n for (let i = 0; i < 4; i++) {\n if (action.edges[edgeNames[i]]) {\n cursorKey += edgeNames[i];\n }\n }\n\n return resize.cursors[cursorKey];\n }\n },\n};\n\n// resizestart\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'resizestart' || !interaction.prepared.edges) {\n return;\n }\n\n const startRect = interaction.target.getRect(interaction.element);\n const resizeOptions = interaction.target.options.resize;\n\n /*\n * When using the `resizable.square` or `resizable.preserveAspectRatio` options, resizing from one edge\n * will affect another. E.g. with `resizable.square`, resizing to make the right edge larger will make\n * the bottom edge larger by the same amount. We call these 'linked' edges. Any linked edges will depend\n * on the active edges and the edge being interacted with.\n */\n if (resizeOptions.square || resizeOptions.preserveAspectRatio) {\n const linkedEdges = utils.extend({}, interaction.prepared.edges);\n\n linkedEdges.top = linkedEdges.top || (linkedEdges.left && !linkedEdges.bottom);\n linkedEdges.left = linkedEdges.left || (linkedEdges.top && !linkedEdges.right );\n linkedEdges.bottom = linkedEdges.bottom || (linkedEdges.right && !linkedEdges.top );\n linkedEdges.right = linkedEdges.right || (linkedEdges.bottom && !linkedEdges.left );\n\n interaction.prepared._linkedEdges = linkedEdges;\n }\n else {\n interaction.prepared._linkedEdges = null;\n }\n\n // if using `resizable.preserveAspectRatio` option, record aspect ratio at the start of the resize\n if (resizeOptions.preserveAspectRatio) {\n interaction.resizeStartAspectRatio = startRect.width / startRect.height;\n }\n\n interaction.resizeRects = {\n start : startRect,\n current : utils.extend({}, startRect),\n inverted : utils.extend({}, startRect),\n previous : utils.extend({}, startRect),\n delta : {\n left: 0, right : 0, width : 0,\n top : 0, bottom: 0, height: 0,\n },\n };\n\n iEvent.rect = interaction.resizeRects.inverted;\n iEvent.deltaRect = interaction.resizeRects.delta;\n});\n\n// resizemove\nInteractEvent.signals.on('new', function ({ iEvent, phase, interaction }) {\n if (phase !== 'move' || !interaction.prepared.edges) { return; }\n\n const resizeOptions = interaction.target.options.resize;\n const invert = resizeOptions.invert;\n const invertible = invert === 'reposition' || invert === 'negate';\n\n let edges = interaction.prepared.edges;\n\n const start = interaction.resizeRects.start;\n const current = interaction.resizeRects.current;\n const inverted = interaction.resizeRects.inverted;\n const delta = interaction.resizeRects.delta;\n const previous = utils.extend(interaction.resizeRects.previous, inverted);\n const originalEdges = edges;\n\n let dx = iEvent.dx;\n let dy = iEvent.dy;\n\n if (resizeOptions.preserveAspectRatio || resizeOptions.square) {\n // `resize.preserveAspectRatio` takes precedence over `resize.square`\n const startAspectRatio = resizeOptions.preserveAspectRatio\n ? interaction.resizeStartAspectRatio\n : 1;\n\n edges = interaction.prepared._linkedEdges;\n\n if ((originalEdges.left && originalEdges.bottom)\n || (originalEdges.right && originalEdges.top)) {\n dy = -dx / startAspectRatio;\n }\n else if (originalEdges.left || originalEdges.right ) { dy = dx / startAspectRatio; }\n else if (originalEdges.top || originalEdges.bottom) { dx = dy * startAspectRatio; }\n }\n\n // update the 'current' rect without modifications\n if (edges.top ) { current.top += dy; }\n if (edges.bottom) { current.bottom += dy; }\n if (edges.left ) { current.left += dx; }\n if (edges.right ) { current.right += dx; }\n\n if (invertible) {\n // if invertible, copy the current rect\n utils.extend(inverted, current);\n\n if (invert === 'reposition') {\n // swap edge values if necessary to keep width/height positive\n let swap;\n\n if (inverted.top > inverted.bottom) {\n swap = inverted.top;\n\n inverted.top = inverted.bottom;\n inverted.bottom = swap;\n }\n if (inverted.left > inverted.right) {\n swap = inverted.left;\n\n inverted.left = inverted.right;\n inverted.right = swap;\n }\n }\n }\n else {\n // if not invertible, restrict to minimum of 0x0 rect\n inverted.top = Math.min(current.top, start.bottom);\n inverted.bottom = Math.max(current.bottom, start.top);\n inverted.left = Math.min(current.left, start.right);\n inverted.right = Math.max(current.right, start.left);\n }\n\n inverted.width = inverted.right - inverted.left;\n inverted.height = inverted.bottom - inverted.top ;\n\n for (const edge in inverted) {\n delta[edge] = inverted[edge] - previous[edge];\n }\n\n iEvent.edges = interaction.prepared.edges;\n iEvent.rect = inverted;\n iEvent.deltaRect = delta;\n});\n\n/*\\\n * Interactable.resizable\n [ method ]\n *\n * Gets or sets whether resize actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of resize elements\n | var isResizeable = interact('input[type=text]').resizable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on resize events (object makes the Interactable resizable)\n = (object) This Interactable\n | interact(element).resizable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | edges: {\n | top : true, // Use pointer coords to check for resize.\n | left : false, // Disable resizing from left edge.\n | bottom: '.resize-s',// Resize if pointer target matches selector\n | right : handleEl // Resize if pointer target is the given Element\n | },\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height are adjusted at a 1:1 ratio.\n | square: false,\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height maintain the aspect ratio they had when resizing started.\n | preserveAspectRatio: false,\n |\n | // a value of 'none' will limit the resize rect to a minimum of 0x0\n | // 'negate' will allow the rect to have negative width/height\n | // 'reposition' will keep the width/height positive by swapping\n | // the top and bottom edges and/or swapping the left and right edges\n | invert: 'none' || 'negate' || 'reposition'\n |\n | // limit multiple resizes.\n | // See the explanation in the @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n \\*/\nInteractable.prototype.resizable = function (options) {\n if (utils.is.object(options)) {\n this.options.resize.enabled = options.enabled === false? false: true;\n this.setPerAction('resize', options);\n this.setOnEvents('resize', options);\n\n if (/^x$|^y$|^xy$/.test(options.axis)) {\n this.options.resize.axis = options.axis;\n }\n else if (options.axis === null) {\n this.options.resize.axis = defaultOptions.resize.axis;\n }\n\n if (utils.is.bool(options.preserveAspectRatio)) {\n this.options.resize.preserveAspectRatio = options.preserveAspectRatio;\n }\n else if (utils.is.bool(options.square)) {\n this.options.resize.square = options.square;\n }\n\n return this;\n }\n if (utils.is.bool(options)) {\n this.options.resize.enabled = options;\n\n if (!options) {\n this.onresizestart = this.onresizestart = this.onresizeend = null;\n }\n\n return this;\n }\n return this.options.resize;\n};\n\nfunction checkResizeEdge (name, value, page, element, interactableElement, rect, margin) {\n // false, '', undefined, null\n if (!value) { return false; }\n\n // true value, use pointer coords and element rect\n if (value === true) {\n // if dimensions are negative, \"switch\" edges\n const width = utils.is.number(rect.width )? rect.width : rect.right - rect.left;\n const height = utils.is.number(rect.height)? rect.height : rect.bottom - rect.top ;\n\n if (width < 0) {\n if (name === 'left' ) { name = 'right'; }\n else if (name === 'right') { name = 'left' ; }\n }\n if (height < 0) {\n if (name === 'top' ) { name = 'bottom'; }\n else if (name === 'bottom') { name = 'top' ; }\n }\n\n if (name === 'left' ) { return page.x < ((width >= 0? rect.left: rect.right ) + margin); }\n if (name === 'top' ) { return page.y < ((height >= 0? rect.top : rect.bottom) + margin); }\n\n if (name === 'right' ) { return page.x > ((width >= 0? rect.right : rect.left) - margin); }\n if (name === 'bottom') { return page.y > ((height >= 0? rect.bottom: rect.top ) - margin); }\n }\n\n // the remaining checks require an element\n if (!utils.is.element(element)) { return false; }\n\n return utils.is.element(value)\n // the value is an element to use as a resize handle\n ? value === element\n // otherwise check if element matches value as selector\n : utils.matchesUpTo(element, value, interactableElement);\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.resizeAxes = 'xy';\n});\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action }) {\n if (action !== 'resize' || !interaction.resizeAxes) { return; }\n\n const options = interaction.target.options;\n\n if (options.resize.square) {\n if (interaction.resizeAxes === 'y') {\n iEvent.dx = iEvent.dy;\n }\n else {\n iEvent.dy = iEvent.dx;\n }\n iEvent.axes = 'xy';\n }\n else {\n iEvent.axes = interaction.resizeAxes;\n\n if (interaction.resizeAxes === 'x') {\n iEvent.dy = 0;\n }\n else if (interaction.resizeAxes === 'y') {\n iEvent.dx = 0;\n }\n }\n});\n\nactions.resize = resize;\nactions.names.push('resize');\nutils.merge(Interactable.eventTypes, [\n 'resizestart',\n 'resizemove',\n 'resizeinertiastart',\n 'resizeinertiaresume',\n 'resizeend',\n]);\nactions.methodDict.resize = 'resizable';\n\ndefaultOptions.resize = resize.defaults;\n\nmodule.exports = resize;\n","const raf = require('./utils/raf');\nconst getWindow = require('./utils/window').getWindow;\nconst is = require('./utils/is');\nconst domUtils = require('./utils/domUtils');\nconst Interaction = require('./Interaction');\nconst defaultOptions = require('./defaultOptions');\n\nconst autoScroll = {\n defaults: {\n enabled : false,\n container: null, // the item that is scrolled (Window or HTMLElement)\n margin : 60,\n speed : 300, // the scroll speed in pixels per second\n },\n\n interaction: null,\n i: null, // the handle returned by window.setInterval\n x: 0, y: 0, // Direction each pulse is to scroll in\n\n isScrolling: false,\n prevTime: 0,\n\n start: function (interaction) {\n autoScroll.isScrolling = true;\n raf.cancel(autoScroll.i);\n\n autoScroll.interaction = interaction;\n autoScroll.prevTime = new Date().getTime();\n autoScroll.i = raf.request(autoScroll.scroll);\n },\n\n stop: function () {\n autoScroll.isScrolling = false;\n raf.cancel(autoScroll.i);\n },\n\n // scroll the window by the values in scroll.x/y\n scroll: function () {\n const options = autoScroll.interaction.target.options[autoScroll.interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(autoScroll.interaction.element);\n const now = new Date().getTime();\n // change in time in seconds\n const dt = (now - autoScroll.prevTime) / 1000;\n // displacement\n const s = options.speed * dt;\n\n if (s >= 1) {\n if (is.window(container)) {\n container.scrollBy(autoScroll.x * s, autoScroll.y * s);\n }\n else if (container) {\n container.scrollLeft += autoScroll.x * s;\n container.scrollTop += autoScroll.y * s;\n }\n\n autoScroll.prevTime = now;\n }\n\n if (autoScroll.isScrolling) {\n raf.cancel(autoScroll.i);\n autoScroll.i = raf.request(autoScroll.scroll);\n }\n },\n check: function (interactable, actionName) {\n const options = interactable.options;\n\n return options[actionName].autoScroll && options[actionName].autoScroll.enabled;\n },\n onInteractionMove: function ({ interaction, pointer }) {\n if (!(interaction.interacting()\n && autoScroll.check(interaction.target, interaction.prepared.name))) {\n return;\n }\n\n if (interaction.simulation) {\n autoScroll.x = autoScroll.y = 0;\n return;\n }\n\n let top;\n let right;\n let bottom;\n let left;\n\n const options = interaction.target.options[interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(interaction.element);\n\n if (is.window(container)) {\n left = pointer.clientX < autoScroll.margin;\n top = pointer.clientY < autoScroll.margin;\n right = pointer.clientX > container.innerWidth - autoScroll.margin;\n bottom = pointer.clientY > container.innerHeight - autoScroll.margin;\n }\n else {\n const rect = domUtils.getElementClientRect(container);\n\n left = pointer.clientX < rect.left + autoScroll.margin;\n top = pointer.clientY < rect.top + autoScroll.margin;\n right = pointer.clientX > rect.right - autoScroll.margin;\n bottom = pointer.clientY > rect.bottom - autoScroll.margin;\n }\n\n autoScroll.x = (right ? 1: left? -1: 0);\n autoScroll.y = (bottom? 1: top? -1: 0);\n\n if (!autoScroll.isScrolling) {\n // set the autoScroll properties to those of the target\n autoScroll.margin = options.margin;\n autoScroll.speed = options.speed;\n\n autoScroll.start(interaction);\n }\n },\n};\n\nInteraction.signals.on('stop-active', function () {\n autoScroll.stop();\n});\n\nInteraction.signals.on('action-move', autoScroll.onInteractionMove);\n\ndefaultOptions.perAction.autoScroll = autoScroll.defaults;\n\nmodule.exports = autoScroll;\n","const Interactable = require('../Interactable');\nconst actions = require('../actions/base');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.ignoreFrom\n [ method ]\n *\n * If the target of the `mousedown`, `pointerdown` or `touchstart`\n * event or any of it's parents match the given CSS selector or\n * Element, no drag/resize/gesture is started.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to not ignore any elements\n = (string | Element | object) The current ignoreFrom value or this Interactable\n **\n | interact(element, { ignoreFrom: document.getElementById('no-action') });\n | // or\n | interact(element).ignoreFrom('input, textarea, a');\n\\*/\nInteractable.prototype.ignoreFrom = function (newValue) {\n return this._backCompatOption('ignoreFrom', newValue);\n};\n\n/*\\\n * Interactable.allowFrom\n [ method ]\n *\n * A drag/resize/gesture is started only If the target of the\n * `mousedown`, `pointerdown` or `touchstart` event or any of it's\n * parents match the given CSS selector or Element.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to allow from any element\n = (string | Element | object) The current allowFrom value or this Interactable\n **\n | interact(element, { allowFrom: document.getElementById('drag-handle') });\n | // or\n | interact(element).allowFrom('.handle');\n\\*/\nInteractable.prototype.allowFrom = function (newValue) {\n return this._backCompatOption('allowFrom', newValue);\n};\n\nInteractable.prototype.testIgnore = function (ignoreFrom, interactableElement, element) {\n if (!ignoreFrom || !is.element(element)) { return false; }\n\n if (is.string(ignoreFrom)) {\n return domUtils.matchesUpTo(element, ignoreFrom, interactableElement);\n }\n else if (is.element(ignoreFrom)) {\n return domUtils.nodeContains(ignoreFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testAllow = function (allowFrom, interactableElement, element) {\n if (!allowFrom) { return true; }\n\n if (!is.element(element)) { return false; }\n\n if (is.string(allowFrom)) {\n return domUtils.matchesUpTo(element, allowFrom, interactableElement);\n }\n else if (is.element(allowFrom)) {\n return domUtils.nodeContains(allowFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testIgnoreAllow = function (options, interactableElement, eventTarget) {\n return (!this.testIgnore(options.ignoreFrom, interactableElement, eventTarget)\n && this.testAllow(options.allowFrom, interactableElement, eventTarget));\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (event.buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\n","const interact = require('../interact');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst actions = require('../actions/base');\nconst defaultOptions = require('../defaultOptions');\nconst browser = require('../utils/browser');\nconst scope = require('../scope');\nconst utils = require('../utils');\nconst signals = require('../utils/Signals').new();\n\nrequire('./InteractableMethods');\n\nconst autoStart = {\n signals,\n withinInteractionLimit,\n // Allow this many interactions to happen simultaneously\n maxInteractions: Infinity,\n defaults: {\n perAction: {\n manualStart: false,\n max: Infinity,\n maxPerElement: 1,\n allowFrom: null,\n ignoreFrom: null,\n },\n },\n setActionDefaults: function (action) {\n utils.extend(action.defaults, autoStart.defaults.perAction);\n },\n};\n\n// set cursor style on mousedown\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget }) {\n if (interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\n// set cursor style on mousemove\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget }) {\n if (!interaction.mouse\n || interaction.pointerIsDown\n || interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\nInteraction.signals.on('move', function (arg) {\n const { interaction, event } = arg;\n\n if (!interaction.pointerIsDown\n || interaction.interacting()\n || !interaction.pointerWasMoved\n || !interaction.prepared.name) {\n return;\n }\n\n signals.fire('before-start', arg);\n\n const target = interaction.target;\n\n if (interaction.prepared.name && target) {\n // check manualStart and interaction limit\n if (target.options[interaction.prepared.name].manualStart\n || !withinInteractionLimit(target, interaction.element, interaction.prepared)) {\n interaction.stop(event);\n }\n else {\n interaction.start(interaction.prepared, target, interaction.element);\n }\n }\n});\n\n// Check if the current target supports the action.\n// If so, return the validated action. Otherwise, return null\nfunction validateAction (action, interactable, element, eventTarget) {\n if (utils.is.object(action)\n && interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget)\n && interactable.options[action.name].enabled\n && withinInteractionLimit(interactable, element, action)) {\n return action;\n }\n\n return null;\n}\n\nfunction validateSelector (interaction, pointer, event, matches, matchElements, eventTarget) {\n for (let i = 0, len = matches.length; i < len; i++) {\n const match = matches[i];\n const matchElement = matchElements[i];\n const action = validateAction(match.getAction(pointer, event, interaction, matchElement),\n match,\n matchElement,\n eventTarget);\n\n if (action) {\n return {\n action,\n target: match,\n element: matchElement,\n };\n }\n }\n\n return {};\n}\n\nfunction getActionInfo (interaction, pointer, event, eventTarget) {\n let matches = [];\n let matchElements = [];\n\n let element = eventTarget;\n let action = null;\n\n function pushMatches (interactable, selector, context) {\n const elements = (browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined);\n\n if (utils.matchesSelector(element, selector, elements)) {\n\n matches.push(interactable);\n matchElements.push(element);\n }\n }\n\n while (utils.is.element(element)) {\n matches = [];\n matchElements = [];\n\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && (action = validateAction(elementInteractable.getAction(pointer, event, interaction, element, eventTarget),\n elementInteractable,\n element,\n eventTarget))\n && !elementInteractable.options[action.name].manualStart) {\n return {\n element,\n action,\n target: elementInteractable,\n };\n }\n else {\n scope.interactables.forEachSelector(pushMatches, element);\n\n const actionInfo = validateSelector(interaction, pointer, event, matches, matchElements, eventTarget);\n\n if (actionInfo.action\n && !actionInfo.target.options[actionInfo.action.name].manualStart) {\n return actionInfo;\n }\n }\n\n element = utils.parentNode(element);\n }\n\n return {};\n}\n\nfunction prepare (interaction, { action, target, element }) {\n action = action || {};\n\n if (interaction.target && interaction.target.options.styleCursor) {\n interaction.target._doc.documentElement.style.cursor = '';\n }\n\n interaction.target = target;\n interaction.element = element;\n utils.copyAction(interaction.prepared, action);\n\n if (target && target.options.styleCursor) {\n const cursor = action? actions[action.name].getCursor(action) : '';\n interaction.target._doc.documentElement.style.cursor = cursor;\n }\n\n signals.fire('prepared', { interaction: interaction });\n}\n\nInteraction.signals.on('stop', function ({ interaction }) {\n const target = interaction.target;\n\n if (target && target.options.styleCursor) {\n target._doc.documentElement.style.cursor = '';\n }\n});\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (utils.is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (utils.is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n const buttons = event.buttons || ({\n 0: 1,\n 1: 4,\n 3: 8,\n 4: 16,\n })[event.button];\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\nfunction withinInteractionLimit (interactable, element, action) {\n const options = interactable.options;\n const maxActions = options[action.name].max;\n const maxPerElement = options[action.name].maxPerElement;\n let activeInteractions = 0;\n let targetCount = 0;\n let targetElementCount = 0;\n\n // no actions if any of these values == 0\n if (!(maxActions && maxPerElement && autoStart.maxInteractions)) { return; }\n\n for (let i = 0, len = scope.interactions.length; i < len; i++) {\n const interaction = scope.interactions[i];\n const otherAction = interaction.prepared.name;\n\n if (!interaction.interacting()) { continue; }\n\n activeInteractions++;\n\n if (activeInteractions >= autoStart.maxInteractions) {\n return false;\n }\n\n if (interaction.target !== interactable) { continue; }\n\n targetCount += (otherAction === action.name)|0;\n\n if (targetCount >= maxActions) {\n return false;\n }\n\n if (interaction.element === element) {\n targetElementCount++;\n\n if (otherAction !== action.name || targetElementCount >= maxPerElement) {\n return false;\n }\n }\n }\n\n return autoStart.maxInteractions > 0;\n}\n\n/*\\\n * interact.maxInteractions\n [ method ]\n **\n * Returns or sets the maximum number of concurrent interactions allowed.\n * By default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables\n * and elements, you need to enable it in the draggable, resizable and\n * gesturable `'max'` and `'maxPerElement'` options.\n **\n - newValue (number) #optional Any number. newValue <= 0 means no interactions.\n\\*/\ninteract.maxInteractions = function (newValue) {\n if (utils.is.number(newValue)) {\n autoStart.maxInteractions = newValue;\n\n return this;\n }\n\n return autoStart.maxInteractions;\n};\n\nInteractable.settingsMethods.push('styleCursor');\nInteractable.settingsMethods.push('actionChecker');\nInteractable.settingsMethods.push('ignoreFrom');\nInteractable.settingsMethods.push('allowFrom');\n\ndefaultOptions.base.actionChecker = null;\ndefaultOptions.base.styleCursor = true;\n\nutils.extend(defaultOptions.perAction, autoStart.defaults.perAction);\n\nmodule.exports = autoStart;\n","const autoStart = require('./base');\nconst Interaction = require('../Interaction');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.delayTimer = null;\n});\n\nautoStart.signals.on('prepared', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.delayTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.target, interaction.element);\n }, delay);\n }\n});\n\nInteraction.signals.on('move', function ({ interaction, duplicate }) {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.delayTimer);\n }\n});\n\n// prevent regular down->move autoStart\nautoStart.signals.on('before-start', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.prepared.name = null;\n }\n});\n","const autoStart = require('./base');\nconst scope = require('../scope');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\n\nconst { matchesSelector, parentNode } = require('../utils/domUtils');\n\nautoStart.setActionDefaults(require('../actions/drag'));\n\nautoStart.signals.on('before-start', function ({ interaction, eventTarget, dx, dy }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // check if a drag is in the correct axis\n const absX = Math.abs(dx);\n const absY = Math.abs(dy);\n const options = interaction.target.options.drag;\n const startAxis = options.startAxis;\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy');\n\n interaction.prepared.axis = options.lockAxis === 'start'\n ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n : options.lockAxis;\n\n // if the movement isn't in the startAxis of the interactable\n if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) {\n // cancel the prepared action\n interaction.prepared.name = null;\n\n // then try to get a drag from another ineractable\n\n if (!interaction.prepared.name) {\n\n let element = eventTarget;\n\n const getDraggable = function (interactable, selector, context) {\n const elements = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n if (interactable === interaction.target) { return; }\n\n if (!options.manualStart\n && !interactable.testIgnoreAllow(options, element, eventTarget)\n && matchesSelector(element, selector, elements)) {\n\n const action = interactable.getAction(interaction.downPointer,\n interaction.downEvent,\n interaction,\n element);\n\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, interactable)\n && autoStart.validateAction(action, interactable, element, eventTarget)) {\n\n return interactable;\n }\n }\n };\n\n let action = null;\n\n // check all interactables\n while (is.element(element)) {\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && elementInteractable !== interaction.target\n && !elementInteractable.options.drag.manualStart) {\n\n action = elementInteractable.getAction(interaction.downPointer, interaction.downEvent, interaction, element);\n }\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, elementInteractable)) {\n\n interaction.prepared.name = 'drag';\n interaction.target = elementInteractable;\n interaction.element = element;\n break;\n }\n\n const selectorInteractable = scope.interactables.forEachSelector(getDraggable, element);\n\n if (selectorInteractable) {\n interaction.prepared.name = 'drag';\n interaction.target = selectorInteractable;\n interaction.element = element;\n break;\n }\n\n element = parentNode(element);\n }\n }\n }\n});\n\nfunction checkStartAxis (startAxis, interactable) {\n if (!interactable) { return false; }\n\n const thisAxis = interactable.options.drag.startAxis;\n\n return (startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis);\n}\n","require('./base').setActionDefaults(require('../actions/gesture'));\n","require('./base').setActionDefaults(require('../actions/resize'));\n","module.exports = {\n base: {\n accept : null,\n preventDefault: 'auto',\n deltaSource : 'page',\n },\n\n perAction: {\n origin: { x: 0, y: 0 },\n\n // only allow left button by default\n // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n mouseButtons: 1,\n\n inertia: {\n enabled : false,\n resistance : 10, // the lambda in exponential decay\n minSpeed : 100, // target speed must be above this for inertia to start\n endSpeed : 10, // the speed at which inertia is slow enough to stop\n allowResume : true, // allow resuming an action in inertia phase\n smoothEndDuration: 300, // animate to snap/restrict endOnly if there's no inertia\n },\n },\n};\n","/* browser entry point */\n\n// Legacy browser support\nrequire('./legacyBrowsers');\n\n// inertia\nrequire('./inertia');\n\n// modifiers\nrequire('./modifiers/snap');\nrequire('./modifiers/restrict');\n\n// pointerEvents\nrequire('./pointerEvents/base');\nrequire('./pointerEvents/holdRepeat');\nrequire('./pointerEvents/interactableTargets');\n\n// delay\nrequire('./autoStart/delay');\n\n// actions\nrequire('./actions/gesture');\nrequire('./actions/resize');\nrequire('./actions/drag');\nrequire('./actions/drop');\n\n// load these modifiers after resize is loaded\nrequire('./modifiers/snapSize');\nrequire('./modifiers/restrictEdges');\nrequire('./modifiers/restrictSize');\n\n// autoStart actions\nrequire('./autoStart/gesture');\nrequire('./autoStart/resize');\nrequire('./autoStart/drag');\n\n// Interactable preventDefault setting\nrequire('./interactablePreventDefault.js');\n\n// autoScroll\nrequire('./autoScroll');\n\n// export interact\nmodule.exports = require('./interact');\n","const InteractEvent = require('./InteractEvent');\nconst Interaction = require('./Interaction');\nconst modifiers = require('./modifiers');\nconst utils = require('./utils');\nconst animationFrame = require('./utils/raf');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.inertiaStatus = {\n active : false,\n smoothEnd : false,\n allowResume: false,\n\n startEvent: null,\n upCoords : {},\n\n xe: 0, ye: 0,\n sx: 0, sy: 0,\n\n t0: 0,\n vx0: 0, vys: 0,\n duration: 0,\n\n lambda_v0: 0,\n one_ve_v0: 0,\n i : null,\n };\n\n interaction.boundInertiaFrame = () => inertiaFrame .apply(interaction);\n interaction.boundSmoothEndFrame = () => smoothEndFrame.apply(interaction);\n});\n\nInteraction.signals.on('down', function ({ interaction, event, pointer, eventTarget }) {\n const status = interaction.inertiaStatus;\n\n // Check if the down event hits the current inertia target\n if (status.active) {\n let element = eventTarget;\n\n // climb up the DOM tree from the event target\n while (utils.is.element(element)) {\n\n // if interaction element is the current inertia target element\n if (element === interaction.element) {\n // stop inertia\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n\n // update pointers to the down event's coordinates\n interaction.updatePointer(pointer);\n utils.setCoords(interaction.curCoords, interaction.pointers);\n\n // fire appropriate signals\n const signalArg = { interaction };\n Interaction.signals.fire('before-action-move', signalArg);\n Interaction.signals.fire('action-resume' , signalArg);\n\n // fire a reume event\n const resumeEvent = new InteractEvent(interaction,\n event,\n interaction.prepared.name,\n 'inertiaresume',\n interaction.element);\n\n interaction.target.fire(resumeEvent);\n interaction.prevEvent = resumeEvent;\n modifiers.resetStatuses(interaction.modifierStatuses);\n\n utils.copyCoords(interaction.prevCoords, interaction.curCoords);\n break;\n }\n\n element = utils.parentNode(element);\n }\n }\n});\n\nInteraction.signals.on('up', function ({ interaction, event }) {\n const status = interaction.inertiaStatus;\n\n if (!interaction.interacting() || status.active) { return; }\n\n const target = interaction.target;\n const options = target && target.options;\n const inertiaOptions = options && interaction.prepared.name && options[interaction.prepared.name].inertia;\n\n const now = new Date().getTime();\n const statuses = {};\n const page = utils.extend({}, interaction.curCoords.page);\n const pointerSpeed = interaction.pointerDelta.client.speed;\n\n let smoothEnd = false;\n let modifierResult;\n\n // check if inertia should be started\n const inertiaPossible = (inertiaOptions && inertiaOptions.enabled\n && interaction.prepared.name !== 'gesture'\n && event !== status.startEvent);\n\n const inertia = (inertiaPossible\n && (now - interaction.curCoords.timeStamp) < 50\n && pointerSpeed > inertiaOptions.minSpeed\n && pointerSpeed > inertiaOptions.endSpeed);\n\n const modifierArg = {\n interaction,\n pageCoords: page,\n statuses,\n preEnd: true,\n requireEndOnly: true,\n };\n\n // smoothEnd\n if (inertiaPossible && !inertia) {\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n if (modifierResult.shouldMove && modifierResult.locked) {\n smoothEnd = true;\n }\n }\n\n if (!(inertia || smoothEnd)) { return; }\n\n utils.copyCoords(status.upCoords, interaction.curCoords);\n\n interaction.pointers[0] = status.startEvent =\n new InteractEvent(interaction, event, interaction.prepared.name, 'inertiastart', interaction.element);\n\n status.t0 = now;\n\n status.active = true;\n status.allowResume = inertiaOptions.allowResume;\n interaction.simulation = status;\n\n target.fire(status.startEvent);\n\n if (inertia) {\n status.vx0 = interaction.pointerDelta.client.vx;\n status.vy0 = interaction.pointerDelta.client.vy;\n status.v0 = pointerSpeed;\n\n calcInertia(interaction, status);\n\n utils.extend(page, interaction.curCoords.page);\n\n page.x += status.xe;\n page.y += status.ye;\n\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n status.modifiedXe += modifierResult.dx;\n status.modifiedYe += modifierResult.dy;\n\n status.i = animationFrame.request(interaction.boundInertiaFrame);\n }\n else {\n status.smoothEnd = true;\n status.xe = modifierResult.dx;\n status.ye = modifierResult.dy;\n\n status.sx = status.sy = 0;\n\n status.i = animationFrame.request(interaction.boundSmoothEndFrame);\n }\n});\n\nInteraction.signals.on('stop-active', function ({ interaction }) {\n const status = interaction.inertiaStatus;\n\n if (status.active) {\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n }\n});\n\nfunction calcInertia (interaction, status) {\n const inertiaOptions = interaction.target.options[interaction.prepared.name].inertia;\n const lambda = inertiaOptions.resistance;\n const inertiaDur = -Math.log(inertiaOptions.endSpeed / status.v0) / lambda;\n\n status.x0 = interaction.prevEvent.pageX;\n status.y0 = interaction.prevEvent.pageY;\n status.t0 = status.startEvent.timeStamp / 1000;\n status.sx = status.sy = 0;\n\n status.modifiedXe = status.xe = (status.vx0 - inertiaDur) / lambda;\n status.modifiedYe = status.ye = (status.vy0 - inertiaDur) / lambda;\n status.te = inertiaDur;\n\n status.lambda_v0 = lambda / status.v0;\n status.one_ve_v0 = 1 - inertiaOptions.endSpeed / status.v0;\n}\n\nfunction inertiaFrame () {\n updateInertiaCoords(this);\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n\n const status = this.inertiaStatus;\n const options = this.target.options[this.prepared.name].inertia;\n const lambda = options.resistance;\n const t = new Date().getTime() / 1000 - status.t0;\n\n if (t < status.te) {\n\n const progress = 1 - (Math.exp(-lambda * t) - status.lambda_v0) / status.one_ve_v0;\n\n if (status.modifiedXe === status.xe && status.modifiedYe === status.ye) {\n status.sx = status.xe * progress;\n status.sy = status.ye * progress;\n }\n else {\n const quadPoint = utils.getQuadraticCurvePoint(0, 0,\n status.xe,\n status.ye,\n status.modifiedXe,\n status.modifiedYe,\n progress);\n\n status.sx = quadPoint.x;\n status.sy = quadPoint.y;\n }\n\n this.doMove();\n\n status.i = animationFrame.request(this.boundInertiaFrame);\n }\n else {\n status.sx = status.modifiedXe;\n status.sy = status.modifiedYe;\n\n this.doMove();\n this.end(status.startEvent);\n status.active = false;\n this.simulation = null;\n }\n\n utils.copyCoords(this.prevCoords, this.curCoords);\n}\n\nfunction smoothEndFrame () {\n updateInertiaCoords(this);\n\n const status = this.inertiaStatus;\n const t = new Date().getTime() - status.t0;\n const duration = this.target.options[this.prepared.name].inertia.smoothEndDuration;\n\n if (t < duration) {\n status.sx = utils.easeOutQuad(t, 0, status.xe, duration);\n status.sy = utils.easeOutQuad(t, 0, status.ye, duration);\n\n this.pointerMove(status.startEvent, status.startEvent);\n\n status.i = animationFrame.request(this.boundSmoothEndFrame);\n }\n else {\n status.sx = status.xe;\n status.sy = status.ye;\n\n this.pointerMove(status.startEvent, status.startEvent);\n this.end(status.startEvent);\n\n status.smoothEnd =\n status.active = false;\n this.simulation = null;\n }\n}\n\nfunction updateInertiaCoords (interaction) {\n const status = interaction.inertiaStatus;\n\n // return if inertia isn't running\n if (!status.active) { return; }\n\n const pageUp = status.upCoords.page;\n const clientUp = status.upCoords.client;\n\n utils.setCoords(interaction.curCoords, [ {\n pageX : pageUp.x + status.sx,\n pageY : pageUp.y + status.sy,\n clientX: clientUp.x + status.sx,\n clientY: clientUp.y + status.sy,\n } ]);\n}\n","const browser = require('./utils/browser');\nconst events = require('./utils/events');\nconst utils = require('./utils');\nconst scope = require('./scope');\nconst Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\n\nconst globalEvents = {};\n\n/*\\\n * interact\n [ method ]\n *\n * The methods of this variable can be used to set elements as\n * interactables and also to change various default settings.\n *\n * Calling it as a function and passing an element or a valid CSS selector\n * string returns an Interactable object which has various methods to\n * configure it.\n *\n - element (Element | string) The HTML or SVG Element to interact with or CSS selector\n = (object) An @Interactable\n *\n > Usage\n | interact('#draggable').draggable(true);\n |\n | var rectables = interact('rect');\n | rectables\n | .gesturable(true)\n | .on('gesturemove', function (event) {\n | // ...\n | });\n\\*/\nfunction interact (element, options) {\n let interactable = scope.interactables.get(element, options);\n\n if (!interactable) {\n interactable = new Interactable(element, options);\n interactable.events.global = globalEvents;\n }\n\n return interactable;\n}\n\n/*\\\n * interact.isSet\n [ method ]\n *\n * Check if an element has been set\n - element (Element) The Element being searched for\n = (boolean) Indicates if the element or CSS selector was previously passed to interact\n\\*/\ninteract.isSet = function (element, options) {\n return scope.interactables.indexOfElement(element, options && options.context) !== -1;\n};\n\n/*\\\n * interact.on\n [ method ]\n *\n * Adds a global listener for an InteractEvent or adds a DOM event to\n * `document`\n *\n - type (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) interact\n\\*/\ninteract.on = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.on(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.on(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n // if it is an InteractEvent type, add listener to globalEvents\n if (utils.contains(Interactable.eventTypes, type)) {\n // if this type of event was never bound\n if (!globalEvents[type]) {\n globalEvents[type] = [listener];\n }\n else {\n globalEvents[type].push(listener);\n }\n }\n // If non InteractEvent type, addEventListener to document\n else {\n events.add(scope.document, type, listener, { options });\n }\n\n return interact;\n};\n\n/*\\\n * interact.off\n [ method ]\n *\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n - type (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) interact\n \\*/\ninteract.off = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.off(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.off(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n if (!utils.contains(Interactable.eventTypes, type)) {\n events.remove(scope.document, type, listener, options);\n }\n else {\n let index;\n\n if (type in globalEvents\n && (index = utils.indexOf(globalEvents[type], listener)) !== -1) {\n globalEvents[type].splice(index, 1);\n }\n }\n\n return interact;\n};\n\n/*\\\n * interact.debug\n [ method ]\n *\n * Returns an object which exposes internal data\n = (object) An object with properties that outline the current state and expose internal functions and variables\n\\*/\ninteract.debug = function () {\n return scope;\n};\n\n// expose the functions used to calculate multi-touch properties\ninteract.getPointerAverage = utils.pointerAverage;\ninteract.getTouchBBox = utils.touchBBox;\ninteract.getTouchDistance = utils.touchDistance;\ninteract.getTouchAngle = utils.touchAngle;\n\ninteract.getElementRect = utils.getElementRect;\ninteract.getElementClientRect = utils.getElementClientRect;\ninteract.matchesSelector = utils.matchesSelector;\ninteract.closest = utils.closest;\n\n/*\\\n * interact.supportsTouch\n [ method ]\n *\n = (boolean) Whether or not the browser supports touch input\n\\*/\ninteract.supportsTouch = function () {\n return browser.supportsTouch;\n};\n\n/*\\\n * interact.supportsPointerEvent\n [ method ]\n *\n = (boolean) Whether or not the browser supports PointerEvents\n\\*/\ninteract.supportsPointerEvent = function () {\n return browser.supportsPointerEvent;\n};\n\n/*\\\n * interact.stop\n [ method ]\n *\n * Cancels all interactions (end events are not fired)\n *\n - event (Event) An event on which to call preventDefault()\n = (object) interact\n\\*/\ninteract.stop = function (event) {\n for (let i = scope.interactions.length - 1; i >= 0; i--) {\n scope.interactions[i].stop(event);\n }\n\n return interact;\n};\n\n/*\\\n * interact.pointerMoveTolerance\n [ method ]\n * Returns or sets the distance the pointer must be moved before an action\n * sequence occurs. This also affects tolerance for tap events.\n *\n - newValue (number) #optional The movement from the start position must be greater than this value\n = (number | Interactable) The current setting or interact\n\\*/\ninteract.pointerMoveTolerance = function (newValue) {\n if (utils.is.number(newValue)) {\n Interaction.pointerMoveTolerance = newValue;\n\n return this;\n }\n\n return Interaction.pointerMoveTolerance;\n};\n\ninteract.addDocument = scope.addDocument;\ninteract.removeDocument = scope.removeDocument;\n\nscope.interact = interact;\n\nmodule.exports = interact;\n","const Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\nconst scope = require('./scope');\nconst is = require('./utils/is');\nconst events = require('./utils/events');\n\nconst { nodeContains, matchesSelector } = require('./utils/domUtils');\n\n/*\\\n * Interactable.preventDefault\n [ method ]\n *\n * Returns or sets whether to prevent the browser's default behaviour\n * in response to pointer events. Can be set to:\n * - `'always'` to always prevent\n * - `'never'` to never prevent\n * - `'auto'` to let interact.js try to determine what would be best\n *\n - newValue (string) #optional `true`, `false` or `'auto'`\n = (string | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.preventDefault = function (newValue) {\n if (/^(always|never|auto)$/.test(newValue)) {\n this.options.preventDefault = newValue;\n return this;\n }\n\n if (is.bool(newValue)) {\n this.options.preventDefault = newValue? 'always' : 'never';\n return this;\n }\n\n return this.options.preventDefault;\n};\n\nInteractable.prototype.checkAndPreventDefault = function (event) {\n const setting = this.options.preventDefault;\n\n if (setting === 'never') { return; }\n\n if (setting === 'always') {\n event.preventDefault();\n return;\n }\n\n // setting === 'auto'\n\n // don't preventDefault if the browser supports passiveEvents\n // CSS touch-action and user-selecct should be used instead\n if (events.supportsOptions) {\n return;\n }\n\n // don't preventDefault of pointerdown events\n if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) {\n return;\n }\n\n // don't preventDefault on editable elements\n if (is.element(event.target)\n && matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) {\n return;\n }\n\n event.preventDefault();\n};\n\nfunction onInteractionEvent ({ interaction, event }) {\n if (interaction.target) {\n interaction.target.checkAndPreventDefault(event);\n }\n}\n\nfor (const eventSignal of ['down', 'move', 'up', 'cancel']) {\n Interaction.signals.on(eventSignal, onInteractionEvent);\n}\n\n// prevent native HTML5 drag on interact.js target elements\nInteraction.docEvents.dragstart = function preventNativeDrag (event) {\n for (const interaction of scope.interactions) {\n\n if (interaction.element\n && (interaction.element === event.target\n || nodeContains(interaction.element, event.target))) {\n\n interaction.target.checkAndPreventDefault(event);\n return;\n }\n }\n};\n","const scope = require('./scope');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst iFinder = require('./utils/interactionFinder');\nconst pointerEvents = require('./pointerEvents/base');\n\nconst { window } = require('./utils/window');\n\nconst toString = Object.prototype.toString;\n\nif (!window.Array.isArray) {\n window.Array.isArray = function (obj) {\n return toString.call(obj) === '[object Array]';\n };\n}\n\nif (!String.prototype.trim) {\n String.prototype.trim = function () {\n return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n };\n}\n\n// http://www.quirksmode.org/dom/events/click.html\n// >Events leading to dblclick\n//\n// IE8 doesn't fire down event before dblclick.\n// This workaround tries to fire a tap and doubletap after dblclick\nfunction onIE8Dblclick (event) {\n const eventTarget = event.target;\n const interaction = iFinder.search(event, event.type, eventTarget);\n\n if (!interaction) { return; }\n\n if (interaction.prevTap\n && event.clientX === interaction.prevTap.clientX\n && event.clientY === interaction.prevTap.clientY\n && eventTarget === interaction.prevTap.target) {\n\n interaction.downTargets[0] = eventTarget;\n interaction.downTimes [0] = new Date().getTime();\n\n pointerEvents.fire({\n interaction,\n event,\n eventTarget,\n pointer: event,\n type: 'tap',\n });\n }\n}\n\nif (browser.isIE8) {\n const selectFix = function (event) {\n for (const interaction of scope.interactions) {\n if (interaction.interacting()) {\n interaction.target.checkAndPreventDefault(event);\n }\n }\n };\n\n const onDocIE8 = function onDocIE8 ({ doc, win }, signalName) {\n const eventMethod = signalName.indexOf('listen') === 0\n ? events.add : events.remove;\n\n // For IE's lack of Event#preventDefault\n eventMethod(doc, 'selectstart', selectFix);\n\n if (pointerEvents) {\n eventMethod(doc, 'dblclick', onIE8Dblclick);\n }\n };\n\n scope.signals.on('add-document' , onDocIE8);\n scope.signals.on('remove-document', onDocIE8);\n}\n\nmodule.exports = null;\n","const InteractEvent = require('../InteractEvent');\nconst Interaction = require('../Interaction');\nconst extend = require('../utils/extend');\n\nconst modifiers = {\n names: [],\n\n setOffsets: function (arg) {\n const { interaction, pageCoords: page } = arg;\n const { target, element, startOffset } = interaction;\n const rect = target.getRect(element);\n\n if (rect) {\n startOffset.left = page.x - rect.left;\n startOffset.top = page.y - rect.top;\n\n startOffset.right = rect.right - page.x;\n startOffset.bottom = rect.bottom - page.y;\n\n if (!('width' in rect)) { rect.width = rect.right - rect.left; }\n if (!('height' in rect)) { rect.height = rect.bottom - rect.top ; }\n }\n else {\n startOffset.left = startOffset.top = startOffset.right = startOffset.bottom = 0;\n }\n\n arg.rect = rect;\n arg.interactable = target;\n arg.element = element;\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n\n arg.options = target.options[interaction.prepared.name][modifierName];\n\n if (!arg.options) {\n continue;\n }\n\n interaction.modifierOffsets[modifierName] = modifiers[modifierName].setOffset(arg);\n }\n },\n\n setAll: function (arg) {\n const { interaction, statuses, preEnd, requireEndOnly } = arg;\n const coords = extend({}, arg.pageCoords);\n const result = {\n dx: 0,\n dy: 0,\n changed: false,\n locked: false,\n shouldMove: true,\n };\n\n for (const modifierName of modifiers.names) {\n const modifier = modifiers[modifierName];\n const options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!shouldDo(options, preEnd, requireEndOnly)) { continue; }\n\n arg.status = arg.status = statuses[modifierName];\n arg.options = options;\n arg.offset = arg.interaction.modifierOffsets[modifierName];\n\n modifier.set(arg);\n\n if (arg.status.locked) {\n coords.x += arg.status.dx;\n coords.y += arg.status.dy;\n\n result.dx += arg.status.dx;\n result.dy += arg.status.dy;\n\n result.locked = true;\n }\n }\n\n // a move should be fired if:\n // - there are no modifiers enabled,\n // - no modifiers are \"locked\" i.e. have changed the pointer's coordinates, or\n // - the locked coords have changed since the last pointer move\n result.shouldMove = !arg.status || !result.locked || arg.status.changed;\n\n return result;\n },\n\n resetStatuses: function (statuses) {\n for (const modifierName of modifiers.names) {\n const status = statuses[modifierName] || {};\n\n status.dx = status.dy = 0;\n status.modifiedX = status.modifiedY = NaN;\n status.locked = false;\n status.changed = true;\n\n statuses[modifierName] = status;\n }\n\n return statuses;\n },\n\n start: function ({ interaction }, signalName) {\n const arg = {\n interaction,\n pageCoords: (signalName === 'action-resume' ?\n interaction.curCoords : interaction.startCoords).page,\n startOffset: interaction.startOffset,\n statuses: interaction.modifierStatuses,\n preEnd: false,\n requireEndOnly: false,\n };\n\n modifiers.setOffsets(arg);\n modifiers.resetStatuses(arg.statuses);\n\n arg.pageCoords = extend({}, interaction.startCoords.page);\n interaction.modifierResult = modifiers.setAll(arg);\n },\n};\n\nInteraction.signals.on('new', function (interaction) {\n interaction.startOffset = { left: 0, right: 0, top: 0, bottom: 0 };\n interaction.modifierOffsets = {};\n interaction.modifierStatuses = modifiers.resetStatuses({});\n interaction.modifierResult = null;\n});\n\nInteraction.signals.on('action-start' , modifiers.start);\nInteraction.signals.on('action-resume', modifiers.start);\n\nInteraction.signals.on('before-action-move', function ({ interaction, preEnd, interactingBeforeMove }) {\n const modifierResult = modifiers.setAll({\n interaction,\n preEnd,\n pageCoords: interaction.curCoords.page,\n statuses: interaction.modifierStatuses,\n requireEndOnly: false,\n });\n\n // don't fire an action move if a modifier would keep the event in the same\n // cordinates as before\n if (!modifierResult.shouldMove && interactingBeforeMove) {\n interaction._dontFireMove = true;\n }\n\n interaction.modifierResult = modifierResult;\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n for (let i = 0; i < modifiers.names.length; i++) {\n const options = interaction.target.options[interaction.prepared.name][modifiers.names[i]];\n\n // if the endOnly option is true for any modifier\n if (shouldDo(options, true, true)) {\n // fire a move event at the modified coordinates\n interaction.doMove({ event, preEnd: true });\n break;\n }\n }\n});\n\nInteractEvent.signals.on('set-xy', function (arg) {\n const { iEvent, interaction } = arg;\n const modifierArg = extend({}, arg);\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n modifierArg.options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!modifierArg.options) {\n continue;\n }\n\n const modifier = modifiers[modifierName];\n\n modifierArg.status = interaction.modifierStatuses[modifierName];\n\n iEvent[modifierName] = modifier.modifyCoords(modifierArg);\n }\n});\n\nfunction shouldDo (options, preEnd, requireEndOnly) {\n return (options && options.enabled\n && (preEnd || !options.endOnly)\n && (!requireEndOnly || options.endOnly));\n}\n\nmodule.exports = modifiers;\n","const modifiers = require('./index');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst restrict = {\n defaults: {\n enabled : false,\n endOnly : false,\n restriction: null,\n elementRect: null,\n },\n\n setOffset: function ({ rect, startOffset, options }) {\n const elementRect = options && options.elementRect;\n const offset = {};\n\n if (rect && elementRect) {\n offset.left = startOffset.left - (rect.width * elementRect.left);\n offset.top = startOffset.top - (rect.height * elementRect.top);\n\n offset.right = startOffset.right - (rect.width * (1 - elementRect.right));\n offset.bottom = startOffset.bottom - (rect.height * (1 - elementRect.bottom));\n }\n else {\n offset.left = offset.top = offset.right = offset.bottom = 0;\n }\n\n return offset;\n },\n\n set: function ({ pageCoords, interaction, status, options }) {\n if (!options) { return status; }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n\n const restriction = getRestrictionRect(options.restriction, interaction, page);\n\n if (!restriction) { return status; }\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n const rect = restriction;\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n const offset = interaction.modifierOffsets.restrict;\n\n // object is assumed to have\n // x, y, width, height or\n // left, top, right, bottom\n if ('x' in restriction && 'y' in restriction) {\n modifiedX = Math.max(Math.min(rect.x + rect.width - offset.right , page.x), rect.x + offset.left);\n modifiedY = Math.max(Math.min(rect.y + rect.height - offset.bottom, page.y), rect.y + offset.top );\n }\n else {\n modifiedX = Math.max(Math.min(rect.right - offset.right , page.x), rect.left + offset.left);\n modifiedY = Math.max(Math.min(rect.bottom - offset.bottom, page.y), rect.top + offset.top );\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const elementRect = options && options.elementRect;\n\n if (options && options.enabled\n && !(phase === 'start' && elementRect && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n getRestrictionRect,\n};\n\nfunction getRestrictionRect (value, interaction, page) {\n if (utils.is.function(value)) {\n return utils.resolveRectLike(value, interaction.target, interaction.element, [page.x, page.y, interaction]);\n } else {\n return utils.resolveRectLike(value, interaction.target, interaction.element);\n }\n}\n\nmodifiers.restrict = restrict;\nmodifiers.names.push('restrict');\n\ndefaultOptions.perAction.restrict = restrict.defaults;\n\nmodule.exports = restrict;\n","// This module adds the options.resize.restrictEdges setting which sets min and\n// max for the top, left, bottom and right edges of the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictEdges: {\n// inner: { top: 200, left: 200, right: 400, bottom: 400 },\n// outer: { top: 0, left: 0, right: 600, bottom: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst { getRestrictionRect } = require('./restrict');\n\nconst noInner = { top: +Infinity, left: +Infinity, bottom: -Infinity, right: -Infinity };\nconst noOuter = { top: -Infinity, left: -Infinity, bottom: +Infinity, right: +Infinity };\n\nconst restrictEdges = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n offset: null,\n },\n\n setOffset: function ({ interaction, startOffset, options }) {\n if (!options) {\n return utils.extend({}, startOffset);\n }\n\n const offset = getRestrictionRect(options.offset, interaction, interaction.startCoords.page);\n\n if (offset) {\n return {\n top: startOffset.top + offset.y,\n left: startOffset.left + offset.x,\n bottom: startOffset.bottom + offset.y,\n right: startOffset.right + offset.x,\n };\n }\n\n return startOffset;\n },\n\n set: function ({ pageCoords, interaction, status, offset, options }) {\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n const inner = rectUtils.xywhToTlbr(getRestrictionRect(options.inner, interaction, page)) || noInner;\n const outer = rectUtils.xywhToTlbr(getRestrictionRect(options.outer, interaction, page)) || noOuter;\n\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n if (edges.top) {\n modifiedY = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top);\n }\n else if (edges.bottom) {\n modifiedY = Math.max(Math.min(outer.bottom - offset.bottom, page.y), inner.bottom - offset.bottom);\n }\n if (edges.left) {\n modifiedX = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left);\n }\n else if (edges.right) {\n modifiedX = Math.max(Math.min(outer.right - offset.right, page.x), inner.right - offset.right);\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n if (options && options.enabled\n && !(phase === 'start' && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n noInner,\n noOuter,\n getRestrictionRect,\n};\n\nmodifiers.restrictEdges = restrictEdges;\nmodifiers.names.push('restrictEdges');\n\ndefaultOptions.perAction.restrictEdges = restrictEdges.defaults;\nresize.defaults.restrictEdges = restrictEdges.defaults;\n\nmodule.exports = restrictEdges;\n","// This module adds the options.resize.restrictSize setting which sets min and\n// max width and height for the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictSize: {\n// min: { width: -600, height: -600 },\n// max: { width: 600, height: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst restrictEdges = require('./restrictEdges');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst noMin = { width: -Infinity, height: -Infinity };\nconst noMax = { width: +Infinity, height: +Infinity };\n\nconst restrictSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n },\n\n setOffset: function ({ interaction }) {\n return interaction.startOffset;\n },\n\n set: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const rect = rectUtils.xywhToTlbr(interaction.resizeRects.inverted);\n\n const minSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.min, interaction)) || noMin;\n const maxSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.max, interaction)) || noMax;\n\n arg.options = {\n enabled: options.enabled,\n endOnly: options.endOnly,\n inner: utils.extend({}, restrictEdges.noInner),\n outer: utils.extend({}, restrictEdges.noOuter),\n };\n\n if (edges.top) {\n arg.options.inner.top = rect.bottom - minSize.height;\n arg.options.outer.top = rect.bottom - maxSize.height;\n }\n else if (edges.bottom) {\n arg.options.inner.bottom = rect.top + minSize.height;\n arg.options.outer.bottom = rect.top + maxSize.height;\n }\n if (edges.left) {\n arg.options.inner.left = rect.right - minSize.width;\n arg.options.outer.left = rect.right - maxSize.width;\n }\n else if (edges.right) {\n arg.options.inner.right = rect.left + minSize.width;\n arg.options.outer.right = rect.left + maxSize.width;\n }\n\n restrictEdges.set(arg);\n },\n\n modifyCoords: restrictEdges.modifyCoords,\n};\n\nmodifiers.restrictSize = restrictSize;\nmodifiers.names.push('restrictSize');\n\ndefaultOptions.perAction.restrictSize = restrictSize.defaults;\nresize.defaults.restrictSize = restrictSize.defaults;\n\nmodule.exports = restrictSize;\n","const modifiers = require('./index');\nconst interact = require('../interact');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst snap = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n\n relativePoints: null,\n },\n\n setOffset: function ({ interaction, interactable, element, rect, startOffset, options }) {\n const offsets = [];\n const optionsOrigin = utils.rectToXY(utils.resolveRectLike(options.origin));\n const origin = optionsOrigin || utils.getOriginXY(interactable, element, interaction.prepared.name);\n options = options || interactable.options[interaction.prepared.name].snap || {};\n\n let snapOffset;\n\n if (options.offset === 'startCoords') {\n snapOffset = {\n x: interaction.startCoords.page.x - origin.x,\n y: interaction.startCoords.page.y - origin.y,\n };\n }\n else {\n const offsetRect = utils.resolveRectLike(options.offset, interactable, element, [interaction]);\n\n snapOffset = utils.rectToXY(offsetRect) || { x: 0, y: 0 };\n }\n\n if (rect && options.relativePoints && options.relativePoints.length) {\n for (const { x: relativeX, y: relativeY } of options.relativePoints) {\n offsets.push({\n x: startOffset.left - (rect.width * relativeX) + snapOffset.x,\n y: startOffset.top - (rect.height * relativeY) + snapOffset.y,\n });\n }\n }\n else {\n offsets.push(snapOffset);\n }\n\n return offsets;\n },\n\n set: function ({ interaction, pageCoords, status, options, offset: offsets }) {\n const targets = [];\n let target;\n let page;\n let i;\n\n if (status.useStatusXY) {\n page = { x: status.x, y: status.y };\n }\n else {\n const origin = utils.getOriginXY(interaction.target, interaction.element, interaction.prepared.name);\n\n page = utils.extend({}, pageCoords);\n\n page.x -= origin.x;\n page.y -= origin.y;\n }\n\n status.realX = page.x;\n status.realY = page.y;\n\n let len = options.targets? options.targets.length : 0;\n\n for (const { x: offsetX, y: offsetY } of offsets) {\n const relativeX = page.x - offsetX;\n const relativeY = page.y - offsetY;\n\n for (const snapTarget of options.targets) {\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n targets.push({\n x: utils.is.number(target.x) ? (target.x + offsetX) : relativeX,\n y: utils.is.number(target.y) ? (target.y + offsetY) : relativeY,\n\n range: utils.is.number(target.range)? target.range: options.range,\n });\n }\n }\n\n const closest = {\n target: null,\n inRange: false,\n distance: 0,\n range: 0,\n dx: 0,\n dy: 0,\n };\n\n for (i = 0, len = targets.length; i < len; i++) {\n target = targets[i];\n\n const range = target.range;\n const dx = target.x - page.x;\n const dy = target.y - page.y;\n const distance = utils.hypot(dx, dy);\n let inRange = distance <= range;\n\n // Infinite targets count as being out of range\n // compared to non infinite ones that are in range\n if (range === Infinity && closest.inRange && closest.range !== Infinity) {\n inRange = false;\n }\n\n if (!closest.target || (inRange\n // is the closest target in range?\n ? (closest.inRange && range !== Infinity\n // the pointer is relatively deeper in this target\n ? distance / range < closest.distance / closest.range\n // this target has Infinite range and the closest doesn't\n : (range === Infinity && closest.range !== Infinity)\n // OR this target is closer that the previous closest\n || distance < closest.distance)\n // The other is not in range and the pointer is closer to this target\n : (!closest.inRange && distance < closest.distance))) {\n\n closest.target = target;\n closest.distance = distance;\n closest.range = range;\n closest.inRange = inRange;\n closest.dx = dx;\n closest.dy = dy;\n\n status.range = range;\n }\n }\n\n let snapChanged;\n\n if (closest.target) {\n snapChanged = (status.modifiedX !== closest.target.x || status.modifiedY !== closest.target.y);\n\n status.modifiedX = closest.target.x;\n status.modifiedY = closest.target.y;\n }\n else {\n snapChanged = true;\n\n status.modifiedX = NaN;\n status.modifiedY = NaN;\n }\n\n status.dx = closest.dx;\n status.dy = closest.dy;\n\n status.changed = (snapChanged || (closest.inRange && !status.locked));\n status.locked = closest.inRange;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const relativePoints = options && options.relativePoints;\n\n if (options && options.enabled\n && !(phase === 'start' && relativePoints && relativePoints.length)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n }\n\n return {\n range : status.range,\n locked : status.locked,\n x : status.modifiedX,\n y : status.modifiedY,\n realX : status.realX,\n realY : status.realY,\n dx : status.dx,\n dy : status.dy,\n };\n }\n },\n};\n\ninteract.createSnapGrid = function (grid) {\n return function (x, y) {\n const limits = grid.limits || {\n left : -Infinity,\n right : Infinity,\n top : -Infinity,\n bottom: Infinity,\n };\n let offsetX = 0;\n let offsetY = 0;\n\n if (utils.is.object(grid.offset)) {\n offsetX = grid.offset.x;\n offsetY = grid.offset.y;\n }\n\n const gridx = Math.round((x - offsetX) / grid.x);\n const gridy = Math.round((y - offsetY) / grid.y);\n\n const newX = Math.max(limits.left, Math.min(limits.right , gridx * grid.x + offsetX));\n const newY = Math.max(limits.top , Math.min(limits.bottom, gridy * grid.y + offsetY));\n\n return {\n x: newX,\n y: newY,\n range: grid.range,\n };\n };\n};\n\nmodifiers.snap = snap;\nmodifiers.names.push('snap');\n\ndefaultOptions.perAction.snap = snap.defaults;\n\nmodule.exports = snap;\n","// This module allows snapping of the size of targets during resize\n// interactions.\n\nconst modifiers = require('./index');\nconst snap = require('./snap');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\nconst utils = require('../utils/');\n\nconst snapSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n },\n\n setOffset: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.edges;\n\n if (!edges) { return; }\n\n arg.options = {\n relativePoints: [{\n x: edges.left? 0 : 1,\n y: edges.top ? 0 : 1,\n }],\n origin: { x: 0, y: 0 },\n offset: 'self',\n range: options.range,\n };\n\n const offsets = snap.setOffset(arg);\n arg.options = options;\n\n return offsets;\n },\n\n set: function (arg) {\n const { interaction, options, offset, pageCoords } = arg;\n const page = utils.extend({}, pageCoords);\n const relativeX = page.x - offset[0].x;\n const relativeY = page.y - offset[0].y;\n\n arg.options = utils.extend({}, options);\n arg.options.targets = [];\n\n for (const snapTarget of options.targets) {\n let target;\n\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n if ('width' in target && 'height' in target) {\n target.x = target.width;\n target.y = target.height;\n }\n\n arg.options.targets.push(target);\n }\n\n snap.set(arg);\n },\n\n modifyCoords: function (arg) {\n const { options } = arg;\n\n arg.options = utils.extend({}, options);\n arg.options.enabled = options.enabled;\n arg.options.relativePoints = [null];\n\n snap.modifyCoords(arg);\n },\n};\n\nmodifiers.snapSize = snapSize;\nmodifiers.names.push('snapSize');\n\ndefaultOptions.perAction.snapSize = snapSize.defaults;\nresize.defaults.snapSize = snapSize.defaults;\n\nmodule.exports = snapSize;\n","const pointerUtils = require('../utils/pointerUtils');\n\nmodule.exports = class PointerEvent {\n constructor (type, pointer, event, eventTarget, interaction) {\n pointerUtils.pointerExtend(this, event);\n\n if (event !== pointer) {\n pointerUtils.pointerExtend(this, pointer);\n }\n\n this.interaction = interaction;\n\n this.timeStamp = new Date().getTime();\n this.originalEvent = event;\n this.type = type;\n this.pointerId = pointerUtils.getPointerId(pointer);\n this.pointerType = pointerUtils.getPointerType(pointer, interaction);\n this.target = eventTarget;\n this.currentTarget = null;\n\n if (type === 'tap') {\n const pointerIndex = interaction.getPointerIndex(pointer);\n this.dt = this.timeStamp - interaction.downTimes[pointerIndex];\n\n const interval = this.timeStamp - interaction.tapTime;\n\n this.double = !!(interaction.prevTap\n && interaction.prevTap.type !== 'doubletap'\n && interaction.prevTap.target === this.target\n && interval < 500);\n }\n else if (type === 'doubletap') {\n this.dt = pointer.timeStamp - interaction.tapTime;\n }\n }\n\n subtractOrigin ({ x: originX, y: originY }) {\n this.pageX -= originX;\n this.pageY -= originY;\n this.clientX -= originX;\n this.clientY -= originY;\n\n return this;\n }\n\n addOrigin ({ x: originX, y: originY }) {\n this.pageX += originX;\n this.pageY += originY;\n this.clientX += originX;\n this.clientY += originY;\n\n return this;\n }\n\n preventDefault () {\n this.originalEvent.preventDefault();\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n};\n","const PointerEvent = require('./PointerEvent');\nconst Interaction = require('../Interaction');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst defaults = require('../defaultOptions');\nconst signals = require('../utils/Signals').new();\nconst { filter } = require('../utils/arr');\n\nconst simpleSignals = [ 'down', 'up', 'cancel' ];\nconst simpleEvents = [ 'down', 'up', 'cancel' ];\n\nconst pointerEvents = {\n PointerEvent,\n fire,\n collectEventTargets,\n signals,\n defaults: {\n holdDuration: 600,\n ignoreFrom : null,\n allowFrom : null,\n origin : { x: 0, y: 0 },\n },\n types: [\n 'down',\n 'move',\n 'up',\n 'cancel',\n 'tap',\n 'doubletap',\n 'hold',\n ],\n};\n\nfunction fire (arg) {\n const {\n interaction, pointer, event, eventTarget,\n type = arg.pointerEvent.type,\n targets = collectEventTargets(arg),\n pointerEvent = new PointerEvent(type, pointer, event, eventTarget, interaction),\n } = arg;\n\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n targets,\n type,\n pointerEvent,\n };\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n\n for (const prop in target.props || {}) {\n pointerEvent[prop] = target.props[prop];\n }\n\n const origin = utils.getOriginXY(target.eventable, target.element);\n\n pointerEvent.subtractOrigin(origin);\n pointerEvent.eventable = target.eventable;\n pointerEvent.currentTarget = target.element;\n\n target.eventable.fire(pointerEvent);\n\n pointerEvent.addOrigin(origin);\n\n if (pointerEvent.immediatePropagationStopped\n || (pointerEvent.propagationStopped\n && (i + 1) < targets.length && targets[i + 1].element !== pointerEvent.currentTarget)) {\n break;\n }\n }\n\n signals.fire('fired', signalArg);\n\n if (type === 'tap') {\n // if pointerEvent should make a double tap, create and fire a doubletap\n // PointerEvent and use that as the prevTap\n const prevTap = pointerEvent.double\n ? fire({\n interaction, pointer, event, eventTarget,\n type: 'doubletap',\n })\n : pointerEvent;\n\n interaction.prevTap = prevTap;\n interaction.tapTime = prevTap.timeStamp;\n }\n\n return pointerEvent;\n}\n\nfunction collectEventTargets ({ interaction, pointer, event, eventTarget, type }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n // do not fire a tap event if the pointer was moved before being lifted\n if (type === 'tap' && (interaction.pointerWasMoved\n // or if the pointerup target is different to the pointerdown target\n || !(interaction.downTargets[pointerIndex] && interaction.downTargets[pointerIndex] === eventTarget))) {\n return [];\n }\n\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n path,\n targets: [],\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (type === 'hold') {\n signalArg.targets = filter(signalArg.targets, target =>\n target.eventable.options.holdDuration === interaction.holdTimers[pointerIndex].duration);\n }\n\n return signalArg.targets;\n}\n\nInteraction.signals.on('update-pointer-down', function ({ interaction, pointerIndex }) {\n interaction.holdTimers[pointerIndex] = { duration: Infinity, timeout: null };\n});\n\nInteraction.signals.on('remove-pointer', function ({ interaction, pointerIndex }) {\n interaction.holdTimers.splice(pointerIndex, 1);\n});\n\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget, duplicateMove }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n if (!duplicateMove && (!interaction.pointerIsDown || interaction.pointerWasMoved)) {\n if (interaction.pointerIsDown) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n\n fire({\n interaction, pointer, event, eventTarget,\n type: 'move',\n });\n }\n});\n\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget, pointerIndex }) {\n // copy event to be used in timeout for IE8\n const eventCopy = browser.isIE8? utils.extend({}, event) : event;\n\n const timer = interaction.holdTimers[pointerIndex];\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'hold',\n targets: [],\n path,\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (!signalArg.targets.length) { return; }\n\n let minDuration = Infinity;\n\n for (let i = 0; i < signalArg.targets.length; i++) {\n const target = signalArg.targets[i];\n const holdDuration = target.eventable.options.holdDuration;\n\n if (holdDuration < minDuration) {\n minDuration = holdDuration;\n }\n }\n\n timer.duration = minDuration;\n timer.timeout = setTimeout(function () {\n fire({\n interaction, eventCopy, eventTarget,\n pointer: browser.isIE8? eventCopy : pointer,\n type: 'hold',\n });\n }, minDuration);\n});\n\nInteraction.signals.on('up', ({ interaction, pointer, event, eventTarget }) => {\n if (!interaction.pointerWasMoved) {\n fire({ interaction, eventTarget, pointer, event, type: 'tap' });\n }\n});\n\n['up', 'cancel'].forEach(function (signalName) {\n Interaction.signals.on(signalName, function ({ interaction, pointerIndex }) {\n if (interaction.holdTimers[pointerIndex]) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n });\n});\n\nfunction createSignalListener (type) {\n return function ({ interaction, pointer, event, eventTarget }) {\n fire({ interaction, eventTarget, pointer, event, type });\n };\n}\n\nfor (let i = 0; i < simpleSignals.length; i++) {\n Interaction.signals.on(simpleSignals[i], createSignalListener(simpleEvents[i]));\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.prevTap = null; // the most recent tap event on this interaction\n interaction.tapTime = 0; // time of the most recent tap event\n interaction.holdTimers = []; // [{ duration, timeout }]\n});\n\ndefaults.pointerEvents = pointerEvents.defaults;\nmodule.exports = pointerEvents;\n","const pointerEvents = require('./base');\nconst Interaction = require('../Interaction');\n\npointerEvents.signals.on('new', onNew);\npointerEvents.signals.on('fired', onFired);\n\nfor (const signal of ['move', 'up', 'cancel', 'endall']) {\n Interaction.signals.on(signal, endHoldRepeat);\n}\n\nfunction onNew ({ pointerEvent }) {\n if (pointerEvent.type !== 'hold') { return; }\n\n pointerEvent.count = (pointerEvent.count || 0) + 1;\n}\n\nfunction onFired ({ interaction, pointerEvent, eventTarget, targets }) {\n if (pointerEvent.type !== 'hold' || !targets.length) { return; }\n\n // get the repeat interval from the first eventable\n const interval = targets[0].eventable.options.holdRepeatInterval;\n\n // don't repeat if the interval is 0 or less\n if (interval <= 0) { return; }\n\n // set a timeout to fire the holdrepeat event\n interaction.holdIntervalHandle = setTimeout(function () {\n pointerEvents.fire({\n interaction,\n eventTarget,\n type: 'hold',\n pointer: pointerEvent,\n event: pointerEvent,\n });\n }, interval);\n}\n\nfunction endHoldRepeat ({ interaction }) {\n // set the interaction's holdStopTime property\n // to stop further holdRepeat events\n if (interaction.holdIntervalHandle) {\n clearInterval(interaction.holdIntervalHandle);\n interaction.holdIntervalHandle = null;\n }\n}\n\n// don't repeat by default\npointerEvents.defaults.holdRepeatInterval = 0;\npointerEvents.types.push('holdrepeat');\n\nmodule.exports = {\n onNew,\n onFired,\n endHoldRepeat,\n};\n","const pointerEvents = require('./base');\nconst Interactable = require('../Interactable');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\nconst scope = require('../scope');\nconst extend = require('../utils/extend');\nconst { merge } = require('../utils/arr');\n\npointerEvents.signals.on('collect-targets', function ({ targets, element, type, eventTarget }) {\n function collectSelectors (interactable, selector, context) {\n const els = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && is.element(element)\n && domUtils.matchesSelector(element, selector, els)\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n const interactable = scope.interactables.get(element);\n\n if (interactable) {\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n scope.interactables.forEachSelector(collectSelectors, element);\n});\n\nInteractable.signals.on('new', function ({ interactable }) {\n interactable.events.getRect = function (element) {\n return interactable.getRect(element);\n };\n});\n\nInteractable.signals.on('set', function ({ interactable, options }) {\n extend(interactable.events.options, pointerEvents.defaults);\n extend(interactable.events.options, options);\n});\n\nmerge(Interactable.eventTypes, pointerEvents.types);\n\nInteractable.prototype.pointerEvents = function (options) {\n extend(this.events.options, options);\n\n return this;\n};\n\nconst __backCompatOption = Interactable.prototype._backCompatOption;\n\nInteractable.prototype._backCompatOption = function (optionName, newValue) {\n const ret = __backCompatOption.call(this, optionName, newValue);\n\n if (ret === this) {\n this.events.options[optionName] = newValue;\n }\n\n return ret;\n};\n\nInteractable.settingsMethods.push('pointerEvents');\n","const utils = require('./utils');\nconst events = require('./utils/events');\nconst signals = require('./utils/Signals').new();\n\nconst scope = {\n signals,\n events,\n utils,\n\n // main document\n document: require('./utils/domObjects').document,\n // all documents being listened to\n documents: [],\n\n addDocument: function (doc, win) {\n // do nothing if document is already known\n if (utils.contains(scope.documents, doc)) { return false; }\n\n win = win || scope.getWindow(doc);\n\n scope.documents.push(doc);\n events.documents.push(doc);\n\n // don't add an unload event for the main document\n // so that the page may be cached in browser history\n if (doc !== scope.document) {\n events.add(win, 'unload', scope.onWindowUnload);\n }\n\n signals.fire('add-document', { doc, win });\n },\n\n removeDocument: function (doc, win) {\n const index = utils.indexOf(scope.documents, doc);\n\n win = win || scope.getWindow(doc);\n\n events.remove(win, 'unload', scope.onWindowUnload);\n\n scope.documents.splice(index, 1);\n events.documents.splice(index, 1);\n\n signals.fire('remove-document', { win, doc });\n },\n\n onWindowUnload: function () {\n scope.removeDocument(this.document, this);\n },\n};\n\nmodule.exports = scope;\n","const { indexOf } = require('./arr');\n\nclass Signals {\n constructor () {\n this.listeners = {\n // signalName: [listeners],\n };\n }\n\n on (name, listener) {\n if (!this.listeners[name]) {\n this.listeners[name] = [listener];\n return;\n }\n\n this.listeners[name].push(listener);\n }\n\n off (name, listener) {\n if (!this.listeners[name]) { return; }\n\n const index = indexOf(this.listeners[name], listener);\n\n if (index !== -1) {\n this.listeners[name].splice(index, 1);\n }\n }\n\n fire (name, arg) {\n const targetListeners = this.listeners[name];\n\n if (!targetListeners) { return; }\n\n for (let i = 0; i < targetListeners.length; i++) {\n if (targetListeners[i](arg, name) === false) {\n return;\n }\n }\n }\n}\n\nSignals.new = function () {\n return new Signals();\n};\n\nmodule.exports = Signals;\n","function indexOf (array, target) {\n for (let i = 0, len = array.length; i < len; i++) {\n if (array[i] === target) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction contains (array, target) {\n return indexOf(array, target) !== -1;\n}\n\nfunction merge (target, source) {\n for (let i = 0; i < source.length; i++) {\n target.push(source[i]);\n }\n\n return target;\n}\n\nfunction filter (array, test) {\n const result = [];\n\n for (let i = 0; i < array.length; i++) {\n if (test(array[i])) {\n result.push(array[i]);\n }\n }\n\n return result;\n}\n\nmodule.exports = {\n indexOf,\n contains,\n merge,\n filter,\n};\n","const { window } = require('./window');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst Element = domObjects.Element;\nconst navigator = window.navigator;\n\nconst browser = {\n // Does the browser support touch input?\n supportsTouch: !!(('ontouchstart' in window) || is.function(window.DocumentTouch)\n && domObjects.document instanceof window.DocumentTouch),\n\n // Does the browser support PointerEvents\n supportsPointerEvent: !!domObjects.PointerEvent,\n\n isIE8: ('attachEvent' in window) && !('addEventListener' in window),\n\n // Opera Mobile must be handled differently\n isOperaMobile: (navigator.appName === 'Opera'\n && browser.supportsTouch\n && navigator.userAgent.match('Presto')),\n\n // scrolling doesn't change the result of getClientRects on iOS 7\n isIOS7: (/iP(hone|od|ad)/.test(navigator.platform)\n && /OS 7[^\\d]/.test(navigator.appVersion)),\n\n isIe9OrOlder: /MSIE (8|9)/.test(navigator.userAgent),\n\n // prefix matchesSelector\n prefixedMatchesSelector: 'matches' in Element.prototype\n ? 'matches': 'webkitMatchesSelector' in Element.prototype\n ? 'webkitMatchesSelector': 'mozMatchesSelector' in Element.prototype\n ? 'mozMatchesSelector': 'oMatchesSelector' in Element.prototype\n ? 'oMatchesSelector': 'msMatchesSelector',\n\n useMatchesSelectorPolyfill: false,\n\n pEventTypes: (domObjects.PointerEvent\n ? (domObjects.PointerEvent === window.MSPointerEvent\n ? {\n up: 'MSPointerUp',\n down: 'MSPointerDown',\n over: 'mouseover',\n out: 'mouseout',\n move: 'MSPointerMove',\n cancel: 'MSPointerCancel',\n }\n : {\n up: 'pointerup',\n down: 'pointerdown',\n over: 'pointerover',\n out: 'pointerout',\n move: 'pointermove',\n cancel: 'pointercancel',\n })\n : null),\n\n // because Webkit and Opera still use 'mousewheel' event type\n wheelEvent: 'onmousewheel' in domObjects.document? 'mousewheel': 'wheel',\n\n};\n\nbrowser.useMatchesSelectorPolyfill = !is.function(Element.prototype[browser.prefixedMatchesSelector]);\n\nmodule.exports = browser;\n","const domObjects = {};\nconst win = require('./window').window;\n\nfunction blank () {}\n\ndomObjects.document = win.document;\ndomObjects.DocumentFragment = win.DocumentFragment || blank;\ndomObjects.SVGElement = win.SVGElement || blank;\ndomObjects.SVGSVGElement = win.SVGSVGElement || blank;\ndomObjects.SVGElementInstance = win.SVGElementInstance || blank;\ndomObjects.Element = win.Element || blank;\ndomObjects.HTMLElement = win.HTMLElement || domObjects.Element;\n\ndomObjects.Event = win.Event;\ndomObjects.Touch = win.Touch || blank;\ndomObjects.PointerEvent = (win.PointerEvent || win.MSPointerEvent);\n\nmodule.exports = domObjects;\n","const win = require('./window');\nconst browser = require('./browser');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst domUtils = {\n nodeContains: function (parent, child) {\n while (child) {\n if (child === parent) {\n return true;\n }\n\n child = child.parentNode;\n }\n\n return false;\n },\n\n closest: function (element, selector) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) { return element; }\n\n element = domUtils.parentNode(element);\n }\n\n return null;\n },\n\n parentNode: function (node) {\n let parent = node.parentNode;\n\n if (is.docFrag(parent)) {\n // skip past #shado-root fragments\n while ((parent = parent.host) && is.docFrag(parent)) {\n continue;\n }\n\n return parent;\n }\n\n return parent;\n },\n\n // taken from http://tanalin.com/en/blog/2012/12/matches-selector-ie8/ and modified\n matchesSelectorPolyfill: browser.useMatchesSelectorPolyfill\n ? function (element, selector, elems) {\n elems = elems || element.parentNode.querySelectorAll(selector);\n\n for (let i = 0, len = elems.length; i < len; i++) {\n if (elems[i] === element) {\n return true;\n }\n }\n\n return false;\n }\n : null,\n\n matchesSelector: function (element, selector, nodeList) {\n if (browser.useMatchesSelectorPolyfill) {\n return domUtils.matchesSelectorPolyfill(element, selector, nodeList);\n }\n\n // remove /deep/ from selectors if shadowDOM polyfill is used\n if (win.window !== win.realWindow) {\n selector = selector.replace(/\\/deep\\//g, ' ');\n }\n\n return element[browser.prefixedMatchesSelector](selector);\n },\n\n // Test for the element that's \"above\" all other qualifiers\n indexOfDeepestElement: function (elements) {\n let deepestZoneParents = [];\n let dropzoneParents = [];\n let dropzone;\n let deepestZone = elements[0];\n let index = deepestZone? 0: -1;\n let parent;\n let child;\n let i;\n let n;\n\n for (i = 1; i < elements.length; i++) {\n dropzone = elements[i];\n\n // an element might belong to multiple selector dropzones\n if (!dropzone || dropzone === deepestZone) {\n continue;\n }\n\n if (!deepestZone) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n // check if the deepest or current are document.documentElement or document.rootElement\n // - if the current dropzone is, do nothing and continue\n if (dropzone.parentNode === dropzone.ownerDocument) {\n continue;\n }\n // - if deepest is, update with the current dropzone and continue to next\n else if (deepestZone.parentNode === dropzone.ownerDocument) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n if (!deepestZoneParents.length) {\n parent = deepestZone;\n while (parent.parentNode && parent.parentNode !== parent.ownerDocument) {\n deepestZoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n }\n\n // if this element is an svg element and the current deepest is\n // an HTMLElement\n if (deepestZone instanceof domObjects.HTMLElement\n && dropzone instanceof domObjects.SVGElement\n && !(dropzone instanceof domObjects.SVGSVGElement)) {\n\n if (dropzone === deepestZone.parentNode) {\n continue;\n }\n\n parent = dropzone.ownerSVGElement;\n }\n else {\n parent = dropzone;\n }\n\n dropzoneParents = [];\n\n while (parent.parentNode !== parent.ownerDocument) {\n dropzoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n\n n = 0;\n\n // get (position of last common ancestor) + 1\n while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) {\n n++;\n }\n\n const parents = [\n dropzoneParents[n - 1],\n dropzoneParents[n],\n deepestZoneParents[n],\n ];\n\n child = parents[0].lastChild;\n\n while (child) {\n if (child === parents[1]) {\n deepestZone = dropzone;\n index = i;\n deepestZoneParents = [];\n\n break;\n }\n else if (child === parents[2]) {\n break;\n }\n\n child = child.previousSibling;\n }\n }\n\n return index;\n },\n\n matchesUpTo: function (element, selector, limit) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) {\n return true;\n }\n\n element = domUtils.parentNode(element);\n\n if (element === limit) {\n return domUtils.matchesSelector(element, selector);\n }\n }\n\n return false;\n },\n\n getActualElement: function (element) {\n return (element instanceof domObjects.SVGElementInstance\n ? element.correspondingUseElement\n : element);\n },\n\n getScrollXY: function (relevantWindow) {\n relevantWindow = relevantWindow || win.window;\n return {\n x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft,\n y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop,\n };\n },\n\n getElementClientRect: function (element) {\n const clientRect = (element instanceof domObjects.SVGElement\n ? element.getBoundingClientRect()\n : element.getClientRects()[0]);\n\n return clientRect && {\n left : clientRect.left,\n right : clientRect.right,\n top : clientRect.top,\n bottom: clientRect.bottom,\n width : clientRect.width || clientRect.right - clientRect.left,\n height: clientRect.height || clientRect.bottom - clientRect.top,\n };\n },\n\n getElementRect: function (element) {\n const clientRect = domUtils.getElementClientRect(element);\n\n if (!browser.isIOS7 && clientRect) {\n const scroll = domUtils.getScrollXY(win.getWindow(element));\n\n clientRect.left += scroll.x;\n clientRect.right += scroll.x;\n clientRect.top += scroll.y;\n clientRect.bottom += scroll.y;\n }\n\n return clientRect;\n },\n\n getPath: function (element) {\n const path = [];\n\n while (element) {\n path.push(element);\n element = domUtils.parentNode(element);\n }\n\n return path;\n },\n\n trySelector: value => {\n if (!is.string(value)) { return false; }\n\n // an exception will be raised if it is invalid\n domObjects.document.querySelector(value);\n return true;\n },\n};\n\nmodule.exports = domUtils;\n","const is = require('./is');\nconst domUtils = require('./domUtils');\nconst pExtend = require('./pointerExtend');\n\nconst { window, getWindow } = require('./window');\nconst { indexOf, contains } = require('./arr');\n\nconst useAttachEvent = ('attachEvent' in window) && !('addEventListener' in window);\nconst addEvent = useAttachEvent? 'attachEvent': 'addEventListener';\nconst removeEvent = useAttachEvent? 'detachEvent': 'removeEventListener';\nconst on = useAttachEvent? 'on': '';\n\nconst elements = [];\nconst targets = [];\nconst attachedListeners = [];\n\n// {\n// type: {\n// selectors: ['selector', ...],\n// contexts : [document, ...],\n// listeners: [[listener, capture, passive], ...]\n// }\n// }\nconst delegatedEvents = {};\n\nconst documents = [];\n\nconst supportsOptions = !useAttachEvent && (() => {\n let supported = false;\n\n window.document.createElement('div').addEventListener('test', null, {\n get capture () { supported = true; },\n });\n\n return supported;\n})();\n\nfunction add (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n let elementIndex = indexOf(elements, element);\n let target = targets[elementIndex];\n\n if (!target) {\n target = {\n events: {},\n typeCount: 0,\n };\n\n elementIndex = elements.push(element) - 1;\n targets.push(target);\n\n attachedListeners.push(useAttachEvent\n ? {\n supplied: [],\n wrapped : [],\n useCount: [],\n }\n : null);\n }\n\n if (!target.events[type]) {\n target.events[type] = [];\n target.typeCount++;\n }\n\n if (!contains(target.events[type], listener)) {\n let ret;\n\n if (useAttachEvent) {\n const { supplied, wrapped, useCount } = attachedListeners[elementIndex];\n const listenerIndex = indexOf(supplied, listener);\n\n const wrappedListener = wrapped[listenerIndex] || function (event) {\n if (!event.immediatePropagationStopped) {\n event.target = event.srcElement;\n event.currentTarget = element;\n\n event.preventDefault = event.preventDefault || preventDef;\n event.stopPropagation = event.stopPropagation || stopProp;\n event.stopImmediatePropagation = event.stopImmediatePropagation || stopImmProp;\n\n if (/mouse|click/.test(event.type)) {\n event.pageX = event.clientX + getWindow(element).document.documentElement.scrollLeft;\n event.pageY = event.clientY + getWindow(element).document.documentElement.scrollTop;\n }\n\n listener(event);\n }\n };\n\n ret = element[addEvent](on + type, wrappedListener, !!options.capture);\n\n if (listenerIndex === -1) {\n supplied.push(listener);\n wrapped.push(wrappedListener);\n useCount.push(1);\n }\n else {\n useCount[listenerIndex]++;\n }\n }\n else {\n ret = element[addEvent](type, listener, supportsOptions? options : !!options.capture);\n }\n target.events[type].push(listener);\n\n return ret;\n }\n}\n\nfunction remove (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const elementIndex = indexOf(elements, element);\n const target = targets[elementIndex];\n\n if (!target || !target.events) {\n return;\n }\n\n let wrappedListener = listener;\n let listeners;\n let listenerIndex;\n\n if (useAttachEvent) {\n listeners = attachedListeners[elementIndex];\n listenerIndex = indexOf(listeners.supplied, listener);\n wrappedListener = listeners.wrapped[listenerIndex];\n }\n\n if (type === 'all') {\n for (type in target.events) {\n if (target.events.hasOwnProperty(type)) {\n remove(element, type, 'all');\n }\n }\n return;\n }\n\n if (target.events[type]) {\n const len = target.events[type].length;\n\n if (listener === 'all') {\n for (let i = 0; i < len; i++) {\n remove(element, type, target.events[type][i], options);\n }\n return;\n }\n else {\n for (let i = 0; i < len; i++) {\n if (target.events[type][i] === listener) {\n element[removeEvent](on + type, wrappedListener, supportsOptions? options : !!options.capture);\n target.events[type].splice(i, 1);\n\n if (useAttachEvent && listeners) {\n listeners.useCount[listenerIndex]--;\n if (listeners.useCount[listenerIndex] === 0) {\n listeners.supplied.splice(listenerIndex, 1);\n listeners.wrapped.splice(listenerIndex, 1);\n listeners.useCount.splice(listenerIndex, 1);\n }\n }\n\n break;\n }\n }\n }\n\n if (target.events[type] && target.events[type].length === 0) {\n target.events[type] = null;\n target.typeCount--;\n }\n }\n\n if (!target.typeCount) {\n targets.splice(elementIndex, 1);\n elements.splice(elementIndex, 1);\n attachedListeners.splice(elementIndex, 1);\n }\n}\n\nfunction addDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n if (!delegatedEvents[type]) {\n delegatedEvents[type] = {\n selectors: [],\n contexts : [],\n listeners: [],\n };\n\n // add delegate listener functions\n for (let i = 0; i < documents.length; i++) {\n add(documents[i], type, delegateListener);\n add(documents[i], type, delegateUseCapture, true);\n }\n }\n\n const delegated = delegatedEvents[type];\n let index;\n\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n break;\n }\n }\n\n if (index === -1) {\n index = delegated.selectors.length;\n\n delegated.selectors.push(selector);\n delegated.contexts .push(context);\n delegated.listeners.push([]);\n }\n\n // keep listener and capture and passive flags\n delegated.listeners[index].push([listener, !!options.capture, options.passive]);\n}\n\nfunction removeDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const delegated = delegatedEvents[type];\n let matchFound = false;\n let index;\n\n if (!delegated) { return; }\n\n // count from last index of delegated to 0\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n // look for matching selector and context Node\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n\n const listeners = delegated.listeners[index];\n\n // each item of the listeners array is an array: [function, capture, passive]\n for (let i = listeners.length - 1; i >= 0; i--) {\n const [fn, capture, passive] = listeners[i];\n\n // check if the listener functions and capture and passive flags match\n if (fn === listener && capture === !!options.capture && passive === options.passive) {\n // remove the listener from the array of listeners\n listeners.splice(i, 1);\n\n // if all listeners for this interactable have been removed\n // remove the interactable from the delegated arrays\n if (!listeners.length) {\n delegated.selectors.splice(index, 1);\n delegated.contexts .splice(index, 1);\n delegated.listeners.splice(index, 1);\n\n // remove delegate function from context\n remove(context, type, delegateListener);\n remove(context, type, delegateUseCapture, true);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegatedEvents[type] = null;\n }\n }\n\n // only remove one listener\n matchFound = true;\n break;\n }\n }\n\n if (matchFound) { break; }\n }\n }\n}\n\n// bound to the interactable context when a DOM event\n// listener is added to a selector interactable\nfunction delegateListener (event, optionalArg) {\n const options = getOptions(optionalArg);\n const fakeEvent = {};\n const delegated = delegatedEvents[event.type];\n const eventTarget = (domUtils.getActualElement(event.path\n ? event.path[0]\n : event.target));\n let element = eventTarget;\n\n // duplicate the event so that currentTarget can be changed\n pExtend(fakeEvent, event);\n\n fakeEvent.originalEvent = event;\n fakeEvent.preventDefault = preventOriginalDefault;\n\n // climb up document tree looking for selector matches\n while (is.element(element)) {\n for (let i = 0; i < delegated.selectors.length; i++) {\n const selector = delegated.selectors[i];\n const context = delegated.contexts[i];\n\n if (domUtils.matchesSelector(element, selector)\n && domUtils.nodeContains(context, eventTarget)\n && domUtils.nodeContains(context, element)) {\n\n const listeners = delegated.listeners[i];\n\n fakeEvent.currentTarget = element;\n\n for (let j = 0; j < listeners.length; j++) {\n const [fn, capture, passive] = listeners[j];\n\n if (capture === !!options.capture && passive === options.passive) {\n fn(fakeEvent);\n }\n }\n }\n }\n\n element = domUtils.parentNode(element);\n }\n}\n\nfunction delegateUseCapture (event) {\n return delegateListener.call(this, event, true);\n}\n\nfunction preventDef () {\n this.returnValue = false;\n}\n\nfunction preventOriginalDefault () {\n this.originalEvent.preventDefault();\n}\n\nfunction stopProp () {\n this.cancelBubble = true;\n}\n\nfunction stopImmProp () {\n this.cancelBubble = true;\n this.immediatePropagationStopped = true;\n}\n\nfunction getOptions (param) {\n return is.object(param)? param : { capture: param };\n}\n\nmodule.exports = {\n add,\n remove,\n\n addDelegate,\n removeDelegate,\n\n delegateListener,\n delegateUseCapture,\n delegatedEvents,\n documents,\n\n useAttachEvent,\n supportsOptions,\n\n _elements: elements,\n _targets: targets,\n _attachedListeners: attachedListeners,\n};\n","module.exports = function extend (dest, source) {\n for (const prop in source) {\n dest[prop] = source[prop];\n }\n return dest;\n};\n","const {\n resolveRectLike,\n rectToXY,\n} = require('./rect');\n\nmodule.exports = function (target, element, action) {\n const actionOptions = target.options[action];\n const actionOrigin = actionOptions && actionOptions.origin;\n const origin = actionOrigin || target.options.origin;\n\n const originRect = resolveRectLike(origin, target, element, [target && element]);\n\n return rectToXY(originRect) || { x: 0, y: 0 };\n};\n","module.exports = (x, y) => Math.sqrt(x * x + y * y);\n","const extend = require('./extend');\nconst win = require('./window');\n\nconst utils = {\n warnOnce: function (method, message) {\n let warned = false;\n\n return function () {\n if (!warned) {\n win.window.console.warn(message);\n warned = true;\n }\n\n return method.apply(this, arguments);\n };\n },\n\n // http://stackoverflow.com/a/5634528/2280888\n _getQBezierValue: function (t, p1, p2, p3) {\n const iT = 1 - t;\n return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3;\n },\n\n getQuadraticCurvePoint: function (startX, startY, cpX, cpY, endX, endY, position) {\n return {\n x: utils._getQBezierValue(position, startX, cpX, endX),\n y: utils._getQBezierValue(position, startY, cpY, endY),\n };\n },\n\n // http://gizma.com/easing/\n easeOutQuad: function (t, b, c, d) {\n t /= d;\n return -c * t*(t-2) + b;\n },\n\n copyAction: function (dest, src) {\n dest.name = src.name;\n dest.axis = src.axis;\n dest.edges = src.edges;\n\n return dest;\n },\n\n is : require('./is'),\n extend : extend,\n hypot : require('./hypot'),\n getOriginXY: require('./getOriginXY'),\n};\n\nextend(utils, require('./arr'));\nextend(utils, require('./domUtils'));\nextend(utils, require('./pointerUtils'));\nextend(utils, require('./rect'));\n\nmodule.exports = utils;\n","const scope = require('../scope');\nconst utils = require('./index');\nconst browser = require('./browser');\n\nconst finder = {\n methodOrder: [ 'simulationResume', 'mouse', 'hasPointer', 'idle' ],\n\n search: function (pointer, eventType, eventTarget) {\n const mouseEvent = (/mouse/i.test(pointer.pointerType || eventType)\n // MSPointerEvent.MSPOINTER_TYPE_MOUSE\n || pointer.pointerType === 4);\n const pointerId = utils.getPointerId(pointer);\n const details = { pointer, pointerId, mouseEvent, eventType, eventTarget };\n\n for (const method of finder.methodOrder) {\n const interaction = finder[method](details);\n\n if (interaction) {\n return interaction;\n }\n }\n },\n\n // try to resume simulation with a new pointer\n simulationResume: function ({ mouseEvent, eventType, eventTarget }) {\n if (!/down|start/i.test(eventType)) {\n return null;\n }\n\n for (const interaction of scope.interactions) {\n let element = eventTarget;\n\n if (interaction.simulation && interaction.simulation.allowResume\n && (interaction.mouse === mouseEvent)) {\n while (element) {\n // if the element is the interaction element\n if (element === interaction.element) {\n return interaction;\n }\n element = utils.parentNode(element);\n }\n }\n }\n\n return null;\n },\n\n // if it's a mouse interaction\n mouse: function ({ pointerId, mouseEvent, eventType }) {\n if (!mouseEvent && (browser.supportsTouch || browser.supportsPointerEvent)) {\n return null;\n }\n\n let firstNonActive;\n\n for (const interaction of scope.interactions) {\n if (interaction.mouse) {\n // if it's a down event, skip interactions with running simulations\n if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; }\n\n // if the interaction is active, return it immediately\n if (interaction.interacting()) {\n return interaction;\n }\n // otherwise save it and look for another active interaction\n else if (!firstNonActive) {\n firstNonActive = interaction;\n }\n }\n }\n\n // if no active mouse interaction was found use the first inactive mouse\n // interaction\n if (firstNonActive) {\n return firstNonActive;\n }\n\n // Find any interaction specifically for mouse.\n // ignore the interaction if the eventType is a mousedown, and a simulation\n // is active\n for (const interaction of scope.interactions) {\n if (interaction.mouse && !(/down/.test(eventType) && interaction.simulation)) {\n return interaction;\n }\n }\n\n return null;\n },\n\n // get interaction that has this pointer\n hasPointer: function ({ pointerId }) {\n for (const interaction of scope.interactions) {\n if (utils.contains(interaction.pointerIds, pointerId)) {\n return interaction;\n }\n }\n },\n\n // get first idle interaction\n idle: function ({ mouseEvent }) {\n for (const interaction of scope.interactions) {\n // if there's already a pointer held down\n if (interaction.pointerIds.length === 1) {\n const target = interaction.target;\n // don't add this pointer if there is a target interactable and it\n // isn't gesturable\n if (target && !target.options.gesture.enabled) {\n continue;\n }\n }\n // maximum of 2 pointers per interaction\n else if (interaction.pointerIds.length >= 2) {\n continue;\n }\n\n if (!interaction.interacting() && (mouseEvent === interaction.mouse)) {\n return interaction;\n }\n }\n\n return null;\n },\n};\n\nmodule.exports = finder;\n","const win = require('./window');\nconst isWindow = require('./isWindow');\n\nconst is = {\n array : () => {},\n\n window : thing => thing === win.window || isWindow(thing),\n\n docFrag : thing => is.object(thing) && thing.nodeType === 11,\n\n object : thing => !!thing && (typeof thing === 'object'),\n\n function: thing => typeof thing === 'function',\n\n number : thing => typeof thing === 'number' ,\n\n bool : thing => typeof thing === 'boolean' ,\n\n string : thing => typeof thing === 'string' ,\n\n element: thing => {\n if (!thing || (typeof thing !== 'object')) { return false; }\n\n const _window = win.getWindow(thing) || win.window;\n\n return (/object|function/.test(typeof _window.Element)\n ? thing instanceof _window.Element //DOM2\n : thing.nodeType === 1 && typeof thing.nodeName === 'string');\n },\n};\n\nis.array = thing => (is.object(thing)\n && (typeof thing.length !== 'undefined')\n && is.function(thing.splice));\n\nmodule.exports = is;\n","module.exports = (thing) => !!(thing && thing.Window) && (thing instanceof thing.Window);\n","function pointerExtend (dest, source) {\n for (const prop in source) {\n const prefixedPropREs = module.exports.prefixedPropREs;\n let deprecated = false;\n\n // skip deprecated prefixed properties\n for (const vendor in prefixedPropREs) {\n if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) {\n deprecated = true;\n break;\n }\n }\n\n if (!deprecated && typeof source[prop] !== 'function') {\n dest[prop] = source[prop];\n }\n }\n return dest;\n}\n\npointerExtend.prefixedPropREs = {\n webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/,\n};\n\nmodule.exports = pointerExtend;\n","const hypot = require('./hypot');\nconst browser = require('./browser');\nconst dom = require('./domObjects');\nconst domUtils = require('./domUtils');\nconst is = require('./is');\nconst pointerExtend = require('./pointerExtend');\n\nconst pointerUtils = {\n copyCoords: function (dest, src) {\n dest.page = dest.page || {};\n dest.page.x = src.page.x;\n dest.page.y = src.page.y;\n\n dest.client = dest.client || {};\n dest.client.x = src.client.x;\n dest.client.y = src.client.y;\n\n dest.timeStamp = src.timeStamp;\n },\n\n setCoordDeltas: function (targetObj, prev, cur) {\n targetObj.page.x = cur.page.x - prev.page.x;\n targetObj.page.y = cur.page.y - prev.page.y;\n targetObj.client.x = cur.client.x - prev.client.x;\n targetObj.client.y = cur.client.y - prev.client.y;\n targetObj.timeStamp = cur.timeStamp - prev.timeStamp;\n\n // set pointer velocity\n const dt = Math.max(targetObj.timeStamp / 1000, 0.001);\n\n targetObj.page.speed = hypot(targetObj.page.x, targetObj.page.y) / dt;\n targetObj.page.vx = targetObj.page.x / dt;\n targetObj.page.vy = targetObj.page.y / dt;\n\n targetObj.client.speed = hypot(targetObj.client.x, targetObj.page.y) / dt;\n targetObj.client.vx = targetObj.client.x / dt;\n targetObj.client.vy = targetObj.client.y / dt;\n },\n\n isNativePointer: function (pointer) {\n return (pointer instanceof dom.Event || pointer instanceof dom.Touch);\n },\n\n // Get specified X/Y coords for mouse or event.touches[0]\n getXY: function (type, pointer, xy) {\n xy = xy || {};\n type = type || 'page';\n\n xy.x = pointer[type + 'X'];\n xy.y = pointer[type + 'Y'];\n\n return xy;\n },\n\n getPageXY: function (pointer, page) {\n page = page || {};\n\n // Opera Mobile handles the viewport and scrolling oddly\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n pointerUtils.getXY('screen', pointer, page);\n\n page.x += window.scrollX;\n page.y += window.scrollY;\n }\n else {\n pointerUtils.getXY('page', pointer, page);\n }\n\n return page;\n },\n\n getClientXY: function (pointer, client) {\n client = client || {};\n\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n // Opera Mobile handles the viewport and scrolling oddly\n pointerUtils.getXY('screen', pointer, client);\n }\n else {\n pointerUtils.getXY('client', pointer, client);\n }\n\n return client;\n },\n\n getPointerId: function (pointer) {\n return is.number(pointer.pointerId)? pointer.pointerId : pointer.identifier;\n },\n\n setCoords: function (targetObj, pointers, timeStamp) {\n const pointer = (pointers.length > 1\n ? pointerUtils.pointerAverage(pointers)\n : pointers[0]);\n\n const tmpXY = {};\n\n pointerUtils.getPageXY(pointer, tmpXY);\n targetObj.page.x = tmpXY.x;\n targetObj.page.y = tmpXY.y;\n\n pointerUtils.getClientXY(pointer, tmpXY);\n targetObj.client.x = tmpXY.x;\n targetObj.client.y = tmpXY.y;\n\n targetObj.timeStamp = is.number(timeStamp) ? timeStamp :new Date().getTime();\n },\n\n pointerExtend: pointerExtend,\n\n getTouchPair: function (event) {\n const touches = [];\n\n // array of touches is supplied\n if (is.array(event)) {\n touches[0] = event[0];\n touches[1] = event[1];\n }\n // an event\n else {\n if (event.type === 'touchend') {\n if (event.touches.length === 1) {\n touches[0] = event.touches[0];\n touches[1] = event.changedTouches[0];\n }\n else if (event.touches.length === 0) {\n touches[0] = event.changedTouches[0];\n touches[1] = event.changedTouches[1];\n }\n }\n else {\n touches[0] = event.touches[0];\n touches[1] = event.touches[1];\n }\n }\n\n return touches;\n },\n\n pointerAverage: function (pointers) {\n const average = {\n pageX : 0,\n pageY : 0,\n clientX: 0,\n clientY: 0,\n screenX: 0,\n screenY: 0,\n };\n\n for (const pointer of pointers) {\n for (const prop in average) {\n average[prop] += pointer[prop];\n }\n }\n for (const prop in average) {\n average[prop] /= pointers.length;\n }\n\n return average;\n },\n\n touchBBox: function (event) {\n if (!event.length && !(event.touches && event.touches.length > 1)) {\n return;\n }\n\n const touches = pointerUtils.getTouchPair(event);\n const minX = Math.min(touches[0].pageX, touches[1].pageX);\n const minY = Math.min(touches[0].pageY, touches[1].pageY);\n const maxX = Math.max(touches[0].pageX, touches[1].pageX);\n const maxY = Math.max(touches[0].pageY, touches[1].pageY);\n\n return {\n x: minX,\n y: minY,\n left: minX,\n top: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n },\n\n touchDistance: function (event, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n\n\n const dx = touches[0][sourceX] - touches[1][sourceX];\n const dy = touches[0][sourceY] - touches[1][sourceY];\n\n return hypot(dx, dy);\n },\n\n touchAngle: function (event, prevAngle, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n const dx = touches[1][sourceX] - touches[0][sourceX];\n const dy = touches[1][sourceY] - touches[0][sourceY];\n const angle = 180 * Math.atan2(dy , dx) / Math.PI;\n\n return angle;\n },\n\n getPointerType: function (pointer, interaction) {\n // if the PointerEvent API isn't available, then the pointer must be ither\n // a MouseEvent or TouchEvent\n if (interaction.mouse) { return 'mouse'; }\n if (!browser.supportsPointerEvent) { return 'touch'; }\n\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : [undefined, undefined,'touch', 'pen', 'mouse'][pointer.pointerType];\n },\n\n // [ event.target, event.currentTarget ]\n getEventTargets: function (event) {\n return [\n domUtils.getActualElement(event.path ? event.path[0] : event.target),\n domUtils.getActualElement(event.currentTarget),\n ];\n },\n};\n\nmodule.exports = pointerUtils;\n","const { window } = require('./window');\n\nconst vendors = ['ms', 'moz', 'webkit', 'o'];\nlet lastTime = 0;\nlet request;\nlet cancel;\n\nfor (let x = 0; x < vendors.length && !window.requestAnimationFrame; x++) {\n request = window[vendors[x] + 'RequestAnimationFrame'];\n cancel = window[vendors[x] +'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n}\n\nif (!request) {\n request = function (callback) {\n const currTime = new Date().getTime();\n const timeToCall = Math.max(0, 16 - (currTime - lastTime));\n const id = setTimeout(function () { callback(currTime + timeToCall); },\n timeToCall);\n\n lastTime = currTime + timeToCall;\n return id;\n };\n}\n\nif (!cancel) {\n cancel = function (id) {\n clearTimeout(id);\n };\n}\n\nmodule.exports = {\n request,\n cancel,\n};\n","const extend = require('./extend');\nconst is = require('./is');\nconst {\n closest,\n parentNode,\n getElementRect,\n} = require('./domUtils');\n\nconst rectUtils = {\n getStringOptionResult: function (value, interactable, element) {\n if (!is.string(value)) {\n return null;\n }\n\n if (value === 'parent') {\n value = parentNode(element);\n }\n else if (value === 'self') {\n value = interactable.getRect(element);\n }\n else {\n value = closest(element, value);\n }\n\n return value;\n },\n\n resolveRectLike: function (value, interactable, element, functionArgs) {\n value = rectUtils.getStringOptionResult(value, interactable, element) || value;\n\n if (is.function(value)) {\n value = value.apply(null, functionArgs);\n }\n\n if (is.element(value)) {\n value = getElementRect(value);\n }\n\n return value;\n },\n\n rectToXY: function (rect) {\n return rect && {\n x: 'x' in rect ? rect.x : rect.left,\n y: 'y' in rect ? rect.y : rect.top,\n };\n },\n\n xywhToTlbr: function (rect) {\n if (rect && !('left' in rect && 'top' in rect)) {\n rect = extend({}, rect);\n\n rect.left = rect.x || 0;\n rect.top = rect.y || 0;\n rect.right = rect.right || (rect.left + rect.width);\n rect.bottom = rect.bottom || (rect.top + rect.height);\n }\n\n return rect;\n },\n\n tlbrToXywh: function (rect) {\n if (rect && !('x' in rect && 'y' in rect)) {\n rect = extend({}, rect);\n\n rect.x = rect.left || 0;\n rect.top = rect.top || 0;\n rect.width = rect.width || (rect.right - rect.x);\n rect.height = rect.height || (rect.bottom - rect.y);\n }\n\n return rect;\n },\n};\n\nmodule.exports = rectUtils;\n","const win = module.exports;\nconst isWindow = require('./isWindow');\n\nfunction init (window) {\n // get wrapped window if using Shadow DOM polyfill\n\n win.realWindow = window;\n\n // create a TextNode\n const el = window.document.createTextNode('');\n\n // check if it's wrapped by a polyfill\n if (el.ownerDocument !== window.document\n && typeof window.wrap === 'function'\n && window.wrap(el) === el) {\n // use wrapped window\n window = window.wrap(window);\n }\n\n win.window = window;\n}\n\nif (typeof window === 'undefined') {\n win.window = undefined;\n win.realWindow = undefined;\n}\nelse {\n init(window);\n}\n\nwin.getWindow = function getWindow (node) {\n if (isWindow(node)) {\n return node;\n }\n\n const rootNode = (node.ownerDocument || node);\n\n return rootNode.defaultView || rootNode.parentWindow || win.window;\n};\n\nwin.init = init;\n"]} \ No newline at end of file +{"version":3,"sources":["src/header.js","node_modules/browser-pack/_prelude.js","index.js","src/Eventable.js","src/InteractEvent.js","src/Interactable.js","src/Interaction.js","src/actions/base.js","src/actions/drag.js","src/actions/drop.js","src/actions/gesture.js","src/actions/resize.js","src/autoScroll.js","src/autoStart/InteractableMethods.js","src/autoStart/base.js","src/autoStart/delay.js","src/autoStart/drag.js","src/autoStart/gesture.js","src/autoStart/resize.js","src/defaultOptions.js","src/index.js","src/inertia.js","src/interact.js","src/interactablePreventDefault.js","src/legacyBrowsers.js","src/modifiers/index.js","src/modifiers/restrict.js","src/modifiers/restrictEdges.js","src/modifiers/restrictSize.js","src/modifiers/snap.js","src/modifiers/snapSize.js","src/pointerEvents/PointerEvent.js","src/pointerEvents/base.js","src/pointerEvents/holdRepeat.js","src/pointerEvents/interactableTargets.js","src/scope.js","src/utils/Signals.js","src/utils/arr.js","src/utils/browser.js","src/utils/domObjects.js","src/utils/domUtils.js","src/utils/events.js","src/utils/extend.js","src/utils/getOriginXY.js","src/utils/hypot.js","src/utils/index.js","src/utils/interactionFinder.js","src/utils/is.js","src/utils/isWindow.js","src/utils/pointerExtend.js","src/utils/pointerUtils.js","src/utils/raf.js","src/utils/rect.js","src/utils/window.js"],"names":[],"mappings":"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","file":"interact.js","sourceRoot":"","sourcesContent":["/**\n * interact.js v1.3.0-alpha.4+sha.7970416-dirty\n *\n * Copyright (c) 2012-2017 Taye Adeyemi \n * Open source under the MIT License.\n * https://raw.github.com/taye/interact.js/master/LICENSE\n */\n","(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o 150) {\n return null;\n }\n\n let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI;\n const overlap = 22.5;\n\n if (angle < 0) {\n angle += 360;\n }\n\n const left = 135 - overlap <= angle && angle < 225 + overlap;\n const up = 225 - overlap <= angle && angle < 315 + overlap;\n\n const right = !left && (315 - overlap <= angle || angle < 45 + overlap);\n const down = !up && 45 - overlap <= angle && angle < 135 + overlap;\n\n return {\n up,\n down,\n left,\n right,\n angle,\n speed: interaction.prevEvent.speed,\n velocity: {\n x: interaction.prevEvent.velocityX,\n y: interaction.prevEvent.velocityY,\n },\n };\n }\n\n preventDefault () {}\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n}\n\nsignals.on('set-delta', function ({ iEvent, interaction, starting, deltaSource }) {\n const prevEvent = starting? iEvent : interaction.prevEvent;\n\n if (deltaSource === 'client') {\n iEvent.dx = iEvent.clientX - prevEvent.clientX;\n iEvent.dy = iEvent.clientY - prevEvent.clientY;\n }\n else {\n iEvent.dx = iEvent.pageX - prevEvent.pageX;\n iEvent.dy = iEvent.pageY - prevEvent.pageY;\n }\n});\n\nInteractEvent.signals = signals;\n\nmodule.exports = InteractEvent;\n","const is = require('./utils/is');\nconst events = require('./utils/events');\nconst extend = require('./utils/extend');\nconst actions = require('./actions/base');\nconst scope = require('./scope');\nconst Eventable = require('./Eventable');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nconst {\n getElementRect,\n nodeContains,\n trySelector,\n} = require('./utils/domUtils');\nconst { getWindow } = require('./utils/window');\nconst { indexOf, contains } = require('./utils/arr');\nconst { wheelEvent } = require('./utils/browser');\n\n// all set interactables\nscope.interactables = [];\n\n/*\\\n * Interactable\n [ property ]\n **\n * Object type returned by @interact\n\\*/\nclass Interactable {\n constructor (target, options) {\n options = options || {};\n\n this.target = target;\n this.events = new Eventable();\n this._context = options.context || scope.document;\n this._win = getWindow(trySelector(target)? this._context : target);\n this._doc = this._win.document;\n\n signals.fire('new', {\n target,\n options,\n interactable: this,\n win: this._win,\n });\n\n scope.addDocument( this._doc, this._win );\n\n scope.interactables.push(this);\n\n this.set(options);\n }\n\n setOnEvents (action, phases) {\n const onAction = 'on' + action;\n\n if (is.function(phases.onstart) ) { this.events[onAction + 'start' ] = phases.onstart ; }\n if (is.function(phases.onmove) ) { this.events[onAction + 'move' ] = phases.onmove ; }\n if (is.function(phases.onend) ) { this.events[onAction + 'end' ] = phases.onend ; }\n if (is.function(phases.oninertiastart)) { this.events[onAction + 'inertiastart' ] = phases.oninertiastart ; }\n\n return this;\n }\n\n setPerAction (action, options) {\n // for all the default per-action options\n for (const option in options) {\n // if this option exists for this action\n if (option in defaults[action]) {\n // if the option in the options arg is an object value\n if (is.object(options[option])) {\n // duplicate the object\n this.options[action][option] = extend(this.options[action][option] || {}, options[option]);\n\n if (is.object(defaults.perAction[option]) && 'enabled' in defaults.perAction[option]) {\n this.options[action][option].enabled = options[option].enabled === false? false : true;\n }\n }\n else if (is.bool(options[option]) && is.object(defaults.perAction[option])) {\n this.options[action][option].enabled = options[option];\n }\n else if (options[option] !== undefined) {\n // or if it's not undefined, do a plain assignment\n this.options[action][option] = options[option];\n }\n }\n }\n }\n\n /*\\\n * Interactable.getRect\n [ method ]\n *\n * The default function to get an Interactables bounding rect. Can be\n * overridden using @Interactable.rectChecker.\n *\n - element (Element) #optional The element to measure.\n = (object) The object's bounding rectangle.\n o {\n o top : 0,\n o left : 0,\n o bottom: 0,\n o right : 0,\n o width : 0,\n o height: 0\n o }\n \\*/\n getRect (element) {\n element = element || this.target;\n\n if (is.string(this.target) && !(is.element(element))) {\n element = this._context.querySelector(this.target);\n }\n\n return getElementRect(element);\n }\n\n /*\\\n * Interactable.rectChecker\n [ method ]\n *\n * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n - checker (function) #optional A function which returns this Interactable's bounding rectangle. See @Interactable.getRect\n = (function | object) The checker function or this Interactable\n \\*/\n rectChecker (checker) {\n if (is.function(checker)) {\n this.getRect = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.getRect;\n\n return this;\n }\n\n return this.getRect;\n }\n\n _backCompatOption (optionName, newValue) {\n if (trySelector(newValue) || is.object(newValue)) {\n this.options[optionName] = newValue;\n\n for (const action of actions.names) {\n this.options[action][optionName] = newValue;\n }\n\n return this;\n }\n\n return this.options[optionName];\n }\n\n /*\\\n * Interactable.origin\n [ method ]\n *\n * Gets or sets the origin of the Interactable's element. The x and y\n * of the origin will be subtracted from action event coordinates.\n *\n - origin (object | string) #optional An object eg. { x: 0, y: 0 } or string 'parent', 'self' or any CSS selector\n * OR\n - origin (Element) #optional An HTML or SVG Element whose rect will be used\n **\n = (object) The current origin or this Interactable\n \\*/\n origin (newValue) {\n return this._backCompatOption('origin', newValue);\n }\n\n /*\\\n * Interactable.deltaSource\n [ method ]\n *\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n - newValue (string) #optional Use 'client' if you will be scrolling while interacting; Use 'page' if you want autoScroll to work\n = (string | object) The current deltaSource or this Interactable\n \\*/\n deltaSource (newValue) {\n if (newValue === 'page' || newValue === 'client') {\n this.options.deltaSource = newValue;\n\n return this;\n }\n\n return this.options.deltaSource;\n }\n\n /*\\\n * Interactable.context\n [ method ]\n *\n * Gets the selector context Node of the Interactable. The default is `window.document`.\n *\n = (Node) The context Node of this Interactable\n **\n \\*/\n context () {\n return this._context;\n }\n\n inContext (element) {\n return (this._context === element.ownerDocument\n || nodeContains(this._context, element));\n }\n\n /*\\\n * Interactable.fire\n [ method ]\n *\n * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n - iEvent (InteractEvent) The InteractEvent object to be fired on this Interactable\n = (Interactable) this Interactable\n \\*/\n fire (iEvent) {\n this.events.fire(iEvent);\n\n return this;\n }\n\n _onOffMultiple (method, eventType, listener, options) {\n if (is.string(eventType) && eventType.search(' ') !== -1) {\n eventType = eventType.trim().split(/ +/);\n }\n\n if (is.array(eventType)) {\n for (let i = 0; i < eventType.length; i++) {\n this[method](eventType[i], listener, options);\n }\n\n return true;\n }\n\n if (is.object(eventType)) {\n for (const prop in eventType) {\n this[method](prop, eventType[prop], listener);\n }\n\n return true;\n }\n }\n\n /*\\\n * Interactable.on\n [ method ]\n *\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n - eventType (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) This Interactable\n \\*/\n on (eventType, listener, options) {\n if (this._onOffMultiple('on', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.on(eventType, listener);\n }\n // delegated event for selector\n else if (is.string(this.target)) {\n events.addDelegate(this.target, this._context, eventType, listener, options);\n }\n else {\n events.add(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.off\n [ method ]\n *\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n - eventType (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) This Interactable\n \\*/\n off (eventType, listener, options) {\n if (this._onOffMultiple('off', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n // if it is an action event type\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.off(eventType, listener);\n }\n // delegated event\n else if (is.string(this.target)) {\n events.removeDelegate(this.target, this._context, eventType, listener, options);\n }\n // remove listener from this Interatable's element\n else {\n events.remove(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.set\n [ method ]\n *\n * Reset the options of this Interactable\n - options (object) The new settings to apply\n = (object) This Interactable\n \\*/\n set (options) {\n if (!is.object(options)) {\n options = {};\n }\n\n this.options = extend({}, defaults.base);\n\n const perActions = extend({}, defaults.perAction);\n\n for (const actionName in actions.methodDict) {\n const methodName = actions.methodDict[actionName];\n\n this.options[actionName] = extend({}, defaults[actionName]);\n\n this.setPerAction(actionName, perActions);\n\n this[methodName](options[actionName]);\n }\n\n for (const setting of Interactable.settingsMethods) {\n this.options[setting] = defaults.base[setting];\n\n if (setting in options) {\n this[setting](options[setting]);\n }\n }\n\n signals.fire('set', {\n options,\n interactable: this,\n });\n\n return this;\n }\n\n /*\\\n * Interactable.unset\n [ method ]\n *\n * Remove this interactable from the list of interactables and remove\n * it's action capabilities and event listeners\n *\n = (object) @interact\n \\*/\n unset () {\n events.remove(this.target, 'all');\n\n if (is.string(this.target)) {\n // remove delegated events\n for (const type in events.delegatedEvents) {\n const delegated = events.delegatedEvents[type];\n\n if (delegated.selectors[0] === this.target\n && delegated.contexts[0] === this._context) {\n\n delegated.selectors.splice(0, 1);\n delegated.contexts .splice(0, 1);\n delegated.listeners.splice(0, 1);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegated[type] = null;\n }\n }\n\n events.remove(this._context, type, events.delegateListener);\n events.remove(this._context, type, events.delegateUseCapture, true);\n }\n }\n else {\n events.remove(this, 'all');\n }\n\n signals.fire('unset', { interactable: this });\n\n scope.interactables.splice(indexOf(scope.interactables, this), 1);\n\n // Stop related interactions when an Interactable is unset\n for (const interaction of scope.interactions || []) {\n if (interaction.target === this && interaction.interacting()) {\n interaction.stop();\n }\n }\n\n return scope.interact;\n }\n}\n\nscope.interactables.indexOfElement = function indexOfElement (target, context) {\n context = context || scope.document;\n\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n if (interactable.target === target && interactable._context === context) {\n return i;\n }\n }\n return -1;\n};\n\nscope.interactables.get = function interactableGet (element, options, dontCheckInContext) {\n const ret = this[this.indexOfElement(element, options && options.context)];\n\n return ret && (is.string(element) || dontCheckInContext || ret.inContext(element))? ret : null;\n};\n\nscope.interactables.forEachSelector = function (callback, element) {\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n // skip non CSS selector targets and out of context elements\n if (!is.string(interactable.target)\n || (element && !interactable.inContext(element))) {\n continue;\n }\n\n const ret = callback(interactable, interactable.target, interactable._context, i, this);\n\n if (ret !== undefined) {\n return ret;\n }\n }\n};\n\n// all interact.js eventTypes\nInteractable.eventTypes = scope.eventTypes = [];\n\nInteractable.signals = signals;\n\nInteractable.settingsMethods = [ 'deltaSource', 'origin', 'preventDefault', 'rectChecker' ];\n\nmodule.exports = Interactable;\n","const scope = require('./scope');\nconst utils = require('./utils');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst domObjects = require('./utils/domObjects');\nconst finder = require('./utils/interactionFinder');\nconst signals = require('./utils/Signals').new();\n\nconst listeners = {};\nconst methodNames = [\n 'pointerDown', 'pointerMove', 'pointerUp',\n 'updatePointer', 'removePointer',\n];\n\n// for ignoring browser's simulated mouse events\nlet prevTouchTime = 0;\n\n// all active and idle interactions\nscope.interactions = [];\n\nclass Interaction {\n constructor ({ pointerType }) {\n this.target = null; // current interactable being interacted with\n this.element = null; // the target element of the interactable\n\n this.prepared = { // action that's ready to be fired on next move event\n name : null,\n axis : null,\n edges: null,\n };\n\n // keep track of added pointers\n this.pointers = [];\n this.pointerIds = [];\n this.downTargets = [];\n this.downTimes = [];\n\n // Previous native pointer move event coordinates\n this.prevCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n // current native pointer move event coordinates\n this.curCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Starting InteractEvent pointer coordinates\n this.startCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Change in coordinates and time of the pointer\n this.pointerDelta = {\n page : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n client : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n timeStamp: 0,\n };\n\n this.downEvent = null; // pointerdown/mousedown/touchstart event\n this.downPointer = {};\n\n this._eventTarget = null;\n this._curEventTarget = null;\n\n this.prevEvent = null; // previous action event\n\n this.pointerIsDown = false;\n this.pointerWasMoved = false;\n this._interacting = false;\n\n this.pointerType = pointerType;\n\n signals.fire('new', this);\n\n scope.interactions.push(this);\n }\n\n pointerDown (pointer, event, eventTarget) {\n const pointerIndex = this.updatePointer(pointer, event, true);\n\n signals.fire('down', {\n pointer,\n event,\n eventTarget,\n pointerIndex,\n interaction: this,\n });\n }\n\n /*\\\n * Interaction.start\n [ method ]\n *\n * Start an action with the given Interactable and Element as tartgets. The\n * action must be enabled for the target Interactable and an appropriate number\n * of pointers must be held down - 1 for drag/resize, 2 for gesture.\n *\n * Use it with `interactable.able({ manualStart: false })` to always\n * [start actions manually](https://github.com/taye/interact.js/issues/114)\n *\n - action (object) The action to be performed - drag, resize, etc.\n - target (Interactable) The Interactable to target\n - element (Element) The DOM Element to target\n = (object) interact\n **\n | interact(target)\n | .draggable({\n | // disable the default drag start by down->move\n | manualStart: true\n | })\n | // start dragging after the user holds the pointer down\n | .on('hold', function (event) {\n | var interaction = event.interaction;\n |\n | if (!interaction.interacting()) {\n | interaction.start({ name: 'drag' },\n | event.interactable,\n | event.currentTarget);\n | }\n | });\n \\*/\n start (action, target, element) {\n if (this.interacting()\n || !this.pointerIsDown\n || this.pointerIds.length < (action.name === 'gesture'? 2 : 1)) {\n return;\n }\n\n // if this interaction had been removed after stopping\n // add it back\n if (utils.indexOf(scope.interactions, this) === -1) {\n scope.interactions.push(this);\n }\n\n utils.copyAction(this.prepared, action);\n this.target = target;\n this.element = element;\n\n signals.fire('action-start', {\n interaction: this,\n event: this.downEvent,\n });\n }\n\n pointerMove (pointer, event, eventTarget) {\n if (!this.simulation) {\n this.updatePointer(pointer);\n utils.setCoords(this.curCoords, this.pointers);\n }\n\n const duplicateMove = (this.curCoords.page.x === this.prevCoords.page.x\n && this.curCoords.page.y === this.prevCoords.page.y\n && this.curCoords.client.x === this.prevCoords.client.x\n && this.curCoords.client.y === this.prevCoords.client.y);\n\n let dx;\n let dy;\n\n // register movement greater than pointerMoveTolerance\n if (this.pointerIsDown && !this.pointerWasMoved) {\n dx = this.curCoords.client.x - this.startCoords.client.x;\n dy = this.curCoords.client.y - this.startCoords.client.y;\n\n this.pointerWasMoved = utils.hypot(dx, dy) > Interaction.pointerMoveTolerance;\n }\n\n const signalArg = {\n pointer,\n pointerIndex: this.getPointerIndex(pointer),\n event,\n eventTarget,\n dx,\n dy,\n duplicate: duplicateMove,\n interaction: this,\n interactingBeforeMove: this.interacting(),\n };\n\n if (!duplicateMove) {\n // set pointer coordinate, time changes and speeds\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n }\n\n signals.fire('move', signalArg);\n\n if (!duplicateMove) {\n // if interacting, fire an 'action-move' signal etc\n if (this.interacting()) {\n this.doMove(signalArg);\n }\n\n if (this.pointerWasMoved) {\n utils.copyCoords(this.prevCoords, this.curCoords);\n }\n }\n }\n\n /*\\\n * Interaction.doMove\n [ method ]\n *\n * Force a move of the current action at the same coordinates. Useful if\n * snap/restrict has been changed and you want a movement with the new\n * settings.\n *\n **\n | interact(target)\n | .draggable(true)\n | .on('dragmove', function (event) {\n | if (someCondition) {\n | // change the snap settings\n | event.interactable.draggable({ snap: { targets: [] }});\n | // fire another move event with re-calculated snap\n | event.interaction.doMove();\n | }\n | });\n \\*/\n doMove (signalArg) {\n signalArg = utils.extend({\n pointer: this.pointers[0],\n event: this.prevEvent,\n eventTarget: this._eventTarget,\n interaction: this,\n }, signalArg || {});\n\n signals.fire('before-action-move', signalArg);\n\n if (!this._dontFireMove) {\n signals.fire('action-move', signalArg);\n }\n\n this._dontFireMove = false;\n }\n\n // End interact move events and stop auto-scroll unless simulation is running\n pointerUp (pointer, event, eventTarget, curEventTarget) {\n const pointerIndex = this.getPointerIndex(pointer);\n\n signals.fire(/cancel$/i.test(event.type)? 'cancel' : 'up', {\n pointer,\n pointerIndex,\n event,\n eventTarget,\n curEventTarget,\n interaction: this,\n });\n\n if (!this.simulation) {\n this.end(event);\n }\n\n this.pointerIsDown = false;\n this.removePointer(pointer, event);\n }\n\n /*\\\n * Interaction.end\n [ method ]\n *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n - event (PointerEvent) #optional\n **\n | interact(target)\n | .draggable(true)\n | .on('move', function (event) {\n | if (event.pageX > 1000) {\n | // end the current action\n | event.interaction.end();\n | // stop all further listeners from being called\n | event.stopImmediatePropagation();\n | }\n | });\n \\*/\n end (event) {\n event = event || this.prevEvent;\n\n if (this.interacting()) {\n signals.fire('action-end', {\n event,\n interaction: this,\n });\n }\n\n this.stop();\n }\n\n currentAction () {\n return this._interacting? this.prepared.name: null;\n }\n\n interacting () {\n return this._interacting;\n }\n\n stop () {\n signals.fire('stop', { interaction: this });\n\n if (this._interacting) {\n signals.fire('stop-active', { interaction: this });\n signals.fire('stop-' + this.prepared.name, { interaction: this });\n }\n\n this.target = this.element = null;\n\n this._interacting = false;\n this.prepared.name = this.prevEvent = null;\n }\n\n getPointerIndex (pointer) {\n // mouse and pen interactions may have only one pointer\n if (this.pointerType === 'mouse' || this.pointerType === 'pen') {\n return 0;\n }\n\n return utils.indexOf(this.pointerIds, utils.getPointerId(pointer));\n }\n\n updatePointer (pointer, event, down = event && /(down|start)$/i.test(event.type)) {\n const id = utils.getPointerId(pointer);\n let index = this.getPointerIndex(pointer);\n\n if (index === -1) {\n index = this.pointerIds.length;\n this.pointerIds[index] = id;\n }\n\n if (down) {\n signals.fire('update-pointer-down', {\n pointer,\n event,\n down,\n pointerId: id,\n pointerIndex: index,\n interaction: this,\n });\n }\n\n this.pointers[index] = pointer;\n\n return index;\n }\n\n removePointer (pointer, event) {\n const index = this.getPointerIndex(pointer);\n\n if (index === -1) { return; }\n\n signals.fire('remove-pointer', {\n pointer,\n event,\n pointerIndex: index,\n interaction: this,\n });\n\n this.pointers .splice(index, 1);\n this.pointerIds .splice(index, 1);\n this.downTargets.splice(index, 1);\n this.downTimes .splice(index, 1);\n }\n\n _updateEventTargets (target, currentTarget) {\n this._eventTarget = target;\n this._curEventTarget = currentTarget;\n }\n}\n\nfor (let i = 0, len = methodNames.length; i < len; i++) {\n const method = methodNames[i];\n\n listeners[method] = doOnInteractions(method);\n}\n\nfunction doOnInteractions (method) {\n return (function (event) {\n const pointerType = utils.getPointerType(event);\n const [eventTarget, curEventTarget] = utils.getEventTargets(event);\n const matches = []; // [ [pointer, interaction], ...]\n\n if (browser.supportsTouch && /touch/.test(event.type)) {\n prevTouchTime = new Date().getTime();\n\n for (let i = 0; i < event.changedTouches.length; i++) {\n const pointer = event.changedTouches[i];\n const interaction = finder.search(pointer, event.type, eventTarget);\n\n matches.push([pointer, interaction || new Interaction({ pointerType })]);\n }\n }\n else {\n let invalidPointer = false;\n\n if (!browser.supportsPointerEvent && /mouse/.test(event.type)) {\n // ignore mouse events while touch interactions are active\n for (let i = 0; i < scope.interactions.length && !invalidPointer; i++) {\n invalidPointer = scope.interactions[i].pointerType !== 'mouse' && scope.interactions[i].pointerIsDown;\n }\n\n // try to ignore mouse events that are simulated by the browser\n // after a touch event\n invalidPointer = invalidPointer\n || (new Date().getTime() - prevTouchTime < 500)\n // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated\n || event.timeStamp === 0;\n }\n\n if (!invalidPointer) {\n let interaction = finder.search(event, event.type, eventTarget);\n\n if (!interaction) {\n interaction = new Interaction({ pointerType });\n }\n\n matches.push([event, interaction]);\n }\n }\n\n for (const [pointer, interaction] of matches) {\n interaction._updateEventTargets(eventTarget, curEventTarget);\n interaction[method](pointer, event, eventTarget, curEventTarget);\n }\n });\n}\n\nfunction endAll (event) {\n for (let i = 0; i < scope.interactions.length; i++) {\n const interaction = scope.interactions[i];\n\n interaction.end(event);\n signals.fire('endall', { event, interaction });\n }\n}\n\nconst docEvents = { /* 'eventType': listenerFunc */ };\nconst pEventTypes = browser.pEventTypes;\n\nif (domObjects.PointerEvent) {\n docEvents[pEventTypes.down ] = listeners.pointerDown;\n docEvents[pEventTypes.move ] = listeners.pointerMove;\n docEvents[pEventTypes.up ] = listeners.pointerUp;\n docEvents[pEventTypes.cancel] = listeners.pointerUp;\n}\nelse {\n docEvents.mousedown = listeners.pointerDown;\n docEvents.mousemove = listeners.pointerMove;\n docEvents.mouseup = listeners.pointerUp;\n\n docEvents.touchstart = listeners.pointerDown;\n docEvents.touchmove = listeners.pointerMove;\n docEvents.touchend = listeners.pointerUp;\n docEvents.touchcancel = listeners.pointerUp;\n}\n\ndocEvents.blur = endAll;\n\nfunction onDocSignal ({ doc }, signalName) {\n const eventMethod = signalName.indexOf('add') === 0\n ? events.add : events.remove;\n\n // delegate event listener\n for (const eventType in scope.delegatedEvents) {\n eventMethod(doc, eventType, events.delegateListener);\n eventMethod(doc, eventType, events.delegateUseCapture, true);\n }\n\n for (const eventType in docEvents) {\n eventMethod(doc, eventType, docEvents[eventType]);\n }\n}\n\nsignals.on('update-pointer-down', ({ interaction, pointer, pointerId, pointerIndex, event, eventTarget, down }) => {\n interaction.pointerIds[pointerIndex] = pointerId;\n interaction.pointers[pointerIndex] = pointer;\n\n if (down) {\n interaction.pointerIsDown = true;\n }\n\n if (!interaction.interacting()) {\n utils.setCoords(interaction.startCoords, interaction.pointers);\n\n utils.copyCoords(interaction.curCoords , interaction.startCoords);\n utils.copyCoords(interaction.prevCoords, interaction.startCoords);\n\n interaction.downEvent = event;\n interaction.downTimes[pointerIndex] = interaction.curCoords.timeStamp;\n interaction.downTargets[pointerIndex] = eventTarget || event && utils.getEventTargets(event)[0];\n interaction.pointerWasMoved = false;\n\n utils.pointerExtend(interaction.downPointer, pointer);\n }\n});\n\nscope.signals.on('add-document' , onDocSignal);\nscope.signals.on('remove-document', onDocSignal);\n\nInteraction.pointerMoveTolerance = 1;\nInteraction.doOnInteractions = doOnInteractions;\nInteraction.endAll = endAll;\nInteraction.signals = signals;\nInteraction.docEvents = docEvents;\n\nscope.endAllInteractions = endAll;\n\nmodule.exports = Interaction;\n","const Interaction = require('../Interaction');\nconst InteractEvent = require('../InteractEvent');\n\nconst actions = {\n firePrepared,\n names: [],\n methodDict: {},\n};\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n interaction._interacting = true;\n firePrepared(interaction, event, 'start');\n});\n\nInteraction.signals.on('action-move', function ({ interaction, event, preEnd }) {\n firePrepared(interaction, event, 'move', preEnd);\n\n // if the action was ended in a listener\n if (!interaction.interacting()) { return false; }\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n firePrepared(interaction, event, 'end');\n});\n\nfunction firePrepared (interaction, event, phase, preEnd) {\n const actionName = interaction.prepared.name;\n\n const newEvent = new InteractEvent(interaction, event, actionName, phase, interaction.element, null, preEnd);\n\n interaction.target.fire(newEvent);\n interaction.prevEvent = newEvent;\n}\n\nmodule.exports = actions;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drag = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n startAxis : 'xy',\n lockAxis : 'xy',\n },\n\n checker: function (pointer, event, interactable) {\n const dragOptions = interactable.options.drag;\n\n return dragOptions.enabled\n ? { name: 'drag', axis: (dragOptions.lockAxis === 'start'\n ? dragOptions.startAxis\n : dragOptions.lockAxis)}\n : null;\n },\n\n getCursor: function () {\n return 'move';\n },\n};\n\nInteraction.signals.on('before-action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n interaction.curCoords.page.y = interaction.startCoords.page.y;\n interaction.curCoords.client.y = interaction.startCoords.client.y;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vx);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vx);\n interaction.pointerDelta.client.vy = 0;\n interaction.pointerDelta.page.vy = 0;\n }\n else if (axis === 'y') {\n interaction.curCoords.page.x = interaction.startCoords.page.x;\n interaction.curCoords.client.x = interaction.startCoords.client.x;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vy);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vy);\n interaction.pointerDelta.client.vx = 0;\n interaction.pointerDelta.page.vx = 0;\n }\n});\n\n// dragmove\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'dragmove') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n iEvent.pageY = interaction.startCoords.page.y;\n iEvent.clientY = interaction.startCoords.client.y;\n iEvent.dy = 0;\n }\n else if (axis === 'y') {\n iEvent.pageX = interaction.startCoords.page.x;\n iEvent.clientX = interaction.startCoords.client.x;\n iEvent.dx = 0;\n }\n});\n\n/*\\\n * Interactable.draggable\n [ method ]\n *\n * Gets or sets whether drag actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of drag events\n | var isDraggable = interact('ul li').draggable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on drag events (object makes the Interactable draggable)\n = (object) This Interactable\n | interact(element).draggable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // the axis in which the first movement must be\n | // for the drag sequence to start\n | // 'xy' by default - any direction\n | startAxis: 'x' || 'y' || 'xy',\n |\n | // 'xy' by default - don't restrict to one axis (move in any direction)\n | // 'x' or 'y' to restrict movement to either axis\n | // 'start' to restrict movement to the axis the drag started in\n | lockAxis: 'x' || 'y' || 'xy' || 'start',\n |\n | // max number of drags that can happen concurrently\n | // with elements of this Interactable. Infinity by default\n | max: Infinity,\n |\n | // max number of drags that can target the same element+Interactable\n | // 1 by default\n | maxPerElement: 2\n | });\n\\*/\nInteractable.prototype.draggable = function (options) {\n if (utils.is.object(options)) {\n this.options.drag.enabled = options.enabled === false? false: true;\n this.setPerAction('drag', options);\n this.setOnEvents('drag', options);\n\n if (/^(xy|x|y|start)$/.test(options.lockAxis)) {\n this.options.drag.lockAxis = options.lockAxis;\n }\n if (/^(xy|x|y)$/.test(options.startAxis)) {\n this.options.drag.startAxis = options.startAxis;\n }\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drag.enabled = options;\n\n if (!options) {\n this.ondragstart = this.ondragstart = this.ondragend = null;\n }\n\n return this;\n }\n\n return this.options.drag;\n};\n\nactions.drag = drag;\nactions.names.push('drag');\nutils.merge(Interactable.eventTypes, [\n 'dragstart',\n 'dragmove',\n 'draginertiastart',\n 'draginertiaresume',\n 'dragend',\n]);\nactions.methodDict.drag = 'draggable';\n\ndefaultOptions.drag = drag.defaults;\n\nmodule.exports = drag;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst scope = require('../scope');\nconst interact = require('../interact');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drop = {\n defaults: {\n enabled: false,\n accept : null,\n overlap: 'pointer',\n },\n};\n\nlet dynamicDrop = false;\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // reset active dropzones\n interaction.activeDrops.dropzones = [];\n interaction.activeDrops.elements = [];\n interaction.activeDrops.rects = [];\n\n interaction.dropEvents = null;\n\n if (!interaction.dynamicDrop) {\n setActiveDrops(interaction, interaction.element);\n }\n\n const dragEvent = interaction.prevEvent;\n const dropEvents = getDropEvents(interaction, event, dragEvent);\n\n if (dropEvents.activate) {\n fireActiveDrops(interaction, dropEvents.activate);\n }\n});\n\nInteractEvent.signals.on('new', function ({ interaction, iEvent, event }) {\n if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { return; }\n\n const draggableElement = interaction.element;\n const dragEvent = iEvent;\n const dropResult = getDrop(dragEvent, event, draggableElement);\n\n interaction.dropTarget = dropResult.dropzone;\n interaction.dropElement = dropResult.element;\n\n interaction.dropEvents = getDropEvents(interaction, event, dragEvent);\n});\n\nInteraction.signals.on('action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n fireDropEvents(interaction, interaction.dropEvents);\n});\n\nInteraction.signals.on('action-end', function ({ interaction }) {\n if (interaction.prepared.name === 'drag') {\n fireDropEvents(interaction, interaction.dropEvents);\n }\n});\n\nInteraction.signals.on('stop-drag', function ({ interaction }) {\n interaction.activeDrops.dropzones =\n interaction.activeDrops.elements =\n interaction.activeDrops.rects =\n interaction.dropEvents = null;\n});\n\nfunction collectDrops (interaction, element) {\n const drops = [];\n const elements = [];\n\n element = element || interaction.element;\n\n // collect all dropzones and their elements which qualify for a drop\n for (const current of scope.interactables) {\n if (!current.options.drop.enabled) { continue; }\n\n const accept = current.options.drop.accept;\n\n // test the draggable element against the dropzone's accept setting\n if ((utils.is.element(accept) && accept !== element)\n || (utils.is.string(accept)\n && !utils.matchesSelector(element, accept))) {\n\n continue;\n }\n\n // query for new elements if necessary\n const dropElements = utils.is.string(current.target)\n ? current._context.querySelectorAll(current.target)\n : [current.target];\n\n for (let i = 0; i < dropElements.length; i++) {\n const currentElement = dropElements[i];\n\n if (currentElement !== element) {\n drops.push(current);\n elements.push(currentElement);\n }\n }\n }\n\n return {\n elements,\n dropzones: drops,\n };\n}\n\nfunction fireActiveDrops (interaction, event) {\n let prevElement;\n\n // loop through all active dropzones and trigger event\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n const current = interaction.activeDrops.dropzones[i];\n const currentElement = interaction.activeDrops.elements [i];\n\n // prevent trigger of duplicate events on same element\n if (currentElement !== prevElement) {\n // set current element as event target\n event.target = currentElement;\n current.fire(event);\n }\n prevElement = currentElement;\n }\n}\n\n// Collect a new set of possible drops and save them in activeDrops.\n// setActiveDrops should always be called when a drag has just started or a\n// drag event happens while dynamicDrop is true\nfunction setActiveDrops (interaction, dragElement) {\n // get dropzones and their elements that could receive the draggable\n const possibleDrops = collectDrops(interaction, dragElement, true);\n\n interaction.activeDrops.dropzones = possibleDrops.dropzones;\n interaction.activeDrops.elements = possibleDrops.elements;\n interaction.activeDrops.rects = [];\n\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n interaction.activeDrops.rects[i] =\n interaction.activeDrops.dropzones[i].getRect(interaction.activeDrops.elements[i]);\n }\n}\n\nfunction getDrop (dragEvent, event, dragElement) {\n const interaction = dragEvent.interaction;\n const validDrops = [];\n\n if (dynamicDrop) {\n setActiveDrops(interaction, dragElement);\n }\n\n // collect all dropzones and their elements which qualify for a drop\n for (let j = 0; j < interaction.activeDrops.dropzones.length; j++) {\n const current = interaction.activeDrops.dropzones[j];\n const currentElement = interaction.activeDrops.elements [j];\n const rect = interaction.activeDrops.rects [j];\n\n validDrops.push(current.dropCheck(dragEvent, event, interaction.target, dragElement, currentElement, rect)\n ? currentElement\n : null);\n }\n\n // get the most appropriate dropzone based on DOM depth and order\n const dropIndex = utils.indexOfDeepestElement(validDrops);\n\n return {\n dropzone: interaction.activeDrops.dropzones[dropIndex] || null,\n element : interaction.activeDrops.elements [dropIndex] || null,\n };\n}\n\nfunction getDropEvents (interaction, pointerEvent, dragEvent) {\n const dropEvents = {\n enter : null,\n leave : null,\n activate : null,\n deactivate: null,\n move : null,\n drop : null,\n };\n\n const tmpl = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n };\n\n if (interaction.dropElement !== interaction.prevDropElement) {\n // if there was a prevDropTarget, create a dragleave event\n if (interaction.prevDropTarget) {\n dropEvents.leave = utils.extend({ type: 'dragleave' }, tmpl);\n\n dragEvent.dragLeave = dropEvents.leave.target = interaction.prevDropElement;\n dragEvent.prevDropzone = dropEvents.leave.dropzone = interaction.prevDropTarget;\n }\n // if the dropTarget is not null, create a dragenter event\n if (interaction.dropTarget) {\n dropEvents.enter = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n type : 'dragenter',\n };\n\n dragEvent.dragEnter = interaction.dropElement;\n dragEvent.dropzone = interaction.dropTarget;\n }\n }\n\n if (dragEvent.type === 'dragend' && interaction.dropTarget) {\n dropEvents.drop = utils.extend({ type: 'drop' }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n dragEvent.relatedTarget = interaction.dropElement;\n }\n if (dragEvent.type === 'dragstart') {\n dropEvents.activate = utils.extend({ type: 'dropactivate' }, tmpl);\n\n dropEvents.activate.target = null;\n dropEvents.activate.dropzone = null;\n }\n if (dragEvent.type === 'dragend') {\n dropEvents.deactivate = utils.extend({ type: 'dropdeactivate' }, tmpl);\n\n dropEvents.deactivate.target = null;\n dropEvents.deactivate.dropzone = null;\n }\n if (dragEvent.type === 'dragmove' && interaction.dropTarget) {\n dropEvents.move = utils.extend({\n dragmove : dragEvent,\n type : 'dropmove',\n }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n }\n\n return dropEvents;\n}\n\nfunction fireDropEvents (interaction, dropEvents) {\n if (dropEvents.leave) { interaction.prevDropTarget.fire(dropEvents.leave); }\n if (dropEvents.move ) { interaction.dropTarget.fire(dropEvents.move ); }\n if (dropEvents.enter) { interaction.dropTarget.fire(dropEvents.enter); }\n if (dropEvents.drop ) { interaction.dropTarget.fire(dropEvents.drop ); }\n if (dropEvents.deactivate) {\n fireActiveDrops(interaction, dropEvents.deactivate);\n }\n\n interaction.prevDropTarget = interaction.dropTarget;\n interaction.prevDropElement = interaction.dropElement;\n}\n\n/*\\\n * Interactable.dropzone\n [ method ]\n *\n * Returns or sets whether elements can be dropped onto this\n * Interactable to trigger drop events\n *\n * Dropzones can receive the following events:\n * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends\n * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone\n * - `dragmove` when a draggable that has entered the dropzone is moved\n * - `drop` when a draggable is dropped into this dropzone\n *\n * Use the `accept` option to allow only elements that match the given CSS\n * selector or element. The value can be:\n *\n * - **an Element** - only that element can be dropped into this dropzone.\n * - **a string**, - the element being dragged must match it as a CSS selector.\n * - **`null`** - accept options is cleared - it accepts any element.\n *\n * Use the `overlap` option to set how drops are checked for. The allowed\n * values are:\n *\n * - `'pointer'`, the pointer must be over the dropzone (default)\n * - `'center'`, the draggable element's center must be over the dropzone\n * - a number from 0-1 which is the `(intersection area) / (draggable area)`.\n * e.g. `0.5` for drop to happen when half of the area of the draggable is\n * over the dropzone\n *\n * Use the `checker` option to specify a function to check if a dragged\n * element is over this Interactable.\n *\n | interact(target)\n | .dropChecker(function(dragEvent, // related dragmove or dragend event\n | event, // TouchEvent/PointerEvent/MouseEvent\n | dropped, // bool result of the default checker\n | dropzone, // dropzone Interactable\n | dropElement, // dropzone elemnt\n | draggable, // draggable Interactable\n | draggableElement) {// draggable element\n |\n | return dropped && event.target.hasAttribute('allow-drop');\n | }\n *\n *\n - options (boolean | object | null) #optional The new value to be set.\n | interact('.drop').dropzone({\n | accept: '.can-drop' || document.getElementById('single-drop'),\n | overlap: 'pointer' || 'center' || zeroToOne\n | }\n = (boolean | object) The current setting or this Interactable\n\\*/\nInteractable.prototype.dropzone = function (options) {\n if (utils.is.object(options)) {\n this.options.drop.enabled = options.enabled === false? false: true;\n\n if (utils.is.function(options.ondrop) ) { this.events.ondrop = options.ondrop ; }\n if (utils.is.function(options.ondropactivate) ) { this.events.ondropactivate = options.ondropactivate ; }\n if (utils.is.function(options.ondropdeactivate)) { this.events.ondropdeactivate = options.ondropdeactivate; }\n if (utils.is.function(options.ondragenter) ) { this.events.ondragenter = options.ondragenter ; }\n if (utils.is.function(options.ondragleave) ) { this.events.ondragleave = options.ondragleave ; }\n if (utils.is.function(options.ondropmove) ) { this.events.ondropmove = options.ondropmove ; }\n\n if (/^(pointer|center)$/.test(options.overlap)) {\n this.options.drop.overlap = options.overlap;\n }\n else if (utils.is.number(options.overlap)) {\n this.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0);\n }\n if ('accept' in options) {\n this.options.drop.accept = options.accept;\n }\n if ('checker' in options) {\n this.options.drop.checker = options.checker;\n }\n\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drop.enabled = options;\n\n if (!options) {\n this.ondragenter = this.ondragleave = this.ondrop\n = this.ondropactivate = this.ondropdeactivate = null;\n }\n\n return this;\n }\n\n return this.options.drop;\n};\n\nInteractable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) {\n let dropped = false;\n\n // if the dropzone has no rect (eg. display: none)\n // call the custom dropChecker or just return false\n if (!(rect = rect || this.getRect(dropElement))) {\n return (this.options.drop.checker\n ? this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement)\n : false);\n }\n\n const dropOverlap = this.options.drop.overlap;\n\n if (dropOverlap === 'pointer') {\n const origin = utils.getOriginXY(draggable, draggableElement, 'drag');\n const page = utils.getPageXY(dragEvent);\n\n page.x += origin.x;\n page.y += origin.y;\n\n const horizontal = (page.x > rect.left) && (page.x < rect.right);\n const vertical = (page.y > rect.top ) && (page.y < rect.bottom);\n\n dropped = horizontal && vertical;\n }\n\n const dragRect = draggable.getRect(draggableElement);\n\n if (dragRect && dropOverlap === 'center') {\n const cx = dragRect.left + dragRect.width / 2;\n const cy = dragRect.top + dragRect.height / 2;\n\n dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom;\n }\n\n if (dragRect && utils.is.number(dropOverlap)) {\n const overlapArea = (Math.max(0, Math.min(rect.right , dragRect.right ) - Math.max(rect.left, dragRect.left))\n * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top , dragRect.top )));\n\n const overlapRatio = overlapArea / (dragRect.width * dragRect.height);\n\n dropped = overlapRatio >= dropOverlap;\n }\n\n if (this.options.drop.checker) {\n dropped = this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement);\n }\n\n return dropped;\n};\n\nInteractable.signals.on('unset', function ({ interactable }) {\n interactable.dropzone(false);\n});\n\nInteractable.settingsMethods.push('dropChecker');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.dropTarget = null; // the dropzone a drag target might be dropped into\n interaction.dropElement = null; // the element at the time of checking\n interaction.prevDropTarget = null; // the dropzone that was recently dragged away from\n interaction.prevDropElement = null; // the element at the time of checking\n interaction.dropEvents = null; // the dropEvents related to the current drag event\n\n interaction.activeDrops = {\n dropzones: [], // the dropzones that are mentioned below\n elements : [], // elements of dropzones that accept the target draggable\n rects : [], // the rects of the elements mentioned above\n };\n\n});\n\nInteraction.signals.on('stop', function ({ interaction }) {\n interaction.dropTarget = interaction.dropElement =\n interaction.prevDropTarget = interaction.prevDropElement = null;\n});\n\n/*\\\n * interact.dynamicDrop\n [ method ]\n *\n * Returns or sets whether the dimensions of dropzone elements are\n * calculated on every dragmove or only on dragstart for the default\n * dropChecker\n *\n - newValue (boolean) #optional True to check on each move. False to check only before start\n = (boolean | interact) The current setting or interact\n\\*/\ninteract.dynamicDrop = function (newValue) {\n if (utils.is.bool(newValue)) {\n //if (dragging && dynamicDrop !== newValue && !newValue) {\n //calcRects(dropzones);\n //}\n\n dynamicDrop = newValue;\n\n return interact;\n }\n return dynamicDrop;\n};\n\nutils.merge(Interactable.eventTypes, [\n 'dragenter',\n 'dragleave',\n 'dropactivate',\n 'dropdeactivate',\n 'dropmove',\n 'drop',\n]);\nactions.methodDict.drop = 'dropzone';\n\ndefaultOptions.drop = drop.defaults;\n\nmodule.exports = drop;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst gesture = {\n defaults: {\n enabled : false,\n origin : null,\n restrict: null,\n },\n\n checker: function (pointer, event, interactable, element, interaction) {\n if (interaction.pointerIds.length >= 2) {\n return { name: 'gesture' };\n }\n\n return null;\n },\n\n getCursor: function () {\n return '';\n },\n};\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturestart') { return; }\n iEvent.ds = 0;\n\n interaction.gesture.startDistance = interaction.gesture.prevDistance = iEvent.distance;\n interaction.gesture.startAngle = interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.scale = 1;\n});\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturemove') { return; }\n\n iEvent.ds = iEvent.scale - interaction.gesture.scale;\n\n interaction.target.fire(iEvent);\n\n interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.prevDistance = iEvent.distance;\n\n if (iEvent.scale !== Infinity\n && iEvent.scale !== null\n && iEvent.scale !== undefined\n && !isNaN(iEvent.scale)) {\n\n interaction.gesture.scale = iEvent.scale;\n }\n});\n\n/*\\\n * Interactable.gesturable\n [ method ]\n *\n * Gets or sets whether multitouch gestures can be performed on the\n * Interactable's element\n *\n = (boolean) Indicates if this can be the target of gesture events\n | var isGestureable = interact(element).gesturable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on gesture events (makes the Interactable gesturable)\n = (object) this Interactable\n | interact(element).gesturable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // limit multiple gestures.\n | // See the explanation in @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n\\*/\nInteractable.prototype.gesturable = function (options) {\n if (utils.is.object(options)) {\n this.options.gesture.enabled = options.enabled === false? false: true;\n this.setPerAction('gesture', options);\n this.setOnEvents('gesture', options);\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.gesture.enabled = options;\n\n if (!options) {\n this.ongesturestart = this.ongesturestart = this.ongestureend = null;\n }\n\n return this;\n }\n\n return this.options.gesture;\n};\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action, event, starting, ending, deltaSource }) {\n if (action !== 'gesture') { return; }\n\n const pointers = interaction.pointers;\n\n iEvent.touches = [pointers[0], pointers[1]];\n\n if (starting) {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = 1;\n iEvent.ds = 0;\n iEvent.angle = utils.touchAngle(pointers, undefined, deltaSource);\n iEvent.da = 0;\n }\n else if (ending || event instanceof InteractEvent) {\n iEvent.distance = interaction.prevEvent.distance;\n iEvent.box = interaction.prevEvent.box;\n iEvent.scale = interaction.prevEvent.scale;\n iEvent.ds = iEvent.scale - 1;\n iEvent.angle = interaction.prevEvent.angle;\n iEvent.da = iEvent.angle - interaction.gesture.startAngle;\n }\n else {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = iEvent.distance / interaction.gesture.startDistance;\n iEvent.angle = utils.touchAngle(pointers, interaction.gesture.prevAngle, deltaSource);\n\n iEvent.ds = iEvent.scale - interaction.gesture.prevScale;\n iEvent.da = iEvent.angle - interaction.gesture.prevAngle;\n }\n});\n\nInteraction.signals.on('new', function (interaction) {\n interaction.gesture = {\n start: { x: 0, y: 0 },\n\n startDistance: 0, // distance between two touches of touchStart\n prevDistance : 0,\n distance : 0,\n\n scale: 1, // gesture.distance / gesture.startDistance\n\n startAngle: 0, // angle of line joining two touches\n prevAngle : 0, // angle of the previous gesture event\n };\n});\n\nactions.gesture = gesture;\nactions.names.push('gesture');\nutils.merge(Interactable.eventTypes, [\n 'gesturestart',\n 'gesturemove',\n 'gestureend',\n]);\nactions.methodDict.gesture = 'gesturable';\n\ndefaultOptions.gesture = gesture.defaults;\n\nmodule.exports = gesture;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\n// Less Precision with touch input\nconst defaultMargin = browser.supportsTouch || browser.supportsPointerEvent? 20: 10;\n\nconst resize = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n square: false,\n preserveAspectRatio: false,\n axis: 'xy',\n\n // use default margin\n margin: NaN,\n\n // object with props left, right, top, bottom which are\n // true/false values to resize when the pointer is over that edge,\n // CSS selectors to match the handles for each direction\n // or the Elements for each handle\n edges: null,\n\n // a value of 'none' will limit the resize rect to a minimum of 0x0\n // 'negate' will alow the rect to have negative width/height\n // 'reposition' will keep the width/height positive by swapping\n // the top and bottom edges and/or swapping the left and right edges\n invert: 'none',\n },\n\n checker: function (pointer, event, interactable, element, interaction, rect) {\n if (!rect) { return null; }\n\n const page = utils.extend({}, interaction.curCoords.page);\n const options = interactable.options;\n\n if (options.resize.enabled) {\n const resizeOptions = options.resize;\n const resizeEdges = { left: false, right: false, top: false, bottom: false };\n\n // if using resize.edges\n if (utils.is.object(resizeOptions.edges)) {\n for (const edge in resizeEdges) {\n resizeEdges[edge] = checkResizeEdge(edge,\n resizeOptions.edges[edge],\n page,\n interaction._eventTarget,\n element,\n rect,\n resizeOptions.margin || defaultMargin);\n }\n\n resizeEdges.left = resizeEdges.left && !resizeEdges.right;\n resizeEdges.top = resizeEdges.top && !resizeEdges.bottom;\n\n if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) {\n return {\n name: 'resize',\n edges: resizeEdges,\n };\n }\n }\n else {\n const right = options.resize.axis !== 'y' && page.x > (rect.right - defaultMargin);\n const bottom = options.resize.axis !== 'x' && page.y > (rect.bottom - defaultMargin);\n\n if (right || bottom) {\n return {\n name: 'resize',\n axes: (right? 'x' : '') + (bottom? 'y' : ''),\n };\n }\n }\n }\n\n return null;\n },\n\n cursors: (browser.isIe9OrOlder ? {\n x : 'e-resize',\n y : 's-resize',\n xy: 'se-resize',\n\n top : 'n-resize',\n left : 'w-resize',\n bottom : 's-resize',\n right : 'e-resize',\n topleft : 'se-resize',\n bottomright: 'se-resize',\n topright : 'ne-resize',\n bottomleft : 'ne-resize',\n } : {\n x : 'ew-resize',\n y : 'ns-resize',\n xy: 'nwse-resize',\n\n top : 'ns-resize',\n left : 'ew-resize',\n bottom : 'ns-resize',\n right : 'ew-resize',\n topleft : 'nwse-resize',\n bottomright: 'nwse-resize',\n topright : 'nesw-resize',\n bottomleft : 'nesw-resize',\n }),\n\n getCursor: function (action) {\n if (action.axis) {\n return resize.cursors[action.name + action.axis];\n }\n else if (action.edges) {\n let cursorKey = '';\n const edgeNames = ['top', 'bottom', 'left', 'right'];\n\n for (let i = 0; i < 4; i++) {\n if (action.edges[edgeNames[i]]) {\n cursorKey += edgeNames[i];\n }\n }\n\n return resize.cursors[cursorKey];\n }\n },\n};\n\n// resizestart\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'resizestart' || !interaction.prepared.edges) {\n return;\n }\n\n const startRect = interaction.target.getRect(interaction.element);\n const resizeOptions = interaction.target.options.resize;\n\n /*\n * When using the `resizable.square` or `resizable.preserveAspectRatio` options, resizing from one edge\n * will affect another. E.g. with `resizable.square`, resizing to make the right edge larger will make\n * the bottom edge larger by the same amount. We call these 'linked' edges. Any linked edges will depend\n * on the active edges and the edge being interacted with.\n */\n if (resizeOptions.square || resizeOptions.preserveAspectRatio) {\n const linkedEdges = utils.extend({}, interaction.prepared.edges);\n\n linkedEdges.top = linkedEdges.top || (linkedEdges.left && !linkedEdges.bottom);\n linkedEdges.left = linkedEdges.left || (linkedEdges.top && !linkedEdges.right );\n linkedEdges.bottom = linkedEdges.bottom || (linkedEdges.right && !linkedEdges.top );\n linkedEdges.right = linkedEdges.right || (linkedEdges.bottom && !linkedEdges.left );\n\n interaction.prepared._linkedEdges = linkedEdges;\n }\n else {\n interaction.prepared._linkedEdges = null;\n }\n\n // if using `resizable.preserveAspectRatio` option, record aspect ratio at the start of the resize\n if (resizeOptions.preserveAspectRatio) {\n interaction.resizeStartAspectRatio = startRect.width / startRect.height;\n }\n\n interaction.resizeRects = {\n start : startRect,\n current : utils.extend({}, startRect),\n inverted : utils.extend({}, startRect),\n previous : utils.extend({}, startRect),\n delta : {\n left: 0, right : 0, width : 0,\n top : 0, bottom: 0, height: 0,\n },\n };\n\n iEvent.rect = interaction.resizeRects.inverted;\n iEvent.deltaRect = interaction.resizeRects.delta;\n});\n\n// resizemove\nInteractEvent.signals.on('new', function ({ iEvent, phase, interaction }) {\n if (phase !== 'move' || !interaction.prepared.edges) { return; }\n\n const resizeOptions = interaction.target.options.resize;\n const invert = resizeOptions.invert;\n const invertible = invert === 'reposition' || invert === 'negate';\n\n let edges = interaction.prepared.edges;\n\n const start = interaction.resizeRects.start;\n const current = interaction.resizeRects.current;\n const inverted = interaction.resizeRects.inverted;\n const delta = interaction.resizeRects.delta;\n const previous = utils.extend(interaction.resizeRects.previous, inverted);\n const originalEdges = edges;\n\n let dx = iEvent.dx;\n let dy = iEvent.dy;\n\n if (resizeOptions.preserveAspectRatio || resizeOptions.square) {\n // `resize.preserveAspectRatio` takes precedence over `resize.square`\n const startAspectRatio = resizeOptions.preserveAspectRatio\n ? interaction.resizeStartAspectRatio\n : 1;\n\n edges = interaction.prepared._linkedEdges;\n\n if ((originalEdges.left && originalEdges.bottom)\n || (originalEdges.right && originalEdges.top)) {\n dy = -dx / startAspectRatio;\n }\n else if (originalEdges.left || originalEdges.right ) { dy = dx / startAspectRatio; }\n else if (originalEdges.top || originalEdges.bottom) { dx = dy * startAspectRatio; }\n }\n\n // update the 'current' rect without modifications\n if (edges.top ) { current.top += dy; }\n if (edges.bottom) { current.bottom += dy; }\n if (edges.left ) { current.left += dx; }\n if (edges.right ) { current.right += dx; }\n\n if (invertible) {\n // if invertible, copy the current rect\n utils.extend(inverted, current);\n\n if (invert === 'reposition') {\n // swap edge values if necessary to keep width/height positive\n let swap;\n\n if (inverted.top > inverted.bottom) {\n swap = inverted.top;\n\n inverted.top = inverted.bottom;\n inverted.bottom = swap;\n }\n if (inverted.left > inverted.right) {\n swap = inverted.left;\n\n inverted.left = inverted.right;\n inverted.right = swap;\n }\n }\n }\n else {\n // if not invertible, restrict to minimum of 0x0 rect\n inverted.top = Math.min(current.top, start.bottom);\n inverted.bottom = Math.max(current.bottom, start.top);\n inverted.left = Math.min(current.left, start.right);\n inverted.right = Math.max(current.right, start.left);\n }\n\n inverted.width = inverted.right - inverted.left;\n inverted.height = inverted.bottom - inverted.top ;\n\n for (const edge in inverted) {\n delta[edge] = inverted[edge] - previous[edge];\n }\n\n iEvent.edges = interaction.prepared.edges;\n iEvent.rect = inverted;\n iEvent.deltaRect = delta;\n});\n\n/*\\\n * Interactable.resizable\n [ method ]\n *\n * Gets or sets whether resize actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of resize elements\n | var isResizeable = interact('input[type=text]').resizable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on resize events (object makes the Interactable resizable)\n = (object) This Interactable\n | interact(element).resizable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | edges: {\n | top : true, // Use pointer coords to check for resize.\n | left : false, // Disable resizing from left edge.\n | bottom: '.resize-s',// Resize if pointer target matches selector\n | right : handleEl // Resize if pointer target is the given Element\n | },\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height are adjusted at a 1:1 ratio.\n | square: false,\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height maintain the aspect ratio they had when resizing started.\n | preserveAspectRatio: false,\n |\n | // a value of 'none' will limit the resize rect to a minimum of 0x0\n | // 'negate' will allow the rect to have negative width/height\n | // 'reposition' will keep the width/height positive by swapping\n | // the top and bottom edges and/or swapping the left and right edges\n | invert: 'none' || 'negate' || 'reposition'\n |\n | // limit multiple resizes.\n | // See the explanation in the @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n \\*/\nInteractable.prototype.resizable = function (options) {\n if (utils.is.object(options)) {\n this.options.resize.enabled = options.enabled === false? false: true;\n this.setPerAction('resize', options);\n this.setOnEvents('resize', options);\n\n if (/^x$|^y$|^xy$/.test(options.axis)) {\n this.options.resize.axis = options.axis;\n }\n else if (options.axis === null) {\n this.options.resize.axis = defaultOptions.resize.axis;\n }\n\n if (utils.is.bool(options.preserveAspectRatio)) {\n this.options.resize.preserveAspectRatio = options.preserveAspectRatio;\n }\n else if (utils.is.bool(options.square)) {\n this.options.resize.square = options.square;\n }\n\n return this;\n }\n if (utils.is.bool(options)) {\n this.options.resize.enabled = options;\n\n if (!options) {\n this.onresizestart = this.onresizestart = this.onresizeend = null;\n }\n\n return this;\n }\n return this.options.resize;\n};\n\nfunction checkResizeEdge (name, value, page, element, interactableElement, rect, margin) {\n // false, '', undefined, null\n if (!value) { return false; }\n\n // true value, use pointer coords and element rect\n if (value === true) {\n // if dimensions are negative, \"switch\" edges\n const width = utils.is.number(rect.width )? rect.width : rect.right - rect.left;\n const height = utils.is.number(rect.height)? rect.height : rect.bottom - rect.top ;\n\n if (width < 0) {\n if (name === 'left' ) { name = 'right'; }\n else if (name === 'right') { name = 'left' ; }\n }\n if (height < 0) {\n if (name === 'top' ) { name = 'bottom'; }\n else if (name === 'bottom') { name = 'top' ; }\n }\n\n if (name === 'left' ) { return page.x < ((width >= 0? rect.left: rect.right ) + margin); }\n if (name === 'top' ) { return page.y < ((height >= 0? rect.top : rect.bottom) + margin); }\n\n if (name === 'right' ) { return page.x > ((width >= 0? rect.right : rect.left) - margin); }\n if (name === 'bottom') { return page.y > ((height >= 0? rect.bottom: rect.top ) - margin); }\n }\n\n // the remaining checks require an element\n if (!utils.is.element(element)) { return false; }\n\n return utils.is.element(value)\n // the value is an element to use as a resize handle\n ? value === element\n // otherwise check if element matches value as selector\n : utils.matchesUpTo(element, value, interactableElement);\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.resizeAxes = 'xy';\n});\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action }) {\n if (action !== 'resize' || !interaction.resizeAxes) { return; }\n\n const options = interaction.target.options;\n\n if (options.resize.square) {\n if (interaction.resizeAxes === 'y') {\n iEvent.dx = iEvent.dy;\n }\n else {\n iEvent.dy = iEvent.dx;\n }\n iEvent.axes = 'xy';\n }\n else {\n iEvent.axes = interaction.resizeAxes;\n\n if (interaction.resizeAxes === 'x') {\n iEvent.dy = 0;\n }\n else if (interaction.resizeAxes === 'y') {\n iEvent.dx = 0;\n }\n }\n});\n\nactions.resize = resize;\nactions.names.push('resize');\nutils.merge(Interactable.eventTypes, [\n 'resizestart',\n 'resizemove',\n 'resizeinertiastart',\n 'resizeinertiaresume',\n 'resizeend',\n]);\nactions.methodDict.resize = 'resizable';\n\ndefaultOptions.resize = resize.defaults;\n\nmodule.exports = resize;\n","const raf = require('./utils/raf');\nconst getWindow = require('./utils/window').getWindow;\nconst is = require('./utils/is');\nconst domUtils = require('./utils/domUtils');\nconst Interaction = require('./Interaction');\nconst defaultOptions = require('./defaultOptions');\n\nconst autoScroll = {\n defaults: {\n enabled : false,\n container: null, // the item that is scrolled (Window or HTMLElement)\n margin : 60,\n speed : 300, // the scroll speed in pixels per second\n },\n\n interaction: null,\n i: null, // the handle returned by window.setInterval\n x: 0, y: 0, // Direction each pulse is to scroll in\n\n isScrolling: false,\n prevTime: 0,\n\n start: function (interaction) {\n autoScroll.isScrolling = true;\n raf.cancel(autoScroll.i);\n\n autoScroll.interaction = interaction;\n autoScroll.prevTime = new Date().getTime();\n autoScroll.i = raf.request(autoScroll.scroll);\n },\n\n stop: function () {\n autoScroll.isScrolling = false;\n raf.cancel(autoScroll.i);\n },\n\n // scroll the window by the values in scroll.x/y\n scroll: function () {\n const options = autoScroll.interaction.target.options[autoScroll.interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(autoScroll.interaction.element);\n const now = new Date().getTime();\n // change in time in seconds\n const dt = (now - autoScroll.prevTime) / 1000;\n // displacement\n const s = options.speed * dt;\n\n if (s >= 1) {\n if (is.window(container)) {\n container.scrollBy(autoScroll.x * s, autoScroll.y * s);\n }\n else if (container) {\n container.scrollLeft += autoScroll.x * s;\n container.scrollTop += autoScroll.y * s;\n }\n\n autoScroll.prevTime = now;\n }\n\n if (autoScroll.isScrolling) {\n raf.cancel(autoScroll.i);\n autoScroll.i = raf.request(autoScroll.scroll);\n }\n },\n check: function (interactable, actionName) {\n const options = interactable.options;\n\n return options[actionName].autoScroll && options[actionName].autoScroll.enabled;\n },\n onInteractionMove: function ({ interaction, pointer }) {\n if (!(interaction.interacting()\n && autoScroll.check(interaction.target, interaction.prepared.name))) {\n return;\n }\n\n if (interaction.simulation) {\n autoScroll.x = autoScroll.y = 0;\n return;\n }\n\n let top;\n let right;\n let bottom;\n let left;\n\n const options = interaction.target.options[interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(interaction.element);\n\n if (is.window(container)) {\n left = pointer.clientX < autoScroll.margin;\n top = pointer.clientY < autoScroll.margin;\n right = pointer.clientX > container.innerWidth - autoScroll.margin;\n bottom = pointer.clientY > container.innerHeight - autoScroll.margin;\n }\n else {\n const rect = domUtils.getElementClientRect(container);\n\n left = pointer.clientX < rect.left + autoScroll.margin;\n top = pointer.clientY < rect.top + autoScroll.margin;\n right = pointer.clientX > rect.right - autoScroll.margin;\n bottom = pointer.clientY > rect.bottom - autoScroll.margin;\n }\n\n autoScroll.x = (right ? 1: left? -1: 0);\n autoScroll.y = (bottom? 1: top? -1: 0);\n\n if (!autoScroll.isScrolling) {\n // set the autoScroll properties to those of the target\n autoScroll.margin = options.margin;\n autoScroll.speed = options.speed;\n\n autoScroll.start(interaction);\n }\n },\n};\n\nInteraction.signals.on('stop-active', function () {\n autoScroll.stop();\n});\n\nInteraction.signals.on('action-move', autoScroll.onInteractionMove);\n\ndefaultOptions.perAction.autoScroll = autoScroll.defaults;\n\nmodule.exports = autoScroll;\n","const Interactable = require('../Interactable');\nconst actions = require('../actions/base');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.ignoreFrom\n [ method ]\n *\n * If the target of the `mousedown`, `pointerdown` or `touchstart`\n * event or any of it's parents match the given CSS selector or\n * Element, no drag/resize/gesture is started.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to not ignore any elements\n = (string | Element | object) The current ignoreFrom value or this Interactable\n **\n | interact(element, { ignoreFrom: document.getElementById('no-action') });\n | // or\n | interact(element).ignoreFrom('input, textarea, a');\n\\*/\nInteractable.prototype.ignoreFrom = function (newValue) {\n return this._backCompatOption('ignoreFrom', newValue);\n};\n\n/*\\\n * Interactable.allowFrom\n [ method ]\n *\n * A drag/resize/gesture is started only If the target of the\n * `mousedown`, `pointerdown` or `touchstart` event or any of it's\n * parents match the given CSS selector or Element.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to allow from any element\n = (string | Element | object) The current allowFrom value or this Interactable\n **\n | interact(element, { allowFrom: document.getElementById('drag-handle') });\n | // or\n | interact(element).allowFrom('.handle');\n\\*/\nInteractable.prototype.allowFrom = function (newValue) {\n return this._backCompatOption('allowFrom', newValue);\n};\n\nInteractable.prototype.testIgnore = function (ignoreFrom, interactableElement, element) {\n if (!ignoreFrom || !is.element(element)) { return false; }\n\n if (is.string(ignoreFrom)) {\n return domUtils.matchesUpTo(element, ignoreFrom, interactableElement);\n }\n else if (is.element(ignoreFrom)) {\n return domUtils.nodeContains(ignoreFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testAllow = function (allowFrom, interactableElement, element) {\n if (!allowFrom) { return true; }\n\n if (!is.element(element)) { return false; }\n\n if (is.string(allowFrom)) {\n return domUtils.matchesUpTo(element, allowFrom, interactableElement);\n }\n else if (is.element(allowFrom)) {\n return domUtils.nodeContains(allowFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testIgnoreAllow = function (options, interactableElement, eventTarget) {\n return (!this.testIgnore(options.ignoreFrom, interactableElement, eventTarget)\n && this.testAllow(options.allowFrom, interactableElement, eventTarget));\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (event.buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\n","const interact = require('../interact');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst actions = require('../actions/base');\nconst defaultOptions = require('../defaultOptions');\nconst browser = require('../utils/browser');\nconst scope = require('../scope');\nconst utils = require('../utils');\nconst signals = require('../utils/Signals').new();\n\nrequire('./InteractableMethods');\n\nconst autoStart = {\n signals,\n withinInteractionLimit,\n // Allow this many interactions to happen simultaneously\n maxInteractions: Infinity,\n defaults: {\n perAction: {\n manualStart: false,\n max: Infinity,\n maxPerElement: 1,\n allowFrom: null,\n ignoreFrom: null,\n },\n },\n setActionDefaults: function (action) {\n utils.extend(action.defaults, autoStart.defaults.perAction);\n },\n};\n\n// set cursor style on mousedown\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget }) {\n if (interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\n// set cursor style on mousemove\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget }) {\n if (!interaction.mouse\n || interaction.pointerIsDown\n || interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\nInteraction.signals.on('move', function (arg) {\n const { interaction, event } = arg;\n\n if (!interaction.pointerIsDown\n || interaction.interacting()\n || !interaction.pointerWasMoved\n || !interaction.prepared.name) {\n return;\n }\n\n signals.fire('before-start', arg);\n\n const target = interaction.target;\n\n if (interaction.prepared.name && target) {\n // check manualStart and interaction limit\n if (target.options[interaction.prepared.name].manualStart\n || !withinInteractionLimit(target, interaction.element, interaction.prepared)) {\n interaction.stop(event);\n }\n else {\n interaction.start(interaction.prepared, target, interaction.element);\n }\n }\n});\n\n// Check if the current target supports the action.\n// If so, return the validated action. Otherwise, return null\nfunction validateAction (action, interactable, element, eventTarget) {\n if (utils.is.object(action)\n && interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget)\n && interactable.options[action.name].enabled\n && withinInteractionLimit(interactable, element, action)) {\n return action;\n }\n\n return null;\n}\n\nfunction validateSelector (interaction, pointer, event, matches, matchElements, eventTarget) {\n for (let i = 0, len = matches.length; i < len; i++) {\n const match = matches[i];\n const matchElement = matchElements[i];\n const action = validateAction(match.getAction(pointer, event, interaction, matchElement),\n match,\n matchElement,\n eventTarget);\n\n if (action) {\n return {\n action,\n target: match,\n element: matchElement,\n };\n }\n }\n\n return {};\n}\n\nfunction getActionInfo (interaction, pointer, event, eventTarget) {\n let matches = [];\n let matchElements = [];\n\n let element = eventTarget;\n let action = null;\n\n function pushMatches (interactable, selector, context) {\n const elements = (browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined);\n\n if (utils.matchesSelector(element, selector, elements)) {\n\n matches.push(interactable);\n matchElements.push(element);\n }\n }\n\n while (utils.is.element(element)) {\n matches = [];\n matchElements = [];\n\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && (action = validateAction(elementInteractable.getAction(pointer, event, interaction, element, eventTarget),\n elementInteractable,\n element,\n eventTarget))\n && !elementInteractable.options[action.name].manualStart) {\n return {\n element,\n action,\n target: elementInteractable,\n };\n }\n else {\n scope.interactables.forEachSelector(pushMatches, element);\n\n const actionInfo = validateSelector(interaction, pointer, event, matches, matchElements, eventTarget);\n\n if (actionInfo.action\n && !actionInfo.target.options[actionInfo.action.name].manualStart) {\n return actionInfo;\n }\n }\n\n element = utils.parentNode(element);\n }\n\n return {};\n}\n\nfunction prepare (interaction, { action, target, element }) {\n action = action || {};\n\n if (interaction.target && interaction.target.options.styleCursor) {\n interaction.target._doc.documentElement.style.cursor = '';\n }\n\n interaction.target = target;\n interaction.element = element;\n utils.copyAction(interaction.prepared, action);\n\n if (target && target.options.styleCursor) {\n const cursor = action? actions[action.name].getCursor(action) : '';\n interaction.target._doc.documentElement.style.cursor = cursor;\n }\n\n signals.fire('prepared', { interaction: interaction });\n}\n\nInteraction.signals.on('stop', function ({ interaction }) {\n const target = interaction.target;\n\n if (target && target.options.styleCursor) {\n target._doc.documentElement.style.cursor = '';\n }\n});\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (utils.is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (utils.is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n const buttons = event.buttons || ({\n 0: 1,\n 1: 4,\n 3: 8,\n 4: 16,\n })[event.button];\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\nfunction withinInteractionLimit (interactable, element, action) {\n const options = interactable.options;\n const maxActions = options[action.name].max;\n const maxPerElement = options[action.name].maxPerElement;\n let activeInteractions = 0;\n let targetCount = 0;\n let targetElementCount = 0;\n\n // no actions if any of these values == 0\n if (!(maxActions && maxPerElement && autoStart.maxInteractions)) { return; }\n\n for (let i = 0, len = scope.interactions.length; i < len; i++) {\n const interaction = scope.interactions[i];\n const otherAction = interaction.prepared.name;\n\n if (!interaction.interacting()) { continue; }\n\n activeInteractions++;\n\n if (activeInteractions >= autoStart.maxInteractions) {\n return false;\n }\n\n if (interaction.target !== interactable) { continue; }\n\n targetCount += (otherAction === action.name)|0;\n\n if (targetCount >= maxActions) {\n return false;\n }\n\n if (interaction.element === element) {\n targetElementCount++;\n\n if (otherAction !== action.name || targetElementCount >= maxPerElement) {\n return false;\n }\n }\n }\n\n return autoStart.maxInteractions > 0;\n}\n\n/*\\\n * interact.maxInteractions\n [ method ]\n **\n * Returns or sets the maximum number of concurrent interactions allowed.\n * By default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables\n * and elements, you need to enable it in the draggable, resizable and\n * gesturable `'max'` and `'maxPerElement'` options.\n **\n - newValue (number) #optional Any number. newValue <= 0 means no interactions.\n\\*/\ninteract.maxInteractions = function (newValue) {\n if (utils.is.number(newValue)) {\n autoStart.maxInteractions = newValue;\n\n return this;\n }\n\n return autoStart.maxInteractions;\n};\n\nInteractable.settingsMethods.push('styleCursor');\nInteractable.settingsMethods.push('actionChecker');\nInteractable.settingsMethods.push('ignoreFrom');\nInteractable.settingsMethods.push('allowFrom');\n\ndefaultOptions.base.actionChecker = null;\ndefaultOptions.base.styleCursor = true;\n\nutils.extend(defaultOptions.perAction, autoStart.defaults.perAction);\n\nmodule.exports = autoStart;\n","const autoStart = require('./base');\nconst Interaction = require('../Interaction');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.delayTimer = null;\n});\n\nautoStart.signals.on('prepared', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.delayTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.target, interaction.element);\n }, delay);\n }\n});\n\nInteraction.signals.on('move', function ({ interaction, duplicate }) {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.delayTimer);\n }\n});\n\n// prevent regular down->move autoStart\nautoStart.signals.on('before-start', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.prepared.name = null;\n }\n});\n","const autoStart = require('./base');\nconst scope = require('../scope');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\n\nconst { matchesSelector, parentNode } = require('../utils/domUtils');\n\nautoStart.setActionDefaults(require('../actions/drag'));\n\nautoStart.signals.on('before-start', function ({ interaction, eventTarget, dx, dy }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // check if a drag is in the correct axis\n const absX = Math.abs(dx);\n const absY = Math.abs(dy);\n const options = interaction.target.options.drag;\n const startAxis = options.startAxis;\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy');\n\n interaction.prepared.axis = options.lockAxis === 'start'\n ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n : options.lockAxis;\n\n // if the movement isn't in the startAxis of the interactable\n if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) {\n // cancel the prepared action\n interaction.prepared.name = null;\n\n // then try to get a drag from another ineractable\n\n if (!interaction.prepared.name) {\n\n let element = eventTarget;\n\n const getDraggable = function (interactable, selector, context) {\n const elements = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n if (interactable === interaction.target) { return; }\n\n if (!options.manualStart\n && !interactable.testIgnoreAllow(options, element, eventTarget)\n && matchesSelector(element, selector, elements)) {\n\n const action = interactable.getAction(interaction.downPointer,\n interaction.downEvent,\n interaction,\n element);\n\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, interactable)\n && autoStart.validateAction(action, interactable, element, eventTarget)) {\n\n return interactable;\n }\n }\n };\n\n let action = null;\n\n // check all interactables\n while (is.element(element)) {\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && elementInteractable !== interaction.target\n && !elementInteractable.options.drag.manualStart) {\n\n action = elementInteractable.getAction(interaction.downPointer, interaction.downEvent, interaction, element);\n }\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, elementInteractable)) {\n\n interaction.prepared.name = 'drag';\n interaction.target = elementInteractable;\n interaction.element = element;\n break;\n }\n\n const selectorInteractable = scope.interactables.forEachSelector(getDraggable, element);\n\n if (selectorInteractable) {\n interaction.prepared.name = 'drag';\n interaction.target = selectorInteractable;\n interaction.element = element;\n break;\n }\n\n element = parentNode(element);\n }\n }\n }\n});\n\nfunction checkStartAxis (startAxis, interactable) {\n if (!interactable) { return false; }\n\n const thisAxis = interactable.options.drag.startAxis;\n\n return (startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis);\n}\n","require('./base').setActionDefaults(require('../actions/gesture'));\n","require('./base').setActionDefaults(require('../actions/resize'));\n","module.exports = {\n base: {\n accept : null,\n preventDefault: 'auto',\n deltaSource : 'page',\n },\n\n perAction: {\n origin: { x: 0, y: 0 },\n\n // only allow left button by default\n // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n mouseButtons: 1,\n\n inertia: {\n enabled : false,\n resistance : 10, // the lambda in exponential decay\n minSpeed : 100, // target speed must be above this for inertia to start\n endSpeed : 10, // the speed at which inertia is slow enough to stop\n allowResume : true, // allow resuming an action in inertia phase\n smoothEndDuration: 300, // animate to snap/restrict endOnly if there's no inertia\n },\n },\n};\n","/* browser entry point */\n\n// Legacy browser support\nrequire('./legacyBrowsers');\n\n// inertia\nrequire('./inertia');\n\n// modifiers\nrequire('./modifiers/snap');\nrequire('./modifiers/restrict');\n\n// pointerEvents\nrequire('./pointerEvents/base');\nrequire('./pointerEvents/holdRepeat');\nrequire('./pointerEvents/interactableTargets');\n\n// delay\nrequire('./autoStart/delay');\n\n// actions\nrequire('./actions/gesture');\nrequire('./actions/resize');\nrequire('./actions/drag');\nrequire('./actions/drop');\n\n// load these modifiers after resize is loaded\nrequire('./modifiers/snapSize');\nrequire('./modifiers/restrictEdges');\nrequire('./modifiers/restrictSize');\n\n// autoStart actions\nrequire('./autoStart/gesture');\nrequire('./autoStart/resize');\nrequire('./autoStart/drag');\n\n// Interactable preventDefault setting\nrequire('./interactablePreventDefault.js');\n\n// autoScroll\nrequire('./autoScroll');\n\n// export interact\nmodule.exports = require('./interact');\n","const InteractEvent = require('./InteractEvent');\nconst Interaction = require('./Interaction');\nconst modifiers = require('./modifiers');\nconst utils = require('./utils');\nconst animationFrame = require('./utils/raf');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.inertiaStatus = {\n active : false,\n smoothEnd : false,\n allowResume: false,\n\n startEvent: null,\n upCoords : {},\n\n xe: 0, ye: 0,\n sx: 0, sy: 0,\n\n t0: 0,\n vx0: 0, vys: 0,\n duration: 0,\n\n lambda_v0: 0,\n one_ve_v0: 0,\n i : null,\n };\n\n interaction.boundInertiaFrame = () => inertiaFrame .apply(interaction);\n interaction.boundSmoothEndFrame = () => smoothEndFrame.apply(interaction);\n});\n\nInteraction.signals.on('down', function ({ interaction, event, pointer, eventTarget }) {\n const status = interaction.inertiaStatus;\n\n // Check if the down event hits the current inertia target\n if (status.active) {\n let element = eventTarget;\n\n // climb up the DOM tree from the event target\n while (utils.is.element(element)) {\n\n // if interaction element is the current inertia target element\n if (element === interaction.element) {\n // stop inertia\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n\n // update pointers to the down event's coordinates\n interaction.updatePointer(pointer);\n utils.setCoords(interaction.curCoords, interaction.pointers);\n\n // fire appropriate signals\n const signalArg = { interaction };\n Interaction.signals.fire('before-action-move', signalArg);\n Interaction.signals.fire('action-resume' , signalArg);\n\n // fire a reume event\n const resumeEvent = new InteractEvent(interaction,\n event,\n interaction.prepared.name,\n 'inertiaresume',\n interaction.element);\n\n interaction.target.fire(resumeEvent);\n interaction.prevEvent = resumeEvent;\n modifiers.resetStatuses(interaction.modifierStatuses);\n\n utils.copyCoords(interaction.prevCoords, interaction.curCoords);\n break;\n }\n\n element = utils.parentNode(element);\n }\n }\n});\n\nInteraction.signals.on('up', function ({ interaction, event }) {\n const status = interaction.inertiaStatus;\n\n if (!interaction.interacting() || status.active) { return; }\n\n const target = interaction.target;\n const options = target && target.options;\n const inertiaOptions = options && interaction.prepared.name && options[interaction.prepared.name].inertia;\n\n const now = new Date().getTime();\n const statuses = {};\n const page = utils.extend({}, interaction.curCoords.page);\n const pointerSpeed = interaction.pointerDelta.client.speed;\n\n let smoothEnd = false;\n let modifierResult;\n\n // check if inertia should be started\n const inertiaPossible = (inertiaOptions && inertiaOptions.enabled\n && interaction.prepared.name !== 'gesture'\n && event !== status.startEvent);\n\n const inertia = (inertiaPossible\n && (now - interaction.curCoords.timeStamp) < 50\n && pointerSpeed > inertiaOptions.minSpeed\n && pointerSpeed > inertiaOptions.endSpeed);\n\n const modifierArg = {\n interaction,\n pageCoords: page,\n statuses,\n preEnd: true,\n requireEndOnly: true,\n };\n\n // smoothEnd\n if (inertiaPossible && !inertia) {\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n if (modifierResult.shouldMove && modifierResult.locked) {\n smoothEnd = true;\n }\n }\n\n if (!(inertia || smoothEnd)) { return; }\n\n utils.copyCoords(status.upCoords, interaction.curCoords);\n\n interaction.pointers[0] = status.startEvent =\n new InteractEvent(interaction, event, interaction.prepared.name, 'inertiastart', interaction.element);\n\n status.t0 = now;\n\n status.active = true;\n status.allowResume = inertiaOptions.allowResume;\n interaction.simulation = status;\n\n target.fire(status.startEvent);\n\n if (inertia) {\n status.vx0 = interaction.pointerDelta.client.vx;\n status.vy0 = interaction.pointerDelta.client.vy;\n status.v0 = pointerSpeed;\n\n calcInertia(interaction, status);\n\n utils.extend(page, interaction.curCoords.page);\n\n page.x += status.xe;\n page.y += status.ye;\n\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n status.modifiedXe += modifierResult.dx;\n status.modifiedYe += modifierResult.dy;\n\n status.i = animationFrame.request(interaction.boundInertiaFrame);\n }\n else {\n status.smoothEnd = true;\n status.xe = modifierResult.dx;\n status.ye = modifierResult.dy;\n\n status.sx = status.sy = 0;\n\n status.i = animationFrame.request(interaction.boundSmoothEndFrame);\n }\n});\n\nInteraction.signals.on('stop-active', function ({ interaction }) {\n const status = interaction.inertiaStatus;\n\n if (status.active) {\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n }\n});\n\nfunction calcInertia (interaction, status) {\n const inertiaOptions = interaction.target.options[interaction.prepared.name].inertia;\n const lambda = inertiaOptions.resistance;\n const inertiaDur = -Math.log(inertiaOptions.endSpeed / status.v0) / lambda;\n\n status.x0 = interaction.prevEvent.pageX;\n status.y0 = interaction.prevEvent.pageY;\n status.t0 = status.startEvent.timeStamp / 1000;\n status.sx = status.sy = 0;\n\n status.modifiedXe = status.xe = (status.vx0 - inertiaDur) / lambda;\n status.modifiedYe = status.ye = (status.vy0 - inertiaDur) / lambda;\n status.te = inertiaDur;\n\n status.lambda_v0 = lambda / status.v0;\n status.one_ve_v0 = 1 - inertiaOptions.endSpeed / status.v0;\n}\n\nfunction inertiaFrame () {\n updateInertiaCoords(this);\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n\n const status = this.inertiaStatus;\n const options = this.target.options[this.prepared.name].inertia;\n const lambda = options.resistance;\n const t = new Date().getTime() / 1000 - status.t0;\n\n if (t < status.te) {\n\n const progress = 1 - (Math.exp(-lambda * t) - status.lambda_v0) / status.one_ve_v0;\n\n if (status.modifiedXe === status.xe && status.modifiedYe === status.ye) {\n status.sx = status.xe * progress;\n status.sy = status.ye * progress;\n }\n else {\n const quadPoint = utils.getQuadraticCurvePoint(0, 0,\n status.xe,\n status.ye,\n status.modifiedXe,\n status.modifiedYe,\n progress);\n\n status.sx = quadPoint.x;\n status.sy = quadPoint.y;\n }\n\n this.doMove();\n\n status.i = animationFrame.request(this.boundInertiaFrame);\n }\n else {\n status.sx = status.modifiedXe;\n status.sy = status.modifiedYe;\n\n this.doMove();\n this.end(status.startEvent);\n status.active = false;\n this.simulation = null;\n }\n\n utils.copyCoords(this.prevCoords, this.curCoords);\n}\n\nfunction smoothEndFrame () {\n updateInertiaCoords(this);\n\n const status = this.inertiaStatus;\n const t = new Date().getTime() - status.t0;\n const duration = this.target.options[this.prepared.name].inertia.smoothEndDuration;\n\n if (t < duration) {\n status.sx = utils.easeOutQuad(t, 0, status.xe, duration);\n status.sy = utils.easeOutQuad(t, 0, status.ye, duration);\n\n this.pointerMove(status.startEvent, status.startEvent);\n\n status.i = animationFrame.request(this.boundSmoothEndFrame);\n }\n else {\n status.sx = status.xe;\n status.sy = status.ye;\n\n this.pointerMove(status.startEvent, status.startEvent);\n this.end(status.startEvent);\n\n status.smoothEnd =\n status.active = false;\n this.simulation = null;\n }\n}\n\nfunction updateInertiaCoords (interaction) {\n const status = interaction.inertiaStatus;\n\n // return if inertia isn't running\n if (!status.active) { return; }\n\n const pageUp = status.upCoords.page;\n const clientUp = status.upCoords.client;\n\n utils.setCoords(interaction.curCoords, [ {\n pageX : pageUp.x + status.sx,\n pageY : pageUp.y + status.sy,\n clientX: clientUp.x + status.sx,\n clientY: clientUp.y + status.sy,\n } ]);\n}\n","const browser = require('./utils/browser');\nconst events = require('./utils/events');\nconst utils = require('./utils');\nconst scope = require('./scope');\nconst Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\n\nconst globalEvents = {};\n\n/*\\\n * interact\n [ method ]\n *\n * The methods of this variable can be used to set elements as\n * interactables and also to change various default settings.\n *\n * Calling it as a function and passing an element or a valid CSS selector\n * string returns an Interactable object which has various methods to\n * configure it.\n *\n - element (Element | string) The HTML or SVG Element to interact with or CSS selector\n = (object) An @Interactable\n *\n > Usage\n | interact('#draggable').draggable(true);\n |\n | var rectables = interact('rect');\n | rectables\n | .gesturable(true)\n | .on('gesturemove', function (event) {\n | // ...\n | });\n\\*/\nfunction interact (element, options) {\n let interactable = scope.interactables.get(element, options);\n\n if (!interactable) {\n interactable = new Interactable(element, options);\n interactable.events.global = globalEvents;\n }\n\n return interactable;\n}\n\n/*\\\n * interact.isSet\n [ method ]\n *\n * Check if an element has been set\n - element (Element) The Element being searched for\n = (boolean) Indicates if the element or CSS selector was previously passed to interact\n\\*/\ninteract.isSet = function (element, options) {\n return scope.interactables.indexOfElement(element, options && options.context) !== -1;\n};\n\n/*\\\n * interact.on\n [ method ]\n *\n * Adds a global listener for an InteractEvent or adds a DOM event to\n * `document`\n *\n - type (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) interact\n\\*/\ninteract.on = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.on(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.on(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n // if it is an InteractEvent type, add listener to globalEvents\n if (utils.contains(Interactable.eventTypes, type)) {\n // if this type of event was never bound\n if (!globalEvents[type]) {\n globalEvents[type] = [listener];\n }\n else {\n globalEvents[type].push(listener);\n }\n }\n // If non InteractEvent type, addEventListener to document\n else {\n events.add(scope.document, type, listener, { options });\n }\n\n return interact;\n};\n\n/*\\\n * interact.off\n [ method ]\n *\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n - type (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) interact\n \\*/\ninteract.off = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.off(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.off(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n if (!utils.contains(Interactable.eventTypes, type)) {\n events.remove(scope.document, type, listener, options);\n }\n else {\n let index;\n\n if (type in globalEvents\n && (index = utils.indexOf(globalEvents[type], listener)) !== -1) {\n globalEvents[type].splice(index, 1);\n }\n }\n\n return interact;\n};\n\n/*\\\n * interact.debug\n [ method ]\n *\n * Returns an object which exposes internal data\n = (object) An object with properties that outline the current state and expose internal functions and variables\n\\*/\ninteract.debug = function () {\n return scope;\n};\n\n// expose the functions used to calculate multi-touch properties\ninteract.getPointerAverage = utils.pointerAverage;\ninteract.getTouchBBox = utils.touchBBox;\ninteract.getTouchDistance = utils.touchDistance;\ninteract.getTouchAngle = utils.touchAngle;\n\ninteract.getElementRect = utils.getElementRect;\ninteract.getElementClientRect = utils.getElementClientRect;\ninteract.matchesSelector = utils.matchesSelector;\ninteract.closest = utils.closest;\n\n/*\\\n * interact.supportsTouch\n [ method ]\n *\n = (boolean) Whether or not the browser supports touch input\n\\*/\ninteract.supportsTouch = function () {\n return browser.supportsTouch;\n};\n\n/*\\\n * interact.supportsPointerEvent\n [ method ]\n *\n = (boolean) Whether or not the browser supports PointerEvents\n\\*/\ninteract.supportsPointerEvent = function () {\n return browser.supportsPointerEvent;\n};\n\n/*\\\n * interact.stop\n [ method ]\n *\n * Cancels all interactions (end events are not fired)\n *\n - event (Event) An event on which to call preventDefault()\n = (object) interact\n\\*/\ninteract.stop = function (event) {\n for (let i = scope.interactions.length - 1; i >= 0; i--) {\n scope.interactions[i].stop(event);\n }\n\n return interact;\n};\n\n/*\\\n * interact.pointerMoveTolerance\n [ method ]\n * Returns or sets the distance the pointer must be moved before an action\n * sequence occurs. This also affects tolerance for tap events.\n *\n - newValue (number) #optional The movement from the start position must be greater than this value\n = (number | Interactable) The current setting or interact\n\\*/\ninteract.pointerMoveTolerance = function (newValue) {\n if (utils.is.number(newValue)) {\n Interaction.pointerMoveTolerance = newValue;\n\n return this;\n }\n\n return Interaction.pointerMoveTolerance;\n};\n\ninteract.addDocument = scope.addDocument;\ninteract.removeDocument = scope.removeDocument;\n\nscope.interact = interact;\n\nmodule.exports = interact;\n","const Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\nconst scope = require('./scope');\nconst is = require('./utils/is');\nconst events = require('./utils/events');\n\nconst { nodeContains, matchesSelector } = require('./utils/domUtils');\n\n/*\\\n * Interactable.preventDefault\n [ method ]\n *\n * Returns or sets whether to prevent the browser's default behaviour\n * in response to pointer events. Can be set to:\n * - `'always'` to always prevent\n * - `'never'` to never prevent\n * - `'auto'` to let interact.js try to determine what would be best\n *\n - newValue (string) #optional `true`, `false` or `'auto'`\n = (string | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.preventDefault = function (newValue) {\n if (/^(always|never|auto)$/.test(newValue)) {\n this.options.preventDefault = newValue;\n return this;\n }\n\n if (is.bool(newValue)) {\n this.options.preventDefault = newValue? 'always' : 'never';\n return this;\n }\n\n return this.options.preventDefault;\n};\n\nInteractable.prototype.checkAndPreventDefault = function (event) {\n const setting = this.options.preventDefault;\n\n if (setting === 'never') { return; }\n\n if (setting === 'always') {\n event.preventDefault();\n return;\n }\n\n // setting === 'auto'\n\n // don't preventDefault if the browser supports passiveEvents\n // CSS touch-action and user-selecct should be used instead\n if (events.supportsOptions) {\n return;\n }\n\n // don't preventDefault of pointerdown events\n if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) {\n return;\n }\n\n // don't preventDefault on editable elements\n if (is.element(event.target)\n && matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) {\n return;\n }\n\n event.preventDefault();\n};\n\nfunction onInteractionEvent ({ interaction, event }) {\n if (interaction.target) {\n interaction.target.checkAndPreventDefault(event);\n }\n}\n\nfor (const eventSignal of ['down', 'move', 'up', 'cancel']) {\n Interaction.signals.on(eventSignal, onInteractionEvent);\n}\n\n// prevent native HTML5 drag on interact.js target elements\nInteraction.docEvents.dragstart = function preventNativeDrag (event) {\n for (const interaction of scope.interactions) {\n\n if (interaction.element\n && (interaction.element === event.target\n || nodeContains(interaction.element, event.target))) {\n\n interaction.target.checkAndPreventDefault(event);\n return;\n }\n }\n};\n","const scope = require('./scope');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst iFinder = require('./utils/interactionFinder');\nconst pointerEvents = require('./pointerEvents/base');\n\nconst { window } = require('./utils/window');\n\nconst toString = Object.prototype.toString;\n\nif (!window.Array.isArray) {\n window.Array.isArray = function (obj) {\n return toString.call(obj) === '[object Array]';\n };\n}\n\nif (!String.prototype.trim) {\n String.prototype.trim = function () {\n return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n };\n}\n\n// http://www.quirksmode.org/dom/events/click.html\n// >Events leading to dblclick\n//\n// IE8 doesn't fire down event before dblclick.\n// This workaround tries to fire a tap and doubletap after dblclick\nfunction onIE8Dblclick (event) {\n const eventTarget = event.target;\n const interaction = iFinder.search(event, event.type, eventTarget);\n\n if (!interaction) { return; }\n\n if (interaction.prevTap\n && event.clientX === interaction.prevTap.clientX\n && event.clientY === interaction.prevTap.clientY\n && eventTarget === interaction.prevTap.target) {\n\n interaction.downTargets[0] = eventTarget;\n interaction.downTimes [0] = new Date().getTime();\n\n pointerEvents.fire({\n interaction,\n event,\n eventTarget,\n pointer: event,\n type: 'tap',\n });\n }\n}\n\nif (browser.isIE8) {\n const selectFix = function (event) {\n for (const interaction of scope.interactions) {\n if (interaction.interacting()) {\n interaction.target.checkAndPreventDefault(event);\n }\n }\n };\n\n const onDocIE8 = function onDocIE8 ({ doc, win }, signalName) {\n const eventMethod = signalName.indexOf('listen') === 0\n ? events.add : events.remove;\n\n // For IE's lack of Event#preventDefault\n eventMethod(doc, 'selectstart', selectFix);\n\n if (pointerEvents) {\n eventMethod(doc, 'dblclick', onIE8Dblclick);\n }\n };\n\n scope.signals.on('add-document' , onDocIE8);\n scope.signals.on('remove-document', onDocIE8);\n}\n\nmodule.exports = null;\n","const InteractEvent = require('../InteractEvent');\nconst Interaction = require('../Interaction');\nconst extend = require('../utils/extend');\n\nconst modifiers = {\n names: [],\n\n setOffsets: function (arg) {\n const { interaction, pageCoords: page } = arg;\n const { target, element, startOffset } = interaction;\n const rect = target.getRect(element);\n\n if (rect) {\n startOffset.left = page.x - rect.left;\n startOffset.top = page.y - rect.top;\n\n startOffset.right = rect.right - page.x;\n startOffset.bottom = rect.bottom - page.y;\n\n if (!('width' in rect)) { rect.width = rect.right - rect.left; }\n if (!('height' in rect)) { rect.height = rect.bottom - rect.top ; }\n }\n else {\n startOffset.left = startOffset.top = startOffset.right = startOffset.bottom = 0;\n }\n\n arg.rect = rect;\n arg.interactable = target;\n arg.element = element;\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n\n arg.options = target.options[interaction.prepared.name][modifierName];\n\n if (!arg.options) {\n continue;\n }\n\n interaction.modifierOffsets[modifierName] = modifiers[modifierName].setOffset(arg);\n }\n },\n\n setAll: function (arg) {\n const { interaction, statuses, preEnd, requireEndOnly } = arg;\n const coords = extend({}, arg.pageCoords);\n const result = {\n dx: 0,\n dy: 0,\n changed: false,\n locked: false,\n shouldMove: true,\n };\n\n for (const modifierName of modifiers.names) {\n const modifier = modifiers[modifierName];\n const options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!shouldDo(options, preEnd, requireEndOnly)) { continue; }\n\n arg.status = arg.status = statuses[modifierName];\n arg.options = options;\n arg.offset = arg.interaction.modifierOffsets[modifierName];\n\n modifier.set(arg);\n\n if (arg.status.locked) {\n coords.x += arg.status.dx;\n coords.y += arg.status.dy;\n\n result.dx += arg.status.dx;\n result.dy += arg.status.dy;\n\n result.locked = true;\n }\n }\n\n // a move should be fired if:\n // - there are no modifiers enabled,\n // - no modifiers are \"locked\" i.e. have changed the pointer's coordinates, or\n // - the locked coords have changed since the last pointer move\n result.shouldMove = !arg.status || !result.locked || arg.status.changed;\n\n return result;\n },\n\n resetStatuses: function (statuses) {\n for (const modifierName of modifiers.names) {\n const status = statuses[modifierName] || {};\n\n status.dx = status.dy = 0;\n status.modifiedX = status.modifiedY = NaN;\n status.locked = false;\n status.changed = true;\n\n statuses[modifierName] = status;\n }\n\n return statuses;\n },\n\n start: function ({ interaction }, signalName) {\n const arg = {\n interaction,\n pageCoords: (signalName === 'action-resume' ?\n interaction.curCoords : interaction.startCoords).page,\n startOffset: interaction.startOffset,\n statuses: interaction.modifierStatuses,\n preEnd: false,\n requireEndOnly: false,\n };\n\n modifiers.setOffsets(arg);\n modifiers.resetStatuses(arg.statuses);\n\n arg.pageCoords = extend({}, interaction.startCoords.page);\n interaction.modifierResult = modifiers.setAll(arg);\n },\n};\n\nInteraction.signals.on('new', function (interaction) {\n interaction.startOffset = { left: 0, right: 0, top: 0, bottom: 0 };\n interaction.modifierOffsets = {};\n interaction.modifierStatuses = modifiers.resetStatuses({});\n interaction.modifierResult = null;\n});\n\nInteraction.signals.on('action-start' , modifiers.start);\nInteraction.signals.on('action-resume', modifiers.start);\n\nInteraction.signals.on('before-action-move', function ({ interaction, preEnd, interactingBeforeMove }) {\n const modifierResult = modifiers.setAll({\n interaction,\n preEnd,\n pageCoords: interaction.curCoords.page,\n statuses: interaction.modifierStatuses,\n requireEndOnly: false,\n });\n\n // don't fire an action move if a modifier would keep the event in the same\n // cordinates as before\n if (!modifierResult.shouldMove && interactingBeforeMove) {\n interaction._dontFireMove = true;\n }\n\n interaction.modifierResult = modifierResult;\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n for (let i = 0; i < modifiers.names.length; i++) {\n const options = interaction.target.options[interaction.prepared.name][modifiers.names[i]];\n\n // if the endOnly option is true for any modifier\n if (shouldDo(options, true, true)) {\n // fire a move event at the modified coordinates\n interaction.doMove({ event, preEnd: true });\n break;\n }\n }\n});\n\nInteractEvent.signals.on('set-xy', function (arg) {\n const { iEvent, interaction } = arg;\n const modifierArg = extend({}, arg);\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n modifierArg.options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!modifierArg.options) {\n continue;\n }\n\n const modifier = modifiers[modifierName];\n\n modifierArg.status = interaction.modifierStatuses[modifierName];\n\n iEvent[modifierName] = modifier.modifyCoords(modifierArg);\n }\n});\n\nfunction shouldDo (options, preEnd, requireEndOnly) {\n return (options && options.enabled\n && (preEnd || !options.endOnly)\n && (!requireEndOnly || options.endOnly));\n}\n\nmodule.exports = modifiers;\n","const modifiers = require('./index');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst restrict = {\n defaults: {\n enabled : false,\n endOnly : false,\n restriction: null,\n elementRect: null,\n },\n\n setOffset: function ({ rect, startOffset, options }) {\n const elementRect = options && options.elementRect;\n const offset = {};\n\n if (rect && elementRect) {\n offset.left = startOffset.left - (rect.width * elementRect.left);\n offset.top = startOffset.top - (rect.height * elementRect.top);\n\n offset.right = startOffset.right - (rect.width * (1 - elementRect.right));\n offset.bottom = startOffset.bottom - (rect.height * (1 - elementRect.bottom));\n }\n else {\n offset.left = offset.top = offset.right = offset.bottom = 0;\n }\n\n return offset;\n },\n\n set: function ({ pageCoords, interaction, status, options }) {\n if (!options) { return status; }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n\n const restriction = getRestrictionRect(options.restriction, interaction, page);\n\n if (!restriction) { return status; }\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n const rect = restriction;\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n const offset = interaction.modifierOffsets.restrict;\n\n // object is assumed to have\n // x, y, width, height or\n // left, top, right, bottom\n if ('x' in restriction && 'y' in restriction) {\n modifiedX = Math.max(Math.min(rect.x + rect.width - offset.right , page.x), rect.x + offset.left);\n modifiedY = Math.max(Math.min(rect.y + rect.height - offset.bottom, page.y), rect.y + offset.top );\n }\n else {\n modifiedX = Math.max(Math.min(rect.right - offset.right , page.x), rect.left + offset.left);\n modifiedY = Math.max(Math.min(rect.bottom - offset.bottom, page.y), rect.top + offset.top );\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const elementRect = options && options.elementRect;\n\n if (options && options.enabled\n && !(phase === 'start' && elementRect && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n getRestrictionRect,\n};\n\nfunction getRestrictionRect (value, interaction, page) {\n if (utils.is.function(value)) {\n return utils.resolveRectLike(value, interaction.target, interaction.element, [page.x, page.y, interaction]);\n } else {\n return utils.resolveRectLike(value, interaction.target, interaction.element);\n }\n}\n\nmodifiers.restrict = restrict;\nmodifiers.names.push('restrict');\n\ndefaultOptions.perAction.restrict = restrict.defaults;\n\nmodule.exports = restrict;\n","// This module adds the options.resize.restrictEdges setting which sets min and\n// max for the top, left, bottom and right edges of the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictEdges: {\n// inner: { top: 200, left: 200, right: 400, bottom: 400 },\n// outer: { top: 0, left: 0, right: 600, bottom: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst { getRestrictionRect } = require('./restrict');\n\nconst noInner = { top: +Infinity, left: +Infinity, bottom: -Infinity, right: -Infinity };\nconst noOuter = { top: -Infinity, left: -Infinity, bottom: +Infinity, right: +Infinity };\n\nconst restrictEdges = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n offset: null,\n },\n\n setOffset: function ({ interaction, startOffset, options }) {\n if (!options) {\n return utils.extend({}, startOffset);\n }\n\n const offset = getRestrictionRect(options.offset, interaction, interaction.startCoords.page);\n\n if (offset) {\n return {\n top: startOffset.top + offset.y,\n left: startOffset.left + offset.x,\n bottom: startOffset.bottom + offset.y,\n right: startOffset.right + offset.x,\n };\n }\n\n return startOffset;\n },\n\n set: function ({ pageCoords, interaction, status, offset, options }) {\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n const inner = rectUtils.xywhToTlbr(getRestrictionRect(options.inner, interaction, page)) || noInner;\n const outer = rectUtils.xywhToTlbr(getRestrictionRect(options.outer, interaction, page)) || noOuter;\n\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n if (edges.top) {\n modifiedY = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top);\n }\n else if (edges.bottom) {\n modifiedY = Math.max(Math.min(outer.bottom - offset.bottom, page.y), inner.bottom - offset.bottom);\n }\n if (edges.left) {\n modifiedX = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left);\n }\n else if (edges.right) {\n modifiedX = Math.max(Math.min(outer.right - offset.right, page.x), inner.right - offset.right);\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n if (options && options.enabled\n && !(phase === 'start' && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n noInner,\n noOuter,\n getRestrictionRect,\n};\n\nmodifiers.restrictEdges = restrictEdges;\nmodifiers.names.push('restrictEdges');\n\ndefaultOptions.perAction.restrictEdges = restrictEdges.defaults;\nresize.defaults.restrictEdges = restrictEdges.defaults;\n\nmodule.exports = restrictEdges;\n","// This module adds the options.resize.restrictSize setting which sets min and\n// max width and height for the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictSize: {\n// min: { width: -600, height: -600 },\n// max: { width: 600, height: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst restrictEdges = require('./restrictEdges');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst noMin = { width: -Infinity, height: -Infinity };\nconst noMax = { width: +Infinity, height: +Infinity };\n\nconst restrictSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n },\n\n setOffset: function ({ interaction }) {\n return interaction.startOffset;\n },\n\n set: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const rect = rectUtils.xywhToTlbr(interaction.resizeRects.inverted);\n\n const minSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.min, interaction)) || noMin;\n const maxSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.max, interaction)) || noMax;\n\n arg.options = {\n enabled: options.enabled,\n endOnly: options.endOnly,\n inner: utils.extend({}, restrictEdges.noInner),\n outer: utils.extend({}, restrictEdges.noOuter),\n };\n\n if (edges.top) {\n arg.options.inner.top = rect.bottom - minSize.height;\n arg.options.outer.top = rect.bottom - maxSize.height;\n }\n else if (edges.bottom) {\n arg.options.inner.bottom = rect.top + minSize.height;\n arg.options.outer.bottom = rect.top + maxSize.height;\n }\n if (edges.left) {\n arg.options.inner.left = rect.right - minSize.width;\n arg.options.outer.left = rect.right - maxSize.width;\n }\n else if (edges.right) {\n arg.options.inner.right = rect.left + minSize.width;\n arg.options.outer.right = rect.left + maxSize.width;\n }\n\n restrictEdges.set(arg);\n },\n\n modifyCoords: restrictEdges.modifyCoords,\n};\n\nmodifiers.restrictSize = restrictSize;\nmodifiers.names.push('restrictSize');\n\ndefaultOptions.perAction.restrictSize = restrictSize.defaults;\nresize.defaults.restrictSize = restrictSize.defaults;\n\nmodule.exports = restrictSize;\n","const modifiers = require('./index');\nconst interact = require('../interact');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst snap = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n\n relativePoints: null,\n },\n\n setOffset: function ({ interaction, interactable, element, rect, startOffset, options }) {\n const offsets = [];\n const optionsOrigin = utils.rectToXY(utils.resolveRectLike(options.origin));\n const origin = optionsOrigin || utils.getOriginXY(interactable, element, interaction.prepared.name);\n options = options || interactable.options[interaction.prepared.name].snap || {};\n\n let snapOffset;\n\n if (options.offset === 'startCoords') {\n snapOffset = {\n x: interaction.startCoords.page.x - origin.x,\n y: interaction.startCoords.page.y - origin.y,\n };\n }\n else {\n const offsetRect = utils.resolveRectLike(options.offset, interactable, element, [interaction]);\n\n snapOffset = utils.rectToXY(offsetRect) || { x: 0, y: 0 };\n }\n\n if (rect && options.relativePoints && options.relativePoints.length) {\n for (const { x: relativeX, y: relativeY } of options.relativePoints) {\n offsets.push({\n x: startOffset.left - (rect.width * relativeX) + snapOffset.x,\n y: startOffset.top - (rect.height * relativeY) + snapOffset.y,\n });\n }\n }\n else {\n offsets.push(snapOffset);\n }\n\n return offsets;\n },\n\n set: function ({ interaction, pageCoords, status, options, offset: offsets }) {\n const targets = [];\n let target;\n let page;\n let i;\n\n if (status.useStatusXY) {\n page = { x: status.x, y: status.y };\n }\n else {\n const origin = utils.getOriginXY(interaction.target, interaction.element, interaction.prepared.name);\n\n page = utils.extend({}, pageCoords);\n\n page.x -= origin.x;\n page.y -= origin.y;\n }\n\n status.realX = page.x;\n status.realY = page.y;\n\n let len = options.targets? options.targets.length : 0;\n\n for (const { x: offsetX, y: offsetY } of offsets) {\n const relativeX = page.x - offsetX;\n const relativeY = page.y - offsetY;\n\n for (const snapTarget of options.targets) {\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n targets.push({\n x: utils.is.number(target.x) ? (target.x + offsetX) : relativeX,\n y: utils.is.number(target.y) ? (target.y + offsetY) : relativeY,\n\n range: utils.is.number(target.range)? target.range: options.range,\n });\n }\n }\n\n const closest = {\n target: null,\n inRange: false,\n distance: 0,\n range: 0,\n dx: 0,\n dy: 0,\n };\n\n for (i = 0, len = targets.length; i < len; i++) {\n target = targets[i];\n\n const range = target.range;\n const dx = target.x - page.x;\n const dy = target.y - page.y;\n const distance = utils.hypot(dx, dy);\n let inRange = distance <= range;\n\n // Infinite targets count as being out of range\n // compared to non infinite ones that are in range\n if (range === Infinity && closest.inRange && closest.range !== Infinity) {\n inRange = false;\n }\n\n if (!closest.target || (inRange\n // is the closest target in range?\n ? (closest.inRange && range !== Infinity\n // the pointer is relatively deeper in this target\n ? distance / range < closest.distance / closest.range\n // this target has Infinite range and the closest doesn't\n : (range === Infinity && closest.range !== Infinity)\n // OR this target is closer that the previous closest\n || distance < closest.distance)\n // The other is not in range and the pointer is closer to this target\n : (!closest.inRange && distance < closest.distance))) {\n\n closest.target = target;\n closest.distance = distance;\n closest.range = range;\n closest.inRange = inRange;\n closest.dx = dx;\n closest.dy = dy;\n\n status.range = range;\n }\n }\n\n let snapChanged;\n\n if (closest.target) {\n snapChanged = (status.modifiedX !== closest.target.x || status.modifiedY !== closest.target.y);\n\n status.modifiedX = closest.target.x;\n status.modifiedY = closest.target.y;\n }\n else {\n snapChanged = true;\n\n status.modifiedX = NaN;\n status.modifiedY = NaN;\n }\n\n status.dx = closest.dx;\n status.dy = closest.dy;\n\n status.changed = (snapChanged || (closest.inRange && !status.locked));\n status.locked = closest.inRange;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const relativePoints = options && options.relativePoints;\n\n if (options && options.enabled\n && !(phase === 'start' && relativePoints && relativePoints.length)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n }\n\n return {\n range : status.range,\n locked : status.locked,\n x : status.modifiedX,\n y : status.modifiedY,\n realX : status.realX,\n realY : status.realY,\n dx : status.dx,\n dy : status.dy,\n };\n }\n },\n};\n\ninteract.createSnapGrid = function (grid) {\n return function (x, y) {\n const limits = grid.limits || {\n left : -Infinity,\n right : Infinity,\n top : -Infinity,\n bottom: Infinity,\n };\n let offsetX = 0;\n let offsetY = 0;\n\n if (utils.is.object(grid.offset)) {\n offsetX = grid.offset.x;\n offsetY = grid.offset.y;\n }\n\n const gridx = Math.round((x - offsetX) / grid.x);\n const gridy = Math.round((y - offsetY) / grid.y);\n\n const newX = Math.max(limits.left, Math.min(limits.right , gridx * grid.x + offsetX));\n const newY = Math.max(limits.top , Math.min(limits.bottom, gridy * grid.y + offsetY));\n\n return {\n x: newX,\n y: newY,\n range: grid.range,\n };\n };\n};\n\nmodifiers.snap = snap;\nmodifiers.names.push('snap');\n\ndefaultOptions.perAction.snap = snap.defaults;\n\nmodule.exports = snap;\n","// This module allows snapping of the size of targets during resize\n// interactions.\n\nconst modifiers = require('./index');\nconst snap = require('./snap');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\nconst utils = require('../utils/');\n\nconst snapSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n },\n\n setOffset: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.edges;\n\n if (!edges) { return; }\n\n arg.options = {\n relativePoints: [{\n x: edges.left? 0 : 1,\n y: edges.top ? 0 : 1,\n }],\n origin: { x: 0, y: 0 },\n offset: 'self',\n range: options.range,\n };\n\n const offsets = snap.setOffset(arg);\n arg.options = options;\n\n return offsets;\n },\n\n set: function (arg) {\n const { interaction, options, offset, pageCoords } = arg;\n const page = utils.extend({}, pageCoords);\n const relativeX = page.x - offset[0].x;\n const relativeY = page.y - offset[0].y;\n\n arg.options = utils.extend({}, options);\n arg.options.targets = [];\n\n for (const snapTarget of options.targets) {\n let target;\n\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n if ('width' in target && 'height' in target) {\n target.x = target.width;\n target.y = target.height;\n }\n\n arg.options.targets.push(target);\n }\n\n snap.set(arg);\n },\n\n modifyCoords: function (arg) {\n const { options } = arg;\n\n arg.options = utils.extend({}, options);\n arg.options.enabled = options.enabled;\n arg.options.relativePoints = [null];\n\n snap.modifyCoords(arg);\n },\n};\n\nmodifiers.snapSize = snapSize;\nmodifiers.names.push('snapSize');\n\ndefaultOptions.perAction.snapSize = snapSize.defaults;\nresize.defaults.snapSize = snapSize.defaults;\n\nmodule.exports = snapSize;\n","const pointerUtils = require('../utils/pointerUtils');\n\nmodule.exports = class PointerEvent {\n constructor (type, pointer, event, eventTarget, interaction) {\n pointerUtils.pointerExtend(this, event);\n\n if (event !== pointer) {\n pointerUtils.pointerExtend(this, pointer);\n }\n\n this.interaction = interaction;\n\n this.timeStamp = new Date().getTime();\n this.originalEvent = event;\n this.type = type;\n this.pointerId = pointerUtils.getPointerId(pointer);\n this.pointerType = pointerUtils.getPointerType(pointer);\n this.target = eventTarget;\n this.currentTarget = null;\n\n if (type === 'tap') {\n const pointerIndex = interaction.getPointerIndex(pointer);\n this.dt = this.timeStamp - interaction.downTimes[pointerIndex];\n\n const interval = this.timeStamp - interaction.tapTime;\n\n this.double = !!(interaction.prevTap\n && interaction.prevTap.type !== 'doubletap'\n && interaction.prevTap.target === this.target\n && interval < 500);\n }\n else if (type === 'doubletap') {\n this.dt = pointer.timeStamp - interaction.tapTime;\n }\n }\n\n subtractOrigin ({ x: originX, y: originY }) {\n this.pageX -= originX;\n this.pageY -= originY;\n this.clientX -= originX;\n this.clientY -= originY;\n\n return this;\n }\n\n addOrigin ({ x: originX, y: originY }) {\n this.pageX += originX;\n this.pageY += originY;\n this.clientX += originX;\n this.clientY += originY;\n\n return this;\n }\n\n preventDefault () {\n this.originalEvent.preventDefault();\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n};\n","const PointerEvent = require('./PointerEvent');\nconst Interaction = require('../Interaction');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst defaults = require('../defaultOptions');\nconst signals = require('../utils/Signals').new();\nconst { filter } = require('../utils/arr');\n\nconst simpleSignals = [ 'down', 'up', 'cancel' ];\nconst simpleEvents = [ 'down', 'up', 'cancel' ];\n\nconst pointerEvents = {\n PointerEvent,\n fire,\n collectEventTargets,\n signals,\n defaults: {\n holdDuration: 600,\n ignoreFrom : null,\n allowFrom : null,\n origin : { x: 0, y: 0 },\n },\n types: [\n 'down',\n 'move',\n 'up',\n 'cancel',\n 'tap',\n 'doubletap',\n 'hold',\n ],\n};\n\nfunction fire (arg) {\n const {\n interaction, pointer, event, eventTarget,\n type = arg.pointerEvent.type,\n targets = collectEventTargets(arg),\n pointerEvent = new PointerEvent(type, pointer, event, eventTarget, interaction),\n } = arg;\n\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n targets,\n type,\n pointerEvent,\n };\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n\n for (const prop in target.props || {}) {\n pointerEvent[prop] = target.props[prop];\n }\n\n const origin = utils.getOriginXY(target.eventable, target.element);\n\n pointerEvent.subtractOrigin(origin);\n pointerEvent.eventable = target.eventable;\n pointerEvent.currentTarget = target.element;\n\n target.eventable.fire(pointerEvent);\n\n pointerEvent.addOrigin(origin);\n\n if (pointerEvent.immediatePropagationStopped\n || (pointerEvent.propagationStopped\n && (i + 1) < targets.length && targets[i + 1].element !== pointerEvent.currentTarget)) {\n break;\n }\n }\n\n signals.fire('fired', signalArg);\n\n if (type === 'tap') {\n // if pointerEvent should make a double tap, create and fire a doubletap\n // PointerEvent and use that as the prevTap\n const prevTap = pointerEvent.double\n ? fire({\n interaction, pointer, event, eventTarget,\n type: 'doubletap',\n })\n : pointerEvent;\n\n interaction.prevTap = prevTap;\n interaction.tapTime = prevTap.timeStamp;\n }\n\n return pointerEvent;\n}\n\nfunction collectEventTargets ({ interaction, pointer, event, eventTarget, type }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n // do not fire a tap event if the pointer was moved before being lifted\n if (type === 'tap' && (interaction.pointerWasMoved\n // or if the pointerup target is different to the pointerdown target\n || !(interaction.downTargets[pointerIndex] && interaction.downTargets[pointerIndex] === eventTarget))) {\n return [];\n }\n\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n path,\n targets: [],\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (type === 'hold') {\n signalArg.targets = filter(signalArg.targets, target =>\n target.eventable.options.holdDuration === interaction.holdTimers[pointerIndex].duration);\n }\n\n return signalArg.targets;\n}\n\nInteraction.signals.on('update-pointer-down', function ({ interaction, pointerIndex }) {\n interaction.holdTimers[pointerIndex] = { duration: Infinity, timeout: null };\n});\n\nInteraction.signals.on('remove-pointer', function ({ interaction, pointerIndex }) {\n interaction.holdTimers.splice(pointerIndex, 1);\n});\n\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget, duplicateMove }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n if (!duplicateMove && (!interaction.pointerIsDown || interaction.pointerWasMoved)) {\n if (interaction.pointerIsDown) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n\n fire({\n interaction, pointer, event, eventTarget,\n type: 'move',\n });\n }\n});\n\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget, pointerIndex }) {\n // copy event to be used in timeout for IE8\n const eventCopy = browser.isIE8? utils.extend({}, event) : event;\n\n const timer = interaction.holdTimers[pointerIndex];\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'hold',\n targets: [],\n path,\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (!signalArg.targets.length) { return; }\n\n let minDuration = Infinity;\n\n for (let i = 0; i < signalArg.targets.length; i++) {\n const target = signalArg.targets[i];\n const holdDuration = target.eventable.options.holdDuration;\n\n if (holdDuration < minDuration) {\n minDuration = holdDuration;\n }\n }\n\n timer.duration = minDuration;\n timer.timeout = setTimeout(function () {\n fire({\n interaction,\n eventTarget,\n pointer: browser.isIE8? eventCopy : pointer,\n event: eventCopy,\n type: 'hold',\n });\n }, minDuration);\n});\n\nInteraction.signals.on('up', ({ interaction, pointer, event, eventTarget }) => {\n if (!interaction.pointerWasMoved) {\n fire({ interaction, eventTarget, pointer, event, type: 'tap' });\n }\n});\n\n['up', 'cancel'].forEach(function (signalName) {\n Interaction.signals.on(signalName, function ({ interaction, pointerIndex }) {\n if (interaction.holdTimers[pointerIndex]) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n });\n});\n\nfunction createSignalListener (type) {\n return function ({ interaction, pointer, event, eventTarget }) {\n fire({ interaction, eventTarget, pointer, event, type });\n };\n}\n\nfor (let i = 0; i < simpleSignals.length; i++) {\n Interaction.signals.on(simpleSignals[i], createSignalListener(simpleEvents[i]));\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.prevTap = null; // the most recent tap event on this interaction\n interaction.tapTime = 0; // time of the most recent tap event\n interaction.holdTimers = []; // [{ duration, timeout }]\n});\n\ndefaults.pointerEvents = pointerEvents.defaults;\nmodule.exports = pointerEvents;\n","const pointerEvents = require('./base');\nconst Interaction = require('../Interaction');\n\npointerEvents.signals.on('new', onNew);\npointerEvents.signals.on('fired', onFired);\n\nfor (const signal of ['move', 'up', 'cancel', 'endall']) {\n Interaction.signals.on(signal, endHoldRepeat);\n}\n\nfunction onNew ({ pointerEvent }) {\n if (pointerEvent.type !== 'hold') { return; }\n\n pointerEvent.count = (pointerEvent.count || 0) + 1;\n}\n\nfunction onFired ({ interaction, pointerEvent, eventTarget, targets }) {\n if (pointerEvent.type !== 'hold' || !targets.length) { return; }\n\n // get the repeat interval from the first eventable\n const interval = targets[0].eventable.options.holdRepeatInterval;\n\n // don't repeat if the interval is 0 or less\n if (interval <= 0) { return; }\n\n // set a timeout to fire the holdrepeat event\n interaction.holdIntervalHandle = setTimeout(function () {\n pointerEvents.fire({\n interaction,\n eventTarget,\n type: 'hold',\n pointer: pointerEvent,\n event: pointerEvent,\n });\n }, interval);\n}\n\nfunction endHoldRepeat ({ interaction }) {\n // set the interaction's holdStopTime property\n // to stop further holdRepeat events\n if (interaction.holdIntervalHandle) {\n clearInterval(interaction.holdIntervalHandle);\n interaction.holdIntervalHandle = null;\n }\n}\n\n// don't repeat by default\npointerEvents.defaults.holdRepeatInterval = 0;\npointerEvents.types.push('holdrepeat');\n\nmodule.exports = {\n onNew,\n onFired,\n endHoldRepeat,\n};\n","const pointerEvents = require('./base');\nconst Interactable = require('../Interactable');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\nconst scope = require('../scope');\nconst extend = require('../utils/extend');\nconst { merge } = require('../utils/arr');\n\npointerEvents.signals.on('collect-targets', function ({ targets, element, type, eventTarget }) {\n function collectSelectors (interactable, selector, context) {\n const els = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && is.element(element)\n && domUtils.matchesSelector(element, selector, els)\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n const interactable = scope.interactables.get(element);\n\n if (interactable) {\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n scope.interactables.forEachSelector(collectSelectors, element);\n});\n\nInteractable.signals.on('new', function ({ interactable }) {\n interactable.events.getRect = function (element) {\n return interactable.getRect(element);\n };\n});\n\nInteractable.signals.on('set', function ({ interactable, options }) {\n extend(interactable.events.options, pointerEvents.defaults);\n extend(interactable.events.options, options);\n});\n\nmerge(Interactable.eventTypes, pointerEvents.types);\n\nInteractable.prototype.pointerEvents = function (options) {\n extend(this.events.options, options);\n\n return this;\n};\n\nconst __backCompatOption = Interactable.prototype._backCompatOption;\n\nInteractable.prototype._backCompatOption = function (optionName, newValue) {\n const ret = __backCompatOption.call(this, optionName, newValue);\n\n if (ret === this) {\n this.events.options[optionName] = newValue;\n }\n\n return ret;\n};\n\nInteractable.settingsMethods.push('pointerEvents');\n","const utils = require('./utils');\nconst events = require('./utils/events');\nconst signals = require('./utils/Signals').new();\n\nconst scope = {\n signals,\n events,\n utils,\n\n // main document\n document: require('./utils/domObjects').document,\n // all documents being listened to\n documents: [],\n\n addDocument: function (doc, win) {\n // do nothing if document is already known\n if (utils.contains(scope.documents, doc)) { return false; }\n\n win = win || scope.getWindow(doc);\n\n scope.documents.push(doc);\n events.documents.push(doc);\n\n // don't add an unload event for the main document\n // so that the page may be cached in browser history\n if (doc !== scope.document) {\n events.add(win, 'unload', scope.onWindowUnload);\n }\n\n signals.fire('add-document', { doc, win });\n },\n\n removeDocument: function (doc, win) {\n const index = utils.indexOf(scope.documents, doc);\n\n win = win || scope.getWindow(doc);\n\n events.remove(win, 'unload', scope.onWindowUnload);\n\n scope.documents.splice(index, 1);\n events.documents.splice(index, 1);\n\n signals.fire('remove-document', { win, doc });\n },\n\n onWindowUnload: function () {\n scope.removeDocument(this.document, this);\n },\n};\n\nmodule.exports = scope;\n","const { indexOf } = require('./arr');\n\nclass Signals {\n constructor () {\n this.listeners = {\n // signalName: [listeners],\n };\n }\n\n on (name, listener) {\n if (!this.listeners[name]) {\n this.listeners[name] = [listener];\n return;\n }\n\n this.listeners[name].push(listener);\n }\n\n off (name, listener) {\n if (!this.listeners[name]) { return; }\n\n const index = indexOf(this.listeners[name], listener);\n\n if (index !== -1) {\n this.listeners[name].splice(index, 1);\n }\n }\n\n fire (name, arg) {\n const targetListeners = this.listeners[name];\n\n if (!targetListeners) { return; }\n\n for (let i = 0; i < targetListeners.length; i++) {\n if (targetListeners[i](arg, name) === false) {\n return;\n }\n }\n }\n}\n\nSignals.new = function () {\n return new Signals();\n};\n\nmodule.exports = Signals;\n","function indexOf (array, target) {\n for (let i = 0, len = array.length; i < len; i++) {\n if (array[i] === target) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction contains (array, target) {\n return indexOf(array, target) !== -1;\n}\n\nfunction merge (target, source) {\n for (let i = 0; i < source.length; i++) {\n target.push(source[i]);\n }\n\n return target;\n}\n\nfunction filter (array, test) {\n const result = [];\n\n for (let i = 0; i < array.length; i++) {\n if (test(array[i])) {\n result.push(array[i]);\n }\n }\n\n return result;\n}\n\nmodule.exports = {\n indexOf,\n contains,\n merge,\n filter,\n};\n","const { window } = require('./window');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst Element = domObjects.Element;\nconst navigator = window.navigator;\n\nconst browser = {\n // Does the browser support touch input?\n supportsTouch: !!(('ontouchstart' in window) || is.function(window.DocumentTouch)\n && domObjects.document instanceof window.DocumentTouch),\n\n // Does the browser support PointerEvents\n supportsPointerEvent: !!domObjects.PointerEvent,\n\n isIE8: ('attachEvent' in window) && !('addEventListener' in window),\n\n // Opera Mobile must be handled differently\n isOperaMobile: (navigator.appName === 'Opera'\n && browser.supportsTouch\n && navigator.userAgent.match('Presto')),\n\n // scrolling doesn't change the result of getClientRects on iOS 7\n isIOS7: (/iP(hone|od|ad)/.test(navigator.platform)\n && /OS 7[^\\d]/.test(navigator.appVersion)),\n\n isIe9OrOlder: /MSIE (8|9)/.test(navigator.userAgent),\n\n // prefix matchesSelector\n prefixedMatchesSelector: 'matches' in Element.prototype\n ? 'matches': 'webkitMatchesSelector' in Element.prototype\n ? 'webkitMatchesSelector': 'mozMatchesSelector' in Element.prototype\n ? 'mozMatchesSelector': 'oMatchesSelector' in Element.prototype\n ? 'oMatchesSelector': 'msMatchesSelector',\n\n useMatchesSelectorPolyfill: false,\n\n pEventTypes: (domObjects.PointerEvent\n ? (domObjects.PointerEvent === window.MSPointerEvent\n ? {\n up: 'MSPointerUp',\n down: 'MSPointerDown',\n over: 'mouseover',\n out: 'mouseout',\n move: 'MSPointerMove',\n cancel: 'MSPointerCancel',\n }\n : {\n up: 'pointerup',\n down: 'pointerdown',\n over: 'pointerover',\n out: 'pointerout',\n move: 'pointermove',\n cancel: 'pointercancel',\n })\n : null),\n\n // because Webkit and Opera still use 'mousewheel' event type\n wheelEvent: 'onmousewheel' in domObjects.document? 'mousewheel': 'wheel',\n\n};\n\nbrowser.useMatchesSelectorPolyfill = !is.function(Element.prototype[browser.prefixedMatchesSelector]);\n\nmodule.exports = browser;\n","const domObjects = {};\nconst win = require('./window').window;\n\nfunction blank () {}\n\ndomObjects.document = win.document;\ndomObjects.DocumentFragment = win.DocumentFragment || blank;\ndomObjects.SVGElement = win.SVGElement || blank;\ndomObjects.SVGSVGElement = win.SVGSVGElement || blank;\ndomObjects.SVGElementInstance = win.SVGElementInstance || blank;\ndomObjects.Element = win.Element || blank;\ndomObjects.HTMLElement = win.HTMLElement || domObjects.Element;\n\ndomObjects.Event = win.Event;\ndomObjects.Touch = win.Touch || blank;\ndomObjects.PointerEvent = (win.PointerEvent || win.MSPointerEvent);\n\nmodule.exports = domObjects;\n","const win = require('./window');\nconst browser = require('./browser');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst domUtils = {\n nodeContains: function (parent, child) {\n while (child) {\n if (child === parent) {\n return true;\n }\n\n child = child.parentNode;\n }\n\n return false;\n },\n\n closest: function (element, selector) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) { return element; }\n\n element = domUtils.parentNode(element);\n }\n\n return null;\n },\n\n parentNode: function (node) {\n let parent = node.parentNode;\n\n if (is.docFrag(parent)) {\n // skip past #shado-root fragments\n while ((parent = parent.host) && is.docFrag(parent)) {\n continue;\n }\n\n return parent;\n }\n\n return parent;\n },\n\n // taken from http://tanalin.com/en/blog/2012/12/matches-selector-ie8/ and modified\n matchesSelectorPolyfill: browser.useMatchesSelectorPolyfill\n ? function (element, selector, elems) {\n elems = elems || element.parentNode.querySelectorAll(selector);\n\n for (let i = 0, len = elems.length; i < len; i++) {\n if (elems[i] === element) {\n return true;\n }\n }\n\n return false;\n }\n : null,\n\n matchesSelector: function (element, selector, nodeList) {\n if (browser.useMatchesSelectorPolyfill) {\n return domUtils.matchesSelectorPolyfill(element, selector, nodeList);\n }\n\n // remove /deep/ from selectors if shadowDOM polyfill is used\n if (win.window !== win.realWindow) {\n selector = selector.replace(/\\/deep\\//g, ' ');\n }\n\n return element[browser.prefixedMatchesSelector](selector);\n },\n\n // Test for the element that's \"above\" all other qualifiers\n indexOfDeepestElement: function (elements) {\n let deepestZoneParents = [];\n let dropzoneParents = [];\n let dropzone;\n let deepestZone = elements[0];\n let index = deepestZone? 0: -1;\n let parent;\n let child;\n let i;\n let n;\n\n for (i = 1; i < elements.length; i++) {\n dropzone = elements[i];\n\n // an element might belong to multiple selector dropzones\n if (!dropzone || dropzone === deepestZone) {\n continue;\n }\n\n if (!deepestZone) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n // check if the deepest or current are document.documentElement or document.rootElement\n // - if the current dropzone is, do nothing and continue\n if (dropzone.parentNode === dropzone.ownerDocument) {\n continue;\n }\n // - if deepest is, update with the current dropzone and continue to next\n else if (deepestZone.parentNode === dropzone.ownerDocument) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n if (!deepestZoneParents.length) {\n parent = deepestZone;\n while (parent.parentNode && parent.parentNode !== parent.ownerDocument) {\n deepestZoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n }\n\n // if this element is an svg element and the current deepest is\n // an HTMLElement\n if (deepestZone instanceof domObjects.HTMLElement\n && dropzone instanceof domObjects.SVGElement\n && !(dropzone instanceof domObjects.SVGSVGElement)) {\n\n if (dropzone === deepestZone.parentNode) {\n continue;\n }\n\n parent = dropzone.ownerSVGElement;\n }\n else {\n parent = dropzone;\n }\n\n dropzoneParents = [];\n\n while (parent.parentNode !== parent.ownerDocument) {\n dropzoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n\n n = 0;\n\n // get (position of last common ancestor) + 1\n while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) {\n n++;\n }\n\n const parents = [\n dropzoneParents[n - 1],\n dropzoneParents[n],\n deepestZoneParents[n],\n ];\n\n child = parents[0].lastChild;\n\n while (child) {\n if (child === parents[1]) {\n deepestZone = dropzone;\n index = i;\n deepestZoneParents = [];\n\n break;\n }\n else if (child === parents[2]) {\n break;\n }\n\n child = child.previousSibling;\n }\n }\n\n return index;\n },\n\n matchesUpTo: function (element, selector, limit) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) {\n return true;\n }\n\n element = domUtils.parentNode(element);\n\n if (element === limit) {\n return domUtils.matchesSelector(element, selector);\n }\n }\n\n return false;\n },\n\n getActualElement: function (element) {\n return (element instanceof domObjects.SVGElementInstance\n ? element.correspondingUseElement\n : element);\n },\n\n getScrollXY: function (relevantWindow) {\n relevantWindow = relevantWindow || win.window;\n return {\n x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft,\n y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop,\n };\n },\n\n getElementClientRect: function (element) {\n const clientRect = (element instanceof domObjects.SVGElement\n ? element.getBoundingClientRect()\n : element.getClientRects()[0]);\n\n return clientRect && {\n left : clientRect.left,\n right : clientRect.right,\n top : clientRect.top,\n bottom: clientRect.bottom,\n width : clientRect.width || clientRect.right - clientRect.left,\n height: clientRect.height || clientRect.bottom - clientRect.top,\n };\n },\n\n getElementRect: function (element) {\n const clientRect = domUtils.getElementClientRect(element);\n\n if (!browser.isIOS7 && clientRect) {\n const scroll = domUtils.getScrollXY(win.getWindow(element));\n\n clientRect.left += scroll.x;\n clientRect.right += scroll.x;\n clientRect.top += scroll.y;\n clientRect.bottom += scroll.y;\n }\n\n return clientRect;\n },\n\n getPath: function (element) {\n const path = [];\n\n while (element) {\n path.push(element);\n element = domUtils.parentNode(element);\n }\n\n return path;\n },\n\n trySelector: value => {\n if (!is.string(value)) { return false; }\n\n // an exception will be raised if it is invalid\n domObjects.document.querySelector(value);\n return true;\n },\n};\n\nmodule.exports = domUtils;\n","const is = require('./is');\nconst domUtils = require('./domUtils');\nconst pExtend = require('./pointerExtend');\n\nconst { window, getWindow } = require('./window');\nconst { indexOf, contains } = require('./arr');\n\nconst useAttachEvent = ('attachEvent' in window) && !('addEventListener' in window);\nconst addEvent = useAttachEvent? 'attachEvent': 'addEventListener';\nconst removeEvent = useAttachEvent? 'detachEvent': 'removeEventListener';\nconst on = useAttachEvent? 'on': '';\n\nconst elements = [];\nconst targets = [];\nconst attachedListeners = [];\n\n// {\n// type: {\n// selectors: ['selector', ...],\n// contexts : [document, ...],\n// listeners: [[listener, capture, passive], ...]\n// }\n// }\nconst delegatedEvents = {};\n\nconst documents = [];\n\nconst supportsOptions = !useAttachEvent && (() => {\n let supported = false;\n\n window.document.createElement('div').addEventListener('test', null, {\n get capture () { supported = true; },\n });\n\n return supported;\n})();\n\nfunction add (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n let elementIndex = indexOf(elements, element);\n let target = targets[elementIndex];\n\n if (!target) {\n target = {\n events: {},\n typeCount: 0,\n };\n\n elementIndex = elements.push(element) - 1;\n targets.push(target);\n\n attachedListeners.push(useAttachEvent\n ? {\n supplied: [],\n wrapped : [],\n useCount: [],\n }\n : null);\n }\n\n if (!target.events[type]) {\n target.events[type] = [];\n target.typeCount++;\n }\n\n if (!contains(target.events[type], listener)) {\n let ret;\n\n if (useAttachEvent) {\n const { supplied, wrapped, useCount } = attachedListeners[elementIndex];\n const listenerIndex = indexOf(supplied, listener);\n\n const wrappedListener = wrapped[listenerIndex] || function (event) {\n if (!event.immediatePropagationStopped) {\n event.target = event.srcElement;\n event.currentTarget = element;\n\n event.preventDefault = event.preventDefault || preventDef;\n event.stopPropagation = event.stopPropagation || stopProp;\n event.stopImmediatePropagation = event.stopImmediatePropagation || stopImmProp;\n\n if (/mouse|click/.test(event.type)) {\n event.pageX = event.clientX + getWindow(element).document.documentElement.scrollLeft;\n event.pageY = event.clientY + getWindow(element).document.documentElement.scrollTop;\n }\n\n listener(event);\n }\n };\n\n ret = element[addEvent](on + type, wrappedListener, !!options.capture);\n\n if (listenerIndex === -1) {\n supplied.push(listener);\n wrapped.push(wrappedListener);\n useCount.push(1);\n }\n else {\n useCount[listenerIndex]++;\n }\n }\n else {\n ret = element[addEvent](type, listener, supportsOptions? options : !!options.capture);\n }\n target.events[type].push(listener);\n\n return ret;\n }\n}\n\nfunction remove (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const elementIndex = indexOf(elements, element);\n const target = targets[elementIndex];\n\n if (!target || !target.events) {\n return;\n }\n\n let wrappedListener = listener;\n let listeners;\n let listenerIndex;\n\n if (useAttachEvent) {\n listeners = attachedListeners[elementIndex];\n listenerIndex = indexOf(listeners.supplied, listener);\n wrappedListener = listeners.wrapped[listenerIndex];\n }\n\n if (type === 'all') {\n for (type in target.events) {\n if (target.events.hasOwnProperty(type)) {\n remove(element, type, 'all');\n }\n }\n return;\n }\n\n if (target.events[type]) {\n const len = target.events[type].length;\n\n if (listener === 'all') {\n for (let i = 0; i < len; i++) {\n remove(element, type, target.events[type][i], options);\n }\n return;\n }\n else {\n for (let i = 0; i < len; i++) {\n if (target.events[type][i] === listener) {\n element[removeEvent](on + type, wrappedListener, supportsOptions? options : !!options.capture);\n target.events[type].splice(i, 1);\n\n if (useAttachEvent && listeners) {\n listeners.useCount[listenerIndex]--;\n if (listeners.useCount[listenerIndex] === 0) {\n listeners.supplied.splice(listenerIndex, 1);\n listeners.wrapped.splice(listenerIndex, 1);\n listeners.useCount.splice(listenerIndex, 1);\n }\n }\n\n break;\n }\n }\n }\n\n if (target.events[type] && target.events[type].length === 0) {\n target.events[type] = null;\n target.typeCount--;\n }\n }\n\n if (!target.typeCount) {\n targets.splice(elementIndex, 1);\n elements.splice(elementIndex, 1);\n attachedListeners.splice(elementIndex, 1);\n }\n}\n\nfunction addDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n if (!delegatedEvents[type]) {\n delegatedEvents[type] = {\n selectors: [],\n contexts : [],\n listeners: [],\n };\n\n // add delegate listener functions\n for (let i = 0; i < documents.length; i++) {\n add(documents[i], type, delegateListener);\n add(documents[i], type, delegateUseCapture, true);\n }\n }\n\n const delegated = delegatedEvents[type];\n let index;\n\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n break;\n }\n }\n\n if (index === -1) {\n index = delegated.selectors.length;\n\n delegated.selectors.push(selector);\n delegated.contexts .push(context);\n delegated.listeners.push([]);\n }\n\n // keep listener and capture and passive flags\n delegated.listeners[index].push([listener, !!options.capture, options.passive]);\n}\n\nfunction removeDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const delegated = delegatedEvents[type];\n let matchFound = false;\n let index;\n\n if (!delegated) { return; }\n\n // count from last index of delegated to 0\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n // look for matching selector and context Node\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n\n const listeners = delegated.listeners[index];\n\n // each item of the listeners array is an array: [function, capture, passive]\n for (let i = listeners.length - 1; i >= 0; i--) {\n const [fn, capture, passive] = listeners[i];\n\n // check if the listener functions and capture and passive flags match\n if (fn === listener && capture === !!options.capture && passive === options.passive) {\n // remove the listener from the array of listeners\n listeners.splice(i, 1);\n\n // if all listeners for this interactable have been removed\n // remove the interactable from the delegated arrays\n if (!listeners.length) {\n delegated.selectors.splice(index, 1);\n delegated.contexts .splice(index, 1);\n delegated.listeners.splice(index, 1);\n\n // remove delegate function from context\n remove(context, type, delegateListener);\n remove(context, type, delegateUseCapture, true);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegatedEvents[type] = null;\n }\n }\n\n // only remove one listener\n matchFound = true;\n break;\n }\n }\n\n if (matchFound) { break; }\n }\n }\n}\n\n// bound to the interactable context when a DOM event\n// listener is added to a selector interactable\nfunction delegateListener (event, optionalArg) {\n const options = getOptions(optionalArg);\n const fakeEvent = {};\n const delegated = delegatedEvents[event.type];\n const eventTarget = (domUtils.getActualElement(event.path\n ? event.path[0]\n : event.target));\n let element = eventTarget;\n\n // duplicate the event so that currentTarget can be changed\n pExtend(fakeEvent, event);\n\n fakeEvent.originalEvent = event;\n fakeEvent.preventDefault = preventOriginalDefault;\n\n // climb up document tree looking for selector matches\n while (is.element(element)) {\n for (let i = 0; i < delegated.selectors.length; i++) {\n const selector = delegated.selectors[i];\n const context = delegated.contexts[i];\n\n if (domUtils.matchesSelector(element, selector)\n && domUtils.nodeContains(context, eventTarget)\n && domUtils.nodeContains(context, element)) {\n\n const listeners = delegated.listeners[i];\n\n fakeEvent.currentTarget = element;\n\n for (let j = 0; j < listeners.length; j++) {\n const [fn, capture, passive] = listeners[j];\n\n if (capture === !!options.capture && passive === options.passive) {\n fn(fakeEvent);\n }\n }\n }\n }\n\n element = domUtils.parentNode(element);\n }\n}\n\nfunction delegateUseCapture (event) {\n return delegateListener.call(this, event, true);\n}\n\nfunction preventDef () {\n this.returnValue = false;\n}\n\nfunction preventOriginalDefault () {\n this.originalEvent.preventDefault();\n}\n\nfunction stopProp () {\n this.cancelBubble = true;\n}\n\nfunction stopImmProp () {\n this.cancelBubble = true;\n this.immediatePropagationStopped = true;\n}\n\nfunction getOptions (param) {\n return is.object(param)? param : { capture: param };\n}\n\nmodule.exports = {\n add,\n remove,\n\n addDelegate,\n removeDelegate,\n\n delegateListener,\n delegateUseCapture,\n delegatedEvents,\n documents,\n\n useAttachEvent,\n supportsOptions,\n\n _elements: elements,\n _targets: targets,\n _attachedListeners: attachedListeners,\n};\n","module.exports = function extend (dest, source) {\n for (const prop in source) {\n dest[prop] = source[prop];\n }\n return dest;\n};\n","const {\n resolveRectLike,\n rectToXY,\n} = require('./rect');\n\nmodule.exports = function (target, element, action) {\n const actionOptions = target.options[action];\n const actionOrigin = actionOptions && actionOptions.origin;\n const origin = actionOrigin || target.options.origin;\n\n const originRect = resolveRectLike(origin, target, element, [target && element]);\n\n return rectToXY(originRect) || { x: 0, y: 0 };\n};\n","module.exports = (x, y) => Math.sqrt(x * x + y * y);\n","const extend = require('./extend');\nconst win = require('./window');\n\nconst utils = {\n warnOnce: function (method, message) {\n let warned = false;\n\n return function () {\n if (!warned) {\n win.window.console.warn(message);\n warned = true;\n }\n\n return method.apply(this, arguments);\n };\n },\n\n // http://stackoverflow.com/a/5634528/2280888\n _getQBezierValue: function (t, p1, p2, p3) {\n const iT = 1 - t;\n return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3;\n },\n\n getQuadraticCurvePoint: function (startX, startY, cpX, cpY, endX, endY, position) {\n return {\n x: utils._getQBezierValue(position, startX, cpX, endX),\n y: utils._getQBezierValue(position, startY, cpY, endY),\n };\n },\n\n // http://gizma.com/easing/\n easeOutQuad: function (t, b, c, d) {\n t /= d;\n return -c * t*(t-2) + b;\n },\n\n copyAction: function (dest, src) {\n dest.name = src.name;\n dest.axis = src.axis;\n dest.edges = src.edges;\n\n return dest;\n },\n\n is : require('./is'),\n extend : extend,\n hypot : require('./hypot'),\n getOriginXY: require('./getOriginXY'),\n};\n\nextend(utils, require('./arr'));\nextend(utils, require('./domUtils'));\nextend(utils, require('./pointerUtils'));\nextend(utils, require('./rect'));\n\nmodule.exports = utils;\n","const scope = require('../scope');\nconst utils = require('./index');\n\nconst finder = {\n methodOrder: [ 'simulationResume', 'mouseOrPen', 'hasPointer', 'idle' ],\n\n search: function (pointer, eventType, eventTarget) {\n const pointerType = utils.getPointerType(pointer);\n const pointerId = utils.getPointerId(pointer);\n const details = { pointer, pointerId, pointerType, eventType, eventTarget };\n\n for (const method of finder.methodOrder) {\n const interaction = finder[method](details);\n\n if (interaction) {\n return interaction;\n }\n }\n },\n\n // try to resume simulation with a new pointer\n simulationResume: function ({ pointerType, eventType, eventTarget }) {\n if (!/down|start/i.test(eventType)) {\n return null;\n }\n\n for (const interaction of scope.interactions) {\n let element = eventTarget;\n\n if (interaction.simulation && interaction.simulation.allowResume\n && (interaction.pointerType === pointerType)) {\n while (element) {\n // if the element is the interaction element\n if (element === interaction.element) {\n return interaction;\n }\n element = utils.parentNode(element);\n }\n }\n }\n\n return null;\n },\n\n // if it's a mouse or pen interaction\n mouseOrPen: function ({ pointerId, pointerType, eventType }) {\n if (pointerType !== 'mouse' && pointerType !== 'pen') {\n return null;\n }\n\n let firstNonActive;\n\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType) {\n // if it's a down event, skip interactions with running simulations\n if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; }\n\n // if the interaction is active, return it immediately\n if (interaction.interacting()) {\n return interaction;\n }\n // otherwise save it and look for another active interaction\n else if (!firstNonActive) {\n firstNonActive = interaction;\n }\n }\n }\n\n // if no active mouse interaction was found use the first inactive mouse\n // interaction\n if (firstNonActive) {\n return firstNonActive;\n }\n\n // find any mouse or pen interaction.\n // ignore the interaction if the eventType is a *down, and a simulation\n // is active\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType && !(/down/i.test(eventType) && interaction.simulation)) {\n return interaction;\n }\n }\n\n return null;\n },\n\n // get interaction that has this pointer\n hasPointer: function ({ pointerId }) {\n for (const interaction of scope.interactions) {\n if (utils.contains(interaction.pointerIds, pointerId)) {\n return interaction;\n }\n }\n },\n\n // get first idle interaction with a matching pointerType\n idle: function ({ pointerType }) {\n for (const interaction of scope.interactions) {\n // if there's already a pointer held down\n if (interaction.pointerIds.length === 1) {\n const target = interaction.target;\n // don't add this pointer if there is a target interactable and it\n // isn't gesturable\n if (target && !target.options.gesture.enabled) {\n continue;\n }\n }\n // maximum of 2 pointers per interaction\n else if (interaction.pointerIds.length >= 2) {\n continue;\n }\n\n if (!interaction.interacting() && (pointerType === interaction.pointerType)) {\n return interaction;\n }\n }\n\n return null;\n },\n};\n\nmodule.exports = finder;\n","const win = require('./window');\nconst isWindow = require('./isWindow');\n\nconst is = {\n array : () => {},\n\n window : thing => thing === win.window || isWindow(thing),\n\n docFrag : thing => is.object(thing) && thing.nodeType === 11,\n\n object : thing => !!thing && (typeof thing === 'object'),\n\n function: thing => typeof thing === 'function',\n\n number : thing => typeof thing === 'number' ,\n\n bool : thing => typeof thing === 'boolean' ,\n\n string : thing => typeof thing === 'string' ,\n\n element: thing => {\n if (!thing || (typeof thing !== 'object')) { return false; }\n\n const _window = win.getWindow(thing) || win.window;\n\n return (/object|function/.test(typeof _window.Element)\n ? thing instanceof _window.Element //DOM2\n : thing.nodeType === 1 && typeof thing.nodeName === 'string');\n },\n};\n\nis.array = thing => (is.object(thing)\n && (typeof thing.length !== 'undefined')\n && is.function(thing.splice));\n\nmodule.exports = is;\n","module.exports = (thing) => !!(thing && thing.Window) && (thing instanceof thing.Window);\n","function pointerExtend (dest, source) {\n for (const prop in source) {\n const prefixedPropREs = module.exports.prefixedPropREs;\n let deprecated = false;\n\n // skip deprecated prefixed properties\n for (const vendor in prefixedPropREs) {\n if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) {\n deprecated = true;\n break;\n }\n }\n\n if (!deprecated && typeof source[prop] !== 'function') {\n dest[prop] = source[prop];\n }\n }\n return dest;\n}\n\npointerExtend.prefixedPropREs = {\n webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/,\n};\n\nmodule.exports = pointerExtend;\n","const hypot = require('./hypot');\nconst browser = require('./browser');\nconst dom = require('./domObjects');\nconst domUtils = require('./domUtils');\nconst domObjects = require('./domObjects');\nconst is = require('./is');\nconst pointerExtend = require('./pointerExtend');\n\nconst pointerUtils = {\n copyCoords: function (dest, src) {\n dest.page = dest.page || {};\n dest.page.x = src.page.x;\n dest.page.y = src.page.y;\n\n dest.client = dest.client || {};\n dest.client.x = src.client.x;\n dest.client.y = src.client.y;\n\n dest.timeStamp = src.timeStamp;\n },\n\n setCoordDeltas: function (targetObj, prev, cur) {\n targetObj.page.x = cur.page.x - prev.page.x;\n targetObj.page.y = cur.page.y - prev.page.y;\n targetObj.client.x = cur.client.x - prev.client.x;\n targetObj.client.y = cur.client.y - prev.client.y;\n targetObj.timeStamp = cur.timeStamp - prev.timeStamp;\n\n // set pointer velocity\n const dt = Math.max(targetObj.timeStamp / 1000, 0.001);\n\n targetObj.page.speed = hypot(targetObj.page.x, targetObj.page.y) / dt;\n targetObj.page.vx = targetObj.page.x / dt;\n targetObj.page.vy = targetObj.page.y / dt;\n\n targetObj.client.speed = hypot(targetObj.client.x, targetObj.page.y) / dt;\n targetObj.client.vx = targetObj.client.x / dt;\n targetObj.client.vy = targetObj.client.y / dt;\n },\n\n isNativePointer: function (pointer) {\n return (pointer instanceof dom.Event || pointer instanceof dom.Touch);\n },\n\n // Get specified X/Y coords for mouse or event.touches[0]\n getXY: function (type, pointer, xy) {\n xy = xy || {};\n type = type || 'page';\n\n xy.x = pointer[type + 'X'];\n xy.y = pointer[type + 'Y'];\n\n return xy;\n },\n\n getPageXY: function (pointer, page) {\n page = page || {};\n\n // Opera Mobile handles the viewport and scrolling oddly\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n pointerUtils.getXY('screen', pointer, page);\n\n page.x += window.scrollX;\n page.y += window.scrollY;\n }\n else {\n pointerUtils.getXY('page', pointer, page);\n }\n\n return page;\n },\n\n getClientXY: function (pointer, client) {\n client = client || {};\n\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n // Opera Mobile handles the viewport and scrolling oddly\n pointerUtils.getXY('screen', pointer, client);\n }\n else {\n pointerUtils.getXY('client', pointer, client);\n }\n\n return client;\n },\n\n getPointerId: function (pointer) {\n return is.number(pointer.pointerId)? pointer.pointerId : pointer.identifier;\n },\n\n setCoords: function (targetObj, pointers, timeStamp) {\n const pointer = (pointers.length > 1\n ? pointerUtils.pointerAverage(pointers)\n : pointers[0]);\n\n const tmpXY = {};\n\n pointerUtils.getPageXY(pointer, tmpXY);\n targetObj.page.x = tmpXY.x;\n targetObj.page.y = tmpXY.y;\n\n pointerUtils.getClientXY(pointer, tmpXY);\n targetObj.client.x = tmpXY.x;\n targetObj.client.y = tmpXY.y;\n\n targetObj.timeStamp = is.number(timeStamp) ? timeStamp :new Date().getTime();\n },\n\n pointerExtend: pointerExtend,\n\n getTouchPair: function (event) {\n const touches = [];\n\n // array of touches is supplied\n if (is.array(event)) {\n touches[0] = event[0];\n touches[1] = event[1];\n }\n // an event\n else {\n if (event.type === 'touchend') {\n if (event.touches.length === 1) {\n touches[0] = event.touches[0];\n touches[1] = event.changedTouches[0];\n }\n else if (event.touches.length === 0) {\n touches[0] = event.changedTouches[0];\n touches[1] = event.changedTouches[1];\n }\n }\n else {\n touches[0] = event.touches[0];\n touches[1] = event.touches[1];\n }\n }\n\n return touches;\n },\n\n pointerAverage: function (pointers) {\n const average = {\n pageX : 0,\n pageY : 0,\n clientX: 0,\n clientY: 0,\n screenX: 0,\n screenY: 0,\n };\n\n for (const pointer of pointers) {\n for (const prop in average) {\n average[prop] += pointer[prop];\n }\n }\n for (const prop in average) {\n average[prop] /= pointers.length;\n }\n\n return average;\n },\n\n touchBBox: function (event) {\n if (!event.length && !(event.touches && event.touches.length > 1)) {\n return;\n }\n\n const touches = pointerUtils.getTouchPair(event);\n const minX = Math.min(touches[0].pageX, touches[1].pageX);\n const minY = Math.min(touches[0].pageY, touches[1].pageY);\n const maxX = Math.max(touches[0].pageX, touches[1].pageX);\n const maxY = Math.max(touches[0].pageY, touches[1].pageY);\n\n return {\n x: minX,\n y: minY,\n left: minX,\n top: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n },\n\n touchDistance: function (event, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n\n\n const dx = touches[0][sourceX] - touches[1][sourceX];\n const dy = touches[0][sourceY] - touches[1][sourceY];\n\n return hypot(dx, dy);\n },\n\n touchAngle: function (event, prevAngle, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n const dx = touches[1][sourceX] - touches[0][sourceX];\n const dy = touches[1][sourceY] - touches[0][sourceY];\n const angle = 180 * Math.atan2(dy , dx) / Math.PI;\n\n return angle;\n },\n\n getPointerType: function (pointer) {\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : is.number(pointer.pointerType)\n ? [undefined, undefined,'touch', 'pen', 'mouse'][pointer.pointerType]\n // if the PointerEvent API isn't available, then the \"pointer\" must\n // be either a MouseEvent, TouchEvent, or Touch object\n : /touch/.test(pointer.type) || pointer instanceof domObjects.Touch\n ? 'touch'\n : 'mouse';\n },\n\n // [ event.target, event.currentTarget ]\n getEventTargets: function (event) {\n return [\n domUtils.getActualElement(event.path ? event.path[0] : event.target),\n domUtils.getActualElement(event.currentTarget),\n ];\n },\n};\n\nmodule.exports = pointerUtils;\n","const { window } = require('./window');\n\nconst vendors = ['ms', 'moz', 'webkit', 'o'];\nlet lastTime = 0;\nlet request;\nlet cancel;\n\nfor (let x = 0; x < vendors.length && !window.requestAnimationFrame; x++) {\n request = window[vendors[x] + 'RequestAnimationFrame'];\n cancel = window[vendors[x] +'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n}\n\nif (!request) {\n request = function (callback) {\n const currTime = new Date().getTime();\n const timeToCall = Math.max(0, 16 - (currTime - lastTime));\n const id = setTimeout(function () { callback(currTime + timeToCall); },\n timeToCall);\n\n lastTime = currTime + timeToCall;\n return id;\n };\n}\n\nif (!cancel) {\n cancel = function (id) {\n clearTimeout(id);\n };\n}\n\nmodule.exports = {\n request,\n cancel,\n};\n","const extend = require('./extend');\nconst is = require('./is');\nconst {\n closest,\n parentNode,\n getElementRect,\n} = require('./domUtils');\n\nconst rectUtils = {\n getStringOptionResult: function (value, interactable, element) {\n if (!is.string(value)) {\n return null;\n }\n\n if (value === 'parent') {\n value = parentNode(element);\n }\n else if (value === 'self') {\n value = interactable.getRect(element);\n }\n else {\n value = closest(element, value);\n }\n\n return value;\n },\n\n resolveRectLike: function (value, interactable, element, functionArgs) {\n value = rectUtils.getStringOptionResult(value, interactable, element) || value;\n\n if (is.function(value)) {\n value = value.apply(null, functionArgs);\n }\n\n if (is.element(value)) {\n value = getElementRect(value);\n }\n\n return value;\n },\n\n rectToXY: function (rect) {\n return rect && {\n x: 'x' in rect ? rect.x : rect.left,\n y: 'y' in rect ? rect.y : rect.top,\n };\n },\n\n xywhToTlbr: function (rect) {\n if (rect && !('left' in rect && 'top' in rect)) {\n rect = extend({}, rect);\n\n rect.left = rect.x || 0;\n rect.top = rect.y || 0;\n rect.right = rect.right || (rect.left + rect.width);\n rect.bottom = rect.bottom || (rect.top + rect.height);\n }\n\n return rect;\n },\n\n tlbrToXywh: function (rect) {\n if (rect && !('x' in rect && 'y' in rect)) {\n rect = extend({}, rect);\n\n rect.x = rect.left || 0;\n rect.top = rect.top || 0;\n rect.width = rect.width || (rect.right - rect.x);\n rect.height = rect.height || (rect.bottom - rect.y);\n }\n\n return rect;\n },\n};\n\nmodule.exports = rectUtils;\n","const win = module.exports;\nconst isWindow = require('./isWindow');\n\nfunction init (window) {\n // get wrapped window if using Shadow DOM polyfill\n\n win.realWindow = window;\n\n // create a TextNode\n const el = window.document.createTextNode('');\n\n // check if it's wrapped by a polyfill\n if (el.ownerDocument !== window.document\n && typeof window.wrap === 'function'\n && window.wrap(el) === el) {\n // use wrapped window\n window = window.wrap(window);\n }\n\n win.window = window;\n}\n\nif (typeof window === 'undefined') {\n win.window = undefined;\n win.realWindow = undefined;\n}\nelse {\n init(window);\n}\n\nwin.getWindow = function getWindow (node) {\n if (isWindow(node)) {\n return node;\n }\n\n const rootNode = (node.ownerDocument || node);\n\n return rootNode.defaultView || rootNode.parentWindow || win.window;\n};\n\nwin.init = init;\n"]} \ No newline at end of file diff --git a/dist/interact.min.js b/dist/interact.min.js index c0bb2476c..2d1f0fb62 100644 --- a/dist/interact.min.js +++ b/dist/interact.min.js @@ -1,6 +1,6 @@ -/* interact.js v1.3.0-alpha.3+sha.9595c40 | https://raw.github.com/taye/interact.js/master/LICENSE */ -!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var t;t="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,t.interact=e()}}(function(){return function e(t,n,r){function i(s,a){if(!n[s]){if(!t[s]){var l="function"==typeof require&&require;if(!a&&l)return l(s,!0);if(o)return o(s,!0);var c=new Error("Cannot find module '"+s+"'");throw c.code="MODULE_NOT_FOUND",c}var p=n[s]={exports:{}};t[s][0].call(p.exports,function(e){var n=t[s][1][e];return i(n||e)},p,p.exports,e,t,n,r)}return n[s].exports}for(var o="function"==typeof require&&require,s=0;s6&&void 0!==arguments[6]&&arguments[6];r(this,e);var f=t.target,v=(f&&f.options||s).deltaSource,g=o(f,p,l),h="start"===c,m="end"===c,y=h?t.startCoords:t.curCoords,x=t.prevEvent;p=p||t.element;var b=i({},y.page),w=i({},y.client);b.x-=g.x,b.y-=g.y,w.x-=g.x,w.y-=g.y,this.ctrlKey=n.ctrlKey,this.altKey=n.altKey,this.shiftKey=n.shiftKey,this.metaKey=n.metaKey,this.button=n.button,this.buttons=n.buttons,this.target=p,this.currentTarget=p,this.relatedTarget=u||null,this.preEnd=d,this.type=l+(c||""),this.interaction=t,this.interactable=f,this.t0=h?t.downTimes[t.downTimes.length-1]:x.t0;var E={interaction:t,event:n,action:l,phase:c,element:p,related:u,page:b,client:w,coords:y,starting:h,ending:m,deltaSource:v,iEvent:this};a.fire("set-xy",E),m?(this.pageX=x.pageX,this.pageY=x.pageY,this.clientX=x.clientX,this.clientY=x.clientY):(this.pageX=b.x,this.pageY=b.y,this.clientX=w.x,this.clientY=w.y),this.x0=t.startCoords.page.x-g.x,this.y0=t.startCoords.page.y-g.y,this.clientX0=t.startCoords.client.x-g.x,this.clientY0=t.startCoords.client.y-g.y,a.fire("set-delta",E),this.timeStamp=y.timeStamp,this.dt=t.pointerDelta.timeStamp,this.duration=this.timeStamp-this.t0,this.speed=t.pointerDelta[v].speed,this.velocityX=t.pointerDelta[v].vx,this.velocityY=t.pointerDelta[v].vy,this.swipe=m||"inertiastart"===c?this.getSwipe():null,a.fire("new",E)}return e.prototype.getSwipe=function(){var e=this.interaction;if(e.prevEvent.speed<600||this.timeStamp-e.prevEvent.timeStamp>150)return null;var t=180*Math.atan2(e.prevEvent.velocityY,e.prevEvent.velocityX)/Math.PI;t<0&&(t+=360);var n=112.5<=t&&t<247.5,r=202.5<=t&&t<337.5,i=!n&&(292.5<=t||t<67.5);return{up:r,down:!r&&22.5<=t&&t<157.5,left:n,right:i,angle:t,speed:e.prevEvent.speed,velocity:{x:e.prevEvent.velocityX,y:e.prevEvent.velocityY}}},e.prototype.preventDefault=function(){},e.prototype.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},e.prototype.stopPropagation=function(){this.propagationStopped=!0},e}();a.on("set-delta",function(e){var t=e.iEvent,n=e.interaction,r=e.starting,i=e.deltaSource,o=r?t:n.prevEvent;"client"===i?(t.dx=t.clientX-o.clientX,t.dy=t.clientY-o.clientY):(t.dx=t.pageX-o.pageX,t.dy=t.pageY-o.pageY)}),l.signals=a,t.exports=l},{"./defaultOptions":18,"./utils/Signals":35,"./utils/extend":41,"./utils/getOriginXY":42}],4:[function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=e("./utils/is"),o=e("./utils/events"),s=e("./utils/extend"),a=e("./actions/base"),l=e("./scope"),c=e("./Eventable"),p=e("./defaultOptions"),u=e("./utils/Signals").new(),d=e("./utils/domUtils"),f=d.getElementRect,v=d.nodeContains,g=d.trySelector,h=e("./utils/window"),m=h.getWindow,y=e("./utils/arr"),x=y.indexOf,b=y.contains,w=e("./utils/browser"),E=w.wheelEvent;l.interactables=[];var S=function(){function e(t,n){r(this,e),n=n||{},this.target=t,this.events=new c,this._context=n.context||l.document,this._win=m(g(t)?this._context:t),this._doc=this._win.document,u.fire("new",{target:t,options:n,interactable:this,win:this._win}),l.addDocument(this._doc,this._win),l.interactables.push(this),this.set(n)}return e.prototype.setOnEvents=function(e,t){var n="on"+e;return i.function(t.onstart)&&(this.events[n+"start"]=t.onstart),i.function(t.onmove)&&(this.events[n+"move"]=t.onmove),i.function(t.onend)&&(this.events[n+"end"]=t.onend),i.function(t.oninertiastart)&&(this.events[n+"inertiastart"]=t.oninertiastart),this},e.prototype.setPerAction=function(e,t){for(var n in t)n in p[e]&&(i.object(t[n])?(this.options[e][n]=s(this.options[e][n]||{},t[n]),i.object(p.perAction[n])&&"enabled"in p.perAction[n]&&(this.options[e][n].enabled=!1!==t[n].enabled)):i.bool(t[n])&&i.object(p.perAction[n])?this.options[e][n].enabled=t[n]:void 0!==t[n]&&(this.options[e][n]=t[n]))},e.prototype.getRect=function(e){return e=e||this.target,i.string(this.target)&&!i.element(e)&&(e=this._context.querySelector(this.target)),f(e)},e.prototype.rectChecker=function(e){return i.function(e)?(this.getRect=e,this):null===e?(delete this.options.getRect,this):this.getRect},e.prototype._backCompatOption=function(e,t){if(g(t)||i.object(t)){this.options[e]=t;for(var n=a.names,r=Array.isArray(n),o=0,n=r?n:n[Symbol.iterator]();;){var s;if(r){if(o>=n.length)break;s=n[o++]}else{if(o=n.next(),o.done)break;s=o.value}var l=s;this.options[l][e]=t}return this}return this.options[e]},e.prototype.origin=function(e){return this._backCompatOption("origin",e)},e.prototype.deltaSource=function(e){return"page"===e||"client"===e?(this.options.deltaSource=e,this):this.options.deltaSource},e.prototype.context=function(){return this._context},e.prototype.inContext=function(e){return this._context===e.ownerDocument||v(this._context,e)},e.prototype.fire=function(e){return this.events.fire(e),this},e.prototype._onOffMultiple=function(e,t,n,r){if(i.string(t)&&-1!==t.search(" ")&&(t=t.trim().split(/ +/)),i.array(t)){for(var o=0;o=l.length)break;f=l[d++]}else{if(d=l.next(),d.done)break;f=d.value}var v=f;this.options[v]=p.base[v],v in t&&this[v](t[v])}return u.fire("set",{options:t,interactable:this}),this},e.prototype.unset=function(){if(o.remove(this.target,"all"),i.string(this.target))for(var e in o.delegatedEvents){var t=o.delegatedEvents[e];t.selectors[0]===this.target&&t.contexts[0]===this._context&&(t.selectors.splice(0,1),t.contexts.splice(0,1),t.listeners.splice(0,1),t.selectors.length||(t[e]=null)),o.remove(this._context,e,o.delegateListener),o.remove(this._context,e,o.delegateUseCapture,!0)}else o.remove(this,"all");u.fire("unset",{interactable:this}),l.interactables.splice(x(l.interactables,this),1);for(var n=l.interactions||[],r=Array.isArray(n),s=0,n=r?n:n[Symbol.iterator]();;){var a;if(r){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var c=a;c.target===this&&c.interacting()&&c.stop()}return l.interact},e}();l.interactables.indexOfElement=function(e,t){t=t||l.document;for(var n=0;n=y.length)break;w=y[b++]}else{if(b=y.next(),b.done)break;w=b.value}var E=w,S=E[0],T=E[1];T._updateEventTargets(r,i),T[e](S,t,r,i)}}}function o(e){for(var t=0;te.pointerMoveTolerance);var a={pointer:t,pointerIndex:this.getPointerIndex(t),event:n,eventTarget:r,dx:o,dy:s,duplicate:i,interaction:this,interactingBeforeMove:this.interacting()};i||l.setCoordDeltas(this.pointerDelta,this.prevCoords,this.curCoords),d.fire("move",a),i||(this.interacting()&&this.doMove(a),this.pointerWasMoved&&l.copyCoords(this.prevCoords,this.curCoords))},e.prototype.doMove=function(e){e=l.extend({pointer:this.pointers[0],event:this.prevEvent,eventTarget:this._eventTarget,interaction:this},e||{}),d.fire("before-action-move",e),this._dontFireMove||d.fire("action-move",e),this._dontFireMove=!1},e.prototype.pointerUp=function(e,t,n,r){var i=this.getPointerIndex(e);d.fire(/cancel$/i.test(t.type)?"cancel":"up",{pointer:e,pointerIndex:i,event:t,eventTarget:n,curEventTarget:r,interaction:this}),this.simulation||this.end(t),this.pointerIsDown=!1,this.removePointer(e,t)},e.prototype.end=function(e){e=e||this.prevEvent,this.interacting()&&d.fire("action-end",{event:e,interaction:this}),this.stop()},e.prototype.currentAction=function(){return this._interacting?this.prepared.name:null},e.prototype.interacting=function(){return this._interacting},e.prototype.stop=function(){d.fire("stop",{interaction:this}),this._interacting&&(d.fire("stop-active",{interaction:this}),d.fire("stop-"+this.prepared.name,{interaction:this})),this.target=this.element=null,this._interacting=!1,this.prepared.name=this.prevEvent=null},e.prototype.getPointerIndex=function(e){return l.indexOf(this.pointerIds,l.getPointerId(e))},e.prototype.updatePointer=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:t&&/(down|start)$/i.test(t.type),r=l.getPointerId(e),i=this.getPointerIndex(e);return-1===i&&(i=this.pointerIds.length,this.pointerIds[i]=r),n&&d.fire("update-pointer-down",{pointer:e,event:t,down:n,pointerId:r,pointerIndex:i,interaction:this}),this.pointers[i]=e,i},e.prototype.removePointer=function(e,t){var n=l.getPointerId(e),r=this.mouse?0:l.indexOf(this.pointerIds,n);-1!==r&&(d.fire("remove-pointer",{pointer:e,event:t,pointerIndex:r,interaction:this}),this.pointers.splice(r,1),this.pointerIds.splice(r,1),this.downTargets.splice(r,1),this.downTimes.splice(r,1))},e.prototype._updateEventTargets=function(e,t){this._eventTarget=e,this._curEventTarget=t},e}(),m=0,y=v.length;m=i.length)break;a=i[s++]}else{if(s=i.next(),s.done)break;a=s.value}var l=a;if(l.options.drop.enabled){var c=l.options.drop.accept;if(!(p.is.element(c)&&c!==t||p.is.string(c)&&!p.matchesSelector(t,c)))for(var d=p.is.string(l.target)?l._context.querySelectorAll(l.target):[l.target],f=0;fo.left&&c.xo.top&&c.y=o.left&&v<=o.right&&g>=o.top&&g<=o.bottom}if(f&&p.is.number(a)){s=Math.max(0,Math.min(o.right,f.right)-Math.max(o.left,f.left))*Math.max(0,Math.min(o.bottom,f.bottom)-Math.max(o.top,f.top))/(f.width*f.height)>=a}return this.options.drop.checker&&(s=this.options.drop.checker(e,t,s,this,i,n,r)),s},v.signals.on("unset",function(e){e.interactable.dropzone(!1)}),v.settingsMethods.push("dropChecker"),g.signals.on("new",function(e){e.dropTarget=null,e.dropElement=null,e.prevDropTarget=null,e.prevDropElement=null,e.dropEvents=null,e.activeDrops={dropzones:[],elements:[],rects:[]}}),g.signals.on("stop",function(e){var t=e.interaction;t.dropTarget=t.dropElement=t.prevDropTarget=t.prevDropElement=null}),d.dynamicDrop=function(e){return p.is.bool(e)?(y=e,d):y},p.merge(v.eventTypes,["dragenter","dragleave","dropactivate","dropdeactivate","dropmove","drop"]),c.methodDict.drop="dropzone",h.drop=m.defaults,t.exports=m},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../interact":21,"../scope":34,"../utils":44,"./base":6}],9:[function(e,t,n){"use strict";var r=e("./base"),i=e("../utils"),o=e("../InteractEvent"),s=e("../Interactable"),a=e("../Interaction"),l=e("../defaultOptions"),c={defaults:{enabled:!1,origin:null,restrict:null},checker:function(e,t,n,r,i){return i.pointerIds.length>=2?{name:"gesture"}:null},getCursor:function(){return""}};o.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;"gesturestart"===t.type&&(t.ds=0,n.gesture.startDistance=n.gesture.prevDistance=t.distance,n.gesture.startAngle=n.gesture.prevAngle=t.angle,n.gesture.scale=1)}),o.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;"gesturemove"===t.type&&(t.ds=t.scale-n.gesture.scale,n.target.fire(t),n.gesture.prevAngle=t.angle,n.gesture.prevDistance=t.distance,t.scale===1/0||null===t.scale||void 0===t.scale||isNaN(t.scale)||(n.gesture.scale=t.scale))}),s.prototype.gesturable=function(e){return i.is.object(e)?(this.options.gesture.enabled=!1!==e.enabled,this.setPerAction("gesture",e),this.setOnEvents("gesture",e),this):i.is.bool(e)?(this.options.gesture.enabled=e,e||(this.ongesturestart=this.ongesturestart=this.ongestureend=null),this):this.options.gesture},o.signals.on("set-delta",function(e){var t=e.interaction,n=e.iEvent,r=e.action,s=e.event,a=e.starting,l=e.ending,c=e.deltaSource;if("gesture"===r){var p=t.pointers;n.touches=[p[0],p[1]],a?(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=1,n.ds=0,n.angle=i.touchAngle(p,void 0,c),n.da=0):l||s instanceof o?(n.distance=t.prevEvent.distance,n.box=t.prevEvent.box,n.scale=t.prevEvent.scale,n.ds=n.scale-1,n.angle=t.prevEvent.angle,n.da=n.angle-t.gesture.startAngle):(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=n.distance/t.gesture.startDistance,n.angle=i.touchAngle(p,t.gesture.prevAngle,c),n.ds=n.scale-t.gesture.prevScale,n.da=n.angle-t.gesture.prevAngle)}}),a.signals.on("new",function(e){e.gesture={start:{x:0,y:0},startDistance:0,prevDistance:0,distance:0,scale:1,startAngle:0,prevAngle:0}}),r.gesture=c,r.names.push("gesture"),i.merge(s.eventTypes,["gesturestart","gesturemove","gestureend"]),r.methodDict.gesture="gesturable",l.gesture=c.defaults,t.exports=c},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"./base":6}],10:[function(e,t,n){"use strict";function r(e,t,n,r,i,s,a){if(!t)return!1;if(!0===t){var l=o.is.number(s.width)?s.width:s.right-s.left,c=o.is.number(s.height)?s.height:s.bottom-s.top;if(l<0&&("left"===e?e="right":"right"===e&&(e="left")),c<0&&("top"===e?e="bottom":"bottom"===e&&(e="top")),"left"===e)return n.x<(l>=0?s.left:s.right)+a;if("top"===e)return n.y<(c>=0?s.top:s.bottom)+a;if("right"===e)return n.x>(l>=0?s.right:s.left)-a;if("bottom"===e)return n.y>(c>=0?s.bottom:s.top)-a}return!!o.is.element(r)&&(o.is.element(t)?t===r:o.matchesUpTo(r,t,i))}var i=e("./base"),o=e("../utils"),s=e("../utils/browser"),a=e("../InteractEvent"),l=e("../Interactable"),c=e("../Interaction"),p=e("../defaultOptions"),u=s.supportsTouch||s.supportsPointerEvent?20:10,d={defaults:{enabled:!1,mouseButtons:null,origin:null,snap:null,restrict:null,inertia:null,autoScroll:null,square:!1,preserveAspectRatio:!1,axis:"xy",margin:NaN,edges:null,invert:"none"},checker:function(e,t,n,i,s,a){if(!a)return null;var l=o.extend({},s.curCoords.page),c=n.options;if(c.resize.enabled){var p=c.resize,d={left:!1,right:!1,top:!1,bottom:!1};if(o.is.object(p.edges)){for(var f in d)d[f]=r(f,p.edges[f],l,s._eventTarget,i,a,p.margin||u);if(d.left=d.left&&!d.right,d.top=d.top&&!d.bottom,d.left||d.right||d.top||d.bottom)return{name:"resize",edges:d}}else{var v="y"!==c.resize.axis&&l.x>a.right-u,g="x"!==c.resize.axis&&l.y>a.bottom-u;if(v||g)return{name:"resize",axes:(v?"x":"")+(g?"y":"")}}}return null},cursors:s.isIe9OrOlder?{x:"e-resize",y:"s-resize",xy:"se-resize",top:"n-resize",left:"w-resize",bottom:"s-resize",right:"e-resize",topleft:"se-resize",bottomright:"se-resize",topright:"ne-resize",bottomleft:"ne-resize"}:{x:"ew-resize",y:"ns-resize",xy:"nwse-resize",top:"ns-resize",left:"ew-resize",bottom:"ns-resize",right:"ew-resize",topleft:"nwse-resize",bottomright:"nwse-resize",topright:"nesw-resize",bottomleft:"nesw-resize"},getCursor:function(e){if(e.axis)return d.cursors[e.name+e.axis];if(e.edges){for(var t="",n=["top","bottom","left","right"],r=0;r<4;r++)e.edges[n[r]]&&(t+=n[r]);return d.cursors[t]}}};a.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;if("resizestart"===t.type&&n.prepared.edges){var r=n.target.getRect(n.element),i=n.target.options.resize;if(i.square||i.preserveAspectRatio){var s=o.extend({},n.prepared.edges);s.top=s.top||s.left&&!s.bottom,s.left=s.left||s.top&&!s.right,s.bottom=s.bottom||s.right&&!s.top,s.right=s.right||s.bottom&&!s.left,n.prepared._linkedEdges=s}else n.prepared._linkedEdges=null;i.preserveAspectRatio&&(n.resizeStartAspectRatio=r.width/r.height),n.resizeRects={start:r,current:o.extend({},r),inverted:o.extend({},r),previous:o.extend({},r),delta:{left:0,right:0,width:0,top:0,bottom:0,height:0}},t.rect=n.resizeRects.inverted,t.deltaRect=n.resizeRects.delta}}),a.signals.on("new",function(e){var t=e.iEvent,n=e.phase,r=e.interaction;if("move"===n&&r.prepared.edges){var i=r.target.options.resize,s=i.invert,a="reposition"===s||"negate"===s,l=r.prepared.edges,c=r.resizeRects.start,p=r.resizeRects.current,u=r.resizeRects.inverted,d=r.resizeRects.delta,f=o.extend(r.resizeRects.previous,u),v=l,g=t.dx,h=t.dy;if(i.preserveAspectRatio||i.square){var m=i.preserveAspectRatio?r.resizeStartAspectRatio:1;l=r.prepared._linkedEdges,v.left&&v.bottom||v.right&&v.top?h=-g/m:v.left||v.right?h=g/m:(v.top||v.bottom)&&(g=h*m)}if(l.top&&(p.top+=h),l.bottom&&(p.bottom+=h),l.left&&(p.left+=g),l.right&&(p.right+=g),a){if(o.extend(u,p),"reposition"===s){var y=void 0;u.top>u.bottom&&(y=u.top,u.top=u.bottom,u.bottom=y),u.left>u.right&&(y=u.left,u.left=u.right,u.right=y)}}else u.top=Math.min(p.top,c.bottom),u.bottom=Math.max(p.bottom,c.top),u.left=Math.min(p.left,c.right),u.right=Math.max(p.right,c.left);u.width=u.right-u.left,u.height=u.bottom-u.top;for(var x in u)d[x]=u[x]-f[x];t.edges=r.prepared.edges,t.rect=u,t.deltaRect=d}}),l.prototype.resizable=function(e){return o.is.object(e)?(this.options.resize.enabled=!1!==e.enabled,this.setPerAction("resize",e),this.setOnEvents("resize",e),/^x$|^y$|^xy$/.test(e.axis)?this.options.resize.axis=e.axis:null===e.axis&&(this.options.resize.axis=p.resize.axis),o.is.bool(e.preserveAspectRatio)?this.options.resize.preserveAspectRatio=e.preserveAspectRatio:o.is.bool(e.square)&&(this.options.resize.square=e.square),this):o.is.bool(e)?(this.options.resize.enabled=e,e||(this.onresizestart=this.onresizestart=this.onresizeend=null),this):this.options.resize},c.signals.on("new",function(e){ -e.resizeAxes="xy"}),a.signals.on("set-delta",function(e){var t=e.interaction,n=e.iEvent;"resize"===e.action&&t.resizeAxes&&(t.target.options.resize.square?("y"===t.resizeAxes?n.dx=n.dy:n.dy=n.dx,n.axes="xy"):(n.axes=t.resizeAxes,"x"===t.resizeAxes?n.dy=0:"y"===t.resizeAxes&&(n.dx=0)))}),i.resize=d,i.names.push("resize"),o.merge(l.eventTypes,["resizestart","resizemove","resizeinertiastart","resizeinertiaresume","resizeend"]),i.methodDict.resize="resizable",p.resize=d.defaults,t.exports=d},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"../utils/browser":37,"./base":6}],11:[function(e,t,n){"use strict";var r=e("./utils/raf"),i=e("./utils/window").getWindow,o=e("./utils/is"),s=e("./utils/domUtils"),a=e("./Interaction"),l=e("./defaultOptions"),c={defaults:{enabled:!1,container:null,margin:60,speed:300},interaction:null,i:null,x:0,y:0,isScrolling:!1,prevTime:0,start:function(e){c.isScrolling=!0,r.cancel(c.i),c.interaction=e,c.prevTime=(new Date).getTime(),c.i=r.request(c.scroll)},stop:function(){c.isScrolling=!1,r.cancel(c.i)},scroll:function(){var e=c.interaction.target.options[c.interaction.prepared.name].autoScroll,t=e.container||i(c.interaction.element),n=(new Date).getTime(),s=(n-c.prevTime)/1e3,a=e.speed*s;a>=1&&(o.window(t)?t.scrollBy(c.x*a,c.y*a):t&&(t.scrollLeft+=c.x*a,t.scrollTop+=c.y*a),c.prevTime=n),c.isScrolling&&(r.cancel(c.i),c.i=r.request(c.scroll))},check:function(e,t){var n=e.options;return n[t].autoScroll&&n[t].autoScroll.enabled},onInteractionMove:function(e){var t=e.interaction,n=e.pointer;if(t.interacting()&&c.check(t.target,t.prepared.name)){if(t.simulation)return void(c.x=c.y=0);var r=void 0,a=void 0,l=void 0,p=void 0,u=t.target.options[t.prepared.name].autoScroll,d=u.container||i(t.element);if(o.window(d))p=n.clientXd.innerWidth-c.margin,l=n.clientY>d.innerHeight-c.margin;else{var f=s.getElementClientRect(d);p=n.clientXf.right-c.margin,l=n.clientY>f.bottom-c.margin}c.x=a?1:p?-1:0,c.y=l?1:r?-1:0,c.isScrolling||(c.margin=u.margin,c.speed=u.speed,c.start(t))}}};a.signals.on("stop-active",function(){c.stop()}),a.signals.on("action-move",c.onInteractionMove),l.perAction.autoScroll=c.defaults,t.exports=c},{"./Interaction":5,"./defaultOptions":18,"./utils/domUtils":39,"./utils/is":46,"./utils/raf":50,"./utils/window":52}],12:[function(e,t,n){"use strict";var r=e("../Interactable"),i=e("../actions/base"),o=e("../utils/is"),s=e("../utils/domUtils");r.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},r.prototype.ignoreFrom=function(e){return this._backCompatOption("ignoreFrom",e)},r.prototype.allowFrom=function(e){return this._backCompatOption("allowFrom",e)},r.prototype.testIgnore=function(e,t,n){return!(!e||!o.element(n))&&(o.string(e)?s.matchesUpTo(n,e,t):!!o.element(e)&&s.nodeContains(e,n))},r.prototype.testAllow=function(e,t,n){return!e||!!o.element(n)&&(o.string(e)?s.matchesUpTo(n,e,t):!!o.element(e)&&s.nodeContains(e,n))},r.prototype.testIgnoreAllow=function(e,t,n){return!this.testIgnore(e.ignoreFrom,t,n)&&this.testAllow(e.allowFrom,t,n)},r.prototype.actionChecker=function(e){return o.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},r.prototype.styleCursor=function(e){return o.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},r.prototype.defaultActionChecker=function(e,t,n,r){for(var o=this.getRect(r),s=null,a=i.names,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var u=p;if((!n.pointerIsDown||!n.mouse||0!=(t.buttons&this.options[u].mouseButtons))&&(s=i[u].checker(e,t,this,r,n,o)))return s}}},{"../Interactable":4,"../actions/base":6,"../utils/domUtils":39,"../utils/is":46}],13:[function(e,t,n){"use strict";function r(e,t,n,r){return g.is.object(e)&&t.testIgnoreAllow(t.options[e.name],n,r)&&t.options[e.name].enabled&&a(t,n,e)?e:null}function i(e,t,n,i,o,s){for(var a=0,l=i.length;a=m.maxInteractions)return!1;if(u.target===e){if((a+=d===n.name|0)>=i)return!1;if(u.element===t&&(l++,d!==n.name||l>=o))return!1}}}return m.maxInteractions>0}}var l=e("../interact"),c=e("../Interactable"),p=e("../Interaction"),u=e("../actions/base"),d=e("../defaultOptions"),f=e("../utils/browser"),v=e("../scope"),g=e("../utils"),h=e("../utils/Signals").new();e("./InteractableMethods");var m={signals:h,withinInteractionLimit:a,maxInteractions:1/0,defaults:{perAction:{manualStart:!1,max:1/0,maxPerElement:1,allowFrom:null,ignoreFrom:null}},setActionDefaults:function(e){g.extend(e.defaults,m.defaults.perAction)}};p.signals.on("down",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;if(!t.interacting()){s(t,o(t,n,r,i))}}),p.signals.on("move",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;if(t.mouse&&!t.pointerIsDown&&!t.interacting()){s(t,o(t,n,r,i))}}),p.signals.on("move",function(e){var t=e.interaction,n=e.event;if(t.pointerIsDown&&!t.interacting()&&t.pointerWasMoved&&t.prepared.name){h.fire("before-start",e);var r=t.target;t.prepared.name&&r&&(r.options[t.prepared.name].manualStart||!a(r,t.element,t.prepared)?t.stop(n):t.start(t.prepared,r,t.element))}}),p.signals.on("stop",function(e){var t=e.interaction,n=t.target;n&&n.options.styleCursor&&(n._doc.documentElement.style.cursor="")}),c.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},c.prototype.actionChecker=function(e){return g.is.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},c.prototype.styleCursor=function(e){return g.is.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},c.prototype.defaultActionChecker=function(e,t,n,r){for(var i=this.getRect(r),o=t.buttons||{0:1,1:4,3:8,4:16}[t.button],s=null,a=u.names,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var d=p;if((!n.pointerIsDown||!n.mouse||0!=(o&this.options[d].mouseButtons))&&(s=u[d].checker(e,t,this,r,n,i)))return s}},l.maxInteractions=function(e){return g.is.number(e)?(m.maxInteractions=e,this):m.maxInteractions},c.settingsMethods.push("styleCursor"),c.settingsMethods.push("actionChecker"),c.settingsMethods.push("ignoreFrom"),c.settingsMethods.push("allowFrom"),d.base.actionChecker=null,d.base.styleCursor=!0,g.extend(d.perAction,m.defaults.perAction),t.exports=m},{"../Interactable":4,"../Interaction":5,"../actions/base":6,"../defaultOptions":18,"../interact":21,"../scope":34,"../utils":44,"../utils/Signals":35,"../utils/browser":37,"./InteractableMethods":12}],14:[function(e,t,n){"use strict";var r=e("./base"),i=e("../Interaction");i.signals.on("new",function(e){e.delayTimer=null}),r.signals.on("prepared",function(e){var t=e.interaction,n=t.prepared.name;if(n){var r=t.target.options[n].delay;r>0&&(t.delayTimer=setTimeout(function(){t.start(t.prepared,t.target,t.element)},r))}}),i.signals.on("move",function(e){var t=e.interaction,n=e.duplicate;t.pointerWasMoved&&!n&&clearTimeout(t.delayTimer)}),r.signals.on("before-start",function(e){var t=e.interaction,n=t.prepared.name;if(n){t.target.options[n].delay>0&&(t.prepared.name=null)}})},{"../Interaction":5,"./base":13}],15:[function(e,t,n){"use strict";function r(e,t){if(!t)return!1;var n=t.options.drag.startAxis;return"xy"===e||"xy"===n||n===e}var i=e("./base"),o=e("../scope"),s=e("../utils/browser"),a=e("../utils/is"),l=e("../utils/domUtils"),c=l.matchesSelector,p=l.parentNode;i.setActionDefaults(e("../actions/drag")),i.signals.on("before-start",function(e){var t=e.interaction,n=e.eventTarget,l=e.dx,u=e.dy;if("drag"===t.prepared.name){var d=Math.abs(l),f=Math.abs(u),v=t.target.options.drag,g=v.startAxis,h=d>f?"x":dl.minSpeed&&g>l.endSpeed,b={interaction:t,pageCoords:v,statuses:f,preEnd:!0,requireEndOnly:!0};y&&!x&&(c.resetStatuses(f),m=c.setAll(b),m.shouldMove&&m.locked&&(h=!0)),(x||h)&&(p.copyCoords(i.upCoords,t.curCoords),t.pointers[0]=i.startEvent=new a(t,n,t.prepared.name,"inertiastart",t.element),i.t0=d,i.active=!0,i.allowResume=l.allowResume,t.simulation=i,o.fire(i.startEvent),x?(i.vx0=t.pointerDelta.client.vx,i.vy0=t.pointerDelta.client.vy,i.v0=g,r(t,i),p.extend(v,t.curCoords.page),v.x+=i.xe,v.y+=i.ye,c.resetStatuses(f),m=c.setAll(b),i.modifiedXe+=m.dx,i.modifiedYe+=m.dy,i.i=u.request(t.boundInertiaFrame)):(i.smoothEnd=!0,i.xe=m.dx,i.ye=m.dy,i.sx=i.sy=0,i.i=u.request(t.boundSmoothEndFrame)))}}),l.signals.on("stop-active",function(e){var t=e.interaction,n=t.inertiaStatus;n.active&&(u.cancel(n.i),n.active=!1,t.simulation=null)})},{"./InteractEvent":3,"./Interaction":5,"./modifiers":24,"./utils":44,"./utils/raf":50}],21:[function(e,t,n){"use strict";function r(e,t){var n=a.interactables.get(e,t);return n||(n=new l(e,t),n.events.global=p),n}var i=e("./utils/browser"),o=e("./utils/events"),s=e("./utils"),a=e("./scope"),l=e("./Interactable"),c=e("./Interaction"),p={};r.isSet=function(e,t){return-1!==a.interactables.indexOfElement(e,t&&t.context)},r.on=function(e,t,n){if(s.is.string(e)&&-1!==e.search(" ")&&(e=e.trim().split(/ +/)),s.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.on(f,t,n)}return r}if(s.is.object(e)){for(var v in e)r.on(v,e[v],t);return r}return s.contains(l.eventTypes,e)?p[e]?p[e].push(t):p[e]=[t]:o.add(a.document,e,t,{options:n}),r},r.off=function(e,t,n){if(s.is.string(e)&&-1!==e.search(" ")&&(e=e.trim().split(/ +/)),s.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.off(f,t,n)}return r}if(s.is.object(e)){for(var v in e)r.off(v,e[v],t);return r}if(s.contains(l.eventTypes,e)){var g=void 0;e in p&&-1!==(g=s.indexOf(p[e],t))&&p[e].splice(g,1)}else o.remove(a.document,e,t,n);return r},r.debug=function(){return a},r.getPointerAverage=s.pointerAverage,r.getTouchBBox=s.touchBBox,r.getTouchDistance=s.touchDistance,r.getTouchAngle=s.touchAngle,r.getElementRect=s.getElementRect,r.getElementClientRect=s.getElementClientRect,r.matchesSelector=s.matchesSelector,r.closest=s.closest,r.supportsTouch=function(){return i.supportsTouch},r.supportsPointerEvent=function(){return i.supportsPointerEvent},r.stop=function(e){for(var t=a.interactions.length-1;t>=0;t--)a.interactions[t].stop(e);return r},r.pointerMoveTolerance=function(e){return s.is.number(e)?(c.pointerMoveTolerance=e,this):c.pointerMoveTolerance},r.addDocument=a.addDocument,r.removeDocument=a.removeDocument,a.interact=r,t.exports=r},{"./Interactable":4,"./Interaction":5,"./scope":34,"./utils":44,"./utils/browser":37,"./utils/events":40}],22:[function(e,t,n){"use strict";function r(e){var t=e.interaction,n=e.event;t.target&&t.target.checkAndPreventDefault(n)}var i=e("./Interactable"),o=e("./Interaction"),s=e("./scope"),a=e("./utils/is"),l=e("./utils/events"),c=e("./utils/domUtils"),p=c.nodeContains,u=c.matchesSelector;i.prototype.preventDefault=function(e){return/^(always|never|auto)$/.test(e)?(this.options.preventDefault=e,this):a.bool(e)?(this.options.preventDefault=e?"always":"never",this):this.options.preventDefault},i.prototype.checkAndPreventDefault=function(e){var t=this.options.preventDefault;if("never"!==t)return"always"===t?void e.preventDefault():void(l.supportsOptions||/^(mouse|pointer|touch)*(down|start)/i.test(e.type)||a.element(e.target)&&u(e.target,"input,select,textarea,[contenteditable=true],[contenteditable=true] *")||e.preventDefault())};for(var d=["down","move","up","cancel"],f=0;f=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i;if(o.element&&(o.element===e.target||p(o.element,e.target)))return void o.target.checkAndPreventDefault(e)}}},{"./Interactable":4,"./Interaction":5,"./scope":34,"./utils/domUtils":39,"./utils/events":40,"./utils/is":46}],23:[function(e,t,n){"use strict";function r(e){var t=e.target,n=a.search(e,e.type,t);n&&n.prevTap&&e.clientX===n.prevTap.clientX&&e.clientY===n.prevTap.clientY&&t===n.prevTap.target&&(n.downTargets[0]=t,n.downTimes[0]=(new Date).getTime(),l.fire({interaction:n,event:e,eventTarget:t,pointer:e,type:"tap"}))}var i=e("./scope"),o=e("./utils/events"),s=e("./utils/browser"),a=e("./utils/interactionFinder"),l=e("./pointerEvents/base"),c=e("./utils/window"),p=c.window,u=Object.prototype.toString;if(p.Array.isArray||(p.Array.isArray=function(e){return"[object Array]"===u.call(e)}),String.prototype.trim||(String.prototype.trim=function(){return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")}),s.isIE8){var d=function(e){for(var t=i.interactions,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var o;if(n){if(r>=t.length)break;o=t[r++]}else{if(r=t.next(),r.done)break;o=r.value}var s=o;s.interacting()&&s.target.checkAndPreventDefault(e)}},f=function(e,t){var n=e.doc,i=(e.win,0===t.indexOf("listen")?o.add:o.remove);i(n,"selectstart",d),l&&i(n,"dblclick",r)};i.signals.on("add-document",f),i.signals.on("remove-document",f)}t.exports=null},{"./pointerEvents/base":31,"./scope":34,"./utils/browser":37,"./utils/events":40,"./utils/interactionFinder":45,"./utils/window":52}],24:[function(e,t,n){"use strict";function r(e,t,n){return e&&e.enabled&&(t||!e.endOnly)&&(!n||e.endOnly)}var i=e("../InteractEvent"),o=e("../Interaction"),s=e("../utils/extend"),a={names:[],setOffsets:function(e){var t=e.interaction,n=e.pageCoords,r=t.target,i=t.element,o=t.startOffset,s=r.getRect(i);s?(o.left=n.x-s.left,o.top=n.y-s.top,o.right=s.right-n.x,o.bottom=s.bottom-n.y,"width"in s||(s.width=s.right-s.left),"height"in s||(s.height=s.bottom-s.top)):o.left=o.top=o.right=o.bottom=0,e.rect=s,e.interactable=r,e.element=i;for(var l=0;l=p.length)break;f=p[d++]}else{if(d=p.next(),d.done)break;f=d.value}var v=f,g=a[v],h=t.target.options[t.prepared.name][v];r(h,i,o)&&(e.status=e.status=n[v],e.options=h,e.offset=e.interaction.modifierOffsets[v],g.set(e),e.status.locked&&(l.x+=e.status.dx,l.y+=e.status.dy,c.dx+=e.status.dx,c.dy+=e.status.dy,c.locked=!0))}return c.shouldMove=!e.status||!c.locked||e.status.changed,c},resetStatuses:function(e){for(var t=a.names,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var i;if(n){if(r>=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i,s=e[o]||{};s.dx=s.dy=0,s.modifiedX=s.modifiedY=NaN,s.locked=!1,s.changed=!0,e[o]=s}return e},start:function(e,t){var n=e.interaction,r={interaction:n,pageCoords:("action-resume"===t?n.curCoords:n.startCoords).page,startOffset:n.startOffset,statuses:n.modifierStatuses,preEnd:!1,requireEndOnly:!1};a.setOffsets(r),a.resetStatuses(r.statuses),r.pageCoords=s({},n.startCoords.page),n.modifierResult=a.setAll(r)}};o.signals.on("new",function(e){e.startOffset={left:0,right:0,top:0,bottom:0},e.modifierOffsets={},e.modifierStatuses=a.resetStatuses({}),e.modifierResult=null}),o.signals.on("action-start",a.start),o.signals.on("action-resume",a.start),o.signals.on("before-action-move",function(e){var t=e.interaction,n=e.preEnd,r=e.interactingBeforeMove,i=a.setAll({interaction:t,preEnd:n,pageCoords:t.curCoords.page,statuses:t.modifierStatuses,requireEndOnly:!1});!i.shouldMove&&r&&(t._dontFireMove=!0),t.modifierResult=i}),o.signals.on("action-end",function(e){for(var t=e.interaction,n=e.event,i=0;i=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}var m=h,y=m.x,x=m.y;l.push({x:s.left-i.width*y+u.x,y:s.top-i.height*x+u.y})}else l.push(u);return l},set:function(e){var t=e.interaction,n=e.pageCoords,r=e.status,i=e.options,s=e.offset,a=[],l=void 0,c=void 0,p=void 0;if(r.useStatusXY)c={x:r.x,y:r.y};else{var u=o.getOriginXY(t.target,t.element,t.prepared.name);c=o.extend({},n),c.x-=u.x,c.y-=u.y}r.realX=c.x,r.realY=c.y;for(var d=i.targets?i.targets.length:0,f=s,v=Array.isArray(f),g=0,f=v?f:f[Symbol.iterator]();;){var h;if(v){if(g>=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}for(var m=h,y=m.x,x=m.y,b=c.x-y,w=c.y-x,E=i.targets,S=Array.isArray(E),T=0,E=S?E:E[Symbol.iterator]();;){var C;if(S){if(T>=E.length)break;C=E[T++]}else{if(T=E.next(),T.done)break;C=T.value}var A=C;l=o.is.function(A)?A(b,w,t):A,l&&a.push({x:o.is.number(l.x)?l.x+y:b,y:o.is.number(l.y)?l.y+x:w,range:o.is.number(l.range)?l.range:i.range})}}var D={target:null,inRange:!1,distance:0,range:0,dx:0,dy:0};for(p=0,d=a.length;p=p.length)break;f=p[d++]}else{if(d=p.next(),d.done)break;f=d.value}var v=f,g=void 0;g=a.is.function(v)?v(l,c,t):v,g&&("width"in g&&"height"in g&&(g.x=g.width,g.y=g.height),e.options.targets.push(g))}i.set(e)},modifyCoords:function(e){var t=e.options;e.options=a.extend({},t), -e.options.enabled=t.enabled,e.options.relativePoints=[null],i.modifyCoords(e)}};r.snapSize=l,r.names.push("snapSize"),o.perAction.snapSize=l.defaults,s.defaults.snapSize=l.defaults,t.exports=l},{"../actions/resize":10,"../defaultOptions":18,"../utils/":44,"./index":24,"./snap":28}],30:[function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=e("../utils/pointerUtils");t.exports=function(){function e(t,n,o,s,a){if(r(this,e),i.pointerExtend(this,o),o!==n&&i.pointerExtend(this,n),this.interaction=a,this.timeStamp=(new Date).getTime(),this.originalEvent=o,this.type=t,this.pointerId=i.getPointerId(n),this.pointerType=i.getPointerType(n,a),this.target=s,this.currentTarget=null,"tap"===t){var l=a.getPointerIndex(n);this.dt=this.timeStamp-a.downTimes[l];var c=this.timeStamp-a.tapTime;this.double=!!(a.prevTap&&"doubletap"!==a.prevTap.type&&a.prevTap.target===this.target&&c<500)}else"doubletap"===t&&(this.dt=n.timeStamp-a.tapTime)}return e.prototype.subtractOrigin=function(e){var t=e.x,n=e.y;return this.pageX-=t,this.pageY-=n,this.clientX-=t,this.clientY-=n,this},e.prototype.addOrigin=function(e){var t=e.x,n=e.y;return this.pageX+=t,this.pageY+=n,this.clientX+=t,this.clientY+=n,this},e.prototype.preventDefault=function(){this.originalEvent.preventDefault()},e.prototype.stopPropagation=function(){this.propagationStopped=!0},e.prototype.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},e}()},{"../utils/pointerUtils":49}],31:[function(e,t,n){"use strict";function r(e){for(var t=e.interaction,n=e.pointer,s=e.event,l=e.eventTarget,c=e.type,u=void 0===c?e.pointerEvent.type:c,d=e.targets,f=void 0===d?i(e):d,v=e.pointerEvent,g=void 0===v?new o(u,n,s,l,t):v,h={interaction:t,pointer:n,event:s,eventTarget:l,targets:f,type:u,pointerEvent:g},m=0;m=u.length)break;g=u[v++]}else{if(v=u.next(),v.done)break;g=v.value}var h=g;c.element=h,p.fire("collect-targets",c)}return"hold"===o&&(c.targets=d(c.targets,function(e){return e.eventable.options.holdDuration===t.holdTimers[s].duration})),c.targets}var o=e("./PointerEvent"),s=e("../Interaction"),a=e("../utils"),l=e("../utils/browser"),c=e("../defaultOptions"),p=e("../utils/Signals").new(),u=e("../utils/arr"),d=u.filter,f=["down","up","cancel"],v=["down","up","cancel"],g={PointerEvent:o,fire:r,collectEventTargets:i,signals:p,defaults:{holdDuration:600,ignoreFrom:null,allowFrom:null,origin:{x:0,y:0}},types:["down","move","up","cancel","tap","doubletap","hold"]};s.signals.on("update-pointer-down",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers[n]={duration:1/0,timeout:null}}),s.signals.on("remove-pointer",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers.splice(n,1)}),s.signals.on("move",function(e){var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,s=e.duplicateMove,a=t.getPointerIndex(n);s||t.pointerIsDown&&!t.pointerWasMoved||(t.pointerIsDown&&clearTimeout(t.holdTimers[a].timeout),r({interaction:t,pointer:n,event:i,eventTarget:o,type:"move"}))}),s.signals.on("down",function(e){for(var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,s=e.pointerIndex,c=l.isIE8?a.extend({},i):i,u=t.holdTimers[s],d=a.getPath(o),f={interaction:t,pointer:n,event:i,eventTarget:o,type:"hold",targets:[],path:d,element:null},v=d,g=Array.isArray(v),h=0,v=g?v:v[Symbol.iterator]();;){var m;if(g){if(h>=v.length)break;m=v[h++]}else{if(h=v.next(),h.done)break;m=h.value}var y=m;f.element=y,p.fire("collect-targets",f)}if(f.targets.length){for(var x=1/0,b=0;b=0&&(p.selectors[u]!==e||p.contexts[u]!==t);u--);-1===u&&(u=p.selectors.length,p.selectors.push(e),p.contexts.push(t),p.listeners.push([])),p.listeners[u].push([i,!!s.capture,s.passive])}function s(e,t,n,r,o){var s=f(o),c=O[n],p=!1,u=void 0;if(c)for(u=c.selectors.length-1;u>=0;u--)if(c.selectors[u]===e&&c.contexts[u]===t){for(var d=c.listeners[u],v=d.length-1;v>=0;v--){var g=d[v],h=g[0],m=g[1],y=g[2];if(h===r&&m===!!s.capture&&y===s.passive){d.splice(v,1),d.length||(c.selectors.splice(u,1),c.contexts.splice(u,1),c.listeners.splice(u,1),i(t,n,a),i(t,n,l,!0),c.selectors.length||(O[n]=null)),p=!0;break}}if(p)break}}function a(e,t){var n=f(t),r={},i=O[e.type],o=g.getActualElement(e.path?e.path[0]:e.target),s=o;for(h(r,e),r.originalEvent=e,r.preventDefault=p;v.element(s);){for(var a=0;a=l.length)break;u=l[p++]}else{if(p=l.next(),p.done)break;u=p.value}var d=u,f=s[d](a);if(f)return f}},simulationResume:function(e){var t=e.mouseEvent,n=e.eventType,o=e.eventTarget;if(!/down|start/i.test(n))return null;for(var s=r.interactions,a=Array.isArray(s),l=0,s=a?s:s[Symbol.iterator]();;){var c;if(a){if(l>=s.length)break;c=s[l++]}else{if(l=s.next(),l.done)break;c=l.value}var p=c,u=o;if(p.simulation&&p.simulation.allowResume&&p.mouse===t)for(;u;){if(u===p.element)return p;u=i.parentNode(u)}}return null},mouse:function(e){var t=e.pointerId,n=e.mouseEvent,s=e.eventType;if(!n&&(o.supportsTouch||o.supportsPointerEvent))return null;for(var a=void 0,l=r.interactions,c=Array.isArray(l),p=0,l=c?l:l[Symbol.iterator]();;){var u;if(c){if(p>=l.length)break;u=l[p++]}else{if(p=l.next(),p.done)break;u=p.value}var d=u;if(d.mouse){if(d.simulation&&!i.contains(d.pointerIds,t))continue;if(d.interacting())return d;a||(a=d)}}if(a)return a;for(var f=r.interactions,v=Array.isArray(f),g=0,f=v?f:f[Symbol.iterator]();;){var h;if(v){if(g>=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}var m=h;if(m.mouse&&(!/down/.test(s)||!m.simulation))return m}return null},hasPointer:function(e){for(var t=e.pointerId,n=r.interactions,o=Array.isArray(n),s=0,n=o?n:n[Symbol.iterator]();;){var a;if(o){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var l=a;if(i.contains(l.pointerIds,t))return l}},idle:function(e){for(var t=e.mouseEvent,n=r.interactions,i=Array.isArray(n),o=0,n=i?n:n[Symbol.iterator]();;){var s;if(i){if(o>=n.length)break;s=n[o++]}else{if(o=n.next(),o.done)break;s=o.value}var a=s;if(1===a.pointerIds.length){var l=a.target;if(l&&!l.options.gesture.enabled)continue}else if(a.pointerIds.length>=2)continue;if(!a.interacting()&&t===a.mouse)return a}return null}};t.exports=s},{"../scope":34,"./browser":37,"./index":44}],46:[function(e,t,n){"use strict";var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},i=e("./window"),o=e("./isWindow"),s={array:function(){},window:function(e){return e===i.window||o(e)},docFrag:function(e){return s.object(e)&&11===e.nodeType},object:function(e){return!!e&&"object"===(void 0===e?"undefined":r(e))},function:function(e){return"function"==typeof e},number:function(e){return"number"==typeof e},bool:function(e){return"boolean"==typeof e},string:function(e){return"string"==typeof e},element:function(e){if(!e||"object"!==(void 0===e?"undefined":r(e)))return!1;var t=i.getWindow(e)||i.window;return/object|function/.test(r(t.Element))?e instanceof t.Element:1===e.nodeType&&"string"==typeof e.nodeName}};s.array=function(e){return s.object(e)&&void 0!==e.length&&s.function(e.splice)},t.exports=s},{"./isWindow":47,"./window":52}],47:[function(e,t,n){"use strict";t.exports=function(e){return!(!e||!e.Window)&&e instanceof e.Window}},{}],48:[function(e,t,n){"use strict";function r(e,n){for(var r in n){var i=t.exports.prefixedPropREs,o=!1;for(var s in i)if(0===r.indexOf(s)&&i[s].test(r)){o=!0;break}o||"function"==typeof n[r]||(e[r]=n[r])}return e}r.prefixedPropREs={webkit:/(Movement[XY]|Radius[XY]|RotationAngle|Force)$/},t.exports=r},{}],49:[function(e,t,n){"use strict";var r=e("./hypot"),i=e("./browser"),o=e("./domObjects"),s=e("./domUtils"),a=e("./is"),l=e("./pointerExtend"),c={copyCoords:function(e,t){e.page=e.page||{},e.page.x=t.page.x,e.page.y=t.page.y,e.client=e.client||{},e.client.x=t.client.x,e.client.y=t.client.y,e.timeStamp=t.timeStamp},setCoordDeltas:function(e,t,n){e.page.x=n.page.x-t.page.x,e.page.y=n.page.y-t.page.y,e.client.x=n.client.x-t.client.x,e.client.y=n.client.y-t.client.y,e.timeStamp=n.timeStamp-t.timeStamp;var i=Math.max(e.timeStamp/1e3,.001);e.page.speed=r(e.page.x,e.page.y)/i,e.page.vx=e.page.x/i,e.page.vy=e.page.y/i,e.client.speed=r(e.client.x,e.page.y)/i,e.client.vx=e.client.x/i,e.client.vy=e.client.y/i},isNativePointer:function(e){return e instanceof o.Event||e instanceof o.Touch},getXY:function(e,t,n){return n=n||{},e=e||"page",n.x=t[e+"X"],n.y=t[e+"Y"],n},getPageXY:function(e,t){return t=t||{},i.isOperaMobile&&c.isNativePointer(e)?(c.getXY("screen",e,t),t.x+=window.scrollX,t.y+=window.scrollY):c.getXY("page",e,t),t},getClientXY:function(e,t){return t=t||{},i.isOperaMobile&&c.isNativePointer(e)?c.getXY("screen",e,t):c.getXY("client",e,t),t},getPointerId:function(e){return a.number(e.pointerId)?e.pointerId:e.identifier},setCoords:function(e,t,n){var r=t.length>1?c.pointerAverage(t):t[0],i={};c.getPageXY(r,i),e.page.x=i.x,e.page.y=i.y,c.getClientXY(r,i),e.client.x=i.x,e.client.y=i.y,e.timeStamp=a.number(n)?n:(new Date).getTime()},pointerExtend:l,getTouchPair:function(e){var t=[];return a.array(e)?(t[0]=e[0],t[1]=e[1]):"touchend"===e.type?1===e.touches.length?(t[0]=e.touches[0],t[1]=e.changedTouches[0]):0===e.touches.length&&(t[0]=e.changedTouches[0],t[1]=e.changedTouches[1]):(t[0]=e.touches[0],t[1]=e.touches[1]),t},pointerAverage:function(e){for(var t={pageX:0,pageY:0,clientX:0,clientY:0,screenX:0,screenY:0},n=e,r=Array.isArray(n),i=0,n=r?n:n[Symbol.iterator]();;){var o;if(r){if(i>=n.length)break;o=n[i++]}else{if(i=n.next(),i.done)break;o=i.value}var s=o;for(var a in t)t[a]+=s[a]}for(var l in t)t[l]/=e.length;return t},touchBBox:function(e){if(e.length||e.touches&&e.touches.length>1){var t=c.getTouchPair(e),n=Math.min(t[0].pageX,t[1].pageX),r=Math.min(t[0].pageY,t[1].pageY);return{x:n,y:r,left:n,top:r,width:Math.max(t[0].pageX,t[1].pageX)-n,height:Math.max(t[0].pageY,t[1].pageY)-r}}},touchDistance:function(e,t){var n=t+"X",i=t+"Y",o=c.getTouchPair(e),s=o[0][n]-o[1][n],a=o[0][i]-o[1][i];return r(s,a)},touchAngle:function(e,t,n){var r=n+"X",i=n+"Y",o=c.getTouchPair(e),s=o[1][r]-o[0][r],a=o[1][i]-o[0][i];return 180*Math.atan2(a,s)/Math.PI},getPointerType:function(e,t){return t.mouse?"mouse":i.supportsPointerEvent?a.string(e.pointerType)?e.pointerType:[void 0,void 0,"touch","pen","mouse"][e.pointerType]:"touch"},getEventTargets:function(e){return[s.getActualElement(e.path?e.path[0]:e.target),s.getActualElement(e.currentTarget)]}};t.exports=c},{"./browser":37,"./domObjects":38,"./domUtils":39,"./hypot":43,"./is":46,"./pointerExtend":48}],50:[function(e,t,n){"use strict";for(var r=e("./window"),i=r.window,o=["ms","moz","webkit","o"],s=0,a=void 0,l=void 0,c=0;c6&&void 0!==arguments[6]&&arguments[6];r(this,e);var f=t.target,v=(f&&f.options||s).deltaSource,g=o(f,p,l),h="start"===c,m="end"===c,y=h?t.startCoords:t.curCoords,x=t.prevEvent;p=p||t.element;var b=i({},y.page),w=i({},y.client);b.x-=g.x,b.y-=g.y,w.x-=g.x,w.y-=g.y,this.ctrlKey=n.ctrlKey,this.altKey=n.altKey,this.shiftKey=n.shiftKey,this.metaKey=n.metaKey,this.button=n.button,this.buttons=n.buttons,this.target=p,this.currentTarget=p,this.relatedTarget=u||null,this.preEnd=d,this.type=l+(c||""),this.interaction=t,this.interactable=f,this.t0=h?t.downTimes[t.downTimes.length-1]:x.t0;var E={interaction:t,event:n,action:l,phase:c,element:p,related:u,page:b,client:w,coords:y,starting:h,ending:m,deltaSource:v,iEvent:this};a.fire("set-xy",E),m?(this.pageX=x.pageX,this.pageY=x.pageY,this.clientX=x.clientX,this.clientY=x.clientY):(this.pageX=b.x,this.pageY=b.y,this.clientX=w.x,this.clientY=w.y),this.x0=t.startCoords.page.x-g.x,this.y0=t.startCoords.page.y-g.y,this.clientX0=t.startCoords.client.x-g.x,this.clientY0=t.startCoords.client.y-g.y,a.fire("set-delta",E),this.timeStamp=y.timeStamp,this.dt=t.pointerDelta.timeStamp,this.duration=this.timeStamp-this.t0,this.speed=t.pointerDelta[v].speed,this.velocityX=t.pointerDelta[v].vx,this.velocityY=t.pointerDelta[v].vy,this.swipe=m||"inertiastart"===c?this.getSwipe():null,a.fire("new",E)}return e.prototype.getSwipe=function(){var e=this.interaction;if(e.prevEvent.speed<600||this.timeStamp-e.prevEvent.timeStamp>150)return null;var t=180*Math.atan2(e.prevEvent.velocityY,e.prevEvent.velocityX)/Math.PI;t<0&&(t+=360);var n=112.5<=t&&t<247.5,r=202.5<=t&&t<337.5,i=!n&&(292.5<=t||t<67.5);return{up:r,down:!r&&22.5<=t&&t<157.5,left:n,right:i,angle:t,speed:e.prevEvent.speed,velocity:{x:e.prevEvent.velocityX,y:e.prevEvent.velocityY}}},e.prototype.preventDefault=function(){},e.prototype.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},e.prototype.stopPropagation=function(){this.propagationStopped=!0},e}();a.on("set-delta",function(e){var t=e.iEvent,n=e.interaction,r=e.starting,i=e.deltaSource,o=r?t:n.prevEvent;"client"===i?(t.dx=t.clientX-o.clientX,t.dy=t.clientY-o.clientY):(t.dx=t.pageX-o.pageX,t.dy=t.pageY-o.pageY)}),l.signals=a,t.exports=l},{"./defaultOptions":18,"./utils/Signals":35,"./utils/extend":41,"./utils/getOriginXY":42}],4:[function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=e("./utils/is"),o=e("./utils/events"),s=e("./utils/extend"),a=e("./actions/base"),l=e("./scope"),c=e("./Eventable"),p=e("./defaultOptions"),u=e("./utils/Signals").new(),d=e("./utils/domUtils"),f=d.getElementRect,v=d.nodeContains,g=d.trySelector,h=e("./utils/window"),m=h.getWindow,y=e("./utils/arr"),x=y.indexOf,b=y.contains,w=e("./utils/browser"),E=w.wheelEvent;l.interactables=[];var S=function(){function e(t,n){r(this,e),n=n||{},this.target=t,this.events=new c,this._context=n.context||l.document,this._win=m(g(t)?this._context:t),this._doc=this._win.document,u.fire("new",{target:t,options:n,interactable:this,win:this._win}),l.addDocument(this._doc,this._win),l.interactables.push(this),this.set(n)}return e.prototype.setOnEvents=function(e,t){var n="on"+e;return i.function(t.onstart)&&(this.events[n+"start"]=t.onstart),i.function(t.onmove)&&(this.events[n+"move"]=t.onmove),i.function(t.onend)&&(this.events[n+"end"]=t.onend),i.function(t.oninertiastart)&&(this.events[n+"inertiastart"]=t.oninertiastart),this},e.prototype.setPerAction=function(e,t){for(var n in t)n in p[e]&&(i.object(t[n])?(this.options[e][n]=s(this.options[e][n]||{},t[n]),i.object(p.perAction[n])&&"enabled"in p.perAction[n]&&(this.options[e][n].enabled=!1!==t[n].enabled)):i.bool(t[n])&&i.object(p.perAction[n])?this.options[e][n].enabled=t[n]:void 0!==t[n]&&(this.options[e][n]=t[n]))},e.prototype.getRect=function(e){return e=e||this.target,i.string(this.target)&&!i.element(e)&&(e=this._context.querySelector(this.target)),f(e)},e.prototype.rectChecker=function(e){return i.function(e)?(this.getRect=e,this):null===e?(delete this.options.getRect,this):this.getRect},e.prototype._backCompatOption=function(e,t){if(g(t)||i.object(t)){this.options[e]=t;for(var n=a.names,r=Array.isArray(n),o=0,n=r?n:n[Symbol.iterator]();;){var s;if(r){if(o>=n.length)break;s=n[o++]}else{if(o=n.next(),o.done)break;s=o.value}var l=s;this.options[l][e]=t}return this}return this.options[e]},e.prototype.origin=function(e){return this._backCompatOption("origin",e)},e.prototype.deltaSource=function(e){return"page"===e||"client"===e?(this.options.deltaSource=e,this):this.options.deltaSource},e.prototype.context=function(){return this._context},e.prototype.inContext=function(e){return this._context===e.ownerDocument||v(this._context,e)},e.prototype.fire=function(e){return this.events.fire(e),this},e.prototype._onOffMultiple=function(e,t,n,r){if(i.string(t)&&-1!==t.search(" ")&&(t=t.trim().split(/ +/)),i.array(t)){for(var o=0;o=l.length)break;f=l[d++]}else{if(d=l.next(),d.done)break;f=d.value}var v=f;this.options[v]=p.base[v],v in t&&this[v](t[v])}return u.fire("set",{options:t,interactable:this}),this},e.prototype.unset=function(){if(o.remove(this.target,"all"),i.string(this.target))for(var e in o.delegatedEvents){var t=o.delegatedEvents[e];t.selectors[0]===this.target&&t.contexts[0]===this._context&&(t.selectors.splice(0,1),t.contexts.splice(0,1),t.listeners.splice(0,1),t.selectors.length||(t[e]=null)),o.remove(this._context,e,o.delegateListener),o.remove(this._context,e,o.delegateUseCapture,!0)}else o.remove(this,"all");u.fire("unset",{interactable:this}),l.interactables.splice(x(l.interactables,this),1);for(var n=l.interactions||[],r=Array.isArray(n),s=0,n=r?n:n[Symbol.iterator]();;){var a;if(r){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var c=a;c.target===this&&c.interacting()&&c.stop()}return l.interact},e}();l.interactables.indexOfElement=function(e,t){t=t||l.document;for(var n=0;n=x.length)break;E=x[w++]}else{if(w=x.next(),w.done)break;E=w.value}var S=E,T=S[0],C=S[1];C._updateEventTargets(i,o),C[e](T,t,i,o)}}}function o(e){for(var t=0;te.pointerMoveTolerance);var a={pointer:t,pointerIndex:this.getPointerIndex(t),event:n,eventTarget:r,dx:o,dy:s,duplicate:i,interaction:this,interactingBeforeMove:this.interacting()};i||l.setCoordDeltas(this.pointerDelta,this.prevCoords,this.curCoords),f.fire("move",a),i||(this.interacting()&&this.doMove(a),this.pointerWasMoved&&l.copyCoords(this.prevCoords,this.curCoords))},e.prototype.doMove=function(e){e=l.extend({pointer:this.pointers[0],event:this.prevEvent,eventTarget:this._eventTarget,interaction:this},e||{}),f.fire("before-action-move",e),this._dontFireMove||f.fire("action-move",e),this._dontFireMove=!1},e.prototype.pointerUp=function(e,t,n,r){var i=this.getPointerIndex(e);f.fire(/cancel$/i.test(t.type)?"cancel":"up",{pointer:e,pointerIndex:i,event:t,eventTarget:n,curEventTarget:r,interaction:this}),this.simulation||this.end(t),this.pointerIsDown=!1,this.removePointer(e,t)},e.prototype.end=function(e){e=e||this.prevEvent,this.interacting()&&f.fire("action-end",{event:e,interaction:this}),this.stop()},e.prototype.currentAction=function(){return this._interacting?this.prepared.name:null},e.prototype.interacting=function(){return this._interacting},e.prototype.stop=function(){f.fire("stop",{interaction:this}),this._interacting&&(f.fire("stop-active",{interaction:this}),f.fire("stop-"+this.prepared.name,{interaction:this})),this.target=this.element=null,this._interacting=!1,this.prepared.name=this.prevEvent=null},e.prototype.getPointerIndex=function(e){return"mouse"===this.pointerType||"pen"===this.pointerType?0:l.indexOf(this.pointerIds,l.getPointerId(e))},e.prototype.updatePointer=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:t&&/(down|start)$/i.test(t.type),r=l.getPointerId(e),i=this.getPointerIndex(e);return-1===i&&(i=this.pointerIds.length,this.pointerIds[i]=r),n&&f.fire("update-pointer-down",{pointer:e,event:t,down:n,pointerId:r,pointerIndex:i,interaction:this}),this.pointers[i]=e,i},e.prototype.removePointer=function(e,t){var n=this.getPointerIndex(e);-1!==n&&(f.fire("remove-pointer",{pointer:e,event:t,pointerIndex:n,interaction:this}),this.pointers.splice(n,1),this.pointerIds.splice(n,1),this.downTargets.splice(n,1),this.downTimes.splice(n,1))},e.prototype._updateEventTargets=function(e,t){this._eventTarget=e,this._curEventTarget=t},e}(),y=0,x=g.length;y=i.length)break;a=i[s++]}else{if(s=i.next(),s.done)break;a=s.value}var l=a;if(l.options.drop.enabled){var c=l.options.drop.accept;if(!(p.is.element(c)&&c!==t||p.is.string(c)&&!p.matchesSelector(t,c)))for(var d=p.is.string(l.target)?l._context.querySelectorAll(l.target):[l.target],f=0;fo.left&&c.xo.top&&c.y=o.left&&v<=o.right&&g>=o.top&&g<=o.bottom}if(f&&p.is.number(a)){s=Math.max(0,Math.min(o.right,f.right)-Math.max(o.left,f.left))*Math.max(0,Math.min(o.bottom,f.bottom)-Math.max(o.top,f.top))/(f.width*f.height)>=a}return this.options.drop.checker&&(s=this.options.drop.checker(e,t,s,this,i,n,r)),s},v.signals.on("unset",function(e){e.interactable.dropzone(!1)}),v.settingsMethods.push("dropChecker"),g.signals.on("new",function(e){e.dropTarget=null,e.dropElement=null,e.prevDropTarget=null,e.prevDropElement=null,e.dropEvents=null,e.activeDrops={dropzones:[],elements:[],rects:[]}}),g.signals.on("stop",function(e){var t=e.interaction;t.dropTarget=t.dropElement=t.prevDropTarget=t.prevDropElement=null}),d.dynamicDrop=function(e){return p.is.bool(e)?(y=e,d):y},p.merge(v.eventTypes,["dragenter","dragleave","dropactivate","dropdeactivate","dropmove","drop"]),c.methodDict.drop="dropzone",h.drop=m.defaults,t.exports=m},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../interact":21,"../scope":34,"../utils":44,"./base":6}],9:[function(e,t,n){"use strict";var r=e("./base"),i=e("../utils"),o=e("../InteractEvent"),s=e("../Interactable"),a=e("../Interaction"),l=e("../defaultOptions"),c={defaults:{enabled:!1,origin:null,restrict:null},checker:function(e,t,n,r,i){return i.pointerIds.length>=2?{name:"gesture"}:null},getCursor:function(){return""}};o.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;"gesturestart"===t.type&&(t.ds=0,n.gesture.startDistance=n.gesture.prevDistance=t.distance,n.gesture.startAngle=n.gesture.prevAngle=t.angle,n.gesture.scale=1)}),o.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;"gesturemove"===t.type&&(t.ds=t.scale-n.gesture.scale,n.target.fire(t),n.gesture.prevAngle=t.angle,n.gesture.prevDistance=t.distance,t.scale===1/0||null===t.scale||void 0===t.scale||isNaN(t.scale)||(n.gesture.scale=t.scale))}),s.prototype.gesturable=function(e){return i.is.object(e)?(this.options.gesture.enabled=!1!==e.enabled,this.setPerAction("gesture",e),this.setOnEvents("gesture",e),this):i.is.bool(e)?(this.options.gesture.enabled=e,e||(this.ongesturestart=this.ongesturestart=this.ongestureend=null),this):this.options.gesture},o.signals.on("set-delta",function(e){var t=e.interaction,n=e.iEvent,r=e.action,s=e.event,a=e.starting,l=e.ending,c=e.deltaSource;if("gesture"===r){var p=t.pointers;n.touches=[p[0],p[1]],a?(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=1,n.ds=0,n.angle=i.touchAngle(p,void 0,c),n.da=0):l||s instanceof o?(n.distance=t.prevEvent.distance,n.box=t.prevEvent.box,n.scale=t.prevEvent.scale,n.ds=n.scale-1,n.angle=t.prevEvent.angle,n.da=n.angle-t.gesture.startAngle):(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=n.distance/t.gesture.startDistance,n.angle=i.touchAngle(p,t.gesture.prevAngle,c),n.ds=n.scale-t.gesture.prevScale,n.da=n.angle-t.gesture.prevAngle)}}),a.signals.on("new",function(e){e.gesture={start:{x:0,y:0},startDistance:0,prevDistance:0,distance:0,scale:1,startAngle:0,prevAngle:0}}),r.gesture=c,r.names.push("gesture"),i.merge(s.eventTypes,["gesturestart","gesturemove","gestureend"]),r.methodDict.gesture="gesturable",l.gesture=c.defaults,t.exports=c},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"./base":6}],10:[function(e,t,n){"use strict";function r(e,t,n,r,i,s,a){if(!t)return!1;if(!0===t){var l=o.is.number(s.width)?s.width:s.right-s.left,c=o.is.number(s.height)?s.height:s.bottom-s.top;if(l<0&&("left"===e?e="right":"right"===e&&(e="left")),c<0&&("top"===e?e="bottom":"bottom"===e&&(e="top")),"left"===e)return n.x<(l>=0?s.left:s.right)+a;if("top"===e)return n.y<(c>=0?s.top:s.bottom)+a;if("right"===e)return n.x>(l>=0?s.right:s.left)-a;if("bottom"===e)return n.y>(c>=0?s.bottom:s.top)-a}return!!o.is.element(r)&&(o.is.element(t)?t===r:o.matchesUpTo(r,t,i))}var i=e("./base"),o=e("../utils"),s=e("../utils/browser"),a=e("../InteractEvent"),l=e("../Interactable"),c=e("../Interaction"),p=e("../defaultOptions"),u=s.supportsTouch||s.supportsPointerEvent?20:10,d={defaults:{enabled:!1,mouseButtons:null,origin:null,snap:null,restrict:null,inertia:null,autoScroll:null,square:!1,preserveAspectRatio:!1,axis:"xy",margin:NaN,edges:null,invert:"none"},checker:function(e,t,n,i,s,a){if(!a)return null;var l=o.extend({},s.curCoords.page),c=n.options;if(c.resize.enabled){var p=c.resize,d={left:!1,right:!1,top:!1,bottom:!1};if(o.is.object(p.edges)){for(var f in d)d[f]=r(f,p.edges[f],l,s._eventTarget,i,a,p.margin||u);if(d.left=d.left&&!d.right,d.top=d.top&&!d.bottom,d.left||d.right||d.top||d.bottom)return{name:"resize",edges:d}}else{var v="y"!==c.resize.axis&&l.x>a.right-u,g="x"!==c.resize.axis&&l.y>a.bottom-u;if(v||g)return{name:"resize",axes:(v?"x":"")+(g?"y":"")}}}return null},cursors:s.isIe9OrOlder?{x:"e-resize",y:"s-resize",xy:"se-resize",top:"n-resize",left:"w-resize",bottom:"s-resize",right:"e-resize",topleft:"se-resize",bottomright:"se-resize",topright:"ne-resize",bottomleft:"ne-resize"}:{x:"ew-resize",y:"ns-resize",xy:"nwse-resize",top:"ns-resize",left:"ew-resize",bottom:"ns-resize",right:"ew-resize",topleft:"nwse-resize",bottomright:"nwse-resize",topright:"nesw-resize",bottomleft:"nesw-resize"},getCursor:function(e){if(e.axis)return d.cursors[e.name+e.axis];if(e.edges){for(var t="",n=["top","bottom","left","right"],r=0;r<4;r++)e.edges[n[r]]&&(t+=n[r]);return d.cursors[t]}}};a.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;if("resizestart"===t.type&&n.prepared.edges){var r=n.target.getRect(n.element),i=n.target.options.resize;if(i.square||i.preserveAspectRatio){var s=o.extend({},n.prepared.edges);s.top=s.top||s.left&&!s.bottom,s.left=s.left||s.top&&!s.right,s.bottom=s.bottom||s.right&&!s.top,s.right=s.right||s.bottom&&!s.left,n.prepared._linkedEdges=s}else n.prepared._linkedEdges=null;i.preserveAspectRatio&&(n.resizeStartAspectRatio=r.width/r.height),n.resizeRects={start:r,current:o.extend({},r),inverted:o.extend({},r),previous:o.extend({},r),delta:{left:0,right:0,width:0,top:0,bottom:0,height:0}},t.rect=n.resizeRects.inverted,t.deltaRect=n.resizeRects.delta}}),a.signals.on("new",function(e){var t=e.iEvent,n=e.phase,r=e.interaction;if("move"===n&&r.prepared.edges){var i=r.target.options.resize,s=i.invert,a="reposition"===s||"negate"===s,l=r.prepared.edges,c=r.resizeRects.start,p=r.resizeRects.current,u=r.resizeRects.inverted,d=r.resizeRects.delta,f=o.extend(r.resizeRects.previous,u),v=l,g=t.dx,h=t.dy;if(i.preserveAspectRatio||i.square){var m=i.preserveAspectRatio?r.resizeStartAspectRatio:1;l=r.prepared._linkedEdges,v.left&&v.bottom||v.right&&v.top?h=-g/m:v.left||v.right?h=g/m:(v.top||v.bottom)&&(g=h*m)}if(l.top&&(p.top+=h),l.bottom&&(p.bottom+=h),l.left&&(p.left+=g),l.right&&(p.right+=g),a){if(o.extend(u,p),"reposition"===s){var y=void 0;u.top>u.bottom&&(y=u.top,u.top=u.bottom,u.bottom=y),u.left>u.right&&(y=u.left,u.left=u.right,u.right=y)}}else u.top=Math.min(p.top,c.bottom),u.bottom=Math.max(p.bottom,c.top),u.left=Math.min(p.left,c.right),u.right=Math.max(p.right,c.left);u.width=u.right-u.left,u.height=u.bottom-u.top;for(var x in u)d[x]=u[x]-f[x];t.edges=r.prepared.edges,t.rect=u,t.deltaRect=d}}),l.prototype.resizable=function(e){return o.is.object(e)?(this.options.resize.enabled=!1!==e.enabled,this.setPerAction("resize",e),this.setOnEvents("resize",e),/^x$|^y$|^xy$/.test(e.axis)?this.options.resize.axis=e.axis:null===e.axis&&(this.options.resize.axis=p.resize.axis),o.is.bool(e.preserveAspectRatio)?this.options.resize.preserveAspectRatio=e.preserveAspectRatio:o.is.bool(e.square)&&(this.options.resize.square=e.square),this):o.is.bool(e)?(this.options.resize.enabled=e, +e||(this.onresizestart=this.onresizestart=this.onresizeend=null),this):this.options.resize},c.signals.on("new",function(e){e.resizeAxes="xy"}),a.signals.on("set-delta",function(e){var t=e.interaction,n=e.iEvent;"resize"===e.action&&t.resizeAxes&&(t.target.options.resize.square?("y"===t.resizeAxes?n.dx=n.dy:n.dy=n.dx,n.axes="xy"):(n.axes=t.resizeAxes,"x"===t.resizeAxes?n.dy=0:"y"===t.resizeAxes&&(n.dx=0)))}),i.resize=d,i.names.push("resize"),o.merge(l.eventTypes,["resizestart","resizemove","resizeinertiastart","resizeinertiaresume","resizeend"]),i.methodDict.resize="resizable",p.resize=d.defaults,t.exports=d},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"../utils/browser":37,"./base":6}],11:[function(e,t,n){"use strict";var r=e("./utils/raf"),i=e("./utils/window").getWindow,o=e("./utils/is"),s=e("./utils/domUtils"),a=e("./Interaction"),l=e("./defaultOptions"),c={defaults:{enabled:!1,container:null,margin:60,speed:300},interaction:null,i:null,x:0,y:0,isScrolling:!1,prevTime:0,start:function(e){c.isScrolling=!0,r.cancel(c.i),c.interaction=e,c.prevTime=(new Date).getTime(),c.i=r.request(c.scroll)},stop:function(){c.isScrolling=!1,r.cancel(c.i)},scroll:function(){var e=c.interaction.target.options[c.interaction.prepared.name].autoScroll,t=e.container||i(c.interaction.element),n=(new Date).getTime(),s=(n-c.prevTime)/1e3,a=e.speed*s;a>=1&&(o.window(t)?t.scrollBy(c.x*a,c.y*a):t&&(t.scrollLeft+=c.x*a,t.scrollTop+=c.y*a),c.prevTime=n),c.isScrolling&&(r.cancel(c.i),c.i=r.request(c.scroll))},check:function(e,t){var n=e.options;return n[t].autoScroll&&n[t].autoScroll.enabled},onInteractionMove:function(e){var t=e.interaction,n=e.pointer;if(t.interacting()&&c.check(t.target,t.prepared.name)){if(t.simulation)return void(c.x=c.y=0);var r=void 0,a=void 0,l=void 0,p=void 0,u=t.target.options[t.prepared.name].autoScroll,d=u.container||i(t.element);if(o.window(d))p=n.clientXd.innerWidth-c.margin,l=n.clientY>d.innerHeight-c.margin;else{var f=s.getElementClientRect(d);p=n.clientXf.right-c.margin,l=n.clientY>f.bottom-c.margin}c.x=a?1:p?-1:0,c.y=l?1:r?-1:0,c.isScrolling||(c.margin=u.margin,c.speed=u.speed,c.start(t))}}};a.signals.on("stop-active",function(){c.stop()}),a.signals.on("action-move",c.onInteractionMove),l.perAction.autoScroll=c.defaults,t.exports=c},{"./Interaction":5,"./defaultOptions":18,"./utils/domUtils":39,"./utils/is":46,"./utils/raf":50,"./utils/window":52}],12:[function(e,t,n){"use strict";var r=e("../Interactable"),i=e("../actions/base"),o=e("../utils/is"),s=e("../utils/domUtils");r.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},r.prototype.ignoreFrom=function(e){return this._backCompatOption("ignoreFrom",e)},r.prototype.allowFrom=function(e){return this._backCompatOption("allowFrom",e)},r.prototype.testIgnore=function(e,t,n){return!(!e||!o.element(n))&&(o.string(e)?s.matchesUpTo(n,e,t):!!o.element(e)&&s.nodeContains(e,n))},r.prototype.testAllow=function(e,t,n){return!e||!!o.element(n)&&(o.string(e)?s.matchesUpTo(n,e,t):!!o.element(e)&&s.nodeContains(e,n))},r.prototype.testIgnoreAllow=function(e,t,n){return!this.testIgnore(e.ignoreFrom,t,n)&&this.testAllow(e.allowFrom,t,n)},r.prototype.actionChecker=function(e){return o.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},r.prototype.styleCursor=function(e){return o.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},r.prototype.defaultActionChecker=function(e,t,n,r){for(var o=this.getRect(r),s=null,a=i.names,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var u=p;if((!n.pointerIsDown||!n.mouse||0!=(t.buttons&this.options[u].mouseButtons))&&(s=i[u].checker(e,t,this,r,n,o)))return s}}},{"../Interactable":4,"../actions/base":6,"../utils/domUtils":39,"../utils/is":46}],13:[function(e,t,n){"use strict";function r(e,t,n,r){return g.is.object(e)&&t.testIgnoreAllow(t.options[e.name],n,r)&&t.options[e.name].enabled&&a(t,n,e)?e:null}function i(e,t,n,i,o,s){for(var a=0,l=i.length;a=m.maxInteractions)return!1;if(u.target===e){if((a+=d===n.name|0)>=i)return!1;if(u.element===t&&(l++,d!==n.name||l>=o))return!1}}}return m.maxInteractions>0}}var l=e("../interact"),c=e("../Interactable"),p=e("../Interaction"),u=e("../actions/base"),d=e("../defaultOptions"),f=e("../utils/browser"),v=e("../scope"),g=e("../utils"),h=e("../utils/Signals").new();e("./InteractableMethods");var m={signals:h,withinInteractionLimit:a,maxInteractions:1/0,defaults:{perAction:{manualStart:!1,max:1/0,maxPerElement:1,allowFrom:null,ignoreFrom:null}},setActionDefaults:function(e){g.extend(e.defaults,m.defaults.perAction)}};p.signals.on("down",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;if(!t.interacting()){s(t,o(t,n,r,i))}}),p.signals.on("move",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;if(t.mouse&&!t.pointerIsDown&&!t.interacting()){s(t,o(t,n,r,i))}}),p.signals.on("move",function(e){var t=e.interaction,n=e.event;if(t.pointerIsDown&&!t.interacting()&&t.pointerWasMoved&&t.prepared.name){h.fire("before-start",e);var r=t.target;t.prepared.name&&r&&(r.options[t.prepared.name].manualStart||!a(r,t.element,t.prepared)?t.stop(n):t.start(t.prepared,r,t.element))}}),p.signals.on("stop",function(e){var t=e.interaction,n=t.target;n&&n.options.styleCursor&&(n._doc.documentElement.style.cursor="")}),c.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},c.prototype.actionChecker=function(e){return g.is.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},c.prototype.styleCursor=function(e){return g.is.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},c.prototype.defaultActionChecker=function(e,t,n,r){for(var i=this.getRect(r),o=t.buttons||{0:1,1:4,3:8,4:16}[t.button],s=null,a=u.names,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var d=p;if((!n.pointerIsDown||!n.mouse||0!=(o&this.options[d].mouseButtons))&&(s=u[d].checker(e,t,this,r,n,i)))return s}},l.maxInteractions=function(e){return g.is.number(e)?(m.maxInteractions=e,this):m.maxInteractions},c.settingsMethods.push("styleCursor"),c.settingsMethods.push("actionChecker"),c.settingsMethods.push("ignoreFrom"),c.settingsMethods.push("allowFrom"),d.base.actionChecker=null,d.base.styleCursor=!0,g.extend(d.perAction,m.defaults.perAction),t.exports=m},{"../Interactable":4,"../Interaction":5,"../actions/base":6,"../defaultOptions":18,"../interact":21,"../scope":34,"../utils":44,"../utils/Signals":35,"../utils/browser":37,"./InteractableMethods":12}],14:[function(e,t,n){"use strict";var r=e("./base"),i=e("../Interaction");i.signals.on("new",function(e){e.delayTimer=null}),r.signals.on("prepared",function(e){var t=e.interaction,n=t.prepared.name;if(n){var r=t.target.options[n].delay;r>0&&(t.delayTimer=setTimeout(function(){t.start(t.prepared,t.target,t.element)},r))}}),i.signals.on("move",function(e){var t=e.interaction,n=e.duplicate;t.pointerWasMoved&&!n&&clearTimeout(t.delayTimer)}),r.signals.on("before-start",function(e){var t=e.interaction,n=t.prepared.name;if(n){t.target.options[n].delay>0&&(t.prepared.name=null)}})},{"../Interaction":5,"./base":13}],15:[function(e,t,n){"use strict";function r(e,t){if(!t)return!1;var n=t.options.drag.startAxis;return"xy"===e||"xy"===n||n===e}var i=e("./base"),o=e("../scope"),s=e("../utils/browser"),a=e("../utils/is"),l=e("../utils/domUtils"),c=l.matchesSelector,p=l.parentNode;i.setActionDefaults(e("../actions/drag")),i.signals.on("before-start",function(e){var t=e.interaction,n=e.eventTarget,l=e.dx,u=e.dy;if("drag"===t.prepared.name){var d=Math.abs(l),f=Math.abs(u),v=t.target.options.drag,g=v.startAxis,h=d>f?"x":dl.minSpeed&&g>l.endSpeed,b={interaction:t,pageCoords:v,statuses:f,preEnd:!0,requireEndOnly:!0};y&&!x&&(c.resetStatuses(f),m=c.setAll(b),m.shouldMove&&m.locked&&(h=!0)),(x||h)&&(p.copyCoords(i.upCoords,t.curCoords),t.pointers[0]=i.startEvent=new a(t,n,t.prepared.name,"inertiastart",t.element),i.t0=d,i.active=!0,i.allowResume=l.allowResume,t.simulation=i,o.fire(i.startEvent),x?(i.vx0=t.pointerDelta.client.vx,i.vy0=t.pointerDelta.client.vy,i.v0=g,r(t,i),p.extend(v,t.curCoords.page),v.x+=i.xe,v.y+=i.ye,c.resetStatuses(f),m=c.setAll(b),i.modifiedXe+=m.dx,i.modifiedYe+=m.dy,i.i=u.request(t.boundInertiaFrame)):(i.smoothEnd=!0,i.xe=m.dx,i.ye=m.dy,i.sx=i.sy=0,i.i=u.request(t.boundSmoothEndFrame)))}}),l.signals.on("stop-active",function(e){var t=e.interaction,n=t.inertiaStatus;n.active&&(u.cancel(n.i),n.active=!1,t.simulation=null)})},{"./InteractEvent":3,"./Interaction":5,"./modifiers":24,"./utils":44,"./utils/raf":50}],21:[function(e,t,n){"use strict";function r(e,t){var n=a.interactables.get(e,t);return n||(n=new l(e,t),n.events.global=p),n}var i=e("./utils/browser"),o=e("./utils/events"),s=e("./utils"),a=e("./scope"),l=e("./Interactable"),c=e("./Interaction"),p={};r.isSet=function(e,t){return-1!==a.interactables.indexOfElement(e,t&&t.context)},r.on=function(e,t,n){if(s.is.string(e)&&-1!==e.search(" ")&&(e=e.trim().split(/ +/)),s.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.on(f,t,n)}return r}if(s.is.object(e)){for(var v in e)r.on(v,e[v],t);return r}return s.contains(l.eventTypes,e)?p[e]?p[e].push(t):p[e]=[t]:o.add(a.document,e,t,{options:n}),r},r.off=function(e,t,n){if(s.is.string(e)&&-1!==e.search(" ")&&(e=e.trim().split(/ +/)),s.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.off(f,t,n)}return r}if(s.is.object(e)){for(var v in e)r.off(v,e[v],t);return r}if(s.contains(l.eventTypes,e)){var g=void 0;e in p&&-1!==(g=s.indexOf(p[e],t))&&p[e].splice(g,1)}else o.remove(a.document,e,t,n);return r},r.debug=function(){return a},r.getPointerAverage=s.pointerAverage,r.getTouchBBox=s.touchBBox,r.getTouchDistance=s.touchDistance,r.getTouchAngle=s.touchAngle,r.getElementRect=s.getElementRect,r.getElementClientRect=s.getElementClientRect,r.matchesSelector=s.matchesSelector,r.closest=s.closest,r.supportsTouch=function(){return i.supportsTouch},r.supportsPointerEvent=function(){return i.supportsPointerEvent},r.stop=function(e){for(var t=a.interactions.length-1;t>=0;t--)a.interactions[t].stop(e);return r},r.pointerMoveTolerance=function(e){return s.is.number(e)?(c.pointerMoveTolerance=e,this):c.pointerMoveTolerance},r.addDocument=a.addDocument,r.removeDocument=a.removeDocument,a.interact=r,t.exports=r},{"./Interactable":4,"./Interaction":5,"./scope":34,"./utils":44,"./utils/browser":37,"./utils/events":40}],22:[function(e,t,n){"use strict";function r(e){var t=e.interaction,n=e.event;t.target&&t.target.checkAndPreventDefault(n)}var i=e("./Interactable"),o=e("./Interaction"),s=e("./scope"),a=e("./utils/is"),l=e("./utils/events"),c=e("./utils/domUtils"),p=c.nodeContains,u=c.matchesSelector;i.prototype.preventDefault=function(e){return/^(always|never|auto)$/.test(e)?(this.options.preventDefault=e,this):a.bool(e)?(this.options.preventDefault=e?"always":"never",this):this.options.preventDefault},i.prototype.checkAndPreventDefault=function(e){var t=this.options.preventDefault;if("never"!==t)return"always"===t?void e.preventDefault():void(l.supportsOptions||/^(mouse|pointer|touch)*(down|start)/i.test(e.type)||a.element(e.target)&&u(e.target,"input,select,textarea,[contenteditable=true],[contenteditable=true] *")||e.preventDefault())};for(var d=["down","move","up","cancel"],f=0;f=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i;if(o.element&&(o.element===e.target||p(o.element,e.target)))return void o.target.checkAndPreventDefault(e)}}},{"./Interactable":4,"./Interaction":5,"./scope":34,"./utils/domUtils":39,"./utils/events":40,"./utils/is":46}],23:[function(e,t,n){"use strict";function r(e){var t=e.target,n=a.search(e,e.type,t);n&&n.prevTap&&e.clientX===n.prevTap.clientX&&e.clientY===n.prevTap.clientY&&t===n.prevTap.target&&(n.downTargets[0]=t,n.downTimes[0]=(new Date).getTime(),l.fire({interaction:n,event:e,eventTarget:t,pointer:e,type:"tap"}))}var i=e("./scope"),o=e("./utils/events"),s=e("./utils/browser"),a=e("./utils/interactionFinder"),l=e("./pointerEvents/base"),c=e("./utils/window"),p=c.window,u=Object.prototype.toString;if(p.Array.isArray||(p.Array.isArray=function(e){return"[object Array]"===u.call(e)}),String.prototype.trim||(String.prototype.trim=function(){return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")}),s.isIE8){var d=function(e){for(var t=i.interactions,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var o;if(n){if(r>=t.length)break;o=t[r++]}else{if(r=t.next(),r.done)break;o=r.value}var s=o;s.interacting()&&s.target.checkAndPreventDefault(e)}},f=function(e,t){var n=e.doc,i=(e.win,0===t.indexOf("listen")?o.add:o.remove);i(n,"selectstart",d),l&&i(n,"dblclick",r)};i.signals.on("add-document",f),i.signals.on("remove-document",f)}t.exports=null},{"./pointerEvents/base":31,"./scope":34,"./utils/browser":37,"./utils/events":40,"./utils/interactionFinder":45,"./utils/window":52}],24:[function(e,t,n){"use strict";function r(e,t,n){return e&&e.enabled&&(t||!e.endOnly)&&(!n||e.endOnly)}var i=e("../InteractEvent"),o=e("../Interaction"),s=e("../utils/extend"),a={names:[],setOffsets:function(e){var t=e.interaction,n=e.pageCoords,r=t.target,i=t.element,o=t.startOffset,s=r.getRect(i);s?(o.left=n.x-s.left,o.top=n.y-s.top,o.right=s.right-n.x,o.bottom=s.bottom-n.y,"width"in s||(s.width=s.right-s.left),"height"in s||(s.height=s.bottom-s.top)):o.left=o.top=o.right=o.bottom=0,e.rect=s,e.interactable=r,e.element=i;for(var l=0;l=p.length)break;f=p[d++]}else{if(d=p.next(),d.done)break;f=d.value}var v=f,g=a[v],h=t.target.options[t.prepared.name][v];r(h,i,o)&&(e.status=e.status=n[v],e.options=h,e.offset=e.interaction.modifierOffsets[v],g.set(e),e.status.locked&&(l.x+=e.status.dx,l.y+=e.status.dy,c.dx+=e.status.dx,c.dy+=e.status.dy,c.locked=!0))}return c.shouldMove=!e.status||!c.locked||e.status.changed,c},resetStatuses:function(e){for(var t=a.names,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var i;if(n){if(r>=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i,s=e[o]||{};s.dx=s.dy=0,s.modifiedX=s.modifiedY=NaN,s.locked=!1,s.changed=!0,e[o]=s}return e},start:function(e,t){var n=e.interaction,r={interaction:n,pageCoords:("action-resume"===t?n.curCoords:n.startCoords).page,startOffset:n.startOffset,statuses:n.modifierStatuses,preEnd:!1,requireEndOnly:!1};a.setOffsets(r),a.resetStatuses(r.statuses),r.pageCoords=s({},n.startCoords.page),n.modifierResult=a.setAll(r)}};o.signals.on("new",function(e){e.startOffset={left:0,right:0,top:0,bottom:0},e.modifierOffsets={},e.modifierStatuses=a.resetStatuses({}),e.modifierResult=null}),o.signals.on("action-start",a.start),o.signals.on("action-resume",a.start),o.signals.on("before-action-move",function(e){var t=e.interaction,n=e.preEnd,r=e.interactingBeforeMove,i=a.setAll({interaction:t,preEnd:n,pageCoords:t.curCoords.page,statuses:t.modifierStatuses,requireEndOnly:!1});!i.shouldMove&&r&&(t._dontFireMove=!0),t.modifierResult=i}),o.signals.on("action-end",function(e){for(var t=e.interaction,n=e.event,i=0;i=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}var m=h,y=m.x,x=m.y;l.push({x:s.left-i.width*y+u.x,y:s.top-i.height*x+u.y})}else l.push(u);return l},set:function(e){var t=e.interaction,n=e.pageCoords,r=e.status,i=e.options,s=e.offset,a=[],l=void 0,c=void 0,p=void 0;if(r.useStatusXY)c={x:r.x,y:r.y};else{var u=o.getOriginXY(t.target,t.element,t.prepared.name);c=o.extend({},n),c.x-=u.x,c.y-=u.y}r.realX=c.x,r.realY=c.y;for(var d=i.targets?i.targets.length:0,f=s,v=Array.isArray(f),g=0,f=v?f:f[Symbol.iterator]();;){var h;if(v){if(g>=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}for(var m=h,y=m.x,x=m.y,b=c.x-y,w=c.y-x,E=i.targets,S=Array.isArray(E),T=0,E=S?E:E[Symbol.iterator]();;){var C;if(S){if(T>=E.length)break;C=E[T++]}else{if(T=E.next(),T.done)break;C=T.value}var A=C;l=o.is.function(A)?A(b,w,t):A,l&&a.push({x:o.is.number(l.x)?l.x+y:b,y:o.is.number(l.y)?l.y+x:w,range:o.is.number(l.range)?l.range:i.range})}}var D={target:null,inRange:!1,distance:0,range:0,dx:0,dy:0};for(p=0,d=a.length;p=p.length)break;f=p[d++]}else{if(d=p.next(),d.done)break;f=d.value}var v=f,g=void 0;g=a.is.function(v)?v(l,c,t):v,g&&("width"in g&&"height"in g&&(g.x=g.width, +g.y=g.height),e.options.targets.push(g))}i.set(e)},modifyCoords:function(e){var t=e.options;e.options=a.extend({},t),e.options.enabled=t.enabled,e.options.relativePoints=[null],i.modifyCoords(e)}};r.snapSize=l,r.names.push("snapSize"),o.perAction.snapSize=l.defaults,s.defaults.snapSize=l.defaults,t.exports=l},{"../actions/resize":10,"../defaultOptions":18,"../utils/":44,"./index":24,"./snap":28}],30:[function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=e("../utils/pointerUtils");t.exports=function(){function e(t,n,o,s,a){if(r(this,e),i.pointerExtend(this,o),o!==n&&i.pointerExtend(this,n),this.interaction=a,this.timeStamp=(new Date).getTime(),this.originalEvent=o,this.type=t,this.pointerId=i.getPointerId(n),this.pointerType=i.getPointerType(n),this.target=s,this.currentTarget=null,"tap"===t){var l=a.getPointerIndex(n);this.dt=this.timeStamp-a.downTimes[l];var c=this.timeStamp-a.tapTime;this.double=!!(a.prevTap&&"doubletap"!==a.prevTap.type&&a.prevTap.target===this.target&&c<500)}else"doubletap"===t&&(this.dt=n.timeStamp-a.tapTime)}return e.prototype.subtractOrigin=function(e){var t=e.x,n=e.y;return this.pageX-=t,this.pageY-=n,this.clientX-=t,this.clientY-=n,this},e.prototype.addOrigin=function(e){var t=e.x,n=e.y;return this.pageX+=t,this.pageY+=n,this.clientX+=t,this.clientY+=n,this},e.prototype.preventDefault=function(){this.originalEvent.preventDefault()},e.prototype.stopPropagation=function(){this.propagationStopped=!0},e.prototype.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},e}()},{"../utils/pointerUtils":49}],31:[function(e,t,n){"use strict";function r(e){for(var t=e.interaction,n=e.pointer,s=e.event,l=e.eventTarget,c=e.type,u=void 0===c?e.pointerEvent.type:c,d=e.targets,f=void 0===d?i(e):d,v=e.pointerEvent,g=void 0===v?new o(u,n,s,l,t):v,h={interaction:t,pointer:n,event:s,eventTarget:l,targets:f,type:u,pointerEvent:g},m=0;m=u.length)break;g=u[v++]}else{if(v=u.next(),v.done)break;g=v.value}var h=g;c.element=h,p.fire("collect-targets",c)}return"hold"===o&&(c.targets=d(c.targets,function(e){return e.eventable.options.holdDuration===t.holdTimers[s].duration})),c.targets}var o=e("./PointerEvent"),s=e("../Interaction"),a=e("../utils"),l=e("../utils/browser"),c=e("../defaultOptions"),p=e("../utils/Signals").new(),u=e("../utils/arr"),d=u.filter,f=["down","up","cancel"],v=["down","up","cancel"],g={PointerEvent:o,fire:r,collectEventTargets:i,signals:p,defaults:{holdDuration:600,ignoreFrom:null,allowFrom:null,origin:{x:0,y:0}},types:["down","move","up","cancel","tap","doubletap","hold"]};s.signals.on("update-pointer-down",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers[n]={duration:1/0,timeout:null}}),s.signals.on("remove-pointer",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers.splice(n,1)}),s.signals.on("move",function(e){var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,s=e.duplicateMove,a=t.getPointerIndex(n);s||t.pointerIsDown&&!t.pointerWasMoved||(t.pointerIsDown&&clearTimeout(t.holdTimers[a].timeout),r({interaction:t,pointer:n,event:i,eventTarget:o,type:"move"}))}),s.signals.on("down",function(e){for(var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,s=e.pointerIndex,c=l.isIE8?a.extend({},i):i,u=t.holdTimers[s],d=a.getPath(o),f={interaction:t,pointer:n,event:i,eventTarget:o,type:"hold",targets:[],path:d,element:null},v=d,g=Array.isArray(v),h=0,v=g?v:v[Symbol.iterator]();;){var m;if(g){if(h>=v.length)break;m=v[h++]}else{if(h=v.next(),h.done)break;m=h.value}var y=m;f.element=y,p.fire("collect-targets",f)}if(f.targets.length){for(var x=1/0,b=0;b=0&&(p.selectors[u]!==e||p.contexts[u]!==t);u--);-1===u&&(u=p.selectors.length,p.selectors.push(e),p.contexts.push(t),p.listeners.push([])),p.listeners[u].push([i,!!s.capture,s.passive])}function s(e,t,n,r,o){var s=f(o),c=O[n],p=!1,u=void 0;if(c)for(u=c.selectors.length-1;u>=0;u--)if(c.selectors[u]===e&&c.contexts[u]===t){for(var d=c.listeners[u],v=d.length-1;v>=0;v--){var g=d[v],h=g[0],m=g[1],y=g[2];if(h===r&&m===!!s.capture&&y===s.passive){d.splice(v,1),d.length||(c.selectors.splice(u,1),c.contexts.splice(u,1),c.listeners.splice(u,1),i(t,n,a),i(t,n,l,!0),c.selectors.length||(O[n]=null)),p=!0;break}}if(p)break}}function a(e,t){var n=f(t),r={},i=O[e.type],o=g.getActualElement(e.path?e.path[0]:e.target),s=o;for(h(r,e),r.originalEvent=e,r.preventDefault=p;v.element(s);){for(var a=0;a=l.length)break;u=l[p++]}else{if(p=l.next(),p.done)break;u=p.value}var d=u,f=o[d](a);if(f)return f}},simulationResume:function(e){var t=e.pointerType,n=e.eventType,o=e.eventTarget;if(!/down|start/i.test(n))return null;for(var s=r.interactions,a=Array.isArray(s),l=0,s=a?s:s[Symbol.iterator]();;){var c;if(a){if(l>=s.length)break;c=s[l++]}else{if(l=s.next(),l.done)break;c=l.value}var p=c,u=o;if(p.simulation&&p.simulation.allowResume&&p.pointerType===t)for(;u;){if(u===p.element)return p;u=i.parentNode(u)}}return null},mouseOrPen:function(e){var t=e.pointerId,n=e.pointerType,o=e.eventType;if("mouse"!==n&&"pen"!==n)return null;for(var s=void 0,a=r.interactions,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var u=p;if(u.pointerType===n){if(u.simulation&&!i.contains(u.pointerIds,t))continue;if(u.interacting())return u;s||(s=u)}}if(s)return s;for(var d=r.interactions,f=Array.isArray(d),v=0,d=f?d:d[Symbol.iterator]();;){var g;if(f){if(v>=d.length)break;g=d[v++]}else{if(v=d.next(),v.done)break;g=v.value}var h=g;if(!(h.pointerType!==n||/down/i.test(o)&&h.simulation))return h}return null},hasPointer:function(e){for(var t=e.pointerId,n=r.interactions,o=Array.isArray(n),s=0,n=o?n:n[Symbol.iterator]();;){var a;if(o){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var l=a;if(i.contains(l.pointerIds,t))return l}},idle:function(e){for(var t=e.pointerType,n=r.interactions,i=Array.isArray(n),o=0,n=i?n:n[Symbol.iterator]();;){var s;if(i){if(o>=n.length)break;s=n[o++]}else{if(o=n.next(),o.done)break;s=o.value}var a=s;if(1===a.pointerIds.length){var l=a.target;if(l&&!l.options.gesture.enabled)continue}else if(a.pointerIds.length>=2)continue;if(!a.interacting()&&t===a.pointerType)return a}return null}};t.exports=o},{"../scope":34,"./index":44}],46:[function(e,t,n){"use strict";var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},i=e("./window"),o=e("./isWindow"),s={array:function(){},window:function(e){return e===i.window||o(e)},docFrag:function(e){return s.object(e)&&11===e.nodeType},object:function(e){return!!e&&"object"===(void 0===e?"undefined":r(e))},function:function(e){return"function"==typeof e},number:function(e){return"number"==typeof e},bool:function(e){return"boolean"==typeof e},string:function(e){return"string"==typeof e},element:function(e){if(!e||"object"!==(void 0===e?"undefined":r(e)))return!1;var t=i.getWindow(e)||i.window;return/object|function/.test(r(t.Element))?e instanceof t.Element:1===e.nodeType&&"string"==typeof e.nodeName}};s.array=function(e){return s.object(e)&&void 0!==e.length&&s.function(e.splice)},t.exports=s},{"./isWindow":47,"./window":52}],47:[function(e,t,n){"use strict";t.exports=function(e){return!(!e||!e.Window)&&e instanceof e.Window}},{}],48:[function(e,t,n){"use strict";function r(e,n){for(var r in n){var i=t.exports.prefixedPropREs,o=!1;for(var s in i)if(0===r.indexOf(s)&&i[s].test(r)){o=!0;break}o||"function"==typeof n[r]||(e[r]=n[r])}return e}r.prefixedPropREs={webkit:/(Movement[XY]|Radius[XY]|RotationAngle|Force)$/},t.exports=r},{}],49:[function(e,t,n){"use strict";var r=e("./hypot"),i=e("./browser"),o=e("./domObjects"),s=e("./domUtils"),a=e("./domObjects"),l=e("./is"),c=e("./pointerExtend"),p={copyCoords:function(e,t){e.page=e.page||{},e.page.x=t.page.x,e.page.y=t.page.y,e.client=e.client||{},e.client.x=t.client.x,e.client.y=t.client.y,e.timeStamp=t.timeStamp},setCoordDeltas:function(e,t,n){e.page.x=n.page.x-t.page.x,e.page.y=n.page.y-t.page.y,e.client.x=n.client.x-t.client.x,e.client.y=n.client.y-t.client.y,e.timeStamp=n.timeStamp-t.timeStamp;var i=Math.max(e.timeStamp/1e3,.001);e.page.speed=r(e.page.x,e.page.y)/i,e.page.vx=e.page.x/i,e.page.vy=e.page.y/i,e.client.speed=r(e.client.x,e.page.y)/i,e.client.vx=e.client.x/i,e.client.vy=e.client.y/i},isNativePointer:function(e){return e instanceof o.Event||e instanceof o.Touch},getXY:function(e,t,n){return n=n||{},e=e||"page",n.x=t[e+"X"],n.y=t[e+"Y"],n},getPageXY:function(e,t){return t=t||{},i.isOperaMobile&&p.isNativePointer(e)?(p.getXY("screen",e,t),t.x+=window.scrollX,t.y+=window.scrollY):p.getXY("page",e,t),t},getClientXY:function(e,t){return t=t||{},i.isOperaMobile&&p.isNativePointer(e)?p.getXY("screen",e,t):p.getXY("client",e,t),t},getPointerId:function(e){return l.number(e.pointerId)?e.pointerId:e.identifier},setCoords:function(e,t,n){var r=t.length>1?p.pointerAverage(t):t[0],i={};p.getPageXY(r,i),e.page.x=i.x,e.page.y=i.y,p.getClientXY(r,i),e.client.x=i.x,e.client.y=i.y,e.timeStamp=l.number(n)?n:(new Date).getTime()},pointerExtend:c,getTouchPair:function(e){var t=[];return l.array(e)?(t[0]=e[0],t[1]=e[1]):"touchend"===e.type?1===e.touches.length?(t[0]=e.touches[0],t[1]=e.changedTouches[0]):0===e.touches.length&&(t[0]=e.changedTouches[0],t[1]=e.changedTouches[1]):(t[0]=e.touches[0],t[1]=e.touches[1]),t},pointerAverage:function(e){for(var t={pageX:0,pageY:0,clientX:0,clientY:0,screenX:0,screenY:0},n=e,r=Array.isArray(n),i=0,n=r?n:n[Symbol.iterator]();;){var o;if(r){if(i>=n.length)break;o=n[i++]}else{if(i=n.next(),i.done)break;o=i.value}var s=o;for(var a in t)t[a]+=s[a]}for(var l in t)t[l]/=e.length;return t},touchBBox:function(e){if(e.length||e.touches&&e.touches.length>1){var t=p.getTouchPair(e),n=Math.min(t[0].pageX,t[1].pageX),r=Math.min(t[0].pageY,t[1].pageY);return{x:n,y:r,left:n,top:r,width:Math.max(t[0].pageX,t[1].pageX)-n,height:Math.max(t[0].pageY,t[1].pageY)-r}}},touchDistance:function(e,t){var n=t+"X",i=t+"Y",o=p.getTouchPair(e),s=o[0][n]-o[1][n],a=o[0][i]-o[1][i];return r(s,a)},touchAngle:function(e,t,n){var r=n+"X",i=n+"Y",o=p.getTouchPair(e),s=o[1][r]-o[0][r],a=o[1][i]-o[0][i];return 180*Math.atan2(a,s)/Math.PI},getPointerType:function(e){return l.string(e.pointerType)?e.pointerType:l.number(e.pointerType)?[void 0,void 0,"touch","pen","mouse"][e.pointerType]:/touch/.test(e.type)||e instanceof a.Touch?"touch":"mouse"},getEventTargets:function(e){return[s.getActualElement(e.path?e.path[0]:e.target),s.getActualElement(e.currentTarget)]}};t.exports=p},{"./browser":37,"./domObjects":38,"./domUtils":39,"./hypot":43,"./is":46,"./pointerExtend":48}],50:[function(e,t,n){"use strict";for(var r=e("./window"),i=r.window,o=["ms","moz","webkit","o"],s=0,a=void 0,l=void 0,c=0;c\n * Open source under the MIT License.\n * https://raw.github.com/taye/interact.js/master/LICENSE\n */\n","/*\n * In a (windowless) server environment this file exports a factory function\n * that takes the window to use.\n *\n * var interact = require('interact.js')(windowObject);\n *\n * See https://github.com/taye/interact.js/issues/187\n */\nif (typeof window === 'undefined') {\n module.exports = function (window) {\n require('./src/utils/window').init(window);\n\n return require('./src/index');\n };\n}\nelse {\n module.exports = require('./src/index');\n}\n","const { indexOf } = require('./utils/arr');\nconst extend = require('./utils/extend.js');\n\nfunction fireUntilImmediateStopped (event, listeners) {\n for (let i = 0, len = listeners.length; i < len && !event.immediatePropagationStopped; i++) {\n listeners[i](event);\n }\n}\n\nclass Eventable {\n\n constructor (options) {\n this.options = extend({}, options || {});\n }\n\n fire (event) {\n let listeners;\n const onEvent = 'on' + event.type;\n const global = this.global;\n\n // Interactable#on() listeners\n if ((listeners = this[event.type])) {\n fireUntilImmediateStopped(event, listeners);\n }\n\n // interactable.onevent listener\n if (this[onEvent]) {\n this[onEvent](event);\n }\n\n // interact.on() listeners\n if (!event.propagationStopped && global && (listeners = global[event.type])) {\n fireUntilImmediateStopped(event, listeners);\n }\n }\n\n on (eventType, listener) {\n // if this type of event was never bound\n if (this[eventType]) {\n this[eventType].push(listener);\n }\n else {\n this[eventType] = [listener];\n }\n }\n\n off (eventType, listener) {\n // if it is an action event type\n const eventList = this[eventType];\n const index = eventList? indexOf(eventList, listener) : -1;\n\n if (index !== -1) {\n eventList.splice(index, 1);\n }\n\n if (eventList && eventList.length === 0 || !listener) {\n this[eventType] = listener;\n }\n }\n}\n\nmodule.exports = Eventable;\n","const extend = require('./utils/extend');\nconst getOriginXY = require('./utils/getOriginXY');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nclass InteractEvent {\n constructor (interaction, event, action, phase, element, related, preEnd = false) {\n const target = interaction.target;\n const deltaSource = (target && target.options || defaults).deltaSource;\n const origin = getOriginXY(target, element, action);\n const starting = phase === 'start';\n const ending = phase === 'end';\n const coords = starting? interaction.startCoords : interaction.curCoords;\n const prevEvent = interaction.prevEvent;\n\n element = element || interaction.element;\n\n const page = extend({}, coords.page);\n const client = extend({}, coords.client);\n\n page.x -= origin.x;\n page.y -= origin.y;\n\n client.x -= origin.x;\n client.y -= origin.y;\n\n this.ctrlKey = event.ctrlKey;\n this.altKey = event.altKey;\n this.shiftKey = event.shiftKey;\n this.metaKey = event.metaKey;\n this.button = event.button;\n this.buttons = event.buttons;\n this.target = element;\n this.currentTarget = element;\n this.relatedTarget = related || null;\n this.preEnd = preEnd;\n this.type = action + (phase || '');\n this.interaction = interaction;\n this.interactable = target;\n\n this.t0 = starting ? interaction.downTimes[interaction.downTimes.length - 1]\n : prevEvent.t0;\n\n const signalArg = {\n interaction,\n event,\n action,\n phase,\n element,\n related,\n page,\n client,\n coords,\n starting,\n ending,\n deltaSource,\n iEvent: this,\n };\n\n signals.fire('set-xy', signalArg);\n\n if (ending) {\n // use previous coords when ending\n this.pageX = prevEvent.pageX;\n this.pageY = prevEvent.pageY;\n this.clientX = prevEvent.clientX;\n this.clientY = prevEvent.clientY;\n }\n else {\n this.pageX = page.x;\n this.pageY = page.y;\n this.clientX = client.x;\n this.clientY = client.y;\n }\n\n this.x0 = interaction.startCoords.page.x - origin.x;\n this.y0 = interaction.startCoords.page.y - origin.y;\n this.clientX0 = interaction.startCoords.client.x - origin.x;\n this.clientY0 = interaction.startCoords.client.y - origin.y;\n\n signals.fire('set-delta', signalArg);\n\n this.timeStamp = coords.timeStamp;\n this.dt = interaction.pointerDelta.timeStamp;\n this.duration = this.timeStamp - this.t0;\n\n // speed and velocity in pixels per second\n this.speed = interaction.pointerDelta[deltaSource].speed;\n this.velocityX = interaction.pointerDelta[deltaSource].vx;\n this.velocityY = interaction.pointerDelta[deltaSource].vy;\n\n this.swipe = (ending || phase === 'inertiastart')? this.getSwipe() : null;\n\n signals.fire('new', signalArg);\n }\n\n getSwipe () {\n const interaction = this.interaction;\n\n if (interaction.prevEvent.speed < 600\n || this.timeStamp - interaction.prevEvent.timeStamp > 150) {\n return null;\n }\n\n let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI;\n const overlap = 22.5;\n\n if (angle < 0) {\n angle += 360;\n }\n\n const left = 135 - overlap <= angle && angle < 225 + overlap;\n const up = 225 - overlap <= angle && angle < 315 + overlap;\n\n const right = !left && (315 - overlap <= angle || angle < 45 + overlap);\n const down = !up && 45 - overlap <= angle && angle < 135 + overlap;\n\n return {\n up,\n down,\n left,\n right,\n angle,\n speed: interaction.prevEvent.speed,\n velocity: {\n x: interaction.prevEvent.velocityX,\n y: interaction.prevEvent.velocityY,\n },\n };\n }\n\n preventDefault () {}\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n}\n\nsignals.on('set-delta', function ({ iEvent, interaction, starting, deltaSource }) {\n const prevEvent = starting? iEvent : interaction.prevEvent;\n\n if (deltaSource === 'client') {\n iEvent.dx = iEvent.clientX - prevEvent.clientX;\n iEvent.dy = iEvent.clientY - prevEvent.clientY;\n }\n else {\n iEvent.dx = iEvent.pageX - prevEvent.pageX;\n iEvent.dy = iEvent.pageY - prevEvent.pageY;\n }\n});\n\nInteractEvent.signals = signals;\n\nmodule.exports = InteractEvent;\n","const is = require('./utils/is');\nconst events = require('./utils/events');\nconst extend = require('./utils/extend');\nconst actions = require('./actions/base');\nconst scope = require('./scope');\nconst Eventable = require('./Eventable');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nconst {\n getElementRect,\n nodeContains,\n trySelector,\n} = require('./utils/domUtils');\nconst { getWindow } = require('./utils/window');\nconst { indexOf, contains } = require('./utils/arr');\nconst { wheelEvent } = require('./utils/browser');\n\n// all set interactables\nscope.interactables = [];\n\n/*\\\n * Interactable\n [ property ]\n **\n * Object type returned by @interact\n\\*/\nclass Interactable {\n constructor (target, options) {\n options = options || {};\n\n this.target = target;\n this.events = new Eventable();\n this._context = options.context || scope.document;\n this._win = getWindow(trySelector(target)? this._context : target);\n this._doc = this._win.document;\n\n signals.fire('new', {\n target,\n options,\n interactable: this,\n win: this._win,\n });\n\n scope.addDocument( this._doc, this._win );\n\n scope.interactables.push(this);\n\n this.set(options);\n }\n\n setOnEvents (action, phases) {\n const onAction = 'on' + action;\n\n if (is.function(phases.onstart) ) { this.events[onAction + 'start' ] = phases.onstart ; }\n if (is.function(phases.onmove) ) { this.events[onAction + 'move' ] = phases.onmove ; }\n if (is.function(phases.onend) ) { this.events[onAction + 'end' ] = phases.onend ; }\n if (is.function(phases.oninertiastart)) { this.events[onAction + 'inertiastart' ] = phases.oninertiastart ; }\n\n return this;\n }\n\n setPerAction (action, options) {\n // for all the default per-action options\n for (const option in options) {\n // if this option exists for this action\n if (option in defaults[action]) {\n // if the option in the options arg is an object value\n if (is.object(options[option])) {\n // duplicate the object\n this.options[action][option] = extend(this.options[action][option] || {}, options[option]);\n\n if (is.object(defaults.perAction[option]) && 'enabled' in defaults.perAction[option]) {\n this.options[action][option].enabled = options[option].enabled === false? false : true;\n }\n }\n else if (is.bool(options[option]) && is.object(defaults.perAction[option])) {\n this.options[action][option].enabled = options[option];\n }\n else if (options[option] !== undefined) {\n // or if it's not undefined, do a plain assignment\n this.options[action][option] = options[option];\n }\n }\n }\n }\n\n /*\\\n * Interactable.getRect\n [ method ]\n *\n * The default function to get an Interactables bounding rect. Can be\n * overridden using @Interactable.rectChecker.\n *\n - element (Element) #optional The element to measure.\n = (object) The object's bounding rectangle.\n o {\n o top : 0,\n o left : 0,\n o bottom: 0,\n o right : 0,\n o width : 0,\n o height: 0\n o }\n \\*/\n getRect (element) {\n element = element || this.target;\n\n if (is.string(this.target) && !(is.element(element))) {\n element = this._context.querySelector(this.target);\n }\n\n return getElementRect(element);\n }\n\n /*\\\n * Interactable.rectChecker\n [ method ]\n *\n * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n - checker (function) #optional A function which returns this Interactable's bounding rectangle. See @Interactable.getRect\n = (function | object) The checker function or this Interactable\n \\*/\n rectChecker (checker) {\n if (is.function(checker)) {\n this.getRect = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.getRect;\n\n return this;\n }\n\n return this.getRect;\n }\n\n _backCompatOption (optionName, newValue) {\n if (trySelector(newValue) || is.object(newValue)) {\n this.options[optionName] = newValue;\n\n for (const action of actions.names) {\n this.options[action][optionName] = newValue;\n }\n\n return this;\n }\n\n return this.options[optionName];\n }\n\n /*\\\n * Interactable.origin\n [ method ]\n *\n * Gets or sets the origin of the Interactable's element. The x and y\n * of the origin will be subtracted from action event coordinates.\n *\n - origin (object | string) #optional An object eg. { x: 0, y: 0 } or string 'parent', 'self' or any CSS selector\n * OR\n - origin (Element) #optional An HTML or SVG Element whose rect will be used\n **\n = (object) The current origin or this Interactable\n \\*/\n origin (newValue) {\n return this._backCompatOption('origin', newValue);\n }\n\n /*\\\n * Interactable.deltaSource\n [ method ]\n *\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n - newValue (string) #optional Use 'client' if you will be scrolling while interacting; Use 'page' if you want autoScroll to work\n = (string | object) The current deltaSource or this Interactable\n \\*/\n deltaSource (newValue) {\n if (newValue === 'page' || newValue === 'client') {\n this.options.deltaSource = newValue;\n\n return this;\n }\n\n return this.options.deltaSource;\n }\n\n /*\\\n * Interactable.context\n [ method ]\n *\n * Gets the selector context Node of the Interactable. The default is `window.document`.\n *\n = (Node) The context Node of this Interactable\n **\n \\*/\n context () {\n return this._context;\n }\n\n inContext (element) {\n return (this._context === element.ownerDocument\n || nodeContains(this._context, element));\n }\n\n /*\\\n * Interactable.fire\n [ method ]\n *\n * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n - iEvent (InteractEvent) The InteractEvent object to be fired on this Interactable\n = (Interactable) this Interactable\n \\*/\n fire (iEvent) {\n this.events.fire(iEvent);\n\n return this;\n }\n\n _onOffMultiple (method, eventType, listener, options) {\n if (is.string(eventType) && eventType.search(' ') !== -1) {\n eventType = eventType.trim().split(/ +/);\n }\n\n if (is.array(eventType)) {\n for (let i = 0; i < eventType.length; i++) {\n this[method](eventType[i], listener, options);\n }\n\n return true;\n }\n\n if (is.object(eventType)) {\n for (const prop in eventType) {\n this[method](prop, eventType[prop], listener);\n }\n\n return true;\n }\n }\n\n /*\\\n * Interactable.on\n [ method ]\n *\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n - eventType (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) This Interactable\n \\*/\n on (eventType, listener, options) {\n if (this._onOffMultiple('on', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.on(eventType, listener);\n }\n // delegated event for selector\n else if (is.string(this.target)) {\n events.addDelegate(this.target, this._context, eventType, listener, options);\n }\n else {\n events.add(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.off\n [ method ]\n *\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n - eventType (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) This Interactable\n \\*/\n off (eventType, listener, options) {\n if (this._onOffMultiple('off', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n // if it is an action event type\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.off(eventType, listener);\n }\n // delegated event\n else if (is.string(this.target)) {\n events.removeDelegate(this.target, this._context, eventType, listener, options);\n }\n // remove listener from this Interatable's element\n else {\n events.remove(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.set\n [ method ]\n *\n * Reset the options of this Interactable\n - options (object) The new settings to apply\n = (object) This Interactable\n \\*/\n set (options) {\n if (!is.object(options)) {\n options = {};\n }\n\n this.options = extend({}, defaults.base);\n\n const perActions = extend({}, defaults.perAction);\n\n for (const actionName in actions.methodDict) {\n const methodName = actions.methodDict[actionName];\n\n this.options[actionName] = extend({}, defaults[actionName]);\n\n this.setPerAction(actionName, perActions);\n\n this[methodName](options[actionName]);\n }\n\n for (const setting of Interactable.settingsMethods) {\n this.options[setting] = defaults.base[setting];\n\n if (setting in options) {\n this[setting](options[setting]);\n }\n }\n\n signals.fire('set', {\n options,\n interactable: this,\n });\n\n return this;\n }\n\n /*\\\n * Interactable.unset\n [ method ]\n *\n * Remove this interactable from the list of interactables and remove\n * it's action capabilities and event listeners\n *\n = (object) @interact\n \\*/\n unset () {\n events.remove(this.target, 'all');\n\n if (is.string(this.target)) {\n // remove delegated events\n for (const type in events.delegatedEvents) {\n const delegated = events.delegatedEvents[type];\n\n if (delegated.selectors[0] === this.target\n && delegated.contexts[0] === this._context) {\n\n delegated.selectors.splice(0, 1);\n delegated.contexts .splice(0, 1);\n delegated.listeners.splice(0, 1);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegated[type] = null;\n }\n }\n\n events.remove(this._context, type, events.delegateListener);\n events.remove(this._context, type, events.delegateUseCapture, true);\n }\n }\n else {\n events.remove(this, 'all');\n }\n\n signals.fire('unset', { interactable: this });\n\n scope.interactables.splice(indexOf(scope.interactables, this), 1);\n\n // Stop related interactions when an Interactable is unset\n for (const interaction of scope.interactions || []) {\n if (interaction.target === this && interaction.interacting()) {\n interaction.stop();\n }\n }\n\n return scope.interact;\n }\n}\n\nscope.interactables.indexOfElement = function indexOfElement (target, context) {\n context = context || scope.document;\n\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n if (interactable.target === target && interactable._context === context) {\n return i;\n }\n }\n return -1;\n};\n\nscope.interactables.get = function interactableGet (element, options, dontCheckInContext) {\n const ret = this[this.indexOfElement(element, options && options.context)];\n\n return ret && (is.string(element) || dontCheckInContext || ret.inContext(element))? ret : null;\n};\n\nscope.interactables.forEachSelector = function (callback, element) {\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n // skip non CSS selector targets and out of context elements\n if (!is.string(interactable.target)\n || (element && !interactable.inContext(element))) {\n continue;\n }\n\n const ret = callback(interactable, interactable.target, interactable._context, i, this);\n\n if (ret !== undefined) {\n return ret;\n }\n }\n};\n\n// all interact.js eventTypes\nInteractable.eventTypes = scope.eventTypes = [];\n\nInteractable.signals = signals;\n\nInteractable.settingsMethods = [ 'deltaSource', 'origin', 'preventDefault', 'rectChecker' ];\n\nmodule.exports = Interactable;\n","const scope = require('./scope');\nconst utils = require('./utils');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst finder = require('./utils/interactionFinder');\nconst signals = require('./utils/Signals').new();\n\nconst listeners = {};\nconst methodNames = [\n 'pointerDown', 'pointerMove', 'pointerUp',\n 'updatePointer', 'removePointer',\n];\n\n// for ignoring browser's simulated mouse events\nlet prevTouchTime = 0;\n\n// all active and idle interactions\nscope.interactions = [];\n\nclass Interaction {\n constructor () {\n this.target = null; // current interactable being interacted with\n this.element = null; // the target element of the interactable\n\n this.prepared = { // action that's ready to be fired on next move event\n name : null,\n axis : null,\n edges: null,\n };\n\n // keep track of added pointers\n this.pointers = [];\n this.pointerIds = [];\n this.downTargets = [];\n this.downTimes = [];\n\n // Previous native pointer move event coordinates\n this.prevCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n // current native pointer move event coordinates\n this.curCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Starting InteractEvent pointer coordinates\n this.startCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Change in coordinates and time of the pointer\n this.pointerDelta = {\n page : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n client : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n timeStamp: 0,\n };\n\n this.downEvent = null; // pointerdown/mousedown/touchstart event\n this.downPointer = {};\n\n this._eventTarget = null;\n this._curEventTarget = null;\n\n this.prevEvent = null; // previous action event\n\n this.pointerIsDown = false;\n this.pointerWasMoved = false;\n this._interacting = false;\n\n this.mouse = false;\n\n signals.fire('new', this);\n\n scope.interactions.push(this);\n }\n\n pointerDown (pointer, event, eventTarget) {\n const pointerIndex = this.updatePointer(pointer, event, true);\n\n signals.fire('down', {\n pointer,\n event,\n eventTarget,\n pointerIndex,\n interaction: this,\n });\n }\n\n /*\\\n * Interaction.start\n [ method ]\n *\n * Start an action with the given Interactable and Element as tartgets. The\n * action must be enabled for the target Interactable and an appropriate number\n * of pointers must be held down - 1 for drag/resize, 2 for gesture.\n *\n * Use it with `interactable.able({ manualStart: false })` to always\n * [start actions manually](https://github.com/taye/interact.js/issues/114)\n *\n - action (object) The action to be performed - drag, resize, etc.\n - target (Interactable) The Interactable to target\n - element (Element) The DOM Element to target\n = (object) interact\n **\n | interact(target)\n | .draggable({\n | // disable the default drag start by down->move\n | manualStart: true\n | })\n | // start dragging after the user holds the pointer down\n | .on('hold', function (event) {\n | var interaction = event.interaction;\n |\n | if (!interaction.interacting()) {\n | interaction.start({ name: 'drag' },\n | event.interactable,\n | event.currentTarget);\n | }\n | });\n \\*/\n start (action, target, element) {\n if (this.interacting()\n || !this.pointerIsDown\n || this.pointerIds.length < (action.name === 'gesture'? 2 : 1)) {\n return;\n }\n\n // if this interaction had been removed after stopping\n // add it back\n if (utils.indexOf(scope.interactions, this) === -1) {\n scope.interactions.push(this);\n }\n\n utils.copyAction(this.prepared, action);\n this.target = target;\n this.element = element;\n\n signals.fire('action-start', {\n interaction: this,\n event: this.downEvent,\n });\n }\n\n pointerMove (pointer, event, eventTarget) {\n if (!this.simulation) {\n this.updatePointer(pointer);\n utils.setCoords(this.curCoords, this.pointers);\n }\n\n const duplicateMove = (this.curCoords.page.x === this.prevCoords.page.x\n && this.curCoords.page.y === this.prevCoords.page.y\n && this.curCoords.client.x === this.prevCoords.client.x\n && this.curCoords.client.y === this.prevCoords.client.y);\n\n let dx;\n let dy;\n\n // register movement greater than pointerMoveTolerance\n if (this.pointerIsDown && !this.pointerWasMoved) {\n dx = this.curCoords.client.x - this.startCoords.client.x;\n dy = this.curCoords.client.y - this.startCoords.client.y;\n\n this.pointerWasMoved = utils.hypot(dx, dy) > Interaction.pointerMoveTolerance;\n }\n\n const signalArg = {\n pointer,\n pointerIndex: this.getPointerIndex(pointer),\n event,\n eventTarget,\n dx,\n dy,\n duplicate: duplicateMove,\n interaction: this,\n interactingBeforeMove: this.interacting(),\n };\n\n if (!duplicateMove) {\n // set pointer coordinate, time changes and speeds\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n }\n\n signals.fire('move', signalArg);\n\n if (!duplicateMove) {\n // if interacting, fire an 'action-move' signal etc\n if (this.interacting()) {\n this.doMove(signalArg);\n }\n\n if (this.pointerWasMoved) {\n utils.copyCoords(this.prevCoords, this.curCoords);\n }\n }\n }\n\n /*\\\n * Interaction.doMove\n [ method ]\n *\n * Force a move of the current action at the same coordinates. Useful if\n * snap/restrict has been changed and you want a movement with the new\n * settings.\n *\n **\n | interact(target)\n | .draggable(true)\n | .on('dragmove', function (event) {\n | if (someCondition) {\n | // change the snap settings\n | event.interactable.draggable({ snap: { targets: [] }});\n | // fire another move event with re-calculated snap\n | event.interaction.doMove();\n | }\n | });\n \\*/\n doMove (signalArg) {\n signalArg = utils.extend({\n pointer: this.pointers[0],\n event: this.prevEvent,\n eventTarget: this._eventTarget,\n interaction: this,\n }, signalArg || {});\n\n signals.fire('before-action-move', signalArg);\n\n if (!this._dontFireMove) {\n signals.fire('action-move', signalArg);\n }\n\n this._dontFireMove = false;\n }\n\n // End interact move events and stop auto-scroll unless simulation is running\n pointerUp (pointer, event, eventTarget, curEventTarget) {\n const pointerIndex = this.getPointerIndex(pointer);\n\n signals.fire(/cancel$/i.test(event.type)? 'cancel' : 'up', {\n pointer,\n pointerIndex,\n event,\n eventTarget,\n curEventTarget,\n interaction: this,\n });\n\n if (!this.simulation) {\n this.end(event);\n }\n\n this.pointerIsDown = false;\n this.removePointer(pointer, event);\n }\n\n /*\\\n * Interaction.end\n [ method ]\n *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n - event (PointerEvent) #optional\n **\n | interact(target)\n | .draggable(true)\n | .on('move', function (event) {\n | if (event.pageX > 1000) {\n | // end the current action\n | event.interaction.end();\n | // stop all further listeners from being called\n | event.stopImmediatePropagation();\n | }\n | });\n \\*/\n end (event) {\n event = event || this.prevEvent;\n\n if (this.interacting()) {\n signals.fire('action-end', {\n event,\n interaction: this,\n });\n }\n\n this.stop();\n }\n\n currentAction () {\n return this._interacting? this.prepared.name: null;\n }\n\n interacting () {\n return this._interacting;\n }\n\n stop () {\n signals.fire('stop', { interaction: this });\n\n if (this._interacting) {\n signals.fire('stop-active', { interaction: this });\n signals.fire('stop-' + this.prepared.name, { interaction: this });\n }\n\n this.target = this.element = null;\n\n this._interacting = false;\n this.prepared.name = this.prevEvent = null;\n }\n\n getPointerIndex (pointer) {\n return utils.indexOf(this.pointerIds, utils.getPointerId(pointer));\n }\n\n updatePointer (pointer, event, down = event && /(down|start)$/i.test(event.type)) {\n const id = utils.getPointerId(pointer);\n let index = this.getPointerIndex(pointer);\n\n if (index === -1) {\n index = this.pointerIds.length;\n this.pointerIds[index] = id;\n }\n\n if (down) {\n signals.fire('update-pointer-down', {\n pointer,\n event,\n down,\n pointerId: id,\n pointerIndex: index,\n interaction: this,\n });\n }\n\n this.pointers[index] = pointer;\n\n return index;\n }\n\n removePointer (pointer, event) {\n const id = utils.getPointerId(pointer);\n const index = this.mouse? 0 : utils.indexOf(this.pointerIds, id);\n\n if (index === -1) { return; }\n\n signals.fire('remove-pointer', {\n pointer,\n event,\n pointerIndex: index,\n interaction: this,\n });\n\n this.pointers .splice(index, 1);\n this.pointerIds .splice(index, 1);\n this.downTargets.splice(index, 1);\n this.downTimes .splice(index, 1);\n }\n\n _updateEventTargets (target, currentTarget) {\n this._eventTarget = target;\n this._curEventTarget = currentTarget;\n }\n}\n\nfor (let i = 0, len = methodNames.length; i < len; i++) {\n const method = methodNames[i];\n\n listeners[method] = doOnInteractions(method);\n}\n\nfunction doOnInteractions (method) {\n return (function (event) {\n const [eventTarget, curEventTarget] = utils.getEventTargets(event);\n const matches = []; // [ [pointer, interaction], ...]\n\n if (browser.supportsTouch && /touch/.test(event.type)) {\n prevTouchTime = new Date().getTime();\n\n for (let i = 0; i < event.changedTouches.length; i++) {\n const pointer = event.changedTouches[i];\n const interaction = finder.search(pointer, event.type, eventTarget);\n\n matches.push([pointer, interaction || new Interaction()]);\n }\n }\n else {\n let invalidPointer = false;\n\n if (!browser.supportsPointerEvent && /mouse/.test(event.type)) {\n // ignore mouse events while touch interactions are active\n for (let i = 0; i < scope.interactions.length && !invalidPointer; i++) {\n invalidPointer = !scope.interactions[i].mouse && scope.interactions[i].pointerIsDown;\n }\n\n // try to ignore mouse events that are simulated by the browser\n // after a touch event\n invalidPointer = invalidPointer\n || (new Date().getTime() - prevTouchTime < 500)\n // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated\n || event.timeStamp === 0;\n }\n\n if (!invalidPointer) {\n let interaction = finder.search(event, event.type, eventTarget);\n\n if (!interaction) {\n\n interaction = new Interaction();\n interaction.mouse = (/mouse/i.test(event.pointerType || event.type)\n // MSPointerEvent.MSPOINTER_TYPE_MOUSE\n || event.pointerType === 4\n || !event.pointerType);\n }\n\n matches.push([event, interaction]);\n }\n }\n\n for (const [pointer, interaction] of matches) {\n interaction._updateEventTargets(eventTarget, curEventTarget);\n interaction[method](pointer, event, eventTarget, curEventTarget);\n }\n });\n}\n\nfunction endAll (event) {\n for (let i = 0; i < scope.interactions.length; i++) {\n const interaction = scope.interactions[i];\n\n interaction.end(event);\n signals.fire('endall', { event, interaction });\n }\n}\n\nconst docEvents = { /* 'eventType': listenerFunc */ };\nconst pEventTypes = browser.pEventTypes;\n\nif (scope.PointerEvent) {\n docEvents[pEventTypes.down ] = listeners.pointerDown;\n docEvents[pEventTypes.move ] = listeners.pointerMove;\n docEvents[pEventTypes.up ] = listeners.pointerUp;\n docEvents[pEventTypes.cancel] = listeners.pointerUp;\n}\nelse {\n docEvents.mousedown = listeners.pointerDown;\n docEvents.mousemove = listeners.pointerMove;\n docEvents.mouseup = listeners.pointerUp;\n\n docEvents.touchstart = listeners.pointerDown;\n docEvents.touchmove = listeners.pointerMove;\n docEvents.touchend = listeners.pointerUp;\n docEvents.touchcancel = listeners.pointerUp;\n}\n\ndocEvents.blur = endAll;\n\nfunction onDocSignal ({ doc }, signalName) {\n const eventMethod = signalName.indexOf('add') === 0\n ? events.add : events.remove;\n\n // delegate event listener\n for (const eventType in scope.delegatedEvents) {\n eventMethod(doc, eventType, events.delegateListener);\n eventMethod(doc, eventType, events.delegateUseCapture, true);\n }\n\n for (const eventType in docEvents) {\n eventMethod(doc, eventType, docEvents[eventType]);\n }\n}\n\nsignals.on('update-pointer-down', ({ interaction, pointer, pointerId, pointerIndex, event, eventTarget, down }) => {\n interaction.pointerIds[pointerIndex] = pointerId;\n interaction.pointers[pointerIndex] = pointer;\n\n if (down) {\n interaction.pointerIsDown = true;\n }\n\n if (!interaction.interacting()) {\n utils.setCoords(interaction.startCoords, interaction.pointers);\n\n utils.copyCoords(interaction.curCoords , interaction.startCoords);\n utils.copyCoords(interaction.prevCoords, interaction.startCoords);\n\n interaction.downEvent = event;\n interaction.downTimes[pointerIndex] = interaction.curCoords.timeStamp;\n interaction.downTargets[pointerIndex] = eventTarget || event && utils.getEventTargets(event)[0];\n interaction.pointerWasMoved = false;\n\n utils.pointerExtend(interaction.downPointer, pointer);\n }\n});\n\nscope.signals.on('add-document' , onDocSignal);\nscope.signals.on('remove-document', onDocSignal);\n\nInteraction.pointerMoveTolerance = 1;\nInteraction.doOnInteractions = doOnInteractions;\nInteraction.endAll = endAll;\nInteraction.signals = signals;\nInteraction.docEvents = docEvents;\n\nscope.endAllInteractions = endAll;\n\nmodule.exports = Interaction;\n","const Interaction = require('../Interaction');\nconst InteractEvent = require('../InteractEvent');\n\nconst actions = {\n firePrepared,\n names: [],\n methodDict: {},\n};\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n interaction._interacting = true;\n firePrepared(interaction, event, 'start');\n});\n\nInteraction.signals.on('action-move', function ({ interaction, event, preEnd }) {\n firePrepared(interaction, event, 'move', preEnd);\n\n // if the action was ended in a listener\n if (!interaction.interacting()) { return false; }\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n firePrepared(interaction, event, 'end');\n});\n\nfunction firePrepared (interaction, event, phase, preEnd) {\n const actionName = interaction.prepared.name;\n\n const newEvent = new InteractEvent(interaction, event, actionName, phase, interaction.element, null, preEnd);\n\n interaction.target.fire(newEvent);\n interaction.prevEvent = newEvent;\n}\n\nmodule.exports = actions;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drag = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n startAxis : 'xy',\n lockAxis : 'xy',\n },\n\n checker: function (pointer, event, interactable) {\n const dragOptions = interactable.options.drag;\n\n return dragOptions.enabled\n ? { name: 'drag', axis: (dragOptions.lockAxis === 'start'\n ? dragOptions.startAxis\n : dragOptions.lockAxis)}\n : null;\n },\n\n getCursor: function () {\n return 'move';\n },\n};\n\nInteraction.signals.on('before-action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n interaction.curCoords.page.y = interaction.startCoords.page.y;\n interaction.curCoords.client.y = interaction.startCoords.client.y;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vx);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vx);\n interaction.pointerDelta.client.vy = 0;\n interaction.pointerDelta.page.vy = 0;\n }\n else if (axis === 'y') {\n interaction.curCoords.page.x = interaction.startCoords.page.x;\n interaction.curCoords.client.x = interaction.startCoords.client.x;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vy);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vy);\n interaction.pointerDelta.client.vx = 0;\n interaction.pointerDelta.page.vx = 0;\n }\n});\n\n// dragmove\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'dragmove') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n iEvent.pageY = interaction.startCoords.page.y;\n iEvent.clientY = interaction.startCoords.client.y;\n iEvent.dy = 0;\n }\n else if (axis === 'y') {\n iEvent.pageX = interaction.startCoords.page.x;\n iEvent.clientX = interaction.startCoords.client.x;\n iEvent.dx = 0;\n }\n});\n\n/*\\\n * Interactable.draggable\n [ method ]\n *\n * Gets or sets whether drag actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of drag events\n | var isDraggable = interact('ul li').draggable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on drag events (object makes the Interactable draggable)\n = (object) This Interactable\n | interact(element).draggable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // the axis in which the first movement must be\n | // for the drag sequence to start\n | // 'xy' by default - any direction\n | startAxis: 'x' || 'y' || 'xy',\n |\n | // 'xy' by default - don't restrict to one axis (move in any direction)\n | // 'x' or 'y' to restrict movement to either axis\n | // 'start' to restrict movement to the axis the drag started in\n | lockAxis: 'x' || 'y' || 'xy' || 'start',\n |\n | // max number of drags that can happen concurrently\n | // with elements of this Interactable. Infinity by default\n | max: Infinity,\n |\n | // max number of drags that can target the same element+Interactable\n | // 1 by default\n | maxPerElement: 2\n | });\n\\*/\nInteractable.prototype.draggable = function (options) {\n if (utils.is.object(options)) {\n this.options.drag.enabled = options.enabled === false? false: true;\n this.setPerAction('drag', options);\n this.setOnEvents('drag', options);\n\n if (/^(xy|x|y|start)$/.test(options.lockAxis)) {\n this.options.drag.lockAxis = options.lockAxis;\n }\n if (/^(xy|x|y)$/.test(options.startAxis)) {\n this.options.drag.startAxis = options.startAxis;\n }\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drag.enabled = options;\n\n if (!options) {\n this.ondragstart = this.ondragstart = this.ondragend = null;\n }\n\n return this;\n }\n\n return this.options.drag;\n};\n\nactions.drag = drag;\nactions.names.push('drag');\nutils.merge(Interactable.eventTypes, [\n 'dragstart',\n 'dragmove',\n 'draginertiastart',\n 'draginertiaresume',\n 'dragend',\n]);\nactions.methodDict.drag = 'draggable';\n\ndefaultOptions.drag = drag.defaults;\n\nmodule.exports = drag;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst scope = require('../scope');\nconst interact = require('../interact');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drop = {\n defaults: {\n enabled: false,\n accept : null,\n overlap: 'pointer',\n },\n};\n\nlet dynamicDrop = false;\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // reset active dropzones\n interaction.activeDrops.dropzones = [];\n interaction.activeDrops.elements = [];\n interaction.activeDrops.rects = [];\n\n interaction.dropEvents = null;\n\n if (!interaction.dynamicDrop) {\n setActiveDrops(interaction, interaction.element);\n }\n\n const dragEvent = interaction.prevEvent;\n const dropEvents = getDropEvents(interaction, event, dragEvent);\n\n if (dropEvents.activate) {\n fireActiveDrops(interaction, dropEvents.activate);\n }\n});\n\nInteractEvent.signals.on('new', function ({ interaction, iEvent, event }) {\n if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { return; }\n\n const draggableElement = interaction.element;\n const dragEvent = iEvent;\n const dropResult = getDrop(dragEvent, event, draggableElement);\n\n interaction.dropTarget = dropResult.dropzone;\n interaction.dropElement = dropResult.element;\n\n interaction.dropEvents = getDropEvents(interaction, event, dragEvent);\n});\n\nInteraction.signals.on('action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n fireDropEvents(interaction, interaction.dropEvents);\n});\n\nInteraction.signals.on('action-end', function ({ interaction }) {\n if (interaction.prepared.name === 'drag') {\n fireDropEvents(interaction, interaction.dropEvents);\n }\n});\n\nInteraction.signals.on('stop-drag', function ({ interaction }) {\n interaction.activeDrops.dropzones =\n interaction.activeDrops.elements =\n interaction.activeDrops.rects =\n interaction.dropEvents = null;\n});\n\nfunction collectDrops (interaction, element) {\n const drops = [];\n const elements = [];\n\n element = element || interaction.element;\n\n // collect all dropzones and their elements which qualify for a drop\n for (const current of scope.interactables) {\n if (!current.options.drop.enabled) { continue; }\n\n const accept = current.options.drop.accept;\n\n // test the draggable element against the dropzone's accept setting\n if ((utils.is.element(accept) && accept !== element)\n || (utils.is.string(accept)\n && !utils.matchesSelector(element, accept))) {\n\n continue;\n }\n\n // query for new elements if necessary\n const dropElements = utils.is.string(current.target)\n ? current._context.querySelectorAll(current.target)\n : [current.target];\n\n for (let i = 0; i < dropElements.length; i++) {\n const currentElement = dropElements[i];\n\n if (currentElement !== element) {\n drops.push(current);\n elements.push(currentElement);\n }\n }\n }\n\n return {\n elements,\n dropzones: drops,\n };\n}\n\nfunction fireActiveDrops (interaction, event) {\n let prevElement;\n\n // loop through all active dropzones and trigger event\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n const current = interaction.activeDrops.dropzones[i];\n const currentElement = interaction.activeDrops.elements [i];\n\n // prevent trigger of duplicate events on same element\n if (currentElement !== prevElement) {\n // set current element as event target\n event.target = currentElement;\n current.fire(event);\n }\n prevElement = currentElement;\n }\n}\n\n// Collect a new set of possible drops and save them in activeDrops.\n// setActiveDrops should always be called when a drag has just started or a\n// drag event happens while dynamicDrop is true\nfunction setActiveDrops (interaction, dragElement) {\n // get dropzones and their elements that could receive the draggable\n const possibleDrops = collectDrops(interaction, dragElement, true);\n\n interaction.activeDrops.dropzones = possibleDrops.dropzones;\n interaction.activeDrops.elements = possibleDrops.elements;\n interaction.activeDrops.rects = [];\n\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n interaction.activeDrops.rects[i] =\n interaction.activeDrops.dropzones[i].getRect(interaction.activeDrops.elements[i]);\n }\n}\n\nfunction getDrop (dragEvent, event, dragElement) {\n const interaction = dragEvent.interaction;\n const validDrops = [];\n\n if (dynamicDrop) {\n setActiveDrops(interaction, dragElement);\n }\n\n // collect all dropzones and their elements which qualify for a drop\n for (let j = 0; j < interaction.activeDrops.dropzones.length; j++) {\n const current = interaction.activeDrops.dropzones[j];\n const currentElement = interaction.activeDrops.elements [j];\n const rect = interaction.activeDrops.rects [j];\n\n validDrops.push(current.dropCheck(dragEvent, event, interaction.target, dragElement, currentElement, rect)\n ? currentElement\n : null);\n }\n\n // get the most appropriate dropzone based on DOM depth and order\n const dropIndex = utils.indexOfDeepestElement(validDrops);\n\n return {\n dropzone: interaction.activeDrops.dropzones[dropIndex] || null,\n element : interaction.activeDrops.elements [dropIndex] || null,\n };\n}\n\nfunction getDropEvents (interaction, pointerEvent, dragEvent) {\n const dropEvents = {\n enter : null,\n leave : null,\n activate : null,\n deactivate: null,\n move : null,\n drop : null,\n };\n\n const tmpl = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n };\n\n if (interaction.dropElement !== interaction.prevDropElement) {\n // if there was a prevDropTarget, create a dragleave event\n if (interaction.prevDropTarget) {\n dropEvents.leave = utils.extend({ type: 'dragleave' }, tmpl);\n\n dragEvent.dragLeave = dropEvents.leave.target = interaction.prevDropElement;\n dragEvent.prevDropzone = dropEvents.leave.dropzone = interaction.prevDropTarget;\n }\n // if the dropTarget is not null, create a dragenter event\n if (interaction.dropTarget) {\n dropEvents.enter = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n type : 'dragenter',\n };\n\n dragEvent.dragEnter = interaction.dropElement;\n dragEvent.dropzone = interaction.dropTarget;\n }\n }\n\n if (dragEvent.type === 'dragend' && interaction.dropTarget) {\n dropEvents.drop = utils.extend({ type: 'drop' }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n dragEvent.relatedTarget = interaction.dropElement;\n }\n if (dragEvent.type === 'dragstart') {\n dropEvents.activate = utils.extend({ type: 'dropactivate' }, tmpl);\n\n dropEvents.activate.target = null;\n dropEvents.activate.dropzone = null;\n }\n if (dragEvent.type === 'dragend') {\n dropEvents.deactivate = utils.extend({ type: 'dropdeactivate' }, tmpl);\n\n dropEvents.deactivate.target = null;\n dropEvents.deactivate.dropzone = null;\n }\n if (dragEvent.type === 'dragmove' && interaction.dropTarget) {\n dropEvents.move = utils.extend({\n dragmove : dragEvent,\n type : 'dropmove',\n }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n }\n\n return dropEvents;\n}\n\nfunction fireDropEvents (interaction, dropEvents) {\n if (dropEvents.leave) { interaction.prevDropTarget.fire(dropEvents.leave); }\n if (dropEvents.move ) { interaction.dropTarget.fire(dropEvents.move ); }\n if (dropEvents.enter) { interaction.dropTarget.fire(dropEvents.enter); }\n if (dropEvents.drop ) { interaction.dropTarget.fire(dropEvents.drop ); }\n if (dropEvents.deactivate) {\n fireActiveDrops(interaction, dropEvents.deactivate);\n }\n\n interaction.prevDropTarget = interaction.dropTarget;\n interaction.prevDropElement = interaction.dropElement;\n}\n\n/*\\\n * Interactable.dropzone\n [ method ]\n *\n * Returns or sets whether elements can be dropped onto this\n * Interactable to trigger drop events\n *\n * Dropzones can receive the following events:\n * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends\n * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone\n * - `dragmove` when a draggable that has entered the dropzone is moved\n * - `drop` when a draggable is dropped into this dropzone\n *\n * Use the `accept` option to allow only elements that match the given CSS\n * selector or element. The value can be:\n *\n * - **an Element** - only that element can be dropped into this dropzone.\n * - **a string**, - the element being dragged must match it as a CSS selector.\n * - **`null`** - accept options is cleared - it accepts any element.\n *\n * Use the `overlap` option to set how drops are checked for. The allowed\n * values are:\n *\n * - `'pointer'`, the pointer must be over the dropzone (default)\n * - `'center'`, the draggable element's center must be over the dropzone\n * - a number from 0-1 which is the `(intersection area) / (draggable area)`.\n * e.g. `0.5` for drop to happen when half of the area of the draggable is\n * over the dropzone\n *\n * Use the `checker` option to specify a function to check if a dragged\n * element is over this Interactable.\n *\n | interact(target)\n | .dropChecker(function(dragEvent, // related dragmove or dragend event\n | event, // TouchEvent/PointerEvent/MouseEvent\n | dropped, // bool result of the default checker\n | dropzone, // dropzone Interactable\n | dropElement, // dropzone elemnt\n | draggable, // draggable Interactable\n | draggableElement) {// draggable element\n |\n | return dropped && event.target.hasAttribute('allow-drop');\n | }\n *\n *\n - options (boolean | object | null) #optional The new value to be set.\n | interact('.drop').dropzone({\n | accept: '.can-drop' || document.getElementById('single-drop'),\n | overlap: 'pointer' || 'center' || zeroToOne\n | }\n = (boolean | object) The current setting or this Interactable\n\\*/\nInteractable.prototype.dropzone = function (options) {\n if (utils.is.object(options)) {\n this.options.drop.enabled = options.enabled === false? false: true;\n\n if (utils.is.function(options.ondrop) ) { this.events.ondrop = options.ondrop ; }\n if (utils.is.function(options.ondropactivate) ) { this.events.ondropactivate = options.ondropactivate ; }\n if (utils.is.function(options.ondropdeactivate)) { this.events.ondropdeactivate = options.ondropdeactivate; }\n if (utils.is.function(options.ondragenter) ) { this.events.ondragenter = options.ondragenter ; }\n if (utils.is.function(options.ondragleave) ) { this.events.ondragleave = options.ondragleave ; }\n if (utils.is.function(options.ondropmove) ) { this.events.ondropmove = options.ondropmove ; }\n\n if (/^(pointer|center)$/.test(options.overlap)) {\n this.options.drop.overlap = options.overlap;\n }\n else if (utils.is.number(options.overlap)) {\n this.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0);\n }\n if ('accept' in options) {\n this.options.drop.accept = options.accept;\n }\n if ('checker' in options) {\n this.options.drop.checker = options.checker;\n }\n\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drop.enabled = options;\n\n if (!options) {\n this.ondragenter = this.ondragleave = this.ondrop\n = this.ondropactivate = this.ondropdeactivate = null;\n }\n\n return this;\n }\n\n return this.options.drop;\n};\n\nInteractable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) {\n let dropped = false;\n\n // if the dropzone has no rect (eg. display: none)\n // call the custom dropChecker or just return false\n if (!(rect = rect || this.getRect(dropElement))) {\n return (this.options.drop.checker\n ? this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement)\n : false);\n }\n\n const dropOverlap = this.options.drop.overlap;\n\n if (dropOverlap === 'pointer') {\n const origin = utils.getOriginXY(draggable, draggableElement, 'drag');\n const page = utils.getPageXY(dragEvent);\n\n page.x += origin.x;\n page.y += origin.y;\n\n const horizontal = (page.x > rect.left) && (page.x < rect.right);\n const vertical = (page.y > rect.top ) && (page.y < rect.bottom);\n\n dropped = horizontal && vertical;\n }\n\n const dragRect = draggable.getRect(draggableElement);\n\n if (dragRect && dropOverlap === 'center') {\n const cx = dragRect.left + dragRect.width / 2;\n const cy = dragRect.top + dragRect.height / 2;\n\n dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom;\n }\n\n if (dragRect && utils.is.number(dropOverlap)) {\n const overlapArea = (Math.max(0, Math.min(rect.right , dragRect.right ) - Math.max(rect.left, dragRect.left))\n * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top , dragRect.top )));\n\n const overlapRatio = overlapArea / (dragRect.width * dragRect.height);\n\n dropped = overlapRatio >= dropOverlap;\n }\n\n if (this.options.drop.checker) {\n dropped = this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement);\n }\n\n return dropped;\n};\n\nInteractable.signals.on('unset', function ({ interactable }) {\n interactable.dropzone(false);\n});\n\nInteractable.settingsMethods.push('dropChecker');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.dropTarget = null; // the dropzone a drag target might be dropped into\n interaction.dropElement = null; // the element at the time of checking\n interaction.prevDropTarget = null; // the dropzone that was recently dragged away from\n interaction.prevDropElement = null; // the element at the time of checking\n interaction.dropEvents = null; // the dropEvents related to the current drag event\n\n interaction.activeDrops = {\n dropzones: [], // the dropzones that are mentioned below\n elements : [], // elements of dropzones that accept the target draggable\n rects : [], // the rects of the elements mentioned above\n };\n\n});\n\nInteraction.signals.on('stop', function ({ interaction }) {\n interaction.dropTarget = interaction.dropElement =\n interaction.prevDropTarget = interaction.prevDropElement = null;\n});\n\n/*\\\n * interact.dynamicDrop\n [ method ]\n *\n * Returns or sets whether the dimensions of dropzone elements are\n * calculated on every dragmove or only on dragstart for the default\n * dropChecker\n *\n - newValue (boolean) #optional True to check on each move. False to check only before start\n = (boolean | interact) The current setting or interact\n\\*/\ninteract.dynamicDrop = function (newValue) {\n if (utils.is.bool(newValue)) {\n //if (dragging && dynamicDrop !== newValue && !newValue) {\n //calcRects(dropzones);\n //}\n\n dynamicDrop = newValue;\n\n return interact;\n }\n return dynamicDrop;\n};\n\nutils.merge(Interactable.eventTypes, [\n 'dragenter',\n 'dragleave',\n 'dropactivate',\n 'dropdeactivate',\n 'dropmove',\n 'drop',\n]);\nactions.methodDict.drop = 'dropzone';\n\ndefaultOptions.drop = drop.defaults;\n\nmodule.exports = drop;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst gesture = {\n defaults: {\n enabled : false,\n origin : null,\n restrict: null,\n },\n\n checker: function (pointer, event, interactable, element, interaction) {\n if (interaction.pointerIds.length >= 2) {\n return { name: 'gesture' };\n }\n\n return null;\n },\n\n getCursor: function () {\n return '';\n },\n};\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturestart') { return; }\n iEvent.ds = 0;\n\n interaction.gesture.startDistance = interaction.gesture.prevDistance = iEvent.distance;\n interaction.gesture.startAngle = interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.scale = 1;\n});\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturemove') { return; }\n\n iEvent.ds = iEvent.scale - interaction.gesture.scale;\n\n interaction.target.fire(iEvent);\n\n interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.prevDistance = iEvent.distance;\n\n if (iEvent.scale !== Infinity\n && iEvent.scale !== null\n && iEvent.scale !== undefined\n && !isNaN(iEvent.scale)) {\n\n interaction.gesture.scale = iEvent.scale;\n }\n});\n\n/*\\\n * Interactable.gesturable\n [ method ]\n *\n * Gets or sets whether multitouch gestures can be performed on the\n * Interactable's element\n *\n = (boolean) Indicates if this can be the target of gesture events\n | var isGestureable = interact(element).gesturable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on gesture events (makes the Interactable gesturable)\n = (object) this Interactable\n | interact(element).gesturable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // limit multiple gestures.\n | // See the explanation in @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n\\*/\nInteractable.prototype.gesturable = function (options) {\n if (utils.is.object(options)) {\n this.options.gesture.enabled = options.enabled === false? false: true;\n this.setPerAction('gesture', options);\n this.setOnEvents('gesture', options);\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.gesture.enabled = options;\n\n if (!options) {\n this.ongesturestart = this.ongesturestart = this.ongestureend = null;\n }\n\n return this;\n }\n\n return this.options.gesture;\n};\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action, event, starting, ending, deltaSource }) {\n if (action !== 'gesture') { return; }\n\n const pointers = interaction.pointers;\n\n iEvent.touches = [pointers[0], pointers[1]];\n\n if (starting) {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = 1;\n iEvent.ds = 0;\n iEvent.angle = utils.touchAngle(pointers, undefined, deltaSource);\n iEvent.da = 0;\n }\n else if (ending || event instanceof InteractEvent) {\n iEvent.distance = interaction.prevEvent.distance;\n iEvent.box = interaction.prevEvent.box;\n iEvent.scale = interaction.prevEvent.scale;\n iEvent.ds = iEvent.scale - 1;\n iEvent.angle = interaction.prevEvent.angle;\n iEvent.da = iEvent.angle - interaction.gesture.startAngle;\n }\n else {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = iEvent.distance / interaction.gesture.startDistance;\n iEvent.angle = utils.touchAngle(pointers, interaction.gesture.prevAngle, deltaSource);\n\n iEvent.ds = iEvent.scale - interaction.gesture.prevScale;\n iEvent.da = iEvent.angle - interaction.gesture.prevAngle;\n }\n});\n\nInteraction.signals.on('new', function (interaction) {\n interaction.gesture = {\n start: { x: 0, y: 0 },\n\n startDistance: 0, // distance between two touches of touchStart\n prevDistance : 0,\n distance : 0,\n\n scale: 1, // gesture.distance / gesture.startDistance\n\n startAngle: 0, // angle of line joining two touches\n prevAngle : 0, // angle of the previous gesture event\n };\n});\n\nactions.gesture = gesture;\nactions.names.push('gesture');\nutils.merge(Interactable.eventTypes, [\n 'gesturestart',\n 'gesturemove',\n 'gestureend',\n]);\nactions.methodDict.gesture = 'gesturable';\n\ndefaultOptions.gesture = gesture.defaults;\n\nmodule.exports = gesture;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\n// Less Precision with touch input\nconst defaultMargin = browser.supportsTouch || browser.supportsPointerEvent? 20: 10;\n\nconst resize = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n square: false,\n preserveAspectRatio: false,\n axis: 'xy',\n\n // use default margin\n margin: NaN,\n\n // object with props left, right, top, bottom which are\n // true/false values to resize when the pointer is over that edge,\n // CSS selectors to match the handles for each direction\n // or the Elements for each handle\n edges: null,\n\n // a value of 'none' will limit the resize rect to a minimum of 0x0\n // 'negate' will alow the rect to have negative width/height\n // 'reposition' will keep the width/height positive by swapping\n // the top and bottom edges and/or swapping the left and right edges\n invert: 'none',\n },\n\n checker: function (pointer, event, interactable, element, interaction, rect) {\n if (!rect) { return null; }\n\n const page = utils.extend({}, interaction.curCoords.page);\n const options = interactable.options;\n\n if (options.resize.enabled) {\n const resizeOptions = options.resize;\n const resizeEdges = { left: false, right: false, top: false, bottom: false };\n\n // if using resize.edges\n if (utils.is.object(resizeOptions.edges)) {\n for (const edge in resizeEdges) {\n resizeEdges[edge] = checkResizeEdge(edge,\n resizeOptions.edges[edge],\n page,\n interaction._eventTarget,\n element,\n rect,\n resizeOptions.margin || defaultMargin);\n }\n\n resizeEdges.left = resizeEdges.left && !resizeEdges.right;\n resizeEdges.top = resizeEdges.top && !resizeEdges.bottom;\n\n if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) {\n return {\n name: 'resize',\n edges: resizeEdges,\n };\n }\n }\n else {\n const right = options.resize.axis !== 'y' && page.x > (rect.right - defaultMargin);\n const bottom = options.resize.axis !== 'x' && page.y > (rect.bottom - defaultMargin);\n\n if (right || bottom) {\n return {\n name: 'resize',\n axes: (right? 'x' : '') + (bottom? 'y' : ''),\n };\n }\n }\n }\n\n return null;\n },\n\n cursors: (browser.isIe9OrOlder ? {\n x : 'e-resize',\n y : 's-resize',\n xy: 'se-resize',\n\n top : 'n-resize',\n left : 'w-resize',\n bottom : 's-resize',\n right : 'e-resize',\n topleft : 'se-resize',\n bottomright: 'se-resize',\n topright : 'ne-resize',\n bottomleft : 'ne-resize',\n } : {\n x : 'ew-resize',\n y : 'ns-resize',\n xy: 'nwse-resize',\n\n top : 'ns-resize',\n left : 'ew-resize',\n bottom : 'ns-resize',\n right : 'ew-resize',\n topleft : 'nwse-resize',\n bottomright: 'nwse-resize',\n topright : 'nesw-resize',\n bottomleft : 'nesw-resize',\n }),\n\n getCursor: function (action) {\n if (action.axis) {\n return resize.cursors[action.name + action.axis];\n }\n else if (action.edges) {\n let cursorKey = '';\n const edgeNames = ['top', 'bottom', 'left', 'right'];\n\n for (let i = 0; i < 4; i++) {\n if (action.edges[edgeNames[i]]) {\n cursorKey += edgeNames[i];\n }\n }\n\n return resize.cursors[cursorKey];\n }\n },\n};\n\n// resizestart\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'resizestart' || !interaction.prepared.edges) {\n return;\n }\n\n const startRect = interaction.target.getRect(interaction.element);\n const resizeOptions = interaction.target.options.resize;\n\n /*\n * When using the `resizable.square` or `resizable.preserveAspectRatio` options, resizing from one edge\n * will affect another. E.g. with `resizable.square`, resizing to make the right edge larger will make\n * the bottom edge larger by the same amount. We call these 'linked' edges. Any linked edges will depend\n * on the active edges and the edge being interacted with.\n */\n if (resizeOptions.square || resizeOptions.preserveAspectRatio) {\n const linkedEdges = utils.extend({}, interaction.prepared.edges);\n\n linkedEdges.top = linkedEdges.top || (linkedEdges.left && !linkedEdges.bottom);\n linkedEdges.left = linkedEdges.left || (linkedEdges.top && !linkedEdges.right );\n linkedEdges.bottom = linkedEdges.bottom || (linkedEdges.right && !linkedEdges.top );\n linkedEdges.right = linkedEdges.right || (linkedEdges.bottom && !linkedEdges.left );\n\n interaction.prepared._linkedEdges = linkedEdges;\n }\n else {\n interaction.prepared._linkedEdges = null;\n }\n\n // if using `resizable.preserveAspectRatio` option, record aspect ratio at the start of the resize\n if (resizeOptions.preserveAspectRatio) {\n interaction.resizeStartAspectRatio = startRect.width / startRect.height;\n }\n\n interaction.resizeRects = {\n start : startRect,\n current : utils.extend({}, startRect),\n inverted : utils.extend({}, startRect),\n previous : utils.extend({}, startRect),\n delta : {\n left: 0, right : 0, width : 0,\n top : 0, bottom: 0, height: 0,\n },\n };\n\n iEvent.rect = interaction.resizeRects.inverted;\n iEvent.deltaRect = interaction.resizeRects.delta;\n});\n\n// resizemove\nInteractEvent.signals.on('new', function ({ iEvent, phase, interaction }) {\n if (phase !== 'move' || !interaction.prepared.edges) { return; }\n\n const resizeOptions = interaction.target.options.resize;\n const invert = resizeOptions.invert;\n const invertible = invert === 'reposition' || invert === 'negate';\n\n let edges = interaction.prepared.edges;\n\n const start = interaction.resizeRects.start;\n const current = interaction.resizeRects.current;\n const inverted = interaction.resizeRects.inverted;\n const delta = interaction.resizeRects.delta;\n const previous = utils.extend(interaction.resizeRects.previous, inverted);\n const originalEdges = edges;\n\n let dx = iEvent.dx;\n let dy = iEvent.dy;\n\n if (resizeOptions.preserveAspectRatio || resizeOptions.square) {\n // `resize.preserveAspectRatio` takes precedence over `resize.square`\n const startAspectRatio = resizeOptions.preserveAspectRatio\n ? interaction.resizeStartAspectRatio\n : 1;\n\n edges = interaction.prepared._linkedEdges;\n\n if ((originalEdges.left && originalEdges.bottom)\n || (originalEdges.right && originalEdges.top)) {\n dy = -dx / startAspectRatio;\n }\n else if (originalEdges.left || originalEdges.right ) { dy = dx / startAspectRatio; }\n else if (originalEdges.top || originalEdges.bottom) { dx = dy * startAspectRatio; }\n }\n\n // update the 'current' rect without modifications\n if (edges.top ) { current.top += dy; }\n if (edges.bottom) { current.bottom += dy; }\n if (edges.left ) { current.left += dx; }\n if (edges.right ) { current.right += dx; }\n\n if (invertible) {\n // if invertible, copy the current rect\n utils.extend(inverted, current);\n\n if (invert === 'reposition') {\n // swap edge values if necessary to keep width/height positive\n let swap;\n\n if (inverted.top > inverted.bottom) {\n swap = inverted.top;\n\n inverted.top = inverted.bottom;\n inverted.bottom = swap;\n }\n if (inverted.left > inverted.right) {\n swap = inverted.left;\n\n inverted.left = inverted.right;\n inverted.right = swap;\n }\n }\n }\n else {\n // if not invertible, restrict to minimum of 0x0 rect\n inverted.top = Math.min(current.top, start.bottom);\n inverted.bottom = Math.max(current.bottom, start.top);\n inverted.left = Math.min(current.left, start.right);\n inverted.right = Math.max(current.right, start.left);\n }\n\n inverted.width = inverted.right - inverted.left;\n inverted.height = inverted.bottom - inverted.top ;\n\n for (const edge in inverted) {\n delta[edge] = inverted[edge] - previous[edge];\n }\n\n iEvent.edges = interaction.prepared.edges;\n iEvent.rect = inverted;\n iEvent.deltaRect = delta;\n});\n\n/*\\\n * Interactable.resizable\n [ method ]\n *\n * Gets or sets whether resize actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of resize elements\n | var isResizeable = interact('input[type=text]').resizable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on resize events (object makes the Interactable resizable)\n = (object) This Interactable\n | interact(element).resizable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | edges: {\n | top : true, // Use pointer coords to check for resize.\n | left : false, // Disable resizing from left edge.\n | bottom: '.resize-s',// Resize if pointer target matches selector\n | right : handleEl // Resize if pointer target is the given Element\n | },\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height are adjusted at a 1:1 ratio.\n | square: false,\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height maintain the aspect ratio they had when resizing started.\n | preserveAspectRatio: false,\n |\n | // a value of 'none' will limit the resize rect to a minimum of 0x0\n | // 'negate' will allow the rect to have negative width/height\n | // 'reposition' will keep the width/height positive by swapping\n | // the top and bottom edges and/or swapping the left and right edges\n | invert: 'none' || 'negate' || 'reposition'\n |\n | // limit multiple resizes.\n | // See the explanation in the @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n \\*/\nInteractable.prototype.resizable = function (options) {\n if (utils.is.object(options)) {\n this.options.resize.enabled = options.enabled === false? false: true;\n this.setPerAction('resize', options);\n this.setOnEvents('resize', options);\n\n if (/^x$|^y$|^xy$/.test(options.axis)) {\n this.options.resize.axis = options.axis;\n }\n else if (options.axis === null) {\n this.options.resize.axis = defaultOptions.resize.axis;\n }\n\n if (utils.is.bool(options.preserveAspectRatio)) {\n this.options.resize.preserveAspectRatio = options.preserveAspectRatio;\n }\n else if (utils.is.bool(options.square)) {\n this.options.resize.square = options.square;\n }\n\n return this;\n }\n if (utils.is.bool(options)) {\n this.options.resize.enabled = options;\n\n if (!options) {\n this.onresizestart = this.onresizestart = this.onresizeend = null;\n }\n\n return this;\n }\n return this.options.resize;\n};\n\nfunction checkResizeEdge (name, value, page, element, interactableElement, rect, margin) {\n // false, '', undefined, null\n if (!value) { return false; }\n\n // true value, use pointer coords and element rect\n if (value === true) {\n // if dimensions are negative, \"switch\" edges\n const width = utils.is.number(rect.width )? rect.width : rect.right - rect.left;\n const height = utils.is.number(rect.height)? rect.height : rect.bottom - rect.top ;\n\n if (width < 0) {\n if (name === 'left' ) { name = 'right'; }\n else if (name === 'right') { name = 'left' ; }\n }\n if (height < 0) {\n if (name === 'top' ) { name = 'bottom'; }\n else if (name === 'bottom') { name = 'top' ; }\n }\n\n if (name === 'left' ) { return page.x < ((width >= 0? rect.left: rect.right ) + margin); }\n if (name === 'top' ) { return page.y < ((height >= 0? rect.top : rect.bottom) + margin); }\n\n if (name === 'right' ) { return page.x > ((width >= 0? rect.right : rect.left) - margin); }\n if (name === 'bottom') { return page.y > ((height >= 0? rect.bottom: rect.top ) - margin); }\n }\n\n // the remaining checks require an element\n if (!utils.is.element(element)) { return false; }\n\n return utils.is.element(value)\n // the value is an element to use as a resize handle\n ? value === element\n // otherwise check if element matches value as selector\n : utils.matchesUpTo(element, value, interactableElement);\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.resizeAxes = 'xy';\n});\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action }) {\n if (action !== 'resize' || !interaction.resizeAxes) { return; }\n\n const options = interaction.target.options;\n\n if (options.resize.square) {\n if (interaction.resizeAxes === 'y') {\n iEvent.dx = iEvent.dy;\n }\n else {\n iEvent.dy = iEvent.dx;\n }\n iEvent.axes = 'xy';\n }\n else {\n iEvent.axes = interaction.resizeAxes;\n\n if (interaction.resizeAxes === 'x') {\n iEvent.dy = 0;\n }\n else if (interaction.resizeAxes === 'y') {\n iEvent.dx = 0;\n }\n }\n});\n\nactions.resize = resize;\nactions.names.push('resize');\nutils.merge(Interactable.eventTypes, [\n 'resizestart',\n 'resizemove',\n 'resizeinertiastart',\n 'resizeinertiaresume',\n 'resizeend',\n]);\nactions.methodDict.resize = 'resizable';\n\ndefaultOptions.resize = resize.defaults;\n\nmodule.exports = resize;\n","const raf = require('./utils/raf');\nconst getWindow = require('./utils/window').getWindow;\nconst is = require('./utils/is');\nconst domUtils = require('./utils/domUtils');\nconst Interaction = require('./Interaction');\nconst defaultOptions = require('./defaultOptions');\n\nconst autoScroll = {\n defaults: {\n enabled : false,\n container: null, // the item that is scrolled (Window or HTMLElement)\n margin : 60,\n speed : 300, // the scroll speed in pixels per second\n },\n\n interaction: null,\n i: null, // the handle returned by window.setInterval\n x: 0, y: 0, // Direction each pulse is to scroll in\n\n isScrolling: false,\n prevTime: 0,\n\n start: function (interaction) {\n autoScroll.isScrolling = true;\n raf.cancel(autoScroll.i);\n\n autoScroll.interaction = interaction;\n autoScroll.prevTime = new Date().getTime();\n autoScroll.i = raf.request(autoScroll.scroll);\n },\n\n stop: function () {\n autoScroll.isScrolling = false;\n raf.cancel(autoScroll.i);\n },\n\n // scroll the window by the values in scroll.x/y\n scroll: function () {\n const options = autoScroll.interaction.target.options[autoScroll.interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(autoScroll.interaction.element);\n const now = new Date().getTime();\n // change in time in seconds\n const dt = (now - autoScroll.prevTime) / 1000;\n // displacement\n const s = options.speed * dt;\n\n if (s >= 1) {\n if (is.window(container)) {\n container.scrollBy(autoScroll.x * s, autoScroll.y * s);\n }\n else if (container) {\n container.scrollLeft += autoScroll.x * s;\n container.scrollTop += autoScroll.y * s;\n }\n\n autoScroll.prevTime = now;\n }\n\n if (autoScroll.isScrolling) {\n raf.cancel(autoScroll.i);\n autoScroll.i = raf.request(autoScroll.scroll);\n }\n },\n check: function (interactable, actionName) {\n const options = interactable.options;\n\n return options[actionName].autoScroll && options[actionName].autoScroll.enabled;\n },\n onInteractionMove: function ({ interaction, pointer }) {\n if (!(interaction.interacting()\n && autoScroll.check(interaction.target, interaction.prepared.name))) {\n return;\n }\n\n if (interaction.simulation) {\n autoScroll.x = autoScroll.y = 0;\n return;\n }\n\n let top;\n let right;\n let bottom;\n let left;\n\n const options = interaction.target.options[interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(interaction.element);\n\n if (is.window(container)) {\n left = pointer.clientX < autoScroll.margin;\n top = pointer.clientY < autoScroll.margin;\n right = pointer.clientX > container.innerWidth - autoScroll.margin;\n bottom = pointer.clientY > container.innerHeight - autoScroll.margin;\n }\n else {\n const rect = domUtils.getElementClientRect(container);\n\n left = pointer.clientX < rect.left + autoScroll.margin;\n top = pointer.clientY < rect.top + autoScroll.margin;\n right = pointer.clientX > rect.right - autoScroll.margin;\n bottom = pointer.clientY > rect.bottom - autoScroll.margin;\n }\n\n autoScroll.x = (right ? 1: left? -1: 0);\n autoScroll.y = (bottom? 1: top? -1: 0);\n\n if (!autoScroll.isScrolling) {\n // set the autoScroll properties to those of the target\n autoScroll.margin = options.margin;\n autoScroll.speed = options.speed;\n\n autoScroll.start(interaction);\n }\n },\n};\n\nInteraction.signals.on('stop-active', function () {\n autoScroll.stop();\n});\n\nInteraction.signals.on('action-move', autoScroll.onInteractionMove);\n\ndefaultOptions.perAction.autoScroll = autoScroll.defaults;\n\nmodule.exports = autoScroll;\n","const Interactable = require('../Interactable');\nconst actions = require('../actions/base');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.ignoreFrom\n [ method ]\n *\n * If the target of the `mousedown`, `pointerdown` or `touchstart`\n * event or any of it's parents match the given CSS selector or\n * Element, no drag/resize/gesture is started.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to not ignore any elements\n = (string | Element | object) The current ignoreFrom value or this Interactable\n **\n | interact(element, { ignoreFrom: document.getElementById('no-action') });\n | // or\n | interact(element).ignoreFrom('input, textarea, a');\n\\*/\nInteractable.prototype.ignoreFrom = function (newValue) {\n return this._backCompatOption('ignoreFrom', newValue);\n};\n\n/*\\\n * Interactable.allowFrom\n [ method ]\n *\n * A drag/resize/gesture is started only If the target of the\n * `mousedown`, `pointerdown` or `touchstart` event or any of it's\n * parents match the given CSS selector or Element.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to allow from any element\n = (string | Element | object) The current allowFrom value or this Interactable\n **\n | interact(element, { allowFrom: document.getElementById('drag-handle') });\n | // or\n | interact(element).allowFrom('.handle');\n\\*/\nInteractable.prototype.allowFrom = function (newValue) {\n return this._backCompatOption('allowFrom', newValue);\n};\n\nInteractable.prototype.testIgnore = function (ignoreFrom, interactableElement, element) {\n if (!ignoreFrom || !is.element(element)) { return false; }\n\n if (is.string(ignoreFrom)) {\n return domUtils.matchesUpTo(element, ignoreFrom, interactableElement);\n }\n else if (is.element(ignoreFrom)) {\n return domUtils.nodeContains(ignoreFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testAllow = function (allowFrom, interactableElement, element) {\n if (!allowFrom) { return true; }\n\n if (!is.element(element)) { return false; }\n\n if (is.string(allowFrom)) {\n return domUtils.matchesUpTo(element, allowFrom, interactableElement);\n }\n else if (is.element(allowFrom)) {\n return domUtils.nodeContains(allowFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testIgnoreAllow = function (options, interactableElement, eventTarget) {\n return (!this.testIgnore(options.ignoreFrom, interactableElement, eventTarget)\n && this.testAllow(options.allowFrom, interactableElement, eventTarget));\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (event.buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\n","const interact = require('../interact');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst actions = require('../actions/base');\nconst defaultOptions = require('../defaultOptions');\nconst browser = require('../utils/browser');\nconst scope = require('../scope');\nconst utils = require('../utils');\nconst signals = require('../utils/Signals').new();\n\nrequire('./InteractableMethods');\n\nconst autoStart = {\n signals,\n withinInteractionLimit,\n // Allow this many interactions to happen simultaneously\n maxInteractions: Infinity,\n defaults: {\n perAction: {\n manualStart: false,\n max: Infinity,\n maxPerElement: 1,\n allowFrom: null,\n ignoreFrom: null,\n },\n },\n setActionDefaults: function (action) {\n utils.extend(action.defaults, autoStart.defaults.perAction);\n },\n};\n\n// set cursor style on mousedown\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget }) {\n if (interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\n// set cursor style on mousemove\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget }) {\n if (!interaction.mouse\n || interaction.pointerIsDown\n || interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\nInteraction.signals.on('move', function (arg) {\n const { interaction, event } = arg;\n\n if (!interaction.pointerIsDown\n || interaction.interacting()\n || !interaction.pointerWasMoved\n || !interaction.prepared.name) {\n return;\n }\n\n signals.fire('before-start', arg);\n\n const target = interaction.target;\n\n if (interaction.prepared.name && target) {\n // check manualStart and interaction limit\n if (target.options[interaction.prepared.name].manualStart\n || !withinInteractionLimit(target, interaction.element, interaction.prepared)) {\n interaction.stop(event);\n }\n else {\n interaction.start(interaction.prepared, target, interaction.element);\n }\n }\n});\n\n// Check if the current target supports the action.\n// If so, return the validated action. Otherwise, return null\nfunction validateAction (action, interactable, element, eventTarget) {\n if (utils.is.object(action)\n && interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget)\n && interactable.options[action.name].enabled\n && withinInteractionLimit(interactable, element, action)) {\n return action;\n }\n\n return null;\n}\n\nfunction validateSelector (interaction, pointer, event, matches, matchElements, eventTarget) {\n for (let i = 0, len = matches.length; i < len; i++) {\n const match = matches[i];\n const matchElement = matchElements[i];\n const action = validateAction(match.getAction(pointer, event, interaction, matchElement),\n match,\n matchElement,\n eventTarget);\n\n if (action) {\n return {\n action,\n target: match,\n element: matchElement,\n };\n }\n }\n\n return {};\n}\n\nfunction getActionInfo (interaction, pointer, event, eventTarget) {\n let matches = [];\n let matchElements = [];\n\n let element = eventTarget;\n let action = null;\n\n function pushMatches (interactable, selector, context) {\n const elements = (browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined);\n\n if (utils.matchesSelector(element, selector, elements)) {\n\n matches.push(interactable);\n matchElements.push(element);\n }\n }\n\n while (utils.is.element(element)) {\n matches = [];\n matchElements = [];\n\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && (action = validateAction(elementInteractable.getAction(pointer, event, interaction, element, eventTarget),\n elementInteractable,\n element,\n eventTarget))\n && !elementInteractable.options[action.name].manualStart) {\n return {\n element,\n action,\n target: elementInteractable,\n };\n }\n else {\n scope.interactables.forEachSelector(pushMatches, element);\n\n const actionInfo = validateSelector(interaction, pointer, event, matches, matchElements, eventTarget);\n\n if (actionInfo.action\n && !actionInfo.target.options[actionInfo.action.name].manualStart) {\n return actionInfo;\n }\n }\n\n element = utils.parentNode(element);\n }\n\n return {};\n}\n\nfunction prepare (interaction, { action, target, element }) {\n action = action || {};\n\n if (interaction.target && interaction.target.options.styleCursor) {\n interaction.target._doc.documentElement.style.cursor = '';\n }\n\n interaction.target = target;\n interaction.element = element;\n utils.copyAction(interaction.prepared, action);\n\n if (target && target.options.styleCursor) {\n const cursor = action? actions[action.name].getCursor(action) : '';\n interaction.target._doc.documentElement.style.cursor = cursor;\n }\n\n signals.fire('prepared', { interaction: interaction });\n}\n\nInteraction.signals.on('stop', function ({ interaction }) {\n const target = interaction.target;\n\n if (target && target.options.styleCursor) {\n target._doc.documentElement.style.cursor = '';\n }\n});\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (utils.is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (utils.is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n const buttons = event.buttons || ({\n 0: 1,\n 1: 4,\n 3: 8,\n 4: 16,\n })[event.button];\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\nfunction withinInteractionLimit (interactable, element, action) {\n const options = interactable.options;\n const maxActions = options[action.name].max;\n const maxPerElement = options[action.name].maxPerElement;\n let activeInteractions = 0;\n let targetCount = 0;\n let targetElementCount = 0;\n\n // no actions if any of these values == 0\n if (!(maxActions && maxPerElement && autoStart.maxInteractions)) { return; }\n\n for (let i = 0, len = scope.interactions.length; i < len; i++) {\n const interaction = scope.interactions[i];\n const otherAction = interaction.prepared.name;\n\n if (!interaction.interacting()) { continue; }\n\n activeInteractions++;\n\n if (activeInteractions >= autoStart.maxInteractions) {\n return false;\n }\n\n if (interaction.target !== interactable) { continue; }\n\n targetCount += (otherAction === action.name)|0;\n\n if (targetCount >= maxActions) {\n return false;\n }\n\n if (interaction.element === element) {\n targetElementCount++;\n\n if (otherAction !== action.name || targetElementCount >= maxPerElement) {\n return false;\n }\n }\n }\n\n return autoStart.maxInteractions > 0;\n}\n\n/*\\\n * interact.maxInteractions\n [ method ]\n **\n * Returns or sets the maximum number of concurrent interactions allowed.\n * By default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables\n * and elements, you need to enable it in the draggable, resizable and\n * gesturable `'max'` and `'maxPerElement'` options.\n **\n - newValue (number) #optional Any number. newValue <= 0 means no interactions.\n\\*/\ninteract.maxInteractions = function (newValue) {\n if (utils.is.number(newValue)) {\n autoStart.maxInteractions = newValue;\n\n return this;\n }\n\n return autoStart.maxInteractions;\n};\n\nInteractable.settingsMethods.push('styleCursor');\nInteractable.settingsMethods.push('actionChecker');\nInteractable.settingsMethods.push('ignoreFrom');\nInteractable.settingsMethods.push('allowFrom');\n\ndefaultOptions.base.actionChecker = null;\ndefaultOptions.base.styleCursor = true;\n\nutils.extend(defaultOptions.perAction, autoStart.defaults.perAction);\n\nmodule.exports = autoStart;\n","const autoStart = require('./base');\nconst Interaction = require('../Interaction');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.delayTimer = null;\n});\n\nautoStart.signals.on('prepared', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.delayTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.target, interaction.element);\n }, delay);\n }\n});\n\nInteraction.signals.on('move', function ({ interaction, duplicate }) {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.delayTimer);\n }\n});\n\n// prevent regular down->move autoStart\nautoStart.signals.on('before-start', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.prepared.name = null;\n }\n});\n","const autoStart = require('./base');\nconst scope = require('../scope');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\n\nconst { matchesSelector, parentNode } = require('../utils/domUtils');\n\nautoStart.setActionDefaults(require('../actions/drag'));\n\nautoStart.signals.on('before-start', function ({ interaction, eventTarget, dx, dy }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // check if a drag is in the correct axis\n const absX = Math.abs(dx);\n const absY = Math.abs(dy);\n const options = interaction.target.options.drag;\n const startAxis = options.startAxis;\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy');\n\n interaction.prepared.axis = options.lockAxis === 'start'\n ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n : options.lockAxis;\n\n // if the movement isn't in the startAxis of the interactable\n if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) {\n // cancel the prepared action\n interaction.prepared.name = null;\n\n // then try to get a drag from another ineractable\n\n if (!interaction.prepared.name) {\n\n let element = eventTarget;\n\n const getDraggable = function (interactable, selector, context) {\n const elements = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n if (interactable === interaction.target) { return; }\n\n if (!options.manualStart\n && !interactable.testIgnoreAllow(options, element, eventTarget)\n && matchesSelector(element, selector, elements)) {\n\n const action = interactable.getAction(interaction.downPointer,\n interaction.downEvent,\n interaction,\n element);\n\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, interactable)\n && autoStart.validateAction(action, interactable, element, eventTarget)) {\n\n return interactable;\n }\n }\n };\n\n let action = null;\n\n // check all interactables\n while (is.element(element)) {\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && elementInteractable !== interaction.target\n && !elementInteractable.options.drag.manualStart) {\n\n action = elementInteractable.getAction(interaction.downPointer, interaction.downEvent, interaction, element);\n }\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, elementInteractable)) {\n\n interaction.prepared.name = 'drag';\n interaction.target = elementInteractable;\n interaction.element = element;\n break;\n }\n\n const selectorInteractable = scope.interactables.forEachSelector(getDraggable, element);\n\n if (selectorInteractable) {\n interaction.prepared.name = 'drag';\n interaction.target = selectorInteractable;\n interaction.element = element;\n break;\n }\n\n element = parentNode(element);\n }\n }\n }\n});\n\nfunction checkStartAxis (startAxis, interactable) {\n if (!interactable) { return false; }\n\n const thisAxis = interactable.options.drag.startAxis;\n\n return (startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis);\n}\n","require('./base').setActionDefaults(require('../actions/gesture'));\n","require('./base').setActionDefaults(require('../actions/resize'));\n","module.exports = {\n base: {\n accept : null,\n preventDefault: 'auto',\n deltaSource : 'page',\n },\n\n perAction: {\n origin: { x: 0, y: 0 },\n\n // only allow left button by default\n // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n mouseButtons: 1,\n\n inertia: {\n enabled : false,\n resistance : 10, // the lambda in exponential decay\n minSpeed : 100, // target speed must be above this for inertia to start\n endSpeed : 10, // the speed at which inertia is slow enough to stop\n allowResume : true, // allow resuming an action in inertia phase\n smoothEndDuration: 300, // animate to snap/restrict endOnly if there's no inertia\n },\n },\n};\n","/* browser entry point */\n\n// Legacy browser support\nrequire('./legacyBrowsers');\n\n// inertia\nrequire('./inertia');\n\n// modifiers\nrequire('./modifiers/snap');\nrequire('./modifiers/restrict');\n\n// pointerEvents\nrequire('./pointerEvents/base');\nrequire('./pointerEvents/holdRepeat');\nrequire('./pointerEvents/interactableTargets');\n\n// delay\nrequire('./autoStart/delay');\n\n// actions\nrequire('./actions/gesture');\nrequire('./actions/resize');\nrequire('./actions/drag');\nrequire('./actions/drop');\n\n// load these modifiers after resize is loaded\nrequire('./modifiers/snapSize');\nrequire('./modifiers/restrictEdges');\nrequire('./modifiers/restrictSize');\n\n// autoStart actions\nrequire('./autoStart/gesture');\nrequire('./autoStart/resize');\nrequire('./autoStart/drag');\n\n// Interactable preventDefault setting\nrequire('./interactablePreventDefault.js');\n\n// autoScroll\nrequire('./autoScroll');\n\n// export interact\nmodule.exports = require('./interact');\n","const InteractEvent = require('./InteractEvent');\nconst Interaction = require('./Interaction');\nconst modifiers = require('./modifiers');\nconst utils = require('./utils');\nconst animationFrame = require('./utils/raf');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.inertiaStatus = {\n active : false,\n smoothEnd : false,\n allowResume: false,\n\n startEvent: null,\n upCoords : {},\n\n xe: 0, ye: 0,\n sx: 0, sy: 0,\n\n t0: 0,\n vx0: 0, vys: 0,\n duration: 0,\n\n lambda_v0: 0,\n one_ve_v0: 0,\n i : null,\n };\n\n interaction.boundInertiaFrame = () => inertiaFrame .apply(interaction);\n interaction.boundSmoothEndFrame = () => smoothEndFrame.apply(interaction);\n});\n\nInteraction.signals.on('down', function ({ interaction, event, pointer, eventTarget }) {\n const status = interaction.inertiaStatus;\n\n // Check if the down event hits the current inertia target\n if (status.active) {\n let element = eventTarget;\n\n // climb up the DOM tree from the event target\n while (utils.is.element(element)) {\n\n // if interaction element is the current inertia target element\n if (element === interaction.element) {\n // stop inertia\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n\n // update pointers to the down event's coordinates\n interaction.updatePointer(pointer);\n utils.setCoords(interaction.curCoords, interaction.pointers);\n\n // fire appropriate signals\n const signalArg = { interaction };\n Interaction.signals.fire('before-action-move', signalArg);\n Interaction.signals.fire('action-resume' , signalArg);\n\n // fire a reume event\n const resumeEvent = new InteractEvent(interaction,\n event,\n interaction.prepared.name,\n 'inertiaresume',\n interaction.element);\n\n interaction.target.fire(resumeEvent);\n interaction.prevEvent = resumeEvent;\n modifiers.resetStatuses(interaction.modifierStatuses);\n\n utils.copyCoords(interaction.prevCoords, interaction.curCoords);\n break;\n }\n\n element = utils.parentNode(element);\n }\n }\n});\n\nInteraction.signals.on('up', function ({ interaction, event }) {\n const status = interaction.inertiaStatus;\n\n if (!interaction.interacting() || status.active) { return; }\n\n const target = interaction.target;\n const options = target && target.options;\n const inertiaOptions = options && interaction.prepared.name && options[interaction.prepared.name].inertia;\n\n const now = new Date().getTime();\n const statuses = {};\n const page = utils.extend({}, interaction.curCoords.page);\n const pointerSpeed = interaction.pointerDelta.client.speed;\n\n let smoothEnd = false;\n let modifierResult;\n\n // check if inertia should be started\n const inertiaPossible = (inertiaOptions && inertiaOptions.enabled\n && interaction.prepared.name !== 'gesture'\n && event !== status.startEvent);\n\n const inertia = (inertiaPossible\n && (now - interaction.curCoords.timeStamp) < 50\n && pointerSpeed > inertiaOptions.minSpeed\n && pointerSpeed > inertiaOptions.endSpeed);\n\n const modifierArg = {\n interaction,\n pageCoords: page,\n statuses,\n preEnd: true,\n requireEndOnly: true,\n };\n\n // smoothEnd\n if (inertiaPossible && !inertia) {\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n if (modifierResult.shouldMove && modifierResult.locked) {\n smoothEnd = true;\n }\n }\n\n if (!(inertia || smoothEnd)) { return; }\n\n utils.copyCoords(status.upCoords, interaction.curCoords);\n\n interaction.pointers[0] = status.startEvent =\n new InteractEvent(interaction, event, interaction.prepared.name, 'inertiastart', interaction.element);\n\n status.t0 = now;\n\n status.active = true;\n status.allowResume = inertiaOptions.allowResume;\n interaction.simulation = status;\n\n target.fire(status.startEvent);\n\n if (inertia) {\n status.vx0 = interaction.pointerDelta.client.vx;\n status.vy0 = interaction.pointerDelta.client.vy;\n status.v0 = pointerSpeed;\n\n calcInertia(interaction, status);\n\n utils.extend(page, interaction.curCoords.page);\n\n page.x += status.xe;\n page.y += status.ye;\n\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n status.modifiedXe += modifierResult.dx;\n status.modifiedYe += modifierResult.dy;\n\n status.i = animationFrame.request(interaction.boundInertiaFrame);\n }\n else {\n status.smoothEnd = true;\n status.xe = modifierResult.dx;\n status.ye = modifierResult.dy;\n\n status.sx = status.sy = 0;\n\n status.i = animationFrame.request(interaction.boundSmoothEndFrame);\n }\n});\n\nInteraction.signals.on('stop-active', function ({ interaction }) {\n const status = interaction.inertiaStatus;\n\n if (status.active) {\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n }\n});\n\nfunction calcInertia (interaction, status) {\n const inertiaOptions = interaction.target.options[interaction.prepared.name].inertia;\n const lambda = inertiaOptions.resistance;\n const inertiaDur = -Math.log(inertiaOptions.endSpeed / status.v0) / lambda;\n\n status.x0 = interaction.prevEvent.pageX;\n status.y0 = interaction.prevEvent.pageY;\n status.t0 = status.startEvent.timeStamp / 1000;\n status.sx = status.sy = 0;\n\n status.modifiedXe = status.xe = (status.vx0 - inertiaDur) / lambda;\n status.modifiedYe = status.ye = (status.vy0 - inertiaDur) / lambda;\n status.te = inertiaDur;\n\n status.lambda_v0 = lambda / status.v0;\n status.one_ve_v0 = 1 - inertiaOptions.endSpeed / status.v0;\n}\n\nfunction inertiaFrame () {\n updateInertiaCoords(this);\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n\n const status = this.inertiaStatus;\n const options = this.target.options[this.prepared.name].inertia;\n const lambda = options.resistance;\n const t = new Date().getTime() / 1000 - status.t0;\n\n if (t < status.te) {\n\n const progress = 1 - (Math.exp(-lambda * t) - status.lambda_v0) / status.one_ve_v0;\n\n if (status.modifiedXe === status.xe && status.modifiedYe === status.ye) {\n status.sx = status.xe * progress;\n status.sy = status.ye * progress;\n }\n else {\n const quadPoint = utils.getQuadraticCurvePoint(0, 0,\n status.xe,\n status.ye,\n status.modifiedXe,\n status.modifiedYe,\n progress);\n\n status.sx = quadPoint.x;\n status.sy = quadPoint.y;\n }\n\n this.doMove();\n\n status.i = animationFrame.request(this.boundInertiaFrame);\n }\n else {\n status.sx = status.modifiedXe;\n status.sy = status.modifiedYe;\n\n this.doMove();\n this.end(status.startEvent);\n status.active = false;\n this.simulation = null;\n }\n\n utils.copyCoords(this.prevCoords, this.curCoords);\n}\n\nfunction smoothEndFrame () {\n updateInertiaCoords(this);\n\n const status = this.inertiaStatus;\n const t = new Date().getTime() - status.t0;\n const duration = this.target.options[this.prepared.name].inertia.smoothEndDuration;\n\n if (t < duration) {\n status.sx = utils.easeOutQuad(t, 0, status.xe, duration);\n status.sy = utils.easeOutQuad(t, 0, status.ye, duration);\n\n this.pointerMove(status.startEvent, status.startEvent);\n\n status.i = animationFrame.request(this.boundSmoothEndFrame);\n }\n else {\n status.sx = status.xe;\n status.sy = status.ye;\n\n this.pointerMove(status.startEvent, status.startEvent);\n this.end(status.startEvent);\n\n status.smoothEnd =\n status.active = false;\n this.simulation = null;\n }\n}\n\nfunction updateInertiaCoords (interaction) {\n const status = interaction.inertiaStatus;\n\n // return if inertia isn't running\n if (!status.active) { return; }\n\n const pageUp = status.upCoords.page;\n const clientUp = status.upCoords.client;\n\n utils.setCoords(interaction.curCoords, [ {\n pageX : pageUp.x + status.sx,\n pageY : pageUp.y + status.sy,\n clientX: clientUp.x + status.sx,\n clientY: clientUp.y + status.sy,\n } ]);\n}\n","const browser = require('./utils/browser');\nconst events = require('./utils/events');\nconst utils = require('./utils');\nconst scope = require('./scope');\nconst Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\n\nconst globalEvents = {};\n\n/*\\\n * interact\n [ method ]\n *\n * The methods of this variable can be used to set elements as\n * interactables and also to change various default settings.\n *\n * Calling it as a function and passing an element or a valid CSS selector\n * string returns an Interactable object which has various methods to\n * configure it.\n *\n - element (Element | string) The HTML or SVG Element to interact with or CSS selector\n = (object) An @Interactable\n *\n > Usage\n | interact('#draggable').draggable(true);\n |\n | var rectables = interact('rect');\n | rectables\n | .gesturable(true)\n | .on('gesturemove', function (event) {\n | // ...\n | });\n\\*/\nfunction interact (element, options) {\n let interactable = scope.interactables.get(element, options);\n\n if (!interactable) {\n interactable = new Interactable(element, options);\n interactable.events.global = globalEvents;\n }\n\n return interactable;\n}\n\n/*\\\n * interact.isSet\n [ method ]\n *\n * Check if an element has been set\n - element (Element) The Element being searched for\n = (boolean) Indicates if the element or CSS selector was previously passed to interact\n\\*/\ninteract.isSet = function (element, options) {\n return scope.interactables.indexOfElement(element, options && options.context) !== -1;\n};\n\n/*\\\n * interact.on\n [ method ]\n *\n * Adds a global listener for an InteractEvent or adds a DOM event to\n * `document`\n *\n - type (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) interact\n\\*/\ninteract.on = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.on(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.on(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n // if it is an InteractEvent type, add listener to globalEvents\n if (utils.contains(Interactable.eventTypes, type)) {\n // if this type of event was never bound\n if (!globalEvents[type]) {\n globalEvents[type] = [listener];\n }\n else {\n globalEvents[type].push(listener);\n }\n }\n // If non InteractEvent type, addEventListener to document\n else {\n events.add(scope.document, type, listener, { options });\n }\n\n return interact;\n};\n\n/*\\\n * interact.off\n [ method ]\n *\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n - type (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) interact\n \\*/\ninteract.off = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.off(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.off(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n if (!utils.contains(Interactable.eventTypes, type)) {\n events.remove(scope.document, type, listener, options);\n }\n else {\n let index;\n\n if (type in globalEvents\n && (index = utils.indexOf(globalEvents[type], listener)) !== -1) {\n globalEvents[type].splice(index, 1);\n }\n }\n\n return interact;\n};\n\n/*\\\n * interact.debug\n [ method ]\n *\n * Returns an object which exposes internal data\n = (object) An object with properties that outline the current state and expose internal functions and variables\n\\*/\ninteract.debug = function () {\n return scope;\n};\n\n// expose the functions used to calculate multi-touch properties\ninteract.getPointerAverage = utils.pointerAverage;\ninteract.getTouchBBox = utils.touchBBox;\ninteract.getTouchDistance = utils.touchDistance;\ninteract.getTouchAngle = utils.touchAngle;\n\ninteract.getElementRect = utils.getElementRect;\ninteract.getElementClientRect = utils.getElementClientRect;\ninteract.matchesSelector = utils.matchesSelector;\ninteract.closest = utils.closest;\n\n/*\\\n * interact.supportsTouch\n [ method ]\n *\n = (boolean) Whether or not the browser supports touch input\n\\*/\ninteract.supportsTouch = function () {\n return browser.supportsTouch;\n};\n\n/*\\\n * interact.supportsPointerEvent\n [ method ]\n *\n = (boolean) Whether or not the browser supports PointerEvents\n\\*/\ninteract.supportsPointerEvent = function () {\n return browser.supportsPointerEvent;\n};\n\n/*\\\n * interact.stop\n [ method ]\n *\n * Cancels all interactions (end events are not fired)\n *\n - event (Event) An event on which to call preventDefault()\n = (object) interact\n\\*/\ninteract.stop = function (event) {\n for (let i = scope.interactions.length - 1; i >= 0; i--) {\n scope.interactions[i].stop(event);\n }\n\n return interact;\n};\n\n/*\\\n * interact.pointerMoveTolerance\n [ method ]\n * Returns or sets the distance the pointer must be moved before an action\n * sequence occurs. This also affects tolerance for tap events.\n *\n - newValue (number) #optional The movement from the start position must be greater than this value\n = (number | Interactable) The current setting or interact\n\\*/\ninteract.pointerMoveTolerance = function (newValue) {\n if (utils.is.number(newValue)) {\n Interaction.pointerMoveTolerance = newValue;\n\n return this;\n }\n\n return Interaction.pointerMoveTolerance;\n};\n\ninteract.addDocument = scope.addDocument;\ninteract.removeDocument = scope.removeDocument;\n\nscope.interact = interact;\n\nmodule.exports = interact;\n","const Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\nconst scope = require('./scope');\nconst is = require('./utils/is');\nconst events = require('./utils/events');\n\nconst { nodeContains, matchesSelector } = require('./utils/domUtils');\n\n/*\\\n * Interactable.preventDefault\n [ method ]\n *\n * Returns or sets whether to prevent the browser's default behaviour\n * in response to pointer events. Can be set to:\n * - `'always'` to always prevent\n * - `'never'` to never prevent\n * - `'auto'` to let interact.js try to determine what would be best\n *\n - newValue (string) #optional `true`, `false` or `'auto'`\n = (string | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.preventDefault = function (newValue) {\n if (/^(always|never|auto)$/.test(newValue)) {\n this.options.preventDefault = newValue;\n return this;\n }\n\n if (is.bool(newValue)) {\n this.options.preventDefault = newValue? 'always' : 'never';\n return this;\n }\n\n return this.options.preventDefault;\n};\n\nInteractable.prototype.checkAndPreventDefault = function (event) {\n const setting = this.options.preventDefault;\n\n if (setting === 'never') { return; }\n\n if (setting === 'always') {\n event.preventDefault();\n return;\n }\n\n // setting === 'auto'\n\n // don't preventDefault if the browser supports passiveEvents\n // CSS touch-action and user-selecct should be used instead\n if (events.supportsOptions) {\n return;\n }\n\n // don't preventDefault of pointerdown events\n if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) {\n return;\n }\n\n // don't preventDefault on editable elements\n if (is.element(event.target)\n && matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) {\n return;\n }\n\n event.preventDefault();\n};\n\nfunction onInteractionEvent ({ interaction, event }) {\n if (interaction.target) {\n interaction.target.checkAndPreventDefault(event);\n }\n}\n\nfor (const eventSignal of ['down', 'move', 'up', 'cancel']) {\n Interaction.signals.on(eventSignal, onInteractionEvent);\n}\n\n// prevent native HTML5 drag on interact.js target elements\nInteraction.docEvents.dragstart = function preventNativeDrag (event) {\n for (const interaction of scope.interactions) {\n\n if (interaction.element\n && (interaction.element === event.target\n || nodeContains(interaction.element, event.target))) {\n\n interaction.target.checkAndPreventDefault(event);\n return;\n }\n }\n};\n","const scope = require('./scope');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst iFinder = require('./utils/interactionFinder');\nconst pointerEvents = require('./pointerEvents/base');\n\nconst { window } = require('./utils/window');\n\nconst toString = Object.prototype.toString;\n\nif (!window.Array.isArray) {\n window.Array.isArray = function (obj) {\n return toString.call(obj) === '[object Array]';\n };\n}\n\nif (!String.prototype.trim) {\n String.prototype.trim = function () {\n return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n };\n}\n\n// http://www.quirksmode.org/dom/events/click.html\n// >Events leading to dblclick\n//\n// IE8 doesn't fire down event before dblclick.\n// This workaround tries to fire a tap and doubletap after dblclick\nfunction onIE8Dblclick (event) {\n const eventTarget = event.target;\n const interaction = iFinder.search(event, event.type, eventTarget);\n\n if (!interaction) { return; }\n\n if (interaction.prevTap\n && event.clientX === interaction.prevTap.clientX\n && event.clientY === interaction.prevTap.clientY\n && eventTarget === interaction.prevTap.target) {\n\n interaction.downTargets[0] = eventTarget;\n interaction.downTimes [0] = new Date().getTime();\n\n pointerEvents.fire({\n interaction,\n event,\n eventTarget,\n pointer: event,\n type: 'tap',\n });\n }\n}\n\nif (browser.isIE8) {\n const selectFix = function (event) {\n for (const interaction of scope.interactions) {\n if (interaction.interacting()) {\n interaction.target.checkAndPreventDefault(event);\n }\n }\n };\n\n const onDocIE8 = function onDocIE8 ({ doc, win }, signalName) {\n const eventMethod = signalName.indexOf('listen') === 0\n ? events.add : events.remove;\n\n // For IE's lack of Event#preventDefault\n eventMethod(doc, 'selectstart', selectFix);\n\n if (pointerEvents) {\n eventMethod(doc, 'dblclick', onIE8Dblclick);\n }\n };\n\n scope.signals.on('add-document' , onDocIE8);\n scope.signals.on('remove-document', onDocIE8);\n}\n\nmodule.exports = null;\n","const InteractEvent = require('../InteractEvent');\nconst Interaction = require('../Interaction');\nconst extend = require('../utils/extend');\n\nconst modifiers = {\n names: [],\n\n setOffsets: function (arg) {\n const { interaction, pageCoords: page } = arg;\n const { target, element, startOffset } = interaction;\n const rect = target.getRect(element);\n\n if (rect) {\n startOffset.left = page.x - rect.left;\n startOffset.top = page.y - rect.top;\n\n startOffset.right = rect.right - page.x;\n startOffset.bottom = rect.bottom - page.y;\n\n if (!('width' in rect)) { rect.width = rect.right - rect.left; }\n if (!('height' in rect)) { rect.height = rect.bottom - rect.top ; }\n }\n else {\n startOffset.left = startOffset.top = startOffset.right = startOffset.bottom = 0;\n }\n\n arg.rect = rect;\n arg.interactable = target;\n arg.element = element;\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n\n arg.options = target.options[interaction.prepared.name][modifierName];\n\n if (!arg.options) {\n continue;\n }\n\n interaction.modifierOffsets[modifierName] = modifiers[modifierName].setOffset(arg);\n }\n },\n\n setAll: function (arg) {\n const { interaction, statuses, preEnd, requireEndOnly } = arg;\n const coords = extend({}, arg.pageCoords);\n const result = {\n dx: 0,\n dy: 0,\n changed: false,\n locked: false,\n shouldMove: true,\n };\n\n for (const modifierName of modifiers.names) {\n const modifier = modifiers[modifierName];\n const options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!shouldDo(options, preEnd, requireEndOnly)) { continue; }\n\n arg.status = arg.status = statuses[modifierName];\n arg.options = options;\n arg.offset = arg.interaction.modifierOffsets[modifierName];\n\n modifier.set(arg);\n\n if (arg.status.locked) {\n coords.x += arg.status.dx;\n coords.y += arg.status.dy;\n\n result.dx += arg.status.dx;\n result.dy += arg.status.dy;\n\n result.locked = true;\n }\n }\n\n // a move should be fired if:\n // - there are no modifiers enabled,\n // - no modifiers are \"locked\" i.e. have changed the pointer's coordinates, or\n // - the locked coords have changed since the last pointer move\n result.shouldMove = !arg.status || !result.locked || arg.status.changed;\n\n return result;\n },\n\n resetStatuses: function (statuses) {\n for (const modifierName of modifiers.names) {\n const status = statuses[modifierName] || {};\n\n status.dx = status.dy = 0;\n status.modifiedX = status.modifiedY = NaN;\n status.locked = false;\n status.changed = true;\n\n statuses[modifierName] = status;\n }\n\n return statuses;\n },\n\n start: function ({ interaction }, signalName) {\n const arg = {\n interaction,\n pageCoords: (signalName === 'action-resume' ?\n interaction.curCoords : interaction.startCoords).page,\n startOffset: interaction.startOffset,\n statuses: interaction.modifierStatuses,\n preEnd: false,\n requireEndOnly: false,\n };\n\n modifiers.setOffsets(arg);\n modifiers.resetStatuses(arg.statuses);\n\n arg.pageCoords = extend({}, interaction.startCoords.page);\n interaction.modifierResult = modifiers.setAll(arg);\n },\n};\n\nInteraction.signals.on('new', function (interaction) {\n interaction.startOffset = { left: 0, right: 0, top: 0, bottom: 0 };\n interaction.modifierOffsets = {};\n interaction.modifierStatuses = modifiers.resetStatuses({});\n interaction.modifierResult = null;\n});\n\nInteraction.signals.on('action-start' , modifiers.start);\nInteraction.signals.on('action-resume', modifiers.start);\n\nInteraction.signals.on('before-action-move', function ({ interaction, preEnd, interactingBeforeMove }) {\n const modifierResult = modifiers.setAll({\n interaction,\n preEnd,\n pageCoords: interaction.curCoords.page,\n statuses: interaction.modifierStatuses,\n requireEndOnly: false,\n });\n\n // don't fire an action move if a modifier would keep the event in the same\n // cordinates as before\n if (!modifierResult.shouldMove && interactingBeforeMove) {\n interaction._dontFireMove = true;\n }\n\n interaction.modifierResult = modifierResult;\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n for (let i = 0; i < modifiers.names.length; i++) {\n const options = interaction.target.options[interaction.prepared.name][modifiers.names[i]];\n\n // if the endOnly option is true for any modifier\n if (shouldDo(options, true, true)) {\n // fire a move event at the modified coordinates\n interaction.doMove({ event, preEnd: true });\n break;\n }\n }\n});\n\nInteractEvent.signals.on('set-xy', function (arg) {\n const { iEvent, interaction } = arg;\n const modifierArg = extend({}, arg);\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n modifierArg.options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!modifierArg.options) {\n continue;\n }\n\n const modifier = modifiers[modifierName];\n\n modifierArg.status = interaction.modifierStatuses[modifierName];\n\n iEvent[modifierName] = modifier.modifyCoords(modifierArg);\n }\n});\n\nfunction shouldDo (options, preEnd, requireEndOnly) {\n return (options && options.enabled\n && (preEnd || !options.endOnly)\n && (!requireEndOnly || options.endOnly));\n}\n\nmodule.exports = modifiers;\n","const modifiers = require('./index');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst restrict = {\n defaults: {\n enabled : false,\n endOnly : false,\n restriction: null,\n elementRect: null,\n },\n\n setOffset: function ({ rect, startOffset, options }) {\n const elementRect = options && options.elementRect;\n const offset = {};\n\n if (rect && elementRect) {\n offset.left = startOffset.left - (rect.width * elementRect.left);\n offset.top = startOffset.top - (rect.height * elementRect.top);\n\n offset.right = startOffset.right - (rect.width * (1 - elementRect.right));\n offset.bottom = startOffset.bottom - (rect.height * (1 - elementRect.bottom));\n }\n else {\n offset.left = offset.top = offset.right = offset.bottom = 0;\n }\n\n return offset;\n },\n\n set: function ({ pageCoords, interaction, status, options }) {\n if (!options) { return status; }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n\n const restriction = getRestrictionRect(options.restriction, interaction, page);\n\n if (!restriction) { return status; }\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n const rect = restriction;\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n const offset = interaction.modifierOffsets.restrict;\n\n // object is assumed to have\n // x, y, width, height or\n // left, top, right, bottom\n if ('x' in restriction && 'y' in restriction) {\n modifiedX = Math.max(Math.min(rect.x + rect.width - offset.right , page.x), rect.x + offset.left);\n modifiedY = Math.max(Math.min(rect.y + rect.height - offset.bottom, page.y), rect.y + offset.top );\n }\n else {\n modifiedX = Math.max(Math.min(rect.right - offset.right , page.x), rect.left + offset.left);\n modifiedY = Math.max(Math.min(rect.bottom - offset.bottom, page.y), rect.top + offset.top );\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const elementRect = options && options.elementRect;\n\n if (options && options.enabled\n && !(phase === 'start' && elementRect && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n getRestrictionRect,\n};\n\nfunction getRestrictionRect (value, interaction, page) {\n if (utils.is.function(value)) {\n return utils.resolveRectLike(value, interaction.target, interaction.element, [page.x, page.y, interaction]);\n } else {\n return utils.resolveRectLike(value, interaction.target, interaction.element);\n }\n}\n\nmodifiers.restrict = restrict;\nmodifiers.names.push('restrict');\n\ndefaultOptions.perAction.restrict = restrict.defaults;\n\nmodule.exports = restrict;\n","// This module adds the options.resize.restrictEdges setting which sets min and\n// max for the top, left, bottom and right edges of the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictEdges: {\n// inner: { top: 200, left: 200, right: 400, bottom: 400 },\n// outer: { top: 0, left: 0, right: 600, bottom: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst { getRestrictionRect } = require('./restrict');\n\nconst noInner = { top: +Infinity, left: +Infinity, bottom: -Infinity, right: -Infinity };\nconst noOuter = { top: -Infinity, left: -Infinity, bottom: +Infinity, right: +Infinity };\n\nconst restrictEdges = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n offset: null,\n },\n\n setOffset: function ({ interaction, startOffset, options }) {\n if (!options) {\n return utils.extend({}, startOffset);\n }\n\n const offset = getRestrictionRect(options.offset, interaction, interaction.startCoords.page);\n\n if (offset) {\n return {\n top: startOffset.top + offset.y,\n left: startOffset.left + offset.x,\n bottom: startOffset.bottom + offset.y,\n right: startOffset.right + offset.x,\n };\n }\n\n return startOffset;\n },\n\n set: function ({ pageCoords, interaction, status, offset, options }) {\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n const inner = rectUtils.xywhToTlbr(getRestrictionRect(options.inner, interaction, page)) || noInner;\n const outer = rectUtils.xywhToTlbr(getRestrictionRect(options.outer, interaction, page)) || noOuter;\n\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n if (edges.top) {\n modifiedY = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top);\n }\n else if (edges.bottom) {\n modifiedY = Math.max(Math.min(outer.bottom - offset.bottom, page.y), inner.bottom - offset.bottom);\n }\n if (edges.left) {\n modifiedX = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left);\n }\n else if (edges.right) {\n modifiedX = Math.max(Math.min(outer.right - offset.right, page.x), inner.right - offset.right);\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n if (options && options.enabled\n && !(phase === 'start' && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n noInner,\n noOuter,\n getRestrictionRect,\n};\n\nmodifiers.restrictEdges = restrictEdges;\nmodifiers.names.push('restrictEdges');\n\ndefaultOptions.perAction.restrictEdges = restrictEdges.defaults;\nresize.defaults.restrictEdges = restrictEdges.defaults;\n\nmodule.exports = restrictEdges;\n","// This module adds the options.resize.restrictSize setting which sets min and\n// max width and height for the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictSize: {\n// min: { width: -600, height: -600 },\n// max: { width: 600, height: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst restrictEdges = require('./restrictEdges');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst noMin = { width: -Infinity, height: -Infinity };\nconst noMax = { width: +Infinity, height: +Infinity };\n\nconst restrictSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n },\n\n setOffset: function ({ interaction }) {\n return interaction.startOffset;\n },\n\n set: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const rect = rectUtils.xywhToTlbr(interaction.resizeRects.inverted);\n\n const minSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.min, interaction)) || noMin;\n const maxSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.max, interaction)) || noMax;\n\n arg.options = {\n enabled: options.enabled,\n endOnly: options.endOnly,\n inner: utils.extend({}, restrictEdges.noInner),\n outer: utils.extend({}, restrictEdges.noOuter),\n };\n\n if (edges.top) {\n arg.options.inner.top = rect.bottom - minSize.height;\n arg.options.outer.top = rect.bottom - maxSize.height;\n }\n else if (edges.bottom) {\n arg.options.inner.bottom = rect.top + minSize.height;\n arg.options.outer.bottom = rect.top + maxSize.height;\n }\n if (edges.left) {\n arg.options.inner.left = rect.right - minSize.width;\n arg.options.outer.left = rect.right - maxSize.width;\n }\n else if (edges.right) {\n arg.options.inner.right = rect.left + minSize.width;\n arg.options.outer.right = rect.left + maxSize.width;\n }\n\n restrictEdges.set(arg);\n },\n\n modifyCoords: restrictEdges.modifyCoords,\n};\n\nmodifiers.restrictSize = restrictSize;\nmodifiers.names.push('restrictSize');\n\ndefaultOptions.perAction.restrictSize = restrictSize.defaults;\nresize.defaults.restrictSize = restrictSize.defaults;\n\nmodule.exports = restrictSize;\n","const modifiers = require('./index');\nconst interact = require('../interact');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst snap = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n\n relativePoints: null,\n },\n\n setOffset: function ({ interaction, interactable, element, rect, startOffset, options }) {\n const offsets = [];\n const optionsOrigin = utils.rectToXY(utils.resolveRectLike(options.origin));\n const origin = optionsOrigin || utils.getOriginXY(interactable, element, interaction.prepared.name);\n options = options || interactable.options[interaction.prepared.name].snap || {};\n\n let snapOffset;\n\n if (options.offset === 'startCoords') {\n snapOffset = {\n x: interaction.startCoords.page.x - origin.x,\n y: interaction.startCoords.page.y - origin.y,\n };\n }\n else {\n const offsetRect = utils.resolveRectLike(options.offset, interactable, element, [interaction]);\n\n snapOffset = utils.rectToXY(offsetRect) || { x: 0, y: 0 };\n }\n\n if (rect && options.relativePoints && options.relativePoints.length) {\n for (const { x: relativeX, y: relativeY } of options.relativePoints) {\n offsets.push({\n x: startOffset.left - (rect.width * relativeX) + snapOffset.x,\n y: startOffset.top - (rect.height * relativeY) + snapOffset.y,\n });\n }\n }\n else {\n offsets.push(snapOffset);\n }\n\n return offsets;\n },\n\n set: function ({ interaction, pageCoords, status, options, offset: offsets }) {\n const targets = [];\n let target;\n let page;\n let i;\n\n if (status.useStatusXY) {\n page = { x: status.x, y: status.y };\n }\n else {\n const origin = utils.getOriginXY(interaction.target, interaction.element, interaction.prepared.name);\n\n page = utils.extend({}, pageCoords);\n\n page.x -= origin.x;\n page.y -= origin.y;\n }\n\n status.realX = page.x;\n status.realY = page.y;\n\n let len = options.targets? options.targets.length : 0;\n\n for (const { x: offsetX, y: offsetY } of offsets) {\n const relativeX = page.x - offsetX;\n const relativeY = page.y - offsetY;\n\n for (const snapTarget of options.targets) {\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n targets.push({\n x: utils.is.number(target.x) ? (target.x + offsetX) : relativeX,\n y: utils.is.number(target.y) ? (target.y + offsetY) : relativeY,\n\n range: utils.is.number(target.range)? target.range: options.range,\n });\n }\n }\n\n const closest = {\n target: null,\n inRange: false,\n distance: 0,\n range: 0,\n dx: 0,\n dy: 0,\n };\n\n for (i = 0, len = targets.length; i < len; i++) {\n target = targets[i];\n\n const range = target.range;\n const dx = target.x - page.x;\n const dy = target.y - page.y;\n const distance = utils.hypot(dx, dy);\n let inRange = distance <= range;\n\n // Infinite targets count as being out of range\n // compared to non infinite ones that are in range\n if (range === Infinity && closest.inRange && closest.range !== Infinity) {\n inRange = false;\n }\n\n if (!closest.target || (inRange\n // is the closest target in range?\n ? (closest.inRange && range !== Infinity\n // the pointer is relatively deeper in this target\n ? distance / range < closest.distance / closest.range\n // this target has Infinite range and the closest doesn't\n : (range === Infinity && closest.range !== Infinity)\n // OR this target is closer that the previous closest\n || distance < closest.distance)\n // The other is not in range and the pointer is closer to this target\n : (!closest.inRange && distance < closest.distance))) {\n\n closest.target = target;\n closest.distance = distance;\n closest.range = range;\n closest.inRange = inRange;\n closest.dx = dx;\n closest.dy = dy;\n\n status.range = range;\n }\n }\n\n let snapChanged;\n\n if (closest.target) {\n snapChanged = (status.modifiedX !== closest.target.x || status.modifiedY !== closest.target.y);\n\n status.modifiedX = closest.target.x;\n status.modifiedY = closest.target.y;\n }\n else {\n snapChanged = true;\n\n status.modifiedX = NaN;\n status.modifiedY = NaN;\n }\n\n status.dx = closest.dx;\n status.dy = closest.dy;\n\n status.changed = (snapChanged || (closest.inRange && !status.locked));\n status.locked = closest.inRange;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const relativePoints = options && options.relativePoints;\n\n if (options && options.enabled\n && !(phase === 'start' && relativePoints && relativePoints.length)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n }\n\n return {\n range : status.range,\n locked : status.locked,\n x : status.modifiedX,\n y : status.modifiedY,\n realX : status.realX,\n realY : status.realY,\n dx : status.dx,\n dy : status.dy,\n };\n }\n },\n};\n\ninteract.createSnapGrid = function (grid) {\n return function (x, y) {\n const limits = grid.limits || {\n left : -Infinity,\n right : Infinity,\n top : -Infinity,\n bottom: Infinity,\n };\n let offsetX = 0;\n let offsetY = 0;\n\n if (utils.is.object(grid.offset)) {\n offsetX = grid.offset.x;\n offsetY = grid.offset.y;\n }\n\n const gridx = Math.round((x - offsetX) / grid.x);\n const gridy = Math.round((y - offsetY) / grid.y);\n\n const newX = Math.max(limits.left, Math.min(limits.right , gridx * grid.x + offsetX));\n const newY = Math.max(limits.top , Math.min(limits.bottom, gridy * grid.y + offsetY));\n\n return {\n x: newX,\n y: newY,\n range: grid.range,\n };\n };\n};\n\nmodifiers.snap = snap;\nmodifiers.names.push('snap');\n\ndefaultOptions.perAction.snap = snap.defaults;\n\nmodule.exports = snap;\n","// This module allows snapping of the size of targets during resize\n// interactions.\n\nconst modifiers = require('./index');\nconst snap = require('./snap');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\nconst utils = require('../utils/');\n\nconst snapSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n },\n\n setOffset: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.edges;\n\n if (!edges) { return; }\n\n arg.options = {\n relativePoints: [{\n x: edges.left? 0 : 1,\n y: edges.top ? 0 : 1,\n }],\n origin: { x: 0, y: 0 },\n offset: 'self',\n range: options.range,\n };\n\n const offsets = snap.setOffset(arg);\n arg.options = options;\n\n return offsets;\n },\n\n set: function (arg) {\n const { interaction, options, offset, pageCoords } = arg;\n const page = utils.extend({}, pageCoords);\n const relativeX = page.x - offset[0].x;\n const relativeY = page.y - offset[0].y;\n\n arg.options = utils.extend({}, options);\n arg.options.targets = [];\n\n for (const snapTarget of options.targets) {\n let target;\n\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n if ('width' in target && 'height' in target) {\n target.x = target.width;\n target.y = target.height;\n }\n\n arg.options.targets.push(target);\n }\n\n snap.set(arg);\n },\n\n modifyCoords: function (arg) {\n const { options } = arg;\n\n arg.options = utils.extend({}, options);\n arg.options.enabled = options.enabled;\n arg.options.relativePoints = [null];\n\n snap.modifyCoords(arg);\n },\n};\n\nmodifiers.snapSize = snapSize;\nmodifiers.names.push('snapSize');\n\ndefaultOptions.perAction.snapSize = snapSize.defaults;\nresize.defaults.snapSize = snapSize.defaults;\n\nmodule.exports = snapSize;\n","const pointerUtils = require('../utils/pointerUtils');\n\nmodule.exports = class PointerEvent {\n constructor (type, pointer, event, eventTarget, interaction) {\n pointerUtils.pointerExtend(this, event);\n\n if (event !== pointer) {\n pointerUtils.pointerExtend(this, pointer);\n }\n\n this.interaction = interaction;\n\n this.timeStamp = new Date().getTime();\n this.originalEvent = event;\n this.type = type;\n this.pointerId = pointerUtils.getPointerId(pointer);\n this.pointerType = pointerUtils.getPointerType(pointer, interaction);\n this.target = eventTarget;\n this.currentTarget = null;\n\n if (type === 'tap') {\n const pointerIndex = interaction.getPointerIndex(pointer);\n this.dt = this.timeStamp - interaction.downTimes[pointerIndex];\n\n const interval = this.timeStamp - interaction.tapTime;\n\n this.double = !!(interaction.prevTap\n && interaction.prevTap.type !== 'doubletap'\n && interaction.prevTap.target === this.target\n && interval < 500);\n }\n else if (type === 'doubletap') {\n this.dt = pointer.timeStamp - interaction.tapTime;\n }\n }\n\n subtractOrigin ({ x: originX, y: originY }) {\n this.pageX -= originX;\n this.pageY -= originY;\n this.clientX -= originX;\n this.clientY -= originY;\n\n return this;\n }\n\n addOrigin ({ x: originX, y: originY }) {\n this.pageX += originX;\n this.pageY += originY;\n this.clientX += originX;\n this.clientY += originY;\n\n return this;\n }\n\n preventDefault () {\n this.originalEvent.preventDefault();\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n};\n","const PointerEvent = require('./PointerEvent');\nconst Interaction = require('../Interaction');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst defaults = require('../defaultOptions');\nconst signals = require('../utils/Signals').new();\nconst { filter } = require('../utils/arr');\n\nconst simpleSignals = [ 'down', 'up', 'cancel' ];\nconst simpleEvents = [ 'down', 'up', 'cancel' ];\n\nconst pointerEvents = {\n PointerEvent,\n fire,\n collectEventTargets,\n signals,\n defaults: {\n holdDuration: 600,\n ignoreFrom : null,\n allowFrom : null,\n origin : { x: 0, y: 0 },\n },\n types: [\n 'down',\n 'move',\n 'up',\n 'cancel',\n 'tap',\n 'doubletap',\n 'hold',\n ],\n};\n\nfunction fire (arg) {\n const {\n interaction, pointer, event, eventTarget,\n type = arg.pointerEvent.type,\n targets = collectEventTargets(arg),\n pointerEvent = new PointerEvent(type, pointer, event, eventTarget, interaction),\n } = arg;\n\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n targets,\n type,\n pointerEvent,\n };\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n\n for (const prop in target.props || {}) {\n pointerEvent[prop] = target.props[prop];\n }\n\n const origin = utils.getOriginXY(target.eventable, target.element);\n\n pointerEvent.subtractOrigin(origin);\n pointerEvent.eventable = target.eventable;\n pointerEvent.currentTarget = target.element;\n\n target.eventable.fire(pointerEvent);\n\n pointerEvent.addOrigin(origin);\n\n if (pointerEvent.immediatePropagationStopped\n || (pointerEvent.propagationStopped\n && (i + 1) < targets.length && targets[i + 1].element !== pointerEvent.currentTarget)) {\n break;\n }\n }\n\n signals.fire('fired', signalArg);\n\n if (type === 'tap') {\n // if pointerEvent should make a double tap, create and fire a doubletap\n // PointerEvent and use that as the prevTap\n const prevTap = pointerEvent.double\n ? fire({\n interaction, pointer, event, eventTarget,\n type: 'doubletap',\n })\n : pointerEvent;\n\n interaction.prevTap = prevTap;\n interaction.tapTime = prevTap.timeStamp;\n }\n\n return pointerEvent;\n}\n\nfunction collectEventTargets ({ interaction, pointer, event, eventTarget, type }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n // do not fire a tap event if the pointer was moved before being lifted\n if (type === 'tap' && (interaction.pointerWasMoved\n // or if the pointerup target is different to the pointerdown target\n || !(interaction.downTargets[pointerIndex] && interaction.downTargets[pointerIndex] === eventTarget))) {\n return [];\n }\n\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n path,\n targets: [],\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (type === 'hold') {\n signalArg.targets = filter(signalArg.targets, target =>\n target.eventable.options.holdDuration === interaction.holdTimers[pointerIndex].duration);\n }\n\n return signalArg.targets;\n}\n\nInteraction.signals.on('update-pointer-down', function ({ interaction, pointerIndex }) {\n interaction.holdTimers[pointerIndex] = { duration: Infinity, timeout: null };\n});\n\nInteraction.signals.on('remove-pointer', function ({ interaction, pointerIndex }) {\n interaction.holdTimers.splice(pointerIndex, 1);\n});\n\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget, duplicateMove }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n if (!duplicateMove && (!interaction.pointerIsDown || interaction.pointerWasMoved)) {\n if (interaction.pointerIsDown) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n\n fire({\n interaction, pointer, event, eventTarget,\n type: 'move',\n });\n }\n});\n\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget, pointerIndex }) {\n // copy event to be used in timeout for IE8\n const eventCopy = browser.isIE8? utils.extend({}, event) : event;\n\n const timer = interaction.holdTimers[pointerIndex];\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'hold',\n targets: [],\n path,\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (!signalArg.targets.length) { return; }\n\n let minDuration = Infinity;\n\n for (let i = 0; i < signalArg.targets.length; i++) {\n const target = signalArg.targets[i];\n const holdDuration = target.eventable.options.holdDuration;\n\n if (holdDuration < minDuration) {\n minDuration = holdDuration;\n }\n }\n\n timer.duration = minDuration;\n timer.timeout = setTimeout(function () {\n fire({\n interaction, eventCopy, eventTarget,\n pointer: browser.isIE8? eventCopy : pointer,\n type: 'hold',\n });\n }, minDuration);\n});\n\nInteraction.signals.on('up', ({ interaction, pointer, event, eventTarget }) => {\n if (!interaction.pointerWasMoved) {\n fire({ interaction, eventTarget, pointer, event, type: 'tap' });\n }\n});\n\n['up', 'cancel'].forEach(function (signalName) {\n Interaction.signals.on(signalName, function ({ interaction, pointerIndex }) {\n if (interaction.holdTimers[pointerIndex]) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n });\n});\n\nfunction createSignalListener (type) {\n return function ({ interaction, pointer, event, eventTarget }) {\n fire({ interaction, eventTarget, pointer, event, type });\n };\n}\n\nfor (let i = 0; i < simpleSignals.length; i++) {\n Interaction.signals.on(simpleSignals[i], createSignalListener(simpleEvents[i]));\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.prevTap = null; // the most recent tap event on this interaction\n interaction.tapTime = 0; // time of the most recent tap event\n interaction.holdTimers = []; // [{ duration, timeout }]\n});\n\ndefaults.pointerEvents = pointerEvents.defaults;\nmodule.exports = pointerEvents;\n","const pointerEvents = require('./base');\nconst Interaction = require('../Interaction');\n\npointerEvents.signals.on('new', onNew);\npointerEvents.signals.on('fired', onFired);\n\nfor (const signal of ['move', 'up', 'cancel', 'endall']) {\n Interaction.signals.on(signal, endHoldRepeat);\n}\n\nfunction onNew ({ pointerEvent }) {\n if (pointerEvent.type !== 'hold') { return; }\n\n pointerEvent.count = (pointerEvent.count || 0) + 1;\n}\n\nfunction onFired ({ interaction, pointerEvent, eventTarget, targets }) {\n if (pointerEvent.type !== 'hold' || !targets.length) { return; }\n\n // get the repeat interval from the first eventable\n const interval = targets[0].eventable.options.holdRepeatInterval;\n\n // don't repeat if the interval is 0 or less\n if (interval <= 0) { return; }\n\n // set a timeout to fire the holdrepeat event\n interaction.holdIntervalHandle = setTimeout(function () {\n pointerEvents.fire({\n interaction,\n eventTarget,\n type: 'hold',\n pointer: pointerEvent,\n event: pointerEvent,\n });\n }, interval);\n}\n\nfunction endHoldRepeat ({ interaction }) {\n // set the interaction's holdStopTime property\n // to stop further holdRepeat events\n if (interaction.holdIntervalHandle) {\n clearInterval(interaction.holdIntervalHandle);\n interaction.holdIntervalHandle = null;\n }\n}\n\n// don't repeat by default\npointerEvents.defaults.holdRepeatInterval = 0;\npointerEvents.types.push('holdrepeat');\n\nmodule.exports = {\n onNew,\n onFired,\n endHoldRepeat,\n};\n","const pointerEvents = require('./base');\nconst Interactable = require('../Interactable');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\nconst scope = require('../scope');\nconst extend = require('../utils/extend');\nconst { merge } = require('../utils/arr');\n\npointerEvents.signals.on('collect-targets', function ({ targets, element, type, eventTarget }) {\n function collectSelectors (interactable, selector, context) {\n const els = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && is.element(element)\n && domUtils.matchesSelector(element, selector, els)\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n const interactable = scope.interactables.get(element);\n\n if (interactable) {\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n scope.interactables.forEachSelector(collectSelectors, element);\n});\n\nInteractable.signals.on('new', function ({ interactable }) {\n interactable.events.getRect = function (element) {\n return interactable.getRect(element);\n };\n});\n\nInteractable.signals.on('set', function ({ interactable, options }) {\n extend(interactable.events.options, pointerEvents.defaults);\n extend(interactable.events.options, options);\n});\n\nmerge(Interactable.eventTypes, pointerEvents.types);\n\nInteractable.prototype.pointerEvents = function (options) {\n extend(this.events.options, options);\n\n return this;\n};\n\nconst __backCompatOption = Interactable.prototype._backCompatOption;\n\nInteractable.prototype._backCompatOption = function (optionName, newValue) {\n const ret = __backCompatOption.call(this, optionName, newValue);\n\n if (ret === this) {\n this.events.options[optionName] = newValue;\n }\n\n return ret;\n};\n\nInteractable.settingsMethods.push('pointerEvents');\n","const utils = require('./utils');\nconst events = require('./utils/events');\nconst signals = require('./utils/Signals').new();\n\nconst scope = {\n signals,\n events,\n utils,\n\n // main document\n document: require('./utils/domObjects').document,\n // all documents being listened to\n documents: [],\n\n addDocument: function (doc, win) {\n // do nothing if document is already known\n if (utils.contains(scope.documents, doc)) { return false; }\n\n win = win || scope.getWindow(doc);\n\n scope.documents.push(doc);\n events.documents.push(doc);\n\n // don't add an unload event for the main document\n // so that the page may be cached in browser history\n if (doc !== scope.document) {\n events.add(win, 'unload', scope.onWindowUnload);\n }\n\n signals.fire('add-document', { doc, win });\n },\n\n removeDocument: function (doc, win) {\n const index = utils.indexOf(scope.documents, doc);\n\n win = win || scope.getWindow(doc);\n\n events.remove(win, 'unload', scope.onWindowUnload);\n\n scope.documents.splice(index, 1);\n events.documents.splice(index, 1);\n\n signals.fire('remove-document', { win, doc });\n },\n\n onWindowUnload: function () {\n scope.removeDocument(this.document, this);\n },\n};\n\nmodule.exports = scope;\n","const { indexOf } = require('./arr');\n\nclass Signals {\n constructor () {\n this.listeners = {\n // signalName: [listeners],\n };\n }\n\n on (name, listener) {\n if (!this.listeners[name]) {\n this.listeners[name] = [listener];\n return;\n }\n\n this.listeners[name].push(listener);\n }\n\n off (name, listener) {\n if (!this.listeners[name]) { return; }\n\n const index = indexOf(this.listeners[name], listener);\n\n if (index !== -1) {\n this.listeners[name].splice(index, 1);\n }\n }\n\n fire (name, arg) {\n const targetListeners = this.listeners[name];\n\n if (!targetListeners) { return; }\n\n for (let i = 0; i < targetListeners.length; i++) {\n if (targetListeners[i](arg, name) === false) {\n return;\n }\n }\n }\n}\n\nSignals.new = function () {\n return new Signals();\n};\n\nmodule.exports = Signals;\n","function indexOf (array, target) {\n for (let i = 0, len = array.length; i < len; i++) {\n if (array[i] === target) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction contains (array, target) {\n return indexOf(array, target) !== -1;\n}\n\nfunction merge (target, source) {\n for (let i = 0; i < source.length; i++) {\n target.push(source[i]);\n }\n\n return target;\n}\n\nfunction filter (array, test) {\n const result = [];\n\n for (let i = 0; i < array.length; i++) {\n if (test(array[i])) {\n result.push(array[i]);\n }\n }\n\n return result;\n}\n\nmodule.exports = {\n indexOf,\n contains,\n merge,\n filter,\n};\n","const { window } = require('./window');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst Element = domObjects.Element;\nconst navigator = window.navigator;\n\nconst browser = {\n // Does the browser support touch input?\n supportsTouch: !!(('ontouchstart' in window) || is.function(window.DocumentTouch)\n && domObjects.document instanceof window.DocumentTouch),\n\n // Does the browser support PointerEvents\n supportsPointerEvent: !!domObjects.PointerEvent,\n\n isIE8: ('attachEvent' in window) && !('addEventListener' in window),\n\n // Opera Mobile must be handled differently\n isOperaMobile: (navigator.appName === 'Opera'\n && browser.supportsTouch\n && navigator.userAgent.match('Presto')),\n\n // scrolling doesn't change the result of getClientRects on iOS 7\n isIOS7: (/iP(hone|od|ad)/.test(navigator.platform)\n && /OS 7[^\\d]/.test(navigator.appVersion)),\n\n isIe9OrOlder: /MSIE (8|9)/.test(navigator.userAgent),\n\n // prefix matchesSelector\n prefixedMatchesSelector: 'matches' in Element.prototype\n ? 'matches': 'webkitMatchesSelector' in Element.prototype\n ? 'webkitMatchesSelector': 'mozMatchesSelector' in Element.prototype\n ? 'mozMatchesSelector': 'oMatchesSelector' in Element.prototype\n ? 'oMatchesSelector': 'msMatchesSelector',\n\n useMatchesSelectorPolyfill: false,\n\n pEventTypes: (domObjects.PointerEvent\n ? (domObjects.PointerEvent === window.MSPointerEvent\n ? {\n up: 'MSPointerUp',\n down: 'MSPointerDown',\n over: 'mouseover',\n out: 'mouseout',\n move: 'MSPointerMove',\n cancel: 'MSPointerCancel',\n }\n : {\n up: 'pointerup',\n down: 'pointerdown',\n over: 'pointerover',\n out: 'pointerout',\n move: 'pointermove',\n cancel: 'pointercancel',\n })\n : null),\n\n // because Webkit and Opera still use 'mousewheel' event type\n wheelEvent: 'onmousewheel' in domObjects.document? 'mousewheel': 'wheel',\n\n};\n\nbrowser.useMatchesSelectorPolyfill = !is.function(Element.prototype[browser.prefixedMatchesSelector]);\n\nmodule.exports = browser;\n","const domObjects = {};\nconst win = require('./window').window;\n\nfunction blank () {}\n\ndomObjects.document = win.document;\ndomObjects.DocumentFragment = win.DocumentFragment || blank;\ndomObjects.SVGElement = win.SVGElement || blank;\ndomObjects.SVGSVGElement = win.SVGSVGElement || blank;\ndomObjects.SVGElementInstance = win.SVGElementInstance || blank;\ndomObjects.Element = win.Element || blank;\ndomObjects.HTMLElement = win.HTMLElement || domObjects.Element;\n\ndomObjects.Event = win.Event;\ndomObjects.Touch = win.Touch || blank;\ndomObjects.PointerEvent = (win.PointerEvent || win.MSPointerEvent);\n\nmodule.exports = domObjects;\n","const win = require('./window');\nconst browser = require('./browser');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst domUtils = {\n nodeContains: function (parent, child) {\n while (child) {\n if (child === parent) {\n return true;\n }\n\n child = child.parentNode;\n }\n\n return false;\n },\n\n closest: function (element, selector) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) { return element; }\n\n element = domUtils.parentNode(element);\n }\n\n return null;\n },\n\n parentNode: function (node) {\n let parent = node.parentNode;\n\n if (is.docFrag(parent)) {\n // skip past #shado-root fragments\n while ((parent = parent.host) && is.docFrag(parent)) {\n continue;\n }\n\n return parent;\n }\n\n return parent;\n },\n\n // taken from http://tanalin.com/en/blog/2012/12/matches-selector-ie8/ and modified\n matchesSelectorPolyfill: browser.useMatchesSelectorPolyfill\n ? function (element, selector, elems) {\n elems = elems || element.parentNode.querySelectorAll(selector);\n\n for (let i = 0, len = elems.length; i < len; i++) {\n if (elems[i] === element) {\n return true;\n }\n }\n\n return false;\n }\n : null,\n\n matchesSelector: function (element, selector, nodeList) {\n if (browser.useMatchesSelectorPolyfill) {\n return domUtils.matchesSelectorPolyfill(element, selector, nodeList);\n }\n\n // remove /deep/ from selectors if shadowDOM polyfill is used\n if (win.window !== win.realWindow) {\n selector = selector.replace(/\\/deep\\//g, ' ');\n }\n\n return element[browser.prefixedMatchesSelector](selector);\n },\n\n // Test for the element that's \"above\" all other qualifiers\n indexOfDeepestElement: function (elements) {\n let deepestZoneParents = [];\n let dropzoneParents = [];\n let dropzone;\n let deepestZone = elements[0];\n let index = deepestZone? 0: -1;\n let parent;\n let child;\n let i;\n let n;\n\n for (i = 1; i < elements.length; i++) {\n dropzone = elements[i];\n\n // an element might belong to multiple selector dropzones\n if (!dropzone || dropzone === deepestZone) {\n continue;\n }\n\n if (!deepestZone) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n // check if the deepest or current are document.documentElement or document.rootElement\n // - if the current dropzone is, do nothing and continue\n if (dropzone.parentNode === dropzone.ownerDocument) {\n continue;\n }\n // - if deepest is, update with the current dropzone and continue to next\n else if (deepestZone.parentNode === dropzone.ownerDocument) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n if (!deepestZoneParents.length) {\n parent = deepestZone;\n while (parent.parentNode && parent.parentNode !== parent.ownerDocument) {\n deepestZoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n }\n\n // if this element is an svg element and the current deepest is\n // an HTMLElement\n if (deepestZone instanceof domObjects.HTMLElement\n && dropzone instanceof domObjects.SVGElement\n && !(dropzone instanceof domObjects.SVGSVGElement)) {\n\n if (dropzone === deepestZone.parentNode) {\n continue;\n }\n\n parent = dropzone.ownerSVGElement;\n }\n else {\n parent = dropzone;\n }\n\n dropzoneParents = [];\n\n while (parent.parentNode !== parent.ownerDocument) {\n dropzoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n\n n = 0;\n\n // get (position of last common ancestor) + 1\n while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) {\n n++;\n }\n\n const parents = [\n dropzoneParents[n - 1],\n dropzoneParents[n],\n deepestZoneParents[n],\n ];\n\n child = parents[0].lastChild;\n\n while (child) {\n if (child === parents[1]) {\n deepestZone = dropzone;\n index = i;\n deepestZoneParents = [];\n\n break;\n }\n else if (child === parents[2]) {\n break;\n }\n\n child = child.previousSibling;\n }\n }\n\n return index;\n },\n\n matchesUpTo: function (element, selector, limit) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) {\n return true;\n }\n\n element = domUtils.parentNode(element);\n\n if (element === limit) {\n return domUtils.matchesSelector(element, selector);\n }\n }\n\n return false;\n },\n\n getActualElement: function (element) {\n return (element instanceof domObjects.SVGElementInstance\n ? element.correspondingUseElement\n : element);\n },\n\n getScrollXY: function (relevantWindow) {\n relevantWindow = relevantWindow || win.window;\n return {\n x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft,\n y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop,\n };\n },\n\n getElementClientRect: function (element) {\n const clientRect = (element instanceof domObjects.SVGElement\n ? element.getBoundingClientRect()\n : element.getClientRects()[0]);\n\n return clientRect && {\n left : clientRect.left,\n right : clientRect.right,\n top : clientRect.top,\n bottom: clientRect.bottom,\n width : clientRect.width || clientRect.right - clientRect.left,\n height: clientRect.height || clientRect.bottom - clientRect.top,\n };\n },\n\n getElementRect: function (element) {\n const clientRect = domUtils.getElementClientRect(element);\n\n if (!browser.isIOS7 && clientRect) {\n const scroll = domUtils.getScrollXY(win.getWindow(element));\n\n clientRect.left += scroll.x;\n clientRect.right += scroll.x;\n clientRect.top += scroll.y;\n clientRect.bottom += scroll.y;\n }\n\n return clientRect;\n },\n\n getPath: function (element) {\n const path = [];\n\n while (element) {\n path.push(element);\n element = domUtils.parentNode(element);\n }\n\n return path;\n },\n\n trySelector: value => {\n if (!is.string(value)) { return false; }\n\n // an exception will be raised if it is invalid\n domObjects.document.querySelector(value);\n return true;\n },\n};\n\nmodule.exports = domUtils;\n","const is = require('./is');\nconst domUtils = require('./domUtils');\nconst pExtend = require('./pointerExtend');\n\nconst { window, getWindow } = require('./window');\nconst { indexOf, contains } = require('./arr');\n\nconst useAttachEvent = ('attachEvent' in window) && !('addEventListener' in window);\nconst addEvent = useAttachEvent? 'attachEvent': 'addEventListener';\nconst removeEvent = useAttachEvent? 'detachEvent': 'removeEventListener';\nconst on = useAttachEvent? 'on': '';\n\nconst elements = [];\nconst targets = [];\nconst attachedListeners = [];\n\n// {\n// type: {\n// selectors: ['selector', ...],\n// contexts : [document, ...],\n// listeners: [[listener, capture, passive], ...]\n// }\n// }\nconst delegatedEvents = {};\n\nconst documents = [];\n\nconst supportsOptions = !useAttachEvent && (() => {\n let supported = false;\n\n window.document.createElement('div').addEventListener('test', null, {\n get capture () { supported = true; },\n });\n\n return supported;\n})();\n\nfunction add (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n let elementIndex = indexOf(elements, element);\n let target = targets[elementIndex];\n\n if (!target) {\n target = {\n events: {},\n typeCount: 0,\n };\n\n elementIndex = elements.push(element) - 1;\n targets.push(target);\n\n attachedListeners.push(useAttachEvent\n ? {\n supplied: [],\n wrapped : [],\n useCount: [],\n }\n : null);\n }\n\n if (!target.events[type]) {\n target.events[type] = [];\n target.typeCount++;\n }\n\n if (!contains(target.events[type], listener)) {\n let ret;\n\n if (useAttachEvent) {\n const { supplied, wrapped, useCount } = attachedListeners[elementIndex];\n const listenerIndex = indexOf(supplied, listener);\n\n const wrappedListener = wrapped[listenerIndex] || function (event) {\n if (!event.immediatePropagationStopped) {\n event.target = event.srcElement;\n event.currentTarget = element;\n\n event.preventDefault = event.preventDefault || preventDef;\n event.stopPropagation = event.stopPropagation || stopProp;\n event.stopImmediatePropagation = event.stopImmediatePropagation || stopImmProp;\n\n if (/mouse|click/.test(event.type)) {\n event.pageX = event.clientX + getWindow(element).document.documentElement.scrollLeft;\n event.pageY = event.clientY + getWindow(element).document.documentElement.scrollTop;\n }\n\n listener(event);\n }\n };\n\n ret = element[addEvent](on + type, wrappedListener, !!options.capture);\n\n if (listenerIndex === -1) {\n supplied.push(listener);\n wrapped.push(wrappedListener);\n useCount.push(1);\n }\n else {\n useCount[listenerIndex]++;\n }\n }\n else {\n ret = element[addEvent](type, listener, supportsOptions? options : !!options.capture);\n }\n target.events[type].push(listener);\n\n return ret;\n }\n}\n\nfunction remove (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const elementIndex = indexOf(elements, element);\n const target = targets[elementIndex];\n\n if (!target || !target.events) {\n return;\n }\n\n let wrappedListener = listener;\n let listeners;\n let listenerIndex;\n\n if (useAttachEvent) {\n listeners = attachedListeners[elementIndex];\n listenerIndex = indexOf(listeners.supplied, listener);\n wrappedListener = listeners.wrapped[listenerIndex];\n }\n\n if (type === 'all') {\n for (type in target.events) {\n if (target.events.hasOwnProperty(type)) {\n remove(element, type, 'all');\n }\n }\n return;\n }\n\n if (target.events[type]) {\n const len = target.events[type].length;\n\n if (listener === 'all') {\n for (let i = 0; i < len; i++) {\n remove(element, type, target.events[type][i], options);\n }\n return;\n }\n else {\n for (let i = 0; i < len; i++) {\n if (target.events[type][i] === listener) {\n element[removeEvent](on + type, wrappedListener, supportsOptions? options : !!options.capture);\n target.events[type].splice(i, 1);\n\n if (useAttachEvent && listeners) {\n listeners.useCount[listenerIndex]--;\n if (listeners.useCount[listenerIndex] === 0) {\n listeners.supplied.splice(listenerIndex, 1);\n listeners.wrapped.splice(listenerIndex, 1);\n listeners.useCount.splice(listenerIndex, 1);\n }\n }\n\n break;\n }\n }\n }\n\n if (target.events[type] && target.events[type].length === 0) {\n target.events[type] = null;\n target.typeCount--;\n }\n }\n\n if (!target.typeCount) {\n targets.splice(elementIndex, 1);\n elements.splice(elementIndex, 1);\n attachedListeners.splice(elementIndex, 1);\n }\n}\n\nfunction addDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n if (!delegatedEvents[type]) {\n delegatedEvents[type] = {\n selectors: [],\n contexts : [],\n listeners: [],\n };\n\n // add delegate listener functions\n for (let i = 0; i < documents.length; i++) {\n add(documents[i], type, delegateListener);\n add(documents[i], type, delegateUseCapture, true);\n }\n }\n\n const delegated = delegatedEvents[type];\n let index;\n\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n break;\n }\n }\n\n if (index === -1) {\n index = delegated.selectors.length;\n\n delegated.selectors.push(selector);\n delegated.contexts .push(context);\n delegated.listeners.push([]);\n }\n\n // keep listener and capture and passive flags\n delegated.listeners[index].push([listener, !!options.capture, options.passive]);\n}\n\nfunction removeDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const delegated = delegatedEvents[type];\n let matchFound = false;\n let index;\n\n if (!delegated) { return; }\n\n // count from last index of delegated to 0\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n // look for matching selector and context Node\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n\n const listeners = delegated.listeners[index];\n\n // each item of the listeners array is an array: [function, capture, passive]\n for (let i = listeners.length - 1; i >= 0; i--) {\n const [fn, capture, passive] = listeners[i];\n\n // check if the listener functions and capture and passive flags match\n if (fn === listener && capture === !!options.capture && passive === options.passive) {\n // remove the listener from the array of listeners\n listeners.splice(i, 1);\n\n // if all listeners for this interactable have been removed\n // remove the interactable from the delegated arrays\n if (!listeners.length) {\n delegated.selectors.splice(index, 1);\n delegated.contexts .splice(index, 1);\n delegated.listeners.splice(index, 1);\n\n // remove delegate function from context\n remove(context, type, delegateListener);\n remove(context, type, delegateUseCapture, true);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegatedEvents[type] = null;\n }\n }\n\n // only remove one listener\n matchFound = true;\n break;\n }\n }\n\n if (matchFound) { break; }\n }\n }\n}\n\n// bound to the interactable context when a DOM event\n// listener is added to a selector interactable\nfunction delegateListener (event, optionalArg) {\n const options = getOptions(optionalArg);\n const fakeEvent = {};\n const delegated = delegatedEvents[event.type];\n const eventTarget = (domUtils.getActualElement(event.path\n ? event.path[0]\n : event.target));\n let element = eventTarget;\n\n // duplicate the event so that currentTarget can be changed\n pExtend(fakeEvent, event);\n\n fakeEvent.originalEvent = event;\n fakeEvent.preventDefault = preventOriginalDefault;\n\n // climb up document tree looking for selector matches\n while (is.element(element)) {\n for (let i = 0; i < delegated.selectors.length; i++) {\n const selector = delegated.selectors[i];\n const context = delegated.contexts[i];\n\n if (domUtils.matchesSelector(element, selector)\n && domUtils.nodeContains(context, eventTarget)\n && domUtils.nodeContains(context, element)) {\n\n const listeners = delegated.listeners[i];\n\n fakeEvent.currentTarget = element;\n\n for (let j = 0; j < listeners.length; j++) {\n const [fn, capture, passive] = listeners[j];\n\n if (capture === !!options.capture && passive === options.passive) {\n fn(fakeEvent);\n }\n }\n }\n }\n\n element = domUtils.parentNode(element);\n }\n}\n\nfunction delegateUseCapture (event) {\n return delegateListener.call(this, event, true);\n}\n\nfunction preventDef () {\n this.returnValue = false;\n}\n\nfunction preventOriginalDefault () {\n this.originalEvent.preventDefault();\n}\n\nfunction stopProp () {\n this.cancelBubble = true;\n}\n\nfunction stopImmProp () {\n this.cancelBubble = true;\n this.immediatePropagationStopped = true;\n}\n\nfunction getOptions (param) {\n return is.object(param)? param : { capture: param };\n}\n\nmodule.exports = {\n add,\n remove,\n\n addDelegate,\n removeDelegate,\n\n delegateListener,\n delegateUseCapture,\n delegatedEvents,\n documents,\n\n useAttachEvent,\n supportsOptions,\n\n _elements: elements,\n _targets: targets,\n _attachedListeners: attachedListeners,\n};\n","module.exports = function extend (dest, source) {\n for (const prop in source) {\n dest[prop] = source[prop];\n }\n return dest;\n};\n","const {\n resolveRectLike,\n rectToXY,\n} = require('./rect');\n\nmodule.exports = function (target, element, action) {\n const actionOptions = target.options[action];\n const actionOrigin = actionOptions && actionOptions.origin;\n const origin = actionOrigin || target.options.origin;\n\n const originRect = resolveRectLike(origin, target, element, [target && element]);\n\n return rectToXY(originRect) || { x: 0, y: 0 };\n};\n","module.exports = (x, y) => Math.sqrt(x * x + y * y);\n","const extend = require('./extend');\nconst win = require('./window');\n\nconst utils = {\n warnOnce: function (method, message) {\n let warned = false;\n\n return function () {\n if (!warned) {\n win.window.console.warn(message);\n warned = true;\n }\n\n return method.apply(this, arguments);\n };\n },\n\n // http://stackoverflow.com/a/5634528/2280888\n _getQBezierValue: function (t, p1, p2, p3) {\n const iT = 1 - t;\n return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3;\n },\n\n getQuadraticCurvePoint: function (startX, startY, cpX, cpY, endX, endY, position) {\n return {\n x: utils._getQBezierValue(position, startX, cpX, endX),\n y: utils._getQBezierValue(position, startY, cpY, endY),\n };\n },\n\n // http://gizma.com/easing/\n easeOutQuad: function (t, b, c, d) {\n t /= d;\n return -c * t*(t-2) + b;\n },\n\n copyAction: function (dest, src) {\n dest.name = src.name;\n dest.axis = src.axis;\n dest.edges = src.edges;\n\n return dest;\n },\n\n is : require('./is'),\n extend : extend,\n hypot : require('./hypot'),\n getOriginXY: require('./getOriginXY'),\n};\n\nextend(utils, require('./arr'));\nextend(utils, require('./domUtils'));\nextend(utils, require('./pointerUtils'));\nextend(utils, require('./rect'));\n\nmodule.exports = utils;\n","const scope = require('../scope');\nconst utils = require('./index');\nconst browser = require('./browser');\n\nconst finder = {\n methodOrder: [ 'simulationResume', 'mouse', 'hasPointer', 'idle' ],\n\n search: function (pointer, eventType, eventTarget) {\n const mouseEvent = (/mouse/i.test(pointer.pointerType || eventType)\n // MSPointerEvent.MSPOINTER_TYPE_MOUSE\n || pointer.pointerType === 4);\n const pointerId = utils.getPointerId(pointer);\n const details = { pointer, pointerId, mouseEvent, eventType, eventTarget };\n\n for (const method of finder.methodOrder) {\n const interaction = finder[method](details);\n\n if (interaction) {\n return interaction;\n }\n }\n },\n\n // try to resume simulation with a new pointer\n simulationResume: function ({ mouseEvent, eventType, eventTarget }) {\n if (!/down|start/i.test(eventType)) {\n return null;\n }\n\n for (const interaction of scope.interactions) {\n let element = eventTarget;\n\n if (interaction.simulation && interaction.simulation.allowResume\n && (interaction.mouse === mouseEvent)) {\n while (element) {\n // if the element is the interaction element\n if (element === interaction.element) {\n return interaction;\n }\n element = utils.parentNode(element);\n }\n }\n }\n\n return null;\n },\n\n // if it's a mouse interaction\n mouse: function ({ pointerId, mouseEvent, eventType }) {\n if (!mouseEvent && (browser.supportsTouch || browser.supportsPointerEvent)) {\n return null;\n }\n\n let firstNonActive;\n\n for (const interaction of scope.interactions) {\n if (interaction.mouse) {\n // if it's a down event, skip interactions with running simulations\n if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; }\n\n // if the interaction is active, return it immediately\n if (interaction.interacting()) {\n return interaction;\n }\n // otherwise save it and look for another active interaction\n else if (!firstNonActive) {\n firstNonActive = interaction;\n }\n }\n }\n\n // if no active mouse interaction was found use the first inactive mouse\n // interaction\n if (firstNonActive) {\n return firstNonActive;\n }\n\n // Find any interaction specifically for mouse.\n // ignore the interaction if the eventType is a mousedown, and a simulation\n // is active\n for (const interaction of scope.interactions) {\n if (interaction.mouse && !(/down/.test(eventType) && interaction.simulation)) {\n return interaction;\n }\n }\n\n return null;\n },\n\n // get interaction that has this pointer\n hasPointer: function ({ pointerId }) {\n for (const interaction of scope.interactions) {\n if (utils.contains(interaction.pointerIds, pointerId)) {\n return interaction;\n }\n }\n },\n\n // get first idle interaction\n idle: function ({ mouseEvent }) {\n for (const interaction of scope.interactions) {\n // if there's already a pointer held down\n if (interaction.pointerIds.length === 1) {\n const target = interaction.target;\n // don't add this pointer if there is a target interactable and it\n // isn't gesturable\n if (target && !target.options.gesture.enabled) {\n continue;\n }\n }\n // maximum of 2 pointers per interaction\n else if (interaction.pointerIds.length >= 2) {\n continue;\n }\n\n if (!interaction.interacting() && (mouseEvent === interaction.mouse)) {\n return interaction;\n }\n }\n\n return null;\n },\n};\n\nmodule.exports = finder;\n","const win = require('./window');\nconst isWindow = require('./isWindow');\n\nconst is = {\n array : () => {},\n\n window : thing => thing === win.window || isWindow(thing),\n\n docFrag : thing => is.object(thing) && thing.nodeType === 11,\n\n object : thing => !!thing && (typeof thing === 'object'),\n\n function: thing => typeof thing === 'function',\n\n number : thing => typeof thing === 'number' ,\n\n bool : thing => typeof thing === 'boolean' ,\n\n string : thing => typeof thing === 'string' ,\n\n element: thing => {\n if (!thing || (typeof thing !== 'object')) { return false; }\n\n const _window = win.getWindow(thing) || win.window;\n\n return (/object|function/.test(typeof _window.Element)\n ? thing instanceof _window.Element //DOM2\n : thing.nodeType === 1 && typeof thing.nodeName === 'string');\n },\n};\n\nis.array = thing => (is.object(thing)\n && (typeof thing.length !== 'undefined')\n && is.function(thing.splice));\n\nmodule.exports = is;\n","module.exports = (thing) => !!(thing && thing.Window) && (thing instanceof thing.Window);\n","function pointerExtend (dest, source) {\n for (const prop in source) {\n const prefixedPropREs = module.exports.prefixedPropREs;\n let deprecated = false;\n\n // skip deprecated prefixed properties\n for (const vendor in prefixedPropREs) {\n if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) {\n deprecated = true;\n break;\n }\n }\n\n if (!deprecated && typeof source[prop] !== 'function') {\n dest[prop] = source[prop];\n }\n }\n return dest;\n}\n\npointerExtend.prefixedPropREs = {\n webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/,\n};\n\nmodule.exports = pointerExtend;\n","const hypot = require('./hypot');\nconst browser = require('./browser');\nconst dom = require('./domObjects');\nconst domUtils = require('./domUtils');\nconst is = require('./is');\nconst pointerExtend = require('./pointerExtend');\n\nconst pointerUtils = {\n copyCoords: function (dest, src) {\n dest.page = dest.page || {};\n dest.page.x = src.page.x;\n dest.page.y = src.page.y;\n\n dest.client = dest.client || {};\n dest.client.x = src.client.x;\n dest.client.y = src.client.y;\n\n dest.timeStamp = src.timeStamp;\n },\n\n setCoordDeltas: function (targetObj, prev, cur) {\n targetObj.page.x = cur.page.x - prev.page.x;\n targetObj.page.y = cur.page.y - prev.page.y;\n targetObj.client.x = cur.client.x - prev.client.x;\n targetObj.client.y = cur.client.y - prev.client.y;\n targetObj.timeStamp = cur.timeStamp - prev.timeStamp;\n\n // set pointer velocity\n const dt = Math.max(targetObj.timeStamp / 1000, 0.001);\n\n targetObj.page.speed = hypot(targetObj.page.x, targetObj.page.y) / dt;\n targetObj.page.vx = targetObj.page.x / dt;\n targetObj.page.vy = targetObj.page.y / dt;\n\n targetObj.client.speed = hypot(targetObj.client.x, targetObj.page.y) / dt;\n targetObj.client.vx = targetObj.client.x / dt;\n targetObj.client.vy = targetObj.client.y / dt;\n },\n\n isNativePointer: function (pointer) {\n return (pointer instanceof dom.Event || pointer instanceof dom.Touch);\n },\n\n // Get specified X/Y coords for mouse or event.touches[0]\n getXY: function (type, pointer, xy) {\n xy = xy || {};\n type = type || 'page';\n\n xy.x = pointer[type + 'X'];\n xy.y = pointer[type + 'Y'];\n\n return xy;\n },\n\n getPageXY: function (pointer, page) {\n page = page || {};\n\n // Opera Mobile handles the viewport and scrolling oddly\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n pointerUtils.getXY('screen', pointer, page);\n\n page.x += window.scrollX;\n page.y += window.scrollY;\n }\n else {\n pointerUtils.getXY('page', pointer, page);\n }\n\n return page;\n },\n\n getClientXY: function (pointer, client) {\n client = client || {};\n\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n // Opera Mobile handles the viewport and scrolling oddly\n pointerUtils.getXY('screen', pointer, client);\n }\n else {\n pointerUtils.getXY('client', pointer, client);\n }\n\n return client;\n },\n\n getPointerId: function (pointer) {\n return is.number(pointer.pointerId)? pointer.pointerId : pointer.identifier;\n },\n\n setCoords: function (targetObj, pointers, timeStamp) {\n const pointer = (pointers.length > 1\n ? pointerUtils.pointerAverage(pointers)\n : pointers[0]);\n\n const tmpXY = {};\n\n pointerUtils.getPageXY(pointer, tmpXY);\n targetObj.page.x = tmpXY.x;\n targetObj.page.y = tmpXY.y;\n\n pointerUtils.getClientXY(pointer, tmpXY);\n targetObj.client.x = tmpXY.x;\n targetObj.client.y = tmpXY.y;\n\n targetObj.timeStamp = is.number(timeStamp) ? timeStamp :new Date().getTime();\n },\n\n pointerExtend: pointerExtend,\n\n getTouchPair: function (event) {\n const touches = [];\n\n // array of touches is supplied\n if (is.array(event)) {\n touches[0] = event[0];\n touches[1] = event[1];\n }\n // an event\n else {\n if (event.type === 'touchend') {\n if (event.touches.length === 1) {\n touches[0] = event.touches[0];\n touches[1] = event.changedTouches[0];\n }\n else if (event.touches.length === 0) {\n touches[0] = event.changedTouches[0];\n touches[1] = event.changedTouches[1];\n }\n }\n else {\n touches[0] = event.touches[0];\n touches[1] = event.touches[1];\n }\n }\n\n return touches;\n },\n\n pointerAverage: function (pointers) {\n const average = {\n pageX : 0,\n pageY : 0,\n clientX: 0,\n clientY: 0,\n screenX: 0,\n screenY: 0,\n };\n\n for (const pointer of pointers) {\n for (const prop in average) {\n average[prop] += pointer[prop];\n }\n }\n for (const prop in average) {\n average[prop] /= pointers.length;\n }\n\n return average;\n },\n\n touchBBox: function (event) {\n if (!event.length && !(event.touches && event.touches.length > 1)) {\n return;\n }\n\n const touches = pointerUtils.getTouchPair(event);\n const minX = Math.min(touches[0].pageX, touches[1].pageX);\n const minY = Math.min(touches[0].pageY, touches[1].pageY);\n const maxX = Math.max(touches[0].pageX, touches[1].pageX);\n const maxY = Math.max(touches[0].pageY, touches[1].pageY);\n\n return {\n x: minX,\n y: minY,\n left: minX,\n top: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n },\n\n touchDistance: function (event, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n\n\n const dx = touches[0][sourceX] - touches[1][sourceX];\n const dy = touches[0][sourceY] - touches[1][sourceY];\n\n return hypot(dx, dy);\n },\n\n touchAngle: function (event, prevAngle, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n const dx = touches[1][sourceX] - touches[0][sourceX];\n const dy = touches[1][sourceY] - touches[0][sourceY];\n const angle = 180 * Math.atan2(dy , dx) / Math.PI;\n\n return angle;\n },\n\n getPointerType: function (pointer, interaction) {\n // if the PointerEvent API isn't available, then the pointer must be ither\n // a MouseEvent or TouchEvent\n if (interaction.mouse) { return 'mouse'; }\n if (!browser.supportsPointerEvent) { return 'touch'; }\n\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : [undefined, undefined,'touch', 'pen', 'mouse'][pointer.pointerType];\n },\n\n // [ event.target, event.currentTarget ]\n getEventTargets: function (event) {\n return [\n domUtils.getActualElement(event.path ? event.path[0] : event.target),\n domUtils.getActualElement(event.currentTarget),\n ];\n },\n};\n\nmodule.exports = pointerUtils;\n","const { window } = require('./window');\n\nconst vendors = ['ms', 'moz', 'webkit', 'o'];\nlet lastTime = 0;\nlet request;\nlet cancel;\n\nfor (let x = 0; x < vendors.length && !window.requestAnimationFrame; x++) {\n request = window[vendors[x] + 'RequestAnimationFrame'];\n cancel = window[vendors[x] +'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n}\n\nif (!request) {\n request = function (callback) {\n const currTime = new Date().getTime();\n const timeToCall = Math.max(0, 16 - (currTime - lastTime));\n const id = setTimeout(function () { callback(currTime + timeToCall); },\n timeToCall);\n\n lastTime = currTime + timeToCall;\n return id;\n };\n}\n\nif (!cancel) {\n cancel = function (id) {\n clearTimeout(id);\n };\n}\n\nmodule.exports = {\n request,\n cancel,\n};\n","const extend = require('./extend');\nconst is = require('./is');\nconst {\n closest,\n parentNode,\n getElementRect,\n} = require('./domUtils');\n\nconst rectUtils = {\n getStringOptionResult: function (value, interactable, element) {\n if (!is.string(value)) {\n return null;\n }\n\n if (value === 'parent') {\n value = parentNode(element);\n }\n else if (value === 'self') {\n value = interactable.getRect(element);\n }\n else {\n value = closest(element, value);\n }\n\n return value;\n },\n\n resolveRectLike: function (value, interactable, element, functionArgs) {\n value = rectUtils.getStringOptionResult(value, interactable, element) || value;\n\n if (is.function(value)) {\n value = value.apply(null, functionArgs);\n }\n\n if (is.element(value)) {\n value = getElementRect(value);\n }\n\n return value;\n },\n\n rectToXY: function (rect) {\n return rect && {\n x: 'x' in rect ? rect.x : rect.left,\n y: 'y' in rect ? rect.y : rect.top,\n };\n },\n\n xywhToTlbr: function (rect) {\n if (rect && !('left' in rect && 'top' in rect)) {\n rect = extend({}, rect);\n\n rect.left = rect.x || 0;\n rect.top = rect.y || 0;\n rect.right = rect.right || (rect.left + rect.width);\n rect.bottom = rect.bottom || (rect.top + rect.height);\n }\n\n return rect;\n },\n\n tlbrToXywh: function (rect) {\n if (rect && !('x' in rect && 'y' in rect)) {\n rect = extend({}, rect);\n\n rect.x = rect.left || 0;\n rect.top = rect.top || 0;\n rect.width = rect.width || (rect.right - rect.x);\n rect.height = rect.height || (rect.bottom - rect.y);\n }\n\n return rect;\n },\n};\n\nmodule.exports = rectUtils;\n","const win = module.exports;\nconst isWindow = require('./isWindow');\n\nfunction init (window) {\n // get wrapped window if using Shadow DOM polyfill\n\n win.realWindow = window;\n\n // create a TextNode\n const el = window.document.createTextNode('');\n\n // check if it's wrapped by a polyfill\n if (el.ownerDocument !== window.document\n && typeof window.wrap === 'function'\n && window.wrap(el) === el) {\n // use wrapped window\n window = window.wrap(window);\n }\n\n win.window = window;\n}\n\nif (typeof window === 'undefined') {\n win.window = undefined;\n win.realWindow = undefined;\n}\nelse {\n init(window);\n}\n\nwin.getWindow = function getWindow (node) {\n if (isWindow(node)) {\n return node;\n }\n\n const rootNode = (node.ownerDocument || node);\n\n return rootNode.defaultView || rootNode.parentWindow || win.window;\n};\n\nwin.init = init;\n"]} \ No newline at end of file +{"version":3,"sources":["src/minHeader.js","src/header.js","index.js","src/Eventable.js","src/InteractEvent.js","src/Interactable.js","src/Interaction.js","src/actions/base.js","src/actions/drag.js","src/actions/drop.js","src/actions/gesture.js","src/actions/resize.js","src/autoScroll.js","src/autoStart/InteractableMethods.js","src/autoStart/base.js","src/autoStart/delay.js","src/autoStart/drag.js","src/autoStart/gesture.js","src/autoStart/resize.js","src/defaultOptions.js","src/index.js","src/inertia.js","src/interact.js","src/interactablePreventDefault.js","src/legacyBrowsers.js","src/modifiers/index.js","src/modifiers/restrict.js","src/modifiers/restrictEdges.js","src/modifiers/restrictSize.js","src/modifiers/snap.js","src/modifiers/snapSize.js","src/pointerEvents/PointerEvent.js","src/pointerEvents/base.js","src/pointerEvents/holdRepeat.js","src/pointerEvents/interactableTargets.js","src/scope.js","src/utils/Signals.js","src/utils/arr.js","src/utils/browser.js","src/utils/domObjects.js","src/utils/domUtils.js","src/utils/events.js","src/utils/extend.js","src/utils/getOriginXY.js","src/utils/hypot.js","src/utils/index.js","src/utils/interactionFinder.js","src/utils/is.js","src/utils/isWindow.js","src/utils/pointerExtend.js","src/utils/pointerUtils.js","src/utils/raf.js","src/utils/rect.js","src/utils/window.js"],"names":[],"mappings":"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","file":"interact.min.js","sourceRoot":"","sourcesContent":["/* interact.js v1.3.0-alpha.4+sha.7970416-dirty | https://raw.github.com/taye/interact.js/master/LICENSE */\n","/**\n * interact.js v1.3.0-alpha.4+sha.7970416-dirty\n *\n * Copyright (c) 2012-2017 Taye Adeyemi \n * Open source under the MIT License.\n * https://raw.github.com/taye/interact.js/master/LICENSE\n */\n","/*\n * In a (windowless) server environment this file exports a factory function\n * that takes the window to use.\n *\n * var interact = require('interact.js')(windowObject);\n *\n * See https://github.com/taye/interact.js/issues/187\n */\nif (typeof window === 'undefined') {\n module.exports = function (window) {\n require('./src/utils/window').init(window);\n\n return require('./src/index');\n };\n}\nelse {\n module.exports = require('./src/index');\n}\n","const { indexOf } = require('./utils/arr');\nconst extend = require('./utils/extend.js');\n\nfunction fireUntilImmediateStopped (event, listeners) {\n for (let i = 0, len = listeners.length; i < len && !event.immediatePropagationStopped; i++) {\n listeners[i](event);\n }\n}\n\nclass Eventable {\n\n constructor (options) {\n this.options = extend({}, options || {});\n }\n\n fire (event) {\n let listeners;\n const onEvent = 'on' + event.type;\n const global = this.global;\n\n // Interactable#on() listeners\n if ((listeners = this[event.type])) {\n fireUntilImmediateStopped(event, listeners);\n }\n\n // interactable.onevent listener\n if (this[onEvent]) {\n this[onEvent](event);\n }\n\n // interact.on() listeners\n if (!event.propagationStopped && global && (listeners = global[event.type])) {\n fireUntilImmediateStopped(event, listeners);\n }\n }\n\n on (eventType, listener) {\n // if this type of event was never bound\n if (this[eventType]) {\n this[eventType].push(listener);\n }\n else {\n this[eventType] = [listener];\n }\n }\n\n off (eventType, listener) {\n // if it is an action event type\n const eventList = this[eventType];\n const index = eventList? indexOf(eventList, listener) : -1;\n\n if (index !== -1) {\n eventList.splice(index, 1);\n }\n\n if (eventList && eventList.length === 0 || !listener) {\n this[eventType] = listener;\n }\n }\n}\n\nmodule.exports = Eventable;\n","const extend = require('./utils/extend');\nconst getOriginXY = require('./utils/getOriginXY');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nclass InteractEvent {\n constructor (interaction, event, action, phase, element, related, preEnd = false) {\n const target = interaction.target;\n const deltaSource = (target && target.options || defaults).deltaSource;\n const origin = getOriginXY(target, element, action);\n const starting = phase === 'start';\n const ending = phase === 'end';\n const coords = starting? interaction.startCoords : interaction.curCoords;\n const prevEvent = interaction.prevEvent;\n\n element = element || interaction.element;\n\n const page = extend({}, coords.page);\n const client = extend({}, coords.client);\n\n page.x -= origin.x;\n page.y -= origin.y;\n\n client.x -= origin.x;\n client.y -= origin.y;\n\n this.ctrlKey = event.ctrlKey;\n this.altKey = event.altKey;\n this.shiftKey = event.shiftKey;\n this.metaKey = event.metaKey;\n this.button = event.button;\n this.buttons = event.buttons;\n this.target = element;\n this.currentTarget = element;\n this.relatedTarget = related || null;\n this.preEnd = preEnd;\n this.type = action + (phase || '');\n this.interaction = interaction;\n this.interactable = target;\n\n this.t0 = starting ? interaction.downTimes[interaction.downTimes.length - 1]\n : prevEvent.t0;\n\n const signalArg = {\n interaction,\n event,\n action,\n phase,\n element,\n related,\n page,\n client,\n coords,\n starting,\n ending,\n deltaSource,\n iEvent: this,\n };\n\n signals.fire('set-xy', signalArg);\n\n if (ending) {\n // use previous coords when ending\n this.pageX = prevEvent.pageX;\n this.pageY = prevEvent.pageY;\n this.clientX = prevEvent.clientX;\n this.clientY = prevEvent.clientY;\n }\n else {\n this.pageX = page.x;\n this.pageY = page.y;\n this.clientX = client.x;\n this.clientY = client.y;\n }\n\n this.x0 = interaction.startCoords.page.x - origin.x;\n this.y0 = interaction.startCoords.page.y - origin.y;\n this.clientX0 = interaction.startCoords.client.x - origin.x;\n this.clientY0 = interaction.startCoords.client.y - origin.y;\n\n signals.fire('set-delta', signalArg);\n\n this.timeStamp = coords.timeStamp;\n this.dt = interaction.pointerDelta.timeStamp;\n this.duration = this.timeStamp - this.t0;\n\n // speed and velocity in pixels per second\n this.speed = interaction.pointerDelta[deltaSource].speed;\n this.velocityX = interaction.pointerDelta[deltaSource].vx;\n this.velocityY = interaction.pointerDelta[deltaSource].vy;\n\n this.swipe = (ending || phase === 'inertiastart')? this.getSwipe() : null;\n\n signals.fire('new', signalArg);\n }\n\n getSwipe () {\n const interaction = this.interaction;\n\n if (interaction.prevEvent.speed < 600\n || this.timeStamp - interaction.prevEvent.timeStamp > 150) {\n return null;\n }\n\n let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI;\n const overlap = 22.5;\n\n if (angle < 0) {\n angle += 360;\n }\n\n const left = 135 - overlap <= angle && angle < 225 + overlap;\n const up = 225 - overlap <= angle && angle < 315 + overlap;\n\n const right = !left && (315 - overlap <= angle || angle < 45 + overlap);\n const down = !up && 45 - overlap <= angle && angle < 135 + overlap;\n\n return {\n up,\n down,\n left,\n right,\n angle,\n speed: interaction.prevEvent.speed,\n velocity: {\n x: interaction.prevEvent.velocityX,\n y: interaction.prevEvent.velocityY,\n },\n };\n }\n\n preventDefault () {}\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n}\n\nsignals.on('set-delta', function ({ iEvent, interaction, starting, deltaSource }) {\n const prevEvent = starting? iEvent : interaction.prevEvent;\n\n if (deltaSource === 'client') {\n iEvent.dx = iEvent.clientX - prevEvent.clientX;\n iEvent.dy = iEvent.clientY - prevEvent.clientY;\n }\n else {\n iEvent.dx = iEvent.pageX - prevEvent.pageX;\n iEvent.dy = iEvent.pageY - prevEvent.pageY;\n }\n});\n\nInteractEvent.signals = signals;\n\nmodule.exports = InteractEvent;\n","const is = require('./utils/is');\nconst events = require('./utils/events');\nconst extend = require('./utils/extend');\nconst actions = require('./actions/base');\nconst scope = require('./scope');\nconst Eventable = require('./Eventable');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nconst {\n getElementRect,\n nodeContains,\n trySelector,\n} = require('./utils/domUtils');\nconst { getWindow } = require('./utils/window');\nconst { indexOf, contains } = require('./utils/arr');\nconst { wheelEvent } = require('./utils/browser');\n\n// all set interactables\nscope.interactables = [];\n\n/*\\\n * Interactable\n [ property ]\n **\n * Object type returned by @interact\n\\*/\nclass Interactable {\n constructor (target, options) {\n options = options || {};\n\n this.target = target;\n this.events = new Eventable();\n this._context = options.context || scope.document;\n this._win = getWindow(trySelector(target)? this._context : target);\n this._doc = this._win.document;\n\n signals.fire('new', {\n target,\n options,\n interactable: this,\n win: this._win,\n });\n\n scope.addDocument( this._doc, this._win );\n\n scope.interactables.push(this);\n\n this.set(options);\n }\n\n setOnEvents (action, phases) {\n const onAction = 'on' + action;\n\n if (is.function(phases.onstart) ) { this.events[onAction + 'start' ] = phases.onstart ; }\n if (is.function(phases.onmove) ) { this.events[onAction + 'move' ] = phases.onmove ; }\n if (is.function(phases.onend) ) { this.events[onAction + 'end' ] = phases.onend ; }\n if (is.function(phases.oninertiastart)) { this.events[onAction + 'inertiastart' ] = phases.oninertiastart ; }\n\n return this;\n }\n\n setPerAction (action, options) {\n // for all the default per-action options\n for (const option in options) {\n // if this option exists for this action\n if (option in defaults[action]) {\n // if the option in the options arg is an object value\n if (is.object(options[option])) {\n // duplicate the object\n this.options[action][option] = extend(this.options[action][option] || {}, options[option]);\n\n if (is.object(defaults.perAction[option]) && 'enabled' in defaults.perAction[option]) {\n this.options[action][option].enabled = options[option].enabled === false? false : true;\n }\n }\n else if (is.bool(options[option]) && is.object(defaults.perAction[option])) {\n this.options[action][option].enabled = options[option];\n }\n else if (options[option] !== undefined) {\n // or if it's not undefined, do a plain assignment\n this.options[action][option] = options[option];\n }\n }\n }\n }\n\n /*\\\n * Interactable.getRect\n [ method ]\n *\n * The default function to get an Interactables bounding rect. Can be\n * overridden using @Interactable.rectChecker.\n *\n - element (Element) #optional The element to measure.\n = (object) The object's bounding rectangle.\n o {\n o top : 0,\n o left : 0,\n o bottom: 0,\n o right : 0,\n o width : 0,\n o height: 0\n o }\n \\*/\n getRect (element) {\n element = element || this.target;\n\n if (is.string(this.target) && !(is.element(element))) {\n element = this._context.querySelector(this.target);\n }\n\n return getElementRect(element);\n }\n\n /*\\\n * Interactable.rectChecker\n [ method ]\n *\n * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n - checker (function) #optional A function which returns this Interactable's bounding rectangle. See @Interactable.getRect\n = (function | object) The checker function or this Interactable\n \\*/\n rectChecker (checker) {\n if (is.function(checker)) {\n this.getRect = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.getRect;\n\n return this;\n }\n\n return this.getRect;\n }\n\n _backCompatOption (optionName, newValue) {\n if (trySelector(newValue) || is.object(newValue)) {\n this.options[optionName] = newValue;\n\n for (const action of actions.names) {\n this.options[action][optionName] = newValue;\n }\n\n return this;\n }\n\n return this.options[optionName];\n }\n\n /*\\\n * Interactable.origin\n [ method ]\n *\n * Gets or sets the origin of the Interactable's element. The x and y\n * of the origin will be subtracted from action event coordinates.\n *\n - origin (object | string) #optional An object eg. { x: 0, y: 0 } or string 'parent', 'self' or any CSS selector\n * OR\n - origin (Element) #optional An HTML or SVG Element whose rect will be used\n **\n = (object) The current origin or this Interactable\n \\*/\n origin (newValue) {\n return this._backCompatOption('origin', newValue);\n }\n\n /*\\\n * Interactable.deltaSource\n [ method ]\n *\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n - newValue (string) #optional Use 'client' if you will be scrolling while interacting; Use 'page' if you want autoScroll to work\n = (string | object) The current deltaSource or this Interactable\n \\*/\n deltaSource (newValue) {\n if (newValue === 'page' || newValue === 'client') {\n this.options.deltaSource = newValue;\n\n return this;\n }\n\n return this.options.deltaSource;\n }\n\n /*\\\n * Interactable.context\n [ method ]\n *\n * Gets the selector context Node of the Interactable. The default is `window.document`.\n *\n = (Node) The context Node of this Interactable\n **\n \\*/\n context () {\n return this._context;\n }\n\n inContext (element) {\n return (this._context === element.ownerDocument\n || nodeContains(this._context, element));\n }\n\n /*\\\n * Interactable.fire\n [ method ]\n *\n * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n - iEvent (InteractEvent) The InteractEvent object to be fired on this Interactable\n = (Interactable) this Interactable\n \\*/\n fire (iEvent) {\n this.events.fire(iEvent);\n\n return this;\n }\n\n _onOffMultiple (method, eventType, listener, options) {\n if (is.string(eventType) && eventType.search(' ') !== -1) {\n eventType = eventType.trim().split(/ +/);\n }\n\n if (is.array(eventType)) {\n for (let i = 0; i < eventType.length; i++) {\n this[method](eventType[i], listener, options);\n }\n\n return true;\n }\n\n if (is.object(eventType)) {\n for (const prop in eventType) {\n this[method](prop, eventType[prop], listener);\n }\n\n return true;\n }\n }\n\n /*\\\n * Interactable.on\n [ method ]\n *\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n - eventType (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) This Interactable\n \\*/\n on (eventType, listener, options) {\n if (this._onOffMultiple('on', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.on(eventType, listener);\n }\n // delegated event for selector\n else if (is.string(this.target)) {\n events.addDelegate(this.target, this._context, eventType, listener, options);\n }\n else {\n events.add(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.off\n [ method ]\n *\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n - eventType (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) This Interactable\n \\*/\n off (eventType, listener, options) {\n if (this._onOffMultiple('off', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n // if it is an action event type\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.off(eventType, listener);\n }\n // delegated event\n else if (is.string(this.target)) {\n events.removeDelegate(this.target, this._context, eventType, listener, options);\n }\n // remove listener from this Interatable's element\n else {\n events.remove(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.set\n [ method ]\n *\n * Reset the options of this Interactable\n - options (object) The new settings to apply\n = (object) This Interactable\n \\*/\n set (options) {\n if (!is.object(options)) {\n options = {};\n }\n\n this.options = extend({}, defaults.base);\n\n const perActions = extend({}, defaults.perAction);\n\n for (const actionName in actions.methodDict) {\n const methodName = actions.methodDict[actionName];\n\n this.options[actionName] = extend({}, defaults[actionName]);\n\n this.setPerAction(actionName, perActions);\n\n this[methodName](options[actionName]);\n }\n\n for (const setting of Interactable.settingsMethods) {\n this.options[setting] = defaults.base[setting];\n\n if (setting in options) {\n this[setting](options[setting]);\n }\n }\n\n signals.fire('set', {\n options,\n interactable: this,\n });\n\n return this;\n }\n\n /*\\\n * Interactable.unset\n [ method ]\n *\n * Remove this interactable from the list of interactables and remove\n * it's action capabilities and event listeners\n *\n = (object) @interact\n \\*/\n unset () {\n events.remove(this.target, 'all');\n\n if (is.string(this.target)) {\n // remove delegated events\n for (const type in events.delegatedEvents) {\n const delegated = events.delegatedEvents[type];\n\n if (delegated.selectors[0] === this.target\n && delegated.contexts[0] === this._context) {\n\n delegated.selectors.splice(0, 1);\n delegated.contexts .splice(0, 1);\n delegated.listeners.splice(0, 1);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegated[type] = null;\n }\n }\n\n events.remove(this._context, type, events.delegateListener);\n events.remove(this._context, type, events.delegateUseCapture, true);\n }\n }\n else {\n events.remove(this, 'all');\n }\n\n signals.fire('unset', { interactable: this });\n\n scope.interactables.splice(indexOf(scope.interactables, this), 1);\n\n // Stop related interactions when an Interactable is unset\n for (const interaction of scope.interactions || []) {\n if (interaction.target === this && interaction.interacting()) {\n interaction.stop();\n }\n }\n\n return scope.interact;\n }\n}\n\nscope.interactables.indexOfElement = function indexOfElement (target, context) {\n context = context || scope.document;\n\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n if (interactable.target === target && interactable._context === context) {\n return i;\n }\n }\n return -1;\n};\n\nscope.interactables.get = function interactableGet (element, options, dontCheckInContext) {\n const ret = this[this.indexOfElement(element, options && options.context)];\n\n return ret && (is.string(element) || dontCheckInContext || ret.inContext(element))? ret : null;\n};\n\nscope.interactables.forEachSelector = function (callback, element) {\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n // skip non CSS selector targets and out of context elements\n if (!is.string(interactable.target)\n || (element && !interactable.inContext(element))) {\n continue;\n }\n\n const ret = callback(interactable, interactable.target, interactable._context, i, this);\n\n if (ret !== undefined) {\n return ret;\n }\n }\n};\n\n// all interact.js eventTypes\nInteractable.eventTypes = scope.eventTypes = [];\n\nInteractable.signals = signals;\n\nInteractable.settingsMethods = [ 'deltaSource', 'origin', 'preventDefault', 'rectChecker' ];\n\nmodule.exports = Interactable;\n","const scope = require('./scope');\nconst utils = require('./utils');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst domObjects = require('./utils/domObjects');\nconst finder = require('./utils/interactionFinder');\nconst signals = require('./utils/Signals').new();\n\nconst listeners = {};\nconst methodNames = [\n 'pointerDown', 'pointerMove', 'pointerUp',\n 'updatePointer', 'removePointer',\n];\n\n// for ignoring browser's simulated mouse events\nlet prevTouchTime = 0;\n\n// all active and idle interactions\nscope.interactions = [];\n\nclass Interaction {\n constructor ({ pointerType }) {\n this.target = null; // current interactable being interacted with\n this.element = null; // the target element of the interactable\n\n this.prepared = { // action that's ready to be fired on next move event\n name : null,\n axis : null,\n edges: null,\n };\n\n // keep track of added pointers\n this.pointers = [];\n this.pointerIds = [];\n this.downTargets = [];\n this.downTimes = [];\n\n // Previous native pointer move event coordinates\n this.prevCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n // current native pointer move event coordinates\n this.curCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Starting InteractEvent pointer coordinates\n this.startCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Change in coordinates and time of the pointer\n this.pointerDelta = {\n page : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n client : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n timeStamp: 0,\n };\n\n this.downEvent = null; // pointerdown/mousedown/touchstart event\n this.downPointer = {};\n\n this._eventTarget = null;\n this._curEventTarget = null;\n\n this.prevEvent = null; // previous action event\n\n this.pointerIsDown = false;\n this.pointerWasMoved = false;\n this._interacting = false;\n\n this.pointerType = pointerType;\n\n signals.fire('new', this);\n\n scope.interactions.push(this);\n }\n\n pointerDown (pointer, event, eventTarget) {\n const pointerIndex = this.updatePointer(pointer, event, true);\n\n signals.fire('down', {\n pointer,\n event,\n eventTarget,\n pointerIndex,\n interaction: this,\n });\n }\n\n /*\\\n * Interaction.start\n [ method ]\n *\n * Start an action with the given Interactable and Element as tartgets. The\n * action must be enabled for the target Interactable and an appropriate number\n * of pointers must be held down - 1 for drag/resize, 2 for gesture.\n *\n * Use it with `interactable.able({ manualStart: false })` to always\n * [start actions manually](https://github.com/taye/interact.js/issues/114)\n *\n - action (object) The action to be performed - drag, resize, etc.\n - target (Interactable) The Interactable to target\n - element (Element) The DOM Element to target\n = (object) interact\n **\n | interact(target)\n | .draggable({\n | // disable the default drag start by down->move\n | manualStart: true\n | })\n | // start dragging after the user holds the pointer down\n | .on('hold', function (event) {\n | var interaction = event.interaction;\n |\n | if (!interaction.interacting()) {\n | interaction.start({ name: 'drag' },\n | event.interactable,\n | event.currentTarget);\n | }\n | });\n \\*/\n start (action, target, element) {\n if (this.interacting()\n || !this.pointerIsDown\n || this.pointerIds.length < (action.name === 'gesture'? 2 : 1)) {\n return;\n }\n\n // if this interaction had been removed after stopping\n // add it back\n if (utils.indexOf(scope.interactions, this) === -1) {\n scope.interactions.push(this);\n }\n\n utils.copyAction(this.prepared, action);\n this.target = target;\n this.element = element;\n\n signals.fire('action-start', {\n interaction: this,\n event: this.downEvent,\n });\n }\n\n pointerMove (pointer, event, eventTarget) {\n if (!this.simulation) {\n this.updatePointer(pointer);\n utils.setCoords(this.curCoords, this.pointers);\n }\n\n const duplicateMove = (this.curCoords.page.x === this.prevCoords.page.x\n && this.curCoords.page.y === this.prevCoords.page.y\n && this.curCoords.client.x === this.prevCoords.client.x\n && this.curCoords.client.y === this.prevCoords.client.y);\n\n let dx;\n let dy;\n\n // register movement greater than pointerMoveTolerance\n if (this.pointerIsDown && !this.pointerWasMoved) {\n dx = this.curCoords.client.x - this.startCoords.client.x;\n dy = this.curCoords.client.y - this.startCoords.client.y;\n\n this.pointerWasMoved = utils.hypot(dx, dy) > Interaction.pointerMoveTolerance;\n }\n\n const signalArg = {\n pointer,\n pointerIndex: this.getPointerIndex(pointer),\n event,\n eventTarget,\n dx,\n dy,\n duplicate: duplicateMove,\n interaction: this,\n interactingBeforeMove: this.interacting(),\n };\n\n if (!duplicateMove) {\n // set pointer coordinate, time changes and speeds\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n }\n\n signals.fire('move', signalArg);\n\n if (!duplicateMove) {\n // if interacting, fire an 'action-move' signal etc\n if (this.interacting()) {\n this.doMove(signalArg);\n }\n\n if (this.pointerWasMoved) {\n utils.copyCoords(this.prevCoords, this.curCoords);\n }\n }\n }\n\n /*\\\n * Interaction.doMove\n [ method ]\n *\n * Force a move of the current action at the same coordinates. Useful if\n * snap/restrict has been changed and you want a movement with the new\n * settings.\n *\n **\n | interact(target)\n | .draggable(true)\n | .on('dragmove', function (event) {\n | if (someCondition) {\n | // change the snap settings\n | event.interactable.draggable({ snap: { targets: [] }});\n | // fire another move event with re-calculated snap\n | event.interaction.doMove();\n | }\n | });\n \\*/\n doMove (signalArg) {\n signalArg = utils.extend({\n pointer: this.pointers[0],\n event: this.prevEvent,\n eventTarget: this._eventTarget,\n interaction: this,\n }, signalArg || {});\n\n signals.fire('before-action-move', signalArg);\n\n if (!this._dontFireMove) {\n signals.fire('action-move', signalArg);\n }\n\n this._dontFireMove = false;\n }\n\n // End interact move events and stop auto-scroll unless simulation is running\n pointerUp (pointer, event, eventTarget, curEventTarget) {\n const pointerIndex = this.getPointerIndex(pointer);\n\n signals.fire(/cancel$/i.test(event.type)? 'cancel' : 'up', {\n pointer,\n pointerIndex,\n event,\n eventTarget,\n curEventTarget,\n interaction: this,\n });\n\n if (!this.simulation) {\n this.end(event);\n }\n\n this.pointerIsDown = false;\n this.removePointer(pointer, event);\n }\n\n /*\\\n * Interaction.end\n [ method ]\n *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n - event (PointerEvent) #optional\n **\n | interact(target)\n | .draggable(true)\n | .on('move', function (event) {\n | if (event.pageX > 1000) {\n | // end the current action\n | event.interaction.end();\n | // stop all further listeners from being called\n | event.stopImmediatePropagation();\n | }\n | });\n \\*/\n end (event) {\n event = event || this.prevEvent;\n\n if (this.interacting()) {\n signals.fire('action-end', {\n event,\n interaction: this,\n });\n }\n\n this.stop();\n }\n\n currentAction () {\n return this._interacting? this.prepared.name: null;\n }\n\n interacting () {\n return this._interacting;\n }\n\n stop () {\n signals.fire('stop', { interaction: this });\n\n if (this._interacting) {\n signals.fire('stop-active', { interaction: this });\n signals.fire('stop-' + this.prepared.name, { interaction: this });\n }\n\n this.target = this.element = null;\n\n this._interacting = false;\n this.prepared.name = this.prevEvent = null;\n }\n\n getPointerIndex (pointer) {\n // mouse and pen interactions may have only one pointer\n if (this.pointerType === 'mouse' || this.pointerType === 'pen') {\n return 0;\n }\n\n return utils.indexOf(this.pointerIds, utils.getPointerId(pointer));\n }\n\n updatePointer (pointer, event, down = event && /(down|start)$/i.test(event.type)) {\n const id = utils.getPointerId(pointer);\n let index = this.getPointerIndex(pointer);\n\n if (index === -1) {\n index = this.pointerIds.length;\n this.pointerIds[index] = id;\n }\n\n if (down) {\n signals.fire('update-pointer-down', {\n pointer,\n event,\n down,\n pointerId: id,\n pointerIndex: index,\n interaction: this,\n });\n }\n\n this.pointers[index] = pointer;\n\n return index;\n }\n\n removePointer (pointer, event) {\n const index = this.getPointerIndex(pointer);\n\n if (index === -1) { return; }\n\n signals.fire('remove-pointer', {\n pointer,\n event,\n pointerIndex: index,\n interaction: this,\n });\n\n this.pointers .splice(index, 1);\n this.pointerIds .splice(index, 1);\n this.downTargets.splice(index, 1);\n this.downTimes .splice(index, 1);\n }\n\n _updateEventTargets (target, currentTarget) {\n this._eventTarget = target;\n this._curEventTarget = currentTarget;\n }\n}\n\nfor (let i = 0, len = methodNames.length; i < len; i++) {\n const method = methodNames[i];\n\n listeners[method] = doOnInteractions(method);\n}\n\nfunction doOnInteractions (method) {\n return (function (event) {\n const pointerType = utils.getPointerType(event);\n const [eventTarget, curEventTarget] = utils.getEventTargets(event);\n const matches = []; // [ [pointer, interaction], ...]\n\n if (browser.supportsTouch && /touch/.test(event.type)) {\n prevTouchTime = new Date().getTime();\n\n for (let i = 0; i < event.changedTouches.length; i++) {\n const pointer = event.changedTouches[i];\n const interaction = finder.search(pointer, event.type, eventTarget);\n\n matches.push([pointer, interaction || new Interaction({ pointerType })]);\n }\n }\n else {\n let invalidPointer = false;\n\n if (!browser.supportsPointerEvent && /mouse/.test(event.type)) {\n // ignore mouse events while touch interactions are active\n for (let i = 0; i < scope.interactions.length && !invalidPointer; i++) {\n invalidPointer = scope.interactions[i].pointerType !== 'mouse' && scope.interactions[i].pointerIsDown;\n }\n\n // try to ignore mouse events that are simulated by the browser\n // after a touch event\n invalidPointer = invalidPointer\n || (new Date().getTime() - prevTouchTime < 500)\n // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated\n || event.timeStamp === 0;\n }\n\n if (!invalidPointer) {\n let interaction = finder.search(event, event.type, eventTarget);\n\n if (!interaction) {\n interaction = new Interaction({ pointerType });\n }\n\n matches.push([event, interaction]);\n }\n }\n\n for (const [pointer, interaction] of matches) {\n interaction._updateEventTargets(eventTarget, curEventTarget);\n interaction[method](pointer, event, eventTarget, curEventTarget);\n }\n });\n}\n\nfunction endAll (event) {\n for (let i = 0; i < scope.interactions.length; i++) {\n const interaction = scope.interactions[i];\n\n interaction.end(event);\n signals.fire('endall', { event, interaction });\n }\n}\n\nconst docEvents = { /* 'eventType': listenerFunc */ };\nconst pEventTypes = browser.pEventTypes;\n\nif (domObjects.PointerEvent) {\n docEvents[pEventTypes.down ] = listeners.pointerDown;\n docEvents[pEventTypes.move ] = listeners.pointerMove;\n docEvents[pEventTypes.up ] = listeners.pointerUp;\n docEvents[pEventTypes.cancel] = listeners.pointerUp;\n}\nelse {\n docEvents.mousedown = listeners.pointerDown;\n docEvents.mousemove = listeners.pointerMove;\n docEvents.mouseup = listeners.pointerUp;\n\n docEvents.touchstart = listeners.pointerDown;\n docEvents.touchmove = listeners.pointerMove;\n docEvents.touchend = listeners.pointerUp;\n docEvents.touchcancel = listeners.pointerUp;\n}\n\ndocEvents.blur = endAll;\n\nfunction onDocSignal ({ doc }, signalName) {\n const eventMethod = signalName.indexOf('add') === 0\n ? events.add : events.remove;\n\n // delegate event listener\n for (const eventType in scope.delegatedEvents) {\n eventMethod(doc, eventType, events.delegateListener);\n eventMethod(doc, eventType, events.delegateUseCapture, true);\n }\n\n for (const eventType in docEvents) {\n eventMethod(doc, eventType, docEvents[eventType]);\n }\n}\n\nsignals.on('update-pointer-down', ({ interaction, pointer, pointerId, pointerIndex, event, eventTarget, down }) => {\n interaction.pointerIds[pointerIndex] = pointerId;\n interaction.pointers[pointerIndex] = pointer;\n\n if (down) {\n interaction.pointerIsDown = true;\n }\n\n if (!interaction.interacting()) {\n utils.setCoords(interaction.startCoords, interaction.pointers);\n\n utils.copyCoords(interaction.curCoords , interaction.startCoords);\n utils.copyCoords(interaction.prevCoords, interaction.startCoords);\n\n interaction.downEvent = event;\n interaction.downTimes[pointerIndex] = interaction.curCoords.timeStamp;\n interaction.downTargets[pointerIndex] = eventTarget || event && utils.getEventTargets(event)[0];\n interaction.pointerWasMoved = false;\n\n utils.pointerExtend(interaction.downPointer, pointer);\n }\n});\n\nscope.signals.on('add-document' , onDocSignal);\nscope.signals.on('remove-document', onDocSignal);\n\nInteraction.pointerMoveTolerance = 1;\nInteraction.doOnInteractions = doOnInteractions;\nInteraction.endAll = endAll;\nInteraction.signals = signals;\nInteraction.docEvents = docEvents;\n\nscope.endAllInteractions = endAll;\n\nmodule.exports = Interaction;\n","const Interaction = require('../Interaction');\nconst InteractEvent = require('../InteractEvent');\n\nconst actions = {\n firePrepared,\n names: [],\n methodDict: {},\n};\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n interaction._interacting = true;\n firePrepared(interaction, event, 'start');\n});\n\nInteraction.signals.on('action-move', function ({ interaction, event, preEnd }) {\n firePrepared(interaction, event, 'move', preEnd);\n\n // if the action was ended in a listener\n if (!interaction.interacting()) { return false; }\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n firePrepared(interaction, event, 'end');\n});\n\nfunction firePrepared (interaction, event, phase, preEnd) {\n const actionName = interaction.prepared.name;\n\n const newEvent = new InteractEvent(interaction, event, actionName, phase, interaction.element, null, preEnd);\n\n interaction.target.fire(newEvent);\n interaction.prevEvent = newEvent;\n}\n\nmodule.exports = actions;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drag = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n startAxis : 'xy',\n lockAxis : 'xy',\n },\n\n checker: function (pointer, event, interactable) {\n const dragOptions = interactable.options.drag;\n\n return dragOptions.enabled\n ? { name: 'drag', axis: (dragOptions.lockAxis === 'start'\n ? dragOptions.startAxis\n : dragOptions.lockAxis)}\n : null;\n },\n\n getCursor: function () {\n return 'move';\n },\n};\n\nInteraction.signals.on('before-action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n interaction.curCoords.page.y = interaction.startCoords.page.y;\n interaction.curCoords.client.y = interaction.startCoords.client.y;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vx);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vx);\n interaction.pointerDelta.client.vy = 0;\n interaction.pointerDelta.page.vy = 0;\n }\n else if (axis === 'y') {\n interaction.curCoords.page.x = interaction.startCoords.page.x;\n interaction.curCoords.client.x = interaction.startCoords.client.x;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vy);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vy);\n interaction.pointerDelta.client.vx = 0;\n interaction.pointerDelta.page.vx = 0;\n }\n});\n\n// dragmove\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'dragmove') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n iEvent.pageY = interaction.startCoords.page.y;\n iEvent.clientY = interaction.startCoords.client.y;\n iEvent.dy = 0;\n }\n else if (axis === 'y') {\n iEvent.pageX = interaction.startCoords.page.x;\n iEvent.clientX = interaction.startCoords.client.x;\n iEvent.dx = 0;\n }\n});\n\n/*\\\n * Interactable.draggable\n [ method ]\n *\n * Gets or sets whether drag actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of drag events\n | var isDraggable = interact('ul li').draggable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on drag events (object makes the Interactable draggable)\n = (object) This Interactable\n | interact(element).draggable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // the axis in which the first movement must be\n | // for the drag sequence to start\n | // 'xy' by default - any direction\n | startAxis: 'x' || 'y' || 'xy',\n |\n | // 'xy' by default - don't restrict to one axis (move in any direction)\n | // 'x' or 'y' to restrict movement to either axis\n | // 'start' to restrict movement to the axis the drag started in\n | lockAxis: 'x' || 'y' || 'xy' || 'start',\n |\n | // max number of drags that can happen concurrently\n | // with elements of this Interactable. Infinity by default\n | max: Infinity,\n |\n | // max number of drags that can target the same element+Interactable\n | // 1 by default\n | maxPerElement: 2\n | });\n\\*/\nInteractable.prototype.draggable = function (options) {\n if (utils.is.object(options)) {\n this.options.drag.enabled = options.enabled === false? false: true;\n this.setPerAction('drag', options);\n this.setOnEvents('drag', options);\n\n if (/^(xy|x|y|start)$/.test(options.lockAxis)) {\n this.options.drag.lockAxis = options.lockAxis;\n }\n if (/^(xy|x|y)$/.test(options.startAxis)) {\n this.options.drag.startAxis = options.startAxis;\n }\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drag.enabled = options;\n\n if (!options) {\n this.ondragstart = this.ondragstart = this.ondragend = null;\n }\n\n return this;\n }\n\n return this.options.drag;\n};\n\nactions.drag = drag;\nactions.names.push('drag');\nutils.merge(Interactable.eventTypes, [\n 'dragstart',\n 'dragmove',\n 'draginertiastart',\n 'draginertiaresume',\n 'dragend',\n]);\nactions.methodDict.drag = 'draggable';\n\ndefaultOptions.drag = drag.defaults;\n\nmodule.exports = drag;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst scope = require('../scope');\nconst interact = require('../interact');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drop = {\n defaults: {\n enabled: false,\n accept : null,\n overlap: 'pointer',\n },\n};\n\nlet dynamicDrop = false;\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // reset active dropzones\n interaction.activeDrops.dropzones = [];\n interaction.activeDrops.elements = [];\n interaction.activeDrops.rects = [];\n\n interaction.dropEvents = null;\n\n if (!interaction.dynamicDrop) {\n setActiveDrops(interaction, interaction.element);\n }\n\n const dragEvent = interaction.prevEvent;\n const dropEvents = getDropEvents(interaction, event, dragEvent);\n\n if (dropEvents.activate) {\n fireActiveDrops(interaction, dropEvents.activate);\n }\n});\n\nInteractEvent.signals.on('new', function ({ interaction, iEvent, event }) {\n if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { return; }\n\n const draggableElement = interaction.element;\n const dragEvent = iEvent;\n const dropResult = getDrop(dragEvent, event, draggableElement);\n\n interaction.dropTarget = dropResult.dropzone;\n interaction.dropElement = dropResult.element;\n\n interaction.dropEvents = getDropEvents(interaction, event, dragEvent);\n});\n\nInteraction.signals.on('action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n fireDropEvents(interaction, interaction.dropEvents);\n});\n\nInteraction.signals.on('action-end', function ({ interaction }) {\n if (interaction.prepared.name === 'drag') {\n fireDropEvents(interaction, interaction.dropEvents);\n }\n});\n\nInteraction.signals.on('stop-drag', function ({ interaction }) {\n interaction.activeDrops.dropzones =\n interaction.activeDrops.elements =\n interaction.activeDrops.rects =\n interaction.dropEvents = null;\n});\n\nfunction collectDrops (interaction, element) {\n const drops = [];\n const elements = [];\n\n element = element || interaction.element;\n\n // collect all dropzones and their elements which qualify for a drop\n for (const current of scope.interactables) {\n if (!current.options.drop.enabled) { continue; }\n\n const accept = current.options.drop.accept;\n\n // test the draggable element against the dropzone's accept setting\n if ((utils.is.element(accept) && accept !== element)\n || (utils.is.string(accept)\n && !utils.matchesSelector(element, accept))) {\n\n continue;\n }\n\n // query for new elements if necessary\n const dropElements = utils.is.string(current.target)\n ? current._context.querySelectorAll(current.target)\n : [current.target];\n\n for (let i = 0; i < dropElements.length; i++) {\n const currentElement = dropElements[i];\n\n if (currentElement !== element) {\n drops.push(current);\n elements.push(currentElement);\n }\n }\n }\n\n return {\n elements,\n dropzones: drops,\n };\n}\n\nfunction fireActiveDrops (interaction, event) {\n let prevElement;\n\n // loop through all active dropzones and trigger event\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n const current = interaction.activeDrops.dropzones[i];\n const currentElement = interaction.activeDrops.elements [i];\n\n // prevent trigger of duplicate events on same element\n if (currentElement !== prevElement) {\n // set current element as event target\n event.target = currentElement;\n current.fire(event);\n }\n prevElement = currentElement;\n }\n}\n\n// Collect a new set of possible drops and save them in activeDrops.\n// setActiveDrops should always be called when a drag has just started or a\n// drag event happens while dynamicDrop is true\nfunction setActiveDrops (interaction, dragElement) {\n // get dropzones and their elements that could receive the draggable\n const possibleDrops = collectDrops(interaction, dragElement, true);\n\n interaction.activeDrops.dropzones = possibleDrops.dropzones;\n interaction.activeDrops.elements = possibleDrops.elements;\n interaction.activeDrops.rects = [];\n\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n interaction.activeDrops.rects[i] =\n interaction.activeDrops.dropzones[i].getRect(interaction.activeDrops.elements[i]);\n }\n}\n\nfunction getDrop (dragEvent, event, dragElement) {\n const interaction = dragEvent.interaction;\n const validDrops = [];\n\n if (dynamicDrop) {\n setActiveDrops(interaction, dragElement);\n }\n\n // collect all dropzones and their elements which qualify for a drop\n for (let j = 0; j < interaction.activeDrops.dropzones.length; j++) {\n const current = interaction.activeDrops.dropzones[j];\n const currentElement = interaction.activeDrops.elements [j];\n const rect = interaction.activeDrops.rects [j];\n\n validDrops.push(current.dropCheck(dragEvent, event, interaction.target, dragElement, currentElement, rect)\n ? currentElement\n : null);\n }\n\n // get the most appropriate dropzone based on DOM depth and order\n const dropIndex = utils.indexOfDeepestElement(validDrops);\n\n return {\n dropzone: interaction.activeDrops.dropzones[dropIndex] || null,\n element : interaction.activeDrops.elements [dropIndex] || null,\n };\n}\n\nfunction getDropEvents (interaction, pointerEvent, dragEvent) {\n const dropEvents = {\n enter : null,\n leave : null,\n activate : null,\n deactivate: null,\n move : null,\n drop : null,\n };\n\n const tmpl = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n };\n\n if (interaction.dropElement !== interaction.prevDropElement) {\n // if there was a prevDropTarget, create a dragleave event\n if (interaction.prevDropTarget) {\n dropEvents.leave = utils.extend({ type: 'dragleave' }, tmpl);\n\n dragEvent.dragLeave = dropEvents.leave.target = interaction.prevDropElement;\n dragEvent.prevDropzone = dropEvents.leave.dropzone = interaction.prevDropTarget;\n }\n // if the dropTarget is not null, create a dragenter event\n if (interaction.dropTarget) {\n dropEvents.enter = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n type : 'dragenter',\n };\n\n dragEvent.dragEnter = interaction.dropElement;\n dragEvent.dropzone = interaction.dropTarget;\n }\n }\n\n if (dragEvent.type === 'dragend' && interaction.dropTarget) {\n dropEvents.drop = utils.extend({ type: 'drop' }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n dragEvent.relatedTarget = interaction.dropElement;\n }\n if (dragEvent.type === 'dragstart') {\n dropEvents.activate = utils.extend({ type: 'dropactivate' }, tmpl);\n\n dropEvents.activate.target = null;\n dropEvents.activate.dropzone = null;\n }\n if (dragEvent.type === 'dragend') {\n dropEvents.deactivate = utils.extend({ type: 'dropdeactivate' }, tmpl);\n\n dropEvents.deactivate.target = null;\n dropEvents.deactivate.dropzone = null;\n }\n if (dragEvent.type === 'dragmove' && interaction.dropTarget) {\n dropEvents.move = utils.extend({\n dragmove : dragEvent,\n type : 'dropmove',\n }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n }\n\n return dropEvents;\n}\n\nfunction fireDropEvents (interaction, dropEvents) {\n if (dropEvents.leave) { interaction.prevDropTarget.fire(dropEvents.leave); }\n if (dropEvents.move ) { interaction.dropTarget.fire(dropEvents.move ); }\n if (dropEvents.enter) { interaction.dropTarget.fire(dropEvents.enter); }\n if (dropEvents.drop ) { interaction.dropTarget.fire(dropEvents.drop ); }\n if (dropEvents.deactivate) {\n fireActiveDrops(interaction, dropEvents.deactivate);\n }\n\n interaction.prevDropTarget = interaction.dropTarget;\n interaction.prevDropElement = interaction.dropElement;\n}\n\n/*\\\n * Interactable.dropzone\n [ method ]\n *\n * Returns or sets whether elements can be dropped onto this\n * Interactable to trigger drop events\n *\n * Dropzones can receive the following events:\n * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends\n * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone\n * - `dragmove` when a draggable that has entered the dropzone is moved\n * - `drop` when a draggable is dropped into this dropzone\n *\n * Use the `accept` option to allow only elements that match the given CSS\n * selector or element. The value can be:\n *\n * - **an Element** - only that element can be dropped into this dropzone.\n * - **a string**, - the element being dragged must match it as a CSS selector.\n * - **`null`** - accept options is cleared - it accepts any element.\n *\n * Use the `overlap` option to set how drops are checked for. The allowed\n * values are:\n *\n * - `'pointer'`, the pointer must be over the dropzone (default)\n * - `'center'`, the draggable element's center must be over the dropzone\n * - a number from 0-1 which is the `(intersection area) / (draggable area)`.\n * e.g. `0.5` for drop to happen when half of the area of the draggable is\n * over the dropzone\n *\n * Use the `checker` option to specify a function to check if a dragged\n * element is over this Interactable.\n *\n | interact(target)\n | .dropChecker(function(dragEvent, // related dragmove or dragend event\n | event, // TouchEvent/PointerEvent/MouseEvent\n | dropped, // bool result of the default checker\n | dropzone, // dropzone Interactable\n | dropElement, // dropzone elemnt\n | draggable, // draggable Interactable\n | draggableElement) {// draggable element\n |\n | return dropped && event.target.hasAttribute('allow-drop');\n | }\n *\n *\n - options (boolean | object | null) #optional The new value to be set.\n | interact('.drop').dropzone({\n | accept: '.can-drop' || document.getElementById('single-drop'),\n | overlap: 'pointer' || 'center' || zeroToOne\n | }\n = (boolean | object) The current setting or this Interactable\n\\*/\nInteractable.prototype.dropzone = function (options) {\n if (utils.is.object(options)) {\n this.options.drop.enabled = options.enabled === false? false: true;\n\n if (utils.is.function(options.ondrop) ) { this.events.ondrop = options.ondrop ; }\n if (utils.is.function(options.ondropactivate) ) { this.events.ondropactivate = options.ondropactivate ; }\n if (utils.is.function(options.ondropdeactivate)) { this.events.ondropdeactivate = options.ondropdeactivate; }\n if (utils.is.function(options.ondragenter) ) { this.events.ondragenter = options.ondragenter ; }\n if (utils.is.function(options.ondragleave) ) { this.events.ondragleave = options.ondragleave ; }\n if (utils.is.function(options.ondropmove) ) { this.events.ondropmove = options.ondropmove ; }\n\n if (/^(pointer|center)$/.test(options.overlap)) {\n this.options.drop.overlap = options.overlap;\n }\n else if (utils.is.number(options.overlap)) {\n this.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0);\n }\n if ('accept' in options) {\n this.options.drop.accept = options.accept;\n }\n if ('checker' in options) {\n this.options.drop.checker = options.checker;\n }\n\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drop.enabled = options;\n\n if (!options) {\n this.ondragenter = this.ondragleave = this.ondrop\n = this.ondropactivate = this.ondropdeactivate = null;\n }\n\n return this;\n }\n\n return this.options.drop;\n};\n\nInteractable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) {\n let dropped = false;\n\n // if the dropzone has no rect (eg. display: none)\n // call the custom dropChecker or just return false\n if (!(rect = rect || this.getRect(dropElement))) {\n return (this.options.drop.checker\n ? this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement)\n : false);\n }\n\n const dropOverlap = this.options.drop.overlap;\n\n if (dropOverlap === 'pointer') {\n const origin = utils.getOriginXY(draggable, draggableElement, 'drag');\n const page = utils.getPageXY(dragEvent);\n\n page.x += origin.x;\n page.y += origin.y;\n\n const horizontal = (page.x > rect.left) && (page.x < rect.right);\n const vertical = (page.y > rect.top ) && (page.y < rect.bottom);\n\n dropped = horizontal && vertical;\n }\n\n const dragRect = draggable.getRect(draggableElement);\n\n if (dragRect && dropOverlap === 'center') {\n const cx = dragRect.left + dragRect.width / 2;\n const cy = dragRect.top + dragRect.height / 2;\n\n dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom;\n }\n\n if (dragRect && utils.is.number(dropOverlap)) {\n const overlapArea = (Math.max(0, Math.min(rect.right , dragRect.right ) - Math.max(rect.left, dragRect.left))\n * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top , dragRect.top )));\n\n const overlapRatio = overlapArea / (dragRect.width * dragRect.height);\n\n dropped = overlapRatio >= dropOverlap;\n }\n\n if (this.options.drop.checker) {\n dropped = this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement);\n }\n\n return dropped;\n};\n\nInteractable.signals.on('unset', function ({ interactable }) {\n interactable.dropzone(false);\n});\n\nInteractable.settingsMethods.push('dropChecker');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.dropTarget = null; // the dropzone a drag target might be dropped into\n interaction.dropElement = null; // the element at the time of checking\n interaction.prevDropTarget = null; // the dropzone that was recently dragged away from\n interaction.prevDropElement = null; // the element at the time of checking\n interaction.dropEvents = null; // the dropEvents related to the current drag event\n\n interaction.activeDrops = {\n dropzones: [], // the dropzones that are mentioned below\n elements : [], // elements of dropzones that accept the target draggable\n rects : [], // the rects of the elements mentioned above\n };\n\n});\n\nInteraction.signals.on('stop', function ({ interaction }) {\n interaction.dropTarget = interaction.dropElement =\n interaction.prevDropTarget = interaction.prevDropElement = null;\n});\n\n/*\\\n * interact.dynamicDrop\n [ method ]\n *\n * Returns or sets whether the dimensions of dropzone elements are\n * calculated on every dragmove or only on dragstart for the default\n * dropChecker\n *\n - newValue (boolean) #optional True to check on each move. False to check only before start\n = (boolean | interact) The current setting or interact\n\\*/\ninteract.dynamicDrop = function (newValue) {\n if (utils.is.bool(newValue)) {\n //if (dragging && dynamicDrop !== newValue && !newValue) {\n //calcRects(dropzones);\n //}\n\n dynamicDrop = newValue;\n\n return interact;\n }\n return dynamicDrop;\n};\n\nutils.merge(Interactable.eventTypes, [\n 'dragenter',\n 'dragleave',\n 'dropactivate',\n 'dropdeactivate',\n 'dropmove',\n 'drop',\n]);\nactions.methodDict.drop = 'dropzone';\n\ndefaultOptions.drop = drop.defaults;\n\nmodule.exports = drop;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst gesture = {\n defaults: {\n enabled : false,\n origin : null,\n restrict: null,\n },\n\n checker: function (pointer, event, interactable, element, interaction) {\n if (interaction.pointerIds.length >= 2) {\n return { name: 'gesture' };\n }\n\n return null;\n },\n\n getCursor: function () {\n return '';\n },\n};\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturestart') { return; }\n iEvent.ds = 0;\n\n interaction.gesture.startDistance = interaction.gesture.prevDistance = iEvent.distance;\n interaction.gesture.startAngle = interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.scale = 1;\n});\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturemove') { return; }\n\n iEvent.ds = iEvent.scale - interaction.gesture.scale;\n\n interaction.target.fire(iEvent);\n\n interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.prevDistance = iEvent.distance;\n\n if (iEvent.scale !== Infinity\n && iEvent.scale !== null\n && iEvent.scale !== undefined\n && !isNaN(iEvent.scale)) {\n\n interaction.gesture.scale = iEvent.scale;\n }\n});\n\n/*\\\n * Interactable.gesturable\n [ method ]\n *\n * Gets or sets whether multitouch gestures can be performed on the\n * Interactable's element\n *\n = (boolean) Indicates if this can be the target of gesture events\n | var isGestureable = interact(element).gesturable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on gesture events (makes the Interactable gesturable)\n = (object) this Interactable\n | interact(element).gesturable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // limit multiple gestures.\n | // See the explanation in @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n\\*/\nInteractable.prototype.gesturable = function (options) {\n if (utils.is.object(options)) {\n this.options.gesture.enabled = options.enabled === false? false: true;\n this.setPerAction('gesture', options);\n this.setOnEvents('gesture', options);\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.gesture.enabled = options;\n\n if (!options) {\n this.ongesturestart = this.ongesturestart = this.ongestureend = null;\n }\n\n return this;\n }\n\n return this.options.gesture;\n};\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action, event, starting, ending, deltaSource }) {\n if (action !== 'gesture') { return; }\n\n const pointers = interaction.pointers;\n\n iEvent.touches = [pointers[0], pointers[1]];\n\n if (starting) {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = 1;\n iEvent.ds = 0;\n iEvent.angle = utils.touchAngle(pointers, undefined, deltaSource);\n iEvent.da = 0;\n }\n else if (ending || event instanceof InteractEvent) {\n iEvent.distance = interaction.prevEvent.distance;\n iEvent.box = interaction.prevEvent.box;\n iEvent.scale = interaction.prevEvent.scale;\n iEvent.ds = iEvent.scale - 1;\n iEvent.angle = interaction.prevEvent.angle;\n iEvent.da = iEvent.angle - interaction.gesture.startAngle;\n }\n else {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = iEvent.distance / interaction.gesture.startDistance;\n iEvent.angle = utils.touchAngle(pointers, interaction.gesture.prevAngle, deltaSource);\n\n iEvent.ds = iEvent.scale - interaction.gesture.prevScale;\n iEvent.da = iEvent.angle - interaction.gesture.prevAngle;\n }\n});\n\nInteraction.signals.on('new', function (interaction) {\n interaction.gesture = {\n start: { x: 0, y: 0 },\n\n startDistance: 0, // distance between two touches of touchStart\n prevDistance : 0,\n distance : 0,\n\n scale: 1, // gesture.distance / gesture.startDistance\n\n startAngle: 0, // angle of line joining two touches\n prevAngle : 0, // angle of the previous gesture event\n };\n});\n\nactions.gesture = gesture;\nactions.names.push('gesture');\nutils.merge(Interactable.eventTypes, [\n 'gesturestart',\n 'gesturemove',\n 'gestureend',\n]);\nactions.methodDict.gesture = 'gesturable';\n\ndefaultOptions.gesture = gesture.defaults;\n\nmodule.exports = gesture;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\n// Less Precision with touch input\nconst defaultMargin = browser.supportsTouch || browser.supportsPointerEvent? 20: 10;\n\nconst resize = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n square: false,\n preserveAspectRatio: false,\n axis: 'xy',\n\n // use default margin\n margin: NaN,\n\n // object with props left, right, top, bottom which are\n // true/false values to resize when the pointer is over that edge,\n // CSS selectors to match the handles for each direction\n // or the Elements for each handle\n edges: null,\n\n // a value of 'none' will limit the resize rect to a minimum of 0x0\n // 'negate' will alow the rect to have negative width/height\n // 'reposition' will keep the width/height positive by swapping\n // the top and bottom edges and/or swapping the left and right edges\n invert: 'none',\n },\n\n checker: function (pointer, event, interactable, element, interaction, rect) {\n if (!rect) { return null; }\n\n const page = utils.extend({}, interaction.curCoords.page);\n const options = interactable.options;\n\n if (options.resize.enabled) {\n const resizeOptions = options.resize;\n const resizeEdges = { left: false, right: false, top: false, bottom: false };\n\n // if using resize.edges\n if (utils.is.object(resizeOptions.edges)) {\n for (const edge in resizeEdges) {\n resizeEdges[edge] = checkResizeEdge(edge,\n resizeOptions.edges[edge],\n page,\n interaction._eventTarget,\n element,\n rect,\n resizeOptions.margin || defaultMargin);\n }\n\n resizeEdges.left = resizeEdges.left && !resizeEdges.right;\n resizeEdges.top = resizeEdges.top && !resizeEdges.bottom;\n\n if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) {\n return {\n name: 'resize',\n edges: resizeEdges,\n };\n }\n }\n else {\n const right = options.resize.axis !== 'y' && page.x > (rect.right - defaultMargin);\n const bottom = options.resize.axis !== 'x' && page.y > (rect.bottom - defaultMargin);\n\n if (right || bottom) {\n return {\n name: 'resize',\n axes: (right? 'x' : '') + (bottom? 'y' : ''),\n };\n }\n }\n }\n\n return null;\n },\n\n cursors: (browser.isIe9OrOlder ? {\n x : 'e-resize',\n y : 's-resize',\n xy: 'se-resize',\n\n top : 'n-resize',\n left : 'w-resize',\n bottom : 's-resize',\n right : 'e-resize',\n topleft : 'se-resize',\n bottomright: 'se-resize',\n topright : 'ne-resize',\n bottomleft : 'ne-resize',\n } : {\n x : 'ew-resize',\n y : 'ns-resize',\n xy: 'nwse-resize',\n\n top : 'ns-resize',\n left : 'ew-resize',\n bottom : 'ns-resize',\n right : 'ew-resize',\n topleft : 'nwse-resize',\n bottomright: 'nwse-resize',\n topright : 'nesw-resize',\n bottomleft : 'nesw-resize',\n }),\n\n getCursor: function (action) {\n if (action.axis) {\n return resize.cursors[action.name + action.axis];\n }\n else if (action.edges) {\n let cursorKey = '';\n const edgeNames = ['top', 'bottom', 'left', 'right'];\n\n for (let i = 0; i < 4; i++) {\n if (action.edges[edgeNames[i]]) {\n cursorKey += edgeNames[i];\n }\n }\n\n return resize.cursors[cursorKey];\n }\n },\n};\n\n// resizestart\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'resizestart' || !interaction.prepared.edges) {\n return;\n }\n\n const startRect = interaction.target.getRect(interaction.element);\n const resizeOptions = interaction.target.options.resize;\n\n /*\n * When using the `resizable.square` or `resizable.preserveAspectRatio` options, resizing from one edge\n * will affect another. E.g. with `resizable.square`, resizing to make the right edge larger will make\n * the bottom edge larger by the same amount. We call these 'linked' edges. Any linked edges will depend\n * on the active edges and the edge being interacted with.\n */\n if (resizeOptions.square || resizeOptions.preserveAspectRatio) {\n const linkedEdges = utils.extend({}, interaction.prepared.edges);\n\n linkedEdges.top = linkedEdges.top || (linkedEdges.left && !linkedEdges.bottom);\n linkedEdges.left = linkedEdges.left || (linkedEdges.top && !linkedEdges.right );\n linkedEdges.bottom = linkedEdges.bottom || (linkedEdges.right && !linkedEdges.top );\n linkedEdges.right = linkedEdges.right || (linkedEdges.bottom && !linkedEdges.left );\n\n interaction.prepared._linkedEdges = linkedEdges;\n }\n else {\n interaction.prepared._linkedEdges = null;\n }\n\n // if using `resizable.preserveAspectRatio` option, record aspect ratio at the start of the resize\n if (resizeOptions.preserveAspectRatio) {\n interaction.resizeStartAspectRatio = startRect.width / startRect.height;\n }\n\n interaction.resizeRects = {\n start : startRect,\n current : utils.extend({}, startRect),\n inverted : utils.extend({}, startRect),\n previous : utils.extend({}, startRect),\n delta : {\n left: 0, right : 0, width : 0,\n top : 0, bottom: 0, height: 0,\n },\n };\n\n iEvent.rect = interaction.resizeRects.inverted;\n iEvent.deltaRect = interaction.resizeRects.delta;\n});\n\n// resizemove\nInteractEvent.signals.on('new', function ({ iEvent, phase, interaction }) {\n if (phase !== 'move' || !interaction.prepared.edges) { return; }\n\n const resizeOptions = interaction.target.options.resize;\n const invert = resizeOptions.invert;\n const invertible = invert === 'reposition' || invert === 'negate';\n\n let edges = interaction.prepared.edges;\n\n const start = interaction.resizeRects.start;\n const current = interaction.resizeRects.current;\n const inverted = interaction.resizeRects.inverted;\n const delta = interaction.resizeRects.delta;\n const previous = utils.extend(interaction.resizeRects.previous, inverted);\n const originalEdges = edges;\n\n let dx = iEvent.dx;\n let dy = iEvent.dy;\n\n if (resizeOptions.preserveAspectRatio || resizeOptions.square) {\n // `resize.preserveAspectRatio` takes precedence over `resize.square`\n const startAspectRatio = resizeOptions.preserveAspectRatio\n ? interaction.resizeStartAspectRatio\n : 1;\n\n edges = interaction.prepared._linkedEdges;\n\n if ((originalEdges.left && originalEdges.bottom)\n || (originalEdges.right && originalEdges.top)) {\n dy = -dx / startAspectRatio;\n }\n else if (originalEdges.left || originalEdges.right ) { dy = dx / startAspectRatio; }\n else if (originalEdges.top || originalEdges.bottom) { dx = dy * startAspectRatio; }\n }\n\n // update the 'current' rect without modifications\n if (edges.top ) { current.top += dy; }\n if (edges.bottom) { current.bottom += dy; }\n if (edges.left ) { current.left += dx; }\n if (edges.right ) { current.right += dx; }\n\n if (invertible) {\n // if invertible, copy the current rect\n utils.extend(inverted, current);\n\n if (invert === 'reposition') {\n // swap edge values if necessary to keep width/height positive\n let swap;\n\n if (inverted.top > inverted.bottom) {\n swap = inverted.top;\n\n inverted.top = inverted.bottom;\n inverted.bottom = swap;\n }\n if (inverted.left > inverted.right) {\n swap = inverted.left;\n\n inverted.left = inverted.right;\n inverted.right = swap;\n }\n }\n }\n else {\n // if not invertible, restrict to minimum of 0x0 rect\n inverted.top = Math.min(current.top, start.bottom);\n inverted.bottom = Math.max(current.bottom, start.top);\n inverted.left = Math.min(current.left, start.right);\n inverted.right = Math.max(current.right, start.left);\n }\n\n inverted.width = inverted.right - inverted.left;\n inverted.height = inverted.bottom - inverted.top ;\n\n for (const edge in inverted) {\n delta[edge] = inverted[edge] - previous[edge];\n }\n\n iEvent.edges = interaction.prepared.edges;\n iEvent.rect = inverted;\n iEvent.deltaRect = delta;\n});\n\n/*\\\n * Interactable.resizable\n [ method ]\n *\n * Gets or sets whether resize actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of resize elements\n | var isResizeable = interact('input[type=text]').resizable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on resize events (object makes the Interactable resizable)\n = (object) This Interactable\n | interact(element).resizable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | edges: {\n | top : true, // Use pointer coords to check for resize.\n | left : false, // Disable resizing from left edge.\n | bottom: '.resize-s',// Resize if pointer target matches selector\n | right : handleEl // Resize if pointer target is the given Element\n | },\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height are adjusted at a 1:1 ratio.\n | square: false,\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height maintain the aspect ratio they had when resizing started.\n | preserveAspectRatio: false,\n |\n | // a value of 'none' will limit the resize rect to a minimum of 0x0\n | // 'negate' will allow the rect to have negative width/height\n | // 'reposition' will keep the width/height positive by swapping\n | // the top and bottom edges and/or swapping the left and right edges\n | invert: 'none' || 'negate' || 'reposition'\n |\n | // limit multiple resizes.\n | // See the explanation in the @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n \\*/\nInteractable.prototype.resizable = function (options) {\n if (utils.is.object(options)) {\n this.options.resize.enabled = options.enabled === false? false: true;\n this.setPerAction('resize', options);\n this.setOnEvents('resize', options);\n\n if (/^x$|^y$|^xy$/.test(options.axis)) {\n this.options.resize.axis = options.axis;\n }\n else if (options.axis === null) {\n this.options.resize.axis = defaultOptions.resize.axis;\n }\n\n if (utils.is.bool(options.preserveAspectRatio)) {\n this.options.resize.preserveAspectRatio = options.preserveAspectRatio;\n }\n else if (utils.is.bool(options.square)) {\n this.options.resize.square = options.square;\n }\n\n return this;\n }\n if (utils.is.bool(options)) {\n this.options.resize.enabled = options;\n\n if (!options) {\n this.onresizestart = this.onresizestart = this.onresizeend = null;\n }\n\n return this;\n }\n return this.options.resize;\n};\n\nfunction checkResizeEdge (name, value, page, element, interactableElement, rect, margin) {\n // false, '', undefined, null\n if (!value) { return false; }\n\n // true value, use pointer coords and element rect\n if (value === true) {\n // if dimensions are negative, \"switch\" edges\n const width = utils.is.number(rect.width )? rect.width : rect.right - rect.left;\n const height = utils.is.number(rect.height)? rect.height : rect.bottom - rect.top ;\n\n if (width < 0) {\n if (name === 'left' ) { name = 'right'; }\n else if (name === 'right') { name = 'left' ; }\n }\n if (height < 0) {\n if (name === 'top' ) { name = 'bottom'; }\n else if (name === 'bottom') { name = 'top' ; }\n }\n\n if (name === 'left' ) { return page.x < ((width >= 0? rect.left: rect.right ) + margin); }\n if (name === 'top' ) { return page.y < ((height >= 0? rect.top : rect.bottom) + margin); }\n\n if (name === 'right' ) { return page.x > ((width >= 0? rect.right : rect.left) - margin); }\n if (name === 'bottom') { return page.y > ((height >= 0? rect.bottom: rect.top ) - margin); }\n }\n\n // the remaining checks require an element\n if (!utils.is.element(element)) { return false; }\n\n return utils.is.element(value)\n // the value is an element to use as a resize handle\n ? value === element\n // otherwise check if element matches value as selector\n : utils.matchesUpTo(element, value, interactableElement);\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.resizeAxes = 'xy';\n});\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action }) {\n if (action !== 'resize' || !interaction.resizeAxes) { return; }\n\n const options = interaction.target.options;\n\n if (options.resize.square) {\n if (interaction.resizeAxes === 'y') {\n iEvent.dx = iEvent.dy;\n }\n else {\n iEvent.dy = iEvent.dx;\n }\n iEvent.axes = 'xy';\n }\n else {\n iEvent.axes = interaction.resizeAxes;\n\n if (interaction.resizeAxes === 'x') {\n iEvent.dy = 0;\n }\n else if (interaction.resizeAxes === 'y') {\n iEvent.dx = 0;\n }\n }\n});\n\nactions.resize = resize;\nactions.names.push('resize');\nutils.merge(Interactable.eventTypes, [\n 'resizestart',\n 'resizemove',\n 'resizeinertiastart',\n 'resizeinertiaresume',\n 'resizeend',\n]);\nactions.methodDict.resize = 'resizable';\n\ndefaultOptions.resize = resize.defaults;\n\nmodule.exports = resize;\n","const raf = require('./utils/raf');\nconst getWindow = require('./utils/window').getWindow;\nconst is = require('./utils/is');\nconst domUtils = require('./utils/domUtils');\nconst Interaction = require('./Interaction');\nconst defaultOptions = require('./defaultOptions');\n\nconst autoScroll = {\n defaults: {\n enabled : false,\n container: null, // the item that is scrolled (Window or HTMLElement)\n margin : 60,\n speed : 300, // the scroll speed in pixels per second\n },\n\n interaction: null,\n i: null, // the handle returned by window.setInterval\n x: 0, y: 0, // Direction each pulse is to scroll in\n\n isScrolling: false,\n prevTime: 0,\n\n start: function (interaction) {\n autoScroll.isScrolling = true;\n raf.cancel(autoScroll.i);\n\n autoScroll.interaction = interaction;\n autoScroll.prevTime = new Date().getTime();\n autoScroll.i = raf.request(autoScroll.scroll);\n },\n\n stop: function () {\n autoScroll.isScrolling = false;\n raf.cancel(autoScroll.i);\n },\n\n // scroll the window by the values in scroll.x/y\n scroll: function () {\n const options = autoScroll.interaction.target.options[autoScroll.interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(autoScroll.interaction.element);\n const now = new Date().getTime();\n // change in time in seconds\n const dt = (now - autoScroll.prevTime) / 1000;\n // displacement\n const s = options.speed * dt;\n\n if (s >= 1) {\n if (is.window(container)) {\n container.scrollBy(autoScroll.x * s, autoScroll.y * s);\n }\n else if (container) {\n container.scrollLeft += autoScroll.x * s;\n container.scrollTop += autoScroll.y * s;\n }\n\n autoScroll.prevTime = now;\n }\n\n if (autoScroll.isScrolling) {\n raf.cancel(autoScroll.i);\n autoScroll.i = raf.request(autoScroll.scroll);\n }\n },\n check: function (interactable, actionName) {\n const options = interactable.options;\n\n return options[actionName].autoScroll && options[actionName].autoScroll.enabled;\n },\n onInteractionMove: function ({ interaction, pointer }) {\n if (!(interaction.interacting()\n && autoScroll.check(interaction.target, interaction.prepared.name))) {\n return;\n }\n\n if (interaction.simulation) {\n autoScroll.x = autoScroll.y = 0;\n return;\n }\n\n let top;\n let right;\n let bottom;\n let left;\n\n const options = interaction.target.options[interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(interaction.element);\n\n if (is.window(container)) {\n left = pointer.clientX < autoScroll.margin;\n top = pointer.clientY < autoScroll.margin;\n right = pointer.clientX > container.innerWidth - autoScroll.margin;\n bottom = pointer.clientY > container.innerHeight - autoScroll.margin;\n }\n else {\n const rect = domUtils.getElementClientRect(container);\n\n left = pointer.clientX < rect.left + autoScroll.margin;\n top = pointer.clientY < rect.top + autoScroll.margin;\n right = pointer.clientX > rect.right - autoScroll.margin;\n bottom = pointer.clientY > rect.bottom - autoScroll.margin;\n }\n\n autoScroll.x = (right ? 1: left? -1: 0);\n autoScroll.y = (bottom? 1: top? -1: 0);\n\n if (!autoScroll.isScrolling) {\n // set the autoScroll properties to those of the target\n autoScroll.margin = options.margin;\n autoScroll.speed = options.speed;\n\n autoScroll.start(interaction);\n }\n },\n};\n\nInteraction.signals.on('stop-active', function () {\n autoScroll.stop();\n});\n\nInteraction.signals.on('action-move', autoScroll.onInteractionMove);\n\ndefaultOptions.perAction.autoScroll = autoScroll.defaults;\n\nmodule.exports = autoScroll;\n","const Interactable = require('../Interactable');\nconst actions = require('../actions/base');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.ignoreFrom\n [ method ]\n *\n * If the target of the `mousedown`, `pointerdown` or `touchstart`\n * event or any of it's parents match the given CSS selector or\n * Element, no drag/resize/gesture is started.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to not ignore any elements\n = (string | Element | object) The current ignoreFrom value or this Interactable\n **\n | interact(element, { ignoreFrom: document.getElementById('no-action') });\n | // or\n | interact(element).ignoreFrom('input, textarea, a');\n\\*/\nInteractable.prototype.ignoreFrom = function (newValue) {\n return this._backCompatOption('ignoreFrom', newValue);\n};\n\n/*\\\n * Interactable.allowFrom\n [ method ]\n *\n * A drag/resize/gesture is started only If the target of the\n * `mousedown`, `pointerdown` or `touchstart` event or any of it's\n * parents match the given CSS selector or Element.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to allow from any element\n = (string | Element | object) The current allowFrom value or this Interactable\n **\n | interact(element, { allowFrom: document.getElementById('drag-handle') });\n | // or\n | interact(element).allowFrom('.handle');\n\\*/\nInteractable.prototype.allowFrom = function (newValue) {\n return this._backCompatOption('allowFrom', newValue);\n};\n\nInteractable.prototype.testIgnore = function (ignoreFrom, interactableElement, element) {\n if (!ignoreFrom || !is.element(element)) { return false; }\n\n if (is.string(ignoreFrom)) {\n return domUtils.matchesUpTo(element, ignoreFrom, interactableElement);\n }\n else if (is.element(ignoreFrom)) {\n return domUtils.nodeContains(ignoreFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testAllow = function (allowFrom, interactableElement, element) {\n if (!allowFrom) { return true; }\n\n if (!is.element(element)) { return false; }\n\n if (is.string(allowFrom)) {\n return domUtils.matchesUpTo(element, allowFrom, interactableElement);\n }\n else if (is.element(allowFrom)) {\n return domUtils.nodeContains(allowFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testIgnoreAllow = function (options, interactableElement, eventTarget) {\n return (!this.testIgnore(options.ignoreFrom, interactableElement, eventTarget)\n && this.testAllow(options.allowFrom, interactableElement, eventTarget));\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (event.buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\n","const interact = require('../interact');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst actions = require('../actions/base');\nconst defaultOptions = require('../defaultOptions');\nconst browser = require('../utils/browser');\nconst scope = require('../scope');\nconst utils = require('../utils');\nconst signals = require('../utils/Signals').new();\n\nrequire('./InteractableMethods');\n\nconst autoStart = {\n signals,\n withinInteractionLimit,\n // Allow this many interactions to happen simultaneously\n maxInteractions: Infinity,\n defaults: {\n perAction: {\n manualStart: false,\n max: Infinity,\n maxPerElement: 1,\n allowFrom: null,\n ignoreFrom: null,\n },\n },\n setActionDefaults: function (action) {\n utils.extend(action.defaults, autoStart.defaults.perAction);\n },\n};\n\n// set cursor style on mousedown\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget }) {\n if (interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\n// set cursor style on mousemove\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget }) {\n if (!interaction.mouse\n || interaction.pointerIsDown\n || interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\nInteraction.signals.on('move', function (arg) {\n const { interaction, event } = arg;\n\n if (!interaction.pointerIsDown\n || interaction.interacting()\n || !interaction.pointerWasMoved\n || !interaction.prepared.name) {\n return;\n }\n\n signals.fire('before-start', arg);\n\n const target = interaction.target;\n\n if (interaction.prepared.name && target) {\n // check manualStart and interaction limit\n if (target.options[interaction.prepared.name].manualStart\n || !withinInteractionLimit(target, interaction.element, interaction.prepared)) {\n interaction.stop(event);\n }\n else {\n interaction.start(interaction.prepared, target, interaction.element);\n }\n }\n});\n\n// Check if the current target supports the action.\n// If so, return the validated action. Otherwise, return null\nfunction validateAction (action, interactable, element, eventTarget) {\n if (utils.is.object(action)\n && interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget)\n && interactable.options[action.name].enabled\n && withinInteractionLimit(interactable, element, action)) {\n return action;\n }\n\n return null;\n}\n\nfunction validateSelector (interaction, pointer, event, matches, matchElements, eventTarget) {\n for (let i = 0, len = matches.length; i < len; i++) {\n const match = matches[i];\n const matchElement = matchElements[i];\n const action = validateAction(match.getAction(pointer, event, interaction, matchElement),\n match,\n matchElement,\n eventTarget);\n\n if (action) {\n return {\n action,\n target: match,\n element: matchElement,\n };\n }\n }\n\n return {};\n}\n\nfunction getActionInfo (interaction, pointer, event, eventTarget) {\n let matches = [];\n let matchElements = [];\n\n let element = eventTarget;\n let action = null;\n\n function pushMatches (interactable, selector, context) {\n const elements = (browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined);\n\n if (utils.matchesSelector(element, selector, elements)) {\n\n matches.push(interactable);\n matchElements.push(element);\n }\n }\n\n while (utils.is.element(element)) {\n matches = [];\n matchElements = [];\n\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && (action = validateAction(elementInteractable.getAction(pointer, event, interaction, element, eventTarget),\n elementInteractable,\n element,\n eventTarget))\n && !elementInteractable.options[action.name].manualStart) {\n return {\n element,\n action,\n target: elementInteractable,\n };\n }\n else {\n scope.interactables.forEachSelector(pushMatches, element);\n\n const actionInfo = validateSelector(interaction, pointer, event, matches, matchElements, eventTarget);\n\n if (actionInfo.action\n && !actionInfo.target.options[actionInfo.action.name].manualStart) {\n return actionInfo;\n }\n }\n\n element = utils.parentNode(element);\n }\n\n return {};\n}\n\nfunction prepare (interaction, { action, target, element }) {\n action = action || {};\n\n if (interaction.target && interaction.target.options.styleCursor) {\n interaction.target._doc.documentElement.style.cursor = '';\n }\n\n interaction.target = target;\n interaction.element = element;\n utils.copyAction(interaction.prepared, action);\n\n if (target && target.options.styleCursor) {\n const cursor = action? actions[action.name].getCursor(action) : '';\n interaction.target._doc.documentElement.style.cursor = cursor;\n }\n\n signals.fire('prepared', { interaction: interaction });\n}\n\nInteraction.signals.on('stop', function ({ interaction }) {\n const target = interaction.target;\n\n if (target && target.options.styleCursor) {\n target._doc.documentElement.style.cursor = '';\n }\n});\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (utils.is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (utils.is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n const buttons = event.buttons || ({\n 0: 1,\n 1: 4,\n 3: 8,\n 4: 16,\n })[event.button];\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\nfunction withinInteractionLimit (interactable, element, action) {\n const options = interactable.options;\n const maxActions = options[action.name].max;\n const maxPerElement = options[action.name].maxPerElement;\n let activeInteractions = 0;\n let targetCount = 0;\n let targetElementCount = 0;\n\n // no actions if any of these values == 0\n if (!(maxActions && maxPerElement && autoStart.maxInteractions)) { return; }\n\n for (let i = 0, len = scope.interactions.length; i < len; i++) {\n const interaction = scope.interactions[i];\n const otherAction = interaction.prepared.name;\n\n if (!interaction.interacting()) { continue; }\n\n activeInteractions++;\n\n if (activeInteractions >= autoStart.maxInteractions) {\n return false;\n }\n\n if (interaction.target !== interactable) { continue; }\n\n targetCount += (otherAction === action.name)|0;\n\n if (targetCount >= maxActions) {\n return false;\n }\n\n if (interaction.element === element) {\n targetElementCount++;\n\n if (otherAction !== action.name || targetElementCount >= maxPerElement) {\n return false;\n }\n }\n }\n\n return autoStart.maxInteractions > 0;\n}\n\n/*\\\n * interact.maxInteractions\n [ method ]\n **\n * Returns or sets the maximum number of concurrent interactions allowed.\n * By default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables\n * and elements, you need to enable it in the draggable, resizable and\n * gesturable `'max'` and `'maxPerElement'` options.\n **\n - newValue (number) #optional Any number. newValue <= 0 means no interactions.\n\\*/\ninteract.maxInteractions = function (newValue) {\n if (utils.is.number(newValue)) {\n autoStart.maxInteractions = newValue;\n\n return this;\n }\n\n return autoStart.maxInteractions;\n};\n\nInteractable.settingsMethods.push('styleCursor');\nInteractable.settingsMethods.push('actionChecker');\nInteractable.settingsMethods.push('ignoreFrom');\nInteractable.settingsMethods.push('allowFrom');\n\ndefaultOptions.base.actionChecker = null;\ndefaultOptions.base.styleCursor = true;\n\nutils.extend(defaultOptions.perAction, autoStart.defaults.perAction);\n\nmodule.exports = autoStart;\n","const autoStart = require('./base');\nconst Interaction = require('../Interaction');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.delayTimer = null;\n});\n\nautoStart.signals.on('prepared', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.delayTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.target, interaction.element);\n }, delay);\n }\n});\n\nInteraction.signals.on('move', function ({ interaction, duplicate }) {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.delayTimer);\n }\n});\n\n// prevent regular down->move autoStart\nautoStart.signals.on('before-start', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.prepared.name = null;\n }\n});\n","const autoStart = require('./base');\nconst scope = require('../scope');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\n\nconst { matchesSelector, parentNode } = require('../utils/domUtils');\n\nautoStart.setActionDefaults(require('../actions/drag'));\n\nautoStart.signals.on('before-start', function ({ interaction, eventTarget, dx, dy }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // check if a drag is in the correct axis\n const absX = Math.abs(dx);\n const absY = Math.abs(dy);\n const options = interaction.target.options.drag;\n const startAxis = options.startAxis;\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy');\n\n interaction.prepared.axis = options.lockAxis === 'start'\n ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n : options.lockAxis;\n\n // if the movement isn't in the startAxis of the interactable\n if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) {\n // cancel the prepared action\n interaction.prepared.name = null;\n\n // then try to get a drag from another ineractable\n\n if (!interaction.prepared.name) {\n\n let element = eventTarget;\n\n const getDraggable = function (interactable, selector, context) {\n const elements = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n if (interactable === interaction.target) { return; }\n\n if (!options.manualStart\n && !interactable.testIgnoreAllow(options, element, eventTarget)\n && matchesSelector(element, selector, elements)) {\n\n const action = interactable.getAction(interaction.downPointer,\n interaction.downEvent,\n interaction,\n element);\n\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, interactable)\n && autoStart.validateAction(action, interactable, element, eventTarget)) {\n\n return interactable;\n }\n }\n };\n\n let action = null;\n\n // check all interactables\n while (is.element(element)) {\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && elementInteractable !== interaction.target\n && !elementInteractable.options.drag.manualStart) {\n\n action = elementInteractable.getAction(interaction.downPointer, interaction.downEvent, interaction, element);\n }\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, elementInteractable)) {\n\n interaction.prepared.name = 'drag';\n interaction.target = elementInteractable;\n interaction.element = element;\n break;\n }\n\n const selectorInteractable = scope.interactables.forEachSelector(getDraggable, element);\n\n if (selectorInteractable) {\n interaction.prepared.name = 'drag';\n interaction.target = selectorInteractable;\n interaction.element = element;\n break;\n }\n\n element = parentNode(element);\n }\n }\n }\n});\n\nfunction checkStartAxis (startAxis, interactable) {\n if (!interactable) { return false; }\n\n const thisAxis = interactable.options.drag.startAxis;\n\n return (startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis);\n}\n","require('./base').setActionDefaults(require('../actions/gesture'));\n","require('./base').setActionDefaults(require('../actions/resize'));\n","module.exports = {\n base: {\n accept : null,\n preventDefault: 'auto',\n deltaSource : 'page',\n },\n\n perAction: {\n origin: { x: 0, y: 0 },\n\n // only allow left button by default\n // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n mouseButtons: 1,\n\n inertia: {\n enabled : false,\n resistance : 10, // the lambda in exponential decay\n minSpeed : 100, // target speed must be above this for inertia to start\n endSpeed : 10, // the speed at which inertia is slow enough to stop\n allowResume : true, // allow resuming an action in inertia phase\n smoothEndDuration: 300, // animate to snap/restrict endOnly if there's no inertia\n },\n },\n};\n","/* browser entry point */\n\n// Legacy browser support\nrequire('./legacyBrowsers');\n\n// inertia\nrequire('./inertia');\n\n// modifiers\nrequire('./modifiers/snap');\nrequire('./modifiers/restrict');\n\n// pointerEvents\nrequire('./pointerEvents/base');\nrequire('./pointerEvents/holdRepeat');\nrequire('./pointerEvents/interactableTargets');\n\n// delay\nrequire('./autoStart/delay');\n\n// actions\nrequire('./actions/gesture');\nrequire('./actions/resize');\nrequire('./actions/drag');\nrequire('./actions/drop');\n\n// load these modifiers after resize is loaded\nrequire('./modifiers/snapSize');\nrequire('./modifiers/restrictEdges');\nrequire('./modifiers/restrictSize');\n\n// autoStart actions\nrequire('./autoStart/gesture');\nrequire('./autoStart/resize');\nrequire('./autoStart/drag');\n\n// Interactable preventDefault setting\nrequire('./interactablePreventDefault.js');\n\n// autoScroll\nrequire('./autoScroll');\n\n// export interact\nmodule.exports = require('./interact');\n","const InteractEvent = require('./InteractEvent');\nconst Interaction = require('./Interaction');\nconst modifiers = require('./modifiers');\nconst utils = require('./utils');\nconst animationFrame = require('./utils/raf');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.inertiaStatus = {\n active : false,\n smoothEnd : false,\n allowResume: false,\n\n startEvent: null,\n upCoords : {},\n\n xe: 0, ye: 0,\n sx: 0, sy: 0,\n\n t0: 0,\n vx0: 0, vys: 0,\n duration: 0,\n\n lambda_v0: 0,\n one_ve_v0: 0,\n i : null,\n };\n\n interaction.boundInertiaFrame = () => inertiaFrame .apply(interaction);\n interaction.boundSmoothEndFrame = () => smoothEndFrame.apply(interaction);\n});\n\nInteraction.signals.on('down', function ({ interaction, event, pointer, eventTarget }) {\n const status = interaction.inertiaStatus;\n\n // Check if the down event hits the current inertia target\n if (status.active) {\n let element = eventTarget;\n\n // climb up the DOM tree from the event target\n while (utils.is.element(element)) {\n\n // if interaction element is the current inertia target element\n if (element === interaction.element) {\n // stop inertia\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n\n // update pointers to the down event's coordinates\n interaction.updatePointer(pointer);\n utils.setCoords(interaction.curCoords, interaction.pointers);\n\n // fire appropriate signals\n const signalArg = { interaction };\n Interaction.signals.fire('before-action-move', signalArg);\n Interaction.signals.fire('action-resume' , signalArg);\n\n // fire a reume event\n const resumeEvent = new InteractEvent(interaction,\n event,\n interaction.prepared.name,\n 'inertiaresume',\n interaction.element);\n\n interaction.target.fire(resumeEvent);\n interaction.prevEvent = resumeEvent;\n modifiers.resetStatuses(interaction.modifierStatuses);\n\n utils.copyCoords(interaction.prevCoords, interaction.curCoords);\n break;\n }\n\n element = utils.parentNode(element);\n }\n }\n});\n\nInteraction.signals.on('up', function ({ interaction, event }) {\n const status = interaction.inertiaStatus;\n\n if (!interaction.interacting() || status.active) { return; }\n\n const target = interaction.target;\n const options = target && target.options;\n const inertiaOptions = options && interaction.prepared.name && options[interaction.prepared.name].inertia;\n\n const now = new Date().getTime();\n const statuses = {};\n const page = utils.extend({}, interaction.curCoords.page);\n const pointerSpeed = interaction.pointerDelta.client.speed;\n\n let smoothEnd = false;\n let modifierResult;\n\n // check if inertia should be started\n const inertiaPossible = (inertiaOptions && inertiaOptions.enabled\n && interaction.prepared.name !== 'gesture'\n && event !== status.startEvent);\n\n const inertia = (inertiaPossible\n && (now - interaction.curCoords.timeStamp) < 50\n && pointerSpeed > inertiaOptions.minSpeed\n && pointerSpeed > inertiaOptions.endSpeed);\n\n const modifierArg = {\n interaction,\n pageCoords: page,\n statuses,\n preEnd: true,\n requireEndOnly: true,\n };\n\n // smoothEnd\n if (inertiaPossible && !inertia) {\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n if (modifierResult.shouldMove && modifierResult.locked) {\n smoothEnd = true;\n }\n }\n\n if (!(inertia || smoothEnd)) { return; }\n\n utils.copyCoords(status.upCoords, interaction.curCoords);\n\n interaction.pointers[0] = status.startEvent =\n new InteractEvent(interaction, event, interaction.prepared.name, 'inertiastart', interaction.element);\n\n status.t0 = now;\n\n status.active = true;\n status.allowResume = inertiaOptions.allowResume;\n interaction.simulation = status;\n\n target.fire(status.startEvent);\n\n if (inertia) {\n status.vx0 = interaction.pointerDelta.client.vx;\n status.vy0 = interaction.pointerDelta.client.vy;\n status.v0 = pointerSpeed;\n\n calcInertia(interaction, status);\n\n utils.extend(page, interaction.curCoords.page);\n\n page.x += status.xe;\n page.y += status.ye;\n\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n status.modifiedXe += modifierResult.dx;\n status.modifiedYe += modifierResult.dy;\n\n status.i = animationFrame.request(interaction.boundInertiaFrame);\n }\n else {\n status.smoothEnd = true;\n status.xe = modifierResult.dx;\n status.ye = modifierResult.dy;\n\n status.sx = status.sy = 0;\n\n status.i = animationFrame.request(interaction.boundSmoothEndFrame);\n }\n});\n\nInteraction.signals.on('stop-active', function ({ interaction }) {\n const status = interaction.inertiaStatus;\n\n if (status.active) {\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n }\n});\n\nfunction calcInertia (interaction, status) {\n const inertiaOptions = interaction.target.options[interaction.prepared.name].inertia;\n const lambda = inertiaOptions.resistance;\n const inertiaDur = -Math.log(inertiaOptions.endSpeed / status.v0) / lambda;\n\n status.x0 = interaction.prevEvent.pageX;\n status.y0 = interaction.prevEvent.pageY;\n status.t0 = status.startEvent.timeStamp / 1000;\n status.sx = status.sy = 0;\n\n status.modifiedXe = status.xe = (status.vx0 - inertiaDur) / lambda;\n status.modifiedYe = status.ye = (status.vy0 - inertiaDur) / lambda;\n status.te = inertiaDur;\n\n status.lambda_v0 = lambda / status.v0;\n status.one_ve_v0 = 1 - inertiaOptions.endSpeed / status.v0;\n}\n\nfunction inertiaFrame () {\n updateInertiaCoords(this);\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n\n const status = this.inertiaStatus;\n const options = this.target.options[this.prepared.name].inertia;\n const lambda = options.resistance;\n const t = new Date().getTime() / 1000 - status.t0;\n\n if (t < status.te) {\n\n const progress = 1 - (Math.exp(-lambda * t) - status.lambda_v0) / status.one_ve_v0;\n\n if (status.modifiedXe === status.xe && status.modifiedYe === status.ye) {\n status.sx = status.xe * progress;\n status.sy = status.ye * progress;\n }\n else {\n const quadPoint = utils.getQuadraticCurvePoint(0, 0,\n status.xe,\n status.ye,\n status.modifiedXe,\n status.modifiedYe,\n progress);\n\n status.sx = quadPoint.x;\n status.sy = quadPoint.y;\n }\n\n this.doMove();\n\n status.i = animationFrame.request(this.boundInertiaFrame);\n }\n else {\n status.sx = status.modifiedXe;\n status.sy = status.modifiedYe;\n\n this.doMove();\n this.end(status.startEvent);\n status.active = false;\n this.simulation = null;\n }\n\n utils.copyCoords(this.prevCoords, this.curCoords);\n}\n\nfunction smoothEndFrame () {\n updateInertiaCoords(this);\n\n const status = this.inertiaStatus;\n const t = new Date().getTime() - status.t0;\n const duration = this.target.options[this.prepared.name].inertia.smoothEndDuration;\n\n if (t < duration) {\n status.sx = utils.easeOutQuad(t, 0, status.xe, duration);\n status.sy = utils.easeOutQuad(t, 0, status.ye, duration);\n\n this.pointerMove(status.startEvent, status.startEvent);\n\n status.i = animationFrame.request(this.boundSmoothEndFrame);\n }\n else {\n status.sx = status.xe;\n status.sy = status.ye;\n\n this.pointerMove(status.startEvent, status.startEvent);\n this.end(status.startEvent);\n\n status.smoothEnd =\n status.active = false;\n this.simulation = null;\n }\n}\n\nfunction updateInertiaCoords (interaction) {\n const status = interaction.inertiaStatus;\n\n // return if inertia isn't running\n if (!status.active) { return; }\n\n const pageUp = status.upCoords.page;\n const clientUp = status.upCoords.client;\n\n utils.setCoords(interaction.curCoords, [ {\n pageX : pageUp.x + status.sx,\n pageY : pageUp.y + status.sy,\n clientX: clientUp.x + status.sx,\n clientY: clientUp.y + status.sy,\n } ]);\n}\n","const browser = require('./utils/browser');\nconst events = require('./utils/events');\nconst utils = require('./utils');\nconst scope = require('./scope');\nconst Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\n\nconst globalEvents = {};\n\n/*\\\n * interact\n [ method ]\n *\n * The methods of this variable can be used to set elements as\n * interactables and also to change various default settings.\n *\n * Calling it as a function and passing an element or a valid CSS selector\n * string returns an Interactable object which has various methods to\n * configure it.\n *\n - element (Element | string) The HTML or SVG Element to interact with or CSS selector\n = (object) An @Interactable\n *\n > Usage\n | interact('#draggable').draggable(true);\n |\n | var rectables = interact('rect');\n | rectables\n | .gesturable(true)\n | .on('gesturemove', function (event) {\n | // ...\n | });\n\\*/\nfunction interact (element, options) {\n let interactable = scope.interactables.get(element, options);\n\n if (!interactable) {\n interactable = new Interactable(element, options);\n interactable.events.global = globalEvents;\n }\n\n return interactable;\n}\n\n/*\\\n * interact.isSet\n [ method ]\n *\n * Check if an element has been set\n - element (Element) The Element being searched for\n = (boolean) Indicates if the element or CSS selector was previously passed to interact\n\\*/\ninteract.isSet = function (element, options) {\n return scope.interactables.indexOfElement(element, options && options.context) !== -1;\n};\n\n/*\\\n * interact.on\n [ method ]\n *\n * Adds a global listener for an InteractEvent or adds a DOM event to\n * `document`\n *\n - type (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) interact\n\\*/\ninteract.on = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.on(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.on(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n // if it is an InteractEvent type, add listener to globalEvents\n if (utils.contains(Interactable.eventTypes, type)) {\n // if this type of event was never bound\n if (!globalEvents[type]) {\n globalEvents[type] = [listener];\n }\n else {\n globalEvents[type].push(listener);\n }\n }\n // If non InteractEvent type, addEventListener to document\n else {\n events.add(scope.document, type, listener, { options });\n }\n\n return interact;\n};\n\n/*\\\n * interact.off\n [ method ]\n *\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n - type (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) interact\n \\*/\ninteract.off = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.off(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.off(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n if (!utils.contains(Interactable.eventTypes, type)) {\n events.remove(scope.document, type, listener, options);\n }\n else {\n let index;\n\n if (type in globalEvents\n && (index = utils.indexOf(globalEvents[type], listener)) !== -1) {\n globalEvents[type].splice(index, 1);\n }\n }\n\n return interact;\n};\n\n/*\\\n * interact.debug\n [ method ]\n *\n * Returns an object which exposes internal data\n = (object) An object with properties that outline the current state and expose internal functions and variables\n\\*/\ninteract.debug = function () {\n return scope;\n};\n\n// expose the functions used to calculate multi-touch properties\ninteract.getPointerAverage = utils.pointerAverage;\ninteract.getTouchBBox = utils.touchBBox;\ninteract.getTouchDistance = utils.touchDistance;\ninteract.getTouchAngle = utils.touchAngle;\n\ninteract.getElementRect = utils.getElementRect;\ninteract.getElementClientRect = utils.getElementClientRect;\ninteract.matchesSelector = utils.matchesSelector;\ninteract.closest = utils.closest;\n\n/*\\\n * interact.supportsTouch\n [ method ]\n *\n = (boolean) Whether or not the browser supports touch input\n\\*/\ninteract.supportsTouch = function () {\n return browser.supportsTouch;\n};\n\n/*\\\n * interact.supportsPointerEvent\n [ method ]\n *\n = (boolean) Whether or not the browser supports PointerEvents\n\\*/\ninteract.supportsPointerEvent = function () {\n return browser.supportsPointerEvent;\n};\n\n/*\\\n * interact.stop\n [ method ]\n *\n * Cancels all interactions (end events are not fired)\n *\n - event (Event) An event on which to call preventDefault()\n = (object) interact\n\\*/\ninteract.stop = function (event) {\n for (let i = scope.interactions.length - 1; i >= 0; i--) {\n scope.interactions[i].stop(event);\n }\n\n return interact;\n};\n\n/*\\\n * interact.pointerMoveTolerance\n [ method ]\n * Returns or sets the distance the pointer must be moved before an action\n * sequence occurs. This also affects tolerance for tap events.\n *\n - newValue (number) #optional The movement from the start position must be greater than this value\n = (number | Interactable) The current setting or interact\n\\*/\ninteract.pointerMoveTolerance = function (newValue) {\n if (utils.is.number(newValue)) {\n Interaction.pointerMoveTolerance = newValue;\n\n return this;\n }\n\n return Interaction.pointerMoveTolerance;\n};\n\ninteract.addDocument = scope.addDocument;\ninteract.removeDocument = scope.removeDocument;\n\nscope.interact = interact;\n\nmodule.exports = interact;\n","const Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\nconst scope = require('./scope');\nconst is = require('./utils/is');\nconst events = require('./utils/events');\n\nconst { nodeContains, matchesSelector } = require('./utils/domUtils');\n\n/*\\\n * Interactable.preventDefault\n [ method ]\n *\n * Returns or sets whether to prevent the browser's default behaviour\n * in response to pointer events. Can be set to:\n * - `'always'` to always prevent\n * - `'never'` to never prevent\n * - `'auto'` to let interact.js try to determine what would be best\n *\n - newValue (string) #optional `true`, `false` or `'auto'`\n = (string | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.preventDefault = function (newValue) {\n if (/^(always|never|auto)$/.test(newValue)) {\n this.options.preventDefault = newValue;\n return this;\n }\n\n if (is.bool(newValue)) {\n this.options.preventDefault = newValue? 'always' : 'never';\n return this;\n }\n\n return this.options.preventDefault;\n};\n\nInteractable.prototype.checkAndPreventDefault = function (event) {\n const setting = this.options.preventDefault;\n\n if (setting === 'never') { return; }\n\n if (setting === 'always') {\n event.preventDefault();\n return;\n }\n\n // setting === 'auto'\n\n // don't preventDefault if the browser supports passiveEvents\n // CSS touch-action and user-selecct should be used instead\n if (events.supportsOptions) {\n return;\n }\n\n // don't preventDefault of pointerdown events\n if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) {\n return;\n }\n\n // don't preventDefault on editable elements\n if (is.element(event.target)\n && matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) {\n return;\n }\n\n event.preventDefault();\n};\n\nfunction onInteractionEvent ({ interaction, event }) {\n if (interaction.target) {\n interaction.target.checkAndPreventDefault(event);\n }\n}\n\nfor (const eventSignal of ['down', 'move', 'up', 'cancel']) {\n Interaction.signals.on(eventSignal, onInteractionEvent);\n}\n\n// prevent native HTML5 drag on interact.js target elements\nInteraction.docEvents.dragstart = function preventNativeDrag (event) {\n for (const interaction of scope.interactions) {\n\n if (interaction.element\n && (interaction.element === event.target\n || nodeContains(interaction.element, event.target))) {\n\n interaction.target.checkAndPreventDefault(event);\n return;\n }\n }\n};\n","const scope = require('./scope');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst iFinder = require('./utils/interactionFinder');\nconst pointerEvents = require('./pointerEvents/base');\n\nconst { window } = require('./utils/window');\n\nconst toString = Object.prototype.toString;\n\nif (!window.Array.isArray) {\n window.Array.isArray = function (obj) {\n return toString.call(obj) === '[object Array]';\n };\n}\n\nif (!String.prototype.trim) {\n String.prototype.trim = function () {\n return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n };\n}\n\n// http://www.quirksmode.org/dom/events/click.html\n// >Events leading to dblclick\n//\n// IE8 doesn't fire down event before dblclick.\n// This workaround tries to fire a tap and doubletap after dblclick\nfunction onIE8Dblclick (event) {\n const eventTarget = event.target;\n const interaction = iFinder.search(event, event.type, eventTarget);\n\n if (!interaction) { return; }\n\n if (interaction.prevTap\n && event.clientX === interaction.prevTap.clientX\n && event.clientY === interaction.prevTap.clientY\n && eventTarget === interaction.prevTap.target) {\n\n interaction.downTargets[0] = eventTarget;\n interaction.downTimes [0] = new Date().getTime();\n\n pointerEvents.fire({\n interaction,\n event,\n eventTarget,\n pointer: event,\n type: 'tap',\n });\n }\n}\n\nif (browser.isIE8) {\n const selectFix = function (event) {\n for (const interaction of scope.interactions) {\n if (interaction.interacting()) {\n interaction.target.checkAndPreventDefault(event);\n }\n }\n };\n\n const onDocIE8 = function onDocIE8 ({ doc, win }, signalName) {\n const eventMethod = signalName.indexOf('listen') === 0\n ? events.add : events.remove;\n\n // For IE's lack of Event#preventDefault\n eventMethod(doc, 'selectstart', selectFix);\n\n if (pointerEvents) {\n eventMethod(doc, 'dblclick', onIE8Dblclick);\n }\n };\n\n scope.signals.on('add-document' , onDocIE8);\n scope.signals.on('remove-document', onDocIE8);\n}\n\nmodule.exports = null;\n","const InteractEvent = require('../InteractEvent');\nconst Interaction = require('../Interaction');\nconst extend = require('../utils/extend');\n\nconst modifiers = {\n names: [],\n\n setOffsets: function (arg) {\n const { interaction, pageCoords: page } = arg;\n const { target, element, startOffset } = interaction;\n const rect = target.getRect(element);\n\n if (rect) {\n startOffset.left = page.x - rect.left;\n startOffset.top = page.y - rect.top;\n\n startOffset.right = rect.right - page.x;\n startOffset.bottom = rect.bottom - page.y;\n\n if (!('width' in rect)) { rect.width = rect.right - rect.left; }\n if (!('height' in rect)) { rect.height = rect.bottom - rect.top ; }\n }\n else {\n startOffset.left = startOffset.top = startOffset.right = startOffset.bottom = 0;\n }\n\n arg.rect = rect;\n arg.interactable = target;\n arg.element = element;\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n\n arg.options = target.options[interaction.prepared.name][modifierName];\n\n if (!arg.options) {\n continue;\n }\n\n interaction.modifierOffsets[modifierName] = modifiers[modifierName].setOffset(arg);\n }\n },\n\n setAll: function (arg) {\n const { interaction, statuses, preEnd, requireEndOnly } = arg;\n const coords = extend({}, arg.pageCoords);\n const result = {\n dx: 0,\n dy: 0,\n changed: false,\n locked: false,\n shouldMove: true,\n };\n\n for (const modifierName of modifiers.names) {\n const modifier = modifiers[modifierName];\n const options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!shouldDo(options, preEnd, requireEndOnly)) { continue; }\n\n arg.status = arg.status = statuses[modifierName];\n arg.options = options;\n arg.offset = arg.interaction.modifierOffsets[modifierName];\n\n modifier.set(arg);\n\n if (arg.status.locked) {\n coords.x += arg.status.dx;\n coords.y += arg.status.dy;\n\n result.dx += arg.status.dx;\n result.dy += arg.status.dy;\n\n result.locked = true;\n }\n }\n\n // a move should be fired if:\n // - there are no modifiers enabled,\n // - no modifiers are \"locked\" i.e. have changed the pointer's coordinates, or\n // - the locked coords have changed since the last pointer move\n result.shouldMove = !arg.status || !result.locked || arg.status.changed;\n\n return result;\n },\n\n resetStatuses: function (statuses) {\n for (const modifierName of modifiers.names) {\n const status = statuses[modifierName] || {};\n\n status.dx = status.dy = 0;\n status.modifiedX = status.modifiedY = NaN;\n status.locked = false;\n status.changed = true;\n\n statuses[modifierName] = status;\n }\n\n return statuses;\n },\n\n start: function ({ interaction }, signalName) {\n const arg = {\n interaction,\n pageCoords: (signalName === 'action-resume' ?\n interaction.curCoords : interaction.startCoords).page,\n startOffset: interaction.startOffset,\n statuses: interaction.modifierStatuses,\n preEnd: false,\n requireEndOnly: false,\n };\n\n modifiers.setOffsets(arg);\n modifiers.resetStatuses(arg.statuses);\n\n arg.pageCoords = extend({}, interaction.startCoords.page);\n interaction.modifierResult = modifiers.setAll(arg);\n },\n};\n\nInteraction.signals.on('new', function (interaction) {\n interaction.startOffset = { left: 0, right: 0, top: 0, bottom: 0 };\n interaction.modifierOffsets = {};\n interaction.modifierStatuses = modifiers.resetStatuses({});\n interaction.modifierResult = null;\n});\n\nInteraction.signals.on('action-start' , modifiers.start);\nInteraction.signals.on('action-resume', modifiers.start);\n\nInteraction.signals.on('before-action-move', function ({ interaction, preEnd, interactingBeforeMove }) {\n const modifierResult = modifiers.setAll({\n interaction,\n preEnd,\n pageCoords: interaction.curCoords.page,\n statuses: interaction.modifierStatuses,\n requireEndOnly: false,\n });\n\n // don't fire an action move if a modifier would keep the event in the same\n // cordinates as before\n if (!modifierResult.shouldMove && interactingBeforeMove) {\n interaction._dontFireMove = true;\n }\n\n interaction.modifierResult = modifierResult;\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n for (let i = 0; i < modifiers.names.length; i++) {\n const options = interaction.target.options[interaction.prepared.name][modifiers.names[i]];\n\n // if the endOnly option is true for any modifier\n if (shouldDo(options, true, true)) {\n // fire a move event at the modified coordinates\n interaction.doMove({ event, preEnd: true });\n break;\n }\n }\n});\n\nInteractEvent.signals.on('set-xy', function (arg) {\n const { iEvent, interaction } = arg;\n const modifierArg = extend({}, arg);\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n modifierArg.options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!modifierArg.options) {\n continue;\n }\n\n const modifier = modifiers[modifierName];\n\n modifierArg.status = interaction.modifierStatuses[modifierName];\n\n iEvent[modifierName] = modifier.modifyCoords(modifierArg);\n }\n});\n\nfunction shouldDo (options, preEnd, requireEndOnly) {\n return (options && options.enabled\n && (preEnd || !options.endOnly)\n && (!requireEndOnly || options.endOnly));\n}\n\nmodule.exports = modifiers;\n","const modifiers = require('./index');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst restrict = {\n defaults: {\n enabled : false,\n endOnly : false,\n restriction: null,\n elementRect: null,\n },\n\n setOffset: function ({ rect, startOffset, options }) {\n const elementRect = options && options.elementRect;\n const offset = {};\n\n if (rect && elementRect) {\n offset.left = startOffset.left - (rect.width * elementRect.left);\n offset.top = startOffset.top - (rect.height * elementRect.top);\n\n offset.right = startOffset.right - (rect.width * (1 - elementRect.right));\n offset.bottom = startOffset.bottom - (rect.height * (1 - elementRect.bottom));\n }\n else {\n offset.left = offset.top = offset.right = offset.bottom = 0;\n }\n\n return offset;\n },\n\n set: function ({ pageCoords, interaction, status, options }) {\n if (!options) { return status; }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n\n const restriction = getRestrictionRect(options.restriction, interaction, page);\n\n if (!restriction) { return status; }\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n const rect = restriction;\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n const offset = interaction.modifierOffsets.restrict;\n\n // object is assumed to have\n // x, y, width, height or\n // left, top, right, bottom\n if ('x' in restriction && 'y' in restriction) {\n modifiedX = Math.max(Math.min(rect.x + rect.width - offset.right , page.x), rect.x + offset.left);\n modifiedY = Math.max(Math.min(rect.y + rect.height - offset.bottom, page.y), rect.y + offset.top );\n }\n else {\n modifiedX = Math.max(Math.min(rect.right - offset.right , page.x), rect.left + offset.left);\n modifiedY = Math.max(Math.min(rect.bottom - offset.bottom, page.y), rect.top + offset.top );\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const elementRect = options && options.elementRect;\n\n if (options && options.enabled\n && !(phase === 'start' && elementRect && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n getRestrictionRect,\n};\n\nfunction getRestrictionRect (value, interaction, page) {\n if (utils.is.function(value)) {\n return utils.resolveRectLike(value, interaction.target, interaction.element, [page.x, page.y, interaction]);\n } else {\n return utils.resolveRectLike(value, interaction.target, interaction.element);\n }\n}\n\nmodifiers.restrict = restrict;\nmodifiers.names.push('restrict');\n\ndefaultOptions.perAction.restrict = restrict.defaults;\n\nmodule.exports = restrict;\n","// This module adds the options.resize.restrictEdges setting which sets min and\n// max for the top, left, bottom and right edges of the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictEdges: {\n// inner: { top: 200, left: 200, right: 400, bottom: 400 },\n// outer: { top: 0, left: 0, right: 600, bottom: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst { getRestrictionRect } = require('./restrict');\n\nconst noInner = { top: +Infinity, left: +Infinity, bottom: -Infinity, right: -Infinity };\nconst noOuter = { top: -Infinity, left: -Infinity, bottom: +Infinity, right: +Infinity };\n\nconst restrictEdges = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n offset: null,\n },\n\n setOffset: function ({ interaction, startOffset, options }) {\n if (!options) {\n return utils.extend({}, startOffset);\n }\n\n const offset = getRestrictionRect(options.offset, interaction, interaction.startCoords.page);\n\n if (offset) {\n return {\n top: startOffset.top + offset.y,\n left: startOffset.left + offset.x,\n bottom: startOffset.bottom + offset.y,\n right: startOffset.right + offset.x,\n };\n }\n\n return startOffset;\n },\n\n set: function ({ pageCoords, interaction, status, offset, options }) {\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n const inner = rectUtils.xywhToTlbr(getRestrictionRect(options.inner, interaction, page)) || noInner;\n const outer = rectUtils.xywhToTlbr(getRestrictionRect(options.outer, interaction, page)) || noOuter;\n\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n if (edges.top) {\n modifiedY = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top);\n }\n else if (edges.bottom) {\n modifiedY = Math.max(Math.min(outer.bottom - offset.bottom, page.y), inner.bottom - offset.bottom);\n }\n if (edges.left) {\n modifiedX = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left);\n }\n else if (edges.right) {\n modifiedX = Math.max(Math.min(outer.right - offset.right, page.x), inner.right - offset.right);\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n if (options && options.enabled\n && !(phase === 'start' && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n noInner,\n noOuter,\n getRestrictionRect,\n};\n\nmodifiers.restrictEdges = restrictEdges;\nmodifiers.names.push('restrictEdges');\n\ndefaultOptions.perAction.restrictEdges = restrictEdges.defaults;\nresize.defaults.restrictEdges = restrictEdges.defaults;\n\nmodule.exports = restrictEdges;\n","// This module adds the options.resize.restrictSize setting which sets min and\n// max width and height for the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictSize: {\n// min: { width: -600, height: -600 },\n// max: { width: 600, height: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst restrictEdges = require('./restrictEdges');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst noMin = { width: -Infinity, height: -Infinity };\nconst noMax = { width: +Infinity, height: +Infinity };\n\nconst restrictSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n },\n\n setOffset: function ({ interaction }) {\n return interaction.startOffset;\n },\n\n set: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const rect = rectUtils.xywhToTlbr(interaction.resizeRects.inverted);\n\n const minSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.min, interaction)) || noMin;\n const maxSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.max, interaction)) || noMax;\n\n arg.options = {\n enabled: options.enabled,\n endOnly: options.endOnly,\n inner: utils.extend({}, restrictEdges.noInner),\n outer: utils.extend({}, restrictEdges.noOuter),\n };\n\n if (edges.top) {\n arg.options.inner.top = rect.bottom - minSize.height;\n arg.options.outer.top = rect.bottom - maxSize.height;\n }\n else if (edges.bottom) {\n arg.options.inner.bottom = rect.top + minSize.height;\n arg.options.outer.bottom = rect.top + maxSize.height;\n }\n if (edges.left) {\n arg.options.inner.left = rect.right - minSize.width;\n arg.options.outer.left = rect.right - maxSize.width;\n }\n else if (edges.right) {\n arg.options.inner.right = rect.left + minSize.width;\n arg.options.outer.right = rect.left + maxSize.width;\n }\n\n restrictEdges.set(arg);\n },\n\n modifyCoords: restrictEdges.modifyCoords,\n};\n\nmodifiers.restrictSize = restrictSize;\nmodifiers.names.push('restrictSize');\n\ndefaultOptions.perAction.restrictSize = restrictSize.defaults;\nresize.defaults.restrictSize = restrictSize.defaults;\n\nmodule.exports = restrictSize;\n","const modifiers = require('./index');\nconst interact = require('../interact');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst snap = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n\n relativePoints: null,\n },\n\n setOffset: function ({ interaction, interactable, element, rect, startOffset, options }) {\n const offsets = [];\n const optionsOrigin = utils.rectToXY(utils.resolveRectLike(options.origin));\n const origin = optionsOrigin || utils.getOriginXY(interactable, element, interaction.prepared.name);\n options = options || interactable.options[interaction.prepared.name].snap || {};\n\n let snapOffset;\n\n if (options.offset === 'startCoords') {\n snapOffset = {\n x: interaction.startCoords.page.x - origin.x,\n y: interaction.startCoords.page.y - origin.y,\n };\n }\n else {\n const offsetRect = utils.resolveRectLike(options.offset, interactable, element, [interaction]);\n\n snapOffset = utils.rectToXY(offsetRect) || { x: 0, y: 0 };\n }\n\n if (rect && options.relativePoints && options.relativePoints.length) {\n for (const { x: relativeX, y: relativeY } of options.relativePoints) {\n offsets.push({\n x: startOffset.left - (rect.width * relativeX) + snapOffset.x,\n y: startOffset.top - (rect.height * relativeY) + snapOffset.y,\n });\n }\n }\n else {\n offsets.push(snapOffset);\n }\n\n return offsets;\n },\n\n set: function ({ interaction, pageCoords, status, options, offset: offsets }) {\n const targets = [];\n let target;\n let page;\n let i;\n\n if (status.useStatusXY) {\n page = { x: status.x, y: status.y };\n }\n else {\n const origin = utils.getOriginXY(interaction.target, interaction.element, interaction.prepared.name);\n\n page = utils.extend({}, pageCoords);\n\n page.x -= origin.x;\n page.y -= origin.y;\n }\n\n status.realX = page.x;\n status.realY = page.y;\n\n let len = options.targets? options.targets.length : 0;\n\n for (const { x: offsetX, y: offsetY } of offsets) {\n const relativeX = page.x - offsetX;\n const relativeY = page.y - offsetY;\n\n for (const snapTarget of options.targets) {\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n targets.push({\n x: utils.is.number(target.x) ? (target.x + offsetX) : relativeX,\n y: utils.is.number(target.y) ? (target.y + offsetY) : relativeY,\n\n range: utils.is.number(target.range)? target.range: options.range,\n });\n }\n }\n\n const closest = {\n target: null,\n inRange: false,\n distance: 0,\n range: 0,\n dx: 0,\n dy: 0,\n };\n\n for (i = 0, len = targets.length; i < len; i++) {\n target = targets[i];\n\n const range = target.range;\n const dx = target.x - page.x;\n const dy = target.y - page.y;\n const distance = utils.hypot(dx, dy);\n let inRange = distance <= range;\n\n // Infinite targets count as being out of range\n // compared to non infinite ones that are in range\n if (range === Infinity && closest.inRange && closest.range !== Infinity) {\n inRange = false;\n }\n\n if (!closest.target || (inRange\n // is the closest target in range?\n ? (closest.inRange && range !== Infinity\n // the pointer is relatively deeper in this target\n ? distance / range < closest.distance / closest.range\n // this target has Infinite range and the closest doesn't\n : (range === Infinity && closest.range !== Infinity)\n // OR this target is closer that the previous closest\n || distance < closest.distance)\n // The other is not in range and the pointer is closer to this target\n : (!closest.inRange && distance < closest.distance))) {\n\n closest.target = target;\n closest.distance = distance;\n closest.range = range;\n closest.inRange = inRange;\n closest.dx = dx;\n closest.dy = dy;\n\n status.range = range;\n }\n }\n\n let snapChanged;\n\n if (closest.target) {\n snapChanged = (status.modifiedX !== closest.target.x || status.modifiedY !== closest.target.y);\n\n status.modifiedX = closest.target.x;\n status.modifiedY = closest.target.y;\n }\n else {\n snapChanged = true;\n\n status.modifiedX = NaN;\n status.modifiedY = NaN;\n }\n\n status.dx = closest.dx;\n status.dy = closest.dy;\n\n status.changed = (snapChanged || (closest.inRange && !status.locked));\n status.locked = closest.inRange;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const relativePoints = options && options.relativePoints;\n\n if (options && options.enabled\n && !(phase === 'start' && relativePoints && relativePoints.length)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n }\n\n return {\n range : status.range,\n locked : status.locked,\n x : status.modifiedX,\n y : status.modifiedY,\n realX : status.realX,\n realY : status.realY,\n dx : status.dx,\n dy : status.dy,\n };\n }\n },\n};\n\ninteract.createSnapGrid = function (grid) {\n return function (x, y) {\n const limits = grid.limits || {\n left : -Infinity,\n right : Infinity,\n top : -Infinity,\n bottom: Infinity,\n };\n let offsetX = 0;\n let offsetY = 0;\n\n if (utils.is.object(grid.offset)) {\n offsetX = grid.offset.x;\n offsetY = grid.offset.y;\n }\n\n const gridx = Math.round((x - offsetX) / grid.x);\n const gridy = Math.round((y - offsetY) / grid.y);\n\n const newX = Math.max(limits.left, Math.min(limits.right , gridx * grid.x + offsetX));\n const newY = Math.max(limits.top , Math.min(limits.bottom, gridy * grid.y + offsetY));\n\n return {\n x: newX,\n y: newY,\n range: grid.range,\n };\n };\n};\n\nmodifiers.snap = snap;\nmodifiers.names.push('snap');\n\ndefaultOptions.perAction.snap = snap.defaults;\n\nmodule.exports = snap;\n","// This module allows snapping of the size of targets during resize\n// interactions.\n\nconst modifiers = require('./index');\nconst snap = require('./snap');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\nconst utils = require('../utils/');\n\nconst snapSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n },\n\n setOffset: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.edges;\n\n if (!edges) { return; }\n\n arg.options = {\n relativePoints: [{\n x: edges.left? 0 : 1,\n y: edges.top ? 0 : 1,\n }],\n origin: { x: 0, y: 0 },\n offset: 'self',\n range: options.range,\n };\n\n const offsets = snap.setOffset(arg);\n arg.options = options;\n\n return offsets;\n },\n\n set: function (arg) {\n const { interaction, options, offset, pageCoords } = arg;\n const page = utils.extend({}, pageCoords);\n const relativeX = page.x - offset[0].x;\n const relativeY = page.y - offset[0].y;\n\n arg.options = utils.extend({}, options);\n arg.options.targets = [];\n\n for (const snapTarget of options.targets) {\n let target;\n\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n if ('width' in target && 'height' in target) {\n target.x = target.width;\n target.y = target.height;\n }\n\n arg.options.targets.push(target);\n }\n\n snap.set(arg);\n },\n\n modifyCoords: function (arg) {\n const { options } = arg;\n\n arg.options = utils.extend({}, options);\n arg.options.enabled = options.enabled;\n arg.options.relativePoints = [null];\n\n snap.modifyCoords(arg);\n },\n};\n\nmodifiers.snapSize = snapSize;\nmodifiers.names.push('snapSize');\n\ndefaultOptions.perAction.snapSize = snapSize.defaults;\nresize.defaults.snapSize = snapSize.defaults;\n\nmodule.exports = snapSize;\n","const pointerUtils = require('../utils/pointerUtils');\n\nmodule.exports = class PointerEvent {\n constructor (type, pointer, event, eventTarget, interaction) {\n pointerUtils.pointerExtend(this, event);\n\n if (event !== pointer) {\n pointerUtils.pointerExtend(this, pointer);\n }\n\n this.interaction = interaction;\n\n this.timeStamp = new Date().getTime();\n this.originalEvent = event;\n this.type = type;\n this.pointerId = pointerUtils.getPointerId(pointer);\n this.pointerType = pointerUtils.getPointerType(pointer);\n this.target = eventTarget;\n this.currentTarget = null;\n\n if (type === 'tap') {\n const pointerIndex = interaction.getPointerIndex(pointer);\n this.dt = this.timeStamp - interaction.downTimes[pointerIndex];\n\n const interval = this.timeStamp - interaction.tapTime;\n\n this.double = !!(interaction.prevTap\n && interaction.prevTap.type !== 'doubletap'\n && interaction.prevTap.target === this.target\n && interval < 500);\n }\n else if (type === 'doubletap') {\n this.dt = pointer.timeStamp - interaction.tapTime;\n }\n }\n\n subtractOrigin ({ x: originX, y: originY }) {\n this.pageX -= originX;\n this.pageY -= originY;\n this.clientX -= originX;\n this.clientY -= originY;\n\n return this;\n }\n\n addOrigin ({ x: originX, y: originY }) {\n this.pageX += originX;\n this.pageY += originY;\n this.clientX += originX;\n this.clientY += originY;\n\n return this;\n }\n\n preventDefault () {\n this.originalEvent.preventDefault();\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n};\n","const PointerEvent = require('./PointerEvent');\nconst Interaction = require('../Interaction');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst defaults = require('../defaultOptions');\nconst signals = require('../utils/Signals').new();\nconst { filter } = require('../utils/arr');\n\nconst simpleSignals = [ 'down', 'up', 'cancel' ];\nconst simpleEvents = [ 'down', 'up', 'cancel' ];\n\nconst pointerEvents = {\n PointerEvent,\n fire,\n collectEventTargets,\n signals,\n defaults: {\n holdDuration: 600,\n ignoreFrom : null,\n allowFrom : null,\n origin : { x: 0, y: 0 },\n },\n types: [\n 'down',\n 'move',\n 'up',\n 'cancel',\n 'tap',\n 'doubletap',\n 'hold',\n ],\n};\n\nfunction fire (arg) {\n const {\n interaction, pointer, event, eventTarget,\n type = arg.pointerEvent.type,\n targets = collectEventTargets(arg),\n pointerEvent = new PointerEvent(type, pointer, event, eventTarget, interaction),\n } = arg;\n\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n targets,\n type,\n pointerEvent,\n };\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n\n for (const prop in target.props || {}) {\n pointerEvent[prop] = target.props[prop];\n }\n\n const origin = utils.getOriginXY(target.eventable, target.element);\n\n pointerEvent.subtractOrigin(origin);\n pointerEvent.eventable = target.eventable;\n pointerEvent.currentTarget = target.element;\n\n target.eventable.fire(pointerEvent);\n\n pointerEvent.addOrigin(origin);\n\n if (pointerEvent.immediatePropagationStopped\n || (pointerEvent.propagationStopped\n && (i + 1) < targets.length && targets[i + 1].element !== pointerEvent.currentTarget)) {\n break;\n }\n }\n\n signals.fire('fired', signalArg);\n\n if (type === 'tap') {\n // if pointerEvent should make a double tap, create and fire a doubletap\n // PointerEvent and use that as the prevTap\n const prevTap = pointerEvent.double\n ? fire({\n interaction, pointer, event, eventTarget,\n type: 'doubletap',\n })\n : pointerEvent;\n\n interaction.prevTap = prevTap;\n interaction.tapTime = prevTap.timeStamp;\n }\n\n return pointerEvent;\n}\n\nfunction collectEventTargets ({ interaction, pointer, event, eventTarget, type }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n // do not fire a tap event if the pointer was moved before being lifted\n if (type === 'tap' && (interaction.pointerWasMoved\n // or if the pointerup target is different to the pointerdown target\n || !(interaction.downTargets[pointerIndex] && interaction.downTargets[pointerIndex] === eventTarget))) {\n return [];\n }\n\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n path,\n targets: [],\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (type === 'hold') {\n signalArg.targets = filter(signalArg.targets, target =>\n target.eventable.options.holdDuration === interaction.holdTimers[pointerIndex].duration);\n }\n\n return signalArg.targets;\n}\n\nInteraction.signals.on('update-pointer-down', function ({ interaction, pointerIndex }) {\n interaction.holdTimers[pointerIndex] = { duration: Infinity, timeout: null };\n});\n\nInteraction.signals.on('remove-pointer', function ({ interaction, pointerIndex }) {\n interaction.holdTimers.splice(pointerIndex, 1);\n});\n\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget, duplicateMove }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n if (!duplicateMove && (!interaction.pointerIsDown || interaction.pointerWasMoved)) {\n if (interaction.pointerIsDown) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n\n fire({\n interaction, pointer, event, eventTarget,\n type: 'move',\n });\n }\n});\n\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget, pointerIndex }) {\n // copy event to be used in timeout for IE8\n const eventCopy = browser.isIE8? utils.extend({}, event) : event;\n\n const timer = interaction.holdTimers[pointerIndex];\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'hold',\n targets: [],\n path,\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (!signalArg.targets.length) { return; }\n\n let minDuration = Infinity;\n\n for (let i = 0; i < signalArg.targets.length; i++) {\n const target = signalArg.targets[i];\n const holdDuration = target.eventable.options.holdDuration;\n\n if (holdDuration < minDuration) {\n minDuration = holdDuration;\n }\n }\n\n timer.duration = minDuration;\n timer.timeout = setTimeout(function () {\n fire({\n interaction,\n eventTarget,\n pointer: browser.isIE8? eventCopy : pointer,\n event: eventCopy,\n type: 'hold',\n });\n }, minDuration);\n});\n\nInteraction.signals.on('up', ({ interaction, pointer, event, eventTarget }) => {\n if (!interaction.pointerWasMoved) {\n fire({ interaction, eventTarget, pointer, event, type: 'tap' });\n }\n});\n\n['up', 'cancel'].forEach(function (signalName) {\n Interaction.signals.on(signalName, function ({ interaction, pointerIndex }) {\n if (interaction.holdTimers[pointerIndex]) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n });\n});\n\nfunction createSignalListener (type) {\n return function ({ interaction, pointer, event, eventTarget }) {\n fire({ interaction, eventTarget, pointer, event, type });\n };\n}\n\nfor (let i = 0; i < simpleSignals.length; i++) {\n Interaction.signals.on(simpleSignals[i], createSignalListener(simpleEvents[i]));\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.prevTap = null; // the most recent tap event on this interaction\n interaction.tapTime = 0; // time of the most recent tap event\n interaction.holdTimers = []; // [{ duration, timeout }]\n});\n\ndefaults.pointerEvents = pointerEvents.defaults;\nmodule.exports = pointerEvents;\n","const pointerEvents = require('./base');\nconst Interaction = require('../Interaction');\n\npointerEvents.signals.on('new', onNew);\npointerEvents.signals.on('fired', onFired);\n\nfor (const signal of ['move', 'up', 'cancel', 'endall']) {\n Interaction.signals.on(signal, endHoldRepeat);\n}\n\nfunction onNew ({ pointerEvent }) {\n if (pointerEvent.type !== 'hold') { return; }\n\n pointerEvent.count = (pointerEvent.count || 0) + 1;\n}\n\nfunction onFired ({ interaction, pointerEvent, eventTarget, targets }) {\n if (pointerEvent.type !== 'hold' || !targets.length) { return; }\n\n // get the repeat interval from the first eventable\n const interval = targets[0].eventable.options.holdRepeatInterval;\n\n // don't repeat if the interval is 0 or less\n if (interval <= 0) { return; }\n\n // set a timeout to fire the holdrepeat event\n interaction.holdIntervalHandle = setTimeout(function () {\n pointerEvents.fire({\n interaction,\n eventTarget,\n type: 'hold',\n pointer: pointerEvent,\n event: pointerEvent,\n });\n }, interval);\n}\n\nfunction endHoldRepeat ({ interaction }) {\n // set the interaction's holdStopTime property\n // to stop further holdRepeat events\n if (interaction.holdIntervalHandle) {\n clearInterval(interaction.holdIntervalHandle);\n interaction.holdIntervalHandle = null;\n }\n}\n\n// don't repeat by default\npointerEvents.defaults.holdRepeatInterval = 0;\npointerEvents.types.push('holdrepeat');\n\nmodule.exports = {\n onNew,\n onFired,\n endHoldRepeat,\n};\n","const pointerEvents = require('./base');\nconst Interactable = require('../Interactable');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\nconst scope = require('../scope');\nconst extend = require('../utils/extend');\nconst { merge } = require('../utils/arr');\n\npointerEvents.signals.on('collect-targets', function ({ targets, element, type, eventTarget }) {\n function collectSelectors (interactable, selector, context) {\n const els = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && is.element(element)\n && domUtils.matchesSelector(element, selector, els)\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n const interactable = scope.interactables.get(element);\n\n if (interactable) {\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n scope.interactables.forEachSelector(collectSelectors, element);\n});\n\nInteractable.signals.on('new', function ({ interactable }) {\n interactable.events.getRect = function (element) {\n return interactable.getRect(element);\n };\n});\n\nInteractable.signals.on('set', function ({ interactable, options }) {\n extend(interactable.events.options, pointerEvents.defaults);\n extend(interactable.events.options, options);\n});\n\nmerge(Interactable.eventTypes, pointerEvents.types);\n\nInteractable.prototype.pointerEvents = function (options) {\n extend(this.events.options, options);\n\n return this;\n};\n\nconst __backCompatOption = Interactable.prototype._backCompatOption;\n\nInteractable.prototype._backCompatOption = function (optionName, newValue) {\n const ret = __backCompatOption.call(this, optionName, newValue);\n\n if (ret === this) {\n this.events.options[optionName] = newValue;\n }\n\n return ret;\n};\n\nInteractable.settingsMethods.push('pointerEvents');\n","const utils = require('./utils');\nconst events = require('./utils/events');\nconst signals = require('./utils/Signals').new();\n\nconst scope = {\n signals,\n events,\n utils,\n\n // main document\n document: require('./utils/domObjects').document,\n // all documents being listened to\n documents: [],\n\n addDocument: function (doc, win) {\n // do nothing if document is already known\n if (utils.contains(scope.documents, doc)) { return false; }\n\n win = win || scope.getWindow(doc);\n\n scope.documents.push(doc);\n events.documents.push(doc);\n\n // don't add an unload event for the main document\n // so that the page may be cached in browser history\n if (doc !== scope.document) {\n events.add(win, 'unload', scope.onWindowUnload);\n }\n\n signals.fire('add-document', { doc, win });\n },\n\n removeDocument: function (doc, win) {\n const index = utils.indexOf(scope.documents, doc);\n\n win = win || scope.getWindow(doc);\n\n events.remove(win, 'unload', scope.onWindowUnload);\n\n scope.documents.splice(index, 1);\n events.documents.splice(index, 1);\n\n signals.fire('remove-document', { win, doc });\n },\n\n onWindowUnload: function () {\n scope.removeDocument(this.document, this);\n },\n};\n\nmodule.exports = scope;\n","const { indexOf } = require('./arr');\n\nclass Signals {\n constructor () {\n this.listeners = {\n // signalName: [listeners],\n };\n }\n\n on (name, listener) {\n if (!this.listeners[name]) {\n this.listeners[name] = [listener];\n return;\n }\n\n this.listeners[name].push(listener);\n }\n\n off (name, listener) {\n if (!this.listeners[name]) { return; }\n\n const index = indexOf(this.listeners[name], listener);\n\n if (index !== -1) {\n this.listeners[name].splice(index, 1);\n }\n }\n\n fire (name, arg) {\n const targetListeners = this.listeners[name];\n\n if (!targetListeners) { return; }\n\n for (let i = 0; i < targetListeners.length; i++) {\n if (targetListeners[i](arg, name) === false) {\n return;\n }\n }\n }\n}\n\nSignals.new = function () {\n return new Signals();\n};\n\nmodule.exports = Signals;\n","function indexOf (array, target) {\n for (let i = 0, len = array.length; i < len; i++) {\n if (array[i] === target) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction contains (array, target) {\n return indexOf(array, target) !== -1;\n}\n\nfunction merge (target, source) {\n for (let i = 0; i < source.length; i++) {\n target.push(source[i]);\n }\n\n return target;\n}\n\nfunction filter (array, test) {\n const result = [];\n\n for (let i = 0; i < array.length; i++) {\n if (test(array[i])) {\n result.push(array[i]);\n }\n }\n\n return result;\n}\n\nmodule.exports = {\n indexOf,\n contains,\n merge,\n filter,\n};\n","const { window } = require('./window');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst Element = domObjects.Element;\nconst navigator = window.navigator;\n\nconst browser = {\n // Does the browser support touch input?\n supportsTouch: !!(('ontouchstart' in window) || is.function(window.DocumentTouch)\n && domObjects.document instanceof window.DocumentTouch),\n\n // Does the browser support PointerEvents\n supportsPointerEvent: !!domObjects.PointerEvent,\n\n isIE8: ('attachEvent' in window) && !('addEventListener' in window),\n\n // Opera Mobile must be handled differently\n isOperaMobile: (navigator.appName === 'Opera'\n && browser.supportsTouch\n && navigator.userAgent.match('Presto')),\n\n // scrolling doesn't change the result of getClientRects on iOS 7\n isIOS7: (/iP(hone|od|ad)/.test(navigator.platform)\n && /OS 7[^\\d]/.test(navigator.appVersion)),\n\n isIe9OrOlder: /MSIE (8|9)/.test(navigator.userAgent),\n\n // prefix matchesSelector\n prefixedMatchesSelector: 'matches' in Element.prototype\n ? 'matches': 'webkitMatchesSelector' in Element.prototype\n ? 'webkitMatchesSelector': 'mozMatchesSelector' in Element.prototype\n ? 'mozMatchesSelector': 'oMatchesSelector' in Element.prototype\n ? 'oMatchesSelector': 'msMatchesSelector',\n\n useMatchesSelectorPolyfill: false,\n\n pEventTypes: (domObjects.PointerEvent\n ? (domObjects.PointerEvent === window.MSPointerEvent\n ? {\n up: 'MSPointerUp',\n down: 'MSPointerDown',\n over: 'mouseover',\n out: 'mouseout',\n move: 'MSPointerMove',\n cancel: 'MSPointerCancel',\n }\n : {\n up: 'pointerup',\n down: 'pointerdown',\n over: 'pointerover',\n out: 'pointerout',\n move: 'pointermove',\n cancel: 'pointercancel',\n })\n : null),\n\n // because Webkit and Opera still use 'mousewheel' event type\n wheelEvent: 'onmousewheel' in domObjects.document? 'mousewheel': 'wheel',\n\n};\n\nbrowser.useMatchesSelectorPolyfill = !is.function(Element.prototype[browser.prefixedMatchesSelector]);\n\nmodule.exports = browser;\n","const domObjects = {};\nconst win = require('./window').window;\n\nfunction blank () {}\n\ndomObjects.document = win.document;\ndomObjects.DocumentFragment = win.DocumentFragment || blank;\ndomObjects.SVGElement = win.SVGElement || blank;\ndomObjects.SVGSVGElement = win.SVGSVGElement || blank;\ndomObjects.SVGElementInstance = win.SVGElementInstance || blank;\ndomObjects.Element = win.Element || blank;\ndomObjects.HTMLElement = win.HTMLElement || domObjects.Element;\n\ndomObjects.Event = win.Event;\ndomObjects.Touch = win.Touch || blank;\ndomObjects.PointerEvent = (win.PointerEvent || win.MSPointerEvent);\n\nmodule.exports = domObjects;\n","const win = require('./window');\nconst browser = require('./browser');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst domUtils = {\n nodeContains: function (parent, child) {\n while (child) {\n if (child === parent) {\n return true;\n }\n\n child = child.parentNode;\n }\n\n return false;\n },\n\n closest: function (element, selector) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) { return element; }\n\n element = domUtils.parentNode(element);\n }\n\n return null;\n },\n\n parentNode: function (node) {\n let parent = node.parentNode;\n\n if (is.docFrag(parent)) {\n // skip past #shado-root fragments\n while ((parent = parent.host) && is.docFrag(parent)) {\n continue;\n }\n\n return parent;\n }\n\n return parent;\n },\n\n // taken from http://tanalin.com/en/blog/2012/12/matches-selector-ie8/ and modified\n matchesSelectorPolyfill: browser.useMatchesSelectorPolyfill\n ? function (element, selector, elems) {\n elems = elems || element.parentNode.querySelectorAll(selector);\n\n for (let i = 0, len = elems.length; i < len; i++) {\n if (elems[i] === element) {\n return true;\n }\n }\n\n return false;\n }\n : null,\n\n matchesSelector: function (element, selector, nodeList) {\n if (browser.useMatchesSelectorPolyfill) {\n return domUtils.matchesSelectorPolyfill(element, selector, nodeList);\n }\n\n // remove /deep/ from selectors if shadowDOM polyfill is used\n if (win.window !== win.realWindow) {\n selector = selector.replace(/\\/deep\\//g, ' ');\n }\n\n return element[browser.prefixedMatchesSelector](selector);\n },\n\n // Test for the element that's \"above\" all other qualifiers\n indexOfDeepestElement: function (elements) {\n let deepestZoneParents = [];\n let dropzoneParents = [];\n let dropzone;\n let deepestZone = elements[0];\n let index = deepestZone? 0: -1;\n let parent;\n let child;\n let i;\n let n;\n\n for (i = 1; i < elements.length; i++) {\n dropzone = elements[i];\n\n // an element might belong to multiple selector dropzones\n if (!dropzone || dropzone === deepestZone) {\n continue;\n }\n\n if (!deepestZone) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n // check if the deepest or current are document.documentElement or document.rootElement\n // - if the current dropzone is, do nothing and continue\n if (dropzone.parentNode === dropzone.ownerDocument) {\n continue;\n }\n // - if deepest is, update with the current dropzone and continue to next\n else if (deepestZone.parentNode === dropzone.ownerDocument) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n if (!deepestZoneParents.length) {\n parent = deepestZone;\n while (parent.parentNode && parent.parentNode !== parent.ownerDocument) {\n deepestZoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n }\n\n // if this element is an svg element and the current deepest is\n // an HTMLElement\n if (deepestZone instanceof domObjects.HTMLElement\n && dropzone instanceof domObjects.SVGElement\n && !(dropzone instanceof domObjects.SVGSVGElement)) {\n\n if (dropzone === deepestZone.parentNode) {\n continue;\n }\n\n parent = dropzone.ownerSVGElement;\n }\n else {\n parent = dropzone;\n }\n\n dropzoneParents = [];\n\n while (parent.parentNode !== parent.ownerDocument) {\n dropzoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n\n n = 0;\n\n // get (position of last common ancestor) + 1\n while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) {\n n++;\n }\n\n const parents = [\n dropzoneParents[n - 1],\n dropzoneParents[n],\n deepestZoneParents[n],\n ];\n\n child = parents[0].lastChild;\n\n while (child) {\n if (child === parents[1]) {\n deepestZone = dropzone;\n index = i;\n deepestZoneParents = [];\n\n break;\n }\n else if (child === parents[2]) {\n break;\n }\n\n child = child.previousSibling;\n }\n }\n\n return index;\n },\n\n matchesUpTo: function (element, selector, limit) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) {\n return true;\n }\n\n element = domUtils.parentNode(element);\n\n if (element === limit) {\n return domUtils.matchesSelector(element, selector);\n }\n }\n\n return false;\n },\n\n getActualElement: function (element) {\n return (element instanceof domObjects.SVGElementInstance\n ? element.correspondingUseElement\n : element);\n },\n\n getScrollXY: function (relevantWindow) {\n relevantWindow = relevantWindow || win.window;\n return {\n x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft,\n y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop,\n };\n },\n\n getElementClientRect: function (element) {\n const clientRect = (element instanceof domObjects.SVGElement\n ? element.getBoundingClientRect()\n : element.getClientRects()[0]);\n\n return clientRect && {\n left : clientRect.left,\n right : clientRect.right,\n top : clientRect.top,\n bottom: clientRect.bottom,\n width : clientRect.width || clientRect.right - clientRect.left,\n height: clientRect.height || clientRect.bottom - clientRect.top,\n };\n },\n\n getElementRect: function (element) {\n const clientRect = domUtils.getElementClientRect(element);\n\n if (!browser.isIOS7 && clientRect) {\n const scroll = domUtils.getScrollXY(win.getWindow(element));\n\n clientRect.left += scroll.x;\n clientRect.right += scroll.x;\n clientRect.top += scroll.y;\n clientRect.bottom += scroll.y;\n }\n\n return clientRect;\n },\n\n getPath: function (element) {\n const path = [];\n\n while (element) {\n path.push(element);\n element = domUtils.parentNode(element);\n }\n\n return path;\n },\n\n trySelector: value => {\n if (!is.string(value)) { return false; }\n\n // an exception will be raised if it is invalid\n domObjects.document.querySelector(value);\n return true;\n },\n};\n\nmodule.exports = domUtils;\n","const is = require('./is');\nconst domUtils = require('./domUtils');\nconst pExtend = require('./pointerExtend');\n\nconst { window, getWindow } = require('./window');\nconst { indexOf, contains } = require('./arr');\n\nconst useAttachEvent = ('attachEvent' in window) && !('addEventListener' in window);\nconst addEvent = useAttachEvent? 'attachEvent': 'addEventListener';\nconst removeEvent = useAttachEvent? 'detachEvent': 'removeEventListener';\nconst on = useAttachEvent? 'on': '';\n\nconst elements = [];\nconst targets = [];\nconst attachedListeners = [];\n\n// {\n// type: {\n// selectors: ['selector', ...],\n// contexts : [document, ...],\n// listeners: [[listener, capture, passive], ...]\n// }\n// }\nconst delegatedEvents = {};\n\nconst documents = [];\n\nconst supportsOptions = !useAttachEvent && (() => {\n let supported = false;\n\n window.document.createElement('div').addEventListener('test', null, {\n get capture () { supported = true; },\n });\n\n return supported;\n})();\n\nfunction add (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n let elementIndex = indexOf(elements, element);\n let target = targets[elementIndex];\n\n if (!target) {\n target = {\n events: {},\n typeCount: 0,\n };\n\n elementIndex = elements.push(element) - 1;\n targets.push(target);\n\n attachedListeners.push(useAttachEvent\n ? {\n supplied: [],\n wrapped : [],\n useCount: [],\n }\n : null);\n }\n\n if (!target.events[type]) {\n target.events[type] = [];\n target.typeCount++;\n }\n\n if (!contains(target.events[type], listener)) {\n let ret;\n\n if (useAttachEvent) {\n const { supplied, wrapped, useCount } = attachedListeners[elementIndex];\n const listenerIndex = indexOf(supplied, listener);\n\n const wrappedListener = wrapped[listenerIndex] || function (event) {\n if (!event.immediatePropagationStopped) {\n event.target = event.srcElement;\n event.currentTarget = element;\n\n event.preventDefault = event.preventDefault || preventDef;\n event.stopPropagation = event.stopPropagation || stopProp;\n event.stopImmediatePropagation = event.stopImmediatePropagation || stopImmProp;\n\n if (/mouse|click/.test(event.type)) {\n event.pageX = event.clientX + getWindow(element).document.documentElement.scrollLeft;\n event.pageY = event.clientY + getWindow(element).document.documentElement.scrollTop;\n }\n\n listener(event);\n }\n };\n\n ret = element[addEvent](on + type, wrappedListener, !!options.capture);\n\n if (listenerIndex === -1) {\n supplied.push(listener);\n wrapped.push(wrappedListener);\n useCount.push(1);\n }\n else {\n useCount[listenerIndex]++;\n }\n }\n else {\n ret = element[addEvent](type, listener, supportsOptions? options : !!options.capture);\n }\n target.events[type].push(listener);\n\n return ret;\n }\n}\n\nfunction remove (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const elementIndex = indexOf(elements, element);\n const target = targets[elementIndex];\n\n if (!target || !target.events) {\n return;\n }\n\n let wrappedListener = listener;\n let listeners;\n let listenerIndex;\n\n if (useAttachEvent) {\n listeners = attachedListeners[elementIndex];\n listenerIndex = indexOf(listeners.supplied, listener);\n wrappedListener = listeners.wrapped[listenerIndex];\n }\n\n if (type === 'all') {\n for (type in target.events) {\n if (target.events.hasOwnProperty(type)) {\n remove(element, type, 'all');\n }\n }\n return;\n }\n\n if (target.events[type]) {\n const len = target.events[type].length;\n\n if (listener === 'all') {\n for (let i = 0; i < len; i++) {\n remove(element, type, target.events[type][i], options);\n }\n return;\n }\n else {\n for (let i = 0; i < len; i++) {\n if (target.events[type][i] === listener) {\n element[removeEvent](on + type, wrappedListener, supportsOptions? options : !!options.capture);\n target.events[type].splice(i, 1);\n\n if (useAttachEvent && listeners) {\n listeners.useCount[listenerIndex]--;\n if (listeners.useCount[listenerIndex] === 0) {\n listeners.supplied.splice(listenerIndex, 1);\n listeners.wrapped.splice(listenerIndex, 1);\n listeners.useCount.splice(listenerIndex, 1);\n }\n }\n\n break;\n }\n }\n }\n\n if (target.events[type] && target.events[type].length === 0) {\n target.events[type] = null;\n target.typeCount--;\n }\n }\n\n if (!target.typeCount) {\n targets.splice(elementIndex, 1);\n elements.splice(elementIndex, 1);\n attachedListeners.splice(elementIndex, 1);\n }\n}\n\nfunction addDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n if (!delegatedEvents[type]) {\n delegatedEvents[type] = {\n selectors: [],\n contexts : [],\n listeners: [],\n };\n\n // add delegate listener functions\n for (let i = 0; i < documents.length; i++) {\n add(documents[i], type, delegateListener);\n add(documents[i], type, delegateUseCapture, true);\n }\n }\n\n const delegated = delegatedEvents[type];\n let index;\n\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n break;\n }\n }\n\n if (index === -1) {\n index = delegated.selectors.length;\n\n delegated.selectors.push(selector);\n delegated.contexts .push(context);\n delegated.listeners.push([]);\n }\n\n // keep listener and capture and passive flags\n delegated.listeners[index].push([listener, !!options.capture, options.passive]);\n}\n\nfunction removeDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const delegated = delegatedEvents[type];\n let matchFound = false;\n let index;\n\n if (!delegated) { return; }\n\n // count from last index of delegated to 0\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n // look for matching selector and context Node\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n\n const listeners = delegated.listeners[index];\n\n // each item of the listeners array is an array: [function, capture, passive]\n for (let i = listeners.length - 1; i >= 0; i--) {\n const [fn, capture, passive] = listeners[i];\n\n // check if the listener functions and capture and passive flags match\n if (fn === listener && capture === !!options.capture && passive === options.passive) {\n // remove the listener from the array of listeners\n listeners.splice(i, 1);\n\n // if all listeners for this interactable have been removed\n // remove the interactable from the delegated arrays\n if (!listeners.length) {\n delegated.selectors.splice(index, 1);\n delegated.contexts .splice(index, 1);\n delegated.listeners.splice(index, 1);\n\n // remove delegate function from context\n remove(context, type, delegateListener);\n remove(context, type, delegateUseCapture, true);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegatedEvents[type] = null;\n }\n }\n\n // only remove one listener\n matchFound = true;\n break;\n }\n }\n\n if (matchFound) { break; }\n }\n }\n}\n\n// bound to the interactable context when a DOM event\n// listener is added to a selector interactable\nfunction delegateListener (event, optionalArg) {\n const options = getOptions(optionalArg);\n const fakeEvent = {};\n const delegated = delegatedEvents[event.type];\n const eventTarget = (domUtils.getActualElement(event.path\n ? event.path[0]\n : event.target));\n let element = eventTarget;\n\n // duplicate the event so that currentTarget can be changed\n pExtend(fakeEvent, event);\n\n fakeEvent.originalEvent = event;\n fakeEvent.preventDefault = preventOriginalDefault;\n\n // climb up document tree looking for selector matches\n while (is.element(element)) {\n for (let i = 0; i < delegated.selectors.length; i++) {\n const selector = delegated.selectors[i];\n const context = delegated.contexts[i];\n\n if (domUtils.matchesSelector(element, selector)\n && domUtils.nodeContains(context, eventTarget)\n && domUtils.nodeContains(context, element)) {\n\n const listeners = delegated.listeners[i];\n\n fakeEvent.currentTarget = element;\n\n for (let j = 0; j < listeners.length; j++) {\n const [fn, capture, passive] = listeners[j];\n\n if (capture === !!options.capture && passive === options.passive) {\n fn(fakeEvent);\n }\n }\n }\n }\n\n element = domUtils.parentNode(element);\n }\n}\n\nfunction delegateUseCapture (event) {\n return delegateListener.call(this, event, true);\n}\n\nfunction preventDef () {\n this.returnValue = false;\n}\n\nfunction preventOriginalDefault () {\n this.originalEvent.preventDefault();\n}\n\nfunction stopProp () {\n this.cancelBubble = true;\n}\n\nfunction stopImmProp () {\n this.cancelBubble = true;\n this.immediatePropagationStopped = true;\n}\n\nfunction getOptions (param) {\n return is.object(param)? param : { capture: param };\n}\n\nmodule.exports = {\n add,\n remove,\n\n addDelegate,\n removeDelegate,\n\n delegateListener,\n delegateUseCapture,\n delegatedEvents,\n documents,\n\n useAttachEvent,\n supportsOptions,\n\n _elements: elements,\n _targets: targets,\n _attachedListeners: attachedListeners,\n};\n","module.exports = function extend (dest, source) {\n for (const prop in source) {\n dest[prop] = source[prop];\n }\n return dest;\n};\n","const {\n resolveRectLike,\n rectToXY,\n} = require('./rect');\n\nmodule.exports = function (target, element, action) {\n const actionOptions = target.options[action];\n const actionOrigin = actionOptions && actionOptions.origin;\n const origin = actionOrigin || target.options.origin;\n\n const originRect = resolveRectLike(origin, target, element, [target && element]);\n\n return rectToXY(originRect) || { x: 0, y: 0 };\n};\n","module.exports = (x, y) => Math.sqrt(x * x + y * y);\n","const extend = require('./extend');\nconst win = require('./window');\n\nconst utils = {\n warnOnce: function (method, message) {\n let warned = false;\n\n return function () {\n if (!warned) {\n win.window.console.warn(message);\n warned = true;\n }\n\n return method.apply(this, arguments);\n };\n },\n\n // http://stackoverflow.com/a/5634528/2280888\n _getQBezierValue: function (t, p1, p2, p3) {\n const iT = 1 - t;\n return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3;\n },\n\n getQuadraticCurvePoint: function (startX, startY, cpX, cpY, endX, endY, position) {\n return {\n x: utils._getQBezierValue(position, startX, cpX, endX),\n y: utils._getQBezierValue(position, startY, cpY, endY),\n };\n },\n\n // http://gizma.com/easing/\n easeOutQuad: function (t, b, c, d) {\n t /= d;\n return -c * t*(t-2) + b;\n },\n\n copyAction: function (dest, src) {\n dest.name = src.name;\n dest.axis = src.axis;\n dest.edges = src.edges;\n\n return dest;\n },\n\n is : require('./is'),\n extend : extend,\n hypot : require('./hypot'),\n getOriginXY: require('./getOriginXY'),\n};\n\nextend(utils, require('./arr'));\nextend(utils, require('./domUtils'));\nextend(utils, require('./pointerUtils'));\nextend(utils, require('./rect'));\n\nmodule.exports = utils;\n","const scope = require('../scope');\nconst utils = require('./index');\n\nconst finder = {\n methodOrder: [ 'simulationResume', 'mouseOrPen', 'hasPointer', 'idle' ],\n\n search: function (pointer, eventType, eventTarget) {\n const pointerType = utils.getPointerType(pointer);\n const pointerId = utils.getPointerId(pointer);\n const details = { pointer, pointerId, pointerType, eventType, eventTarget };\n\n for (const method of finder.methodOrder) {\n const interaction = finder[method](details);\n\n if (interaction) {\n return interaction;\n }\n }\n },\n\n // try to resume simulation with a new pointer\n simulationResume: function ({ pointerType, eventType, eventTarget }) {\n if (!/down|start/i.test(eventType)) {\n return null;\n }\n\n for (const interaction of scope.interactions) {\n let element = eventTarget;\n\n if (interaction.simulation && interaction.simulation.allowResume\n && (interaction.pointerType === pointerType)) {\n while (element) {\n // if the element is the interaction element\n if (element === interaction.element) {\n return interaction;\n }\n element = utils.parentNode(element);\n }\n }\n }\n\n return null;\n },\n\n // if it's a mouse or pen interaction\n mouseOrPen: function ({ pointerId, pointerType, eventType }) {\n if (pointerType !== 'mouse' && pointerType !== 'pen') {\n return null;\n }\n\n let firstNonActive;\n\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType) {\n // if it's a down event, skip interactions with running simulations\n if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; }\n\n // if the interaction is active, return it immediately\n if (interaction.interacting()) {\n return interaction;\n }\n // otherwise save it and look for another active interaction\n else if (!firstNonActive) {\n firstNonActive = interaction;\n }\n }\n }\n\n // if no active mouse interaction was found use the first inactive mouse\n // interaction\n if (firstNonActive) {\n return firstNonActive;\n }\n\n // find any mouse or pen interaction.\n // ignore the interaction if the eventType is a *down, and a simulation\n // is active\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType && !(/down/i.test(eventType) && interaction.simulation)) {\n return interaction;\n }\n }\n\n return null;\n },\n\n // get interaction that has this pointer\n hasPointer: function ({ pointerId }) {\n for (const interaction of scope.interactions) {\n if (utils.contains(interaction.pointerIds, pointerId)) {\n return interaction;\n }\n }\n },\n\n // get first idle interaction with a matching pointerType\n idle: function ({ pointerType }) {\n for (const interaction of scope.interactions) {\n // if there's already a pointer held down\n if (interaction.pointerIds.length === 1) {\n const target = interaction.target;\n // don't add this pointer if there is a target interactable and it\n // isn't gesturable\n if (target && !target.options.gesture.enabled) {\n continue;\n }\n }\n // maximum of 2 pointers per interaction\n else if (interaction.pointerIds.length >= 2) {\n continue;\n }\n\n if (!interaction.interacting() && (pointerType === interaction.pointerType)) {\n return interaction;\n }\n }\n\n return null;\n },\n};\n\nmodule.exports = finder;\n","const win = require('./window');\nconst isWindow = require('./isWindow');\n\nconst is = {\n array : () => {},\n\n window : thing => thing === win.window || isWindow(thing),\n\n docFrag : thing => is.object(thing) && thing.nodeType === 11,\n\n object : thing => !!thing && (typeof thing === 'object'),\n\n function: thing => typeof thing === 'function',\n\n number : thing => typeof thing === 'number' ,\n\n bool : thing => typeof thing === 'boolean' ,\n\n string : thing => typeof thing === 'string' ,\n\n element: thing => {\n if (!thing || (typeof thing !== 'object')) { return false; }\n\n const _window = win.getWindow(thing) || win.window;\n\n return (/object|function/.test(typeof _window.Element)\n ? thing instanceof _window.Element //DOM2\n : thing.nodeType === 1 && typeof thing.nodeName === 'string');\n },\n};\n\nis.array = thing => (is.object(thing)\n && (typeof thing.length !== 'undefined')\n && is.function(thing.splice));\n\nmodule.exports = is;\n","module.exports = (thing) => !!(thing && thing.Window) && (thing instanceof thing.Window);\n","function pointerExtend (dest, source) {\n for (const prop in source) {\n const prefixedPropREs = module.exports.prefixedPropREs;\n let deprecated = false;\n\n // skip deprecated prefixed properties\n for (const vendor in prefixedPropREs) {\n if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) {\n deprecated = true;\n break;\n }\n }\n\n if (!deprecated && typeof source[prop] !== 'function') {\n dest[prop] = source[prop];\n }\n }\n return dest;\n}\n\npointerExtend.prefixedPropREs = {\n webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/,\n};\n\nmodule.exports = pointerExtend;\n","const hypot = require('./hypot');\nconst browser = require('./browser');\nconst dom = require('./domObjects');\nconst domUtils = require('./domUtils');\nconst domObjects = require('./domObjects');\nconst is = require('./is');\nconst pointerExtend = require('./pointerExtend');\n\nconst pointerUtils = {\n copyCoords: function (dest, src) {\n dest.page = dest.page || {};\n dest.page.x = src.page.x;\n dest.page.y = src.page.y;\n\n dest.client = dest.client || {};\n dest.client.x = src.client.x;\n dest.client.y = src.client.y;\n\n dest.timeStamp = src.timeStamp;\n },\n\n setCoordDeltas: function (targetObj, prev, cur) {\n targetObj.page.x = cur.page.x - prev.page.x;\n targetObj.page.y = cur.page.y - prev.page.y;\n targetObj.client.x = cur.client.x - prev.client.x;\n targetObj.client.y = cur.client.y - prev.client.y;\n targetObj.timeStamp = cur.timeStamp - prev.timeStamp;\n\n // set pointer velocity\n const dt = Math.max(targetObj.timeStamp / 1000, 0.001);\n\n targetObj.page.speed = hypot(targetObj.page.x, targetObj.page.y) / dt;\n targetObj.page.vx = targetObj.page.x / dt;\n targetObj.page.vy = targetObj.page.y / dt;\n\n targetObj.client.speed = hypot(targetObj.client.x, targetObj.page.y) / dt;\n targetObj.client.vx = targetObj.client.x / dt;\n targetObj.client.vy = targetObj.client.y / dt;\n },\n\n isNativePointer: function (pointer) {\n return (pointer instanceof dom.Event || pointer instanceof dom.Touch);\n },\n\n // Get specified X/Y coords for mouse or event.touches[0]\n getXY: function (type, pointer, xy) {\n xy = xy || {};\n type = type || 'page';\n\n xy.x = pointer[type + 'X'];\n xy.y = pointer[type + 'Y'];\n\n return xy;\n },\n\n getPageXY: function (pointer, page) {\n page = page || {};\n\n // Opera Mobile handles the viewport and scrolling oddly\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n pointerUtils.getXY('screen', pointer, page);\n\n page.x += window.scrollX;\n page.y += window.scrollY;\n }\n else {\n pointerUtils.getXY('page', pointer, page);\n }\n\n return page;\n },\n\n getClientXY: function (pointer, client) {\n client = client || {};\n\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n // Opera Mobile handles the viewport and scrolling oddly\n pointerUtils.getXY('screen', pointer, client);\n }\n else {\n pointerUtils.getXY('client', pointer, client);\n }\n\n return client;\n },\n\n getPointerId: function (pointer) {\n return is.number(pointer.pointerId)? pointer.pointerId : pointer.identifier;\n },\n\n setCoords: function (targetObj, pointers, timeStamp) {\n const pointer = (pointers.length > 1\n ? pointerUtils.pointerAverage(pointers)\n : pointers[0]);\n\n const tmpXY = {};\n\n pointerUtils.getPageXY(pointer, tmpXY);\n targetObj.page.x = tmpXY.x;\n targetObj.page.y = tmpXY.y;\n\n pointerUtils.getClientXY(pointer, tmpXY);\n targetObj.client.x = tmpXY.x;\n targetObj.client.y = tmpXY.y;\n\n targetObj.timeStamp = is.number(timeStamp) ? timeStamp :new Date().getTime();\n },\n\n pointerExtend: pointerExtend,\n\n getTouchPair: function (event) {\n const touches = [];\n\n // array of touches is supplied\n if (is.array(event)) {\n touches[0] = event[0];\n touches[1] = event[1];\n }\n // an event\n else {\n if (event.type === 'touchend') {\n if (event.touches.length === 1) {\n touches[0] = event.touches[0];\n touches[1] = event.changedTouches[0];\n }\n else if (event.touches.length === 0) {\n touches[0] = event.changedTouches[0];\n touches[1] = event.changedTouches[1];\n }\n }\n else {\n touches[0] = event.touches[0];\n touches[1] = event.touches[1];\n }\n }\n\n return touches;\n },\n\n pointerAverage: function (pointers) {\n const average = {\n pageX : 0,\n pageY : 0,\n clientX: 0,\n clientY: 0,\n screenX: 0,\n screenY: 0,\n };\n\n for (const pointer of pointers) {\n for (const prop in average) {\n average[prop] += pointer[prop];\n }\n }\n for (const prop in average) {\n average[prop] /= pointers.length;\n }\n\n return average;\n },\n\n touchBBox: function (event) {\n if (!event.length && !(event.touches && event.touches.length > 1)) {\n return;\n }\n\n const touches = pointerUtils.getTouchPair(event);\n const minX = Math.min(touches[0].pageX, touches[1].pageX);\n const minY = Math.min(touches[0].pageY, touches[1].pageY);\n const maxX = Math.max(touches[0].pageX, touches[1].pageX);\n const maxY = Math.max(touches[0].pageY, touches[1].pageY);\n\n return {\n x: minX,\n y: minY,\n left: minX,\n top: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n },\n\n touchDistance: function (event, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n\n\n const dx = touches[0][sourceX] - touches[1][sourceX];\n const dy = touches[0][sourceY] - touches[1][sourceY];\n\n return hypot(dx, dy);\n },\n\n touchAngle: function (event, prevAngle, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n const dx = touches[1][sourceX] - touches[0][sourceX];\n const dy = touches[1][sourceY] - touches[0][sourceY];\n const angle = 180 * Math.atan2(dy , dx) / Math.PI;\n\n return angle;\n },\n\n getPointerType: function (pointer) {\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : is.number(pointer.pointerType)\n ? [undefined, undefined,'touch', 'pen', 'mouse'][pointer.pointerType]\n // if the PointerEvent API isn't available, then the \"pointer\" must\n // be either a MouseEvent, TouchEvent, or Touch object\n : /touch/.test(pointer.type) || pointer instanceof domObjects.Touch\n ? 'touch'\n : 'mouse';\n },\n\n // [ event.target, event.currentTarget ]\n getEventTargets: function (event) {\n return [\n domUtils.getActualElement(event.path ? event.path[0] : event.target),\n domUtils.getActualElement(event.currentTarget),\n ];\n },\n};\n\nmodule.exports = pointerUtils;\n","const { window } = require('./window');\n\nconst vendors = ['ms', 'moz', 'webkit', 'o'];\nlet lastTime = 0;\nlet request;\nlet cancel;\n\nfor (let x = 0; x < vendors.length && !window.requestAnimationFrame; x++) {\n request = window[vendors[x] + 'RequestAnimationFrame'];\n cancel = window[vendors[x] +'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n}\n\nif (!request) {\n request = function (callback) {\n const currTime = new Date().getTime();\n const timeToCall = Math.max(0, 16 - (currTime - lastTime));\n const id = setTimeout(function () { callback(currTime + timeToCall); },\n timeToCall);\n\n lastTime = currTime + timeToCall;\n return id;\n };\n}\n\nif (!cancel) {\n cancel = function (id) {\n clearTimeout(id);\n };\n}\n\nmodule.exports = {\n request,\n cancel,\n};\n","const extend = require('./extend');\nconst is = require('./is');\nconst {\n closest,\n parentNode,\n getElementRect,\n} = require('./domUtils');\n\nconst rectUtils = {\n getStringOptionResult: function (value, interactable, element) {\n if (!is.string(value)) {\n return null;\n }\n\n if (value === 'parent') {\n value = parentNode(element);\n }\n else if (value === 'self') {\n value = interactable.getRect(element);\n }\n else {\n value = closest(element, value);\n }\n\n return value;\n },\n\n resolveRectLike: function (value, interactable, element, functionArgs) {\n value = rectUtils.getStringOptionResult(value, interactable, element) || value;\n\n if (is.function(value)) {\n value = value.apply(null, functionArgs);\n }\n\n if (is.element(value)) {\n value = getElementRect(value);\n }\n\n return value;\n },\n\n rectToXY: function (rect) {\n return rect && {\n x: 'x' in rect ? rect.x : rect.left,\n y: 'y' in rect ? rect.y : rect.top,\n };\n },\n\n xywhToTlbr: function (rect) {\n if (rect && !('left' in rect && 'top' in rect)) {\n rect = extend({}, rect);\n\n rect.left = rect.x || 0;\n rect.top = rect.y || 0;\n rect.right = rect.right || (rect.left + rect.width);\n rect.bottom = rect.bottom || (rect.top + rect.height);\n }\n\n return rect;\n },\n\n tlbrToXywh: function (rect) {\n if (rect && !('x' in rect && 'y' in rect)) {\n rect = extend({}, rect);\n\n rect.x = rect.left || 0;\n rect.top = rect.top || 0;\n rect.width = rect.width || (rect.right - rect.x);\n rect.height = rect.height || (rect.bottom - rect.y);\n }\n\n return rect;\n },\n};\n\nmodule.exports = rectUtils;\n","const win = module.exports;\nconst isWindow = require('./isWindow');\n\nfunction init (window) {\n // get wrapped window if using Shadow DOM polyfill\n\n win.realWindow = window;\n\n // create a TextNode\n const el = window.document.createTextNode('');\n\n // check if it's wrapped by a polyfill\n if (el.ownerDocument !== window.document\n && typeof window.wrap === 'function'\n && window.wrap(el) === el) {\n // use wrapped window\n window = window.wrap(window);\n }\n\n win.window = window;\n}\n\nif (typeof window === 'undefined') {\n win.window = undefined;\n win.realWindow = undefined;\n}\nelse {\n init(window);\n}\n\nwin.getWindow = function getWindow (node) {\n if (isWindow(node)) {\n return node;\n }\n\n const rootNode = (node.ownerDocument || node);\n\n return rootNode.defaultView || rootNode.parentWindow || win.window;\n};\n\nwin.init = init;\n"]} \ No newline at end of file diff --git a/package.json b/package.json index 76f3e9969..f39704e99 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "interactjs", - "version": "1.3.0-alpha.3+sha.9595c40", + "version": "1.3.0-alpha.4+sha.7970416", "repository": { "type": "git", "url": "https://github.com/taye/interact.js.git"
- Interactable.unset()⚓➭ + Interactable.unset()⚓➭ @@ -1442,7 +1442,7 @@ Interactable.unset() - Interactable.actionChecker([checker])⚓➭ + Interactable.actionChecker([checker])⚓➭ @@ -1542,7 +1542,7 @@ Parameters - Interactable.styleCursor([newValue])⚓➭ + Interactable.styleCursor([newValue])⚓➭ @@ -1605,7 +1605,7 @@ Parameters - interact.maxInteractions([newValue])⚓➭ + interact.maxInteractions([newValue])⚓➭ @@ -1652,7 +1652,7 @@ Parameters - Interactable.preventDefault([newValue])⚓➭ + Interactable.preventDefault([newValue])⚓➭ @@ -1718,7 +1718,7 @@ Parameters - interact(element)⚓➭ + interact(element)⚓➭ @@ -1821,7 +1821,7 @@ Usage - interact.isSet(element)⚓➭ + interact.isSet(element)⚓➭ @@ -1881,7 +1881,7 @@ Parameters - interact.on(type, listener, [options])⚓➭ + interact.on(type, listener, [options])⚓➭ @@ -1948,7 +1948,7 @@ Parameters - interact.off(type, listener, [options])⚓➭ + interact.off(type, listener, [options])⚓➭ @@ -2014,7 +2014,7 @@ Parameters - interact.debug()⚓➭ + interact.debug()⚓➭ @@ -2056,7 +2056,7 @@ interact.debug() - interact.supportsTouch()⚓➭ + interact.supportsTouch()⚓➭ @@ -2097,7 +2097,7 @@ interact.supportsTouch() - interact.supportsPointerEvent()⚓➭ + interact.supportsPointerEvent()⚓➭ @@ -2138,7 +2138,7 @@ interact.supportsPointerEvent() - interact.stop(event)⚓➭ + interact.stop(event)⚓➭ @@ -2198,7 +2198,7 @@ Parameters - interact.pointerMoveTolerance([newValue])⚓➭ + interact.pointerMoveTolerance([newValue])⚓➭ @@ -2261,7 +2261,7 @@ Parameters - Interaction.start(action, target, element)⚓➭ + Interaction.start(action, target, element)⚓➭ @@ -2356,7 +2356,7 @@ Parameters - Interaction.doMove()⚓➭ + Interaction.doMove()⚓➭ @@ -2403,7 +2403,7 @@ Interaction.doMove() - Interaction.end([event])⚓➭ + Interaction.end([event])⚓➭ diff --git a/dist/interact.js b/dist/interact.js index e8ae35c3b..c78a3c751 100644 --- a/dist/interact.js +++ b/dist/interact.js @@ -1,5 +1,5 @@ /** - * interact.js v1.3.0-alpha.3+sha.9595c40 + * interact.js v1.3.0-alpha.4+sha.7970416-dirty * * Copyright (c) 2012-2017 Taye Adeyemi * Open source under the MIT License. @@ -816,6 +816,7 @@ var scope = require('./scope'); var utils = require('./utils'); var events = require('./utils/events'); var browser = require('./utils/browser'); +var domObjects = require('./utils/domObjects'); var finder = require('./utils/interactionFinder'); var signals = require('./utils/Signals').new(); @@ -829,7 +830,9 @@ var prevTouchTime = 0; scope.interactions = []; var Interaction = function () { - function Interaction() { + function Interaction(_ref) { + var pointerType = _ref.pointerType; + _classCallCheck(this, Interaction); this.target = null; // current interactable being interacted with @@ -886,7 +889,7 @@ var Interaction = function () { this.pointerWasMoved = false; this._interacting = false; - this.mouse = false; + this.pointerType = pointerType; signals.fire('new', this); @@ -1130,6 +1133,11 @@ var Interaction = function () { }; Interaction.prototype.getPointerIndex = function getPointerIndex(pointer) { + // mouse and pen interactions may have only one pointer + if (this.pointerType === 'mouse' || this.pointerType === 'pen') { + return 0; + } + return utils.indexOf(this.pointerIds, utils.getPointerId(pointer)); }; @@ -1161,8 +1169,7 @@ var Interaction = function () { }; Interaction.prototype.removePointer = function removePointer(pointer, event) { - var id = utils.getPointerId(pointer); - var index = this.mouse ? 0 : utils.indexOf(this.pointerIds, id); + var index = this.getPointerIndex(pointer); if (index === -1) { return; @@ -1197,6 +1204,8 @@ for (var i = 0, len = methodNames.length; i < len; i++) { function doOnInteractions(method) { return function (event) { + var pointerType = utils.getPointerType(event); + var _utils$getEventTarget = utils.getEventTargets(event), eventTarget = _utils$getEventTarget[0], curEventTarget = _utils$getEventTarget[1]; @@ -1210,7 +1219,7 @@ function doOnInteractions(method) { var pointer = event.changedTouches[_i]; var interaction = finder.search(pointer, event.type, eventTarget); - matches.push([pointer, interaction || new Interaction()]); + matches.push([pointer, interaction || new Interaction({ pointerType: pointerType })]); } } else { var invalidPointer = false; @@ -1218,7 +1227,7 @@ function doOnInteractions(method) { if (!browser.supportsPointerEvent && /mouse/.test(event.type)) { // ignore mouse events while touch interactions are active for (var _i2 = 0; _i2 < scope.interactions.length && !invalidPointer; _i2++) { - invalidPointer = !scope.interactions[_i2].mouse && scope.interactions[_i2].pointerIsDown; + invalidPointer = scope.interactions[_i2].pointerType !== 'mouse' && scope.interactions[_i2].pointerIsDown; } // try to ignore mouse events that are simulated by the browser @@ -1232,11 +1241,7 @@ function doOnInteractions(method) { var _interaction = finder.search(event, event.type, eventTarget); if (!_interaction) { - - _interaction = new Interaction(); - _interaction.mouse = /mouse/i.test(event.pointerType || event.type) - // MSPointerEvent.MSPOINTER_TYPE_MOUSE - || event.pointerType === 4 || !event.pointerType; + _interaction = new Interaction({ pointerType: pointerType }); } matches.push([event, _interaction]); @@ -1244,20 +1249,20 @@ function doOnInteractions(method) { } for (var _iterator = matches, _isArray = Array.isArray(_iterator), _i3 = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { - var _ref; + var _ref2; if (_isArray) { if (_i3 >= _iterator.length) break; - _ref = _iterator[_i3++]; + _ref2 = _iterator[_i3++]; } else { _i3 = _iterator.next(); if (_i3.done) break; - _ref = _i3.value; + _ref2 = _i3.value; } - var _ref2 = _ref, - _pointer = _ref2[0], - _interaction2 = _ref2[1]; + var _ref3 = _ref2, + _pointer = _ref3[0], + _interaction2 = _ref3[1]; _interaction2._updateEventTargets(eventTarget, curEventTarget); _interaction2[method](_pointer, event, eventTarget, curEventTarget); @@ -1277,7 +1282,7 @@ function endAll(event) { var docEvents = {/* 'eventType': listenerFunc */}; var pEventTypes = browser.pEventTypes; -if (scope.PointerEvent) { +if (domObjects.PointerEvent) { docEvents[pEventTypes.down] = listeners.pointerDown; docEvents[pEventTypes.move] = listeners.pointerMove; docEvents[pEventTypes.up] = listeners.pointerUp; @@ -1295,8 +1300,8 @@ if (scope.PointerEvent) { docEvents.blur = endAll; -function onDocSignal(_ref3, signalName) { - var doc = _ref3.doc; +function onDocSignal(_ref4, signalName) { + var doc = _ref4.doc; var eventMethod = signalName.indexOf('add') === 0 ? events.add : events.remove; @@ -1311,14 +1316,14 @@ function onDocSignal(_ref3, signalName) { } } -signals.on('update-pointer-down', function (_ref4) { - var interaction = _ref4.interaction, - pointer = _ref4.pointer, - pointerId = _ref4.pointerId, - pointerIndex = _ref4.pointerIndex, - event = _ref4.event, - eventTarget = _ref4.eventTarget, - down = _ref4.down; +signals.on('update-pointer-down', function (_ref5) { + var interaction = _ref5.interaction, + pointer = _ref5.pointer, + pointerId = _ref5.pointerId, + pointerIndex = _ref5.pointerIndex, + event = _ref5.event, + eventTarget = _ref5.eventTarget, + down = _ref5.down; interaction.pointerIds[pointerIndex] = pointerId; interaction.pointers[pointerIndex] = pointer; @@ -1355,7 +1360,7 @@ scope.endAllInteractions = endAll; module.exports = Interaction; -},{"./scope":34,"./utils":44,"./utils/Signals":35,"./utils/browser":37,"./utils/events":40,"./utils/interactionFinder":45}],6:[function(require,module,exports){ +},{"./scope":34,"./utils":44,"./utils/Signals":35,"./utils/browser":37,"./utils/domObjects":38,"./utils/events":40,"./utils/interactionFinder":45}],6:[function(require,module,exports){ 'use strict'; var Interaction = require('../Interaction'); @@ -5460,7 +5465,7 @@ module.exports = function () { this.originalEvent = event; this.type = type; this.pointerId = pointerUtils.getPointerId(pointer); - this.pointerType = pointerUtils.getPointerType(pointer, interaction); + this.pointerType = pointerUtils.getPointerType(pointer); this.target = eventTarget; this.currentTarget = null; @@ -5758,8 +5763,10 @@ Interaction.signals.on('down', function (_ref6) { timer.duration = minDuration; timer.timeout = setTimeout(function () { fire({ - interaction: interaction, eventCopy: eventCopy, eventTarget: eventTarget, + interaction: interaction, + eventTarget: eventTarget, pointer: browser.isIE8 ? eventCopy : pointer, + event: eventCopy, type: 'hold' }); }, minDuration); @@ -6946,17 +6953,14 @@ module.exports = utils; var scope = require('../scope'); var utils = require('./index'); -var browser = require('./browser'); var finder = { - methodOrder: ['simulationResume', 'mouse', 'hasPointer', 'idle'], + methodOrder: ['simulationResume', 'mouseOrPen', 'hasPointer', 'idle'], search: function search(pointer, eventType, eventTarget) { - var mouseEvent = /mouse/i.test(pointer.pointerType || eventType) - // MSPointerEvent.MSPOINTER_TYPE_MOUSE - || pointer.pointerType === 4; + var pointerType = utils.getPointerType(pointer); var pointerId = utils.getPointerId(pointer); - var details = { pointer: pointer, pointerId: pointerId, mouseEvent: mouseEvent, eventType: eventType, eventTarget: eventTarget }; + var details = { pointer: pointer, pointerId: pointerId, pointerType: pointerType, eventType: eventType, eventTarget: eventTarget }; for (var _iterator = finder.methodOrder, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { var _ref; @@ -6982,7 +6986,7 @@ var finder = { // try to resume simulation with a new pointer simulationResume: function simulationResume(_ref2) { - var mouseEvent = _ref2.mouseEvent, + var pointerType = _ref2.pointerType, eventType = _ref2.eventType, eventTarget = _ref2.eventTarget; @@ -7006,7 +7010,7 @@ var finder = { var element = eventTarget; - if (interaction.simulation && interaction.simulation.allowResume && interaction.mouse === mouseEvent) { + if (interaction.simulation && interaction.simulation.allowResume && interaction.pointerType === pointerType) { while (element) { // if the element is the interaction element if (element === interaction.element) { @@ -7020,13 +7024,13 @@ var finder = { return null; }, - // if it's a mouse interaction - mouse: function mouse(_ref4) { + // if it's a mouse or pen interaction + mouseOrPen: function mouseOrPen(_ref4) { var pointerId = _ref4.pointerId, - mouseEvent = _ref4.mouseEvent, + pointerType = _ref4.pointerType, eventType = _ref4.eventType; - if (!mouseEvent && (browser.supportsTouch || browser.supportsPointerEvent)) { + if (pointerType !== 'mouse' && pointerType !== 'pen') { return null; } @@ -7046,7 +7050,7 @@ var finder = { var interaction = _ref5; - if (interaction.mouse) { + if (interaction.pointerType === pointerType) { // if it's a down event, skip interactions with running simulations if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; @@ -7069,8 +7073,8 @@ var finder = { return firstNonActive; } - // Find any interaction specifically for mouse. - // ignore the interaction if the eventType is a mousedown, and a simulation + // find any mouse or pen interaction. + // ignore the interaction if the eventType is a *down, and a simulation // is active for (var _iterator4 = scope.interactions, _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) { var _ref6; @@ -7086,7 +7090,7 @@ var finder = { var _interaction = _ref6; - if (_interaction.mouse && !(/down/.test(eventType) && _interaction.simulation)) { + if (_interaction.pointerType === pointerType && !(/down/i.test(eventType) && _interaction.simulation)) { return _interaction; } } @@ -7118,9 +7122,9 @@ var finder = { } }, - // get first idle interaction + // get first idle interaction with a matching pointerType idle: function idle(_ref9) { - var mouseEvent = _ref9.mouseEvent; + var pointerType = _ref9.pointerType; for (var _iterator6 = scope.interactions, _isArray6 = Array.isArray(_iterator6), _i6 = 0, _iterator6 = _isArray6 ? _iterator6 : _iterator6[Symbol.iterator]();;) { var _ref10; @@ -7150,7 +7154,7 @@ var finder = { continue; } - if (!interaction.interacting() && mouseEvent === interaction.mouse) { + if (!interaction.interacting() && pointerType === interaction.pointerType) { return interaction; } } @@ -7161,7 +7165,7 @@ var finder = { module.exports = finder; -},{"../scope":34,"./browser":37,"./index":44}],46:[function(require,module,exports){ +},{"../scope":34,"./index":44}],46:[function(require,module,exports){ 'use strict'; var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; @@ -7262,6 +7266,7 @@ var hypot = require('./hypot'); var browser = require('./browser'); var dom = require('./domObjects'); var domUtils = require('./domUtils'); +var domObjects = require('./domObjects'); var is = require('./is'); var pointerExtend = require('./pointerExtend'); @@ -7468,17 +7473,11 @@ var pointerUtils = { return angle; }, - getPointerType: function getPointerType(pointer, interaction) { - // if the PointerEvent API isn't available, then the pointer must be ither - // a MouseEvent or TouchEvent - if (interaction.mouse) { - return 'mouse'; - } - if (!browser.supportsPointerEvent) { - return 'touch'; - } - - return is.string(pointer.pointerType) ? pointer.pointerType : [undefined, undefined, 'touch', 'pen', 'mouse'][pointer.pointerType]; + getPointerType: function getPointerType(pointer) { + return is.string(pointer.pointerType) ? pointer.pointerType : is.number(pointer.pointerType) ? [undefined, undefined, 'touch', 'pen', 'mouse'][pointer.pointerType] + // if the PointerEvent API isn't available, then the "pointer" must + // be either a MouseEvent, TouchEvent, or Touch object + : /touch/.test(pointer.type) || pointer instanceof domObjects.Touch ? 'touch' : 'mouse'; }, // [ event.target, event.currentTarget ] diff --git a/dist/interact.js.map b/dist/interact.js.map index 60832b766..4f3a62ba8 100644 --- a/dist/interact.js.map +++ b/dist/interact.js.map @@ -1 +1 @@ -{"version":3,"sources":["src/header.js","node_modules/browser-pack/_prelude.js","index.js","src/Eventable.js","src/InteractEvent.js","src/Interactable.js","src/Interaction.js","src/actions/base.js","src/actions/drag.js","src/actions/drop.js","src/actions/gesture.js","src/actions/resize.js","src/autoScroll.js","src/autoStart/InteractableMethods.js","src/autoStart/base.js","src/autoStart/delay.js","src/autoStart/drag.js","src/autoStart/gesture.js","src/autoStart/resize.js","src/defaultOptions.js","src/index.js","src/inertia.js","src/interact.js","src/interactablePreventDefault.js","src/legacyBrowsers.js","src/modifiers/index.js","src/modifiers/restrict.js","src/modifiers/restrictEdges.js","src/modifiers/restrictSize.js","src/modifiers/snap.js","src/modifiers/snapSize.js","src/pointerEvents/PointerEvent.js","src/pointerEvents/base.js","src/pointerEvents/holdRepeat.js","src/pointerEvents/interactableTargets.js","src/scope.js","src/utils/Signals.js","src/utils/arr.js","src/utils/browser.js","src/utils/domObjects.js","src/utils/domUtils.js","src/utils/events.js","src/utils/extend.js","src/utils/getOriginXY.js","src/utils/hypot.js","src/utils/index.js","src/utils/interactionFinder.js","src/utils/is.js","src/utils/isWindow.js","src/utils/pointerExtend.js","src/utils/pointerUtils.js","src/utils/raf.js","src/utils/rect.js","src/utils/window.js"],"names":[],"mappings":"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","file":"interact.js","sourceRoot":"","sourcesContent":["/**\n * interact.js v1.3.0-alpha.3+sha.9595c40\n *\n * Copyright (c) 2012-2017 Taye Adeyemi \n * Open source under the MIT License.\n * https://raw.github.com/taye/interact.js/master/LICENSE\n */\n","(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o 150) {\n return null;\n }\n\n let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI;\n const overlap = 22.5;\n\n if (angle < 0) {\n angle += 360;\n }\n\n const left = 135 - overlap <= angle && angle < 225 + overlap;\n const up = 225 - overlap <= angle && angle < 315 + overlap;\n\n const right = !left && (315 - overlap <= angle || angle < 45 + overlap);\n const down = !up && 45 - overlap <= angle && angle < 135 + overlap;\n\n return {\n up,\n down,\n left,\n right,\n angle,\n speed: interaction.prevEvent.speed,\n velocity: {\n x: interaction.prevEvent.velocityX,\n y: interaction.prevEvent.velocityY,\n },\n };\n }\n\n preventDefault () {}\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n}\n\nsignals.on('set-delta', function ({ iEvent, interaction, starting, deltaSource }) {\n const prevEvent = starting? iEvent : interaction.prevEvent;\n\n if (deltaSource === 'client') {\n iEvent.dx = iEvent.clientX - prevEvent.clientX;\n iEvent.dy = iEvent.clientY - prevEvent.clientY;\n }\n else {\n iEvent.dx = iEvent.pageX - prevEvent.pageX;\n iEvent.dy = iEvent.pageY - prevEvent.pageY;\n }\n});\n\nInteractEvent.signals = signals;\n\nmodule.exports = InteractEvent;\n","const is = require('./utils/is');\nconst events = require('./utils/events');\nconst extend = require('./utils/extend');\nconst actions = require('./actions/base');\nconst scope = require('./scope');\nconst Eventable = require('./Eventable');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nconst {\n getElementRect,\n nodeContains,\n trySelector,\n} = require('./utils/domUtils');\nconst { getWindow } = require('./utils/window');\nconst { indexOf, contains } = require('./utils/arr');\nconst { wheelEvent } = require('./utils/browser');\n\n// all set interactables\nscope.interactables = [];\n\n/*\\\n * Interactable\n [ property ]\n **\n * Object type returned by @interact\n\\*/\nclass Interactable {\n constructor (target, options) {\n options = options || {};\n\n this.target = target;\n this.events = new Eventable();\n this._context = options.context || scope.document;\n this._win = getWindow(trySelector(target)? this._context : target);\n this._doc = this._win.document;\n\n signals.fire('new', {\n target,\n options,\n interactable: this,\n win: this._win,\n });\n\n scope.addDocument( this._doc, this._win );\n\n scope.interactables.push(this);\n\n this.set(options);\n }\n\n setOnEvents (action, phases) {\n const onAction = 'on' + action;\n\n if (is.function(phases.onstart) ) { this.events[onAction + 'start' ] = phases.onstart ; }\n if (is.function(phases.onmove) ) { this.events[onAction + 'move' ] = phases.onmove ; }\n if (is.function(phases.onend) ) { this.events[onAction + 'end' ] = phases.onend ; }\n if (is.function(phases.oninertiastart)) { this.events[onAction + 'inertiastart' ] = phases.oninertiastart ; }\n\n return this;\n }\n\n setPerAction (action, options) {\n // for all the default per-action options\n for (const option in options) {\n // if this option exists for this action\n if (option in defaults[action]) {\n // if the option in the options arg is an object value\n if (is.object(options[option])) {\n // duplicate the object\n this.options[action][option] = extend(this.options[action][option] || {}, options[option]);\n\n if (is.object(defaults.perAction[option]) && 'enabled' in defaults.perAction[option]) {\n this.options[action][option].enabled = options[option].enabled === false? false : true;\n }\n }\n else if (is.bool(options[option]) && is.object(defaults.perAction[option])) {\n this.options[action][option].enabled = options[option];\n }\n else if (options[option] !== undefined) {\n // or if it's not undefined, do a plain assignment\n this.options[action][option] = options[option];\n }\n }\n }\n }\n\n /*\\\n * Interactable.getRect\n [ method ]\n *\n * The default function to get an Interactables bounding rect. Can be\n * overridden using @Interactable.rectChecker.\n *\n - element (Element) #optional The element to measure.\n = (object) The object's bounding rectangle.\n o {\n o top : 0,\n o left : 0,\n o bottom: 0,\n o right : 0,\n o width : 0,\n o height: 0\n o }\n \\*/\n getRect (element) {\n element = element || this.target;\n\n if (is.string(this.target) && !(is.element(element))) {\n element = this._context.querySelector(this.target);\n }\n\n return getElementRect(element);\n }\n\n /*\\\n * Interactable.rectChecker\n [ method ]\n *\n * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n - checker (function) #optional A function which returns this Interactable's bounding rectangle. See @Interactable.getRect\n = (function | object) The checker function or this Interactable\n \\*/\n rectChecker (checker) {\n if (is.function(checker)) {\n this.getRect = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.getRect;\n\n return this;\n }\n\n return this.getRect;\n }\n\n _backCompatOption (optionName, newValue) {\n if (trySelector(newValue) || is.object(newValue)) {\n this.options[optionName] = newValue;\n\n for (const action of actions.names) {\n this.options[action][optionName] = newValue;\n }\n\n return this;\n }\n\n return this.options[optionName];\n }\n\n /*\\\n * Interactable.origin\n [ method ]\n *\n * Gets or sets the origin of the Interactable's element. The x and y\n * of the origin will be subtracted from action event coordinates.\n *\n - origin (object | string) #optional An object eg. { x: 0, y: 0 } or string 'parent', 'self' or any CSS selector\n * OR\n - origin (Element) #optional An HTML or SVG Element whose rect will be used\n **\n = (object) The current origin or this Interactable\n \\*/\n origin (newValue) {\n return this._backCompatOption('origin', newValue);\n }\n\n /*\\\n * Interactable.deltaSource\n [ method ]\n *\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n - newValue (string) #optional Use 'client' if you will be scrolling while interacting; Use 'page' if you want autoScroll to work\n = (string | object) The current deltaSource or this Interactable\n \\*/\n deltaSource (newValue) {\n if (newValue === 'page' || newValue === 'client') {\n this.options.deltaSource = newValue;\n\n return this;\n }\n\n return this.options.deltaSource;\n }\n\n /*\\\n * Interactable.context\n [ method ]\n *\n * Gets the selector context Node of the Interactable. The default is `window.document`.\n *\n = (Node) The context Node of this Interactable\n **\n \\*/\n context () {\n return this._context;\n }\n\n inContext (element) {\n return (this._context === element.ownerDocument\n || nodeContains(this._context, element));\n }\n\n /*\\\n * Interactable.fire\n [ method ]\n *\n * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n - iEvent (InteractEvent) The InteractEvent object to be fired on this Interactable\n = (Interactable) this Interactable\n \\*/\n fire (iEvent) {\n this.events.fire(iEvent);\n\n return this;\n }\n\n _onOffMultiple (method, eventType, listener, options) {\n if (is.string(eventType) && eventType.search(' ') !== -1) {\n eventType = eventType.trim().split(/ +/);\n }\n\n if (is.array(eventType)) {\n for (let i = 0; i < eventType.length; i++) {\n this[method](eventType[i], listener, options);\n }\n\n return true;\n }\n\n if (is.object(eventType)) {\n for (const prop in eventType) {\n this[method](prop, eventType[prop], listener);\n }\n\n return true;\n }\n }\n\n /*\\\n * Interactable.on\n [ method ]\n *\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n - eventType (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) This Interactable\n \\*/\n on (eventType, listener, options) {\n if (this._onOffMultiple('on', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.on(eventType, listener);\n }\n // delegated event for selector\n else if (is.string(this.target)) {\n events.addDelegate(this.target, this._context, eventType, listener, options);\n }\n else {\n events.add(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.off\n [ method ]\n *\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n - eventType (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) This Interactable\n \\*/\n off (eventType, listener, options) {\n if (this._onOffMultiple('off', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n // if it is an action event type\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.off(eventType, listener);\n }\n // delegated event\n else if (is.string(this.target)) {\n events.removeDelegate(this.target, this._context, eventType, listener, options);\n }\n // remove listener from this Interatable's element\n else {\n events.remove(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.set\n [ method ]\n *\n * Reset the options of this Interactable\n - options (object) The new settings to apply\n = (object) This Interactable\n \\*/\n set (options) {\n if (!is.object(options)) {\n options = {};\n }\n\n this.options = extend({}, defaults.base);\n\n const perActions = extend({}, defaults.perAction);\n\n for (const actionName in actions.methodDict) {\n const methodName = actions.methodDict[actionName];\n\n this.options[actionName] = extend({}, defaults[actionName]);\n\n this.setPerAction(actionName, perActions);\n\n this[methodName](options[actionName]);\n }\n\n for (const setting of Interactable.settingsMethods) {\n this.options[setting] = defaults.base[setting];\n\n if (setting in options) {\n this[setting](options[setting]);\n }\n }\n\n signals.fire('set', {\n options,\n interactable: this,\n });\n\n return this;\n }\n\n /*\\\n * Interactable.unset\n [ method ]\n *\n * Remove this interactable from the list of interactables and remove\n * it's action capabilities and event listeners\n *\n = (object) @interact\n \\*/\n unset () {\n events.remove(this.target, 'all');\n\n if (is.string(this.target)) {\n // remove delegated events\n for (const type in events.delegatedEvents) {\n const delegated = events.delegatedEvents[type];\n\n if (delegated.selectors[0] === this.target\n && delegated.contexts[0] === this._context) {\n\n delegated.selectors.splice(0, 1);\n delegated.contexts .splice(0, 1);\n delegated.listeners.splice(0, 1);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegated[type] = null;\n }\n }\n\n events.remove(this._context, type, events.delegateListener);\n events.remove(this._context, type, events.delegateUseCapture, true);\n }\n }\n else {\n events.remove(this, 'all');\n }\n\n signals.fire('unset', { interactable: this });\n\n scope.interactables.splice(indexOf(scope.interactables, this), 1);\n\n // Stop related interactions when an Interactable is unset\n for (const interaction of scope.interactions || []) {\n if (interaction.target === this && interaction.interacting()) {\n interaction.stop();\n }\n }\n\n return scope.interact;\n }\n}\n\nscope.interactables.indexOfElement = function indexOfElement (target, context) {\n context = context || scope.document;\n\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n if (interactable.target === target && interactable._context === context) {\n return i;\n }\n }\n return -1;\n};\n\nscope.interactables.get = function interactableGet (element, options, dontCheckInContext) {\n const ret = this[this.indexOfElement(element, options && options.context)];\n\n return ret && (is.string(element) || dontCheckInContext || ret.inContext(element))? ret : null;\n};\n\nscope.interactables.forEachSelector = function (callback, element) {\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n // skip non CSS selector targets and out of context elements\n if (!is.string(interactable.target)\n || (element && !interactable.inContext(element))) {\n continue;\n }\n\n const ret = callback(interactable, interactable.target, interactable._context, i, this);\n\n if (ret !== undefined) {\n return ret;\n }\n }\n};\n\n// all interact.js eventTypes\nInteractable.eventTypes = scope.eventTypes = [];\n\nInteractable.signals = signals;\n\nInteractable.settingsMethods = [ 'deltaSource', 'origin', 'preventDefault', 'rectChecker' ];\n\nmodule.exports = Interactable;\n","const scope = require('./scope');\nconst utils = require('./utils');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst finder = require('./utils/interactionFinder');\nconst signals = require('./utils/Signals').new();\n\nconst listeners = {};\nconst methodNames = [\n 'pointerDown', 'pointerMove', 'pointerUp',\n 'updatePointer', 'removePointer',\n];\n\n// for ignoring browser's simulated mouse events\nlet prevTouchTime = 0;\n\n// all active and idle interactions\nscope.interactions = [];\n\nclass Interaction {\n constructor () {\n this.target = null; // current interactable being interacted with\n this.element = null; // the target element of the interactable\n\n this.prepared = { // action that's ready to be fired on next move event\n name : null,\n axis : null,\n edges: null,\n };\n\n // keep track of added pointers\n this.pointers = [];\n this.pointerIds = [];\n this.downTargets = [];\n this.downTimes = [];\n\n // Previous native pointer move event coordinates\n this.prevCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n // current native pointer move event coordinates\n this.curCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Starting InteractEvent pointer coordinates\n this.startCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Change in coordinates and time of the pointer\n this.pointerDelta = {\n page : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n client : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n timeStamp: 0,\n };\n\n this.downEvent = null; // pointerdown/mousedown/touchstart event\n this.downPointer = {};\n\n this._eventTarget = null;\n this._curEventTarget = null;\n\n this.prevEvent = null; // previous action event\n\n this.pointerIsDown = false;\n this.pointerWasMoved = false;\n this._interacting = false;\n\n this.mouse = false;\n\n signals.fire('new', this);\n\n scope.interactions.push(this);\n }\n\n pointerDown (pointer, event, eventTarget) {\n const pointerIndex = this.updatePointer(pointer, event, true);\n\n signals.fire('down', {\n pointer,\n event,\n eventTarget,\n pointerIndex,\n interaction: this,\n });\n }\n\n /*\\\n * Interaction.start\n [ method ]\n *\n * Start an action with the given Interactable and Element as tartgets. The\n * action must be enabled for the target Interactable and an appropriate number\n * of pointers must be held down - 1 for drag/resize, 2 for gesture.\n *\n * Use it with `interactable.able({ manualStart: false })` to always\n * [start actions manually](https://github.com/taye/interact.js/issues/114)\n *\n - action (object) The action to be performed - drag, resize, etc.\n - target (Interactable) The Interactable to target\n - element (Element) The DOM Element to target\n = (object) interact\n **\n | interact(target)\n | .draggable({\n | // disable the default drag start by down->move\n | manualStart: true\n | })\n | // start dragging after the user holds the pointer down\n | .on('hold', function (event) {\n | var interaction = event.interaction;\n |\n | if (!interaction.interacting()) {\n | interaction.start({ name: 'drag' },\n | event.interactable,\n | event.currentTarget);\n | }\n | });\n \\*/\n start (action, target, element) {\n if (this.interacting()\n || !this.pointerIsDown\n || this.pointerIds.length < (action.name === 'gesture'? 2 : 1)) {\n return;\n }\n\n // if this interaction had been removed after stopping\n // add it back\n if (utils.indexOf(scope.interactions, this) === -1) {\n scope.interactions.push(this);\n }\n\n utils.copyAction(this.prepared, action);\n this.target = target;\n this.element = element;\n\n signals.fire('action-start', {\n interaction: this,\n event: this.downEvent,\n });\n }\n\n pointerMove (pointer, event, eventTarget) {\n if (!this.simulation) {\n this.updatePointer(pointer);\n utils.setCoords(this.curCoords, this.pointers);\n }\n\n const duplicateMove = (this.curCoords.page.x === this.prevCoords.page.x\n && this.curCoords.page.y === this.prevCoords.page.y\n && this.curCoords.client.x === this.prevCoords.client.x\n && this.curCoords.client.y === this.prevCoords.client.y);\n\n let dx;\n let dy;\n\n // register movement greater than pointerMoveTolerance\n if (this.pointerIsDown && !this.pointerWasMoved) {\n dx = this.curCoords.client.x - this.startCoords.client.x;\n dy = this.curCoords.client.y - this.startCoords.client.y;\n\n this.pointerWasMoved = utils.hypot(dx, dy) > Interaction.pointerMoveTolerance;\n }\n\n const signalArg = {\n pointer,\n pointerIndex: this.getPointerIndex(pointer),\n event,\n eventTarget,\n dx,\n dy,\n duplicate: duplicateMove,\n interaction: this,\n interactingBeforeMove: this.interacting(),\n };\n\n if (!duplicateMove) {\n // set pointer coordinate, time changes and speeds\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n }\n\n signals.fire('move', signalArg);\n\n if (!duplicateMove) {\n // if interacting, fire an 'action-move' signal etc\n if (this.interacting()) {\n this.doMove(signalArg);\n }\n\n if (this.pointerWasMoved) {\n utils.copyCoords(this.prevCoords, this.curCoords);\n }\n }\n }\n\n /*\\\n * Interaction.doMove\n [ method ]\n *\n * Force a move of the current action at the same coordinates. Useful if\n * snap/restrict has been changed and you want a movement with the new\n * settings.\n *\n **\n | interact(target)\n | .draggable(true)\n | .on('dragmove', function (event) {\n | if (someCondition) {\n | // change the snap settings\n | event.interactable.draggable({ snap: { targets: [] }});\n | // fire another move event with re-calculated snap\n | event.interaction.doMove();\n | }\n | });\n \\*/\n doMove (signalArg) {\n signalArg = utils.extend({\n pointer: this.pointers[0],\n event: this.prevEvent,\n eventTarget: this._eventTarget,\n interaction: this,\n }, signalArg || {});\n\n signals.fire('before-action-move', signalArg);\n\n if (!this._dontFireMove) {\n signals.fire('action-move', signalArg);\n }\n\n this._dontFireMove = false;\n }\n\n // End interact move events and stop auto-scroll unless simulation is running\n pointerUp (pointer, event, eventTarget, curEventTarget) {\n const pointerIndex = this.getPointerIndex(pointer);\n\n signals.fire(/cancel$/i.test(event.type)? 'cancel' : 'up', {\n pointer,\n pointerIndex,\n event,\n eventTarget,\n curEventTarget,\n interaction: this,\n });\n\n if (!this.simulation) {\n this.end(event);\n }\n\n this.pointerIsDown = false;\n this.removePointer(pointer, event);\n }\n\n /*\\\n * Interaction.end\n [ method ]\n *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n - event (PointerEvent) #optional\n **\n | interact(target)\n | .draggable(true)\n | .on('move', function (event) {\n | if (event.pageX > 1000) {\n | // end the current action\n | event.interaction.end();\n | // stop all further listeners from being called\n | event.stopImmediatePropagation();\n | }\n | });\n \\*/\n end (event) {\n event = event || this.prevEvent;\n\n if (this.interacting()) {\n signals.fire('action-end', {\n event,\n interaction: this,\n });\n }\n\n this.stop();\n }\n\n currentAction () {\n return this._interacting? this.prepared.name: null;\n }\n\n interacting () {\n return this._interacting;\n }\n\n stop () {\n signals.fire('stop', { interaction: this });\n\n if (this._interacting) {\n signals.fire('stop-active', { interaction: this });\n signals.fire('stop-' + this.prepared.name, { interaction: this });\n }\n\n this.target = this.element = null;\n\n this._interacting = false;\n this.prepared.name = this.prevEvent = null;\n }\n\n getPointerIndex (pointer) {\n return utils.indexOf(this.pointerIds, utils.getPointerId(pointer));\n }\n\n updatePointer (pointer, event, down = event && /(down|start)$/i.test(event.type)) {\n const id = utils.getPointerId(pointer);\n let index = this.getPointerIndex(pointer);\n\n if (index === -1) {\n index = this.pointerIds.length;\n this.pointerIds[index] = id;\n }\n\n if (down) {\n signals.fire('update-pointer-down', {\n pointer,\n event,\n down,\n pointerId: id,\n pointerIndex: index,\n interaction: this,\n });\n }\n\n this.pointers[index] = pointer;\n\n return index;\n }\n\n removePointer (pointer, event) {\n const id = utils.getPointerId(pointer);\n const index = this.mouse? 0 : utils.indexOf(this.pointerIds, id);\n\n if (index === -1) { return; }\n\n signals.fire('remove-pointer', {\n pointer,\n event,\n pointerIndex: index,\n interaction: this,\n });\n\n this.pointers .splice(index, 1);\n this.pointerIds .splice(index, 1);\n this.downTargets.splice(index, 1);\n this.downTimes .splice(index, 1);\n }\n\n _updateEventTargets (target, currentTarget) {\n this._eventTarget = target;\n this._curEventTarget = currentTarget;\n }\n}\n\nfor (let i = 0, len = methodNames.length; i < len; i++) {\n const method = methodNames[i];\n\n listeners[method] = doOnInteractions(method);\n}\n\nfunction doOnInteractions (method) {\n return (function (event) {\n const [eventTarget, curEventTarget] = utils.getEventTargets(event);\n const matches = []; // [ [pointer, interaction], ...]\n\n if (browser.supportsTouch && /touch/.test(event.type)) {\n prevTouchTime = new Date().getTime();\n\n for (let i = 0; i < event.changedTouches.length; i++) {\n const pointer = event.changedTouches[i];\n const interaction = finder.search(pointer, event.type, eventTarget);\n\n matches.push([pointer, interaction || new Interaction()]);\n }\n }\n else {\n let invalidPointer = false;\n\n if (!browser.supportsPointerEvent && /mouse/.test(event.type)) {\n // ignore mouse events while touch interactions are active\n for (let i = 0; i < scope.interactions.length && !invalidPointer; i++) {\n invalidPointer = !scope.interactions[i].mouse && scope.interactions[i].pointerIsDown;\n }\n\n // try to ignore mouse events that are simulated by the browser\n // after a touch event\n invalidPointer = invalidPointer\n || (new Date().getTime() - prevTouchTime < 500)\n // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated\n || event.timeStamp === 0;\n }\n\n if (!invalidPointer) {\n let interaction = finder.search(event, event.type, eventTarget);\n\n if (!interaction) {\n\n interaction = new Interaction();\n interaction.mouse = (/mouse/i.test(event.pointerType || event.type)\n // MSPointerEvent.MSPOINTER_TYPE_MOUSE\n || event.pointerType === 4\n || !event.pointerType);\n }\n\n matches.push([event, interaction]);\n }\n }\n\n for (const [pointer, interaction] of matches) {\n interaction._updateEventTargets(eventTarget, curEventTarget);\n interaction[method](pointer, event, eventTarget, curEventTarget);\n }\n });\n}\n\nfunction endAll (event) {\n for (let i = 0; i < scope.interactions.length; i++) {\n const interaction = scope.interactions[i];\n\n interaction.end(event);\n signals.fire('endall', { event, interaction });\n }\n}\n\nconst docEvents = { /* 'eventType': listenerFunc */ };\nconst pEventTypes = browser.pEventTypes;\n\nif (scope.PointerEvent) {\n docEvents[pEventTypes.down ] = listeners.pointerDown;\n docEvents[pEventTypes.move ] = listeners.pointerMove;\n docEvents[pEventTypes.up ] = listeners.pointerUp;\n docEvents[pEventTypes.cancel] = listeners.pointerUp;\n}\nelse {\n docEvents.mousedown = listeners.pointerDown;\n docEvents.mousemove = listeners.pointerMove;\n docEvents.mouseup = listeners.pointerUp;\n\n docEvents.touchstart = listeners.pointerDown;\n docEvents.touchmove = listeners.pointerMove;\n docEvents.touchend = listeners.pointerUp;\n docEvents.touchcancel = listeners.pointerUp;\n}\n\ndocEvents.blur = endAll;\n\nfunction onDocSignal ({ doc }, signalName) {\n const eventMethod = signalName.indexOf('add') === 0\n ? events.add : events.remove;\n\n // delegate event listener\n for (const eventType in scope.delegatedEvents) {\n eventMethod(doc, eventType, events.delegateListener);\n eventMethod(doc, eventType, events.delegateUseCapture, true);\n }\n\n for (const eventType in docEvents) {\n eventMethod(doc, eventType, docEvents[eventType]);\n }\n}\n\nsignals.on('update-pointer-down', ({ interaction, pointer, pointerId, pointerIndex, event, eventTarget, down }) => {\n interaction.pointerIds[pointerIndex] = pointerId;\n interaction.pointers[pointerIndex] = pointer;\n\n if (down) {\n interaction.pointerIsDown = true;\n }\n\n if (!interaction.interacting()) {\n utils.setCoords(interaction.startCoords, interaction.pointers);\n\n utils.copyCoords(interaction.curCoords , interaction.startCoords);\n utils.copyCoords(interaction.prevCoords, interaction.startCoords);\n\n interaction.downEvent = event;\n interaction.downTimes[pointerIndex] = interaction.curCoords.timeStamp;\n interaction.downTargets[pointerIndex] = eventTarget || event && utils.getEventTargets(event)[0];\n interaction.pointerWasMoved = false;\n\n utils.pointerExtend(interaction.downPointer, pointer);\n }\n});\n\nscope.signals.on('add-document' , onDocSignal);\nscope.signals.on('remove-document', onDocSignal);\n\nInteraction.pointerMoveTolerance = 1;\nInteraction.doOnInteractions = doOnInteractions;\nInteraction.endAll = endAll;\nInteraction.signals = signals;\nInteraction.docEvents = docEvents;\n\nscope.endAllInteractions = endAll;\n\nmodule.exports = Interaction;\n","const Interaction = require('../Interaction');\nconst InteractEvent = require('../InteractEvent');\n\nconst actions = {\n firePrepared,\n names: [],\n methodDict: {},\n};\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n interaction._interacting = true;\n firePrepared(interaction, event, 'start');\n});\n\nInteraction.signals.on('action-move', function ({ interaction, event, preEnd }) {\n firePrepared(interaction, event, 'move', preEnd);\n\n // if the action was ended in a listener\n if (!interaction.interacting()) { return false; }\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n firePrepared(interaction, event, 'end');\n});\n\nfunction firePrepared (interaction, event, phase, preEnd) {\n const actionName = interaction.prepared.name;\n\n const newEvent = new InteractEvent(interaction, event, actionName, phase, interaction.element, null, preEnd);\n\n interaction.target.fire(newEvent);\n interaction.prevEvent = newEvent;\n}\n\nmodule.exports = actions;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drag = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n startAxis : 'xy',\n lockAxis : 'xy',\n },\n\n checker: function (pointer, event, interactable) {\n const dragOptions = interactable.options.drag;\n\n return dragOptions.enabled\n ? { name: 'drag', axis: (dragOptions.lockAxis === 'start'\n ? dragOptions.startAxis\n : dragOptions.lockAxis)}\n : null;\n },\n\n getCursor: function () {\n return 'move';\n },\n};\n\nInteraction.signals.on('before-action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n interaction.curCoords.page.y = interaction.startCoords.page.y;\n interaction.curCoords.client.y = interaction.startCoords.client.y;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vx);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vx);\n interaction.pointerDelta.client.vy = 0;\n interaction.pointerDelta.page.vy = 0;\n }\n else if (axis === 'y') {\n interaction.curCoords.page.x = interaction.startCoords.page.x;\n interaction.curCoords.client.x = interaction.startCoords.client.x;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vy);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vy);\n interaction.pointerDelta.client.vx = 0;\n interaction.pointerDelta.page.vx = 0;\n }\n});\n\n// dragmove\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'dragmove') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n iEvent.pageY = interaction.startCoords.page.y;\n iEvent.clientY = interaction.startCoords.client.y;\n iEvent.dy = 0;\n }\n else if (axis === 'y') {\n iEvent.pageX = interaction.startCoords.page.x;\n iEvent.clientX = interaction.startCoords.client.x;\n iEvent.dx = 0;\n }\n});\n\n/*\\\n * Interactable.draggable\n [ method ]\n *\n * Gets or sets whether drag actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of drag events\n | var isDraggable = interact('ul li').draggable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on drag events (object makes the Interactable draggable)\n = (object) This Interactable\n | interact(element).draggable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // the axis in which the first movement must be\n | // for the drag sequence to start\n | // 'xy' by default - any direction\n | startAxis: 'x' || 'y' || 'xy',\n |\n | // 'xy' by default - don't restrict to one axis (move in any direction)\n | // 'x' or 'y' to restrict movement to either axis\n | // 'start' to restrict movement to the axis the drag started in\n | lockAxis: 'x' || 'y' || 'xy' || 'start',\n |\n | // max number of drags that can happen concurrently\n | // with elements of this Interactable. Infinity by default\n | max: Infinity,\n |\n | // max number of drags that can target the same element+Interactable\n | // 1 by default\n | maxPerElement: 2\n | });\n\\*/\nInteractable.prototype.draggable = function (options) {\n if (utils.is.object(options)) {\n this.options.drag.enabled = options.enabled === false? false: true;\n this.setPerAction('drag', options);\n this.setOnEvents('drag', options);\n\n if (/^(xy|x|y|start)$/.test(options.lockAxis)) {\n this.options.drag.lockAxis = options.lockAxis;\n }\n if (/^(xy|x|y)$/.test(options.startAxis)) {\n this.options.drag.startAxis = options.startAxis;\n }\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drag.enabled = options;\n\n if (!options) {\n this.ondragstart = this.ondragstart = this.ondragend = null;\n }\n\n return this;\n }\n\n return this.options.drag;\n};\n\nactions.drag = drag;\nactions.names.push('drag');\nutils.merge(Interactable.eventTypes, [\n 'dragstart',\n 'dragmove',\n 'draginertiastart',\n 'draginertiaresume',\n 'dragend',\n]);\nactions.methodDict.drag = 'draggable';\n\ndefaultOptions.drag = drag.defaults;\n\nmodule.exports = drag;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst scope = require('../scope');\nconst interact = require('../interact');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drop = {\n defaults: {\n enabled: false,\n accept : null,\n overlap: 'pointer',\n },\n};\n\nlet dynamicDrop = false;\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // reset active dropzones\n interaction.activeDrops.dropzones = [];\n interaction.activeDrops.elements = [];\n interaction.activeDrops.rects = [];\n\n interaction.dropEvents = null;\n\n if (!interaction.dynamicDrop) {\n setActiveDrops(interaction, interaction.element);\n }\n\n const dragEvent = interaction.prevEvent;\n const dropEvents = getDropEvents(interaction, event, dragEvent);\n\n if (dropEvents.activate) {\n fireActiveDrops(interaction, dropEvents.activate);\n }\n});\n\nInteractEvent.signals.on('new', function ({ interaction, iEvent, event }) {\n if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { return; }\n\n const draggableElement = interaction.element;\n const dragEvent = iEvent;\n const dropResult = getDrop(dragEvent, event, draggableElement);\n\n interaction.dropTarget = dropResult.dropzone;\n interaction.dropElement = dropResult.element;\n\n interaction.dropEvents = getDropEvents(interaction, event, dragEvent);\n});\n\nInteraction.signals.on('action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n fireDropEvents(interaction, interaction.dropEvents);\n});\n\nInteraction.signals.on('action-end', function ({ interaction }) {\n if (interaction.prepared.name === 'drag') {\n fireDropEvents(interaction, interaction.dropEvents);\n }\n});\n\nInteraction.signals.on('stop-drag', function ({ interaction }) {\n interaction.activeDrops.dropzones =\n interaction.activeDrops.elements =\n interaction.activeDrops.rects =\n interaction.dropEvents = null;\n});\n\nfunction collectDrops (interaction, element) {\n const drops = [];\n const elements = [];\n\n element = element || interaction.element;\n\n // collect all dropzones and their elements which qualify for a drop\n for (const current of scope.interactables) {\n if (!current.options.drop.enabled) { continue; }\n\n const accept = current.options.drop.accept;\n\n // test the draggable element against the dropzone's accept setting\n if ((utils.is.element(accept) && accept !== element)\n || (utils.is.string(accept)\n && !utils.matchesSelector(element, accept))) {\n\n continue;\n }\n\n // query for new elements if necessary\n const dropElements = utils.is.string(current.target)\n ? current._context.querySelectorAll(current.target)\n : [current.target];\n\n for (let i = 0; i < dropElements.length; i++) {\n const currentElement = dropElements[i];\n\n if (currentElement !== element) {\n drops.push(current);\n elements.push(currentElement);\n }\n }\n }\n\n return {\n elements,\n dropzones: drops,\n };\n}\n\nfunction fireActiveDrops (interaction, event) {\n let prevElement;\n\n // loop through all active dropzones and trigger event\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n const current = interaction.activeDrops.dropzones[i];\n const currentElement = interaction.activeDrops.elements [i];\n\n // prevent trigger of duplicate events on same element\n if (currentElement !== prevElement) {\n // set current element as event target\n event.target = currentElement;\n current.fire(event);\n }\n prevElement = currentElement;\n }\n}\n\n// Collect a new set of possible drops and save them in activeDrops.\n// setActiveDrops should always be called when a drag has just started or a\n// drag event happens while dynamicDrop is true\nfunction setActiveDrops (interaction, dragElement) {\n // get dropzones and their elements that could receive the draggable\n const possibleDrops = collectDrops(interaction, dragElement, true);\n\n interaction.activeDrops.dropzones = possibleDrops.dropzones;\n interaction.activeDrops.elements = possibleDrops.elements;\n interaction.activeDrops.rects = [];\n\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n interaction.activeDrops.rects[i] =\n interaction.activeDrops.dropzones[i].getRect(interaction.activeDrops.elements[i]);\n }\n}\n\nfunction getDrop (dragEvent, event, dragElement) {\n const interaction = dragEvent.interaction;\n const validDrops = [];\n\n if (dynamicDrop) {\n setActiveDrops(interaction, dragElement);\n }\n\n // collect all dropzones and their elements which qualify for a drop\n for (let j = 0; j < interaction.activeDrops.dropzones.length; j++) {\n const current = interaction.activeDrops.dropzones[j];\n const currentElement = interaction.activeDrops.elements [j];\n const rect = interaction.activeDrops.rects [j];\n\n validDrops.push(current.dropCheck(dragEvent, event, interaction.target, dragElement, currentElement, rect)\n ? currentElement\n : null);\n }\n\n // get the most appropriate dropzone based on DOM depth and order\n const dropIndex = utils.indexOfDeepestElement(validDrops);\n\n return {\n dropzone: interaction.activeDrops.dropzones[dropIndex] || null,\n element : interaction.activeDrops.elements [dropIndex] || null,\n };\n}\n\nfunction getDropEvents (interaction, pointerEvent, dragEvent) {\n const dropEvents = {\n enter : null,\n leave : null,\n activate : null,\n deactivate: null,\n move : null,\n drop : null,\n };\n\n const tmpl = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n };\n\n if (interaction.dropElement !== interaction.prevDropElement) {\n // if there was a prevDropTarget, create a dragleave event\n if (interaction.prevDropTarget) {\n dropEvents.leave = utils.extend({ type: 'dragleave' }, tmpl);\n\n dragEvent.dragLeave = dropEvents.leave.target = interaction.prevDropElement;\n dragEvent.prevDropzone = dropEvents.leave.dropzone = interaction.prevDropTarget;\n }\n // if the dropTarget is not null, create a dragenter event\n if (interaction.dropTarget) {\n dropEvents.enter = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n type : 'dragenter',\n };\n\n dragEvent.dragEnter = interaction.dropElement;\n dragEvent.dropzone = interaction.dropTarget;\n }\n }\n\n if (dragEvent.type === 'dragend' && interaction.dropTarget) {\n dropEvents.drop = utils.extend({ type: 'drop' }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n dragEvent.relatedTarget = interaction.dropElement;\n }\n if (dragEvent.type === 'dragstart') {\n dropEvents.activate = utils.extend({ type: 'dropactivate' }, tmpl);\n\n dropEvents.activate.target = null;\n dropEvents.activate.dropzone = null;\n }\n if (dragEvent.type === 'dragend') {\n dropEvents.deactivate = utils.extend({ type: 'dropdeactivate' }, tmpl);\n\n dropEvents.deactivate.target = null;\n dropEvents.deactivate.dropzone = null;\n }\n if (dragEvent.type === 'dragmove' && interaction.dropTarget) {\n dropEvents.move = utils.extend({\n dragmove : dragEvent,\n type : 'dropmove',\n }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n }\n\n return dropEvents;\n}\n\nfunction fireDropEvents (interaction, dropEvents) {\n if (dropEvents.leave) { interaction.prevDropTarget.fire(dropEvents.leave); }\n if (dropEvents.move ) { interaction.dropTarget.fire(dropEvents.move ); }\n if (dropEvents.enter) { interaction.dropTarget.fire(dropEvents.enter); }\n if (dropEvents.drop ) { interaction.dropTarget.fire(dropEvents.drop ); }\n if (dropEvents.deactivate) {\n fireActiveDrops(interaction, dropEvents.deactivate);\n }\n\n interaction.prevDropTarget = interaction.dropTarget;\n interaction.prevDropElement = interaction.dropElement;\n}\n\n/*\\\n * Interactable.dropzone\n [ method ]\n *\n * Returns or sets whether elements can be dropped onto this\n * Interactable to trigger drop events\n *\n * Dropzones can receive the following events:\n * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends\n * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone\n * - `dragmove` when a draggable that has entered the dropzone is moved\n * - `drop` when a draggable is dropped into this dropzone\n *\n * Use the `accept` option to allow only elements that match the given CSS\n * selector or element. The value can be:\n *\n * - **an Element** - only that element can be dropped into this dropzone.\n * - **a string**, - the element being dragged must match it as a CSS selector.\n * - **`null`** - accept options is cleared - it accepts any element.\n *\n * Use the `overlap` option to set how drops are checked for. The allowed\n * values are:\n *\n * - `'pointer'`, the pointer must be over the dropzone (default)\n * - `'center'`, the draggable element's center must be over the dropzone\n * - a number from 0-1 which is the `(intersection area) / (draggable area)`.\n * e.g. `0.5` for drop to happen when half of the area of the draggable is\n * over the dropzone\n *\n * Use the `checker` option to specify a function to check if a dragged\n * element is over this Interactable.\n *\n | interact(target)\n | .dropChecker(function(dragEvent, // related dragmove or dragend event\n | event, // TouchEvent/PointerEvent/MouseEvent\n | dropped, // bool result of the default checker\n | dropzone, // dropzone Interactable\n | dropElement, // dropzone elemnt\n | draggable, // draggable Interactable\n | draggableElement) {// draggable element\n |\n | return dropped && event.target.hasAttribute('allow-drop');\n | }\n *\n *\n - options (boolean | object | null) #optional The new value to be set.\n | interact('.drop').dropzone({\n | accept: '.can-drop' || document.getElementById('single-drop'),\n | overlap: 'pointer' || 'center' || zeroToOne\n | }\n = (boolean | object) The current setting or this Interactable\n\\*/\nInteractable.prototype.dropzone = function (options) {\n if (utils.is.object(options)) {\n this.options.drop.enabled = options.enabled === false? false: true;\n\n if (utils.is.function(options.ondrop) ) { this.events.ondrop = options.ondrop ; }\n if (utils.is.function(options.ondropactivate) ) { this.events.ondropactivate = options.ondropactivate ; }\n if (utils.is.function(options.ondropdeactivate)) { this.events.ondropdeactivate = options.ondropdeactivate; }\n if (utils.is.function(options.ondragenter) ) { this.events.ondragenter = options.ondragenter ; }\n if (utils.is.function(options.ondragleave) ) { this.events.ondragleave = options.ondragleave ; }\n if (utils.is.function(options.ondropmove) ) { this.events.ondropmove = options.ondropmove ; }\n\n if (/^(pointer|center)$/.test(options.overlap)) {\n this.options.drop.overlap = options.overlap;\n }\n else if (utils.is.number(options.overlap)) {\n this.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0);\n }\n if ('accept' in options) {\n this.options.drop.accept = options.accept;\n }\n if ('checker' in options) {\n this.options.drop.checker = options.checker;\n }\n\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drop.enabled = options;\n\n if (!options) {\n this.ondragenter = this.ondragleave = this.ondrop\n = this.ondropactivate = this.ondropdeactivate = null;\n }\n\n return this;\n }\n\n return this.options.drop;\n};\n\nInteractable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) {\n let dropped = false;\n\n // if the dropzone has no rect (eg. display: none)\n // call the custom dropChecker or just return false\n if (!(rect = rect || this.getRect(dropElement))) {\n return (this.options.drop.checker\n ? this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement)\n : false);\n }\n\n const dropOverlap = this.options.drop.overlap;\n\n if (dropOverlap === 'pointer') {\n const origin = utils.getOriginXY(draggable, draggableElement, 'drag');\n const page = utils.getPageXY(dragEvent);\n\n page.x += origin.x;\n page.y += origin.y;\n\n const horizontal = (page.x > rect.left) && (page.x < rect.right);\n const vertical = (page.y > rect.top ) && (page.y < rect.bottom);\n\n dropped = horizontal && vertical;\n }\n\n const dragRect = draggable.getRect(draggableElement);\n\n if (dragRect && dropOverlap === 'center') {\n const cx = dragRect.left + dragRect.width / 2;\n const cy = dragRect.top + dragRect.height / 2;\n\n dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom;\n }\n\n if (dragRect && utils.is.number(dropOverlap)) {\n const overlapArea = (Math.max(0, Math.min(rect.right , dragRect.right ) - Math.max(rect.left, dragRect.left))\n * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top , dragRect.top )));\n\n const overlapRatio = overlapArea / (dragRect.width * dragRect.height);\n\n dropped = overlapRatio >= dropOverlap;\n }\n\n if (this.options.drop.checker) {\n dropped = this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement);\n }\n\n return dropped;\n};\n\nInteractable.signals.on('unset', function ({ interactable }) {\n interactable.dropzone(false);\n});\n\nInteractable.settingsMethods.push('dropChecker');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.dropTarget = null; // the dropzone a drag target might be dropped into\n interaction.dropElement = null; // the element at the time of checking\n interaction.prevDropTarget = null; // the dropzone that was recently dragged away from\n interaction.prevDropElement = null; // the element at the time of checking\n interaction.dropEvents = null; // the dropEvents related to the current drag event\n\n interaction.activeDrops = {\n dropzones: [], // the dropzones that are mentioned below\n elements : [], // elements of dropzones that accept the target draggable\n rects : [], // the rects of the elements mentioned above\n };\n\n});\n\nInteraction.signals.on('stop', function ({ interaction }) {\n interaction.dropTarget = interaction.dropElement =\n interaction.prevDropTarget = interaction.prevDropElement = null;\n});\n\n/*\\\n * interact.dynamicDrop\n [ method ]\n *\n * Returns or sets whether the dimensions of dropzone elements are\n * calculated on every dragmove or only on dragstart for the default\n * dropChecker\n *\n - newValue (boolean) #optional True to check on each move. False to check only before start\n = (boolean | interact) The current setting or interact\n\\*/\ninteract.dynamicDrop = function (newValue) {\n if (utils.is.bool(newValue)) {\n //if (dragging && dynamicDrop !== newValue && !newValue) {\n //calcRects(dropzones);\n //}\n\n dynamicDrop = newValue;\n\n return interact;\n }\n return dynamicDrop;\n};\n\nutils.merge(Interactable.eventTypes, [\n 'dragenter',\n 'dragleave',\n 'dropactivate',\n 'dropdeactivate',\n 'dropmove',\n 'drop',\n]);\nactions.methodDict.drop = 'dropzone';\n\ndefaultOptions.drop = drop.defaults;\n\nmodule.exports = drop;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst gesture = {\n defaults: {\n enabled : false,\n origin : null,\n restrict: null,\n },\n\n checker: function (pointer, event, interactable, element, interaction) {\n if (interaction.pointerIds.length >= 2) {\n return { name: 'gesture' };\n }\n\n return null;\n },\n\n getCursor: function () {\n return '';\n },\n};\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturestart') { return; }\n iEvent.ds = 0;\n\n interaction.gesture.startDistance = interaction.gesture.prevDistance = iEvent.distance;\n interaction.gesture.startAngle = interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.scale = 1;\n});\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturemove') { return; }\n\n iEvent.ds = iEvent.scale - interaction.gesture.scale;\n\n interaction.target.fire(iEvent);\n\n interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.prevDistance = iEvent.distance;\n\n if (iEvent.scale !== Infinity\n && iEvent.scale !== null\n && iEvent.scale !== undefined\n && !isNaN(iEvent.scale)) {\n\n interaction.gesture.scale = iEvent.scale;\n }\n});\n\n/*\\\n * Interactable.gesturable\n [ method ]\n *\n * Gets or sets whether multitouch gestures can be performed on the\n * Interactable's element\n *\n = (boolean) Indicates if this can be the target of gesture events\n | var isGestureable = interact(element).gesturable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on gesture events (makes the Interactable gesturable)\n = (object) this Interactable\n | interact(element).gesturable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // limit multiple gestures.\n | // See the explanation in @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n\\*/\nInteractable.prototype.gesturable = function (options) {\n if (utils.is.object(options)) {\n this.options.gesture.enabled = options.enabled === false? false: true;\n this.setPerAction('gesture', options);\n this.setOnEvents('gesture', options);\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.gesture.enabled = options;\n\n if (!options) {\n this.ongesturestart = this.ongesturestart = this.ongestureend = null;\n }\n\n return this;\n }\n\n return this.options.gesture;\n};\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action, event, starting, ending, deltaSource }) {\n if (action !== 'gesture') { return; }\n\n const pointers = interaction.pointers;\n\n iEvent.touches = [pointers[0], pointers[1]];\n\n if (starting) {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = 1;\n iEvent.ds = 0;\n iEvent.angle = utils.touchAngle(pointers, undefined, deltaSource);\n iEvent.da = 0;\n }\n else if (ending || event instanceof InteractEvent) {\n iEvent.distance = interaction.prevEvent.distance;\n iEvent.box = interaction.prevEvent.box;\n iEvent.scale = interaction.prevEvent.scale;\n iEvent.ds = iEvent.scale - 1;\n iEvent.angle = interaction.prevEvent.angle;\n iEvent.da = iEvent.angle - interaction.gesture.startAngle;\n }\n else {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = iEvent.distance / interaction.gesture.startDistance;\n iEvent.angle = utils.touchAngle(pointers, interaction.gesture.prevAngle, deltaSource);\n\n iEvent.ds = iEvent.scale - interaction.gesture.prevScale;\n iEvent.da = iEvent.angle - interaction.gesture.prevAngle;\n }\n});\n\nInteraction.signals.on('new', function (interaction) {\n interaction.gesture = {\n start: { x: 0, y: 0 },\n\n startDistance: 0, // distance between two touches of touchStart\n prevDistance : 0,\n distance : 0,\n\n scale: 1, // gesture.distance / gesture.startDistance\n\n startAngle: 0, // angle of line joining two touches\n prevAngle : 0, // angle of the previous gesture event\n };\n});\n\nactions.gesture = gesture;\nactions.names.push('gesture');\nutils.merge(Interactable.eventTypes, [\n 'gesturestart',\n 'gesturemove',\n 'gestureend',\n]);\nactions.methodDict.gesture = 'gesturable';\n\ndefaultOptions.gesture = gesture.defaults;\n\nmodule.exports = gesture;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\n// Less Precision with touch input\nconst defaultMargin = browser.supportsTouch || browser.supportsPointerEvent? 20: 10;\n\nconst resize = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n square: false,\n preserveAspectRatio: false,\n axis: 'xy',\n\n // use default margin\n margin: NaN,\n\n // object with props left, right, top, bottom which are\n // true/false values to resize when the pointer is over that edge,\n // CSS selectors to match the handles for each direction\n // or the Elements for each handle\n edges: null,\n\n // a value of 'none' will limit the resize rect to a minimum of 0x0\n // 'negate' will alow the rect to have negative width/height\n // 'reposition' will keep the width/height positive by swapping\n // the top and bottom edges and/or swapping the left and right edges\n invert: 'none',\n },\n\n checker: function (pointer, event, interactable, element, interaction, rect) {\n if (!rect) { return null; }\n\n const page = utils.extend({}, interaction.curCoords.page);\n const options = interactable.options;\n\n if (options.resize.enabled) {\n const resizeOptions = options.resize;\n const resizeEdges = { left: false, right: false, top: false, bottom: false };\n\n // if using resize.edges\n if (utils.is.object(resizeOptions.edges)) {\n for (const edge in resizeEdges) {\n resizeEdges[edge] = checkResizeEdge(edge,\n resizeOptions.edges[edge],\n page,\n interaction._eventTarget,\n element,\n rect,\n resizeOptions.margin || defaultMargin);\n }\n\n resizeEdges.left = resizeEdges.left && !resizeEdges.right;\n resizeEdges.top = resizeEdges.top && !resizeEdges.bottom;\n\n if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) {\n return {\n name: 'resize',\n edges: resizeEdges,\n };\n }\n }\n else {\n const right = options.resize.axis !== 'y' && page.x > (rect.right - defaultMargin);\n const bottom = options.resize.axis !== 'x' && page.y > (rect.bottom - defaultMargin);\n\n if (right || bottom) {\n return {\n name: 'resize',\n axes: (right? 'x' : '') + (bottom? 'y' : ''),\n };\n }\n }\n }\n\n return null;\n },\n\n cursors: (browser.isIe9OrOlder ? {\n x : 'e-resize',\n y : 's-resize',\n xy: 'se-resize',\n\n top : 'n-resize',\n left : 'w-resize',\n bottom : 's-resize',\n right : 'e-resize',\n topleft : 'se-resize',\n bottomright: 'se-resize',\n topright : 'ne-resize',\n bottomleft : 'ne-resize',\n } : {\n x : 'ew-resize',\n y : 'ns-resize',\n xy: 'nwse-resize',\n\n top : 'ns-resize',\n left : 'ew-resize',\n bottom : 'ns-resize',\n right : 'ew-resize',\n topleft : 'nwse-resize',\n bottomright: 'nwse-resize',\n topright : 'nesw-resize',\n bottomleft : 'nesw-resize',\n }),\n\n getCursor: function (action) {\n if (action.axis) {\n return resize.cursors[action.name + action.axis];\n }\n else if (action.edges) {\n let cursorKey = '';\n const edgeNames = ['top', 'bottom', 'left', 'right'];\n\n for (let i = 0; i < 4; i++) {\n if (action.edges[edgeNames[i]]) {\n cursorKey += edgeNames[i];\n }\n }\n\n return resize.cursors[cursorKey];\n }\n },\n};\n\n// resizestart\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'resizestart' || !interaction.prepared.edges) {\n return;\n }\n\n const startRect = interaction.target.getRect(interaction.element);\n const resizeOptions = interaction.target.options.resize;\n\n /*\n * When using the `resizable.square` or `resizable.preserveAspectRatio` options, resizing from one edge\n * will affect another. E.g. with `resizable.square`, resizing to make the right edge larger will make\n * the bottom edge larger by the same amount. We call these 'linked' edges. Any linked edges will depend\n * on the active edges and the edge being interacted with.\n */\n if (resizeOptions.square || resizeOptions.preserveAspectRatio) {\n const linkedEdges = utils.extend({}, interaction.prepared.edges);\n\n linkedEdges.top = linkedEdges.top || (linkedEdges.left && !linkedEdges.bottom);\n linkedEdges.left = linkedEdges.left || (linkedEdges.top && !linkedEdges.right );\n linkedEdges.bottom = linkedEdges.bottom || (linkedEdges.right && !linkedEdges.top );\n linkedEdges.right = linkedEdges.right || (linkedEdges.bottom && !linkedEdges.left );\n\n interaction.prepared._linkedEdges = linkedEdges;\n }\n else {\n interaction.prepared._linkedEdges = null;\n }\n\n // if using `resizable.preserveAspectRatio` option, record aspect ratio at the start of the resize\n if (resizeOptions.preserveAspectRatio) {\n interaction.resizeStartAspectRatio = startRect.width / startRect.height;\n }\n\n interaction.resizeRects = {\n start : startRect,\n current : utils.extend({}, startRect),\n inverted : utils.extend({}, startRect),\n previous : utils.extend({}, startRect),\n delta : {\n left: 0, right : 0, width : 0,\n top : 0, bottom: 0, height: 0,\n },\n };\n\n iEvent.rect = interaction.resizeRects.inverted;\n iEvent.deltaRect = interaction.resizeRects.delta;\n});\n\n// resizemove\nInteractEvent.signals.on('new', function ({ iEvent, phase, interaction }) {\n if (phase !== 'move' || !interaction.prepared.edges) { return; }\n\n const resizeOptions = interaction.target.options.resize;\n const invert = resizeOptions.invert;\n const invertible = invert === 'reposition' || invert === 'negate';\n\n let edges = interaction.prepared.edges;\n\n const start = interaction.resizeRects.start;\n const current = interaction.resizeRects.current;\n const inverted = interaction.resizeRects.inverted;\n const delta = interaction.resizeRects.delta;\n const previous = utils.extend(interaction.resizeRects.previous, inverted);\n const originalEdges = edges;\n\n let dx = iEvent.dx;\n let dy = iEvent.dy;\n\n if (resizeOptions.preserveAspectRatio || resizeOptions.square) {\n // `resize.preserveAspectRatio` takes precedence over `resize.square`\n const startAspectRatio = resizeOptions.preserveAspectRatio\n ? interaction.resizeStartAspectRatio\n : 1;\n\n edges = interaction.prepared._linkedEdges;\n\n if ((originalEdges.left && originalEdges.bottom)\n || (originalEdges.right && originalEdges.top)) {\n dy = -dx / startAspectRatio;\n }\n else if (originalEdges.left || originalEdges.right ) { dy = dx / startAspectRatio; }\n else if (originalEdges.top || originalEdges.bottom) { dx = dy * startAspectRatio; }\n }\n\n // update the 'current' rect without modifications\n if (edges.top ) { current.top += dy; }\n if (edges.bottom) { current.bottom += dy; }\n if (edges.left ) { current.left += dx; }\n if (edges.right ) { current.right += dx; }\n\n if (invertible) {\n // if invertible, copy the current rect\n utils.extend(inverted, current);\n\n if (invert === 'reposition') {\n // swap edge values if necessary to keep width/height positive\n let swap;\n\n if (inverted.top > inverted.bottom) {\n swap = inverted.top;\n\n inverted.top = inverted.bottom;\n inverted.bottom = swap;\n }\n if (inverted.left > inverted.right) {\n swap = inverted.left;\n\n inverted.left = inverted.right;\n inverted.right = swap;\n }\n }\n }\n else {\n // if not invertible, restrict to minimum of 0x0 rect\n inverted.top = Math.min(current.top, start.bottom);\n inverted.bottom = Math.max(current.bottom, start.top);\n inverted.left = Math.min(current.left, start.right);\n inverted.right = Math.max(current.right, start.left);\n }\n\n inverted.width = inverted.right - inverted.left;\n inverted.height = inverted.bottom - inverted.top ;\n\n for (const edge in inverted) {\n delta[edge] = inverted[edge] - previous[edge];\n }\n\n iEvent.edges = interaction.prepared.edges;\n iEvent.rect = inverted;\n iEvent.deltaRect = delta;\n});\n\n/*\\\n * Interactable.resizable\n [ method ]\n *\n * Gets or sets whether resize actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of resize elements\n | var isResizeable = interact('input[type=text]').resizable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on resize events (object makes the Interactable resizable)\n = (object) This Interactable\n | interact(element).resizable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | edges: {\n | top : true, // Use pointer coords to check for resize.\n | left : false, // Disable resizing from left edge.\n | bottom: '.resize-s',// Resize if pointer target matches selector\n | right : handleEl // Resize if pointer target is the given Element\n | },\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height are adjusted at a 1:1 ratio.\n | square: false,\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height maintain the aspect ratio they had when resizing started.\n | preserveAspectRatio: false,\n |\n | // a value of 'none' will limit the resize rect to a minimum of 0x0\n | // 'negate' will allow the rect to have negative width/height\n | // 'reposition' will keep the width/height positive by swapping\n | // the top and bottom edges and/or swapping the left and right edges\n | invert: 'none' || 'negate' || 'reposition'\n |\n | // limit multiple resizes.\n | // See the explanation in the @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n \\*/\nInteractable.prototype.resizable = function (options) {\n if (utils.is.object(options)) {\n this.options.resize.enabled = options.enabled === false? false: true;\n this.setPerAction('resize', options);\n this.setOnEvents('resize', options);\n\n if (/^x$|^y$|^xy$/.test(options.axis)) {\n this.options.resize.axis = options.axis;\n }\n else if (options.axis === null) {\n this.options.resize.axis = defaultOptions.resize.axis;\n }\n\n if (utils.is.bool(options.preserveAspectRatio)) {\n this.options.resize.preserveAspectRatio = options.preserveAspectRatio;\n }\n else if (utils.is.bool(options.square)) {\n this.options.resize.square = options.square;\n }\n\n return this;\n }\n if (utils.is.bool(options)) {\n this.options.resize.enabled = options;\n\n if (!options) {\n this.onresizestart = this.onresizestart = this.onresizeend = null;\n }\n\n return this;\n }\n return this.options.resize;\n};\n\nfunction checkResizeEdge (name, value, page, element, interactableElement, rect, margin) {\n // false, '', undefined, null\n if (!value) { return false; }\n\n // true value, use pointer coords and element rect\n if (value === true) {\n // if dimensions are negative, \"switch\" edges\n const width = utils.is.number(rect.width )? rect.width : rect.right - rect.left;\n const height = utils.is.number(rect.height)? rect.height : rect.bottom - rect.top ;\n\n if (width < 0) {\n if (name === 'left' ) { name = 'right'; }\n else if (name === 'right') { name = 'left' ; }\n }\n if (height < 0) {\n if (name === 'top' ) { name = 'bottom'; }\n else if (name === 'bottom') { name = 'top' ; }\n }\n\n if (name === 'left' ) { return page.x < ((width >= 0? rect.left: rect.right ) + margin); }\n if (name === 'top' ) { return page.y < ((height >= 0? rect.top : rect.bottom) + margin); }\n\n if (name === 'right' ) { return page.x > ((width >= 0? rect.right : rect.left) - margin); }\n if (name === 'bottom') { return page.y > ((height >= 0? rect.bottom: rect.top ) - margin); }\n }\n\n // the remaining checks require an element\n if (!utils.is.element(element)) { return false; }\n\n return utils.is.element(value)\n // the value is an element to use as a resize handle\n ? value === element\n // otherwise check if element matches value as selector\n : utils.matchesUpTo(element, value, interactableElement);\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.resizeAxes = 'xy';\n});\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action }) {\n if (action !== 'resize' || !interaction.resizeAxes) { return; }\n\n const options = interaction.target.options;\n\n if (options.resize.square) {\n if (interaction.resizeAxes === 'y') {\n iEvent.dx = iEvent.dy;\n }\n else {\n iEvent.dy = iEvent.dx;\n }\n iEvent.axes = 'xy';\n }\n else {\n iEvent.axes = interaction.resizeAxes;\n\n if (interaction.resizeAxes === 'x') {\n iEvent.dy = 0;\n }\n else if (interaction.resizeAxes === 'y') {\n iEvent.dx = 0;\n }\n }\n});\n\nactions.resize = resize;\nactions.names.push('resize');\nutils.merge(Interactable.eventTypes, [\n 'resizestart',\n 'resizemove',\n 'resizeinertiastart',\n 'resizeinertiaresume',\n 'resizeend',\n]);\nactions.methodDict.resize = 'resizable';\n\ndefaultOptions.resize = resize.defaults;\n\nmodule.exports = resize;\n","const raf = require('./utils/raf');\nconst getWindow = require('./utils/window').getWindow;\nconst is = require('./utils/is');\nconst domUtils = require('./utils/domUtils');\nconst Interaction = require('./Interaction');\nconst defaultOptions = require('./defaultOptions');\n\nconst autoScroll = {\n defaults: {\n enabled : false,\n container: null, // the item that is scrolled (Window or HTMLElement)\n margin : 60,\n speed : 300, // the scroll speed in pixels per second\n },\n\n interaction: null,\n i: null, // the handle returned by window.setInterval\n x: 0, y: 0, // Direction each pulse is to scroll in\n\n isScrolling: false,\n prevTime: 0,\n\n start: function (interaction) {\n autoScroll.isScrolling = true;\n raf.cancel(autoScroll.i);\n\n autoScroll.interaction = interaction;\n autoScroll.prevTime = new Date().getTime();\n autoScroll.i = raf.request(autoScroll.scroll);\n },\n\n stop: function () {\n autoScroll.isScrolling = false;\n raf.cancel(autoScroll.i);\n },\n\n // scroll the window by the values in scroll.x/y\n scroll: function () {\n const options = autoScroll.interaction.target.options[autoScroll.interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(autoScroll.interaction.element);\n const now = new Date().getTime();\n // change in time in seconds\n const dt = (now - autoScroll.prevTime) / 1000;\n // displacement\n const s = options.speed * dt;\n\n if (s >= 1) {\n if (is.window(container)) {\n container.scrollBy(autoScroll.x * s, autoScroll.y * s);\n }\n else if (container) {\n container.scrollLeft += autoScroll.x * s;\n container.scrollTop += autoScroll.y * s;\n }\n\n autoScroll.prevTime = now;\n }\n\n if (autoScroll.isScrolling) {\n raf.cancel(autoScroll.i);\n autoScroll.i = raf.request(autoScroll.scroll);\n }\n },\n check: function (interactable, actionName) {\n const options = interactable.options;\n\n return options[actionName].autoScroll && options[actionName].autoScroll.enabled;\n },\n onInteractionMove: function ({ interaction, pointer }) {\n if (!(interaction.interacting()\n && autoScroll.check(interaction.target, interaction.prepared.name))) {\n return;\n }\n\n if (interaction.simulation) {\n autoScroll.x = autoScroll.y = 0;\n return;\n }\n\n let top;\n let right;\n let bottom;\n let left;\n\n const options = interaction.target.options[interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(interaction.element);\n\n if (is.window(container)) {\n left = pointer.clientX < autoScroll.margin;\n top = pointer.clientY < autoScroll.margin;\n right = pointer.clientX > container.innerWidth - autoScroll.margin;\n bottom = pointer.clientY > container.innerHeight - autoScroll.margin;\n }\n else {\n const rect = domUtils.getElementClientRect(container);\n\n left = pointer.clientX < rect.left + autoScroll.margin;\n top = pointer.clientY < rect.top + autoScroll.margin;\n right = pointer.clientX > rect.right - autoScroll.margin;\n bottom = pointer.clientY > rect.bottom - autoScroll.margin;\n }\n\n autoScroll.x = (right ? 1: left? -1: 0);\n autoScroll.y = (bottom? 1: top? -1: 0);\n\n if (!autoScroll.isScrolling) {\n // set the autoScroll properties to those of the target\n autoScroll.margin = options.margin;\n autoScroll.speed = options.speed;\n\n autoScroll.start(interaction);\n }\n },\n};\n\nInteraction.signals.on('stop-active', function () {\n autoScroll.stop();\n});\n\nInteraction.signals.on('action-move', autoScroll.onInteractionMove);\n\ndefaultOptions.perAction.autoScroll = autoScroll.defaults;\n\nmodule.exports = autoScroll;\n","const Interactable = require('../Interactable');\nconst actions = require('../actions/base');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.ignoreFrom\n [ method ]\n *\n * If the target of the `mousedown`, `pointerdown` or `touchstart`\n * event or any of it's parents match the given CSS selector or\n * Element, no drag/resize/gesture is started.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to not ignore any elements\n = (string | Element | object) The current ignoreFrom value or this Interactable\n **\n | interact(element, { ignoreFrom: document.getElementById('no-action') });\n | // or\n | interact(element).ignoreFrom('input, textarea, a');\n\\*/\nInteractable.prototype.ignoreFrom = function (newValue) {\n return this._backCompatOption('ignoreFrom', newValue);\n};\n\n/*\\\n * Interactable.allowFrom\n [ method ]\n *\n * A drag/resize/gesture is started only If the target of the\n * `mousedown`, `pointerdown` or `touchstart` event or any of it's\n * parents match the given CSS selector or Element.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to allow from any element\n = (string | Element | object) The current allowFrom value or this Interactable\n **\n | interact(element, { allowFrom: document.getElementById('drag-handle') });\n | // or\n | interact(element).allowFrom('.handle');\n\\*/\nInteractable.prototype.allowFrom = function (newValue) {\n return this._backCompatOption('allowFrom', newValue);\n};\n\nInteractable.prototype.testIgnore = function (ignoreFrom, interactableElement, element) {\n if (!ignoreFrom || !is.element(element)) { return false; }\n\n if (is.string(ignoreFrom)) {\n return domUtils.matchesUpTo(element, ignoreFrom, interactableElement);\n }\n else if (is.element(ignoreFrom)) {\n return domUtils.nodeContains(ignoreFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testAllow = function (allowFrom, interactableElement, element) {\n if (!allowFrom) { return true; }\n\n if (!is.element(element)) { return false; }\n\n if (is.string(allowFrom)) {\n return domUtils.matchesUpTo(element, allowFrom, interactableElement);\n }\n else if (is.element(allowFrom)) {\n return domUtils.nodeContains(allowFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testIgnoreAllow = function (options, interactableElement, eventTarget) {\n return (!this.testIgnore(options.ignoreFrom, interactableElement, eventTarget)\n && this.testAllow(options.allowFrom, interactableElement, eventTarget));\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (event.buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\n","const interact = require('../interact');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst actions = require('../actions/base');\nconst defaultOptions = require('../defaultOptions');\nconst browser = require('../utils/browser');\nconst scope = require('../scope');\nconst utils = require('../utils');\nconst signals = require('../utils/Signals').new();\n\nrequire('./InteractableMethods');\n\nconst autoStart = {\n signals,\n withinInteractionLimit,\n // Allow this many interactions to happen simultaneously\n maxInteractions: Infinity,\n defaults: {\n perAction: {\n manualStart: false,\n max: Infinity,\n maxPerElement: 1,\n allowFrom: null,\n ignoreFrom: null,\n },\n },\n setActionDefaults: function (action) {\n utils.extend(action.defaults, autoStart.defaults.perAction);\n },\n};\n\n// set cursor style on mousedown\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget }) {\n if (interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\n// set cursor style on mousemove\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget }) {\n if (!interaction.mouse\n || interaction.pointerIsDown\n || interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\nInteraction.signals.on('move', function (arg) {\n const { interaction, event } = arg;\n\n if (!interaction.pointerIsDown\n || interaction.interacting()\n || !interaction.pointerWasMoved\n || !interaction.prepared.name) {\n return;\n }\n\n signals.fire('before-start', arg);\n\n const target = interaction.target;\n\n if (interaction.prepared.name && target) {\n // check manualStart and interaction limit\n if (target.options[interaction.prepared.name].manualStart\n || !withinInteractionLimit(target, interaction.element, interaction.prepared)) {\n interaction.stop(event);\n }\n else {\n interaction.start(interaction.prepared, target, interaction.element);\n }\n }\n});\n\n// Check if the current target supports the action.\n// If so, return the validated action. Otherwise, return null\nfunction validateAction (action, interactable, element, eventTarget) {\n if (utils.is.object(action)\n && interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget)\n && interactable.options[action.name].enabled\n && withinInteractionLimit(interactable, element, action)) {\n return action;\n }\n\n return null;\n}\n\nfunction validateSelector (interaction, pointer, event, matches, matchElements, eventTarget) {\n for (let i = 0, len = matches.length; i < len; i++) {\n const match = matches[i];\n const matchElement = matchElements[i];\n const action = validateAction(match.getAction(pointer, event, interaction, matchElement),\n match,\n matchElement,\n eventTarget);\n\n if (action) {\n return {\n action,\n target: match,\n element: matchElement,\n };\n }\n }\n\n return {};\n}\n\nfunction getActionInfo (interaction, pointer, event, eventTarget) {\n let matches = [];\n let matchElements = [];\n\n let element = eventTarget;\n let action = null;\n\n function pushMatches (interactable, selector, context) {\n const elements = (browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined);\n\n if (utils.matchesSelector(element, selector, elements)) {\n\n matches.push(interactable);\n matchElements.push(element);\n }\n }\n\n while (utils.is.element(element)) {\n matches = [];\n matchElements = [];\n\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && (action = validateAction(elementInteractable.getAction(pointer, event, interaction, element, eventTarget),\n elementInteractable,\n element,\n eventTarget))\n && !elementInteractable.options[action.name].manualStart) {\n return {\n element,\n action,\n target: elementInteractable,\n };\n }\n else {\n scope.interactables.forEachSelector(pushMatches, element);\n\n const actionInfo = validateSelector(interaction, pointer, event, matches, matchElements, eventTarget);\n\n if (actionInfo.action\n && !actionInfo.target.options[actionInfo.action.name].manualStart) {\n return actionInfo;\n }\n }\n\n element = utils.parentNode(element);\n }\n\n return {};\n}\n\nfunction prepare (interaction, { action, target, element }) {\n action = action || {};\n\n if (interaction.target && interaction.target.options.styleCursor) {\n interaction.target._doc.documentElement.style.cursor = '';\n }\n\n interaction.target = target;\n interaction.element = element;\n utils.copyAction(interaction.prepared, action);\n\n if (target && target.options.styleCursor) {\n const cursor = action? actions[action.name].getCursor(action) : '';\n interaction.target._doc.documentElement.style.cursor = cursor;\n }\n\n signals.fire('prepared', { interaction: interaction });\n}\n\nInteraction.signals.on('stop', function ({ interaction }) {\n const target = interaction.target;\n\n if (target && target.options.styleCursor) {\n target._doc.documentElement.style.cursor = '';\n }\n});\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (utils.is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (utils.is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n const buttons = event.buttons || ({\n 0: 1,\n 1: 4,\n 3: 8,\n 4: 16,\n })[event.button];\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\nfunction withinInteractionLimit (interactable, element, action) {\n const options = interactable.options;\n const maxActions = options[action.name].max;\n const maxPerElement = options[action.name].maxPerElement;\n let activeInteractions = 0;\n let targetCount = 0;\n let targetElementCount = 0;\n\n // no actions if any of these values == 0\n if (!(maxActions && maxPerElement && autoStart.maxInteractions)) { return; }\n\n for (let i = 0, len = scope.interactions.length; i < len; i++) {\n const interaction = scope.interactions[i];\n const otherAction = interaction.prepared.name;\n\n if (!interaction.interacting()) { continue; }\n\n activeInteractions++;\n\n if (activeInteractions >= autoStart.maxInteractions) {\n return false;\n }\n\n if (interaction.target !== interactable) { continue; }\n\n targetCount += (otherAction === action.name)|0;\n\n if (targetCount >= maxActions) {\n return false;\n }\n\n if (interaction.element === element) {\n targetElementCount++;\n\n if (otherAction !== action.name || targetElementCount >= maxPerElement) {\n return false;\n }\n }\n }\n\n return autoStart.maxInteractions > 0;\n}\n\n/*\\\n * interact.maxInteractions\n [ method ]\n **\n * Returns or sets the maximum number of concurrent interactions allowed.\n * By default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables\n * and elements, you need to enable it in the draggable, resizable and\n * gesturable `'max'` and `'maxPerElement'` options.\n **\n - newValue (number) #optional Any number. newValue <= 0 means no interactions.\n\\*/\ninteract.maxInteractions = function (newValue) {\n if (utils.is.number(newValue)) {\n autoStart.maxInteractions = newValue;\n\n return this;\n }\n\n return autoStart.maxInteractions;\n};\n\nInteractable.settingsMethods.push('styleCursor');\nInteractable.settingsMethods.push('actionChecker');\nInteractable.settingsMethods.push('ignoreFrom');\nInteractable.settingsMethods.push('allowFrom');\n\ndefaultOptions.base.actionChecker = null;\ndefaultOptions.base.styleCursor = true;\n\nutils.extend(defaultOptions.perAction, autoStart.defaults.perAction);\n\nmodule.exports = autoStart;\n","const autoStart = require('./base');\nconst Interaction = require('../Interaction');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.delayTimer = null;\n});\n\nautoStart.signals.on('prepared', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.delayTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.target, interaction.element);\n }, delay);\n }\n});\n\nInteraction.signals.on('move', function ({ interaction, duplicate }) {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.delayTimer);\n }\n});\n\n// prevent regular down->move autoStart\nautoStart.signals.on('before-start', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.prepared.name = null;\n }\n});\n","const autoStart = require('./base');\nconst scope = require('../scope');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\n\nconst { matchesSelector, parentNode } = require('../utils/domUtils');\n\nautoStart.setActionDefaults(require('../actions/drag'));\n\nautoStart.signals.on('before-start', function ({ interaction, eventTarget, dx, dy }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // check if a drag is in the correct axis\n const absX = Math.abs(dx);\n const absY = Math.abs(dy);\n const options = interaction.target.options.drag;\n const startAxis = options.startAxis;\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy');\n\n interaction.prepared.axis = options.lockAxis === 'start'\n ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n : options.lockAxis;\n\n // if the movement isn't in the startAxis of the interactable\n if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) {\n // cancel the prepared action\n interaction.prepared.name = null;\n\n // then try to get a drag from another ineractable\n\n if (!interaction.prepared.name) {\n\n let element = eventTarget;\n\n const getDraggable = function (interactable, selector, context) {\n const elements = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n if (interactable === interaction.target) { return; }\n\n if (!options.manualStart\n && !interactable.testIgnoreAllow(options, element, eventTarget)\n && matchesSelector(element, selector, elements)) {\n\n const action = interactable.getAction(interaction.downPointer,\n interaction.downEvent,\n interaction,\n element);\n\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, interactable)\n && autoStart.validateAction(action, interactable, element, eventTarget)) {\n\n return interactable;\n }\n }\n };\n\n let action = null;\n\n // check all interactables\n while (is.element(element)) {\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && elementInteractable !== interaction.target\n && !elementInteractable.options.drag.manualStart) {\n\n action = elementInteractable.getAction(interaction.downPointer, interaction.downEvent, interaction, element);\n }\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, elementInteractable)) {\n\n interaction.prepared.name = 'drag';\n interaction.target = elementInteractable;\n interaction.element = element;\n break;\n }\n\n const selectorInteractable = scope.interactables.forEachSelector(getDraggable, element);\n\n if (selectorInteractable) {\n interaction.prepared.name = 'drag';\n interaction.target = selectorInteractable;\n interaction.element = element;\n break;\n }\n\n element = parentNode(element);\n }\n }\n }\n});\n\nfunction checkStartAxis (startAxis, interactable) {\n if (!interactable) { return false; }\n\n const thisAxis = interactable.options.drag.startAxis;\n\n return (startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis);\n}\n","require('./base').setActionDefaults(require('../actions/gesture'));\n","require('./base').setActionDefaults(require('../actions/resize'));\n","module.exports = {\n base: {\n accept : null,\n preventDefault: 'auto',\n deltaSource : 'page',\n },\n\n perAction: {\n origin: { x: 0, y: 0 },\n\n // only allow left button by default\n // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n mouseButtons: 1,\n\n inertia: {\n enabled : false,\n resistance : 10, // the lambda in exponential decay\n minSpeed : 100, // target speed must be above this for inertia to start\n endSpeed : 10, // the speed at which inertia is slow enough to stop\n allowResume : true, // allow resuming an action in inertia phase\n smoothEndDuration: 300, // animate to snap/restrict endOnly if there's no inertia\n },\n },\n};\n","/* browser entry point */\n\n// Legacy browser support\nrequire('./legacyBrowsers');\n\n// inertia\nrequire('./inertia');\n\n// modifiers\nrequire('./modifiers/snap');\nrequire('./modifiers/restrict');\n\n// pointerEvents\nrequire('./pointerEvents/base');\nrequire('./pointerEvents/holdRepeat');\nrequire('./pointerEvents/interactableTargets');\n\n// delay\nrequire('./autoStart/delay');\n\n// actions\nrequire('./actions/gesture');\nrequire('./actions/resize');\nrequire('./actions/drag');\nrequire('./actions/drop');\n\n// load these modifiers after resize is loaded\nrequire('./modifiers/snapSize');\nrequire('./modifiers/restrictEdges');\nrequire('./modifiers/restrictSize');\n\n// autoStart actions\nrequire('./autoStart/gesture');\nrequire('./autoStart/resize');\nrequire('./autoStart/drag');\n\n// Interactable preventDefault setting\nrequire('./interactablePreventDefault.js');\n\n// autoScroll\nrequire('./autoScroll');\n\n// export interact\nmodule.exports = require('./interact');\n","const InteractEvent = require('./InteractEvent');\nconst Interaction = require('./Interaction');\nconst modifiers = require('./modifiers');\nconst utils = require('./utils');\nconst animationFrame = require('./utils/raf');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.inertiaStatus = {\n active : false,\n smoothEnd : false,\n allowResume: false,\n\n startEvent: null,\n upCoords : {},\n\n xe: 0, ye: 0,\n sx: 0, sy: 0,\n\n t0: 0,\n vx0: 0, vys: 0,\n duration: 0,\n\n lambda_v0: 0,\n one_ve_v0: 0,\n i : null,\n };\n\n interaction.boundInertiaFrame = () => inertiaFrame .apply(interaction);\n interaction.boundSmoothEndFrame = () => smoothEndFrame.apply(interaction);\n});\n\nInteraction.signals.on('down', function ({ interaction, event, pointer, eventTarget }) {\n const status = interaction.inertiaStatus;\n\n // Check if the down event hits the current inertia target\n if (status.active) {\n let element = eventTarget;\n\n // climb up the DOM tree from the event target\n while (utils.is.element(element)) {\n\n // if interaction element is the current inertia target element\n if (element === interaction.element) {\n // stop inertia\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n\n // update pointers to the down event's coordinates\n interaction.updatePointer(pointer);\n utils.setCoords(interaction.curCoords, interaction.pointers);\n\n // fire appropriate signals\n const signalArg = { interaction };\n Interaction.signals.fire('before-action-move', signalArg);\n Interaction.signals.fire('action-resume' , signalArg);\n\n // fire a reume event\n const resumeEvent = new InteractEvent(interaction,\n event,\n interaction.prepared.name,\n 'inertiaresume',\n interaction.element);\n\n interaction.target.fire(resumeEvent);\n interaction.prevEvent = resumeEvent;\n modifiers.resetStatuses(interaction.modifierStatuses);\n\n utils.copyCoords(interaction.prevCoords, interaction.curCoords);\n break;\n }\n\n element = utils.parentNode(element);\n }\n }\n});\n\nInteraction.signals.on('up', function ({ interaction, event }) {\n const status = interaction.inertiaStatus;\n\n if (!interaction.interacting() || status.active) { return; }\n\n const target = interaction.target;\n const options = target && target.options;\n const inertiaOptions = options && interaction.prepared.name && options[interaction.prepared.name].inertia;\n\n const now = new Date().getTime();\n const statuses = {};\n const page = utils.extend({}, interaction.curCoords.page);\n const pointerSpeed = interaction.pointerDelta.client.speed;\n\n let smoothEnd = false;\n let modifierResult;\n\n // check if inertia should be started\n const inertiaPossible = (inertiaOptions && inertiaOptions.enabled\n && interaction.prepared.name !== 'gesture'\n && event !== status.startEvent);\n\n const inertia = (inertiaPossible\n && (now - interaction.curCoords.timeStamp) < 50\n && pointerSpeed > inertiaOptions.minSpeed\n && pointerSpeed > inertiaOptions.endSpeed);\n\n const modifierArg = {\n interaction,\n pageCoords: page,\n statuses,\n preEnd: true,\n requireEndOnly: true,\n };\n\n // smoothEnd\n if (inertiaPossible && !inertia) {\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n if (modifierResult.shouldMove && modifierResult.locked) {\n smoothEnd = true;\n }\n }\n\n if (!(inertia || smoothEnd)) { return; }\n\n utils.copyCoords(status.upCoords, interaction.curCoords);\n\n interaction.pointers[0] = status.startEvent =\n new InteractEvent(interaction, event, interaction.prepared.name, 'inertiastart', interaction.element);\n\n status.t0 = now;\n\n status.active = true;\n status.allowResume = inertiaOptions.allowResume;\n interaction.simulation = status;\n\n target.fire(status.startEvent);\n\n if (inertia) {\n status.vx0 = interaction.pointerDelta.client.vx;\n status.vy0 = interaction.pointerDelta.client.vy;\n status.v0 = pointerSpeed;\n\n calcInertia(interaction, status);\n\n utils.extend(page, interaction.curCoords.page);\n\n page.x += status.xe;\n page.y += status.ye;\n\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n status.modifiedXe += modifierResult.dx;\n status.modifiedYe += modifierResult.dy;\n\n status.i = animationFrame.request(interaction.boundInertiaFrame);\n }\n else {\n status.smoothEnd = true;\n status.xe = modifierResult.dx;\n status.ye = modifierResult.dy;\n\n status.sx = status.sy = 0;\n\n status.i = animationFrame.request(interaction.boundSmoothEndFrame);\n }\n});\n\nInteraction.signals.on('stop-active', function ({ interaction }) {\n const status = interaction.inertiaStatus;\n\n if (status.active) {\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n }\n});\n\nfunction calcInertia (interaction, status) {\n const inertiaOptions = interaction.target.options[interaction.prepared.name].inertia;\n const lambda = inertiaOptions.resistance;\n const inertiaDur = -Math.log(inertiaOptions.endSpeed / status.v0) / lambda;\n\n status.x0 = interaction.prevEvent.pageX;\n status.y0 = interaction.prevEvent.pageY;\n status.t0 = status.startEvent.timeStamp / 1000;\n status.sx = status.sy = 0;\n\n status.modifiedXe = status.xe = (status.vx0 - inertiaDur) / lambda;\n status.modifiedYe = status.ye = (status.vy0 - inertiaDur) / lambda;\n status.te = inertiaDur;\n\n status.lambda_v0 = lambda / status.v0;\n status.one_ve_v0 = 1 - inertiaOptions.endSpeed / status.v0;\n}\n\nfunction inertiaFrame () {\n updateInertiaCoords(this);\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n\n const status = this.inertiaStatus;\n const options = this.target.options[this.prepared.name].inertia;\n const lambda = options.resistance;\n const t = new Date().getTime() / 1000 - status.t0;\n\n if (t < status.te) {\n\n const progress = 1 - (Math.exp(-lambda * t) - status.lambda_v0) / status.one_ve_v0;\n\n if (status.modifiedXe === status.xe && status.modifiedYe === status.ye) {\n status.sx = status.xe * progress;\n status.sy = status.ye * progress;\n }\n else {\n const quadPoint = utils.getQuadraticCurvePoint(0, 0,\n status.xe,\n status.ye,\n status.modifiedXe,\n status.modifiedYe,\n progress);\n\n status.sx = quadPoint.x;\n status.sy = quadPoint.y;\n }\n\n this.doMove();\n\n status.i = animationFrame.request(this.boundInertiaFrame);\n }\n else {\n status.sx = status.modifiedXe;\n status.sy = status.modifiedYe;\n\n this.doMove();\n this.end(status.startEvent);\n status.active = false;\n this.simulation = null;\n }\n\n utils.copyCoords(this.prevCoords, this.curCoords);\n}\n\nfunction smoothEndFrame () {\n updateInertiaCoords(this);\n\n const status = this.inertiaStatus;\n const t = new Date().getTime() - status.t0;\n const duration = this.target.options[this.prepared.name].inertia.smoothEndDuration;\n\n if (t < duration) {\n status.sx = utils.easeOutQuad(t, 0, status.xe, duration);\n status.sy = utils.easeOutQuad(t, 0, status.ye, duration);\n\n this.pointerMove(status.startEvent, status.startEvent);\n\n status.i = animationFrame.request(this.boundSmoothEndFrame);\n }\n else {\n status.sx = status.xe;\n status.sy = status.ye;\n\n this.pointerMove(status.startEvent, status.startEvent);\n this.end(status.startEvent);\n\n status.smoothEnd =\n status.active = false;\n this.simulation = null;\n }\n}\n\nfunction updateInertiaCoords (interaction) {\n const status = interaction.inertiaStatus;\n\n // return if inertia isn't running\n if (!status.active) { return; }\n\n const pageUp = status.upCoords.page;\n const clientUp = status.upCoords.client;\n\n utils.setCoords(interaction.curCoords, [ {\n pageX : pageUp.x + status.sx,\n pageY : pageUp.y + status.sy,\n clientX: clientUp.x + status.sx,\n clientY: clientUp.y + status.sy,\n } ]);\n}\n","const browser = require('./utils/browser');\nconst events = require('./utils/events');\nconst utils = require('./utils');\nconst scope = require('./scope');\nconst Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\n\nconst globalEvents = {};\n\n/*\\\n * interact\n [ method ]\n *\n * The methods of this variable can be used to set elements as\n * interactables and also to change various default settings.\n *\n * Calling it as a function and passing an element or a valid CSS selector\n * string returns an Interactable object which has various methods to\n * configure it.\n *\n - element (Element | string) The HTML or SVG Element to interact with or CSS selector\n = (object) An @Interactable\n *\n > Usage\n | interact('#draggable').draggable(true);\n |\n | var rectables = interact('rect');\n | rectables\n | .gesturable(true)\n | .on('gesturemove', function (event) {\n | // ...\n | });\n\\*/\nfunction interact (element, options) {\n let interactable = scope.interactables.get(element, options);\n\n if (!interactable) {\n interactable = new Interactable(element, options);\n interactable.events.global = globalEvents;\n }\n\n return interactable;\n}\n\n/*\\\n * interact.isSet\n [ method ]\n *\n * Check if an element has been set\n - element (Element) The Element being searched for\n = (boolean) Indicates if the element or CSS selector was previously passed to interact\n\\*/\ninteract.isSet = function (element, options) {\n return scope.interactables.indexOfElement(element, options && options.context) !== -1;\n};\n\n/*\\\n * interact.on\n [ method ]\n *\n * Adds a global listener for an InteractEvent or adds a DOM event to\n * `document`\n *\n - type (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) interact\n\\*/\ninteract.on = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.on(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.on(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n // if it is an InteractEvent type, add listener to globalEvents\n if (utils.contains(Interactable.eventTypes, type)) {\n // if this type of event was never bound\n if (!globalEvents[type]) {\n globalEvents[type] = [listener];\n }\n else {\n globalEvents[type].push(listener);\n }\n }\n // If non InteractEvent type, addEventListener to document\n else {\n events.add(scope.document, type, listener, { options });\n }\n\n return interact;\n};\n\n/*\\\n * interact.off\n [ method ]\n *\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n - type (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) interact\n \\*/\ninteract.off = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.off(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.off(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n if (!utils.contains(Interactable.eventTypes, type)) {\n events.remove(scope.document, type, listener, options);\n }\n else {\n let index;\n\n if (type in globalEvents\n && (index = utils.indexOf(globalEvents[type], listener)) !== -1) {\n globalEvents[type].splice(index, 1);\n }\n }\n\n return interact;\n};\n\n/*\\\n * interact.debug\n [ method ]\n *\n * Returns an object which exposes internal data\n = (object) An object with properties that outline the current state and expose internal functions and variables\n\\*/\ninteract.debug = function () {\n return scope;\n};\n\n// expose the functions used to calculate multi-touch properties\ninteract.getPointerAverage = utils.pointerAverage;\ninteract.getTouchBBox = utils.touchBBox;\ninteract.getTouchDistance = utils.touchDistance;\ninteract.getTouchAngle = utils.touchAngle;\n\ninteract.getElementRect = utils.getElementRect;\ninteract.getElementClientRect = utils.getElementClientRect;\ninteract.matchesSelector = utils.matchesSelector;\ninteract.closest = utils.closest;\n\n/*\\\n * interact.supportsTouch\n [ method ]\n *\n = (boolean) Whether or not the browser supports touch input\n\\*/\ninteract.supportsTouch = function () {\n return browser.supportsTouch;\n};\n\n/*\\\n * interact.supportsPointerEvent\n [ method ]\n *\n = (boolean) Whether or not the browser supports PointerEvents\n\\*/\ninteract.supportsPointerEvent = function () {\n return browser.supportsPointerEvent;\n};\n\n/*\\\n * interact.stop\n [ method ]\n *\n * Cancels all interactions (end events are not fired)\n *\n - event (Event) An event on which to call preventDefault()\n = (object) interact\n\\*/\ninteract.stop = function (event) {\n for (let i = scope.interactions.length - 1; i >= 0; i--) {\n scope.interactions[i].stop(event);\n }\n\n return interact;\n};\n\n/*\\\n * interact.pointerMoveTolerance\n [ method ]\n * Returns or sets the distance the pointer must be moved before an action\n * sequence occurs. This also affects tolerance for tap events.\n *\n - newValue (number) #optional The movement from the start position must be greater than this value\n = (number | Interactable) The current setting or interact\n\\*/\ninteract.pointerMoveTolerance = function (newValue) {\n if (utils.is.number(newValue)) {\n Interaction.pointerMoveTolerance = newValue;\n\n return this;\n }\n\n return Interaction.pointerMoveTolerance;\n};\n\ninteract.addDocument = scope.addDocument;\ninteract.removeDocument = scope.removeDocument;\n\nscope.interact = interact;\n\nmodule.exports = interact;\n","const Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\nconst scope = require('./scope');\nconst is = require('./utils/is');\nconst events = require('./utils/events');\n\nconst { nodeContains, matchesSelector } = require('./utils/domUtils');\n\n/*\\\n * Interactable.preventDefault\n [ method ]\n *\n * Returns or sets whether to prevent the browser's default behaviour\n * in response to pointer events. Can be set to:\n * - `'always'` to always prevent\n * - `'never'` to never prevent\n * - `'auto'` to let interact.js try to determine what would be best\n *\n - newValue (string) #optional `true`, `false` or `'auto'`\n = (string | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.preventDefault = function (newValue) {\n if (/^(always|never|auto)$/.test(newValue)) {\n this.options.preventDefault = newValue;\n return this;\n }\n\n if (is.bool(newValue)) {\n this.options.preventDefault = newValue? 'always' : 'never';\n return this;\n }\n\n return this.options.preventDefault;\n};\n\nInteractable.prototype.checkAndPreventDefault = function (event) {\n const setting = this.options.preventDefault;\n\n if (setting === 'never') { return; }\n\n if (setting === 'always') {\n event.preventDefault();\n return;\n }\n\n // setting === 'auto'\n\n // don't preventDefault if the browser supports passiveEvents\n // CSS touch-action and user-selecct should be used instead\n if (events.supportsOptions) {\n return;\n }\n\n // don't preventDefault of pointerdown events\n if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) {\n return;\n }\n\n // don't preventDefault on editable elements\n if (is.element(event.target)\n && matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) {\n return;\n }\n\n event.preventDefault();\n};\n\nfunction onInteractionEvent ({ interaction, event }) {\n if (interaction.target) {\n interaction.target.checkAndPreventDefault(event);\n }\n}\n\nfor (const eventSignal of ['down', 'move', 'up', 'cancel']) {\n Interaction.signals.on(eventSignal, onInteractionEvent);\n}\n\n// prevent native HTML5 drag on interact.js target elements\nInteraction.docEvents.dragstart = function preventNativeDrag (event) {\n for (const interaction of scope.interactions) {\n\n if (interaction.element\n && (interaction.element === event.target\n || nodeContains(interaction.element, event.target))) {\n\n interaction.target.checkAndPreventDefault(event);\n return;\n }\n }\n};\n","const scope = require('./scope');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst iFinder = require('./utils/interactionFinder');\nconst pointerEvents = require('./pointerEvents/base');\n\nconst { window } = require('./utils/window');\n\nconst toString = Object.prototype.toString;\n\nif (!window.Array.isArray) {\n window.Array.isArray = function (obj) {\n return toString.call(obj) === '[object Array]';\n };\n}\n\nif (!String.prototype.trim) {\n String.prototype.trim = function () {\n return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n };\n}\n\n// http://www.quirksmode.org/dom/events/click.html\n// >Events leading to dblclick\n//\n// IE8 doesn't fire down event before dblclick.\n// This workaround tries to fire a tap and doubletap after dblclick\nfunction onIE8Dblclick (event) {\n const eventTarget = event.target;\n const interaction = iFinder.search(event, event.type, eventTarget);\n\n if (!interaction) { return; }\n\n if (interaction.prevTap\n && event.clientX === interaction.prevTap.clientX\n && event.clientY === interaction.prevTap.clientY\n && eventTarget === interaction.prevTap.target) {\n\n interaction.downTargets[0] = eventTarget;\n interaction.downTimes [0] = new Date().getTime();\n\n pointerEvents.fire({\n interaction,\n event,\n eventTarget,\n pointer: event,\n type: 'tap',\n });\n }\n}\n\nif (browser.isIE8) {\n const selectFix = function (event) {\n for (const interaction of scope.interactions) {\n if (interaction.interacting()) {\n interaction.target.checkAndPreventDefault(event);\n }\n }\n };\n\n const onDocIE8 = function onDocIE8 ({ doc, win }, signalName) {\n const eventMethod = signalName.indexOf('listen') === 0\n ? events.add : events.remove;\n\n // For IE's lack of Event#preventDefault\n eventMethod(doc, 'selectstart', selectFix);\n\n if (pointerEvents) {\n eventMethod(doc, 'dblclick', onIE8Dblclick);\n }\n };\n\n scope.signals.on('add-document' , onDocIE8);\n scope.signals.on('remove-document', onDocIE8);\n}\n\nmodule.exports = null;\n","const InteractEvent = require('../InteractEvent');\nconst Interaction = require('../Interaction');\nconst extend = require('../utils/extend');\n\nconst modifiers = {\n names: [],\n\n setOffsets: function (arg) {\n const { interaction, pageCoords: page } = arg;\n const { target, element, startOffset } = interaction;\n const rect = target.getRect(element);\n\n if (rect) {\n startOffset.left = page.x - rect.left;\n startOffset.top = page.y - rect.top;\n\n startOffset.right = rect.right - page.x;\n startOffset.bottom = rect.bottom - page.y;\n\n if (!('width' in rect)) { rect.width = rect.right - rect.left; }\n if (!('height' in rect)) { rect.height = rect.bottom - rect.top ; }\n }\n else {\n startOffset.left = startOffset.top = startOffset.right = startOffset.bottom = 0;\n }\n\n arg.rect = rect;\n arg.interactable = target;\n arg.element = element;\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n\n arg.options = target.options[interaction.prepared.name][modifierName];\n\n if (!arg.options) {\n continue;\n }\n\n interaction.modifierOffsets[modifierName] = modifiers[modifierName].setOffset(arg);\n }\n },\n\n setAll: function (arg) {\n const { interaction, statuses, preEnd, requireEndOnly } = arg;\n const coords = extend({}, arg.pageCoords);\n const result = {\n dx: 0,\n dy: 0,\n changed: false,\n locked: false,\n shouldMove: true,\n };\n\n for (const modifierName of modifiers.names) {\n const modifier = modifiers[modifierName];\n const options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!shouldDo(options, preEnd, requireEndOnly)) { continue; }\n\n arg.status = arg.status = statuses[modifierName];\n arg.options = options;\n arg.offset = arg.interaction.modifierOffsets[modifierName];\n\n modifier.set(arg);\n\n if (arg.status.locked) {\n coords.x += arg.status.dx;\n coords.y += arg.status.dy;\n\n result.dx += arg.status.dx;\n result.dy += arg.status.dy;\n\n result.locked = true;\n }\n }\n\n // a move should be fired if:\n // - there are no modifiers enabled,\n // - no modifiers are \"locked\" i.e. have changed the pointer's coordinates, or\n // - the locked coords have changed since the last pointer move\n result.shouldMove = !arg.status || !result.locked || arg.status.changed;\n\n return result;\n },\n\n resetStatuses: function (statuses) {\n for (const modifierName of modifiers.names) {\n const status = statuses[modifierName] || {};\n\n status.dx = status.dy = 0;\n status.modifiedX = status.modifiedY = NaN;\n status.locked = false;\n status.changed = true;\n\n statuses[modifierName] = status;\n }\n\n return statuses;\n },\n\n start: function ({ interaction }, signalName) {\n const arg = {\n interaction,\n pageCoords: (signalName === 'action-resume' ?\n interaction.curCoords : interaction.startCoords).page,\n startOffset: interaction.startOffset,\n statuses: interaction.modifierStatuses,\n preEnd: false,\n requireEndOnly: false,\n };\n\n modifiers.setOffsets(arg);\n modifiers.resetStatuses(arg.statuses);\n\n arg.pageCoords = extend({}, interaction.startCoords.page);\n interaction.modifierResult = modifiers.setAll(arg);\n },\n};\n\nInteraction.signals.on('new', function (interaction) {\n interaction.startOffset = { left: 0, right: 0, top: 0, bottom: 0 };\n interaction.modifierOffsets = {};\n interaction.modifierStatuses = modifiers.resetStatuses({});\n interaction.modifierResult = null;\n});\n\nInteraction.signals.on('action-start' , modifiers.start);\nInteraction.signals.on('action-resume', modifiers.start);\n\nInteraction.signals.on('before-action-move', function ({ interaction, preEnd, interactingBeforeMove }) {\n const modifierResult = modifiers.setAll({\n interaction,\n preEnd,\n pageCoords: interaction.curCoords.page,\n statuses: interaction.modifierStatuses,\n requireEndOnly: false,\n });\n\n // don't fire an action move if a modifier would keep the event in the same\n // cordinates as before\n if (!modifierResult.shouldMove && interactingBeforeMove) {\n interaction._dontFireMove = true;\n }\n\n interaction.modifierResult = modifierResult;\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n for (let i = 0; i < modifiers.names.length; i++) {\n const options = interaction.target.options[interaction.prepared.name][modifiers.names[i]];\n\n // if the endOnly option is true for any modifier\n if (shouldDo(options, true, true)) {\n // fire a move event at the modified coordinates\n interaction.doMove({ event, preEnd: true });\n break;\n }\n }\n});\n\nInteractEvent.signals.on('set-xy', function (arg) {\n const { iEvent, interaction } = arg;\n const modifierArg = extend({}, arg);\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n modifierArg.options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!modifierArg.options) {\n continue;\n }\n\n const modifier = modifiers[modifierName];\n\n modifierArg.status = interaction.modifierStatuses[modifierName];\n\n iEvent[modifierName] = modifier.modifyCoords(modifierArg);\n }\n});\n\nfunction shouldDo (options, preEnd, requireEndOnly) {\n return (options && options.enabled\n && (preEnd || !options.endOnly)\n && (!requireEndOnly || options.endOnly));\n}\n\nmodule.exports = modifiers;\n","const modifiers = require('./index');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst restrict = {\n defaults: {\n enabled : false,\n endOnly : false,\n restriction: null,\n elementRect: null,\n },\n\n setOffset: function ({ rect, startOffset, options }) {\n const elementRect = options && options.elementRect;\n const offset = {};\n\n if (rect && elementRect) {\n offset.left = startOffset.left - (rect.width * elementRect.left);\n offset.top = startOffset.top - (rect.height * elementRect.top);\n\n offset.right = startOffset.right - (rect.width * (1 - elementRect.right));\n offset.bottom = startOffset.bottom - (rect.height * (1 - elementRect.bottom));\n }\n else {\n offset.left = offset.top = offset.right = offset.bottom = 0;\n }\n\n return offset;\n },\n\n set: function ({ pageCoords, interaction, status, options }) {\n if (!options) { return status; }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n\n const restriction = getRestrictionRect(options.restriction, interaction, page);\n\n if (!restriction) { return status; }\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n const rect = restriction;\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n const offset = interaction.modifierOffsets.restrict;\n\n // object is assumed to have\n // x, y, width, height or\n // left, top, right, bottom\n if ('x' in restriction && 'y' in restriction) {\n modifiedX = Math.max(Math.min(rect.x + rect.width - offset.right , page.x), rect.x + offset.left);\n modifiedY = Math.max(Math.min(rect.y + rect.height - offset.bottom, page.y), rect.y + offset.top );\n }\n else {\n modifiedX = Math.max(Math.min(rect.right - offset.right , page.x), rect.left + offset.left);\n modifiedY = Math.max(Math.min(rect.bottom - offset.bottom, page.y), rect.top + offset.top );\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const elementRect = options && options.elementRect;\n\n if (options && options.enabled\n && !(phase === 'start' && elementRect && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n getRestrictionRect,\n};\n\nfunction getRestrictionRect (value, interaction, page) {\n if (utils.is.function(value)) {\n return utils.resolveRectLike(value, interaction.target, interaction.element, [page.x, page.y, interaction]);\n } else {\n return utils.resolveRectLike(value, interaction.target, interaction.element);\n }\n}\n\nmodifiers.restrict = restrict;\nmodifiers.names.push('restrict');\n\ndefaultOptions.perAction.restrict = restrict.defaults;\n\nmodule.exports = restrict;\n","// This module adds the options.resize.restrictEdges setting which sets min and\n// max for the top, left, bottom and right edges of the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictEdges: {\n// inner: { top: 200, left: 200, right: 400, bottom: 400 },\n// outer: { top: 0, left: 0, right: 600, bottom: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst { getRestrictionRect } = require('./restrict');\n\nconst noInner = { top: +Infinity, left: +Infinity, bottom: -Infinity, right: -Infinity };\nconst noOuter = { top: -Infinity, left: -Infinity, bottom: +Infinity, right: +Infinity };\n\nconst restrictEdges = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n offset: null,\n },\n\n setOffset: function ({ interaction, startOffset, options }) {\n if (!options) {\n return utils.extend({}, startOffset);\n }\n\n const offset = getRestrictionRect(options.offset, interaction, interaction.startCoords.page);\n\n if (offset) {\n return {\n top: startOffset.top + offset.y,\n left: startOffset.left + offset.x,\n bottom: startOffset.bottom + offset.y,\n right: startOffset.right + offset.x,\n };\n }\n\n return startOffset;\n },\n\n set: function ({ pageCoords, interaction, status, offset, options }) {\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n const inner = rectUtils.xywhToTlbr(getRestrictionRect(options.inner, interaction, page)) || noInner;\n const outer = rectUtils.xywhToTlbr(getRestrictionRect(options.outer, interaction, page)) || noOuter;\n\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n if (edges.top) {\n modifiedY = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top);\n }\n else if (edges.bottom) {\n modifiedY = Math.max(Math.min(outer.bottom - offset.bottom, page.y), inner.bottom - offset.bottom);\n }\n if (edges.left) {\n modifiedX = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left);\n }\n else if (edges.right) {\n modifiedX = Math.max(Math.min(outer.right - offset.right, page.x), inner.right - offset.right);\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n if (options && options.enabled\n && !(phase === 'start' && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n noInner,\n noOuter,\n getRestrictionRect,\n};\n\nmodifiers.restrictEdges = restrictEdges;\nmodifiers.names.push('restrictEdges');\n\ndefaultOptions.perAction.restrictEdges = restrictEdges.defaults;\nresize.defaults.restrictEdges = restrictEdges.defaults;\n\nmodule.exports = restrictEdges;\n","// This module adds the options.resize.restrictSize setting which sets min and\n// max width and height for the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictSize: {\n// min: { width: -600, height: -600 },\n// max: { width: 600, height: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst restrictEdges = require('./restrictEdges');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst noMin = { width: -Infinity, height: -Infinity };\nconst noMax = { width: +Infinity, height: +Infinity };\n\nconst restrictSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n },\n\n setOffset: function ({ interaction }) {\n return interaction.startOffset;\n },\n\n set: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const rect = rectUtils.xywhToTlbr(interaction.resizeRects.inverted);\n\n const minSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.min, interaction)) || noMin;\n const maxSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.max, interaction)) || noMax;\n\n arg.options = {\n enabled: options.enabled,\n endOnly: options.endOnly,\n inner: utils.extend({}, restrictEdges.noInner),\n outer: utils.extend({}, restrictEdges.noOuter),\n };\n\n if (edges.top) {\n arg.options.inner.top = rect.bottom - minSize.height;\n arg.options.outer.top = rect.bottom - maxSize.height;\n }\n else if (edges.bottom) {\n arg.options.inner.bottom = rect.top + minSize.height;\n arg.options.outer.bottom = rect.top + maxSize.height;\n }\n if (edges.left) {\n arg.options.inner.left = rect.right - minSize.width;\n arg.options.outer.left = rect.right - maxSize.width;\n }\n else if (edges.right) {\n arg.options.inner.right = rect.left + minSize.width;\n arg.options.outer.right = rect.left + maxSize.width;\n }\n\n restrictEdges.set(arg);\n },\n\n modifyCoords: restrictEdges.modifyCoords,\n};\n\nmodifiers.restrictSize = restrictSize;\nmodifiers.names.push('restrictSize');\n\ndefaultOptions.perAction.restrictSize = restrictSize.defaults;\nresize.defaults.restrictSize = restrictSize.defaults;\n\nmodule.exports = restrictSize;\n","const modifiers = require('./index');\nconst interact = require('../interact');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst snap = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n\n relativePoints: null,\n },\n\n setOffset: function ({ interaction, interactable, element, rect, startOffset, options }) {\n const offsets = [];\n const optionsOrigin = utils.rectToXY(utils.resolveRectLike(options.origin));\n const origin = optionsOrigin || utils.getOriginXY(interactable, element, interaction.prepared.name);\n options = options || interactable.options[interaction.prepared.name].snap || {};\n\n let snapOffset;\n\n if (options.offset === 'startCoords') {\n snapOffset = {\n x: interaction.startCoords.page.x - origin.x,\n y: interaction.startCoords.page.y - origin.y,\n };\n }\n else {\n const offsetRect = utils.resolveRectLike(options.offset, interactable, element, [interaction]);\n\n snapOffset = utils.rectToXY(offsetRect) || { x: 0, y: 0 };\n }\n\n if (rect && options.relativePoints && options.relativePoints.length) {\n for (const { x: relativeX, y: relativeY } of options.relativePoints) {\n offsets.push({\n x: startOffset.left - (rect.width * relativeX) + snapOffset.x,\n y: startOffset.top - (rect.height * relativeY) + snapOffset.y,\n });\n }\n }\n else {\n offsets.push(snapOffset);\n }\n\n return offsets;\n },\n\n set: function ({ interaction, pageCoords, status, options, offset: offsets }) {\n const targets = [];\n let target;\n let page;\n let i;\n\n if (status.useStatusXY) {\n page = { x: status.x, y: status.y };\n }\n else {\n const origin = utils.getOriginXY(interaction.target, interaction.element, interaction.prepared.name);\n\n page = utils.extend({}, pageCoords);\n\n page.x -= origin.x;\n page.y -= origin.y;\n }\n\n status.realX = page.x;\n status.realY = page.y;\n\n let len = options.targets? options.targets.length : 0;\n\n for (const { x: offsetX, y: offsetY } of offsets) {\n const relativeX = page.x - offsetX;\n const relativeY = page.y - offsetY;\n\n for (const snapTarget of options.targets) {\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n targets.push({\n x: utils.is.number(target.x) ? (target.x + offsetX) : relativeX,\n y: utils.is.number(target.y) ? (target.y + offsetY) : relativeY,\n\n range: utils.is.number(target.range)? target.range: options.range,\n });\n }\n }\n\n const closest = {\n target: null,\n inRange: false,\n distance: 0,\n range: 0,\n dx: 0,\n dy: 0,\n };\n\n for (i = 0, len = targets.length; i < len; i++) {\n target = targets[i];\n\n const range = target.range;\n const dx = target.x - page.x;\n const dy = target.y - page.y;\n const distance = utils.hypot(dx, dy);\n let inRange = distance <= range;\n\n // Infinite targets count as being out of range\n // compared to non infinite ones that are in range\n if (range === Infinity && closest.inRange && closest.range !== Infinity) {\n inRange = false;\n }\n\n if (!closest.target || (inRange\n // is the closest target in range?\n ? (closest.inRange && range !== Infinity\n // the pointer is relatively deeper in this target\n ? distance / range < closest.distance / closest.range\n // this target has Infinite range and the closest doesn't\n : (range === Infinity && closest.range !== Infinity)\n // OR this target is closer that the previous closest\n || distance < closest.distance)\n // The other is not in range and the pointer is closer to this target\n : (!closest.inRange && distance < closest.distance))) {\n\n closest.target = target;\n closest.distance = distance;\n closest.range = range;\n closest.inRange = inRange;\n closest.dx = dx;\n closest.dy = dy;\n\n status.range = range;\n }\n }\n\n let snapChanged;\n\n if (closest.target) {\n snapChanged = (status.modifiedX !== closest.target.x || status.modifiedY !== closest.target.y);\n\n status.modifiedX = closest.target.x;\n status.modifiedY = closest.target.y;\n }\n else {\n snapChanged = true;\n\n status.modifiedX = NaN;\n status.modifiedY = NaN;\n }\n\n status.dx = closest.dx;\n status.dy = closest.dy;\n\n status.changed = (snapChanged || (closest.inRange && !status.locked));\n status.locked = closest.inRange;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const relativePoints = options && options.relativePoints;\n\n if (options && options.enabled\n && !(phase === 'start' && relativePoints && relativePoints.length)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n }\n\n return {\n range : status.range,\n locked : status.locked,\n x : status.modifiedX,\n y : status.modifiedY,\n realX : status.realX,\n realY : status.realY,\n dx : status.dx,\n dy : status.dy,\n };\n }\n },\n};\n\ninteract.createSnapGrid = function (grid) {\n return function (x, y) {\n const limits = grid.limits || {\n left : -Infinity,\n right : Infinity,\n top : -Infinity,\n bottom: Infinity,\n };\n let offsetX = 0;\n let offsetY = 0;\n\n if (utils.is.object(grid.offset)) {\n offsetX = grid.offset.x;\n offsetY = grid.offset.y;\n }\n\n const gridx = Math.round((x - offsetX) / grid.x);\n const gridy = Math.round((y - offsetY) / grid.y);\n\n const newX = Math.max(limits.left, Math.min(limits.right , gridx * grid.x + offsetX));\n const newY = Math.max(limits.top , Math.min(limits.bottom, gridy * grid.y + offsetY));\n\n return {\n x: newX,\n y: newY,\n range: grid.range,\n };\n };\n};\n\nmodifiers.snap = snap;\nmodifiers.names.push('snap');\n\ndefaultOptions.perAction.snap = snap.defaults;\n\nmodule.exports = snap;\n","// This module allows snapping of the size of targets during resize\n// interactions.\n\nconst modifiers = require('./index');\nconst snap = require('./snap');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\nconst utils = require('../utils/');\n\nconst snapSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n },\n\n setOffset: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.edges;\n\n if (!edges) { return; }\n\n arg.options = {\n relativePoints: [{\n x: edges.left? 0 : 1,\n y: edges.top ? 0 : 1,\n }],\n origin: { x: 0, y: 0 },\n offset: 'self',\n range: options.range,\n };\n\n const offsets = snap.setOffset(arg);\n arg.options = options;\n\n return offsets;\n },\n\n set: function (arg) {\n const { interaction, options, offset, pageCoords } = arg;\n const page = utils.extend({}, pageCoords);\n const relativeX = page.x - offset[0].x;\n const relativeY = page.y - offset[0].y;\n\n arg.options = utils.extend({}, options);\n arg.options.targets = [];\n\n for (const snapTarget of options.targets) {\n let target;\n\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n if ('width' in target && 'height' in target) {\n target.x = target.width;\n target.y = target.height;\n }\n\n arg.options.targets.push(target);\n }\n\n snap.set(arg);\n },\n\n modifyCoords: function (arg) {\n const { options } = arg;\n\n arg.options = utils.extend({}, options);\n arg.options.enabled = options.enabled;\n arg.options.relativePoints = [null];\n\n snap.modifyCoords(arg);\n },\n};\n\nmodifiers.snapSize = snapSize;\nmodifiers.names.push('snapSize');\n\ndefaultOptions.perAction.snapSize = snapSize.defaults;\nresize.defaults.snapSize = snapSize.defaults;\n\nmodule.exports = snapSize;\n","const pointerUtils = require('../utils/pointerUtils');\n\nmodule.exports = class PointerEvent {\n constructor (type, pointer, event, eventTarget, interaction) {\n pointerUtils.pointerExtend(this, event);\n\n if (event !== pointer) {\n pointerUtils.pointerExtend(this, pointer);\n }\n\n this.interaction = interaction;\n\n this.timeStamp = new Date().getTime();\n this.originalEvent = event;\n this.type = type;\n this.pointerId = pointerUtils.getPointerId(pointer);\n this.pointerType = pointerUtils.getPointerType(pointer, interaction);\n this.target = eventTarget;\n this.currentTarget = null;\n\n if (type === 'tap') {\n const pointerIndex = interaction.getPointerIndex(pointer);\n this.dt = this.timeStamp - interaction.downTimes[pointerIndex];\n\n const interval = this.timeStamp - interaction.tapTime;\n\n this.double = !!(interaction.prevTap\n && interaction.prevTap.type !== 'doubletap'\n && interaction.prevTap.target === this.target\n && interval < 500);\n }\n else if (type === 'doubletap') {\n this.dt = pointer.timeStamp - interaction.tapTime;\n }\n }\n\n subtractOrigin ({ x: originX, y: originY }) {\n this.pageX -= originX;\n this.pageY -= originY;\n this.clientX -= originX;\n this.clientY -= originY;\n\n return this;\n }\n\n addOrigin ({ x: originX, y: originY }) {\n this.pageX += originX;\n this.pageY += originY;\n this.clientX += originX;\n this.clientY += originY;\n\n return this;\n }\n\n preventDefault () {\n this.originalEvent.preventDefault();\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n};\n","const PointerEvent = require('./PointerEvent');\nconst Interaction = require('../Interaction');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst defaults = require('../defaultOptions');\nconst signals = require('../utils/Signals').new();\nconst { filter } = require('../utils/arr');\n\nconst simpleSignals = [ 'down', 'up', 'cancel' ];\nconst simpleEvents = [ 'down', 'up', 'cancel' ];\n\nconst pointerEvents = {\n PointerEvent,\n fire,\n collectEventTargets,\n signals,\n defaults: {\n holdDuration: 600,\n ignoreFrom : null,\n allowFrom : null,\n origin : { x: 0, y: 0 },\n },\n types: [\n 'down',\n 'move',\n 'up',\n 'cancel',\n 'tap',\n 'doubletap',\n 'hold',\n ],\n};\n\nfunction fire (arg) {\n const {\n interaction, pointer, event, eventTarget,\n type = arg.pointerEvent.type,\n targets = collectEventTargets(arg),\n pointerEvent = new PointerEvent(type, pointer, event, eventTarget, interaction),\n } = arg;\n\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n targets,\n type,\n pointerEvent,\n };\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n\n for (const prop in target.props || {}) {\n pointerEvent[prop] = target.props[prop];\n }\n\n const origin = utils.getOriginXY(target.eventable, target.element);\n\n pointerEvent.subtractOrigin(origin);\n pointerEvent.eventable = target.eventable;\n pointerEvent.currentTarget = target.element;\n\n target.eventable.fire(pointerEvent);\n\n pointerEvent.addOrigin(origin);\n\n if (pointerEvent.immediatePropagationStopped\n || (pointerEvent.propagationStopped\n && (i + 1) < targets.length && targets[i + 1].element !== pointerEvent.currentTarget)) {\n break;\n }\n }\n\n signals.fire('fired', signalArg);\n\n if (type === 'tap') {\n // if pointerEvent should make a double tap, create and fire a doubletap\n // PointerEvent and use that as the prevTap\n const prevTap = pointerEvent.double\n ? fire({\n interaction, pointer, event, eventTarget,\n type: 'doubletap',\n })\n : pointerEvent;\n\n interaction.prevTap = prevTap;\n interaction.tapTime = prevTap.timeStamp;\n }\n\n return pointerEvent;\n}\n\nfunction collectEventTargets ({ interaction, pointer, event, eventTarget, type }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n // do not fire a tap event if the pointer was moved before being lifted\n if (type === 'tap' && (interaction.pointerWasMoved\n // or if the pointerup target is different to the pointerdown target\n || !(interaction.downTargets[pointerIndex] && interaction.downTargets[pointerIndex] === eventTarget))) {\n return [];\n }\n\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n path,\n targets: [],\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (type === 'hold') {\n signalArg.targets = filter(signalArg.targets, target =>\n target.eventable.options.holdDuration === interaction.holdTimers[pointerIndex].duration);\n }\n\n return signalArg.targets;\n}\n\nInteraction.signals.on('update-pointer-down', function ({ interaction, pointerIndex }) {\n interaction.holdTimers[pointerIndex] = { duration: Infinity, timeout: null };\n});\n\nInteraction.signals.on('remove-pointer', function ({ interaction, pointerIndex }) {\n interaction.holdTimers.splice(pointerIndex, 1);\n});\n\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget, duplicateMove }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n if (!duplicateMove && (!interaction.pointerIsDown || interaction.pointerWasMoved)) {\n if (interaction.pointerIsDown) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n\n fire({\n interaction, pointer, event, eventTarget,\n type: 'move',\n });\n }\n});\n\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget, pointerIndex }) {\n // copy event to be used in timeout for IE8\n const eventCopy = browser.isIE8? utils.extend({}, event) : event;\n\n const timer = interaction.holdTimers[pointerIndex];\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'hold',\n targets: [],\n path,\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (!signalArg.targets.length) { return; }\n\n let minDuration = Infinity;\n\n for (let i = 0; i < signalArg.targets.length; i++) {\n const target = signalArg.targets[i];\n const holdDuration = target.eventable.options.holdDuration;\n\n if (holdDuration < minDuration) {\n minDuration = holdDuration;\n }\n }\n\n timer.duration = minDuration;\n timer.timeout = setTimeout(function () {\n fire({\n interaction, eventCopy, eventTarget,\n pointer: browser.isIE8? eventCopy : pointer,\n type: 'hold',\n });\n }, minDuration);\n});\n\nInteraction.signals.on('up', ({ interaction, pointer, event, eventTarget }) => {\n if (!interaction.pointerWasMoved) {\n fire({ interaction, eventTarget, pointer, event, type: 'tap' });\n }\n});\n\n['up', 'cancel'].forEach(function (signalName) {\n Interaction.signals.on(signalName, function ({ interaction, pointerIndex }) {\n if (interaction.holdTimers[pointerIndex]) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n });\n});\n\nfunction createSignalListener (type) {\n return function ({ interaction, pointer, event, eventTarget }) {\n fire({ interaction, eventTarget, pointer, event, type });\n };\n}\n\nfor (let i = 0; i < simpleSignals.length; i++) {\n Interaction.signals.on(simpleSignals[i], createSignalListener(simpleEvents[i]));\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.prevTap = null; // the most recent tap event on this interaction\n interaction.tapTime = 0; // time of the most recent tap event\n interaction.holdTimers = []; // [{ duration, timeout }]\n});\n\ndefaults.pointerEvents = pointerEvents.defaults;\nmodule.exports = pointerEvents;\n","const pointerEvents = require('./base');\nconst Interaction = require('../Interaction');\n\npointerEvents.signals.on('new', onNew);\npointerEvents.signals.on('fired', onFired);\n\nfor (const signal of ['move', 'up', 'cancel', 'endall']) {\n Interaction.signals.on(signal, endHoldRepeat);\n}\n\nfunction onNew ({ pointerEvent }) {\n if (pointerEvent.type !== 'hold') { return; }\n\n pointerEvent.count = (pointerEvent.count || 0) + 1;\n}\n\nfunction onFired ({ interaction, pointerEvent, eventTarget, targets }) {\n if (pointerEvent.type !== 'hold' || !targets.length) { return; }\n\n // get the repeat interval from the first eventable\n const interval = targets[0].eventable.options.holdRepeatInterval;\n\n // don't repeat if the interval is 0 or less\n if (interval <= 0) { return; }\n\n // set a timeout to fire the holdrepeat event\n interaction.holdIntervalHandle = setTimeout(function () {\n pointerEvents.fire({\n interaction,\n eventTarget,\n type: 'hold',\n pointer: pointerEvent,\n event: pointerEvent,\n });\n }, interval);\n}\n\nfunction endHoldRepeat ({ interaction }) {\n // set the interaction's holdStopTime property\n // to stop further holdRepeat events\n if (interaction.holdIntervalHandle) {\n clearInterval(interaction.holdIntervalHandle);\n interaction.holdIntervalHandle = null;\n }\n}\n\n// don't repeat by default\npointerEvents.defaults.holdRepeatInterval = 0;\npointerEvents.types.push('holdrepeat');\n\nmodule.exports = {\n onNew,\n onFired,\n endHoldRepeat,\n};\n","const pointerEvents = require('./base');\nconst Interactable = require('../Interactable');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\nconst scope = require('../scope');\nconst extend = require('../utils/extend');\nconst { merge } = require('../utils/arr');\n\npointerEvents.signals.on('collect-targets', function ({ targets, element, type, eventTarget }) {\n function collectSelectors (interactable, selector, context) {\n const els = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && is.element(element)\n && domUtils.matchesSelector(element, selector, els)\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n const interactable = scope.interactables.get(element);\n\n if (interactable) {\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n scope.interactables.forEachSelector(collectSelectors, element);\n});\n\nInteractable.signals.on('new', function ({ interactable }) {\n interactable.events.getRect = function (element) {\n return interactable.getRect(element);\n };\n});\n\nInteractable.signals.on('set', function ({ interactable, options }) {\n extend(interactable.events.options, pointerEvents.defaults);\n extend(interactable.events.options, options);\n});\n\nmerge(Interactable.eventTypes, pointerEvents.types);\n\nInteractable.prototype.pointerEvents = function (options) {\n extend(this.events.options, options);\n\n return this;\n};\n\nconst __backCompatOption = Interactable.prototype._backCompatOption;\n\nInteractable.prototype._backCompatOption = function (optionName, newValue) {\n const ret = __backCompatOption.call(this, optionName, newValue);\n\n if (ret === this) {\n this.events.options[optionName] = newValue;\n }\n\n return ret;\n};\n\nInteractable.settingsMethods.push('pointerEvents');\n","const utils = require('./utils');\nconst events = require('./utils/events');\nconst signals = require('./utils/Signals').new();\n\nconst scope = {\n signals,\n events,\n utils,\n\n // main document\n document: require('./utils/domObjects').document,\n // all documents being listened to\n documents: [],\n\n addDocument: function (doc, win) {\n // do nothing if document is already known\n if (utils.contains(scope.documents, doc)) { return false; }\n\n win = win || scope.getWindow(doc);\n\n scope.documents.push(doc);\n events.documents.push(doc);\n\n // don't add an unload event for the main document\n // so that the page may be cached in browser history\n if (doc !== scope.document) {\n events.add(win, 'unload', scope.onWindowUnload);\n }\n\n signals.fire('add-document', { doc, win });\n },\n\n removeDocument: function (doc, win) {\n const index = utils.indexOf(scope.documents, doc);\n\n win = win || scope.getWindow(doc);\n\n events.remove(win, 'unload', scope.onWindowUnload);\n\n scope.documents.splice(index, 1);\n events.documents.splice(index, 1);\n\n signals.fire('remove-document', { win, doc });\n },\n\n onWindowUnload: function () {\n scope.removeDocument(this.document, this);\n },\n};\n\nmodule.exports = scope;\n","const { indexOf } = require('./arr');\n\nclass Signals {\n constructor () {\n this.listeners = {\n // signalName: [listeners],\n };\n }\n\n on (name, listener) {\n if (!this.listeners[name]) {\n this.listeners[name] = [listener];\n return;\n }\n\n this.listeners[name].push(listener);\n }\n\n off (name, listener) {\n if (!this.listeners[name]) { return; }\n\n const index = indexOf(this.listeners[name], listener);\n\n if (index !== -1) {\n this.listeners[name].splice(index, 1);\n }\n }\n\n fire (name, arg) {\n const targetListeners = this.listeners[name];\n\n if (!targetListeners) { return; }\n\n for (let i = 0; i < targetListeners.length; i++) {\n if (targetListeners[i](arg, name) === false) {\n return;\n }\n }\n }\n}\n\nSignals.new = function () {\n return new Signals();\n};\n\nmodule.exports = Signals;\n","function indexOf (array, target) {\n for (let i = 0, len = array.length; i < len; i++) {\n if (array[i] === target) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction contains (array, target) {\n return indexOf(array, target) !== -1;\n}\n\nfunction merge (target, source) {\n for (let i = 0; i < source.length; i++) {\n target.push(source[i]);\n }\n\n return target;\n}\n\nfunction filter (array, test) {\n const result = [];\n\n for (let i = 0; i < array.length; i++) {\n if (test(array[i])) {\n result.push(array[i]);\n }\n }\n\n return result;\n}\n\nmodule.exports = {\n indexOf,\n contains,\n merge,\n filter,\n};\n","const { window } = require('./window');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst Element = domObjects.Element;\nconst navigator = window.navigator;\n\nconst browser = {\n // Does the browser support touch input?\n supportsTouch: !!(('ontouchstart' in window) || is.function(window.DocumentTouch)\n && domObjects.document instanceof window.DocumentTouch),\n\n // Does the browser support PointerEvents\n supportsPointerEvent: !!domObjects.PointerEvent,\n\n isIE8: ('attachEvent' in window) && !('addEventListener' in window),\n\n // Opera Mobile must be handled differently\n isOperaMobile: (navigator.appName === 'Opera'\n && browser.supportsTouch\n && navigator.userAgent.match('Presto')),\n\n // scrolling doesn't change the result of getClientRects on iOS 7\n isIOS7: (/iP(hone|od|ad)/.test(navigator.platform)\n && /OS 7[^\\d]/.test(navigator.appVersion)),\n\n isIe9OrOlder: /MSIE (8|9)/.test(navigator.userAgent),\n\n // prefix matchesSelector\n prefixedMatchesSelector: 'matches' in Element.prototype\n ? 'matches': 'webkitMatchesSelector' in Element.prototype\n ? 'webkitMatchesSelector': 'mozMatchesSelector' in Element.prototype\n ? 'mozMatchesSelector': 'oMatchesSelector' in Element.prototype\n ? 'oMatchesSelector': 'msMatchesSelector',\n\n useMatchesSelectorPolyfill: false,\n\n pEventTypes: (domObjects.PointerEvent\n ? (domObjects.PointerEvent === window.MSPointerEvent\n ? {\n up: 'MSPointerUp',\n down: 'MSPointerDown',\n over: 'mouseover',\n out: 'mouseout',\n move: 'MSPointerMove',\n cancel: 'MSPointerCancel',\n }\n : {\n up: 'pointerup',\n down: 'pointerdown',\n over: 'pointerover',\n out: 'pointerout',\n move: 'pointermove',\n cancel: 'pointercancel',\n })\n : null),\n\n // because Webkit and Opera still use 'mousewheel' event type\n wheelEvent: 'onmousewheel' in domObjects.document? 'mousewheel': 'wheel',\n\n};\n\nbrowser.useMatchesSelectorPolyfill = !is.function(Element.prototype[browser.prefixedMatchesSelector]);\n\nmodule.exports = browser;\n","const domObjects = {};\nconst win = require('./window').window;\n\nfunction blank () {}\n\ndomObjects.document = win.document;\ndomObjects.DocumentFragment = win.DocumentFragment || blank;\ndomObjects.SVGElement = win.SVGElement || blank;\ndomObjects.SVGSVGElement = win.SVGSVGElement || blank;\ndomObjects.SVGElementInstance = win.SVGElementInstance || blank;\ndomObjects.Element = win.Element || blank;\ndomObjects.HTMLElement = win.HTMLElement || domObjects.Element;\n\ndomObjects.Event = win.Event;\ndomObjects.Touch = win.Touch || blank;\ndomObjects.PointerEvent = (win.PointerEvent || win.MSPointerEvent);\n\nmodule.exports = domObjects;\n","const win = require('./window');\nconst browser = require('./browser');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst domUtils = {\n nodeContains: function (parent, child) {\n while (child) {\n if (child === parent) {\n return true;\n }\n\n child = child.parentNode;\n }\n\n return false;\n },\n\n closest: function (element, selector) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) { return element; }\n\n element = domUtils.parentNode(element);\n }\n\n return null;\n },\n\n parentNode: function (node) {\n let parent = node.parentNode;\n\n if (is.docFrag(parent)) {\n // skip past #shado-root fragments\n while ((parent = parent.host) && is.docFrag(parent)) {\n continue;\n }\n\n return parent;\n }\n\n return parent;\n },\n\n // taken from http://tanalin.com/en/blog/2012/12/matches-selector-ie8/ and modified\n matchesSelectorPolyfill: browser.useMatchesSelectorPolyfill\n ? function (element, selector, elems) {\n elems = elems || element.parentNode.querySelectorAll(selector);\n\n for (let i = 0, len = elems.length; i < len; i++) {\n if (elems[i] === element) {\n return true;\n }\n }\n\n return false;\n }\n : null,\n\n matchesSelector: function (element, selector, nodeList) {\n if (browser.useMatchesSelectorPolyfill) {\n return domUtils.matchesSelectorPolyfill(element, selector, nodeList);\n }\n\n // remove /deep/ from selectors if shadowDOM polyfill is used\n if (win.window !== win.realWindow) {\n selector = selector.replace(/\\/deep\\//g, ' ');\n }\n\n return element[browser.prefixedMatchesSelector](selector);\n },\n\n // Test for the element that's \"above\" all other qualifiers\n indexOfDeepestElement: function (elements) {\n let deepestZoneParents = [];\n let dropzoneParents = [];\n let dropzone;\n let deepestZone = elements[0];\n let index = deepestZone? 0: -1;\n let parent;\n let child;\n let i;\n let n;\n\n for (i = 1; i < elements.length; i++) {\n dropzone = elements[i];\n\n // an element might belong to multiple selector dropzones\n if (!dropzone || dropzone === deepestZone) {\n continue;\n }\n\n if (!deepestZone) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n // check if the deepest or current are document.documentElement or document.rootElement\n // - if the current dropzone is, do nothing and continue\n if (dropzone.parentNode === dropzone.ownerDocument) {\n continue;\n }\n // - if deepest is, update with the current dropzone and continue to next\n else if (deepestZone.parentNode === dropzone.ownerDocument) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n if (!deepestZoneParents.length) {\n parent = deepestZone;\n while (parent.parentNode && parent.parentNode !== parent.ownerDocument) {\n deepestZoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n }\n\n // if this element is an svg element and the current deepest is\n // an HTMLElement\n if (deepestZone instanceof domObjects.HTMLElement\n && dropzone instanceof domObjects.SVGElement\n && !(dropzone instanceof domObjects.SVGSVGElement)) {\n\n if (dropzone === deepestZone.parentNode) {\n continue;\n }\n\n parent = dropzone.ownerSVGElement;\n }\n else {\n parent = dropzone;\n }\n\n dropzoneParents = [];\n\n while (parent.parentNode !== parent.ownerDocument) {\n dropzoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n\n n = 0;\n\n // get (position of last common ancestor) + 1\n while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) {\n n++;\n }\n\n const parents = [\n dropzoneParents[n - 1],\n dropzoneParents[n],\n deepestZoneParents[n],\n ];\n\n child = parents[0].lastChild;\n\n while (child) {\n if (child === parents[1]) {\n deepestZone = dropzone;\n index = i;\n deepestZoneParents = [];\n\n break;\n }\n else if (child === parents[2]) {\n break;\n }\n\n child = child.previousSibling;\n }\n }\n\n return index;\n },\n\n matchesUpTo: function (element, selector, limit) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) {\n return true;\n }\n\n element = domUtils.parentNode(element);\n\n if (element === limit) {\n return domUtils.matchesSelector(element, selector);\n }\n }\n\n return false;\n },\n\n getActualElement: function (element) {\n return (element instanceof domObjects.SVGElementInstance\n ? element.correspondingUseElement\n : element);\n },\n\n getScrollXY: function (relevantWindow) {\n relevantWindow = relevantWindow || win.window;\n return {\n x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft,\n y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop,\n };\n },\n\n getElementClientRect: function (element) {\n const clientRect = (element instanceof domObjects.SVGElement\n ? element.getBoundingClientRect()\n : element.getClientRects()[0]);\n\n return clientRect && {\n left : clientRect.left,\n right : clientRect.right,\n top : clientRect.top,\n bottom: clientRect.bottom,\n width : clientRect.width || clientRect.right - clientRect.left,\n height: clientRect.height || clientRect.bottom - clientRect.top,\n };\n },\n\n getElementRect: function (element) {\n const clientRect = domUtils.getElementClientRect(element);\n\n if (!browser.isIOS7 && clientRect) {\n const scroll = domUtils.getScrollXY(win.getWindow(element));\n\n clientRect.left += scroll.x;\n clientRect.right += scroll.x;\n clientRect.top += scroll.y;\n clientRect.bottom += scroll.y;\n }\n\n return clientRect;\n },\n\n getPath: function (element) {\n const path = [];\n\n while (element) {\n path.push(element);\n element = domUtils.parentNode(element);\n }\n\n return path;\n },\n\n trySelector: value => {\n if (!is.string(value)) { return false; }\n\n // an exception will be raised if it is invalid\n domObjects.document.querySelector(value);\n return true;\n },\n};\n\nmodule.exports = domUtils;\n","const is = require('./is');\nconst domUtils = require('./domUtils');\nconst pExtend = require('./pointerExtend');\n\nconst { window, getWindow } = require('./window');\nconst { indexOf, contains } = require('./arr');\n\nconst useAttachEvent = ('attachEvent' in window) && !('addEventListener' in window);\nconst addEvent = useAttachEvent? 'attachEvent': 'addEventListener';\nconst removeEvent = useAttachEvent? 'detachEvent': 'removeEventListener';\nconst on = useAttachEvent? 'on': '';\n\nconst elements = [];\nconst targets = [];\nconst attachedListeners = [];\n\n// {\n// type: {\n// selectors: ['selector', ...],\n// contexts : [document, ...],\n// listeners: [[listener, capture, passive], ...]\n// }\n// }\nconst delegatedEvents = {};\n\nconst documents = [];\n\nconst supportsOptions = !useAttachEvent && (() => {\n let supported = false;\n\n window.document.createElement('div').addEventListener('test', null, {\n get capture () { supported = true; },\n });\n\n return supported;\n})();\n\nfunction add (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n let elementIndex = indexOf(elements, element);\n let target = targets[elementIndex];\n\n if (!target) {\n target = {\n events: {},\n typeCount: 0,\n };\n\n elementIndex = elements.push(element) - 1;\n targets.push(target);\n\n attachedListeners.push(useAttachEvent\n ? {\n supplied: [],\n wrapped : [],\n useCount: [],\n }\n : null);\n }\n\n if (!target.events[type]) {\n target.events[type] = [];\n target.typeCount++;\n }\n\n if (!contains(target.events[type], listener)) {\n let ret;\n\n if (useAttachEvent) {\n const { supplied, wrapped, useCount } = attachedListeners[elementIndex];\n const listenerIndex = indexOf(supplied, listener);\n\n const wrappedListener = wrapped[listenerIndex] || function (event) {\n if (!event.immediatePropagationStopped) {\n event.target = event.srcElement;\n event.currentTarget = element;\n\n event.preventDefault = event.preventDefault || preventDef;\n event.stopPropagation = event.stopPropagation || stopProp;\n event.stopImmediatePropagation = event.stopImmediatePropagation || stopImmProp;\n\n if (/mouse|click/.test(event.type)) {\n event.pageX = event.clientX + getWindow(element).document.documentElement.scrollLeft;\n event.pageY = event.clientY + getWindow(element).document.documentElement.scrollTop;\n }\n\n listener(event);\n }\n };\n\n ret = element[addEvent](on + type, wrappedListener, !!options.capture);\n\n if (listenerIndex === -1) {\n supplied.push(listener);\n wrapped.push(wrappedListener);\n useCount.push(1);\n }\n else {\n useCount[listenerIndex]++;\n }\n }\n else {\n ret = element[addEvent](type, listener, supportsOptions? options : !!options.capture);\n }\n target.events[type].push(listener);\n\n return ret;\n }\n}\n\nfunction remove (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const elementIndex = indexOf(elements, element);\n const target = targets[elementIndex];\n\n if (!target || !target.events) {\n return;\n }\n\n let wrappedListener = listener;\n let listeners;\n let listenerIndex;\n\n if (useAttachEvent) {\n listeners = attachedListeners[elementIndex];\n listenerIndex = indexOf(listeners.supplied, listener);\n wrappedListener = listeners.wrapped[listenerIndex];\n }\n\n if (type === 'all') {\n for (type in target.events) {\n if (target.events.hasOwnProperty(type)) {\n remove(element, type, 'all');\n }\n }\n return;\n }\n\n if (target.events[type]) {\n const len = target.events[type].length;\n\n if (listener === 'all') {\n for (let i = 0; i < len; i++) {\n remove(element, type, target.events[type][i], options);\n }\n return;\n }\n else {\n for (let i = 0; i < len; i++) {\n if (target.events[type][i] === listener) {\n element[removeEvent](on + type, wrappedListener, supportsOptions? options : !!options.capture);\n target.events[type].splice(i, 1);\n\n if (useAttachEvent && listeners) {\n listeners.useCount[listenerIndex]--;\n if (listeners.useCount[listenerIndex] === 0) {\n listeners.supplied.splice(listenerIndex, 1);\n listeners.wrapped.splice(listenerIndex, 1);\n listeners.useCount.splice(listenerIndex, 1);\n }\n }\n\n break;\n }\n }\n }\n\n if (target.events[type] && target.events[type].length === 0) {\n target.events[type] = null;\n target.typeCount--;\n }\n }\n\n if (!target.typeCount) {\n targets.splice(elementIndex, 1);\n elements.splice(elementIndex, 1);\n attachedListeners.splice(elementIndex, 1);\n }\n}\n\nfunction addDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n if (!delegatedEvents[type]) {\n delegatedEvents[type] = {\n selectors: [],\n contexts : [],\n listeners: [],\n };\n\n // add delegate listener functions\n for (let i = 0; i < documents.length; i++) {\n add(documents[i], type, delegateListener);\n add(documents[i], type, delegateUseCapture, true);\n }\n }\n\n const delegated = delegatedEvents[type];\n let index;\n\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n break;\n }\n }\n\n if (index === -1) {\n index = delegated.selectors.length;\n\n delegated.selectors.push(selector);\n delegated.contexts .push(context);\n delegated.listeners.push([]);\n }\n\n // keep listener and capture and passive flags\n delegated.listeners[index].push([listener, !!options.capture, options.passive]);\n}\n\nfunction removeDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const delegated = delegatedEvents[type];\n let matchFound = false;\n let index;\n\n if (!delegated) { return; }\n\n // count from last index of delegated to 0\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n // look for matching selector and context Node\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n\n const listeners = delegated.listeners[index];\n\n // each item of the listeners array is an array: [function, capture, passive]\n for (let i = listeners.length - 1; i >= 0; i--) {\n const [fn, capture, passive] = listeners[i];\n\n // check if the listener functions and capture and passive flags match\n if (fn === listener && capture === !!options.capture && passive === options.passive) {\n // remove the listener from the array of listeners\n listeners.splice(i, 1);\n\n // if all listeners for this interactable have been removed\n // remove the interactable from the delegated arrays\n if (!listeners.length) {\n delegated.selectors.splice(index, 1);\n delegated.contexts .splice(index, 1);\n delegated.listeners.splice(index, 1);\n\n // remove delegate function from context\n remove(context, type, delegateListener);\n remove(context, type, delegateUseCapture, true);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegatedEvents[type] = null;\n }\n }\n\n // only remove one listener\n matchFound = true;\n break;\n }\n }\n\n if (matchFound) { break; }\n }\n }\n}\n\n// bound to the interactable context when a DOM event\n// listener is added to a selector interactable\nfunction delegateListener (event, optionalArg) {\n const options = getOptions(optionalArg);\n const fakeEvent = {};\n const delegated = delegatedEvents[event.type];\n const eventTarget = (domUtils.getActualElement(event.path\n ? event.path[0]\n : event.target));\n let element = eventTarget;\n\n // duplicate the event so that currentTarget can be changed\n pExtend(fakeEvent, event);\n\n fakeEvent.originalEvent = event;\n fakeEvent.preventDefault = preventOriginalDefault;\n\n // climb up document tree looking for selector matches\n while (is.element(element)) {\n for (let i = 0; i < delegated.selectors.length; i++) {\n const selector = delegated.selectors[i];\n const context = delegated.contexts[i];\n\n if (domUtils.matchesSelector(element, selector)\n && domUtils.nodeContains(context, eventTarget)\n && domUtils.nodeContains(context, element)) {\n\n const listeners = delegated.listeners[i];\n\n fakeEvent.currentTarget = element;\n\n for (let j = 0; j < listeners.length; j++) {\n const [fn, capture, passive] = listeners[j];\n\n if (capture === !!options.capture && passive === options.passive) {\n fn(fakeEvent);\n }\n }\n }\n }\n\n element = domUtils.parentNode(element);\n }\n}\n\nfunction delegateUseCapture (event) {\n return delegateListener.call(this, event, true);\n}\n\nfunction preventDef () {\n this.returnValue = false;\n}\n\nfunction preventOriginalDefault () {\n this.originalEvent.preventDefault();\n}\n\nfunction stopProp () {\n this.cancelBubble = true;\n}\n\nfunction stopImmProp () {\n this.cancelBubble = true;\n this.immediatePropagationStopped = true;\n}\n\nfunction getOptions (param) {\n return is.object(param)? param : { capture: param };\n}\n\nmodule.exports = {\n add,\n remove,\n\n addDelegate,\n removeDelegate,\n\n delegateListener,\n delegateUseCapture,\n delegatedEvents,\n documents,\n\n useAttachEvent,\n supportsOptions,\n\n _elements: elements,\n _targets: targets,\n _attachedListeners: attachedListeners,\n};\n","module.exports = function extend (dest, source) {\n for (const prop in source) {\n dest[prop] = source[prop];\n }\n return dest;\n};\n","const {\n resolveRectLike,\n rectToXY,\n} = require('./rect');\n\nmodule.exports = function (target, element, action) {\n const actionOptions = target.options[action];\n const actionOrigin = actionOptions && actionOptions.origin;\n const origin = actionOrigin || target.options.origin;\n\n const originRect = resolveRectLike(origin, target, element, [target && element]);\n\n return rectToXY(originRect) || { x: 0, y: 0 };\n};\n","module.exports = (x, y) => Math.sqrt(x * x + y * y);\n","const extend = require('./extend');\nconst win = require('./window');\n\nconst utils = {\n warnOnce: function (method, message) {\n let warned = false;\n\n return function () {\n if (!warned) {\n win.window.console.warn(message);\n warned = true;\n }\n\n return method.apply(this, arguments);\n };\n },\n\n // http://stackoverflow.com/a/5634528/2280888\n _getQBezierValue: function (t, p1, p2, p3) {\n const iT = 1 - t;\n return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3;\n },\n\n getQuadraticCurvePoint: function (startX, startY, cpX, cpY, endX, endY, position) {\n return {\n x: utils._getQBezierValue(position, startX, cpX, endX),\n y: utils._getQBezierValue(position, startY, cpY, endY),\n };\n },\n\n // http://gizma.com/easing/\n easeOutQuad: function (t, b, c, d) {\n t /= d;\n return -c * t*(t-2) + b;\n },\n\n copyAction: function (dest, src) {\n dest.name = src.name;\n dest.axis = src.axis;\n dest.edges = src.edges;\n\n return dest;\n },\n\n is : require('./is'),\n extend : extend,\n hypot : require('./hypot'),\n getOriginXY: require('./getOriginXY'),\n};\n\nextend(utils, require('./arr'));\nextend(utils, require('./domUtils'));\nextend(utils, require('./pointerUtils'));\nextend(utils, require('./rect'));\n\nmodule.exports = utils;\n","const scope = require('../scope');\nconst utils = require('./index');\nconst browser = require('./browser');\n\nconst finder = {\n methodOrder: [ 'simulationResume', 'mouse', 'hasPointer', 'idle' ],\n\n search: function (pointer, eventType, eventTarget) {\n const mouseEvent = (/mouse/i.test(pointer.pointerType || eventType)\n // MSPointerEvent.MSPOINTER_TYPE_MOUSE\n || pointer.pointerType === 4);\n const pointerId = utils.getPointerId(pointer);\n const details = { pointer, pointerId, mouseEvent, eventType, eventTarget };\n\n for (const method of finder.methodOrder) {\n const interaction = finder[method](details);\n\n if (interaction) {\n return interaction;\n }\n }\n },\n\n // try to resume simulation with a new pointer\n simulationResume: function ({ mouseEvent, eventType, eventTarget }) {\n if (!/down|start/i.test(eventType)) {\n return null;\n }\n\n for (const interaction of scope.interactions) {\n let element = eventTarget;\n\n if (interaction.simulation && interaction.simulation.allowResume\n && (interaction.mouse === mouseEvent)) {\n while (element) {\n // if the element is the interaction element\n if (element === interaction.element) {\n return interaction;\n }\n element = utils.parentNode(element);\n }\n }\n }\n\n return null;\n },\n\n // if it's a mouse interaction\n mouse: function ({ pointerId, mouseEvent, eventType }) {\n if (!mouseEvent && (browser.supportsTouch || browser.supportsPointerEvent)) {\n return null;\n }\n\n let firstNonActive;\n\n for (const interaction of scope.interactions) {\n if (interaction.mouse) {\n // if it's a down event, skip interactions with running simulations\n if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; }\n\n // if the interaction is active, return it immediately\n if (interaction.interacting()) {\n return interaction;\n }\n // otherwise save it and look for another active interaction\n else if (!firstNonActive) {\n firstNonActive = interaction;\n }\n }\n }\n\n // if no active mouse interaction was found use the first inactive mouse\n // interaction\n if (firstNonActive) {\n return firstNonActive;\n }\n\n // Find any interaction specifically for mouse.\n // ignore the interaction if the eventType is a mousedown, and a simulation\n // is active\n for (const interaction of scope.interactions) {\n if (interaction.mouse && !(/down/.test(eventType) && interaction.simulation)) {\n return interaction;\n }\n }\n\n return null;\n },\n\n // get interaction that has this pointer\n hasPointer: function ({ pointerId }) {\n for (const interaction of scope.interactions) {\n if (utils.contains(interaction.pointerIds, pointerId)) {\n return interaction;\n }\n }\n },\n\n // get first idle interaction\n idle: function ({ mouseEvent }) {\n for (const interaction of scope.interactions) {\n // if there's already a pointer held down\n if (interaction.pointerIds.length === 1) {\n const target = interaction.target;\n // don't add this pointer if there is a target interactable and it\n // isn't gesturable\n if (target && !target.options.gesture.enabled) {\n continue;\n }\n }\n // maximum of 2 pointers per interaction\n else if (interaction.pointerIds.length >= 2) {\n continue;\n }\n\n if (!interaction.interacting() && (mouseEvent === interaction.mouse)) {\n return interaction;\n }\n }\n\n return null;\n },\n};\n\nmodule.exports = finder;\n","const win = require('./window');\nconst isWindow = require('./isWindow');\n\nconst is = {\n array : () => {},\n\n window : thing => thing === win.window || isWindow(thing),\n\n docFrag : thing => is.object(thing) && thing.nodeType === 11,\n\n object : thing => !!thing && (typeof thing === 'object'),\n\n function: thing => typeof thing === 'function',\n\n number : thing => typeof thing === 'number' ,\n\n bool : thing => typeof thing === 'boolean' ,\n\n string : thing => typeof thing === 'string' ,\n\n element: thing => {\n if (!thing || (typeof thing !== 'object')) { return false; }\n\n const _window = win.getWindow(thing) || win.window;\n\n return (/object|function/.test(typeof _window.Element)\n ? thing instanceof _window.Element //DOM2\n : thing.nodeType === 1 && typeof thing.nodeName === 'string');\n },\n};\n\nis.array = thing => (is.object(thing)\n && (typeof thing.length !== 'undefined')\n && is.function(thing.splice));\n\nmodule.exports = is;\n","module.exports = (thing) => !!(thing && thing.Window) && (thing instanceof thing.Window);\n","function pointerExtend (dest, source) {\n for (const prop in source) {\n const prefixedPropREs = module.exports.prefixedPropREs;\n let deprecated = false;\n\n // skip deprecated prefixed properties\n for (const vendor in prefixedPropREs) {\n if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) {\n deprecated = true;\n break;\n }\n }\n\n if (!deprecated && typeof source[prop] !== 'function') {\n dest[prop] = source[prop];\n }\n }\n return dest;\n}\n\npointerExtend.prefixedPropREs = {\n webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/,\n};\n\nmodule.exports = pointerExtend;\n","const hypot = require('./hypot');\nconst browser = require('./browser');\nconst dom = require('./domObjects');\nconst domUtils = require('./domUtils');\nconst is = require('./is');\nconst pointerExtend = require('./pointerExtend');\n\nconst pointerUtils = {\n copyCoords: function (dest, src) {\n dest.page = dest.page || {};\n dest.page.x = src.page.x;\n dest.page.y = src.page.y;\n\n dest.client = dest.client || {};\n dest.client.x = src.client.x;\n dest.client.y = src.client.y;\n\n dest.timeStamp = src.timeStamp;\n },\n\n setCoordDeltas: function (targetObj, prev, cur) {\n targetObj.page.x = cur.page.x - prev.page.x;\n targetObj.page.y = cur.page.y - prev.page.y;\n targetObj.client.x = cur.client.x - prev.client.x;\n targetObj.client.y = cur.client.y - prev.client.y;\n targetObj.timeStamp = cur.timeStamp - prev.timeStamp;\n\n // set pointer velocity\n const dt = Math.max(targetObj.timeStamp / 1000, 0.001);\n\n targetObj.page.speed = hypot(targetObj.page.x, targetObj.page.y) / dt;\n targetObj.page.vx = targetObj.page.x / dt;\n targetObj.page.vy = targetObj.page.y / dt;\n\n targetObj.client.speed = hypot(targetObj.client.x, targetObj.page.y) / dt;\n targetObj.client.vx = targetObj.client.x / dt;\n targetObj.client.vy = targetObj.client.y / dt;\n },\n\n isNativePointer: function (pointer) {\n return (pointer instanceof dom.Event || pointer instanceof dom.Touch);\n },\n\n // Get specified X/Y coords for mouse or event.touches[0]\n getXY: function (type, pointer, xy) {\n xy = xy || {};\n type = type || 'page';\n\n xy.x = pointer[type + 'X'];\n xy.y = pointer[type + 'Y'];\n\n return xy;\n },\n\n getPageXY: function (pointer, page) {\n page = page || {};\n\n // Opera Mobile handles the viewport and scrolling oddly\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n pointerUtils.getXY('screen', pointer, page);\n\n page.x += window.scrollX;\n page.y += window.scrollY;\n }\n else {\n pointerUtils.getXY('page', pointer, page);\n }\n\n return page;\n },\n\n getClientXY: function (pointer, client) {\n client = client || {};\n\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n // Opera Mobile handles the viewport and scrolling oddly\n pointerUtils.getXY('screen', pointer, client);\n }\n else {\n pointerUtils.getXY('client', pointer, client);\n }\n\n return client;\n },\n\n getPointerId: function (pointer) {\n return is.number(pointer.pointerId)? pointer.pointerId : pointer.identifier;\n },\n\n setCoords: function (targetObj, pointers, timeStamp) {\n const pointer = (pointers.length > 1\n ? pointerUtils.pointerAverage(pointers)\n : pointers[0]);\n\n const tmpXY = {};\n\n pointerUtils.getPageXY(pointer, tmpXY);\n targetObj.page.x = tmpXY.x;\n targetObj.page.y = tmpXY.y;\n\n pointerUtils.getClientXY(pointer, tmpXY);\n targetObj.client.x = tmpXY.x;\n targetObj.client.y = tmpXY.y;\n\n targetObj.timeStamp = is.number(timeStamp) ? timeStamp :new Date().getTime();\n },\n\n pointerExtend: pointerExtend,\n\n getTouchPair: function (event) {\n const touches = [];\n\n // array of touches is supplied\n if (is.array(event)) {\n touches[0] = event[0];\n touches[1] = event[1];\n }\n // an event\n else {\n if (event.type === 'touchend') {\n if (event.touches.length === 1) {\n touches[0] = event.touches[0];\n touches[1] = event.changedTouches[0];\n }\n else if (event.touches.length === 0) {\n touches[0] = event.changedTouches[0];\n touches[1] = event.changedTouches[1];\n }\n }\n else {\n touches[0] = event.touches[0];\n touches[1] = event.touches[1];\n }\n }\n\n return touches;\n },\n\n pointerAverage: function (pointers) {\n const average = {\n pageX : 0,\n pageY : 0,\n clientX: 0,\n clientY: 0,\n screenX: 0,\n screenY: 0,\n };\n\n for (const pointer of pointers) {\n for (const prop in average) {\n average[prop] += pointer[prop];\n }\n }\n for (const prop in average) {\n average[prop] /= pointers.length;\n }\n\n return average;\n },\n\n touchBBox: function (event) {\n if (!event.length && !(event.touches && event.touches.length > 1)) {\n return;\n }\n\n const touches = pointerUtils.getTouchPair(event);\n const minX = Math.min(touches[0].pageX, touches[1].pageX);\n const minY = Math.min(touches[0].pageY, touches[1].pageY);\n const maxX = Math.max(touches[0].pageX, touches[1].pageX);\n const maxY = Math.max(touches[0].pageY, touches[1].pageY);\n\n return {\n x: minX,\n y: minY,\n left: minX,\n top: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n },\n\n touchDistance: function (event, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n\n\n const dx = touches[0][sourceX] - touches[1][sourceX];\n const dy = touches[0][sourceY] - touches[1][sourceY];\n\n return hypot(dx, dy);\n },\n\n touchAngle: function (event, prevAngle, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n const dx = touches[1][sourceX] - touches[0][sourceX];\n const dy = touches[1][sourceY] - touches[0][sourceY];\n const angle = 180 * Math.atan2(dy , dx) / Math.PI;\n\n return angle;\n },\n\n getPointerType: function (pointer, interaction) {\n // if the PointerEvent API isn't available, then the pointer must be ither\n // a MouseEvent or TouchEvent\n if (interaction.mouse) { return 'mouse'; }\n if (!browser.supportsPointerEvent) { return 'touch'; }\n\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : [undefined, undefined,'touch', 'pen', 'mouse'][pointer.pointerType];\n },\n\n // [ event.target, event.currentTarget ]\n getEventTargets: function (event) {\n return [\n domUtils.getActualElement(event.path ? event.path[0] : event.target),\n domUtils.getActualElement(event.currentTarget),\n ];\n },\n};\n\nmodule.exports = pointerUtils;\n","const { window } = require('./window');\n\nconst vendors = ['ms', 'moz', 'webkit', 'o'];\nlet lastTime = 0;\nlet request;\nlet cancel;\n\nfor (let x = 0; x < vendors.length && !window.requestAnimationFrame; x++) {\n request = window[vendors[x] + 'RequestAnimationFrame'];\n cancel = window[vendors[x] +'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n}\n\nif (!request) {\n request = function (callback) {\n const currTime = new Date().getTime();\n const timeToCall = Math.max(0, 16 - (currTime - lastTime));\n const id = setTimeout(function () { callback(currTime + timeToCall); },\n timeToCall);\n\n lastTime = currTime + timeToCall;\n return id;\n };\n}\n\nif (!cancel) {\n cancel = function (id) {\n clearTimeout(id);\n };\n}\n\nmodule.exports = {\n request,\n cancel,\n};\n","const extend = require('./extend');\nconst is = require('./is');\nconst {\n closest,\n parentNode,\n getElementRect,\n} = require('./domUtils');\n\nconst rectUtils = {\n getStringOptionResult: function (value, interactable, element) {\n if (!is.string(value)) {\n return null;\n }\n\n if (value === 'parent') {\n value = parentNode(element);\n }\n else if (value === 'self') {\n value = interactable.getRect(element);\n }\n else {\n value = closest(element, value);\n }\n\n return value;\n },\n\n resolveRectLike: function (value, interactable, element, functionArgs) {\n value = rectUtils.getStringOptionResult(value, interactable, element) || value;\n\n if (is.function(value)) {\n value = value.apply(null, functionArgs);\n }\n\n if (is.element(value)) {\n value = getElementRect(value);\n }\n\n return value;\n },\n\n rectToXY: function (rect) {\n return rect && {\n x: 'x' in rect ? rect.x : rect.left,\n y: 'y' in rect ? rect.y : rect.top,\n };\n },\n\n xywhToTlbr: function (rect) {\n if (rect && !('left' in rect && 'top' in rect)) {\n rect = extend({}, rect);\n\n rect.left = rect.x || 0;\n rect.top = rect.y || 0;\n rect.right = rect.right || (rect.left + rect.width);\n rect.bottom = rect.bottom || (rect.top + rect.height);\n }\n\n return rect;\n },\n\n tlbrToXywh: function (rect) {\n if (rect && !('x' in rect && 'y' in rect)) {\n rect = extend({}, rect);\n\n rect.x = rect.left || 0;\n rect.top = rect.top || 0;\n rect.width = rect.width || (rect.right - rect.x);\n rect.height = rect.height || (rect.bottom - rect.y);\n }\n\n return rect;\n },\n};\n\nmodule.exports = rectUtils;\n","const win = module.exports;\nconst isWindow = require('./isWindow');\n\nfunction init (window) {\n // get wrapped window if using Shadow DOM polyfill\n\n win.realWindow = window;\n\n // create a TextNode\n const el = window.document.createTextNode('');\n\n // check if it's wrapped by a polyfill\n if (el.ownerDocument !== window.document\n && typeof window.wrap === 'function'\n && window.wrap(el) === el) {\n // use wrapped window\n window = window.wrap(window);\n }\n\n win.window = window;\n}\n\nif (typeof window === 'undefined') {\n win.window = undefined;\n win.realWindow = undefined;\n}\nelse {\n init(window);\n}\n\nwin.getWindow = function getWindow (node) {\n if (isWindow(node)) {\n return node;\n }\n\n const rootNode = (node.ownerDocument || node);\n\n return rootNode.defaultView || rootNode.parentWindow || win.window;\n};\n\nwin.init = init;\n"]} \ No newline at end of file +{"version":3,"sources":["src/header.js","node_modules/browser-pack/_prelude.js","index.js","src/Eventable.js","src/InteractEvent.js","src/Interactable.js","src/Interaction.js","src/actions/base.js","src/actions/drag.js","src/actions/drop.js","src/actions/gesture.js","src/actions/resize.js","src/autoScroll.js","src/autoStart/InteractableMethods.js","src/autoStart/base.js","src/autoStart/delay.js","src/autoStart/drag.js","src/autoStart/gesture.js","src/autoStart/resize.js","src/defaultOptions.js","src/index.js","src/inertia.js","src/interact.js","src/interactablePreventDefault.js","src/legacyBrowsers.js","src/modifiers/index.js","src/modifiers/restrict.js","src/modifiers/restrictEdges.js","src/modifiers/restrictSize.js","src/modifiers/snap.js","src/modifiers/snapSize.js","src/pointerEvents/PointerEvent.js","src/pointerEvents/base.js","src/pointerEvents/holdRepeat.js","src/pointerEvents/interactableTargets.js","src/scope.js","src/utils/Signals.js","src/utils/arr.js","src/utils/browser.js","src/utils/domObjects.js","src/utils/domUtils.js","src/utils/events.js","src/utils/extend.js","src/utils/getOriginXY.js","src/utils/hypot.js","src/utils/index.js","src/utils/interactionFinder.js","src/utils/is.js","src/utils/isWindow.js","src/utils/pointerExtend.js","src/utils/pointerUtils.js","src/utils/raf.js","src/utils/rect.js","src/utils/window.js"],"names":[],"mappings":"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","file":"interact.js","sourceRoot":"","sourcesContent":["/**\n * interact.js v1.3.0-alpha.4+sha.7970416-dirty\n *\n * Copyright (c) 2012-2017 Taye Adeyemi \n * Open source under the MIT License.\n * https://raw.github.com/taye/interact.js/master/LICENSE\n */\n","(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o 150) {\n return null;\n }\n\n let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI;\n const overlap = 22.5;\n\n if (angle < 0) {\n angle += 360;\n }\n\n const left = 135 - overlap <= angle && angle < 225 + overlap;\n const up = 225 - overlap <= angle && angle < 315 + overlap;\n\n const right = !left && (315 - overlap <= angle || angle < 45 + overlap);\n const down = !up && 45 - overlap <= angle && angle < 135 + overlap;\n\n return {\n up,\n down,\n left,\n right,\n angle,\n speed: interaction.prevEvent.speed,\n velocity: {\n x: interaction.prevEvent.velocityX,\n y: interaction.prevEvent.velocityY,\n },\n };\n }\n\n preventDefault () {}\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n}\n\nsignals.on('set-delta', function ({ iEvent, interaction, starting, deltaSource }) {\n const prevEvent = starting? iEvent : interaction.prevEvent;\n\n if (deltaSource === 'client') {\n iEvent.dx = iEvent.clientX - prevEvent.clientX;\n iEvent.dy = iEvent.clientY - prevEvent.clientY;\n }\n else {\n iEvent.dx = iEvent.pageX - prevEvent.pageX;\n iEvent.dy = iEvent.pageY - prevEvent.pageY;\n }\n});\n\nInteractEvent.signals = signals;\n\nmodule.exports = InteractEvent;\n","const is = require('./utils/is');\nconst events = require('./utils/events');\nconst extend = require('./utils/extend');\nconst actions = require('./actions/base');\nconst scope = require('./scope');\nconst Eventable = require('./Eventable');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nconst {\n getElementRect,\n nodeContains,\n trySelector,\n} = require('./utils/domUtils');\nconst { getWindow } = require('./utils/window');\nconst { indexOf, contains } = require('./utils/arr');\nconst { wheelEvent } = require('./utils/browser');\n\n// all set interactables\nscope.interactables = [];\n\n/*\\\n * Interactable\n [ property ]\n **\n * Object type returned by @interact\n\\*/\nclass Interactable {\n constructor (target, options) {\n options = options || {};\n\n this.target = target;\n this.events = new Eventable();\n this._context = options.context || scope.document;\n this._win = getWindow(trySelector(target)? this._context : target);\n this._doc = this._win.document;\n\n signals.fire('new', {\n target,\n options,\n interactable: this,\n win: this._win,\n });\n\n scope.addDocument( this._doc, this._win );\n\n scope.interactables.push(this);\n\n this.set(options);\n }\n\n setOnEvents (action, phases) {\n const onAction = 'on' + action;\n\n if (is.function(phases.onstart) ) { this.events[onAction + 'start' ] = phases.onstart ; }\n if (is.function(phases.onmove) ) { this.events[onAction + 'move' ] = phases.onmove ; }\n if (is.function(phases.onend) ) { this.events[onAction + 'end' ] = phases.onend ; }\n if (is.function(phases.oninertiastart)) { this.events[onAction + 'inertiastart' ] = phases.oninertiastart ; }\n\n return this;\n }\n\n setPerAction (action, options) {\n // for all the default per-action options\n for (const option in options) {\n // if this option exists for this action\n if (option in defaults[action]) {\n // if the option in the options arg is an object value\n if (is.object(options[option])) {\n // duplicate the object\n this.options[action][option] = extend(this.options[action][option] || {}, options[option]);\n\n if (is.object(defaults.perAction[option]) && 'enabled' in defaults.perAction[option]) {\n this.options[action][option].enabled = options[option].enabled === false? false : true;\n }\n }\n else if (is.bool(options[option]) && is.object(defaults.perAction[option])) {\n this.options[action][option].enabled = options[option];\n }\n else if (options[option] !== undefined) {\n // or if it's not undefined, do a plain assignment\n this.options[action][option] = options[option];\n }\n }\n }\n }\n\n /*\\\n * Interactable.getRect\n [ method ]\n *\n * The default function to get an Interactables bounding rect. Can be\n * overridden using @Interactable.rectChecker.\n *\n - element (Element) #optional The element to measure.\n = (object) The object's bounding rectangle.\n o {\n o top : 0,\n o left : 0,\n o bottom: 0,\n o right : 0,\n o width : 0,\n o height: 0\n o }\n \\*/\n getRect (element) {\n element = element || this.target;\n\n if (is.string(this.target) && !(is.element(element))) {\n element = this._context.querySelector(this.target);\n }\n\n return getElementRect(element);\n }\n\n /*\\\n * Interactable.rectChecker\n [ method ]\n *\n * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n - checker (function) #optional A function which returns this Interactable's bounding rectangle. See @Interactable.getRect\n = (function | object) The checker function or this Interactable\n \\*/\n rectChecker (checker) {\n if (is.function(checker)) {\n this.getRect = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.getRect;\n\n return this;\n }\n\n return this.getRect;\n }\n\n _backCompatOption (optionName, newValue) {\n if (trySelector(newValue) || is.object(newValue)) {\n this.options[optionName] = newValue;\n\n for (const action of actions.names) {\n this.options[action][optionName] = newValue;\n }\n\n return this;\n }\n\n return this.options[optionName];\n }\n\n /*\\\n * Interactable.origin\n [ method ]\n *\n * Gets or sets the origin of the Interactable's element. The x and y\n * of the origin will be subtracted from action event coordinates.\n *\n - origin (object | string) #optional An object eg. { x: 0, y: 0 } or string 'parent', 'self' or any CSS selector\n * OR\n - origin (Element) #optional An HTML or SVG Element whose rect will be used\n **\n = (object) The current origin or this Interactable\n \\*/\n origin (newValue) {\n return this._backCompatOption('origin', newValue);\n }\n\n /*\\\n * Interactable.deltaSource\n [ method ]\n *\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n - newValue (string) #optional Use 'client' if you will be scrolling while interacting; Use 'page' if you want autoScroll to work\n = (string | object) The current deltaSource or this Interactable\n \\*/\n deltaSource (newValue) {\n if (newValue === 'page' || newValue === 'client') {\n this.options.deltaSource = newValue;\n\n return this;\n }\n\n return this.options.deltaSource;\n }\n\n /*\\\n * Interactable.context\n [ method ]\n *\n * Gets the selector context Node of the Interactable. The default is `window.document`.\n *\n = (Node) The context Node of this Interactable\n **\n \\*/\n context () {\n return this._context;\n }\n\n inContext (element) {\n return (this._context === element.ownerDocument\n || nodeContains(this._context, element));\n }\n\n /*\\\n * Interactable.fire\n [ method ]\n *\n * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n - iEvent (InteractEvent) The InteractEvent object to be fired on this Interactable\n = (Interactable) this Interactable\n \\*/\n fire (iEvent) {\n this.events.fire(iEvent);\n\n return this;\n }\n\n _onOffMultiple (method, eventType, listener, options) {\n if (is.string(eventType) && eventType.search(' ') !== -1) {\n eventType = eventType.trim().split(/ +/);\n }\n\n if (is.array(eventType)) {\n for (let i = 0; i < eventType.length; i++) {\n this[method](eventType[i], listener, options);\n }\n\n return true;\n }\n\n if (is.object(eventType)) {\n for (const prop in eventType) {\n this[method](prop, eventType[prop], listener);\n }\n\n return true;\n }\n }\n\n /*\\\n * Interactable.on\n [ method ]\n *\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n - eventType (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) This Interactable\n \\*/\n on (eventType, listener, options) {\n if (this._onOffMultiple('on', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.on(eventType, listener);\n }\n // delegated event for selector\n else if (is.string(this.target)) {\n events.addDelegate(this.target, this._context, eventType, listener, options);\n }\n else {\n events.add(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.off\n [ method ]\n *\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n - eventType (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) This Interactable\n \\*/\n off (eventType, listener, options) {\n if (this._onOffMultiple('off', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n // if it is an action event type\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.off(eventType, listener);\n }\n // delegated event\n else if (is.string(this.target)) {\n events.removeDelegate(this.target, this._context, eventType, listener, options);\n }\n // remove listener from this Interatable's element\n else {\n events.remove(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.set\n [ method ]\n *\n * Reset the options of this Interactable\n - options (object) The new settings to apply\n = (object) This Interactable\n \\*/\n set (options) {\n if (!is.object(options)) {\n options = {};\n }\n\n this.options = extend({}, defaults.base);\n\n const perActions = extend({}, defaults.perAction);\n\n for (const actionName in actions.methodDict) {\n const methodName = actions.methodDict[actionName];\n\n this.options[actionName] = extend({}, defaults[actionName]);\n\n this.setPerAction(actionName, perActions);\n\n this[methodName](options[actionName]);\n }\n\n for (const setting of Interactable.settingsMethods) {\n this.options[setting] = defaults.base[setting];\n\n if (setting in options) {\n this[setting](options[setting]);\n }\n }\n\n signals.fire('set', {\n options,\n interactable: this,\n });\n\n return this;\n }\n\n /*\\\n * Interactable.unset\n [ method ]\n *\n * Remove this interactable from the list of interactables and remove\n * it's action capabilities and event listeners\n *\n = (object) @interact\n \\*/\n unset () {\n events.remove(this.target, 'all');\n\n if (is.string(this.target)) {\n // remove delegated events\n for (const type in events.delegatedEvents) {\n const delegated = events.delegatedEvents[type];\n\n if (delegated.selectors[0] === this.target\n && delegated.contexts[0] === this._context) {\n\n delegated.selectors.splice(0, 1);\n delegated.contexts .splice(0, 1);\n delegated.listeners.splice(0, 1);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegated[type] = null;\n }\n }\n\n events.remove(this._context, type, events.delegateListener);\n events.remove(this._context, type, events.delegateUseCapture, true);\n }\n }\n else {\n events.remove(this, 'all');\n }\n\n signals.fire('unset', { interactable: this });\n\n scope.interactables.splice(indexOf(scope.interactables, this), 1);\n\n // Stop related interactions when an Interactable is unset\n for (const interaction of scope.interactions || []) {\n if (interaction.target === this && interaction.interacting()) {\n interaction.stop();\n }\n }\n\n return scope.interact;\n }\n}\n\nscope.interactables.indexOfElement = function indexOfElement (target, context) {\n context = context || scope.document;\n\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n if (interactable.target === target && interactable._context === context) {\n return i;\n }\n }\n return -1;\n};\n\nscope.interactables.get = function interactableGet (element, options, dontCheckInContext) {\n const ret = this[this.indexOfElement(element, options && options.context)];\n\n return ret && (is.string(element) || dontCheckInContext || ret.inContext(element))? ret : null;\n};\n\nscope.interactables.forEachSelector = function (callback, element) {\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n // skip non CSS selector targets and out of context elements\n if (!is.string(interactable.target)\n || (element && !interactable.inContext(element))) {\n continue;\n }\n\n const ret = callback(interactable, interactable.target, interactable._context, i, this);\n\n if (ret !== undefined) {\n return ret;\n }\n }\n};\n\n// all interact.js eventTypes\nInteractable.eventTypes = scope.eventTypes = [];\n\nInteractable.signals = signals;\n\nInteractable.settingsMethods = [ 'deltaSource', 'origin', 'preventDefault', 'rectChecker' ];\n\nmodule.exports = Interactable;\n","const scope = require('./scope');\nconst utils = require('./utils');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst domObjects = require('./utils/domObjects');\nconst finder = require('./utils/interactionFinder');\nconst signals = require('./utils/Signals').new();\n\nconst listeners = {};\nconst methodNames = [\n 'pointerDown', 'pointerMove', 'pointerUp',\n 'updatePointer', 'removePointer',\n];\n\n// for ignoring browser's simulated mouse events\nlet prevTouchTime = 0;\n\n// all active and idle interactions\nscope.interactions = [];\n\nclass Interaction {\n constructor ({ pointerType }) {\n this.target = null; // current interactable being interacted with\n this.element = null; // the target element of the interactable\n\n this.prepared = { // action that's ready to be fired on next move event\n name : null,\n axis : null,\n edges: null,\n };\n\n // keep track of added pointers\n this.pointers = [];\n this.pointerIds = [];\n this.downTargets = [];\n this.downTimes = [];\n\n // Previous native pointer move event coordinates\n this.prevCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n // current native pointer move event coordinates\n this.curCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Starting InteractEvent pointer coordinates\n this.startCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Change in coordinates and time of the pointer\n this.pointerDelta = {\n page : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n client : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n timeStamp: 0,\n };\n\n this.downEvent = null; // pointerdown/mousedown/touchstart event\n this.downPointer = {};\n\n this._eventTarget = null;\n this._curEventTarget = null;\n\n this.prevEvent = null; // previous action event\n\n this.pointerIsDown = false;\n this.pointerWasMoved = false;\n this._interacting = false;\n\n this.pointerType = pointerType;\n\n signals.fire('new', this);\n\n scope.interactions.push(this);\n }\n\n pointerDown (pointer, event, eventTarget) {\n const pointerIndex = this.updatePointer(pointer, event, true);\n\n signals.fire('down', {\n pointer,\n event,\n eventTarget,\n pointerIndex,\n interaction: this,\n });\n }\n\n /*\\\n * Interaction.start\n [ method ]\n *\n * Start an action with the given Interactable and Element as tartgets. The\n * action must be enabled for the target Interactable and an appropriate number\n * of pointers must be held down - 1 for drag/resize, 2 for gesture.\n *\n * Use it with `interactable.able({ manualStart: false })` to always\n * [start actions manually](https://github.com/taye/interact.js/issues/114)\n *\n - action (object) The action to be performed - drag, resize, etc.\n - target (Interactable) The Interactable to target\n - element (Element) The DOM Element to target\n = (object) interact\n **\n | interact(target)\n | .draggable({\n | // disable the default drag start by down->move\n | manualStart: true\n | })\n | // start dragging after the user holds the pointer down\n | .on('hold', function (event) {\n | var interaction = event.interaction;\n |\n | if (!interaction.interacting()) {\n | interaction.start({ name: 'drag' },\n | event.interactable,\n | event.currentTarget);\n | }\n | });\n \\*/\n start (action, target, element) {\n if (this.interacting()\n || !this.pointerIsDown\n || this.pointerIds.length < (action.name === 'gesture'? 2 : 1)) {\n return;\n }\n\n // if this interaction had been removed after stopping\n // add it back\n if (utils.indexOf(scope.interactions, this) === -1) {\n scope.interactions.push(this);\n }\n\n utils.copyAction(this.prepared, action);\n this.target = target;\n this.element = element;\n\n signals.fire('action-start', {\n interaction: this,\n event: this.downEvent,\n });\n }\n\n pointerMove (pointer, event, eventTarget) {\n if (!this.simulation) {\n this.updatePointer(pointer);\n utils.setCoords(this.curCoords, this.pointers);\n }\n\n const duplicateMove = (this.curCoords.page.x === this.prevCoords.page.x\n && this.curCoords.page.y === this.prevCoords.page.y\n && this.curCoords.client.x === this.prevCoords.client.x\n && this.curCoords.client.y === this.prevCoords.client.y);\n\n let dx;\n let dy;\n\n // register movement greater than pointerMoveTolerance\n if (this.pointerIsDown && !this.pointerWasMoved) {\n dx = this.curCoords.client.x - this.startCoords.client.x;\n dy = this.curCoords.client.y - this.startCoords.client.y;\n\n this.pointerWasMoved = utils.hypot(dx, dy) > Interaction.pointerMoveTolerance;\n }\n\n const signalArg = {\n pointer,\n pointerIndex: this.getPointerIndex(pointer),\n event,\n eventTarget,\n dx,\n dy,\n duplicate: duplicateMove,\n interaction: this,\n interactingBeforeMove: this.interacting(),\n };\n\n if (!duplicateMove) {\n // set pointer coordinate, time changes and speeds\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n }\n\n signals.fire('move', signalArg);\n\n if (!duplicateMove) {\n // if interacting, fire an 'action-move' signal etc\n if (this.interacting()) {\n this.doMove(signalArg);\n }\n\n if (this.pointerWasMoved) {\n utils.copyCoords(this.prevCoords, this.curCoords);\n }\n }\n }\n\n /*\\\n * Interaction.doMove\n [ method ]\n *\n * Force a move of the current action at the same coordinates. Useful if\n * snap/restrict has been changed and you want a movement with the new\n * settings.\n *\n **\n | interact(target)\n | .draggable(true)\n | .on('dragmove', function (event) {\n | if (someCondition) {\n | // change the snap settings\n | event.interactable.draggable({ snap: { targets: [] }});\n | // fire another move event with re-calculated snap\n | event.interaction.doMove();\n | }\n | });\n \\*/\n doMove (signalArg) {\n signalArg = utils.extend({\n pointer: this.pointers[0],\n event: this.prevEvent,\n eventTarget: this._eventTarget,\n interaction: this,\n }, signalArg || {});\n\n signals.fire('before-action-move', signalArg);\n\n if (!this._dontFireMove) {\n signals.fire('action-move', signalArg);\n }\n\n this._dontFireMove = false;\n }\n\n // End interact move events and stop auto-scroll unless simulation is running\n pointerUp (pointer, event, eventTarget, curEventTarget) {\n const pointerIndex = this.getPointerIndex(pointer);\n\n signals.fire(/cancel$/i.test(event.type)? 'cancel' : 'up', {\n pointer,\n pointerIndex,\n event,\n eventTarget,\n curEventTarget,\n interaction: this,\n });\n\n if (!this.simulation) {\n this.end(event);\n }\n\n this.pointerIsDown = false;\n this.removePointer(pointer, event);\n }\n\n /*\\\n * Interaction.end\n [ method ]\n *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n - event (PointerEvent) #optional\n **\n | interact(target)\n | .draggable(true)\n | .on('move', function (event) {\n | if (event.pageX > 1000) {\n | // end the current action\n | event.interaction.end();\n | // stop all further listeners from being called\n | event.stopImmediatePropagation();\n | }\n | });\n \\*/\n end (event) {\n event = event || this.prevEvent;\n\n if (this.interacting()) {\n signals.fire('action-end', {\n event,\n interaction: this,\n });\n }\n\n this.stop();\n }\n\n currentAction () {\n return this._interacting? this.prepared.name: null;\n }\n\n interacting () {\n return this._interacting;\n }\n\n stop () {\n signals.fire('stop', { interaction: this });\n\n if (this._interacting) {\n signals.fire('stop-active', { interaction: this });\n signals.fire('stop-' + this.prepared.name, { interaction: this });\n }\n\n this.target = this.element = null;\n\n this._interacting = false;\n this.prepared.name = this.prevEvent = null;\n }\n\n getPointerIndex (pointer) {\n // mouse and pen interactions may have only one pointer\n if (this.pointerType === 'mouse' || this.pointerType === 'pen') {\n return 0;\n }\n\n return utils.indexOf(this.pointerIds, utils.getPointerId(pointer));\n }\n\n updatePointer (pointer, event, down = event && /(down|start)$/i.test(event.type)) {\n const id = utils.getPointerId(pointer);\n let index = this.getPointerIndex(pointer);\n\n if (index === -1) {\n index = this.pointerIds.length;\n this.pointerIds[index] = id;\n }\n\n if (down) {\n signals.fire('update-pointer-down', {\n pointer,\n event,\n down,\n pointerId: id,\n pointerIndex: index,\n interaction: this,\n });\n }\n\n this.pointers[index] = pointer;\n\n return index;\n }\n\n removePointer (pointer, event) {\n const index = this.getPointerIndex(pointer);\n\n if (index === -1) { return; }\n\n signals.fire('remove-pointer', {\n pointer,\n event,\n pointerIndex: index,\n interaction: this,\n });\n\n this.pointers .splice(index, 1);\n this.pointerIds .splice(index, 1);\n this.downTargets.splice(index, 1);\n this.downTimes .splice(index, 1);\n }\n\n _updateEventTargets (target, currentTarget) {\n this._eventTarget = target;\n this._curEventTarget = currentTarget;\n }\n}\n\nfor (let i = 0, len = methodNames.length; i < len; i++) {\n const method = methodNames[i];\n\n listeners[method] = doOnInteractions(method);\n}\n\nfunction doOnInteractions (method) {\n return (function (event) {\n const pointerType = utils.getPointerType(event);\n const [eventTarget, curEventTarget] = utils.getEventTargets(event);\n const matches = []; // [ [pointer, interaction], ...]\n\n if (browser.supportsTouch && /touch/.test(event.type)) {\n prevTouchTime = new Date().getTime();\n\n for (let i = 0; i < event.changedTouches.length; i++) {\n const pointer = event.changedTouches[i];\n const interaction = finder.search(pointer, event.type, eventTarget);\n\n matches.push([pointer, interaction || new Interaction({ pointerType })]);\n }\n }\n else {\n let invalidPointer = false;\n\n if (!browser.supportsPointerEvent && /mouse/.test(event.type)) {\n // ignore mouse events while touch interactions are active\n for (let i = 0; i < scope.interactions.length && !invalidPointer; i++) {\n invalidPointer = scope.interactions[i].pointerType !== 'mouse' && scope.interactions[i].pointerIsDown;\n }\n\n // try to ignore mouse events that are simulated by the browser\n // after a touch event\n invalidPointer = invalidPointer\n || (new Date().getTime() - prevTouchTime < 500)\n // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated\n || event.timeStamp === 0;\n }\n\n if (!invalidPointer) {\n let interaction = finder.search(event, event.type, eventTarget);\n\n if (!interaction) {\n interaction = new Interaction({ pointerType });\n }\n\n matches.push([event, interaction]);\n }\n }\n\n for (const [pointer, interaction] of matches) {\n interaction._updateEventTargets(eventTarget, curEventTarget);\n interaction[method](pointer, event, eventTarget, curEventTarget);\n }\n });\n}\n\nfunction endAll (event) {\n for (let i = 0; i < scope.interactions.length; i++) {\n const interaction = scope.interactions[i];\n\n interaction.end(event);\n signals.fire('endall', { event, interaction });\n }\n}\n\nconst docEvents = { /* 'eventType': listenerFunc */ };\nconst pEventTypes = browser.pEventTypes;\n\nif (domObjects.PointerEvent) {\n docEvents[pEventTypes.down ] = listeners.pointerDown;\n docEvents[pEventTypes.move ] = listeners.pointerMove;\n docEvents[pEventTypes.up ] = listeners.pointerUp;\n docEvents[pEventTypes.cancel] = listeners.pointerUp;\n}\nelse {\n docEvents.mousedown = listeners.pointerDown;\n docEvents.mousemove = listeners.pointerMove;\n docEvents.mouseup = listeners.pointerUp;\n\n docEvents.touchstart = listeners.pointerDown;\n docEvents.touchmove = listeners.pointerMove;\n docEvents.touchend = listeners.pointerUp;\n docEvents.touchcancel = listeners.pointerUp;\n}\n\ndocEvents.blur = endAll;\n\nfunction onDocSignal ({ doc }, signalName) {\n const eventMethod = signalName.indexOf('add') === 0\n ? events.add : events.remove;\n\n // delegate event listener\n for (const eventType in scope.delegatedEvents) {\n eventMethod(doc, eventType, events.delegateListener);\n eventMethod(doc, eventType, events.delegateUseCapture, true);\n }\n\n for (const eventType in docEvents) {\n eventMethod(doc, eventType, docEvents[eventType]);\n }\n}\n\nsignals.on('update-pointer-down', ({ interaction, pointer, pointerId, pointerIndex, event, eventTarget, down }) => {\n interaction.pointerIds[pointerIndex] = pointerId;\n interaction.pointers[pointerIndex] = pointer;\n\n if (down) {\n interaction.pointerIsDown = true;\n }\n\n if (!interaction.interacting()) {\n utils.setCoords(interaction.startCoords, interaction.pointers);\n\n utils.copyCoords(interaction.curCoords , interaction.startCoords);\n utils.copyCoords(interaction.prevCoords, interaction.startCoords);\n\n interaction.downEvent = event;\n interaction.downTimes[pointerIndex] = interaction.curCoords.timeStamp;\n interaction.downTargets[pointerIndex] = eventTarget || event && utils.getEventTargets(event)[0];\n interaction.pointerWasMoved = false;\n\n utils.pointerExtend(interaction.downPointer, pointer);\n }\n});\n\nscope.signals.on('add-document' , onDocSignal);\nscope.signals.on('remove-document', onDocSignal);\n\nInteraction.pointerMoveTolerance = 1;\nInteraction.doOnInteractions = doOnInteractions;\nInteraction.endAll = endAll;\nInteraction.signals = signals;\nInteraction.docEvents = docEvents;\n\nscope.endAllInteractions = endAll;\n\nmodule.exports = Interaction;\n","const Interaction = require('../Interaction');\nconst InteractEvent = require('../InteractEvent');\n\nconst actions = {\n firePrepared,\n names: [],\n methodDict: {},\n};\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n interaction._interacting = true;\n firePrepared(interaction, event, 'start');\n});\n\nInteraction.signals.on('action-move', function ({ interaction, event, preEnd }) {\n firePrepared(interaction, event, 'move', preEnd);\n\n // if the action was ended in a listener\n if (!interaction.interacting()) { return false; }\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n firePrepared(interaction, event, 'end');\n});\n\nfunction firePrepared (interaction, event, phase, preEnd) {\n const actionName = interaction.prepared.name;\n\n const newEvent = new InteractEvent(interaction, event, actionName, phase, interaction.element, null, preEnd);\n\n interaction.target.fire(newEvent);\n interaction.prevEvent = newEvent;\n}\n\nmodule.exports = actions;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drag = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n startAxis : 'xy',\n lockAxis : 'xy',\n },\n\n checker: function (pointer, event, interactable) {\n const dragOptions = interactable.options.drag;\n\n return dragOptions.enabled\n ? { name: 'drag', axis: (dragOptions.lockAxis === 'start'\n ? dragOptions.startAxis\n : dragOptions.lockAxis)}\n : null;\n },\n\n getCursor: function () {\n return 'move';\n },\n};\n\nInteraction.signals.on('before-action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n interaction.curCoords.page.y = interaction.startCoords.page.y;\n interaction.curCoords.client.y = interaction.startCoords.client.y;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vx);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vx);\n interaction.pointerDelta.client.vy = 0;\n interaction.pointerDelta.page.vy = 0;\n }\n else if (axis === 'y') {\n interaction.curCoords.page.x = interaction.startCoords.page.x;\n interaction.curCoords.client.x = interaction.startCoords.client.x;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vy);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vy);\n interaction.pointerDelta.client.vx = 0;\n interaction.pointerDelta.page.vx = 0;\n }\n});\n\n// dragmove\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'dragmove') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n iEvent.pageY = interaction.startCoords.page.y;\n iEvent.clientY = interaction.startCoords.client.y;\n iEvent.dy = 0;\n }\n else if (axis === 'y') {\n iEvent.pageX = interaction.startCoords.page.x;\n iEvent.clientX = interaction.startCoords.client.x;\n iEvent.dx = 0;\n }\n});\n\n/*\\\n * Interactable.draggable\n [ method ]\n *\n * Gets or sets whether drag actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of drag events\n | var isDraggable = interact('ul li').draggable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on drag events (object makes the Interactable draggable)\n = (object) This Interactable\n | interact(element).draggable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // the axis in which the first movement must be\n | // for the drag sequence to start\n | // 'xy' by default - any direction\n | startAxis: 'x' || 'y' || 'xy',\n |\n | // 'xy' by default - don't restrict to one axis (move in any direction)\n | // 'x' or 'y' to restrict movement to either axis\n | // 'start' to restrict movement to the axis the drag started in\n | lockAxis: 'x' || 'y' || 'xy' || 'start',\n |\n | // max number of drags that can happen concurrently\n | // with elements of this Interactable. Infinity by default\n | max: Infinity,\n |\n | // max number of drags that can target the same element+Interactable\n | // 1 by default\n | maxPerElement: 2\n | });\n\\*/\nInteractable.prototype.draggable = function (options) {\n if (utils.is.object(options)) {\n this.options.drag.enabled = options.enabled === false? false: true;\n this.setPerAction('drag', options);\n this.setOnEvents('drag', options);\n\n if (/^(xy|x|y|start)$/.test(options.lockAxis)) {\n this.options.drag.lockAxis = options.lockAxis;\n }\n if (/^(xy|x|y)$/.test(options.startAxis)) {\n this.options.drag.startAxis = options.startAxis;\n }\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drag.enabled = options;\n\n if (!options) {\n this.ondragstart = this.ondragstart = this.ondragend = null;\n }\n\n return this;\n }\n\n return this.options.drag;\n};\n\nactions.drag = drag;\nactions.names.push('drag');\nutils.merge(Interactable.eventTypes, [\n 'dragstart',\n 'dragmove',\n 'draginertiastart',\n 'draginertiaresume',\n 'dragend',\n]);\nactions.methodDict.drag = 'draggable';\n\ndefaultOptions.drag = drag.defaults;\n\nmodule.exports = drag;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst scope = require('../scope');\nconst interact = require('../interact');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drop = {\n defaults: {\n enabled: false,\n accept : null,\n overlap: 'pointer',\n },\n};\n\nlet dynamicDrop = false;\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // reset active dropzones\n interaction.activeDrops.dropzones = [];\n interaction.activeDrops.elements = [];\n interaction.activeDrops.rects = [];\n\n interaction.dropEvents = null;\n\n if (!interaction.dynamicDrop) {\n setActiveDrops(interaction, interaction.element);\n }\n\n const dragEvent = interaction.prevEvent;\n const dropEvents = getDropEvents(interaction, event, dragEvent);\n\n if (dropEvents.activate) {\n fireActiveDrops(interaction, dropEvents.activate);\n }\n});\n\nInteractEvent.signals.on('new', function ({ interaction, iEvent, event }) {\n if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { return; }\n\n const draggableElement = interaction.element;\n const dragEvent = iEvent;\n const dropResult = getDrop(dragEvent, event, draggableElement);\n\n interaction.dropTarget = dropResult.dropzone;\n interaction.dropElement = dropResult.element;\n\n interaction.dropEvents = getDropEvents(interaction, event, dragEvent);\n});\n\nInteraction.signals.on('action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n fireDropEvents(interaction, interaction.dropEvents);\n});\n\nInteraction.signals.on('action-end', function ({ interaction }) {\n if (interaction.prepared.name === 'drag') {\n fireDropEvents(interaction, interaction.dropEvents);\n }\n});\n\nInteraction.signals.on('stop-drag', function ({ interaction }) {\n interaction.activeDrops.dropzones =\n interaction.activeDrops.elements =\n interaction.activeDrops.rects =\n interaction.dropEvents = null;\n});\n\nfunction collectDrops (interaction, element) {\n const drops = [];\n const elements = [];\n\n element = element || interaction.element;\n\n // collect all dropzones and their elements which qualify for a drop\n for (const current of scope.interactables) {\n if (!current.options.drop.enabled) { continue; }\n\n const accept = current.options.drop.accept;\n\n // test the draggable element against the dropzone's accept setting\n if ((utils.is.element(accept) && accept !== element)\n || (utils.is.string(accept)\n && !utils.matchesSelector(element, accept))) {\n\n continue;\n }\n\n // query for new elements if necessary\n const dropElements = utils.is.string(current.target)\n ? current._context.querySelectorAll(current.target)\n : [current.target];\n\n for (let i = 0; i < dropElements.length; i++) {\n const currentElement = dropElements[i];\n\n if (currentElement !== element) {\n drops.push(current);\n elements.push(currentElement);\n }\n }\n }\n\n return {\n elements,\n dropzones: drops,\n };\n}\n\nfunction fireActiveDrops (interaction, event) {\n let prevElement;\n\n // loop through all active dropzones and trigger event\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n const current = interaction.activeDrops.dropzones[i];\n const currentElement = interaction.activeDrops.elements [i];\n\n // prevent trigger of duplicate events on same element\n if (currentElement !== prevElement) {\n // set current element as event target\n event.target = currentElement;\n current.fire(event);\n }\n prevElement = currentElement;\n }\n}\n\n// Collect a new set of possible drops and save them in activeDrops.\n// setActiveDrops should always be called when a drag has just started or a\n// drag event happens while dynamicDrop is true\nfunction setActiveDrops (interaction, dragElement) {\n // get dropzones and their elements that could receive the draggable\n const possibleDrops = collectDrops(interaction, dragElement, true);\n\n interaction.activeDrops.dropzones = possibleDrops.dropzones;\n interaction.activeDrops.elements = possibleDrops.elements;\n interaction.activeDrops.rects = [];\n\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n interaction.activeDrops.rects[i] =\n interaction.activeDrops.dropzones[i].getRect(interaction.activeDrops.elements[i]);\n }\n}\n\nfunction getDrop (dragEvent, event, dragElement) {\n const interaction = dragEvent.interaction;\n const validDrops = [];\n\n if (dynamicDrop) {\n setActiveDrops(interaction, dragElement);\n }\n\n // collect all dropzones and their elements which qualify for a drop\n for (let j = 0; j < interaction.activeDrops.dropzones.length; j++) {\n const current = interaction.activeDrops.dropzones[j];\n const currentElement = interaction.activeDrops.elements [j];\n const rect = interaction.activeDrops.rects [j];\n\n validDrops.push(current.dropCheck(dragEvent, event, interaction.target, dragElement, currentElement, rect)\n ? currentElement\n : null);\n }\n\n // get the most appropriate dropzone based on DOM depth and order\n const dropIndex = utils.indexOfDeepestElement(validDrops);\n\n return {\n dropzone: interaction.activeDrops.dropzones[dropIndex] || null,\n element : interaction.activeDrops.elements [dropIndex] || null,\n };\n}\n\nfunction getDropEvents (interaction, pointerEvent, dragEvent) {\n const dropEvents = {\n enter : null,\n leave : null,\n activate : null,\n deactivate: null,\n move : null,\n drop : null,\n };\n\n const tmpl = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n };\n\n if (interaction.dropElement !== interaction.prevDropElement) {\n // if there was a prevDropTarget, create a dragleave event\n if (interaction.prevDropTarget) {\n dropEvents.leave = utils.extend({ type: 'dragleave' }, tmpl);\n\n dragEvent.dragLeave = dropEvents.leave.target = interaction.prevDropElement;\n dragEvent.prevDropzone = dropEvents.leave.dropzone = interaction.prevDropTarget;\n }\n // if the dropTarget is not null, create a dragenter event\n if (interaction.dropTarget) {\n dropEvents.enter = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n type : 'dragenter',\n };\n\n dragEvent.dragEnter = interaction.dropElement;\n dragEvent.dropzone = interaction.dropTarget;\n }\n }\n\n if (dragEvent.type === 'dragend' && interaction.dropTarget) {\n dropEvents.drop = utils.extend({ type: 'drop' }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n dragEvent.relatedTarget = interaction.dropElement;\n }\n if (dragEvent.type === 'dragstart') {\n dropEvents.activate = utils.extend({ type: 'dropactivate' }, tmpl);\n\n dropEvents.activate.target = null;\n dropEvents.activate.dropzone = null;\n }\n if (dragEvent.type === 'dragend') {\n dropEvents.deactivate = utils.extend({ type: 'dropdeactivate' }, tmpl);\n\n dropEvents.deactivate.target = null;\n dropEvents.deactivate.dropzone = null;\n }\n if (dragEvent.type === 'dragmove' && interaction.dropTarget) {\n dropEvents.move = utils.extend({\n dragmove : dragEvent,\n type : 'dropmove',\n }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n }\n\n return dropEvents;\n}\n\nfunction fireDropEvents (interaction, dropEvents) {\n if (dropEvents.leave) { interaction.prevDropTarget.fire(dropEvents.leave); }\n if (dropEvents.move ) { interaction.dropTarget.fire(dropEvents.move ); }\n if (dropEvents.enter) { interaction.dropTarget.fire(dropEvents.enter); }\n if (dropEvents.drop ) { interaction.dropTarget.fire(dropEvents.drop ); }\n if (dropEvents.deactivate) {\n fireActiveDrops(interaction, dropEvents.deactivate);\n }\n\n interaction.prevDropTarget = interaction.dropTarget;\n interaction.prevDropElement = interaction.dropElement;\n}\n\n/*\\\n * Interactable.dropzone\n [ method ]\n *\n * Returns or sets whether elements can be dropped onto this\n * Interactable to trigger drop events\n *\n * Dropzones can receive the following events:\n * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends\n * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone\n * - `dragmove` when a draggable that has entered the dropzone is moved\n * - `drop` when a draggable is dropped into this dropzone\n *\n * Use the `accept` option to allow only elements that match the given CSS\n * selector or element. The value can be:\n *\n * - **an Element** - only that element can be dropped into this dropzone.\n * - **a string**, - the element being dragged must match it as a CSS selector.\n * - **`null`** - accept options is cleared - it accepts any element.\n *\n * Use the `overlap` option to set how drops are checked for. The allowed\n * values are:\n *\n * - `'pointer'`, the pointer must be over the dropzone (default)\n * - `'center'`, the draggable element's center must be over the dropzone\n * - a number from 0-1 which is the `(intersection area) / (draggable area)`.\n * e.g. `0.5` for drop to happen when half of the area of the draggable is\n * over the dropzone\n *\n * Use the `checker` option to specify a function to check if a dragged\n * element is over this Interactable.\n *\n | interact(target)\n | .dropChecker(function(dragEvent, // related dragmove or dragend event\n | event, // TouchEvent/PointerEvent/MouseEvent\n | dropped, // bool result of the default checker\n | dropzone, // dropzone Interactable\n | dropElement, // dropzone elemnt\n | draggable, // draggable Interactable\n | draggableElement) {// draggable element\n |\n | return dropped && event.target.hasAttribute('allow-drop');\n | }\n *\n *\n - options (boolean | object | null) #optional The new value to be set.\n | interact('.drop').dropzone({\n | accept: '.can-drop' || document.getElementById('single-drop'),\n | overlap: 'pointer' || 'center' || zeroToOne\n | }\n = (boolean | object) The current setting or this Interactable\n\\*/\nInteractable.prototype.dropzone = function (options) {\n if (utils.is.object(options)) {\n this.options.drop.enabled = options.enabled === false? false: true;\n\n if (utils.is.function(options.ondrop) ) { this.events.ondrop = options.ondrop ; }\n if (utils.is.function(options.ondropactivate) ) { this.events.ondropactivate = options.ondropactivate ; }\n if (utils.is.function(options.ondropdeactivate)) { this.events.ondropdeactivate = options.ondropdeactivate; }\n if (utils.is.function(options.ondragenter) ) { this.events.ondragenter = options.ondragenter ; }\n if (utils.is.function(options.ondragleave) ) { this.events.ondragleave = options.ondragleave ; }\n if (utils.is.function(options.ondropmove) ) { this.events.ondropmove = options.ondropmove ; }\n\n if (/^(pointer|center)$/.test(options.overlap)) {\n this.options.drop.overlap = options.overlap;\n }\n else if (utils.is.number(options.overlap)) {\n this.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0);\n }\n if ('accept' in options) {\n this.options.drop.accept = options.accept;\n }\n if ('checker' in options) {\n this.options.drop.checker = options.checker;\n }\n\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drop.enabled = options;\n\n if (!options) {\n this.ondragenter = this.ondragleave = this.ondrop\n = this.ondropactivate = this.ondropdeactivate = null;\n }\n\n return this;\n }\n\n return this.options.drop;\n};\n\nInteractable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) {\n let dropped = false;\n\n // if the dropzone has no rect (eg. display: none)\n // call the custom dropChecker or just return false\n if (!(rect = rect || this.getRect(dropElement))) {\n return (this.options.drop.checker\n ? this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement)\n : false);\n }\n\n const dropOverlap = this.options.drop.overlap;\n\n if (dropOverlap === 'pointer') {\n const origin = utils.getOriginXY(draggable, draggableElement, 'drag');\n const page = utils.getPageXY(dragEvent);\n\n page.x += origin.x;\n page.y += origin.y;\n\n const horizontal = (page.x > rect.left) && (page.x < rect.right);\n const vertical = (page.y > rect.top ) && (page.y < rect.bottom);\n\n dropped = horizontal && vertical;\n }\n\n const dragRect = draggable.getRect(draggableElement);\n\n if (dragRect && dropOverlap === 'center') {\n const cx = dragRect.left + dragRect.width / 2;\n const cy = dragRect.top + dragRect.height / 2;\n\n dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom;\n }\n\n if (dragRect && utils.is.number(dropOverlap)) {\n const overlapArea = (Math.max(0, Math.min(rect.right , dragRect.right ) - Math.max(rect.left, dragRect.left))\n * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top , dragRect.top )));\n\n const overlapRatio = overlapArea / (dragRect.width * dragRect.height);\n\n dropped = overlapRatio >= dropOverlap;\n }\n\n if (this.options.drop.checker) {\n dropped = this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement);\n }\n\n return dropped;\n};\n\nInteractable.signals.on('unset', function ({ interactable }) {\n interactable.dropzone(false);\n});\n\nInteractable.settingsMethods.push('dropChecker');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.dropTarget = null; // the dropzone a drag target might be dropped into\n interaction.dropElement = null; // the element at the time of checking\n interaction.prevDropTarget = null; // the dropzone that was recently dragged away from\n interaction.prevDropElement = null; // the element at the time of checking\n interaction.dropEvents = null; // the dropEvents related to the current drag event\n\n interaction.activeDrops = {\n dropzones: [], // the dropzones that are mentioned below\n elements : [], // elements of dropzones that accept the target draggable\n rects : [], // the rects of the elements mentioned above\n };\n\n});\n\nInteraction.signals.on('stop', function ({ interaction }) {\n interaction.dropTarget = interaction.dropElement =\n interaction.prevDropTarget = interaction.prevDropElement = null;\n});\n\n/*\\\n * interact.dynamicDrop\n [ method ]\n *\n * Returns or sets whether the dimensions of dropzone elements are\n * calculated on every dragmove or only on dragstart for the default\n * dropChecker\n *\n - newValue (boolean) #optional True to check on each move. False to check only before start\n = (boolean | interact) The current setting or interact\n\\*/\ninteract.dynamicDrop = function (newValue) {\n if (utils.is.bool(newValue)) {\n //if (dragging && dynamicDrop !== newValue && !newValue) {\n //calcRects(dropzones);\n //}\n\n dynamicDrop = newValue;\n\n return interact;\n }\n return dynamicDrop;\n};\n\nutils.merge(Interactable.eventTypes, [\n 'dragenter',\n 'dragleave',\n 'dropactivate',\n 'dropdeactivate',\n 'dropmove',\n 'drop',\n]);\nactions.methodDict.drop = 'dropzone';\n\ndefaultOptions.drop = drop.defaults;\n\nmodule.exports = drop;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst gesture = {\n defaults: {\n enabled : false,\n origin : null,\n restrict: null,\n },\n\n checker: function (pointer, event, interactable, element, interaction) {\n if (interaction.pointerIds.length >= 2) {\n return { name: 'gesture' };\n }\n\n return null;\n },\n\n getCursor: function () {\n return '';\n },\n};\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturestart') { return; }\n iEvent.ds = 0;\n\n interaction.gesture.startDistance = interaction.gesture.prevDistance = iEvent.distance;\n interaction.gesture.startAngle = interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.scale = 1;\n});\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturemove') { return; }\n\n iEvent.ds = iEvent.scale - interaction.gesture.scale;\n\n interaction.target.fire(iEvent);\n\n interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.prevDistance = iEvent.distance;\n\n if (iEvent.scale !== Infinity\n && iEvent.scale !== null\n && iEvent.scale !== undefined\n && !isNaN(iEvent.scale)) {\n\n interaction.gesture.scale = iEvent.scale;\n }\n});\n\n/*\\\n * Interactable.gesturable\n [ method ]\n *\n * Gets or sets whether multitouch gestures can be performed on the\n * Interactable's element\n *\n = (boolean) Indicates if this can be the target of gesture events\n | var isGestureable = interact(element).gesturable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on gesture events (makes the Interactable gesturable)\n = (object) this Interactable\n | interact(element).gesturable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // limit multiple gestures.\n | // See the explanation in @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n\\*/\nInteractable.prototype.gesturable = function (options) {\n if (utils.is.object(options)) {\n this.options.gesture.enabled = options.enabled === false? false: true;\n this.setPerAction('gesture', options);\n this.setOnEvents('gesture', options);\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.gesture.enabled = options;\n\n if (!options) {\n this.ongesturestart = this.ongesturestart = this.ongestureend = null;\n }\n\n return this;\n }\n\n return this.options.gesture;\n};\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action, event, starting, ending, deltaSource }) {\n if (action !== 'gesture') { return; }\n\n const pointers = interaction.pointers;\n\n iEvent.touches = [pointers[0], pointers[1]];\n\n if (starting) {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = 1;\n iEvent.ds = 0;\n iEvent.angle = utils.touchAngle(pointers, undefined, deltaSource);\n iEvent.da = 0;\n }\n else if (ending || event instanceof InteractEvent) {\n iEvent.distance = interaction.prevEvent.distance;\n iEvent.box = interaction.prevEvent.box;\n iEvent.scale = interaction.prevEvent.scale;\n iEvent.ds = iEvent.scale - 1;\n iEvent.angle = interaction.prevEvent.angle;\n iEvent.da = iEvent.angle - interaction.gesture.startAngle;\n }\n else {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = iEvent.distance / interaction.gesture.startDistance;\n iEvent.angle = utils.touchAngle(pointers, interaction.gesture.prevAngle, deltaSource);\n\n iEvent.ds = iEvent.scale - interaction.gesture.prevScale;\n iEvent.da = iEvent.angle - interaction.gesture.prevAngle;\n }\n});\n\nInteraction.signals.on('new', function (interaction) {\n interaction.gesture = {\n start: { x: 0, y: 0 },\n\n startDistance: 0, // distance between two touches of touchStart\n prevDistance : 0,\n distance : 0,\n\n scale: 1, // gesture.distance / gesture.startDistance\n\n startAngle: 0, // angle of line joining two touches\n prevAngle : 0, // angle of the previous gesture event\n };\n});\n\nactions.gesture = gesture;\nactions.names.push('gesture');\nutils.merge(Interactable.eventTypes, [\n 'gesturestart',\n 'gesturemove',\n 'gestureend',\n]);\nactions.methodDict.gesture = 'gesturable';\n\ndefaultOptions.gesture = gesture.defaults;\n\nmodule.exports = gesture;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\n// Less Precision with touch input\nconst defaultMargin = browser.supportsTouch || browser.supportsPointerEvent? 20: 10;\n\nconst resize = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n square: false,\n preserveAspectRatio: false,\n axis: 'xy',\n\n // use default margin\n margin: NaN,\n\n // object with props left, right, top, bottom which are\n // true/false values to resize when the pointer is over that edge,\n // CSS selectors to match the handles for each direction\n // or the Elements for each handle\n edges: null,\n\n // a value of 'none' will limit the resize rect to a minimum of 0x0\n // 'negate' will alow the rect to have negative width/height\n // 'reposition' will keep the width/height positive by swapping\n // the top and bottom edges and/or swapping the left and right edges\n invert: 'none',\n },\n\n checker: function (pointer, event, interactable, element, interaction, rect) {\n if (!rect) { return null; }\n\n const page = utils.extend({}, interaction.curCoords.page);\n const options = interactable.options;\n\n if (options.resize.enabled) {\n const resizeOptions = options.resize;\n const resizeEdges = { left: false, right: false, top: false, bottom: false };\n\n // if using resize.edges\n if (utils.is.object(resizeOptions.edges)) {\n for (const edge in resizeEdges) {\n resizeEdges[edge] = checkResizeEdge(edge,\n resizeOptions.edges[edge],\n page,\n interaction._eventTarget,\n element,\n rect,\n resizeOptions.margin || defaultMargin);\n }\n\n resizeEdges.left = resizeEdges.left && !resizeEdges.right;\n resizeEdges.top = resizeEdges.top && !resizeEdges.bottom;\n\n if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) {\n return {\n name: 'resize',\n edges: resizeEdges,\n };\n }\n }\n else {\n const right = options.resize.axis !== 'y' && page.x > (rect.right - defaultMargin);\n const bottom = options.resize.axis !== 'x' && page.y > (rect.bottom - defaultMargin);\n\n if (right || bottom) {\n return {\n name: 'resize',\n axes: (right? 'x' : '') + (bottom? 'y' : ''),\n };\n }\n }\n }\n\n return null;\n },\n\n cursors: (browser.isIe9OrOlder ? {\n x : 'e-resize',\n y : 's-resize',\n xy: 'se-resize',\n\n top : 'n-resize',\n left : 'w-resize',\n bottom : 's-resize',\n right : 'e-resize',\n topleft : 'se-resize',\n bottomright: 'se-resize',\n topright : 'ne-resize',\n bottomleft : 'ne-resize',\n } : {\n x : 'ew-resize',\n y : 'ns-resize',\n xy: 'nwse-resize',\n\n top : 'ns-resize',\n left : 'ew-resize',\n bottom : 'ns-resize',\n right : 'ew-resize',\n topleft : 'nwse-resize',\n bottomright: 'nwse-resize',\n topright : 'nesw-resize',\n bottomleft : 'nesw-resize',\n }),\n\n getCursor: function (action) {\n if (action.axis) {\n return resize.cursors[action.name + action.axis];\n }\n else if (action.edges) {\n let cursorKey = '';\n const edgeNames = ['top', 'bottom', 'left', 'right'];\n\n for (let i = 0; i < 4; i++) {\n if (action.edges[edgeNames[i]]) {\n cursorKey += edgeNames[i];\n }\n }\n\n return resize.cursors[cursorKey];\n }\n },\n};\n\n// resizestart\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'resizestart' || !interaction.prepared.edges) {\n return;\n }\n\n const startRect = interaction.target.getRect(interaction.element);\n const resizeOptions = interaction.target.options.resize;\n\n /*\n * When using the `resizable.square` or `resizable.preserveAspectRatio` options, resizing from one edge\n * will affect another. E.g. with `resizable.square`, resizing to make the right edge larger will make\n * the bottom edge larger by the same amount. We call these 'linked' edges. Any linked edges will depend\n * on the active edges and the edge being interacted with.\n */\n if (resizeOptions.square || resizeOptions.preserveAspectRatio) {\n const linkedEdges = utils.extend({}, interaction.prepared.edges);\n\n linkedEdges.top = linkedEdges.top || (linkedEdges.left && !linkedEdges.bottom);\n linkedEdges.left = linkedEdges.left || (linkedEdges.top && !linkedEdges.right );\n linkedEdges.bottom = linkedEdges.bottom || (linkedEdges.right && !linkedEdges.top );\n linkedEdges.right = linkedEdges.right || (linkedEdges.bottom && !linkedEdges.left );\n\n interaction.prepared._linkedEdges = linkedEdges;\n }\n else {\n interaction.prepared._linkedEdges = null;\n }\n\n // if using `resizable.preserveAspectRatio` option, record aspect ratio at the start of the resize\n if (resizeOptions.preserveAspectRatio) {\n interaction.resizeStartAspectRatio = startRect.width / startRect.height;\n }\n\n interaction.resizeRects = {\n start : startRect,\n current : utils.extend({}, startRect),\n inverted : utils.extend({}, startRect),\n previous : utils.extend({}, startRect),\n delta : {\n left: 0, right : 0, width : 0,\n top : 0, bottom: 0, height: 0,\n },\n };\n\n iEvent.rect = interaction.resizeRects.inverted;\n iEvent.deltaRect = interaction.resizeRects.delta;\n});\n\n// resizemove\nInteractEvent.signals.on('new', function ({ iEvent, phase, interaction }) {\n if (phase !== 'move' || !interaction.prepared.edges) { return; }\n\n const resizeOptions = interaction.target.options.resize;\n const invert = resizeOptions.invert;\n const invertible = invert === 'reposition' || invert === 'negate';\n\n let edges = interaction.prepared.edges;\n\n const start = interaction.resizeRects.start;\n const current = interaction.resizeRects.current;\n const inverted = interaction.resizeRects.inverted;\n const delta = interaction.resizeRects.delta;\n const previous = utils.extend(interaction.resizeRects.previous, inverted);\n const originalEdges = edges;\n\n let dx = iEvent.dx;\n let dy = iEvent.dy;\n\n if (resizeOptions.preserveAspectRatio || resizeOptions.square) {\n // `resize.preserveAspectRatio` takes precedence over `resize.square`\n const startAspectRatio = resizeOptions.preserveAspectRatio\n ? interaction.resizeStartAspectRatio\n : 1;\n\n edges = interaction.prepared._linkedEdges;\n\n if ((originalEdges.left && originalEdges.bottom)\n || (originalEdges.right && originalEdges.top)) {\n dy = -dx / startAspectRatio;\n }\n else if (originalEdges.left || originalEdges.right ) { dy = dx / startAspectRatio; }\n else if (originalEdges.top || originalEdges.bottom) { dx = dy * startAspectRatio; }\n }\n\n // update the 'current' rect without modifications\n if (edges.top ) { current.top += dy; }\n if (edges.bottom) { current.bottom += dy; }\n if (edges.left ) { current.left += dx; }\n if (edges.right ) { current.right += dx; }\n\n if (invertible) {\n // if invertible, copy the current rect\n utils.extend(inverted, current);\n\n if (invert === 'reposition') {\n // swap edge values if necessary to keep width/height positive\n let swap;\n\n if (inverted.top > inverted.bottom) {\n swap = inverted.top;\n\n inverted.top = inverted.bottom;\n inverted.bottom = swap;\n }\n if (inverted.left > inverted.right) {\n swap = inverted.left;\n\n inverted.left = inverted.right;\n inverted.right = swap;\n }\n }\n }\n else {\n // if not invertible, restrict to minimum of 0x0 rect\n inverted.top = Math.min(current.top, start.bottom);\n inverted.bottom = Math.max(current.bottom, start.top);\n inverted.left = Math.min(current.left, start.right);\n inverted.right = Math.max(current.right, start.left);\n }\n\n inverted.width = inverted.right - inverted.left;\n inverted.height = inverted.bottom - inverted.top ;\n\n for (const edge in inverted) {\n delta[edge] = inverted[edge] - previous[edge];\n }\n\n iEvent.edges = interaction.prepared.edges;\n iEvent.rect = inverted;\n iEvent.deltaRect = delta;\n});\n\n/*\\\n * Interactable.resizable\n [ method ]\n *\n * Gets or sets whether resize actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of resize elements\n | var isResizeable = interact('input[type=text]').resizable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on resize events (object makes the Interactable resizable)\n = (object) This Interactable\n | interact(element).resizable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | edges: {\n | top : true, // Use pointer coords to check for resize.\n | left : false, // Disable resizing from left edge.\n | bottom: '.resize-s',// Resize if pointer target matches selector\n | right : handleEl // Resize if pointer target is the given Element\n | },\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height are adjusted at a 1:1 ratio.\n | square: false,\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height maintain the aspect ratio they had when resizing started.\n | preserveAspectRatio: false,\n |\n | // a value of 'none' will limit the resize rect to a minimum of 0x0\n | // 'negate' will allow the rect to have negative width/height\n | // 'reposition' will keep the width/height positive by swapping\n | // the top and bottom edges and/or swapping the left and right edges\n | invert: 'none' || 'negate' || 'reposition'\n |\n | // limit multiple resizes.\n | // See the explanation in the @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n \\*/\nInteractable.prototype.resizable = function (options) {\n if (utils.is.object(options)) {\n this.options.resize.enabled = options.enabled === false? false: true;\n this.setPerAction('resize', options);\n this.setOnEvents('resize', options);\n\n if (/^x$|^y$|^xy$/.test(options.axis)) {\n this.options.resize.axis = options.axis;\n }\n else if (options.axis === null) {\n this.options.resize.axis = defaultOptions.resize.axis;\n }\n\n if (utils.is.bool(options.preserveAspectRatio)) {\n this.options.resize.preserveAspectRatio = options.preserveAspectRatio;\n }\n else if (utils.is.bool(options.square)) {\n this.options.resize.square = options.square;\n }\n\n return this;\n }\n if (utils.is.bool(options)) {\n this.options.resize.enabled = options;\n\n if (!options) {\n this.onresizestart = this.onresizestart = this.onresizeend = null;\n }\n\n return this;\n }\n return this.options.resize;\n};\n\nfunction checkResizeEdge (name, value, page, element, interactableElement, rect, margin) {\n // false, '', undefined, null\n if (!value) { return false; }\n\n // true value, use pointer coords and element rect\n if (value === true) {\n // if dimensions are negative, \"switch\" edges\n const width = utils.is.number(rect.width )? rect.width : rect.right - rect.left;\n const height = utils.is.number(rect.height)? rect.height : rect.bottom - rect.top ;\n\n if (width < 0) {\n if (name === 'left' ) { name = 'right'; }\n else if (name === 'right') { name = 'left' ; }\n }\n if (height < 0) {\n if (name === 'top' ) { name = 'bottom'; }\n else if (name === 'bottom') { name = 'top' ; }\n }\n\n if (name === 'left' ) { return page.x < ((width >= 0? rect.left: rect.right ) + margin); }\n if (name === 'top' ) { return page.y < ((height >= 0? rect.top : rect.bottom) + margin); }\n\n if (name === 'right' ) { return page.x > ((width >= 0? rect.right : rect.left) - margin); }\n if (name === 'bottom') { return page.y > ((height >= 0? rect.bottom: rect.top ) - margin); }\n }\n\n // the remaining checks require an element\n if (!utils.is.element(element)) { return false; }\n\n return utils.is.element(value)\n // the value is an element to use as a resize handle\n ? value === element\n // otherwise check if element matches value as selector\n : utils.matchesUpTo(element, value, interactableElement);\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.resizeAxes = 'xy';\n});\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action }) {\n if (action !== 'resize' || !interaction.resizeAxes) { return; }\n\n const options = interaction.target.options;\n\n if (options.resize.square) {\n if (interaction.resizeAxes === 'y') {\n iEvent.dx = iEvent.dy;\n }\n else {\n iEvent.dy = iEvent.dx;\n }\n iEvent.axes = 'xy';\n }\n else {\n iEvent.axes = interaction.resizeAxes;\n\n if (interaction.resizeAxes === 'x') {\n iEvent.dy = 0;\n }\n else if (interaction.resizeAxes === 'y') {\n iEvent.dx = 0;\n }\n }\n});\n\nactions.resize = resize;\nactions.names.push('resize');\nutils.merge(Interactable.eventTypes, [\n 'resizestart',\n 'resizemove',\n 'resizeinertiastart',\n 'resizeinertiaresume',\n 'resizeend',\n]);\nactions.methodDict.resize = 'resizable';\n\ndefaultOptions.resize = resize.defaults;\n\nmodule.exports = resize;\n","const raf = require('./utils/raf');\nconst getWindow = require('./utils/window').getWindow;\nconst is = require('./utils/is');\nconst domUtils = require('./utils/domUtils');\nconst Interaction = require('./Interaction');\nconst defaultOptions = require('./defaultOptions');\n\nconst autoScroll = {\n defaults: {\n enabled : false,\n container: null, // the item that is scrolled (Window or HTMLElement)\n margin : 60,\n speed : 300, // the scroll speed in pixels per second\n },\n\n interaction: null,\n i: null, // the handle returned by window.setInterval\n x: 0, y: 0, // Direction each pulse is to scroll in\n\n isScrolling: false,\n prevTime: 0,\n\n start: function (interaction) {\n autoScroll.isScrolling = true;\n raf.cancel(autoScroll.i);\n\n autoScroll.interaction = interaction;\n autoScroll.prevTime = new Date().getTime();\n autoScroll.i = raf.request(autoScroll.scroll);\n },\n\n stop: function () {\n autoScroll.isScrolling = false;\n raf.cancel(autoScroll.i);\n },\n\n // scroll the window by the values in scroll.x/y\n scroll: function () {\n const options = autoScroll.interaction.target.options[autoScroll.interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(autoScroll.interaction.element);\n const now = new Date().getTime();\n // change in time in seconds\n const dt = (now - autoScroll.prevTime) / 1000;\n // displacement\n const s = options.speed * dt;\n\n if (s >= 1) {\n if (is.window(container)) {\n container.scrollBy(autoScroll.x * s, autoScroll.y * s);\n }\n else if (container) {\n container.scrollLeft += autoScroll.x * s;\n container.scrollTop += autoScroll.y * s;\n }\n\n autoScroll.prevTime = now;\n }\n\n if (autoScroll.isScrolling) {\n raf.cancel(autoScroll.i);\n autoScroll.i = raf.request(autoScroll.scroll);\n }\n },\n check: function (interactable, actionName) {\n const options = interactable.options;\n\n return options[actionName].autoScroll && options[actionName].autoScroll.enabled;\n },\n onInteractionMove: function ({ interaction, pointer }) {\n if (!(interaction.interacting()\n && autoScroll.check(interaction.target, interaction.prepared.name))) {\n return;\n }\n\n if (interaction.simulation) {\n autoScroll.x = autoScroll.y = 0;\n return;\n }\n\n let top;\n let right;\n let bottom;\n let left;\n\n const options = interaction.target.options[interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(interaction.element);\n\n if (is.window(container)) {\n left = pointer.clientX < autoScroll.margin;\n top = pointer.clientY < autoScroll.margin;\n right = pointer.clientX > container.innerWidth - autoScroll.margin;\n bottom = pointer.clientY > container.innerHeight - autoScroll.margin;\n }\n else {\n const rect = domUtils.getElementClientRect(container);\n\n left = pointer.clientX < rect.left + autoScroll.margin;\n top = pointer.clientY < rect.top + autoScroll.margin;\n right = pointer.clientX > rect.right - autoScroll.margin;\n bottom = pointer.clientY > rect.bottom - autoScroll.margin;\n }\n\n autoScroll.x = (right ? 1: left? -1: 0);\n autoScroll.y = (bottom? 1: top? -1: 0);\n\n if (!autoScroll.isScrolling) {\n // set the autoScroll properties to those of the target\n autoScroll.margin = options.margin;\n autoScroll.speed = options.speed;\n\n autoScroll.start(interaction);\n }\n },\n};\n\nInteraction.signals.on('stop-active', function () {\n autoScroll.stop();\n});\n\nInteraction.signals.on('action-move', autoScroll.onInteractionMove);\n\ndefaultOptions.perAction.autoScroll = autoScroll.defaults;\n\nmodule.exports = autoScroll;\n","const Interactable = require('../Interactable');\nconst actions = require('../actions/base');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.ignoreFrom\n [ method ]\n *\n * If the target of the `mousedown`, `pointerdown` or `touchstart`\n * event or any of it's parents match the given CSS selector or\n * Element, no drag/resize/gesture is started.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to not ignore any elements\n = (string | Element | object) The current ignoreFrom value or this Interactable\n **\n | interact(element, { ignoreFrom: document.getElementById('no-action') });\n | // or\n | interact(element).ignoreFrom('input, textarea, a');\n\\*/\nInteractable.prototype.ignoreFrom = function (newValue) {\n return this._backCompatOption('ignoreFrom', newValue);\n};\n\n/*\\\n * Interactable.allowFrom\n [ method ]\n *\n * A drag/resize/gesture is started only If the target of the\n * `mousedown`, `pointerdown` or `touchstart` event or any of it's\n * parents match the given CSS selector or Element.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to allow from any element\n = (string | Element | object) The current allowFrom value or this Interactable\n **\n | interact(element, { allowFrom: document.getElementById('drag-handle') });\n | // or\n | interact(element).allowFrom('.handle');\n\\*/\nInteractable.prototype.allowFrom = function (newValue) {\n return this._backCompatOption('allowFrom', newValue);\n};\n\nInteractable.prototype.testIgnore = function (ignoreFrom, interactableElement, element) {\n if (!ignoreFrom || !is.element(element)) { return false; }\n\n if (is.string(ignoreFrom)) {\n return domUtils.matchesUpTo(element, ignoreFrom, interactableElement);\n }\n else if (is.element(ignoreFrom)) {\n return domUtils.nodeContains(ignoreFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testAllow = function (allowFrom, interactableElement, element) {\n if (!allowFrom) { return true; }\n\n if (!is.element(element)) { return false; }\n\n if (is.string(allowFrom)) {\n return domUtils.matchesUpTo(element, allowFrom, interactableElement);\n }\n else if (is.element(allowFrom)) {\n return domUtils.nodeContains(allowFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testIgnoreAllow = function (options, interactableElement, eventTarget) {\n return (!this.testIgnore(options.ignoreFrom, interactableElement, eventTarget)\n && this.testAllow(options.allowFrom, interactableElement, eventTarget));\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (event.buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\n","const interact = require('../interact');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst actions = require('../actions/base');\nconst defaultOptions = require('../defaultOptions');\nconst browser = require('../utils/browser');\nconst scope = require('../scope');\nconst utils = require('../utils');\nconst signals = require('../utils/Signals').new();\n\nrequire('./InteractableMethods');\n\nconst autoStart = {\n signals,\n withinInteractionLimit,\n // Allow this many interactions to happen simultaneously\n maxInteractions: Infinity,\n defaults: {\n perAction: {\n manualStart: false,\n max: Infinity,\n maxPerElement: 1,\n allowFrom: null,\n ignoreFrom: null,\n },\n },\n setActionDefaults: function (action) {\n utils.extend(action.defaults, autoStart.defaults.perAction);\n },\n};\n\n// set cursor style on mousedown\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget }) {\n if (interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\n// set cursor style on mousemove\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget }) {\n if (!interaction.mouse\n || interaction.pointerIsDown\n || interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\nInteraction.signals.on('move', function (arg) {\n const { interaction, event } = arg;\n\n if (!interaction.pointerIsDown\n || interaction.interacting()\n || !interaction.pointerWasMoved\n || !interaction.prepared.name) {\n return;\n }\n\n signals.fire('before-start', arg);\n\n const target = interaction.target;\n\n if (interaction.prepared.name && target) {\n // check manualStart and interaction limit\n if (target.options[interaction.prepared.name].manualStart\n || !withinInteractionLimit(target, interaction.element, interaction.prepared)) {\n interaction.stop(event);\n }\n else {\n interaction.start(interaction.prepared, target, interaction.element);\n }\n }\n});\n\n// Check if the current target supports the action.\n// If so, return the validated action. Otherwise, return null\nfunction validateAction (action, interactable, element, eventTarget) {\n if (utils.is.object(action)\n && interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget)\n && interactable.options[action.name].enabled\n && withinInteractionLimit(interactable, element, action)) {\n return action;\n }\n\n return null;\n}\n\nfunction validateSelector (interaction, pointer, event, matches, matchElements, eventTarget) {\n for (let i = 0, len = matches.length; i < len; i++) {\n const match = matches[i];\n const matchElement = matchElements[i];\n const action = validateAction(match.getAction(pointer, event, interaction, matchElement),\n match,\n matchElement,\n eventTarget);\n\n if (action) {\n return {\n action,\n target: match,\n element: matchElement,\n };\n }\n }\n\n return {};\n}\n\nfunction getActionInfo (interaction, pointer, event, eventTarget) {\n let matches = [];\n let matchElements = [];\n\n let element = eventTarget;\n let action = null;\n\n function pushMatches (interactable, selector, context) {\n const elements = (browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined);\n\n if (utils.matchesSelector(element, selector, elements)) {\n\n matches.push(interactable);\n matchElements.push(element);\n }\n }\n\n while (utils.is.element(element)) {\n matches = [];\n matchElements = [];\n\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && (action = validateAction(elementInteractable.getAction(pointer, event, interaction, element, eventTarget),\n elementInteractable,\n element,\n eventTarget))\n && !elementInteractable.options[action.name].manualStart) {\n return {\n element,\n action,\n target: elementInteractable,\n };\n }\n else {\n scope.interactables.forEachSelector(pushMatches, element);\n\n const actionInfo = validateSelector(interaction, pointer, event, matches, matchElements, eventTarget);\n\n if (actionInfo.action\n && !actionInfo.target.options[actionInfo.action.name].manualStart) {\n return actionInfo;\n }\n }\n\n element = utils.parentNode(element);\n }\n\n return {};\n}\n\nfunction prepare (interaction, { action, target, element }) {\n action = action || {};\n\n if (interaction.target && interaction.target.options.styleCursor) {\n interaction.target._doc.documentElement.style.cursor = '';\n }\n\n interaction.target = target;\n interaction.element = element;\n utils.copyAction(interaction.prepared, action);\n\n if (target && target.options.styleCursor) {\n const cursor = action? actions[action.name].getCursor(action) : '';\n interaction.target._doc.documentElement.style.cursor = cursor;\n }\n\n signals.fire('prepared', { interaction: interaction });\n}\n\nInteraction.signals.on('stop', function ({ interaction }) {\n const target = interaction.target;\n\n if (target && target.options.styleCursor) {\n target._doc.documentElement.style.cursor = '';\n }\n});\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (utils.is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (utils.is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n const buttons = event.buttons || ({\n 0: 1,\n 1: 4,\n 3: 8,\n 4: 16,\n })[event.button];\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\nfunction withinInteractionLimit (interactable, element, action) {\n const options = interactable.options;\n const maxActions = options[action.name].max;\n const maxPerElement = options[action.name].maxPerElement;\n let activeInteractions = 0;\n let targetCount = 0;\n let targetElementCount = 0;\n\n // no actions if any of these values == 0\n if (!(maxActions && maxPerElement && autoStart.maxInteractions)) { return; }\n\n for (let i = 0, len = scope.interactions.length; i < len; i++) {\n const interaction = scope.interactions[i];\n const otherAction = interaction.prepared.name;\n\n if (!interaction.interacting()) { continue; }\n\n activeInteractions++;\n\n if (activeInteractions >= autoStart.maxInteractions) {\n return false;\n }\n\n if (interaction.target !== interactable) { continue; }\n\n targetCount += (otherAction === action.name)|0;\n\n if (targetCount >= maxActions) {\n return false;\n }\n\n if (interaction.element === element) {\n targetElementCount++;\n\n if (otherAction !== action.name || targetElementCount >= maxPerElement) {\n return false;\n }\n }\n }\n\n return autoStart.maxInteractions > 0;\n}\n\n/*\\\n * interact.maxInteractions\n [ method ]\n **\n * Returns or sets the maximum number of concurrent interactions allowed.\n * By default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables\n * and elements, you need to enable it in the draggable, resizable and\n * gesturable `'max'` and `'maxPerElement'` options.\n **\n - newValue (number) #optional Any number. newValue <= 0 means no interactions.\n\\*/\ninteract.maxInteractions = function (newValue) {\n if (utils.is.number(newValue)) {\n autoStart.maxInteractions = newValue;\n\n return this;\n }\n\n return autoStart.maxInteractions;\n};\n\nInteractable.settingsMethods.push('styleCursor');\nInteractable.settingsMethods.push('actionChecker');\nInteractable.settingsMethods.push('ignoreFrom');\nInteractable.settingsMethods.push('allowFrom');\n\ndefaultOptions.base.actionChecker = null;\ndefaultOptions.base.styleCursor = true;\n\nutils.extend(defaultOptions.perAction, autoStart.defaults.perAction);\n\nmodule.exports = autoStart;\n","const autoStart = require('./base');\nconst Interaction = require('../Interaction');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.delayTimer = null;\n});\n\nautoStart.signals.on('prepared', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.delayTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.target, interaction.element);\n }, delay);\n }\n});\n\nInteraction.signals.on('move', function ({ interaction, duplicate }) {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.delayTimer);\n }\n});\n\n// prevent regular down->move autoStart\nautoStart.signals.on('before-start', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.prepared.name = null;\n }\n});\n","const autoStart = require('./base');\nconst scope = require('../scope');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\n\nconst { matchesSelector, parentNode } = require('../utils/domUtils');\n\nautoStart.setActionDefaults(require('../actions/drag'));\n\nautoStart.signals.on('before-start', function ({ interaction, eventTarget, dx, dy }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // check if a drag is in the correct axis\n const absX = Math.abs(dx);\n const absY = Math.abs(dy);\n const options = interaction.target.options.drag;\n const startAxis = options.startAxis;\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy');\n\n interaction.prepared.axis = options.lockAxis === 'start'\n ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n : options.lockAxis;\n\n // if the movement isn't in the startAxis of the interactable\n if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) {\n // cancel the prepared action\n interaction.prepared.name = null;\n\n // then try to get a drag from another ineractable\n\n if (!interaction.prepared.name) {\n\n let element = eventTarget;\n\n const getDraggable = function (interactable, selector, context) {\n const elements = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n if (interactable === interaction.target) { return; }\n\n if (!options.manualStart\n && !interactable.testIgnoreAllow(options, element, eventTarget)\n && matchesSelector(element, selector, elements)) {\n\n const action = interactable.getAction(interaction.downPointer,\n interaction.downEvent,\n interaction,\n element);\n\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, interactable)\n && autoStart.validateAction(action, interactable, element, eventTarget)) {\n\n return interactable;\n }\n }\n };\n\n let action = null;\n\n // check all interactables\n while (is.element(element)) {\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && elementInteractable !== interaction.target\n && !elementInteractable.options.drag.manualStart) {\n\n action = elementInteractable.getAction(interaction.downPointer, interaction.downEvent, interaction, element);\n }\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, elementInteractable)) {\n\n interaction.prepared.name = 'drag';\n interaction.target = elementInteractable;\n interaction.element = element;\n break;\n }\n\n const selectorInteractable = scope.interactables.forEachSelector(getDraggable, element);\n\n if (selectorInteractable) {\n interaction.prepared.name = 'drag';\n interaction.target = selectorInteractable;\n interaction.element = element;\n break;\n }\n\n element = parentNode(element);\n }\n }\n }\n});\n\nfunction checkStartAxis (startAxis, interactable) {\n if (!interactable) { return false; }\n\n const thisAxis = interactable.options.drag.startAxis;\n\n return (startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis);\n}\n","require('./base').setActionDefaults(require('../actions/gesture'));\n","require('./base').setActionDefaults(require('../actions/resize'));\n","module.exports = {\n base: {\n accept : null,\n preventDefault: 'auto',\n deltaSource : 'page',\n },\n\n perAction: {\n origin: { x: 0, y: 0 },\n\n // only allow left button by default\n // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n mouseButtons: 1,\n\n inertia: {\n enabled : false,\n resistance : 10, // the lambda in exponential decay\n minSpeed : 100, // target speed must be above this for inertia to start\n endSpeed : 10, // the speed at which inertia is slow enough to stop\n allowResume : true, // allow resuming an action in inertia phase\n smoothEndDuration: 300, // animate to snap/restrict endOnly if there's no inertia\n },\n },\n};\n","/* browser entry point */\n\n// Legacy browser support\nrequire('./legacyBrowsers');\n\n// inertia\nrequire('./inertia');\n\n// modifiers\nrequire('./modifiers/snap');\nrequire('./modifiers/restrict');\n\n// pointerEvents\nrequire('./pointerEvents/base');\nrequire('./pointerEvents/holdRepeat');\nrequire('./pointerEvents/interactableTargets');\n\n// delay\nrequire('./autoStart/delay');\n\n// actions\nrequire('./actions/gesture');\nrequire('./actions/resize');\nrequire('./actions/drag');\nrequire('./actions/drop');\n\n// load these modifiers after resize is loaded\nrequire('./modifiers/snapSize');\nrequire('./modifiers/restrictEdges');\nrequire('./modifiers/restrictSize');\n\n// autoStart actions\nrequire('./autoStart/gesture');\nrequire('./autoStart/resize');\nrequire('./autoStart/drag');\n\n// Interactable preventDefault setting\nrequire('./interactablePreventDefault.js');\n\n// autoScroll\nrequire('./autoScroll');\n\n// export interact\nmodule.exports = require('./interact');\n","const InteractEvent = require('./InteractEvent');\nconst Interaction = require('./Interaction');\nconst modifiers = require('./modifiers');\nconst utils = require('./utils');\nconst animationFrame = require('./utils/raf');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.inertiaStatus = {\n active : false,\n smoothEnd : false,\n allowResume: false,\n\n startEvent: null,\n upCoords : {},\n\n xe: 0, ye: 0,\n sx: 0, sy: 0,\n\n t0: 0,\n vx0: 0, vys: 0,\n duration: 0,\n\n lambda_v0: 0,\n one_ve_v0: 0,\n i : null,\n };\n\n interaction.boundInertiaFrame = () => inertiaFrame .apply(interaction);\n interaction.boundSmoothEndFrame = () => smoothEndFrame.apply(interaction);\n});\n\nInteraction.signals.on('down', function ({ interaction, event, pointer, eventTarget }) {\n const status = interaction.inertiaStatus;\n\n // Check if the down event hits the current inertia target\n if (status.active) {\n let element = eventTarget;\n\n // climb up the DOM tree from the event target\n while (utils.is.element(element)) {\n\n // if interaction element is the current inertia target element\n if (element === interaction.element) {\n // stop inertia\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n\n // update pointers to the down event's coordinates\n interaction.updatePointer(pointer);\n utils.setCoords(interaction.curCoords, interaction.pointers);\n\n // fire appropriate signals\n const signalArg = { interaction };\n Interaction.signals.fire('before-action-move', signalArg);\n Interaction.signals.fire('action-resume' , signalArg);\n\n // fire a reume event\n const resumeEvent = new InteractEvent(interaction,\n event,\n interaction.prepared.name,\n 'inertiaresume',\n interaction.element);\n\n interaction.target.fire(resumeEvent);\n interaction.prevEvent = resumeEvent;\n modifiers.resetStatuses(interaction.modifierStatuses);\n\n utils.copyCoords(interaction.prevCoords, interaction.curCoords);\n break;\n }\n\n element = utils.parentNode(element);\n }\n }\n});\n\nInteraction.signals.on('up', function ({ interaction, event }) {\n const status = interaction.inertiaStatus;\n\n if (!interaction.interacting() || status.active) { return; }\n\n const target = interaction.target;\n const options = target && target.options;\n const inertiaOptions = options && interaction.prepared.name && options[interaction.prepared.name].inertia;\n\n const now = new Date().getTime();\n const statuses = {};\n const page = utils.extend({}, interaction.curCoords.page);\n const pointerSpeed = interaction.pointerDelta.client.speed;\n\n let smoothEnd = false;\n let modifierResult;\n\n // check if inertia should be started\n const inertiaPossible = (inertiaOptions && inertiaOptions.enabled\n && interaction.prepared.name !== 'gesture'\n && event !== status.startEvent);\n\n const inertia = (inertiaPossible\n && (now - interaction.curCoords.timeStamp) < 50\n && pointerSpeed > inertiaOptions.minSpeed\n && pointerSpeed > inertiaOptions.endSpeed);\n\n const modifierArg = {\n interaction,\n pageCoords: page,\n statuses,\n preEnd: true,\n requireEndOnly: true,\n };\n\n // smoothEnd\n if (inertiaPossible && !inertia) {\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n if (modifierResult.shouldMove && modifierResult.locked) {\n smoothEnd = true;\n }\n }\n\n if (!(inertia || smoothEnd)) { return; }\n\n utils.copyCoords(status.upCoords, interaction.curCoords);\n\n interaction.pointers[0] = status.startEvent =\n new InteractEvent(interaction, event, interaction.prepared.name, 'inertiastart', interaction.element);\n\n status.t0 = now;\n\n status.active = true;\n status.allowResume = inertiaOptions.allowResume;\n interaction.simulation = status;\n\n target.fire(status.startEvent);\n\n if (inertia) {\n status.vx0 = interaction.pointerDelta.client.vx;\n status.vy0 = interaction.pointerDelta.client.vy;\n status.v0 = pointerSpeed;\n\n calcInertia(interaction, status);\n\n utils.extend(page, interaction.curCoords.page);\n\n page.x += status.xe;\n page.y += status.ye;\n\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n status.modifiedXe += modifierResult.dx;\n status.modifiedYe += modifierResult.dy;\n\n status.i = animationFrame.request(interaction.boundInertiaFrame);\n }\n else {\n status.smoothEnd = true;\n status.xe = modifierResult.dx;\n status.ye = modifierResult.dy;\n\n status.sx = status.sy = 0;\n\n status.i = animationFrame.request(interaction.boundSmoothEndFrame);\n }\n});\n\nInteraction.signals.on('stop-active', function ({ interaction }) {\n const status = interaction.inertiaStatus;\n\n if (status.active) {\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n }\n});\n\nfunction calcInertia (interaction, status) {\n const inertiaOptions = interaction.target.options[interaction.prepared.name].inertia;\n const lambda = inertiaOptions.resistance;\n const inertiaDur = -Math.log(inertiaOptions.endSpeed / status.v0) / lambda;\n\n status.x0 = interaction.prevEvent.pageX;\n status.y0 = interaction.prevEvent.pageY;\n status.t0 = status.startEvent.timeStamp / 1000;\n status.sx = status.sy = 0;\n\n status.modifiedXe = status.xe = (status.vx0 - inertiaDur) / lambda;\n status.modifiedYe = status.ye = (status.vy0 - inertiaDur) / lambda;\n status.te = inertiaDur;\n\n status.lambda_v0 = lambda / status.v0;\n status.one_ve_v0 = 1 - inertiaOptions.endSpeed / status.v0;\n}\n\nfunction inertiaFrame () {\n updateInertiaCoords(this);\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n\n const status = this.inertiaStatus;\n const options = this.target.options[this.prepared.name].inertia;\n const lambda = options.resistance;\n const t = new Date().getTime() / 1000 - status.t0;\n\n if (t < status.te) {\n\n const progress = 1 - (Math.exp(-lambda * t) - status.lambda_v0) / status.one_ve_v0;\n\n if (status.modifiedXe === status.xe && status.modifiedYe === status.ye) {\n status.sx = status.xe * progress;\n status.sy = status.ye * progress;\n }\n else {\n const quadPoint = utils.getQuadraticCurvePoint(0, 0,\n status.xe,\n status.ye,\n status.modifiedXe,\n status.modifiedYe,\n progress);\n\n status.sx = quadPoint.x;\n status.sy = quadPoint.y;\n }\n\n this.doMove();\n\n status.i = animationFrame.request(this.boundInertiaFrame);\n }\n else {\n status.sx = status.modifiedXe;\n status.sy = status.modifiedYe;\n\n this.doMove();\n this.end(status.startEvent);\n status.active = false;\n this.simulation = null;\n }\n\n utils.copyCoords(this.prevCoords, this.curCoords);\n}\n\nfunction smoothEndFrame () {\n updateInertiaCoords(this);\n\n const status = this.inertiaStatus;\n const t = new Date().getTime() - status.t0;\n const duration = this.target.options[this.prepared.name].inertia.smoothEndDuration;\n\n if (t < duration) {\n status.sx = utils.easeOutQuad(t, 0, status.xe, duration);\n status.sy = utils.easeOutQuad(t, 0, status.ye, duration);\n\n this.pointerMove(status.startEvent, status.startEvent);\n\n status.i = animationFrame.request(this.boundSmoothEndFrame);\n }\n else {\n status.sx = status.xe;\n status.sy = status.ye;\n\n this.pointerMove(status.startEvent, status.startEvent);\n this.end(status.startEvent);\n\n status.smoothEnd =\n status.active = false;\n this.simulation = null;\n }\n}\n\nfunction updateInertiaCoords (interaction) {\n const status = interaction.inertiaStatus;\n\n // return if inertia isn't running\n if (!status.active) { return; }\n\n const pageUp = status.upCoords.page;\n const clientUp = status.upCoords.client;\n\n utils.setCoords(interaction.curCoords, [ {\n pageX : pageUp.x + status.sx,\n pageY : pageUp.y + status.sy,\n clientX: clientUp.x + status.sx,\n clientY: clientUp.y + status.sy,\n } ]);\n}\n","const browser = require('./utils/browser');\nconst events = require('./utils/events');\nconst utils = require('./utils');\nconst scope = require('./scope');\nconst Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\n\nconst globalEvents = {};\n\n/*\\\n * interact\n [ method ]\n *\n * The methods of this variable can be used to set elements as\n * interactables and also to change various default settings.\n *\n * Calling it as a function and passing an element or a valid CSS selector\n * string returns an Interactable object which has various methods to\n * configure it.\n *\n - element (Element | string) The HTML or SVG Element to interact with or CSS selector\n = (object) An @Interactable\n *\n > Usage\n | interact('#draggable').draggable(true);\n |\n | var rectables = interact('rect');\n | rectables\n | .gesturable(true)\n | .on('gesturemove', function (event) {\n | // ...\n | });\n\\*/\nfunction interact (element, options) {\n let interactable = scope.interactables.get(element, options);\n\n if (!interactable) {\n interactable = new Interactable(element, options);\n interactable.events.global = globalEvents;\n }\n\n return interactable;\n}\n\n/*\\\n * interact.isSet\n [ method ]\n *\n * Check if an element has been set\n - element (Element) The Element being searched for\n = (boolean) Indicates if the element or CSS selector was previously passed to interact\n\\*/\ninteract.isSet = function (element, options) {\n return scope.interactables.indexOfElement(element, options && options.context) !== -1;\n};\n\n/*\\\n * interact.on\n [ method ]\n *\n * Adds a global listener for an InteractEvent or adds a DOM event to\n * `document`\n *\n - type (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) interact\n\\*/\ninteract.on = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.on(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.on(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n // if it is an InteractEvent type, add listener to globalEvents\n if (utils.contains(Interactable.eventTypes, type)) {\n // if this type of event was never bound\n if (!globalEvents[type]) {\n globalEvents[type] = [listener];\n }\n else {\n globalEvents[type].push(listener);\n }\n }\n // If non InteractEvent type, addEventListener to document\n else {\n events.add(scope.document, type, listener, { options });\n }\n\n return interact;\n};\n\n/*\\\n * interact.off\n [ method ]\n *\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n - type (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) interact\n \\*/\ninteract.off = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.off(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.off(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n if (!utils.contains(Interactable.eventTypes, type)) {\n events.remove(scope.document, type, listener, options);\n }\n else {\n let index;\n\n if (type in globalEvents\n && (index = utils.indexOf(globalEvents[type], listener)) !== -1) {\n globalEvents[type].splice(index, 1);\n }\n }\n\n return interact;\n};\n\n/*\\\n * interact.debug\n [ method ]\n *\n * Returns an object which exposes internal data\n = (object) An object with properties that outline the current state and expose internal functions and variables\n\\*/\ninteract.debug = function () {\n return scope;\n};\n\n// expose the functions used to calculate multi-touch properties\ninteract.getPointerAverage = utils.pointerAverage;\ninteract.getTouchBBox = utils.touchBBox;\ninteract.getTouchDistance = utils.touchDistance;\ninteract.getTouchAngle = utils.touchAngle;\n\ninteract.getElementRect = utils.getElementRect;\ninteract.getElementClientRect = utils.getElementClientRect;\ninteract.matchesSelector = utils.matchesSelector;\ninteract.closest = utils.closest;\n\n/*\\\n * interact.supportsTouch\n [ method ]\n *\n = (boolean) Whether or not the browser supports touch input\n\\*/\ninteract.supportsTouch = function () {\n return browser.supportsTouch;\n};\n\n/*\\\n * interact.supportsPointerEvent\n [ method ]\n *\n = (boolean) Whether or not the browser supports PointerEvents\n\\*/\ninteract.supportsPointerEvent = function () {\n return browser.supportsPointerEvent;\n};\n\n/*\\\n * interact.stop\n [ method ]\n *\n * Cancels all interactions (end events are not fired)\n *\n - event (Event) An event on which to call preventDefault()\n = (object) interact\n\\*/\ninteract.stop = function (event) {\n for (let i = scope.interactions.length - 1; i >= 0; i--) {\n scope.interactions[i].stop(event);\n }\n\n return interact;\n};\n\n/*\\\n * interact.pointerMoveTolerance\n [ method ]\n * Returns or sets the distance the pointer must be moved before an action\n * sequence occurs. This also affects tolerance for tap events.\n *\n - newValue (number) #optional The movement from the start position must be greater than this value\n = (number | Interactable) The current setting or interact\n\\*/\ninteract.pointerMoveTolerance = function (newValue) {\n if (utils.is.number(newValue)) {\n Interaction.pointerMoveTolerance = newValue;\n\n return this;\n }\n\n return Interaction.pointerMoveTolerance;\n};\n\ninteract.addDocument = scope.addDocument;\ninteract.removeDocument = scope.removeDocument;\n\nscope.interact = interact;\n\nmodule.exports = interact;\n","const Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\nconst scope = require('./scope');\nconst is = require('./utils/is');\nconst events = require('./utils/events');\n\nconst { nodeContains, matchesSelector } = require('./utils/domUtils');\n\n/*\\\n * Interactable.preventDefault\n [ method ]\n *\n * Returns or sets whether to prevent the browser's default behaviour\n * in response to pointer events. Can be set to:\n * - `'always'` to always prevent\n * - `'never'` to never prevent\n * - `'auto'` to let interact.js try to determine what would be best\n *\n - newValue (string) #optional `true`, `false` or `'auto'`\n = (string | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.preventDefault = function (newValue) {\n if (/^(always|never|auto)$/.test(newValue)) {\n this.options.preventDefault = newValue;\n return this;\n }\n\n if (is.bool(newValue)) {\n this.options.preventDefault = newValue? 'always' : 'never';\n return this;\n }\n\n return this.options.preventDefault;\n};\n\nInteractable.prototype.checkAndPreventDefault = function (event) {\n const setting = this.options.preventDefault;\n\n if (setting === 'never') { return; }\n\n if (setting === 'always') {\n event.preventDefault();\n return;\n }\n\n // setting === 'auto'\n\n // don't preventDefault if the browser supports passiveEvents\n // CSS touch-action and user-selecct should be used instead\n if (events.supportsOptions) {\n return;\n }\n\n // don't preventDefault of pointerdown events\n if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) {\n return;\n }\n\n // don't preventDefault on editable elements\n if (is.element(event.target)\n && matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) {\n return;\n }\n\n event.preventDefault();\n};\n\nfunction onInteractionEvent ({ interaction, event }) {\n if (interaction.target) {\n interaction.target.checkAndPreventDefault(event);\n }\n}\n\nfor (const eventSignal of ['down', 'move', 'up', 'cancel']) {\n Interaction.signals.on(eventSignal, onInteractionEvent);\n}\n\n// prevent native HTML5 drag on interact.js target elements\nInteraction.docEvents.dragstart = function preventNativeDrag (event) {\n for (const interaction of scope.interactions) {\n\n if (interaction.element\n && (interaction.element === event.target\n || nodeContains(interaction.element, event.target))) {\n\n interaction.target.checkAndPreventDefault(event);\n return;\n }\n }\n};\n","const scope = require('./scope');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst iFinder = require('./utils/interactionFinder');\nconst pointerEvents = require('./pointerEvents/base');\n\nconst { window } = require('./utils/window');\n\nconst toString = Object.prototype.toString;\n\nif (!window.Array.isArray) {\n window.Array.isArray = function (obj) {\n return toString.call(obj) === '[object Array]';\n };\n}\n\nif (!String.prototype.trim) {\n String.prototype.trim = function () {\n return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n };\n}\n\n// http://www.quirksmode.org/dom/events/click.html\n// >Events leading to dblclick\n//\n// IE8 doesn't fire down event before dblclick.\n// This workaround tries to fire a tap and doubletap after dblclick\nfunction onIE8Dblclick (event) {\n const eventTarget = event.target;\n const interaction = iFinder.search(event, event.type, eventTarget);\n\n if (!interaction) { return; }\n\n if (interaction.prevTap\n && event.clientX === interaction.prevTap.clientX\n && event.clientY === interaction.prevTap.clientY\n && eventTarget === interaction.prevTap.target) {\n\n interaction.downTargets[0] = eventTarget;\n interaction.downTimes [0] = new Date().getTime();\n\n pointerEvents.fire({\n interaction,\n event,\n eventTarget,\n pointer: event,\n type: 'tap',\n });\n }\n}\n\nif (browser.isIE8) {\n const selectFix = function (event) {\n for (const interaction of scope.interactions) {\n if (interaction.interacting()) {\n interaction.target.checkAndPreventDefault(event);\n }\n }\n };\n\n const onDocIE8 = function onDocIE8 ({ doc, win }, signalName) {\n const eventMethod = signalName.indexOf('listen') === 0\n ? events.add : events.remove;\n\n // For IE's lack of Event#preventDefault\n eventMethod(doc, 'selectstart', selectFix);\n\n if (pointerEvents) {\n eventMethod(doc, 'dblclick', onIE8Dblclick);\n }\n };\n\n scope.signals.on('add-document' , onDocIE8);\n scope.signals.on('remove-document', onDocIE8);\n}\n\nmodule.exports = null;\n","const InteractEvent = require('../InteractEvent');\nconst Interaction = require('../Interaction');\nconst extend = require('../utils/extend');\n\nconst modifiers = {\n names: [],\n\n setOffsets: function (arg) {\n const { interaction, pageCoords: page } = arg;\n const { target, element, startOffset } = interaction;\n const rect = target.getRect(element);\n\n if (rect) {\n startOffset.left = page.x - rect.left;\n startOffset.top = page.y - rect.top;\n\n startOffset.right = rect.right - page.x;\n startOffset.bottom = rect.bottom - page.y;\n\n if (!('width' in rect)) { rect.width = rect.right - rect.left; }\n if (!('height' in rect)) { rect.height = rect.bottom - rect.top ; }\n }\n else {\n startOffset.left = startOffset.top = startOffset.right = startOffset.bottom = 0;\n }\n\n arg.rect = rect;\n arg.interactable = target;\n arg.element = element;\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n\n arg.options = target.options[interaction.prepared.name][modifierName];\n\n if (!arg.options) {\n continue;\n }\n\n interaction.modifierOffsets[modifierName] = modifiers[modifierName].setOffset(arg);\n }\n },\n\n setAll: function (arg) {\n const { interaction, statuses, preEnd, requireEndOnly } = arg;\n const coords = extend({}, arg.pageCoords);\n const result = {\n dx: 0,\n dy: 0,\n changed: false,\n locked: false,\n shouldMove: true,\n };\n\n for (const modifierName of modifiers.names) {\n const modifier = modifiers[modifierName];\n const options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!shouldDo(options, preEnd, requireEndOnly)) { continue; }\n\n arg.status = arg.status = statuses[modifierName];\n arg.options = options;\n arg.offset = arg.interaction.modifierOffsets[modifierName];\n\n modifier.set(arg);\n\n if (arg.status.locked) {\n coords.x += arg.status.dx;\n coords.y += arg.status.dy;\n\n result.dx += arg.status.dx;\n result.dy += arg.status.dy;\n\n result.locked = true;\n }\n }\n\n // a move should be fired if:\n // - there are no modifiers enabled,\n // - no modifiers are \"locked\" i.e. have changed the pointer's coordinates, or\n // - the locked coords have changed since the last pointer move\n result.shouldMove = !arg.status || !result.locked || arg.status.changed;\n\n return result;\n },\n\n resetStatuses: function (statuses) {\n for (const modifierName of modifiers.names) {\n const status = statuses[modifierName] || {};\n\n status.dx = status.dy = 0;\n status.modifiedX = status.modifiedY = NaN;\n status.locked = false;\n status.changed = true;\n\n statuses[modifierName] = status;\n }\n\n return statuses;\n },\n\n start: function ({ interaction }, signalName) {\n const arg = {\n interaction,\n pageCoords: (signalName === 'action-resume' ?\n interaction.curCoords : interaction.startCoords).page,\n startOffset: interaction.startOffset,\n statuses: interaction.modifierStatuses,\n preEnd: false,\n requireEndOnly: false,\n };\n\n modifiers.setOffsets(arg);\n modifiers.resetStatuses(arg.statuses);\n\n arg.pageCoords = extend({}, interaction.startCoords.page);\n interaction.modifierResult = modifiers.setAll(arg);\n },\n};\n\nInteraction.signals.on('new', function (interaction) {\n interaction.startOffset = { left: 0, right: 0, top: 0, bottom: 0 };\n interaction.modifierOffsets = {};\n interaction.modifierStatuses = modifiers.resetStatuses({});\n interaction.modifierResult = null;\n});\n\nInteraction.signals.on('action-start' , modifiers.start);\nInteraction.signals.on('action-resume', modifiers.start);\n\nInteraction.signals.on('before-action-move', function ({ interaction, preEnd, interactingBeforeMove }) {\n const modifierResult = modifiers.setAll({\n interaction,\n preEnd,\n pageCoords: interaction.curCoords.page,\n statuses: interaction.modifierStatuses,\n requireEndOnly: false,\n });\n\n // don't fire an action move if a modifier would keep the event in the same\n // cordinates as before\n if (!modifierResult.shouldMove && interactingBeforeMove) {\n interaction._dontFireMove = true;\n }\n\n interaction.modifierResult = modifierResult;\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n for (let i = 0; i < modifiers.names.length; i++) {\n const options = interaction.target.options[interaction.prepared.name][modifiers.names[i]];\n\n // if the endOnly option is true for any modifier\n if (shouldDo(options, true, true)) {\n // fire a move event at the modified coordinates\n interaction.doMove({ event, preEnd: true });\n break;\n }\n }\n});\n\nInteractEvent.signals.on('set-xy', function (arg) {\n const { iEvent, interaction } = arg;\n const modifierArg = extend({}, arg);\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n modifierArg.options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!modifierArg.options) {\n continue;\n }\n\n const modifier = modifiers[modifierName];\n\n modifierArg.status = interaction.modifierStatuses[modifierName];\n\n iEvent[modifierName] = modifier.modifyCoords(modifierArg);\n }\n});\n\nfunction shouldDo (options, preEnd, requireEndOnly) {\n return (options && options.enabled\n && (preEnd || !options.endOnly)\n && (!requireEndOnly || options.endOnly));\n}\n\nmodule.exports = modifiers;\n","const modifiers = require('./index');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst restrict = {\n defaults: {\n enabled : false,\n endOnly : false,\n restriction: null,\n elementRect: null,\n },\n\n setOffset: function ({ rect, startOffset, options }) {\n const elementRect = options && options.elementRect;\n const offset = {};\n\n if (rect && elementRect) {\n offset.left = startOffset.left - (rect.width * elementRect.left);\n offset.top = startOffset.top - (rect.height * elementRect.top);\n\n offset.right = startOffset.right - (rect.width * (1 - elementRect.right));\n offset.bottom = startOffset.bottom - (rect.height * (1 - elementRect.bottom));\n }\n else {\n offset.left = offset.top = offset.right = offset.bottom = 0;\n }\n\n return offset;\n },\n\n set: function ({ pageCoords, interaction, status, options }) {\n if (!options) { return status; }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n\n const restriction = getRestrictionRect(options.restriction, interaction, page);\n\n if (!restriction) { return status; }\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n const rect = restriction;\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n const offset = interaction.modifierOffsets.restrict;\n\n // object is assumed to have\n // x, y, width, height or\n // left, top, right, bottom\n if ('x' in restriction && 'y' in restriction) {\n modifiedX = Math.max(Math.min(rect.x + rect.width - offset.right , page.x), rect.x + offset.left);\n modifiedY = Math.max(Math.min(rect.y + rect.height - offset.bottom, page.y), rect.y + offset.top );\n }\n else {\n modifiedX = Math.max(Math.min(rect.right - offset.right , page.x), rect.left + offset.left);\n modifiedY = Math.max(Math.min(rect.bottom - offset.bottom, page.y), rect.top + offset.top );\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const elementRect = options && options.elementRect;\n\n if (options && options.enabled\n && !(phase === 'start' && elementRect && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n getRestrictionRect,\n};\n\nfunction getRestrictionRect (value, interaction, page) {\n if (utils.is.function(value)) {\n return utils.resolveRectLike(value, interaction.target, interaction.element, [page.x, page.y, interaction]);\n } else {\n return utils.resolveRectLike(value, interaction.target, interaction.element);\n }\n}\n\nmodifiers.restrict = restrict;\nmodifiers.names.push('restrict');\n\ndefaultOptions.perAction.restrict = restrict.defaults;\n\nmodule.exports = restrict;\n","// This module adds the options.resize.restrictEdges setting which sets min and\n// max for the top, left, bottom and right edges of the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictEdges: {\n// inner: { top: 200, left: 200, right: 400, bottom: 400 },\n// outer: { top: 0, left: 0, right: 600, bottom: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst { getRestrictionRect } = require('./restrict');\n\nconst noInner = { top: +Infinity, left: +Infinity, bottom: -Infinity, right: -Infinity };\nconst noOuter = { top: -Infinity, left: -Infinity, bottom: +Infinity, right: +Infinity };\n\nconst restrictEdges = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n offset: null,\n },\n\n setOffset: function ({ interaction, startOffset, options }) {\n if (!options) {\n return utils.extend({}, startOffset);\n }\n\n const offset = getRestrictionRect(options.offset, interaction, interaction.startCoords.page);\n\n if (offset) {\n return {\n top: startOffset.top + offset.y,\n left: startOffset.left + offset.x,\n bottom: startOffset.bottom + offset.y,\n right: startOffset.right + offset.x,\n };\n }\n\n return startOffset;\n },\n\n set: function ({ pageCoords, interaction, status, offset, options }) {\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n const inner = rectUtils.xywhToTlbr(getRestrictionRect(options.inner, interaction, page)) || noInner;\n const outer = rectUtils.xywhToTlbr(getRestrictionRect(options.outer, interaction, page)) || noOuter;\n\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n if (edges.top) {\n modifiedY = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top);\n }\n else if (edges.bottom) {\n modifiedY = Math.max(Math.min(outer.bottom - offset.bottom, page.y), inner.bottom - offset.bottom);\n }\n if (edges.left) {\n modifiedX = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left);\n }\n else if (edges.right) {\n modifiedX = Math.max(Math.min(outer.right - offset.right, page.x), inner.right - offset.right);\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n if (options && options.enabled\n && !(phase === 'start' && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n noInner,\n noOuter,\n getRestrictionRect,\n};\n\nmodifiers.restrictEdges = restrictEdges;\nmodifiers.names.push('restrictEdges');\n\ndefaultOptions.perAction.restrictEdges = restrictEdges.defaults;\nresize.defaults.restrictEdges = restrictEdges.defaults;\n\nmodule.exports = restrictEdges;\n","// This module adds the options.resize.restrictSize setting which sets min and\n// max width and height for the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictSize: {\n// min: { width: -600, height: -600 },\n// max: { width: 600, height: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst restrictEdges = require('./restrictEdges');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst noMin = { width: -Infinity, height: -Infinity };\nconst noMax = { width: +Infinity, height: +Infinity };\n\nconst restrictSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n },\n\n setOffset: function ({ interaction }) {\n return interaction.startOffset;\n },\n\n set: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const rect = rectUtils.xywhToTlbr(interaction.resizeRects.inverted);\n\n const minSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.min, interaction)) || noMin;\n const maxSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.max, interaction)) || noMax;\n\n arg.options = {\n enabled: options.enabled,\n endOnly: options.endOnly,\n inner: utils.extend({}, restrictEdges.noInner),\n outer: utils.extend({}, restrictEdges.noOuter),\n };\n\n if (edges.top) {\n arg.options.inner.top = rect.bottom - minSize.height;\n arg.options.outer.top = rect.bottom - maxSize.height;\n }\n else if (edges.bottom) {\n arg.options.inner.bottom = rect.top + minSize.height;\n arg.options.outer.bottom = rect.top + maxSize.height;\n }\n if (edges.left) {\n arg.options.inner.left = rect.right - minSize.width;\n arg.options.outer.left = rect.right - maxSize.width;\n }\n else if (edges.right) {\n arg.options.inner.right = rect.left + minSize.width;\n arg.options.outer.right = rect.left + maxSize.width;\n }\n\n restrictEdges.set(arg);\n },\n\n modifyCoords: restrictEdges.modifyCoords,\n};\n\nmodifiers.restrictSize = restrictSize;\nmodifiers.names.push('restrictSize');\n\ndefaultOptions.perAction.restrictSize = restrictSize.defaults;\nresize.defaults.restrictSize = restrictSize.defaults;\n\nmodule.exports = restrictSize;\n","const modifiers = require('./index');\nconst interact = require('../interact');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst snap = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n\n relativePoints: null,\n },\n\n setOffset: function ({ interaction, interactable, element, rect, startOffset, options }) {\n const offsets = [];\n const optionsOrigin = utils.rectToXY(utils.resolveRectLike(options.origin));\n const origin = optionsOrigin || utils.getOriginXY(interactable, element, interaction.prepared.name);\n options = options || interactable.options[interaction.prepared.name].snap || {};\n\n let snapOffset;\n\n if (options.offset === 'startCoords') {\n snapOffset = {\n x: interaction.startCoords.page.x - origin.x,\n y: interaction.startCoords.page.y - origin.y,\n };\n }\n else {\n const offsetRect = utils.resolveRectLike(options.offset, interactable, element, [interaction]);\n\n snapOffset = utils.rectToXY(offsetRect) || { x: 0, y: 0 };\n }\n\n if (rect && options.relativePoints && options.relativePoints.length) {\n for (const { x: relativeX, y: relativeY } of options.relativePoints) {\n offsets.push({\n x: startOffset.left - (rect.width * relativeX) + snapOffset.x,\n y: startOffset.top - (rect.height * relativeY) + snapOffset.y,\n });\n }\n }\n else {\n offsets.push(snapOffset);\n }\n\n return offsets;\n },\n\n set: function ({ interaction, pageCoords, status, options, offset: offsets }) {\n const targets = [];\n let target;\n let page;\n let i;\n\n if (status.useStatusXY) {\n page = { x: status.x, y: status.y };\n }\n else {\n const origin = utils.getOriginXY(interaction.target, interaction.element, interaction.prepared.name);\n\n page = utils.extend({}, pageCoords);\n\n page.x -= origin.x;\n page.y -= origin.y;\n }\n\n status.realX = page.x;\n status.realY = page.y;\n\n let len = options.targets? options.targets.length : 0;\n\n for (const { x: offsetX, y: offsetY } of offsets) {\n const relativeX = page.x - offsetX;\n const relativeY = page.y - offsetY;\n\n for (const snapTarget of options.targets) {\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n targets.push({\n x: utils.is.number(target.x) ? (target.x + offsetX) : relativeX,\n y: utils.is.number(target.y) ? (target.y + offsetY) : relativeY,\n\n range: utils.is.number(target.range)? target.range: options.range,\n });\n }\n }\n\n const closest = {\n target: null,\n inRange: false,\n distance: 0,\n range: 0,\n dx: 0,\n dy: 0,\n };\n\n for (i = 0, len = targets.length; i < len; i++) {\n target = targets[i];\n\n const range = target.range;\n const dx = target.x - page.x;\n const dy = target.y - page.y;\n const distance = utils.hypot(dx, dy);\n let inRange = distance <= range;\n\n // Infinite targets count as being out of range\n // compared to non infinite ones that are in range\n if (range === Infinity && closest.inRange && closest.range !== Infinity) {\n inRange = false;\n }\n\n if (!closest.target || (inRange\n // is the closest target in range?\n ? (closest.inRange && range !== Infinity\n // the pointer is relatively deeper in this target\n ? distance / range < closest.distance / closest.range\n // this target has Infinite range and the closest doesn't\n : (range === Infinity && closest.range !== Infinity)\n // OR this target is closer that the previous closest\n || distance < closest.distance)\n // The other is not in range and the pointer is closer to this target\n : (!closest.inRange && distance < closest.distance))) {\n\n closest.target = target;\n closest.distance = distance;\n closest.range = range;\n closest.inRange = inRange;\n closest.dx = dx;\n closest.dy = dy;\n\n status.range = range;\n }\n }\n\n let snapChanged;\n\n if (closest.target) {\n snapChanged = (status.modifiedX !== closest.target.x || status.modifiedY !== closest.target.y);\n\n status.modifiedX = closest.target.x;\n status.modifiedY = closest.target.y;\n }\n else {\n snapChanged = true;\n\n status.modifiedX = NaN;\n status.modifiedY = NaN;\n }\n\n status.dx = closest.dx;\n status.dy = closest.dy;\n\n status.changed = (snapChanged || (closest.inRange && !status.locked));\n status.locked = closest.inRange;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const relativePoints = options && options.relativePoints;\n\n if (options && options.enabled\n && !(phase === 'start' && relativePoints && relativePoints.length)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n }\n\n return {\n range : status.range,\n locked : status.locked,\n x : status.modifiedX,\n y : status.modifiedY,\n realX : status.realX,\n realY : status.realY,\n dx : status.dx,\n dy : status.dy,\n };\n }\n },\n};\n\ninteract.createSnapGrid = function (grid) {\n return function (x, y) {\n const limits = grid.limits || {\n left : -Infinity,\n right : Infinity,\n top : -Infinity,\n bottom: Infinity,\n };\n let offsetX = 0;\n let offsetY = 0;\n\n if (utils.is.object(grid.offset)) {\n offsetX = grid.offset.x;\n offsetY = grid.offset.y;\n }\n\n const gridx = Math.round((x - offsetX) / grid.x);\n const gridy = Math.round((y - offsetY) / grid.y);\n\n const newX = Math.max(limits.left, Math.min(limits.right , gridx * grid.x + offsetX));\n const newY = Math.max(limits.top , Math.min(limits.bottom, gridy * grid.y + offsetY));\n\n return {\n x: newX,\n y: newY,\n range: grid.range,\n };\n };\n};\n\nmodifiers.snap = snap;\nmodifiers.names.push('snap');\n\ndefaultOptions.perAction.snap = snap.defaults;\n\nmodule.exports = snap;\n","// This module allows snapping of the size of targets during resize\n// interactions.\n\nconst modifiers = require('./index');\nconst snap = require('./snap');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\nconst utils = require('../utils/');\n\nconst snapSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n },\n\n setOffset: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.edges;\n\n if (!edges) { return; }\n\n arg.options = {\n relativePoints: [{\n x: edges.left? 0 : 1,\n y: edges.top ? 0 : 1,\n }],\n origin: { x: 0, y: 0 },\n offset: 'self',\n range: options.range,\n };\n\n const offsets = snap.setOffset(arg);\n arg.options = options;\n\n return offsets;\n },\n\n set: function (arg) {\n const { interaction, options, offset, pageCoords } = arg;\n const page = utils.extend({}, pageCoords);\n const relativeX = page.x - offset[0].x;\n const relativeY = page.y - offset[0].y;\n\n arg.options = utils.extend({}, options);\n arg.options.targets = [];\n\n for (const snapTarget of options.targets) {\n let target;\n\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n if ('width' in target && 'height' in target) {\n target.x = target.width;\n target.y = target.height;\n }\n\n arg.options.targets.push(target);\n }\n\n snap.set(arg);\n },\n\n modifyCoords: function (arg) {\n const { options } = arg;\n\n arg.options = utils.extend({}, options);\n arg.options.enabled = options.enabled;\n arg.options.relativePoints = [null];\n\n snap.modifyCoords(arg);\n },\n};\n\nmodifiers.snapSize = snapSize;\nmodifiers.names.push('snapSize');\n\ndefaultOptions.perAction.snapSize = snapSize.defaults;\nresize.defaults.snapSize = snapSize.defaults;\n\nmodule.exports = snapSize;\n","const pointerUtils = require('../utils/pointerUtils');\n\nmodule.exports = class PointerEvent {\n constructor (type, pointer, event, eventTarget, interaction) {\n pointerUtils.pointerExtend(this, event);\n\n if (event !== pointer) {\n pointerUtils.pointerExtend(this, pointer);\n }\n\n this.interaction = interaction;\n\n this.timeStamp = new Date().getTime();\n this.originalEvent = event;\n this.type = type;\n this.pointerId = pointerUtils.getPointerId(pointer);\n this.pointerType = pointerUtils.getPointerType(pointer);\n this.target = eventTarget;\n this.currentTarget = null;\n\n if (type === 'tap') {\n const pointerIndex = interaction.getPointerIndex(pointer);\n this.dt = this.timeStamp - interaction.downTimes[pointerIndex];\n\n const interval = this.timeStamp - interaction.tapTime;\n\n this.double = !!(interaction.prevTap\n && interaction.prevTap.type !== 'doubletap'\n && interaction.prevTap.target === this.target\n && interval < 500);\n }\n else if (type === 'doubletap') {\n this.dt = pointer.timeStamp - interaction.tapTime;\n }\n }\n\n subtractOrigin ({ x: originX, y: originY }) {\n this.pageX -= originX;\n this.pageY -= originY;\n this.clientX -= originX;\n this.clientY -= originY;\n\n return this;\n }\n\n addOrigin ({ x: originX, y: originY }) {\n this.pageX += originX;\n this.pageY += originY;\n this.clientX += originX;\n this.clientY += originY;\n\n return this;\n }\n\n preventDefault () {\n this.originalEvent.preventDefault();\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n};\n","const PointerEvent = require('./PointerEvent');\nconst Interaction = require('../Interaction');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst defaults = require('../defaultOptions');\nconst signals = require('../utils/Signals').new();\nconst { filter } = require('../utils/arr');\n\nconst simpleSignals = [ 'down', 'up', 'cancel' ];\nconst simpleEvents = [ 'down', 'up', 'cancel' ];\n\nconst pointerEvents = {\n PointerEvent,\n fire,\n collectEventTargets,\n signals,\n defaults: {\n holdDuration: 600,\n ignoreFrom : null,\n allowFrom : null,\n origin : { x: 0, y: 0 },\n },\n types: [\n 'down',\n 'move',\n 'up',\n 'cancel',\n 'tap',\n 'doubletap',\n 'hold',\n ],\n};\n\nfunction fire (arg) {\n const {\n interaction, pointer, event, eventTarget,\n type = arg.pointerEvent.type,\n targets = collectEventTargets(arg),\n pointerEvent = new PointerEvent(type, pointer, event, eventTarget, interaction),\n } = arg;\n\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n targets,\n type,\n pointerEvent,\n };\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n\n for (const prop in target.props || {}) {\n pointerEvent[prop] = target.props[prop];\n }\n\n const origin = utils.getOriginXY(target.eventable, target.element);\n\n pointerEvent.subtractOrigin(origin);\n pointerEvent.eventable = target.eventable;\n pointerEvent.currentTarget = target.element;\n\n target.eventable.fire(pointerEvent);\n\n pointerEvent.addOrigin(origin);\n\n if (pointerEvent.immediatePropagationStopped\n || (pointerEvent.propagationStopped\n && (i + 1) < targets.length && targets[i + 1].element !== pointerEvent.currentTarget)) {\n break;\n }\n }\n\n signals.fire('fired', signalArg);\n\n if (type === 'tap') {\n // if pointerEvent should make a double tap, create and fire a doubletap\n // PointerEvent and use that as the prevTap\n const prevTap = pointerEvent.double\n ? fire({\n interaction, pointer, event, eventTarget,\n type: 'doubletap',\n })\n : pointerEvent;\n\n interaction.prevTap = prevTap;\n interaction.tapTime = prevTap.timeStamp;\n }\n\n return pointerEvent;\n}\n\nfunction collectEventTargets ({ interaction, pointer, event, eventTarget, type }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n // do not fire a tap event if the pointer was moved before being lifted\n if (type === 'tap' && (interaction.pointerWasMoved\n // or if the pointerup target is different to the pointerdown target\n || !(interaction.downTargets[pointerIndex] && interaction.downTargets[pointerIndex] === eventTarget))) {\n return [];\n }\n\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n path,\n targets: [],\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (type === 'hold') {\n signalArg.targets = filter(signalArg.targets, target =>\n target.eventable.options.holdDuration === interaction.holdTimers[pointerIndex].duration);\n }\n\n return signalArg.targets;\n}\n\nInteraction.signals.on('update-pointer-down', function ({ interaction, pointerIndex }) {\n interaction.holdTimers[pointerIndex] = { duration: Infinity, timeout: null };\n});\n\nInteraction.signals.on('remove-pointer', function ({ interaction, pointerIndex }) {\n interaction.holdTimers.splice(pointerIndex, 1);\n});\n\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget, duplicateMove }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n if (!duplicateMove && (!interaction.pointerIsDown || interaction.pointerWasMoved)) {\n if (interaction.pointerIsDown) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n\n fire({\n interaction, pointer, event, eventTarget,\n type: 'move',\n });\n }\n});\n\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget, pointerIndex }) {\n // copy event to be used in timeout for IE8\n const eventCopy = browser.isIE8? utils.extend({}, event) : event;\n\n const timer = interaction.holdTimers[pointerIndex];\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'hold',\n targets: [],\n path,\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (!signalArg.targets.length) { return; }\n\n let minDuration = Infinity;\n\n for (let i = 0; i < signalArg.targets.length; i++) {\n const target = signalArg.targets[i];\n const holdDuration = target.eventable.options.holdDuration;\n\n if (holdDuration < minDuration) {\n minDuration = holdDuration;\n }\n }\n\n timer.duration = minDuration;\n timer.timeout = setTimeout(function () {\n fire({\n interaction,\n eventTarget,\n pointer: browser.isIE8? eventCopy : pointer,\n event: eventCopy,\n type: 'hold',\n });\n }, minDuration);\n});\n\nInteraction.signals.on('up', ({ interaction, pointer, event, eventTarget }) => {\n if (!interaction.pointerWasMoved) {\n fire({ interaction, eventTarget, pointer, event, type: 'tap' });\n }\n});\n\n['up', 'cancel'].forEach(function (signalName) {\n Interaction.signals.on(signalName, function ({ interaction, pointerIndex }) {\n if (interaction.holdTimers[pointerIndex]) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n });\n});\n\nfunction createSignalListener (type) {\n return function ({ interaction, pointer, event, eventTarget }) {\n fire({ interaction, eventTarget, pointer, event, type });\n };\n}\n\nfor (let i = 0; i < simpleSignals.length; i++) {\n Interaction.signals.on(simpleSignals[i], createSignalListener(simpleEvents[i]));\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.prevTap = null; // the most recent tap event on this interaction\n interaction.tapTime = 0; // time of the most recent tap event\n interaction.holdTimers = []; // [{ duration, timeout }]\n});\n\ndefaults.pointerEvents = pointerEvents.defaults;\nmodule.exports = pointerEvents;\n","const pointerEvents = require('./base');\nconst Interaction = require('../Interaction');\n\npointerEvents.signals.on('new', onNew);\npointerEvents.signals.on('fired', onFired);\n\nfor (const signal of ['move', 'up', 'cancel', 'endall']) {\n Interaction.signals.on(signal, endHoldRepeat);\n}\n\nfunction onNew ({ pointerEvent }) {\n if (pointerEvent.type !== 'hold') { return; }\n\n pointerEvent.count = (pointerEvent.count || 0) + 1;\n}\n\nfunction onFired ({ interaction, pointerEvent, eventTarget, targets }) {\n if (pointerEvent.type !== 'hold' || !targets.length) { return; }\n\n // get the repeat interval from the first eventable\n const interval = targets[0].eventable.options.holdRepeatInterval;\n\n // don't repeat if the interval is 0 or less\n if (interval <= 0) { return; }\n\n // set a timeout to fire the holdrepeat event\n interaction.holdIntervalHandle = setTimeout(function () {\n pointerEvents.fire({\n interaction,\n eventTarget,\n type: 'hold',\n pointer: pointerEvent,\n event: pointerEvent,\n });\n }, interval);\n}\n\nfunction endHoldRepeat ({ interaction }) {\n // set the interaction's holdStopTime property\n // to stop further holdRepeat events\n if (interaction.holdIntervalHandle) {\n clearInterval(interaction.holdIntervalHandle);\n interaction.holdIntervalHandle = null;\n }\n}\n\n// don't repeat by default\npointerEvents.defaults.holdRepeatInterval = 0;\npointerEvents.types.push('holdrepeat');\n\nmodule.exports = {\n onNew,\n onFired,\n endHoldRepeat,\n};\n","const pointerEvents = require('./base');\nconst Interactable = require('../Interactable');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\nconst scope = require('../scope');\nconst extend = require('../utils/extend');\nconst { merge } = require('../utils/arr');\n\npointerEvents.signals.on('collect-targets', function ({ targets, element, type, eventTarget }) {\n function collectSelectors (interactable, selector, context) {\n const els = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && is.element(element)\n && domUtils.matchesSelector(element, selector, els)\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n const interactable = scope.interactables.get(element);\n\n if (interactable) {\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n scope.interactables.forEachSelector(collectSelectors, element);\n});\n\nInteractable.signals.on('new', function ({ interactable }) {\n interactable.events.getRect = function (element) {\n return interactable.getRect(element);\n };\n});\n\nInteractable.signals.on('set', function ({ interactable, options }) {\n extend(interactable.events.options, pointerEvents.defaults);\n extend(interactable.events.options, options);\n});\n\nmerge(Interactable.eventTypes, pointerEvents.types);\n\nInteractable.prototype.pointerEvents = function (options) {\n extend(this.events.options, options);\n\n return this;\n};\n\nconst __backCompatOption = Interactable.prototype._backCompatOption;\n\nInteractable.prototype._backCompatOption = function (optionName, newValue) {\n const ret = __backCompatOption.call(this, optionName, newValue);\n\n if (ret === this) {\n this.events.options[optionName] = newValue;\n }\n\n return ret;\n};\n\nInteractable.settingsMethods.push('pointerEvents');\n","const utils = require('./utils');\nconst events = require('./utils/events');\nconst signals = require('./utils/Signals').new();\n\nconst scope = {\n signals,\n events,\n utils,\n\n // main document\n document: require('./utils/domObjects').document,\n // all documents being listened to\n documents: [],\n\n addDocument: function (doc, win) {\n // do nothing if document is already known\n if (utils.contains(scope.documents, doc)) { return false; }\n\n win = win || scope.getWindow(doc);\n\n scope.documents.push(doc);\n events.documents.push(doc);\n\n // don't add an unload event for the main document\n // so that the page may be cached in browser history\n if (doc !== scope.document) {\n events.add(win, 'unload', scope.onWindowUnload);\n }\n\n signals.fire('add-document', { doc, win });\n },\n\n removeDocument: function (doc, win) {\n const index = utils.indexOf(scope.documents, doc);\n\n win = win || scope.getWindow(doc);\n\n events.remove(win, 'unload', scope.onWindowUnload);\n\n scope.documents.splice(index, 1);\n events.documents.splice(index, 1);\n\n signals.fire('remove-document', { win, doc });\n },\n\n onWindowUnload: function () {\n scope.removeDocument(this.document, this);\n },\n};\n\nmodule.exports = scope;\n","const { indexOf } = require('./arr');\n\nclass Signals {\n constructor () {\n this.listeners = {\n // signalName: [listeners],\n };\n }\n\n on (name, listener) {\n if (!this.listeners[name]) {\n this.listeners[name] = [listener];\n return;\n }\n\n this.listeners[name].push(listener);\n }\n\n off (name, listener) {\n if (!this.listeners[name]) { return; }\n\n const index = indexOf(this.listeners[name], listener);\n\n if (index !== -1) {\n this.listeners[name].splice(index, 1);\n }\n }\n\n fire (name, arg) {\n const targetListeners = this.listeners[name];\n\n if (!targetListeners) { return; }\n\n for (let i = 0; i < targetListeners.length; i++) {\n if (targetListeners[i](arg, name) === false) {\n return;\n }\n }\n }\n}\n\nSignals.new = function () {\n return new Signals();\n};\n\nmodule.exports = Signals;\n","function indexOf (array, target) {\n for (let i = 0, len = array.length; i < len; i++) {\n if (array[i] === target) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction contains (array, target) {\n return indexOf(array, target) !== -1;\n}\n\nfunction merge (target, source) {\n for (let i = 0; i < source.length; i++) {\n target.push(source[i]);\n }\n\n return target;\n}\n\nfunction filter (array, test) {\n const result = [];\n\n for (let i = 0; i < array.length; i++) {\n if (test(array[i])) {\n result.push(array[i]);\n }\n }\n\n return result;\n}\n\nmodule.exports = {\n indexOf,\n contains,\n merge,\n filter,\n};\n","const { window } = require('./window');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst Element = domObjects.Element;\nconst navigator = window.navigator;\n\nconst browser = {\n // Does the browser support touch input?\n supportsTouch: !!(('ontouchstart' in window) || is.function(window.DocumentTouch)\n && domObjects.document instanceof window.DocumentTouch),\n\n // Does the browser support PointerEvents\n supportsPointerEvent: !!domObjects.PointerEvent,\n\n isIE8: ('attachEvent' in window) && !('addEventListener' in window),\n\n // Opera Mobile must be handled differently\n isOperaMobile: (navigator.appName === 'Opera'\n && browser.supportsTouch\n && navigator.userAgent.match('Presto')),\n\n // scrolling doesn't change the result of getClientRects on iOS 7\n isIOS7: (/iP(hone|od|ad)/.test(navigator.platform)\n && /OS 7[^\\d]/.test(navigator.appVersion)),\n\n isIe9OrOlder: /MSIE (8|9)/.test(navigator.userAgent),\n\n // prefix matchesSelector\n prefixedMatchesSelector: 'matches' in Element.prototype\n ? 'matches': 'webkitMatchesSelector' in Element.prototype\n ? 'webkitMatchesSelector': 'mozMatchesSelector' in Element.prototype\n ? 'mozMatchesSelector': 'oMatchesSelector' in Element.prototype\n ? 'oMatchesSelector': 'msMatchesSelector',\n\n useMatchesSelectorPolyfill: false,\n\n pEventTypes: (domObjects.PointerEvent\n ? (domObjects.PointerEvent === window.MSPointerEvent\n ? {\n up: 'MSPointerUp',\n down: 'MSPointerDown',\n over: 'mouseover',\n out: 'mouseout',\n move: 'MSPointerMove',\n cancel: 'MSPointerCancel',\n }\n : {\n up: 'pointerup',\n down: 'pointerdown',\n over: 'pointerover',\n out: 'pointerout',\n move: 'pointermove',\n cancel: 'pointercancel',\n })\n : null),\n\n // because Webkit and Opera still use 'mousewheel' event type\n wheelEvent: 'onmousewheel' in domObjects.document? 'mousewheel': 'wheel',\n\n};\n\nbrowser.useMatchesSelectorPolyfill = !is.function(Element.prototype[browser.prefixedMatchesSelector]);\n\nmodule.exports = browser;\n","const domObjects = {};\nconst win = require('./window').window;\n\nfunction blank () {}\n\ndomObjects.document = win.document;\ndomObjects.DocumentFragment = win.DocumentFragment || blank;\ndomObjects.SVGElement = win.SVGElement || blank;\ndomObjects.SVGSVGElement = win.SVGSVGElement || blank;\ndomObjects.SVGElementInstance = win.SVGElementInstance || blank;\ndomObjects.Element = win.Element || blank;\ndomObjects.HTMLElement = win.HTMLElement || domObjects.Element;\n\ndomObjects.Event = win.Event;\ndomObjects.Touch = win.Touch || blank;\ndomObjects.PointerEvent = (win.PointerEvent || win.MSPointerEvent);\n\nmodule.exports = domObjects;\n","const win = require('./window');\nconst browser = require('./browser');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst domUtils = {\n nodeContains: function (parent, child) {\n while (child) {\n if (child === parent) {\n return true;\n }\n\n child = child.parentNode;\n }\n\n return false;\n },\n\n closest: function (element, selector) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) { return element; }\n\n element = domUtils.parentNode(element);\n }\n\n return null;\n },\n\n parentNode: function (node) {\n let parent = node.parentNode;\n\n if (is.docFrag(parent)) {\n // skip past #shado-root fragments\n while ((parent = parent.host) && is.docFrag(parent)) {\n continue;\n }\n\n return parent;\n }\n\n return parent;\n },\n\n // taken from http://tanalin.com/en/blog/2012/12/matches-selector-ie8/ and modified\n matchesSelectorPolyfill: browser.useMatchesSelectorPolyfill\n ? function (element, selector, elems) {\n elems = elems || element.parentNode.querySelectorAll(selector);\n\n for (let i = 0, len = elems.length; i < len; i++) {\n if (elems[i] === element) {\n return true;\n }\n }\n\n return false;\n }\n : null,\n\n matchesSelector: function (element, selector, nodeList) {\n if (browser.useMatchesSelectorPolyfill) {\n return domUtils.matchesSelectorPolyfill(element, selector, nodeList);\n }\n\n // remove /deep/ from selectors if shadowDOM polyfill is used\n if (win.window !== win.realWindow) {\n selector = selector.replace(/\\/deep\\//g, ' ');\n }\n\n return element[browser.prefixedMatchesSelector](selector);\n },\n\n // Test for the element that's \"above\" all other qualifiers\n indexOfDeepestElement: function (elements) {\n let deepestZoneParents = [];\n let dropzoneParents = [];\n let dropzone;\n let deepestZone = elements[0];\n let index = deepestZone? 0: -1;\n let parent;\n let child;\n let i;\n let n;\n\n for (i = 1; i < elements.length; i++) {\n dropzone = elements[i];\n\n // an element might belong to multiple selector dropzones\n if (!dropzone || dropzone === deepestZone) {\n continue;\n }\n\n if (!deepestZone) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n // check if the deepest or current are document.documentElement or document.rootElement\n // - if the current dropzone is, do nothing and continue\n if (dropzone.parentNode === dropzone.ownerDocument) {\n continue;\n }\n // - if deepest is, update with the current dropzone and continue to next\n else if (deepestZone.parentNode === dropzone.ownerDocument) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n if (!deepestZoneParents.length) {\n parent = deepestZone;\n while (parent.parentNode && parent.parentNode !== parent.ownerDocument) {\n deepestZoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n }\n\n // if this element is an svg element and the current deepest is\n // an HTMLElement\n if (deepestZone instanceof domObjects.HTMLElement\n && dropzone instanceof domObjects.SVGElement\n && !(dropzone instanceof domObjects.SVGSVGElement)) {\n\n if (dropzone === deepestZone.parentNode) {\n continue;\n }\n\n parent = dropzone.ownerSVGElement;\n }\n else {\n parent = dropzone;\n }\n\n dropzoneParents = [];\n\n while (parent.parentNode !== parent.ownerDocument) {\n dropzoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n\n n = 0;\n\n // get (position of last common ancestor) + 1\n while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) {\n n++;\n }\n\n const parents = [\n dropzoneParents[n - 1],\n dropzoneParents[n],\n deepestZoneParents[n],\n ];\n\n child = parents[0].lastChild;\n\n while (child) {\n if (child === parents[1]) {\n deepestZone = dropzone;\n index = i;\n deepestZoneParents = [];\n\n break;\n }\n else if (child === parents[2]) {\n break;\n }\n\n child = child.previousSibling;\n }\n }\n\n return index;\n },\n\n matchesUpTo: function (element, selector, limit) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) {\n return true;\n }\n\n element = domUtils.parentNode(element);\n\n if (element === limit) {\n return domUtils.matchesSelector(element, selector);\n }\n }\n\n return false;\n },\n\n getActualElement: function (element) {\n return (element instanceof domObjects.SVGElementInstance\n ? element.correspondingUseElement\n : element);\n },\n\n getScrollXY: function (relevantWindow) {\n relevantWindow = relevantWindow || win.window;\n return {\n x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft,\n y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop,\n };\n },\n\n getElementClientRect: function (element) {\n const clientRect = (element instanceof domObjects.SVGElement\n ? element.getBoundingClientRect()\n : element.getClientRects()[0]);\n\n return clientRect && {\n left : clientRect.left,\n right : clientRect.right,\n top : clientRect.top,\n bottom: clientRect.bottom,\n width : clientRect.width || clientRect.right - clientRect.left,\n height: clientRect.height || clientRect.bottom - clientRect.top,\n };\n },\n\n getElementRect: function (element) {\n const clientRect = domUtils.getElementClientRect(element);\n\n if (!browser.isIOS7 && clientRect) {\n const scroll = domUtils.getScrollXY(win.getWindow(element));\n\n clientRect.left += scroll.x;\n clientRect.right += scroll.x;\n clientRect.top += scroll.y;\n clientRect.bottom += scroll.y;\n }\n\n return clientRect;\n },\n\n getPath: function (element) {\n const path = [];\n\n while (element) {\n path.push(element);\n element = domUtils.parentNode(element);\n }\n\n return path;\n },\n\n trySelector: value => {\n if (!is.string(value)) { return false; }\n\n // an exception will be raised if it is invalid\n domObjects.document.querySelector(value);\n return true;\n },\n};\n\nmodule.exports = domUtils;\n","const is = require('./is');\nconst domUtils = require('./domUtils');\nconst pExtend = require('./pointerExtend');\n\nconst { window, getWindow } = require('./window');\nconst { indexOf, contains } = require('./arr');\n\nconst useAttachEvent = ('attachEvent' in window) && !('addEventListener' in window);\nconst addEvent = useAttachEvent? 'attachEvent': 'addEventListener';\nconst removeEvent = useAttachEvent? 'detachEvent': 'removeEventListener';\nconst on = useAttachEvent? 'on': '';\n\nconst elements = [];\nconst targets = [];\nconst attachedListeners = [];\n\n// {\n// type: {\n// selectors: ['selector', ...],\n// contexts : [document, ...],\n// listeners: [[listener, capture, passive], ...]\n// }\n// }\nconst delegatedEvents = {};\n\nconst documents = [];\n\nconst supportsOptions = !useAttachEvent && (() => {\n let supported = false;\n\n window.document.createElement('div').addEventListener('test', null, {\n get capture () { supported = true; },\n });\n\n return supported;\n})();\n\nfunction add (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n let elementIndex = indexOf(elements, element);\n let target = targets[elementIndex];\n\n if (!target) {\n target = {\n events: {},\n typeCount: 0,\n };\n\n elementIndex = elements.push(element) - 1;\n targets.push(target);\n\n attachedListeners.push(useAttachEvent\n ? {\n supplied: [],\n wrapped : [],\n useCount: [],\n }\n : null);\n }\n\n if (!target.events[type]) {\n target.events[type] = [];\n target.typeCount++;\n }\n\n if (!contains(target.events[type], listener)) {\n let ret;\n\n if (useAttachEvent) {\n const { supplied, wrapped, useCount } = attachedListeners[elementIndex];\n const listenerIndex = indexOf(supplied, listener);\n\n const wrappedListener = wrapped[listenerIndex] || function (event) {\n if (!event.immediatePropagationStopped) {\n event.target = event.srcElement;\n event.currentTarget = element;\n\n event.preventDefault = event.preventDefault || preventDef;\n event.stopPropagation = event.stopPropagation || stopProp;\n event.stopImmediatePropagation = event.stopImmediatePropagation || stopImmProp;\n\n if (/mouse|click/.test(event.type)) {\n event.pageX = event.clientX + getWindow(element).document.documentElement.scrollLeft;\n event.pageY = event.clientY + getWindow(element).document.documentElement.scrollTop;\n }\n\n listener(event);\n }\n };\n\n ret = element[addEvent](on + type, wrappedListener, !!options.capture);\n\n if (listenerIndex === -1) {\n supplied.push(listener);\n wrapped.push(wrappedListener);\n useCount.push(1);\n }\n else {\n useCount[listenerIndex]++;\n }\n }\n else {\n ret = element[addEvent](type, listener, supportsOptions? options : !!options.capture);\n }\n target.events[type].push(listener);\n\n return ret;\n }\n}\n\nfunction remove (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const elementIndex = indexOf(elements, element);\n const target = targets[elementIndex];\n\n if (!target || !target.events) {\n return;\n }\n\n let wrappedListener = listener;\n let listeners;\n let listenerIndex;\n\n if (useAttachEvent) {\n listeners = attachedListeners[elementIndex];\n listenerIndex = indexOf(listeners.supplied, listener);\n wrappedListener = listeners.wrapped[listenerIndex];\n }\n\n if (type === 'all') {\n for (type in target.events) {\n if (target.events.hasOwnProperty(type)) {\n remove(element, type, 'all');\n }\n }\n return;\n }\n\n if (target.events[type]) {\n const len = target.events[type].length;\n\n if (listener === 'all') {\n for (let i = 0; i < len; i++) {\n remove(element, type, target.events[type][i], options);\n }\n return;\n }\n else {\n for (let i = 0; i < len; i++) {\n if (target.events[type][i] === listener) {\n element[removeEvent](on + type, wrappedListener, supportsOptions? options : !!options.capture);\n target.events[type].splice(i, 1);\n\n if (useAttachEvent && listeners) {\n listeners.useCount[listenerIndex]--;\n if (listeners.useCount[listenerIndex] === 0) {\n listeners.supplied.splice(listenerIndex, 1);\n listeners.wrapped.splice(listenerIndex, 1);\n listeners.useCount.splice(listenerIndex, 1);\n }\n }\n\n break;\n }\n }\n }\n\n if (target.events[type] && target.events[type].length === 0) {\n target.events[type] = null;\n target.typeCount--;\n }\n }\n\n if (!target.typeCount) {\n targets.splice(elementIndex, 1);\n elements.splice(elementIndex, 1);\n attachedListeners.splice(elementIndex, 1);\n }\n}\n\nfunction addDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n if (!delegatedEvents[type]) {\n delegatedEvents[type] = {\n selectors: [],\n contexts : [],\n listeners: [],\n };\n\n // add delegate listener functions\n for (let i = 0; i < documents.length; i++) {\n add(documents[i], type, delegateListener);\n add(documents[i], type, delegateUseCapture, true);\n }\n }\n\n const delegated = delegatedEvents[type];\n let index;\n\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n break;\n }\n }\n\n if (index === -1) {\n index = delegated.selectors.length;\n\n delegated.selectors.push(selector);\n delegated.contexts .push(context);\n delegated.listeners.push([]);\n }\n\n // keep listener and capture and passive flags\n delegated.listeners[index].push([listener, !!options.capture, options.passive]);\n}\n\nfunction removeDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const delegated = delegatedEvents[type];\n let matchFound = false;\n let index;\n\n if (!delegated) { return; }\n\n // count from last index of delegated to 0\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n // look for matching selector and context Node\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n\n const listeners = delegated.listeners[index];\n\n // each item of the listeners array is an array: [function, capture, passive]\n for (let i = listeners.length - 1; i >= 0; i--) {\n const [fn, capture, passive] = listeners[i];\n\n // check if the listener functions and capture and passive flags match\n if (fn === listener && capture === !!options.capture && passive === options.passive) {\n // remove the listener from the array of listeners\n listeners.splice(i, 1);\n\n // if all listeners for this interactable have been removed\n // remove the interactable from the delegated arrays\n if (!listeners.length) {\n delegated.selectors.splice(index, 1);\n delegated.contexts .splice(index, 1);\n delegated.listeners.splice(index, 1);\n\n // remove delegate function from context\n remove(context, type, delegateListener);\n remove(context, type, delegateUseCapture, true);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegatedEvents[type] = null;\n }\n }\n\n // only remove one listener\n matchFound = true;\n break;\n }\n }\n\n if (matchFound) { break; }\n }\n }\n}\n\n// bound to the interactable context when a DOM event\n// listener is added to a selector interactable\nfunction delegateListener (event, optionalArg) {\n const options = getOptions(optionalArg);\n const fakeEvent = {};\n const delegated = delegatedEvents[event.type];\n const eventTarget = (domUtils.getActualElement(event.path\n ? event.path[0]\n : event.target));\n let element = eventTarget;\n\n // duplicate the event so that currentTarget can be changed\n pExtend(fakeEvent, event);\n\n fakeEvent.originalEvent = event;\n fakeEvent.preventDefault = preventOriginalDefault;\n\n // climb up document tree looking for selector matches\n while (is.element(element)) {\n for (let i = 0; i < delegated.selectors.length; i++) {\n const selector = delegated.selectors[i];\n const context = delegated.contexts[i];\n\n if (domUtils.matchesSelector(element, selector)\n && domUtils.nodeContains(context, eventTarget)\n && domUtils.nodeContains(context, element)) {\n\n const listeners = delegated.listeners[i];\n\n fakeEvent.currentTarget = element;\n\n for (let j = 0; j < listeners.length; j++) {\n const [fn, capture, passive] = listeners[j];\n\n if (capture === !!options.capture && passive === options.passive) {\n fn(fakeEvent);\n }\n }\n }\n }\n\n element = domUtils.parentNode(element);\n }\n}\n\nfunction delegateUseCapture (event) {\n return delegateListener.call(this, event, true);\n}\n\nfunction preventDef () {\n this.returnValue = false;\n}\n\nfunction preventOriginalDefault () {\n this.originalEvent.preventDefault();\n}\n\nfunction stopProp () {\n this.cancelBubble = true;\n}\n\nfunction stopImmProp () {\n this.cancelBubble = true;\n this.immediatePropagationStopped = true;\n}\n\nfunction getOptions (param) {\n return is.object(param)? param : { capture: param };\n}\n\nmodule.exports = {\n add,\n remove,\n\n addDelegate,\n removeDelegate,\n\n delegateListener,\n delegateUseCapture,\n delegatedEvents,\n documents,\n\n useAttachEvent,\n supportsOptions,\n\n _elements: elements,\n _targets: targets,\n _attachedListeners: attachedListeners,\n};\n","module.exports = function extend (dest, source) {\n for (const prop in source) {\n dest[prop] = source[prop];\n }\n return dest;\n};\n","const {\n resolveRectLike,\n rectToXY,\n} = require('./rect');\n\nmodule.exports = function (target, element, action) {\n const actionOptions = target.options[action];\n const actionOrigin = actionOptions && actionOptions.origin;\n const origin = actionOrigin || target.options.origin;\n\n const originRect = resolveRectLike(origin, target, element, [target && element]);\n\n return rectToXY(originRect) || { x: 0, y: 0 };\n};\n","module.exports = (x, y) => Math.sqrt(x * x + y * y);\n","const extend = require('./extend');\nconst win = require('./window');\n\nconst utils = {\n warnOnce: function (method, message) {\n let warned = false;\n\n return function () {\n if (!warned) {\n win.window.console.warn(message);\n warned = true;\n }\n\n return method.apply(this, arguments);\n };\n },\n\n // http://stackoverflow.com/a/5634528/2280888\n _getQBezierValue: function (t, p1, p2, p3) {\n const iT = 1 - t;\n return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3;\n },\n\n getQuadraticCurvePoint: function (startX, startY, cpX, cpY, endX, endY, position) {\n return {\n x: utils._getQBezierValue(position, startX, cpX, endX),\n y: utils._getQBezierValue(position, startY, cpY, endY),\n };\n },\n\n // http://gizma.com/easing/\n easeOutQuad: function (t, b, c, d) {\n t /= d;\n return -c * t*(t-2) + b;\n },\n\n copyAction: function (dest, src) {\n dest.name = src.name;\n dest.axis = src.axis;\n dest.edges = src.edges;\n\n return dest;\n },\n\n is : require('./is'),\n extend : extend,\n hypot : require('./hypot'),\n getOriginXY: require('./getOriginXY'),\n};\n\nextend(utils, require('./arr'));\nextend(utils, require('./domUtils'));\nextend(utils, require('./pointerUtils'));\nextend(utils, require('./rect'));\n\nmodule.exports = utils;\n","const scope = require('../scope');\nconst utils = require('./index');\n\nconst finder = {\n methodOrder: [ 'simulationResume', 'mouseOrPen', 'hasPointer', 'idle' ],\n\n search: function (pointer, eventType, eventTarget) {\n const pointerType = utils.getPointerType(pointer);\n const pointerId = utils.getPointerId(pointer);\n const details = { pointer, pointerId, pointerType, eventType, eventTarget };\n\n for (const method of finder.methodOrder) {\n const interaction = finder[method](details);\n\n if (interaction) {\n return interaction;\n }\n }\n },\n\n // try to resume simulation with a new pointer\n simulationResume: function ({ pointerType, eventType, eventTarget }) {\n if (!/down|start/i.test(eventType)) {\n return null;\n }\n\n for (const interaction of scope.interactions) {\n let element = eventTarget;\n\n if (interaction.simulation && interaction.simulation.allowResume\n && (interaction.pointerType === pointerType)) {\n while (element) {\n // if the element is the interaction element\n if (element === interaction.element) {\n return interaction;\n }\n element = utils.parentNode(element);\n }\n }\n }\n\n return null;\n },\n\n // if it's a mouse or pen interaction\n mouseOrPen: function ({ pointerId, pointerType, eventType }) {\n if (pointerType !== 'mouse' && pointerType !== 'pen') {\n return null;\n }\n\n let firstNonActive;\n\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType) {\n // if it's a down event, skip interactions with running simulations\n if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; }\n\n // if the interaction is active, return it immediately\n if (interaction.interacting()) {\n return interaction;\n }\n // otherwise save it and look for another active interaction\n else if (!firstNonActive) {\n firstNonActive = interaction;\n }\n }\n }\n\n // if no active mouse interaction was found use the first inactive mouse\n // interaction\n if (firstNonActive) {\n return firstNonActive;\n }\n\n // find any mouse or pen interaction.\n // ignore the interaction if the eventType is a *down, and a simulation\n // is active\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType && !(/down/i.test(eventType) && interaction.simulation)) {\n return interaction;\n }\n }\n\n return null;\n },\n\n // get interaction that has this pointer\n hasPointer: function ({ pointerId }) {\n for (const interaction of scope.interactions) {\n if (utils.contains(interaction.pointerIds, pointerId)) {\n return interaction;\n }\n }\n },\n\n // get first idle interaction with a matching pointerType\n idle: function ({ pointerType }) {\n for (const interaction of scope.interactions) {\n // if there's already a pointer held down\n if (interaction.pointerIds.length === 1) {\n const target = interaction.target;\n // don't add this pointer if there is a target interactable and it\n // isn't gesturable\n if (target && !target.options.gesture.enabled) {\n continue;\n }\n }\n // maximum of 2 pointers per interaction\n else if (interaction.pointerIds.length >= 2) {\n continue;\n }\n\n if (!interaction.interacting() && (pointerType === interaction.pointerType)) {\n return interaction;\n }\n }\n\n return null;\n },\n};\n\nmodule.exports = finder;\n","const win = require('./window');\nconst isWindow = require('./isWindow');\n\nconst is = {\n array : () => {},\n\n window : thing => thing === win.window || isWindow(thing),\n\n docFrag : thing => is.object(thing) && thing.nodeType === 11,\n\n object : thing => !!thing && (typeof thing === 'object'),\n\n function: thing => typeof thing === 'function',\n\n number : thing => typeof thing === 'number' ,\n\n bool : thing => typeof thing === 'boolean' ,\n\n string : thing => typeof thing === 'string' ,\n\n element: thing => {\n if (!thing || (typeof thing !== 'object')) { return false; }\n\n const _window = win.getWindow(thing) || win.window;\n\n return (/object|function/.test(typeof _window.Element)\n ? thing instanceof _window.Element //DOM2\n : thing.nodeType === 1 && typeof thing.nodeName === 'string');\n },\n};\n\nis.array = thing => (is.object(thing)\n && (typeof thing.length !== 'undefined')\n && is.function(thing.splice));\n\nmodule.exports = is;\n","module.exports = (thing) => !!(thing && thing.Window) && (thing instanceof thing.Window);\n","function pointerExtend (dest, source) {\n for (const prop in source) {\n const prefixedPropREs = module.exports.prefixedPropREs;\n let deprecated = false;\n\n // skip deprecated prefixed properties\n for (const vendor in prefixedPropREs) {\n if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) {\n deprecated = true;\n break;\n }\n }\n\n if (!deprecated && typeof source[prop] !== 'function') {\n dest[prop] = source[prop];\n }\n }\n return dest;\n}\n\npointerExtend.prefixedPropREs = {\n webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/,\n};\n\nmodule.exports = pointerExtend;\n","const hypot = require('./hypot');\nconst browser = require('./browser');\nconst dom = require('./domObjects');\nconst domUtils = require('./domUtils');\nconst domObjects = require('./domObjects');\nconst is = require('./is');\nconst pointerExtend = require('./pointerExtend');\n\nconst pointerUtils = {\n copyCoords: function (dest, src) {\n dest.page = dest.page || {};\n dest.page.x = src.page.x;\n dest.page.y = src.page.y;\n\n dest.client = dest.client || {};\n dest.client.x = src.client.x;\n dest.client.y = src.client.y;\n\n dest.timeStamp = src.timeStamp;\n },\n\n setCoordDeltas: function (targetObj, prev, cur) {\n targetObj.page.x = cur.page.x - prev.page.x;\n targetObj.page.y = cur.page.y - prev.page.y;\n targetObj.client.x = cur.client.x - prev.client.x;\n targetObj.client.y = cur.client.y - prev.client.y;\n targetObj.timeStamp = cur.timeStamp - prev.timeStamp;\n\n // set pointer velocity\n const dt = Math.max(targetObj.timeStamp / 1000, 0.001);\n\n targetObj.page.speed = hypot(targetObj.page.x, targetObj.page.y) / dt;\n targetObj.page.vx = targetObj.page.x / dt;\n targetObj.page.vy = targetObj.page.y / dt;\n\n targetObj.client.speed = hypot(targetObj.client.x, targetObj.page.y) / dt;\n targetObj.client.vx = targetObj.client.x / dt;\n targetObj.client.vy = targetObj.client.y / dt;\n },\n\n isNativePointer: function (pointer) {\n return (pointer instanceof dom.Event || pointer instanceof dom.Touch);\n },\n\n // Get specified X/Y coords for mouse or event.touches[0]\n getXY: function (type, pointer, xy) {\n xy = xy || {};\n type = type || 'page';\n\n xy.x = pointer[type + 'X'];\n xy.y = pointer[type + 'Y'];\n\n return xy;\n },\n\n getPageXY: function (pointer, page) {\n page = page || {};\n\n // Opera Mobile handles the viewport and scrolling oddly\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n pointerUtils.getXY('screen', pointer, page);\n\n page.x += window.scrollX;\n page.y += window.scrollY;\n }\n else {\n pointerUtils.getXY('page', pointer, page);\n }\n\n return page;\n },\n\n getClientXY: function (pointer, client) {\n client = client || {};\n\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n // Opera Mobile handles the viewport and scrolling oddly\n pointerUtils.getXY('screen', pointer, client);\n }\n else {\n pointerUtils.getXY('client', pointer, client);\n }\n\n return client;\n },\n\n getPointerId: function (pointer) {\n return is.number(pointer.pointerId)? pointer.pointerId : pointer.identifier;\n },\n\n setCoords: function (targetObj, pointers, timeStamp) {\n const pointer = (pointers.length > 1\n ? pointerUtils.pointerAverage(pointers)\n : pointers[0]);\n\n const tmpXY = {};\n\n pointerUtils.getPageXY(pointer, tmpXY);\n targetObj.page.x = tmpXY.x;\n targetObj.page.y = tmpXY.y;\n\n pointerUtils.getClientXY(pointer, tmpXY);\n targetObj.client.x = tmpXY.x;\n targetObj.client.y = tmpXY.y;\n\n targetObj.timeStamp = is.number(timeStamp) ? timeStamp :new Date().getTime();\n },\n\n pointerExtend: pointerExtend,\n\n getTouchPair: function (event) {\n const touches = [];\n\n // array of touches is supplied\n if (is.array(event)) {\n touches[0] = event[0];\n touches[1] = event[1];\n }\n // an event\n else {\n if (event.type === 'touchend') {\n if (event.touches.length === 1) {\n touches[0] = event.touches[0];\n touches[1] = event.changedTouches[0];\n }\n else if (event.touches.length === 0) {\n touches[0] = event.changedTouches[0];\n touches[1] = event.changedTouches[1];\n }\n }\n else {\n touches[0] = event.touches[0];\n touches[1] = event.touches[1];\n }\n }\n\n return touches;\n },\n\n pointerAverage: function (pointers) {\n const average = {\n pageX : 0,\n pageY : 0,\n clientX: 0,\n clientY: 0,\n screenX: 0,\n screenY: 0,\n };\n\n for (const pointer of pointers) {\n for (const prop in average) {\n average[prop] += pointer[prop];\n }\n }\n for (const prop in average) {\n average[prop] /= pointers.length;\n }\n\n return average;\n },\n\n touchBBox: function (event) {\n if (!event.length && !(event.touches && event.touches.length > 1)) {\n return;\n }\n\n const touches = pointerUtils.getTouchPair(event);\n const minX = Math.min(touches[0].pageX, touches[1].pageX);\n const minY = Math.min(touches[0].pageY, touches[1].pageY);\n const maxX = Math.max(touches[0].pageX, touches[1].pageX);\n const maxY = Math.max(touches[0].pageY, touches[1].pageY);\n\n return {\n x: minX,\n y: minY,\n left: minX,\n top: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n },\n\n touchDistance: function (event, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n\n\n const dx = touches[0][sourceX] - touches[1][sourceX];\n const dy = touches[0][sourceY] - touches[1][sourceY];\n\n return hypot(dx, dy);\n },\n\n touchAngle: function (event, prevAngle, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n const dx = touches[1][sourceX] - touches[0][sourceX];\n const dy = touches[1][sourceY] - touches[0][sourceY];\n const angle = 180 * Math.atan2(dy , dx) / Math.PI;\n\n return angle;\n },\n\n getPointerType: function (pointer) {\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : is.number(pointer.pointerType)\n ? [undefined, undefined,'touch', 'pen', 'mouse'][pointer.pointerType]\n // if the PointerEvent API isn't available, then the \"pointer\" must\n // be either a MouseEvent, TouchEvent, or Touch object\n : /touch/.test(pointer.type) || pointer instanceof domObjects.Touch\n ? 'touch'\n : 'mouse';\n },\n\n // [ event.target, event.currentTarget ]\n getEventTargets: function (event) {\n return [\n domUtils.getActualElement(event.path ? event.path[0] : event.target),\n domUtils.getActualElement(event.currentTarget),\n ];\n },\n};\n\nmodule.exports = pointerUtils;\n","const { window } = require('./window');\n\nconst vendors = ['ms', 'moz', 'webkit', 'o'];\nlet lastTime = 0;\nlet request;\nlet cancel;\n\nfor (let x = 0; x < vendors.length && !window.requestAnimationFrame; x++) {\n request = window[vendors[x] + 'RequestAnimationFrame'];\n cancel = window[vendors[x] +'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n}\n\nif (!request) {\n request = function (callback) {\n const currTime = new Date().getTime();\n const timeToCall = Math.max(0, 16 - (currTime - lastTime));\n const id = setTimeout(function () { callback(currTime + timeToCall); },\n timeToCall);\n\n lastTime = currTime + timeToCall;\n return id;\n };\n}\n\nif (!cancel) {\n cancel = function (id) {\n clearTimeout(id);\n };\n}\n\nmodule.exports = {\n request,\n cancel,\n};\n","const extend = require('./extend');\nconst is = require('./is');\nconst {\n closest,\n parentNode,\n getElementRect,\n} = require('./domUtils');\n\nconst rectUtils = {\n getStringOptionResult: function (value, interactable, element) {\n if (!is.string(value)) {\n return null;\n }\n\n if (value === 'parent') {\n value = parentNode(element);\n }\n else if (value === 'self') {\n value = interactable.getRect(element);\n }\n else {\n value = closest(element, value);\n }\n\n return value;\n },\n\n resolveRectLike: function (value, interactable, element, functionArgs) {\n value = rectUtils.getStringOptionResult(value, interactable, element) || value;\n\n if (is.function(value)) {\n value = value.apply(null, functionArgs);\n }\n\n if (is.element(value)) {\n value = getElementRect(value);\n }\n\n return value;\n },\n\n rectToXY: function (rect) {\n return rect && {\n x: 'x' in rect ? rect.x : rect.left,\n y: 'y' in rect ? rect.y : rect.top,\n };\n },\n\n xywhToTlbr: function (rect) {\n if (rect && !('left' in rect && 'top' in rect)) {\n rect = extend({}, rect);\n\n rect.left = rect.x || 0;\n rect.top = rect.y || 0;\n rect.right = rect.right || (rect.left + rect.width);\n rect.bottom = rect.bottom || (rect.top + rect.height);\n }\n\n return rect;\n },\n\n tlbrToXywh: function (rect) {\n if (rect && !('x' in rect && 'y' in rect)) {\n rect = extend({}, rect);\n\n rect.x = rect.left || 0;\n rect.top = rect.top || 0;\n rect.width = rect.width || (rect.right - rect.x);\n rect.height = rect.height || (rect.bottom - rect.y);\n }\n\n return rect;\n },\n};\n\nmodule.exports = rectUtils;\n","const win = module.exports;\nconst isWindow = require('./isWindow');\n\nfunction init (window) {\n // get wrapped window if using Shadow DOM polyfill\n\n win.realWindow = window;\n\n // create a TextNode\n const el = window.document.createTextNode('');\n\n // check if it's wrapped by a polyfill\n if (el.ownerDocument !== window.document\n && typeof window.wrap === 'function'\n && window.wrap(el) === el) {\n // use wrapped window\n window = window.wrap(window);\n }\n\n win.window = window;\n}\n\nif (typeof window === 'undefined') {\n win.window = undefined;\n win.realWindow = undefined;\n}\nelse {\n init(window);\n}\n\nwin.getWindow = function getWindow (node) {\n if (isWindow(node)) {\n return node;\n }\n\n const rootNode = (node.ownerDocument || node);\n\n return rootNode.defaultView || rootNode.parentWindow || win.window;\n};\n\nwin.init = init;\n"]} \ No newline at end of file diff --git a/dist/interact.min.js b/dist/interact.min.js index c0bb2476c..2d1f0fb62 100644 --- a/dist/interact.min.js +++ b/dist/interact.min.js @@ -1,6 +1,6 @@ -/* interact.js v1.3.0-alpha.3+sha.9595c40 | https://raw.github.com/taye/interact.js/master/LICENSE */ -!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var t;t="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,t.interact=e()}}(function(){return function e(t,n,r){function i(s,a){if(!n[s]){if(!t[s]){var l="function"==typeof require&&require;if(!a&&l)return l(s,!0);if(o)return o(s,!0);var c=new Error("Cannot find module '"+s+"'");throw c.code="MODULE_NOT_FOUND",c}var p=n[s]={exports:{}};t[s][0].call(p.exports,function(e){var n=t[s][1][e];return i(n||e)},p,p.exports,e,t,n,r)}return n[s].exports}for(var o="function"==typeof require&&require,s=0;s6&&void 0!==arguments[6]&&arguments[6];r(this,e);var f=t.target,v=(f&&f.options||s).deltaSource,g=o(f,p,l),h="start"===c,m="end"===c,y=h?t.startCoords:t.curCoords,x=t.prevEvent;p=p||t.element;var b=i({},y.page),w=i({},y.client);b.x-=g.x,b.y-=g.y,w.x-=g.x,w.y-=g.y,this.ctrlKey=n.ctrlKey,this.altKey=n.altKey,this.shiftKey=n.shiftKey,this.metaKey=n.metaKey,this.button=n.button,this.buttons=n.buttons,this.target=p,this.currentTarget=p,this.relatedTarget=u||null,this.preEnd=d,this.type=l+(c||""),this.interaction=t,this.interactable=f,this.t0=h?t.downTimes[t.downTimes.length-1]:x.t0;var E={interaction:t,event:n,action:l,phase:c,element:p,related:u,page:b,client:w,coords:y,starting:h,ending:m,deltaSource:v,iEvent:this};a.fire("set-xy",E),m?(this.pageX=x.pageX,this.pageY=x.pageY,this.clientX=x.clientX,this.clientY=x.clientY):(this.pageX=b.x,this.pageY=b.y,this.clientX=w.x,this.clientY=w.y),this.x0=t.startCoords.page.x-g.x,this.y0=t.startCoords.page.y-g.y,this.clientX0=t.startCoords.client.x-g.x,this.clientY0=t.startCoords.client.y-g.y,a.fire("set-delta",E),this.timeStamp=y.timeStamp,this.dt=t.pointerDelta.timeStamp,this.duration=this.timeStamp-this.t0,this.speed=t.pointerDelta[v].speed,this.velocityX=t.pointerDelta[v].vx,this.velocityY=t.pointerDelta[v].vy,this.swipe=m||"inertiastart"===c?this.getSwipe():null,a.fire("new",E)}return e.prototype.getSwipe=function(){var e=this.interaction;if(e.prevEvent.speed<600||this.timeStamp-e.prevEvent.timeStamp>150)return null;var t=180*Math.atan2(e.prevEvent.velocityY,e.prevEvent.velocityX)/Math.PI;t<0&&(t+=360);var n=112.5<=t&&t<247.5,r=202.5<=t&&t<337.5,i=!n&&(292.5<=t||t<67.5);return{up:r,down:!r&&22.5<=t&&t<157.5,left:n,right:i,angle:t,speed:e.prevEvent.speed,velocity:{x:e.prevEvent.velocityX,y:e.prevEvent.velocityY}}},e.prototype.preventDefault=function(){},e.prototype.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},e.prototype.stopPropagation=function(){this.propagationStopped=!0},e}();a.on("set-delta",function(e){var t=e.iEvent,n=e.interaction,r=e.starting,i=e.deltaSource,o=r?t:n.prevEvent;"client"===i?(t.dx=t.clientX-o.clientX,t.dy=t.clientY-o.clientY):(t.dx=t.pageX-o.pageX,t.dy=t.pageY-o.pageY)}),l.signals=a,t.exports=l},{"./defaultOptions":18,"./utils/Signals":35,"./utils/extend":41,"./utils/getOriginXY":42}],4:[function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=e("./utils/is"),o=e("./utils/events"),s=e("./utils/extend"),a=e("./actions/base"),l=e("./scope"),c=e("./Eventable"),p=e("./defaultOptions"),u=e("./utils/Signals").new(),d=e("./utils/domUtils"),f=d.getElementRect,v=d.nodeContains,g=d.trySelector,h=e("./utils/window"),m=h.getWindow,y=e("./utils/arr"),x=y.indexOf,b=y.contains,w=e("./utils/browser"),E=w.wheelEvent;l.interactables=[];var S=function(){function e(t,n){r(this,e),n=n||{},this.target=t,this.events=new c,this._context=n.context||l.document,this._win=m(g(t)?this._context:t),this._doc=this._win.document,u.fire("new",{target:t,options:n,interactable:this,win:this._win}),l.addDocument(this._doc,this._win),l.interactables.push(this),this.set(n)}return e.prototype.setOnEvents=function(e,t){var n="on"+e;return i.function(t.onstart)&&(this.events[n+"start"]=t.onstart),i.function(t.onmove)&&(this.events[n+"move"]=t.onmove),i.function(t.onend)&&(this.events[n+"end"]=t.onend),i.function(t.oninertiastart)&&(this.events[n+"inertiastart"]=t.oninertiastart),this},e.prototype.setPerAction=function(e,t){for(var n in t)n in p[e]&&(i.object(t[n])?(this.options[e][n]=s(this.options[e][n]||{},t[n]),i.object(p.perAction[n])&&"enabled"in p.perAction[n]&&(this.options[e][n].enabled=!1!==t[n].enabled)):i.bool(t[n])&&i.object(p.perAction[n])?this.options[e][n].enabled=t[n]:void 0!==t[n]&&(this.options[e][n]=t[n]))},e.prototype.getRect=function(e){return e=e||this.target,i.string(this.target)&&!i.element(e)&&(e=this._context.querySelector(this.target)),f(e)},e.prototype.rectChecker=function(e){return i.function(e)?(this.getRect=e,this):null===e?(delete this.options.getRect,this):this.getRect},e.prototype._backCompatOption=function(e,t){if(g(t)||i.object(t)){this.options[e]=t;for(var n=a.names,r=Array.isArray(n),o=0,n=r?n:n[Symbol.iterator]();;){var s;if(r){if(o>=n.length)break;s=n[o++]}else{if(o=n.next(),o.done)break;s=o.value}var l=s;this.options[l][e]=t}return this}return this.options[e]},e.prototype.origin=function(e){return this._backCompatOption("origin",e)},e.prototype.deltaSource=function(e){return"page"===e||"client"===e?(this.options.deltaSource=e,this):this.options.deltaSource},e.prototype.context=function(){return this._context},e.prototype.inContext=function(e){return this._context===e.ownerDocument||v(this._context,e)},e.prototype.fire=function(e){return this.events.fire(e),this},e.prototype._onOffMultiple=function(e,t,n,r){if(i.string(t)&&-1!==t.search(" ")&&(t=t.trim().split(/ +/)),i.array(t)){for(var o=0;o=l.length)break;f=l[d++]}else{if(d=l.next(),d.done)break;f=d.value}var v=f;this.options[v]=p.base[v],v in t&&this[v](t[v])}return u.fire("set",{options:t,interactable:this}),this},e.prototype.unset=function(){if(o.remove(this.target,"all"),i.string(this.target))for(var e in o.delegatedEvents){var t=o.delegatedEvents[e];t.selectors[0]===this.target&&t.contexts[0]===this._context&&(t.selectors.splice(0,1),t.contexts.splice(0,1),t.listeners.splice(0,1),t.selectors.length||(t[e]=null)),o.remove(this._context,e,o.delegateListener),o.remove(this._context,e,o.delegateUseCapture,!0)}else o.remove(this,"all");u.fire("unset",{interactable:this}),l.interactables.splice(x(l.interactables,this),1);for(var n=l.interactions||[],r=Array.isArray(n),s=0,n=r?n:n[Symbol.iterator]();;){var a;if(r){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var c=a;c.target===this&&c.interacting()&&c.stop()}return l.interact},e}();l.interactables.indexOfElement=function(e,t){t=t||l.document;for(var n=0;n=y.length)break;w=y[b++]}else{if(b=y.next(),b.done)break;w=b.value}var E=w,S=E[0],T=E[1];T._updateEventTargets(r,i),T[e](S,t,r,i)}}}function o(e){for(var t=0;te.pointerMoveTolerance);var a={pointer:t,pointerIndex:this.getPointerIndex(t),event:n,eventTarget:r,dx:o,dy:s,duplicate:i,interaction:this,interactingBeforeMove:this.interacting()};i||l.setCoordDeltas(this.pointerDelta,this.prevCoords,this.curCoords),d.fire("move",a),i||(this.interacting()&&this.doMove(a),this.pointerWasMoved&&l.copyCoords(this.prevCoords,this.curCoords))},e.prototype.doMove=function(e){e=l.extend({pointer:this.pointers[0],event:this.prevEvent,eventTarget:this._eventTarget,interaction:this},e||{}),d.fire("before-action-move",e),this._dontFireMove||d.fire("action-move",e),this._dontFireMove=!1},e.prototype.pointerUp=function(e,t,n,r){var i=this.getPointerIndex(e);d.fire(/cancel$/i.test(t.type)?"cancel":"up",{pointer:e,pointerIndex:i,event:t,eventTarget:n,curEventTarget:r,interaction:this}),this.simulation||this.end(t),this.pointerIsDown=!1,this.removePointer(e,t)},e.prototype.end=function(e){e=e||this.prevEvent,this.interacting()&&d.fire("action-end",{event:e,interaction:this}),this.stop()},e.prototype.currentAction=function(){return this._interacting?this.prepared.name:null},e.prototype.interacting=function(){return this._interacting},e.prototype.stop=function(){d.fire("stop",{interaction:this}),this._interacting&&(d.fire("stop-active",{interaction:this}),d.fire("stop-"+this.prepared.name,{interaction:this})),this.target=this.element=null,this._interacting=!1,this.prepared.name=this.prevEvent=null},e.prototype.getPointerIndex=function(e){return l.indexOf(this.pointerIds,l.getPointerId(e))},e.prototype.updatePointer=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:t&&/(down|start)$/i.test(t.type),r=l.getPointerId(e),i=this.getPointerIndex(e);return-1===i&&(i=this.pointerIds.length,this.pointerIds[i]=r),n&&d.fire("update-pointer-down",{pointer:e,event:t,down:n,pointerId:r,pointerIndex:i,interaction:this}),this.pointers[i]=e,i},e.prototype.removePointer=function(e,t){var n=l.getPointerId(e),r=this.mouse?0:l.indexOf(this.pointerIds,n);-1!==r&&(d.fire("remove-pointer",{pointer:e,event:t,pointerIndex:r,interaction:this}),this.pointers.splice(r,1),this.pointerIds.splice(r,1),this.downTargets.splice(r,1),this.downTimes.splice(r,1))},e.prototype._updateEventTargets=function(e,t){this._eventTarget=e,this._curEventTarget=t},e}(),m=0,y=v.length;m=i.length)break;a=i[s++]}else{if(s=i.next(),s.done)break;a=s.value}var l=a;if(l.options.drop.enabled){var c=l.options.drop.accept;if(!(p.is.element(c)&&c!==t||p.is.string(c)&&!p.matchesSelector(t,c)))for(var d=p.is.string(l.target)?l._context.querySelectorAll(l.target):[l.target],f=0;fo.left&&c.xo.top&&c.y=o.left&&v<=o.right&&g>=o.top&&g<=o.bottom}if(f&&p.is.number(a)){s=Math.max(0,Math.min(o.right,f.right)-Math.max(o.left,f.left))*Math.max(0,Math.min(o.bottom,f.bottom)-Math.max(o.top,f.top))/(f.width*f.height)>=a}return this.options.drop.checker&&(s=this.options.drop.checker(e,t,s,this,i,n,r)),s},v.signals.on("unset",function(e){e.interactable.dropzone(!1)}),v.settingsMethods.push("dropChecker"),g.signals.on("new",function(e){e.dropTarget=null,e.dropElement=null,e.prevDropTarget=null,e.prevDropElement=null,e.dropEvents=null,e.activeDrops={dropzones:[],elements:[],rects:[]}}),g.signals.on("stop",function(e){var t=e.interaction;t.dropTarget=t.dropElement=t.prevDropTarget=t.prevDropElement=null}),d.dynamicDrop=function(e){return p.is.bool(e)?(y=e,d):y},p.merge(v.eventTypes,["dragenter","dragleave","dropactivate","dropdeactivate","dropmove","drop"]),c.methodDict.drop="dropzone",h.drop=m.defaults,t.exports=m},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../interact":21,"../scope":34,"../utils":44,"./base":6}],9:[function(e,t,n){"use strict";var r=e("./base"),i=e("../utils"),o=e("../InteractEvent"),s=e("../Interactable"),a=e("../Interaction"),l=e("../defaultOptions"),c={defaults:{enabled:!1,origin:null,restrict:null},checker:function(e,t,n,r,i){return i.pointerIds.length>=2?{name:"gesture"}:null},getCursor:function(){return""}};o.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;"gesturestart"===t.type&&(t.ds=0,n.gesture.startDistance=n.gesture.prevDistance=t.distance,n.gesture.startAngle=n.gesture.prevAngle=t.angle,n.gesture.scale=1)}),o.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;"gesturemove"===t.type&&(t.ds=t.scale-n.gesture.scale,n.target.fire(t),n.gesture.prevAngle=t.angle,n.gesture.prevDistance=t.distance,t.scale===1/0||null===t.scale||void 0===t.scale||isNaN(t.scale)||(n.gesture.scale=t.scale))}),s.prototype.gesturable=function(e){return i.is.object(e)?(this.options.gesture.enabled=!1!==e.enabled,this.setPerAction("gesture",e),this.setOnEvents("gesture",e),this):i.is.bool(e)?(this.options.gesture.enabled=e,e||(this.ongesturestart=this.ongesturestart=this.ongestureend=null),this):this.options.gesture},o.signals.on("set-delta",function(e){var t=e.interaction,n=e.iEvent,r=e.action,s=e.event,a=e.starting,l=e.ending,c=e.deltaSource;if("gesture"===r){var p=t.pointers;n.touches=[p[0],p[1]],a?(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=1,n.ds=0,n.angle=i.touchAngle(p,void 0,c),n.da=0):l||s instanceof o?(n.distance=t.prevEvent.distance,n.box=t.prevEvent.box,n.scale=t.prevEvent.scale,n.ds=n.scale-1,n.angle=t.prevEvent.angle,n.da=n.angle-t.gesture.startAngle):(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=n.distance/t.gesture.startDistance,n.angle=i.touchAngle(p,t.gesture.prevAngle,c),n.ds=n.scale-t.gesture.prevScale,n.da=n.angle-t.gesture.prevAngle)}}),a.signals.on("new",function(e){e.gesture={start:{x:0,y:0},startDistance:0,prevDistance:0,distance:0,scale:1,startAngle:0,prevAngle:0}}),r.gesture=c,r.names.push("gesture"),i.merge(s.eventTypes,["gesturestart","gesturemove","gestureend"]),r.methodDict.gesture="gesturable",l.gesture=c.defaults,t.exports=c},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"./base":6}],10:[function(e,t,n){"use strict";function r(e,t,n,r,i,s,a){if(!t)return!1;if(!0===t){var l=o.is.number(s.width)?s.width:s.right-s.left,c=o.is.number(s.height)?s.height:s.bottom-s.top;if(l<0&&("left"===e?e="right":"right"===e&&(e="left")),c<0&&("top"===e?e="bottom":"bottom"===e&&(e="top")),"left"===e)return n.x<(l>=0?s.left:s.right)+a;if("top"===e)return n.y<(c>=0?s.top:s.bottom)+a;if("right"===e)return n.x>(l>=0?s.right:s.left)-a;if("bottom"===e)return n.y>(c>=0?s.bottom:s.top)-a}return!!o.is.element(r)&&(o.is.element(t)?t===r:o.matchesUpTo(r,t,i))}var i=e("./base"),o=e("../utils"),s=e("../utils/browser"),a=e("../InteractEvent"),l=e("../Interactable"),c=e("../Interaction"),p=e("../defaultOptions"),u=s.supportsTouch||s.supportsPointerEvent?20:10,d={defaults:{enabled:!1,mouseButtons:null,origin:null,snap:null,restrict:null,inertia:null,autoScroll:null,square:!1,preserveAspectRatio:!1,axis:"xy",margin:NaN,edges:null,invert:"none"},checker:function(e,t,n,i,s,a){if(!a)return null;var l=o.extend({},s.curCoords.page),c=n.options;if(c.resize.enabled){var p=c.resize,d={left:!1,right:!1,top:!1,bottom:!1};if(o.is.object(p.edges)){for(var f in d)d[f]=r(f,p.edges[f],l,s._eventTarget,i,a,p.margin||u);if(d.left=d.left&&!d.right,d.top=d.top&&!d.bottom,d.left||d.right||d.top||d.bottom)return{name:"resize",edges:d}}else{var v="y"!==c.resize.axis&&l.x>a.right-u,g="x"!==c.resize.axis&&l.y>a.bottom-u;if(v||g)return{name:"resize",axes:(v?"x":"")+(g?"y":"")}}}return null},cursors:s.isIe9OrOlder?{x:"e-resize",y:"s-resize",xy:"se-resize",top:"n-resize",left:"w-resize",bottom:"s-resize",right:"e-resize",topleft:"se-resize",bottomright:"se-resize",topright:"ne-resize",bottomleft:"ne-resize"}:{x:"ew-resize",y:"ns-resize",xy:"nwse-resize",top:"ns-resize",left:"ew-resize",bottom:"ns-resize",right:"ew-resize",topleft:"nwse-resize",bottomright:"nwse-resize",topright:"nesw-resize",bottomleft:"nesw-resize"},getCursor:function(e){if(e.axis)return d.cursors[e.name+e.axis];if(e.edges){for(var t="",n=["top","bottom","left","right"],r=0;r<4;r++)e.edges[n[r]]&&(t+=n[r]);return d.cursors[t]}}};a.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;if("resizestart"===t.type&&n.prepared.edges){var r=n.target.getRect(n.element),i=n.target.options.resize;if(i.square||i.preserveAspectRatio){var s=o.extend({},n.prepared.edges);s.top=s.top||s.left&&!s.bottom,s.left=s.left||s.top&&!s.right,s.bottom=s.bottom||s.right&&!s.top,s.right=s.right||s.bottom&&!s.left,n.prepared._linkedEdges=s}else n.prepared._linkedEdges=null;i.preserveAspectRatio&&(n.resizeStartAspectRatio=r.width/r.height),n.resizeRects={start:r,current:o.extend({},r),inverted:o.extend({},r),previous:o.extend({},r),delta:{left:0,right:0,width:0,top:0,bottom:0,height:0}},t.rect=n.resizeRects.inverted,t.deltaRect=n.resizeRects.delta}}),a.signals.on("new",function(e){var t=e.iEvent,n=e.phase,r=e.interaction;if("move"===n&&r.prepared.edges){var i=r.target.options.resize,s=i.invert,a="reposition"===s||"negate"===s,l=r.prepared.edges,c=r.resizeRects.start,p=r.resizeRects.current,u=r.resizeRects.inverted,d=r.resizeRects.delta,f=o.extend(r.resizeRects.previous,u),v=l,g=t.dx,h=t.dy;if(i.preserveAspectRatio||i.square){var m=i.preserveAspectRatio?r.resizeStartAspectRatio:1;l=r.prepared._linkedEdges,v.left&&v.bottom||v.right&&v.top?h=-g/m:v.left||v.right?h=g/m:(v.top||v.bottom)&&(g=h*m)}if(l.top&&(p.top+=h),l.bottom&&(p.bottom+=h),l.left&&(p.left+=g),l.right&&(p.right+=g),a){if(o.extend(u,p),"reposition"===s){var y=void 0;u.top>u.bottom&&(y=u.top,u.top=u.bottom,u.bottom=y),u.left>u.right&&(y=u.left,u.left=u.right,u.right=y)}}else u.top=Math.min(p.top,c.bottom),u.bottom=Math.max(p.bottom,c.top),u.left=Math.min(p.left,c.right),u.right=Math.max(p.right,c.left);u.width=u.right-u.left,u.height=u.bottom-u.top;for(var x in u)d[x]=u[x]-f[x];t.edges=r.prepared.edges,t.rect=u,t.deltaRect=d}}),l.prototype.resizable=function(e){return o.is.object(e)?(this.options.resize.enabled=!1!==e.enabled,this.setPerAction("resize",e),this.setOnEvents("resize",e),/^x$|^y$|^xy$/.test(e.axis)?this.options.resize.axis=e.axis:null===e.axis&&(this.options.resize.axis=p.resize.axis),o.is.bool(e.preserveAspectRatio)?this.options.resize.preserveAspectRatio=e.preserveAspectRatio:o.is.bool(e.square)&&(this.options.resize.square=e.square),this):o.is.bool(e)?(this.options.resize.enabled=e,e||(this.onresizestart=this.onresizestart=this.onresizeend=null),this):this.options.resize},c.signals.on("new",function(e){ -e.resizeAxes="xy"}),a.signals.on("set-delta",function(e){var t=e.interaction,n=e.iEvent;"resize"===e.action&&t.resizeAxes&&(t.target.options.resize.square?("y"===t.resizeAxes?n.dx=n.dy:n.dy=n.dx,n.axes="xy"):(n.axes=t.resizeAxes,"x"===t.resizeAxes?n.dy=0:"y"===t.resizeAxes&&(n.dx=0)))}),i.resize=d,i.names.push("resize"),o.merge(l.eventTypes,["resizestart","resizemove","resizeinertiastart","resizeinertiaresume","resizeend"]),i.methodDict.resize="resizable",p.resize=d.defaults,t.exports=d},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"../utils/browser":37,"./base":6}],11:[function(e,t,n){"use strict";var r=e("./utils/raf"),i=e("./utils/window").getWindow,o=e("./utils/is"),s=e("./utils/domUtils"),a=e("./Interaction"),l=e("./defaultOptions"),c={defaults:{enabled:!1,container:null,margin:60,speed:300},interaction:null,i:null,x:0,y:0,isScrolling:!1,prevTime:0,start:function(e){c.isScrolling=!0,r.cancel(c.i),c.interaction=e,c.prevTime=(new Date).getTime(),c.i=r.request(c.scroll)},stop:function(){c.isScrolling=!1,r.cancel(c.i)},scroll:function(){var e=c.interaction.target.options[c.interaction.prepared.name].autoScroll,t=e.container||i(c.interaction.element),n=(new Date).getTime(),s=(n-c.prevTime)/1e3,a=e.speed*s;a>=1&&(o.window(t)?t.scrollBy(c.x*a,c.y*a):t&&(t.scrollLeft+=c.x*a,t.scrollTop+=c.y*a),c.prevTime=n),c.isScrolling&&(r.cancel(c.i),c.i=r.request(c.scroll))},check:function(e,t){var n=e.options;return n[t].autoScroll&&n[t].autoScroll.enabled},onInteractionMove:function(e){var t=e.interaction,n=e.pointer;if(t.interacting()&&c.check(t.target,t.prepared.name)){if(t.simulation)return void(c.x=c.y=0);var r=void 0,a=void 0,l=void 0,p=void 0,u=t.target.options[t.prepared.name].autoScroll,d=u.container||i(t.element);if(o.window(d))p=n.clientXd.innerWidth-c.margin,l=n.clientY>d.innerHeight-c.margin;else{var f=s.getElementClientRect(d);p=n.clientXf.right-c.margin,l=n.clientY>f.bottom-c.margin}c.x=a?1:p?-1:0,c.y=l?1:r?-1:0,c.isScrolling||(c.margin=u.margin,c.speed=u.speed,c.start(t))}}};a.signals.on("stop-active",function(){c.stop()}),a.signals.on("action-move",c.onInteractionMove),l.perAction.autoScroll=c.defaults,t.exports=c},{"./Interaction":5,"./defaultOptions":18,"./utils/domUtils":39,"./utils/is":46,"./utils/raf":50,"./utils/window":52}],12:[function(e,t,n){"use strict";var r=e("../Interactable"),i=e("../actions/base"),o=e("../utils/is"),s=e("../utils/domUtils");r.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},r.prototype.ignoreFrom=function(e){return this._backCompatOption("ignoreFrom",e)},r.prototype.allowFrom=function(e){return this._backCompatOption("allowFrom",e)},r.prototype.testIgnore=function(e,t,n){return!(!e||!o.element(n))&&(o.string(e)?s.matchesUpTo(n,e,t):!!o.element(e)&&s.nodeContains(e,n))},r.prototype.testAllow=function(e,t,n){return!e||!!o.element(n)&&(o.string(e)?s.matchesUpTo(n,e,t):!!o.element(e)&&s.nodeContains(e,n))},r.prototype.testIgnoreAllow=function(e,t,n){return!this.testIgnore(e.ignoreFrom,t,n)&&this.testAllow(e.allowFrom,t,n)},r.prototype.actionChecker=function(e){return o.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},r.prototype.styleCursor=function(e){return o.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},r.prototype.defaultActionChecker=function(e,t,n,r){for(var o=this.getRect(r),s=null,a=i.names,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var u=p;if((!n.pointerIsDown||!n.mouse||0!=(t.buttons&this.options[u].mouseButtons))&&(s=i[u].checker(e,t,this,r,n,o)))return s}}},{"../Interactable":4,"../actions/base":6,"../utils/domUtils":39,"../utils/is":46}],13:[function(e,t,n){"use strict";function r(e,t,n,r){return g.is.object(e)&&t.testIgnoreAllow(t.options[e.name],n,r)&&t.options[e.name].enabled&&a(t,n,e)?e:null}function i(e,t,n,i,o,s){for(var a=0,l=i.length;a=m.maxInteractions)return!1;if(u.target===e){if((a+=d===n.name|0)>=i)return!1;if(u.element===t&&(l++,d!==n.name||l>=o))return!1}}}return m.maxInteractions>0}}var l=e("../interact"),c=e("../Interactable"),p=e("../Interaction"),u=e("../actions/base"),d=e("../defaultOptions"),f=e("../utils/browser"),v=e("../scope"),g=e("../utils"),h=e("../utils/Signals").new();e("./InteractableMethods");var m={signals:h,withinInteractionLimit:a,maxInteractions:1/0,defaults:{perAction:{manualStart:!1,max:1/0,maxPerElement:1,allowFrom:null,ignoreFrom:null}},setActionDefaults:function(e){g.extend(e.defaults,m.defaults.perAction)}};p.signals.on("down",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;if(!t.interacting()){s(t,o(t,n,r,i))}}),p.signals.on("move",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;if(t.mouse&&!t.pointerIsDown&&!t.interacting()){s(t,o(t,n,r,i))}}),p.signals.on("move",function(e){var t=e.interaction,n=e.event;if(t.pointerIsDown&&!t.interacting()&&t.pointerWasMoved&&t.prepared.name){h.fire("before-start",e);var r=t.target;t.prepared.name&&r&&(r.options[t.prepared.name].manualStart||!a(r,t.element,t.prepared)?t.stop(n):t.start(t.prepared,r,t.element))}}),p.signals.on("stop",function(e){var t=e.interaction,n=t.target;n&&n.options.styleCursor&&(n._doc.documentElement.style.cursor="")}),c.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},c.prototype.actionChecker=function(e){return g.is.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},c.prototype.styleCursor=function(e){return g.is.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},c.prototype.defaultActionChecker=function(e,t,n,r){for(var i=this.getRect(r),o=t.buttons||{0:1,1:4,3:8,4:16}[t.button],s=null,a=u.names,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var d=p;if((!n.pointerIsDown||!n.mouse||0!=(o&this.options[d].mouseButtons))&&(s=u[d].checker(e,t,this,r,n,i)))return s}},l.maxInteractions=function(e){return g.is.number(e)?(m.maxInteractions=e,this):m.maxInteractions},c.settingsMethods.push("styleCursor"),c.settingsMethods.push("actionChecker"),c.settingsMethods.push("ignoreFrom"),c.settingsMethods.push("allowFrom"),d.base.actionChecker=null,d.base.styleCursor=!0,g.extend(d.perAction,m.defaults.perAction),t.exports=m},{"../Interactable":4,"../Interaction":5,"../actions/base":6,"../defaultOptions":18,"../interact":21,"../scope":34,"../utils":44,"../utils/Signals":35,"../utils/browser":37,"./InteractableMethods":12}],14:[function(e,t,n){"use strict";var r=e("./base"),i=e("../Interaction");i.signals.on("new",function(e){e.delayTimer=null}),r.signals.on("prepared",function(e){var t=e.interaction,n=t.prepared.name;if(n){var r=t.target.options[n].delay;r>0&&(t.delayTimer=setTimeout(function(){t.start(t.prepared,t.target,t.element)},r))}}),i.signals.on("move",function(e){var t=e.interaction,n=e.duplicate;t.pointerWasMoved&&!n&&clearTimeout(t.delayTimer)}),r.signals.on("before-start",function(e){var t=e.interaction,n=t.prepared.name;if(n){t.target.options[n].delay>0&&(t.prepared.name=null)}})},{"../Interaction":5,"./base":13}],15:[function(e,t,n){"use strict";function r(e,t){if(!t)return!1;var n=t.options.drag.startAxis;return"xy"===e||"xy"===n||n===e}var i=e("./base"),o=e("../scope"),s=e("../utils/browser"),a=e("../utils/is"),l=e("../utils/domUtils"),c=l.matchesSelector,p=l.parentNode;i.setActionDefaults(e("../actions/drag")),i.signals.on("before-start",function(e){var t=e.interaction,n=e.eventTarget,l=e.dx,u=e.dy;if("drag"===t.prepared.name){var d=Math.abs(l),f=Math.abs(u),v=t.target.options.drag,g=v.startAxis,h=d>f?"x":dl.minSpeed&&g>l.endSpeed,b={interaction:t,pageCoords:v,statuses:f,preEnd:!0,requireEndOnly:!0};y&&!x&&(c.resetStatuses(f),m=c.setAll(b),m.shouldMove&&m.locked&&(h=!0)),(x||h)&&(p.copyCoords(i.upCoords,t.curCoords),t.pointers[0]=i.startEvent=new a(t,n,t.prepared.name,"inertiastart",t.element),i.t0=d,i.active=!0,i.allowResume=l.allowResume,t.simulation=i,o.fire(i.startEvent),x?(i.vx0=t.pointerDelta.client.vx,i.vy0=t.pointerDelta.client.vy,i.v0=g,r(t,i),p.extend(v,t.curCoords.page),v.x+=i.xe,v.y+=i.ye,c.resetStatuses(f),m=c.setAll(b),i.modifiedXe+=m.dx,i.modifiedYe+=m.dy,i.i=u.request(t.boundInertiaFrame)):(i.smoothEnd=!0,i.xe=m.dx,i.ye=m.dy,i.sx=i.sy=0,i.i=u.request(t.boundSmoothEndFrame)))}}),l.signals.on("stop-active",function(e){var t=e.interaction,n=t.inertiaStatus;n.active&&(u.cancel(n.i),n.active=!1,t.simulation=null)})},{"./InteractEvent":3,"./Interaction":5,"./modifiers":24,"./utils":44,"./utils/raf":50}],21:[function(e,t,n){"use strict";function r(e,t){var n=a.interactables.get(e,t);return n||(n=new l(e,t),n.events.global=p),n}var i=e("./utils/browser"),o=e("./utils/events"),s=e("./utils"),a=e("./scope"),l=e("./Interactable"),c=e("./Interaction"),p={};r.isSet=function(e,t){return-1!==a.interactables.indexOfElement(e,t&&t.context)},r.on=function(e,t,n){if(s.is.string(e)&&-1!==e.search(" ")&&(e=e.trim().split(/ +/)),s.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.on(f,t,n)}return r}if(s.is.object(e)){for(var v in e)r.on(v,e[v],t);return r}return s.contains(l.eventTypes,e)?p[e]?p[e].push(t):p[e]=[t]:o.add(a.document,e,t,{options:n}),r},r.off=function(e,t,n){if(s.is.string(e)&&-1!==e.search(" ")&&(e=e.trim().split(/ +/)),s.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.off(f,t,n)}return r}if(s.is.object(e)){for(var v in e)r.off(v,e[v],t);return r}if(s.contains(l.eventTypes,e)){var g=void 0;e in p&&-1!==(g=s.indexOf(p[e],t))&&p[e].splice(g,1)}else o.remove(a.document,e,t,n);return r},r.debug=function(){return a},r.getPointerAverage=s.pointerAverage,r.getTouchBBox=s.touchBBox,r.getTouchDistance=s.touchDistance,r.getTouchAngle=s.touchAngle,r.getElementRect=s.getElementRect,r.getElementClientRect=s.getElementClientRect,r.matchesSelector=s.matchesSelector,r.closest=s.closest,r.supportsTouch=function(){return i.supportsTouch},r.supportsPointerEvent=function(){return i.supportsPointerEvent},r.stop=function(e){for(var t=a.interactions.length-1;t>=0;t--)a.interactions[t].stop(e);return r},r.pointerMoveTolerance=function(e){return s.is.number(e)?(c.pointerMoveTolerance=e,this):c.pointerMoveTolerance},r.addDocument=a.addDocument,r.removeDocument=a.removeDocument,a.interact=r,t.exports=r},{"./Interactable":4,"./Interaction":5,"./scope":34,"./utils":44,"./utils/browser":37,"./utils/events":40}],22:[function(e,t,n){"use strict";function r(e){var t=e.interaction,n=e.event;t.target&&t.target.checkAndPreventDefault(n)}var i=e("./Interactable"),o=e("./Interaction"),s=e("./scope"),a=e("./utils/is"),l=e("./utils/events"),c=e("./utils/domUtils"),p=c.nodeContains,u=c.matchesSelector;i.prototype.preventDefault=function(e){return/^(always|never|auto)$/.test(e)?(this.options.preventDefault=e,this):a.bool(e)?(this.options.preventDefault=e?"always":"never",this):this.options.preventDefault},i.prototype.checkAndPreventDefault=function(e){var t=this.options.preventDefault;if("never"!==t)return"always"===t?void e.preventDefault():void(l.supportsOptions||/^(mouse|pointer|touch)*(down|start)/i.test(e.type)||a.element(e.target)&&u(e.target,"input,select,textarea,[contenteditable=true],[contenteditable=true] *")||e.preventDefault())};for(var d=["down","move","up","cancel"],f=0;f=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i;if(o.element&&(o.element===e.target||p(o.element,e.target)))return void o.target.checkAndPreventDefault(e)}}},{"./Interactable":4,"./Interaction":5,"./scope":34,"./utils/domUtils":39,"./utils/events":40,"./utils/is":46}],23:[function(e,t,n){"use strict";function r(e){var t=e.target,n=a.search(e,e.type,t);n&&n.prevTap&&e.clientX===n.prevTap.clientX&&e.clientY===n.prevTap.clientY&&t===n.prevTap.target&&(n.downTargets[0]=t,n.downTimes[0]=(new Date).getTime(),l.fire({interaction:n,event:e,eventTarget:t,pointer:e,type:"tap"}))}var i=e("./scope"),o=e("./utils/events"),s=e("./utils/browser"),a=e("./utils/interactionFinder"),l=e("./pointerEvents/base"),c=e("./utils/window"),p=c.window,u=Object.prototype.toString;if(p.Array.isArray||(p.Array.isArray=function(e){return"[object Array]"===u.call(e)}),String.prototype.trim||(String.prototype.trim=function(){return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")}),s.isIE8){var d=function(e){for(var t=i.interactions,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var o;if(n){if(r>=t.length)break;o=t[r++]}else{if(r=t.next(),r.done)break;o=r.value}var s=o;s.interacting()&&s.target.checkAndPreventDefault(e)}},f=function(e,t){var n=e.doc,i=(e.win,0===t.indexOf("listen")?o.add:o.remove);i(n,"selectstart",d),l&&i(n,"dblclick",r)};i.signals.on("add-document",f),i.signals.on("remove-document",f)}t.exports=null},{"./pointerEvents/base":31,"./scope":34,"./utils/browser":37,"./utils/events":40,"./utils/interactionFinder":45,"./utils/window":52}],24:[function(e,t,n){"use strict";function r(e,t,n){return e&&e.enabled&&(t||!e.endOnly)&&(!n||e.endOnly)}var i=e("../InteractEvent"),o=e("../Interaction"),s=e("../utils/extend"),a={names:[],setOffsets:function(e){var t=e.interaction,n=e.pageCoords,r=t.target,i=t.element,o=t.startOffset,s=r.getRect(i);s?(o.left=n.x-s.left,o.top=n.y-s.top,o.right=s.right-n.x,o.bottom=s.bottom-n.y,"width"in s||(s.width=s.right-s.left),"height"in s||(s.height=s.bottom-s.top)):o.left=o.top=o.right=o.bottom=0,e.rect=s,e.interactable=r,e.element=i;for(var l=0;l=p.length)break;f=p[d++]}else{if(d=p.next(),d.done)break;f=d.value}var v=f,g=a[v],h=t.target.options[t.prepared.name][v];r(h,i,o)&&(e.status=e.status=n[v],e.options=h,e.offset=e.interaction.modifierOffsets[v],g.set(e),e.status.locked&&(l.x+=e.status.dx,l.y+=e.status.dy,c.dx+=e.status.dx,c.dy+=e.status.dy,c.locked=!0))}return c.shouldMove=!e.status||!c.locked||e.status.changed,c},resetStatuses:function(e){for(var t=a.names,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var i;if(n){if(r>=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i,s=e[o]||{};s.dx=s.dy=0,s.modifiedX=s.modifiedY=NaN,s.locked=!1,s.changed=!0,e[o]=s}return e},start:function(e,t){var n=e.interaction,r={interaction:n,pageCoords:("action-resume"===t?n.curCoords:n.startCoords).page,startOffset:n.startOffset,statuses:n.modifierStatuses,preEnd:!1,requireEndOnly:!1};a.setOffsets(r),a.resetStatuses(r.statuses),r.pageCoords=s({},n.startCoords.page),n.modifierResult=a.setAll(r)}};o.signals.on("new",function(e){e.startOffset={left:0,right:0,top:0,bottom:0},e.modifierOffsets={},e.modifierStatuses=a.resetStatuses({}),e.modifierResult=null}),o.signals.on("action-start",a.start),o.signals.on("action-resume",a.start),o.signals.on("before-action-move",function(e){var t=e.interaction,n=e.preEnd,r=e.interactingBeforeMove,i=a.setAll({interaction:t,preEnd:n,pageCoords:t.curCoords.page,statuses:t.modifierStatuses,requireEndOnly:!1});!i.shouldMove&&r&&(t._dontFireMove=!0),t.modifierResult=i}),o.signals.on("action-end",function(e){for(var t=e.interaction,n=e.event,i=0;i=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}var m=h,y=m.x,x=m.y;l.push({x:s.left-i.width*y+u.x,y:s.top-i.height*x+u.y})}else l.push(u);return l},set:function(e){var t=e.interaction,n=e.pageCoords,r=e.status,i=e.options,s=e.offset,a=[],l=void 0,c=void 0,p=void 0;if(r.useStatusXY)c={x:r.x,y:r.y};else{var u=o.getOriginXY(t.target,t.element,t.prepared.name);c=o.extend({},n),c.x-=u.x,c.y-=u.y}r.realX=c.x,r.realY=c.y;for(var d=i.targets?i.targets.length:0,f=s,v=Array.isArray(f),g=0,f=v?f:f[Symbol.iterator]();;){var h;if(v){if(g>=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}for(var m=h,y=m.x,x=m.y,b=c.x-y,w=c.y-x,E=i.targets,S=Array.isArray(E),T=0,E=S?E:E[Symbol.iterator]();;){var C;if(S){if(T>=E.length)break;C=E[T++]}else{if(T=E.next(),T.done)break;C=T.value}var A=C;l=o.is.function(A)?A(b,w,t):A,l&&a.push({x:o.is.number(l.x)?l.x+y:b,y:o.is.number(l.y)?l.y+x:w,range:o.is.number(l.range)?l.range:i.range})}}var D={target:null,inRange:!1,distance:0,range:0,dx:0,dy:0};for(p=0,d=a.length;p=p.length)break;f=p[d++]}else{if(d=p.next(),d.done)break;f=d.value}var v=f,g=void 0;g=a.is.function(v)?v(l,c,t):v,g&&("width"in g&&"height"in g&&(g.x=g.width,g.y=g.height),e.options.targets.push(g))}i.set(e)},modifyCoords:function(e){var t=e.options;e.options=a.extend({},t), -e.options.enabled=t.enabled,e.options.relativePoints=[null],i.modifyCoords(e)}};r.snapSize=l,r.names.push("snapSize"),o.perAction.snapSize=l.defaults,s.defaults.snapSize=l.defaults,t.exports=l},{"../actions/resize":10,"../defaultOptions":18,"../utils/":44,"./index":24,"./snap":28}],30:[function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=e("../utils/pointerUtils");t.exports=function(){function e(t,n,o,s,a){if(r(this,e),i.pointerExtend(this,o),o!==n&&i.pointerExtend(this,n),this.interaction=a,this.timeStamp=(new Date).getTime(),this.originalEvent=o,this.type=t,this.pointerId=i.getPointerId(n),this.pointerType=i.getPointerType(n,a),this.target=s,this.currentTarget=null,"tap"===t){var l=a.getPointerIndex(n);this.dt=this.timeStamp-a.downTimes[l];var c=this.timeStamp-a.tapTime;this.double=!!(a.prevTap&&"doubletap"!==a.prevTap.type&&a.prevTap.target===this.target&&c<500)}else"doubletap"===t&&(this.dt=n.timeStamp-a.tapTime)}return e.prototype.subtractOrigin=function(e){var t=e.x,n=e.y;return this.pageX-=t,this.pageY-=n,this.clientX-=t,this.clientY-=n,this},e.prototype.addOrigin=function(e){var t=e.x,n=e.y;return this.pageX+=t,this.pageY+=n,this.clientX+=t,this.clientY+=n,this},e.prototype.preventDefault=function(){this.originalEvent.preventDefault()},e.prototype.stopPropagation=function(){this.propagationStopped=!0},e.prototype.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},e}()},{"../utils/pointerUtils":49}],31:[function(e,t,n){"use strict";function r(e){for(var t=e.interaction,n=e.pointer,s=e.event,l=e.eventTarget,c=e.type,u=void 0===c?e.pointerEvent.type:c,d=e.targets,f=void 0===d?i(e):d,v=e.pointerEvent,g=void 0===v?new o(u,n,s,l,t):v,h={interaction:t,pointer:n,event:s,eventTarget:l,targets:f,type:u,pointerEvent:g},m=0;m=u.length)break;g=u[v++]}else{if(v=u.next(),v.done)break;g=v.value}var h=g;c.element=h,p.fire("collect-targets",c)}return"hold"===o&&(c.targets=d(c.targets,function(e){return e.eventable.options.holdDuration===t.holdTimers[s].duration})),c.targets}var o=e("./PointerEvent"),s=e("../Interaction"),a=e("../utils"),l=e("../utils/browser"),c=e("../defaultOptions"),p=e("../utils/Signals").new(),u=e("../utils/arr"),d=u.filter,f=["down","up","cancel"],v=["down","up","cancel"],g={PointerEvent:o,fire:r,collectEventTargets:i,signals:p,defaults:{holdDuration:600,ignoreFrom:null,allowFrom:null,origin:{x:0,y:0}},types:["down","move","up","cancel","tap","doubletap","hold"]};s.signals.on("update-pointer-down",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers[n]={duration:1/0,timeout:null}}),s.signals.on("remove-pointer",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers.splice(n,1)}),s.signals.on("move",function(e){var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,s=e.duplicateMove,a=t.getPointerIndex(n);s||t.pointerIsDown&&!t.pointerWasMoved||(t.pointerIsDown&&clearTimeout(t.holdTimers[a].timeout),r({interaction:t,pointer:n,event:i,eventTarget:o,type:"move"}))}),s.signals.on("down",function(e){for(var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,s=e.pointerIndex,c=l.isIE8?a.extend({},i):i,u=t.holdTimers[s],d=a.getPath(o),f={interaction:t,pointer:n,event:i,eventTarget:o,type:"hold",targets:[],path:d,element:null},v=d,g=Array.isArray(v),h=0,v=g?v:v[Symbol.iterator]();;){var m;if(g){if(h>=v.length)break;m=v[h++]}else{if(h=v.next(),h.done)break;m=h.value}var y=m;f.element=y,p.fire("collect-targets",f)}if(f.targets.length){for(var x=1/0,b=0;b=0&&(p.selectors[u]!==e||p.contexts[u]!==t);u--);-1===u&&(u=p.selectors.length,p.selectors.push(e),p.contexts.push(t),p.listeners.push([])),p.listeners[u].push([i,!!s.capture,s.passive])}function s(e,t,n,r,o){var s=f(o),c=O[n],p=!1,u=void 0;if(c)for(u=c.selectors.length-1;u>=0;u--)if(c.selectors[u]===e&&c.contexts[u]===t){for(var d=c.listeners[u],v=d.length-1;v>=0;v--){var g=d[v],h=g[0],m=g[1],y=g[2];if(h===r&&m===!!s.capture&&y===s.passive){d.splice(v,1),d.length||(c.selectors.splice(u,1),c.contexts.splice(u,1),c.listeners.splice(u,1),i(t,n,a),i(t,n,l,!0),c.selectors.length||(O[n]=null)),p=!0;break}}if(p)break}}function a(e,t){var n=f(t),r={},i=O[e.type],o=g.getActualElement(e.path?e.path[0]:e.target),s=o;for(h(r,e),r.originalEvent=e,r.preventDefault=p;v.element(s);){for(var a=0;a=l.length)break;u=l[p++]}else{if(p=l.next(),p.done)break;u=p.value}var d=u,f=s[d](a);if(f)return f}},simulationResume:function(e){var t=e.mouseEvent,n=e.eventType,o=e.eventTarget;if(!/down|start/i.test(n))return null;for(var s=r.interactions,a=Array.isArray(s),l=0,s=a?s:s[Symbol.iterator]();;){var c;if(a){if(l>=s.length)break;c=s[l++]}else{if(l=s.next(),l.done)break;c=l.value}var p=c,u=o;if(p.simulation&&p.simulation.allowResume&&p.mouse===t)for(;u;){if(u===p.element)return p;u=i.parentNode(u)}}return null},mouse:function(e){var t=e.pointerId,n=e.mouseEvent,s=e.eventType;if(!n&&(o.supportsTouch||o.supportsPointerEvent))return null;for(var a=void 0,l=r.interactions,c=Array.isArray(l),p=0,l=c?l:l[Symbol.iterator]();;){var u;if(c){if(p>=l.length)break;u=l[p++]}else{if(p=l.next(),p.done)break;u=p.value}var d=u;if(d.mouse){if(d.simulation&&!i.contains(d.pointerIds,t))continue;if(d.interacting())return d;a||(a=d)}}if(a)return a;for(var f=r.interactions,v=Array.isArray(f),g=0,f=v?f:f[Symbol.iterator]();;){var h;if(v){if(g>=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}var m=h;if(m.mouse&&(!/down/.test(s)||!m.simulation))return m}return null},hasPointer:function(e){for(var t=e.pointerId,n=r.interactions,o=Array.isArray(n),s=0,n=o?n:n[Symbol.iterator]();;){var a;if(o){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var l=a;if(i.contains(l.pointerIds,t))return l}},idle:function(e){for(var t=e.mouseEvent,n=r.interactions,i=Array.isArray(n),o=0,n=i?n:n[Symbol.iterator]();;){var s;if(i){if(o>=n.length)break;s=n[o++]}else{if(o=n.next(),o.done)break;s=o.value}var a=s;if(1===a.pointerIds.length){var l=a.target;if(l&&!l.options.gesture.enabled)continue}else if(a.pointerIds.length>=2)continue;if(!a.interacting()&&t===a.mouse)return a}return null}};t.exports=s},{"../scope":34,"./browser":37,"./index":44}],46:[function(e,t,n){"use strict";var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},i=e("./window"),o=e("./isWindow"),s={array:function(){},window:function(e){return e===i.window||o(e)},docFrag:function(e){return s.object(e)&&11===e.nodeType},object:function(e){return!!e&&"object"===(void 0===e?"undefined":r(e))},function:function(e){return"function"==typeof e},number:function(e){return"number"==typeof e},bool:function(e){return"boolean"==typeof e},string:function(e){return"string"==typeof e},element:function(e){if(!e||"object"!==(void 0===e?"undefined":r(e)))return!1;var t=i.getWindow(e)||i.window;return/object|function/.test(r(t.Element))?e instanceof t.Element:1===e.nodeType&&"string"==typeof e.nodeName}};s.array=function(e){return s.object(e)&&void 0!==e.length&&s.function(e.splice)},t.exports=s},{"./isWindow":47,"./window":52}],47:[function(e,t,n){"use strict";t.exports=function(e){return!(!e||!e.Window)&&e instanceof e.Window}},{}],48:[function(e,t,n){"use strict";function r(e,n){for(var r in n){var i=t.exports.prefixedPropREs,o=!1;for(var s in i)if(0===r.indexOf(s)&&i[s].test(r)){o=!0;break}o||"function"==typeof n[r]||(e[r]=n[r])}return e}r.prefixedPropREs={webkit:/(Movement[XY]|Radius[XY]|RotationAngle|Force)$/},t.exports=r},{}],49:[function(e,t,n){"use strict";var r=e("./hypot"),i=e("./browser"),o=e("./domObjects"),s=e("./domUtils"),a=e("./is"),l=e("./pointerExtend"),c={copyCoords:function(e,t){e.page=e.page||{},e.page.x=t.page.x,e.page.y=t.page.y,e.client=e.client||{},e.client.x=t.client.x,e.client.y=t.client.y,e.timeStamp=t.timeStamp},setCoordDeltas:function(e,t,n){e.page.x=n.page.x-t.page.x,e.page.y=n.page.y-t.page.y,e.client.x=n.client.x-t.client.x,e.client.y=n.client.y-t.client.y,e.timeStamp=n.timeStamp-t.timeStamp;var i=Math.max(e.timeStamp/1e3,.001);e.page.speed=r(e.page.x,e.page.y)/i,e.page.vx=e.page.x/i,e.page.vy=e.page.y/i,e.client.speed=r(e.client.x,e.page.y)/i,e.client.vx=e.client.x/i,e.client.vy=e.client.y/i},isNativePointer:function(e){return e instanceof o.Event||e instanceof o.Touch},getXY:function(e,t,n){return n=n||{},e=e||"page",n.x=t[e+"X"],n.y=t[e+"Y"],n},getPageXY:function(e,t){return t=t||{},i.isOperaMobile&&c.isNativePointer(e)?(c.getXY("screen",e,t),t.x+=window.scrollX,t.y+=window.scrollY):c.getXY("page",e,t),t},getClientXY:function(e,t){return t=t||{},i.isOperaMobile&&c.isNativePointer(e)?c.getXY("screen",e,t):c.getXY("client",e,t),t},getPointerId:function(e){return a.number(e.pointerId)?e.pointerId:e.identifier},setCoords:function(e,t,n){var r=t.length>1?c.pointerAverage(t):t[0],i={};c.getPageXY(r,i),e.page.x=i.x,e.page.y=i.y,c.getClientXY(r,i),e.client.x=i.x,e.client.y=i.y,e.timeStamp=a.number(n)?n:(new Date).getTime()},pointerExtend:l,getTouchPair:function(e){var t=[];return a.array(e)?(t[0]=e[0],t[1]=e[1]):"touchend"===e.type?1===e.touches.length?(t[0]=e.touches[0],t[1]=e.changedTouches[0]):0===e.touches.length&&(t[0]=e.changedTouches[0],t[1]=e.changedTouches[1]):(t[0]=e.touches[0],t[1]=e.touches[1]),t},pointerAverage:function(e){for(var t={pageX:0,pageY:0,clientX:0,clientY:0,screenX:0,screenY:0},n=e,r=Array.isArray(n),i=0,n=r?n:n[Symbol.iterator]();;){var o;if(r){if(i>=n.length)break;o=n[i++]}else{if(i=n.next(),i.done)break;o=i.value}var s=o;for(var a in t)t[a]+=s[a]}for(var l in t)t[l]/=e.length;return t},touchBBox:function(e){if(e.length||e.touches&&e.touches.length>1){var t=c.getTouchPair(e),n=Math.min(t[0].pageX,t[1].pageX),r=Math.min(t[0].pageY,t[1].pageY);return{x:n,y:r,left:n,top:r,width:Math.max(t[0].pageX,t[1].pageX)-n,height:Math.max(t[0].pageY,t[1].pageY)-r}}},touchDistance:function(e,t){var n=t+"X",i=t+"Y",o=c.getTouchPair(e),s=o[0][n]-o[1][n],a=o[0][i]-o[1][i];return r(s,a)},touchAngle:function(e,t,n){var r=n+"X",i=n+"Y",o=c.getTouchPair(e),s=o[1][r]-o[0][r],a=o[1][i]-o[0][i];return 180*Math.atan2(a,s)/Math.PI},getPointerType:function(e,t){return t.mouse?"mouse":i.supportsPointerEvent?a.string(e.pointerType)?e.pointerType:[void 0,void 0,"touch","pen","mouse"][e.pointerType]:"touch"},getEventTargets:function(e){return[s.getActualElement(e.path?e.path[0]:e.target),s.getActualElement(e.currentTarget)]}};t.exports=c},{"./browser":37,"./domObjects":38,"./domUtils":39,"./hypot":43,"./is":46,"./pointerExtend":48}],50:[function(e,t,n){"use strict";for(var r=e("./window"),i=r.window,o=["ms","moz","webkit","o"],s=0,a=void 0,l=void 0,c=0;c6&&void 0!==arguments[6]&&arguments[6];r(this,e);var f=t.target,v=(f&&f.options||s).deltaSource,g=o(f,p,l),h="start"===c,m="end"===c,y=h?t.startCoords:t.curCoords,x=t.prevEvent;p=p||t.element;var b=i({},y.page),w=i({},y.client);b.x-=g.x,b.y-=g.y,w.x-=g.x,w.y-=g.y,this.ctrlKey=n.ctrlKey,this.altKey=n.altKey,this.shiftKey=n.shiftKey,this.metaKey=n.metaKey,this.button=n.button,this.buttons=n.buttons,this.target=p,this.currentTarget=p,this.relatedTarget=u||null,this.preEnd=d,this.type=l+(c||""),this.interaction=t,this.interactable=f,this.t0=h?t.downTimes[t.downTimes.length-1]:x.t0;var E={interaction:t,event:n,action:l,phase:c,element:p,related:u,page:b,client:w,coords:y,starting:h,ending:m,deltaSource:v,iEvent:this};a.fire("set-xy",E),m?(this.pageX=x.pageX,this.pageY=x.pageY,this.clientX=x.clientX,this.clientY=x.clientY):(this.pageX=b.x,this.pageY=b.y,this.clientX=w.x,this.clientY=w.y),this.x0=t.startCoords.page.x-g.x,this.y0=t.startCoords.page.y-g.y,this.clientX0=t.startCoords.client.x-g.x,this.clientY0=t.startCoords.client.y-g.y,a.fire("set-delta",E),this.timeStamp=y.timeStamp,this.dt=t.pointerDelta.timeStamp,this.duration=this.timeStamp-this.t0,this.speed=t.pointerDelta[v].speed,this.velocityX=t.pointerDelta[v].vx,this.velocityY=t.pointerDelta[v].vy,this.swipe=m||"inertiastart"===c?this.getSwipe():null,a.fire("new",E)}return e.prototype.getSwipe=function(){var e=this.interaction;if(e.prevEvent.speed<600||this.timeStamp-e.prevEvent.timeStamp>150)return null;var t=180*Math.atan2(e.prevEvent.velocityY,e.prevEvent.velocityX)/Math.PI;t<0&&(t+=360);var n=112.5<=t&&t<247.5,r=202.5<=t&&t<337.5,i=!n&&(292.5<=t||t<67.5);return{up:r,down:!r&&22.5<=t&&t<157.5,left:n,right:i,angle:t,speed:e.prevEvent.speed,velocity:{x:e.prevEvent.velocityX,y:e.prevEvent.velocityY}}},e.prototype.preventDefault=function(){},e.prototype.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},e.prototype.stopPropagation=function(){this.propagationStopped=!0},e}();a.on("set-delta",function(e){var t=e.iEvent,n=e.interaction,r=e.starting,i=e.deltaSource,o=r?t:n.prevEvent;"client"===i?(t.dx=t.clientX-o.clientX,t.dy=t.clientY-o.clientY):(t.dx=t.pageX-o.pageX,t.dy=t.pageY-o.pageY)}),l.signals=a,t.exports=l},{"./defaultOptions":18,"./utils/Signals":35,"./utils/extend":41,"./utils/getOriginXY":42}],4:[function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=e("./utils/is"),o=e("./utils/events"),s=e("./utils/extend"),a=e("./actions/base"),l=e("./scope"),c=e("./Eventable"),p=e("./defaultOptions"),u=e("./utils/Signals").new(),d=e("./utils/domUtils"),f=d.getElementRect,v=d.nodeContains,g=d.trySelector,h=e("./utils/window"),m=h.getWindow,y=e("./utils/arr"),x=y.indexOf,b=y.contains,w=e("./utils/browser"),E=w.wheelEvent;l.interactables=[];var S=function(){function e(t,n){r(this,e),n=n||{},this.target=t,this.events=new c,this._context=n.context||l.document,this._win=m(g(t)?this._context:t),this._doc=this._win.document,u.fire("new",{target:t,options:n,interactable:this,win:this._win}),l.addDocument(this._doc,this._win),l.interactables.push(this),this.set(n)}return e.prototype.setOnEvents=function(e,t){var n="on"+e;return i.function(t.onstart)&&(this.events[n+"start"]=t.onstart),i.function(t.onmove)&&(this.events[n+"move"]=t.onmove),i.function(t.onend)&&(this.events[n+"end"]=t.onend),i.function(t.oninertiastart)&&(this.events[n+"inertiastart"]=t.oninertiastart),this},e.prototype.setPerAction=function(e,t){for(var n in t)n in p[e]&&(i.object(t[n])?(this.options[e][n]=s(this.options[e][n]||{},t[n]),i.object(p.perAction[n])&&"enabled"in p.perAction[n]&&(this.options[e][n].enabled=!1!==t[n].enabled)):i.bool(t[n])&&i.object(p.perAction[n])?this.options[e][n].enabled=t[n]:void 0!==t[n]&&(this.options[e][n]=t[n]))},e.prototype.getRect=function(e){return e=e||this.target,i.string(this.target)&&!i.element(e)&&(e=this._context.querySelector(this.target)),f(e)},e.prototype.rectChecker=function(e){return i.function(e)?(this.getRect=e,this):null===e?(delete this.options.getRect,this):this.getRect},e.prototype._backCompatOption=function(e,t){if(g(t)||i.object(t)){this.options[e]=t;for(var n=a.names,r=Array.isArray(n),o=0,n=r?n:n[Symbol.iterator]();;){var s;if(r){if(o>=n.length)break;s=n[o++]}else{if(o=n.next(),o.done)break;s=o.value}var l=s;this.options[l][e]=t}return this}return this.options[e]},e.prototype.origin=function(e){return this._backCompatOption("origin",e)},e.prototype.deltaSource=function(e){return"page"===e||"client"===e?(this.options.deltaSource=e,this):this.options.deltaSource},e.prototype.context=function(){return this._context},e.prototype.inContext=function(e){return this._context===e.ownerDocument||v(this._context,e)},e.prototype.fire=function(e){return this.events.fire(e),this},e.prototype._onOffMultiple=function(e,t,n,r){if(i.string(t)&&-1!==t.search(" ")&&(t=t.trim().split(/ +/)),i.array(t)){for(var o=0;o=l.length)break;f=l[d++]}else{if(d=l.next(),d.done)break;f=d.value}var v=f;this.options[v]=p.base[v],v in t&&this[v](t[v])}return u.fire("set",{options:t,interactable:this}),this},e.prototype.unset=function(){if(o.remove(this.target,"all"),i.string(this.target))for(var e in o.delegatedEvents){var t=o.delegatedEvents[e];t.selectors[0]===this.target&&t.contexts[0]===this._context&&(t.selectors.splice(0,1),t.contexts.splice(0,1),t.listeners.splice(0,1),t.selectors.length||(t[e]=null)),o.remove(this._context,e,o.delegateListener),o.remove(this._context,e,o.delegateUseCapture,!0)}else o.remove(this,"all");u.fire("unset",{interactable:this}),l.interactables.splice(x(l.interactables,this),1);for(var n=l.interactions||[],r=Array.isArray(n),s=0,n=r?n:n[Symbol.iterator]();;){var a;if(r){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var c=a;c.target===this&&c.interacting()&&c.stop()}return l.interact},e}();l.interactables.indexOfElement=function(e,t){t=t||l.document;for(var n=0;n=x.length)break;E=x[w++]}else{if(w=x.next(),w.done)break;E=w.value}var S=E,T=S[0],C=S[1];C._updateEventTargets(i,o),C[e](T,t,i,o)}}}function o(e){for(var t=0;te.pointerMoveTolerance);var a={pointer:t,pointerIndex:this.getPointerIndex(t),event:n,eventTarget:r,dx:o,dy:s,duplicate:i,interaction:this,interactingBeforeMove:this.interacting()};i||l.setCoordDeltas(this.pointerDelta,this.prevCoords,this.curCoords),f.fire("move",a),i||(this.interacting()&&this.doMove(a),this.pointerWasMoved&&l.copyCoords(this.prevCoords,this.curCoords))},e.prototype.doMove=function(e){e=l.extend({pointer:this.pointers[0],event:this.prevEvent,eventTarget:this._eventTarget,interaction:this},e||{}),f.fire("before-action-move",e),this._dontFireMove||f.fire("action-move",e),this._dontFireMove=!1},e.prototype.pointerUp=function(e,t,n,r){var i=this.getPointerIndex(e);f.fire(/cancel$/i.test(t.type)?"cancel":"up",{pointer:e,pointerIndex:i,event:t,eventTarget:n,curEventTarget:r,interaction:this}),this.simulation||this.end(t),this.pointerIsDown=!1,this.removePointer(e,t)},e.prototype.end=function(e){e=e||this.prevEvent,this.interacting()&&f.fire("action-end",{event:e,interaction:this}),this.stop()},e.prototype.currentAction=function(){return this._interacting?this.prepared.name:null},e.prototype.interacting=function(){return this._interacting},e.prototype.stop=function(){f.fire("stop",{interaction:this}),this._interacting&&(f.fire("stop-active",{interaction:this}),f.fire("stop-"+this.prepared.name,{interaction:this})),this.target=this.element=null,this._interacting=!1,this.prepared.name=this.prevEvent=null},e.prototype.getPointerIndex=function(e){return"mouse"===this.pointerType||"pen"===this.pointerType?0:l.indexOf(this.pointerIds,l.getPointerId(e))},e.prototype.updatePointer=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:t&&/(down|start)$/i.test(t.type),r=l.getPointerId(e),i=this.getPointerIndex(e);return-1===i&&(i=this.pointerIds.length,this.pointerIds[i]=r),n&&f.fire("update-pointer-down",{pointer:e,event:t,down:n,pointerId:r,pointerIndex:i,interaction:this}),this.pointers[i]=e,i},e.prototype.removePointer=function(e,t){var n=this.getPointerIndex(e);-1!==n&&(f.fire("remove-pointer",{pointer:e,event:t,pointerIndex:n,interaction:this}),this.pointers.splice(n,1),this.pointerIds.splice(n,1),this.downTargets.splice(n,1),this.downTimes.splice(n,1))},e.prototype._updateEventTargets=function(e,t){this._eventTarget=e,this._curEventTarget=t},e}(),y=0,x=g.length;y=i.length)break;a=i[s++]}else{if(s=i.next(),s.done)break;a=s.value}var l=a;if(l.options.drop.enabled){var c=l.options.drop.accept;if(!(p.is.element(c)&&c!==t||p.is.string(c)&&!p.matchesSelector(t,c)))for(var d=p.is.string(l.target)?l._context.querySelectorAll(l.target):[l.target],f=0;fo.left&&c.xo.top&&c.y=o.left&&v<=o.right&&g>=o.top&&g<=o.bottom}if(f&&p.is.number(a)){s=Math.max(0,Math.min(o.right,f.right)-Math.max(o.left,f.left))*Math.max(0,Math.min(o.bottom,f.bottom)-Math.max(o.top,f.top))/(f.width*f.height)>=a}return this.options.drop.checker&&(s=this.options.drop.checker(e,t,s,this,i,n,r)),s},v.signals.on("unset",function(e){e.interactable.dropzone(!1)}),v.settingsMethods.push("dropChecker"),g.signals.on("new",function(e){e.dropTarget=null,e.dropElement=null,e.prevDropTarget=null,e.prevDropElement=null,e.dropEvents=null,e.activeDrops={dropzones:[],elements:[],rects:[]}}),g.signals.on("stop",function(e){var t=e.interaction;t.dropTarget=t.dropElement=t.prevDropTarget=t.prevDropElement=null}),d.dynamicDrop=function(e){return p.is.bool(e)?(y=e,d):y},p.merge(v.eventTypes,["dragenter","dragleave","dropactivate","dropdeactivate","dropmove","drop"]),c.methodDict.drop="dropzone",h.drop=m.defaults,t.exports=m},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../interact":21,"../scope":34,"../utils":44,"./base":6}],9:[function(e,t,n){"use strict";var r=e("./base"),i=e("../utils"),o=e("../InteractEvent"),s=e("../Interactable"),a=e("../Interaction"),l=e("../defaultOptions"),c={defaults:{enabled:!1,origin:null,restrict:null},checker:function(e,t,n,r,i){return i.pointerIds.length>=2?{name:"gesture"}:null},getCursor:function(){return""}};o.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;"gesturestart"===t.type&&(t.ds=0,n.gesture.startDistance=n.gesture.prevDistance=t.distance,n.gesture.startAngle=n.gesture.prevAngle=t.angle,n.gesture.scale=1)}),o.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;"gesturemove"===t.type&&(t.ds=t.scale-n.gesture.scale,n.target.fire(t),n.gesture.prevAngle=t.angle,n.gesture.prevDistance=t.distance,t.scale===1/0||null===t.scale||void 0===t.scale||isNaN(t.scale)||(n.gesture.scale=t.scale))}),s.prototype.gesturable=function(e){return i.is.object(e)?(this.options.gesture.enabled=!1!==e.enabled,this.setPerAction("gesture",e),this.setOnEvents("gesture",e),this):i.is.bool(e)?(this.options.gesture.enabled=e,e||(this.ongesturestart=this.ongesturestart=this.ongestureend=null),this):this.options.gesture},o.signals.on("set-delta",function(e){var t=e.interaction,n=e.iEvent,r=e.action,s=e.event,a=e.starting,l=e.ending,c=e.deltaSource;if("gesture"===r){var p=t.pointers;n.touches=[p[0],p[1]],a?(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=1,n.ds=0,n.angle=i.touchAngle(p,void 0,c),n.da=0):l||s instanceof o?(n.distance=t.prevEvent.distance,n.box=t.prevEvent.box,n.scale=t.prevEvent.scale,n.ds=n.scale-1,n.angle=t.prevEvent.angle,n.da=n.angle-t.gesture.startAngle):(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=n.distance/t.gesture.startDistance,n.angle=i.touchAngle(p,t.gesture.prevAngle,c),n.ds=n.scale-t.gesture.prevScale,n.da=n.angle-t.gesture.prevAngle)}}),a.signals.on("new",function(e){e.gesture={start:{x:0,y:0},startDistance:0,prevDistance:0,distance:0,scale:1,startAngle:0,prevAngle:0}}),r.gesture=c,r.names.push("gesture"),i.merge(s.eventTypes,["gesturestart","gesturemove","gestureend"]),r.methodDict.gesture="gesturable",l.gesture=c.defaults,t.exports=c},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"./base":6}],10:[function(e,t,n){"use strict";function r(e,t,n,r,i,s,a){if(!t)return!1;if(!0===t){var l=o.is.number(s.width)?s.width:s.right-s.left,c=o.is.number(s.height)?s.height:s.bottom-s.top;if(l<0&&("left"===e?e="right":"right"===e&&(e="left")),c<0&&("top"===e?e="bottom":"bottom"===e&&(e="top")),"left"===e)return n.x<(l>=0?s.left:s.right)+a;if("top"===e)return n.y<(c>=0?s.top:s.bottom)+a;if("right"===e)return n.x>(l>=0?s.right:s.left)-a;if("bottom"===e)return n.y>(c>=0?s.bottom:s.top)-a}return!!o.is.element(r)&&(o.is.element(t)?t===r:o.matchesUpTo(r,t,i))}var i=e("./base"),o=e("../utils"),s=e("../utils/browser"),a=e("../InteractEvent"),l=e("../Interactable"),c=e("../Interaction"),p=e("../defaultOptions"),u=s.supportsTouch||s.supportsPointerEvent?20:10,d={defaults:{enabled:!1,mouseButtons:null,origin:null,snap:null,restrict:null,inertia:null,autoScroll:null,square:!1,preserveAspectRatio:!1,axis:"xy",margin:NaN,edges:null,invert:"none"},checker:function(e,t,n,i,s,a){if(!a)return null;var l=o.extend({},s.curCoords.page),c=n.options;if(c.resize.enabled){var p=c.resize,d={left:!1,right:!1,top:!1,bottom:!1};if(o.is.object(p.edges)){for(var f in d)d[f]=r(f,p.edges[f],l,s._eventTarget,i,a,p.margin||u);if(d.left=d.left&&!d.right,d.top=d.top&&!d.bottom,d.left||d.right||d.top||d.bottom)return{name:"resize",edges:d}}else{var v="y"!==c.resize.axis&&l.x>a.right-u,g="x"!==c.resize.axis&&l.y>a.bottom-u;if(v||g)return{name:"resize",axes:(v?"x":"")+(g?"y":"")}}}return null},cursors:s.isIe9OrOlder?{x:"e-resize",y:"s-resize",xy:"se-resize",top:"n-resize",left:"w-resize",bottom:"s-resize",right:"e-resize",topleft:"se-resize",bottomright:"se-resize",topright:"ne-resize",bottomleft:"ne-resize"}:{x:"ew-resize",y:"ns-resize",xy:"nwse-resize",top:"ns-resize",left:"ew-resize",bottom:"ns-resize",right:"ew-resize",topleft:"nwse-resize",bottomright:"nwse-resize",topright:"nesw-resize",bottomleft:"nesw-resize"},getCursor:function(e){if(e.axis)return d.cursors[e.name+e.axis];if(e.edges){for(var t="",n=["top","bottom","left","right"],r=0;r<4;r++)e.edges[n[r]]&&(t+=n[r]);return d.cursors[t]}}};a.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;if("resizestart"===t.type&&n.prepared.edges){var r=n.target.getRect(n.element),i=n.target.options.resize;if(i.square||i.preserveAspectRatio){var s=o.extend({},n.prepared.edges);s.top=s.top||s.left&&!s.bottom,s.left=s.left||s.top&&!s.right,s.bottom=s.bottom||s.right&&!s.top,s.right=s.right||s.bottom&&!s.left,n.prepared._linkedEdges=s}else n.prepared._linkedEdges=null;i.preserveAspectRatio&&(n.resizeStartAspectRatio=r.width/r.height),n.resizeRects={start:r,current:o.extend({},r),inverted:o.extend({},r),previous:o.extend({},r),delta:{left:0,right:0,width:0,top:0,bottom:0,height:0}},t.rect=n.resizeRects.inverted,t.deltaRect=n.resizeRects.delta}}),a.signals.on("new",function(e){var t=e.iEvent,n=e.phase,r=e.interaction;if("move"===n&&r.prepared.edges){var i=r.target.options.resize,s=i.invert,a="reposition"===s||"negate"===s,l=r.prepared.edges,c=r.resizeRects.start,p=r.resizeRects.current,u=r.resizeRects.inverted,d=r.resizeRects.delta,f=o.extend(r.resizeRects.previous,u),v=l,g=t.dx,h=t.dy;if(i.preserveAspectRatio||i.square){var m=i.preserveAspectRatio?r.resizeStartAspectRatio:1;l=r.prepared._linkedEdges,v.left&&v.bottom||v.right&&v.top?h=-g/m:v.left||v.right?h=g/m:(v.top||v.bottom)&&(g=h*m)}if(l.top&&(p.top+=h),l.bottom&&(p.bottom+=h),l.left&&(p.left+=g),l.right&&(p.right+=g),a){if(o.extend(u,p),"reposition"===s){var y=void 0;u.top>u.bottom&&(y=u.top,u.top=u.bottom,u.bottom=y),u.left>u.right&&(y=u.left,u.left=u.right,u.right=y)}}else u.top=Math.min(p.top,c.bottom),u.bottom=Math.max(p.bottom,c.top),u.left=Math.min(p.left,c.right),u.right=Math.max(p.right,c.left);u.width=u.right-u.left,u.height=u.bottom-u.top;for(var x in u)d[x]=u[x]-f[x];t.edges=r.prepared.edges,t.rect=u,t.deltaRect=d}}),l.prototype.resizable=function(e){return o.is.object(e)?(this.options.resize.enabled=!1!==e.enabled,this.setPerAction("resize",e),this.setOnEvents("resize",e),/^x$|^y$|^xy$/.test(e.axis)?this.options.resize.axis=e.axis:null===e.axis&&(this.options.resize.axis=p.resize.axis),o.is.bool(e.preserveAspectRatio)?this.options.resize.preserveAspectRatio=e.preserveAspectRatio:o.is.bool(e.square)&&(this.options.resize.square=e.square),this):o.is.bool(e)?(this.options.resize.enabled=e, +e||(this.onresizestart=this.onresizestart=this.onresizeend=null),this):this.options.resize},c.signals.on("new",function(e){e.resizeAxes="xy"}),a.signals.on("set-delta",function(e){var t=e.interaction,n=e.iEvent;"resize"===e.action&&t.resizeAxes&&(t.target.options.resize.square?("y"===t.resizeAxes?n.dx=n.dy:n.dy=n.dx,n.axes="xy"):(n.axes=t.resizeAxes,"x"===t.resizeAxes?n.dy=0:"y"===t.resizeAxes&&(n.dx=0)))}),i.resize=d,i.names.push("resize"),o.merge(l.eventTypes,["resizestart","resizemove","resizeinertiastart","resizeinertiaresume","resizeend"]),i.methodDict.resize="resizable",p.resize=d.defaults,t.exports=d},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"../utils/browser":37,"./base":6}],11:[function(e,t,n){"use strict";var r=e("./utils/raf"),i=e("./utils/window").getWindow,o=e("./utils/is"),s=e("./utils/domUtils"),a=e("./Interaction"),l=e("./defaultOptions"),c={defaults:{enabled:!1,container:null,margin:60,speed:300},interaction:null,i:null,x:0,y:0,isScrolling:!1,prevTime:0,start:function(e){c.isScrolling=!0,r.cancel(c.i),c.interaction=e,c.prevTime=(new Date).getTime(),c.i=r.request(c.scroll)},stop:function(){c.isScrolling=!1,r.cancel(c.i)},scroll:function(){var e=c.interaction.target.options[c.interaction.prepared.name].autoScroll,t=e.container||i(c.interaction.element),n=(new Date).getTime(),s=(n-c.prevTime)/1e3,a=e.speed*s;a>=1&&(o.window(t)?t.scrollBy(c.x*a,c.y*a):t&&(t.scrollLeft+=c.x*a,t.scrollTop+=c.y*a),c.prevTime=n),c.isScrolling&&(r.cancel(c.i),c.i=r.request(c.scroll))},check:function(e,t){var n=e.options;return n[t].autoScroll&&n[t].autoScroll.enabled},onInteractionMove:function(e){var t=e.interaction,n=e.pointer;if(t.interacting()&&c.check(t.target,t.prepared.name)){if(t.simulation)return void(c.x=c.y=0);var r=void 0,a=void 0,l=void 0,p=void 0,u=t.target.options[t.prepared.name].autoScroll,d=u.container||i(t.element);if(o.window(d))p=n.clientXd.innerWidth-c.margin,l=n.clientY>d.innerHeight-c.margin;else{var f=s.getElementClientRect(d);p=n.clientXf.right-c.margin,l=n.clientY>f.bottom-c.margin}c.x=a?1:p?-1:0,c.y=l?1:r?-1:0,c.isScrolling||(c.margin=u.margin,c.speed=u.speed,c.start(t))}}};a.signals.on("stop-active",function(){c.stop()}),a.signals.on("action-move",c.onInteractionMove),l.perAction.autoScroll=c.defaults,t.exports=c},{"./Interaction":5,"./defaultOptions":18,"./utils/domUtils":39,"./utils/is":46,"./utils/raf":50,"./utils/window":52}],12:[function(e,t,n){"use strict";var r=e("../Interactable"),i=e("../actions/base"),o=e("../utils/is"),s=e("../utils/domUtils");r.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},r.prototype.ignoreFrom=function(e){return this._backCompatOption("ignoreFrom",e)},r.prototype.allowFrom=function(e){return this._backCompatOption("allowFrom",e)},r.prototype.testIgnore=function(e,t,n){return!(!e||!o.element(n))&&(o.string(e)?s.matchesUpTo(n,e,t):!!o.element(e)&&s.nodeContains(e,n))},r.prototype.testAllow=function(e,t,n){return!e||!!o.element(n)&&(o.string(e)?s.matchesUpTo(n,e,t):!!o.element(e)&&s.nodeContains(e,n))},r.prototype.testIgnoreAllow=function(e,t,n){return!this.testIgnore(e.ignoreFrom,t,n)&&this.testAllow(e.allowFrom,t,n)},r.prototype.actionChecker=function(e){return o.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},r.prototype.styleCursor=function(e){return o.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},r.prototype.defaultActionChecker=function(e,t,n,r){for(var o=this.getRect(r),s=null,a=i.names,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var u=p;if((!n.pointerIsDown||!n.mouse||0!=(t.buttons&this.options[u].mouseButtons))&&(s=i[u].checker(e,t,this,r,n,o)))return s}}},{"../Interactable":4,"../actions/base":6,"../utils/domUtils":39,"../utils/is":46}],13:[function(e,t,n){"use strict";function r(e,t,n,r){return g.is.object(e)&&t.testIgnoreAllow(t.options[e.name],n,r)&&t.options[e.name].enabled&&a(t,n,e)?e:null}function i(e,t,n,i,o,s){for(var a=0,l=i.length;a=m.maxInteractions)return!1;if(u.target===e){if((a+=d===n.name|0)>=i)return!1;if(u.element===t&&(l++,d!==n.name||l>=o))return!1}}}return m.maxInteractions>0}}var l=e("../interact"),c=e("../Interactable"),p=e("../Interaction"),u=e("../actions/base"),d=e("../defaultOptions"),f=e("../utils/browser"),v=e("../scope"),g=e("../utils"),h=e("../utils/Signals").new();e("./InteractableMethods");var m={signals:h,withinInteractionLimit:a,maxInteractions:1/0,defaults:{perAction:{manualStart:!1,max:1/0,maxPerElement:1,allowFrom:null,ignoreFrom:null}},setActionDefaults:function(e){g.extend(e.defaults,m.defaults.perAction)}};p.signals.on("down",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;if(!t.interacting()){s(t,o(t,n,r,i))}}),p.signals.on("move",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;if(t.mouse&&!t.pointerIsDown&&!t.interacting()){s(t,o(t,n,r,i))}}),p.signals.on("move",function(e){var t=e.interaction,n=e.event;if(t.pointerIsDown&&!t.interacting()&&t.pointerWasMoved&&t.prepared.name){h.fire("before-start",e);var r=t.target;t.prepared.name&&r&&(r.options[t.prepared.name].manualStart||!a(r,t.element,t.prepared)?t.stop(n):t.start(t.prepared,r,t.element))}}),p.signals.on("stop",function(e){var t=e.interaction,n=t.target;n&&n.options.styleCursor&&(n._doc.documentElement.style.cursor="")}),c.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},c.prototype.actionChecker=function(e){return g.is.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},c.prototype.styleCursor=function(e){return g.is.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},c.prototype.defaultActionChecker=function(e,t,n,r){for(var i=this.getRect(r),o=t.buttons||{0:1,1:4,3:8,4:16}[t.button],s=null,a=u.names,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var d=p;if((!n.pointerIsDown||!n.mouse||0!=(o&this.options[d].mouseButtons))&&(s=u[d].checker(e,t,this,r,n,i)))return s}},l.maxInteractions=function(e){return g.is.number(e)?(m.maxInteractions=e,this):m.maxInteractions},c.settingsMethods.push("styleCursor"),c.settingsMethods.push("actionChecker"),c.settingsMethods.push("ignoreFrom"),c.settingsMethods.push("allowFrom"),d.base.actionChecker=null,d.base.styleCursor=!0,g.extend(d.perAction,m.defaults.perAction),t.exports=m},{"../Interactable":4,"../Interaction":5,"../actions/base":6,"../defaultOptions":18,"../interact":21,"../scope":34,"../utils":44,"../utils/Signals":35,"../utils/browser":37,"./InteractableMethods":12}],14:[function(e,t,n){"use strict";var r=e("./base"),i=e("../Interaction");i.signals.on("new",function(e){e.delayTimer=null}),r.signals.on("prepared",function(e){var t=e.interaction,n=t.prepared.name;if(n){var r=t.target.options[n].delay;r>0&&(t.delayTimer=setTimeout(function(){t.start(t.prepared,t.target,t.element)},r))}}),i.signals.on("move",function(e){var t=e.interaction,n=e.duplicate;t.pointerWasMoved&&!n&&clearTimeout(t.delayTimer)}),r.signals.on("before-start",function(e){var t=e.interaction,n=t.prepared.name;if(n){t.target.options[n].delay>0&&(t.prepared.name=null)}})},{"../Interaction":5,"./base":13}],15:[function(e,t,n){"use strict";function r(e,t){if(!t)return!1;var n=t.options.drag.startAxis;return"xy"===e||"xy"===n||n===e}var i=e("./base"),o=e("../scope"),s=e("../utils/browser"),a=e("../utils/is"),l=e("../utils/domUtils"),c=l.matchesSelector,p=l.parentNode;i.setActionDefaults(e("../actions/drag")),i.signals.on("before-start",function(e){var t=e.interaction,n=e.eventTarget,l=e.dx,u=e.dy;if("drag"===t.prepared.name){var d=Math.abs(l),f=Math.abs(u),v=t.target.options.drag,g=v.startAxis,h=d>f?"x":dl.minSpeed&&g>l.endSpeed,b={interaction:t,pageCoords:v,statuses:f,preEnd:!0,requireEndOnly:!0};y&&!x&&(c.resetStatuses(f),m=c.setAll(b),m.shouldMove&&m.locked&&(h=!0)),(x||h)&&(p.copyCoords(i.upCoords,t.curCoords),t.pointers[0]=i.startEvent=new a(t,n,t.prepared.name,"inertiastart",t.element),i.t0=d,i.active=!0,i.allowResume=l.allowResume,t.simulation=i,o.fire(i.startEvent),x?(i.vx0=t.pointerDelta.client.vx,i.vy0=t.pointerDelta.client.vy,i.v0=g,r(t,i),p.extend(v,t.curCoords.page),v.x+=i.xe,v.y+=i.ye,c.resetStatuses(f),m=c.setAll(b),i.modifiedXe+=m.dx,i.modifiedYe+=m.dy,i.i=u.request(t.boundInertiaFrame)):(i.smoothEnd=!0,i.xe=m.dx,i.ye=m.dy,i.sx=i.sy=0,i.i=u.request(t.boundSmoothEndFrame)))}}),l.signals.on("stop-active",function(e){var t=e.interaction,n=t.inertiaStatus;n.active&&(u.cancel(n.i),n.active=!1,t.simulation=null)})},{"./InteractEvent":3,"./Interaction":5,"./modifiers":24,"./utils":44,"./utils/raf":50}],21:[function(e,t,n){"use strict";function r(e,t){var n=a.interactables.get(e,t);return n||(n=new l(e,t),n.events.global=p),n}var i=e("./utils/browser"),o=e("./utils/events"),s=e("./utils"),a=e("./scope"),l=e("./Interactable"),c=e("./Interaction"),p={};r.isSet=function(e,t){return-1!==a.interactables.indexOfElement(e,t&&t.context)},r.on=function(e,t,n){if(s.is.string(e)&&-1!==e.search(" ")&&(e=e.trim().split(/ +/)),s.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.on(f,t,n)}return r}if(s.is.object(e)){for(var v in e)r.on(v,e[v],t);return r}return s.contains(l.eventTypes,e)?p[e]?p[e].push(t):p[e]=[t]:o.add(a.document,e,t,{options:n}),r},r.off=function(e,t,n){if(s.is.string(e)&&-1!==e.search(" ")&&(e=e.trim().split(/ +/)),s.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.off(f,t,n)}return r}if(s.is.object(e)){for(var v in e)r.off(v,e[v],t);return r}if(s.contains(l.eventTypes,e)){var g=void 0;e in p&&-1!==(g=s.indexOf(p[e],t))&&p[e].splice(g,1)}else o.remove(a.document,e,t,n);return r},r.debug=function(){return a},r.getPointerAverage=s.pointerAverage,r.getTouchBBox=s.touchBBox,r.getTouchDistance=s.touchDistance,r.getTouchAngle=s.touchAngle,r.getElementRect=s.getElementRect,r.getElementClientRect=s.getElementClientRect,r.matchesSelector=s.matchesSelector,r.closest=s.closest,r.supportsTouch=function(){return i.supportsTouch},r.supportsPointerEvent=function(){return i.supportsPointerEvent},r.stop=function(e){for(var t=a.interactions.length-1;t>=0;t--)a.interactions[t].stop(e);return r},r.pointerMoveTolerance=function(e){return s.is.number(e)?(c.pointerMoveTolerance=e,this):c.pointerMoveTolerance},r.addDocument=a.addDocument,r.removeDocument=a.removeDocument,a.interact=r,t.exports=r},{"./Interactable":4,"./Interaction":5,"./scope":34,"./utils":44,"./utils/browser":37,"./utils/events":40}],22:[function(e,t,n){"use strict";function r(e){var t=e.interaction,n=e.event;t.target&&t.target.checkAndPreventDefault(n)}var i=e("./Interactable"),o=e("./Interaction"),s=e("./scope"),a=e("./utils/is"),l=e("./utils/events"),c=e("./utils/domUtils"),p=c.nodeContains,u=c.matchesSelector;i.prototype.preventDefault=function(e){return/^(always|never|auto)$/.test(e)?(this.options.preventDefault=e,this):a.bool(e)?(this.options.preventDefault=e?"always":"never",this):this.options.preventDefault},i.prototype.checkAndPreventDefault=function(e){var t=this.options.preventDefault;if("never"!==t)return"always"===t?void e.preventDefault():void(l.supportsOptions||/^(mouse|pointer|touch)*(down|start)/i.test(e.type)||a.element(e.target)&&u(e.target,"input,select,textarea,[contenteditable=true],[contenteditable=true] *")||e.preventDefault())};for(var d=["down","move","up","cancel"],f=0;f=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i;if(o.element&&(o.element===e.target||p(o.element,e.target)))return void o.target.checkAndPreventDefault(e)}}},{"./Interactable":4,"./Interaction":5,"./scope":34,"./utils/domUtils":39,"./utils/events":40,"./utils/is":46}],23:[function(e,t,n){"use strict";function r(e){var t=e.target,n=a.search(e,e.type,t);n&&n.prevTap&&e.clientX===n.prevTap.clientX&&e.clientY===n.prevTap.clientY&&t===n.prevTap.target&&(n.downTargets[0]=t,n.downTimes[0]=(new Date).getTime(),l.fire({interaction:n,event:e,eventTarget:t,pointer:e,type:"tap"}))}var i=e("./scope"),o=e("./utils/events"),s=e("./utils/browser"),a=e("./utils/interactionFinder"),l=e("./pointerEvents/base"),c=e("./utils/window"),p=c.window,u=Object.prototype.toString;if(p.Array.isArray||(p.Array.isArray=function(e){return"[object Array]"===u.call(e)}),String.prototype.trim||(String.prototype.trim=function(){return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")}),s.isIE8){var d=function(e){for(var t=i.interactions,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var o;if(n){if(r>=t.length)break;o=t[r++]}else{if(r=t.next(),r.done)break;o=r.value}var s=o;s.interacting()&&s.target.checkAndPreventDefault(e)}},f=function(e,t){var n=e.doc,i=(e.win,0===t.indexOf("listen")?o.add:o.remove);i(n,"selectstart",d),l&&i(n,"dblclick",r)};i.signals.on("add-document",f),i.signals.on("remove-document",f)}t.exports=null},{"./pointerEvents/base":31,"./scope":34,"./utils/browser":37,"./utils/events":40,"./utils/interactionFinder":45,"./utils/window":52}],24:[function(e,t,n){"use strict";function r(e,t,n){return e&&e.enabled&&(t||!e.endOnly)&&(!n||e.endOnly)}var i=e("../InteractEvent"),o=e("../Interaction"),s=e("../utils/extend"),a={names:[],setOffsets:function(e){var t=e.interaction,n=e.pageCoords,r=t.target,i=t.element,o=t.startOffset,s=r.getRect(i);s?(o.left=n.x-s.left,o.top=n.y-s.top,o.right=s.right-n.x,o.bottom=s.bottom-n.y,"width"in s||(s.width=s.right-s.left),"height"in s||(s.height=s.bottom-s.top)):o.left=o.top=o.right=o.bottom=0,e.rect=s,e.interactable=r,e.element=i;for(var l=0;l=p.length)break;f=p[d++]}else{if(d=p.next(),d.done)break;f=d.value}var v=f,g=a[v],h=t.target.options[t.prepared.name][v];r(h,i,o)&&(e.status=e.status=n[v],e.options=h,e.offset=e.interaction.modifierOffsets[v],g.set(e),e.status.locked&&(l.x+=e.status.dx,l.y+=e.status.dy,c.dx+=e.status.dx,c.dy+=e.status.dy,c.locked=!0))}return c.shouldMove=!e.status||!c.locked||e.status.changed,c},resetStatuses:function(e){for(var t=a.names,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var i;if(n){if(r>=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i,s=e[o]||{};s.dx=s.dy=0,s.modifiedX=s.modifiedY=NaN,s.locked=!1,s.changed=!0,e[o]=s}return e},start:function(e,t){var n=e.interaction,r={interaction:n,pageCoords:("action-resume"===t?n.curCoords:n.startCoords).page,startOffset:n.startOffset,statuses:n.modifierStatuses,preEnd:!1,requireEndOnly:!1};a.setOffsets(r),a.resetStatuses(r.statuses),r.pageCoords=s({},n.startCoords.page),n.modifierResult=a.setAll(r)}};o.signals.on("new",function(e){e.startOffset={left:0,right:0,top:0,bottom:0},e.modifierOffsets={},e.modifierStatuses=a.resetStatuses({}),e.modifierResult=null}),o.signals.on("action-start",a.start),o.signals.on("action-resume",a.start),o.signals.on("before-action-move",function(e){var t=e.interaction,n=e.preEnd,r=e.interactingBeforeMove,i=a.setAll({interaction:t,preEnd:n,pageCoords:t.curCoords.page,statuses:t.modifierStatuses,requireEndOnly:!1});!i.shouldMove&&r&&(t._dontFireMove=!0),t.modifierResult=i}),o.signals.on("action-end",function(e){for(var t=e.interaction,n=e.event,i=0;i=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}var m=h,y=m.x,x=m.y;l.push({x:s.left-i.width*y+u.x,y:s.top-i.height*x+u.y})}else l.push(u);return l},set:function(e){var t=e.interaction,n=e.pageCoords,r=e.status,i=e.options,s=e.offset,a=[],l=void 0,c=void 0,p=void 0;if(r.useStatusXY)c={x:r.x,y:r.y};else{var u=o.getOriginXY(t.target,t.element,t.prepared.name);c=o.extend({},n),c.x-=u.x,c.y-=u.y}r.realX=c.x,r.realY=c.y;for(var d=i.targets?i.targets.length:0,f=s,v=Array.isArray(f),g=0,f=v?f:f[Symbol.iterator]();;){var h;if(v){if(g>=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}for(var m=h,y=m.x,x=m.y,b=c.x-y,w=c.y-x,E=i.targets,S=Array.isArray(E),T=0,E=S?E:E[Symbol.iterator]();;){var C;if(S){if(T>=E.length)break;C=E[T++]}else{if(T=E.next(),T.done)break;C=T.value}var A=C;l=o.is.function(A)?A(b,w,t):A,l&&a.push({x:o.is.number(l.x)?l.x+y:b,y:o.is.number(l.y)?l.y+x:w,range:o.is.number(l.range)?l.range:i.range})}}var D={target:null,inRange:!1,distance:0,range:0,dx:0,dy:0};for(p=0,d=a.length;p=p.length)break;f=p[d++]}else{if(d=p.next(),d.done)break;f=d.value}var v=f,g=void 0;g=a.is.function(v)?v(l,c,t):v,g&&("width"in g&&"height"in g&&(g.x=g.width, +g.y=g.height),e.options.targets.push(g))}i.set(e)},modifyCoords:function(e){var t=e.options;e.options=a.extend({},t),e.options.enabled=t.enabled,e.options.relativePoints=[null],i.modifyCoords(e)}};r.snapSize=l,r.names.push("snapSize"),o.perAction.snapSize=l.defaults,s.defaults.snapSize=l.defaults,t.exports=l},{"../actions/resize":10,"../defaultOptions":18,"../utils/":44,"./index":24,"./snap":28}],30:[function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=e("../utils/pointerUtils");t.exports=function(){function e(t,n,o,s,a){if(r(this,e),i.pointerExtend(this,o),o!==n&&i.pointerExtend(this,n),this.interaction=a,this.timeStamp=(new Date).getTime(),this.originalEvent=o,this.type=t,this.pointerId=i.getPointerId(n),this.pointerType=i.getPointerType(n),this.target=s,this.currentTarget=null,"tap"===t){var l=a.getPointerIndex(n);this.dt=this.timeStamp-a.downTimes[l];var c=this.timeStamp-a.tapTime;this.double=!!(a.prevTap&&"doubletap"!==a.prevTap.type&&a.prevTap.target===this.target&&c<500)}else"doubletap"===t&&(this.dt=n.timeStamp-a.tapTime)}return e.prototype.subtractOrigin=function(e){var t=e.x,n=e.y;return this.pageX-=t,this.pageY-=n,this.clientX-=t,this.clientY-=n,this},e.prototype.addOrigin=function(e){var t=e.x,n=e.y;return this.pageX+=t,this.pageY+=n,this.clientX+=t,this.clientY+=n,this},e.prototype.preventDefault=function(){this.originalEvent.preventDefault()},e.prototype.stopPropagation=function(){this.propagationStopped=!0},e.prototype.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},e}()},{"../utils/pointerUtils":49}],31:[function(e,t,n){"use strict";function r(e){for(var t=e.interaction,n=e.pointer,s=e.event,l=e.eventTarget,c=e.type,u=void 0===c?e.pointerEvent.type:c,d=e.targets,f=void 0===d?i(e):d,v=e.pointerEvent,g=void 0===v?new o(u,n,s,l,t):v,h={interaction:t,pointer:n,event:s,eventTarget:l,targets:f,type:u,pointerEvent:g},m=0;m=u.length)break;g=u[v++]}else{if(v=u.next(),v.done)break;g=v.value}var h=g;c.element=h,p.fire("collect-targets",c)}return"hold"===o&&(c.targets=d(c.targets,function(e){return e.eventable.options.holdDuration===t.holdTimers[s].duration})),c.targets}var o=e("./PointerEvent"),s=e("../Interaction"),a=e("../utils"),l=e("../utils/browser"),c=e("../defaultOptions"),p=e("../utils/Signals").new(),u=e("../utils/arr"),d=u.filter,f=["down","up","cancel"],v=["down","up","cancel"],g={PointerEvent:o,fire:r,collectEventTargets:i,signals:p,defaults:{holdDuration:600,ignoreFrom:null,allowFrom:null,origin:{x:0,y:0}},types:["down","move","up","cancel","tap","doubletap","hold"]};s.signals.on("update-pointer-down",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers[n]={duration:1/0,timeout:null}}),s.signals.on("remove-pointer",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers.splice(n,1)}),s.signals.on("move",function(e){var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,s=e.duplicateMove,a=t.getPointerIndex(n);s||t.pointerIsDown&&!t.pointerWasMoved||(t.pointerIsDown&&clearTimeout(t.holdTimers[a].timeout),r({interaction:t,pointer:n,event:i,eventTarget:o,type:"move"}))}),s.signals.on("down",function(e){for(var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,s=e.pointerIndex,c=l.isIE8?a.extend({},i):i,u=t.holdTimers[s],d=a.getPath(o),f={interaction:t,pointer:n,event:i,eventTarget:o,type:"hold",targets:[],path:d,element:null},v=d,g=Array.isArray(v),h=0,v=g?v:v[Symbol.iterator]();;){var m;if(g){if(h>=v.length)break;m=v[h++]}else{if(h=v.next(),h.done)break;m=h.value}var y=m;f.element=y,p.fire("collect-targets",f)}if(f.targets.length){for(var x=1/0,b=0;b=0&&(p.selectors[u]!==e||p.contexts[u]!==t);u--);-1===u&&(u=p.selectors.length,p.selectors.push(e),p.contexts.push(t),p.listeners.push([])),p.listeners[u].push([i,!!s.capture,s.passive])}function s(e,t,n,r,o){var s=f(o),c=O[n],p=!1,u=void 0;if(c)for(u=c.selectors.length-1;u>=0;u--)if(c.selectors[u]===e&&c.contexts[u]===t){for(var d=c.listeners[u],v=d.length-1;v>=0;v--){var g=d[v],h=g[0],m=g[1],y=g[2];if(h===r&&m===!!s.capture&&y===s.passive){d.splice(v,1),d.length||(c.selectors.splice(u,1),c.contexts.splice(u,1),c.listeners.splice(u,1),i(t,n,a),i(t,n,l,!0),c.selectors.length||(O[n]=null)),p=!0;break}}if(p)break}}function a(e,t){var n=f(t),r={},i=O[e.type],o=g.getActualElement(e.path?e.path[0]:e.target),s=o;for(h(r,e),r.originalEvent=e,r.preventDefault=p;v.element(s);){for(var a=0;a=l.length)break;u=l[p++]}else{if(p=l.next(),p.done)break;u=p.value}var d=u,f=o[d](a);if(f)return f}},simulationResume:function(e){var t=e.pointerType,n=e.eventType,o=e.eventTarget;if(!/down|start/i.test(n))return null;for(var s=r.interactions,a=Array.isArray(s),l=0,s=a?s:s[Symbol.iterator]();;){var c;if(a){if(l>=s.length)break;c=s[l++]}else{if(l=s.next(),l.done)break;c=l.value}var p=c,u=o;if(p.simulation&&p.simulation.allowResume&&p.pointerType===t)for(;u;){if(u===p.element)return p;u=i.parentNode(u)}}return null},mouseOrPen:function(e){var t=e.pointerId,n=e.pointerType,o=e.eventType;if("mouse"!==n&&"pen"!==n)return null;for(var s=void 0,a=r.interactions,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var u=p;if(u.pointerType===n){if(u.simulation&&!i.contains(u.pointerIds,t))continue;if(u.interacting())return u;s||(s=u)}}if(s)return s;for(var d=r.interactions,f=Array.isArray(d),v=0,d=f?d:d[Symbol.iterator]();;){var g;if(f){if(v>=d.length)break;g=d[v++]}else{if(v=d.next(),v.done)break;g=v.value}var h=g;if(!(h.pointerType!==n||/down/i.test(o)&&h.simulation))return h}return null},hasPointer:function(e){for(var t=e.pointerId,n=r.interactions,o=Array.isArray(n),s=0,n=o?n:n[Symbol.iterator]();;){var a;if(o){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var l=a;if(i.contains(l.pointerIds,t))return l}},idle:function(e){for(var t=e.pointerType,n=r.interactions,i=Array.isArray(n),o=0,n=i?n:n[Symbol.iterator]();;){var s;if(i){if(o>=n.length)break;s=n[o++]}else{if(o=n.next(),o.done)break;s=o.value}var a=s;if(1===a.pointerIds.length){var l=a.target;if(l&&!l.options.gesture.enabled)continue}else if(a.pointerIds.length>=2)continue;if(!a.interacting()&&t===a.pointerType)return a}return null}};t.exports=o},{"../scope":34,"./index":44}],46:[function(e,t,n){"use strict";var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},i=e("./window"),o=e("./isWindow"),s={array:function(){},window:function(e){return e===i.window||o(e)},docFrag:function(e){return s.object(e)&&11===e.nodeType},object:function(e){return!!e&&"object"===(void 0===e?"undefined":r(e))},function:function(e){return"function"==typeof e},number:function(e){return"number"==typeof e},bool:function(e){return"boolean"==typeof e},string:function(e){return"string"==typeof e},element:function(e){if(!e||"object"!==(void 0===e?"undefined":r(e)))return!1;var t=i.getWindow(e)||i.window;return/object|function/.test(r(t.Element))?e instanceof t.Element:1===e.nodeType&&"string"==typeof e.nodeName}};s.array=function(e){return s.object(e)&&void 0!==e.length&&s.function(e.splice)},t.exports=s},{"./isWindow":47,"./window":52}],47:[function(e,t,n){"use strict";t.exports=function(e){return!(!e||!e.Window)&&e instanceof e.Window}},{}],48:[function(e,t,n){"use strict";function r(e,n){for(var r in n){var i=t.exports.prefixedPropREs,o=!1;for(var s in i)if(0===r.indexOf(s)&&i[s].test(r)){o=!0;break}o||"function"==typeof n[r]||(e[r]=n[r])}return e}r.prefixedPropREs={webkit:/(Movement[XY]|Radius[XY]|RotationAngle|Force)$/},t.exports=r},{}],49:[function(e,t,n){"use strict";var r=e("./hypot"),i=e("./browser"),o=e("./domObjects"),s=e("./domUtils"),a=e("./domObjects"),l=e("./is"),c=e("./pointerExtend"),p={copyCoords:function(e,t){e.page=e.page||{},e.page.x=t.page.x,e.page.y=t.page.y,e.client=e.client||{},e.client.x=t.client.x,e.client.y=t.client.y,e.timeStamp=t.timeStamp},setCoordDeltas:function(e,t,n){e.page.x=n.page.x-t.page.x,e.page.y=n.page.y-t.page.y,e.client.x=n.client.x-t.client.x,e.client.y=n.client.y-t.client.y,e.timeStamp=n.timeStamp-t.timeStamp;var i=Math.max(e.timeStamp/1e3,.001);e.page.speed=r(e.page.x,e.page.y)/i,e.page.vx=e.page.x/i,e.page.vy=e.page.y/i,e.client.speed=r(e.client.x,e.page.y)/i,e.client.vx=e.client.x/i,e.client.vy=e.client.y/i},isNativePointer:function(e){return e instanceof o.Event||e instanceof o.Touch},getXY:function(e,t,n){return n=n||{},e=e||"page",n.x=t[e+"X"],n.y=t[e+"Y"],n},getPageXY:function(e,t){return t=t||{},i.isOperaMobile&&p.isNativePointer(e)?(p.getXY("screen",e,t),t.x+=window.scrollX,t.y+=window.scrollY):p.getXY("page",e,t),t},getClientXY:function(e,t){return t=t||{},i.isOperaMobile&&p.isNativePointer(e)?p.getXY("screen",e,t):p.getXY("client",e,t),t},getPointerId:function(e){return l.number(e.pointerId)?e.pointerId:e.identifier},setCoords:function(e,t,n){var r=t.length>1?p.pointerAverage(t):t[0],i={};p.getPageXY(r,i),e.page.x=i.x,e.page.y=i.y,p.getClientXY(r,i),e.client.x=i.x,e.client.y=i.y,e.timeStamp=l.number(n)?n:(new Date).getTime()},pointerExtend:c,getTouchPair:function(e){var t=[];return l.array(e)?(t[0]=e[0],t[1]=e[1]):"touchend"===e.type?1===e.touches.length?(t[0]=e.touches[0],t[1]=e.changedTouches[0]):0===e.touches.length&&(t[0]=e.changedTouches[0],t[1]=e.changedTouches[1]):(t[0]=e.touches[0],t[1]=e.touches[1]),t},pointerAverage:function(e){for(var t={pageX:0,pageY:0,clientX:0,clientY:0,screenX:0,screenY:0},n=e,r=Array.isArray(n),i=0,n=r?n:n[Symbol.iterator]();;){var o;if(r){if(i>=n.length)break;o=n[i++]}else{if(i=n.next(),i.done)break;o=i.value}var s=o;for(var a in t)t[a]+=s[a]}for(var l in t)t[l]/=e.length;return t},touchBBox:function(e){if(e.length||e.touches&&e.touches.length>1){var t=p.getTouchPair(e),n=Math.min(t[0].pageX,t[1].pageX),r=Math.min(t[0].pageY,t[1].pageY);return{x:n,y:r,left:n,top:r,width:Math.max(t[0].pageX,t[1].pageX)-n,height:Math.max(t[0].pageY,t[1].pageY)-r}}},touchDistance:function(e,t){var n=t+"X",i=t+"Y",o=p.getTouchPair(e),s=o[0][n]-o[1][n],a=o[0][i]-o[1][i];return r(s,a)},touchAngle:function(e,t,n){var r=n+"X",i=n+"Y",o=p.getTouchPair(e),s=o[1][r]-o[0][r],a=o[1][i]-o[0][i];return 180*Math.atan2(a,s)/Math.PI},getPointerType:function(e){return l.string(e.pointerType)?e.pointerType:l.number(e.pointerType)?[void 0,void 0,"touch","pen","mouse"][e.pointerType]:/touch/.test(e.type)||e instanceof a.Touch?"touch":"mouse"},getEventTargets:function(e){return[s.getActualElement(e.path?e.path[0]:e.target),s.getActualElement(e.currentTarget)]}};t.exports=p},{"./browser":37,"./domObjects":38,"./domUtils":39,"./hypot":43,"./is":46,"./pointerExtend":48}],50:[function(e,t,n){"use strict";for(var r=e("./window"),i=r.window,o=["ms","moz","webkit","o"],s=0,a=void 0,l=void 0,c=0;c\n * Open source under the MIT License.\n * https://raw.github.com/taye/interact.js/master/LICENSE\n */\n","/*\n * In a (windowless) server environment this file exports a factory function\n * that takes the window to use.\n *\n * var interact = require('interact.js')(windowObject);\n *\n * See https://github.com/taye/interact.js/issues/187\n */\nif (typeof window === 'undefined') {\n module.exports = function (window) {\n require('./src/utils/window').init(window);\n\n return require('./src/index');\n };\n}\nelse {\n module.exports = require('./src/index');\n}\n","const { indexOf } = require('./utils/arr');\nconst extend = require('./utils/extend.js');\n\nfunction fireUntilImmediateStopped (event, listeners) {\n for (let i = 0, len = listeners.length; i < len && !event.immediatePropagationStopped; i++) {\n listeners[i](event);\n }\n}\n\nclass Eventable {\n\n constructor (options) {\n this.options = extend({}, options || {});\n }\n\n fire (event) {\n let listeners;\n const onEvent = 'on' + event.type;\n const global = this.global;\n\n // Interactable#on() listeners\n if ((listeners = this[event.type])) {\n fireUntilImmediateStopped(event, listeners);\n }\n\n // interactable.onevent listener\n if (this[onEvent]) {\n this[onEvent](event);\n }\n\n // interact.on() listeners\n if (!event.propagationStopped && global && (listeners = global[event.type])) {\n fireUntilImmediateStopped(event, listeners);\n }\n }\n\n on (eventType, listener) {\n // if this type of event was never bound\n if (this[eventType]) {\n this[eventType].push(listener);\n }\n else {\n this[eventType] = [listener];\n }\n }\n\n off (eventType, listener) {\n // if it is an action event type\n const eventList = this[eventType];\n const index = eventList? indexOf(eventList, listener) : -1;\n\n if (index !== -1) {\n eventList.splice(index, 1);\n }\n\n if (eventList && eventList.length === 0 || !listener) {\n this[eventType] = listener;\n }\n }\n}\n\nmodule.exports = Eventable;\n","const extend = require('./utils/extend');\nconst getOriginXY = require('./utils/getOriginXY');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nclass InteractEvent {\n constructor (interaction, event, action, phase, element, related, preEnd = false) {\n const target = interaction.target;\n const deltaSource = (target && target.options || defaults).deltaSource;\n const origin = getOriginXY(target, element, action);\n const starting = phase === 'start';\n const ending = phase === 'end';\n const coords = starting? interaction.startCoords : interaction.curCoords;\n const prevEvent = interaction.prevEvent;\n\n element = element || interaction.element;\n\n const page = extend({}, coords.page);\n const client = extend({}, coords.client);\n\n page.x -= origin.x;\n page.y -= origin.y;\n\n client.x -= origin.x;\n client.y -= origin.y;\n\n this.ctrlKey = event.ctrlKey;\n this.altKey = event.altKey;\n this.shiftKey = event.shiftKey;\n this.metaKey = event.metaKey;\n this.button = event.button;\n this.buttons = event.buttons;\n this.target = element;\n this.currentTarget = element;\n this.relatedTarget = related || null;\n this.preEnd = preEnd;\n this.type = action + (phase || '');\n this.interaction = interaction;\n this.interactable = target;\n\n this.t0 = starting ? interaction.downTimes[interaction.downTimes.length - 1]\n : prevEvent.t0;\n\n const signalArg = {\n interaction,\n event,\n action,\n phase,\n element,\n related,\n page,\n client,\n coords,\n starting,\n ending,\n deltaSource,\n iEvent: this,\n };\n\n signals.fire('set-xy', signalArg);\n\n if (ending) {\n // use previous coords when ending\n this.pageX = prevEvent.pageX;\n this.pageY = prevEvent.pageY;\n this.clientX = prevEvent.clientX;\n this.clientY = prevEvent.clientY;\n }\n else {\n this.pageX = page.x;\n this.pageY = page.y;\n this.clientX = client.x;\n this.clientY = client.y;\n }\n\n this.x0 = interaction.startCoords.page.x - origin.x;\n this.y0 = interaction.startCoords.page.y - origin.y;\n this.clientX0 = interaction.startCoords.client.x - origin.x;\n this.clientY0 = interaction.startCoords.client.y - origin.y;\n\n signals.fire('set-delta', signalArg);\n\n this.timeStamp = coords.timeStamp;\n this.dt = interaction.pointerDelta.timeStamp;\n this.duration = this.timeStamp - this.t0;\n\n // speed and velocity in pixels per second\n this.speed = interaction.pointerDelta[deltaSource].speed;\n this.velocityX = interaction.pointerDelta[deltaSource].vx;\n this.velocityY = interaction.pointerDelta[deltaSource].vy;\n\n this.swipe = (ending || phase === 'inertiastart')? this.getSwipe() : null;\n\n signals.fire('new', signalArg);\n }\n\n getSwipe () {\n const interaction = this.interaction;\n\n if (interaction.prevEvent.speed < 600\n || this.timeStamp - interaction.prevEvent.timeStamp > 150) {\n return null;\n }\n\n let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI;\n const overlap = 22.5;\n\n if (angle < 0) {\n angle += 360;\n }\n\n const left = 135 - overlap <= angle && angle < 225 + overlap;\n const up = 225 - overlap <= angle && angle < 315 + overlap;\n\n const right = !left && (315 - overlap <= angle || angle < 45 + overlap);\n const down = !up && 45 - overlap <= angle && angle < 135 + overlap;\n\n return {\n up,\n down,\n left,\n right,\n angle,\n speed: interaction.prevEvent.speed,\n velocity: {\n x: interaction.prevEvent.velocityX,\n y: interaction.prevEvent.velocityY,\n },\n };\n }\n\n preventDefault () {}\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n}\n\nsignals.on('set-delta', function ({ iEvent, interaction, starting, deltaSource }) {\n const prevEvent = starting? iEvent : interaction.prevEvent;\n\n if (deltaSource === 'client') {\n iEvent.dx = iEvent.clientX - prevEvent.clientX;\n iEvent.dy = iEvent.clientY - prevEvent.clientY;\n }\n else {\n iEvent.dx = iEvent.pageX - prevEvent.pageX;\n iEvent.dy = iEvent.pageY - prevEvent.pageY;\n }\n});\n\nInteractEvent.signals = signals;\n\nmodule.exports = InteractEvent;\n","const is = require('./utils/is');\nconst events = require('./utils/events');\nconst extend = require('./utils/extend');\nconst actions = require('./actions/base');\nconst scope = require('./scope');\nconst Eventable = require('./Eventable');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nconst {\n getElementRect,\n nodeContains,\n trySelector,\n} = require('./utils/domUtils');\nconst { getWindow } = require('./utils/window');\nconst { indexOf, contains } = require('./utils/arr');\nconst { wheelEvent } = require('./utils/browser');\n\n// all set interactables\nscope.interactables = [];\n\n/*\\\n * Interactable\n [ property ]\n **\n * Object type returned by @interact\n\\*/\nclass Interactable {\n constructor (target, options) {\n options = options || {};\n\n this.target = target;\n this.events = new Eventable();\n this._context = options.context || scope.document;\n this._win = getWindow(trySelector(target)? this._context : target);\n this._doc = this._win.document;\n\n signals.fire('new', {\n target,\n options,\n interactable: this,\n win: this._win,\n });\n\n scope.addDocument( this._doc, this._win );\n\n scope.interactables.push(this);\n\n this.set(options);\n }\n\n setOnEvents (action, phases) {\n const onAction = 'on' + action;\n\n if (is.function(phases.onstart) ) { this.events[onAction + 'start' ] = phases.onstart ; }\n if (is.function(phases.onmove) ) { this.events[onAction + 'move' ] = phases.onmove ; }\n if (is.function(phases.onend) ) { this.events[onAction + 'end' ] = phases.onend ; }\n if (is.function(phases.oninertiastart)) { this.events[onAction + 'inertiastart' ] = phases.oninertiastart ; }\n\n return this;\n }\n\n setPerAction (action, options) {\n // for all the default per-action options\n for (const option in options) {\n // if this option exists for this action\n if (option in defaults[action]) {\n // if the option in the options arg is an object value\n if (is.object(options[option])) {\n // duplicate the object\n this.options[action][option] = extend(this.options[action][option] || {}, options[option]);\n\n if (is.object(defaults.perAction[option]) && 'enabled' in defaults.perAction[option]) {\n this.options[action][option].enabled = options[option].enabled === false? false : true;\n }\n }\n else if (is.bool(options[option]) && is.object(defaults.perAction[option])) {\n this.options[action][option].enabled = options[option];\n }\n else if (options[option] !== undefined) {\n // or if it's not undefined, do a plain assignment\n this.options[action][option] = options[option];\n }\n }\n }\n }\n\n /*\\\n * Interactable.getRect\n [ method ]\n *\n * The default function to get an Interactables bounding rect. Can be\n * overridden using @Interactable.rectChecker.\n *\n - element (Element) #optional The element to measure.\n = (object) The object's bounding rectangle.\n o {\n o top : 0,\n o left : 0,\n o bottom: 0,\n o right : 0,\n o width : 0,\n o height: 0\n o }\n \\*/\n getRect (element) {\n element = element || this.target;\n\n if (is.string(this.target) && !(is.element(element))) {\n element = this._context.querySelector(this.target);\n }\n\n return getElementRect(element);\n }\n\n /*\\\n * Interactable.rectChecker\n [ method ]\n *\n * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n - checker (function) #optional A function which returns this Interactable's bounding rectangle. See @Interactable.getRect\n = (function | object) The checker function or this Interactable\n \\*/\n rectChecker (checker) {\n if (is.function(checker)) {\n this.getRect = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.getRect;\n\n return this;\n }\n\n return this.getRect;\n }\n\n _backCompatOption (optionName, newValue) {\n if (trySelector(newValue) || is.object(newValue)) {\n this.options[optionName] = newValue;\n\n for (const action of actions.names) {\n this.options[action][optionName] = newValue;\n }\n\n return this;\n }\n\n return this.options[optionName];\n }\n\n /*\\\n * Interactable.origin\n [ method ]\n *\n * Gets or sets the origin of the Interactable's element. The x and y\n * of the origin will be subtracted from action event coordinates.\n *\n - origin (object | string) #optional An object eg. { x: 0, y: 0 } or string 'parent', 'self' or any CSS selector\n * OR\n - origin (Element) #optional An HTML or SVG Element whose rect will be used\n **\n = (object) The current origin or this Interactable\n \\*/\n origin (newValue) {\n return this._backCompatOption('origin', newValue);\n }\n\n /*\\\n * Interactable.deltaSource\n [ method ]\n *\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n - newValue (string) #optional Use 'client' if you will be scrolling while interacting; Use 'page' if you want autoScroll to work\n = (string | object) The current deltaSource or this Interactable\n \\*/\n deltaSource (newValue) {\n if (newValue === 'page' || newValue === 'client') {\n this.options.deltaSource = newValue;\n\n return this;\n }\n\n return this.options.deltaSource;\n }\n\n /*\\\n * Interactable.context\n [ method ]\n *\n * Gets the selector context Node of the Interactable. The default is `window.document`.\n *\n = (Node) The context Node of this Interactable\n **\n \\*/\n context () {\n return this._context;\n }\n\n inContext (element) {\n return (this._context === element.ownerDocument\n || nodeContains(this._context, element));\n }\n\n /*\\\n * Interactable.fire\n [ method ]\n *\n * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n - iEvent (InteractEvent) The InteractEvent object to be fired on this Interactable\n = (Interactable) this Interactable\n \\*/\n fire (iEvent) {\n this.events.fire(iEvent);\n\n return this;\n }\n\n _onOffMultiple (method, eventType, listener, options) {\n if (is.string(eventType) && eventType.search(' ') !== -1) {\n eventType = eventType.trim().split(/ +/);\n }\n\n if (is.array(eventType)) {\n for (let i = 0; i < eventType.length; i++) {\n this[method](eventType[i], listener, options);\n }\n\n return true;\n }\n\n if (is.object(eventType)) {\n for (const prop in eventType) {\n this[method](prop, eventType[prop], listener);\n }\n\n return true;\n }\n }\n\n /*\\\n * Interactable.on\n [ method ]\n *\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n - eventType (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) This Interactable\n \\*/\n on (eventType, listener, options) {\n if (this._onOffMultiple('on', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.on(eventType, listener);\n }\n // delegated event for selector\n else if (is.string(this.target)) {\n events.addDelegate(this.target, this._context, eventType, listener, options);\n }\n else {\n events.add(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.off\n [ method ]\n *\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n - eventType (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) This Interactable\n \\*/\n off (eventType, listener, options) {\n if (this._onOffMultiple('off', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n // if it is an action event type\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.off(eventType, listener);\n }\n // delegated event\n else if (is.string(this.target)) {\n events.removeDelegate(this.target, this._context, eventType, listener, options);\n }\n // remove listener from this Interatable's element\n else {\n events.remove(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.set\n [ method ]\n *\n * Reset the options of this Interactable\n - options (object) The new settings to apply\n = (object) This Interactable\n \\*/\n set (options) {\n if (!is.object(options)) {\n options = {};\n }\n\n this.options = extend({}, defaults.base);\n\n const perActions = extend({}, defaults.perAction);\n\n for (const actionName in actions.methodDict) {\n const methodName = actions.methodDict[actionName];\n\n this.options[actionName] = extend({}, defaults[actionName]);\n\n this.setPerAction(actionName, perActions);\n\n this[methodName](options[actionName]);\n }\n\n for (const setting of Interactable.settingsMethods) {\n this.options[setting] = defaults.base[setting];\n\n if (setting in options) {\n this[setting](options[setting]);\n }\n }\n\n signals.fire('set', {\n options,\n interactable: this,\n });\n\n return this;\n }\n\n /*\\\n * Interactable.unset\n [ method ]\n *\n * Remove this interactable from the list of interactables and remove\n * it's action capabilities and event listeners\n *\n = (object) @interact\n \\*/\n unset () {\n events.remove(this.target, 'all');\n\n if (is.string(this.target)) {\n // remove delegated events\n for (const type in events.delegatedEvents) {\n const delegated = events.delegatedEvents[type];\n\n if (delegated.selectors[0] === this.target\n && delegated.contexts[0] === this._context) {\n\n delegated.selectors.splice(0, 1);\n delegated.contexts .splice(0, 1);\n delegated.listeners.splice(0, 1);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegated[type] = null;\n }\n }\n\n events.remove(this._context, type, events.delegateListener);\n events.remove(this._context, type, events.delegateUseCapture, true);\n }\n }\n else {\n events.remove(this, 'all');\n }\n\n signals.fire('unset', { interactable: this });\n\n scope.interactables.splice(indexOf(scope.interactables, this), 1);\n\n // Stop related interactions when an Interactable is unset\n for (const interaction of scope.interactions || []) {\n if (interaction.target === this && interaction.interacting()) {\n interaction.stop();\n }\n }\n\n return scope.interact;\n }\n}\n\nscope.interactables.indexOfElement = function indexOfElement (target, context) {\n context = context || scope.document;\n\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n if (interactable.target === target && interactable._context === context) {\n return i;\n }\n }\n return -1;\n};\n\nscope.interactables.get = function interactableGet (element, options, dontCheckInContext) {\n const ret = this[this.indexOfElement(element, options && options.context)];\n\n return ret && (is.string(element) || dontCheckInContext || ret.inContext(element))? ret : null;\n};\n\nscope.interactables.forEachSelector = function (callback, element) {\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n // skip non CSS selector targets and out of context elements\n if (!is.string(interactable.target)\n || (element && !interactable.inContext(element))) {\n continue;\n }\n\n const ret = callback(interactable, interactable.target, interactable._context, i, this);\n\n if (ret !== undefined) {\n return ret;\n }\n }\n};\n\n// all interact.js eventTypes\nInteractable.eventTypes = scope.eventTypes = [];\n\nInteractable.signals = signals;\n\nInteractable.settingsMethods = [ 'deltaSource', 'origin', 'preventDefault', 'rectChecker' ];\n\nmodule.exports = Interactable;\n","const scope = require('./scope');\nconst utils = require('./utils');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst finder = require('./utils/interactionFinder');\nconst signals = require('./utils/Signals').new();\n\nconst listeners = {};\nconst methodNames = [\n 'pointerDown', 'pointerMove', 'pointerUp',\n 'updatePointer', 'removePointer',\n];\n\n// for ignoring browser's simulated mouse events\nlet prevTouchTime = 0;\n\n// all active and idle interactions\nscope.interactions = [];\n\nclass Interaction {\n constructor () {\n this.target = null; // current interactable being interacted with\n this.element = null; // the target element of the interactable\n\n this.prepared = { // action that's ready to be fired on next move event\n name : null,\n axis : null,\n edges: null,\n };\n\n // keep track of added pointers\n this.pointers = [];\n this.pointerIds = [];\n this.downTargets = [];\n this.downTimes = [];\n\n // Previous native pointer move event coordinates\n this.prevCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n // current native pointer move event coordinates\n this.curCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Starting InteractEvent pointer coordinates\n this.startCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Change in coordinates and time of the pointer\n this.pointerDelta = {\n page : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n client : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n timeStamp: 0,\n };\n\n this.downEvent = null; // pointerdown/mousedown/touchstart event\n this.downPointer = {};\n\n this._eventTarget = null;\n this._curEventTarget = null;\n\n this.prevEvent = null; // previous action event\n\n this.pointerIsDown = false;\n this.pointerWasMoved = false;\n this._interacting = false;\n\n this.mouse = false;\n\n signals.fire('new', this);\n\n scope.interactions.push(this);\n }\n\n pointerDown (pointer, event, eventTarget) {\n const pointerIndex = this.updatePointer(pointer, event, true);\n\n signals.fire('down', {\n pointer,\n event,\n eventTarget,\n pointerIndex,\n interaction: this,\n });\n }\n\n /*\\\n * Interaction.start\n [ method ]\n *\n * Start an action with the given Interactable and Element as tartgets. The\n * action must be enabled for the target Interactable and an appropriate number\n * of pointers must be held down - 1 for drag/resize, 2 for gesture.\n *\n * Use it with `interactable.able({ manualStart: false })` to always\n * [start actions manually](https://github.com/taye/interact.js/issues/114)\n *\n - action (object) The action to be performed - drag, resize, etc.\n - target (Interactable) The Interactable to target\n - element (Element) The DOM Element to target\n = (object) interact\n **\n | interact(target)\n | .draggable({\n | // disable the default drag start by down->move\n | manualStart: true\n | })\n | // start dragging after the user holds the pointer down\n | .on('hold', function (event) {\n | var interaction = event.interaction;\n |\n | if (!interaction.interacting()) {\n | interaction.start({ name: 'drag' },\n | event.interactable,\n | event.currentTarget);\n | }\n | });\n \\*/\n start (action, target, element) {\n if (this.interacting()\n || !this.pointerIsDown\n || this.pointerIds.length < (action.name === 'gesture'? 2 : 1)) {\n return;\n }\n\n // if this interaction had been removed after stopping\n // add it back\n if (utils.indexOf(scope.interactions, this) === -1) {\n scope.interactions.push(this);\n }\n\n utils.copyAction(this.prepared, action);\n this.target = target;\n this.element = element;\n\n signals.fire('action-start', {\n interaction: this,\n event: this.downEvent,\n });\n }\n\n pointerMove (pointer, event, eventTarget) {\n if (!this.simulation) {\n this.updatePointer(pointer);\n utils.setCoords(this.curCoords, this.pointers);\n }\n\n const duplicateMove = (this.curCoords.page.x === this.prevCoords.page.x\n && this.curCoords.page.y === this.prevCoords.page.y\n && this.curCoords.client.x === this.prevCoords.client.x\n && this.curCoords.client.y === this.prevCoords.client.y);\n\n let dx;\n let dy;\n\n // register movement greater than pointerMoveTolerance\n if (this.pointerIsDown && !this.pointerWasMoved) {\n dx = this.curCoords.client.x - this.startCoords.client.x;\n dy = this.curCoords.client.y - this.startCoords.client.y;\n\n this.pointerWasMoved = utils.hypot(dx, dy) > Interaction.pointerMoveTolerance;\n }\n\n const signalArg = {\n pointer,\n pointerIndex: this.getPointerIndex(pointer),\n event,\n eventTarget,\n dx,\n dy,\n duplicate: duplicateMove,\n interaction: this,\n interactingBeforeMove: this.interacting(),\n };\n\n if (!duplicateMove) {\n // set pointer coordinate, time changes and speeds\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n }\n\n signals.fire('move', signalArg);\n\n if (!duplicateMove) {\n // if interacting, fire an 'action-move' signal etc\n if (this.interacting()) {\n this.doMove(signalArg);\n }\n\n if (this.pointerWasMoved) {\n utils.copyCoords(this.prevCoords, this.curCoords);\n }\n }\n }\n\n /*\\\n * Interaction.doMove\n [ method ]\n *\n * Force a move of the current action at the same coordinates. Useful if\n * snap/restrict has been changed and you want a movement with the new\n * settings.\n *\n **\n | interact(target)\n | .draggable(true)\n | .on('dragmove', function (event) {\n | if (someCondition) {\n | // change the snap settings\n | event.interactable.draggable({ snap: { targets: [] }});\n | // fire another move event with re-calculated snap\n | event.interaction.doMove();\n | }\n | });\n \\*/\n doMove (signalArg) {\n signalArg = utils.extend({\n pointer: this.pointers[0],\n event: this.prevEvent,\n eventTarget: this._eventTarget,\n interaction: this,\n }, signalArg || {});\n\n signals.fire('before-action-move', signalArg);\n\n if (!this._dontFireMove) {\n signals.fire('action-move', signalArg);\n }\n\n this._dontFireMove = false;\n }\n\n // End interact move events and stop auto-scroll unless simulation is running\n pointerUp (pointer, event, eventTarget, curEventTarget) {\n const pointerIndex = this.getPointerIndex(pointer);\n\n signals.fire(/cancel$/i.test(event.type)? 'cancel' : 'up', {\n pointer,\n pointerIndex,\n event,\n eventTarget,\n curEventTarget,\n interaction: this,\n });\n\n if (!this.simulation) {\n this.end(event);\n }\n\n this.pointerIsDown = false;\n this.removePointer(pointer, event);\n }\n\n /*\\\n * Interaction.end\n [ method ]\n *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n - event (PointerEvent) #optional\n **\n | interact(target)\n | .draggable(true)\n | .on('move', function (event) {\n | if (event.pageX > 1000) {\n | // end the current action\n | event.interaction.end();\n | // stop all further listeners from being called\n | event.stopImmediatePropagation();\n | }\n | });\n \\*/\n end (event) {\n event = event || this.prevEvent;\n\n if (this.interacting()) {\n signals.fire('action-end', {\n event,\n interaction: this,\n });\n }\n\n this.stop();\n }\n\n currentAction () {\n return this._interacting? this.prepared.name: null;\n }\n\n interacting () {\n return this._interacting;\n }\n\n stop () {\n signals.fire('stop', { interaction: this });\n\n if (this._interacting) {\n signals.fire('stop-active', { interaction: this });\n signals.fire('stop-' + this.prepared.name, { interaction: this });\n }\n\n this.target = this.element = null;\n\n this._interacting = false;\n this.prepared.name = this.prevEvent = null;\n }\n\n getPointerIndex (pointer) {\n return utils.indexOf(this.pointerIds, utils.getPointerId(pointer));\n }\n\n updatePointer (pointer, event, down = event && /(down|start)$/i.test(event.type)) {\n const id = utils.getPointerId(pointer);\n let index = this.getPointerIndex(pointer);\n\n if (index === -1) {\n index = this.pointerIds.length;\n this.pointerIds[index] = id;\n }\n\n if (down) {\n signals.fire('update-pointer-down', {\n pointer,\n event,\n down,\n pointerId: id,\n pointerIndex: index,\n interaction: this,\n });\n }\n\n this.pointers[index] = pointer;\n\n return index;\n }\n\n removePointer (pointer, event) {\n const id = utils.getPointerId(pointer);\n const index = this.mouse? 0 : utils.indexOf(this.pointerIds, id);\n\n if (index === -1) { return; }\n\n signals.fire('remove-pointer', {\n pointer,\n event,\n pointerIndex: index,\n interaction: this,\n });\n\n this.pointers .splice(index, 1);\n this.pointerIds .splice(index, 1);\n this.downTargets.splice(index, 1);\n this.downTimes .splice(index, 1);\n }\n\n _updateEventTargets (target, currentTarget) {\n this._eventTarget = target;\n this._curEventTarget = currentTarget;\n }\n}\n\nfor (let i = 0, len = methodNames.length; i < len; i++) {\n const method = methodNames[i];\n\n listeners[method] = doOnInteractions(method);\n}\n\nfunction doOnInteractions (method) {\n return (function (event) {\n const [eventTarget, curEventTarget] = utils.getEventTargets(event);\n const matches = []; // [ [pointer, interaction], ...]\n\n if (browser.supportsTouch && /touch/.test(event.type)) {\n prevTouchTime = new Date().getTime();\n\n for (let i = 0; i < event.changedTouches.length; i++) {\n const pointer = event.changedTouches[i];\n const interaction = finder.search(pointer, event.type, eventTarget);\n\n matches.push([pointer, interaction || new Interaction()]);\n }\n }\n else {\n let invalidPointer = false;\n\n if (!browser.supportsPointerEvent && /mouse/.test(event.type)) {\n // ignore mouse events while touch interactions are active\n for (let i = 0; i < scope.interactions.length && !invalidPointer; i++) {\n invalidPointer = !scope.interactions[i].mouse && scope.interactions[i].pointerIsDown;\n }\n\n // try to ignore mouse events that are simulated by the browser\n // after a touch event\n invalidPointer = invalidPointer\n || (new Date().getTime() - prevTouchTime < 500)\n // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated\n || event.timeStamp === 0;\n }\n\n if (!invalidPointer) {\n let interaction = finder.search(event, event.type, eventTarget);\n\n if (!interaction) {\n\n interaction = new Interaction();\n interaction.mouse = (/mouse/i.test(event.pointerType || event.type)\n // MSPointerEvent.MSPOINTER_TYPE_MOUSE\n || event.pointerType === 4\n || !event.pointerType);\n }\n\n matches.push([event, interaction]);\n }\n }\n\n for (const [pointer, interaction] of matches) {\n interaction._updateEventTargets(eventTarget, curEventTarget);\n interaction[method](pointer, event, eventTarget, curEventTarget);\n }\n });\n}\n\nfunction endAll (event) {\n for (let i = 0; i < scope.interactions.length; i++) {\n const interaction = scope.interactions[i];\n\n interaction.end(event);\n signals.fire('endall', { event, interaction });\n }\n}\n\nconst docEvents = { /* 'eventType': listenerFunc */ };\nconst pEventTypes = browser.pEventTypes;\n\nif (scope.PointerEvent) {\n docEvents[pEventTypes.down ] = listeners.pointerDown;\n docEvents[pEventTypes.move ] = listeners.pointerMove;\n docEvents[pEventTypes.up ] = listeners.pointerUp;\n docEvents[pEventTypes.cancel] = listeners.pointerUp;\n}\nelse {\n docEvents.mousedown = listeners.pointerDown;\n docEvents.mousemove = listeners.pointerMove;\n docEvents.mouseup = listeners.pointerUp;\n\n docEvents.touchstart = listeners.pointerDown;\n docEvents.touchmove = listeners.pointerMove;\n docEvents.touchend = listeners.pointerUp;\n docEvents.touchcancel = listeners.pointerUp;\n}\n\ndocEvents.blur = endAll;\n\nfunction onDocSignal ({ doc }, signalName) {\n const eventMethod = signalName.indexOf('add') === 0\n ? events.add : events.remove;\n\n // delegate event listener\n for (const eventType in scope.delegatedEvents) {\n eventMethod(doc, eventType, events.delegateListener);\n eventMethod(doc, eventType, events.delegateUseCapture, true);\n }\n\n for (const eventType in docEvents) {\n eventMethod(doc, eventType, docEvents[eventType]);\n }\n}\n\nsignals.on('update-pointer-down', ({ interaction, pointer, pointerId, pointerIndex, event, eventTarget, down }) => {\n interaction.pointerIds[pointerIndex] = pointerId;\n interaction.pointers[pointerIndex] = pointer;\n\n if (down) {\n interaction.pointerIsDown = true;\n }\n\n if (!interaction.interacting()) {\n utils.setCoords(interaction.startCoords, interaction.pointers);\n\n utils.copyCoords(interaction.curCoords , interaction.startCoords);\n utils.copyCoords(interaction.prevCoords, interaction.startCoords);\n\n interaction.downEvent = event;\n interaction.downTimes[pointerIndex] = interaction.curCoords.timeStamp;\n interaction.downTargets[pointerIndex] = eventTarget || event && utils.getEventTargets(event)[0];\n interaction.pointerWasMoved = false;\n\n utils.pointerExtend(interaction.downPointer, pointer);\n }\n});\n\nscope.signals.on('add-document' , onDocSignal);\nscope.signals.on('remove-document', onDocSignal);\n\nInteraction.pointerMoveTolerance = 1;\nInteraction.doOnInteractions = doOnInteractions;\nInteraction.endAll = endAll;\nInteraction.signals = signals;\nInteraction.docEvents = docEvents;\n\nscope.endAllInteractions = endAll;\n\nmodule.exports = Interaction;\n","const Interaction = require('../Interaction');\nconst InteractEvent = require('../InteractEvent');\n\nconst actions = {\n firePrepared,\n names: [],\n methodDict: {},\n};\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n interaction._interacting = true;\n firePrepared(interaction, event, 'start');\n});\n\nInteraction.signals.on('action-move', function ({ interaction, event, preEnd }) {\n firePrepared(interaction, event, 'move', preEnd);\n\n // if the action was ended in a listener\n if (!interaction.interacting()) { return false; }\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n firePrepared(interaction, event, 'end');\n});\n\nfunction firePrepared (interaction, event, phase, preEnd) {\n const actionName = interaction.prepared.name;\n\n const newEvent = new InteractEvent(interaction, event, actionName, phase, interaction.element, null, preEnd);\n\n interaction.target.fire(newEvent);\n interaction.prevEvent = newEvent;\n}\n\nmodule.exports = actions;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drag = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n startAxis : 'xy',\n lockAxis : 'xy',\n },\n\n checker: function (pointer, event, interactable) {\n const dragOptions = interactable.options.drag;\n\n return dragOptions.enabled\n ? { name: 'drag', axis: (dragOptions.lockAxis === 'start'\n ? dragOptions.startAxis\n : dragOptions.lockAxis)}\n : null;\n },\n\n getCursor: function () {\n return 'move';\n },\n};\n\nInteraction.signals.on('before-action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n interaction.curCoords.page.y = interaction.startCoords.page.y;\n interaction.curCoords.client.y = interaction.startCoords.client.y;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vx);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vx);\n interaction.pointerDelta.client.vy = 0;\n interaction.pointerDelta.page.vy = 0;\n }\n else if (axis === 'y') {\n interaction.curCoords.page.x = interaction.startCoords.page.x;\n interaction.curCoords.client.x = interaction.startCoords.client.x;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vy);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vy);\n interaction.pointerDelta.client.vx = 0;\n interaction.pointerDelta.page.vx = 0;\n }\n});\n\n// dragmove\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'dragmove') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n iEvent.pageY = interaction.startCoords.page.y;\n iEvent.clientY = interaction.startCoords.client.y;\n iEvent.dy = 0;\n }\n else if (axis === 'y') {\n iEvent.pageX = interaction.startCoords.page.x;\n iEvent.clientX = interaction.startCoords.client.x;\n iEvent.dx = 0;\n }\n});\n\n/*\\\n * Interactable.draggable\n [ method ]\n *\n * Gets or sets whether drag actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of drag events\n | var isDraggable = interact('ul li').draggable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on drag events (object makes the Interactable draggable)\n = (object) This Interactable\n | interact(element).draggable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // the axis in which the first movement must be\n | // for the drag sequence to start\n | // 'xy' by default - any direction\n | startAxis: 'x' || 'y' || 'xy',\n |\n | // 'xy' by default - don't restrict to one axis (move in any direction)\n | // 'x' or 'y' to restrict movement to either axis\n | // 'start' to restrict movement to the axis the drag started in\n | lockAxis: 'x' || 'y' || 'xy' || 'start',\n |\n | // max number of drags that can happen concurrently\n | // with elements of this Interactable. Infinity by default\n | max: Infinity,\n |\n | // max number of drags that can target the same element+Interactable\n | // 1 by default\n | maxPerElement: 2\n | });\n\\*/\nInteractable.prototype.draggable = function (options) {\n if (utils.is.object(options)) {\n this.options.drag.enabled = options.enabled === false? false: true;\n this.setPerAction('drag', options);\n this.setOnEvents('drag', options);\n\n if (/^(xy|x|y|start)$/.test(options.lockAxis)) {\n this.options.drag.lockAxis = options.lockAxis;\n }\n if (/^(xy|x|y)$/.test(options.startAxis)) {\n this.options.drag.startAxis = options.startAxis;\n }\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drag.enabled = options;\n\n if (!options) {\n this.ondragstart = this.ondragstart = this.ondragend = null;\n }\n\n return this;\n }\n\n return this.options.drag;\n};\n\nactions.drag = drag;\nactions.names.push('drag');\nutils.merge(Interactable.eventTypes, [\n 'dragstart',\n 'dragmove',\n 'draginertiastart',\n 'draginertiaresume',\n 'dragend',\n]);\nactions.methodDict.drag = 'draggable';\n\ndefaultOptions.drag = drag.defaults;\n\nmodule.exports = drag;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst scope = require('../scope');\nconst interact = require('../interact');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drop = {\n defaults: {\n enabled: false,\n accept : null,\n overlap: 'pointer',\n },\n};\n\nlet dynamicDrop = false;\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // reset active dropzones\n interaction.activeDrops.dropzones = [];\n interaction.activeDrops.elements = [];\n interaction.activeDrops.rects = [];\n\n interaction.dropEvents = null;\n\n if (!interaction.dynamicDrop) {\n setActiveDrops(interaction, interaction.element);\n }\n\n const dragEvent = interaction.prevEvent;\n const dropEvents = getDropEvents(interaction, event, dragEvent);\n\n if (dropEvents.activate) {\n fireActiveDrops(interaction, dropEvents.activate);\n }\n});\n\nInteractEvent.signals.on('new', function ({ interaction, iEvent, event }) {\n if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { return; }\n\n const draggableElement = interaction.element;\n const dragEvent = iEvent;\n const dropResult = getDrop(dragEvent, event, draggableElement);\n\n interaction.dropTarget = dropResult.dropzone;\n interaction.dropElement = dropResult.element;\n\n interaction.dropEvents = getDropEvents(interaction, event, dragEvent);\n});\n\nInteraction.signals.on('action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n fireDropEvents(interaction, interaction.dropEvents);\n});\n\nInteraction.signals.on('action-end', function ({ interaction }) {\n if (interaction.prepared.name === 'drag') {\n fireDropEvents(interaction, interaction.dropEvents);\n }\n});\n\nInteraction.signals.on('stop-drag', function ({ interaction }) {\n interaction.activeDrops.dropzones =\n interaction.activeDrops.elements =\n interaction.activeDrops.rects =\n interaction.dropEvents = null;\n});\n\nfunction collectDrops (interaction, element) {\n const drops = [];\n const elements = [];\n\n element = element || interaction.element;\n\n // collect all dropzones and their elements which qualify for a drop\n for (const current of scope.interactables) {\n if (!current.options.drop.enabled) { continue; }\n\n const accept = current.options.drop.accept;\n\n // test the draggable element against the dropzone's accept setting\n if ((utils.is.element(accept) && accept !== element)\n || (utils.is.string(accept)\n && !utils.matchesSelector(element, accept))) {\n\n continue;\n }\n\n // query for new elements if necessary\n const dropElements = utils.is.string(current.target)\n ? current._context.querySelectorAll(current.target)\n : [current.target];\n\n for (let i = 0; i < dropElements.length; i++) {\n const currentElement = dropElements[i];\n\n if (currentElement !== element) {\n drops.push(current);\n elements.push(currentElement);\n }\n }\n }\n\n return {\n elements,\n dropzones: drops,\n };\n}\n\nfunction fireActiveDrops (interaction, event) {\n let prevElement;\n\n // loop through all active dropzones and trigger event\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n const current = interaction.activeDrops.dropzones[i];\n const currentElement = interaction.activeDrops.elements [i];\n\n // prevent trigger of duplicate events on same element\n if (currentElement !== prevElement) {\n // set current element as event target\n event.target = currentElement;\n current.fire(event);\n }\n prevElement = currentElement;\n }\n}\n\n// Collect a new set of possible drops and save them in activeDrops.\n// setActiveDrops should always be called when a drag has just started or a\n// drag event happens while dynamicDrop is true\nfunction setActiveDrops (interaction, dragElement) {\n // get dropzones and their elements that could receive the draggable\n const possibleDrops = collectDrops(interaction, dragElement, true);\n\n interaction.activeDrops.dropzones = possibleDrops.dropzones;\n interaction.activeDrops.elements = possibleDrops.elements;\n interaction.activeDrops.rects = [];\n\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n interaction.activeDrops.rects[i] =\n interaction.activeDrops.dropzones[i].getRect(interaction.activeDrops.elements[i]);\n }\n}\n\nfunction getDrop (dragEvent, event, dragElement) {\n const interaction = dragEvent.interaction;\n const validDrops = [];\n\n if (dynamicDrop) {\n setActiveDrops(interaction, dragElement);\n }\n\n // collect all dropzones and their elements which qualify for a drop\n for (let j = 0; j < interaction.activeDrops.dropzones.length; j++) {\n const current = interaction.activeDrops.dropzones[j];\n const currentElement = interaction.activeDrops.elements [j];\n const rect = interaction.activeDrops.rects [j];\n\n validDrops.push(current.dropCheck(dragEvent, event, interaction.target, dragElement, currentElement, rect)\n ? currentElement\n : null);\n }\n\n // get the most appropriate dropzone based on DOM depth and order\n const dropIndex = utils.indexOfDeepestElement(validDrops);\n\n return {\n dropzone: interaction.activeDrops.dropzones[dropIndex] || null,\n element : interaction.activeDrops.elements [dropIndex] || null,\n };\n}\n\nfunction getDropEvents (interaction, pointerEvent, dragEvent) {\n const dropEvents = {\n enter : null,\n leave : null,\n activate : null,\n deactivate: null,\n move : null,\n drop : null,\n };\n\n const tmpl = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n };\n\n if (interaction.dropElement !== interaction.prevDropElement) {\n // if there was a prevDropTarget, create a dragleave event\n if (interaction.prevDropTarget) {\n dropEvents.leave = utils.extend({ type: 'dragleave' }, tmpl);\n\n dragEvent.dragLeave = dropEvents.leave.target = interaction.prevDropElement;\n dragEvent.prevDropzone = dropEvents.leave.dropzone = interaction.prevDropTarget;\n }\n // if the dropTarget is not null, create a dragenter event\n if (interaction.dropTarget) {\n dropEvents.enter = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n type : 'dragenter',\n };\n\n dragEvent.dragEnter = interaction.dropElement;\n dragEvent.dropzone = interaction.dropTarget;\n }\n }\n\n if (dragEvent.type === 'dragend' && interaction.dropTarget) {\n dropEvents.drop = utils.extend({ type: 'drop' }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n dragEvent.relatedTarget = interaction.dropElement;\n }\n if (dragEvent.type === 'dragstart') {\n dropEvents.activate = utils.extend({ type: 'dropactivate' }, tmpl);\n\n dropEvents.activate.target = null;\n dropEvents.activate.dropzone = null;\n }\n if (dragEvent.type === 'dragend') {\n dropEvents.deactivate = utils.extend({ type: 'dropdeactivate' }, tmpl);\n\n dropEvents.deactivate.target = null;\n dropEvents.deactivate.dropzone = null;\n }\n if (dragEvent.type === 'dragmove' && interaction.dropTarget) {\n dropEvents.move = utils.extend({\n dragmove : dragEvent,\n type : 'dropmove',\n }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n }\n\n return dropEvents;\n}\n\nfunction fireDropEvents (interaction, dropEvents) {\n if (dropEvents.leave) { interaction.prevDropTarget.fire(dropEvents.leave); }\n if (dropEvents.move ) { interaction.dropTarget.fire(dropEvents.move ); }\n if (dropEvents.enter) { interaction.dropTarget.fire(dropEvents.enter); }\n if (dropEvents.drop ) { interaction.dropTarget.fire(dropEvents.drop ); }\n if (dropEvents.deactivate) {\n fireActiveDrops(interaction, dropEvents.deactivate);\n }\n\n interaction.prevDropTarget = interaction.dropTarget;\n interaction.prevDropElement = interaction.dropElement;\n}\n\n/*\\\n * Interactable.dropzone\n [ method ]\n *\n * Returns or sets whether elements can be dropped onto this\n * Interactable to trigger drop events\n *\n * Dropzones can receive the following events:\n * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends\n * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone\n * - `dragmove` when a draggable that has entered the dropzone is moved\n * - `drop` when a draggable is dropped into this dropzone\n *\n * Use the `accept` option to allow only elements that match the given CSS\n * selector or element. The value can be:\n *\n * - **an Element** - only that element can be dropped into this dropzone.\n * - **a string**, - the element being dragged must match it as a CSS selector.\n * - **`null`** - accept options is cleared - it accepts any element.\n *\n * Use the `overlap` option to set how drops are checked for. The allowed\n * values are:\n *\n * - `'pointer'`, the pointer must be over the dropzone (default)\n * - `'center'`, the draggable element's center must be over the dropzone\n * - a number from 0-1 which is the `(intersection area) / (draggable area)`.\n * e.g. `0.5` for drop to happen when half of the area of the draggable is\n * over the dropzone\n *\n * Use the `checker` option to specify a function to check if a dragged\n * element is over this Interactable.\n *\n | interact(target)\n | .dropChecker(function(dragEvent, // related dragmove or dragend event\n | event, // TouchEvent/PointerEvent/MouseEvent\n | dropped, // bool result of the default checker\n | dropzone, // dropzone Interactable\n | dropElement, // dropzone elemnt\n | draggable, // draggable Interactable\n | draggableElement) {// draggable element\n |\n | return dropped && event.target.hasAttribute('allow-drop');\n | }\n *\n *\n - options (boolean | object | null) #optional The new value to be set.\n | interact('.drop').dropzone({\n | accept: '.can-drop' || document.getElementById('single-drop'),\n | overlap: 'pointer' || 'center' || zeroToOne\n | }\n = (boolean | object) The current setting or this Interactable\n\\*/\nInteractable.prototype.dropzone = function (options) {\n if (utils.is.object(options)) {\n this.options.drop.enabled = options.enabled === false? false: true;\n\n if (utils.is.function(options.ondrop) ) { this.events.ondrop = options.ondrop ; }\n if (utils.is.function(options.ondropactivate) ) { this.events.ondropactivate = options.ondropactivate ; }\n if (utils.is.function(options.ondropdeactivate)) { this.events.ondropdeactivate = options.ondropdeactivate; }\n if (utils.is.function(options.ondragenter) ) { this.events.ondragenter = options.ondragenter ; }\n if (utils.is.function(options.ondragleave) ) { this.events.ondragleave = options.ondragleave ; }\n if (utils.is.function(options.ondropmove) ) { this.events.ondropmove = options.ondropmove ; }\n\n if (/^(pointer|center)$/.test(options.overlap)) {\n this.options.drop.overlap = options.overlap;\n }\n else if (utils.is.number(options.overlap)) {\n this.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0);\n }\n if ('accept' in options) {\n this.options.drop.accept = options.accept;\n }\n if ('checker' in options) {\n this.options.drop.checker = options.checker;\n }\n\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drop.enabled = options;\n\n if (!options) {\n this.ondragenter = this.ondragleave = this.ondrop\n = this.ondropactivate = this.ondropdeactivate = null;\n }\n\n return this;\n }\n\n return this.options.drop;\n};\n\nInteractable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) {\n let dropped = false;\n\n // if the dropzone has no rect (eg. display: none)\n // call the custom dropChecker or just return false\n if (!(rect = rect || this.getRect(dropElement))) {\n return (this.options.drop.checker\n ? this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement)\n : false);\n }\n\n const dropOverlap = this.options.drop.overlap;\n\n if (dropOverlap === 'pointer') {\n const origin = utils.getOriginXY(draggable, draggableElement, 'drag');\n const page = utils.getPageXY(dragEvent);\n\n page.x += origin.x;\n page.y += origin.y;\n\n const horizontal = (page.x > rect.left) && (page.x < rect.right);\n const vertical = (page.y > rect.top ) && (page.y < rect.bottom);\n\n dropped = horizontal && vertical;\n }\n\n const dragRect = draggable.getRect(draggableElement);\n\n if (dragRect && dropOverlap === 'center') {\n const cx = dragRect.left + dragRect.width / 2;\n const cy = dragRect.top + dragRect.height / 2;\n\n dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom;\n }\n\n if (dragRect && utils.is.number(dropOverlap)) {\n const overlapArea = (Math.max(0, Math.min(rect.right , dragRect.right ) - Math.max(rect.left, dragRect.left))\n * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top , dragRect.top )));\n\n const overlapRatio = overlapArea / (dragRect.width * dragRect.height);\n\n dropped = overlapRatio >= dropOverlap;\n }\n\n if (this.options.drop.checker) {\n dropped = this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement);\n }\n\n return dropped;\n};\n\nInteractable.signals.on('unset', function ({ interactable }) {\n interactable.dropzone(false);\n});\n\nInteractable.settingsMethods.push('dropChecker');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.dropTarget = null; // the dropzone a drag target might be dropped into\n interaction.dropElement = null; // the element at the time of checking\n interaction.prevDropTarget = null; // the dropzone that was recently dragged away from\n interaction.prevDropElement = null; // the element at the time of checking\n interaction.dropEvents = null; // the dropEvents related to the current drag event\n\n interaction.activeDrops = {\n dropzones: [], // the dropzones that are mentioned below\n elements : [], // elements of dropzones that accept the target draggable\n rects : [], // the rects of the elements mentioned above\n };\n\n});\n\nInteraction.signals.on('stop', function ({ interaction }) {\n interaction.dropTarget = interaction.dropElement =\n interaction.prevDropTarget = interaction.prevDropElement = null;\n});\n\n/*\\\n * interact.dynamicDrop\n [ method ]\n *\n * Returns or sets whether the dimensions of dropzone elements are\n * calculated on every dragmove or only on dragstart for the default\n * dropChecker\n *\n - newValue (boolean) #optional True to check on each move. False to check only before start\n = (boolean | interact) The current setting or interact\n\\*/\ninteract.dynamicDrop = function (newValue) {\n if (utils.is.bool(newValue)) {\n //if (dragging && dynamicDrop !== newValue && !newValue) {\n //calcRects(dropzones);\n //}\n\n dynamicDrop = newValue;\n\n return interact;\n }\n return dynamicDrop;\n};\n\nutils.merge(Interactable.eventTypes, [\n 'dragenter',\n 'dragleave',\n 'dropactivate',\n 'dropdeactivate',\n 'dropmove',\n 'drop',\n]);\nactions.methodDict.drop = 'dropzone';\n\ndefaultOptions.drop = drop.defaults;\n\nmodule.exports = drop;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst gesture = {\n defaults: {\n enabled : false,\n origin : null,\n restrict: null,\n },\n\n checker: function (pointer, event, interactable, element, interaction) {\n if (interaction.pointerIds.length >= 2) {\n return { name: 'gesture' };\n }\n\n return null;\n },\n\n getCursor: function () {\n return '';\n },\n};\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturestart') { return; }\n iEvent.ds = 0;\n\n interaction.gesture.startDistance = interaction.gesture.prevDistance = iEvent.distance;\n interaction.gesture.startAngle = interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.scale = 1;\n});\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturemove') { return; }\n\n iEvent.ds = iEvent.scale - interaction.gesture.scale;\n\n interaction.target.fire(iEvent);\n\n interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.prevDistance = iEvent.distance;\n\n if (iEvent.scale !== Infinity\n && iEvent.scale !== null\n && iEvent.scale !== undefined\n && !isNaN(iEvent.scale)) {\n\n interaction.gesture.scale = iEvent.scale;\n }\n});\n\n/*\\\n * Interactable.gesturable\n [ method ]\n *\n * Gets or sets whether multitouch gestures can be performed on the\n * Interactable's element\n *\n = (boolean) Indicates if this can be the target of gesture events\n | var isGestureable = interact(element).gesturable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on gesture events (makes the Interactable gesturable)\n = (object) this Interactable\n | interact(element).gesturable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // limit multiple gestures.\n | // See the explanation in @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n\\*/\nInteractable.prototype.gesturable = function (options) {\n if (utils.is.object(options)) {\n this.options.gesture.enabled = options.enabled === false? false: true;\n this.setPerAction('gesture', options);\n this.setOnEvents('gesture', options);\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.gesture.enabled = options;\n\n if (!options) {\n this.ongesturestart = this.ongesturestart = this.ongestureend = null;\n }\n\n return this;\n }\n\n return this.options.gesture;\n};\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action, event, starting, ending, deltaSource }) {\n if (action !== 'gesture') { return; }\n\n const pointers = interaction.pointers;\n\n iEvent.touches = [pointers[0], pointers[1]];\n\n if (starting) {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = 1;\n iEvent.ds = 0;\n iEvent.angle = utils.touchAngle(pointers, undefined, deltaSource);\n iEvent.da = 0;\n }\n else if (ending || event instanceof InteractEvent) {\n iEvent.distance = interaction.prevEvent.distance;\n iEvent.box = interaction.prevEvent.box;\n iEvent.scale = interaction.prevEvent.scale;\n iEvent.ds = iEvent.scale - 1;\n iEvent.angle = interaction.prevEvent.angle;\n iEvent.da = iEvent.angle - interaction.gesture.startAngle;\n }\n else {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = iEvent.distance / interaction.gesture.startDistance;\n iEvent.angle = utils.touchAngle(pointers, interaction.gesture.prevAngle, deltaSource);\n\n iEvent.ds = iEvent.scale - interaction.gesture.prevScale;\n iEvent.da = iEvent.angle - interaction.gesture.prevAngle;\n }\n});\n\nInteraction.signals.on('new', function (interaction) {\n interaction.gesture = {\n start: { x: 0, y: 0 },\n\n startDistance: 0, // distance between two touches of touchStart\n prevDistance : 0,\n distance : 0,\n\n scale: 1, // gesture.distance / gesture.startDistance\n\n startAngle: 0, // angle of line joining two touches\n prevAngle : 0, // angle of the previous gesture event\n };\n});\n\nactions.gesture = gesture;\nactions.names.push('gesture');\nutils.merge(Interactable.eventTypes, [\n 'gesturestart',\n 'gesturemove',\n 'gestureend',\n]);\nactions.methodDict.gesture = 'gesturable';\n\ndefaultOptions.gesture = gesture.defaults;\n\nmodule.exports = gesture;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\n// Less Precision with touch input\nconst defaultMargin = browser.supportsTouch || browser.supportsPointerEvent? 20: 10;\n\nconst resize = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n square: false,\n preserveAspectRatio: false,\n axis: 'xy',\n\n // use default margin\n margin: NaN,\n\n // object with props left, right, top, bottom which are\n // true/false values to resize when the pointer is over that edge,\n // CSS selectors to match the handles for each direction\n // or the Elements for each handle\n edges: null,\n\n // a value of 'none' will limit the resize rect to a minimum of 0x0\n // 'negate' will alow the rect to have negative width/height\n // 'reposition' will keep the width/height positive by swapping\n // the top and bottom edges and/or swapping the left and right edges\n invert: 'none',\n },\n\n checker: function (pointer, event, interactable, element, interaction, rect) {\n if (!rect) { return null; }\n\n const page = utils.extend({}, interaction.curCoords.page);\n const options = interactable.options;\n\n if (options.resize.enabled) {\n const resizeOptions = options.resize;\n const resizeEdges = { left: false, right: false, top: false, bottom: false };\n\n // if using resize.edges\n if (utils.is.object(resizeOptions.edges)) {\n for (const edge in resizeEdges) {\n resizeEdges[edge] = checkResizeEdge(edge,\n resizeOptions.edges[edge],\n page,\n interaction._eventTarget,\n element,\n rect,\n resizeOptions.margin || defaultMargin);\n }\n\n resizeEdges.left = resizeEdges.left && !resizeEdges.right;\n resizeEdges.top = resizeEdges.top && !resizeEdges.bottom;\n\n if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) {\n return {\n name: 'resize',\n edges: resizeEdges,\n };\n }\n }\n else {\n const right = options.resize.axis !== 'y' && page.x > (rect.right - defaultMargin);\n const bottom = options.resize.axis !== 'x' && page.y > (rect.bottom - defaultMargin);\n\n if (right || bottom) {\n return {\n name: 'resize',\n axes: (right? 'x' : '') + (bottom? 'y' : ''),\n };\n }\n }\n }\n\n return null;\n },\n\n cursors: (browser.isIe9OrOlder ? {\n x : 'e-resize',\n y : 's-resize',\n xy: 'se-resize',\n\n top : 'n-resize',\n left : 'w-resize',\n bottom : 's-resize',\n right : 'e-resize',\n topleft : 'se-resize',\n bottomright: 'se-resize',\n topright : 'ne-resize',\n bottomleft : 'ne-resize',\n } : {\n x : 'ew-resize',\n y : 'ns-resize',\n xy: 'nwse-resize',\n\n top : 'ns-resize',\n left : 'ew-resize',\n bottom : 'ns-resize',\n right : 'ew-resize',\n topleft : 'nwse-resize',\n bottomright: 'nwse-resize',\n topright : 'nesw-resize',\n bottomleft : 'nesw-resize',\n }),\n\n getCursor: function (action) {\n if (action.axis) {\n return resize.cursors[action.name + action.axis];\n }\n else if (action.edges) {\n let cursorKey = '';\n const edgeNames = ['top', 'bottom', 'left', 'right'];\n\n for (let i = 0; i < 4; i++) {\n if (action.edges[edgeNames[i]]) {\n cursorKey += edgeNames[i];\n }\n }\n\n return resize.cursors[cursorKey];\n }\n },\n};\n\n// resizestart\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'resizestart' || !interaction.prepared.edges) {\n return;\n }\n\n const startRect = interaction.target.getRect(interaction.element);\n const resizeOptions = interaction.target.options.resize;\n\n /*\n * When using the `resizable.square` or `resizable.preserveAspectRatio` options, resizing from one edge\n * will affect another. E.g. with `resizable.square`, resizing to make the right edge larger will make\n * the bottom edge larger by the same amount. We call these 'linked' edges. Any linked edges will depend\n * on the active edges and the edge being interacted with.\n */\n if (resizeOptions.square || resizeOptions.preserveAspectRatio) {\n const linkedEdges = utils.extend({}, interaction.prepared.edges);\n\n linkedEdges.top = linkedEdges.top || (linkedEdges.left && !linkedEdges.bottom);\n linkedEdges.left = linkedEdges.left || (linkedEdges.top && !linkedEdges.right );\n linkedEdges.bottom = linkedEdges.bottom || (linkedEdges.right && !linkedEdges.top );\n linkedEdges.right = linkedEdges.right || (linkedEdges.bottom && !linkedEdges.left );\n\n interaction.prepared._linkedEdges = linkedEdges;\n }\n else {\n interaction.prepared._linkedEdges = null;\n }\n\n // if using `resizable.preserveAspectRatio` option, record aspect ratio at the start of the resize\n if (resizeOptions.preserveAspectRatio) {\n interaction.resizeStartAspectRatio = startRect.width / startRect.height;\n }\n\n interaction.resizeRects = {\n start : startRect,\n current : utils.extend({}, startRect),\n inverted : utils.extend({}, startRect),\n previous : utils.extend({}, startRect),\n delta : {\n left: 0, right : 0, width : 0,\n top : 0, bottom: 0, height: 0,\n },\n };\n\n iEvent.rect = interaction.resizeRects.inverted;\n iEvent.deltaRect = interaction.resizeRects.delta;\n});\n\n// resizemove\nInteractEvent.signals.on('new', function ({ iEvent, phase, interaction }) {\n if (phase !== 'move' || !interaction.prepared.edges) { return; }\n\n const resizeOptions = interaction.target.options.resize;\n const invert = resizeOptions.invert;\n const invertible = invert === 'reposition' || invert === 'negate';\n\n let edges = interaction.prepared.edges;\n\n const start = interaction.resizeRects.start;\n const current = interaction.resizeRects.current;\n const inverted = interaction.resizeRects.inverted;\n const delta = interaction.resizeRects.delta;\n const previous = utils.extend(interaction.resizeRects.previous, inverted);\n const originalEdges = edges;\n\n let dx = iEvent.dx;\n let dy = iEvent.dy;\n\n if (resizeOptions.preserveAspectRatio || resizeOptions.square) {\n // `resize.preserveAspectRatio` takes precedence over `resize.square`\n const startAspectRatio = resizeOptions.preserveAspectRatio\n ? interaction.resizeStartAspectRatio\n : 1;\n\n edges = interaction.prepared._linkedEdges;\n\n if ((originalEdges.left && originalEdges.bottom)\n || (originalEdges.right && originalEdges.top)) {\n dy = -dx / startAspectRatio;\n }\n else if (originalEdges.left || originalEdges.right ) { dy = dx / startAspectRatio; }\n else if (originalEdges.top || originalEdges.bottom) { dx = dy * startAspectRatio; }\n }\n\n // update the 'current' rect without modifications\n if (edges.top ) { current.top += dy; }\n if (edges.bottom) { current.bottom += dy; }\n if (edges.left ) { current.left += dx; }\n if (edges.right ) { current.right += dx; }\n\n if (invertible) {\n // if invertible, copy the current rect\n utils.extend(inverted, current);\n\n if (invert === 'reposition') {\n // swap edge values if necessary to keep width/height positive\n let swap;\n\n if (inverted.top > inverted.bottom) {\n swap = inverted.top;\n\n inverted.top = inverted.bottom;\n inverted.bottom = swap;\n }\n if (inverted.left > inverted.right) {\n swap = inverted.left;\n\n inverted.left = inverted.right;\n inverted.right = swap;\n }\n }\n }\n else {\n // if not invertible, restrict to minimum of 0x0 rect\n inverted.top = Math.min(current.top, start.bottom);\n inverted.bottom = Math.max(current.bottom, start.top);\n inverted.left = Math.min(current.left, start.right);\n inverted.right = Math.max(current.right, start.left);\n }\n\n inverted.width = inverted.right - inverted.left;\n inverted.height = inverted.bottom - inverted.top ;\n\n for (const edge in inverted) {\n delta[edge] = inverted[edge] - previous[edge];\n }\n\n iEvent.edges = interaction.prepared.edges;\n iEvent.rect = inverted;\n iEvent.deltaRect = delta;\n});\n\n/*\\\n * Interactable.resizable\n [ method ]\n *\n * Gets or sets whether resize actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of resize elements\n | var isResizeable = interact('input[type=text]').resizable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on resize events (object makes the Interactable resizable)\n = (object) This Interactable\n | interact(element).resizable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | edges: {\n | top : true, // Use pointer coords to check for resize.\n | left : false, // Disable resizing from left edge.\n | bottom: '.resize-s',// Resize if pointer target matches selector\n | right : handleEl // Resize if pointer target is the given Element\n | },\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height are adjusted at a 1:1 ratio.\n | square: false,\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height maintain the aspect ratio they had when resizing started.\n | preserveAspectRatio: false,\n |\n | // a value of 'none' will limit the resize rect to a minimum of 0x0\n | // 'negate' will allow the rect to have negative width/height\n | // 'reposition' will keep the width/height positive by swapping\n | // the top and bottom edges and/or swapping the left and right edges\n | invert: 'none' || 'negate' || 'reposition'\n |\n | // limit multiple resizes.\n | // See the explanation in the @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n \\*/\nInteractable.prototype.resizable = function (options) {\n if (utils.is.object(options)) {\n this.options.resize.enabled = options.enabled === false? false: true;\n this.setPerAction('resize', options);\n this.setOnEvents('resize', options);\n\n if (/^x$|^y$|^xy$/.test(options.axis)) {\n this.options.resize.axis = options.axis;\n }\n else if (options.axis === null) {\n this.options.resize.axis = defaultOptions.resize.axis;\n }\n\n if (utils.is.bool(options.preserveAspectRatio)) {\n this.options.resize.preserveAspectRatio = options.preserveAspectRatio;\n }\n else if (utils.is.bool(options.square)) {\n this.options.resize.square = options.square;\n }\n\n return this;\n }\n if (utils.is.bool(options)) {\n this.options.resize.enabled = options;\n\n if (!options) {\n this.onresizestart = this.onresizestart = this.onresizeend = null;\n }\n\n return this;\n }\n return this.options.resize;\n};\n\nfunction checkResizeEdge (name, value, page, element, interactableElement, rect, margin) {\n // false, '', undefined, null\n if (!value) { return false; }\n\n // true value, use pointer coords and element rect\n if (value === true) {\n // if dimensions are negative, \"switch\" edges\n const width = utils.is.number(rect.width )? rect.width : rect.right - rect.left;\n const height = utils.is.number(rect.height)? rect.height : rect.bottom - rect.top ;\n\n if (width < 0) {\n if (name === 'left' ) { name = 'right'; }\n else if (name === 'right') { name = 'left' ; }\n }\n if (height < 0) {\n if (name === 'top' ) { name = 'bottom'; }\n else if (name === 'bottom') { name = 'top' ; }\n }\n\n if (name === 'left' ) { return page.x < ((width >= 0? rect.left: rect.right ) + margin); }\n if (name === 'top' ) { return page.y < ((height >= 0? rect.top : rect.bottom) + margin); }\n\n if (name === 'right' ) { return page.x > ((width >= 0? rect.right : rect.left) - margin); }\n if (name === 'bottom') { return page.y > ((height >= 0? rect.bottom: rect.top ) - margin); }\n }\n\n // the remaining checks require an element\n if (!utils.is.element(element)) { return false; }\n\n return utils.is.element(value)\n // the value is an element to use as a resize handle\n ? value === element\n // otherwise check if element matches value as selector\n : utils.matchesUpTo(element, value, interactableElement);\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.resizeAxes = 'xy';\n});\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action }) {\n if (action !== 'resize' || !interaction.resizeAxes) { return; }\n\n const options = interaction.target.options;\n\n if (options.resize.square) {\n if (interaction.resizeAxes === 'y') {\n iEvent.dx = iEvent.dy;\n }\n else {\n iEvent.dy = iEvent.dx;\n }\n iEvent.axes = 'xy';\n }\n else {\n iEvent.axes = interaction.resizeAxes;\n\n if (interaction.resizeAxes === 'x') {\n iEvent.dy = 0;\n }\n else if (interaction.resizeAxes === 'y') {\n iEvent.dx = 0;\n }\n }\n});\n\nactions.resize = resize;\nactions.names.push('resize');\nutils.merge(Interactable.eventTypes, [\n 'resizestart',\n 'resizemove',\n 'resizeinertiastart',\n 'resizeinertiaresume',\n 'resizeend',\n]);\nactions.methodDict.resize = 'resizable';\n\ndefaultOptions.resize = resize.defaults;\n\nmodule.exports = resize;\n","const raf = require('./utils/raf');\nconst getWindow = require('./utils/window').getWindow;\nconst is = require('./utils/is');\nconst domUtils = require('./utils/domUtils');\nconst Interaction = require('./Interaction');\nconst defaultOptions = require('./defaultOptions');\n\nconst autoScroll = {\n defaults: {\n enabled : false,\n container: null, // the item that is scrolled (Window or HTMLElement)\n margin : 60,\n speed : 300, // the scroll speed in pixels per second\n },\n\n interaction: null,\n i: null, // the handle returned by window.setInterval\n x: 0, y: 0, // Direction each pulse is to scroll in\n\n isScrolling: false,\n prevTime: 0,\n\n start: function (interaction) {\n autoScroll.isScrolling = true;\n raf.cancel(autoScroll.i);\n\n autoScroll.interaction = interaction;\n autoScroll.prevTime = new Date().getTime();\n autoScroll.i = raf.request(autoScroll.scroll);\n },\n\n stop: function () {\n autoScroll.isScrolling = false;\n raf.cancel(autoScroll.i);\n },\n\n // scroll the window by the values in scroll.x/y\n scroll: function () {\n const options = autoScroll.interaction.target.options[autoScroll.interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(autoScroll.interaction.element);\n const now = new Date().getTime();\n // change in time in seconds\n const dt = (now - autoScroll.prevTime) / 1000;\n // displacement\n const s = options.speed * dt;\n\n if (s >= 1) {\n if (is.window(container)) {\n container.scrollBy(autoScroll.x * s, autoScroll.y * s);\n }\n else if (container) {\n container.scrollLeft += autoScroll.x * s;\n container.scrollTop += autoScroll.y * s;\n }\n\n autoScroll.prevTime = now;\n }\n\n if (autoScroll.isScrolling) {\n raf.cancel(autoScroll.i);\n autoScroll.i = raf.request(autoScroll.scroll);\n }\n },\n check: function (interactable, actionName) {\n const options = interactable.options;\n\n return options[actionName].autoScroll && options[actionName].autoScroll.enabled;\n },\n onInteractionMove: function ({ interaction, pointer }) {\n if (!(interaction.interacting()\n && autoScroll.check(interaction.target, interaction.prepared.name))) {\n return;\n }\n\n if (interaction.simulation) {\n autoScroll.x = autoScroll.y = 0;\n return;\n }\n\n let top;\n let right;\n let bottom;\n let left;\n\n const options = interaction.target.options[interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(interaction.element);\n\n if (is.window(container)) {\n left = pointer.clientX < autoScroll.margin;\n top = pointer.clientY < autoScroll.margin;\n right = pointer.clientX > container.innerWidth - autoScroll.margin;\n bottom = pointer.clientY > container.innerHeight - autoScroll.margin;\n }\n else {\n const rect = domUtils.getElementClientRect(container);\n\n left = pointer.clientX < rect.left + autoScroll.margin;\n top = pointer.clientY < rect.top + autoScroll.margin;\n right = pointer.clientX > rect.right - autoScroll.margin;\n bottom = pointer.clientY > rect.bottom - autoScroll.margin;\n }\n\n autoScroll.x = (right ? 1: left? -1: 0);\n autoScroll.y = (bottom? 1: top? -1: 0);\n\n if (!autoScroll.isScrolling) {\n // set the autoScroll properties to those of the target\n autoScroll.margin = options.margin;\n autoScroll.speed = options.speed;\n\n autoScroll.start(interaction);\n }\n },\n};\n\nInteraction.signals.on('stop-active', function () {\n autoScroll.stop();\n});\n\nInteraction.signals.on('action-move', autoScroll.onInteractionMove);\n\ndefaultOptions.perAction.autoScroll = autoScroll.defaults;\n\nmodule.exports = autoScroll;\n","const Interactable = require('../Interactable');\nconst actions = require('../actions/base');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.ignoreFrom\n [ method ]\n *\n * If the target of the `mousedown`, `pointerdown` or `touchstart`\n * event or any of it's parents match the given CSS selector or\n * Element, no drag/resize/gesture is started.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to not ignore any elements\n = (string | Element | object) The current ignoreFrom value or this Interactable\n **\n | interact(element, { ignoreFrom: document.getElementById('no-action') });\n | // or\n | interact(element).ignoreFrom('input, textarea, a');\n\\*/\nInteractable.prototype.ignoreFrom = function (newValue) {\n return this._backCompatOption('ignoreFrom', newValue);\n};\n\n/*\\\n * Interactable.allowFrom\n [ method ]\n *\n * A drag/resize/gesture is started only If the target of the\n * `mousedown`, `pointerdown` or `touchstart` event or any of it's\n * parents match the given CSS selector or Element.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to allow from any element\n = (string | Element | object) The current allowFrom value or this Interactable\n **\n | interact(element, { allowFrom: document.getElementById('drag-handle') });\n | // or\n | interact(element).allowFrom('.handle');\n\\*/\nInteractable.prototype.allowFrom = function (newValue) {\n return this._backCompatOption('allowFrom', newValue);\n};\n\nInteractable.prototype.testIgnore = function (ignoreFrom, interactableElement, element) {\n if (!ignoreFrom || !is.element(element)) { return false; }\n\n if (is.string(ignoreFrom)) {\n return domUtils.matchesUpTo(element, ignoreFrom, interactableElement);\n }\n else if (is.element(ignoreFrom)) {\n return domUtils.nodeContains(ignoreFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testAllow = function (allowFrom, interactableElement, element) {\n if (!allowFrom) { return true; }\n\n if (!is.element(element)) { return false; }\n\n if (is.string(allowFrom)) {\n return domUtils.matchesUpTo(element, allowFrom, interactableElement);\n }\n else if (is.element(allowFrom)) {\n return domUtils.nodeContains(allowFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testIgnoreAllow = function (options, interactableElement, eventTarget) {\n return (!this.testIgnore(options.ignoreFrom, interactableElement, eventTarget)\n && this.testAllow(options.allowFrom, interactableElement, eventTarget));\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (event.buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\n","const interact = require('../interact');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst actions = require('../actions/base');\nconst defaultOptions = require('../defaultOptions');\nconst browser = require('../utils/browser');\nconst scope = require('../scope');\nconst utils = require('../utils');\nconst signals = require('../utils/Signals').new();\n\nrequire('./InteractableMethods');\n\nconst autoStart = {\n signals,\n withinInteractionLimit,\n // Allow this many interactions to happen simultaneously\n maxInteractions: Infinity,\n defaults: {\n perAction: {\n manualStart: false,\n max: Infinity,\n maxPerElement: 1,\n allowFrom: null,\n ignoreFrom: null,\n },\n },\n setActionDefaults: function (action) {\n utils.extend(action.defaults, autoStart.defaults.perAction);\n },\n};\n\n// set cursor style on mousedown\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget }) {\n if (interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\n// set cursor style on mousemove\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget }) {\n if (!interaction.mouse\n || interaction.pointerIsDown\n || interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\nInteraction.signals.on('move', function (arg) {\n const { interaction, event } = arg;\n\n if (!interaction.pointerIsDown\n || interaction.interacting()\n || !interaction.pointerWasMoved\n || !interaction.prepared.name) {\n return;\n }\n\n signals.fire('before-start', arg);\n\n const target = interaction.target;\n\n if (interaction.prepared.name && target) {\n // check manualStart and interaction limit\n if (target.options[interaction.prepared.name].manualStart\n || !withinInteractionLimit(target, interaction.element, interaction.prepared)) {\n interaction.stop(event);\n }\n else {\n interaction.start(interaction.prepared, target, interaction.element);\n }\n }\n});\n\n// Check if the current target supports the action.\n// If so, return the validated action. Otherwise, return null\nfunction validateAction (action, interactable, element, eventTarget) {\n if (utils.is.object(action)\n && interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget)\n && interactable.options[action.name].enabled\n && withinInteractionLimit(interactable, element, action)) {\n return action;\n }\n\n return null;\n}\n\nfunction validateSelector (interaction, pointer, event, matches, matchElements, eventTarget) {\n for (let i = 0, len = matches.length; i < len; i++) {\n const match = matches[i];\n const matchElement = matchElements[i];\n const action = validateAction(match.getAction(pointer, event, interaction, matchElement),\n match,\n matchElement,\n eventTarget);\n\n if (action) {\n return {\n action,\n target: match,\n element: matchElement,\n };\n }\n }\n\n return {};\n}\n\nfunction getActionInfo (interaction, pointer, event, eventTarget) {\n let matches = [];\n let matchElements = [];\n\n let element = eventTarget;\n let action = null;\n\n function pushMatches (interactable, selector, context) {\n const elements = (browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined);\n\n if (utils.matchesSelector(element, selector, elements)) {\n\n matches.push(interactable);\n matchElements.push(element);\n }\n }\n\n while (utils.is.element(element)) {\n matches = [];\n matchElements = [];\n\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && (action = validateAction(elementInteractable.getAction(pointer, event, interaction, element, eventTarget),\n elementInteractable,\n element,\n eventTarget))\n && !elementInteractable.options[action.name].manualStart) {\n return {\n element,\n action,\n target: elementInteractable,\n };\n }\n else {\n scope.interactables.forEachSelector(pushMatches, element);\n\n const actionInfo = validateSelector(interaction, pointer, event, matches, matchElements, eventTarget);\n\n if (actionInfo.action\n && !actionInfo.target.options[actionInfo.action.name].manualStart) {\n return actionInfo;\n }\n }\n\n element = utils.parentNode(element);\n }\n\n return {};\n}\n\nfunction prepare (interaction, { action, target, element }) {\n action = action || {};\n\n if (interaction.target && interaction.target.options.styleCursor) {\n interaction.target._doc.documentElement.style.cursor = '';\n }\n\n interaction.target = target;\n interaction.element = element;\n utils.copyAction(interaction.prepared, action);\n\n if (target && target.options.styleCursor) {\n const cursor = action? actions[action.name].getCursor(action) : '';\n interaction.target._doc.documentElement.style.cursor = cursor;\n }\n\n signals.fire('prepared', { interaction: interaction });\n}\n\nInteraction.signals.on('stop', function ({ interaction }) {\n const target = interaction.target;\n\n if (target && target.options.styleCursor) {\n target._doc.documentElement.style.cursor = '';\n }\n});\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (utils.is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (utils.is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n const buttons = event.buttons || ({\n 0: 1,\n 1: 4,\n 3: 8,\n 4: 16,\n })[event.button];\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\nfunction withinInteractionLimit (interactable, element, action) {\n const options = interactable.options;\n const maxActions = options[action.name].max;\n const maxPerElement = options[action.name].maxPerElement;\n let activeInteractions = 0;\n let targetCount = 0;\n let targetElementCount = 0;\n\n // no actions if any of these values == 0\n if (!(maxActions && maxPerElement && autoStart.maxInteractions)) { return; }\n\n for (let i = 0, len = scope.interactions.length; i < len; i++) {\n const interaction = scope.interactions[i];\n const otherAction = interaction.prepared.name;\n\n if (!interaction.interacting()) { continue; }\n\n activeInteractions++;\n\n if (activeInteractions >= autoStart.maxInteractions) {\n return false;\n }\n\n if (interaction.target !== interactable) { continue; }\n\n targetCount += (otherAction === action.name)|0;\n\n if (targetCount >= maxActions) {\n return false;\n }\n\n if (interaction.element === element) {\n targetElementCount++;\n\n if (otherAction !== action.name || targetElementCount >= maxPerElement) {\n return false;\n }\n }\n }\n\n return autoStart.maxInteractions > 0;\n}\n\n/*\\\n * interact.maxInteractions\n [ method ]\n **\n * Returns or sets the maximum number of concurrent interactions allowed.\n * By default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables\n * and elements, you need to enable it in the draggable, resizable and\n * gesturable `'max'` and `'maxPerElement'` options.\n **\n - newValue (number) #optional Any number. newValue <= 0 means no interactions.\n\\*/\ninteract.maxInteractions = function (newValue) {\n if (utils.is.number(newValue)) {\n autoStart.maxInteractions = newValue;\n\n return this;\n }\n\n return autoStart.maxInteractions;\n};\n\nInteractable.settingsMethods.push('styleCursor');\nInteractable.settingsMethods.push('actionChecker');\nInteractable.settingsMethods.push('ignoreFrom');\nInteractable.settingsMethods.push('allowFrom');\n\ndefaultOptions.base.actionChecker = null;\ndefaultOptions.base.styleCursor = true;\n\nutils.extend(defaultOptions.perAction, autoStart.defaults.perAction);\n\nmodule.exports = autoStart;\n","const autoStart = require('./base');\nconst Interaction = require('../Interaction');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.delayTimer = null;\n});\n\nautoStart.signals.on('prepared', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.delayTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.target, interaction.element);\n }, delay);\n }\n});\n\nInteraction.signals.on('move', function ({ interaction, duplicate }) {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.delayTimer);\n }\n});\n\n// prevent regular down->move autoStart\nautoStart.signals.on('before-start', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.prepared.name = null;\n }\n});\n","const autoStart = require('./base');\nconst scope = require('../scope');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\n\nconst { matchesSelector, parentNode } = require('../utils/domUtils');\n\nautoStart.setActionDefaults(require('../actions/drag'));\n\nautoStart.signals.on('before-start', function ({ interaction, eventTarget, dx, dy }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // check if a drag is in the correct axis\n const absX = Math.abs(dx);\n const absY = Math.abs(dy);\n const options = interaction.target.options.drag;\n const startAxis = options.startAxis;\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy');\n\n interaction.prepared.axis = options.lockAxis === 'start'\n ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n : options.lockAxis;\n\n // if the movement isn't in the startAxis of the interactable\n if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) {\n // cancel the prepared action\n interaction.prepared.name = null;\n\n // then try to get a drag from another ineractable\n\n if (!interaction.prepared.name) {\n\n let element = eventTarget;\n\n const getDraggable = function (interactable, selector, context) {\n const elements = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n if (interactable === interaction.target) { return; }\n\n if (!options.manualStart\n && !interactable.testIgnoreAllow(options, element, eventTarget)\n && matchesSelector(element, selector, elements)) {\n\n const action = interactable.getAction(interaction.downPointer,\n interaction.downEvent,\n interaction,\n element);\n\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, interactable)\n && autoStart.validateAction(action, interactable, element, eventTarget)) {\n\n return interactable;\n }\n }\n };\n\n let action = null;\n\n // check all interactables\n while (is.element(element)) {\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && elementInteractable !== interaction.target\n && !elementInteractable.options.drag.manualStart) {\n\n action = elementInteractable.getAction(interaction.downPointer, interaction.downEvent, interaction, element);\n }\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, elementInteractable)) {\n\n interaction.prepared.name = 'drag';\n interaction.target = elementInteractable;\n interaction.element = element;\n break;\n }\n\n const selectorInteractable = scope.interactables.forEachSelector(getDraggable, element);\n\n if (selectorInteractable) {\n interaction.prepared.name = 'drag';\n interaction.target = selectorInteractable;\n interaction.element = element;\n break;\n }\n\n element = parentNode(element);\n }\n }\n }\n});\n\nfunction checkStartAxis (startAxis, interactable) {\n if (!interactable) { return false; }\n\n const thisAxis = interactable.options.drag.startAxis;\n\n return (startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis);\n}\n","require('./base').setActionDefaults(require('../actions/gesture'));\n","require('./base').setActionDefaults(require('../actions/resize'));\n","module.exports = {\n base: {\n accept : null,\n preventDefault: 'auto',\n deltaSource : 'page',\n },\n\n perAction: {\n origin: { x: 0, y: 0 },\n\n // only allow left button by default\n // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n mouseButtons: 1,\n\n inertia: {\n enabled : false,\n resistance : 10, // the lambda in exponential decay\n minSpeed : 100, // target speed must be above this for inertia to start\n endSpeed : 10, // the speed at which inertia is slow enough to stop\n allowResume : true, // allow resuming an action in inertia phase\n smoothEndDuration: 300, // animate to snap/restrict endOnly if there's no inertia\n },\n },\n};\n","/* browser entry point */\n\n// Legacy browser support\nrequire('./legacyBrowsers');\n\n// inertia\nrequire('./inertia');\n\n// modifiers\nrequire('./modifiers/snap');\nrequire('./modifiers/restrict');\n\n// pointerEvents\nrequire('./pointerEvents/base');\nrequire('./pointerEvents/holdRepeat');\nrequire('./pointerEvents/interactableTargets');\n\n// delay\nrequire('./autoStart/delay');\n\n// actions\nrequire('./actions/gesture');\nrequire('./actions/resize');\nrequire('./actions/drag');\nrequire('./actions/drop');\n\n// load these modifiers after resize is loaded\nrequire('./modifiers/snapSize');\nrequire('./modifiers/restrictEdges');\nrequire('./modifiers/restrictSize');\n\n// autoStart actions\nrequire('./autoStart/gesture');\nrequire('./autoStart/resize');\nrequire('./autoStart/drag');\n\n// Interactable preventDefault setting\nrequire('./interactablePreventDefault.js');\n\n// autoScroll\nrequire('./autoScroll');\n\n// export interact\nmodule.exports = require('./interact');\n","const InteractEvent = require('./InteractEvent');\nconst Interaction = require('./Interaction');\nconst modifiers = require('./modifiers');\nconst utils = require('./utils');\nconst animationFrame = require('./utils/raf');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.inertiaStatus = {\n active : false,\n smoothEnd : false,\n allowResume: false,\n\n startEvent: null,\n upCoords : {},\n\n xe: 0, ye: 0,\n sx: 0, sy: 0,\n\n t0: 0,\n vx0: 0, vys: 0,\n duration: 0,\n\n lambda_v0: 0,\n one_ve_v0: 0,\n i : null,\n };\n\n interaction.boundInertiaFrame = () => inertiaFrame .apply(interaction);\n interaction.boundSmoothEndFrame = () => smoothEndFrame.apply(interaction);\n});\n\nInteraction.signals.on('down', function ({ interaction, event, pointer, eventTarget }) {\n const status = interaction.inertiaStatus;\n\n // Check if the down event hits the current inertia target\n if (status.active) {\n let element = eventTarget;\n\n // climb up the DOM tree from the event target\n while (utils.is.element(element)) {\n\n // if interaction element is the current inertia target element\n if (element === interaction.element) {\n // stop inertia\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n\n // update pointers to the down event's coordinates\n interaction.updatePointer(pointer);\n utils.setCoords(interaction.curCoords, interaction.pointers);\n\n // fire appropriate signals\n const signalArg = { interaction };\n Interaction.signals.fire('before-action-move', signalArg);\n Interaction.signals.fire('action-resume' , signalArg);\n\n // fire a reume event\n const resumeEvent = new InteractEvent(interaction,\n event,\n interaction.prepared.name,\n 'inertiaresume',\n interaction.element);\n\n interaction.target.fire(resumeEvent);\n interaction.prevEvent = resumeEvent;\n modifiers.resetStatuses(interaction.modifierStatuses);\n\n utils.copyCoords(interaction.prevCoords, interaction.curCoords);\n break;\n }\n\n element = utils.parentNode(element);\n }\n }\n});\n\nInteraction.signals.on('up', function ({ interaction, event }) {\n const status = interaction.inertiaStatus;\n\n if (!interaction.interacting() || status.active) { return; }\n\n const target = interaction.target;\n const options = target && target.options;\n const inertiaOptions = options && interaction.prepared.name && options[interaction.prepared.name].inertia;\n\n const now = new Date().getTime();\n const statuses = {};\n const page = utils.extend({}, interaction.curCoords.page);\n const pointerSpeed = interaction.pointerDelta.client.speed;\n\n let smoothEnd = false;\n let modifierResult;\n\n // check if inertia should be started\n const inertiaPossible = (inertiaOptions && inertiaOptions.enabled\n && interaction.prepared.name !== 'gesture'\n && event !== status.startEvent);\n\n const inertia = (inertiaPossible\n && (now - interaction.curCoords.timeStamp) < 50\n && pointerSpeed > inertiaOptions.minSpeed\n && pointerSpeed > inertiaOptions.endSpeed);\n\n const modifierArg = {\n interaction,\n pageCoords: page,\n statuses,\n preEnd: true,\n requireEndOnly: true,\n };\n\n // smoothEnd\n if (inertiaPossible && !inertia) {\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n if (modifierResult.shouldMove && modifierResult.locked) {\n smoothEnd = true;\n }\n }\n\n if (!(inertia || smoothEnd)) { return; }\n\n utils.copyCoords(status.upCoords, interaction.curCoords);\n\n interaction.pointers[0] = status.startEvent =\n new InteractEvent(interaction, event, interaction.prepared.name, 'inertiastart', interaction.element);\n\n status.t0 = now;\n\n status.active = true;\n status.allowResume = inertiaOptions.allowResume;\n interaction.simulation = status;\n\n target.fire(status.startEvent);\n\n if (inertia) {\n status.vx0 = interaction.pointerDelta.client.vx;\n status.vy0 = interaction.pointerDelta.client.vy;\n status.v0 = pointerSpeed;\n\n calcInertia(interaction, status);\n\n utils.extend(page, interaction.curCoords.page);\n\n page.x += status.xe;\n page.y += status.ye;\n\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n status.modifiedXe += modifierResult.dx;\n status.modifiedYe += modifierResult.dy;\n\n status.i = animationFrame.request(interaction.boundInertiaFrame);\n }\n else {\n status.smoothEnd = true;\n status.xe = modifierResult.dx;\n status.ye = modifierResult.dy;\n\n status.sx = status.sy = 0;\n\n status.i = animationFrame.request(interaction.boundSmoothEndFrame);\n }\n});\n\nInteraction.signals.on('stop-active', function ({ interaction }) {\n const status = interaction.inertiaStatus;\n\n if (status.active) {\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n }\n});\n\nfunction calcInertia (interaction, status) {\n const inertiaOptions = interaction.target.options[interaction.prepared.name].inertia;\n const lambda = inertiaOptions.resistance;\n const inertiaDur = -Math.log(inertiaOptions.endSpeed / status.v0) / lambda;\n\n status.x0 = interaction.prevEvent.pageX;\n status.y0 = interaction.prevEvent.pageY;\n status.t0 = status.startEvent.timeStamp / 1000;\n status.sx = status.sy = 0;\n\n status.modifiedXe = status.xe = (status.vx0 - inertiaDur) / lambda;\n status.modifiedYe = status.ye = (status.vy0 - inertiaDur) / lambda;\n status.te = inertiaDur;\n\n status.lambda_v0 = lambda / status.v0;\n status.one_ve_v0 = 1 - inertiaOptions.endSpeed / status.v0;\n}\n\nfunction inertiaFrame () {\n updateInertiaCoords(this);\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n\n const status = this.inertiaStatus;\n const options = this.target.options[this.prepared.name].inertia;\n const lambda = options.resistance;\n const t = new Date().getTime() / 1000 - status.t0;\n\n if (t < status.te) {\n\n const progress = 1 - (Math.exp(-lambda * t) - status.lambda_v0) / status.one_ve_v0;\n\n if (status.modifiedXe === status.xe && status.modifiedYe === status.ye) {\n status.sx = status.xe * progress;\n status.sy = status.ye * progress;\n }\n else {\n const quadPoint = utils.getQuadraticCurvePoint(0, 0,\n status.xe,\n status.ye,\n status.modifiedXe,\n status.modifiedYe,\n progress);\n\n status.sx = quadPoint.x;\n status.sy = quadPoint.y;\n }\n\n this.doMove();\n\n status.i = animationFrame.request(this.boundInertiaFrame);\n }\n else {\n status.sx = status.modifiedXe;\n status.sy = status.modifiedYe;\n\n this.doMove();\n this.end(status.startEvent);\n status.active = false;\n this.simulation = null;\n }\n\n utils.copyCoords(this.prevCoords, this.curCoords);\n}\n\nfunction smoothEndFrame () {\n updateInertiaCoords(this);\n\n const status = this.inertiaStatus;\n const t = new Date().getTime() - status.t0;\n const duration = this.target.options[this.prepared.name].inertia.smoothEndDuration;\n\n if (t < duration) {\n status.sx = utils.easeOutQuad(t, 0, status.xe, duration);\n status.sy = utils.easeOutQuad(t, 0, status.ye, duration);\n\n this.pointerMove(status.startEvent, status.startEvent);\n\n status.i = animationFrame.request(this.boundSmoothEndFrame);\n }\n else {\n status.sx = status.xe;\n status.sy = status.ye;\n\n this.pointerMove(status.startEvent, status.startEvent);\n this.end(status.startEvent);\n\n status.smoothEnd =\n status.active = false;\n this.simulation = null;\n }\n}\n\nfunction updateInertiaCoords (interaction) {\n const status = interaction.inertiaStatus;\n\n // return if inertia isn't running\n if (!status.active) { return; }\n\n const pageUp = status.upCoords.page;\n const clientUp = status.upCoords.client;\n\n utils.setCoords(interaction.curCoords, [ {\n pageX : pageUp.x + status.sx,\n pageY : pageUp.y + status.sy,\n clientX: clientUp.x + status.sx,\n clientY: clientUp.y + status.sy,\n } ]);\n}\n","const browser = require('./utils/browser');\nconst events = require('./utils/events');\nconst utils = require('./utils');\nconst scope = require('./scope');\nconst Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\n\nconst globalEvents = {};\n\n/*\\\n * interact\n [ method ]\n *\n * The methods of this variable can be used to set elements as\n * interactables and also to change various default settings.\n *\n * Calling it as a function and passing an element or a valid CSS selector\n * string returns an Interactable object which has various methods to\n * configure it.\n *\n - element (Element | string) The HTML or SVG Element to interact with or CSS selector\n = (object) An @Interactable\n *\n > Usage\n | interact('#draggable').draggable(true);\n |\n | var rectables = interact('rect');\n | rectables\n | .gesturable(true)\n | .on('gesturemove', function (event) {\n | // ...\n | });\n\\*/\nfunction interact (element, options) {\n let interactable = scope.interactables.get(element, options);\n\n if (!interactable) {\n interactable = new Interactable(element, options);\n interactable.events.global = globalEvents;\n }\n\n return interactable;\n}\n\n/*\\\n * interact.isSet\n [ method ]\n *\n * Check if an element has been set\n - element (Element) The Element being searched for\n = (boolean) Indicates if the element or CSS selector was previously passed to interact\n\\*/\ninteract.isSet = function (element, options) {\n return scope.interactables.indexOfElement(element, options && options.context) !== -1;\n};\n\n/*\\\n * interact.on\n [ method ]\n *\n * Adds a global listener for an InteractEvent or adds a DOM event to\n * `document`\n *\n - type (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) interact\n\\*/\ninteract.on = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.on(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.on(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n // if it is an InteractEvent type, add listener to globalEvents\n if (utils.contains(Interactable.eventTypes, type)) {\n // if this type of event was never bound\n if (!globalEvents[type]) {\n globalEvents[type] = [listener];\n }\n else {\n globalEvents[type].push(listener);\n }\n }\n // If non InteractEvent type, addEventListener to document\n else {\n events.add(scope.document, type, listener, { options });\n }\n\n return interact;\n};\n\n/*\\\n * interact.off\n [ method ]\n *\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n - type (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) interact\n \\*/\ninteract.off = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.off(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.off(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n if (!utils.contains(Interactable.eventTypes, type)) {\n events.remove(scope.document, type, listener, options);\n }\n else {\n let index;\n\n if (type in globalEvents\n && (index = utils.indexOf(globalEvents[type], listener)) !== -1) {\n globalEvents[type].splice(index, 1);\n }\n }\n\n return interact;\n};\n\n/*\\\n * interact.debug\n [ method ]\n *\n * Returns an object which exposes internal data\n = (object) An object with properties that outline the current state and expose internal functions and variables\n\\*/\ninteract.debug = function () {\n return scope;\n};\n\n// expose the functions used to calculate multi-touch properties\ninteract.getPointerAverage = utils.pointerAverage;\ninteract.getTouchBBox = utils.touchBBox;\ninteract.getTouchDistance = utils.touchDistance;\ninteract.getTouchAngle = utils.touchAngle;\n\ninteract.getElementRect = utils.getElementRect;\ninteract.getElementClientRect = utils.getElementClientRect;\ninteract.matchesSelector = utils.matchesSelector;\ninteract.closest = utils.closest;\n\n/*\\\n * interact.supportsTouch\n [ method ]\n *\n = (boolean) Whether or not the browser supports touch input\n\\*/\ninteract.supportsTouch = function () {\n return browser.supportsTouch;\n};\n\n/*\\\n * interact.supportsPointerEvent\n [ method ]\n *\n = (boolean) Whether or not the browser supports PointerEvents\n\\*/\ninteract.supportsPointerEvent = function () {\n return browser.supportsPointerEvent;\n};\n\n/*\\\n * interact.stop\n [ method ]\n *\n * Cancels all interactions (end events are not fired)\n *\n - event (Event) An event on which to call preventDefault()\n = (object) interact\n\\*/\ninteract.stop = function (event) {\n for (let i = scope.interactions.length - 1; i >= 0; i--) {\n scope.interactions[i].stop(event);\n }\n\n return interact;\n};\n\n/*\\\n * interact.pointerMoveTolerance\n [ method ]\n * Returns or sets the distance the pointer must be moved before an action\n * sequence occurs. This also affects tolerance for tap events.\n *\n - newValue (number) #optional The movement from the start position must be greater than this value\n = (number | Interactable) The current setting or interact\n\\*/\ninteract.pointerMoveTolerance = function (newValue) {\n if (utils.is.number(newValue)) {\n Interaction.pointerMoveTolerance = newValue;\n\n return this;\n }\n\n return Interaction.pointerMoveTolerance;\n};\n\ninteract.addDocument = scope.addDocument;\ninteract.removeDocument = scope.removeDocument;\n\nscope.interact = interact;\n\nmodule.exports = interact;\n","const Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\nconst scope = require('./scope');\nconst is = require('./utils/is');\nconst events = require('./utils/events');\n\nconst { nodeContains, matchesSelector } = require('./utils/domUtils');\n\n/*\\\n * Interactable.preventDefault\n [ method ]\n *\n * Returns or sets whether to prevent the browser's default behaviour\n * in response to pointer events. Can be set to:\n * - `'always'` to always prevent\n * - `'never'` to never prevent\n * - `'auto'` to let interact.js try to determine what would be best\n *\n - newValue (string) #optional `true`, `false` or `'auto'`\n = (string | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.preventDefault = function (newValue) {\n if (/^(always|never|auto)$/.test(newValue)) {\n this.options.preventDefault = newValue;\n return this;\n }\n\n if (is.bool(newValue)) {\n this.options.preventDefault = newValue? 'always' : 'never';\n return this;\n }\n\n return this.options.preventDefault;\n};\n\nInteractable.prototype.checkAndPreventDefault = function (event) {\n const setting = this.options.preventDefault;\n\n if (setting === 'never') { return; }\n\n if (setting === 'always') {\n event.preventDefault();\n return;\n }\n\n // setting === 'auto'\n\n // don't preventDefault if the browser supports passiveEvents\n // CSS touch-action and user-selecct should be used instead\n if (events.supportsOptions) {\n return;\n }\n\n // don't preventDefault of pointerdown events\n if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) {\n return;\n }\n\n // don't preventDefault on editable elements\n if (is.element(event.target)\n && matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) {\n return;\n }\n\n event.preventDefault();\n};\n\nfunction onInteractionEvent ({ interaction, event }) {\n if (interaction.target) {\n interaction.target.checkAndPreventDefault(event);\n }\n}\n\nfor (const eventSignal of ['down', 'move', 'up', 'cancel']) {\n Interaction.signals.on(eventSignal, onInteractionEvent);\n}\n\n// prevent native HTML5 drag on interact.js target elements\nInteraction.docEvents.dragstart = function preventNativeDrag (event) {\n for (const interaction of scope.interactions) {\n\n if (interaction.element\n && (interaction.element === event.target\n || nodeContains(interaction.element, event.target))) {\n\n interaction.target.checkAndPreventDefault(event);\n return;\n }\n }\n};\n","const scope = require('./scope');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst iFinder = require('./utils/interactionFinder');\nconst pointerEvents = require('./pointerEvents/base');\n\nconst { window } = require('./utils/window');\n\nconst toString = Object.prototype.toString;\n\nif (!window.Array.isArray) {\n window.Array.isArray = function (obj) {\n return toString.call(obj) === '[object Array]';\n };\n}\n\nif (!String.prototype.trim) {\n String.prototype.trim = function () {\n return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n };\n}\n\n// http://www.quirksmode.org/dom/events/click.html\n// >Events leading to dblclick\n//\n// IE8 doesn't fire down event before dblclick.\n// This workaround tries to fire a tap and doubletap after dblclick\nfunction onIE8Dblclick (event) {\n const eventTarget = event.target;\n const interaction = iFinder.search(event, event.type, eventTarget);\n\n if (!interaction) { return; }\n\n if (interaction.prevTap\n && event.clientX === interaction.prevTap.clientX\n && event.clientY === interaction.prevTap.clientY\n && eventTarget === interaction.prevTap.target) {\n\n interaction.downTargets[0] = eventTarget;\n interaction.downTimes [0] = new Date().getTime();\n\n pointerEvents.fire({\n interaction,\n event,\n eventTarget,\n pointer: event,\n type: 'tap',\n });\n }\n}\n\nif (browser.isIE8) {\n const selectFix = function (event) {\n for (const interaction of scope.interactions) {\n if (interaction.interacting()) {\n interaction.target.checkAndPreventDefault(event);\n }\n }\n };\n\n const onDocIE8 = function onDocIE8 ({ doc, win }, signalName) {\n const eventMethod = signalName.indexOf('listen') === 0\n ? events.add : events.remove;\n\n // For IE's lack of Event#preventDefault\n eventMethod(doc, 'selectstart', selectFix);\n\n if (pointerEvents) {\n eventMethod(doc, 'dblclick', onIE8Dblclick);\n }\n };\n\n scope.signals.on('add-document' , onDocIE8);\n scope.signals.on('remove-document', onDocIE8);\n}\n\nmodule.exports = null;\n","const InteractEvent = require('../InteractEvent');\nconst Interaction = require('../Interaction');\nconst extend = require('../utils/extend');\n\nconst modifiers = {\n names: [],\n\n setOffsets: function (arg) {\n const { interaction, pageCoords: page } = arg;\n const { target, element, startOffset } = interaction;\n const rect = target.getRect(element);\n\n if (rect) {\n startOffset.left = page.x - rect.left;\n startOffset.top = page.y - rect.top;\n\n startOffset.right = rect.right - page.x;\n startOffset.bottom = rect.bottom - page.y;\n\n if (!('width' in rect)) { rect.width = rect.right - rect.left; }\n if (!('height' in rect)) { rect.height = rect.bottom - rect.top ; }\n }\n else {\n startOffset.left = startOffset.top = startOffset.right = startOffset.bottom = 0;\n }\n\n arg.rect = rect;\n arg.interactable = target;\n arg.element = element;\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n\n arg.options = target.options[interaction.prepared.name][modifierName];\n\n if (!arg.options) {\n continue;\n }\n\n interaction.modifierOffsets[modifierName] = modifiers[modifierName].setOffset(arg);\n }\n },\n\n setAll: function (arg) {\n const { interaction, statuses, preEnd, requireEndOnly } = arg;\n const coords = extend({}, arg.pageCoords);\n const result = {\n dx: 0,\n dy: 0,\n changed: false,\n locked: false,\n shouldMove: true,\n };\n\n for (const modifierName of modifiers.names) {\n const modifier = modifiers[modifierName];\n const options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!shouldDo(options, preEnd, requireEndOnly)) { continue; }\n\n arg.status = arg.status = statuses[modifierName];\n arg.options = options;\n arg.offset = arg.interaction.modifierOffsets[modifierName];\n\n modifier.set(arg);\n\n if (arg.status.locked) {\n coords.x += arg.status.dx;\n coords.y += arg.status.dy;\n\n result.dx += arg.status.dx;\n result.dy += arg.status.dy;\n\n result.locked = true;\n }\n }\n\n // a move should be fired if:\n // - there are no modifiers enabled,\n // - no modifiers are \"locked\" i.e. have changed the pointer's coordinates, or\n // - the locked coords have changed since the last pointer move\n result.shouldMove = !arg.status || !result.locked || arg.status.changed;\n\n return result;\n },\n\n resetStatuses: function (statuses) {\n for (const modifierName of modifiers.names) {\n const status = statuses[modifierName] || {};\n\n status.dx = status.dy = 0;\n status.modifiedX = status.modifiedY = NaN;\n status.locked = false;\n status.changed = true;\n\n statuses[modifierName] = status;\n }\n\n return statuses;\n },\n\n start: function ({ interaction }, signalName) {\n const arg = {\n interaction,\n pageCoords: (signalName === 'action-resume' ?\n interaction.curCoords : interaction.startCoords).page,\n startOffset: interaction.startOffset,\n statuses: interaction.modifierStatuses,\n preEnd: false,\n requireEndOnly: false,\n };\n\n modifiers.setOffsets(arg);\n modifiers.resetStatuses(arg.statuses);\n\n arg.pageCoords = extend({}, interaction.startCoords.page);\n interaction.modifierResult = modifiers.setAll(arg);\n },\n};\n\nInteraction.signals.on('new', function (interaction) {\n interaction.startOffset = { left: 0, right: 0, top: 0, bottom: 0 };\n interaction.modifierOffsets = {};\n interaction.modifierStatuses = modifiers.resetStatuses({});\n interaction.modifierResult = null;\n});\n\nInteraction.signals.on('action-start' , modifiers.start);\nInteraction.signals.on('action-resume', modifiers.start);\n\nInteraction.signals.on('before-action-move', function ({ interaction, preEnd, interactingBeforeMove }) {\n const modifierResult = modifiers.setAll({\n interaction,\n preEnd,\n pageCoords: interaction.curCoords.page,\n statuses: interaction.modifierStatuses,\n requireEndOnly: false,\n });\n\n // don't fire an action move if a modifier would keep the event in the same\n // cordinates as before\n if (!modifierResult.shouldMove && interactingBeforeMove) {\n interaction._dontFireMove = true;\n }\n\n interaction.modifierResult = modifierResult;\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n for (let i = 0; i < modifiers.names.length; i++) {\n const options = interaction.target.options[interaction.prepared.name][modifiers.names[i]];\n\n // if the endOnly option is true for any modifier\n if (shouldDo(options, true, true)) {\n // fire a move event at the modified coordinates\n interaction.doMove({ event, preEnd: true });\n break;\n }\n }\n});\n\nInteractEvent.signals.on('set-xy', function (arg) {\n const { iEvent, interaction } = arg;\n const modifierArg = extend({}, arg);\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n modifierArg.options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!modifierArg.options) {\n continue;\n }\n\n const modifier = modifiers[modifierName];\n\n modifierArg.status = interaction.modifierStatuses[modifierName];\n\n iEvent[modifierName] = modifier.modifyCoords(modifierArg);\n }\n});\n\nfunction shouldDo (options, preEnd, requireEndOnly) {\n return (options && options.enabled\n && (preEnd || !options.endOnly)\n && (!requireEndOnly || options.endOnly));\n}\n\nmodule.exports = modifiers;\n","const modifiers = require('./index');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst restrict = {\n defaults: {\n enabled : false,\n endOnly : false,\n restriction: null,\n elementRect: null,\n },\n\n setOffset: function ({ rect, startOffset, options }) {\n const elementRect = options && options.elementRect;\n const offset = {};\n\n if (rect && elementRect) {\n offset.left = startOffset.left - (rect.width * elementRect.left);\n offset.top = startOffset.top - (rect.height * elementRect.top);\n\n offset.right = startOffset.right - (rect.width * (1 - elementRect.right));\n offset.bottom = startOffset.bottom - (rect.height * (1 - elementRect.bottom));\n }\n else {\n offset.left = offset.top = offset.right = offset.bottom = 0;\n }\n\n return offset;\n },\n\n set: function ({ pageCoords, interaction, status, options }) {\n if (!options) { return status; }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n\n const restriction = getRestrictionRect(options.restriction, interaction, page);\n\n if (!restriction) { return status; }\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n const rect = restriction;\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n const offset = interaction.modifierOffsets.restrict;\n\n // object is assumed to have\n // x, y, width, height or\n // left, top, right, bottom\n if ('x' in restriction && 'y' in restriction) {\n modifiedX = Math.max(Math.min(rect.x + rect.width - offset.right , page.x), rect.x + offset.left);\n modifiedY = Math.max(Math.min(rect.y + rect.height - offset.bottom, page.y), rect.y + offset.top );\n }\n else {\n modifiedX = Math.max(Math.min(rect.right - offset.right , page.x), rect.left + offset.left);\n modifiedY = Math.max(Math.min(rect.bottom - offset.bottom, page.y), rect.top + offset.top );\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const elementRect = options && options.elementRect;\n\n if (options && options.enabled\n && !(phase === 'start' && elementRect && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n getRestrictionRect,\n};\n\nfunction getRestrictionRect (value, interaction, page) {\n if (utils.is.function(value)) {\n return utils.resolveRectLike(value, interaction.target, interaction.element, [page.x, page.y, interaction]);\n } else {\n return utils.resolveRectLike(value, interaction.target, interaction.element);\n }\n}\n\nmodifiers.restrict = restrict;\nmodifiers.names.push('restrict');\n\ndefaultOptions.perAction.restrict = restrict.defaults;\n\nmodule.exports = restrict;\n","// This module adds the options.resize.restrictEdges setting which sets min and\n// max for the top, left, bottom and right edges of the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictEdges: {\n// inner: { top: 200, left: 200, right: 400, bottom: 400 },\n// outer: { top: 0, left: 0, right: 600, bottom: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst { getRestrictionRect } = require('./restrict');\n\nconst noInner = { top: +Infinity, left: +Infinity, bottom: -Infinity, right: -Infinity };\nconst noOuter = { top: -Infinity, left: -Infinity, bottom: +Infinity, right: +Infinity };\n\nconst restrictEdges = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n offset: null,\n },\n\n setOffset: function ({ interaction, startOffset, options }) {\n if (!options) {\n return utils.extend({}, startOffset);\n }\n\n const offset = getRestrictionRect(options.offset, interaction, interaction.startCoords.page);\n\n if (offset) {\n return {\n top: startOffset.top + offset.y,\n left: startOffset.left + offset.x,\n bottom: startOffset.bottom + offset.y,\n right: startOffset.right + offset.x,\n };\n }\n\n return startOffset;\n },\n\n set: function ({ pageCoords, interaction, status, offset, options }) {\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n const inner = rectUtils.xywhToTlbr(getRestrictionRect(options.inner, interaction, page)) || noInner;\n const outer = rectUtils.xywhToTlbr(getRestrictionRect(options.outer, interaction, page)) || noOuter;\n\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n if (edges.top) {\n modifiedY = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top);\n }\n else if (edges.bottom) {\n modifiedY = Math.max(Math.min(outer.bottom - offset.bottom, page.y), inner.bottom - offset.bottom);\n }\n if (edges.left) {\n modifiedX = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left);\n }\n else if (edges.right) {\n modifiedX = Math.max(Math.min(outer.right - offset.right, page.x), inner.right - offset.right);\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n if (options && options.enabled\n && !(phase === 'start' && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n noInner,\n noOuter,\n getRestrictionRect,\n};\n\nmodifiers.restrictEdges = restrictEdges;\nmodifiers.names.push('restrictEdges');\n\ndefaultOptions.perAction.restrictEdges = restrictEdges.defaults;\nresize.defaults.restrictEdges = restrictEdges.defaults;\n\nmodule.exports = restrictEdges;\n","// This module adds the options.resize.restrictSize setting which sets min and\n// max width and height for the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictSize: {\n// min: { width: -600, height: -600 },\n// max: { width: 600, height: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst restrictEdges = require('./restrictEdges');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst noMin = { width: -Infinity, height: -Infinity };\nconst noMax = { width: +Infinity, height: +Infinity };\n\nconst restrictSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n },\n\n setOffset: function ({ interaction }) {\n return interaction.startOffset;\n },\n\n set: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const rect = rectUtils.xywhToTlbr(interaction.resizeRects.inverted);\n\n const minSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.min, interaction)) || noMin;\n const maxSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.max, interaction)) || noMax;\n\n arg.options = {\n enabled: options.enabled,\n endOnly: options.endOnly,\n inner: utils.extend({}, restrictEdges.noInner),\n outer: utils.extend({}, restrictEdges.noOuter),\n };\n\n if (edges.top) {\n arg.options.inner.top = rect.bottom - minSize.height;\n arg.options.outer.top = rect.bottom - maxSize.height;\n }\n else if (edges.bottom) {\n arg.options.inner.bottom = rect.top + minSize.height;\n arg.options.outer.bottom = rect.top + maxSize.height;\n }\n if (edges.left) {\n arg.options.inner.left = rect.right - minSize.width;\n arg.options.outer.left = rect.right - maxSize.width;\n }\n else if (edges.right) {\n arg.options.inner.right = rect.left + minSize.width;\n arg.options.outer.right = rect.left + maxSize.width;\n }\n\n restrictEdges.set(arg);\n },\n\n modifyCoords: restrictEdges.modifyCoords,\n};\n\nmodifiers.restrictSize = restrictSize;\nmodifiers.names.push('restrictSize');\n\ndefaultOptions.perAction.restrictSize = restrictSize.defaults;\nresize.defaults.restrictSize = restrictSize.defaults;\n\nmodule.exports = restrictSize;\n","const modifiers = require('./index');\nconst interact = require('../interact');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst snap = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n\n relativePoints: null,\n },\n\n setOffset: function ({ interaction, interactable, element, rect, startOffset, options }) {\n const offsets = [];\n const optionsOrigin = utils.rectToXY(utils.resolveRectLike(options.origin));\n const origin = optionsOrigin || utils.getOriginXY(interactable, element, interaction.prepared.name);\n options = options || interactable.options[interaction.prepared.name].snap || {};\n\n let snapOffset;\n\n if (options.offset === 'startCoords') {\n snapOffset = {\n x: interaction.startCoords.page.x - origin.x,\n y: interaction.startCoords.page.y - origin.y,\n };\n }\n else {\n const offsetRect = utils.resolveRectLike(options.offset, interactable, element, [interaction]);\n\n snapOffset = utils.rectToXY(offsetRect) || { x: 0, y: 0 };\n }\n\n if (rect && options.relativePoints && options.relativePoints.length) {\n for (const { x: relativeX, y: relativeY } of options.relativePoints) {\n offsets.push({\n x: startOffset.left - (rect.width * relativeX) + snapOffset.x,\n y: startOffset.top - (rect.height * relativeY) + snapOffset.y,\n });\n }\n }\n else {\n offsets.push(snapOffset);\n }\n\n return offsets;\n },\n\n set: function ({ interaction, pageCoords, status, options, offset: offsets }) {\n const targets = [];\n let target;\n let page;\n let i;\n\n if (status.useStatusXY) {\n page = { x: status.x, y: status.y };\n }\n else {\n const origin = utils.getOriginXY(interaction.target, interaction.element, interaction.prepared.name);\n\n page = utils.extend({}, pageCoords);\n\n page.x -= origin.x;\n page.y -= origin.y;\n }\n\n status.realX = page.x;\n status.realY = page.y;\n\n let len = options.targets? options.targets.length : 0;\n\n for (const { x: offsetX, y: offsetY } of offsets) {\n const relativeX = page.x - offsetX;\n const relativeY = page.y - offsetY;\n\n for (const snapTarget of options.targets) {\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n targets.push({\n x: utils.is.number(target.x) ? (target.x + offsetX) : relativeX,\n y: utils.is.number(target.y) ? (target.y + offsetY) : relativeY,\n\n range: utils.is.number(target.range)? target.range: options.range,\n });\n }\n }\n\n const closest = {\n target: null,\n inRange: false,\n distance: 0,\n range: 0,\n dx: 0,\n dy: 0,\n };\n\n for (i = 0, len = targets.length; i < len; i++) {\n target = targets[i];\n\n const range = target.range;\n const dx = target.x - page.x;\n const dy = target.y - page.y;\n const distance = utils.hypot(dx, dy);\n let inRange = distance <= range;\n\n // Infinite targets count as being out of range\n // compared to non infinite ones that are in range\n if (range === Infinity && closest.inRange && closest.range !== Infinity) {\n inRange = false;\n }\n\n if (!closest.target || (inRange\n // is the closest target in range?\n ? (closest.inRange && range !== Infinity\n // the pointer is relatively deeper in this target\n ? distance / range < closest.distance / closest.range\n // this target has Infinite range and the closest doesn't\n : (range === Infinity && closest.range !== Infinity)\n // OR this target is closer that the previous closest\n || distance < closest.distance)\n // The other is not in range and the pointer is closer to this target\n : (!closest.inRange && distance < closest.distance))) {\n\n closest.target = target;\n closest.distance = distance;\n closest.range = range;\n closest.inRange = inRange;\n closest.dx = dx;\n closest.dy = dy;\n\n status.range = range;\n }\n }\n\n let snapChanged;\n\n if (closest.target) {\n snapChanged = (status.modifiedX !== closest.target.x || status.modifiedY !== closest.target.y);\n\n status.modifiedX = closest.target.x;\n status.modifiedY = closest.target.y;\n }\n else {\n snapChanged = true;\n\n status.modifiedX = NaN;\n status.modifiedY = NaN;\n }\n\n status.dx = closest.dx;\n status.dy = closest.dy;\n\n status.changed = (snapChanged || (closest.inRange && !status.locked));\n status.locked = closest.inRange;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const relativePoints = options && options.relativePoints;\n\n if (options && options.enabled\n && !(phase === 'start' && relativePoints && relativePoints.length)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n }\n\n return {\n range : status.range,\n locked : status.locked,\n x : status.modifiedX,\n y : status.modifiedY,\n realX : status.realX,\n realY : status.realY,\n dx : status.dx,\n dy : status.dy,\n };\n }\n },\n};\n\ninteract.createSnapGrid = function (grid) {\n return function (x, y) {\n const limits = grid.limits || {\n left : -Infinity,\n right : Infinity,\n top : -Infinity,\n bottom: Infinity,\n };\n let offsetX = 0;\n let offsetY = 0;\n\n if (utils.is.object(grid.offset)) {\n offsetX = grid.offset.x;\n offsetY = grid.offset.y;\n }\n\n const gridx = Math.round((x - offsetX) / grid.x);\n const gridy = Math.round((y - offsetY) / grid.y);\n\n const newX = Math.max(limits.left, Math.min(limits.right , gridx * grid.x + offsetX));\n const newY = Math.max(limits.top , Math.min(limits.bottom, gridy * grid.y + offsetY));\n\n return {\n x: newX,\n y: newY,\n range: grid.range,\n };\n };\n};\n\nmodifiers.snap = snap;\nmodifiers.names.push('snap');\n\ndefaultOptions.perAction.snap = snap.defaults;\n\nmodule.exports = snap;\n","// This module allows snapping of the size of targets during resize\n// interactions.\n\nconst modifiers = require('./index');\nconst snap = require('./snap');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\nconst utils = require('../utils/');\n\nconst snapSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n },\n\n setOffset: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.edges;\n\n if (!edges) { return; }\n\n arg.options = {\n relativePoints: [{\n x: edges.left? 0 : 1,\n y: edges.top ? 0 : 1,\n }],\n origin: { x: 0, y: 0 },\n offset: 'self',\n range: options.range,\n };\n\n const offsets = snap.setOffset(arg);\n arg.options = options;\n\n return offsets;\n },\n\n set: function (arg) {\n const { interaction, options, offset, pageCoords } = arg;\n const page = utils.extend({}, pageCoords);\n const relativeX = page.x - offset[0].x;\n const relativeY = page.y - offset[0].y;\n\n arg.options = utils.extend({}, options);\n arg.options.targets = [];\n\n for (const snapTarget of options.targets) {\n let target;\n\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n if ('width' in target && 'height' in target) {\n target.x = target.width;\n target.y = target.height;\n }\n\n arg.options.targets.push(target);\n }\n\n snap.set(arg);\n },\n\n modifyCoords: function (arg) {\n const { options } = arg;\n\n arg.options = utils.extend({}, options);\n arg.options.enabled = options.enabled;\n arg.options.relativePoints = [null];\n\n snap.modifyCoords(arg);\n },\n};\n\nmodifiers.snapSize = snapSize;\nmodifiers.names.push('snapSize');\n\ndefaultOptions.perAction.snapSize = snapSize.defaults;\nresize.defaults.snapSize = snapSize.defaults;\n\nmodule.exports = snapSize;\n","const pointerUtils = require('../utils/pointerUtils');\n\nmodule.exports = class PointerEvent {\n constructor (type, pointer, event, eventTarget, interaction) {\n pointerUtils.pointerExtend(this, event);\n\n if (event !== pointer) {\n pointerUtils.pointerExtend(this, pointer);\n }\n\n this.interaction = interaction;\n\n this.timeStamp = new Date().getTime();\n this.originalEvent = event;\n this.type = type;\n this.pointerId = pointerUtils.getPointerId(pointer);\n this.pointerType = pointerUtils.getPointerType(pointer, interaction);\n this.target = eventTarget;\n this.currentTarget = null;\n\n if (type === 'tap') {\n const pointerIndex = interaction.getPointerIndex(pointer);\n this.dt = this.timeStamp - interaction.downTimes[pointerIndex];\n\n const interval = this.timeStamp - interaction.tapTime;\n\n this.double = !!(interaction.prevTap\n && interaction.prevTap.type !== 'doubletap'\n && interaction.prevTap.target === this.target\n && interval < 500);\n }\n else if (type === 'doubletap') {\n this.dt = pointer.timeStamp - interaction.tapTime;\n }\n }\n\n subtractOrigin ({ x: originX, y: originY }) {\n this.pageX -= originX;\n this.pageY -= originY;\n this.clientX -= originX;\n this.clientY -= originY;\n\n return this;\n }\n\n addOrigin ({ x: originX, y: originY }) {\n this.pageX += originX;\n this.pageY += originY;\n this.clientX += originX;\n this.clientY += originY;\n\n return this;\n }\n\n preventDefault () {\n this.originalEvent.preventDefault();\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n};\n","const PointerEvent = require('./PointerEvent');\nconst Interaction = require('../Interaction');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst defaults = require('../defaultOptions');\nconst signals = require('../utils/Signals').new();\nconst { filter } = require('../utils/arr');\n\nconst simpleSignals = [ 'down', 'up', 'cancel' ];\nconst simpleEvents = [ 'down', 'up', 'cancel' ];\n\nconst pointerEvents = {\n PointerEvent,\n fire,\n collectEventTargets,\n signals,\n defaults: {\n holdDuration: 600,\n ignoreFrom : null,\n allowFrom : null,\n origin : { x: 0, y: 0 },\n },\n types: [\n 'down',\n 'move',\n 'up',\n 'cancel',\n 'tap',\n 'doubletap',\n 'hold',\n ],\n};\n\nfunction fire (arg) {\n const {\n interaction, pointer, event, eventTarget,\n type = arg.pointerEvent.type,\n targets = collectEventTargets(arg),\n pointerEvent = new PointerEvent(type, pointer, event, eventTarget, interaction),\n } = arg;\n\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n targets,\n type,\n pointerEvent,\n };\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n\n for (const prop in target.props || {}) {\n pointerEvent[prop] = target.props[prop];\n }\n\n const origin = utils.getOriginXY(target.eventable, target.element);\n\n pointerEvent.subtractOrigin(origin);\n pointerEvent.eventable = target.eventable;\n pointerEvent.currentTarget = target.element;\n\n target.eventable.fire(pointerEvent);\n\n pointerEvent.addOrigin(origin);\n\n if (pointerEvent.immediatePropagationStopped\n || (pointerEvent.propagationStopped\n && (i + 1) < targets.length && targets[i + 1].element !== pointerEvent.currentTarget)) {\n break;\n }\n }\n\n signals.fire('fired', signalArg);\n\n if (type === 'tap') {\n // if pointerEvent should make a double tap, create and fire a doubletap\n // PointerEvent and use that as the prevTap\n const prevTap = pointerEvent.double\n ? fire({\n interaction, pointer, event, eventTarget,\n type: 'doubletap',\n })\n : pointerEvent;\n\n interaction.prevTap = prevTap;\n interaction.tapTime = prevTap.timeStamp;\n }\n\n return pointerEvent;\n}\n\nfunction collectEventTargets ({ interaction, pointer, event, eventTarget, type }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n // do not fire a tap event if the pointer was moved before being lifted\n if (type === 'tap' && (interaction.pointerWasMoved\n // or if the pointerup target is different to the pointerdown target\n || !(interaction.downTargets[pointerIndex] && interaction.downTargets[pointerIndex] === eventTarget))) {\n return [];\n }\n\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n path,\n targets: [],\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (type === 'hold') {\n signalArg.targets = filter(signalArg.targets, target =>\n target.eventable.options.holdDuration === interaction.holdTimers[pointerIndex].duration);\n }\n\n return signalArg.targets;\n}\n\nInteraction.signals.on('update-pointer-down', function ({ interaction, pointerIndex }) {\n interaction.holdTimers[pointerIndex] = { duration: Infinity, timeout: null };\n});\n\nInteraction.signals.on('remove-pointer', function ({ interaction, pointerIndex }) {\n interaction.holdTimers.splice(pointerIndex, 1);\n});\n\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget, duplicateMove }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n if (!duplicateMove && (!interaction.pointerIsDown || interaction.pointerWasMoved)) {\n if (interaction.pointerIsDown) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n\n fire({\n interaction, pointer, event, eventTarget,\n type: 'move',\n });\n }\n});\n\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget, pointerIndex }) {\n // copy event to be used in timeout for IE8\n const eventCopy = browser.isIE8? utils.extend({}, event) : event;\n\n const timer = interaction.holdTimers[pointerIndex];\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'hold',\n targets: [],\n path,\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (!signalArg.targets.length) { return; }\n\n let minDuration = Infinity;\n\n for (let i = 0; i < signalArg.targets.length; i++) {\n const target = signalArg.targets[i];\n const holdDuration = target.eventable.options.holdDuration;\n\n if (holdDuration < minDuration) {\n minDuration = holdDuration;\n }\n }\n\n timer.duration = minDuration;\n timer.timeout = setTimeout(function () {\n fire({\n interaction, eventCopy, eventTarget,\n pointer: browser.isIE8? eventCopy : pointer,\n type: 'hold',\n });\n }, minDuration);\n});\n\nInteraction.signals.on('up', ({ interaction, pointer, event, eventTarget }) => {\n if (!interaction.pointerWasMoved) {\n fire({ interaction, eventTarget, pointer, event, type: 'tap' });\n }\n});\n\n['up', 'cancel'].forEach(function (signalName) {\n Interaction.signals.on(signalName, function ({ interaction, pointerIndex }) {\n if (interaction.holdTimers[pointerIndex]) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n });\n});\n\nfunction createSignalListener (type) {\n return function ({ interaction, pointer, event, eventTarget }) {\n fire({ interaction, eventTarget, pointer, event, type });\n };\n}\n\nfor (let i = 0; i < simpleSignals.length; i++) {\n Interaction.signals.on(simpleSignals[i], createSignalListener(simpleEvents[i]));\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.prevTap = null; // the most recent tap event on this interaction\n interaction.tapTime = 0; // time of the most recent tap event\n interaction.holdTimers = []; // [{ duration, timeout }]\n});\n\ndefaults.pointerEvents = pointerEvents.defaults;\nmodule.exports = pointerEvents;\n","const pointerEvents = require('./base');\nconst Interaction = require('../Interaction');\n\npointerEvents.signals.on('new', onNew);\npointerEvents.signals.on('fired', onFired);\n\nfor (const signal of ['move', 'up', 'cancel', 'endall']) {\n Interaction.signals.on(signal, endHoldRepeat);\n}\n\nfunction onNew ({ pointerEvent }) {\n if (pointerEvent.type !== 'hold') { return; }\n\n pointerEvent.count = (pointerEvent.count || 0) + 1;\n}\n\nfunction onFired ({ interaction, pointerEvent, eventTarget, targets }) {\n if (pointerEvent.type !== 'hold' || !targets.length) { return; }\n\n // get the repeat interval from the first eventable\n const interval = targets[0].eventable.options.holdRepeatInterval;\n\n // don't repeat if the interval is 0 or less\n if (interval <= 0) { return; }\n\n // set a timeout to fire the holdrepeat event\n interaction.holdIntervalHandle = setTimeout(function () {\n pointerEvents.fire({\n interaction,\n eventTarget,\n type: 'hold',\n pointer: pointerEvent,\n event: pointerEvent,\n });\n }, interval);\n}\n\nfunction endHoldRepeat ({ interaction }) {\n // set the interaction's holdStopTime property\n // to stop further holdRepeat events\n if (interaction.holdIntervalHandle) {\n clearInterval(interaction.holdIntervalHandle);\n interaction.holdIntervalHandle = null;\n }\n}\n\n// don't repeat by default\npointerEvents.defaults.holdRepeatInterval = 0;\npointerEvents.types.push('holdrepeat');\n\nmodule.exports = {\n onNew,\n onFired,\n endHoldRepeat,\n};\n","const pointerEvents = require('./base');\nconst Interactable = require('../Interactable');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\nconst scope = require('../scope');\nconst extend = require('../utils/extend');\nconst { merge } = require('../utils/arr');\n\npointerEvents.signals.on('collect-targets', function ({ targets, element, type, eventTarget }) {\n function collectSelectors (interactable, selector, context) {\n const els = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && is.element(element)\n && domUtils.matchesSelector(element, selector, els)\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n const interactable = scope.interactables.get(element);\n\n if (interactable) {\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n scope.interactables.forEachSelector(collectSelectors, element);\n});\n\nInteractable.signals.on('new', function ({ interactable }) {\n interactable.events.getRect = function (element) {\n return interactable.getRect(element);\n };\n});\n\nInteractable.signals.on('set', function ({ interactable, options }) {\n extend(interactable.events.options, pointerEvents.defaults);\n extend(interactable.events.options, options);\n});\n\nmerge(Interactable.eventTypes, pointerEvents.types);\n\nInteractable.prototype.pointerEvents = function (options) {\n extend(this.events.options, options);\n\n return this;\n};\n\nconst __backCompatOption = Interactable.prototype._backCompatOption;\n\nInteractable.prototype._backCompatOption = function (optionName, newValue) {\n const ret = __backCompatOption.call(this, optionName, newValue);\n\n if (ret === this) {\n this.events.options[optionName] = newValue;\n }\n\n return ret;\n};\n\nInteractable.settingsMethods.push('pointerEvents');\n","const utils = require('./utils');\nconst events = require('./utils/events');\nconst signals = require('./utils/Signals').new();\n\nconst scope = {\n signals,\n events,\n utils,\n\n // main document\n document: require('./utils/domObjects').document,\n // all documents being listened to\n documents: [],\n\n addDocument: function (doc, win) {\n // do nothing if document is already known\n if (utils.contains(scope.documents, doc)) { return false; }\n\n win = win || scope.getWindow(doc);\n\n scope.documents.push(doc);\n events.documents.push(doc);\n\n // don't add an unload event for the main document\n // so that the page may be cached in browser history\n if (doc !== scope.document) {\n events.add(win, 'unload', scope.onWindowUnload);\n }\n\n signals.fire('add-document', { doc, win });\n },\n\n removeDocument: function (doc, win) {\n const index = utils.indexOf(scope.documents, doc);\n\n win = win || scope.getWindow(doc);\n\n events.remove(win, 'unload', scope.onWindowUnload);\n\n scope.documents.splice(index, 1);\n events.documents.splice(index, 1);\n\n signals.fire('remove-document', { win, doc });\n },\n\n onWindowUnload: function () {\n scope.removeDocument(this.document, this);\n },\n};\n\nmodule.exports = scope;\n","const { indexOf } = require('./arr');\n\nclass Signals {\n constructor () {\n this.listeners = {\n // signalName: [listeners],\n };\n }\n\n on (name, listener) {\n if (!this.listeners[name]) {\n this.listeners[name] = [listener];\n return;\n }\n\n this.listeners[name].push(listener);\n }\n\n off (name, listener) {\n if (!this.listeners[name]) { return; }\n\n const index = indexOf(this.listeners[name], listener);\n\n if (index !== -1) {\n this.listeners[name].splice(index, 1);\n }\n }\n\n fire (name, arg) {\n const targetListeners = this.listeners[name];\n\n if (!targetListeners) { return; }\n\n for (let i = 0; i < targetListeners.length; i++) {\n if (targetListeners[i](arg, name) === false) {\n return;\n }\n }\n }\n}\n\nSignals.new = function () {\n return new Signals();\n};\n\nmodule.exports = Signals;\n","function indexOf (array, target) {\n for (let i = 0, len = array.length; i < len; i++) {\n if (array[i] === target) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction contains (array, target) {\n return indexOf(array, target) !== -1;\n}\n\nfunction merge (target, source) {\n for (let i = 0; i < source.length; i++) {\n target.push(source[i]);\n }\n\n return target;\n}\n\nfunction filter (array, test) {\n const result = [];\n\n for (let i = 0; i < array.length; i++) {\n if (test(array[i])) {\n result.push(array[i]);\n }\n }\n\n return result;\n}\n\nmodule.exports = {\n indexOf,\n contains,\n merge,\n filter,\n};\n","const { window } = require('./window');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst Element = domObjects.Element;\nconst navigator = window.navigator;\n\nconst browser = {\n // Does the browser support touch input?\n supportsTouch: !!(('ontouchstart' in window) || is.function(window.DocumentTouch)\n && domObjects.document instanceof window.DocumentTouch),\n\n // Does the browser support PointerEvents\n supportsPointerEvent: !!domObjects.PointerEvent,\n\n isIE8: ('attachEvent' in window) && !('addEventListener' in window),\n\n // Opera Mobile must be handled differently\n isOperaMobile: (navigator.appName === 'Opera'\n && browser.supportsTouch\n && navigator.userAgent.match('Presto')),\n\n // scrolling doesn't change the result of getClientRects on iOS 7\n isIOS7: (/iP(hone|od|ad)/.test(navigator.platform)\n && /OS 7[^\\d]/.test(navigator.appVersion)),\n\n isIe9OrOlder: /MSIE (8|9)/.test(navigator.userAgent),\n\n // prefix matchesSelector\n prefixedMatchesSelector: 'matches' in Element.prototype\n ? 'matches': 'webkitMatchesSelector' in Element.prototype\n ? 'webkitMatchesSelector': 'mozMatchesSelector' in Element.prototype\n ? 'mozMatchesSelector': 'oMatchesSelector' in Element.prototype\n ? 'oMatchesSelector': 'msMatchesSelector',\n\n useMatchesSelectorPolyfill: false,\n\n pEventTypes: (domObjects.PointerEvent\n ? (domObjects.PointerEvent === window.MSPointerEvent\n ? {\n up: 'MSPointerUp',\n down: 'MSPointerDown',\n over: 'mouseover',\n out: 'mouseout',\n move: 'MSPointerMove',\n cancel: 'MSPointerCancel',\n }\n : {\n up: 'pointerup',\n down: 'pointerdown',\n over: 'pointerover',\n out: 'pointerout',\n move: 'pointermove',\n cancel: 'pointercancel',\n })\n : null),\n\n // because Webkit and Opera still use 'mousewheel' event type\n wheelEvent: 'onmousewheel' in domObjects.document? 'mousewheel': 'wheel',\n\n};\n\nbrowser.useMatchesSelectorPolyfill = !is.function(Element.prototype[browser.prefixedMatchesSelector]);\n\nmodule.exports = browser;\n","const domObjects = {};\nconst win = require('./window').window;\n\nfunction blank () {}\n\ndomObjects.document = win.document;\ndomObjects.DocumentFragment = win.DocumentFragment || blank;\ndomObjects.SVGElement = win.SVGElement || blank;\ndomObjects.SVGSVGElement = win.SVGSVGElement || blank;\ndomObjects.SVGElementInstance = win.SVGElementInstance || blank;\ndomObjects.Element = win.Element || blank;\ndomObjects.HTMLElement = win.HTMLElement || domObjects.Element;\n\ndomObjects.Event = win.Event;\ndomObjects.Touch = win.Touch || blank;\ndomObjects.PointerEvent = (win.PointerEvent || win.MSPointerEvent);\n\nmodule.exports = domObjects;\n","const win = require('./window');\nconst browser = require('./browser');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst domUtils = {\n nodeContains: function (parent, child) {\n while (child) {\n if (child === parent) {\n return true;\n }\n\n child = child.parentNode;\n }\n\n return false;\n },\n\n closest: function (element, selector) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) { return element; }\n\n element = domUtils.parentNode(element);\n }\n\n return null;\n },\n\n parentNode: function (node) {\n let parent = node.parentNode;\n\n if (is.docFrag(parent)) {\n // skip past #shado-root fragments\n while ((parent = parent.host) && is.docFrag(parent)) {\n continue;\n }\n\n return parent;\n }\n\n return parent;\n },\n\n // taken from http://tanalin.com/en/blog/2012/12/matches-selector-ie8/ and modified\n matchesSelectorPolyfill: browser.useMatchesSelectorPolyfill\n ? function (element, selector, elems) {\n elems = elems || element.parentNode.querySelectorAll(selector);\n\n for (let i = 0, len = elems.length; i < len; i++) {\n if (elems[i] === element) {\n return true;\n }\n }\n\n return false;\n }\n : null,\n\n matchesSelector: function (element, selector, nodeList) {\n if (browser.useMatchesSelectorPolyfill) {\n return domUtils.matchesSelectorPolyfill(element, selector, nodeList);\n }\n\n // remove /deep/ from selectors if shadowDOM polyfill is used\n if (win.window !== win.realWindow) {\n selector = selector.replace(/\\/deep\\//g, ' ');\n }\n\n return element[browser.prefixedMatchesSelector](selector);\n },\n\n // Test for the element that's \"above\" all other qualifiers\n indexOfDeepestElement: function (elements) {\n let deepestZoneParents = [];\n let dropzoneParents = [];\n let dropzone;\n let deepestZone = elements[0];\n let index = deepestZone? 0: -1;\n let parent;\n let child;\n let i;\n let n;\n\n for (i = 1; i < elements.length; i++) {\n dropzone = elements[i];\n\n // an element might belong to multiple selector dropzones\n if (!dropzone || dropzone === deepestZone) {\n continue;\n }\n\n if (!deepestZone) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n // check if the deepest or current are document.documentElement or document.rootElement\n // - if the current dropzone is, do nothing and continue\n if (dropzone.parentNode === dropzone.ownerDocument) {\n continue;\n }\n // - if deepest is, update with the current dropzone and continue to next\n else if (deepestZone.parentNode === dropzone.ownerDocument) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n if (!deepestZoneParents.length) {\n parent = deepestZone;\n while (parent.parentNode && parent.parentNode !== parent.ownerDocument) {\n deepestZoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n }\n\n // if this element is an svg element and the current deepest is\n // an HTMLElement\n if (deepestZone instanceof domObjects.HTMLElement\n && dropzone instanceof domObjects.SVGElement\n && !(dropzone instanceof domObjects.SVGSVGElement)) {\n\n if (dropzone === deepestZone.parentNode) {\n continue;\n }\n\n parent = dropzone.ownerSVGElement;\n }\n else {\n parent = dropzone;\n }\n\n dropzoneParents = [];\n\n while (parent.parentNode !== parent.ownerDocument) {\n dropzoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n\n n = 0;\n\n // get (position of last common ancestor) + 1\n while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) {\n n++;\n }\n\n const parents = [\n dropzoneParents[n - 1],\n dropzoneParents[n],\n deepestZoneParents[n],\n ];\n\n child = parents[0].lastChild;\n\n while (child) {\n if (child === parents[1]) {\n deepestZone = dropzone;\n index = i;\n deepestZoneParents = [];\n\n break;\n }\n else if (child === parents[2]) {\n break;\n }\n\n child = child.previousSibling;\n }\n }\n\n return index;\n },\n\n matchesUpTo: function (element, selector, limit) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) {\n return true;\n }\n\n element = domUtils.parentNode(element);\n\n if (element === limit) {\n return domUtils.matchesSelector(element, selector);\n }\n }\n\n return false;\n },\n\n getActualElement: function (element) {\n return (element instanceof domObjects.SVGElementInstance\n ? element.correspondingUseElement\n : element);\n },\n\n getScrollXY: function (relevantWindow) {\n relevantWindow = relevantWindow || win.window;\n return {\n x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft,\n y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop,\n };\n },\n\n getElementClientRect: function (element) {\n const clientRect = (element instanceof domObjects.SVGElement\n ? element.getBoundingClientRect()\n : element.getClientRects()[0]);\n\n return clientRect && {\n left : clientRect.left,\n right : clientRect.right,\n top : clientRect.top,\n bottom: clientRect.bottom,\n width : clientRect.width || clientRect.right - clientRect.left,\n height: clientRect.height || clientRect.bottom - clientRect.top,\n };\n },\n\n getElementRect: function (element) {\n const clientRect = domUtils.getElementClientRect(element);\n\n if (!browser.isIOS7 && clientRect) {\n const scroll = domUtils.getScrollXY(win.getWindow(element));\n\n clientRect.left += scroll.x;\n clientRect.right += scroll.x;\n clientRect.top += scroll.y;\n clientRect.bottom += scroll.y;\n }\n\n return clientRect;\n },\n\n getPath: function (element) {\n const path = [];\n\n while (element) {\n path.push(element);\n element = domUtils.parentNode(element);\n }\n\n return path;\n },\n\n trySelector: value => {\n if (!is.string(value)) { return false; }\n\n // an exception will be raised if it is invalid\n domObjects.document.querySelector(value);\n return true;\n },\n};\n\nmodule.exports = domUtils;\n","const is = require('./is');\nconst domUtils = require('./domUtils');\nconst pExtend = require('./pointerExtend');\n\nconst { window, getWindow } = require('./window');\nconst { indexOf, contains } = require('./arr');\n\nconst useAttachEvent = ('attachEvent' in window) && !('addEventListener' in window);\nconst addEvent = useAttachEvent? 'attachEvent': 'addEventListener';\nconst removeEvent = useAttachEvent? 'detachEvent': 'removeEventListener';\nconst on = useAttachEvent? 'on': '';\n\nconst elements = [];\nconst targets = [];\nconst attachedListeners = [];\n\n// {\n// type: {\n// selectors: ['selector', ...],\n// contexts : [document, ...],\n// listeners: [[listener, capture, passive], ...]\n// }\n// }\nconst delegatedEvents = {};\n\nconst documents = [];\n\nconst supportsOptions = !useAttachEvent && (() => {\n let supported = false;\n\n window.document.createElement('div').addEventListener('test', null, {\n get capture () { supported = true; },\n });\n\n return supported;\n})();\n\nfunction add (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n let elementIndex = indexOf(elements, element);\n let target = targets[elementIndex];\n\n if (!target) {\n target = {\n events: {},\n typeCount: 0,\n };\n\n elementIndex = elements.push(element) - 1;\n targets.push(target);\n\n attachedListeners.push(useAttachEvent\n ? {\n supplied: [],\n wrapped : [],\n useCount: [],\n }\n : null);\n }\n\n if (!target.events[type]) {\n target.events[type] = [];\n target.typeCount++;\n }\n\n if (!contains(target.events[type], listener)) {\n let ret;\n\n if (useAttachEvent) {\n const { supplied, wrapped, useCount } = attachedListeners[elementIndex];\n const listenerIndex = indexOf(supplied, listener);\n\n const wrappedListener = wrapped[listenerIndex] || function (event) {\n if (!event.immediatePropagationStopped) {\n event.target = event.srcElement;\n event.currentTarget = element;\n\n event.preventDefault = event.preventDefault || preventDef;\n event.stopPropagation = event.stopPropagation || stopProp;\n event.stopImmediatePropagation = event.stopImmediatePropagation || stopImmProp;\n\n if (/mouse|click/.test(event.type)) {\n event.pageX = event.clientX + getWindow(element).document.documentElement.scrollLeft;\n event.pageY = event.clientY + getWindow(element).document.documentElement.scrollTop;\n }\n\n listener(event);\n }\n };\n\n ret = element[addEvent](on + type, wrappedListener, !!options.capture);\n\n if (listenerIndex === -1) {\n supplied.push(listener);\n wrapped.push(wrappedListener);\n useCount.push(1);\n }\n else {\n useCount[listenerIndex]++;\n }\n }\n else {\n ret = element[addEvent](type, listener, supportsOptions? options : !!options.capture);\n }\n target.events[type].push(listener);\n\n return ret;\n }\n}\n\nfunction remove (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const elementIndex = indexOf(elements, element);\n const target = targets[elementIndex];\n\n if (!target || !target.events) {\n return;\n }\n\n let wrappedListener = listener;\n let listeners;\n let listenerIndex;\n\n if (useAttachEvent) {\n listeners = attachedListeners[elementIndex];\n listenerIndex = indexOf(listeners.supplied, listener);\n wrappedListener = listeners.wrapped[listenerIndex];\n }\n\n if (type === 'all') {\n for (type in target.events) {\n if (target.events.hasOwnProperty(type)) {\n remove(element, type, 'all');\n }\n }\n return;\n }\n\n if (target.events[type]) {\n const len = target.events[type].length;\n\n if (listener === 'all') {\n for (let i = 0; i < len; i++) {\n remove(element, type, target.events[type][i], options);\n }\n return;\n }\n else {\n for (let i = 0; i < len; i++) {\n if (target.events[type][i] === listener) {\n element[removeEvent](on + type, wrappedListener, supportsOptions? options : !!options.capture);\n target.events[type].splice(i, 1);\n\n if (useAttachEvent && listeners) {\n listeners.useCount[listenerIndex]--;\n if (listeners.useCount[listenerIndex] === 0) {\n listeners.supplied.splice(listenerIndex, 1);\n listeners.wrapped.splice(listenerIndex, 1);\n listeners.useCount.splice(listenerIndex, 1);\n }\n }\n\n break;\n }\n }\n }\n\n if (target.events[type] && target.events[type].length === 0) {\n target.events[type] = null;\n target.typeCount--;\n }\n }\n\n if (!target.typeCount) {\n targets.splice(elementIndex, 1);\n elements.splice(elementIndex, 1);\n attachedListeners.splice(elementIndex, 1);\n }\n}\n\nfunction addDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n if (!delegatedEvents[type]) {\n delegatedEvents[type] = {\n selectors: [],\n contexts : [],\n listeners: [],\n };\n\n // add delegate listener functions\n for (let i = 0; i < documents.length; i++) {\n add(documents[i], type, delegateListener);\n add(documents[i], type, delegateUseCapture, true);\n }\n }\n\n const delegated = delegatedEvents[type];\n let index;\n\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n break;\n }\n }\n\n if (index === -1) {\n index = delegated.selectors.length;\n\n delegated.selectors.push(selector);\n delegated.contexts .push(context);\n delegated.listeners.push([]);\n }\n\n // keep listener and capture and passive flags\n delegated.listeners[index].push([listener, !!options.capture, options.passive]);\n}\n\nfunction removeDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const delegated = delegatedEvents[type];\n let matchFound = false;\n let index;\n\n if (!delegated) { return; }\n\n // count from last index of delegated to 0\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n // look for matching selector and context Node\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n\n const listeners = delegated.listeners[index];\n\n // each item of the listeners array is an array: [function, capture, passive]\n for (let i = listeners.length - 1; i >= 0; i--) {\n const [fn, capture, passive] = listeners[i];\n\n // check if the listener functions and capture and passive flags match\n if (fn === listener && capture === !!options.capture && passive === options.passive) {\n // remove the listener from the array of listeners\n listeners.splice(i, 1);\n\n // if all listeners for this interactable have been removed\n // remove the interactable from the delegated arrays\n if (!listeners.length) {\n delegated.selectors.splice(index, 1);\n delegated.contexts .splice(index, 1);\n delegated.listeners.splice(index, 1);\n\n // remove delegate function from context\n remove(context, type, delegateListener);\n remove(context, type, delegateUseCapture, true);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegatedEvents[type] = null;\n }\n }\n\n // only remove one listener\n matchFound = true;\n break;\n }\n }\n\n if (matchFound) { break; }\n }\n }\n}\n\n// bound to the interactable context when a DOM event\n// listener is added to a selector interactable\nfunction delegateListener (event, optionalArg) {\n const options = getOptions(optionalArg);\n const fakeEvent = {};\n const delegated = delegatedEvents[event.type];\n const eventTarget = (domUtils.getActualElement(event.path\n ? event.path[0]\n : event.target));\n let element = eventTarget;\n\n // duplicate the event so that currentTarget can be changed\n pExtend(fakeEvent, event);\n\n fakeEvent.originalEvent = event;\n fakeEvent.preventDefault = preventOriginalDefault;\n\n // climb up document tree looking for selector matches\n while (is.element(element)) {\n for (let i = 0; i < delegated.selectors.length; i++) {\n const selector = delegated.selectors[i];\n const context = delegated.contexts[i];\n\n if (domUtils.matchesSelector(element, selector)\n && domUtils.nodeContains(context, eventTarget)\n && domUtils.nodeContains(context, element)) {\n\n const listeners = delegated.listeners[i];\n\n fakeEvent.currentTarget = element;\n\n for (let j = 0; j < listeners.length; j++) {\n const [fn, capture, passive] = listeners[j];\n\n if (capture === !!options.capture && passive === options.passive) {\n fn(fakeEvent);\n }\n }\n }\n }\n\n element = domUtils.parentNode(element);\n }\n}\n\nfunction delegateUseCapture (event) {\n return delegateListener.call(this, event, true);\n}\n\nfunction preventDef () {\n this.returnValue = false;\n}\n\nfunction preventOriginalDefault () {\n this.originalEvent.preventDefault();\n}\n\nfunction stopProp () {\n this.cancelBubble = true;\n}\n\nfunction stopImmProp () {\n this.cancelBubble = true;\n this.immediatePropagationStopped = true;\n}\n\nfunction getOptions (param) {\n return is.object(param)? param : { capture: param };\n}\n\nmodule.exports = {\n add,\n remove,\n\n addDelegate,\n removeDelegate,\n\n delegateListener,\n delegateUseCapture,\n delegatedEvents,\n documents,\n\n useAttachEvent,\n supportsOptions,\n\n _elements: elements,\n _targets: targets,\n _attachedListeners: attachedListeners,\n};\n","module.exports = function extend (dest, source) {\n for (const prop in source) {\n dest[prop] = source[prop];\n }\n return dest;\n};\n","const {\n resolveRectLike,\n rectToXY,\n} = require('./rect');\n\nmodule.exports = function (target, element, action) {\n const actionOptions = target.options[action];\n const actionOrigin = actionOptions && actionOptions.origin;\n const origin = actionOrigin || target.options.origin;\n\n const originRect = resolveRectLike(origin, target, element, [target && element]);\n\n return rectToXY(originRect) || { x: 0, y: 0 };\n};\n","module.exports = (x, y) => Math.sqrt(x * x + y * y);\n","const extend = require('./extend');\nconst win = require('./window');\n\nconst utils = {\n warnOnce: function (method, message) {\n let warned = false;\n\n return function () {\n if (!warned) {\n win.window.console.warn(message);\n warned = true;\n }\n\n return method.apply(this, arguments);\n };\n },\n\n // http://stackoverflow.com/a/5634528/2280888\n _getQBezierValue: function (t, p1, p2, p3) {\n const iT = 1 - t;\n return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3;\n },\n\n getQuadraticCurvePoint: function (startX, startY, cpX, cpY, endX, endY, position) {\n return {\n x: utils._getQBezierValue(position, startX, cpX, endX),\n y: utils._getQBezierValue(position, startY, cpY, endY),\n };\n },\n\n // http://gizma.com/easing/\n easeOutQuad: function (t, b, c, d) {\n t /= d;\n return -c * t*(t-2) + b;\n },\n\n copyAction: function (dest, src) {\n dest.name = src.name;\n dest.axis = src.axis;\n dest.edges = src.edges;\n\n return dest;\n },\n\n is : require('./is'),\n extend : extend,\n hypot : require('./hypot'),\n getOriginXY: require('./getOriginXY'),\n};\n\nextend(utils, require('./arr'));\nextend(utils, require('./domUtils'));\nextend(utils, require('./pointerUtils'));\nextend(utils, require('./rect'));\n\nmodule.exports = utils;\n","const scope = require('../scope');\nconst utils = require('./index');\nconst browser = require('./browser');\n\nconst finder = {\n methodOrder: [ 'simulationResume', 'mouse', 'hasPointer', 'idle' ],\n\n search: function (pointer, eventType, eventTarget) {\n const mouseEvent = (/mouse/i.test(pointer.pointerType || eventType)\n // MSPointerEvent.MSPOINTER_TYPE_MOUSE\n || pointer.pointerType === 4);\n const pointerId = utils.getPointerId(pointer);\n const details = { pointer, pointerId, mouseEvent, eventType, eventTarget };\n\n for (const method of finder.methodOrder) {\n const interaction = finder[method](details);\n\n if (interaction) {\n return interaction;\n }\n }\n },\n\n // try to resume simulation with a new pointer\n simulationResume: function ({ mouseEvent, eventType, eventTarget }) {\n if (!/down|start/i.test(eventType)) {\n return null;\n }\n\n for (const interaction of scope.interactions) {\n let element = eventTarget;\n\n if (interaction.simulation && interaction.simulation.allowResume\n && (interaction.mouse === mouseEvent)) {\n while (element) {\n // if the element is the interaction element\n if (element === interaction.element) {\n return interaction;\n }\n element = utils.parentNode(element);\n }\n }\n }\n\n return null;\n },\n\n // if it's a mouse interaction\n mouse: function ({ pointerId, mouseEvent, eventType }) {\n if (!mouseEvent && (browser.supportsTouch || browser.supportsPointerEvent)) {\n return null;\n }\n\n let firstNonActive;\n\n for (const interaction of scope.interactions) {\n if (interaction.mouse) {\n // if it's a down event, skip interactions with running simulations\n if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; }\n\n // if the interaction is active, return it immediately\n if (interaction.interacting()) {\n return interaction;\n }\n // otherwise save it and look for another active interaction\n else if (!firstNonActive) {\n firstNonActive = interaction;\n }\n }\n }\n\n // if no active mouse interaction was found use the first inactive mouse\n // interaction\n if (firstNonActive) {\n return firstNonActive;\n }\n\n // Find any interaction specifically for mouse.\n // ignore the interaction if the eventType is a mousedown, and a simulation\n // is active\n for (const interaction of scope.interactions) {\n if (interaction.mouse && !(/down/.test(eventType) && interaction.simulation)) {\n return interaction;\n }\n }\n\n return null;\n },\n\n // get interaction that has this pointer\n hasPointer: function ({ pointerId }) {\n for (const interaction of scope.interactions) {\n if (utils.contains(interaction.pointerIds, pointerId)) {\n return interaction;\n }\n }\n },\n\n // get first idle interaction\n idle: function ({ mouseEvent }) {\n for (const interaction of scope.interactions) {\n // if there's already a pointer held down\n if (interaction.pointerIds.length === 1) {\n const target = interaction.target;\n // don't add this pointer if there is a target interactable and it\n // isn't gesturable\n if (target && !target.options.gesture.enabled) {\n continue;\n }\n }\n // maximum of 2 pointers per interaction\n else if (interaction.pointerIds.length >= 2) {\n continue;\n }\n\n if (!interaction.interacting() && (mouseEvent === interaction.mouse)) {\n return interaction;\n }\n }\n\n return null;\n },\n};\n\nmodule.exports = finder;\n","const win = require('./window');\nconst isWindow = require('./isWindow');\n\nconst is = {\n array : () => {},\n\n window : thing => thing === win.window || isWindow(thing),\n\n docFrag : thing => is.object(thing) && thing.nodeType === 11,\n\n object : thing => !!thing && (typeof thing === 'object'),\n\n function: thing => typeof thing === 'function',\n\n number : thing => typeof thing === 'number' ,\n\n bool : thing => typeof thing === 'boolean' ,\n\n string : thing => typeof thing === 'string' ,\n\n element: thing => {\n if (!thing || (typeof thing !== 'object')) { return false; }\n\n const _window = win.getWindow(thing) || win.window;\n\n return (/object|function/.test(typeof _window.Element)\n ? thing instanceof _window.Element //DOM2\n : thing.nodeType === 1 && typeof thing.nodeName === 'string');\n },\n};\n\nis.array = thing => (is.object(thing)\n && (typeof thing.length !== 'undefined')\n && is.function(thing.splice));\n\nmodule.exports = is;\n","module.exports = (thing) => !!(thing && thing.Window) && (thing instanceof thing.Window);\n","function pointerExtend (dest, source) {\n for (const prop in source) {\n const prefixedPropREs = module.exports.prefixedPropREs;\n let deprecated = false;\n\n // skip deprecated prefixed properties\n for (const vendor in prefixedPropREs) {\n if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) {\n deprecated = true;\n break;\n }\n }\n\n if (!deprecated && typeof source[prop] !== 'function') {\n dest[prop] = source[prop];\n }\n }\n return dest;\n}\n\npointerExtend.prefixedPropREs = {\n webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/,\n};\n\nmodule.exports = pointerExtend;\n","const hypot = require('./hypot');\nconst browser = require('./browser');\nconst dom = require('./domObjects');\nconst domUtils = require('./domUtils');\nconst is = require('./is');\nconst pointerExtend = require('./pointerExtend');\n\nconst pointerUtils = {\n copyCoords: function (dest, src) {\n dest.page = dest.page || {};\n dest.page.x = src.page.x;\n dest.page.y = src.page.y;\n\n dest.client = dest.client || {};\n dest.client.x = src.client.x;\n dest.client.y = src.client.y;\n\n dest.timeStamp = src.timeStamp;\n },\n\n setCoordDeltas: function (targetObj, prev, cur) {\n targetObj.page.x = cur.page.x - prev.page.x;\n targetObj.page.y = cur.page.y - prev.page.y;\n targetObj.client.x = cur.client.x - prev.client.x;\n targetObj.client.y = cur.client.y - prev.client.y;\n targetObj.timeStamp = cur.timeStamp - prev.timeStamp;\n\n // set pointer velocity\n const dt = Math.max(targetObj.timeStamp / 1000, 0.001);\n\n targetObj.page.speed = hypot(targetObj.page.x, targetObj.page.y) / dt;\n targetObj.page.vx = targetObj.page.x / dt;\n targetObj.page.vy = targetObj.page.y / dt;\n\n targetObj.client.speed = hypot(targetObj.client.x, targetObj.page.y) / dt;\n targetObj.client.vx = targetObj.client.x / dt;\n targetObj.client.vy = targetObj.client.y / dt;\n },\n\n isNativePointer: function (pointer) {\n return (pointer instanceof dom.Event || pointer instanceof dom.Touch);\n },\n\n // Get specified X/Y coords for mouse or event.touches[0]\n getXY: function (type, pointer, xy) {\n xy = xy || {};\n type = type || 'page';\n\n xy.x = pointer[type + 'X'];\n xy.y = pointer[type + 'Y'];\n\n return xy;\n },\n\n getPageXY: function (pointer, page) {\n page = page || {};\n\n // Opera Mobile handles the viewport and scrolling oddly\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n pointerUtils.getXY('screen', pointer, page);\n\n page.x += window.scrollX;\n page.y += window.scrollY;\n }\n else {\n pointerUtils.getXY('page', pointer, page);\n }\n\n return page;\n },\n\n getClientXY: function (pointer, client) {\n client = client || {};\n\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n // Opera Mobile handles the viewport and scrolling oddly\n pointerUtils.getXY('screen', pointer, client);\n }\n else {\n pointerUtils.getXY('client', pointer, client);\n }\n\n return client;\n },\n\n getPointerId: function (pointer) {\n return is.number(pointer.pointerId)? pointer.pointerId : pointer.identifier;\n },\n\n setCoords: function (targetObj, pointers, timeStamp) {\n const pointer = (pointers.length > 1\n ? pointerUtils.pointerAverage(pointers)\n : pointers[0]);\n\n const tmpXY = {};\n\n pointerUtils.getPageXY(pointer, tmpXY);\n targetObj.page.x = tmpXY.x;\n targetObj.page.y = tmpXY.y;\n\n pointerUtils.getClientXY(pointer, tmpXY);\n targetObj.client.x = tmpXY.x;\n targetObj.client.y = tmpXY.y;\n\n targetObj.timeStamp = is.number(timeStamp) ? timeStamp :new Date().getTime();\n },\n\n pointerExtend: pointerExtend,\n\n getTouchPair: function (event) {\n const touches = [];\n\n // array of touches is supplied\n if (is.array(event)) {\n touches[0] = event[0];\n touches[1] = event[1];\n }\n // an event\n else {\n if (event.type === 'touchend') {\n if (event.touches.length === 1) {\n touches[0] = event.touches[0];\n touches[1] = event.changedTouches[0];\n }\n else if (event.touches.length === 0) {\n touches[0] = event.changedTouches[0];\n touches[1] = event.changedTouches[1];\n }\n }\n else {\n touches[0] = event.touches[0];\n touches[1] = event.touches[1];\n }\n }\n\n return touches;\n },\n\n pointerAverage: function (pointers) {\n const average = {\n pageX : 0,\n pageY : 0,\n clientX: 0,\n clientY: 0,\n screenX: 0,\n screenY: 0,\n };\n\n for (const pointer of pointers) {\n for (const prop in average) {\n average[prop] += pointer[prop];\n }\n }\n for (const prop in average) {\n average[prop] /= pointers.length;\n }\n\n return average;\n },\n\n touchBBox: function (event) {\n if (!event.length && !(event.touches && event.touches.length > 1)) {\n return;\n }\n\n const touches = pointerUtils.getTouchPair(event);\n const minX = Math.min(touches[0].pageX, touches[1].pageX);\n const minY = Math.min(touches[0].pageY, touches[1].pageY);\n const maxX = Math.max(touches[0].pageX, touches[1].pageX);\n const maxY = Math.max(touches[0].pageY, touches[1].pageY);\n\n return {\n x: minX,\n y: minY,\n left: minX,\n top: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n },\n\n touchDistance: function (event, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n\n\n const dx = touches[0][sourceX] - touches[1][sourceX];\n const dy = touches[0][sourceY] - touches[1][sourceY];\n\n return hypot(dx, dy);\n },\n\n touchAngle: function (event, prevAngle, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n const dx = touches[1][sourceX] - touches[0][sourceX];\n const dy = touches[1][sourceY] - touches[0][sourceY];\n const angle = 180 * Math.atan2(dy , dx) / Math.PI;\n\n return angle;\n },\n\n getPointerType: function (pointer, interaction) {\n // if the PointerEvent API isn't available, then the pointer must be ither\n // a MouseEvent or TouchEvent\n if (interaction.mouse) { return 'mouse'; }\n if (!browser.supportsPointerEvent) { return 'touch'; }\n\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : [undefined, undefined,'touch', 'pen', 'mouse'][pointer.pointerType];\n },\n\n // [ event.target, event.currentTarget ]\n getEventTargets: function (event) {\n return [\n domUtils.getActualElement(event.path ? event.path[0] : event.target),\n domUtils.getActualElement(event.currentTarget),\n ];\n },\n};\n\nmodule.exports = pointerUtils;\n","const { window } = require('./window');\n\nconst vendors = ['ms', 'moz', 'webkit', 'o'];\nlet lastTime = 0;\nlet request;\nlet cancel;\n\nfor (let x = 0; x < vendors.length && !window.requestAnimationFrame; x++) {\n request = window[vendors[x] + 'RequestAnimationFrame'];\n cancel = window[vendors[x] +'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n}\n\nif (!request) {\n request = function (callback) {\n const currTime = new Date().getTime();\n const timeToCall = Math.max(0, 16 - (currTime - lastTime));\n const id = setTimeout(function () { callback(currTime + timeToCall); },\n timeToCall);\n\n lastTime = currTime + timeToCall;\n return id;\n };\n}\n\nif (!cancel) {\n cancel = function (id) {\n clearTimeout(id);\n };\n}\n\nmodule.exports = {\n request,\n cancel,\n};\n","const extend = require('./extend');\nconst is = require('./is');\nconst {\n closest,\n parentNode,\n getElementRect,\n} = require('./domUtils');\n\nconst rectUtils = {\n getStringOptionResult: function (value, interactable, element) {\n if (!is.string(value)) {\n return null;\n }\n\n if (value === 'parent') {\n value = parentNode(element);\n }\n else if (value === 'self') {\n value = interactable.getRect(element);\n }\n else {\n value = closest(element, value);\n }\n\n return value;\n },\n\n resolveRectLike: function (value, interactable, element, functionArgs) {\n value = rectUtils.getStringOptionResult(value, interactable, element) || value;\n\n if (is.function(value)) {\n value = value.apply(null, functionArgs);\n }\n\n if (is.element(value)) {\n value = getElementRect(value);\n }\n\n return value;\n },\n\n rectToXY: function (rect) {\n return rect && {\n x: 'x' in rect ? rect.x : rect.left,\n y: 'y' in rect ? rect.y : rect.top,\n };\n },\n\n xywhToTlbr: function (rect) {\n if (rect && !('left' in rect && 'top' in rect)) {\n rect = extend({}, rect);\n\n rect.left = rect.x || 0;\n rect.top = rect.y || 0;\n rect.right = rect.right || (rect.left + rect.width);\n rect.bottom = rect.bottom || (rect.top + rect.height);\n }\n\n return rect;\n },\n\n tlbrToXywh: function (rect) {\n if (rect && !('x' in rect && 'y' in rect)) {\n rect = extend({}, rect);\n\n rect.x = rect.left || 0;\n rect.top = rect.top || 0;\n rect.width = rect.width || (rect.right - rect.x);\n rect.height = rect.height || (rect.bottom - rect.y);\n }\n\n return rect;\n },\n};\n\nmodule.exports = rectUtils;\n","const win = module.exports;\nconst isWindow = require('./isWindow');\n\nfunction init (window) {\n // get wrapped window if using Shadow DOM polyfill\n\n win.realWindow = window;\n\n // create a TextNode\n const el = window.document.createTextNode('');\n\n // check if it's wrapped by a polyfill\n if (el.ownerDocument !== window.document\n && typeof window.wrap === 'function'\n && window.wrap(el) === el) {\n // use wrapped window\n window = window.wrap(window);\n }\n\n win.window = window;\n}\n\nif (typeof window === 'undefined') {\n win.window = undefined;\n win.realWindow = undefined;\n}\nelse {\n init(window);\n}\n\nwin.getWindow = function getWindow (node) {\n if (isWindow(node)) {\n return node;\n }\n\n const rootNode = (node.ownerDocument || node);\n\n return rootNode.defaultView || rootNode.parentWindow || win.window;\n};\n\nwin.init = init;\n"]} \ No newline at end of file +{"version":3,"sources":["src/minHeader.js","src/header.js","index.js","src/Eventable.js","src/InteractEvent.js","src/Interactable.js","src/Interaction.js","src/actions/base.js","src/actions/drag.js","src/actions/drop.js","src/actions/gesture.js","src/actions/resize.js","src/autoScroll.js","src/autoStart/InteractableMethods.js","src/autoStart/base.js","src/autoStart/delay.js","src/autoStart/drag.js","src/autoStart/gesture.js","src/autoStart/resize.js","src/defaultOptions.js","src/index.js","src/inertia.js","src/interact.js","src/interactablePreventDefault.js","src/legacyBrowsers.js","src/modifiers/index.js","src/modifiers/restrict.js","src/modifiers/restrictEdges.js","src/modifiers/restrictSize.js","src/modifiers/snap.js","src/modifiers/snapSize.js","src/pointerEvents/PointerEvent.js","src/pointerEvents/base.js","src/pointerEvents/holdRepeat.js","src/pointerEvents/interactableTargets.js","src/scope.js","src/utils/Signals.js","src/utils/arr.js","src/utils/browser.js","src/utils/domObjects.js","src/utils/domUtils.js","src/utils/events.js","src/utils/extend.js","src/utils/getOriginXY.js","src/utils/hypot.js","src/utils/index.js","src/utils/interactionFinder.js","src/utils/is.js","src/utils/isWindow.js","src/utils/pointerExtend.js","src/utils/pointerUtils.js","src/utils/raf.js","src/utils/rect.js","src/utils/window.js"],"names":[],"mappings":"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","file":"interact.min.js","sourceRoot":"","sourcesContent":["/* interact.js v1.3.0-alpha.4+sha.7970416-dirty | https://raw.github.com/taye/interact.js/master/LICENSE */\n","/**\n * interact.js v1.3.0-alpha.4+sha.7970416-dirty\n *\n * Copyright (c) 2012-2017 Taye Adeyemi \n * Open source under the MIT License.\n * https://raw.github.com/taye/interact.js/master/LICENSE\n */\n","/*\n * In a (windowless) server environment this file exports a factory function\n * that takes the window to use.\n *\n * var interact = require('interact.js')(windowObject);\n *\n * See https://github.com/taye/interact.js/issues/187\n */\nif (typeof window === 'undefined') {\n module.exports = function (window) {\n require('./src/utils/window').init(window);\n\n return require('./src/index');\n };\n}\nelse {\n module.exports = require('./src/index');\n}\n","const { indexOf } = require('./utils/arr');\nconst extend = require('./utils/extend.js');\n\nfunction fireUntilImmediateStopped (event, listeners) {\n for (let i = 0, len = listeners.length; i < len && !event.immediatePropagationStopped; i++) {\n listeners[i](event);\n }\n}\n\nclass Eventable {\n\n constructor (options) {\n this.options = extend({}, options || {});\n }\n\n fire (event) {\n let listeners;\n const onEvent = 'on' + event.type;\n const global = this.global;\n\n // Interactable#on() listeners\n if ((listeners = this[event.type])) {\n fireUntilImmediateStopped(event, listeners);\n }\n\n // interactable.onevent listener\n if (this[onEvent]) {\n this[onEvent](event);\n }\n\n // interact.on() listeners\n if (!event.propagationStopped && global && (listeners = global[event.type])) {\n fireUntilImmediateStopped(event, listeners);\n }\n }\n\n on (eventType, listener) {\n // if this type of event was never bound\n if (this[eventType]) {\n this[eventType].push(listener);\n }\n else {\n this[eventType] = [listener];\n }\n }\n\n off (eventType, listener) {\n // if it is an action event type\n const eventList = this[eventType];\n const index = eventList? indexOf(eventList, listener) : -1;\n\n if (index !== -1) {\n eventList.splice(index, 1);\n }\n\n if (eventList && eventList.length === 0 || !listener) {\n this[eventType] = listener;\n }\n }\n}\n\nmodule.exports = Eventable;\n","const extend = require('./utils/extend');\nconst getOriginXY = require('./utils/getOriginXY');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nclass InteractEvent {\n constructor (interaction, event, action, phase, element, related, preEnd = false) {\n const target = interaction.target;\n const deltaSource = (target && target.options || defaults).deltaSource;\n const origin = getOriginXY(target, element, action);\n const starting = phase === 'start';\n const ending = phase === 'end';\n const coords = starting? interaction.startCoords : interaction.curCoords;\n const prevEvent = interaction.prevEvent;\n\n element = element || interaction.element;\n\n const page = extend({}, coords.page);\n const client = extend({}, coords.client);\n\n page.x -= origin.x;\n page.y -= origin.y;\n\n client.x -= origin.x;\n client.y -= origin.y;\n\n this.ctrlKey = event.ctrlKey;\n this.altKey = event.altKey;\n this.shiftKey = event.shiftKey;\n this.metaKey = event.metaKey;\n this.button = event.button;\n this.buttons = event.buttons;\n this.target = element;\n this.currentTarget = element;\n this.relatedTarget = related || null;\n this.preEnd = preEnd;\n this.type = action + (phase || '');\n this.interaction = interaction;\n this.interactable = target;\n\n this.t0 = starting ? interaction.downTimes[interaction.downTimes.length - 1]\n : prevEvent.t0;\n\n const signalArg = {\n interaction,\n event,\n action,\n phase,\n element,\n related,\n page,\n client,\n coords,\n starting,\n ending,\n deltaSource,\n iEvent: this,\n };\n\n signals.fire('set-xy', signalArg);\n\n if (ending) {\n // use previous coords when ending\n this.pageX = prevEvent.pageX;\n this.pageY = prevEvent.pageY;\n this.clientX = prevEvent.clientX;\n this.clientY = prevEvent.clientY;\n }\n else {\n this.pageX = page.x;\n this.pageY = page.y;\n this.clientX = client.x;\n this.clientY = client.y;\n }\n\n this.x0 = interaction.startCoords.page.x - origin.x;\n this.y0 = interaction.startCoords.page.y - origin.y;\n this.clientX0 = interaction.startCoords.client.x - origin.x;\n this.clientY0 = interaction.startCoords.client.y - origin.y;\n\n signals.fire('set-delta', signalArg);\n\n this.timeStamp = coords.timeStamp;\n this.dt = interaction.pointerDelta.timeStamp;\n this.duration = this.timeStamp - this.t0;\n\n // speed and velocity in pixels per second\n this.speed = interaction.pointerDelta[deltaSource].speed;\n this.velocityX = interaction.pointerDelta[deltaSource].vx;\n this.velocityY = interaction.pointerDelta[deltaSource].vy;\n\n this.swipe = (ending || phase === 'inertiastart')? this.getSwipe() : null;\n\n signals.fire('new', signalArg);\n }\n\n getSwipe () {\n const interaction = this.interaction;\n\n if (interaction.prevEvent.speed < 600\n || this.timeStamp - interaction.prevEvent.timeStamp > 150) {\n return null;\n }\n\n let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI;\n const overlap = 22.5;\n\n if (angle < 0) {\n angle += 360;\n }\n\n const left = 135 - overlap <= angle && angle < 225 + overlap;\n const up = 225 - overlap <= angle && angle < 315 + overlap;\n\n const right = !left && (315 - overlap <= angle || angle < 45 + overlap);\n const down = !up && 45 - overlap <= angle && angle < 135 + overlap;\n\n return {\n up,\n down,\n left,\n right,\n angle,\n speed: interaction.prevEvent.speed,\n velocity: {\n x: interaction.prevEvent.velocityX,\n y: interaction.prevEvent.velocityY,\n },\n };\n }\n\n preventDefault () {}\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n}\n\nsignals.on('set-delta', function ({ iEvent, interaction, starting, deltaSource }) {\n const prevEvent = starting? iEvent : interaction.prevEvent;\n\n if (deltaSource === 'client') {\n iEvent.dx = iEvent.clientX - prevEvent.clientX;\n iEvent.dy = iEvent.clientY - prevEvent.clientY;\n }\n else {\n iEvent.dx = iEvent.pageX - prevEvent.pageX;\n iEvent.dy = iEvent.pageY - prevEvent.pageY;\n }\n});\n\nInteractEvent.signals = signals;\n\nmodule.exports = InteractEvent;\n","const is = require('./utils/is');\nconst events = require('./utils/events');\nconst extend = require('./utils/extend');\nconst actions = require('./actions/base');\nconst scope = require('./scope');\nconst Eventable = require('./Eventable');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nconst {\n getElementRect,\n nodeContains,\n trySelector,\n} = require('./utils/domUtils');\nconst { getWindow } = require('./utils/window');\nconst { indexOf, contains } = require('./utils/arr');\nconst { wheelEvent } = require('./utils/browser');\n\n// all set interactables\nscope.interactables = [];\n\n/*\\\n * Interactable\n [ property ]\n **\n * Object type returned by @interact\n\\*/\nclass Interactable {\n constructor (target, options) {\n options = options || {};\n\n this.target = target;\n this.events = new Eventable();\n this._context = options.context || scope.document;\n this._win = getWindow(trySelector(target)? this._context : target);\n this._doc = this._win.document;\n\n signals.fire('new', {\n target,\n options,\n interactable: this,\n win: this._win,\n });\n\n scope.addDocument( this._doc, this._win );\n\n scope.interactables.push(this);\n\n this.set(options);\n }\n\n setOnEvents (action, phases) {\n const onAction = 'on' + action;\n\n if (is.function(phases.onstart) ) { this.events[onAction + 'start' ] = phases.onstart ; }\n if (is.function(phases.onmove) ) { this.events[onAction + 'move' ] = phases.onmove ; }\n if (is.function(phases.onend) ) { this.events[onAction + 'end' ] = phases.onend ; }\n if (is.function(phases.oninertiastart)) { this.events[onAction + 'inertiastart' ] = phases.oninertiastart ; }\n\n return this;\n }\n\n setPerAction (action, options) {\n // for all the default per-action options\n for (const option in options) {\n // if this option exists for this action\n if (option in defaults[action]) {\n // if the option in the options arg is an object value\n if (is.object(options[option])) {\n // duplicate the object\n this.options[action][option] = extend(this.options[action][option] || {}, options[option]);\n\n if (is.object(defaults.perAction[option]) && 'enabled' in defaults.perAction[option]) {\n this.options[action][option].enabled = options[option].enabled === false? false : true;\n }\n }\n else if (is.bool(options[option]) && is.object(defaults.perAction[option])) {\n this.options[action][option].enabled = options[option];\n }\n else if (options[option] !== undefined) {\n // or if it's not undefined, do a plain assignment\n this.options[action][option] = options[option];\n }\n }\n }\n }\n\n /*\\\n * Interactable.getRect\n [ method ]\n *\n * The default function to get an Interactables bounding rect. Can be\n * overridden using @Interactable.rectChecker.\n *\n - element (Element) #optional The element to measure.\n = (object) The object's bounding rectangle.\n o {\n o top : 0,\n o left : 0,\n o bottom: 0,\n o right : 0,\n o width : 0,\n o height: 0\n o }\n \\*/\n getRect (element) {\n element = element || this.target;\n\n if (is.string(this.target) && !(is.element(element))) {\n element = this._context.querySelector(this.target);\n }\n\n return getElementRect(element);\n }\n\n /*\\\n * Interactable.rectChecker\n [ method ]\n *\n * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n - checker (function) #optional A function which returns this Interactable's bounding rectangle. See @Interactable.getRect\n = (function | object) The checker function or this Interactable\n \\*/\n rectChecker (checker) {\n if (is.function(checker)) {\n this.getRect = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.getRect;\n\n return this;\n }\n\n return this.getRect;\n }\n\n _backCompatOption (optionName, newValue) {\n if (trySelector(newValue) || is.object(newValue)) {\n this.options[optionName] = newValue;\n\n for (const action of actions.names) {\n this.options[action][optionName] = newValue;\n }\n\n return this;\n }\n\n return this.options[optionName];\n }\n\n /*\\\n * Interactable.origin\n [ method ]\n *\n * Gets or sets the origin of the Interactable's element. The x and y\n * of the origin will be subtracted from action event coordinates.\n *\n - origin (object | string) #optional An object eg. { x: 0, y: 0 } or string 'parent', 'self' or any CSS selector\n * OR\n - origin (Element) #optional An HTML or SVG Element whose rect will be used\n **\n = (object) The current origin or this Interactable\n \\*/\n origin (newValue) {\n return this._backCompatOption('origin', newValue);\n }\n\n /*\\\n * Interactable.deltaSource\n [ method ]\n *\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n - newValue (string) #optional Use 'client' if you will be scrolling while interacting; Use 'page' if you want autoScroll to work\n = (string | object) The current deltaSource or this Interactable\n \\*/\n deltaSource (newValue) {\n if (newValue === 'page' || newValue === 'client') {\n this.options.deltaSource = newValue;\n\n return this;\n }\n\n return this.options.deltaSource;\n }\n\n /*\\\n * Interactable.context\n [ method ]\n *\n * Gets the selector context Node of the Interactable. The default is `window.document`.\n *\n = (Node) The context Node of this Interactable\n **\n \\*/\n context () {\n return this._context;\n }\n\n inContext (element) {\n return (this._context === element.ownerDocument\n || nodeContains(this._context, element));\n }\n\n /*\\\n * Interactable.fire\n [ method ]\n *\n * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n - iEvent (InteractEvent) The InteractEvent object to be fired on this Interactable\n = (Interactable) this Interactable\n \\*/\n fire (iEvent) {\n this.events.fire(iEvent);\n\n return this;\n }\n\n _onOffMultiple (method, eventType, listener, options) {\n if (is.string(eventType) && eventType.search(' ') !== -1) {\n eventType = eventType.trim().split(/ +/);\n }\n\n if (is.array(eventType)) {\n for (let i = 0; i < eventType.length; i++) {\n this[method](eventType[i], listener, options);\n }\n\n return true;\n }\n\n if (is.object(eventType)) {\n for (const prop in eventType) {\n this[method](prop, eventType[prop], listener);\n }\n\n return true;\n }\n }\n\n /*\\\n * Interactable.on\n [ method ]\n *\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n - eventType (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) This Interactable\n \\*/\n on (eventType, listener, options) {\n if (this._onOffMultiple('on', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.on(eventType, listener);\n }\n // delegated event for selector\n else if (is.string(this.target)) {\n events.addDelegate(this.target, this._context, eventType, listener, options);\n }\n else {\n events.add(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.off\n [ method ]\n *\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n - eventType (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) This Interactable\n \\*/\n off (eventType, listener, options) {\n if (this._onOffMultiple('off', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n // if it is an action event type\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.off(eventType, listener);\n }\n // delegated event\n else if (is.string(this.target)) {\n events.removeDelegate(this.target, this._context, eventType, listener, options);\n }\n // remove listener from this Interatable's element\n else {\n events.remove(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.set\n [ method ]\n *\n * Reset the options of this Interactable\n - options (object) The new settings to apply\n = (object) This Interactable\n \\*/\n set (options) {\n if (!is.object(options)) {\n options = {};\n }\n\n this.options = extend({}, defaults.base);\n\n const perActions = extend({}, defaults.perAction);\n\n for (const actionName in actions.methodDict) {\n const methodName = actions.methodDict[actionName];\n\n this.options[actionName] = extend({}, defaults[actionName]);\n\n this.setPerAction(actionName, perActions);\n\n this[methodName](options[actionName]);\n }\n\n for (const setting of Interactable.settingsMethods) {\n this.options[setting] = defaults.base[setting];\n\n if (setting in options) {\n this[setting](options[setting]);\n }\n }\n\n signals.fire('set', {\n options,\n interactable: this,\n });\n\n return this;\n }\n\n /*\\\n * Interactable.unset\n [ method ]\n *\n * Remove this interactable from the list of interactables and remove\n * it's action capabilities and event listeners\n *\n = (object) @interact\n \\*/\n unset () {\n events.remove(this.target, 'all');\n\n if (is.string(this.target)) {\n // remove delegated events\n for (const type in events.delegatedEvents) {\n const delegated = events.delegatedEvents[type];\n\n if (delegated.selectors[0] === this.target\n && delegated.contexts[0] === this._context) {\n\n delegated.selectors.splice(0, 1);\n delegated.contexts .splice(0, 1);\n delegated.listeners.splice(0, 1);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegated[type] = null;\n }\n }\n\n events.remove(this._context, type, events.delegateListener);\n events.remove(this._context, type, events.delegateUseCapture, true);\n }\n }\n else {\n events.remove(this, 'all');\n }\n\n signals.fire('unset', { interactable: this });\n\n scope.interactables.splice(indexOf(scope.interactables, this), 1);\n\n // Stop related interactions when an Interactable is unset\n for (const interaction of scope.interactions || []) {\n if (interaction.target === this && interaction.interacting()) {\n interaction.stop();\n }\n }\n\n return scope.interact;\n }\n}\n\nscope.interactables.indexOfElement = function indexOfElement (target, context) {\n context = context || scope.document;\n\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n if (interactable.target === target && interactable._context === context) {\n return i;\n }\n }\n return -1;\n};\n\nscope.interactables.get = function interactableGet (element, options, dontCheckInContext) {\n const ret = this[this.indexOfElement(element, options && options.context)];\n\n return ret && (is.string(element) || dontCheckInContext || ret.inContext(element))? ret : null;\n};\n\nscope.interactables.forEachSelector = function (callback, element) {\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n // skip non CSS selector targets and out of context elements\n if (!is.string(interactable.target)\n || (element && !interactable.inContext(element))) {\n continue;\n }\n\n const ret = callback(interactable, interactable.target, interactable._context, i, this);\n\n if (ret !== undefined) {\n return ret;\n }\n }\n};\n\n// all interact.js eventTypes\nInteractable.eventTypes = scope.eventTypes = [];\n\nInteractable.signals = signals;\n\nInteractable.settingsMethods = [ 'deltaSource', 'origin', 'preventDefault', 'rectChecker' ];\n\nmodule.exports = Interactable;\n","const scope = require('./scope');\nconst utils = require('./utils');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst domObjects = require('./utils/domObjects');\nconst finder = require('./utils/interactionFinder');\nconst signals = require('./utils/Signals').new();\n\nconst listeners = {};\nconst methodNames = [\n 'pointerDown', 'pointerMove', 'pointerUp',\n 'updatePointer', 'removePointer',\n];\n\n// for ignoring browser's simulated mouse events\nlet prevTouchTime = 0;\n\n// all active and idle interactions\nscope.interactions = [];\n\nclass Interaction {\n constructor ({ pointerType }) {\n this.target = null; // current interactable being interacted with\n this.element = null; // the target element of the interactable\n\n this.prepared = { // action that's ready to be fired on next move event\n name : null,\n axis : null,\n edges: null,\n };\n\n // keep track of added pointers\n this.pointers = [];\n this.pointerIds = [];\n this.downTargets = [];\n this.downTimes = [];\n\n // Previous native pointer move event coordinates\n this.prevCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n // current native pointer move event coordinates\n this.curCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Starting InteractEvent pointer coordinates\n this.startCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Change in coordinates and time of the pointer\n this.pointerDelta = {\n page : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n client : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n timeStamp: 0,\n };\n\n this.downEvent = null; // pointerdown/mousedown/touchstart event\n this.downPointer = {};\n\n this._eventTarget = null;\n this._curEventTarget = null;\n\n this.prevEvent = null; // previous action event\n\n this.pointerIsDown = false;\n this.pointerWasMoved = false;\n this._interacting = false;\n\n this.pointerType = pointerType;\n\n signals.fire('new', this);\n\n scope.interactions.push(this);\n }\n\n pointerDown (pointer, event, eventTarget) {\n const pointerIndex = this.updatePointer(pointer, event, true);\n\n signals.fire('down', {\n pointer,\n event,\n eventTarget,\n pointerIndex,\n interaction: this,\n });\n }\n\n /*\\\n * Interaction.start\n [ method ]\n *\n * Start an action with the given Interactable and Element as tartgets. The\n * action must be enabled for the target Interactable and an appropriate number\n * of pointers must be held down - 1 for drag/resize, 2 for gesture.\n *\n * Use it with `interactable.able({ manualStart: false })` to always\n * [start actions manually](https://github.com/taye/interact.js/issues/114)\n *\n - action (object) The action to be performed - drag, resize, etc.\n - target (Interactable) The Interactable to target\n - element (Element) The DOM Element to target\n = (object) interact\n **\n | interact(target)\n | .draggable({\n | // disable the default drag start by down->move\n | manualStart: true\n | })\n | // start dragging after the user holds the pointer down\n | .on('hold', function (event) {\n | var interaction = event.interaction;\n |\n | if (!interaction.interacting()) {\n | interaction.start({ name: 'drag' },\n | event.interactable,\n | event.currentTarget);\n | }\n | });\n \\*/\n start (action, target, element) {\n if (this.interacting()\n || !this.pointerIsDown\n || this.pointerIds.length < (action.name === 'gesture'? 2 : 1)) {\n return;\n }\n\n // if this interaction had been removed after stopping\n // add it back\n if (utils.indexOf(scope.interactions, this) === -1) {\n scope.interactions.push(this);\n }\n\n utils.copyAction(this.prepared, action);\n this.target = target;\n this.element = element;\n\n signals.fire('action-start', {\n interaction: this,\n event: this.downEvent,\n });\n }\n\n pointerMove (pointer, event, eventTarget) {\n if (!this.simulation) {\n this.updatePointer(pointer);\n utils.setCoords(this.curCoords, this.pointers);\n }\n\n const duplicateMove = (this.curCoords.page.x === this.prevCoords.page.x\n && this.curCoords.page.y === this.prevCoords.page.y\n && this.curCoords.client.x === this.prevCoords.client.x\n && this.curCoords.client.y === this.prevCoords.client.y);\n\n let dx;\n let dy;\n\n // register movement greater than pointerMoveTolerance\n if (this.pointerIsDown && !this.pointerWasMoved) {\n dx = this.curCoords.client.x - this.startCoords.client.x;\n dy = this.curCoords.client.y - this.startCoords.client.y;\n\n this.pointerWasMoved = utils.hypot(dx, dy) > Interaction.pointerMoveTolerance;\n }\n\n const signalArg = {\n pointer,\n pointerIndex: this.getPointerIndex(pointer),\n event,\n eventTarget,\n dx,\n dy,\n duplicate: duplicateMove,\n interaction: this,\n interactingBeforeMove: this.interacting(),\n };\n\n if (!duplicateMove) {\n // set pointer coordinate, time changes and speeds\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n }\n\n signals.fire('move', signalArg);\n\n if (!duplicateMove) {\n // if interacting, fire an 'action-move' signal etc\n if (this.interacting()) {\n this.doMove(signalArg);\n }\n\n if (this.pointerWasMoved) {\n utils.copyCoords(this.prevCoords, this.curCoords);\n }\n }\n }\n\n /*\\\n * Interaction.doMove\n [ method ]\n *\n * Force a move of the current action at the same coordinates. Useful if\n * snap/restrict has been changed and you want a movement with the new\n * settings.\n *\n **\n | interact(target)\n | .draggable(true)\n | .on('dragmove', function (event) {\n | if (someCondition) {\n | // change the snap settings\n | event.interactable.draggable({ snap: { targets: [] }});\n | // fire another move event with re-calculated snap\n | event.interaction.doMove();\n | }\n | });\n \\*/\n doMove (signalArg) {\n signalArg = utils.extend({\n pointer: this.pointers[0],\n event: this.prevEvent,\n eventTarget: this._eventTarget,\n interaction: this,\n }, signalArg || {});\n\n signals.fire('before-action-move', signalArg);\n\n if (!this._dontFireMove) {\n signals.fire('action-move', signalArg);\n }\n\n this._dontFireMove = false;\n }\n\n // End interact move events and stop auto-scroll unless simulation is running\n pointerUp (pointer, event, eventTarget, curEventTarget) {\n const pointerIndex = this.getPointerIndex(pointer);\n\n signals.fire(/cancel$/i.test(event.type)? 'cancel' : 'up', {\n pointer,\n pointerIndex,\n event,\n eventTarget,\n curEventTarget,\n interaction: this,\n });\n\n if (!this.simulation) {\n this.end(event);\n }\n\n this.pointerIsDown = false;\n this.removePointer(pointer, event);\n }\n\n /*\\\n * Interaction.end\n [ method ]\n *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n - event (PointerEvent) #optional\n **\n | interact(target)\n | .draggable(true)\n | .on('move', function (event) {\n | if (event.pageX > 1000) {\n | // end the current action\n | event.interaction.end();\n | // stop all further listeners from being called\n | event.stopImmediatePropagation();\n | }\n | });\n \\*/\n end (event) {\n event = event || this.prevEvent;\n\n if (this.interacting()) {\n signals.fire('action-end', {\n event,\n interaction: this,\n });\n }\n\n this.stop();\n }\n\n currentAction () {\n return this._interacting? this.prepared.name: null;\n }\n\n interacting () {\n return this._interacting;\n }\n\n stop () {\n signals.fire('stop', { interaction: this });\n\n if (this._interacting) {\n signals.fire('stop-active', { interaction: this });\n signals.fire('stop-' + this.prepared.name, { interaction: this });\n }\n\n this.target = this.element = null;\n\n this._interacting = false;\n this.prepared.name = this.prevEvent = null;\n }\n\n getPointerIndex (pointer) {\n // mouse and pen interactions may have only one pointer\n if (this.pointerType === 'mouse' || this.pointerType === 'pen') {\n return 0;\n }\n\n return utils.indexOf(this.pointerIds, utils.getPointerId(pointer));\n }\n\n updatePointer (pointer, event, down = event && /(down|start)$/i.test(event.type)) {\n const id = utils.getPointerId(pointer);\n let index = this.getPointerIndex(pointer);\n\n if (index === -1) {\n index = this.pointerIds.length;\n this.pointerIds[index] = id;\n }\n\n if (down) {\n signals.fire('update-pointer-down', {\n pointer,\n event,\n down,\n pointerId: id,\n pointerIndex: index,\n interaction: this,\n });\n }\n\n this.pointers[index] = pointer;\n\n return index;\n }\n\n removePointer (pointer, event) {\n const index = this.getPointerIndex(pointer);\n\n if (index === -1) { return; }\n\n signals.fire('remove-pointer', {\n pointer,\n event,\n pointerIndex: index,\n interaction: this,\n });\n\n this.pointers .splice(index, 1);\n this.pointerIds .splice(index, 1);\n this.downTargets.splice(index, 1);\n this.downTimes .splice(index, 1);\n }\n\n _updateEventTargets (target, currentTarget) {\n this._eventTarget = target;\n this._curEventTarget = currentTarget;\n }\n}\n\nfor (let i = 0, len = methodNames.length; i < len; i++) {\n const method = methodNames[i];\n\n listeners[method] = doOnInteractions(method);\n}\n\nfunction doOnInteractions (method) {\n return (function (event) {\n const pointerType = utils.getPointerType(event);\n const [eventTarget, curEventTarget] = utils.getEventTargets(event);\n const matches = []; // [ [pointer, interaction], ...]\n\n if (browser.supportsTouch && /touch/.test(event.type)) {\n prevTouchTime = new Date().getTime();\n\n for (let i = 0; i < event.changedTouches.length; i++) {\n const pointer = event.changedTouches[i];\n const interaction = finder.search(pointer, event.type, eventTarget);\n\n matches.push([pointer, interaction || new Interaction({ pointerType })]);\n }\n }\n else {\n let invalidPointer = false;\n\n if (!browser.supportsPointerEvent && /mouse/.test(event.type)) {\n // ignore mouse events while touch interactions are active\n for (let i = 0; i < scope.interactions.length && !invalidPointer; i++) {\n invalidPointer = scope.interactions[i].pointerType !== 'mouse' && scope.interactions[i].pointerIsDown;\n }\n\n // try to ignore mouse events that are simulated by the browser\n // after a touch event\n invalidPointer = invalidPointer\n || (new Date().getTime() - prevTouchTime < 500)\n // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated\n || event.timeStamp === 0;\n }\n\n if (!invalidPointer) {\n let interaction = finder.search(event, event.type, eventTarget);\n\n if (!interaction) {\n interaction = new Interaction({ pointerType });\n }\n\n matches.push([event, interaction]);\n }\n }\n\n for (const [pointer, interaction] of matches) {\n interaction._updateEventTargets(eventTarget, curEventTarget);\n interaction[method](pointer, event, eventTarget, curEventTarget);\n }\n });\n}\n\nfunction endAll (event) {\n for (let i = 0; i < scope.interactions.length; i++) {\n const interaction = scope.interactions[i];\n\n interaction.end(event);\n signals.fire('endall', { event, interaction });\n }\n}\n\nconst docEvents = { /* 'eventType': listenerFunc */ };\nconst pEventTypes = browser.pEventTypes;\n\nif (domObjects.PointerEvent) {\n docEvents[pEventTypes.down ] = listeners.pointerDown;\n docEvents[pEventTypes.move ] = listeners.pointerMove;\n docEvents[pEventTypes.up ] = listeners.pointerUp;\n docEvents[pEventTypes.cancel] = listeners.pointerUp;\n}\nelse {\n docEvents.mousedown = listeners.pointerDown;\n docEvents.mousemove = listeners.pointerMove;\n docEvents.mouseup = listeners.pointerUp;\n\n docEvents.touchstart = listeners.pointerDown;\n docEvents.touchmove = listeners.pointerMove;\n docEvents.touchend = listeners.pointerUp;\n docEvents.touchcancel = listeners.pointerUp;\n}\n\ndocEvents.blur = endAll;\n\nfunction onDocSignal ({ doc }, signalName) {\n const eventMethod = signalName.indexOf('add') === 0\n ? events.add : events.remove;\n\n // delegate event listener\n for (const eventType in scope.delegatedEvents) {\n eventMethod(doc, eventType, events.delegateListener);\n eventMethod(doc, eventType, events.delegateUseCapture, true);\n }\n\n for (const eventType in docEvents) {\n eventMethod(doc, eventType, docEvents[eventType]);\n }\n}\n\nsignals.on('update-pointer-down', ({ interaction, pointer, pointerId, pointerIndex, event, eventTarget, down }) => {\n interaction.pointerIds[pointerIndex] = pointerId;\n interaction.pointers[pointerIndex] = pointer;\n\n if (down) {\n interaction.pointerIsDown = true;\n }\n\n if (!interaction.interacting()) {\n utils.setCoords(interaction.startCoords, interaction.pointers);\n\n utils.copyCoords(interaction.curCoords , interaction.startCoords);\n utils.copyCoords(interaction.prevCoords, interaction.startCoords);\n\n interaction.downEvent = event;\n interaction.downTimes[pointerIndex] = interaction.curCoords.timeStamp;\n interaction.downTargets[pointerIndex] = eventTarget || event && utils.getEventTargets(event)[0];\n interaction.pointerWasMoved = false;\n\n utils.pointerExtend(interaction.downPointer, pointer);\n }\n});\n\nscope.signals.on('add-document' , onDocSignal);\nscope.signals.on('remove-document', onDocSignal);\n\nInteraction.pointerMoveTolerance = 1;\nInteraction.doOnInteractions = doOnInteractions;\nInteraction.endAll = endAll;\nInteraction.signals = signals;\nInteraction.docEvents = docEvents;\n\nscope.endAllInteractions = endAll;\n\nmodule.exports = Interaction;\n","const Interaction = require('../Interaction');\nconst InteractEvent = require('../InteractEvent');\n\nconst actions = {\n firePrepared,\n names: [],\n methodDict: {},\n};\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n interaction._interacting = true;\n firePrepared(interaction, event, 'start');\n});\n\nInteraction.signals.on('action-move', function ({ interaction, event, preEnd }) {\n firePrepared(interaction, event, 'move', preEnd);\n\n // if the action was ended in a listener\n if (!interaction.interacting()) { return false; }\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n firePrepared(interaction, event, 'end');\n});\n\nfunction firePrepared (interaction, event, phase, preEnd) {\n const actionName = interaction.prepared.name;\n\n const newEvent = new InteractEvent(interaction, event, actionName, phase, interaction.element, null, preEnd);\n\n interaction.target.fire(newEvent);\n interaction.prevEvent = newEvent;\n}\n\nmodule.exports = actions;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drag = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n startAxis : 'xy',\n lockAxis : 'xy',\n },\n\n checker: function (pointer, event, interactable) {\n const dragOptions = interactable.options.drag;\n\n return dragOptions.enabled\n ? { name: 'drag', axis: (dragOptions.lockAxis === 'start'\n ? dragOptions.startAxis\n : dragOptions.lockAxis)}\n : null;\n },\n\n getCursor: function () {\n return 'move';\n },\n};\n\nInteraction.signals.on('before-action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n interaction.curCoords.page.y = interaction.startCoords.page.y;\n interaction.curCoords.client.y = interaction.startCoords.client.y;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vx);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vx);\n interaction.pointerDelta.client.vy = 0;\n interaction.pointerDelta.page.vy = 0;\n }\n else if (axis === 'y') {\n interaction.curCoords.page.x = interaction.startCoords.page.x;\n interaction.curCoords.client.x = interaction.startCoords.client.x;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vy);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vy);\n interaction.pointerDelta.client.vx = 0;\n interaction.pointerDelta.page.vx = 0;\n }\n});\n\n// dragmove\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'dragmove') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n iEvent.pageY = interaction.startCoords.page.y;\n iEvent.clientY = interaction.startCoords.client.y;\n iEvent.dy = 0;\n }\n else if (axis === 'y') {\n iEvent.pageX = interaction.startCoords.page.x;\n iEvent.clientX = interaction.startCoords.client.x;\n iEvent.dx = 0;\n }\n});\n\n/*\\\n * Interactable.draggable\n [ method ]\n *\n * Gets or sets whether drag actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of drag events\n | var isDraggable = interact('ul li').draggable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on drag events (object makes the Interactable draggable)\n = (object) This Interactable\n | interact(element).draggable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // the axis in which the first movement must be\n | // for the drag sequence to start\n | // 'xy' by default - any direction\n | startAxis: 'x' || 'y' || 'xy',\n |\n | // 'xy' by default - don't restrict to one axis (move in any direction)\n | // 'x' or 'y' to restrict movement to either axis\n | // 'start' to restrict movement to the axis the drag started in\n | lockAxis: 'x' || 'y' || 'xy' || 'start',\n |\n | // max number of drags that can happen concurrently\n | // with elements of this Interactable. Infinity by default\n | max: Infinity,\n |\n | // max number of drags that can target the same element+Interactable\n | // 1 by default\n | maxPerElement: 2\n | });\n\\*/\nInteractable.prototype.draggable = function (options) {\n if (utils.is.object(options)) {\n this.options.drag.enabled = options.enabled === false? false: true;\n this.setPerAction('drag', options);\n this.setOnEvents('drag', options);\n\n if (/^(xy|x|y|start)$/.test(options.lockAxis)) {\n this.options.drag.lockAxis = options.lockAxis;\n }\n if (/^(xy|x|y)$/.test(options.startAxis)) {\n this.options.drag.startAxis = options.startAxis;\n }\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drag.enabled = options;\n\n if (!options) {\n this.ondragstart = this.ondragstart = this.ondragend = null;\n }\n\n return this;\n }\n\n return this.options.drag;\n};\n\nactions.drag = drag;\nactions.names.push('drag');\nutils.merge(Interactable.eventTypes, [\n 'dragstart',\n 'dragmove',\n 'draginertiastart',\n 'draginertiaresume',\n 'dragend',\n]);\nactions.methodDict.drag = 'draggable';\n\ndefaultOptions.drag = drag.defaults;\n\nmodule.exports = drag;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst scope = require('../scope');\nconst interact = require('../interact');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drop = {\n defaults: {\n enabled: false,\n accept : null,\n overlap: 'pointer',\n },\n};\n\nlet dynamicDrop = false;\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // reset active dropzones\n interaction.activeDrops.dropzones = [];\n interaction.activeDrops.elements = [];\n interaction.activeDrops.rects = [];\n\n interaction.dropEvents = null;\n\n if (!interaction.dynamicDrop) {\n setActiveDrops(interaction, interaction.element);\n }\n\n const dragEvent = interaction.prevEvent;\n const dropEvents = getDropEvents(interaction, event, dragEvent);\n\n if (dropEvents.activate) {\n fireActiveDrops(interaction, dropEvents.activate);\n }\n});\n\nInteractEvent.signals.on('new', function ({ interaction, iEvent, event }) {\n if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { return; }\n\n const draggableElement = interaction.element;\n const dragEvent = iEvent;\n const dropResult = getDrop(dragEvent, event, draggableElement);\n\n interaction.dropTarget = dropResult.dropzone;\n interaction.dropElement = dropResult.element;\n\n interaction.dropEvents = getDropEvents(interaction, event, dragEvent);\n});\n\nInteraction.signals.on('action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n fireDropEvents(interaction, interaction.dropEvents);\n});\n\nInteraction.signals.on('action-end', function ({ interaction }) {\n if (interaction.prepared.name === 'drag') {\n fireDropEvents(interaction, interaction.dropEvents);\n }\n});\n\nInteraction.signals.on('stop-drag', function ({ interaction }) {\n interaction.activeDrops.dropzones =\n interaction.activeDrops.elements =\n interaction.activeDrops.rects =\n interaction.dropEvents = null;\n});\n\nfunction collectDrops (interaction, element) {\n const drops = [];\n const elements = [];\n\n element = element || interaction.element;\n\n // collect all dropzones and their elements which qualify for a drop\n for (const current of scope.interactables) {\n if (!current.options.drop.enabled) { continue; }\n\n const accept = current.options.drop.accept;\n\n // test the draggable element against the dropzone's accept setting\n if ((utils.is.element(accept) && accept !== element)\n || (utils.is.string(accept)\n && !utils.matchesSelector(element, accept))) {\n\n continue;\n }\n\n // query for new elements if necessary\n const dropElements = utils.is.string(current.target)\n ? current._context.querySelectorAll(current.target)\n : [current.target];\n\n for (let i = 0; i < dropElements.length; i++) {\n const currentElement = dropElements[i];\n\n if (currentElement !== element) {\n drops.push(current);\n elements.push(currentElement);\n }\n }\n }\n\n return {\n elements,\n dropzones: drops,\n };\n}\n\nfunction fireActiveDrops (interaction, event) {\n let prevElement;\n\n // loop through all active dropzones and trigger event\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n const current = interaction.activeDrops.dropzones[i];\n const currentElement = interaction.activeDrops.elements [i];\n\n // prevent trigger of duplicate events on same element\n if (currentElement !== prevElement) {\n // set current element as event target\n event.target = currentElement;\n current.fire(event);\n }\n prevElement = currentElement;\n }\n}\n\n// Collect a new set of possible drops and save them in activeDrops.\n// setActiveDrops should always be called when a drag has just started or a\n// drag event happens while dynamicDrop is true\nfunction setActiveDrops (interaction, dragElement) {\n // get dropzones and their elements that could receive the draggable\n const possibleDrops = collectDrops(interaction, dragElement, true);\n\n interaction.activeDrops.dropzones = possibleDrops.dropzones;\n interaction.activeDrops.elements = possibleDrops.elements;\n interaction.activeDrops.rects = [];\n\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n interaction.activeDrops.rects[i] =\n interaction.activeDrops.dropzones[i].getRect(interaction.activeDrops.elements[i]);\n }\n}\n\nfunction getDrop (dragEvent, event, dragElement) {\n const interaction = dragEvent.interaction;\n const validDrops = [];\n\n if (dynamicDrop) {\n setActiveDrops(interaction, dragElement);\n }\n\n // collect all dropzones and their elements which qualify for a drop\n for (let j = 0; j < interaction.activeDrops.dropzones.length; j++) {\n const current = interaction.activeDrops.dropzones[j];\n const currentElement = interaction.activeDrops.elements [j];\n const rect = interaction.activeDrops.rects [j];\n\n validDrops.push(current.dropCheck(dragEvent, event, interaction.target, dragElement, currentElement, rect)\n ? currentElement\n : null);\n }\n\n // get the most appropriate dropzone based on DOM depth and order\n const dropIndex = utils.indexOfDeepestElement(validDrops);\n\n return {\n dropzone: interaction.activeDrops.dropzones[dropIndex] || null,\n element : interaction.activeDrops.elements [dropIndex] || null,\n };\n}\n\nfunction getDropEvents (interaction, pointerEvent, dragEvent) {\n const dropEvents = {\n enter : null,\n leave : null,\n activate : null,\n deactivate: null,\n move : null,\n drop : null,\n };\n\n const tmpl = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n };\n\n if (interaction.dropElement !== interaction.prevDropElement) {\n // if there was a prevDropTarget, create a dragleave event\n if (interaction.prevDropTarget) {\n dropEvents.leave = utils.extend({ type: 'dragleave' }, tmpl);\n\n dragEvent.dragLeave = dropEvents.leave.target = interaction.prevDropElement;\n dragEvent.prevDropzone = dropEvents.leave.dropzone = interaction.prevDropTarget;\n }\n // if the dropTarget is not null, create a dragenter event\n if (interaction.dropTarget) {\n dropEvents.enter = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n type : 'dragenter',\n };\n\n dragEvent.dragEnter = interaction.dropElement;\n dragEvent.dropzone = interaction.dropTarget;\n }\n }\n\n if (dragEvent.type === 'dragend' && interaction.dropTarget) {\n dropEvents.drop = utils.extend({ type: 'drop' }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n dragEvent.relatedTarget = interaction.dropElement;\n }\n if (dragEvent.type === 'dragstart') {\n dropEvents.activate = utils.extend({ type: 'dropactivate' }, tmpl);\n\n dropEvents.activate.target = null;\n dropEvents.activate.dropzone = null;\n }\n if (dragEvent.type === 'dragend') {\n dropEvents.deactivate = utils.extend({ type: 'dropdeactivate' }, tmpl);\n\n dropEvents.deactivate.target = null;\n dropEvents.deactivate.dropzone = null;\n }\n if (dragEvent.type === 'dragmove' && interaction.dropTarget) {\n dropEvents.move = utils.extend({\n dragmove : dragEvent,\n type : 'dropmove',\n }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n }\n\n return dropEvents;\n}\n\nfunction fireDropEvents (interaction, dropEvents) {\n if (dropEvents.leave) { interaction.prevDropTarget.fire(dropEvents.leave); }\n if (dropEvents.move ) { interaction.dropTarget.fire(dropEvents.move ); }\n if (dropEvents.enter) { interaction.dropTarget.fire(dropEvents.enter); }\n if (dropEvents.drop ) { interaction.dropTarget.fire(dropEvents.drop ); }\n if (dropEvents.deactivate) {\n fireActiveDrops(interaction, dropEvents.deactivate);\n }\n\n interaction.prevDropTarget = interaction.dropTarget;\n interaction.prevDropElement = interaction.dropElement;\n}\n\n/*\\\n * Interactable.dropzone\n [ method ]\n *\n * Returns or sets whether elements can be dropped onto this\n * Interactable to trigger drop events\n *\n * Dropzones can receive the following events:\n * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends\n * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone\n * - `dragmove` when a draggable that has entered the dropzone is moved\n * - `drop` when a draggable is dropped into this dropzone\n *\n * Use the `accept` option to allow only elements that match the given CSS\n * selector or element. The value can be:\n *\n * - **an Element** - only that element can be dropped into this dropzone.\n * - **a string**, - the element being dragged must match it as a CSS selector.\n * - **`null`** - accept options is cleared - it accepts any element.\n *\n * Use the `overlap` option to set how drops are checked for. The allowed\n * values are:\n *\n * - `'pointer'`, the pointer must be over the dropzone (default)\n * - `'center'`, the draggable element's center must be over the dropzone\n * - a number from 0-1 which is the `(intersection area) / (draggable area)`.\n * e.g. `0.5` for drop to happen when half of the area of the draggable is\n * over the dropzone\n *\n * Use the `checker` option to specify a function to check if a dragged\n * element is over this Interactable.\n *\n | interact(target)\n | .dropChecker(function(dragEvent, // related dragmove or dragend event\n | event, // TouchEvent/PointerEvent/MouseEvent\n | dropped, // bool result of the default checker\n | dropzone, // dropzone Interactable\n | dropElement, // dropzone elemnt\n | draggable, // draggable Interactable\n | draggableElement) {// draggable element\n |\n | return dropped && event.target.hasAttribute('allow-drop');\n | }\n *\n *\n - options (boolean | object | null) #optional The new value to be set.\n | interact('.drop').dropzone({\n | accept: '.can-drop' || document.getElementById('single-drop'),\n | overlap: 'pointer' || 'center' || zeroToOne\n | }\n = (boolean | object) The current setting or this Interactable\n\\*/\nInteractable.prototype.dropzone = function (options) {\n if (utils.is.object(options)) {\n this.options.drop.enabled = options.enabled === false? false: true;\n\n if (utils.is.function(options.ondrop) ) { this.events.ondrop = options.ondrop ; }\n if (utils.is.function(options.ondropactivate) ) { this.events.ondropactivate = options.ondropactivate ; }\n if (utils.is.function(options.ondropdeactivate)) { this.events.ondropdeactivate = options.ondropdeactivate; }\n if (utils.is.function(options.ondragenter) ) { this.events.ondragenter = options.ondragenter ; }\n if (utils.is.function(options.ondragleave) ) { this.events.ondragleave = options.ondragleave ; }\n if (utils.is.function(options.ondropmove) ) { this.events.ondropmove = options.ondropmove ; }\n\n if (/^(pointer|center)$/.test(options.overlap)) {\n this.options.drop.overlap = options.overlap;\n }\n else if (utils.is.number(options.overlap)) {\n this.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0);\n }\n if ('accept' in options) {\n this.options.drop.accept = options.accept;\n }\n if ('checker' in options) {\n this.options.drop.checker = options.checker;\n }\n\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drop.enabled = options;\n\n if (!options) {\n this.ondragenter = this.ondragleave = this.ondrop\n = this.ondropactivate = this.ondropdeactivate = null;\n }\n\n return this;\n }\n\n return this.options.drop;\n};\n\nInteractable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) {\n let dropped = false;\n\n // if the dropzone has no rect (eg. display: none)\n // call the custom dropChecker or just return false\n if (!(rect = rect || this.getRect(dropElement))) {\n return (this.options.drop.checker\n ? this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement)\n : false);\n }\n\n const dropOverlap = this.options.drop.overlap;\n\n if (dropOverlap === 'pointer') {\n const origin = utils.getOriginXY(draggable, draggableElement, 'drag');\n const page = utils.getPageXY(dragEvent);\n\n page.x += origin.x;\n page.y += origin.y;\n\n const horizontal = (page.x > rect.left) && (page.x < rect.right);\n const vertical = (page.y > rect.top ) && (page.y < rect.bottom);\n\n dropped = horizontal && vertical;\n }\n\n const dragRect = draggable.getRect(draggableElement);\n\n if (dragRect && dropOverlap === 'center') {\n const cx = dragRect.left + dragRect.width / 2;\n const cy = dragRect.top + dragRect.height / 2;\n\n dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom;\n }\n\n if (dragRect && utils.is.number(dropOverlap)) {\n const overlapArea = (Math.max(0, Math.min(rect.right , dragRect.right ) - Math.max(rect.left, dragRect.left))\n * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top , dragRect.top )));\n\n const overlapRatio = overlapArea / (dragRect.width * dragRect.height);\n\n dropped = overlapRatio >= dropOverlap;\n }\n\n if (this.options.drop.checker) {\n dropped = this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement);\n }\n\n return dropped;\n};\n\nInteractable.signals.on('unset', function ({ interactable }) {\n interactable.dropzone(false);\n});\n\nInteractable.settingsMethods.push('dropChecker');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.dropTarget = null; // the dropzone a drag target might be dropped into\n interaction.dropElement = null; // the element at the time of checking\n interaction.prevDropTarget = null; // the dropzone that was recently dragged away from\n interaction.prevDropElement = null; // the element at the time of checking\n interaction.dropEvents = null; // the dropEvents related to the current drag event\n\n interaction.activeDrops = {\n dropzones: [], // the dropzones that are mentioned below\n elements : [], // elements of dropzones that accept the target draggable\n rects : [], // the rects of the elements mentioned above\n };\n\n});\n\nInteraction.signals.on('stop', function ({ interaction }) {\n interaction.dropTarget = interaction.dropElement =\n interaction.prevDropTarget = interaction.prevDropElement = null;\n});\n\n/*\\\n * interact.dynamicDrop\n [ method ]\n *\n * Returns or sets whether the dimensions of dropzone elements are\n * calculated on every dragmove or only on dragstart for the default\n * dropChecker\n *\n - newValue (boolean) #optional True to check on each move. False to check only before start\n = (boolean | interact) The current setting or interact\n\\*/\ninteract.dynamicDrop = function (newValue) {\n if (utils.is.bool(newValue)) {\n //if (dragging && dynamicDrop !== newValue && !newValue) {\n //calcRects(dropzones);\n //}\n\n dynamicDrop = newValue;\n\n return interact;\n }\n return dynamicDrop;\n};\n\nutils.merge(Interactable.eventTypes, [\n 'dragenter',\n 'dragleave',\n 'dropactivate',\n 'dropdeactivate',\n 'dropmove',\n 'drop',\n]);\nactions.methodDict.drop = 'dropzone';\n\ndefaultOptions.drop = drop.defaults;\n\nmodule.exports = drop;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst gesture = {\n defaults: {\n enabled : false,\n origin : null,\n restrict: null,\n },\n\n checker: function (pointer, event, interactable, element, interaction) {\n if (interaction.pointerIds.length >= 2) {\n return { name: 'gesture' };\n }\n\n return null;\n },\n\n getCursor: function () {\n return '';\n },\n};\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturestart') { return; }\n iEvent.ds = 0;\n\n interaction.gesture.startDistance = interaction.gesture.prevDistance = iEvent.distance;\n interaction.gesture.startAngle = interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.scale = 1;\n});\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturemove') { return; }\n\n iEvent.ds = iEvent.scale - interaction.gesture.scale;\n\n interaction.target.fire(iEvent);\n\n interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.prevDistance = iEvent.distance;\n\n if (iEvent.scale !== Infinity\n && iEvent.scale !== null\n && iEvent.scale !== undefined\n && !isNaN(iEvent.scale)) {\n\n interaction.gesture.scale = iEvent.scale;\n }\n});\n\n/*\\\n * Interactable.gesturable\n [ method ]\n *\n * Gets or sets whether multitouch gestures can be performed on the\n * Interactable's element\n *\n = (boolean) Indicates if this can be the target of gesture events\n | var isGestureable = interact(element).gesturable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on gesture events (makes the Interactable gesturable)\n = (object) this Interactable\n | interact(element).gesturable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // limit multiple gestures.\n | // See the explanation in @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n\\*/\nInteractable.prototype.gesturable = function (options) {\n if (utils.is.object(options)) {\n this.options.gesture.enabled = options.enabled === false? false: true;\n this.setPerAction('gesture', options);\n this.setOnEvents('gesture', options);\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.gesture.enabled = options;\n\n if (!options) {\n this.ongesturestart = this.ongesturestart = this.ongestureend = null;\n }\n\n return this;\n }\n\n return this.options.gesture;\n};\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action, event, starting, ending, deltaSource }) {\n if (action !== 'gesture') { return; }\n\n const pointers = interaction.pointers;\n\n iEvent.touches = [pointers[0], pointers[1]];\n\n if (starting) {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = 1;\n iEvent.ds = 0;\n iEvent.angle = utils.touchAngle(pointers, undefined, deltaSource);\n iEvent.da = 0;\n }\n else if (ending || event instanceof InteractEvent) {\n iEvent.distance = interaction.prevEvent.distance;\n iEvent.box = interaction.prevEvent.box;\n iEvent.scale = interaction.prevEvent.scale;\n iEvent.ds = iEvent.scale - 1;\n iEvent.angle = interaction.prevEvent.angle;\n iEvent.da = iEvent.angle - interaction.gesture.startAngle;\n }\n else {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = iEvent.distance / interaction.gesture.startDistance;\n iEvent.angle = utils.touchAngle(pointers, interaction.gesture.prevAngle, deltaSource);\n\n iEvent.ds = iEvent.scale - interaction.gesture.prevScale;\n iEvent.da = iEvent.angle - interaction.gesture.prevAngle;\n }\n});\n\nInteraction.signals.on('new', function (interaction) {\n interaction.gesture = {\n start: { x: 0, y: 0 },\n\n startDistance: 0, // distance between two touches of touchStart\n prevDistance : 0,\n distance : 0,\n\n scale: 1, // gesture.distance / gesture.startDistance\n\n startAngle: 0, // angle of line joining two touches\n prevAngle : 0, // angle of the previous gesture event\n };\n});\n\nactions.gesture = gesture;\nactions.names.push('gesture');\nutils.merge(Interactable.eventTypes, [\n 'gesturestart',\n 'gesturemove',\n 'gestureend',\n]);\nactions.methodDict.gesture = 'gesturable';\n\ndefaultOptions.gesture = gesture.defaults;\n\nmodule.exports = gesture;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\n// Less Precision with touch input\nconst defaultMargin = browser.supportsTouch || browser.supportsPointerEvent? 20: 10;\n\nconst resize = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n square: false,\n preserveAspectRatio: false,\n axis: 'xy',\n\n // use default margin\n margin: NaN,\n\n // object with props left, right, top, bottom which are\n // true/false values to resize when the pointer is over that edge,\n // CSS selectors to match the handles for each direction\n // or the Elements for each handle\n edges: null,\n\n // a value of 'none' will limit the resize rect to a minimum of 0x0\n // 'negate' will alow the rect to have negative width/height\n // 'reposition' will keep the width/height positive by swapping\n // the top and bottom edges and/or swapping the left and right edges\n invert: 'none',\n },\n\n checker: function (pointer, event, interactable, element, interaction, rect) {\n if (!rect) { return null; }\n\n const page = utils.extend({}, interaction.curCoords.page);\n const options = interactable.options;\n\n if (options.resize.enabled) {\n const resizeOptions = options.resize;\n const resizeEdges = { left: false, right: false, top: false, bottom: false };\n\n // if using resize.edges\n if (utils.is.object(resizeOptions.edges)) {\n for (const edge in resizeEdges) {\n resizeEdges[edge] = checkResizeEdge(edge,\n resizeOptions.edges[edge],\n page,\n interaction._eventTarget,\n element,\n rect,\n resizeOptions.margin || defaultMargin);\n }\n\n resizeEdges.left = resizeEdges.left && !resizeEdges.right;\n resizeEdges.top = resizeEdges.top && !resizeEdges.bottom;\n\n if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) {\n return {\n name: 'resize',\n edges: resizeEdges,\n };\n }\n }\n else {\n const right = options.resize.axis !== 'y' && page.x > (rect.right - defaultMargin);\n const bottom = options.resize.axis !== 'x' && page.y > (rect.bottom - defaultMargin);\n\n if (right || bottom) {\n return {\n name: 'resize',\n axes: (right? 'x' : '') + (bottom? 'y' : ''),\n };\n }\n }\n }\n\n return null;\n },\n\n cursors: (browser.isIe9OrOlder ? {\n x : 'e-resize',\n y : 's-resize',\n xy: 'se-resize',\n\n top : 'n-resize',\n left : 'w-resize',\n bottom : 's-resize',\n right : 'e-resize',\n topleft : 'se-resize',\n bottomright: 'se-resize',\n topright : 'ne-resize',\n bottomleft : 'ne-resize',\n } : {\n x : 'ew-resize',\n y : 'ns-resize',\n xy: 'nwse-resize',\n\n top : 'ns-resize',\n left : 'ew-resize',\n bottom : 'ns-resize',\n right : 'ew-resize',\n topleft : 'nwse-resize',\n bottomright: 'nwse-resize',\n topright : 'nesw-resize',\n bottomleft : 'nesw-resize',\n }),\n\n getCursor: function (action) {\n if (action.axis) {\n return resize.cursors[action.name + action.axis];\n }\n else if (action.edges) {\n let cursorKey = '';\n const edgeNames = ['top', 'bottom', 'left', 'right'];\n\n for (let i = 0; i < 4; i++) {\n if (action.edges[edgeNames[i]]) {\n cursorKey += edgeNames[i];\n }\n }\n\n return resize.cursors[cursorKey];\n }\n },\n};\n\n// resizestart\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'resizestart' || !interaction.prepared.edges) {\n return;\n }\n\n const startRect = interaction.target.getRect(interaction.element);\n const resizeOptions = interaction.target.options.resize;\n\n /*\n * When using the `resizable.square` or `resizable.preserveAspectRatio` options, resizing from one edge\n * will affect another. E.g. with `resizable.square`, resizing to make the right edge larger will make\n * the bottom edge larger by the same amount. We call these 'linked' edges. Any linked edges will depend\n * on the active edges and the edge being interacted with.\n */\n if (resizeOptions.square || resizeOptions.preserveAspectRatio) {\n const linkedEdges = utils.extend({}, interaction.prepared.edges);\n\n linkedEdges.top = linkedEdges.top || (linkedEdges.left && !linkedEdges.bottom);\n linkedEdges.left = linkedEdges.left || (linkedEdges.top && !linkedEdges.right );\n linkedEdges.bottom = linkedEdges.bottom || (linkedEdges.right && !linkedEdges.top );\n linkedEdges.right = linkedEdges.right || (linkedEdges.bottom && !linkedEdges.left );\n\n interaction.prepared._linkedEdges = linkedEdges;\n }\n else {\n interaction.prepared._linkedEdges = null;\n }\n\n // if using `resizable.preserveAspectRatio` option, record aspect ratio at the start of the resize\n if (resizeOptions.preserveAspectRatio) {\n interaction.resizeStartAspectRatio = startRect.width / startRect.height;\n }\n\n interaction.resizeRects = {\n start : startRect,\n current : utils.extend({}, startRect),\n inverted : utils.extend({}, startRect),\n previous : utils.extend({}, startRect),\n delta : {\n left: 0, right : 0, width : 0,\n top : 0, bottom: 0, height: 0,\n },\n };\n\n iEvent.rect = interaction.resizeRects.inverted;\n iEvent.deltaRect = interaction.resizeRects.delta;\n});\n\n// resizemove\nInteractEvent.signals.on('new', function ({ iEvent, phase, interaction }) {\n if (phase !== 'move' || !interaction.prepared.edges) { return; }\n\n const resizeOptions = interaction.target.options.resize;\n const invert = resizeOptions.invert;\n const invertible = invert === 'reposition' || invert === 'negate';\n\n let edges = interaction.prepared.edges;\n\n const start = interaction.resizeRects.start;\n const current = interaction.resizeRects.current;\n const inverted = interaction.resizeRects.inverted;\n const delta = interaction.resizeRects.delta;\n const previous = utils.extend(interaction.resizeRects.previous, inverted);\n const originalEdges = edges;\n\n let dx = iEvent.dx;\n let dy = iEvent.dy;\n\n if (resizeOptions.preserveAspectRatio || resizeOptions.square) {\n // `resize.preserveAspectRatio` takes precedence over `resize.square`\n const startAspectRatio = resizeOptions.preserveAspectRatio\n ? interaction.resizeStartAspectRatio\n : 1;\n\n edges = interaction.prepared._linkedEdges;\n\n if ((originalEdges.left && originalEdges.bottom)\n || (originalEdges.right && originalEdges.top)) {\n dy = -dx / startAspectRatio;\n }\n else if (originalEdges.left || originalEdges.right ) { dy = dx / startAspectRatio; }\n else if (originalEdges.top || originalEdges.bottom) { dx = dy * startAspectRatio; }\n }\n\n // update the 'current' rect without modifications\n if (edges.top ) { current.top += dy; }\n if (edges.bottom) { current.bottom += dy; }\n if (edges.left ) { current.left += dx; }\n if (edges.right ) { current.right += dx; }\n\n if (invertible) {\n // if invertible, copy the current rect\n utils.extend(inverted, current);\n\n if (invert === 'reposition') {\n // swap edge values if necessary to keep width/height positive\n let swap;\n\n if (inverted.top > inverted.bottom) {\n swap = inverted.top;\n\n inverted.top = inverted.bottom;\n inverted.bottom = swap;\n }\n if (inverted.left > inverted.right) {\n swap = inverted.left;\n\n inverted.left = inverted.right;\n inverted.right = swap;\n }\n }\n }\n else {\n // if not invertible, restrict to minimum of 0x0 rect\n inverted.top = Math.min(current.top, start.bottom);\n inverted.bottom = Math.max(current.bottom, start.top);\n inverted.left = Math.min(current.left, start.right);\n inverted.right = Math.max(current.right, start.left);\n }\n\n inverted.width = inverted.right - inverted.left;\n inverted.height = inverted.bottom - inverted.top ;\n\n for (const edge in inverted) {\n delta[edge] = inverted[edge] - previous[edge];\n }\n\n iEvent.edges = interaction.prepared.edges;\n iEvent.rect = inverted;\n iEvent.deltaRect = delta;\n});\n\n/*\\\n * Interactable.resizable\n [ method ]\n *\n * Gets or sets whether resize actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of resize elements\n | var isResizeable = interact('input[type=text]').resizable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on resize events (object makes the Interactable resizable)\n = (object) This Interactable\n | interact(element).resizable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | edges: {\n | top : true, // Use pointer coords to check for resize.\n | left : false, // Disable resizing from left edge.\n | bottom: '.resize-s',// Resize if pointer target matches selector\n | right : handleEl // Resize if pointer target is the given Element\n | },\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height are adjusted at a 1:1 ratio.\n | square: false,\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height maintain the aspect ratio they had when resizing started.\n | preserveAspectRatio: false,\n |\n | // a value of 'none' will limit the resize rect to a minimum of 0x0\n | // 'negate' will allow the rect to have negative width/height\n | // 'reposition' will keep the width/height positive by swapping\n | // the top and bottom edges and/or swapping the left and right edges\n | invert: 'none' || 'negate' || 'reposition'\n |\n | // limit multiple resizes.\n | // See the explanation in the @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n \\*/\nInteractable.prototype.resizable = function (options) {\n if (utils.is.object(options)) {\n this.options.resize.enabled = options.enabled === false? false: true;\n this.setPerAction('resize', options);\n this.setOnEvents('resize', options);\n\n if (/^x$|^y$|^xy$/.test(options.axis)) {\n this.options.resize.axis = options.axis;\n }\n else if (options.axis === null) {\n this.options.resize.axis = defaultOptions.resize.axis;\n }\n\n if (utils.is.bool(options.preserveAspectRatio)) {\n this.options.resize.preserveAspectRatio = options.preserveAspectRatio;\n }\n else if (utils.is.bool(options.square)) {\n this.options.resize.square = options.square;\n }\n\n return this;\n }\n if (utils.is.bool(options)) {\n this.options.resize.enabled = options;\n\n if (!options) {\n this.onresizestart = this.onresizestart = this.onresizeend = null;\n }\n\n return this;\n }\n return this.options.resize;\n};\n\nfunction checkResizeEdge (name, value, page, element, interactableElement, rect, margin) {\n // false, '', undefined, null\n if (!value) { return false; }\n\n // true value, use pointer coords and element rect\n if (value === true) {\n // if dimensions are negative, \"switch\" edges\n const width = utils.is.number(rect.width )? rect.width : rect.right - rect.left;\n const height = utils.is.number(rect.height)? rect.height : rect.bottom - rect.top ;\n\n if (width < 0) {\n if (name === 'left' ) { name = 'right'; }\n else if (name === 'right') { name = 'left' ; }\n }\n if (height < 0) {\n if (name === 'top' ) { name = 'bottom'; }\n else if (name === 'bottom') { name = 'top' ; }\n }\n\n if (name === 'left' ) { return page.x < ((width >= 0? rect.left: rect.right ) + margin); }\n if (name === 'top' ) { return page.y < ((height >= 0? rect.top : rect.bottom) + margin); }\n\n if (name === 'right' ) { return page.x > ((width >= 0? rect.right : rect.left) - margin); }\n if (name === 'bottom') { return page.y > ((height >= 0? rect.bottom: rect.top ) - margin); }\n }\n\n // the remaining checks require an element\n if (!utils.is.element(element)) { return false; }\n\n return utils.is.element(value)\n // the value is an element to use as a resize handle\n ? value === element\n // otherwise check if element matches value as selector\n : utils.matchesUpTo(element, value, interactableElement);\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.resizeAxes = 'xy';\n});\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action }) {\n if (action !== 'resize' || !interaction.resizeAxes) { return; }\n\n const options = interaction.target.options;\n\n if (options.resize.square) {\n if (interaction.resizeAxes === 'y') {\n iEvent.dx = iEvent.dy;\n }\n else {\n iEvent.dy = iEvent.dx;\n }\n iEvent.axes = 'xy';\n }\n else {\n iEvent.axes = interaction.resizeAxes;\n\n if (interaction.resizeAxes === 'x') {\n iEvent.dy = 0;\n }\n else if (interaction.resizeAxes === 'y') {\n iEvent.dx = 0;\n }\n }\n});\n\nactions.resize = resize;\nactions.names.push('resize');\nutils.merge(Interactable.eventTypes, [\n 'resizestart',\n 'resizemove',\n 'resizeinertiastart',\n 'resizeinertiaresume',\n 'resizeend',\n]);\nactions.methodDict.resize = 'resizable';\n\ndefaultOptions.resize = resize.defaults;\n\nmodule.exports = resize;\n","const raf = require('./utils/raf');\nconst getWindow = require('./utils/window').getWindow;\nconst is = require('./utils/is');\nconst domUtils = require('./utils/domUtils');\nconst Interaction = require('./Interaction');\nconst defaultOptions = require('./defaultOptions');\n\nconst autoScroll = {\n defaults: {\n enabled : false,\n container: null, // the item that is scrolled (Window or HTMLElement)\n margin : 60,\n speed : 300, // the scroll speed in pixels per second\n },\n\n interaction: null,\n i: null, // the handle returned by window.setInterval\n x: 0, y: 0, // Direction each pulse is to scroll in\n\n isScrolling: false,\n prevTime: 0,\n\n start: function (interaction) {\n autoScroll.isScrolling = true;\n raf.cancel(autoScroll.i);\n\n autoScroll.interaction = interaction;\n autoScroll.prevTime = new Date().getTime();\n autoScroll.i = raf.request(autoScroll.scroll);\n },\n\n stop: function () {\n autoScroll.isScrolling = false;\n raf.cancel(autoScroll.i);\n },\n\n // scroll the window by the values in scroll.x/y\n scroll: function () {\n const options = autoScroll.interaction.target.options[autoScroll.interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(autoScroll.interaction.element);\n const now = new Date().getTime();\n // change in time in seconds\n const dt = (now - autoScroll.prevTime) / 1000;\n // displacement\n const s = options.speed * dt;\n\n if (s >= 1) {\n if (is.window(container)) {\n container.scrollBy(autoScroll.x * s, autoScroll.y * s);\n }\n else if (container) {\n container.scrollLeft += autoScroll.x * s;\n container.scrollTop += autoScroll.y * s;\n }\n\n autoScroll.prevTime = now;\n }\n\n if (autoScroll.isScrolling) {\n raf.cancel(autoScroll.i);\n autoScroll.i = raf.request(autoScroll.scroll);\n }\n },\n check: function (interactable, actionName) {\n const options = interactable.options;\n\n return options[actionName].autoScroll && options[actionName].autoScroll.enabled;\n },\n onInteractionMove: function ({ interaction, pointer }) {\n if (!(interaction.interacting()\n && autoScroll.check(interaction.target, interaction.prepared.name))) {\n return;\n }\n\n if (interaction.simulation) {\n autoScroll.x = autoScroll.y = 0;\n return;\n }\n\n let top;\n let right;\n let bottom;\n let left;\n\n const options = interaction.target.options[interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(interaction.element);\n\n if (is.window(container)) {\n left = pointer.clientX < autoScroll.margin;\n top = pointer.clientY < autoScroll.margin;\n right = pointer.clientX > container.innerWidth - autoScroll.margin;\n bottom = pointer.clientY > container.innerHeight - autoScroll.margin;\n }\n else {\n const rect = domUtils.getElementClientRect(container);\n\n left = pointer.clientX < rect.left + autoScroll.margin;\n top = pointer.clientY < rect.top + autoScroll.margin;\n right = pointer.clientX > rect.right - autoScroll.margin;\n bottom = pointer.clientY > rect.bottom - autoScroll.margin;\n }\n\n autoScroll.x = (right ? 1: left? -1: 0);\n autoScroll.y = (bottom? 1: top? -1: 0);\n\n if (!autoScroll.isScrolling) {\n // set the autoScroll properties to those of the target\n autoScroll.margin = options.margin;\n autoScroll.speed = options.speed;\n\n autoScroll.start(interaction);\n }\n },\n};\n\nInteraction.signals.on('stop-active', function () {\n autoScroll.stop();\n});\n\nInteraction.signals.on('action-move', autoScroll.onInteractionMove);\n\ndefaultOptions.perAction.autoScroll = autoScroll.defaults;\n\nmodule.exports = autoScroll;\n","const Interactable = require('../Interactable');\nconst actions = require('../actions/base');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.ignoreFrom\n [ method ]\n *\n * If the target of the `mousedown`, `pointerdown` or `touchstart`\n * event or any of it's parents match the given CSS selector or\n * Element, no drag/resize/gesture is started.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to not ignore any elements\n = (string | Element | object) The current ignoreFrom value or this Interactable\n **\n | interact(element, { ignoreFrom: document.getElementById('no-action') });\n | // or\n | interact(element).ignoreFrom('input, textarea, a');\n\\*/\nInteractable.prototype.ignoreFrom = function (newValue) {\n return this._backCompatOption('ignoreFrom', newValue);\n};\n\n/*\\\n * Interactable.allowFrom\n [ method ]\n *\n * A drag/resize/gesture is started only If the target of the\n * `mousedown`, `pointerdown` or `touchstart` event or any of it's\n * parents match the given CSS selector or Element.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to allow from any element\n = (string | Element | object) The current allowFrom value or this Interactable\n **\n | interact(element, { allowFrom: document.getElementById('drag-handle') });\n | // or\n | interact(element).allowFrom('.handle');\n\\*/\nInteractable.prototype.allowFrom = function (newValue) {\n return this._backCompatOption('allowFrom', newValue);\n};\n\nInteractable.prototype.testIgnore = function (ignoreFrom, interactableElement, element) {\n if (!ignoreFrom || !is.element(element)) { return false; }\n\n if (is.string(ignoreFrom)) {\n return domUtils.matchesUpTo(element, ignoreFrom, interactableElement);\n }\n else if (is.element(ignoreFrom)) {\n return domUtils.nodeContains(ignoreFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testAllow = function (allowFrom, interactableElement, element) {\n if (!allowFrom) { return true; }\n\n if (!is.element(element)) { return false; }\n\n if (is.string(allowFrom)) {\n return domUtils.matchesUpTo(element, allowFrom, interactableElement);\n }\n else if (is.element(allowFrom)) {\n return domUtils.nodeContains(allowFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testIgnoreAllow = function (options, interactableElement, eventTarget) {\n return (!this.testIgnore(options.ignoreFrom, interactableElement, eventTarget)\n && this.testAllow(options.allowFrom, interactableElement, eventTarget));\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (event.buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\n","const interact = require('../interact');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst actions = require('../actions/base');\nconst defaultOptions = require('../defaultOptions');\nconst browser = require('../utils/browser');\nconst scope = require('../scope');\nconst utils = require('../utils');\nconst signals = require('../utils/Signals').new();\n\nrequire('./InteractableMethods');\n\nconst autoStart = {\n signals,\n withinInteractionLimit,\n // Allow this many interactions to happen simultaneously\n maxInteractions: Infinity,\n defaults: {\n perAction: {\n manualStart: false,\n max: Infinity,\n maxPerElement: 1,\n allowFrom: null,\n ignoreFrom: null,\n },\n },\n setActionDefaults: function (action) {\n utils.extend(action.defaults, autoStart.defaults.perAction);\n },\n};\n\n// set cursor style on mousedown\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget }) {\n if (interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\n// set cursor style on mousemove\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget }) {\n if (!interaction.mouse\n || interaction.pointerIsDown\n || interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\nInteraction.signals.on('move', function (arg) {\n const { interaction, event } = arg;\n\n if (!interaction.pointerIsDown\n || interaction.interacting()\n || !interaction.pointerWasMoved\n || !interaction.prepared.name) {\n return;\n }\n\n signals.fire('before-start', arg);\n\n const target = interaction.target;\n\n if (interaction.prepared.name && target) {\n // check manualStart and interaction limit\n if (target.options[interaction.prepared.name].manualStart\n || !withinInteractionLimit(target, interaction.element, interaction.prepared)) {\n interaction.stop(event);\n }\n else {\n interaction.start(interaction.prepared, target, interaction.element);\n }\n }\n});\n\n// Check if the current target supports the action.\n// If so, return the validated action. Otherwise, return null\nfunction validateAction (action, interactable, element, eventTarget) {\n if (utils.is.object(action)\n && interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget)\n && interactable.options[action.name].enabled\n && withinInteractionLimit(interactable, element, action)) {\n return action;\n }\n\n return null;\n}\n\nfunction validateSelector (interaction, pointer, event, matches, matchElements, eventTarget) {\n for (let i = 0, len = matches.length; i < len; i++) {\n const match = matches[i];\n const matchElement = matchElements[i];\n const action = validateAction(match.getAction(pointer, event, interaction, matchElement),\n match,\n matchElement,\n eventTarget);\n\n if (action) {\n return {\n action,\n target: match,\n element: matchElement,\n };\n }\n }\n\n return {};\n}\n\nfunction getActionInfo (interaction, pointer, event, eventTarget) {\n let matches = [];\n let matchElements = [];\n\n let element = eventTarget;\n let action = null;\n\n function pushMatches (interactable, selector, context) {\n const elements = (browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined);\n\n if (utils.matchesSelector(element, selector, elements)) {\n\n matches.push(interactable);\n matchElements.push(element);\n }\n }\n\n while (utils.is.element(element)) {\n matches = [];\n matchElements = [];\n\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && (action = validateAction(elementInteractable.getAction(pointer, event, interaction, element, eventTarget),\n elementInteractable,\n element,\n eventTarget))\n && !elementInteractable.options[action.name].manualStart) {\n return {\n element,\n action,\n target: elementInteractable,\n };\n }\n else {\n scope.interactables.forEachSelector(pushMatches, element);\n\n const actionInfo = validateSelector(interaction, pointer, event, matches, matchElements, eventTarget);\n\n if (actionInfo.action\n && !actionInfo.target.options[actionInfo.action.name].manualStart) {\n return actionInfo;\n }\n }\n\n element = utils.parentNode(element);\n }\n\n return {};\n}\n\nfunction prepare (interaction, { action, target, element }) {\n action = action || {};\n\n if (interaction.target && interaction.target.options.styleCursor) {\n interaction.target._doc.documentElement.style.cursor = '';\n }\n\n interaction.target = target;\n interaction.element = element;\n utils.copyAction(interaction.prepared, action);\n\n if (target && target.options.styleCursor) {\n const cursor = action? actions[action.name].getCursor(action) : '';\n interaction.target._doc.documentElement.style.cursor = cursor;\n }\n\n signals.fire('prepared', { interaction: interaction });\n}\n\nInteraction.signals.on('stop', function ({ interaction }) {\n const target = interaction.target;\n\n if (target && target.options.styleCursor) {\n target._doc.documentElement.style.cursor = '';\n }\n});\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (utils.is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (utils.is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n const buttons = event.buttons || ({\n 0: 1,\n 1: 4,\n 3: 8,\n 4: 16,\n })[event.button];\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\nfunction withinInteractionLimit (interactable, element, action) {\n const options = interactable.options;\n const maxActions = options[action.name].max;\n const maxPerElement = options[action.name].maxPerElement;\n let activeInteractions = 0;\n let targetCount = 0;\n let targetElementCount = 0;\n\n // no actions if any of these values == 0\n if (!(maxActions && maxPerElement && autoStart.maxInteractions)) { return; }\n\n for (let i = 0, len = scope.interactions.length; i < len; i++) {\n const interaction = scope.interactions[i];\n const otherAction = interaction.prepared.name;\n\n if (!interaction.interacting()) { continue; }\n\n activeInteractions++;\n\n if (activeInteractions >= autoStart.maxInteractions) {\n return false;\n }\n\n if (interaction.target !== interactable) { continue; }\n\n targetCount += (otherAction === action.name)|0;\n\n if (targetCount >= maxActions) {\n return false;\n }\n\n if (interaction.element === element) {\n targetElementCount++;\n\n if (otherAction !== action.name || targetElementCount >= maxPerElement) {\n return false;\n }\n }\n }\n\n return autoStart.maxInteractions > 0;\n}\n\n/*\\\n * interact.maxInteractions\n [ method ]\n **\n * Returns or sets the maximum number of concurrent interactions allowed.\n * By default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables\n * and elements, you need to enable it in the draggable, resizable and\n * gesturable `'max'` and `'maxPerElement'` options.\n **\n - newValue (number) #optional Any number. newValue <= 0 means no interactions.\n\\*/\ninteract.maxInteractions = function (newValue) {\n if (utils.is.number(newValue)) {\n autoStart.maxInteractions = newValue;\n\n return this;\n }\n\n return autoStart.maxInteractions;\n};\n\nInteractable.settingsMethods.push('styleCursor');\nInteractable.settingsMethods.push('actionChecker');\nInteractable.settingsMethods.push('ignoreFrom');\nInteractable.settingsMethods.push('allowFrom');\n\ndefaultOptions.base.actionChecker = null;\ndefaultOptions.base.styleCursor = true;\n\nutils.extend(defaultOptions.perAction, autoStart.defaults.perAction);\n\nmodule.exports = autoStart;\n","const autoStart = require('./base');\nconst Interaction = require('../Interaction');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.delayTimer = null;\n});\n\nautoStart.signals.on('prepared', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.delayTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.target, interaction.element);\n }, delay);\n }\n});\n\nInteraction.signals.on('move', function ({ interaction, duplicate }) {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.delayTimer);\n }\n});\n\n// prevent regular down->move autoStart\nautoStart.signals.on('before-start', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.prepared.name = null;\n }\n});\n","const autoStart = require('./base');\nconst scope = require('../scope');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\n\nconst { matchesSelector, parentNode } = require('../utils/domUtils');\n\nautoStart.setActionDefaults(require('../actions/drag'));\n\nautoStart.signals.on('before-start', function ({ interaction, eventTarget, dx, dy }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // check if a drag is in the correct axis\n const absX = Math.abs(dx);\n const absY = Math.abs(dy);\n const options = interaction.target.options.drag;\n const startAxis = options.startAxis;\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy');\n\n interaction.prepared.axis = options.lockAxis === 'start'\n ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n : options.lockAxis;\n\n // if the movement isn't in the startAxis of the interactable\n if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) {\n // cancel the prepared action\n interaction.prepared.name = null;\n\n // then try to get a drag from another ineractable\n\n if (!interaction.prepared.name) {\n\n let element = eventTarget;\n\n const getDraggable = function (interactable, selector, context) {\n const elements = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n if (interactable === interaction.target) { return; }\n\n if (!options.manualStart\n && !interactable.testIgnoreAllow(options, element, eventTarget)\n && matchesSelector(element, selector, elements)) {\n\n const action = interactable.getAction(interaction.downPointer,\n interaction.downEvent,\n interaction,\n element);\n\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, interactable)\n && autoStart.validateAction(action, interactable, element, eventTarget)) {\n\n return interactable;\n }\n }\n };\n\n let action = null;\n\n // check all interactables\n while (is.element(element)) {\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && elementInteractable !== interaction.target\n && !elementInteractable.options.drag.manualStart) {\n\n action = elementInteractable.getAction(interaction.downPointer, interaction.downEvent, interaction, element);\n }\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, elementInteractable)) {\n\n interaction.prepared.name = 'drag';\n interaction.target = elementInteractable;\n interaction.element = element;\n break;\n }\n\n const selectorInteractable = scope.interactables.forEachSelector(getDraggable, element);\n\n if (selectorInteractable) {\n interaction.prepared.name = 'drag';\n interaction.target = selectorInteractable;\n interaction.element = element;\n break;\n }\n\n element = parentNode(element);\n }\n }\n }\n});\n\nfunction checkStartAxis (startAxis, interactable) {\n if (!interactable) { return false; }\n\n const thisAxis = interactable.options.drag.startAxis;\n\n return (startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis);\n}\n","require('./base').setActionDefaults(require('../actions/gesture'));\n","require('./base').setActionDefaults(require('../actions/resize'));\n","module.exports = {\n base: {\n accept : null,\n preventDefault: 'auto',\n deltaSource : 'page',\n },\n\n perAction: {\n origin: { x: 0, y: 0 },\n\n // only allow left button by default\n // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n mouseButtons: 1,\n\n inertia: {\n enabled : false,\n resistance : 10, // the lambda in exponential decay\n minSpeed : 100, // target speed must be above this for inertia to start\n endSpeed : 10, // the speed at which inertia is slow enough to stop\n allowResume : true, // allow resuming an action in inertia phase\n smoothEndDuration: 300, // animate to snap/restrict endOnly if there's no inertia\n },\n },\n};\n","/* browser entry point */\n\n// Legacy browser support\nrequire('./legacyBrowsers');\n\n// inertia\nrequire('./inertia');\n\n// modifiers\nrequire('./modifiers/snap');\nrequire('./modifiers/restrict');\n\n// pointerEvents\nrequire('./pointerEvents/base');\nrequire('./pointerEvents/holdRepeat');\nrequire('./pointerEvents/interactableTargets');\n\n// delay\nrequire('./autoStart/delay');\n\n// actions\nrequire('./actions/gesture');\nrequire('./actions/resize');\nrequire('./actions/drag');\nrequire('./actions/drop');\n\n// load these modifiers after resize is loaded\nrequire('./modifiers/snapSize');\nrequire('./modifiers/restrictEdges');\nrequire('./modifiers/restrictSize');\n\n// autoStart actions\nrequire('./autoStart/gesture');\nrequire('./autoStart/resize');\nrequire('./autoStart/drag');\n\n// Interactable preventDefault setting\nrequire('./interactablePreventDefault.js');\n\n// autoScroll\nrequire('./autoScroll');\n\n// export interact\nmodule.exports = require('./interact');\n","const InteractEvent = require('./InteractEvent');\nconst Interaction = require('./Interaction');\nconst modifiers = require('./modifiers');\nconst utils = require('./utils');\nconst animationFrame = require('./utils/raf');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.inertiaStatus = {\n active : false,\n smoothEnd : false,\n allowResume: false,\n\n startEvent: null,\n upCoords : {},\n\n xe: 0, ye: 0,\n sx: 0, sy: 0,\n\n t0: 0,\n vx0: 0, vys: 0,\n duration: 0,\n\n lambda_v0: 0,\n one_ve_v0: 0,\n i : null,\n };\n\n interaction.boundInertiaFrame = () => inertiaFrame .apply(interaction);\n interaction.boundSmoothEndFrame = () => smoothEndFrame.apply(interaction);\n});\n\nInteraction.signals.on('down', function ({ interaction, event, pointer, eventTarget }) {\n const status = interaction.inertiaStatus;\n\n // Check if the down event hits the current inertia target\n if (status.active) {\n let element = eventTarget;\n\n // climb up the DOM tree from the event target\n while (utils.is.element(element)) {\n\n // if interaction element is the current inertia target element\n if (element === interaction.element) {\n // stop inertia\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n\n // update pointers to the down event's coordinates\n interaction.updatePointer(pointer);\n utils.setCoords(interaction.curCoords, interaction.pointers);\n\n // fire appropriate signals\n const signalArg = { interaction };\n Interaction.signals.fire('before-action-move', signalArg);\n Interaction.signals.fire('action-resume' , signalArg);\n\n // fire a reume event\n const resumeEvent = new InteractEvent(interaction,\n event,\n interaction.prepared.name,\n 'inertiaresume',\n interaction.element);\n\n interaction.target.fire(resumeEvent);\n interaction.prevEvent = resumeEvent;\n modifiers.resetStatuses(interaction.modifierStatuses);\n\n utils.copyCoords(interaction.prevCoords, interaction.curCoords);\n break;\n }\n\n element = utils.parentNode(element);\n }\n }\n});\n\nInteraction.signals.on('up', function ({ interaction, event }) {\n const status = interaction.inertiaStatus;\n\n if (!interaction.interacting() || status.active) { return; }\n\n const target = interaction.target;\n const options = target && target.options;\n const inertiaOptions = options && interaction.prepared.name && options[interaction.prepared.name].inertia;\n\n const now = new Date().getTime();\n const statuses = {};\n const page = utils.extend({}, interaction.curCoords.page);\n const pointerSpeed = interaction.pointerDelta.client.speed;\n\n let smoothEnd = false;\n let modifierResult;\n\n // check if inertia should be started\n const inertiaPossible = (inertiaOptions && inertiaOptions.enabled\n && interaction.prepared.name !== 'gesture'\n && event !== status.startEvent);\n\n const inertia = (inertiaPossible\n && (now - interaction.curCoords.timeStamp) < 50\n && pointerSpeed > inertiaOptions.minSpeed\n && pointerSpeed > inertiaOptions.endSpeed);\n\n const modifierArg = {\n interaction,\n pageCoords: page,\n statuses,\n preEnd: true,\n requireEndOnly: true,\n };\n\n // smoothEnd\n if (inertiaPossible && !inertia) {\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n if (modifierResult.shouldMove && modifierResult.locked) {\n smoothEnd = true;\n }\n }\n\n if (!(inertia || smoothEnd)) { return; }\n\n utils.copyCoords(status.upCoords, interaction.curCoords);\n\n interaction.pointers[0] = status.startEvent =\n new InteractEvent(interaction, event, interaction.prepared.name, 'inertiastart', interaction.element);\n\n status.t0 = now;\n\n status.active = true;\n status.allowResume = inertiaOptions.allowResume;\n interaction.simulation = status;\n\n target.fire(status.startEvent);\n\n if (inertia) {\n status.vx0 = interaction.pointerDelta.client.vx;\n status.vy0 = interaction.pointerDelta.client.vy;\n status.v0 = pointerSpeed;\n\n calcInertia(interaction, status);\n\n utils.extend(page, interaction.curCoords.page);\n\n page.x += status.xe;\n page.y += status.ye;\n\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n status.modifiedXe += modifierResult.dx;\n status.modifiedYe += modifierResult.dy;\n\n status.i = animationFrame.request(interaction.boundInertiaFrame);\n }\n else {\n status.smoothEnd = true;\n status.xe = modifierResult.dx;\n status.ye = modifierResult.dy;\n\n status.sx = status.sy = 0;\n\n status.i = animationFrame.request(interaction.boundSmoothEndFrame);\n }\n});\n\nInteraction.signals.on('stop-active', function ({ interaction }) {\n const status = interaction.inertiaStatus;\n\n if (status.active) {\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n }\n});\n\nfunction calcInertia (interaction, status) {\n const inertiaOptions = interaction.target.options[interaction.prepared.name].inertia;\n const lambda = inertiaOptions.resistance;\n const inertiaDur = -Math.log(inertiaOptions.endSpeed / status.v0) / lambda;\n\n status.x0 = interaction.prevEvent.pageX;\n status.y0 = interaction.prevEvent.pageY;\n status.t0 = status.startEvent.timeStamp / 1000;\n status.sx = status.sy = 0;\n\n status.modifiedXe = status.xe = (status.vx0 - inertiaDur) / lambda;\n status.modifiedYe = status.ye = (status.vy0 - inertiaDur) / lambda;\n status.te = inertiaDur;\n\n status.lambda_v0 = lambda / status.v0;\n status.one_ve_v0 = 1 - inertiaOptions.endSpeed / status.v0;\n}\n\nfunction inertiaFrame () {\n updateInertiaCoords(this);\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n\n const status = this.inertiaStatus;\n const options = this.target.options[this.prepared.name].inertia;\n const lambda = options.resistance;\n const t = new Date().getTime() / 1000 - status.t0;\n\n if (t < status.te) {\n\n const progress = 1 - (Math.exp(-lambda * t) - status.lambda_v0) / status.one_ve_v0;\n\n if (status.modifiedXe === status.xe && status.modifiedYe === status.ye) {\n status.sx = status.xe * progress;\n status.sy = status.ye * progress;\n }\n else {\n const quadPoint = utils.getQuadraticCurvePoint(0, 0,\n status.xe,\n status.ye,\n status.modifiedXe,\n status.modifiedYe,\n progress);\n\n status.sx = quadPoint.x;\n status.sy = quadPoint.y;\n }\n\n this.doMove();\n\n status.i = animationFrame.request(this.boundInertiaFrame);\n }\n else {\n status.sx = status.modifiedXe;\n status.sy = status.modifiedYe;\n\n this.doMove();\n this.end(status.startEvent);\n status.active = false;\n this.simulation = null;\n }\n\n utils.copyCoords(this.prevCoords, this.curCoords);\n}\n\nfunction smoothEndFrame () {\n updateInertiaCoords(this);\n\n const status = this.inertiaStatus;\n const t = new Date().getTime() - status.t0;\n const duration = this.target.options[this.prepared.name].inertia.smoothEndDuration;\n\n if (t < duration) {\n status.sx = utils.easeOutQuad(t, 0, status.xe, duration);\n status.sy = utils.easeOutQuad(t, 0, status.ye, duration);\n\n this.pointerMove(status.startEvent, status.startEvent);\n\n status.i = animationFrame.request(this.boundSmoothEndFrame);\n }\n else {\n status.sx = status.xe;\n status.sy = status.ye;\n\n this.pointerMove(status.startEvent, status.startEvent);\n this.end(status.startEvent);\n\n status.smoothEnd =\n status.active = false;\n this.simulation = null;\n }\n}\n\nfunction updateInertiaCoords (interaction) {\n const status = interaction.inertiaStatus;\n\n // return if inertia isn't running\n if (!status.active) { return; }\n\n const pageUp = status.upCoords.page;\n const clientUp = status.upCoords.client;\n\n utils.setCoords(interaction.curCoords, [ {\n pageX : pageUp.x + status.sx,\n pageY : pageUp.y + status.sy,\n clientX: clientUp.x + status.sx,\n clientY: clientUp.y + status.sy,\n } ]);\n}\n","const browser = require('./utils/browser');\nconst events = require('./utils/events');\nconst utils = require('./utils');\nconst scope = require('./scope');\nconst Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\n\nconst globalEvents = {};\n\n/*\\\n * interact\n [ method ]\n *\n * The methods of this variable can be used to set elements as\n * interactables and also to change various default settings.\n *\n * Calling it as a function and passing an element or a valid CSS selector\n * string returns an Interactable object which has various methods to\n * configure it.\n *\n - element (Element | string) The HTML or SVG Element to interact with or CSS selector\n = (object) An @Interactable\n *\n > Usage\n | interact('#draggable').draggable(true);\n |\n | var rectables = interact('rect');\n | rectables\n | .gesturable(true)\n | .on('gesturemove', function (event) {\n | // ...\n | });\n\\*/\nfunction interact (element, options) {\n let interactable = scope.interactables.get(element, options);\n\n if (!interactable) {\n interactable = new Interactable(element, options);\n interactable.events.global = globalEvents;\n }\n\n return interactable;\n}\n\n/*\\\n * interact.isSet\n [ method ]\n *\n * Check if an element has been set\n - element (Element) The Element being searched for\n = (boolean) Indicates if the element or CSS selector was previously passed to interact\n\\*/\ninteract.isSet = function (element, options) {\n return scope.interactables.indexOfElement(element, options && options.context) !== -1;\n};\n\n/*\\\n * interact.on\n [ method ]\n *\n * Adds a global listener for an InteractEvent or adds a DOM event to\n * `document`\n *\n - type (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) interact\n\\*/\ninteract.on = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.on(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.on(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n // if it is an InteractEvent type, add listener to globalEvents\n if (utils.contains(Interactable.eventTypes, type)) {\n // if this type of event was never bound\n if (!globalEvents[type]) {\n globalEvents[type] = [listener];\n }\n else {\n globalEvents[type].push(listener);\n }\n }\n // If non InteractEvent type, addEventListener to document\n else {\n events.add(scope.document, type, listener, { options });\n }\n\n return interact;\n};\n\n/*\\\n * interact.off\n [ method ]\n *\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n - type (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) interact\n \\*/\ninteract.off = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.off(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.off(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n if (!utils.contains(Interactable.eventTypes, type)) {\n events.remove(scope.document, type, listener, options);\n }\n else {\n let index;\n\n if (type in globalEvents\n && (index = utils.indexOf(globalEvents[type], listener)) !== -1) {\n globalEvents[type].splice(index, 1);\n }\n }\n\n return interact;\n};\n\n/*\\\n * interact.debug\n [ method ]\n *\n * Returns an object which exposes internal data\n = (object) An object with properties that outline the current state and expose internal functions and variables\n\\*/\ninteract.debug = function () {\n return scope;\n};\n\n// expose the functions used to calculate multi-touch properties\ninteract.getPointerAverage = utils.pointerAverage;\ninteract.getTouchBBox = utils.touchBBox;\ninteract.getTouchDistance = utils.touchDistance;\ninteract.getTouchAngle = utils.touchAngle;\n\ninteract.getElementRect = utils.getElementRect;\ninteract.getElementClientRect = utils.getElementClientRect;\ninteract.matchesSelector = utils.matchesSelector;\ninteract.closest = utils.closest;\n\n/*\\\n * interact.supportsTouch\n [ method ]\n *\n = (boolean) Whether or not the browser supports touch input\n\\*/\ninteract.supportsTouch = function () {\n return browser.supportsTouch;\n};\n\n/*\\\n * interact.supportsPointerEvent\n [ method ]\n *\n = (boolean) Whether or not the browser supports PointerEvents\n\\*/\ninteract.supportsPointerEvent = function () {\n return browser.supportsPointerEvent;\n};\n\n/*\\\n * interact.stop\n [ method ]\n *\n * Cancels all interactions (end events are not fired)\n *\n - event (Event) An event on which to call preventDefault()\n = (object) interact\n\\*/\ninteract.stop = function (event) {\n for (let i = scope.interactions.length - 1; i >= 0; i--) {\n scope.interactions[i].stop(event);\n }\n\n return interact;\n};\n\n/*\\\n * interact.pointerMoveTolerance\n [ method ]\n * Returns or sets the distance the pointer must be moved before an action\n * sequence occurs. This also affects tolerance for tap events.\n *\n - newValue (number) #optional The movement from the start position must be greater than this value\n = (number | Interactable) The current setting or interact\n\\*/\ninteract.pointerMoveTolerance = function (newValue) {\n if (utils.is.number(newValue)) {\n Interaction.pointerMoveTolerance = newValue;\n\n return this;\n }\n\n return Interaction.pointerMoveTolerance;\n};\n\ninteract.addDocument = scope.addDocument;\ninteract.removeDocument = scope.removeDocument;\n\nscope.interact = interact;\n\nmodule.exports = interact;\n","const Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\nconst scope = require('./scope');\nconst is = require('./utils/is');\nconst events = require('./utils/events');\n\nconst { nodeContains, matchesSelector } = require('./utils/domUtils');\n\n/*\\\n * Interactable.preventDefault\n [ method ]\n *\n * Returns or sets whether to prevent the browser's default behaviour\n * in response to pointer events. Can be set to:\n * - `'always'` to always prevent\n * - `'never'` to never prevent\n * - `'auto'` to let interact.js try to determine what would be best\n *\n - newValue (string) #optional `true`, `false` or `'auto'`\n = (string | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.preventDefault = function (newValue) {\n if (/^(always|never|auto)$/.test(newValue)) {\n this.options.preventDefault = newValue;\n return this;\n }\n\n if (is.bool(newValue)) {\n this.options.preventDefault = newValue? 'always' : 'never';\n return this;\n }\n\n return this.options.preventDefault;\n};\n\nInteractable.prototype.checkAndPreventDefault = function (event) {\n const setting = this.options.preventDefault;\n\n if (setting === 'never') { return; }\n\n if (setting === 'always') {\n event.preventDefault();\n return;\n }\n\n // setting === 'auto'\n\n // don't preventDefault if the browser supports passiveEvents\n // CSS touch-action and user-selecct should be used instead\n if (events.supportsOptions) {\n return;\n }\n\n // don't preventDefault of pointerdown events\n if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) {\n return;\n }\n\n // don't preventDefault on editable elements\n if (is.element(event.target)\n && matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) {\n return;\n }\n\n event.preventDefault();\n};\n\nfunction onInteractionEvent ({ interaction, event }) {\n if (interaction.target) {\n interaction.target.checkAndPreventDefault(event);\n }\n}\n\nfor (const eventSignal of ['down', 'move', 'up', 'cancel']) {\n Interaction.signals.on(eventSignal, onInteractionEvent);\n}\n\n// prevent native HTML5 drag on interact.js target elements\nInteraction.docEvents.dragstart = function preventNativeDrag (event) {\n for (const interaction of scope.interactions) {\n\n if (interaction.element\n && (interaction.element === event.target\n || nodeContains(interaction.element, event.target))) {\n\n interaction.target.checkAndPreventDefault(event);\n return;\n }\n }\n};\n","const scope = require('./scope');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst iFinder = require('./utils/interactionFinder');\nconst pointerEvents = require('./pointerEvents/base');\n\nconst { window } = require('./utils/window');\n\nconst toString = Object.prototype.toString;\n\nif (!window.Array.isArray) {\n window.Array.isArray = function (obj) {\n return toString.call(obj) === '[object Array]';\n };\n}\n\nif (!String.prototype.trim) {\n String.prototype.trim = function () {\n return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n };\n}\n\n// http://www.quirksmode.org/dom/events/click.html\n// >Events leading to dblclick\n//\n// IE8 doesn't fire down event before dblclick.\n// This workaround tries to fire a tap and doubletap after dblclick\nfunction onIE8Dblclick (event) {\n const eventTarget = event.target;\n const interaction = iFinder.search(event, event.type, eventTarget);\n\n if (!interaction) { return; }\n\n if (interaction.prevTap\n && event.clientX === interaction.prevTap.clientX\n && event.clientY === interaction.prevTap.clientY\n && eventTarget === interaction.prevTap.target) {\n\n interaction.downTargets[0] = eventTarget;\n interaction.downTimes [0] = new Date().getTime();\n\n pointerEvents.fire({\n interaction,\n event,\n eventTarget,\n pointer: event,\n type: 'tap',\n });\n }\n}\n\nif (browser.isIE8) {\n const selectFix = function (event) {\n for (const interaction of scope.interactions) {\n if (interaction.interacting()) {\n interaction.target.checkAndPreventDefault(event);\n }\n }\n };\n\n const onDocIE8 = function onDocIE8 ({ doc, win }, signalName) {\n const eventMethod = signalName.indexOf('listen') === 0\n ? events.add : events.remove;\n\n // For IE's lack of Event#preventDefault\n eventMethod(doc, 'selectstart', selectFix);\n\n if (pointerEvents) {\n eventMethod(doc, 'dblclick', onIE8Dblclick);\n }\n };\n\n scope.signals.on('add-document' , onDocIE8);\n scope.signals.on('remove-document', onDocIE8);\n}\n\nmodule.exports = null;\n","const InteractEvent = require('../InteractEvent');\nconst Interaction = require('../Interaction');\nconst extend = require('../utils/extend');\n\nconst modifiers = {\n names: [],\n\n setOffsets: function (arg) {\n const { interaction, pageCoords: page } = arg;\n const { target, element, startOffset } = interaction;\n const rect = target.getRect(element);\n\n if (rect) {\n startOffset.left = page.x - rect.left;\n startOffset.top = page.y - rect.top;\n\n startOffset.right = rect.right - page.x;\n startOffset.bottom = rect.bottom - page.y;\n\n if (!('width' in rect)) { rect.width = rect.right - rect.left; }\n if (!('height' in rect)) { rect.height = rect.bottom - rect.top ; }\n }\n else {\n startOffset.left = startOffset.top = startOffset.right = startOffset.bottom = 0;\n }\n\n arg.rect = rect;\n arg.interactable = target;\n arg.element = element;\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n\n arg.options = target.options[interaction.prepared.name][modifierName];\n\n if (!arg.options) {\n continue;\n }\n\n interaction.modifierOffsets[modifierName] = modifiers[modifierName].setOffset(arg);\n }\n },\n\n setAll: function (arg) {\n const { interaction, statuses, preEnd, requireEndOnly } = arg;\n const coords = extend({}, arg.pageCoords);\n const result = {\n dx: 0,\n dy: 0,\n changed: false,\n locked: false,\n shouldMove: true,\n };\n\n for (const modifierName of modifiers.names) {\n const modifier = modifiers[modifierName];\n const options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!shouldDo(options, preEnd, requireEndOnly)) { continue; }\n\n arg.status = arg.status = statuses[modifierName];\n arg.options = options;\n arg.offset = arg.interaction.modifierOffsets[modifierName];\n\n modifier.set(arg);\n\n if (arg.status.locked) {\n coords.x += arg.status.dx;\n coords.y += arg.status.dy;\n\n result.dx += arg.status.dx;\n result.dy += arg.status.dy;\n\n result.locked = true;\n }\n }\n\n // a move should be fired if:\n // - there are no modifiers enabled,\n // - no modifiers are \"locked\" i.e. have changed the pointer's coordinates, or\n // - the locked coords have changed since the last pointer move\n result.shouldMove = !arg.status || !result.locked || arg.status.changed;\n\n return result;\n },\n\n resetStatuses: function (statuses) {\n for (const modifierName of modifiers.names) {\n const status = statuses[modifierName] || {};\n\n status.dx = status.dy = 0;\n status.modifiedX = status.modifiedY = NaN;\n status.locked = false;\n status.changed = true;\n\n statuses[modifierName] = status;\n }\n\n return statuses;\n },\n\n start: function ({ interaction }, signalName) {\n const arg = {\n interaction,\n pageCoords: (signalName === 'action-resume' ?\n interaction.curCoords : interaction.startCoords).page,\n startOffset: interaction.startOffset,\n statuses: interaction.modifierStatuses,\n preEnd: false,\n requireEndOnly: false,\n };\n\n modifiers.setOffsets(arg);\n modifiers.resetStatuses(arg.statuses);\n\n arg.pageCoords = extend({}, interaction.startCoords.page);\n interaction.modifierResult = modifiers.setAll(arg);\n },\n};\n\nInteraction.signals.on('new', function (interaction) {\n interaction.startOffset = { left: 0, right: 0, top: 0, bottom: 0 };\n interaction.modifierOffsets = {};\n interaction.modifierStatuses = modifiers.resetStatuses({});\n interaction.modifierResult = null;\n});\n\nInteraction.signals.on('action-start' , modifiers.start);\nInteraction.signals.on('action-resume', modifiers.start);\n\nInteraction.signals.on('before-action-move', function ({ interaction, preEnd, interactingBeforeMove }) {\n const modifierResult = modifiers.setAll({\n interaction,\n preEnd,\n pageCoords: interaction.curCoords.page,\n statuses: interaction.modifierStatuses,\n requireEndOnly: false,\n });\n\n // don't fire an action move if a modifier would keep the event in the same\n // cordinates as before\n if (!modifierResult.shouldMove && interactingBeforeMove) {\n interaction._dontFireMove = true;\n }\n\n interaction.modifierResult = modifierResult;\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n for (let i = 0; i < modifiers.names.length; i++) {\n const options = interaction.target.options[interaction.prepared.name][modifiers.names[i]];\n\n // if the endOnly option is true for any modifier\n if (shouldDo(options, true, true)) {\n // fire a move event at the modified coordinates\n interaction.doMove({ event, preEnd: true });\n break;\n }\n }\n});\n\nInteractEvent.signals.on('set-xy', function (arg) {\n const { iEvent, interaction } = arg;\n const modifierArg = extend({}, arg);\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n modifierArg.options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!modifierArg.options) {\n continue;\n }\n\n const modifier = modifiers[modifierName];\n\n modifierArg.status = interaction.modifierStatuses[modifierName];\n\n iEvent[modifierName] = modifier.modifyCoords(modifierArg);\n }\n});\n\nfunction shouldDo (options, preEnd, requireEndOnly) {\n return (options && options.enabled\n && (preEnd || !options.endOnly)\n && (!requireEndOnly || options.endOnly));\n}\n\nmodule.exports = modifiers;\n","const modifiers = require('./index');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst restrict = {\n defaults: {\n enabled : false,\n endOnly : false,\n restriction: null,\n elementRect: null,\n },\n\n setOffset: function ({ rect, startOffset, options }) {\n const elementRect = options && options.elementRect;\n const offset = {};\n\n if (rect && elementRect) {\n offset.left = startOffset.left - (rect.width * elementRect.left);\n offset.top = startOffset.top - (rect.height * elementRect.top);\n\n offset.right = startOffset.right - (rect.width * (1 - elementRect.right));\n offset.bottom = startOffset.bottom - (rect.height * (1 - elementRect.bottom));\n }\n else {\n offset.left = offset.top = offset.right = offset.bottom = 0;\n }\n\n return offset;\n },\n\n set: function ({ pageCoords, interaction, status, options }) {\n if (!options) { return status; }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n\n const restriction = getRestrictionRect(options.restriction, interaction, page);\n\n if (!restriction) { return status; }\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n const rect = restriction;\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n const offset = interaction.modifierOffsets.restrict;\n\n // object is assumed to have\n // x, y, width, height or\n // left, top, right, bottom\n if ('x' in restriction && 'y' in restriction) {\n modifiedX = Math.max(Math.min(rect.x + rect.width - offset.right , page.x), rect.x + offset.left);\n modifiedY = Math.max(Math.min(rect.y + rect.height - offset.bottom, page.y), rect.y + offset.top );\n }\n else {\n modifiedX = Math.max(Math.min(rect.right - offset.right , page.x), rect.left + offset.left);\n modifiedY = Math.max(Math.min(rect.bottom - offset.bottom, page.y), rect.top + offset.top );\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const elementRect = options && options.elementRect;\n\n if (options && options.enabled\n && !(phase === 'start' && elementRect && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n getRestrictionRect,\n};\n\nfunction getRestrictionRect (value, interaction, page) {\n if (utils.is.function(value)) {\n return utils.resolveRectLike(value, interaction.target, interaction.element, [page.x, page.y, interaction]);\n } else {\n return utils.resolveRectLike(value, interaction.target, interaction.element);\n }\n}\n\nmodifiers.restrict = restrict;\nmodifiers.names.push('restrict');\n\ndefaultOptions.perAction.restrict = restrict.defaults;\n\nmodule.exports = restrict;\n","// This module adds the options.resize.restrictEdges setting which sets min and\n// max for the top, left, bottom and right edges of the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictEdges: {\n// inner: { top: 200, left: 200, right: 400, bottom: 400 },\n// outer: { top: 0, left: 0, right: 600, bottom: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst { getRestrictionRect } = require('./restrict');\n\nconst noInner = { top: +Infinity, left: +Infinity, bottom: -Infinity, right: -Infinity };\nconst noOuter = { top: -Infinity, left: -Infinity, bottom: +Infinity, right: +Infinity };\n\nconst restrictEdges = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n offset: null,\n },\n\n setOffset: function ({ interaction, startOffset, options }) {\n if (!options) {\n return utils.extend({}, startOffset);\n }\n\n const offset = getRestrictionRect(options.offset, interaction, interaction.startCoords.page);\n\n if (offset) {\n return {\n top: startOffset.top + offset.y,\n left: startOffset.left + offset.x,\n bottom: startOffset.bottom + offset.y,\n right: startOffset.right + offset.x,\n };\n }\n\n return startOffset;\n },\n\n set: function ({ pageCoords, interaction, status, offset, options }) {\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n const inner = rectUtils.xywhToTlbr(getRestrictionRect(options.inner, interaction, page)) || noInner;\n const outer = rectUtils.xywhToTlbr(getRestrictionRect(options.outer, interaction, page)) || noOuter;\n\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n if (edges.top) {\n modifiedY = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top);\n }\n else if (edges.bottom) {\n modifiedY = Math.max(Math.min(outer.bottom - offset.bottom, page.y), inner.bottom - offset.bottom);\n }\n if (edges.left) {\n modifiedX = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left);\n }\n else if (edges.right) {\n modifiedX = Math.max(Math.min(outer.right - offset.right, page.x), inner.right - offset.right);\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n if (options && options.enabled\n && !(phase === 'start' && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n noInner,\n noOuter,\n getRestrictionRect,\n};\n\nmodifiers.restrictEdges = restrictEdges;\nmodifiers.names.push('restrictEdges');\n\ndefaultOptions.perAction.restrictEdges = restrictEdges.defaults;\nresize.defaults.restrictEdges = restrictEdges.defaults;\n\nmodule.exports = restrictEdges;\n","// This module adds the options.resize.restrictSize setting which sets min and\n// max width and height for the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictSize: {\n// min: { width: -600, height: -600 },\n// max: { width: 600, height: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst restrictEdges = require('./restrictEdges');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst noMin = { width: -Infinity, height: -Infinity };\nconst noMax = { width: +Infinity, height: +Infinity };\n\nconst restrictSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n },\n\n setOffset: function ({ interaction }) {\n return interaction.startOffset;\n },\n\n set: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const rect = rectUtils.xywhToTlbr(interaction.resizeRects.inverted);\n\n const minSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.min, interaction)) || noMin;\n const maxSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.max, interaction)) || noMax;\n\n arg.options = {\n enabled: options.enabled,\n endOnly: options.endOnly,\n inner: utils.extend({}, restrictEdges.noInner),\n outer: utils.extend({}, restrictEdges.noOuter),\n };\n\n if (edges.top) {\n arg.options.inner.top = rect.bottom - minSize.height;\n arg.options.outer.top = rect.bottom - maxSize.height;\n }\n else if (edges.bottom) {\n arg.options.inner.bottom = rect.top + minSize.height;\n arg.options.outer.bottom = rect.top + maxSize.height;\n }\n if (edges.left) {\n arg.options.inner.left = rect.right - minSize.width;\n arg.options.outer.left = rect.right - maxSize.width;\n }\n else if (edges.right) {\n arg.options.inner.right = rect.left + minSize.width;\n arg.options.outer.right = rect.left + maxSize.width;\n }\n\n restrictEdges.set(arg);\n },\n\n modifyCoords: restrictEdges.modifyCoords,\n};\n\nmodifiers.restrictSize = restrictSize;\nmodifiers.names.push('restrictSize');\n\ndefaultOptions.perAction.restrictSize = restrictSize.defaults;\nresize.defaults.restrictSize = restrictSize.defaults;\n\nmodule.exports = restrictSize;\n","const modifiers = require('./index');\nconst interact = require('../interact');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst snap = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n\n relativePoints: null,\n },\n\n setOffset: function ({ interaction, interactable, element, rect, startOffset, options }) {\n const offsets = [];\n const optionsOrigin = utils.rectToXY(utils.resolveRectLike(options.origin));\n const origin = optionsOrigin || utils.getOriginXY(interactable, element, interaction.prepared.name);\n options = options || interactable.options[interaction.prepared.name].snap || {};\n\n let snapOffset;\n\n if (options.offset === 'startCoords') {\n snapOffset = {\n x: interaction.startCoords.page.x - origin.x,\n y: interaction.startCoords.page.y - origin.y,\n };\n }\n else {\n const offsetRect = utils.resolveRectLike(options.offset, interactable, element, [interaction]);\n\n snapOffset = utils.rectToXY(offsetRect) || { x: 0, y: 0 };\n }\n\n if (rect && options.relativePoints && options.relativePoints.length) {\n for (const { x: relativeX, y: relativeY } of options.relativePoints) {\n offsets.push({\n x: startOffset.left - (rect.width * relativeX) + snapOffset.x,\n y: startOffset.top - (rect.height * relativeY) + snapOffset.y,\n });\n }\n }\n else {\n offsets.push(snapOffset);\n }\n\n return offsets;\n },\n\n set: function ({ interaction, pageCoords, status, options, offset: offsets }) {\n const targets = [];\n let target;\n let page;\n let i;\n\n if (status.useStatusXY) {\n page = { x: status.x, y: status.y };\n }\n else {\n const origin = utils.getOriginXY(interaction.target, interaction.element, interaction.prepared.name);\n\n page = utils.extend({}, pageCoords);\n\n page.x -= origin.x;\n page.y -= origin.y;\n }\n\n status.realX = page.x;\n status.realY = page.y;\n\n let len = options.targets? options.targets.length : 0;\n\n for (const { x: offsetX, y: offsetY } of offsets) {\n const relativeX = page.x - offsetX;\n const relativeY = page.y - offsetY;\n\n for (const snapTarget of options.targets) {\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n targets.push({\n x: utils.is.number(target.x) ? (target.x + offsetX) : relativeX,\n y: utils.is.number(target.y) ? (target.y + offsetY) : relativeY,\n\n range: utils.is.number(target.range)? target.range: options.range,\n });\n }\n }\n\n const closest = {\n target: null,\n inRange: false,\n distance: 0,\n range: 0,\n dx: 0,\n dy: 0,\n };\n\n for (i = 0, len = targets.length; i < len; i++) {\n target = targets[i];\n\n const range = target.range;\n const dx = target.x - page.x;\n const dy = target.y - page.y;\n const distance = utils.hypot(dx, dy);\n let inRange = distance <= range;\n\n // Infinite targets count as being out of range\n // compared to non infinite ones that are in range\n if (range === Infinity && closest.inRange && closest.range !== Infinity) {\n inRange = false;\n }\n\n if (!closest.target || (inRange\n // is the closest target in range?\n ? (closest.inRange && range !== Infinity\n // the pointer is relatively deeper in this target\n ? distance / range < closest.distance / closest.range\n // this target has Infinite range and the closest doesn't\n : (range === Infinity && closest.range !== Infinity)\n // OR this target is closer that the previous closest\n || distance < closest.distance)\n // The other is not in range and the pointer is closer to this target\n : (!closest.inRange && distance < closest.distance))) {\n\n closest.target = target;\n closest.distance = distance;\n closest.range = range;\n closest.inRange = inRange;\n closest.dx = dx;\n closest.dy = dy;\n\n status.range = range;\n }\n }\n\n let snapChanged;\n\n if (closest.target) {\n snapChanged = (status.modifiedX !== closest.target.x || status.modifiedY !== closest.target.y);\n\n status.modifiedX = closest.target.x;\n status.modifiedY = closest.target.y;\n }\n else {\n snapChanged = true;\n\n status.modifiedX = NaN;\n status.modifiedY = NaN;\n }\n\n status.dx = closest.dx;\n status.dy = closest.dy;\n\n status.changed = (snapChanged || (closest.inRange && !status.locked));\n status.locked = closest.inRange;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const relativePoints = options && options.relativePoints;\n\n if (options && options.enabled\n && !(phase === 'start' && relativePoints && relativePoints.length)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n }\n\n return {\n range : status.range,\n locked : status.locked,\n x : status.modifiedX,\n y : status.modifiedY,\n realX : status.realX,\n realY : status.realY,\n dx : status.dx,\n dy : status.dy,\n };\n }\n },\n};\n\ninteract.createSnapGrid = function (grid) {\n return function (x, y) {\n const limits = grid.limits || {\n left : -Infinity,\n right : Infinity,\n top : -Infinity,\n bottom: Infinity,\n };\n let offsetX = 0;\n let offsetY = 0;\n\n if (utils.is.object(grid.offset)) {\n offsetX = grid.offset.x;\n offsetY = grid.offset.y;\n }\n\n const gridx = Math.round((x - offsetX) / grid.x);\n const gridy = Math.round((y - offsetY) / grid.y);\n\n const newX = Math.max(limits.left, Math.min(limits.right , gridx * grid.x + offsetX));\n const newY = Math.max(limits.top , Math.min(limits.bottom, gridy * grid.y + offsetY));\n\n return {\n x: newX,\n y: newY,\n range: grid.range,\n };\n };\n};\n\nmodifiers.snap = snap;\nmodifiers.names.push('snap');\n\ndefaultOptions.perAction.snap = snap.defaults;\n\nmodule.exports = snap;\n","// This module allows snapping of the size of targets during resize\n// interactions.\n\nconst modifiers = require('./index');\nconst snap = require('./snap');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\nconst utils = require('../utils/');\n\nconst snapSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n },\n\n setOffset: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.edges;\n\n if (!edges) { return; }\n\n arg.options = {\n relativePoints: [{\n x: edges.left? 0 : 1,\n y: edges.top ? 0 : 1,\n }],\n origin: { x: 0, y: 0 },\n offset: 'self',\n range: options.range,\n };\n\n const offsets = snap.setOffset(arg);\n arg.options = options;\n\n return offsets;\n },\n\n set: function (arg) {\n const { interaction, options, offset, pageCoords } = arg;\n const page = utils.extend({}, pageCoords);\n const relativeX = page.x - offset[0].x;\n const relativeY = page.y - offset[0].y;\n\n arg.options = utils.extend({}, options);\n arg.options.targets = [];\n\n for (const snapTarget of options.targets) {\n let target;\n\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n if ('width' in target && 'height' in target) {\n target.x = target.width;\n target.y = target.height;\n }\n\n arg.options.targets.push(target);\n }\n\n snap.set(arg);\n },\n\n modifyCoords: function (arg) {\n const { options } = arg;\n\n arg.options = utils.extend({}, options);\n arg.options.enabled = options.enabled;\n arg.options.relativePoints = [null];\n\n snap.modifyCoords(arg);\n },\n};\n\nmodifiers.snapSize = snapSize;\nmodifiers.names.push('snapSize');\n\ndefaultOptions.perAction.snapSize = snapSize.defaults;\nresize.defaults.snapSize = snapSize.defaults;\n\nmodule.exports = snapSize;\n","const pointerUtils = require('../utils/pointerUtils');\n\nmodule.exports = class PointerEvent {\n constructor (type, pointer, event, eventTarget, interaction) {\n pointerUtils.pointerExtend(this, event);\n\n if (event !== pointer) {\n pointerUtils.pointerExtend(this, pointer);\n }\n\n this.interaction = interaction;\n\n this.timeStamp = new Date().getTime();\n this.originalEvent = event;\n this.type = type;\n this.pointerId = pointerUtils.getPointerId(pointer);\n this.pointerType = pointerUtils.getPointerType(pointer);\n this.target = eventTarget;\n this.currentTarget = null;\n\n if (type === 'tap') {\n const pointerIndex = interaction.getPointerIndex(pointer);\n this.dt = this.timeStamp - interaction.downTimes[pointerIndex];\n\n const interval = this.timeStamp - interaction.tapTime;\n\n this.double = !!(interaction.prevTap\n && interaction.prevTap.type !== 'doubletap'\n && interaction.prevTap.target === this.target\n && interval < 500);\n }\n else if (type === 'doubletap') {\n this.dt = pointer.timeStamp - interaction.tapTime;\n }\n }\n\n subtractOrigin ({ x: originX, y: originY }) {\n this.pageX -= originX;\n this.pageY -= originY;\n this.clientX -= originX;\n this.clientY -= originY;\n\n return this;\n }\n\n addOrigin ({ x: originX, y: originY }) {\n this.pageX += originX;\n this.pageY += originY;\n this.clientX += originX;\n this.clientY += originY;\n\n return this;\n }\n\n preventDefault () {\n this.originalEvent.preventDefault();\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n};\n","const PointerEvent = require('./PointerEvent');\nconst Interaction = require('../Interaction');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst defaults = require('../defaultOptions');\nconst signals = require('../utils/Signals').new();\nconst { filter } = require('../utils/arr');\n\nconst simpleSignals = [ 'down', 'up', 'cancel' ];\nconst simpleEvents = [ 'down', 'up', 'cancel' ];\n\nconst pointerEvents = {\n PointerEvent,\n fire,\n collectEventTargets,\n signals,\n defaults: {\n holdDuration: 600,\n ignoreFrom : null,\n allowFrom : null,\n origin : { x: 0, y: 0 },\n },\n types: [\n 'down',\n 'move',\n 'up',\n 'cancel',\n 'tap',\n 'doubletap',\n 'hold',\n ],\n};\n\nfunction fire (arg) {\n const {\n interaction, pointer, event, eventTarget,\n type = arg.pointerEvent.type,\n targets = collectEventTargets(arg),\n pointerEvent = new PointerEvent(type, pointer, event, eventTarget, interaction),\n } = arg;\n\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n targets,\n type,\n pointerEvent,\n };\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n\n for (const prop in target.props || {}) {\n pointerEvent[prop] = target.props[prop];\n }\n\n const origin = utils.getOriginXY(target.eventable, target.element);\n\n pointerEvent.subtractOrigin(origin);\n pointerEvent.eventable = target.eventable;\n pointerEvent.currentTarget = target.element;\n\n target.eventable.fire(pointerEvent);\n\n pointerEvent.addOrigin(origin);\n\n if (pointerEvent.immediatePropagationStopped\n || (pointerEvent.propagationStopped\n && (i + 1) < targets.length && targets[i + 1].element !== pointerEvent.currentTarget)) {\n break;\n }\n }\n\n signals.fire('fired', signalArg);\n\n if (type === 'tap') {\n // if pointerEvent should make a double tap, create and fire a doubletap\n // PointerEvent and use that as the prevTap\n const prevTap = pointerEvent.double\n ? fire({\n interaction, pointer, event, eventTarget,\n type: 'doubletap',\n })\n : pointerEvent;\n\n interaction.prevTap = prevTap;\n interaction.tapTime = prevTap.timeStamp;\n }\n\n return pointerEvent;\n}\n\nfunction collectEventTargets ({ interaction, pointer, event, eventTarget, type }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n // do not fire a tap event if the pointer was moved before being lifted\n if (type === 'tap' && (interaction.pointerWasMoved\n // or if the pointerup target is different to the pointerdown target\n || !(interaction.downTargets[pointerIndex] && interaction.downTargets[pointerIndex] === eventTarget))) {\n return [];\n }\n\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n path,\n targets: [],\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (type === 'hold') {\n signalArg.targets = filter(signalArg.targets, target =>\n target.eventable.options.holdDuration === interaction.holdTimers[pointerIndex].duration);\n }\n\n return signalArg.targets;\n}\n\nInteraction.signals.on('update-pointer-down', function ({ interaction, pointerIndex }) {\n interaction.holdTimers[pointerIndex] = { duration: Infinity, timeout: null };\n});\n\nInteraction.signals.on('remove-pointer', function ({ interaction, pointerIndex }) {\n interaction.holdTimers.splice(pointerIndex, 1);\n});\n\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget, duplicateMove }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n if (!duplicateMove && (!interaction.pointerIsDown || interaction.pointerWasMoved)) {\n if (interaction.pointerIsDown) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n\n fire({\n interaction, pointer, event, eventTarget,\n type: 'move',\n });\n }\n});\n\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget, pointerIndex }) {\n // copy event to be used in timeout for IE8\n const eventCopy = browser.isIE8? utils.extend({}, event) : event;\n\n const timer = interaction.holdTimers[pointerIndex];\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'hold',\n targets: [],\n path,\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (!signalArg.targets.length) { return; }\n\n let minDuration = Infinity;\n\n for (let i = 0; i < signalArg.targets.length; i++) {\n const target = signalArg.targets[i];\n const holdDuration = target.eventable.options.holdDuration;\n\n if (holdDuration < minDuration) {\n minDuration = holdDuration;\n }\n }\n\n timer.duration = minDuration;\n timer.timeout = setTimeout(function () {\n fire({\n interaction,\n eventTarget,\n pointer: browser.isIE8? eventCopy : pointer,\n event: eventCopy,\n type: 'hold',\n });\n }, minDuration);\n});\n\nInteraction.signals.on('up', ({ interaction, pointer, event, eventTarget }) => {\n if (!interaction.pointerWasMoved) {\n fire({ interaction, eventTarget, pointer, event, type: 'tap' });\n }\n});\n\n['up', 'cancel'].forEach(function (signalName) {\n Interaction.signals.on(signalName, function ({ interaction, pointerIndex }) {\n if (interaction.holdTimers[pointerIndex]) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n });\n});\n\nfunction createSignalListener (type) {\n return function ({ interaction, pointer, event, eventTarget }) {\n fire({ interaction, eventTarget, pointer, event, type });\n };\n}\n\nfor (let i = 0; i < simpleSignals.length; i++) {\n Interaction.signals.on(simpleSignals[i], createSignalListener(simpleEvents[i]));\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.prevTap = null; // the most recent tap event on this interaction\n interaction.tapTime = 0; // time of the most recent tap event\n interaction.holdTimers = []; // [{ duration, timeout }]\n});\n\ndefaults.pointerEvents = pointerEvents.defaults;\nmodule.exports = pointerEvents;\n","const pointerEvents = require('./base');\nconst Interaction = require('../Interaction');\n\npointerEvents.signals.on('new', onNew);\npointerEvents.signals.on('fired', onFired);\n\nfor (const signal of ['move', 'up', 'cancel', 'endall']) {\n Interaction.signals.on(signal, endHoldRepeat);\n}\n\nfunction onNew ({ pointerEvent }) {\n if (pointerEvent.type !== 'hold') { return; }\n\n pointerEvent.count = (pointerEvent.count || 0) + 1;\n}\n\nfunction onFired ({ interaction, pointerEvent, eventTarget, targets }) {\n if (pointerEvent.type !== 'hold' || !targets.length) { return; }\n\n // get the repeat interval from the first eventable\n const interval = targets[0].eventable.options.holdRepeatInterval;\n\n // don't repeat if the interval is 0 or less\n if (interval <= 0) { return; }\n\n // set a timeout to fire the holdrepeat event\n interaction.holdIntervalHandle = setTimeout(function () {\n pointerEvents.fire({\n interaction,\n eventTarget,\n type: 'hold',\n pointer: pointerEvent,\n event: pointerEvent,\n });\n }, interval);\n}\n\nfunction endHoldRepeat ({ interaction }) {\n // set the interaction's holdStopTime property\n // to stop further holdRepeat events\n if (interaction.holdIntervalHandle) {\n clearInterval(interaction.holdIntervalHandle);\n interaction.holdIntervalHandle = null;\n }\n}\n\n// don't repeat by default\npointerEvents.defaults.holdRepeatInterval = 0;\npointerEvents.types.push('holdrepeat');\n\nmodule.exports = {\n onNew,\n onFired,\n endHoldRepeat,\n};\n","const pointerEvents = require('./base');\nconst Interactable = require('../Interactable');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\nconst scope = require('../scope');\nconst extend = require('../utils/extend');\nconst { merge } = require('../utils/arr');\n\npointerEvents.signals.on('collect-targets', function ({ targets, element, type, eventTarget }) {\n function collectSelectors (interactable, selector, context) {\n const els = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && is.element(element)\n && domUtils.matchesSelector(element, selector, els)\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n const interactable = scope.interactables.get(element);\n\n if (interactable) {\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n scope.interactables.forEachSelector(collectSelectors, element);\n});\n\nInteractable.signals.on('new', function ({ interactable }) {\n interactable.events.getRect = function (element) {\n return interactable.getRect(element);\n };\n});\n\nInteractable.signals.on('set', function ({ interactable, options }) {\n extend(interactable.events.options, pointerEvents.defaults);\n extend(interactable.events.options, options);\n});\n\nmerge(Interactable.eventTypes, pointerEvents.types);\n\nInteractable.prototype.pointerEvents = function (options) {\n extend(this.events.options, options);\n\n return this;\n};\n\nconst __backCompatOption = Interactable.prototype._backCompatOption;\n\nInteractable.prototype._backCompatOption = function (optionName, newValue) {\n const ret = __backCompatOption.call(this, optionName, newValue);\n\n if (ret === this) {\n this.events.options[optionName] = newValue;\n }\n\n return ret;\n};\n\nInteractable.settingsMethods.push('pointerEvents');\n","const utils = require('./utils');\nconst events = require('./utils/events');\nconst signals = require('./utils/Signals').new();\n\nconst scope = {\n signals,\n events,\n utils,\n\n // main document\n document: require('./utils/domObjects').document,\n // all documents being listened to\n documents: [],\n\n addDocument: function (doc, win) {\n // do nothing if document is already known\n if (utils.contains(scope.documents, doc)) { return false; }\n\n win = win || scope.getWindow(doc);\n\n scope.documents.push(doc);\n events.documents.push(doc);\n\n // don't add an unload event for the main document\n // so that the page may be cached in browser history\n if (doc !== scope.document) {\n events.add(win, 'unload', scope.onWindowUnload);\n }\n\n signals.fire('add-document', { doc, win });\n },\n\n removeDocument: function (doc, win) {\n const index = utils.indexOf(scope.documents, doc);\n\n win = win || scope.getWindow(doc);\n\n events.remove(win, 'unload', scope.onWindowUnload);\n\n scope.documents.splice(index, 1);\n events.documents.splice(index, 1);\n\n signals.fire('remove-document', { win, doc });\n },\n\n onWindowUnload: function () {\n scope.removeDocument(this.document, this);\n },\n};\n\nmodule.exports = scope;\n","const { indexOf } = require('./arr');\n\nclass Signals {\n constructor () {\n this.listeners = {\n // signalName: [listeners],\n };\n }\n\n on (name, listener) {\n if (!this.listeners[name]) {\n this.listeners[name] = [listener];\n return;\n }\n\n this.listeners[name].push(listener);\n }\n\n off (name, listener) {\n if (!this.listeners[name]) { return; }\n\n const index = indexOf(this.listeners[name], listener);\n\n if (index !== -1) {\n this.listeners[name].splice(index, 1);\n }\n }\n\n fire (name, arg) {\n const targetListeners = this.listeners[name];\n\n if (!targetListeners) { return; }\n\n for (let i = 0; i < targetListeners.length; i++) {\n if (targetListeners[i](arg, name) === false) {\n return;\n }\n }\n }\n}\n\nSignals.new = function () {\n return new Signals();\n};\n\nmodule.exports = Signals;\n","function indexOf (array, target) {\n for (let i = 0, len = array.length; i < len; i++) {\n if (array[i] === target) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction contains (array, target) {\n return indexOf(array, target) !== -1;\n}\n\nfunction merge (target, source) {\n for (let i = 0; i < source.length; i++) {\n target.push(source[i]);\n }\n\n return target;\n}\n\nfunction filter (array, test) {\n const result = [];\n\n for (let i = 0; i < array.length; i++) {\n if (test(array[i])) {\n result.push(array[i]);\n }\n }\n\n return result;\n}\n\nmodule.exports = {\n indexOf,\n contains,\n merge,\n filter,\n};\n","const { window } = require('./window');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst Element = domObjects.Element;\nconst navigator = window.navigator;\n\nconst browser = {\n // Does the browser support touch input?\n supportsTouch: !!(('ontouchstart' in window) || is.function(window.DocumentTouch)\n && domObjects.document instanceof window.DocumentTouch),\n\n // Does the browser support PointerEvents\n supportsPointerEvent: !!domObjects.PointerEvent,\n\n isIE8: ('attachEvent' in window) && !('addEventListener' in window),\n\n // Opera Mobile must be handled differently\n isOperaMobile: (navigator.appName === 'Opera'\n && browser.supportsTouch\n && navigator.userAgent.match('Presto')),\n\n // scrolling doesn't change the result of getClientRects on iOS 7\n isIOS7: (/iP(hone|od|ad)/.test(navigator.platform)\n && /OS 7[^\\d]/.test(navigator.appVersion)),\n\n isIe9OrOlder: /MSIE (8|9)/.test(navigator.userAgent),\n\n // prefix matchesSelector\n prefixedMatchesSelector: 'matches' in Element.prototype\n ? 'matches': 'webkitMatchesSelector' in Element.prototype\n ? 'webkitMatchesSelector': 'mozMatchesSelector' in Element.prototype\n ? 'mozMatchesSelector': 'oMatchesSelector' in Element.prototype\n ? 'oMatchesSelector': 'msMatchesSelector',\n\n useMatchesSelectorPolyfill: false,\n\n pEventTypes: (domObjects.PointerEvent\n ? (domObjects.PointerEvent === window.MSPointerEvent\n ? {\n up: 'MSPointerUp',\n down: 'MSPointerDown',\n over: 'mouseover',\n out: 'mouseout',\n move: 'MSPointerMove',\n cancel: 'MSPointerCancel',\n }\n : {\n up: 'pointerup',\n down: 'pointerdown',\n over: 'pointerover',\n out: 'pointerout',\n move: 'pointermove',\n cancel: 'pointercancel',\n })\n : null),\n\n // because Webkit and Opera still use 'mousewheel' event type\n wheelEvent: 'onmousewheel' in domObjects.document? 'mousewheel': 'wheel',\n\n};\n\nbrowser.useMatchesSelectorPolyfill = !is.function(Element.prototype[browser.prefixedMatchesSelector]);\n\nmodule.exports = browser;\n","const domObjects = {};\nconst win = require('./window').window;\n\nfunction blank () {}\n\ndomObjects.document = win.document;\ndomObjects.DocumentFragment = win.DocumentFragment || blank;\ndomObjects.SVGElement = win.SVGElement || blank;\ndomObjects.SVGSVGElement = win.SVGSVGElement || blank;\ndomObjects.SVGElementInstance = win.SVGElementInstance || blank;\ndomObjects.Element = win.Element || blank;\ndomObjects.HTMLElement = win.HTMLElement || domObjects.Element;\n\ndomObjects.Event = win.Event;\ndomObjects.Touch = win.Touch || blank;\ndomObjects.PointerEvent = (win.PointerEvent || win.MSPointerEvent);\n\nmodule.exports = domObjects;\n","const win = require('./window');\nconst browser = require('./browser');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst domUtils = {\n nodeContains: function (parent, child) {\n while (child) {\n if (child === parent) {\n return true;\n }\n\n child = child.parentNode;\n }\n\n return false;\n },\n\n closest: function (element, selector) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) { return element; }\n\n element = domUtils.parentNode(element);\n }\n\n return null;\n },\n\n parentNode: function (node) {\n let parent = node.parentNode;\n\n if (is.docFrag(parent)) {\n // skip past #shado-root fragments\n while ((parent = parent.host) && is.docFrag(parent)) {\n continue;\n }\n\n return parent;\n }\n\n return parent;\n },\n\n // taken from http://tanalin.com/en/blog/2012/12/matches-selector-ie8/ and modified\n matchesSelectorPolyfill: browser.useMatchesSelectorPolyfill\n ? function (element, selector, elems) {\n elems = elems || element.parentNode.querySelectorAll(selector);\n\n for (let i = 0, len = elems.length; i < len; i++) {\n if (elems[i] === element) {\n return true;\n }\n }\n\n return false;\n }\n : null,\n\n matchesSelector: function (element, selector, nodeList) {\n if (browser.useMatchesSelectorPolyfill) {\n return domUtils.matchesSelectorPolyfill(element, selector, nodeList);\n }\n\n // remove /deep/ from selectors if shadowDOM polyfill is used\n if (win.window !== win.realWindow) {\n selector = selector.replace(/\\/deep\\//g, ' ');\n }\n\n return element[browser.prefixedMatchesSelector](selector);\n },\n\n // Test for the element that's \"above\" all other qualifiers\n indexOfDeepestElement: function (elements) {\n let deepestZoneParents = [];\n let dropzoneParents = [];\n let dropzone;\n let deepestZone = elements[0];\n let index = deepestZone? 0: -1;\n let parent;\n let child;\n let i;\n let n;\n\n for (i = 1; i < elements.length; i++) {\n dropzone = elements[i];\n\n // an element might belong to multiple selector dropzones\n if (!dropzone || dropzone === deepestZone) {\n continue;\n }\n\n if (!deepestZone) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n // check if the deepest or current are document.documentElement or document.rootElement\n // - if the current dropzone is, do nothing and continue\n if (dropzone.parentNode === dropzone.ownerDocument) {\n continue;\n }\n // - if deepest is, update with the current dropzone and continue to next\n else if (deepestZone.parentNode === dropzone.ownerDocument) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n if (!deepestZoneParents.length) {\n parent = deepestZone;\n while (parent.parentNode && parent.parentNode !== parent.ownerDocument) {\n deepestZoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n }\n\n // if this element is an svg element and the current deepest is\n // an HTMLElement\n if (deepestZone instanceof domObjects.HTMLElement\n && dropzone instanceof domObjects.SVGElement\n && !(dropzone instanceof domObjects.SVGSVGElement)) {\n\n if (dropzone === deepestZone.parentNode) {\n continue;\n }\n\n parent = dropzone.ownerSVGElement;\n }\n else {\n parent = dropzone;\n }\n\n dropzoneParents = [];\n\n while (parent.parentNode !== parent.ownerDocument) {\n dropzoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n\n n = 0;\n\n // get (position of last common ancestor) + 1\n while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) {\n n++;\n }\n\n const parents = [\n dropzoneParents[n - 1],\n dropzoneParents[n],\n deepestZoneParents[n],\n ];\n\n child = parents[0].lastChild;\n\n while (child) {\n if (child === parents[1]) {\n deepestZone = dropzone;\n index = i;\n deepestZoneParents = [];\n\n break;\n }\n else if (child === parents[2]) {\n break;\n }\n\n child = child.previousSibling;\n }\n }\n\n return index;\n },\n\n matchesUpTo: function (element, selector, limit) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) {\n return true;\n }\n\n element = domUtils.parentNode(element);\n\n if (element === limit) {\n return domUtils.matchesSelector(element, selector);\n }\n }\n\n return false;\n },\n\n getActualElement: function (element) {\n return (element instanceof domObjects.SVGElementInstance\n ? element.correspondingUseElement\n : element);\n },\n\n getScrollXY: function (relevantWindow) {\n relevantWindow = relevantWindow || win.window;\n return {\n x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft,\n y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop,\n };\n },\n\n getElementClientRect: function (element) {\n const clientRect = (element instanceof domObjects.SVGElement\n ? element.getBoundingClientRect()\n : element.getClientRects()[0]);\n\n return clientRect && {\n left : clientRect.left,\n right : clientRect.right,\n top : clientRect.top,\n bottom: clientRect.bottom,\n width : clientRect.width || clientRect.right - clientRect.left,\n height: clientRect.height || clientRect.bottom - clientRect.top,\n };\n },\n\n getElementRect: function (element) {\n const clientRect = domUtils.getElementClientRect(element);\n\n if (!browser.isIOS7 && clientRect) {\n const scroll = domUtils.getScrollXY(win.getWindow(element));\n\n clientRect.left += scroll.x;\n clientRect.right += scroll.x;\n clientRect.top += scroll.y;\n clientRect.bottom += scroll.y;\n }\n\n return clientRect;\n },\n\n getPath: function (element) {\n const path = [];\n\n while (element) {\n path.push(element);\n element = domUtils.parentNode(element);\n }\n\n return path;\n },\n\n trySelector: value => {\n if (!is.string(value)) { return false; }\n\n // an exception will be raised if it is invalid\n domObjects.document.querySelector(value);\n return true;\n },\n};\n\nmodule.exports = domUtils;\n","const is = require('./is');\nconst domUtils = require('./domUtils');\nconst pExtend = require('./pointerExtend');\n\nconst { window, getWindow } = require('./window');\nconst { indexOf, contains } = require('./arr');\n\nconst useAttachEvent = ('attachEvent' in window) && !('addEventListener' in window);\nconst addEvent = useAttachEvent? 'attachEvent': 'addEventListener';\nconst removeEvent = useAttachEvent? 'detachEvent': 'removeEventListener';\nconst on = useAttachEvent? 'on': '';\n\nconst elements = [];\nconst targets = [];\nconst attachedListeners = [];\n\n// {\n// type: {\n// selectors: ['selector', ...],\n// contexts : [document, ...],\n// listeners: [[listener, capture, passive], ...]\n// }\n// }\nconst delegatedEvents = {};\n\nconst documents = [];\n\nconst supportsOptions = !useAttachEvent && (() => {\n let supported = false;\n\n window.document.createElement('div').addEventListener('test', null, {\n get capture () { supported = true; },\n });\n\n return supported;\n})();\n\nfunction add (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n let elementIndex = indexOf(elements, element);\n let target = targets[elementIndex];\n\n if (!target) {\n target = {\n events: {},\n typeCount: 0,\n };\n\n elementIndex = elements.push(element) - 1;\n targets.push(target);\n\n attachedListeners.push(useAttachEvent\n ? {\n supplied: [],\n wrapped : [],\n useCount: [],\n }\n : null);\n }\n\n if (!target.events[type]) {\n target.events[type] = [];\n target.typeCount++;\n }\n\n if (!contains(target.events[type], listener)) {\n let ret;\n\n if (useAttachEvent) {\n const { supplied, wrapped, useCount } = attachedListeners[elementIndex];\n const listenerIndex = indexOf(supplied, listener);\n\n const wrappedListener = wrapped[listenerIndex] || function (event) {\n if (!event.immediatePropagationStopped) {\n event.target = event.srcElement;\n event.currentTarget = element;\n\n event.preventDefault = event.preventDefault || preventDef;\n event.stopPropagation = event.stopPropagation || stopProp;\n event.stopImmediatePropagation = event.stopImmediatePropagation || stopImmProp;\n\n if (/mouse|click/.test(event.type)) {\n event.pageX = event.clientX + getWindow(element).document.documentElement.scrollLeft;\n event.pageY = event.clientY + getWindow(element).document.documentElement.scrollTop;\n }\n\n listener(event);\n }\n };\n\n ret = element[addEvent](on + type, wrappedListener, !!options.capture);\n\n if (listenerIndex === -1) {\n supplied.push(listener);\n wrapped.push(wrappedListener);\n useCount.push(1);\n }\n else {\n useCount[listenerIndex]++;\n }\n }\n else {\n ret = element[addEvent](type, listener, supportsOptions? options : !!options.capture);\n }\n target.events[type].push(listener);\n\n return ret;\n }\n}\n\nfunction remove (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const elementIndex = indexOf(elements, element);\n const target = targets[elementIndex];\n\n if (!target || !target.events) {\n return;\n }\n\n let wrappedListener = listener;\n let listeners;\n let listenerIndex;\n\n if (useAttachEvent) {\n listeners = attachedListeners[elementIndex];\n listenerIndex = indexOf(listeners.supplied, listener);\n wrappedListener = listeners.wrapped[listenerIndex];\n }\n\n if (type === 'all') {\n for (type in target.events) {\n if (target.events.hasOwnProperty(type)) {\n remove(element, type, 'all');\n }\n }\n return;\n }\n\n if (target.events[type]) {\n const len = target.events[type].length;\n\n if (listener === 'all') {\n for (let i = 0; i < len; i++) {\n remove(element, type, target.events[type][i], options);\n }\n return;\n }\n else {\n for (let i = 0; i < len; i++) {\n if (target.events[type][i] === listener) {\n element[removeEvent](on + type, wrappedListener, supportsOptions? options : !!options.capture);\n target.events[type].splice(i, 1);\n\n if (useAttachEvent && listeners) {\n listeners.useCount[listenerIndex]--;\n if (listeners.useCount[listenerIndex] === 0) {\n listeners.supplied.splice(listenerIndex, 1);\n listeners.wrapped.splice(listenerIndex, 1);\n listeners.useCount.splice(listenerIndex, 1);\n }\n }\n\n break;\n }\n }\n }\n\n if (target.events[type] && target.events[type].length === 0) {\n target.events[type] = null;\n target.typeCount--;\n }\n }\n\n if (!target.typeCount) {\n targets.splice(elementIndex, 1);\n elements.splice(elementIndex, 1);\n attachedListeners.splice(elementIndex, 1);\n }\n}\n\nfunction addDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n if (!delegatedEvents[type]) {\n delegatedEvents[type] = {\n selectors: [],\n contexts : [],\n listeners: [],\n };\n\n // add delegate listener functions\n for (let i = 0; i < documents.length; i++) {\n add(documents[i], type, delegateListener);\n add(documents[i], type, delegateUseCapture, true);\n }\n }\n\n const delegated = delegatedEvents[type];\n let index;\n\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n break;\n }\n }\n\n if (index === -1) {\n index = delegated.selectors.length;\n\n delegated.selectors.push(selector);\n delegated.contexts .push(context);\n delegated.listeners.push([]);\n }\n\n // keep listener and capture and passive flags\n delegated.listeners[index].push([listener, !!options.capture, options.passive]);\n}\n\nfunction removeDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const delegated = delegatedEvents[type];\n let matchFound = false;\n let index;\n\n if (!delegated) { return; }\n\n // count from last index of delegated to 0\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n // look for matching selector and context Node\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n\n const listeners = delegated.listeners[index];\n\n // each item of the listeners array is an array: [function, capture, passive]\n for (let i = listeners.length - 1; i >= 0; i--) {\n const [fn, capture, passive] = listeners[i];\n\n // check if the listener functions and capture and passive flags match\n if (fn === listener && capture === !!options.capture && passive === options.passive) {\n // remove the listener from the array of listeners\n listeners.splice(i, 1);\n\n // if all listeners for this interactable have been removed\n // remove the interactable from the delegated arrays\n if (!listeners.length) {\n delegated.selectors.splice(index, 1);\n delegated.contexts .splice(index, 1);\n delegated.listeners.splice(index, 1);\n\n // remove delegate function from context\n remove(context, type, delegateListener);\n remove(context, type, delegateUseCapture, true);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegatedEvents[type] = null;\n }\n }\n\n // only remove one listener\n matchFound = true;\n break;\n }\n }\n\n if (matchFound) { break; }\n }\n }\n}\n\n// bound to the interactable context when a DOM event\n// listener is added to a selector interactable\nfunction delegateListener (event, optionalArg) {\n const options = getOptions(optionalArg);\n const fakeEvent = {};\n const delegated = delegatedEvents[event.type];\n const eventTarget = (domUtils.getActualElement(event.path\n ? event.path[0]\n : event.target));\n let element = eventTarget;\n\n // duplicate the event so that currentTarget can be changed\n pExtend(fakeEvent, event);\n\n fakeEvent.originalEvent = event;\n fakeEvent.preventDefault = preventOriginalDefault;\n\n // climb up document tree looking for selector matches\n while (is.element(element)) {\n for (let i = 0; i < delegated.selectors.length; i++) {\n const selector = delegated.selectors[i];\n const context = delegated.contexts[i];\n\n if (domUtils.matchesSelector(element, selector)\n && domUtils.nodeContains(context, eventTarget)\n && domUtils.nodeContains(context, element)) {\n\n const listeners = delegated.listeners[i];\n\n fakeEvent.currentTarget = element;\n\n for (let j = 0; j < listeners.length; j++) {\n const [fn, capture, passive] = listeners[j];\n\n if (capture === !!options.capture && passive === options.passive) {\n fn(fakeEvent);\n }\n }\n }\n }\n\n element = domUtils.parentNode(element);\n }\n}\n\nfunction delegateUseCapture (event) {\n return delegateListener.call(this, event, true);\n}\n\nfunction preventDef () {\n this.returnValue = false;\n}\n\nfunction preventOriginalDefault () {\n this.originalEvent.preventDefault();\n}\n\nfunction stopProp () {\n this.cancelBubble = true;\n}\n\nfunction stopImmProp () {\n this.cancelBubble = true;\n this.immediatePropagationStopped = true;\n}\n\nfunction getOptions (param) {\n return is.object(param)? param : { capture: param };\n}\n\nmodule.exports = {\n add,\n remove,\n\n addDelegate,\n removeDelegate,\n\n delegateListener,\n delegateUseCapture,\n delegatedEvents,\n documents,\n\n useAttachEvent,\n supportsOptions,\n\n _elements: elements,\n _targets: targets,\n _attachedListeners: attachedListeners,\n};\n","module.exports = function extend (dest, source) {\n for (const prop in source) {\n dest[prop] = source[prop];\n }\n return dest;\n};\n","const {\n resolveRectLike,\n rectToXY,\n} = require('./rect');\n\nmodule.exports = function (target, element, action) {\n const actionOptions = target.options[action];\n const actionOrigin = actionOptions && actionOptions.origin;\n const origin = actionOrigin || target.options.origin;\n\n const originRect = resolveRectLike(origin, target, element, [target && element]);\n\n return rectToXY(originRect) || { x: 0, y: 0 };\n};\n","module.exports = (x, y) => Math.sqrt(x * x + y * y);\n","const extend = require('./extend');\nconst win = require('./window');\n\nconst utils = {\n warnOnce: function (method, message) {\n let warned = false;\n\n return function () {\n if (!warned) {\n win.window.console.warn(message);\n warned = true;\n }\n\n return method.apply(this, arguments);\n };\n },\n\n // http://stackoverflow.com/a/5634528/2280888\n _getQBezierValue: function (t, p1, p2, p3) {\n const iT = 1 - t;\n return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3;\n },\n\n getQuadraticCurvePoint: function (startX, startY, cpX, cpY, endX, endY, position) {\n return {\n x: utils._getQBezierValue(position, startX, cpX, endX),\n y: utils._getQBezierValue(position, startY, cpY, endY),\n };\n },\n\n // http://gizma.com/easing/\n easeOutQuad: function (t, b, c, d) {\n t /= d;\n return -c * t*(t-2) + b;\n },\n\n copyAction: function (dest, src) {\n dest.name = src.name;\n dest.axis = src.axis;\n dest.edges = src.edges;\n\n return dest;\n },\n\n is : require('./is'),\n extend : extend,\n hypot : require('./hypot'),\n getOriginXY: require('./getOriginXY'),\n};\n\nextend(utils, require('./arr'));\nextend(utils, require('./domUtils'));\nextend(utils, require('./pointerUtils'));\nextend(utils, require('./rect'));\n\nmodule.exports = utils;\n","const scope = require('../scope');\nconst utils = require('./index');\n\nconst finder = {\n methodOrder: [ 'simulationResume', 'mouseOrPen', 'hasPointer', 'idle' ],\n\n search: function (pointer, eventType, eventTarget) {\n const pointerType = utils.getPointerType(pointer);\n const pointerId = utils.getPointerId(pointer);\n const details = { pointer, pointerId, pointerType, eventType, eventTarget };\n\n for (const method of finder.methodOrder) {\n const interaction = finder[method](details);\n\n if (interaction) {\n return interaction;\n }\n }\n },\n\n // try to resume simulation with a new pointer\n simulationResume: function ({ pointerType, eventType, eventTarget }) {\n if (!/down|start/i.test(eventType)) {\n return null;\n }\n\n for (const interaction of scope.interactions) {\n let element = eventTarget;\n\n if (interaction.simulation && interaction.simulation.allowResume\n && (interaction.pointerType === pointerType)) {\n while (element) {\n // if the element is the interaction element\n if (element === interaction.element) {\n return interaction;\n }\n element = utils.parentNode(element);\n }\n }\n }\n\n return null;\n },\n\n // if it's a mouse or pen interaction\n mouseOrPen: function ({ pointerId, pointerType, eventType }) {\n if (pointerType !== 'mouse' && pointerType !== 'pen') {\n return null;\n }\n\n let firstNonActive;\n\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType) {\n // if it's a down event, skip interactions with running simulations\n if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; }\n\n // if the interaction is active, return it immediately\n if (interaction.interacting()) {\n return interaction;\n }\n // otherwise save it and look for another active interaction\n else if (!firstNonActive) {\n firstNonActive = interaction;\n }\n }\n }\n\n // if no active mouse interaction was found use the first inactive mouse\n // interaction\n if (firstNonActive) {\n return firstNonActive;\n }\n\n // find any mouse or pen interaction.\n // ignore the interaction if the eventType is a *down, and a simulation\n // is active\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType && !(/down/i.test(eventType) && interaction.simulation)) {\n return interaction;\n }\n }\n\n return null;\n },\n\n // get interaction that has this pointer\n hasPointer: function ({ pointerId }) {\n for (const interaction of scope.interactions) {\n if (utils.contains(interaction.pointerIds, pointerId)) {\n return interaction;\n }\n }\n },\n\n // get first idle interaction with a matching pointerType\n idle: function ({ pointerType }) {\n for (const interaction of scope.interactions) {\n // if there's already a pointer held down\n if (interaction.pointerIds.length === 1) {\n const target = interaction.target;\n // don't add this pointer if there is a target interactable and it\n // isn't gesturable\n if (target && !target.options.gesture.enabled) {\n continue;\n }\n }\n // maximum of 2 pointers per interaction\n else if (interaction.pointerIds.length >= 2) {\n continue;\n }\n\n if (!interaction.interacting() && (pointerType === interaction.pointerType)) {\n return interaction;\n }\n }\n\n return null;\n },\n};\n\nmodule.exports = finder;\n","const win = require('./window');\nconst isWindow = require('./isWindow');\n\nconst is = {\n array : () => {},\n\n window : thing => thing === win.window || isWindow(thing),\n\n docFrag : thing => is.object(thing) && thing.nodeType === 11,\n\n object : thing => !!thing && (typeof thing === 'object'),\n\n function: thing => typeof thing === 'function',\n\n number : thing => typeof thing === 'number' ,\n\n bool : thing => typeof thing === 'boolean' ,\n\n string : thing => typeof thing === 'string' ,\n\n element: thing => {\n if (!thing || (typeof thing !== 'object')) { return false; }\n\n const _window = win.getWindow(thing) || win.window;\n\n return (/object|function/.test(typeof _window.Element)\n ? thing instanceof _window.Element //DOM2\n : thing.nodeType === 1 && typeof thing.nodeName === 'string');\n },\n};\n\nis.array = thing => (is.object(thing)\n && (typeof thing.length !== 'undefined')\n && is.function(thing.splice));\n\nmodule.exports = is;\n","module.exports = (thing) => !!(thing && thing.Window) && (thing instanceof thing.Window);\n","function pointerExtend (dest, source) {\n for (const prop in source) {\n const prefixedPropREs = module.exports.prefixedPropREs;\n let deprecated = false;\n\n // skip deprecated prefixed properties\n for (const vendor in prefixedPropREs) {\n if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) {\n deprecated = true;\n break;\n }\n }\n\n if (!deprecated && typeof source[prop] !== 'function') {\n dest[prop] = source[prop];\n }\n }\n return dest;\n}\n\npointerExtend.prefixedPropREs = {\n webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/,\n};\n\nmodule.exports = pointerExtend;\n","const hypot = require('./hypot');\nconst browser = require('./browser');\nconst dom = require('./domObjects');\nconst domUtils = require('./domUtils');\nconst domObjects = require('./domObjects');\nconst is = require('./is');\nconst pointerExtend = require('./pointerExtend');\n\nconst pointerUtils = {\n copyCoords: function (dest, src) {\n dest.page = dest.page || {};\n dest.page.x = src.page.x;\n dest.page.y = src.page.y;\n\n dest.client = dest.client || {};\n dest.client.x = src.client.x;\n dest.client.y = src.client.y;\n\n dest.timeStamp = src.timeStamp;\n },\n\n setCoordDeltas: function (targetObj, prev, cur) {\n targetObj.page.x = cur.page.x - prev.page.x;\n targetObj.page.y = cur.page.y - prev.page.y;\n targetObj.client.x = cur.client.x - prev.client.x;\n targetObj.client.y = cur.client.y - prev.client.y;\n targetObj.timeStamp = cur.timeStamp - prev.timeStamp;\n\n // set pointer velocity\n const dt = Math.max(targetObj.timeStamp / 1000, 0.001);\n\n targetObj.page.speed = hypot(targetObj.page.x, targetObj.page.y) / dt;\n targetObj.page.vx = targetObj.page.x / dt;\n targetObj.page.vy = targetObj.page.y / dt;\n\n targetObj.client.speed = hypot(targetObj.client.x, targetObj.page.y) / dt;\n targetObj.client.vx = targetObj.client.x / dt;\n targetObj.client.vy = targetObj.client.y / dt;\n },\n\n isNativePointer: function (pointer) {\n return (pointer instanceof dom.Event || pointer instanceof dom.Touch);\n },\n\n // Get specified X/Y coords for mouse or event.touches[0]\n getXY: function (type, pointer, xy) {\n xy = xy || {};\n type = type || 'page';\n\n xy.x = pointer[type + 'X'];\n xy.y = pointer[type + 'Y'];\n\n return xy;\n },\n\n getPageXY: function (pointer, page) {\n page = page || {};\n\n // Opera Mobile handles the viewport and scrolling oddly\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n pointerUtils.getXY('screen', pointer, page);\n\n page.x += window.scrollX;\n page.y += window.scrollY;\n }\n else {\n pointerUtils.getXY('page', pointer, page);\n }\n\n return page;\n },\n\n getClientXY: function (pointer, client) {\n client = client || {};\n\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n // Opera Mobile handles the viewport and scrolling oddly\n pointerUtils.getXY('screen', pointer, client);\n }\n else {\n pointerUtils.getXY('client', pointer, client);\n }\n\n return client;\n },\n\n getPointerId: function (pointer) {\n return is.number(pointer.pointerId)? pointer.pointerId : pointer.identifier;\n },\n\n setCoords: function (targetObj, pointers, timeStamp) {\n const pointer = (pointers.length > 1\n ? pointerUtils.pointerAverage(pointers)\n : pointers[0]);\n\n const tmpXY = {};\n\n pointerUtils.getPageXY(pointer, tmpXY);\n targetObj.page.x = tmpXY.x;\n targetObj.page.y = tmpXY.y;\n\n pointerUtils.getClientXY(pointer, tmpXY);\n targetObj.client.x = tmpXY.x;\n targetObj.client.y = tmpXY.y;\n\n targetObj.timeStamp = is.number(timeStamp) ? timeStamp :new Date().getTime();\n },\n\n pointerExtend: pointerExtend,\n\n getTouchPair: function (event) {\n const touches = [];\n\n // array of touches is supplied\n if (is.array(event)) {\n touches[0] = event[0];\n touches[1] = event[1];\n }\n // an event\n else {\n if (event.type === 'touchend') {\n if (event.touches.length === 1) {\n touches[0] = event.touches[0];\n touches[1] = event.changedTouches[0];\n }\n else if (event.touches.length === 0) {\n touches[0] = event.changedTouches[0];\n touches[1] = event.changedTouches[1];\n }\n }\n else {\n touches[0] = event.touches[0];\n touches[1] = event.touches[1];\n }\n }\n\n return touches;\n },\n\n pointerAverage: function (pointers) {\n const average = {\n pageX : 0,\n pageY : 0,\n clientX: 0,\n clientY: 0,\n screenX: 0,\n screenY: 0,\n };\n\n for (const pointer of pointers) {\n for (const prop in average) {\n average[prop] += pointer[prop];\n }\n }\n for (const prop in average) {\n average[prop] /= pointers.length;\n }\n\n return average;\n },\n\n touchBBox: function (event) {\n if (!event.length && !(event.touches && event.touches.length > 1)) {\n return;\n }\n\n const touches = pointerUtils.getTouchPair(event);\n const minX = Math.min(touches[0].pageX, touches[1].pageX);\n const minY = Math.min(touches[0].pageY, touches[1].pageY);\n const maxX = Math.max(touches[0].pageX, touches[1].pageX);\n const maxY = Math.max(touches[0].pageY, touches[1].pageY);\n\n return {\n x: minX,\n y: minY,\n left: minX,\n top: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n },\n\n touchDistance: function (event, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n\n\n const dx = touches[0][sourceX] - touches[1][sourceX];\n const dy = touches[0][sourceY] - touches[1][sourceY];\n\n return hypot(dx, dy);\n },\n\n touchAngle: function (event, prevAngle, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n const dx = touches[1][sourceX] - touches[0][sourceX];\n const dy = touches[1][sourceY] - touches[0][sourceY];\n const angle = 180 * Math.atan2(dy , dx) / Math.PI;\n\n return angle;\n },\n\n getPointerType: function (pointer) {\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : is.number(pointer.pointerType)\n ? [undefined, undefined,'touch', 'pen', 'mouse'][pointer.pointerType]\n // if the PointerEvent API isn't available, then the \"pointer\" must\n // be either a MouseEvent, TouchEvent, or Touch object\n : /touch/.test(pointer.type) || pointer instanceof domObjects.Touch\n ? 'touch'\n : 'mouse';\n },\n\n // [ event.target, event.currentTarget ]\n getEventTargets: function (event) {\n return [\n domUtils.getActualElement(event.path ? event.path[0] : event.target),\n domUtils.getActualElement(event.currentTarget),\n ];\n },\n};\n\nmodule.exports = pointerUtils;\n","const { window } = require('./window');\n\nconst vendors = ['ms', 'moz', 'webkit', 'o'];\nlet lastTime = 0;\nlet request;\nlet cancel;\n\nfor (let x = 0; x < vendors.length && !window.requestAnimationFrame; x++) {\n request = window[vendors[x] + 'RequestAnimationFrame'];\n cancel = window[vendors[x] +'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n}\n\nif (!request) {\n request = function (callback) {\n const currTime = new Date().getTime();\n const timeToCall = Math.max(0, 16 - (currTime - lastTime));\n const id = setTimeout(function () { callback(currTime + timeToCall); },\n timeToCall);\n\n lastTime = currTime + timeToCall;\n return id;\n };\n}\n\nif (!cancel) {\n cancel = function (id) {\n clearTimeout(id);\n };\n}\n\nmodule.exports = {\n request,\n cancel,\n};\n","const extend = require('./extend');\nconst is = require('./is');\nconst {\n closest,\n parentNode,\n getElementRect,\n} = require('./domUtils');\n\nconst rectUtils = {\n getStringOptionResult: function (value, interactable, element) {\n if (!is.string(value)) {\n return null;\n }\n\n if (value === 'parent') {\n value = parentNode(element);\n }\n else if (value === 'self') {\n value = interactable.getRect(element);\n }\n else {\n value = closest(element, value);\n }\n\n return value;\n },\n\n resolveRectLike: function (value, interactable, element, functionArgs) {\n value = rectUtils.getStringOptionResult(value, interactable, element) || value;\n\n if (is.function(value)) {\n value = value.apply(null, functionArgs);\n }\n\n if (is.element(value)) {\n value = getElementRect(value);\n }\n\n return value;\n },\n\n rectToXY: function (rect) {\n return rect && {\n x: 'x' in rect ? rect.x : rect.left,\n y: 'y' in rect ? rect.y : rect.top,\n };\n },\n\n xywhToTlbr: function (rect) {\n if (rect && !('left' in rect && 'top' in rect)) {\n rect = extend({}, rect);\n\n rect.left = rect.x || 0;\n rect.top = rect.y || 0;\n rect.right = rect.right || (rect.left + rect.width);\n rect.bottom = rect.bottom || (rect.top + rect.height);\n }\n\n return rect;\n },\n\n tlbrToXywh: function (rect) {\n if (rect && !('x' in rect && 'y' in rect)) {\n rect = extend({}, rect);\n\n rect.x = rect.left || 0;\n rect.top = rect.top || 0;\n rect.width = rect.width || (rect.right - rect.x);\n rect.height = rect.height || (rect.bottom - rect.y);\n }\n\n return rect;\n },\n};\n\nmodule.exports = rectUtils;\n","const win = module.exports;\nconst isWindow = require('./isWindow');\n\nfunction init (window) {\n // get wrapped window if using Shadow DOM polyfill\n\n win.realWindow = window;\n\n // create a TextNode\n const el = window.document.createTextNode('');\n\n // check if it's wrapped by a polyfill\n if (el.ownerDocument !== window.document\n && typeof window.wrap === 'function'\n && window.wrap(el) === el) {\n // use wrapped window\n window = window.wrap(window);\n }\n\n win.window = window;\n}\n\nif (typeof window === 'undefined') {\n win.window = undefined;\n win.realWindow = undefined;\n}\nelse {\n init(window);\n}\n\nwin.getWindow = function getWindow (node) {\n if (isWindow(node)) {\n return node;\n }\n\n const rootNode = (node.ownerDocument || node);\n\n return rootNode.defaultView || rootNode.parentWindow || win.window;\n};\n\nwin.init = init;\n"]} \ No newline at end of file diff --git a/package.json b/package.json index 76f3e9969..f39704e99 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "interactjs", - "version": "1.3.0-alpha.3+sha.9595c40", + "version": "1.3.0-alpha.4+sha.7970416", "repository": { "type": "git", "url": "https://github.com/taye/interact.js.git"
- Interactable.styleCursor([newValue])⚓➭ + Interactable.styleCursor([newValue])⚓➭ @@ -1605,7 +1605,7 @@ Parameters - interact.maxInteractions([newValue])⚓➭ + interact.maxInteractions([newValue])⚓➭ @@ -1652,7 +1652,7 @@ Parameters - Interactable.preventDefault([newValue])⚓➭ + Interactable.preventDefault([newValue])⚓➭ @@ -1718,7 +1718,7 @@ Parameters - interact(element)⚓➭ + interact(element)⚓➭ @@ -1821,7 +1821,7 @@ Usage - interact.isSet(element)⚓➭ + interact.isSet(element)⚓➭ @@ -1881,7 +1881,7 @@ Parameters - interact.on(type, listener, [options])⚓➭ + interact.on(type, listener, [options])⚓➭ @@ -1948,7 +1948,7 @@ Parameters - interact.off(type, listener, [options])⚓➭ + interact.off(type, listener, [options])⚓➭ @@ -2014,7 +2014,7 @@ Parameters - interact.debug()⚓➭ + interact.debug()⚓➭ @@ -2056,7 +2056,7 @@ interact.debug() - interact.supportsTouch()⚓➭ + interact.supportsTouch()⚓➭ @@ -2097,7 +2097,7 @@ interact.supportsTouch() - interact.supportsPointerEvent()⚓➭ + interact.supportsPointerEvent()⚓➭ @@ -2138,7 +2138,7 @@ interact.supportsPointerEvent() - interact.stop(event)⚓➭ + interact.stop(event)⚓➭ @@ -2198,7 +2198,7 @@ Parameters - interact.pointerMoveTolerance([newValue])⚓➭ + interact.pointerMoveTolerance([newValue])⚓➭ @@ -2261,7 +2261,7 @@ Parameters - Interaction.start(action, target, element)⚓➭ + Interaction.start(action, target, element)⚓➭ @@ -2356,7 +2356,7 @@ Parameters - Interaction.doMove()⚓➭ + Interaction.doMove()⚓➭ @@ -2403,7 +2403,7 @@ Interaction.doMove() - Interaction.end([event])⚓➭ + Interaction.end([event])⚓➭ diff --git a/dist/interact.js b/dist/interact.js index e8ae35c3b..c78a3c751 100644 --- a/dist/interact.js +++ b/dist/interact.js @@ -1,5 +1,5 @@ /** - * interact.js v1.3.0-alpha.3+sha.9595c40 + * interact.js v1.3.0-alpha.4+sha.7970416-dirty * * Copyright (c) 2012-2017 Taye Adeyemi * Open source under the MIT License. @@ -816,6 +816,7 @@ var scope = require('./scope'); var utils = require('./utils'); var events = require('./utils/events'); var browser = require('./utils/browser'); +var domObjects = require('./utils/domObjects'); var finder = require('./utils/interactionFinder'); var signals = require('./utils/Signals').new(); @@ -829,7 +830,9 @@ var prevTouchTime = 0; scope.interactions = []; var Interaction = function () { - function Interaction() { + function Interaction(_ref) { + var pointerType = _ref.pointerType; + _classCallCheck(this, Interaction); this.target = null; // current interactable being interacted with @@ -886,7 +889,7 @@ var Interaction = function () { this.pointerWasMoved = false; this._interacting = false; - this.mouse = false; + this.pointerType = pointerType; signals.fire('new', this); @@ -1130,6 +1133,11 @@ var Interaction = function () { }; Interaction.prototype.getPointerIndex = function getPointerIndex(pointer) { + // mouse and pen interactions may have only one pointer + if (this.pointerType === 'mouse' || this.pointerType === 'pen') { + return 0; + } + return utils.indexOf(this.pointerIds, utils.getPointerId(pointer)); }; @@ -1161,8 +1169,7 @@ var Interaction = function () { }; Interaction.prototype.removePointer = function removePointer(pointer, event) { - var id = utils.getPointerId(pointer); - var index = this.mouse ? 0 : utils.indexOf(this.pointerIds, id); + var index = this.getPointerIndex(pointer); if (index === -1) { return; @@ -1197,6 +1204,8 @@ for (var i = 0, len = methodNames.length; i < len; i++) { function doOnInteractions(method) { return function (event) { + var pointerType = utils.getPointerType(event); + var _utils$getEventTarget = utils.getEventTargets(event), eventTarget = _utils$getEventTarget[0], curEventTarget = _utils$getEventTarget[1]; @@ -1210,7 +1219,7 @@ function doOnInteractions(method) { var pointer = event.changedTouches[_i]; var interaction = finder.search(pointer, event.type, eventTarget); - matches.push([pointer, interaction || new Interaction()]); + matches.push([pointer, interaction || new Interaction({ pointerType: pointerType })]); } } else { var invalidPointer = false; @@ -1218,7 +1227,7 @@ function doOnInteractions(method) { if (!browser.supportsPointerEvent && /mouse/.test(event.type)) { // ignore mouse events while touch interactions are active for (var _i2 = 0; _i2 < scope.interactions.length && !invalidPointer; _i2++) { - invalidPointer = !scope.interactions[_i2].mouse && scope.interactions[_i2].pointerIsDown; + invalidPointer = scope.interactions[_i2].pointerType !== 'mouse' && scope.interactions[_i2].pointerIsDown; } // try to ignore mouse events that are simulated by the browser @@ -1232,11 +1241,7 @@ function doOnInteractions(method) { var _interaction = finder.search(event, event.type, eventTarget); if (!_interaction) { - - _interaction = new Interaction(); - _interaction.mouse = /mouse/i.test(event.pointerType || event.type) - // MSPointerEvent.MSPOINTER_TYPE_MOUSE - || event.pointerType === 4 || !event.pointerType; + _interaction = new Interaction({ pointerType: pointerType }); } matches.push([event, _interaction]); @@ -1244,20 +1249,20 @@ function doOnInteractions(method) { } for (var _iterator = matches, _isArray = Array.isArray(_iterator), _i3 = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { - var _ref; + var _ref2; if (_isArray) { if (_i3 >= _iterator.length) break; - _ref = _iterator[_i3++]; + _ref2 = _iterator[_i3++]; } else { _i3 = _iterator.next(); if (_i3.done) break; - _ref = _i3.value; + _ref2 = _i3.value; } - var _ref2 = _ref, - _pointer = _ref2[0], - _interaction2 = _ref2[1]; + var _ref3 = _ref2, + _pointer = _ref3[0], + _interaction2 = _ref3[1]; _interaction2._updateEventTargets(eventTarget, curEventTarget); _interaction2[method](_pointer, event, eventTarget, curEventTarget); @@ -1277,7 +1282,7 @@ function endAll(event) { var docEvents = {/* 'eventType': listenerFunc */}; var pEventTypes = browser.pEventTypes; -if (scope.PointerEvent) { +if (domObjects.PointerEvent) { docEvents[pEventTypes.down] = listeners.pointerDown; docEvents[pEventTypes.move] = listeners.pointerMove; docEvents[pEventTypes.up] = listeners.pointerUp; @@ -1295,8 +1300,8 @@ if (scope.PointerEvent) { docEvents.blur = endAll; -function onDocSignal(_ref3, signalName) { - var doc = _ref3.doc; +function onDocSignal(_ref4, signalName) { + var doc = _ref4.doc; var eventMethod = signalName.indexOf('add') === 0 ? events.add : events.remove; @@ -1311,14 +1316,14 @@ function onDocSignal(_ref3, signalName) { } } -signals.on('update-pointer-down', function (_ref4) { - var interaction = _ref4.interaction, - pointer = _ref4.pointer, - pointerId = _ref4.pointerId, - pointerIndex = _ref4.pointerIndex, - event = _ref4.event, - eventTarget = _ref4.eventTarget, - down = _ref4.down; +signals.on('update-pointer-down', function (_ref5) { + var interaction = _ref5.interaction, + pointer = _ref5.pointer, + pointerId = _ref5.pointerId, + pointerIndex = _ref5.pointerIndex, + event = _ref5.event, + eventTarget = _ref5.eventTarget, + down = _ref5.down; interaction.pointerIds[pointerIndex] = pointerId; interaction.pointers[pointerIndex] = pointer; @@ -1355,7 +1360,7 @@ scope.endAllInteractions = endAll; module.exports = Interaction; -},{"./scope":34,"./utils":44,"./utils/Signals":35,"./utils/browser":37,"./utils/events":40,"./utils/interactionFinder":45}],6:[function(require,module,exports){ +},{"./scope":34,"./utils":44,"./utils/Signals":35,"./utils/browser":37,"./utils/domObjects":38,"./utils/events":40,"./utils/interactionFinder":45}],6:[function(require,module,exports){ 'use strict'; var Interaction = require('../Interaction'); @@ -5460,7 +5465,7 @@ module.exports = function () { this.originalEvent = event; this.type = type; this.pointerId = pointerUtils.getPointerId(pointer); - this.pointerType = pointerUtils.getPointerType(pointer, interaction); + this.pointerType = pointerUtils.getPointerType(pointer); this.target = eventTarget; this.currentTarget = null; @@ -5758,8 +5763,10 @@ Interaction.signals.on('down', function (_ref6) { timer.duration = minDuration; timer.timeout = setTimeout(function () { fire({ - interaction: interaction, eventCopy: eventCopy, eventTarget: eventTarget, + interaction: interaction, + eventTarget: eventTarget, pointer: browser.isIE8 ? eventCopy : pointer, + event: eventCopy, type: 'hold' }); }, minDuration); @@ -6946,17 +6953,14 @@ module.exports = utils; var scope = require('../scope'); var utils = require('./index'); -var browser = require('./browser'); var finder = { - methodOrder: ['simulationResume', 'mouse', 'hasPointer', 'idle'], + methodOrder: ['simulationResume', 'mouseOrPen', 'hasPointer', 'idle'], search: function search(pointer, eventType, eventTarget) { - var mouseEvent = /mouse/i.test(pointer.pointerType || eventType) - // MSPointerEvent.MSPOINTER_TYPE_MOUSE - || pointer.pointerType === 4; + var pointerType = utils.getPointerType(pointer); var pointerId = utils.getPointerId(pointer); - var details = { pointer: pointer, pointerId: pointerId, mouseEvent: mouseEvent, eventType: eventType, eventTarget: eventTarget }; + var details = { pointer: pointer, pointerId: pointerId, pointerType: pointerType, eventType: eventType, eventTarget: eventTarget }; for (var _iterator = finder.methodOrder, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { var _ref; @@ -6982,7 +6986,7 @@ var finder = { // try to resume simulation with a new pointer simulationResume: function simulationResume(_ref2) { - var mouseEvent = _ref2.mouseEvent, + var pointerType = _ref2.pointerType, eventType = _ref2.eventType, eventTarget = _ref2.eventTarget; @@ -7006,7 +7010,7 @@ var finder = { var element = eventTarget; - if (interaction.simulation && interaction.simulation.allowResume && interaction.mouse === mouseEvent) { + if (interaction.simulation && interaction.simulation.allowResume && interaction.pointerType === pointerType) { while (element) { // if the element is the interaction element if (element === interaction.element) { @@ -7020,13 +7024,13 @@ var finder = { return null; }, - // if it's a mouse interaction - mouse: function mouse(_ref4) { + // if it's a mouse or pen interaction + mouseOrPen: function mouseOrPen(_ref4) { var pointerId = _ref4.pointerId, - mouseEvent = _ref4.mouseEvent, + pointerType = _ref4.pointerType, eventType = _ref4.eventType; - if (!mouseEvent && (browser.supportsTouch || browser.supportsPointerEvent)) { + if (pointerType !== 'mouse' && pointerType !== 'pen') { return null; } @@ -7046,7 +7050,7 @@ var finder = { var interaction = _ref5; - if (interaction.mouse) { + if (interaction.pointerType === pointerType) { // if it's a down event, skip interactions with running simulations if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; @@ -7069,8 +7073,8 @@ var finder = { return firstNonActive; } - // Find any interaction specifically for mouse. - // ignore the interaction if the eventType is a mousedown, and a simulation + // find any mouse or pen interaction. + // ignore the interaction if the eventType is a *down, and a simulation // is active for (var _iterator4 = scope.interactions, _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) { var _ref6; @@ -7086,7 +7090,7 @@ var finder = { var _interaction = _ref6; - if (_interaction.mouse && !(/down/.test(eventType) && _interaction.simulation)) { + if (_interaction.pointerType === pointerType && !(/down/i.test(eventType) && _interaction.simulation)) { return _interaction; } } @@ -7118,9 +7122,9 @@ var finder = { } }, - // get first idle interaction + // get first idle interaction with a matching pointerType idle: function idle(_ref9) { - var mouseEvent = _ref9.mouseEvent; + var pointerType = _ref9.pointerType; for (var _iterator6 = scope.interactions, _isArray6 = Array.isArray(_iterator6), _i6 = 0, _iterator6 = _isArray6 ? _iterator6 : _iterator6[Symbol.iterator]();;) { var _ref10; @@ -7150,7 +7154,7 @@ var finder = { continue; } - if (!interaction.interacting() && mouseEvent === interaction.mouse) { + if (!interaction.interacting() && pointerType === interaction.pointerType) { return interaction; } } @@ -7161,7 +7165,7 @@ var finder = { module.exports = finder; -},{"../scope":34,"./browser":37,"./index":44}],46:[function(require,module,exports){ +},{"../scope":34,"./index":44}],46:[function(require,module,exports){ 'use strict'; var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; @@ -7262,6 +7266,7 @@ var hypot = require('./hypot'); var browser = require('./browser'); var dom = require('./domObjects'); var domUtils = require('./domUtils'); +var domObjects = require('./domObjects'); var is = require('./is'); var pointerExtend = require('./pointerExtend'); @@ -7468,17 +7473,11 @@ var pointerUtils = { return angle; }, - getPointerType: function getPointerType(pointer, interaction) { - // if the PointerEvent API isn't available, then the pointer must be ither - // a MouseEvent or TouchEvent - if (interaction.mouse) { - return 'mouse'; - } - if (!browser.supportsPointerEvent) { - return 'touch'; - } - - return is.string(pointer.pointerType) ? pointer.pointerType : [undefined, undefined, 'touch', 'pen', 'mouse'][pointer.pointerType]; + getPointerType: function getPointerType(pointer) { + return is.string(pointer.pointerType) ? pointer.pointerType : is.number(pointer.pointerType) ? [undefined, undefined, 'touch', 'pen', 'mouse'][pointer.pointerType] + // if the PointerEvent API isn't available, then the "pointer" must + // be either a MouseEvent, TouchEvent, or Touch object + : /touch/.test(pointer.type) || pointer instanceof domObjects.Touch ? 'touch' : 'mouse'; }, // [ event.target, event.currentTarget ] diff --git a/dist/interact.js.map b/dist/interact.js.map index 60832b766..4f3a62ba8 100644 --- a/dist/interact.js.map +++ b/dist/interact.js.map @@ -1 +1 @@ -{"version":3,"sources":["src/header.js","node_modules/browser-pack/_prelude.js","index.js","src/Eventable.js","src/InteractEvent.js","src/Interactable.js","src/Interaction.js","src/actions/base.js","src/actions/drag.js","src/actions/drop.js","src/actions/gesture.js","src/actions/resize.js","src/autoScroll.js","src/autoStart/InteractableMethods.js","src/autoStart/base.js","src/autoStart/delay.js","src/autoStart/drag.js","src/autoStart/gesture.js","src/autoStart/resize.js","src/defaultOptions.js","src/index.js","src/inertia.js","src/interact.js","src/interactablePreventDefault.js","src/legacyBrowsers.js","src/modifiers/index.js","src/modifiers/restrict.js","src/modifiers/restrictEdges.js","src/modifiers/restrictSize.js","src/modifiers/snap.js","src/modifiers/snapSize.js","src/pointerEvents/PointerEvent.js","src/pointerEvents/base.js","src/pointerEvents/holdRepeat.js","src/pointerEvents/interactableTargets.js","src/scope.js","src/utils/Signals.js","src/utils/arr.js","src/utils/browser.js","src/utils/domObjects.js","src/utils/domUtils.js","src/utils/events.js","src/utils/extend.js","src/utils/getOriginXY.js","src/utils/hypot.js","src/utils/index.js","src/utils/interactionFinder.js","src/utils/is.js","src/utils/isWindow.js","src/utils/pointerExtend.js","src/utils/pointerUtils.js","src/utils/raf.js","src/utils/rect.js","src/utils/window.js"],"names":[],"mappings":"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","file":"interact.js","sourceRoot":"","sourcesContent":["/**\n * interact.js v1.3.0-alpha.3+sha.9595c40\n *\n * Copyright (c) 2012-2017 Taye Adeyemi \n * Open source under the MIT License.\n * https://raw.github.com/taye/interact.js/master/LICENSE\n */\n","(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o 150) {\n return null;\n }\n\n let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI;\n const overlap = 22.5;\n\n if (angle < 0) {\n angle += 360;\n }\n\n const left = 135 - overlap <= angle && angle < 225 + overlap;\n const up = 225 - overlap <= angle && angle < 315 + overlap;\n\n const right = !left && (315 - overlap <= angle || angle < 45 + overlap);\n const down = !up && 45 - overlap <= angle && angle < 135 + overlap;\n\n return {\n up,\n down,\n left,\n right,\n angle,\n speed: interaction.prevEvent.speed,\n velocity: {\n x: interaction.prevEvent.velocityX,\n y: interaction.prevEvent.velocityY,\n },\n };\n }\n\n preventDefault () {}\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n}\n\nsignals.on('set-delta', function ({ iEvent, interaction, starting, deltaSource }) {\n const prevEvent = starting? iEvent : interaction.prevEvent;\n\n if (deltaSource === 'client') {\n iEvent.dx = iEvent.clientX - prevEvent.clientX;\n iEvent.dy = iEvent.clientY - prevEvent.clientY;\n }\n else {\n iEvent.dx = iEvent.pageX - prevEvent.pageX;\n iEvent.dy = iEvent.pageY - prevEvent.pageY;\n }\n});\n\nInteractEvent.signals = signals;\n\nmodule.exports = InteractEvent;\n","const is = require('./utils/is');\nconst events = require('./utils/events');\nconst extend = require('./utils/extend');\nconst actions = require('./actions/base');\nconst scope = require('./scope');\nconst Eventable = require('./Eventable');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nconst {\n getElementRect,\n nodeContains,\n trySelector,\n} = require('./utils/domUtils');\nconst { getWindow } = require('./utils/window');\nconst { indexOf, contains } = require('./utils/arr');\nconst { wheelEvent } = require('./utils/browser');\n\n// all set interactables\nscope.interactables = [];\n\n/*\\\n * Interactable\n [ property ]\n **\n * Object type returned by @interact\n\\*/\nclass Interactable {\n constructor (target, options) {\n options = options || {};\n\n this.target = target;\n this.events = new Eventable();\n this._context = options.context || scope.document;\n this._win = getWindow(trySelector(target)? this._context : target);\n this._doc = this._win.document;\n\n signals.fire('new', {\n target,\n options,\n interactable: this,\n win: this._win,\n });\n\n scope.addDocument( this._doc, this._win );\n\n scope.interactables.push(this);\n\n this.set(options);\n }\n\n setOnEvents (action, phases) {\n const onAction = 'on' + action;\n\n if (is.function(phases.onstart) ) { this.events[onAction + 'start' ] = phases.onstart ; }\n if (is.function(phases.onmove) ) { this.events[onAction + 'move' ] = phases.onmove ; }\n if (is.function(phases.onend) ) { this.events[onAction + 'end' ] = phases.onend ; }\n if (is.function(phases.oninertiastart)) { this.events[onAction + 'inertiastart' ] = phases.oninertiastart ; }\n\n return this;\n }\n\n setPerAction (action, options) {\n // for all the default per-action options\n for (const option in options) {\n // if this option exists for this action\n if (option in defaults[action]) {\n // if the option in the options arg is an object value\n if (is.object(options[option])) {\n // duplicate the object\n this.options[action][option] = extend(this.options[action][option] || {}, options[option]);\n\n if (is.object(defaults.perAction[option]) && 'enabled' in defaults.perAction[option]) {\n this.options[action][option].enabled = options[option].enabled === false? false : true;\n }\n }\n else if (is.bool(options[option]) && is.object(defaults.perAction[option])) {\n this.options[action][option].enabled = options[option];\n }\n else if (options[option] !== undefined) {\n // or if it's not undefined, do a plain assignment\n this.options[action][option] = options[option];\n }\n }\n }\n }\n\n /*\\\n * Interactable.getRect\n [ method ]\n *\n * The default function to get an Interactables bounding rect. Can be\n * overridden using @Interactable.rectChecker.\n *\n - element (Element) #optional The element to measure.\n = (object) The object's bounding rectangle.\n o {\n o top : 0,\n o left : 0,\n o bottom: 0,\n o right : 0,\n o width : 0,\n o height: 0\n o }\n \\*/\n getRect (element) {\n element = element || this.target;\n\n if (is.string(this.target) && !(is.element(element))) {\n element = this._context.querySelector(this.target);\n }\n\n return getElementRect(element);\n }\n\n /*\\\n * Interactable.rectChecker\n [ method ]\n *\n * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n - checker (function) #optional A function which returns this Interactable's bounding rectangle. See @Interactable.getRect\n = (function | object) The checker function or this Interactable\n \\*/\n rectChecker (checker) {\n if (is.function(checker)) {\n this.getRect = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.getRect;\n\n return this;\n }\n\n return this.getRect;\n }\n\n _backCompatOption (optionName, newValue) {\n if (trySelector(newValue) || is.object(newValue)) {\n this.options[optionName] = newValue;\n\n for (const action of actions.names) {\n this.options[action][optionName] = newValue;\n }\n\n return this;\n }\n\n return this.options[optionName];\n }\n\n /*\\\n * Interactable.origin\n [ method ]\n *\n * Gets or sets the origin of the Interactable's element. The x and y\n * of the origin will be subtracted from action event coordinates.\n *\n - origin (object | string) #optional An object eg. { x: 0, y: 0 } or string 'parent', 'self' or any CSS selector\n * OR\n - origin (Element) #optional An HTML or SVG Element whose rect will be used\n **\n = (object) The current origin or this Interactable\n \\*/\n origin (newValue) {\n return this._backCompatOption('origin', newValue);\n }\n\n /*\\\n * Interactable.deltaSource\n [ method ]\n *\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n - newValue (string) #optional Use 'client' if you will be scrolling while interacting; Use 'page' if you want autoScroll to work\n = (string | object) The current deltaSource or this Interactable\n \\*/\n deltaSource (newValue) {\n if (newValue === 'page' || newValue === 'client') {\n this.options.deltaSource = newValue;\n\n return this;\n }\n\n return this.options.deltaSource;\n }\n\n /*\\\n * Interactable.context\n [ method ]\n *\n * Gets the selector context Node of the Interactable. The default is `window.document`.\n *\n = (Node) The context Node of this Interactable\n **\n \\*/\n context () {\n return this._context;\n }\n\n inContext (element) {\n return (this._context === element.ownerDocument\n || nodeContains(this._context, element));\n }\n\n /*\\\n * Interactable.fire\n [ method ]\n *\n * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n - iEvent (InteractEvent) The InteractEvent object to be fired on this Interactable\n = (Interactable) this Interactable\n \\*/\n fire (iEvent) {\n this.events.fire(iEvent);\n\n return this;\n }\n\n _onOffMultiple (method, eventType, listener, options) {\n if (is.string(eventType) && eventType.search(' ') !== -1) {\n eventType = eventType.trim().split(/ +/);\n }\n\n if (is.array(eventType)) {\n for (let i = 0; i < eventType.length; i++) {\n this[method](eventType[i], listener, options);\n }\n\n return true;\n }\n\n if (is.object(eventType)) {\n for (const prop in eventType) {\n this[method](prop, eventType[prop], listener);\n }\n\n return true;\n }\n }\n\n /*\\\n * Interactable.on\n [ method ]\n *\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n - eventType (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) This Interactable\n \\*/\n on (eventType, listener, options) {\n if (this._onOffMultiple('on', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.on(eventType, listener);\n }\n // delegated event for selector\n else if (is.string(this.target)) {\n events.addDelegate(this.target, this._context, eventType, listener, options);\n }\n else {\n events.add(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.off\n [ method ]\n *\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n - eventType (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) This Interactable\n \\*/\n off (eventType, listener, options) {\n if (this._onOffMultiple('off', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n // if it is an action event type\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.off(eventType, listener);\n }\n // delegated event\n else if (is.string(this.target)) {\n events.removeDelegate(this.target, this._context, eventType, listener, options);\n }\n // remove listener from this Interatable's element\n else {\n events.remove(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.set\n [ method ]\n *\n * Reset the options of this Interactable\n - options (object) The new settings to apply\n = (object) This Interactable\n \\*/\n set (options) {\n if (!is.object(options)) {\n options = {};\n }\n\n this.options = extend({}, defaults.base);\n\n const perActions = extend({}, defaults.perAction);\n\n for (const actionName in actions.methodDict) {\n const methodName = actions.methodDict[actionName];\n\n this.options[actionName] = extend({}, defaults[actionName]);\n\n this.setPerAction(actionName, perActions);\n\n this[methodName](options[actionName]);\n }\n\n for (const setting of Interactable.settingsMethods) {\n this.options[setting] = defaults.base[setting];\n\n if (setting in options) {\n this[setting](options[setting]);\n }\n }\n\n signals.fire('set', {\n options,\n interactable: this,\n });\n\n return this;\n }\n\n /*\\\n * Interactable.unset\n [ method ]\n *\n * Remove this interactable from the list of interactables and remove\n * it's action capabilities and event listeners\n *\n = (object) @interact\n \\*/\n unset () {\n events.remove(this.target, 'all');\n\n if (is.string(this.target)) {\n // remove delegated events\n for (const type in events.delegatedEvents) {\n const delegated = events.delegatedEvents[type];\n\n if (delegated.selectors[0] === this.target\n && delegated.contexts[0] === this._context) {\n\n delegated.selectors.splice(0, 1);\n delegated.contexts .splice(0, 1);\n delegated.listeners.splice(0, 1);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegated[type] = null;\n }\n }\n\n events.remove(this._context, type, events.delegateListener);\n events.remove(this._context, type, events.delegateUseCapture, true);\n }\n }\n else {\n events.remove(this, 'all');\n }\n\n signals.fire('unset', { interactable: this });\n\n scope.interactables.splice(indexOf(scope.interactables, this), 1);\n\n // Stop related interactions when an Interactable is unset\n for (const interaction of scope.interactions || []) {\n if (interaction.target === this && interaction.interacting()) {\n interaction.stop();\n }\n }\n\n return scope.interact;\n }\n}\n\nscope.interactables.indexOfElement = function indexOfElement (target, context) {\n context = context || scope.document;\n\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n if (interactable.target === target && interactable._context === context) {\n return i;\n }\n }\n return -1;\n};\n\nscope.interactables.get = function interactableGet (element, options, dontCheckInContext) {\n const ret = this[this.indexOfElement(element, options && options.context)];\n\n return ret && (is.string(element) || dontCheckInContext || ret.inContext(element))? ret : null;\n};\n\nscope.interactables.forEachSelector = function (callback, element) {\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n // skip non CSS selector targets and out of context elements\n if (!is.string(interactable.target)\n || (element && !interactable.inContext(element))) {\n continue;\n }\n\n const ret = callback(interactable, interactable.target, interactable._context, i, this);\n\n if (ret !== undefined) {\n return ret;\n }\n }\n};\n\n// all interact.js eventTypes\nInteractable.eventTypes = scope.eventTypes = [];\n\nInteractable.signals = signals;\n\nInteractable.settingsMethods = [ 'deltaSource', 'origin', 'preventDefault', 'rectChecker' ];\n\nmodule.exports = Interactable;\n","const scope = require('./scope');\nconst utils = require('./utils');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst finder = require('./utils/interactionFinder');\nconst signals = require('./utils/Signals').new();\n\nconst listeners = {};\nconst methodNames = [\n 'pointerDown', 'pointerMove', 'pointerUp',\n 'updatePointer', 'removePointer',\n];\n\n// for ignoring browser's simulated mouse events\nlet prevTouchTime = 0;\n\n// all active and idle interactions\nscope.interactions = [];\n\nclass Interaction {\n constructor () {\n this.target = null; // current interactable being interacted with\n this.element = null; // the target element of the interactable\n\n this.prepared = { // action that's ready to be fired on next move event\n name : null,\n axis : null,\n edges: null,\n };\n\n // keep track of added pointers\n this.pointers = [];\n this.pointerIds = [];\n this.downTargets = [];\n this.downTimes = [];\n\n // Previous native pointer move event coordinates\n this.prevCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n // current native pointer move event coordinates\n this.curCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Starting InteractEvent pointer coordinates\n this.startCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Change in coordinates and time of the pointer\n this.pointerDelta = {\n page : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n client : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n timeStamp: 0,\n };\n\n this.downEvent = null; // pointerdown/mousedown/touchstart event\n this.downPointer = {};\n\n this._eventTarget = null;\n this._curEventTarget = null;\n\n this.prevEvent = null; // previous action event\n\n this.pointerIsDown = false;\n this.pointerWasMoved = false;\n this._interacting = false;\n\n this.mouse = false;\n\n signals.fire('new', this);\n\n scope.interactions.push(this);\n }\n\n pointerDown (pointer, event, eventTarget) {\n const pointerIndex = this.updatePointer(pointer, event, true);\n\n signals.fire('down', {\n pointer,\n event,\n eventTarget,\n pointerIndex,\n interaction: this,\n });\n }\n\n /*\\\n * Interaction.start\n [ method ]\n *\n * Start an action with the given Interactable and Element as tartgets. The\n * action must be enabled for the target Interactable and an appropriate number\n * of pointers must be held down - 1 for drag/resize, 2 for gesture.\n *\n * Use it with `interactable.able({ manualStart: false })` to always\n * [start actions manually](https://github.com/taye/interact.js/issues/114)\n *\n - action (object) The action to be performed - drag, resize, etc.\n - target (Interactable) The Interactable to target\n - element (Element) The DOM Element to target\n = (object) interact\n **\n | interact(target)\n | .draggable({\n | // disable the default drag start by down->move\n | manualStart: true\n | })\n | // start dragging after the user holds the pointer down\n | .on('hold', function (event) {\n | var interaction = event.interaction;\n |\n | if (!interaction.interacting()) {\n | interaction.start({ name: 'drag' },\n | event.interactable,\n | event.currentTarget);\n | }\n | });\n \\*/\n start (action, target, element) {\n if (this.interacting()\n || !this.pointerIsDown\n || this.pointerIds.length < (action.name === 'gesture'? 2 : 1)) {\n return;\n }\n\n // if this interaction had been removed after stopping\n // add it back\n if (utils.indexOf(scope.interactions, this) === -1) {\n scope.interactions.push(this);\n }\n\n utils.copyAction(this.prepared, action);\n this.target = target;\n this.element = element;\n\n signals.fire('action-start', {\n interaction: this,\n event: this.downEvent,\n });\n }\n\n pointerMove (pointer, event, eventTarget) {\n if (!this.simulation) {\n this.updatePointer(pointer);\n utils.setCoords(this.curCoords, this.pointers);\n }\n\n const duplicateMove = (this.curCoords.page.x === this.prevCoords.page.x\n && this.curCoords.page.y === this.prevCoords.page.y\n && this.curCoords.client.x === this.prevCoords.client.x\n && this.curCoords.client.y === this.prevCoords.client.y);\n\n let dx;\n let dy;\n\n // register movement greater than pointerMoveTolerance\n if (this.pointerIsDown && !this.pointerWasMoved) {\n dx = this.curCoords.client.x - this.startCoords.client.x;\n dy = this.curCoords.client.y - this.startCoords.client.y;\n\n this.pointerWasMoved = utils.hypot(dx, dy) > Interaction.pointerMoveTolerance;\n }\n\n const signalArg = {\n pointer,\n pointerIndex: this.getPointerIndex(pointer),\n event,\n eventTarget,\n dx,\n dy,\n duplicate: duplicateMove,\n interaction: this,\n interactingBeforeMove: this.interacting(),\n };\n\n if (!duplicateMove) {\n // set pointer coordinate, time changes and speeds\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n }\n\n signals.fire('move', signalArg);\n\n if (!duplicateMove) {\n // if interacting, fire an 'action-move' signal etc\n if (this.interacting()) {\n this.doMove(signalArg);\n }\n\n if (this.pointerWasMoved) {\n utils.copyCoords(this.prevCoords, this.curCoords);\n }\n }\n }\n\n /*\\\n * Interaction.doMove\n [ method ]\n *\n * Force a move of the current action at the same coordinates. Useful if\n * snap/restrict has been changed and you want a movement with the new\n * settings.\n *\n **\n | interact(target)\n | .draggable(true)\n | .on('dragmove', function (event) {\n | if (someCondition) {\n | // change the snap settings\n | event.interactable.draggable({ snap: { targets: [] }});\n | // fire another move event with re-calculated snap\n | event.interaction.doMove();\n | }\n | });\n \\*/\n doMove (signalArg) {\n signalArg = utils.extend({\n pointer: this.pointers[0],\n event: this.prevEvent,\n eventTarget: this._eventTarget,\n interaction: this,\n }, signalArg || {});\n\n signals.fire('before-action-move', signalArg);\n\n if (!this._dontFireMove) {\n signals.fire('action-move', signalArg);\n }\n\n this._dontFireMove = false;\n }\n\n // End interact move events and stop auto-scroll unless simulation is running\n pointerUp (pointer, event, eventTarget, curEventTarget) {\n const pointerIndex = this.getPointerIndex(pointer);\n\n signals.fire(/cancel$/i.test(event.type)? 'cancel' : 'up', {\n pointer,\n pointerIndex,\n event,\n eventTarget,\n curEventTarget,\n interaction: this,\n });\n\n if (!this.simulation) {\n this.end(event);\n }\n\n this.pointerIsDown = false;\n this.removePointer(pointer, event);\n }\n\n /*\\\n * Interaction.end\n [ method ]\n *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n - event (PointerEvent) #optional\n **\n | interact(target)\n | .draggable(true)\n | .on('move', function (event) {\n | if (event.pageX > 1000) {\n | // end the current action\n | event.interaction.end();\n | // stop all further listeners from being called\n | event.stopImmediatePropagation();\n | }\n | });\n \\*/\n end (event) {\n event = event || this.prevEvent;\n\n if (this.interacting()) {\n signals.fire('action-end', {\n event,\n interaction: this,\n });\n }\n\n this.stop();\n }\n\n currentAction () {\n return this._interacting? this.prepared.name: null;\n }\n\n interacting () {\n return this._interacting;\n }\n\n stop () {\n signals.fire('stop', { interaction: this });\n\n if (this._interacting) {\n signals.fire('stop-active', { interaction: this });\n signals.fire('stop-' + this.prepared.name, { interaction: this });\n }\n\n this.target = this.element = null;\n\n this._interacting = false;\n this.prepared.name = this.prevEvent = null;\n }\n\n getPointerIndex (pointer) {\n return utils.indexOf(this.pointerIds, utils.getPointerId(pointer));\n }\n\n updatePointer (pointer, event, down = event && /(down|start)$/i.test(event.type)) {\n const id = utils.getPointerId(pointer);\n let index = this.getPointerIndex(pointer);\n\n if (index === -1) {\n index = this.pointerIds.length;\n this.pointerIds[index] = id;\n }\n\n if (down) {\n signals.fire('update-pointer-down', {\n pointer,\n event,\n down,\n pointerId: id,\n pointerIndex: index,\n interaction: this,\n });\n }\n\n this.pointers[index] = pointer;\n\n return index;\n }\n\n removePointer (pointer, event) {\n const id = utils.getPointerId(pointer);\n const index = this.mouse? 0 : utils.indexOf(this.pointerIds, id);\n\n if (index === -1) { return; }\n\n signals.fire('remove-pointer', {\n pointer,\n event,\n pointerIndex: index,\n interaction: this,\n });\n\n this.pointers .splice(index, 1);\n this.pointerIds .splice(index, 1);\n this.downTargets.splice(index, 1);\n this.downTimes .splice(index, 1);\n }\n\n _updateEventTargets (target, currentTarget) {\n this._eventTarget = target;\n this._curEventTarget = currentTarget;\n }\n}\n\nfor (let i = 0, len = methodNames.length; i < len; i++) {\n const method = methodNames[i];\n\n listeners[method] = doOnInteractions(method);\n}\n\nfunction doOnInteractions (method) {\n return (function (event) {\n const [eventTarget, curEventTarget] = utils.getEventTargets(event);\n const matches = []; // [ [pointer, interaction], ...]\n\n if (browser.supportsTouch && /touch/.test(event.type)) {\n prevTouchTime = new Date().getTime();\n\n for (let i = 0; i < event.changedTouches.length; i++) {\n const pointer = event.changedTouches[i];\n const interaction = finder.search(pointer, event.type, eventTarget);\n\n matches.push([pointer, interaction || new Interaction()]);\n }\n }\n else {\n let invalidPointer = false;\n\n if (!browser.supportsPointerEvent && /mouse/.test(event.type)) {\n // ignore mouse events while touch interactions are active\n for (let i = 0; i < scope.interactions.length && !invalidPointer; i++) {\n invalidPointer = !scope.interactions[i].mouse && scope.interactions[i].pointerIsDown;\n }\n\n // try to ignore mouse events that are simulated by the browser\n // after a touch event\n invalidPointer = invalidPointer\n || (new Date().getTime() - prevTouchTime < 500)\n // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated\n || event.timeStamp === 0;\n }\n\n if (!invalidPointer) {\n let interaction = finder.search(event, event.type, eventTarget);\n\n if (!interaction) {\n\n interaction = new Interaction();\n interaction.mouse = (/mouse/i.test(event.pointerType || event.type)\n // MSPointerEvent.MSPOINTER_TYPE_MOUSE\n || event.pointerType === 4\n || !event.pointerType);\n }\n\n matches.push([event, interaction]);\n }\n }\n\n for (const [pointer, interaction] of matches) {\n interaction._updateEventTargets(eventTarget, curEventTarget);\n interaction[method](pointer, event, eventTarget, curEventTarget);\n }\n });\n}\n\nfunction endAll (event) {\n for (let i = 0; i < scope.interactions.length; i++) {\n const interaction = scope.interactions[i];\n\n interaction.end(event);\n signals.fire('endall', { event, interaction });\n }\n}\n\nconst docEvents = { /* 'eventType': listenerFunc */ };\nconst pEventTypes = browser.pEventTypes;\n\nif (scope.PointerEvent) {\n docEvents[pEventTypes.down ] = listeners.pointerDown;\n docEvents[pEventTypes.move ] = listeners.pointerMove;\n docEvents[pEventTypes.up ] = listeners.pointerUp;\n docEvents[pEventTypes.cancel] = listeners.pointerUp;\n}\nelse {\n docEvents.mousedown = listeners.pointerDown;\n docEvents.mousemove = listeners.pointerMove;\n docEvents.mouseup = listeners.pointerUp;\n\n docEvents.touchstart = listeners.pointerDown;\n docEvents.touchmove = listeners.pointerMove;\n docEvents.touchend = listeners.pointerUp;\n docEvents.touchcancel = listeners.pointerUp;\n}\n\ndocEvents.blur = endAll;\n\nfunction onDocSignal ({ doc }, signalName) {\n const eventMethod = signalName.indexOf('add') === 0\n ? events.add : events.remove;\n\n // delegate event listener\n for (const eventType in scope.delegatedEvents) {\n eventMethod(doc, eventType, events.delegateListener);\n eventMethod(doc, eventType, events.delegateUseCapture, true);\n }\n\n for (const eventType in docEvents) {\n eventMethod(doc, eventType, docEvents[eventType]);\n }\n}\n\nsignals.on('update-pointer-down', ({ interaction, pointer, pointerId, pointerIndex, event, eventTarget, down }) => {\n interaction.pointerIds[pointerIndex] = pointerId;\n interaction.pointers[pointerIndex] = pointer;\n\n if (down) {\n interaction.pointerIsDown = true;\n }\n\n if (!interaction.interacting()) {\n utils.setCoords(interaction.startCoords, interaction.pointers);\n\n utils.copyCoords(interaction.curCoords , interaction.startCoords);\n utils.copyCoords(interaction.prevCoords, interaction.startCoords);\n\n interaction.downEvent = event;\n interaction.downTimes[pointerIndex] = interaction.curCoords.timeStamp;\n interaction.downTargets[pointerIndex] = eventTarget || event && utils.getEventTargets(event)[0];\n interaction.pointerWasMoved = false;\n\n utils.pointerExtend(interaction.downPointer, pointer);\n }\n});\n\nscope.signals.on('add-document' , onDocSignal);\nscope.signals.on('remove-document', onDocSignal);\n\nInteraction.pointerMoveTolerance = 1;\nInteraction.doOnInteractions = doOnInteractions;\nInteraction.endAll = endAll;\nInteraction.signals = signals;\nInteraction.docEvents = docEvents;\n\nscope.endAllInteractions = endAll;\n\nmodule.exports = Interaction;\n","const Interaction = require('../Interaction');\nconst InteractEvent = require('../InteractEvent');\n\nconst actions = {\n firePrepared,\n names: [],\n methodDict: {},\n};\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n interaction._interacting = true;\n firePrepared(interaction, event, 'start');\n});\n\nInteraction.signals.on('action-move', function ({ interaction, event, preEnd }) {\n firePrepared(interaction, event, 'move', preEnd);\n\n // if the action was ended in a listener\n if (!interaction.interacting()) { return false; }\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n firePrepared(interaction, event, 'end');\n});\n\nfunction firePrepared (interaction, event, phase, preEnd) {\n const actionName = interaction.prepared.name;\n\n const newEvent = new InteractEvent(interaction, event, actionName, phase, interaction.element, null, preEnd);\n\n interaction.target.fire(newEvent);\n interaction.prevEvent = newEvent;\n}\n\nmodule.exports = actions;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drag = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n startAxis : 'xy',\n lockAxis : 'xy',\n },\n\n checker: function (pointer, event, interactable) {\n const dragOptions = interactable.options.drag;\n\n return dragOptions.enabled\n ? { name: 'drag', axis: (dragOptions.lockAxis === 'start'\n ? dragOptions.startAxis\n : dragOptions.lockAxis)}\n : null;\n },\n\n getCursor: function () {\n return 'move';\n },\n};\n\nInteraction.signals.on('before-action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n interaction.curCoords.page.y = interaction.startCoords.page.y;\n interaction.curCoords.client.y = interaction.startCoords.client.y;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vx);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vx);\n interaction.pointerDelta.client.vy = 0;\n interaction.pointerDelta.page.vy = 0;\n }\n else if (axis === 'y') {\n interaction.curCoords.page.x = interaction.startCoords.page.x;\n interaction.curCoords.client.x = interaction.startCoords.client.x;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vy);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vy);\n interaction.pointerDelta.client.vx = 0;\n interaction.pointerDelta.page.vx = 0;\n }\n});\n\n// dragmove\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'dragmove') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n iEvent.pageY = interaction.startCoords.page.y;\n iEvent.clientY = interaction.startCoords.client.y;\n iEvent.dy = 0;\n }\n else if (axis === 'y') {\n iEvent.pageX = interaction.startCoords.page.x;\n iEvent.clientX = interaction.startCoords.client.x;\n iEvent.dx = 0;\n }\n});\n\n/*\\\n * Interactable.draggable\n [ method ]\n *\n * Gets or sets whether drag actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of drag events\n | var isDraggable = interact('ul li').draggable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on drag events (object makes the Interactable draggable)\n = (object) This Interactable\n | interact(element).draggable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // the axis in which the first movement must be\n | // for the drag sequence to start\n | // 'xy' by default - any direction\n | startAxis: 'x' || 'y' || 'xy',\n |\n | // 'xy' by default - don't restrict to one axis (move in any direction)\n | // 'x' or 'y' to restrict movement to either axis\n | // 'start' to restrict movement to the axis the drag started in\n | lockAxis: 'x' || 'y' || 'xy' || 'start',\n |\n | // max number of drags that can happen concurrently\n | // with elements of this Interactable. Infinity by default\n | max: Infinity,\n |\n | // max number of drags that can target the same element+Interactable\n | // 1 by default\n | maxPerElement: 2\n | });\n\\*/\nInteractable.prototype.draggable = function (options) {\n if (utils.is.object(options)) {\n this.options.drag.enabled = options.enabled === false? false: true;\n this.setPerAction('drag', options);\n this.setOnEvents('drag', options);\n\n if (/^(xy|x|y|start)$/.test(options.lockAxis)) {\n this.options.drag.lockAxis = options.lockAxis;\n }\n if (/^(xy|x|y)$/.test(options.startAxis)) {\n this.options.drag.startAxis = options.startAxis;\n }\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drag.enabled = options;\n\n if (!options) {\n this.ondragstart = this.ondragstart = this.ondragend = null;\n }\n\n return this;\n }\n\n return this.options.drag;\n};\n\nactions.drag = drag;\nactions.names.push('drag');\nutils.merge(Interactable.eventTypes, [\n 'dragstart',\n 'dragmove',\n 'draginertiastart',\n 'draginertiaresume',\n 'dragend',\n]);\nactions.methodDict.drag = 'draggable';\n\ndefaultOptions.drag = drag.defaults;\n\nmodule.exports = drag;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst scope = require('../scope');\nconst interact = require('../interact');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drop = {\n defaults: {\n enabled: false,\n accept : null,\n overlap: 'pointer',\n },\n};\n\nlet dynamicDrop = false;\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // reset active dropzones\n interaction.activeDrops.dropzones = [];\n interaction.activeDrops.elements = [];\n interaction.activeDrops.rects = [];\n\n interaction.dropEvents = null;\n\n if (!interaction.dynamicDrop) {\n setActiveDrops(interaction, interaction.element);\n }\n\n const dragEvent = interaction.prevEvent;\n const dropEvents = getDropEvents(interaction, event, dragEvent);\n\n if (dropEvents.activate) {\n fireActiveDrops(interaction, dropEvents.activate);\n }\n});\n\nInteractEvent.signals.on('new', function ({ interaction, iEvent, event }) {\n if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { return; }\n\n const draggableElement = interaction.element;\n const dragEvent = iEvent;\n const dropResult = getDrop(dragEvent, event, draggableElement);\n\n interaction.dropTarget = dropResult.dropzone;\n interaction.dropElement = dropResult.element;\n\n interaction.dropEvents = getDropEvents(interaction, event, dragEvent);\n});\n\nInteraction.signals.on('action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n fireDropEvents(interaction, interaction.dropEvents);\n});\n\nInteraction.signals.on('action-end', function ({ interaction }) {\n if (interaction.prepared.name === 'drag') {\n fireDropEvents(interaction, interaction.dropEvents);\n }\n});\n\nInteraction.signals.on('stop-drag', function ({ interaction }) {\n interaction.activeDrops.dropzones =\n interaction.activeDrops.elements =\n interaction.activeDrops.rects =\n interaction.dropEvents = null;\n});\n\nfunction collectDrops (interaction, element) {\n const drops = [];\n const elements = [];\n\n element = element || interaction.element;\n\n // collect all dropzones and their elements which qualify for a drop\n for (const current of scope.interactables) {\n if (!current.options.drop.enabled) { continue; }\n\n const accept = current.options.drop.accept;\n\n // test the draggable element against the dropzone's accept setting\n if ((utils.is.element(accept) && accept !== element)\n || (utils.is.string(accept)\n && !utils.matchesSelector(element, accept))) {\n\n continue;\n }\n\n // query for new elements if necessary\n const dropElements = utils.is.string(current.target)\n ? current._context.querySelectorAll(current.target)\n : [current.target];\n\n for (let i = 0; i < dropElements.length; i++) {\n const currentElement = dropElements[i];\n\n if (currentElement !== element) {\n drops.push(current);\n elements.push(currentElement);\n }\n }\n }\n\n return {\n elements,\n dropzones: drops,\n };\n}\n\nfunction fireActiveDrops (interaction, event) {\n let prevElement;\n\n // loop through all active dropzones and trigger event\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n const current = interaction.activeDrops.dropzones[i];\n const currentElement = interaction.activeDrops.elements [i];\n\n // prevent trigger of duplicate events on same element\n if (currentElement !== prevElement) {\n // set current element as event target\n event.target = currentElement;\n current.fire(event);\n }\n prevElement = currentElement;\n }\n}\n\n// Collect a new set of possible drops and save them in activeDrops.\n// setActiveDrops should always be called when a drag has just started or a\n// drag event happens while dynamicDrop is true\nfunction setActiveDrops (interaction, dragElement) {\n // get dropzones and their elements that could receive the draggable\n const possibleDrops = collectDrops(interaction, dragElement, true);\n\n interaction.activeDrops.dropzones = possibleDrops.dropzones;\n interaction.activeDrops.elements = possibleDrops.elements;\n interaction.activeDrops.rects = [];\n\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n interaction.activeDrops.rects[i] =\n interaction.activeDrops.dropzones[i].getRect(interaction.activeDrops.elements[i]);\n }\n}\n\nfunction getDrop (dragEvent, event, dragElement) {\n const interaction = dragEvent.interaction;\n const validDrops = [];\n\n if (dynamicDrop) {\n setActiveDrops(interaction, dragElement);\n }\n\n // collect all dropzones and their elements which qualify for a drop\n for (let j = 0; j < interaction.activeDrops.dropzones.length; j++) {\n const current = interaction.activeDrops.dropzones[j];\n const currentElement = interaction.activeDrops.elements [j];\n const rect = interaction.activeDrops.rects [j];\n\n validDrops.push(current.dropCheck(dragEvent, event, interaction.target, dragElement, currentElement, rect)\n ? currentElement\n : null);\n }\n\n // get the most appropriate dropzone based on DOM depth and order\n const dropIndex = utils.indexOfDeepestElement(validDrops);\n\n return {\n dropzone: interaction.activeDrops.dropzones[dropIndex] || null,\n element : interaction.activeDrops.elements [dropIndex] || null,\n };\n}\n\nfunction getDropEvents (interaction, pointerEvent, dragEvent) {\n const dropEvents = {\n enter : null,\n leave : null,\n activate : null,\n deactivate: null,\n move : null,\n drop : null,\n };\n\n const tmpl = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n };\n\n if (interaction.dropElement !== interaction.prevDropElement) {\n // if there was a prevDropTarget, create a dragleave event\n if (interaction.prevDropTarget) {\n dropEvents.leave = utils.extend({ type: 'dragleave' }, tmpl);\n\n dragEvent.dragLeave = dropEvents.leave.target = interaction.prevDropElement;\n dragEvent.prevDropzone = dropEvents.leave.dropzone = interaction.prevDropTarget;\n }\n // if the dropTarget is not null, create a dragenter event\n if (interaction.dropTarget) {\n dropEvents.enter = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n type : 'dragenter',\n };\n\n dragEvent.dragEnter = interaction.dropElement;\n dragEvent.dropzone = interaction.dropTarget;\n }\n }\n\n if (dragEvent.type === 'dragend' && interaction.dropTarget) {\n dropEvents.drop = utils.extend({ type: 'drop' }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n dragEvent.relatedTarget = interaction.dropElement;\n }\n if (dragEvent.type === 'dragstart') {\n dropEvents.activate = utils.extend({ type: 'dropactivate' }, tmpl);\n\n dropEvents.activate.target = null;\n dropEvents.activate.dropzone = null;\n }\n if (dragEvent.type === 'dragend') {\n dropEvents.deactivate = utils.extend({ type: 'dropdeactivate' }, tmpl);\n\n dropEvents.deactivate.target = null;\n dropEvents.deactivate.dropzone = null;\n }\n if (dragEvent.type === 'dragmove' && interaction.dropTarget) {\n dropEvents.move = utils.extend({\n dragmove : dragEvent,\n type : 'dropmove',\n }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n }\n\n return dropEvents;\n}\n\nfunction fireDropEvents (interaction, dropEvents) {\n if (dropEvents.leave) { interaction.prevDropTarget.fire(dropEvents.leave); }\n if (dropEvents.move ) { interaction.dropTarget.fire(dropEvents.move ); }\n if (dropEvents.enter) { interaction.dropTarget.fire(dropEvents.enter); }\n if (dropEvents.drop ) { interaction.dropTarget.fire(dropEvents.drop ); }\n if (dropEvents.deactivate) {\n fireActiveDrops(interaction, dropEvents.deactivate);\n }\n\n interaction.prevDropTarget = interaction.dropTarget;\n interaction.prevDropElement = interaction.dropElement;\n}\n\n/*\\\n * Interactable.dropzone\n [ method ]\n *\n * Returns or sets whether elements can be dropped onto this\n * Interactable to trigger drop events\n *\n * Dropzones can receive the following events:\n * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends\n * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone\n * - `dragmove` when a draggable that has entered the dropzone is moved\n * - `drop` when a draggable is dropped into this dropzone\n *\n * Use the `accept` option to allow only elements that match the given CSS\n * selector or element. The value can be:\n *\n * - **an Element** - only that element can be dropped into this dropzone.\n * - **a string**, - the element being dragged must match it as a CSS selector.\n * - **`null`** - accept options is cleared - it accepts any element.\n *\n * Use the `overlap` option to set how drops are checked for. The allowed\n * values are:\n *\n * - `'pointer'`, the pointer must be over the dropzone (default)\n * - `'center'`, the draggable element's center must be over the dropzone\n * - a number from 0-1 which is the `(intersection area) / (draggable area)`.\n * e.g. `0.5` for drop to happen when half of the area of the draggable is\n * over the dropzone\n *\n * Use the `checker` option to specify a function to check if a dragged\n * element is over this Interactable.\n *\n | interact(target)\n | .dropChecker(function(dragEvent, // related dragmove or dragend event\n | event, // TouchEvent/PointerEvent/MouseEvent\n | dropped, // bool result of the default checker\n | dropzone, // dropzone Interactable\n | dropElement, // dropzone elemnt\n | draggable, // draggable Interactable\n | draggableElement) {// draggable element\n |\n | return dropped && event.target.hasAttribute('allow-drop');\n | }\n *\n *\n - options (boolean | object | null) #optional The new value to be set.\n | interact('.drop').dropzone({\n | accept: '.can-drop' || document.getElementById('single-drop'),\n | overlap: 'pointer' || 'center' || zeroToOne\n | }\n = (boolean | object) The current setting or this Interactable\n\\*/\nInteractable.prototype.dropzone = function (options) {\n if (utils.is.object(options)) {\n this.options.drop.enabled = options.enabled === false? false: true;\n\n if (utils.is.function(options.ondrop) ) { this.events.ondrop = options.ondrop ; }\n if (utils.is.function(options.ondropactivate) ) { this.events.ondropactivate = options.ondropactivate ; }\n if (utils.is.function(options.ondropdeactivate)) { this.events.ondropdeactivate = options.ondropdeactivate; }\n if (utils.is.function(options.ondragenter) ) { this.events.ondragenter = options.ondragenter ; }\n if (utils.is.function(options.ondragleave) ) { this.events.ondragleave = options.ondragleave ; }\n if (utils.is.function(options.ondropmove) ) { this.events.ondropmove = options.ondropmove ; }\n\n if (/^(pointer|center)$/.test(options.overlap)) {\n this.options.drop.overlap = options.overlap;\n }\n else if (utils.is.number(options.overlap)) {\n this.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0);\n }\n if ('accept' in options) {\n this.options.drop.accept = options.accept;\n }\n if ('checker' in options) {\n this.options.drop.checker = options.checker;\n }\n\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drop.enabled = options;\n\n if (!options) {\n this.ondragenter = this.ondragleave = this.ondrop\n = this.ondropactivate = this.ondropdeactivate = null;\n }\n\n return this;\n }\n\n return this.options.drop;\n};\n\nInteractable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) {\n let dropped = false;\n\n // if the dropzone has no rect (eg. display: none)\n // call the custom dropChecker or just return false\n if (!(rect = rect || this.getRect(dropElement))) {\n return (this.options.drop.checker\n ? this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement)\n : false);\n }\n\n const dropOverlap = this.options.drop.overlap;\n\n if (dropOverlap === 'pointer') {\n const origin = utils.getOriginXY(draggable, draggableElement, 'drag');\n const page = utils.getPageXY(dragEvent);\n\n page.x += origin.x;\n page.y += origin.y;\n\n const horizontal = (page.x > rect.left) && (page.x < rect.right);\n const vertical = (page.y > rect.top ) && (page.y < rect.bottom);\n\n dropped = horizontal && vertical;\n }\n\n const dragRect = draggable.getRect(draggableElement);\n\n if (dragRect && dropOverlap === 'center') {\n const cx = dragRect.left + dragRect.width / 2;\n const cy = dragRect.top + dragRect.height / 2;\n\n dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom;\n }\n\n if (dragRect && utils.is.number(dropOverlap)) {\n const overlapArea = (Math.max(0, Math.min(rect.right , dragRect.right ) - Math.max(rect.left, dragRect.left))\n * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top , dragRect.top )));\n\n const overlapRatio = overlapArea / (dragRect.width * dragRect.height);\n\n dropped = overlapRatio >= dropOverlap;\n }\n\n if (this.options.drop.checker) {\n dropped = this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement);\n }\n\n return dropped;\n};\n\nInteractable.signals.on('unset', function ({ interactable }) {\n interactable.dropzone(false);\n});\n\nInteractable.settingsMethods.push('dropChecker');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.dropTarget = null; // the dropzone a drag target might be dropped into\n interaction.dropElement = null; // the element at the time of checking\n interaction.prevDropTarget = null; // the dropzone that was recently dragged away from\n interaction.prevDropElement = null; // the element at the time of checking\n interaction.dropEvents = null; // the dropEvents related to the current drag event\n\n interaction.activeDrops = {\n dropzones: [], // the dropzones that are mentioned below\n elements : [], // elements of dropzones that accept the target draggable\n rects : [], // the rects of the elements mentioned above\n };\n\n});\n\nInteraction.signals.on('stop', function ({ interaction }) {\n interaction.dropTarget = interaction.dropElement =\n interaction.prevDropTarget = interaction.prevDropElement = null;\n});\n\n/*\\\n * interact.dynamicDrop\n [ method ]\n *\n * Returns or sets whether the dimensions of dropzone elements are\n * calculated on every dragmove or only on dragstart for the default\n * dropChecker\n *\n - newValue (boolean) #optional True to check on each move. False to check only before start\n = (boolean | interact) The current setting or interact\n\\*/\ninteract.dynamicDrop = function (newValue) {\n if (utils.is.bool(newValue)) {\n //if (dragging && dynamicDrop !== newValue && !newValue) {\n //calcRects(dropzones);\n //}\n\n dynamicDrop = newValue;\n\n return interact;\n }\n return dynamicDrop;\n};\n\nutils.merge(Interactable.eventTypes, [\n 'dragenter',\n 'dragleave',\n 'dropactivate',\n 'dropdeactivate',\n 'dropmove',\n 'drop',\n]);\nactions.methodDict.drop = 'dropzone';\n\ndefaultOptions.drop = drop.defaults;\n\nmodule.exports = drop;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst gesture = {\n defaults: {\n enabled : false,\n origin : null,\n restrict: null,\n },\n\n checker: function (pointer, event, interactable, element, interaction) {\n if (interaction.pointerIds.length >= 2) {\n return { name: 'gesture' };\n }\n\n return null;\n },\n\n getCursor: function () {\n return '';\n },\n};\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturestart') { return; }\n iEvent.ds = 0;\n\n interaction.gesture.startDistance = interaction.gesture.prevDistance = iEvent.distance;\n interaction.gesture.startAngle = interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.scale = 1;\n});\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturemove') { return; }\n\n iEvent.ds = iEvent.scale - interaction.gesture.scale;\n\n interaction.target.fire(iEvent);\n\n interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.prevDistance = iEvent.distance;\n\n if (iEvent.scale !== Infinity\n && iEvent.scale !== null\n && iEvent.scale !== undefined\n && !isNaN(iEvent.scale)) {\n\n interaction.gesture.scale = iEvent.scale;\n }\n});\n\n/*\\\n * Interactable.gesturable\n [ method ]\n *\n * Gets or sets whether multitouch gestures can be performed on the\n * Interactable's element\n *\n = (boolean) Indicates if this can be the target of gesture events\n | var isGestureable = interact(element).gesturable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on gesture events (makes the Interactable gesturable)\n = (object) this Interactable\n | interact(element).gesturable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // limit multiple gestures.\n | // See the explanation in @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n\\*/\nInteractable.prototype.gesturable = function (options) {\n if (utils.is.object(options)) {\n this.options.gesture.enabled = options.enabled === false? false: true;\n this.setPerAction('gesture', options);\n this.setOnEvents('gesture', options);\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.gesture.enabled = options;\n\n if (!options) {\n this.ongesturestart = this.ongesturestart = this.ongestureend = null;\n }\n\n return this;\n }\n\n return this.options.gesture;\n};\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action, event, starting, ending, deltaSource }) {\n if (action !== 'gesture') { return; }\n\n const pointers = interaction.pointers;\n\n iEvent.touches = [pointers[0], pointers[1]];\n\n if (starting) {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = 1;\n iEvent.ds = 0;\n iEvent.angle = utils.touchAngle(pointers, undefined, deltaSource);\n iEvent.da = 0;\n }\n else if (ending || event instanceof InteractEvent) {\n iEvent.distance = interaction.prevEvent.distance;\n iEvent.box = interaction.prevEvent.box;\n iEvent.scale = interaction.prevEvent.scale;\n iEvent.ds = iEvent.scale - 1;\n iEvent.angle = interaction.prevEvent.angle;\n iEvent.da = iEvent.angle - interaction.gesture.startAngle;\n }\n else {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = iEvent.distance / interaction.gesture.startDistance;\n iEvent.angle = utils.touchAngle(pointers, interaction.gesture.prevAngle, deltaSource);\n\n iEvent.ds = iEvent.scale - interaction.gesture.prevScale;\n iEvent.da = iEvent.angle - interaction.gesture.prevAngle;\n }\n});\n\nInteraction.signals.on('new', function (interaction) {\n interaction.gesture = {\n start: { x: 0, y: 0 },\n\n startDistance: 0, // distance between two touches of touchStart\n prevDistance : 0,\n distance : 0,\n\n scale: 1, // gesture.distance / gesture.startDistance\n\n startAngle: 0, // angle of line joining two touches\n prevAngle : 0, // angle of the previous gesture event\n };\n});\n\nactions.gesture = gesture;\nactions.names.push('gesture');\nutils.merge(Interactable.eventTypes, [\n 'gesturestart',\n 'gesturemove',\n 'gestureend',\n]);\nactions.methodDict.gesture = 'gesturable';\n\ndefaultOptions.gesture = gesture.defaults;\n\nmodule.exports = gesture;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\n// Less Precision with touch input\nconst defaultMargin = browser.supportsTouch || browser.supportsPointerEvent? 20: 10;\n\nconst resize = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n square: false,\n preserveAspectRatio: false,\n axis: 'xy',\n\n // use default margin\n margin: NaN,\n\n // object with props left, right, top, bottom which are\n // true/false values to resize when the pointer is over that edge,\n // CSS selectors to match the handles for each direction\n // or the Elements for each handle\n edges: null,\n\n // a value of 'none' will limit the resize rect to a minimum of 0x0\n // 'negate' will alow the rect to have negative width/height\n // 'reposition' will keep the width/height positive by swapping\n // the top and bottom edges and/or swapping the left and right edges\n invert: 'none',\n },\n\n checker: function (pointer, event, interactable, element, interaction, rect) {\n if (!rect) { return null; }\n\n const page = utils.extend({}, interaction.curCoords.page);\n const options = interactable.options;\n\n if (options.resize.enabled) {\n const resizeOptions = options.resize;\n const resizeEdges = { left: false, right: false, top: false, bottom: false };\n\n // if using resize.edges\n if (utils.is.object(resizeOptions.edges)) {\n for (const edge in resizeEdges) {\n resizeEdges[edge] = checkResizeEdge(edge,\n resizeOptions.edges[edge],\n page,\n interaction._eventTarget,\n element,\n rect,\n resizeOptions.margin || defaultMargin);\n }\n\n resizeEdges.left = resizeEdges.left && !resizeEdges.right;\n resizeEdges.top = resizeEdges.top && !resizeEdges.bottom;\n\n if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) {\n return {\n name: 'resize',\n edges: resizeEdges,\n };\n }\n }\n else {\n const right = options.resize.axis !== 'y' && page.x > (rect.right - defaultMargin);\n const bottom = options.resize.axis !== 'x' && page.y > (rect.bottom - defaultMargin);\n\n if (right || bottom) {\n return {\n name: 'resize',\n axes: (right? 'x' : '') + (bottom? 'y' : ''),\n };\n }\n }\n }\n\n return null;\n },\n\n cursors: (browser.isIe9OrOlder ? {\n x : 'e-resize',\n y : 's-resize',\n xy: 'se-resize',\n\n top : 'n-resize',\n left : 'w-resize',\n bottom : 's-resize',\n right : 'e-resize',\n topleft : 'se-resize',\n bottomright: 'se-resize',\n topright : 'ne-resize',\n bottomleft : 'ne-resize',\n } : {\n x : 'ew-resize',\n y : 'ns-resize',\n xy: 'nwse-resize',\n\n top : 'ns-resize',\n left : 'ew-resize',\n bottom : 'ns-resize',\n right : 'ew-resize',\n topleft : 'nwse-resize',\n bottomright: 'nwse-resize',\n topright : 'nesw-resize',\n bottomleft : 'nesw-resize',\n }),\n\n getCursor: function (action) {\n if (action.axis) {\n return resize.cursors[action.name + action.axis];\n }\n else if (action.edges) {\n let cursorKey = '';\n const edgeNames = ['top', 'bottom', 'left', 'right'];\n\n for (let i = 0; i < 4; i++) {\n if (action.edges[edgeNames[i]]) {\n cursorKey += edgeNames[i];\n }\n }\n\n return resize.cursors[cursorKey];\n }\n },\n};\n\n// resizestart\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'resizestart' || !interaction.prepared.edges) {\n return;\n }\n\n const startRect = interaction.target.getRect(interaction.element);\n const resizeOptions = interaction.target.options.resize;\n\n /*\n * When using the `resizable.square` or `resizable.preserveAspectRatio` options, resizing from one edge\n * will affect another. E.g. with `resizable.square`, resizing to make the right edge larger will make\n * the bottom edge larger by the same amount. We call these 'linked' edges. Any linked edges will depend\n * on the active edges and the edge being interacted with.\n */\n if (resizeOptions.square || resizeOptions.preserveAspectRatio) {\n const linkedEdges = utils.extend({}, interaction.prepared.edges);\n\n linkedEdges.top = linkedEdges.top || (linkedEdges.left && !linkedEdges.bottom);\n linkedEdges.left = linkedEdges.left || (linkedEdges.top && !linkedEdges.right );\n linkedEdges.bottom = linkedEdges.bottom || (linkedEdges.right && !linkedEdges.top );\n linkedEdges.right = linkedEdges.right || (linkedEdges.bottom && !linkedEdges.left );\n\n interaction.prepared._linkedEdges = linkedEdges;\n }\n else {\n interaction.prepared._linkedEdges = null;\n }\n\n // if using `resizable.preserveAspectRatio` option, record aspect ratio at the start of the resize\n if (resizeOptions.preserveAspectRatio) {\n interaction.resizeStartAspectRatio = startRect.width / startRect.height;\n }\n\n interaction.resizeRects = {\n start : startRect,\n current : utils.extend({}, startRect),\n inverted : utils.extend({}, startRect),\n previous : utils.extend({}, startRect),\n delta : {\n left: 0, right : 0, width : 0,\n top : 0, bottom: 0, height: 0,\n },\n };\n\n iEvent.rect = interaction.resizeRects.inverted;\n iEvent.deltaRect = interaction.resizeRects.delta;\n});\n\n// resizemove\nInteractEvent.signals.on('new', function ({ iEvent, phase, interaction }) {\n if (phase !== 'move' || !interaction.prepared.edges) { return; }\n\n const resizeOptions = interaction.target.options.resize;\n const invert = resizeOptions.invert;\n const invertible = invert === 'reposition' || invert === 'negate';\n\n let edges = interaction.prepared.edges;\n\n const start = interaction.resizeRects.start;\n const current = interaction.resizeRects.current;\n const inverted = interaction.resizeRects.inverted;\n const delta = interaction.resizeRects.delta;\n const previous = utils.extend(interaction.resizeRects.previous, inverted);\n const originalEdges = edges;\n\n let dx = iEvent.dx;\n let dy = iEvent.dy;\n\n if (resizeOptions.preserveAspectRatio || resizeOptions.square) {\n // `resize.preserveAspectRatio` takes precedence over `resize.square`\n const startAspectRatio = resizeOptions.preserveAspectRatio\n ? interaction.resizeStartAspectRatio\n : 1;\n\n edges = interaction.prepared._linkedEdges;\n\n if ((originalEdges.left && originalEdges.bottom)\n || (originalEdges.right && originalEdges.top)) {\n dy = -dx / startAspectRatio;\n }\n else if (originalEdges.left || originalEdges.right ) { dy = dx / startAspectRatio; }\n else if (originalEdges.top || originalEdges.bottom) { dx = dy * startAspectRatio; }\n }\n\n // update the 'current' rect without modifications\n if (edges.top ) { current.top += dy; }\n if (edges.bottom) { current.bottom += dy; }\n if (edges.left ) { current.left += dx; }\n if (edges.right ) { current.right += dx; }\n\n if (invertible) {\n // if invertible, copy the current rect\n utils.extend(inverted, current);\n\n if (invert === 'reposition') {\n // swap edge values if necessary to keep width/height positive\n let swap;\n\n if (inverted.top > inverted.bottom) {\n swap = inverted.top;\n\n inverted.top = inverted.bottom;\n inverted.bottom = swap;\n }\n if (inverted.left > inverted.right) {\n swap = inverted.left;\n\n inverted.left = inverted.right;\n inverted.right = swap;\n }\n }\n }\n else {\n // if not invertible, restrict to minimum of 0x0 rect\n inverted.top = Math.min(current.top, start.bottom);\n inverted.bottom = Math.max(current.bottom, start.top);\n inverted.left = Math.min(current.left, start.right);\n inverted.right = Math.max(current.right, start.left);\n }\n\n inverted.width = inverted.right - inverted.left;\n inverted.height = inverted.bottom - inverted.top ;\n\n for (const edge in inverted) {\n delta[edge] = inverted[edge] - previous[edge];\n }\n\n iEvent.edges = interaction.prepared.edges;\n iEvent.rect = inverted;\n iEvent.deltaRect = delta;\n});\n\n/*\\\n * Interactable.resizable\n [ method ]\n *\n * Gets or sets whether resize actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of resize elements\n | var isResizeable = interact('input[type=text]').resizable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on resize events (object makes the Interactable resizable)\n = (object) This Interactable\n | interact(element).resizable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | edges: {\n | top : true, // Use pointer coords to check for resize.\n | left : false, // Disable resizing from left edge.\n | bottom: '.resize-s',// Resize if pointer target matches selector\n | right : handleEl // Resize if pointer target is the given Element\n | },\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height are adjusted at a 1:1 ratio.\n | square: false,\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height maintain the aspect ratio they had when resizing started.\n | preserveAspectRatio: false,\n |\n | // a value of 'none' will limit the resize rect to a minimum of 0x0\n | // 'negate' will allow the rect to have negative width/height\n | // 'reposition' will keep the width/height positive by swapping\n | // the top and bottom edges and/or swapping the left and right edges\n | invert: 'none' || 'negate' || 'reposition'\n |\n | // limit multiple resizes.\n | // See the explanation in the @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n \\*/\nInteractable.prototype.resizable = function (options) {\n if (utils.is.object(options)) {\n this.options.resize.enabled = options.enabled === false? false: true;\n this.setPerAction('resize', options);\n this.setOnEvents('resize', options);\n\n if (/^x$|^y$|^xy$/.test(options.axis)) {\n this.options.resize.axis = options.axis;\n }\n else if (options.axis === null) {\n this.options.resize.axis = defaultOptions.resize.axis;\n }\n\n if (utils.is.bool(options.preserveAspectRatio)) {\n this.options.resize.preserveAspectRatio = options.preserveAspectRatio;\n }\n else if (utils.is.bool(options.square)) {\n this.options.resize.square = options.square;\n }\n\n return this;\n }\n if (utils.is.bool(options)) {\n this.options.resize.enabled = options;\n\n if (!options) {\n this.onresizestart = this.onresizestart = this.onresizeend = null;\n }\n\n return this;\n }\n return this.options.resize;\n};\n\nfunction checkResizeEdge (name, value, page, element, interactableElement, rect, margin) {\n // false, '', undefined, null\n if (!value) { return false; }\n\n // true value, use pointer coords and element rect\n if (value === true) {\n // if dimensions are negative, \"switch\" edges\n const width = utils.is.number(rect.width )? rect.width : rect.right - rect.left;\n const height = utils.is.number(rect.height)? rect.height : rect.bottom - rect.top ;\n\n if (width < 0) {\n if (name === 'left' ) { name = 'right'; }\n else if (name === 'right') { name = 'left' ; }\n }\n if (height < 0) {\n if (name === 'top' ) { name = 'bottom'; }\n else if (name === 'bottom') { name = 'top' ; }\n }\n\n if (name === 'left' ) { return page.x < ((width >= 0? rect.left: rect.right ) + margin); }\n if (name === 'top' ) { return page.y < ((height >= 0? rect.top : rect.bottom) + margin); }\n\n if (name === 'right' ) { return page.x > ((width >= 0? rect.right : rect.left) - margin); }\n if (name === 'bottom') { return page.y > ((height >= 0? rect.bottom: rect.top ) - margin); }\n }\n\n // the remaining checks require an element\n if (!utils.is.element(element)) { return false; }\n\n return utils.is.element(value)\n // the value is an element to use as a resize handle\n ? value === element\n // otherwise check if element matches value as selector\n : utils.matchesUpTo(element, value, interactableElement);\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.resizeAxes = 'xy';\n});\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action }) {\n if (action !== 'resize' || !interaction.resizeAxes) { return; }\n\n const options = interaction.target.options;\n\n if (options.resize.square) {\n if (interaction.resizeAxes === 'y') {\n iEvent.dx = iEvent.dy;\n }\n else {\n iEvent.dy = iEvent.dx;\n }\n iEvent.axes = 'xy';\n }\n else {\n iEvent.axes = interaction.resizeAxes;\n\n if (interaction.resizeAxes === 'x') {\n iEvent.dy = 0;\n }\n else if (interaction.resizeAxes === 'y') {\n iEvent.dx = 0;\n }\n }\n});\n\nactions.resize = resize;\nactions.names.push('resize');\nutils.merge(Interactable.eventTypes, [\n 'resizestart',\n 'resizemove',\n 'resizeinertiastart',\n 'resizeinertiaresume',\n 'resizeend',\n]);\nactions.methodDict.resize = 'resizable';\n\ndefaultOptions.resize = resize.defaults;\n\nmodule.exports = resize;\n","const raf = require('./utils/raf');\nconst getWindow = require('./utils/window').getWindow;\nconst is = require('./utils/is');\nconst domUtils = require('./utils/domUtils');\nconst Interaction = require('./Interaction');\nconst defaultOptions = require('./defaultOptions');\n\nconst autoScroll = {\n defaults: {\n enabled : false,\n container: null, // the item that is scrolled (Window or HTMLElement)\n margin : 60,\n speed : 300, // the scroll speed in pixels per second\n },\n\n interaction: null,\n i: null, // the handle returned by window.setInterval\n x: 0, y: 0, // Direction each pulse is to scroll in\n\n isScrolling: false,\n prevTime: 0,\n\n start: function (interaction) {\n autoScroll.isScrolling = true;\n raf.cancel(autoScroll.i);\n\n autoScroll.interaction = interaction;\n autoScroll.prevTime = new Date().getTime();\n autoScroll.i = raf.request(autoScroll.scroll);\n },\n\n stop: function () {\n autoScroll.isScrolling = false;\n raf.cancel(autoScroll.i);\n },\n\n // scroll the window by the values in scroll.x/y\n scroll: function () {\n const options = autoScroll.interaction.target.options[autoScroll.interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(autoScroll.interaction.element);\n const now = new Date().getTime();\n // change in time in seconds\n const dt = (now - autoScroll.prevTime) / 1000;\n // displacement\n const s = options.speed * dt;\n\n if (s >= 1) {\n if (is.window(container)) {\n container.scrollBy(autoScroll.x * s, autoScroll.y * s);\n }\n else if (container) {\n container.scrollLeft += autoScroll.x * s;\n container.scrollTop += autoScroll.y * s;\n }\n\n autoScroll.prevTime = now;\n }\n\n if (autoScroll.isScrolling) {\n raf.cancel(autoScroll.i);\n autoScroll.i = raf.request(autoScroll.scroll);\n }\n },\n check: function (interactable, actionName) {\n const options = interactable.options;\n\n return options[actionName].autoScroll && options[actionName].autoScroll.enabled;\n },\n onInteractionMove: function ({ interaction, pointer }) {\n if (!(interaction.interacting()\n && autoScroll.check(interaction.target, interaction.prepared.name))) {\n return;\n }\n\n if (interaction.simulation) {\n autoScroll.x = autoScroll.y = 0;\n return;\n }\n\n let top;\n let right;\n let bottom;\n let left;\n\n const options = interaction.target.options[interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(interaction.element);\n\n if (is.window(container)) {\n left = pointer.clientX < autoScroll.margin;\n top = pointer.clientY < autoScroll.margin;\n right = pointer.clientX > container.innerWidth - autoScroll.margin;\n bottom = pointer.clientY > container.innerHeight - autoScroll.margin;\n }\n else {\n const rect = domUtils.getElementClientRect(container);\n\n left = pointer.clientX < rect.left + autoScroll.margin;\n top = pointer.clientY < rect.top + autoScroll.margin;\n right = pointer.clientX > rect.right - autoScroll.margin;\n bottom = pointer.clientY > rect.bottom - autoScroll.margin;\n }\n\n autoScroll.x = (right ? 1: left? -1: 0);\n autoScroll.y = (bottom? 1: top? -1: 0);\n\n if (!autoScroll.isScrolling) {\n // set the autoScroll properties to those of the target\n autoScroll.margin = options.margin;\n autoScroll.speed = options.speed;\n\n autoScroll.start(interaction);\n }\n },\n};\n\nInteraction.signals.on('stop-active', function () {\n autoScroll.stop();\n});\n\nInteraction.signals.on('action-move', autoScroll.onInteractionMove);\n\ndefaultOptions.perAction.autoScroll = autoScroll.defaults;\n\nmodule.exports = autoScroll;\n","const Interactable = require('../Interactable');\nconst actions = require('../actions/base');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.ignoreFrom\n [ method ]\n *\n * If the target of the `mousedown`, `pointerdown` or `touchstart`\n * event or any of it's parents match the given CSS selector or\n * Element, no drag/resize/gesture is started.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to not ignore any elements\n = (string | Element | object) The current ignoreFrom value or this Interactable\n **\n | interact(element, { ignoreFrom: document.getElementById('no-action') });\n | // or\n | interact(element).ignoreFrom('input, textarea, a');\n\\*/\nInteractable.prototype.ignoreFrom = function (newValue) {\n return this._backCompatOption('ignoreFrom', newValue);\n};\n\n/*\\\n * Interactable.allowFrom\n [ method ]\n *\n * A drag/resize/gesture is started only If the target of the\n * `mousedown`, `pointerdown` or `touchstart` event or any of it's\n * parents match the given CSS selector or Element.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to allow from any element\n = (string | Element | object) The current allowFrom value or this Interactable\n **\n | interact(element, { allowFrom: document.getElementById('drag-handle') });\n | // or\n | interact(element).allowFrom('.handle');\n\\*/\nInteractable.prototype.allowFrom = function (newValue) {\n return this._backCompatOption('allowFrom', newValue);\n};\n\nInteractable.prototype.testIgnore = function (ignoreFrom, interactableElement, element) {\n if (!ignoreFrom || !is.element(element)) { return false; }\n\n if (is.string(ignoreFrom)) {\n return domUtils.matchesUpTo(element, ignoreFrom, interactableElement);\n }\n else if (is.element(ignoreFrom)) {\n return domUtils.nodeContains(ignoreFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testAllow = function (allowFrom, interactableElement, element) {\n if (!allowFrom) { return true; }\n\n if (!is.element(element)) { return false; }\n\n if (is.string(allowFrom)) {\n return domUtils.matchesUpTo(element, allowFrom, interactableElement);\n }\n else if (is.element(allowFrom)) {\n return domUtils.nodeContains(allowFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testIgnoreAllow = function (options, interactableElement, eventTarget) {\n return (!this.testIgnore(options.ignoreFrom, interactableElement, eventTarget)\n && this.testAllow(options.allowFrom, interactableElement, eventTarget));\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (event.buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\n","const interact = require('../interact');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst actions = require('../actions/base');\nconst defaultOptions = require('../defaultOptions');\nconst browser = require('../utils/browser');\nconst scope = require('../scope');\nconst utils = require('../utils');\nconst signals = require('../utils/Signals').new();\n\nrequire('./InteractableMethods');\n\nconst autoStart = {\n signals,\n withinInteractionLimit,\n // Allow this many interactions to happen simultaneously\n maxInteractions: Infinity,\n defaults: {\n perAction: {\n manualStart: false,\n max: Infinity,\n maxPerElement: 1,\n allowFrom: null,\n ignoreFrom: null,\n },\n },\n setActionDefaults: function (action) {\n utils.extend(action.defaults, autoStart.defaults.perAction);\n },\n};\n\n// set cursor style on mousedown\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget }) {\n if (interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\n// set cursor style on mousemove\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget }) {\n if (!interaction.mouse\n || interaction.pointerIsDown\n || interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\nInteraction.signals.on('move', function (arg) {\n const { interaction, event } = arg;\n\n if (!interaction.pointerIsDown\n || interaction.interacting()\n || !interaction.pointerWasMoved\n || !interaction.prepared.name) {\n return;\n }\n\n signals.fire('before-start', arg);\n\n const target = interaction.target;\n\n if (interaction.prepared.name && target) {\n // check manualStart and interaction limit\n if (target.options[interaction.prepared.name].manualStart\n || !withinInteractionLimit(target, interaction.element, interaction.prepared)) {\n interaction.stop(event);\n }\n else {\n interaction.start(interaction.prepared, target, interaction.element);\n }\n }\n});\n\n// Check if the current target supports the action.\n// If so, return the validated action. Otherwise, return null\nfunction validateAction (action, interactable, element, eventTarget) {\n if (utils.is.object(action)\n && interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget)\n && interactable.options[action.name].enabled\n && withinInteractionLimit(interactable, element, action)) {\n return action;\n }\n\n return null;\n}\n\nfunction validateSelector (interaction, pointer, event, matches, matchElements, eventTarget) {\n for (let i = 0, len = matches.length; i < len; i++) {\n const match = matches[i];\n const matchElement = matchElements[i];\n const action = validateAction(match.getAction(pointer, event, interaction, matchElement),\n match,\n matchElement,\n eventTarget);\n\n if (action) {\n return {\n action,\n target: match,\n element: matchElement,\n };\n }\n }\n\n return {};\n}\n\nfunction getActionInfo (interaction, pointer, event, eventTarget) {\n let matches = [];\n let matchElements = [];\n\n let element = eventTarget;\n let action = null;\n\n function pushMatches (interactable, selector, context) {\n const elements = (browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined);\n\n if (utils.matchesSelector(element, selector, elements)) {\n\n matches.push(interactable);\n matchElements.push(element);\n }\n }\n\n while (utils.is.element(element)) {\n matches = [];\n matchElements = [];\n\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && (action = validateAction(elementInteractable.getAction(pointer, event, interaction, element, eventTarget),\n elementInteractable,\n element,\n eventTarget))\n && !elementInteractable.options[action.name].manualStart) {\n return {\n element,\n action,\n target: elementInteractable,\n };\n }\n else {\n scope.interactables.forEachSelector(pushMatches, element);\n\n const actionInfo = validateSelector(interaction, pointer, event, matches, matchElements, eventTarget);\n\n if (actionInfo.action\n && !actionInfo.target.options[actionInfo.action.name].manualStart) {\n return actionInfo;\n }\n }\n\n element = utils.parentNode(element);\n }\n\n return {};\n}\n\nfunction prepare (interaction, { action, target, element }) {\n action = action || {};\n\n if (interaction.target && interaction.target.options.styleCursor) {\n interaction.target._doc.documentElement.style.cursor = '';\n }\n\n interaction.target = target;\n interaction.element = element;\n utils.copyAction(interaction.prepared, action);\n\n if (target && target.options.styleCursor) {\n const cursor = action? actions[action.name].getCursor(action) : '';\n interaction.target._doc.documentElement.style.cursor = cursor;\n }\n\n signals.fire('prepared', { interaction: interaction });\n}\n\nInteraction.signals.on('stop', function ({ interaction }) {\n const target = interaction.target;\n\n if (target && target.options.styleCursor) {\n target._doc.documentElement.style.cursor = '';\n }\n});\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (utils.is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (utils.is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n const buttons = event.buttons || ({\n 0: 1,\n 1: 4,\n 3: 8,\n 4: 16,\n })[event.button];\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\nfunction withinInteractionLimit (interactable, element, action) {\n const options = interactable.options;\n const maxActions = options[action.name].max;\n const maxPerElement = options[action.name].maxPerElement;\n let activeInteractions = 0;\n let targetCount = 0;\n let targetElementCount = 0;\n\n // no actions if any of these values == 0\n if (!(maxActions && maxPerElement && autoStart.maxInteractions)) { return; }\n\n for (let i = 0, len = scope.interactions.length; i < len; i++) {\n const interaction = scope.interactions[i];\n const otherAction = interaction.prepared.name;\n\n if (!interaction.interacting()) { continue; }\n\n activeInteractions++;\n\n if (activeInteractions >= autoStart.maxInteractions) {\n return false;\n }\n\n if (interaction.target !== interactable) { continue; }\n\n targetCount += (otherAction === action.name)|0;\n\n if (targetCount >= maxActions) {\n return false;\n }\n\n if (interaction.element === element) {\n targetElementCount++;\n\n if (otherAction !== action.name || targetElementCount >= maxPerElement) {\n return false;\n }\n }\n }\n\n return autoStart.maxInteractions > 0;\n}\n\n/*\\\n * interact.maxInteractions\n [ method ]\n **\n * Returns or sets the maximum number of concurrent interactions allowed.\n * By default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables\n * and elements, you need to enable it in the draggable, resizable and\n * gesturable `'max'` and `'maxPerElement'` options.\n **\n - newValue (number) #optional Any number. newValue <= 0 means no interactions.\n\\*/\ninteract.maxInteractions = function (newValue) {\n if (utils.is.number(newValue)) {\n autoStart.maxInteractions = newValue;\n\n return this;\n }\n\n return autoStart.maxInteractions;\n};\n\nInteractable.settingsMethods.push('styleCursor');\nInteractable.settingsMethods.push('actionChecker');\nInteractable.settingsMethods.push('ignoreFrom');\nInteractable.settingsMethods.push('allowFrom');\n\ndefaultOptions.base.actionChecker = null;\ndefaultOptions.base.styleCursor = true;\n\nutils.extend(defaultOptions.perAction, autoStart.defaults.perAction);\n\nmodule.exports = autoStart;\n","const autoStart = require('./base');\nconst Interaction = require('../Interaction');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.delayTimer = null;\n});\n\nautoStart.signals.on('prepared', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.delayTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.target, interaction.element);\n }, delay);\n }\n});\n\nInteraction.signals.on('move', function ({ interaction, duplicate }) {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.delayTimer);\n }\n});\n\n// prevent regular down->move autoStart\nautoStart.signals.on('before-start', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.prepared.name = null;\n }\n});\n","const autoStart = require('./base');\nconst scope = require('../scope');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\n\nconst { matchesSelector, parentNode } = require('../utils/domUtils');\n\nautoStart.setActionDefaults(require('../actions/drag'));\n\nautoStart.signals.on('before-start', function ({ interaction, eventTarget, dx, dy }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // check if a drag is in the correct axis\n const absX = Math.abs(dx);\n const absY = Math.abs(dy);\n const options = interaction.target.options.drag;\n const startAxis = options.startAxis;\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy');\n\n interaction.prepared.axis = options.lockAxis === 'start'\n ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n : options.lockAxis;\n\n // if the movement isn't in the startAxis of the interactable\n if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) {\n // cancel the prepared action\n interaction.prepared.name = null;\n\n // then try to get a drag from another ineractable\n\n if (!interaction.prepared.name) {\n\n let element = eventTarget;\n\n const getDraggable = function (interactable, selector, context) {\n const elements = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n if (interactable === interaction.target) { return; }\n\n if (!options.manualStart\n && !interactable.testIgnoreAllow(options, element, eventTarget)\n && matchesSelector(element, selector, elements)) {\n\n const action = interactable.getAction(interaction.downPointer,\n interaction.downEvent,\n interaction,\n element);\n\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, interactable)\n && autoStart.validateAction(action, interactable, element, eventTarget)) {\n\n return interactable;\n }\n }\n };\n\n let action = null;\n\n // check all interactables\n while (is.element(element)) {\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && elementInteractable !== interaction.target\n && !elementInteractable.options.drag.manualStart) {\n\n action = elementInteractable.getAction(interaction.downPointer, interaction.downEvent, interaction, element);\n }\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, elementInteractable)) {\n\n interaction.prepared.name = 'drag';\n interaction.target = elementInteractable;\n interaction.element = element;\n break;\n }\n\n const selectorInteractable = scope.interactables.forEachSelector(getDraggable, element);\n\n if (selectorInteractable) {\n interaction.prepared.name = 'drag';\n interaction.target = selectorInteractable;\n interaction.element = element;\n break;\n }\n\n element = parentNode(element);\n }\n }\n }\n});\n\nfunction checkStartAxis (startAxis, interactable) {\n if (!interactable) { return false; }\n\n const thisAxis = interactable.options.drag.startAxis;\n\n return (startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis);\n}\n","require('./base').setActionDefaults(require('../actions/gesture'));\n","require('./base').setActionDefaults(require('../actions/resize'));\n","module.exports = {\n base: {\n accept : null,\n preventDefault: 'auto',\n deltaSource : 'page',\n },\n\n perAction: {\n origin: { x: 0, y: 0 },\n\n // only allow left button by default\n // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n mouseButtons: 1,\n\n inertia: {\n enabled : false,\n resistance : 10, // the lambda in exponential decay\n minSpeed : 100, // target speed must be above this for inertia to start\n endSpeed : 10, // the speed at which inertia is slow enough to stop\n allowResume : true, // allow resuming an action in inertia phase\n smoothEndDuration: 300, // animate to snap/restrict endOnly if there's no inertia\n },\n },\n};\n","/* browser entry point */\n\n// Legacy browser support\nrequire('./legacyBrowsers');\n\n// inertia\nrequire('./inertia');\n\n// modifiers\nrequire('./modifiers/snap');\nrequire('./modifiers/restrict');\n\n// pointerEvents\nrequire('./pointerEvents/base');\nrequire('./pointerEvents/holdRepeat');\nrequire('./pointerEvents/interactableTargets');\n\n// delay\nrequire('./autoStart/delay');\n\n// actions\nrequire('./actions/gesture');\nrequire('./actions/resize');\nrequire('./actions/drag');\nrequire('./actions/drop');\n\n// load these modifiers after resize is loaded\nrequire('./modifiers/snapSize');\nrequire('./modifiers/restrictEdges');\nrequire('./modifiers/restrictSize');\n\n// autoStart actions\nrequire('./autoStart/gesture');\nrequire('./autoStart/resize');\nrequire('./autoStart/drag');\n\n// Interactable preventDefault setting\nrequire('./interactablePreventDefault.js');\n\n// autoScroll\nrequire('./autoScroll');\n\n// export interact\nmodule.exports = require('./interact');\n","const InteractEvent = require('./InteractEvent');\nconst Interaction = require('./Interaction');\nconst modifiers = require('./modifiers');\nconst utils = require('./utils');\nconst animationFrame = require('./utils/raf');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.inertiaStatus = {\n active : false,\n smoothEnd : false,\n allowResume: false,\n\n startEvent: null,\n upCoords : {},\n\n xe: 0, ye: 0,\n sx: 0, sy: 0,\n\n t0: 0,\n vx0: 0, vys: 0,\n duration: 0,\n\n lambda_v0: 0,\n one_ve_v0: 0,\n i : null,\n };\n\n interaction.boundInertiaFrame = () => inertiaFrame .apply(interaction);\n interaction.boundSmoothEndFrame = () => smoothEndFrame.apply(interaction);\n});\n\nInteraction.signals.on('down', function ({ interaction, event, pointer, eventTarget }) {\n const status = interaction.inertiaStatus;\n\n // Check if the down event hits the current inertia target\n if (status.active) {\n let element = eventTarget;\n\n // climb up the DOM tree from the event target\n while (utils.is.element(element)) {\n\n // if interaction element is the current inertia target element\n if (element === interaction.element) {\n // stop inertia\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n\n // update pointers to the down event's coordinates\n interaction.updatePointer(pointer);\n utils.setCoords(interaction.curCoords, interaction.pointers);\n\n // fire appropriate signals\n const signalArg = { interaction };\n Interaction.signals.fire('before-action-move', signalArg);\n Interaction.signals.fire('action-resume' , signalArg);\n\n // fire a reume event\n const resumeEvent = new InteractEvent(interaction,\n event,\n interaction.prepared.name,\n 'inertiaresume',\n interaction.element);\n\n interaction.target.fire(resumeEvent);\n interaction.prevEvent = resumeEvent;\n modifiers.resetStatuses(interaction.modifierStatuses);\n\n utils.copyCoords(interaction.prevCoords, interaction.curCoords);\n break;\n }\n\n element = utils.parentNode(element);\n }\n }\n});\n\nInteraction.signals.on('up', function ({ interaction, event }) {\n const status = interaction.inertiaStatus;\n\n if (!interaction.interacting() || status.active) { return; }\n\n const target = interaction.target;\n const options = target && target.options;\n const inertiaOptions = options && interaction.prepared.name && options[interaction.prepared.name].inertia;\n\n const now = new Date().getTime();\n const statuses = {};\n const page = utils.extend({}, interaction.curCoords.page);\n const pointerSpeed = interaction.pointerDelta.client.speed;\n\n let smoothEnd = false;\n let modifierResult;\n\n // check if inertia should be started\n const inertiaPossible = (inertiaOptions && inertiaOptions.enabled\n && interaction.prepared.name !== 'gesture'\n && event !== status.startEvent);\n\n const inertia = (inertiaPossible\n && (now - interaction.curCoords.timeStamp) < 50\n && pointerSpeed > inertiaOptions.minSpeed\n && pointerSpeed > inertiaOptions.endSpeed);\n\n const modifierArg = {\n interaction,\n pageCoords: page,\n statuses,\n preEnd: true,\n requireEndOnly: true,\n };\n\n // smoothEnd\n if (inertiaPossible && !inertia) {\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n if (modifierResult.shouldMove && modifierResult.locked) {\n smoothEnd = true;\n }\n }\n\n if (!(inertia || smoothEnd)) { return; }\n\n utils.copyCoords(status.upCoords, interaction.curCoords);\n\n interaction.pointers[0] = status.startEvent =\n new InteractEvent(interaction, event, interaction.prepared.name, 'inertiastart', interaction.element);\n\n status.t0 = now;\n\n status.active = true;\n status.allowResume = inertiaOptions.allowResume;\n interaction.simulation = status;\n\n target.fire(status.startEvent);\n\n if (inertia) {\n status.vx0 = interaction.pointerDelta.client.vx;\n status.vy0 = interaction.pointerDelta.client.vy;\n status.v0 = pointerSpeed;\n\n calcInertia(interaction, status);\n\n utils.extend(page, interaction.curCoords.page);\n\n page.x += status.xe;\n page.y += status.ye;\n\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n status.modifiedXe += modifierResult.dx;\n status.modifiedYe += modifierResult.dy;\n\n status.i = animationFrame.request(interaction.boundInertiaFrame);\n }\n else {\n status.smoothEnd = true;\n status.xe = modifierResult.dx;\n status.ye = modifierResult.dy;\n\n status.sx = status.sy = 0;\n\n status.i = animationFrame.request(interaction.boundSmoothEndFrame);\n }\n});\n\nInteraction.signals.on('stop-active', function ({ interaction }) {\n const status = interaction.inertiaStatus;\n\n if (status.active) {\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n }\n});\n\nfunction calcInertia (interaction, status) {\n const inertiaOptions = interaction.target.options[interaction.prepared.name].inertia;\n const lambda = inertiaOptions.resistance;\n const inertiaDur = -Math.log(inertiaOptions.endSpeed / status.v0) / lambda;\n\n status.x0 = interaction.prevEvent.pageX;\n status.y0 = interaction.prevEvent.pageY;\n status.t0 = status.startEvent.timeStamp / 1000;\n status.sx = status.sy = 0;\n\n status.modifiedXe = status.xe = (status.vx0 - inertiaDur) / lambda;\n status.modifiedYe = status.ye = (status.vy0 - inertiaDur) / lambda;\n status.te = inertiaDur;\n\n status.lambda_v0 = lambda / status.v0;\n status.one_ve_v0 = 1 - inertiaOptions.endSpeed / status.v0;\n}\n\nfunction inertiaFrame () {\n updateInertiaCoords(this);\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n\n const status = this.inertiaStatus;\n const options = this.target.options[this.prepared.name].inertia;\n const lambda = options.resistance;\n const t = new Date().getTime() / 1000 - status.t0;\n\n if (t < status.te) {\n\n const progress = 1 - (Math.exp(-lambda * t) - status.lambda_v0) / status.one_ve_v0;\n\n if (status.modifiedXe === status.xe && status.modifiedYe === status.ye) {\n status.sx = status.xe * progress;\n status.sy = status.ye * progress;\n }\n else {\n const quadPoint = utils.getQuadraticCurvePoint(0, 0,\n status.xe,\n status.ye,\n status.modifiedXe,\n status.modifiedYe,\n progress);\n\n status.sx = quadPoint.x;\n status.sy = quadPoint.y;\n }\n\n this.doMove();\n\n status.i = animationFrame.request(this.boundInertiaFrame);\n }\n else {\n status.sx = status.modifiedXe;\n status.sy = status.modifiedYe;\n\n this.doMove();\n this.end(status.startEvent);\n status.active = false;\n this.simulation = null;\n }\n\n utils.copyCoords(this.prevCoords, this.curCoords);\n}\n\nfunction smoothEndFrame () {\n updateInertiaCoords(this);\n\n const status = this.inertiaStatus;\n const t = new Date().getTime() - status.t0;\n const duration = this.target.options[this.prepared.name].inertia.smoothEndDuration;\n\n if (t < duration) {\n status.sx = utils.easeOutQuad(t, 0, status.xe, duration);\n status.sy = utils.easeOutQuad(t, 0, status.ye, duration);\n\n this.pointerMove(status.startEvent, status.startEvent);\n\n status.i = animationFrame.request(this.boundSmoothEndFrame);\n }\n else {\n status.sx = status.xe;\n status.sy = status.ye;\n\n this.pointerMove(status.startEvent, status.startEvent);\n this.end(status.startEvent);\n\n status.smoothEnd =\n status.active = false;\n this.simulation = null;\n }\n}\n\nfunction updateInertiaCoords (interaction) {\n const status = interaction.inertiaStatus;\n\n // return if inertia isn't running\n if (!status.active) { return; }\n\n const pageUp = status.upCoords.page;\n const clientUp = status.upCoords.client;\n\n utils.setCoords(interaction.curCoords, [ {\n pageX : pageUp.x + status.sx,\n pageY : pageUp.y + status.sy,\n clientX: clientUp.x + status.sx,\n clientY: clientUp.y + status.sy,\n } ]);\n}\n","const browser = require('./utils/browser');\nconst events = require('./utils/events');\nconst utils = require('./utils');\nconst scope = require('./scope');\nconst Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\n\nconst globalEvents = {};\n\n/*\\\n * interact\n [ method ]\n *\n * The methods of this variable can be used to set elements as\n * interactables and also to change various default settings.\n *\n * Calling it as a function and passing an element or a valid CSS selector\n * string returns an Interactable object which has various methods to\n * configure it.\n *\n - element (Element | string) The HTML or SVG Element to interact with or CSS selector\n = (object) An @Interactable\n *\n > Usage\n | interact('#draggable').draggable(true);\n |\n | var rectables = interact('rect');\n | rectables\n | .gesturable(true)\n | .on('gesturemove', function (event) {\n | // ...\n | });\n\\*/\nfunction interact (element, options) {\n let interactable = scope.interactables.get(element, options);\n\n if (!interactable) {\n interactable = new Interactable(element, options);\n interactable.events.global = globalEvents;\n }\n\n return interactable;\n}\n\n/*\\\n * interact.isSet\n [ method ]\n *\n * Check if an element has been set\n - element (Element) The Element being searched for\n = (boolean) Indicates if the element or CSS selector was previously passed to interact\n\\*/\ninteract.isSet = function (element, options) {\n return scope.interactables.indexOfElement(element, options && options.context) !== -1;\n};\n\n/*\\\n * interact.on\n [ method ]\n *\n * Adds a global listener for an InteractEvent or adds a DOM event to\n * `document`\n *\n - type (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) interact\n\\*/\ninteract.on = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.on(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.on(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n // if it is an InteractEvent type, add listener to globalEvents\n if (utils.contains(Interactable.eventTypes, type)) {\n // if this type of event was never bound\n if (!globalEvents[type]) {\n globalEvents[type] = [listener];\n }\n else {\n globalEvents[type].push(listener);\n }\n }\n // If non InteractEvent type, addEventListener to document\n else {\n events.add(scope.document, type, listener, { options });\n }\n\n return interact;\n};\n\n/*\\\n * interact.off\n [ method ]\n *\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n - type (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) interact\n \\*/\ninteract.off = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.off(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.off(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n if (!utils.contains(Interactable.eventTypes, type)) {\n events.remove(scope.document, type, listener, options);\n }\n else {\n let index;\n\n if (type in globalEvents\n && (index = utils.indexOf(globalEvents[type], listener)) !== -1) {\n globalEvents[type].splice(index, 1);\n }\n }\n\n return interact;\n};\n\n/*\\\n * interact.debug\n [ method ]\n *\n * Returns an object which exposes internal data\n = (object) An object with properties that outline the current state and expose internal functions and variables\n\\*/\ninteract.debug = function () {\n return scope;\n};\n\n// expose the functions used to calculate multi-touch properties\ninteract.getPointerAverage = utils.pointerAverage;\ninteract.getTouchBBox = utils.touchBBox;\ninteract.getTouchDistance = utils.touchDistance;\ninteract.getTouchAngle = utils.touchAngle;\n\ninteract.getElementRect = utils.getElementRect;\ninteract.getElementClientRect = utils.getElementClientRect;\ninteract.matchesSelector = utils.matchesSelector;\ninteract.closest = utils.closest;\n\n/*\\\n * interact.supportsTouch\n [ method ]\n *\n = (boolean) Whether or not the browser supports touch input\n\\*/\ninteract.supportsTouch = function () {\n return browser.supportsTouch;\n};\n\n/*\\\n * interact.supportsPointerEvent\n [ method ]\n *\n = (boolean) Whether or not the browser supports PointerEvents\n\\*/\ninteract.supportsPointerEvent = function () {\n return browser.supportsPointerEvent;\n};\n\n/*\\\n * interact.stop\n [ method ]\n *\n * Cancels all interactions (end events are not fired)\n *\n - event (Event) An event on which to call preventDefault()\n = (object) interact\n\\*/\ninteract.stop = function (event) {\n for (let i = scope.interactions.length - 1; i >= 0; i--) {\n scope.interactions[i].stop(event);\n }\n\n return interact;\n};\n\n/*\\\n * interact.pointerMoveTolerance\n [ method ]\n * Returns or sets the distance the pointer must be moved before an action\n * sequence occurs. This also affects tolerance for tap events.\n *\n - newValue (number) #optional The movement from the start position must be greater than this value\n = (number | Interactable) The current setting or interact\n\\*/\ninteract.pointerMoveTolerance = function (newValue) {\n if (utils.is.number(newValue)) {\n Interaction.pointerMoveTolerance = newValue;\n\n return this;\n }\n\n return Interaction.pointerMoveTolerance;\n};\n\ninteract.addDocument = scope.addDocument;\ninteract.removeDocument = scope.removeDocument;\n\nscope.interact = interact;\n\nmodule.exports = interact;\n","const Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\nconst scope = require('./scope');\nconst is = require('./utils/is');\nconst events = require('./utils/events');\n\nconst { nodeContains, matchesSelector } = require('./utils/domUtils');\n\n/*\\\n * Interactable.preventDefault\n [ method ]\n *\n * Returns or sets whether to prevent the browser's default behaviour\n * in response to pointer events. Can be set to:\n * - `'always'` to always prevent\n * - `'never'` to never prevent\n * - `'auto'` to let interact.js try to determine what would be best\n *\n - newValue (string) #optional `true`, `false` or `'auto'`\n = (string | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.preventDefault = function (newValue) {\n if (/^(always|never|auto)$/.test(newValue)) {\n this.options.preventDefault = newValue;\n return this;\n }\n\n if (is.bool(newValue)) {\n this.options.preventDefault = newValue? 'always' : 'never';\n return this;\n }\n\n return this.options.preventDefault;\n};\n\nInteractable.prototype.checkAndPreventDefault = function (event) {\n const setting = this.options.preventDefault;\n\n if (setting === 'never') { return; }\n\n if (setting === 'always') {\n event.preventDefault();\n return;\n }\n\n // setting === 'auto'\n\n // don't preventDefault if the browser supports passiveEvents\n // CSS touch-action and user-selecct should be used instead\n if (events.supportsOptions) {\n return;\n }\n\n // don't preventDefault of pointerdown events\n if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) {\n return;\n }\n\n // don't preventDefault on editable elements\n if (is.element(event.target)\n && matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) {\n return;\n }\n\n event.preventDefault();\n};\n\nfunction onInteractionEvent ({ interaction, event }) {\n if (interaction.target) {\n interaction.target.checkAndPreventDefault(event);\n }\n}\n\nfor (const eventSignal of ['down', 'move', 'up', 'cancel']) {\n Interaction.signals.on(eventSignal, onInteractionEvent);\n}\n\n// prevent native HTML5 drag on interact.js target elements\nInteraction.docEvents.dragstart = function preventNativeDrag (event) {\n for (const interaction of scope.interactions) {\n\n if (interaction.element\n && (interaction.element === event.target\n || nodeContains(interaction.element, event.target))) {\n\n interaction.target.checkAndPreventDefault(event);\n return;\n }\n }\n};\n","const scope = require('./scope');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst iFinder = require('./utils/interactionFinder');\nconst pointerEvents = require('./pointerEvents/base');\n\nconst { window } = require('./utils/window');\n\nconst toString = Object.prototype.toString;\n\nif (!window.Array.isArray) {\n window.Array.isArray = function (obj) {\n return toString.call(obj) === '[object Array]';\n };\n}\n\nif (!String.prototype.trim) {\n String.prototype.trim = function () {\n return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n };\n}\n\n// http://www.quirksmode.org/dom/events/click.html\n// >Events leading to dblclick\n//\n// IE8 doesn't fire down event before dblclick.\n// This workaround tries to fire a tap and doubletap after dblclick\nfunction onIE8Dblclick (event) {\n const eventTarget = event.target;\n const interaction = iFinder.search(event, event.type, eventTarget);\n\n if (!interaction) { return; }\n\n if (interaction.prevTap\n && event.clientX === interaction.prevTap.clientX\n && event.clientY === interaction.prevTap.clientY\n && eventTarget === interaction.prevTap.target) {\n\n interaction.downTargets[0] = eventTarget;\n interaction.downTimes [0] = new Date().getTime();\n\n pointerEvents.fire({\n interaction,\n event,\n eventTarget,\n pointer: event,\n type: 'tap',\n });\n }\n}\n\nif (browser.isIE8) {\n const selectFix = function (event) {\n for (const interaction of scope.interactions) {\n if (interaction.interacting()) {\n interaction.target.checkAndPreventDefault(event);\n }\n }\n };\n\n const onDocIE8 = function onDocIE8 ({ doc, win }, signalName) {\n const eventMethod = signalName.indexOf('listen') === 0\n ? events.add : events.remove;\n\n // For IE's lack of Event#preventDefault\n eventMethod(doc, 'selectstart', selectFix);\n\n if (pointerEvents) {\n eventMethod(doc, 'dblclick', onIE8Dblclick);\n }\n };\n\n scope.signals.on('add-document' , onDocIE8);\n scope.signals.on('remove-document', onDocIE8);\n}\n\nmodule.exports = null;\n","const InteractEvent = require('../InteractEvent');\nconst Interaction = require('../Interaction');\nconst extend = require('../utils/extend');\n\nconst modifiers = {\n names: [],\n\n setOffsets: function (arg) {\n const { interaction, pageCoords: page } = arg;\n const { target, element, startOffset } = interaction;\n const rect = target.getRect(element);\n\n if (rect) {\n startOffset.left = page.x - rect.left;\n startOffset.top = page.y - rect.top;\n\n startOffset.right = rect.right - page.x;\n startOffset.bottom = rect.bottom - page.y;\n\n if (!('width' in rect)) { rect.width = rect.right - rect.left; }\n if (!('height' in rect)) { rect.height = rect.bottom - rect.top ; }\n }\n else {\n startOffset.left = startOffset.top = startOffset.right = startOffset.bottom = 0;\n }\n\n arg.rect = rect;\n arg.interactable = target;\n arg.element = element;\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n\n arg.options = target.options[interaction.prepared.name][modifierName];\n\n if (!arg.options) {\n continue;\n }\n\n interaction.modifierOffsets[modifierName] = modifiers[modifierName].setOffset(arg);\n }\n },\n\n setAll: function (arg) {\n const { interaction, statuses, preEnd, requireEndOnly } = arg;\n const coords = extend({}, arg.pageCoords);\n const result = {\n dx: 0,\n dy: 0,\n changed: false,\n locked: false,\n shouldMove: true,\n };\n\n for (const modifierName of modifiers.names) {\n const modifier = modifiers[modifierName];\n const options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!shouldDo(options, preEnd, requireEndOnly)) { continue; }\n\n arg.status = arg.status = statuses[modifierName];\n arg.options = options;\n arg.offset = arg.interaction.modifierOffsets[modifierName];\n\n modifier.set(arg);\n\n if (arg.status.locked) {\n coords.x += arg.status.dx;\n coords.y += arg.status.dy;\n\n result.dx += arg.status.dx;\n result.dy += arg.status.dy;\n\n result.locked = true;\n }\n }\n\n // a move should be fired if:\n // - there are no modifiers enabled,\n // - no modifiers are \"locked\" i.e. have changed the pointer's coordinates, or\n // - the locked coords have changed since the last pointer move\n result.shouldMove = !arg.status || !result.locked || arg.status.changed;\n\n return result;\n },\n\n resetStatuses: function (statuses) {\n for (const modifierName of modifiers.names) {\n const status = statuses[modifierName] || {};\n\n status.dx = status.dy = 0;\n status.modifiedX = status.modifiedY = NaN;\n status.locked = false;\n status.changed = true;\n\n statuses[modifierName] = status;\n }\n\n return statuses;\n },\n\n start: function ({ interaction }, signalName) {\n const arg = {\n interaction,\n pageCoords: (signalName === 'action-resume' ?\n interaction.curCoords : interaction.startCoords).page,\n startOffset: interaction.startOffset,\n statuses: interaction.modifierStatuses,\n preEnd: false,\n requireEndOnly: false,\n };\n\n modifiers.setOffsets(arg);\n modifiers.resetStatuses(arg.statuses);\n\n arg.pageCoords = extend({}, interaction.startCoords.page);\n interaction.modifierResult = modifiers.setAll(arg);\n },\n};\n\nInteraction.signals.on('new', function (interaction) {\n interaction.startOffset = { left: 0, right: 0, top: 0, bottom: 0 };\n interaction.modifierOffsets = {};\n interaction.modifierStatuses = modifiers.resetStatuses({});\n interaction.modifierResult = null;\n});\n\nInteraction.signals.on('action-start' , modifiers.start);\nInteraction.signals.on('action-resume', modifiers.start);\n\nInteraction.signals.on('before-action-move', function ({ interaction, preEnd, interactingBeforeMove }) {\n const modifierResult = modifiers.setAll({\n interaction,\n preEnd,\n pageCoords: interaction.curCoords.page,\n statuses: interaction.modifierStatuses,\n requireEndOnly: false,\n });\n\n // don't fire an action move if a modifier would keep the event in the same\n // cordinates as before\n if (!modifierResult.shouldMove && interactingBeforeMove) {\n interaction._dontFireMove = true;\n }\n\n interaction.modifierResult = modifierResult;\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n for (let i = 0; i < modifiers.names.length; i++) {\n const options = interaction.target.options[interaction.prepared.name][modifiers.names[i]];\n\n // if the endOnly option is true for any modifier\n if (shouldDo(options, true, true)) {\n // fire a move event at the modified coordinates\n interaction.doMove({ event, preEnd: true });\n break;\n }\n }\n});\n\nInteractEvent.signals.on('set-xy', function (arg) {\n const { iEvent, interaction } = arg;\n const modifierArg = extend({}, arg);\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n modifierArg.options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!modifierArg.options) {\n continue;\n }\n\n const modifier = modifiers[modifierName];\n\n modifierArg.status = interaction.modifierStatuses[modifierName];\n\n iEvent[modifierName] = modifier.modifyCoords(modifierArg);\n }\n});\n\nfunction shouldDo (options, preEnd, requireEndOnly) {\n return (options && options.enabled\n && (preEnd || !options.endOnly)\n && (!requireEndOnly || options.endOnly));\n}\n\nmodule.exports = modifiers;\n","const modifiers = require('./index');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst restrict = {\n defaults: {\n enabled : false,\n endOnly : false,\n restriction: null,\n elementRect: null,\n },\n\n setOffset: function ({ rect, startOffset, options }) {\n const elementRect = options && options.elementRect;\n const offset = {};\n\n if (rect && elementRect) {\n offset.left = startOffset.left - (rect.width * elementRect.left);\n offset.top = startOffset.top - (rect.height * elementRect.top);\n\n offset.right = startOffset.right - (rect.width * (1 - elementRect.right));\n offset.bottom = startOffset.bottom - (rect.height * (1 - elementRect.bottom));\n }\n else {\n offset.left = offset.top = offset.right = offset.bottom = 0;\n }\n\n return offset;\n },\n\n set: function ({ pageCoords, interaction, status, options }) {\n if (!options) { return status; }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n\n const restriction = getRestrictionRect(options.restriction, interaction, page);\n\n if (!restriction) { return status; }\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n const rect = restriction;\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n const offset = interaction.modifierOffsets.restrict;\n\n // object is assumed to have\n // x, y, width, height or\n // left, top, right, bottom\n if ('x' in restriction && 'y' in restriction) {\n modifiedX = Math.max(Math.min(rect.x + rect.width - offset.right , page.x), rect.x + offset.left);\n modifiedY = Math.max(Math.min(rect.y + rect.height - offset.bottom, page.y), rect.y + offset.top );\n }\n else {\n modifiedX = Math.max(Math.min(rect.right - offset.right , page.x), rect.left + offset.left);\n modifiedY = Math.max(Math.min(rect.bottom - offset.bottom, page.y), rect.top + offset.top );\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const elementRect = options && options.elementRect;\n\n if (options && options.enabled\n && !(phase === 'start' && elementRect && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n getRestrictionRect,\n};\n\nfunction getRestrictionRect (value, interaction, page) {\n if (utils.is.function(value)) {\n return utils.resolveRectLike(value, interaction.target, interaction.element, [page.x, page.y, interaction]);\n } else {\n return utils.resolveRectLike(value, interaction.target, interaction.element);\n }\n}\n\nmodifiers.restrict = restrict;\nmodifiers.names.push('restrict');\n\ndefaultOptions.perAction.restrict = restrict.defaults;\n\nmodule.exports = restrict;\n","// This module adds the options.resize.restrictEdges setting which sets min and\n// max for the top, left, bottom and right edges of the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictEdges: {\n// inner: { top: 200, left: 200, right: 400, bottom: 400 },\n// outer: { top: 0, left: 0, right: 600, bottom: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst { getRestrictionRect } = require('./restrict');\n\nconst noInner = { top: +Infinity, left: +Infinity, bottom: -Infinity, right: -Infinity };\nconst noOuter = { top: -Infinity, left: -Infinity, bottom: +Infinity, right: +Infinity };\n\nconst restrictEdges = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n offset: null,\n },\n\n setOffset: function ({ interaction, startOffset, options }) {\n if (!options) {\n return utils.extend({}, startOffset);\n }\n\n const offset = getRestrictionRect(options.offset, interaction, interaction.startCoords.page);\n\n if (offset) {\n return {\n top: startOffset.top + offset.y,\n left: startOffset.left + offset.x,\n bottom: startOffset.bottom + offset.y,\n right: startOffset.right + offset.x,\n };\n }\n\n return startOffset;\n },\n\n set: function ({ pageCoords, interaction, status, offset, options }) {\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n const inner = rectUtils.xywhToTlbr(getRestrictionRect(options.inner, interaction, page)) || noInner;\n const outer = rectUtils.xywhToTlbr(getRestrictionRect(options.outer, interaction, page)) || noOuter;\n\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n if (edges.top) {\n modifiedY = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top);\n }\n else if (edges.bottom) {\n modifiedY = Math.max(Math.min(outer.bottom - offset.bottom, page.y), inner.bottom - offset.bottom);\n }\n if (edges.left) {\n modifiedX = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left);\n }\n else if (edges.right) {\n modifiedX = Math.max(Math.min(outer.right - offset.right, page.x), inner.right - offset.right);\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n if (options && options.enabled\n && !(phase === 'start' && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n noInner,\n noOuter,\n getRestrictionRect,\n};\n\nmodifiers.restrictEdges = restrictEdges;\nmodifiers.names.push('restrictEdges');\n\ndefaultOptions.perAction.restrictEdges = restrictEdges.defaults;\nresize.defaults.restrictEdges = restrictEdges.defaults;\n\nmodule.exports = restrictEdges;\n","// This module adds the options.resize.restrictSize setting which sets min and\n// max width and height for the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictSize: {\n// min: { width: -600, height: -600 },\n// max: { width: 600, height: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst restrictEdges = require('./restrictEdges');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst noMin = { width: -Infinity, height: -Infinity };\nconst noMax = { width: +Infinity, height: +Infinity };\n\nconst restrictSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n },\n\n setOffset: function ({ interaction }) {\n return interaction.startOffset;\n },\n\n set: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const rect = rectUtils.xywhToTlbr(interaction.resizeRects.inverted);\n\n const minSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.min, interaction)) || noMin;\n const maxSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.max, interaction)) || noMax;\n\n arg.options = {\n enabled: options.enabled,\n endOnly: options.endOnly,\n inner: utils.extend({}, restrictEdges.noInner),\n outer: utils.extend({}, restrictEdges.noOuter),\n };\n\n if (edges.top) {\n arg.options.inner.top = rect.bottom - minSize.height;\n arg.options.outer.top = rect.bottom - maxSize.height;\n }\n else if (edges.bottom) {\n arg.options.inner.bottom = rect.top + minSize.height;\n arg.options.outer.bottom = rect.top + maxSize.height;\n }\n if (edges.left) {\n arg.options.inner.left = rect.right - minSize.width;\n arg.options.outer.left = rect.right - maxSize.width;\n }\n else if (edges.right) {\n arg.options.inner.right = rect.left + minSize.width;\n arg.options.outer.right = rect.left + maxSize.width;\n }\n\n restrictEdges.set(arg);\n },\n\n modifyCoords: restrictEdges.modifyCoords,\n};\n\nmodifiers.restrictSize = restrictSize;\nmodifiers.names.push('restrictSize');\n\ndefaultOptions.perAction.restrictSize = restrictSize.defaults;\nresize.defaults.restrictSize = restrictSize.defaults;\n\nmodule.exports = restrictSize;\n","const modifiers = require('./index');\nconst interact = require('../interact');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst snap = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n\n relativePoints: null,\n },\n\n setOffset: function ({ interaction, interactable, element, rect, startOffset, options }) {\n const offsets = [];\n const optionsOrigin = utils.rectToXY(utils.resolveRectLike(options.origin));\n const origin = optionsOrigin || utils.getOriginXY(interactable, element, interaction.prepared.name);\n options = options || interactable.options[interaction.prepared.name].snap || {};\n\n let snapOffset;\n\n if (options.offset === 'startCoords') {\n snapOffset = {\n x: interaction.startCoords.page.x - origin.x,\n y: interaction.startCoords.page.y - origin.y,\n };\n }\n else {\n const offsetRect = utils.resolveRectLike(options.offset, interactable, element, [interaction]);\n\n snapOffset = utils.rectToXY(offsetRect) || { x: 0, y: 0 };\n }\n\n if (rect && options.relativePoints && options.relativePoints.length) {\n for (const { x: relativeX, y: relativeY } of options.relativePoints) {\n offsets.push({\n x: startOffset.left - (rect.width * relativeX) + snapOffset.x,\n y: startOffset.top - (rect.height * relativeY) + snapOffset.y,\n });\n }\n }\n else {\n offsets.push(snapOffset);\n }\n\n return offsets;\n },\n\n set: function ({ interaction, pageCoords, status, options, offset: offsets }) {\n const targets = [];\n let target;\n let page;\n let i;\n\n if (status.useStatusXY) {\n page = { x: status.x, y: status.y };\n }\n else {\n const origin = utils.getOriginXY(interaction.target, interaction.element, interaction.prepared.name);\n\n page = utils.extend({}, pageCoords);\n\n page.x -= origin.x;\n page.y -= origin.y;\n }\n\n status.realX = page.x;\n status.realY = page.y;\n\n let len = options.targets? options.targets.length : 0;\n\n for (const { x: offsetX, y: offsetY } of offsets) {\n const relativeX = page.x - offsetX;\n const relativeY = page.y - offsetY;\n\n for (const snapTarget of options.targets) {\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n targets.push({\n x: utils.is.number(target.x) ? (target.x + offsetX) : relativeX,\n y: utils.is.number(target.y) ? (target.y + offsetY) : relativeY,\n\n range: utils.is.number(target.range)? target.range: options.range,\n });\n }\n }\n\n const closest = {\n target: null,\n inRange: false,\n distance: 0,\n range: 0,\n dx: 0,\n dy: 0,\n };\n\n for (i = 0, len = targets.length; i < len; i++) {\n target = targets[i];\n\n const range = target.range;\n const dx = target.x - page.x;\n const dy = target.y - page.y;\n const distance = utils.hypot(dx, dy);\n let inRange = distance <= range;\n\n // Infinite targets count as being out of range\n // compared to non infinite ones that are in range\n if (range === Infinity && closest.inRange && closest.range !== Infinity) {\n inRange = false;\n }\n\n if (!closest.target || (inRange\n // is the closest target in range?\n ? (closest.inRange && range !== Infinity\n // the pointer is relatively deeper in this target\n ? distance / range < closest.distance / closest.range\n // this target has Infinite range and the closest doesn't\n : (range === Infinity && closest.range !== Infinity)\n // OR this target is closer that the previous closest\n || distance < closest.distance)\n // The other is not in range and the pointer is closer to this target\n : (!closest.inRange && distance < closest.distance))) {\n\n closest.target = target;\n closest.distance = distance;\n closest.range = range;\n closest.inRange = inRange;\n closest.dx = dx;\n closest.dy = dy;\n\n status.range = range;\n }\n }\n\n let snapChanged;\n\n if (closest.target) {\n snapChanged = (status.modifiedX !== closest.target.x || status.modifiedY !== closest.target.y);\n\n status.modifiedX = closest.target.x;\n status.modifiedY = closest.target.y;\n }\n else {\n snapChanged = true;\n\n status.modifiedX = NaN;\n status.modifiedY = NaN;\n }\n\n status.dx = closest.dx;\n status.dy = closest.dy;\n\n status.changed = (snapChanged || (closest.inRange && !status.locked));\n status.locked = closest.inRange;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const relativePoints = options && options.relativePoints;\n\n if (options && options.enabled\n && !(phase === 'start' && relativePoints && relativePoints.length)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n }\n\n return {\n range : status.range,\n locked : status.locked,\n x : status.modifiedX,\n y : status.modifiedY,\n realX : status.realX,\n realY : status.realY,\n dx : status.dx,\n dy : status.dy,\n };\n }\n },\n};\n\ninteract.createSnapGrid = function (grid) {\n return function (x, y) {\n const limits = grid.limits || {\n left : -Infinity,\n right : Infinity,\n top : -Infinity,\n bottom: Infinity,\n };\n let offsetX = 0;\n let offsetY = 0;\n\n if (utils.is.object(grid.offset)) {\n offsetX = grid.offset.x;\n offsetY = grid.offset.y;\n }\n\n const gridx = Math.round((x - offsetX) / grid.x);\n const gridy = Math.round((y - offsetY) / grid.y);\n\n const newX = Math.max(limits.left, Math.min(limits.right , gridx * grid.x + offsetX));\n const newY = Math.max(limits.top , Math.min(limits.bottom, gridy * grid.y + offsetY));\n\n return {\n x: newX,\n y: newY,\n range: grid.range,\n };\n };\n};\n\nmodifiers.snap = snap;\nmodifiers.names.push('snap');\n\ndefaultOptions.perAction.snap = snap.defaults;\n\nmodule.exports = snap;\n","// This module allows snapping of the size of targets during resize\n// interactions.\n\nconst modifiers = require('./index');\nconst snap = require('./snap');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\nconst utils = require('../utils/');\n\nconst snapSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n },\n\n setOffset: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.edges;\n\n if (!edges) { return; }\n\n arg.options = {\n relativePoints: [{\n x: edges.left? 0 : 1,\n y: edges.top ? 0 : 1,\n }],\n origin: { x: 0, y: 0 },\n offset: 'self',\n range: options.range,\n };\n\n const offsets = snap.setOffset(arg);\n arg.options = options;\n\n return offsets;\n },\n\n set: function (arg) {\n const { interaction, options, offset, pageCoords } = arg;\n const page = utils.extend({}, pageCoords);\n const relativeX = page.x - offset[0].x;\n const relativeY = page.y - offset[0].y;\n\n arg.options = utils.extend({}, options);\n arg.options.targets = [];\n\n for (const snapTarget of options.targets) {\n let target;\n\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n if ('width' in target && 'height' in target) {\n target.x = target.width;\n target.y = target.height;\n }\n\n arg.options.targets.push(target);\n }\n\n snap.set(arg);\n },\n\n modifyCoords: function (arg) {\n const { options } = arg;\n\n arg.options = utils.extend({}, options);\n arg.options.enabled = options.enabled;\n arg.options.relativePoints = [null];\n\n snap.modifyCoords(arg);\n },\n};\n\nmodifiers.snapSize = snapSize;\nmodifiers.names.push('snapSize');\n\ndefaultOptions.perAction.snapSize = snapSize.defaults;\nresize.defaults.snapSize = snapSize.defaults;\n\nmodule.exports = snapSize;\n","const pointerUtils = require('../utils/pointerUtils');\n\nmodule.exports = class PointerEvent {\n constructor (type, pointer, event, eventTarget, interaction) {\n pointerUtils.pointerExtend(this, event);\n\n if (event !== pointer) {\n pointerUtils.pointerExtend(this, pointer);\n }\n\n this.interaction = interaction;\n\n this.timeStamp = new Date().getTime();\n this.originalEvent = event;\n this.type = type;\n this.pointerId = pointerUtils.getPointerId(pointer);\n this.pointerType = pointerUtils.getPointerType(pointer, interaction);\n this.target = eventTarget;\n this.currentTarget = null;\n\n if (type === 'tap') {\n const pointerIndex = interaction.getPointerIndex(pointer);\n this.dt = this.timeStamp - interaction.downTimes[pointerIndex];\n\n const interval = this.timeStamp - interaction.tapTime;\n\n this.double = !!(interaction.prevTap\n && interaction.prevTap.type !== 'doubletap'\n && interaction.prevTap.target === this.target\n && interval < 500);\n }\n else if (type === 'doubletap') {\n this.dt = pointer.timeStamp - interaction.tapTime;\n }\n }\n\n subtractOrigin ({ x: originX, y: originY }) {\n this.pageX -= originX;\n this.pageY -= originY;\n this.clientX -= originX;\n this.clientY -= originY;\n\n return this;\n }\n\n addOrigin ({ x: originX, y: originY }) {\n this.pageX += originX;\n this.pageY += originY;\n this.clientX += originX;\n this.clientY += originY;\n\n return this;\n }\n\n preventDefault () {\n this.originalEvent.preventDefault();\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n};\n","const PointerEvent = require('./PointerEvent');\nconst Interaction = require('../Interaction');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst defaults = require('../defaultOptions');\nconst signals = require('../utils/Signals').new();\nconst { filter } = require('../utils/arr');\n\nconst simpleSignals = [ 'down', 'up', 'cancel' ];\nconst simpleEvents = [ 'down', 'up', 'cancel' ];\n\nconst pointerEvents = {\n PointerEvent,\n fire,\n collectEventTargets,\n signals,\n defaults: {\n holdDuration: 600,\n ignoreFrom : null,\n allowFrom : null,\n origin : { x: 0, y: 0 },\n },\n types: [\n 'down',\n 'move',\n 'up',\n 'cancel',\n 'tap',\n 'doubletap',\n 'hold',\n ],\n};\n\nfunction fire (arg) {\n const {\n interaction, pointer, event, eventTarget,\n type = arg.pointerEvent.type,\n targets = collectEventTargets(arg),\n pointerEvent = new PointerEvent(type, pointer, event, eventTarget, interaction),\n } = arg;\n\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n targets,\n type,\n pointerEvent,\n };\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n\n for (const prop in target.props || {}) {\n pointerEvent[prop] = target.props[prop];\n }\n\n const origin = utils.getOriginXY(target.eventable, target.element);\n\n pointerEvent.subtractOrigin(origin);\n pointerEvent.eventable = target.eventable;\n pointerEvent.currentTarget = target.element;\n\n target.eventable.fire(pointerEvent);\n\n pointerEvent.addOrigin(origin);\n\n if (pointerEvent.immediatePropagationStopped\n || (pointerEvent.propagationStopped\n && (i + 1) < targets.length && targets[i + 1].element !== pointerEvent.currentTarget)) {\n break;\n }\n }\n\n signals.fire('fired', signalArg);\n\n if (type === 'tap') {\n // if pointerEvent should make a double tap, create and fire a doubletap\n // PointerEvent and use that as the prevTap\n const prevTap = pointerEvent.double\n ? fire({\n interaction, pointer, event, eventTarget,\n type: 'doubletap',\n })\n : pointerEvent;\n\n interaction.prevTap = prevTap;\n interaction.tapTime = prevTap.timeStamp;\n }\n\n return pointerEvent;\n}\n\nfunction collectEventTargets ({ interaction, pointer, event, eventTarget, type }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n // do not fire a tap event if the pointer was moved before being lifted\n if (type === 'tap' && (interaction.pointerWasMoved\n // or if the pointerup target is different to the pointerdown target\n || !(interaction.downTargets[pointerIndex] && interaction.downTargets[pointerIndex] === eventTarget))) {\n return [];\n }\n\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n path,\n targets: [],\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (type === 'hold') {\n signalArg.targets = filter(signalArg.targets, target =>\n target.eventable.options.holdDuration === interaction.holdTimers[pointerIndex].duration);\n }\n\n return signalArg.targets;\n}\n\nInteraction.signals.on('update-pointer-down', function ({ interaction, pointerIndex }) {\n interaction.holdTimers[pointerIndex] = { duration: Infinity, timeout: null };\n});\n\nInteraction.signals.on('remove-pointer', function ({ interaction, pointerIndex }) {\n interaction.holdTimers.splice(pointerIndex, 1);\n});\n\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget, duplicateMove }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n if (!duplicateMove && (!interaction.pointerIsDown || interaction.pointerWasMoved)) {\n if (interaction.pointerIsDown) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n\n fire({\n interaction, pointer, event, eventTarget,\n type: 'move',\n });\n }\n});\n\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget, pointerIndex }) {\n // copy event to be used in timeout for IE8\n const eventCopy = browser.isIE8? utils.extend({}, event) : event;\n\n const timer = interaction.holdTimers[pointerIndex];\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'hold',\n targets: [],\n path,\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (!signalArg.targets.length) { return; }\n\n let minDuration = Infinity;\n\n for (let i = 0; i < signalArg.targets.length; i++) {\n const target = signalArg.targets[i];\n const holdDuration = target.eventable.options.holdDuration;\n\n if (holdDuration < minDuration) {\n minDuration = holdDuration;\n }\n }\n\n timer.duration = minDuration;\n timer.timeout = setTimeout(function () {\n fire({\n interaction, eventCopy, eventTarget,\n pointer: browser.isIE8? eventCopy : pointer,\n type: 'hold',\n });\n }, minDuration);\n});\n\nInteraction.signals.on('up', ({ interaction, pointer, event, eventTarget }) => {\n if (!interaction.pointerWasMoved) {\n fire({ interaction, eventTarget, pointer, event, type: 'tap' });\n }\n});\n\n['up', 'cancel'].forEach(function (signalName) {\n Interaction.signals.on(signalName, function ({ interaction, pointerIndex }) {\n if (interaction.holdTimers[pointerIndex]) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n });\n});\n\nfunction createSignalListener (type) {\n return function ({ interaction, pointer, event, eventTarget }) {\n fire({ interaction, eventTarget, pointer, event, type });\n };\n}\n\nfor (let i = 0; i < simpleSignals.length; i++) {\n Interaction.signals.on(simpleSignals[i], createSignalListener(simpleEvents[i]));\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.prevTap = null; // the most recent tap event on this interaction\n interaction.tapTime = 0; // time of the most recent tap event\n interaction.holdTimers = []; // [{ duration, timeout }]\n});\n\ndefaults.pointerEvents = pointerEvents.defaults;\nmodule.exports = pointerEvents;\n","const pointerEvents = require('./base');\nconst Interaction = require('../Interaction');\n\npointerEvents.signals.on('new', onNew);\npointerEvents.signals.on('fired', onFired);\n\nfor (const signal of ['move', 'up', 'cancel', 'endall']) {\n Interaction.signals.on(signal, endHoldRepeat);\n}\n\nfunction onNew ({ pointerEvent }) {\n if (pointerEvent.type !== 'hold') { return; }\n\n pointerEvent.count = (pointerEvent.count || 0) + 1;\n}\n\nfunction onFired ({ interaction, pointerEvent, eventTarget, targets }) {\n if (pointerEvent.type !== 'hold' || !targets.length) { return; }\n\n // get the repeat interval from the first eventable\n const interval = targets[0].eventable.options.holdRepeatInterval;\n\n // don't repeat if the interval is 0 or less\n if (interval <= 0) { return; }\n\n // set a timeout to fire the holdrepeat event\n interaction.holdIntervalHandle = setTimeout(function () {\n pointerEvents.fire({\n interaction,\n eventTarget,\n type: 'hold',\n pointer: pointerEvent,\n event: pointerEvent,\n });\n }, interval);\n}\n\nfunction endHoldRepeat ({ interaction }) {\n // set the interaction's holdStopTime property\n // to stop further holdRepeat events\n if (interaction.holdIntervalHandle) {\n clearInterval(interaction.holdIntervalHandle);\n interaction.holdIntervalHandle = null;\n }\n}\n\n// don't repeat by default\npointerEvents.defaults.holdRepeatInterval = 0;\npointerEvents.types.push('holdrepeat');\n\nmodule.exports = {\n onNew,\n onFired,\n endHoldRepeat,\n};\n","const pointerEvents = require('./base');\nconst Interactable = require('../Interactable');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\nconst scope = require('../scope');\nconst extend = require('../utils/extend');\nconst { merge } = require('../utils/arr');\n\npointerEvents.signals.on('collect-targets', function ({ targets, element, type, eventTarget }) {\n function collectSelectors (interactable, selector, context) {\n const els = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && is.element(element)\n && domUtils.matchesSelector(element, selector, els)\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n const interactable = scope.interactables.get(element);\n\n if (interactable) {\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n scope.interactables.forEachSelector(collectSelectors, element);\n});\n\nInteractable.signals.on('new', function ({ interactable }) {\n interactable.events.getRect = function (element) {\n return interactable.getRect(element);\n };\n});\n\nInteractable.signals.on('set', function ({ interactable, options }) {\n extend(interactable.events.options, pointerEvents.defaults);\n extend(interactable.events.options, options);\n});\n\nmerge(Interactable.eventTypes, pointerEvents.types);\n\nInteractable.prototype.pointerEvents = function (options) {\n extend(this.events.options, options);\n\n return this;\n};\n\nconst __backCompatOption = Interactable.prototype._backCompatOption;\n\nInteractable.prototype._backCompatOption = function (optionName, newValue) {\n const ret = __backCompatOption.call(this, optionName, newValue);\n\n if (ret === this) {\n this.events.options[optionName] = newValue;\n }\n\n return ret;\n};\n\nInteractable.settingsMethods.push('pointerEvents');\n","const utils = require('./utils');\nconst events = require('./utils/events');\nconst signals = require('./utils/Signals').new();\n\nconst scope = {\n signals,\n events,\n utils,\n\n // main document\n document: require('./utils/domObjects').document,\n // all documents being listened to\n documents: [],\n\n addDocument: function (doc, win) {\n // do nothing if document is already known\n if (utils.contains(scope.documents, doc)) { return false; }\n\n win = win || scope.getWindow(doc);\n\n scope.documents.push(doc);\n events.documents.push(doc);\n\n // don't add an unload event for the main document\n // so that the page may be cached in browser history\n if (doc !== scope.document) {\n events.add(win, 'unload', scope.onWindowUnload);\n }\n\n signals.fire('add-document', { doc, win });\n },\n\n removeDocument: function (doc, win) {\n const index = utils.indexOf(scope.documents, doc);\n\n win = win || scope.getWindow(doc);\n\n events.remove(win, 'unload', scope.onWindowUnload);\n\n scope.documents.splice(index, 1);\n events.documents.splice(index, 1);\n\n signals.fire('remove-document', { win, doc });\n },\n\n onWindowUnload: function () {\n scope.removeDocument(this.document, this);\n },\n};\n\nmodule.exports = scope;\n","const { indexOf } = require('./arr');\n\nclass Signals {\n constructor () {\n this.listeners = {\n // signalName: [listeners],\n };\n }\n\n on (name, listener) {\n if (!this.listeners[name]) {\n this.listeners[name] = [listener];\n return;\n }\n\n this.listeners[name].push(listener);\n }\n\n off (name, listener) {\n if (!this.listeners[name]) { return; }\n\n const index = indexOf(this.listeners[name], listener);\n\n if (index !== -1) {\n this.listeners[name].splice(index, 1);\n }\n }\n\n fire (name, arg) {\n const targetListeners = this.listeners[name];\n\n if (!targetListeners) { return; }\n\n for (let i = 0; i < targetListeners.length; i++) {\n if (targetListeners[i](arg, name) === false) {\n return;\n }\n }\n }\n}\n\nSignals.new = function () {\n return new Signals();\n};\n\nmodule.exports = Signals;\n","function indexOf (array, target) {\n for (let i = 0, len = array.length; i < len; i++) {\n if (array[i] === target) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction contains (array, target) {\n return indexOf(array, target) !== -1;\n}\n\nfunction merge (target, source) {\n for (let i = 0; i < source.length; i++) {\n target.push(source[i]);\n }\n\n return target;\n}\n\nfunction filter (array, test) {\n const result = [];\n\n for (let i = 0; i < array.length; i++) {\n if (test(array[i])) {\n result.push(array[i]);\n }\n }\n\n return result;\n}\n\nmodule.exports = {\n indexOf,\n contains,\n merge,\n filter,\n};\n","const { window } = require('./window');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst Element = domObjects.Element;\nconst navigator = window.navigator;\n\nconst browser = {\n // Does the browser support touch input?\n supportsTouch: !!(('ontouchstart' in window) || is.function(window.DocumentTouch)\n && domObjects.document instanceof window.DocumentTouch),\n\n // Does the browser support PointerEvents\n supportsPointerEvent: !!domObjects.PointerEvent,\n\n isIE8: ('attachEvent' in window) && !('addEventListener' in window),\n\n // Opera Mobile must be handled differently\n isOperaMobile: (navigator.appName === 'Opera'\n && browser.supportsTouch\n && navigator.userAgent.match('Presto')),\n\n // scrolling doesn't change the result of getClientRects on iOS 7\n isIOS7: (/iP(hone|od|ad)/.test(navigator.platform)\n && /OS 7[^\\d]/.test(navigator.appVersion)),\n\n isIe9OrOlder: /MSIE (8|9)/.test(navigator.userAgent),\n\n // prefix matchesSelector\n prefixedMatchesSelector: 'matches' in Element.prototype\n ? 'matches': 'webkitMatchesSelector' in Element.prototype\n ? 'webkitMatchesSelector': 'mozMatchesSelector' in Element.prototype\n ? 'mozMatchesSelector': 'oMatchesSelector' in Element.prototype\n ? 'oMatchesSelector': 'msMatchesSelector',\n\n useMatchesSelectorPolyfill: false,\n\n pEventTypes: (domObjects.PointerEvent\n ? (domObjects.PointerEvent === window.MSPointerEvent\n ? {\n up: 'MSPointerUp',\n down: 'MSPointerDown',\n over: 'mouseover',\n out: 'mouseout',\n move: 'MSPointerMove',\n cancel: 'MSPointerCancel',\n }\n : {\n up: 'pointerup',\n down: 'pointerdown',\n over: 'pointerover',\n out: 'pointerout',\n move: 'pointermove',\n cancel: 'pointercancel',\n })\n : null),\n\n // because Webkit and Opera still use 'mousewheel' event type\n wheelEvent: 'onmousewheel' in domObjects.document? 'mousewheel': 'wheel',\n\n};\n\nbrowser.useMatchesSelectorPolyfill = !is.function(Element.prototype[browser.prefixedMatchesSelector]);\n\nmodule.exports = browser;\n","const domObjects = {};\nconst win = require('./window').window;\n\nfunction blank () {}\n\ndomObjects.document = win.document;\ndomObjects.DocumentFragment = win.DocumentFragment || blank;\ndomObjects.SVGElement = win.SVGElement || blank;\ndomObjects.SVGSVGElement = win.SVGSVGElement || blank;\ndomObjects.SVGElementInstance = win.SVGElementInstance || blank;\ndomObjects.Element = win.Element || blank;\ndomObjects.HTMLElement = win.HTMLElement || domObjects.Element;\n\ndomObjects.Event = win.Event;\ndomObjects.Touch = win.Touch || blank;\ndomObjects.PointerEvent = (win.PointerEvent || win.MSPointerEvent);\n\nmodule.exports = domObjects;\n","const win = require('./window');\nconst browser = require('./browser');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst domUtils = {\n nodeContains: function (parent, child) {\n while (child) {\n if (child === parent) {\n return true;\n }\n\n child = child.parentNode;\n }\n\n return false;\n },\n\n closest: function (element, selector) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) { return element; }\n\n element = domUtils.parentNode(element);\n }\n\n return null;\n },\n\n parentNode: function (node) {\n let parent = node.parentNode;\n\n if (is.docFrag(parent)) {\n // skip past #shado-root fragments\n while ((parent = parent.host) && is.docFrag(parent)) {\n continue;\n }\n\n return parent;\n }\n\n return parent;\n },\n\n // taken from http://tanalin.com/en/blog/2012/12/matches-selector-ie8/ and modified\n matchesSelectorPolyfill: browser.useMatchesSelectorPolyfill\n ? function (element, selector, elems) {\n elems = elems || element.parentNode.querySelectorAll(selector);\n\n for (let i = 0, len = elems.length; i < len; i++) {\n if (elems[i] === element) {\n return true;\n }\n }\n\n return false;\n }\n : null,\n\n matchesSelector: function (element, selector, nodeList) {\n if (browser.useMatchesSelectorPolyfill) {\n return domUtils.matchesSelectorPolyfill(element, selector, nodeList);\n }\n\n // remove /deep/ from selectors if shadowDOM polyfill is used\n if (win.window !== win.realWindow) {\n selector = selector.replace(/\\/deep\\//g, ' ');\n }\n\n return element[browser.prefixedMatchesSelector](selector);\n },\n\n // Test for the element that's \"above\" all other qualifiers\n indexOfDeepestElement: function (elements) {\n let deepestZoneParents = [];\n let dropzoneParents = [];\n let dropzone;\n let deepestZone = elements[0];\n let index = deepestZone? 0: -1;\n let parent;\n let child;\n let i;\n let n;\n\n for (i = 1; i < elements.length; i++) {\n dropzone = elements[i];\n\n // an element might belong to multiple selector dropzones\n if (!dropzone || dropzone === deepestZone) {\n continue;\n }\n\n if (!deepestZone) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n // check if the deepest or current are document.documentElement or document.rootElement\n // - if the current dropzone is, do nothing and continue\n if (dropzone.parentNode === dropzone.ownerDocument) {\n continue;\n }\n // - if deepest is, update with the current dropzone and continue to next\n else if (deepestZone.parentNode === dropzone.ownerDocument) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n if (!deepestZoneParents.length) {\n parent = deepestZone;\n while (parent.parentNode && parent.parentNode !== parent.ownerDocument) {\n deepestZoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n }\n\n // if this element is an svg element and the current deepest is\n // an HTMLElement\n if (deepestZone instanceof domObjects.HTMLElement\n && dropzone instanceof domObjects.SVGElement\n && !(dropzone instanceof domObjects.SVGSVGElement)) {\n\n if (dropzone === deepestZone.parentNode) {\n continue;\n }\n\n parent = dropzone.ownerSVGElement;\n }\n else {\n parent = dropzone;\n }\n\n dropzoneParents = [];\n\n while (parent.parentNode !== parent.ownerDocument) {\n dropzoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n\n n = 0;\n\n // get (position of last common ancestor) + 1\n while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) {\n n++;\n }\n\n const parents = [\n dropzoneParents[n - 1],\n dropzoneParents[n],\n deepestZoneParents[n],\n ];\n\n child = parents[0].lastChild;\n\n while (child) {\n if (child === parents[1]) {\n deepestZone = dropzone;\n index = i;\n deepestZoneParents = [];\n\n break;\n }\n else if (child === parents[2]) {\n break;\n }\n\n child = child.previousSibling;\n }\n }\n\n return index;\n },\n\n matchesUpTo: function (element, selector, limit) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) {\n return true;\n }\n\n element = domUtils.parentNode(element);\n\n if (element === limit) {\n return domUtils.matchesSelector(element, selector);\n }\n }\n\n return false;\n },\n\n getActualElement: function (element) {\n return (element instanceof domObjects.SVGElementInstance\n ? element.correspondingUseElement\n : element);\n },\n\n getScrollXY: function (relevantWindow) {\n relevantWindow = relevantWindow || win.window;\n return {\n x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft,\n y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop,\n };\n },\n\n getElementClientRect: function (element) {\n const clientRect = (element instanceof domObjects.SVGElement\n ? element.getBoundingClientRect()\n : element.getClientRects()[0]);\n\n return clientRect && {\n left : clientRect.left,\n right : clientRect.right,\n top : clientRect.top,\n bottom: clientRect.bottom,\n width : clientRect.width || clientRect.right - clientRect.left,\n height: clientRect.height || clientRect.bottom - clientRect.top,\n };\n },\n\n getElementRect: function (element) {\n const clientRect = domUtils.getElementClientRect(element);\n\n if (!browser.isIOS7 && clientRect) {\n const scroll = domUtils.getScrollXY(win.getWindow(element));\n\n clientRect.left += scroll.x;\n clientRect.right += scroll.x;\n clientRect.top += scroll.y;\n clientRect.bottom += scroll.y;\n }\n\n return clientRect;\n },\n\n getPath: function (element) {\n const path = [];\n\n while (element) {\n path.push(element);\n element = domUtils.parentNode(element);\n }\n\n return path;\n },\n\n trySelector: value => {\n if (!is.string(value)) { return false; }\n\n // an exception will be raised if it is invalid\n domObjects.document.querySelector(value);\n return true;\n },\n};\n\nmodule.exports = domUtils;\n","const is = require('./is');\nconst domUtils = require('./domUtils');\nconst pExtend = require('./pointerExtend');\n\nconst { window, getWindow } = require('./window');\nconst { indexOf, contains } = require('./arr');\n\nconst useAttachEvent = ('attachEvent' in window) && !('addEventListener' in window);\nconst addEvent = useAttachEvent? 'attachEvent': 'addEventListener';\nconst removeEvent = useAttachEvent? 'detachEvent': 'removeEventListener';\nconst on = useAttachEvent? 'on': '';\n\nconst elements = [];\nconst targets = [];\nconst attachedListeners = [];\n\n// {\n// type: {\n// selectors: ['selector', ...],\n// contexts : [document, ...],\n// listeners: [[listener, capture, passive], ...]\n// }\n// }\nconst delegatedEvents = {};\n\nconst documents = [];\n\nconst supportsOptions = !useAttachEvent && (() => {\n let supported = false;\n\n window.document.createElement('div').addEventListener('test', null, {\n get capture () { supported = true; },\n });\n\n return supported;\n})();\n\nfunction add (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n let elementIndex = indexOf(elements, element);\n let target = targets[elementIndex];\n\n if (!target) {\n target = {\n events: {},\n typeCount: 0,\n };\n\n elementIndex = elements.push(element) - 1;\n targets.push(target);\n\n attachedListeners.push(useAttachEvent\n ? {\n supplied: [],\n wrapped : [],\n useCount: [],\n }\n : null);\n }\n\n if (!target.events[type]) {\n target.events[type] = [];\n target.typeCount++;\n }\n\n if (!contains(target.events[type], listener)) {\n let ret;\n\n if (useAttachEvent) {\n const { supplied, wrapped, useCount } = attachedListeners[elementIndex];\n const listenerIndex = indexOf(supplied, listener);\n\n const wrappedListener = wrapped[listenerIndex] || function (event) {\n if (!event.immediatePropagationStopped) {\n event.target = event.srcElement;\n event.currentTarget = element;\n\n event.preventDefault = event.preventDefault || preventDef;\n event.stopPropagation = event.stopPropagation || stopProp;\n event.stopImmediatePropagation = event.stopImmediatePropagation || stopImmProp;\n\n if (/mouse|click/.test(event.type)) {\n event.pageX = event.clientX + getWindow(element).document.documentElement.scrollLeft;\n event.pageY = event.clientY + getWindow(element).document.documentElement.scrollTop;\n }\n\n listener(event);\n }\n };\n\n ret = element[addEvent](on + type, wrappedListener, !!options.capture);\n\n if (listenerIndex === -1) {\n supplied.push(listener);\n wrapped.push(wrappedListener);\n useCount.push(1);\n }\n else {\n useCount[listenerIndex]++;\n }\n }\n else {\n ret = element[addEvent](type, listener, supportsOptions? options : !!options.capture);\n }\n target.events[type].push(listener);\n\n return ret;\n }\n}\n\nfunction remove (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const elementIndex = indexOf(elements, element);\n const target = targets[elementIndex];\n\n if (!target || !target.events) {\n return;\n }\n\n let wrappedListener = listener;\n let listeners;\n let listenerIndex;\n\n if (useAttachEvent) {\n listeners = attachedListeners[elementIndex];\n listenerIndex = indexOf(listeners.supplied, listener);\n wrappedListener = listeners.wrapped[listenerIndex];\n }\n\n if (type === 'all') {\n for (type in target.events) {\n if (target.events.hasOwnProperty(type)) {\n remove(element, type, 'all');\n }\n }\n return;\n }\n\n if (target.events[type]) {\n const len = target.events[type].length;\n\n if (listener === 'all') {\n for (let i = 0; i < len; i++) {\n remove(element, type, target.events[type][i], options);\n }\n return;\n }\n else {\n for (let i = 0; i < len; i++) {\n if (target.events[type][i] === listener) {\n element[removeEvent](on + type, wrappedListener, supportsOptions? options : !!options.capture);\n target.events[type].splice(i, 1);\n\n if (useAttachEvent && listeners) {\n listeners.useCount[listenerIndex]--;\n if (listeners.useCount[listenerIndex] === 0) {\n listeners.supplied.splice(listenerIndex, 1);\n listeners.wrapped.splice(listenerIndex, 1);\n listeners.useCount.splice(listenerIndex, 1);\n }\n }\n\n break;\n }\n }\n }\n\n if (target.events[type] && target.events[type].length === 0) {\n target.events[type] = null;\n target.typeCount--;\n }\n }\n\n if (!target.typeCount) {\n targets.splice(elementIndex, 1);\n elements.splice(elementIndex, 1);\n attachedListeners.splice(elementIndex, 1);\n }\n}\n\nfunction addDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n if (!delegatedEvents[type]) {\n delegatedEvents[type] = {\n selectors: [],\n contexts : [],\n listeners: [],\n };\n\n // add delegate listener functions\n for (let i = 0; i < documents.length; i++) {\n add(documents[i], type, delegateListener);\n add(documents[i], type, delegateUseCapture, true);\n }\n }\n\n const delegated = delegatedEvents[type];\n let index;\n\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n break;\n }\n }\n\n if (index === -1) {\n index = delegated.selectors.length;\n\n delegated.selectors.push(selector);\n delegated.contexts .push(context);\n delegated.listeners.push([]);\n }\n\n // keep listener and capture and passive flags\n delegated.listeners[index].push([listener, !!options.capture, options.passive]);\n}\n\nfunction removeDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const delegated = delegatedEvents[type];\n let matchFound = false;\n let index;\n\n if (!delegated) { return; }\n\n // count from last index of delegated to 0\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n // look for matching selector and context Node\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n\n const listeners = delegated.listeners[index];\n\n // each item of the listeners array is an array: [function, capture, passive]\n for (let i = listeners.length - 1; i >= 0; i--) {\n const [fn, capture, passive] = listeners[i];\n\n // check if the listener functions and capture and passive flags match\n if (fn === listener && capture === !!options.capture && passive === options.passive) {\n // remove the listener from the array of listeners\n listeners.splice(i, 1);\n\n // if all listeners for this interactable have been removed\n // remove the interactable from the delegated arrays\n if (!listeners.length) {\n delegated.selectors.splice(index, 1);\n delegated.contexts .splice(index, 1);\n delegated.listeners.splice(index, 1);\n\n // remove delegate function from context\n remove(context, type, delegateListener);\n remove(context, type, delegateUseCapture, true);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegatedEvents[type] = null;\n }\n }\n\n // only remove one listener\n matchFound = true;\n break;\n }\n }\n\n if (matchFound) { break; }\n }\n }\n}\n\n// bound to the interactable context when a DOM event\n// listener is added to a selector interactable\nfunction delegateListener (event, optionalArg) {\n const options = getOptions(optionalArg);\n const fakeEvent = {};\n const delegated = delegatedEvents[event.type];\n const eventTarget = (domUtils.getActualElement(event.path\n ? event.path[0]\n : event.target));\n let element = eventTarget;\n\n // duplicate the event so that currentTarget can be changed\n pExtend(fakeEvent, event);\n\n fakeEvent.originalEvent = event;\n fakeEvent.preventDefault = preventOriginalDefault;\n\n // climb up document tree looking for selector matches\n while (is.element(element)) {\n for (let i = 0; i < delegated.selectors.length; i++) {\n const selector = delegated.selectors[i];\n const context = delegated.contexts[i];\n\n if (domUtils.matchesSelector(element, selector)\n && domUtils.nodeContains(context, eventTarget)\n && domUtils.nodeContains(context, element)) {\n\n const listeners = delegated.listeners[i];\n\n fakeEvent.currentTarget = element;\n\n for (let j = 0; j < listeners.length; j++) {\n const [fn, capture, passive] = listeners[j];\n\n if (capture === !!options.capture && passive === options.passive) {\n fn(fakeEvent);\n }\n }\n }\n }\n\n element = domUtils.parentNode(element);\n }\n}\n\nfunction delegateUseCapture (event) {\n return delegateListener.call(this, event, true);\n}\n\nfunction preventDef () {\n this.returnValue = false;\n}\n\nfunction preventOriginalDefault () {\n this.originalEvent.preventDefault();\n}\n\nfunction stopProp () {\n this.cancelBubble = true;\n}\n\nfunction stopImmProp () {\n this.cancelBubble = true;\n this.immediatePropagationStopped = true;\n}\n\nfunction getOptions (param) {\n return is.object(param)? param : { capture: param };\n}\n\nmodule.exports = {\n add,\n remove,\n\n addDelegate,\n removeDelegate,\n\n delegateListener,\n delegateUseCapture,\n delegatedEvents,\n documents,\n\n useAttachEvent,\n supportsOptions,\n\n _elements: elements,\n _targets: targets,\n _attachedListeners: attachedListeners,\n};\n","module.exports = function extend (dest, source) {\n for (const prop in source) {\n dest[prop] = source[prop];\n }\n return dest;\n};\n","const {\n resolveRectLike,\n rectToXY,\n} = require('./rect');\n\nmodule.exports = function (target, element, action) {\n const actionOptions = target.options[action];\n const actionOrigin = actionOptions && actionOptions.origin;\n const origin = actionOrigin || target.options.origin;\n\n const originRect = resolveRectLike(origin, target, element, [target && element]);\n\n return rectToXY(originRect) || { x: 0, y: 0 };\n};\n","module.exports = (x, y) => Math.sqrt(x * x + y * y);\n","const extend = require('./extend');\nconst win = require('./window');\n\nconst utils = {\n warnOnce: function (method, message) {\n let warned = false;\n\n return function () {\n if (!warned) {\n win.window.console.warn(message);\n warned = true;\n }\n\n return method.apply(this, arguments);\n };\n },\n\n // http://stackoverflow.com/a/5634528/2280888\n _getQBezierValue: function (t, p1, p2, p3) {\n const iT = 1 - t;\n return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3;\n },\n\n getQuadraticCurvePoint: function (startX, startY, cpX, cpY, endX, endY, position) {\n return {\n x: utils._getQBezierValue(position, startX, cpX, endX),\n y: utils._getQBezierValue(position, startY, cpY, endY),\n };\n },\n\n // http://gizma.com/easing/\n easeOutQuad: function (t, b, c, d) {\n t /= d;\n return -c * t*(t-2) + b;\n },\n\n copyAction: function (dest, src) {\n dest.name = src.name;\n dest.axis = src.axis;\n dest.edges = src.edges;\n\n return dest;\n },\n\n is : require('./is'),\n extend : extend,\n hypot : require('./hypot'),\n getOriginXY: require('./getOriginXY'),\n};\n\nextend(utils, require('./arr'));\nextend(utils, require('./domUtils'));\nextend(utils, require('./pointerUtils'));\nextend(utils, require('./rect'));\n\nmodule.exports = utils;\n","const scope = require('../scope');\nconst utils = require('./index');\nconst browser = require('./browser');\n\nconst finder = {\n methodOrder: [ 'simulationResume', 'mouse', 'hasPointer', 'idle' ],\n\n search: function (pointer, eventType, eventTarget) {\n const mouseEvent = (/mouse/i.test(pointer.pointerType || eventType)\n // MSPointerEvent.MSPOINTER_TYPE_MOUSE\n || pointer.pointerType === 4);\n const pointerId = utils.getPointerId(pointer);\n const details = { pointer, pointerId, mouseEvent, eventType, eventTarget };\n\n for (const method of finder.methodOrder) {\n const interaction = finder[method](details);\n\n if (interaction) {\n return interaction;\n }\n }\n },\n\n // try to resume simulation with a new pointer\n simulationResume: function ({ mouseEvent, eventType, eventTarget }) {\n if (!/down|start/i.test(eventType)) {\n return null;\n }\n\n for (const interaction of scope.interactions) {\n let element = eventTarget;\n\n if (interaction.simulation && interaction.simulation.allowResume\n && (interaction.mouse === mouseEvent)) {\n while (element) {\n // if the element is the interaction element\n if (element === interaction.element) {\n return interaction;\n }\n element = utils.parentNode(element);\n }\n }\n }\n\n return null;\n },\n\n // if it's a mouse interaction\n mouse: function ({ pointerId, mouseEvent, eventType }) {\n if (!mouseEvent && (browser.supportsTouch || browser.supportsPointerEvent)) {\n return null;\n }\n\n let firstNonActive;\n\n for (const interaction of scope.interactions) {\n if (interaction.mouse) {\n // if it's a down event, skip interactions with running simulations\n if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; }\n\n // if the interaction is active, return it immediately\n if (interaction.interacting()) {\n return interaction;\n }\n // otherwise save it and look for another active interaction\n else if (!firstNonActive) {\n firstNonActive = interaction;\n }\n }\n }\n\n // if no active mouse interaction was found use the first inactive mouse\n // interaction\n if (firstNonActive) {\n return firstNonActive;\n }\n\n // Find any interaction specifically for mouse.\n // ignore the interaction if the eventType is a mousedown, and a simulation\n // is active\n for (const interaction of scope.interactions) {\n if (interaction.mouse && !(/down/.test(eventType) && interaction.simulation)) {\n return interaction;\n }\n }\n\n return null;\n },\n\n // get interaction that has this pointer\n hasPointer: function ({ pointerId }) {\n for (const interaction of scope.interactions) {\n if (utils.contains(interaction.pointerIds, pointerId)) {\n return interaction;\n }\n }\n },\n\n // get first idle interaction\n idle: function ({ mouseEvent }) {\n for (const interaction of scope.interactions) {\n // if there's already a pointer held down\n if (interaction.pointerIds.length === 1) {\n const target = interaction.target;\n // don't add this pointer if there is a target interactable and it\n // isn't gesturable\n if (target && !target.options.gesture.enabled) {\n continue;\n }\n }\n // maximum of 2 pointers per interaction\n else if (interaction.pointerIds.length >= 2) {\n continue;\n }\n\n if (!interaction.interacting() && (mouseEvent === interaction.mouse)) {\n return interaction;\n }\n }\n\n return null;\n },\n};\n\nmodule.exports = finder;\n","const win = require('./window');\nconst isWindow = require('./isWindow');\n\nconst is = {\n array : () => {},\n\n window : thing => thing === win.window || isWindow(thing),\n\n docFrag : thing => is.object(thing) && thing.nodeType === 11,\n\n object : thing => !!thing && (typeof thing === 'object'),\n\n function: thing => typeof thing === 'function',\n\n number : thing => typeof thing === 'number' ,\n\n bool : thing => typeof thing === 'boolean' ,\n\n string : thing => typeof thing === 'string' ,\n\n element: thing => {\n if (!thing || (typeof thing !== 'object')) { return false; }\n\n const _window = win.getWindow(thing) || win.window;\n\n return (/object|function/.test(typeof _window.Element)\n ? thing instanceof _window.Element //DOM2\n : thing.nodeType === 1 && typeof thing.nodeName === 'string');\n },\n};\n\nis.array = thing => (is.object(thing)\n && (typeof thing.length !== 'undefined')\n && is.function(thing.splice));\n\nmodule.exports = is;\n","module.exports = (thing) => !!(thing && thing.Window) && (thing instanceof thing.Window);\n","function pointerExtend (dest, source) {\n for (const prop in source) {\n const prefixedPropREs = module.exports.prefixedPropREs;\n let deprecated = false;\n\n // skip deprecated prefixed properties\n for (const vendor in prefixedPropREs) {\n if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) {\n deprecated = true;\n break;\n }\n }\n\n if (!deprecated && typeof source[prop] !== 'function') {\n dest[prop] = source[prop];\n }\n }\n return dest;\n}\n\npointerExtend.prefixedPropREs = {\n webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/,\n};\n\nmodule.exports = pointerExtend;\n","const hypot = require('./hypot');\nconst browser = require('./browser');\nconst dom = require('./domObjects');\nconst domUtils = require('./domUtils');\nconst is = require('./is');\nconst pointerExtend = require('./pointerExtend');\n\nconst pointerUtils = {\n copyCoords: function (dest, src) {\n dest.page = dest.page || {};\n dest.page.x = src.page.x;\n dest.page.y = src.page.y;\n\n dest.client = dest.client || {};\n dest.client.x = src.client.x;\n dest.client.y = src.client.y;\n\n dest.timeStamp = src.timeStamp;\n },\n\n setCoordDeltas: function (targetObj, prev, cur) {\n targetObj.page.x = cur.page.x - prev.page.x;\n targetObj.page.y = cur.page.y - prev.page.y;\n targetObj.client.x = cur.client.x - prev.client.x;\n targetObj.client.y = cur.client.y - prev.client.y;\n targetObj.timeStamp = cur.timeStamp - prev.timeStamp;\n\n // set pointer velocity\n const dt = Math.max(targetObj.timeStamp / 1000, 0.001);\n\n targetObj.page.speed = hypot(targetObj.page.x, targetObj.page.y) / dt;\n targetObj.page.vx = targetObj.page.x / dt;\n targetObj.page.vy = targetObj.page.y / dt;\n\n targetObj.client.speed = hypot(targetObj.client.x, targetObj.page.y) / dt;\n targetObj.client.vx = targetObj.client.x / dt;\n targetObj.client.vy = targetObj.client.y / dt;\n },\n\n isNativePointer: function (pointer) {\n return (pointer instanceof dom.Event || pointer instanceof dom.Touch);\n },\n\n // Get specified X/Y coords for mouse or event.touches[0]\n getXY: function (type, pointer, xy) {\n xy = xy || {};\n type = type || 'page';\n\n xy.x = pointer[type + 'X'];\n xy.y = pointer[type + 'Y'];\n\n return xy;\n },\n\n getPageXY: function (pointer, page) {\n page = page || {};\n\n // Opera Mobile handles the viewport and scrolling oddly\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n pointerUtils.getXY('screen', pointer, page);\n\n page.x += window.scrollX;\n page.y += window.scrollY;\n }\n else {\n pointerUtils.getXY('page', pointer, page);\n }\n\n return page;\n },\n\n getClientXY: function (pointer, client) {\n client = client || {};\n\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n // Opera Mobile handles the viewport and scrolling oddly\n pointerUtils.getXY('screen', pointer, client);\n }\n else {\n pointerUtils.getXY('client', pointer, client);\n }\n\n return client;\n },\n\n getPointerId: function (pointer) {\n return is.number(pointer.pointerId)? pointer.pointerId : pointer.identifier;\n },\n\n setCoords: function (targetObj, pointers, timeStamp) {\n const pointer = (pointers.length > 1\n ? pointerUtils.pointerAverage(pointers)\n : pointers[0]);\n\n const tmpXY = {};\n\n pointerUtils.getPageXY(pointer, tmpXY);\n targetObj.page.x = tmpXY.x;\n targetObj.page.y = tmpXY.y;\n\n pointerUtils.getClientXY(pointer, tmpXY);\n targetObj.client.x = tmpXY.x;\n targetObj.client.y = tmpXY.y;\n\n targetObj.timeStamp = is.number(timeStamp) ? timeStamp :new Date().getTime();\n },\n\n pointerExtend: pointerExtend,\n\n getTouchPair: function (event) {\n const touches = [];\n\n // array of touches is supplied\n if (is.array(event)) {\n touches[0] = event[0];\n touches[1] = event[1];\n }\n // an event\n else {\n if (event.type === 'touchend') {\n if (event.touches.length === 1) {\n touches[0] = event.touches[0];\n touches[1] = event.changedTouches[0];\n }\n else if (event.touches.length === 0) {\n touches[0] = event.changedTouches[0];\n touches[1] = event.changedTouches[1];\n }\n }\n else {\n touches[0] = event.touches[0];\n touches[1] = event.touches[1];\n }\n }\n\n return touches;\n },\n\n pointerAverage: function (pointers) {\n const average = {\n pageX : 0,\n pageY : 0,\n clientX: 0,\n clientY: 0,\n screenX: 0,\n screenY: 0,\n };\n\n for (const pointer of pointers) {\n for (const prop in average) {\n average[prop] += pointer[prop];\n }\n }\n for (const prop in average) {\n average[prop] /= pointers.length;\n }\n\n return average;\n },\n\n touchBBox: function (event) {\n if (!event.length && !(event.touches && event.touches.length > 1)) {\n return;\n }\n\n const touches = pointerUtils.getTouchPair(event);\n const minX = Math.min(touches[0].pageX, touches[1].pageX);\n const minY = Math.min(touches[0].pageY, touches[1].pageY);\n const maxX = Math.max(touches[0].pageX, touches[1].pageX);\n const maxY = Math.max(touches[0].pageY, touches[1].pageY);\n\n return {\n x: minX,\n y: minY,\n left: minX,\n top: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n },\n\n touchDistance: function (event, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n\n\n const dx = touches[0][sourceX] - touches[1][sourceX];\n const dy = touches[0][sourceY] - touches[1][sourceY];\n\n return hypot(dx, dy);\n },\n\n touchAngle: function (event, prevAngle, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n const dx = touches[1][sourceX] - touches[0][sourceX];\n const dy = touches[1][sourceY] - touches[0][sourceY];\n const angle = 180 * Math.atan2(dy , dx) / Math.PI;\n\n return angle;\n },\n\n getPointerType: function (pointer, interaction) {\n // if the PointerEvent API isn't available, then the pointer must be ither\n // a MouseEvent or TouchEvent\n if (interaction.mouse) { return 'mouse'; }\n if (!browser.supportsPointerEvent) { return 'touch'; }\n\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : [undefined, undefined,'touch', 'pen', 'mouse'][pointer.pointerType];\n },\n\n // [ event.target, event.currentTarget ]\n getEventTargets: function (event) {\n return [\n domUtils.getActualElement(event.path ? event.path[0] : event.target),\n domUtils.getActualElement(event.currentTarget),\n ];\n },\n};\n\nmodule.exports = pointerUtils;\n","const { window } = require('./window');\n\nconst vendors = ['ms', 'moz', 'webkit', 'o'];\nlet lastTime = 0;\nlet request;\nlet cancel;\n\nfor (let x = 0; x < vendors.length && !window.requestAnimationFrame; x++) {\n request = window[vendors[x] + 'RequestAnimationFrame'];\n cancel = window[vendors[x] +'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n}\n\nif (!request) {\n request = function (callback) {\n const currTime = new Date().getTime();\n const timeToCall = Math.max(0, 16 - (currTime - lastTime));\n const id = setTimeout(function () { callback(currTime + timeToCall); },\n timeToCall);\n\n lastTime = currTime + timeToCall;\n return id;\n };\n}\n\nif (!cancel) {\n cancel = function (id) {\n clearTimeout(id);\n };\n}\n\nmodule.exports = {\n request,\n cancel,\n};\n","const extend = require('./extend');\nconst is = require('./is');\nconst {\n closest,\n parentNode,\n getElementRect,\n} = require('./domUtils');\n\nconst rectUtils = {\n getStringOptionResult: function (value, interactable, element) {\n if (!is.string(value)) {\n return null;\n }\n\n if (value === 'parent') {\n value = parentNode(element);\n }\n else if (value === 'self') {\n value = interactable.getRect(element);\n }\n else {\n value = closest(element, value);\n }\n\n return value;\n },\n\n resolveRectLike: function (value, interactable, element, functionArgs) {\n value = rectUtils.getStringOptionResult(value, interactable, element) || value;\n\n if (is.function(value)) {\n value = value.apply(null, functionArgs);\n }\n\n if (is.element(value)) {\n value = getElementRect(value);\n }\n\n return value;\n },\n\n rectToXY: function (rect) {\n return rect && {\n x: 'x' in rect ? rect.x : rect.left,\n y: 'y' in rect ? rect.y : rect.top,\n };\n },\n\n xywhToTlbr: function (rect) {\n if (rect && !('left' in rect && 'top' in rect)) {\n rect = extend({}, rect);\n\n rect.left = rect.x || 0;\n rect.top = rect.y || 0;\n rect.right = rect.right || (rect.left + rect.width);\n rect.bottom = rect.bottom || (rect.top + rect.height);\n }\n\n return rect;\n },\n\n tlbrToXywh: function (rect) {\n if (rect && !('x' in rect && 'y' in rect)) {\n rect = extend({}, rect);\n\n rect.x = rect.left || 0;\n rect.top = rect.top || 0;\n rect.width = rect.width || (rect.right - rect.x);\n rect.height = rect.height || (rect.bottom - rect.y);\n }\n\n return rect;\n },\n};\n\nmodule.exports = rectUtils;\n","const win = module.exports;\nconst isWindow = require('./isWindow');\n\nfunction init (window) {\n // get wrapped window if using Shadow DOM polyfill\n\n win.realWindow = window;\n\n // create a TextNode\n const el = window.document.createTextNode('');\n\n // check if it's wrapped by a polyfill\n if (el.ownerDocument !== window.document\n && typeof window.wrap === 'function'\n && window.wrap(el) === el) {\n // use wrapped window\n window = window.wrap(window);\n }\n\n win.window = window;\n}\n\nif (typeof window === 'undefined') {\n win.window = undefined;\n win.realWindow = undefined;\n}\nelse {\n init(window);\n}\n\nwin.getWindow = function getWindow (node) {\n if (isWindow(node)) {\n return node;\n }\n\n const rootNode = (node.ownerDocument || node);\n\n return rootNode.defaultView || rootNode.parentWindow || win.window;\n};\n\nwin.init = init;\n"]} \ No newline at end of file +{"version":3,"sources":["src/header.js","node_modules/browser-pack/_prelude.js","index.js","src/Eventable.js","src/InteractEvent.js","src/Interactable.js","src/Interaction.js","src/actions/base.js","src/actions/drag.js","src/actions/drop.js","src/actions/gesture.js","src/actions/resize.js","src/autoScroll.js","src/autoStart/InteractableMethods.js","src/autoStart/base.js","src/autoStart/delay.js","src/autoStart/drag.js","src/autoStart/gesture.js","src/autoStart/resize.js","src/defaultOptions.js","src/index.js","src/inertia.js","src/interact.js","src/interactablePreventDefault.js","src/legacyBrowsers.js","src/modifiers/index.js","src/modifiers/restrict.js","src/modifiers/restrictEdges.js","src/modifiers/restrictSize.js","src/modifiers/snap.js","src/modifiers/snapSize.js","src/pointerEvents/PointerEvent.js","src/pointerEvents/base.js","src/pointerEvents/holdRepeat.js","src/pointerEvents/interactableTargets.js","src/scope.js","src/utils/Signals.js","src/utils/arr.js","src/utils/browser.js","src/utils/domObjects.js","src/utils/domUtils.js","src/utils/events.js","src/utils/extend.js","src/utils/getOriginXY.js","src/utils/hypot.js","src/utils/index.js","src/utils/interactionFinder.js","src/utils/is.js","src/utils/isWindow.js","src/utils/pointerExtend.js","src/utils/pointerUtils.js","src/utils/raf.js","src/utils/rect.js","src/utils/window.js"],"names":[],"mappings":";AAAA;AACA;AACA;AACA;AACA;AACA;ACLA,ADMA;AACA;;AEPA;;;;;;;;AAQA,IAAI,OAAO,MAAP,KAAkB,WAAtB,EAAmC;AACjC,SAAO,OAAP,GAAiB,UAAU,MAAV,EAAkB;AACjC,YAAQ,oBAAR,EAA8B,IAA9B,CAAmC,MAAnC;;AAEA,WAAO,QAAQ,aAAR,CAAP;AACD,GAJD;AAKD,CAND,MAOK;AACH,SAAO,OAAP,GAAiB,QAAQ,aAAR,CAAjB;AACD;;;;;;;eCjBmB,QAAQ,aAAR,C;IAAZ,O,YAAA,O;;AACR,IAAM,SAAS,QAAQ,mBAAR,CAAf;;AAEA,SAAS,yBAAT,CAAoC,KAApC,EAA2C,SAA3C,EAAsD;AACpD,OAAK,IAAI,IAAI,CAAR,EAAW,MAAM,UAAU,MAAhC,EAAwC,IAAI,GAAJ,IAAW,CAAC,MAAM,2BAA1D,EAAuF,GAAvF,EAA4F;AAC1F,cAAU,CAAV,EAAa,KAAb;AACD;AACF;;IAEK,S;AAEJ,qBAAa,OAAb,EAAsB;AAAA;;AACpB,SAAK,OAAL,GAAe,OAAO,EAAP,EAAW,WAAW,EAAtB,CAAf;AACD;;sBAED,I,iBAAM,K,EAAO;AACX,QAAI,kBAAJ;AACA,QAAM,UAAU,OAAO,MAAM,IAA7B;AACA,QAAM,SAAS,KAAK,MAApB;;AAEA;AACA,QAAK,YAAY,KAAK,MAAM,IAAX,CAAjB,EAAoC;AAClC,gCAA0B,KAA1B,EAAiC,SAAjC;AACD;;AAED;AACA,QAAI,KAAK,OAAL,CAAJ,EAAmB;AACjB,WAAK,OAAL,EAAc,KAAd;AACD;;AAED;AACA,QAAI,CAAC,MAAM,kBAAP,IAA6B,MAA7B,KAAwC,YAAY,OAAO,MAAM,IAAb,CAApD,CAAJ,EAA8E;AAC5E,gCAA0B,KAA1B,EAAiC,SAAjC;AACD;AACF,G;;sBAED,E,eAAI,S,EAAW,Q,EAAU;AACvB;AACA,QAAI,KAAK,SAAL,CAAJ,EAAqB;AACnB,WAAK,SAAL,EAAgB,IAAhB,CAAqB,QAArB;AACD,KAFD,MAGK;AACH,WAAK,SAAL,IAAkB,CAAC,QAAD,CAAlB;AACD;AACF,G;;sBAED,G,gBAAK,S,EAAW,Q,EAAU;AACxB;AACA,QAAM,YAAY,KAAK,SAAL,CAAlB;AACA,QAAM,QAAY,YAAW,QAAQ,SAAR,EAAmB,QAAnB,CAAX,GAA0C,CAAC,CAA7D;;AAEA,QAAI,UAAU,CAAC,CAAf,EAAkB;AAChB,gBAAU,MAAV,CAAiB,KAAjB,EAAwB,CAAxB;AACD;;AAED,QAAI,aAAa,UAAU,MAAV,KAAqB,CAAlC,IAAuC,CAAC,QAA5C,EAAsD;AACpD,WAAK,SAAL,IAAkB,QAAlB;AACD;AACF,G;;;;;AAGH,OAAO,OAAP,GAAiB,SAAjB;;;;;;;AC7DA,IAAM,SAAc,QAAQ,gBAAR,CAApB;AACA,IAAM,cAAc,QAAQ,qBAAR,CAApB;AACA,IAAM,WAAc,QAAQ,kBAAR,CAApB;AACA,IAAM,UAAc,QAAQ,iBAAR,EAA2B,GAA3B,EAApB;;IAEM,a;AACJ,yBAAa,WAAb,EAA0B,KAA1B,EAAiC,MAAjC,EAAyC,KAAzC,EAAgD,OAAhD,EAAyD,OAAzD,EAAkF;AAAA,QAAhB,MAAgB,uEAAP,KAAO;;AAAA;;AAChF,QAAM,SAAc,YAAY,MAAhC;AACA,QAAM,cAAc,CAAC,UAAU,OAAO,OAAjB,IAA4B,QAA7B,EAAuC,WAA3D;AACA,QAAM,SAAc,YAAY,MAAZ,EAAoB,OAApB,EAA6B,MAA7B,CAApB;AACA,QAAM,WAAc,UAAU,OAA9B;AACA,QAAM,SAAc,UAAU,KAA9B;AACA,QAAM,SAAc,WAAU,YAAY,WAAtB,GAAoC,YAAY,SAApE;AACA,QAAM,YAAc,YAAY,SAAhC;;AAEA,cAAU,WAAW,YAAY,OAAjC;;AAEA,QAAM,OAAS,OAAO,EAAP,EAAW,OAAO,IAAlB,CAAf;AACA,QAAM,SAAS,OAAO,EAAP,EAAW,OAAO,MAAlB,CAAf;;AAEA,SAAK,CAAL,IAAU,OAAO,CAAjB;AACA,SAAK,CAAL,IAAU,OAAO,CAAjB;;AAEA,WAAO,CAAP,IAAY,OAAO,CAAnB;AACA,WAAO,CAAP,IAAY,OAAO,CAAnB;;AAEA,SAAK,OAAL,GAAqB,MAAM,OAA3B;AACA,SAAK,MAAL,GAAqB,MAAM,MAA3B;AACA,SAAK,QAAL,GAAqB,MAAM,QAA3B;AACA,SAAK,OAAL,GAAqB,MAAM,OAA3B;AACA,SAAK,MAAL,GAAqB,MAAM,MAA3B;AACA,SAAK,OAAL,GAAqB,MAAM,OAA3B;AACA,SAAK,MAAL,GAAqB,OAArB;AACA,SAAK,aAAL,GAAqB,OAArB;AACA,SAAK,aAAL,GAAqB,WAAW,IAAhC;AACA,SAAK,MAAL,GAAqB,MAArB;AACA,SAAK,IAAL,GAAqB,UAAU,SAAS,EAAnB,CAArB;AACA,SAAK,WAAL,GAAqB,WAArB;AACA,SAAK,YAAL,GAAqB,MAArB;;AAEA,SAAK,EAAL,GAAU,WAAW,YAAY,SAAZ,CAAsB,YAAY,SAAZ,CAAsB,MAAtB,GAA+B,CAArD,CAAX,GACW,UAAU,EAD/B;;AAGA,QAAM,YAAY;AAChB,8BADgB;AAEhB,kBAFgB;AAGhB,oBAHgB;AAIhB,kBAJgB;AAKhB,sBALgB;AAMhB,sBANgB;AAOhB,gBAPgB;AAQhB,oBARgB;AAShB,oBATgB;AAUhB,wBAVgB;AAWhB,oBAXgB;AAYhB,8BAZgB;AAahB,cAAQ;AAbQ,KAAlB;;AAgBA,YAAQ,IAAR,CAAa,QAAb,EAAuB,SAAvB;;AAEA,QAAI,MAAJ,EAAY;AACV;AACA,WAAK,KAAL,GAAa,UAAU,KAAvB;AACA,WAAK,KAAL,GAAa,UAAU,KAAvB;AACA,WAAK,OAAL,GAAe,UAAU,OAAzB;AACA,WAAK,OAAL,GAAe,UAAU,OAAzB;AACD,KAND,MAOK;AACH,WAAK,KAAL,GAAiB,KAAK,CAAtB;AACA,WAAK,KAAL,GAAiB,KAAK,CAAtB;AACA,WAAK,OAAL,GAAiB,OAAO,CAAxB;AACA,WAAK,OAAL,GAAiB,OAAO,CAAxB;AACD;;AAED,SAAK,EAAL,GAAiB,YAAY,WAAZ,CAAwB,IAAxB,CAA6B,CAA7B,GAAiC,OAAO,CAAzD;AACA,SAAK,EAAL,GAAiB,YAAY,WAAZ,CAAwB,IAAxB,CAA6B,CAA7B,GAAiC,OAAO,CAAzD;AACA,SAAK,QAAL,GAAiB,YAAY,WAAZ,CAAwB,MAAxB,CAA+B,CAA/B,GAAmC,OAAO,CAA3D;AACA,SAAK,QAAL,GAAiB,YAAY,WAAZ,CAAwB,MAAxB,CAA+B,CAA/B,GAAmC,OAAO,CAA3D;;AAEA,YAAQ,IAAR,CAAa,WAAb,EAA0B,SAA1B;;AAEA,SAAK,SAAL,GAAiB,OAAO,SAAxB;AACA,SAAK,EAAL,GAAiB,YAAY,YAAZ,CAAyB,SAA1C;AACA,SAAK,QAAL,GAAiB,KAAK,SAAL,GAAiB,KAAK,EAAvC;;AAEA;AACA,SAAK,KAAL,GAAa,YAAY,YAAZ,CAAyB,WAAzB,EAAsC,KAAnD;AACA,SAAK,SAAL,GAAiB,YAAY,YAAZ,CAAyB,WAAzB,EAAsC,EAAvD;AACA,SAAK,SAAL,GAAiB,YAAY,YAAZ,CAAyB,WAAzB,EAAsC,EAAvD;;AAEA,SAAK,KAAL,GAAc,UAAU,UAAU,cAArB,GAAsC,KAAK,QAAL,EAAtC,GAAwD,IAArE;;AAEA,YAAQ,IAAR,CAAa,KAAb,EAAoB,SAApB;AACD;;0BAED,Q,uBAAY;AACV,QAAM,cAAc,KAAK,WAAzB;;AAEA,QAAI,YAAY,SAAZ,CAAsB,KAAtB,GAA8B,GAA9B,IACG,KAAK,SAAL,GAAiB,YAAY,SAAZ,CAAsB,SAAvC,GAAmD,GAD1D,EAC+D;AAC7D,aAAO,IAAP;AACD;;AAED,QAAI,QAAQ,MAAM,KAAK,KAAL,CAAW,YAAY,SAAZ,CAAsB,SAAjC,EAA4C,YAAY,SAAZ,CAAsB,SAAlE,CAAN,GAAqF,KAAK,EAAtG;AACA,QAAM,UAAU,IAAhB;;AAEA,QAAI,QAAQ,CAAZ,EAAe;AACb,eAAS,GAAT;AACD;;AAED,QAAM,OAAO,MAAM,OAAN,IAAiB,KAAjB,IAA0B,QAAQ,MAAM,OAArD;AACA,QAAM,KAAO,MAAM,OAAN,IAAiB,KAAjB,IAA0B,QAAQ,MAAM,OAArD;;AAEA,QAAM,QAAQ,CAAC,IAAD,KAAU,MAAM,OAAN,IAAiB,KAAjB,IAA0B,QAAS,KAAK,OAAlD,CAAd;AACA,QAAM,OAAQ,CAAC,EAAD,IAAW,KAAK,OAAL,IAAgB,KAA3B,IAAoC,QAAQ,MAAM,OAAhE;;AAEA,WAAO;AACL,YADK;AAEL,gBAFK;AAGL,gBAHK;AAIL,kBAJK;AAKL,kBALK;AAML,aAAO,YAAY,SAAZ,CAAsB,KANxB;AAOL,gBAAU;AACR,WAAG,YAAY,SAAZ,CAAsB,SADjB;AAER,WAAG,YAAY,SAAZ,CAAsB;AAFjB;AAPL,KAAP;AAYD,G;;0BAED,c,6BAAkB,CAAE,C;;0BAEpB,wB,uCAA4B;AAC1B,SAAK,2BAAL,GAAmC,KAAK,kBAAL,GAA0B,IAA7D;AACD,G;;0BAED,e,8BAAmB;AACjB,SAAK,kBAAL,GAA0B,IAA1B;AACD,G;;;;;AAGH,QAAQ,EAAR,CAAW,WAAX,EAAwB,gBAA0D;AAAA,MAA9C,MAA8C,QAA9C,MAA8C;AAAA,MAAtC,WAAsC,QAAtC,WAAsC;AAAA,MAAzB,QAAyB,QAAzB,QAAyB;AAAA,MAAf,WAAe,QAAf,WAAe;;AAChF,MAAM,YAAY,WAAU,MAAV,GAAmB,YAAY,SAAjD;;AAEA,MAAI,gBAAgB,QAApB,EAA8B;AAC5B,WAAO,EAAP,GAAY,OAAO,OAAP,GAAiB,UAAU,OAAvC;AACA,WAAO,EAAP,GAAY,OAAO,OAAP,GAAiB,UAAU,OAAvC;AACD,GAHD,MAIK;AACH,WAAO,EAAP,GAAY,OAAO,KAAP,GAAe,UAAU,KAArC;AACA,WAAO,EAAP,GAAY,OAAO,KAAP,GAAe,UAAU,KAArC;AACD;AACF,CAXD;;AAaA,cAAc,OAAd,GAAwB,OAAxB;;AAEA,OAAO,OAAP,GAAiB,aAAjB;;;;;;;AC7JA,IAAM,KAAY,QAAQ,YAAR,CAAlB;AACA,IAAM,SAAY,QAAQ,gBAAR,CAAlB;AACA,IAAM,SAAY,QAAQ,gBAAR,CAAlB;AACA,IAAM,UAAY,QAAQ,gBAAR,CAAlB;AACA,IAAM,QAAY,QAAQ,SAAR,CAAlB;AACA,IAAM,YAAY,QAAQ,aAAR,CAAlB;AACA,IAAM,WAAY,QAAQ,kBAAR,CAAlB;AACA,IAAM,UAAY,QAAQ,iBAAR,EAA2B,GAA3B,EAAlB;;eAM8B,QAAQ,kBAAR,C;IAH5B,c,YAAA,c;IACA,Y,YAAA,Y;IACA,W,YAAA,W;;gBAE4B,QAAQ,gBAAR,C;IAAtB,S,aAAA,S;;gBACsB,QAAQ,aAAR,C;IAAtB,O,aAAA,O;IAAS,Q,aAAA,Q;;gBACa,QAAQ,iBAAR,C;IAAtB,U,aAAA,U;;AAER;;;AACA,MAAM,aAAN,GAAsB,EAAtB;;AAEA;;;;;;;IAMM,Y;AACJ,wBAAa,MAAb,EAAqB,OAArB,EAA8B;AAAA;;AAC5B,cAAU,WAAW,EAArB;;AAEA,SAAK,MAAL,GAAgB,MAAhB;AACA,SAAK,MAAL,GAAgB,IAAI,SAAJ,EAAhB;AACA,SAAK,QAAL,GAAgB,QAAQ,OAAR,IAAmB,MAAM,QAAzC;AACA,SAAK,IAAL,GAAgB,UAAU,YAAY,MAAZ,IAAqB,KAAK,QAA1B,GAAqC,MAA/C,CAAhB;AACA,SAAK,IAAL,GAAgB,KAAK,IAAL,CAAU,QAA1B;;AAEA,YAAQ,IAAR,CAAa,KAAb,EAAoB;AAClB,oBADkB;AAElB,sBAFkB;AAGlB,oBAAc,IAHI;AAIlB,WAAK,KAAK;AAJQ,KAApB;;AAOA,UAAM,WAAN,CAAmB,KAAK,IAAxB,EAA8B,KAAK,IAAnC;;AAEA,UAAM,aAAN,CAAoB,IAApB,CAAyB,IAAzB;;AAEA,SAAK,GAAL,CAAS,OAAT;AACD;;yBAED,W,wBAAa,M,EAAQ,M,EAAQ;AAC3B,QAAM,WAAW,OAAO,MAAxB;;AAEA,QAAI,GAAG,QAAH,CAAY,OAAO,OAAnB,CAAJ,EAAwC;AAAE,WAAK,MAAL,CAAY,WAAW,OAAvB,IAA0C,OAAO,OAAjD;AAAoE;AAC9G,QAAI,GAAG,QAAH,CAAY,OAAO,MAAnB,CAAJ,EAAwC;AAAE,WAAK,MAAL,CAAY,WAAW,MAAvB,IAA0C,OAAO,MAAjD;AAAoE;AAC9G,QAAI,GAAG,QAAH,CAAY,OAAO,KAAnB,CAAJ,EAAwC;AAAE,WAAK,MAAL,CAAY,WAAW,KAAvB,IAA0C,OAAO,KAAjD;AAAoE;AAC9G,QAAI,GAAG,QAAH,CAAY,OAAO,cAAnB,CAAJ,EAAwC;AAAE,WAAK,MAAL,CAAY,WAAW,cAAvB,IAA0C,OAAO,cAAjD;AAAoE;;AAE9G,WAAO,IAAP;AACD,G;;yBAED,Y,yBAAc,M,EAAQ,O,EAAS;AAC7B;AACA,SAAK,IAAM,MAAX,IAAqB,OAArB,EAA8B;AAC5B;AACA,UAAI,UAAU,SAAS,MAAT,CAAd,EAAgC;AAC9B;AACA,YAAI,GAAG,MAAH,CAAU,QAAQ,MAAR,CAAV,CAAJ,EAAgC;AAC9B;AACA,eAAK,OAAL,CAAa,MAAb,EAAqB,MAArB,IAA+B,OAAO,KAAK,OAAL,CAAa,MAAb,EAAqB,MAArB,KAAgC,EAAvC,EAA2C,QAAQ,MAAR,CAA3C,CAA/B;;AAEA,cAAI,GAAG,MAAH,CAAU,SAAS,SAAT,CAAmB,MAAnB,CAAV,KAAyC,aAAa,SAAS,SAAT,CAAmB,MAAnB,CAA1D,EAAsF;AACpF,iBAAK,OAAL,CAAa,MAAb,EAAqB,MAArB,EAA6B,OAA7B,GAAuC,QAAQ,MAAR,EAAgB,OAAhB,KAA4B,KAA5B,GAAmC,KAAnC,GAA2C,IAAlF;AACD;AACF,SAPD,MAQK,IAAI,GAAG,IAAH,CAAQ,QAAQ,MAAR,CAAR,KAA4B,GAAG,MAAH,CAAU,SAAS,SAAT,CAAmB,MAAnB,CAAV,CAAhC,EAAuE;AAC1E,eAAK,OAAL,CAAa,MAAb,EAAqB,MAArB,EAA6B,OAA7B,GAAuC,QAAQ,MAAR,CAAvC;AACD,SAFI,MAGA,IAAI,QAAQ,MAAR,MAAoB,SAAxB,EAAmC;AACtC;AACA,eAAK,OAAL,CAAa,MAAb,EAAqB,MAArB,IAA+B,QAAQ,MAAR,CAA/B;AACD;AACF;AACF;AACF,G;;AAED;;;;;;;;;;;;;;;;;;;;yBAkBA,O,oBAAS,O,EAAS;AAChB,cAAU,WAAW,KAAK,MAA1B;;AAEA,QAAI,GAAG,MAAH,CAAU,KAAK,MAAf,KAA0B,CAAE,GAAG,OAAH,CAAW,OAAX,CAAhC,EAAsD;AACpD,gBAAU,KAAK,QAAL,CAAc,aAAd,CAA4B,KAAK,MAAjC,CAAV;AACD;;AAED,WAAO,eAAe,OAAf,CAAP;AACD,G;;AAED;;;;;;;;;;;;yBAUA,W,wBAAa,O,EAAS;AACpB,QAAI,GAAG,QAAH,CAAY,OAAZ,CAAJ,EAA0B;AACxB,WAAK,OAAL,GAAe,OAAf;;AAEA,aAAO,IAAP;AACD;;AAED,QAAI,YAAY,IAAhB,EAAsB;AACpB,aAAO,KAAK,OAAL,CAAa,OAApB;;AAEA,aAAO,IAAP;AACD;;AAED,WAAO,KAAK,OAAZ;AACD,G;;yBAED,iB,8BAAmB,U,EAAY,Q,EAAU;AACvC,QAAI,YAAY,QAAZ,KAAyB,GAAG,MAAH,CAAU,QAAV,CAA7B,EAAkD;AAChD,WAAK,OAAL,CAAa,UAAb,IAA2B,QAA3B;;AAEA,2BAAqB,QAAQ,KAA7B,kHAAoC;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,YAAzB,MAAyB;;AAClC,aAAK,OAAL,CAAa,MAAb,EAAqB,UAArB,IAAmC,QAAnC;AACD;;AAED,aAAO,IAAP;AACD;;AAED,WAAO,KAAK,OAAL,CAAa,UAAb,CAAP;AACD,G;;AAED;;;;;;;;;;;;;;;yBAaA,M,mBAAQ,Q,EAAU;AAChB,WAAO,KAAK,iBAAL,CAAuB,QAAvB,EAAiC,QAAjC,CAAP;AACD,G;;AAED;;;;;;;;;;;;yBAUA,W,wBAAa,Q,EAAU;AACrB,QAAI,aAAa,MAAb,IAAuB,aAAa,QAAxC,EAAkD;AAChD,WAAK,OAAL,CAAa,WAAb,GAA2B,QAA3B;;AAEA,aAAO,IAAP;AACD;;AAED,WAAO,KAAK,OAAL,CAAa,WAApB;AACD,G;;AAED;;;;;;;;;;;yBASA,O,sBAAW;AACT,WAAO,KAAK,QAAZ;AACD,G;;yBAED,S,sBAAW,O,EAAS;AAClB,WAAQ,KAAK,QAAL,KAAkB,QAAQ,aAA1B,IACG,aAAa,KAAK,QAAlB,EAA4B,OAA5B,CADX;AAED,G;;AAED;;;;;;;;;;;;yBAUA,I,iBAAM,M,EAAQ;AACZ,SAAK,MAAL,CAAY,IAAZ,CAAiB,MAAjB;;AAEA,WAAO,IAAP;AACD,G;;yBAED,c,2BAAgB,M,EAAQ,S,EAAW,Q,EAAU,O,EAAS;AACpD,QAAI,GAAG,MAAH,CAAU,SAAV,KAAwB,UAAU,MAAV,CAAiB,GAAjB,MAA0B,CAAC,CAAvD,EAA0D;AACxD,kBAAY,UAAU,IAAV,GAAiB,KAAjB,CAAuB,IAAvB,CAAZ;AACD;;AAED,QAAI,GAAG,KAAH,CAAS,SAAT,CAAJ,EAAyB;AACvB,WAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,UAAU,MAA9B,EAAsC,GAAtC,EAA2C;AACzC,aAAK,MAAL,EAAa,UAAU,CAAV,CAAb,EAA2B,QAA3B,EAAqC,OAArC;AACD;;AAED,aAAO,IAAP;AACD;;AAED,QAAI,GAAG,MAAH,CAAU,SAAV,CAAJ,EAA0B;AACxB,WAAK,IAAM,IAAX,IAAmB,SAAnB,EAA8B;AAC5B,aAAK,MAAL,EAAa,IAAb,EAAmB,UAAU,IAAV,CAAnB,EAAoC,QAApC;AACD;;AAED,aAAO,IAAP;AACD;AACF,G;;AAED;;;;;;;;;;;;;yBAWA,E,eAAI,S,EAAW,Q,EAAU,O,EAAS;AAChC,QAAI,KAAK,cAAL,CAAoB,IAApB,EAA0B,SAA1B,EAAqC,QAArC,EAA+C,OAA/C,CAAJ,EAA6D;AAC3D,aAAO,IAAP;AACD;;AAED,QAAI,cAAc,OAAlB,EAA2B;AAAE,kBAAY,UAAZ;AAAyB;;AAEtD,QAAI,SAAS,aAAa,UAAtB,EAAkC,SAAlC,CAAJ,EAAkD;AAChD,WAAK,MAAL,CAAY,EAAZ,CAAe,SAAf,EAA0B,QAA1B;AACD;AACD;AAHA,SAIK,IAAI,GAAG,MAAH,CAAU,KAAK,MAAf,CAAJ,EAA4B;AAC/B,eAAO,WAAP,CAAmB,KAAK,MAAxB,EAAgC,KAAK,QAArC,EAA+C,SAA/C,EAA0D,QAA1D,EAAoE,OAApE;AACD,OAFI,MAGA;AACH,eAAO,GAAP,CAAW,KAAK,MAAhB,EAAwB,SAAxB,EAAmC,QAAnC,EAA6C,OAA7C;AACD;;AAED,WAAO,IAAP;AACD,G;;AAED;;;;;;;;;;;;;yBAWA,G,gBAAK,S,EAAW,Q,EAAU,O,EAAS;AACjC,QAAI,KAAK,cAAL,CAAoB,KAApB,EAA2B,SAA3B,EAAsC,QAAtC,EAAgD,OAAhD,CAAJ,EAA8D;AAC5D,aAAO,IAAP;AACD;;AAED,QAAI,cAAc,OAAlB,EAA2B;AAAE,kBAAY,UAAZ;AAAyB;;AAEtD;AACA,QAAI,SAAS,aAAa,UAAtB,EAAkC,SAAlC,CAAJ,EAAkD;AAChD,WAAK,MAAL,CAAY,GAAZ,CAAgB,SAAhB,EAA2B,QAA3B;AACD;AACD;AAHA,SAIK,IAAI,GAAG,MAAH,CAAU,KAAK,MAAf,CAAJ,EAA4B;AAC/B,eAAO,cAAP,CAAsB,KAAK,MAA3B,EAAmC,KAAK,QAAxC,EAAkD,SAAlD,EAA6D,QAA7D,EAAuE,OAAvE;AACD;AACD;AAHK,WAIA;AACH,iBAAO,MAAP,CAAc,KAAK,MAAnB,EAA2B,SAA3B,EAAsC,QAAtC,EAAgD,OAAhD;AACD;;AAED,WAAO,IAAP;AACD,G;;AAED;;;;;;;;;;yBAQA,G,gBAAK,O,EAAS;AACZ,QAAI,CAAC,GAAG,MAAH,CAAU,OAAV,CAAL,EAAyB;AACvB,gBAAU,EAAV;AACD;;AAED,SAAK,OAAL,GAAe,OAAO,EAAP,EAAW,SAAS,IAApB,CAAf;;AAEA,QAAM,aAAa,OAAO,EAAP,EAAW,SAAS,SAApB,CAAnB;;AAEA,SAAK,IAAM,UAAX,IAAyB,QAAQ,UAAjC,EAA6C;AAC3C,UAAM,aAAa,QAAQ,UAAR,CAAmB,UAAnB,CAAnB;;AAEA,WAAK,OAAL,CAAa,UAAb,IAA2B,OAAO,EAAP,EAAW,SAAS,UAAT,CAAX,CAA3B;;AAEA,WAAK,YAAL,CAAkB,UAAlB,EAA8B,UAA9B;;AAEA,WAAK,UAAL,EAAiB,QAAQ,UAAR,CAAjB;AACD;;AAED,0BAAsB,aAAa,eAAnC,yHAAoD;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAAzC,OAAyC;;AAClD,WAAK,OAAL,CAAa,OAAb,IAAwB,SAAS,IAAT,CAAc,OAAd,CAAxB;;AAEA,UAAI,WAAW,OAAf,EAAwB;AACtB,aAAK,OAAL,EAAc,QAAQ,OAAR,CAAd;AACD;AACF;;AAED,YAAQ,IAAR,CAAa,KAAb,EAAoB;AAClB,sBADkB;AAElB,oBAAc;AAFI,KAApB;;AAKA,WAAO,IAAP;AACD,G;;AAED;;;;;;;;;;;yBASA,K,oBAAS;AACP,WAAO,MAAP,CAAc,KAAK,MAAnB,EAA2B,KAA3B;;AAEA,QAAI,GAAG,MAAH,CAAU,KAAK,MAAf,CAAJ,EAA4B;AAC1B;AACA,WAAK,IAAM,IAAX,IAAmB,OAAO,eAA1B,EAA2C;AACzC,YAAM,YAAY,OAAO,eAAP,CAAuB,IAAvB,CAAlB;;AAEA,YAAI,UAAU,SAAV,CAAoB,CAApB,MAA2B,KAAK,MAAhC,IACG,UAAU,QAAV,CAAmB,CAAnB,MAA0B,KAAK,QADtC,EACgD;;AAE9C,oBAAU,SAAV,CAAoB,MAApB,CAA2B,CAA3B,EAA8B,CAA9B;AACA,oBAAU,QAAV,CAAoB,MAApB,CAA2B,CAA3B,EAA8B,CAA9B;AACA,oBAAU,SAAV,CAAoB,MAApB,CAA2B,CAA3B,EAA8B,CAA9B;;AAEA;AACA,cAAI,CAAC,UAAU,SAAV,CAAoB,MAAzB,EAAiC;AAC/B,sBAAU,IAAV,IAAkB,IAAlB;AACD;AACF;;AAED,eAAO,MAAP,CAAc,KAAK,QAAnB,EAA6B,IAA7B,EAAmC,OAAO,gBAA1C;AACA,eAAO,MAAP,CAAc,KAAK,QAAnB,EAA6B,IAA7B,EAAmC,OAAO,kBAA1C,EAA8D,IAA9D;AACD;AACF,KArBD,MAsBK;AACH,aAAO,MAAP,CAAc,IAAd,EAAoB,KAApB;AACD;;AAED,YAAQ,IAAR,CAAa,OAAb,EAAsB,EAAE,cAAc,IAAhB,EAAtB;;AAEA,UAAM,aAAN,CAAoB,MAApB,CAA2B,QAAQ,MAAM,aAAd,EAA6B,IAA7B,CAA3B,EAA+D,CAA/D;;AAEA;AACA,0BAA0B,MAAM,YAAN,IAAsB,EAAhD,yHAAoD;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAAzC,WAAyC;;AAClD,UAAI,YAAY,MAAZ,KAAuB,IAAvB,IAA+B,YAAY,WAAZ,EAAnC,EAA8D;AAC5D,oBAAY,IAAZ;AACD;AACF;;AAED,WAAO,MAAM,QAAb;AACD,G;;;;;AAGH,MAAM,aAAN,CAAoB,cAApB,GAAqC,SAAS,cAAT,CAAyB,MAAzB,EAAiC,OAAjC,EAA0C;AAC7E,YAAU,WAAW,MAAM,QAA3B;;AAEA,OAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,KAAK,MAAzB,EAAiC,GAAjC,EAAsC;AACpC,QAAM,eAAe,KAAK,CAAL,CAArB;;AAEA,QAAI,aAAa,MAAb,KAAwB,MAAxB,IAAkC,aAAa,QAAb,KAA0B,OAAhE,EAAyE;AACvE,aAAO,CAAP;AACD;AACF;AACD,SAAO,CAAC,CAAR;AACD,CAXD;;AAaA,MAAM,aAAN,CAAoB,GAApB,GAA0B,SAAS,eAAT,CAA0B,OAA1B,EAAmC,OAAnC,EAA4C,kBAA5C,EAAgE;AACxF,MAAM,MAAM,KAAK,KAAK,cAAL,CAAoB,OAApB,EAA6B,WAAW,QAAQ,OAAhD,CAAL,CAAZ;;AAEA,SAAO,QAAQ,GAAG,MAAH,CAAU,OAAV,KAAsB,kBAAtB,IAA4C,IAAI,SAAJ,CAAc,OAAd,CAApD,IAA6E,GAA7E,GAAmF,IAA1F;AACD,CAJD;;AAMA,MAAM,aAAN,CAAoB,eAApB,GAAsC,UAAU,QAAV,EAAoB,OAApB,EAA6B;AACjE,OAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,KAAK,MAAzB,EAAiC,GAAjC,EAAsC;AACpC,QAAM,eAAe,KAAK,CAAL,CAArB;;AAEA;AACA,QAAI,CAAC,GAAG,MAAH,CAAU,aAAa,MAAvB,CAAD,IACI,WAAW,CAAC,aAAa,SAAb,CAAuB,OAAvB,CADpB,EACsD;AACpD;AACD;;AAED,QAAM,MAAM,SAAS,YAAT,EAAuB,aAAa,MAApC,EAA4C,aAAa,QAAzD,EAAmE,CAAnE,EAAsE,IAAtE,CAAZ;;AAEA,QAAI,QAAQ,SAAZ,EAAuB;AACrB,aAAO,GAAP;AACD;AACF;AACF,CAhBD;;AAkBA;AACA,aAAa,UAAb,GAA0B,MAAM,UAAN,GAAmB,EAA7C;;AAEA,aAAa,OAAb,GAAuB,OAAvB;;AAEA,aAAa,eAAb,GAA+B,CAAE,aAAF,EAAiB,QAAjB,EAA2B,gBAA3B,EAA6C,aAA7C,CAA/B;;AAEA,OAAO,OAAP,GAAiB,YAAjB;;;;;;;ACtcA,IAAM,QAAa,QAAQ,SAAR,CAAnB;AACA,IAAM,QAAa,QAAQ,SAAR,CAAnB;AACA,IAAM,SAAa,QAAQ,gBAAR,CAAnB;AACA,IAAM,UAAa,QAAQ,iBAAR,CAAnB;AACA,IAAM,aAAa,QAAQ,oBAAR,CAAnB;AACA,IAAM,SAAa,QAAQ,2BAAR,CAAnB;AACA,IAAM,UAAa,QAAQ,iBAAR,EAA2B,GAA3B,EAAnB;;AAEA,IAAM,YAAc,EAApB;AACA,IAAM,cAAc,CAClB,aADkB,EACH,aADG,EACY,WADZ,EAElB,eAFkB,EAED,eAFC,CAApB;;AAKA;AACA,IAAI,gBAAgB,CAApB;;AAEA;AACA,MAAM,YAAN,GAAqB,EAArB;;IAEM,W;AACJ,6BAA8B;AAAA,QAAf,WAAe,QAAf,WAAe;;AAAA;;AAC5B,SAAK,MAAL,GAAqB,IAArB,CAD4B,CACD;AAC3B,SAAK,OAAL,GAAqB,IAArB,CAF4B,CAED;;AAE3B,SAAK,QAAL,GAAqB,EAAM;AACzB,YAAO,IADY;AAEnB,YAAO,IAFY;AAGnB,aAAO;AAHY,KAArB;;AAMA;AACA,SAAK,QAAL,GAAmB,EAAnB;AACA,SAAK,UAAL,GAAmB,EAAnB;AACA,SAAK,WAAL,GAAmB,EAAnB;AACA,SAAK,SAAL,GAAmB,EAAnB;;AAEA;AACA,SAAK,UAAL,GAAkB;AAChB,YAAW,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EADK;AAEhB,cAAW,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EAFK;AAGhB,iBAAW;AAHK,KAAlB;AAKA;AACA,SAAK,SAAL,GAAiB;AACf,YAAW,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EADI;AAEf,cAAW,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EAFI;AAGf,iBAAW;AAHI,KAAjB;;AAMA;AACA,SAAK,WAAL,GAAmB;AACjB,YAAW,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EADM;AAEjB,cAAW,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EAFM;AAGjB,iBAAW;AAHM,KAAnB;;AAMA;AACA,SAAK,YAAL,GAAoB;AAClB,YAAW,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EAAc,IAAI,CAAlB,EAAqB,IAAI,CAAzB,EAA4B,OAAO,CAAnC,EADO;AAElB,cAAW,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EAAc,IAAI,CAAlB,EAAqB,IAAI,CAAzB,EAA4B,OAAO,CAAnC,EAFO;AAGlB,iBAAW;AAHO,KAApB;;AAMA,SAAK,SAAL,GAAmB,IAAnB,CA3C4B,CA2CA;AAC5B,SAAK,WAAL,GAAmB,EAAnB;;AAEA,SAAK,YAAL,GAAuB,IAAvB;AACA,SAAK,eAAL,GAAuB,IAAvB;;AAEA,SAAK,SAAL,GAAiB,IAAjB,CAjD4B,CAiDA;;AAE5B,SAAK,aAAL,GAAuB,KAAvB;AACA,SAAK,eAAL,GAAuB,KAAvB;AACA,SAAK,YAAL,GAAuB,KAAvB;;AAEA,SAAK,WAAL,GAAmB,WAAnB;;AAEA,YAAQ,IAAR,CAAa,KAAb,EAAoB,IAApB;;AAEA,UAAM,YAAN,CAAmB,IAAnB,CAAwB,IAAxB;AACD;;wBAED,W,wBAAa,O,EAAS,K,EAAO,W,EAAa;AACxC,QAAM,eAAe,KAAK,aAAL,CAAmB,OAAnB,EAA4B,KAA5B,EAAmC,IAAnC,CAArB;;AAEA,YAAQ,IAAR,CAAa,MAAb,EAAqB;AACnB,sBADmB;AAEnB,kBAFmB;AAGnB,8BAHmB;AAInB,gCAJmB;AAKnB,mBAAa;AALM,KAArB;AAOD,G;;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wBAgCA,K,kBAAO,M,EAAQ,M,EAAQ,O,EAAS;AAC9B,QAAI,KAAK,WAAL,MACG,CAAC,KAAK,aADT,IAEG,KAAK,UAAL,CAAgB,MAAhB,IAA0B,OAAO,IAAP,KAAgB,SAAhB,GAA2B,CAA3B,GAA+B,CAAzD,CAFP,EAEoE;AAClE;AACD;;AAED;AACA;AACA,QAAI,MAAM,OAAN,CAAc,MAAM,YAApB,EAAkC,IAAlC,MAA4C,CAAC,CAAjD,EAAoD;AAClD,YAAM,YAAN,CAAmB,IAAnB,CAAwB,IAAxB;AACD;;AAED,UAAM,UAAN,CAAiB,KAAK,QAAtB,EAAgC,MAAhC;AACA,SAAK,MAAL,GAAsB,MAAtB;AACA,SAAK,OAAL,GAAsB,OAAtB;;AAEA,YAAQ,IAAR,CAAa,cAAb,EAA6B;AAC3B,mBAAa,IADc;AAE3B,aAAO,KAAK;AAFe,KAA7B;AAID,G;;wBAED,W,wBAAa,O,EAAS,K,EAAO,W,EAAa;AACxC,QAAI,CAAC,KAAK,UAAV,EAAsB;AACpB,WAAK,aAAL,CAAmB,OAAnB;AACA,YAAM,SAAN,CAAgB,KAAK,SAArB,EAAgC,KAAK,QAArC;AACD;;AAED,QAAM,gBAAiB,KAAK,SAAL,CAAe,IAAf,CAAoB,CAApB,KAA0B,KAAK,UAAL,CAAgB,IAAhB,CAAqB,CAA/C,IACG,KAAK,SAAL,CAAe,IAAf,CAAoB,CAApB,KAA0B,KAAK,UAAL,CAAgB,IAAhB,CAAqB,CADlD,IAEG,KAAK,SAAL,CAAe,MAAf,CAAsB,CAAtB,KAA4B,KAAK,UAAL,CAAgB,MAAhB,CAAuB,CAFtD,IAGG,KAAK,SAAL,CAAe,MAAf,CAAsB,CAAtB,KAA4B,KAAK,UAAL,CAAgB,MAAhB,CAAuB,CAH7E;;AAKA,QAAI,WAAJ;AACA,QAAI,WAAJ;;AAEA;AACA,QAAI,KAAK,aAAL,IAAsB,CAAC,KAAK,eAAhC,EAAiD;AAC/C,WAAK,KAAK,SAAL,CAAe,MAAf,CAAsB,CAAtB,GAA0B,KAAK,WAAL,CAAiB,MAAjB,CAAwB,CAAvD;AACA,WAAK,KAAK,SAAL,CAAe,MAAf,CAAsB,CAAtB,GAA0B,KAAK,WAAL,CAAiB,MAAjB,CAAwB,CAAvD;;AAEA,WAAK,eAAL,GAAuB,MAAM,KAAN,CAAY,EAAZ,EAAgB,EAAhB,IAAsB,YAAY,oBAAzD;AACD;;AAED,QAAM,YAAY;AAChB,sBADgB;AAEhB,oBAAc,KAAK,eAAL,CAAqB,OAArB,CAFE;AAGhB,kBAHgB;AAIhB,8BAJgB;AAKhB,YALgB;AAMhB,YANgB;AAOhB,iBAAW,aAPK;AAQhB,mBAAa,IARG;AAShB,6BAAuB,KAAK,WAAL;AATP,KAAlB;;AAYA,QAAI,CAAC,aAAL,EAAoB;AAClB;AACA,YAAM,cAAN,CAAqB,KAAK,YAA1B,EAAwC,KAAK,UAA7C,EAAyD,KAAK,SAA9D;AACD;;AAED,YAAQ,IAAR,CAAa,MAAb,EAAqB,SAArB;;AAEA,QAAI,CAAC,aAAL,EAAoB;AAClB;AACA,UAAI,KAAK,WAAL,EAAJ,EAAwB;AACtB,aAAK,MAAL,CAAY,SAAZ;AACD;;AAED,UAAI,KAAK,eAAT,EAA0B;AACxB,cAAM,UAAN,CAAiB,KAAK,UAAtB,EAAkC,KAAK,SAAvC;AACD;AACF;AACF,G;;AAED;;;;;;;;;;;;;;;;;;;;;;wBAoBA,M,mBAAQ,S,EAAW;AACjB,gBAAY,MAAM,MAAN,CAAa;AACvB,eAAS,KAAK,QAAL,CAAc,CAAd,CADc;AAEvB,aAAO,KAAK,SAFW;AAGvB,mBAAa,KAAK,YAHK;AAIvB,mBAAa;AAJU,KAAb,EAKT,aAAa,EALJ,CAAZ;;AAOA,YAAQ,IAAR,CAAa,oBAAb,EAAmC,SAAnC;;AAEA,QAAI,CAAC,KAAK,aAAV,EAAyB;AACvB,cAAQ,IAAR,CAAa,aAAb,EAA4B,SAA5B;AACD;;AAED,SAAK,aAAL,GAAqB,KAArB;AACD,G;;AAED;;;wBACA,S,sBAAW,O,EAAS,K,EAAO,W,EAAa,c,EAAgB;AACtD,QAAM,eAAe,KAAK,eAAL,CAAqB,OAArB,CAArB;;AAEA,YAAQ,IAAR,CAAa,WAAW,IAAX,CAAgB,MAAM,IAAtB,IAA6B,QAA7B,GAAwC,IAArD,EAA2D;AACzD,sBADyD;AAEzD,gCAFyD;AAGzD,kBAHyD;AAIzD,8BAJyD;AAKzD,oCALyD;AAMzD,mBAAa;AAN4C,KAA3D;;AASA,QAAI,CAAC,KAAK,UAAV,EAAsB;AACpB,WAAK,GAAL,CAAS,KAAT;AACD;;AAED,SAAK,aAAL,GAAqB,KAArB;AACA,SAAK,aAAL,CAAmB,OAAnB,EAA4B,KAA5B;AACD,G;;AAED;;;;;;;;;;;;;;;;;;;;;;wBAoBA,G,gBAAK,K,EAAO;AACV,YAAQ,SAAS,KAAK,SAAtB;;AAEA,QAAI,KAAK,WAAL,EAAJ,EAAwB;AACtB,cAAQ,IAAR,CAAa,YAAb,EAA2B;AACzB,oBADyB;AAEzB,qBAAa;AAFY,OAA3B;AAID;;AAED,SAAK,IAAL;AACD,G;;wBAED,a,4BAAiB;AACf,WAAO,KAAK,YAAL,GAAmB,KAAK,QAAL,CAAc,IAAjC,GAAuC,IAA9C;AACD,G;;wBAED,W,0BAAe;AACb,WAAO,KAAK,YAAZ;AACD,G;;wBAED,I,mBAAQ;AACN,YAAQ,IAAR,CAAa,MAAb,EAAqB,EAAE,aAAa,IAAf,EAArB;;AAEA,QAAI,KAAK,YAAT,EAAuB;AACrB,cAAQ,IAAR,CAAa,aAAb,EAA4B,EAAE,aAAa,IAAf,EAA5B;AACA,cAAQ,IAAR,CAAa,UAAU,KAAK,QAAL,CAAc,IAArC,EAA2C,EAAE,aAAa,IAAf,EAA3C;AACD;;AAED,SAAK,MAAL,GAAc,KAAK,OAAL,GAAe,IAA7B;;AAEA,SAAK,YAAL,GAAoB,KAApB;AACA,SAAK,QAAL,CAAc,IAAd,GAAqB,KAAK,SAAL,GAAiB,IAAtC;AACD,G;;wBAED,e,4BAAiB,O,EAAS;AACxB;AACA,QAAI,KAAK,WAAL,KAAqB,OAArB,IAAgC,KAAK,WAAL,KAAqB,KAAzD,EAAgE;AAC9D,aAAO,CAAP;AACD;;AAED,WAAO,MAAM,OAAN,CAAc,KAAK,UAAnB,EAA+B,MAAM,YAAN,CAAmB,OAAnB,CAA/B,CAAP;AACD,G;;wBAED,a,0BAAe,O,EAAS,K,EAA0D;AAAA,QAAnD,IAAmD,uEAA5C,SAAS,iBAAiB,IAAjB,CAAsB,MAAM,IAA5B,CAAmC;;AAChF,QAAM,KAAK,MAAM,YAAN,CAAmB,OAAnB,CAAX;AACA,QAAI,QAAQ,KAAK,eAAL,CAAqB,OAArB,CAAZ;;AAEA,QAAI,UAAU,CAAC,CAAf,EAAkB;AAChB,cAAQ,KAAK,UAAL,CAAgB,MAAxB;AACA,WAAK,UAAL,CAAgB,KAAhB,IAAyB,EAAzB;AACD;;AAED,QAAI,IAAJ,EAAU;AACR,cAAQ,IAAR,CAAa,qBAAb,EAAoC;AAClC,wBADkC;AAElC,oBAFkC;AAGlC,kBAHkC;AAIlC,mBAAW,EAJuB;AAKlC,sBAAc,KALoB;AAMlC,qBAAa;AANqB,OAApC;AAQD;;AAED,SAAK,QAAL,CAAc,KAAd,IAAuB,OAAvB;;AAEA,WAAO,KAAP;AACD,G;;wBAED,a,0BAAe,O,EAAS,K,EAAO;AAC7B,QAAM,QAAQ,KAAK,eAAL,CAAqB,OAArB,CAAd;;AAEA,QAAI,UAAU,CAAC,CAAf,EAAkB;AAAE;AAAS;;AAE7B,YAAQ,IAAR,CAAa,gBAAb,EAA+B;AAC7B,sBAD6B;AAE7B,kBAF6B;AAG7B,oBAAc,KAHe;AAI7B,mBAAa;AAJgB,KAA/B;;AAOA,SAAK,QAAL,CAAiB,MAAjB,CAAwB,KAAxB,EAA+B,CAA/B;AACA,SAAK,UAAL,CAAiB,MAAjB,CAAwB,KAAxB,EAA+B,CAA/B;AACA,SAAK,WAAL,CAAiB,MAAjB,CAAwB,KAAxB,EAA+B,CAA/B;AACA,SAAK,SAAL,CAAiB,MAAjB,CAAwB,KAAxB,EAA+B,CAA/B;AACD,G;;wBAED,mB,gCAAqB,M,EAAQ,a,EAAe;AAC1C,SAAK,YAAL,GAAuB,MAAvB;AACA,SAAK,eAAL,GAAuB,aAAvB;AACD,G;;;;;AAGH,KAAK,IAAI,IAAI,CAAR,EAAW,MAAM,YAAY,MAAlC,EAA0C,IAAI,GAA9C,EAAmD,GAAnD,EAAwD;AACtD,MAAM,SAAS,YAAY,CAAZ,CAAf;;AAEA,YAAU,MAAV,IAAoB,iBAAiB,MAAjB,CAApB;AACD;;AAED,SAAS,gBAAT,CAA2B,MAA3B,EAAmC;AACjC,SAAQ,UAAU,KAAV,EAAiB;AACvB,QAAM,cAAc,MAAM,cAAN,CAAqB,KAArB,CAApB;;AADuB,gCAEe,MAAM,eAAN,CAAsB,KAAtB,CAFf;AAAA,QAEhB,WAFgB;AAAA,QAEH,cAFG;;AAGvB,QAAM,UAAU,EAAhB,CAHuB,CAGH;;AAEpB,QAAI,QAAQ,aAAR,IAAyB,QAAQ,IAAR,CAAa,MAAM,IAAnB,CAA7B,EAAuD;AACrD,sBAAgB,IAAI,IAAJ,GAAW,OAAX,EAAhB;;AAEA,WAAK,IAAI,KAAI,CAAb,EAAgB,KAAI,MAAM,cAAN,CAAqB,MAAzC,EAAiD,IAAjD,EAAsD;AACpD,YAAM,UAAU,MAAM,cAAN,CAAqB,EAArB,CAAhB;AACA,YAAM,cAAc,OAAO,MAAP,CAAc,OAAd,EAAuB,MAAM,IAA7B,EAAmC,WAAnC,CAApB;;AAEA,gBAAQ,IAAR,CAAa,CAAC,OAAD,EAAU,eAAe,IAAI,WAAJ,CAAgB,EAAE,wBAAF,EAAhB,CAAzB,CAAb;AACD;AACF,KATD,MAUK;AACH,UAAI,iBAAiB,KAArB;;AAEA,UAAI,CAAC,QAAQ,oBAAT,IAAiC,QAAQ,IAAR,CAAa,MAAM,IAAnB,CAArC,EAA+D;AAC7D;AACA,aAAK,IAAI,MAAI,CAAb,EAAgB,MAAI,MAAM,YAAN,CAAmB,MAAvB,IAAiC,CAAC,cAAlD,EAAkE,KAAlE,EAAuE;AACrE,2BAAiB,MAAM,YAAN,CAAmB,GAAnB,EAAsB,WAAtB,KAAsC,OAAtC,IAAiD,MAAM,YAAN,CAAmB,GAAnB,EAAsB,aAAxF;AACD;;AAED;AACA;AACA,yBAAiB,kBACX,IAAI,IAAJ,GAAW,OAAX,KAAuB,aAAvB,GAAuC;AAC3C;AAFe,WAGZ,MAAM,SAAN,KAAoB,CAHzB;AAID;;AAED,UAAI,CAAC,cAAL,EAAqB;AACnB,YAAI,eAAc,OAAO,MAAP,CAAc,KAAd,EAAqB,MAAM,IAA3B,EAAiC,WAAjC,CAAlB;;AAEA,YAAI,CAAC,YAAL,EAAkB;AAChB,yBAAc,IAAI,WAAJ,CAAgB,EAAE,wBAAF,EAAhB,CAAd;AACD;;AAED,gBAAQ,IAAR,CAAa,CAAC,KAAD,EAAQ,YAAR,CAAb;AACD;AACF;;AAED,yBAAqC,OAArC,mHAA8C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,UAAlC,QAAkC;AAAA,UAAzB,aAAyB;;AAC5C,oBAAY,mBAAZ,CAAgC,WAAhC,EAA6C,cAA7C;AACA,oBAAY,MAAZ,EAAoB,QAApB,EAA6B,KAA7B,EAAoC,WAApC,EAAiD,cAAjD;AACD;AACF,GA/CD;AAgDD;;AAED,SAAS,MAAT,CAAiB,KAAjB,EAAwB;AACtB,OAAK,IAAI,MAAI,CAAb,EAAgB,MAAI,MAAM,YAAN,CAAmB,MAAvC,EAA+C,KAA/C,EAAoD;AAClD,QAAM,cAAc,MAAM,YAAN,CAAmB,GAAnB,CAApB;;AAEA,gBAAY,GAAZ,CAAgB,KAAhB;AACA,YAAQ,IAAR,CAAa,QAAb,EAAuB,EAAE,YAAF,EAAS,wBAAT,EAAvB;AACD;AACF;;AAED,IAAM,YAAY,CAAE,+BAAF,CAAlB;AACA,IAAM,cAAc,QAAQ,WAA5B;;AAEA,IAAI,WAAW,YAAf,EAA6B;AAC3B,YAAU,YAAY,IAAtB,IAAgC,UAAU,WAA1C;AACA,YAAU,YAAY,IAAtB,IAAgC,UAAU,WAA1C;AACA,YAAU,YAAY,EAAtB,IAAgC,UAAU,SAA1C;AACA,YAAU,YAAY,MAAtB,IAAgC,UAAU,SAA1C;AACD,CALD,MAMK;AACH,YAAU,SAAV,GAAwB,UAAU,WAAlC;AACA,YAAU,SAAV,GAAwB,UAAU,WAAlC;AACA,YAAU,OAAV,GAAwB,UAAU,SAAlC;;AAEA,YAAU,UAAV,GAAwB,UAAU,WAAlC;AACA,YAAU,SAAV,GAAwB,UAAU,WAAlC;AACA,YAAU,QAAV,GAAwB,UAAU,SAAlC;AACA,YAAU,WAAV,GAAwB,UAAU,SAAlC;AACD;;AAED,UAAU,IAAV,GAAiB,MAAjB;;AAEA,SAAS,WAAT,QAA+B,UAA/B,EAA2C;AAAA,MAAnB,GAAmB,SAAnB,GAAmB;;AACzC,MAAM,cAAc,WAAW,OAAX,CAAmB,KAAnB,MAA8B,CAA9B,GAChB,OAAO,GADS,GACH,OAAO,MADxB;;AAGA;AACA,OAAK,IAAM,SAAX,IAAwB,MAAM,eAA9B,EAA+C;AAC7C,gBAAY,GAAZ,EAAiB,SAAjB,EAA4B,OAAO,gBAAnC;AACA,gBAAY,GAAZ,EAAiB,SAAjB,EAA4B,OAAO,kBAAnC,EAAuD,IAAvD;AACD;;AAED,OAAK,IAAM,UAAX,IAAwB,SAAxB,EAAmC;AACjC,gBAAY,GAAZ,EAAiB,UAAjB,EAA4B,UAAU,UAAV,CAA5B;AACD;AACF;;AAED,QAAQ,EAAR,CAAW,qBAAX,EAAkC,iBAAiF;AAAA,MAA9E,WAA8E,SAA9E,WAA8E;AAAA,MAAjE,OAAiE,SAAjE,OAAiE;AAAA,MAAxD,SAAwD,SAAxD,SAAwD;AAAA,MAA7C,YAA6C,SAA7C,YAA6C;AAAA,MAA/B,KAA+B,SAA/B,KAA+B;AAAA,MAAxB,WAAwB,SAAxB,WAAwB;AAAA,MAAX,IAAW,SAAX,IAAW;;AACjH,cAAY,UAAZ,CAAuB,YAAvB,IAAuC,SAAvC;AACA,cAAY,QAAZ,CAAqB,YAArB,IAAqC,OAArC;;AAEA,MAAI,IAAJ,EAAU;AACR,gBAAY,aAAZ,GAA4B,IAA5B;AACD;;AAED,MAAI,CAAC,YAAY,WAAZ,EAAL,EAAgC;AAC9B,UAAM,SAAN,CAAgB,YAAY,WAA5B,EAAyC,YAAY,QAArD;;AAEA,UAAM,UAAN,CAAiB,YAAY,SAA7B,EAAyC,YAAY,WAArD;AACA,UAAM,UAAN,CAAiB,YAAY,UAA7B,EAAyC,YAAY,WAArD;;AAEA,gBAAY,SAAZ,GAAwC,KAAxC;AACA,gBAAY,SAAZ,CAAsB,YAAtB,IAAwC,YAAY,SAAZ,CAAsB,SAA9D;AACA,gBAAY,WAAZ,CAAwB,YAAxB,IAAwC,eAAe,SAAS,MAAM,eAAN,CAAsB,KAAtB,EAA6B,CAA7B,CAAhE;AACA,gBAAY,eAAZ,GAAwC,KAAxC;;AAEA,UAAM,aAAN,CAAoB,YAAY,WAAhC,EAA6C,OAA7C;AACD;AACF,CArBD;;AAuBA,MAAM,OAAN,CAAc,EAAd,CAAiB,cAAjB,EAAoC,WAApC;AACA,MAAM,OAAN,CAAc,EAAd,CAAiB,iBAAjB,EAAoC,WAApC;;AAEA,YAAY,oBAAZ,GAAmC,CAAnC;AACA,YAAY,gBAAZ,GAA+B,gBAA/B;AACA,YAAY,MAAZ,GAAqB,MAArB;AACA,YAAY,OAAZ,GAAsB,OAAtB;AACA,YAAY,SAAZ,GAAwB,SAAxB;;AAEA,MAAM,kBAAN,GAA2B,MAA3B;;AAEA,OAAO,OAAP,GAAiB,WAAjB;;;;;AC/fA,IAAM,cAAgB,QAAQ,gBAAR,CAAtB;AACA,IAAM,gBAAgB,QAAQ,kBAAR,CAAtB;;AAEA,IAAM,UAAU;AACd,4BADc;AAEd,SAAO,EAFO;AAGd,cAAY;AAHE,CAAhB;;AAMA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,cAAvB,EAAuC,gBAAkC;AAAA,MAAtB,WAAsB,QAAtB,WAAsB;AAAA,MAAT,KAAS,QAAT,KAAS;;AACvE,cAAY,YAAZ,GAA2B,IAA3B;AACA,eAAa,WAAb,EAA0B,KAA1B,EAAiC,OAAjC;AACD,CAHD;;AAKA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,aAAvB,EAAsC,iBAA0C;AAAA,MAA9B,WAA8B,SAA9B,WAA8B;AAAA,MAAjB,KAAiB,SAAjB,KAAiB;AAAA,MAAV,MAAU,SAAV,MAAU;;AAC9E,eAAa,WAAb,EAA0B,KAA1B,EAAiC,MAAjC,EAAyC,MAAzC;;AAEA;AACA,MAAI,CAAC,YAAY,WAAZ,EAAL,EAAgC;AAAE,WAAO,KAAP;AAAe;AAClD,CALD;;AAOA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,YAAvB,EAAqC,iBAAkC;AAAA,MAAtB,WAAsB,SAAtB,WAAsB;AAAA,MAAT,KAAS,SAAT,KAAS;;AACrE,eAAa,WAAb,EAA0B,KAA1B,EAAiC,KAAjC;AACD,CAFD;;AAIA,SAAS,YAAT,CAAuB,WAAvB,EAAoC,KAApC,EAA2C,KAA3C,EAAkD,MAAlD,EAA0D;AACxD,MAAM,aAAa,YAAY,QAAZ,CAAqB,IAAxC;;AAEA,MAAM,WAAW,IAAI,aAAJ,CAAkB,WAAlB,EAA+B,KAA/B,EAAsC,UAAtC,EAAkD,KAAlD,EAAyD,YAAY,OAArE,EAA8E,IAA9E,EAAoF,MAApF,CAAjB;;AAEA,cAAY,MAAZ,CAAmB,IAAnB,CAAwB,QAAxB;AACA,cAAY,SAAZ,GAAwB,QAAxB;AACD;;AAED,OAAO,OAAP,GAAiB,OAAjB;;;;;AClCA,IAAM,UAAiB,QAAQ,QAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,UAAR,CAAvB;AACA,IAAM,gBAAiB,QAAQ,kBAAR,CAAvB;AACA,IAAM,eAAiB,QAAQ,iBAAR,CAAvB;AACA,IAAM,cAAiB,QAAQ,gBAAR,CAAvB;AACA,IAAM,iBAAiB,QAAQ,mBAAR,CAAvB;;AAEA,IAAM,OAAO;AACX,YAAU;AACR,aAAc,KADN;AAER,kBAAc,IAFN;;AAIR,YAAY,IAJJ;AAKR,UAAY,IALJ;AAMR,cAAY,IANJ;AAOR,aAAY,IAPJ;AAQR,gBAAY,IARJ;;AAUR,eAAY,IAVJ;AAWR,cAAY;AAXJ,GADC;;AAeX,WAAS,iBAAU,OAAV,EAAmB,KAAnB,EAA0B,YAA1B,EAAwC;AAC/C,QAAM,cAAc,aAAa,OAAb,CAAqB,IAAzC;;AAEA,WAAO,YAAY,OAAZ,GACH,EAAE,MAAM,MAAR,EAAgB,MAAO,YAAY,QAAZ,KAAyB,OAAzB,GACE,YAAY,SADd,GAEE,YAAY,QAFrC,EADG,GAIH,IAJJ;AAKD,GAvBU;;AAyBX,aAAW,qBAAY;AACrB,WAAO,MAAP;AACD;AA3BU,CAAb;;AA8BA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,oBAAvB,EAA6C,gBAA2B;AAAA,MAAf,WAAe,QAAf,WAAe;;AACtE,MAAI,YAAY,QAAZ,CAAqB,IAArB,KAA8B,MAAlC,EAA0C;AAAE;AAAS;;AAErD,MAAM,OAAO,YAAY,QAAZ,CAAqB,IAAlC;;AAEA,MAAI,SAAS,GAAb,EAAkB;AAChB,gBAAY,SAAZ,CAAsB,IAAtB,CAA2B,CAA3B,GAAiC,YAAY,WAAZ,CAAwB,IAAxB,CAA6B,CAA9D;AACA,gBAAY,SAAZ,CAAsB,MAAtB,CAA6B,CAA7B,GAAiC,YAAY,WAAZ,CAAwB,MAAxB,CAA+B,CAAhE;;AAEA,gBAAY,YAAZ,CAAyB,IAAzB,CAA8B,KAA9B,GAAwC,KAAK,GAAL,CAAS,YAAY,YAAZ,CAAyB,IAAzB,CAA8B,EAAvC,CAAxC;AACA,gBAAY,YAAZ,CAAyB,MAAzB,CAAgC,KAAhC,GAAwC,KAAK,GAAL,CAAS,YAAY,YAAZ,CAAyB,MAAzB,CAAgC,EAAzC,CAAxC;AACA,gBAAY,YAAZ,CAAyB,MAAzB,CAAgC,EAAhC,GAAqC,CAArC;AACA,gBAAY,YAAZ,CAAyB,IAAzB,CAA8B,EAA9B,GAAqC,CAArC;AACD,GARD,MASK,IAAI,SAAS,GAAb,EAAkB;AACrB,gBAAY,SAAZ,CAAsB,IAAtB,CAA2B,CAA3B,GAAiC,YAAY,WAAZ,CAAwB,IAAxB,CAA6B,CAA9D;AACA,gBAAY,SAAZ,CAAsB,MAAtB,CAA6B,CAA7B,GAAiC,YAAY,WAAZ,CAAwB,MAAxB,CAA+B,CAAhE;;AAEA,gBAAY,YAAZ,CAAyB,IAAzB,CAA8B,KAA9B,GAAwC,KAAK,GAAL,CAAS,YAAY,YAAZ,CAAyB,IAAzB,CAA8B,EAAvC,CAAxC;AACA,gBAAY,YAAZ,CAAyB,MAAzB,CAAgC,KAAhC,GAAwC,KAAK,GAAL,CAAS,YAAY,YAAZ,CAAyB,MAAzB,CAAgC,EAAzC,CAAxC;AACA,gBAAY,YAAZ,CAAyB,MAAzB,CAAgC,EAAhC,GAAqC,CAArC;AACA,gBAAY,YAAZ,CAAyB,IAAzB,CAA8B,EAA9B,GAAqC,CAArC;AACD;AACF,CAvBD;;AAyBA;AACA,cAAc,OAAd,CAAsB,EAAtB,CAAyB,KAAzB,EAAgC,iBAAmC;AAAA,MAAvB,MAAuB,SAAvB,MAAuB;AAAA,MAAf,WAAe,SAAf,WAAe;;AACjE,MAAI,OAAO,IAAP,KAAgB,UAApB,EAAgC;AAAE;AAAS;;AAE3C,MAAM,OAAO,YAAY,QAAZ,CAAqB,IAAlC;;AAEA,MAAI,SAAS,GAAb,EAAkB;AAChB,WAAO,KAAP,GAAiB,YAAY,WAAZ,CAAwB,IAAxB,CAA6B,CAA9C;AACA,WAAO,OAAP,GAAiB,YAAY,WAAZ,CAAwB,MAAxB,CAA+B,CAAhD;AACA,WAAO,EAAP,GAAY,CAAZ;AACD,GAJD,MAKK,IAAI,SAAS,GAAb,EAAkB;AACrB,WAAO,KAAP,GAAiB,YAAY,WAAZ,CAAwB,IAAxB,CAA6B,CAA9C;AACA,WAAO,OAAP,GAAiB,YAAY,WAAZ,CAAwB,MAAxB,CAA+B,CAAhD;AACA,WAAO,EAAP,GAAY,CAAZ;AACD;AACF,CAfD;;AAiBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoCA,aAAa,SAAb,CAAuB,SAAvB,GAAmC,UAAU,OAAV,EAAmB;AACpD,MAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,OAAhB,CAAJ,EAA8B;AAC5B,SAAK,OAAL,CAAa,IAAb,CAAkB,OAAlB,GAA4B,QAAQ,OAAR,KAAoB,KAApB,GAA2B,KAA3B,GAAkC,IAA9D;AACA,SAAK,YAAL,CAAkB,MAAlB,EAA0B,OAA1B;AACA,SAAK,WAAL,CAAiB,MAAjB,EAAyB,OAAzB;;AAEA,QAAI,mBAAmB,IAAnB,CAAwB,QAAQ,QAAhC,CAAJ,EAA+C;AAC7C,WAAK,OAAL,CAAa,IAAb,CAAkB,QAAlB,GAA6B,QAAQ,QAArC;AACD;AACD,QAAI,aAAa,IAAb,CAAkB,QAAQ,SAA1B,CAAJ,EAA0C;AACxC,WAAK,OAAL,CAAa,IAAb,CAAkB,SAAlB,GAA8B,QAAQ,SAAtC;AACD;;AAED,WAAO,IAAP;AACD;;AAED,MAAI,MAAM,EAAN,CAAS,IAAT,CAAc,OAAd,CAAJ,EAA4B;AAC1B,SAAK,OAAL,CAAa,IAAb,CAAkB,OAAlB,GAA4B,OAA5B;;AAEA,QAAI,CAAC,OAAL,EAAc;AACZ,WAAK,WAAL,GAAmB,KAAK,WAAL,GAAmB,KAAK,SAAL,GAAiB,IAAvD;AACD;;AAED,WAAO,IAAP;AACD;;AAED,SAAO,KAAK,OAAL,CAAa,IAApB;AACD,CA3BD;;AA6BA,QAAQ,IAAR,GAAe,IAAf;AACA,QAAQ,KAAR,CAAc,IAAd,CAAmB,MAAnB;AACA,MAAM,KAAN,CAAY,aAAa,UAAzB,EAAqC,CACnC,WADmC,EAEnC,UAFmC,EAGnC,kBAHmC,EAInC,mBAJmC,EAKnC,SALmC,CAArC;AAOA,QAAQ,UAAR,CAAmB,IAAnB,GAA0B,WAA1B;;AAEA,eAAe,IAAf,GAAsB,KAAK,QAA3B;;AAEA,OAAO,OAAP,GAAiB,IAAjB;;;;;AC9JA,IAAM,UAAiB,QAAQ,QAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,UAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,UAAR,CAAvB;AACA,IAAM,WAAiB,QAAQ,aAAR,CAAvB;AACA,IAAM,gBAAiB,QAAQ,kBAAR,CAAvB;AACA,IAAM,eAAiB,QAAQ,iBAAR,CAAvB;AACA,IAAM,cAAiB,QAAQ,gBAAR,CAAvB;AACA,IAAM,iBAAiB,QAAQ,mBAAR,CAAvB;;AAEA,IAAM,OAAO;AACX,YAAU;AACR,aAAS,KADD;AAER,YAAS,IAFD;AAGR,aAAS;AAHD;AADC,CAAb;;AAQA,IAAI,cAAc,KAAlB;;AAEA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,cAAvB,EAAuC,gBAAkC;AAAA,MAAtB,WAAsB,QAAtB,WAAsB;AAAA,MAAT,KAAS,QAAT,KAAS;;AACvE,MAAI,YAAY,QAAZ,CAAqB,IAArB,KAA8B,MAAlC,EAA0C;AAAE;AAAS;;AAErD;AACA,cAAY,WAAZ,CAAwB,SAAxB,GAAoC,EAApC;AACA,cAAY,WAAZ,CAAwB,QAAxB,GAAoC,EAApC;AACA,cAAY,WAAZ,CAAwB,KAAxB,GAAoC,EAApC;;AAEA,cAAY,UAAZ,GAAyB,IAAzB;;AAEA,MAAI,CAAC,YAAY,WAAjB,EAA8B;AAC5B,mBAAe,WAAf,EAA4B,YAAY,OAAxC;AACD;;AAED,MAAM,YAAY,YAAY,SAA9B;AACA,MAAM,aAAa,cAAc,WAAd,EAA2B,KAA3B,EAAkC,SAAlC,CAAnB;;AAEA,MAAI,WAAW,QAAf,EAAyB;AACvB,oBAAgB,WAAhB,EAA6B,WAAW,QAAxC;AACD;AACF,CApBD;;AAsBA,cAAc,OAAd,CAAsB,EAAtB,CAAyB,KAAzB,EAAgC,iBAA0C;AAAA,MAA9B,WAA8B,SAA9B,WAA8B;AAAA,MAAjB,MAAiB,SAAjB,MAAiB;AAAA,MAAT,KAAS,SAAT,KAAS;;AACxE,MAAI,OAAO,IAAP,KAAgB,UAAhB,IAA8B,OAAO,IAAP,KAAgB,SAAlD,EAA6D;AAAE;AAAS;;AAExE,MAAM,mBAAmB,YAAY,OAArC;AACA,MAAM,YAAY,MAAlB;AACA,MAAM,aAAa,QAAQ,SAAR,EAAmB,KAAnB,EAA0B,gBAA1B,CAAnB;;AAEA,cAAY,UAAZ,GAA0B,WAAW,QAArC;AACA,cAAY,WAAZ,GAA0B,WAAW,OAArC;;AAEA,cAAY,UAAZ,GAAyB,cAAc,WAAd,EAA2B,KAA3B,EAAkC,SAAlC,CAAzB;AACD,CAXD;;AAaA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,aAAvB,EAAsC,iBAA2B;AAAA,MAAf,WAAe,SAAf,WAAe;;AAC/D,MAAI,YAAY,QAAZ,CAAqB,IAArB,KAA8B,MAAlC,EAA0C;AAAE;AAAS;;AAErD,iBAAe,WAAf,EAA4B,YAAY,UAAxC;AACD,CAJD;;AAMA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,YAAvB,EAAqC,iBAA2B;AAAA,MAAf,WAAe,SAAf,WAAe;;AAC9D,MAAI,YAAY,QAAZ,CAAqB,IAArB,KAA8B,MAAlC,EAA0C;AACxC,mBAAe,WAAf,EAA4B,YAAY,UAAxC;AACD;AACF,CAJD;;AAMA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,WAAvB,EAAoC,iBAA2B;AAAA,MAAf,WAAe,SAAf,WAAe;;AAC7D,cAAY,WAAZ,CAAwB,SAAxB,GACE,YAAY,WAAZ,CAAwB,QAAxB,GACA,YAAY,WAAZ,CAAwB,KAAxB,GACA,YAAY,UAAZ,GAAyB,IAH3B;AAID,CALD;;AAOA,SAAS,YAAT,CAAuB,WAAvB,EAAoC,OAApC,EAA6C;AAC3C,MAAM,QAAQ,EAAd;AACA,MAAM,WAAW,EAAjB;;AAEA,YAAU,WAAW,YAAY,OAAjC;;AAEA;AACA,uBAAsB,MAAM,aAA5B,kHAA2C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,QAAhC,OAAgC;;AACzC,QAAI,CAAC,QAAQ,OAAR,CAAgB,IAAhB,CAAqB,OAA1B,EAAmC;AAAE;AAAW;;AAEhD,QAAM,SAAS,QAAQ,OAAR,CAAgB,IAAhB,CAAqB,MAApC;;AAEA;AACA,QAAK,MAAM,EAAN,CAAS,OAAT,CAAiB,MAAjB,KAA4B,WAAW,OAAxC,IACI,MAAM,EAAN,CAAS,MAAT,CAAgB,MAAhB,KACD,CAAC,MAAM,eAAN,CAAsB,OAAtB,EAA+B,MAA/B,CAFR,EAEiD;;AAE/C;AACD;;AAED;AACA,QAAM,eAAe,MAAM,EAAN,CAAS,MAAT,CAAgB,QAAQ,MAAxB,IACjB,QAAQ,QAAR,CAAiB,gBAAjB,CAAkC,QAAQ,MAA1C,CADiB,GAEjB,CAAC,QAAQ,MAAT,CAFJ;;AAIA,SAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,aAAa,MAAjC,EAAyC,GAAzC,EAA8C;AAC5C,UAAM,iBAAiB,aAAa,CAAb,CAAvB;;AAEA,UAAI,mBAAmB,OAAvB,EAAgC;AAC9B,cAAM,IAAN,CAAW,OAAX;AACA,iBAAS,IAAT,CAAc,cAAd;AACD;AACF;AACF;;AAED,SAAO;AACL,sBADK;AAEL,eAAW;AAFN,GAAP;AAID;;AAED,SAAS,eAAT,CAA0B,WAA1B,EAAuC,KAAvC,EAA8C;AAC5C,MAAI,oBAAJ;;AAEA;AACA,OAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,YAAY,WAAZ,CAAwB,SAAxB,CAAkC,MAAtD,EAA8D,GAA9D,EAAmE;AACjE,QAAM,UAAU,YAAY,WAAZ,CAAwB,SAAxB,CAAkC,CAAlC,CAAhB;AACA,QAAM,iBAAiB,YAAY,WAAZ,CAAwB,QAAxB,CAAkC,CAAlC,CAAvB;;AAEA;AACA,QAAI,mBAAmB,WAAvB,EAAoC;AAClC;AACA,YAAM,MAAN,GAAe,cAAf;AACA,cAAQ,IAAR,CAAa,KAAb;AACD;AACD,kBAAc,cAAd;AACD;AACF;;AAED;AACA;AACA;AACA,SAAS,cAAT,CAAyB,WAAzB,EAAsC,WAAtC,EAAmD;AACjD;AACA,MAAM,gBAAgB,aAAa,WAAb,EAA0B,WAA1B,EAAuC,IAAvC,CAAtB;;AAEA,cAAY,WAAZ,CAAwB,SAAxB,GAAoC,cAAc,SAAlD;AACA,cAAY,WAAZ,CAAwB,QAAxB,GAAoC,cAAc,QAAlD;AACA,cAAY,WAAZ,CAAwB,KAAxB,GAAoC,EAApC;;AAEA,OAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,YAAY,WAAZ,CAAwB,SAAxB,CAAkC,MAAtD,EAA8D,GAA9D,EAAmE;AACjE,gBAAY,WAAZ,CAAwB,KAAxB,CAA8B,CAA9B,IACE,YAAY,WAAZ,CAAwB,SAAxB,CAAkC,CAAlC,EAAqC,OAArC,CAA6C,YAAY,WAAZ,CAAwB,QAAxB,CAAiC,CAAjC,CAA7C,CADF;AAED;AACF;;AAED,SAAS,OAAT,CAAkB,SAAlB,EAA6B,KAA7B,EAAoC,WAApC,EAAiD;AAC/C,MAAM,cAAc,UAAU,WAA9B;AACA,MAAM,aAAa,EAAnB;;AAEA,MAAI,WAAJ,EAAiB;AACf,mBAAe,WAAf,EAA4B,WAA5B;AACD;;AAED;AACA,OAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,YAAY,WAAZ,CAAwB,SAAxB,CAAkC,MAAtD,EAA8D,GAA9D,EAAmE;AACjE,QAAM,UAAiB,YAAY,WAAZ,CAAwB,SAAxB,CAAkC,CAAlC,CAAvB;AACA,QAAM,iBAAiB,YAAY,WAAZ,CAAwB,QAAxB,CAAkC,CAAlC,CAAvB;AACA,QAAM,OAAiB,YAAY,WAAZ,CAAwB,KAAxB,CAAkC,CAAlC,CAAvB;;AAEA,eAAW,IAAX,CAAgB,QAAQ,SAAR,CAAkB,SAAlB,EAA6B,KAA7B,EAAoC,YAAY,MAAhD,EAAwD,WAAxD,EAAqE,cAArE,EAAqF,IAArF,IACZ,cADY,GAEZ,IAFJ;AAGD;;AAED;AACA,MAAM,YAAY,MAAM,qBAAN,CAA4B,UAA5B,CAAlB;;AAEA,SAAO;AACL,cAAU,YAAY,WAAZ,CAAwB,SAAxB,CAAkC,SAAlC,KAAgD,IADrD;AAEL,aAAU,YAAY,WAAZ,CAAwB,QAAxB,CAAkC,SAAlC,KAAgD;AAFrD,GAAP;AAID;;AAED,SAAS,aAAT,CAAwB,WAAxB,EAAqC,YAArC,EAAmD,SAAnD,EAA8D;AAC5D,MAAM,aAAa;AACjB,WAAY,IADK;AAEjB,WAAY,IAFK;AAGjB,cAAY,IAHK;AAIjB,gBAAY,IAJK;AAKjB,UAAY,IALK;AAMjB,UAAY;AANK,GAAnB;;AASA,MAAM,OAAO;AACX,wBADW;AAEX,4BAFW;AAGX,YAAe,YAAY,WAHhB;AAIX,cAAe,YAAY,UAJhB;AAKX,mBAAe,UAAU,MALd;AAMX,eAAe,UAAU,YANd;AAOX,eAAe,UAAU;AAPd,GAAb;;AAUA,MAAI,YAAY,WAAZ,KAA4B,YAAY,eAA5C,EAA6D;AAC3D;AACA,QAAI,YAAY,cAAhB,EAAgC;AAC9B,iBAAW,KAAX,GAAmB,MAAM,MAAN,CAAa,EAAE,MAAM,WAAR,EAAb,EAAoC,IAApC,CAAnB;;AAEA,gBAAU,SAAV,GAAyB,WAAW,KAAX,CAAiB,MAAjB,GAA4B,YAAY,eAAjE;AACA,gBAAU,YAAV,GAAyB,WAAW,KAAX,CAAiB,QAAjB,GAA4B,YAAY,cAAjE;AACD;AACD;AACA,QAAI,YAAY,UAAhB,EAA4B;AAC1B,iBAAW,KAAX,GAAmB;AACjB,4BADiB;AAEjB,gCAFiB;AAGjB,gBAAe,YAAY,WAHV;AAIjB,kBAAe,YAAY,UAJV;AAKjB,uBAAe,UAAU,MALR;AAMjB,mBAAe,UAAU,YANR;AAOjB,mBAAe,UAAU,SAPR;AAQjB,cAAe;AARE,OAAnB;;AAWA,gBAAU,SAAV,GAAsB,YAAY,WAAlC;AACA,gBAAU,QAAV,GAAqB,YAAY,UAAjC;AACD;AACF;;AAED,MAAI,UAAU,IAAV,KAAmB,SAAnB,IAAgC,YAAY,UAAhD,EAA4D;AAC1D,eAAW,IAAX,GAAkB,MAAM,MAAN,CAAa,EAAE,MAAM,MAAR,EAAb,EAA+B,IAA/B,CAAlB;;AAEA,cAAU,QAAV,GAAqB,YAAY,UAAjC;AACA,cAAU,aAAV,GAA0B,YAAY,WAAtC;AACD;AACD,MAAI,UAAU,IAAV,KAAmB,WAAvB,EAAoC;AAClC,eAAW,QAAX,GAAsB,MAAM,MAAN,CAAa,EAAE,MAAM,cAAR,EAAb,EAAuC,IAAvC,CAAtB;;AAEA,eAAW,QAAX,CAAoB,MAApB,GAA+B,IAA/B;AACA,eAAW,QAAX,CAAoB,QAApB,GAA+B,IAA/B;AACD;AACD,MAAI,UAAU,IAAV,KAAmB,SAAvB,EAAkC;AAChC,eAAW,UAAX,GAAwB,MAAM,MAAN,CAAa,EAAE,MAAM,gBAAR,EAAb,EAAyC,IAAzC,CAAxB;;AAEA,eAAW,UAAX,CAAsB,MAAtB,GAAiC,IAAjC;AACA,eAAW,UAAX,CAAsB,QAAtB,GAAiC,IAAjC;AACD;AACD,MAAI,UAAU,IAAV,KAAmB,UAAnB,IAAiC,YAAY,UAAjD,EAA6D;AAC3D,eAAW,IAAX,GAAkB,MAAM,MAAN,CAAa;AAC7B,gBAAe,SADc;AAE7B,YAAe;AAFc,KAAb,EAGf,IAHe,CAAlB;;AAKA,cAAU,QAAV,GAAqB,YAAY,UAAjC;AACD;;AAED,SAAO,UAAP;AACD;;AAED,SAAS,cAAT,CAAyB,WAAzB,EAAsC,UAAtC,EAAkD;AAChD,MAAI,WAAW,KAAf,EAAsB;AAAE,gBAAY,cAAZ,CAA2B,IAA3B,CAAgC,WAAW,KAA3C;AAAoD;AAC5E,MAAI,WAAW,IAAf,EAAsB;AAAM,gBAAY,UAAZ,CAAuB,IAAvB,CAA4B,WAAW,IAAvC;AAAgD;AAC5E,MAAI,WAAW,KAAf,EAAsB;AAAM,gBAAY,UAAZ,CAAuB,IAAvB,CAA4B,WAAW,KAAvC;AAAgD;AAC5E,MAAI,WAAW,IAAf,EAAsB;AAAM,gBAAY,UAAZ,CAAuB,IAAvB,CAA4B,WAAW,IAAvC;AAAgD;AAC5E,MAAI,WAAW,UAAf,EAA2B;AACzB,oBAAgB,WAAhB,EAA6B,WAAW,UAAxC;AACD;;AAED,cAAY,cAAZ,GAA8B,YAAY,UAA1C;AACA,cAAY,eAAZ,GAA8B,YAAY,WAA1C;AACD;;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoDA,aAAa,SAAb,CAAuB,QAAvB,GAAkC,UAAU,OAAV,EAAmB;AACnD,MAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,OAAhB,CAAJ,EAA8B;AAC5B,SAAK,OAAL,CAAa,IAAb,CAAkB,OAAlB,GAA4B,QAAQ,OAAR,KAAoB,KAApB,GAA2B,KAA3B,GAAkC,IAA9D;;AAEA,QAAI,MAAM,EAAN,CAAS,QAAT,CAAkB,QAAQ,MAA1B,CAAJ,EAAiD;AAAE,WAAK,MAAL,CAAY,MAAZ,GAA+B,QAAQ,MAAvC;AAA0D;AAC7G,QAAI,MAAM,EAAN,CAAS,QAAT,CAAkB,QAAQ,cAA1B,CAAJ,EAAiD;AAAE,WAAK,MAAL,CAAY,cAAZ,GAA+B,QAAQ,cAAvC;AAA0D;AAC7G,QAAI,MAAM,EAAN,CAAS,QAAT,CAAkB,QAAQ,gBAA1B,CAAJ,EAAiD;AAAE,WAAK,MAAL,CAAY,gBAAZ,GAA+B,QAAQ,gBAAvC;AAA0D;AAC7G,QAAI,MAAM,EAAN,CAAS,QAAT,CAAkB,QAAQ,WAA1B,CAAJ,EAAiD;AAAE,WAAK,MAAL,CAAY,WAAZ,GAA+B,QAAQ,WAAvC;AAA0D;AAC7G,QAAI,MAAM,EAAN,CAAS,QAAT,CAAkB,QAAQ,WAA1B,CAAJ,EAAiD;AAAE,WAAK,MAAL,CAAY,WAAZ,GAA+B,QAAQ,WAAvC;AAA0D;AAC7G,QAAI,MAAM,EAAN,CAAS,QAAT,CAAkB,QAAQ,UAA1B,CAAJ,EAAiD;AAAE,WAAK,MAAL,CAAY,UAAZ,GAA+B,QAAQ,UAAvC;AAA0D;;AAE7G,QAAI,qBAAqB,IAArB,CAA0B,QAAQ,OAAlC,CAAJ,EAAgD;AAC9C,WAAK,OAAL,CAAa,IAAb,CAAkB,OAAlB,GAA4B,QAAQ,OAApC;AACD,KAFD,MAGK,IAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,QAAQ,OAAxB,CAAJ,EAAsC;AACzC,WAAK,OAAL,CAAa,IAAb,CAAkB,OAAlB,GAA4B,KAAK,GAAL,CAAS,KAAK,GAAL,CAAS,CAAT,EAAY,QAAQ,OAApB,CAAT,EAAuC,CAAvC,CAA5B;AACD;AACD,QAAI,YAAY,OAAhB,EAAyB;AACvB,WAAK,OAAL,CAAa,IAAb,CAAkB,MAAlB,GAA2B,QAAQ,MAAnC;AACD;AACD,QAAI,aAAa,OAAjB,EAA0B;AACxB,WAAK,OAAL,CAAa,IAAb,CAAkB,OAAlB,GAA4B,QAAQ,OAApC;AACD;;AAGD,WAAO,IAAP;AACD;;AAED,MAAI,MAAM,EAAN,CAAS,IAAT,CAAc,OAAd,CAAJ,EAA4B;AAC1B,SAAK,OAAL,CAAa,IAAb,CAAkB,OAAlB,GAA4B,OAA5B;;AAEA,QAAI,CAAC,OAAL,EAAc;AACZ,WAAK,WAAL,GAAmB,KAAK,WAAL,GAAmB,KAAK,MAAL,GAClC,KAAK,cAAL,GAAsB,KAAK,gBAAL,GAAwB,IADlD;AAED;;AAED,WAAO,IAAP;AACD;;AAED,SAAO,KAAK,OAAL,CAAa,IAApB;AACD,CAxCD;;AA0CA,aAAa,SAAb,CAAuB,SAAvB,GAAmC,UAAU,SAAV,EAAqB,KAArB,EAA4B,SAA5B,EAAuC,gBAAvC,EAAyD,WAAzD,EAAsE,IAAtE,EAA4E;AAC7G,MAAI,UAAU,KAAd;;AAEA;AACA;AACA,MAAI,EAAE,OAAO,QAAQ,KAAK,OAAL,CAAa,WAAb,CAAjB,CAAJ,EAAiD;AAC/C,WAAQ,KAAK,OAAL,CAAa,IAAb,CAAkB,OAAlB,GACJ,KAAK,OAAL,CAAa,IAAb,CAAkB,OAAlB,CAA0B,SAA1B,EAAqC,KAArC,EAA4C,OAA5C,EAAqD,IAArD,EAA2D,WAA3D,EAAwE,SAAxE,EAAmF,gBAAnF,CADI,GAEJ,KAFJ;AAGD;;AAED,MAAM,cAAc,KAAK,OAAL,CAAa,IAAb,CAAkB,OAAtC;;AAEA,MAAI,gBAAgB,SAApB,EAA+B;AAC7B,QAAM,SAAS,MAAM,WAAN,CAAkB,SAAlB,EAA6B,gBAA7B,EAA+C,MAA/C,CAAf;AACA,QAAM,OAAO,MAAM,SAAN,CAAgB,SAAhB,CAAb;;AAEA,SAAK,CAAL,IAAU,OAAO,CAAjB;AACA,SAAK,CAAL,IAAU,OAAO,CAAjB;;AAEA,QAAM,aAAc,KAAK,CAAL,GAAS,KAAK,IAAf,IAAyB,KAAK,CAAL,GAAS,KAAK,KAA1D;AACA,QAAM,WAAc,KAAK,CAAL,GAAS,KAAK,GAAf,IAAyB,KAAK,CAAL,GAAS,KAAK,MAA1D;;AAEA,cAAU,cAAc,QAAxB;AACD;;AAED,MAAM,WAAW,UAAU,OAAV,CAAkB,gBAAlB,CAAjB;;AAEA,MAAI,YAAY,gBAAgB,QAAhC,EAA0C;AACxC,QAAM,KAAK,SAAS,IAAT,GAAgB,SAAS,KAAT,GAAkB,CAA7C;AACA,QAAM,KAAK,SAAS,GAAT,GAAgB,SAAS,MAAT,GAAkB,CAA7C;;AAEA,cAAU,MAAM,KAAK,IAAX,IAAmB,MAAM,KAAK,KAA9B,IAAuC,MAAM,KAAK,GAAlD,IAAyD,MAAM,KAAK,MAA9E;AACD;;AAED,MAAI,YAAY,MAAM,EAAN,CAAS,MAAT,CAAgB,WAAhB,CAAhB,EAA8C;AAC5C,QAAM,cAAgB,KAAK,GAAL,CAAS,CAAT,EAAY,KAAK,GAAL,CAAS,KAAK,KAAd,EAAsB,SAAS,KAA/B,IAAyC,KAAK,GAAL,CAAS,KAAK,IAAd,EAAoB,SAAS,IAA7B,CAArD,IACE,KAAK,GAAL,CAAS,CAAT,EAAY,KAAK,GAAL,CAAS,KAAK,MAAd,EAAsB,SAAS,MAA/B,IAAyC,KAAK,GAAL,CAAS,KAAK,GAAd,EAAoB,SAAS,GAA7B,CAArD,CADxB;;AAGA,QAAM,eAAe,eAAe,SAAS,KAAT,GAAiB,SAAS,MAAzC,CAArB;;AAEA,cAAU,gBAAgB,WAA1B;AACD;;AAED,MAAI,KAAK,OAAL,CAAa,IAAb,CAAkB,OAAtB,EAA+B;AAC7B,cAAU,KAAK,OAAL,CAAa,IAAb,CAAkB,OAAlB,CAA0B,SAA1B,EAAqC,KAArC,EAA4C,OAA5C,EAAqD,IAArD,EAA2D,WAA3D,EAAwE,SAAxE,EAAmF,gBAAnF,CAAV;AACD;;AAED,SAAO,OAAP;AACD,CAjDD;;AAmDA,aAAa,OAAb,CAAqB,EAArB,CAAwB,OAAxB,EAAiC,iBAA4B;AAAA,MAAhB,YAAgB,SAAhB,YAAgB;;AAC3D,eAAa,QAAb,CAAsB,KAAtB;AACD,CAFD;;AAIA,aAAa,eAAb,CAA6B,IAA7B,CAAkC,aAAlC;;AAEA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,KAAvB,EAA8B,UAAU,WAAV,EAAuB;AACnD,cAAY,UAAZ,GAA8B,IAA9B,CADmD,CACf;AACpC,cAAY,WAAZ,GAA8B,IAA9B,CAFmD,CAEf;AACpC,cAAY,cAAZ,GAA8B,IAA9B,CAHmD,CAGf;AACpC,cAAY,eAAZ,GAA8B,IAA9B,CAJmD,CAIf;AACpC,cAAY,UAAZ,GAA8B,IAA9B,CALmD,CAKf;;AAEpC,cAAY,WAAZ,GAA0B;AACxB,eAAW,EADa,EACJ;AACpB,cAAW,EAFa,EAEJ;AACpB,WAAW,EAHa,CAGJ;AAHI,GAA1B;AAMD,CAbD;;AAeA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,MAAvB,EAA+B,iBAA2B;AAAA,MAAf,WAAe,SAAf,WAAe;;AACxD,cAAY,UAAZ,GAAyB,YAAY,WAAZ,GACvB,YAAY,cAAZ,GAA6B,YAAY,eAAZ,GAA8B,IAD7D;AAED,CAHD;;AAKA;;;;;;;;;;;AAWA,SAAS,WAAT,GAAuB,UAAU,QAAV,EAAoB;AACzC,MAAI,MAAM,EAAN,CAAS,IAAT,CAAc,QAAd,CAAJ,EAA6B;AAC3B;AACE;AACF;;AAEA,kBAAc,QAAd;;AAEA,WAAO,QAAP;AACD;AACD,SAAO,WAAP;AACD,CAXD;;AAaA,MAAM,KAAN,CAAY,aAAa,UAAzB,EAAqC,CACnC,WADmC,EAEnC,WAFmC,EAGnC,cAHmC,EAInC,gBAJmC,EAKnC,UALmC,EAMnC,MANmC,CAArC;AAQA,QAAQ,UAAR,CAAmB,IAAnB,GAA0B,UAA1B;;AAEA,eAAe,IAAf,GAAsB,KAAK,QAA3B;;AAEA,OAAO,OAAP,GAAiB,IAAjB;;;;;ACzdA,IAAM,UAAiB,QAAQ,QAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,UAAR,CAAvB;AACA,IAAM,gBAAiB,QAAQ,kBAAR,CAAvB;AACA,IAAM,eAAiB,QAAQ,iBAAR,CAAvB;AACA,IAAM,cAAiB,QAAQ,gBAAR,CAAvB;AACA,IAAM,iBAAiB,QAAQ,mBAAR,CAAvB;;AAEA,IAAM,UAAU;AACd,YAAU;AACR,aAAU,KADF;AAER,YAAU,IAFF;AAGR,cAAU;AAHF,GADI;;AAOd,WAAS,iBAAU,OAAV,EAAmB,KAAnB,EAA0B,YAA1B,EAAwC,OAAxC,EAAiD,WAAjD,EAA8D;AACrE,QAAI,YAAY,UAAZ,CAAuB,MAAvB,IAAiC,CAArC,EAAwC;AACtC,aAAO,EAAE,MAAM,SAAR,EAAP;AACD;;AAED,WAAO,IAAP;AACD,GAba;;AAed,aAAW,qBAAY;AACrB,WAAO,EAAP;AACD;AAjBa,CAAhB;;AAoBA,cAAc,OAAd,CAAsB,EAAtB,CAAyB,KAAzB,EAAgC,gBAAmC;AAAA,MAAvB,MAAuB,QAAvB,MAAuB;AAAA,MAAf,WAAe,QAAf,WAAe;;AACjE,MAAI,OAAO,IAAP,KAAgB,cAApB,EAAoC;AAAE;AAAS;AAC/C,SAAO,EAAP,GAAY,CAAZ;;AAEA,cAAY,OAAZ,CAAoB,aAApB,GAAoC,YAAY,OAAZ,CAAoB,YAApB,GAAmC,OAAO,QAA9E;AACA,cAAY,OAAZ,CAAoB,UAApB,GAAiC,YAAY,OAAZ,CAAoB,SAApB,GAAgC,OAAO,KAAxE;AACA,cAAY,OAAZ,CAAoB,KAApB,GAA4B,CAA5B;AACD,CAPD;;AASA,cAAc,OAAd,CAAsB,EAAtB,CAAyB,KAAzB,EAAgC,iBAAmC;AAAA,MAAvB,MAAuB,SAAvB,MAAuB;AAAA,MAAf,WAAe,SAAf,WAAe;;AACjE,MAAI,OAAO,IAAP,KAAgB,aAApB,EAAmC;AAAE;AAAS;;AAE9C,SAAO,EAAP,GAAY,OAAO,KAAP,GAAe,YAAY,OAAZ,CAAoB,KAA/C;;AAEA,cAAY,MAAZ,CAAmB,IAAnB,CAAwB,MAAxB;;AAEA,cAAY,OAAZ,CAAoB,SAApB,GAAgC,OAAO,KAAvC;AACA,cAAY,OAAZ,CAAoB,YAApB,GAAmC,OAAO,QAA1C;;AAEA,MAAI,OAAO,KAAP,KAAiB,QAAjB,IACG,OAAO,KAAP,KAAiB,IADpB,IAEG,OAAO,KAAP,KAAiB,SAFpB,IAGG,CAAC,MAAM,OAAO,KAAb,CAHR,EAG6B;;AAE3B,gBAAY,OAAZ,CAAoB,KAApB,GAA4B,OAAO,KAAnC;AACD;AACF,CAjBD;;AAmBA;;;;;;;;;;;;;;;;;;;;;;;AAuBA,aAAa,SAAb,CAAuB,UAAvB,GAAoC,UAAU,OAAV,EAAmB;AACrD,MAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,OAAhB,CAAJ,EAA8B;AAC5B,SAAK,OAAL,CAAa,OAAb,CAAqB,OAArB,GAA+B,QAAQ,OAAR,KAAoB,KAApB,GAA2B,KAA3B,GAAkC,IAAjE;AACA,SAAK,YAAL,CAAkB,SAAlB,EAA6B,OAA7B;AACA,SAAK,WAAL,CAAiB,SAAjB,EAA4B,OAA5B;;AAEA,WAAO,IAAP;AACD;;AAED,MAAI,MAAM,EAAN,CAAS,IAAT,CAAc,OAAd,CAAJ,EAA4B;AAC1B,SAAK,OAAL,CAAa,OAAb,CAAqB,OAArB,GAA+B,OAA/B;;AAEA,QAAI,CAAC,OAAL,EAAc;AACZ,WAAK,cAAL,GAAsB,KAAK,cAAL,GAAsB,KAAK,YAAL,GAAoB,IAAhE;AACD;;AAED,WAAO,IAAP;AACD;;AAED,SAAO,KAAK,OAAL,CAAa,OAApB;AACD,CApBD;;AAsBA,cAAc,OAAd,CAAsB,EAAtB,CAAyB,WAAzB,EAAsC,iBAAiF;AAAA,MAArE,WAAqE,SAArE,WAAqE;AAAA,MAAxD,MAAwD,SAAxD,MAAwD;AAAA,MAAhD,MAAgD,SAAhD,MAAgD;AAAA,MAAxC,KAAwC,SAAxC,KAAwC;AAAA,MAAjC,QAAiC,SAAjC,QAAiC;AAAA,MAAvB,MAAuB,SAAvB,MAAuB;AAAA,MAAf,WAAe,SAAf,WAAe;;AACrH,MAAI,WAAW,SAAf,EAA0B;AAAE;AAAS;;AAErC,MAAM,WAAW,YAAY,QAA7B;;AAEA,SAAO,OAAP,GAAiB,CAAC,SAAS,CAAT,CAAD,EAAc,SAAS,CAAT,CAAd,CAAjB;;AAEA,MAAI,QAAJ,EAAc;AACZ,WAAO,QAAP,GAAkB,MAAM,aAAN,CAAoB,QAApB,EAA8B,WAA9B,CAAlB;AACA,WAAO,GAAP,GAAkB,MAAM,SAAN,CAAgB,QAAhB,CAAlB;AACA,WAAO,KAAP,GAAkB,CAAlB;AACA,WAAO,EAAP,GAAkB,CAAlB;AACA,WAAO,KAAP,GAAkB,MAAM,UAAN,CAAiB,QAAjB,EAA2B,SAA3B,EAAsC,WAAtC,CAAlB;AACA,WAAO,EAAP,GAAkB,CAAlB;AACD,GAPD,MAQK,IAAI,UAAU,iBAAiB,aAA/B,EAA8C;AACjD,WAAO,QAAP,GAAkB,YAAY,SAAZ,CAAsB,QAAxC;AACA,WAAO,GAAP,GAAkB,YAAY,SAAZ,CAAsB,GAAxC;AACA,WAAO,KAAP,GAAkB,YAAY,SAAZ,CAAsB,KAAxC;AACA,WAAO,EAAP,GAAkB,OAAO,KAAP,GAAe,CAAjC;AACA,WAAO,KAAP,GAAkB,YAAY,SAAZ,CAAsB,KAAxC;AACA,WAAO,EAAP,GAAkB,OAAO,KAAP,GAAe,YAAY,OAAZ,CAAoB,UAArD;AACD,GAPI,MAQA;AACH,WAAO,QAAP,GAAkB,MAAM,aAAN,CAAoB,QAApB,EAA8B,WAA9B,CAAlB;AACA,WAAO,GAAP,GAAkB,MAAM,SAAN,CAAgB,QAAhB,CAAlB;AACA,WAAO,KAAP,GAAkB,OAAO,QAAP,GAAkB,YAAY,OAAZ,CAAoB,aAAxD;AACA,WAAO,KAAP,GAAkB,MAAM,UAAN,CAAiB,QAAjB,EAA2B,YAAY,OAAZ,CAAoB,SAA/C,EAA0D,WAA1D,CAAlB;;AAEA,WAAO,EAAP,GAAY,OAAO,KAAP,GAAe,YAAY,OAAZ,CAAoB,SAA/C;AACA,WAAO,EAAP,GAAY,OAAO,KAAP,GAAe,YAAY,OAAZ,CAAoB,SAA/C;AACD;AACF,CAhCD;;AAkCA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,KAAvB,EAA8B,UAAU,WAAV,EAAuB;AACnD,cAAY,OAAZ,GAAsB;AACpB,WAAO,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EADa;;AAGpB,mBAAe,CAHK,EAGA;AACpB,kBAAe,CAJK;AAKpB,cAAe,CALK;;AAOpB,WAAO,CAPa,EAOA;;AAEpB,gBAAY,CATQ,EASA;AACpB,eAAY,CAVQ,CAUA;AAVA,GAAtB;AAYD,CAbD;;AAeA,QAAQ,OAAR,GAAkB,OAAlB;AACA,QAAQ,KAAR,CAAc,IAAd,CAAmB,SAAnB;AACA,MAAM,KAAN,CAAY,aAAa,UAAzB,EAAqC,CACnC,cADmC,EAEnC,aAFmC,EAGnC,YAHmC,CAArC;AAKA,QAAQ,UAAR,CAAmB,OAAnB,GAA6B,YAA7B;;AAEA,eAAe,OAAf,GAAyB,QAAQ,QAAjC;;AAEA,OAAO,OAAP,GAAiB,OAAjB;;;;;AChKA,IAAM,UAAiB,QAAQ,QAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,UAAR,CAAvB;AACA,IAAM,UAAiB,QAAQ,kBAAR,CAAvB;AACA,IAAM,gBAAiB,QAAQ,kBAAR,CAAvB;AACA,IAAM,eAAiB,QAAQ,iBAAR,CAAvB;AACA,IAAM,cAAiB,QAAQ,gBAAR,CAAvB;AACA,IAAM,iBAAiB,QAAQ,mBAAR,CAAvB;;AAEA;AACA,IAAM,gBAAgB,QAAQ,aAAR,IAAyB,QAAQ,oBAAjC,GAAuD,EAAvD,GAA2D,EAAjF;;AAEA,IAAM,SAAS;AACb,YAAU;AACR,aAAc,KADN;AAER,kBAAc,IAFN;;AAIR,YAAY,IAJJ;AAKR,UAAY,IALJ;AAMR,cAAY,IANJ;AAOR,aAAY,IAPJ;AAQR,gBAAY,IARJ;;AAUR,YAAQ,KAVA;AAWR,yBAAqB,KAXb;AAYR,UAAM,IAZE;;AAcR;AACA,YAAQ,GAfA;;AAiBR;AACA;AACA;AACA;AACA,WAAO,IArBC;;AAuBR;AACA;AACA;AACA;AACA,YAAQ;AA3BA,GADG;;AA+Bb,WAAS,iBAAU,OAAV,EAAmB,KAAnB,EAA0B,YAA1B,EAAwC,OAAxC,EAAiD,WAAjD,EAA8D,IAA9D,EAAoE;AAC3E,QAAI,CAAC,IAAL,EAAW;AAAE,aAAO,IAAP;AAAc;;AAE3B,QAAM,OAAO,MAAM,MAAN,CAAa,EAAb,EAAiB,YAAY,SAAZ,CAAsB,IAAvC,CAAb;AACA,QAAM,UAAU,aAAa,OAA7B;;AAEA,QAAI,QAAQ,MAAR,CAAe,OAAnB,EAA4B;AAC1B,UAAM,gBAAgB,QAAQ,MAA9B;AACA,UAAM,cAAc,EAAE,MAAM,KAAR,EAAe,OAAO,KAAtB,EAA6B,KAAK,KAAlC,EAAyC,QAAQ,KAAjD,EAApB;;AAEA;AACA,UAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,cAAc,KAA9B,CAAJ,EAA0C;AACxC,aAAK,IAAM,IAAX,IAAmB,WAAnB,EAAgC;AAC9B,sBAAY,IAAZ,IAAoB,gBAAgB,IAAhB,EACgB,cAAc,KAAd,CAAoB,IAApB,CADhB,EAEgB,IAFhB,EAGgB,YAAY,YAH5B,EAIgB,OAJhB,EAKgB,IALhB,EAMgB,cAAc,MAAd,IAAwB,aANxC,CAApB;AAOD;;AAED,oBAAY,IAAZ,GAAmB,YAAY,IAAZ,IAAoB,CAAC,YAAY,KAApD;AACA,oBAAY,GAAZ,GAAmB,YAAY,GAAZ,IAAoB,CAAC,YAAY,MAApD;;AAEA,YAAI,YAAY,IAAZ,IAAoB,YAAY,KAAhC,IAAyC,YAAY,GAArD,IAA4D,YAAY,MAA5E,EAAoF;AAClF,iBAAO;AACL,kBAAM,QADD;AAEL,mBAAO;AAFF,WAAP;AAID;AACF,OApBD,MAqBK;AACH,YAAM,QAAS,QAAQ,MAAR,CAAe,IAAf,KAAwB,GAAxB,IAA+B,KAAK,CAAL,GAAU,KAAK,KAAL,GAAc,aAAtE;AACA,YAAM,SAAS,QAAQ,MAAR,CAAe,IAAf,KAAwB,GAAxB,IAA+B,KAAK,CAAL,GAAU,KAAK,MAAL,GAAc,aAAtE;;AAEA,YAAI,SAAS,MAAb,EAAqB;AACnB,iBAAO;AACL,kBAAM,QADD;AAEL,kBAAM,CAAC,QAAO,GAAP,GAAa,EAAd,KAAqB,SAAQ,GAAR,GAAc,EAAnC;AAFD,WAAP;AAID;AACF;AACF;;AAED,WAAO,IAAP;AACD,GA7EY;;AA+Eb,WAAU,QAAQ,YAAR,GAAuB;AAC/B,OAAI,UAD2B;AAE/B,OAAI,UAF2B;AAG/B,QAAI,WAH2B;;AAK/B,SAAa,UALkB;AAM/B,UAAa,UANkB;AAO/B,YAAa,UAPkB;AAQ/B,WAAa,UARkB;AAS/B,aAAa,WATkB;AAU/B,iBAAa,WAVkB;AAW/B,cAAa,WAXkB;AAY/B,gBAAa;AAZkB,GAAvB,GAaN;AACF,OAAI,WADF;AAEF,OAAI,WAFF;AAGF,QAAI,aAHF;;AAKF,SAAa,WALX;AAMF,UAAa,WANX;AAOF,YAAa,WAPX;AAQF,WAAa,WARX;AASF,aAAa,aATX;AAUF,iBAAa,aAVX;AAWF,cAAa,aAXX;AAYF,gBAAa;AAZX,GA5FS;;AA2Gb,aAAW,mBAAU,MAAV,EAAkB;AAC3B,QAAI,OAAO,IAAX,EAAiB;AACf,aAAO,OAAO,OAAP,CAAe,OAAO,IAAP,GAAc,OAAO,IAApC,CAAP;AACD,KAFD,MAGK,IAAI,OAAO,KAAX,EAAkB;AACrB,UAAI,YAAY,EAAhB;AACA,UAAM,YAAY,CAAC,KAAD,EAAQ,QAAR,EAAkB,MAAlB,EAA0B,OAA1B,CAAlB;;AAEA,WAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,CAApB,EAAuB,GAAvB,EAA4B;AAC1B,YAAI,OAAO,KAAP,CAAa,UAAU,CAAV,CAAb,CAAJ,EAAgC;AAC9B,uBAAa,UAAU,CAAV,CAAb;AACD;AACF;;AAED,aAAO,OAAO,OAAP,CAAe,SAAf,CAAP;AACD;AACF;AA3HY,CAAf;;AA8HA;AACA,cAAc,OAAd,CAAsB,EAAtB,CAAyB,KAAzB,EAAgC,gBAAmC;AAAA,MAAvB,MAAuB,QAAvB,MAAuB;AAAA,MAAf,WAAe,QAAf,WAAe;;AACjE,MAAI,OAAO,IAAP,KAAgB,aAAhB,IAAiC,CAAC,YAAY,QAAZ,CAAqB,KAA3D,EAAkE;AAChE;AACD;;AAED,MAAM,YAAY,YAAY,MAAZ,CAAmB,OAAnB,CAA2B,YAAY,OAAvC,CAAlB;AACA,MAAM,gBAAgB,YAAY,MAAZ,CAAmB,OAAnB,CAA2B,MAAjD;;AAEA;;;;;;AAMA,MAAI,cAAc,MAAd,IAAwB,cAAc,mBAA1C,EAA+D;AAC7D,QAAM,cAAc,MAAM,MAAN,CAAa,EAAb,EAAiB,YAAY,QAAZ,CAAqB,KAAtC,CAApB;;AAEA,gBAAY,GAAZ,GAAqB,YAAY,GAAZ,IAAuB,YAAY,IAAZ,IAAsB,CAAC,YAAY,MAA/E;AACA,gBAAY,IAAZ,GAAqB,YAAY,IAAZ,IAAuB,YAAY,GAAZ,IAAsB,CAAC,YAAY,KAA/E;AACA,gBAAY,MAAZ,GAAqB,YAAY,MAAZ,IAAuB,YAAY,KAAZ,IAAsB,CAAC,YAAY,GAA/E;AACA,gBAAY,KAAZ,GAAqB,YAAY,KAAZ,IAAuB,YAAY,MAAZ,IAAsB,CAAC,YAAY,IAA/E;;AAEA,gBAAY,QAAZ,CAAqB,YAArB,GAAoC,WAApC;AACD,GATD,MAUK;AACH,gBAAY,QAAZ,CAAqB,YAArB,GAAoC,IAApC;AACD;;AAED;AACA,MAAI,cAAc,mBAAlB,EAAuC;AACrC,gBAAY,sBAAZ,GAAqC,UAAU,KAAV,GAAkB,UAAU,MAAjE;AACD;;AAED,cAAY,WAAZ,GAA0B;AACxB,WAAY,SADY;AAExB,aAAY,MAAM,MAAN,CAAa,EAAb,EAAiB,SAAjB,CAFY;AAGxB,cAAY,MAAM,MAAN,CAAa,EAAb,EAAiB,SAAjB,CAHY;AAIxB,cAAY,MAAM,MAAN,CAAa,EAAb,EAAiB,SAAjB,CAJY;AAKxB,WAAY;AACV,YAAM,CADI,EACD,OAAQ,CADP,EACU,OAAQ,CADlB;AAEV,WAAM,CAFI,EAED,QAAQ,CAFP,EAEU,QAAQ;AAFlB;AALY,GAA1B;;AAWA,SAAO,IAAP,GAAc,YAAY,WAAZ,CAAwB,QAAtC;AACA,SAAO,SAAP,GAAmB,YAAY,WAAZ,CAAwB,KAA3C;AACD,CA9CD;;AAgDA;AACA,cAAc,OAAd,CAAsB,EAAtB,CAAyB,KAAzB,EAAgC,iBAA0C;AAAA,MAA9B,MAA8B,SAA9B,MAA8B;AAAA,MAAtB,KAAsB,SAAtB,KAAsB;AAAA,MAAf,WAAe,SAAf,WAAe;;AACxE,MAAI,UAAU,MAAV,IAAoB,CAAC,YAAY,QAAZ,CAAqB,KAA9C,EAAqD;AAAE;AAAS;;AAEhE,MAAM,gBAAgB,YAAY,MAAZ,CAAmB,OAAnB,CAA2B,MAAjD;AACA,MAAM,SAAS,cAAc,MAA7B;AACA,MAAM,aAAa,WAAW,YAAX,IAA2B,WAAW,QAAzD;;AAEA,MAAI,QAAQ,YAAY,QAAZ,CAAqB,KAAjC;;AAEA,MAAM,QAAa,YAAY,WAAZ,CAAwB,KAA3C;AACA,MAAM,UAAa,YAAY,WAAZ,CAAwB,OAA3C;AACA,MAAM,WAAa,YAAY,WAAZ,CAAwB,QAA3C;AACA,MAAM,QAAa,YAAY,WAAZ,CAAwB,KAA3C;AACA,MAAM,WAAa,MAAM,MAAN,CAAa,YAAY,WAAZ,CAAwB,QAArC,EAA+C,QAA/C,CAAnB;AACA,MAAM,gBAAgB,KAAtB;;AAEA,MAAI,KAAK,OAAO,EAAhB;AACA,MAAI,KAAK,OAAO,EAAhB;;AAEA,MAAI,cAAc,mBAAd,IAAqC,cAAc,MAAvD,EAA+D;AAC7D;AACA,QAAM,mBAAmB,cAAc,mBAAd,GACrB,YAAY,sBADS,GAErB,CAFJ;;AAIA,YAAQ,YAAY,QAAZ,CAAqB,YAA7B;;AAEA,QAAK,cAAc,IAAd,IAAsB,cAAc,MAArC,IACI,cAAc,KAAd,IAAuB,cAAc,GAD7C,EACmD;AACjD,WAAK,CAAC,EAAD,GAAM,gBAAX;AACD,KAHD,MAIK,IAAI,cAAc,IAAd,IAAsB,cAAc,KAAxC,EAAgD;AAAE,WAAK,KAAK,gBAAV;AAA6B,KAA/E,MACA,IAAI,cAAc,GAAd,IAAsB,cAAc,MAAxC,EAAgD;AAAE,WAAK,KAAK,gBAAV;AAA6B;AACrF;;AAED;AACA,MAAI,MAAM,GAAV,EAAkB;AAAE,YAAQ,GAAR,IAAkB,EAAlB;AAAuB;AAC3C,MAAI,MAAM,MAAV,EAAkB;AAAE,YAAQ,MAAR,IAAkB,EAAlB;AAAuB;AAC3C,MAAI,MAAM,IAAV,EAAkB;AAAE,YAAQ,IAAR,IAAkB,EAAlB;AAAuB;AAC3C,MAAI,MAAM,KAAV,EAAkB;AAAE,YAAQ,KAAR,IAAkB,EAAlB;AAAuB;;AAE3C,MAAI,UAAJ,EAAgB;AACd;AACA,UAAM,MAAN,CAAa,QAAb,EAAuB,OAAvB;;AAEA,QAAI,WAAW,YAAf,EAA6B;AAC3B;AACA,UAAI,aAAJ;;AAEA,UAAI,SAAS,GAAT,GAAe,SAAS,MAA5B,EAAoC;AAClC,eAAO,SAAS,GAAhB;;AAEA,iBAAS,GAAT,GAAe,SAAS,MAAxB;AACA,iBAAS,MAAT,GAAkB,IAAlB;AACD;AACD,UAAI,SAAS,IAAT,GAAgB,SAAS,KAA7B,EAAoC;AAClC,eAAO,SAAS,IAAhB;;AAEA,iBAAS,IAAT,GAAgB,SAAS,KAAzB;AACA,iBAAS,KAAT,GAAiB,IAAjB;AACD;AACF;AACF,GArBD,MAsBK;AACH;AACA,aAAS,GAAT,GAAkB,KAAK,GAAL,CAAS,QAAQ,GAAjB,EAAsB,MAAM,MAA5B,CAAlB;AACA,aAAS,MAAT,GAAkB,KAAK,GAAL,CAAS,QAAQ,MAAjB,EAAyB,MAAM,GAA/B,CAAlB;AACA,aAAS,IAAT,GAAkB,KAAK,GAAL,CAAS,QAAQ,IAAjB,EAAuB,MAAM,KAA7B,CAAlB;AACA,aAAS,KAAT,GAAkB,KAAK,GAAL,CAAS,QAAQ,KAAjB,EAAwB,MAAM,IAA9B,CAAlB;AACD;;AAED,WAAS,KAAT,GAAkB,SAAS,KAAT,GAAkB,SAAS,IAA7C;AACA,WAAS,MAAT,GAAkB,SAAS,MAAT,GAAkB,SAAS,GAA7C;;AAEA,OAAK,IAAM,IAAX,IAAmB,QAAnB,EAA6B;AAC3B,UAAM,IAAN,IAAc,SAAS,IAAT,IAAiB,SAAS,IAAT,CAA/B;AACD;;AAED,SAAO,KAAP,GAAe,YAAY,QAAZ,CAAqB,KAApC;AACA,SAAO,IAAP,GAAc,QAAd;AACA,SAAO,SAAP,GAAmB,KAAnB;AACD,CAjFD;;AAmFA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4CA,aAAa,SAAb,CAAuB,SAAvB,GAAmC,UAAU,OAAV,EAAmB;AACpD,MAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,OAAhB,CAAJ,EAA8B;AAC5B,SAAK,OAAL,CAAa,MAAb,CAAoB,OAApB,GAA8B,QAAQ,OAAR,KAAoB,KAApB,GAA2B,KAA3B,GAAkC,IAAhE;AACA,SAAK,YAAL,CAAkB,QAAlB,EAA4B,OAA5B;AACA,SAAK,WAAL,CAAiB,QAAjB,EAA2B,OAA3B;;AAEA,QAAI,eAAe,IAAf,CAAoB,QAAQ,IAA5B,CAAJ,EAAuC;AACrC,WAAK,OAAL,CAAa,MAAb,CAAoB,IAApB,GAA2B,QAAQ,IAAnC;AACD,KAFD,MAGK,IAAI,QAAQ,IAAR,KAAiB,IAArB,EAA2B;AAC9B,WAAK,OAAL,CAAa,MAAb,CAAoB,IAApB,GAA2B,eAAe,MAAf,CAAsB,IAAjD;AACD;;AAED,QAAI,MAAM,EAAN,CAAS,IAAT,CAAc,QAAQ,mBAAtB,CAAJ,EAAgD;AAC9C,WAAK,OAAL,CAAa,MAAb,CAAoB,mBAApB,GAA0C,QAAQ,mBAAlD;AACD,KAFD,MAGK,IAAI,MAAM,EAAN,CAAS,IAAT,CAAc,QAAQ,MAAtB,CAAJ,EAAmC;AACtC,WAAK,OAAL,CAAa,MAAb,CAAoB,MAApB,GAA6B,QAAQ,MAArC;AACD;;AAED,WAAO,IAAP;AACD;AACD,MAAI,MAAM,EAAN,CAAS,IAAT,CAAc,OAAd,CAAJ,EAA4B;AAC1B,SAAK,OAAL,CAAa,MAAb,CAAoB,OAApB,GAA8B,OAA9B;;AAEA,QAAI,CAAC,OAAL,EAAc;AACZ,WAAK,aAAL,GAAqB,KAAK,aAAL,GAAqB,KAAK,WAAL,GAAmB,IAA7D;AACD;;AAED,WAAO,IAAP;AACD;AACD,SAAO,KAAK,OAAL,CAAa,MAApB;AACD,CAhCD;;AAkCA,SAAS,eAAT,CAA0B,IAA1B,EAAgC,KAAhC,EAAuC,IAAvC,EAA6C,OAA7C,EAAsD,mBAAtD,EAA2E,IAA3E,EAAiF,MAAjF,EAAyF;AACvF;AACA,MAAI,CAAC,KAAL,EAAY;AAAE,WAAO,KAAP;AAAe;;AAE7B;AACA,MAAI,UAAU,IAAd,EAAoB;AAClB;AACA,QAAM,QAAS,MAAM,EAAN,CAAS,MAAT,CAAgB,KAAK,KAArB,IAA8B,KAAK,KAAnC,GAA4C,KAAK,KAAL,GAAc,KAAK,IAA9E;AACA,QAAM,SAAS,MAAM,EAAN,CAAS,MAAT,CAAgB,KAAK,MAArB,IAA8B,KAAK,MAAnC,GAA4C,KAAK,MAAL,GAAc,KAAK,GAA9E;;AAEA,QAAI,QAAQ,CAAZ,EAAe;AACb,UAAS,SAAS,MAAlB,EAA2B;AAAE,eAAO,OAAP;AAAiB,OAA9C,MACK,IAAI,SAAS,OAAb,EAAsB;AAAE,eAAO,MAAP;AAAiB;AAC/C;AACD,QAAI,SAAS,CAAb,EAAgB;AACd,UAAS,SAAS,KAAlB,EAA4B;AAAE,eAAO,QAAP;AAAkB,OAAhD,MACK,IAAI,SAAS,QAAb,EAAuB;AAAE,eAAO,KAAP;AAAkB;AACjD;;AAED,QAAI,SAAS,MAAb,EAAuB;AAAE,aAAO,KAAK,CAAL,GAAU,CAAC,SAAU,CAAV,GAAa,KAAK,IAAlB,GAAwB,KAAK,KAA9B,IAAwC,MAAzD;AAAmE;AAC5F,QAAI,SAAS,KAAb,EAAuB;AAAE,aAAO,KAAK,CAAL,GAAU,CAAC,UAAU,CAAV,GAAa,KAAK,GAAlB,GAAwB,KAAK,MAA9B,IAAwC,MAAzD;AAAmE;;AAE5F,QAAI,SAAS,OAAb,EAAuB;AAAE,aAAO,KAAK,CAAL,GAAU,CAAC,SAAU,CAAV,GAAa,KAAK,KAAlB,GAA0B,KAAK,IAAhC,IAAwC,MAAzD;AAAmE;AAC5F,QAAI,SAAS,QAAb,EAAuB;AAAE,aAAO,KAAK,CAAL,GAAU,CAAC,UAAU,CAAV,GAAa,KAAK,MAAlB,GAA0B,KAAK,GAAhC,IAAwC,MAAzD;AAAmE;AAC7F;;AAED;AACA,MAAI,CAAC,MAAM,EAAN,CAAS,OAAT,CAAiB,OAAjB,CAAL,EAAgC;AAAE,WAAO,KAAP;AAAe;;AAEjD,SAAO,MAAM,EAAN,CAAS,OAAT,CAAiB,KAAjB;AACP;AADO,IAEH,UAAU;AACZ;AAHK,IAIH,MAAM,WAAN,CAAkB,OAAlB,EAA2B,KAA3B,EAAkC,mBAAlC,CAJJ;AAKD;;AAED,YAAY,OAAZ,CAAoB,EAApB,CAAuB,KAAvB,EAA8B,UAAU,WAAV,EAAuB;AACnD,cAAY,UAAZ,GAAyB,IAAzB;AACD,CAFD;;AAIA,cAAc,OAAd,CAAsB,EAAtB,CAAyB,WAAzB,EAAsC,iBAA2C;AAAA,MAA/B,WAA+B,SAA/B,WAA+B;AAAA,MAAlB,MAAkB,SAAlB,MAAkB;AAAA,MAAV,MAAU,SAAV,MAAU;;AAC/E,MAAI,WAAW,QAAX,IAAuB,CAAC,YAAY,UAAxC,EAAoD;AAAE;AAAS;;AAE/D,MAAM,UAAU,YAAY,MAAZ,CAAmB,OAAnC;;AAEA,MAAI,QAAQ,MAAR,CAAe,MAAnB,EAA2B;AACzB,QAAI,YAAY,UAAZ,KAA2B,GAA/B,EAAoC;AAClC,aAAO,EAAP,GAAY,OAAO,EAAnB;AACD,KAFD,MAGK;AACH,aAAO,EAAP,GAAY,OAAO,EAAnB;AACD;AACD,WAAO,IAAP,GAAc,IAAd;AACD,GARD,MASK;AACH,WAAO,IAAP,GAAc,YAAY,UAA1B;;AAEA,QAAI,YAAY,UAAZ,KAA2B,GAA/B,EAAoC;AAClC,aAAO,EAAP,GAAY,CAAZ;AACD,KAFD,MAGK,IAAI,YAAY,UAAZ,KAA2B,GAA/B,EAAoC;AACvC,aAAO,EAAP,GAAY,CAAZ;AACD;AACF;AACF,CAxBD;;AA0BA,QAAQ,MAAR,GAAiB,MAAjB;AACA,QAAQ,KAAR,CAAc,IAAd,CAAmB,QAAnB;AACA,MAAM,KAAN,CAAY,aAAa,UAAzB,EAAqC,CACnC,aADmC,EAEnC,YAFmC,EAGnC,oBAHmC,EAInC,qBAJmC,EAKnC,WALmC,CAArC;AAOA,QAAQ,UAAR,CAAmB,MAAnB,GAA4B,WAA5B;;AAEA,eAAe,MAAf,GAAwB,OAAO,QAA/B;;AAEA,OAAO,OAAP,GAAiB,MAAjB;;;;;AC3aA,IAAM,MAAiB,QAAQ,aAAR,CAAvB;AACA,IAAM,YAAiB,QAAQ,gBAAR,EAA0B,SAAjD;AACA,IAAM,KAAiB,QAAQ,YAAR,CAAvB;AACA,IAAM,WAAiB,QAAQ,kBAAR,CAAvB;AACA,IAAM,cAAiB,QAAQ,eAAR,CAAvB;AACA,IAAM,iBAAiB,QAAQ,kBAAR,CAAvB;;AAEA,IAAM,aAAa;AACjB,YAAU;AACR,aAAW,KADH;AAER,eAAW,IAFH,EAEa;AACrB,YAAW,EAHH;AAIR,WAAW,GAJH,CAIa;AAJb,GADO;;AAQjB,eAAa,IARI;AASjB,KAAG,IATc,EASL;AACZ,KAAG,CAVc,EAUX,GAAG,CAVQ,EAUL;;AAEZ,eAAa,KAZI;AAajB,YAAU,CAbO;;AAejB,SAAO,eAAU,WAAV,EAAuB;AAC5B,eAAW,WAAX,GAAyB,IAAzB;AACA,QAAI,MAAJ,CAAW,WAAW,CAAtB;;AAEA,eAAW,WAAX,GAAyB,WAAzB;AACA,eAAW,QAAX,GAAsB,IAAI,IAAJ,GAAW,OAAX,EAAtB;AACA,eAAW,CAAX,GAAe,IAAI,OAAJ,CAAY,WAAW,MAAvB,CAAf;AACD,GAtBgB;;AAwBjB,QAAM,gBAAY;AAChB,eAAW,WAAX,GAAyB,KAAzB;AACA,QAAI,MAAJ,CAAW,WAAW,CAAtB;AACD,GA3BgB;;AA6BjB;AACA,UAAQ,kBAAY;AAClB,QAAM,UAAU,WAAW,WAAX,CAAuB,MAAvB,CAA8B,OAA9B,CAAsC,WAAW,WAAX,CAAuB,QAAvB,CAAgC,IAAtE,EAA4E,UAA5F;AACA,QAAM,YAAY,QAAQ,SAAR,IAAqB,UAAU,WAAW,WAAX,CAAuB,OAAjC,CAAvC;AACA,QAAM,MAAM,IAAI,IAAJ,GAAW,OAAX,EAAZ;AACA;AACA,QAAM,KAAK,CAAC,MAAM,WAAW,QAAlB,IAA8B,IAAzC;AACA;AACA,QAAM,IAAI,QAAQ,KAAR,GAAgB,EAA1B;;AAEA,QAAI,KAAK,CAAT,EAAY;AACV,UAAI,GAAG,MAAH,CAAU,SAAV,CAAJ,EAA0B;AACxB,kBAAU,QAAV,CAAmB,WAAW,CAAX,GAAe,CAAlC,EAAqC,WAAW,CAAX,GAAe,CAApD;AACD,OAFD,MAGK,IAAI,SAAJ,EAAe;AAClB,kBAAU,UAAV,IAAwB,WAAW,CAAX,GAAe,CAAvC;AACA,kBAAU,SAAV,IAAwB,WAAW,CAAX,GAAe,CAAvC;AACD;;AAED,iBAAW,QAAX,GAAsB,GAAtB;AACD;;AAED,QAAI,WAAW,WAAf,EAA4B;AAC1B,UAAI,MAAJ,CAAW,WAAW,CAAtB;AACA,iBAAW,CAAX,GAAe,IAAI,OAAJ,CAAY,WAAW,MAAvB,CAAf;AACD;AACF,GAvDgB;AAwDjB,SAAO,eAAU,YAAV,EAAwB,UAAxB,EAAoC;AACzC,QAAM,UAAU,aAAa,OAA7B;;AAEA,WAAO,QAAQ,UAAR,EAAoB,UAApB,IAAkC,QAAQ,UAAR,EAAoB,UAApB,CAA+B,OAAxE;AACD,GA5DgB;AA6DjB,qBAAmB,iCAAoC;AAAA,QAAxB,WAAwB,QAAxB,WAAwB;AAAA,QAAX,OAAW,QAAX,OAAW;;AACrD,QAAI,EAAE,YAAY,WAAZ,MACG,WAAW,KAAX,CAAiB,YAAY,MAA7B,EAAqC,YAAY,QAAZ,CAAqB,IAA1D,CADL,CAAJ,EAC2E;AACzE;AACD;;AAED,QAAI,YAAY,UAAhB,EAA4B;AAC1B,iBAAW,CAAX,GAAe,WAAW,CAAX,GAAe,CAA9B;AACA;AACD;;AAED,QAAI,YAAJ;AACA,QAAI,cAAJ;AACA,QAAI,eAAJ;AACA,QAAI,aAAJ;;AAEA,QAAM,UAAU,YAAY,MAAZ,CAAmB,OAAnB,CAA2B,YAAY,QAAZ,CAAqB,IAAhD,EAAsD,UAAtE;AACA,QAAM,YAAY,QAAQ,SAAR,IAAqB,UAAU,YAAY,OAAtB,CAAvC;;AAEA,QAAI,GAAG,MAAH,CAAU,SAAV,CAAJ,EAA0B;AACxB,aAAS,QAAQ,OAAR,GAAkB,WAAW,MAAtC;AACA,YAAS,QAAQ,OAAR,GAAkB,WAAW,MAAtC;AACA,cAAS,QAAQ,OAAR,GAAkB,UAAU,UAAV,GAAwB,WAAW,MAA9D;AACA,eAAS,QAAQ,OAAR,GAAkB,UAAU,WAAV,GAAwB,WAAW,MAA9D;AACD,KALD,MAMK;AACH,UAAM,OAAO,SAAS,oBAAT,CAA8B,SAA9B,CAAb;;AAEA,aAAS,QAAQ,OAAR,GAAkB,KAAK,IAAL,GAAc,WAAW,MAApD;AACA,YAAS,QAAQ,OAAR,GAAkB,KAAK,GAAL,GAAc,WAAW,MAApD;AACA,cAAS,QAAQ,OAAR,GAAkB,KAAK,KAAL,GAAc,WAAW,MAApD;AACA,eAAS,QAAQ,OAAR,GAAkB,KAAK,MAAL,GAAc,WAAW,MAApD;AACD;;AAED,eAAW,CAAX,GAAgB,QAAQ,CAAR,GAAW,OAAM,CAAC,CAAP,GAAU,CAArC;AACA,eAAW,CAAX,GAAgB,SAAQ,CAAR,GAAY,MAAK,CAAC,CAAN,GAAS,CAArC;;AAEA,QAAI,CAAC,WAAW,WAAhB,EAA6B;AAC3B;AACA,iBAAW,MAAX,GAAoB,QAAQ,MAA5B;AACA,iBAAW,KAAX,GAAoB,QAAQ,KAA5B;;AAEA,iBAAW,KAAX,CAAiB,WAAjB;AACD;AACF;AAzGgB,CAAnB;;AA4GA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,aAAvB,EAAsC,YAAY;AAChD,aAAW,IAAX;AACD,CAFD;;AAIA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,aAAvB,EAAsC,WAAW,iBAAjD;;AAEA,eAAe,SAAf,CAAyB,UAAzB,GAAsC,WAAW,QAAjD;;AAEA,OAAO,OAAP,GAAiB,UAAjB;;;;;AC3HA,IAAM,eAAe,QAAQ,iBAAR,CAArB;AACA,IAAM,UAAe,QAAQ,iBAAR,CAArB;AACA,IAAM,KAAe,QAAQ,aAAR,CAArB;AACA,IAAM,WAAe,QAAQ,mBAAR,CAArB;;AAEA,aAAa,SAAb,CAAuB,SAAvB,GAAmC,UAAU,OAAV,EAAmB,KAAnB,EAA0B,WAA1B,EAAuC,OAAvC,EAAgD;AACjF,MAAM,SAAS,KAAK,oBAAL,CAA0B,OAA1B,EAAmC,KAAnC,EAA0C,WAA1C,EAAuD,OAAvD,CAAf;;AAEA,MAAI,KAAK,OAAL,CAAa,aAAjB,EAAgC;AAC9B,WAAO,KAAK,OAAL,CAAa,aAAb,CAA2B,OAA3B,EAAoC,KAApC,EAA2C,MAA3C,EAAmD,IAAnD,EAAyD,OAAzD,EAAkE,WAAlE,CAAP;AACD;;AAED,SAAO,MAAP;AACD,CARD;;AAUA;;;;;;;;;;;;;;;AAeA,aAAa,SAAb,CAAuB,UAAvB,GAAoC,UAAU,QAAV,EAAoB;AACtD,SAAO,KAAK,iBAAL,CAAuB,YAAvB,EAAqC,QAArC,CAAP;AACD,CAFD;;AAIA;;;;;;;;;;;;;;;AAeA,aAAa,SAAb,CAAuB,SAAvB,GAAmC,UAAU,QAAV,EAAoB;AACrD,SAAO,KAAK,iBAAL,CAAuB,WAAvB,EAAoC,QAApC,CAAP;AACD,CAFD;;AAIA,aAAa,SAAb,CAAuB,UAAvB,GAAoC,UAAU,UAAV,EAAsB,mBAAtB,EAA2C,OAA3C,EAAoD;AACtF,MAAI,CAAC,UAAD,IAAe,CAAC,GAAG,OAAH,CAAW,OAAX,CAApB,EAAyC;AAAE,WAAO,KAAP;AAAe;;AAE1D,MAAI,GAAG,MAAH,CAAU,UAAV,CAAJ,EAA2B;AACzB,WAAO,SAAS,WAAT,CAAqB,OAArB,EAA8B,UAA9B,EAA0C,mBAA1C,CAAP;AACD,GAFD,MAGK,IAAI,GAAG,OAAH,CAAW,UAAX,CAAJ,EAA4B;AAC/B,WAAO,SAAS,YAAT,CAAsB,UAAtB,EAAkC,OAAlC,CAAP;AACD;;AAED,SAAO,KAAP;AACD,CAXD;;AAaA,aAAa,SAAb,CAAuB,SAAvB,GAAmC,UAAU,SAAV,EAAqB,mBAArB,EAA0C,OAA1C,EAAmD;AACpF,MAAI,CAAC,SAAL,EAAgB;AAAE,WAAO,IAAP;AAAc;;AAEhC,MAAI,CAAC,GAAG,OAAH,CAAW,OAAX,CAAL,EAA0B;AAAE,WAAO,KAAP;AAAe;;AAE3C,MAAI,GAAG,MAAH,CAAU,SAAV,CAAJ,EAA0B;AACxB,WAAO,SAAS,WAAT,CAAqB,OAArB,EAA8B,SAA9B,EAAyC,mBAAzC,CAAP;AACD,GAFD,MAGK,IAAI,GAAG,OAAH,CAAW,SAAX,CAAJ,EAA2B;AAC9B,WAAO,SAAS,YAAT,CAAsB,SAAtB,EAAiC,OAAjC,CAAP;AACD;;AAED,SAAO,KAAP;AACD,CAbD;;AAeA,aAAa,SAAb,CAAuB,eAAvB,GAAyC,UAAU,OAAV,EAAmB,mBAAnB,EAAwC,WAAxC,EAAqD;AAC5F,SAAQ,CAAC,KAAK,UAAL,CAAgB,QAAQ,UAAxB,EAAoC,mBAApC,EAAyD,WAAzD,CAAD,IACH,KAAK,SAAL,CAAe,QAAQ,SAAvB,EAAkC,mBAAlC,EAAuD,WAAvD,CADL;AAED,CAHD;;AAKA;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4BA,aAAa,SAAb,CAAuB,aAAvB,GAAuC,UAAU,OAAV,EAAmB;AACxD,MAAI,GAAG,QAAH,CAAY,OAAZ,CAAJ,EAA0B;AACxB,SAAK,OAAL,CAAa,aAAb,GAA6B,OAA7B;;AAEA,WAAO,IAAP;AACD;;AAED,MAAI,YAAY,IAAhB,EAAsB;AACpB,WAAO,KAAK,OAAL,CAAa,aAApB;;AAEA,WAAO,IAAP;AACD;;AAED,SAAO,KAAK,OAAL,CAAa,aAApB;AACD,CAdD;;AAgBA;;;;;;;;;;AAUA,aAAa,SAAb,CAAuB,WAAvB,GAAqC,UAAU,QAAV,EAAoB;AACvD,MAAI,GAAG,IAAH,CAAQ,QAAR,CAAJ,EAAuB;AACrB,SAAK,OAAL,CAAa,WAAb,GAA2B,QAA3B;;AAEA,WAAO,IAAP;AACD;;AAED,MAAI,aAAa,IAAjB,EAAuB;AACrB,WAAO,KAAK,OAAL,CAAa,WAApB;;AAEA,WAAO,IAAP;AACD;;AAED,SAAO,KAAK,OAAL,CAAa,WAApB;AACD,CAdD;;AAgBA,aAAa,SAAb,CAAuB,oBAAvB,GAA8C,UAAU,OAAV,EAAmB,KAAnB,EAA0B,WAA1B,EAAuC,OAAvC,EAAgD;AAC5F,MAAM,OAAO,KAAK,OAAL,CAAa,OAAb,CAAb;AACA,MAAI,SAAS,IAAb;;AAEA,uBAAyB,QAAQ,KAAjC,kHAAwC;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,QAA7B,UAA6B;;AACtC;AACA,QAAI,YAAY,aAAZ,IACG,YAAY,KADf,IAEG,CAAC,MAAM,OAAN,GAAgB,KAAK,OAAL,CAAa,UAAb,EAAyB,YAA1C,MAA4D,CAFnE,EAEsE;AACpE;AACD;;AAED,aAAS,QAAQ,UAAR,EAAoB,OAApB,CAA4B,OAA5B,EAAqC,KAArC,EAA4C,IAA5C,EAAkD,OAAlD,EAA2D,WAA3D,EAAwE,IAAxE,CAAT;;AAEA,QAAI,MAAJ,EAAY;AACV,aAAO,MAAP;AACD;AACF;AACF,CAlBD;;;;;AC5JA,IAAM,WAAiB,QAAQ,aAAR,CAAvB;AACA,IAAM,eAAiB,QAAQ,iBAAR,CAAvB;AACA,IAAM,cAAiB,QAAQ,gBAAR,CAAvB;AACA,IAAM,UAAiB,QAAQ,iBAAR,CAAvB;AACA,IAAM,iBAAiB,QAAQ,mBAAR,CAAvB;AACA,IAAM,UAAiB,QAAQ,kBAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,UAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,UAAR,CAAvB;AACA,IAAM,UAAiB,QAAQ,kBAAR,EAA4B,GAA5B,EAAvB;;AAEA,QAAQ,uBAAR;;AAEA,IAAM,YAAY;AAChB,kBADgB;AAEhB,gDAFgB;AAGhB;AACA,mBAAiB,QAJD;AAKhB,YAAU;AACR,eAAW;AACT,mBAAa,KADJ;AAET,WAAK,QAFI;AAGT,qBAAe,CAHN;AAIT,iBAAY,IAJH;AAKT,kBAAY;AALH;AADH,GALM;AAchB,qBAAmB,2BAAU,MAAV,EAAkB;AACnC,UAAM,MAAN,CAAa,OAAO,QAApB,EAA8B,UAAU,QAAV,CAAmB,SAAjD;AACD;AAhBe,CAAlB;;AAmBA;AACA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,MAAvB,EAA+B,gBAAwD;AAAA,MAA5C,WAA4C,QAA5C,WAA4C;AAAA,MAA/B,OAA+B,QAA/B,OAA+B;AAAA,MAAtB,KAAsB,QAAtB,KAAsB;AAAA,MAAf,WAAe,QAAf,WAAe;;AACrF,MAAI,YAAY,WAAZ,EAAJ,EAA+B;AAAE;AAAS;;AAE1C,MAAM,aAAa,cAAc,WAAd,EAA2B,OAA3B,EAAoC,KAApC,EAA2C,WAA3C,CAAnB;AACA,UAAQ,WAAR,EAAqB,UAArB;AACD,CALD;;AAOA;AACA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,MAAvB,EAA+B,iBAAwD;AAAA,MAA5C,WAA4C,SAA5C,WAA4C;AAAA,MAA/B,OAA+B,SAA/B,OAA+B;AAAA,MAAtB,KAAsB,SAAtB,KAAsB;AAAA,MAAf,WAAe,SAAf,WAAe;;AACrF,MAAI,CAAC,YAAY,KAAb,IACG,YAAY,aADf,IAEG,YAAY,WAAZ,EAFP,EAEkC;AAAE;AAAS;;AAE7C,MAAM,aAAa,cAAc,WAAd,EAA2B,OAA3B,EAAoC,KAApC,EAA2C,WAA3C,CAAnB;AACA,UAAQ,WAAR,EAAqB,UAArB;AACD,CAPD;;AASA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,MAAvB,EAA+B,UAAU,GAAV,EAAe;AAAA,MACpC,WADoC,GACb,GADa,CACpC,WADoC;AAAA,MACvB,KADuB,GACb,GADa,CACvB,KADuB;;;AAG5C,MAAI,CAAC,YAAY,aAAb,IACG,YAAY,WAAZ,EADH,IAEG,CAAC,YAAY,eAFhB,IAGG,CAAC,YAAY,QAAZ,CAAqB,IAH7B,EAGmC;AACjC;AACD;;AAED,UAAQ,IAAR,CAAa,cAAb,EAA6B,GAA7B;;AAEA,MAAM,SAAS,YAAY,MAA3B;;AAEA,MAAI,YAAY,QAAZ,CAAqB,IAArB,IAA6B,MAAjC,EAAyC;AACvC;AACA,QAAI,OAAO,OAAP,CAAe,YAAY,QAAZ,CAAqB,IAApC,EAA0C,WAA1C,IACG,CAAC,uBAAuB,MAAvB,EAA+B,YAAY,OAA3C,EAAoD,YAAY,QAAhE,CADR,EACmF;AACjF,kBAAY,IAAZ,CAAiB,KAAjB;AACD,KAHD,MAIK;AACH,kBAAY,KAAZ,CAAkB,YAAY,QAA9B,EAAwC,MAAxC,EAAgD,YAAY,OAA5D;AACD;AACF;AACF,CAxBD;;AA0BA;AACA;AACA,SAAS,cAAT,CAAyB,MAAzB,EAAiC,YAAjC,EAA+C,OAA/C,EAAwD,WAAxD,EAAqE;AACnE,MAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,MAAhB,KACG,aAAa,eAAb,CAA6B,aAAa,OAAb,CAAqB,OAAO,IAA5B,CAA7B,EAAgE,OAAhE,EAAyE,WAAzE,CADH,IAEG,aAAa,OAAb,CAAqB,OAAO,IAA5B,EAAkC,OAFrC,IAGG,uBAAuB,YAAvB,EAAqC,OAArC,EAA8C,MAA9C,CAHP,EAG8D;AAC5D,WAAO,MAAP;AACD;;AAED,SAAO,IAAP;AACD;;AAED,SAAS,gBAAT,CAA2B,WAA3B,EAAwC,OAAxC,EAAiD,KAAjD,EAAwD,OAAxD,EAAiE,aAAjE,EAAgF,WAAhF,EAA6F;AAC3F,OAAK,IAAI,IAAI,CAAR,EAAW,MAAM,QAAQ,MAA9B,EAAsC,IAAI,GAA1C,EAA+C,GAA/C,EAAoD;AAClD,QAAM,QAAQ,QAAQ,CAAR,CAAd;AACA,QAAM,eAAe,cAAc,CAAd,CAArB;AACA,QAAM,SAAS,eAAe,MAAM,SAAN,CAAgB,OAAhB,EAAyB,KAAzB,EAAgC,WAAhC,EAA6C,YAA7C,CAAf,EACe,KADf,EAEe,YAFf,EAGe,WAHf,CAAf;;AAKA,QAAI,MAAJ,EAAY;AACV,aAAO;AACL,sBADK;AAEL,gBAAQ,KAFH;AAGL,iBAAS;AAHJ,OAAP;AAKD;AACF;;AAED,SAAO,EAAP;AACD;;AAED,SAAS,aAAT,CAAwB,WAAxB,EAAqC,OAArC,EAA8C,KAA9C,EAAqD,WAArD,EAAkE;AAChE,MAAI,UAAU,EAAd;AACA,MAAI,gBAAgB,EAApB;;AAEA,MAAI,UAAU,WAAd;AACA,MAAI,SAAS,IAAb;;AAEA,WAAS,WAAT,CAAsB,YAAtB,EAAoC,QAApC,EAA8C,OAA9C,EAAuD;AACrD,QAAM,WAAY,QAAQ,0BAAR,GACd,QAAQ,gBAAR,CAAyB,QAAzB,CADc,GAEd,SAFJ;;AAIA,QAAI,MAAM,eAAN,CAAsB,OAAtB,EAA+B,QAA/B,EAAyC,QAAzC,CAAJ,EAAwD;;AAEtD,cAAQ,IAAR,CAAa,YAAb;AACA,oBAAc,IAAd,CAAmB,OAAnB;AACD;AACF;;AAED,SAAO,MAAM,EAAN,CAAS,OAAT,CAAiB,OAAjB,CAAP,EAAkC;AAChC,cAAU,EAAV;AACA,oBAAgB,EAAhB;;AAEA,QAAM,sBAAsB,MAAM,aAAN,CAAoB,GAApB,CAAwB,OAAxB,CAA5B;;AAEA,QAAI,wBACI,SAAS,eAAe,oBAAoB,SAApB,CAA8B,OAA9B,EAAuC,KAAvC,EAA8C,WAA9C,EAA2D,OAA3D,EAAoE,WAApE,CAAf,EACe,mBADf,EAEe,OAFf,EAGe,WAHf,CADb,KAKG,CAAC,oBAAoB,OAApB,CAA4B,OAAO,IAAnC,EAAyC,WALjD,EAK8D;AAC5D,aAAO;AACL,wBADK;AAEL,sBAFK;AAGL,gBAAQ;AAHH,OAAP;AAKD,KAXD,MAYK;AACH,YAAM,aAAN,CAAoB,eAApB,CAAoC,WAApC,EAAiD,OAAjD;;AAEA,UAAM,aAAa,iBAAiB,WAAjB,EAA8B,OAA9B,EAAuC,KAAvC,EAA8C,OAA9C,EAAuD,aAAvD,EAAsE,WAAtE,CAAnB;;AAEA,UAAI,WAAW,MAAX,IACG,CAAC,WAAW,MAAX,CAAkB,OAAlB,CAA0B,WAAW,MAAX,CAAkB,IAA5C,EAAkD,WAD1D,EACuE;AACrE,eAAO,UAAP;AACD;AACF;;AAED,cAAU,MAAM,UAAN,CAAiB,OAAjB,CAAV;AACD;;AAED,SAAO,EAAP;AACD;;AAED,SAAS,OAAT,CAAkB,WAAlB,SAA4D;AAAA,MAA3B,MAA2B,SAA3B,MAA2B;AAAA,MAAnB,MAAmB,SAAnB,MAAmB;AAAA,MAAX,OAAW,SAAX,OAAW;;AAC1D,WAAS,UAAU,EAAnB;;AAEA,MAAI,YAAY,MAAZ,IAAsB,YAAY,MAAZ,CAAmB,OAAnB,CAA2B,WAArD,EAAkE;AAChE,gBAAY,MAAZ,CAAmB,IAAnB,CAAwB,eAAxB,CAAwC,KAAxC,CAA8C,MAA9C,GAAuD,EAAvD;AACD;;AAED,cAAY,MAAZ,GAAqB,MAArB;AACA,cAAY,OAAZ,GAAsB,OAAtB;AACA,QAAM,UAAN,CAAiB,YAAY,QAA7B,EAAuC,MAAvC;;AAEA,MAAI,UAAU,OAAO,OAAP,CAAe,WAA7B,EAA0C;AACxC,QAAM,SAAS,SAAQ,QAAQ,OAAO,IAAf,EAAqB,SAArB,CAA+B,MAA/B,CAAR,GAAiD,EAAhE;AACA,gBAAY,MAAZ,CAAmB,IAAnB,CAAwB,eAAxB,CAAwC,KAAxC,CAA8C,MAA9C,GAAuD,MAAvD;AACD;;AAED,UAAQ,IAAR,CAAa,UAAb,EAAyB,EAAE,aAAa,WAAf,EAAzB;AACD;;AAED,YAAY,OAAZ,CAAoB,EAApB,CAAuB,MAAvB,EAA+B,iBAA2B;AAAA,MAAf,WAAe,SAAf,WAAe;;AACxD,MAAM,SAAS,YAAY,MAA3B;;AAEA,MAAI,UAAU,OAAO,OAAP,CAAe,WAA7B,EAA0C;AACxC,WAAO,IAAP,CAAY,eAAZ,CAA4B,KAA5B,CAAkC,MAAlC,GAA2C,EAA3C;AACD;AACF,CAND;;AAQA,aAAa,SAAb,CAAuB,SAAvB,GAAmC,UAAU,OAAV,EAAmB,KAAnB,EAA0B,WAA1B,EAAuC,OAAvC,EAAgD;AACjF,MAAM,SAAS,KAAK,oBAAL,CAA0B,OAA1B,EAAmC,KAAnC,EAA0C,WAA1C,EAAuD,OAAvD,CAAf;;AAEA,MAAI,KAAK,OAAL,CAAa,aAAjB,EAAgC;AAC9B,WAAO,KAAK,OAAL,CAAa,aAAb,CAA2B,OAA3B,EAAoC,KAApC,EAA2C,MAA3C,EAAmD,IAAnD,EAAyD,OAAzD,EAAkE,WAAlE,CAAP;AACD;;AAED,SAAO,MAAP;AACD,CARD;;AAUA;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4BA,aAAa,SAAb,CAAuB,aAAvB,GAAuC,UAAU,OAAV,EAAmB;AACxD,MAAI,MAAM,EAAN,CAAS,QAAT,CAAkB,OAAlB,CAAJ,EAAgC;AAC9B,SAAK,OAAL,CAAa,aAAb,GAA6B,OAA7B;;AAEA,WAAO,IAAP;AACD;;AAED,MAAI,YAAY,IAAhB,EAAsB;AACpB,WAAO,KAAK,OAAL,CAAa,aAApB;;AAEA,WAAO,IAAP;AACD;;AAED,SAAO,KAAK,OAAL,CAAa,aAApB;AACD,CAdD;;AAgBA;;;;;;;;;;AAUA,aAAa,SAAb,CAAuB,WAAvB,GAAqC,UAAU,QAAV,EAAoB;AACvD,MAAI,MAAM,EAAN,CAAS,IAAT,CAAc,QAAd,CAAJ,EAA6B;AAC3B,SAAK,OAAL,CAAa,WAAb,GAA2B,QAA3B;;AAEA,WAAO,IAAP;AACD;;AAED,MAAI,aAAa,IAAjB,EAAuB;AACrB,WAAO,KAAK,OAAL,CAAa,WAApB;;AAEA,WAAO,IAAP;AACD;;AAED,SAAO,KAAK,OAAL,CAAa,WAApB;AACD,CAdD;;AAgBA,aAAa,SAAb,CAAuB,oBAAvB,GAA8C,UAAU,OAAV,EAAmB,KAAnB,EAA0B,WAA1B,EAAuC,OAAvC,EAAgD;AAC5F,MAAM,OAAO,KAAK,OAAL,CAAa,OAAb,CAAb;AACA,MAAM,UAAU,MAAM,OAAN,IAAkB;AAChC,OAAG,CAD6B;AAEhC,OAAG,CAF6B;AAGhC,OAAG,CAH6B;AAIhC,OAAG;AAJ6B,GAAD,CAK9B,MAAM,MALwB,CAAjC;AAMA,MAAI,SAAS,IAAb;;AAEA,uBAAyB,QAAQ,KAAjC,kHAAwC;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,QAA7B,UAA6B;;AACtC;AACA,QAAI,YAAY,aAAZ,IACG,YAAY,KADf,IAEG,CAAC,UAAU,KAAK,OAAL,CAAa,UAAb,EAAyB,YAApC,MAAsD,CAF7D,EAEgE;AAC9D;AACD;;AAED,aAAS,QAAQ,UAAR,EAAoB,OAApB,CAA4B,OAA5B,EAAqC,KAArC,EAA4C,IAA5C,EAAkD,OAAlD,EAA2D,WAA3D,EAAwE,IAAxE,CAAT;;AAEA,QAAI,MAAJ,EAAY;AACV,aAAO,MAAP;AACD;AACF;AACF,CAxBD;;AA0BA,SAAS,sBAAT,CAAiC,YAAjC,EAA+C,OAA/C,EAAwD,MAAxD,EAAgE;AAC9D,MAAM,UAAU,aAAa,OAA7B;AACA,MAAM,aAAa,QAAQ,OAAO,IAAf,EAAqB,GAAxC;AACA,MAAM,gBAAgB,QAAQ,OAAO,IAAf,EAAqB,aAA3C;AACA,MAAI,qBAAqB,CAAzB;AACA,MAAI,cAAc,CAAlB;AACA,MAAI,qBAAqB,CAAzB;;AAEA;AACA,MAAI,EAAE,cAAc,aAAd,IAA+B,UAAU,eAA3C,CAAJ,EAAiE;AAAE;AAAS;;AAE5E,OAAK,IAAI,IAAI,CAAR,EAAW,MAAM,MAAM,YAAN,CAAmB,MAAzC,EAAiD,IAAI,GAArD,EAA0D,GAA1D,EAA+D;AAC7D,QAAM,cAAc,MAAM,YAAN,CAAmB,CAAnB,CAApB;AACA,QAAM,cAAc,YAAY,QAAZ,CAAqB,IAAzC;;AAEA,QAAI,CAAC,YAAY,WAAZ,EAAL,EAAgC;AAAE;AAAW;;AAE7C;;AAEA,QAAI,sBAAsB,UAAU,eAApC,EAAqD;AACnD,aAAO,KAAP;AACD;;AAED,QAAI,YAAY,MAAZ,KAAuB,YAA3B,EAAyC;AAAE;AAAW;;AAEtD,mBAAgB,gBAAgB,OAAO,IAAxB,GAA8B,CAA7C;;AAEA,QAAI,eAAe,UAAnB,EAA+B;AAC7B,aAAO,KAAP;AACD;;AAED,QAAI,YAAY,OAAZ,KAAwB,OAA5B,EAAqC;AACnC;;AAEA,UAAI,gBAAgB,OAAO,IAAvB,IAA+B,sBAAsB,aAAzD,EAAwE;AACtE,eAAO,KAAP;AACD;AACF;AACF;;AAED,SAAO,UAAU,eAAV,GAA4B,CAAnC;AACD;;AAED;;;;;;;;;;;;AAYA,SAAS,eAAT,GAA2B,UAAU,QAAV,EAAoB;AAC7C,MAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,QAAhB,CAAJ,EAA+B;AAC7B,cAAU,eAAV,GAA4B,QAA5B;;AAEA,WAAO,IAAP;AACD;;AAED,SAAO,UAAU,eAAjB;AACD,CARD;;AAUA,aAAa,eAAb,CAA6B,IAA7B,CAAkC,aAAlC;AACA,aAAa,eAAb,CAA6B,IAA7B,CAAkC,eAAlC;AACA,aAAa,eAAb,CAA6B,IAA7B,CAAkC,YAAlC;AACA,aAAa,eAAb,CAA6B,IAA7B,CAAkC,WAAlC;;AAEA,eAAe,IAAf,CAAoB,aAApB,GAAoC,IAApC;AACA,eAAe,IAAf,CAAoB,WAApB,GAAkC,IAAlC;;AAEA,MAAM,MAAN,CAAa,eAAe,SAA5B,EAAuC,UAAU,QAAV,CAAmB,SAA1D;;AAEA,OAAO,OAAP,GAAiB,SAAjB;;;;;ACnXA,IAAM,YAAc,QAAQ,QAAR,CAApB;AACA,IAAM,cAAc,QAAQ,gBAAR,CAApB;;AAEA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,KAAvB,EAA8B,UAAU,WAAV,EAAuB;AACnD,cAAY,UAAZ,GAAyB,IAAzB;AACD,CAFD;;AAIA,UAAU,OAAV,CAAkB,EAAlB,CAAqB,UAArB,EAAiC,gBAA2B;AAAA,MAAf,WAAe,QAAf,WAAe;;AAC1D,MAAM,aAAa,YAAY,QAAZ,CAAqB,IAAxC;;AAEA,MAAI,CAAC,UAAL,EAAiB;AAAE;AAAS;;AAE5B,MAAM,QAAQ,YAAY,MAAZ,CAAmB,OAAnB,CAA2B,UAA3B,EAAuC,KAArD;;AAEA,MAAI,QAAQ,CAAZ,EAAe;AACb,gBAAY,UAAZ,GAAyB,WAAW,YAAM;AACxC,kBAAY,KAAZ,CAAkB,YAAY,QAA9B,EAAwC,YAAY,MAApD,EAA4D,YAAY,OAAxE;AACD,KAFwB,EAEtB,KAFsB,CAAzB;AAGD;AACF,CAZD;;AAcA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,MAAvB,EAA+B,iBAAsC;AAAA,MAA1B,WAA0B,SAA1B,WAA0B;AAAA,MAAb,SAAa,SAAb,SAAa;;AACnE,MAAI,YAAY,eAAZ,IAA+B,CAAC,SAApC,EAA+C;AAC7C,iBAAa,YAAY,UAAzB;AACD;AACF,CAJD;;AAMA;AACA,UAAU,OAAV,CAAkB,EAAlB,CAAqB,cAArB,EAAqC,iBAA2B;AAAA,MAAf,WAAe,SAAf,WAAe;;AAC9D,MAAM,aAAa,YAAY,QAAZ,CAAqB,IAAxC;;AAEA,MAAI,CAAC,UAAL,EAAiB;AAAE;AAAS;;AAE5B,MAAM,QAAQ,YAAY,MAAZ,CAAmB,OAAnB,CAA2B,UAA3B,EAAuC,KAArD;;AAEA,MAAI,QAAQ,CAAZ,EAAe;AACb,gBAAY,QAAZ,CAAqB,IAArB,GAA4B,IAA5B;AACD;AACF,CAVD;;;;;AC5BA,IAAM,YAAY,QAAQ,QAAR,CAAlB;AACA,IAAM,QAAY,QAAQ,UAAR,CAAlB;AACA,IAAM,UAAY,QAAQ,kBAAR,CAAlB;AACA,IAAM,KAAY,QAAQ,aAAR,CAAlB;;eAEwC,QAAQ,mBAAR,C;IAAhC,e,YAAA,e;IAAiB,U,YAAA,U;;AAEzB,UAAU,iBAAV,CAA4B,QAAQ,iBAAR,CAA5B;;AAEA,UAAU,OAAV,CAAkB,EAAlB,CAAqB,cAArB,EAAsC,gBAAgD;AAAA,MAApC,WAAoC,QAApC,WAAoC;AAAA,MAAvB,WAAuB,QAAvB,WAAuB;AAAA,MAAV,EAAU,QAAV,EAAU;AAAA,MAAN,EAAM,QAAN,EAAM;;AACpF,MAAI,YAAY,QAAZ,CAAqB,IAArB,KAA8B,MAAlC,EAA0C;AAAE;AAAS;;AAErD;AACA,MAAM,OAAO,KAAK,GAAL,CAAS,EAAT,CAAb;AACA,MAAM,OAAO,KAAK,GAAL,CAAS,EAAT,CAAb;AACA,MAAM,UAAU,YAAY,MAAZ,CAAmB,OAAnB,CAA2B,IAA3C;AACA,MAAM,YAAY,QAAQ,SAA1B;AACA,MAAM,cAAe,OAAO,IAAP,GAAc,GAAd,GAAoB,OAAO,IAAP,GAAc,GAAd,GAAoB,IAA7D;;AAEA,cAAY,QAAZ,CAAqB,IAArB,GAA4B,QAAQ,QAAR,KAAqB,OAArB,GACxB,YAAY,CAAZ,CADwB,CACT;AADS,IAExB,QAAQ,QAFZ;;AAIA;AACA,MAAI,gBAAgB,IAAhB,IAAwB,cAAc,IAAtC,IAA8C,cAAc,WAAhE,EAA6E;AAC3E;AACA,gBAAY,QAAZ,CAAqB,IAArB,GAA4B,IAA5B;;AAEA;;AAEA,QAAI,CAAC,YAAY,QAAZ,CAAqB,IAA1B,EAAgC;;AAE9B,UAAI,UAAU,WAAd;;AAEA,UAAM,eAAe,SAAf,YAAe,CAAU,YAAV,EAAwB,QAAxB,EAAkC,OAAlC,EAA2C;AAC9D,YAAM,WAAW,QAAQ,0BAAR,GACX,QAAQ,gBAAR,CAAyB,QAAzB,CADW,GAEX,SAFN;;AAIA,YAAI,iBAAiB,YAAY,MAAjC,EAAyC;AAAE;AAAS;;AAEpD,YAAI,CAAC,QAAQ,WAAT,IACG,CAAC,aAAa,eAAb,CAA6B,OAA7B,EAAsC,OAAtC,EAA+C,WAA/C,CADJ,IAEG,gBAAgB,OAAhB,EAAyB,QAAzB,EAAmC,QAAnC,CAFP,EAEqD;;AAEnD,cAAM,UAAS,aAAa,SAAb,CAAuB,YAAY,WAAnC,EACuB,YAAY,SADnC,EAEuB,WAFvB,EAGuB,OAHvB,CAAf;;AAKA,cAAI,WACG,QAAO,IAAP,KAAgB,MADnB,IAEG,eAAe,WAAf,EAA4B,YAA5B,CAFH,IAGG,UAAU,cAAV,CAAyB,OAAzB,EAAiC,YAAjC,EAA+C,OAA/C,EAAwD,WAAxD,CAHP,EAG6E;;AAE3E,mBAAO,YAAP;AACD;AACF;AACF,OAxBD;;AA0BA,UAAI,SAAS,IAAb;;AAEA;AACA,aAAO,GAAG,OAAH,CAAW,OAAX,CAAP,EAA4B;AAC1B,YAAM,sBAAsB,MAAM,aAAN,CAAoB,GAApB,CAAwB,OAAxB,CAA5B;;AAEA,YAAI,uBACG,wBAAwB,YAAY,MADvC,IAEG,CAAC,oBAAoB,OAApB,CAA4B,IAA5B,CAAiC,WAFzC,EAEsD;;AAEpD,mBAAS,oBAAoB,SAApB,CAA8B,YAAY,WAA1C,EAAuD,YAAY,SAAnE,EAA8E,WAA9E,EAA2F,OAA3F,CAAT;AACD;AACD,YAAI,UACG,OAAO,IAAP,KAAgB,MADnB,IAEG,eAAe,WAAf,EAA4B,mBAA5B,CAFP,EAEyD;;AAEvD,sBAAY,QAAZ,CAAqB,IAArB,GAA4B,MAA5B;AACA,sBAAY,MAAZ,GAAqB,mBAArB;AACA,sBAAY,OAAZ,GAAsB,OAAtB;AACA;AACD;;AAED,YAAM,uBAAuB,MAAM,aAAN,CAAoB,eAApB,CAAoC,YAApC,EAAkD,OAAlD,CAA7B;;AAEA,YAAI,oBAAJ,EAA0B;AACxB,sBAAY,QAAZ,CAAqB,IAArB,GAA4B,MAA5B;AACA,sBAAY,MAAZ,GAAqB,oBAArB;AACA,sBAAY,OAAZ,GAAsB,OAAtB;AACA;AACD;;AAED,kBAAU,WAAW,OAAX,CAAV;AACD;AACF;AACF;AACF,CAtFD;;AAwFA,SAAS,cAAT,CAAyB,SAAzB,EAAoC,YAApC,EAAkD;AAChD,MAAI,CAAC,YAAL,EAAmB;AAAE,WAAO,KAAP;AAAe;;AAEpC,MAAM,WAAW,aAAa,OAAb,CAAqB,IAArB,CAA0B,SAA3C;;AAEA,SAAQ,cAAc,IAAd,IAAsB,aAAa,IAAnC,IAA2C,aAAa,SAAhE;AACD;;;;;ACvGD,QAAQ,QAAR,EAAkB,iBAAlB,CAAoC,QAAQ,oBAAR,CAApC;;;;;ACAA,QAAQ,QAAR,EAAkB,iBAAlB,CAAoC,QAAQ,mBAAR,CAApC;;;;;ACAA,OAAO,OAAP,GAAiB;AACf,QAAM;AACJ,YAAgB,IADZ;AAEJ,oBAAgB,MAFZ;AAGJ,iBAAgB;AAHZ,GADS;;AAOf,aAAW;AACT,YAAQ,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EADC;;AAGT;AACA;AACA,kBAAc,CALL;;AAOT,aAAS;AACP,eAAmB,KADZ;AAEP,kBAAmB,EAFZ,EAEmB;AAC1B,gBAAmB,GAHZ,EAGmB;AAC1B,gBAAmB,EAJZ,EAImB;AAC1B,mBAAmB,IALZ,EAKmB;AAC1B,yBAAmB,GANZ,CAMmB;AANnB;AAPA;AAPI,CAAjB;;;;;ACAA;;AAEA;AACA,QAAQ,kBAAR;;AAEA;AACA,QAAQ,WAAR;;AAEA;AACA,QAAQ,kBAAR;AACA,QAAQ,sBAAR;;AAEA;AACA,QAAQ,sBAAR;AACA,QAAQ,4BAAR;AACA,QAAQ,qCAAR;;AAEA;AACA,QAAQ,mBAAR;;AAEA;AACA,QAAQ,mBAAR;AACA,QAAQ,kBAAR;AACA,QAAQ,gBAAR;AACA,QAAQ,gBAAR;;AAEA;AACA,QAAQ,sBAAR;AACA,QAAQ,2BAAR;AACA,QAAQ,0BAAR;;AAEA;AACA,QAAQ,qBAAR;AACA,QAAQ,oBAAR;AACA,QAAQ,kBAAR;;AAEA;AACA,QAAQ,iCAAR;;AAEA;AACA,QAAQ,cAAR;;AAEA;AACA,OAAO,OAAP,GAAiB,QAAQ,YAAR,CAAjB;;;;;AC3CA,IAAM,gBAAiB,QAAQ,iBAAR,CAAvB;AACA,IAAM,cAAiB,QAAQ,eAAR,CAAvB;AACA,IAAM,YAAiB,QAAQ,aAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,SAAR,CAAvB;AACA,IAAM,iBAAiB,QAAQ,aAAR,CAAvB;;AAEA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,KAAvB,EAA8B,UAAU,WAAV,EAAuB;AACnD,cAAY,aAAZ,GAA4B;AAC1B,YAAa,KADa;AAE1B,eAAa,KAFa;AAG1B,iBAAa,KAHa;;AAK1B,gBAAY,IALc;AAM1B,cAAY,EANc;;AAQ1B,QAAI,CARsB,EAQnB,IAAI,CARe;AAS1B,QAAI,CATsB,EASnB,IAAI,CATe;;AAW1B,QAAI,CAXsB;AAY1B,SAAK,CAZqB,EAYlB,KAAK,CAZa;AAa1B,cAAU,CAbgB;;AAe1B,eAAW,CAfe;AAgB1B,eAAW,CAhBe;AAiB1B,OAAK;AAjBqB,GAA5B;;AAoBA,cAAY,iBAAZ,GAAkC;AAAA,WAAM,aAAe,KAAf,CAAqB,WAArB,CAAN;AAAA,GAAlC;AACA,cAAY,mBAAZ,GAAkC;AAAA,WAAM,eAAe,KAAf,CAAqB,WAArB,CAAN;AAAA,GAAlC;AACD,CAvBD;;AAyBA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,MAAvB,EAA+B,gBAAwD;AAAA,MAA5C,WAA4C,QAA5C,WAA4C;AAAA,MAA/B,KAA+B,QAA/B,KAA+B;AAAA,MAAxB,OAAwB,QAAxB,OAAwB;AAAA,MAAf,WAAe,QAAf,WAAe;;AACrF,MAAM,SAAS,YAAY,aAA3B;;AAEA;AACA,MAAI,OAAO,MAAX,EAAmB;AACjB,QAAI,UAAU,WAAd;;AAEA;AACA,WAAO,MAAM,EAAN,CAAS,OAAT,CAAiB,OAAjB,CAAP,EAAkC;;AAEhC;AACA,UAAI,YAAY,YAAY,OAA5B,EAAqC;AACnC;AACA,uBAAe,MAAf,CAAsB,OAAO,CAA7B;AACA,eAAO,MAAP,GAAgB,KAAhB;AACA,oBAAY,UAAZ,GAAyB,IAAzB;;AAEA;AACA,oBAAY,aAAZ,CAA0B,OAA1B;AACA,cAAM,SAAN,CAAgB,YAAY,SAA5B,EAAuC,YAAY,QAAnD;;AAEA;AACA,YAAM,YAAY,EAAE,wBAAF,EAAlB;AACA,oBAAY,OAAZ,CAAoB,IAApB,CAAyB,oBAAzB,EAA+C,SAA/C;AACA,oBAAY,OAAZ,CAAoB,IAApB,CAAyB,eAAzB,EAA+C,SAA/C;;AAEA;AACA,YAAM,cAAc,IAAI,aAAJ,CAAkB,WAAlB,EACkB,KADlB,EAEkB,YAAY,QAAZ,CAAqB,IAFvC,EAGkB,eAHlB,EAIkB,YAAY,OAJ9B,CAApB;;AAMA,oBAAY,MAAZ,CAAmB,IAAnB,CAAwB,WAAxB;AACA,oBAAY,SAAZ,GAAwB,WAAxB;AACA,kBAAU,aAAV,CAAwB,YAAY,gBAApC;;AAEA,cAAM,UAAN,CAAiB,YAAY,UAA7B,EAAyC,YAAY,SAArD;AACA;AACD;;AAED,gBAAU,MAAM,UAAN,CAAiB,OAAjB,CAAV;AACD;AACF;AACF,CA5CD;;AA8CA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,IAAvB,EAA6B,iBAAkC;AAAA,MAAtB,WAAsB,SAAtB,WAAsB;AAAA,MAAT,KAAS,SAAT,KAAS;;AAC7D,MAAM,SAAS,YAAY,aAA3B;;AAEA,MAAI,CAAC,YAAY,WAAZ,EAAD,IAA8B,OAAO,MAAzC,EAAiD;AAAE;AAAS;;AAE5D,MAAM,SAAS,YAAY,MAA3B;AACA,MAAM,UAAU,UAAU,OAAO,OAAjC;AACA,MAAM,iBAAiB,WAAW,YAAY,QAAZ,CAAqB,IAAhC,IAAwC,QAAQ,YAAY,QAAZ,CAAqB,IAA7B,EAAmC,OAAlG;;AAEA,MAAM,MAAM,IAAI,IAAJ,GAAW,OAAX,EAAZ;AACA,MAAM,WAAW,EAAjB;AACA,MAAM,OAAO,MAAM,MAAN,CAAa,EAAb,EAAiB,YAAY,SAAZ,CAAsB,IAAvC,CAAb;AACA,MAAM,eAAe,YAAY,YAAZ,CAAyB,MAAzB,CAAgC,KAArD;;AAEA,MAAI,YAAY,KAAhB;AACA,MAAI,uBAAJ;;AAEA;AACA,MAAM,kBAAmB,kBAAkB,eAAe,OAAjC,IACH,YAAY,QAAZ,CAAqB,IAArB,KAA8B,SAD3B,IAEH,UAAU,OAAO,UAFvC;;AAIA,MAAM,UAAW,mBACX,MAAM,YAAY,SAAZ,CAAsB,SAA7B,GAA0C,EAD9B,IAEZ,eAAe,eAAe,QAFlB,IAGZ,eAAe,eAAe,QAHnC;;AAKA,MAAM,cAAc;AAClB,4BADkB;AAElB,gBAAY,IAFM;AAGlB,sBAHkB;AAIlB,YAAQ,IAJU;AAKlB,oBAAgB;AALE,GAApB;;AAQA;AACA,MAAI,mBAAmB,CAAC,OAAxB,EAAiC;AAC/B,cAAU,aAAV,CAAwB,QAAxB;;AAEA,qBAAiB,UAAU,MAAV,CAAiB,WAAjB,CAAjB;;AAEA,QAAI,eAAe,UAAf,IAA6B,eAAe,MAAhD,EAAwD;AACtD,kBAAY,IAAZ;AACD;AACF;;AAED,MAAI,EAAE,WAAW,SAAb,CAAJ,EAA6B;AAAE;AAAS;;AAExC,QAAM,UAAN,CAAiB,OAAO,QAAxB,EAAkC,YAAY,SAA9C;;AAEA,cAAY,QAAZ,CAAqB,CAArB,IAA0B,OAAO,UAAP,GACxB,IAAI,aAAJ,CAAkB,WAAlB,EAA+B,KAA/B,EAAsC,YAAY,QAAZ,CAAqB,IAA3D,EAAiE,cAAjE,EAAiF,YAAY,OAA7F,CADF;;AAGA,SAAO,EAAP,GAAY,GAAZ;;AAEA,SAAO,MAAP,GAAgB,IAAhB;AACA,SAAO,WAAP,GAAqB,eAAe,WAApC;AACA,cAAY,UAAZ,GAAyB,MAAzB;;AAEA,SAAO,IAAP,CAAY,OAAO,UAAnB;;AAEA,MAAI,OAAJ,EAAa;AACX,WAAO,GAAP,GAAa,YAAY,YAAZ,CAAyB,MAAzB,CAAgC,EAA7C;AACA,WAAO,GAAP,GAAa,YAAY,YAAZ,CAAyB,MAAzB,CAAgC,EAA7C;AACA,WAAO,EAAP,GAAY,YAAZ;;AAEA,gBAAY,WAAZ,EAAyB,MAAzB;;AAEA,UAAM,MAAN,CAAa,IAAb,EAAmB,YAAY,SAAZ,CAAsB,IAAzC;;AAEA,SAAK,CAAL,IAAU,OAAO,EAAjB;AACA,SAAK,CAAL,IAAU,OAAO,EAAjB;;AAEA,cAAU,aAAV,CAAwB,QAAxB;;AAEA,qBAAiB,UAAU,MAAV,CAAiB,WAAjB,CAAjB;;AAEA,WAAO,UAAP,IAAqB,eAAe,EAApC;AACA,WAAO,UAAP,IAAqB,eAAe,EAApC;;AAEA,WAAO,CAAP,GAAW,eAAe,OAAf,CAAuB,YAAY,iBAAnC,CAAX;AACD,GApBD,MAqBK;AACH,WAAO,SAAP,GAAmB,IAAnB;AACA,WAAO,EAAP,GAAY,eAAe,EAA3B;AACA,WAAO,EAAP,GAAY,eAAe,EAA3B;;AAEA,WAAO,EAAP,GAAY,OAAO,EAAP,GAAY,CAAxB;;AAEA,WAAO,CAAP,GAAW,eAAe,OAAf,CAAuB,YAAY,mBAAnC,CAAX;AACD;AACF,CA3FD;;AA6FA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,aAAvB,EAAsC,iBAA2B;AAAA,MAAf,WAAe,SAAf,WAAe;;AAC/D,MAAM,SAAS,YAAY,aAA3B;;AAEA,MAAI,OAAO,MAAX,EAAmB;AACjB,mBAAe,MAAf,CAAsB,OAAO,CAA7B;AACA,WAAO,MAAP,GAAgB,KAAhB;AACA,gBAAY,UAAZ,GAAyB,IAAzB;AACD;AACF,CARD;;AAUA,SAAS,WAAT,CAAsB,WAAtB,EAAmC,MAAnC,EAA2C;AACzC,MAAM,iBAAiB,YAAY,MAAZ,CAAmB,OAAnB,CAA2B,YAAY,QAAZ,CAAqB,IAAhD,EAAsD,OAA7E;AACA,MAAM,SAAS,eAAe,UAA9B;AACA,MAAM,aAAa,CAAC,KAAK,GAAL,CAAS,eAAe,QAAf,GAA0B,OAAO,EAA1C,CAAD,GAAiD,MAApE;;AAEA,SAAO,EAAP,GAAY,YAAY,SAAZ,CAAsB,KAAlC;AACA,SAAO,EAAP,GAAY,YAAY,SAAZ,CAAsB,KAAlC;AACA,SAAO,EAAP,GAAY,OAAO,UAAP,CAAkB,SAAlB,GAA8B,IAA1C;AACA,SAAO,EAAP,GAAY,OAAO,EAAP,GAAY,CAAxB;;AAEA,SAAO,UAAP,GAAoB,OAAO,EAAP,GAAY,CAAC,OAAO,GAAP,GAAa,UAAd,IAA4B,MAA5D;AACA,SAAO,UAAP,GAAoB,OAAO,EAAP,GAAY,CAAC,OAAO,GAAP,GAAa,UAAd,IAA4B,MAA5D;AACA,SAAO,EAAP,GAAY,UAAZ;;AAEA,SAAO,SAAP,GAAmB,SAAS,OAAO,EAAnC;AACA,SAAO,SAAP,GAAmB,IAAI,eAAe,QAAf,GAA0B,OAAO,EAAxD;AACD;;AAED,SAAS,YAAT,GAAyB;AACvB,sBAAoB,IAApB;AACA,QAAM,cAAN,CAAqB,KAAK,YAA1B,EAAwC,KAAK,UAA7C,EAAyD,KAAK,SAA9D;;AAEA,MAAM,SAAS,KAAK,aAApB;AACA,MAAM,UAAU,KAAK,MAAL,CAAY,OAAZ,CAAoB,KAAK,QAAL,CAAc,IAAlC,EAAwC,OAAxD;AACA,MAAM,SAAS,QAAQ,UAAvB;AACA,MAAM,IAAI,IAAI,IAAJ,GAAW,OAAX,KAAuB,IAAvB,GAA8B,OAAO,EAA/C;;AAEA,MAAI,IAAI,OAAO,EAAf,EAAmB;;AAEjB,QAAM,WAAY,IAAI,CAAC,KAAK,GAAL,CAAS,CAAC,MAAD,GAAU,CAAnB,IAAwB,OAAO,SAAhC,IAA6C,OAAO,SAA1E;;AAEA,QAAI,OAAO,UAAP,KAAsB,OAAO,EAA7B,IAAmC,OAAO,UAAP,KAAsB,OAAO,EAApE,EAAwE;AACtE,aAAO,EAAP,GAAY,OAAO,EAAP,GAAY,QAAxB;AACA,aAAO,EAAP,GAAY,OAAO,EAAP,GAAY,QAAxB;AACD,KAHD,MAIK;AACH,UAAM,YAAY,MAAM,sBAAN,CAA6B,CAA7B,EAAgC,CAAhC,EAC6B,OAAO,EADpC,EAE6B,OAAO,EAFpC,EAG6B,OAAO,UAHpC,EAI6B,OAAO,UAJpC,EAK6B,QAL7B,CAAlB;;AAOA,aAAO,EAAP,GAAY,UAAU,CAAtB;AACA,aAAO,EAAP,GAAY,UAAU,CAAtB;AACD;;AAED,SAAK,MAAL;;AAEA,WAAO,CAAP,GAAW,eAAe,OAAf,CAAuB,KAAK,iBAA5B,CAAX;AACD,GAvBD,MAwBK;AACH,WAAO,EAAP,GAAY,OAAO,UAAnB;AACA,WAAO,EAAP,GAAY,OAAO,UAAnB;;AAEA,SAAK,MAAL;AACA,SAAK,GAAL,CAAS,OAAO,UAAhB;AACA,WAAO,MAAP,GAAgB,KAAhB;AACA,SAAK,UAAL,GAAkB,IAAlB;AACD;;AAED,QAAM,UAAN,CAAiB,KAAK,UAAtB,EAAkC,KAAK,SAAvC;AACD;;AAED,SAAS,cAAT,GAA2B;AACzB,sBAAoB,IAApB;;AAEA,MAAM,SAAS,KAAK,aAApB;AACA,MAAM,IAAI,IAAI,IAAJ,GAAW,OAAX,KAAuB,OAAO,EAAxC;AACA,MAAM,WAAW,KAAK,MAAL,CAAY,OAAZ,CAAoB,KAAK,QAAL,CAAc,IAAlC,EAAwC,OAAxC,CAAgD,iBAAjE;;AAEA,MAAI,IAAI,QAAR,EAAkB;AAChB,WAAO,EAAP,GAAY,MAAM,WAAN,CAAkB,CAAlB,EAAqB,CAArB,EAAwB,OAAO,EAA/B,EAAmC,QAAnC,CAAZ;AACA,WAAO,EAAP,GAAY,MAAM,WAAN,CAAkB,CAAlB,EAAqB,CAArB,EAAwB,OAAO,EAA/B,EAAmC,QAAnC,CAAZ;;AAEA,SAAK,WAAL,CAAiB,OAAO,UAAxB,EAAoC,OAAO,UAA3C;;AAEA,WAAO,CAAP,GAAW,eAAe,OAAf,CAAuB,KAAK,mBAA5B,CAAX;AACD,GAPD,MAQK;AACH,WAAO,EAAP,GAAY,OAAO,EAAnB;AACA,WAAO,EAAP,GAAY,OAAO,EAAnB;;AAEA,SAAK,WAAL,CAAiB,OAAO,UAAxB,EAAoC,OAAO,UAA3C;AACA,SAAK,GAAL,CAAS,OAAO,UAAhB;;AAEA,WAAO,SAAP,GACE,OAAO,MAAP,GAAgB,KADlB;AAEA,SAAK,UAAL,GAAkB,IAAlB;AACD;AACF;;AAED,SAAS,mBAAT,CAA8B,WAA9B,EAA2C;AACzC,MAAM,SAAS,YAAY,aAA3B;;AAEA;AACA,MAAI,CAAC,OAAO,MAAZ,EAAoB;AAAE;AAAS;;AAE/B,MAAM,SAAW,OAAO,QAAP,CAAgB,IAAjC;AACA,MAAM,WAAW,OAAO,QAAP,CAAgB,MAAjC;;AAEA,QAAM,SAAN,CAAgB,YAAY,SAA5B,EAAuC,CAAE;AACvC,WAAS,OAAO,CAAP,GAAa,OAAO,EADU;AAEvC,WAAS,OAAO,CAAP,GAAa,OAAO,EAFU;AAGvC,aAAS,SAAS,CAAT,GAAa,OAAO,EAHU;AAIvC,aAAS,SAAS,CAAT,GAAa,OAAO;AAJU,GAAF,CAAvC;AAMD;;;;;AC/RD,IAAM,UAAe,QAAQ,iBAAR,CAArB;AACA,IAAM,SAAe,QAAQ,gBAAR,CAArB;AACA,IAAM,QAAe,QAAQ,SAAR,CAArB;AACA,IAAM,QAAe,QAAQ,SAAR,CAArB;AACA,IAAM,eAAe,QAAQ,gBAAR,CAArB;AACA,IAAM,cAAe,QAAQ,eAAR,CAArB;;AAEA,IAAM,eAAe,EAArB;;AAEA;;;;;;;;;;;;;;;;;;;;;;;;AAwBA,SAAS,QAAT,CAAmB,OAAnB,EAA4B,OAA5B,EAAqC;AACnC,MAAI,eAAe,MAAM,aAAN,CAAoB,GAApB,CAAwB,OAAxB,EAAiC,OAAjC,CAAnB;;AAEA,MAAI,CAAC,YAAL,EAAmB;AACjB,mBAAe,IAAI,YAAJ,CAAiB,OAAjB,EAA0B,OAA1B,CAAf;AACA,iBAAa,MAAb,CAAoB,MAApB,GAA6B,YAA7B;AACD;;AAED,SAAO,YAAP;AACD;;AAED;;;;;;;;AAQA,SAAS,KAAT,GAAiB,UAAU,OAAV,EAAmB,OAAnB,EAA4B;AAC3C,SAAO,MAAM,aAAN,CAAoB,cAApB,CAAmC,OAAnC,EAA4C,WAAW,QAAQ,OAA/D,MAA4E,CAAC,CAApF;AACD,CAFD;;AAIA;;;;;;;;;;;;AAYA,SAAS,EAAT,GAAc,UAAU,IAAV,EAAgB,QAAhB,EAA0B,OAA1B,EAAmC;AAC/C,MAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,IAAhB,KAAyB,KAAK,MAAL,CAAY,GAAZ,MAAqB,CAAC,CAAnD,EAAsD;AACpD,WAAO,KAAK,IAAL,GAAY,KAAZ,CAAkB,IAAlB,CAAP;AACD;;AAED,MAAI,MAAM,EAAN,CAAS,KAAT,CAAe,IAAf,CAAJ,EAA0B;AACxB,yBAAwB,IAAxB,kHAA8B;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAAnB,SAAmB;;AAC5B,eAAS,EAAT,CAAY,SAAZ,EAAuB,QAAvB,EAAiC,OAAjC;AACD;;AAED,WAAO,QAAP;AACD;;AAED,MAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,IAAhB,CAAJ,EAA2B;AACzB,SAAK,IAAM,IAAX,IAAmB,IAAnB,EAAyB;AACvB,eAAS,EAAT,CAAY,IAAZ,EAAkB,KAAK,IAAL,CAAlB,EAA8B,QAA9B;AACD;;AAED,WAAO,QAAP;AACD;;AAED;AACA,MAAI,MAAM,QAAN,CAAe,aAAa,UAA5B,EAAwC,IAAxC,CAAJ,EAAmD;AACjD;AACA,QAAI,CAAC,aAAa,IAAb,CAAL,EAAyB;AACvB,mBAAa,IAAb,IAAqB,CAAC,QAAD,CAArB;AACD,KAFD,MAGK;AACH,mBAAa,IAAb,EAAmB,IAAnB,CAAwB,QAAxB;AACD;AACF;AACD;AATA,OAUK;AACH,aAAO,GAAP,CAAW,MAAM,QAAjB,EAA2B,IAA3B,EAAiC,QAAjC,EAA2C,EAAE,gBAAF,EAA3C;AACD;;AAED,SAAO,QAAP;AACD,CArCD;;AAuCA;;;;;;;;;;;AAWA,SAAS,GAAT,GAAe,UAAU,IAAV,EAAgB,QAAhB,EAA0B,OAA1B,EAAmC;AAChD,MAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,IAAhB,KAAyB,KAAK,MAAL,CAAY,GAAZ,MAAqB,CAAC,CAAnD,EAAsD;AACpD,WAAO,KAAK,IAAL,GAAY,KAAZ,CAAkB,IAAlB,CAAP;AACD;;AAED,MAAI,MAAM,EAAN,CAAS,KAAT,CAAe,IAAf,CAAJ,EAA0B;AACxB,0BAAwB,IAAxB,yHAA8B;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAAnB,SAAmB;;AAC5B,eAAS,GAAT,CAAa,SAAb,EAAwB,QAAxB,EAAkC,OAAlC;AACD;;AAED,WAAO,QAAP;AACD;;AAED,MAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,IAAhB,CAAJ,EAA2B;AACzB,SAAK,IAAM,IAAX,IAAmB,IAAnB,EAAyB;AACvB,eAAS,GAAT,CAAa,IAAb,EAAmB,KAAK,IAAL,CAAnB,EAA+B,QAA/B;AACD;;AAED,WAAO,QAAP;AACD;;AAED,MAAI,CAAC,MAAM,QAAN,CAAe,aAAa,UAA5B,EAAwC,IAAxC,CAAL,EAAoD;AAClD,WAAO,MAAP,CAAc,MAAM,QAApB,EAA8B,IAA9B,EAAoC,QAApC,EAA8C,OAA9C;AACD,GAFD,MAGK;AACH,QAAI,cAAJ;;AAEA,QAAI,QAAQ,YAAR,IACG,CAAC,QAAQ,MAAM,OAAN,CAAc,aAAa,IAAb,CAAd,EAAkC,QAAlC,CAAT,MAA0D,CAAC,CADlE,EACqE;AACnE,mBAAa,IAAb,EAAmB,MAAnB,CAA0B,KAA1B,EAAiC,CAAjC;AACD;AACF;;AAED,SAAO,QAAP;AACD,CAlCD;;AAoCA;;;;;;;AAOA,SAAS,KAAT,GAAiB,YAAY;AAC3B,SAAO,KAAP;AACD,CAFD;;AAIA;AACA,SAAS,iBAAT,GAA8B,MAAM,cAApC;AACA,SAAS,YAAT,GAA8B,MAAM,SAApC;AACA,SAAS,gBAAT,GAA8B,MAAM,aAApC;AACA,SAAS,aAAT,GAA8B,MAAM,UAApC;;AAEA,SAAS,cAAT,GAAgC,MAAM,cAAtC;AACA,SAAS,oBAAT,GAAgC,MAAM,oBAAtC;AACA,SAAS,eAAT,GAAgC,MAAM,eAAtC;AACA,SAAS,OAAT,GAAgC,MAAM,OAAtC;;AAEA;;;;;;AAMA,SAAS,aAAT,GAAyB,YAAY;AACnC,SAAO,QAAQ,aAAf;AACD,CAFD;;AAIA;;;;;;AAMA,SAAS,oBAAT,GAAgC,YAAY;AAC1C,SAAO,QAAQ,oBAAf;AACD,CAFD;;AAIA;;;;;;;;;AASA,SAAS,IAAT,GAAgB,UAAU,KAAV,EAAiB;AAC/B,OAAK,IAAI,IAAI,MAAM,YAAN,CAAmB,MAAnB,GAA4B,CAAzC,EAA4C,KAAK,CAAjD,EAAoD,GAApD,EAAyD;AACvD,UAAM,YAAN,CAAmB,CAAnB,EAAsB,IAAtB,CAA2B,KAA3B;AACD;;AAED,SAAO,QAAP;AACD,CAND;;AAQA;;;;;;;;;AASA,SAAS,oBAAT,GAAgC,UAAU,QAAV,EAAoB;AAClD,MAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,QAAhB,CAAJ,EAA+B;AAC7B,gBAAY,oBAAZ,GAAmC,QAAnC;;AAEA,WAAO,IAAP;AACD;;AAED,SAAO,YAAY,oBAAnB;AACD,CARD;;AAUA,SAAS,WAAT,GAA0B,MAAM,WAAhC;AACA,SAAS,cAAT,GAA0B,MAAM,cAAhC;;AAEA,MAAM,QAAN,GAAiB,QAAjB;;AAEA,OAAO,OAAP,GAAiB,QAAjB;;;;;AC7OA,IAAM,eAAe,QAAQ,gBAAR,CAArB;AACA,IAAM,cAAe,QAAQ,eAAR,CAArB;AACA,IAAM,QAAe,QAAQ,SAAR,CAArB;AACA,IAAM,KAAe,QAAQ,YAAR,CAArB;AACA,IAAM,SAAe,QAAQ,gBAAR,CAArB;;eAE0C,QAAQ,kBAAR,C;IAAlC,Y,YAAA,Y;IAAc,e,YAAA,e;;AAEtB;;;;;;;;;;;;;;;AAaA,aAAa,SAAb,CAAuB,cAAvB,GAAwC,UAAU,QAAV,EAAoB;AAC1D,MAAI,wBAAwB,IAAxB,CAA6B,QAA7B,CAAJ,EAA4C;AAC1C,SAAK,OAAL,CAAa,cAAb,GAA8B,QAA9B;AACA,WAAO,IAAP;AACD;;AAED,MAAI,GAAG,IAAH,CAAQ,QAAR,CAAJ,EAAuB;AACrB,SAAK,OAAL,CAAa,cAAb,GAA8B,WAAU,QAAV,GAAqB,OAAnD;AACA,WAAO,IAAP;AACD;;AAED,SAAO,KAAK,OAAL,CAAa,cAApB;AACD,CAZD;;AAcA,aAAa,SAAb,CAAuB,sBAAvB,GAAgD,UAAU,KAAV,EAAiB;AAC/D,MAAM,UAAU,KAAK,OAAL,CAAa,cAA7B;;AAEA,MAAI,YAAY,OAAhB,EAAyB;AAAE;AAAS;;AAEpC,MAAI,YAAY,QAAhB,EAA0B;AACxB,UAAM,cAAN;AACA;AACD;;AAED;;AAEA;AACA;AACA,MAAI,OAAO,eAAX,EAA4B;AAC1B;AACD;;AAED;AACA,MAAI,uCAAuC,IAAvC,CAA4C,MAAM,IAAlD,CAAJ,EAA6D;AAC3D;AACD;;AAED;AACA,MAAI,GAAG,OAAH,CAAW,MAAM,MAAjB,KACG,gBAAgB,MAAM,MAAtB,EAA8B,uEAA9B,CADP,EAC+G;AAC7G;AACD;;AAED,QAAM,cAAN;AACD,CA9BD;;AAgCA,SAAS,kBAAT,OAAqD;AAAA,MAAtB,WAAsB,QAAtB,WAAsB;AAAA,MAAT,KAAS,QAAT,KAAS;;AACnD,MAAI,YAAY,MAAhB,EAAwB;AACtB,gBAAY,MAAZ,CAAmB,sBAAnB,CAA0C,KAA1C;AACD;AACF;;WAEyB,CAAC,MAAD,EAAS,MAAT,EAAiB,IAAjB,EAAuB,QAAvB,C;AAA1B,yCAA4D;AAAvD,MAAM,sBAAN;AACH,cAAY,OAAZ,CAAoB,EAApB,CAAuB,WAAvB,EAAoC,kBAApC;AACD;;AAED;AACA,YAAY,SAAZ,CAAsB,SAAtB,GAAkC,SAAS,iBAAT,CAA4B,KAA5B,EAAmC;AACnE,uBAA0B,MAAM,YAAhC,mHAA8C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,QAAnC,WAAmC;;;AAE5C,QAAI,YAAY,OAAZ,KACI,YAAY,OAAZ,KAAwB,MAAM,MAA9B,IACG,aAAa,YAAY,OAAzB,EAAkC,MAAM,MAAxC,CAFP,CAAJ,EAE6D;;AAE3D,kBAAY,MAAZ,CAAmB,sBAAnB,CAA0C,KAA1C;AACA;AACD;AACF;AACF,CAXD;;;;;AC9EA,IAAM,QAAgB,QAAQ,SAAR,CAAtB;AACA,IAAM,SAAgB,QAAQ,gBAAR,CAAtB;AACA,IAAM,UAAgB,QAAQ,iBAAR,CAAtB;AACA,IAAM,UAAgB,QAAQ,2BAAR,CAAtB;AACA,IAAM,gBAAgB,QAAQ,sBAAR,CAAtB;;eAEmB,QAAQ,gBAAR,C;IAAX,M,YAAA,M;;AAER,IAAM,WAAW,OAAO,SAAP,CAAiB,QAAlC;;AAEA,IAAI,CAAC,OAAO,KAAP,CAAa,OAAlB,EAA2B;AACzB,SAAO,KAAP,CAAa,OAAb,GAAuB,UAAU,GAAV,EAAe;AACpC,WAAO,SAAS,IAAT,CAAc,GAAd,MAAuB,gBAA9B;AACD,GAFD;AAGD;;AAED,IAAI,CAAC,OAAO,SAAP,CAAiB,IAAtB,EAA4B;AAC1B,SAAO,SAAP,CAAiB,IAAjB,GAAwB,YAAY;AAClC,WAAO,KAAK,OAAL,CAAa,oCAAb,EAAmD,EAAnD,CAAP;AACD,GAFD;AAGD;;AAED;AACA;AACA;AACA;AACA;AACA,SAAS,aAAT,CAAwB,KAAxB,EAA+B;AAC7B,MAAM,cAAc,MAAM,MAA1B;AACA,MAAM,cAAc,QAAQ,MAAR,CAAe,KAAf,EAAsB,MAAM,IAA5B,EAAkC,WAAlC,CAApB;;AAEA,MAAI,CAAC,WAAL,EAAkB;AAAE;AAAS;;AAE7B,MAAI,YAAY,OAAZ,IACG,MAAM,OAAN,KAAkB,YAAY,OAAZ,CAAoB,OADzC,IAEG,MAAM,OAAN,KAAkB,YAAY,OAAZ,CAAoB,OAFzC,IAGG,gBAAkB,YAAY,OAAZ,CAAoB,MAH7C,EAGqD;;AAEnD,gBAAY,WAAZ,CAAwB,CAAxB,IAA6B,WAA7B;AACA,gBAAY,SAAZ,CAAwB,CAAxB,IAA6B,IAAI,IAAJ,GAAW,OAAX,EAA7B;;AAEA,kBAAc,IAAd,CAAmB;AACjB,8BADiB;AAEjB,kBAFiB;AAGjB,8BAHiB;AAIjB,eAAS,KAJQ;AAKjB,YAAM;AALW,KAAnB;AAOD;AACF;;AAED,IAAI,QAAQ,KAAZ,EAAmB;AACjB,MAAM,YAAY,SAAZ,SAAY,CAAU,KAAV,EAAiB;AACjC,yBAA0B,MAAM,YAAhC,kHAA8C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAAnC,WAAmC;;AAC5C,UAAI,YAAY,WAAZ,EAAJ,EAA+B;AAC7B,oBAAY,MAAZ,CAAmB,sBAAnB,CAA0C,KAA1C;AACD;AACF;AACF,GAND;;AAQA,MAAM,WAAW,SAAS,QAAT,QAAiC,UAAjC,EAA6C;AAAA,QAAxB,GAAwB,SAAxB,GAAwB;AAAA,QAAnB,GAAmB,SAAnB,GAAmB;;AAC5D,QAAM,cAAc,WAAW,OAAX,CAAmB,QAAnB,MAAiC,CAAjC,GAChB,OAAO,GADS,GACH,OAAO,MADxB;;AAGA;AACA,gBAAY,GAAZ,EAAiB,aAAjB,EAAgC,SAAhC;;AAEA,QAAI,aAAJ,EAAmB;AACjB,kBAAY,GAAZ,EAAiB,UAAjB,EAA6B,aAA7B;AACD;AACF,GAVD;;AAYA,QAAM,OAAN,CAAc,EAAd,CAAiB,cAAjB,EAAoC,QAApC;AACA,QAAM,OAAN,CAAc,EAAd,CAAiB,iBAAjB,EAAoC,QAApC;AACD;;AAED,OAAO,OAAP,GAAiB,IAAjB;;;;;AC5EA,IAAM,gBAAgB,QAAQ,kBAAR,CAAtB;AACA,IAAM,cAAgB,QAAQ,gBAAR,CAAtB;AACA,IAAM,SAAgB,QAAQ,iBAAR,CAAtB;;AAEA,IAAM,YAAY;AAChB,SAAO,EADS;;AAGhB,cAAY,oBAAU,GAAV,EAAe;AAAA,QACjB,WADiB,GACiB,GADjB,CACjB,WADiB;AAAA,QACQ,IADR,GACiB,GADjB,CACJ,UADI;AAAA,QAEjB,MAFiB,GAEgB,WAFhB,CAEjB,MAFiB;AAAA,QAET,OAFS,GAEgB,WAFhB,CAET,OAFS;AAAA,QAEA,WAFA,GAEgB,WAFhB,CAEA,WAFA;;AAGzB,QAAM,OAAO,OAAO,OAAP,CAAe,OAAf,CAAb;;AAEA,QAAI,IAAJ,EAAU;AACR,kBAAY,IAAZ,GAAmB,KAAK,CAAL,GAAS,KAAK,IAAjC;AACA,kBAAY,GAAZ,GAAmB,KAAK,CAAL,GAAS,KAAK,GAAjC;;AAEA,kBAAY,KAAZ,GAAqB,KAAK,KAAL,GAAc,KAAK,CAAxC;AACA,kBAAY,MAAZ,GAAqB,KAAK,MAAL,GAAc,KAAK,CAAxC;;AAEA,UAAI,EAAE,WAAY,IAAd,CAAJ,EAAyB;AAAE,aAAK,KAAL,GAAc,KAAK,KAAL,GAAc,KAAK,IAAjC;AAAwC;AACnE,UAAI,EAAE,YAAY,IAAd,CAAJ,EAAyB;AAAE,aAAK,MAAL,GAAc,KAAK,MAAL,GAAc,KAAK,GAAjC;AAAwC;AACpE,KATD,MAUK;AACH,kBAAY,IAAZ,GAAmB,YAAY,GAAZ,GAAkB,YAAY,KAAZ,GAAoB,YAAY,MAAZ,GAAqB,CAA9E;AACD;;AAED,QAAI,IAAJ,GAAW,IAAX;AACA,QAAI,YAAJ,GAAmB,MAAnB;AACA,QAAI,OAAJ,GAAc,OAAd;;AAEA,SAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,UAAU,KAAV,CAAgB,MAApC,EAA4C,GAA5C,EAAiD;AAC/C,UAAM,eAAe,UAAU,KAAV,CAAgB,CAAhB,CAArB;;AAEA,UAAI,OAAJ,GAAc,OAAO,OAAP,CAAe,YAAY,QAAZ,CAAqB,IAApC,EAA0C,YAA1C,CAAd;;AAEA,UAAI,CAAC,IAAI,OAAT,EAAkB;AAChB;AACD;;AAED,kBAAY,eAAZ,CAA4B,YAA5B,IAA4C,UAAU,YAAV,EAAwB,SAAxB,CAAkC,GAAlC,CAA5C;AACD;AACF,GArCe;;AAuChB,UAAQ,gBAAU,GAAV,EAAe;AAAA,QACb,WADa,GACqC,GADrC,CACb,WADa;AAAA,QACA,QADA,GACqC,GADrC,CACA,QADA;AAAA,QACU,MADV,GACqC,GADrC,CACU,MADV;AAAA,QACkB,cADlB,GACqC,GADrC,CACkB,cADlB;;AAErB,QAAM,SAAS,OAAO,EAAP,EAAW,IAAI,UAAf,CAAf;AACA,QAAM,SAAS;AACb,UAAI,CADS;AAEb,UAAI,CAFS;AAGb,eAAS,KAHI;AAIb,cAAQ,KAJK;AAKb,kBAAY;AALC,KAAf;;AAQA,yBAA2B,UAAU,KAArC,kHAA4C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAAjC,YAAiC;;AAC1C,UAAM,WAAW,UAAU,YAAV,CAAjB;AACA,UAAM,UAAU,YAAY,MAAZ,CAAmB,OAAnB,CAA2B,YAAY,QAAZ,CAAqB,IAAhD,EAAsD,YAAtD,CAAhB;;AAEA,UAAI,CAAC,SAAS,OAAT,EAAkB,MAAlB,EAA0B,cAA1B,CAAL,EAAgD;AAAE;AAAW;;AAE7D,UAAI,MAAJ,GAAa,IAAI,MAAJ,GAAa,SAAS,YAAT,CAA1B;AACA,UAAI,OAAJ,GAAc,OAAd;AACA,UAAI,MAAJ,GAAa,IAAI,WAAJ,CAAgB,eAAhB,CAAgC,YAAhC,CAAb;;AAEA,eAAS,GAAT,CAAa,GAAb;;AAEA,UAAI,IAAI,MAAJ,CAAW,MAAf,EAAuB;AACrB,eAAO,CAAP,IAAY,IAAI,MAAJ,CAAW,EAAvB;AACA,eAAO,CAAP,IAAY,IAAI,MAAJ,CAAW,EAAvB;;AAEA,eAAO,EAAP,IAAa,IAAI,MAAJ,CAAW,EAAxB;AACA,eAAO,EAAP,IAAa,IAAI,MAAJ,CAAW,EAAxB;;AAEA,eAAO,MAAP,GAAgB,IAAhB;AACD;AACF;;AAED;AACA;AACA;AACA;AACA,WAAO,UAAP,GAAoB,CAAC,IAAI,MAAL,IAAe,CAAC,OAAO,MAAvB,IAAiC,IAAI,MAAJ,CAAW,OAAhE;;AAEA,WAAO,MAAP;AACD,GAhFe;;AAkFhB,iBAAe,uBAAU,QAAV,EAAoB;AACjC,0BAA2B,UAAU,KAArC,yHAA4C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAAjC,YAAiC;;AAC1C,UAAM,SAAS,SAAS,YAAT,KAA0B,EAAzC;;AAEA,aAAO,EAAP,GAAY,OAAO,EAAP,GAAY,CAAxB;AACA,aAAO,SAAP,GAAmB,OAAO,SAAP,GAAmB,GAAtC;AACA,aAAO,MAAP,GAAgB,KAAhB;AACA,aAAO,OAAP,GAAiB,IAAjB;;AAEA,eAAS,YAAT,IAAyB,MAAzB;AACD;;AAED,WAAO,QAAP;AACD,GA/Fe;;AAiGhB,SAAO,sBAA2B,UAA3B,EAAuC;AAAA,QAA3B,WAA2B,SAA3B,WAA2B;;AAC5C,QAAM,MAAM;AACV,8BADU;AAEV,kBAAY,CAAC,eAAe,eAAf,GACA,YAAY,SADZ,GACwB,YAAY,WADrC,EACkD,IAHpD;AAIV,mBAAa,YAAY,WAJf;AAKV,gBAAU,YAAY,gBALZ;AAMV,cAAQ,KANE;AAOV,sBAAgB;AAPN,KAAZ;;AAUA,cAAU,UAAV,CAAqB,GAArB;AACA,cAAU,aAAV,CAAwB,IAAI,QAA5B;;AAEA,QAAI,UAAJ,GAAiB,OAAO,EAAP,EAAW,YAAY,WAAZ,CAAwB,IAAnC,CAAjB;AACA,gBAAY,cAAZ,GAA6B,UAAU,MAAV,CAAiB,GAAjB,CAA7B;AACD;AAjHe,CAAlB;;AAoHA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,KAAvB,EAA8B,UAAU,WAAV,EAAuB;AACnD,cAAY,WAAZ,GAA+B,EAAE,MAAM,CAAR,EAAW,OAAO,CAAlB,EAAqB,KAAK,CAA1B,EAA6B,QAAQ,CAArC,EAA/B;AACA,cAAY,eAAZ,GAA+B,EAA/B;AACA,cAAY,gBAAZ,GAA+B,UAAU,aAAV,CAAwB,EAAxB,CAA/B;AACA,cAAY,cAAZ,GAA+B,IAA/B;AACD,CALD;;AAOA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,cAAvB,EAAwC,UAAU,KAAlD;AACA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,eAAvB,EAAwC,UAAU,KAAlD;;AAEA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,oBAAvB,EAA6C,iBAA0D;AAAA,MAA9C,WAA8C,SAA9C,WAA8C;AAAA,MAAjC,MAAiC,SAAjC,MAAiC;AAAA,MAAzB,qBAAyB,SAAzB,qBAAyB;;AACrG,MAAM,iBAAiB,UAAU,MAAV,CAAiB;AACtC,4BADsC;AAEtC,kBAFsC;AAGtC,gBAAY,YAAY,SAAZ,CAAsB,IAHI;AAItC,cAAU,YAAY,gBAJgB;AAKtC,oBAAgB;AALsB,GAAjB,CAAvB;;AAQA;AACA;AACA,MAAI,CAAC,eAAe,UAAhB,IAA8B,qBAAlC,EAAyD;AACvD,gBAAY,aAAZ,GAA4B,IAA5B;AACD;;AAED,cAAY,cAAZ,GAA6B,cAA7B;AACD,CAhBD;;AAkBA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,YAAvB,EAAqC,iBAAkC;AAAA,MAAtB,WAAsB,SAAtB,WAAsB;AAAA,MAAT,KAAS,SAAT,KAAS;;AACrE,OAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,UAAU,KAAV,CAAgB,MAApC,EAA4C,GAA5C,EAAiD;AAC/C,QAAM,UAAU,YAAY,MAAZ,CAAmB,OAAnB,CAA2B,YAAY,QAAZ,CAAqB,IAAhD,EAAsD,UAAU,KAAV,CAAgB,CAAhB,CAAtD,CAAhB;;AAEA;AACA,QAAI,SAAS,OAAT,EAAkB,IAAlB,EAAwB,IAAxB,CAAJ,EAAmC;AACjC;AACA,kBAAY,MAAZ,CAAmB,EAAE,YAAF,EAAS,QAAQ,IAAjB,EAAnB;AACA;AACD;AACF;AACF,CAXD;;AAaA,cAAc,OAAd,CAAsB,EAAtB,CAAyB,QAAzB,EAAmC,UAAU,GAAV,EAAe;AAAA,MACxC,MADwC,GAChB,GADgB,CACxC,MADwC;AAAA,MAChC,WADgC,GAChB,GADgB,CAChC,WADgC;;AAEhD,MAAM,cAAc,OAAO,EAAP,EAAW,GAAX,CAApB;;AAEA,OAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,UAAU,KAAV,CAAgB,MAApC,EAA4C,GAA5C,EAAiD;AAC/C,QAAM,eAAe,UAAU,KAAV,CAAgB,CAAhB,CAArB;AACA,gBAAY,OAAZ,GAAsB,YAAY,MAAZ,CAAmB,OAAnB,CAA2B,YAAY,QAAZ,CAAqB,IAAhD,EAAsD,YAAtD,CAAtB;;AAEA,QAAI,CAAC,YAAY,OAAjB,EAA0B;AACxB;AACD;;AAED,QAAM,WAAW,UAAU,YAAV,CAAjB;;AAEA,gBAAY,MAAZ,GAAqB,YAAY,gBAAZ,CAA6B,YAA7B,CAArB;;AAEA,WAAO,YAAP,IAAuB,SAAS,YAAT,CAAsB,WAAtB,CAAvB;AACD;AACF,CAlBD;;AAoBA,SAAS,QAAT,CAAmB,OAAnB,EAA4B,MAA5B,EAAoC,cAApC,EAAoD;AAClD,SAAQ,WAAW,QAAQ,OAAnB,KACI,UAAU,CAAC,QAAQ,OADvB,MAEI,CAAC,cAAD,IAAmB,QAAQ,OAF/B,CAAR;AAGD;;AAED,OAAO,OAAP,GAAiB,SAAjB;;;;;AC3LA,IAAM,YAAiB,QAAQ,SAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,UAAR,CAAvB;AACA,IAAM,iBAAiB,QAAQ,mBAAR,CAAvB;;AAEA,IAAM,WAAW;AACf,YAAU;AACR,aAAa,KADL;AAER,aAAa,KAFL;AAGR,iBAAa,IAHL;AAIR,iBAAa;AAJL,GADK;;AAQf,aAAW,yBAA0C;AAAA,QAA9B,IAA8B,QAA9B,IAA8B;AAAA,QAAxB,WAAwB,QAAxB,WAAwB;AAAA,QAAX,OAAW,QAAX,OAAW;;AACnD,QAAM,cAAc,WAAW,QAAQ,WAAvC;AACA,QAAM,SAAS,EAAf;;AAEA,QAAI,QAAQ,WAAZ,EAAyB;AACvB,aAAO,IAAP,GAAc,YAAY,IAAZ,GAAoB,KAAK,KAAL,GAAc,YAAY,IAA5D;AACA,aAAO,GAAP,GAAc,YAAY,GAAZ,GAAoB,KAAK,MAAL,GAAc,YAAY,GAA5D;;AAEA,aAAO,KAAP,GAAgB,YAAY,KAAZ,GAAsB,KAAK,KAAL,IAAe,IAAI,YAAY,KAA/B,CAAtC;AACA,aAAO,MAAP,GAAgB,YAAY,MAAZ,GAAsB,KAAK,MAAL,IAAe,IAAI,YAAY,MAA/B,CAAtC;AACD,KAND,MAOK;AACH,aAAO,IAAP,GAAc,OAAO,GAAP,GAAa,OAAO,KAAP,GAAe,OAAO,MAAP,GAAgB,CAA1D;AACD;;AAED,WAAO,MAAP;AACD,GAxBc;;AA0Bf,OAAK,oBAAwD;AAAA,QAA5C,UAA4C,SAA5C,UAA4C;AAAA,QAAhC,WAAgC,SAAhC,WAAgC;AAAA,QAAnB,MAAmB,SAAnB,MAAmB;AAAA,QAAX,OAAW,SAAX,OAAW;;AAC3D,QAAI,CAAC,OAAL,EAAc;AAAE,aAAO,MAAP;AAAgB;;AAEhC,QAAM,OAAO,OAAO,WAAP,GACT,EAAE,GAAG,OAAO,CAAZ,EAAe,GAAG,OAAO,CAAzB,EADS,GAET,MAAM,MAAN,CAAa,EAAb,EAAiB,UAAjB,CAFJ;;AAIA,QAAM,cAAc,mBAAmB,QAAQ,WAA3B,EAAwC,WAAxC,EAAqD,IAArD,CAApB;;AAEA,QAAI,CAAC,WAAL,EAAkB;AAAE,aAAO,MAAP;AAAgB;;AAEpC,WAAO,EAAP,GAAY,CAAZ;AACA,WAAO,EAAP,GAAY,CAAZ;AACA,WAAO,MAAP,GAAgB,KAAhB;;AAEA,QAAM,OAAO,WAAb;AACA,QAAI,YAAY,KAAK,CAArB;AACA,QAAI,YAAY,KAAK,CAArB;;AAEA,QAAM,SAAS,YAAY,eAAZ,CAA4B,QAA3C;;AAEA;AACA;AACA;AACA,QAAI,OAAO,WAAP,IAAsB,OAAO,WAAjC,EAA8C;AAC5C,kBAAY,KAAK,GAAL,CAAS,KAAK,GAAL,CAAS,KAAK,CAAL,GAAS,KAAK,KAAd,GAAuB,OAAO,KAAvC,EAA+C,KAAK,CAApD,CAAT,EAAiE,KAAK,CAAL,GAAS,OAAO,IAAjF,CAAZ;AACA,kBAAY,KAAK,GAAL,CAAS,KAAK,GAAL,CAAS,KAAK,CAAL,GAAS,KAAK,MAAd,GAAuB,OAAO,MAAvC,EAA+C,KAAK,CAApD,CAAT,EAAiE,KAAK,CAAL,GAAS,OAAO,GAAjF,CAAZ;AACD,KAHD,MAIK;AACH,kBAAY,KAAK,GAAL,CAAS,KAAK,GAAL,CAAS,KAAK,KAAL,GAAc,OAAO,KAA9B,EAAsC,KAAK,CAA3C,CAAT,EAAwD,KAAK,IAAL,GAAY,OAAO,IAA3E,CAAZ;AACA,kBAAY,KAAK,GAAL,CAAS,KAAK,GAAL,CAAS,KAAK,MAAL,GAAc,OAAO,MAA9B,EAAsC,KAAK,CAA3C,CAAT,EAAwD,KAAK,GAAL,GAAY,OAAO,GAA3E,CAAZ;AACD;;AAED,WAAO,EAAP,GAAY,YAAY,KAAK,CAA7B;AACA,WAAO,EAAP,GAAY,YAAY,KAAK,CAA7B;;AAEA,WAAO,OAAP,GAAiB,OAAO,SAAP,KAAqB,SAArB,IAAkC,OAAO,SAAP,KAAqB,SAAxE;AACA,WAAO,MAAP,GAAgB,CAAC,EAAE,OAAO,EAAP,IAAa,OAAO,EAAtB,CAAjB;;AAEA,WAAO,SAAP,GAAmB,SAAnB;AACA,WAAO,SAAP,GAAmB,SAAnB;AACD,GAnEc;;AAqEf,gBAAc,6BAAoD;AAAA,QAAxC,IAAwC,SAAxC,IAAwC;AAAA,QAAlC,MAAkC,SAAlC,MAAkC;AAAA,QAA1B,MAA0B,SAA1B,MAA0B;AAAA,QAAlB,KAAkB,SAAlB,KAAkB;AAAA,QAAX,OAAW,SAAX,OAAW;;AAChE,QAAM,cAAc,WAAW,QAAQ,WAAvC;;AAEA,QAAI,WAAW,QAAQ,OAAnB,IACG,EAAE,UAAU,OAAV,IAAqB,WAArB,IAAoC,OAAO,MAA7C,CADP,EAC6D;;AAE3D,UAAI,OAAO,MAAX,EAAmB;AACjB,aAAK,CAAL,IAAU,OAAO,EAAjB;AACA,aAAK,CAAL,IAAU,OAAO,EAAjB;AACA,eAAO,CAAP,IAAY,OAAO,EAAnB;AACA,eAAO,CAAP,IAAY,OAAO,EAAnB;;AAEA,eAAO;AACL,cAAI,OAAO,EADN;AAEL,cAAI,OAAO;AAFN,SAAP;AAID;AACF;AACF,GAvFc;;AAyFf;AAzFe,CAAjB;;AA4FA,SAAS,kBAAT,CAA6B,KAA7B,EAAoC,WAApC,EAAiD,IAAjD,EAAuD;AACrD,MAAI,MAAM,EAAN,CAAS,QAAT,CAAkB,KAAlB,CAAJ,EAA8B;AAC5B,WAAO,MAAM,eAAN,CAAsB,KAAtB,EAA6B,YAAY,MAAzC,EAAiD,YAAY,OAA7D,EAAsE,CAAC,KAAK,CAAN,EAAS,KAAK,CAAd,EAAiB,WAAjB,CAAtE,CAAP;AACD,GAFD,MAEO;AACL,WAAO,MAAM,eAAN,CAAsB,KAAtB,EAA6B,YAAY,MAAzC,EAAiD,YAAY,OAA7D,CAAP;AACD;AACF;;AAED,UAAU,QAAV,GAAqB,QAArB;AACA,UAAU,KAAV,CAAgB,IAAhB,CAAqB,UAArB;;AAEA,eAAe,SAAf,CAAyB,QAAzB,GAAoC,SAAS,QAA7C;;AAEA,OAAO,OAAP,GAAiB,QAAjB;;;;;AC7GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,IAAM,YAAiB,QAAQ,SAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,UAAR,CAAvB;AACA,IAAM,YAAiB,QAAQ,eAAR,CAAvB;AACA,IAAM,iBAAiB,QAAQ,mBAAR,CAAvB;AACA,IAAM,SAAiB,QAAQ,mBAAR,CAAvB;;eAE+B,QAAQ,YAAR,C;IAAvB,kB,YAAA,kB;;AAER,IAAM,UAAU,EAAE,KAAK,CAAC,QAAR,EAAkB,MAAM,CAAC,QAAzB,EAAmC,QAAQ,CAAC,QAA5C,EAAsD,OAAO,CAAC,QAA9D,EAAhB;AACA,IAAM,UAAU,EAAE,KAAK,CAAC,QAAR,EAAkB,MAAM,CAAC,QAAzB,EAAmC,QAAQ,CAAC,QAA5C,EAAsD,OAAO,CAAC,QAA9D,EAAhB;;AAEA,IAAM,gBAAgB;AACpB,YAAU;AACR,aAAS,KADD;AAER,aAAS,KAFD;AAGR,SAAK,IAHG;AAIR,SAAK,IAJG;AAKR,YAAQ;AALA,GADU;;AASpB,aAAW,yBAAiD;AAAA,QAArC,WAAqC,QAArC,WAAqC;AAAA,QAAxB,WAAwB,QAAxB,WAAwB;AAAA,QAAX,OAAW,QAAX,OAAW;;AAC1D,QAAI,CAAC,OAAL,EAAc;AACZ,aAAO,MAAM,MAAN,CAAa,EAAb,EAAiB,WAAjB,CAAP;AACD;;AAED,QAAM,SAAS,mBAAmB,QAAQ,MAA3B,EAAmC,WAAnC,EAAgD,YAAY,WAAZ,CAAwB,IAAxE,CAAf;;AAEA,QAAI,MAAJ,EAAY;AACV,aAAO;AACL,aAAQ,YAAY,GAAZ,GAAqB,OAAO,CAD/B;AAEL,cAAQ,YAAY,IAAZ,GAAqB,OAAO,CAF/B;AAGL,gBAAQ,YAAY,MAAZ,GAAqB,OAAO,CAH/B;AAIL,eAAQ,YAAY,KAAZ,GAAqB,OAAO;AAJ/B,OAAP;AAMD;;AAED,WAAO,WAAP;AACD,GA1BmB;;AA4BpB,OAAK,oBAAgE;AAAA,QAApD,UAAoD,SAApD,UAAoD;AAAA,QAAxC,WAAwC,SAAxC,WAAwC;AAAA,QAA3B,MAA2B,SAA3B,MAA2B;AAAA,QAAnB,MAAmB,SAAnB,MAAmB;AAAA,QAAX,OAAW,SAAX,OAAW;;AACnE,QAAM,QAAQ,YAAY,QAAZ,CAAqB,WAArB,IAAoC,YAAY,QAAZ,CAAqB,KAAvE;;AAEA,QAAI,CAAC,YAAY,WAAZ,EAAD,IAA8B,CAAC,KAAnC,EAA0C;AACxC;AACD;;AAED,QAAM,OAAO,OAAO,WAAP,GACT,EAAE,GAAG,OAAO,CAAZ,EAAe,GAAG,OAAO,CAAzB,EADS,GAET,MAAM,MAAN,CAAa,EAAb,EAAiB,UAAjB,CAFJ;AAGA,QAAM,QAAQ,UAAU,UAAV,CAAqB,mBAAmB,QAAQ,KAA3B,EAAkC,WAAlC,EAA+C,IAA/C,CAArB,KAA8E,OAA5F;AACA,QAAM,QAAQ,UAAU,UAAV,CAAqB,mBAAmB,QAAQ,KAA3B,EAAkC,WAAlC,EAA+C,IAA/C,CAArB,KAA8E,OAA5F;;AAEA,QAAI,YAAY,KAAK,CAArB;AACA,QAAI,YAAY,KAAK,CAArB;;AAEA,WAAO,EAAP,GAAY,CAAZ;AACA,WAAO,EAAP,GAAY,CAAZ;AACA,WAAO,MAAP,GAAgB,KAAhB;;AAEA,QAAI,MAAM,GAAV,EAAe;AACb,kBAAY,KAAK,GAAL,CAAS,KAAK,GAAL,CAAS,MAAM,GAAN,GAAe,OAAO,GAA/B,EAAuC,KAAK,CAA5C,CAAT,EAAyD,MAAM,GAAN,GAAe,OAAO,GAA/E,CAAZ;AACD,KAFD,MAGK,IAAI,MAAM,MAAV,EAAkB;AACrB,kBAAY,KAAK,GAAL,CAAS,KAAK,GAAL,CAAS,MAAM,MAAN,GAAe,OAAO,MAA/B,EAAuC,KAAK,CAA5C,CAAT,EAAyD,MAAM,MAAN,GAAe,OAAO,MAA/E,CAAZ;AACD;AACD,QAAI,MAAM,IAAV,EAAgB;AACd,kBAAY,KAAK,GAAL,CAAS,KAAK,GAAL,CAAS,MAAM,IAAN,GAAe,OAAO,IAA/B,EAAuC,KAAK,CAA5C,CAAT,EAAyD,MAAM,IAAN,GAAe,OAAO,IAA/E,CAAZ;AACD,KAFD,MAGK,IAAI,MAAM,KAAV,EAAiB;AACpB,kBAAY,KAAK,GAAL,CAAS,KAAK,GAAL,CAAS,MAAM,KAAN,GAAe,OAAO,KAA/B,EAAuC,KAAK,CAA5C,CAAT,EAAyD,MAAM,KAAN,GAAe,OAAO,KAA/E,CAAZ;AACD;;AAED,WAAO,EAAP,GAAY,YAAY,KAAK,CAA7B;AACA,WAAO,EAAP,GAAY,YAAY,KAAK,CAA7B;;AAEA,WAAO,OAAP,GAAiB,OAAO,SAAP,KAAqB,SAArB,IAAkC,OAAO,SAAP,KAAqB,SAAxE;AACA,WAAO,MAAP,GAAgB,CAAC,EAAE,OAAO,EAAP,IAAa,OAAO,EAAtB,CAAjB;;AAEA,WAAO,SAAP,GAAmB,SAAnB;AACA,WAAO,SAAP,GAAmB,SAAnB;AACD,GArEmB;;AAuEpB,gBAAc,6BAAoD;AAAA,QAAxC,IAAwC,SAAxC,IAAwC;AAAA,QAAlC,MAAkC,SAAlC,MAAkC;AAAA,QAA1B,MAA0B,SAA1B,MAA0B;AAAA,QAAlB,KAAkB,SAAlB,KAAkB;AAAA,QAAX,OAAW,SAAX,OAAW;;AAChE,QAAI,WAAW,QAAQ,OAAnB,IACG,EAAE,UAAU,OAAV,IAAqB,OAAO,MAA9B,CADP,EAC8C;;AAE5C,UAAI,OAAO,MAAX,EAAmB;AACjB,aAAK,CAAL,IAAU,OAAO,EAAjB;AACA,aAAK,CAAL,IAAU,OAAO,EAAjB;AACA,eAAO,CAAP,IAAY,OAAO,EAAnB;AACA,eAAO,CAAP,IAAY,OAAO,EAAnB;;AAEA,eAAO;AACL,cAAI,OAAO,EADN;AAEL,cAAI,OAAO;AAFN,SAAP;AAID;AACF;AACF,GAvFmB;;AAyFpB,kBAzFoB;AA0FpB,kBA1FoB;AA2FpB;AA3FoB,CAAtB;;AA8FA,UAAU,aAAV,GAA0B,aAA1B;AACA,UAAU,KAAV,CAAgB,IAAhB,CAAqB,eAArB;;AAEA,eAAe,SAAf,CAAyB,aAAzB,GAAyC,cAAc,QAAvD;AACA,OAAO,QAAP,CAAgB,aAAhB,GAAyC,cAAc,QAAvD;;AAEA,OAAO,OAAP,GAAiB,aAAjB;;;;;AC1HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,IAAM,YAAiB,QAAQ,SAAR,CAAvB;AACA,IAAM,gBAAiB,QAAQ,iBAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,UAAR,CAAvB;AACA,IAAM,YAAiB,QAAQ,eAAR,CAAvB;AACA,IAAM,iBAAiB,QAAQ,mBAAR,CAAvB;AACA,IAAM,SAAiB,QAAQ,mBAAR,CAAvB;;AAEA,IAAM,QAAQ,EAAE,OAAO,CAAC,QAAV,EAAoB,QAAQ,CAAC,QAA7B,EAAd;AACA,IAAM,QAAQ,EAAE,OAAO,CAAC,QAAV,EAAoB,QAAQ,CAAC,QAA7B,EAAd;;AAEA,IAAM,eAAe;AACnB,YAAU;AACR,aAAS,KADD;AAER,aAAS,KAFD;AAGR,SAAK,IAHG;AAIR,SAAK;AAJG,GADS;;AAQnB,aAAW,yBAA2B;AAAA,QAAf,WAAe,QAAf,WAAe;;AACpC,WAAO,YAAY,WAAnB;AACD,GAVkB;;AAYnB,OAAK,aAAU,GAAV,EAAe;AAAA,QACV,WADU,GACe,GADf,CACV,WADU;AAAA,QACG,OADH,GACe,GADf,CACG,OADH;;AAElB,QAAM,QAAQ,YAAY,QAAZ,CAAqB,WAArB,IAAoC,YAAY,QAAZ,CAAqB,KAAvE;;AAEA,QAAI,CAAC,YAAY,WAAZ,EAAD,IAA8B,CAAC,KAAnC,EAA0C;AACxC;AACD;;AAED,QAAM,OAAO,UAAU,UAAV,CAAqB,YAAY,WAAZ,CAAwB,QAA7C,CAAb;;AAEA,QAAM,UAAU,UAAU,UAAV,CAAqB,cAAc,kBAAd,CAAiC,QAAQ,GAAzC,EAA8C,WAA9C,CAArB,KAAoF,KAApG;AACA,QAAM,UAAU,UAAU,UAAV,CAAqB,cAAc,kBAAd,CAAiC,QAAQ,GAAzC,EAA8C,WAA9C,CAArB,KAAoF,KAApG;;AAEA,QAAI,OAAJ,GAAc;AACZ,eAAS,QAAQ,OADL;AAEZ,eAAS,QAAQ,OAFL;AAGZ,aAAO,MAAM,MAAN,CAAa,EAAb,EAAiB,cAAc,OAA/B,CAHK;AAIZ,aAAO,MAAM,MAAN,CAAa,EAAb,EAAiB,cAAc,OAA/B;AAJK,KAAd;;AAOA,QAAI,MAAM,GAAV,EAAe;AACb,UAAI,OAAJ,CAAY,KAAZ,CAAkB,GAAlB,GAAwB,KAAK,MAAL,GAAc,QAAQ,MAA9C;AACA,UAAI,OAAJ,CAAY,KAAZ,CAAkB,GAAlB,GAAwB,KAAK,MAAL,GAAc,QAAQ,MAA9C;AACD,KAHD,MAIK,IAAI,MAAM,MAAV,EAAkB;AACrB,UAAI,OAAJ,CAAY,KAAZ,CAAkB,MAAlB,GAA2B,KAAK,GAAL,GAAW,QAAQ,MAA9C;AACA,UAAI,OAAJ,CAAY,KAAZ,CAAkB,MAAlB,GAA2B,KAAK,GAAL,GAAW,QAAQ,MAA9C;AACD;AACD,QAAI,MAAM,IAAV,EAAgB;AACd,UAAI,OAAJ,CAAY,KAAZ,CAAkB,IAAlB,GAAyB,KAAK,KAAL,GAAa,QAAQ,KAA9C;AACA,UAAI,OAAJ,CAAY,KAAZ,CAAkB,IAAlB,GAAyB,KAAK,KAAL,GAAa,QAAQ,KAA9C;AACD,KAHD,MAIK,IAAI,MAAM,KAAV,EAAiB;AACpB,UAAI,OAAJ,CAAY,KAAZ,CAAkB,KAAlB,GAA0B,KAAK,IAAL,GAAY,QAAQ,KAA9C;AACA,UAAI,OAAJ,CAAY,KAAZ,CAAkB,KAAlB,GAA0B,KAAK,IAAL,GAAY,QAAQ,KAA9C;AACD;;AAED,kBAAc,GAAd,CAAkB,GAAlB;AACD,GAlDkB;;AAoDnB,gBAAc,cAAc;AApDT,CAArB;;AAuDA,UAAU,YAAV,GAAyB,YAAzB;AACA,UAAU,KAAV,CAAgB,IAAhB,CAAqB,cAArB;;AAEA,eAAe,SAAf,CAAyB,YAAzB,GAAwC,aAAa,QAArD;AACA,OAAO,QAAP,CAAgB,YAAhB,GAAwC,aAAa,QAArD;;AAEA,OAAO,OAAP,GAAiB,YAAjB;;;;;AClFA,IAAM,YAAiB,QAAQ,SAAR,CAAvB;AACA,IAAM,WAAiB,QAAQ,aAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,UAAR,CAAvB;AACA,IAAM,iBAAiB,QAAQ,mBAAR,CAAvB;;AAEA,IAAM,OAAO;AACX,YAAU;AACR,aAAS,KADD;AAER,aAAS,KAFD;AAGR,WAAS,QAHD;AAIR,aAAS,IAJD;AAKR,aAAS,IALD;;AAOR,oBAAgB;AAPR,GADC;;AAWX,aAAW,yBAA8E;AAAA,QAAlE,WAAkE,QAAlE,WAAkE;AAAA,QAArD,YAAqD,QAArD,YAAqD;AAAA,QAAvC,OAAuC,QAAvC,OAAuC;AAAA,QAA9B,IAA8B,QAA9B,IAA8B;AAAA,QAAxB,WAAwB,QAAxB,WAAwB;AAAA,QAAX,OAAW,QAAX,OAAW;;AACvF,QAAM,UAAU,EAAhB;AACA,QAAM,gBAAgB,MAAM,QAAN,CAAe,MAAM,eAAN,CAAsB,QAAQ,MAA9B,CAAf,CAAtB;AACA,QAAM,SAAS,iBAAiB,MAAM,WAAN,CAAkB,YAAlB,EAAgC,OAAhC,EAAyC,YAAY,QAAZ,CAAqB,IAA9D,CAAhC;AACA,cAAU,WAAW,aAAa,OAAb,CAAqB,YAAY,QAAZ,CAAqB,IAA1C,EAAgD,IAA3D,IAAmE,EAA7E;;AAEA,QAAI,mBAAJ;;AAEA,QAAI,QAAQ,MAAR,KAAmB,aAAvB,EAAsC;AACpC,mBAAa;AACX,WAAG,YAAY,WAAZ,CAAwB,IAAxB,CAA6B,CAA7B,GAAiC,OAAO,CADhC;AAEX,WAAG,YAAY,WAAZ,CAAwB,IAAxB,CAA6B,CAA7B,GAAiC,OAAO;AAFhC,OAAb;AAID,KALD,MAMM;AACJ,UAAM,aAAa,MAAM,eAAN,CAAsB,QAAQ,MAA9B,EAAsC,YAAtC,EAAoD,OAApD,EAA6D,CAAC,WAAD,CAA7D,CAAnB;;AAEA,mBAAa,MAAM,QAAN,CAAe,UAAf,KAA8B,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EAA3C;AACD;;AAED,QAAI,QAAQ,QAAQ,cAAhB,IAAkC,QAAQ,cAAR,CAAuB,MAA7D,EAAqE;AACnE,2BAA6C,QAAQ,cAArD,kHAAqE;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,YAArD,SAAqD,SAAxD,CAAwD;AAAA,YAAvC,SAAuC,SAA1C,CAA0C;;AACnE,gBAAQ,IAAR,CAAa;AACX,aAAG,YAAY,IAAZ,GAAoB,KAAK,KAAL,GAAc,SAAlC,GAA+C,WAAW,CADlD;AAEX,aAAG,YAAY,GAAZ,GAAoB,KAAK,MAAL,GAAc,SAAlC,GAA+C,WAAW;AAFlD,SAAb;AAID;AACF,KAPD,MAQK;AACH,cAAQ,IAAR,CAAa,UAAb;AACD;;AAED,WAAO,OAAP;AACD,GA5CU;;AA8CX,OAAK,oBAAyE;AAAA,QAA7D,WAA6D,SAA7D,WAA6D;AAAA,QAAhD,UAAgD,SAAhD,UAAgD;AAAA,QAApC,MAAoC,SAApC,MAAoC;AAAA,QAA5B,OAA4B,SAA5B,OAA4B;AAAA,QAAX,OAAW,SAAnB,MAAmB;;AAC5E,QAAM,UAAU,EAAhB;AACA,QAAI,eAAJ;AACA,QAAI,aAAJ;AACA,QAAI,UAAJ;;AAEA,QAAI,OAAO,WAAX,EAAwB;AACtB,aAAO,EAAE,GAAG,OAAO,CAAZ,EAAe,GAAG,OAAO,CAAzB,EAAP;AACD,KAFD,MAGK;AACH,UAAM,SAAS,MAAM,WAAN,CAAkB,YAAY,MAA9B,EAAsC,YAAY,OAAlD,EAA2D,YAAY,QAAZ,CAAqB,IAAhF,CAAf;;AAEA,aAAO,MAAM,MAAN,CAAa,EAAb,EAAiB,UAAjB,CAAP;;AAEA,WAAK,CAAL,IAAU,OAAO,CAAjB;AACA,WAAK,CAAL,IAAU,OAAO,CAAjB;AACD;;AAED,WAAO,KAAP,GAAe,KAAK,CAApB;AACA,WAAO,KAAP,GAAe,KAAK,CAApB;;AAEA,QAAI,MAAM,QAAQ,OAAR,GAAiB,QAAQ,OAAR,CAAgB,MAAjC,GAA0C,CAApD;;AAEA,0BAAyC,OAAzC,yHAAkD;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,UAAlC,OAAkC,SAArC,CAAqC;AAAA,UAAtB,OAAsB,SAAzB,CAAyB;;AAChD,UAAM,YAAY,KAAK,CAAL,GAAS,OAA3B;AACA,UAAM,YAAY,KAAK,CAAL,GAAS,OAA3B;;AAEA,4BAAyB,QAAQ,OAAjC,yHAA0C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,YAA/B,UAA+B;;AACxC,YAAI,MAAM,EAAN,CAAS,QAAT,CAAkB,UAAlB,CAAJ,EAAmC;AACjC,mBAAS,WAAW,SAAX,EAAsB,SAAtB,EAAiC,WAAjC,CAAT;AACD,SAFD,MAGK;AACH,mBAAS,UAAT;AACD;;AAED,YAAI,CAAC,MAAL,EAAa;AAAE;AAAW;;AAE1B,gBAAQ,IAAR,CAAa;AACX,aAAG,MAAM,EAAN,CAAS,MAAT,CAAgB,OAAO,CAAvB,IAA6B,OAAO,CAAP,GAAW,OAAxC,GAAmD,SAD3C;AAEX,aAAG,MAAM,EAAN,CAAS,MAAT,CAAgB,OAAO,CAAvB,IAA6B,OAAO,CAAP,GAAW,OAAxC,GAAmD,SAF3C;;AAIX,iBAAO,MAAM,EAAN,CAAS,MAAT,CAAgB,OAAO,KAAvB,IAA+B,OAAO,KAAtC,GAA6C,QAAQ;AAJjD,SAAb;AAMD;AACF;;AAED,QAAM,UAAU;AACd,cAAQ,IADM;AAEd,eAAS,KAFK;AAGd,gBAAU,CAHI;AAId,aAAO,CAJO;AAKd,UAAI,CALU;AAMd,UAAI;AANU,KAAhB;;AASA,SAAK,IAAI,CAAJ,EAAO,MAAM,QAAQ,MAA1B,EAAkC,IAAI,GAAtC,EAA2C,GAA3C,EAAgD;AAC9C,eAAS,QAAQ,CAAR,CAAT;;AAEA,UAAM,QAAQ,OAAO,KAArB;AACA,UAAM,KAAK,OAAO,CAAP,GAAW,KAAK,CAA3B;AACA,UAAM,KAAK,OAAO,CAAP,GAAW,KAAK,CAA3B;AACA,UAAM,WAAW,MAAM,KAAN,CAAY,EAAZ,EAAgB,EAAhB,CAAjB;AACA,UAAI,UAAU,YAAY,KAA1B;;AAEA;AACA;AACA,UAAI,UAAU,QAAV,IAAsB,QAAQ,OAA9B,IAAyC,QAAQ,KAAR,KAAkB,QAA/D,EAAyE;AACvE,kBAAU,KAAV;AACD;;AAED,UAAI,CAAC,QAAQ,MAAT,KAAoB;AACpB;AADoB,QAEjB,QAAQ,OAAR,IAAmB,UAAU;AAChC;AADG,QAED,WAAW,KAAX,GAAmB,QAAQ,QAAR,GAAmB,QAAQ;AAChD;AAHG,QAIA,UAAU,QAAV,IAAsB,QAAQ,KAAR,KAAkB,QAAzC;AACF;AACC,iBAAW,QAAQ,QARA;AASpB;AACG,OAAC,QAAQ,OAAT,IAAoB,WAAW,QAAQ,QAV1C,CAAJ,EAU0D;;AAExD,gBAAQ,MAAR,GAAiB,MAAjB;AACA,gBAAQ,QAAR,GAAmB,QAAnB;AACA,gBAAQ,KAAR,GAAgB,KAAhB;AACA,gBAAQ,OAAR,GAAkB,OAAlB;AACA,gBAAQ,EAAR,GAAa,EAAb;AACA,gBAAQ,EAAR,GAAa,EAAb;;AAEA,eAAO,KAAP,GAAe,KAAf;AACD;AACF;;AAED,QAAI,oBAAJ;;AAEA,QAAI,QAAQ,MAAZ,EAAoB;AAClB,oBAAe,OAAO,SAAP,KAAqB,QAAQ,MAAR,CAAe,CAApC,IAAyC,OAAO,SAAP,KAAqB,QAAQ,MAAR,CAAe,CAA5F;;AAEA,aAAO,SAAP,GAAmB,QAAQ,MAAR,CAAe,CAAlC;AACA,aAAO,SAAP,GAAmB,QAAQ,MAAR,CAAe,CAAlC;AACD,KALD,MAMK;AACH,oBAAc,IAAd;;AAEA,aAAO,SAAP,GAAmB,GAAnB;AACA,aAAO,SAAP,GAAmB,GAAnB;AACD;;AAED,WAAO,EAAP,GAAY,QAAQ,EAApB;AACA,WAAO,EAAP,GAAY,QAAQ,EAApB;;AAEA,WAAO,OAAP,GAAkB,eAAgB,QAAQ,OAAR,IAAmB,CAAC,OAAO,MAA7D;AACA,WAAO,MAAP,GAAgB,QAAQ,OAAxB;AACD,GA/JU;;AAiKX,gBAAc,6BAAoD;AAAA,QAAxC,IAAwC,SAAxC,IAAwC;AAAA,QAAlC,MAAkC,SAAlC,MAAkC;AAAA,QAA1B,MAA0B,SAA1B,MAA0B;AAAA,QAAlB,KAAkB,SAAlB,KAAkB;AAAA,QAAX,OAAW,SAAX,OAAW;;AAChE,QAAM,iBAAiB,WAAW,QAAQ,cAA1C;;AAEA,QAAI,WAAW,QAAQ,OAAnB,IACG,EAAE,UAAU,OAAV,IAAqB,cAArB,IAAuC,eAAe,MAAxD,CADP,EACwE;;AAEtE,UAAI,OAAO,MAAX,EAAmB;AACjB,aAAK,CAAL,IAAU,OAAO,EAAjB;AACA,aAAK,CAAL,IAAU,OAAO,EAAjB;AACA,eAAO,CAAP,IAAY,OAAO,EAAnB;AACA,eAAO,CAAP,IAAY,OAAO,EAAnB;AACD;;AAED,aAAO;AACL,eAAS,OAAO,KADX;AAEL,gBAAS,OAAO,MAFX;AAGL,WAAS,OAAO,SAHX;AAIL,WAAS,OAAO,SAJX;AAKL,eAAS,OAAO,KALX;AAML,eAAS,OAAO,KANX;AAOL,YAAS,OAAO,EAPX;AAQL,YAAS,OAAO;AARX,OAAP;AAUD;AACF;AAzLU,CAAb;;AA4LA,SAAS,cAAT,GAA0B,UAAU,IAAV,EAAgB;AACxC,SAAO,UAAU,CAAV,EAAa,CAAb,EAAgB;AACrB,QAAM,SAAS,KAAK,MAAL,IAAe;AAC5B,YAAQ,CAAC,QADmB;AAE5B,aAAS,QAFmB;AAG5B,WAAQ,CAAC,QAHmB;AAI5B,cAAS;AAJmB,KAA9B;AAMA,QAAI,UAAU,CAAd;AACA,QAAI,UAAU,CAAd;;AAEA,QAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,KAAK,MAArB,CAAJ,EAAkC;AAChC,gBAAU,KAAK,MAAL,CAAY,CAAtB;AACA,gBAAU,KAAK,MAAL,CAAY,CAAtB;AACD;;AAED,QAAM,QAAQ,KAAK,KAAL,CAAW,CAAC,IAAI,OAAL,IAAgB,KAAK,CAAhC,CAAd;AACA,QAAM,QAAQ,KAAK,KAAL,CAAW,CAAC,IAAI,OAAL,IAAgB,KAAK,CAAhC,CAAd;;AAEA,QAAM,OAAO,KAAK,GAAL,CAAS,OAAO,IAAhB,EAAsB,KAAK,GAAL,CAAS,OAAO,KAAhB,EAAwB,QAAQ,KAAK,CAAb,GAAiB,OAAzC,CAAtB,CAAb;AACA,QAAM,OAAO,KAAK,GAAL,CAAS,OAAO,GAAhB,EAAsB,KAAK,GAAL,CAAS,OAAO,MAAhB,EAAwB,QAAQ,KAAK,CAAb,GAAiB,OAAzC,CAAtB,CAAb;;AAEA,WAAO;AACL,SAAG,IADE;AAEL,SAAG,IAFE;AAGL,aAAO,KAAK;AAHP,KAAP;AAKD,GA1BD;AA2BD,CA5BD;;AA8BA,UAAU,IAAV,GAAiB,IAAjB;AACA,UAAU,KAAV,CAAgB,IAAhB,CAAqB,MAArB;;AAEA,eAAe,SAAf,CAAyB,IAAzB,GAAgC,KAAK,QAArC;;AAEA,OAAO,OAAP,GAAiB,IAAjB;;;;;ACpOA;AACA;;AAEA,IAAM,YAAiB,QAAQ,SAAR,CAAvB;AACA,IAAM,OAAiB,QAAQ,QAAR,CAAvB;AACA,IAAM,iBAAiB,QAAQ,mBAAR,CAAvB;AACA,IAAM,SAAiB,QAAQ,mBAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,WAAR,CAAvB;;AAEA,IAAM,WAAW;AACf,YAAU;AACR,aAAS,KADD;AAER,aAAS,KAFD;AAGR,WAAS,QAHD;AAIR,aAAS,IAJD;AAKR,aAAS;AALD,GADK;;AASf,aAAW,mBAAU,GAAV,EAAe;AAAA,QAChB,WADgB,GACS,GADT,CAChB,WADgB;AAAA,QACH,OADG,GACS,GADT,CACH,OADG;;AAExB,QAAM,QAAQ,YAAY,QAAZ,CAAqB,KAAnC;;AAEA,QAAI,CAAC,KAAL,EAAY;AAAE;AAAS;;AAEvB,QAAI,OAAJ,GAAc;AACZ,sBAAgB,CAAC;AACf,WAAG,MAAM,IAAN,GAAY,CAAZ,GAAgB,CADJ;AAEf,WAAG,MAAM,GAAN,GAAY,CAAZ,GAAgB;AAFJ,OAAD,CADJ;AAKZ,cAAQ,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EALI;AAMZ,cAAQ,MANI;AAOZ,aAAO,QAAQ;AAPH,KAAd;;AAUA,QAAM,UAAU,KAAK,SAAL,CAAe,GAAf,CAAhB;AACA,QAAI,OAAJ,GAAc,OAAd;;AAEA,WAAO,OAAP;AACD,GA7Bc;;AA+Bf,OAAK,aAAU,GAAV,EAAe;AAAA,QACV,WADU,GACmC,GADnC,CACV,WADU;AAAA,QACG,OADH,GACmC,GADnC,CACG,OADH;AAAA,QACY,MADZ,GACmC,GADnC,CACY,MADZ;AAAA,QACoB,UADpB,GACmC,GADnC,CACoB,UADpB;;AAElB,QAAM,OAAO,MAAM,MAAN,CAAa,EAAb,EAAiB,UAAjB,CAAb;AACA,QAAM,YAAY,KAAK,CAAL,GAAS,OAAO,CAAP,EAAU,CAArC;AACA,QAAM,YAAY,KAAK,CAAL,GAAS,OAAO,CAAP,EAAU,CAArC;;AAEA,QAAI,OAAJ,GAAc,MAAM,MAAN,CAAa,EAAb,EAAiB,OAAjB,CAAd;AACA,QAAI,OAAJ,CAAY,OAAZ,GAAsB,EAAtB;;AAEA,yBAAyB,QAAQ,OAAjC,kHAA0C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAA/B,UAA+B;;AACxC,UAAI,eAAJ;;AAEA,UAAI,MAAM,EAAN,CAAS,QAAT,CAAkB,UAAlB,CAAJ,EAAmC;AACjC,iBAAS,WAAW,SAAX,EAAsB,SAAtB,EAAiC,WAAjC,CAAT;AACD,OAFD,MAGK;AACH,iBAAS,UAAT;AACD;;AAED,UAAI,CAAC,MAAL,EAAa;AAAE;AAAW;;AAE1B,UAAI,WAAW,MAAX,IAAqB,YAAY,MAArC,EAA6C;AAC3C,eAAO,CAAP,GAAW,OAAO,KAAlB;AACA,eAAO,CAAP,GAAW,OAAO,MAAlB;AACD;;AAED,UAAI,OAAJ,CAAY,OAAZ,CAAoB,IAApB,CAAyB,MAAzB;AACD;;AAED,SAAK,GAAL,CAAS,GAAT;AACD,GA7Dc;;AA+Df,gBAAc,sBAAU,GAAV,EAAe;AAAA,QACnB,OADmB,GACP,GADO,CACnB,OADmB;;;AAG3B,QAAI,OAAJ,GAAc,MAAM,MAAN,CAAa,EAAb,EAAiB,OAAjB,CAAd;AACA,QAAI,OAAJ,CAAY,OAAZ,GAAsB,QAAQ,OAA9B;AACA,QAAI,OAAJ,CAAY,cAAZ,GAA6B,CAAC,IAAD,CAA7B;;AAEA,SAAK,YAAL,CAAkB,GAAlB;AACD;AAvEc,CAAjB;;AA0EA,UAAU,QAAV,GAAqB,QAArB;AACA,UAAU,KAAV,CAAgB,IAAhB,CAAqB,UAArB;;AAEA,eAAe,SAAf,CAAyB,QAAzB,GAAoC,SAAS,QAA7C;AACA,OAAO,QAAP,CAAgB,QAAhB,GAAoC,SAAS,QAA7C;;AAEA,OAAO,OAAP,GAAiB,QAAjB;;;;;;;ACzFA,IAAM,eAAe,QAAQ,uBAAR,CAArB;;AAEA,OAAO,OAAP;AACE,wBAAa,IAAb,EAAmB,OAAnB,EAA4B,KAA5B,EAAmC,WAAnC,EAAgD,WAAhD,EAA6D;AAAA;;AAC3D,iBAAa,aAAb,CAA2B,IAA3B,EAAiC,KAAjC;;AAEA,QAAI,UAAU,OAAd,EAAuB;AACrB,mBAAa,aAAb,CAA2B,IAA3B,EAAiC,OAAjC;AACD;;AAED,SAAK,WAAL,GAAmB,WAAnB;;AAEA,SAAK,SAAL,GAAqB,IAAI,IAAJ,GAAW,OAAX,EAArB;AACA,SAAK,aAAL,GAAqB,KAArB;AACA,SAAK,IAAL,GAAqB,IAArB;AACA,SAAK,SAAL,GAAqB,aAAa,YAAb,CAA0B,OAA1B,CAArB;AACA,SAAK,WAAL,GAAqB,aAAa,cAAb,CAA4B,OAA5B,CAArB;AACA,SAAK,MAAL,GAAqB,WAArB;AACA,SAAK,aAAL,GAAqB,IAArB;;AAEA,QAAI,SAAS,KAAb,EAAoB;AAClB,UAAM,eAAe,YAAY,eAAZ,CAA4B,OAA5B,CAArB;AACA,WAAK,EAAL,GAAU,KAAK,SAAL,GAAiB,YAAY,SAAZ,CAAsB,YAAtB,CAA3B;;AAEA,UAAM,WAAW,KAAK,SAAL,GAAiB,YAAY,OAA9C;;AAEA,WAAK,MAAL,GAAc,CAAC,EAAE,YAAY,OAAZ,IACZ,YAAY,OAAZ,CAAoB,IAApB,KAA6B,WADjB,IAEZ,YAAY,OAAZ,CAAoB,MAApB,KAA+B,KAAK,MAFxB,IAGZ,WAAW,GAHD,CAAf;AAID,KAVD,MAWK,IAAI,SAAS,WAAb,EAA0B;AAC7B,WAAK,EAAL,GAAU,QAAQ,SAAR,GAAoB,YAAY,OAA1C;AACD;AACF;;AAhCH,yBAkCE,cAlCF,iCAkC8C;AAAA,QAAvB,OAAuB,QAA1B,CAA0B;AAAA,QAAX,OAAW,QAAd,CAAc;;AAC1C,SAAK,KAAL,IAAgB,OAAhB;AACA,SAAK,KAAL,IAAgB,OAAhB;AACA,SAAK,OAAL,IAAgB,OAAhB;AACA,SAAK,OAAL,IAAgB,OAAhB;;AAEA,WAAO,IAAP;AACD,GAzCH;;AAAA,yBA2CE,SA3CF,6BA2CyC;AAAA,QAAvB,OAAuB,SAA1B,CAA0B;AAAA,QAAX,OAAW,SAAd,CAAc;;AACrC,SAAK,KAAL,IAAgB,OAAhB;AACA,SAAK,KAAL,IAAgB,OAAhB;AACA,SAAK,OAAL,IAAgB,OAAhB;AACA,SAAK,OAAL,IAAgB,OAAhB;;AAEA,WAAO,IAAP;AACD,GAlDH;;AAAA,yBAoDE,cApDF,6BAoDoB;AAChB,SAAK,aAAL,CAAmB,cAAnB;AACD,GAtDH;;AAAA,yBAwDE,eAxDF,8BAwDqB;AACjB,SAAK,kBAAL,GAA0B,IAA1B;AACD,GA1DH;;AAAA,yBA4DE,wBA5DF,uCA4D8B;AAC1B,SAAK,2BAAL,GAAmC,KAAK,kBAAL,GAA0B,IAA7D;AACD,GA9DH;;AAAA;AAAA;;;;;ACFA,IAAM,eAAe,QAAQ,gBAAR,CAArB;AACA,IAAM,cAAe,QAAQ,gBAAR,CAArB;AACA,IAAM,QAAe,QAAQ,UAAR,CAArB;AACA,IAAM,UAAe,QAAQ,kBAAR,CAArB;AACA,IAAM,WAAe,QAAQ,mBAAR,CAArB;AACA,IAAM,UAAe,QAAQ,kBAAR,EAA4B,GAA5B,EAArB;;eACqB,QAAQ,cAAR,C;IAAb,M,YAAA,M;;AAER,IAAM,gBAAgB,CAAE,MAAF,EAAU,IAAV,EAAgB,QAAhB,CAAtB;AACA,IAAM,eAAgB,CAAE,MAAF,EAAU,IAAV,EAAgB,QAAhB,CAAtB;;AAEA,IAAM,gBAAgB;AACpB,4BADoB;AAEpB,YAFoB;AAGpB,0CAHoB;AAIpB,kBAJoB;AAKpB,YAAU;AACR,kBAAc,GADN;AAER,gBAAc,IAFN;AAGR,eAAc,IAHN;AAIR,YAAc,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX;AAJN,GALU;AAWpB,SAAO,CACL,MADK,EAEL,MAFK,EAGL,IAHK,EAIL,QAJK,EAKL,KALK,EAML,WANK,EAOL,MAPK;AAXa,CAAtB;;AAsBA,SAAS,IAAT,CAAe,GAAf,EAAoB;AAAA,MAEhB,WAFgB,GAMd,GANc,CAEhB,WAFgB;AAAA,MAEH,OAFG,GAMd,GANc,CAEH,OAFG;AAAA,MAEM,KAFN,GAMd,GANc,CAEM,KAFN;AAAA,MAEa,WAFb,GAMd,GANc,CAEa,WAFb;AAAA,kBAMd,GANc,CAGhB,IAHgB;AAAA,MAGhB,IAHgB,6BAGT,IAAI,YAAJ,CAAiB,IAHR;AAAA,qBAMd,GANc,CAIhB,OAJgB;AAAA,MAIhB,OAJgB,gCAIN,oBAAoB,GAApB,CAJM;AAAA,0BAMd,GANc,CAKhB,YALgB;AAAA,MAKhB,YALgB,qCAKD,IAAI,YAAJ,CAAiB,IAAjB,EAAuB,OAAvB,EAAgC,KAAhC,EAAuC,WAAvC,EAAoD,WAApD,CALC;;;AAQlB,MAAM,YAAY;AAChB,4BADgB;AAEhB,oBAFgB;AAGhB,gBAHgB;AAIhB,4BAJgB;AAKhB,oBALgB;AAMhB,cANgB;AAOhB;AAPgB,GAAlB;;AAUA,OAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,QAAQ,MAA5B,EAAoC,GAApC,EAAyC;AACvC,QAAM,SAAS,QAAQ,CAAR,CAAf;;AAEA,SAAK,IAAM,IAAX,IAAmB,OAAO,KAAP,IAAgB,EAAnC,EAAuC;AACrC,mBAAa,IAAb,IAAqB,OAAO,KAAP,CAAa,IAAb,CAArB;AACD;;AAED,QAAM,SAAS,MAAM,WAAN,CAAkB,OAAO,SAAzB,EAAoC,OAAO,OAA3C,CAAf;;AAEA,iBAAa,cAAb,CAA4B,MAA5B;AACA,iBAAa,SAAb,GAAyB,OAAO,SAAhC;AACA,iBAAa,aAAb,GAA6B,OAAO,OAApC;;AAEA,WAAO,SAAP,CAAiB,IAAjB,CAAsB,YAAtB;;AAEA,iBAAa,SAAb,CAAuB,MAAvB;;AAEA,QAAI,aAAa,2BAAb,IACI,aAAa,kBAAb,IACI,IAAI,CAAL,GAAU,QAAQ,MADrB,IAC+B,QAAQ,IAAI,CAAZ,EAAe,OAAf,KAA2B,aAAa,aAF/E,EAE+F;AAC7F;AACD;AACF;;AAED,UAAQ,IAAR,CAAa,OAAb,EAAsB,SAAtB;;AAEA,MAAI,SAAS,KAAb,EAAoB;AAClB;AACA;AACA,QAAM,UAAU,aAAa,MAAb,GACZ,KAAK;AACL,8BADK,EACQ,gBADR,EACiB,YADjB,EACwB,wBADxB;AAEL,YAAM;AAFD,KAAL,CADY,GAKZ,YALJ;;AAOA,gBAAY,OAAZ,GAAsB,OAAtB;AACA,gBAAY,OAAZ,GAAsB,QAAQ,SAA9B;AACD;;AAED,SAAO,YAAP;AACD;;AAED,SAAS,mBAAT,OAAkF;AAAA,MAAlD,WAAkD,QAAlD,WAAkD;AAAA,MAArC,OAAqC,QAArC,OAAqC;AAAA,MAA5B,KAA4B,QAA5B,KAA4B;AAAA,MAArB,WAAqB,QAArB,WAAqB;AAAA,MAAR,IAAQ,QAAR,IAAQ;;AAChF,MAAM,eAAe,YAAY,eAAZ,CAA4B,OAA5B,CAArB;;AAEA;AACA,MAAI,SAAS,KAAT,KAAmB,YAAY;AAC/B;AADmB,KAEhB,EAAE,YAAY,WAAZ,CAAwB,YAAxB,KAAyC,YAAY,WAAZ,CAAwB,YAAxB,MAA0C,WAArF,CAFH,CAAJ,EAE2G;AACzG,WAAO,EAAP;AACD;;AAED,MAAM,OAAO,MAAM,OAAN,CAAc,WAAd,CAAb;AACA,MAAM,YAAY;AAChB,4BADgB;AAEhB,oBAFgB;AAGhB,gBAHgB;AAIhB,4BAJgB;AAKhB,cALgB;AAMhB,cANgB;AAOhB,aAAS,EAPO;AAQhB,aAAS;AARO,GAAlB;;AAWA,uBAAsB,IAAtB,kHAA4B;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,QAAjB,OAAiB;;AAC1B,cAAU,OAAV,GAAoB,OAApB;;AAEA,YAAQ,IAAR,CAAa,iBAAb,EAAgC,SAAhC;AACD;;AAED,MAAI,SAAS,MAAb,EAAqB;AACnB,cAAU,OAAV,GAAoB,OAAO,UAAU,OAAjB,EAA0B;AAAA,aAC5C,OAAO,SAAP,CAAiB,OAAjB,CAAyB,YAAzB,KAA0C,YAAY,UAAZ,CAAuB,YAAvB,EAAqC,QADnC;AAAA,KAA1B,CAApB;AAED;;AAED,SAAO,UAAU,OAAjB;AACD;;AAED,YAAY,OAAZ,CAAoB,EAApB,CAAuB,qBAAvB,EAA8C,iBAAyC;AAAA,MAA7B,WAA6B,SAA7B,WAA6B;AAAA,MAAhB,YAAgB,SAAhB,YAAgB;;AACrF,cAAY,UAAZ,CAAuB,YAAvB,IAAuC,EAAE,UAAU,QAAZ,EAAsB,SAAS,IAA/B,EAAvC;AACD,CAFD;;AAIA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,gBAAvB,EAAyC,iBAAyC;AAAA,MAA7B,WAA6B,SAA7B,WAA6B;AAAA,MAAhB,YAAgB,SAAhB,YAAgB;;AAChF,cAAY,UAAZ,CAAuB,MAAvB,CAA8B,YAA9B,EAA4C,CAA5C;AACD,CAFD;;AAIA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,MAAvB,EAA+B,iBAAuE;AAAA,MAA3D,WAA2D,SAA3D,WAA2D;AAAA,MAA9C,OAA8C,SAA9C,OAA8C;AAAA,MAArC,KAAqC,SAArC,KAAqC;AAAA,MAA9B,WAA8B,SAA9B,WAA8B;AAAA,MAAjB,aAAiB,SAAjB,aAAiB;;AACpG,MAAM,eAAe,YAAY,eAAZ,CAA4B,OAA5B,CAArB;;AAEA,MAAI,CAAC,aAAD,KAAmB,CAAC,YAAY,aAAb,IAA8B,YAAY,eAA7D,CAAJ,EAAmF;AACjF,QAAI,YAAY,aAAhB,EAA+B;AAC7B,mBAAa,YAAY,UAAZ,CAAuB,YAAvB,EAAqC,OAAlD;AACD;;AAED,SAAK;AACH,8BADG,EACU,gBADV,EACmB,YADnB,EAC0B,wBAD1B;AAEH,YAAM;AAFH,KAAL;AAID;AACF,CAbD;;AAeA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,MAAvB,EAA+B,iBAAsE;AAAA,MAA1D,WAA0D,SAA1D,WAA0D;AAAA,MAA7C,OAA6C,SAA7C,OAA6C;AAAA,MAApC,KAAoC,SAApC,KAAoC;AAAA,MAA7B,WAA6B,SAA7B,WAA6B;AAAA,MAAhB,YAAgB,SAAhB,YAAgB;;AACnG;AACA,MAAM,YAAY,QAAQ,KAAR,GAAe,MAAM,MAAN,CAAa,EAAb,EAAiB,KAAjB,CAAf,GAAyC,KAA3D;;AAEA,MAAM,QAAQ,YAAY,UAAZ,CAAuB,YAAvB,CAAd;AACA,MAAM,OAAO,MAAM,OAAN,CAAc,WAAd,CAAb;AACA,MAAM,YAAY;AAChB,4BADgB;AAEhB,oBAFgB;AAGhB,gBAHgB;AAIhB,4BAJgB;AAKhB,UAAM,MALU;AAMhB,aAAS,EANO;AAOhB,cAPgB;AAQhB,aAAS;AARO,GAAlB;;AAWA,wBAAsB,IAAtB,yHAA4B;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,QAAjB,OAAiB;;AAC1B,cAAU,OAAV,GAAoB,OAApB;;AAEA,YAAQ,IAAR,CAAa,iBAAb,EAAgC,SAAhC;AACD;;AAED,MAAI,CAAC,UAAU,OAAV,CAAkB,MAAvB,EAA+B;AAAE;AAAS;;AAE1C,MAAI,cAAc,QAAlB;;AAEA,OAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,UAAU,OAAV,CAAkB,MAAtC,EAA8C,GAA9C,EAAmD;AACjD,QAAM,SAAS,UAAU,OAAV,CAAkB,CAAlB,CAAf;AACA,QAAM,eAAe,OAAO,SAAP,CAAiB,OAAjB,CAAyB,YAA9C;;AAEA,QAAI,eAAe,WAAnB,EAAgC;AAC9B,oBAAc,YAAd;AACD;AACF;;AAED,QAAM,QAAN,GAAiB,WAAjB;AACA,QAAM,OAAN,GAAgB,WAAW,YAAY;AACrC,SAAK;AACH,8BADG;AAEH,8BAFG;AAGH,eAAS,QAAQ,KAAR,GAAe,SAAf,GAA2B,OAHjC;AAIH,aAAO,SAJJ;AAKH,YAAM;AALH,KAAL;AAOD,GARe,EAQb,WARa,CAAhB;AASD,CA9CD;;AAgDA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,IAAvB,EAA6B,iBAAkD;AAAA,MAA/C,WAA+C,SAA/C,WAA+C;AAAA,MAAlC,OAAkC,SAAlC,OAAkC;AAAA,MAAzB,KAAyB,SAAzB,KAAyB;AAAA,MAAlB,WAAkB,SAAlB,WAAkB;;AAC7E,MAAI,CAAC,YAAY,eAAjB,EAAkC;AAChC,SAAK,EAAE,wBAAF,EAAe,wBAAf,EAA4B,gBAA5B,EAAqC,YAArC,EAA4C,MAAM,KAAlD,EAAL;AACD;AACF,CAJD;;AAMA,CAAC,IAAD,EAAO,QAAP,EAAiB,OAAjB,CAAyB,UAAU,UAAV,EAAsB;AAC7C,cAAY,OAAZ,CAAoB,EAApB,CAAuB,UAAvB,EAAmC,iBAAyC;AAAA,QAA7B,WAA6B,SAA7B,WAA6B;AAAA,QAAhB,YAAgB,SAAhB,YAAgB;;AAC1E,QAAI,YAAY,UAAZ,CAAuB,YAAvB,CAAJ,EAA0C;AACxC,mBAAa,YAAY,UAAZ,CAAuB,YAAvB,EAAqC,OAAlD;AACD;AACF,GAJD;AAKD,CAND;;AAQA,SAAS,oBAAT,CAA+B,IAA/B,EAAqC;AACnC,SAAO,kBAAwD;AAAA,QAA5C,WAA4C,UAA5C,WAA4C;AAAA,QAA/B,OAA+B,UAA/B,OAA+B;AAAA,QAAtB,KAAsB,UAAtB,KAAsB;AAAA,QAAf,WAAe,UAAf,WAAe;;AAC7D,SAAK,EAAE,wBAAF,EAAe,wBAAf,EAA4B,gBAA5B,EAAqC,YAArC,EAA4C,UAA5C,EAAL;AACD,GAFD;AAGD;;AAED,KAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,cAAc,MAAlC,EAA0C,GAA1C,EAA+C;AAC7C,cAAY,OAAZ,CAAoB,EAApB,CAAuB,cAAc,CAAd,CAAvB,EAAyC,qBAAqB,aAAa,CAAb,CAArB,CAAzC;AACD;;AAED,YAAY,OAAZ,CAAoB,EAApB,CAAuB,KAAvB,EAA8B,UAAU,WAAV,EAAuB;AACnD,cAAY,OAAZ,GAAyB,IAAzB,CADmD,CACnB;AAChC,cAAY,OAAZ,GAAyB,CAAzB,CAFmD,CAEnB;AAChC,cAAY,UAAZ,GAAyB,EAAzB,CAHmD,CAGnB;AACjC,CAJD;;AAMA,SAAS,aAAT,GAAyB,cAAc,QAAvC;AACA,OAAO,OAAP,GAAiB,aAAjB;;;;;ACxOA,IAAM,gBAAgB,QAAQ,QAAR,CAAtB;AACA,IAAM,cAAgB,QAAQ,gBAAR,CAAtB;;AAEA,cAAc,OAAd,CAAsB,EAAtB,CAAyB,KAAzB,EAAgC,KAAhC;AACA,cAAc,OAAd,CAAsB,EAAtB,CAAyB,OAAzB,EAAkC,OAAlC;;WAEqB,CAAC,MAAD,EAAS,IAAT,EAAe,QAAf,EAAyB,QAAzB,C;AAArB,yCAAyD;AAApD,MAAM,iBAAN;AACH,cAAY,OAAZ,CAAoB,EAApB,CAAuB,MAAvB,EAA+B,aAA/B;AACD;;AAED,SAAS,KAAT,OAAkC;AAAA,MAAhB,YAAgB,QAAhB,YAAgB;;AAChC,MAAI,aAAa,IAAb,KAAsB,MAA1B,EAAkC;AAAE;AAAS;;AAE7C,eAAa,KAAb,GAAqB,CAAC,aAAa,KAAb,IAAsB,CAAvB,IAA4B,CAAjD;AACD;;AAED,SAAS,OAAT,QAAuE;AAAA,MAAnD,WAAmD,SAAnD,WAAmD;AAAA,MAAtC,YAAsC,SAAtC,YAAsC;AAAA,MAAxB,WAAwB,SAAxB,WAAwB;AAAA,MAAX,OAAW,SAAX,OAAW;;AACrE,MAAI,aAAa,IAAb,KAAsB,MAAtB,IAAgC,CAAC,QAAQ,MAA7C,EAAqD;AAAE;AAAS;;AAEhE;AACA,MAAM,WAAW,QAAQ,CAAR,EAAW,SAAX,CAAqB,OAArB,CAA6B,kBAA9C;;AAEA;AACA,MAAI,YAAY,CAAhB,EAAmB;AAAE;AAAS;;AAE9B;AACA,cAAY,kBAAZ,GAAiC,WAAW,YAAY;AACtD,kBAAc,IAAd,CAAmB;AACjB,8BADiB;AAEjB,8BAFiB;AAGjB,YAAM,MAHW;AAIjB,eAAS,YAJQ;AAKjB,aAAO;AALU,KAAnB;AAOD,GARgC,EAQ9B,QAR8B,CAAjC;AASD;;AAED,SAAS,aAAT,QAAyC;AAAA,MAAf,WAAe,SAAf,WAAe;;AACvC;AACA;AACA,MAAI,YAAY,kBAAhB,EAAoC;AAClC,kBAAc,YAAY,kBAA1B;AACA,gBAAY,kBAAZ,GAAiC,IAAjC;AACD;AACF;;AAED;AACA,cAAc,QAAd,CAAuB,kBAAvB,GAA4C,CAA5C;AACA,cAAc,KAAd,CAAoB,IAApB,CAAyB,YAAzB;;AAEA,OAAO,OAAP,GAAiB;AACf,cADe;AAEf,kBAFe;AAGf;AAHe,CAAjB;;;;;AClDA,IAAM,gBAAgB,QAAQ,QAAR,CAAtB;AACA,IAAM,eAAgB,QAAQ,iBAAR,CAAtB;AACA,IAAM,UAAgB,QAAQ,kBAAR,CAAtB;AACA,IAAM,KAAgB,QAAQ,aAAR,CAAtB;AACA,IAAM,WAAgB,QAAQ,mBAAR,CAAtB;AACA,IAAM,QAAgB,QAAQ,UAAR,CAAtB;AACA,IAAM,SAAgB,QAAQ,iBAAR,CAAtB;;eACsB,QAAQ,cAAR,C;IAAd,K,YAAA,K;;AAER,cAAc,OAAd,CAAsB,EAAtB,CAAyB,iBAAzB,EAA4C,gBAAmD;AAAA,MAAvC,OAAuC,QAAvC,OAAuC;AAAA,MAA9B,OAA8B,QAA9B,OAA8B;AAAA,MAArB,IAAqB,QAArB,IAAqB;AAAA,MAAf,WAAe,QAAf,WAAe;;AAC7F,WAAS,gBAAT,CAA2B,YAA3B,EAAyC,QAAzC,EAAmD,OAAnD,EAA4D;AAC1D,QAAM,MAAM,QAAQ,0BAAR,GACN,QAAQ,gBAAR,CAAyB,QAAzB,CADM,GAEN,SAFN;;AAIA,QAAM,YAAY,aAAa,MAA/B;AACA,QAAM,UAAU,UAAU,OAA1B;;AAEA,QAAI,UAAU,IAAV,KACG,GAAG,OAAH,CAAW,OAAX,CADH,IAEG,SAAS,eAAT,CAAyB,OAAzB,EAAkC,QAAlC,EAA4C,GAA5C,CAFH,IAGG,aAAa,eAAb,CAA6B,OAA7B,EAAsC,OAAtC,EAA+C,WAA/C,CAHP,EAGoE;;AAElE,cAAQ,IAAR,CAAa;AACX,wBADW;AAEX,4BAFW;AAGX,eAAO,EAAE,0BAAF;AAHI,OAAb;AAKD;AACF;;AAED,MAAM,eAAe,MAAM,aAAN,CAAoB,GAApB,CAAwB,OAAxB,CAArB;;AAEA,MAAI,YAAJ,EAAkB;AAChB,QAAM,YAAY,aAAa,MAA/B;AACA,QAAM,UAAU,UAAU,OAA1B;;AAEA,QAAI,UAAU,IAAV,KACG,aAAa,eAAb,CAA6B,OAA7B,EAAsC,OAAtC,EAA+C,WAA/C,CADP,EACoE;AAClE,cAAQ,IAAR,CAAa;AACX,wBADW;AAEX,4BAFW;AAGX,eAAO,EAAE,0BAAF;AAHI,OAAb;AAKD;AACF;;AAED,QAAM,aAAN,CAAoB,eAApB,CAAoC,gBAApC,EAAsD,OAAtD;AACD,CAvCD;;AAyCA,aAAa,OAAb,CAAqB,EAArB,CAAwB,KAAxB,EAA+B,iBAA4B;AAAA,MAAhB,YAAgB,SAAhB,YAAgB;;AACzD,eAAa,MAAb,CAAoB,OAApB,GAA8B,UAAU,OAAV,EAAmB;AAC/C,WAAO,aAAa,OAAb,CAAqB,OAArB,CAAP;AACD,GAFD;AAGD,CAJD;;AAMA,aAAa,OAAb,CAAqB,EAArB,CAAwB,KAAxB,EAA+B,iBAAqC;AAAA,MAAzB,YAAyB,SAAzB,YAAyB;AAAA,MAAX,OAAW,SAAX,OAAW;;AAClE,SAAO,aAAa,MAAb,CAAoB,OAA3B,EAAoC,cAAc,QAAlD;AACA,SAAO,aAAa,MAAb,CAAoB,OAA3B,EAAoC,OAApC;AACD,CAHD;;AAKA,MAAM,aAAa,UAAnB,EAA+B,cAAc,KAA7C;;AAEA,aAAa,SAAb,CAAuB,aAAvB,GAAuC,UAAU,OAAV,EAAmB;AACxD,SAAO,KAAK,MAAL,CAAY,OAAnB,EAA4B,OAA5B;;AAEA,SAAO,IAAP;AACD,CAJD;;AAMA,IAAM,qBAAqB,aAAa,SAAb,CAAuB,iBAAlD;;AAEA,aAAa,SAAb,CAAuB,iBAAvB,GAA2C,UAAU,UAAV,EAAsB,QAAtB,EAAgC;AACzE,MAAM,MAAM,mBAAmB,IAAnB,CAAwB,IAAxB,EAA8B,UAA9B,EAA0C,QAA1C,CAAZ;;AAEA,MAAI,QAAQ,IAAZ,EAAkB;AAChB,SAAK,MAAL,CAAY,OAAZ,CAAoB,UAApB,IAAkC,QAAlC;AACD;;AAED,SAAO,GAAP;AACD,CARD;;AAUA,aAAa,eAAb,CAA6B,IAA7B,CAAkC,eAAlC;;;;;ACjFA,IAAM,QAAU,QAAQ,SAAR,CAAhB;AACA,IAAM,SAAU,QAAQ,gBAAR,CAAhB;AACA,IAAM,UAAU,QAAQ,iBAAR,EAA2B,GAA3B,EAAhB;;AAEA,IAAM,QAAQ;AACZ,kBADY;AAEZ,gBAFY;AAGZ,cAHY;;AAKZ;AACA,YAAU,QAAQ,oBAAR,EAA8B,QAN5B;AAOZ;AACA,aAAW,EARC;;AAUZ,eAAa,qBAAU,GAAV,EAAe,GAAf,EAAoB;AAC/B;AACA,QAAI,MAAM,QAAN,CAAe,MAAM,SAArB,EAAgC,GAAhC,CAAJ,EAA0C;AAAE,aAAO,KAAP;AAAe;;AAE3D,UAAM,OAAO,MAAM,SAAN,CAAgB,GAAhB,CAAb;;AAEA,UAAM,SAAN,CAAgB,IAAhB,CAAqB,GAArB;AACA,WAAO,SAAP,CAAiB,IAAjB,CAAsB,GAAtB;;AAEA;AACA;AACA,QAAI,QAAQ,MAAM,QAAlB,EAA4B;AAC1B,aAAO,GAAP,CAAW,GAAX,EAAgB,QAAhB,EAA0B,MAAM,cAAhC;AACD;;AAED,YAAQ,IAAR,CAAa,cAAb,EAA6B,EAAE,QAAF,EAAO,QAAP,EAA7B;AACD,GA1BW;;AA4BZ,kBAAgB,wBAAU,GAAV,EAAe,GAAf,EAAoB;AAClC,QAAM,QAAQ,MAAM,OAAN,CAAc,MAAM,SAApB,EAA+B,GAA/B,CAAd;;AAEA,UAAM,OAAO,MAAM,SAAN,CAAgB,GAAhB,CAAb;;AAEA,WAAO,MAAP,CAAc,GAAd,EAAmB,QAAnB,EAA6B,MAAM,cAAnC;;AAEA,UAAM,SAAN,CAAgB,MAAhB,CAAuB,KAAvB,EAA8B,CAA9B;AACA,WAAO,SAAP,CAAiB,MAAjB,CAAwB,KAAxB,EAA+B,CAA/B;;AAEA,YAAQ,IAAR,CAAa,iBAAb,EAAgC,EAAE,QAAF,EAAO,QAAP,EAAhC;AACD,GAvCW;;AAyCZ,kBAAgB,0BAAY;AAC1B,UAAM,cAAN,CAAqB,KAAK,QAA1B,EAAoC,IAApC;AACD;AA3CW,CAAd;;AA8CA,OAAO,OAAP,GAAiB,KAAjB;;;;;;;eClDoB,QAAQ,OAAR,C;IAAZ,O,YAAA,O;;IAEF,O;AACJ,qBAAe;AAAA;;AACb,SAAK,SAAL,GAAiB;AACf;AADe,KAAjB;AAGD;;oBAED,E,eAAI,I,EAAM,Q,EAAU;AAClB,QAAI,CAAC,KAAK,SAAL,CAAe,IAAf,CAAL,EAA2B;AACzB,WAAK,SAAL,CAAe,IAAf,IAAuB,CAAC,QAAD,CAAvB;AACA;AACD;;AAED,SAAK,SAAL,CAAe,IAAf,EAAqB,IAArB,CAA0B,QAA1B;AACD,G;;oBAED,G,gBAAK,I,EAAM,Q,EAAU;AACnB,QAAI,CAAC,KAAK,SAAL,CAAe,IAAf,CAAL,EAA2B;AAAE;AAAS;;AAEtC,QAAM,QAAQ,QAAQ,KAAK,SAAL,CAAe,IAAf,CAAR,EAA8B,QAA9B,CAAd;;AAEA,QAAI,UAAU,CAAC,CAAf,EAAkB;AAChB,WAAK,SAAL,CAAe,IAAf,EAAqB,MAArB,CAA4B,KAA5B,EAAmC,CAAnC;AACD;AACF,G;;oBAED,I,iBAAM,I,EAAM,G,EAAK;AACf,QAAM,kBAAkB,KAAK,SAAL,CAAe,IAAf,CAAxB;;AAEA,QAAI,CAAC,eAAL,EAAsB;AAAE;AAAS;;AAEjC,SAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,gBAAgB,MAApC,EAA4C,GAA5C,EAAiD;AAC/C,UAAI,gBAAgB,CAAhB,EAAmB,GAAnB,EAAwB,IAAxB,MAAkC,KAAtC,EAA6C;AAC3C;AACD;AACF;AACF,G;;;;;AAGH,QAAQ,GAAR,GAAc,YAAY;AACxB,SAAO,IAAI,OAAJ,EAAP;AACD,CAFD;;AAIA,OAAO,OAAP,GAAiB,OAAjB;;;;;AC7CA,SAAS,OAAT,CAAkB,KAAlB,EAAyB,MAAzB,EAAiC;AAC/B,OAAK,IAAI,IAAI,CAAR,EAAW,MAAM,MAAM,MAA5B,EAAoC,IAAI,GAAxC,EAA6C,GAA7C,EAAkD;AAChD,QAAI,MAAM,CAAN,MAAa,MAAjB,EAAyB;AACvB,aAAO,CAAP;AACD;AACF;;AAED,SAAO,CAAC,CAAR;AACD;;AAED,SAAS,QAAT,CAAmB,KAAnB,EAA0B,MAA1B,EAAkC;AAChC,SAAO,QAAQ,KAAR,EAAe,MAAf,MAA2B,CAAC,CAAnC;AACD;;AAED,SAAS,KAAT,CAAgB,MAAhB,EAAwB,MAAxB,EAAgC;AAC9B,OAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,OAAO,MAA3B,EAAmC,GAAnC,EAAwC;AACtC,WAAO,IAAP,CAAY,OAAO,CAAP,CAAZ;AACD;;AAED,SAAO,MAAP;AACD;;AAED,SAAS,MAAT,CAAiB,KAAjB,EAAwB,IAAxB,EAA8B;AAC5B,MAAM,SAAS,EAAf;;AAEA,OAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,MAAM,MAA1B,EAAkC,GAAlC,EAAuC;AACrC,QAAI,KAAK,MAAM,CAAN,CAAL,CAAJ,EAAoB;AAClB,aAAO,IAAP,CAAY,MAAM,CAAN,CAAZ;AACD;AACF;;AAED,SAAO,MAAP;AACD;;AAED,OAAO,OAAP,GAAiB;AACf,kBADe;AAEf,oBAFe;AAGf,cAHe;AAIf;AAJe,CAAjB;;;;;eClCmB,QAAQ,UAAR,C;IAAX,M,YAAA,M;;AACR,IAAM,KAAS,QAAQ,MAAR,CAAf;AACA,IAAM,aAAa,QAAQ,cAAR,CAAnB;;AAEA,IAAM,UAAU,WAAW,OAA3B;AACA,IAAM,YAAa,OAAO,SAA1B;;AAEA,IAAM,UAAU;AACd;AACA,iBAAe,CAAC,EAAG,kBAAkB,MAAnB,IAA8B,GAAG,QAAH,CAAY,OAAO,aAAnB,KAC1B,WAAW,QAAX,YAA+B,OAAO,aAD5C,CAFF;;AAKd;AACA,wBAAsB,CAAC,CAAC,WAAW,YANrB;;AAQd,SAAQ,iBAAiB,MAAlB,IAA6B,EAAE,sBAAsB,MAAxB,CARtB;;AAUd;AACA,iBAAgB,UAAU,OAAV,KAAsB,OAAtB,IACT,QAAQ,aADC,IAET,UAAU,SAAV,CAAoB,KAApB,CAA0B,QAA1B,CAbO;;AAed;AACA,UAAS,iBAAiB,IAAjB,CAAsB,UAAU,QAAhC,KACG,YAAY,IAAZ,CAAiB,UAAU,UAA3B,CAjBE;;AAmBd,gBAAc,aAAa,IAAb,CAAkB,UAAU,SAA5B,CAnBA;;AAqBd;AACA,2BAAyB,aAAa,QAAQ,SAArB,GACrB,SADqB,GACV,2BAA2B,QAAQ,SAAnC,GACX,uBADW,GACc,wBAAwB,QAAQ,SAAhC,GACzB,oBADyB,GACH,sBAAsB,QAAQ,SAA9B,GACtB,kBADsB,GACF,mBA1BV;;AA4Bd,8BAA4B,KA5Bd;;AA8Bd,eAAc,WAAW,YAAX,GACT,WAAW,YAAX,KAA4B,OAAO,cAAnC,GACC;AACA,QAAQ,aADR;AAEA,UAAQ,eAFR;AAGA,UAAQ,WAHR;AAIA,SAAQ,UAJR;AAKA,UAAQ,eALR;AAMA,YAAQ;AANR,GADD,GASC;AACA,QAAQ,WADR;AAEA,UAAQ,aAFR;AAGA,UAAQ,aAHR;AAIA,SAAQ,YAJR;AAKA,UAAQ,aALR;AAMA,YAAQ;AANR,GAVQ,GAkBV,IAhDU;;AAkDd;AACA,cAAY,kBAAkB,WAAW,QAA7B,GAAuC,YAAvC,GAAqD;;AAnDnD,CAAhB;;AAuDA,QAAQ,0BAAR,GAAqC,CAAC,GAAG,QAAH,CAAY,QAAQ,SAAR,CAAkB,QAAQ,uBAA1B,CAAZ,CAAtC;;AAEA,OAAO,OAAP,GAAiB,OAAjB;;;;;AChEA,IAAM,aAAa,EAAnB;AACA,IAAM,MAAM,QAAQ,UAAR,EAAoB,MAAhC;;AAEA,SAAS,KAAT,GAAkB,CAAE;;AAEpB,WAAW,QAAX,GAAgC,IAAI,QAApC;AACA,WAAW,gBAAX,GAAgC,IAAI,gBAAJ,IAA0B,KAA1D;AACA,WAAW,UAAX,GAAgC,IAAI,UAAJ,IAA0B,KAA1D;AACA,WAAW,aAAX,GAAgC,IAAI,aAAJ,IAA0B,KAA1D;AACA,WAAW,kBAAX,GAAgC,IAAI,kBAAJ,IAA0B,KAA1D;AACA,WAAW,OAAX,GAAgC,IAAI,OAAJ,IAA0B,KAA1D;AACA,WAAW,WAAX,GAAgC,IAAI,WAAJ,IAA0B,WAAW,OAArE;;AAEA,WAAW,KAAX,GAA0B,IAAI,KAA9B;AACA,WAAW,KAAX,GAA0B,IAAI,KAAJ,IAAa,KAAvC;AACA,WAAW,YAAX,GAA2B,IAAI,YAAJ,IAAoB,IAAI,cAAnD;;AAEA,OAAO,OAAP,GAAiB,UAAjB;;;;;ACjBA,IAAM,MAAa,QAAQ,UAAR,CAAnB;AACA,IAAM,UAAa,QAAQ,WAAR,CAAnB;AACA,IAAM,KAAa,QAAQ,MAAR,CAAnB;AACA,IAAM,aAAa,QAAQ,cAAR,CAAnB;;AAEA,IAAM,WAAW;AACf,gBAAc,sBAAU,MAAV,EAAkB,KAAlB,EAAyB;AACrC,WAAO,KAAP,EAAc;AACZ,UAAI,UAAU,MAAd,EAAsB;AACpB,eAAO,IAAP;AACD;;AAED,cAAQ,MAAM,UAAd;AACD;;AAED,WAAO,KAAP;AACD,GAXc;;AAaf,WAAS,iBAAU,OAAV,EAAmB,QAAnB,EAA6B;AACpC,WAAO,GAAG,OAAH,CAAW,OAAX,CAAP,EAA4B;AAC1B,UAAI,SAAS,eAAT,CAAyB,OAAzB,EAAkC,QAAlC,CAAJ,EAAiD;AAAE,eAAO,OAAP;AAAiB;;AAEpE,gBAAU,SAAS,UAAT,CAAoB,OAApB,CAAV;AACD;;AAED,WAAO,IAAP;AACD,GArBc;;AAuBf,cAAY,oBAAU,IAAV,EAAgB;AAC1B,QAAI,SAAS,KAAK,UAAlB;;AAEA,QAAI,GAAG,OAAH,CAAW,MAAX,CAAJ,EAAwB;AACtB;AACA,aAAO,CAAC,SAAS,OAAO,IAAjB,KAA0B,GAAG,OAAH,CAAW,MAAX,CAAjC,EAAqD;AACnD;AACD;;AAED,aAAO,MAAP;AACD;;AAED,WAAO,MAAP;AACD,GApCc;;AAsCf;AACA,2BAAyB,QAAQ,0BAAR,GACrB,UAAU,OAAV,EAAmB,QAAnB,EAA6B,KAA7B,EAAoC;AACpC,YAAQ,SAAS,QAAQ,UAAR,CAAmB,gBAAnB,CAAoC,QAApC,CAAjB;;AAEA,SAAK,IAAI,IAAI,CAAR,EAAW,MAAM,MAAM,MAA5B,EAAoC,IAAI,GAAxC,EAA6C,GAA7C,EAAkD;AAChD,UAAI,MAAM,CAAN,MAAa,OAAjB,EAA0B;AACxB,eAAO,IAAP;AACD;AACF;;AAED,WAAO,KAAP;AACD,GAXsB,GAYrB,IAnDW;;AAqDf,mBAAiB,yBAAU,OAAV,EAAmB,QAAnB,EAA6B,QAA7B,EAAuC;AACtD,QAAI,QAAQ,0BAAZ,EAAwC;AACtC,aAAO,SAAS,uBAAT,CAAiC,OAAjC,EAA0C,QAA1C,EAAoD,QAApD,CAAP;AACD;;AAED;AACA,QAAI,IAAI,MAAJ,KAAe,IAAI,UAAvB,EAAmC;AACjC,iBAAW,SAAS,OAAT,CAAiB,WAAjB,EAA8B,GAA9B,CAAX;AACD;;AAED,WAAO,QAAQ,QAAQ,uBAAhB,EAAyC,QAAzC,CAAP;AACD,GAhEc;;AAkEf;AACA,yBAAuB,+BAAU,QAAV,EAAoB;AACzC,QAAI,qBAAqB,EAAzB;AACA,QAAI,kBAAkB,EAAtB;AACA,QAAI,iBAAJ;AACA,QAAI,cAAc,SAAS,CAAT,CAAlB;AACA,QAAI,QAAQ,cAAa,CAAb,GAAgB,CAAC,CAA7B;AACA,QAAI,eAAJ;AACA,QAAI,cAAJ;AACA,QAAI,UAAJ;AACA,QAAI,UAAJ;;AAEA,SAAK,IAAI,CAAT,EAAY,IAAI,SAAS,MAAzB,EAAiC,GAAjC,EAAsC;AACpC,iBAAW,SAAS,CAAT,CAAX;;AAEA;AACA,UAAI,CAAC,QAAD,IAAa,aAAa,WAA9B,EAA2C;AACzC;AACD;;AAED,UAAI,CAAC,WAAL,EAAkB;AAChB,sBAAc,QAAd;AACA,gBAAQ,CAAR;AACA;AACD;;AAED;AACA;AACA,UAAI,SAAS,UAAT,KAAwB,SAAS,aAArC,EAAoD;AAClD;AACD;AACD;AAHA,WAIK,IAAI,YAAY,UAAZ,KAA2B,SAAS,aAAxC,EAAuD;AAC1D,wBAAc,QAAd;AACA,kBAAQ,CAAR;AACA;AACD;;AAED,UAAI,CAAC,mBAAmB,MAAxB,EAAgC;AAC9B,iBAAS,WAAT;AACA,eAAO,OAAO,UAAP,IAAqB,OAAO,UAAP,KAAsB,OAAO,aAAzD,EAAwE;AACtE,6BAAmB,OAAnB,CAA2B,MAA3B;AACA,mBAAS,OAAO,UAAhB;AACD;AACF;;AAED;AACA;AACA,UAAI,uBAAuB,WAAW,WAAlC,IACG,oBAAoB,WAAW,UADlC,IAEG,EAAE,oBAAoB,WAAW,aAAjC,CAFP,EAEwD;;AAEtD,YAAI,aAAa,YAAY,UAA7B,EAAyC;AACvC;AACD;;AAED,iBAAS,SAAS,eAAlB;AACD,OATD,MAUK;AACH,iBAAS,QAAT;AACD;;AAED,wBAAkB,EAAlB;;AAEA,aAAO,OAAO,UAAP,KAAsB,OAAO,aAApC,EAAmD;AACjD,wBAAgB,OAAhB,CAAwB,MAAxB;AACA,iBAAS,OAAO,UAAhB;AACD;;AAED,UAAI,CAAJ;;AAEA;AACA,aAAO,gBAAgB,CAAhB,KAAsB,gBAAgB,CAAhB,MAAuB,mBAAmB,CAAnB,CAApD,EAA2E;AACzE;AACD;;AAED,UAAM,UAAU,CACd,gBAAgB,IAAI,CAApB,CADc,EAEd,gBAAgB,CAAhB,CAFc,EAGd,mBAAmB,CAAnB,CAHc,CAAhB;;AAMA,cAAQ,QAAQ,CAAR,EAAW,SAAnB;;AAEA,aAAO,KAAP,EAAc;AACZ,YAAI,UAAU,QAAQ,CAAR,CAAd,EAA0B;AACxB,wBAAc,QAAd;AACA,kBAAQ,CAAR;AACA,+BAAqB,EAArB;;AAEA;AACD,SAND,MAOK,IAAI,UAAU,QAAQ,CAAR,CAAd,EAA0B;AAC7B;AACD;;AAED,gBAAQ,MAAM,eAAd;AACD;AACF;;AAED,WAAO,KAAP;AACD,GAvKc;;AAyKf,eAAa,qBAAU,OAAV,EAAmB,QAAnB,EAA6B,KAA7B,EAAoC;AAC/C,WAAO,GAAG,OAAH,CAAW,OAAX,CAAP,EAA4B;AAC1B,UAAI,SAAS,eAAT,CAAyB,OAAzB,EAAkC,QAAlC,CAAJ,EAAiD;AAC/C,eAAO,IAAP;AACD;;AAED,gBAAU,SAAS,UAAT,CAAoB,OAApB,CAAV;;AAEA,UAAI,YAAY,KAAhB,EAAuB;AACrB,eAAO,SAAS,eAAT,CAAyB,OAAzB,EAAkC,QAAlC,CAAP;AACD;AACF;;AAED,WAAO,KAAP;AACD,GAvLc;;AAyLf,oBAAkB,0BAAU,OAAV,EAAmB;AACnC,WAAQ,mBAAmB,WAAW,kBAA9B,GACJ,QAAQ,uBADJ,GAEJ,OAFJ;AAGD,GA7Lc;;AA+Lf,eAAa,qBAAU,cAAV,EAA0B;AACrC,qBAAiB,kBAAkB,IAAI,MAAvC;AACA,WAAO;AACL,SAAG,eAAe,OAAf,IAA0B,eAAe,QAAf,CAAwB,eAAxB,CAAwC,UADhE;AAEL,SAAG,eAAe,OAAf,IAA0B,eAAe,QAAf,CAAwB,eAAxB,CAAwC;AAFhE,KAAP;AAID,GArMc;;AAuMf,wBAAsB,8BAAU,OAAV,EAAmB;AACvC,QAAM,aAAc,mBAAmB,WAAW,UAA9B,GAChB,QAAQ,qBAAR,EADgB,GAEhB,QAAQ,cAAR,GAAyB,CAAzB,CAFJ;;AAIA,WAAO,cAAc;AACnB,YAAQ,WAAW,IADA;AAEnB,aAAQ,WAAW,KAFA;AAGnB,WAAQ,WAAW,GAHA;AAInB,cAAQ,WAAW,MAJA;AAKnB,aAAQ,WAAW,KAAX,IAAqB,WAAW,KAAX,GAAoB,WAAW,IALzC;AAMnB,cAAQ,WAAW,MAAX,IAAqB,WAAW,MAAX,GAAoB,WAAW;AANzC,KAArB;AAQD,GApNc;;AAsNf,kBAAgB,wBAAU,OAAV,EAAmB;AACjC,QAAM,aAAa,SAAS,oBAAT,CAA8B,OAA9B,CAAnB;;AAEA,QAAI,CAAC,QAAQ,MAAT,IAAmB,UAAvB,EAAmC;AACjC,UAAM,SAAS,SAAS,WAAT,CAAqB,IAAI,SAAJ,CAAc,OAAd,CAArB,CAAf;;AAEA,iBAAW,IAAX,IAAqB,OAAO,CAA5B;AACA,iBAAW,KAAX,IAAqB,OAAO,CAA5B;AACA,iBAAW,GAAX,IAAqB,OAAO,CAA5B;AACA,iBAAW,MAAX,IAAqB,OAAO,CAA5B;AACD;;AAED,WAAO,UAAP;AACD,GAnOc;;AAqOf,WAAS,iBAAU,OAAV,EAAmB;AAC1B,QAAM,OAAO,EAAb;;AAEA,WAAO,OAAP,EAAgB;AACd,WAAK,IAAL,CAAU,OAAV;AACA,gBAAU,SAAS,UAAT,CAAoB,OAApB,CAAV;AACD;;AAED,WAAO,IAAP;AACD,GA9Oc;;AAgPf,eAAa,4BAAS;AACpB,QAAI,CAAC,GAAG,MAAH,CAAU,KAAV,CAAL,EAAuB;AAAE,aAAO,KAAP;AAAe;;AAExC;AACA,eAAW,QAAX,CAAoB,aAApB,CAAkC,KAAlC;AACA,WAAO,IAAP;AACD;AAtPc,CAAjB;;AAyPA,OAAO,OAAP,GAAiB,QAAjB;;;;;AC9PA,IAAM,KAAO,QAAQ,MAAR,CAAb;AACA,IAAM,WAAW,QAAQ,YAAR,CAAjB;AACA,IAAM,UAAW,QAAQ,iBAAR,CAAjB;;eAE+B,QAAQ,UAAR,C;IAAvB,M,YAAA,M;IAAQ,S,YAAA,S;;gBACc,QAAQ,OAAR,C;IAAtB,O,aAAA,O;IAAS,Q,aAAA,Q;;AAEjB,IAAM,iBAAkB,iBAAiB,MAAlB,IAA6B,EAAE,sBAAsB,MAAxB,CAApD;AACA,IAAM,WAAiB,iBAAiB,aAAjB,GAAgC,kBAAvD;AACA,IAAM,cAAiB,iBAAiB,aAAjB,GAAgC,qBAAvD;AACA,IAAM,KAAiB,iBAAgB,IAAhB,GAAsB,EAA7C;;AAEA,IAAM,WAAoB,EAA1B;AACA,IAAM,UAAoB,EAA1B;AACA,IAAM,oBAAoB,EAA1B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAM,kBAAkB,EAAxB;;AAEA,IAAM,YAAY,EAAlB;;AAEA,IAAM,kBAAkB,CAAC,cAAD,IAAoB,YAAM;AAChD,MAAI,YAAY,KAAhB;;AAEA,SAAO,QAAP,CAAgB,aAAhB,CAA8B,KAA9B,EAAqC,gBAArC,CAAsD,MAAtD,EAA8D,IAA9D,EAAoE;AAClE,QAAI,OAAJ,GAAe;AAAE,kBAAY,IAAZ;AAAmB;AAD8B,GAApE;;AAIA,SAAO,SAAP;AACD,CAR0C,EAA3C;;AAUA,SAAS,GAAT,CAAc,OAAd,EAAuB,IAAvB,EAA6B,QAA7B,EAAuC,WAAvC,EAAoD;AAClD,MAAM,UAAU,WAAW,WAAX,CAAhB;AACA,MAAI,eAAe,QAAQ,QAAR,EAAkB,OAAlB,CAAnB;AACA,MAAI,SAAS,QAAQ,YAAR,CAAb;;AAEA,MAAI,CAAC,MAAL,EAAa;AACX,aAAS;AACP,cAAQ,EADD;AAEP,iBAAW;AAFJ,KAAT;;AAKA,mBAAe,SAAS,IAAT,CAAc,OAAd,IAAyB,CAAxC;AACA,YAAQ,IAAR,CAAa,MAAb;;AAEA,sBAAkB,IAAlB,CAAuB,iBACnB;AACA,gBAAU,EADV;AAEA,eAAU,EAFV;AAGA,gBAAU;AAHV,KADmB,GAMnB,IANJ;AAOD;;AAED,MAAI,CAAC,OAAO,MAAP,CAAc,IAAd,CAAL,EAA0B;AACxB,WAAO,MAAP,CAAc,IAAd,IAAsB,EAAtB;AACA,WAAO,SAAP;AACD;;AAED,MAAI,CAAC,SAAS,OAAO,MAAP,CAAc,IAAd,CAAT,EAA8B,QAA9B,CAAL,EAA8C;AAC5C,QAAI,YAAJ;;AAEA,QAAI,cAAJ,EAAoB;AAAA,kCACsB,kBAAkB,YAAlB,CADtB;AAAA,UACV,QADU,yBACV,QADU;AAAA,UACA,OADA,yBACA,OADA;AAAA,UACS,QADT,yBACS,QADT;;AAElB,UAAM,gBAAgB,QAAQ,QAAR,EAAkB,QAAlB,CAAtB;;AAEA,UAAM,kBAAkB,QAAQ,aAAR,KAA0B,UAAU,KAAV,EAAiB;AACjE,YAAI,CAAC,MAAM,2BAAX,EAAwC;AACtC,gBAAM,MAAN,GAAe,MAAM,UAArB;AACA,gBAAM,aAAN,GAAsB,OAAtB;;AAEA,gBAAM,cAAN,GAAiC,MAAM,cAAN,IAAkC,UAAnE;AACA,gBAAM,eAAN,GAAiC,MAAM,eAAN,IAAkC,QAAnE;AACA,gBAAM,wBAAN,GAAiC,MAAM,wBAAN,IAAkC,WAAnE;;AAEA,cAAI,cAAc,IAAd,CAAmB,MAAM,IAAzB,CAAJ,EAAoC;AAClC,kBAAM,KAAN,GAAc,MAAM,OAAN,GAAgB,UAAU,OAAV,EAAmB,QAAnB,CAA4B,eAA5B,CAA4C,UAA1E;AACA,kBAAM,KAAN,GAAc,MAAM,OAAN,GAAgB,UAAU,OAAV,EAAmB,QAAnB,CAA4B,eAA5B,CAA4C,SAA1E;AACD;;AAED,mBAAS,KAAT;AACD;AACF,OAhBD;;AAkBA,YAAM,QAAQ,QAAR,EAAkB,KAAK,IAAvB,EAA6B,eAA7B,EAA8C,CAAC,CAAC,QAAQ,OAAxD,CAAN;;AAEA,UAAI,kBAAkB,CAAC,CAAvB,EAA0B;AACxB,iBAAS,IAAT,CAAc,QAAd;AACA,gBAAQ,IAAR,CAAa,eAAb;AACA,iBAAS,IAAT,CAAc,CAAd;AACD,OAJD,MAKK;AACH,iBAAS,aAAT;AACD;AACF,KAhCD,MAiCK;AACH,YAAM,QAAQ,QAAR,EAAkB,IAAlB,EAAwB,QAAxB,EAAkC,kBAAiB,OAAjB,GAA2B,CAAC,CAAC,QAAQ,OAAvE,CAAN;AACD;AACD,WAAO,MAAP,CAAc,IAAd,EAAoB,IAApB,CAAyB,QAAzB;;AAEA,WAAO,GAAP;AACD;AACF;;AAED,SAAS,MAAT,CAAiB,OAAjB,EAA0B,IAA1B,EAAgC,QAAhC,EAA0C,WAA1C,EAAuD;AACrD,MAAM,UAAU,WAAW,WAAX,CAAhB;AACA,MAAM,eAAe,QAAQ,QAAR,EAAkB,OAAlB,CAArB;AACA,MAAM,SAAS,QAAQ,YAAR,CAAf;;AAEA,MAAI,CAAC,MAAD,IAAW,CAAC,OAAO,MAAvB,EAA+B;AAC7B;AACD;;AAED,MAAI,kBAAkB,QAAtB;AACA,MAAI,kBAAJ;AACA,MAAI,sBAAJ;;AAEA,MAAI,cAAJ,EAAoB;AAClB,gBAAY,kBAAkB,YAAlB,CAAZ;AACA,oBAAgB,QAAQ,UAAU,QAAlB,EAA4B,QAA5B,CAAhB;AACA,sBAAkB,UAAU,OAAV,CAAkB,aAAlB,CAAlB;AACD;;AAED,MAAI,SAAS,KAAb,EAAoB;AAClB,SAAK,IAAL,IAAa,OAAO,MAApB,EAA4B;AAC1B,UAAI,OAAO,MAAP,CAAc,cAAd,CAA6B,IAA7B,CAAJ,EAAwC;AACtC,eAAO,OAAP,EAAgB,IAAhB,EAAsB,KAAtB;AACD;AACF;AACD;AACD;;AAED,MAAI,OAAO,MAAP,CAAc,IAAd,CAAJ,EAAyB;AACvB,QAAM,MAAM,OAAO,MAAP,CAAc,IAAd,EAAoB,MAAhC;;AAEA,QAAI,aAAa,KAAjB,EAAwB;AACtB,WAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,GAApB,EAAyB,GAAzB,EAA8B;AAC5B,eAAO,OAAP,EAAgB,IAAhB,EAAsB,OAAO,MAAP,CAAc,IAAd,EAAoB,CAApB,CAAtB,EAA8C,OAA9C;AACD;AACD;AACD,KALD,MAMK;AACH,WAAK,IAAI,KAAI,CAAb,EAAgB,KAAI,GAApB,EAAyB,IAAzB,EAA8B;AAC5B,YAAI,OAAO,MAAP,CAAc,IAAd,EAAoB,EAApB,MAA2B,QAA/B,EAAyC;AACvC,kBAAQ,WAAR,EAAqB,KAAK,IAA1B,EAAgC,eAAhC,EAAiD,kBAAiB,OAAjB,GAA2B,CAAC,CAAC,QAAQ,OAAtF;AACA,iBAAO,MAAP,CAAc,IAAd,EAAoB,MAApB,CAA2B,EAA3B,EAA8B,CAA9B;;AAEA,cAAI,kBAAkB,SAAtB,EAAiC;AAC/B,sBAAU,QAAV,CAAmB,aAAnB;AACA,gBAAI,UAAU,QAAV,CAAmB,aAAnB,MAAsC,CAA1C,EAA6C;AAC3C,wBAAU,QAAV,CAAmB,MAAnB,CAA0B,aAA1B,EAAyC,CAAzC;AACA,wBAAU,OAAV,CAAkB,MAAlB,CAAyB,aAAzB,EAAwC,CAAxC;AACA,wBAAU,QAAV,CAAmB,MAAnB,CAA0B,aAA1B,EAAyC,CAAzC;AACD;AACF;;AAED;AACD;AACF;AACF;;AAED,QAAI,OAAO,MAAP,CAAc,IAAd,KAAuB,OAAO,MAAP,CAAc,IAAd,EAAoB,MAApB,KAA+B,CAA1D,EAA6D;AAC3D,aAAO,MAAP,CAAc,IAAd,IAAsB,IAAtB;AACA,aAAO,SAAP;AACD;AACF;;AAED,MAAI,CAAC,OAAO,SAAZ,EAAuB;AACrB,YAAQ,MAAR,CAAe,YAAf,EAA6B,CAA7B;AACA,aAAS,MAAT,CAAgB,YAAhB,EAA8B,CAA9B;AACA,sBAAkB,MAAlB,CAAyB,YAAzB,EAAuC,CAAvC;AACD;AACF;;AAED,SAAS,WAAT,CAAsB,QAAtB,EAAgC,OAAhC,EAAyC,IAAzC,EAA+C,QAA/C,EAAyD,WAAzD,EAAsE;AACpE,MAAM,UAAU,WAAW,WAAX,CAAhB;AACA,MAAI,CAAC,gBAAgB,IAAhB,CAAL,EAA4B;AAC1B,oBAAgB,IAAhB,IAAwB;AACtB,iBAAW,EADW;AAEtB,gBAAW,EAFW;AAGtB,iBAAW;AAHW,KAAxB;;AAMA;AACA,SAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,UAAU,MAA9B,EAAsC,GAAtC,EAA2C;AACzC,UAAI,UAAU,CAAV,CAAJ,EAAkB,IAAlB,EAAwB,gBAAxB;AACA,UAAI,UAAU,CAAV,CAAJ,EAAkB,IAAlB,EAAwB,kBAAxB,EAA4C,IAA5C;AACD;AACF;;AAED,MAAM,YAAY,gBAAgB,IAAhB,CAAlB;AACA,MAAI,cAAJ;;AAEA,OAAK,QAAQ,UAAU,SAAV,CAAoB,MAApB,GAA6B,CAA1C,EAA6C,SAAS,CAAtD,EAAyD,OAAzD,EAAkE;AAChE,QAAI,UAAU,SAAV,CAAoB,KAApB,MAA+B,QAA/B,IACG,UAAU,QAAV,CAAmB,KAAnB,MAA8B,OADrC,EAC8C;AAC5C;AACD;AACF;;AAED,MAAI,UAAU,CAAC,CAAf,EAAkB;AAChB,YAAQ,UAAU,SAAV,CAAoB,MAA5B;;AAEA,cAAU,SAAV,CAAoB,IAApB,CAAyB,QAAzB;AACA,cAAU,QAAV,CAAoB,IAApB,CAAyB,OAAzB;AACA,cAAU,SAAV,CAAoB,IAApB,CAAyB,EAAzB;AACD;;AAED;AACA,YAAU,SAAV,CAAoB,KAApB,EAA2B,IAA3B,CAAgC,CAAC,QAAD,EAAW,CAAC,CAAC,QAAQ,OAArB,EAA8B,QAAQ,OAAtC,CAAhC;AACD;;AAED,SAAS,cAAT,CAAyB,QAAzB,EAAmC,OAAnC,EAA4C,IAA5C,EAAkD,QAAlD,EAA4D,WAA5D,EAAyE;AACvE,MAAM,UAAU,WAAW,WAAX,CAAhB;AACA,MAAM,YAAY,gBAAgB,IAAhB,CAAlB;AACA,MAAI,aAAa,KAAjB;AACA,MAAI,cAAJ;;AAEA,MAAI,CAAC,SAAL,EAAgB;AAAE;AAAS;;AAE3B;AACA,OAAK,QAAQ,UAAU,SAAV,CAAoB,MAApB,GAA6B,CAA1C,EAA6C,SAAS,CAAtD,EAAyD,OAAzD,EAAkE;AAChE;AACA,QAAI,UAAU,SAAV,CAAoB,KAApB,MAA+B,QAA/B,IACG,UAAU,QAAV,CAAmB,KAAnB,MAA8B,OADrC,EAC8C;;AAE5C,UAAM,YAAY,UAAU,SAAV,CAAoB,KAApB,CAAlB;;AAEA;AACA,WAAK,IAAI,IAAI,UAAU,MAAV,GAAmB,CAAhC,EAAmC,KAAK,CAAxC,EAA2C,GAA3C,EAAgD;AAAA,2BACf,UAAU,CAAV,CADe;AAAA,YACvC,EADuC;AAAA,YACnC,OADmC;AAAA,YAC1B,OAD0B;;AAG9C;;AACA,YAAI,OAAO,QAAP,IAAmB,YAAY,CAAC,CAAC,QAAQ,OAAzC,IAAoD,YAAY,QAAQ,OAA5E,EAAqF;AACnF;AACA,oBAAU,MAAV,CAAiB,CAAjB,EAAoB,CAApB;;AAEA;AACA;AACA,cAAI,CAAC,UAAU,MAAf,EAAuB;AACrB,sBAAU,SAAV,CAAoB,MAApB,CAA2B,KAA3B,EAAkC,CAAlC;AACA,sBAAU,QAAV,CAAoB,MAApB,CAA2B,KAA3B,EAAkC,CAAlC;AACA,sBAAU,SAAV,CAAoB,MAApB,CAA2B,KAA3B,EAAkC,CAAlC;;AAEA;AACA,mBAAO,OAAP,EAAgB,IAAhB,EAAsB,gBAAtB;AACA,mBAAO,OAAP,EAAgB,IAAhB,EAAsB,kBAAtB,EAA0C,IAA1C;;AAEA;AACA,gBAAI,CAAC,UAAU,SAAV,CAAoB,MAAzB,EAAiC;AAC/B,8BAAgB,IAAhB,IAAwB,IAAxB;AACD;AACF;;AAED;AACA,uBAAa,IAAb;AACA;AACD;AACF;;AAED,UAAI,UAAJ,EAAgB;AAAE;AAAQ;AAC3B;AACF;AACF;;AAED;AACA;AACA,SAAS,gBAAT,CAA2B,KAA3B,EAAkC,WAAlC,EAA+C;AAC7C,MAAM,UAAU,WAAW,WAAX,CAAhB;AACA,MAAM,YAAY,EAAlB;AACA,MAAM,YAAY,gBAAgB,MAAM,IAAtB,CAAlB;AACA,MAAM,cAAe,SAAS,gBAAT,CAA0B,MAAM,IAAN,GAC3C,MAAM,IAAN,CAAW,CAAX,CAD2C,GAE3C,MAAM,MAFW,CAArB;AAGA,MAAI,UAAU,WAAd;;AAEA;AACA,UAAQ,SAAR,EAAmB,KAAnB;;AAEA,YAAU,aAAV,GAA0B,KAA1B;AACA,YAAU,cAAV,GAA2B,sBAA3B;;AAEA;AACA,SAAO,GAAG,OAAH,CAAW,OAAX,CAAP,EAA4B;AAC1B,SAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,UAAU,SAAV,CAAoB,MAAxC,EAAgD,GAAhD,EAAqD;AACnD,UAAM,WAAW,UAAU,SAAV,CAAoB,CAApB,CAAjB;AACA,UAAM,UAAU,UAAU,QAAV,CAAmB,CAAnB,CAAhB;;AAEA,UAAI,SAAS,eAAT,CAAyB,OAAzB,EAAkC,QAAlC,KACG,SAAS,YAAT,CAAsB,OAAtB,EAA+B,WAA/B,CADH,IAEG,SAAS,YAAT,CAAsB,OAAtB,EAA+B,OAA/B,CAFP,EAEgD;;AAE9C,YAAM,YAAY,UAAU,SAAV,CAAoB,CAApB,CAAlB;;AAEA,kBAAU,aAAV,GAA0B,OAA1B;;AAEA,aAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,UAAU,MAA9B,EAAsC,GAAtC,EAA2C;AAAA,6BACV,UAAU,CAAV,CADU;AAAA,cAClC,EADkC;AAAA,cAC9B,OAD8B;AAAA,cACrB,OADqB;;;AAGzC,cAAI,YAAY,CAAC,CAAC,QAAQ,OAAtB,IAAiC,YAAY,QAAQ,OAAzD,EAAkE;AAChE,eAAG,SAAH;AACD;AACF;AACF;AACF;;AAED,cAAU,SAAS,UAAT,CAAoB,OAApB,CAAV;AACD;AACF;;AAED,SAAS,kBAAT,CAA6B,KAA7B,EAAoC;AAClC,SAAO,iBAAiB,IAAjB,CAAsB,IAAtB,EAA4B,KAA5B,EAAmC,IAAnC,CAAP;AACD;;AAED,SAAS,UAAT,GAAuB;AACrB,OAAK,WAAL,GAAmB,KAAnB;AACD;;AAED,SAAS,sBAAT,GAAmC;AACjC,OAAK,aAAL,CAAmB,cAAnB;AACD;;AAED,SAAS,QAAT,GAAqB;AACnB,OAAK,YAAL,GAAoB,IAApB;AACD;;AAED,SAAS,WAAT,GAAwB;AACtB,OAAK,YAAL,GAAoB,IAApB;AACA,OAAK,2BAAL,GAAmC,IAAnC;AACD;;AAED,SAAS,UAAT,CAAqB,KAArB,EAA4B;AAC1B,SAAO,GAAG,MAAH,CAAU,KAAV,IAAkB,KAAlB,GAA0B,EAAE,SAAS,KAAX,EAAjC;AACD;;AAED,OAAO,OAAP,GAAiB;AACf,UADe;AAEf,gBAFe;;AAIf,0BAJe;AAKf,gCALe;;AAOf,oCAPe;AAQf,wCARe;AASf,kCATe;AAUf,sBAVe;;AAYf,gCAZe;AAaf,kCAbe;;AAef,aAAW,QAfI;AAgBf,YAAU,OAhBK;AAiBf,sBAAoB;AAjBL,CAAjB;;;;;ACrVA,OAAO,OAAP,GAAiB,SAAS,MAAT,CAAiB,IAAjB,EAAuB,MAAvB,EAA+B;AAC9C,OAAK,IAAM,IAAX,IAAmB,MAAnB,EAA2B;AACzB,SAAK,IAAL,IAAa,OAAO,IAAP,CAAb;AACD;AACD,SAAO,IAAP;AACD,CALD;;;;;eCGI,QAAQ,QAAR,C;IAFF,e,YAAA,e;IACA,Q,YAAA,Q;;AAGF,OAAO,OAAP,GAAiB,UAAU,MAAV,EAAkB,OAAlB,EAA2B,MAA3B,EAAmC;AAClD,MAAM,gBAAgB,OAAO,OAAP,CAAe,MAAf,CAAtB;AACA,MAAM,eAAe,iBAAiB,cAAc,MAApD;AACA,MAAM,SAAS,gBAAgB,OAAO,OAAP,CAAe,MAA9C;;AAEA,MAAM,aAAa,gBAAgB,MAAhB,EAAwB,MAAxB,EAAgC,OAAhC,EAAyC,CAAC,UAAU,OAAX,CAAzC,CAAnB;;AAEA,SAAO,SAAS,UAAT,KAAwB,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EAA/B;AACD,CARD;;;;;ACLA,OAAO,OAAP,GAAiB,UAAC,CAAD,EAAI,CAAJ;AAAA,SAAW,KAAK,IAAL,CAAU,IAAI,CAAJ,GAAQ,IAAI,CAAtB,CAAX;AAAA,CAAjB;;;;;ACAA,IAAM,SAAS,QAAQ,UAAR,CAAf;AACA,IAAM,MAAS,QAAQ,UAAR,CAAf;;AAEA,IAAM,QAAQ;AACZ,YAAU,kBAAU,MAAV,EAAkB,OAAlB,EAA2B;AACnC,QAAI,SAAS,KAAb;;AAEA,WAAO,YAAY;AACjB,UAAI,CAAC,MAAL,EAAa;AACX,YAAI,MAAJ,CAAW,OAAX,CAAmB,IAAnB,CAAwB,OAAxB;AACA,iBAAS,IAAT;AACD;;AAED,aAAO,OAAO,KAAP,CAAa,IAAb,EAAmB,SAAnB,CAAP;AACD,KAPD;AAQD,GAZW;;AAcZ;AACA,oBAAkB,0BAAU,CAAV,EAAa,EAAb,EAAiB,EAAjB,EAAqB,EAArB,EAAyB;AACzC,QAAM,KAAK,IAAI,CAAf;AACA,WAAO,KAAK,EAAL,GAAU,EAAV,GAAe,IAAI,EAAJ,GAAS,CAAT,GAAa,EAA5B,GAAiC,IAAI,CAAJ,GAAQ,EAAhD;AACD,GAlBW;;AAoBZ,0BAAwB,gCAAU,MAAV,EAAkB,MAAlB,EAA0B,GAA1B,EAA+B,GAA/B,EAAoC,IAApC,EAA0C,IAA1C,EAAgD,QAAhD,EAA0D;AAChF,WAAO;AACL,SAAI,MAAM,gBAAN,CAAuB,QAAvB,EAAiC,MAAjC,EAAyC,GAAzC,EAA8C,IAA9C,CADC;AAEL,SAAI,MAAM,gBAAN,CAAuB,QAAvB,EAAiC,MAAjC,EAAyC,GAAzC,EAA8C,IAA9C;AAFC,KAAP;AAID,GAzBW;;AA2BZ;AACA,eAAa,qBAAU,CAAV,EAAa,CAAb,EAAgB,CAAhB,EAAmB,CAAnB,EAAsB;AACjC,SAAK,CAAL;AACA,WAAO,CAAC,CAAD,GAAK,CAAL,IAAQ,IAAE,CAAV,IAAe,CAAtB;AACD,GA/BW;;AAiCZ,cAAY,oBAAU,IAAV,EAAgB,GAAhB,EAAqB;AAC/B,SAAK,IAAL,GAAa,IAAI,IAAjB;AACA,SAAK,IAAL,GAAa,IAAI,IAAjB;AACA,SAAK,KAAL,GAAa,IAAI,KAAjB;;AAEA,WAAO,IAAP;AACD,GAvCW;;AAyCZ,MAAa,QAAQ,MAAR,CAzCD;AA0CZ,UAAa,MA1CD;AA2CZ,SAAa,QAAQ,SAAR,CA3CD;AA4CZ,eAAa,QAAQ,eAAR;AA5CD,CAAd;;AA+CA,OAAO,KAAP,EAAc,QAAQ,OAAR,CAAd;AACA,OAAO,KAAP,EAAc,QAAQ,YAAR,CAAd;AACA,OAAO,KAAP,EAAc,QAAQ,gBAAR,CAAd;AACA,OAAO,KAAP,EAAc,QAAQ,QAAR,CAAd;;AAEA,OAAO,OAAP,GAAiB,KAAjB;;;;;ACvDA,IAAM,QAAU,QAAQ,UAAR,CAAhB;AACA,IAAM,QAAU,QAAQ,SAAR,CAAhB;;AAEA,IAAM,SAAS;AACb,eAAa,CAAE,kBAAF,EAAsB,YAAtB,EAAoC,YAApC,EAAkD,MAAlD,CADA;;AAGb,UAAQ,gBAAU,OAAV,EAAmB,SAAnB,EAA8B,WAA9B,EAA2C;AACjD,QAAM,cAAc,MAAM,cAAN,CAAqB,OAArB,CAApB;AACA,QAAM,YAAY,MAAM,YAAN,CAAmB,OAAnB,CAAlB;AACA,QAAM,UAAU,EAAE,gBAAF,EAAW,oBAAX,EAAsB,wBAAtB,EAAmC,oBAAnC,EAA8C,wBAA9C,EAAhB;;AAEA,yBAAqB,OAAO,WAA5B,kHAAyC;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAA9B,MAA8B;;AACvC,UAAM,cAAc,OAAO,MAAP,EAAe,OAAf,CAApB;;AAEA,UAAI,WAAJ,EAAiB;AACf,eAAO,WAAP;AACD;AACF;AACF,GAfY;;AAiBb;AACA,oBAAkB,iCAAmD;AAAA,QAAvC,WAAuC,SAAvC,WAAuC;AAAA,QAA1B,SAA0B,SAA1B,SAA0B;AAAA,QAAf,WAAe,SAAf,WAAe;;AACnE,QAAI,CAAC,cAAc,IAAd,CAAmB,SAAnB,CAAL,EAAoC;AAClC,aAAO,IAAP;AACD;;AAED,0BAA0B,MAAM,YAAhC,yHAA8C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAAnC,WAAmC;;AAC5C,UAAI,UAAU,WAAd;;AAEA,UAAI,YAAY,UAAZ,IAA0B,YAAY,UAAZ,CAAuB,WAAjD,IACI,YAAY,WAAZ,KAA4B,WADpC,EACkD;AAChD,eAAO,OAAP,EAAgB;AACd;AACA,cAAI,YAAY,YAAY,OAA5B,EAAqC;AACnC,mBAAO,WAAP;AACD;AACD,oBAAU,MAAM,UAAN,CAAiB,OAAjB,CAAV;AACD;AACF;AACF;;AAED,WAAO,IAAP;AACD,GAvCY;;AAyCb;AACA,cAAY,2BAAiD;AAAA,QAArC,SAAqC,SAArC,SAAqC;AAAA,QAA1B,WAA0B,SAA1B,WAA0B;AAAA,QAAb,SAAa,SAAb,SAAa;;AAC3D,QAAI,gBAAgB,OAAhB,IAA2B,gBAAgB,KAA/C,EAAsD;AACpD,aAAO,IAAP;AACD;;AAED,QAAI,uBAAJ;;AAEA,0BAA0B,MAAM,YAAhC,yHAA8C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAAnC,WAAmC;;AAC5C,UAAI,YAAY,WAAZ,KAA4B,WAAhC,EAA6C;AAC3C;AACA,YAAI,YAAY,UAAZ,IAA0B,CAAC,MAAM,QAAN,CAAe,YAAY,UAA3B,EAAuC,SAAvC,CAA/B,EAAkF;AAAE;AAAW;;AAE/F;AACA,YAAI,YAAY,WAAZ,EAAJ,EAA+B;AAC7B,iBAAO,WAAP;AACD;AACD;AAHA,aAIK,IAAI,CAAC,cAAL,EAAqB;AACxB,6BAAiB,WAAjB;AACD;AACF;AACF;;AAED;AACA;AACA,QAAI,cAAJ,EAAoB;AAClB,aAAO,cAAP;AACD;;AAED;AACA;AACA;AACA,0BAA0B,MAAM,YAAhC,yHAA8C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAAnC,YAAmC;;AAC5C,UAAI,aAAY,WAAZ,KAA4B,WAA5B,IAA2C,EAAE,QAAQ,IAAR,CAAa,SAAb,KAA2B,aAAY,UAAzC,CAA/C,EAAqG;AACnG,eAAO,YAAP;AACD;AACF;;AAED,WAAO,IAAP;AACD,GAjFY;;AAmFb;AACA,cAAY,2BAAyB;AAAA,QAAb,SAAa,SAAb,SAAa;;AACnC,0BAA0B,MAAM,YAAhC,yHAA8C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAAnC,WAAmC;;AAC5C,UAAI,MAAM,QAAN,CAAe,YAAY,UAA3B,EAAuC,SAAvC,CAAJ,EAAuD;AACrD,eAAO,WAAP;AACD;AACF;AACF,GA1FY;;AA4Fb;AACA,QAAM,qBAA2B;AAAA,QAAf,WAAe,SAAf,WAAe;;AAC/B,0BAA0B,MAAM,YAAhC,yHAA8C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAAnC,WAAmC;;AAC5C;AACA,UAAI,YAAY,UAAZ,CAAuB,MAAvB,KAAkC,CAAtC,EAAyC;AACvC,YAAM,SAAS,YAAY,MAA3B;AACA;AACA;AACA,YAAI,UAAU,CAAC,OAAO,OAAP,CAAe,OAAf,CAAuB,OAAtC,EAA+C;AAC7C;AACD;AACF;AACD;AARA,WASK,IAAI,YAAY,UAAZ,CAAuB,MAAvB,IAAiC,CAArC,EAAwC;AAC3C;AACD;;AAED,UAAI,CAAC,YAAY,WAAZ,EAAD,IAA+B,gBAAgB,YAAY,WAA/D,EAA6E;AAC3E,eAAO,WAAP;AACD;AACF;;AAED,WAAO,IAAP;AACD;AAnHY,CAAf;;AAsHA,OAAO,OAAP,GAAiB,MAAjB;;;;;;;ACzHA,IAAM,MAAa,QAAQ,UAAR,CAAnB;AACA,IAAM,WAAa,QAAQ,YAAR,CAAnB;;AAEA,IAAM,KAAK;AACT,SAAU,iBAAM,CAAE,CADT;;AAGT,UAAU;AAAA,WAAS,UAAU,IAAI,MAAd,IAAwB,SAAS,KAAT,CAAjC;AAAA,GAHD;;AAKT,WAAU;AAAA,WAAS,GAAG,MAAH,CAAU,KAAV,KAAoB,MAAM,QAAN,KAAmB,EAAhD;AAAA,GALD;;AAOT,UAAU;AAAA,WAAS,CAAC,CAAC,KAAF,IAAY,QAAO,KAAP,yCAAO,KAAP,OAAiB,QAAtC;AAAA,GAPD;;AAST,YAAU;AAAA,WAAS,OAAO,KAAP,KAAiB,UAA1B;AAAA,GATD;;AAWT,UAAU;AAAA,WAAS,OAAO,KAAP,KAAiB,QAA1B;AAAA,GAXD;;AAaT,QAAU;AAAA,WAAS,OAAO,KAAP,KAAiB,SAA1B;AAAA,GAbD;;AAeT,UAAU;AAAA,WAAS,OAAO,KAAP,KAAiB,QAA1B;AAAA,GAfD;;AAiBT,WAAS,wBAAS;AAChB,QAAI,CAAC,KAAD,IAAW,QAAO,KAAP,yCAAO,KAAP,OAAiB,QAAhC,EAA2C;AAAE,aAAO,KAAP;AAAe;;AAE5D,QAAM,UAAU,IAAI,SAAJ,CAAc,KAAd,KAAwB,IAAI,MAA5C;;AAEA,WAAQ,mBAAkB,IAAlB,SAA8B,QAAQ,OAAtC,KACJ,iBAAiB,QAAQ,OADrB,CAC6B;AAD7B,QAEJ,MAAM,QAAN,KAAmB,CAAnB,IAAwB,OAAO,MAAM,QAAb,KAA0B;AAFtD;AAGD;AAzBQ,CAAX;;AA4BA,GAAG,KAAH,GAAW;AAAA,SAAU,GAAG,MAAH,CAAU,KAAV,KACf,OAAO,MAAM,MAAb,KAAwB,WADT,IAEhB,GAAG,QAAH,CAAY,MAAM,MAAlB,CAFM;AAAA,CAAX;;AAIA,OAAO,OAAP,GAAiB,EAAjB;;;;;ACnCA,OAAO,OAAP,GAAiB,UAAC,KAAD;AAAA,SAAW,CAAC,EAAE,SAAS,MAAM,MAAjB,CAAD,IAA8B,iBAAiB,MAAM,MAAhE;AAAA,CAAjB;;;;;ACAA,SAAS,aAAT,CAAwB,IAAxB,EAA8B,MAA9B,EAAsC;AACpC,OAAK,IAAM,IAAX,IAAmB,MAAnB,EAA2B;AACzB,QAAM,kBAAkB,OAAO,OAAP,CAAe,eAAvC;AACA,QAAI,aAAa,KAAjB;;AAEA;AACA,SAAK,IAAM,MAAX,IAAqB,eAArB,EAAsC;AACpC,UAAI,KAAK,OAAL,CAAa,MAAb,MAAyB,CAAzB,IAA8B,gBAAgB,MAAhB,EAAwB,IAAxB,CAA6B,IAA7B,CAAlC,EAAsE;AACpE,qBAAa,IAAb;AACA;AACD;AACF;;AAED,QAAI,CAAC,UAAD,IAAe,OAAO,OAAO,IAAP,CAAP,KAAwB,UAA3C,EAAuD;AACrD,WAAK,IAAL,IAAa,OAAO,IAAP,CAAb;AACD;AACF;AACD,SAAO,IAAP;AACD;;AAED,cAAc,eAAd,GAAgC;AAC9B,UAAQ;AADsB,CAAhC;;AAIA,OAAO,OAAP,GAAiB,aAAjB;;;;;ACxBA,IAAM,QAAgB,QAAQ,SAAR,CAAtB;AACA,IAAM,UAAgB,QAAQ,WAAR,CAAtB;AACA,IAAM,MAAgB,QAAQ,cAAR,CAAtB;AACA,IAAM,WAAgB,QAAQ,YAAR,CAAtB;AACA,IAAM,aAAgB,QAAQ,cAAR,CAAtB;AACA,IAAM,KAAgB,QAAQ,MAAR,CAAtB;AACA,IAAM,gBAAgB,QAAQ,iBAAR,CAAtB;;AAEA,IAAM,eAAe;AACnB,cAAY,oBAAU,IAAV,EAAgB,GAAhB,EAAqB;AAC/B,SAAK,IAAL,GAAY,KAAK,IAAL,IAAa,EAAzB;AACA,SAAK,IAAL,CAAU,CAAV,GAAc,IAAI,IAAJ,CAAS,CAAvB;AACA,SAAK,IAAL,CAAU,CAAV,GAAc,IAAI,IAAJ,CAAS,CAAvB;;AAEA,SAAK,MAAL,GAAc,KAAK,MAAL,IAAe,EAA7B;AACA,SAAK,MAAL,CAAY,CAAZ,GAAgB,IAAI,MAAJ,CAAW,CAA3B;AACA,SAAK,MAAL,CAAY,CAAZ,GAAgB,IAAI,MAAJ,CAAW,CAA3B;;AAEA,SAAK,SAAL,GAAiB,IAAI,SAArB;AACD,GAXkB;;AAanB,kBAAgB,wBAAU,SAAV,EAAqB,IAArB,EAA2B,GAA3B,EAAgC;AAC9C,cAAU,IAAV,CAAe,CAAf,GAAsB,IAAI,IAAJ,CAAS,CAAT,GAAgB,KAAK,IAAL,CAAU,CAAhD;AACA,cAAU,IAAV,CAAe,CAAf,GAAsB,IAAI,IAAJ,CAAS,CAAT,GAAgB,KAAK,IAAL,CAAU,CAAhD;AACA,cAAU,MAAV,CAAiB,CAAjB,GAAsB,IAAI,MAAJ,CAAW,CAAX,GAAgB,KAAK,MAAL,CAAY,CAAlD;AACA,cAAU,MAAV,CAAiB,CAAjB,GAAsB,IAAI,MAAJ,CAAW,CAAX,GAAgB,KAAK,MAAL,CAAY,CAAlD;AACA,cAAU,SAAV,GAAsB,IAAI,SAAJ,GAAgB,KAAK,SAA3C;;AAEA;AACA,QAAM,KAAK,KAAK,GAAL,CAAS,UAAU,SAAV,GAAsB,IAA/B,EAAqC,KAArC,CAAX;;AAEA,cAAU,IAAV,CAAe,KAAf,GAAyB,MAAM,UAAU,IAAV,CAAe,CAArB,EAAwB,UAAU,IAAV,CAAe,CAAvC,IAA4C,EAArE;AACA,cAAU,IAAV,CAAe,EAAf,GAAyB,UAAU,IAAV,CAAe,CAAf,GAAmB,EAA5C;AACA,cAAU,IAAV,CAAe,EAAf,GAAyB,UAAU,IAAV,CAAe,CAAf,GAAmB,EAA5C;;AAEA,cAAU,MAAV,CAAiB,KAAjB,GAAyB,MAAM,UAAU,MAAV,CAAiB,CAAvB,EAA0B,UAAU,IAAV,CAAe,CAAzC,IAA8C,EAAvE;AACA,cAAU,MAAV,CAAiB,EAAjB,GAAyB,UAAU,MAAV,CAAiB,CAAjB,GAAqB,EAA9C;AACA,cAAU,MAAV,CAAiB,EAAjB,GAAyB,UAAU,MAAV,CAAiB,CAAjB,GAAqB,EAA9C;AACD,GA9BkB;;AAgCnB,mBAAiB,yBAAW,OAAX,EAAoB;AACnC,WAAQ,mBAAmB,IAAI,KAAvB,IAAgC,mBAAmB,IAAI,KAA/D;AACD,GAlCkB;;AAoCnB;AACA,SAAO,eAAU,IAAV,EAAgB,OAAhB,EAAyB,EAAzB,EAA6B;AAClC,SAAK,MAAM,EAAX;AACA,WAAO,QAAQ,MAAf;;AAEA,OAAG,CAAH,GAAO,QAAQ,OAAO,GAAf,CAAP;AACA,OAAG,CAAH,GAAO,QAAQ,OAAO,GAAf,CAAP;;AAEA,WAAO,EAAP;AACD,GA7CkB;;AA+CnB,aAAW,mBAAU,OAAV,EAAmB,IAAnB,EAAyB;AAClC,WAAO,QAAQ,EAAf;;AAEA;AACA,QAAI,QAAQ,aAAR,IAAyB,aAAa,eAAb,CAA6B,OAA7B,CAA7B,EAAoE;AAClE,mBAAa,KAAb,CAAmB,QAAnB,EAA6B,OAA7B,EAAsC,IAAtC;;AAEA,WAAK,CAAL,IAAU,OAAO,OAAjB;AACA,WAAK,CAAL,IAAU,OAAO,OAAjB;AACD,KALD,MAMK;AACH,mBAAa,KAAb,CAAmB,MAAnB,EAA2B,OAA3B,EAAoC,IAApC;AACD;;AAED,WAAO,IAAP;AACD,GA9DkB;;AAgEnB,eAAa,qBAAU,OAAV,EAAmB,MAAnB,EAA2B;AACtC,aAAS,UAAU,EAAnB;;AAEA,QAAI,QAAQ,aAAR,IAAyB,aAAa,eAAb,CAA6B,OAA7B,CAA7B,EAAoE;AAClE;AACA,mBAAa,KAAb,CAAmB,QAAnB,EAA6B,OAA7B,EAAsC,MAAtC;AACD,KAHD,MAIK;AACH,mBAAa,KAAb,CAAmB,QAAnB,EAA6B,OAA7B,EAAsC,MAAtC;AACD;;AAED,WAAO,MAAP;AACD,GA5EkB;;AA8EnB,gBAAc,sBAAU,OAAV,EAAmB;AAC/B,WAAO,GAAG,MAAH,CAAU,QAAQ,SAAlB,IAA8B,QAAQ,SAAtC,GAAkD,QAAQ,UAAjE;AACD,GAhFkB;;AAkFnB,aAAW,mBAAU,SAAV,EAAqB,QAArB,EAA+B,SAA/B,EAA0C;AACnD,QAAM,UAAW,SAAS,MAAT,GAAkB,CAAlB,GACE,aAAa,cAAb,CAA4B,QAA5B,CADF,GAEE,SAAS,CAAT,CAFnB;;AAIA,QAAM,QAAQ,EAAd;;AAEA,iBAAa,SAAb,CAAuB,OAAvB,EAAgC,KAAhC;AACA,cAAU,IAAV,CAAe,CAAf,GAAmB,MAAM,CAAzB;AACA,cAAU,IAAV,CAAe,CAAf,GAAmB,MAAM,CAAzB;;AAEA,iBAAa,WAAb,CAAyB,OAAzB,EAAkC,KAAlC;AACA,cAAU,MAAV,CAAiB,CAAjB,GAAqB,MAAM,CAA3B;AACA,cAAU,MAAV,CAAiB,CAAjB,GAAqB,MAAM,CAA3B;;AAEA,cAAU,SAAV,GAAsB,GAAG,MAAH,CAAU,SAAV,IAAuB,SAAvB,GAAkC,IAAI,IAAJ,GAAW,OAAX,EAAxD;AACD,GAlGkB;;AAoGnB,iBAAe,aApGI;;AAsGnB,gBAAc,sBAAU,KAAV,EAAiB;AAC7B,QAAM,UAAU,EAAhB;;AAEA;AACA,QAAI,GAAG,KAAH,CAAS,KAAT,CAAJ,EAAqB;AACnB,cAAQ,CAAR,IAAa,MAAM,CAAN,CAAb;AACA,cAAQ,CAAR,IAAa,MAAM,CAAN,CAAb;AACD;AACD;AAJA,SAKK;AACH,YAAI,MAAM,IAAN,KAAe,UAAnB,EAA+B;AAC7B,cAAI,MAAM,OAAN,CAAc,MAAd,KAAyB,CAA7B,EAAgC;AAC9B,oBAAQ,CAAR,IAAa,MAAM,OAAN,CAAc,CAAd,CAAb;AACA,oBAAQ,CAAR,IAAa,MAAM,cAAN,CAAqB,CAArB,CAAb;AACD,WAHD,MAIK,IAAI,MAAM,OAAN,CAAc,MAAd,KAAyB,CAA7B,EAAgC;AACnC,oBAAQ,CAAR,IAAa,MAAM,cAAN,CAAqB,CAArB,CAAb;AACA,oBAAQ,CAAR,IAAa,MAAM,cAAN,CAAqB,CAArB,CAAb;AACD;AACF,SATD,MAUK;AACH,kBAAQ,CAAR,IAAa,MAAM,OAAN,CAAc,CAAd,CAAb;AACA,kBAAQ,CAAR,IAAa,MAAM,OAAN,CAAc,CAAd,CAAb;AACD;AACF;;AAED,WAAO,OAAP;AACD,GAjIkB;;AAmInB,kBAAgB,wBAAU,QAAV,EAAoB;AAClC,QAAM,UAAU;AACd,aAAS,CADK;AAEd,aAAS,CAFK;AAGd,eAAS,CAHK;AAId,eAAS,CAJK;AAKd,eAAS,CALK;AAMd,eAAS;AANK,KAAhB;;AASA,yBAAsB,QAAtB,kHAAgC;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAArB,OAAqB;;AAC9B,WAAK,IAAM,KAAX,IAAmB,OAAnB,EAA4B;AAC1B,gBAAQ,KAAR,KAAiB,QAAQ,KAAR,CAAjB;AACD;AACF;AACD,SAAK,IAAM,IAAX,IAAmB,OAAnB,EAA4B;AAC1B,cAAQ,IAAR,KAAiB,SAAS,MAA1B;AACD;;AAED,WAAO,OAAP;AACD,GAvJkB;;AAyJnB,aAAW,mBAAU,KAAV,EAAiB;AAC1B,QAAI,CAAC,MAAM,MAAP,IAAiB,EAAE,MAAM,OAAN,IAAiB,MAAM,OAAN,CAAc,MAAd,GAAuB,CAA1C,CAArB,EAAmE;AACjE;AACD;;AAED,QAAM,UAAU,aAAa,YAAb,CAA0B,KAA1B,CAAhB;AACA,QAAM,OAAO,KAAK,GAAL,CAAS,QAAQ,CAAR,EAAW,KAApB,EAA2B,QAAQ,CAAR,EAAW,KAAtC,CAAb;AACA,QAAM,OAAO,KAAK,GAAL,CAAS,QAAQ,CAAR,EAAW,KAApB,EAA2B,QAAQ,CAAR,EAAW,KAAtC,CAAb;AACA,QAAM,OAAO,KAAK,GAAL,CAAS,QAAQ,CAAR,EAAW,KAApB,EAA2B,QAAQ,CAAR,EAAW,KAAtC,CAAb;AACA,QAAM,OAAO,KAAK,GAAL,CAAS,QAAQ,CAAR,EAAW,KAApB,EAA2B,QAAQ,CAAR,EAAW,KAAtC,CAAb;;AAEA,WAAO;AACL,SAAG,IADE;AAEL,SAAG,IAFE;AAGL,YAAM,IAHD;AAIL,WAAK,IAJA;AAKL,aAAO,OAAO,IALT;AAML,cAAQ,OAAO;AANV,KAAP;AAQD,GA5KkB;;AA8KnB,iBAAe,uBAAU,KAAV,EAAiB,WAAjB,EAA8B;AAC3C,QAAM,UAAU,cAAc,GAA9B;AACA,QAAM,UAAU,cAAc,GAA9B;AACA,QAAM,UAAU,aAAa,YAAb,CAA0B,KAA1B,CAAhB;;AAGA,QAAM,KAAK,QAAQ,CAAR,EAAW,OAAX,IAAsB,QAAQ,CAAR,EAAW,OAAX,CAAjC;AACA,QAAM,KAAK,QAAQ,CAAR,EAAW,OAAX,IAAsB,QAAQ,CAAR,EAAW,OAAX,CAAjC;;AAEA,WAAO,MAAM,EAAN,EAAU,EAAV,CAAP;AACD,GAxLkB;;AA0LnB,cAAY,oBAAU,KAAV,EAAiB,SAAjB,EAA4B,WAA5B,EAAyC;AACnD,QAAM,UAAU,cAAc,GAA9B;AACA,QAAM,UAAU,cAAc,GAA9B;AACA,QAAM,UAAU,aAAa,YAAb,CAA0B,KAA1B,CAAhB;AACA,QAAM,KAAK,QAAQ,CAAR,EAAW,OAAX,IAAsB,QAAQ,CAAR,EAAW,OAAX,CAAjC;AACA,QAAM,KAAK,QAAQ,CAAR,EAAW,OAAX,IAAsB,QAAQ,CAAR,EAAW,OAAX,CAAjC;AACA,QAAM,QAAQ,MAAM,KAAK,KAAL,CAAW,EAAX,EAAgB,EAAhB,CAAN,GAA4B,KAAK,EAA/C;;AAEA,WAAQ,KAAR;AACD,GAnMkB;;AAqMnB,kBAAgB,wBAAU,OAAV,EAAmB;AACjC,WAAO,GAAG,MAAH,CAAU,QAAQ,WAAlB,IACH,QAAQ,WADL,GAEH,GAAG,MAAH,CAAU,QAAQ,WAAlB,IACE,CAAC,SAAD,EAAY,SAAZ,EAAsB,OAAtB,EAA+B,KAA/B,EAAsC,OAAtC,EAA+C,QAAQ,WAAvD;AACA;AACA;AAHF,MAII,QAAQ,IAAR,CAAa,QAAQ,IAArB,KAA8B,mBAAmB,WAAW,KAA5D,GACE,OADF,GAEE,OARV;AASD,GA/MkB;;AAiNnB;AACA,mBAAiB,yBAAU,KAAV,EAAiB;AAChC,WAAO,CACL,SAAS,gBAAT,CAA0B,MAAM,IAAN,GAAa,MAAM,IAAN,CAAW,CAAX,CAAb,GAA6B,MAAM,MAA7D,CADK,EAEL,SAAS,gBAAT,CAA0B,MAAM,aAAhC,CAFK,CAAP;AAID;AAvNkB,CAArB;;AA0NA,OAAO,OAAP,GAAiB,YAAjB;;;;;eClOmB,QAAQ,UAAR,C;IAAX,M,YAAA,M;;AAER,IAAM,UAAU,CAAC,IAAD,EAAO,KAAP,EAAc,QAAd,EAAwB,GAAxB,CAAhB;AACA,IAAI,WAAW,CAAf;AACA,IAAI,gBAAJ;AACA,IAAI,eAAJ;;AAEA,KAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,QAAQ,MAAZ,IAAsB,CAAC,OAAO,qBAA9C,EAAqE,GAArE,EAA0E;AACxE,YAAU,OAAO,QAAQ,CAAR,IAAa,uBAApB,CAAV;AACA,WAAS,OAAO,QAAQ,CAAR,IAAY,sBAAnB,KAA8C,OAAO,QAAQ,CAAR,IAAa,6BAApB,CAAvD;AACD;;AAED,IAAI,CAAC,OAAL,EAAc;AACZ,YAAU,iBAAU,QAAV,EAAoB;AAC5B,QAAM,WAAW,IAAI,IAAJ,GAAW,OAAX,EAAjB;AACA,QAAM,aAAa,KAAK,GAAL,CAAS,CAAT,EAAY,MAAM,WAAW,QAAjB,CAAZ,CAAnB;AACA,QAAM,KAAK,WAAW,YAAY;AAAE,eAAS,WAAW,UAApB;AAAkC,KAA3D,EACW,UADX,CAAX;;AAGA,eAAW,WAAW,UAAtB;AACA,WAAO,EAAP;AACD,GARD;AASD;;AAED,IAAI,CAAC,MAAL,EAAa;AACX,WAAS,gBAAU,EAAV,EAAc;AACrB,iBAAa,EAAb;AACD,GAFD;AAGD;;AAED,OAAO,OAAP,GAAiB;AACf,kBADe;AAEf;AAFe,CAAjB;;;;;AC9BA,IAAM,SAAS,QAAQ,UAAR,CAAf;AACA,IAAM,KAAK,QAAQ,MAAR,CAAX;;eAKI,QAAQ,YAAR,C;IAHF,O,YAAA,O;IACA,U,YAAA,U;IACA,c,YAAA,c;;AAGF,IAAM,YAAY;AAChB,yBAAuB,+BAAU,KAAV,EAAiB,YAAjB,EAA+B,OAA/B,EAAwC;AAC7D,QAAI,CAAC,GAAG,MAAH,CAAU,KAAV,CAAL,EAAuB;AACrB,aAAO,IAAP;AACD;;AAED,QAAI,UAAU,QAAd,EAAwB;AACtB,cAAQ,WAAW,OAAX,CAAR;AACD,KAFD,MAGK,IAAI,UAAU,MAAd,EAAsB;AACzB,cAAQ,aAAa,OAAb,CAAqB,OAArB,CAAR;AACD,KAFI,MAGA;AACH,cAAQ,QAAQ,OAAR,EAAiB,KAAjB,CAAR;AACD;;AAED,WAAO,KAAP;AACD,GAjBe;;AAmBhB,mBAAiB,yBAAU,KAAV,EAAiB,YAAjB,EAA+B,OAA/B,EAAwC,YAAxC,EAAsD;AACrE,YAAQ,UAAU,qBAAV,CAAgC,KAAhC,EAAuC,YAAvC,EAAqD,OAArD,KAAiE,KAAzE;;AAEA,QAAI,GAAG,QAAH,CAAY,KAAZ,CAAJ,EAAwB;AACtB,cAAQ,MAAM,KAAN,CAAY,IAAZ,EAAkB,YAAlB,CAAR;AACD;;AAED,QAAI,GAAG,OAAH,CAAW,KAAX,CAAJ,EAAuB;AACrB,cAAQ,eAAe,KAAf,CAAR;AACD;;AAED,WAAO,KAAP;AACD,GA/Be;;AAiChB,YAAU,kBAAU,IAAV,EAAgB;AACxB,WAAQ,QAAQ;AACd,SAAG,OAAO,IAAP,GAAc,KAAK,CAAnB,GAAuB,KAAK,IADjB;AAEd,SAAG,OAAO,IAAP,GAAc,KAAK,CAAnB,GAAuB,KAAK;AAFjB,KAAhB;AAID,GAtCe;;AAwChB,cAAY,oBAAU,IAAV,EAAgB;AAC1B,QAAI,QAAQ,EAAE,UAAU,IAAV,IAAkB,SAAS,IAA7B,CAAZ,EAAgD;AAC9C,aAAO,OAAO,EAAP,EAAW,IAAX,CAAP;;AAEA,WAAK,IAAL,GAAc,KAAK,CAAL,IAAU,CAAxB;AACA,WAAK,GAAL,GAAc,KAAK,CAAL,IAAU,CAAxB;AACA,WAAK,KAAL,GAAc,KAAK,KAAL,IAAiB,KAAK,IAAL,GAAY,KAAK,KAAhD;AACA,WAAK,MAAL,GAAc,KAAK,MAAL,IAAiB,KAAK,GAAL,GAAW,KAAK,MAA/C;AACD;;AAED,WAAO,IAAP;AACD,GAnDe;;AAqDhB,cAAY,oBAAU,IAAV,EAAgB;AAC1B,QAAI,QAAQ,EAAE,OAAO,IAAP,IAAe,OAAO,IAAxB,CAAZ,EAA2C;AACzC,aAAO,OAAO,EAAP,EAAW,IAAX,CAAP;;AAEA,WAAK,CAAL,GAAc,KAAK,IAAL,IAAa,CAA3B;AACA,WAAK,GAAL,GAAc,KAAK,GAAL,IAAa,CAA3B;AACA,WAAK,KAAL,GAAc,KAAK,KAAL,IAAgB,KAAK,KAAL,GAAc,KAAK,CAAjD;AACA,WAAK,MAAL,GAAc,KAAK,MAAL,IAAgB,KAAK,MAAL,GAAc,KAAK,CAAjD;AACD;;AAED,WAAO,IAAP;AACD;AAhEe,CAAlB;;AAmEA,OAAO,OAAP,GAAiB,SAAjB;;;;;AC3EA,IAAM,MAAM,OAAO,OAAnB;AACA,IAAM,WAAW,QAAQ,YAAR,CAAjB;;AAEA,SAAS,IAAT,CAAe,MAAf,EAAuB;AACrB;;AAEA,MAAI,UAAJ,GAAiB,MAAjB;;AAEA;AACA,MAAM,KAAK,OAAO,QAAP,CAAgB,cAAhB,CAA+B,EAA/B,CAAX;;AAEA;AACA,MAAI,GAAG,aAAH,KAAqB,OAAO,QAA5B,IACG,OAAO,OAAO,IAAd,KAAuB,UAD1B,IAEC,OAAO,IAAP,CAAY,EAAZ,MAAoB,EAFzB,EAE6B;AAC3B;AACA,aAAS,OAAO,IAAP,CAAY,MAAZ,CAAT;AACD;;AAED,MAAI,MAAJ,GAAa,MAAb;AACD;;AAED,IAAI,OAAO,MAAP,KAAkB,WAAtB,EAAmC;AACjC,MAAI,MAAJ,GAAiB,SAAjB;AACA,MAAI,UAAJ,GAAiB,SAAjB;AACD,CAHD,MAIK;AACH,OAAK,MAAL;AACD;;AAED,IAAI,SAAJ,GAAgB,SAAS,SAAT,CAAoB,IAApB,EAA0B;AACxC,MAAI,SAAS,IAAT,CAAJ,EAAoB;AAClB,WAAO,IAAP;AACD;;AAED,MAAM,WAAY,KAAK,aAAL,IAAsB,IAAxC;;AAEA,SAAO,SAAS,WAAT,IAAwB,SAAS,YAAjC,IAAiD,IAAI,MAA5D;AACD,CARD;;AAUA,IAAI,IAAJ,GAAW,IAAX","file":"interact.js","sourceRoot":"","sourcesContent":["/**\n * interact.js v1.3.0-alpha.4+sha.7970416-dirty\n *\n * Copyright (c) 2012-2017 Taye Adeyemi \n * Open source under the MIT License.\n * https://raw.github.com/taye/interact.js/master/LICENSE\n */\n","(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o 150) {\n return null;\n }\n\n let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI;\n const overlap = 22.5;\n\n if (angle < 0) {\n angle += 360;\n }\n\n const left = 135 - overlap <= angle && angle < 225 + overlap;\n const up = 225 - overlap <= angle && angle < 315 + overlap;\n\n const right = !left && (315 - overlap <= angle || angle < 45 + overlap);\n const down = !up && 45 - overlap <= angle && angle < 135 + overlap;\n\n return {\n up,\n down,\n left,\n right,\n angle,\n speed: interaction.prevEvent.speed,\n velocity: {\n x: interaction.prevEvent.velocityX,\n y: interaction.prevEvent.velocityY,\n },\n };\n }\n\n preventDefault () {}\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n}\n\nsignals.on('set-delta', function ({ iEvent, interaction, starting, deltaSource }) {\n const prevEvent = starting? iEvent : interaction.prevEvent;\n\n if (deltaSource === 'client') {\n iEvent.dx = iEvent.clientX - prevEvent.clientX;\n iEvent.dy = iEvent.clientY - prevEvent.clientY;\n }\n else {\n iEvent.dx = iEvent.pageX - prevEvent.pageX;\n iEvent.dy = iEvent.pageY - prevEvent.pageY;\n }\n});\n\nInteractEvent.signals = signals;\n\nmodule.exports = InteractEvent;\n","const is = require('./utils/is');\nconst events = require('./utils/events');\nconst extend = require('./utils/extend');\nconst actions = require('./actions/base');\nconst scope = require('./scope');\nconst Eventable = require('./Eventable');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nconst {\n getElementRect,\n nodeContains,\n trySelector,\n} = require('./utils/domUtils');\nconst { getWindow } = require('./utils/window');\nconst { indexOf, contains } = require('./utils/arr');\nconst { wheelEvent } = require('./utils/browser');\n\n// all set interactables\nscope.interactables = [];\n\n/*\\\n * Interactable\n [ property ]\n **\n * Object type returned by @interact\n\\*/\nclass Interactable {\n constructor (target, options) {\n options = options || {};\n\n this.target = target;\n this.events = new Eventable();\n this._context = options.context || scope.document;\n this._win = getWindow(trySelector(target)? this._context : target);\n this._doc = this._win.document;\n\n signals.fire('new', {\n target,\n options,\n interactable: this,\n win: this._win,\n });\n\n scope.addDocument( this._doc, this._win );\n\n scope.interactables.push(this);\n\n this.set(options);\n }\n\n setOnEvents (action, phases) {\n const onAction = 'on' + action;\n\n if (is.function(phases.onstart) ) { this.events[onAction + 'start' ] = phases.onstart ; }\n if (is.function(phases.onmove) ) { this.events[onAction + 'move' ] = phases.onmove ; }\n if (is.function(phases.onend) ) { this.events[onAction + 'end' ] = phases.onend ; }\n if (is.function(phases.oninertiastart)) { this.events[onAction + 'inertiastart' ] = phases.oninertiastart ; }\n\n return this;\n }\n\n setPerAction (action, options) {\n // for all the default per-action options\n for (const option in options) {\n // if this option exists for this action\n if (option in defaults[action]) {\n // if the option in the options arg is an object value\n if (is.object(options[option])) {\n // duplicate the object\n this.options[action][option] = extend(this.options[action][option] || {}, options[option]);\n\n if (is.object(defaults.perAction[option]) && 'enabled' in defaults.perAction[option]) {\n this.options[action][option].enabled = options[option].enabled === false? false : true;\n }\n }\n else if (is.bool(options[option]) && is.object(defaults.perAction[option])) {\n this.options[action][option].enabled = options[option];\n }\n else if (options[option] !== undefined) {\n // or if it's not undefined, do a plain assignment\n this.options[action][option] = options[option];\n }\n }\n }\n }\n\n /*\\\n * Interactable.getRect\n [ method ]\n *\n * The default function to get an Interactables bounding rect. Can be\n * overridden using @Interactable.rectChecker.\n *\n - element (Element) #optional The element to measure.\n = (object) The object's bounding rectangle.\n o {\n o top : 0,\n o left : 0,\n o bottom: 0,\n o right : 0,\n o width : 0,\n o height: 0\n o }\n \\*/\n getRect (element) {\n element = element || this.target;\n\n if (is.string(this.target) && !(is.element(element))) {\n element = this._context.querySelector(this.target);\n }\n\n return getElementRect(element);\n }\n\n /*\\\n * Interactable.rectChecker\n [ method ]\n *\n * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n - checker (function) #optional A function which returns this Interactable's bounding rectangle. See @Interactable.getRect\n = (function | object) The checker function or this Interactable\n \\*/\n rectChecker (checker) {\n if (is.function(checker)) {\n this.getRect = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.getRect;\n\n return this;\n }\n\n return this.getRect;\n }\n\n _backCompatOption (optionName, newValue) {\n if (trySelector(newValue) || is.object(newValue)) {\n this.options[optionName] = newValue;\n\n for (const action of actions.names) {\n this.options[action][optionName] = newValue;\n }\n\n return this;\n }\n\n return this.options[optionName];\n }\n\n /*\\\n * Interactable.origin\n [ method ]\n *\n * Gets or sets the origin of the Interactable's element. The x and y\n * of the origin will be subtracted from action event coordinates.\n *\n - origin (object | string) #optional An object eg. { x: 0, y: 0 } or string 'parent', 'self' or any CSS selector\n * OR\n - origin (Element) #optional An HTML or SVG Element whose rect will be used\n **\n = (object) The current origin or this Interactable\n \\*/\n origin (newValue) {\n return this._backCompatOption('origin', newValue);\n }\n\n /*\\\n * Interactable.deltaSource\n [ method ]\n *\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n - newValue (string) #optional Use 'client' if you will be scrolling while interacting; Use 'page' if you want autoScroll to work\n = (string | object) The current deltaSource or this Interactable\n \\*/\n deltaSource (newValue) {\n if (newValue === 'page' || newValue === 'client') {\n this.options.deltaSource = newValue;\n\n return this;\n }\n\n return this.options.deltaSource;\n }\n\n /*\\\n * Interactable.context\n [ method ]\n *\n * Gets the selector context Node of the Interactable. The default is `window.document`.\n *\n = (Node) The context Node of this Interactable\n **\n \\*/\n context () {\n return this._context;\n }\n\n inContext (element) {\n return (this._context === element.ownerDocument\n || nodeContains(this._context, element));\n }\n\n /*\\\n * Interactable.fire\n [ method ]\n *\n * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n - iEvent (InteractEvent) The InteractEvent object to be fired on this Interactable\n = (Interactable) this Interactable\n \\*/\n fire (iEvent) {\n this.events.fire(iEvent);\n\n return this;\n }\n\n _onOffMultiple (method, eventType, listener, options) {\n if (is.string(eventType) && eventType.search(' ') !== -1) {\n eventType = eventType.trim().split(/ +/);\n }\n\n if (is.array(eventType)) {\n for (let i = 0; i < eventType.length; i++) {\n this[method](eventType[i], listener, options);\n }\n\n return true;\n }\n\n if (is.object(eventType)) {\n for (const prop in eventType) {\n this[method](prop, eventType[prop], listener);\n }\n\n return true;\n }\n }\n\n /*\\\n * Interactable.on\n [ method ]\n *\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n - eventType (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) This Interactable\n \\*/\n on (eventType, listener, options) {\n if (this._onOffMultiple('on', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.on(eventType, listener);\n }\n // delegated event for selector\n else if (is.string(this.target)) {\n events.addDelegate(this.target, this._context, eventType, listener, options);\n }\n else {\n events.add(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.off\n [ method ]\n *\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n - eventType (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) This Interactable\n \\*/\n off (eventType, listener, options) {\n if (this._onOffMultiple('off', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n // if it is an action event type\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.off(eventType, listener);\n }\n // delegated event\n else if (is.string(this.target)) {\n events.removeDelegate(this.target, this._context, eventType, listener, options);\n }\n // remove listener from this Interatable's element\n else {\n events.remove(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.set\n [ method ]\n *\n * Reset the options of this Interactable\n - options (object) The new settings to apply\n = (object) This Interactable\n \\*/\n set (options) {\n if (!is.object(options)) {\n options = {};\n }\n\n this.options = extend({}, defaults.base);\n\n const perActions = extend({}, defaults.perAction);\n\n for (const actionName in actions.methodDict) {\n const methodName = actions.methodDict[actionName];\n\n this.options[actionName] = extend({}, defaults[actionName]);\n\n this.setPerAction(actionName, perActions);\n\n this[methodName](options[actionName]);\n }\n\n for (const setting of Interactable.settingsMethods) {\n this.options[setting] = defaults.base[setting];\n\n if (setting in options) {\n this[setting](options[setting]);\n }\n }\n\n signals.fire('set', {\n options,\n interactable: this,\n });\n\n return this;\n }\n\n /*\\\n * Interactable.unset\n [ method ]\n *\n * Remove this interactable from the list of interactables and remove\n * it's action capabilities and event listeners\n *\n = (object) @interact\n \\*/\n unset () {\n events.remove(this.target, 'all');\n\n if (is.string(this.target)) {\n // remove delegated events\n for (const type in events.delegatedEvents) {\n const delegated = events.delegatedEvents[type];\n\n if (delegated.selectors[0] === this.target\n && delegated.contexts[0] === this._context) {\n\n delegated.selectors.splice(0, 1);\n delegated.contexts .splice(0, 1);\n delegated.listeners.splice(0, 1);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegated[type] = null;\n }\n }\n\n events.remove(this._context, type, events.delegateListener);\n events.remove(this._context, type, events.delegateUseCapture, true);\n }\n }\n else {\n events.remove(this, 'all');\n }\n\n signals.fire('unset', { interactable: this });\n\n scope.interactables.splice(indexOf(scope.interactables, this), 1);\n\n // Stop related interactions when an Interactable is unset\n for (const interaction of scope.interactions || []) {\n if (interaction.target === this && interaction.interacting()) {\n interaction.stop();\n }\n }\n\n return scope.interact;\n }\n}\n\nscope.interactables.indexOfElement = function indexOfElement (target, context) {\n context = context || scope.document;\n\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n if (interactable.target === target && interactable._context === context) {\n return i;\n }\n }\n return -1;\n};\n\nscope.interactables.get = function interactableGet (element, options, dontCheckInContext) {\n const ret = this[this.indexOfElement(element, options && options.context)];\n\n return ret && (is.string(element) || dontCheckInContext || ret.inContext(element))? ret : null;\n};\n\nscope.interactables.forEachSelector = function (callback, element) {\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n // skip non CSS selector targets and out of context elements\n if (!is.string(interactable.target)\n || (element && !interactable.inContext(element))) {\n continue;\n }\n\n const ret = callback(interactable, interactable.target, interactable._context, i, this);\n\n if (ret !== undefined) {\n return ret;\n }\n }\n};\n\n// all interact.js eventTypes\nInteractable.eventTypes = scope.eventTypes = [];\n\nInteractable.signals = signals;\n\nInteractable.settingsMethods = [ 'deltaSource', 'origin', 'preventDefault', 'rectChecker' ];\n\nmodule.exports = Interactable;\n","const scope = require('./scope');\nconst utils = require('./utils');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst domObjects = require('./utils/domObjects');\nconst finder = require('./utils/interactionFinder');\nconst signals = require('./utils/Signals').new();\n\nconst listeners = {};\nconst methodNames = [\n 'pointerDown', 'pointerMove', 'pointerUp',\n 'updatePointer', 'removePointer',\n];\n\n// for ignoring browser's simulated mouse events\nlet prevTouchTime = 0;\n\n// all active and idle interactions\nscope.interactions = [];\n\nclass Interaction {\n constructor ({ pointerType }) {\n this.target = null; // current interactable being interacted with\n this.element = null; // the target element of the interactable\n\n this.prepared = { // action that's ready to be fired on next move event\n name : null,\n axis : null,\n edges: null,\n };\n\n // keep track of added pointers\n this.pointers = [];\n this.pointerIds = [];\n this.downTargets = [];\n this.downTimes = [];\n\n // Previous native pointer move event coordinates\n this.prevCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n // current native pointer move event coordinates\n this.curCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Starting InteractEvent pointer coordinates\n this.startCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Change in coordinates and time of the pointer\n this.pointerDelta = {\n page : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n client : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n timeStamp: 0,\n };\n\n this.downEvent = null; // pointerdown/mousedown/touchstart event\n this.downPointer = {};\n\n this._eventTarget = null;\n this._curEventTarget = null;\n\n this.prevEvent = null; // previous action event\n\n this.pointerIsDown = false;\n this.pointerWasMoved = false;\n this._interacting = false;\n\n this.pointerType = pointerType;\n\n signals.fire('new', this);\n\n scope.interactions.push(this);\n }\n\n pointerDown (pointer, event, eventTarget) {\n const pointerIndex = this.updatePointer(pointer, event, true);\n\n signals.fire('down', {\n pointer,\n event,\n eventTarget,\n pointerIndex,\n interaction: this,\n });\n }\n\n /*\\\n * Interaction.start\n [ method ]\n *\n * Start an action with the given Interactable and Element as tartgets. The\n * action must be enabled for the target Interactable and an appropriate number\n * of pointers must be held down - 1 for drag/resize, 2 for gesture.\n *\n * Use it with `interactable.able({ manualStart: false })` to always\n * [start actions manually](https://github.com/taye/interact.js/issues/114)\n *\n - action (object) The action to be performed - drag, resize, etc.\n - target (Interactable) The Interactable to target\n - element (Element) The DOM Element to target\n = (object) interact\n **\n | interact(target)\n | .draggable({\n | // disable the default drag start by down->move\n | manualStart: true\n | })\n | // start dragging after the user holds the pointer down\n | .on('hold', function (event) {\n | var interaction = event.interaction;\n |\n | if (!interaction.interacting()) {\n | interaction.start({ name: 'drag' },\n | event.interactable,\n | event.currentTarget);\n | }\n | });\n \\*/\n start (action, target, element) {\n if (this.interacting()\n || !this.pointerIsDown\n || this.pointerIds.length < (action.name === 'gesture'? 2 : 1)) {\n return;\n }\n\n // if this interaction had been removed after stopping\n // add it back\n if (utils.indexOf(scope.interactions, this) === -1) {\n scope.interactions.push(this);\n }\n\n utils.copyAction(this.prepared, action);\n this.target = target;\n this.element = element;\n\n signals.fire('action-start', {\n interaction: this,\n event: this.downEvent,\n });\n }\n\n pointerMove (pointer, event, eventTarget) {\n if (!this.simulation) {\n this.updatePointer(pointer);\n utils.setCoords(this.curCoords, this.pointers);\n }\n\n const duplicateMove = (this.curCoords.page.x === this.prevCoords.page.x\n && this.curCoords.page.y === this.prevCoords.page.y\n && this.curCoords.client.x === this.prevCoords.client.x\n && this.curCoords.client.y === this.prevCoords.client.y);\n\n let dx;\n let dy;\n\n // register movement greater than pointerMoveTolerance\n if (this.pointerIsDown && !this.pointerWasMoved) {\n dx = this.curCoords.client.x - this.startCoords.client.x;\n dy = this.curCoords.client.y - this.startCoords.client.y;\n\n this.pointerWasMoved = utils.hypot(dx, dy) > Interaction.pointerMoveTolerance;\n }\n\n const signalArg = {\n pointer,\n pointerIndex: this.getPointerIndex(pointer),\n event,\n eventTarget,\n dx,\n dy,\n duplicate: duplicateMove,\n interaction: this,\n interactingBeforeMove: this.interacting(),\n };\n\n if (!duplicateMove) {\n // set pointer coordinate, time changes and speeds\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n }\n\n signals.fire('move', signalArg);\n\n if (!duplicateMove) {\n // if interacting, fire an 'action-move' signal etc\n if (this.interacting()) {\n this.doMove(signalArg);\n }\n\n if (this.pointerWasMoved) {\n utils.copyCoords(this.prevCoords, this.curCoords);\n }\n }\n }\n\n /*\\\n * Interaction.doMove\n [ method ]\n *\n * Force a move of the current action at the same coordinates. Useful if\n * snap/restrict has been changed and you want a movement with the new\n * settings.\n *\n **\n | interact(target)\n | .draggable(true)\n | .on('dragmove', function (event) {\n | if (someCondition) {\n | // change the snap settings\n | event.interactable.draggable({ snap: { targets: [] }});\n | // fire another move event with re-calculated snap\n | event.interaction.doMove();\n | }\n | });\n \\*/\n doMove (signalArg) {\n signalArg = utils.extend({\n pointer: this.pointers[0],\n event: this.prevEvent,\n eventTarget: this._eventTarget,\n interaction: this,\n }, signalArg || {});\n\n signals.fire('before-action-move', signalArg);\n\n if (!this._dontFireMove) {\n signals.fire('action-move', signalArg);\n }\n\n this._dontFireMove = false;\n }\n\n // End interact move events and stop auto-scroll unless simulation is running\n pointerUp (pointer, event, eventTarget, curEventTarget) {\n const pointerIndex = this.getPointerIndex(pointer);\n\n signals.fire(/cancel$/i.test(event.type)? 'cancel' : 'up', {\n pointer,\n pointerIndex,\n event,\n eventTarget,\n curEventTarget,\n interaction: this,\n });\n\n if (!this.simulation) {\n this.end(event);\n }\n\n this.pointerIsDown = false;\n this.removePointer(pointer, event);\n }\n\n /*\\\n * Interaction.end\n [ method ]\n *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n - event (PointerEvent) #optional\n **\n | interact(target)\n | .draggable(true)\n | .on('move', function (event) {\n | if (event.pageX > 1000) {\n | // end the current action\n | event.interaction.end();\n | // stop all further listeners from being called\n | event.stopImmediatePropagation();\n | }\n | });\n \\*/\n end (event) {\n event = event || this.prevEvent;\n\n if (this.interacting()) {\n signals.fire('action-end', {\n event,\n interaction: this,\n });\n }\n\n this.stop();\n }\n\n currentAction () {\n return this._interacting? this.prepared.name: null;\n }\n\n interacting () {\n return this._interacting;\n }\n\n stop () {\n signals.fire('stop', { interaction: this });\n\n if (this._interacting) {\n signals.fire('stop-active', { interaction: this });\n signals.fire('stop-' + this.prepared.name, { interaction: this });\n }\n\n this.target = this.element = null;\n\n this._interacting = false;\n this.prepared.name = this.prevEvent = null;\n }\n\n getPointerIndex (pointer) {\n // mouse and pen interactions may have only one pointer\n if (this.pointerType === 'mouse' || this.pointerType === 'pen') {\n return 0;\n }\n\n return utils.indexOf(this.pointerIds, utils.getPointerId(pointer));\n }\n\n updatePointer (pointer, event, down = event && /(down|start)$/i.test(event.type)) {\n const id = utils.getPointerId(pointer);\n let index = this.getPointerIndex(pointer);\n\n if (index === -1) {\n index = this.pointerIds.length;\n this.pointerIds[index] = id;\n }\n\n if (down) {\n signals.fire('update-pointer-down', {\n pointer,\n event,\n down,\n pointerId: id,\n pointerIndex: index,\n interaction: this,\n });\n }\n\n this.pointers[index] = pointer;\n\n return index;\n }\n\n removePointer (pointer, event) {\n const index = this.getPointerIndex(pointer);\n\n if (index === -1) { return; }\n\n signals.fire('remove-pointer', {\n pointer,\n event,\n pointerIndex: index,\n interaction: this,\n });\n\n this.pointers .splice(index, 1);\n this.pointerIds .splice(index, 1);\n this.downTargets.splice(index, 1);\n this.downTimes .splice(index, 1);\n }\n\n _updateEventTargets (target, currentTarget) {\n this._eventTarget = target;\n this._curEventTarget = currentTarget;\n }\n}\n\nfor (let i = 0, len = methodNames.length; i < len; i++) {\n const method = methodNames[i];\n\n listeners[method] = doOnInteractions(method);\n}\n\nfunction doOnInteractions (method) {\n return (function (event) {\n const pointerType = utils.getPointerType(event);\n const [eventTarget, curEventTarget] = utils.getEventTargets(event);\n const matches = []; // [ [pointer, interaction], ...]\n\n if (browser.supportsTouch && /touch/.test(event.type)) {\n prevTouchTime = new Date().getTime();\n\n for (let i = 0; i < event.changedTouches.length; i++) {\n const pointer = event.changedTouches[i];\n const interaction = finder.search(pointer, event.type, eventTarget);\n\n matches.push([pointer, interaction || new Interaction({ pointerType })]);\n }\n }\n else {\n let invalidPointer = false;\n\n if (!browser.supportsPointerEvent && /mouse/.test(event.type)) {\n // ignore mouse events while touch interactions are active\n for (let i = 0; i < scope.interactions.length && !invalidPointer; i++) {\n invalidPointer = scope.interactions[i].pointerType !== 'mouse' && scope.interactions[i].pointerIsDown;\n }\n\n // try to ignore mouse events that are simulated by the browser\n // after a touch event\n invalidPointer = invalidPointer\n || (new Date().getTime() - prevTouchTime < 500)\n // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated\n || event.timeStamp === 0;\n }\n\n if (!invalidPointer) {\n let interaction = finder.search(event, event.type, eventTarget);\n\n if (!interaction) {\n interaction = new Interaction({ pointerType });\n }\n\n matches.push([event, interaction]);\n }\n }\n\n for (const [pointer, interaction] of matches) {\n interaction._updateEventTargets(eventTarget, curEventTarget);\n interaction[method](pointer, event, eventTarget, curEventTarget);\n }\n });\n}\n\nfunction endAll (event) {\n for (let i = 0; i < scope.interactions.length; i++) {\n const interaction = scope.interactions[i];\n\n interaction.end(event);\n signals.fire('endall', { event, interaction });\n }\n}\n\nconst docEvents = { /* 'eventType': listenerFunc */ };\nconst pEventTypes = browser.pEventTypes;\n\nif (domObjects.PointerEvent) {\n docEvents[pEventTypes.down ] = listeners.pointerDown;\n docEvents[pEventTypes.move ] = listeners.pointerMove;\n docEvents[pEventTypes.up ] = listeners.pointerUp;\n docEvents[pEventTypes.cancel] = listeners.pointerUp;\n}\nelse {\n docEvents.mousedown = listeners.pointerDown;\n docEvents.mousemove = listeners.pointerMove;\n docEvents.mouseup = listeners.pointerUp;\n\n docEvents.touchstart = listeners.pointerDown;\n docEvents.touchmove = listeners.pointerMove;\n docEvents.touchend = listeners.pointerUp;\n docEvents.touchcancel = listeners.pointerUp;\n}\n\ndocEvents.blur = endAll;\n\nfunction onDocSignal ({ doc }, signalName) {\n const eventMethod = signalName.indexOf('add') === 0\n ? events.add : events.remove;\n\n // delegate event listener\n for (const eventType in scope.delegatedEvents) {\n eventMethod(doc, eventType, events.delegateListener);\n eventMethod(doc, eventType, events.delegateUseCapture, true);\n }\n\n for (const eventType in docEvents) {\n eventMethod(doc, eventType, docEvents[eventType]);\n }\n}\n\nsignals.on('update-pointer-down', ({ interaction, pointer, pointerId, pointerIndex, event, eventTarget, down }) => {\n interaction.pointerIds[pointerIndex] = pointerId;\n interaction.pointers[pointerIndex] = pointer;\n\n if (down) {\n interaction.pointerIsDown = true;\n }\n\n if (!interaction.interacting()) {\n utils.setCoords(interaction.startCoords, interaction.pointers);\n\n utils.copyCoords(interaction.curCoords , interaction.startCoords);\n utils.copyCoords(interaction.prevCoords, interaction.startCoords);\n\n interaction.downEvent = event;\n interaction.downTimes[pointerIndex] = interaction.curCoords.timeStamp;\n interaction.downTargets[pointerIndex] = eventTarget || event && utils.getEventTargets(event)[0];\n interaction.pointerWasMoved = false;\n\n utils.pointerExtend(interaction.downPointer, pointer);\n }\n});\n\nscope.signals.on('add-document' , onDocSignal);\nscope.signals.on('remove-document', onDocSignal);\n\nInteraction.pointerMoveTolerance = 1;\nInteraction.doOnInteractions = doOnInteractions;\nInteraction.endAll = endAll;\nInteraction.signals = signals;\nInteraction.docEvents = docEvents;\n\nscope.endAllInteractions = endAll;\n\nmodule.exports = Interaction;\n","const Interaction = require('../Interaction');\nconst InteractEvent = require('../InteractEvent');\n\nconst actions = {\n firePrepared,\n names: [],\n methodDict: {},\n};\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n interaction._interacting = true;\n firePrepared(interaction, event, 'start');\n});\n\nInteraction.signals.on('action-move', function ({ interaction, event, preEnd }) {\n firePrepared(interaction, event, 'move', preEnd);\n\n // if the action was ended in a listener\n if (!interaction.interacting()) { return false; }\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n firePrepared(interaction, event, 'end');\n});\n\nfunction firePrepared (interaction, event, phase, preEnd) {\n const actionName = interaction.prepared.name;\n\n const newEvent = new InteractEvent(interaction, event, actionName, phase, interaction.element, null, preEnd);\n\n interaction.target.fire(newEvent);\n interaction.prevEvent = newEvent;\n}\n\nmodule.exports = actions;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drag = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n startAxis : 'xy',\n lockAxis : 'xy',\n },\n\n checker: function (pointer, event, interactable) {\n const dragOptions = interactable.options.drag;\n\n return dragOptions.enabled\n ? { name: 'drag', axis: (dragOptions.lockAxis === 'start'\n ? dragOptions.startAxis\n : dragOptions.lockAxis)}\n : null;\n },\n\n getCursor: function () {\n return 'move';\n },\n};\n\nInteraction.signals.on('before-action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n interaction.curCoords.page.y = interaction.startCoords.page.y;\n interaction.curCoords.client.y = interaction.startCoords.client.y;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vx);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vx);\n interaction.pointerDelta.client.vy = 0;\n interaction.pointerDelta.page.vy = 0;\n }\n else if (axis === 'y') {\n interaction.curCoords.page.x = interaction.startCoords.page.x;\n interaction.curCoords.client.x = interaction.startCoords.client.x;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vy);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vy);\n interaction.pointerDelta.client.vx = 0;\n interaction.pointerDelta.page.vx = 0;\n }\n});\n\n// dragmove\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'dragmove') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n iEvent.pageY = interaction.startCoords.page.y;\n iEvent.clientY = interaction.startCoords.client.y;\n iEvent.dy = 0;\n }\n else if (axis === 'y') {\n iEvent.pageX = interaction.startCoords.page.x;\n iEvent.clientX = interaction.startCoords.client.x;\n iEvent.dx = 0;\n }\n});\n\n/*\\\n * Interactable.draggable\n [ method ]\n *\n * Gets or sets whether drag actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of drag events\n | var isDraggable = interact('ul li').draggable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on drag events (object makes the Interactable draggable)\n = (object) This Interactable\n | interact(element).draggable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // the axis in which the first movement must be\n | // for the drag sequence to start\n | // 'xy' by default - any direction\n | startAxis: 'x' || 'y' || 'xy',\n |\n | // 'xy' by default - don't restrict to one axis (move in any direction)\n | // 'x' or 'y' to restrict movement to either axis\n | // 'start' to restrict movement to the axis the drag started in\n | lockAxis: 'x' || 'y' || 'xy' || 'start',\n |\n | // max number of drags that can happen concurrently\n | // with elements of this Interactable. Infinity by default\n | max: Infinity,\n |\n | // max number of drags that can target the same element+Interactable\n | // 1 by default\n | maxPerElement: 2\n | });\n\\*/\nInteractable.prototype.draggable = function (options) {\n if (utils.is.object(options)) {\n this.options.drag.enabled = options.enabled === false? false: true;\n this.setPerAction('drag', options);\n this.setOnEvents('drag', options);\n\n if (/^(xy|x|y|start)$/.test(options.lockAxis)) {\n this.options.drag.lockAxis = options.lockAxis;\n }\n if (/^(xy|x|y)$/.test(options.startAxis)) {\n this.options.drag.startAxis = options.startAxis;\n }\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drag.enabled = options;\n\n if (!options) {\n this.ondragstart = this.ondragstart = this.ondragend = null;\n }\n\n return this;\n }\n\n return this.options.drag;\n};\n\nactions.drag = drag;\nactions.names.push('drag');\nutils.merge(Interactable.eventTypes, [\n 'dragstart',\n 'dragmove',\n 'draginertiastart',\n 'draginertiaresume',\n 'dragend',\n]);\nactions.methodDict.drag = 'draggable';\n\ndefaultOptions.drag = drag.defaults;\n\nmodule.exports = drag;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst scope = require('../scope');\nconst interact = require('../interact');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drop = {\n defaults: {\n enabled: false,\n accept : null,\n overlap: 'pointer',\n },\n};\n\nlet dynamicDrop = false;\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // reset active dropzones\n interaction.activeDrops.dropzones = [];\n interaction.activeDrops.elements = [];\n interaction.activeDrops.rects = [];\n\n interaction.dropEvents = null;\n\n if (!interaction.dynamicDrop) {\n setActiveDrops(interaction, interaction.element);\n }\n\n const dragEvent = interaction.prevEvent;\n const dropEvents = getDropEvents(interaction, event, dragEvent);\n\n if (dropEvents.activate) {\n fireActiveDrops(interaction, dropEvents.activate);\n }\n});\n\nInteractEvent.signals.on('new', function ({ interaction, iEvent, event }) {\n if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { return; }\n\n const draggableElement = interaction.element;\n const dragEvent = iEvent;\n const dropResult = getDrop(dragEvent, event, draggableElement);\n\n interaction.dropTarget = dropResult.dropzone;\n interaction.dropElement = dropResult.element;\n\n interaction.dropEvents = getDropEvents(interaction, event, dragEvent);\n});\n\nInteraction.signals.on('action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n fireDropEvents(interaction, interaction.dropEvents);\n});\n\nInteraction.signals.on('action-end', function ({ interaction }) {\n if (interaction.prepared.name === 'drag') {\n fireDropEvents(interaction, interaction.dropEvents);\n }\n});\n\nInteraction.signals.on('stop-drag', function ({ interaction }) {\n interaction.activeDrops.dropzones =\n interaction.activeDrops.elements =\n interaction.activeDrops.rects =\n interaction.dropEvents = null;\n});\n\nfunction collectDrops (interaction, element) {\n const drops = [];\n const elements = [];\n\n element = element || interaction.element;\n\n // collect all dropzones and their elements which qualify for a drop\n for (const current of scope.interactables) {\n if (!current.options.drop.enabled) { continue; }\n\n const accept = current.options.drop.accept;\n\n // test the draggable element against the dropzone's accept setting\n if ((utils.is.element(accept) && accept !== element)\n || (utils.is.string(accept)\n && !utils.matchesSelector(element, accept))) {\n\n continue;\n }\n\n // query for new elements if necessary\n const dropElements = utils.is.string(current.target)\n ? current._context.querySelectorAll(current.target)\n : [current.target];\n\n for (let i = 0; i < dropElements.length; i++) {\n const currentElement = dropElements[i];\n\n if (currentElement !== element) {\n drops.push(current);\n elements.push(currentElement);\n }\n }\n }\n\n return {\n elements,\n dropzones: drops,\n };\n}\n\nfunction fireActiveDrops (interaction, event) {\n let prevElement;\n\n // loop through all active dropzones and trigger event\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n const current = interaction.activeDrops.dropzones[i];\n const currentElement = interaction.activeDrops.elements [i];\n\n // prevent trigger of duplicate events on same element\n if (currentElement !== prevElement) {\n // set current element as event target\n event.target = currentElement;\n current.fire(event);\n }\n prevElement = currentElement;\n }\n}\n\n// Collect a new set of possible drops and save them in activeDrops.\n// setActiveDrops should always be called when a drag has just started or a\n// drag event happens while dynamicDrop is true\nfunction setActiveDrops (interaction, dragElement) {\n // get dropzones and their elements that could receive the draggable\n const possibleDrops = collectDrops(interaction, dragElement, true);\n\n interaction.activeDrops.dropzones = possibleDrops.dropzones;\n interaction.activeDrops.elements = possibleDrops.elements;\n interaction.activeDrops.rects = [];\n\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n interaction.activeDrops.rects[i] =\n interaction.activeDrops.dropzones[i].getRect(interaction.activeDrops.elements[i]);\n }\n}\n\nfunction getDrop (dragEvent, event, dragElement) {\n const interaction = dragEvent.interaction;\n const validDrops = [];\n\n if (dynamicDrop) {\n setActiveDrops(interaction, dragElement);\n }\n\n // collect all dropzones and their elements which qualify for a drop\n for (let j = 0; j < interaction.activeDrops.dropzones.length; j++) {\n const current = interaction.activeDrops.dropzones[j];\n const currentElement = interaction.activeDrops.elements [j];\n const rect = interaction.activeDrops.rects [j];\n\n validDrops.push(current.dropCheck(dragEvent, event, interaction.target, dragElement, currentElement, rect)\n ? currentElement\n : null);\n }\n\n // get the most appropriate dropzone based on DOM depth and order\n const dropIndex = utils.indexOfDeepestElement(validDrops);\n\n return {\n dropzone: interaction.activeDrops.dropzones[dropIndex] || null,\n element : interaction.activeDrops.elements [dropIndex] || null,\n };\n}\n\nfunction getDropEvents (interaction, pointerEvent, dragEvent) {\n const dropEvents = {\n enter : null,\n leave : null,\n activate : null,\n deactivate: null,\n move : null,\n drop : null,\n };\n\n const tmpl = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n };\n\n if (interaction.dropElement !== interaction.prevDropElement) {\n // if there was a prevDropTarget, create a dragleave event\n if (interaction.prevDropTarget) {\n dropEvents.leave = utils.extend({ type: 'dragleave' }, tmpl);\n\n dragEvent.dragLeave = dropEvents.leave.target = interaction.prevDropElement;\n dragEvent.prevDropzone = dropEvents.leave.dropzone = interaction.prevDropTarget;\n }\n // if the dropTarget is not null, create a dragenter event\n if (interaction.dropTarget) {\n dropEvents.enter = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n type : 'dragenter',\n };\n\n dragEvent.dragEnter = interaction.dropElement;\n dragEvent.dropzone = interaction.dropTarget;\n }\n }\n\n if (dragEvent.type === 'dragend' && interaction.dropTarget) {\n dropEvents.drop = utils.extend({ type: 'drop' }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n dragEvent.relatedTarget = interaction.dropElement;\n }\n if (dragEvent.type === 'dragstart') {\n dropEvents.activate = utils.extend({ type: 'dropactivate' }, tmpl);\n\n dropEvents.activate.target = null;\n dropEvents.activate.dropzone = null;\n }\n if (dragEvent.type === 'dragend') {\n dropEvents.deactivate = utils.extend({ type: 'dropdeactivate' }, tmpl);\n\n dropEvents.deactivate.target = null;\n dropEvents.deactivate.dropzone = null;\n }\n if (dragEvent.type === 'dragmove' && interaction.dropTarget) {\n dropEvents.move = utils.extend({\n dragmove : dragEvent,\n type : 'dropmove',\n }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n }\n\n return dropEvents;\n}\n\nfunction fireDropEvents (interaction, dropEvents) {\n if (dropEvents.leave) { interaction.prevDropTarget.fire(dropEvents.leave); }\n if (dropEvents.move ) { interaction.dropTarget.fire(dropEvents.move ); }\n if (dropEvents.enter) { interaction.dropTarget.fire(dropEvents.enter); }\n if (dropEvents.drop ) { interaction.dropTarget.fire(dropEvents.drop ); }\n if (dropEvents.deactivate) {\n fireActiveDrops(interaction, dropEvents.deactivate);\n }\n\n interaction.prevDropTarget = interaction.dropTarget;\n interaction.prevDropElement = interaction.dropElement;\n}\n\n/*\\\n * Interactable.dropzone\n [ method ]\n *\n * Returns or sets whether elements can be dropped onto this\n * Interactable to trigger drop events\n *\n * Dropzones can receive the following events:\n * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends\n * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone\n * - `dragmove` when a draggable that has entered the dropzone is moved\n * - `drop` when a draggable is dropped into this dropzone\n *\n * Use the `accept` option to allow only elements that match the given CSS\n * selector or element. The value can be:\n *\n * - **an Element** - only that element can be dropped into this dropzone.\n * - **a string**, - the element being dragged must match it as a CSS selector.\n * - **`null`** - accept options is cleared - it accepts any element.\n *\n * Use the `overlap` option to set how drops are checked for. The allowed\n * values are:\n *\n * - `'pointer'`, the pointer must be over the dropzone (default)\n * - `'center'`, the draggable element's center must be over the dropzone\n * - a number from 0-1 which is the `(intersection area) / (draggable area)`.\n * e.g. `0.5` for drop to happen when half of the area of the draggable is\n * over the dropzone\n *\n * Use the `checker` option to specify a function to check if a dragged\n * element is over this Interactable.\n *\n | interact(target)\n | .dropChecker(function(dragEvent, // related dragmove or dragend event\n | event, // TouchEvent/PointerEvent/MouseEvent\n | dropped, // bool result of the default checker\n | dropzone, // dropzone Interactable\n | dropElement, // dropzone elemnt\n | draggable, // draggable Interactable\n | draggableElement) {// draggable element\n |\n | return dropped && event.target.hasAttribute('allow-drop');\n | }\n *\n *\n - options (boolean | object | null) #optional The new value to be set.\n | interact('.drop').dropzone({\n | accept: '.can-drop' || document.getElementById('single-drop'),\n | overlap: 'pointer' || 'center' || zeroToOne\n | }\n = (boolean | object) The current setting or this Interactable\n\\*/\nInteractable.prototype.dropzone = function (options) {\n if (utils.is.object(options)) {\n this.options.drop.enabled = options.enabled === false? false: true;\n\n if (utils.is.function(options.ondrop) ) { this.events.ondrop = options.ondrop ; }\n if (utils.is.function(options.ondropactivate) ) { this.events.ondropactivate = options.ondropactivate ; }\n if (utils.is.function(options.ondropdeactivate)) { this.events.ondropdeactivate = options.ondropdeactivate; }\n if (utils.is.function(options.ondragenter) ) { this.events.ondragenter = options.ondragenter ; }\n if (utils.is.function(options.ondragleave) ) { this.events.ondragleave = options.ondragleave ; }\n if (utils.is.function(options.ondropmove) ) { this.events.ondropmove = options.ondropmove ; }\n\n if (/^(pointer|center)$/.test(options.overlap)) {\n this.options.drop.overlap = options.overlap;\n }\n else if (utils.is.number(options.overlap)) {\n this.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0);\n }\n if ('accept' in options) {\n this.options.drop.accept = options.accept;\n }\n if ('checker' in options) {\n this.options.drop.checker = options.checker;\n }\n\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drop.enabled = options;\n\n if (!options) {\n this.ondragenter = this.ondragleave = this.ondrop\n = this.ondropactivate = this.ondropdeactivate = null;\n }\n\n return this;\n }\n\n return this.options.drop;\n};\n\nInteractable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) {\n let dropped = false;\n\n // if the dropzone has no rect (eg. display: none)\n // call the custom dropChecker or just return false\n if (!(rect = rect || this.getRect(dropElement))) {\n return (this.options.drop.checker\n ? this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement)\n : false);\n }\n\n const dropOverlap = this.options.drop.overlap;\n\n if (dropOverlap === 'pointer') {\n const origin = utils.getOriginXY(draggable, draggableElement, 'drag');\n const page = utils.getPageXY(dragEvent);\n\n page.x += origin.x;\n page.y += origin.y;\n\n const horizontal = (page.x > rect.left) && (page.x < rect.right);\n const vertical = (page.y > rect.top ) && (page.y < rect.bottom);\n\n dropped = horizontal && vertical;\n }\n\n const dragRect = draggable.getRect(draggableElement);\n\n if (dragRect && dropOverlap === 'center') {\n const cx = dragRect.left + dragRect.width / 2;\n const cy = dragRect.top + dragRect.height / 2;\n\n dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom;\n }\n\n if (dragRect && utils.is.number(dropOverlap)) {\n const overlapArea = (Math.max(0, Math.min(rect.right , dragRect.right ) - Math.max(rect.left, dragRect.left))\n * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top , dragRect.top )));\n\n const overlapRatio = overlapArea / (dragRect.width * dragRect.height);\n\n dropped = overlapRatio >= dropOverlap;\n }\n\n if (this.options.drop.checker) {\n dropped = this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement);\n }\n\n return dropped;\n};\n\nInteractable.signals.on('unset', function ({ interactable }) {\n interactable.dropzone(false);\n});\n\nInteractable.settingsMethods.push('dropChecker');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.dropTarget = null; // the dropzone a drag target might be dropped into\n interaction.dropElement = null; // the element at the time of checking\n interaction.prevDropTarget = null; // the dropzone that was recently dragged away from\n interaction.prevDropElement = null; // the element at the time of checking\n interaction.dropEvents = null; // the dropEvents related to the current drag event\n\n interaction.activeDrops = {\n dropzones: [], // the dropzones that are mentioned below\n elements : [], // elements of dropzones that accept the target draggable\n rects : [], // the rects of the elements mentioned above\n };\n\n});\n\nInteraction.signals.on('stop', function ({ interaction }) {\n interaction.dropTarget = interaction.dropElement =\n interaction.prevDropTarget = interaction.prevDropElement = null;\n});\n\n/*\\\n * interact.dynamicDrop\n [ method ]\n *\n * Returns or sets whether the dimensions of dropzone elements are\n * calculated on every dragmove or only on dragstart for the default\n * dropChecker\n *\n - newValue (boolean) #optional True to check on each move. False to check only before start\n = (boolean | interact) The current setting or interact\n\\*/\ninteract.dynamicDrop = function (newValue) {\n if (utils.is.bool(newValue)) {\n //if (dragging && dynamicDrop !== newValue && !newValue) {\n //calcRects(dropzones);\n //}\n\n dynamicDrop = newValue;\n\n return interact;\n }\n return dynamicDrop;\n};\n\nutils.merge(Interactable.eventTypes, [\n 'dragenter',\n 'dragleave',\n 'dropactivate',\n 'dropdeactivate',\n 'dropmove',\n 'drop',\n]);\nactions.methodDict.drop = 'dropzone';\n\ndefaultOptions.drop = drop.defaults;\n\nmodule.exports = drop;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst gesture = {\n defaults: {\n enabled : false,\n origin : null,\n restrict: null,\n },\n\n checker: function (pointer, event, interactable, element, interaction) {\n if (interaction.pointerIds.length >= 2) {\n return { name: 'gesture' };\n }\n\n return null;\n },\n\n getCursor: function () {\n return '';\n },\n};\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturestart') { return; }\n iEvent.ds = 0;\n\n interaction.gesture.startDistance = interaction.gesture.prevDistance = iEvent.distance;\n interaction.gesture.startAngle = interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.scale = 1;\n});\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturemove') { return; }\n\n iEvent.ds = iEvent.scale - interaction.gesture.scale;\n\n interaction.target.fire(iEvent);\n\n interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.prevDistance = iEvent.distance;\n\n if (iEvent.scale !== Infinity\n && iEvent.scale !== null\n && iEvent.scale !== undefined\n && !isNaN(iEvent.scale)) {\n\n interaction.gesture.scale = iEvent.scale;\n }\n});\n\n/*\\\n * Interactable.gesturable\n [ method ]\n *\n * Gets or sets whether multitouch gestures can be performed on the\n * Interactable's element\n *\n = (boolean) Indicates if this can be the target of gesture events\n | var isGestureable = interact(element).gesturable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on gesture events (makes the Interactable gesturable)\n = (object) this Interactable\n | interact(element).gesturable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // limit multiple gestures.\n | // See the explanation in @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n\\*/\nInteractable.prototype.gesturable = function (options) {\n if (utils.is.object(options)) {\n this.options.gesture.enabled = options.enabled === false? false: true;\n this.setPerAction('gesture', options);\n this.setOnEvents('gesture', options);\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.gesture.enabled = options;\n\n if (!options) {\n this.ongesturestart = this.ongesturestart = this.ongestureend = null;\n }\n\n return this;\n }\n\n return this.options.gesture;\n};\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action, event, starting, ending, deltaSource }) {\n if (action !== 'gesture') { return; }\n\n const pointers = interaction.pointers;\n\n iEvent.touches = [pointers[0], pointers[1]];\n\n if (starting) {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = 1;\n iEvent.ds = 0;\n iEvent.angle = utils.touchAngle(pointers, undefined, deltaSource);\n iEvent.da = 0;\n }\n else if (ending || event instanceof InteractEvent) {\n iEvent.distance = interaction.prevEvent.distance;\n iEvent.box = interaction.prevEvent.box;\n iEvent.scale = interaction.prevEvent.scale;\n iEvent.ds = iEvent.scale - 1;\n iEvent.angle = interaction.prevEvent.angle;\n iEvent.da = iEvent.angle - interaction.gesture.startAngle;\n }\n else {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = iEvent.distance / interaction.gesture.startDistance;\n iEvent.angle = utils.touchAngle(pointers, interaction.gesture.prevAngle, deltaSource);\n\n iEvent.ds = iEvent.scale - interaction.gesture.prevScale;\n iEvent.da = iEvent.angle - interaction.gesture.prevAngle;\n }\n});\n\nInteraction.signals.on('new', function (interaction) {\n interaction.gesture = {\n start: { x: 0, y: 0 },\n\n startDistance: 0, // distance between two touches of touchStart\n prevDistance : 0,\n distance : 0,\n\n scale: 1, // gesture.distance / gesture.startDistance\n\n startAngle: 0, // angle of line joining two touches\n prevAngle : 0, // angle of the previous gesture event\n };\n});\n\nactions.gesture = gesture;\nactions.names.push('gesture');\nutils.merge(Interactable.eventTypes, [\n 'gesturestart',\n 'gesturemove',\n 'gestureend',\n]);\nactions.methodDict.gesture = 'gesturable';\n\ndefaultOptions.gesture = gesture.defaults;\n\nmodule.exports = gesture;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\n// Less Precision with touch input\nconst defaultMargin = browser.supportsTouch || browser.supportsPointerEvent? 20: 10;\n\nconst resize = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n square: false,\n preserveAspectRatio: false,\n axis: 'xy',\n\n // use default margin\n margin: NaN,\n\n // object with props left, right, top, bottom which are\n // true/false values to resize when the pointer is over that edge,\n // CSS selectors to match the handles for each direction\n // or the Elements for each handle\n edges: null,\n\n // a value of 'none' will limit the resize rect to a minimum of 0x0\n // 'negate' will alow the rect to have negative width/height\n // 'reposition' will keep the width/height positive by swapping\n // the top and bottom edges and/or swapping the left and right edges\n invert: 'none',\n },\n\n checker: function (pointer, event, interactable, element, interaction, rect) {\n if (!rect) { return null; }\n\n const page = utils.extend({}, interaction.curCoords.page);\n const options = interactable.options;\n\n if (options.resize.enabled) {\n const resizeOptions = options.resize;\n const resizeEdges = { left: false, right: false, top: false, bottom: false };\n\n // if using resize.edges\n if (utils.is.object(resizeOptions.edges)) {\n for (const edge in resizeEdges) {\n resizeEdges[edge] = checkResizeEdge(edge,\n resizeOptions.edges[edge],\n page,\n interaction._eventTarget,\n element,\n rect,\n resizeOptions.margin || defaultMargin);\n }\n\n resizeEdges.left = resizeEdges.left && !resizeEdges.right;\n resizeEdges.top = resizeEdges.top && !resizeEdges.bottom;\n\n if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) {\n return {\n name: 'resize',\n edges: resizeEdges,\n };\n }\n }\n else {\n const right = options.resize.axis !== 'y' && page.x > (rect.right - defaultMargin);\n const bottom = options.resize.axis !== 'x' && page.y > (rect.bottom - defaultMargin);\n\n if (right || bottom) {\n return {\n name: 'resize',\n axes: (right? 'x' : '') + (bottom? 'y' : ''),\n };\n }\n }\n }\n\n return null;\n },\n\n cursors: (browser.isIe9OrOlder ? {\n x : 'e-resize',\n y : 's-resize',\n xy: 'se-resize',\n\n top : 'n-resize',\n left : 'w-resize',\n bottom : 's-resize',\n right : 'e-resize',\n topleft : 'se-resize',\n bottomright: 'se-resize',\n topright : 'ne-resize',\n bottomleft : 'ne-resize',\n } : {\n x : 'ew-resize',\n y : 'ns-resize',\n xy: 'nwse-resize',\n\n top : 'ns-resize',\n left : 'ew-resize',\n bottom : 'ns-resize',\n right : 'ew-resize',\n topleft : 'nwse-resize',\n bottomright: 'nwse-resize',\n topright : 'nesw-resize',\n bottomleft : 'nesw-resize',\n }),\n\n getCursor: function (action) {\n if (action.axis) {\n return resize.cursors[action.name + action.axis];\n }\n else if (action.edges) {\n let cursorKey = '';\n const edgeNames = ['top', 'bottom', 'left', 'right'];\n\n for (let i = 0; i < 4; i++) {\n if (action.edges[edgeNames[i]]) {\n cursorKey += edgeNames[i];\n }\n }\n\n return resize.cursors[cursorKey];\n }\n },\n};\n\n// resizestart\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'resizestart' || !interaction.prepared.edges) {\n return;\n }\n\n const startRect = interaction.target.getRect(interaction.element);\n const resizeOptions = interaction.target.options.resize;\n\n /*\n * When using the `resizable.square` or `resizable.preserveAspectRatio` options, resizing from one edge\n * will affect another. E.g. with `resizable.square`, resizing to make the right edge larger will make\n * the bottom edge larger by the same amount. We call these 'linked' edges. Any linked edges will depend\n * on the active edges and the edge being interacted with.\n */\n if (resizeOptions.square || resizeOptions.preserveAspectRatio) {\n const linkedEdges = utils.extend({}, interaction.prepared.edges);\n\n linkedEdges.top = linkedEdges.top || (linkedEdges.left && !linkedEdges.bottom);\n linkedEdges.left = linkedEdges.left || (linkedEdges.top && !linkedEdges.right );\n linkedEdges.bottom = linkedEdges.bottom || (linkedEdges.right && !linkedEdges.top );\n linkedEdges.right = linkedEdges.right || (linkedEdges.bottom && !linkedEdges.left );\n\n interaction.prepared._linkedEdges = linkedEdges;\n }\n else {\n interaction.prepared._linkedEdges = null;\n }\n\n // if using `resizable.preserveAspectRatio` option, record aspect ratio at the start of the resize\n if (resizeOptions.preserveAspectRatio) {\n interaction.resizeStartAspectRatio = startRect.width / startRect.height;\n }\n\n interaction.resizeRects = {\n start : startRect,\n current : utils.extend({}, startRect),\n inverted : utils.extend({}, startRect),\n previous : utils.extend({}, startRect),\n delta : {\n left: 0, right : 0, width : 0,\n top : 0, bottom: 0, height: 0,\n },\n };\n\n iEvent.rect = interaction.resizeRects.inverted;\n iEvent.deltaRect = interaction.resizeRects.delta;\n});\n\n// resizemove\nInteractEvent.signals.on('new', function ({ iEvent, phase, interaction }) {\n if (phase !== 'move' || !interaction.prepared.edges) { return; }\n\n const resizeOptions = interaction.target.options.resize;\n const invert = resizeOptions.invert;\n const invertible = invert === 'reposition' || invert === 'negate';\n\n let edges = interaction.prepared.edges;\n\n const start = interaction.resizeRects.start;\n const current = interaction.resizeRects.current;\n const inverted = interaction.resizeRects.inverted;\n const delta = interaction.resizeRects.delta;\n const previous = utils.extend(interaction.resizeRects.previous, inverted);\n const originalEdges = edges;\n\n let dx = iEvent.dx;\n let dy = iEvent.dy;\n\n if (resizeOptions.preserveAspectRatio || resizeOptions.square) {\n // `resize.preserveAspectRatio` takes precedence over `resize.square`\n const startAspectRatio = resizeOptions.preserveAspectRatio\n ? interaction.resizeStartAspectRatio\n : 1;\n\n edges = interaction.prepared._linkedEdges;\n\n if ((originalEdges.left && originalEdges.bottom)\n || (originalEdges.right && originalEdges.top)) {\n dy = -dx / startAspectRatio;\n }\n else if (originalEdges.left || originalEdges.right ) { dy = dx / startAspectRatio; }\n else if (originalEdges.top || originalEdges.bottom) { dx = dy * startAspectRatio; }\n }\n\n // update the 'current' rect without modifications\n if (edges.top ) { current.top += dy; }\n if (edges.bottom) { current.bottom += dy; }\n if (edges.left ) { current.left += dx; }\n if (edges.right ) { current.right += dx; }\n\n if (invertible) {\n // if invertible, copy the current rect\n utils.extend(inverted, current);\n\n if (invert === 'reposition') {\n // swap edge values if necessary to keep width/height positive\n let swap;\n\n if (inverted.top > inverted.bottom) {\n swap = inverted.top;\n\n inverted.top = inverted.bottom;\n inverted.bottom = swap;\n }\n if (inverted.left > inverted.right) {\n swap = inverted.left;\n\n inverted.left = inverted.right;\n inverted.right = swap;\n }\n }\n }\n else {\n // if not invertible, restrict to minimum of 0x0 rect\n inverted.top = Math.min(current.top, start.bottom);\n inverted.bottom = Math.max(current.bottom, start.top);\n inverted.left = Math.min(current.left, start.right);\n inverted.right = Math.max(current.right, start.left);\n }\n\n inverted.width = inverted.right - inverted.left;\n inverted.height = inverted.bottom - inverted.top ;\n\n for (const edge in inverted) {\n delta[edge] = inverted[edge] - previous[edge];\n }\n\n iEvent.edges = interaction.prepared.edges;\n iEvent.rect = inverted;\n iEvent.deltaRect = delta;\n});\n\n/*\\\n * Interactable.resizable\n [ method ]\n *\n * Gets or sets whether resize actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of resize elements\n | var isResizeable = interact('input[type=text]').resizable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on resize events (object makes the Interactable resizable)\n = (object) This Interactable\n | interact(element).resizable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | edges: {\n | top : true, // Use pointer coords to check for resize.\n | left : false, // Disable resizing from left edge.\n | bottom: '.resize-s',// Resize if pointer target matches selector\n | right : handleEl // Resize if pointer target is the given Element\n | },\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height are adjusted at a 1:1 ratio.\n | square: false,\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height maintain the aspect ratio they had when resizing started.\n | preserveAspectRatio: false,\n |\n | // a value of 'none' will limit the resize rect to a minimum of 0x0\n | // 'negate' will allow the rect to have negative width/height\n | // 'reposition' will keep the width/height positive by swapping\n | // the top and bottom edges and/or swapping the left and right edges\n | invert: 'none' || 'negate' || 'reposition'\n |\n | // limit multiple resizes.\n | // See the explanation in the @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n \\*/\nInteractable.prototype.resizable = function (options) {\n if (utils.is.object(options)) {\n this.options.resize.enabled = options.enabled === false? false: true;\n this.setPerAction('resize', options);\n this.setOnEvents('resize', options);\n\n if (/^x$|^y$|^xy$/.test(options.axis)) {\n this.options.resize.axis = options.axis;\n }\n else if (options.axis === null) {\n this.options.resize.axis = defaultOptions.resize.axis;\n }\n\n if (utils.is.bool(options.preserveAspectRatio)) {\n this.options.resize.preserveAspectRatio = options.preserveAspectRatio;\n }\n else if (utils.is.bool(options.square)) {\n this.options.resize.square = options.square;\n }\n\n return this;\n }\n if (utils.is.bool(options)) {\n this.options.resize.enabled = options;\n\n if (!options) {\n this.onresizestart = this.onresizestart = this.onresizeend = null;\n }\n\n return this;\n }\n return this.options.resize;\n};\n\nfunction checkResizeEdge (name, value, page, element, interactableElement, rect, margin) {\n // false, '', undefined, null\n if (!value) { return false; }\n\n // true value, use pointer coords and element rect\n if (value === true) {\n // if dimensions are negative, \"switch\" edges\n const width = utils.is.number(rect.width )? rect.width : rect.right - rect.left;\n const height = utils.is.number(rect.height)? rect.height : rect.bottom - rect.top ;\n\n if (width < 0) {\n if (name === 'left' ) { name = 'right'; }\n else if (name === 'right') { name = 'left' ; }\n }\n if (height < 0) {\n if (name === 'top' ) { name = 'bottom'; }\n else if (name === 'bottom') { name = 'top' ; }\n }\n\n if (name === 'left' ) { return page.x < ((width >= 0? rect.left: rect.right ) + margin); }\n if (name === 'top' ) { return page.y < ((height >= 0? rect.top : rect.bottom) + margin); }\n\n if (name === 'right' ) { return page.x > ((width >= 0? rect.right : rect.left) - margin); }\n if (name === 'bottom') { return page.y > ((height >= 0? rect.bottom: rect.top ) - margin); }\n }\n\n // the remaining checks require an element\n if (!utils.is.element(element)) { return false; }\n\n return utils.is.element(value)\n // the value is an element to use as a resize handle\n ? value === element\n // otherwise check if element matches value as selector\n : utils.matchesUpTo(element, value, interactableElement);\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.resizeAxes = 'xy';\n});\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action }) {\n if (action !== 'resize' || !interaction.resizeAxes) { return; }\n\n const options = interaction.target.options;\n\n if (options.resize.square) {\n if (interaction.resizeAxes === 'y') {\n iEvent.dx = iEvent.dy;\n }\n else {\n iEvent.dy = iEvent.dx;\n }\n iEvent.axes = 'xy';\n }\n else {\n iEvent.axes = interaction.resizeAxes;\n\n if (interaction.resizeAxes === 'x') {\n iEvent.dy = 0;\n }\n else if (interaction.resizeAxes === 'y') {\n iEvent.dx = 0;\n }\n }\n});\n\nactions.resize = resize;\nactions.names.push('resize');\nutils.merge(Interactable.eventTypes, [\n 'resizestart',\n 'resizemove',\n 'resizeinertiastart',\n 'resizeinertiaresume',\n 'resizeend',\n]);\nactions.methodDict.resize = 'resizable';\n\ndefaultOptions.resize = resize.defaults;\n\nmodule.exports = resize;\n","const raf = require('./utils/raf');\nconst getWindow = require('./utils/window').getWindow;\nconst is = require('./utils/is');\nconst domUtils = require('./utils/domUtils');\nconst Interaction = require('./Interaction');\nconst defaultOptions = require('./defaultOptions');\n\nconst autoScroll = {\n defaults: {\n enabled : false,\n container: null, // the item that is scrolled (Window or HTMLElement)\n margin : 60,\n speed : 300, // the scroll speed in pixels per second\n },\n\n interaction: null,\n i: null, // the handle returned by window.setInterval\n x: 0, y: 0, // Direction each pulse is to scroll in\n\n isScrolling: false,\n prevTime: 0,\n\n start: function (interaction) {\n autoScroll.isScrolling = true;\n raf.cancel(autoScroll.i);\n\n autoScroll.interaction = interaction;\n autoScroll.prevTime = new Date().getTime();\n autoScroll.i = raf.request(autoScroll.scroll);\n },\n\n stop: function () {\n autoScroll.isScrolling = false;\n raf.cancel(autoScroll.i);\n },\n\n // scroll the window by the values in scroll.x/y\n scroll: function () {\n const options = autoScroll.interaction.target.options[autoScroll.interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(autoScroll.interaction.element);\n const now = new Date().getTime();\n // change in time in seconds\n const dt = (now - autoScroll.prevTime) / 1000;\n // displacement\n const s = options.speed * dt;\n\n if (s >= 1) {\n if (is.window(container)) {\n container.scrollBy(autoScroll.x * s, autoScroll.y * s);\n }\n else if (container) {\n container.scrollLeft += autoScroll.x * s;\n container.scrollTop += autoScroll.y * s;\n }\n\n autoScroll.prevTime = now;\n }\n\n if (autoScroll.isScrolling) {\n raf.cancel(autoScroll.i);\n autoScroll.i = raf.request(autoScroll.scroll);\n }\n },\n check: function (interactable, actionName) {\n const options = interactable.options;\n\n return options[actionName].autoScroll && options[actionName].autoScroll.enabled;\n },\n onInteractionMove: function ({ interaction, pointer }) {\n if (!(interaction.interacting()\n && autoScroll.check(interaction.target, interaction.prepared.name))) {\n return;\n }\n\n if (interaction.simulation) {\n autoScroll.x = autoScroll.y = 0;\n return;\n }\n\n let top;\n let right;\n let bottom;\n let left;\n\n const options = interaction.target.options[interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(interaction.element);\n\n if (is.window(container)) {\n left = pointer.clientX < autoScroll.margin;\n top = pointer.clientY < autoScroll.margin;\n right = pointer.clientX > container.innerWidth - autoScroll.margin;\n bottom = pointer.clientY > container.innerHeight - autoScroll.margin;\n }\n else {\n const rect = domUtils.getElementClientRect(container);\n\n left = pointer.clientX < rect.left + autoScroll.margin;\n top = pointer.clientY < rect.top + autoScroll.margin;\n right = pointer.clientX > rect.right - autoScroll.margin;\n bottom = pointer.clientY > rect.bottom - autoScroll.margin;\n }\n\n autoScroll.x = (right ? 1: left? -1: 0);\n autoScroll.y = (bottom? 1: top? -1: 0);\n\n if (!autoScroll.isScrolling) {\n // set the autoScroll properties to those of the target\n autoScroll.margin = options.margin;\n autoScroll.speed = options.speed;\n\n autoScroll.start(interaction);\n }\n },\n};\n\nInteraction.signals.on('stop-active', function () {\n autoScroll.stop();\n});\n\nInteraction.signals.on('action-move', autoScroll.onInteractionMove);\n\ndefaultOptions.perAction.autoScroll = autoScroll.defaults;\n\nmodule.exports = autoScroll;\n","const Interactable = require('../Interactable');\nconst actions = require('../actions/base');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.ignoreFrom\n [ method ]\n *\n * If the target of the `mousedown`, `pointerdown` or `touchstart`\n * event or any of it's parents match the given CSS selector or\n * Element, no drag/resize/gesture is started.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to not ignore any elements\n = (string | Element | object) The current ignoreFrom value or this Interactable\n **\n | interact(element, { ignoreFrom: document.getElementById('no-action') });\n | // or\n | interact(element).ignoreFrom('input, textarea, a');\n\\*/\nInteractable.prototype.ignoreFrom = function (newValue) {\n return this._backCompatOption('ignoreFrom', newValue);\n};\n\n/*\\\n * Interactable.allowFrom\n [ method ]\n *\n * A drag/resize/gesture is started only If the target of the\n * `mousedown`, `pointerdown` or `touchstart` event or any of it's\n * parents match the given CSS selector or Element.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to allow from any element\n = (string | Element | object) The current allowFrom value or this Interactable\n **\n | interact(element, { allowFrom: document.getElementById('drag-handle') });\n | // or\n | interact(element).allowFrom('.handle');\n\\*/\nInteractable.prototype.allowFrom = function (newValue) {\n return this._backCompatOption('allowFrom', newValue);\n};\n\nInteractable.prototype.testIgnore = function (ignoreFrom, interactableElement, element) {\n if (!ignoreFrom || !is.element(element)) { return false; }\n\n if (is.string(ignoreFrom)) {\n return domUtils.matchesUpTo(element, ignoreFrom, interactableElement);\n }\n else if (is.element(ignoreFrom)) {\n return domUtils.nodeContains(ignoreFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testAllow = function (allowFrom, interactableElement, element) {\n if (!allowFrom) { return true; }\n\n if (!is.element(element)) { return false; }\n\n if (is.string(allowFrom)) {\n return domUtils.matchesUpTo(element, allowFrom, interactableElement);\n }\n else if (is.element(allowFrom)) {\n return domUtils.nodeContains(allowFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testIgnoreAllow = function (options, interactableElement, eventTarget) {\n return (!this.testIgnore(options.ignoreFrom, interactableElement, eventTarget)\n && this.testAllow(options.allowFrom, interactableElement, eventTarget));\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (event.buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\n","const interact = require('../interact');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst actions = require('../actions/base');\nconst defaultOptions = require('../defaultOptions');\nconst browser = require('../utils/browser');\nconst scope = require('../scope');\nconst utils = require('../utils');\nconst signals = require('../utils/Signals').new();\n\nrequire('./InteractableMethods');\n\nconst autoStart = {\n signals,\n withinInteractionLimit,\n // Allow this many interactions to happen simultaneously\n maxInteractions: Infinity,\n defaults: {\n perAction: {\n manualStart: false,\n max: Infinity,\n maxPerElement: 1,\n allowFrom: null,\n ignoreFrom: null,\n },\n },\n setActionDefaults: function (action) {\n utils.extend(action.defaults, autoStart.defaults.perAction);\n },\n};\n\n// set cursor style on mousedown\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget }) {\n if (interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\n// set cursor style on mousemove\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget }) {\n if (!interaction.mouse\n || interaction.pointerIsDown\n || interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\nInteraction.signals.on('move', function (arg) {\n const { interaction, event } = arg;\n\n if (!interaction.pointerIsDown\n || interaction.interacting()\n || !interaction.pointerWasMoved\n || !interaction.prepared.name) {\n return;\n }\n\n signals.fire('before-start', arg);\n\n const target = interaction.target;\n\n if (interaction.prepared.name && target) {\n // check manualStart and interaction limit\n if (target.options[interaction.prepared.name].manualStart\n || !withinInteractionLimit(target, interaction.element, interaction.prepared)) {\n interaction.stop(event);\n }\n else {\n interaction.start(interaction.prepared, target, interaction.element);\n }\n }\n});\n\n// Check if the current target supports the action.\n// If so, return the validated action. Otherwise, return null\nfunction validateAction (action, interactable, element, eventTarget) {\n if (utils.is.object(action)\n && interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget)\n && interactable.options[action.name].enabled\n && withinInteractionLimit(interactable, element, action)) {\n return action;\n }\n\n return null;\n}\n\nfunction validateSelector (interaction, pointer, event, matches, matchElements, eventTarget) {\n for (let i = 0, len = matches.length; i < len; i++) {\n const match = matches[i];\n const matchElement = matchElements[i];\n const action = validateAction(match.getAction(pointer, event, interaction, matchElement),\n match,\n matchElement,\n eventTarget);\n\n if (action) {\n return {\n action,\n target: match,\n element: matchElement,\n };\n }\n }\n\n return {};\n}\n\nfunction getActionInfo (interaction, pointer, event, eventTarget) {\n let matches = [];\n let matchElements = [];\n\n let element = eventTarget;\n let action = null;\n\n function pushMatches (interactable, selector, context) {\n const elements = (browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined);\n\n if (utils.matchesSelector(element, selector, elements)) {\n\n matches.push(interactable);\n matchElements.push(element);\n }\n }\n\n while (utils.is.element(element)) {\n matches = [];\n matchElements = [];\n\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && (action = validateAction(elementInteractable.getAction(pointer, event, interaction, element, eventTarget),\n elementInteractable,\n element,\n eventTarget))\n && !elementInteractable.options[action.name].manualStart) {\n return {\n element,\n action,\n target: elementInteractable,\n };\n }\n else {\n scope.interactables.forEachSelector(pushMatches, element);\n\n const actionInfo = validateSelector(interaction, pointer, event, matches, matchElements, eventTarget);\n\n if (actionInfo.action\n && !actionInfo.target.options[actionInfo.action.name].manualStart) {\n return actionInfo;\n }\n }\n\n element = utils.parentNode(element);\n }\n\n return {};\n}\n\nfunction prepare (interaction, { action, target, element }) {\n action = action || {};\n\n if (interaction.target && interaction.target.options.styleCursor) {\n interaction.target._doc.documentElement.style.cursor = '';\n }\n\n interaction.target = target;\n interaction.element = element;\n utils.copyAction(interaction.prepared, action);\n\n if (target && target.options.styleCursor) {\n const cursor = action? actions[action.name].getCursor(action) : '';\n interaction.target._doc.documentElement.style.cursor = cursor;\n }\n\n signals.fire('prepared', { interaction: interaction });\n}\n\nInteraction.signals.on('stop', function ({ interaction }) {\n const target = interaction.target;\n\n if (target && target.options.styleCursor) {\n target._doc.documentElement.style.cursor = '';\n }\n});\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (utils.is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (utils.is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n const buttons = event.buttons || ({\n 0: 1,\n 1: 4,\n 3: 8,\n 4: 16,\n })[event.button];\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\nfunction withinInteractionLimit (interactable, element, action) {\n const options = interactable.options;\n const maxActions = options[action.name].max;\n const maxPerElement = options[action.name].maxPerElement;\n let activeInteractions = 0;\n let targetCount = 0;\n let targetElementCount = 0;\n\n // no actions if any of these values == 0\n if (!(maxActions && maxPerElement && autoStart.maxInteractions)) { return; }\n\n for (let i = 0, len = scope.interactions.length; i < len; i++) {\n const interaction = scope.interactions[i];\n const otherAction = interaction.prepared.name;\n\n if (!interaction.interacting()) { continue; }\n\n activeInteractions++;\n\n if (activeInteractions >= autoStart.maxInteractions) {\n return false;\n }\n\n if (interaction.target !== interactable) { continue; }\n\n targetCount += (otherAction === action.name)|0;\n\n if (targetCount >= maxActions) {\n return false;\n }\n\n if (interaction.element === element) {\n targetElementCount++;\n\n if (otherAction !== action.name || targetElementCount >= maxPerElement) {\n return false;\n }\n }\n }\n\n return autoStart.maxInteractions > 0;\n}\n\n/*\\\n * interact.maxInteractions\n [ method ]\n **\n * Returns or sets the maximum number of concurrent interactions allowed.\n * By default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables\n * and elements, you need to enable it in the draggable, resizable and\n * gesturable `'max'` and `'maxPerElement'` options.\n **\n - newValue (number) #optional Any number. newValue <= 0 means no interactions.\n\\*/\ninteract.maxInteractions = function (newValue) {\n if (utils.is.number(newValue)) {\n autoStart.maxInteractions = newValue;\n\n return this;\n }\n\n return autoStart.maxInteractions;\n};\n\nInteractable.settingsMethods.push('styleCursor');\nInteractable.settingsMethods.push('actionChecker');\nInteractable.settingsMethods.push('ignoreFrom');\nInteractable.settingsMethods.push('allowFrom');\n\ndefaultOptions.base.actionChecker = null;\ndefaultOptions.base.styleCursor = true;\n\nutils.extend(defaultOptions.perAction, autoStart.defaults.perAction);\n\nmodule.exports = autoStart;\n","const autoStart = require('./base');\nconst Interaction = require('../Interaction');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.delayTimer = null;\n});\n\nautoStart.signals.on('prepared', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.delayTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.target, interaction.element);\n }, delay);\n }\n});\n\nInteraction.signals.on('move', function ({ interaction, duplicate }) {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.delayTimer);\n }\n});\n\n// prevent regular down->move autoStart\nautoStart.signals.on('before-start', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.prepared.name = null;\n }\n});\n","const autoStart = require('./base');\nconst scope = require('../scope');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\n\nconst { matchesSelector, parentNode } = require('../utils/domUtils');\n\nautoStart.setActionDefaults(require('../actions/drag'));\n\nautoStart.signals.on('before-start', function ({ interaction, eventTarget, dx, dy }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // check if a drag is in the correct axis\n const absX = Math.abs(dx);\n const absY = Math.abs(dy);\n const options = interaction.target.options.drag;\n const startAxis = options.startAxis;\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy');\n\n interaction.prepared.axis = options.lockAxis === 'start'\n ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n : options.lockAxis;\n\n // if the movement isn't in the startAxis of the interactable\n if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) {\n // cancel the prepared action\n interaction.prepared.name = null;\n\n // then try to get a drag from another ineractable\n\n if (!interaction.prepared.name) {\n\n let element = eventTarget;\n\n const getDraggable = function (interactable, selector, context) {\n const elements = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n if (interactable === interaction.target) { return; }\n\n if (!options.manualStart\n && !interactable.testIgnoreAllow(options, element, eventTarget)\n && matchesSelector(element, selector, elements)) {\n\n const action = interactable.getAction(interaction.downPointer,\n interaction.downEvent,\n interaction,\n element);\n\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, interactable)\n && autoStart.validateAction(action, interactable, element, eventTarget)) {\n\n return interactable;\n }\n }\n };\n\n let action = null;\n\n // check all interactables\n while (is.element(element)) {\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && elementInteractable !== interaction.target\n && !elementInteractable.options.drag.manualStart) {\n\n action = elementInteractable.getAction(interaction.downPointer, interaction.downEvent, interaction, element);\n }\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, elementInteractable)) {\n\n interaction.prepared.name = 'drag';\n interaction.target = elementInteractable;\n interaction.element = element;\n break;\n }\n\n const selectorInteractable = scope.interactables.forEachSelector(getDraggable, element);\n\n if (selectorInteractable) {\n interaction.prepared.name = 'drag';\n interaction.target = selectorInteractable;\n interaction.element = element;\n break;\n }\n\n element = parentNode(element);\n }\n }\n }\n});\n\nfunction checkStartAxis (startAxis, interactable) {\n if (!interactable) { return false; }\n\n const thisAxis = interactable.options.drag.startAxis;\n\n return (startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis);\n}\n","require('./base').setActionDefaults(require('../actions/gesture'));\n","require('./base').setActionDefaults(require('../actions/resize'));\n","module.exports = {\n base: {\n accept : null,\n preventDefault: 'auto',\n deltaSource : 'page',\n },\n\n perAction: {\n origin: { x: 0, y: 0 },\n\n // only allow left button by default\n // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n mouseButtons: 1,\n\n inertia: {\n enabled : false,\n resistance : 10, // the lambda in exponential decay\n minSpeed : 100, // target speed must be above this for inertia to start\n endSpeed : 10, // the speed at which inertia is slow enough to stop\n allowResume : true, // allow resuming an action in inertia phase\n smoothEndDuration: 300, // animate to snap/restrict endOnly if there's no inertia\n },\n },\n};\n","/* browser entry point */\n\n// Legacy browser support\nrequire('./legacyBrowsers');\n\n// inertia\nrequire('./inertia');\n\n// modifiers\nrequire('./modifiers/snap');\nrequire('./modifiers/restrict');\n\n// pointerEvents\nrequire('./pointerEvents/base');\nrequire('./pointerEvents/holdRepeat');\nrequire('./pointerEvents/interactableTargets');\n\n// delay\nrequire('./autoStart/delay');\n\n// actions\nrequire('./actions/gesture');\nrequire('./actions/resize');\nrequire('./actions/drag');\nrequire('./actions/drop');\n\n// load these modifiers after resize is loaded\nrequire('./modifiers/snapSize');\nrequire('./modifiers/restrictEdges');\nrequire('./modifiers/restrictSize');\n\n// autoStart actions\nrequire('./autoStart/gesture');\nrequire('./autoStart/resize');\nrequire('./autoStart/drag');\n\n// Interactable preventDefault setting\nrequire('./interactablePreventDefault.js');\n\n// autoScroll\nrequire('./autoScroll');\n\n// export interact\nmodule.exports = require('./interact');\n","const InteractEvent = require('./InteractEvent');\nconst Interaction = require('./Interaction');\nconst modifiers = require('./modifiers');\nconst utils = require('./utils');\nconst animationFrame = require('./utils/raf');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.inertiaStatus = {\n active : false,\n smoothEnd : false,\n allowResume: false,\n\n startEvent: null,\n upCoords : {},\n\n xe: 0, ye: 0,\n sx: 0, sy: 0,\n\n t0: 0,\n vx0: 0, vys: 0,\n duration: 0,\n\n lambda_v0: 0,\n one_ve_v0: 0,\n i : null,\n };\n\n interaction.boundInertiaFrame = () => inertiaFrame .apply(interaction);\n interaction.boundSmoothEndFrame = () => smoothEndFrame.apply(interaction);\n});\n\nInteraction.signals.on('down', function ({ interaction, event, pointer, eventTarget }) {\n const status = interaction.inertiaStatus;\n\n // Check if the down event hits the current inertia target\n if (status.active) {\n let element = eventTarget;\n\n // climb up the DOM tree from the event target\n while (utils.is.element(element)) {\n\n // if interaction element is the current inertia target element\n if (element === interaction.element) {\n // stop inertia\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n\n // update pointers to the down event's coordinates\n interaction.updatePointer(pointer);\n utils.setCoords(interaction.curCoords, interaction.pointers);\n\n // fire appropriate signals\n const signalArg = { interaction };\n Interaction.signals.fire('before-action-move', signalArg);\n Interaction.signals.fire('action-resume' , signalArg);\n\n // fire a reume event\n const resumeEvent = new InteractEvent(interaction,\n event,\n interaction.prepared.name,\n 'inertiaresume',\n interaction.element);\n\n interaction.target.fire(resumeEvent);\n interaction.prevEvent = resumeEvent;\n modifiers.resetStatuses(interaction.modifierStatuses);\n\n utils.copyCoords(interaction.prevCoords, interaction.curCoords);\n break;\n }\n\n element = utils.parentNode(element);\n }\n }\n});\n\nInteraction.signals.on('up', function ({ interaction, event }) {\n const status = interaction.inertiaStatus;\n\n if (!interaction.interacting() || status.active) { return; }\n\n const target = interaction.target;\n const options = target && target.options;\n const inertiaOptions = options && interaction.prepared.name && options[interaction.prepared.name].inertia;\n\n const now = new Date().getTime();\n const statuses = {};\n const page = utils.extend({}, interaction.curCoords.page);\n const pointerSpeed = interaction.pointerDelta.client.speed;\n\n let smoothEnd = false;\n let modifierResult;\n\n // check if inertia should be started\n const inertiaPossible = (inertiaOptions && inertiaOptions.enabled\n && interaction.prepared.name !== 'gesture'\n && event !== status.startEvent);\n\n const inertia = (inertiaPossible\n && (now - interaction.curCoords.timeStamp) < 50\n && pointerSpeed > inertiaOptions.minSpeed\n && pointerSpeed > inertiaOptions.endSpeed);\n\n const modifierArg = {\n interaction,\n pageCoords: page,\n statuses,\n preEnd: true,\n requireEndOnly: true,\n };\n\n // smoothEnd\n if (inertiaPossible && !inertia) {\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n if (modifierResult.shouldMove && modifierResult.locked) {\n smoothEnd = true;\n }\n }\n\n if (!(inertia || smoothEnd)) { return; }\n\n utils.copyCoords(status.upCoords, interaction.curCoords);\n\n interaction.pointers[0] = status.startEvent =\n new InteractEvent(interaction, event, interaction.prepared.name, 'inertiastart', interaction.element);\n\n status.t0 = now;\n\n status.active = true;\n status.allowResume = inertiaOptions.allowResume;\n interaction.simulation = status;\n\n target.fire(status.startEvent);\n\n if (inertia) {\n status.vx0 = interaction.pointerDelta.client.vx;\n status.vy0 = interaction.pointerDelta.client.vy;\n status.v0 = pointerSpeed;\n\n calcInertia(interaction, status);\n\n utils.extend(page, interaction.curCoords.page);\n\n page.x += status.xe;\n page.y += status.ye;\n\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n status.modifiedXe += modifierResult.dx;\n status.modifiedYe += modifierResult.dy;\n\n status.i = animationFrame.request(interaction.boundInertiaFrame);\n }\n else {\n status.smoothEnd = true;\n status.xe = modifierResult.dx;\n status.ye = modifierResult.dy;\n\n status.sx = status.sy = 0;\n\n status.i = animationFrame.request(interaction.boundSmoothEndFrame);\n }\n});\n\nInteraction.signals.on('stop-active', function ({ interaction }) {\n const status = interaction.inertiaStatus;\n\n if (status.active) {\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n }\n});\n\nfunction calcInertia (interaction, status) {\n const inertiaOptions = interaction.target.options[interaction.prepared.name].inertia;\n const lambda = inertiaOptions.resistance;\n const inertiaDur = -Math.log(inertiaOptions.endSpeed / status.v0) / lambda;\n\n status.x0 = interaction.prevEvent.pageX;\n status.y0 = interaction.prevEvent.pageY;\n status.t0 = status.startEvent.timeStamp / 1000;\n status.sx = status.sy = 0;\n\n status.modifiedXe = status.xe = (status.vx0 - inertiaDur) / lambda;\n status.modifiedYe = status.ye = (status.vy0 - inertiaDur) / lambda;\n status.te = inertiaDur;\n\n status.lambda_v0 = lambda / status.v0;\n status.one_ve_v0 = 1 - inertiaOptions.endSpeed / status.v0;\n}\n\nfunction inertiaFrame () {\n updateInertiaCoords(this);\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n\n const status = this.inertiaStatus;\n const options = this.target.options[this.prepared.name].inertia;\n const lambda = options.resistance;\n const t = new Date().getTime() / 1000 - status.t0;\n\n if (t < status.te) {\n\n const progress = 1 - (Math.exp(-lambda * t) - status.lambda_v0) / status.one_ve_v0;\n\n if (status.modifiedXe === status.xe && status.modifiedYe === status.ye) {\n status.sx = status.xe * progress;\n status.sy = status.ye * progress;\n }\n else {\n const quadPoint = utils.getQuadraticCurvePoint(0, 0,\n status.xe,\n status.ye,\n status.modifiedXe,\n status.modifiedYe,\n progress);\n\n status.sx = quadPoint.x;\n status.sy = quadPoint.y;\n }\n\n this.doMove();\n\n status.i = animationFrame.request(this.boundInertiaFrame);\n }\n else {\n status.sx = status.modifiedXe;\n status.sy = status.modifiedYe;\n\n this.doMove();\n this.end(status.startEvent);\n status.active = false;\n this.simulation = null;\n }\n\n utils.copyCoords(this.prevCoords, this.curCoords);\n}\n\nfunction smoothEndFrame () {\n updateInertiaCoords(this);\n\n const status = this.inertiaStatus;\n const t = new Date().getTime() - status.t0;\n const duration = this.target.options[this.prepared.name].inertia.smoothEndDuration;\n\n if (t < duration) {\n status.sx = utils.easeOutQuad(t, 0, status.xe, duration);\n status.sy = utils.easeOutQuad(t, 0, status.ye, duration);\n\n this.pointerMove(status.startEvent, status.startEvent);\n\n status.i = animationFrame.request(this.boundSmoothEndFrame);\n }\n else {\n status.sx = status.xe;\n status.sy = status.ye;\n\n this.pointerMove(status.startEvent, status.startEvent);\n this.end(status.startEvent);\n\n status.smoothEnd =\n status.active = false;\n this.simulation = null;\n }\n}\n\nfunction updateInertiaCoords (interaction) {\n const status = interaction.inertiaStatus;\n\n // return if inertia isn't running\n if (!status.active) { return; }\n\n const pageUp = status.upCoords.page;\n const clientUp = status.upCoords.client;\n\n utils.setCoords(interaction.curCoords, [ {\n pageX : pageUp.x + status.sx,\n pageY : pageUp.y + status.sy,\n clientX: clientUp.x + status.sx,\n clientY: clientUp.y + status.sy,\n } ]);\n}\n","const browser = require('./utils/browser');\nconst events = require('./utils/events');\nconst utils = require('./utils');\nconst scope = require('./scope');\nconst Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\n\nconst globalEvents = {};\n\n/*\\\n * interact\n [ method ]\n *\n * The methods of this variable can be used to set elements as\n * interactables and also to change various default settings.\n *\n * Calling it as a function and passing an element or a valid CSS selector\n * string returns an Interactable object which has various methods to\n * configure it.\n *\n - element (Element | string) The HTML or SVG Element to interact with or CSS selector\n = (object) An @Interactable\n *\n > Usage\n | interact('#draggable').draggable(true);\n |\n | var rectables = interact('rect');\n | rectables\n | .gesturable(true)\n | .on('gesturemove', function (event) {\n | // ...\n | });\n\\*/\nfunction interact (element, options) {\n let interactable = scope.interactables.get(element, options);\n\n if (!interactable) {\n interactable = new Interactable(element, options);\n interactable.events.global = globalEvents;\n }\n\n return interactable;\n}\n\n/*\\\n * interact.isSet\n [ method ]\n *\n * Check if an element has been set\n - element (Element) The Element being searched for\n = (boolean) Indicates if the element or CSS selector was previously passed to interact\n\\*/\ninteract.isSet = function (element, options) {\n return scope.interactables.indexOfElement(element, options && options.context) !== -1;\n};\n\n/*\\\n * interact.on\n [ method ]\n *\n * Adds a global listener for an InteractEvent or adds a DOM event to\n * `document`\n *\n - type (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) interact\n\\*/\ninteract.on = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.on(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.on(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n // if it is an InteractEvent type, add listener to globalEvents\n if (utils.contains(Interactable.eventTypes, type)) {\n // if this type of event was never bound\n if (!globalEvents[type]) {\n globalEvents[type] = [listener];\n }\n else {\n globalEvents[type].push(listener);\n }\n }\n // If non InteractEvent type, addEventListener to document\n else {\n events.add(scope.document, type, listener, { options });\n }\n\n return interact;\n};\n\n/*\\\n * interact.off\n [ method ]\n *\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n - type (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) interact\n \\*/\ninteract.off = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.off(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.off(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n if (!utils.contains(Interactable.eventTypes, type)) {\n events.remove(scope.document, type, listener, options);\n }\n else {\n let index;\n\n if (type in globalEvents\n && (index = utils.indexOf(globalEvents[type], listener)) !== -1) {\n globalEvents[type].splice(index, 1);\n }\n }\n\n return interact;\n};\n\n/*\\\n * interact.debug\n [ method ]\n *\n * Returns an object which exposes internal data\n = (object) An object with properties that outline the current state and expose internal functions and variables\n\\*/\ninteract.debug = function () {\n return scope;\n};\n\n// expose the functions used to calculate multi-touch properties\ninteract.getPointerAverage = utils.pointerAverage;\ninteract.getTouchBBox = utils.touchBBox;\ninteract.getTouchDistance = utils.touchDistance;\ninteract.getTouchAngle = utils.touchAngle;\n\ninteract.getElementRect = utils.getElementRect;\ninteract.getElementClientRect = utils.getElementClientRect;\ninteract.matchesSelector = utils.matchesSelector;\ninteract.closest = utils.closest;\n\n/*\\\n * interact.supportsTouch\n [ method ]\n *\n = (boolean) Whether or not the browser supports touch input\n\\*/\ninteract.supportsTouch = function () {\n return browser.supportsTouch;\n};\n\n/*\\\n * interact.supportsPointerEvent\n [ method ]\n *\n = (boolean) Whether or not the browser supports PointerEvents\n\\*/\ninteract.supportsPointerEvent = function () {\n return browser.supportsPointerEvent;\n};\n\n/*\\\n * interact.stop\n [ method ]\n *\n * Cancels all interactions (end events are not fired)\n *\n - event (Event) An event on which to call preventDefault()\n = (object) interact\n\\*/\ninteract.stop = function (event) {\n for (let i = scope.interactions.length - 1; i >= 0; i--) {\n scope.interactions[i].stop(event);\n }\n\n return interact;\n};\n\n/*\\\n * interact.pointerMoveTolerance\n [ method ]\n * Returns or sets the distance the pointer must be moved before an action\n * sequence occurs. This also affects tolerance for tap events.\n *\n - newValue (number) #optional The movement from the start position must be greater than this value\n = (number | Interactable) The current setting or interact\n\\*/\ninteract.pointerMoveTolerance = function (newValue) {\n if (utils.is.number(newValue)) {\n Interaction.pointerMoveTolerance = newValue;\n\n return this;\n }\n\n return Interaction.pointerMoveTolerance;\n};\n\ninteract.addDocument = scope.addDocument;\ninteract.removeDocument = scope.removeDocument;\n\nscope.interact = interact;\n\nmodule.exports = interact;\n","const Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\nconst scope = require('./scope');\nconst is = require('./utils/is');\nconst events = require('./utils/events');\n\nconst { nodeContains, matchesSelector } = require('./utils/domUtils');\n\n/*\\\n * Interactable.preventDefault\n [ method ]\n *\n * Returns or sets whether to prevent the browser's default behaviour\n * in response to pointer events. Can be set to:\n * - `'always'` to always prevent\n * - `'never'` to never prevent\n * - `'auto'` to let interact.js try to determine what would be best\n *\n - newValue (string) #optional `true`, `false` or `'auto'`\n = (string | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.preventDefault = function (newValue) {\n if (/^(always|never|auto)$/.test(newValue)) {\n this.options.preventDefault = newValue;\n return this;\n }\n\n if (is.bool(newValue)) {\n this.options.preventDefault = newValue? 'always' : 'never';\n return this;\n }\n\n return this.options.preventDefault;\n};\n\nInteractable.prototype.checkAndPreventDefault = function (event) {\n const setting = this.options.preventDefault;\n\n if (setting === 'never') { return; }\n\n if (setting === 'always') {\n event.preventDefault();\n return;\n }\n\n // setting === 'auto'\n\n // don't preventDefault if the browser supports passiveEvents\n // CSS touch-action and user-selecct should be used instead\n if (events.supportsOptions) {\n return;\n }\n\n // don't preventDefault of pointerdown events\n if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) {\n return;\n }\n\n // don't preventDefault on editable elements\n if (is.element(event.target)\n && matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) {\n return;\n }\n\n event.preventDefault();\n};\n\nfunction onInteractionEvent ({ interaction, event }) {\n if (interaction.target) {\n interaction.target.checkAndPreventDefault(event);\n }\n}\n\nfor (const eventSignal of ['down', 'move', 'up', 'cancel']) {\n Interaction.signals.on(eventSignal, onInteractionEvent);\n}\n\n// prevent native HTML5 drag on interact.js target elements\nInteraction.docEvents.dragstart = function preventNativeDrag (event) {\n for (const interaction of scope.interactions) {\n\n if (interaction.element\n && (interaction.element === event.target\n || nodeContains(interaction.element, event.target))) {\n\n interaction.target.checkAndPreventDefault(event);\n return;\n }\n }\n};\n","const scope = require('./scope');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst iFinder = require('./utils/interactionFinder');\nconst pointerEvents = require('./pointerEvents/base');\n\nconst { window } = require('./utils/window');\n\nconst toString = Object.prototype.toString;\n\nif (!window.Array.isArray) {\n window.Array.isArray = function (obj) {\n return toString.call(obj) === '[object Array]';\n };\n}\n\nif (!String.prototype.trim) {\n String.prototype.trim = function () {\n return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n };\n}\n\n// http://www.quirksmode.org/dom/events/click.html\n// >Events leading to dblclick\n//\n// IE8 doesn't fire down event before dblclick.\n// This workaround tries to fire a tap and doubletap after dblclick\nfunction onIE8Dblclick (event) {\n const eventTarget = event.target;\n const interaction = iFinder.search(event, event.type, eventTarget);\n\n if (!interaction) { return; }\n\n if (interaction.prevTap\n && event.clientX === interaction.prevTap.clientX\n && event.clientY === interaction.prevTap.clientY\n && eventTarget === interaction.prevTap.target) {\n\n interaction.downTargets[0] = eventTarget;\n interaction.downTimes [0] = new Date().getTime();\n\n pointerEvents.fire({\n interaction,\n event,\n eventTarget,\n pointer: event,\n type: 'tap',\n });\n }\n}\n\nif (browser.isIE8) {\n const selectFix = function (event) {\n for (const interaction of scope.interactions) {\n if (interaction.interacting()) {\n interaction.target.checkAndPreventDefault(event);\n }\n }\n };\n\n const onDocIE8 = function onDocIE8 ({ doc, win }, signalName) {\n const eventMethod = signalName.indexOf('listen') === 0\n ? events.add : events.remove;\n\n // For IE's lack of Event#preventDefault\n eventMethod(doc, 'selectstart', selectFix);\n\n if (pointerEvents) {\n eventMethod(doc, 'dblclick', onIE8Dblclick);\n }\n };\n\n scope.signals.on('add-document' , onDocIE8);\n scope.signals.on('remove-document', onDocIE8);\n}\n\nmodule.exports = null;\n","const InteractEvent = require('../InteractEvent');\nconst Interaction = require('../Interaction');\nconst extend = require('../utils/extend');\n\nconst modifiers = {\n names: [],\n\n setOffsets: function (arg) {\n const { interaction, pageCoords: page } = arg;\n const { target, element, startOffset } = interaction;\n const rect = target.getRect(element);\n\n if (rect) {\n startOffset.left = page.x - rect.left;\n startOffset.top = page.y - rect.top;\n\n startOffset.right = rect.right - page.x;\n startOffset.bottom = rect.bottom - page.y;\n\n if (!('width' in rect)) { rect.width = rect.right - rect.left; }\n if (!('height' in rect)) { rect.height = rect.bottom - rect.top ; }\n }\n else {\n startOffset.left = startOffset.top = startOffset.right = startOffset.bottom = 0;\n }\n\n arg.rect = rect;\n arg.interactable = target;\n arg.element = element;\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n\n arg.options = target.options[interaction.prepared.name][modifierName];\n\n if (!arg.options) {\n continue;\n }\n\n interaction.modifierOffsets[modifierName] = modifiers[modifierName].setOffset(arg);\n }\n },\n\n setAll: function (arg) {\n const { interaction, statuses, preEnd, requireEndOnly } = arg;\n const coords = extend({}, arg.pageCoords);\n const result = {\n dx: 0,\n dy: 0,\n changed: false,\n locked: false,\n shouldMove: true,\n };\n\n for (const modifierName of modifiers.names) {\n const modifier = modifiers[modifierName];\n const options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!shouldDo(options, preEnd, requireEndOnly)) { continue; }\n\n arg.status = arg.status = statuses[modifierName];\n arg.options = options;\n arg.offset = arg.interaction.modifierOffsets[modifierName];\n\n modifier.set(arg);\n\n if (arg.status.locked) {\n coords.x += arg.status.dx;\n coords.y += arg.status.dy;\n\n result.dx += arg.status.dx;\n result.dy += arg.status.dy;\n\n result.locked = true;\n }\n }\n\n // a move should be fired if:\n // - there are no modifiers enabled,\n // - no modifiers are \"locked\" i.e. have changed the pointer's coordinates, or\n // - the locked coords have changed since the last pointer move\n result.shouldMove = !arg.status || !result.locked || arg.status.changed;\n\n return result;\n },\n\n resetStatuses: function (statuses) {\n for (const modifierName of modifiers.names) {\n const status = statuses[modifierName] || {};\n\n status.dx = status.dy = 0;\n status.modifiedX = status.modifiedY = NaN;\n status.locked = false;\n status.changed = true;\n\n statuses[modifierName] = status;\n }\n\n return statuses;\n },\n\n start: function ({ interaction }, signalName) {\n const arg = {\n interaction,\n pageCoords: (signalName === 'action-resume' ?\n interaction.curCoords : interaction.startCoords).page,\n startOffset: interaction.startOffset,\n statuses: interaction.modifierStatuses,\n preEnd: false,\n requireEndOnly: false,\n };\n\n modifiers.setOffsets(arg);\n modifiers.resetStatuses(arg.statuses);\n\n arg.pageCoords = extend({}, interaction.startCoords.page);\n interaction.modifierResult = modifiers.setAll(arg);\n },\n};\n\nInteraction.signals.on('new', function (interaction) {\n interaction.startOffset = { left: 0, right: 0, top: 0, bottom: 0 };\n interaction.modifierOffsets = {};\n interaction.modifierStatuses = modifiers.resetStatuses({});\n interaction.modifierResult = null;\n});\n\nInteraction.signals.on('action-start' , modifiers.start);\nInteraction.signals.on('action-resume', modifiers.start);\n\nInteraction.signals.on('before-action-move', function ({ interaction, preEnd, interactingBeforeMove }) {\n const modifierResult = modifiers.setAll({\n interaction,\n preEnd,\n pageCoords: interaction.curCoords.page,\n statuses: interaction.modifierStatuses,\n requireEndOnly: false,\n });\n\n // don't fire an action move if a modifier would keep the event in the same\n // cordinates as before\n if (!modifierResult.shouldMove && interactingBeforeMove) {\n interaction._dontFireMove = true;\n }\n\n interaction.modifierResult = modifierResult;\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n for (let i = 0; i < modifiers.names.length; i++) {\n const options = interaction.target.options[interaction.prepared.name][modifiers.names[i]];\n\n // if the endOnly option is true for any modifier\n if (shouldDo(options, true, true)) {\n // fire a move event at the modified coordinates\n interaction.doMove({ event, preEnd: true });\n break;\n }\n }\n});\n\nInteractEvent.signals.on('set-xy', function (arg) {\n const { iEvent, interaction } = arg;\n const modifierArg = extend({}, arg);\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n modifierArg.options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!modifierArg.options) {\n continue;\n }\n\n const modifier = modifiers[modifierName];\n\n modifierArg.status = interaction.modifierStatuses[modifierName];\n\n iEvent[modifierName] = modifier.modifyCoords(modifierArg);\n }\n});\n\nfunction shouldDo (options, preEnd, requireEndOnly) {\n return (options && options.enabled\n && (preEnd || !options.endOnly)\n && (!requireEndOnly || options.endOnly));\n}\n\nmodule.exports = modifiers;\n","const modifiers = require('./index');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst restrict = {\n defaults: {\n enabled : false,\n endOnly : false,\n restriction: null,\n elementRect: null,\n },\n\n setOffset: function ({ rect, startOffset, options }) {\n const elementRect = options && options.elementRect;\n const offset = {};\n\n if (rect && elementRect) {\n offset.left = startOffset.left - (rect.width * elementRect.left);\n offset.top = startOffset.top - (rect.height * elementRect.top);\n\n offset.right = startOffset.right - (rect.width * (1 - elementRect.right));\n offset.bottom = startOffset.bottom - (rect.height * (1 - elementRect.bottom));\n }\n else {\n offset.left = offset.top = offset.right = offset.bottom = 0;\n }\n\n return offset;\n },\n\n set: function ({ pageCoords, interaction, status, options }) {\n if (!options) { return status; }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n\n const restriction = getRestrictionRect(options.restriction, interaction, page);\n\n if (!restriction) { return status; }\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n const rect = restriction;\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n const offset = interaction.modifierOffsets.restrict;\n\n // object is assumed to have\n // x, y, width, height or\n // left, top, right, bottom\n if ('x' in restriction && 'y' in restriction) {\n modifiedX = Math.max(Math.min(rect.x + rect.width - offset.right , page.x), rect.x + offset.left);\n modifiedY = Math.max(Math.min(rect.y + rect.height - offset.bottom, page.y), rect.y + offset.top );\n }\n else {\n modifiedX = Math.max(Math.min(rect.right - offset.right , page.x), rect.left + offset.left);\n modifiedY = Math.max(Math.min(rect.bottom - offset.bottom, page.y), rect.top + offset.top );\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const elementRect = options && options.elementRect;\n\n if (options && options.enabled\n && !(phase === 'start' && elementRect && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n getRestrictionRect,\n};\n\nfunction getRestrictionRect (value, interaction, page) {\n if (utils.is.function(value)) {\n return utils.resolveRectLike(value, interaction.target, interaction.element, [page.x, page.y, interaction]);\n } else {\n return utils.resolveRectLike(value, interaction.target, interaction.element);\n }\n}\n\nmodifiers.restrict = restrict;\nmodifiers.names.push('restrict');\n\ndefaultOptions.perAction.restrict = restrict.defaults;\n\nmodule.exports = restrict;\n","// This module adds the options.resize.restrictEdges setting which sets min and\n// max for the top, left, bottom and right edges of the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictEdges: {\n// inner: { top: 200, left: 200, right: 400, bottom: 400 },\n// outer: { top: 0, left: 0, right: 600, bottom: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst { getRestrictionRect } = require('./restrict');\n\nconst noInner = { top: +Infinity, left: +Infinity, bottom: -Infinity, right: -Infinity };\nconst noOuter = { top: -Infinity, left: -Infinity, bottom: +Infinity, right: +Infinity };\n\nconst restrictEdges = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n offset: null,\n },\n\n setOffset: function ({ interaction, startOffset, options }) {\n if (!options) {\n return utils.extend({}, startOffset);\n }\n\n const offset = getRestrictionRect(options.offset, interaction, interaction.startCoords.page);\n\n if (offset) {\n return {\n top: startOffset.top + offset.y,\n left: startOffset.left + offset.x,\n bottom: startOffset.bottom + offset.y,\n right: startOffset.right + offset.x,\n };\n }\n\n return startOffset;\n },\n\n set: function ({ pageCoords, interaction, status, offset, options }) {\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n const inner = rectUtils.xywhToTlbr(getRestrictionRect(options.inner, interaction, page)) || noInner;\n const outer = rectUtils.xywhToTlbr(getRestrictionRect(options.outer, interaction, page)) || noOuter;\n\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n if (edges.top) {\n modifiedY = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top);\n }\n else if (edges.bottom) {\n modifiedY = Math.max(Math.min(outer.bottom - offset.bottom, page.y), inner.bottom - offset.bottom);\n }\n if (edges.left) {\n modifiedX = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left);\n }\n else if (edges.right) {\n modifiedX = Math.max(Math.min(outer.right - offset.right, page.x), inner.right - offset.right);\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n if (options && options.enabled\n && !(phase === 'start' && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n noInner,\n noOuter,\n getRestrictionRect,\n};\n\nmodifiers.restrictEdges = restrictEdges;\nmodifiers.names.push('restrictEdges');\n\ndefaultOptions.perAction.restrictEdges = restrictEdges.defaults;\nresize.defaults.restrictEdges = restrictEdges.defaults;\n\nmodule.exports = restrictEdges;\n","// This module adds the options.resize.restrictSize setting which sets min and\n// max width and height for the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictSize: {\n// min: { width: -600, height: -600 },\n// max: { width: 600, height: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst restrictEdges = require('./restrictEdges');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst noMin = { width: -Infinity, height: -Infinity };\nconst noMax = { width: +Infinity, height: +Infinity };\n\nconst restrictSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n },\n\n setOffset: function ({ interaction }) {\n return interaction.startOffset;\n },\n\n set: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const rect = rectUtils.xywhToTlbr(interaction.resizeRects.inverted);\n\n const minSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.min, interaction)) || noMin;\n const maxSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.max, interaction)) || noMax;\n\n arg.options = {\n enabled: options.enabled,\n endOnly: options.endOnly,\n inner: utils.extend({}, restrictEdges.noInner),\n outer: utils.extend({}, restrictEdges.noOuter),\n };\n\n if (edges.top) {\n arg.options.inner.top = rect.bottom - minSize.height;\n arg.options.outer.top = rect.bottom - maxSize.height;\n }\n else if (edges.bottom) {\n arg.options.inner.bottom = rect.top + minSize.height;\n arg.options.outer.bottom = rect.top + maxSize.height;\n }\n if (edges.left) {\n arg.options.inner.left = rect.right - minSize.width;\n arg.options.outer.left = rect.right - maxSize.width;\n }\n else if (edges.right) {\n arg.options.inner.right = rect.left + minSize.width;\n arg.options.outer.right = rect.left + maxSize.width;\n }\n\n restrictEdges.set(arg);\n },\n\n modifyCoords: restrictEdges.modifyCoords,\n};\n\nmodifiers.restrictSize = restrictSize;\nmodifiers.names.push('restrictSize');\n\ndefaultOptions.perAction.restrictSize = restrictSize.defaults;\nresize.defaults.restrictSize = restrictSize.defaults;\n\nmodule.exports = restrictSize;\n","const modifiers = require('./index');\nconst interact = require('../interact');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst snap = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n\n relativePoints: null,\n },\n\n setOffset: function ({ interaction, interactable, element, rect, startOffset, options }) {\n const offsets = [];\n const optionsOrigin = utils.rectToXY(utils.resolveRectLike(options.origin));\n const origin = optionsOrigin || utils.getOriginXY(interactable, element, interaction.prepared.name);\n options = options || interactable.options[interaction.prepared.name].snap || {};\n\n let snapOffset;\n\n if (options.offset === 'startCoords') {\n snapOffset = {\n x: interaction.startCoords.page.x - origin.x,\n y: interaction.startCoords.page.y - origin.y,\n };\n }\n else {\n const offsetRect = utils.resolveRectLike(options.offset, interactable, element, [interaction]);\n\n snapOffset = utils.rectToXY(offsetRect) || { x: 0, y: 0 };\n }\n\n if (rect && options.relativePoints && options.relativePoints.length) {\n for (const { x: relativeX, y: relativeY } of options.relativePoints) {\n offsets.push({\n x: startOffset.left - (rect.width * relativeX) + snapOffset.x,\n y: startOffset.top - (rect.height * relativeY) + snapOffset.y,\n });\n }\n }\n else {\n offsets.push(snapOffset);\n }\n\n return offsets;\n },\n\n set: function ({ interaction, pageCoords, status, options, offset: offsets }) {\n const targets = [];\n let target;\n let page;\n let i;\n\n if (status.useStatusXY) {\n page = { x: status.x, y: status.y };\n }\n else {\n const origin = utils.getOriginXY(interaction.target, interaction.element, interaction.prepared.name);\n\n page = utils.extend({}, pageCoords);\n\n page.x -= origin.x;\n page.y -= origin.y;\n }\n\n status.realX = page.x;\n status.realY = page.y;\n\n let len = options.targets? options.targets.length : 0;\n\n for (const { x: offsetX, y: offsetY } of offsets) {\n const relativeX = page.x - offsetX;\n const relativeY = page.y - offsetY;\n\n for (const snapTarget of options.targets) {\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n targets.push({\n x: utils.is.number(target.x) ? (target.x + offsetX) : relativeX,\n y: utils.is.number(target.y) ? (target.y + offsetY) : relativeY,\n\n range: utils.is.number(target.range)? target.range: options.range,\n });\n }\n }\n\n const closest = {\n target: null,\n inRange: false,\n distance: 0,\n range: 0,\n dx: 0,\n dy: 0,\n };\n\n for (i = 0, len = targets.length; i < len; i++) {\n target = targets[i];\n\n const range = target.range;\n const dx = target.x - page.x;\n const dy = target.y - page.y;\n const distance = utils.hypot(dx, dy);\n let inRange = distance <= range;\n\n // Infinite targets count as being out of range\n // compared to non infinite ones that are in range\n if (range === Infinity && closest.inRange && closest.range !== Infinity) {\n inRange = false;\n }\n\n if (!closest.target || (inRange\n // is the closest target in range?\n ? (closest.inRange && range !== Infinity\n // the pointer is relatively deeper in this target\n ? distance / range < closest.distance / closest.range\n // this target has Infinite range and the closest doesn't\n : (range === Infinity && closest.range !== Infinity)\n // OR this target is closer that the previous closest\n || distance < closest.distance)\n // The other is not in range and the pointer is closer to this target\n : (!closest.inRange && distance < closest.distance))) {\n\n closest.target = target;\n closest.distance = distance;\n closest.range = range;\n closest.inRange = inRange;\n closest.dx = dx;\n closest.dy = dy;\n\n status.range = range;\n }\n }\n\n let snapChanged;\n\n if (closest.target) {\n snapChanged = (status.modifiedX !== closest.target.x || status.modifiedY !== closest.target.y);\n\n status.modifiedX = closest.target.x;\n status.modifiedY = closest.target.y;\n }\n else {\n snapChanged = true;\n\n status.modifiedX = NaN;\n status.modifiedY = NaN;\n }\n\n status.dx = closest.dx;\n status.dy = closest.dy;\n\n status.changed = (snapChanged || (closest.inRange && !status.locked));\n status.locked = closest.inRange;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const relativePoints = options && options.relativePoints;\n\n if (options && options.enabled\n && !(phase === 'start' && relativePoints && relativePoints.length)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n }\n\n return {\n range : status.range,\n locked : status.locked,\n x : status.modifiedX,\n y : status.modifiedY,\n realX : status.realX,\n realY : status.realY,\n dx : status.dx,\n dy : status.dy,\n };\n }\n },\n};\n\ninteract.createSnapGrid = function (grid) {\n return function (x, y) {\n const limits = grid.limits || {\n left : -Infinity,\n right : Infinity,\n top : -Infinity,\n bottom: Infinity,\n };\n let offsetX = 0;\n let offsetY = 0;\n\n if (utils.is.object(grid.offset)) {\n offsetX = grid.offset.x;\n offsetY = grid.offset.y;\n }\n\n const gridx = Math.round((x - offsetX) / grid.x);\n const gridy = Math.round((y - offsetY) / grid.y);\n\n const newX = Math.max(limits.left, Math.min(limits.right , gridx * grid.x + offsetX));\n const newY = Math.max(limits.top , Math.min(limits.bottom, gridy * grid.y + offsetY));\n\n return {\n x: newX,\n y: newY,\n range: grid.range,\n };\n };\n};\n\nmodifiers.snap = snap;\nmodifiers.names.push('snap');\n\ndefaultOptions.perAction.snap = snap.defaults;\n\nmodule.exports = snap;\n","// This module allows snapping of the size of targets during resize\n// interactions.\n\nconst modifiers = require('./index');\nconst snap = require('./snap');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\nconst utils = require('../utils/');\n\nconst snapSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n },\n\n setOffset: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.edges;\n\n if (!edges) { return; }\n\n arg.options = {\n relativePoints: [{\n x: edges.left? 0 : 1,\n y: edges.top ? 0 : 1,\n }],\n origin: { x: 0, y: 0 },\n offset: 'self',\n range: options.range,\n };\n\n const offsets = snap.setOffset(arg);\n arg.options = options;\n\n return offsets;\n },\n\n set: function (arg) {\n const { interaction, options, offset, pageCoords } = arg;\n const page = utils.extend({}, pageCoords);\n const relativeX = page.x - offset[0].x;\n const relativeY = page.y - offset[0].y;\n\n arg.options = utils.extend({}, options);\n arg.options.targets = [];\n\n for (const snapTarget of options.targets) {\n let target;\n\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n if ('width' in target && 'height' in target) {\n target.x = target.width;\n target.y = target.height;\n }\n\n arg.options.targets.push(target);\n }\n\n snap.set(arg);\n },\n\n modifyCoords: function (arg) {\n const { options } = arg;\n\n arg.options = utils.extend({}, options);\n arg.options.enabled = options.enabled;\n arg.options.relativePoints = [null];\n\n snap.modifyCoords(arg);\n },\n};\n\nmodifiers.snapSize = snapSize;\nmodifiers.names.push('snapSize');\n\ndefaultOptions.perAction.snapSize = snapSize.defaults;\nresize.defaults.snapSize = snapSize.defaults;\n\nmodule.exports = snapSize;\n","const pointerUtils = require('../utils/pointerUtils');\n\nmodule.exports = class PointerEvent {\n constructor (type, pointer, event, eventTarget, interaction) {\n pointerUtils.pointerExtend(this, event);\n\n if (event !== pointer) {\n pointerUtils.pointerExtend(this, pointer);\n }\n\n this.interaction = interaction;\n\n this.timeStamp = new Date().getTime();\n this.originalEvent = event;\n this.type = type;\n this.pointerId = pointerUtils.getPointerId(pointer);\n this.pointerType = pointerUtils.getPointerType(pointer);\n this.target = eventTarget;\n this.currentTarget = null;\n\n if (type === 'tap') {\n const pointerIndex = interaction.getPointerIndex(pointer);\n this.dt = this.timeStamp - interaction.downTimes[pointerIndex];\n\n const interval = this.timeStamp - interaction.tapTime;\n\n this.double = !!(interaction.prevTap\n && interaction.prevTap.type !== 'doubletap'\n && interaction.prevTap.target === this.target\n && interval < 500);\n }\n else if (type === 'doubletap') {\n this.dt = pointer.timeStamp - interaction.tapTime;\n }\n }\n\n subtractOrigin ({ x: originX, y: originY }) {\n this.pageX -= originX;\n this.pageY -= originY;\n this.clientX -= originX;\n this.clientY -= originY;\n\n return this;\n }\n\n addOrigin ({ x: originX, y: originY }) {\n this.pageX += originX;\n this.pageY += originY;\n this.clientX += originX;\n this.clientY += originY;\n\n return this;\n }\n\n preventDefault () {\n this.originalEvent.preventDefault();\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n};\n","const PointerEvent = require('./PointerEvent');\nconst Interaction = require('../Interaction');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst defaults = require('../defaultOptions');\nconst signals = require('../utils/Signals').new();\nconst { filter } = require('../utils/arr');\n\nconst simpleSignals = [ 'down', 'up', 'cancel' ];\nconst simpleEvents = [ 'down', 'up', 'cancel' ];\n\nconst pointerEvents = {\n PointerEvent,\n fire,\n collectEventTargets,\n signals,\n defaults: {\n holdDuration: 600,\n ignoreFrom : null,\n allowFrom : null,\n origin : { x: 0, y: 0 },\n },\n types: [\n 'down',\n 'move',\n 'up',\n 'cancel',\n 'tap',\n 'doubletap',\n 'hold',\n ],\n};\n\nfunction fire (arg) {\n const {\n interaction, pointer, event, eventTarget,\n type = arg.pointerEvent.type,\n targets = collectEventTargets(arg),\n pointerEvent = new PointerEvent(type, pointer, event, eventTarget, interaction),\n } = arg;\n\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n targets,\n type,\n pointerEvent,\n };\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n\n for (const prop in target.props || {}) {\n pointerEvent[prop] = target.props[prop];\n }\n\n const origin = utils.getOriginXY(target.eventable, target.element);\n\n pointerEvent.subtractOrigin(origin);\n pointerEvent.eventable = target.eventable;\n pointerEvent.currentTarget = target.element;\n\n target.eventable.fire(pointerEvent);\n\n pointerEvent.addOrigin(origin);\n\n if (pointerEvent.immediatePropagationStopped\n || (pointerEvent.propagationStopped\n && (i + 1) < targets.length && targets[i + 1].element !== pointerEvent.currentTarget)) {\n break;\n }\n }\n\n signals.fire('fired', signalArg);\n\n if (type === 'tap') {\n // if pointerEvent should make a double tap, create and fire a doubletap\n // PointerEvent and use that as the prevTap\n const prevTap = pointerEvent.double\n ? fire({\n interaction, pointer, event, eventTarget,\n type: 'doubletap',\n })\n : pointerEvent;\n\n interaction.prevTap = prevTap;\n interaction.tapTime = prevTap.timeStamp;\n }\n\n return pointerEvent;\n}\n\nfunction collectEventTargets ({ interaction, pointer, event, eventTarget, type }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n // do not fire a tap event if the pointer was moved before being lifted\n if (type === 'tap' && (interaction.pointerWasMoved\n // or if the pointerup target is different to the pointerdown target\n || !(interaction.downTargets[pointerIndex] && interaction.downTargets[pointerIndex] === eventTarget))) {\n return [];\n }\n\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n path,\n targets: [],\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (type === 'hold') {\n signalArg.targets = filter(signalArg.targets, target =>\n target.eventable.options.holdDuration === interaction.holdTimers[pointerIndex].duration);\n }\n\n return signalArg.targets;\n}\n\nInteraction.signals.on('update-pointer-down', function ({ interaction, pointerIndex }) {\n interaction.holdTimers[pointerIndex] = { duration: Infinity, timeout: null };\n});\n\nInteraction.signals.on('remove-pointer', function ({ interaction, pointerIndex }) {\n interaction.holdTimers.splice(pointerIndex, 1);\n});\n\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget, duplicateMove }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n if (!duplicateMove && (!interaction.pointerIsDown || interaction.pointerWasMoved)) {\n if (interaction.pointerIsDown) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n\n fire({\n interaction, pointer, event, eventTarget,\n type: 'move',\n });\n }\n});\n\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget, pointerIndex }) {\n // copy event to be used in timeout for IE8\n const eventCopy = browser.isIE8? utils.extend({}, event) : event;\n\n const timer = interaction.holdTimers[pointerIndex];\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'hold',\n targets: [],\n path,\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (!signalArg.targets.length) { return; }\n\n let minDuration = Infinity;\n\n for (let i = 0; i < signalArg.targets.length; i++) {\n const target = signalArg.targets[i];\n const holdDuration = target.eventable.options.holdDuration;\n\n if (holdDuration < minDuration) {\n minDuration = holdDuration;\n }\n }\n\n timer.duration = minDuration;\n timer.timeout = setTimeout(function () {\n fire({\n interaction,\n eventTarget,\n pointer: browser.isIE8? eventCopy : pointer,\n event: eventCopy,\n type: 'hold',\n });\n }, minDuration);\n});\n\nInteraction.signals.on('up', ({ interaction, pointer, event, eventTarget }) => {\n if (!interaction.pointerWasMoved) {\n fire({ interaction, eventTarget, pointer, event, type: 'tap' });\n }\n});\n\n['up', 'cancel'].forEach(function (signalName) {\n Interaction.signals.on(signalName, function ({ interaction, pointerIndex }) {\n if (interaction.holdTimers[pointerIndex]) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n });\n});\n\nfunction createSignalListener (type) {\n return function ({ interaction, pointer, event, eventTarget }) {\n fire({ interaction, eventTarget, pointer, event, type });\n };\n}\n\nfor (let i = 0; i < simpleSignals.length; i++) {\n Interaction.signals.on(simpleSignals[i], createSignalListener(simpleEvents[i]));\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.prevTap = null; // the most recent tap event on this interaction\n interaction.tapTime = 0; // time of the most recent tap event\n interaction.holdTimers = []; // [{ duration, timeout }]\n});\n\ndefaults.pointerEvents = pointerEvents.defaults;\nmodule.exports = pointerEvents;\n","const pointerEvents = require('./base');\nconst Interaction = require('../Interaction');\n\npointerEvents.signals.on('new', onNew);\npointerEvents.signals.on('fired', onFired);\n\nfor (const signal of ['move', 'up', 'cancel', 'endall']) {\n Interaction.signals.on(signal, endHoldRepeat);\n}\n\nfunction onNew ({ pointerEvent }) {\n if (pointerEvent.type !== 'hold') { return; }\n\n pointerEvent.count = (pointerEvent.count || 0) + 1;\n}\n\nfunction onFired ({ interaction, pointerEvent, eventTarget, targets }) {\n if (pointerEvent.type !== 'hold' || !targets.length) { return; }\n\n // get the repeat interval from the first eventable\n const interval = targets[0].eventable.options.holdRepeatInterval;\n\n // don't repeat if the interval is 0 or less\n if (interval <= 0) { return; }\n\n // set a timeout to fire the holdrepeat event\n interaction.holdIntervalHandle = setTimeout(function () {\n pointerEvents.fire({\n interaction,\n eventTarget,\n type: 'hold',\n pointer: pointerEvent,\n event: pointerEvent,\n });\n }, interval);\n}\n\nfunction endHoldRepeat ({ interaction }) {\n // set the interaction's holdStopTime property\n // to stop further holdRepeat events\n if (interaction.holdIntervalHandle) {\n clearInterval(interaction.holdIntervalHandle);\n interaction.holdIntervalHandle = null;\n }\n}\n\n// don't repeat by default\npointerEvents.defaults.holdRepeatInterval = 0;\npointerEvents.types.push('holdrepeat');\n\nmodule.exports = {\n onNew,\n onFired,\n endHoldRepeat,\n};\n","const pointerEvents = require('./base');\nconst Interactable = require('../Interactable');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\nconst scope = require('../scope');\nconst extend = require('../utils/extend');\nconst { merge } = require('../utils/arr');\n\npointerEvents.signals.on('collect-targets', function ({ targets, element, type, eventTarget }) {\n function collectSelectors (interactable, selector, context) {\n const els = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && is.element(element)\n && domUtils.matchesSelector(element, selector, els)\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n const interactable = scope.interactables.get(element);\n\n if (interactable) {\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n scope.interactables.forEachSelector(collectSelectors, element);\n});\n\nInteractable.signals.on('new', function ({ interactable }) {\n interactable.events.getRect = function (element) {\n return interactable.getRect(element);\n };\n});\n\nInteractable.signals.on('set', function ({ interactable, options }) {\n extend(interactable.events.options, pointerEvents.defaults);\n extend(interactable.events.options, options);\n});\n\nmerge(Interactable.eventTypes, pointerEvents.types);\n\nInteractable.prototype.pointerEvents = function (options) {\n extend(this.events.options, options);\n\n return this;\n};\n\nconst __backCompatOption = Interactable.prototype._backCompatOption;\n\nInteractable.prototype._backCompatOption = function (optionName, newValue) {\n const ret = __backCompatOption.call(this, optionName, newValue);\n\n if (ret === this) {\n this.events.options[optionName] = newValue;\n }\n\n return ret;\n};\n\nInteractable.settingsMethods.push('pointerEvents');\n","const utils = require('./utils');\nconst events = require('./utils/events');\nconst signals = require('./utils/Signals').new();\n\nconst scope = {\n signals,\n events,\n utils,\n\n // main document\n document: require('./utils/domObjects').document,\n // all documents being listened to\n documents: [],\n\n addDocument: function (doc, win) {\n // do nothing if document is already known\n if (utils.contains(scope.documents, doc)) { return false; }\n\n win = win || scope.getWindow(doc);\n\n scope.documents.push(doc);\n events.documents.push(doc);\n\n // don't add an unload event for the main document\n // so that the page may be cached in browser history\n if (doc !== scope.document) {\n events.add(win, 'unload', scope.onWindowUnload);\n }\n\n signals.fire('add-document', { doc, win });\n },\n\n removeDocument: function (doc, win) {\n const index = utils.indexOf(scope.documents, doc);\n\n win = win || scope.getWindow(doc);\n\n events.remove(win, 'unload', scope.onWindowUnload);\n\n scope.documents.splice(index, 1);\n events.documents.splice(index, 1);\n\n signals.fire('remove-document', { win, doc });\n },\n\n onWindowUnload: function () {\n scope.removeDocument(this.document, this);\n },\n};\n\nmodule.exports = scope;\n","const { indexOf } = require('./arr');\n\nclass Signals {\n constructor () {\n this.listeners = {\n // signalName: [listeners],\n };\n }\n\n on (name, listener) {\n if (!this.listeners[name]) {\n this.listeners[name] = [listener];\n return;\n }\n\n this.listeners[name].push(listener);\n }\n\n off (name, listener) {\n if (!this.listeners[name]) { return; }\n\n const index = indexOf(this.listeners[name], listener);\n\n if (index !== -1) {\n this.listeners[name].splice(index, 1);\n }\n }\n\n fire (name, arg) {\n const targetListeners = this.listeners[name];\n\n if (!targetListeners) { return; }\n\n for (let i = 0; i < targetListeners.length; i++) {\n if (targetListeners[i](arg, name) === false) {\n return;\n }\n }\n }\n}\n\nSignals.new = function () {\n return new Signals();\n};\n\nmodule.exports = Signals;\n","function indexOf (array, target) {\n for (let i = 0, len = array.length; i < len; i++) {\n if (array[i] === target) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction contains (array, target) {\n return indexOf(array, target) !== -1;\n}\n\nfunction merge (target, source) {\n for (let i = 0; i < source.length; i++) {\n target.push(source[i]);\n }\n\n return target;\n}\n\nfunction filter (array, test) {\n const result = [];\n\n for (let i = 0; i < array.length; i++) {\n if (test(array[i])) {\n result.push(array[i]);\n }\n }\n\n return result;\n}\n\nmodule.exports = {\n indexOf,\n contains,\n merge,\n filter,\n};\n","const { window } = require('./window');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst Element = domObjects.Element;\nconst navigator = window.navigator;\n\nconst browser = {\n // Does the browser support touch input?\n supportsTouch: !!(('ontouchstart' in window) || is.function(window.DocumentTouch)\n && domObjects.document instanceof window.DocumentTouch),\n\n // Does the browser support PointerEvents\n supportsPointerEvent: !!domObjects.PointerEvent,\n\n isIE8: ('attachEvent' in window) && !('addEventListener' in window),\n\n // Opera Mobile must be handled differently\n isOperaMobile: (navigator.appName === 'Opera'\n && browser.supportsTouch\n && navigator.userAgent.match('Presto')),\n\n // scrolling doesn't change the result of getClientRects on iOS 7\n isIOS7: (/iP(hone|od|ad)/.test(navigator.platform)\n && /OS 7[^\\d]/.test(navigator.appVersion)),\n\n isIe9OrOlder: /MSIE (8|9)/.test(navigator.userAgent),\n\n // prefix matchesSelector\n prefixedMatchesSelector: 'matches' in Element.prototype\n ? 'matches': 'webkitMatchesSelector' in Element.prototype\n ? 'webkitMatchesSelector': 'mozMatchesSelector' in Element.prototype\n ? 'mozMatchesSelector': 'oMatchesSelector' in Element.prototype\n ? 'oMatchesSelector': 'msMatchesSelector',\n\n useMatchesSelectorPolyfill: false,\n\n pEventTypes: (domObjects.PointerEvent\n ? (domObjects.PointerEvent === window.MSPointerEvent\n ? {\n up: 'MSPointerUp',\n down: 'MSPointerDown',\n over: 'mouseover',\n out: 'mouseout',\n move: 'MSPointerMove',\n cancel: 'MSPointerCancel',\n }\n : {\n up: 'pointerup',\n down: 'pointerdown',\n over: 'pointerover',\n out: 'pointerout',\n move: 'pointermove',\n cancel: 'pointercancel',\n })\n : null),\n\n // because Webkit and Opera still use 'mousewheel' event type\n wheelEvent: 'onmousewheel' in domObjects.document? 'mousewheel': 'wheel',\n\n};\n\nbrowser.useMatchesSelectorPolyfill = !is.function(Element.prototype[browser.prefixedMatchesSelector]);\n\nmodule.exports = browser;\n","const domObjects = {};\nconst win = require('./window').window;\n\nfunction blank () {}\n\ndomObjects.document = win.document;\ndomObjects.DocumentFragment = win.DocumentFragment || blank;\ndomObjects.SVGElement = win.SVGElement || blank;\ndomObjects.SVGSVGElement = win.SVGSVGElement || blank;\ndomObjects.SVGElementInstance = win.SVGElementInstance || blank;\ndomObjects.Element = win.Element || blank;\ndomObjects.HTMLElement = win.HTMLElement || domObjects.Element;\n\ndomObjects.Event = win.Event;\ndomObjects.Touch = win.Touch || blank;\ndomObjects.PointerEvent = (win.PointerEvent || win.MSPointerEvent);\n\nmodule.exports = domObjects;\n","const win = require('./window');\nconst browser = require('./browser');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst domUtils = {\n nodeContains: function (parent, child) {\n while (child) {\n if (child === parent) {\n return true;\n }\n\n child = child.parentNode;\n }\n\n return false;\n },\n\n closest: function (element, selector) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) { return element; }\n\n element = domUtils.parentNode(element);\n }\n\n return null;\n },\n\n parentNode: function (node) {\n let parent = node.parentNode;\n\n if (is.docFrag(parent)) {\n // skip past #shado-root fragments\n while ((parent = parent.host) && is.docFrag(parent)) {\n continue;\n }\n\n return parent;\n }\n\n return parent;\n },\n\n // taken from http://tanalin.com/en/blog/2012/12/matches-selector-ie8/ and modified\n matchesSelectorPolyfill: browser.useMatchesSelectorPolyfill\n ? function (element, selector, elems) {\n elems = elems || element.parentNode.querySelectorAll(selector);\n\n for (let i = 0, len = elems.length; i < len; i++) {\n if (elems[i] === element) {\n return true;\n }\n }\n\n return false;\n }\n : null,\n\n matchesSelector: function (element, selector, nodeList) {\n if (browser.useMatchesSelectorPolyfill) {\n return domUtils.matchesSelectorPolyfill(element, selector, nodeList);\n }\n\n // remove /deep/ from selectors if shadowDOM polyfill is used\n if (win.window !== win.realWindow) {\n selector = selector.replace(/\\/deep\\//g, ' ');\n }\n\n return element[browser.prefixedMatchesSelector](selector);\n },\n\n // Test for the element that's \"above\" all other qualifiers\n indexOfDeepestElement: function (elements) {\n let deepestZoneParents = [];\n let dropzoneParents = [];\n let dropzone;\n let deepestZone = elements[0];\n let index = deepestZone? 0: -1;\n let parent;\n let child;\n let i;\n let n;\n\n for (i = 1; i < elements.length; i++) {\n dropzone = elements[i];\n\n // an element might belong to multiple selector dropzones\n if (!dropzone || dropzone === deepestZone) {\n continue;\n }\n\n if (!deepestZone) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n // check if the deepest or current are document.documentElement or document.rootElement\n // - if the current dropzone is, do nothing and continue\n if (dropzone.parentNode === dropzone.ownerDocument) {\n continue;\n }\n // - if deepest is, update with the current dropzone and continue to next\n else if (deepestZone.parentNode === dropzone.ownerDocument) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n if (!deepestZoneParents.length) {\n parent = deepestZone;\n while (parent.parentNode && parent.parentNode !== parent.ownerDocument) {\n deepestZoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n }\n\n // if this element is an svg element and the current deepest is\n // an HTMLElement\n if (deepestZone instanceof domObjects.HTMLElement\n && dropzone instanceof domObjects.SVGElement\n && !(dropzone instanceof domObjects.SVGSVGElement)) {\n\n if (dropzone === deepestZone.parentNode) {\n continue;\n }\n\n parent = dropzone.ownerSVGElement;\n }\n else {\n parent = dropzone;\n }\n\n dropzoneParents = [];\n\n while (parent.parentNode !== parent.ownerDocument) {\n dropzoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n\n n = 0;\n\n // get (position of last common ancestor) + 1\n while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) {\n n++;\n }\n\n const parents = [\n dropzoneParents[n - 1],\n dropzoneParents[n],\n deepestZoneParents[n],\n ];\n\n child = parents[0].lastChild;\n\n while (child) {\n if (child === parents[1]) {\n deepestZone = dropzone;\n index = i;\n deepestZoneParents = [];\n\n break;\n }\n else if (child === parents[2]) {\n break;\n }\n\n child = child.previousSibling;\n }\n }\n\n return index;\n },\n\n matchesUpTo: function (element, selector, limit) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) {\n return true;\n }\n\n element = domUtils.parentNode(element);\n\n if (element === limit) {\n return domUtils.matchesSelector(element, selector);\n }\n }\n\n return false;\n },\n\n getActualElement: function (element) {\n return (element instanceof domObjects.SVGElementInstance\n ? element.correspondingUseElement\n : element);\n },\n\n getScrollXY: function (relevantWindow) {\n relevantWindow = relevantWindow || win.window;\n return {\n x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft,\n y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop,\n };\n },\n\n getElementClientRect: function (element) {\n const clientRect = (element instanceof domObjects.SVGElement\n ? element.getBoundingClientRect()\n : element.getClientRects()[0]);\n\n return clientRect && {\n left : clientRect.left,\n right : clientRect.right,\n top : clientRect.top,\n bottom: clientRect.bottom,\n width : clientRect.width || clientRect.right - clientRect.left,\n height: clientRect.height || clientRect.bottom - clientRect.top,\n };\n },\n\n getElementRect: function (element) {\n const clientRect = domUtils.getElementClientRect(element);\n\n if (!browser.isIOS7 && clientRect) {\n const scroll = domUtils.getScrollXY(win.getWindow(element));\n\n clientRect.left += scroll.x;\n clientRect.right += scroll.x;\n clientRect.top += scroll.y;\n clientRect.bottom += scroll.y;\n }\n\n return clientRect;\n },\n\n getPath: function (element) {\n const path = [];\n\n while (element) {\n path.push(element);\n element = domUtils.parentNode(element);\n }\n\n return path;\n },\n\n trySelector: value => {\n if (!is.string(value)) { return false; }\n\n // an exception will be raised if it is invalid\n domObjects.document.querySelector(value);\n return true;\n },\n};\n\nmodule.exports = domUtils;\n","const is = require('./is');\nconst domUtils = require('./domUtils');\nconst pExtend = require('./pointerExtend');\n\nconst { window, getWindow } = require('./window');\nconst { indexOf, contains } = require('./arr');\n\nconst useAttachEvent = ('attachEvent' in window) && !('addEventListener' in window);\nconst addEvent = useAttachEvent? 'attachEvent': 'addEventListener';\nconst removeEvent = useAttachEvent? 'detachEvent': 'removeEventListener';\nconst on = useAttachEvent? 'on': '';\n\nconst elements = [];\nconst targets = [];\nconst attachedListeners = [];\n\n// {\n// type: {\n// selectors: ['selector', ...],\n// contexts : [document, ...],\n// listeners: [[listener, capture, passive], ...]\n// }\n// }\nconst delegatedEvents = {};\n\nconst documents = [];\n\nconst supportsOptions = !useAttachEvent && (() => {\n let supported = false;\n\n window.document.createElement('div').addEventListener('test', null, {\n get capture () { supported = true; },\n });\n\n return supported;\n})();\n\nfunction add (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n let elementIndex = indexOf(elements, element);\n let target = targets[elementIndex];\n\n if (!target) {\n target = {\n events: {},\n typeCount: 0,\n };\n\n elementIndex = elements.push(element) - 1;\n targets.push(target);\n\n attachedListeners.push(useAttachEvent\n ? {\n supplied: [],\n wrapped : [],\n useCount: [],\n }\n : null);\n }\n\n if (!target.events[type]) {\n target.events[type] = [];\n target.typeCount++;\n }\n\n if (!contains(target.events[type], listener)) {\n let ret;\n\n if (useAttachEvent) {\n const { supplied, wrapped, useCount } = attachedListeners[elementIndex];\n const listenerIndex = indexOf(supplied, listener);\n\n const wrappedListener = wrapped[listenerIndex] || function (event) {\n if (!event.immediatePropagationStopped) {\n event.target = event.srcElement;\n event.currentTarget = element;\n\n event.preventDefault = event.preventDefault || preventDef;\n event.stopPropagation = event.stopPropagation || stopProp;\n event.stopImmediatePropagation = event.stopImmediatePropagation || stopImmProp;\n\n if (/mouse|click/.test(event.type)) {\n event.pageX = event.clientX + getWindow(element).document.documentElement.scrollLeft;\n event.pageY = event.clientY + getWindow(element).document.documentElement.scrollTop;\n }\n\n listener(event);\n }\n };\n\n ret = element[addEvent](on + type, wrappedListener, !!options.capture);\n\n if (listenerIndex === -1) {\n supplied.push(listener);\n wrapped.push(wrappedListener);\n useCount.push(1);\n }\n else {\n useCount[listenerIndex]++;\n }\n }\n else {\n ret = element[addEvent](type, listener, supportsOptions? options : !!options.capture);\n }\n target.events[type].push(listener);\n\n return ret;\n }\n}\n\nfunction remove (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const elementIndex = indexOf(elements, element);\n const target = targets[elementIndex];\n\n if (!target || !target.events) {\n return;\n }\n\n let wrappedListener = listener;\n let listeners;\n let listenerIndex;\n\n if (useAttachEvent) {\n listeners = attachedListeners[elementIndex];\n listenerIndex = indexOf(listeners.supplied, listener);\n wrappedListener = listeners.wrapped[listenerIndex];\n }\n\n if (type === 'all') {\n for (type in target.events) {\n if (target.events.hasOwnProperty(type)) {\n remove(element, type, 'all');\n }\n }\n return;\n }\n\n if (target.events[type]) {\n const len = target.events[type].length;\n\n if (listener === 'all') {\n for (let i = 0; i < len; i++) {\n remove(element, type, target.events[type][i], options);\n }\n return;\n }\n else {\n for (let i = 0; i < len; i++) {\n if (target.events[type][i] === listener) {\n element[removeEvent](on + type, wrappedListener, supportsOptions? options : !!options.capture);\n target.events[type].splice(i, 1);\n\n if (useAttachEvent && listeners) {\n listeners.useCount[listenerIndex]--;\n if (listeners.useCount[listenerIndex] === 0) {\n listeners.supplied.splice(listenerIndex, 1);\n listeners.wrapped.splice(listenerIndex, 1);\n listeners.useCount.splice(listenerIndex, 1);\n }\n }\n\n break;\n }\n }\n }\n\n if (target.events[type] && target.events[type].length === 0) {\n target.events[type] = null;\n target.typeCount--;\n }\n }\n\n if (!target.typeCount) {\n targets.splice(elementIndex, 1);\n elements.splice(elementIndex, 1);\n attachedListeners.splice(elementIndex, 1);\n }\n}\n\nfunction addDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n if (!delegatedEvents[type]) {\n delegatedEvents[type] = {\n selectors: [],\n contexts : [],\n listeners: [],\n };\n\n // add delegate listener functions\n for (let i = 0; i < documents.length; i++) {\n add(documents[i], type, delegateListener);\n add(documents[i], type, delegateUseCapture, true);\n }\n }\n\n const delegated = delegatedEvents[type];\n let index;\n\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n break;\n }\n }\n\n if (index === -1) {\n index = delegated.selectors.length;\n\n delegated.selectors.push(selector);\n delegated.contexts .push(context);\n delegated.listeners.push([]);\n }\n\n // keep listener and capture and passive flags\n delegated.listeners[index].push([listener, !!options.capture, options.passive]);\n}\n\nfunction removeDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const delegated = delegatedEvents[type];\n let matchFound = false;\n let index;\n\n if (!delegated) { return; }\n\n // count from last index of delegated to 0\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n // look for matching selector and context Node\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n\n const listeners = delegated.listeners[index];\n\n // each item of the listeners array is an array: [function, capture, passive]\n for (let i = listeners.length - 1; i >= 0; i--) {\n const [fn, capture, passive] = listeners[i];\n\n // check if the listener functions and capture and passive flags match\n if (fn === listener && capture === !!options.capture && passive === options.passive) {\n // remove the listener from the array of listeners\n listeners.splice(i, 1);\n\n // if all listeners for this interactable have been removed\n // remove the interactable from the delegated arrays\n if (!listeners.length) {\n delegated.selectors.splice(index, 1);\n delegated.contexts .splice(index, 1);\n delegated.listeners.splice(index, 1);\n\n // remove delegate function from context\n remove(context, type, delegateListener);\n remove(context, type, delegateUseCapture, true);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegatedEvents[type] = null;\n }\n }\n\n // only remove one listener\n matchFound = true;\n break;\n }\n }\n\n if (matchFound) { break; }\n }\n }\n}\n\n// bound to the interactable context when a DOM event\n// listener is added to a selector interactable\nfunction delegateListener (event, optionalArg) {\n const options = getOptions(optionalArg);\n const fakeEvent = {};\n const delegated = delegatedEvents[event.type];\n const eventTarget = (domUtils.getActualElement(event.path\n ? event.path[0]\n : event.target));\n let element = eventTarget;\n\n // duplicate the event so that currentTarget can be changed\n pExtend(fakeEvent, event);\n\n fakeEvent.originalEvent = event;\n fakeEvent.preventDefault = preventOriginalDefault;\n\n // climb up document tree looking for selector matches\n while (is.element(element)) {\n for (let i = 0; i < delegated.selectors.length; i++) {\n const selector = delegated.selectors[i];\n const context = delegated.contexts[i];\n\n if (domUtils.matchesSelector(element, selector)\n && domUtils.nodeContains(context, eventTarget)\n && domUtils.nodeContains(context, element)) {\n\n const listeners = delegated.listeners[i];\n\n fakeEvent.currentTarget = element;\n\n for (let j = 0; j < listeners.length; j++) {\n const [fn, capture, passive] = listeners[j];\n\n if (capture === !!options.capture && passive === options.passive) {\n fn(fakeEvent);\n }\n }\n }\n }\n\n element = domUtils.parentNode(element);\n }\n}\n\nfunction delegateUseCapture (event) {\n return delegateListener.call(this, event, true);\n}\n\nfunction preventDef () {\n this.returnValue = false;\n}\n\nfunction preventOriginalDefault () {\n this.originalEvent.preventDefault();\n}\n\nfunction stopProp () {\n this.cancelBubble = true;\n}\n\nfunction stopImmProp () {\n this.cancelBubble = true;\n this.immediatePropagationStopped = true;\n}\n\nfunction getOptions (param) {\n return is.object(param)? param : { capture: param };\n}\n\nmodule.exports = {\n add,\n remove,\n\n addDelegate,\n removeDelegate,\n\n delegateListener,\n delegateUseCapture,\n delegatedEvents,\n documents,\n\n useAttachEvent,\n supportsOptions,\n\n _elements: elements,\n _targets: targets,\n _attachedListeners: attachedListeners,\n};\n","module.exports = function extend (dest, source) {\n for (const prop in source) {\n dest[prop] = source[prop];\n }\n return dest;\n};\n","const {\n resolveRectLike,\n rectToXY,\n} = require('./rect');\n\nmodule.exports = function (target, element, action) {\n const actionOptions = target.options[action];\n const actionOrigin = actionOptions && actionOptions.origin;\n const origin = actionOrigin || target.options.origin;\n\n const originRect = resolveRectLike(origin, target, element, [target && element]);\n\n return rectToXY(originRect) || { x: 0, y: 0 };\n};\n","module.exports = (x, y) => Math.sqrt(x * x + y * y);\n","const extend = require('./extend');\nconst win = require('./window');\n\nconst utils = {\n warnOnce: function (method, message) {\n let warned = false;\n\n return function () {\n if (!warned) {\n win.window.console.warn(message);\n warned = true;\n }\n\n return method.apply(this, arguments);\n };\n },\n\n // http://stackoverflow.com/a/5634528/2280888\n _getQBezierValue: function (t, p1, p2, p3) {\n const iT = 1 - t;\n return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3;\n },\n\n getQuadraticCurvePoint: function (startX, startY, cpX, cpY, endX, endY, position) {\n return {\n x: utils._getQBezierValue(position, startX, cpX, endX),\n y: utils._getQBezierValue(position, startY, cpY, endY),\n };\n },\n\n // http://gizma.com/easing/\n easeOutQuad: function (t, b, c, d) {\n t /= d;\n return -c * t*(t-2) + b;\n },\n\n copyAction: function (dest, src) {\n dest.name = src.name;\n dest.axis = src.axis;\n dest.edges = src.edges;\n\n return dest;\n },\n\n is : require('./is'),\n extend : extend,\n hypot : require('./hypot'),\n getOriginXY: require('./getOriginXY'),\n};\n\nextend(utils, require('./arr'));\nextend(utils, require('./domUtils'));\nextend(utils, require('./pointerUtils'));\nextend(utils, require('./rect'));\n\nmodule.exports = utils;\n","const scope = require('../scope');\nconst utils = require('./index');\n\nconst finder = {\n methodOrder: [ 'simulationResume', 'mouseOrPen', 'hasPointer', 'idle' ],\n\n search: function (pointer, eventType, eventTarget) {\n const pointerType = utils.getPointerType(pointer);\n const pointerId = utils.getPointerId(pointer);\n const details = { pointer, pointerId, pointerType, eventType, eventTarget };\n\n for (const method of finder.methodOrder) {\n const interaction = finder[method](details);\n\n if (interaction) {\n return interaction;\n }\n }\n },\n\n // try to resume simulation with a new pointer\n simulationResume: function ({ pointerType, eventType, eventTarget }) {\n if (!/down|start/i.test(eventType)) {\n return null;\n }\n\n for (const interaction of scope.interactions) {\n let element = eventTarget;\n\n if (interaction.simulation && interaction.simulation.allowResume\n && (interaction.pointerType === pointerType)) {\n while (element) {\n // if the element is the interaction element\n if (element === interaction.element) {\n return interaction;\n }\n element = utils.parentNode(element);\n }\n }\n }\n\n return null;\n },\n\n // if it's a mouse or pen interaction\n mouseOrPen: function ({ pointerId, pointerType, eventType }) {\n if (pointerType !== 'mouse' && pointerType !== 'pen') {\n return null;\n }\n\n let firstNonActive;\n\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType) {\n // if it's a down event, skip interactions with running simulations\n if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; }\n\n // if the interaction is active, return it immediately\n if (interaction.interacting()) {\n return interaction;\n }\n // otherwise save it and look for another active interaction\n else if (!firstNonActive) {\n firstNonActive = interaction;\n }\n }\n }\n\n // if no active mouse interaction was found use the first inactive mouse\n // interaction\n if (firstNonActive) {\n return firstNonActive;\n }\n\n // find any mouse or pen interaction.\n // ignore the interaction if the eventType is a *down, and a simulation\n // is active\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType && !(/down/i.test(eventType) && interaction.simulation)) {\n return interaction;\n }\n }\n\n return null;\n },\n\n // get interaction that has this pointer\n hasPointer: function ({ pointerId }) {\n for (const interaction of scope.interactions) {\n if (utils.contains(interaction.pointerIds, pointerId)) {\n return interaction;\n }\n }\n },\n\n // get first idle interaction with a matching pointerType\n idle: function ({ pointerType }) {\n for (const interaction of scope.interactions) {\n // if there's already a pointer held down\n if (interaction.pointerIds.length === 1) {\n const target = interaction.target;\n // don't add this pointer if there is a target interactable and it\n // isn't gesturable\n if (target && !target.options.gesture.enabled) {\n continue;\n }\n }\n // maximum of 2 pointers per interaction\n else if (interaction.pointerIds.length >= 2) {\n continue;\n }\n\n if (!interaction.interacting() && (pointerType === interaction.pointerType)) {\n return interaction;\n }\n }\n\n return null;\n },\n};\n\nmodule.exports = finder;\n","const win = require('./window');\nconst isWindow = require('./isWindow');\n\nconst is = {\n array : () => {},\n\n window : thing => thing === win.window || isWindow(thing),\n\n docFrag : thing => is.object(thing) && thing.nodeType === 11,\n\n object : thing => !!thing && (typeof thing === 'object'),\n\n function: thing => typeof thing === 'function',\n\n number : thing => typeof thing === 'number' ,\n\n bool : thing => typeof thing === 'boolean' ,\n\n string : thing => typeof thing === 'string' ,\n\n element: thing => {\n if (!thing || (typeof thing !== 'object')) { return false; }\n\n const _window = win.getWindow(thing) || win.window;\n\n return (/object|function/.test(typeof _window.Element)\n ? thing instanceof _window.Element //DOM2\n : thing.nodeType === 1 && typeof thing.nodeName === 'string');\n },\n};\n\nis.array = thing => (is.object(thing)\n && (typeof thing.length !== 'undefined')\n && is.function(thing.splice));\n\nmodule.exports = is;\n","module.exports = (thing) => !!(thing && thing.Window) && (thing instanceof thing.Window);\n","function pointerExtend (dest, source) {\n for (const prop in source) {\n const prefixedPropREs = module.exports.prefixedPropREs;\n let deprecated = false;\n\n // skip deprecated prefixed properties\n for (const vendor in prefixedPropREs) {\n if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) {\n deprecated = true;\n break;\n }\n }\n\n if (!deprecated && typeof source[prop] !== 'function') {\n dest[prop] = source[prop];\n }\n }\n return dest;\n}\n\npointerExtend.prefixedPropREs = {\n webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/,\n};\n\nmodule.exports = pointerExtend;\n","const hypot = require('./hypot');\nconst browser = require('./browser');\nconst dom = require('./domObjects');\nconst domUtils = require('./domUtils');\nconst domObjects = require('./domObjects');\nconst is = require('./is');\nconst pointerExtend = require('./pointerExtend');\n\nconst pointerUtils = {\n copyCoords: function (dest, src) {\n dest.page = dest.page || {};\n dest.page.x = src.page.x;\n dest.page.y = src.page.y;\n\n dest.client = dest.client || {};\n dest.client.x = src.client.x;\n dest.client.y = src.client.y;\n\n dest.timeStamp = src.timeStamp;\n },\n\n setCoordDeltas: function (targetObj, prev, cur) {\n targetObj.page.x = cur.page.x - prev.page.x;\n targetObj.page.y = cur.page.y - prev.page.y;\n targetObj.client.x = cur.client.x - prev.client.x;\n targetObj.client.y = cur.client.y - prev.client.y;\n targetObj.timeStamp = cur.timeStamp - prev.timeStamp;\n\n // set pointer velocity\n const dt = Math.max(targetObj.timeStamp / 1000, 0.001);\n\n targetObj.page.speed = hypot(targetObj.page.x, targetObj.page.y) / dt;\n targetObj.page.vx = targetObj.page.x / dt;\n targetObj.page.vy = targetObj.page.y / dt;\n\n targetObj.client.speed = hypot(targetObj.client.x, targetObj.page.y) / dt;\n targetObj.client.vx = targetObj.client.x / dt;\n targetObj.client.vy = targetObj.client.y / dt;\n },\n\n isNativePointer: function (pointer) {\n return (pointer instanceof dom.Event || pointer instanceof dom.Touch);\n },\n\n // Get specified X/Y coords for mouse or event.touches[0]\n getXY: function (type, pointer, xy) {\n xy = xy || {};\n type = type || 'page';\n\n xy.x = pointer[type + 'X'];\n xy.y = pointer[type + 'Y'];\n\n return xy;\n },\n\n getPageXY: function (pointer, page) {\n page = page || {};\n\n // Opera Mobile handles the viewport and scrolling oddly\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n pointerUtils.getXY('screen', pointer, page);\n\n page.x += window.scrollX;\n page.y += window.scrollY;\n }\n else {\n pointerUtils.getXY('page', pointer, page);\n }\n\n return page;\n },\n\n getClientXY: function (pointer, client) {\n client = client || {};\n\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n // Opera Mobile handles the viewport and scrolling oddly\n pointerUtils.getXY('screen', pointer, client);\n }\n else {\n pointerUtils.getXY('client', pointer, client);\n }\n\n return client;\n },\n\n getPointerId: function (pointer) {\n return is.number(pointer.pointerId)? pointer.pointerId : pointer.identifier;\n },\n\n setCoords: function (targetObj, pointers, timeStamp) {\n const pointer = (pointers.length > 1\n ? pointerUtils.pointerAverage(pointers)\n : pointers[0]);\n\n const tmpXY = {};\n\n pointerUtils.getPageXY(pointer, tmpXY);\n targetObj.page.x = tmpXY.x;\n targetObj.page.y = tmpXY.y;\n\n pointerUtils.getClientXY(pointer, tmpXY);\n targetObj.client.x = tmpXY.x;\n targetObj.client.y = tmpXY.y;\n\n targetObj.timeStamp = is.number(timeStamp) ? timeStamp :new Date().getTime();\n },\n\n pointerExtend: pointerExtend,\n\n getTouchPair: function (event) {\n const touches = [];\n\n // array of touches is supplied\n if (is.array(event)) {\n touches[0] = event[0];\n touches[1] = event[1];\n }\n // an event\n else {\n if (event.type === 'touchend') {\n if (event.touches.length === 1) {\n touches[0] = event.touches[0];\n touches[1] = event.changedTouches[0];\n }\n else if (event.touches.length === 0) {\n touches[0] = event.changedTouches[0];\n touches[1] = event.changedTouches[1];\n }\n }\n else {\n touches[0] = event.touches[0];\n touches[1] = event.touches[1];\n }\n }\n\n return touches;\n },\n\n pointerAverage: function (pointers) {\n const average = {\n pageX : 0,\n pageY : 0,\n clientX: 0,\n clientY: 0,\n screenX: 0,\n screenY: 0,\n };\n\n for (const pointer of pointers) {\n for (const prop in average) {\n average[prop] += pointer[prop];\n }\n }\n for (const prop in average) {\n average[prop] /= pointers.length;\n }\n\n return average;\n },\n\n touchBBox: function (event) {\n if (!event.length && !(event.touches && event.touches.length > 1)) {\n return;\n }\n\n const touches = pointerUtils.getTouchPair(event);\n const minX = Math.min(touches[0].pageX, touches[1].pageX);\n const minY = Math.min(touches[0].pageY, touches[1].pageY);\n const maxX = Math.max(touches[0].pageX, touches[1].pageX);\n const maxY = Math.max(touches[0].pageY, touches[1].pageY);\n\n return {\n x: minX,\n y: minY,\n left: minX,\n top: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n },\n\n touchDistance: function (event, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n\n\n const dx = touches[0][sourceX] - touches[1][sourceX];\n const dy = touches[0][sourceY] - touches[1][sourceY];\n\n return hypot(dx, dy);\n },\n\n touchAngle: function (event, prevAngle, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n const dx = touches[1][sourceX] - touches[0][sourceX];\n const dy = touches[1][sourceY] - touches[0][sourceY];\n const angle = 180 * Math.atan2(dy , dx) / Math.PI;\n\n return angle;\n },\n\n getPointerType: function (pointer) {\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : is.number(pointer.pointerType)\n ? [undefined, undefined,'touch', 'pen', 'mouse'][pointer.pointerType]\n // if the PointerEvent API isn't available, then the \"pointer\" must\n // be either a MouseEvent, TouchEvent, or Touch object\n : /touch/.test(pointer.type) || pointer instanceof domObjects.Touch\n ? 'touch'\n : 'mouse';\n },\n\n // [ event.target, event.currentTarget ]\n getEventTargets: function (event) {\n return [\n domUtils.getActualElement(event.path ? event.path[0] : event.target),\n domUtils.getActualElement(event.currentTarget),\n ];\n },\n};\n\nmodule.exports = pointerUtils;\n","const { window } = require('./window');\n\nconst vendors = ['ms', 'moz', 'webkit', 'o'];\nlet lastTime = 0;\nlet request;\nlet cancel;\n\nfor (let x = 0; x < vendors.length && !window.requestAnimationFrame; x++) {\n request = window[vendors[x] + 'RequestAnimationFrame'];\n cancel = window[vendors[x] +'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n}\n\nif (!request) {\n request = function (callback) {\n const currTime = new Date().getTime();\n const timeToCall = Math.max(0, 16 - (currTime - lastTime));\n const id = setTimeout(function () { callback(currTime + timeToCall); },\n timeToCall);\n\n lastTime = currTime + timeToCall;\n return id;\n };\n}\n\nif (!cancel) {\n cancel = function (id) {\n clearTimeout(id);\n };\n}\n\nmodule.exports = {\n request,\n cancel,\n};\n","const extend = require('./extend');\nconst is = require('./is');\nconst {\n closest,\n parentNode,\n getElementRect,\n} = require('./domUtils');\n\nconst rectUtils = {\n getStringOptionResult: function (value, interactable, element) {\n if (!is.string(value)) {\n return null;\n }\n\n if (value === 'parent') {\n value = parentNode(element);\n }\n else if (value === 'self') {\n value = interactable.getRect(element);\n }\n else {\n value = closest(element, value);\n }\n\n return value;\n },\n\n resolveRectLike: function (value, interactable, element, functionArgs) {\n value = rectUtils.getStringOptionResult(value, interactable, element) || value;\n\n if (is.function(value)) {\n value = value.apply(null, functionArgs);\n }\n\n if (is.element(value)) {\n value = getElementRect(value);\n }\n\n return value;\n },\n\n rectToXY: function (rect) {\n return rect && {\n x: 'x' in rect ? rect.x : rect.left,\n y: 'y' in rect ? rect.y : rect.top,\n };\n },\n\n xywhToTlbr: function (rect) {\n if (rect && !('left' in rect && 'top' in rect)) {\n rect = extend({}, rect);\n\n rect.left = rect.x || 0;\n rect.top = rect.y || 0;\n rect.right = rect.right || (rect.left + rect.width);\n rect.bottom = rect.bottom || (rect.top + rect.height);\n }\n\n return rect;\n },\n\n tlbrToXywh: function (rect) {\n if (rect && !('x' in rect && 'y' in rect)) {\n rect = extend({}, rect);\n\n rect.x = rect.left || 0;\n rect.top = rect.top || 0;\n rect.width = rect.width || (rect.right - rect.x);\n rect.height = rect.height || (rect.bottom - rect.y);\n }\n\n return rect;\n },\n};\n\nmodule.exports = rectUtils;\n","const win = module.exports;\nconst isWindow = require('./isWindow');\n\nfunction init (window) {\n // get wrapped window if using Shadow DOM polyfill\n\n win.realWindow = window;\n\n // create a TextNode\n const el = window.document.createTextNode('');\n\n // check if it's wrapped by a polyfill\n if (el.ownerDocument !== window.document\n && typeof window.wrap === 'function'\n && window.wrap(el) === el) {\n // use wrapped window\n window = window.wrap(window);\n }\n\n win.window = window;\n}\n\nif (typeof window === 'undefined') {\n win.window = undefined;\n win.realWindow = undefined;\n}\nelse {\n init(window);\n}\n\nwin.getWindow = function getWindow (node) {\n if (isWindow(node)) {\n return node;\n }\n\n const rootNode = (node.ownerDocument || node);\n\n return rootNode.defaultView || rootNode.parentWindow || win.window;\n};\n\nwin.init = init;\n"]} \ No newline at end of file diff --git a/dist/interact.min.js b/dist/interact.min.js index c0bb2476c..2d1f0fb62 100644 --- a/dist/interact.min.js +++ b/dist/interact.min.js @@ -1,6 +1,6 @@ -/* interact.js v1.3.0-alpha.3+sha.9595c40 | https://raw.github.com/taye/interact.js/master/LICENSE */ -!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var t;t="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,t.interact=e()}}(function(){return function e(t,n,r){function i(s,a){if(!n[s]){if(!t[s]){var l="function"==typeof require&&require;if(!a&&l)return l(s,!0);if(o)return o(s,!0);var c=new Error("Cannot find module '"+s+"'");throw c.code="MODULE_NOT_FOUND",c}var p=n[s]={exports:{}};t[s][0].call(p.exports,function(e){var n=t[s][1][e];return i(n||e)},p,p.exports,e,t,n,r)}return n[s].exports}for(var o="function"==typeof require&&require,s=0;s6&&void 0!==arguments[6]&&arguments[6];r(this,e);var f=t.target,v=(f&&f.options||s).deltaSource,g=o(f,p,l),h="start"===c,m="end"===c,y=h?t.startCoords:t.curCoords,x=t.prevEvent;p=p||t.element;var b=i({},y.page),w=i({},y.client);b.x-=g.x,b.y-=g.y,w.x-=g.x,w.y-=g.y,this.ctrlKey=n.ctrlKey,this.altKey=n.altKey,this.shiftKey=n.shiftKey,this.metaKey=n.metaKey,this.button=n.button,this.buttons=n.buttons,this.target=p,this.currentTarget=p,this.relatedTarget=u||null,this.preEnd=d,this.type=l+(c||""),this.interaction=t,this.interactable=f,this.t0=h?t.downTimes[t.downTimes.length-1]:x.t0;var E={interaction:t,event:n,action:l,phase:c,element:p,related:u,page:b,client:w,coords:y,starting:h,ending:m,deltaSource:v,iEvent:this};a.fire("set-xy",E),m?(this.pageX=x.pageX,this.pageY=x.pageY,this.clientX=x.clientX,this.clientY=x.clientY):(this.pageX=b.x,this.pageY=b.y,this.clientX=w.x,this.clientY=w.y),this.x0=t.startCoords.page.x-g.x,this.y0=t.startCoords.page.y-g.y,this.clientX0=t.startCoords.client.x-g.x,this.clientY0=t.startCoords.client.y-g.y,a.fire("set-delta",E),this.timeStamp=y.timeStamp,this.dt=t.pointerDelta.timeStamp,this.duration=this.timeStamp-this.t0,this.speed=t.pointerDelta[v].speed,this.velocityX=t.pointerDelta[v].vx,this.velocityY=t.pointerDelta[v].vy,this.swipe=m||"inertiastart"===c?this.getSwipe():null,a.fire("new",E)}return e.prototype.getSwipe=function(){var e=this.interaction;if(e.prevEvent.speed<600||this.timeStamp-e.prevEvent.timeStamp>150)return null;var t=180*Math.atan2(e.prevEvent.velocityY,e.prevEvent.velocityX)/Math.PI;t<0&&(t+=360);var n=112.5<=t&&t<247.5,r=202.5<=t&&t<337.5,i=!n&&(292.5<=t||t<67.5);return{up:r,down:!r&&22.5<=t&&t<157.5,left:n,right:i,angle:t,speed:e.prevEvent.speed,velocity:{x:e.prevEvent.velocityX,y:e.prevEvent.velocityY}}},e.prototype.preventDefault=function(){},e.prototype.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},e.prototype.stopPropagation=function(){this.propagationStopped=!0},e}();a.on("set-delta",function(e){var t=e.iEvent,n=e.interaction,r=e.starting,i=e.deltaSource,o=r?t:n.prevEvent;"client"===i?(t.dx=t.clientX-o.clientX,t.dy=t.clientY-o.clientY):(t.dx=t.pageX-o.pageX,t.dy=t.pageY-o.pageY)}),l.signals=a,t.exports=l},{"./defaultOptions":18,"./utils/Signals":35,"./utils/extend":41,"./utils/getOriginXY":42}],4:[function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=e("./utils/is"),o=e("./utils/events"),s=e("./utils/extend"),a=e("./actions/base"),l=e("./scope"),c=e("./Eventable"),p=e("./defaultOptions"),u=e("./utils/Signals").new(),d=e("./utils/domUtils"),f=d.getElementRect,v=d.nodeContains,g=d.trySelector,h=e("./utils/window"),m=h.getWindow,y=e("./utils/arr"),x=y.indexOf,b=y.contains,w=e("./utils/browser"),E=w.wheelEvent;l.interactables=[];var S=function(){function e(t,n){r(this,e),n=n||{},this.target=t,this.events=new c,this._context=n.context||l.document,this._win=m(g(t)?this._context:t),this._doc=this._win.document,u.fire("new",{target:t,options:n,interactable:this,win:this._win}),l.addDocument(this._doc,this._win),l.interactables.push(this),this.set(n)}return e.prototype.setOnEvents=function(e,t){var n="on"+e;return i.function(t.onstart)&&(this.events[n+"start"]=t.onstart),i.function(t.onmove)&&(this.events[n+"move"]=t.onmove),i.function(t.onend)&&(this.events[n+"end"]=t.onend),i.function(t.oninertiastart)&&(this.events[n+"inertiastart"]=t.oninertiastart),this},e.prototype.setPerAction=function(e,t){for(var n in t)n in p[e]&&(i.object(t[n])?(this.options[e][n]=s(this.options[e][n]||{},t[n]),i.object(p.perAction[n])&&"enabled"in p.perAction[n]&&(this.options[e][n].enabled=!1!==t[n].enabled)):i.bool(t[n])&&i.object(p.perAction[n])?this.options[e][n].enabled=t[n]:void 0!==t[n]&&(this.options[e][n]=t[n]))},e.prototype.getRect=function(e){return e=e||this.target,i.string(this.target)&&!i.element(e)&&(e=this._context.querySelector(this.target)),f(e)},e.prototype.rectChecker=function(e){return i.function(e)?(this.getRect=e,this):null===e?(delete this.options.getRect,this):this.getRect},e.prototype._backCompatOption=function(e,t){if(g(t)||i.object(t)){this.options[e]=t;for(var n=a.names,r=Array.isArray(n),o=0,n=r?n:n[Symbol.iterator]();;){var s;if(r){if(o>=n.length)break;s=n[o++]}else{if(o=n.next(),o.done)break;s=o.value}var l=s;this.options[l][e]=t}return this}return this.options[e]},e.prototype.origin=function(e){return this._backCompatOption("origin",e)},e.prototype.deltaSource=function(e){return"page"===e||"client"===e?(this.options.deltaSource=e,this):this.options.deltaSource},e.prototype.context=function(){return this._context},e.prototype.inContext=function(e){return this._context===e.ownerDocument||v(this._context,e)},e.prototype.fire=function(e){return this.events.fire(e),this},e.prototype._onOffMultiple=function(e,t,n,r){if(i.string(t)&&-1!==t.search(" ")&&(t=t.trim().split(/ +/)),i.array(t)){for(var o=0;o=l.length)break;f=l[d++]}else{if(d=l.next(),d.done)break;f=d.value}var v=f;this.options[v]=p.base[v],v in t&&this[v](t[v])}return u.fire("set",{options:t,interactable:this}),this},e.prototype.unset=function(){if(o.remove(this.target,"all"),i.string(this.target))for(var e in o.delegatedEvents){var t=o.delegatedEvents[e];t.selectors[0]===this.target&&t.contexts[0]===this._context&&(t.selectors.splice(0,1),t.contexts.splice(0,1),t.listeners.splice(0,1),t.selectors.length||(t[e]=null)),o.remove(this._context,e,o.delegateListener),o.remove(this._context,e,o.delegateUseCapture,!0)}else o.remove(this,"all");u.fire("unset",{interactable:this}),l.interactables.splice(x(l.interactables,this),1);for(var n=l.interactions||[],r=Array.isArray(n),s=0,n=r?n:n[Symbol.iterator]();;){var a;if(r){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var c=a;c.target===this&&c.interacting()&&c.stop()}return l.interact},e}();l.interactables.indexOfElement=function(e,t){t=t||l.document;for(var n=0;n=y.length)break;w=y[b++]}else{if(b=y.next(),b.done)break;w=b.value}var E=w,S=E[0],T=E[1];T._updateEventTargets(r,i),T[e](S,t,r,i)}}}function o(e){for(var t=0;te.pointerMoveTolerance);var a={pointer:t,pointerIndex:this.getPointerIndex(t),event:n,eventTarget:r,dx:o,dy:s,duplicate:i,interaction:this,interactingBeforeMove:this.interacting()};i||l.setCoordDeltas(this.pointerDelta,this.prevCoords,this.curCoords),d.fire("move",a),i||(this.interacting()&&this.doMove(a),this.pointerWasMoved&&l.copyCoords(this.prevCoords,this.curCoords))},e.prototype.doMove=function(e){e=l.extend({pointer:this.pointers[0],event:this.prevEvent,eventTarget:this._eventTarget,interaction:this},e||{}),d.fire("before-action-move",e),this._dontFireMove||d.fire("action-move",e),this._dontFireMove=!1},e.prototype.pointerUp=function(e,t,n,r){var i=this.getPointerIndex(e);d.fire(/cancel$/i.test(t.type)?"cancel":"up",{pointer:e,pointerIndex:i,event:t,eventTarget:n,curEventTarget:r,interaction:this}),this.simulation||this.end(t),this.pointerIsDown=!1,this.removePointer(e,t)},e.prototype.end=function(e){e=e||this.prevEvent,this.interacting()&&d.fire("action-end",{event:e,interaction:this}),this.stop()},e.prototype.currentAction=function(){return this._interacting?this.prepared.name:null},e.prototype.interacting=function(){return this._interacting},e.prototype.stop=function(){d.fire("stop",{interaction:this}),this._interacting&&(d.fire("stop-active",{interaction:this}),d.fire("stop-"+this.prepared.name,{interaction:this})),this.target=this.element=null,this._interacting=!1,this.prepared.name=this.prevEvent=null},e.prototype.getPointerIndex=function(e){return l.indexOf(this.pointerIds,l.getPointerId(e))},e.prototype.updatePointer=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:t&&/(down|start)$/i.test(t.type),r=l.getPointerId(e),i=this.getPointerIndex(e);return-1===i&&(i=this.pointerIds.length,this.pointerIds[i]=r),n&&d.fire("update-pointer-down",{pointer:e,event:t,down:n,pointerId:r,pointerIndex:i,interaction:this}),this.pointers[i]=e,i},e.prototype.removePointer=function(e,t){var n=l.getPointerId(e),r=this.mouse?0:l.indexOf(this.pointerIds,n);-1!==r&&(d.fire("remove-pointer",{pointer:e,event:t,pointerIndex:r,interaction:this}),this.pointers.splice(r,1),this.pointerIds.splice(r,1),this.downTargets.splice(r,1),this.downTimes.splice(r,1))},e.prototype._updateEventTargets=function(e,t){this._eventTarget=e,this._curEventTarget=t},e}(),m=0,y=v.length;m=i.length)break;a=i[s++]}else{if(s=i.next(),s.done)break;a=s.value}var l=a;if(l.options.drop.enabled){var c=l.options.drop.accept;if(!(p.is.element(c)&&c!==t||p.is.string(c)&&!p.matchesSelector(t,c)))for(var d=p.is.string(l.target)?l._context.querySelectorAll(l.target):[l.target],f=0;fo.left&&c.xo.top&&c.y=o.left&&v<=o.right&&g>=o.top&&g<=o.bottom}if(f&&p.is.number(a)){s=Math.max(0,Math.min(o.right,f.right)-Math.max(o.left,f.left))*Math.max(0,Math.min(o.bottom,f.bottom)-Math.max(o.top,f.top))/(f.width*f.height)>=a}return this.options.drop.checker&&(s=this.options.drop.checker(e,t,s,this,i,n,r)),s},v.signals.on("unset",function(e){e.interactable.dropzone(!1)}),v.settingsMethods.push("dropChecker"),g.signals.on("new",function(e){e.dropTarget=null,e.dropElement=null,e.prevDropTarget=null,e.prevDropElement=null,e.dropEvents=null,e.activeDrops={dropzones:[],elements:[],rects:[]}}),g.signals.on("stop",function(e){var t=e.interaction;t.dropTarget=t.dropElement=t.prevDropTarget=t.prevDropElement=null}),d.dynamicDrop=function(e){return p.is.bool(e)?(y=e,d):y},p.merge(v.eventTypes,["dragenter","dragleave","dropactivate","dropdeactivate","dropmove","drop"]),c.methodDict.drop="dropzone",h.drop=m.defaults,t.exports=m},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../interact":21,"../scope":34,"../utils":44,"./base":6}],9:[function(e,t,n){"use strict";var r=e("./base"),i=e("../utils"),o=e("../InteractEvent"),s=e("../Interactable"),a=e("../Interaction"),l=e("../defaultOptions"),c={defaults:{enabled:!1,origin:null,restrict:null},checker:function(e,t,n,r,i){return i.pointerIds.length>=2?{name:"gesture"}:null},getCursor:function(){return""}};o.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;"gesturestart"===t.type&&(t.ds=0,n.gesture.startDistance=n.gesture.prevDistance=t.distance,n.gesture.startAngle=n.gesture.prevAngle=t.angle,n.gesture.scale=1)}),o.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;"gesturemove"===t.type&&(t.ds=t.scale-n.gesture.scale,n.target.fire(t),n.gesture.prevAngle=t.angle,n.gesture.prevDistance=t.distance,t.scale===1/0||null===t.scale||void 0===t.scale||isNaN(t.scale)||(n.gesture.scale=t.scale))}),s.prototype.gesturable=function(e){return i.is.object(e)?(this.options.gesture.enabled=!1!==e.enabled,this.setPerAction("gesture",e),this.setOnEvents("gesture",e),this):i.is.bool(e)?(this.options.gesture.enabled=e,e||(this.ongesturestart=this.ongesturestart=this.ongestureend=null),this):this.options.gesture},o.signals.on("set-delta",function(e){var t=e.interaction,n=e.iEvent,r=e.action,s=e.event,a=e.starting,l=e.ending,c=e.deltaSource;if("gesture"===r){var p=t.pointers;n.touches=[p[0],p[1]],a?(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=1,n.ds=0,n.angle=i.touchAngle(p,void 0,c),n.da=0):l||s instanceof o?(n.distance=t.prevEvent.distance,n.box=t.prevEvent.box,n.scale=t.prevEvent.scale,n.ds=n.scale-1,n.angle=t.prevEvent.angle,n.da=n.angle-t.gesture.startAngle):(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=n.distance/t.gesture.startDistance,n.angle=i.touchAngle(p,t.gesture.prevAngle,c),n.ds=n.scale-t.gesture.prevScale,n.da=n.angle-t.gesture.prevAngle)}}),a.signals.on("new",function(e){e.gesture={start:{x:0,y:0},startDistance:0,prevDistance:0,distance:0,scale:1,startAngle:0,prevAngle:0}}),r.gesture=c,r.names.push("gesture"),i.merge(s.eventTypes,["gesturestart","gesturemove","gestureend"]),r.methodDict.gesture="gesturable",l.gesture=c.defaults,t.exports=c},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"./base":6}],10:[function(e,t,n){"use strict";function r(e,t,n,r,i,s,a){if(!t)return!1;if(!0===t){var l=o.is.number(s.width)?s.width:s.right-s.left,c=o.is.number(s.height)?s.height:s.bottom-s.top;if(l<0&&("left"===e?e="right":"right"===e&&(e="left")),c<0&&("top"===e?e="bottom":"bottom"===e&&(e="top")),"left"===e)return n.x<(l>=0?s.left:s.right)+a;if("top"===e)return n.y<(c>=0?s.top:s.bottom)+a;if("right"===e)return n.x>(l>=0?s.right:s.left)-a;if("bottom"===e)return n.y>(c>=0?s.bottom:s.top)-a}return!!o.is.element(r)&&(o.is.element(t)?t===r:o.matchesUpTo(r,t,i))}var i=e("./base"),o=e("../utils"),s=e("../utils/browser"),a=e("../InteractEvent"),l=e("../Interactable"),c=e("../Interaction"),p=e("../defaultOptions"),u=s.supportsTouch||s.supportsPointerEvent?20:10,d={defaults:{enabled:!1,mouseButtons:null,origin:null,snap:null,restrict:null,inertia:null,autoScroll:null,square:!1,preserveAspectRatio:!1,axis:"xy",margin:NaN,edges:null,invert:"none"},checker:function(e,t,n,i,s,a){if(!a)return null;var l=o.extend({},s.curCoords.page),c=n.options;if(c.resize.enabled){var p=c.resize,d={left:!1,right:!1,top:!1,bottom:!1};if(o.is.object(p.edges)){for(var f in d)d[f]=r(f,p.edges[f],l,s._eventTarget,i,a,p.margin||u);if(d.left=d.left&&!d.right,d.top=d.top&&!d.bottom,d.left||d.right||d.top||d.bottom)return{name:"resize",edges:d}}else{var v="y"!==c.resize.axis&&l.x>a.right-u,g="x"!==c.resize.axis&&l.y>a.bottom-u;if(v||g)return{name:"resize",axes:(v?"x":"")+(g?"y":"")}}}return null},cursors:s.isIe9OrOlder?{x:"e-resize",y:"s-resize",xy:"se-resize",top:"n-resize",left:"w-resize",bottom:"s-resize",right:"e-resize",topleft:"se-resize",bottomright:"se-resize",topright:"ne-resize",bottomleft:"ne-resize"}:{x:"ew-resize",y:"ns-resize",xy:"nwse-resize",top:"ns-resize",left:"ew-resize",bottom:"ns-resize",right:"ew-resize",topleft:"nwse-resize",bottomright:"nwse-resize",topright:"nesw-resize",bottomleft:"nesw-resize"},getCursor:function(e){if(e.axis)return d.cursors[e.name+e.axis];if(e.edges){for(var t="",n=["top","bottom","left","right"],r=0;r<4;r++)e.edges[n[r]]&&(t+=n[r]);return d.cursors[t]}}};a.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;if("resizestart"===t.type&&n.prepared.edges){var r=n.target.getRect(n.element),i=n.target.options.resize;if(i.square||i.preserveAspectRatio){var s=o.extend({},n.prepared.edges);s.top=s.top||s.left&&!s.bottom,s.left=s.left||s.top&&!s.right,s.bottom=s.bottom||s.right&&!s.top,s.right=s.right||s.bottom&&!s.left,n.prepared._linkedEdges=s}else n.prepared._linkedEdges=null;i.preserveAspectRatio&&(n.resizeStartAspectRatio=r.width/r.height),n.resizeRects={start:r,current:o.extend({},r),inverted:o.extend({},r),previous:o.extend({},r),delta:{left:0,right:0,width:0,top:0,bottom:0,height:0}},t.rect=n.resizeRects.inverted,t.deltaRect=n.resizeRects.delta}}),a.signals.on("new",function(e){var t=e.iEvent,n=e.phase,r=e.interaction;if("move"===n&&r.prepared.edges){var i=r.target.options.resize,s=i.invert,a="reposition"===s||"negate"===s,l=r.prepared.edges,c=r.resizeRects.start,p=r.resizeRects.current,u=r.resizeRects.inverted,d=r.resizeRects.delta,f=o.extend(r.resizeRects.previous,u),v=l,g=t.dx,h=t.dy;if(i.preserveAspectRatio||i.square){var m=i.preserveAspectRatio?r.resizeStartAspectRatio:1;l=r.prepared._linkedEdges,v.left&&v.bottom||v.right&&v.top?h=-g/m:v.left||v.right?h=g/m:(v.top||v.bottom)&&(g=h*m)}if(l.top&&(p.top+=h),l.bottom&&(p.bottom+=h),l.left&&(p.left+=g),l.right&&(p.right+=g),a){if(o.extend(u,p),"reposition"===s){var y=void 0;u.top>u.bottom&&(y=u.top,u.top=u.bottom,u.bottom=y),u.left>u.right&&(y=u.left,u.left=u.right,u.right=y)}}else u.top=Math.min(p.top,c.bottom),u.bottom=Math.max(p.bottom,c.top),u.left=Math.min(p.left,c.right),u.right=Math.max(p.right,c.left);u.width=u.right-u.left,u.height=u.bottom-u.top;for(var x in u)d[x]=u[x]-f[x];t.edges=r.prepared.edges,t.rect=u,t.deltaRect=d}}),l.prototype.resizable=function(e){return o.is.object(e)?(this.options.resize.enabled=!1!==e.enabled,this.setPerAction("resize",e),this.setOnEvents("resize",e),/^x$|^y$|^xy$/.test(e.axis)?this.options.resize.axis=e.axis:null===e.axis&&(this.options.resize.axis=p.resize.axis),o.is.bool(e.preserveAspectRatio)?this.options.resize.preserveAspectRatio=e.preserveAspectRatio:o.is.bool(e.square)&&(this.options.resize.square=e.square),this):o.is.bool(e)?(this.options.resize.enabled=e,e||(this.onresizestart=this.onresizestart=this.onresizeend=null),this):this.options.resize},c.signals.on("new",function(e){ -e.resizeAxes="xy"}),a.signals.on("set-delta",function(e){var t=e.interaction,n=e.iEvent;"resize"===e.action&&t.resizeAxes&&(t.target.options.resize.square?("y"===t.resizeAxes?n.dx=n.dy:n.dy=n.dx,n.axes="xy"):(n.axes=t.resizeAxes,"x"===t.resizeAxes?n.dy=0:"y"===t.resizeAxes&&(n.dx=0)))}),i.resize=d,i.names.push("resize"),o.merge(l.eventTypes,["resizestart","resizemove","resizeinertiastart","resizeinertiaresume","resizeend"]),i.methodDict.resize="resizable",p.resize=d.defaults,t.exports=d},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"../utils/browser":37,"./base":6}],11:[function(e,t,n){"use strict";var r=e("./utils/raf"),i=e("./utils/window").getWindow,o=e("./utils/is"),s=e("./utils/domUtils"),a=e("./Interaction"),l=e("./defaultOptions"),c={defaults:{enabled:!1,container:null,margin:60,speed:300},interaction:null,i:null,x:0,y:0,isScrolling:!1,prevTime:0,start:function(e){c.isScrolling=!0,r.cancel(c.i),c.interaction=e,c.prevTime=(new Date).getTime(),c.i=r.request(c.scroll)},stop:function(){c.isScrolling=!1,r.cancel(c.i)},scroll:function(){var e=c.interaction.target.options[c.interaction.prepared.name].autoScroll,t=e.container||i(c.interaction.element),n=(new Date).getTime(),s=(n-c.prevTime)/1e3,a=e.speed*s;a>=1&&(o.window(t)?t.scrollBy(c.x*a,c.y*a):t&&(t.scrollLeft+=c.x*a,t.scrollTop+=c.y*a),c.prevTime=n),c.isScrolling&&(r.cancel(c.i),c.i=r.request(c.scroll))},check:function(e,t){var n=e.options;return n[t].autoScroll&&n[t].autoScroll.enabled},onInteractionMove:function(e){var t=e.interaction,n=e.pointer;if(t.interacting()&&c.check(t.target,t.prepared.name)){if(t.simulation)return void(c.x=c.y=0);var r=void 0,a=void 0,l=void 0,p=void 0,u=t.target.options[t.prepared.name].autoScroll,d=u.container||i(t.element);if(o.window(d))p=n.clientXd.innerWidth-c.margin,l=n.clientY>d.innerHeight-c.margin;else{var f=s.getElementClientRect(d);p=n.clientXf.right-c.margin,l=n.clientY>f.bottom-c.margin}c.x=a?1:p?-1:0,c.y=l?1:r?-1:0,c.isScrolling||(c.margin=u.margin,c.speed=u.speed,c.start(t))}}};a.signals.on("stop-active",function(){c.stop()}),a.signals.on("action-move",c.onInteractionMove),l.perAction.autoScroll=c.defaults,t.exports=c},{"./Interaction":5,"./defaultOptions":18,"./utils/domUtils":39,"./utils/is":46,"./utils/raf":50,"./utils/window":52}],12:[function(e,t,n){"use strict";var r=e("../Interactable"),i=e("../actions/base"),o=e("../utils/is"),s=e("../utils/domUtils");r.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},r.prototype.ignoreFrom=function(e){return this._backCompatOption("ignoreFrom",e)},r.prototype.allowFrom=function(e){return this._backCompatOption("allowFrom",e)},r.prototype.testIgnore=function(e,t,n){return!(!e||!o.element(n))&&(o.string(e)?s.matchesUpTo(n,e,t):!!o.element(e)&&s.nodeContains(e,n))},r.prototype.testAllow=function(e,t,n){return!e||!!o.element(n)&&(o.string(e)?s.matchesUpTo(n,e,t):!!o.element(e)&&s.nodeContains(e,n))},r.prototype.testIgnoreAllow=function(e,t,n){return!this.testIgnore(e.ignoreFrom,t,n)&&this.testAllow(e.allowFrom,t,n)},r.prototype.actionChecker=function(e){return o.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},r.prototype.styleCursor=function(e){return o.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},r.prototype.defaultActionChecker=function(e,t,n,r){for(var o=this.getRect(r),s=null,a=i.names,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var u=p;if((!n.pointerIsDown||!n.mouse||0!=(t.buttons&this.options[u].mouseButtons))&&(s=i[u].checker(e,t,this,r,n,o)))return s}}},{"../Interactable":4,"../actions/base":6,"../utils/domUtils":39,"../utils/is":46}],13:[function(e,t,n){"use strict";function r(e,t,n,r){return g.is.object(e)&&t.testIgnoreAllow(t.options[e.name],n,r)&&t.options[e.name].enabled&&a(t,n,e)?e:null}function i(e,t,n,i,o,s){for(var a=0,l=i.length;a=m.maxInteractions)return!1;if(u.target===e){if((a+=d===n.name|0)>=i)return!1;if(u.element===t&&(l++,d!==n.name||l>=o))return!1}}}return m.maxInteractions>0}}var l=e("../interact"),c=e("../Interactable"),p=e("../Interaction"),u=e("../actions/base"),d=e("../defaultOptions"),f=e("../utils/browser"),v=e("../scope"),g=e("../utils"),h=e("../utils/Signals").new();e("./InteractableMethods");var m={signals:h,withinInteractionLimit:a,maxInteractions:1/0,defaults:{perAction:{manualStart:!1,max:1/0,maxPerElement:1,allowFrom:null,ignoreFrom:null}},setActionDefaults:function(e){g.extend(e.defaults,m.defaults.perAction)}};p.signals.on("down",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;if(!t.interacting()){s(t,o(t,n,r,i))}}),p.signals.on("move",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;if(t.mouse&&!t.pointerIsDown&&!t.interacting()){s(t,o(t,n,r,i))}}),p.signals.on("move",function(e){var t=e.interaction,n=e.event;if(t.pointerIsDown&&!t.interacting()&&t.pointerWasMoved&&t.prepared.name){h.fire("before-start",e);var r=t.target;t.prepared.name&&r&&(r.options[t.prepared.name].manualStart||!a(r,t.element,t.prepared)?t.stop(n):t.start(t.prepared,r,t.element))}}),p.signals.on("stop",function(e){var t=e.interaction,n=t.target;n&&n.options.styleCursor&&(n._doc.documentElement.style.cursor="")}),c.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},c.prototype.actionChecker=function(e){return g.is.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},c.prototype.styleCursor=function(e){return g.is.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},c.prototype.defaultActionChecker=function(e,t,n,r){for(var i=this.getRect(r),o=t.buttons||{0:1,1:4,3:8,4:16}[t.button],s=null,a=u.names,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var d=p;if((!n.pointerIsDown||!n.mouse||0!=(o&this.options[d].mouseButtons))&&(s=u[d].checker(e,t,this,r,n,i)))return s}},l.maxInteractions=function(e){return g.is.number(e)?(m.maxInteractions=e,this):m.maxInteractions},c.settingsMethods.push("styleCursor"),c.settingsMethods.push("actionChecker"),c.settingsMethods.push("ignoreFrom"),c.settingsMethods.push("allowFrom"),d.base.actionChecker=null,d.base.styleCursor=!0,g.extend(d.perAction,m.defaults.perAction),t.exports=m},{"../Interactable":4,"../Interaction":5,"../actions/base":6,"../defaultOptions":18,"../interact":21,"../scope":34,"../utils":44,"../utils/Signals":35,"../utils/browser":37,"./InteractableMethods":12}],14:[function(e,t,n){"use strict";var r=e("./base"),i=e("../Interaction");i.signals.on("new",function(e){e.delayTimer=null}),r.signals.on("prepared",function(e){var t=e.interaction,n=t.prepared.name;if(n){var r=t.target.options[n].delay;r>0&&(t.delayTimer=setTimeout(function(){t.start(t.prepared,t.target,t.element)},r))}}),i.signals.on("move",function(e){var t=e.interaction,n=e.duplicate;t.pointerWasMoved&&!n&&clearTimeout(t.delayTimer)}),r.signals.on("before-start",function(e){var t=e.interaction,n=t.prepared.name;if(n){t.target.options[n].delay>0&&(t.prepared.name=null)}})},{"../Interaction":5,"./base":13}],15:[function(e,t,n){"use strict";function r(e,t){if(!t)return!1;var n=t.options.drag.startAxis;return"xy"===e||"xy"===n||n===e}var i=e("./base"),o=e("../scope"),s=e("../utils/browser"),a=e("../utils/is"),l=e("../utils/domUtils"),c=l.matchesSelector,p=l.parentNode;i.setActionDefaults(e("../actions/drag")),i.signals.on("before-start",function(e){var t=e.interaction,n=e.eventTarget,l=e.dx,u=e.dy;if("drag"===t.prepared.name){var d=Math.abs(l),f=Math.abs(u),v=t.target.options.drag,g=v.startAxis,h=d>f?"x":dl.minSpeed&&g>l.endSpeed,b={interaction:t,pageCoords:v,statuses:f,preEnd:!0,requireEndOnly:!0};y&&!x&&(c.resetStatuses(f),m=c.setAll(b),m.shouldMove&&m.locked&&(h=!0)),(x||h)&&(p.copyCoords(i.upCoords,t.curCoords),t.pointers[0]=i.startEvent=new a(t,n,t.prepared.name,"inertiastart",t.element),i.t0=d,i.active=!0,i.allowResume=l.allowResume,t.simulation=i,o.fire(i.startEvent),x?(i.vx0=t.pointerDelta.client.vx,i.vy0=t.pointerDelta.client.vy,i.v0=g,r(t,i),p.extend(v,t.curCoords.page),v.x+=i.xe,v.y+=i.ye,c.resetStatuses(f),m=c.setAll(b),i.modifiedXe+=m.dx,i.modifiedYe+=m.dy,i.i=u.request(t.boundInertiaFrame)):(i.smoothEnd=!0,i.xe=m.dx,i.ye=m.dy,i.sx=i.sy=0,i.i=u.request(t.boundSmoothEndFrame)))}}),l.signals.on("stop-active",function(e){var t=e.interaction,n=t.inertiaStatus;n.active&&(u.cancel(n.i),n.active=!1,t.simulation=null)})},{"./InteractEvent":3,"./Interaction":5,"./modifiers":24,"./utils":44,"./utils/raf":50}],21:[function(e,t,n){"use strict";function r(e,t){var n=a.interactables.get(e,t);return n||(n=new l(e,t),n.events.global=p),n}var i=e("./utils/browser"),o=e("./utils/events"),s=e("./utils"),a=e("./scope"),l=e("./Interactable"),c=e("./Interaction"),p={};r.isSet=function(e,t){return-1!==a.interactables.indexOfElement(e,t&&t.context)},r.on=function(e,t,n){if(s.is.string(e)&&-1!==e.search(" ")&&(e=e.trim().split(/ +/)),s.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.on(f,t,n)}return r}if(s.is.object(e)){for(var v in e)r.on(v,e[v],t);return r}return s.contains(l.eventTypes,e)?p[e]?p[e].push(t):p[e]=[t]:o.add(a.document,e,t,{options:n}),r},r.off=function(e,t,n){if(s.is.string(e)&&-1!==e.search(" ")&&(e=e.trim().split(/ +/)),s.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.off(f,t,n)}return r}if(s.is.object(e)){for(var v in e)r.off(v,e[v],t);return r}if(s.contains(l.eventTypes,e)){var g=void 0;e in p&&-1!==(g=s.indexOf(p[e],t))&&p[e].splice(g,1)}else o.remove(a.document,e,t,n);return r},r.debug=function(){return a},r.getPointerAverage=s.pointerAverage,r.getTouchBBox=s.touchBBox,r.getTouchDistance=s.touchDistance,r.getTouchAngle=s.touchAngle,r.getElementRect=s.getElementRect,r.getElementClientRect=s.getElementClientRect,r.matchesSelector=s.matchesSelector,r.closest=s.closest,r.supportsTouch=function(){return i.supportsTouch},r.supportsPointerEvent=function(){return i.supportsPointerEvent},r.stop=function(e){for(var t=a.interactions.length-1;t>=0;t--)a.interactions[t].stop(e);return r},r.pointerMoveTolerance=function(e){return s.is.number(e)?(c.pointerMoveTolerance=e,this):c.pointerMoveTolerance},r.addDocument=a.addDocument,r.removeDocument=a.removeDocument,a.interact=r,t.exports=r},{"./Interactable":4,"./Interaction":5,"./scope":34,"./utils":44,"./utils/browser":37,"./utils/events":40}],22:[function(e,t,n){"use strict";function r(e){var t=e.interaction,n=e.event;t.target&&t.target.checkAndPreventDefault(n)}var i=e("./Interactable"),o=e("./Interaction"),s=e("./scope"),a=e("./utils/is"),l=e("./utils/events"),c=e("./utils/domUtils"),p=c.nodeContains,u=c.matchesSelector;i.prototype.preventDefault=function(e){return/^(always|never|auto)$/.test(e)?(this.options.preventDefault=e,this):a.bool(e)?(this.options.preventDefault=e?"always":"never",this):this.options.preventDefault},i.prototype.checkAndPreventDefault=function(e){var t=this.options.preventDefault;if("never"!==t)return"always"===t?void e.preventDefault():void(l.supportsOptions||/^(mouse|pointer|touch)*(down|start)/i.test(e.type)||a.element(e.target)&&u(e.target,"input,select,textarea,[contenteditable=true],[contenteditable=true] *")||e.preventDefault())};for(var d=["down","move","up","cancel"],f=0;f=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i;if(o.element&&(o.element===e.target||p(o.element,e.target)))return void o.target.checkAndPreventDefault(e)}}},{"./Interactable":4,"./Interaction":5,"./scope":34,"./utils/domUtils":39,"./utils/events":40,"./utils/is":46}],23:[function(e,t,n){"use strict";function r(e){var t=e.target,n=a.search(e,e.type,t);n&&n.prevTap&&e.clientX===n.prevTap.clientX&&e.clientY===n.prevTap.clientY&&t===n.prevTap.target&&(n.downTargets[0]=t,n.downTimes[0]=(new Date).getTime(),l.fire({interaction:n,event:e,eventTarget:t,pointer:e,type:"tap"}))}var i=e("./scope"),o=e("./utils/events"),s=e("./utils/browser"),a=e("./utils/interactionFinder"),l=e("./pointerEvents/base"),c=e("./utils/window"),p=c.window,u=Object.prototype.toString;if(p.Array.isArray||(p.Array.isArray=function(e){return"[object Array]"===u.call(e)}),String.prototype.trim||(String.prototype.trim=function(){return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")}),s.isIE8){var d=function(e){for(var t=i.interactions,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var o;if(n){if(r>=t.length)break;o=t[r++]}else{if(r=t.next(),r.done)break;o=r.value}var s=o;s.interacting()&&s.target.checkAndPreventDefault(e)}},f=function(e,t){var n=e.doc,i=(e.win,0===t.indexOf("listen")?o.add:o.remove);i(n,"selectstart",d),l&&i(n,"dblclick",r)};i.signals.on("add-document",f),i.signals.on("remove-document",f)}t.exports=null},{"./pointerEvents/base":31,"./scope":34,"./utils/browser":37,"./utils/events":40,"./utils/interactionFinder":45,"./utils/window":52}],24:[function(e,t,n){"use strict";function r(e,t,n){return e&&e.enabled&&(t||!e.endOnly)&&(!n||e.endOnly)}var i=e("../InteractEvent"),o=e("../Interaction"),s=e("../utils/extend"),a={names:[],setOffsets:function(e){var t=e.interaction,n=e.pageCoords,r=t.target,i=t.element,o=t.startOffset,s=r.getRect(i);s?(o.left=n.x-s.left,o.top=n.y-s.top,o.right=s.right-n.x,o.bottom=s.bottom-n.y,"width"in s||(s.width=s.right-s.left),"height"in s||(s.height=s.bottom-s.top)):o.left=o.top=o.right=o.bottom=0,e.rect=s,e.interactable=r,e.element=i;for(var l=0;l=p.length)break;f=p[d++]}else{if(d=p.next(),d.done)break;f=d.value}var v=f,g=a[v],h=t.target.options[t.prepared.name][v];r(h,i,o)&&(e.status=e.status=n[v],e.options=h,e.offset=e.interaction.modifierOffsets[v],g.set(e),e.status.locked&&(l.x+=e.status.dx,l.y+=e.status.dy,c.dx+=e.status.dx,c.dy+=e.status.dy,c.locked=!0))}return c.shouldMove=!e.status||!c.locked||e.status.changed,c},resetStatuses:function(e){for(var t=a.names,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var i;if(n){if(r>=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i,s=e[o]||{};s.dx=s.dy=0,s.modifiedX=s.modifiedY=NaN,s.locked=!1,s.changed=!0,e[o]=s}return e},start:function(e,t){var n=e.interaction,r={interaction:n,pageCoords:("action-resume"===t?n.curCoords:n.startCoords).page,startOffset:n.startOffset,statuses:n.modifierStatuses,preEnd:!1,requireEndOnly:!1};a.setOffsets(r),a.resetStatuses(r.statuses),r.pageCoords=s({},n.startCoords.page),n.modifierResult=a.setAll(r)}};o.signals.on("new",function(e){e.startOffset={left:0,right:0,top:0,bottom:0},e.modifierOffsets={},e.modifierStatuses=a.resetStatuses({}),e.modifierResult=null}),o.signals.on("action-start",a.start),o.signals.on("action-resume",a.start),o.signals.on("before-action-move",function(e){var t=e.interaction,n=e.preEnd,r=e.interactingBeforeMove,i=a.setAll({interaction:t,preEnd:n,pageCoords:t.curCoords.page,statuses:t.modifierStatuses,requireEndOnly:!1});!i.shouldMove&&r&&(t._dontFireMove=!0),t.modifierResult=i}),o.signals.on("action-end",function(e){for(var t=e.interaction,n=e.event,i=0;i=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}var m=h,y=m.x,x=m.y;l.push({x:s.left-i.width*y+u.x,y:s.top-i.height*x+u.y})}else l.push(u);return l},set:function(e){var t=e.interaction,n=e.pageCoords,r=e.status,i=e.options,s=e.offset,a=[],l=void 0,c=void 0,p=void 0;if(r.useStatusXY)c={x:r.x,y:r.y};else{var u=o.getOriginXY(t.target,t.element,t.prepared.name);c=o.extend({},n),c.x-=u.x,c.y-=u.y}r.realX=c.x,r.realY=c.y;for(var d=i.targets?i.targets.length:0,f=s,v=Array.isArray(f),g=0,f=v?f:f[Symbol.iterator]();;){var h;if(v){if(g>=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}for(var m=h,y=m.x,x=m.y,b=c.x-y,w=c.y-x,E=i.targets,S=Array.isArray(E),T=0,E=S?E:E[Symbol.iterator]();;){var C;if(S){if(T>=E.length)break;C=E[T++]}else{if(T=E.next(),T.done)break;C=T.value}var A=C;l=o.is.function(A)?A(b,w,t):A,l&&a.push({x:o.is.number(l.x)?l.x+y:b,y:o.is.number(l.y)?l.y+x:w,range:o.is.number(l.range)?l.range:i.range})}}var D={target:null,inRange:!1,distance:0,range:0,dx:0,dy:0};for(p=0,d=a.length;p=p.length)break;f=p[d++]}else{if(d=p.next(),d.done)break;f=d.value}var v=f,g=void 0;g=a.is.function(v)?v(l,c,t):v,g&&("width"in g&&"height"in g&&(g.x=g.width,g.y=g.height),e.options.targets.push(g))}i.set(e)},modifyCoords:function(e){var t=e.options;e.options=a.extend({},t), -e.options.enabled=t.enabled,e.options.relativePoints=[null],i.modifyCoords(e)}};r.snapSize=l,r.names.push("snapSize"),o.perAction.snapSize=l.defaults,s.defaults.snapSize=l.defaults,t.exports=l},{"../actions/resize":10,"../defaultOptions":18,"../utils/":44,"./index":24,"./snap":28}],30:[function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=e("../utils/pointerUtils");t.exports=function(){function e(t,n,o,s,a){if(r(this,e),i.pointerExtend(this,o),o!==n&&i.pointerExtend(this,n),this.interaction=a,this.timeStamp=(new Date).getTime(),this.originalEvent=o,this.type=t,this.pointerId=i.getPointerId(n),this.pointerType=i.getPointerType(n,a),this.target=s,this.currentTarget=null,"tap"===t){var l=a.getPointerIndex(n);this.dt=this.timeStamp-a.downTimes[l];var c=this.timeStamp-a.tapTime;this.double=!!(a.prevTap&&"doubletap"!==a.prevTap.type&&a.prevTap.target===this.target&&c<500)}else"doubletap"===t&&(this.dt=n.timeStamp-a.tapTime)}return e.prototype.subtractOrigin=function(e){var t=e.x,n=e.y;return this.pageX-=t,this.pageY-=n,this.clientX-=t,this.clientY-=n,this},e.prototype.addOrigin=function(e){var t=e.x,n=e.y;return this.pageX+=t,this.pageY+=n,this.clientX+=t,this.clientY+=n,this},e.prototype.preventDefault=function(){this.originalEvent.preventDefault()},e.prototype.stopPropagation=function(){this.propagationStopped=!0},e.prototype.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},e}()},{"../utils/pointerUtils":49}],31:[function(e,t,n){"use strict";function r(e){for(var t=e.interaction,n=e.pointer,s=e.event,l=e.eventTarget,c=e.type,u=void 0===c?e.pointerEvent.type:c,d=e.targets,f=void 0===d?i(e):d,v=e.pointerEvent,g=void 0===v?new o(u,n,s,l,t):v,h={interaction:t,pointer:n,event:s,eventTarget:l,targets:f,type:u,pointerEvent:g},m=0;m=u.length)break;g=u[v++]}else{if(v=u.next(),v.done)break;g=v.value}var h=g;c.element=h,p.fire("collect-targets",c)}return"hold"===o&&(c.targets=d(c.targets,function(e){return e.eventable.options.holdDuration===t.holdTimers[s].duration})),c.targets}var o=e("./PointerEvent"),s=e("../Interaction"),a=e("../utils"),l=e("../utils/browser"),c=e("../defaultOptions"),p=e("../utils/Signals").new(),u=e("../utils/arr"),d=u.filter,f=["down","up","cancel"],v=["down","up","cancel"],g={PointerEvent:o,fire:r,collectEventTargets:i,signals:p,defaults:{holdDuration:600,ignoreFrom:null,allowFrom:null,origin:{x:0,y:0}},types:["down","move","up","cancel","tap","doubletap","hold"]};s.signals.on("update-pointer-down",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers[n]={duration:1/0,timeout:null}}),s.signals.on("remove-pointer",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers.splice(n,1)}),s.signals.on("move",function(e){var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,s=e.duplicateMove,a=t.getPointerIndex(n);s||t.pointerIsDown&&!t.pointerWasMoved||(t.pointerIsDown&&clearTimeout(t.holdTimers[a].timeout),r({interaction:t,pointer:n,event:i,eventTarget:o,type:"move"}))}),s.signals.on("down",function(e){for(var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,s=e.pointerIndex,c=l.isIE8?a.extend({},i):i,u=t.holdTimers[s],d=a.getPath(o),f={interaction:t,pointer:n,event:i,eventTarget:o,type:"hold",targets:[],path:d,element:null},v=d,g=Array.isArray(v),h=0,v=g?v:v[Symbol.iterator]();;){var m;if(g){if(h>=v.length)break;m=v[h++]}else{if(h=v.next(),h.done)break;m=h.value}var y=m;f.element=y,p.fire("collect-targets",f)}if(f.targets.length){for(var x=1/0,b=0;b=0&&(p.selectors[u]!==e||p.contexts[u]!==t);u--);-1===u&&(u=p.selectors.length,p.selectors.push(e),p.contexts.push(t),p.listeners.push([])),p.listeners[u].push([i,!!s.capture,s.passive])}function s(e,t,n,r,o){var s=f(o),c=O[n],p=!1,u=void 0;if(c)for(u=c.selectors.length-1;u>=0;u--)if(c.selectors[u]===e&&c.contexts[u]===t){for(var d=c.listeners[u],v=d.length-1;v>=0;v--){var g=d[v],h=g[0],m=g[1],y=g[2];if(h===r&&m===!!s.capture&&y===s.passive){d.splice(v,1),d.length||(c.selectors.splice(u,1),c.contexts.splice(u,1),c.listeners.splice(u,1),i(t,n,a),i(t,n,l,!0),c.selectors.length||(O[n]=null)),p=!0;break}}if(p)break}}function a(e,t){var n=f(t),r={},i=O[e.type],o=g.getActualElement(e.path?e.path[0]:e.target),s=o;for(h(r,e),r.originalEvent=e,r.preventDefault=p;v.element(s);){for(var a=0;a=l.length)break;u=l[p++]}else{if(p=l.next(),p.done)break;u=p.value}var d=u,f=s[d](a);if(f)return f}},simulationResume:function(e){var t=e.mouseEvent,n=e.eventType,o=e.eventTarget;if(!/down|start/i.test(n))return null;for(var s=r.interactions,a=Array.isArray(s),l=0,s=a?s:s[Symbol.iterator]();;){var c;if(a){if(l>=s.length)break;c=s[l++]}else{if(l=s.next(),l.done)break;c=l.value}var p=c,u=o;if(p.simulation&&p.simulation.allowResume&&p.mouse===t)for(;u;){if(u===p.element)return p;u=i.parentNode(u)}}return null},mouse:function(e){var t=e.pointerId,n=e.mouseEvent,s=e.eventType;if(!n&&(o.supportsTouch||o.supportsPointerEvent))return null;for(var a=void 0,l=r.interactions,c=Array.isArray(l),p=0,l=c?l:l[Symbol.iterator]();;){var u;if(c){if(p>=l.length)break;u=l[p++]}else{if(p=l.next(),p.done)break;u=p.value}var d=u;if(d.mouse){if(d.simulation&&!i.contains(d.pointerIds,t))continue;if(d.interacting())return d;a||(a=d)}}if(a)return a;for(var f=r.interactions,v=Array.isArray(f),g=0,f=v?f:f[Symbol.iterator]();;){var h;if(v){if(g>=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}var m=h;if(m.mouse&&(!/down/.test(s)||!m.simulation))return m}return null},hasPointer:function(e){for(var t=e.pointerId,n=r.interactions,o=Array.isArray(n),s=0,n=o?n:n[Symbol.iterator]();;){var a;if(o){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var l=a;if(i.contains(l.pointerIds,t))return l}},idle:function(e){for(var t=e.mouseEvent,n=r.interactions,i=Array.isArray(n),o=0,n=i?n:n[Symbol.iterator]();;){var s;if(i){if(o>=n.length)break;s=n[o++]}else{if(o=n.next(),o.done)break;s=o.value}var a=s;if(1===a.pointerIds.length){var l=a.target;if(l&&!l.options.gesture.enabled)continue}else if(a.pointerIds.length>=2)continue;if(!a.interacting()&&t===a.mouse)return a}return null}};t.exports=s},{"../scope":34,"./browser":37,"./index":44}],46:[function(e,t,n){"use strict";var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},i=e("./window"),o=e("./isWindow"),s={array:function(){},window:function(e){return e===i.window||o(e)},docFrag:function(e){return s.object(e)&&11===e.nodeType},object:function(e){return!!e&&"object"===(void 0===e?"undefined":r(e))},function:function(e){return"function"==typeof e},number:function(e){return"number"==typeof e},bool:function(e){return"boolean"==typeof e},string:function(e){return"string"==typeof e},element:function(e){if(!e||"object"!==(void 0===e?"undefined":r(e)))return!1;var t=i.getWindow(e)||i.window;return/object|function/.test(r(t.Element))?e instanceof t.Element:1===e.nodeType&&"string"==typeof e.nodeName}};s.array=function(e){return s.object(e)&&void 0!==e.length&&s.function(e.splice)},t.exports=s},{"./isWindow":47,"./window":52}],47:[function(e,t,n){"use strict";t.exports=function(e){return!(!e||!e.Window)&&e instanceof e.Window}},{}],48:[function(e,t,n){"use strict";function r(e,n){for(var r in n){var i=t.exports.prefixedPropREs,o=!1;for(var s in i)if(0===r.indexOf(s)&&i[s].test(r)){o=!0;break}o||"function"==typeof n[r]||(e[r]=n[r])}return e}r.prefixedPropREs={webkit:/(Movement[XY]|Radius[XY]|RotationAngle|Force)$/},t.exports=r},{}],49:[function(e,t,n){"use strict";var r=e("./hypot"),i=e("./browser"),o=e("./domObjects"),s=e("./domUtils"),a=e("./is"),l=e("./pointerExtend"),c={copyCoords:function(e,t){e.page=e.page||{},e.page.x=t.page.x,e.page.y=t.page.y,e.client=e.client||{},e.client.x=t.client.x,e.client.y=t.client.y,e.timeStamp=t.timeStamp},setCoordDeltas:function(e,t,n){e.page.x=n.page.x-t.page.x,e.page.y=n.page.y-t.page.y,e.client.x=n.client.x-t.client.x,e.client.y=n.client.y-t.client.y,e.timeStamp=n.timeStamp-t.timeStamp;var i=Math.max(e.timeStamp/1e3,.001);e.page.speed=r(e.page.x,e.page.y)/i,e.page.vx=e.page.x/i,e.page.vy=e.page.y/i,e.client.speed=r(e.client.x,e.page.y)/i,e.client.vx=e.client.x/i,e.client.vy=e.client.y/i},isNativePointer:function(e){return e instanceof o.Event||e instanceof o.Touch},getXY:function(e,t,n){return n=n||{},e=e||"page",n.x=t[e+"X"],n.y=t[e+"Y"],n},getPageXY:function(e,t){return t=t||{},i.isOperaMobile&&c.isNativePointer(e)?(c.getXY("screen",e,t),t.x+=window.scrollX,t.y+=window.scrollY):c.getXY("page",e,t),t},getClientXY:function(e,t){return t=t||{},i.isOperaMobile&&c.isNativePointer(e)?c.getXY("screen",e,t):c.getXY("client",e,t),t},getPointerId:function(e){return a.number(e.pointerId)?e.pointerId:e.identifier},setCoords:function(e,t,n){var r=t.length>1?c.pointerAverage(t):t[0],i={};c.getPageXY(r,i),e.page.x=i.x,e.page.y=i.y,c.getClientXY(r,i),e.client.x=i.x,e.client.y=i.y,e.timeStamp=a.number(n)?n:(new Date).getTime()},pointerExtend:l,getTouchPair:function(e){var t=[];return a.array(e)?(t[0]=e[0],t[1]=e[1]):"touchend"===e.type?1===e.touches.length?(t[0]=e.touches[0],t[1]=e.changedTouches[0]):0===e.touches.length&&(t[0]=e.changedTouches[0],t[1]=e.changedTouches[1]):(t[0]=e.touches[0],t[1]=e.touches[1]),t},pointerAverage:function(e){for(var t={pageX:0,pageY:0,clientX:0,clientY:0,screenX:0,screenY:0},n=e,r=Array.isArray(n),i=0,n=r?n:n[Symbol.iterator]();;){var o;if(r){if(i>=n.length)break;o=n[i++]}else{if(i=n.next(),i.done)break;o=i.value}var s=o;for(var a in t)t[a]+=s[a]}for(var l in t)t[l]/=e.length;return t},touchBBox:function(e){if(e.length||e.touches&&e.touches.length>1){var t=c.getTouchPair(e),n=Math.min(t[0].pageX,t[1].pageX),r=Math.min(t[0].pageY,t[1].pageY);return{x:n,y:r,left:n,top:r,width:Math.max(t[0].pageX,t[1].pageX)-n,height:Math.max(t[0].pageY,t[1].pageY)-r}}},touchDistance:function(e,t){var n=t+"X",i=t+"Y",o=c.getTouchPair(e),s=o[0][n]-o[1][n],a=o[0][i]-o[1][i];return r(s,a)},touchAngle:function(e,t,n){var r=n+"X",i=n+"Y",o=c.getTouchPair(e),s=o[1][r]-o[0][r],a=o[1][i]-o[0][i];return 180*Math.atan2(a,s)/Math.PI},getPointerType:function(e,t){return t.mouse?"mouse":i.supportsPointerEvent?a.string(e.pointerType)?e.pointerType:[void 0,void 0,"touch","pen","mouse"][e.pointerType]:"touch"},getEventTargets:function(e){return[s.getActualElement(e.path?e.path[0]:e.target),s.getActualElement(e.currentTarget)]}};t.exports=c},{"./browser":37,"./domObjects":38,"./domUtils":39,"./hypot":43,"./is":46,"./pointerExtend":48}],50:[function(e,t,n){"use strict";for(var r=e("./window"),i=r.window,o=["ms","moz","webkit","o"],s=0,a=void 0,l=void 0,c=0;c6&&void 0!==arguments[6]&&arguments[6];r(this,e);var f=t.target,v=(f&&f.options||s).deltaSource,g=o(f,p,l),h="start"===c,m="end"===c,y=h?t.startCoords:t.curCoords,x=t.prevEvent;p=p||t.element;var b=i({},y.page),w=i({},y.client);b.x-=g.x,b.y-=g.y,w.x-=g.x,w.y-=g.y,this.ctrlKey=n.ctrlKey,this.altKey=n.altKey,this.shiftKey=n.shiftKey,this.metaKey=n.metaKey,this.button=n.button,this.buttons=n.buttons,this.target=p,this.currentTarget=p,this.relatedTarget=u||null,this.preEnd=d,this.type=l+(c||""),this.interaction=t,this.interactable=f,this.t0=h?t.downTimes[t.downTimes.length-1]:x.t0;var E={interaction:t,event:n,action:l,phase:c,element:p,related:u,page:b,client:w,coords:y,starting:h,ending:m,deltaSource:v,iEvent:this};a.fire("set-xy",E),m?(this.pageX=x.pageX,this.pageY=x.pageY,this.clientX=x.clientX,this.clientY=x.clientY):(this.pageX=b.x,this.pageY=b.y,this.clientX=w.x,this.clientY=w.y),this.x0=t.startCoords.page.x-g.x,this.y0=t.startCoords.page.y-g.y,this.clientX0=t.startCoords.client.x-g.x,this.clientY0=t.startCoords.client.y-g.y,a.fire("set-delta",E),this.timeStamp=y.timeStamp,this.dt=t.pointerDelta.timeStamp,this.duration=this.timeStamp-this.t0,this.speed=t.pointerDelta[v].speed,this.velocityX=t.pointerDelta[v].vx,this.velocityY=t.pointerDelta[v].vy,this.swipe=m||"inertiastart"===c?this.getSwipe():null,a.fire("new",E)}return e.prototype.getSwipe=function(){var e=this.interaction;if(e.prevEvent.speed<600||this.timeStamp-e.prevEvent.timeStamp>150)return null;var t=180*Math.atan2(e.prevEvent.velocityY,e.prevEvent.velocityX)/Math.PI;t<0&&(t+=360);var n=112.5<=t&&t<247.5,r=202.5<=t&&t<337.5,i=!n&&(292.5<=t||t<67.5);return{up:r,down:!r&&22.5<=t&&t<157.5,left:n,right:i,angle:t,speed:e.prevEvent.speed,velocity:{x:e.prevEvent.velocityX,y:e.prevEvent.velocityY}}},e.prototype.preventDefault=function(){},e.prototype.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},e.prototype.stopPropagation=function(){this.propagationStopped=!0},e}();a.on("set-delta",function(e){var t=e.iEvent,n=e.interaction,r=e.starting,i=e.deltaSource,o=r?t:n.prevEvent;"client"===i?(t.dx=t.clientX-o.clientX,t.dy=t.clientY-o.clientY):(t.dx=t.pageX-o.pageX,t.dy=t.pageY-o.pageY)}),l.signals=a,t.exports=l},{"./defaultOptions":18,"./utils/Signals":35,"./utils/extend":41,"./utils/getOriginXY":42}],4:[function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=e("./utils/is"),o=e("./utils/events"),s=e("./utils/extend"),a=e("./actions/base"),l=e("./scope"),c=e("./Eventable"),p=e("./defaultOptions"),u=e("./utils/Signals").new(),d=e("./utils/domUtils"),f=d.getElementRect,v=d.nodeContains,g=d.trySelector,h=e("./utils/window"),m=h.getWindow,y=e("./utils/arr"),x=y.indexOf,b=y.contains,w=e("./utils/browser"),E=w.wheelEvent;l.interactables=[];var S=function(){function e(t,n){r(this,e),n=n||{},this.target=t,this.events=new c,this._context=n.context||l.document,this._win=m(g(t)?this._context:t),this._doc=this._win.document,u.fire("new",{target:t,options:n,interactable:this,win:this._win}),l.addDocument(this._doc,this._win),l.interactables.push(this),this.set(n)}return e.prototype.setOnEvents=function(e,t){var n="on"+e;return i.function(t.onstart)&&(this.events[n+"start"]=t.onstart),i.function(t.onmove)&&(this.events[n+"move"]=t.onmove),i.function(t.onend)&&(this.events[n+"end"]=t.onend),i.function(t.oninertiastart)&&(this.events[n+"inertiastart"]=t.oninertiastart),this},e.prototype.setPerAction=function(e,t){for(var n in t)n in p[e]&&(i.object(t[n])?(this.options[e][n]=s(this.options[e][n]||{},t[n]),i.object(p.perAction[n])&&"enabled"in p.perAction[n]&&(this.options[e][n].enabled=!1!==t[n].enabled)):i.bool(t[n])&&i.object(p.perAction[n])?this.options[e][n].enabled=t[n]:void 0!==t[n]&&(this.options[e][n]=t[n]))},e.prototype.getRect=function(e){return e=e||this.target,i.string(this.target)&&!i.element(e)&&(e=this._context.querySelector(this.target)),f(e)},e.prototype.rectChecker=function(e){return i.function(e)?(this.getRect=e,this):null===e?(delete this.options.getRect,this):this.getRect},e.prototype._backCompatOption=function(e,t){if(g(t)||i.object(t)){this.options[e]=t;for(var n=a.names,r=Array.isArray(n),o=0,n=r?n:n[Symbol.iterator]();;){var s;if(r){if(o>=n.length)break;s=n[o++]}else{if(o=n.next(),o.done)break;s=o.value}var l=s;this.options[l][e]=t}return this}return this.options[e]},e.prototype.origin=function(e){return this._backCompatOption("origin",e)},e.prototype.deltaSource=function(e){return"page"===e||"client"===e?(this.options.deltaSource=e,this):this.options.deltaSource},e.prototype.context=function(){return this._context},e.prototype.inContext=function(e){return this._context===e.ownerDocument||v(this._context,e)},e.prototype.fire=function(e){return this.events.fire(e),this},e.prototype._onOffMultiple=function(e,t,n,r){if(i.string(t)&&-1!==t.search(" ")&&(t=t.trim().split(/ +/)),i.array(t)){for(var o=0;o=l.length)break;f=l[d++]}else{if(d=l.next(),d.done)break;f=d.value}var v=f;this.options[v]=p.base[v],v in t&&this[v](t[v])}return u.fire("set",{options:t,interactable:this}),this},e.prototype.unset=function(){if(o.remove(this.target,"all"),i.string(this.target))for(var e in o.delegatedEvents){var t=o.delegatedEvents[e];t.selectors[0]===this.target&&t.contexts[0]===this._context&&(t.selectors.splice(0,1),t.contexts.splice(0,1),t.listeners.splice(0,1),t.selectors.length||(t[e]=null)),o.remove(this._context,e,o.delegateListener),o.remove(this._context,e,o.delegateUseCapture,!0)}else o.remove(this,"all");u.fire("unset",{interactable:this}),l.interactables.splice(x(l.interactables,this),1);for(var n=l.interactions||[],r=Array.isArray(n),s=0,n=r?n:n[Symbol.iterator]();;){var a;if(r){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var c=a;c.target===this&&c.interacting()&&c.stop()}return l.interact},e}();l.interactables.indexOfElement=function(e,t){t=t||l.document;for(var n=0;n=x.length)break;E=x[w++]}else{if(w=x.next(),w.done)break;E=w.value}var S=E,T=S[0],C=S[1];C._updateEventTargets(i,o),C[e](T,t,i,o)}}}function o(e){for(var t=0;te.pointerMoveTolerance);var a={pointer:t,pointerIndex:this.getPointerIndex(t),event:n,eventTarget:r,dx:o,dy:s,duplicate:i,interaction:this,interactingBeforeMove:this.interacting()};i||l.setCoordDeltas(this.pointerDelta,this.prevCoords,this.curCoords),f.fire("move",a),i||(this.interacting()&&this.doMove(a),this.pointerWasMoved&&l.copyCoords(this.prevCoords,this.curCoords))},e.prototype.doMove=function(e){e=l.extend({pointer:this.pointers[0],event:this.prevEvent,eventTarget:this._eventTarget,interaction:this},e||{}),f.fire("before-action-move",e),this._dontFireMove||f.fire("action-move",e),this._dontFireMove=!1},e.prototype.pointerUp=function(e,t,n,r){var i=this.getPointerIndex(e);f.fire(/cancel$/i.test(t.type)?"cancel":"up",{pointer:e,pointerIndex:i,event:t,eventTarget:n,curEventTarget:r,interaction:this}),this.simulation||this.end(t),this.pointerIsDown=!1,this.removePointer(e,t)},e.prototype.end=function(e){e=e||this.prevEvent,this.interacting()&&f.fire("action-end",{event:e,interaction:this}),this.stop()},e.prototype.currentAction=function(){return this._interacting?this.prepared.name:null},e.prototype.interacting=function(){return this._interacting},e.prototype.stop=function(){f.fire("stop",{interaction:this}),this._interacting&&(f.fire("stop-active",{interaction:this}),f.fire("stop-"+this.prepared.name,{interaction:this})),this.target=this.element=null,this._interacting=!1,this.prepared.name=this.prevEvent=null},e.prototype.getPointerIndex=function(e){return"mouse"===this.pointerType||"pen"===this.pointerType?0:l.indexOf(this.pointerIds,l.getPointerId(e))},e.prototype.updatePointer=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:t&&/(down|start)$/i.test(t.type),r=l.getPointerId(e),i=this.getPointerIndex(e);return-1===i&&(i=this.pointerIds.length,this.pointerIds[i]=r),n&&f.fire("update-pointer-down",{pointer:e,event:t,down:n,pointerId:r,pointerIndex:i,interaction:this}),this.pointers[i]=e,i},e.prototype.removePointer=function(e,t){var n=this.getPointerIndex(e);-1!==n&&(f.fire("remove-pointer",{pointer:e,event:t,pointerIndex:n,interaction:this}),this.pointers.splice(n,1),this.pointerIds.splice(n,1),this.downTargets.splice(n,1),this.downTimes.splice(n,1))},e.prototype._updateEventTargets=function(e,t){this._eventTarget=e,this._curEventTarget=t},e}(),y=0,x=g.length;y=i.length)break;a=i[s++]}else{if(s=i.next(),s.done)break;a=s.value}var l=a;if(l.options.drop.enabled){var c=l.options.drop.accept;if(!(p.is.element(c)&&c!==t||p.is.string(c)&&!p.matchesSelector(t,c)))for(var d=p.is.string(l.target)?l._context.querySelectorAll(l.target):[l.target],f=0;fo.left&&c.xo.top&&c.y=o.left&&v<=o.right&&g>=o.top&&g<=o.bottom}if(f&&p.is.number(a)){s=Math.max(0,Math.min(o.right,f.right)-Math.max(o.left,f.left))*Math.max(0,Math.min(o.bottom,f.bottom)-Math.max(o.top,f.top))/(f.width*f.height)>=a}return this.options.drop.checker&&(s=this.options.drop.checker(e,t,s,this,i,n,r)),s},v.signals.on("unset",function(e){e.interactable.dropzone(!1)}),v.settingsMethods.push("dropChecker"),g.signals.on("new",function(e){e.dropTarget=null,e.dropElement=null,e.prevDropTarget=null,e.prevDropElement=null,e.dropEvents=null,e.activeDrops={dropzones:[],elements:[],rects:[]}}),g.signals.on("stop",function(e){var t=e.interaction;t.dropTarget=t.dropElement=t.prevDropTarget=t.prevDropElement=null}),d.dynamicDrop=function(e){return p.is.bool(e)?(y=e,d):y},p.merge(v.eventTypes,["dragenter","dragleave","dropactivate","dropdeactivate","dropmove","drop"]),c.methodDict.drop="dropzone",h.drop=m.defaults,t.exports=m},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../interact":21,"../scope":34,"../utils":44,"./base":6}],9:[function(e,t,n){"use strict";var r=e("./base"),i=e("../utils"),o=e("../InteractEvent"),s=e("../Interactable"),a=e("../Interaction"),l=e("../defaultOptions"),c={defaults:{enabled:!1,origin:null,restrict:null},checker:function(e,t,n,r,i){return i.pointerIds.length>=2?{name:"gesture"}:null},getCursor:function(){return""}};o.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;"gesturestart"===t.type&&(t.ds=0,n.gesture.startDistance=n.gesture.prevDistance=t.distance,n.gesture.startAngle=n.gesture.prevAngle=t.angle,n.gesture.scale=1)}),o.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;"gesturemove"===t.type&&(t.ds=t.scale-n.gesture.scale,n.target.fire(t),n.gesture.prevAngle=t.angle,n.gesture.prevDistance=t.distance,t.scale===1/0||null===t.scale||void 0===t.scale||isNaN(t.scale)||(n.gesture.scale=t.scale))}),s.prototype.gesturable=function(e){return i.is.object(e)?(this.options.gesture.enabled=!1!==e.enabled,this.setPerAction("gesture",e),this.setOnEvents("gesture",e),this):i.is.bool(e)?(this.options.gesture.enabled=e,e||(this.ongesturestart=this.ongesturestart=this.ongestureend=null),this):this.options.gesture},o.signals.on("set-delta",function(e){var t=e.interaction,n=e.iEvent,r=e.action,s=e.event,a=e.starting,l=e.ending,c=e.deltaSource;if("gesture"===r){var p=t.pointers;n.touches=[p[0],p[1]],a?(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=1,n.ds=0,n.angle=i.touchAngle(p,void 0,c),n.da=0):l||s instanceof o?(n.distance=t.prevEvent.distance,n.box=t.prevEvent.box,n.scale=t.prevEvent.scale,n.ds=n.scale-1,n.angle=t.prevEvent.angle,n.da=n.angle-t.gesture.startAngle):(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=n.distance/t.gesture.startDistance,n.angle=i.touchAngle(p,t.gesture.prevAngle,c),n.ds=n.scale-t.gesture.prevScale,n.da=n.angle-t.gesture.prevAngle)}}),a.signals.on("new",function(e){e.gesture={start:{x:0,y:0},startDistance:0,prevDistance:0,distance:0,scale:1,startAngle:0,prevAngle:0}}),r.gesture=c,r.names.push("gesture"),i.merge(s.eventTypes,["gesturestart","gesturemove","gestureend"]),r.methodDict.gesture="gesturable",l.gesture=c.defaults,t.exports=c},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"./base":6}],10:[function(e,t,n){"use strict";function r(e,t,n,r,i,s,a){if(!t)return!1;if(!0===t){var l=o.is.number(s.width)?s.width:s.right-s.left,c=o.is.number(s.height)?s.height:s.bottom-s.top;if(l<0&&("left"===e?e="right":"right"===e&&(e="left")),c<0&&("top"===e?e="bottom":"bottom"===e&&(e="top")),"left"===e)return n.x<(l>=0?s.left:s.right)+a;if("top"===e)return n.y<(c>=0?s.top:s.bottom)+a;if("right"===e)return n.x>(l>=0?s.right:s.left)-a;if("bottom"===e)return n.y>(c>=0?s.bottom:s.top)-a}return!!o.is.element(r)&&(o.is.element(t)?t===r:o.matchesUpTo(r,t,i))}var i=e("./base"),o=e("../utils"),s=e("../utils/browser"),a=e("../InteractEvent"),l=e("../Interactable"),c=e("../Interaction"),p=e("../defaultOptions"),u=s.supportsTouch||s.supportsPointerEvent?20:10,d={defaults:{enabled:!1,mouseButtons:null,origin:null,snap:null,restrict:null,inertia:null,autoScroll:null,square:!1,preserveAspectRatio:!1,axis:"xy",margin:NaN,edges:null,invert:"none"},checker:function(e,t,n,i,s,a){if(!a)return null;var l=o.extend({},s.curCoords.page),c=n.options;if(c.resize.enabled){var p=c.resize,d={left:!1,right:!1,top:!1,bottom:!1};if(o.is.object(p.edges)){for(var f in d)d[f]=r(f,p.edges[f],l,s._eventTarget,i,a,p.margin||u);if(d.left=d.left&&!d.right,d.top=d.top&&!d.bottom,d.left||d.right||d.top||d.bottom)return{name:"resize",edges:d}}else{var v="y"!==c.resize.axis&&l.x>a.right-u,g="x"!==c.resize.axis&&l.y>a.bottom-u;if(v||g)return{name:"resize",axes:(v?"x":"")+(g?"y":"")}}}return null},cursors:s.isIe9OrOlder?{x:"e-resize",y:"s-resize",xy:"se-resize",top:"n-resize",left:"w-resize",bottom:"s-resize",right:"e-resize",topleft:"se-resize",bottomright:"se-resize",topright:"ne-resize",bottomleft:"ne-resize"}:{x:"ew-resize",y:"ns-resize",xy:"nwse-resize",top:"ns-resize",left:"ew-resize",bottom:"ns-resize",right:"ew-resize",topleft:"nwse-resize",bottomright:"nwse-resize",topright:"nesw-resize",bottomleft:"nesw-resize"},getCursor:function(e){if(e.axis)return d.cursors[e.name+e.axis];if(e.edges){for(var t="",n=["top","bottom","left","right"],r=0;r<4;r++)e.edges[n[r]]&&(t+=n[r]);return d.cursors[t]}}};a.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;if("resizestart"===t.type&&n.prepared.edges){var r=n.target.getRect(n.element),i=n.target.options.resize;if(i.square||i.preserveAspectRatio){var s=o.extend({},n.prepared.edges);s.top=s.top||s.left&&!s.bottom,s.left=s.left||s.top&&!s.right,s.bottom=s.bottom||s.right&&!s.top,s.right=s.right||s.bottom&&!s.left,n.prepared._linkedEdges=s}else n.prepared._linkedEdges=null;i.preserveAspectRatio&&(n.resizeStartAspectRatio=r.width/r.height),n.resizeRects={start:r,current:o.extend({},r),inverted:o.extend({},r),previous:o.extend({},r),delta:{left:0,right:0,width:0,top:0,bottom:0,height:0}},t.rect=n.resizeRects.inverted,t.deltaRect=n.resizeRects.delta}}),a.signals.on("new",function(e){var t=e.iEvent,n=e.phase,r=e.interaction;if("move"===n&&r.prepared.edges){var i=r.target.options.resize,s=i.invert,a="reposition"===s||"negate"===s,l=r.prepared.edges,c=r.resizeRects.start,p=r.resizeRects.current,u=r.resizeRects.inverted,d=r.resizeRects.delta,f=o.extend(r.resizeRects.previous,u),v=l,g=t.dx,h=t.dy;if(i.preserveAspectRatio||i.square){var m=i.preserveAspectRatio?r.resizeStartAspectRatio:1;l=r.prepared._linkedEdges,v.left&&v.bottom||v.right&&v.top?h=-g/m:v.left||v.right?h=g/m:(v.top||v.bottom)&&(g=h*m)}if(l.top&&(p.top+=h),l.bottom&&(p.bottom+=h),l.left&&(p.left+=g),l.right&&(p.right+=g),a){if(o.extend(u,p),"reposition"===s){var y=void 0;u.top>u.bottom&&(y=u.top,u.top=u.bottom,u.bottom=y),u.left>u.right&&(y=u.left,u.left=u.right,u.right=y)}}else u.top=Math.min(p.top,c.bottom),u.bottom=Math.max(p.bottom,c.top),u.left=Math.min(p.left,c.right),u.right=Math.max(p.right,c.left);u.width=u.right-u.left,u.height=u.bottom-u.top;for(var x in u)d[x]=u[x]-f[x];t.edges=r.prepared.edges,t.rect=u,t.deltaRect=d}}),l.prototype.resizable=function(e){return o.is.object(e)?(this.options.resize.enabled=!1!==e.enabled,this.setPerAction("resize",e),this.setOnEvents("resize",e),/^x$|^y$|^xy$/.test(e.axis)?this.options.resize.axis=e.axis:null===e.axis&&(this.options.resize.axis=p.resize.axis),o.is.bool(e.preserveAspectRatio)?this.options.resize.preserveAspectRatio=e.preserveAspectRatio:o.is.bool(e.square)&&(this.options.resize.square=e.square),this):o.is.bool(e)?(this.options.resize.enabled=e, +e||(this.onresizestart=this.onresizestart=this.onresizeend=null),this):this.options.resize},c.signals.on("new",function(e){e.resizeAxes="xy"}),a.signals.on("set-delta",function(e){var t=e.interaction,n=e.iEvent;"resize"===e.action&&t.resizeAxes&&(t.target.options.resize.square?("y"===t.resizeAxes?n.dx=n.dy:n.dy=n.dx,n.axes="xy"):(n.axes=t.resizeAxes,"x"===t.resizeAxes?n.dy=0:"y"===t.resizeAxes&&(n.dx=0)))}),i.resize=d,i.names.push("resize"),o.merge(l.eventTypes,["resizestart","resizemove","resizeinertiastart","resizeinertiaresume","resizeend"]),i.methodDict.resize="resizable",p.resize=d.defaults,t.exports=d},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"../utils/browser":37,"./base":6}],11:[function(e,t,n){"use strict";var r=e("./utils/raf"),i=e("./utils/window").getWindow,o=e("./utils/is"),s=e("./utils/domUtils"),a=e("./Interaction"),l=e("./defaultOptions"),c={defaults:{enabled:!1,container:null,margin:60,speed:300},interaction:null,i:null,x:0,y:0,isScrolling:!1,prevTime:0,start:function(e){c.isScrolling=!0,r.cancel(c.i),c.interaction=e,c.prevTime=(new Date).getTime(),c.i=r.request(c.scroll)},stop:function(){c.isScrolling=!1,r.cancel(c.i)},scroll:function(){var e=c.interaction.target.options[c.interaction.prepared.name].autoScroll,t=e.container||i(c.interaction.element),n=(new Date).getTime(),s=(n-c.prevTime)/1e3,a=e.speed*s;a>=1&&(o.window(t)?t.scrollBy(c.x*a,c.y*a):t&&(t.scrollLeft+=c.x*a,t.scrollTop+=c.y*a),c.prevTime=n),c.isScrolling&&(r.cancel(c.i),c.i=r.request(c.scroll))},check:function(e,t){var n=e.options;return n[t].autoScroll&&n[t].autoScroll.enabled},onInteractionMove:function(e){var t=e.interaction,n=e.pointer;if(t.interacting()&&c.check(t.target,t.prepared.name)){if(t.simulation)return void(c.x=c.y=0);var r=void 0,a=void 0,l=void 0,p=void 0,u=t.target.options[t.prepared.name].autoScroll,d=u.container||i(t.element);if(o.window(d))p=n.clientXd.innerWidth-c.margin,l=n.clientY>d.innerHeight-c.margin;else{var f=s.getElementClientRect(d);p=n.clientXf.right-c.margin,l=n.clientY>f.bottom-c.margin}c.x=a?1:p?-1:0,c.y=l?1:r?-1:0,c.isScrolling||(c.margin=u.margin,c.speed=u.speed,c.start(t))}}};a.signals.on("stop-active",function(){c.stop()}),a.signals.on("action-move",c.onInteractionMove),l.perAction.autoScroll=c.defaults,t.exports=c},{"./Interaction":5,"./defaultOptions":18,"./utils/domUtils":39,"./utils/is":46,"./utils/raf":50,"./utils/window":52}],12:[function(e,t,n){"use strict";var r=e("../Interactable"),i=e("../actions/base"),o=e("../utils/is"),s=e("../utils/domUtils");r.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},r.prototype.ignoreFrom=function(e){return this._backCompatOption("ignoreFrom",e)},r.prototype.allowFrom=function(e){return this._backCompatOption("allowFrom",e)},r.prototype.testIgnore=function(e,t,n){return!(!e||!o.element(n))&&(o.string(e)?s.matchesUpTo(n,e,t):!!o.element(e)&&s.nodeContains(e,n))},r.prototype.testAllow=function(e,t,n){return!e||!!o.element(n)&&(o.string(e)?s.matchesUpTo(n,e,t):!!o.element(e)&&s.nodeContains(e,n))},r.prototype.testIgnoreAllow=function(e,t,n){return!this.testIgnore(e.ignoreFrom,t,n)&&this.testAllow(e.allowFrom,t,n)},r.prototype.actionChecker=function(e){return o.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},r.prototype.styleCursor=function(e){return o.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},r.prototype.defaultActionChecker=function(e,t,n,r){for(var o=this.getRect(r),s=null,a=i.names,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var u=p;if((!n.pointerIsDown||!n.mouse||0!=(t.buttons&this.options[u].mouseButtons))&&(s=i[u].checker(e,t,this,r,n,o)))return s}}},{"../Interactable":4,"../actions/base":6,"../utils/domUtils":39,"../utils/is":46}],13:[function(e,t,n){"use strict";function r(e,t,n,r){return g.is.object(e)&&t.testIgnoreAllow(t.options[e.name],n,r)&&t.options[e.name].enabled&&a(t,n,e)?e:null}function i(e,t,n,i,o,s){for(var a=0,l=i.length;a=m.maxInteractions)return!1;if(u.target===e){if((a+=d===n.name|0)>=i)return!1;if(u.element===t&&(l++,d!==n.name||l>=o))return!1}}}return m.maxInteractions>0}}var l=e("../interact"),c=e("../Interactable"),p=e("../Interaction"),u=e("../actions/base"),d=e("../defaultOptions"),f=e("../utils/browser"),v=e("../scope"),g=e("../utils"),h=e("../utils/Signals").new();e("./InteractableMethods");var m={signals:h,withinInteractionLimit:a,maxInteractions:1/0,defaults:{perAction:{manualStart:!1,max:1/0,maxPerElement:1,allowFrom:null,ignoreFrom:null}},setActionDefaults:function(e){g.extend(e.defaults,m.defaults.perAction)}};p.signals.on("down",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;if(!t.interacting()){s(t,o(t,n,r,i))}}),p.signals.on("move",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;if(t.mouse&&!t.pointerIsDown&&!t.interacting()){s(t,o(t,n,r,i))}}),p.signals.on("move",function(e){var t=e.interaction,n=e.event;if(t.pointerIsDown&&!t.interacting()&&t.pointerWasMoved&&t.prepared.name){h.fire("before-start",e);var r=t.target;t.prepared.name&&r&&(r.options[t.prepared.name].manualStart||!a(r,t.element,t.prepared)?t.stop(n):t.start(t.prepared,r,t.element))}}),p.signals.on("stop",function(e){var t=e.interaction,n=t.target;n&&n.options.styleCursor&&(n._doc.documentElement.style.cursor="")}),c.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},c.prototype.actionChecker=function(e){return g.is.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},c.prototype.styleCursor=function(e){return g.is.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},c.prototype.defaultActionChecker=function(e,t,n,r){for(var i=this.getRect(r),o=t.buttons||{0:1,1:4,3:8,4:16}[t.button],s=null,a=u.names,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var d=p;if((!n.pointerIsDown||!n.mouse||0!=(o&this.options[d].mouseButtons))&&(s=u[d].checker(e,t,this,r,n,i)))return s}},l.maxInteractions=function(e){return g.is.number(e)?(m.maxInteractions=e,this):m.maxInteractions},c.settingsMethods.push("styleCursor"),c.settingsMethods.push("actionChecker"),c.settingsMethods.push("ignoreFrom"),c.settingsMethods.push("allowFrom"),d.base.actionChecker=null,d.base.styleCursor=!0,g.extend(d.perAction,m.defaults.perAction),t.exports=m},{"../Interactable":4,"../Interaction":5,"../actions/base":6,"../defaultOptions":18,"../interact":21,"../scope":34,"../utils":44,"../utils/Signals":35,"../utils/browser":37,"./InteractableMethods":12}],14:[function(e,t,n){"use strict";var r=e("./base"),i=e("../Interaction");i.signals.on("new",function(e){e.delayTimer=null}),r.signals.on("prepared",function(e){var t=e.interaction,n=t.prepared.name;if(n){var r=t.target.options[n].delay;r>0&&(t.delayTimer=setTimeout(function(){t.start(t.prepared,t.target,t.element)},r))}}),i.signals.on("move",function(e){var t=e.interaction,n=e.duplicate;t.pointerWasMoved&&!n&&clearTimeout(t.delayTimer)}),r.signals.on("before-start",function(e){var t=e.interaction,n=t.prepared.name;if(n){t.target.options[n].delay>0&&(t.prepared.name=null)}})},{"../Interaction":5,"./base":13}],15:[function(e,t,n){"use strict";function r(e,t){if(!t)return!1;var n=t.options.drag.startAxis;return"xy"===e||"xy"===n||n===e}var i=e("./base"),o=e("../scope"),s=e("../utils/browser"),a=e("../utils/is"),l=e("../utils/domUtils"),c=l.matchesSelector,p=l.parentNode;i.setActionDefaults(e("../actions/drag")),i.signals.on("before-start",function(e){var t=e.interaction,n=e.eventTarget,l=e.dx,u=e.dy;if("drag"===t.prepared.name){var d=Math.abs(l),f=Math.abs(u),v=t.target.options.drag,g=v.startAxis,h=d>f?"x":dl.minSpeed&&g>l.endSpeed,b={interaction:t,pageCoords:v,statuses:f,preEnd:!0,requireEndOnly:!0};y&&!x&&(c.resetStatuses(f),m=c.setAll(b),m.shouldMove&&m.locked&&(h=!0)),(x||h)&&(p.copyCoords(i.upCoords,t.curCoords),t.pointers[0]=i.startEvent=new a(t,n,t.prepared.name,"inertiastart",t.element),i.t0=d,i.active=!0,i.allowResume=l.allowResume,t.simulation=i,o.fire(i.startEvent),x?(i.vx0=t.pointerDelta.client.vx,i.vy0=t.pointerDelta.client.vy,i.v0=g,r(t,i),p.extend(v,t.curCoords.page),v.x+=i.xe,v.y+=i.ye,c.resetStatuses(f),m=c.setAll(b),i.modifiedXe+=m.dx,i.modifiedYe+=m.dy,i.i=u.request(t.boundInertiaFrame)):(i.smoothEnd=!0,i.xe=m.dx,i.ye=m.dy,i.sx=i.sy=0,i.i=u.request(t.boundSmoothEndFrame)))}}),l.signals.on("stop-active",function(e){var t=e.interaction,n=t.inertiaStatus;n.active&&(u.cancel(n.i),n.active=!1,t.simulation=null)})},{"./InteractEvent":3,"./Interaction":5,"./modifiers":24,"./utils":44,"./utils/raf":50}],21:[function(e,t,n){"use strict";function r(e,t){var n=a.interactables.get(e,t);return n||(n=new l(e,t),n.events.global=p),n}var i=e("./utils/browser"),o=e("./utils/events"),s=e("./utils"),a=e("./scope"),l=e("./Interactable"),c=e("./Interaction"),p={};r.isSet=function(e,t){return-1!==a.interactables.indexOfElement(e,t&&t.context)},r.on=function(e,t,n){if(s.is.string(e)&&-1!==e.search(" ")&&(e=e.trim().split(/ +/)),s.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.on(f,t,n)}return r}if(s.is.object(e)){for(var v in e)r.on(v,e[v],t);return r}return s.contains(l.eventTypes,e)?p[e]?p[e].push(t):p[e]=[t]:o.add(a.document,e,t,{options:n}),r},r.off=function(e,t,n){if(s.is.string(e)&&-1!==e.search(" ")&&(e=e.trim().split(/ +/)),s.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.off(f,t,n)}return r}if(s.is.object(e)){for(var v in e)r.off(v,e[v],t);return r}if(s.contains(l.eventTypes,e)){var g=void 0;e in p&&-1!==(g=s.indexOf(p[e],t))&&p[e].splice(g,1)}else o.remove(a.document,e,t,n);return r},r.debug=function(){return a},r.getPointerAverage=s.pointerAverage,r.getTouchBBox=s.touchBBox,r.getTouchDistance=s.touchDistance,r.getTouchAngle=s.touchAngle,r.getElementRect=s.getElementRect,r.getElementClientRect=s.getElementClientRect,r.matchesSelector=s.matchesSelector,r.closest=s.closest,r.supportsTouch=function(){return i.supportsTouch},r.supportsPointerEvent=function(){return i.supportsPointerEvent},r.stop=function(e){for(var t=a.interactions.length-1;t>=0;t--)a.interactions[t].stop(e);return r},r.pointerMoveTolerance=function(e){return s.is.number(e)?(c.pointerMoveTolerance=e,this):c.pointerMoveTolerance},r.addDocument=a.addDocument,r.removeDocument=a.removeDocument,a.interact=r,t.exports=r},{"./Interactable":4,"./Interaction":5,"./scope":34,"./utils":44,"./utils/browser":37,"./utils/events":40}],22:[function(e,t,n){"use strict";function r(e){var t=e.interaction,n=e.event;t.target&&t.target.checkAndPreventDefault(n)}var i=e("./Interactable"),o=e("./Interaction"),s=e("./scope"),a=e("./utils/is"),l=e("./utils/events"),c=e("./utils/domUtils"),p=c.nodeContains,u=c.matchesSelector;i.prototype.preventDefault=function(e){return/^(always|never|auto)$/.test(e)?(this.options.preventDefault=e,this):a.bool(e)?(this.options.preventDefault=e?"always":"never",this):this.options.preventDefault},i.prototype.checkAndPreventDefault=function(e){var t=this.options.preventDefault;if("never"!==t)return"always"===t?void e.preventDefault():void(l.supportsOptions||/^(mouse|pointer|touch)*(down|start)/i.test(e.type)||a.element(e.target)&&u(e.target,"input,select,textarea,[contenteditable=true],[contenteditable=true] *")||e.preventDefault())};for(var d=["down","move","up","cancel"],f=0;f=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i;if(o.element&&(o.element===e.target||p(o.element,e.target)))return void o.target.checkAndPreventDefault(e)}}},{"./Interactable":4,"./Interaction":5,"./scope":34,"./utils/domUtils":39,"./utils/events":40,"./utils/is":46}],23:[function(e,t,n){"use strict";function r(e){var t=e.target,n=a.search(e,e.type,t);n&&n.prevTap&&e.clientX===n.prevTap.clientX&&e.clientY===n.prevTap.clientY&&t===n.prevTap.target&&(n.downTargets[0]=t,n.downTimes[0]=(new Date).getTime(),l.fire({interaction:n,event:e,eventTarget:t,pointer:e,type:"tap"}))}var i=e("./scope"),o=e("./utils/events"),s=e("./utils/browser"),a=e("./utils/interactionFinder"),l=e("./pointerEvents/base"),c=e("./utils/window"),p=c.window,u=Object.prototype.toString;if(p.Array.isArray||(p.Array.isArray=function(e){return"[object Array]"===u.call(e)}),String.prototype.trim||(String.prototype.trim=function(){return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")}),s.isIE8){var d=function(e){for(var t=i.interactions,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var o;if(n){if(r>=t.length)break;o=t[r++]}else{if(r=t.next(),r.done)break;o=r.value}var s=o;s.interacting()&&s.target.checkAndPreventDefault(e)}},f=function(e,t){var n=e.doc,i=(e.win,0===t.indexOf("listen")?o.add:o.remove);i(n,"selectstart",d),l&&i(n,"dblclick",r)};i.signals.on("add-document",f),i.signals.on("remove-document",f)}t.exports=null},{"./pointerEvents/base":31,"./scope":34,"./utils/browser":37,"./utils/events":40,"./utils/interactionFinder":45,"./utils/window":52}],24:[function(e,t,n){"use strict";function r(e,t,n){return e&&e.enabled&&(t||!e.endOnly)&&(!n||e.endOnly)}var i=e("../InteractEvent"),o=e("../Interaction"),s=e("../utils/extend"),a={names:[],setOffsets:function(e){var t=e.interaction,n=e.pageCoords,r=t.target,i=t.element,o=t.startOffset,s=r.getRect(i);s?(o.left=n.x-s.left,o.top=n.y-s.top,o.right=s.right-n.x,o.bottom=s.bottom-n.y,"width"in s||(s.width=s.right-s.left),"height"in s||(s.height=s.bottom-s.top)):o.left=o.top=o.right=o.bottom=0,e.rect=s,e.interactable=r,e.element=i;for(var l=0;l=p.length)break;f=p[d++]}else{if(d=p.next(),d.done)break;f=d.value}var v=f,g=a[v],h=t.target.options[t.prepared.name][v];r(h,i,o)&&(e.status=e.status=n[v],e.options=h,e.offset=e.interaction.modifierOffsets[v],g.set(e),e.status.locked&&(l.x+=e.status.dx,l.y+=e.status.dy,c.dx+=e.status.dx,c.dy+=e.status.dy,c.locked=!0))}return c.shouldMove=!e.status||!c.locked||e.status.changed,c},resetStatuses:function(e){for(var t=a.names,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var i;if(n){if(r>=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i,s=e[o]||{};s.dx=s.dy=0,s.modifiedX=s.modifiedY=NaN,s.locked=!1,s.changed=!0,e[o]=s}return e},start:function(e,t){var n=e.interaction,r={interaction:n,pageCoords:("action-resume"===t?n.curCoords:n.startCoords).page,startOffset:n.startOffset,statuses:n.modifierStatuses,preEnd:!1,requireEndOnly:!1};a.setOffsets(r),a.resetStatuses(r.statuses),r.pageCoords=s({},n.startCoords.page),n.modifierResult=a.setAll(r)}};o.signals.on("new",function(e){e.startOffset={left:0,right:0,top:0,bottom:0},e.modifierOffsets={},e.modifierStatuses=a.resetStatuses({}),e.modifierResult=null}),o.signals.on("action-start",a.start),o.signals.on("action-resume",a.start),o.signals.on("before-action-move",function(e){var t=e.interaction,n=e.preEnd,r=e.interactingBeforeMove,i=a.setAll({interaction:t,preEnd:n,pageCoords:t.curCoords.page,statuses:t.modifierStatuses,requireEndOnly:!1});!i.shouldMove&&r&&(t._dontFireMove=!0),t.modifierResult=i}),o.signals.on("action-end",function(e){for(var t=e.interaction,n=e.event,i=0;i=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}var m=h,y=m.x,x=m.y;l.push({x:s.left-i.width*y+u.x,y:s.top-i.height*x+u.y})}else l.push(u);return l},set:function(e){var t=e.interaction,n=e.pageCoords,r=e.status,i=e.options,s=e.offset,a=[],l=void 0,c=void 0,p=void 0;if(r.useStatusXY)c={x:r.x,y:r.y};else{var u=o.getOriginXY(t.target,t.element,t.prepared.name);c=o.extend({},n),c.x-=u.x,c.y-=u.y}r.realX=c.x,r.realY=c.y;for(var d=i.targets?i.targets.length:0,f=s,v=Array.isArray(f),g=0,f=v?f:f[Symbol.iterator]();;){var h;if(v){if(g>=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}for(var m=h,y=m.x,x=m.y,b=c.x-y,w=c.y-x,E=i.targets,S=Array.isArray(E),T=0,E=S?E:E[Symbol.iterator]();;){var C;if(S){if(T>=E.length)break;C=E[T++]}else{if(T=E.next(),T.done)break;C=T.value}var A=C;l=o.is.function(A)?A(b,w,t):A,l&&a.push({x:o.is.number(l.x)?l.x+y:b,y:o.is.number(l.y)?l.y+x:w,range:o.is.number(l.range)?l.range:i.range})}}var D={target:null,inRange:!1,distance:0,range:0,dx:0,dy:0};for(p=0,d=a.length;p=p.length)break;f=p[d++]}else{if(d=p.next(),d.done)break;f=d.value}var v=f,g=void 0;g=a.is.function(v)?v(l,c,t):v,g&&("width"in g&&"height"in g&&(g.x=g.width, +g.y=g.height),e.options.targets.push(g))}i.set(e)},modifyCoords:function(e){var t=e.options;e.options=a.extend({},t),e.options.enabled=t.enabled,e.options.relativePoints=[null],i.modifyCoords(e)}};r.snapSize=l,r.names.push("snapSize"),o.perAction.snapSize=l.defaults,s.defaults.snapSize=l.defaults,t.exports=l},{"../actions/resize":10,"../defaultOptions":18,"../utils/":44,"./index":24,"./snap":28}],30:[function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=e("../utils/pointerUtils");t.exports=function(){function e(t,n,o,s,a){if(r(this,e),i.pointerExtend(this,o),o!==n&&i.pointerExtend(this,n),this.interaction=a,this.timeStamp=(new Date).getTime(),this.originalEvent=o,this.type=t,this.pointerId=i.getPointerId(n),this.pointerType=i.getPointerType(n),this.target=s,this.currentTarget=null,"tap"===t){var l=a.getPointerIndex(n);this.dt=this.timeStamp-a.downTimes[l];var c=this.timeStamp-a.tapTime;this.double=!!(a.prevTap&&"doubletap"!==a.prevTap.type&&a.prevTap.target===this.target&&c<500)}else"doubletap"===t&&(this.dt=n.timeStamp-a.tapTime)}return e.prototype.subtractOrigin=function(e){var t=e.x,n=e.y;return this.pageX-=t,this.pageY-=n,this.clientX-=t,this.clientY-=n,this},e.prototype.addOrigin=function(e){var t=e.x,n=e.y;return this.pageX+=t,this.pageY+=n,this.clientX+=t,this.clientY+=n,this},e.prototype.preventDefault=function(){this.originalEvent.preventDefault()},e.prototype.stopPropagation=function(){this.propagationStopped=!0},e.prototype.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},e}()},{"../utils/pointerUtils":49}],31:[function(e,t,n){"use strict";function r(e){for(var t=e.interaction,n=e.pointer,s=e.event,l=e.eventTarget,c=e.type,u=void 0===c?e.pointerEvent.type:c,d=e.targets,f=void 0===d?i(e):d,v=e.pointerEvent,g=void 0===v?new o(u,n,s,l,t):v,h={interaction:t,pointer:n,event:s,eventTarget:l,targets:f,type:u,pointerEvent:g},m=0;m=u.length)break;g=u[v++]}else{if(v=u.next(),v.done)break;g=v.value}var h=g;c.element=h,p.fire("collect-targets",c)}return"hold"===o&&(c.targets=d(c.targets,function(e){return e.eventable.options.holdDuration===t.holdTimers[s].duration})),c.targets}var o=e("./PointerEvent"),s=e("../Interaction"),a=e("../utils"),l=e("../utils/browser"),c=e("../defaultOptions"),p=e("../utils/Signals").new(),u=e("../utils/arr"),d=u.filter,f=["down","up","cancel"],v=["down","up","cancel"],g={PointerEvent:o,fire:r,collectEventTargets:i,signals:p,defaults:{holdDuration:600,ignoreFrom:null,allowFrom:null,origin:{x:0,y:0}},types:["down","move","up","cancel","tap","doubletap","hold"]};s.signals.on("update-pointer-down",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers[n]={duration:1/0,timeout:null}}),s.signals.on("remove-pointer",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers.splice(n,1)}),s.signals.on("move",function(e){var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,s=e.duplicateMove,a=t.getPointerIndex(n);s||t.pointerIsDown&&!t.pointerWasMoved||(t.pointerIsDown&&clearTimeout(t.holdTimers[a].timeout),r({interaction:t,pointer:n,event:i,eventTarget:o,type:"move"}))}),s.signals.on("down",function(e){for(var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,s=e.pointerIndex,c=l.isIE8?a.extend({},i):i,u=t.holdTimers[s],d=a.getPath(o),f={interaction:t,pointer:n,event:i,eventTarget:o,type:"hold",targets:[],path:d,element:null},v=d,g=Array.isArray(v),h=0,v=g?v:v[Symbol.iterator]();;){var m;if(g){if(h>=v.length)break;m=v[h++]}else{if(h=v.next(),h.done)break;m=h.value}var y=m;f.element=y,p.fire("collect-targets",f)}if(f.targets.length){for(var x=1/0,b=0;b=0&&(p.selectors[u]!==e||p.contexts[u]!==t);u--);-1===u&&(u=p.selectors.length,p.selectors.push(e),p.contexts.push(t),p.listeners.push([])),p.listeners[u].push([i,!!s.capture,s.passive])}function s(e,t,n,r,o){var s=f(o),c=O[n],p=!1,u=void 0;if(c)for(u=c.selectors.length-1;u>=0;u--)if(c.selectors[u]===e&&c.contexts[u]===t){for(var d=c.listeners[u],v=d.length-1;v>=0;v--){var g=d[v],h=g[0],m=g[1],y=g[2];if(h===r&&m===!!s.capture&&y===s.passive){d.splice(v,1),d.length||(c.selectors.splice(u,1),c.contexts.splice(u,1),c.listeners.splice(u,1),i(t,n,a),i(t,n,l,!0),c.selectors.length||(O[n]=null)),p=!0;break}}if(p)break}}function a(e,t){var n=f(t),r={},i=O[e.type],o=g.getActualElement(e.path?e.path[0]:e.target),s=o;for(h(r,e),r.originalEvent=e,r.preventDefault=p;v.element(s);){for(var a=0;a=l.length)break;u=l[p++]}else{if(p=l.next(),p.done)break;u=p.value}var d=u,f=o[d](a);if(f)return f}},simulationResume:function(e){var t=e.pointerType,n=e.eventType,o=e.eventTarget;if(!/down|start/i.test(n))return null;for(var s=r.interactions,a=Array.isArray(s),l=0,s=a?s:s[Symbol.iterator]();;){var c;if(a){if(l>=s.length)break;c=s[l++]}else{if(l=s.next(),l.done)break;c=l.value}var p=c,u=o;if(p.simulation&&p.simulation.allowResume&&p.pointerType===t)for(;u;){if(u===p.element)return p;u=i.parentNode(u)}}return null},mouseOrPen:function(e){var t=e.pointerId,n=e.pointerType,o=e.eventType;if("mouse"!==n&&"pen"!==n)return null;for(var s=void 0,a=r.interactions,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var u=p;if(u.pointerType===n){if(u.simulation&&!i.contains(u.pointerIds,t))continue;if(u.interacting())return u;s||(s=u)}}if(s)return s;for(var d=r.interactions,f=Array.isArray(d),v=0,d=f?d:d[Symbol.iterator]();;){var g;if(f){if(v>=d.length)break;g=d[v++]}else{if(v=d.next(),v.done)break;g=v.value}var h=g;if(!(h.pointerType!==n||/down/i.test(o)&&h.simulation))return h}return null},hasPointer:function(e){for(var t=e.pointerId,n=r.interactions,o=Array.isArray(n),s=0,n=o?n:n[Symbol.iterator]();;){var a;if(o){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var l=a;if(i.contains(l.pointerIds,t))return l}},idle:function(e){for(var t=e.pointerType,n=r.interactions,i=Array.isArray(n),o=0,n=i?n:n[Symbol.iterator]();;){var s;if(i){if(o>=n.length)break;s=n[o++]}else{if(o=n.next(),o.done)break;s=o.value}var a=s;if(1===a.pointerIds.length){var l=a.target;if(l&&!l.options.gesture.enabled)continue}else if(a.pointerIds.length>=2)continue;if(!a.interacting()&&t===a.pointerType)return a}return null}};t.exports=o},{"../scope":34,"./index":44}],46:[function(e,t,n){"use strict";var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},i=e("./window"),o=e("./isWindow"),s={array:function(){},window:function(e){return e===i.window||o(e)},docFrag:function(e){return s.object(e)&&11===e.nodeType},object:function(e){return!!e&&"object"===(void 0===e?"undefined":r(e))},function:function(e){return"function"==typeof e},number:function(e){return"number"==typeof e},bool:function(e){return"boolean"==typeof e},string:function(e){return"string"==typeof e},element:function(e){if(!e||"object"!==(void 0===e?"undefined":r(e)))return!1;var t=i.getWindow(e)||i.window;return/object|function/.test(r(t.Element))?e instanceof t.Element:1===e.nodeType&&"string"==typeof e.nodeName}};s.array=function(e){return s.object(e)&&void 0!==e.length&&s.function(e.splice)},t.exports=s},{"./isWindow":47,"./window":52}],47:[function(e,t,n){"use strict";t.exports=function(e){return!(!e||!e.Window)&&e instanceof e.Window}},{}],48:[function(e,t,n){"use strict";function r(e,n){for(var r in n){var i=t.exports.prefixedPropREs,o=!1;for(var s in i)if(0===r.indexOf(s)&&i[s].test(r)){o=!0;break}o||"function"==typeof n[r]||(e[r]=n[r])}return e}r.prefixedPropREs={webkit:/(Movement[XY]|Radius[XY]|RotationAngle|Force)$/},t.exports=r},{}],49:[function(e,t,n){"use strict";var r=e("./hypot"),i=e("./browser"),o=e("./domObjects"),s=e("./domUtils"),a=e("./domObjects"),l=e("./is"),c=e("./pointerExtend"),p={copyCoords:function(e,t){e.page=e.page||{},e.page.x=t.page.x,e.page.y=t.page.y,e.client=e.client||{},e.client.x=t.client.x,e.client.y=t.client.y,e.timeStamp=t.timeStamp},setCoordDeltas:function(e,t,n){e.page.x=n.page.x-t.page.x,e.page.y=n.page.y-t.page.y,e.client.x=n.client.x-t.client.x,e.client.y=n.client.y-t.client.y,e.timeStamp=n.timeStamp-t.timeStamp;var i=Math.max(e.timeStamp/1e3,.001);e.page.speed=r(e.page.x,e.page.y)/i,e.page.vx=e.page.x/i,e.page.vy=e.page.y/i,e.client.speed=r(e.client.x,e.page.y)/i,e.client.vx=e.client.x/i,e.client.vy=e.client.y/i},isNativePointer:function(e){return e instanceof o.Event||e instanceof o.Touch},getXY:function(e,t,n){return n=n||{},e=e||"page",n.x=t[e+"X"],n.y=t[e+"Y"],n},getPageXY:function(e,t){return t=t||{},i.isOperaMobile&&p.isNativePointer(e)?(p.getXY("screen",e,t),t.x+=window.scrollX,t.y+=window.scrollY):p.getXY("page",e,t),t},getClientXY:function(e,t){return t=t||{},i.isOperaMobile&&p.isNativePointer(e)?p.getXY("screen",e,t):p.getXY("client",e,t),t},getPointerId:function(e){return l.number(e.pointerId)?e.pointerId:e.identifier},setCoords:function(e,t,n){var r=t.length>1?p.pointerAverage(t):t[0],i={};p.getPageXY(r,i),e.page.x=i.x,e.page.y=i.y,p.getClientXY(r,i),e.client.x=i.x,e.client.y=i.y,e.timeStamp=l.number(n)?n:(new Date).getTime()},pointerExtend:c,getTouchPair:function(e){var t=[];return l.array(e)?(t[0]=e[0],t[1]=e[1]):"touchend"===e.type?1===e.touches.length?(t[0]=e.touches[0],t[1]=e.changedTouches[0]):0===e.touches.length&&(t[0]=e.changedTouches[0],t[1]=e.changedTouches[1]):(t[0]=e.touches[0],t[1]=e.touches[1]),t},pointerAverage:function(e){for(var t={pageX:0,pageY:0,clientX:0,clientY:0,screenX:0,screenY:0},n=e,r=Array.isArray(n),i=0,n=r?n:n[Symbol.iterator]();;){var o;if(r){if(i>=n.length)break;o=n[i++]}else{if(i=n.next(),i.done)break;o=i.value}var s=o;for(var a in t)t[a]+=s[a]}for(var l in t)t[l]/=e.length;return t},touchBBox:function(e){if(e.length||e.touches&&e.touches.length>1){var t=p.getTouchPair(e),n=Math.min(t[0].pageX,t[1].pageX),r=Math.min(t[0].pageY,t[1].pageY);return{x:n,y:r,left:n,top:r,width:Math.max(t[0].pageX,t[1].pageX)-n,height:Math.max(t[0].pageY,t[1].pageY)-r}}},touchDistance:function(e,t){var n=t+"X",i=t+"Y",o=p.getTouchPair(e),s=o[0][n]-o[1][n],a=o[0][i]-o[1][i];return r(s,a)},touchAngle:function(e,t,n){var r=n+"X",i=n+"Y",o=p.getTouchPair(e),s=o[1][r]-o[0][r],a=o[1][i]-o[0][i];return 180*Math.atan2(a,s)/Math.PI},getPointerType:function(e){return l.string(e.pointerType)?e.pointerType:l.number(e.pointerType)?[void 0,void 0,"touch","pen","mouse"][e.pointerType]:/touch/.test(e.type)||e instanceof a.Touch?"touch":"mouse"},getEventTargets:function(e){return[s.getActualElement(e.path?e.path[0]:e.target),s.getActualElement(e.currentTarget)]}};t.exports=p},{"./browser":37,"./domObjects":38,"./domUtils":39,"./hypot":43,"./is":46,"./pointerExtend":48}],50:[function(e,t,n){"use strict";for(var r=e("./window"),i=r.window,o=["ms","moz","webkit","o"],s=0,a=void 0,l=void 0,c=0;c\n * Open source under the MIT License.\n * https://raw.github.com/taye/interact.js/master/LICENSE\n */\n","/*\n * In a (windowless) server environment this file exports a factory function\n * that takes the window to use.\n *\n * var interact = require('interact.js')(windowObject);\n *\n * See https://github.com/taye/interact.js/issues/187\n */\nif (typeof window === 'undefined') {\n module.exports = function (window) {\n require('./src/utils/window').init(window);\n\n return require('./src/index');\n };\n}\nelse {\n module.exports = require('./src/index');\n}\n","const { indexOf } = require('./utils/arr');\nconst extend = require('./utils/extend.js');\n\nfunction fireUntilImmediateStopped (event, listeners) {\n for (let i = 0, len = listeners.length; i < len && !event.immediatePropagationStopped; i++) {\n listeners[i](event);\n }\n}\n\nclass Eventable {\n\n constructor (options) {\n this.options = extend({}, options || {});\n }\n\n fire (event) {\n let listeners;\n const onEvent = 'on' + event.type;\n const global = this.global;\n\n // Interactable#on() listeners\n if ((listeners = this[event.type])) {\n fireUntilImmediateStopped(event, listeners);\n }\n\n // interactable.onevent listener\n if (this[onEvent]) {\n this[onEvent](event);\n }\n\n // interact.on() listeners\n if (!event.propagationStopped && global && (listeners = global[event.type])) {\n fireUntilImmediateStopped(event, listeners);\n }\n }\n\n on (eventType, listener) {\n // if this type of event was never bound\n if (this[eventType]) {\n this[eventType].push(listener);\n }\n else {\n this[eventType] = [listener];\n }\n }\n\n off (eventType, listener) {\n // if it is an action event type\n const eventList = this[eventType];\n const index = eventList? indexOf(eventList, listener) : -1;\n\n if (index !== -1) {\n eventList.splice(index, 1);\n }\n\n if (eventList && eventList.length === 0 || !listener) {\n this[eventType] = listener;\n }\n }\n}\n\nmodule.exports = Eventable;\n","const extend = require('./utils/extend');\nconst getOriginXY = require('./utils/getOriginXY');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nclass InteractEvent {\n constructor (interaction, event, action, phase, element, related, preEnd = false) {\n const target = interaction.target;\n const deltaSource = (target && target.options || defaults).deltaSource;\n const origin = getOriginXY(target, element, action);\n const starting = phase === 'start';\n const ending = phase === 'end';\n const coords = starting? interaction.startCoords : interaction.curCoords;\n const prevEvent = interaction.prevEvent;\n\n element = element || interaction.element;\n\n const page = extend({}, coords.page);\n const client = extend({}, coords.client);\n\n page.x -= origin.x;\n page.y -= origin.y;\n\n client.x -= origin.x;\n client.y -= origin.y;\n\n this.ctrlKey = event.ctrlKey;\n this.altKey = event.altKey;\n this.shiftKey = event.shiftKey;\n this.metaKey = event.metaKey;\n this.button = event.button;\n this.buttons = event.buttons;\n this.target = element;\n this.currentTarget = element;\n this.relatedTarget = related || null;\n this.preEnd = preEnd;\n this.type = action + (phase || '');\n this.interaction = interaction;\n this.interactable = target;\n\n this.t0 = starting ? interaction.downTimes[interaction.downTimes.length - 1]\n : prevEvent.t0;\n\n const signalArg = {\n interaction,\n event,\n action,\n phase,\n element,\n related,\n page,\n client,\n coords,\n starting,\n ending,\n deltaSource,\n iEvent: this,\n };\n\n signals.fire('set-xy', signalArg);\n\n if (ending) {\n // use previous coords when ending\n this.pageX = prevEvent.pageX;\n this.pageY = prevEvent.pageY;\n this.clientX = prevEvent.clientX;\n this.clientY = prevEvent.clientY;\n }\n else {\n this.pageX = page.x;\n this.pageY = page.y;\n this.clientX = client.x;\n this.clientY = client.y;\n }\n\n this.x0 = interaction.startCoords.page.x - origin.x;\n this.y0 = interaction.startCoords.page.y - origin.y;\n this.clientX0 = interaction.startCoords.client.x - origin.x;\n this.clientY0 = interaction.startCoords.client.y - origin.y;\n\n signals.fire('set-delta', signalArg);\n\n this.timeStamp = coords.timeStamp;\n this.dt = interaction.pointerDelta.timeStamp;\n this.duration = this.timeStamp - this.t0;\n\n // speed and velocity in pixels per second\n this.speed = interaction.pointerDelta[deltaSource].speed;\n this.velocityX = interaction.pointerDelta[deltaSource].vx;\n this.velocityY = interaction.pointerDelta[deltaSource].vy;\n\n this.swipe = (ending || phase === 'inertiastart')? this.getSwipe() : null;\n\n signals.fire('new', signalArg);\n }\n\n getSwipe () {\n const interaction = this.interaction;\n\n if (interaction.prevEvent.speed < 600\n || this.timeStamp - interaction.prevEvent.timeStamp > 150) {\n return null;\n }\n\n let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI;\n const overlap = 22.5;\n\n if (angle < 0) {\n angle += 360;\n }\n\n const left = 135 - overlap <= angle && angle < 225 + overlap;\n const up = 225 - overlap <= angle && angle < 315 + overlap;\n\n const right = !left && (315 - overlap <= angle || angle < 45 + overlap);\n const down = !up && 45 - overlap <= angle && angle < 135 + overlap;\n\n return {\n up,\n down,\n left,\n right,\n angle,\n speed: interaction.prevEvent.speed,\n velocity: {\n x: interaction.prevEvent.velocityX,\n y: interaction.prevEvent.velocityY,\n },\n };\n }\n\n preventDefault () {}\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n}\n\nsignals.on('set-delta', function ({ iEvent, interaction, starting, deltaSource }) {\n const prevEvent = starting? iEvent : interaction.prevEvent;\n\n if (deltaSource === 'client') {\n iEvent.dx = iEvent.clientX - prevEvent.clientX;\n iEvent.dy = iEvent.clientY - prevEvent.clientY;\n }\n else {\n iEvent.dx = iEvent.pageX - prevEvent.pageX;\n iEvent.dy = iEvent.pageY - prevEvent.pageY;\n }\n});\n\nInteractEvent.signals = signals;\n\nmodule.exports = InteractEvent;\n","const is = require('./utils/is');\nconst events = require('./utils/events');\nconst extend = require('./utils/extend');\nconst actions = require('./actions/base');\nconst scope = require('./scope');\nconst Eventable = require('./Eventable');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nconst {\n getElementRect,\n nodeContains,\n trySelector,\n} = require('./utils/domUtils');\nconst { getWindow } = require('./utils/window');\nconst { indexOf, contains } = require('./utils/arr');\nconst { wheelEvent } = require('./utils/browser');\n\n// all set interactables\nscope.interactables = [];\n\n/*\\\n * Interactable\n [ property ]\n **\n * Object type returned by @interact\n\\*/\nclass Interactable {\n constructor (target, options) {\n options = options || {};\n\n this.target = target;\n this.events = new Eventable();\n this._context = options.context || scope.document;\n this._win = getWindow(trySelector(target)? this._context : target);\n this._doc = this._win.document;\n\n signals.fire('new', {\n target,\n options,\n interactable: this,\n win: this._win,\n });\n\n scope.addDocument( this._doc, this._win );\n\n scope.interactables.push(this);\n\n this.set(options);\n }\n\n setOnEvents (action, phases) {\n const onAction = 'on' + action;\n\n if (is.function(phases.onstart) ) { this.events[onAction + 'start' ] = phases.onstart ; }\n if (is.function(phases.onmove) ) { this.events[onAction + 'move' ] = phases.onmove ; }\n if (is.function(phases.onend) ) { this.events[onAction + 'end' ] = phases.onend ; }\n if (is.function(phases.oninertiastart)) { this.events[onAction + 'inertiastart' ] = phases.oninertiastart ; }\n\n return this;\n }\n\n setPerAction (action, options) {\n // for all the default per-action options\n for (const option in options) {\n // if this option exists for this action\n if (option in defaults[action]) {\n // if the option in the options arg is an object value\n if (is.object(options[option])) {\n // duplicate the object\n this.options[action][option] = extend(this.options[action][option] || {}, options[option]);\n\n if (is.object(defaults.perAction[option]) && 'enabled' in defaults.perAction[option]) {\n this.options[action][option].enabled = options[option].enabled === false? false : true;\n }\n }\n else if (is.bool(options[option]) && is.object(defaults.perAction[option])) {\n this.options[action][option].enabled = options[option];\n }\n else if (options[option] !== undefined) {\n // or if it's not undefined, do a plain assignment\n this.options[action][option] = options[option];\n }\n }\n }\n }\n\n /*\\\n * Interactable.getRect\n [ method ]\n *\n * The default function to get an Interactables bounding rect. Can be\n * overridden using @Interactable.rectChecker.\n *\n - element (Element) #optional The element to measure.\n = (object) The object's bounding rectangle.\n o {\n o top : 0,\n o left : 0,\n o bottom: 0,\n o right : 0,\n o width : 0,\n o height: 0\n o }\n \\*/\n getRect (element) {\n element = element || this.target;\n\n if (is.string(this.target) && !(is.element(element))) {\n element = this._context.querySelector(this.target);\n }\n\n return getElementRect(element);\n }\n\n /*\\\n * Interactable.rectChecker\n [ method ]\n *\n * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n - checker (function) #optional A function which returns this Interactable's bounding rectangle. See @Interactable.getRect\n = (function | object) The checker function or this Interactable\n \\*/\n rectChecker (checker) {\n if (is.function(checker)) {\n this.getRect = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.getRect;\n\n return this;\n }\n\n return this.getRect;\n }\n\n _backCompatOption (optionName, newValue) {\n if (trySelector(newValue) || is.object(newValue)) {\n this.options[optionName] = newValue;\n\n for (const action of actions.names) {\n this.options[action][optionName] = newValue;\n }\n\n return this;\n }\n\n return this.options[optionName];\n }\n\n /*\\\n * Interactable.origin\n [ method ]\n *\n * Gets or sets the origin of the Interactable's element. The x and y\n * of the origin will be subtracted from action event coordinates.\n *\n - origin (object | string) #optional An object eg. { x: 0, y: 0 } or string 'parent', 'self' or any CSS selector\n * OR\n - origin (Element) #optional An HTML or SVG Element whose rect will be used\n **\n = (object) The current origin or this Interactable\n \\*/\n origin (newValue) {\n return this._backCompatOption('origin', newValue);\n }\n\n /*\\\n * Interactable.deltaSource\n [ method ]\n *\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n - newValue (string) #optional Use 'client' if you will be scrolling while interacting; Use 'page' if you want autoScroll to work\n = (string | object) The current deltaSource or this Interactable\n \\*/\n deltaSource (newValue) {\n if (newValue === 'page' || newValue === 'client') {\n this.options.deltaSource = newValue;\n\n return this;\n }\n\n return this.options.deltaSource;\n }\n\n /*\\\n * Interactable.context\n [ method ]\n *\n * Gets the selector context Node of the Interactable. The default is `window.document`.\n *\n = (Node) The context Node of this Interactable\n **\n \\*/\n context () {\n return this._context;\n }\n\n inContext (element) {\n return (this._context === element.ownerDocument\n || nodeContains(this._context, element));\n }\n\n /*\\\n * Interactable.fire\n [ method ]\n *\n * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n - iEvent (InteractEvent) The InteractEvent object to be fired on this Interactable\n = (Interactable) this Interactable\n \\*/\n fire (iEvent) {\n this.events.fire(iEvent);\n\n return this;\n }\n\n _onOffMultiple (method, eventType, listener, options) {\n if (is.string(eventType) && eventType.search(' ') !== -1) {\n eventType = eventType.trim().split(/ +/);\n }\n\n if (is.array(eventType)) {\n for (let i = 0; i < eventType.length; i++) {\n this[method](eventType[i], listener, options);\n }\n\n return true;\n }\n\n if (is.object(eventType)) {\n for (const prop in eventType) {\n this[method](prop, eventType[prop], listener);\n }\n\n return true;\n }\n }\n\n /*\\\n * Interactable.on\n [ method ]\n *\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n - eventType (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) This Interactable\n \\*/\n on (eventType, listener, options) {\n if (this._onOffMultiple('on', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.on(eventType, listener);\n }\n // delegated event for selector\n else if (is.string(this.target)) {\n events.addDelegate(this.target, this._context, eventType, listener, options);\n }\n else {\n events.add(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.off\n [ method ]\n *\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n - eventType (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) This Interactable\n \\*/\n off (eventType, listener, options) {\n if (this._onOffMultiple('off', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n // if it is an action event type\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.off(eventType, listener);\n }\n // delegated event\n else if (is.string(this.target)) {\n events.removeDelegate(this.target, this._context, eventType, listener, options);\n }\n // remove listener from this Interatable's element\n else {\n events.remove(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.set\n [ method ]\n *\n * Reset the options of this Interactable\n - options (object) The new settings to apply\n = (object) This Interactable\n \\*/\n set (options) {\n if (!is.object(options)) {\n options = {};\n }\n\n this.options = extend({}, defaults.base);\n\n const perActions = extend({}, defaults.perAction);\n\n for (const actionName in actions.methodDict) {\n const methodName = actions.methodDict[actionName];\n\n this.options[actionName] = extend({}, defaults[actionName]);\n\n this.setPerAction(actionName, perActions);\n\n this[methodName](options[actionName]);\n }\n\n for (const setting of Interactable.settingsMethods) {\n this.options[setting] = defaults.base[setting];\n\n if (setting in options) {\n this[setting](options[setting]);\n }\n }\n\n signals.fire('set', {\n options,\n interactable: this,\n });\n\n return this;\n }\n\n /*\\\n * Interactable.unset\n [ method ]\n *\n * Remove this interactable from the list of interactables and remove\n * it's action capabilities and event listeners\n *\n = (object) @interact\n \\*/\n unset () {\n events.remove(this.target, 'all');\n\n if (is.string(this.target)) {\n // remove delegated events\n for (const type in events.delegatedEvents) {\n const delegated = events.delegatedEvents[type];\n\n if (delegated.selectors[0] === this.target\n && delegated.contexts[0] === this._context) {\n\n delegated.selectors.splice(0, 1);\n delegated.contexts .splice(0, 1);\n delegated.listeners.splice(0, 1);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegated[type] = null;\n }\n }\n\n events.remove(this._context, type, events.delegateListener);\n events.remove(this._context, type, events.delegateUseCapture, true);\n }\n }\n else {\n events.remove(this, 'all');\n }\n\n signals.fire('unset', { interactable: this });\n\n scope.interactables.splice(indexOf(scope.interactables, this), 1);\n\n // Stop related interactions when an Interactable is unset\n for (const interaction of scope.interactions || []) {\n if (interaction.target === this && interaction.interacting()) {\n interaction.stop();\n }\n }\n\n return scope.interact;\n }\n}\n\nscope.interactables.indexOfElement = function indexOfElement (target, context) {\n context = context || scope.document;\n\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n if (interactable.target === target && interactable._context === context) {\n return i;\n }\n }\n return -1;\n};\n\nscope.interactables.get = function interactableGet (element, options, dontCheckInContext) {\n const ret = this[this.indexOfElement(element, options && options.context)];\n\n return ret && (is.string(element) || dontCheckInContext || ret.inContext(element))? ret : null;\n};\n\nscope.interactables.forEachSelector = function (callback, element) {\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n // skip non CSS selector targets and out of context elements\n if (!is.string(interactable.target)\n || (element && !interactable.inContext(element))) {\n continue;\n }\n\n const ret = callback(interactable, interactable.target, interactable._context, i, this);\n\n if (ret !== undefined) {\n return ret;\n }\n }\n};\n\n// all interact.js eventTypes\nInteractable.eventTypes = scope.eventTypes = [];\n\nInteractable.signals = signals;\n\nInteractable.settingsMethods = [ 'deltaSource', 'origin', 'preventDefault', 'rectChecker' ];\n\nmodule.exports = Interactable;\n","const scope = require('./scope');\nconst utils = require('./utils');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst finder = require('./utils/interactionFinder');\nconst signals = require('./utils/Signals').new();\n\nconst listeners = {};\nconst methodNames = [\n 'pointerDown', 'pointerMove', 'pointerUp',\n 'updatePointer', 'removePointer',\n];\n\n// for ignoring browser's simulated mouse events\nlet prevTouchTime = 0;\n\n// all active and idle interactions\nscope.interactions = [];\n\nclass Interaction {\n constructor () {\n this.target = null; // current interactable being interacted with\n this.element = null; // the target element of the interactable\n\n this.prepared = { // action that's ready to be fired on next move event\n name : null,\n axis : null,\n edges: null,\n };\n\n // keep track of added pointers\n this.pointers = [];\n this.pointerIds = [];\n this.downTargets = [];\n this.downTimes = [];\n\n // Previous native pointer move event coordinates\n this.prevCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n // current native pointer move event coordinates\n this.curCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Starting InteractEvent pointer coordinates\n this.startCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Change in coordinates and time of the pointer\n this.pointerDelta = {\n page : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n client : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n timeStamp: 0,\n };\n\n this.downEvent = null; // pointerdown/mousedown/touchstart event\n this.downPointer = {};\n\n this._eventTarget = null;\n this._curEventTarget = null;\n\n this.prevEvent = null; // previous action event\n\n this.pointerIsDown = false;\n this.pointerWasMoved = false;\n this._interacting = false;\n\n this.mouse = false;\n\n signals.fire('new', this);\n\n scope.interactions.push(this);\n }\n\n pointerDown (pointer, event, eventTarget) {\n const pointerIndex = this.updatePointer(pointer, event, true);\n\n signals.fire('down', {\n pointer,\n event,\n eventTarget,\n pointerIndex,\n interaction: this,\n });\n }\n\n /*\\\n * Interaction.start\n [ method ]\n *\n * Start an action with the given Interactable and Element as tartgets. The\n * action must be enabled for the target Interactable and an appropriate number\n * of pointers must be held down - 1 for drag/resize, 2 for gesture.\n *\n * Use it with `interactable.able({ manualStart: false })` to always\n * [start actions manually](https://github.com/taye/interact.js/issues/114)\n *\n - action (object) The action to be performed - drag, resize, etc.\n - target (Interactable) The Interactable to target\n - element (Element) The DOM Element to target\n = (object) interact\n **\n | interact(target)\n | .draggable({\n | // disable the default drag start by down->move\n | manualStart: true\n | })\n | // start dragging after the user holds the pointer down\n | .on('hold', function (event) {\n | var interaction = event.interaction;\n |\n | if (!interaction.interacting()) {\n | interaction.start({ name: 'drag' },\n | event.interactable,\n | event.currentTarget);\n | }\n | });\n \\*/\n start (action, target, element) {\n if (this.interacting()\n || !this.pointerIsDown\n || this.pointerIds.length < (action.name === 'gesture'? 2 : 1)) {\n return;\n }\n\n // if this interaction had been removed after stopping\n // add it back\n if (utils.indexOf(scope.interactions, this) === -1) {\n scope.interactions.push(this);\n }\n\n utils.copyAction(this.prepared, action);\n this.target = target;\n this.element = element;\n\n signals.fire('action-start', {\n interaction: this,\n event: this.downEvent,\n });\n }\n\n pointerMove (pointer, event, eventTarget) {\n if (!this.simulation) {\n this.updatePointer(pointer);\n utils.setCoords(this.curCoords, this.pointers);\n }\n\n const duplicateMove = (this.curCoords.page.x === this.prevCoords.page.x\n && this.curCoords.page.y === this.prevCoords.page.y\n && this.curCoords.client.x === this.prevCoords.client.x\n && this.curCoords.client.y === this.prevCoords.client.y);\n\n let dx;\n let dy;\n\n // register movement greater than pointerMoveTolerance\n if (this.pointerIsDown && !this.pointerWasMoved) {\n dx = this.curCoords.client.x - this.startCoords.client.x;\n dy = this.curCoords.client.y - this.startCoords.client.y;\n\n this.pointerWasMoved = utils.hypot(dx, dy) > Interaction.pointerMoveTolerance;\n }\n\n const signalArg = {\n pointer,\n pointerIndex: this.getPointerIndex(pointer),\n event,\n eventTarget,\n dx,\n dy,\n duplicate: duplicateMove,\n interaction: this,\n interactingBeforeMove: this.interacting(),\n };\n\n if (!duplicateMove) {\n // set pointer coordinate, time changes and speeds\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n }\n\n signals.fire('move', signalArg);\n\n if (!duplicateMove) {\n // if interacting, fire an 'action-move' signal etc\n if (this.interacting()) {\n this.doMove(signalArg);\n }\n\n if (this.pointerWasMoved) {\n utils.copyCoords(this.prevCoords, this.curCoords);\n }\n }\n }\n\n /*\\\n * Interaction.doMove\n [ method ]\n *\n * Force a move of the current action at the same coordinates. Useful if\n * snap/restrict has been changed and you want a movement with the new\n * settings.\n *\n **\n | interact(target)\n | .draggable(true)\n | .on('dragmove', function (event) {\n | if (someCondition) {\n | // change the snap settings\n | event.interactable.draggable({ snap: { targets: [] }});\n | // fire another move event with re-calculated snap\n | event.interaction.doMove();\n | }\n | });\n \\*/\n doMove (signalArg) {\n signalArg = utils.extend({\n pointer: this.pointers[0],\n event: this.prevEvent,\n eventTarget: this._eventTarget,\n interaction: this,\n }, signalArg || {});\n\n signals.fire('before-action-move', signalArg);\n\n if (!this._dontFireMove) {\n signals.fire('action-move', signalArg);\n }\n\n this._dontFireMove = false;\n }\n\n // End interact move events and stop auto-scroll unless simulation is running\n pointerUp (pointer, event, eventTarget, curEventTarget) {\n const pointerIndex = this.getPointerIndex(pointer);\n\n signals.fire(/cancel$/i.test(event.type)? 'cancel' : 'up', {\n pointer,\n pointerIndex,\n event,\n eventTarget,\n curEventTarget,\n interaction: this,\n });\n\n if (!this.simulation) {\n this.end(event);\n }\n\n this.pointerIsDown = false;\n this.removePointer(pointer, event);\n }\n\n /*\\\n * Interaction.end\n [ method ]\n *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n - event (PointerEvent) #optional\n **\n | interact(target)\n | .draggable(true)\n | .on('move', function (event) {\n | if (event.pageX > 1000) {\n | // end the current action\n | event.interaction.end();\n | // stop all further listeners from being called\n | event.stopImmediatePropagation();\n | }\n | });\n \\*/\n end (event) {\n event = event || this.prevEvent;\n\n if (this.interacting()) {\n signals.fire('action-end', {\n event,\n interaction: this,\n });\n }\n\n this.stop();\n }\n\n currentAction () {\n return this._interacting? this.prepared.name: null;\n }\n\n interacting () {\n return this._interacting;\n }\n\n stop () {\n signals.fire('stop', { interaction: this });\n\n if (this._interacting) {\n signals.fire('stop-active', { interaction: this });\n signals.fire('stop-' + this.prepared.name, { interaction: this });\n }\n\n this.target = this.element = null;\n\n this._interacting = false;\n this.prepared.name = this.prevEvent = null;\n }\n\n getPointerIndex (pointer) {\n return utils.indexOf(this.pointerIds, utils.getPointerId(pointer));\n }\n\n updatePointer (pointer, event, down = event && /(down|start)$/i.test(event.type)) {\n const id = utils.getPointerId(pointer);\n let index = this.getPointerIndex(pointer);\n\n if (index === -1) {\n index = this.pointerIds.length;\n this.pointerIds[index] = id;\n }\n\n if (down) {\n signals.fire('update-pointer-down', {\n pointer,\n event,\n down,\n pointerId: id,\n pointerIndex: index,\n interaction: this,\n });\n }\n\n this.pointers[index] = pointer;\n\n return index;\n }\n\n removePointer (pointer, event) {\n const id = utils.getPointerId(pointer);\n const index = this.mouse? 0 : utils.indexOf(this.pointerIds, id);\n\n if (index === -1) { return; }\n\n signals.fire('remove-pointer', {\n pointer,\n event,\n pointerIndex: index,\n interaction: this,\n });\n\n this.pointers .splice(index, 1);\n this.pointerIds .splice(index, 1);\n this.downTargets.splice(index, 1);\n this.downTimes .splice(index, 1);\n }\n\n _updateEventTargets (target, currentTarget) {\n this._eventTarget = target;\n this._curEventTarget = currentTarget;\n }\n}\n\nfor (let i = 0, len = methodNames.length; i < len; i++) {\n const method = methodNames[i];\n\n listeners[method] = doOnInteractions(method);\n}\n\nfunction doOnInteractions (method) {\n return (function (event) {\n const [eventTarget, curEventTarget] = utils.getEventTargets(event);\n const matches = []; // [ [pointer, interaction], ...]\n\n if (browser.supportsTouch && /touch/.test(event.type)) {\n prevTouchTime = new Date().getTime();\n\n for (let i = 0; i < event.changedTouches.length; i++) {\n const pointer = event.changedTouches[i];\n const interaction = finder.search(pointer, event.type, eventTarget);\n\n matches.push([pointer, interaction || new Interaction()]);\n }\n }\n else {\n let invalidPointer = false;\n\n if (!browser.supportsPointerEvent && /mouse/.test(event.type)) {\n // ignore mouse events while touch interactions are active\n for (let i = 0; i < scope.interactions.length && !invalidPointer; i++) {\n invalidPointer = !scope.interactions[i].mouse && scope.interactions[i].pointerIsDown;\n }\n\n // try to ignore mouse events that are simulated by the browser\n // after a touch event\n invalidPointer = invalidPointer\n || (new Date().getTime() - prevTouchTime < 500)\n // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated\n || event.timeStamp === 0;\n }\n\n if (!invalidPointer) {\n let interaction = finder.search(event, event.type, eventTarget);\n\n if (!interaction) {\n\n interaction = new Interaction();\n interaction.mouse = (/mouse/i.test(event.pointerType || event.type)\n // MSPointerEvent.MSPOINTER_TYPE_MOUSE\n || event.pointerType === 4\n || !event.pointerType);\n }\n\n matches.push([event, interaction]);\n }\n }\n\n for (const [pointer, interaction] of matches) {\n interaction._updateEventTargets(eventTarget, curEventTarget);\n interaction[method](pointer, event, eventTarget, curEventTarget);\n }\n });\n}\n\nfunction endAll (event) {\n for (let i = 0; i < scope.interactions.length; i++) {\n const interaction = scope.interactions[i];\n\n interaction.end(event);\n signals.fire('endall', { event, interaction });\n }\n}\n\nconst docEvents = { /* 'eventType': listenerFunc */ };\nconst pEventTypes = browser.pEventTypes;\n\nif (scope.PointerEvent) {\n docEvents[pEventTypes.down ] = listeners.pointerDown;\n docEvents[pEventTypes.move ] = listeners.pointerMove;\n docEvents[pEventTypes.up ] = listeners.pointerUp;\n docEvents[pEventTypes.cancel] = listeners.pointerUp;\n}\nelse {\n docEvents.mousedown = listeners.pointerDown;\n docEvents.mousemove = listeners.pointerMove;\n docEvents.mouseup = listeners.pointerUp;\n\n docEvents.touchstart = listeners.pointerDown;\n docEvents.touchmove = listeners.pointerMove;\n docEvents.touchend = listeners.pointerUp;\n docEvents.touchcancel = listeners.pointerUp;\n}\n\ndocEvents.blur = endAll;\n\nfunction onDocSignal ({ doc }, signalName) {\n const eventMethod = signalName.indexOf('add') === 0\n ? events.add : events.remove;\n\n // delegate event listener\n for (const eventType in scope.delegatedEvents) {\n eventMethod(doc, eventType, events.delegateListener);\n eventMethod(doc, eventType, events.delegateUseCapture, true);\n }\n\n for (const eventType in docEvents) {\n eventMethod(doc, eventType, docEvents[eventType]);\n }\n}\n\nsignals.on('update-pointer-down', ({ interaction, pointer, pointerId, pointerIndex, event, eventTarget, down }) => {\n interaction.pointerIds[pointerIndex] = pointerId;\n interaction.pointers[pointerIndex] = pointer;\n\n if (down) {\n interaction.pointerIsDown = true;\n }\n\n if (!interaction.interacting()) {\n utils.setCoords(interaction.startCoords, interaction.pointers);\n\n utils.copyCoords(interaction.curCoords , interaction.startCoords);\n utils.copyCoords(interaction.prevCoords, interaction.startCoords);\n\n interaction.downEvent = event;\n interaction.downTimes[pointerIndex] = interaction.curCoords.timeStamp;\n interaction.downTargets[pointerIndex] = eventTarget || event && utils.getEventTargets(event)[0];\n interaction.pointerWasMoved = false;\n\n utils.pointerExtend(interaction.downPointer, pointer);\n }\n});\n\nscope.signals.on('add-document' , onDocSignal);\nscope.signals.on('remove-document', onDocSignal);\n\nInteraction.pointerMoveTolerance = 1;\nInteraction.doOnInteractions = doOnInteractions;\nInteraction.endAll = endAll;\nInteraction.signals = signals;\nInteraction.docEvents = docEvents;\n\nscope.endAllInteractions = endAll;\n\nmodule.exports = Interaction;\n","const Interaction = require('../Interaction');\nconst InteractEvent = require('../InteractEvent');\n\nconst actions = {\n firePrepared,\n names: [],\n methodDict: {},\n};\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n interaction._interacting = true;\n firePrepared(interaction, event, 'start');\n});\n\nInteraction.signals.on('action-move', function ({ interaction, event, preEnd }) {\n firePrepared(interaction, event, 'move', preEnd);\n\n // if the action was ended in a listener\n if (!interaction.interacting()) { return false; }\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n firePrepared(interaction, event, 'end');\n});\n\nfunction firePrepared (interaction, event, phase, preEnd) {\n const actionName = interaction.prepared.name;\n\n const newEvent = new InteractEvent(interaction, event, actionName, phase, interaction.element, null, preEnd);\n\n interaction.target.fire(newEvent);\n interaction.prevEvent = newEvent;\n}\n\nmodule.exports = actions;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drag = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n startAxis : 'xy',\n lockAxis : 'xy',\n },\n\n checker: function (pointer, event, interactable) {\n const dragOptions = interactable.options.drag;\n\n return dragOptions.enabled\n ? { name: 'drag', axis: (dragOptions.lockAxis === 'start'\n ? dragOptions.startAxis\n : dragOptions.lockAxis)}\n : null;\n },\n\n getCursor: function () {\n return 'move';\n },\n};\n\nInteraction.signals.on('before-action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n interaction.curCoords.page.y = interaction.startCoords.page.y;\n interaction.curCoords.client.y = interaction.startCoords.client.y;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vx);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vx);\n interaction.pointerDelta.client.vy = 0;\n interaction.pointerDelta.page.vy = 0;\n }\n else if (axis === 'y') {\n interaction.curCoords.page.x = interaction.startCoords.page.x;\n interaction.curCoords.client.x = interaction.startCoords.client.x;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vy);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vy);\n interaction.pointerDelta.client.vx = 0;\n interaction.pointerDelta.page.vx = 0;\n }\n});\n\n// dragmove\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'dragmove') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n iEvent.pageY = interaction.startCoords.page.y;\n iEvent.clientY = interaction.startCoords.client.y;\n iEvent.dy = 0;\n }\n else if (axis === 'y') {\n iEvent.pageX = interaction.startCoords.page.x;\n iEvent.clientX = interaction.startCoords.client.x;\n iEvent.dx = 0;\n }\n});\n\n/*\\\n * Interactable.draggable\n [ method ]\n *\n * Gets or sets whether drag actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of drag events\n | var isDraggable = interact('ul li').draggable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on drag events (object makes the Interactable draggable)\n = (object) This Interactable\n | interact(element).draggable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // the axis in which the first movement must be\n | // for the drag sequence to start\n | // 'xy' by default - any direction\n | startAxis: 'x' || 'y' || 'xy',\n |\n | // 'xy' by default - don't restrict to one axis (move in any direction)\n | // 'x' or 'y' to restrict movement to either axis\n | // 'start' to restrict movement to the axis the drag started in\n | lockAxis: 'x' || 'y' || 'xy' || 'start',\n |\n | // max number of drags that can happen concurrently\n | // with elements of this Interactable. Infinity by default\n | max: Infinity,\n |\n | // max number of drags that can target the same element+Interactable\n | // 1 by default\n | maxPerElement: 2\n | });\n\\*/\nInteractable.prototype.draggable = function (options) {\n if (utils.is.object(options)) {\n this.options.drag.enabled = options.enabled === false? false: true;\n this.setPerAction('drag', options);\n this.setOnEvents('drag', options);\n\n if (/^(xy|x|y|start)$/.test(options.lockAxis)) {\n this.options.drag.lockAxis = options.lockAxis;\n }\n if (/^(xy|x|y)$/.test(options.startAxis)) {\n this.options.drag.startAxis = options.startAxis;\n }\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drag.enabled = options;\n\n if (!options) {\n this.ondragstart = this.ondragstart = this.ondragend = null;\n }\n\n return this;\n }\n\n return this.options.drag;\n};\n\nactions.drag = drag;\nactions.names.push('drag');\nutils.merge(Interactable.eventTypes, [\n 'dragstart',\n 'dragmove',\n 'draginertiastart',\n 'draginertiaresume',\n 'dragend',\n]);\nactions.methodDict.drag = 'draggable';\n\ndefaultOptions.drag = drag.defaults;\n\nmodule.exports = drag;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst scope = require('../scope');\nconst interact = require('../interact');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drop = {\n defaults: {\n enabled: false,\n accept : null,\n overlap: 'pointer',\n },\n};\n\nlet dynamicDrop = false;\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // reset active dropzones\n interaction.activeDrops.dropzones = [];\n interaction.activeDrops.elements = [];\n interaction.activeDrops.rects = [];\n\n interaction.dropEvents = null;\n\n if (!interaction.dynamicDrop) {\n setActiveDrops(interaction, interaction.element);\n }\n\n const dragEvent = interaction.prevEvent;\n const dropEvents = getDropEvents(interaction, event, dragEvent);\n\n if (dropEvents.activate) {\n fireActiveDrops(interaction, dropEvents.activate);\n }\n});\n\nInteractEvent.signals.on('new', function ({ interaction, iEvent, event }) {\n if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { return; }\n\n const draggableElement = interaction.element;\n const dragEvent = iEvent;\n const dropResult = getDrop(dragEvent, event, draggableElement);\n\n interaction.dropTarget = dropResult.dropzone;\n interaction.dropElement = dropResult.element;\n\n interaction.dropEvents = getDropEvents(interaction, event, dragEvent);\n});\n\nInteraction.signals.on('action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n fireDropEvents(interaction, interaction.dropEvents);\n});\n\nInteraction.signals.on('action-end', function ({ interaction }) {\n if (interaction.prepared.name === 'drag') {\n fireDropEvents(interaction, interaction.dropEvents);\n }\n});\n\nInteraction.signals.on('stop-drag', function ({ interaction }) {\n interaction.activeDrops.dropzones =\n interaction.activeDrops.elements =\n interaction.activeDrops.rects =\n interaction.dropEvents = null;\n});\n\nfunction collectDrops (interaction, element) {\n const drops = [];\n const elements = [];\n\n element = element || interaction.element;\n\n // collect all dropzones and their elements which qualify for a drop\n for (const current of scope.interactables) {\n if (!current.options.drop.enabled) { continue; }\n\n const accept = current.options.drop.accept;\n\n // test the draggable element against the dropzone's accept setting\n if ((utils.is.element(accept) && accept !== element)\n || (utils.is.string(accept)\n && !utils.matchesSelector(element, accept))) {\n\n continue;\n }\n\n // query for new elements if necessary\n const dropElements = utils.is.string(current.target)\n ? current._context.querySelectorAll(current.target)\n : [current.target];\n\n for (let i = 0; i < dropElements.length; i++) {\n const currentElement = dropElements[i];\n\n if (currentElement !== element) {\n drops.push(current);\n elements.push(currentElement);\n }\n }\n }\n\n return {\n elements,\n dropzones: drops,\n };\n}\n\nfunction fireActiveDrops (interaction, event) {\n let prevElement;\n\n // loop through all active dropzones and trigger event\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n const current = interaction.activeDrops.dropzones[i];\n const currentElement = interaction.activeDrops.elements [i];\n\n // prevent trigger of duplicate events on same element\n if (currentElement !== prevElement) {\n // set current element as event target\n event.target = currentElement;\n current.fire(event);\n }\n prevElement = currentElement;\n }\n}\n\n// Collect a new set of possible drops and save them in activeDrops.\n// setActiveDrops should always be called when a drag has just started or a\n// drag event happens while dynamicDrop is true\nfunction setActiveDrops (interaction, dragElement) {\n // get dropzones and their elements that could receive the draggable\n const possibleDrops = collectDrops(interaction, dragElement, true);\n\n interaction.activeDrops.dropzones = possibleDrops.dropzones;\n interaction.activeDrops.elements = possibleDrops.elements;\n interaction.activeDrops.rects = [];\n\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n interaction.activeDrops.rects[i] =\n interaction.activeDrops.dropzones[i].getRect(interaction.activeDrops.elements[i]);\n }\n}\n\nfunction getDrop (dragEvent, event, dragElement) {\n const interaction = dragEvent.interaction;\n const validDrops = [];\n\n if (dynamicDrop) {\n setActiveDrops(interaction, dragElement);\n }\n\n // collect all dropzones and their elements which qualify for a drop\n for (let j = 0; j < interaction.activeDrops.dropzones.length; j++) {\n const current = interaction.activeDrops.dropzones[j];\n const currentElement = interaction.activeDrops.elements [j];\n const rect = interaction.activeDrops.rects [j];\n\n validDrops.push(current.dropCheck(dragEvent, event, interaction.target, dragElement, currentElement, rect)\n ? currentElement\n : null);\n }\n\n // get the most appropriate dropzone based on DOM depth and order\n const dropIndex = utils.indexOfDeepestElement(validDrops);\n\n return {\n dropzone: interaction.activeDrops.dropzones[dropIndex] || null,\n element : interaction.activeDrops.elements [dropIndex] || null,\n };\n}\n\nfunction getDropEvents (interaction, pointerEvent, dragEvent) {\n const dropEvents = {\n enter : null,\n leave : null,\n activate : null,\n deactivate: null,\n move : null,\n drop : null,\n };\n\n const tmpl = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n };\n\n if (interaction.dropElement !== interaction.prevDropElement) {\n // if there was a prevDropTarget, create a dragleave event\n if (interaction.prevDropTarget) {\n dropEvents.leave = utils.extend({ type: 'dragleave' }, tmpl);\n\n dragEvent.dragLeave = dropEvents.leave.target = interaction.prevDropElement;\n dragEvent.prevDropzone = dropEvents.leave.dropzone = interaction.prevDropTarget;\n }\n // if the dropTarget is not null, create a dragenter event\n if (interaction.dropTarget) {\n dropEvents.enter = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n type : 'dragenter',\n };\n\n dragEvent.dragEnter = interaction.dropElement;\n dragEvent.dropzone = interaction.dropTarget;\n }\n }\n\n if (dragEvent.type === 'dragend' && interaction.dropTarget) {\n dropEvents.drop = utils.extend({ type: 'drop' }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n dragEvent.relatedTarget = interaction.dropElement;\n }\n if (dragEvent.type === 'dragstart') {\n dropEvents.activate = utils.extend({ type: 'dropactivate' }, tmpl);\n\n dropEvents.activate.target = null;\n dropEvents.activate.dropzone = null;\n }\n if (dragEvent.type === 'dragend') {\n dropEvents.deactivate = utils.extend({ type: 'dropdeactivate' }, tmpl);\n\n dropEvents.deactivate.target = null;\n dropEvents.deactivate.dropzone = null;\n }\n if (dragEvent.type === 'dragmove' && interaction.dropTarget) {\n dropEvents.move = utils.extend({\n dragmove : dragEvent,\n type : 'dropmove',\n }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n }\n\n return dropEvents;\n}\n\nfunction fireDropEvents (interaction, dropEvents) {\n if (dropEvents.leave) { interaction.prevDropTarget.fire(dropEvents.leave); }\n if (dropEvents.move ) { interaction.dropTarget.fire(dropEvents.move ); }\n if (dropEvents.enter) { interaction.dropTarget.fire(dropEvents.enter); }\n if (dropEvents.drop ) { interaction.dropTarget.fire(dropEvents.drop ); }\n if (dropEvents.deactivate) {\n fireActiveDrops(interaction, dropEvents.deactivate);\n }\n\n interaction.prevDropTarget = interaction.dropTarget;\n interaction.prevDropElement = interaction.dropElement;\n}\n\n/*\\\n * Interactable.dropzone\n [ method ]\n *\n * Returns or sets whether elements can be dropped onto this\n * Interactable to trigger drop events\n *\n * Dropzones can receive the following events:\n * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends\n * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone\n * - `dragmove` when a draggable that has entered the dropzone is moved\n * - `drop` when a draggable is dropped into this dropzone\n *\n * Use the `accept` option to allow only elements that match the given CSS\n * selector or element. The value can be:\n *\n * - **an Element** - only that element can be dropped into this dropzone.\n * - **a string**, - the element being dragged must match it as a CSS selector.\n * - **`null`** - accept options is cleared - it accepts any element.\n *\n * Use the `overlap` option to set how drops are checked for. The allowed\n * values are:\n *\n * - `'pointer'`, the pointer must be over the dropzone (default)\n * - `'center'`, the draggable element's center must be over the dropzone\n * - a number from 0-1 which is the `(intersection area) / (draggable area)`.\n * e.g. `0.5` for drop to happen when half of the area of the draggable is\n * over the dropzone\n *\n * Use the `checker` option to specify a function to check if a dragged\n * element is over this Interactable.\n *\n | interact(target)\n | .dropChecker(function(dragEvent, // related dragmove or dragend event\n | event, // TouchEvent/PointerEvent/MouseEvent\n | dropped, // bool result of the default checker\n | dropzone, // dropzone Interactable\n | dropElement, // dropzone elemnt\n | draggable, // draggable Interactable\n | draggableElement) {// draggable element\n |\n | return dropped && event.target.hasAttribute('allow-drop');\n | }\n *\n *\n - options (boolean | object | null) #optional The new value to be set.\n | interact('.drop').dropzone({\n | accept: '.can-drop' || document.getElementById('single-drop'),\n | overlap: 'pointer' || 'center' || zeroToOne\n | }\n = (boolean | object) The current setting or this Interactable\n\\*/\nInteractable.prototype.dropzone = function (options) {\n if (utils.is.object(options)) {\n this.options.drop.enabled = options.enabled === false? false: true;\n\n if (utils.is.function(options.ondrop) ) { this.events.ondrop = options.ondrop ; }\n if (utils.is.function(options.ondropactivate) ) { this.events.ondropactivate = options.ondropactivate ; }\n if (utils.is.function(options.ondropdeactivate)) { this.events.ondropdeactivate = options.ondropdeactivate; }\n if (utils.is.function(options.ondragenter) ) { this.events.ondragenter = options.ondragenter ; }\n if (utils.is.function(options.ondragleave) ) { this.events.ondragleave = options.ondragleave ; }\n if (utils.is.function(options.ondropmove) ) { this.events.ondropmove = options.ondropmove ; }\n\n if (/^(pointer|center)$/.test(options.overlap)) {\n this.options.drop.overlap = options.overlap;\n }\n else if (utils.is.number(options.overlap)) {\n this.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0);\n }\n if ('accept' in options) {\n this.options.drop.accept = options.accept;\n }\n if ('checker' in options) {\n this.options.drop.checker = options.checker;\n }\n\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drop.enabled = options;\n\n if (!options) {\n this.ondragenter = this.ondragleave = this.ondrop\n = this.ondropactivate = this.ondropdeactivate = null;\n }\n\n return this;\n }\n\n return this.options.drop;\n};\n\nInteractable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) {\n let dropped = false;\n\n // if the dropzone has no rect (eg. display: none)\n // call the custom dropChecker or just return false\n if (!(rect = rect || this.getRect(dropElement))) {\n return (this.options.drop.checker\n ? this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement)\n : false);\n }\n\n const dropOverlap = this.options.drop.overlap;\n\n if (dropOverlap === 'pointer') {\n const origin = utils.getOriginXY(draggable, draggableElement, 'drag');\n const page = utils.getPageXY(dragEvent);\n\n page.x += origin.x;\n page.y += origin.y;\n\n const horizontal = (page.x > rect.left) && (page.x < rect.right);\n const vertical = (page.y > rect.top ) && (page.y < rect.bottom);\n\n dropped = horizontal && vertical;\n }\n\n const dragRect = draggable.getRect(draggableElement);\n\n if (dragRect && dropOverlap === 'center') {\n const cx = dragRect.left + dragRect.width / 2;\n const cy = dragRect.top + dragRect.height / 2;\n\n dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom;\n }\n\n if (dragRect && utils.is.number(dropOverlap)) {\n const overlapArea = (Math.max(0, Math.min(rect.right , dragRect.right ) - Math.max(rect.left, dragRect.left))\n * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top , dragRect.top )));\n\n const overlapRatio = overlapArea / (dragRect.width * dragRect.height);\n\n dropped = overlapRatio >= dropOverlap;\n }\n\n if (this.options.drop.checker) {\n dropped = this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement);\n }\n\n return dropped;\n};\n\nInteractable.signals.on('unset', function ({ interactable }) {\n interactable.dropzone(false);\n});\n\nInteractable.settingsMethods.push('dropChecker');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.dropTarget = null; // the dropzone a drag target might be dropped into\n interaction.dropElement = null; // the element at the time of checking\n interaction.prevDropTarget = null; // the dropzone that was recently dragged away from\n interaction.prevDropElement = null; // the element at the time of checking\n interaction.dropEvents = null; // the dropEvents related to the current drag event\n\n interaction.activeDrops = {\n dropzones: [], // the dropzones that are mentioned below\n elements : [], // elements of dropzones that accept the target draggable\n rects : [], // the rects of the elements mentioned above\n };\n\n});\n\nInteraction.signals.on('stop', function ({ interaction }) {\n interaction.dropTarget = interaction.dropElement =\n interaction.prevDropTarget = interaction.prevDropElement = null;\n});\n\n/*\\\n * interact.dynamicDrop\n [ method ]\n *\n * Returns or sets whether the dimensions of dropzone elements are\n * calculated on every dragmove or only on dragstart for the default\n * dropChecker\n *\n - newValue (boolean) #optional True to check on each move. False to check only before start\n = (boolean | interact) The current setting or interact\n\\*/\ninteract.dynamicDrop = function (newValue) {\n if (utils.is.bool(newValue)) {\n //if (dragging && dynamicDrop !== newValue && !newValue) {\n //calcRects(dropzones);\n //}\n\n dynamicDrop = newValue;\n\n return interact;\n }\n return dynamicDrop;\n};\n\nutils.merge(Interactable.eventTypes, [\n 'dragenter',\n 'dragleave',\n 'dropactivate',\n 'dropdeactivate',\n 'dropmove',\n 'drop',\n]);\nactions.methodDict.drop = 'dropzone';\n\ndefaultOptions.drop = drop.defaults;\n\nmodule.exports = drop;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst gesture = {\n defaults: {\n enabled : false,\n origin : null,\n restrict: null,\n },\n\n checker: function (pointer, event, interactable, element, interaction) {\n if (interaction.pointerIds.length >= 2) {\n return { name: 'gesture' };\n }\n\n return null;\n },\n\n getCursor: function () {\n return '';\n },\n};\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturestart') { return; }\n iEvent.ds = 0;\n\n interaction.gesture.startDistance = interaction.gesture.prevDistance = iEvent.distance;\n interaction.gesture.startAngle = interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.scale = 1;\n});\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturemove') { return; }\n\n iEvent.ds = iEvent.scale - interaction.gesture.scale;\n\n interaction.target.fire(iEvent);\n\n interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.prevDistance = iEvent.distance;\n\n if (iEvent.scale !== Infinity\n && iEvent.scale !== null\n && iEvent.scale !== undefined\n && !isNaN(iEvent.scale)) {\n\n interaction.gesture.scale = iEvent.scale;\n }\n});\n\n/*\\\n * Interactable.gesturable\n [ method ]\n *\n * Gets or sets whether multitouch gestures can be performed on the\n * Interactable's element\n *\n = (boolean) Indicates if this can be the target of gesture events\n | var isGestureable = interact(element).gesturable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on gesture events (makes the Interactable gesturable)\n = (object) this Interactable\n | interact(element).gesturable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // limit multiple gestures.\n | // See the explanation in @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n\\*/\nInteractable.prototype.gesturable = function (options) {\n if (utils.is.object(options)) {\n this.options.gesture.enabled = options.enabled === false? false: true;\n this.setPerAction('gesture', options);\n this.setOnEvents('gesture', options);\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.gesture.enabled = options;\n\n if (!options) {\n this.ongesturestart = this.ongesturestart = this.ongestureend = null;\n }\n\n return this;\n }\n\n return this.options.gesture;\n};\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action, event, starting, ending, deltaSource }) {\n if (action !== 'gesture') { return; }\n\n const pointers = interaction.pointers;\n\n iEvent.touches = [pointers[0], pointers[1]];\n\n if (starting) {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = 1;\n iEvent.ds = 0;\n iEvent.angle = utils.touchAngle(pointers, undefined, deltaSource);\n iEvent.da = 0;\n }\n else if (ending || event instanceof InteractEvent) {\n iEvent.distance = interaction.prevEvent.distance;\n iEvent.box = interaction.prevEvent.box;\n iEvent.scale = interaction.prevEvent.scale;\n iEvent.ds = iEvent.scale - 1;\n iEvent.angle = interaction.prevEvent.angle;\n iEvent.da = iEvent.angle - interaction.gesture.startAngle;\n }\n else {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = iEvent.distance / interaction.gesture.startDistance;\n iEvent.angle = utils.touchAngle(pointers, interaction.gesture.prevAngle, deltaSource);\n\n iEvent.ds = iEvent.scale - interaction.gesture.prevScale;\n iEvent.da = iEvent.angle - interaction.gesture.prevAngle;\n }\n});\n\nInteraction.signals.on('new', function (interaction) {\n interaction.gesture = {\n start: { x: 0, y: 0 },\n\n startDistance: 0, // distance between two touches of touchStart\n prevDistance : 0,\n distance : 0,\n\n scale: 1, // gesture.distance / gesture.startDistance\n\n startAngle: 0, // angle of line joining two touches\n prevAngle : 0, // angle of the previous gesture event\n };\n});\n\nactions.gesture = gesture;\nactions.names.push('gesture');\nutils.merge(Interactable.eventTypes, [\n 'gesturestart',\n 'gesturemove',\n 'gestureend',\n]);\nactions.methodDict.gesture = 'gesturable';\n\ndefaultOptions.gesture = gesture.defaults;\n\nmodule.exports = gesture;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\n// Less Precision with touch input\nconst defaultMargin = browser.supportsTouch || browser.supportsPointerEvent? 20: 10;\n\nconst resize = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n square: false,\n preserveAspectRatio: false,\n axis: 'xy',\n\n // use default margin\n margin: NaN,\n\n // object with props left, right, top, bottom which are\n // true/false values to resize when the pointer is over that edge,\n // CSS selectors to match the handles for each direction\n // or the Elements for each handle\n edges: null,\n\n // a value of 'none' will limit the resize rect to a minimum of 0x0\n // 'negate' will alow the rect to have negative width/height\n // 'reposition' will keep the width/height positive by swapping\n // the top and bottom edges and/or swapping the left and right edges\n invert: 'none',\n },\n\n checker: function (pointer, event, interactable, element, interaction, rect) {\n if (!rect) { return null; }\n\n const page = utils.extend({}, interaction.curCoords.page);\n const options = interactable.options;\n\n if (options.resize.enabled) {\n const resizeOptions = options.resize;\n const resizeEdges = { left: false, right: false, top: false, bottom: false };\n\n // if using resize.edges\n if (utils.is.object(resizeOptions.edges)) {\n for (const edge in resizeEdges) {\n resizeEdges[edge] = checkResizeEdge(edge,\n resizeOptions.edges[edge],\n page,\n interaction._eventTarget,\n element,\n rect,\n resizeOptions.margin || defaultMargin);\n }\n\n resizeEdges.left = resizeEdges.left && !resizeEdges.right;\n resizeEdges.top = resizeEdges.top && !resizeEdges.bottom;\n\n if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) {\n return {\n name: 'resize',\n edges: resizeEdges,\n };\n }\n }\n else {\n const right = options.resize.axis !== 'y' && page.x > (rect.right - defaultMargin);\n const bottom = options.resize.axis !== 'x' && page.y > (rect.bottom - defaultMargin);\n\n if (right || bottom) {\n return {\n name: 'resize',\n axes: (right? 'x' : '') + (bottom? 'y' : ''),\n };\n }\n }\n }\n\n return null;\n },\n\n cursors: (browser.isIe9OrOlder ? {\n x : 'e-resize',\n y : 's-resize',\n xy: 'se-resize',\n\n top : 'n-resize',\n left : 'w-resize',\n bottom : 's-resize',\n right : 'e-resize',\n topleft : 'se-resize',\n bottomright: 'se-resize',\n topright : 'ne-resize',\n bottomleft : 'ne-resize',\n } : {\n x : 'ew-resize',\n y : 'ns-resize',\n xy: 'nwse-resize',\n\n top : 'ns-resize',\n left : 'ew-resize',\n bottom : 'ns-resize',\n right : 'ew-resize',\n topleft : 'nwse-resize',\n bottomright: 'nwse-resize',\n topright : 'nesw-resize',\n bottomleft : 'nesw-resize',\n }),\n\n getCursor: function (action) {\n if (action.axis) {\n return resize.cursors[action.name + action.axis];\n }\n else if (action.edges) {\n let cursorKey = '';\n const edgeNames = ['top', 'bottom', 'left', 'right'];\n\n for (let i = 0; i < 4; i++) {\n if (action.edges[edgeNames[i]]) {\n cursorKey += edgeNames[i];\n }\n }\n\n return resize.cursors[cursorKey];\n }\n },\n};\n\n// resizestart\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'resizestart' || !interaction.prepared.edges) {\n return;\n }\n\n const startRect = interaction.target.getRect(interaction.element);\n const resizeOptions = interaction.target.options.resize;\n\n /*\n * When using the `resizable.square` or `resizable.preserveAspectRatio` options, resizing from one edge\n * will affect another. E.g. with `resizable.square`, resizing to make the right edge larger will make\n * the bottom edge larger by the same amount. We call these 'linked' edges. Any linked edges will depend\n * on the active edges and the edge being interacted with.\n */\n if (resizeOptions.square || resizeOptions.preserveAspectRatio) {\n const linkedEdges = utils.extend({}, interaction.prepared.edges);\n\n linkedEdges.top = linkedEdges.top || (linkedEdges.left && !linkedEdges.bottom);\n linkedEdges.left = linkedEdges.left || (linkedEdges.top && !linkedEdges.right );\n linkedEdges.bottom = linkedEdges.bottom || (linkedEdges.right && !linkedEdges.top );\n linkedEdges.right = linkedEdges.right || (linkedEdges.bottom && !linkedEdges.left );\n\n interaction.prepared._linkedEdges = linkedEdges;\n }\n else {\n interaction.prepared._linkedEdges = null;\n }\n\n // if using `resizable.preserveAspectRatio` option, record aspect ratio at the start of the resize\n if (resizeOptions.preserveAspectRatio) {\n interaction.resizeStartAspectRatio = startRect.width / startRect.height;\n }\n\n interaction.resizeRects = {\n start : startRect,\n current : utils.extend({}, startRect),\n inverted : utils.extend({}, startRect),\n previous : utils.extend({}, startRect),\n delta : {\n left: 0, right : 0, width : 0,\n top : 0, bottom: 0, height: 0,\n },\n };\n\n iEvent.rect = interaction.resizeRects.inverted;\n iEvent.deltaRect = interaction.resizeRects.delta;\n});\n\n// resizemove\nInteractEvent.signals.on('new', function ({ iEvent, phase, interaction }) {\n if (phase !== 'move' || !interaction.prepared.edges) { return; }\n\n const resizeOptions = interaction.target.options.resize;\n const invert = resizeOptions.invert;\n const invertible = invert === 'reposition' || invert === 'negate';\n\n let edges = interaction.prepared.edges;\n\n const start = interaction.resizeRects.start;\n const current = interaction.resizeRects.current;\n const inverted = interaction.resizeRects.inverted;\n const delta = interaction.resizeRects.delta;\n const previous = utils.extend(interaction.resizeRects.previous, inverted);\n const originalEdges = edges;\n\n let dx = iEvent.dx;\n let dy = iEvent.dy;\n\n if (resizeOptions.preserveAspectRatio || resizeOptions.square) {\n // `resize.preserveAspectRatio` takes precedence over `resize.square`\n const startAspectRatio = resizeOptions.preserveAspectRatio\n ? interaction.resizeStartAspectRatio\n : 1;\n\n edges = interaction.prepared._linkedEdges;\n\n if ((originalEdges.left && originalEdges.bottom)\n || (originalEdges.right && originalEdges.top)) {\n dy = -dx / startAspectRatio;\n }\n else if (originalEdges.left || originalEdges.right ) { dy = dx / startAspectRatio; }\n else if (originalEdges.top || originalEdges.bottom) { dx = dy * startAspectRatio; }\n }\n\n // update the 'current' rect without modifications\n if (edges.top ) { current.top += dy; }\n if (edges.bottom) { current.bottom += dy; }\n if (edges.left ) { current.left += dx; }\n if (edges.right ) { current.right += dx; }\n\n if (invertible) {\n // if invertible, copy the current rect\n utils.extend(inverted, current);\n\n if (invert === 'reposition') {\n // swap edge values if necessary to keep width/height positive\n let swap;\n\n if (inverted.top > inverted.bottom) {\n swap = inverted.top;\n\n inverted.top = inverted.bottom;\n inverted.bottom = swap;\n }\n if (inverted.left > inverted.right) {\n swap = inverted.left;\n\n inverted.left = inverted.right;\n inverted.right = swap;\n }\n }\n }\n else {\n // if not invertible, restrict to minimum of 0x0 rect\n inverted.top = Math.min(current.top, start.bottom);\n inverted.bottom = Math.max(current.bottom, start.top);\n inverted.left = Math.min(current.left, start.right);\n inverted.right = Math.max(current.right, start.left);\n }\n\n inverted.width = inverted.right - inverted.left;\n inverted.height = inverted.bottom - inverted.top ;\n\n for (const edge in inverted) {\n delta[edge] = inverted[edge] - previous[edge];\n }\n\n iEvent.edges = interaction.prepared.edges;\n iEvent.rect = inverted;\n iEvent.deltaRect = delta;\n});\n\n/*\\\n * Interactable.resizable\n [ method ]\n *\n * Gets or sets whether resize actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of resize elements\n | var isResizeable = interact('input[type=text]').resizable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on resize events (object makes the Interactable resizable)\n = (object) This Interactable\n | interact(element).resizable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | edges: {\n | top : true, // Use pointer coords to check for resize.\n | left : false, // Disable resizing from left edge.\n | bottom: '.resize-s',// Resize if pointer target matches selector\n | right : handleEl // Resize if pointer target is the given Element\n | },\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height are adjusted at a 1:1 ratio.\n | square: false,\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height maintain the aspect ratio they had when resizing started.\n | preserveAspectRatio: false,\n |\n | // a value of 'none' will limit the resize rect to a minimum of 0x0\n | // 'negate' will allow the rect to have negative width/height\n | // 'reposition' will keep the width/height positive by swapping\n | // the top and bottom edges and/or swapping the left and right edges\n | invert: 'none' || 'negate' || 'reposition'\n |\n | // limit multiple resizes.\n | // See the explanation in the @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n \\*/\nInteractable.prototype.resizable = function (options) {\n if (utils.is.object(options)) {\n this.options.resize.enabled = options.enabled === false? false: true;\n this.setPerAction('resize', options);\n this.setOnEvents('resize', options);\n\n if (/^x$|^y$|^xy$/.test(options.axis)) {\n this.options.resize.axis = options.axis;\n }\n else if (options.axis === null) {\n this.options.resize.axis = defaultOptions.resize.axis;\n }\n\n if (utils.is.bool(options.preserveAspectRatio)) {\n this.options.resize.preserveAspectRatio = options.preserveAspectRatio;\n }\n else if (utils.is.bool(options.square)) {\n this.options.resize.square = options.square;\n }\n\n return this;\n }\n if (utils.is.bool(options)) {\n this.options.resize.enabled = options;\n\n if (!options) {\n this.onresizestart = this.onresizestart = this.onresizeend = null;\n }\n\n return this;\n }\n return this.options.resize;\n};\n\nfunction checkResizeEdge (name, value, page, element, interactableElement, rect, margin) {\n // false, '', undefined, null\n if (!value) { return false; }\n\n // true value, use pointer coords and element rect\n if (value === true) {\n // if dimensions are negative, \"switch\" edges\n const width = utils.is.number(rect.width )? rect.width : rect.right - rect.left;\n const height = utils.is.number(rect.height)? rect.height : rect.bottom - rect.top ;\n\n if (width < 0) {\n if (name === 'left' ) { name = 'right'; }\n else if (name === 'right') { name = 'left' ; }\n }\n if (height < 0) {\n if (name === 'top' ) { name = 'bottom'; }\n else if (name === 'bottom') { name = 'top' ; }\n }\n\n if (name === 'left' ) { return page.x < ((width >= 0? rect.left: rect.right ) + margin); }\n if (name === 'top' ) { return page.y < ((height >= 0? rect.top : rect.bottom) + margin); }\n\n if (name === 'right' ) { return page.x > ((width >= 0? rect.right : rect.left) - margin); }\n if (name === 'bottom') { return page.y > ((height >= 0? rect.bottom: rect.top ) - margin); }\n }\n\n // the remaining checks require an element\n if (!utils.is.element(element)) { return false; }\n\n return utils.is.element(value)\n // the value is an element to use as a resize handle\n ? value === element\n // otherwise check if element matches value as selector\n : utils.matchesUpTo(element, value, interactableElement);\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.resizeAxes = 'xy';\n});\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action }) {\n if (action !== 'resize' || !interaction.resizeAxes) { return; }\n\n const options = interaction.target.options;\n\n if (options.resize.square) {\n if (interaction.resizeAxes === 'y') {\n iEvent.dx = iEvent.dy;\n }\n else {\n iEvent.dy = iEvent.dx;\n }\n iEvent.axes = 'xy';\n }\n else {\n iEvent.axes = interaction.resizeAxes;\n\n if (interaction.resizeAxes === 'x') {\n iEvent.dy = 0;\n }\n else if (interaction.resizeAxes === 'y') {\n iEvent.dx = 0;\n }\n }\n});\n\nactions.resize = resize;\nactions.names.push('resize');\nutils.merge(Interactable.eventTypes, [\n 'resizestart',\n 'resizemove',\n 'resizeinertiastart',\n 'resizeinertiaresume',\n 'resizeend',\n]);\nactions.methodDict.resize = 'resizable';\n\ndefaultOptions.resize = resize.defaults;\n\nmodule.exports = resize;\n","const raf = require('./utils/raf');\nconst getWindow = require('./utils/window').getWindow;\nconst is = require('./utils/is');\nconst domUtils = require('./utils/domUtils');\nconst Interaction = require('./Interaction');\nconst defaultOptions = require('./defaultOptions');\n\nconst autoScroll = {\n defaults: {\n enabled : false,\n container: null, // the item that is scrolled (Window or HTMLElement)\n margin : 60,\n speed : 300, // the scroll speed in pixels per second\n },\n\n interaction: null,\n i: null, // the handle returned by window.setInterval\n x: 0, y: 0, // Direction each pulse is to scroll in\n\n isScrolling: false,\n prevTime: 0,\n\n start: function (interaction) {\n autoScroll.isScrolling = true;\n raf.cancel(autoScroll.i);\n\n autoScroll.interaction = interaction;\n autoScroll.prevTime = new Date().getTime();\n autoScroll.i = raf.request(autoScroll.scroll);\n },\n\n stop: function () {\n autoScroll.isScrolling = false;\n raf.cancel(autoScroll.i);\n },\n\n // scroll the window by the values in scroll.x/y\n scroll: function () {\n const options = autoScroll.interaction.target.options[autoScroll.interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(autoScroll.interaction.element);\n const now = new Date().getTime();\n // change in time in seconds\n const dt = (now - autoScroll.prevTime) / 1000;\n // displacement\n const s = options.speed * dt;\n\n if (s >= 1) {\n if (is.window(container)) {\n container.scrollBy(autoScroll.x * s, autoScroll.y * s);\n }\n else if (container) {\n container.scrollLeft += autoScroll.x * s;\n container.scrollTop += autoScroll.y * s;\n }\n\n autoScroll.prevTime = now;\n }\n\n if (autoScroll.isScrolling) {\n raf.cancel(autoScroll.i);\n autoScroll.i = raf.request(autoScroll.scroll);\n }\n },\n check: function (interactable, actionName) {\n const options = interactable.options;\n\n return options[actionName].autoScroll && options[actionName].autoScroll.enabled;\n },\n onInteractionMove: function ({ interaction, pointer }) {\n if (!(interaction.interacting()\n && autoScroll.check(interaction.target, interaction.prepared.name))) {\n return;\n }\n\n if (interaction.simulation) {\n autoScroll.x = autoScroll.y = 0;\n return;\n }\n\n let top;\n let right;\n let bottom;\n let left;\n\n const options = interaction.target.options[interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(interaction.element);\n\n if (is.window(container)) {\n left = pointer.clientX < autoScroll.margin;\n top = pointer.clientY < autoScroll.margin;\n right = pointer.clientX > container.innerWidth - autoScroll.margin;\n bottom = pointer.clientY > container.innerHeight - autoScroll.margin;\n }\n else {\n const rect = domUtils.getElementClientRect(container);\n\n left = pointer.clientX < rect.left + autoScroll.margin;\n top = pointer.clientY < rect.top + autoScroll.margin;\n right = pointer.clientX > rect.right - autoScroll.margin;\n bottom = pointer.clientY > rect.bottom - autoScroll.margin;\n }\n\n autoScroll.x = (right ? 1: left? -1: 0);\n autoScroll.y = (bottom? 1: top? -1: 0);\n\n if (!autoScroll.isScrolling) {\n // set the autoScroll properties to those of the target\n autoScroll.margin = options.margin;\n autoScroll.speed = options.speed;\n\n autoScroll.start(interaction);\n }\n },\n};\n\nInteraction.signals.on('stop-active', function () {\n autoScroll.stop();\n});\n\nInteraction.signals.on('action-move', autoScroll.onInteractionMove);\n\ndefaultOptions.perAction.autoScroll = autoScroll.defaults;\n\nmodule.exports = autoScroll;\n","const Interactable = require('../Interactable');\nconst actions = require('../actions/base');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.ignoreFrom\n [ method ]\n *\n * If the target of the `mousedown`, `pointerdown` or `touchstart`\n * event or any of it's parents match the given CSS selector or\n * Element, no drag/resize/gesture is started.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to not ignore any elements\n = (string | Element | object) The current ignoreFrom value or this Interactable\n **\n | interact(element, { ignoreFrom: document.getElementById('no-action') });\n | // or\n | interact(element).ignoreFrom('input, textarea, a');\n\\*/\nInteractable.prototype.ignoreFrom = function (newValue) {\n return this._backCompatOption('ignoreFrom', newValue);\n};\n\n/*\\\n * Interactable.allowFrom\n [ method ]\n *\n * A drag/resize/gesture is started only If the target of the\n * `mousedown`, `pointerdown` or `touchstart` event or any of it's\n * parents match the given CSS selector or Element.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to allow from any element\n = (string | Element | object) The current allowFrom value or this Interactable\n **\n | interact(element, { allowFrom: document.getElementById('drag-handle') });\n | // or\n | interact(element).allowFrom('.handle');\n\\*/\nInteractable.prototype.allowFrom = function (newValue) {\n return this._backCompatOption('allowFrom', newValue);\n};\n\nInteractable.prototype.testIgnore = function (ignoreFrom, interactableElement, element) {\n if (!ignoreFrom || !is.element(element)) { return false; }\n\n if (is.string(ignoreFrom)) {\n return domUtils.matchesUpTo(element, ignoreFrom, interactableElement);\n }\n else if (is.element(ignoreFrom)) {\n return domUtils.nodeContains(ignoreFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testAllow = function (allowFrom, interactableElement, element) {\n if (!allowFrom) { return true; }\n\n if (!is.element(element)) { return false; }\n\n if (is.string(allowFrom)) {\n return domUtils.matchesUpTo(element, allowFrom, interactableElement);\n }\n else if (is.element(allowFrom)) {\n return domUtils.nodeContains(allowFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testIgnoreAllow = function (options, interactableElement, eventTarget) {\n return (!this.testIgnore(options.ignoreFrom, interactableElement, eventTarget)\n && this.testAllow(options.allowFrom, interactableElement, eventTarget));\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (event.buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\n","const interact = require('../interact');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst actions = require('../actions/base');\nconst defaultOptions = require('../defaultOptions');\nconst browser = require('../utils/browser');\nconst scope = require('../scope');\nconst utils = require('../utils');\nconst signals = require('../utils/Signals').new();\n\nrequire('./InteractableMethods');\n\nconst autoStart = {\n signals,\n withinInteractionLimit,\n // Allow this many interactions to happen simultaneously\n maxInteractions: Infinity,\n defaults: {\n perAction: {\n manualStart: false,\n max: Infinity,\n maxPerElement: 1,\n allowFrom: null,\n ignoreFrom: null,\n },\n },\n setActionDefaults: function (action) {\n utils.extend(action.defaults, autoStart.defaults.perAction);\n },\n};\n\n// set cursor style on mousedown\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget }) {\n if (interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\n// set cursor style on mousemove\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget }) {\n if (!interaction.mouse\n || interaction.pointerIsDown\n || interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\nInteraction.signals.on('move', function (arg) {\n const { interaction, event } = arg;\n\n if (!interaction.pointerIsDown\n || interaction.interacting()\n || !interaction.pointerWasMoved\n || !interaction.prepared.name) {\n return;\n }\n\n signals.fire('before-start', arg);\n\n const target = interaction.target;\n\n if (interaction.prepared.name && target) {\n // check manualStart and interaction limit\n if (target.options[interaction.prepared.name].manualStart\n || !withinInteractionLimit(target, interaction.element, interaction.prepared)) {\n interaction.stop(event);\n }\n else {\n interaction.start(interaction.prepared, target, interaction.element);\n }\n }\n});\n\n// Check if the current target supports the action.\n// If so, return the validated action. Otherwise, return null\nfunction validateAction (action, interactable, element, eventTarget) {\n if (utils.is.object(action)\n && interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget)\n && interactable.options[action.name].enabled\n && withinInteractionLimit(interactable, element, action)) {\n return action;\n }\n\n return null;\n}\n\nfunction validateSelector (interaction, pointer, event, matches, matchElements, eventTarget) {\n for (let i = 0, len = matches.length; i < len; i++) {\n const match = matches[i];\n const matchElement = matchElements[i];\n const action = validateAction(match.getAction(pointer, event, interaction, matchElement),\n match,\n matchElement,\n eventTarget);\n\n if (action) {\n return {\n action,\n target: match,\n element: matchElement,\n };\n }\n }\n\n return {};\n}\n\nfunction getActionInfo (interaction, pointer, event, eventTarget) {\n let matches = [];\n let matchElements = [];\n\n let element = eventTarget;\n let action = null;\n\n function pushMatches (interactable, selector, context) {\n const elements = (browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined);\n\n if (utils.matchesSelector(element, selector, elements)) {\n\n matches.push(interactable);\n matchElements.push(element);\n }\n }\n\n while (utils.is.element(element)) {\n matches = [];\n matchElements = [];\n\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && (action = validateAction(elementInteractable.getAction(pointer, event, interaction, element, eventTarget),\n elementInteractable,\n element,\n eventTarget))\n && !elementInteractable.options[action.name].manualStart) {\n return {\n element,\n action,\n target: elementInteractable,\n };\n }\n else {\n scope.interactables.forEachSelector(pushMatches, element);\n\n const actionInfo = validateSelector(interaction, pointer, event, matches, matchElements, eventTarget);\n\n if (actionInfo.action\n && !actionInfo.target.options[actionInfo.action.name].manualStart) {\n return actionInfo;\n }\n }\n\n element = utils.parentNode(element);\n }\n\n return {};\n}\n\nfunction prepare (interaction, { action, target, element }) {\n action = action || {};\n\n if (interaction.target && interaction.target.options.styleCursor) {\n interaction.target._doc.documentElement.style.cursor = '';\n }\n\n interaction.target = target;\n interaction.element = element;\n utils.copyAction(interaction.prepared, action);\n\n if (target && target.options.styleCursor) {\n const cursor = action? actions[action.name].getCursor(action) : '';\n interaction.target._doc.documentElement.style.cursor = cursor;\n }\n\n signals.fire('prepared', { interaction: interaction });\n}\n\nInteraction.signals.on('stop', function ({ interaction }) {\n const target = interaction.target;\n\n if (target && target.options.styleCursor) {\n target._doc.documentElement.style.cursor = '';\n }\n});\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (utils.is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (utils.is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n const buttons = event.buttons || ({\n 0: 1,\n 1: 4,\n 3: 8,\n 4: 16,\n })[event.button];\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\nfunction withinInteractionLimit (interactable, element, action) {\n const options = interactable.options;\n const maxActions = options[action.name].max;\n const maxPerElement = options[action.name].maxPerElement;\n let activeInteractions = 0;\n let targetCount = 0;\n let targetElementCount = 0;\n\n // no actions if any of these values == 0\n if (!(maxActions && maxPerElement && autoStart.maxInteractions)) { return; }\n\n for (let i = 0, len = scope.interactions.length; i < len; i++) {\n const interaction = scope.interactions[i];\n const otherAction = interaction.prepared.name;\n\n if (!interaction.interacting()) { continue; }\n\n activeInteractions++;\n\n if (activeInteractions >= autoStart.maxInteractions) {\n return false;\n }\n\n if (interaction.target !== interactable) { continue; }\n\n targetCount += (otherAction === action.name)|0;\n\n if (targetCount >= maxActions) {\n return false;\n }\n\n if (interaction.element === element) {\n targetElementCount++;\n\n if (otherAction !== action.name || targetElementCount >= maxPerElement) {\n return false;\n }\n }\n }\n\n return autoStart.maxInteractions > 0;\n}\n\n/*\\\n * interact.maxInteractions\n [ method ]\n **\n * Returns or sets the maximum number of concurrent interactions allowed.\n * By default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables\n * and elements, you need to enable it in the draggable, resizable and\n * gesturable `'max'` and `'maxPerElement'` options.\n **\n - newValue (number) #optional Any number. newValue <= 0 means no interactions.\n\\*/\ninteract.maxInteractions = function (newValue) {\n if (utils.is.number(newValue)) {\n autoStart.maxInteractions = newValue;\n\n return this;\n }\n\n return autoStart.maxInteractions;\n};\n\nInteractable.settingsMethods.push('styleCursor');\nInteractable.settingsMethods.push('actionChecker');\nInteractable.settingsMethods.push('ignoreFrom');\nInteractable.settingsMethods.push('allowFrom');\n\ndefaultOptions.base.actionChecker = null;\ndefaultOptions.base.styleCursor = true;\n\nutils.extend(defaultOptions.perAction, autoStart.defaults.perAction);\n\nmodule.exports = autoStart;\n","const autoStart = require('./base');\nconst Interaction = require('../Interaction');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.delayTimer = null;\n});\n\nautoStart.signals.on('prepared', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.delayTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.target, interaction.element);\n }, delay);\n }\n});\n\nInteraction.signals.on('move', function ({ interaction, duplicate }) {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.delayTimer);\n }\n});\n\n// prevent regular down->move autoStart\nautoStart.signals.on('before-start', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.prepared.name = null;\n }\n});\n","const autoStart = require('./base');\nconst scope = require('../scope');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\n\nconst { matchesSelector, parentNode } = require('../utils/domUtils');\n\nautoStart.setActionDefaults(require('../actions/drag'));\n\nautoStart.signals.on('before-start', function ({ interaction, eventTarget, dx, dy }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // check if a drag is in the correct axis\n const absX = Math.abs(dx);\n const absY = Math.abs(dy);\n const options = interaction.target.options.drag;\n const startAxis = options.startAxis;\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy');\n\n interaction.prepared.axis = options.lockAxis === 'start'\n ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n : options.lockAxis;\n\n // if the movement isn't in the startAxis of the interactable\n if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) {\n // cancel the prepared action\n interaction.prepared.name = null;\n\n // then try to get a drag from another ineractable\n\n if (!interaction.prepared.name) {\n\n let element = eventTarget;\n\n const getDraggable = function (interactable, selector, context) {\n const elements = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n if (interactable === interaction.target) { return; }\n\n if (!options.manualStart\n && !interactable.testIgnoreAllow(options, element, eventTarget)\n && matchesSelector(element, selector, elements)) {\n\n const action = interactable.getAction(interaction.downPointer,\n interaction.downEvent,\n interaction,\n element);\n\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, interactable)\n && autoStart.validateAction(action, interactable, element, eventTarget)) {\n\n return interactable;\n }\n }\n };\n\n let action = null;\n\n // check all interactables\n while (is.element(element)) {\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && elementInteractable !== interaction.target\n && !elementInteractable.options.drag.manualStart) {\n\n action = elementInteractable.getAction(interaction.downPointer, interaction.downEvent, interaction, element);\n }\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, elementInteractable)) {\n\n interaction.prepared.name = 'drag';\n interaction.target = elementInteractable;\n interaction.element = element;\n break;\n }\n\n const selectorInteractable = scope.interactables.forEachSelector(getDraggable, element);\n\n if (selectorInteractable) {\n interaction.prepared.name = 'drag';\n interaction.target = selectorInteractable;\n interaction.element = element;\n break;\n }\n\n element = parentNode(element);\n }\n }\n }\n});\n\nfunction checkStartAxis (startAxis, interactable) {\n if (!interactable) { return false; }\n\n const thisAxis = interactable.options.drag.startAxis;\n\n return (startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis);\n}\n","require('./base').setActionDefaults(require('../actions/gesture'));\n","require('./base').setActionDefaults(require('../actions/resize'));\n","module.exports = {\n base: {\n accept : null,\n preventDefault: 'auto',\n deltaSource : 'page',\n },\n\n perAction: {\n origin: { x: 0, y: 0 },\n\n // only allow left button by default\n // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n mouseButtons: 1,\n\n inertia: {\n enabled : false,\n resistance : 10, // the lambda in exponential decay\n minSpeed : 100, // target speed must be above this for inertia to start\n endSpeed : 10, // the speed at which inertia is slow enough to stop\n allowResume : true, // allow resuming an action in inertia phase\n smoothEndDuration: 300, // animate to snap/restrict endOnly if there's no inertia\n },\n },\n};\n","/* browser entry point */\n\n// Legacy browser support\nrequire('./legacyBrowsers');\n\n// inertia\nrequire('./inertia');\n\n// modifiers\nrequire('./modifiers/snap');\nrequire('./modifiers/restrict');\n\n// pointerEvents\nrequire('./pointerEvents/base');\nrequire('./pointerEvents/holdRepeat');\nrequire('./pointerEvents/interactableTargets');\n\n// delay\nrequire('./autoStart/delay');\n\n// actions\nrequire('./actions/gesture');\nrequire('./actions/resize');\nrequire('./actions/drag');\nrequire('./actions/drop');\n\n// load these modifiers after resize is loaded\nrequire('./modifiers/snapSize');\nrequire('./modifiers/restrictEdges');\nrequire('./modifiers/restrictSize');\n\n// autoStart actions\nrequire('./autoStart/gesture');\nrequire('./autoStart/resize');\nrequire('./autoStart/drag');\n\n// Interactable preventDefault setting\nrequire('./interactablePreventDefault.js');\n\n// autoScroll\nrequire('./autoScroll');\n\n// export interact\nmodule.exports = require('./interact');\n","const InteractEvent = require('./InteractEvent');\nconst Interaction = require('./Interaction');\nconst modifiers = require('./modifiers');\nconst utils = require('./utils');\nconst animationFrame = require('./utils/raf');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.inertiaStatus = {\n active : false,\n smoothEnd : false,\n allowResume: false,\n\n startEvent: null,\n upCoords : {},\n\n xe: 0, ye: 0,\n sx: 0, sy: 0,\n\n t0: 0,\n vx0: 0, vys: 0,\n duration: 0,\n\n lambda_v0: 0,\n one_ve_v0: 0,\n i : null,\n };\n\n interaction.boundInertiaFrame = () => inertiaFrame .apply(interaction);\n interaction.boundSmoothEndFrame = () => smoothEndFrame.apply(interaction);\n});\n\nInteraction.signals.on('down', function ({ interaction, event, pointer, eventTarget }) {\n const status = interaction.inertiaStatus;\n\n // Check if the down event hits the current inertia target\n if (status.active) {\n let element = eventTarget;\n\n // climb up the DOM tree from the event target\n while (utils.is.element(element)) {\n\n // if interaction element is the current inertia target element\n if (element === interaction.element) {\n // stop inertia\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n\n // update pointers to the down event's coordinates\n interaction.updatePointer(pointer);\n utils.setCoords(interaction.curCoords, interaction.pointers);\n\n // fire appropriate signals\n const signalArg = { interaction };\n Interaction.signals.fire('before-action-move', signalArg);\n Interaction.signals.fire('action-resume' , signalArg);\n\n // fire a reume event\n const resumeEvent = new InteractEvent(interaction,\n event,\n interaction.prepared.name,\n 'inertiaresume',\n interaction.element);\n\n interaction.target.fire(resumeEvent);\n interaction.prevEvent = resumeEvent;\n modifiers.resetStatuses(interaction.modifierStatuses);\n\n utils.copyCoords(interaction.prevCoords, interaction.curCoords);\n break;\n }\n\n element = utils.parentNode(element);\n }\n }\n});\n\nInteraction.signals.on('up', function ({ interaction, event }) {\n const status = interaction.inertiaStatus;\n\n if (!interaction.interacting() || status.active) { return; }\n\n const target = interaction.target;\n const options = target && target.options;\n const inertiaOptions = options && interaction.prepared.name && options[interaction.prepared.name].inertia;\n\n const now = new Date().getTime();\n const statuses = {};\n const page = utils.extend({}, interaction.curCoords.page);\n const pointerSpeed = interaction.pointerDelta.client.speed;\n\n let smoothEnd = false;\n let modifierResult;\n\n // check if inertia should be started\n const inertiaPossible = (inertiaOptions && inertiaOptions.enabled\n && interaction.prepared.name !== 'gesture'\n && event !== status.startEvent);\n\n const inertia = (inertiaPossible\n && (now - interaction.curCoords.timeStamp) < 50\n && pointerSpeed > inertiaOptions.minSpeed\n && pointerSpeed > inertiaOptions.endSpeed);\n\n const modifierArg = {\n interaction,\n pageCoords: page,\n statuses,\n preEnd: true,\n requireEndOnly: true,\n };\n\n // smoothEnd\n if (inertiaPossible && !inertia) {\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n if (modifierResult.shouldMove && modifierResult.locked) {\n smoothEnd = true;\n }\n }\n\n if (!(inertia || smoothEnd)) { return; }\n\n utils.copyCoords(status.upCoords, interaction.curCoords);\n\n interaction.pointers[0] = status.startEvent =\n new InteractEvent(interaction, event, interaction.prepared.name, 'inertiastart', interaction.element);\n\n status.t0 = now;\n\n status.active = true;\n status.allowResume = inertiaOptions.allowResume;\n interaction.simulation = status;\n\n target.fire(status.startEvent);\n\n if (inertia) {\n status.vx0 = interaction.pointerDelta.client.vx;\n status.vy0 = interaction.pointerDelta.client.vy;\n status.v0 = pointerSpeed;\n\n calcInertia(interaction, status);\n\n utils.extend(page, interaction.curCoords.page);\n\n page.x += status.xe;\n page.y += status.ye;\n\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n status.modifiedXe += modifierResult.dx;\n status.modifiedYe += modifierResult.dy;\n\n status.i = animationFrame.request(interaction.boundInertiaFrame);\n }\n else {\n status.smoothEnd = true;\n status.xe = modifierResult.dx;\n status.ye = modifierResult.dy;\n\n status.sx = status.sy = 0;\n\n status.i = animationFrame.request(interaction.boundSmoothEndFrame);\n }\n});\n\nInteraction.signals.on('stop-active', function ({ interaction }) {\n const status = interaction.inertiaStatus;\n\n if (status.active) {\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n }\n});\n\nfunction calcInertia (interaction, status) {\n const inertiaOptions = interaction.target.options[interaction.prepared.name].inertia;\n const lambda = inertiaOptions.resistance;\n const inertiaDur = -Math.log(inertiaOptions.endSpeed / status.v0) / lambda;\n\n status.x0 = interaction.prevEvent.pageX;\n status.y0 = interaction.prevEvent.pageY;\n status.t0 = status.startEvent.timeStamp / 1000;\n status.sx = status.sy = 0;\n\n status.modifiedXe = status.xe = (status.vx0 - inertiaDur) / lambda;\n status.modifiedYe = status.ye = (status.vy0 - inertiaDur) / lambda;\n status.te = inertiaDur;\n\n status.lambda_v0 = lambda / status.v0;\n status.one_ve_v0 = 1 - inertiaOptions.endSpeed / status.v0;\n}\n\nfunction inertiaFrame () {\n updateInertiaCoords(this);\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n\n const status = this.inertiaStatus;\n const options = this.target.options[this.prepared.name].inertia;\n const lambda = options.resistance;\n const t = new Date().getTime() / 1000 - status.t0;\n\n if (t < status.te) {\n\n const progress = 1 - (Math.exp(-lambda * t) - status.lambda_v0) / status.one_ve_v0;\n\n if (status.modifiedXe === status.xe && status.modifiedYe === status.ye) {\n status.sx = status.xe * progress;\n status.sy = status.ye * progress;\n }\n else {\n const quadPoint = utils.getQuadraticCurvePoint(0, 0,\n status.xe,\n status.ye,\n status.modifiedXe,\n status.modifiedYe,\n progress);\n\n status.sx = quadPoint.x;\n status.sy = quadPoint.y;\n }\n\n this.doMove();\n\n status.i = animationFrame.request(this.boundInertiaFrame);\n }\n else {\n status.sx = status.modifiedXe;\n status.sy = status.modifiedYe;\n\n this.doMove();\n this.end(status.startEvent);\n status.active = false;\n this.simulation = null;\n }\n\n utils.copyCoords(this.prevCoords, this.curCoords);\n}\n\nfunction smoothEndFrame () {\n updateInertiaCoords(this);\n\n const status = this.inertiaStatus;\n const t = new Date().getTime() - status.t0;\n const duration = this.target.options[this.prepared.name].inertia.smoothEndDuration;\n\n if (t < duration) {\n status.sx = utils.easeOutQuad(t, 0, status.xe, duration);\n status.sy = utils.easeOutQuad(t, 0, status.ye, duration);\n\n this.pointerMove(status.startEvent, status.startEvent);\n\n status.i = animationFrame.request(this.boundSmoothEndFrame);\n }\n else {\n status.sx = status.xe;\n status.sy = status.ye;\n\n this.pointerMove(status.startEvent, status.startEvent);\n this.end(status.startEvent);\n\n status.smoothEnd =\n status.active = false;\n this.simulation = null;\n }\n}\n\nfunction updateInertiaCoords (interaction) {\n const status = interaction.inertiaStatus;\n\n // return if inertia isn't running\n if (!status.active) { return; }\n\n const pageUp = status.upCoords.page;\n const clientUp = status.upCoords.client;\n\n utils.setCoords(interaction.curCoords, [ {\n pageX : pageUp.x + status.sx,\n pageY : pageUp.y + status.sy,\n clientX: clientUp.x + status.sx,\n clientY: clientUp.y + status.sy,\n } ]);\n}\n","const browser = require('./utils/browser');\nconst events = require('./utils/events');\nconst utils = require('./utils');\nconst scope = require('./scope');\nconst Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\n\nconst globalEvents = {};\n\n/*\\\n * interact\n [ method ]\n *\n * The methods of this variable can be used to set elements as\n * interactables and also to change various default settings.\n *\n * Calling it as a function and passing an element or a valid CSS selector\n * string returns an Interactable object which has various methods to\n * configure it.\n *\n - element (Element | string) The HTML or SVG Element to interact with or CSS selector\n = (object) An @Interactable\n *\n > Usage\n | interact('#draggable').draggable(true);\n |\n | var rectables = interact('rect');\n | rectables\n | .gesturable(true)\n | .on('gesturemove', function (event) {\n | // ...\n | });\n\\*/\nfunction interact (element, options) {\n let interactable = scope.interactables.get(element, options);\n\n if (!interactable) {\n interactable = new Interactable(element, options);\n interactable.events.global = globalEvents;\n }\n\n return interactable;\n}\n\n/*\\\n * interact.isSet\n [ method ]\n *\n * Check if an element has been set\n - element (Element) The Element being searched for\n = (boolean) Indicates if the element or CSS selector was previously passed to interact\n\\*/\ninteract.isSet = function (element, options) {\n return scope.interactables.indexOfElement(element, options && options.context) !== -1;\n};\n\n/*\\\n * interact.on\n [ method ]\n *\n * Adds a global listener for an InteractEvent or adds a DOM event to\n * `document`\n *\n - type (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) interact\n\\*/\ninteract.on = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.on(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.on(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n // if it is an InteractEvent type, add listener to globalEvents\n if (utils.contains(Interactable.eventTypes, type)) {\n // if this type of event was never bound\n if (!globalEvents[type]) {\n globalEvents[type] = [listener];\n }\n else {\n globalEvents[type].push(listener);\n }\n }\n // If non InteractEvent type, addEventListener to document\n else {\n events.add(scope.document, type, listener, { options });\n }\n\n return interact;\n};\n\n/*\\\n * interact.off\n [ method ]\n *\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n - type (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) interact\n \\*/\ninteract.off = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.off(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.off(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n if (!utils.contains(Interactable.eventTypes, type)) {\n events.remove(scope.document, type, listener, options);\n }\n else {\n let index;\n\n if (type in globalEvents\n && (index = utils.indexOf(globalEvents[type], listener)) !== -1) {\n globalEvents[type].splice(index, 1);\n }\n }\n\n return interact;\n};\n\n/*\\\n * interact.debug\n [ method ]\n *\n * Returns an object which exposes internal data\n = (object) An object with properties that outline the current state and expose internal functions and variables\n\\*/\ninteract.debug = function () {\n return scope;\n};\n\n// expose the functions used to calculate multi-touch properties\ninteract.getPointerAverage = utils.pointerAverage;\ninteract.getTouchBBox = utils.touchBBox;\ninteract.getTouchDistance = utils.touchDistance;\ninteract.getTouchAngle = utils.touchAngle;\n\ninteract.getElementRect = utils.getElementRect;\ninteract.getElementClientRect = utils.getElementClientRect;\ninteract.matchesSelector = utils.matchesSelector;\ninteract.closest = utils.closest;\n\n/*\\\n * interact.supportsTouch\n [ method ]\n *\n = (boolean) Whether or not the browser supports touch input\n\\*/\ninteract.supportsTouch = function () {\n return browser.supportsTouch;\n};\n\n/*\\\n * interact.supportsPointerEvent\n [ method ]\n *\n = (boolean) Whether or not the browser supports PointerEvents\n\\*/\ninteract.supportsPointerEvent = function () {\n return browser.supportsPointerEvent;\n};\n\n/*\\\n * interact.stop\n [ method ]\n *\n * Cancels all interactions (end events are not fired)\n *\n - event (Event) An event on which to call preventDefault()\n = (object) interact\n\\*/\ninteract.stop = function (event) {\n for (let i = scope.interactions.length - 1; i >= 0; i--) {\n scope.interactions[i].stop(event);\n }\n\n return interact;\n};\n\n/*\\\n * interact.pointerMoveTolerance\n [ method ]\n * Returns or sets the distance the pointer must be moved before an action\n * sequence occurs. This also affects tolerance for tap events.\n *\n - newValue (number) #optional The movement from the start position must be greater than this value\n = (number | Interactable) The current setting or interact\n\\*/\ninteract.pointerMoveTolerance = function (newValue) {\n if (utils.is.number(newValue)) {\n Interaction.pointerMoveTolerance = newValue;\n\n return this;\n }\n\n return Interaction.pointerMoveTolerance;\n};\n\ninteract.addDocument = scope.addDocument;\ninteract.removeDocument = scope.removeDocument;\n\nscope.interact = interact;\n\nmodule.exports = interact;\n","const Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\nconst scope = require('./scope');\nconst is = require('./utils/is');\nconst events = require('./utils/events');\n\nconst { nodeContains, matchesSelector } = require('./utils/domUtils');\n\n/*\\\n * Interactable.preventDefault\n [ method ]\n *\n * Returns or sets whether to prevent the browser's default behaviour\n * in response to pointer events. Can be set to:\n * - `'always'` to always prevent\n * - `'never'` to never prevent\n * - `'auto'` to let interact.js try to determine what would be best\n *\n - newValue (string) #optional `true`, `false` or `'auto'`\n = (string | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.preventDefault = function (newValue) {\n if (/^(always|never|auto)$/.test(newValue)) {\n this.options.preventDefault = newValue;\n return this;\n }\n\n if (is.bool(newValue)) {\n this.options.preventDefault = newValue? 'always' : 'never';\n return this;\n }\n\n return this.options.preventDefault;\n};\n\nInteractable.prototype.checkAndPreventDefault = function (event) {\n const setting = this.options.preventDefault;\n\n if (setting === 'never') { return; }\n\n if (setting === 'always') {\n event.preventDefault();\n return;\n }\n\n // setting === 'auto'\n\n // don't preventDefault if the browser supports passiveEvents\n // CSS touch-action and user-selecct should be used instead\n if (events.supportsOptions) {\n return;\n }\n\n // don't preventDefault of pointerdown events\n if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) {\n return;\n }\n\n // don't preventDefault on editable elements\n if (is.element(event.target)\n && matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) {\n return;\n }\n\n event.preventDefault();\n};\n\nfunction onInteractionEvent ({ interaction, event }) {\n if (interaction.target) {\n interaction.target.checkAndPreventDefault(event);\n }\n}\n\nfor (const eventSignal of ['down', 'move', 'up', 'cancel']) {\n Interaction.signals.on(eventSignal, onInteractionEvent);\n}\n\n// prevent native HTML5 drag on interact.js target elements\nInteraction.docEvents.dragstart = function preventNativeDrag (event) {\n for (const interaction of scope.interactions) {\n\n if (interaction.element\n && (interaction.element === event.target\n || nodeContains(interaction.element, event.target))) {\n\n interaction.target.checkAndPreventDefault(event);\n return;\n }\n }\n};\n","const scope = require('./scope');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst iFinder = require('./utils/interactionFinder');\nconst pointerEvents = require('./pointerEvents/base');\n\nconst { window } = require('./utils/window');\n\nconst toString = Object.prototype.toString;\n\nif (!window.Array.isArray) {\n window.Array.isArray = function (obj) {\n return toString.call(obj) === '[object Array]';\n };\n}\n\nif (!String.prototype.trim) {\n String.prototype.trim = function () {\n return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n };\n}\n\n// http://www.quirksmode.org/dom/events/click.html\n// >Events leading to dblclick\n//\n// IE8 doesn't fire down event before dblclick.\n// This workaround tries to fire a tap and doubletap after dblclick\nfunction onIE8Dblclick (event) {\n const eventTarget = event.target;\n const interaction = iFinder.search(event, event.type, eventTarget);\n\n if (!interaction) { return; }\n\n if (interaction.prevTap\n && event.clientX === interaction.prevTap.clientX\n && event.clientY === interaction.prevTap.clientY\n && eventTarget === interaction.prevTap.target) {\n\n interaction.downTargets[0] = eventTarget;\n interaction.downTimes [0] = new Date().getTime();\n\n pointerEvents.fire({\n interaction,\n event,\n eventTarget,\n pointer: event,\n type: 'tap',\n });\n }\n}\n\nif (browser.isIE8) {\n const selectFix = function (event) {\n for (const interaction of scope.interactions) {\n if (interaction.interacting()) {\n interaction.target.checkAndPreventDefault(event);\n }\n }\n };\n\n const onDocIE8 = function onDocIE8 ({ doc, win }, signalName) {\n const eventMethod = signalName.indexOf('listen') === 0\n ? events.add : events.remove;\n\n // For IE's lack of Event#preventDefault\n eventMethod(doc, 'selectstart', selectFix);\n\n if (pointerEvents) {\n eventMethod(doc, 'dblclick', onIE8Dblclick);\n }\n };\n\n scope.signals.on('add-document' , onDocIE8);\n scope.signals.on('remove-document', onDocIE8);\n}\n\nmodule.exports = null;\n","const InteractEvent = require('../InteractEvent');\nconst Interaction = require('../Interaction');\nconst extend = require('../utils/extend');\n\nconst modifiers = {\n names: [],\n\n setOffsets: function (arg) {\n const { interaction, pageCoords: page } = arg;\n const { target, element, startOffset } = interaction;\n const rect = target.getRect(element);\n\n if (rect) {\n startOffset.left = page.x - rect.left;\n startOffset.top = page.y - rect.top;\n\n startOffset.right = rect.right - page.x;\n startOffset.bottom = rect.bottom - page.y;\n\n if (!('width' in rect)) { rect.width = rect.right - rect.left; }\n if (!('height' in rect)) { rect.height = rect.bottom - rect.top ; }\n }\n else {\n startOffset.left = startOffset.top = startOffset.right = startOffset.bottom = 0;\n }\n\n arg.rect = rect;\n arg.interactable = target;\n arg.element = element;\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n\n arg.options = target.options[interaction.prepared.name][modifierName];\n\n if (!arg.options) {\n continue;\n }\n\n interaction.modifierOffsets[modifierName] = modifiers[modifierName].setOffset(arg);\n }\n },\n\n setAll: function (arg) {\n const { interaction, statuses, preEnd, requireEndOnly } = arg;\n const coords = extend({}, arg.pageCoords);\n const result = {\n dx: 0,\n dy: 0,\n changed: false,\n locked: false,\n shouldMove: true,\n };\n\n for (const modifierName of modifiers.names) {\n const modifier = modifiers[modifierName];\n const options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!shouldDo(options, preEnd, requireEndOnly)) { continue; }\n\n arg.status = arg.status = statuses[modifierName];\n arg.options = options;\n arg.offset = arg.interaction.modifierOffsets[modifierName];\n\n modifier.set(arg);\n\n if (arg.status.locked) {\n coords.x += arg.status.dx;\n coords.y += arg.status.dy;\n\n result.dx += arg.status.dx;\n result.dy += arg.status.dy;\n\n result.locked = true;\n }\n }\n\n // a move should be fired if:\n // - there are no modifiers enabled,\n // - no modifiers are \"locked\" i.e. have changed the pointer's coordinates, or\n // - the locked coords have changed since the last pointer move\n result.shouldMove = !arg.status || !result.locked || arg.status.changed;\n\n return result;\n },\n\n resetStatuses: function (statuses) {\n for (const modifierName of modifiers.names) {\n const status = statuses[modifierName] || {};\n\n status.dx = status.dy = 0;\n status.modifiedX = status.modifiedY = NaN;\n status.locked = false;\n status.changed = true;\n\n statuses[modifierName] = status;\n }\n\n return statuses;\n },\n\n start: function ({ interaction }, signalName) {\n const arg = {\n interaction,\n pageCoords: (signalName === 'action-resume' ?\n interaction.curCoords : interaction.startCoords).page,\n startOffset: interaction.startOffset,\n statuses: interaction.modifierStatuses,\n preEnd: false,\n requireEndOnly: false,\n };\n\n modifiers.setOffsets(arg);\n modifiers.resetStatuses(arg.statuses);\n\n arg.pageCoords = extend({}, interaction.startCoords.page);\n interaction.modifierResult = modifiers.setAll(arg);\n },\n};\n\nInteraction.signals.on('new', function (interaction) {\n interaction.startOffset = { left: 0, right: 0, top: 0, bottom: 0 };\n interaction.modifierOffsets = {};\n interaction.modifierStatuses = modifiers.resetStatuses({});\n interaction.modifierResult = null;\n});\n\nInteraction.signals.on('action-start' , modifiers.start);\nInteraction.signals.on('action-resume', modifiers.start);\n\nInteraction.signals.on('before-action-move', function ({ interaction, preEnd, interactingBeforeMove }) {\n const modifierResult = modifiers.setAll({\n interaction,\n preEnd,\n pageCoords: interaction.curCoords.page,\n statuses: interaction.modifierStatuses,\n requireEndOnly: false,\n });\n\n // don't fire an action move if a modifier would keep the event in the same\n // cordinates as before\n if (!modifierResult.shouldMove && interactingBeforeMove) {\n interaction._dontFireMove = true;\n }\n\n interaction.modifierResult = modifierResult;\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n for (let i = 0; i < modifiers.names.length; i++) {\n const options = interaction.target.options[interaction.prepared.name][modifiers.names[i]];\n\n // if the endOnly option is true for any modifier\n if (shouldDo(options, true, true)) {\n // fire a move event at the modified coordinates\n interaction.doMove({ event, preEnd: true });\n break;\n }\n }\n});\n\nInteractEvent.signals.on('set-xy', function (arg) {\n const { iEvent, interaction } = arg;\n const modifierArg = extend({}, arg);\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n modifierArg.options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!modifierArg.options) {\n continue;\n }\n\n const modifier = modifiers[modifierName];\n\n modifierArg.status = interaction.modifierStatuses[modifierName];\n\n iEvent[modifierName] = modifier.modifyCoords(modifierArg);\n }\n});\n\nfunction shouldDo (options, preEnd, requireEndOnly) {\n return (options && options.enabled\n && (preEnd || !options.endOnly)\n && (!requireEndOnly || options.endOnly));\n}\n\nmodule.exports = modifiers;\n","const modifiers = require('./index');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst restrict = {\n defaults: {\n enabled : false,\n endOnly : false,\n restriction: null,\n elementRect: null,\n },\n\n setOffset: function ({ rect, startOffset, options }) {\n const elementRect = options && options.elementRect;\n const offset = {};\n\n if (rect && elementRect) {\n offset.left = startOffset.left - (rect.width * elementRect.left);\n offset.top = startOffset.top - (rect.height * elementRect.top);\n\n offset.right = startOffset.right - (rect.width * (1 - elementRect.right));\n offset.bottom = startOffset.bottom - (rect.height * (1 - elementRect.bottom));\n }\n else {\n offset.left = offset.top = offset.right = offset.bottom = 0;\n }\n\n return offset;\n },\n\n set: function ({ pageCoords, interaction, status, options }) {\n if (!options) { return status; }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n\n const restriction = getRestrictionRect(options.restriction, interaction, page);\n\n if (!restriction) { return status; }\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n const rect = restriction;\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n const offset = interaction.modifierOffsets.restrict;\n\n // object is assumed to have\n // x, y, width, height or\n // left, top, right, bottom\n if ('x' in restriction && 'y' in restriction) {\n modifiedX = Math.max(Math.min(rect.x + rect.width - offset.right , page.x), rect.x + offset.left);\n modifiedY = Math.max(Math.min(rect.y + rect.height - offset.bottom, page.y), rect.y + offset.top );\n }\n else {\n modifiedX = Math.max(Math.min(rect.right - offset.right , page.x), rect.left + offset.left);\n modifiedY = Math.max(Math.min(rect.bottom - offset.bottom, page.y), rect.top + offset.top );\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const elementRect = options && options.elementRect;\n\n if (options && options.enabled\n && !(phase === 'start' && elementRect && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n getRestrictionRect,\n};\n\nfunction getRestrictionRect (value, interaction, page) {\n if (utils.is.function(value)) {\n return utils.resolveRectLike(value, interaction.target, interaction.element, [page.x, page.y, interaction]);\n } else {\n return utils.resolveRectLike(value, interaction.target, interaction.element);\n }\n}\n\nmodifiers.restrict = restrict;\nmodifiers.names.push('restrict');\n\ndefaultOptions.perAction.restrict = restrict.defaults;\n\nmodule.exports = restrict;\n","// This module adds the options.resize.restrictEdges setting which sets min and\n// max for the top, left, bottom and right edges of the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictEdges: {\n// inner: { top: 200, left: 200, right: 400, bottom: 400 },\n// outer: { top: 0, left: 0, right: 600, bottom: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst { getRestrictionRect } = require('./restrict');\n\nconst noInner = { top: +Infinity, left: +Infinity, bottom: -Infinity, right: -Infinity };\nconst noOuter = { top: -Infinity, left: -Infinity, bottom: +Infinity, right: +Infinity };\n\nconst restrictEdges = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n offset: null,\n },\n\n setOffset: function ({ interaction, startOffset, options }) {\n if (!options) {\n return utils.extend({}, startOffset);\n }\n\n const offset = getRestrictionRect(options.offset, interaction, interaction.startCoords.page);\n\n if (offset) {\n return {\n top: startOffset.top + offset.y,\n left: startOffset.left + offset.x,\n bottom: startOffset.bottom + offset.y,\n right: startOffset.right + offset.x,\n };\n }\n\n return startOffset;\n },\n\n set: function ({ pageCoords, interaction, status, offset, options }) {\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n const inner = rectUtils.xywhToTlbr(getRestrictionRect(options.inner, interaction, page)) || noInner;\n const outer = rectUtils.xywhToTlbr(getRestrictionRect(options.outer, interaction, page)) || noOuter;\n\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n if (edges.top) {\n modifiedY = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top);\n }\n else if (edges.bottom) {\n modifiedY = Math.max(Math.min(outer.bottom - offset.bottom, page.y), inner.bottom - offset.bottom);\n }\n if (edges.left) {\n modifiedX = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left);\n }\n else if (edges.right) {\n modifiedX = Math.max(Math.min(outer.right - offset.right, page.x), inner.right - offset.right);\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n if (options && options.enabled\n && !(phase === 'start' && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n noInner,\n noOuter,\n getRestrictionRect,\n};\n\nmodifiers.restrictEdges = restrictEdges;\nmodifiers.names.push('restrictEdges');\n\ndefaultOptions.perAction.restrictEdges = restrictEdges.defaults;\nresize.defaults.restrictEdges = restrictEdges.defaults;\n\nmodule.exports = restrictEdges;\n","// This module adds the options.resize.restrictSize setting which sets min and\n// max width and height for the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictSize: {\n// min: { width: -600, height: -600 },\n// max: { width: 600, height: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst restrictEdges = require('./restrictEdges');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst noMin = { width: -Infinity, height: -Infinity };\nconst noMax = { width: +Infinity, height: +Infinity };\n\nconst restrictSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n },\n\n setOffset: function ({ interaction }) {\n return interaction.startOffset;\n },\n\n set: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const rect = rectUtils.xywhToTlbr(interaction.resizeRects.inverted);\n\n const minSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.min, interaction)) || noMin;\n const maxSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.max, interaction)) || noMax;\n\n arg.options = {\n enabled: options.enabled,\n endOnly: options.endOnly,\n inner: utils.extend({}, restrictEdges.noInner),\n outer: utils.extend({}, restrictEdges.noOuter),\n };\n\n if (edges.top) {\n arg.options.inner.top = rect.bottom - minSize.height;\n arg.options.outer.top = rect.bottom - maxSize.height;\n }\n else if (edges.bottom) {\n arg.options.inner.bottom = rect.top + minSize.height;\n arg.options.outer.bottom = rect.top + maxSize.height;\n }\n if (edges.left) {\n arg.options.inner.left = rect.right - minSize.width;\n arg.options.outer.left = rect.right - maxSize.width;\n }\n else if (edges.right) {\n arg.options.inner.right = rect.left + minSize.width;\n arg.options.outer.right = rect.left + maxSize.width;\n }\n\n restrictEdges.set(arg);\n },\n\n modifyCoords: restrictEdges.modifyCoords,\n};\n\nmodifiers.restrictSize = restrictSize;\nmodifiers.names.push('restrictSize');\n\ndefaultOptions.perAction.restrictSize = restrictSize.defaults;\nresize.defaults.restrictSize = restrictSize.defaults;\n\nmodule.exports = restrictSize;\n","const modifiers = require('./index');\nconst interact = require('../interact');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst snap = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n\n relativePoints: null,\n },\n\n setOffset: function ({ interaction, interactable, element, rect, startOffset, options }) {\n const offsets = [];\n const optionsOrigin = utils.rectToXY(utils.resolveRectLike(options.origin));\n const origin = optionsOrigin || utils.getOriginXY(interactable, element, interaction.prepared.name);\n options = options || interactable.options[interaction.prepared.name].snap || {};\n\n let snapOffset;\n\n if (options.offset === 'startCoords') {\n snapOffset = {\n x: interaction.startCoords.page.x - origin.x,\n y: interaction.startCoords.page.y - origin.y,\n };\n }\n else {\n const offsetRect = utils.resolveRectLike(options.offset, interactable, element, [interaction]);\n\n snapOffset = utils.rectToXY(offsetRect) || { x: 0, y: 0 };\n }\n\n if (rect && options.relativePoints && options.relativePoints.length) {\n for (const { x: relativeX, y: relativeY } of options.relativePoints) {\n offsets.push({\n x: startOffset.left - (rect.width * relativeX) + snapOffset.x,\n y: startOffset.top - (rect.height * relativeY) + snapOffset.y,\n });\n }\n }\n else {\n offsets.push(snapOffset);\n }\n\n return offsets;\n },\n\n set: function ({ interaction, pageCoords, status, options, offset: offsets }) {\n const targets = [];\n let target;\n let page;\n let i;\n\n if (status.useStatusXY) {\n page = { x: status.x, y: status.y };\n }\n else {\n const origin = utils.getOriginXY(interaction.target, interaction.element, interaction.prepared.name);\n\n page = utils.extend({}, pageCoords);\n\n page.x -= origin.x;\n page.y -= origin.y;\n }\n\n status.realX = page.x;\n status.realY = page.y;\n\n let len = options.targets? options.targets.length : 0;\n\n for (const { x: offsetX, y: offsetY } of offsets) {\n const relativeX = page.x - offsetX;\n const relativeY = page.y - offsetY;\n\n for (const snapTarget of options.targets) {\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n targets.push({\n x: utils.is.number(target.x) ? (target.x + offsetX) : relativeX,\n y: utils.is.number(target.y) ? (target.y + offsetY) : relativeY,\n\n range: utils.is.number(target.range)? target.range: options.range,\n });\n }\n }\n\n const closest = {\n target: null,\n inRange: false,\n distance: 0,\n range: 0,\n dx: 0,\n dy: 0,\n };\n\n for (i = 0, len = targets.length; i < len; i++) {\n target = targets[i];\n\n const range = target.range;\n const dx = target.x - page.x;\n const dy = target.y - page.y;\n const distance = utils.hypot(dx, dy);\n let inRange = distance <= range;\n\n // Infinite targets count as being out of range\n // compared to non infinite ones that are in range\n if (range === Infinity && closest.inRange && closest.range !== Infinity) {\n inRange = false;\n }\n\n if (!closest.target || (inRange\n // is the closest target in range?\n ? (closest.inRange && range !== Infinity\n // the pointer is relatively deeper in this target\n ? distance / range < closest.distance / closest.range\n // this target has Infinite range and the closest doesn't\n : (range === Infinity && closest.range !== Infinity)\n // OR this target is closer that the previous closest\n || distance < closest.distance)\n // The other is not in range and the pointer is closer to this target\n : (!closest.inRange && distance < closest.distance))) {\n\n closest.target = target;\n closest.distance = distance;\n closest.range = range;\n closest.inRange = inRange;\n closest.dx = dx;\n closest.dy = dy;\n\n status.range = range;\n }\n }\n\n let snapChanged;\n\n if (closest.target) {\n snapChanged = (status.modifiedX !== closest.target.x || status.modifiedY !== closest.target.y);\n\n status.modifiedX = closest.target.x;\n status.modifiedY = closest.target.y;\n }\n else {\n snapChanged = true;\n\n status.modifiedX = NaN;\n status.modifiedY = NaN;\n }\n\n status.dx = closest.dx;\n status.dy = closest.dy;\n\n status.changed = (snapChanged || (closest.inRange && !status.locked));\n status.locked = closest.inRange;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const relativePoints = options && options.relativePoints;\n\n if (options && options.enabled\n && !(phase === 'start' && relativePoints && relativePoints.length)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n }\n\n return {\n range : status.range,\n locked : status.locked,\n x : status.modifiedX,\n y : status.modifiedY,\n realX : status.realX,\n realY : status.realY,\n dx : status.dx,\n dy : status.dy,\n };\n }\n },\n};\n\ninteract.createSnapGrid = function (grid) {\n return function (x, y) {\n const limits = grid.limits || {\n left : -Infinity,\n right : Infinity,\n top : -Infinity,\n bottom: Infinity,\n };\n let offsetX = 0;\n let offsetY = 0;\n\n if (utils.is.object(grid.offset)) {\n offsetX = grid.offset.x;\n offsetY = grid.offset.y;\n }\n\n const gridx = Math.round((x - offsetX) / grid.x);\n const gridy = Math.round((y - offsetY) / grid.y);\n\n const newX = Math.max(limits.left, Math.min(limits.right , gridx * grid.x + offsetX));\n const newY = Math.max(limits.top , Math.min(limits.bottom, gridy * grid.y + offsetY));\n\n return {\n x: newX,\n y: newY,\n range: grid.range,\n };\n };\n};\n\nmodifiers.snap = snap;\nmodifiers.names.push('snap');\n\ndefaultOptions.perAction.snap = snap.defaults;\n\nmodule.exports = snap;\n","// This module allows snapping of the size of targets during resize\n// interactions.\n\nconst modifiers = require('./index');\nconst snap = require('./snap');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\nconst utils = require('../utils/');\n\nconst snapSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n },\n\n setOffset: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.edges;\n\n if (!edges) { return; }\n\n arg.options = {\n relativePoints: [{\n x: edges.left? 0 : 1,\n y: edges.top ? 0 : 1,\n }],\n origin: { x: 0, y: 0 },\n offset: 'self',\n range: options.range,\n };\n\n const offsets = snap.setOffset(arg);\n arg.options = options;\n\n return offsets;\n },\n\n set: function (arg) {\n const { interaction, options, offset, pageCoords } = arg;\n const page = utils.extend({}, pageCoords);\n const relativeX = page.x - offset[0].x;\n const relativeY = page.y - offset[0].y;\n\n arg.options = utils.extend({}, options);\n arg.options.targets = [];\n\n for (const snapTarget of options.targets) {\n let target;\n\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n if ('width' in target && 'height' in target) {\n target.x = target.width;\n target.y = target.height;\n }\n\n arg.options.targets.push(target);\n }\n\n snap.set(arg);\n },\n\n modifyCoords: function (arg) {\n const { options } = arg;\n\n arg.options = utils.extend({}, options);\n arg.options.enabled = options.enabled;\n arg.options.relativePoints = [null];\n\n snap.modifyCoords(arg);\n },\n};\n\nmodifiers.snapSize = snapSize;\nmodifiers.names.push('snapSize');\n\ndefaultOptions.perAction.snapSize = snapSize.defaults;\nresize.defaults.snapSize = snapSize.defaults;\n\nmodule.exports = snapSize;\n","const pointerUtils = require('../utils/pointerUtils');\n\nmodule.exports = class PointerEvent {\n constructor (type, pointer, event, eventTarget, interaction) {\n pointerUtils.pointerExtend(this, event);\n\n if (event !== pointer) {\n pointerUtils.pointerExtend(this, pointer);\n }\n\n this.interaction = interaction;\n\n this.timeStamp = new Date().getTime();\n this.originalEvent = event;\n this.type = type;\n this.pointerId = pointerUtils.getPointerId(pointer);\n this.pointerType = pointerUtils.getPointerType(pointer, interaction);\n this.target = eventTarget;\n this.currentTarget = null;\n\n if (type === 'tap') {\n const pointerIndex = interaction.getPointerIndex(pointer);\n this.dt = this.timeStamp - interaction.downTimes[pointerIndex];\n\n const interval = this.timeStamp - interaction.tapTime;\n\n this.double = !!(interaction.prevTap\n && interaction.prevTap.type !== 'doubletap'\n && interaction.prevTap.target === this.target\n && interval < 500);\n }\n else if (type === 'doubletap') {\n this.dt = pointer.timeStamp - interaction.tapTime;\n }\n }\n\n subtractOrigin ({ x: originX, y: originY }) {\n this.pageX -= originX;\n this.pageY -= originY;\n this.clientX -= originX;\n this.clientY -= originY;\n\n return this;\n }\n\n addOrigin ({ x: originX, y: originY }) {\n this.pageX += originX;\n this.pageY += originY;\n this.clientX += originX;\n this.clientY += originY;\n\n return this;\n }\n\n preventDefault () {\n this.originalEvent.preventDefault();\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n};\n","const PointerEvent = require('./PointerEvent');\nconst Interaction = require('../Interaction');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst defaults = require('../defaultOptions');\nconst signals = require('../utils/Signals').new();\nconst { filter } = require('../utils/arr');\n\nconst simpleSignals = [ 'down', 'up', 'cancel' ];\nconst simpleEvents = [ 'down', 'up', 'cancel' ];\n\nconst pointerEvents = {\n PointerEvent,\n fire,\n collectEventTargets,\n signals,\n defaults: {\n holdDuration: 600,\n ignoreFrom : null,\n allowFrom : null,\n origin : { x: 0, y: 0 },\n },\n types: [\n 'down',\n 'move',\n 'up',\n 'cancel',\n 'tap',\n 'doubletap',\n 'hold',\n ],\n};\n\nfunction fire (arg) {\n const {\n interaction, pointer, event, eventTarget,\n type = arg.pointerEvent.type,\n targets = collectEventTargets(arg),\n pointerEvent = new PointerEvent(type, pointer, event, eventTarget, interaction),\n } = arg;\n\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n targets,\n type,\n pointerEvent,\n };\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n\n for (const prop in target.props || {}) {\n pointerEvent[prop] = target.props[prop];\n }\n\n const origin = utils.getOriginXY(target.eventable, target.element);\n\n pointerEvent.subtractOrigin(origin);\n pointerEvent.eventable = target.eventable;\n pointerEvent.currentTarget = target.element;\n\n target.eventable.fire(pointerEvent);\n\n pointerEvent.addOrigin(origin);\n\n if (pointerEvent.immediatePropagationStopped\n || (pointerEvent.propagationStopped\n && (i + 1) < targets.length && targets[i + 1].element !== pointerEvent.currentTarget)) {\n break;\n }\n }\n\n signals.fire('fired', signalArg);\n\n if (type === 'tap') {\n // if pointerEvent should make a double tap, create and fire a doubletap\n // PointerEvent and use that as the prevTap\n const prevTap = pointerEvent.double\n ? fire({\n interaction, pointer, event, eventTarget,\n type: 'doubletap',\n })\n : pointerEvent;\n\n interaction.prevTap = prevTap;\n interaction.tapTime = prevTap.timeStamp;\n }\n\n return pointerEvent;\n}\n\nfunction collectEventTargets ({ interaction, pointer, event, eventTarget, type }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n // do not fire a tap event if the pointer was moved before being lifted\n if (type === 'tap' && (interaction.pointerWasMoved\n // or if the pointerup target is different to the pointerdown target\n || !(interaction.downTargets[pointerIndex] && interaction.downTargets[pointerIndex] === eventTarget))) {\n return [];\n }\n\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n path,\n targets: [],\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (type === 'hold') {\n signalArg.targets = filter(signalArg.targets, target =>\n target.eventable.options.holdDuration === interaction.holdTimers[pointerIndex].duration);\n }\n\n return signalArg.targets;\n}\n\nInteraction.signals.on('update-pointer-down', function ({ interaction, pointerIndex }) {\n interaction.holdTimers[pointerIndex] = { duration: Infinity, timeout: null };\n});\n\nInteraction.signals.on('remove-pointer', function ({ interaction, pointerIndex }) {\n interaction.holdTimers.splice(pointerIndex, 1);\n});\n\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget, duplicateMove }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n if (!duplicateMove && (!interaction.pointerIsDown || interaction.pointerWasMoved)) {\n if (interaction.pointerIsDown) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n\n fire({\n interaction, pointer, event, eventTarget,\n type: 'move',\n });\n }\n});\n\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget, pointerIndex }) {\n // copy event to be used in timeout for IE8\n const eventCopy = browser.isIE8? utils.extend({}, event) : event;\n\n const timer = interaction.holdTimers[pointerIndex];\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'hold',\n targets: [],\n path,\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (!signalArg.targets.length) { return; }\n\n let minDuration = Infinity;\n\n for (let i = 0; i < signalArg.targets.length; i++) {\n const target = signalArg.targets[i];\n const holdDuration = target.eventable.options.holdDuration;\n\n if (holdDuration < minDuration) {\n minDuration = holdDuration;\n }\n }\n\n timer.duration = minDuration;\n timer.timeout = setTimeout(function () {\n fire({\n interaction, eventCopy, eventTarget,\n pointer: browser.isIE8? eventCopy : pointer,\n type: 'hold',\n });\n }, minDuration);\n});\n\nInteraction.signals.on('up', ({ interaction, pointer, event, eventTarget }) => {\n if (!interaction.pointerWasMoved) {\n fire({ interaction, eventTarget, pointer, event, type: 'tap' });\n }\n});\n\n['up', 'cancel'].forEach(function (signalName) {\n Interaction.signals.on(signalName, function ({ interaction, pointerIndex }) {\n if (interaction.holdTimers[pointerIndex]) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n });\n});\n\nfunction createSignalListener (type) {\n return function ({ interaction, pointer, event, eventTarget }) {\n fire({ interaction, eventTarget, pointer, event, type });\n };\n}\n\nfor (let i = 0; i < simpleSignals.length; i++) {\n Interaction.signals.on(simpleSignals[i], createSignalListener(simpleEvents[i]));\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.prevTap = null; // the most recent tap event on this interaction\n interaction.tapTime = 0; // time of the most recent tap event\n interaction.holdTimers = []; // [{ duration, timeout }]\n});\n\ndefaults.pointerEvents = pointerEvents.defaults;\nmodule.exports = pointerEvents;\n","const pointerEvents = require('./base');\nconst Interaction = require('../Interaction');\n\npointerEvents.signals.on('new', onNew);\npointerEvents.signals.on('fired', onFired);\n\nfor (const signal of ['move', 'up', 'cancel', 'endall']) {\n Interaction.signals.on(signal, endHoldRepeat);\n}\n\nfunction onNew ({ pointerEvent }) {\n if (pointerEvent.type !== 'hold') { return; }\n\n pointerEvent.count = (pointerEvent.count || 0) + 1;\n}\n\nfunction onFired ({ interaction, pointerEvent, eventTarget, targets }) {\n if (pointerEvent.type !== 'hold' || !targets.length) { return; }\n\n // get the repeat interval from the first eventable\n const interval = targets[0].eventable.options.holdRepeatInterval;\n\n // don't repeat if the interval is 0 or less\n if (interval <= 0) { return; }\n\n // set a timeout to fire the holdrepeat event\n interaction.holdIntervalHandle = setTimeout(function () {\n pointerEvents.fire({\n interaction,\n eventTarget,\n type: 'hold',\n pointer: pointerEvent,\n event: pointerEvent,\n });\n }, interval);\n}\n\nfunction endHoldRepeat ({ interaction }) {\n // set the interaction's holdStopTime property\n // to stop further holdRepeat events\n if (interaction.holdIntervalHandle) {\n clearInterval(interaction.holdIntervalHandle);\n interaction.holdIntervalHandle = null;\n }\n}\n\n// don't repeat by default\npointerEvents.defaults.holdRepeatInterval = 0;\npointerEvents.types.push('holdrepeat');\n\nmodule.exports = {\n onNew,\n onFired,\n endHoldRepeat,\n};\n","const pointerEvents = require('./base');\nconst Interactable = require('../Interactable');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\nconst scope = require('../scope');\nconst extend = require('../utils/extend');\nconst { merge } = require('../utils/arr');\n\npointerEvents.signals.on('collect-targets', function ({ targets, element, type, eventTarget }) {\n function collectSelectors (interactable, selector, context) {\n const els = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && is.element(element)\n && domUtils.matchesSelector(element, selector, els)\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n const interactable = scope.interactables.get(element);\n\n if (interactable) {\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n scope.interactables.forEachSelector(collectSelectors, element);\n});\n\nInteractable.signals.on('new', function ({ interactable }) {\n interactable.events.getRect = function (element) {\n return interactable.getRect(element);\n };\n});\n\nInteractable.signals.on('set', function ({ interactable, options }) {\n extend(interactable.events.options, pointerEvents.defaults);\n extend(interactable.events.options, options);\n});\n\nmerge(Interactable.eventTypes, pointerEvents.types);\n\nInteractable.prototype.pointerEvents = function (options) {\n extend(this.events.options, options);\n\n return this;\n};\n\nconst __backCompatOption = Interactable.prototype._backCompatOption;\n\nInteractable.prototype._backCompatOption = function (optionName, newValue) {\n const ret = __backCompatOption.call(this, optionName, newValue);\n\n if (ret === this) {\n this.events.options[optionName] = newValue;\n }\n\n return ret;\n};\n\nInteractable.settingsMethods.push('pointerEvents');\n","const utils = require('./utils');\nconst events = require('./utils/events');\nconst signals = require('./utils/Signals').new();\n\nconst scope = {\n signals,\n events,\n utils,\n\n // main document\n document: require('./utils/domObjects').document,\n // all documents being listened to\n documents: [],\n\n addDocument: function (doc, win) {\n // do nothing if document is already known\n if (utils.contains(scope.documents, doc)) { return false; }\n\n win = win || scope.getWindow(doc);\n\n scope.documents.push(doc);\n events.documents.push(doc);\n\n // don't add an unload event for the main document\n // so that the page may be cached in browser history\n if (doc !== scope.document) {\n events.add(win, 'unload', scope.onWindowUnload);\n }\n\n signals.fire('add-document', { doc, win });\n },\n\n removeDocument: function (doc, win) {\n const index = utils.indexOf(scope.documents, doc);\n\n win = win || scope.getWindow(doc);\n\n events.remove(win, 'unload', scope.onWindowUnload);\n\n scope.documents.splice(index, 1);\n events.documents.splice(index, 1);\n\n signals.fire('remove-document', { win, doc });\n },\n\n onWindowUnload: function () {\n scope.removeDocument(this.document, this);\n },\n};\n\nmodule.exports = scope;\n","const { indexOf } = require('./arr');\n\nclass Signals {\n constructor () {\n this.listeners = {\n // signalName: [listeners],\n };\n }\n\n on (name, listener) {\n if (!this.listeners[name]) {\n this.listeners[name] = [listener];\n return;\n }\n\n this.listeners[name].push(listener);\n }\n\n off (name, listener) {\n if (!this.listeners[name]) { return; }\n\n const index = indexOf(this.listeners[name], listener);\n\n if (index !== -1) {\n this.listeners[name].splice(index, 1);\n }\n }\n\n fire (name, arg) {\n const targetListeners = this.listeners[name];\n\n if (!targetListeners) { return; }\n\n for (let i = 0; i < targetListeners.length; i++) {\n if (targetListeners[i](arg, name) === false) {\n return;\n }\n }\n }\n}\n\nSignals.new = function () {\n return new Signals();\n};\n\nmodule.exports = Signals;\n","function indexOf (array, target) {\n for (let i = 0, len = array.length; i < len; i++) {\n if (array[i] === target) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction contains (array, target) {\n return indexOf(array, target) !== -1;\n}\n\nfunction merge (target, source) {\n for (let i = 0; i < source.length; i++) {\n target.push(source[i]);\n }\n\n return target;\n}\n\nfunction filter (array, test) {\n const result = [];\n\n for (let i = 0; i < array.length; i++) {\n if (test(array[i])) {\n result.push(array[i]);\n }\n }\n\n return result;\n}\n\nmodule.exports = {\n indexOf,\n contains,\n merge,\n filter,\n};\n","const { window } = require('./window');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst Element = domObjects.Element;\nconst navigator = window.navigator;\n\nconst browser = {\n // Does the browser support touch input?\n supportsTouch: !!(('ontouchstart' in window) || is.function(window.DocumentTouch)\n && domObjects.document instanceof window.DocumentTouch),\n\n // Does the browser support PointerEvents\n supportsPointerEvent: !!domObjects.PointerEvent,\n\n isIE8: ('attachEvent' in window) && !('addEventListener' in window),\n\n // Opera Mobile must be handled differently\n isOperaMobile: (navigator.appName === 'Opera'\n && browser.supportsTouch\n && navigator.userAgent.match('Presto')),\n\n // scrolling doesn't change the result of getClientRects on iOS 7\n isIOS7: (/iP(hone|od|ad)/.test(navigator.platform)\n && /OS 7[^\\d]/.test(navigator.appVersion)),\n\n isIe9OrOlder: /MSIE (8|9)/.test(navigator.userAgent),\n\n // prefix matchesSelector\n prefixedMatchesSelector: 'matches' in Element.prototype\n ? 'matches': 'webkitMatchesSelector' in Element.prototype\n ? 'webkitMatchesSelector': 'mozMatchesSelector' in Element.prototype\n ? 'mozMatchesSelector': 'oMatchesSelector' in Element.prototype\n ? 'oMatchesSelector': 'msMatchesSelector',\n\n useMatchesSelectorPolyfill: false,\n\n pEventTypes: (domObjects.PointerEvent\n ? (domObjects.PointerEvent === window.MSPointerEvent\n ? {\n up: 'MSPointerUp',\n down: 'MSPointerDown',\n over: 'mouseover',\n out: 'mouseout',\n move: 'MSPointerMove',\n cancel: 'MSPointerCancel',\n }\n : {\n up: 'pointerup',\n down: 'pointerdown',\n over: 'pointerover',\n out: 'pointerout',\n move: 'pointermove',\n cancel: 'pointercancel',\n })\n : null),\n\n // because Webkit and Opera still use 'mousewheel' event type\n wheelEvent: 'onmousewheel' in domObjects.document? 'mousewheel': 'wheel',\n\n};\n\nbrowser.useMatchesSelectorPolyfill = !is.function(Element.prototype[browser.prefixedMatchesSelector]);\n\nmodule.exports = browser;\n","const domObjects = {};\nconst win = require('./window').window;\n\nfunction blank () {}\n\ndomObjects.document = win.document;\ndomObjects.DocumentFragment = win.DocumentFragment || blank;\ndomObjects.SVGElement = win.SVGElement || blank;\ndomObjects.SVGSVGElement = win.SVGSVGElement || blank;\ndomObjects.SVGElementInstance = win.SVGElementInstance || blank;\ndomObjects.Element = win.Element || blank;\ndomObjects.HTMLElement = win.HTMLElement || domObjects.Element;\n\ndomObjects.Event = win.Event;\ndomObjects.Touch = win.Touch || blank;\ndomObjects.PointerEvent = (win.PointerEvent || win.MSPointerEvent);\n\nmodule.exports = domObjects;\n","const win = require('./window');\nconst browser = require('./browser');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst domUtils = {\n nodeContains: function (parent, child) {\n while (child) {\n if (child === parent) {\n return true;\n }\n\n child = child.parentNode;\n }\n\n return false;\n },\n\n closest: function (element, selector) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) { return element; }\n\n element = domUtils.parentNode(element);\n }\n\n return null;\n },\n\n parentNode: function (node) {\n let parent = node.parentNode;\n\n if (is.docFrag(parent)) {\n // skip past #shado-root fragments\n while ((parent = parent.host) && is.docFrag(parent)) {\n continue;\n }\n\n return parent;\n }\n\n return parent;\n },\n\n // taken from http://tanalin.com/en/blog/2012/12/matches-selector-ie8/ and modified\n matchesSelectorPolyfill: browser.useMatchesSelectorPolyfill\n ? function (element, selector, elems) {\n elems = elems || element.parentNode.querySelectorAll(selector);\n\n for (let i = 0, len = elems.length; i < len; i++) {\n if (elems[i] === element) {\n return true;\n }\n }\n\n return false;\n }\n : null,\n\n matchesSelector: function (element, selector, nodeList) {\n if (browser.useMatchesSelectorPolyfill) {\n return domUtils.matchesSelectorPolyfill(element, selector, nodeList);\n }\n\n // remove /deep/ from selectors if shadowDOM polyfill is used\n if (win.window !== win.realWindow) {\n selector = selector.replace(/\\/deep\\//g, ' ');\n }\n\n return element[browser.prefixedMatchesSelector](selector);\n },\n\n // Test for the element that's \"above\" all other qualifiers\n indexOfDeepestElement: function (elements) {\n let deepestZoneParents = [];\n let dropzoneParents = [];\n let dropzone;\n let deepestZone = elements[0];\n let index = deepestZone? 0: -1;\n let parent;\n let child;\n let i;\n let n;\n\n for (i = 1; i < elements.length; i++) {\n dropzone = elements[i];\n\n // an element might belong to multiple selector dropzones\n if (!dropzone || dropzone === deepestZone) {\n continue;\n }\n\n if (!deepestZone) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n // check if the deepest or current are document.documentElement or document.rootElement\n // - if the current dropzone is, do nothing and continue\n if (dropzone.parentNode === dropzone.ownerDocument) {\n continue;\n }\n // - if deepest is, update with the current dropzone and continue to next\n else if (deepestZone.parentNode === dropzone.ownerDocument) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n if (!deepestZoneParents.length) {\n parent = deepestZone;\n while (parent.parentNode && parent.parentNode !== parent.ownerDocument) {\n deepestZoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n }\n\n // if this element is an svg element and the current deepest is\n // an HTMLElement\n if (deepestZone instanceof domObjects.HTMLElement\n && dropzone instanceof domObjects.SVGElement\n && !(dropzone instanceof domObjects.SVGSVGElement)) {\n\n if (dropzone === deepestZone.parentNode) {\n continue;\n }\n\n parent = dropzone.ownerSVGElement;\n }\n else {\n parent = dropzone;\n }\n\n dropzoneParents = [];\n\n while (parent.parentNode !== parent.ownerDocument) {\n dropzoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n\n n = 0;\n\n // get (position of last common ancestor) + 1\n while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) {\n n++;\n }\n\n const parents = [\n dropzoneParents[n - 1],\n dropzoneParents[n],\n deepestZoneParents[n],\n ];\n\n child = parents[0].lastChild;\n\n while (child) {\n if (child === parents[1]) {\n deepestZone = dropzone;\n index = i;\n deepestZoneParents = [];\n\n break;\n }\n else if (child === parents[2]) {\n break;\n }\n\n child = child.previousSibling;\n }\n }\n\n return index;\n },\n\n matchesUpTo: function (element, selector, limit) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) {\n return true;\n }\n\n element = domUtils.parentNode(element);\n\n if (element === limit) {\n return domUtils.matchesSelector(element, selector);\n }\n }\n\n return false;\n },\n\n getActualElement: function (element) {\n return (element instanceof domObjects.SVGElementInstance\n ? element.correspondingUseElement\n : element);\n },\n\n getScrollXY: function (relevantWindow) {\n relevantWindow = relevantWindow || win.window;\n return {\n x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft,\n y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop,\n };\n },\n\n getElementClientRect: function (element) {\n const clientRect = (element instanceof domObjects.SVGElement\n ? element.getBoundingClientRect()\n : element.getClientRects()[0]);\n\n return clientRect && {\n left : clientRect.left,\n right : clientRect.right,\n top : clientRect.top,\n bottom: clientRect.bottom,\n width : clientRect.width || clientRect.right - clientRect.left,\n height: clientRect.height || clientRect.bottom - clientRect.top,\n };\n },\n\n getElementRect: function (element) {\n const clientRect = domUtils.getElementClientRect(element);\n\n if (!browser.isIOS7 && clientRect) {\n const scroll = domUtils.getScrollXY(win.getWindow(element));\n\n clientRect.left += scroll.x;\n clientRect.right += scroll.x;\n clientRect.top += scroll.y;\n clientRect.bottom += scroll.y;\n }\n\n return clientRect;\n },\n\n getPath: function (element) {\n const path = [];\n\n while (element) {\n path.push(element);\n element = domUtils.parentNode(element);\n }\n\n return path;\n },\n\n trySelector: value => {\n if (!is.string(value)) { return false; }\n\n // an exception will be raised if it is invalid\n domObjects.document.querySelector(value);\n return true;\n },\n};\n\nmodule.exports = domUtils;\n","const is = require('./is');\nconst domUtils = require('./domUtils');\nconst pExtend = require('./pointerExtend');\n\nconst { window, getWindow } = require('./window');\nconst { indexOf, contains } = require('./arr');\n\nconst useAttachEvent = ('attachEvent' in window) && !('addEventListener' in window);\nconst addEvent = useAttachEvent? 'attachEvent': 'addEventListener';\nconst removeEvent = useAttachEvent? 'detachEvent': 'removeEventListener';\nconst on = useAttachEvent? 'on': '';\n\nconst elements = [];\nconst targets = [];\nconst attachedListeners = [];\n\n// {\n// type: {\n// selectors: ['selector', ...],\n// contexts : [document, ...],\n// listeners: [[listener, capture, passive], ...]\n// }\n// }\nconst delegatedEvents = {};\n\nconst documents = [];\n\nconst supportsOptions = !useAttachEvent && (() => {\n let supported = false;\n\n window.document.createElement('div').addEventListener('test', null, {\n get capture () { supported = true; },\n });\n\n return supported;\n})();\n\nfunction add (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n let elementIndex = indexOf(elements, element);\n let target = targets[elementIndex];\n\n if (!target) {\n target = {\n events: {},\n typeCount: 0,\n };\n\n elementIndex = elements.push(element) - 1;\n targets.push(target);\n\n attachedListeners.push(useAttachEvent\n ? {\n supplied: [],\n wrapped : [],\n useCount: [],\n }\n : null);\n }\n\n if (!target.events[type]) {\n target.events[type] = [];\n target.typeCount++;\n }\n\n if (!contains(target.events[type], listener)) {\n let ret;\n\n if (useAttachEvent) {\n const { supplied, wrapped, useCount } = attachedListeners[elementIndex];\n const listenerIndex = indexOf(supplied, listener);\n\n const wrappedListener = wrapped[listenerIndex] || function (event) {\n if (!event.immediatePropagationStopped) {\n event.target = event.srcElement;\n event.currentTarget = element;\n\n event.preventDefault = event.preventDefault || preventDef;\n event.stopPropagation = event.stopPropagation || stopProp;\n event.stopImmediatePropagation = event.stopImmediatePropagation || stopImmProp;\n\n if (/mouse|click/.test(event.type)) {\n event.pageX = event.clientX + getWindow(element).document.documentElement.scrollLeft;\n event.pageY = event.clientY + getWindow(element).document.documentElement.scrollTop;\n }\n\n listener(event);\n }\n };\n\n ret = element[addEvent](on + type, wrappedListener, !!options.capture);\n\n if (listenerIndex === -1) {\n supplied.push(listener);\n wrapped.push(wrappedListener);\n useCount.push(1);\n }\n else {\n useCount[listenerIndex]++;\n }\n }\n else {\n ret = element[addEvent](type, listener, supportsOptions? options : !!options.capture);\n }\n target.events[type].push(listener);\n\n return ret;\n }\n}\n\nfunction remove (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const elementIndex = indexOf(elements, element);\n const target = targets[elementIndex];\n\n if (!target || !target.events) {\n return;\n }\n\n let wrappedListener = listener;\n let listeners;\n let listenerIndex;\n\n if (useAttachEvent) {\n listeners = attachedListeners[elementIndex];\n listenerIndex = indexOf(listeners.supplied, listener);\n wrappedListener = listeners.wrapped[listenerIndex];\n }\n\n if (type === 'all') {\n for (type in target.events) {\n if (target.events.hasOwnProperty(type)) {\n remove(element, type, 'all');\n }\n }\n return;\n }\n\n if (target.events[type]) {\n const len = target.events[type].length;\n\n if (listener === 'all') {\n for (let i = 0; i < len; i++) {\n remove(element, type, target.events[type][i], options);\n }\n return;\n }\n else {\n for (let i = 0; i < len; i++) {\n if (target.events[type][i] === listener) {\n element[removeEvent](on + type, wrappedListener, supportsOptions? options : !!options.capture);\n target.events[type].splice(i, 1);\n\n if (useAttachEvent && listeners) {\n listeners.useCount[listenerIndex]--;\n if (listeners.useCount[listenerIndex] === 0) {\n listeners.supplied.splice(listenerIndex, 1);\n listeners.wrapped.splice(listenerIndex, 1);\n listeners.useCount.splice(listenerIndex, 1);\n }\n }\n\n break;\n }\n }\n }\n\n if (target.events[type] && target.events[type].length === 0) {\n target.events[type] = null;\n target.typeCount--;\n }\n }\n\n if (!target.typeCount) {\n targets.splice(elementIndex, 1);\n elements.splice(elementIndex, 1);\n attachedListeners.splice(elementIndex, 1);\n }\n}\n\nfunction addDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n if (!delegatedEvents[type]) {\n delegatedEvents[type] = {\n selectors: [],\n contexts : [],\n listeners: [],\n };\n\n // add delegate listener functions\n for (let i = 0; i < documents.length; i++) {\n add(documents[i], type, delegateListener);\n add(documents[i], type, delegateUseCapture, true);\n }\n }\n\n const delegated = delegatedEvents[type];\n let index;\n\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n break;\n }\n }\n\n if (index === -1) {\n index = delegated.selectors.length;\n\n delegated.selectors.push(selector);\n delegated.contexts .push(context);\n delegated.listeners.push([]);\n }\n\n // keep listener and capture and passive flags\n delegated.listeners[index].push([listener, !!options.capture, options.passive]);\n}\n\nfunction removeDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const delegated = delegatedEvents[type];\n let matchFound = false;\n let index;\n\n if (!delegated) { return; }\n\n // count from last index of delegated to 0\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n // look for matching selector and context Node\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n\n const listeners = delegated.listeners[index];\n\n // each item of the listeners array is an array: [function, capture, passive]\n for (let i = listeners.length - 1; i >= 0; i--) {\n const [fn, capture, passive] = listeners[i];\n\n // check if the listener functions and capture and passive flags match\n if (fn === listener && capture === !!options.capture && passive === options.passive) {\n // remove the listener from the array of listeners\n listeners.splice(i, 1);\n\n // if all listeners for this interactable have been removed\n // remove the interactable from the delegated arrays\n if (!listeners.length) {\n delegated.selectors.splice(index, 1);\n delegated.contexts .splice(index, 1);\n delegated.listeners.splice(index, 1);\n\n // remove delegate function from context\n remove(context, type, delegateListener);\n remove(context, type, delegateUseCapture, true);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegatedEvents[type] = null;\n }\n }\n\n // only remove one listener\n matchFound = true;\n break;\n }\n }\n\n if (matchFound) { break; }\n }\n }\n}\n\n// bound to the interactable context when a DOM event\n// listener is added to a selector interactable\nfunction delegateListener (event, optionalArg) {\n const options = getOptions(optionalArg);\n const fakeEvent = {};\n const delegated = delegatedEvents[event.type];\n const eventTarget = (domUtils.getActualElement(event.path\n ? event.path[0]\n : event.target));\n let element = eventTarget;\n\n // duplicate the event so that currentTarget can be changed\n pExtend(fakeEvent, event);\n\n fakeEvent.originalEvent = event;\n fakeEvent.preventDefault = preventOriginalDefault;\n\n // climb up document tree looking for selector matches\n while (is.element(element)) {\n for (let i = 0; i < delegated.selectors.length; i++) {\n const selector = delegated.selectors[i];\n const context = delegated.contexts[i];\n\n if (domUtils.matchesSelector(element, selector)\n && domUtils.nodeContains(context, eventTarget)\n && domUtils.nodeContains(context, element)) {\n\n const listeners = delegated.listeners[i];\n\n fakeEvent.currentTarget = element;\n\n for (let j = 0; j < listeners.length; j++) {\n const [fn, capture, passive] = listeners[j];\n\n if (capture === !!options.capture && passive === options.passive) {\n fn(fakeEvent);\n }\n }\n }\n }\n\n element = domUtils.parentNode(element);\n }\n}\n\nfunction delegateUseCapture (event) {\n return delegateListener.call(this, event, true);\n}\n\nfunction preventDef () {\n this.returnValue = false;\n}\n\nfunction preventOriginalDefault () {\n this.originalEvent.preventDefault();\n}\n\nfunction stopProp () {\n this.cancelBubble = true;\n}\n\nfunction stopImmProp () {\n this.cancelBubble = true;\n this.immediatePropagationStopped = true;\n}\n\nfunction getOptions (param) {\n return is.object(param)? param : { capture: param };\n}\n\nmodule.exports = {\n add,\n remove,\n\n addDelegate,\n removeDelegate,\n\n delegateListener,\n delegateUseCapture,\n delegatedEvents,\n documents,\n\n useAttachEvent,\n supportsOptions,\n\n _elements: elements,\n _targets: targets,\n _attachedListeners: attachedListeners,\n};\n","module.exports = function extend (dest, source) {\n for (const prop in source) {\n dest[prop] = source[prop];\n }\n return dest;\n};\n","const {\n resolveRectLike,\n rectToXY,\n} = require('./rect');\n\nmodule.exports = function (target, element, action) {\n const actionOptions = target.options[action];\n const actionOrigin = actionOptions && actionOptions.origin;\n const origin = actionOrigin || target.options.origin;\n\n const originRect = resolveRectLike(origin, target, element, [target && element]);\n\n return rectToXY(originRect) || { x: 0, y: 0 };\n};\n","module.exports = (x, y) => Math.sqrt(x * x + y * y);\n","const extend = require('./extend');\nconst win = require('./window');\n\nconst utils = {\n warnOnce: function (method, message) {\n let warned = false;\n\n return function () {\n if (!warned) {\n win.window.console.warn(message);\n warned = true;\n }\n\n return method.apply(this, arguments);\n };\n },\n\n // http://stackoverflow.com/a/5634528/2280888\n _getQBezierValue: function (t, p1, p2, p3) {\n const iT = 1 - t;\n return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3;\n },\n\n getQuadraticCurvePoint: function (startX, startY, cpX, cpY, endX, endY, position) {\n return {\n x: utils._getQBezierValue(position, startX, cpX, endX),\n y: utils._getQBezierValue(position, startY, cpY, endY),\n };\n },\n\n // http://gizma.com/easing/\n easeOutQuad: function (t, b, c, d) {\n t /= d;\n return -c * t*(t-2) + b;\n },\n\n copyAction: function (dest, src) {\n dest.name = src.name;\n dest.axis = src.axis;\n dest.edges = src.edges;\n\n return dest;\n },\n\n is : require('./is'),\n extend : extend,\n hypot : require('./hypot'),\n getOriginXY: require('./getOriginXY'),\n};\n\nextend(utils, require('./arr'));\nextend(utils, require('./domUtils'));\nextend(utils, require('./pointerUtils'));\nextend(utils, require('./rect'));\n\nmodule.exports = utils;\n","const scope = require('../scope');\nconst utils = require('./index');\nconst browser = require('./browser');\n\nconst finder = {\n methodOrder: [ 'simulationResume', 'mouse', 'hasPointer', 'idle' ],\n\n search: function (pointer, eventType, eventTarget) {\n const mouseEvent = (/mouse/i.test(pointer.pointerType || eventType)\n // MSPointerEvent.MSPOINTER_TYPE_MOUSE\n || pointer.pointerType === 4);\n const pointerId = utils.getPointerId(pointer);\n const details = { pointer, pointerId, mouseEvent, eventType, eventTarget };\n\n for (const method of finder.methodOrder) {\n const interaction = finder[method](details);\n\n if (interaction) {\n return interaction;\n }\n }\n },\n\n // try to resume simulation with a new pointer\n simulationResume: function ({ mouseEvent, eventType, eventTarget }) {\n if (!/down|start/i.test(eventType)) {\n return null;\n }\n\n for (const interaction of scope.interactions) {\n let element = eventTarget;\n\n if (interaction.simulation && interaction.simulation.allowResume\n && (interaction.mouse === mouseEvent)) {\n while (element) {\n // if the element is the interaction element\n if (element === interaction.element) {\n return interaction;\n }\n element = utils.parentNode(element);\n }\n }\n }\n\n return null;\n },\n\n // if it's a mouse interaction\n mouse: function ({ pointerId, mouseEvent, eventType }) {\n if (!mouseEvent && (browser.supportsTouch || browser.supportsPointerEvent)) {\n return null;\n }\n\n let firstNonActive;\n\n for (const interaction of scope.interactions) {\n if (interaction.mouse) {\n // if it's a down event, skip interactions with running simulations\n if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; }\n\n // if the interaction is active, return it immediately\n if (interaction.interacting()) {\n return interaction;\n }\n // otherwise save it and look for another active interaction\n else if (!firstNonActive) {\n firstNonActive = interaction;\n }\n }\n }\n\n // if no active mouse interaction was found use the first inactive mouse\n // interaction\n if (firstNonActive) {\n return firstNonActive;\n }\n\n // Find any interaction specifically for mouse.\n // ignore the interaction if the eventType is a mousedown, and a simulation\n // is active\n for (const interaction of scope.interactions) {\n if (interaction.mouse && !(/down/.test(eventType) && interaction.simulation)) {\n return interaction;\n }\n }\n\n return null;\n },\n\n // get interaction that has this pointer\n hasPointer: function ({ pointerId }) {\n for (const interaction of scope.interactions) {\n if (utils.contains(interaction.pointerIds, pointerId)) {\n return interaction;\n }\n }\n },\n\n // get first idle interaction\n idle: function ({ mouseEvent }) {\n for (const interaction of scope.interactions) {\n // if there's already a pointer held down\n if (interaction.pointerIds.length === 1) {\n const target = interaction.target;\n // don't add this pointer if there is a target interactable and it\n // isn't gesturable\n if (target && !target.options.gesture.enabled) {\n continue;\n }\n }\n // maximum of 2 pointers per interaction\n else if (interaction.pointerIds.length >= 2) {\n continue;\n }\n\n if (!interaction.interacting() && (mouseEvent === interaction.mouse)) {\n return interaction;\n }\n }\n\n return null;\n },\n};\n\nmodule.exports = finder;\n","const win = require('./window');\nconst isWindow = require('./isWindow');\n\nconst is = {\n array : () => {},\n\n window : thing => thing === win.window || isWindow(thing),\n\n docFrag : thing => is.object(thing) && thing.nodeType === 11,\n\n object : thing => !!thing && (typeof thing === 'object'),\n\n function: thing => typeof thing === 'function',\n\n number : thing => typeof thing === 'number' ,\n\n bool : thing => typeof thing === 'boolean' ,\n\n string : thing => typeof thing === 'string' ,\n\n element: thing => {\n if (!thing || (typeof thing !== 'object')) { return false; }\n\n const _window = win.getWindow(thing) || win.window;\n\n return (/object|function/.test(typeof _window.Element)\n ? thing instanceof _window.Element //DOM2\n : thing.nodeType === 1 && typeof thing.nodeName === 'string');\n },\n};\n\nis.array = thing => (is.object(thing)\n && (typeof thing.length !== 'undefined')\n && is.function(thing.splice));\n\nmodule.exports = is;\n","module.exports = (thing) => !!(thing && thing.Window) && (thing instanceof thing.Window);\n","function pointerExtend (dest, source) {\n for (const prop in source) {\n const prefixedPropREs = module.exports.prefixedPropREs;\n let deprecated = false;\n\n // skip deprecated prefixed properties\n for (const vendor in prefixedPropREs) {\n if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) {\n deprecated = true;\n break;\n }\n }\n\n if (!deprecated && typeof source[prop] !== 'function') {\n dest[prop] = source[prop];\n }\n }\n return dest;\n}\n\npointerExtend.prefixedPropREs = {\n webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/,\n};\n\nmodule.exports = pointerExtend;\n","const hypot = require('./hypot');\nconst browser = require('./browser');\nconst dom = require('./domObjects');\nconst domUtils = require('./domUtils');\nconst is = require('./is');\nconst pointerExtend = require('./pointerExtend');\n\nconst pointerUtils = {\n copyCoords: function (dest, src) {\n dest.page = dest.page || {};\n dest.page.x = src.page.x;\n dest.page.y = src.page.y;\n\n dest.client = dest.client || {};\n dest.client.x = src.client.x;\n dest.client.y = src.client.y;\n\n dest.timeStamp = src.timeStamp;\n },\n\n setCoordDeltas: function (targetObj, prev, cur) {\n targetObj.page.x = cur.page.x - prev.page.x;\n targetObj.page.y = cur.page.y - prev.page.y;\n targetObj.client.x = cur.client.x - prev.client.x;\n targetObj.client.y = cur.client.y - prev.client.y;\n targetObj.timeStamp = cur.timeStamp - prev.timeStamp;\n\n // set pointer velocity\n const dt = Math.max(targetObj.timeStamp / 1000, 0.001);\n\n targetObj.page.speed = hypot(targetObj.page.x, targetObj.page.y) / dt;\n targetObj.page.vx = targetObj.page.x / dt;\n targetObj.page.vy = targetObj.page.y / dt;\n\n targetObj.client.speed = hypot(targetObj.client.x, targetObj.page.y) / dt;\n targetObj.client.vx = targetObj.client.x / dt;\n targetObj.client.vy = targetObj.client.y / dt;\n },\n\n isNativePointer: function (pointer) {\n return (pointer instanceof dom.Event || pointer instanceof dom.Touch);\n },\n\n // Get specified X/Y coords for mouse or event.touches[0]\n getXY: function (type, pointer, xy) {\n xy = xy || {};\n type = type || 'page';\n\n xy.x = pointer[type + 'X'];\n xy.y = pointer[type + 'Y'];\n\n return xy;\n },\n\n getPageXY: function (pointer, page) {\n page = page || {};\n\n // Opera Mobile handles the viewport and scrolling oddly\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n pointerUtils.getXY('screen', pointer, page);\n\n page.x += window.scrollX;\n page.y += window.scrollY;\n }\n else {\n pointerUtils.getXY('page', pointer, page);\n }\n\n return page;\n },\n\n getClientXY: function (pointer, client) {\n client = client || {};\n\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n // Opera Mobile handles the viewport and scrolling oddly\n pointerUtils.getXY('screen', pointer, client);\n }\n else {\n pointerUtils.getXY('client', pointer, client);\n }\n\n return client;\n },\n\n getPointerId: function (pointer) {\n return is.number(pointer.pointerId)? pointer.pointerId : pointer.identifier;\n },\n\n setCoords: function (targetObj, pointers, timeStamp) {\n const pointer = (pointers.length > 1\n ? pointerUtils.pointerAverage(pointers)\n : pointers[0]);\n\n const tmpXY = {};\n\n pointerUtils.getPageXY(pointer, tmpXY);\n targetObj.page.x = tmpXY.x;\n targetObj.page.y = tmpXY.y;\n\n pointerUtils.getClientXY(pointer, tmpXY);\n targetObj.client.x = tmpXY.x;\n targetObj.client.y = tmpXY.y;\n\n targetObj.timeStamp = is.number(timeStamp) ? timeStamp :new Date().getTime();\n },\n\n pointerExtend: pointerExtend,\n\n getTouchPair: function (event) {\n const touches = [];\n\n // array of touches is supplied\n if (is.array(event)) {\n touches[0] = event[0];\n touches[1] = event[1];\n }\n // an event\n else {\n if (event.type === 'touchend') {\n if (event.touches.length === 1) {\n touches[0] = event.touches[0];\n touches[1] = event.changedTouches[0];\n }\n else if (event.touches.length === 0) {\n touches[0] = event.changedTouches[0];\n touches[1] = event.changedTouches[1];\n }\n }\n else {\n touches[0] = event.touches[0];\n touches[1] = event.touches[1];\n }\n }\n\n return touches;\n },\n\n pointerAverage: function (pointers) {\n const average = {\n pageX : 0,\n pageY : 0,\n clientX: 0,\n clientY: 0,\n screenX: 0,\n screenY: 0,\n };\n\n for (const pointer of pointers) {\n for (const prop in average) {\n average[prop] += pointer[prop];\n }\n }\n for (const prop in average) {\n average[prop] /= pointers.length;\n }\n\n return average;\n },\n\n touchBBox: function (event) {\n if (!event.length && !(event.touches && event.touches.length > 1)) {\n return;\n }\n\n const touches = pointerUtils.getTouchPair(event);\n const minX = Math.min(touches[0].pageX, touches[1].pageX);\n const minY = Math.min(touches[0].pageY, touches[1].pageY);\n const maxX = Math.max(touches[0].pageX, touches[1].pageX);\n const maxY = Math.max(touches[0].pageY, touches[1].pageY);\n\n return {\n x: minX,\n y: minY,\n left: minX,\n top: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n },\n\n touchDistance: function (event, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n\n\n const dx = touches[0][sourceX] - touches[1][sourceX];\n const dy = touches[0][sourceY] - touches[1][sourceY];\n\n return hypot(dx, dy);\n },\n\n touchAngle: function (event, prevAngle, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n const dx = touches[1][sourceX] - touches[0][sourceX];\n const dy = touches[1][sourceY] - touches[0][sourceY];\n const angle = 180 * Math.atan2(dy , dx) / Math.PI;\n\n return angle;\n },\n\n getPointerType: function (pointer, interaction) {\n // if the PointerEvent API isn't available, then the pointer must be ither\n // a MouseEvent or TouchEvent\n if (interaction.mouse) { return 'mouse'; }\n if (!browser.supportsPointerEvent) { return 'touch'; }\n\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : [undefined, undefined,'touch', 'pen', 'mouse'][pointer.pointerType];\n },\n\n // [ event.target, event.currentTarget ]\n getEventTargets: function (event) {\n return [\n domUtils.getActualElement(event.path ? event.path[0] : event.target),\n domUtils.getActualElement(event.currentTarget),\n ];\n },\n};\n\nmodule.exports = pointerUtils;\n","const { window } = require('./window');\n\nconst vendors = ['ms', 'moz', 'webkit', 'o'];\nlet lastTime = 0;\nlet request;\nlet cancel;\n\nfor (let x = 0; x < vendors.length && !window.requestAnimationFrame; x++) {\n request = window[vendors[x] + 'RequestAnimationFrame'];\n cancel = window[vendors[x] +'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n}\n\nif (!request) {\n request = function (callback) {\n const currTime = new Date().getTime();\n const timeToCall = Math.max(0, 16 - (currTime - lastTime));\n const id = setTimeout(function () { callback(currTime + timeToCall); },\n timeToCall);\n\n lastTime = currTime + timeToCall;\n return id;\n };\n}\n\nif (!cancel) {\n cancel = function (id) {\n clearTimeout(id);\n };\n}\n\nmodule.exports = {\n request,\n cancel,\n};\n","const extend = require('./extend');\nconst is = require('./is');\nconst {\n closest,\n parentNode,\n getElementRect,\n} = require('./domUtils');\n\nconst rectUtils = {\n getStringOptionResult: function (value, interactable, element) {\n if (!is.string(value)) {\n return null;\n }\n\n if (value === 'parent') {\n value = parentNode(element);\n }\n else if (value === 'self') {\n value = interactable.getRect(element);\n }\n else {\n value = closest(element, value);\n }\n\n return value;\n },\n\n resolveRectLike: function (value, interactable, element, functionArgs) {\n value = rectUtils.getStringOptionResult(value, interactable, element) || value;\n\n if (is.function(value)) {\n value = value.apply(null, functionArgs);\n }\n\n if (is.element(value)) {\n value = getElementRect(value);\n }\n\n return value;\n },\n\n rectToXY: function (rect) {\n return rect && {\n x: 'x' in rect ? rect.x : rect.left,\n y: 'y' in rect ? rect.y : rect.top,\n };\n },\n\n xywhToTlbr: function (rect) {\n if (rect && !('left' in rect && 'top' in rect)) {\n rect = extend({}, rect);\n\n rect.left = rect.x || 0;\n rect.top = rect.y || 0;\n rect.right = rect.right || (rect.left + rect.width);\n rect.bottom = rect.bottom || (rect.top + rect.height);\n }\n\n return rect;\n },\n\n tlbrToXywh: function (rect) {\n if (rect && !('x' in rect && 'y' in rect)) {\n rect = extend({}, rect);\n\n rect.x = rect.left || 0;\n rect.top = rect.top || 0;\n rect.width = rect.width || (rect.right - rect.x);\n rect.height = rect.height || (rect.bottom - rect.y);\n }\n\n return rect;\n },\n};\n\nmodule.exports = rectUtils;\n","const win = module.exports;\nconst isWindow = require('./isWindow');\n\nfunction init (window) {\n // get wrapped window if using Shadow DOM polyfill\n\n win.realWindow = window;\n\n // create a TextNode\n const el = window.document.createTextNode('');\n\n // check if it's wrapped by a polyfill\n if (el.ownerDocument !== window.document\n && typeof window.wrap === 'function'\n && window.wrap(el) === el) {\n // use wrapped window\n window = window.wrap(window);\n }\n\n win.window = window;\n}\n\nif (typeof window === 'undefined') {\n win.window = undefined;\n win.realWindow = undefined;\n}\nelse {\n init(window);\n}\n\nwin.getWindow = function getWindow (node) {\n if (isWindow(node)) {\n return node;\n }\n\n const rootNode = (node.ownerDocument || node);\n\n return rootNode.defaultView || rootNode.parentWindow || win.window;\n};\n\nwin.init = init;\n"]} \ No newline at end of file +{"version":3,"sources":["src/minHeader.js","src/header.js","index.js","src/Eventable.js","src/InteractEvent.js","src/Interactable.js","src/Interaction.js","src/actions/base.js","src/actions/drag.js","src/actions/drop.js","src/actions/gesture.js","src/actions/resize.js","src/autoScroll.js","src/autoStart/InteractableMethods.js","src/autoStart/base.js","src/autoStart/delay.js","src/autoStart/drag.js","src/autoStart/gesture.js","src/autoStart/resize.js","src/defaultOptions.js","src/index.js","src/inertia.js","src/interact.js","src/interactablePreventDefault.js","src/legacyBrowsers.js","src/modifiers/index.js","src/modifiers/restrict.js","src/modifiers/restrictEdges.js","src/modifiers/restrictSize.js","src/modifiers/snap.js","src/modifiers/snapSize.js","src/pointerEvents/PointerEvent.js","src/pointerEvents/base.js","src/pointerEvents/holdRepeat.js","src/pointerEvents/interactableTargets.js","src/scope.js","src/utils/Signals.js","src/utils/arr.js","src/utils/browser.js","src/utils/domObjects.js","src/utils/domUtils.js","src/utils/events.js","src/utils/extend.js","src/utils/getOriginXY.js","src/utils/hypot.js","src/utils/index.js","src/utils/interactionFinder.js","src/utils/is.js","src/utils/isWindow.js","src/utils/pointerExtend.js","src/utils/pointerUtils.js","src/utils/raf.js","src/utils/rect.js","src/utils/window.js"],"names":[],"mappings":"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","file":"interact.min.js","sourceRoot":"","sourcesContent":["/* interact.js v1.3.0-alpha.4+sha.7970416-dirty | https://raw.github.com/taye/interact.js/master/LICENSE */\n","/**\n * interact.js v1.3.0-alpha.4+sha.7970416-dirty\n *\n * Copyright (c) 2012-2017 Taye Adeyemi \n * Open source under the MIT License.\n * https://raw.github.com/taye/interact.js/master/LICENSE\n */\n","/*\n * In a (windowless) server environment this file exports a factory function\n * that takes the window to use.\n *\n * var interact = require('interact.js')(windowObject);\n *\n * See https://github.com/taye/interact.js/issues/187\n */\nif (typeof window === 'undefined') {\n module.exports = function (window) {\n require('./src/utils/window').init(window);\n\n return require('./src/index');\n };\n}\nelse {\n module.exports = require('./src/index');\n}\n","const { indexOf } = require('./utils/arr');\nconst extend = require('./utils/extend.js');\n\nfunction fireUntilImmediateStopped (event, listeners) {\n for (let i = 0, len = listeners.length; i < len && !event.immediatePropagationStopped; i++) {\n listeners[i](event);\n }\n}\n\nclass Eventable {\n\n constructor (options) {\n this.options = extend({}, options || {});\n }\n\n fire (event) {\n let listeners;\n const onEvent = 'on' + event.type;\n const global = this.global;\n\n // Interactable#on() listeners\n if ((listeners = this[event.type])) {\n fireUntilImmediateStopped(event, listeners);\n }\n\n // interactable.onevent listener\n if (this[onEvent]) {\n this[onEvent](event);\n }\n\n // interact.on() listeners\n if (!event.propagationStopped && global && (listeners = global[event.type])) {\n fireUntilImmediateStopped(event, listeners);\n }\n }\n\n on (eventType, listener) {\n // if this type of event was never bound\n if (this[eventType]) {\n this[eventType].push(listener);\n }\n else {\n this[eventType] = [listener];\n }\n }\n\n off (eventType, listener) {\n // if it is an action event type\n const eventList = this[eventType];\n const index = eventList? indexOf(eventList, listener) : -1;\n\n if (index !== -1) {\n eventList.splice(index, 1);\n }\n\n if (eventList && eventList.length === 0 || !listener) {\n this[eventType] = listener;\n }\n }\n}\n\nmodule.exports = Eventable;\n","const extend = require('./utils/extend');\nconst getOriginXY = require('./utils/getOriginXY');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nclass InteractEvent {\n constructor (interaction, event, action, phase, element, related, preEnd = false) {\n const target = interaction.target;\n const deltaSource = (target && target.options || defaults).deltaSource;\n const origin = getOriginXY(target, element, action);\n const starting = phase === 'start';\n const ending = phase === 'end';\n const coords = starting? interaction.startCoords : interaction.curCoords;\n const prevEvent = interaction.prevEvent;\n\n element = element || interaction.element;\n\n const page = extend({}, coords.page);\n const client = extend({}, coords.client);\n\n page.x -= origin.x;\n page.y -= origin.y;\n\n client.x -= origin.x;\n client.y -= origin.y;\n\n this.ctrlKey = event.ctrlKey;\n this.altKey = event.altKey;\n this.shiftKey = event.shiftKey;\n this.metaKey = event.metaKey;\n this.button = event.button;\n this.buttons = event.buttons;\n this.target = element;\n this.currentTarget = element;\n this.relatedTarget = related || null;\n this.preEnd = preEnd;\n this.type = action + (phase || '');\n this.interaction = interaction;\n this.interactable = target;\n\n this.t0 = starting ? interaction.downTimes[interaction.downTimes.length - 1]\n : prevEvent.t0;\n\n const signalArg = {\n interaction,\n event,\n action,\n phase,\n element,\n related,\n page,\n client,\n coords,\n starting,\n ending,\n deltaSource,\n iEvent: this,\n };\n\n signals.fire('set-xy', signalArg);\n\n if (ending) {\n // use previous coords when ending\n this.pageX = prevEvent.pageX;\n this.pageY = prevEvent.pageY;\n this.clientX = prevEvent.clientX;\n this.clientY = prevEvent.clientY;\n }\n else {\n this.pageX = page.x;\n this.pageY = page.y;\n this.clientX = client.x;\n this.clientY = client.y;\n }\n\n this.x0 = interaction.startCoords.page.x - origin.x;\n this.y0 = interaction.startCoords.page.y - origin.y;\n this.clientX0 = interaction.startCoords.client.x - origin.x;\n this.clientY0 = interaction.startCoords.client.y - origin.y;\n\n signals.fire('set-delta', signalArg);\n\n this.timeStamp = coords.timeStamp;\n this.dt = interaction.pointerDelta.timeStamp;\n this.duration = this.timeStamp - this.t0;\n\n // speed and velocity in pixels per second\n this.speed = interaction.pointerDelta[deltaSource].speed;\n this.velocityX = interaction.pointerDelta[deltaSource].vx;\n this.velocityY = interaction.pointerDelta[deltaSource].vy;\n\n this.swipe = (ending || phase === 'inertiastart')? this.getSwipe() : null;\n\n signals.fire('new', signalArg);\n }\n\n getSwipe () {\n const interaction = this.interaction;\n\n if (interaction.prevEvent.speed < 600\n || this.timeStamp - interaction.prevEvent.timeStamp > 150) {\n return null;\n }\n\n let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI;\n const overlap = 22.5;\n\n if (angle < 0) {\n angle += 360;\n }\n\n const left = 135 - overlap <= angle && angle < 225 + overlap;\n const up = 225 - overlap <= angle && angle < 315 + overlap;\n\n const right = !left && (315 - overlap <= angle || angle < 45 + overlap);\n const down = !up && 45 - overlap <= angle && angle < 135 + overlap;\n\n return {\n up,\n down,\n left,\n right,\n angle,\n speed: interaction.prevEvent.speed,\n velocity: {\n x: interaction.prevEvent.velocityX,\n y: interaction.prevEvent.velocityY,\n },\n };\n }\n\n preventDefault () {}\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n}\n\nsignals.on('set-delta', function ({ iEvent, interaction, starting, deltaSource }) {\n const prevEvent = starting? iEvent : interaction.prevEvent;\n\n if (deltaSource === 'client') {\n iEvent.dx = iEvent.clientX - prevEvent.clientX;\n iEvent.dy = iEvent.clientY - prevEvent.clientY;\n }\n else {\n iEvent.dx = iEvent.pageX - prevEvent.pageX;\n iEvent.dy = iEvent.pageY - prevEvent.pageY;\n }\n});\n\nInteractEvent.signals = signals;\n\nmodule.exports = InteractEvent;\n","const is = require('./utils/is');\nconst events = require('./utils/events');\nconst extend = require('./utils/extend');\nconst actions = require('./actions/base');\nconst scope = require('./scope');\nconst Eventable = require('./Eventable');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nconst {\n getElementRect,\n nodeContains,\n trySelector,\n} = require('./utils/domUtils');\nconst { getWindow } = require('./utils/window');\nconst { indexOf, contains } = require('./utils/arr');\nconst { wheelEvent } = require('./utils/browser');\n\n// all set interactables\nscope.interactables = [];\n\n/*\\\n * Interactable\n [ property ]\n **\n * Object type returned by @interact\n\\*/\nclass Interactable {\n constructor (target, options) {\n options = options || {};\n\n this.target = target;\n this.events = new Eventable();\n this._context = options.context || scope.document;\n this._win = getWindow(trySelector(target)? this._context : target);\n this._doc = this._win.document;\n\n signals.fire('new', {\n target,\n options,\n interactable: this,\n win: this._win,\n });\n\n scope.addDocument( this._doc, this._win );\n\n scope.interactables.push(this);\n\n this.set(options);\n }\n\n setOnEvents (action, phases) {\n const onAction = 'on' + action;\n\n if (is.function(phases.onstart) ) { this.events[onAction + 'start' ] = phases.onstart ; }\n if (is.function(phases.onmove) ) { this.events[onAction + 'move' ] = phases.onmove ; }\n if (is.function(phases.onend) ) { this.events[onAction + 'end' ] = phases.onend ; }\n if (is.function(phases.oninertiastart)) { this.events[onAction + 'inertiastart' ] = phases.oninertiastart ; }\n\n return this;\n }\n\n setPerAction (action, options) {\n // for all the default per-action options\n for (const option in options) {\n // if this option exists for this action\n if (option in defaults[action]) {\n // if the option in the options arg is an object value\n if (is.object(options[option])) {\n // duplicate the object\n this.options[action][option] = extend(this.options[action][option] || {}, options[option]);\n\n if (is.object(defaults.perAction[option]) && 'enabled' in defaults.perAction[option]) {\n this.options[action][option].enabled = options[option].enabled === false? false : true;\n }\n }\n else if (is.bool(options[option]) && is.object(defaults.perAction[option])) {\n this.options[action][option].enabled = options[option];\n }\n else if (options[option] !== undefined) {\n // or if it's not undefined, do a plain assignment\n this.options[action][option] = options[option];\n }\n }\n }\n }\n\n /*\\\n * Interactable.getRect\n [ method ]\n *\n * The default function to get an Interactables bounding rect. Can be\n * overridden using @Interactable.rectChecker.\n *\n - element (Element) #optional The element to measure.\n = (object) The object's bounding rectangle.\n o {\n o top : 0,\n o left : 0,\n o bottom: 0,\n o right : 0,\n o width : 0,\n o height: 0\n o }\n \\*/\n getRect (element) {\n element = element || this.target;\n\n if (is.string(this.target) && !(is.element(element))) {\n element = this._context.querySelector(this.target);\n }\n\n return getElementRect(element);\n }\n\n /*\\\n * Interactable.rectChecker\n [ method ]\n *\n * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n - checker (function) #optional A function which returns this Interactable's bounding rectangle. See @Interactable.getRect\n = (function | object) The checker function or this Interactable\n \\*/\n rectChecker (checker) {\n if (is.function(checker)) {\n this.getRect = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.getRect;\n\n return this;\n }\n\n return this.getRect;\n }\n\n _backCompatOption (optionName, newValue) {\n if (trySelector(newValue) || is.object(newValue)) {\n this.options[optionName] = newValue;\n\n for (const action of actions.names) {\n this.options[action][optionName] = newValue;\n }\n\n return this;\n }\n\n return this.options[optionName];\n }\n\n /*\\\n * Interactable.origin\n [ method ]\n *\n * Gets or sets the origin of the Interactable's element. The x and y\n * of the origin will be subtracted from action event coordinates.\n *\n - origin (object | string) #optional An object eg. { x: 0, y: 0 } or string 'parent', 'self' or any CSS selector\n * OR\n - origin (Element) #optional An HTML or SVG Element whose rect will be used\n **\n = (object) The current origin or this Interactable\n \\*/\n origin (newValue) {\n return this._backCompatOption('origin', newValue);\n }\n\n /*\\\n * Interactable.deltaSource\n [ method ]\n *\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n - newValue (string) #optional Use 'client' if you will be scrolling while interacting; Use 'page' if you want autoScroll to work\n = (string | object) The current deltaSource or this Interactable\n \\*/\n deltaSource (newValue) {\n if (newValue === 'page' || newValue === 'client') {\n this.options.deltaSource = newValue;\n\n return this;\n }\n\n return this.options.deltaSource;\n }\n\n /*\\\n * Interactable.context\n [ method ]\n *\n * Gets the selector context Node of the Interactable. The default is `window.document`.\n *\n = (Node) The context Node of this Interactable\n **\n \\*/\n context () {\n return this._context;\n }\n\n inContext (element) {\n return (this._context === element.ownerDocument\n || nodeContains(this._context, element));\n }\n\n /*\\\n * Interactable.fire\n [ method ]\n *\n * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n - iEvent (InteractEvent) The InteractEvent object to be fired on this Interactable\n = (Interactable) this Interactable\n \\*/\n fire (iEvent) {\n this.events.fire(iEvent);\n\n return this;\n }\n\n _onOffMultiple (method, eventType, listener, options) {\n if (is.string(eventType) && eventType.search(' ') !== -1) {\n eventType = eventType.trim().split(/ +/);\n }\n\n if (is.array(eventType)) {\n for (let i = 0; i < eventType.length; i++) {\n this[method](eventType[i], listener, options);\n }\n\n return true;\n }\n\n if (is.object(eventType)) {\n for (const prop in eventType) {\n this[method](prop, eventType[prop], listener);\n }\n\n return true;\n }\n }\n\n /*\\\n * Interactable.on\n [ method ]\n *\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n - eventType (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) This Interactable\n \\*/\n on (eventType, listener, options) {\n if (this._onOffMultiple('on', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.on(eventType, listener);\n }\n // delegated event for selector\n else if (is.string(this.target)) {\n events.addDelegate(this.target, this._context, eventType, listener, options);\n }\n else {\n events.add(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.off\n [ method ]\n *\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n - eventType (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) This Interactable\n \\*/\n off (eventType, listener, options) {\n if (this._onOffMultiple('off', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n // if it is an action event type\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.off(eventType, listener);\n }\n // delegated event\n else if (is.string(this.target)) {\n events.removeDelegate(this.target, this._context, eventType, listener, options);\n }\n // remove listener from this Interatable's element\n else {\n events.remove(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.set\n [ method ]\n *\n * Reset the options of this Interactable\n - options (object) The new settings to apply\n = (object) This Interactable\n \\*/\n set (options) {\n if (!is.object(options)) {\n options = {};\n }\n\n this.options = extend({}, defaults.base);\n\n const perActions = extend({}, defaults.perAction);\n\n for (const actionName in actions.methodDict) {\n const methodName = actions.methodDict[actionName];\n\n this.options[actionName] = extend({}, defaults[actionName]);\n\n this.setPerAction(actionName, perActions);\n\n this[methodName](options[actionName]);\n }\n\n for (const setting of Interactable.settingsMethods) {\n this.options[setting] = defaults.base[setting];\n\n if (setting in options) {\n this[setting](options[setting]);\n }\n }\n\n signals.fire('set', {\n options,\n interactable: this,\n });\n\n return this;\n }\n\n /*\\\n * Interactable.unset\n [ method ]\n *\n * Remove this interactable from the list of interactables and remove\n * it's action capabilities and event listeners\n *\n = (object) @interact\n \\*/\n unset () {\n events.remove(this.target, 'all');\n\n if (is.string(this.target)) {\n // remove delegated events\n for (const type in events.delegatedEvents) {\n const delegated = events.delegatedEvents[type];\n\n if (delegated.selectors[0] === this.target\n && delegated.contexts[0] === this._context) {\n\n delegated.selectors.splice(0, 1);\n delegated.contexts .splice(0, 1);\n delegated.listeners.splice(0, 1);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegated[type] = null;\n }\n }\n\n events.remove(this._context, type, events.delegateListener);\n events.remove(this._context, type, events.delegateUseCapture, true);\n }\n }\n else {\n events.remove(this, 'all');\n }\n\n signals.fire('unset', { interactable: this });\n\n scope.interactables.splice(indexOf(scope.interactables, this), 1);\n\n // Stop related interactions when an Interactable is unset\n for (const interaction of scope.interactions || []) {\n if (interaction.target === this && interaction.interacting()) {\n interaction.stop();\n }\n }\n\n return scope.interact;\n }\n}\n\nscope.interactables.indexOfElement = function indexOfElement (target, context) {\n context = context || scope.document;\n\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n if (interactable.target === target && interactable._context === context) {\n return i;\n }\n }\n return -1;\n};\n\nscope.interactables.get = function interactableGet (element, options, dontCheckInContext) {\n const ret = this[this.indexOfElement(element, options && options.context)];\n\n return ret && (is.string(element) || dontCheckInContext || ret.inContext(element))? ret : null;\n};\n\nscope.interactables.forEachSelector = function (callback, element) {\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n // skip non CSS selector targets and out of context elements\n if (!is.string(interactable.target)\n || (element && !interactable.inContext(element))) {\n continue;\n }\n\n const ret = callback(interactable, interactable.target, interactable._context, i, this);\n\n if (ret !== undefined) {\n return ret;\n }\n }\n};\n\n// all interact.js eventTypes\nInteractable.eventTypes = scope.eventTypes = [];\n\nInteractable.signals = signals;\n\nInteractable.settingsMethods = [ 'deltaSource', 'origin', 'preventDefault', 'rectChecker' ];\n\nmodule.exports = Interactable;\n","const scope = require('./scope');\nconst utils = require('./utils');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst domObjects = require('./utils/domObjects');\nconst finder = require('./utils/interactionFinder');\nconst signals = require('./utils/Signals').new();\n\nconst listeners = {};\nconst methodNames = [\n 'pointerDown', 'pointerMove', 'pointerUp',\n 'updatePointer', 'removePointer',\n];\n\n// for ignoring browser's simulated mouse events\nlet prevTouchTime = 0;\n\n// all active and idle interactions\nscope.interactions = [];\n\nclass Interaction {\n constructor ({ pointerType }) {\n this.target = null; // current interactable being interacted with\n this.element = null; // the target element of the interactable\n\n this.prepared = { // action that's ready to be fired on next move event\n name : null,\n axis : null,\n edges: null,\n };\n\n // keep track of added pointers\n this.pointers = [];\n this.pointerIds = [];\n this.downTargets = [];\n this.downTimes = [];\n\n // Previous native pointer move event coordinates\n this.prevCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n // current native pointer move event coordinates\n this.curCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Starting InteractEvent pointer coordinates\n this.startCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Change in coordinates and time of the pointer\n this.pointerDelta = {\n page : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n client : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n timeStamp: 0,\n };\n\n this.downEvent = null; // pointerdown/mousedown/touchstart event\n this.downPointer = {};\n\n this._eventTarget = null;\n this._curEventTarget = null;\n\n this.prevEvent = null; // previous action event\n\n this.pointerIsDown = false;\n this.pointerWasMoved = false;\n this._interacting = false;\n\n this.pointerType = pointerType;\n\n signals.fire('new', this);\n\n scope.interactions.push(this);\n }\n\n pointerDown (pointer, event, eventTarget) {\n const pointerIndex = this.updatePointer(pointer, event, true);\n\n signals.fire('down', {\n pointer,\n event,\n eventTarget,\n pointerIndex,\n interaction: this,\n });\n }\n\n /*\\\n * Interaction.start\n [ method ]\n *\n * Start an action with the given Interactable and Element as tartgets. The\n * action must be enabled for the target Interactable and an appropriate number\n * of pointers must be held down - 1 for drag/resize, 2 for gesture.\n *\n * Use it with `interactable.able({ manualStart: false })` to always\n * [start actions manually](https://github.com/taye/interact.js/issues/114)\n *\n - action (object) The action to be performed - drag, resize, etc.\n - target (Interactable) The Interactable to target\n - element (Element) The DOM Element to target\n = (object) interact\n **\n | interact(target)\n | .draggable({\n | // disable the default drag start by down->move\n | manualStart: true\n | })\n | // start dragging after the user holds the pointer down\n | .on('hold', function (event) {\n | var interaction = event.interaction;\n |\n | if (!interaction.interacting()) {\n | interaction.start({ name: 'drag' },\n | event.interactable,\n | event.currentTarget);\n | }\n | });\n \\*/\n start (action, target, element) {\n if (this.interacting()\n || !this.pointerIsDown\n || this.pointerIds.length < (action.name === 'gesture'? 2 : 1)) {\n return;\n }\n\n // if this interaction had been removed after stopping\n // add it back\n if (utils.indexOf(scope.interactions, this) === -1) {\n scope.interactions.push(this);\n }\n\n utils.copyAction(this.prepared, action);\n this.target = target;\n this.element = element;\n\n signals.fire('action-start', {\n interaction: this,\n event: this.downEvent,\n });\n }\n\n pointerMove (pointer, event, eventTarget) {\n if (!this.simulation) {\n this.updatePointer(pointer);\n utils.setCoords(this.curCoords, this.pointers);\n }\n\n const duplicateMove = (this.curCoords.page.x === this.prevCoords.page.x\n && this.curCoords.page.y === this.prevCoords.page.y\n && this.curCoords.client.x === this.prevCoords.client.x\n && this.curCoords.client.y === this.prevCoords.client.y);\n\n let dx;\n let dy;\n\n // register movement greater than pointerMoveTolerance\n if (this.pointerIsDown && !this.pointerWasMoved) {\n dx = this.curCoords.client.x - this.startCoords.client.x;\n dy = this.curCoords.client.y - this.startCoords.client.y;\n\n this.pointerWasMoved = utils.hypot(dx, dy) > Interaction.pointerMoveTolerance;\n }\n\n const signalArg = {\n pointer,\n pointerIndex: this.getPointerIndex(pointer),\n event,\n eventTarget,\n dx,\n dy,\n duplicate: duplicateMove,\n interaction: this,\n interactingBeforeMove: this.interacting(),\n };\n\n if (!duplicateMove) {\n // set pointer coordinate, time changes and speeds\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n }\n\n signals.fire('move', signalArg);\n\n if (!duplicateMove) {\n // if interacting, fire an 'action-move' signal etc\n if (this.interacting()) {\n this.doMove(signalArg);\n }\n\n if (this.pointerWasMoved) {\n utils.copyCoords(this.prevCoords, this.curCoords);\n }\n }\n }\n\n /*\\\n * Interaction.doMove\n [ method ]\n *\n * Force a move of the current action at the same coordinates. Useful if\n * snap/restrict has been changed and you want a movement with the new\n * settings.\n *\n **\n | interact(target)\n | .draggable(true)\n | .on('dragmove', function (event) {\n | if (someCondition) {\n | // change the snap settings\n | event.interactable.draggable({ snap: { targets: [] }});\n | // fire another move event with re-calculated snap\n | event.interaction.doMove();\n | }\n | });\n \\*/\n doMove (signalArg) {\n signalArg = utils.extend({\n pointer: this.pointers[0],\n event: this.prevEvent,\n eventTarget: this._eventTarget,\n interaction: this,\n }, signalArg || {});\n\n signals.fire('before-action-move', signalArg);\n\n if (!this._dontFireMove) {\n signals.fire('action-move', signalArg);\n }\n\n this._dontFireMove = false;\n }\n\n // End interact move events and stop auto-scroll unless simulation is running\n pointerUp (pointer, event, eventTarget, curEventTarget) {\n const pointerIndex = this.getPointerIndex(pointer);\n\n signals.fire(/cancel$/i.test(event.type)? 'cancel' : 'up', {\n pointer,\n pointerIndex,\n event,\n eventTarget,\n curEventTarget,\n interaction: this,\n });\n\n if (!this.simulation) {\n this.end(event);\n }\n\n this.pointerIsDown = false;\n this.removePointer(pointer, event);\n }\n\n /*\\\n * Interaction.end\n [ method ]\n *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n - event (PointerEvent) #optional\n **\n | interact(target)\n | .draggable(true)\n | .on('move', function (event) {\n | if (event.pageX > 1000) {\n | // end the current action\n | event.interaction.end();\n | // stop all further listeners from being called\n | event.stopImmediatePropagation();\n | }\n | });\n \\*/\n end (event) {\n event = event || this.prevEvent;\n\n if (this.interacting()) {\n signals.fire('action-end', {\n event,\n interaction: this,\n });\n }\n\n this.stop();\n }\n\n currentAction () {\n return this._interacting? this.prepared.name: null;\n }\n\n interacting () {\n return this._interacting;\n }\n\n stop () {\n signals.fire('stop', { interaction: this });\n\n if (this._interacting) {\n signals.fire('stop-active', { interaction: this });\n signals.fire('stop-' + this.prepared.name, { interaction: this });\n }\n\n this.target = this.element = null;\n\n this._interacting = false;\n this.prepared.name = this.prevEvent = null;\n }\n\n getPointerIndex (pointer) {\n // mouse and pen interactions may have only one pointer\n if (this.pointerType === 'mouse' || this.pointerType === 'pen') {\n return 0;\n }\n\n return utils.indexOf(this.pointerIds, utils.getPointerId(pointer));\n }\n\n updatePointer (pointer, event, down = event && /(down|start)$/i.test(event.type)) {\n const id = utils.getPointerId(pointer);\n let index = this.getPointerIndex(pointer);\n\n if (index === -1) {\n index = this.pointerIds.length;\n this.pointerIds[index] = id;\n }\n\n if (down) {\n signals.fire('update-pointer-down', {\n pointer,\n event,\n down,\n pointerId: id,\n pointerIndex: index,\n interaction: this,\n });\n }\n\n this.pointers[index] = pointer;\n\n return index;\n }\n\n removePointer (pointer, event) {\n const index = this.getPointerIndex(pointer);\n\n if (index === -1) { return; }\n\n signals.fire('remove-pointer', {\n pointer,\n event,\n pointerIndex: index,\n interaction: this,\n });\n\n this.pointers .splice(index, 1);\n this.pointerIds .splice(index, 1);\n this.downTargets.splice(index, 1);\n this.downTimes .splice(index, 1);\n }\n\n _updateEventTargets (target, currentTarget) {\n this._eventTarget = target;\n this._curEventTarget = currentTarget;\n }\n}\n\nfor (let i = 0, len = methodNames.length; i < len; i++) {\n const method = methodNames[i];\n\n listeners[method] = doOnInteractions(method);\n}\n\nfunction doOnInteractions (method) {\n return (function (event) {\n const pointerType = utils.getPointerType(event);\n const [eventTarget, curEventTarget] = utils.getEventTargets(event);\n const matches = []; // [ [pointer, interaction], ...]\n\n if (browser.supportsTouch && /touch/.test(event.type)) {\n prevTouchTime = new Date().getTime();\n\n for (let i = 0; i < event.changedTouches.length; i++) {\n const pointer = event.changedTouches[i];\n const interaction = finder.search(pointer, event.type, eventTarget);\n\n matches.push([pointer, interaction || new Interaction({ pointerType })]);\n }\n }\n else {\n let invalidPointer = false;\n\n if (!browser.supportsPointerEvent && /mouse/.test(event.type)) {\n // ignore mouse events while touch interactions are active\n for (let i = 0; i < scope.interactions.length && !invalidPointer; i++) {\n invalidPointer = scope.interactions[i].pointerType !== 'mouse' && scope.interactions[i].pointerIsDown;\n }\n\n // try to ignore mouse events that are simulated by the browser\n // after a touch event\n invalidPointer = invalidPointer\n || (new Date().getTime() - prevTouchTime < 500)\n // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated\n || event.timeStamp === 0;\n }\n\n if (!invalidPointer) {\n let interaction = finder.search(event, event.type, eventTarget);\n\n if (!interaction) {\n interaction = new Interaction({ pointerType });\n }\n\n matches.push([event, interaction]);\n }\n }\n\n for (const [pointer, interaction] of matches) {\n interaction._updateEventTargets(eventTarget, curEventTarget);\n interaction[method](pointer, event, eventTarget, curEventTarget);\n }\n });\n}\n\nfunction endAll (event) {\n for (let i = 0; i < scope.interactions.length; i++) {\n const interaction = scope.interactions[i];\n\n interaction.end(event);\n signals.fire('endall', { event, interaction });\n }\n}\n\nconst docEvents = { /* 'eventType': listenerFunc */ };\nconst pEventTypes = browser.pEventTypes;\n\nif (domObjects.PointerEvent) {\n docEvents[pEventTypes.down ] = listeners.pointerDown;\n docEvents[pEventTypes.move ] = listeners.pointerMove;\n docEvents[pEventTypes.up ] = listeners.pointerUp;\n docEvents[pEventTypes.cancel] = listeners.pointerUp;\n}\nelse {\n docEvents.mousedown = listeners.pointerDown;\n docEvents.mousemove = listeners.pointerMove;\n docEvents.mouseup = listeners.pointerUp;\n\n docEvents.touchstart = listeners.pointerDown;\n docEvents.touchmove = listeners.pointerMove;\n docEvents.touchend = listeners.pointerUp;\n docEvents.touchcancel = listeners.pointerUp;\n}\n\ndocEvents.blur = endAll;\n\nfunction onDocSignal ({ doc }, signalName) {\n const eventMethod = signalName.indexOf('add') === 0\n ? events.add : events.remove;\n\n // delegate event listener\n for (const eventType in scope.delegatedEvents) {\n eventMethod(doc, eventType, events.delegateListener);\n eventMethod(doc, eventType, events.delegateUseCapture, true);\n }\n\n for (const eventType in docEvents) {\n eventMethod(doc, eventType, docEvents[eventType]);\n }\n}\n\nsignals.on('update-pointer-down', ({ interaction, pointer, pointerId, pointerIndex, event, eventTarget, down }) => {\n interaction.pointerIds[pointerIndex] = pointerId;\n interaction.pointers[pointerIndex] = pointer;\n\n if (down) {\n interaction.pointerIsDown = true;\n }\n\n if (!interaction.interacting()) {\n utils.setCoords(interaction.startCoords, interaction.pointers);\n\n utils.copyCoords(interaction.curCoords , interaction.startCoords);\n utils.copyCoords(interaction.prevCoords, interaction.startCoords);\n\n interaction.downEvent = event;\n interaction.downTimes[pointerIndex] = interaction.curCoords.timeStamp;\n interaction.downTargets[pointerIndex] = eventTarget || event && utils.getEventTargets(event)[0];\n interaction.pointerWasMoved = false;\n\n utils.pointerExtend(interaction.downPointer, pointer);\n }\n});\n\nscope.signals.on('add-document' , onDocSignal);\nscope.signals.on('remove-document', onDocSignal);\n\nInteraction.pointerMoveTolerance = 1;\nInteraction.doOnInteractions = doOnInteractions;\nInteraction.endAll = endAll;\nInteraction.signals = signals;\nInteraction.docEvents = docEvents;\n\nscope.endAllInteractions = endAll;\n\nmodule.exports = Interaction;\n","const Interaction = require('../Interaction');\nconst InteractEvent = require('../InteractEvent');\n\nconst actions = {\n firePrepared,\n names: [],\n methodDict: {},\n};\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n interaction._interacting = true;\n firePrepared(interaction, event, 'start');\n});\n\nInteraction.signals.on('action-move', function ({ interaction, event, preEnd }) {\n firePrepared(interaction, event, 'move', preEnd);\n\n // if the action was ended in a listener\n if (!interaction.interacting()) { return false; }\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n firePrepared(interaction, event, 'end');\n});\n\nfunction firePrepared (interaction, event, phase, preEnd) {\n const actionName = interaction.prepared.name;\n\n const newEvent = new InteractEvent(interaction, event, actionName, phase, interaction.element, null, preEnd);\n\n interaction.target.fire(newEvent);\n interaction.prevEvent = newEvent;\n}\n\nmodule.exports = actions;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drag = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n startAxis : 'xy',\n lockAxis : 'xy',\n },\n\n checker: function (pointer, event, interactable) {\n const dragOptions = interactable.options.drag;\n\n return dragOptions.enabled\n ? { name: 'drag', axis: (dragOptions.lockAxis === 'start'\n ? dragOptions.startAxis\n : dragOptions.lockAxis)}\n : null;\n },\n\n getCursor: function () {\n return 'move';\n },\n};\n\nInteraction.signals.on('before-action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n interaction.curCoords.page.y = interaction.startCoords.page.y;\n interaction.curCoords.client.y = interaction.startCoords.client.y;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vx);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vx);\n interaction.pointerDelta.client.vy = 0;\n interaction.pointerDelta.page.vy = 0;\n }\n else if (axis === 'y') {\n interaction.curCoords.page.x = interaction.startCoords.page.x;\n interaction.curCoords.client.x = interaction.startCoords.client.x;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vy);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vy);\n interaction.pointerDelta.client.vx = 0;\n interaction.pointerDelta.page.vx = 0;\n }\n});\n\n// dragmove\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'dragmove') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n iEvent.pageY = interaction.startCoords.page.y;\n iEvent.clientY = interaction.startCoords.client.y;\n iEvent.dy = 0;\n }\n else if (axis === 'y') {\n iEvent.pageX = interaction.startCoords.page.x;\n iEvent.clientX = interaction.startCoords.client.x;\n iEvent.dx = 0;\n }\n});\n\n/*\\\n * Interactable.draggable\n [ method ]\n *\n * Gets or sets whether drag actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of drag events\n | var isDraggable = interact('ul li').draggable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on drag events (object makes the Interactable draggable)\n = (object) This Interactable\n | interact(element).draggable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // the axis in which the first movement must be\n | // for the drag sequence to start\n | // 'xy' by default - any direction\n | startAxis: 'x' || 'y' || 'xy',\n |\n | // 'xy' by default - don't restrict to one axis (move in any direction)\n | // 'x' or 'y' to restrict movement to either axis\n | // 'start' to restrict movement to the axis the drag started in\n | lockAxis: 'x' || 'y' || 'xy' || 'start',\n |\n | // max number of drags that can happen concurrently\n | // with elements of this Interactable. Infinity by default\n | max: Infinity,\n |\n | // max number of drags that can target the same element+Interactable\n | // 1 by default\n | maxPerElement: 2\n | });\n\\*/\nInteractable.prototype.draggable = function (options) {\n if (utils.is.object(options)) {\n this.options.drag.enabled = options.enabled === false? false: true;\n this.setPerAction('drag', options);\n this.setOnEvents('drag', options);\n\n if (/^(xy|x|y|start)$/.test(options.lockAxis)) {\n this.options.drag.lockAxis = options.lockAxis;\n }\n if (/^(xy|x|y)$/.test(options.startAxis)) {\n this.options.drag.startAxis = options.startAxis;\n }\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drag.enabled = options;\n\n if (!options) {\n this.ondragstart = this.ondragstart = this.ondragend = null;\n }\n\n return this;\n }\n\n return this.options.drag;\n};\n\nactions.drag = drag;\nactions.names.push('drag');\nutils.merge(Interactable.eventTypes, [\n 'dragstart',\n 'dragmove',\n 'draginertiastart',\n 'draginertiaresume',\n 'dragend',\n]);\nactions.methodDict.drag = 'draggable';\n\ndefaultOptions.drag = drag.defaults;\n\nmodule.exports = drag;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst scope = require('../scope');\nconst interact = require('../interact');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drop = {\n defaults: {\n enabled: false,\n accept : null,\n overlap: 'pointer',\n },\n};\n\nlet dynamicDrop = false;\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // reset active dropzones\n interaction.activeDrops.dropzones = [];\n interaction.activeDrops.elements = [];\n interaction.activeDrops.rects = [];\n\n interaction.dropEvents = null;\n\n if (!interaction.dynamicDrop) {\n setActiveDrops(interaction, interaction.element);\n }\n\n const dragEvent = interaction.prevEvent;\n const dropEvents = getDropEvents(interaction, event, dragEvent);\n\n if (dropEvents.activate) {\n fireActiveDrops(interaction, dropEvents.activate);\n }\n});\n\nInteractEvent.signals.on('new', function ({ interaction, iEvent, event }) {\n if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { return; }\n\n const draggableElement = interaction.element;\n const dragEvent = iEvent;\n const dropResult = getDrop(dragEvent, event, draggableElement);\n\n interaction.dropTarget = dropResult.dropzone;\n interaction.dropElement = dropResult.element;\n\n interaction.dropEvents = getDropEvents(interaction, event, dragEvent);\n});\n\nInteraction.signals.on('action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n fireDropEvents(interaction, interaction.dropEvents);\n});\n\nInteraction.signals.on('action-end', function ({ interaction }) {\n if (interaction.prepared.name === 'drag') {\n fireDropEvents(interaction, interaction.dropEvents);\n }\n});\n\nInteraction.signals.on('stop-drag', function ({ interaction }) {\n interaction.activeDrops.dropzones =\n interaction.activeDrops.elements =\n interaction.activeDrops.rects =\n interaction.dropEvents = null;\n});\n\nfunction collectDrops (interaction, element) {\n const drops = [];\n const elements = [];\n\n element = element || interaction.element;\n\n // collect all dropzones and their elements which qualify for a drop\n for (const current of scope.interactables) {\n if (!current.options.drop.enabled) { continue; }\n\n const accept = current.options.drop.accept;\n\n // test the draggable element against the dropzone's accept setting\n if ((utils.is.element(accept) && accept !== element)\n || (utils.is.string(accept)\n && !utils.matchesSelector(element, accept))) {\n\n continue;\n }\n\n // query for new elements if necessary\n const dropElements = utils.is.string(current.target)\n ? current._context.querySelectorAll(current.target)\n : [current.target];\n\n for (let i = 0; i < dropElements.length; i++) {\n const currentElement = dropElements[i];\n\n if (currentElement !== element) {\n drops.push(current);\n elements.push(currentElement);\n }\n }\n }\n\n return {\n elements,\n dropzones: drops,\n };\n}\n\nfunction fireActiveDrops (interaction, event) {\n let prevElement;\n\n // loop through all active dropzones and trigger event\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n const current = interaction.activeDrops.dropzones[i];\n const currentElement = interaction.activeDrops.elements [i];\n\n // prevent trigger of duplicate events on same element\n if (currentElement !== prevElement) {\n // set current element as event target\n event.target = currentElement;\n current.fire(event);\n }\n prevElement = currentElement;\n }\n}\n\n// Collect a new set of possible drops and save them in activeDrops.\n// setActiveDrops should always be called when a drag has just started or a\n// drag event happens while dynamicDrop is true\nfunction setActiveDrops (interaction, dragElement) {\n // get dropzones and their elements that could receive the draggable\n const possibleDrops = collectDrops(interaction, dragElement, true);\n\n interaction.activeDrops.dropzones = possibleDrops.dropzones;\n interaction.activeDrops.elements = possibleDrops.elements;\n interaction.activeDrops.rects = [];\n\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n interaction.activeDrops.rects[i] =\n interaction.activeDrops.dropzones[i].getRect(interaction.activeDrops.elements[i]);\n }\n}\n\nfunction getDrop (dragEvent, event, dragElement) {\n const interaction = dragEvent.interaction;\n const validDrops = [];\n\n if (dynamicDrop) {\n setActiveDrops(interaction, dragElement);\n }\n\n // collect all dropzones and their elements which qualify for a drop\n for (let j = 0; j < interaction.activeDrops.dropzones.length; j++) {\n const current = interaction.activeDrops.dropzones[j];\n const currentElement = interaction.activeDrops.elements [j];\n const rect = interaction.activeDrops.rects [j];\n\n validDrops.push(current.dropCheck(dragEvent, event, interaction.target, dragElement, currentElement, rect)\n ? currentElement\n : null);\n }\n\n // get the most appropriate dropzone based on DOM depth and order\n const dropIndex = utils.indexOfDeepestElement(validDrops);\n\n return {\n dropzone: interaction.activeDrops.dropzones[dropIndex] || null,\n element : interaction.activeDrops.elements [dropIndex] || null,\n };\n}\n\nfunction getDropEvents (interaction, pointerEvent, dragEvent) {\n const dropEvents = {\n enter : null,\n leave : null,\n activate : null,\n deactivate: null,\n move : null,\n drop : null,\n };\n\n const tmpl = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n };\n\n if (interaction.dropElement !== interaction.prevDropElement) {\n // if there was a prevDropTarget, create a dragleave event\n if (interaction.prevDropTarget) {\n dropEvents.leave = utils.extend({ type: 'dragleave' }, tmpl);\n\n dragEvent.dragLeave = dropEvents.leave.target = interaction.prevDropElement;\n dragEvent.prevDropzone = dropEvents.leave.dropzone = interaction.prevDropTarget;\n }\n // if the dropTarget is not null, create a dragenter event\n if (interaction.dropTarget) {\n dropEvents.enter = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n type : 'dragenter',\n };\n\n dragEvent.dragEnter = interaction.dropElement;\n dragEvent.dropzone = interaction.dropTarget;\n }\n }\n\n if (dragEvent.type === 'dragend' && interaction.dropTarget) {\n dropEvents.drop = utils.extend({ type: 'drop' }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n dragEvent.relatedTarget = interaction.dropElement;\n }\n if (dragEvent.type === 'dragstart') {\n dropEvents.activate = utils.extend({ type: 'dropactivate' }, tmpl);\n\n dropEvents.activate.target = null;\n dropEvents.activate.dropzone = null;\n }\n if (dragEvent.type === 'dragend') {\n dropEvents.deactivate = utils.extend({ type: 'dropdeactivate' }, tmpl);\n\n dropEvents.deactivate.target = null;\n dropEvents.deactivate.dropzone = null;\n }\n if (dragEvent.type === 'dragmove' && interaction.dropTarget) {\n dropEvents.move = utils.extend({\n dragmove : dragEvent,\n type : 'dropmove',\n }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n }\n\n return dropEvents;\n}\n\nfunction fireDropEvents (interaction, dropEvents) {\n if (dropEvents.leave) { interaction.prevDropTarget.fire(dropEvents.leave); }\n if (dropEvents.move ) { interaction.dropTarget.fire(dropEvents.move ); }\n if (dropEvents.enter) { interaction.dropTarget.fire(dropEvents.enter); }\n if (dropEvents.drop ) { interaction.dropTarget.fire(dropEvents.drop ); }\n if (dropEvents.deactivate) {\n fireActiveDrops(interaction, dropEvents.deactivate);\n }\n\n interaction.prevDropTarget = interaction.dropTarget;\n interaction.prevDropElement = interaction.dropElement;\n}\n\n/*\\\n * Interactable.dropzone\n [ method ]\n *\n * Returns or sets whether elements can be dropped onto this\n * Interactable to trigger drop events\n *\n * Dropzones can receive the following events:\n * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends\n * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone\n * - `dragmove` when a draggable that has entered the dropzone is moved\n * - `drop` when a draggable is dropped into this dropzone\n *\n * Use the `accept` option to allow only elements that match the given CSS\n * selector or element. The value can be:\n *\n * - **an Element** - only that element can be dropped into this dropzone.\n * - **a string**, - the element being dragged must match it as a CSS selector.\n * - **`null`** - accept options is cleared - it accepts any element.\n *\n * Use the `overlap` option to set how drops are checked for. The allowed\n * values are:\n *\n * - `'pointer'`, the pointer must be over the dropzone (default)\n * - `'center'`, the draggable element's center must be over the dropzone\n * - a number from 0-1 which is the `(intersection area) / (draggable area)`.\n * e.g. `0.5` for drop to happen when half of the area of the draggable is\n * over the dropzone\n *\n * Use the `checker` option to specify a function to check if a dragged\n * element is over this Interactable.\n *\n | interact(target)\n | .dropChecker(function(dragEvent, // related dragmove or dragend event\n | event, // TouchEvent/PointerEvent/MouseEvent\n | dropped, // bool result of the default checker\n | dropzone, // dropzone Interactable\n | dropElement, // dropzone elemnt\n | draggable, // draggable Interactable\n | draggableElement) {// draggable element\n |\n | return dropped && event.target.hasAttribute('allow-drop');\n | }\n *\n *\n - options (boolean | object | null) #optional The new value to be set.\n | interact('.drop').dropzone({\n | accept: '.can-drop' || document.getElementById('single-drop'),\n | overlap: 'pointer' || 'center' || zeroToOne\n | }\n = (boolean | object) The current setting or this Interactable\n\\*/\nInteractable.prototype.dropzone = function (options) {\n if (utils.is.object(options)) {\n this.options.drop.enabled = options.enabled === false? false: true;\n\n if (utils.is.function(options.ondrop) ) { this.events.ondrop = options.ondrop ; }\n if (utils.is.function(options.ondropactivate) ) { this.events.ondropactivate = options.ondropactivate ; }\n if (utils.is.function(options.ondropdeactivate)) { this.events.ondropdeactivate = options.ondropdeactivate; }\n if (utils.is.function(options.ondragenter) ) { this.events.ondragenter = options.ondragenter ; }\n if (utils.is.function(options.ondragleave) ) { this.events.ondragleave = options.ondragleave ; }\n if (utils.is.function(options.ondropmove) ) { this.events.ondropmove = options.ondropmove ; }\n\n if (/^(pointer|center)$/.test(options.overlap)) {\n this.options.drop.overlap = options.overlap;\n }\n else if (utils.is.number(options.overlap)) {\n this.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0);\n }\n if ('accept' in options) {\n this.options.drop.accept = options.accept;\n }\n if ('checker' in options) {\n this.options.drop.checker = options.checker;\n }\n\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drop.enabled = options;\n\n if (!options) {\n this.ondragenter = this.ondragleave = this.ondrop\n = this.ondropactivate = this.ondropdeactivate = null;\n }\n\n return this;\n }\n\n return this.options.drop;\n};\n\nInteractable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) {\n let dropped = false;\n\n // if the dropzone has no rect (eg. display: none)\n // call the custom dropChecker or just return false\n if (!(rect = rect || this.getRect(dropElement))) {\n return (this.options.drop.checker\n ? this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement)\n : false);\n }\n\n const dropOverlap = this.options.drop.overlap;\n\n if (dropOverlap === 'pointer') {\n const origin = utils.getOriginXY(draggable, draggableElement, 'drag');\n const page = utils.getPageXY(dragEvent);\n\n page.x += origin.x;\n page.y += origin.y;\n\n const horizontal = (page.x > rect.left) && (page.x < rect.right);\n const vertical = (page.y > rect.top ) && (page.y < rect.bottom);\n\n dropped = horizontal && vertical;\n }\n\n const dragRect = draggable.getRect(draggableElement);\n\n if (dragRect && dropOverlap === 'center') {\n const cx = dragRect.left + dragRect.width / 2;\n const cy = dragRect.top + dragRect.height / 2;\n\n dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom;\n }\n\n if (dragRect && utils.is.number(dropOverlap)) {\n const overlapArea = (Math.max(0, Math.min(rect.right , dragRect.right ) - Math.max(rect.left, dragRect.left))\n * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top , dragRect.top )));\n\n const overlapRatio = overlapArea / (dragRect.width * dragRect.height);\n\n dropped = overlapRatio >= dropOverlap;\n }\n\n if (this.options.drop.checker) {\n dropped = this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement);\n }\n\n return dropped;\n};\n\nInteractable.signals.on('unset', function ({ interactable }) {\n interactable.dropzone(false);\n});\n\nInteractable.settingsMethods.push('dropChecker');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.dropTarget = null; // the dropzone a drag target might be dropped into\n interaction.dropElement = null; // the element at the time of checking\n interaction.prevDropTarget = null; // the dropzone that was recently dragged away from\n interaction.prevDropElement = null; // the element at the time of checking\n interaction.dropEvents = null; // the dropEvents related to the current drag event\n\n interaction.activeDrops = {\n dropzones: [], // the dropzones that are mentioned below\n elements : [], // elements of dropzones that accept the target draggable\n rects : [], // the rects of the elements mentioned above\n };\n\n});\n\nInteraction.signals.on('stop', function ({ interaction }) {\n interaction.dropTarget = interaction.dropElement =\n interaction.prevDropTarget = interaction.prevDropElement = null;\n});\n\n/*\\\n * interact.dynamicDrop\n [ method ]\n *\n * Returns or sets whether the dimensions of dropzone elements are\n * calculated on every dragmove or only on dragstart for the default\n * dropChecker\n *\n - newValue (boolean) #optional True to check on each move. False to check only before start\n = (boolean | interact) The current setting or interact\n\\*/\ninteract.dynamicDrop = function (newValue) {\n if (utils.is.bool(newValue)) {\n //if (dragging && dynamicDrop !== newValue && !newValue) {\n //calcRects(dropzones);\n //}\n\n dynamicDrop = newValue;\n\n return interact;\n }\n return dynamicDrop;\n};\n\nutils.merge(Interactable.eventTypes, [\n 'dragenter',\n 'dragleave',\n 'dropactivate',\n 'dropdeactivate',\n 'dropmove',\n 'drop',\n]);\nactions.methodDict.drop = 'dropzone';\n\ndefaultOptions.drop = drop.defaults;\n\nmodule.exports = drop;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst gesture = {\n defaults: {\n enabled : false,\n origin : null,\n restrict: null,\n },\n\n checker: function (pointer, event, interactable, element, interaction) {\n if (interaction.pointerIds.length >= 2) {\n return { name: 'gesture' };\n }\n\n return null;\n },\n\n getCursor: function () {\n return '';\n },\n};\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturestart') { return; }\n iEvent.ds = 0;\n\n interaction.gesture.startDistance = interaction.gesture.prevDistance = iEvent.distance;\n interaction.gesture.startAngle = interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.scale = 1;\n});\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturemove') { return; }\n\n iEvent.ds = iEvent.scale - interaction.gesture.scale;\n\n interaction.target.fire(iEvent);\n\n interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.prevDistance = iEvent.distance;\n\n if (iEvent.scale !== Infinity\n && iEvent.scale !== null\n && iEvent.scale !== undefined\n && !isNaN(iEvent.scale)) {\n\n interaction.gesture.scale = iEvent.scale;\n }\n});\n\n/*\\\n * Interactable.gesturable\n [ method ]\n *\n * Gets or sets whether multitouch gestures can be performed on the\n * Interactable's element\n *\n = (boolean) Indicates if this can be the target of gesture events\n | var isGestureable = interact(element).gesturable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on gesture events (makes the Interactable gesturable)\n = (object) this Interactable\n | interact(element).gesturable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // limit multiple gestures.\n | // See the explanation in @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n\\*/\nInteractable.prototype.gesturable = function (options) {\n if (utils.is.object(options)) {\n this.options.gesture.enabled = options.enabled === false? false: true;\n this.setPerAction('gesture', options);\n this.setOnEvents('gesture', options);\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.gesture.enabled = options;\n\n if (!options) {\n this.ongesturestart = this.ongesturestart = this.ongestureend = null;\n }\n\n return this;\n }\n\n return this.options.gesture;\n};\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action, event, starting, ending, deltaSource }) {\n if (action !== 'gesture') { return; }\n\n const pointers = interaction.pointers;\n\n iEvent.touches = [pointers[0], pointers[1]];\n\n if (starting) {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = 1;\n iEvent.ds = 0;\n iEvent.angle = utils.touchAngle(pointers, undefined, deltaSource);\n iEvent.da = 0;\n }\n else if (ending || event instanceof InteractEvent) {\n iEvent.distance = interaction.prevEvent.distance;\n iEvent.box = interaction.prevEvent.box;\n iEvent.scale = interaction.prevEvent.scale;\n iEvent.ds = iEvent.scale - 1;\n iEvent.angle = interaction.prevEvent.angle;\n iEvent.da = iEvent.angle - interaction.gesture.startAngle;\n }\n else {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = iEvent.distance / interaction.gesture.startDistance;\n iEvent.angle = utils.touchAngle(pointers, interaction.gesture.prevAngle, deltaSource);\n\n iEvent.ds = iEvent.scale - interaction.gesture.prevScale;\n iEvent.da = iEvent.angle - interaction.gesture.prevAngle;\n }\n});\n\nInteraction.signals.on('new', function (interaction) {\n interaction.gesture = {\n start: { x: 0, y: 0 },\n\n startDistance: 0, // distance between two touches of touchStart\n prevDistance : 0,\n distance : 0,\n\n scale: 1, // gesture.distance / gesture.startDistance\n\n startAngle: 0, // angle of line joining two touches\n prevAngle : 0, // angle of the previous gesture event\n };\n});\n\nactions.gesture = gesture;\nactions.names.push('gesture');\nutils.merge(Interactable.eventTypes, [\n 'gesturestart',\n 'gesturemove',\n 'gestureend',\n]);\nactions.methodDict.gesture = 'gesturable';\n\ndefaultOptions.gesture = gesture.defaults;\n\nmodule.exports = gesture;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\n// Less Precision with touch input\nconst defaultMargin = browser.supportsTouch || browser.supportsPointerEvent? 20: 10;\n\nconst resize = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n square: false,\n preserveAspectRatio: false,\n axis: 'xy',\n\n // use default margin\n margin: NaN,\n\n // object with props left, right, top, bottom which are\n // true/false values to resize when the pointer is over that edge,\n // CSS selectors to match the handles for each direction\n // or the Elements for each handle\n edges: null,\n\n // a value of 'none' will limit the resize rect to a minimum of 0x0\n // 'negate' will alow the rect to have negative width/height\n // 'reposition' will keep the width/height positive by swapping\n // the top and bottom edges and/or swapping the left and right edges\n invert: 'none',\n },\n\n checker: function (pointer, event, interactable, element, interaction, rect) {\n if (!rect) { return null; }\n\n const page = utils.extend({}, interaction.curCoords.page);\n const options = interactable.options;\n\n if (options.resize.enabled) {\n const resizeOptions = options.resize;\n const resizeEdges = { left: false, right: false, top: false, bottom: false };\n\n // if using resize.edges\n if (utils.is.object(resizeOptions.edges)) {\n for (const edge in resizeEdges) {\n resizeEdges[edge] = checkResizeEdge(edge,\n resizeOptions.edges[edge],\n page,\n interaction._eventTarget,\n element,\n rect,\n resizeOptions.margin || defaultMargin);\n }\n\n resizeEdges.left = resizeEdges.left && !resizeEdges.right;\n resizeEdges.top = resizeEdges.top && !resizeEdges.bottom;\n\n if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) {\n return {\n name: 'resize',\n edges: resizeEdges,\n };\n }\n }\n else {\n const right = options.resize.axis !== 'y' && page.x > (rect.right - defaultMargin);\n const bottom = options.resize.axis !== 'x' && page.y > (rect.bottom - defaultMargin);\n\n if (right || bottom) {\n return {\n name: 'resize',\n axes: (right? 'x' : '') + (bottom? 'y' : ''),\n };\n }\n }\n }\n\n return null;\n },\n\n cursors: (browser.isIe9OrOlder ? {\n x : 'e-resize',\n y : 's-resize',\n xy: 'se-resize',\n\n top : 'n-resize',\n left : 'w-resize',\n bottom : 's-resize',\n right : 'e-resize',\n topleft : 'se-resize',\n bottomright: 'se-resize',\n topright : 'ne-resize',\n bottomleft : 'ne-resize',\n } : {\n x : 'ew-resize',\n y : 'ns-resize',\n xy: 'nwse-resize',\n\n top : 'ns-resize',\n left : 'ew-resize',\n bottom : 'ns-resize',\n right : 'ew-resize',\n topleft : 'nwse-resize',\n bottomright: 'nwse-resize',\n topright : 'nesw-resize',\n bottomleft : 'nesw-resize',\n }),\n\n getCursor: function (action) {\n if (action.axis) {\n return resize.cursors[action.name + action.axis];\n }\n else if (action.edges) {\n let cursorKey = '';\n const edgeNames = ['top', 'bottom', 'left', 'right'];\n\n for (let i = 0; i < 4; i++) {\n if (action.edges[edgeNames[i]]) {\n cursorKey += edgeNames[i];\n }\n }\n\n return resize.cursors[cursorKey];\n }\n },\n};\n\n// resizestart\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'resizestart' || !interaction.prepared.edges) {\n return;\n }\n\n const startRect = interaction.target.getRect(interaction.element);\n const resizeOptions = interaction.target.options.resize;\n\n /*\n * When using the `resizable.square` or `resizable.preserveAspectRatio` options, resizing from one edge\n * will affect another. E.g. with `resizable.square`, resizing to make the right edge larger will make\n * the bottom edge larger by the same amount. We call these 'linked' edges. Any linked edges will depend\n * on the active edges and the edge being interacted with.\n */\n if (resizeOptions.square || resizeOptions.preserveAspectRatio) {\n const linkedEdges = utils.extend({}, interaction.prepared.edges);\n\n linkedEdges.top = linkedEdges.top || (linkedEdges.left && !linkedEdges.bottom);\n linkedEdges.left = linkedEdges.left || (linkedEdges.top && !linkedEdges.right );\n linkedEdges.bottom = linkedEdges.bottom || (linkedEdges.right && !linkedEdges.top );\n linkedEdges.right = linkedEdges.right || (linkedEdges.bottom && !linkedEdges.left );\n\n interaction.prepared._linkedEdges = linkedEdges;\n }\n else {\n interaction.prepared._linkedEdges = null;\n }\n\n // if using `resizable.preserveAspectRatio` option, record aspect ratio at the start of the resize\n if (resizeOptions.preserveAspectRatio) {\n interaction.resizeStartAspectRatio = startRect.width / startRect.height;\n }\n\n interaction.resizeRects = {\n start : startRect,\n current : utils.extend({}, startRect),\n inverted : utils.extend({}, startRect),\n previous : utils.extend({}, startRect),\n delta : {\n left: 0, right : 0, width : 0,\n top : 0, bottom: 0, height: 0,\n },\n };\n\n iEvent.rect = interaction.resizeRects.inverted;\n iEvent.deltaRect = interaction.resizeRects.delta;\n});\n\n// resizemove\nInteractEvent.signals.on('new', function ({ iEvent, phase, interaction }) {\n if (phase !== 'move' || !interaction.prepared.edges) { return; }\n\n const resizeOptions = interaction.target.options.resize;\n const invert = resizeOptions.invert;\n const invertible = invert === 'reposition' || invert === 'negate';\n\n let edges = interaction.prepared.edges;\n\n const start = interaction.resizeRects.start;\n const current = interaction.resizeRects.current;\n const inverted = interaction.resizeRects.inverted;\n const delta = interaction.resizeRects.delta;\n const previous = utils.extend(interaction.resizeRects.previous, inverted);\n const originalEdges = edges;\n\n let dx = iEvent.dx;\n let dy = iEvent.dy;\n\n if (resizeOptions.preserveAspectRatio || resizeOptions.square) {\n // `resize.preserveAspectRatio` takes precedence over `resize.square`\n const startAspectRatio = resizeOptions.preserveAspectRatio\n ? interaction.resizeStartAspectRatio\n : 1;\n\n edges = interaction.prepared._linkedEdges;\n\n if ((originalEdges.left && originalEdges.bottom)\n || (originalEdges.right && originalEdges.top)) {\n dy = -dx / startAspectRatio;\n }\n else if (originalEdges.left || originalEdges.right ) { dy = dx / startAspectRatio; }\n else if (originalEdges.top || originalEdges.bottom) { dx = dy * startAspectRatio; }\n }\n\n // update the 'current' rect without modifications\n if (edges.top ) { current.top += dy; }\n if (edges.bottom) { current.bottom += dy; }\n if (edges.left ) { current.left += dx; }\n if (edges.right ) { current.right += dx; }\n\n if (invertible) {\n // if invertible, copy the current rect\n utils.extend(inverted, current);\n\n if (invert === 'reposition') {\n // swap edge values if necessary to keep width/height positive\n let swap;\n\n if (inverted.top > inverted.bottom) {\n swap = inverted.top;\n\n inverted.top = inverted.bottom;\n inverted.bottom = swap;\n }\n if (inverted.left > inverted.right) {\n swap = inverted.left;\n\n inverted.left = inverted.right;\n inverted.right = swap;\n }\n }\n }\n else {\n // if not invertible, restrict to minimum of 0x0 rect\n inverted.top = Math.min(current.top, start.bottom);\n inverted.bottom = Math.max(current.bottom, start.top);\n inverted.left = Math.min(current.left, start.right);\n inverted.right = Math.max(current.right, start.left);\n }\n\n inverted.width = inverted.right - inverted.left;\n inverted.height = inverted.bottom - inverted.top ;\n\n for (const edge in inverted) {\n delta[edge] = inverted[edge] - previous[edge];\n }\n\n iEvent.edges = interaction.prepared.edges;\n iEvent.rect = inverted;\n iEvent.deltaRect = delta;\n});\n\n/*\\\n * Interactable.resizable\n [ method ]\n *\n * Gets or sets whether resize actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of resize elements\n | var isResizeable = interact('input[type=text]').resizable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on resize events (object makes the Interactable resizable)\n = (object) This Interactable\n | interact(element).resizable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | edges: {\n | top : true, // Use pointer coords to check for resize.\n | left : false, // Disable resizing from left edge.\n | bottom: '.resize-s',// Resize if pointer target matches selector\n | right : handleEl // Resize if pointer target is the given Element\n | },\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height are adjusted at a 1:1 ratio.\n | square: false,\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height maintain the aspect ratio they had when resizing started.\n | preserveAspectRatio: false,\n |\n | // a value of 'none' will limit the resize rect to a minimum of 0x0\n | // 'negate' will allow the rect to have negative width/height\n | // 'reposition' will keep the width/height positive by swapping\n | // the top and bottom edges and/or swapping the left and right edges\n | invert: 'none' || 'negate' || 'reposition'\n |\n | // limit multiple resizes.\n | // See the explanation in the @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n \\*/\nInteractable.prototype.resizable = function (options) {\n if (utils.is.object(options)) {\n this.options.resize.enabled = options.enabled === false? false: true;\n this.setPerAction('resize', options);\n this.setOnEvents('resize', options);\n\n if (/^x$|^y$|^xy$/.test(options.axis)) {\n this.options.resize.axis = options.axis;\n }\n else if (options.axis === null) {\n this.options.resize.axis = defaultOptions.resize.axis;\n }\n\n if (utils.is.bool(options.preserveAspectRatio)) {\n this.options.resize.preserveAspectRatio = options.preserveAspectRatio;\n }\n else if (utils.is.bool(options.square)) {\n this.options.resize.square = options.square;\n }\n\n return this;\n }\n if (utils.is.bool(options)) {\n this.options.resize.enabled = options;\n\n if (!options) {\n this.onresizestart = this.onresizestart = this.onresizeend = null;\n }\n\n return this;\n }\n return this.options.resize;\n};\n\nfunction checkResizeEdge (name, value, page, element, interactableElement, rect, margin) {\n // false, '', undefined, null\n if (!value) { return false; }\n\n // true value, use pointer coords and element rect\n if (value === true) {\n // if dimensions are negative, \"switch\" edges\n const width = utils.is.number(rect.width )? rect.width : rect.right - rect.left;\n const height = utils.is.number(rect.height)? rect.height : rect.bottom - rect.top ;\n\n if (width < 0) {\n if (name === 'left' ) { name = 'right'; }\n else if (name === 'right') { name = 'left' ; }\n }\n if (height < 0) {\n if (name === 'top' ) { name = 'bottom'; }\n else if (name === 'bottom') { name = 'top' ; }\n }\n\n if (name === 'left' ) { return page.x < ((width >= 0? rect.left: rect.right ) + margin); }\n if (name === 'top' ) { return page.y < ((height >= 0? rect.top : rect.bottom) + margin); }\n\n if (name === 'right' ) { return page.x > ((width >= 0? rect.right : rect.left) - margin); }\n if (name === 'bottom') { return page.y > ((height >= 0? rect.bottom: rect.top ) - margin); }\n }\n\n // the remaining checks require an element\n if (!utils.is.element(element)) { return false; }\n\n return utils.is.element(value)\n // the value is an element to use as a resize handle\n ? value === element\n // otherwise check if element matches value as selector\n : utils.matchesUpTo(element, value, interactableElement);\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.resizeAxes = 'xy';\n});\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action }) {\n if (action !== 'resize' || !interaction.resizeAxes) { return; }\n\n const options = interaction.target.options;\n\n if (options.resize.square) {\n if (interaction.resizeAxes === 'y') {\n iEvent.dx = iEvent.dy;\n }\n else {\n iEvent.dy = iEvent.dx;\n }\n iEvent.axes = 'xy';\n }\n else {\n iEvent.axes = interaction.resizeAxes;\n\n if (interaction.resizeAxes === 'x') {\n iEvent.dy = 0;\n }\n else if (interaction.resizeAxes === 'y') {\n iEvent.dx = 0;\n }\n }\n});\n\nactions.resize = resize;\nactions.names.push('resize');\nutils.merge(Interactable.eventTypes, [\n 'resizestart',\n 'resizemove',\n 'resizeinertiastart',\n 'resizeinertiaresume',\n 'resizeend',\n]);\nactions.methodDict.resize = 'resizable';\n\ndefaultOptions.resize = resize.defaults;\n\nmodule.exports = resize;\n","const raf = require('./utils/raf');\nconst getWindow = require('./utils/window').getWindow;\nconst is = require('./utils/is');\nconst domUtils = require('./utils/domUtils');\nconst Interaction = require('./Interaction');\nconst defaultOptions = require('./defaultOptions');\n\nconst autoScroll = {\n defaults: {\n enabled : false,\n container: null, // the item that is scrolled (Window or HTMLElement)\n margin : 60,\n speed : 300, // the scroll speed in pixels per second\n },\n\n interaction: null,\n i: null, // the handle returned by window.setInterval\n x: 0, y: 0, // Direction each pulse is to scroll in\n\n isScrolling: false,\n prevTime: 0,\n\n start: function (interaction) {\n autoScroll.isScrolling = true;\n raf.cancel(autoScroll.i);\n\n autoScroll.interaction = interaction;\n autoScroll.prevTime = new Date().getTime();\n autoScroll.i = raf.request(autoScroll.scroll);\n },\n\n stop: function () {\n autoScroll.isScrolling = false;\n raf.cancel(autoScroll.i);\n },\n\n // scroll the window by the values in scroll.x/y\n scroll: function () {\n const options = autoScroll.interaction.target.options[autoScroll.interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(autoScroll.interaction.element);\n const now = new Date().getTime();\n // change in time in seconds\n const dt = (now - autoScroll.prevTime) / 1000;\n // displacement\n const s = options.speed * dt;\n\n if (s >= 1) {\n if (is.window(container)) {\n container.scrollBy(autoScroll.x * s, autoScroll.y * s);\n }\n else if (container) {\n container.scrollLeft += autoScroll.x * s;\n container.scrollTop += autoScroll.y * s;\n }\n\n autoScroll.prevTime = now;\n }\n\n if (autoScroll.isScrolling) {\n raf.cancel(autoScroll.i);\n autoScroll.i = raf.request(autoScroll.scroll);\n }\n },\n check: function (interactable, actionName) {\n const options = interactable.options;\n\n return options[actionName].autoScroll && options[actionName].autoScroll.enabled;\n },\n onInteractionMove: function ({ interaction, pointer }) {\n if (!(interaction.interacting()\n && autoScroll.check(interaction.target, interaction.prepared.name))) {\n return;\n }\n\n if (interaction.simulation) {\n autoScroll.x = autoScroll.y = 0;\n return;\n }\n\n let top;\n let right;\n let bottom;\n let left;\n\n const options = interaction.target.options[interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(interaction.element);\n\n if (is.window(container)) {\n left = pointer.clientX < autoScroll.margin;\n top = pointer.clientY < autoScroll.margin;\n right = pointer.clientX > container.innerWidth - autoScroll.margin;\n bottom = pointer.clientY > container.innerHeight - autoScroll.margin;\n }\n else {\n const rect = domUtils.getElementClientRect(container);\n\n left = pointer.clientX < rect.left + autoScroll.margin;\n top = pointer.clientY < rect.top + autoScroll.margin;\n right = pointer.clientX > rect.right - autoScroll.margin;\n bottom = pointer.clientY > rect.bottom - autoScroll.margin;\n }\n\n autoScroll.x = (right ? 1: left? -1: 0);\n autoScroll.y = (bottom? 1: top? -1: 0);\n\n if (!autoScroll.isScrolling) {\n // set the autoScroll properties to those of the target\n autoScroll.margin = options.margin;\n autoScroll.speed = options.speed;\n\n autoScroll.start(interaction);\n }\n },\n};\n\nInteraction.signals.on('stop-active', function () {\n autoScroll.stop();\n});\n\nInteraction.signals.on('action-move', autoScroll.onInteractionMove);\n\ndefaultOptions.perAction.autoScroll = autoScroll.defaults;\n\nmodule.exports = autoScroll;\n","const Interactable = require('../Interactable');\nconst actions = require('../actions/base');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.ignoreFrom\n [ method ]\n *\n * If the target of the `mousedown`, `pointerdown` or `touchstart`\n * event or any of it's parents match the given CSS selector or\n * Element, no drag/resize/gesture is started.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to not ignore any elements\n = (string | Element | object) The current ignoreFrom value or this Interactable\n **\n | interact(element, { ignoreFrom: document.getElementById('no-action') });\n | // or\n | interact(element).ignoreFrom('input, textarea, a');\n\\*/\nInteractable.prototype.ignoreFrom = function (newValue) {\n return this._backCompatOption('ignoreFrom', newValue);\n};\n\n/*\\\n * Interactable.allowFrom\n [ method ]\n *\n * A drag/resize/gesture is started only If the target of the\n * `mousedown`, `pointerdown` or `touchstart` event or any of it's\n * parents match the given CSS selector or Element.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to allow from any element\n = (string | Element | object) The current allowFrom value or this Interactable\n **\n | interact(element, { allowFrom: document.getElementById('drag-handle') });\n | // or\n | interact(element).allowFrom('.handle');\n\\*/\nInteractable.prototype.allowFrom = function (newValue) {\n return this._backCompatOption('allowFrom', newValue);\n};\n\nInteractable.prototype.testIgnore = function (ignoreFrom, interactableElement, element) {\n if (!ignoreFrom || !is.element(element)) { return false; }\n\n if (is.string(ignoreFrom)) {\n return domUtils.matchesUpTo(element, ignoreFrom, interactableElement);\n }\n else if (is.element(ignoreFrom)) {\n return domUtils.nodeContains(ignoreFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testAllow = function (allowFrom, interactableElement, element) {\n if (!allowFrom) { return true; }\n\n if (!is.element(element)) { return false; }\n\n if (is.string(allowFrom)) {\n return domUtils.matchesUpTo(element, allowFrom, interactableElement);\n }\n else if (is.element(allowFrom)) {\n return domUtils.nodeContains(allowFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testIgnoreAllow = function (options, interactableElement, eventTarget) {\n return (!this.testIgnore(options.ignoreFrom, interactableElement, eventTarget)\n && this.testAllow(options.allowFrom, interactableElement, eventTarget));\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (event.buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\n","const interact = require('../interact');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst actions = require('../actions/base');\nconst defaultOptions = require('../defaultOptions');\nconst browser = require('../utils/browser');\nconst scope = require('../scope');\nconst utils = require('../utils');\nconst signals = require('../utils/Signals').new();\n\nrequire('./InteractableMethods');\n\nconst autoStart = {\n signals,\n withinInteractionLimit,\n // Allow this many interactions to happen simultaneously\n maxInteractions: Infinity,\n defaults: {\n perAction: {\n manualStart: false,\n max: Infinity,\n maxPerElement: 1,\n allowFrom: null,\n ignoreFrom: null,\n },\n },\n setActionDefaults: function (action) {\n utils.extend(action.defaults, autoStart.defaults.perAction);\n },\n};\n\n// set cursor style on mousedown\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget }) {\n if (interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\n// set cursor style on mousemove\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget }) {\n if (!interaction.mouse\n || interaction.pointerIsDown\n || interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\nInteraction.signals.on('move', function (arg) {\n const { interaction, event } = arg;\n\n if (!interaction.pointerIsDown\n || interaction.interacting()\n || !interaction.pointerWasMoved\n || !interaction.prepared.name) {\n return;\n }\n\n signals.fire('before-start', arg);\n\n const target = interaction.target;\n\n if (interaction.prepared.name && target) {\n // check manualStart and interaction limit\n if (target.options[interaction.prepared.name].manualStart\n || !withinInteractionLimit(target, interaction.element, interaction.prepared)) {\n interaction.stop(event);\n }\n else {\n interaction.start(interaction.prepared, target, interaction.element);\n }\n }\n});\n\n// Check if the current target supports the action.\n// If so, return the validated action. Otherwise, return null\nfunction validateAction (action, interactable, element, eventTarget) {\n if (utils.is.object(action)\n && interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget)\n && interactable.options[action.name].enabled\n && withinInteractionLimit(interactable, element, action)) {\n return action;\n }\n\n return null;\n}\n\nfunction validateSelector (interaction, pointer, event, matches, matchElements, eventTarget) {\n for (let i = 0, len = matches.length; i < len; i++) {\n const match = matches[i];\n const matchElement = matchElements[i];\n const action = validateAction(match.getAction(pointer, event, interaction, matchElement),\n match,\n matchElement,\n eventTarget);\n\n if (action) {\n return {\n action,\n target: match,\n element: matchElement,\n };\n }\n }\n\n return {};\n}\n\nfunction getActionInfo (interaction, pointer, event, eventTarget) {\n let matches = [];\n let matchElements = [];\n\n let element = eventTarget;\n let action = null;\n\n function pushMatches (interactable, selector, context) {\n const elements = (browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined);\n\n if (utils.matchesSelector(element, selector, elements)) {\n\n matches.push(interactable);\n matchElements.push(element);\n }\n }\n\n while (utils.is.element(element)) {\n matches = [];\n matchElements = [];\n\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && (action = validateAction(elementInteractable.getAction(pointer, event, interaction, element, eventTarget),\n elementInteractable,\n element,\n eventTarget))\n && !elementInteractable.options[action.name].manualStart) {\n return {\n element,\n action,\n target: elementInteractable,\n };\n }\n else {\n scope.interactables.forEachSelector(pushMatches, element);\n\n const actionInfo = validateSelector(interaction, pointer, event, matches, matchElements, eventTarget);\n\n if (actionInfo.action\n && !actionInfo.target.options[actionInfo.action.name].manualStart) {\n return actionInfo;\n }\n }\n\n element = utils.parentNode(element);\n }\n\n return {};\n}\n\nfunction prepare (interaction, { action, target, element }) {\n action = action || {};\n\n if (interaction.target && interaction.target.options.styleCursor) {\n interaction.target._doc.documentElement.style.cursor = '';\n }\n\n interaction.target = target;\n interaction.element = element;\n utils.copyAction(interaction.prepared, action);\n\n if (target && target.options.styleCursor) {\n const cursor = action? actions[action.name].getCursor(action) : '';\n interaction.target._doc.documentElement.style.cursor = cursor;\n }\n\n signals.fire('prepared', { interaction: interaction });\n}\n\nInteraction.signals.on('stop', function ({ interaction }) {\n const target = interaction.target;\n\n if (target && target.options.styleCursor) {\n target._doc.documentElement.style.cursor = '';\n }\n});\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (utils.is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (utils.is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n const buttons = event.buttons || ({\n 0: 1,\n 1: 4,\n 3: 8,\n 4: 16,\n })[event.button];\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\nfunction withinInteractionLimit (interactable, element, action) {\n const options = interactable.options;\n const maxActions = options[action.name].max;\n const maxPerElement = options[action.name].maxPerElement;\n let activeInteractions = 0;\n let targetCount = 0;\n let targetElementCount = 0;\n\n // no actions if any of these values == 0\n if (!(maxActions && maxPerElement && autoStart.maxInteractions)) { return; }\n\n for (let i = 0, len = scope.interactions.length; i < len; i++) {\n const interaction = scope.interactions[i];\n const otherAction = interaction.prepared.name;\n\n if (!interaction.interacting()) { continue; }\n\n activeInteractions++;\n\n if (activeInteractions >= autoStart.maxInteractions) {\n return false;\n }\n\n if (interaction.target !== interactable) { continue; }\n\n targetCount += (otherAction === action.name)|0;\n\n if (targetCount >= maxActions) {\n return false;\n }\n\n if (interaction.element === element) {\n targetElementCount++;\n\n if (otherAction !== action.name || targetElementCount >= maxPerElement) {\n return false;\n }\n }\n }\n\n return autoStart.maxInteractions > 0;\n}\n\n/*\\\n * interact.maxInteractions\n [ method ]\n **\n * Returns or sets the maximum number of concurrent interactions allowed.\n * By default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables\n * and elements, you need to enable it in the draggable, resizable and\n * gesturable `'max'` and `'maxPerElement'` options.\n **\n - newValue (number) #optional Any number. newValue <= 0 means no interactions.\n\\*/\ninteract.maxInteractions = function (newValue) {\n if (utils.is.number(newValue)) {\n autoStart.maxInteractions = newValue;\n\n return this;\n }\n\n return autoStart.maxInteractions;\n};\n\nInteractable.settingsMethods.push('styleCursor');\nInteractable.settingsMethods.push('actionChecker');\nInteractable.settingsMethods.push('ignoreFrom');\nInteractable.settingsMethods.push('allowFrom');\n\ndefaultOptions.base.actionChecker = null;\ndefaultOptions.base.styleCursor = true;\n\nutils.extend(defaultOptions.perAction, autoStart.defaults.perAction);\n\nmodule.exports = autoStart;\n","const autoStart = require('./base');\nconst Interaction = require('../Interaction');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.delayTimer = null;\n});\n\nautoStart.signals.on('prepared', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.delayTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.target, interaction.element);\n }, delay);\n }\n});\n\nInteraction.signals.on('move', function ({ interaction, duplicate }) {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.delayTimer);\n }\n});\n\n// prevent regular down->move autoStart\nautoStart.signals.on('before-start', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.prepared.name = null;\n }\n});\n","const autoStart = require('./base');\nconst scope = require('../scope');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\n\nconst { matchesSelector, parentNode } = require('../utils/domUtils');\n\nautoStart.setActionDefaults(require('../actions/drag'));\n\nautoStart.signals.on('before-start', function ({ interaction, eventTarget, dx, dy }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // check if a drag is in the correct axis\n const absX = Math.abs(dx);\n const absY = Math.abs(dy);\n const options = interaction.target.options.drag;\n const startAxis = options.startAxis;\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy');\n\n interaction.prepared.axis = options.lockAxis === 'start'\n ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n : options.lockAxis;\n\n // if the movement isn't in the startAxis of the interactable\n if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) {\n // cancel the prepared action\n interaction.prepared.name = null;\n\n // then try to get a drag from another ineractable\n\n if (!interaction.prepared.name) {\n\n let element = eventTarget;\n\n const getDraggable = function (interactable, selector, context) {\n const elements = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n if (interactable === interaction.target) { return; }\n\n if (!options.manualStart\n && !interactable.testIgnoreAllow(options, element, eventTarget)\n && matchesSelector(element, selector, elements)) {\n\n const action = interactable.getAction(interaction.downPointer,\n interaction.downEvent,\n interaction,\n element);\n\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, interactable)\n && autoStart.validateAction(action, interactable, element, eventTarget)) {\n\n return interactable;\n }\n }\n };\n\n let action = null;\n\n // check all interactables\n while (is.element(element)) {\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && elementInteractable !== interaction.target\n && !elementInteractable.options.drag.manualStart) {\n\n action = elementInteractable.getAction(interaction.downPointer, interaction.downEvent, interaction, element);\n }\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, elementInteractable)) {\n\n interaction.prepared.name = 'drag';\n interaction.target = elementInteractable;\n interaction.element = element;\n break;\n }\n\n const selectorInteractable = scope.interactables.forEachSelector(getDraggable, element);\n\n if (selectorInteractable) {\n interaction.prepared.name = 'drag';\n interaction.target = selectorInteractable;\n interaction.element = element;\n break;\n }\n\n element = parentNode(element);\n }\n }\n }\n});\n\nfunction checkStartAxis (startAxis, interactable) {\n if (!interactable) { return false; }\n\n const thisAxis = interactable.options.drag.startAxis;\n\n return (startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis);\n}\n","require('./base').setActionDefaults(require('../actions/gesture'));\n","require('./base').setActionDefaults(require('../actions/resize'));\n","module.exports = {\n base: {\n accept : null,\n preventDefault: 'auto',\n deltaSource : 'page',\n },\n\n perAction: {\n origin: { x: 0, y: 0 },\n\n // only allow left button by default\n // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n mouseButtons: 1,\n\n inertia: {\n enabled : false,\n resistance : 10, // the lambda in exponential decay\n minSpeed : 100, // target speed must be above this for inertia to start\n endSpeed : 10, // the speed at which inertia is slow enough to stop\n allowResume : true, // allow resuming an action in inertia phase\n smoothEndDuration: 300, // animate to snap/restrict endOnly if there's no inertia\n },\n },\n};\n","/* browser entry point */\n\n// Legacy browser support\nrequire('./legacyBrowsers');\n\n// inertia\nrequire('./inertia');\n\n// modifiers\nrequire('./modifiers/snap');\nrequire('./modifiers/restrict');\n\n// pointerEvents\nrequire('./pointerEvents/base');\nrequire('./pointerEvents/holdRepeat');\nrequire('./pointerEvents/interactableTargets');\n\n// delay\nrequire('./autoStart/delay');\n\n// actions\nrequire('./actions/gesture');\nrequire('./actions/resize');\nrequire('./actions/drag');\nrequire('./actions/drop');\n\n// load these modifiers after resize is loaded\nrequire('./modifiers/snapSize');\nrequire('./modifiers/restrictEdges');\nrequire('./modifiers/restrictSize');\n\n// autoStart actions\nrequire('./autoStart/gesture');\nrequire('./autoStart/resize');\nrequire('./autoStart/drag');\n\n// Interactable preventDefault setting\nrequire('./interactablePreventDefault.js');\n\n// autoScroll\nrequire('./autoScroll');\n\n// export interact\nmodule.exports = require('./interact');\n","const InteractEvent = require('./InteractEvent');\nconst Interaction = require('./Interaction');\nconst modifiers = require('./modifiers');\nconst utils = require('./utils');\nconst animationFrame = require('./utils/raf');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.inertiaStatus = {\n active : false,\n smoothEnd : false,\n allowResume: false,\n\n startEvent: null,\n upCoords : {},\n\n xe: 0, ye: 0,\n sx: 0, sy: 0,\n\n t0: 0,\n vx0: 0, vys: 0,\n duration: 0,\n\n lambda_v0: 0,\n one_ve_v0: 0,\n i : null,\n };\n\n interaction.boundInertiaFrame = () => inertiaFrame .apply(interaction);\n interaction.boundSmoothEndFrame = () => smoothEndFrame.apply(interaction);\n});\n\nInteraction.signals.on('down', function ({ interaction, event, pointer, eventTarget }) {\n const status = interaction.inertiaStatus;\n\n // Check if the down event hits the current inertia target\n if (status.active) {\n let element = eventTarget;\n\n // climb up the DOM tree from the event target\n while (utils.is.element(element)) {\n\n // if interaction element is the current inertia target element\n if (element === interaction.element) {\n // stop inertia\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n\n // update pointers to the down event's coordinates\n interaction.updatePointer(pointer);\n utils.setCoords(interaction.curCoords, interaction.pointers);\n\n // fire appropriate signals\n const signalArg = { interaction };\n Interaction.signals.fire('before-action-move', signalArg);\n Interaction.signals.fire('action-resume' , signalArg);\n\n // fire a reume event\n const resumeEvent = new InteractEvent(interaction,\n event,\n interaction.prepared.name,\n 'inertiaresume',\n interaction.element);\n\n interaction.target.fire(resumeEvent);\n interaction.prevEvent = resumeEvent;\n modifiers.resetStatuses(interaction.modifierStatuses);\n\n utils.copyCoords(interaction.prevCoords, interaction.curCoords);\n break;\n }\n\n element = utils.parentNode(element);\n }\n }\n});\n\nInteraction.signals.on('up', function ({ interaction, event }) {\n const status = interaction.inertiaStatus;\n\n if (!interaction.interacting() || status.active) { return; }\n\n const target = interaction.target;\n const options = target && target.options;\n const inertiaOptions = options && interaction.prepared.name && options[interaction.prepared.name].inertia;\n\n const now = new Date().getTime();\n const statuses = {};\n const page = utils.extend({}, interaction.curCoords.page);\n const pointerSpeed = interaction.pointerDelta.client.speed;\n\n let smoothEnd = false;\n let modifierResult;\n\n // check if inertia should be started\n const inertiaPossible = (inertiaOptions && inertiaOptions.enabled\n && interaction.prepared.name !== 'gesture'\n && event !== status.startEvent);\n\n const inertia = (inertiaPossible\n && (now - interaction.curCoords.timeStamp) < 50\n && pointerSpeed > inertiaOptions.minSpeed\n && pointerSpeed > inertiaOptions.endSpeed);\n\n const modifierArg = {\n interaction,\n pageCoords: page,\n statuses,\n preEnd: true,\n requireEndOnly: true,\n };\n\n // smoothEnd\n if (inertiaPossible && !inertia) {\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n if (modifierResult.shouldMove && modifierResult.locked) {\n smoothEnd = true;\n }\n }\n\n if (!(inertia || smoothEnd)) { return; }\n\n utils.copyCoords(status.upCoords, interaction.curCoords);\n\n interaction.pointers[0] = status.startEvent =\n new InteractEvent(interaction, event, interaction.prepared.name, 'inertiastart', interaction.element);\n\n status.t0 = now;\n\n status.active = true;\n status.allowResume = inertiaOptions.allowResume;\n interaction.simulation = status;\n\n target.fire(status.startEvent);\n\n if (inertia) {\n status.vx0 = interaction.pointerDelta.client.vx;\n status.vy0 = interaction.pointerDelta.client.vy;\n status.v0 = pointerSpeed;\n\n calcInertia(interaction, status);\n\n utils.extend(page, interaction.curCoords.page);\n\n page.x += status.xe;\n page.y += status.ye;\n\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n status.modifiedXe += modifierResult.dx;\n status.modifiedYe += modifierResult.dy;\n\n status.i = animationFrame.request(interaction.boundInertiaFrame);\n }\n else {\n status.smoothEnd = true;\n status.xe = modifierResult.dx;\n status.ye = modifierResult.dy;\n\n status.sx = status.sy = 0;\n\n status.i = animationFrame.request(interaction.boundSmoothEndFrame);\n }\n});\n\nInteraction.signals.on('stop-active', function ({ interaction }) {\n const status = interaction.inertiaStatus;\n\n if (status.active) {\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n }\n});\n\nfunction calcInertia (interaction, status) {\n const inertiaOptions = interaction.target.options[interaction.prepared.name].inertia;\n const lambda = inertiaOptions.resistance;\n const inertiaDur = -Math.log(inertiaOptions.endSpeed / status.v0) / lambda;\n\n status.x0 = interaction.prevEvent.pageX;\n status.y0 = interaction.prevEvent.pageY;\n status.t0 = status.startEvent.timeStamp / 1000;\n status.sx = status.sy = 0;\n\n status.modifiedXe = status.xe = (status.vx0 - inertiaDur) / lambda;\n status.modifiedYe = status.ye = (status.vy0 - inertiaDur) / lambda;\n status.te = inertiaDur;\n\n status.lambda_v0 = lambda / status.v0;\n status.one_ve_v0 = 1 - inertiaOptions.endSpeed / status.v0;\n}\n\nfunction inertiaFrame () {\n updateInertiaCoords(this);\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n\n const status = this.inertiaStatus;\n const options = this.target.options[this.prepared.name].inertia;\n const lambda = options.resistance;\n const t = new Date().getTime() / 1000 - status.t0;\n\n if (t < status.te) {\n\n const progress = 1 - (Math.exp(-lambda * t) - status.lambda_v0) / status.one_ve_v0;\n\n if (status.modifiedXe === status.xe && status.modifiedYe === status.ye) {\n status.sx = status.xe * progress;\n status.sy = status.ye * progress;\n }\n else {\n const quadPoint = utils.getQuadraticCurvePoint(0, 0,\n status.xe,\n status.ye,\n status.modifiedXe,\n status.modifiedYe,\n progress);\n\n status.sx = quadPoint.x;\n status.sy = quadPoint.y;\n }\n\n this.doMove();\n\n status.i = animationFrame.request(this.boundInertiaFrame);\n }\n else {\n status.sx = status.modifiedXe;\n status.sy = status.modifiedYe;\n\n this.doMove();\n this.end(status.startEvent);\n status.active = false;\n this.simulation = null;\n }\n\n utils.copyCoords(this.prevCoords, this.curCoords);\n}\n\nfunction smoothEndFrame () {\n updateInertiaCoords(this);\n\n const status = this.inertiaStatus;\n const t = new Date().getTime() - status.t0;\n const duration = this.target.options[this.prepared.name].inertia.smoothEndDuration;\n\n if (t < duration) {\n status.sx = utils.easeOutQuad(t, 0, status.xe, duration);\n status.sy = utils.easeOutQuad(t, 0, status.ye, duration);\n\n this.pointerMove(status.startEvent, status.startEvent);\n\n status.i = animationFrame.request(this.boundSmoothEndFrame);\n }\n else {\n status.sx = status.xe;\n status.sy = status.ye;\n\n this.pointerMove(status.startEvent, status.startEvent);\n this.end(status.startEvent);\n\n status.smoothEnd =\n status.active = false;\n this.simulation = null;\n }\n}\n\nfunction updateInertiaCoords (interaction) {\n const status = interaction.inertiaStatus;\n\n // return if inertia isn't running\n if (!status.active) { return; }\n\n const pageUp = status.upCoords.page;\n const clientUp = status.upCoords.client;\n\n utils.setCoords(interaction.curCoords, [ {\n pageX : pageUp.x + status.sx,\n pageY : pageUp.y + status.sy,\n clientX: clientUp.x + status.sx,\n clientY: clientUp.y + status.sy,\n } ]);\n}\n","const browser = require('./utils/browser');\nconst events = require('./utils/events');\nconst utils = require('./utils');\nconst scope = require('./scope');\nconst Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\n\nconst globalEvents = {};\n\n/*\\\n * interact\n [ method ]\n *\n * The methods of this variable can be used to set elements as\n * interactables and also to change various default settings.\n *\n * Calling it as a function and passing an element or a valid CSS selector\n * string returns an Interactable object which has various methods to\n * configure it.\n *\n - element (Element | string) The HTML or SVG Element to interact with or CSS selector\n = (object) An @Interactable\n *\n > Usage\n | interact('#draggable').draggable(true);\n |\n | var rectables = interact('rect');\n | rectables\n | .gesturable(true)\n | .on('gesturemove', function (event) {\n | // ...\n | });\n\\*/\nfunction interact (element, options) {\n let interactable = scope.interactables.get(element, options);\n\n if (!interactable) {\n interactable = new Interactable(element, options);\n interactable.events.global = globalEvents;\n }\n\n return interactable;\n}\n\n/*\\\n * interact.isSet\n [ method ]\n *\n * Check if an element has been set\n - element (Element) The Element being searched for\n = (boolean) Indicates if the element or CSS selector was previously passed to interact\n\\*/\ninteract.isSet = function (element, options) {\n return scope.interactables.indexOfElement(element, options && options.context) !== -1;\n};\n\n/*\\\n * interact.on\n [ method ]\n *\n * Adds a global listener for an InteractEvent or adds a DOM event to\n * `document`\n *\n - type (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) interact\n\\*/\ninteract.on = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.on(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.on(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n // if it is an InteractEvent type, add listener to globalEvents\n if (utils.contains(Interactable.eventTypes, type)) {\n // if this type of event was never bound\n if (!globalEvents[type]) {\n globalEvents[type] = [listener];\n }\n else {\n globalEvents[type].push(listener);\n }\n }\n // If non InteractEvent type, addEventListener to document\n else {\n events.add(scope.document, type, listener, { options });\n }\n\n return interact;\n};\n\n/*\\\n * interact.off\n [ method ]\n *\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n - type (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) interact\n \\*/\ninteract.off = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.off(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.off(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n if (!utils.contains(Interactable.eventTypes, type)) {\n events.remove(scope.document, type, listener, options);\n }\n else {\n let index;\n\n if (type in globalEvents\n && (index = utils.indexOf(globalEvents[type], listener)) !== -1) {\n globalEvents[type].splice(index, 1);\n }\n }\n\n return interact;\n};\n\n/*\\\n * interact.debug\n [ method ]\n *\n * Returns an object which exposes internal data\n = (object) An object with properties that outline the current state and expose internal functions and variables\n\\*/\ninteract.debug = function () {\n return scope;\n};\n\n// expose the functions used to calculate multi-touch properties\ninteract.getPointerAverage = utils.pointerAverage;\ninteract.getTouchBBox = utils.touchBBox;\ninteract.getTouchDistance = utils.touchDistance;\ninteract.getTouchAngle = utils.touchAngle;\n\ninteract.getElementRect = utils.getElementRect;\ninteract.getElementClientRect = utils.getElementClientRect;\ninteract.matchesSelector = utils.matchesSelector;\ninteract.closest = utils.closest;\n\n/*\\\n * interact.supportsTouch\n [ method ]\n *\n = (boolean) Whether or not the browser supports touch input\n\\*/\ninteract.supportsTouch = function () {\n return browser.supportsTouch;\n};\n\n/*\\\n * interact.supportsPointerEvent\n [ method ]\n *\n = (boolean) Whether or not the browser supports PointerEvents\n\\*/\ninteract.supportsPointerEvent = function () {\n return browser.supportsPointerEvent;\n};\n\n/*\\\n * interact.stop\n [ method ]\n *\n * Cancels all interactions (end events are not fired)\n *\n - event (Event) An event on which to call preventDefault()\n = (object) interact\n\\*/\ninteract.stop = function (event) {\n for (let i = scope.interactions.length - 1; i >= 0; i--) {\n scope.interactions[i].stop(event);\n }\n\n return interact;\n};\n\n/*\\\n * interact.pointerMoveTolerance\n [ method ]\n * Returns or sets the distance the pointer must be moved before an action\n * sequence occurs. This also affects tolerance for tap events.\n *\n - newValue (number) #optional The movement from the start position must be greater than this value\n = (number | Interactable) The current setting or interact\n\\*/\ninteract.pointerMoveTolerance = function (newValue) {\n if (utils.is.number(newValue)) {\n Interaction.pointerMoveTolerance = newValue;\n\n return this;\n }\n\n return Interaction.pointerMoveTolerance;\n};\n\ninteract.addDocument = scope.addDocument;\ninteract.removeDocument = scope.removeDocument;\n\nscope.interact = interact;\n\nmodule.exports = interact;\n","const Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\nconst scope = require('./scope');\nconst is = require('./utils/is');\nconst events = require('./utils/events');\n\nconst { nodeContains, matchesSelector } = require('./utils/domUtils');\n\n/*\\\n * Interactable.preventDefault\n [ method ]\n *\n * Returns or sets whether to prevent the browser's default behaviour\n * in response to pointer events. Can be set to:\n * - `'always'` to always prevent\n * - `'never'` to never prevent\n * - `'auto'` to let interact.js try to determine what would be best\n *\n - newValue (string) #optional `true`, `false` or `'auto'`\n = (string | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.preventDefault = function (newValue) {\n if (/^(always|never|auto)$/.test(newValue)) {\n this.options.preventDefault = newValue;\n return this;\n }\n\n if (is.bool(newValue)) {\n this.options.preventDefault = newValue? 'always' : 'never';\n return this;\n }\n\n return this.options.preventDefault;\n};\n\nInteractable.prototype.checkAndPreventDefault = function (event) {\n const setting = this.options.preventDefault;\n\n if (setting === 'never') { return; }\n\n if (setting === 'always') {\n event.preventDefault();\n return;\n }\n\n // setting === 'auto'\n\n // don't preventDefault if the browser supports passiveEvents\n // CSS touch-action and user-selecct should be used instead\n if (events.supportsOptions) {\n return;\n }\n\n // don't preventDefault of pointerdown events\n if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) {\n return;\n }\n\n // don't preventDefault on editable elements\n if (is.element(event.target)\n && matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) {\n return;\n }\n\n event.preventDefault();\n};\n\nfunction onInteractionEvent ({ interaction, event }) {\n if (interaction.target) {\n interaction.target.checkAndPreventDefault(event);\n }\n}\n\nfor (const eventSignal of ['down', 'move', 'up', 'cancel']) {\n Interaction.signals.on(eventSignal, onInteractionEvent);\n}\n\n// prevent native HTML5 drag on interact.js target elements\nInteraction.docEvents.dragstart = function preventNativeDrag (event) {\n for (const interaction of scope.interactions) {\n\n if (interaction.element\n && (interaction.element === event.target\n || nodeContains(interaction.element, event.target))) {\n\n interaction.target.checkAndPreventDefault(event);\n return;\n }\n }\n};\n","const scope = require('./scope');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst iFinder = require('./utils/interactionFinder');\nconst pointerEvents = require('./pointerEvents/base');\n\nconst { window } = require('./utils/window');\n\nconst toString = Object.prototype.toString;\n\nif (!window.Array.isArray) {\n window.Array.isArray = function (obj) {\n return toString.call(obj) === '[object Array]';\n };\n}\n\nif (!String.prototype.trim) {\n String.prototype.trim = function () {\n return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n };\n}\n\n// http://www.quirksmode.org/dom/events/click.html\n// >Events leading to dblclick\n//\n// IE8 doesn't fire down event before dblclick.\n// This workaround tries to fire a tap and doubletap after dblclick\nfunction onIE8Dblclick (event) {\n const eventTarget = event.target;\n const interaction = iFinder.search(event, event.type, eventTarget);\n\n if (!interaction) { return; }\n\n if (interaction.prevTap\n && event.clientX === interaction.prevTap.clientX\n && event.clientY === interaction.prevTap.clientY\n && eventTarget === interaction.prevTap.target) {\n\n interaction.downTargets[0] = eventTarget;\n interaction.downTimes [0] = new Date().getTime();\n\n pointerEvents.fire({\n interaction,\n event,\n eventTarget,\n pointer: event,\n type: 'tap',\n });\n }\n}\n\nif (browser.isIE8) {\n const selectFix = function (event) {\n for (const interaction of scope.interactions) {\n if (interaction.interacting()) {\n interaction.target.checkAndPreventDefault(event);\n }\n }\n };\n\n const onDocIE8 = function onDocIE8 ({ doc, win }, signalName) {\n const eventMethod = signalName.indexOf('listen') === 0\n ? events.add : events.remove;\n\n // For IE's lack of Event#preventDefault\n eventMethod(doc, 'selectstart', selectFix);\n\n if (pointerEvents) {\n eventMethod(doc, 'dblclick', onIE8Dblclick);\n }\n };\n\n scope.signals.on('add-document' , onDocIE8);\n scope.signals.on('remove-document', onDocIE8);\n}\n\nmodule.exports = null;\n","const InteractEvent = require('../InteractEvent');\nconst Interaction = require('../Interaction');\nconst extend = require('../utils/extend');\n\nconst modifiers = {\n names: [],\n\n setOffsets: function (arg) {\n const { interaction, pageCoords: page } = arg;\n const { target, element, startOffset } = interaction;\n const rect = target.getRect(element);\n\n if (rect) {\n startOffset.left = page.x - rect.left;\n startOffset.top = page.y - rect.top;\n\n startOffset.right = rect.right - page.x;\n startOffset.bottom = rect.bottom - page.y;\n\n if (!('width' in rect)) { rect.width = rect.right - rect.left; }\n if (!('height' in rect)) { rect.height = rect.bottom - rect.top ; }\n }\n else {\n startOffset.left = startOffset.top = startOffset.right = startOffset.bottom = 0;\n }\n\n arg.rect = rect;\n arg.interactable = target;\n arg.element = element;\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n\n arg.options = target.options[interaction.prepared.name][modifierName];\n\n if (!arg.options) {\n continue;\n }\n\n interaction.modifierOffsets[modifierName] = modifiers[modifierName].setOffset(arg);\n }\n },\n\n setAll: function (arg) {\n const { interaction, statuses, preEnd, requireEndOnly } = arg;\n const coords = extend({}, arg.pageCoords);\n const result = {\n dx: 0,\n dy: 0,\n changed: false,\n locked: false,\n shouldMove: true,\n };\n\n for (const modifierName of modifiers.names) {\n const modifier = modifiers[modifierName];\n const options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!shouldDo(options, preEnd, requireEndOnly)) { continue; }\n\n arg.status = arg.status = statuses[modifierName];\n arg.options = options;\n arg.offset = arg.interaction.modifierOffsets[modifierName];\n\n modifier.set(arg);\n\n if (arg.status.locked) {\n coords.x += arg.status.dx;\n coords.y += arg.status.dy;\n\n result.dx += arg.status.dx;\n result.dy += arg.status.dy;\n\n result.locked = true;\n }\n }\n\n // a move should be fired if:\n // - there are no modifiers enabled,\n // - no modifiers are \"locked\" i.e. have changed the pointer's coordinates, or\n // - the locked coords have changed since the last pointer move\n result.shouldMove = !arg.status || !result.locked || arg.status.changed;\n\n return result;\n },\n\n resetStatuses: function (statuses) {\n for (const modifierName of modifiers.names) {\n const status = statuses[modifierName] || {};\n\n status.dx = status.dy = 0;\n status.modifiedX = status.modifiedY = NaN;\n status.locked = false;\n status.changed = true;\n\n statuses[modifierName] = status;\n }\n\n return statuses;\n },\n\n start: function ({ interaction }, signalName) {\n const arg = {\n interaction,\n pageCoords: (signalName === 'action-resume' ?\n interaction.curCoords : interaction.startCoords).page,\n startOffset: interaction.startOffset,\n statuses: interaction.modifierStatuses,\n preEnd: false,\n requireEndOnly: false,\n };\n\n modifiers.setOffsets(arg);\n modifiers.resetStatuses(arg.statuses);\n\n arg.pageCoords = extend({}, interaction.startCoords.page);\n interaction.modifierResult = modifiers.setAll(arg);\n },\n};\n\nInteraction.signals.on('new', function (interaction) {\n interaction.startOffset = { left: 0, right: 0, top: 0, bottom: 0 };\n interaction.modifierOffsets = {};\n interaction.modifierStatuses = modifiers.resetStatuses({});\n interaction.modifierResult = null;\n});\n\nInteraction.signals.on('action-start' , modifiers.start);\nInteraction.signals.on('action-resume', modifiers.start);\n\nInteraction.signals.on('before-action-move', function ({ interaction, preEnd, interactingBeforeMove }) {\n const modifierResult = modifiers.setAll({\n interaction,\n preEnd,\n pageCoords: interaction.curCoords.page,\n statuses: interaction.modifierStatuses,\n requireEndOnly: false,\n });\n\n // don't fire an action move if a modifier would keep the event in the same\n // cordinates as before\n if (!modifierResult.shouldMove && interactingBeforeMove) {\n interaction._dontFireMove = true;\n }\n\n interaction.modifierResult = modifierResult;\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n for (let i = 0; i < modifiers.names.length; i++) {\n const options = interaction.target.options[interaction.prepared.name][modifiers.names[i]];\n\n // if the endOnly option is true for any modifier\n if (shouldDo(options, true, true)) {\n // fire a move event at the modified coordinates\n interaction.doMove({ event, preEnd: true });\n break;\n }\n }\n});\n\nInteractEvent.signals.on('set-xy', function (arg) {\n const { iEvent, interaction } = arg;\n const modifierArg = extend({}, arg);\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n modifierArg.options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!modifierArg.options) {\n continue;\n }\n\n const modifier = modifiers[modifierName];\n\n modifierArg.status = interaction.modifierStatuses[modifierName];\n\n iEvent[modifierName] = modifier.modifyCoords(modifierArg);\n }\n});\n\nfunction shouldDo (options, preEnd, requireEndOnly) {\n return (options && options.enabled\n && (preEnd || !options.endOnly)\n && (!requireEndOnly || options.endOnly));\n}\n\nmodule.exports = modifiers;\n","const modifiers = require('./index');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst restrict = {\n defaults: {\n enabled : false,\n endOnly : false,\n restriction: null,\n elementRect: null,\n },\n\n setOffset: function ({ rect, startOffset, options }) {\n const elementRect = options && options.elementRect;\n const offset = {};\n\n if (rect && elementRect) {\n offset.left = startOffset.left - (rect.width * elementRect.left);\n offset.top = startOffset.top - (rect.height * elementRect.top);\n\n offset.right = startOffset.right - (rect.width * (1 - elementRect.right));\n offset.bottom = startOffset.bottom - (rect.height * (1 - elementRect.bottom));\n }\n else {\n offset.left = offset.top = offset.right = offset.bottom = 0;\n }\n\n return offset;\n },\n\n set: function ({ pageCoords, interaction, status, options }) {\n if (!options) { return status; }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n\n const restriction = getRestrictionRect(options.restriction, interaction, page);\n\n if (!restriction) { return status; }\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n const rect = restriction;\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n const offset = interaction.modifierOffsets.restrict;\n\n // object is assumed to have\n // x, y, width, height or\n // left, top, right, bottom\n if ('x' in restriction && 'y' in restriction) {\n modifiedX = Math.max(Math.min(rect.x + rect.width - offset.right , page.x), rect.x + offset.left);\n modifiedY = Math.max(Math.min(rect.y + rect.height - offset.bottom, page.y), rect.y + offset.top );\n }\n else {\n modifiedX = Math.max(Math.min(rect.right - offset.right , page.x), rect.left + offset.left);\n modifiedY = Math.max(Math.min(rect.bottom - offset.bottom, page.y), rect.top + offset.top );\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const elementRect = options && options.elementRect;\n\n if (options && options.enabled\n && !(phase === 'start' && elementRect && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n getRestrictionRect,\n};\n\nfunction getRestrictionRect (value, interaction, page) {\n if (utils.is.function(value)) {\n return utils.resolveRectLike(value, interaction.target, interaction.element, [page.x, page.y, interaction]);\n } else {\n return utils.resolveRectLike(value, interaction.target, interaction.element);\n }\n}\n\nmodifiers.restrict = restrict;\nmodifiers.names.push('restrict');\n\ndefaultOptions.perAction.restrict = restrict.defaults;\n\nmodule.exports = restrict;\n","// This module adds the options.resize.restrictEdges setting which sets min and\n// max for the top, left, bottom and right edges of the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictEdges: {\n// inner: { top: 200, left: 200, right: 400, bottom: 400 },\n// outer: { top: 0, left: 0, right: 600, bottom: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst { getRestrictionRect } = require('./restrict');\n\nconst noInner = { top: +Infinity, left: +Infinity, bottom: -Infinity, right: -Infinity };\nconst noOuter = { top: -Infinity, left: -Infinity, bottom: +Infinity, right: +Infinity };\n\nconst restrictEdges = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n offset: null,\n },\n\n setOffset: function ({ interaction, startOffset, options }) {\n if (!options) {\n return utils.extend({}, startOffset);\n }\n\n const offset = getRestrictionRect(options.offset, interaction, interaction.startCoords.page);\n\n if (offset) {\n return {\n top: startOffset.top + offset.y,\n left: startOffset.left + offset.x,\n bottom: startOffset.bottom + offset.y,\n right: startOffset.right + offset.x,\n };\n }\n\n return startOffset;\n },\n\n set: function ({ pageCoords, interaction, status, offset, options }) {\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n const inner = rectUtils.xywhToTlbr(getRestrictionRect(options.inner, interaction, page)) || noInner;\n const outer = rectUtils.xywhToTlbr(getRestrictionRect(options.outer, interaction, page)) || noOuter;\n\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n if (edges.top) {\n modifiedY = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top);\n }\n else if (edges.bottom) {\n modifiedY = Math.max(Math.min(outer.bottom - offset.bottom, page.y), inner.bottom - offset.bottom);\n }\n if (edges.left) {\n modifiedX = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left);\n }\n else if (edges.right) {\n modifiedX = Math.max(Math.min(outer.right - offset.right, page.x), inner.right - offset.right);\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n if (options && options.enabled\n && !(phase === 'start' && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n noInner,\n noOuter,\n getRestrictionRect,\n};\n\nmodifiers.restrictEdges = restrictEdges;\nmodifiers.names.push('restrictEdges');\n\ndefaultOptions.perAction.restrictEdges = restrictEdges.defaults;\nresize.defaults.restrictEdges = restrictEdges.defaults;\n\nmodule.exports = restrictEdges;\n","// This module adds the options.resize.restrictSize setting which sets min and\n// max width and height for the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictSize: {\n// min: { width: -600, height: -600 },\n// max: { width: 600, height: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst restrictEdges = require('./restrictEdges');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst noMin = { width: -Infinity, height: -Infinity };\nconst noMax = { width: +Infinity, height: +Infinity };\n\nconst restrictSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n },\n\n setOffset: function ({ interaction }) {\n return interaction.startOffset;\n },\n\n set: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const rect = rectUtils.xywhToTlbr(interaction.resizeRects.inverted);\n\n const minSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.min, interaction)) || noMin;\n const maxSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.max, interaction)) || noMax;\n\n arg.options = {\n enabled: options.enabled,\n endOnly: options.endOnly,\n inner: utils.extend({}, restrictEdges.noInner),\n outer: utils.extend({}, restrictEdges.noOuter),\n };\n\n if (edges.top) {\n arg.options.inner.top = rect.bottom - minSize.height;\n arg.options.outer.top = rect.bottom - maxSize.height;\n }\n else if (edges.bottom) {\n arg.options.inner.bottom = rect.top + minSize.height;\n arg.options.outer.bottom = rect.top + maxSize.height;\n }\n if (edges.left) {\n arg.options.inner.left = rect.right - minSize.width;\n arg.options.outer.left = rect.right - maxSize.width;\n }\n else if (edges.right) {\n arg.options.inner.right = rect.left + minSize.width;\n arg.options.outer.right = rect.left + maxSize.width;\n }\n\n restrictEdges.set(arg);\n },\n\n modifyCoords: restrictEdges.modifyCoords,\n};\n\nmodifiers.restrictSize = restrictSize;\nmodifiers.names.push('restrictSize');\n\ndefaultOptions.perAction.restrictSize = restrictSize.defaults;\nresize.defaults.restrictSize = restrictSize.defaults;\n\nmodule.exports = restrictSize;\n","const modifiers = require('./index');\nconst interact = require('../interact');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst snap = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n\n relativePoints: null,\n },\n\n setOffset: function ({ interaction, interactable, element, rect, startOffset, options }) {\n const offsets = [];\n const optionsOrigin = utils.rectToXY(utils.resolveRectLike(options.origin));\n const origin = optionsOrigin || utils.getOriginXY(interactable, element, interaction.prepared.name);\n options = options || interactable.options[interaction.prepared.name].snap || {};\n\n let snapOffset;\n\n if (options.offset === 'startCoords') {\n snapOffset = {\n x: interaction.startCoords.page.x - origin.x,\n y: interaction.startCoords.page.y - origin.y,\n };\n }\n else {\n const offsetRect = utils.resolveRectLike(options.offset, interactable, element, [interaction]);\n\n snapOffset = utils.rectToXY(offsetRect) || { x: 0, y: 0 };\n }\n\n if (rect && options.relativePoints && options.relativePoints.length) {\n for (const { x: relativeX, y: relativeY } of options.relativePoints) {\n offsets.push({\n x: startOffset.left - (rect.width * relativeX) + snapOffset.x,\n y: startOffset.top - (rect.height * relativeY) + snapOffset.y,\n });\n }\n }\n else {\n offsets.push(snapOffset);\n }\n\n return offsets;\n },\n\n set: function ({ interaction, pageCoords, status, options, offset: offsets }) {\n const targets = [];\n let target;\n let page;\n let i;\n\n if (status.useStatusXY) {\n page = { x: status.x, y: status.y };\n }\n else {\n const origin = utils.getOriginXY(interaction.target, interaction.element, interaction.prepared.name);\n\n page = utils.extend({}, pageCoords);\n\n page.x -= origin.x;\n page.y -= origin.y;\n }\n\n status.realX = page.x;\n status.realY = page.y;\n\n let len = options.targets? options.targets.length : 0;\n\n for (const { x: offsetX, y: offsetY } of offsets) {\n const relativeX = page.x - offsetX;\n const relativeY = page.y - offsetY;\n\n for (const snapTarget of options.targets) {\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n targets.push({\n x: utils.is.number(target.x) ? (target.x + offsetX) : relativeX,\n y: utils.is.number(target.y) ? (target.y + offsetY) : relativeY,\n\n range: utils.is.number(target.range)? target.range: options.range,\n });\n }\n }\n\n const closest = {\n target: null,\n inRange: false,\n distance: 0,\n range: 0,\n dx: 0,\n dy: 0,\n };\n\n for (i = 0, len = targets.length; i < len; i++) {\n target = targets[i];\n\n const range = target.range;\n const dx = target.x - page.x;\n const dy = target.y - page.y;\n const distance = utils.hypot(dx, dy);\n let inRange = distance <= range;\n\n // Infinite targets count as being out of range\n // compared to non infinite ones that are in range\n if (range === Infinity && closest.inRange && closest.range !== Infinity) {\n inRange = false;\n }\n\n if (!closest.target || (inRange\n // is the closest target in range?\n ? (closest.inRange && range !== Infinity\n // the pointer is relatively deeper in this target\n ? distance / range < closest.distance / closest.range\n // this target has Infinite range and the closest doesn't\n : (range === Infinity && closest.range !== Infinity)\n // OR this target is closer that the previous closest\n || distance < closest.distance)\n // The other is not in range and the pointer is closer to this target\n : (!closest.inRange && distance < closest.distance))) {\n\n closest.target = target;\n closest.distance = distance;\n closest.range = range;\n closest.inRange = inRange;\n closest.dx = dx;\n closest.dy = dy;\n\n status.range = range;\n }\n }\n\n let snapChanged;\n\n if (closest.target) {\n snapChanged = (status.modifiedX !== closest.target.x || status.modifiedY !== closest.target.y);\n\n status.modifiedX = closest.target.x;\n status.modifiedY = closest.target.y;\n }\n else {\n snapChanged = true;\n\n status.modifiedX = NaN;\n status.modifiedY = NaN;\n }\n\n status.dx = closest.dx;\n status.dy = closest.dy;\n\n status.changed = (snapChanged || (closest.inRange && !status.locked));\n status.locked = closest.inRange;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const relativePoints = options && options.relativePoints;\n\n if (options && options.enabled\n && !(phase === 'start' && relativePoints && relativePoints.length)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n }\n\n return {\n range : status.range,\n locked : status.locked,\n x : status.modifiedX,\n y : status.modifiedY,\n realX : status.realX,\n realY : status.realY,\n dx : status.dx,\n dy : status.dy,\n };\n }\n },\n};\n\ninteract.createSnapGrid = function (grid) {\n return function (x, y) {\n const limits = grid.limits || {\n left : -Infinity,\n right : Infinity,\n top : -Infinity,\n bottom: Infinity,\n };\n let offsetX = 0;\n let offsetY = 0;\n\n if (utils.is.object(grid.offset)) {\n offsetX = grid.offset.x;\n offsetY = grid.offset.y;\n }\n\n const gridx = Math.round((x - offsetX) / grid.x);\n const gridy = Math.round((y - offsetY) / grid.y);\n\n const newX = Math.max(limits.left, Math.min(limits.right , gridx * grid.x + offsetX));\n const newY = Math.max(limits.top , Math.min(limits.bottom, gridy * grid.y + offsetY));\n\n return {\n x: newX,\n y: newY,\n range: grid.range,\n };\n };\n};\n\nmodifiers.snap = snap;\nmodifiers.names.push('snap');\n\ndefaultOptions.perAction.snap = snap.defaults;\n\nmodule.exports = snap;\n","// This module allows snapping of the size of targets during resize\n// interactions.\n\nconst modifiers = require('./index');\nconst snap = require('./snap');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\nconst utils = require('../utils/');\n\nconst snapSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n },\n\n setOffset: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.edges;\n\n if (!edges) { return; }\n\n arg.options = {\n relativePoints: [{\n x: edges.left? 0 : 1,\n y: edges.top ? 0 : 1,\n }],\n origin: { x: 0, y: 0 },\n offset: 'self',\n range: options.range,\n };\n\n const offsets = snap.setOffset(arg);\n arg.options = options;\n\n return offsets;\n },\n\n set: function (arg) {\n const { interaction, options, offset, pageCoords } = arg;\n const page = utils.extend({}, pageCoords);\n const relativeX = page.x - offset[0].x;\n const relativeY = page.y - offset[0].y;\n\n arg.options = utils.extend({}, options);\n arg.options.targets = [];\n\n for (const snapTarget of options.targets) {\n let target;\n\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n if ('width' in target && 'height' in target) {\n target.x = target.width;\n target.y = target.height;\n }\n\n arg.options.targets.push(target);\n }\n\n snap.set(arg);\n },\n\n modifyCoords: function (arg) {\n const { options } = arg;\n\n arg.options = utils.extend({}, options);\n arg.options.enabled = options.enabled;\n arg.options.relativePoints = [null];\n\n snap.modifyCoords(arg);\n },\n};\n\nmodifiers.snapSize = snapSize;\nmodifiers.names.push('snapSize');\n\ndefaultOptions.perAction.snapSize = snapSize.defaults;\nresize.defaults.snapSize = snapSize.defaults;\n\nmodule.exports = snapSize;\n","const pointerUtils = require('../utils/pointerUtils');\n\nmodule.exports = class PointerEvent {\n constructor (type, pointer, event, eventTarget, interaction) {\n pointerUtils.pointerExtend(this, event);\n\n if (event !== pointer) {\n pointerUtils.pointerExtend(this, pointer);\n }\n\n this.interaction = interaction;\n\n this.timeStamp = new Date().getTime();\n this.originalEvent = event;\n this.type = type;\n this.pointerId = pointerUtils.getPointerId(pointer);\n this.pointerType = pointerUtils.getPointerType(pointer);\n this.target = eventTarget;\n this.currentTarget = null;\n\n if (type === 'tap') {\n const pointerIndex = interaction.getPointerIndex(pointer);\n this.dt = this.timeStamp - interaction.downTimes[pointerIndex];\n\n const interval = this.timeStamp - interaction.tapTime;\n\n this.double = !!(interaction.prevTap\n && interaction.prevTap.type !== 'doubletap'\n && interaction.prevTap.target === this.target\n && interval < 500);\n }\n else if (type === 'doubletap') {\n this.dt = pointer.timeStamp - interaction.tapTime;\n }\n }\n\n subtractOrigin ({ x: originX, y: originY }) {\n this.pageX -= originX;\n this.pageY -= originY;\n this.clientX -= originX;\n this.clientY -= originY;\n\n return this;\n }\n\n addOrigin ({ x: originX, y: originY }) {\n this.pageX += originX;\n this.pageY += originY;\n this.clientX += originX;\n this.clientY += originY;\n\n return this;\n }\n\n preventDefault () {\n this.originalEvent.preventDefault();\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n};\n","const PointerEvent = require('./PointerEvent');\nconst Interaction = require('../Interaction');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst defaults = require('../defaultOptions');\nconst signals = require('../utils/Signals').new();\nconst { filter } = require('../utils/arr');\n\nconst simpleSignals = [ 'down', 'up', 'cancel' ];\nconst simpleEvents = [ 'down', 'up', 'cancel' ];\n\nconst pointerEvents = {\n PointerEvent,\n fire,\n collectEventTargets,\n signals,\n defaults: {\n holdDuration: 600,\n ignoreFrom : null,\n allowFrom : null,\n origin : { x: 0, y: 0 },\n },\n types: [\n 'down',\n 'move',\n 'up',\n 'cancel',\n 'tap',\n 'doubletap',\n 'hold',\n ],\n};\n\nfunction fire (arg) {\n const {\n interaction, pointer, event, eventTarget,\n type = arg.pointerEvent.type,\n targets = collectEventTargets(arg),\n pointerEvent = new PointerEvent(type, pointer, event, eventTarget, interaction),\n } = arg;\n\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n targets,\n type,\n pointerEvent,\n };\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n\n for (const prop in target.props || {}) {\n pointerEvent[prop] = target.props[prop];\n }\n\n const origin = utils.getOriginXY(target.eventable, target.element);\n\n pointerEvent.subtractOrigin(origin);\n pointerEvent.eventable = target.eventable;\n pointerEvent.currentTarget = target.element;\n\n target.eventable.fire(pointerEvent);\n\n pointerEvent.addOrigin(origin);\n\n if (pointerEvent.immediatePropagationStopped\n || (pointerEvent.propagationStopped\n && (i + 1) < targets.length && targets[i + 1].element !== pointerEvent.currentTarget)) {\n break;\n }\n }\n\n signals.fire('fired', signalArg);\n\n if (type === 'tap') {\n // if pointerEvent should make a double tap, create and fire a doubletap\n // PointerEvent and use that as the prevTap\n const prevTap = pointerEvent.double\n ? fire({\n interaction, pointer, event, eventTarget,\n type: 'doubletap',\n })\n : pointerEvent;\n\n interaction.prevTap = prevTap;\n interaction.tapTime = prevTap.timeStamp;\n }\n\n return pointerEvent;\n}\n\nfunction collectEventTargets ({ interaction, pointer, event, eventTarget, type }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n // do not fire a tap event if the pointer was moved before being lifted\n if (type === 'tap' && (interaction.pointerWasMoved\n // or if the pointerup target is different to the pointerdown target\n || !(interaction.downTargets[pointerIndex] && interaction.downTargets[pointerIndex] === eventTarget))) {\n return [];\n }\n\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n path,\n targets: [],\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (type === 'hold') {\n signalArg.targets = filter(signalArg.targets, target =>\n target.eventable.options.holdDuration === interaction.holdTimers[pointerIndex].duration);\n }\n\n return signalArg.targets;\n}\n\nInteraction.signals.on('update-pointer-down', function ({ interaction, pointerIndex }) {\n interaction.holdTimers[pointerIndex] = { duration: Infinity, timeout: null };\n});\n\nInteraction.signals.on('remove-pointer', function ({ interaction, pointerIndex }) {\n interaction.holdTimers.splice(pointerIndex, 1);\n});\n\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget, duplicateMove }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n if (!duplicateMove && (!interaction.pointerIsDown || interaction.pointerWasMoved)) {\n if (interaction.pointerIsDown) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n\n fire({\n interaction, pointer, event, eventTarget,\n type: 'move',\n });\n }\n});\n\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget, pointerIndex }) {\n // copy event to be used in timeout for IE8\n const eventCopy = browser.isIE8? utils.extend({}, event) : event;\n\n const timer = interaction.holdTimers[pointerIndex];\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'hold',\n targets: [],\n path,\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (!signalArg.targets.length) { return; }\n\n let minDuration = Infinity;\n\n for (let i = 0; i < signalArg.targets.length; i++) {\n const target = signalArg.targets[i];\n const holdDuration = target.eventable.options.holdDuration;\n\n if (holdDuration < minDuration) {\n minDuration = holdDuration;\n }\n }\n\n timer.duration = minDuration;\n timer.timeout = setTimeout(function () {\n fire({\n interaction,\n eventTarget,\n pointer: browser.isIE8? eventCopy : pointer,\n event: eventCopy,\n type: 'hold',\n });\n }, minDuration);\n});\n\nInteraction.signals.on('up', ({ interaction, pointer, event, eventTarget }) => {\n if (!interaction.pointerWasMoved) {\n fire({ interaction, eventTarget, pointer, event, type: 'tap' });\n }\n});\n\n['up', 'cancel'].forEach(function (signalName) {\n Interaction.signals.on(signalName, function ({ interaction, pointerIndex }) {\n if (interaction.holdTimers[pointerIndex]) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n });\n});\n\nfunction createSignalListener (type) {\n return function ({ interaction, pointer, event, eventTarget }) {\n fire({ interaction, eventTarget, pointer, event, type });\n };\n}\n\nfor (let i = 0; i < simpleSignals.length; i++) {\n Interaction.signals.on(simpleSignals[i], createSignalListener(simpleEvents[i]));\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.prevTap = null; // the most recent tap event on this interaction\n interaction.tapTime = 0; // time of the most recent tap event\n interaction.holdTimers = []; // [{ duration, timeout }]\n});\n\ndefaults.pointerEvents = pointerEvents.defaults;\nmodule.exports = pointerEvents;\n","const pointerEvents = require('./base');\nconst Interaction = require('../Interaction');\n\npointerEvents.signals.on('new', onNew);\npointerEvents.signals.on('fired', onFired);\n\nfor (const signal of ['move', 'up', 'cancel', 'endall']) {\n Interaction.signals.on(signal, endHoldRepeat);\n}\n\nfunction onNew ({ pointerEvent }) {\n if (pointerEvent.type !== 'hold') { return; }\n\n pointerEvent.count = (pointerEvent.count || 0) + 1;\n}\n\nfunction onFired ({ interaction, pointerEvent, eventTarget, targets }) {\n if (pointerEvent.type !== 'hold' || !targets.length) { return; }\n\n // get the repeat interval from the first eventable\n const interval = targets[0].eventable.options.holdRepeatInterval;\n\n // don't repeat if the interval is 0 or less\n if (interval <= 0) { return; }\n\n // set a timeout to fire the holdrepeat event\n interaction.holdIntervalHandle = setTimeout(function () {\n pointerEvents.fire({\n interaction,\n eventTarget,\n type: 'hold',\n pointer: pointerEvent,\n event: pointerEvent,\n });\n }, interval);\n}\n\nfunction endHoldRepeat ({ interaction }) {\n // set the interaction's holdStopTime property\n // to stop further holdRepeat events\n if (interaction.holdIntervalHandle) {\n clearInterval(interaction.holdIntervalHandle);\n interaction.holdIntervalHandle = null;\n }\n}\n\n// don't repeat by default\npointerEvents.defaults.holdRepeatInterval = 0;\npointerEvents.types.push('holdrepeat');\n\nmodule.exports = {\n onNew,\n onFired,\n endHoldRepeat,\n};\n","const pointerEvents = require('./base');\nconst Interactable = require('../Interactable');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\nconst scope = require('../scope');\nconst extend = require('../utils/extend');\nconst { merge } = require('../utils/arr');\n\npointerEvents.signals.on('collect-targets', function ({ targets, element, type, eventTarget }) {\n function collectSelectors (interactable, selector, context) {\n const els = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && is.element(element)\n && domUtils.matchesSelector(element, selector, els)\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n const interactable = scope.interactables.get(element);\n\n if (interactable) {\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n scope.interactables.forEachSelector(collectSelectors, element);\n});\n\nInteractable.signals.on('new', function ({ interactable }) {\n interactable.events.getRect = function (element) {\n return interactable.getRect(element);\n };\n});\n\nInteractable.signals.on('set', function ({ interactable, options }) {\n extend(interactable.events.options, pointerEvents.defaults);\n extend(interactable.events.options, options);\n});\n\nmerge(Interactable.eventTypes, pointerEvents.types);\n\nInteractable.prototype.pointerEvents = function (options) {\n extend(this.events.options, options);\n\n return this;\n};\n\nconst __backCompatOption = Interactable.prototype._backCompatOption;\n\nInteractable.prototype._backCompatOption = function (optionName, newValue) {\n const ret = __backCompatOption.call(this, optionName, newValue);\n\n if (ret === this) {\n this.events.options[optionName] = newValue;\n }\n\n return ret;\n};\n\nInteractable.settingsMethods.push('pointerEvents');\n","const utils = require('./utils');\nconst events = require('./utils/events');\nconst signals = require('./utils/Signals').new();\n\nconst scope = {\n signals,\n events,\n utils,\n\n // main document\n document: require('./utils/domObjects').document,\n // all documents being listened to\n documents: [],\n\n addDocument: function (doc, win) {\n // do nothing if document is already known\n if (utils.contains(scope.documents, doc)) { return false; }\n\n win = win || scope.getWindow(doc);\n\n scope.documents.push(doc);\n events.documents.push(doc);\n\n // don't add an unload event for the main document\n // so that the page may be cached in browser history\n if (doc !== scope.document) {\n events.add(win, 'unload', scope.onWindowUnload);\n }\n\n signals.fire('add-document', { doc, win });\n },\n\n removeDocument: function (doc, win) {\n const index = utils.indexOf(scope.documents, doc);\n\n win = win || scope.getWindow(doc);\n\n events.remove(win, 'unload', scope.onWindowUnload);\n\n scope.documents.splice(index, 1);\n events.documents.splice(index, 1);\n\n signals.fire('remove-document', { win, doc });\n },\n\n onWindowUnload: function () {\n scope.removeDocument(this.document, this);\n },\n};\n\nmodule.exports = scope;\n","const { indexOf } = require('./arr');\n\nclass Signals {\n constructor () {\n this.listeners = {\n // signalName: [listeners],\n };\n }\n\n on (name, listener) {\n if (!this.listeners[name]) {\n this.listeners[name] = [listener];\n return;\n }\n\n this.listeners[name].push(listener);\n }\n\n off (name, listener) {\n if (!this.listeners[name]) { return; }\n\n const index = indexOf(this.listeners[name], listener);\n\n if (index !== -1) {\n this.listeners[name].splice(index, 1);\n }\n }\n\n fire (name, arg) {\n const targetListeners = this.listeners[name];\n\n if (!targetListeners) { return; }\n\n for (let i = 0; i < targetListeners.length; i++) {\n if (targetListeners[i](arg, name) === false) {\n return;\n }\n }\n }\n}\n\nSignals.new = function () {\n return new Signals();\n};\n\nmodule.exports = Signals;\n","function indexOf (array, target) {\n for (let i = 0, len = array.length; i < len; i++) {\n if (array[i] === target) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction contains (array, target) {\n return indexOf(array, target) !== -1;\n}\n\nfunction merge (target, source) {\n for (let i = 0; i < source.length; i++) {\n target.push(source[i]);\n }\n\n return target;\n}\n\nfunction filter (array, test) {\n const result = [];\n\n for (let i = 0; i < array.length; i++) {\n if (test(array[i])) {\n result.push(array[i]);\n }\n }\n\n return result;\n}\n\nmodule.exports = {\n indexOf,\n contains,\n merge,\n filter,\n};\n","const { window } = require('./window');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst Element = domObjects.Element;\nconst navigator = window.navigator;\n\nconst browser = {\n // Does the browser support touch input?\n supportsTouch: !!(('ontouchstart' in window) || is.function(window.DocumentTouch)\n && domObjects.document instanceof window.DocumentTouch),\n\n // Does the browser support PointerEvents\n supportsPointerEvent: !!domObjects.PointerEvent,\n\n isIE8: ('attachEvent' in window) && !('addEventListener' in window),\n\n // Opera Mobile must be handled differently\n isOperaMobile: (navigator.appName === 'Opera'\n && browser.supportsTouch\n && navigator.userAgent.match('Presto')),\n\n // scrolling doesn't change the result of getClientRects on iOS 7\n isIOS7: (/iP(hone|od|ad)/.test(navigator.platform)\n && /OS 7[^\\d]/.test(navigator.appVersion)),\n\n isIe9OrOlder: /MSIE (8|9)/.test(navigator.userAgent),\n\n // prefix matchesSelector\n prefixedMatchesSelector: 'matches' in Element.prototype\n ? 'matches': 'webkitMatchesSelector' in Element.prototype\n ? 'webkitMatchesSelector': 'mozMatchesSelector' in Element.prototype\n ? 'mozMatchesSelector': 'oMatchesSelector' in Element.prototype\n ? 'oMatchesSelector': 'msMatchesSelector',\n\n useMatchesSelectorPolyfill: false,\n\n pEventTypes: (domObjects.PointerEvent\n ? (domObjects.PointerEvent === window.MSPointerEvent\n ? {\n up: 'MSPointerUp',\n down: 'MSPointerDown',\n over: 'mouseover',\n out: 'mouseout',\n move: 'MSPointerMove',\n cancel: 'MSPointerCancel',\n }\n : {\n up: 'pointerup',\n down: 'pointerdown',\n over: 'pointerover',\n out: 'pointerout',\n move: 'pointermove',\n cancel: 'pointercancel',\n })\n : null),\n\n // because Webkit and Opera still use 'mousewheel' event type\n wheelEvent: 'onmousewheel' in domObjects.document? 'mousewheel': 'wheel',\n\n};\n\nbrowser.useMatchesSelectorPolyfill = !is.function(Element.prototype[browser.prefixedMatchesSelector]);\n\nmodule.exports = browser;\n","const domObjects = {};\nconst win = require('./window').window;\n\nfunction blank () {}\n\ndomObjects.document = win.document;\ndomObjects.DocumentFragment = win.DocumentFragment || blank;\ndomObjects.SVGElement = win.SVGElement || blank;\ndomObjects.SVGSVGElement = win.SVGSVGElement || blank;\ndomObjects.SVGElementInstance = win.SVGElementInstance || blank;\ndomObjects.Element = win.Element || blank;\ndomObjects.HTMLElement = win.HTMLElement || domObjects.Element;\n\ndomObjects.Event = win.Event;\ndomObjects.Touch = win.Touch || blank;\ndomObjects.PointerEvent = (win.PointerEvent || win.MSPointerEvent);\n\nmodule.exports = domObjects;\n","const win = require('./window');\nconst browser = require('./browser');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst domUtils = {\n nodeContains: function (parent, child) {\n while (child) {\n if (child === parent) {\n return true;\n }\n\n child = child.parentNode;\n }\n\n return false;\n },\n\n closest: function (element, selector) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) { return element; }\n\n element = domUtils.parentNode(element);\n }\n\n return null;\n },\n\n parentNode: function (node) {\n let parent = node.parentNode;\n\n if (is.docFrag(parent)) {\n // skip past #shado-root fragments\n while ((parent = parent.host) && is.docFrag(parent)) {\n continue;\n }\n\n return parent;\n }\n\n return parent;\n },\n\n // taken from http://tanalin.com/en/blog/2012/12/matches-selector-ie8/ and modified\n matchesSelectorPolyfill: browser.useMatchesSelectorPolyfill\n ? function (element, selector, elems) {\n elems = elems || element.parentNode.querySelectorAll(selector);\n\n for (let i = 0, len = elems.length; i < len; i++) {\n if (elems[i] === element) {\n return true;\n }\n }\n\n return false;\n }\n : null,\n\n matchesSelector: function (element, selector, nodeList) {\n if (browser.useMatchesSelectorPolyfill) {\n return domUtils.matchesSelectorPolyfill(element, selector, nodeList);\n }\n\n // remove /deep/ from selectors if shadowDOM polyfill is used\n if (win.window !== win.realWindow) {\n selector = selector.replace(/\\/deep\\//g, ' ');\n }\n\n return element[browser.prefixedMatchesSelector](selector);\n },\n\n // Test for the element that's \"above\" all other qualifiers\n indexOfDeepestElement: function (elements) {\n let deepestZoneParents = [];\n let dropzoneParents = [];\n let dropzone;\n let deepestZone = elements[0];\n let index = deepestZone? 0: -1;\n let parent;\n let child;\n let i;\n let n;\n\n for (i = 1; i < elements.length; i++) {\n dropzone = elements[i];\n\n // an element might belong to multiple selector dropzones\n if (!dropzone || dropzone === deepestZone) {\n continue;\n }\n\n if (!deepestZone) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n // check if the deepest or current are document.documentElement or document.rootElement\n // - if the current dropzone is, do nothing and continue\n if (dropzone.parentNode === dropzone.ownerDocument) {\n continue;\n }\n // - if deepest is, update with the current dropzone and continue to next\n else if (deepestZone.parentNode === dropzone.ownerDocument) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n if (!deepestZoneParents.length) {\n parent = deepestZone;\n while (parent.parentNode && parent.parentNode !== parent.ownerDocument) {\n deepestZoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n }\n\n // if this element is an svg element and the current deepest is\n // an HTMLElement\n if (deepestZone instanceof domObjects.HTMLElement\n && dropzone instanceof domObjects.SVGElement\n && !(dropzone instanceof domObjects.SVGSVGElement)) {\n\n if (dropzone === deepestZone.parentNode) {\n continue;\n }\n\n parent = dropzone.ownerSVGElement;\n }\n else {\n parent = dropzone;\n }\n\n dropzoneParents = [];\n\n while (parent.parentNode !== parent.ownerDocument) {\n dropzoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n\n n = 0;\n\n // get (position of last common ancestor) + 1\n while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) {\n n++;\n }\n\n const parents = [\n dropzoneParents[n - 1],\n dropzoneParents[n],\n deepestZoneParents[n],\n ];\n\n child = parents[0].lastChild;\n\n while (child) {\n if (child === parents[1]) {\n deepestZone = dropzone;\n index = i;\n deepestZoneParents = [];\n\n break;\n }\n else if (child === parents[2]) {\n break;\n }\n\n child = child.previousSibling;\n }\n }\n\n return index;\n },\n\n matchesUpTo: function (element, selector, limit) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) {\n return true;\n }\n\n element = domUtils.parentNode(element);\n\n if (element === limit) {\n return domUtils.matchesSelector(element, selector);\n }\n }\n\n return false;\n },\n\n getActualElement: function (element) {\n return (element instanceof domObjects.SVGElementInstance\n ? element.correspondingUseElement\n : element);\n },\n\n getScrollXY: function (relevantWindow) {\n relevantWindow = relevantWindow || win.window;\n return {\n x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft,\n y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop,\n };\n },\n\n getElementClientRect: function (element) {\n const clientRect = (element instanceof domObjects.SVGElement\n ? element.getBoundingClientRect()\n : element.getClientRects()[0]);\n\n return clientRect && {\n left : clientRect.left,\n right : clientRect.right,\n top : clientRect.top,\n bottom: clientRect.bottom,\n width : clientRect.width || clientRect.right - clientRect.left,\n height: clientRect.height || clientRect.bottom - clientRect.top,\n };\n },\n\n getElementRect: function (element) {\n const clientRect = domUtils.getElementClientRect(element);\n\n if (!browser.isIOS7 && clientRect) {\n const scroll = domUtils.getScrollXY(win.getWindow(element));\n\n clientRect.left += scroll.x;\n clientRect.right += scroll.x;\n clientRect.top += scroll.y;\n clientRect.bottom += scroll.y;\n }\n\n return clientRect;\n },\n\n getPath: function (element) {\n const path = [];\n\n while (element) {\n path.push(element);\n element = domUtils.parentNode(element);\n }\n\n return path;\n },\n\n trySelector: value => {\n if (!is.string(value)) { return false; }\n\n // an exception will be raised if it is invalid\n domObjects.document.querySelector(value);\n return true;\n },\n};\n\nmodule.exports = domUtils;\n","const is = require('./is');\nconst domUtils = require('./domUtils');\nconst pExtend = require('./pointerExtend');\n\nconst { window, getWindow } = require('./window');\nconst { indexOf, contains } = require('./arr');\n\nconst useAttachEvent = ('attachEvent' in window) && !('addEventListener' in window);\nconst addEvent = useAttachEvent? 'attachEvent': 'addEventListener';\nconst removeEvent = useAttachEvent? 'detachEvent': 'removeEventListener';\nconst on = useAttachEvent? 'on': '';\n\nconst elements = [];\nconst targets = [];\nconst attachedListeners = [];\n\n// {\n// type: {\n// selectors: ['selector', ...],\n// contexts : [document, ...],\n// listeners: [[listener, capture, passive], ...]\n// }\n// }\nconst delegatedEvents = {};\n\nconst documents = [];\n\nconst supportsOptions = !useAttachEvent && (() => {\n let supported = false;\n\n window.document.createElement('div').addEventListener('test', null, {\n get capture () { supported = true; },\n });\n\n return supported;\n})();\n\nfunction add (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n let elementIndex = indexOf(elements, element);\n let target = targets[elementIndex];\n\n if (!target) {\n target = {\n events: {},\n typeCount: 0,\n };\n\n elementIndex = elements.push(element) - 1;\n targets.push(target);\n\n attachedListeners.push(useAttachEvent\n ? {\n supplied: [],\n wrapped : [],\n useCount: [],\n }\n : null);\n }\n\n if (!target.events[type]) {\n target.events[type] = [];\n target.typeCount++;\n }\n\n if (!contains(target.events[type], listener)) {\n let ret;\n\n if (useAttachEvent) {\n const { supplied, wrapped, useCount } = attachedListeners[elementIndex];\n const listenerIndex = indexOf(supplied, listener);\n\n const wrappedListener = wrapped[listenerIndex] || function (event) {\n if (!event.immediatePropagationStopped) {\n event.target = event.srcElement;\n event.currentTarget = element;\n\n event.preventDefault = event.preventDefault || preventDef;\n event.stopPropagation = event.stopPropagation || stopProp;\n event.stopImmediatePropagation = event.stopImmediatePropagation || stopImmProp;\n\n if (/mouse|click/.test(event.type)) {\n event.pageX = event.clientX + getWindow(element).document.documentElement.scrollLeft;\n event.pageY = event.clientY + getWindow(element).document.documentElement.scrollTop;\n }\n\n listener(event);\n }\n };\n\n ret = element[addEvent](on + type, wrappedListener, !!options.capture);\n\n if (listenerIndex === -1) {\n supplied.push(listener);\n wrapped.push(wrappedListener);\n useCount.push(1);\n }\n else {\n useCount[listenerIndex]++;\n }\n }\n else {\n ret = element[addEvent](type, listener, supportsOptions? options : !!options.capture);\n }\n target.events[type].push(listener);\n\n return ret;\n }\n}\n\nfunction remove (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const elementIndex = indexOf(elements, element);\n const target = targets[elementIndex];\n\n if (!target || !target.events) {\n return;\n }\n\n let wrappedListener = listener;\n let listeners;\n let listenerIndex;\n\n if (useAttachEvent) {\n listeners = attachedListeners[elementIndex];\n listenerIndex = indexOf(listeners.supplied, listener);\n wrappedListener = listeners.wrapped[listenerIndex];\n }\n\n if (type === 'all') {\n for (type in target.events) {\n if (target.events.hasOwnProperty(type)) {\n remove(element, type, 'all');\n }\n }\n return;\n }\n\n if (target.events[type]) {\n const len = target.events[type].length;\n\n if (listener === 'all') {\n for (let i = 0; i < len; i++) {\n remove(element, type, target.events[type][i], options);\n }\n return;\n }\n else {\n for (let i = 0; i < len; i++) {\n if (target.events[type][i] === listener) {\n element[removeEvent](on + type, wrappedListener, supportsOptions? options : !!options.capture);\n target.events[type].splice(i, 1);\n\n if (useAttachEvent && listeners) {\n listeners.useCount[listenerIndex]--;\n if (listeners.useCount[listenerIndex] === 0) {\n listeners.supplied.splice(listenerIndex, 1);\n listeners.wrapped.splice(listenerIndex, 1);\n listeners.useCount.splice(listenerIndex, 1);\n }\n }\n\n break;\n }\n }\n }\n\n if (target.events[type] && target.events[type].length === 0) {\n target.events[type] = null;\n target.typeCount--;\n }\n }\n\n if (!target.typeCount) {\n targets.splice(elementIndex, 1);\n elements.splice(elementIndex, 1);\n attachedListeners.splice(elementIndex, 1);\n }\n}\n\nfunction addDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n if (!delegatedEvents[type]) {\n delegatedEvents[type] = {\n selectors: [],\n contexts : [],\n listeners: [],\n };\n\n // add delegate listener functions\n for (let i = 0; i < documents.length; i++) {\n add(documents[i], type, delegateListener);\n add(documents[i], type, delegateUseCapture, true);\n }\n }\n\n const delegated = delegatedEvents[type];\n let index;\n\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n break;\n }\n }\n\n if (index === -1) {\n index = delegated.selectors.length;\n\n delegated.selectors.push(selector);\n delegated.contexts .push(context);\n delegated.listeners.push([]);\n }\n\n // keep listener and capture and passive flags\n delegated.listeners[index].push([listener, !!options.capture, options.passive]);\n}\n\nfunction removeDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const delegated = delegatedEvents[type];\n let matchFound = false;\n let index;\n\n if (!delegated) { return; }\n\n // count from last index of delegated to 0\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n // look for matching selector and context Node\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n\n const listeners = delegated.listeners[index];\n\n // each item of the listeners array is an array: [function, capture, passive]\n for (let i = listeners.length - 1; i >= 0; i--) {\n const [fn, capture, passive] = listeners[i];\n\n // check if the listener functions and capture and passive flags match\n if (fn === listener && capture === !!options.capture && passive === options.passive) {\n // remove the listener from the array of listeners\n listeners.splice(i, 1);\n\n // if all listeners for this interactable have been removed\n // remove the interactable from the delegated arrays\n if (!listeners.length) {\n delegated.selectors.splice(index, 1);\n delegated.contexts .splice(index, 1);\n delegated.listeners.splice(index, 1);\n\n // remove delegate function from context\n remove(context, type, delegateListener);\n remove(context, type, delegateUseCapture, true);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegatedEvents[type] = null;\n }\n }\n\n // only remove one listener\n matchFound = true;\n break;\n }\n }\n\n if (matchFound) { break; }\n }\n }\n}\n\n// bound to the interactable context when a DOM event\n// listener is added to a selector interactable\nfunction delegateListener (event, optionalArg) {\n const options = getOptions(optionalArg);\n const fakeEvent = {};\n const delegated = delegatedEvents[event.type];\n const eventTarget = (domUtils.getActualElement(event.path\n ? event.path[0]\n : event.target));\n let element = eventTarget;\n\n // duplicate the event so that currentTarget can be changed\n pExtend(fakeEvent, event);\n\n fakeEvent.originalEvent = event;\n fakeEvent.preventDefault = preventOriginalDefault;\n\n // climb up document tree looking for selector matches\n while (is.element(element)) {\n for (let i = 0; i < delegated.selectors.length; i++) {\n const selector = delegated.selectors[i];\n const context = delegated.contexts[i];\n\n if (domUtils.matchesSelector(element, selector)\n && domUtils.nodeContains(context, eventTarget)\n && domUtils.nodeContains(context, element)) {\n\n const listeners = delegated.listeners[i];\n\n fakeEvent.currentTarget = element;\n\n for (let j = 0; j < listeners.length; j++) {\n const [fn, capture, passive] = listeners[j];\n\n if (capture === !!options.capture && passive === options.passive) {\n fn(fakeEvent);\n }\n }\n }\n }\n\n element = domUtils.parentNode(element);\n }\n}\n\nfunction delegateUseCapture (event) {\n return delegateListener.call(this, event, true);\n}\n\nfunction preventDef () {\n this.returnValue = false;\n}\n\nfunction preventOriginalDefault () {\n this.originalEvent.preventDefault();\n}\n\nfunction stopProp () {\n this.cancelBubble = true;\n}\n\nfunction stopImmProp () {\n this.cancelBubble = true;\n this.immediatePropagationStopped = true;\n}\n\nfunction getOptions (param) {\n return is.object(param)? param : { capture: param };\n}\n\nmodule.exports = {\n add,\n remove,\n\n addDelegate,\n removeDelegate,\n\n delegateListener,\n delegateUseCapture,\n delegatedEvents,\n documents,\n\n useAttachEvent,\n supportsOptions,\n\n _elements: elements,\n _targets: targets,\n _attachedListeners: attachedListeners,\n};\n","module.exports = function extend (dest, source) {\n for (const prop in source) {\n dest[prop] = source[prop];\n }\n return dest;\n};\n","const {\n resolveRectLike,\n rectToXY,\n} = require('./rect');\n\nmodule.exports = function (target, element, action) {\n const actionOptions = target.options[action];\n const actionOrigin = actionOptions && actionOptions.origin;\n const origin = actionOrigin || target.options.origin;\n\n const originRect = resolveRectLike(origin, target, element, [target && element]);\n\n return rectToXY(originRect) || { x: 0, y: 0 };\n};\n","module.exports = (x, y) => Math.sqrt(x * x + y * y);\n","const extend = require('./extend');\nconst win = require('./window');\n\nconst utils = {\n warnOnce: function (method, message) {\n let warned = false;\n\n return function () {\n if (!warned) {\n win.window.console.warn(message);\n warned = true;\n }\n\n return method.apply(this, arguments);\n };\n },\n\n // http://stackoverflow.com/a/5634528/2280888\n _getQBezierValue: function (t, p1, p2, p3) {\n const iT = 1 - t;\n return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3;\n },\n\n getQuadraticCurvePoint: function (startX, startY, cpX, cpY, endX, endY, position) {\n return {\n x: utils._getQBezierValue(position, startX, cpX, endX),\n y: utils._getQBezierValue(position, startY, cpY, endY),\n };\n },\n\n // http://gizma.com/easing/\n easeOutQuad: function (t, b, c, d) {\n t /= d;\n return -c * t*(t-2) + b;\n },\n\n copyAction: function (dest, src) {\n dest.name = src.name;\n dest.axis = src.axis;\n dest.edges = src.edges;\n\n return dest;\n },\n\n is : require('./is'),\n extend : extend,\n hypot : require('./hypot'),\n getOriginXY: require('./getOriginXY'),\n};\n\nextend(utils, require('./arr'));\nextend(utils, require('./domUtils'));\nextend(utils, require('./pointerUtils'));\nextend(utils, require('./rect'));\n\nmodule.exports = utils;\n","const scope = require('../scope');\nconst utils = require('./index');\n\nconst finder = {\n methodOrder: [ 'simulationResume', 'mouseOrPen', 'hasPointer', 'idle' ],\n\n search: function (pointer, eventType, eventTarget) {\n const pointerType = utils.getPointerType(pointer);\n const pointerId = utils.getPointerId(pointer);\n const details = { pointer, pointerId, pointerType, eventType, eventTarget };\n\n for (const method of finder.methodOrder) {\n const interaction = finder[method](details);\n\n if (interaction) {\n return interaction;\n }\n }\n },\n\n // try to resume simulation with a new pointer\n simulationResume: function ({ pointerType, eventType, eventTarget }) {\n if (!/down|start/i.test(eventType)) {\n return null;\n }\n\n for (const interaction of scope.interactions) {\n let element = eventTarget;\n\n if (interaction.simulation && interaction.simulation.allowResume\n && (interaction.pointerType === pointerType)) {\n while (element) {\n // if the element is the interaction element\n if (element === interaction.element) {\n return interaction;\n }\n element = utils.parentNode(element);\n }\n }\n }\n\n return null;\n },\n\n // if it's a mouse or pen interaction\n mouseOrPen: function ({ pointerId, pointerType, eventType }) {\n if (pointerType !== 'mouse' && pointerType !== 'pen') {\n return null;\n }\n\n let firstNonActive;\n\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType) {\n // if it's a down event, skip interactions with running simulations\n if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; }\n\n // if the interaction is active, return it immediately\n if (interaction.interacting()) {\n return interaction;\n }\n // otherwise save it and look for another active interaction\n else if (!firstNonActive) {\n firstNonActive = interaction;\n }\n }\n }\n\n // if no active mouse interaction was found use the first inactive mouse\n // interaction\n if (firstNonActive) {\n return firstNonActive;\n }\n\n // find any mouse or pen interaction.\n // ignore the interaction if the eventType is a *down, and a simulation\n // is active\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType && !(/down/i.test(eventType) && interaction.simulation)) {\n return interaction;\n }\n }\n\n return null;\n },\n\n // get interaction that has this pointer\n hasPointer: function ({ pointerId }) {\n for (const interaction of scope.interactions) {\n if (utils.contains(interaction.pointerIds, pointerId)) {\n return interaction;\n }\n }\n },\n\n // get first idle interaction with a matching pointerType\n idle: function ({ pointerType }) {\n for (const interaction of scope.interactions) {\n // if there's already a pointer held down\n if (interaction.pointerIds.length === 1) {\n const target = interaction.target;\n // don't add this pointer if there is a target interactable and it\n // isn't gesturable\n if (target && !target.options.gesture.enabled) {\n continue;\n }\n }\n // maximum of 2 pointers per interaction\n else if (interaction.pointerIds.length >= 2) {\n continue;\n }\n\n if (!interaction.interacting() && (pointerType === interaction.pointerType)) {\n return interaction;\n }\n }\n\n return null;\n },\n};\n\nmodule.exports = finder;\n","const win = require('./window');\nconst isWindow = require('./isWindow');\n\nconst is = {\n array : () => {},\n\n window : thing => thing === win.window || isWindow(thing),\n\n docFrag : thing => is.object(thing) && thing.nodeType === 11,\n\n object : thing => !!thing && (typeof thing === 'object'),\n\n function: thing => typeof thing === 'function',\n\n number : thing => typeof thing === 'number' ,\n\n bool : thing => typeof thing === 'boolean' ,\n\n string : thing => typeof thing === 'string' ,\n\n element: thing => {\n if (!thing || (typeof thing !== 'object')) { return false; }\n\n const _window = win.getWindow(thing) || win.window;\n\n return (/object|function/.test(typeof _window.Element)\n ? thing instanceof _window.Element //DOM2\n : thing.nodeType === 1 && typeof thing.nodeName === 'string');\n },\n};\n\nis.array = thing => (is.object(thing)\n && (typeof thing.length !== 'undefined')\n && is.function(thing.splice));\n\nmodule.exports = is;\n","module.exports = (thing) => !!(thing && thing.Window) && (thing instanceof thing.Window);\n","function pointerExtend (dest, source) {\n for (const prop in source) {\n const prefixedPropREs = module.exports.prefixedPropREs;\n let deprecated = false;\n\n // skip deprecated prefixed properties\n for (const vendor in prefixedPropREs) {\n if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) {\n deprecated = true;\n break;\n }\n }\n\n if (!deprecated && typeof source[prop] !== 'function') {\n dest[prop] = source[prop];\n }\n }\n return dest;\n}\n\npointerExtend.prefixedPropREs = {\n webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/,\n};\n\nmodule.exports = pointerExtend;\n","const hypot = require('./hypot');\nconst browser = require('./browser');\nconst dom = require('./domObjects');\nconst domUtils = require('./domUtils');\nconst domObjects = require('./domObjects');\nconst is = require('./is');\nconst pointerExtend = require('./pointerExtend');\n\nconst pointerUtils = {\n copyCoords: function (dest, src) {\n dest.page = dest.page || {};\n dest.page.x = src.page.x;\n dest.page.y = src.page.y;\n\n dest.client = dest.client || {};\n dest.client.x = src.client.x;\n dest.client.y = src.client.y;\n\n dest.timeStamp = src.timeStamp;\n },\n\n setCoordDeltas: function (targetObj, prev, cur) {\n targetObj.page.x = cur.page.x - prev.page.x;\n targetObj.page.y = cur.page.y - prev.page.y;\n targetObj.client.x = cur.client.x - prev.client.x;\n targetObj.client.y = cur.client.y - prev.client.y;\n targetObj.timeStamp = cur.timeStamp - prev.timeStamp;\n\n // set pointer velocity\n const dt = Math.max(targetObj.timeStamp / 1000, 0.001);\n\n targetObj.page.speed = hypot(targetObj.page.x, targetObj.page.y) / dt;\n targetObj.page.vx = targetObj.page.x / dt;\n targetObj.page.vy = targetObj.page.y / dt;\n\n targetObj.client.speed = hypot(targetObj.client.x, targetObj.page.y) / dt;\n targetObj.client.vx = targetObj.client.x / dt;\n targetObj.client.vy = targetObj.client.y / dt;\n },\n\n isNativePointer: function (pointer) {\n return (pointer instanceof dom.Event || pointer instanceof dom.Touch);\n },\n\n // Get specified X/Y coords for mouse or event.touches[0]\n getXY: function (type, pointer, xy) {\n xy = xy || {};\n type = type || 'page';\n\n xy.x = pointer[type + 'X'];\n xy.y = pointer[type + 'Y'];\n\n return xy;\n },\n\n getPageXY: function (pointer, page) {\n page = page || {};\n\n // Opera Mobile handles the viewport and scrolling oddly\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n pointerUtils.getXY('screen', pointer, page);\n\n page.x += window.scrollX;\n page.y += window.scrollY;\n }\n else {\n pointerUtils.getXY('page', pointer, page);\n }\n\n return page;\n },\n\n getClientXY: function (pointer, client) {\n client = client || {};\n\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n // Opera Mobile handles the viewport and scrolling oddly\n pointerUtils.getXY('screen', pointer, client);\n }\n else {\n pointerUtils.getXY('client', pointer, client);\n }\n\n return client;\n },\n\n getPointerId: function (pointer) {\n return is.number(pointer.pointerId)? pointer.pointerId : pointer.identifier;\n },\n\n setCoords: function (targetObj, pointers, timeStamp) {\n const pointer = (pointers.length > 1\n ? pointerUtils.pointerAverage(pointers)\n : pointers[0]);\n\n const tmpXY = {};\n\n pointerUtils.getPageXY(pointer, tmpXY);\n targetObj.page.x = tmpXY.x;\n targetObj.page.y = tmpXY.y;\n\n pointerUtils.getClientXY(pointer, tmpXY);\n targetObj.client.x = tmpXY.x;\n targetObj.client.y = tmpXY.y;\n\n targetObj.timeStamp = is.number(timeStamp) ? timeStamp :new Date().getTime();\n },\n\n pointerExtend: pointerExtend,\n\n getTouchPair: function (event) {\n const touches = [];\n\n // array of touches is supplied\n if (is.array(event)) {\n touches[0] = event[0];\n touches[1] = event[1];\n }\n // an event\n else {\n if (event.type === 'touchend') {\n if (event.touches.length === 1) {\n touches[0] = event.touches[0];\n touches[1] = event.changedTouches[0];\n }\n else if (event.touches.length === 0) {\n touches[0] = event.changedTouches[0];\n touches[1] = event.changedTouches[1];\n }\n }\n else {\n touches[0] = event.touches[0];\n touches[1] = event.touches[1];\n }\n }\n\n return touches;\n },\n\n pointerAverage: function (pointers) {\n const average = {\n pageX : 0,\n pageY : 0,\n clientX: 0,\n clientY: 0,\n screenX: 0,\n screenY: 0,\n };\n\n for (const pointer of pointers) {\n for (const prop in average) {\n average[prop] += pointer[prop];\n }\n }\n for (const prop in average) {\n average[prop] /= pointers.length;\n }\n\n return average;\n },\n\n touchBBox: function (event) {\n if (!event.length && !(event.touches && event.touches.length > 1)) {\n return;\n }\n\n const touches = pointerUtils.getTouchPair(event);\n const minX = Math.min(touches[0].pageX, touches[1].pageX);\n const minY = Math.min(touches[0].pageY, touches[1].pageY);\n const maxX = Math.max(touches[0].pageX, touches[1].pageX);\n const maxY = Math.max(touches[0].pageY, touches[1].pageY);\n\n return {\n x: minX,\n y: minY,\n left: minX,\n top: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n },\n\n touchDistance: function (event, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n\n\n const dx = touches[0][sourceX] - touches[1][sourceX];\n const dy = touches[0][sourceY] - touches[1][sourceY];\n\n return hypot(dx, dy);\n },\n\n touchAngle: function (event, prevAngle, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n const dx = touches[1][sourceX] - touches[0][sourceX];\n const dy = touches[1][sourceY] - touches[0][sourceY];\n const angle = 180 * Math.atan2(dy , dx) / Math.PI;\n\n return angle;\n },\n\n getPointerType: function (pointer) {\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : is.number(pointer.pointerType)\n ? [undefined, undefined,'touch', 'pen', 'mouse'][pointer.pointerType]\n // if the PointerEvent API isn't available, then the \"pointer\" must\n // be either a MouseEvent, TouchEvent, or Touch object\n : /touch/.test(pointer.type) || pointer instanceof domObjects.Touch\n ? 'touch'\n : 'mouse';\n },\n\n // [ event.target, event.currentTarget ]\n getEventTargets: function (event) {\n return [\n domUtils.getActualElement(event.path ? event.path[0] : event.target),\n domUtils.getActualElement(event.currentTarget),\n ];\n },\n};\n\nmodule.exports = pointerUtils;\n","const { window } = require('./window');\n\nconst vendors = ['ms', 'moz', 'webkit', 'o'];\nlet lastTime = 0;\nlet request;\nlet cancel;\n\nfor (let x = 0; x < vendors.length && !window.requestAnimationFrame; x++) {\n request = window[vendors[x] + 'RequestAnimationFrame'];\n cancel = window[vendors[x] +'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n}\n\nif (!request) {\n request = function (callback) {\n const currTime = new Date().getTime();\n const timeToCall = Math.max(0, 16 - (currTime - lastTime));\n const id = setTimeout(function () { callback(currTime + timeToCall); },\n timeToCall);\n\n lastTime = currTime + timeToCall;\n return id;\n };\n}\n\nif (!cancel) {\n cancel = function (id) {\n clearTimeout(id);\n };\n}\n\nmodule.exports = {\n request,\n cancel,\n};\n","const extend = require('./extend');\nconst is = require('./is');\nconst {\n closest,\n parentNode,\n getElementRect,\n} = require('./domUtils');\n\nconst rectUtils = {\n getStringOptionResult: function (value, interactable, element) {\n if (!is.string(value)) {\n return null;\n }\n\n if (value === 'parent') {\n value = parentNode(element);\n }\n else if (value === 'self') {\n value = interactable.getRect(element);\n }\n else {\n value = closest(element, value);\n }\n\n return value;\n },\n\n resolveRectLike: function (value, interactable, element, functionArgs) {\n value = rectUtils.getStringOptionResult(value, interactable, element) || value;\n\n if (is.function(value)) {\n value = value.apply(null, functionArgs);\n }\n\n if (is.element(value)) {\n value = getElementRect(value);\n }\n\n return value;\n },\n\n rectToXY: function (rect) {\n return rect && {\n x: 'x' in rect ? rect.x : rect.left,\n y: 'y' in rect ? rect.y : rect.top,\n };\n },\n\n xywhToTlbr: function (rect) {\n if (rect && !('left' in rect && 'top' in rect)) {\n rect = extend({}, rect);\n\n rect.left = rect.x || 0;\n rect.top = rect.y || 0;\n rect.right = rect.right || (rect.left + rect.width);\n rect.bottom = rect.bottom || (rect.top + rect.height);\n }\n\n return rect;\n },\n\n tlbrToXywh: function (rect) {\n if (rect && !('x' in rect && 'y' in rect)) {\n rect = extend({}, rect);\n\n rect.x = rect.left || 0;\n rect.top = rect.top || 0;\n rect.width = rect.width || (rect.right - rect.x);\n rect.height = rect.height || (rect.bottom - rect.y);\n }\n\n return rect;\n },\n};\n\nmodule.exports = rectUtils;\n","const win = module.exports;\nconst isWindow = require('./isWindow');\n\nfunction init (window) {\n // get wrapped window if using Shadow DOM polyfill\n\n win.realWindow = window;\n\n // create a TextNode\n const el = window.document.createTextNode('');\n\n // check if it's wrapped by a polyfill\n if (el.ownerDocument !== window.document\n && typeof window.wrap === 'function'\n && window.wrap(el) === el) {\n // use wrapped window\n window = window.wrap(window);\n }\n\n win.window = window;\n}\n\nif (typeof window === 'undefined') {\n win.window = undefined;\n win.realWindow = undefined;\n}\nelse {\n init(window);\n}\n\nwin.getWindow = function getWindow (node) {\n if (isWindow(node)) {\n return node;\n }\n\n const rootNode = (node.ownerDocument || node);\n\n return rootNode.defaultView || rootNode.parentWindow || win.window;\n};\n\nwin.init = init;\n"]} \ No newline at end of file diff --git a/package.json b/package.json index 76f3e9969..f39704e99 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "interactjs", - "version": "1.3.0-alpha.3+sha.9595c40", + "version": "1.3.0-alpha.4+sha.7970416", "repository": { "type": "git", "url": "https://github.com/taye/interact.js.git"
- interact.maxInteractions([newValue])⚓➭ + interact.maxInteractions([newValue])⚓➭ @@ -1652,7 +1652,7 @@ Parameters - Interactable.preventDefault([newValue])⚓➭ + Interactable.preventDefault([newValue])⚓➭ @@ -1718,7 +1718,7 @@ Parameters - interact(element)⚓➭ + interact(element)⚓➭ @@ -1821,7 +1821,7 @@ Usage - interact.isSet(element)⚓➭ + interact.isSet(element)⚓➭ @@ -1881,7 +1881,7 @@ Parameters - interact.on(type, listener, [options])⚓➭ + interact.on(type, listener, [options])⚓➭ @@ -1948,7 +1948,7 @@ Parameters - interact.off(type, listener, [options])⚓➭ + interact.off(type, listener, [options])⚓➭ @@ -2014,7 +2014,7 @@ Parameters - interact.debug()⚓➭ + interact.debug()⚓➭ @@ -2056,7 +2056,7 @@ interact.debug() - interact.supportsTouch()⚓➭ + interact.supportsTouch()⚓➭ @@ -2097,7 +2097,7 @@ interact.supportsTouch() - interact.supportsPointerEvent()⚓➭ + interact.supportsPointerEvent()⚓➭ @@ -2138,7 +2138,7 @@ interact.supportsPointerEvent() - interact.stop(event)⚓➭ + interact.stop(event)⚓➭ @@ -2198,7 +2198,7 @@ Parameters - interact.pointerMoveTolerance([newValue])⚓➭ + interact.pointerMoveTolerance([newValue])⚓➭ @@ -2261,7 +2261,7 @@ Parameters - Interaction.start(action, target, element)⚓➭ + Interaction.start(action, target, element)⚓➭ @@ -2356,7 +2356,7 @@ Parameters - Interaction.doMove()⚓➭ + Interaction.doMove()⚓➭ @@ -2403,7 +2403,7 @@ Interaction.doMove() - Interaction.end([event])⚓➭ + Interaction.end([event])⚓➭ diff --git a/dist/interact.js b/dist/interact.js index e8ae35c3b..c78a3c751 100644 --- a/dist/interact.js +++ b/dist/interact.js @@ -1,5 +1,5 @@ /** - * interact.js v1.3.0-alpha.3+sha.9595c40 + * interact.js v1.3.0-alpha.4+sha.7970416-dirty * * Copyright (c) 2012-2017 Taye Adeyemi * Open source under the MIT License. @@ -816,6 +816,7 @@ var scope = require('./scope'); var utils = require('./utils'); var events = require('./utils/events'); var browser = require('./utils/browser'); +var domObjects = require('./utils/domObjects'); var finder = require('./utils/interactionFinder'); var signals = require('./utils/Signals').new(); @@ -829,7 +830,9 @@ var prevTouchTime = 0; scope.interactions = []; var Interaction = function () { - function Interaction() { + function Interaction(_ref) { + var pointerType = _ref.pointerType; + _classCallCheck(this, Interaction); this.target = null; // current interactable being interacted with @@ -886,7 +889,7 @@ var Interaction = function () { this.pointerWasMoved = false; this._interacting = false; - this.mouse = false; + this.pointerType = pointerType; signals.fire('new', this); @@ -1130,6 +1133,11 @@ var Interaction = function () { }; Interaction.prototype.getPointerIndex = function getPointerIndex(pointer) { + // mouse and pen interactions may have only one pointer + if (this.pointerType === 'mouse' || this.pointerType === 'pen') { + return 0; + } + return utils.indexOf(this.pointerIds, utils.getPointerId(pointer)); }; @@ -1161,8 +1169,7 @@ var Interaction = function () { }; Interaction.prototype.removePointer = function removePointer(pointer, event) { - var id = utils.getPointerId(pointer); - var index = this.mouse ? 0 : utils.indexOf(this.pointerIds, id); + var index = this.getPointerIndex(pointer); if (index === -1) { return; @@ -1197,6 +1204,8 @@ for (var i = 0, len = methodNames.length; i < len; i++) { function doOnInteractions(method) { return function (event) { + var pointerType = utils.getPointerType(event); + var _utils$getEventTarget = utils.getEventTargets(event), eventTarget = _utils$getEventTarget[0], curEventTarget = _utils$getEventTarget[1]; @@ -1210,7 +1219,7 @@ function doOnInteractions(method) { var pointer = event.changedTouches[_i]; var interaction = finder.search(pointer, event.type, eventTarget); - matches.push([pointer, interaction || new Interaction()]); + matches.push([pointer, interaction || new Interaction({ pointerType: pointerType })]); } } else { var invalidPointer = false; @@ -1218,7 +1227,7 @@ function doOnInteractions(method) { if (!browser.supportsPointerEvent && /mouse/.test(event.type)) { // ignore mouse events while touch interactions are active for (var _i2 = 0; _i2 < scope.interactions.length && !invalidPointer; _i2++) { - invalidPointer = !scope.interactions[_i2].mouse && scope.interactions[_i2].pointerIsDown; + invalidPointer = scope.interactions[_i2].pointerType !== 'mouse' && scope.interactions[_i2].pointerIsDown; } // try to ignore mouse events that are simulated by the browser @@ -1232,11 +1241,7 @@ function doOnInteractions(method) { var _interaction = finder.search(event, event.type, eventTarget); if (!_interaction) { - - _interaction = new Interaction(); - _interaction.mouse = /mouse/i.test(event.pointerType || event.type) - // MSPointerEvent.MSPOINTER_TYPE_MOUSE - || event.pointerType === 4 || !event.pointerType; + _interaction = new Interaction({ pointerType: pointerType }); } matches.push([event, _interaction]); @@ -1244,20 +1249,20 @@ function doOnInteractions(method) { } for (var _iterator = matches, _isArray = Array.isArray(_iterator), _i3 = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { - var _ref; + var _ref2; if (_isArray) { if (_i3 >= _iterator.length) break; - _ref = _iterator[_i3++]; + _ref2 = _iterator[_i3++]; } else { _i3 = _iterator.next(); if (_i3.done) break; - _ref = _i3.value; + _ref2 = _i3.value; } - var _ref2 = _ref, - _pointer = _ref2[0], - _interaction2 = _ref2[1]; + var _ref3 = _ref2, + _pointer = _ref3[0], + _interaction2 = _ref3[1]; _interaction2._updateEventTargets(eventTarget, curEventTarget); _interaction2[method](_pointer, event, eventTarget, curEventTarget); @@ -1277,7 +1282,7 @@ function endAll(event) { var docEvents = {/* 'eventType': listenerFunc */}; var pEventTypes = browser.pEventTypes; -if (scope.PointerEvent) { +if (domObjects.PointerEvent) { docEvents[pEventTypes.down] = listeners.pointerDown; docEvents[pEventTypes.move] = listeners.pointerMove; docEvents[pEventTypes.up] = listeners.pointerUp; @@ -1295,8 +1300,8 @@ if (scope.PointerEvent) { docEvents.blur = endAll; -function onDocSignal(_ref3, signalName) { - var doc = _ref3.doc; +function onDocSignal(_ref4, signalName) { + var doc = _ref4.doc; var eventMethod = signalName.indexOf('add') === 0 ? events.add : events.remove; @@ -1311,14 +1316,14 @@ function onDocSignal(_ref3, signalName) { } } -signals.on('update-pointer-down', function (_ref4) { - var interaction = _ref4.interaction, - pointer = _ref4.pointer, - pointerId = _ref4.pointerId, - pointerIndex = _ref4.pointerIndex, - event = _ref4.event, - eventTarget = _ref4.eventTarget, - down = _ref4.down; +signals.on('update-pointer-down', function (_ref5) { + var interaction = _ref5.interaction, + pointer = _ref5.pointer, + pointerId = _ref5.pointerId, + pointerIndex = _ref5.pointerIndex, + event = _ref5.event, + eventTarget = _ref5.eventTarget, + down = _ref5.down; interaction.pointerIds[pointerIndex] = pointerId; interaction.pointers[pointerIndex] = pointer; @@ -1355,7 +1360,7 @@ scope.endAllInteractions = endAll; module.exports = Interaction; -},{"./scope":34,"./utils":44,"./utils/Signals":35,"./utils/browser":37,"./utils/events":40,"./utils/interactionFinder":45}],6:[function(require,module,exports){ +},{"./scope":34,"./utils":44,"./utils/Signals":35,"./utils/browser":37,"./utils/domObjects":38,"./utils/events":40,"./utils/interactionFinder":45}],6:[function(require,module,exports){ 'use strict'; var Interaction = require('../Interaction'); @@ -5460,7 +5465,7 @@ module.exports = function () { this.originalEvent = event; this.type = type; this.pointerId = pointerUtils.getPointerId(pointer); - this.pointerType = pointerUtils.getPointerType(pointer, interaction); + this.pointerType = pointerUtils.getPointerType(pointer); this.target = eventTarget; this.currentTarget = null; @@ -5758,8 +5763,10 @@ Interaction.signals.on('down', function (_ref6) { timer.duration = minDuration; timer.timeout = setTimeout(function () { fire({ - interaction: interaction, eventCopy: eventCopy, eventTarget: eventTarget, + interaction: interaction, + eventTarget: eventTarget, pointer: browser.isIE8 ? eventCopy : pointer, + event: eventCopy, type: 'hold' }); }, minDuration); @@ -6946,17 +6953,14 @@ module.exports = utils; var scope = require('../scope'); var utils = require('./index'); -var browser = require('./browser'); var finder = { - methodOrder: ['simulationResume', 'mouse', 'hasPointer', 'idle'], + methodOrder: ['simulationResume', 'mouseOrPen', 'hasPointer', 'idle'], search: function search(pointer, eventType, eventTarget) { - var mouseEvent = /mouse/i.test(pointer.pointerType || eventType) - // MSPointerEvent.MSPOINTER_TYPE_MOUSE - || pointer.pointerType === 4; + var pointerType = utils.getPointerType(pointer); var pointerId = utils.getPointerId(pointer); - var details = { pointer: pointer, pointerId: pointerId, mouseEvent: mouseEvent, eventType: eventType, eventTarget: eventTarget }; + var details = { pointer: pointer, pointerId: pointerId, pointerType: pointerType, eventType: eventType, eventTarget: eventTarget }; for (var _iterator = finder.methodOrder, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { var _ref; @@ -6982,7 +6986,7 @@ var finder = { // try to resume simulation with a new pointer simulationResume: function simulationResume(_ref2) { - var mouseEvent = _ref2.mouseEvent, + var pointerType = _ref2.pointerType, eventType = _ref2.eventType, eventTarget = _ref2.eventTarget; @@ -7006,7 +7010,7 @@ var finder = { var element = eventTarget; - if (interaction.simulation && interaction.simulation.allowResume && interaction.mouse === mouseEvent) { + if (interaction.simulation && interaction.simulation.allowResume && interaction.pointerType === pointerType) { while (element) { // if the element is the interaction element if (element === interaction.element) { @@ -7020,13 +7024,13 @@ var finder = { return null; }, - // if it's a mouse interaction - mouse: function mouse(_ref4) { + // if it's a mouse or pen interaction + mouseOrPen: function mouseOrPen(_ref4) { var pointerId = _ref4.pointerId, - mouseEvent = _ref4.mouseEvent, + pointerType = _ref4.pointerType, eventType = _ref4.eventType; - if (!mouseEvent && (browser.supportsTouch || browser.supportsPointerEvent)) { + if (pointerType !== 'mouse' && pointerType !== 'pen') { return null; } @@ -7046,7 +7050,7 @@ var finder = { var interaction = _ref5; - if (interaction.mouse) { + if (interaction.pointerType === pointerType) { // if it's a down event, skip interactions with running simulations if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; @@ -7069,8 +7073,8 @@ var finder = { return firstNonActive; } - // Find any interaction specifically for mouse. - // ignore the interaction if the eventType is a mousedown, and a simulation + // find any mouse or pen interaction. + // ignore the interaction if the eventType is a *down, and a simulation // is active for (var _iterator4 = scope.interactions, _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) { var _ref6; @@ -7086,7 +7090,7 @@ var finder = { var _interaction = _ref6; - if (_interaction.mouse && !(/down/.test(eventType) && _interaction.simulation)) { + if (_interaction.pointerType === pointerType && !(/down/i.test(eventType) && _interaction.simulation)) { return _interaction; } } @@ -7118,9 +7122,9 @@ var finder = { } }, - // get first idle interaction + // get first idle interaction with a matching pointerType idle: function idle(_ref9) { - var mouseEvent = _ref9.mouseEvent; + var pointerType = _ref9.pointerType; for (var _iterator6 = scope.interactions, _isArray6 = Array.isArray(_iterator6), _i6 = 0, _iterator6 = _isArray6 ? _iterator6 : _iterator6[Symbol.iterator]();;) { var _ref10; @@ -7150,7 +7154,7 @@ var finder = { continue; } - if (!interaction.interacting() && mouseEvent === interaction.mouse) { + if (!interaction.interacting() && pointerType === interaction.pointerType) { return interaction; } } @@ -7161,7 +7165,7 @@ var finder = { module.exports = finder; -},{"../scope":34,"./browser":37,"./index":44}],46:[function(require,module,exports){ +},{"../scope":34,"./index":44}],46:[function(require,module,exports){ 'use strict'; var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; @@ -7262,6 +7266,7 @@ var hypot = require('./hypot'); var browser = require('./browser'); var dom = require('./domObjects'); var domUtils = require('./domUtils'); +var domObjects = require('./domObjects'); var is = require('./is'); var pointerExtend = require('./pointerExtend'); @@ -7468,17 +7473,11 @@ var pointerUtils = { return angle; }, - getPointerType: function getPointerType(pointer, interaction) { - // if the PointerEvent API isn't available, then the pointer must be ither - // a MouseEvent or TouchEvent - if (interaction.mouse) { - return 'mouse'; - } - if (!browser.supportsPointerEvent) { - return 'touch'; - } - - return is.string(pointer.pointerType) ? pointer.pointerType : [undefined, undefined, 'touch', 'pen', 'mouse'][pointer.pointerType]; + getPointerType: function getPointerType(pointer) { + return is.string(pointer.pointerType) ? pointer.pointerType : is.number(pointer.pointerType) ? [undefined, undefined, 'touch', 'pen', 'mouse'][pointer.pointerType] + // if the PointerEvent API isn't available, then the "pointer" must + // be either a MouseEvent, TouchEvent, or Touch object + : /touch/.test(pointer.type) || pointer instanceof domObjects.Touch ? 'touch' : 'mouse'; }, // [ event.target, event.currentTarget ] diff --git a/dist/interact.js.map b/dist/interact.js.map index 60832b766..4f3a62ba8 100644 --- a/dist/interact.js.map +++ b/dist/interact.js.map @@ -1 +1 @@ -{"version":3,"sources":["src/header.js","node_modules/browser-pack/_prelude.js","index.js","src/Eventable.js","src/InteractEvent.js","src/Interactable.js","src/Interaction.js","src/actions/base.js","src/actions/drag.js","src/actions/drop.js","src/actions/gesture.js","src/actions/resize.js","src/autoScroll.js","src/autoStart/InteractableMethods.js","src/autoStart/base.js","src/autoStart/delay.js","src/autoStart/drag.js","src/autoStart/gesture.js","src/autoStart/resize.js","src/defaultOptions.js","src/index.js","src/inertia.js","src/interact.js","src/interactablePreventDefault.js","src/legacyBrowsers.js","src/modifiers/index.js","src/modifiers/restrict.js","src/modifiers/restrictEdges.js","src/modifiers/restrictSize.js","src/modifiers/snap.js","src/modifiers/snapSize.js","src/pointerEvents/PointerEvent.js","src/pointerEvents/base.js","src/pointerEvents/holdRepeat.js","src/pointerEvents/interactableTargets.js","src/scope.js","src/utils/Signals.js","src/utils/arr.js","src/utils/browser.js","src/utils/domObjects.js","src/utils/domUtils.js","src/utils/events.js","src/utils/extend.js","src/utils/getOriginXY.js","src/utils/hypot.js","src/utils/index.js","src/utils/interactionFinder.js","src/utils/is.js","src/utils/isWindow.js","src/utils/pointerExtend.js","src/utils/pointerUtils.js","src/utils/raf.js","src/utils/rect.js","src/utils/window.js"],"names":[],"mappings":"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","file":"interact.js","sourceRoot":"","sourcesContent":["/**\n * interact.js v1.3.0-alpha.3+sha.9595c40\n *\n * Copyright (c) 2012-2017 Taye Adeyemi \n * Open source under the MIT License.\n * https://raw.github.com/taye/interact.js/master/LICENSE\n */\n","(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o 150) {\n return null;\n }\n\n let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI;\n const overlap = 22.5;\n\n if (angle < 0) {\n angle += 360;\n }\n\n const left = 135 - overlap <= angle && angle < 225 + overlap;\n const up = 225 - overlap <= angle && angle < 315 + overlap;\n\n const right = !left && (315 - overlap <= angle || angle < 45 + overlap);\n const down = !up && 45 - overlap <= angle && angle < 135 + overlap;\n\n return {\n up,\n down,\n left,\n right,\n angle,\n speed: interaction.prevEvent.speed,\n velocity: {\n x: interaction.prevEvent.velocityX,\n y: interaction.prevEvent.velocityY,\n },\n };\n }\n\n preventDefault () {}\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n}\n\nsignals.on('set-delta', function ({ iEvent, interaction, starting, deltaSource }) {\n const prevEvent = starting? iEvent : interaction.prevEvent;\n\n if (deltaSource === 'client') {\n iEvent.dx = iEvent.clientX - prevEvent.clientX;\n iEvent.dy = iEvent.clientY - prevEvent.clientY;\n }\n else {\n iEvent.dx = iEvent.pageX - prevEvent.pageX;\n iEvent.dy = iEvent.pageY - prevEvent.pageY;\n }\n});\n\nInteractEvent.signals = signals;\n\nmodule.exports = InteractEvent;\n","const is = require('./utils/is');\nconst events = require('./utils/events');\nconst extend = require('./utils/extend');\nconst actions = require('./actions/base');\nconst scope = require('./scope');\nconst Eventable = require('./Eventable');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nconst {\n getElementRect,\n nodeContains,\n trySelector,\n} = require('./utils/domUtils');\nconst { getWindow } = require('./utils/window');\nconst { indexOf, contains } = require('./utils/arr');\nconst { wheelEvent } = require('./utils/browser');\n\n// all set interactables\nscope.interactables = [];\n\n/*\\\n * Interactable\n [ property ]\n **\n * Object type returned by @interact\n\\*/\nclass Interactable {\n constructor (target, options) {\n options = options || {};\n\n this.target = target;\n this.events = new Eventable();\n this._context = options.context || scope.document;\n this._win = getWindow(trySelector(target)? this._context : target);\n this._doc = this._win.document;\n\n signals.fire('new', {\n target,\n options,\n interactable: this,\n win: this._win,\n });\n\n scope.addDocument( this._doc, this._win );\n\n scope.interactables.push(this);\n\n this.set(options);\n }\n\n setOnEvents (action, phases) {\n const onAction = 'on' + action;\n\n if (is.function(phases.onstart) ) { this.events[onAction + 'start' ] = phases.onstart ; }\n if (is.function(phases.onmove) ) { this.events[onAction + 'move' ] = phases.onmove ; }\n if (is.function(phases.onend) ) { this.events[onAction + 'end' ] = phases.onend ; }\n if (is.function(phases.oninertiastart)) { this.events[onAction + 'inertiastart' ] = phases.oninertiastart ; }\n\n return this;\n }\n\n setPerAction (action, options) {\n // for all the default per-action options\n for (const option in options) {\n // if this option exists for this action\n if (option in defaults[action]) {\n // if the option in the options arg is an object value\n if (is.object(options[option])) {\n // duplicate the object\n this.options[action][option] = extend(this.options[action][option] || {}, options[option]);\n\n if (is.object(defaults.perAction[option]) && 'enabled' in defaults.perAction[option]) {\n this.options[action][option].enabled = options[option].enabled === false? false : true;\n }\n }\n else if (is.bool(options[option]) && is.object(defaults.perAction[option])) {\n this.options[action][option].enabled = options[option];\n }\n else if (options[option] !== undefined) {\n // or if it's not undefined, do a plain assignment\n this.options[action][option] = options[option];\n }\n }\n }\n }\n\n /*\\\n * Interactable.getRect\n [ method ]\n *\n * The default function to get an Interactables bounding rect. Can be\n * overridden using @Interactable.rectChecker.\n *\n - element (Element) #optional The element to measure.\n = (object) The object's bounding rectangle.\n o {\n o top : 0,\n o left : 0,\n o bottom: 0,\n o right : 0,\n o width : 0,\n o height: 0\n o }\n \\*/\n getRect (element) {\n element = element || this.target;\n\n if (is.string(this.target) && !(is.element(element))) {\n element = this._context.querySelector(this.target);\n }\n\n return getElementRect(element);\n }\n\n /*\\\n * Interactable.rectChecker\n [ method ]\n *\n * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n - checker (function) #optional A function which returns this Interactable's bounding rectangle. See @Interactable.getRect\n = (function | object) The checker function or this Interactable\n \\*/\n rectChecker (checker) {\n if (is.function(checker)) {\n this.getRect = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.getRect;\n\n return this;\n }\n\n return this.getRect;\n }\n\n _backCompatOption (optionName, newValue) {\n if (trySelector(newValue) || is.object(newValue)) {\n this.options[optionName] = newValue;\n\n for (const action of actions.names) {\n this.options[action][optionName] = newValue;\n }\n\n return this;\n }\n\n return this.options[optionName];\n }\n\n /*\\\n * Interactable.origin\n [ method ]\n *\n * Gets or sets the origin of the Interactable's element. The x and y\n * of the origin will be subtracted from action event coordinates.\n *\n - origin (object | string) #optional An object eg. { x: 0, y: 0 } or string 'parent', 'self' or any CSS selector\n * OR\n - origin (Element) #optional An HTML or SVG Element whose rect will be used\n **\n = (object) The current origin or this Interactable\n \\*/\n origin (newValue) {\n return this._backCompatOption('origin', newValue);\n }\n\n /*\\\n * Interactable.deltaSource\n [ method ]\n *\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n - newValue (string) #optional Use 'client' if you will be scrolling while interacting; Use 'page' if you want autoScroll to work\n = (string | object) The current deltaSource or this Interactable\n \\*/\n deltaSource (newValue) {\n if (newValue === 'page' || newValue === 'client') {\n this.options.deltaSource = newValue;\n\n return this;\n }\n\n return this.options.deltaSource;\n }\n\n /*\\\n * Interactable.context\n [ method ]\n *\n * Gets the selector context Node of the Interactable. The default is `window.document`.\n *\n = (Node) The context Node of this Interactable\n **\n \\*/\n context () {\n return this._context;\n }\n\n inContext (element) {\n return (this._context === element.ownerDocument\n || nodeContains(this._context, element));\n }\n\n /*\\\n * Interactable.fire\n [ method ]\n *\n * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n - iEvent (InteractEvent) The InteractEvent object to be fired on this Interactable\n = (Interactable) this Interactable\n \\*/\n fire (iEvent) {\n this.events.fire(iEvent);\n\n return this;\n }\n\n _onOffMultiple (method, eventType, listener, options) {\n if (is.string(eventType) && eventType.search(' ') !== -1) {\n eventType = eventType.trim().split(/ +/);\n }\n\n if (is.array(eventType)) {\n for (let i = 0; i < eventType.length; i++) {\n this[method](eventType[i], listener, options);\n }\n\n return true;\n }\n\n if (is.object(eventType)) {\n for (const prop in eventType) {\n this[method](prop, eventType[prop], listener);\n }\n\n return true;\n }\n }\n\n /*\\\n * Interactable.on\n [ method ]\n *\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n - eventType (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) This Interactable\n \\*/\n on (eventType, listener, options) {\n if (this._onOffMultiple('on', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.on(eventType, listener);\n }\n // delegated event for selector\n else if (is.string(this.target)) {\n events.addDelegate(this.target, this._context, eventType, listener, options);\n }\n else {\n events.add(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.off\n [ method ]\n *\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n - eventType (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) This Interactable\n \\*/\n off (eventType, listener, options) {\n if (this._onOffMultiple('off', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n // if it is an action event type\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.off(eventType, listener);\n }\n // delegated event\n else if (is.string(this.target)) {\n events.removeDelegate(this.target, this._context, eventType, listener, options);\n }\n // remove listener from this Interatable's element\n else {\n events.remove(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.set\n [ method ]\n *\n * Reset the options of this Interactable\n - options (object) The new settings to apply\n = (object) This Interactable\n \\*/\n set (options) {\n if (!is.object(options)) {\n options = {};\n }\n\n this.options = extend({}, defaults.base);\n\n const perActions = extend({}, defaults.perAction);\n\n for (const actionName in actions.methodDict) {\n const methodName = actions.methodDict[actionName];\n\n this.options[actionName] = extend({}, defaults[actionName]);\n\n this.setPerAction(actionName, perActions);\n\n this[methodName](options[actionName]);\n }\n\n for (const setting of Interactable.settingsMethods) {\n this.options[setting] = defaults.base[setting];\n\n if (setting in options) {\n this[setting](options[setting]);\n }\n }\n\n signals.fire('set', {\n options,\n interactable: this,\n });\n\n return this;\n }\n\n /*\\\n * Interactable.unset\n [ method ]\n *\n * Remove this interactable from the list of interactables and remove\n * it's action capabilities and event listeners\n *\n = (object) @interact\n \\*/\n unset () {\n events.remove(this.target, 'all');\n\n if (is.string(this.target)) {\n // remove delegated events\n for (const type in events.delegatedEvents) {\n const delegated = events.delegatedEvents[type];\n\n if (delegated.selectors[0] === this.target\n && delegated.contexts[0] === this._context) {\n\n delegated.selectors.splice(0, 1);\n delegated.contexts .splice(0, 1);\n delegated.listeners.splice(0, 1);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegated[type] = null;\n }\n }\n\n events.remove(this._context, type, events.delegateListener);\n events.remove(this._context, type, events.delegateUseCapture, true);\n }\n }\n else {\n events.remove(this, 'all');\n }\n\n signals.fire('unset', { interactable: this });\n\n scope.interactables.splice(indexOf(scope.interactables, this), 1);\n\n // Stop related interactions when an Interactable is unset\n for (const interaction of scope.interactions || []) {\n if (interaction.target === this && interaction.interacting()) {\n interaction.stop();\n }\n }\n\n return scope.interact;\n }\n}\n\nscope.interactables.indexOfElement = function indexOfElement (target, context) {\n context = context || scope.document;\n\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n if (interactable.target === target && interactable._context === context) {\n return i;\n }\n }\n return -1;\n};\n\nscope.interactables.get = function interactableGet (element, options, dontCheckInContext) {\n const ret = this[this.indexOfElement(element, options && options.context)];\n\n return ret && (is.string(element) || dontCheckInContext || ret.inContext(element))? ret : null;\n};\n\nscope.interactables.forEachSelector = function (callback, element) {\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n // skip non CSS selector targets and out of context elements\n if (!is.string(interactable.target)\n || (element && !interactable.inContext(element))) {\n continue;\n }\n\n const ret = callback(interactable, interactable.target, interactable._context, i, this);\n\n if (ret !== undefined) {\n return ret;\n }\n }\n};\n\n// all interact.js eventTypes\nInteractable.eventTypes = scope.eventTypes = [];\n\nInteractable.signals = signals;\n\nInteractable.settingsMethods = [ 'deltaSource', 'origin', 'preventDefault', 'rectChecker' ];\n\nmodule.exports = Interactable;\n","const scope = require('./scope');\nconst utils = require('./utils');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst finder = require('./utils/interactionFinder');\nconst signals = require('./utils/Signals').new();\n\nconst listeners = {};\nconst methodNames = [\n 'pointerDown', 'pointerMove', 'pointerUp',\n 'updatePointer', 'removePointer',\n];\n\n// for ignoring browser's simulated mouse events\nlet prevTouchTime = 0;\n\n// all active and idle interactions\nscope.interactions = [];\n\nclass Interaction {\n constructor () {\n this.target = null; // current interactable being interacted with\n this.element = null; // the target element of the interactable\n\n this.prepared = { // action that's ready to be fired on next move event\n name : null,\n axis : null,\n edges: null,\n };\n\n // keep track of added pointers\n this.pointers = [];\n this.pointerIds = [];\n this.downTargets = [];\n this.downTimes = [];\n\n // Previous native pointer move event coordinates\n this.prevCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n // current native pointer move event coordinates\n this.curCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Starting InteractEvent pointer coordinates\n this.startCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Change in coordinates and time of the pointer\n this.pointerDelta = {\n page : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n client : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n timeStamp: 0,\n };\n\n this.downEvent = null; // pointerdown/mousedown/touchstart event\n this.downPointer = {};\n\n this._eventTarget = null;\n this._curEventTarget = null;\n\n this.prevEvent = null; // previous action event\n\n this.pointerIsDown = false;\n this.pointerWasMoved = false;\n this._interacting = false;\n\n this.mouse = false;\n\n signals.fire('new', this);\n\n scope.interactions.push(this);\n }\n\n pointerDown (pointer, event, eventTarget) {\n const pointerIndex = this.updatePointer(pointer, event, true);\n\n signals.fire('down', {\n pointer,\n event,\n eventTarget,\n pointerIndex,\n interaction: this,\n });\n }\n\n /*\\\n * Interaction.start\n [ method ]\n *\n * Start an action with the given Interactable and Element as tartgets. The\n * action must be enabled for the target Interactable and an appropriate number\n * of pointers must be held down - 1 for drag/resize, 2 for gesture.\n *\n * Use it with `interactable.able({ manualStart: false })` to always\n * [start actions manually](https://github.com/taye/interact.js/issues/114)\n *\n - action (object) The action to be performed - drag, resize, etc.\n - target (Interactable) The Interactable to target\n - element (Element) The DOM Element to target\n = (object) interact\n **\n | interact(target)\n | .draggable({\n | // disable the default drag start by down->move\n | manualStart: true\n | })\n | // start dragging after the user holds the pointer down\n | .on('hold', function (event) {\n | var interaction = event.interaction;\n |\n | if (!interaction.interacting()) {\n | interaction.start({ name: 'drag' },\n | event.interactable,\n | event.currentTarget);\n | }\n | });\n \\*/\n start (action, target, element) {\n if (this.interacting()\n || !this.pointerIsDown\n || this.pointerIds.length < (action.name === 'gesture'? 2 : 1)) {\n return;\n }\n\n // if this interaction had been removed after stopping\n // add it back\n if (utils.indexOf(scope.interactions, this) === -1) {\n scope.interactions.push(this);\n }\n\n utils.copyAction(this.prepared, action);\n this.target = target;\n this.element = element;\n\n signals.fire('action-start', {\n interaction: this,\n event: this.downEvent,\n });\n }\n\n pointerMove (pointer, event, eventTarget) {\n if (!this.simulation) {\n this.updatePointer(pointer);\n utils.setCoords(this.curCoords, this.pointers);\n }\n\n const duplicateMove = (this.curCoords.page.x === this.prevCoords.page.x\n && this.curCoords.page.y === this.prevCoords.page.y\n && this.curCoords.client.x === this.prevCoords.client.x\n && this.curCoords.client.y === this.prevCoords.client.y);\n\n let dx;\n let dy;\n\n // register movement greater than pointerMoveTolerance\n if (this.pointerIsDown && !this.pointerWasMoved) {\n dx = this.curCoords.client.x - this.startCoords.client.x;\n dy = this.curCoords.client.y - this.startCoords.client.y;\n\n this.pointerWasMoved = utils.hypot(dx, dy) > Interaction.pointerMoveTolerance;\n }\n\n const signalArg = {\n pointer,\n pointerIndex: this.getPointerIndex(pointer),\n event,\n eventTarget,\n dx,\n dy,\n duplicate: duplicateMove,\n interaction: this,\n interactingBeforeMove: this.interacting(),\n };\n\n if (!duplicateMove) {\n // set pointer coordinate, time changes and speeds\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n }\n\n signals.fire('move', signalArg);\n\n if (!duplicateMove) {\n // if interacting, fire an 'action-move' signal etc\n if (this.interacting()) {\n this.doMove(signalArg);\n }\n\n if (this.pointerWasMoved) {\n utils.copyCoords(this.prevCoords, this.curCoords);\n }\n }\n }\n\n /*\\\n * Interaction.doMove\n [ method ]\n *\n * Force a move of the current action at the same coordinates. Useful if\n * snap/restrict has been changed and you want a movement with the new\n * settings.\n *\n **\n | interact(target)\n | .draggable(true)\n | .on('dragmove', function (event) {\n | if (someCondition) {\n | // change the snap settings\n | event.interactable.draggable({ snap: { targets: [] }});\n | // fire another move event with re-calculated snap\n | event.interaction.doMove();\n | }\n | });\n \\*/\n doMove (signalArg) {\n signalArg = utils.extend({\n pointer: this.pointers[0],\n event: this.prevEvent,\n eventTarget: this._eventTarget,\n interaction: this,\n }, signalArg || {});\n\n signals.fire('before-action-move', signalArg);\n\n if (!this._dontFireMove) {\n signals.fire('action-move', signalArg);\n }\n\n this._dontFireMove = false;\n }\n\n // End interact move events and stop auto-scroll unless simulation is running\n pointerUp (pointer, event, eventTarget, curEventTarget) {\n const pointerIndex = this.getPointerIndex(pointer);\n\n signals.fire(/cancel$/i.test(event.type)? 'cancel' : 'up', {\n pointer,\n pointerIndex,\n event,\n eventTarget,\n curEventTarget,\n interaction: this,\n });\n\n if (!this.simulation) {\n this.end(event);\n }\n\n this.pointerIsDown = false;\n this.removePointer(pointer, event);\n }\n\n /*\\\n * Interaction.end\n [ method ]\n *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n - event (PointerEvent) #optional\n **\n | interact(target)\n | .draggable(true)\n | .on('move', function (event) {\n | if (event.pageX > 1000) {\n | // end the current action\n | event.interaction.end();\n | // stop all further listeners from being called\n | event.stopImmediatePropagation();\n | }\n | });\n \\*/\n end (event) {\n event = event || this.prevEvent;\n\n if (this.interacting()) {\n signals.fire('action-end', {\n event,\n interaction: this,\n });\n }\n\n this.stop();\n }\n\n currentAction () {\n return this._interacting? this.prepared.name: null;\n }\n\n interacting () {\n return this._interacting;\n }\n\n stop () {\n signals.fire('stop', { interaction: this });\n\n if (this._interacting) {\n signals.fire('stop-active', { interaction: this });\n signals.fire('stop-' + this.prepared.name, { interaction: this });\n }\n\n this.target = this.element = null;\n\n this._interacting = false;\n this.prepared.name = this.prevEvent = null;\n }\n\n getPointerIndex (pointer) {\n return utils.indexOf(this.pointerIds, utils.getPointerId(pointer));\n }\n\n updatePointer (pointer, event, down = event && /(down|start)$/i.test(event.type)) {\n const id = utils.getPointerId(pointer);\n let index = this.getPointerIndex(pointer);\n\n if (index === -1) {\n index = this.pointerIds.length;\n this.pointerIds[index] = id;\n }\n\n if (down) {\n signals.fire('update-pointer-down', {\n pointer,\n event,\n down,\n pointerId: id,\n pointerIndex: index,\n interaction: this,\n });\n }\n\n this.pointers[index] = pointer;\n\n return index;\n }\n\n removePointer (pointer, event) {\n const id = utils.getPointerId(pointer);\n const index = this.mouse? 0 : utils.indexOf(this.pointerIds, id);\n\n if (index === -1) { return; }\n\n signals.fire('remove-pointer', {\n pointer,\n event,\n pointerIndex: index,\n interaction: this,\n });\n\n this.pointers .splice(index, 1);\n this.pointerIds .splice(index, 1);\n this.downTargets.splice(index, 1);\n this.downTimes .splice(index, 1);\n }\n\n _updateEventTargets (target, currentTarget) {\n this._eventTarget = target;\n this._curEventTarget = currentTarget;\n }\n}\n\nfor (let i = 0, len = methodNames.length; i < len; i++) {\n const method = methodNames[i];\n\n listeners[method] = doOnInteractions(method);\n}\n\nfunction doOnInteractions (method) {\n return (function (event) {\n const [eventTarget, curEventTarget] = utils.getEventTargets(event);\n const matches = []; // [ [pointer, interaction], ...]\n\n if (browser.supportsTouch && /touch/.test(event.type)) {\n prevTouchTime = new Date().getTime();\n\n for (let i = 0; i < event.changedTouches.length; i++) {\n const pointer = event.changedTouches[i];\n const interaction = finder.search(pointer, event.type, eventTarget);\n\n matches.push([pointer, interaction || new Interaction()]);\n }\n }\n else {\n let invalidPointer = false;\n\n if (!browser.supportsPointerEvent && /mouse/.test(event.type)) {\n // ignore mouse events while touch interactions are active\n for (let i = 0; i < scope.interactions.length && !invalidPointer; i++) {\n invalidPointer = !scope.interactions[i].mouse && scope.interactions[i].pointerIsDown;\n }\n\n // try to ignore mouse events that are simulated by the browser\n // after a touch event\n invalidPointer = invalidPointer\n || (new Date().getTime() - prevTouchTime < 500)\n // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated\n || event.timeStamp === 0;\n }\n\n if (!invalidPointer) {\n let interaction = finder.search(event, event.type, eventTarget);\n\n if (!interaction) {\n\n interaction = new Interaction();\n interaction.mouse = (/mouse/i.test(event.pointerType || event.type)\n // MSPointerEvent.MSPOINTER_TYPE_MOUSE\n || event.pointerType === 4\n || !event.pointerType);\n }\n\n matches.push([event, interaction]);\n }\n }\n\n for (const [pointer, interaction] of matches) {\n interaction._updateEventTargets(eventTarget, curEventTarget);\n interaction[method](pointer, event, eventTarget, curEventTarget);\n }\n });\n}\n\nfunction endAll (event) {\n for (let i = 0; i < scope.interactions.length; i++) {\n const interaction = scope.interactions[i];\n\n interaction.end(event);\n signals.fire('endall', { event, interaction });\n }\n}\n\nconst docEvents = { /* 'eventType': listenerFunc */ };\nconst pEventTypes = browser.pEventTypes;\n\nif (scope.PointerEvent) {\n docEvents[pEventTypes.down ] = listeners.pointerDown;\n docEvents[pEventTypes.move ] = listeners.pointerMove;\n docEvents[pEventTypes.up ] = listeners.pointerUp;\n docEvents[pEventTypes.cancel] = listeners.pointerUp;\n}\nelse {\n docEvents.mousedown = listeners.pointerDown;\n docEvents.mousemove = listeners.pointerMove;\n docEvents.mouseup = listeners.pointerUp;\n\n docEvents.touchstart = listeners.pointerDown;\n docEvents.touchmove = listeners.pointerMove;\n docEvents.touchend = listeners.pointerUp;\n docEvents.touchcancel = listeners.pointerUp;\n}\n\ndocEvents.blur = endAll;\n\nfunction onDocSignal ({ doc }, signalName) {\n const eventMethod = signalName.indexOf('add') === 0\n ? events.add : events.remove;\n\n // delegate event listener\n for (const eventType in scope.delegatedEvents) {\n eventMethod(doc, eventType, events.delegateListener);\n eventMethod(doc, eventType, events.delegateUseCapture, true);\n }\n\n for (const eventType in docEvents) {\n eventMethod(doc, eventType, docEvents[eventType]);\n }\n}\n\nsignals.on('update-pointer-down', ({ interaction, pointer, pointerId, pointerIndex, event, eventTarget, down }) => {\n interaction.pointerIds[pointerIndex] = pointerId;\n interaction.pointers[pointerIndex] = pointer;\n\n if (down) {\n interaction.pointerIsDown = true;\n }\n\n if (!interaction.interacting()) {\n utils.setCoords(interaction.startCoords, interaction.pointers);\n\n utils.copyCoords(interaction.curCoords , interaction.startCoords);\n utils.copyCoords(interaction.prevCoords, interaction.startCoords);\n\n interaction.downEvent = event;\n interaction.downTimes[pointerIndex] = interaction.curCoords.timeStamp;\n interaction.downTargets[pointerIndex] = eventTarget || event && utils.getEventTargets(event)[0];\n interaction.pointerWasMoved = false;\n\n utils.pointerExtend(interaction.downPointer, pointer);\n }\n});\n\nscope.signals.on('add-document' , onDocSignal);\nscope.signals.on('remove-document', onDocSignal);\n\nInteraction.pointerMoveTolerance = 1;\nInteraction.doOnInteractions = doOnInteractions;\nInteraction.endAll = endAll;\nInteraction.signals = signals;\nInteraction.docEvents = docEvents;\n\nscope.endAllInteractions = endAll;\n\nmodule.exports = Interaction;\n","const Interaction = require('../Interaction');\nconst InteractEvent = require('../InteractEvent');\n\nconst actions = {\n firePrepared,\n names: [],\n methodDict: {},\n};\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n interaction._interacting = true;\n firePrepared(interaction, event, 'start');\n});\n\nInteraction.signals.on('action-move', function ({ interaction, event, preEnd }) {\n firePrepared(interaction, event, 'move', preEnd);\n\n // if the action was ended in a listener\n if (!interaction.interacting()) { return false; }\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n firePrepared(interaction, event, 'end');\n});\n\nfunction firePrepared (interaction, event, phase, preEnd) {\n const actionName = interaction.prepared.name;\n\n const newEvent = new InteractEvent(interaction, event, actionName, phase, interaction.element, null, preEnd);\n\n interaction.target.fire(newEvent);\n interaction.prevEvent = newEvent;\n}\n\nmodule.exports = actions;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drag = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n startAxis : 'xy',\n lockAxis : 'xy',\n },\n\n checker: function (pointer, event, interactable) {\n const dragOptions = interactable.options.drag;\n\n return dragOptions.enabled\n ? { name: 'drag', axis: (dragOptions.lockAxis === 'start'\n ? dragOptions.startAxis\n : dragOptions.lockAxis)}\n : null;\n },\n\n getCursor: function () {\n return 'move';\n },\n};\n\nInteraction.signals.on('before-action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n interaction.curCoords.page.y = interaction.startCoords.page.y;\n interaction.curCoords.client.y = interaction.startCoords.client.y;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vx);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vx);\n interaction.pointerDelta.client.vy = 0;\n interaction.pointerDelta.page.vy = 0;\n }\n else if (axis === 'y') {\n interaction.curCoords.page.x = interaction.startCoords.page.x;\n interaction.curCoords.client.x = interaction.startCoords.client.x;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vy);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vy);\n interaction.pointerDelta.client.vx = 0;\n interaction.pointerDelta.page.vx = 0;\n }\n});\n\n// dragmove\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'dragmove') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n iEvent.pageY = interaction.startCoords.page.y;\n iEvent.clientY = interaction.startCoords.client.y;\n iEvent.dy = 0;\n }\n else if (axis === 'y') {\n iEvent.pageX = interaction.startCoords.page.x;\n iEvent.clientX = interaction.startCoords.client.x;\n iEvent.dx = 0;\n }\n});\n\n/*\\\n * Interactable.draggable\n [ method ]\n *\n * Gets or sets whether drag actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of drag events\n | var isDraggable = interact('ul li').draggable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on drag events (object makes the Interactable draggable)\n = (object) This Interactable\n | interact(element).draggable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // the axis in which the first movement must be\n | // for the drag sequence to start\n | // 'xy' by default - any direction\n | startAxis: 'x' || 'y' || 'xy',\n |\n | // 'xy' by default - don't restrict to one axis (move in any direction)\n | // 'x' or 'y' to restrict movement to either axis\n | // 'start' to restrict movement to the axis the drag started in\n | lockAxis: 'x' || 'y' || 'xy' || 'start',\n |\n | // max number of drags that can happen concurrently\n | // with elements of this Interactable. Infinity by default\n | max: Infinity,\n |\n | // max number of drags that can target the same element+Interactable\n | // 1 by default\n | maxPerElement: 2\n | });\n\\*/\nInteractable.prototype.draggable = function (options) {\n if (utils.is.object(options)) {\n this.options.drag.enabled = options.enabled === false? false: true;\n this.setPerAction('drag', options);\n this.setOnEvents('drag', options);\n\n if (/^(xy|x|y|start)$/.test(options.lockAxis)) {\n this.options.drag.lockAxis = options.lockAxis;\n }\n if (/^(xy|x|y)$/.test(options.startAxis)) {\n this.options.drag.startAxis = options.startAxis;\n }\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drag.enabled = options;\n\n if (!options) {\n this.ondragstart = this.ondragstart = this.ondragend = null;\n }\n\n return this;\n }\n\n return this.options.drag;\n};\n\nactions.drag = drag;\nactions.names.push('drag');\nutils.merge(Interactable.eventTypes, [\n 'dragstart',\n 'dragmove',\n 'draginertiastart',\n 'draginertiaresume',\n 'dragend',\n]);\nactions.methodDict.drag = 'draggable';\n\ndefaultOptions.drag = drag.defaults;\n\nmodule.exports = drag;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst scope = require('../scope');\nconst interact = require('../interact');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drop = {\n defaults: {\n enabled: false,\n accept : null,\n overlap: 'pointer',\n },\n};\n\nlet dynamicDrop = false;\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // reset active dropzones\n interaction.activeDrops.dropzones = [];\n interaction.activeDrops.elements = [];\n interaction.activeDrops.rects = [];\n\n interaction.dropEvents = null;\n\n if (!interaction.dynamicDrop) {\n setActiveDrops(interaction, interaction.element);\n }\n\n const dragEvent = interaction.prevEvent;\n const dropEvents = getDropEvents(interaction, event, dragEvent);\n\n if (dropEvents.activate) {\n fireActiveDrops(interaction, dropEvents.activate);\n }\n});\n\nInteractEvent.signals.on('new', function ({ interaction, iEvent, event }) {\n if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { return; }\n\n const draggableElement = interaction.element;\n const dragEvent = iEvent;\n const dropResult = getDrop(dragEvent, event, draggableElement);\n\n interaction.dropTarget = dropResult.dropzone;\n interaction.dropElement = dropResult.element;\n\n interaction.dropEvents = getDropEvents(interaction, event, dragEvent);\n});\n\nInteraction.signals.on('action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n fireDropEvents(interaction, interaction.dropEvents);\n});\n\nInteraction.signals.on('action-end', function ({ interaction }) {\n if (interaction.prepared.name === 'drag') {\n fireDropEvents(interaction, interaction.dropEvents);\n }\n});\n\nInteraction.signals.on('stop-drag', function ({ interaction }) {\n interaction.activeDrops.dropzones =\n interaction.activeDrops.elements =\n interaction.activeDrops.rects =\n interaction.dropEvents = null;\n});\n\nfunction collectDrops (interaction, element) {\n const drops = [];\n const elements = [];\n\n element = element || interaction.element;\n\n // collect all dropzones and their elements which qualify for a drop\n for (const current of scope.interactables) {\n if (!current.options.drop.enabled) { continue; }\n\n const accept = current.options.drop.accept;\n\n // test the draggable element against the dropzone's accept setting\n if ((utils.is.element(accept) && accept !== element)\n || (utils.is.string(accept)\n && !utils.matchesSelector(element, accept))) {\n\n continue;\n }\n\n // query for new elements if necessary\n const dropElements = utils.is.string(current.target)\n ? current._context.querySelectorAll(current.target)\n : [current.target];\n\n for (let i = 0; i < dropElements.length; i++) {\n const currentElement = dropElements[i];\n\n if (currentElement !== element) {\n drops.push(current);\n elements.push(currentElement);\n }\n }\n }\n\n return {\n elements,\n dropzones: drops,\n };\n}\n\nfunction fireActiveDrops (interaction, event) {\n let prevElement;\n\n // loop through all active dropzones and trigger event\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n const current = interaction.activeDrops.dropzones[i];\n const currentElement = interaction.activeDrops.elements [i];\n\n // prevent trigger of duplicate events on same element\n if (currentElement !== prevElement) {\n // set current element as event target\n event.target = currentElement;\n current.fire(event);\n }\n prevElement = currentElement;\n }\n}\n\n// Collect a new set of possible drops and save them in activeDrops.\n// setActiveDrops should always be called when a drag has just started or a\n// drag event happens while dynamicDrop is true\nfunction setActiveDrops (interaction, dragElement) {\n // get dropzones and their elements that could receive the draggable\n const possibleDrops = collectDrops(interaction, dragElement, true);\n\n interaction.activeDrops.dropzones = possibleDrops.dropzones;\n interaction.activeDrops.elements = possibleDrops.elements;\n interaction.activeDrops.rects = [];\n\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n interaction.activeDrops.rects[i] =\n interaction.activeDrops.dropzones[i].getRect(interaction.activeDrops.elements[i]);\n }\n}\n\nfunction getDrop (dragEvent, event, dragElement) {\n const interaction = dragEvent.interaction;\n const validDrops = [];\n\n if (dynamicDrop) {\n setActiveDrops(interaction, dragElement);\n }\n\n // collect all dropzones and their elements which qualify for a drop\n for (let j = 0; j < interaction.activeDrops.dropzones.length; j++) {\n const current = interaction.activeDrops.dropzones[j];\n const currentElement = interaction.activeDrops.elements [j];\n const rect = interaction.activeDrops.rects [j];\n\n validDrops.push(current.dropCheck(dragEvent, event, interaction.target, dragElement, currentElement, rect)\n ? currentElement\n : null);\n }\n\n // get the most appropriate dropzone based on DOM depth and order\n const dropIndex = utils.indexOfDeepestElement(validDrops);\n\n return {\n dropzone: interaction.activeDrops.dropzones[dropIndex] || null,\n element : interaction.activeDrops.elements [dropIndex] || null,\n };\n}\n\nfunction getDropEvents (interaction, pointerEvent, dragEvent) {\n const dropEvents = {\n enter : null,\n leave : null,\n activate : null,\n deactivate: null,\n move : null,\n drop : null,\n };\n\n const tmpl = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n };\n\n if (interaction.dropElement !== interaction.prevDropElement) {\n // if there was a prevDropTarget, create a dragleave event\n if (interaction.prevDropTarget) {\n dropEvents.leave = utils.extend({ type: 'dragleave' }, tmpl);\n\n dragEvent.dragLeave = dropEvents.leave.target = interaction.prevDropElement;\n dragEvent.prevDropzone = dropEvents.leave.dropzone = interaction.prevDropTarget;\n }\n // if the dropTarget is not null, create a dragenter event\n if (interaction.dropTarget) {\n dropEvents.enter = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n type : 'dragenter',\n };\n\n dragEvent.dragEnter = interaction.dropElement;\n dragEvent.dropzone = interaction.dropTarget;\n }\n }\n\n if (dragEvent.type === 'dragend' && interaction.dropTarget) {\n dropEvents.drop = utils.extend({ type: 'drop' }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n dragEvent.relatedTarget = interaction.dropElement;\n }\n if (dragEvent.type === 'dragstart') {\n dropEvents.activate = utils.extend({ type: 'dropactivate' }, tmpl);\n\n dropEvents.activate.target = null;\n dropEvents.activate.dropzone = null;\n }\n if (dragEvent.type === 'dragend') {\n dropEvents.deactivate = utils.extend({ type: 'dropdeactivate' }, tmpl);\n\n dropEvents.deactivate.target = null;\n dropEvents.deactivate.dropzone = null;\n }\n if (dragEvent.type === 'dragmove' && interaction.dropTarget) {\n dropEvents.move = utils.extend({\n dragmove : dragEvent,\n type : 'dropmove',\n }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n }\n\n return dropEvents;\n}\n\nfunction fireDropEvents (interaction, dropEvents) {\n if (dropEvents.leave) { interaction.prevDropTarget.fire(dropEvents.leave); }\n if (dropEvents.move ) { interaction.dropTarget.fire(dropEvents.move ); }\n if (dropEvents.enter) { interaction.dropTarget.fire(dropEvents.enter); }\n if (dropEvents.drop ) { interaction.dropTarget.fire(dropEvents.drop ); }\n if (dropEvents.deactivate) {\n fireActiveDrops(interaction, dropEvents.deactivate);\n }\n\n interaction.prevDropTarget = interaction.dropTarget;\n interaction.prevDropElement = interaction.dropElement;\n}\n\n/*\\\n * Interactable.dropzone\n [ method ]\n *\n * Returns or sets whether elements can be dropped onto this\n * Interactable to trigger drop events\n *\n * Dropzones can receive the following events:\n * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends\n * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone\n * - `dragmove` when a draggable that has entered the dropzone is moved\n * - `drop` when a draggable is dropped into this dropzone\n *\n * Use the `accept` option to allow only elements that match the given CSS\n * selector or element. The value can be:\n *\n * - **an Element** - only that element can be dropped into this dropzone.\n * - **a string**, - the element being dragged must match it as a CSS selector.\n * - **`null`** - accept options is cleared - it accepts any element.\n *\n * Use the `overlap` option to set how drops are checked for. The allowed\n * values are:\n *\n * - `'pointer'`, the pointer must be over the dropzone (default)\n * - `'center'`, the draggable element's center must be over the dropzone\n * - a number from 0-1 which is the `(intersection area) / (draggable area)`.\n * e.g. `0.5` for drop to happen when half of the area of the draggable is\n * over the dropzone\n *\n * Use the `checker` option to specify a function to check if a dragged\n * element is over this Interactable.\n *\n | interact(target)\n | .dropChecker(function(dragEvent, // related dragmove or dragend event\n | event, // TouchEvent/PointerEvent/MouseEvent\n | dropped, // bool result of the default checker\n | dropzone, // dropzone Interactable\n | dropElement, // dropzone elemnt\n | draggable, // draggable Interactable\n | draggableElement) {// draggable element\n |\n | return dropped && event.target.hasAttribute('allow-drop');\n | }\n *\n *\n - options (boolean | object | null) #optional The new value to be set.\n | interact('.drop').dropzone({\n | accept: '.can-drop' || document.getElementById('single-drop'),\n | overlap: 'pointer' || 'center' || zeroToOne\n | }\n = (boolean | object) The current setting or this Interactable\n\\*/\nInteractable.prototype.dropzone = function (options) {\n if (utils.is.object(options)) {\n this.options.drop.enabled = options.enabled === false? false: true;\n\n if (utils.is.function(options.ondrop) ) { this.events.ondrop = options.ondrop ; }\n if (utils.is.function(options.ondropactivate) ) { this.events.ondropactivate = options.ondropactivate ; }\n if (utils.is.function(options.ondropdeactivate)) { this.events.ondropdeactivate = options.ondropdeactivate; }\n if (utils.is.function(options.ondragenter) ) { this.events.ondragenter = options.ondragenter ; }\n if (utils.is.function(options.ondragleave) ) { this.events.ondragleave = options.ondragleave ; }\n if (utils.is.function(options.ondropmove) ) { this.events.ondropmove = options.ondropmove ; }\n\n if (/^(pointer|center)$/.test(options.overlap)) {\n this.options.drop.overlap = options.overlap;\n }\n else if (utils.is.number(options.overlap)) {\n this.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0);\n }\n if ('accept' in options) {\n this.options.drop.accept = options.accept;\n }\n if ('checker' in options) {\n this.options.drop.checker = options.checker;\n }\n\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drop.enabled = options;\n\n if (!options) {\n this.ondragenter = this.ondragleave = this.ondrop\n = this.ondropactivate = this.ondropdeactivate = null;\n }\n\n return this;\n }\n\n return this.options.drop;\n};\n\nInteractable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) {\n let dropped = false;\n\n // if the dropzone has no rect (eg. display: none)\n // call the custom dropChecker or just return false\n if (!(rect = rect || this.getRect(dropElement))) {\n return (this.options.drop.checker\n ? this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement)\n : false);\n }\n\n const dropOverlap = this.options.drop.overlap;\n\n if (dropOverlap === 'pointer') {\n const origin = utils.getOriginXY(draggable, draggableElement, 'drag');\n const page = utils.getPageXY(dragEvent);\n\n page.x += origin.x;\n page.y += origin.y;\n\n const horizontal = (page.x > rect.left) && (page.x < rect.right);\n const vertical = (page.y > rect.top ) && (page.y < rect.bottom);\n\n dropped = horizontal && vertical;\n }\n\n const dragRect = draggable.getRect(draggableElement);\n\n if (dragRect && dropOverlap === 'center') {\n const cx = dragRect.left + dragRect.width / 2;\n const cy = dragRect.top + dragRect.height / 2;\n\n dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom;\n }\n\n if (dragRect && utils.is.number(dropOverlap)) {\n const overlapArea = (Math.max(0, Math.min(rect.right , dragRect.right ) - Math.max(rect.left, dragRect.left))\n * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top , dragRect.top )));\n\n const overlapRatio = overlapArea / (dragRect.width * dragRect.height);\n\n dropped = overlapRatio >= dropOverlap;\n }\n\n if (this.options.drop.checker) {\n dropped = this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement);\n }\n\n return dropped;\n};\n\nInteractable.signals.on('unset', function ({ interactable }) {\n interactable.dropzone(false);\n});\n\nInteractable.settingsMethods.push('dropChecker');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.dropTarget = null; // the dropzone a drag target might be dropped into\n interaction.dropElement = null; // the element at the time of checking\n interaction.prevDropTarget = null; // the dropzone that was recently dragged away from\n interaction.prevDropElement = null; // the element at the time of checking\n interaction.dropEvents = null; // the dropEvents related to the current drag event\n\n interaction.activeDrops = {\n dropzones: [], // the dropzones that are mentioned below\n elements : [], // elements of dropzones that accept the target draggable\n rects : [], // the rects of the elements mentioned above\n };\n\n});\n\nInteraction.signals.on('stop', function ({ interaction }) {\n interaction.dropTarget = interaction.dropElement =\n interaction.prevDropTarget = interaction.prevDropElement = null;\n});\n\n/*\\\n * interact.dynamicDrop\n [ method ]\n *\n * Returns or sets whether the dimensions of dropzone elements are\n * calculated on every dragmove or only on dragstart for the default\n * dropChecker\n *\n - newValue (boolean) #optional True to check on each move. False to check only before start\n = (boolean | interact) The current setting or interact\n\\*/\ninteract.dynamicDrop = function (newValue) {\n if (utils.is.bool(newValue)) {\n //if (dragging && dynamicDrop !== newValue && !newValue) {\n //calcRects(dropzones);\n //}\n\n dynamicDrop = newValue;\n\n return interact;\n }\n return dynamicDrop;\n};\n\nutils.merge(Interactable.eventTypes, [\n 'dragenter',\n 'dragleave',\n 'dropactivate',\n 'dropdeactivate',\n 'dropmove',\n 'drop',\n]);\nactions.methodDict.drop = 'dropzone';\n\ndefaultOptions.drop = drop.defaults;\n\nmodule.exports = drop;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst gesture = {\n defaults: {\n enabled : false,\n origin : null,\n restrict: null,\n },\n\n checker: function (pointer, event, interactable, element, interaction) {\n if (interaction.pointerIds.length >= 2) {\n return { name: 'gesture' };\n }\n\n return null;\n },\n\n getCursor: function () {\n return '';\n },\n};\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturestart') { return; }\n iEvent.ds = 0;\n\n interaction.gesture.startDistance = interaction.gesture.prevDistance = iEvent.distance;\n interaction.gesture.startAngle = interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.scale = 1;\n});\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturemove') { return; }\n\n iEvent.ds = iEvent.scale - interaction.gesture.scale;\n\n interaction.target.fire(iEvent);\n\n interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.prevDistance = iEvent.distance;\n\n if (iEvent.scale !== Infinity\n && iEvent.scale !== null\n && iEvent.scale !== undefined\n && !isNaN(iEvent.scale)) {\n\n interaction.gesture.scale = iEvent.scale;\n }\n});\n\n/*\\\n * Interactable.gesturable\n [ method ]\n *\n * Gets or sets whether multitouch gestures can be performed on the\n * Interactable's element\n *\n = (boolean) Indicates if this can be the target of gesture events\n | var isGestureable = interact(element).gesturable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on gesture events (makes the Interactable gesturable)\n = (object) this Interactable\n | interact(element).gesturable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // limit multiple gestures.\n | // See the explanation in @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n\\*/\nInteractable.prototype.gesturable = function (options) {\n if (utils.is.object(options)) {\n this.options.gesture.enabled = options.enabled === false? false: true;\n this.setPerAction('gesture', options);\n this.setOnEvents('gesture', options);\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.gesture.enabled = options;\n\n if (!options) {\n this.ongesturestart = this.ongesturestart = this.ongestureend = null;\n }\n\n return this;\n }\n\n return this.options.gesture;\n};\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action, event, starting, ending, deltaSource }) {\n if (action !== 'gesture') { return; }\n\n const pointers = interaction.pointers;\n\n iEvent.touches = [pointers[0], pointers[1]];\n\n if (starting) {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = 1;\n iEvent.ds = 0;\n iEvent.angle = utils.touchAngle(pointers, undefined, deltaSource);\n iEvent.da = 0;\n }\n else if (ending || event instanceof InteractEvent) {\n iEvent.distance = interaction.prevEvent.distance;\n iEvent.box = interaction.prevEvent.box;\n iEvent.scale = interaction.prevEvent.scale;\n iEvent.ds = iEvent.scale - 1;\n iEvent.angle = interaction.prevEvent.angle;\n iEvent.da = iEvent.angle - interaction.gesture.startAngle;\n }\n else {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = iEvent.distance / interaction.gesture.startDistance;\n iEvent.angle = utils.touchAngle(pointers, interaction.gesture.prevAngle, deltaSource);\n\n iEvent.ds = iEvent.scale - interaction.gesture.prevScale;\n iEvent.da = iEvent.angle - interaction.gesture.prevAngle;\n }\n});\n\nInteraction.signals.on('new', function (interaction) {\n interaction.gesture = {\n start: { x: 0, y: 0 },\n\n startDistance: 0, // distance between two touches of touchStart\n prevDistance : 0,\n distance : 0,\n\n scale: 1, // gesture.distance / gesture.startDistance\n\n startAngle: 0, // angle of line joining two touches\n prevAngle : 0, // angle of the previous gesture event\n };\n});\n\nactions.gesture = gesture;\nactions.names.push('gesture');\nutils.merge(Interactable.eventTypes, [\n 'gesturestart',\n 'gesturemove',\n 'gestureend',\n]);\nactions.methodDict.gesture = 'gesturable';\n\ndefaultOptions.gesture = gesture.defaults;\n\nmodule.exports = gesture;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\n// Less Precision with touch input\nconst defaultMargin = browser.supportsTouch || browser.supportsPointerEvent? 20: 10;\n\nconst resize = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n square: false,\n preserveAspectRatio: false,\n axis: 'xy',\n\n // use default margin\n margin: NaN,\n\n // object with props left, right, top, bottom which are\n // true/false values to resize when the pointer is over that edge,\n // CSS selectors to match the handles for each direction\n // or the Elements for each handle\n edges: null,\n\n // a value of 'none' will limit the resize rect to a minimum of 0x0\n // 'negate' will alow the rect to have negative width/height\n // 'reposition' will keep the width/height positive by swapping\n // the top and bottom edges and/or swapping the left and right edges\n invert: 'none',\n },\n\n checker: function (pointer, event, interactable, element, interaction, rect) {\n if (!rect) { return null; }\n\n const page = utils.extend({}, interaction.curCoords.page);\n const options = interactable.options;\n\n if (options.resize.enabled) {\n const resizeOptions = options.resize;\n const resizeEdges = { left: false, right: false, top: false, bottom: false };\n\n // if using resize.edges\n if (utils.is.object(resizeOptions.edges)) {\n for (const edge in resizeEdges) {\n resizeEdges[edge] = checkResizeEdge(edge,\n resizeOptions.edges[edge],\n page,\n interaction._eventTarget,\n element,\n rect,\n resizeOptions.margin || defaultMargin);\n }\n\n resizeEdges.left = resizeEdges.left && !resizeEdges.right;\n resizeEdges.top = resizeEdges.top && !resizeEdges.bottom;\n\n if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) {\n return {\n name: 'resize',\n edges: resizeEdges,\n };\n }\n }\n else {\n const right = options.resize.axis !== 'y' && page.x > (rect.right - defaultMargin);\n const bottom = options.resize.axis !== 'x' && page.y > (rect.bottom - defaultMargin);\n\n if (right || bottom) {\n return {\n name: 'resize',\n axes: (right? 'x' : '') + (bottom? 'y' : ''),\n };\n }\n }\n }\n\n return null;\n },\n\n cursors: (browser.isIe9OrOlder ? {\n x : 'e-resize',\n y : 's-resize',\n xy: 'se-resize',\n\n top : 'n-resize',\n left : 'w-resize',\n bottom : 's-resize',\n right : 'e-resize',\n topleft : 'se-resize',\n bottomright: 'se-resize',\n topright : 'ne-resize',\n bottomleft : 'ne-resize',\n } : {\n x : 'ew-resize',\n y : 'ns-resize',\n xy: 'nwse-resize',\n\n top : 'ns-resize',\n left : 'ew-resize',\n bottom : 'ns-resize',\n right : 'ew-resize',\n topleft : 'nwse-resize',\n bottomright: 'nwse-resize',\n topright : 'nesw-resize',\n bottomleft : 'nesw-resize',\n }),\n\n getCursor: function (action) {\n if (action.axis) {\n return resize.cursors[action.name + action.axis];\n }\n else if (action.edges) {\n let cursorKey = '';\n const edgeNames = ['top', 'bottom', 'left', 'right'];\n\n for (let i = 0; i < 4; i++) {\n if (action.edges[edgeNames[i]]) {\n cursorKey += edgeNames[i];\n }\n }\n\n return resize.cursors[cursorKey];\n }\n },\n};\n\n// resizestart\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'resizestart' || !interaction.prepared.edges) {\n return;\n }\n\n const startRect = interaction.target.getRect(interaction.element);\n const resizeOptions = interaction.target.options.resize;\n\n /*\n * When using the `resizable.square` or `resizable.preserveAspectRatio` options, resizing from one edge\n * will affect another. E.g. with `resizable.square`, resizing to make the right edge larger will make\n * the bottom edge larger by the same amount. We call these 'linked' edges. Any linked edges will depend\n * on the active edges and the edge being interacted with.\n */\n if (resizeOptions.square || resizeOptions.preserveAspectRatio) {\n const linkedEdges = utils.extend({}, interaction.prepared.edges);\n\n linkedEdges.top = linkedEdges.top || (linkedEdges.left && !linkedEdges.bottom);\n linkedEdges.left = linkedEdges.left || (linkedEdges.top && !linkedEdges.right );\n linkedEdges.bottom = linkedEdges.bottom || (linkedEdges.right && !linkedEdges.top );\n linkedEdges.right = linkedEdges.right || (linkedEdges.bottom && !linkedEdges.left );\n\n interaction.prepared._linkedEdges = linkedEdges;\n }\n else {\n interaction.prepared._linkedEdges = null;\n }\n\n // if using `resizable.preserveAspectRatio` option, record aspect ratio at the start of the resize\n if (resizeOptions.preserveAspectRatio) {\n interaction.resizeStartAspectRatio = startRect.width / startRect.height;\n }\n\n interaction.resizeRects = {\n start : startRect,\n current : utils.extend({}, startRect),\n inverted : utils.extend({}, startRect),\n previous : utils.extend({}, startRect),\n delta : {\n left: 0, right : 0, width : 0,\n top : 0, bottom: 0, height: 0,\n },\n };\n\n iEvent.rect = interaction.resizeRects.inverted;\n iEvent.deltaRect = interaction.resizeRects.delta;\n});\n\n// resizemove\nInteractEvent.signals.on('new', function ({ iEvent, phase, interaction }) {\n if (phase !== 'move' || !interaction.prepared.edges) { return; }\n\n const resizeOptions = interaction.target.options.resize;\n const invert = resizeOptions.invert;\n const invertible = invert === 'reposition' || invert === 'negate';\n\n let edges = interaction.prepared.edges;\n\n const start = interaction.resizeRects.start;\n const current = interaction.resizeRects.current;\n const inverted = interaction.resizeRects.inverted;\n const delta = interaction.resizeRects.delta;\n const previous = utils.extend(interaction.resizeRects.previous, inverted);\n const originalEdges = edges;\n\n let dx = iEvent.dx;\n let dy = iEvent.dy;\n\n if (resizeOptions.preserveAspectRatio || resizeOptions.square) {\n // `resize.preserveAspectRatio` takes precedence over `resize.square`\n const startAspectRatio = resizeOptions.preserveAspectRatio\n ? interaction.resizeStartAspectRatio\n : 1;\n\n edges = interaction.prepared._linkedEdges;\n\n if ((originalEdges.left && originalEdges.bottom)\n || (originalEdges.right && originalEdges.top)) {\n dy = -dx / startAspectRatio;\n }\n else if (originalEdges.left || originalEdges.right ) { dy = dx / startAspectRatio; }\n else if (originalEdges.top || originalEdges.bottom) { dx = dy * startAspectRatio; }\n }\n\n // update the 'current' rect without modifications\n if (edges.top ) { current.top += dy; }\n if (edges.bottom) { current.bottom += dy; }\n if (edges.left ) { current.left += dx; }\n if (edges.right ) { current.right += dx; }\n\n if (invertible) {\n // if invertible, copy the current rect\n utils.extend(inverted, current);\n\n if (invert === 'reposition') {\n // swap edge values if necessary to keep width/height positive\n let swap;\n\n if (inverted.top > inverted.bottom) {\n swap = inverted.top;\n\n inverted.top = inverted.bottom;\n inverted.bottom = swap;\n }\n if (inverted.left > inverted.right) {\n swap = inverted.left;\n\n inverted.left = inverted.right;\n inverted.right = swap;\n }\n }\n }\n else {\n // if not invertible, restrict to minimum of 0x0 rect\n inverted.top = Math.min(current.top, start.bottom);\n inverted.bottom = Math.max(current.bottom, start.top);\n inverted.left = Math.min(current.left, start.right);\n inverted.right = Math.max(current.right, start.left);\n }\n\n inverted.width = inverted.right - inverted.left;\n inverted.height = inverted.bottom - inverted.top ;\n\n for (const edge in inverted) {\n delta[edge] = inverted[edge] - previous[edge];\n }\n\n iEvent.edges = interaction.prepared.edges;\n iEvent.rect = inverted;\n iEvent.deltaRect = delta;\n});\n\n/*\\\n * Interactable.resizable\n [ method ]\n *\n * Gets or sets whether resize actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of resize elements\n | var isResizeable = interact('input[type=text]').resizable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on resize events (object makes the Interactable resizable)\n = (object) This Interactable\n | interact(element).resizable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | edges: {\n | top : true, // Use pointer coords to check for resize.\n | left : false, // Disable resizing from left edge.\n | bottom: '.resize-s',// Resize if pointer target matches selector\n | right : handleEl // Resize if pointer target is the given Element\n | },\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height are adjusted at a 1:1 ratio.\n | square: false,\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height maintain the aspect ratio they had when resizing started.\n | preserveAspectRatio: false,\n |\n | // a value of 'none' will limit the resize rect to a minimum of 0x0\n | // 'negate' will allow the rect to have negative width/height\n | // 'reposition' will keep the width/height positive by swapping\n | // the top and bottom edges and/or swapping the left and right edges\n | invert: 'none' || 'negate' || 'reposition'\n |\n | // limit multiple resizes.\n | // See the explanation in the @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n \\*/\nInteractable.prototype.resizable = function (options) {\n if (utils.is.object(options)) {\n this.options.resize.enabled = options.enabled === false? false: true;\n this.setPerAction('resize', options);\n this.setOnEvents('resize', options);\n\n if (/^x$|^y$|^xy$/.test(options.axis)) {\n this.options.resize.axis = options.axis;\n }\n else if (options.axis === null) {\n this.options.resize.axis = defaultOptions.resize.axis;\n }\n\n if (utils.is.bool(options.preserveAspectRatio)) {\n this.options.resize.preserveAspectRatio = options.preserveAspectRatio;\n }\n else if (utils.is.bool(options.square)) {\n this.options.resize.square = options.square;\n }\n\n return this;\n }\n if (utils.is.bool(options)) {\n this.options.resize.enabled = options;\n\n if (!options) {\n this.onresizestart = this.onresizestart = this.onresizeend = null;\n }\n\n return this;\n }\n return this.options.resize;\n};\n\nfunction checkResizeEdge (name, value, page, element, interactableElement, rect, margin) {\n // false, '', undefined, null\n if (!value) { return false; }\n\n // true value, use pointer coords and element rect\n if (value === true) {\n // if dimensions are negative, \"switch\" edges\n const width = utils.is.number(rect.width )? rect.width : rect.right - rect.left;\n const height = utils.is.number(rect.height)? rect.height : rect.bottom - rect.top ;\n\n if (width < 0) {\n if (name === 'left' ) { name = 'right'; }\n else if (name === 'right') { name = 'left' ; }\n }\n if (height < 0) {\n if (name === 'top' ) { name = 'bottom'; }\n else if (name === 'bottom') { name = 'top' ; }\n }\n\n if (name === 'left' ) { return page.x < ((width >= 0? rect.left: rect.right ) + margin); }\n if (name === 'top' ) { return page.y < ((height >= 0? rect.top : rect.bottom) + margin); }\n\n if (name === 'right' ) { return page.x > ((width >= 0? rect.right : rect.left) - margin); }\n if (name === 'bottom') { return page.y > ((height >= 0? rect.bottom: rect.top ) - margin); }\n }\n\n // the remaining checks require an element\n if (!utils.is.element(element)) { return false; }\n\n return utils.is.element(value)\n // the value is an element to use as a resize handle\n ? value === element\n // otherwise check if element matches value as selector\n : utils.matchesUpTo(element, value, interactableElement);\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.resizeAxes = 'xy';\n});\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action }) {\n if (action !== 'resize' || !interaction.resizeAxes) { return; }\n\n const options = interaction.target.options;\n\n if (options.resize.square) {\n if (interaction.resizeAxes === 'y') {\n iEvent.dx = iEvent.dy;\n }\n else {\n iEvent.dy = iEvent.dx;\n }\n iEvent.axes = 'xy';\n }\n else {\n iEvent.axes = interaction.resizeAxes;\n\n if (interaction.resizeAxes === 'x') {\n iEvent.dy = 0;\n }\n else if (interaction.resizeAxes === 'y') {\n iEvent.dx = 0;\n }\n }\n});\n\nactions.resize = resize;\nactions.names.push('resize');\nutils.merge(Interactable.eventTypes, [\n 'resizestart',\n 'resizemove',\n 'resizeinertiastart',\n 'resizeinertiaresume',\n 'resizeend',\n]);\nactions.methodDict.resize = 'resizable';\n\ndefaultOptions.resize = resize.defaults;\n\nmodule.exports = resize;\n","const raf = require('./utils/raf');\nconst getWindow = require('./utils/window').getWindow;\nconst is = require('./utils/is');\nconst domUtils = require('./utils/domUtils');\nconst Interaction = require('./Interaction');\nconst defaultOptions = require('./defaultOptions');\n\nconst autoScroll = {\n defaults: {\n enabled : false,\n container: null, // the item that is scrolled (Window or HTMLElement)\n margin : 60,\n speed : 300, // the scroll speed in pixels per second\n },\n\n interaction: null,\n i: null, // the handle returned by window.setInterval\n x: 0, y: 0, // Direction each pulse is to scroll in\n\n isScrolling: false,\n prevTime: 0,\n\n start: function (interaction) {\n autoScroll.isScrolling = true;\n raf.cancel(autoScroll.i);\n\n autoScroll.interaction = interaction;\n autoScroll.prevTime = new Date().getTime();\n autoScroll.i = raf.request(autoScroll.scroll);\n },\n\n stop: function () {\n autoScroll.isScrolling = false;\n raf.cancel(autoScroll.i);\n },\n\n // scroll the window by the values in scroll.x/y\n scroll: function () {\n const options = autoScroll.interaction.target.options[autoScroll.interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(autoScroll.interaction.element);\n const now = new Date().getTime();\n // change in time in seconds\n const dt = (now - autoScroll.prevTime) / 1000;\n // displacement\n const s = options.speed * dt;\n\n if (s >= 1) {\n if (is.window(container)) {\n container.scrollBy(autoScroll.x * s, autoScroll.y * s);\n }\n else if (container) {\n container.scrollLeft += autoScroll.x * s;\n container.scrollTop += autoScroll.y * s;\n }\n\n autoScroll.prevTime = now;\n }\n\n if (autoScroll.isScrolling) {\n raf.cancel(autoScroll.i);\n autoScroll.i = raf.request(autoScroll.scroll);\n }\n },\n check: function (interactable, actionName) {\n const options = interactable.options;\n\n return options[actionName].autoScroll && options[actionName].autoScroll.enabled;\n },\n onInteractionMove: function ({ interaction, pointer }) {\n if (!(interaction.interacting()\n && autoScroll.check(interaction.target, interaction.prepared.name))) {\n return;\n }\n\n if (interaction.simulation) {\n autoScroll.x = autoScroll.y = 0;\n return;\n }\n\n let top;\n let right;\n let bottom;\n let left;\n\n const options = interaction.target.options[interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(interaction.element);\n\n if (is.window(container)) {\n left = pointer.clientX < autoScroll.margin;\n top = pointer.clientY < autoScroll.margin;\n right = pointer.clientX > container.innerWidth - autoScroll.margin;\n bottom = pointer.clientY > container.innerHeight - autoScroll.margin;\n }\n else {\n const rect = domUtils.getElementClientRect(container);\n\n left = pointer.clientX < rect.left + autoScroll.margin;\n top = pointer.clientY < rect.top + autoScroll.margin;\n right = pointer.clientX > rect.right - autoScroll.margin;\n bottom = pointer.clientY > rect.bottom - autoScroll.margin;\n }\n\n autoScroll.x = (right ? 1: left? -1: 0);\n autoScroll.y = (bottom? 1: top? -1: 0);\n\n if (!autoScroll.isScrolling) {\n // set the autoScroll properties to those of the target\n autoScroll.margin = options.margin;\n autoScroll.speed = options.speed;\n\n autoScroll.start(interaction);\n }\n },\n};\n\nInteraction.signals.on('stop-active', function () {\n autoScroll.stop();\n});\n\nInteraction.signals.on('action-move', autoScroll.onInteractionMove);\n\ndefaultOptions.perAction.autoScroll = autoScroll.defaults;\n\nmodule.exports = autoScroll;\n","const Interactable = require('../Interactable');\nconst actions = require('../actions/base');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.ignoreFrom\n [ method ]\n *\n * If the target of the `mousedown`, `pointerdown` or `touchstart`\n * event or any of it's parents match the given CSS selector or\n * Element, no drag/resize/gesture is started.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to not ignore any elements\n = (string | Element | object) The current ignoreFrom value or this Interactable\n **\n | interact(element, { ignoreFrom: document.getElementById('no-action') });\n | // or\n | interact(element).ignoreFrom('input, textarea, a');\n\\*/\nInteractable.prototype.ignoreFrom = function (newValue) {\n return this._backCompatOption('ignoreFrom', newValue);\n};\n\n/*\\\n * Interactable.allowFrom\n [ method ]\n *\n * A drag/resize/gesture is started only If the target of the\n * `mousedown`, `pointerdown` or `touchstart` event or any of it's\n * parents match the given CSS selector or Element.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to allow from any element\n = (string | Element | object) The current allowFrom value or this Interactable\n **\n | interact(element, { allowFrom: document.getElementById('drag-handle') });\n | // or\n | interact(element).allowFrom('.handle');\n\\*/\nInteractable.prototype.allowFrom = function (newValue) {\n return this._backCompatOption('allowFrom', newValue);\n};\n\nInteractable.prototype.testIgnore = function (ignoreFrom, interactableElement, element) {\n if (!ignoreFrom || !is.element(element)) { return false; }\n\n if (is.string(ignoreFrom)) {\n return domUtils.matchesUpTo(element, ignoreFrom, interactableElement);\n }\n else if (is.element(ignoreFrom)) {\n return domUtils.nodeContains(ignoreFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testAllow = function (allowFrom, interactableElement, element) {\n if (!allowFrom) { return true; }\n\n if (!is.element(element)) { return false; }\n\n if (is.string(allowFrom)) {\n return domUtils.matchesUpTo(element, allowFrom, interactableElement);\n }\n else if (is.element(allowFrom)) {\n return domUtils.nodeContains(allowFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testIgnoreAllow = function (options, interactableElement, eventTarget) {\n return (!this.testIgnore(options.ignoreFrom, interactableElement, eventTarget)\n && this.testAllow(options.allowFrom, interactableElement, eventTarget));\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (event.buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\n","const interact = require('../interact');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst actions = require('../actions/base');\nconst defaultOptions = require('../defaultOptions');\nconst browser = require('../utils/browser');\nconst scope = require('../scope');\nconst utils = require('../utils');\nconst signals = require('../utils/Signals').new();\n\nrequire('./InteractableMethods');\n\nconst autoStart = {\n signals,\n withinInteractionLimit,\n // Allow this many interactions to happen simultaneously\n maxInteractions: Infinity,\n defaults: {\n perAction: {\n manualStart: false,\n max: Infinity,\n maxPerElement: 1,\n allowFrom: null,\n ignoreFrom: null,\n },\n },\n setActionDefaults: function (action) {\n utils.extend(action.defaults, autoStart.defaults.perAction);\n },\n};\n\n// set cursor style on mousedown\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget }) {\n if (interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\n// set cursor style on mousemove\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget }) {\n if (!interaction.mouse\n || interaction.pointerIsDown\n || interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\nInteraction.signals.on('move', function (arg) {\n const { interaction, event } = arg;\n\n if (!interaction.pointerIsDown\n || interaction.interacting()\n || !interaction.pointerWasMoved\n || !interaction.prepared.name) {\n return;\n }\n\n signals.fire('before-start', arg);\n\n const target = interaction.target;\n\n if (interaction.prepared.name && target) {\n // check manualStart and interaction limit\n if (target.options[interaction.prepared.name].manualStart\n || !withinInteractionLimit(target, interaction.element, interaction.prepared)) {\n interaction.stop(event);\n }\n else {\n interaction.start(interaction.prepared, target, interaction.element);\n }\n }\n});\n\n// Check if the current target supports the action.\n// If so, return the validated action. Otherwise, return null\nfunction validateAction (action, interactable, element, eventTarget) {\n if (utils.is.object(action)\n && interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget)\n && interactable.options[action.name].enabled\n && withinInteractionLimit(interactable, element, action)) {\n return action;\n }\n\n return null;\n}\n\nfunction validateSelector (interaction, pointer, event, matches, matchElements, eventTarget) {\n for (let i = 0, len = matches.length; i < len; i++) {\n const match = matches[i];\n const matchElement = matchElements[i];\n const action = validateAction(match.getAction(pointer, event, interaction, matchElement),\n match,\n matchElement,\n eventTarget);\n\n if (action) {\n return {\n action,\n target: match,\n element: matchElement,\n };\n }\n }\n\n return {};\n}\n\nfunction getActionInfo (interaction, pointer, event, eventTarget) {\n let matches = [];\n let matchElements = [];\n\n let element = eventTarget;\n let action = null;\n\n function pushMatches (interactable, selector, context) {\n const elements = (browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined);\n\n if (utils.matchesSelector(element, selector, elements)) {\n\n matches.push(interactable);\n matchElements.push(element);\n }\n }\n\n while (utils.is.element(element)) {\n matches = [];\n matchElements = [];\n\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && (action = validateAction(elementInteractable.getAction(pointer, event, interaction, element, eventTarget),\n elementInteractable,\n element,\n eventTarget))\n && !elementInteractable.options[action.name].manualStart) {\n return {\n element,\n action,\n target: elementInteractable,\n };\n }\n else {\n scope.interactables.forEachSelector(pushMatches, element);\n\n const actionInfo = validateSelector(interaction, pointer, event, matches, matchElements, eventTarget);\n\n if (actionInfo.action\n && !actionInfo.target.options[actionInfo.action.name].manualStart) {\n return actionInfo;\n }\n }\n\n element = utils.parentNode(element);\n }\n\n return {};\n}\n\nfunction prepare (interaction, { action, target, element }) {\n action = action || {};\n\n if (interaction.target && interaction.target.options.styleCursor) {\n interaction.target._doc.documentElement.style.cursor = '';\n }\n\n interaction.target = target;\n interaction.element = element;\n utils.copyAction(interaction.prepared, action);\n\n if (target && target.options.styleCursor) {\n const cursor = action? actions[action.name].getCursor(action) : '';\n interaction.target._doc.documentElement.style.cursor = cursor;\n }\n\n signals.fire('prepared', { interaction: interaction });\n}\n\nInteraction.signals.on('stop', function ({ interaction }) {\n const target = interaction.target;\n\n if (target && target.options.styleCursor) {\n target._doc.documentElement.style.cursor = '';\n }\n});\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (utils.is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (utils.is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n const buttons = event.buttons || ({\n 0: 1,\n 1: 4,\n 3: 8,\n 4: 16,\n })[event.button];\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\nfunction withinInteractionLimit (interactable, element, action) {\n const options = interactable.options;\n const maxActions = options[action.name].max;\n const maxPerElement = options[action.name].maxPerElement;\n let activeInteractions = 0;\n let targetCount = 0;\n let targetElementCount = 0;\n\n // no actions if any of these values == 0\n if (!(maxActions && maxPerElement && autoStart.maxInteractions)) { return; }\n\n for (let i = 0, len = scope.interactions.length; i < len; i++) {\n const interaction = scope.interactions[i];\n const otherAction = interaction.prepared.name;\n\n if (!interaction.interacting()) { continue; }\n\n activeInteractions++;\n\n if (activeInteractions >= autoStart.maxInteractions) {\n return false;\n }\n\n if (interaction.target !== interactable) { continue; }\n\n targetCount += (otherAction === action.name)|0;\n\n if (targetCount >= maxActions) {\n return false;\n }\n\n if (interaction.element === element) {\n targetElementCount++;\n\n if (otherAction !== action.name || targetElementCount >= maxPerElement) {\n return false;\n }\n }\n }\n\n return autoStart.maxInteractions > 0;\n}\n\n/*\\\n * interact.maxInteractions\n [ method ]\n **\n * Returns or sets the maximum number of concurrent interactions allowed.\n * By default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables\n * and elements, you need to enable it in the draggable, resizable and\n * gesturable `'max'` and `'maxPerElement'` options.\n **\n - newValue (number) #optional Any number. newValue <= 0 means no interactions.\n\\*/\ninteract.maxInteractions = function (newValue) {\n if (utils.is.number(newValue)) {\n autoStart.maxInteractions = newValue;\n\n return this;\n }\n\n return autoStart.maxInteractions;\n};\n\nInteractable.settingsMethods.push('styleCursor');\nInteractable.settingsMethods.push('actionChecker');\nInteractable.settingsMethods.push('ignoreFrom');\nInteractable.settingsMethods.push('allowFrom');\n\ndefaultOptions.base.actionChecker = null;\ndefaultOptions.base.styleCursor = true;\n\nutils.extend(defaultOptions.perAction, autoStart.defaults.perAction);\n\nmodule.exports = autoStart;\n","const autoStart = require('./base');\nconst Interaction = require('../Interaction');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.delayTimer = null;\n});\n\nautoStart.signals.on('prepared', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.delayTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.target, interaction.element);\n }, delay);\n }\n});\n\nInteraction.signals.on('move', function ({ interaction, duplicate }) {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.delayTimer);\n }\n});\n\n// prevent regular down->move autoStart\nautoStart.signals.on('before-start', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.prepared.name = null;\n }\n});\n","const autoStart = require('./base');\nconst scope = require('../scope');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\n\nconst { matchesSelector, parentNode } = require('../utils/domUtils');\n\nautoStart.setActionDefaults(require('../actions/drag'));\n\nautoStart.signals.on('before-start', function ({ interaction, eventTarget, dx, dy }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // check if a drag is in the correct axis\n const absX = Math.abs(dx);\n const absY = Math.abs(dy);\n const options = interaction.target.options.drag;\n const startAxis = options.startAxis;\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy');\n\n interaction.prepared.axis = options.lockAxis === 'start'\n ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n : options.lockAxis;\n\n // if the movement isn't in the startAxis of the interactable\n if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) {\n // cancel the prepared action\n interaction.prepared.name = null;\n\n // then try to get a drag from another ineractable\n\n if (!interaction.prepared.name) {\n\n let element = eventTarget;\n\n const getDraggable = function (interactable, selector, context) {\n const elements = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n if (interactable === interaction.target) { return; }\n\n if (!options.manualStart\n && !interactable.testIgnoreAllow(options, element, eventTarget)\n && matchesSelector(element, selector, elements)) {\n\n const action = interactable.getAction(interaction.downPointer,\n interaction.downEvent,\n interaction,\n element);\n\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, interactable)\n && autoStart.validateAction(action, interactable, element, eventTarget)) {\n\n return interactable;\n }\n }\n };\n\n let action = null;\n\n // check all interactables\n while (is.element(element)) {\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && elementInteractable !== interaction.target\n && !elementInteractable.options.drag.manualStart) {\n\n action = elementInteractable.getAction(interaction.downPointer, interaction.downEvent, interaction, element);\n }\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, elementInteractable)) {\n\n interaction.prepared.name = 'drag';\n interaction.target = elementInteractable;\n interaction.element = element;\n break;\n }\n\n const selectorInteractable = scope.interactables.forEachSelector(getDraggable, element);\n\n if (selectorInteractable) {\n interaction.prepared.name = 'drag';\n interaction.target = selectorInteractable;\n interaction.element = element;\n break;\n }\n\n element = parentNode(element);\n }\n }\n }\n});\n\nfunction checkStartAxis (startAxis, interactable) {\n if (!interactable) { return false; }\n\n const thisAxis = interactable.options.drag.startAxis;\n\n return (startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis);\n}\n","require('./base').setActionDefaults(require('../actions/gesture'));\n","require('./base').setActionDefaults(require('../actions/resize'));\n","module.exports = {\n base: {\n accept : null,\n preventDefault: 'auto',\n deltaSource : 'page',\n },\n\n perAction: {\n origin: { x: 0, y: 0 },\n\n // only allow left button by default\n // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n mouseButtons: 1,\n\n inertia: {\n enabled : false,\n resistance : 10, // the lambda in exponential decay\n minSpeed : 100, // target speed must be above this for inertia to start\n endSpeed : 10, // the speed at which inertia is slow enough to stop\n allowResume : true, // allow resuming an action in inertia phase\n smoothEndDuration: 300, // animate to snap/restrict endOnly if there's no inertia\n },\n },\n};\n","/* browser entry point */\n\n// Legacy browser support\nrequire('./legacyBrowsers');\n\n// inertia\nrequire('./inertia');\n\n// modifiers\nrequire('./modifiers/snap');\nrequire('./modifiers/restrict');\n\n// pointerEvents\nrequire('./pointerEvents/base');\nrequire('./pointerEvents/holdRepeat');\nrequire('./pointerEvents/interactableTargets');\n\n// delay\nrequire('./autoStart/delay');\n\n// actions\nrequire('./actions/gesture');\nrequire('./actions/resize');\nrequire('./actions/drag');\nrequire('./actions/drop');\n\n// load these modifiers after resize is loaded\nrequire('./modifiers/snapSize');\nrequire('./modifiers/restrictEdges');\nrequire('./modifiers/restrictSize');\n\n// autoStart actions\nrequire('./autoStart/gesture');\nrequire('./autoStart/resize');\nrequire('./autoStart/drag');\n\n// Interactable preventDefault setting\nrequire('./interactablePreventDefault.js');\n\n// autoScroll\nrequire('./autoScroll');\n\n// export interact\nmodule.exports = require('./interact');\n","const InteractEvent = require('./InteractEvent');\nconst Interaction = require('./Interaction');\nconst modifiers = require('./modifiers');\nconst utils = require('./utils');\nconst animationFrame = require('./utils/raf');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.inertiaStatus = {\n active : false,\n smoothEnd : false,\n allowResume: false,\n\n startEvent: null,\n upCoords : {},\n\n xe: 0, ye: 0,\n sx: 0, sy: 0,\n\n t0: 0,\n vx0: 0, vys: 0,\n duration: 0,\n\n lambda_v0: 0,\n one_ve_v0: 0,\n i : null,\n };\n\n interaction.boundInertiaFrame = () => inertiaFrame .apply(interaction);\n interaction.boundSmoothEndFrame = () => smoothEndFrame.apply(interaction);\n});\n\nInteraction.signals.on('down', function ({ interaction, event, pointer, eventTarget }) {\n const status = interaction.inertiaStatus;\n\n // Check if the down event hits the current inertia target\n if (status.active) {\n let element = eventTarget;\n\n // climb up the DOM tree from the event target\n while (utils.is.element(element)) {\n\n // if interaction element is the current inertia target element\n if (element === interaction.element) {\n // stop inertia\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n\n // update pointers to the down event's coordinates\n interaction.updatePointer(pointer);\n utils.setCoords(interaction.curCoords, interaction.pointers);\n\n // fire appropriate signals\n const signalArg = { interaction };\n Interaction.signals.fire('before-action-move', signalArg);\n Interaction.signals.fire('action-resume' , signalArg);\n\n // fire a reume event\n const resumeEvent = new InteractEvent(interaction,\n event,\n interaction.prepared.name,\n 'inertiaresume',\n interaction.element);\n\n interaction.target.fire(resumeEvent);\n interaction.prevEvent = resumeEvent;\n modifiers.resetStatuses(interaction.modifierStatuses);\n\n utils.copyCoords(interaction.prevCoords, interaction.curCoords);\n break;\n }\n\n element = utils.parentNode(element);\n }\n }\n});\n\nInteraction.signals.on('up', function ({ interaction, event }) {\n const status = interaction.inertiaStatus;\n\n if (!interaction.interacting() || status.active) { return; }\n\n const target = interaction.target;\n const options = target && target.options;\n const inertiaOptions = options && interaction.prepared.name && options[interaction.prepared.name].inertia;\n\n const now = new Date().getTime();\n const statuses = {};\n const page = utils.extend({}, interaction.curCoords.page);\n const pointerSpeed = interaction.pointerDelta.client.speed;\n\n let smoothEnd = false;\n let modifierResult;\n\n // check if inertia should be started\n const inertiaPossible = (inertiaOptions && inertiaOptions.enabled\n && interaction.prepared.name !== 'gesture'\n && event !== status.startEvent);\n\n const inertia = (inertiaPossible\n && (now - interaction.curCoords.timeStamp) < 50\n && pointerSpeed > inertiaOptions.minSpeed\n && pointerSpeed > inertiaOptions.endSpeed);\n\n const modifierArg = {\n interaction,\n pageCoords: page,\n statuses,\n preEnd: true,\n requireEndOnly: true,\n };\n\n // smoothEnd\n if (inertiaPossible && !inertia) {\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n if (modifierResult.shouldMove && modifierResult.locked) {\n smoothEnd = true;\n }\n }\n\n if (!(inertia || smoothEnd)) { return; }\n\n utils.copyCoords(status.upCoords, interaction.curCoords);\n\n interaction.pointers[0] = status.startEvent =\n new InteractEvent(interaction, event, interaction.prepared.name, 'inertiastart', interaction.element);\n\n status.t0 = now;\n\n status.active = true;\n status.allowResume = inertiaOptions.allowResume;\n interaction.simulation = status;\n\n target.fire(status.startEvent);\n\n if (inertia) {\n status.vx0 = interaction.pointerDelta.client.vx;\n status.vy0 = interaction.pointerDelta.client.vy;\n status.v0 = pointerSpeed;\n\n calcInertia(interaction, status);\n\n utils.extend(page, interaction.curCoords.page);\n\n page.x += status.xe;\n page.y += status.ye;\n\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n status.modifiedXe += modifierResult.dx;\n status.modifiedYe += modifierResult.dy;\n\n status.i = animationFrame.request(interaction.boundInertiaFrame);\n }\n else {\n status.smoothEnd = true;\n status.xe = modifierResult.dx;\n status.ye = modifierResult.dy;\n\n status.sx = status.sy = 0;\n\n status.i = animationFrame.request(interaction.boundSmoothEndFrame);\n }\n});\n\nInteraction.signals.on('stop-active', function ({ interaction }) {\n const status = interaction.inertiaStatus;\n\n if (status.active) {\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n }\n});\n\nfunction calcInertia (interaction, status) {\n const inertiaOptions = interaction.target.options[interaction.prepared.name].inertia;\n const lambda = inertiaOptions.resistance;\n const inertiaDur = -Math.log(inertiaOptions.endSpeed / status.v0) / lambda;\n\n status.x0 = interaction.prevEvent.pageX;\n status.y0 = interaction.prevEvent.pageY;\n status.t0 = status.startEvent.timeStamp / 1000;\n status.sx = status.sy = 0;\n\n status.modifiedXe = status.xe = (status.vx0 - inertiaDur) / lambda;\n status.modifiedYe = status.ye = (status.vy0 - inertiaDur) / lambda;\n status.te = inertiaDur;\n\n status.lambda_v0 = lambda / status.v0;\n status.one_ve_v0 = 1 - inertiaOptions.endSpeed / status.v0;\n}\n\nfunction inertiaFrame () {\n updateInertiaCoords(this);\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n\n const status = this.inertiaStatus;\n const options = this.target.options[this.prepared.name].inertia;\n const lambda = options.resistance;\n const t = new Date().getTime() / 1000 - status.t0;\n\n if (t < status.te) {\n\n const progress = 1 - (Math.exp(-lambda * t) - status.lambda_v0) / status.one_ve_v0;\n\n if (status.modifiedXe === status.xe && status.modifiedYe === status.ye) {\n status.sx = status.xe * progress;\n status.sy = status.ye * progress;\n }\n else {\n const quadPoint = utils.getQuadraticCurvePoint(0, 0,\n status.xe,\n status.ye,\n status.modifiedXe,\n status.modifiedYe,\n progress);\n\n status.sx = quadPoint.x;\n status.sy = quadPoint.y;\n }\n\n this.doMove();\n\n status.i = animationFrame.request(this.boundInertiaFrame);\n }\n else {\n status.sx = status.modifiedXe;\n status.sy = status.modifiedYe;\n\n this.doMove();\n this.end(status.startEvent);\n status.active = false;\n this.simulation = null;\n }\n\n utils.copyCoords(this.prevCoords, this.curCoords);\n}\n\nfunction smoothEndFrame () {\n updateInertiaCoords(this);\n\n const status = this.inertiaStatus;\n const t = new Date().getTime() - status.t0;\n const duration = this.target.options[this.prepared.name].inertia.smoothEndDuration;\n\n if (t < duration) {\n status.sx = utils.easeOutQuad(t, 0, status.xe, duration);\n status.sy = utils.easeOutQuad(t, 0, status.ye, duration);\n\n this.pointerMove(status.startEvent, status.startEvent);\n\n status.i = animationFrame.request(this.boundSmoothEndFrame);\n }\n else {\n status.sx = status.xe;\n status.sy = status.ye;\n\n this.pointerMove(status.startEvent, status.startEvent);\n this.end(status.startEvent);\n\n status.smoothEnd =\n status.active = false;\n this.simulation = null;\n }\n}\n\nfunction updateInertiaCoords (interaction) {\n const status = interaction.inertiaStatus;\n\n // return if inertia isn't running\n if (!status.active) { return; }\n\n const pageUp = status.upCoords.page;\n const clientUp = status.upCoords.client;\n\n utils.setCoords(interaction.curCoords, [ {\n pageX : pageUp.x + status.sx,\n pageY : pageUp.y + status.sy,\n clientX: clientUp.x + status.sx,\n clientY: clientUp.y + status.sy,\n } ]);\n}\n","const browser = require('./utils/browser');\nconst events = require('./utils/events');\nconst utils = require('./utils');\nconst scope = require('./scope');\nconst Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\n\nconst globalEvents = {};\n\n/*\\\n * interact\n [ method ]\n *\n * The methods of this variable can be used to set elements as\n * interactables and also to change various default settings.\n *\n * Calling it as a function and passing an element or a valid CSS selector\n * string returns an Interactable object which has various methods to\n * configure it.\n *\n - element (Element | string) The HTML or SVG Element to interact with or CSS selector\n = (object) An @Interactable\n *\n > Usage\n | interact('#draggable').draggable(true);\n |\n | var rectables = interact('rect');\n | rectables\n | .gesturable(true)\n | .on('gesturemove', function (event) {\n | // ...\n | });\n\\*/\nfunction interact (element, options) {\n let interactable = scope.interactables.get(element, options);\n\n if (!interactable) {\n interactable = new Interactable(element, options);\n interactable.events.global = globalEvents;\n }\n\n return interactable;\n}\n\n/*\\\n * interact.isSet\n [ method ]\n *\n * Check if an element has been set\n - element (Element) The Element being searched for\n = (boolean) Indicates if the element or CSS selector was previously passed to interact\n\\*/\ninteract.isSet = function (element, options) {\n return scope.interactables.indexOfElement(element, options && options.context) !== -1;\n};\n\n/*\\\n * interact.on\n [ method ]\n *\n * Adds a global listener for an InteractEvent or adds a DOM event to\n * `document`\n *\n - type (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) interact\n\\*/\ninteract.on = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.on(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.on(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n // if it is an InteractEvent type, add listener to globalEvents\n if (utils.contains(Interactable.eventTypes, type)) {\n // if this type of event was never bound\n if (!globalEvents[type]) {\n globalEvents[type] = [listener];\n }\n else {\n globalEvents[type].push(listener);\n }\n }\n // If non InteractEvent type, addEventListener to document\n else {\n events.add(scope.document, type, listener, { options });\n }\n\n return interact;\n};\n\n/*\\\n * interact.off\n [ method ]\n *\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n - type (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) interact\n \\*/\ninteract.off = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.off(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.off(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n if (!utils.contains(Interactable.eventTypes, type)) {\n events.remove(scope.document, type, listener, options);\n }\n else {\n let index;\n\n if (type in globalEvents\n && (index = utils.indexOf(globalEvents[type], listener)) !== -1) {\n globalEvents[type].splice(index, 1);\n }\n }\n\n return interact;\n};\n\n/*\\\n * interact.debug\n [ method ]\n *\n * Returns an object which exposes internal data\n = (object) An object with properties that outline the current state and expose internal functions and variables\n\\*/\ninteract.debug = function () {\n return scope;\n};\n\n// expose the functions used to calculate multi-touch properties\ninteract.getPointerAverage = utils.pointerAverage;\ninteract.getTouchBBox = utils.touchBBox;\ninteract.getTouchDistance = utils.touchDistance;\ninteract.getTouchAngle = utils.touchAngle;\n\ninteract.getElementRect = utils.getElementRect;\ninteract.getElementClientRect = utils.getElementClientRect;\ninteract.matchesSelector = utils.matchesSelector;\ninteract.closest = utils.closest;\n\n/*\\\n * interact.supportsTouch\n [ method ]\n *\n = (boolean) Whether or not the browser supports touch input\n\\*/\ninteract.supportsTouch = function () {\n return browser.supportsTouch;\n};\n\n/*\\\n * interact.supportsPointerEvent\n [ method ]\n *\n = (boolean) Whether or not the browser supports PointerEvents\n\\*/\ninteract.supportsPointerEvent = function () {\n return browser.supportsPointerEvent;\n};\n\n/*\\\n * interact.stop\n [ method ]\n *\n * Cancels all interactions (end events are not fired)\n *\n - event (Event) An event on which to call preventDefault()\n = (object) interact\n\\*/\ninteract.stop = function (event) {\n for (let i = scope.interactions.length - 1; i >= 0; i--) {\n scope.interactions[i].stop(event);\n }\n\n return interact;\n};\n\n/*\\\n * interact.pointerMoveTolerance\n [ method ]\n * Returns or sets the distance the pointer must be moved before an action\n * sequence occurs. This also affects tolerance for tap events.\n *\n - newValue (number) #optional The movement from the start position must be greater than this value\n = (number | Interactable) The current setting or interact\n\\*/\ninteract.pointerMoveTolerance = function (newValue) {\n if (utils.is.number(newValue)) {\n Interaction.pointerMoveTolerance = newValue;\n\n return this;\n }\n\n return Interaction.pointerMoveTolerance;\n};\n\ninteract.addDocument = scope.addDocument;\ninteract.removeDocument = scope.removeDocument;\n\nscope.interact = interact;\n\nmodule.exports = interact;\n","const Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\nconst scope = require('./scope');\nconst is = require('./utils/is');\nconst events = require('./utils/events');\n\nconst { nodeContains, matchesSelector } = require('./utils/domUtils');\n\n/*\\\n * Interactable.preventDefault\n [ method ]\n *\n * Returns or sets whether to prevent the browser's default behaviour\n * in response to pointer events. Can be set to:\n * - `'always'` to always prevent\n * - `'never'` to never prevent\n * - `'auto'` to let interact.js try to determine what would be best\n *\n - newValue (string) #optional `true`, `false` or `'auto'`\n = (string | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.preventDefault = function (newValue) {\n if (/^(always|never|auto)$/.test(newValue)) {\n this.options.preventDefault = newValue;\n return this;\n }\n\n if (is.bool(newValue)) {\n this.options.preventDefault = newValue? 'always' : 'never';\n return this;\n }\n\n return this.options.preventDefault;\n};\n\nInteractable.prototype.checkAndPreventDefault = function (event) {\n const setting = this.options.preventDefault;\n\n if (setting === 'never') { return; }\n\n if (setting === 'always') {\n event.preventDefault();\n return;\n }\n\n // setting === 'auto'\n\n // don't preventDefault if the browser supports passiveEvents\n // CSS touch-action and user-selecct should be used instead\n if (events.supportsOptions) {\n return;\n }\n\n // don't preventDefault of pointerdown events\n if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) {\n return;\n }\n\n // don't preventDefault on editable elements\n if (is.element(event.target)\n && matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) {\n return;\n }\n\n event.preventDefault();\n};\n\nfunction onInteractionEvent ({ interaction, event }) {\n if (interaction.target) {\n interaction.target.checkAndPreventDefault(event);\n }\n}\n\nfor (const eventSignal of ['down', 'move', 'up', 'cancel']) {\n Interaction.signals.on(eventSignal, onInteractionEvent);\n}\n\n// prevent native HTML5 drag on interact.js target elements\nInteraction.docEvents.dragstart = function preventNativeDrag (event) {\n for (const interaction of scope.interactions) {\n\n if (interaction.element\n && (interaction.element === event.target\n || nodeContains(interaction.element, event.target))) {\n\n interaction.target.checkAndPreventDefault(event);\n return;\n }\n }\n};\n","const scope = require('./scope');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst iFinder = require('./utils/interactionFinder');\nconst pointerEvents = require('./pointerEvents/base');\n\nconst { window } = require('./utils/window');\n\nconst toString = Object.prototype.toString;\n\nif (!window.Array.isArray) {\n window.Array.isArray = function (obj) {\n return toString.call(obj) === '[object Array]';\n };\n}\n\nif (!String.prototype.trim) {\n String.prototype.trim = function () {\n return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n };\n}\n\n// http://www.quirksmode.org/dom/events/click.html\n// >Events leading to dblclick\n//\n// IE8 doesn't fire down event before dblclick.\n// This workaround tries to fire a tap and doubletap after dblclick\nfunction onIE8Dblclick (event) {\n const eventTarget = event.target;\n const interaction = iFinder.search(event, event.type, eventTarget);\n\n if (!interaction) { return; }\n\n if (interaction.prevTap\n && event.clientX === interaction.prevTap.clientX\n && event.clientY === interaction.prevTap.clientY\n && eventTarget === interaction.prevTap.target) {\n\n interaction.downTargets[0] = eventTarget;\n interaction.downTimes [0] = new Date().getTime();\n\n pointerEvents.fire({\n interaction,\n event,\n eventTarget,\n pointer: event,\n type: 'tap',\n });\n }\n}\n\nif (browser.isIE8) {\n const selectFix = function (event) {\n for (const interaction of scope.interactions) {\n if (interaction.interacting()) {\n interaction.target.checkAndPreventDefault(event);\n }\n }\n };\n\n const onDocIE8 = function onDocIE8 ({ doc, win }, signalName) {\n const eventMethod = signalName.indexOf('listen') === 0\n ? events.add : events.remove;\n\n // For IE's lack of Event#preventDefault\n eventMethod(doc, 'selectstart', selectFix);\n\n if (pointerEvents) {\n eventMethod(doc, 'dblclick', onIE8Dblclick);\n }\n };\n\n scope.signals.on('add-document' , onDocIE8);\n scope.signals.on('remove-document', onDocIE8);\n}\n\nmodule.exports = null;\n","const InteractEvent = require('../InteractEvent');\nconst Interaction = require('../Interaction');\nconst extend = require('../utils/extend');\n\nconst modifiers = {\n names: [],\n\n setOffsets: function (arg) {\n const { interaction, pageCoords: page } = arg;\n const { target, element, startOffset } = interaction;\n const rect = target.getRect(element);\n\n if (rect) {\n startOffset.left = page.x - rect.left;\n startOffset.top = page.y - rect.top;\n\n startOffset.right = rect.right - page.x;\n startOffset.bottom = rect.bottom - page.y;\n\n if (!('width' in rect)) { rect.width = rect.right - rect.left; }\n if (!('height' in rect)) { rect.height = rect.bottom - rect.top ; }\n }\n else {\n startOffset.left = startOffset.top = startOffset.right = startOffset.bottom = 0;\n }\n\n arg.rect = rect;\n arg.interactable = target;\n arg.element = element;\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n\n arg.options = target.options[interaction.prepared.name][modifierName];\n\n if (!arg.options) {\n continue;\n }\n\n interaction.modifierOffsets[modifierName] = modifiers[modifierName].setOffset(arg);\n }\n },\n\n setAll: function (arg) {\n const { interaction, statuses, preEnd, requireEndOnly } = arg;\n const coords = extend({}, arg.pageCoords);\n const result = {\n dx: 0,\n dy: 0,\n changed: false,\n locked: false,\n shouldMove: true,\n };\n\n for (const modifierName of modifiers.names) {\n const modifier = modifiers[modifierName];\n const options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!shouldDo(options, preEnd, requireEndOnly)) { continue; }\n\n arg.status = arg.status = statuses[modifierName];\n arg.options = options;\n arg.offset = arg.interaction.modifierOffsets[modifierName];\n\n modifier.set(arg);\n\n if (arg.status.locked) {\n coords.x += arg.status.dx;\n coords.y += arg.status.dy;\n\n result.dx += arg.status.dx;\n result.dy += arg.status.dy;\n\n result.locked = true;\n }\n }\n\n // a move should be fired if:\n // - there are no modifiers enabled,\n // - no modifiers are \"locked\" i.e. have changed the pointer's coordinates, or\n // - the locked coords have changed since the last pointer move\n result.shouldMove = !arg.status || !result.locked || arg.status.changed;\n\n return result;\n },\n\n resetStatuses: function (statuses) {\n for (const modifierName of modifiers.names) {\n const status = statuses[modifierName] || {};\n\n status.dx = status.dy = 0;\n status.modifiedX = status.modifiedY = NaN;\n status.locked = false;\n status.changed = true;\n\n statuses[modifierName] = status;\n }\n\n return statuses;\n },\n\n start: function ({ interaction }, signalName) {\n const arg = {\n interaction,\n pageCoords: (signalName === 'action-resume' ?\n interaction.curCoords : interaction.startCoords).page,\n startOffset: interaction.startOffset,\n statuses: interaction.modifierStatuses,\n preEnd: false,\n requireEndOnly: false,\n };\n\n modifiers.setOffsets(arg);\n modifiers.resetStatuses(arg.statuses);\n\n arg.pageCoords = extend({}, interaction.startCoords.page);\n interaction.modifierResult = modifiers.setAll(arg);\n },\n};\n\nInteraction.signals.on('new', function (interaction) {\n interaction.startOffset = { left: 0, right: 0, top: 0, bottom: 0 };\n interaction.modifierOffsets = {};\n interaction.modifierStatuses = modifiers.resetStatuses({});\n interaction.modifierResult = null;\n});\n\nInteraction.signals.on('action-start' , modifiers.start);\nInteraction.signals.on('action-resume', modifiers.start);\n\nInteraction.signals.on('before-action-move', function ({ interaction, preEnd, interactingBeforeMove }) {\n const modifierResult = modifiers.setAll({\n interaction,\n preEnd,\n pageCoords: interaction.curCoords.page,\n statuses: interaction.modifierStatuses,\n requireEndOnly: false,\n });\n\n // don't fire an action move if a modifier would keep the event in the same\n // cordinates as before\n if (!modifierResult.shouldMove && interactingBeforeMove) {\n interaction._dontFireMove = true;\n }\n\n interaction.modifierResult = modifierResult;\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n for (let i = 0; i < modifiers.names.length; i++) {\n const options = interaction.target.options[interaction.prepared.name][modifiers.names[i]];\n\n // if the endOnly option is true for any modifier\n if (shouldDo(options, true, true)) {\n // fire a move event at the modified coordinates\n interaction.doMove({ event, preEnd: true });\n break;\n }\n }\n});\n\nInteractEvent.signals.on('set-xy', function (arg) {\n const { iEvent, interaction } = arg;\n const modifierArg = extend({}, arg);\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n modifierArg.options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!modifierArg.options) {\n continue;\n }\n\n const modifier = modifiers[modifierName];\n\n modifierArg.status = interaction.modifierStatuses[modifierName];\n\n iEvent[modifierName] = modifier.modifyCoords(modifierArg);\n }\n});\n\nfunction shouldDo (options, preEnd, requireEndOnly) {\n return (options && options.enabled\n && (preEnd || !options.endOnly)\n && (!requireEndOnly || options.endOnly));\n}\n\nmodule.exports = modifiers;\n","const modifiers = require('./index');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst restrict = {\n defaults: {\n enabled : false,\n endOnly : false,\n restriction: null,\n elementRect: null,\n },\n\n setOffset: function ({ rect, startOffset, options }) {\n const elementRect = options && options.elementRect;\n const offset = {};\n\n if (rect && elementRect) {\n offset.left = startOffset.left - (rect.width * elementRect.left);\n offset.top = startOffset.top - (rect.height * elementRect.top);\n\n offset.right = startOffset.right - (rect.width * (1 - elementRect.right));\n offset.bottom = startOffset.bottom - (rect.height * (1 - elementRect.bottom));\n }\n else {\n offset.left = offset.top = offset.right = offset.bottom = 0;\n }\n\n return offset;\n },\n\n set: function ({ pageCoords, interaction, status, options }) {\n if (!options) { return status; }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n\n const restriction = getRestrictionRect(options.restriction, interaction, page);\n\n if (!restriction) { return status; }\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n const rect = restriction;\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n const offset = interaction.modifierOffsets.restrict;\n\n // object is assumed to have\n // x, y, width, height or\n // left, top, right, bottom\n if ('x' in restriction && 'y' in restriction) {\n modifiedX = Math.max(Math.min(rect.x + rect.width - offset.right , page.x), rect.x + offset.left);\n modifiedY = Math.max(Math.min(rect.y + rect.height - offset.bottom, page.y), rect.y + offset.top );\n }\n else {\n modifiedX = Math.max(Math.min(rect.right - offset.right , page.x), rect.left + offset.left);\n modifiedY = Math.max(Math.min(rect.bottom - offset.bottom, page.y), rect.top + offset.top );\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const elementRect = options && options.elementRect;\n\n if (options && options.enabled\n && !(phase === 'start' && elementRect && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n getRestrictionRect,\n};\n\nfunction getRestrictionRect (value, interaction, page) {\n if (utils.is.function(value)) {\n return utils.resolveRectLike(value, interaction.target, interaction.element, [page.x, page.y, interaction]);\n } else {\n return utils.resolveRectLike(value, interaction.target, interaction.element);\n }\n}\n\nmodifiers.restrict = restrict;\nmodifiers.names.push('restrict');\n\ndefaultOptions.perAction.restrict = restrict.defaults;\n\nmodule.exports = restrict;\n","// This module adds the options.resize.restrictEdges setting which sets min and\n// max for the top, left, bottom and right edges of the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictEdges: {\n// inner: { top: 200, left: 200, right: 400, bottom: 400 },\n// outer: { top: 0, left: 0, right: 600, bottom: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst { getRestrictionRect } = require('./restrict');\n\nconst noInner = { top: +Infinity, left: +Infinity, bottom: -Infinity, right: -Infinity };\nconst noOuter = { top: -Infinity, left: -Infinity, bottom: +Infinity, right: +Infinity };\n\nconst restrictEdges = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n offset: null,\n },\n\n setOffset: function ({ interaction, startOffset, options }) {\n if (!options) {\n return utils.extend({}, startOffset);\n }\n\n const offset = getRestrictionRect(options.offset, interaction, interaction.startCoords.page);\n\n if (offset) {\n return {\n top: startOffset.top + offset.y,\n left: startOffset.left + offset.x,\n bottom: startOffset.bottom + offset.y,\n right: startOffset.right + offset.x,\n };\n }\n\n return startOffset;\n },\n\n set: function ({ pageCoords, interaction, status, offset, options }) {\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n const inner = rectUtils.xywhToTlbr(getRestrictionRect(options.inner, interaction, page)) || noInner;\n const outer = rectUtils.xywhToTlbr(getRestrictionRect(options.outer, interaction, page)) || noOuter;\n\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n if (edges.top) {\n modifiedY = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top);\n }\n else if (edges.bottom) {\n modifiedY = Math.max(Math.min(outer.bottom - offset.bottom, page.y), inner.bottom - offset.bottom);\n }\n if (edges.left) {\n modifiedX = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left);\n }\n else if (edges.right) {\n modifiedX = Math.max(Math.min(outer.right - offset.right, page.x), inner.right - offset.right);\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n if (options && options.enabled\n && !(phase === 'start' && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n noInner,\n noOuter,\n getRestrictionRect,\n};\n\nmodifiers.restrictEdges = restrictEdges;\nmodifiers.names.push('restrictEdges');\n\ndefaultOptions.perAction.restrictEdges = restrictEdges.defaults;\nresize.defaults.restrictEdges = restrictEdges.defaults;\n\nmodule.exports = restrictEdges;\n","// This module adds the options.resize.restrictSize setting which sets min and\n// max width and height for the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictSize: {\n// min: { width: -600, height: -600 },\n// max: { width: 600, height: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst restrictEdges = require('./restrictEdges');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst noMin = { width: -Infinity, height: -Infinity };\nconst noMax = { width: +Infinity, height: +Infinity };\n\nconst restrictSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n },\n\n setOffset: function ({ interaction }) {\n return interaction.startOffset;\n },\n\n set: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const rect = rectUtils.xywhToTlbr(interaction.resizeRects.inverted);\n\n const minSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.min, interaction)) || noMin;\n const maxSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.max, interaction)) || noMax;\n\n arg.options = {\n enabled: options.enabled,\n endOnly: options.endOnly,\n inner: utils.extend({}, restrictEdges.noInner),\n outer: utils.extend({}, restrictEdges.noOuter),\n };\n\n if (edges.top) {\n arg.options.inner.top = rect.bottom - minSize.height;\n arg.options.outer.top = rect.bottom - maxSize.height;\n }\n else if (edges.bottom) {\n arg.options.inner.bottom = rect.top + minSize.height;\n arg.options.outer.bottom = rect.top + maxSize.height;\n }\n if (edges.left) {\n arg.options.inner.left = rect.right - minSize.width;\n arg.options.outer.left = rect.right - maxSize.width;\n }\n else if (edges.right) {\n arg.options.inner.right = rect.left + minSize.width;\n arg.options.outer.right = rect.left + maxSize.width;\n }\n\n restrictEdges.set(arg);\n },\n\n modifyCoords: restrictEdges.modifyCoords,\n};\n\nmodifiers.restrictSize = restrictSize;\nmodifiers.names.push('restrictSize');\n\ndefaultOptions.perAction.restrictSize = restrictSize.defaults;\nresize.defaults.restrictSize = restrictSize.defaults;\n\nmodule.exports = restrictSize;\n","const modifiers = require('./index');\nconst interact = require('../interact');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst snap = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n\n relativePoints: null,\n },\n\n setOffset: function ({ interaction, interactable, element, rect, startOffset, options }) {\n const offsets = [];\n const optionsOrigin = utils.rectToXY(utils.resolveRectLike(options.origin));\n const origin = optionsOrigin || utils.getOriginXY(interactable, element, interaction.prepared.name);\n options = options || interactable.options[interaction.prepared.name].snap || {};\n\n let snapOffset;\n\n if (options.offset === 'startCoords') {\n snapOffset = {\n x: interaction.startCoords.page.x - origin.x,\n y: interaction.startCoords.page.y - origin.y,\n };\n }\n else {\n const offsetRect = utils.resolveRectLike(options.offset, interactable, element, [interaction]);\n\n snapOffset = utils.rectToXY(offsetRect) || { x: 0, y: 0 };\n }\n\n if (rect && options.relativePoints && options.relativePoints.length) {\n for (const { x: relativeX, y: relativeY } of options.relativePoints) {\n offsets.push({\n x: startOffset.left - (rect.width * relativeX) + snapOffset.x,\n y: startOffset.top - (rect.height * relativeY) + snapOffset.y,\n });\n }\n }\n else {\n offsets.push(snapOffset);\n }\n\n return offsets;\n },\n\n set: function ({ interaction, pageCoords, status, options, offset: offsets }) {\n const targets = [];\n let target;\n let page;\n let i;\n\n if (status.useStatusXY) {\n page = { x: status.x, y: status.y };\n }\n else {\n const origin = utils.getOriginXY(interaction.target, interaction.element, interaction.prepared.name);\n\n page = utils.extend({}, pageCoords);\n\n page.x -= origin.x;\n page.y -= origin.y;\n }\n\n status.realX = page.x;\n status.realY = page.y;\n\n let len = options.targets? options.targets.length : 0;\n\n for (const { x: offsetX, y: offsetY } of offsets) {\n const relativeX = page.x - offsetX;\n const relativeY = page.y - offsetY;\n\n for (const snapTarget of options.targets) {\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n targets.push({\n x: utils.is.number(target.x) ? (target.x + offsetX) : relativeX,\n y: utils.is.number(target.y) ? (target.y + offsetY) : relativeY,\n\n range: utils.is.number(target.range)? target.range: options.range,\n });\n }\n }\n\n const closest = {\n target: null,\n inRange: false,\n distance: 0,\n range: 0,\n dx: 0,\n dy: 0,\n };\n\n for (i = 0, len = targets.length; i < len; i++) {\n target = targets[i];\n\n const range = target.range;\n const dx = target.x - page.x;\n const dy = target.y - page.y;\n const distance = utils.hypot(dx, dy);\n let inRange = distance <= range;\n\n // Infinite targets count as being out of range\n // compared to non infinite ones that are in range\n if (range === Infinity && closest.inRange && closest.range !== Infinity) {\n inRange = false;\n }\n\n if (!closest.target || (inRange\n // is the closest target in range?\n ? (closest.inRange && range !== Infinity\n // the pointer is relatively deeper in this target\n ? distance / range < closest.distance / closest.range\n // this target has Infinite range and the closest doesn't\n : (range === Infinity && closest.range !== Infinity)\n // OR this target is closer that the previous closest\n || distance < closest.distance)\n // The other is not in range and the pointer is closer to this target\n : (!closest.inRange && distance < closest.distance))) {\n\n closest.target = target;\n closest.distance = distance;\n closest.range = range;\n closest.inRange = inRange;\n closest.dx = dx;\n closest.dy = dy;\n\n status.range = range;\n }\n }\n\n let snapChanged;\n\n if (closest.target) {\n snapChanged = (status.modifiedX !== closest.target.x || status.modifiedY !== closest.target.y);\n\n status.modifiedX = closest.target.x;\n status.modifiedY = closest.target.y;\n }\n else {\n snapChanged = true;\n\n status.modifiedX = NaN;\n status.modifiedY = NaN;\n }\n\n status.dx = closest.dx;\n status.dy = closest.dy;\n\n status.changed = (snapChanged || (closest.inRange && !status.locked));\n status.locked = closest.inRange;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const relativePoints = options && options.relativePoints;\n\n if (options && options.enabled\n && !(phase === 'start' && relativePoints && relativePoints.length)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n }\n\n return {\n range : status.range,\n locked : status.locked,\n x : status.modifiedX,\n y : status.modifiedY,\n realX : status.realX,\n realY : status.realY,\n dx : status.dx,\n dy : status.dy,\n };\n }\n },\n};\n\ninteract.createSnapGrid = function (grid) {\n return function (x, y) {\n const limits = grid.limits || {\n left : -Infinity,\n right : Infinity,\n top : -Infinity,\n bottom: Infinity,\n };\n let offsetX = 0;\n let offsetY = 0;\n\n if (utils.is.object(grid.offset)) {\n offsetX = grid.offset.x;\n offsetY = grid.offset.y;\n }\n\n const gridx = Math.round((x - offsetX) / grid.x);\n const gridy = Math.round((y - offsetY) / grid.y);\n\n const newX = Math.max(limits.left, Math.min(limits.right , gridx * grid.x + offsetX));\n const newY = Math.max(limits.top , Math.min(limits.bottom, gridy * grid.y + offsetY));\n\n return {\n x: newX,\n y: newY,\n range: grid.range,\n };\n };\n};\n\nmodifiers.snap = snap;\nmodifiers.names.push('snap');\n\ndefaultOptions.perAction.snap = snap.defaults;\n\nmodule.exports = snap;\n","// This module allows snapping of the size of targets during resize\n// interactions.\n\nconst modifiers = require('./index');\nconst snap = require('./snap');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\nconst utils = require('../utils/');\n\nconst snapSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n },\n\n setOffset: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.edges;\n\n if (!edges) { return; }\n\n arg.options = {\n relativePoints: [{\n x: edges.left? 0 : 1,\n y: edges.top ? 0 : 1,\n }],\n origin: { x: 0, y: 0 },\n offset: 'self',\n range: options.range,\n };\n\n const offsets = snap.setOffset(arg);\n arg.options = options;\n\n return offsets;\n },\n\n set: function (arg) {\n const { interaction, options, offset, pageCoords } = arg;\n const page = utils.extend({}, pageCoords);\n const relativeX = page.x - offset[0].x;\n const relativeY = page.y - offset[0].y;\n\n arg.options = utils.extend({}, options);\n arg.options.targets = [];\n\n for (const snapTarget of options.targets) {\n let target;\n\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n if ('width' in target && 'height' in target) {\n target.x = target.width;\n target.y = target.height;\n }\n\n arg.options.targets.push(target);\n }\n\n snap.set(arg);\n },\n\n modifyCoords: function (arg) {\n const { options } = arg;\n\n arg.options = utils.extend({}, options);\n arg.options.enabled = options.enabled;\n arg.options.relativePoints = [null];\n\n snap.modifyCoords(arg);\n },\n};\n\nmodifiers.snapSize = snapSize;\nmodifiers.names.push('snapSize');\n\ndefaultOptions.perAction.snapSize = snapSize.defaults;\nresize.defaults.snapSize = snapSize.defaults;\n\nmodule.exports = snapSize;\n","const pointerUtils = require('../utils/pointerUtils');\n\nmodule.exports = class PointerEvent {\n constructor (type, pointer, event, eventTarget, interaction) {\n pointerUtils.pointerExtend(this, event);\n\n if (event !== pointer) {\n pointerUtils.pointerExtend(this, pointer);\n }\n\n this.interaction = interaction;\n\n this.timeStamp = new Date().getTime();\n this.originalEvent = event;\n this.type = type;\n this.pointerId = pointerUtils.getPointerId(pointer);\n this.pointerType = pointerUtils.getPointerType(pointer, interaction);\n this.target = eventTarget;\n this.currentTarget = null;\n\n if (type === 'tap') {\n const pointerIndex = interaction.getPointerIndex(pointer);\n this.dt = this.timeStamp - interaction.downTimes[pointerIndex];\n\n const interval = this.timeStamp - interaction.tapTime;\n\n this.double = !!(interaction.prevTap\n && interaction.prevTap.type !== 'doubletap'\n && interaction.prevTap.target === this.target\n && interval < 500);\n }\n else if (type === 'doubletap') {\n this.dt = pointer.timeStamp - interaction.tapTime;\n }\n }\n\n subtractOrigin ({ x: originX, y: originY }) {\n this.pageX -= originX;\n this.pageY -= originY;\n this.clientX -= originX;\n this.clientY -= originY;\n\n return this;\n }\n\n addOrigin ({ x: originX, y: originY }) {\n this.pageX += originX;\n this.pageY += originY;\n this.clientX += originX;\n this.clientY += originY;\n\n return this;\n }\n\n preventDefault () {\n this.originalEvent.preventDefault();\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n};\n","const PointerEvent = require('./PointerEvent');\nconst Interaction = require('../Interaction');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst defaults = require('../defaultOptions');\nconst signals = require('../utils/Signals').new();\nconst { filter } = require('../utils/arr');\n\nconst simpleSignals = [ 'down', 'up', 'cancel' ];\nconst simpleEvents = [ 'down', 'up', 'cancel' ];\n\nconst pointerEvents = {\n PointerEvent,\n fire,\n collectEventTargets,\n signals,\n defaults: {\n holdDuration: 600,\n ignoreFrom : null,\n allowFrom : null,\n origin : { x: 0, y: 0 },\n },\n types: [\n 'down',\n 'move',\n 'up',\n 'cancel',\n 'tap',\n 'doubletap',\n 'hold',\n ],\n};\n\nfunction fire (arg) {\n const {\n interaction, pointer, event, eventTarget,\n type = arg.pointerEvent.type,\n targets = collectEventTargets(arg),\n pointerEvent = new PointerEvent(type, pointer, event, eventTarget, interaction),\n } = arg;\n\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n targets,\n type,\n pointerEvent,\n };\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n\n for (const prop in target.props || {}) {\n pointerEvent[prop] = target.props[prop];\n }\n\n const origin = utils.getOriginXY(target.eventable, target.element);\n\n pointerEvent.subtractOrigin(origin);\n pointerEvent.eventable = target.eventable;\n pointerEvent.currentTarget = target.element;\n\n target.eventable.fire(pointerEvent);\n\n pointerEvent.addOrigin(origin);\n\n if (pointerEvent.immediatePropagationStopped\n || (pointerEvent.propagationStopped\n && (i + 1) < targets.length && targets[i + 1].element !== pointerEvent.currentTarget)) {\n break;\n }\n }\n\n signals.fire('fired', signalArg);\n\n if (type === 'tap') {\n // if pointerEvent should make a double tap, create and fire a doubletap\n // PointerEvent and use that as the prevTap\n const prevTap = pointerEvent.double\n ? fire({\n interaction, pointer, event, eventTarget,\n type: 'doubletap',\n })\n : pointerEvent;\n\n interaction.prevTap = prevTap;\n interaction.tapTime = prevTap.timeStamp;\n }\n\n return pointerEvent;\n}\n\nfunction collectEventTargets ({ interaction, pointer, event, eventTarget, type }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n // do not fire a tap event if the pointer was moved before being lifted\n if (type === 'tap' && (interaction.pointerWasMoved\n // or if the pointerup target is different to the pointerdown target\n || !(interaction.downTargets[pointerIndex] && interaction.downTargets[pointerIndex] === eventTarget))) {\n return [];\n }\n\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n path,\n targets: [],\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (type === 'hold') {\n signalArg.targets = filter(signalArg.targets, target =>\n target.eventable.options.holdDuration === interaction.holdTimers[pointerIndex].duration);\n }\n\n return signalArg.targets;\n}\n\nInteraction.signals.on('update-pointer-down', function ({ interaction, pointerIndex }) {\n interaction.holdTimers[pointerIndex] = { duration: Infinity, timeout: null };\n});\n\nInteraction.signals.on('remove-pointer', function ({ interaction, pointerIndex }) {\n interaction.holdTimers.splice(pointerIndex, 1);\n});\n\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget, duplicateMove }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n if (!duplicateMove && (!interaction.pointerIsDown || interaction.pointerWasMoved)) {\n if (interaction.pointerIsDown) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n\n fire({\n interaction, pointer, event, eventTarget,\n type: 'move',\n });\n }\n});\n\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget, pointerIndex }) {\n // copy event to be used in timeout for IE8\n const eventCopy = browser.isIE8? utils.extend({}, event) : event;\n\n const timer = interaction.holdTimers[pointerIndex];\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'hold',\n targets: [],\n path,\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (!signalArg.targets.length) { return; }\n\n let minDuration = Infinity;\n\n for (let i = 0; i < signalArg.targets.length; i++) {\n const target = signalArg.targets[i];\n const holdDuration = target.eventable.options.holdDuration;\n\n if (holdDuration < minDuration) {\n minDuration = holdDuration;\n }\n }\n\n timer.duration = minDuration;\n timer.timeout = setTimeout(function () {\n fire({\n interaction, eventCopy, eventTarget,\n pointer: browser.isIE8? eventCopy : pointer,\n type: 'hold',\n });\n }, minDuration);\n});\n\nInteraction.signals.on('up', ({ interaction, pointer, event, eventTarget }) => {\n if (!interaction.pointerWasMoved) {\n fire({ interaction, eventTarget, pointer, event, type: 'tap' });\n }\n});\n\n['up', 'cancel'].forEach(function (signalName) {\n Interaction.signals.on(signalName, function ({ interaction, pointerIndex }) {\n if (interaction.holdTimers[pointerIndex]) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n });\n});\n\nfunction createSignalListener (type) {\n return function ({ interaction, pointer, event, eventTarget }) {\n fire({ interaction, eventTarget, pointer, event, type });\n };\n}\n\nfor (let i = 0; i < simpleSignals.length; i++) {\n Interaction.signals.on(simpleSignals[i], createSignalListener(simpleEvents[i]));\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.prevTap = null; // the most recent tap event on this interaction\n interaction.tapTime = 0; // time of the most recent tap event\n interaction.holdTimers = []; // [{ duration, timeout }]\n});\n\ndefaults.pointerEvents = pointerEvents.defaults;\nmodule.exports = pointerEvents;\n","const pointerEvents = require('./base');\nconst Interaction = require('../Interaction');\n\npointerEvents.signals.on('new', onNew);\npointerEvents.signals.on('fired', onFired);\n\nfor (const signal of ['move', 'up', 'cancel', 'endall']) {\n Interaction.signals.on(signal, endHoldRepeat);\n}\n\nfunction onNew ({ pointerEvent }) {\n if (pointerEvent.type !== 'hold') { return; }\n\n pointerEvent.count = (pointerEvent.count || 0) + 1;\n}\n\nfunction onFired ({ interaction, pointerEvent, eventTarget, targets }) {\n if (pointerEvent.type !== 'hold' || !targets.length) { return; }\n\n // get the repeat interval from the first eventable\n const interval = targets[0].eventable.options.holdRepeatInterval;\n\n // don't repeat if the interval is 0 or less\n if (interval <= 0) { return; }\n\n // set a timeout to fire the holdrepeat event\n interaction.holdIntervalHandle = setTimeout(function () {\n pointerEvents.fire({\n interaction,\n eventTarget,\n type: 'hold',\n pointer: pointerEvent,\n event: pointerEvent,\n });\n }, interval);\n}\n\nfunction endHoldRepeat ({ interaction }) {\n // set the interaction's holdStopTime property\n // to stop further holdRepeat events\n if (interaction.holdIntervalHandle) {\n clearInterval(interaction.holdIntervalHandle);\n interaction.holdIntervalHandle = null;\n }\n}\n\n// don't repeat by default\npointerEvents.defaults.holdRepeatInterval = 0;\npointerEvents.types.push('holdrepeat');\n\nmodule.exports = {\n onNew,\n onFired,\n endHoldRepeat,\n};\n","const pointerEvents = require('./base');\nconst Interactable = require('../Interactable');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\nconst scope = require('../scope');\nconst extend = require('../utils/extend');\nconst { merge } = require('../utils/arr');\n\npointerEvents.signals.on('collect-targets', function ({ targets, element, type, eventTarget }) {\n function collectSelectors (interactable, selector, context) {\n const els = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && is.element(element)\n && domUtils.matchesSelector(element, selector, els)\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n const interactable = scope.interactables.get(element);\n\n if (interactable) {\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n scope.interactables.forEachSelector(collectSelectors, element);\n});\n\nInteractable.signals.on('new', function ({ interactable }) {\n interactable.events.getRect = function (element) {\n return interactable.getRect(element);\n };\n});\n\nInteractable.signals.on('set', function ({ interactable, options }) {\n extend(interactable.events.options, pointerEvents.defaults);\n extend(interactable.events.options, options);\n});\n\nmerge(Interactable.eventTypes, pointerEvents.types);\n\nInteractable.prototype.pointerEvents = function (options) {\n extend(this.events.options, options);\n\n return this;\n};\n\nconst __backCompatOption = Interactable.prototype._backCompatOption;\n\nInteractable.prototype._backCompatOption = function (optionName, newValue) {\n const ret = __backCompatOption.call(this, optionName, newValue);\n\n if (ret === this) {\n this.events.options[optionName] = newValue;\n }\n\n return ret;\n};\n\nInteractable.settingsMethods.push('pointerEvents');\n","const utils = require('./utils');\nconst events = require('./utils/events');\nconst signals = require('./utils/Signals').new();\n\nconst scope = {\n signals,\n events,\n utils,\n\n // main document\n document: require('./utils/domObjects').document,\n // all documents being listened to\n documents: [],\n\n addDocument: function (doc, win) {\n // do nothing if document is already known\n if (utils.contains(scope.documents, doc)) { return false; }\n\n win = win || scope.getWindow(doc);\n\n scope.documents.push(doc);\n events.documents.push(doc);\n\n // don't add an unload event for the main document\n // so that the page may be cached in browser history\n if (doc !== scope.document) {\n events.add(win, 'unload', scope.onWindowUnload);\n }\n\n signals.fire('add-document', { doc, win });\n },\n\n removeDocument: function (doc, win) {\n const index = utils.indexOf(scope.documents, doc);\n\n win = win || scope.getWindow(doc);\n\n events.remove(win, 'unload', scope.onWindowUnload);\n\n scope.documents.splice(index, 1);\n events.documents.splice(index, 1);\n\n signals.fire('remove-document', { win, doc });\n },\n\n onWindowUnload: function () {\n scope.removeDocument(this.document, this);\n },\n};\n\nmodule.exports = scope;\n","const { indexOf } = require('./arr');\n\nclass Signals {\n constructor () {\n this.listeners = {\n // signalName: [listeners],\n };\n }\n\n on (name, listener) {\n if (!this.listeners[name]) {\n this.listeners[name] = [listener];\n return;\n }\n\n this.listeners[name].push(listener);\n }\n\n off (name, listener) {\n if (!this.listeners[name]) { return; }\n\n const index = indexOf(this.listeners[name], listener);\n\n if (index !== -1) {\n this.listeners[name].splice(index, 1);\n }\n }\n\n fire (name, arg) {\n const targetListeners = this.listeners[name];\n\n if (!targetListeners) { return; }\n\n for (let i = 0; i < targetListeners.length; i++) {\n if (targetListeners[i](arg, name) === false) {\n return;\n }\n }\n }\n}\n\nSignals.new = function () {\n return new Signals();\n};\n\nmodule.exports = Signals;\n","function indexOf (array, target) {\n for (let i = 0, len = array.length; i < len; i++) {\n if (array[i] === target) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction contains (array, target) {\n return indexOf(array, target) !== -1;\n}\n\nfunction merge (target, source) {\n for (let i = 0; i < source.length; i++) {\n target.push(source[i]);\n }\n\n return target;\n}\n\nfunction filter (array, test) {\n const result = [];\n\n for (let i = 0; i < array.length; i++) {\n if (test(array[i])) {\n result.push(array[i]);\n }\n }\n\n return result;\n}\n\nmodule.exports = {\n indexOf,\n contains,\n merge,\n filter,\n};\n","const { window } = require('./window');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst Element = domObjects.Element;\nconst navigator = window.navigator;\n\nconst browser = {\n // Does the browser support touch input?\n supportsTouch: !!(('ontouchstart' in window) || is.function(window.DocumentTouch)\n && domObjects.document instanceof window.DocumentTouch),\n\n // Does the browser support PointerEvents\n supportsPointerEvent: !!domObjects.PointerEvent,\n\n isIE8: ('attachEvent' in window) && !('addEventListener' in window),\n\n // Opera Mobile must be handled differently\n isOperaMobile: (navigator.appName === 'Opera'\n && browser.supportsTouch\n && navigator.userAgent.match('Presto')),\n\n // scrolling doesn't change the result of getClientRects on iOS 7\n isIOS7: (/iP(hone|od|ad)/.test(navigator.platform)\n && /OS 7[^\\d]/.test(navigator.appVersion)),\n\n isIe9OrOlder: /MSIE (8|9)/.test(navigator.userAgent),\n\n // prefix matchesSelector\n prefixedMatchesSelector: 'matches' in Element.prototype\n ? 'matches': 'webkitMatchesSelector' in Element.prototype\n ? 'webkitMatchesSelector': 'mozMatchesSelector' in Element.prototype\n ? 'mozMatchesSelector': 'oMatchesSelector' in Element.prototype\n ? 'oMatchesSelector': 'msMatchesSelector',\n\n useMatchesSelectorPolyfill: false,\n\n pEventTypes: (domObjects.PointerEvent\n ? (domObjects.PointerEvent === window.MSPointerEvent\n ? {\n up: 'MSPointerUp',\n down: 'MSPointerDown',\n over: 'mouseover',\n out: 'mouseout',\n move: 'MSPointerMove',\n cancel: 'MSPointerCancel',\n }\n : {\n up: 'pointerup',\n down: 'pointerdown',\n over: 'pointerover',\n out: 'pointerout',\n move: 'pointermove',\n cancel: 'pointercancel',\n })\n : null),\n\n // because Webkit and Opera still use 'mousewheel' event type\n wheelEvent: 'onmousewheel' in domObjects.document? 'mousewheel': 'wheel',\n\n};\n\nbrowser.useMatchesSelectorPolyfill = !is.function(Element.prototype[browser.prefixedMatchesSelector]);\n\nmodule.exports = browser;\n","const domObjects = {};\nconst win = require('./window').window;\n\nfunction blank () {}\n\ndomObjects.document = win.document;\ndomObjects.DocumentFragment = win.DocumentFragment || blank;\ndomObjects.SVGElement = win.SVGElement || blank;\ndomObjects.SVGSVGElement = win.SVGSVGElement || blank;\ndomObjects.SVGElementInstance = win.SVGElementInstance || blank;\ndomObjects.Element = win.Element || blank;\ndomObjects.HTMLElement = win.HTMLElement || domObjects.Element;\n\ndomObjects.Event = win.Event;\ndomObjects.Touch = win.Touch || blank;\ndomObjects.PointerEvent = (win.PointerEvent || win.MSPointerEvent);\n\nmodule.exports = domObjects;\n","const win = require('./window');\nconst browser = require('./browser');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst domUtils = {\n nodeContains: function (parent, child) {\n while (child) {\n if (child === parent) {\n return true;\n }\n\n child = child.parentNode;\n }\n\n return false;\n },\n\n closest: function (element, selector) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) { return element; }\n\n element = domUtils.parentNode(element);\n }\n\n return null;\n },\n\n parentNode: function (node) {\n let parent = node.parentNode;\n\n if (is.docFrag(parent)) {\n // skip past #shado-root fragments\n while ((parent = parent.host) && is.docFrag(parent)) {\n continue;\n }\n\n return parent;\n }\n\n return parent;\n },\n\n // taken from http://tanalin.com/en/blog/2012/12/matches-selector-ie8/ and modified\n matchesSelectorPolyfill: browser.useMatchesSelectorPolyfill\n ? function (element, selector, elems) {\n elems = elems || element.parentNode.querySelectorAll(selector);\n\n for (let i = 0, len = elems.length; i < len; i++) {\n if (elems[i] === element) {\n return true;\n }\n }\n\n return false;\n }\n : null,\n\n matchesSelector: function (element, selector, nodeList) {\n if (browser.useMatchesSelectorPolyfill) {\n return domUtils.matchesSelectorPolyfill(element, selector, nodeList);\n }\n\n // remove /deep/ from selectors if shadowDOM polyfill is used\n if (win.window !== win.realWindow) {\n selector = selector.replace(/\\/deep\\//g, ' ');\n }\n\n return element[browser.prefixedMatchesSelector](selector);\n },\n\n // Test for the element that's \"above\" all other qualifiers\n indexOfDeepestElement: function (elements) {\n let deepestZoneParents = [];\n let dropzoneParents = [];\n let dropzone;\n let deepestZone = elements[0];\n let index = deepestZone? 0: -1;\n let parent;\n let child;\n let i;\n let n;\n\n for (i = 1; i < elements.length; i++) {\n dropzone = elements[i];\n\n // an element might belong to multiple selector dropzones\n if (!dropzone || dropzone === deepestZone) {\n continue;\n }\n\n if (!deepestZone) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n // check if the deepest or current are document.documentElement or document.rootElement\n // - if the current dropzone is, do nothing and continue\n if (dropzone.parentNode === dropzone.ownerDocument) {\n continue;\n }\n // - if deepest is, update with the current dropzone and continue to next\n else if (deepestZone.parentNode === dropzone.ownerDocument) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n if (!deepestZoneParents.length) {\n parent = deepestZone;\n while (parent.parentNode && parent.parentNode !== parent.ownerDocument) {\n deepestZoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n }\n\n // if this element is an svg element and the current deepest is\n // an HTMLElement\n if (deepestZone instanceof domObjects.HTMLElement\n && dropzone instanceof domObjects.SVGElement\n && !(dropzone instanceof domObjects.SVGSVGElement)) {\n\n if (dropzone === deepestZone.parentNode) {\n continue;\n }\n\n parent = dropzone.ownerSVGElement;\n }\n else {\n parent = dropzone;\n }\n\n dropzoneParents = [];\n\n while (parent.parentNode !== parent.ownerDocument) {\n dropzoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n\n n = 0;\n\n // get (position of last common ancestor) + 1\n while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) {\n n++;\n }\n\n const parents = [\n dropzoneParents[n - 1],\n dropzoneParents[n],\n deepestZoneParents[n],\n ];\n\n child = parents[0].lastChild;\n\n while (child) {\n if (child === parents[1]) {\n deepestZone = dropzone;\n index = i;\n deepestZoneParents = [];\n\n break;\n }\n else if (child === parents[2]) {\n break;\n }\n\n child = child.previousSibling;\n }\n }\n\n return index;\n },\n\n matchesUpTo: function (element, selector, limit) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) {\n return true;\n }\n\n element = domUtils.parentNode(element);\n\n if (element === limit) {\n return domUtils.matchesSelector(element, selector);\n }\n }\n\n return false;\n },\n\n getActualElement: function (element) {\n return (element instanceof domObjects.SVGElementInstance\n ? element.correspondingUseElement\n : element);\n },\n\n getScrollXY: function (relevantWindow) {\n relevantWindow = relevantWindow || win.window;\n return {\n x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft,\n y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop,\n };\n },\n\n getElementClientRect: function (element) {\n const clientRect = (element instanceof domObjects.SVGElement\n ? element.getBoundingClientRect()\n : element.getClientRects()[0]);\n\n return clientRect && {\n left : clientRect.left,\n right : clientRect.right,\n top : clientRect.top,\n bottom: clientRect.bottom,\n width : clientRect.width || clientRect.right - clientRect.left,\n height: clientRect.height || clientRect.bottom - clientRect.top,\n };\n },\n\n getElementRect: function (element) {\n const clientRect = domUtils.getElementClientRect(element);\n\n if (!browser.isIOS7 && clientRect) {\n const scroll = domUtils.getScrollXY(win.getWindow(element));\n\n clientRect.left += scroll.x;\n clientRect.right += scroll.x;\n clientRect.top += scroll.y;\n clientRect.bottom += scroll.y;\n }\n\n return clientRect;\n },\n\n getPath: function (element) {\n const path = [];\n\n while (element) {\n path.push(element);\n element = domUtils.parentNode(element);\n }\n\n return path;\n },\n\n trySelector: value => {\n if (!is.string(value)) { return false; }\n\n // an exception will be raised if it is invalid\n domObjects.document.querySelector(value);\n return true;\n },\n};\n\nmodule.exports = domUtils;\n","const is = require('./is');\nconst domUtils = require('./domUtils');\nconst pExtend = require('./pointerExtend');\n\nconst { window, getWindow } = require('./window');\nconst { indexOf, contains } = require('./arr');\n\nconst useAttachEvent = ('attachEvent' in window) && !('addEventListener' in window);\nconst addEvent = useAttachEvent? 'attachEvent': 'addEventListener';\nconst removeEvent = useAttachEvent? 'detachEvent': 'removeEventListener';\nconst on = useAttachEvent? 'on': '';\n\nconst elements = [];\nconst targets = [];\nconst attachedListeners = [];\n\n// {\n// type: {\n// selectors: ['selector', ...],\n// contexts : [document, ...],\n// listeners: [[listener, capture, passive], ...]\n// }\n// }\nconst delegatedEvents = {};\n\nconst documents = [];\n\nconst supportsOptions = !useAttachEvent && (() => {\n let supported = false;\n\n window.document.createElement('div').addEventListener('test', null, {\n get capture () { supported = true; },\n });\n\n return supported;\n})();\n\nfunction add (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n let elementIndex = indexOf(elements, element);\n let target = targets[elementIndex];\n\n if (!target) {\n target = {\n events: {},\n typeCount: 0,\n };\n\n elementIndex = elements.push(element) - 1;\n targets.push(target);\n\n attachedListeners.push(useAttachEvent\n ? {\n supplied: [],\n wrapped : [],\n useCount: [],\n }\n : null);\n }\n\n if (!target.events[type]) {\n target.events[type] = [];\n target.typeCount++;\n }\n\n if (!contains(target.events[type], listener)) {\n let ret;\n\n if (useAttachEvent) {\n const { supplied, wrapped, useCount } = attachedListeners[elementIndex];\n const listenerIndex = indexOf(supplied, listener);\n\n const wrappedListener = wrapped[listenerIndex] || function (event) {\n if (!event.immediatePropagationStopped) {\n event.target = event.srcElement;\n event.currentTarget = element;\n\n event.preventDefault = event.preventDefault || preventDef;\n event.stopPropagation = event.stopPropagation || stopProp;\n event.stopImmediatePropagation = event.stopImmediatePropagation || stopImmProp;\n\n if (/mouse|click/.test(event.type)) {\n event.pageX = event.clientX + getWindow(element).document.documentElement.scrollLeft;\n event.pageY = event.clientY + getWindow(element).document.documentElement.scrollTop;\n }\n\n listener(event);\n }\n };\n\n ret = element[addEvent](on + type, wrappedListener, !!options.capture);\n\n if (listenerIndex === -1) {\n supplied.push(listener);\n wrapped.push(wrappedListener);\n useCount.push(1);\n }\n else {\n useCount[listenerIndex]++;\n }\n }\n else {\n ret = element[addEvent](type, listener, supportsOptions? options : !!options.capture);\n }\n target.events[type].push(listener);\n\n return ret;\n }\n}\n\nfunction remove (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const elementIndex = indexOf(elements, element);\n const target = targets[elementIndex];\n\n if (!target || !target.events) {\n return;\n }\n\n let wrappedListener = listener;\n let listeners;\n let listenerIndex;\n\n if (useAttachEvent) {\n listeners = attachedListeners[elementIndex];\n listenerIndex = indexOf(listeners.supplied, listener);\n wrappedListener = listeners.wrapped[listenerIndex];\n }\n\n if (type === 'all') {\n for (type in target.events) {\n if (target.events.hasOwnProperty(type)) {\n remove(element, type, 'all');\n }\n }\n return;\n }\n\n if (target.events[type]) {\n const len = target.events[type].length;\n\n if (listener === 'all') {\n for (let i = 0; i < len; i++) {\n remove(element, type, target.events[type][i], options);\n }\n return;\n }\n else {\n for (let i = 0; i < len; i++) {\n if (target.events[type][i] === listener) {\n element[removeEvent](on + type, wrappedListener, supportsOptions? options : !!options.capture);\n target.events[type].splice(i, 1);\n\n if (useAttachEvent && listeners) {\n listeners.useCount[listenerIndex]--;\n if (listeners.useCount[listenerIndex] === 0) {\n listeners.supplied.splice(listenerIndex, 1);\n listeners.wrapped.splice(listenerIndex, 1);\n listeners.useCount.splice(listenerIndex, 1);\n }\n }\n\n break;\n }\n }\n }\n\n if (target.events[type] && target.events[type].length === 0) {\n target.events[type] = null;\n target.typeCount--;\n }\n }\n\n if (!target.typeCount) {\n targets.splice(elementIndex, 1);\n elements.splice(elementIndex, 1);\n attachedListeners.splice(elementIndex, 1);\n }\n}\n\nfunction addDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n if (!delegatedEvents[type]) {\n delegatedEvents[type] = {\n selectors: [],\n contexts : [],\n listeners: [],\n };\n\n // add delegate listener functions\n for (let i = 0; i < documents.length; i++) {\n add(documents[i], type, delegateListener);\n add(documents[i], type, delegateUseCapture, true);\n }\n }\n\n const delegated = delegatedEvents[type];\n let index;\n\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n break;\n }\n }\n\n if (index === -1) {\n index = delegated.selectors.length;\n\n delegated.selectors.push(selector);\n delegated.contexts .push(context);\n delegated.listeners.push([]);\n }\n\n // keep listener and capture and passive flags\n delegated.listeners[index].push([listener, !!options.capture, options.passive]);\n}\n\nfunction removeDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const delegated = delegatedEvents[type];\n let matchFound = false;\n let index;\n\n if (!delegated) { return; }\n\n // count from last index of delegated to 0\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n // look for matching selector and context Node\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n\n const listeners = delegated.listeners[index];\n\n // each item of the listeners array is an array: [function, capture, passive]\n for (let i = listeners.length - 1; i >= 0; i--) {\n const [fn, capture, passive] = listeners[i];\n\n // check if the listener functions and capture and passive flags match\n if (fn === listener && capture === !!options.capture && passive === options.passive) {\n // remove the listener from the array of listeners\n listeners.splice(i, 1);\n\n // if all listeners for this interactable have been removed\n // remove the interactable from the delegated arrays\n if (!listeners.length) {\n delegated.selectors.splice(index, 1);\n delegated.contexts .splice(index, 1);\n delegated.listeners.splice(index, 1);\n\n // remove delegate function from context\n remove(context, type, delegateListener);\n remove(context, type, delegateUseCapture, true);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegatedEvents[type] = null;\n }\n }\n\n // only remove one listener\n matchFound = true;\n break;\n }\n }\n\n if (matchFound) { break; }\n }\n }\n}\n\n// bound to the interactable context when a DOM event\n// listener is added to a selector interactable\nfunction delegateListener (event, optionalArg) {\n const options = getOptions(optionalArg);\n const fakeEvent = {};\n const delegated = delegatedEvents[event.type];\n const eventTarget = (domUtils.getActualElement(event.path\n ? event.path[0]\n : event.target));\n let element = eventTarget;\n\n // duplicate the event so that currentTarget can be changed\n pExtend(fakeEvent, event);\n\n fakeEvent.originalEvent = event;\n fakeEvent.preventDefault = preventOriginalDefault;\n\n // climb up document tree looking for selector matches\n while (is.element(element)) {\n for (let i = 0; i < delegated.selectors.length; i++) {\n const selector = delegated.selectors[i];\n const context = delegated.contexts[i];\n\n if (domUtils.matchesSelector(element, selector)\n && domUtils.nodeContains(context, eventTarget)\n && domUtils.nodeContains(context, element)) {\n\n const listeners = delegated.listeners[i];\n\n fakeEvent.currentTarget = element;\n\n for (let j = 0; j < listeners.length; j++) {\n const [fn, capture, passive] = listeners[j];\n\n if (capture === !!options.capture && passive === options.passive) {\n fn(fakeEvent);\n }\n }\n }\n }\n\n element = domUtils.parentNode(element);\n }\n}\n\nfunction delegateUseCapture (event) {\n return delegateListener.call(this, event, true);\n}\n\nfunction preventDef () {\n this.returnValue = false;\n}\n\nfunction preventOriginalDefault () {\n this.originalEvent.preventDefault();\n}\n\nfunction stopProp () {\n this.cancelBubble = true;\n}\n\nfunction stopImmProp () {\n this.cancelBubble = true;\n this.immediatePropagationStopped = true;\n}\n\nfunction getOptions (param) {\n return is.object(param)? param : { capture: param };\n}\n\nmodule.exports = {\n add,\n remove,\n\n addDelegate,\n removeDelegate,\n\n delegateListener,\n delegateUseCapture,\n delegatedEvents,\n documents,\n\n useAttachEvent,\n supportsOptions,\n\n _elements: elements,\n _targets: targets,\n _attachedListeners: attachedListeners,\n};\n","module.exports = function extend (dest, source) {\n for (const prop in source) {\n dest[prop] = source[prop];\n }\n return dest;\n};\n","const {\n resolveRectLike,\n rectToXY,\n} = require('./rect');\n\nmodule.exports = function (target, element, action) {\n const actionOptions = target.options[action];\n const actionOrigin = actionOptions && actionOptions.origin;\n const origin = actionOrigin || target.options.origin;\n\n const originRect = resolveRectLike(origin, target, element, [target && element]);\n\n return rectToXY(originRect) || { x: 0, y: 0 };\n};\n","module.exports = (x, y) => Math.sqrt(x * x + y * y);\n","const extend = require('./extend');\nconst win = require('./window');\n\nconst utils = {\n warnOnce: function (method, message) {\n let warned = false;\n\n return function () {\n if (!warned) {\n win.window.console.warn(message);\n warned = true;\n }\n\n return method.apply(this, arguments);\n };\n },\n\n // http://stackoverflow.com/a/5634528/2280888\n _getQBezierValue: function (t, p1, p2, p3) {\n const iT = 1 - t;\n return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3;\n },\n\n getQuadraticCurvePoint: function (startX, startY, cpX, cpY, endX, endY, position) {\n return {\n x: utils._getQBezierValue(position, startX, cpX, endX),\n y: utils._getQBezierValue(position, startY, cpY, endY),\n };\n },\n\n // http://gizma.com/easing/\n easeOutQuad: function (t, b, c, d) {\n t /= d;\n return -c * t*(t-2) + b;\n },\n\n copyAction: function (dest, src) {\n dest.name = src.name;\n dest.axis = src.axis;\n dest.edges = src.edges;\n\n return dest;\n },\n\n is : require('./is'),\n extend : extend,\n hypot : require('./hypot'),\n getOriginXY: require('./getOriginXY'),\n};\n\nextend(utils, require('./arr'));\nextend(utils, require('./domUtils'));\nextend(utils, require('./pointerUtils'));\nextend(utils, require('./rect'));\n\nmodule.exports = utils;\n","const scope = require('../scope');\nconst utils = require('./index');\nconst browser = require('./browser');\n\nconst finder = {\n methodOrder: [ 'simulationResume', 'mouse', 'hasPointer', 'idle' ],\n\n search: function (pointer, eventType, eventTarget) {\n const mouseEvent = (/mouse/i.test(pointer.pointerType || eventType)\n // MSPointerEvent.MSPOINTER_TYPE_MOUSE\n || pointer.pointerType === 4);\n const pointerId = utils.getPointerId(pointer);\n const details = { pointer, pointerId, mouseEvent, eventType, eventTarget };\n\n for (const method of finder.methodOrder) {\n const interaction = finder[method](details);\n\n if (interaction) {\n return interaction;\n }\n }\n },\n\n // try to resume simulation with a new pointer\n simulationResume: function ({ mouseEvent, eventType, eventTarget }) {\n if (!/down|start/i.test(eventType)) {\n return null;\n }\n\n for (const interaction of scope.interactions) {\n let element = eventTarget;\n\n if (interaction.simulation && interaction.simulation.allowResume\n && (interaction.mouse === mouseEvent)) {\n while (element) {\n // if the element is the interaction element\n if (element === interaction.element) {\n return interaction;\n }\n element = utils.parentNode(element);\n }\n }\n }\n\n return null;\n },\n\n // if it's a mouse interaction\n mouse: function ({ pointerId, mouseEvent, eventType }) {\n if (!mouseEvent && (browser.supportsTouch || browser.supportsPointerEvent)) {\n return null;\n }\n\n let firstNonActive;\n\n for (const interaction of scope.interactions) {\n if (interaction.mouse) {\n // if it's a down event, skip interactions with running simulations\n if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; }\n\n // if the interaction is active, return it immediately\n if (interaction.interacting()) {\n return interaction;\n }\n // otherwise save it and look for another active interaction\n else if (!firstNonActive) {\n firstNonActive = interaction;\n }\n }\n }\n\n // if no active mouse interaction was found use the first inactive mouse\n // interaction\n if (firstNonActive) {\n return firstNonActive;\n }\n\n // Find any interaction specifically for mouse.\n // ignore the interaction if the eventType is a mousedown, and a simulation\n // is active\n for (const interaction of scope.interactions) {\n if (interaction.mouse && !(/down/.test(eventType) && interaction.simulation)) {\n return interaction;\n }\n }\n\n return null;\n },\n\n // get interaction that has this pointer\n hasPointer: function ({ pointerId }) {\n for (const interaction of scope.interactions) {\n if (utils.contains(interaction.pointerIds, pointerId)) {\n return interaction;\n }\n }\n },\n\n // get first idle interaction\n idle: function ({ mouseEvent }) {\n for (const interaction of scope.interactions) {\n // if there's already a pointer held down\n if (interaction.pointerIds.length === 1) {\n const target = interaction.target;\n // don't add this pointer if there is a target interactable and it\n // isn't gesturable\n if (target && !target.options.gesture.enabled) {\n continue;\n }\n }\n // maximum of 2 pointers per interaction\n else if (interaction.pointerIds.length >= 2) {\n continue;\n }\n\n if (!interaction.interacting() && (mouseEvent === interaction.mouse)) {\n return interaction;\n }\n }\n\n return null;\n },\n};\n\nmodule.exports = finder;\n","const win = require('./window');\nconst isWindow = require('./isWindow');\n\nconst is = {\n array : () => {},\n\n window : thing => thing === win.window || isWindow(thing),\n\n docFrag : thing => is.object(thing) && thing.nodeType === 11,\n\n object : thing => !!thing && (typeof thing === 'object'),\n\n function: thing => typeof thing === 'function',\n\n number : thing => typeof thing === 'number' ,\n\n bool : thing => typeof thing === 'boolean' ,\n\n string : thing => typeof thing === 'string' ,\n\n element: thing => {\n if (!thing || (typeof thing !== 'object')) { return false; }\n\n const _window = win.getWindow(thing) || win.window;\n\n return (/object|function/.test(typeof _window.Element)\n ? thing instanceof _window.Element //DOM2\n : thing.nodeType === 1 && typeof thing.nodeName === 'string');\n },\n};\n\nis.array = thing => (is.object(thing)\n && (typeof thing.length !== 'undefined')\n && is.function(thing.splice));\n\nmodule.exports = is;\n","module.exports = (thing) => !!(thing && thing.Window) && (thing instanceof thing.Window);\n","function pointerExtend (dest, source) {\n for (const prop in source) {\n const prefixedPropREs = module.exports.prefixedPropREs;\n let deprecated = false;\n\n // skip deprecated prefixed properties\n for (const vendor in prefixedPropREs) {\n if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) {\n deprecated = true;\n break;\n }\n }\n\n if (!deprecated && typeof source[prop] !== 'function') {\n dest[prop] = source[prop];\n }\n }\n return dest;\n}\n\npointerExtend.prefixedPropREs = {\n webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/,\n};\n\nmodule.exports = pointerExtend;\n","const hypot = require('./hypot');\nconst browser = require('./browser');\nconst dom = require('./domObjects');\nconst domUtils = require('./domUtils');\nconst is = require('./is');\nconst pointerExtend = require('./pointerExtend');\n\nconst pointerUtils = {\n copyCoords: function (dest, src) {\n dest.page = dest.page || {};\n dest.page.x = src.page.x;\n dest.page.y = src.page.y;\n\n dest.client = dest.client || {};\n dest.client.x = src.client.x;\n dest.client.y = src.client.y;\n\n dest.timeStamp = src.timeStamp;\n },\n\n setCoordDeltas: function (targetObj, prev, cur) {\n targetObj.page.x = cur.page.x - prev.page.x;\n targetObj.page.y = cur.page.y - prev.page.y;\n targetObj.client.x = cur.client.x - prev.client.x;\n targetObj.client.y = cur.client.y - prev.client.y;\n targetObj.timeStamp = cur.timeStamp - prev.timeStamp;\n\n // set pointer velocity\n const dt = Math.max(targetObj.timeStamp / 1000, 0.001);\n\n targetObj.page.speed = hypot(targetObj.page.x, targetObj.page.y) / dt;\n targetObj.page.vx = targetObj.page.x / dt;\n targetObj.page.vy = targetObj.page.y / dt;\n\n targetObj.client.speed = hypot(targetObj.client.x, targetObj.page.y) / dt;\n targetObj.client.vx = targetObj.client.x / dt;\n targetObj.client.vy = targetObj.client.y / dt;\n },\n\n isNativePointer: function (pointer) {\n return (pointer instanceof dom.Event || pointer instanceof dom.Touch);\n },\n\n // Get specified X/Y coords for mouse or event.touches[0]\n getXY: function (type, pointer, xy) {\n xy = xy || {};\n type = type || 'page';\n\n xy.x = pointer[type + 'X'];\n xy.y = pointer[type + 'Y'];\n\n return xy;\n },\n\n getPageXY: function (pointer, page) {\n page = page || {};\n\n // Opera Mobile handles the viewport and scrolling oddly\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n pointerUtils.getXY('screen', pointer, page);\n\n page.x += window.scrollX;\n page.y += window.scrollY;\n }\n else {\n pointerUtils.getXY('page', pointer, page);\n }\n\n return page;\n },\n\n getClientXY: function (pointer, client) {\n client = client || {};\n\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n // Opera Mobile handles the viewport and scrolling oddly\n pointerUtils.getXY('screen', pointer, client);\n }\n else {\n pointerUtils.getXY('client', pointer, client);\n }\n\n return client;\n },\n\n getPointerId: function (pointer) {\n return is.number(pointer.pointerId)? pointer.pointerId : pointer.identifier;\n },\n\n setCoords: function (targetObj, pointers, timeStamp) {\n const pointer = (pointers.length > 1\n ? pointerUtils.pointerAverage(pointers)\n : pointers[0]);\n\n const tmpXY = {};\n\n pointerUtils.getPageXY(pointer, tmpXY);\n targetObj.page.x = tmpXY.x;\n targetObj.page.y = tmpXY.y;\n\n pointerUtils.getClientXY(pointer, tmpXY);\n targetObj.client.x = tmpXY.x;\n targetObj.client.y = tmpXY.y;\n\n targetObj.timeStamp = is.number(timeStamp) ? timeStamp :new Date().getTime();\n },\n\n pointerExtend: pointerExtend,\n\n getTouchPair: function (event) {\n const touches = [];\n\n // array of touches is supplied\n if (is.array(event)) {\n touches[0] = event[0];\n touches[1] = event[1];\n }\n // an event\n else {\n if (event.type === 'touchend') {\n if (event.touches.length === 1) {\n touches[0] = event.touches[0];\n touches[1] = event.changedTouches[0];\n }\n else if (event.touches.length === 0) {\n touches[0] = event.changedTouches[0];\n touches[1] = event.changedTouches[1];\n }\n }\n else {\n touches[0] = event.touches[0];\n touches[1] = event.touches[1];\n }\n }\n\n return touches;\n },\n\n pointerAverage: function (pointers) {\n const average = {\n pageX : 0,\n pageY : 0,\n clientX: 0,\n clientY: 0,\n screenX: 0,\n screenY: 0,\n };\n\n for (const pointer of pointers) {\n for (const prop in average) {\n average[prop] += pointer[prop];\n }\n }\n for (const prop in average) {\n average[prop] /= pointers.length;\n }\n\n return average;\n },\n\n touchBBox: function (event) {\n if (!event.length && !(event.touches && event.touches.length > 1)) {\n return;\n }\n\n const touches = pointerUtils.getTouchPair(event);\n const minX = Math.min(touches[0].pageX, touches[1].pageX);\n const minY = Math.min(touches[0].pageY, touches[1].pageY);\n const maxX = Math.max(touches[0].pageX, touches[1].pageX);\n const maxY = Math.max(touches[0].pageY, touches[1].pageY);\n\n return {\n x: minX,\n y: minY,\n left: minX,\n top: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n },\n\n touchDistance: function (event, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n\n\n const dx = touches[0][sourceX] - touches[1][sourceX];\n const dy = touches[0][sourceY] - touches[1][sourceY];\n\n return hypot(dx, dy);\n },\n\n touchAngle: function (event, prevAngle, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n const dx = touches[1][sourceX] - touches[0][sourceX];\n const dy = touches[1][sourceY] - touches[0][sourceY];\n const angle = 180 * Math.atan2(dy , dx) / Math.PI;\n\n return angle;\n },\n\n getPointerType: function (pointer, interaction) {\n // if the PointerEvent API isn't available, then the pointer must be ither\n // a MouseEvent or TouchEvent\n if (interaction.mouse) { return 'mouse'; }\n if (!browser.supportsPointerEvent) { return 'touch'; }\n\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : [undefined, undefined,'touch', 'pen', 'mouse'][pointer.pointerType];\n },\n\n // [ event.target, event.currentTarget ]\n getEventTargets: function (event) {\n return [\n domUtils.getActualElement(event.path ? event.path[0] : event.target),\n domUtils.getActualElement(event.currentTarget),\n ];\n },\n};\n\nmodule.exports = pointerUtils;\n","const { window } = require('./window');\n\nconst vendors = ['ms', 'moz', 'webkit', 'o'];\nlet lastTime = 0;\nlet request;\nlet cancel;\n\nfor (let x = 0; x < vendors.length && !window.requestAnimationFrame; x++) {\n request = window[vendors[x] + 'RequestAnimationFrame'];\n cancel = window[vendors[x] +'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n}\n\nif (!request) {\n request = function (callback) {\n const currTime = new Date().getTime();\n const timeToCall = Math.max(0, 16 - (currTime - lastTime));\n const id = setTimeout(function () { callback(currTime + timeToCall); },\n timeToCall);\n\n lastTime = currTime + timeToCall;\n return id;\n };\n}\n\nif (!cancel) {\n cancel = function (id) {\n clearTimeout(id);\n };\n}\n\nmodule.exports = {\n request,\n cancel,\n};\n","const extend = require('./extend');\nconst is = require('./is');\nconst {\n closest,\n parentNode,\n getElementRect,\n} = require('./domUtils');\n\nconst rectUtils = {\n getStringOptionResult: function (value, interactable, element) {\n if (!is.string(value)) {\n return null;\n }\n\n if (value === 'parent') {\n value = parentNode(element);\n }\n else if (value === 'self') {\n value = interactable.getRect(element);\n }\n else {\n value = closest(element, value);\n }\n\n return value;\n },\n\n resolveRectLike: function (value, interactable, element, functionArgs) {\n value = rectUtils.getStringOptionResult(value, interactable, element) || value;\n\n if (is.function(value)) {\n value = value.apply(null, functionArgs);\n }\n\n if (is.element(value)) {\n value = getElementRect(value);\n }\n\n return value;\n },\n\n rectToXY: function (rect) {\n return rect && {\n x: 'x' in rect ? rect.x : rect.left,\n y: 'y' in rect ? rect.y : rect.top,\n };\n },\n\n xywhToTlbr: function (rect) {\n if (rect && !('left' in rect && 'top' in rect)) {\n rect = extend({}, rect);\n\n rect.left = rect.x || 0;\n rect.top = rect.y || 0;\n rect.right = rect.right || (rect.left + rect.width);\n rect.bottom = rect.bottom || (rect.top + rect.height);\n }\n\n return rect;\n },\n\n tlbrToXywh: function (rect) {\n if (rect && !('x' in rect && 'y' in rect)) {\n rect = extend({}, rect);\n\n rect.x = rect.left || 0;\n rect.top = rect.top || 0;\n rect.width = rect.width || (rect.right - rect.x);\n rect.height = rect.height || (rect.bottom - rect.y);\n }\n\n return rect;\n },\n};\n\nmodule.exports = rectUtils;\n","const win = module.exports;\nconst isWindow = require('./isWindow');\n\nfunction init (window) {\n // get wrapped window if using Shadow DOM polyfill\n\n win.realWindow = window;\n\n // create a TextNode\n const el = window.document.createTextNode('');\n\n // check if it's wrapped by a polyfill\n if (el.ownerDocument !== window.document\n && typeof window.wrap === 'function'\n && window.wrap(el) === el) {\n // use wrapped window\n window = window.wrap(window);\n }\n\n win.window = window;\n}\n\nif (typeof window === 'undefined') {\n win.window = undefined;\n win.realWindow = undefined;\n}\nelse {\n init(window);\n}\n\nwin.getWindow = function getWindow (node) {\n if (isWindow(node)) {\n return node;\n }\n\n const rootNode = (node.ownerDocument || node);\n\n return rootNode.defaultView || rootNode.parentWindow || win.window;\n};\n\nwin.init = init;\n"]} \ No newline at end of file +{"version":3,"sources":["src/header.js","node_modules/browser-pack/_prelude.js","index.js","src/Eventable.js","src/InteractEvent.js","src/Interactable.js","src/Interaction.js","src/actions/base.js","src/actions/drag.js","src/actions/drop.js","src/actions/gesture.js","src/actions/resize.js","src/autoScroll.js","src/autoStart/InteractableMethods.js","src/autoStart/base.js","src/autoStart/delay.js","src/autoStart/drag.js","src/autoStart/gesture.js","src/autoStart/resize.js","src/defaultOptions.js","src/index.js","src/inertia.js","src/interact.js","src/interactablePreventDefault.js","src/legacyBrowsers.js","src/modifiers/index.js","src/modifiers/restrict.js","src/modifiers/restrictEdges.js","src/modifiers/restrictSize.js","src/modifiers/snap.js","src/modifiers/snapSize.js","src/pointerEvents/PointerEvent.js","src/pointerEvents/base.js","src/pointerEvents/holdRepeat.js","src/pointerEvents/interactableTargets.js","src/scope.js","src/utils/Signals.js","src/utils/arr.js","src/utils/browser.js","src/utils/domObjects.js","src/utils/domUtils.js","src/utils/events.js","src/utils/extend.js","src/utils/getOriginXY.js","src/utils/hypot.js","src/utils/index.js","src/utils/interactionFinder.js","src/utils/is.js","src/utils/isWindow.js","src/utils/pointerExtend.js","src/utils/pointerUtils.js","src/utils/raf.js","src/utils/rect.js","src/utils/window.js"],"names":[],"mappings":"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","file":"interact.js","sourceRoot":"","sourcesContent":["/**\n * interact.js v1.3.0-alpha.4+sha.7970416-dirty\n *\n * Copyright (c) 2012-2017 Taye Adeyemi \n * Open source under the MIT License.\n * https://raw.github.com/taye/interact.js/master/LICENSE\n */\n","(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o 150) {\n return null;\n }\n\n let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI;\n const overlap = 22.5;\n\n if (angle < 0) {\n angle += 360;\n }\n\n const left = 135 - overlap <= angle && angle < 225 + overlap;\n const up = 225 - overlap <= angle && angle < 315 + overlap;\n\n const right = !left && (315 - overlap <= angle || angle < 45 + overlap);\n const down = !up && 45 - overlap <= angle && angle < 135 + overlap;\n\n return {\n up,\n down,\n left,\n right,\n angle,\n speed: interaction.prevEvent.speed,\n velocity: {\n x: interaction.prevEvent.velocityX,\n y: interaction.prevEvent.velocityY,\n },\n };\n }\n\n preventDefault () {}\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n}\n\nsignals.on('set-delta', function ({ iEvent, interaction, starting, deltaSource }) {\n const prevEvent = starting? iEvent : interaction.prevEvent;\n\n if (deltaSource === 'client') {\n iEvent.dx = iEvent.clientX - prevEvent.clientX;\n iEvent.dy = iEvent.clientY - prevEvent.clientY;\n }\n else {\n iEvent.dx = iEvent.pageX - prevEvent.pageX;\n iEvent.dy = iEvent.pageY - prevEvent.pageY;\n }\n});\n\nInteractEvent.signals = signals;\n\nmodule.exports = InteractEvent;\n","const is = require('./utils/is');\nconst events = require('./utils/events');\nconst extend = require('./utils/extend');\nconst actions = require('./actions/base');\nconst scope = require('./scope');\nconst Eventable = require('./Eventable');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nconst {\n getElementRect,\n nodeContains,\n trySelector,\n} = require('./utils/domUtils');\nconst { getWindow } = require('./utils/window');\nconst { indexOf, contains } = require('./utils/arr');\nconst { wheelEvent } = require('./utils/browser');\n\n// all set interactables\nscope.interactables = [];\n\n/*\\\n * Interactable\n [ property ]\n **\n * Object type returned by @interact\n\\*/\nclass Interactable {\n constructor (target, options) {\n options = options || {};\n\n this.target = target;\n this.events = new Eventable();\n this._context = options.context || scope.document;\n this._win = getWindow(trySelector(target)? this._context : target);\n this._doc = this._win.document;\n\n signals.fire('new', {\n target,\n options,\n interactable: this,\n win: this._win,\n });\n\n scope.addDocument( this._doc, this._win );\n\n scope.interactables.push(this);\n\n this.set(options);\n }\n\n setOnEvents (action, phases) {\n const onAction = 'on' + action;\n\n if (is.function(phases.onstart) ) { this.events[onAction + 'start' ] = phases.onstart ; }\n if (is.function(phases.onmove) ) { this.events[onAction + 'move' ] = phases.onmove ; }\n if (is.function(phases.onend) ) { this.events[onAction + 'end' ] = phases.onend ; }\n if (is.function(phases.oninertiastart)) { this.events[onAction + 'inertiastart' ] = phases.oninertiastart ; }\n\n return this;\n }\n\n setPerAction (action, options) {\n // for all the default per-action options\n for (const option in options) {\n // if this option exists for this action\n if (option in defaults[action]) {\n // if the option in the options arg is an object value\n if (is.object(options[option])) {\n // duplicate the object\n this.options[action][option] = extend(this.options[action][option] || {}, options[option]);\n\n if (is.object(defaults.perAction[option]) && 'enabled' in defaults.perAction[option]) {\n this.options[action][option].enabled = options[option].enabled === false? false : true;\n }\n }\n else if (is.bool(options[option]) && is.object(defaults.perAction[option])) {\n this.options[action][option].enabled = options[option];\n }\n else if (options[option] !== undefined) {\n // or if it's not undefined, do a plain assignment\n this.options[action][option] = options[option];\n }\n }\n }\n }\n\n /*\\\n * Interactable.getRect\n [ method ]\n *\n * The default function to get an Interactables bounding rect. Can be\n * overridden using @Interactable.rectChecker.\n *\n - element (Element) #optional The element to measure.\n = (object) The object's bounding rectangle.\n o {\n o top : 0,\n o left : 0,\n o bottom: 0,\n o right : 0,\n o width : 0,\n o height: 0\n o }\n \\*/\n getRect (element) {\n element = element || this.target;\n\n if (is.string(this.target) && !(is.element(element))) {\n element = this._context.querySelector(this.target);\n }\n\n return getElementRect(element);\n }\n\n /*\\\n * Interactable.rectChecker\n [ method ]\n *\n * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n - checker (function) #optional A function which returns this Interactable's bounding rectangle. See @Interactable.getRect\n = (function | object) The checker function or this Interactable\n \\*/\n rectChecker (checker) {\n if (is.function(checker)) {\n this.getRect = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.getRect;\n\n return this;\n }\n\n return this.getRect;\n }\n\n _backCompatOption (optionName, newValue) {\n if (trySelector(newValue) || is.object(newValue)) {\n this.options[optionName] = newValue;\n\n for (const action of actions.names) {\n this.options[action][optionName] = newValue;\n }\n\n return this;\n }\n\n return this.options[optionName];\n }\n\n /*\\\n * Interactable.origin\n [ method ]\n *\n * Gets or sets the origin of the Interactable's element. The x and y\n * of the origin will be subtracted from action event coordinates.\n *\n - origin (object | string) #optional An object eg. { x: 0, y: 0 } or string 'parent', 'self' or any CSS selector\n * OR\n - origin (Element) #optional An HTML or SVG Element whose rect will be used\n **\n = (object) The current origin or this Interactable\n \\*/\n origin (newValue) {\n return this._backCompatOption('origin', newValue);\n }\n\n /*\\\n * Interactable.deltaSource\n [ method ]\n *\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n - newValue (string) #optional Use 'client' if you will be scrolling while interacting; Use 'page' if you want autoScroll to work\n = (string | object) The current deltaSource or this Interactable\n \\*/\n deltaSource (newValue) {\n if (newValue === 'page' || newValue === 'client') {\n this.options.deltaSource = newValue;\n\n return this;\n }\n\n return this.options.deltaSource;\n }\n\n /*\\\n * Interactable.context\n [ method ]\n *\n * Gets the selector context Node of the Interactable. The default is `window.document`.\n *\n = (Node) The context Node of this Interactable\n **\n \\*/\n context () {\n return this._context;\n }\n\n inContext (element) {\n return (this._context === element.ownerDocument\n || nodeContains(this._context, element));\n }\n\n /*\\\n * Interactable.fire\n [ method ]\n *\n * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n - iEvent (InteractEvent) The InteractEvent object to be fired on this Interactable\n = (Interactable) this Interactable\n \\*/\n fire (iEvent) {\n this.events.fire(iEvent);\n\n return this;\n }\n\n _onOffMultiple (method, eventType, listener, options) {\n if (is.string(eventType) && eventType.search(' ') !== -1) {\n eventType = eventType.trim().split(/ +/);\n }\n\n if (is.array(eventType)) {\n for (let i = 0; i < eventType.length; i++) {\n this[method](eventType[i], listener, options);\n }\n\n return true;\n }\n\n if (is.object(eventType)) {\n for (const prop in eventType) {\n this[method](prop, eventType[prop], listener);\n }\n\n return true;\n }\n }\n\n /*\\\n * Interactable.on\n [ method ]\n *\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n - eventType (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) This Interactable\n \\*/\n on (eventType, listener, options) {\n if (this._onOffMultiple('on', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.on(eventType, listener);\n }\n // delegated event for selector\n else if (is.string(this.target)) {\n events.addDelegate(this.target, this._context, eventType, listener, options);\n }\n else {\n events.add(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.off\n [ method ]\n *\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n - eventType (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) This Interactable\n \\*/\n off (eventType, listener, options) {\n if (this._onOffMultiple('off', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n // if it is an action event type\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.off(eventType, listener);\n }\n // delegated event\n else if (is.string(this.target)) {\n events.removeDelegate(this.target, this._context, eventType, listener, options);\n }\n // remove listener from this Interatable's element\n else {\n events.remove(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.set\n [ method ]\n *\n * Reset the options of this Interactable\n - options (object) The new settings to apply\n = (object) This Interactable\n \\*/\n set (options) {\n if (!is.object(options)) {\n options = {};\n }\n\n this.options = extend({}, defaults.base);\n\n const perActions = extend({}, defaults.perAction);\n\n for (const actionName in actions.methodDict) {\n const methodName = actions.methodDict[actionName];\n\n this.options[actionName] = extend({}, defaults[actionName]);\n\n this.setPerAction(actionName, perActions);\n\n this[methodName](options[actionName]);\n }\n\n for (const setting of Interactable.settingsMethods) {\n this.options[setting] = defaults.base[setting];\n\n if (setting in options) {\n this[setting](options[setting]);\n }\n }\n\n signals.fire('set', {\n options,\n interactable: this,\n });\n\n return this;\n }\n\n /*\\\n * Interactable.unset\n [ method ]\n *\n * Remove this interactable from the list of interactables and remove\n * it's action capabilities and event listeners\n *\n = (object) @interact\n \\*/\n unset () {\n events.remove(this.target, 'all');\n\n if (is.string(this.target)) {\n // remove delegated events\n for (const type in events.delegatedEvents) {\n const delegated = events.delegatedEvents[type];\n\n if (delegated.selectors[0] === this.target\n && delegated.contexts[0] === this._context) {\n\n delegated.selectors.splice(0, 1);\n delegated.contexts .splice(0, 1);\n delegated.listeners.splice(0, 1);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegated[type] = null;\n }\n }\n\n events.remove(this._context, type, events.delegateListener);\n events.remove(this._context, type, events.delegateUseCapture, true);\n }\n }\n else {\n events.remove(this, 'all');\n }\n\n signals.fire('unset', { interactable: this });\n\n scope.interactables.splice(indexOf(scope.interactables, this), 1);\n\n // Stop related interactions when an Interactable is unset\n for (const interaction of scope.interactions || []) {\n if (interaction.target === this && interaction.interacting()) {\n interaction.stop();\n }\n }\n\n return scope.interact;\n }\n}\n\nscope.interactables.indexOfElement = function indexOfElement (target, context) {\n context = context || scope.document;\n\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n if (interactable.target === target && interactable._context === context) {\n return i;\n }\n }\n return -1;\n};\n\nscope.interactables.get = function interactableGet (element, options, dontCheckInContext) {\n const ret = this[this.indexOfElement(element, options && options.context)];\n\n return ret && (is.string(element) || dontCheckInContext || ret.inContext(element))? ret : null;\n};\n\nscope.interactables.forEachSelector = function (callback, element) {\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n // skip non CSS selector targets and out of context elements\n if (!is.string(interactable.target)\n || (element && !interactable.inContext(element))) {\n continue;\n }\n\n const ret = callback(interactable, interactable.target, interactable._context, i, this);\n\n if (ret !== undefined) {\n return ret;\n }\n }\n};\n\n// all interact.js eventTypes\nInteractable.eventTypes = scope.eventTypes = [];\n\nInteractable.signals = signals;\n\nInteractable.settingsMethods = [ 'deltaSource', 'origin', 'preventDefault', 'rectChecker' ];\n\nmodule.exports = Interactable;\n","const scope = require('./scope');\nconst utils = require('./utils');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst domObjects = require('./utils/domObjects');\nconst finder = require('./utils/interactionFinder');\nconst signals = require('./utils/Signals').new();\n\nconst listeners = {};\nconst methodNames = [\n 'pointerDown', 'pointerMove', 'pointerUp',\n 'updatePointer', 'removePointer',\n];\n\n// for ignoring browser's simulated mouse events\nlet prevTouchTime = 0;\n\n// all active and idle interactions\nscope.interactions = [];\n\nclass Interaction {\n constructor ({ pointerType }) {\n this.target = null; // current interactable being interacted with\n this.element = null; // the target element of the interactable\n\n this.prepared = { // action that's ready to be fired on next move event\n name : null,\n axis : null,\n edges: null,\n };\n\n // keep track of added pointers\n this.pointers = [];\n this.pointerIds = [];\n this.downTargets = [];\n this.downTimes = [];\n\n // Previous native pointer move event coordinates\n this.prevCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n // current native pointer move event coordinates\n this.curCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Starting InteractEvent pointer coordinates\n this.startCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Change in coordinates and time of the pointer\n this.pointerDelta = {\n page : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n client : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n timeStamp: 0,\n };\n\n this.downEvent = null; // pointerdown/mousedown/touchstart event\n this.downPointer = {};\n\n this._eventTarget = null;\n this._curEventTarget = null;\n\n this.prevEvent = null; // previous action event\n\n this.pointerIsDown = false;\n this.pointerWasMoved = false;\n this._interacting = false;\n\n this.pointerType = pointerType;\n\n signals.fire('new', this);\n\n scope.interactions.push(this);\n }\n\n pointerDown (pointer, event, eventTarget) {\n const pointerIndex = this.updatePointer(pointer, event, true);\n\n signals.fire('down', {\n pointer,\n event,\n eventTarget,\n pointerIndex,\n interaction: this,\n });\n }\n\n /*\\\n * Interaction.start\n [ method ]\n *\n * Start an action with the given Interactable and Element as tartgets. The\n * action must be enabled for the target Interactable and an appropriate number\n * of pointers must be held down - 1 for drag/resize, 2 for gesture.\n *\n * Use it with `interactable.able({ manualStart: false })` to always\n * [start actions manually](https://github.com/taye/interact.js/issues/114)\n *\n - action (object) The action to be performed - drag, resize, etc.\n - target (Interactable) The Interactable to target\n - element (Element) The DOM Element to target\n = (object) interact\n **\n | interact(target)\n | .draggable({\n | // disable the default drag start by down->move\n | manualStart: true\n | })\n | // start dragging after the user holds the pointer down\n | .on('hold', function (event) {\n | var interaction = event.interaction;\n |\n | if (!interaction.interacting()) {\n | interaction.start({ name: 'drag' },\n | event.interactable,\n | event.currentTarget);\n | }\n | });\n \\*/\n start (action, target, element) {\n if (this.interacting()\n || !this.pointerIsDown\n || this.pointerIds.length < (action.name === 'gesture'? 2 : 1)) {\n return;\n }\n\n // if this interaction had been removed after stopping\n // add it back\n if (utils.indexOf(scope.interactions, this) === -1) {\n scope.interactions.push(this);\n }\n\n utils.copyAction(this.prepared, action);\n this.target = target;\n this.element = element;\n\n signals.fire('action-start', {\n interaction: this,\n event: this.downEvent,\n });\n }\n\n pointerMove (pointer, event, eventTarget) {\n if (!this.simulation) {\n this.updatePointer(pointer);\n utils.setCoords(this.curCoords, this.pointers);\n }\n\n const duplicateMove = (this.curCoords.page.x === this.prevCoords.page.x\n && this.curCoords.page.y === this.prevCoords.page.y\n && this.curCoords.client.x === this.prevCoords.client.x\n && this.curCoords.client.y === this.prevCoords.client.y);\n\n let dx;\n let dy;\n\n // register movement greater than pointerMoveTolerance\n if (this.pointerIsDown && !this.pointerWasMoved) {\n dx = this.curCoords.client.x - this.startCoords.client.x;\n dy = this.curCoords.client.y - this.startCoords.client.y;\n\n this.pointerWasMoved = utils.hypot(dx, dy) > Interaction.pointerMoveTolerance;\n }\n\n const signalArg = {\n pointer,\n pointerIndex: this.getPointerIndex(pointer),\n event,\n eventTarget,\n dx,\n dy,\n duplicate: duplicateMove,\n interaction: this,\n interactingBeforeMove: this.interacting(),\n };\n\n if (!duplicateMove) {\n // set pointer coordinate, time changes and speeds\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n }\n\n signals.fire('move', signalArg);\n\n if (!duplicateMove) {\n // if interacting, fire an 'action-move' signal etc\n if (this.interacting()) {\n this.doMove(signalArg);\n }\n\n if (this.pointerWasMoved) {\n utils.copyCoords(this.prevCoords, this.curCoords);\n }\n }\n }\n\n /*\\\n * Interaction.doMove\n [ method ]\n *\n * Force a move of the current action at the same coordinates. Useful if\n * snap/restrict has been changed and you want a movement with the new\n * settings.\n *\n **\n | interact(target)\n | .draggable(true)\n | .on('dragmove', function (event) {\n | if (someCondition) {\n | // change the snap settings\n | event.interactable.draggable({ snap: { targets: [] }});\n | // fire another move event with re-calculated snap\n | event.interaction.doMove();\n | }\n | });\n \\*/\n doMove (signalArg) {\n signalArg = utils.extend({\n pointer: this.pointers[0],\n event: this.prevEvent,\n eventTarget: this._eventTarget,\n interaction: this,\n }, signalArg || {});\n\n signals.fire('before-action-move', signalArg);\n\n if (!this._dontFireMove) {\n signals.fire('action-move', signalArg);\n }\n\n this._dontFireMove = false;\n }\n\n // End interact move events and stop auto-scroll unless simulation is running\n pointerUp (pointer, event, eventTarget, curEventTarget) {\n const pointerIndex = this.getPointerIndex(pointer);\n\n signals.fire(/cancel$/i.test(event.type)? 'cancel' : 'up', {\n pointer,\n pointerIndex,\n event,\n eventTarget,\n curEventTarget,\n interaction: this,\n });\n\n if (!this.simulation) {\n this.end(event);\n }\n\n this.pointerIsDown = false;\n this.removePointer(pointer, event);\n }\n\n /*\\\n * Interaction.end\n [ method ]\n *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n - event (PointerEvent) #optional\n **\n | interact(target)\n | .draggable(true)\n | .on('move', function (event) {\n | if (event.pageX > 1000) {\n | // end the current action\n | event.interaction.end();\n | // stop all further listeners from being called\n | event.stopImmediatePropagation();\n | }\n | });\n \\*/\n end (event) {\n event = event || this.prevEvent;\n\n if (this.interacting()) {\n signals.fire('action-end', {\n event,\n interaction: this,\n });\n }\n\n this.stop();\n }\n\n currentAction () {\n return this._interacting? this.prepared.name: null;\n }\n\n interacting () {\n return this._interacting;\n }\n\n stop () {\n signals.fire('stop', { interaction: this });\n\n if (this._interacting) {\n signals.fire('stop-active', { interaction: this });\n signals.fire('stop-' + this.prepared.name, { interaction: this });\n }\n\n this.target = this.element = null;\n\n this._interacting = false;\n this.prepared.name = this.prevEvent = null;\n }\n\n getPointerIndex (pointer) {\n // mouse and pen interactions may have only one pointer\n if (this.pointerType === 'mouse' || this.pointerType === 'pen') {\n return 0;\n }\n\n return utils.indexOf(this.pointerIds, utils.getPointerId(pointer));\n }\n\n updatePointer (pointer, event, down = event && /(down|start)$/i.test(event.type)) {\n const id = utils.getPointerId(pointer);\n let index = this.getPointerIndex(pointer);\n\n if (index === -1) {\n index = this.pointerIds.length;\n this.pointerIds[index] = id;\n }\n\n if (down) {\n signals.fire('update-pointer-down', {\n pointer,\n event,\n down,\n pointerId: id,\n pointerIndex: index,\n interaction: this,\n });\n }\n\n this.pointers[index] = pointer;\n\n return index;\n }\n\n removePointer (pointer, event) {\n const index = this.getPointerIndex(pointer);\n\n if (index === -1) { return; }\n\n signals.fire('remove-pointer', {\n pointer,\n event,\n pointerIndex: index,\n interaction: this,\n });\n\n this.pointers .splice(index, 1);\n this.pointerIds .splice(index, 1);\n this.downTargets.splice(index, 1);\n this.downTimes .splice(index, 1);\n }\n\n _updateEventTargets (target, currentTarget) {\n this._eventTarget = target;\n this._curEventTarget = currentTarget;\n }\n}\n\nfor (let i = 0, len = methodNames.length; i < len; i++) {\n const method = methodNames[i];\n\n listeners[method] = doOnInteractions(method);\n}\n\nfunction doOnInteractions (method) {\n return (function (event) {\n const pointerType = utils.getPointerType(event);\n const [eventTarget, curEventTarget] = utils.getEventTargets(event);\n const matches = []; // [ [pointer, interaction], ...]\n\n if (browser.supportsTouch && /touch/.test(event.type)) {\n prevTouchTime = new Date().getTime();\n\n for (let i = 0; i < event.changedTouches.length; i++) {\n const pointer = event.changedTouches[i];\n const interaction = finder.search(pointer, event.type, eventTarget);\n\n matches.push([pointer, interaction || new Interaction({ pointerType })]);\n }\n }\n else {\n let invalidPointer = false;\n\n if (!browser.supportsPointerEvent && /mouse/.test(event.type)) {\n // ignore mouse events while touch interactions are active\n for (let i = 0; i < scope.interactions.length && !invalidPointer; i++) {\n invalidPointer = scope.interactions[i].pointerType !== 'mouse' && scope.interactions[i].pointerIsDown;\n }\n\n // try to ignore mouse events that are simulated by the browser\n // after a touch event\n invalidPointer = invalidPointer\n || (new Date().getTime() - prevTouchTime < 500)\n // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated\n || event.timeStamp === 0;\n }\n\n if (!invalidPointer) {\n let interaction = finder.search(event, event.type, eventTarget);\n\n if (!interaction) {\n interaction = new Interaction({ pointerType });\n }\n\n matches.push([event, interaction]);\n }\n }\n\n for (const [pointer, interaction] of matches) {\n interaction._updateEventTargets(eventTarget, curEventTarget);\n interaction[method](pointer, event, eventTarget, curEventTarget);\n }\n });\n}\n\nfunction endAll (event) {\n for (let i = 0; i < scope.interactions.length; i++) {\n const interaction = scope.interactions[i];\n\n interaction.end(event);\n signals.fire('endall', { event, interaction });\n }\n}\n\nconst docEvents = { /* 'eventType': listenerFunc */ };\nconst pEventTypes = browser.pEventTypes;\n\nif (domObjects.PointerEvent) {\n docEvents[pEventTypes.down ] = listeners.pointerDown;\n docEvents[pEventTypes.move ] = listeners.pointerMove;\n docEvents[pEventTypes.up ] = listeners.pointerUp;\n docEvents[pEventTypes.cancel] = listeners.pointerUp;\n}\nelse {\n docEvents.mousedown = listeners.pointerDown;\n docEvents.mousemove = listeners.pointerMove;\n docEvents.mouseup = listeners.pointerUp;\n\n docEvents.touchstart = listeners.pointerDown;\n docEvents.touchmove = listeners.pointerMove;\n docEvents.touchend = listeners.pointerUp;\n docEvents.touchcancel = listeners.pointerUp;\n}\n\ndocEvents.blur = endAll;\n\nfunction onDocSignal ({ doc }, signalName) {\n const eventMethod = signalName.indexOf('add') === 0\n ? events.add : events.remove;\n\n // delegate event listener\n for (const eventType in scope.delegatedEvents) {\n eventMethod(doc, eventType, events.delegateListener);\n eventMethod(doc, eventType, events.delegateUseCapture, true);\n }\n\n for (const eventType in docEvents) {\n eventMethod(doc, eventType, docEvents[eventType]);\n }\n}\n\nsignals.on('update-pointer-down', ({ interaction, pointer, pointerId, pointerIndex, event, eventTarget, down }) => {\n interaction.pointerIds[pointerIndex] = pointerId;\n interaction.pointers[pointerIndex] = pointer;\n\n if (down) {\n interaction.pointerIsDown = true;\n }\n\n if (!interaction.interacting()) {\n utils.setCoords(interaction.startCoords, interaction.pointers);\n\n utils.copyCoords(interaction.curCoords , interaction.startCoords);\n utils.copyCoords(interaction.prevCoords, interaction.startCoords);\n\n interaction.downEvent = event;\n interaction.downTimes[pointerIndex] = interaction.curCoords.timeStamp;\n interaction.downTargets[pointerIndex] = eventTarget || event && utils.getEventTargets(event)[0];\n interaction.pointerWasMoved = false;\n\n utils.pointerExtend(interaction.downPointer, pointer);\n }\n});\n\nscope.signals.on('add-document' , onDocSignal);\nscope.signals.on('remove-document', onDocSignal);\n\nInteraction.pointerMoveTolerance = 1;\nInteraction.doOnInteractions = doOnInteractions;\nInteraction.endAll = endAll;\nInteraction.signals = signals;\nInteraction.docEvents = docEvents;\n\nscope.endAllInteractions = endAll;\n\nmodule.exports = Interaction;\n","const Interaction = require('../Interaction');\nconst InteractEvent = require('../InteractEvent');\n\nconst actions = {\n firePrepared,\n names: [],\n methodDict: {},\n};\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n interaction._interacting = true;\n firePrepared(interaction, event, 'start');\n});\n\nInteraction.signals.on('action-move', function ({ interaction, event, preEnd }) {\n firePrepared(interaction, event, 'move', preEnd);\n\n // if the action was ended in a listener\n if (!interaction.interacting()) { return false; }\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n firePrepared(interaction, event, 'end');\n});\n\nfunction firePrepared (interaction, event, phase, preEnd) {\n const actionName = interaction.prepared.name;\n\n const newEvent = new InteractEvent(interaction, event, actionName, phase, interaction.element, null, preEnd);\n\n interaction.target.fire(newEvent);\n interaction.prevEvent = newEvent;\n}\n\nmodule.exports = actions;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drag = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n startAxis : 'xy',\n lockAxis : 'xy',\n },\n\n checker: function (pointer, event, interactable) {\n const dragOptions = interactable.options.drag;\n\n return dragOptions.enabled\n ? { name: 'drag', axis: (dragOptions.lockAxis === 'start'\n ? dragOptions.startAxis\n : dragOptions.lockAxis)}\n : null;\n },\n\n getCursor: function () {\n return 'move';\n },\n};\n\nInteraction.signals.on('before-action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n interaction.curCoords.page.y = interaction.startCoords.page.y;\n interaction.curCoords.client.y = interaction.startCoords.client.y;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vx);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vx);\n interaction.pointerDelta.client.vy = 0;\n interaction.pointerDelta.page.vy = 0;\n }\n else if (axis === 'y') {\n interaction.curCoords.page.x = interaction.startCoords.page.x;\n interaction.curCoords.client.x = interaction.startCoords.client.x;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vy);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vy);\n interaction.pointerDelta.client.vx = 0;\n interaction.pointerDelta.page.vx = 0;\n }\n});\n\n// dragmove\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'dragmove') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n iEvent.pageY = interaction.startCoords.page.y;\n iEvent.clientY = interaction.startCoords.client.y;\n iEvent.dy = 0;\n }\n else if (axis === 'y') {\n iEvent.pageX = interaction.startCoords.page.x;\n iEvent.clientX = interaction.startCoords.client.x;\n iEvent.dx = 0;\n }\n});\n\n/*\\\n * Interactable.draggable\n [ method ]\n *\n * Gets or sets whether drag actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of drag events\n | var isDraggable = interact('ul li').draggable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on drag events (object makes the Interactable draggable)\n = (object) This Interactable\n | interact(element).draggable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // the axis in which the first movement must be\n | // for the drag sequence to start\n | // 'xy' by default - any direction\n | startAxis: 'x' || 'y' || 'xy',\n |\n | // 'xy' by default - don't restrict to one axis (move in any direction)\n | // 'x' or 'y' to restrict movement to either axis\n | // 'start' to restrict movement to the axis the drag started in\n | lockAxis: 'x' || 'y' || 'xy' || 'start',\n |\n | // max number of drags that can happen concurrently\n | // with elements of this Interactable. Infinity by default\n | max: Infinity,\n |\n | // max number of drags that can target the same element+Interactable\n | // 1 by default\n | maxPerElement: 2\n | });\n\\*/\nInteractable.prototype.draggable = function (options) {\n if (utils.is.object(options)) {\n this.options.drag.enabled = options.enabled === false? false: true;\n this.setPerAction('drag', options);\n this.setOnEvents('drag', options);\n\n if (/^(xy|x|y|start)$/.test(options.lockAxis)) {\n this.options.drag.lockAxis = options.lockAxis;\n }\n if (/^(xy|x|y)$/.test(options.startAxis)) {\n this.options.drag.startAxis = options.startAxis;\n }\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drag.enabled = options;\n\n if (!options) {\n this.ondragstart = this.ondragstart = this.ondragend = null;\n }\n\n return this;\n }\n\n return this.options.drag;\n};\n\nactions.drag = drag;\nactions.names.push('drag');\nutils.merge(Interactable.eventTypes, [\n 'dragstart',\n 'dragmove',\n 'draginertiastart',\n 'draginertiaresume',\n 'dragend',\n]);\nactions.methodDict.drag = 'draggable';\n\ndefaultOptions.drag = drag.defaults;\n\nmodule.exports = drag;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst scope = require('../scope');\nconst interact = require('../interact');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drop = {\n defaults: {\n enabled: false,\n accept : null,\n overlap: 'pointer',\n },\n};\n\nlet dynamicDrop = false;\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // reset active dropzones\n interaction.activeDrops.dropzones = [];\n interaction.activeDrops.elements = [];\n interaction.activeDrops.rects = [];\n\n interaction.dropEvents = null;\n\n if (!interaction.dynamicDrop) {\n setActiveDrops(interaction, interaction.element);\n }\n\n const dragEvent = interaction.prevEvent;\n const dropEvents = getDropEvents(interaction, event, dragEvent);\n\n if (dropEvents.activate) {\n fireActiveDrops(interaction, dropEvents.activate);\n }\n});\n\nInteractEvent.signals.on('new', function ({ interaction, iEvent, event }) {\n if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { return; }\n\n const draggableElement = interaction.element;\n const dragEvent = iEvent;\n const dropResult = getDrop(dragEvent, event, draggableElement);\n\n interaction.dropTarget = dropResult.dropzone;\n interaction.dropElement = dropResult.element;\n\n interaction.dropEvents = getDropEvents(interaction, event, dragEvent);\n});\n\nInteraction.signals.on('action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n fireDropEvents(interaction, interaction.dropEvents);\n});\n\nInteraction.signals.on('action-end', function ({ interaction }) {\n if (interaction.prepared.name === 'drag') {\n fireDropEvents(interaction, interaction.dropEvents);\n }\n});\n\nInteraction.signals.on('stop-drag', function ({ interaction }) {\n interaction.activeDrops.dropzones =\n interaction.activeDrops.elements =\n interaction.activeDrops.rects =\n interaction.dropEvents = null;\n});\n\nfunction collectDrops (interaction, element) {\n const drops = [];\n const elements = [];\n\n element = element || interaction.element;\n\n // collect all dropzones and their elements which qualify for a drop\n for (const current of scope.interactables) {\n if (!current.options.drop.enabled) { continue; }\n\n const accept = current.options.drop.accept;\n\n // test the draggable element against the dropzone's accept setting\n if ((utils.is.element(accept) && accept !== element)\n || (utils.is.string(accept)\n && !utils.matchesSelector(element, accept))) {\n\n continue;\n }\n\n // query for new elements if necessary\n const dropElements = utils.is.string(current.target)\n ? current._context.querySelectorAll(current.target)\n : [current.target];\n\n for (let i = 0; i < dropElements.length; i++) {\n const currentElement = dropElements[i];\n\n if (currentElement !== element) {\n drops.push(current);\n elements.push(currentElement);\n }\n }\n }\n\n return {\n elements,\n dropzones: drops,\n };\n}\n\nfunction fireActiveDrops (interaction, event) {\n let prevElement;\n\n // loop through all active dropzones and trigger event\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n const current = interaction.activeDrops.dropzones[i];\n const currentElement = interaction.activeDrops.elements [i];\n\n // prevent trigger of duplicate events on same element\n if (currentElement !== prevElement) {\n // set current element as event target\n event.target = currentElement;\n current.fire(event);\n }\n prevElement = currentElement;\n }\n}\n\n// Collect a new set of possible drops and save them in activeDrops.\n// setActiveDrops should always be called when a drag has just started or a\n// drag event happens while dynamicDrop is true\nfunction setActiveDrops (interaction, dragElement) {\n // get dropzones and their elements that could receive the draggable\n const possibleDrops = collectDrops(interaction, dragElement, true);\n\n interaction.activeDrops.dropzones = possibleDrops.dropzones;\n interaction.activeDrops.elements = possibleDrops.elements;\n interaction.activeDrops.rects = [];\n\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n interaction.activeDrops.rects[i] =\n interaction.activeDrops.dropzones[i].getRect(interaction.activeDrops.elements[i]);\n }\n}\n\nfunction getDrop (dragEvent, event, dragElement) {\n const interaction = dragEvent.interaction;\n const validDrops = [];\n\n if (dynamicDrop) {\n setActiveDrops(interaction, dragElement);\n }\n\n // collect all dropzones and their elements which qualify for a drop\n for (let j = 0; j < interaction.activeDrops.dropzones.length; j++) {\n const current = interaction.activeDrops.dropzones[j];\n const currentElement = interaction.activeDrops.elements [j];\n const rect = interaction.activeDrops.rects [j];\n\n validDrops.push(current.dropCheck(dragEvent, event, interaction.target, dragElement, currentElement, rect)\n ? currentElement\n : null);\n }\n\n // get the most appropriate dropzone based on DOM depth and order\n const dropIndex = utils.indexOfDeepestElement(validDrops);\n\n return {\n dropzone: interaction.activeDrops.dropzones[dropIndex] || null,\n element : interaction.activeDrops.elements [dropIndex] || null,\n };\n}\n\nfunction getDropEvents (interaction, pointerEvent, dragEvent) {\n const dropEvents = {\n enter : null,\n leave : null,\n activate : null,\n deactivate: null,\n move : null,\n drop : null,\n };\n\n const tmpl = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n };\n\n if (interaction.dropElement !== interaction.prevDropElement) {\n // if there was a prevDropTarget, create a dragleave event\n if (interaction.prevDropTarget) {\n dropEvents.leave = utils.extend({ type: 'dragleave' }, tmpl);\n\n dragEvent.dragLeave = dropEvents.leave.target = interaction.prevDropElement;\n dragEvent.prevDropzone = dropEvents.leave.dropzone = interaction.prevDropTarget;\n }\n // if the dropTarget is not null, create a dragenter event\n if (interaction.dropTarget) {\n dropEvents.enter = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n type : 'dragenter',\n };\n\n dragEvent.dragEnter = interaction.dropElement;\n dragEvent.dropzone = interaction.dropTarget;\n }\n }\n\n if (dragEvent.type === 'dragend' && interaction.dropTarget) {\n dropEvents.drop = utils.extend({ type: 'drop' }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n dragEvent.relatedTarget = interaction.dropElement;\n }\n if (dragEvent.type === 'dragstart') {\n dropEvents.activate = utils.extend({ type: 'dropactivate' }, tmpl);\n\n dropEvents.activate.target = null;\n dropEvents.activate.dropzone = null;\n }\n if (dragEvent.type === 'dragend') {\n dropEvents.deactivate = utils.extend({ type: 'dropdeactivate' }, tmpl);\n\n dropEvents.deactivate.target = null;\n dropEvents.deactivate.dropzone = null;\n }\n if (dragEvent.type === 'dragmove' && interaction.dropTarget) {\n dropEvents.move = utils.extend({\n dragmove : dragEvent,\n type : 'dropmove',\n }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n }\n\n return dropEvents;\n}\n\nfunction fireDropEvents (interaction, dropEvents) {\n if (dropEvents.leave) { interaction.prevDropTarget.fire(dropEvents.leave); }\n if (dropEvents.move ) { interaction.dropTarget.fire(dropEvents.move ); }\n if (dropEvents.enter) { interaction.dropTarget.fire(dropEvents.enter); }\n if (dropEvents.drop ) { interaction.dropTarget.fire(dropEvents.drop ); }\n if (dropEvents.deactivate) {\n fireActiveDrops(interaction, dropEvents.deactivate);\n }\n\n interaction.prevDropTarget = interaction.dropTarget;\n interaction.prevDropElement = interaction.dropElement;\n}\n\n/*\\\n * Interactable.dropzone\n [ method ]\n *\n * Returns or sets whether elements can be dropped onto this\n * Interactable to trigger drop events\n *\n * Dropzones can receive the following events:\n * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends\n * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone\n * - `dragmove` when a draggable that has entered the dropzone is moved\n * - `drop` when a draggable is dropped into this dropzone\n *\n * Use the `accept` option to allow only elements that match the given CSS\n * selector or element. The value can be:\n *\n * - **an Element** - only that element can be dropped into this dropzone.\n * - **a string**, - the element being dragged must match it as a CSS selector.\n * - **`null`** - accept options is cleared - it accepts any element.\n *\n * Use the `overlap` option to set how drops are checked for. The allowed\n * values are:\n *\n * - `'pointer'`, the pointer must be over the dropzone (default)\n * - `'center'`, the draggable element's center must be over the dropzone\n * - a number from 0-1 which is the `(intersection area) / (draggable area)`.\n * e.g. `0.5` for drop to happen when half of the area of the draggable is\n * over the dropzone\n *\n * Use the `checker` option to specify a function to check if a dragged\n * element is over this Interactable.\n *\n | interact(target)\n | .dropChecker(function(dragEvent, // related dragmove or dragend event\n | event, // TouchEvent/PointerEvent/MouseEvent\n | dropped, // bool result of the default checker\n | dropzone, // dropzone Interactable\n | dropElement, // dropzone elemnt\n | draggable, // draggable Interactable\n | draggableElement) {// draggable element\n |\n | return dropped && event.target.hasAttribute('allow-drop');\n | }\n *\n *\n - options (boolean | object | null) #optional The new value to be set.\n | interact('.drop').dropzone({\n | accept: '.can-drop' || document.getElementById('single-drop'),\n | overlap: 'pointer' || 'center' || zeroToOne\n | }\n = (boolean | object) The current setting or this Interactable\n\\*/\nInteractable.prototype.dropzone = function (options) {\n if (utils.is.object(options)) {\n this.options.drop.enabled = options.enabled === false? false: true;\n\n if (utils.is.function(options.ondrop) ) { this.events.ondrop = options.ondrop ; }\n if (utils.is.function(options.ondropactivate) ) { this.events.ondropactivate = options.ondropactivate ; }\n if (utils.is.function(options.ondropdeactivate)) { this.events.ondropdeactivate = options.ondropdeactivate; }\n if (utils.is.function(options.ondragenter) ) { this.events.ondragenter = options.ondragenter ; }\n if (utils.is.function(options.ondragleave) ) { this.events.ondragleave = options.ondragleave ; }\n if (utils.is.function(options.ondropmove) ) { this.events.ondropmove = options.ondropmove ; }\n\n if (/^(pointer|center)$/.test(options.overlap)) {\n this.options.drop.overlap = options.overlap;\n }\n else if (utils.is.number(options.overlap)) {\n this.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0);\n }\n if ('accept' in options) {\n this.options.drop.accept = options.accept;\n }\n if ('checker' in options) {\n this.options.drop.checker = options.checker;\n }\n\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drop.enabled = options;\n\n if (!options) {\n this.ondragenter = this.ondragleave = this.ondrop\n = this.ondropactivate = this.ondropdeactivate = null;\n }\n\n return this;\n }\n\n return this.options.drop;\n};\n\nInteractable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) {\n let dropped = false;\n\n // if the dropzone has no rect (eg. display: none)\n // call the custom dropChecker or just return false\n if (!(rect = rect || this.getRect(dropElement))) {\n return (this.options.drop.checker\n ? this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement)\n : false);\n }\n\n const dropOverlap = this.options.drop.overlap;\n\n if (dropOverlap === 'pointer') {\n const origin = utils.getOriginXY(draggable, draggableElement, 'drag');\n const page = utils.getPageXY(dragEvent);\n\n page.x += origin.x;\n page.y += origin.y;\n\n const horizontal = (page.x > rect.left) && (page.x < rect.right);\n const vertical = (page.y > rect.top ) && (page.y < rect.bottom);\n\n dropped = horizontal && vertical;\n }\n\n const dragRect = draggable.getRect(draggableElement);\n\n if (dragRect && dropOverlap === 'center') {\n const cx = dragRect.left + dragRect.width / 2;\n const cy = dragRect.top + dragRect.height / 2;\n\n dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom;\n }\n\n if (dragRect && utils.is.number(dropOverlap)) {\n const overlapArea = (Math.max(0, Math.min(rect.right , dragRect.right ) - Math.max(rect.left, dragRect.left))\n * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top , dragRect.top )));\n\n const overlapRatio = overlapArea / (dragRect.width * dragRect.height);\n\n dropped = overlapRatio >= dropOverlap;\n }\n\n if (this.options.drop.checker) {\n dropped = this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement);\n }\n\n return dropped;\n};\n\nInteractable.signals.on('unset', function ({ interactable }) {\n interactable.dropzone(false);\n});\n\nInteractable.settingsMethods.push('dropChecker');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.dropTarget = null; // the dropzone a drag target might be dropped into\n interaction.dropElement = null; // the element at the time of checking\n interaction.prevDropTarget = null; // the dropzone that was recently dragged away from\n interaction.prevDropElement = null; // the element at the time of checking\n interaction.dropEvents = null; // the dropEvents related to the current drag event\n\n interaction.activeDrops = {\n dropzones: [], // the dropzones that are mentioned below\n elements : [], // elements of dropzones that accept the target draggable\n rects : [], // the rects of the elements mentioned above\n };\n\n});\n\nInteraction.signals.on('stop', function ({ interaction }) {\n interaction.dropTarget = interaction.dropElement =\n interaction.prevDropTarget = interaction.prevDropElement = null;\n});\n\n/*\\\n * interact.dynamicDrop\n [ method ]\n *\n * Returns or sets whether the dimensions of dropzone elements are\n * calculated on every dragmove or only on dragstart for the default\n * dropChecker\n *\n - newValue (boolean) #optional True to check on each move. False to check only before start\n = (boolean | interact) The current setting or interact\n\\*/\ninteract.dynamicDrop = function (newValue) {\n if (utils.is.bool(newValue)) {\n //if (dragging && dynamicDrop !== newValue && !newValue) {\n //calcRects(dropzones);\n //}\n\n dynamicDrop = newValue;\n\n return interact;\n }\n return dynamicDrop;\n};\n\nutils.merge(Interactable.eventTypes, [\n 'dragenter',\n 'dragleave',\n 'dropactivate',\n 'dropdeactivate',\n 'dropmove',\n 'drop',\n]);\nactions.methodDict.drop = 'dropzone';\n\ndefaultOptions.drop = drop.defaults;\n\nmodule.exports = drop;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst gesture = {\n defaults: {\n enabled : false,\n origin : null,\n restrict: null,\n },\n\n checker: function (pointer, event, interactable, element, interaction) {\n if (interaction.pointerIds.length >= 2) {\n return { name: 'gesture' };\n }\n\n return null;\n },\n\n getCursor: function () {\n return '';\n },\n};\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturestart') { return; }\n iEvent.ds = 0;\n\n interaction.gesture.startDistance = interaction.gesture.prevDistance = iEvent.distance;\n interaction.gesture.startAngle = interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.scale = 1;\n});\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturemove') { return; }\n\n iEvent.ds = iEvent.scale - interaction.gesture.scale;\n\n interaction.target.fire(iEvent);\n\n interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.prevDistance = iEvent.distance;\n\n if (iEvent.scale !== Infinity\n && iEvent.scale !== null\n && iEvent.scale !== undefined\n && !isNaN(iEvent.scale)) {\n\n interaction.gesture.scale = iEvent.scale;\n }\n});\n\n/*\\\n * Interactable.gesturable\n [ method ]\n *\n * Gets or sets whether multitouch gestures can be performed on the\n * Interactable's element\n *\n = (boolean) Indicates if this can be the target of gesture events\n | var isGestureable = interact(element).gesturable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on gesture events (makes the Interactable gesturable)\n = (object) this Interactable\n | interact(element).gesturable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // limit multiple gestures.\n | // See the explanation in @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n\\*/\nInteractable.prototype.gesturable = function (options) {\n if (utils.is.object(options)) {\n this.options.gesture.enabled = options.enabled === false? false: true;\n this.setPerAction('gesture', options);\n this.setOnEvents('gesture', options);\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.gesture.enabled = options;\n\n if (!options) {\n this.ongesturestart = this.ongesturestart = this.ongestureend = null;\n }\n\n return this;\n }\n\n return this.options.gesture;\n};\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action, event, starting, ending, deltaSource }) {\n if (action !== 'gesture') { return; }\n\n const pointers = interaction.pointers;\n\n iEvent.touches = [pointers[0], pointers[1]];\n\n if (starting) {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = 1;\n iEvent.ds = 0;\n iEvent.angle = utils.touchAngle(pointers, undefined, deltaSource);\n iEvent.da = 0;\n }\n else if (ending || event instanceof InteractEvent) {\n iEvent.distance = interaction.prevEvent.distance;\n iEvent.box = interaction.prevEvent.box;\n iEvent.scale = interaction.prevEvent.scale;\n iEvent.ds = iEvent.scale - 1;\n iEvent.angle = interaction.prevEvent.angle;\n iEvent.da = iEvent.angle - interaction.gesture.startAngle;\n }\n else {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = iEvent.distance / interaction.gesture.startDistance;\n iEvent.angle = utils.touchAngle(pointers, interaction.gesture.prevAngle, deltaSource);\n\n iEvent.ds = iEvent.scale - interaction.gesture.prevScale;\n iEvent.da = iEvent.angle - interaction.gesture.prevAngle;\n }\n});\n\nInteraction.signals.on('new', function (interaction) {\n interaction.gesture = {\n start: { x: 0, y: 0 },\n\n startDistance: 0, // distance between two touches of touchStart\n prevDistance : 0,\n distance : 0,\n\n scale: 1, // gesture.distance / gesture.startDistance\n\n startAngle: 0, // angle of line joining two touches\n prevAngle : 0, // angle of the previous gesture event\n };\n});\n\nactions.gesture = gesture;\nactions.names.push('gesture');\nutils.merge(Interactable.eventTypes, [\n 'gesturestart',\n 'gesturemove',\n 'gestureend',\n]);\nactions.methodDict.gesture = 'gesturable';\n\ndefaultOptions.gesture = gesture.defaults;\n\nmodule.exports = gesture;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\n// Less Precision with touch input\nconst defaultMargin = browser.supportsTouch || browser.supportsPointerEvent? 20: 10;\n\nconst resize = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n square: false,\n preserveAspectRatio: false,\n axis: 'xy',\n\n // use default margin\n margin: NaN,\n\n // object with props left, right, top, bottom which are\n // true/false values to resize when the pointer is over that edge,\n // CSS selectors to match the handles for each direction\n // or the Elements for each handle\n edges: null,\n\n // a value of 'none' will limit the resize rect to a minimum of 0x0\n // 'negate' will alow the rect to have negative width/height\n // 'reposition' will keep the width/height positive by swapping\n // the top and bottom edges and/or swapping the left and right edges\n invert: 'none',\n },\n\n checker: function (pointer, event, interactable, element, interaction, rect) {\n if (!rect) { return null; }\n\n const page = utils.extend({}, interaction.curCoords.page);\n const options = interactable.options;\n\n if (options.resize.enabled) {\n const resizeOptions = options.resize;\n const resizeEdges = { left: false, right: false, top: false, bottom: false };\n\n // if using resize.edges\n if (utils.is.object(resizeOptions.edges)) {\n for (const edge in resizeEdges) {\n resizeEdges[edge] = checkResizeEdge(edge,\n resizeOptions.edges[edge],\n page,\n interaction._eventTarget,\n element,\n rect,\n resizeOptions.margin || defaultMargin);\n }\n\n resizeEdges.left = resizeEdges.left && !resizeEdges.right;\n resizeEdges.top = resizeEdges.top && !resizeEdges.bottom;\n\n if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) {\n return {\n name: 'resize',\n edges: resizeEdges,\n };\n }\n }\n else {\n const right = options.resize.axis !== 'y' && page.x > (rect.right - defaultMargin);\n const bottom = options.resize.axis !== 'x' && page.y > (rect.bottom - defaultMargin);\n\n if (right || bottom) {\n return {\n name: 'resize',\n axes: (right? 'x' : '') + (bottom? 'y' : ''),\n };\n }\n }\n }\n\n return null;\n },\n\n cursors: (browser.isIe9OrOlder ? {\n x : 'e-resize',\n y : 's-resize',\n xy: 'se-resize',\n\n top : 'n-resize',\n left : 'w-resize',\n bottom : 's-resize',\n right : 'e-resize',\n topleft : 'se-resize',\n bottomright: 'se-resize',\n topright : 'ne-resize',\n bottomleft : 'ne-resize',\n } : {\n x : 'ew-resize',\n y : 'ns-resize',\n xy: 'nwse-resize',\n\n top : 'ns-resize',\n left : 'ew-resize',\n bottom : 'ns-resize',\n right : 'ew-resize',\n topleft : 'nwse-resize',\n bottomright: 'nwse-resize',\n topright : 'nesw-resize',\n bottomleft : 'nesw-resize',\n }),\n\n getCursor: function (action) {\n if (action.axis) {\n return resize.cursors[action.name + action.axis];\n }\n else if (action.edges) {\n let cursorKey = '';\n const edgeNames = ['top', 'bottom', 'left', 'right'];\n\n for (let i = 0; i < 4; i++) {\n if (action.edges[edgeNames[i]]) {\n cursorKey += edgeNames[i];\n }\n }\n\n return resize.cursors[cursorKey];\n }\n },\n};\n\n// resizestart\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'resizestart' || !interaction.prepared.edges) {\n return;\n }\n\n const startRect = interaction.target.getRect(interaction.element);\n const resizeOptions = interaction.target.options.resize;\n\n /*\n * When using the `resizable.square` or `resizable.preserveAspectRatio` options, resizing from one edge\n * will affect another. E.g. with `resizable.square`, resizing to make the right edge larger will make\n * the bottom edge larger by the same amount. We call these 'linked' edges. Any linked edges will depend\n * on the active edges and the edge being interacted with.\n */\n if (resizeOptions.square || resizeOptions.preserveAspectRatio) {\n const linkedEdges = utils.extend({}, interaction.prepared.edges);\n\n linkedEdges.top = linkedEdges.top || (linkedEdges.left && !linkedEdges.bottom);\n linkedEdges.left = linkedEdges.left || (linkedEdges.top && !linkedEdges.right );\n linkedEdges.bottom = linkedEdges.bottom || (linkedEdges.right && !linkedEdges.top );\n linkedEdges.right = linkedEdges.right || (linkedEdges.bottom && !linkedEdges.left );\n\n interaction.prepared._linkedEdges = linkedEdges;\n }\n else {\n interaction.prepared._linkedEdges = null;\n }\n\n // if using `resizable.preserveAspectRatio` option, record aspect ratio at the start of the resize\n if (resizeOptions.preserveAspectRatio) {\n interaction.resizeStartAspectRatio = startRect.width / startRect.height;\n }\n\n interaction.resizeRects = {\n start : startRect,\n current : utils.extend({}, startRect),\n inverted : utils.extend({}, startRect),\n previous : utils.extend({}, startRect),\n delta : {\n left: 0, right : 0, width : 0,\n top : 0, bottom: 0, height: 0,\n },\n };\n\n iEvent.rect = interaction.resizeRects.inverted;\n iEvent.deltaRect = interaction.resizeRects.delta;\n});\n\n// resizemove\nInteractEvent.signals.on('new', function ({ iEvent, phase, interaction }) {\n if (phase !== 'move' || !interaction.prepared.edges) { return; }\n\n const resizeOptions = interaction.target.options.resize;\n const invert = resizeOptions.invert;\n const invertible = invert === 'reposition' || invert === 'negate';\n\n let edges = interaction.prepared.edges;\n\n const start = interaction.resizeRects.start;\n const current = interaction.resizeRects.current;\n const inverted = interaction.resizeRects.inverted;\n const delta = interaction.resizeRects.delta;\n const previous = utils.extend(interaction.resizeRects.previous, inverted);\n const originalEdges = edges;\n\n let dx = iEvent.dx;\n let dy = iEvent.dy;\n\n if (resizeOptions.preserveAspectRatio || resizeOptions.square) {\n // `resize.preserveAspectRatio` takes precedence over `resize.square`\n const startAspectRatio = resizeOptions.preserveAspectRatio\n ? interaction.resizeStartAspectRatio\n : 1;\n\n edges = interaction.prepared._linkedEdges;\n\n if ((originalEdges.left && originalEdges.bottom)\n || (originalEdges.right && originalEdges.top)) {\n dy = -dx / startAspectRatio;\n }\n else if (originalEdges.left || originalEdges.right ) { dy = dx / startAspectRatio; }\n else if (originalEdges.top || originalEdges.bottom) { dx = dy * startAspectRatio; }\n }\n\n // update the 'current' rect without modifications\n if (edges.top ) { current.top += dy; }\n if (edges.bottom) { current.bottom += dy; }\n if (edges.left ) { current.left += dx; }\n if (edges.right ) { current.right += dx; }\n\n if (invertible) {\n // if invertible, copy the current rect\n utils.extend(inverted, current);\n\n if (invert === 'reposition') {\n // swap edge values if necessary to keep width/height positive\n let swap;\n\n if (inverted.top > inverted.bottom) {\n swap = inverted.top;\n\n inverted.top = inverted.bottom;\n inverted.bottom = swap;\n }\n if (inverted.left > inverted.right) {\n swap = inverted.left;\n\n inverted.left = inverted.right;\n inverted.right = swap;\n }\n }\n }\n else {\n // if not invertible, restrict to minimum of 0x0 rect\n inverted.top = Math.min(current.top, start.bottom);\n inverted.bottom = Math.max(current.bottom, start.top);\n inverted.left = Math.min(current.left, start.right);\n inverted.right = Math.max(current.right, start.left);\n }\n\n inverted.width = inverted.right - inverted.left;\n inverted.height = inverted.bottom - inverted.top ;\n\n for (const edge in inverted) {\n delta[edge] = inverted[edge] - previous[edge];\n }\n\n iEvent.edges = interaction.prepared.edges;\n iEvent.rect = inverted;\n iEvent.deltaRect = delta;\n});\n\n/*\\\n * Interactable.resizable\n [ method ]\n *\n * Gets or sets whether resize actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of resize elements\n | var isResizeable = interact('input[type=text]').resizable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on resize events (object makes the Interactable resizable)\n = (object) This Interactable\n | interact(element).resizable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | edges: {\n | top : true, // Use pointer coords to check for resize.\n | left : false, // Disable resizing from left edge.\n | bottom: '.resize-s',// Resize if pointer target matches selector\n | right : handleEl // Resize if pointer target is the given Element\n | },\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height are adjusted at a 1:1 ratio.\n | square: false,\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height maintain the aspect ratio they had when resizing started.\n | preserveAspectRatio: false,\n |\n | // a value of 'none' will limit the resize rect to a minimum of 0x0\n | // 'negate' will allow the rect to have negative width/height\n | // 'reposition' will keep the width/height positive by swapping\n | // the top and bottom edges and/or swapping the left and right edges\n | invert: 'none' || 'negate' || 'reposition'\n |\n | // limit multiple resizes.\n | // See the explanation in the @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n \\*/\nInteractable.prototype.resizable = function (options) {\n if (utils.is.object(options)) {\n this.options.resize.enabled = options.enabled === false? false: true;\n this.setPerAction('resize', options);\n this.setOnEvents('resize', options);\n\n if (/^x$|^y$|^xy$/.test(options.axis)) {\n this.options.resize.axis = options.axis;\n }\n else if (options.axis === null) {\n this.options.resize.axis = defaultOptions.resize.axis;\n }\n\n if (utils.is.bool(options.preserveAspectRatio)) {\n this.options.resize.preserveAspectRatio = options.preserveAspectRatio;\n }\n else if (utils.is.bool(options.square)) {\n this.options.resize.square = options.square;\n }\n\n return this;\n }\n if (utils.is.bool(options)) {\n this.options.resize.enabled = options;\n\n if (!options) {\n this.onresizestart = this.onresizestart = this.onresizeend = null;\n }\n\n return this;\n }\n return this.options.resize;\n};\n\nfunction checkResizeEdge (name, value, page, element, interactableElement, rect, margin) {\n // false, '', undefined, null\n if (!value) { return false; }\n\n // true value, use pointer coords and element rect\n if (value === true) {\n // if dimensions are negative, \"switch\" edges\n const width = utils.is.number(rect.width )? rect.width : rect.right - rect.left;\n const height = utils.is.number(rect.height)? rect.height : rect.bottom - rect.top ;\n\n if (width < 0) {\n if (name === 'left' ) { name = 'right'; }\n else if (name === 'right') { name = 'left' ; }\n }\n if (height < 0) {\n if (name === 'top' ) { name = 'bottom'; }\n else if (name === 'bottom') { name = 'top' ; }\n }\n\n if (name === 'left' ) { return page.x < ((width >= 0? rect.left: rect.right ) + margin); }\n if (name === 'top' ) { return page.y < ((height >= 0? rect.top : rect.bottom) + margin); }\n\n if (name === 'right' ) { return page.x > ((width >= 0? rect.right : rect.left) - margin); }\n if (name === 'bottom') { return page.y > ((height >= 0? rect.bottom: rect.top ) - margin); }\n }\n\n // the remaining checks require an element\n if (!utils.is.element(element)) { return false; }\n\n return utils.is.element(value)\n // the value is an element to use as a resize handle\n ? value === element\n // otherwise check if element matches value as selector\n : utils.matchesUpTo(element, value, interactableElement);\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.resizeAxes = 'xy';\n});\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action }) {\n if (action !== 'resize' || !interaction.resizeAxes) { return; }\n\n const options = interaction.target.options;\n\n if (options.resize.square) {\n if (interaction.resizeAxes === 'y') {\n iEvent.dx = iEvent.dy;\n }\n else {\n iEvent.dy = iEvent.dx;\n }\n iEvent.axes = 'xy';\n }\n else {\n iEvent.axes = interaction.resizeAxes;\n\n if (interaction.resizeAxes === 'x') {\n iEvent.dy = 0;\n }\n else if (interaction.resizeAxes === 'y') {\n iEvent.dx = 0;\n }\n }\n});\n\nactions.resize = resize;\nactions.names.push('resize');\nutils.merge(Interactable.eventTypes, [\n 'resizestart',\n 'resizemove',\n 'resizeinertiastart',\n 'resizeinertiaresume',\n 'resizeend',\n]);\nactions.methodDict.resize = 'resizable';\n\ndefaultOptions.resize = resize.defaults;\n\nmodule.exports = resize;\n","const raf = require('./utils/raf');\nconst getWindow = require('./utils/window').getWindow;\nconst is = require('./utils/is');\nconst domUtils = require('./utils/domUtils');\nconst Interaction = require('./Interaction');\nconst defaultOptions = require('./defaultOptions');\n\nconst autoScroll = {\n defaults: {\n enabled : false,\n container: null, // the item that is scrolled (Window or HTMLElement)\n margin : 60,\n speed : 300, // the scroll speed in pixels per second\n },\n\n interaction: null,\n i: null, // the handle returned by window.setInterval\n x: 0, y: 0, // Direction each pulse is to scroll in\n\n isScrolling: false,\n prevTime: 0,\n\n start: function (interaction) {\n autoScroll.isScrolling = true;\n raf.cancel(autoScroll.i);\n\n autoScroll.interaction = interaction;\n autoScroll.prevTime = new Date().getTime();\n autoScroll.i = raf.request(autoScroll.scroll);\n },\n\n stop: function () {\n autoScroll.isScrolling = false;\n raf.cancel(autoScroll.i);\n },\n\n // scroll the window by the values in scroll.x/y\n scroll: function () {\n const options = autoScroll.interaction.target.options[autoScroll.interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(autoScroll.interaction.element);\n const now = new Date().getTime();\n // change in time in seconds\n const dt = (now - autoScroll.prevTime) / 1000;\n // displacement\n const s = options.speed * dt;\n\n if (s >= 1) {\n if (is.window(container)) {\n container.scrollBy(autoScroll.x * s, autoScroll.y * s);\n }\n else if (container) {\n container.scrollLeft += autoScroll.x * s;\n container.scrollTop += autoScroll.y * s;\n }\n\n autoScroll.prevTime = now;\n }\n\n if (autoScroll.isScrolling) {\n raf.cancel(autoScroll.i);\n autoScroll.i = raf.request(autoScroll.scroll);\n }\n },\n check: function (interactable, actionName) {\n const options = interactable.options;\n\n return options[actionName].autoScroll && options[actionName].autoScroll.enabled;\n },\n onInteractionMove: function ({ interaction, pointer }) {\n if (!(interaction.interacting()\n && autoScroll.check(interaction.target, interaction.prepared.name))) {\n return;\n }\n\n if (interaction.simulation) {\n autoScroll.x = autoScroll.y = 0;\n return;\n }\n\n let top;\n let right;\n let bottom;\n let left;\n\n const options = interaction.target.options[interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(interaction.element);\n\n if (is.window(container)) {\n left = pointer.clientX < autoScroll.margin;\n top = pointer.clientY < autoScroll.margin;\n right = pointer.clientX > container.innerWidth - autoScroll.margin;\n bottom = pointer.clientY > container.innerHeight - autoScroll.margin;\n }\n else {\n const rect = domUtils.getElementClientRect(container);\n\n left = pointer.clientX < rect.left + autoScroll.margin;\n top = pointer.clientY < rect.top + autoScroll.margin;\n right = pointer.clientX > rect.right - autoScroll.margin;\n bottom = pointer.clientY > rect.bottom - autoScroll.margin;\n }\n\n autoScroll.x = (right ? 1: left? -1: 0);\n autoScroll.y = (bottom? 1: top? -1: 0);\n\n if (!autoScroll.isScrolling) {\n // set the autoScroll properties to those of the target\n autoScroll.margin = options.margin;\n autoScroll.speed = options.speed;\n\n autoScroll.start(interaction);\n }\n },\n};\n\nInteraction.signals.on('stop-active', function () {\n autoScroll.stop();\n});\n\nInteraction.signals.on('action-move', autoScroll.onInteractionMove);\n\ndefaultOptions.perAction.autoScroll = autoScroll.defaults;\n\nmodule.exports = autoScroll;\n","const Interactable = require('../Interactable');\nconst actions = require('../actions/base');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.ignoreFrom\n [ method ]\n *\n * If the target of the `mousedown`, `pointerdown` or `touchstart`\n * event or any of it's parents match the given CSS selector or\n * Element, no drag/resize/gesture is started.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to not ignore any elements\n = (string | Element | object) The current ignoreFrom value or this Interactable\n **\n | interact(element, { ignoreFrom: document.getElementById('no-action') });\n | // or\n | interact(element).ignoreFrom('input, textarea, a');\n\\*/\nInteractable.prototype.ignoreFrom = function (newValue) {\n return this._backCompatOption('ignoreFrom', newValue);\n};\n\n/*\\\n * Interactable.allowFrom\n [ method ]\n *\n * A drag/resize/gesture is started only If the target of the\n * `mousedown`, `pointerdown` or `touchstart` event or any of it's\n * parents match the given CSS selector or Element.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to allow from any element\n = (string | Element | object) The current allowFrom value or this Interactable\n **\n | interact(element, { allowFrom: document.getElementById('drag-handle') });\n | // or\n | interact(element).allowFrom('.handle');\n\\*/\nInteractable.prototype.allowFrom = function (newValue) {\n return this._backCompatOption('allowFrom', newValue);\n};\n\nInteractable.prototype.testIgnore = function (ignoreFrom, interactableElement, element) {\n if (!ignoreFrom || !is.element(element)) { return false; }\n\n if (is.string(ignoreFrom)) {\n return domUtils.matchesUpTo(element, ignoreFrom, interactableElement);\n }\n else if (is.element(ignoreFrom)) {\n return domUtils.nodeContains(ignoreFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testAllow = function (allowFrom, interactableElement, element) {\n if (!allowFrom) { return true; }\n\n if (!is.element(element)) { return false; }\n\n if (is.string(allowFrom)) {\n return domUtils.matchesUpTo(element, allowFrom, interactableElement);\n }\n else if (is.element(allowFrom)) {\n return domUtils.nodeContains(allowFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testIgnoreAllow = function (options, interactableElement, eventTarget) {\n return (!this.testIgnore(options.ignoreFrom, interactableElement, eventTarget)\n && this.testAllow(options.allowFrom, interactableElement, eventTarget));\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (event.buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\n","const interact = require('../interact');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst actions = require('../actions/base');\nconst defaultOptions = require('../defaultOptions');\nconst browser = require('../utils/browser');\nconst scope = require('../scope');\nconst utils = require('../utils');\nconst signals = require('../utils/Signals').new();\n\nrequire('./InteractableMethods');\n\nconst autoStart = {\n signals,\n withinInteractionLimit,\n // Allow this many interactions to happen simultaneously\n maxInteractions: Infinity,\n defaults: {\n perAction: {\n manualStart: false,\n max: Infinity,\n maxPerElement: 1,\n allowFrom: null,\n ignoreFrom: null,\n },\n },\n setActionDefaults: function (action) {\n utils.extend(action.defaults, autoStart.defaults.perAction);\n },\n};\n\n// set cursor style on mousedown\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget }) {\n if (interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\n// set cursor style on mousemove\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget }) {\n if (!interaction.mouse\n || interaction.pointerIsDown\n || interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\nInteraction.signals.on('move', function (arg) {\n const { interaction, event } = arg;\n\n if (!interaction.pointerIsDown\n || interaction.interacting()\n || !interaction.pointerWasMoved\n || !interaction.prepared.name) {\n return;\n }\n\n signals.fire('before-start', arg);\n\n const target = interaction.target;\n\n if (interaction.prepared.name && target) {\n // check manualStart and interaction limit\n if (target.options[interaction.prepared.name].manualStart\n || !withinInteractionLimit(target, interaction.element, interaction.prepared)) {\n interaction.stop(event);\n }\n else {\n interaction.start(interaction.prepared, target, interaction.element);\n }\n }\n});\n\n// Check if the current target supports the action.\n// If so, return the validated action. Otherwise, return null\nfunction validateAction (action, interactable, element, eventTarget) {\n if (utils.is.object(action)\n && interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget)\n && interactable.options[action.name].enabled\n && withinInteractionLimit(interactable, element, action)) {\n return action;\n }\n\n return null;\n}\n\nfunction validateSelector (interaction, pointer, event, matches, matchElements, eventTarget) {\n for (let i = 0, len = matches.length; i < len; i++) {\n const match = matches[i];\n const matchElement = matchElements[i];\n const action = validateAction(match.getAction(pointer, event, interaction, matchElement),\n match,\n matchElement,\n eventTarget);\n\n if (action) {\n return {\n action,\n target: match,\n element: matchElement,\n };\n }\n }\n\n return {};\n}\n\nfunction getActionInfo (interaction, pointer, event, eventTarget) {\n let matches = [];\n let matchElements = [];\n\n let element = eventTarget;\n let action = null;\n\n function pushMatches (interactable, selector, context) {\n const elements = (browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined);\n\n if (utils.matchesSelector(element, selector, elements)) {\n\n matches.push(interactable);\n matchElements.push(element);\n }\n }\n\n while (utils.is.element(element)) {\n matches = [];\n matchElements = [];\n\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && (action = validateAction(elementInteractable.getAction(pointer, event, interaction, element, eventTarget),\n elementInteractable,\n element,\n eventTarget))\n && !elementInteractable.options[action.name].manualStart) {\n return {\n element,\n action,\n target: elementInteractable,\n };\n }\n else {\n scope.interactables.forEachSelector(pushMatches, element);\n\n const actionInfo = validateSelector(interaction, pointer, event, matches, matchElements, eventTarget);\n\n if (actionInfo.action\n && !actionInfo.target.options[actionInfo.action.name].manualStart) {\n return actionInfo;\n }\n }\n\n element = utils.parentNode(element);\n }\n\n return {};\n}\n\nfunction prepare (interaction, { action, target, element }) {\n action = action || {};\n\n if (interaction.target && interaction.target.options.styleCursor) {\n interaction.target._doc.documentElement.style.cursor = '';\n }\n\n interaction.target = target;\n interaction.element = element;\n utils.copyAction(interaction.prepared, action);\n\n if (target && target.options.styleCursor) {\n const cursor = action? actions[action.name].getCursor(action) : '';\n interaction.target._doc.documentElement.style.cursor = cursor;\n }\n\n signals.fire('prepared', { interaction: interaction });\n}\n\nInteraction.signals.on('stop', function ({ interaction }) {\n const target = interaction.target;\n\n if (target && target.options.styleCursor) {\n target._doc.documentElement.style.cursor = '';\n }\n});\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (utils.is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (utils.is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n const buttons = event.buttons || ({\n 0: 1,\n 1: 4,\n 3: 8,\n 4: 16,\n })[event.button];\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\nfunction withinInteractionLimit (interactable, element, action) {\n const options = interactable.options;\n const maxActions = options[action.name].max;\n const maxPerElement = options[action.name].maxPerElement;\n let activeInteractions = 0;\n let targetCount = 0;\n let targetElementCount = 0;\n\n // no actions if any of these values == 0\n if (!(maxActions && maxPerElement && autoStart.maxInteractions)) { return; }\n\n for (let i = 0, len = scope.interactions.length; i < len; i++) {\n const interaction = scope.interactions[i];\n const otherAction = interaction.prepared.name;\n\n if (!interaction.interacting()) { continue; }\n\n activeInteractions++;\n\n if (activeInteractions >= autoStart.maxInteractions) {\n return false;\n }\n\n if (interaction.target !== interactable) { continue; }\n\n targetCount += (otherAction === action.name)|0;\n\n if (targetCount >= maxActions) {\n return false;\n }\n\n if (interaction.element === element) {\n targetElementCount++;\n\n if (otherAction !== action.name || targetElementCount >= maxPerElement) {\n return false;\n }\n }\n }\n\n return autoStart.maxInteractions > 0;\n}\n\n/*\\\n * interact.maxInteractions\n [ method ]\n **\n * Returns or sets the maximum number of concurrent interactions allowed.\n * By default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables\n * and elements, you need to enable it in the draggable, resizable and\n * gesturable `'max'` and `'maxPerElement'` options.\n **\n - newValue (number) #optional Any number. newValue <= 0 means no interactions.\n\\*/\ninteract.maxInteractions = function (newValue) {\n if (utils.is.number(newValue)) {\n autoStart.maxInteractions = newValue;\n\n return this;\n }\n\n return autoStart.maxInteractions;\n};\n\nInteractable.settingsMethods.push('styleCursor');\nInteractable.settingsMethods.push('actionChecker');\nInteractable.settingsMethods.push('ignoreFrom');\nInteractable.settingsMethods.push('allowFrom');\n\ndefaultOptions.base.actionChecker = null;\ndefaultOptions.base.styleCursor = true;\n\nutils.extend(defaultOptions.perAction, autoStart.defaults.perAction);\n\nmodule.exports = autoStart;\n","const autoStart = require('./base');\nconst Interaction = require('../Interaction');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.delayTimer = null;\n});\n\nautoStart.signals.on('prepared', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.delayTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.target, interaction.element);\n }, delay);\n }\n});\n\nInteraction.signals.on('move', function ({ interaction, duplicate }) {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.delayTimer);\n }\n});\n\n// prevent regular down->move autoStart\nautoStart.signals.on('before-start', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.prepared.name = null;\n }\n});\n","const autoStart = require('./base');\nconst scope = require('../scope');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\n\nconst { matchesSelector, parentNode } = require('../utils/domUtils');\n\nautoStart.setActionDefaults(require('../actions/drag'));\n\nautoStart.signals.on('before-start', function ({ interaction, eventTarget, dx, dy }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // check if a drag is in the correct axis\n const absX = Math.abs(dx);\n const absY = Math.abs(dy);\n const options = interaction.target.options.drag;\n const startAxis = options.startAxis;\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy');\n\n interaction.prepared.axis = options.lockAxis === 'start'\n ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n : options.lockAxis;\n\n // if the movement isn't in the startAxis of the interactable\n if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) {\n // cancel the prepared action\n interaction.prepared.name = null;\n\n // then try to get a drag from another ineractable\n\n if (!interaction.prepared.name) {\n\n let element = eventTarget;\n\n const getDraggable = function (interactable, selector, context) {\n const elements = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n if (interactable === interaction.target) { return; }\n\n if (!options.manualStart\n && !interactable.testIgnoreAllow(options, element, eventTarget)\n && matchesSelector(element, selector, elements)) {\n\n const action = interactable.getAction(interaction.downPointer,\n interaction.downEvent,\n interaction,\n element);\n\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, interactable)\n && autoStart.validateAction(action, interactable, element, eventTarget)) {\n\n return interactable;\n }\n }\n };\n\n let action = null;\n\n // check all interactables\n while (is.element(element)) {\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && elementInteractable !== interaction.target\n && !elementInteractable.options.drag.manualStart) {\n\n action = elementInteractable.getAction(interaction.downPointer, interaction.downEvent, interaction, element);\n }\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, elementInteractable)) {\n\n interaction.prepared.name = 'drag';\n interaction.target = elementInteractable;\n interaction.element = element;\n break;\n }\n\n const selectorInteractable = scope.interactables.forEachSelector(getDraggable, element);\n\n if (selectorInteractable) {\n interaction.prepared.name = 'drag';\n interaction.target = selectorInteractable;\n interaction.element = element;\n break;\n }\n\n element = parentNode(element);\n }\n }\n }\n});\n\nfunction checkStartAxis (startAxis, interactable) {\n if (!interactable) { return false; }\n\n const thisAxis = interactable.options.drag.startAxis;\n\n return (startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis);\n}\n","require('./base').setActionDefaults(require('../actions/gesture'));\n","require('./base').setActionDefaults(require('../actions/resize'));\n","module.exports = {\n base: {\n accept : null,\n preventDefault: 'auto',\n deltaSource : 'page',\n },\n\n perAction: {\n origin: { x: 0, y: 0 },\n\n // only allow left button by default\n // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n mouseButtons: 1,\n\n inertia: {\n enabled : false,\n resistance : 10, // the lambda in exponential decay\n minSpeed : 100, // target speed must be above this for inertia to start\n endSpeed : 10, // the speed at which inertia is slow enough to stop\n allowResume : true, // allow resuming an action in inertia phase\n smoothEndDuration: 300, // animate to snap/restrict endOnly if there's no inertia\n },\n },\n};\n","/* browser entry point */\n\n// Legacy browser support\nrequire('./legacyBrowsers');\n\n// inertia\nrequire('./inertia');\n\n// modifiers\nrequire('./modifiers/snap');\nrequire('./modifiers/restrict');\n\n// pointerEvents\nrequire('./pointerEvents/base');\nrequire('./pointerEvents/holdRepeat');\nrequire('./pointerEvents/interactableTargets');\n\n// delay\nrequire('./autoStart/delay');\n\n// actions\nrequire('./actions/gesture');\nrequire('./actions/resize');\nrequire('./actions/drag');\nrequire('./actions/drop');\n\n// load these modifiers after resize is loaded\nrequire('./modifiers/snapSize');\nrequire('./modifiers/restrictEdges');\nrequire('./modifiers/restrictSize');\n\n// autoStart actions\nrequire('./autoStart/gesture');\nrequire('./autoStart/resize');\nrequire('./autoStart/drag');\n\n// Interactable preventDefault setting\nrequire('./interactablePreventDefault.js');\n\n// autoScroll\nrequire('./autoScroll');\n\n// export interact\nmodule.exports = require('./interact');\n","const InteractEvent = require('./InteractEvent');\nconst Interaction = require('./Interaction');\nconst modifiers = require('./modifiers');\nconst utils = require('./utils');\nconst animationFrame = require('./utils/raf');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.inertiaStatus = {\n active : false,\n smoothEnd : false,\n allowResume: false,\n\n startEvent: null,\n upCoords : {},\n\n xe: 0, ye: 0,\n sx: 0, sy: 0,\n\n t0: 0,\n vx0: 0, vys: 0,\n duration: 0,\n\n lambda_v0: 0,\n one_ve_v0: 0,\n i : null,\n };\n\n interaction.boundInertiaFrame = () => inertiaFrame .apply(interaction);\n interaction.boundSmoothEndFrame = () => smoothEndFrame.apply(interaction);\n});\n\nInteraction.signals.on('down', function ({ interaction, event, pointer, eventTarget }) {\n const status = interaction.inertiaStatus;\n\n // Check if the down event hits the current inertia target\n if (status.active) {\n let element = eventTarget;\n\n // climb up the DOM tree from the event target\n while (utils.is.element(element)) {\n\n // if interaction element is the current inertia target element\n if (element === interaction.element) {\n // stop inertia\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n\n // update pointers to the down event's coordinates\n interaction.updatePointer(pointer);\n utils.setCoords(interaction.curCoords, interaction.pointers);\n\n // fire appropriate signals\n const signalArg = { interaction };\n Interaction.signals.fire('before-action-move', signalArg);\n Interaction.signals.fire('action-resume' , signalArg);\n\n // fire a reume event\n const resumeEvent = new InteractEvent(interaction,\n event,\n interaction.prepared.name,\n 'inertiaresume',\n interaction.element);\n\n interaction.target.fire(resumeEvent);\n interaction.prevEvent = resumeEvent;\n modifiers.resetStatuses(interaction.modifierStatuses);\n\n utils.copyCoords(interaction.prevCoords, interaction.curCoords);\n break;\n }\n\n element = utils.parentNode(element);\n }\n }\n});\n\nInteraction.signals.on('up', function ({ interaction, event }) {\n const status = interaction.inertiaStatus;\n\n if (!interaction.interacting() || status.active) { return; }\n\n const target = interaction.target;\n const options = target && target.options;\n const inertiaOptions = options && interaction.prepared.name && options[interaction.prepared.name].inertia;\n\n const now = new Date().getTime();\n const statuses = {};\n const page = utils.extend({}, interaction.curCoords.page);\n const pointerSpeed = interaction.pointerDelta.client.speed;\n\n let smoothEnd = false;\n let modifierResult;\n\n // check if inertia should be started\n const inertiaPossible = (inertiaOptions && inertiaOptions.enabled\n && interaction.prepared.name !== 'gesture'\n && event !== status.startEvent);\n\n const inertia = (inertiaPossible\n && (now - interaction.curCoords.timeStamp) < 50\n && pointerSpeed > inertiaOptions.minSpeed\n && pointerSpeed > inertiaOptions.endSpeed);\n\n const modifierArg = {\n interaction,\n pageCoords: page,\n statuses,\n preEnd: true,\n requireEndOnly: true,\n };\n\n // smoothEnd\n if (inertiaPossible && !inertia) {\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n if (modifierResult.shouldMove && modifierResult.locked) {\n smoothEnd = true;\n }\n }\n\n if (!(inertia || smoothEnd)) { return; }\n\n utils.copyCoords(status.upCoords, interaction.curCoords);\n\n interaction.pointers[0] = status.startEvent =\n new InteractEvent(interaction, event, interaction.prepared.name, 'inertiastart', interaction.element);\n\n status.t0 = now;\n\n status.active = true;\n status.allowResume = inertiaOptions.allowResume;\n interaction.simulation = status;\n\n target.fire(status.startEvent);\n\n if (inertia) {\n status.vx0 = interaction.pointerDelta.client.vx;\n status.vy0 = interaction.pointerDelta.client.vy;\n status.v0 = pointerSpeed;\n\n calcInertia(interaction, status);\n\n utils.extend(page, interaction.curCoords.page);\n\n page.x += status.xe;\n page.y += status.ye;\n\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n status.modifiedXe += modifierResult.dx;\n status.modifiedYe += modifierResult.dy;\n\n status.i = animationFrame.request(interaction.boundInertiaFrame);\n }\n else {\n status.smoothEnd = true;\n status.xe = modifierResult.dx;\n status.ye = modifierResult.dy;\n\n status.sx = status.sy = 0;\n\n status.i = animationFrame.request(interaction.boundSmoothEndFrame);\n }\n});\n\nInteraction.signals.on('stop-active', function ({ interaction }) {\n const status = interaction.inertiaStatus;\n\n if (status.active) {\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n }\n});\n\nfunction calcInertia (interaction, status) {\n const inertiaOptions = interaction.target.options[interaction.prepared.name].inertia;\n const lambda = inertiaOptions.resistance;\n const inertiaDur = -Math.log(inertiaOptions.endSpeed / status.v0) / lambda;\n\n status.x0 = interaction.prevEvent.pageX;\n status.y0 = interaction.prevEvent.pageY;\n status.t0 = status.startEvent.timeStamp / 1000;\n status.sx = status.sy = 0;\n\n status.modifiedXe = status.xe = (status.vx0 - inertiaDur) / lambda;\n status.modifiedYe = status.ye = (status.vy0 - inertiaDur) / lambda;\n status.te = inertiaDur;\n\n status.lambda_v0 = lambda / status.v0;\n status.one_ve_v0 = 1 - inertiaOptions.endSpeed / status.v0;\n}\n\nfunction inertiaFrame () {\n updateInertiaCoords(this);\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n\n const status = this.inertiaStatus;\n const options = this.target.options[this.prepared.name].inertia;\n const lambda = options.resistance;\n const t = new Date().getTime() / 1000 - status.t0;\n\n if (t < status.te) {\n\n const progress = 1 - (Math.exp(-lambda * t) - status.lambda_v0) / status.one_ve_v0;\n\n if (status.modifiedXe === status.xe && status.modifiedYe === status.ye) {\n status.sx = status.xe * progress;\n status.sy = status.ye * progress;\n }\n else {\n const quadPoint = utils.getQuadraticCurvePoint(0, 0,\n status.xe,\n status.ye,\n status.modifiedXe,\n status.modifiedYe,\n progress);\n\n status.sx = quadPoint.x;\n status.sy = quadPoint.y;\n }\n\n this.doMove();\n\n status.i = animationFrame.request(this.boundInertiaFrame);\n }\n else {\n status.sx = status.modifiedXe;\n status.sy = status.modifiedYe;\n\n this.doMove();\n this.end(status.startEvent);\n status.active = false;\n this.simulation = null;\n }\n\n utils.copyCoords(this.prevCoords, this.curCoords);\n}\n\nfunction smoothEndFrame () {\n updateInertiaCoords(this);\n\n const status = this.inertiaStatus;\n const t = new Date().getTime() - status.t0;\n const duration = this.target.options[this.prepared.name].inertia.smoothEndDuration;\n\n if (t < duration) {\n status.sx = utils.easeOutQuad(t, 0, status.xe, duration);\n status.sy = utils.easeOutQuad(t, 0, status.ye, duration);\n\n this.pointerMove(status.startEvent, status.startEvent);\n\n status.i = animationFrame.request(this.boundSmoothEndFrame);\n }\n else {\n status.sx = status.xe;\n status.sy = status.ye;\n\n this.pointerMove(status.startEvent, status.startEvent);\n this.end(status.startEvent);\n\n status.smoothEnd =\n status.active = false;\n this.simulation = null;\n }\n}\n\nfunction updateInertiaCoords (interaction) {\n const status = interaction.inertiaStatus;\n\n // return if inertia isn't running\n if (!status.active) { return; }\n\n const pageUp = status.upCoords.page;\n const clientUp = status.upCoords.client;\n\n utils.setCoords(interaction.curCoords, [ {\n pageX : pageUp.x + status.sx,\n pageY : pageUp.y + status.sy,\n clientX: clientUp.x + status.sx,\n clientY: clientUp.y + status.sy,\n } ]);\n}\n","const browser = require('./utils/browser');\nconst events = require('./utils/events');\nconst utils = require('./utils');\nconst scope = require('./scope');\nconst Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\n\nconst globalEvents = {};\n\n/*\\\n * interact\n [ method ]\n *\n * The methods of this variable can be used to set elements as\n * interactables and also to change various default settings.\n *\n * Calling it as a function and passing an element or a valid CSS selector\n * string returns an Interactable object which has various methods to\n * configure it.\n *\n - element (Element | string) The HTML or SVG Element to interact with or CSS selector\n = (object) An @Interactable\n *\n > Usage\n | interact('#draggable').draggable(true);\n |\n | var rectables = interact('rect');\n | rectables\n | .gesturable(true)\n | .on('gesturemove', function (event) {\n | // ...\n | });\n\\*/\nfunction interact (element, options) {\n let interactable = scope.interactables.get(element, options);\n\n if (!interactable) {\n interactable = new Interactable(element, options);\n interactable.events.global = globalEvents;\n }\n\n return interactable;\n}\n\n/*\\\n * interact.isSet\n [ method ]\n *\n * Check if an element has been set\n - element (Element) The Element being searched for\n = (boolean) Indicates if the element or CSS selector was previously passed to interact\n\\*/\ninteract.isSet = function (element, options) {\n return scope.interactables.indexOfElement(element, options && options.context) !== -1;\n};\n\n/*\\\n * interact.on\n [ method ]\n *\n * Adds a global listener for an InteractEvent or adds a DOM event to\n * `document`\n *\n - type (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) interact\n\\*/\ninteract.on = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.on(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.on(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n // if it is an InteractEvent type, add listener to globalEvents\n if (utils.contains(Interactable.eventTypes, type)) {\n // if this type of event was never bound\n if (!globalEvents[type]) {\n globalEvents[type] = [listener];\n }\n else {\n globalEvents[type].push(listener);\n }\n }\n // If non InteractEvent type, addEventListener to document\n else {\n events.add(scope.document, type, listener, { options });\n }\n\n return interact;\n};\n\n/*\\\n * interact.off\n [ method ]\n *\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n - type (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) interact\n \\*/\ninteract.off = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.off(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.off(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n if (!utils.contains(Interactable.eventTypes, type)) {\n events.remove(scope.document, type, listener, options);\n }\n else {\n let index;\n\n if (type in globalEvents\n && (index = utils.indexOf(globalEvents[type], listener)) !== -1) {\n globalEvents[type].splice(index, 1);\n }\n }\n\n return interact;\n};\n\n/*\\\n * interact.debug\n [ method ]\n *\n * Returns an object which exposes internal data\n = (object) An object with properties that outline the current state and expose internal functions and variables\n\\*/\ninteract.debug = function () {\n return scope;\n};\n\n// expose the functions used to calculate multi-touch properties\ninteract.getPointerAverage = utils.pointerAverage;\ninteract.getTouchBBox = utils.touchBBox;\ninteract.getTouchDistance = utils.touchDistance;\ninteract.getTouchAngle = utils.touchAngle;\n\ninteract.getElementRect = utils.getElementRect;\ninteract.getElementClientRect = utils.getElementClientRect;\ninteract.matchesSelector = utils.matchesSelector;\ninteract.closest = utils.closest;\n\n/*\\\n * interact.supportsTouch\n [ method ]\n *\n = (boolean) Whether or not the browser supports touch input\n\\*/\ninteract.supportsTouch = function () {\n return browser.supportsTouch;\n};\n\n/*\\\n * interact.supportsPointerEvent\n [ method ]\n *\n = (boolean) Whether or not the browser supports PointerEvents\n\\*/\ninteract.supportsPointerEvent = function () {\n return browser.supportsPointerEvent;\n};\n\n/*\\\n * interact.stop\n [ method ]\n *\n * Cancels all interactions (end events are not fired)\n *\n - event (Event) An event on which to call preventDefault()\n = (object) interact\n\\*/\ninteract.stop = function (event) {\n for (let i = scope.interactions.length - 1; i >= 0; i--) {\n scope.interactions[i].stop(event);\n }\n\n return interact;\n};\n\n/*\\\n * interact.pointerMoveTolerance\n [ method ]\n * Returns or sets the distance the pointer must be moved before an action\n * sequence occurs. This also affects tolerance for tap events.\n *\n - newValue (number) #optional The movement from the start position must be greater than this value\n = (number | Interactable) The current setting or interact\n\\*/\ninteract.pointerMoveTolerance = function (newValue) {\n if (utils.is.number(newValue)) {\n Interaction.pointerMoveTolerance = newValue;\n\n return this;\n }\n\n return Interaction.pointerMoveTolerance;\n};\n\ninteract.addDocument = scope.addDocument;\ninteract.removeDocument = scope.removeDocument;\n\nscope.interact = interact;\n\nmodule.exports = interact;\n","const Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\nconst scope = require('./scope');\nconst is = require('./utils/is');\nconst events = require('./utils/events');\n\nconst { nodeContains, matchesSelector } = require('./utils/domUtils');\n\n/*\\\n * Interactable.preventDefault\n [ method ]\n *\n * Returns or sets whether to prevent the browser's default behaviour\n * in response to pointer events. Can be set to:\n * - `'always'` to always prevent\n * - `'never'` to never prevent\n * - `'auto'` to let interact.js try to determine what would be best\n *\n - newValue (string) #optional `true`, `false` or `'auto'`\n = (string | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.preventDefault = function (newValue) {\n if (/^(always|never|auto)$/.test(newValue)) {\n this.options.preventDefault = newValue;\n return this;\n }\n\n if (is.bool(newValue)) {\n this.options.preventDefault = newValue? 'always' : 'never';\n return this;\n }\n\n return this.options.preventDefault;\n};\n\nInteractable.prototype.checkAndPreventDefault = function (event) {\n const setting = this.options.preventDefault;\n\n if (setting === 'never') { return; }\n\n if (setting === 'always') {\n event.preventDefault();\n return;\n }\n\n // setting === 'auto'\n\n // don't preventDefault if the browser supports passiveEvents\n // CSS touch-action and user-selecct should be used instead\n if (events.supportsOptions) {\n return;\n }\n\n // don't preventDefault of pointerdown events\n if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) {\n return;\n }\n\n // don't preventDefault on editable elements\n if (is.element(event.target)\n && matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) {\n return;\n }\n\n event.preventDefault();\n};\n\nfunction onInteractionEvent ({ interaction, event }) {\n if (interaction.target) {\n interaction.target.checkAndPreventDefault(event);\n }\n}\n\nfor (const eventSignal of ['down', 'move', 'up', 'cancel']) {\n Interaction.signals.on(eventSignal, onInteractionEvent);\n}\n\n// prevent native HTML5 drag on interact.js target elements\nInteraction.docEvents.dragstart = function preventNativeDrag (event) {\n for (const interaction of scope.interactions) {\n\n if (interaction.element\n && (interaction.element === event.target\n || nodeContains(interaction.element, event.target))) {\n\n interaction.target.checkAndPreventDefault(event);\n return;\n }\n }\n};\n","const scope = require('./scope');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst iFinder = require('./utils/interactionFinder');\nconst pointerEvents = require('./pointerEvents/base');\n\nconst { window } = require('./utils/window');\n\nconst toString = Object.prototype.toString;\n\nif (!window.Array.isArray) {\n window.Array.isArray = function (obj) {\n return toString.call(obj) === '[object Array]';\n };\n}\n\nif (!String.prototype.trim) {\n String.prototype.trim = function () {\n return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n };\n}\n\n// http://www.quirksmode.org/dom/events/click.html\n// >Events leading to dblclick\n//\n// IE8 doesn't fire down event before dblclick.\n// This workaround tries to fire a tap and doubletap after dblclick\nfunction onIE8Dblclick (event) {\n const eventTarget = event.target;\n const interaction = iFinder.search(event, event.type, eventTarget);\n\n if (!interaction) { return; }\n\n if (interaction.prevTap\n && event.clientX === interaction.prevTap.clientX\n && event.clientY === interaction.prevTap.clientY\n && eventTarget === interaction.prevTap.target) {\n\n interaction.downTargets[0] = eventTarget;\n interaction.downTimes [0] = new Date().getTime();\n\n pointerEvents.fire({\n interaction,\n event,\n eventTarget,\n pointer: event,\n type: 'tap',\n });\n }\n}\n\nif (browser.isIE8) {\n const selectFix = function (event) {\n for (const interaction of scope.interactions) {\n if (interaction.interacting()) {\n interaction.target.checkAndPreventDefault(event);\n }\n }\n };\n\n const onDocIE8 = function onDocIE8 ({ doc, win }, signalName) {\n const eventMethod = signalName.indexOf('listen') === 0\n ? events.add : events.remove;\n\n // For IE's lack of Event#preventDefault\n eventMethod(doc, 'selectstart', selectFix);\n\n if (pointerEvents) {\n eventMethod(doc, 'dblclick', onIE8Dblclick);\n }\n };\n\n scope.signals.on('add-document' , onDocIE8);\n scope.signals.on('remove-document', onDocIE8);\n}\n\nmodule.exports = null;\n","const InteractEvent = require('../InteractEvent');\nconst Interaction = require('../Interaction');\nconst extend = require('../utils/extend');\n\nconst modifiers = {\n names: [],\n\n setOffsets: function (arg) {\n const { interaction, pageCoords: page } = arg;\n const { target, element, startOffset } = interaction;\n const rect = target.getRect(element);\n\n if (rect) {\n startOffset.left = page.x - rect.left;\n startOffset.top = page.y - rect.top;\n\n startOffset.right = rect.right - page.x;\n startOffset.bottom = rect.bottom - page.y;\n\n if (!('width' in rect)) { rect.width = rect.right - rect.left; }\n if (!('height' in rect)) { rect.height = rect.bottom - rect.top ; }\n }\n else {\n startOffset.left = startOffset.top = startOffset.right = startOffset.bottom = 0;\n }\n\n arg.rect = rect;\n arg.interactable = target;\n arg.element = element;\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n\n arg.options = target.options[interaction.prepared.name][modifierName];\n\n if (!arg.options) {\n continue;\n }\n\n interaction.modifierOffsets[modifierName] = modifiers[modifierName].setOffset(arg);\n }\n },\n\n setAll: function (arg) {\n const { interaction, statuses, preEnd, requireEndOnly } = arg;\n const coords = extend({}, arg.pageCoords);\n const result = {\n dx: 0,\n dy: 0,\n changed: false,\n locked: false,\n shouldMove: true,\n };\n\n for (const modifierName of modifiers.names) {\n const modifier = modifiers[modifierName];\n const options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!shouldDo(options, preEnd, requireEndOnly)) { continue; }\n\n arg.status = arg.status = statuses[modifierName];\n arg.options = options;\n arg.offset = arg.interaction.modifierOffsets[modifierName];\n\n modifier.set(arg);\n\n if (arg.status.locked) {\n coords.x += arg.status.dx;\n coords.y += arg.status.dy;\n\n result.dx += arg.status.dx;\n result.dy += arg.status.dy;\n\n result.locked = true;\n }\n }\n\n // a move should be fired if:\n // - there are no modifiers enabled,\n // - no modifiers are \"locked\" i.e. have changed the pointer's coordinates, or\n // - the locked coords have changed since the last pointer move\n result.shouldMove = !arg.status || !result.locked || arg.status.changed;\n\n return result;\n },\n\n resetStatuses: function (statuses) {\n for (const modifierName of modifiers.names) {\n const status = statuses[modifierName] || {};\n\n status.dx = status.dy = 0;\n status.modifiedX = status.modifiedY = NaN;\n status.locked = false;\n status.changed = true;\n\n statuses[modifierName] = status;\n }\n\n return statuses;\n },\n\n start: function ({ interaction }, signalName) {\n const arg = {\n interaction,\n pageCoords: (signalName === 'action-resume' ?\n interaction.curCoords : interaction.startCoords).page,\n startOffset: interaction.startOffset,\n statuses: interaction.modifierStatuses,\n preEnd: false,\n requireEndOnly: false,\n };\n\n modifiers.setOffsets(arg);\n modifiers.resetStatuses(arg.statuses);\n\n arg.pageCoords = extend({}, interaction.startCoords.page);\n interaction.modifierResult = modifiers.setAll(arg);\n },\n};\n\nInteraction.signals.on('new', function (interaction) {\n interaction.startOffset = { left: 0, right: 0, top: 0, bottom: 0 };\n interaction.modifierOffsets = {};\n interaction.modifierStatuses = modifiers.resetStatuses({});\n interaction.modifierResult = null;\n});\n\nInteraction.signals.on('action-start' , modifiers.start);\nInteraction.signals.on('action-resume', modifiers.start);\n\nInteraction.signals.on('before-action-move', function ({ interaction, preEnd, interactingBeforeMove }) {\n const modifierResult = modifiers.setAll({\n interaction,\n preEnd,\n pageCoords: interaction.curCoords.page,\n statuses: interaction.modifierStatuses,\n requireEndOnly: false,\n });\n\n // don't fire an action move if a modifier would keep the event in the same\n // cordinates as before\n if (!modifierResult.shouldMove && interactingBeforeMove) {\n interaction._dontFireMove = true;\n }\n\n interaction.modifierResult = modifierResult;\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n for (let i = 0; i < modifiers.names.length; i++) {\n const options = interaction.target.options[interaction.prepared.name][modifiers.names[i]];\n\n // if the endOnly option is true for any modifier\n if (shouldDo(options, true, true)) {\n // fire a move event at the modified coordinates\n interaction.doMove({ event, preEnd: true });\n break;\n }\n }\n});\n\nInteractEvent.signals.on('set-xy', function (arg) {\n const { iEvent, interaction } = arg;\n const modifierArg = extend({}, arg);\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n modifierArg.options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!modifierArg.options) {\n continue;\n }\n\n const modifier = modifiers[modifierName];\n\n modifierArg.status = interaction.modifierStatuses[modifierName];\n\n iEvent[modifierName] = modifier.modifyCoords(modifierArg);\n }\n});\n\nfunction shouldDo (options, preEnd, requireEndOnly) {\n return (options && options.enabled\n && (preEnd || !options.endOnly)\n && (!requireEndOnly || options.endOnly));\n}\n\nmodule.exports = modifiers;\n","const modifiers = require('./index');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst restrict = {\n defaults: {\n enabled : false,\n endOnly : false,\n restriction: null,\n elementRect: null,\n },\n\n setOffset: function ({ rect, startOffset, options }) {\n const elementRect = options && options.elementRect;\n const offset = {};\n\n if (rect && elementRect) {\n offset.left = startOffset.left - (rect.width * elementRect.left);\n offset.top = startOffset.top - (rect.height * elementRect.top);\n\n offset.right = startOffset.right - (rect.width * (1 - elementRect.right));\n offset.bottom = startOffset.bottom - (rect.height * (1 - elementRect.bottom));\n }\n else {\n offset.left = offset.top = offset.right = offset.bottom = 0;\n }\n\n return offset;\n },\n\n set: function ({ pageCoords, interaction, status, options }) {\n if (!options) { return status; }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n\n const restriction = getRestrictionRect(options.restriction, interaction, page);\n\n if (!restriction) { return status; }\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n const rect = restriction;\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n const offset = interaction.modifierOffsets.restrict;\n\n // object is assumed to have\n // x, y, width, height or\n // left, top, right, bottom\n if ('x' in restriction && 'y' in restriction) {\n modifiedX = Math.max(Math.min(rect.x + rect.width - offset.right , page.x), rect.x + offset.left);\n modifiedY = Math.max(Math.min(rect.y + rect.height - offset.bottom, page.y), rect.y + offset.top );\n }\n else {\n modifiedX = Math.max(Math.min(rect.right - offset.right , page.x), rect.left + offset.left);\n modifiedY = Math.max(Math.min(rect.bottom - offset.bottom, page.y), rect.top + offset.top );\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const elementRect = options && options.elementRect;\n\n if (options && options.enabled\n && !(phase === 'start' && elementRect && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n getRestrictionRect,\n};\n\nfunction getRestrictionRect (value, interaction, page) {\n if (utils.is.function(value)) {\n return utils.resolveRectLike(value, interaction.target, interaction.element, [page.x, page.y, interaction]);\n } else {\n return utils.resolveRectLike(value, interaction.target, interaction.element);\n }\n}\n\nmodifiers.restrict = restrict;\nmodifiers.names.push('restrict');\n\ndefaultOptions.perAction.restrict = restrict.defaults;\n\nmodule.exports = restrict;\n","// This module adds the options.resize.restrictEdges setting which sets min and\n// max for the top, left, bottom and right edges of the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictEdges: {\n// inner: { top: 200, left: 200, right: 400, bottom: 400 },\n// outer: { top: 0, left: 0, right: 600, bottom: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst { getRestrictionRect } = require('./restrict');\n\nconst noInner = { top: +Infinity, left: +Infinity, bottom: -Infinity, right: -Infinity };\nconst noOuter = { top: -Infinity, left: -Infinity, bottom: +Infinity, right: +Infinity };\n\nconst restrictEdges = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n offset: null,\n },\n\n setOffset: function ({ interaction, startOffset, options }) {\n if (!options) {\n return utils.extend({}, startOffset);\n }\n\n const offset = getRestrictionRect(options.offset, interaction, interaction.startCoords.page);\n\n if (offset) {\n return {\n top: startOffset.top + offset.y,\n left: startOffset.left + offset.x,\n bottom: startOffset.bottom + offset.y,\n right: startOffset.right + offset.x,\n };\n }\n\n return startOffset;\n },\n\n set: function ({ pageCoords, interaction, status, offset, options }) {\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n const inner = rectUtils.xywhToTlbr(getRestrictionRect(options.inner, interaction, page)) || noInner;\n const outer = rectUtils.xywhToTlbr(getRestrictionRect(options.outer, interaction, page)) || noOuter;\n\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n if (edges.top) {\n modifiedY = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top);\n }\n else if (edges.bottom) {\n modifiedY = Math.max(Math.min(outer.bottom - offset.bottom, page.y), inner.bottom - offset.bottom);\n }\n if (edges.left) {\n modifiedX = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left);\n }\n else if (edges.right) {\n modifiedX = Math.max(Math.min(outer.right - offset.right, page.x), inner.right - offset.right);\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n if (options && options.enabled\n && !(phase === 'start' && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n noInner,\n noOuter,\n getRestrictionRect,\n};\n\nmodifiers.restrictEdges = restrictEdges;\nmodifiers.names.push('restrictEdges');\n\ndefaultOptions.perAction.restrictEdges = restrictEdges.defaults;\nresize.defaults.restrictEdges = restrictEdges.defaults;\n\nmodule.exports = restrictEdges;\n","// This module adds the options.resize.restrictSize setting which sets min and\n// max width and height for the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictSize: {\n// min: { width: -600, height: -600 },\n// max: { width: 600, height: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst restrictEdges = require('./restrictEdges');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst noMin = { width: -Infinity, height: -Infinity };\nconst noMax = { width: +Infinity, height: +Infinity };\n\nconst restrictSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n },\n\n setOffset: function ({ interaction }) {\n return interaction.startOffset;\n },\n\n set: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const rect = rectUtils.xywhToTlbr(interaction.resizeRects.inverted);\n\n const minSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.min, interaction)) || noMin;\n const maxSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.max, interaction)) || noMax;\n\n arg.options = {\n enabled: options.enabled,\n endOnly: options.endOnly,\n inner: utils.extend({}, restrictEdges.noInner),\n outer: utils.extend({}, restrictEdges.noOuter),\n };\n\n if (edges.top) {\n arg.options.inner.top = rect.bottom - minSize.height;\n arg.options.outer.top = rect.bottom - maxSize.height;\n }\n else if (edges.bottom) {\n arg.options.inner.bottom = rect.top + minSize.height;\n arg.options.outer.bottom = rect.top + maxSize.height;\n }\n if (edges.left) {\n arg.options.inner.left = rect.right - minSize.width;\n arg.options.outer.left = rect.right - maxSize.width;\n }\n else if (edges.right) {\n arg.options.inner.right = rect.left + minSize.width;\n arg.options.outer.right = rect.left + maxSize.width;\n }\n\n restrictEdges.set(arg);\n },\n\n modifyCoords: restrictEdges.modifyCoords,\n};\n\nmodifiers.restrictSize = restrictSize;\nmodifiers.names.push('restrictSize');\n\ndefaultOptions.perAction.restrictSize = restrictSize.defaults;\nresize.defaults.restrictSize = restrictSize.defaults;\n\nmodule.exports = restrictSize;\n","const modifiers = require('./index');\nconst interact = require('../interact');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst snap = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n\n relativePoints: null,\n },\n\n setOffset: function ({ interaction, interactable, element, rect, startOffset, options }) {\n const offsets = [];\n const optionsOrigin = utils.rectToXY(utils.resolveRectLike(options.origin));\n const origin = optionsOrigin || utils.getOriginXY(interactable, element, interaction.prepared.name);\n options = options || interactable.options[interaction.prepared.name].snap || {};\n\n let snapOffset;\n\n if (options.offset === 'startCoords') {\n snapOffset = {\n x: interaction.startCoords.page.x - origin.x,\n y: interaction.startCoords.page.y - origin.y,\n };\n }\n else {\n const offsetRect = utils.resolveRectLike(options.offset, interactable, element, [interaction]);\n\n snapOffset = utils.rectToXY(offsetRect) || { x: 0, y: 0 };\n }\n\n if (rect && options.relativePoints && options.relativePoints.length) {\n for (const { x: relativeX, y: relativeY } of options.relativePoints) {\n offsets.push({\n x: startOffset.left - (rect.width * relativeX) + snapOffset.x,\n y: startOffset.top - (rect.height * relativeY) + snapOffset.y,\n });\n }\n }\n else {\n offsets.push(snapOffset);\n }\n\n return offsets;\n },\n\n set: function ({ interaction, pageCoords, status, options, offset: offsets }) {\n const targets = [];\n let target;\n let page;\n let i;\n\n if (status.useStatusXY) {\n page = { x: status.x, y: status.y };\n }\n else {\n const origin = utils.getOriginXY(interaction.target, interaction.element, interaction.prepared.name);\n\n page = utils.extend({}, pageCoords);\n\n page.x -= origin.x;\n page.y -= origin.y;\n }\n\n status.realX = page.x;\n status.realY = page.y;\n\n let len = options.targets? options.targets.length : 0;\n\n for (const { x: offsetX, y: offsetY } of offsets) {\n const relativeX = page.x - offsetX;\n const relativeY = page.y - offsetY;\n\n for (const snapTarget of options.targets) {\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n targets.push({\n x: utils.is.number(target.x) ? (target.x + offsetX) : relativeX,\n y: utils.is.number(target.y) ? (target.y + offsetY) : relativeY,\n\n range: utils.is.number(target.range)? target.range: options.range,\n });\n }\n }\n\n const closest = {\n target: null,\n inRange: false,\n distance: 0,\n range: 0,\n dx: 0,\n dy: 0,\n };\n\n for (i = 0, len = targets.length; i < len; i++) {\n target = targets[i];\n\n const range = target.range;\n const dx = target.x - page.x;\n const dy = target.y - page.y;\n const distance = utils.hypot(dx, dy);\n let inRange = distance <= range;\n\n // Infinite targets count as being out of range\n // compared to non infinite ones that are in range\n if (range === Infinity && closest.inRange && closest.range !== Infinity) {\n inRange = false;\n }\n\n if (!closest.target || (inRange\n // is the closest target in range?\n ? (closest.inRange && range !== Infinity\n // the pointer is relatively deeper in this target\n ? distance / range < closest.distance / closest.range\n // this target has Infinite range and the closest doesn't\n : (range === Infinity && closest.range !== Infinity)\n // OR this target is closer that the previous closest\n || distance < closest.distance)\n // The other is not in range and the pointer is closer to this target\n : (!closest.inRange && distance < closest.distance))) {\n\n closest.target = target;\n closest.distance = distance;\n closest.range = range;\n closest.inRange = inRange;\n closest.dx = dx;\n closest.dy = dy;\n\n status.range = range;\n }\n }\n\n let snapChanged;\n\n if (closest.target) {\n snapChanged = (status.modifiedX !== closest.target.x || status.modifiedY !== closest.target.y);\n\n status.modifiedX = closest.target.x;\n status.modifiedY = closest.target.y;\n }\n else {\n snapChanged = true;\n\n status.modifiedX = NaN;\n status.modifiedY = NaN;\n }\n\n status.dx = closest.dx;\n status.dy = closest.dy;\n\n status.changed = (snapChanged || (closest.inRange && !status.locked));\n status.locked = closest.inRange;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const relativePoints = options && options.relativePoints;\n\n if (options && options.enabled\n && !(phase === 'start' && relativePoints && relativePoints.length)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n }\n\n return {\n range : status.range,\n locked : status.locked,\n x : status.modifiedX,\n y : status.modifiedY,\n realX : status.realX,\n realY : status.realY,\n dx : status.dx,\n dy : status.dy,\n };\n }\n },\n};\n\ninteract.createSnapGrid = function (grid) {\n return function (x, y) {\n const limits = grid.limits || {\n left : -Infinity,\n right : Infinity,\n top : -Infinity,\n bottom: Infinity,\n };\n let offsetX = 0;\n let offsetY = 0;\n\n if (utils.is.object(grid.offset)) {\n offsetX = grid.offset.x;\n offsetY = grid.offset.y;\n }\n\n const gridx = Math.round((x - offsetX) / grid.x);\n const gridy = Math.round((y - offsetY) / grid.y);\n\n const newX = Math.max(limits.left, Math.min(limits.right , gridx * grid.x + offsetX));\n const newY = Math.max(limits.top , Math.min(limits.bottom, gridy * grid.y + offsetY));\n\n return {\n x: newX,\n y: newY,\n range: grid.range,\n };\n };\n};\n\nmodifiers.snap = snap;\nmodifiers.names.push('snap');\n\ndefaultOptions.perAction.snap = snap.defaults;\n\nmodule.exports = snap;\n","// This module allows snapping of the size of targets during resize\n// interactions.\n\nconst modifiers = require('./index');\nconst snap = require('./snap');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\nconst utils = require('../utils/');\n\nconst snapSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n },\n\n setOffset: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.edges;\n\n if (!edges) { return; }\n\n arg.options = {\n relativePoints: [{\n x: edges.left? 0 : 1,\n y: edges.top ? 0 : 1,\n }],\n origin: { x: 0, y: 0 },\n offset: 'self',\n range: options.range,\n };\n\n const offsets = snap.setOffset(arg);\n arg.options = options;\n\n return offsets;\n },\n\n set: function (arg) {\n const { interaction, options, offset, pageCoords } = arg;\n const page = utils.extend({}, pageCoords);\n const relativeX = page.x - offset[0].x;\n const relativeY = page.y - offset[0].y;\n\n arg.options = utils.extend({}, options);\n arg.options.targets = [];\n\n for (const snapTarget of options.targets) {\n let target;\n\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n if ('width' in target && 'height' in target) {\n target.x = target.width;\n target.y = target.height;\n }\n\n arg.options.targets.push(target);\n }\n\n snap.set(arg);\n },\n\n modifyCoords: function (arg) {\n const { options } = arg;\n\n arg.options = utils.extend({}, options);\n arg.options.enabled = options.enabled;\n arg.options.relativePoints = [null];\n\n snap.modifyCoords(arg);\n },\n};\n\nmodifiers.snapSize = snapSize;\nmodifiers.names.push('snapSize');\n\ndefaultOptions.perAction.snapSize = snapSize.defaults;\nresize.defaults.snapSize = snapSize.defaults;\n\nmodule.exports = snapSize;\n","const pointerUtils = require('../utils/pointerUtils');\n\nmodule.exports = class PointerEvent {\n constructor (type, pointer, event, eventTarget, interaction) {\n pointerUtils.pointerExtend(this, event);\n\n if (event !== pointer) {\n pointerUtils.pointerExtend(this, pointer);\n }\n\n this.interaction = interaction;\n\n this.timeStamp = new Date().getTime();\n this.originalEvent = event;\n this.type = type;\n this.pointerId = pointerUtils.getPointerId(pointer);\n this.pointerType = pointerUtils.getPointerType(pointer);\n this.target = eventTarget;\n this.currentTarget = null;\n\n if (type === 'tap') {\n const pointerIndex = interaction.getPointerIndex(pointer);\n this.dt = this.timeStamp - interaction.downTimes[pointerIndex];\n\n const interval = this.timeStamp - interaction.tapTime;\n\n this.double = !!(interaction.prevTap\n && interaction.prevTap.type !== 'doubletap'\n && interaction.prevTap.target === this.target\n && interval < 500);\n }\n else if (type === 'doubletap') {\n this.dt = pointer.timeStamp - interaction.tapTime;\n }\n }\n\n subtractOrigin ({ x: originX, y: originY }) {\n this.pageX -= originX;\n this.pageY -= originY;\n this.clientX -= originX;\n this.clientY -= originY;\n\n return this;\n }\n\n addOrigin ({ x: originX, y: originY }) {\n this.pageX += originX;\n this.pageY += originY;\n this.clientX += originX;\n this.clientY += originY;\n\n return this;\n }\n\n preventDefault () {\n this.originalEvent.preventDefault();\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n};\n","const PointerEvent = require('./PointerEvent');\nconst Interaction = require('../Interaction');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst defaults = require('../defaultOptions');\nconst signals = require('../utils/Signals').new();\nconst { filter } = require('../utils/arr');\n\nconst simpleSignals = [ 'down', 'up', 'cancel' ];\nconst simpleEvents = [ 'down', 'up', 'cancel' ];\n\nconst pointerEvents = {\n PointerEvent,\n fire,\n collectEventTargets,\n signals,\n defaults: {\n holdDuration: 600,\n ignoreFrom : null,\n allowFrom : null,\n origin : { x: 0, y: 0 },\n },\n types: [\n 'down',\n 'move',\n 'up',\n 'cancel',\n 'tap',\n 'doubletap',\n 'hold',\n ],\n};\n\nfunction fire (arg) {\n const {\n interaction, pointer, event, eventTarget,\n type = arg.pointerEvent.type,\n targets = collectEventTargets(arg),\n pointerEvent = new PointerEvent(type, pointer, event, eventTarget, interaction),\n } = arg;\n\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n targets,\n type,\n pointerEvent,\n };\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n\n for (const prop in target.props || {}) {\n pointerEvent[prop] = target.props[prop];\n }\n\n const origin = utils.getOriginXY(target.eventable, target.element);\n\n pointerEvent.subtractOrigin(origin);\n pointerEvent.eventable = target.eventable;\n pointerEvent.currentTarget = target.element;\n\n target.eventable.fire(pointerEvent);\n\n pointerEvent.addOrigin(origin);\n\n if (pointerEvent.immediatePropagationStopped\n || (pointerEvent.propagationStopped\n && (i + 1) < targets.length && targets[i + 1].element !== pointerEvent.currentTarget)) {\n break;\n }\n }\n\n signals.fire('fired', signalArg);\n\n if (type === 'tap') {\n // if pointerEvent should make a double tap, create and fire a doubletap\n // PointerEvent and use that as the prevTap\n const prevTap = pointerEvent.double\n ? fire({\n interaction, pointer, event, eventTarget,\n type: 'doubletap',\n })\n : pointerEvent;\n\n interaction.prevTap = prevTap;\n interaction.tapTime = prevTap.timeStamp;\n }\n\n return pointerEvent;\n}\n\nfunction collectEventTargets ({ interaction, pointer, event, eventTarget, type }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n // do not fire a tap event if the pointer was moved before being lifted\n if (type === 'tap' && (interaction.pointerWasMoved\n // or if the pointerup target is different to the pointerdown target\n || !(interaction.downTargets[pointerIndex] && interaction.downTargets[pointerIndex] === eventTarget))) {\n return [];\n }\n\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n path,\n targets: [],\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (type === 'hold') {\n signalArg.targets = filter(signalArg.targets, target =>\n target.eventable.options.holdDuration === interaction.holdTimers[pointerIndex].duration);\n }\n\n return signalArg.targets;\n}\n\nInteraction.signals.on('update-pointer-down', function ({ interaction, pointerIndex }) {\n interaction.holdTimers[pointerIndex] = { duration: Infinity, timeout: null };\n});\n\nInteraction.signals.on('remove-pointer', function ({ interaction, pointerIndex }) {\n interaction.holdTimers.splice(pointerIndex, 1);\n});\n\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget, duplicateMove }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n if (!duplicateMove && (!interaction.pointerIsDown || interaction.pointerWasMoved)) {\n if (interaction.pointerIsDown) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n\n fire({\n interaction, pointer, event, eventTarget,\n type: 'move',\n });\n }\n});\n\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget, pointerIndex }) {\n // copy event to be used in timeout for IE8\n const eventCopy = browser.isIE8? utils.extend({}, event) : event;\n\n const timer = interaction.holdTimers[pointerIndex];\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'hold',\n targets: [],\n path,\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (!signalArg.targets.length) { return; }\n\n let minDuration = Infinity;\n\n for (let i = 0; i < signalArg.targets.length; i++) {\n const target = signalArg.targets[i];\n const holdDuration = target.eventable.options.holdDuration;\n\n if (holdDuration < minDuration) {\n minDuration = holdDuration;\n }\n }\n\n timer.duration = minDuration;\n timer.timeout = setTimeout(function () {\n fire({\n interaction,\n eventTarget,\n pointer: browser.isIE8? eventCopy : pointer,\n event: eventCopy,\n type: 'hold',\n });\n }, minDuration);\n});\n\nInteraction.signals.on('up', ({ interaction, pointer, event, eventTarget }) => {\n if (!interaction.pointerWasMoved) {\n fire({ interaction, eventTarget, pointer, event, type: 'tap' });\n }\n});\n\n['up', 'cancel'].forEach(function (signalName) {\n Interaction.signals.on(signalName, function ({ interaction, pointerIndex }) {\n if (interaction.holdTimers[pointerIndex]) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n });\n});\n\nfunction createSignalListener (type) {\n return function ({ interaction, pointer, event, eventTarget }) {\n fire({ interaction, eventTarget, pointer, event, type });\n };\n}\n\nfor (let i = 0; i < simpleSignals.length; i++) {\n Interaction.signals.on(simpleSignals[i], createSignalListener(simpleEvents[i]));\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.prevTap = null; // the most recent tap event on this interaction\n interaction.tapTime = 0; // time of the most recent tap event\n interaction.holdTimers = []; // [{ duration, timeout }]\n});\n\ndefaults.pointerEvents = pointerEvents.defaults;\nmodule.exports = pointerEvents;\n","const pointerEvents = require('./base');\nconst Interaction = require('../Interaction');\n\npointerEvents.signals.on('new', onNew);\npointerEvents.signals.on('fired', onFired);\n\nfor (const signal of ['move', 'up', 'cancel', 'endall']) {\n Interaction.signals.on(signal, endHoldRepeat);\n}\n\nfunction onNew ({ pointerEvent }) {\n if (pointerEvent.type !== 'hold') { return; }\n\n pointerEvent.count = (pointerEvent.count || 0) + 1;\n}\n\nfunction onFired ({ interaction, pointerEvent, eventTarget, targets }) {\n if (pointerEvent.type !== 'hold' || !targets.length) { return; }\n\n // get the repeat interval from the first eventable\n const interval = targets[0].eventable.options.holdRepeatInterval;\n\n // don't repeat if the interval is 0 or less\n if (interval <= 0) { return; }\n\n // set a timeout to fire the holdrepeat event\n interaction.holdIntervalHandle = setTimeout(function () {\n pointerEvents.fire({\n interaction,\n eventTarget,\n type: 'hold',\n pointer: pointerEvent,\n event: pointerEvent,\n });\n }, interval);\n}\n\nfunction endHoldRepeat ({ interaction }) {\n // set the interaction's holdStopTime property\n // to stop further holdRepeat events\n if (interaction.holdIntervalHandle) {\n clearInterval(interaction.holdIntervalHandle);\n interaction.holdIntervalHandle = null;\n }\n}\n\n// don't repeat by default\npointerEvents.defaults.holdRepeatInterval = 0;\npointerEvents.types.push('holdrepeat');\n\nmodule.exports = {\n onNew,\n onFired,\n endHoldRepeat,\n};\n","const pointerEvents = require('./base');\nconst Interactable = require('../Interactable');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\nconst scope = require('../scope');\nconst extend = require('../utils/extend');\nconst { merge } = require('../utils/arr');\n\npointerEvents.signals.on('collect-targets', function ({ targets, element, type, eventTarget }) {\n function collectSelectors (interactable, selector, context) {\n const els = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && is.element(element)\n && domUtils.matchesSelector(element, selector, els)\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n const interactable = scope.interactables.get(element);\n\n if (interactable) {\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n scope.interactables.forEachSelector(collectSelectors, element);\n});\n\nInteractable.signals.on('new', function ({ interactable }) {\n interactable.events.getRect = function (element) {\n return interactable.getRect(element);\n };\n});\n\nInteractable.signals.on('set', function ({ interactable, options }) {\n extend(interactable.events.options, pointerEvents.defaults);\n extend(interactable.events.options, options);\n});\n\nmerge(Interactable.eventTypes, pointerEvents.types);\n\nInteractable.prototype.pointerEvents = function (options) {\n extend(this.events.options, options);\n\n return this;\n};\n\nconst __backCompatOption = Interactable.prototype._backCompatOption;\n\nInteractable.prototype._backCompatOption = function (optionName, newValue) {\n const ret = __backCompatOption.call(this, optionName, newValue);\n\n if (ret === this) {\n this.events.options[optionName] = newValue;\n }\n\n return ret;\n};\n\nInteractable.settingsMethods.push('pointerEvents');\n","const utils = require('./utils');\nconst events = require('./utils/events');\nconst signals = require('./utils/Signals').new();\n\nconst scope = {\n signals,\n events,\n utils,\n\n // main document\n document: require('./utils/domObjects').document,\n // all documents being listened to\n documents: [],\n\n addDocument: function (doc, win) {\n // do nothing if document is already known\n if (utils.contains(scope.documents, doc)) { return false; }\n\n win = win || scope.getWindow(doc);\n\n scope.documents.push(doc);\n events.documents.push(doc);\n\n // don't add an unload event for the main document\n // so that the page may be cached in browser history\n if (doc !== scope.document) {\n events.add(win, 'unload', scope.onWindowUnload);\n }\n\n signals.fire('add-document', { doc, win });\n },\n\n removeDocument: function (doc, win) {\n const index = utils.indexOf(scope.documents, doc);\n\n win = win || scope.getWindow(doc);\n\n events.remove(win, 'unload', scope.onWindowUnload);\n\n scope.documents.splice(index, 1);\n events.documents.splice(index, 1);\n\n signals.fire('remove-document', { win, doc });\n },\n\n onWindowUnload: function () {\n scope.removeDocument(this.document, this);\n },\n};\n\nmodule.exports = scope;\n","const { indexOf } = require('./arr');\n\nclass Signals {\n constructor () {\n this.listeners = {\n // signalName: [listeners],\n };\n }\n\n on (name, listener) {\n if (!this.listeners[name]) {\n this.listeners[name] = [listener];\n return;\n }\n\n this.listeners[name].push(listener);\n }\n\n off (name, listener) {\n if (!this.listeners[name]) { return; }\n\n const index = indexOf(this.listeners[name], listener);\n\n if (index !== -1) {\n this.listeners[name].splice(index, 1);\n }\n }\n\n fire (name, arg) {\n const targetListeners = this.listeners[name];\n\n if (!targetListeners) { return; }\n\n for (let i = 0; i < targetListeners.length; i++) {\n if (targetListeners[i](arg, name) === false) {\n return;\n }\n }\n }\n}\n\nSignals.new = function () {\n return new Signals();\n};\n\nmodule.exports = Signals;\n","function indexOf (array, target) {\n for (let i = 0, len = array.length; i < len; i++) {\n if (array[i] === target) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction contains (array, target) {\n return indexOf(array, target) !== -1;\n}\n\nfunction merge (target, source) {\n for (let i = 0; i < source.length; i++) {\n target.push(source[i]);\n }\n\n return target;\n}\n\nfunction filter (array, test) {\n const result = [];\n\n for (let i = 0; i < array.length; i++) {\n if (test(array[i])) {\n result.push(array[i]);\n }\n }\n\n return result;\n}\n\nmodule.exports = {\n indexOf,\n contains,\n merge,\n filter,\n};\n","const { window } = require('./window');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst Element = domObjects.Element;\nconst navigator = window.navigator;\n\nconst browser = {\n // Does the browser support touch input?\n supportsTouch: !!(('ontouchstart' in window) || is.function(window.DocumentTouch)\n && domObjects.document instanceof window.DocumentTouch),\n\n // Does the browser support PointerEvents\n supportsPointerEvent: !!domObjects.PointerEvent,\n\n isIE8: ('attachEvent' in window) && !('addEventListener' in window),\n\n // Opera Mobile must be handled differently\n isOperaMobile: (navigator.appName === 'Opera'\n && browser.supportsTouch\n && navigator.userAgent.match('Presto')),\n\n // scrolling doesn't change the result of getClientRects on iOS 7\n isIOS7: (/iP(hone|od|ad)/.test(navigator.platform)\n && /OS 7[^\\d]/.test(navigator.appVersion)),\n\n isIe9OrOlder: /MSIE (8|9)/.test(navigator.userAgent),\n\n // prefix matchesSelector\n prefixedMatchesSelector: 'matches' in Element.prototype\n ? 'matches': 'webkitMatchesSelector' in Element.prototype\n ? 'webkitMatchesSelector': 'mozMatchesSelector' in Element.prototype\n ? 'mozMatchesSelector': 'oMatchesSelector' in Element.prototype\n ? 'oMatchesSelector': 'msMatchesSelector',\n\n useMatchesSelectorPolyfill: false,\n\n pEventTypes: (domObjects.PointerEvent\n ? (domObjects.PointerEvent === window.MSPointerEvent\n ? {\n up: 'MSPointerUp',\n down: 'MSPointerDown',\n over: 'mouseover',\n out: 'mouseout',\n move: 'MSPointerMove',\n cancel: 'MSPointerCancel',\n }\n : {\n up: 'pointerup',\n down: 'pointerdown',\n over: 'pointerover',\n out: 'pointerout',\n move: 'pointermove',\n cancel: 'pointercancel',\n })\n : null),\n\n // because Webkit and Opera still use 'mousewheel' event type\n wheelEvent: 'onmousewheel' in domObjects.document? 'mousewheel': 'wheel',\n\n};\n\nbrowser.useMatchesSelectorPolyfill = !is.function(Element.prototype[browser.prefixedMatchesSelector]);\n\nmodule.exports = browser;\n","const domObjects = {};\nconst win = require('./window').window;\n\nfunction blank () {}\n\ndomObjects.document = win.document;\ndomObjects.DocumentFragment = win.DocumentFragment || blank;\ndomObjects.SVGElement = win.SVGElement || blank;\ndomObjects.SVGSVGElement = win.SVGSVGElement || blank;\ndomObjects.SVGElementInstance = win.SVGElementInstance || blank;\ndomObjects.Element = win.Element || blank;\ndomObjects.HTMLElement = win.HTMLElement || domObjects.Element;\n\ndomObjects.Event = win.Event;\ndomObjects.Touch = win.Touch || blank;\ndomObjects.PointerEvent = (win.PointerEvent || win.MSPointerEvent);\n\nmodule.exports = domObjects;\n","const win = require('./window');\nconst browser = require('./browser');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst domUtils = {\n nodeContains: function (parent, child) {\n while (child) {\n if (child === parent) {\n return true;\n }\n\n child = child.parentNode;\n }\n\n return false;\n },\n\n closest: function (element, selector) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) { return element; }\n\n element = domUtils.parentNode(element);\n }\n\n return null;\n },\n\n parentNode: function (node) {\n let parent = node.parentNode;\n\n if (is.docFrag(parent)) {\n // skip past #shado-root fragments\n while ((parent = parent.host) && is.docFrag(parent)) {\n continue;\n }\n\n return parent;\n }\n\n return parent;\n },\n\n // taken from http://tanalin.com/en/blog/2012/12/matches-selector-ie8/ and modified\n matchesSelectorPolyfill: browser.useMatchesSelectorPolyfill\n ? function (element, selector, elems) {\n elems = elems || element.parentNode.querySelectorAll(selector);\n\n for (let i = 0, len = elems.length; i < len; i++) {\n if (elems[i] === element) {\n return true;\n }\n }\n\n return false;\n }\n : null,\n\n matchesSelector: function (element, selector, nodeList) {\n if (browser.useMatchesSelectorPolyfill) {\n return domUtils.matchesSelectorPolyfill(element, selector, nodeList);\n }\n\n // remove /deep/ from selectors if shadowDOM polyfill is used\n if (win.window !== win.realWindow) {\n selector = selector.replace(/\\/deep\\//g, ' ');\n }\n\n return element[browser.prefixedMatchesSelector](selector);\n },\n\n // Test for the element that's \"above\" all other qualifiers\n indexOfDeepestElement: function (elements) {\n let deepestZoneParents = [];\n let dropzoneParents = [];\n let dropzone;\n let deepestZone = elements[0];\n let index = deepestZone? 0: -1;\n let parent;\n let child;\n let i;\n let n;\n\n for (i = 1; i < elements.length; i++) {\n dropzone = elements[i];\n\n // an element might belong to multiple selector dropzones\n if (!dropzone || dropzone === deepestZone) {\n continue;\n }\n\n if (!deepestZone) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n // check if the deepest or current are document.documentElement or document.rootElement\n // - if the current dropzone is, do nothing and continue\n if (dropzone.parentNode === dropzone.ownerDocument) {\n continue;\n }\n // - if deepest is, update with the current dropzone and continue to next\n else if (deepestZone.parentNode === dropzone.ownerDocument) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n if (!deepestZoneParents.length) {\n parent = deepestZone;\n while (parent.parentNode && parent.parentNode !== parent.ownerDocument) {\n deepestZoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n }\n\n // if this element is an svg element and the current deepest is\n // an HTMLElement\n if (deepestZone instanceof domObjects.HTMLElement\n && dropzone instanceof domObjects.SVGElement\n && !(dropzone instanceof domObjects.SVGSVGElement)) {\n\n if (dropzone === deepestZone.parentNode) {\n continue;\n }\n\n parent = dropzone.ownerSVGElement;\n }\n else {\n parent = dropzone;\n }\n\n dropzoneParents = [];\n\n while (parent.parentNode !== parent.ownerDocument) {\n dropzoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n\n n = 0;\n\n // get (position of last common ancestor) + 1\n while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) {\n n++;\n }\n\n const parents = [\n dropzoneParents[n - 1],\n dropzoneParents[n],\n deepestZoneParents[n],\n ];\n\n child = parents[0].lastChild;\n\n while (child) {\n if (child === parents[1]) {\n deepestZone = dropzone;\n index = i;\n deepestZoneParents = [];\n\n break;\n }\n else if (child === parents[2]) {\n break;\n }\n\n child = child.previousSibling;\n }\n }\n\n return index;\n },\n\n matchesUpTo: function (element, selector, limit) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) {\n return true;\n }\n\n element = domUtils.parentNode(element);\n\n if (element === limit) {\n return domUtils.matchesSelector(element, selector);\n }\n }\n\n return false;\n },\n\n getActualElement: function (element) {\n return (element instanceof domObjects.SVGElementInstance\n ? element.correspondingUseElement\n : element);\n },\n\n getScrollXY: function (relevantWindow) {\n relevantWindow = relevantWindow || win.window;\n return {\n x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft,\n y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop,\n };\n },\n\n getElementClientRect: function (element) {\n const clientRect = (element instanceof domObjects.SVGElement\n ? element.getBoundingClientRect()\n : element.getClientRects()[0]);\n\n return clientRect && {\n left : clientRect.left,\n right : clientRect.right,\n top : clientRect.top,\n bottom: clientRect.bottom,\n width : clientRect.width || clientRect.right - clientRect.left,\n height: clientRect.height || clientRect.bottom - clientRect.top,\n };\n },\n\n getElementRect: function (element) {\n const clientRect = domUtils.getElementClientRect(element);\n\n if (!browser.isIOS7 && clientRect) {\n const scroll = domUtils.getScrollXY(win.getWindow(element));\n\n clientRect.left += scroll.x;\n clientRect.right += scroll.x;\n clientRect.top += scroll.y;\n clientRect.bottom += scroll.y;\n }\n\n return clientRect;\n },\n\n getPath: function (element) {\n const path = [];\n\n while (element) {\n path.push(element);\n element = domUtils.parentNode(element);\n }\n\n return path;\n },\n\n trySelector: value => {\n if (!is.string(value)) { return false; }\n\n // an exception will be raised if it is invalid\n domObjects.document.querySelector(value);\n return true;\n },\n};\n\nmodule.exports = domUtils;\n","const is = require('./is');\nconst domUtils = require('./domUtils');\nconst pExtend = require('./pointerExtend');\n\nconst { window, getWindow } = require('./window');\nconst { indexOf, contains } = require('./arr');\n\nconst useAttachEvent = ('attachEvent' in window) && !('addEventListener' in window);\nconst addEvent = useAttachEvent? 'attachEvent': 'addEventListener';\nconst removeEvent = useAttachEvent? 'detachEvent': 'removeEventListener';\nconst on = useAttachEvent? 'on': '';\n\nconst elements = [];\nconst targets = [];\nconst attachedListeners = [];\n\n// {\n// type: {\n// selectors: ['selector', ...],\n// contexts : [document, ...],\n// listeners: [[listener, capture, passive], ...]\n// }\n// }\nconst delegatedEvents = {};\n\nconst documents = [];\n\nconst supportsOptions = !useAttachEvent && (() => {\n let supported = false;\n\n window.document.createElement('div').addEventListener('test', null, {\n get capture () { supported = true; },\n });\n\n return supported;\n})();\n\nfunction add (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n let elementIndex = indexOf(elements, element);\n let target = targets[elementIndex];\n\n if (!target) {\n target = {\n events: {},\n typeCount: 0,\n };\n\n elementIndex = elements.push(element) - 1;\n targets.push(target);\n\n attachedListeners.push(useAttachEvent\n ? {\n supplied: [],\n wrapped : [],\n useCount: [],\n }\n : null);\n }\n\n if (!target.events[type]) {\n target.events[type] = [];\n target.typeCount++;\n }\n\n if (!contains(target.events[type], listener)) {\n let ret;\n\n if (useAttachEvent) {\n const { supplied, wrapped, useCount } = attachedListeners[elementIndex];\n const listenerIndex = indexOf(supplied, listener);\n\n const wrappedListener = wrapped[listenerIndex] || function (event) {\n if (!event.immediatePropagationStopped) {\n event.target = event.srcElement;\n event.currentTarget = element;\n\n event.preventDefault = event.preventDefault || preventDef;\n event.stopPropagation = event.stopPropagation || stopProp;\n event.stopImmediatePropagation = event.stopImmediatePropagation || stopImmProp;\n\n if (/mouse|click/.test(event.type)) {\n event.pageX = event.clientX + getWindow(element).document.documentElement.scrollLeft;\n event.pageY = event.clientY + getWindow(element).document.documentElement.scrollTop;\n }\n\n listener(event);\n }\n };\n\n ret = element[addEvent](on + type, wrappedListener, !!options.capture);\n\n if (listenerIndex === -1) {\n supplied.push(listener);\n wrapped.push(wrappedListener);\n useCount.push(1);\n }\n else {\n useCount[listenerIndex]++;\n }\n }\n else {\n ret = element[addEvent](type, listener, supportsOptions? options : !!options.capture);\n }\n target.events[type].push(listener);\n\n return ret;\n }\n}\n\nfunction remove (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const elementIndex = indexOf(elements, element);\n const target = targets[elementIndex];\n\n if (!target || !target.events) {\n return;\n }\n\n let wrappedListener = listener;\n let listeners;\n let listenerIndex;\n\n if (useAttachEvent) {\n listeners = attachedListeners[elementIndex];\n listenerIndex = indexOf(listeners.supplied, listener);\n wrappedListener = listeners.wrapped[listenerIndex];\n }\n\n if (type === 'all') {\n for (type in target.events) {\n if (target.events.hasOwnProperty(type)) {\n remove(element, type, 'all');\n }\n }\n return;\n }\n\n if (target.events[type]) {\n const len = target.events[type].length;\n\n if (listener === 'all') {\n for (let i = 0; i < len; i++) {\n remove(element, type, target.events[type][i], options);\n }\n return;\n }\n else {\n for (let i = 0; i < len; i++) {\n if (target.events[type][i] === listener) {\n element[removeEvent](on + type, wrappedListener, supportsOptions? options : !!options.capture);\n target.events[type].splice(i, 1);\n\n if (useAttachEvent && listeners) {\n listeners.useCount[listenerIndex]--;\n if (listeners.useCount[listenerIndex] === 0) {\n listeners.supplied.splice(listenerIndex, 1);\n listeners.wrapped.splice(listenerIndex, 1);\n listeners.useCount.splice(listenerIndex, 1);\n }\n }\n\n break;\n }\n }\n }\n\n if (target.events[type] && target.events[type].length === 0) {\n target.events[type] = null;\n target.typeCount--;\n }\n }\n\n if (!target.typeCount) {\n targets.splice(elementIndex, 1);\n elements.splice(elementIndex, 1);\n attachedListeners.splice(elementIndex, 1);\n }\n}\n\nfunction addDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n if (!delegatedEvents[type]) {\n delegatedEvents[type] = {\n selectors: [],\n contexts : [],\n listeners: [],\n };\n\n // add delegate listener functions\n for (let i = 0; i < documents.length; i++) {\n add(documents[i], type, delegateListener);\n add(documents[i], type, delegateUseCapture, true);\n }\n }\n\n const delegated = delegatedEvents[type];\n let index;\n\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n break;\n }\n }\n\n if (index === -1) {\n index = delegated.selectors.length;\n\n delegated.selectors.push(selector);\n delegated.contexts .push(context);\n delegated.listeners.push([]);\n }\n\n // keep listener and capture and passive flags\n delegated.listeners[index].push([listener, !!options.capture, options.passive]);\n}\n\nfunction removeDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const delegated = delegatedEvents[type];\n let matchFound = false;\n let index;\n\n if (!delegated) { return; }\n\n // count from last index of delegated to 0\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n // look for matching selector and context Node\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n\n const listeners = delegated.listeners[index];\n\n // each item of the listeners array is an array: [function, capture, passive]\n for (let i = listeners.length - 1; i >= 0; i--) {\n const [fn, capture, passive] = listeners[i];\n\n // check if the listener functions and capture and passive flags match\n if (fn === listener && capture === !!options.capture && passive === options.passive) {\n // remove the listener from the array of listeners\n listeners.splice(i, 1);\n\n // if all listeners for this interactable have been removed\n // remove the interactable from the delegated arrays\n if (!listeners.length) {\n delegated.selectors.splice(index, 1);\n delegated.contexts .splice(index, 1);\n delegated.listeners.splice(index, 1);\n\n // remove delegate function from context\n remove(context, type, delegateListener);\n remove(context, type, delegateUseCapture, true);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegatedEvents[type] = null;\n }\n }\n\n // only remove one listener\n matchFound = true;\n break;\n }\n }\n\n if (matchFound) { break; }\n }\n }\n}\n\n// bound to the interactable context when a DOM event\n// listener is added to a selector interactable\nfunction delegateListener (event, optionalArg) {\n const options = getOptions(optionalArg);\n const fakeEvent = {};\n const delegated = delegatedEvents[event.type];\n const eventTarget = (domUtils.getActualElement(event.path\n ? event.path[0]\n : event.target));\n let element = eventTarget;\n\n // duplicate the event so that currentTarget can be changed\n pExtend(fakeEvent, event);\n\n fakeEvent.originalEvent = event;\n fakeEvent.preventDefault = preventOriginalDefault;\n\n // climb up document tree looking for selector matches\n while (is.element(element)) {\n for (let i = 0; i < delegated.selectors.length; i++) {\n const selector = delegated.selectors[i];\n const context = delegated.contexts[i];\n\n if (domUtils.matchesSelector(element, selector)\n && domUtils.nodeContains(context, eventTarget)\n && domUtils.nodeContains(context, element)) {\n\n const listeners = delegated.listeners[i];\n\n fakeEvent.currentTarget = element;\n\n for (let j = 0; j < listeners.length; j++) {\n const [fn, capture, passive] = listeners[j];\n\n if (capture === !!options.capture && passive === options.passive) {\n fn(fakeEvent);\n }\n }\n }\n }\n\n element = domUtils.parentNode(element);\n }\n}\n\nfunction delegateUseCapture (event) {\n return delegateListener.call(this, event, true);\n}\n\nfunction preventDef () {\n this.returnValue = false;\n}\n\nfunction preventOriginalDefault () {\n this.originalEvent.preventDefault();\n}\n\nfunction stopProp () {\n this.cancelBubble = true;\n}\n\nfunction stopImmProp () {\n this.cancelBubble = true;\n this.immediatePropagationStopped = true;\n}\n\nfunction getOptions (param) {\n return is.object(param)? param : { capture: param };\n}\n\nmodule.exports = {\n add,\n remove,\n\n addDelegate,\n removeDelegate,\n\n delegateListener,\n delegateUseCapture,\n delegatedEvents,\n documents,\n\n useAttachEvent,\n supportsOptions,\n\n _elements: elements,\n _targets: targets,\n _attachedListeners: attachedListeners,\n};\n","module.exports = function extend (dest, source) {\n for (const prop in source) {\n dest[prop] = source[prop];\n }\n return dest;\n};\n","const {\n resolveRectLike,\n rectToXY,\n} = require('./rect');\n\nmodule.exports = function (target, element, action) {\n const actionOptions = target.options[action];\n const actionOrigin = actionOptions && actionOptions.origin;\n const origin = actionOrigin || target.options.origin;\n\n const originRect = resolveRectLike(origin, target, element, [target && element]);\n\n return rectToXY(originRect) || { x: 0, y: 0 };\n};\n","module.exports = (x, y) => Math.sqrt(x * x + y * y);\n","const extend = require('./extend');\nconst win = require('./window');\n\nconst utils = {\n warnOnce: function (method, message) {\n let warned = false;\n\n return function () {\n if (!warned) {\n win.window.console.warn(message);\n warned = true;\n }\n\n return method.apply(this, arguments);\n };\n },\n\n // http://stackoverflow.com/a/5634528/2280888\n _getQBezierValue: function (t, p1, p2, p3) {\n const iT = 1 - t;\n return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3;\n },\n\n getQuadraticCurvePoint: function (startX, startY, cpX, cpY, endX, endY, position) {\n return {\n x: utils._getQBezierValue(position, startX, cpX, endX),\n y: utils._getQBezierValue(position, startY, cpY, endY),\n };\n },\n\n // http://gizma.com/easing/\n easeOutQuad: function (t, b, c, d) {\n t /= d;\n return -c * t*(t-2) + b;\n },\n\n copyAction: function (dest, src) {\n dest.name = src.name;\n dest.axis = src.axis;\n dest.edges = src.edges;\n\n return dest;\n },\n\n is : require('./is'),\n extend : extend,\n hypot : require('./hypot'),\n getOriginXY: require('./getOriginXY'),\n};\n\nextend(utils, require('./arr'));\nextend(utils, require('./domUtils'));\nextend(utils, require('./pointerUtils'));\nextend(utils, require('./rect'));\n\nmodule.exports = utils;\n","const scope = require('../scope');\nconst utils = require('./index');\n\nconst finder = {\n methodOrder: [ 'simulationResume', 'mouseOrPen', 'hasPointer', 'idle' ],\n\n search: function (pointer, eventType, eventTarget) {\n const pointerType = utils.getPointerType(pointer);\n const pointerId = utils.getPointerId(pointer);\n const details = { pointer, pointerId, pointerType, eventType, eventTarget };\n\n for (const method of finder.methodOrder) {\n const interaction = finder[method](details);\n\n if (interaction) {\n return interaction;\n }\n }\n },\n\n // try to resume simulation with a new pointer\n simulationResume: function ({ pointerType, eventType, eventTarget }) {\n if (!/down|start/i.test(eventType)) {\n return null;\n }\n\n for (const interaction of scope.interactions) {\n let element = eventTarget;\n\n if (interaction.simulation && interaction.simulation.allowResume\n && (interaction.pointerType === pointerType)) {\n while (element) {\n // if the element is the interaction element\n if (element === interaction.element) {\n return interaction;\n }\n element = utils.parentNode(element);\n }\n }\n }\n\n return null;\n },\n\n // if it's a mouse or pen interaction\n mouseOrPen: function ({ pointerId, pointerType, eventType }) {\n if (pointerType !== 'mouse' && pointerType !== 'pen') {\n return null;\n }\n\n let firstNonActive;\n\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType) {\n // if it's a down event, skip interactions with running simulations\n if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; }\n\n // if the interaction is active, return it immediately\n if (interaction.interacting()) {\n return interaction;\n }\n // otherwise save it and look for another active interaction\n else if (!firstNonActive) {\n firstNonActive = interaction;\n }\n }\n }\n\n // if no active mouse interaction was found use the first inactive mouse\n // interaction\n if (firstNonActive) {\n return firstNonActive;\n }\n\n // find any mouse or pen interaction.\n // ignore the interaction if the eventType is a *down, and a simulation\n // is active\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType && !(/down/i.test(eventType) && interaction.simulation)) {\n return interaction;\n }\n }\n\n return null;\n },\n\n // get interaction that has this pointer\n hasPointer: function ({ pointerId }) {\n for (const interaction of scope.interactions) {\n if (utils.contains(interaction.pointerIds, pointerId)) {\n return interaction;\n }\n }\n },\n\n // get first idle interaction with a matching pointerType\n idle: function ({ pointerType }) {\n for (const interaction of scope.interactions) {\n // if there's already a pointer held down\n if (interaction.pointerIds.length === 1) {\n const target = interaction.target;\n // don't add this pointer if there is a target interactable and it\n // isn't gesturable\n if (target && !target.options.gesture.enabled) {\n continue;\n }\n }\n // maximum of 2 pointers per interaction\n else if (interaction.pointerIds.length >= 2) {\n continue;\n }\n\n if (!interaction.interacting() && (pointerType === interaction.pointerType)) {\n return interaction;\n }\n }\n\n return null;\n },\n};\n\nmodule.exports = finder;\n","const win = require('./window');\nconst isWindow = require('./isWindow');\n\nconst is = {\n array : () => {},\n\n window : thing => thing === win.window || isWindow(thing),\n\n docFrag : thing => is.object(thing) && thing.nodeType === 11,\n\n object : thing => !!thing && (typeof thing === 'object'),\n\n function: thing => typeof thing === 'function',\n\n number : thing => typeof thing === 'number' ,\n\n bool : thing => typeof thing === 'boolean' ,\n\n string : thing => typeof thing === 'string' ,\n\n element: thing => {\n if (!thing || (typeof thing !== 'object')) { return false; }\n\n const _window = win.getWindow(thing) || win.window;\n\n return (/object|function/.test(typeof _window.Element)\n ? thing instanceof _window.Element //DOM2\n : thing.nodeType === 1 && typeof thing.nodeName === 'string');\n },\n};\n\nis.array = thing => (is.object(thing)\n && (typeof thing.length !== 'undefined')\n && is.function(thing.splice));\n\nmodule.exports = is;\n","module.exports = (thing) => !!(thing && thing.Window) && (thing instanceof thing.Window);\n","function pointerExtend (dest, source) {\n for (const prop in source) {\n const prefixedPropREs = module.exports.prefixedPropREs;\n let deprecated = false;\n\n // skip deprecated prefixed properties\n for (const vendor in prefixedPropREs) {\n if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) {\n deprecated = true;\n break;\n }\n }\n\n if (!deprecated && typeof source[prop] !== 'function') {\n dest[prop] = source[prop];\n }\n }\n return dest;\n}\n\npointerExtend.prefixedPropREs = {\n webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/,\n};\n\nmodule.exports = pointerExtend;\n","const hypot = require('./hypot');\nconst browser = require('./browser');\nconst dom = require('./domObjects');\nconst domUtils = require('./domUtils');\nconst domObjects = require('./domObjects');\nconst is = require('./is');\nconst pointerExtend = require('./pointerExtend');\n\nconst pointerUtils = {\n copyCoords: function (dest, src) {\n dest.page = dest.page || {};\n dest.page.x = src.page.x;\n dest.page.y = src.page.y;\n\n dest.client = dest.client || {};\n dest.client.x = src.client.x;\n dest.client.y = src.client.y;\n\n dest.timeStamp = src.timeStamp;\n },\n\n setCoordDeltas: function (targetObj, prev, cur) {\n targetObj.page.x = cur.page.x - prev.page.x;\n targetObj.page.y = cur.page.y - prev.page.y;\n targetObj.client.x = cur.client.x - prev.client.x;\n targetObj.client.y = cur.client.y - prev.client.y;\n targetObj.timeStamp = cur.timeStamp - prev.timeStamp;\n\n // set pointer velocity\n const dt = Math.max(targetObj.timeStamp / 1000, 0.001);\n\n targetObj.page.speed = hypot(targetObj.page.x, targetObj.page.y) / dt;\n targetObj.page.vx = targetObj.page.x / dt;\n targetObj.page.vy = targetObj.page.y / dt;\n\n targetObj.client.speed = hypot(targetObj.client.x, targetObj.page.y) / dt;\n targetObj.client.vx = targetObj.client.x / dt;\n targetObj.client.vy = targetObj.client.y / dt;\n },\n\n isNativePointer: function (pointer) {\n return (pointer instanceof dom.Event || pointer instanceof dom.Touch);\n },\n\n // Get specified X/Y coords for mouse or event.touches[0]\n getXY: function (type, pointer, xy) {\n xy = xy || {};\n type = type || 'page';\n\n xy.x = pointer[type + 'X'];\n xy.y = pointer[type + 'Y'];\n\n return xy;\n },\n\n getPageXY: function (pointer, page) {\n page = page || {};\n\n // Opera Mobile handles the viewport and scrolling oddly\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n pointerUtils.getXY('screen', pointer, page);\n\n page.x += window.scrollX;\n page.y += window.scrollY;\n }\n else {\n pointerUtils.getXY('page', pointer, page);\n }\n\n return page;\n },\n\n getClientXY: function (pointer, client) {\n client = client || {};\n\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n // Opera Mobile handles the viewport and scrolling oddly\n pointerUtils.getXY('screen', pointer, client);\n }\n else {\n pointerUtils.getXY('client', pointer, client);\n }\n\n return client;\n },\n\n getPointerId: function (pointer) {\n return is.number(pointer.pointerId)? pointer.pointerId : pointer.identifier;\n },\n\n setCoords: function (targetObj, pointers, timeStamp) {\n const pointer = (pointers.length > 1\n ? pointerUtils.pointerAverage(pointers)\n : pointers[0]);\n\n const tmpXY = {};\n\n pointerUtils.getPageXY(pointer, tmpXY);\n targetObj.page.x = tmpXY.x;\n targetObj.page.y = tmpXY.y;\n\n pointerUtils.getClientXY(pointer, tmpXY);\n targetObj.client.x = tmpXY.x;\n targetObj.client.y = tmpXY.y;\n\n targetObj.timeStamp = is.number(timeStamp) ? timeStamp :new Date().getTime();\n },\n\n pointerExtend: pointerExtend,\n\n getTouchPair: function (event) {\n const touches = [];\n\n // array of touches is supplied\n if (is.array(event)) {\n touches[0] = event[0];\n touches[1] = event[1];\n }\n // an event\n else {\n if (event.type === 'touchend') {\n if (event.touches.length === 1) {\n touches[0] = event.touches[0];\n touches[1] = event.changedTouches[0];\n }\n else if (event.touches.length === 0) {\n touches[0] = event.changedTouches[0];\n touches[1] = event.changedTouches[1];\n }\n }\n else {\n touches[0] = event.touches[0];\n touches[1] = event.touches[1];\n }\n }\n\n return touches;\n },\n\n pointerAverage: function (pointers) {\n const average = {\n pageX : 0,\n pageY : 0,\n clientX: 0,\n clientY: 0,\n screenX: 0,\n screenY: 0,\n };\n\n for (const pointer of pointers) {\n for (const prop in average) {\n average[prop] += pointer[prop];\n }\n }\n for (const prop in average) {\n average[prop] /= pointers.length;\n }\n\n return average;\n },\n\n touchBBox: function (event) {\n if (!event.length && !(event.touches && event.touches.length > 1)) {\n return;\n }\n\n const touches = pointerUtils.getTouchPair(event);\n const minX = Math.min(touches[0].pageX, touches[1].pageX);\n const minY = Math.min(touches[0].pageY, touches[1].pageY);\n const maxX = Math.max(touches[0].pageX, touches[1].pageX);\n const maxY = Math.max(touches[0].pageY, touches[1].pageY);\n\n return {\n x: minX,\n y: minY,\n left: minX,\n top: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n },\n\n touchDistance: function (event, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n\n\n const dx = touches[0][sourceX] - touches[1][sourceX];\n const dy = touches[0][sourceY] - touches[1][sourceY];\n\n return hypot(dx, dy);\n },\n\n touchAngle: function (event, prevAngle, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n const dx = touches[1][sourceX] - touches[0][sourceX];\n const dy = touches[1][sourceY] - touches[0][sourceY];\n const angle = 180 * Math.atan2(dy , dx) / Math.PI;\n\n return angle;\n },\n\n getPointerType: function (pointer) {\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : is.number(pointer.pointerType)\n ? [undefined, undefined,'touch', 'pen', 'mouse'][pointer.pointerType]\n // if the PointerEvent API isn't available, then the \"pointer\" must\n // be either a MouseEvent, TouchEvent, or Touch object\n : /touch/.test(pointer.type) || pointer instanceof domObjects.Touch\n ? 'touch'\n : 'mouse';\n },\n\n // [ event.target, event.currentTarget ]\n getEventTargets: function (event) {\n return [\n domUtils.getActualElement(event.path ? event.path[0] : event.target),\n domUtils.getActualElement(event.currentTarget),\n ];\n },\n};\n\nmodule.exports = pointerUtils;\n","const { window } = require('./window');\n\nconst vendors = ['ms', 'moz', 'webkit', 'o'];\nlet lastTime = 0;\nlet request;\nlet cancel;\n\nfor (let x = 0; x < vendors.length && !window.requestAnimationFrame; x++) {\n request = window[vendors[x] + 'RequestAnimationFrame'];\n cancel = window[vendors[x] +'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n}\n\nif (!request) {\n request = function (callback) {\n const currTime = new Date().getTime();\n const timeToCall = Math.max(0, 16 - (currTime - lastTime));\n const id = setTimeout(function () { callback(currTime + timeToCall); },\n timeToCall);\n\n lastTime = currTime + timeToCall;\n return id;\n };\n}\n\nif (!cancel) {\n cancel = function (id) {\n clearTimeout(id);\n };\n}\n\nmodule.exports = {\n request,\n cancel,\n};\n","const extend = require('./extend');\nconst is = require('./is');\nconst {\n closest,\n parentNode,\n getElementRect,\n} = require('./domUtils');\n\nconst rectUtils = {\n getStringOptionResult: function (value, interactable, element) {\n if (!is.string(value)) {\n return null;\n }\n\n if (value === 'parent') {\n value = parentNode(element);\n }\n else if (value === 'self') {\n value = interactable.getRect(element);\n }\n else {\n value = closest(element, value);\n }\n\n return value;\n },\n\n resolveRectLike: function (value, interactable, element, functionArgs) {\n value = rectUtils.getStringOptionResult(value, interactable, element) || value;\n\n if (is.function(value)) {\n value = value.apply(null, functionArgs);\n }\n\n if (is.element(value)) {\n value = getElementRect(value);\n }\n\n return value;\n },\n\n rectToXY: function (rect) {\n return rect && {\n x: 'x' in rect ? rect.x : rect.left,\n y: 'y' in rect ? rect.y : rect.top,\n };\n },\n\n xywhToTlbr: function (rect) {\n if (rect && !('left' in rect && 'top' in rect)) {\n rect = extend({}, rect);\n\n rect.left = rect.x || 0;\n rect.top = rect.y || 0;\n rect.right = rect.right || (rect.left + rect.width);\n rect.bottom = rect.bottom || (rect.top + rect.height);\n }\n\n return rect;\n },\n\n tlbrToXywh: function (rect) {\n if (rect && !('x' in rect && 'y' in rect)) {\n rect = extend({}, rect);\n\n rect.x = rect.left || 0;\n rect.top = rect.top || 0;\n rect.width = rect.width || (rect.right - rect.x);\n rect.height = rect.height || (rect.bottom - rect.y);\n }\n\n return rect;\n },\n};\n\nmodule.exports = rectUtils;\n","const win = module.exports;\nconst isWindow = require('./isWindow');\n\nfunction init (window) {\n // get wrapped window if using Shadow DOM polyfill\n\n win.realWindow = window;\n\n // create a TextNode\n const el = window.document.createTextNode('');\n\n // check if it's wrapped by a polyfill\n if (el.ownerDocument !== window.document\n && typeof window.wrap === 'function'\n && window.wrap(el) === el) {\n // use wrapped window\n window = window.wrap(window);\n }\n\n win.window = window;\n}\n\nif (typeof window === 'undefined') {\n win.window = undefined;\n win.realWindow = undefined;\n}\nelse {\n init(window);\n}\n\nwin.getWindow = function getWindow (node) {\n if (isWindow(node)) {\n return node;\n }\n\n const rootNode = (node.ownerDocument || node);\n\n return rootNode.defaultView || rootNode.parentWindow || win.window;\n};\n\nwin.init = init;\n"]} \ No newline at end of file diff --git a/dist/interact.min.js b/dist/interact.min.js index c0bb2476c..2d1f0fb62 100644 --- a/dist/interact.min.js +++ b/dist/interact.min.js @@ -1,6 +1,6 @@ -/* interact.js v1.3.0-alpha.3+sha.9595c40 | https://raw.github.com/taye/interact.js/master/LICENSE */ -!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var t;t="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,t.interact=e()}}(function(){return function e(t,n,r){function i(s,a){if(!n[s]){if(!t[s]){var l="function"==typeof require&&require;if(!a&&l)return l(s,!0);if(o)return o(s,!0);var c=new Error("Cannot find module '"+s+"'");throw c.code="MODULE_NOT_FOUND",c}var p=n[s]={exports:{}};t[s][0].call(p.exports,function(e){var n=t[s][1][e];return i(n||e)},p,p.exports,e,t,n,r)}return n[s].exports}for(var o="function"==typeof require&&require,s=0;s6&&void 0!==arguments[6]&&arguments[6];r(this,e);var f=t.target,v=(f&&f.options||s).deltaSource,g=o(f,p,l),h="start"===c,m="end"===c,y=h?t.startCoords:t.curCoords,x=t.prevEvent;p=p||t.element;var b=i({},y.page),w=i({},y.client);b.x-=g.x,b.y-=g.y,w.x-=g.x,w.y-=g.y,this.ctrlKey=n.ctrlKey,this.altKey=n.altKey,this.shiftKey=n.shiftKey,this.metaKey=n.metaKey,this.button=n.button,this.buttons=n.buttons,this.target=p,this.currentTarget=p,this.relatedTarget=u||null,this.preEnd=d,this.type=l+(c||""),this.interaction=t,this.interactable=f,this.t0=h?t.downTimes[t.downTimes.length-1]:x.t0;var E={interaction:t,event:n,action:l,phase:c,element:p,related:u,page:b,client:w,coords:y,starting:h,ending:m,deltaSource:v,iEvent:this};a.fire("set-xy",E),m?(this.pageX=x.pageX,this.pageY=x.pageY,this.clientX=x.clientX,this.clientY=x.clientY):(this.pageX=b.x,this.pageY=b.y,this.clientX=w.x,this.clientY=w.y),this.x0=t.startCoords.page.x-g.x,this.y0=t.startCoords.page.y-g.y,this.clientX0=t.startCoords.client.x-g.x,this.clientY0=t.startCoords.client.y-g.y,a.fire("set-delta",E),this.timeStamp=y.timeStamp,this.dt=t.pointerDelta.timeStamp,this.duration=this.timeStamp-this.t0,this.speed=t.pointerDelta[v].speed,this.velocityX=t.pointerDelta[v].vx,this.velocityY=t.pointerDelta[v].vy,this.swipe=m||"inertiastart"===c?this.getSwipe():null,a.fire("new",E)}return e.prototype.getSwipe=function(){var e=this.interaction;if(e.prevEvent.speed<600||this.timeStamp-e.prevEvent.timeStamp>150)return null;var t=180*Math.atan2(e.prevEvent.velocityY,e.prevEvent.velocityX)/Math.PI;t<0&&(t+=360);var n=112.5<=t&&t<247.5,r=202.5<=t&&t<337.5,i=!n&&(292.5<=t||t<67.5);return{up:r,down:!r&&22.5<=t&&t<157.5,left:n,right:i,angle:t,speed:e.prevEvent.speed,velocity:{x:e.prevEvent.velocityX,y:e.prevEvent.velocityY}}},e.prototype.preventDefault=function(){},e.prototype.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},e.prototype.stopPropagation=function(){this.propagationStopped=!0},e}();a.on("set-delta",function(e){var t=e.iEvent,n=e.interaction,r=e.starting,i=e.deltaSource,o=r?t:n.prevEvent;"client"===i?(t.dx=t.clientX-o.clientX,t.dy=t.clientY-o.clientY):(t.dx=t.pageX-o.pageX,t.dy=t.pageY-o.pageY)}),l.signals=a,t.exports=l},{"./defaultOptions":18,"./utils/Signals":35,"./utils/extend":41,"./utils/getOriginXY":42}],4:[function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=e("./utils/is"),o=e("./utils/events"),s=e("./utils/extend"),a=e("./actions/base"),l=e("./scope"),c=e("./Eventable"),p=e("./defaultOptions"),u=e("./utils/Signals").new(),d=e("./utils/domUtils"),f=d.getElementRect,v=d.nodeContains,g=d.trySelector,h=e("./utils/window"),m=h.getWindow,y=e("./utils/arr"),x=y.indexOf,b=y.contains,w=e("./utils/browser"),E=w.wheelEvent;l.interactables=[];var S=function(){function e(t,n){r(this,e),n=n||{},this.target=t,this.events=new c,this._context=n.context||l.document,this._win=m(g(t)?this._context:t),this._doc=this._win.document,u.fire("new",{target:t,options:n,interactable:this,win:this._win}),l.addDocument(this._doc,this._win),l.interactables.push(this),this.set(n)}return e.prototype.setOnEvents=function(e,t){var n="on"+e;return i.function(t.onstart)&&(this.events[n+"start"]=t.onstart),i.function(t.onmove)&&(this.events[n+"move"]=t.onmove),i.function(t.onend)&&(this.events[n+"end"]=t.onend),i.function(t.oninertiastart)&&(this.events[n+"inertiastart"]=t.oninertiastart),this},e.prototype.setPerAction=function(e,t){for(var n in t)n in p[e]&&(i.object(t[n])?(this.options[e][n]=s(this.options[e][n]||{},t[n]),i.object(p.perAction[n])&&"enabled"in p.perAction[n]&&(this.options[e][n].enabled=!1!==t[n].enabled)):i.bool(t[n])&&i.object(p.perAction[n])?this.options[e][n].enabled=t[n]:void 0!==t[n]&&(this.options[e][n]=t[n]))},e.prototype.getRect=function(e){return e=e||this.target,i.string(this.target)&&!i.element(e)&&(e=this._context.querySelector(this.target)),f(e)},e.prototype.rectChecker=function(e){return i.function(e)?(this.getRect=e,this):null===e?(delete this.options.getRect,this):this.getRect},e.prototype._backCompatOption=function(e,t){if(g(t)||i.object(t)){this.options[e]=t;for(var n=a.names,r=Array.isArray(n),o=0,n=r?n:n[Symbol.iterator]();;){var s;if(r){if(o>=n.length)break;s=n[o++]}else{if(o=n.next(),o.done)break;s=o.value}var l=s;this.options[l][e]=t}return this}return this.options[e]},e.prototype.origin=function(e){return this._backCompatOption("origin",e)},e.prototype.deltaSource=function(e){return"page"===e||"client"===e?(this.options.deltaSource=e,this):this.options.deltaSource},e.prototype.context=function(){return this._context},e.prototype.inContext=function(e){return this._context===e.ownerDocument||v(this._context,e)},e.prototype.fire=function(e){return this.events.fire(e),this},e.prototype._onOffMultiple=function(e,t,n,r){if(i.string(t)&&-1!==t.search(" ")&&(t=t.trim().split(/ +/)),i.array(t)){for(var o=0;o=l.length)break;f=l[d++]}else{if(d=l.next(),d.done)break;f=d.value}var v=f;this.options[v]=p.base[v],v in t&&this[v](t[v])}return u.fire("set",{options:t,interactable:this}),this},e.prototype.unset=function(){if(o.remove(this.target,"all"),i.string(this.target))for(var e in o.delegatedEvents){var t=o.delegatedEvents[e];t.selectors[0]===this.target&&t.contexts[0]===this._context&&(t.selectors.splice(0,1),t.contexts.splice(0,1),t.listeners.splice(0,1),t.selectors.length||(t[e]=null)),o.remove(this._context,e,o.delegateListener),o.remove(this._context,e,o.delegateUseCapture,!0)}else o.remove(this,"all");u.fire("unset",{interactable:this}),l.interactables.splice(x(l.interactables,this),1);for(var n=l.interactions||[],r=Array.isArray(n),s=0,n=r?n:n[Symbol.iterator]();;){var a;if(r){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var c=a;c.target===this&&c.interacting()&&c.stop()}return l.interact},e}();l.interactables.indexOfElement=function(e,t){t=t||l.document;for(var n=0;n=y.length)break;w=y[b++]}else{if(b=y.next(),b.done)break;w=b.value}var E=w,S=E[0],T=E[1];T._updateEventTargets(r,i),T[e](S,t,r,i)}}}function o(e){for(var t=0;te.pointerMoveTolerance);var a={pointer:t,pointerIndex:this.getPointerIndex(t),event:n,eventTarget:r,dx:o,dy:s,duplicate:i,interaction:this,interactingBeforeMove:this.interacting()};i||l.setCoordDeltas(this.pointerDelta,this.prevCoords,this.curCoords),d.fire("move",a),i||(this.interacting()&&this.doMove(a),this.pointerWasMoved&&l.copyCoords(this.prevCoords,this.curCoords))},e.prototype.doMove=function(e){e=l.extend({pointer:this.pointers[0],event:this.prevEvent,eventTarget:this._eventTarget,interaction:this},e||{}),d.fire("before-action-move",e),this._dontFireMove||d.fire("action-move",e),this._dontFireMove=!1},e.prototype.pointerUp=function(e,t,n,r){var i=this.getPointerIndex(e);d.fire(/cancel$/i.test(t.type)?"cancel":"up",{pointer:e,pointerIndex:i,event:t,eventTarget:n,curEventTarget:r,interaction:this}),this.simulation||this.end(t),this.pointerIsDown=!1,this.removePointer(e,t)},e.prototype.end=function(e){e=e||this.prevEvent,this.interacting()&&d.fire("action-end",{event:e,interaction:this}),this.stop()},e.prototype.currentAction=function(){return this._interacting?this.prepared.name:null},e.prototype.interacting=function(){return this._interacting},e.prototype.stop=function(){d.fire("stop",{interaction:this}),this._interacting&&(d.fire("stop-active",{interaction:this}),d.fire("stop-"+this.prepared.name,{interaction:this})),this.target=this.element=null,this._interacting=!1,this.prepared.name=this.prevEvent=null},e.prototype.getPointerIndex=function(e){return l.indexOf(this.pointerIds,l.getPointerId(e))},e.prototype.updatePointer=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:t&&/(down|start)$/i.test(t.type),r=l.getPointerId(e),i=this.getPointerIndex(e);return-1===i&&(i=this.pointerIds.length,this.pointerIds[i]=r),n&&d.fire("update-pointer-down",{pointer:e,event:t,down:n,pointerId:r,pointerIndex:i,interaction:this}),this.pointers[i]=e,i},e.prototype.removePointer=function(e,t){var n=l.getPointerId(e),r=this.mouse?0:l.indexOf(this.pointerIds,n);-1!==r&&(d.fire("remove-pointer",{pointer:e,event:t,pointerIndex:r,interaction:this}),this.pointers.splice(r,1),this.pointerIds.splice(r,1),this.downTargets.splice(r,1),this.downTimes.splice(r,1))},e.prototype._updateEventTargets=function(e,t){this._eventTarget=e,this._curEventTarget=t},e}(),m=0,y=v.length;m=i.length)break;a=i[s++]}else{if(s=i.next(),s.done)break;a=s.value}var l=a;if(l.options.drop.enabled){var c=l.options.drop.accept;if(!(p.is.element(c)&&c!==t||p.is.string(c)&&!p.matchesSelector(t,c)))for(var d=p.is.string(l.target)?l._context.querySelectorAll(l.target):[l.target],f=0;fo.left&&c.xo.top&&c.y=o.left&&v<=o.right&&g>=o.top&&g<=o.bottom}if(f&&p.is.number(a)){s=Math.max(0,Math.min(o.right,f.right)-Math.max(o.left,f.left))*Math.max(0,Math.min(o.bottom,f.bottom)-Math.max(o.top,f.top))/(f.width*f.height)>=a}return this.options.drop.checker&&(s=this.options.drop.checker(e,t,s,this,i,n,r)),s},v.signals.on("unset",function(e){e.interactable.dropzone(!1)}),v.settingsMethods.push("dropChecker"),g.signals.on("new",function(e){e.dropTarget=null,e.dropElement=null,e.prevDropTarget=null,e.prevDropElement=null,e.dropEvents=null,e.activeDrops={dropzones:[],elements:[],rects:[]}}),g.signals.on("stop",function(e){var t=e.interaction;t.dropTarget=t.dropElement=t.prevDropTarget=t.prevDropElement=null}),d.dynamicDrop=function(e){return p.is.bool(e)?(y=e,d):y},p.merge(v.eventTypes,["dragenter","dragleave","dropactivate","dropdeactivate","dropmove","drop"]),c.methodDict.drop="dropzone",h.drop=m.defaults,t.exports=m},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../interact":21,"../scope":34,"../utils":44,"./base":6}],9:[function(e,t,n){"use strict";var r=e("./base"),i=e("../utils"),o=e("../InteractEvent"),s=e("../Interactable"),a=e("../Interaction"),l=e("../defaultOptions"),c={defaults:{enabled:!1,origin:null,restrict:null},checker:function(e,t,n,r,i){return i.pointerIds.length>=2?{name:"gesture"}:null},getCursor:function(){return""}};o.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;"gesturestart"===t.type&&(t.ds=0,n.gesture.startDistance=n.gesture.prevDistance=t.distance,n.gesture.startAngle=n.gesture.prevAngle=t.angle,n.gesture.scale=1)}),o.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;"gesturemove"===t.type&&(t.ds=t.scale-n.gesture.scale,n.target.fire(t),n.gesture.prevAngle=t.angle,n.gesture.prevDistance=t.distance,t.scale===1/0||null===t.scale||void 0===t.scale||isNaN(t.scale)||(n.gesture.scale=t.scale))}),s.prototype.gesturable=function(e){return i.is.object(e)?(this.options.gesture.enabled=!1!==e.enabled,this.setPerAction("gesture",e),this.setOnEvents("gesture",e),this):i.is.bool(e)?(this.options.gesture.enabled=e,e||(this.ongesturestart=this.ongesturestart=this.ongestureend=null),this):this.options.gesture},o.signals.on("set-delta",function(e){var t=e.interaction,n=e.iEvent,r=e.action,s=e.event,a=e.starting,l=e.ending,c=e.deltaSource;if("gesture"===r){var p=t.pointers;n.touches=[p[0],p[1]],a?(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=1,n.ds=0,n.angle=i.touchAngle(p,void 0,c),n.da=0):l||s instanceof o?(n.distance=t.prevEvent.distance,n.box=t.prevEvent.box,n.scale=t.prevEvent.scale,n.ds=n.scale-1,n.angle=t.prevEvent.angle,n.da=n.angle-t.gesture.startAngle):(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=n.distance/t.gesture.startDistance,n.angle=i.touchAngle(p,t.gesture.prevAngle,c),n.ds=n.scale-t.gesture.prevScale,n.da=n.angle-t.gesture.prevAngle)}}),a.signals.on("new",function(e){e.gesture={start:{x:0,y:0},startDistance:0,prevDistance:0,distance:0,scale:1,startAngle:0,prevAngle:0}}),r.gesture=c,r.names.push("gesture"),i.merge(s.eventTypes,["gesturestart","gesturemove","gestureend"]),r.methodDict.gesture="gesturable",l.gesture=c.defaults,t.exports=c},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"./base":6}],10:[function(e,t,n){"use strict";function r(e,t,n,r,i,s,a){if(!t)return!1;if(!0===t){var l=o.is.number(s.width)?s.width:s.right-s.left,c=o.is.number(s.height)?s.height:s.bottom-s.top;if(l<0&&("left"===e?e="right":"right"===e&&(e="left")),c<0&&("top"===e?e="bottom":"bottom"===e&&(e="top")),"left"===e)return n.x<(l>=0?s.left:s.right)+a;if("top"===e)return n.y<(c>=0?s.top:s.bottom)+a;if("right"===e)return n.x>(l>=0?s.right:s.left)-a;if("bottom"===e)return n.y>(c>=0?s.bottom:s.top)-a}return!!o.is.element(r)&&(o.is.element(t)?t===r:o.matchesUpTo(r,t,i))}var i=e("./base"),o=e("../utils"),s=e("../utils/browser"),a=e("../InteractEvent"),l=e("../Interactable"),c=e("../Interaction"),p=e("../defaultOptions"),u=s.supportsTouch||s.supportsPointerEvent?20:10,d={defaults:{enabled:!1,mouseButtons:null,origin:null,snap:null,restrict:null,inertia:null,autoScroll:null,square:!1,preserveAspectRatio:!1,axis:"xy",margin:NaN,edges:null,invert:"none"},checker:function(e,t,n,i,s,a){if(!a)return null;var l=o.extend({},s.curCoords.page),c=n.options;if(c.resize.enabled){var p=c.resize,d={left:!1,right:!1,top:!1,bottom:!1};if(o.is.object(p.edges)){for(var f in d)d[f]=r(f,p.edges[f],l,s._eventTarget,i,a,p.margin||u);if(d.left=d.left&&!d.right,d.top=d.top&&!d.bottom,d.left||d.right||d.top||d.bottom)return{name:"resize",edges:d}}else{var v="y"!==c.resize.axis&&l.x>a.right-u,g="x"!==c.resize.axis&&l.y>a.bottom-u;if(v||g)return{name:"resize",axes:(v?"x":"")+(g?"y":"")}}}return null},cursors:s.isIe9OrOlder?{x:"e-resize",y:"s-resize",xy:"se-resize",top:"n-resize",left:"w-resize",bottom:"s-resize",right:"e-resize",topleft:"se-resize",bottomright:"se-resize",topright:"ne-resize",bottomleft:"ne-resize"}:{x:"ew-resize",y:"ns-resize",xy:"nwse-resize",top:"ns-resize",left:"ew-resize",bottom:"ns-resize",right:"ew-resize",topleft:"nwse-resize",bottomright:"nwse-resize",topright:"nesw-resize",bottomleft:"nesw-resize"},getCursor:function(e){if(e.axis)return d.cursors[e.name+e.axis];if(e.edges){for(var t="",n=["top","bottom","left","right"],r=0;r<4;r++)e.edges[n[r]]&&(t+=n[r]);return d.cursors[t]}}};a.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;if("resizestart"===t.type&&n.prepared.edges){var r=n.target.getRect(n.element),i=n.target.options.resize;if(i.square||i.preserveAspectRatio){var s=o.extend({},n.prepared.edges);s.top=s.top||s.left&&!s.bottom,s.left=s.left||s.top&&!s.right,s.bottom=s.bottom||s.right&&!s.top,s.right=s.right||s.bottom&&!s.left,n.prepared._linkedEdges=s}else n.prepared._linkedEdges=null;i.preserveAspectRatio&&(n.resizeStartAspectRatio=r.width/r.height),n.resizeRects={start:r,current:o.extend({},r),inverted:o.extend({},r),previous:o.extend({},r),delta:{left:0,right:0,width:0,top:0,bottom:0,height:0}},t.rect=n.resizeRects.inverted,t.deltaRect=n.resizeRects.delta}}),a.signals.on("new",function(e){var t=e.iEvent,n=e.phase,r=e.interaction;if("move"===n&&r.prepared.edges){var i=r.target.options.resize,s=i.invert,a="reposition"===s||"negate"===s,l=r.prepared.edges,c=r.resizeRects.start,p=r.resizeRects.current,u=r.resizeRects.inverted,d=r.resizeRects.delta,f=o.extend(r.resizeRects.previous,u),v=l,g=t.dx,h=t.dy;if(i.preserveAspectRatio||i.square){var m=i.preserveAspectRatio?r.resizeStartAspectRatio:1;l=r.prepared._linkedEdges,v.left&&v.bottom||v.right&&v.top?h=-g/m:v.left||v.right?h=g/m:(v.top||v.bottom)&&(g=h*m)}if(l.top&&(p.top+=h),l.bottom&&(p.bottom+=h),l.left&&(p.left+=g),l.right&&(p.right+=g),a){if(o.extend(u,p),"reposition"===s){var y=void 0;u.top>u.bottom&&(y=u.top,u.top=u.bottom,u.bottom=y),u.left>u.right&&(y=u.left,u.left=u.right,u.right=y)}}else u.top=Math.min(p.top,c.bottom),u.bottom=Math.max(p.bottom,c.top),u.left=Math.min(p.left,c.right),u.right=Math.max(p.right,c.left);u.width=u.right-u.left,u.height=u.bottom-u.top;for(var x in u)d[x]=u[x]-f[x];t.edges=r.prepared.edges,t.rect=u,t.deltaRect=d}}),l.prototype.resizable=function(e){return o.is.object(e)?(this.options.resize.enabled=!1!==e.enabled,this.setPerAction("resize",e),this.setOnEvents("resize",e),/^x$|^y$|^xy$/.test(e.axis)?this.options.resize.axis=e.axis:null===e.axis&&(this.options.resize.axis=p.resize.axis),o.is.bool(e.preserveAspectRatio)?this.options.resize.preserveAspectRatio=e.preserveAspectRatio:o.is.bool(e.square)&&(this.options.resize.square=e.square),this):o.is.bool(e)?(this.options.resize.enabled=e,e||(this.onresizestart=this.onresizestart=this.onresizeend=null),this):this.options.resize},c.signals.on("new",function(e){ -e.resizeAxes="xy"}),a.signals.on("set-delta",function(e){var t=e.interaction,n=e.iEvent;"resize"===e.action&&t.resizeAxes&&(t.target.options.resize.square?("y"===t.resizeAxes?n.dx=n.dy:n.dy=n.dx,n.axes="xy"):(n.axes=t.resizeAxes,"x"===t.resizeAxes?n.dy=0:"y"===t.resizeAxes&&(n.dx=0)))}),i.resize=d,i.names.push("resize"),o.merge(l.eventTypes,["resizestart","resizemove","resizeinertiastart","resizeinertiaresume","resizeend"]),i.methodDict.resize="resizable",p.resize=d.defaults,t.exports=d},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"../utils/browser":37,"./base":6}],11:[function(e,t,n){"use strict";var r=e("./utils/raf"),i=e("./utils/window").getWindow,o=e("./utils/is"),s=e("./utils/domUtils"),a=e("./Interaction"),l=e("./defaultOptions"),c={defaults:{enabled:!1,container:null,margin:60,speed:300},interaction:null,i:null,x:0,y:0,isScrolling:!1,prevTime:0,start:function(e){c.isScrolling=!0,r.cancel(c.i),c.interaction=e,c.prevTime=(new Date).getTime(),c.i=r.request(c.scroll)},stop:function(){c.isScrolling=!1,r.cancel(c.i)},scroll:function(){var e=c.interaction.target.options[c.interaction.prepared.name].autoScroll,t=e.container||i(c.interaction.element),n=(new Date).getTime(),s=(n-c.prevTime)/1e3,a=e.speed*s;a>=1&&(o.window(t)?t.scrollBy(c.x*a,c.y*a):t&&(t.scrollLeft+=c.x*a,t.scrollTop+=c.y*a),c.prevTime=n),c.isScrolling&&(r.cancel(c.i),c.i=r.request(c.scroll))},check:function(e,t){var n=e.options;return n[t].autoScroll&&n[t].autoScroll.enabled},onInteractionMove:function(e){var t=e.interaction,n=e.pointer;if(t.interacting()&&c.check(t.target,t.prepared.name)){if(t.simulation)return void(c.x=c.y=0);var r=void 0,a=void 0,l=void 0,p=void 0,u=t.target.options[t.prepared.name].autoScroll,d=u.container||i(t.element);if(o.window(d))p=n.clientXd.innerWidth-c.margin,l=n.clientY>d.innerHeight-c.margin;else{var f=s.getElementClientRect(d);p=n.clientXf.right-c.margin,l=n.clientY>f.bottom-c.margin}c.x=a?1:p?-1:0,c.y=l?1:r?-1:0,c.isScrolling||(c.margin=u.margin,c.speed=u.speed,c.start(t))}}};a.signals.on("stop-active",function(){c.stop()}),a.signals.on("action-move",c.onInteractionMove),l.perAction.autoScroll=c.defaults,t.exports=c},{"./Interaction":5,"./defaultOptions":18,"./utils/domUtils":39,"./utils/is":46,"./utils/raf":50,"./utils/window":52}],12:[function(e,t,n){"use strict";var r=e("../Interactable"),i=e("../actions/base"),o=e("../utils/is"),s=e("../utils/domUtils");r.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},r.prototype.ignoreFrom=function(e){return this._backCompatOption("ignoreFrom",e)},r.prototype.allowFrom=function(e){return this._backCompatOption("allowFrom",e)},r.prototype.testIgnore=function(e,t,n){return!(!e||!o.element(n))&&(o.string(e)?s.matchesUpTo(n,e,t):!!o.element(e)&&s.nodeContains(e,n))},r.prototype.testAllow=function(e,t,n){return!e||!!o.element(n)&&(o.string(e)?s.matchesUpTo(n,e,t):!!o.element(e)&&s.nodeContains(e,n))},r.prototype.testIgnoreAllow=function(e,t,n){return!this.testIgnore(e.ignoreFrom,t,n)&&this.testAllow(e.allowFrom,t,n)},r.prototype.actionChecker=function(e){return o.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},r.prototype.styleCursor=function(e){return o.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},r.prototype.defaultActionChecker=function(e,t,n,r){for(var o=this.getRect(r),s=null,a=i.names,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var u=p;if((!n.pointerIsDown||!n.mouse||0!=(t.buttons&this.options[u].mouseButtons))&&(s=i[u].checker(e,t,this,r,n,o)))return s}}},{"../Interactable":4,"../actions/base":6,"../utils/domUtils":39,"../utils/is":46}],13:[function(e,t,n){"use strict";function r(e,t,n,r){return g.is.object(e)&&t.testIgnoreAllow(t.options[e.name],n,r)&&t.options[e.name].enabled&&a(t,n,e)?e:null}function i(e,t,n,i,o,s){for(var a=0,l=i.length;a=m.maxInteractions)return!1;if(u.target===e){if((a+=d===n.name|0)>=i)return!1;if(u.element===t&&(l++,d!==n.name||l>=o))return!1}}}return m.maxInteractions>0}}var l=e("../interact"),c=e("../Interactable"),p=e("../Interaction"),u=e("../actions/base"),d=e("../defaultOptions"),f=e("../utils/browser"),v=e("../scope"),g=e("../utils"),h=e("../utils/Signals").new();e("./InteractableMethods");var m={signals:h,withinInteractionLimit:a,maxInteractions:1/0,defaults:{perAction:{manualStart:!1,max:1/0,maxPerElement:1,allowFrom:null,ignoreFrom:null}},setActionDefaults:function(e){g.extend(e.defaults,m.defaults.perAction)}};p.signals.on("down",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;if(!t.interacting()){s(t,o(t,n,r,i))}}),p.signals.on("move",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;if(t.mouse&&!t.pointerIsDown&&!t.interacting()){s(t,o(t,n,r,i))}}),p.signals.on("move",function(e){var t=e.interaction,n=e.event;if(t.pointerIsDown&&!t.interacting()&&t.pointerWasMoved&&t.prepared.name){h.fire("before-start",e);var r=t.target;t.prepared.name&&r&&(r.options[t.prepared.name].manualStart||!a(r,t.element,t.prepared)?t.stop(n):t.start(t.prepared,r,t.element))}}),p.signals.on("stop",function(e){var t=e.interaction,n=t.target;n&&n.options.styleCursor&&(n._doc.documentElement.style.cursor="")}),c.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},c.prototype.actionChecker=function(e){return g.is.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},c.prototype.styleCursor=function(e){return g.is.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},c.prototype.defaultActionChecker=function(e,t,n,r){for(var i=this.getRect(r),o=t.buttons||{0:1,1:4,3:8,4:16}[t.button],s=null,a=u.names,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var d=p;if((!n.pointerIsDown||!n.mouse||0!=(o&this.options[d].mouseButtons))&&(s=u[d].checker(e,t,this,r,n,i)))return s}},l.maxInteractions=function(e){return g.is.number(e)?(m.maxInteractions=e,this):m.maxInteractions},c.settingsMethods.push("styleCursor"),c.settingsMethods.push("actionChecker"),c.settingsMethods.push("ignoreFrom"),c.settingsMethods.push("allowFrom"),d.base.actionChecker=null,d.base.styleCursor=!0,g.extend(d.perAction,m.defaults.perAction),t.exports=m},{"../Interactable":4,"../Interaction":5,"../actions/base":6,"../defaultOptions":18,"../interact":21,"../scope":34,"../utils":44,"../utils/Signals":35,"../utils/browser":37,"./InteractableMethods":12}],14:[function(e,t,n){"use strict";var r=e("./base"),i=e("../Interaction");i.signals.on("new",function(e){e.delayTimer=null}),r.signals.on("prepared",function(e){var t=e.interaction,n=t.prepared.name;if(n){var r=t.target.options[n].delay;r>0&&(t.delayTimer=setTimeout(function(){t.start(t.prepared,t.target,t.element)},r))}}),i.signals.on("move",function(e){var t=e.interaction,n=e.duplicate;t.pointerWasMoved&&!n&&clearTimeout(t.delayTimer)}),r.signals.on("before-start",function(e){var t=e.interaction,n=t.prepared.name;if(n){t.target.options[n].delay>0&&(t.prepared.name=null)}})},{"../Interaction":5,"./base":13}],15:[function(e,t,n){"use strict";function r(e,t){if(!t)return!1;var n=t.options.drag.startAxis;return"xy"===e||"xy"===n||n===e}var i=e("./base"),o=e("../scope"),s=e("../utils/browser"),a=e("../utils/is"),l=e("../utils/domUtils"),c=l.matchesSelector,p=l.parentNode;i.setActionDefaults(e("../actions/drag")),i.signals.on("before-start",function(e){var t=e.interaction,n=e.eventTarget,l=e.dx,u=e.dy;if("drag"===t.prepared.name){var d=Math.abs(l),f=Math.abs(u),v=t.target.options.drag,g=v.startAxis,h=d>f?"x":dl.minSpeed&&g>l.endSpeed,b={interaction:t,pageCoords:v,statuses:f,preEnd:!0,requireEndOnly:!0};y&&!x&&(c.resetStatuses(f),m=c.setAll(b),m.shouldMove&&m.locked&&(h=!0)),(x||h)&&(p.copyCoords(i.upCoords,t.curCoords),t.pointers[0]=i.startEvent=new a(t,n,t.prepared.name,"inertiastart",t.element),i.t0=d,i.active=!0,i.allowResume=l.allowResume,t.simulation=i,o.fire(i.startEvent),x?(i.vx0=t.pointerDelta.client.vx,i.vy0=t.pointerDelta.client.vy,i.v0=g,r(t,i),p.extend(v,t.curCoords.page),v.x+=i.xe,v.y+=i.ye,c.resetStatuses(f),m=c.setAll(b),i.modifiedXe+=m.dx,i.modifiedYe+=m.dy,i.i=u.request(t.boundInertiaFrame)):(i.smoothEnd=!0,i.xe=m.dx,i.ye=m.dy,i.sx=i.sy=0,i.i=u.request(t.boundSmoothEndFrame)))}}),l.signals.on("stop-active",function(e){var t=e.interaction,n=t.inertiaStatus;n.active&&(u.cancel(n.i),n.active=!1,t.simulation=null)})},{"./InteractEvent":3,"./Interaction":5,"./modifiers":24,"./utils":44,"./utils/raf":50}],21:[function(e,t,n){"use strict";function r(e,t){var n=a.interactables.get(e,t);return n||(n=new l(e,t),n.events.global=p),n}var i=e("./utils/browser"),o=e("./utils/events"),s=e("./utils"),a=e("./scope"),l=e("./Interactable"),c=e("./Interaction"),p={};r.isSet=function(e,t){return-1!==a.interactables.indexOfElement(e,t&&t.context)},r.on=function(e,t,n){if(s.is.string(e)&&-1!==e.search(" ")&&(e=e.trim().split(/ +/)),s.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.on(f,t,n)}return r}if(s.is.object(e)){for(var v in e)r.on(v,e[v],t);return r}return s.contains(l.eventTypes,e)?p[e]?p[e].push(t):p[e]=[t]:o.add(a.document,e,t,{options:n}),r},r.off=function(e,t,n){if(s.is.string(e)&&-1!==e.search(" ")&&(e=e.trim().split(/ +/)),s.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.off(f,t,n)}return r}if(s.is.object(e)){for(var v in e)r.off(v,e[v],t);return r}if(s.contains(l.eventTypes,e)){var g=void 0;e in p&&-1!==(g=s.indexOf(p[e],t))&&p[e].splice(g,1)}else o.remove(a.document,e,t,n);return r},r.debug=function(){return a},r.getPointerAverage=s.pointerAverage,r.getTouchBBox=s.touchBBox,r.getTouchDistance=s.touchDistance,r.getTouchAngle=s.touchAngle,r.getElementRect=s.getElementRect,r.getElementClientRect=s.getElementClientRect,r.matchesSelector=s.matchesSelector,r.closest=s.closest,r.supportsTouch=function(){return i.supportsTouch},r.supportsPointerEvent=function(){return i.supportsPointerEvent},r.stop=function(e){for(var t=a.interactions.length-1;t>=0;t--)a.interactions[t].stop(e);return r},r.pointerMoveTolerance=function(e){return s.is.number(e)?(c.pointerMoveTolerance=e,this):c.pointerMoveTolerance},r.addDocument=a.addDocument,r.removeDocument=a.removeDocument,a.interact=r,t.exports=r},{"./Interactable":4,"./Interaction":5,"./scope":34,"./utils":44,"./utils/browser":37,"./utils/events":40}],22:[function(e,t,n){"use strict";function r(e){var t=e.interaction,n=e.event;t.target&&t.target.checkAndPreventDefault(n)}var i=e("./Interactable"),o=e("./Interaction"),s=e("./scope"),a=e("./utils/is"),l=e("./utils/events"),c=e("./utils/domUtils"),p=c.nodeContains,u=c.matchesSelector;i.prototype.preventDefault=function(e){return/^(always|never|auto)$/.test(e)?(this.options.preventDefault=e,this):a.bool(e)?(this.options.preventDefault=e?"always":"never",this):this.options.preventDefault},i.prototype.checkAndPreventDefault=function(e){var t=this.options.preventDefault;if("never"!==t)return"always"===t?void e.preventDefault():void(l.supportsOptions||/^(mouse|pointer|touch)*(down|start)/i.test(e.type)||a.element(e.target)&&u(e.target,"input,select,textarea,[contenteditable=true],[contenteditable=true] *")||e.preventDefault())};for(var d=["down","move","up","cancel"],f=0;f=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i;if(o.element&&(o.element===e.target||p(o.element,e.target)))return void o.target.checkAndPreventDefault(e)}}},{"./Interactable":4,"./Interaction":5,"./scope":34,"./utils/domUtils":39,"./utils/events":40,"./utils/is":46}],23:[function(e,t,n){"use strict";function r(e){var t=e.target,n=a.search(e,e.type,t);n&&n.prevTap&&e.clientX===n.prevTap.clientX&&e.clientY===n.prevTap.clientY&&t===n.prevTap.target&&(n.downTargets[0]=t,n.downTimes[0]=(new Date).getTime(),l.fire({interaction:n,event:e,eventTarget:t,pointer:e,type:"tap"}))}var i=e("./scope"),o=e("./utils/events"),s=e("./utils/browser"),a=e("./utils/interactionFinder"),l=e("./pointerEvents/base"),c=e("./utils/window"),p=c.window,u=Object.prototype.toString;if(p.Array.isArray||(p.Array.isArray=function(e){return"[object Array]"===u.call(e)}),String.prototype.trim||(String.prototype.trim=function(){return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")}),s.isIE8){var d=function(e){for(var t=i.interactions,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var o;if(n){if(r>=t.length)break;o=t[r++]}else{if(r=t.next(),r.done)break;o=r.value}var s=o;s.interacting()&&s.target.checkAndPreventDefault(e)}},f=function(e,t){var n=e.doc,i=(e.win,0===t.indexOf("listen")?o.add:o.remove);i(n,"selectstart",d),l&&i(n,"dblclick",r)};i.signals.on("add-document",f),i.signals.on("remove-document",f)}t.exports=null},{"./pointerEvents/base":31,"./scope":34,"./utils/browser":37,"./utils/events":40,"./utils/interactionFinder":45,"./utils/window":52}],24:[function(e,t,n){"use strict";function r(e,t,n){return e&&e.enabled&&(t||!e.endOnly)&&(!n||e.endOnly)}var i=e("../InteractEvent"),o=e("../Interaction"),s=e("../utils/extend"),a={names:[],setOffsets:function(e){var t=e.interaction,n=e.pageCoords,r=t.target,i=t.element,o=t.startOffset,s=r.getRect(i);s?(o.left=n.x-s.left,o.top=n.y-s.top,o.right=s.right-n.x,o.bottom=s.bottom-n.y,"width"in s||(s.width=s.right-s.left),"height"in s||(s.height=s.bottom-s.top)):o.left=o.top=o.right=o.bottom=0,e.rect=s,e.interactable=r,e.element=i;for(var l=0;l=p.length)break;f=p[d++]}else{if(d=p.next(),d.done)break;f=d.value}var v=f,g=a[v],h=t.target.options[t.prepared.name][v];r(h,i,o)&&(e.status=e.status=n[v],e.options=h,e.offset=e.interaction.modifierOffsets[v],g.set(e),e.status.locked&&(l.x+=e.status.dx,l.y+=e.status.dy,c.dx+=e.status.dx,c.dy+=e.status.dy,c.locked=!0))}return c.shouldMove=!e.status||!c.locked||e.status.changed,c},resetStatuses:function(e){for(var t=a.names,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var i;if(n){if(r>=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i,s=e[o]||{};s.dx=s.dy=0,s.modifiedX=s.modifiedY=NaN,s.locked=!1,s.changed=!0,e[o]=s}return e},start:function(e,t){var n=e.interaction,r={interaction:n,pageCoords:("action-resume"===t?n.curCoords:n.startCoords).page,startOffset:n.startOffset,statuses:n.modifierStatuses,preEnd:!1,requireEndOnly:!1};a.setOffsets(r),a.resetStatuses(r.statuses),r.pageCoords=s({},n.startCoords.page),n.modifierResult=a.setAll(r)}};o.signals.on("new",function(e){e.startOffset={left:0,right:0,top:0,bottom:0},e.modifierOffsets={},e.modifierStatuses=a.resetStatuses({}),e.modifierResult=null}),o.signals.on("action-start",a.start),o.signals.on("action-resume",a.start),o.signals.on("before-action-move",function(e){var t=e.interaction,n=e.preEnd,r=e.interactingBeforeMove,i=a.setAll({interaction:t,preEnd:n,pageCoords:t.curCoords.page,statuses:t.modifierStatuses,requireEndOnly:!1});!i.shouldMove&&r&&(t._dontFireMove=!0),t.modifierResult=i}),o.signals.on("action-end",function(e){for(var t=e.interaction,n=e.event,i=0;i=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}var m=h,y=m.x,x=m.y;l.push({x:s.left-i.width*y+u.x,y:s.top-i.height*x+u.y})}else l.push(u);return l},set:function(e){var t=e.interaction,n=e.pageCoords,r=e.status,i=e.options,s=e.offset,a=[],l=void 0,c=void 0,p=void 0;if(r.useStatusXY)c={x:r.x,y:r.y};else{var u=o.getOriginXY(t.target,t.element,t.prepared.name);c=o.extend({},n),c.x-=u.x,c.y-=u.y}r.realX=c.x,r.realY=c.y;for(var d=i.targets?i.targets.length:0,f=s,v=Array.isArray(f),g=0,f=v?f:f[Symbol.iterator]();;){var h;if(v){if(g>=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}for(var m=h,y=m.x,x=m.y,b=c.x-y,w=c.y-x,E=i.targets,S=Array.isArray(E),T=0,E=S?E:E[Symbol.iterator]();;){var C;if(S){if(T>=E.length)break;C=E[T++]}else{if(T=E.next(),T.done)break;C=T.value}var A=C;l=o.is.function(A)?A(b,w,t):A,l&&a.push({x:o.is.number(l.x)?l.x+y:b,y:o.is.number(l.y)?l.y+x:w,range:o.is.number(l.range)?l.range:i.range})}}var D={target:null,inRange:!1,distance:0,range:0,dx:0,dy:0};for(p=0,d=a.length;p=p.length)break;f=p[d++]}else{if(d=p.next(),d.done)break;f=d.value}var v=f,g=void 0;g=a.is.function(v)?v(l,c,t):v,g&&("width"in g&&"height"in g&&(g.x=g.width,g.y=g.height),e.options.targets.push(g))}i.set(e)},modifyCoords:function(e){var t=e.options;e.options=a.extend({},t), -e.options.enabled=t.enabled,e.options.relativePoints=[null],i.modifyCoords(e)}};r.snapSize=l,r.names.push("snapSize"),o.perAction.snapSize=l.defaults,s.defaults.snapSize=l.defaults,t.exports=l},{"../actions/resize":10,"../defaultOptions":18,"../utils/":44,"./index":24,"./snap":28}],30:[function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=e("../utils/pointerUtils");t.exports=function(){function e(t,n,o,s,a){if(r(this,e),i.pointerExtend(this,o),o!==n&&i.pointerExtend(this,n),this.interaction=a,this.timeStamp=(new Date).getTime(),this.originalEvent=o,this.type=t,this.pointerId=i.getPointerId(n),this.pointerType=i.getPointerType(n,a),this.target=s,this.currentTarget=null,"tap"===t){var l=a.getPointerIndex(n);this.dt=this.timeStamp-a.downTimes[l];var c=this.timeStamp-a.tapTime;this.double=!!(a.prevTap&&"doubletap"!==a.prevTap.type&&a.prevTap.target===this.target&&c<500)}else"doubletap"===t&&(this.dt=n.timeStamp-a.tapTime)}return e.prototype.subtractOrigin=function(e){var t=e.x,n=e.y;return this.pageX-=t,this.pageY-=n,this.clientX-=t,this.clientY-=n,this},e.prototype.addOrigin=function(e){var t=e.x,n=e.y;return this.pageX+=t,this.pageY+=n,this.clientX+=t,this.clientY+=n,this},e.prototype.preventDefault=function(){this.originalEvent.preventDefault()},e.prototype.stopPropagation=function(){this.propagationStopped=!0},e.prototype.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},e}()},{"../utils/pointerUtils":49}],31:[function(e,t,n){"use strict";function r(e){for(var t=e.interaction,n=e.pointer,s=e.event,l=e.eventTarget,c=e.type,u=void 0===c?e.pointerEvent.type:c,d=e.targets,f=void 0===d?i(e):d,v=e.pointerEvent,g=void 0===v?new o(u,n,s,l,t):v,h={interaction:t,pointer:n,event:s,eventTarget:l,targets:f,type:u,pointerEvent:g},m=0;m=u.length)break;g=u[v++]}else{if(v=u.next(),v.done)break;g=v.value}var h=g;c.element=h,p.fire("collect-targets",c)}return"hold"===o&&(c.targets=d(c.targets,function(e){return e.eventable.options.holdDuration===t.holdTimers[s].duration})),c.targets}var o=e("./PointerEvent"),s=e("../Interaction"),a=e("../utils"),l=e("../utils/browser"),c=e("../defaultOptions"),p=e("../utils/Signals").new(),u=e("../utils/arr"),d=u.filter,f=["down","up","cancel"],v=["down","up","cancel"],g={PointerEvent:o,fire:r,collectEventTargets:i,signals:p,defaults:{holdDuration:600,ignoreFrom:null,allowFrom:null,origin:{x:0,y:0}},types:["down","move","up","cancel","tap","doubletap","hold"]};s.signals.on("update-pointer-down",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers[n]={duration:1/0,timeout:null}}),s.signals.on("remove-pointer",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers.splice(n,1)}),s.signals.on("move",function(e){var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,s=e.duplicateMove,a=t.getPointerIndex(n);s||t.pointerIsDown&&!t.pointerWasMoved||(t.pointerIsDown&&clearTimeout(t.holdTimers[a].timeout),r({interaction:t,pointer:n,event:i,eventTarget:o,type:"move"}))}),s.signals.on("down",function(e){for(var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,s=e.pointerIndex,c=l.isIE8?a.extend({},i):i,u=t.holdTimers[s],d=a.getPath(o),f={interaction:t,pointer:n,event:i,eventTarget:o,type:"hold",targets:[],path:d,element:null},v=d,g=Array.isArray(v),h=0,v=g?v:v[Symbol.iterator]();;){var m;if(g){if(h>=v.length)break;m=v[h++]}else{if(h=v.next(),h.done)break;m=h.value}var y=m;f.element=y,p.fire("collect-targets",f)}if(f.targets.length){for(var x=1/0,b=0;b=0&&(p.selectors[u]!==e||p.contexts[u]!==t);u--);-1===u&&(u=p.selectors.length,p.selectors.push(e),p.contexts.push(t),p.listeners.push([])),p.listeners[u].push([i,!!s.capture,s.passive])}function s(e,t,n,r,o){var s=f(o),c=O[n],p=!1,u=void 0;if(c)for(u=c.selectors.length-1;u>=0;u--)if(c.selectors[u]===e&&c.contexts[u]===t){for(var d=c.listeners[u],v=d.length-1;v>=0;v--){var g=d[v],h=g[0],m=g[1],y=g[2];if(h===r&&m===!!s.capture&&y===s.passive){d.splice(v,1),d.length||(c.selectors.splice(u,1),c.contexts.splice(u,1),c.listeners.splice(u,1),i(t,n,a),i(t,n,l,!0),c.selectors.length||(O[n]=null)),p=!0;break}}if(p)break}}function a(e,t){var n=f(t),r={},i=O[e.type],o=g.getActualElement(e.path?e.path[0]:e.target),s=o;for(h(r,e),r.originalEvent=e,r.preventDefault=p;v.element(s);){for(var a=0;a=l.length)break;u=l[p++]}else{if(p=l.next(),p.done)break;u=p.value}var d=u,f=s[d](a);if(f)return f}},simulationResume:function(e){var t=e.mouseEvent,n=e.eventType,o=e.eventTarget;if(!/down|start/i.test(n))return null;for(var s=r.interactions,a=Array.isArray(s),l=0,s=a?s:s[Symbol.iterator]();;){var c;if(a){if(l>=s.length)break;c=s[l++]}else{if(l=s.next(),l.done)break;c=l.value}var p=c,u=o;if(p.simulation&&p.simulation.allowResume&&p.mouse===t)for(;u;){if(u===p.element)return p;u=i.parentNode(u)}}return null},mouse:function(e){var t=e.pointerId,n=e.mouseEvent,s=e.eventType;if(!n&&(o.supportsTouch||o.supportsPointerEvent))return null;for(var a=void 0,l=r.interactions,c=Array.isArray(l),p=0,l=c?l:l[Symbol.iterator]();;){var u;if(c){if(p>=l.length)break;u=l[p++]}else{if(p=l.next(),p.done)break;u=p.value}var d=u;if(d.mouse){if(d.simulation&&!i.contains(d.pointerIds,t))continue;if(d.interacting())return d;a||(a=d)}}if(a)return a;for(var f=r.interactions,v=Array.isArray(f),g=0,f=v?f:f[Symbol.iterator]();;){var h;if(v){if(g>=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}var m=h;if(m.mouse&&(!/down/.test(s)||!m.simulation))return m}return null},hasPointer:function(e){for(var t=e.pointerId,n=r.interactions,o=Array.isArray(n),s=0,n=o?n:n[Symbol.iterator]();;){var a;if(o){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var l=a;if(i.contains(l.pointerIds,t))return l}},idle:function(e){for(var t=e.mouseEvent,n=r.interactions,i=Array.isArray(n),o=0,n=i?n:n[Symbol.iterator]();;){var s;if(i){if(o>=n.length)break;s=n[o++]}else{if(o=n.next(),o.done)break;s=o.value}var a=s;if(1===a.pointerIds.length){var l=a.target;if(l&&!l.options.gesture.enabled)continue}else if(a.pointerIds.length>=2)continue;if(!a.interacting()&&t===a.mouse)return a}return null}};t.exports=s},{"../scope":34,"./browser":37,"./index":44}],46:[function(e,t,n){"use strict";var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},i=e("./window"),o=e("./isWindow"),s={array:function(){},window:function(e){return e===i.window||o(e)},docFrag:function(e){return s.object(e)&&11===e.nodeType},object:function(e){return!!e&&"object"===(void 0===e?"undefined":r(e))},function:function(e){return"function"==typeof e},number:function(e){return"number"==typeof e},bool:function(e){return"boolean"==typeof e},string:function(e){return"string"==typeof e},element:function(e){if(!e||"object"!==(void 0===e?"undefined":r(e)))return!1;var t=i.getWindow(e)||i.window;return/object|function/.test(r(t.Element))?e instanceof t.Element:1===e.nodeType&&"string"==typeof e.nodeName}};s.array=function(e){return s.object(e)&&void 0!==e.length&&s.function(e.splice)},t.exports=s},{"./isWindow":47,"./window":52}],47:[function(e,t,n){"use strict";t.exports=function(e){return!(!e||!e.Window)&&e instanceof e.Window}},{}],48:[function(e,t,n){"use strict";function r(e,n){for(var r in n){var i=t.exports.prefixedPropREs,o=!1;for(var s in i)if(0===r.indexOf(s)&&i[s].test(r)){o=!0;break}o||"function"==typeof n[r]||(e[r]=n[r])}return e}r.prefixedPropREs={webkit:/(Movement[XY]|Radius[XY]|RotationAngle|Force)$/},t.exports=r},{}],49:[function(e,t,n){"use strict";var r=e("./hypot"),i=e("./browser"),o=e("./domObjects"),s=e("./domUtils"),a=e("./is"),l=e("./pointerExtend"),c={copyCoords:function(e,t){e.page=e.page||{},e.page.x=t.page.x,e.page.y=t.page.y,e.client=e.client||{},e.client.x=t.client.x,e.client.y=t.client.y,e.timeStamp=t.timeStamp},setCoordDeltas:function(e,t,n){e.page.x=n.page.x-t.page.x,e.page.y=n.page.y-t.page.y,e.client.x=n.client.x-t.client.x,e.client.y=n.client.y-t.client.y,e.timeStamp=n.timeStamp-t.timeStamp;var i=Math.max(e.timeStamp/1e3,.001);e.page.speed=r(e.page.x,e.page.y)/i,e.page.vx=e.page.x/i,e.page.vy=e.page.y/i,e.client.speed=r(e.client.x,e.page.y)/i,e.client.vx=e.client.x/i,e.client.vy=e.client.y/i},isNativePointer:function(e){return e instanceof o.Event||e instanceof o.Touch},getXY:function(e,t,n){return n=n||{},e=e||"page",n.x=t[e+"X"],n.y=t[e+"Y"],n},getPageXY:function(e,t){return t=t||{},i.isOperaMobile&&c.isNativePointer(e)?(c.getXY("screen",e,t),t.x+=window.scrollX,t.y+=window.scrollY):c.getXY("page",e,t),t},getClientXY:function(e,t){return t=t||{},i.isOperaMobile&&c.isNativePointer(e)?c.getXY("screen",e,t):c.getXY("client",e,t),t},getPointerId:function(e){return a.number(e.pointerId)?e.pointerId:e.identifier},setCoords:function(e,t,n){var r=t.length>1?c.pointerAverage(t):t[0],i={};c.getPageXY(r,i),e.page.x=i.x,e.page.y=i.y,c.getClientXY(r,i),e.client.x=i.x,e.client.y=i.y,e.timeStamp=a.number(n)?n:(new Date).getTime()},pointerExtend:l,getTouchPair:function(e){var t=[];return a.array(e)?(t[0]=e[0],t[1]=e[1]):"touchend"===e.type?1===e.touches.length?(t[0]=e.touches[0],t[1]=e.changedTouches[0]):0===e.touches.length&&(t[0]=e.changedTouches[0],t[1]=e.changedTouches[1]):(t[0]=e.touches[0],t[1]=e.touches[1]),t},pointerAverage:function(e){for(var t={pageX:0,pageY:0,clientX:0,clientY:0,screenX:0,screenY:0},n=e,r=Array.isArray(n),i=0,n=r?n:n[Symbol.iterator]();;){var o;if(r){if(i>=n.length)break;o=n[i++]}else{if(i=n.next(),i.done)break;o=i.value}var s=o;for(var a in t)t[a]+=s[a]}for(var l in t)t[l]/=e.length;return t},touchBBox:function(e){if(e.length||e.touches&&e.touches.length>1){var t=c.getTouchPair(e),n=Math.min(t[0].pageX,t[1].pageX),r=Math.min(t[0].pageY,t[1].pageY);return{x:n,y:r,left:n,top:r,width:Math.max(t[0].pageX,t[1].pageX)-n,height:Math.max(t[0].pageY,t[1].pageY)-r}}},touchDistance:function(e,t){var n=t+"X",i=t+"Y",o=c.getTouchPair(e),s=o[0][n]-o[1][n],a=o[0][i]-o[1][i];return r(s,a)},touchAngle:function(e,t,n){var r=n+"X",i=n+"Y",o=c.getTouchPair(e),s=o[1][r]-o[0][r],a=o[1][i]-o[0][i];return 180*Math.atan2(a,s)/Math.PI},getPointerType:function(e,t){return t.mouse?"mouse":i.supportsPointerEvent?a.string(e.pointerType)?e.pointerType:[void 0,void 0,"touch","pen","mouse"][e.pointerType]:"touch"},getEventTargets:function(e){return[s.getActualElement(e.path?e.path[0]:e.target),s.getActualElement(e.currentTarget)]}};t.exports=c},{"./browser":37,"./domObjects":38,"./domUtils":39,"./hypot":43,"./is":46,"./pointerExtend":48}],50:[function(e,t,n){"use strict";for(var r=e("./window"),i=r.window,o=["ms","moz","webkit","o"],s=0,a=void 0,l=void 0,c=0;c6&&void 0!==arguments[6]&&arguments[6];r(this,e);var f=t.target,v=(f&&f.options||s).deltaSource,g=o(f,p,l),h="start"===c,m="end"===c,y=h?t.startCoords:t.curCoords,x=t.prevEvent;p=p||t.element;var b=i({},y.page),w=i({},y.client);b.x-=g.x,b.y-=g.y,w.x-=g.x,w.y-=g.y,this.ctrlKey=n.ctrlKey,this.altKey=n.altKey,this.shiftKey=n.shiftKey,this.metaKey=n.metaKey,this.button=n.button,this.buttons=n.buttons,this.target=p,this.currentTarget=p,this.relatedTarget=u||null,this.preEnd=d,this.type=l+(c||""),this.interaction=t,this.interactable=f,this.t0=h?t.downTimes[t.downTimes.length-1]:x.t0;var E={interaction:t,event:n,action:l,phase:c,element:p,related:u,page:b,client:w,coords:y,starting:h,ending:m,deltaSource:v,iEvent:this};a.fire("set-xy",E),m?(this.pageX=x.pageX,this.pageY=x.pageY,this.clientX=x.clientX,this.clientY=x.clientY):(this.pageX=b.x,this.pageY=b.y,this.clientX=w.x,this.clientY=w.y),this.x0=t.startCoords.page.x-g.x,this.y0=t.startCoords.page.y-g.y,this.clientX0=t.startCoords.client.x-g.x,this.clientY0=t.startCoords.client.y-g.y,a.fire("set-delta",E),this.timeStamp=y.timeStamp,this.dt=t.pointerDelta.timeStamp,this.duration=this.timeStamp-this.t0,this.speed=t.pointerDelta[v].speed,this.velocityX=t.pointerDelta[v].vx,this.velocityY=t.pointerDelta[v].vy,this.swipe=m||"inertiastart"===c?this.getSwipe():null,a.fire("new",E)}return e.prototype.getSwipe=function(){var e=this.interaction;if(e.prevEvent.speed<600||this.timeStamp-e.prevEvent.timeStamp>150)return null;var t=180*Math.atan2(e.prevEvent.velocityY,e.prevEvent.velocityX)/Math.PI;t<0&&(t+=360);var n=112.5<=t&&t<247.5,r=202.5<=t&&t<337.5,i=!n&&(292.5<=t||t<67.5);return{up:r,down:!r&&22.5<=t&&t<157.5,left:n,right:i,angle:t,speed:e.prevEvent.speed,velocity:{x:e.prevEvent.velocityX,y:e.prevEvent.velocityY}}},e.prototype.preventDefault=function(){},e.prototype.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},e.prototype.stopPropagation=function(){this.propagationStopped=!0},e}();a.on("set-delta",function(e){var t=e.iEvent,n=e.interaction,r=e.starting,i=e.deltaSource,o=r?t:n.prevEvent;"client"===i?(t.dx=t.clientX-o.clientX,t.dy=t.clientY-o.clientY):(t.dx=t.pageX-o.pageX,t.dy=t.pageY-o.pageY)}),l.signals=a,t.exports=l},{"./defaultOptions":18,"./utils/Signals":35,"./utils/extend":41,"./utils/getOriginXY":42}],4:[function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=e("./utils/is"),o=e("./utils/events"),s=e("./utils/extend"),a=e("./actions/base"),l=e("./scope"),c=e("./Eventable"),p=e("./defaultOptions"),u=e("./utils/Signals").new(),d=e("./utils/domUtils"),f=d.getElementRect,v=d.nodeContains,g=d.trySelector,h=e("./utils/window"),m=h.getWindow,y=e("./utils/arr"),x=y.indexOf,b=y.contains,w=e("./utils/browser"),E=w.wheelEvent;l.interactables=[];var S=function(){function e(t,n){r(this,e),n=n||{},this.target=t,this.events=new c,this._context=n.context||l.document,this._win=m(g(t)?this._context:t),this._doc=this._win.document,u.fire("new",{target:t,options:n,interactable:this,win:this._win}),l.addDocument(this._doc,this._win),l.interactables.push(this),this.set(n)}return e.prototype.setOnEvents=function(e,t){var n="on"+e;return i.function(t.onstart)&&(this.events[n+"start"]=t.onstart),i.function(t.onmove)&&(this.events[n+"move"]=t.onmove),i.function(t.onend)&&(this.events[n+"end"]=t.onend),i.function(t.oninertiastart)&&(this.events[n+"inertiastart"]=t.oninertiastart),this},e.prototype.setPerAction=function(e,t){for(var n in t)n in p[e]&&(i.object(t[n])?(this.options[e][n]=s(this.options[e][n]||{},t[n]),i.object(p.perAction[n])&&"enabled"in p.perAction[n]&&(this.options[e][n].enabled=!1!==t[n].enabled)):i.bool(t[n])&&i.object(p.perAction[n])?this.options[e][n].enabled=t[n]:void 0!==t[n]&&(this.options[e][n]=t[n]))},e.prototype.getRect=function(e){return e=e||this.target,i.string(this.target)&&!i.element(e)&&(e=this._context.querySelector(this.target)),f(e)},e.prototype.rectChecker=function(e){return i.function(e)?(this.getRect=e,this):null===e?(delete this.options.getRect,this):this.getRect},e.prototype._backCompatOption=function(e,t){if(g(t)||i.object(t)){this.options[e]=t;for(var n=a.names,r=Array.isArray(n),o=0,n=r?n:n[Symbol.iterator]();;){var s;if(r){if(o>=n.length)break;s=n[o++]}else{if(o=n.next(),o.done)break;s=o.value}var l=s;this.options[l][e]=t}return this}return this.options[e]},e.prototype.origin=function(e){return this._backCompatOption("origin",e)},e.prototype.deltaSource=function(e){return"page"===e||"client"===e?(this.options.deltaSource=e,this):this.options.deltaSource},e.prototype.context=function(){return this._context},e.prototype.inContext=function(e){return this._context===e.ownerDocument||v(this._context,e)},e.prototype.fire=function(e){return this.events.fire(e),this},e.prototype._onOffMultiple=function(e,t,n,r){if(i.string(t)&&-1!==t.search(" ")&&(t=t.trim().split(/ +/)),i.array(t)){for(var o=0;o=l.length)break;f=l[d++]}else{if(d=l.next(),d.done)break;f=d.value}var v=f;this.options[v]=p.base[v],v in t&&this[v](t[v])}return u.fire("set",{options:t,interactable:this}),this},e.prototype.unset=function(){if(o.remove(this.target,"all"),i.string(this.target))for(var e in o.delegatedEvents){var t=o.delegatedEvents[e];t.selectors[0]===this.target&&t.contexts[0]===this._context&&(t.selectors.splice(0,1),t.contexts.splice(0,1),t.listeners.splice(0,1),t.selectors.length||(t[e]=null)),o.remove(this._context,e,o.delegateListener),o.remove(this._context,e,o.delegateUseCapture,!0)}else o.remove(this,"all");u.fire("unset",{interactable:this}),l.interactables.splice(x(l.interactables,this),1);for(var n=l.interactions||[],r=Array.isArray(n),s=0,n=r?n:n[Symbol.iterator]();;){var a;if(r){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var c=a;c.target===this&&c.interacting()&&c.stop()}return l.interact},e}();l.interactables.indexOfElement=function(e,t){t=t||l.document;for(var n=0;n=x.length)break;E=x[w++]}else{if(w=x.next(),w.done)break;E=w.value}var S=E,T=S[0],C=S[1];C._updateEventTargets(i,o),C[e](T,t,i,o)}}}function o(e){for(var t=0;te.pointerMoveTolerance);var a={pointer:t,pointerIndex:this.getPointerIndex(t),event:n,eventTarget:r,dx:o,dy:s,duplicate:i,interaction:this,interactingBeforeMove:this.interacting()};i||l.setCoordDeltas(this.pointerDelta,this.prevCoords,this.curCoords),f.fire("move",a),i||(this.interacting()&&this.doMove(a),this.pointerWasMoved&&l.copyCoords(this.prevCoords,this.curCoords))},e.prototype.doMove=function(e){e=l.extend({pointer:this.pointers[0],event:this.prevEvent,eventTarget:this._eventTarget,interaction:this},e||{}),f.fire("before-action-move",e),this._dontFireMove||f.fire("action-move",e),this._dontFireMove=!1},e.prototype.pointerUp=function(e,t,n,r){var i=this.getPointerIndex(e);f.fire(/cancel$/i.test(t.type)?"cancel":"up",{pointer:e,pointerIndex:i,event:t,eventTarget:n,curEventTarget:r,interaction:this}),this.simulation||this.end(t),this.pointerIsDown=!1,this.removePointer(e,t)},e.prototype.end=function(e){e=e||this.prevEvent,this.interacting()&&f.fire("action-end",{event:e,interaction:this}),this.stop()},e.prototype.currentAction=function(){return this._interacting?this.prepared.name:null},e.prototype.interacting=function(){return this._interacting},e.prototype.stop=function(){f.fire("stop",{interaction:this}),this._interacting&&(f.fire("stop-active",{interaction:this}),f.fire("stop-"+this.prepared.name,{interaction:this})),this.target=this.element=null,this._interacting=!1,this.prepared.name=this.prevEvent=null},e.prototype.getPointerIndex=function(e){return"mouse"===this.pointerType||"pen"===this.pointerType?0:l.indexOf(this.pointerIds,l.getPointerId(e))},e.prototype.updatePointer=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:t&&/(down|start)$/i.test(t.type),r=l.getPointerId(e),i=this.getPointerIndex(e);return-1===i&&(i=this.pointerIds.length,this.pointerIds[i]=r),n&&f.fire("update-pointer-down",{pointer:e,event:t,down:n,pointerId:r,pointerIndex:i,interaction:this}),this.pointers[i]=e,i},e.prototype.removePointer=function(e,t){var n=this.getPointerIndex(e);-1!==n&&(f.fire("remove-pointer",{pointer:e,event:t,pointerIndex:n,interaction:this}),this.pointers.splice(n,1),this.pointerIds.splice(n,1),this.downTargets.splice(n,1),this.downTimes.splice(n,1))},e.prototype._updateEventTargets=function(e,t){this._eventTarget=e,this._curEventTarget=t},e}(),y=0,x=g.length;y=i.length)break;a=i[s++]}else{if(s=i.next(),s.done)break;a=s.value}var l=a;if(l.options.drop.enabled){var c=l.options.drop.accept;if(!(p.is.element(c)&&c!==t||p.is.string(c)&&!p.matchesSelector(t,c)))for(var d=p.is.string(l.target)?l._context.querySelectorAll(l.target):[l.target],f=0;fo.left&&c.xo.top&&c.y=o.left&&v<=o.right&&g>=o.top&&g<=o.bottom}if(f&&p.is.number(a)){s=Math.max(0,Math.min(o.right,f.right)-Math.max(o.left,f.left))*Math.max(0,Math.min(o.bottom,f.bottom)-Math.max(o.top,f.top))/(f.width*f.height)>=a}return this.options.drop.checker&&(s=this.options.drop.checker(e,t,s,this,i,n,r)),s},v.signals.on("unset",function(e){e.interactable.dropzone(!1)}),v.settingsMethods.push("dropChecker"),g.signals.on("new",function(e){e.dropTarget=null,e.dropElement=null,e.prevDropTarget=null,e.prevDropElement=null,e.dropEvents=null,e.activeDrops={dropzones:[],elements:[],rects:[]}}),g.signals.on("stop",function(e){var t=e.interaction;t.dropTarget=t.dropElement=t.prevDropTarget=t.prevDropElement=null}),d.dynamicDrop=function(e){return p.is.bool(e)?(y=e,d):y},p.merge(v.eventTypes,["dragenter","dragleave","dropactivate","dropdeactivate","dropmove","drop"]),c.methodDict.drop="dropzone",h.drop=m.defaults,t.exports=m},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../interact":21,"../scope":34,"../utils":44,"./base":6}],9:[function(e,t,n){"use strict";var r=e("./base"),i=e("../utils"),o=e("../InteractEvent"),s=e("../Interactable"),a=e("../Interaction"),l=e("../defaultOptions"),c={defaults:{enabled:!1,origin:null,restrict:null},checker:function(e,t,n,r,i){return i.pointerIds.length>=2?{name:"gesture"}:null},getCursor:function(){return""}};o.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;"gesturestart"===t.type&&(t.ds=0,n.gesture.startDistance=n.gesture.prevDistance=t.distance,n.gesture.startAngle=n.gesture.prevAngle=t.angle,n.gesture.scale=1)}),o.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;"gesturemove"===t.type&&(t.ds=t.scale-n.gesture.scale,n.target.fire(t),n.gesture.prevAngle=t.angle,n.gesture.prevDistance=t.distance,t.scale===1/0||null===t.scale||void 0===t.scale||isNaN(t.scale)||(n.gesture.scale=t.scale))}),s.prototype.gesturable=function(e){return i.is.object(e)?(this.options.gesture.enabled=!1!==e.enabled,this.setPerAction("gesture",e),this.setOnEvents("gesture",e),this):i.is.bool(e)?(this.options.gesture.enabled=e,e||(this.ongesturestart=this.ongesturestart=this.ongestureend=null),this):this.options.gesture},o.signals.on("set-delta",function(e){var t=e.interaction,n=e.iEvent,r=e.action,s=e.event,a=e.starting,l=e.ending,c=e.deltaSource;if("gesture"===r){var p=t.pointers;n.touches=[p[0],p[1]],a?(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=1,n.ds=0,n.angle=i.touchAngle(p,void 0,c),n.da=0):l||s instanceof o?(n.distance=t.prevEvent.distance,n.box=t.prevEvent.box,n.scale=t.prevEvent.scale,n.ds=n.scale-1,n.angle=t.prevEvent.angle,n.da=n.angle-t.gesture.startAngle):(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=n.distance/t.gesture.startDistance,n.angle=i.touchAngle(p,t.gesture.prevAngle,c),n.ds=n.scale-t.gesture.prevScale,n.da=n.angle-t.gesture.prevAngle)}}),a.signals.on("new",function(e){e.gesture={start:{x:0,y:0},startDistance:0,prevDistance:0,distance:0,scale:1,startAngle:0,prevAngle:0}}),r.gesture=c,r.names.push("gesture"),i.merge(s.eventTypes,["gesturestart","gesturemove","gestureend"]),r.methodDict.gesture="gesturable",l.gesture=c.defaults,t.exports=c},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"./base":6}],10:[function(e,t,n){"use strict";function r(e,t,n,r,i,s,a){if(!t)return!1;if(!0===t){var l=o.is.number(s.width)?s.width:s.right-s.left,c=o.is.number(s.height)?s.height:s.bottom-s.top;if(l<0&&("left"===e?e="right":"right"===e&&(e="left")),c<0&&("top"===e?e="bottom":"bottom"===e&&(e="top")),"left"===e)return n.x<(l>=0?s.left:s.right)+a;if("top"===e)return n.y<(c>=0?s.top:s.bottom)+a;if("right"===e)return n.x>(l>=0?s.right:s.left)-a;if("bottom"===e)return n.y>(c>=0?s.bottom:s.top)-a}return!!o.is.element(r)&&(o.is.element(t)?t===r:o.matchesUpTo(r,t,i))}var i=e("./base"),o=e("../utils"),s=e("../utils/browser"),a=e("../InteractEvent"),l=e("../Interactable"),c=e("../Interaction"),p=e("../defaultOptions"),u=s.supportsTouch||s.supportsPointerEvent?20:10,d={defaults:{enabled:!1,mouseButtons:null,origin:null,snap:null,restrict:null,inertia:null,autoScroll:null,square:!1,preserveAspectRatio:!1,axis:"xy",margin:NaN,edges:null,invert:"none"},checker:function(e,t,n,i,s,a){if(!a)return null;var l=o.extend({},s.curCoords.page),c=n.options;if(c.resize.enabled){var p=c.resize,d={left:!1,right:!1,top:!1,bottom:!1};if(o.is.object(p.edges)){for(var f in d)d[f]=r(f,p.edges[f],l,s._eventTarget,i,a,p.margin||u);if(d.left=d.left&&!d.right,d.top=d.top&&!d.bottom,d.left||d.right||d.top||d.bottom)return{name:"resize",edges:d}}else{var v="y"!==c.resize.axis&&l.x>a.right-u,g="x"!==c.resize.axis&&l.y>a.bottom-u;if(v||g)return{name:"resize",axes:(v?"x":"")+(g?"y":"")}}}return null},cursors:s.isIe9OrOlder?{x:"e-resize",y:"s-resize",xy:"se-resize",top:"n-resize",left:"w-resize",bottom:"s-resize",right:"e-resize",topleft:"se-resize",bottomright:"se-resize",topright:"ne-resize",bottomleft:"ne-resize"}:{x:"ew-resize",y:"ns-resize",xy:"nwse-resize",top:"ns-resize",left:"ew-resize",bottom:"ns-resize",right:"ew-resize",topleft:"nwse-resize",bottomright:"nwse-resize",topright:"nesw-resize",bottomleft:"nesw-resize"},getCursor:function(e){if(e.axis)return d.cursors[e.name+e.axis];if(e.edges){for(var t="",n=["top","bottom","left","right"],r=0;r<4;r++)e.edges[n[r]]&&(t+=n[r]);return d.cursors[t]}}};a.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;if("resizestart"===t.type&&n.prepared.edges){var r=n.target.getRect(n.element),i=n.target.options.resize;if(i.square||i.preserveAspectRatio){var s=o.extend({},n.prepared.edges);s.top=s.top||s.left&&!s.bottom,s.left=s.left||s.top&&!s.right,s.bottom=s.bottom||s.right&&!s.top,s.right=s.right||s.bottom&&!s.left,n.prepared._linkedEdges=s}else n.prepared._linkedEdges=null;i.preserveAspectRatio&&(n.resizeStartAspectRatio=r.width/r.height),n.resizeRects={start:r,current:o.extend({},r),inverted:o.extend({},r),previous:o.extend({},r),delta:{left:0,right:0,width:0,top:0,bottom:0,height:0}},t.rect=n.resizeRects.inverted,t.deltaRect=n.resizeRects.delta}}),a.signals.on("new",function(e){var t=e.iEvent,n=e.phase,r=e.interaction;if("move"===n&&r.prepared.edges){var i=r.target.options.resize,s=i.invert,a="reposition"===s||"negate"===s,l=r.prepared.edges,c=r.resizeRects.start,p=r.resizeRects.current,u=r.resizeRects.inverted,d=r.resizeRects.delta,f=o.extend(r.resizeRects.previous,u),v=l,g=t.dx,h=t.dy;if(i.preserveAspectRatio||i.square){var m=i.preserveAspectRatio?r.resizeStartAspectRatio:1;l=r.prepared._linkedEdges,v.left&&v.bottom||v.right&&v.top?h=-g/m:v.left||v.right?h=g/m:(v.top||v.bottom)&&(g=h*m)}if(l.top&&(p.top+=h),l.bottom&&(p.bottom+=h),l.left&&(p.left+=g),l.right&&(p.right+=g),a){if(o.extend(u,p),"reposition"===s){var y=void 0;u.top>u.bottom&&(y=u.top,u.top=u.bottom,u.bottom=y),u.left>u.right&&(y=u.left,u.left=u.right,u.right=y)}}else u.top=Math.min(p.top,c.bottom),u.bottom=Math.max(p.bottom,c.top),u.left=Math.min(p.left,c.right),u.right=Math.max(p.right,c.left);u.width=u.right-u.left,u.height=u.bottom-u.top;for(var x in u)d[x]=u[x]-f[x];t.edges=r.prepared.edges,t.rect=u,t.deltaRect=d}}),l.prototype.resizable=function(e){return o.is.object(e)?(this.options.resize.enabled=!1!==e.enabled,this.setPerAction("resize",e),this.setOnEvents("resize",e),/^x$|^y$|^xy$/.test(e.axis)?this.options.resize.axis=e.axis:null===e.axis&&(this.options.resize.axis=p.resize.axis),o.is.bool(e.preserveAspectRatio)?this.options.resize.preserveAspectRatio=e.preserveAspectRatio:o.is.bool(e.square)&&(this.options.resize.square=e.square),this):o.is.bool(e)?(this.options.resize.enabled=e, +e||(this.onresizestart=this.onresizestart=this.onresizeend=null),this):this.options.resize},c.signals.on("new",function(e){e.resizeAxes="xy"}),a.signals.on("set-delta",function(e){var t=e.interaction,n=e.iEvent;"resize"===e.action&&t.resizeAxes&&(t.target.options.resize.square?("y"===t.resizeAxes?n.dx=n.dy:n.dy=n.dx,n.axes="xy"):(n.axes=t.resizeAxes,"x"===t.resizeAxes?n.dy=0:"y"===t.resizeAxes&&(n.dx=0)))}),i.resize=d,i.names.push("resize"),o.merge(l.eventTypes,["resizestart","resizemove","resizeinertiastart","resizeinertiaresume","resizeend"]),i.methodDict.resize="resizable",p.resize=d.defaults,t.exports=d},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"../utils/browser":37,"./base":6}],11:[function(e,t,n){"use strict";var r=e("./utils/raf"),i=e("./utils/window").getWindow,o=e("./utils/is"),s=e("./utils/domUtils"),a=e("./Interaction"),l=e("./defaultOptions"),c={defaults:{enabled:!1,container:null,margin:60,speed:300},interaction:null,i:null,x:0,y:0,isScrolling:!1,prevTime:0,start:function(e){c.isScrolling=!0,r.cancel(c.i),c.interaction=e,c.prevTime=(new Date).getTime(),c.i=r.request(c.scroll)},stop:function(){c.isScrolling=!1,r.cancel(c.i)},scroll:function(){var e=c.interaction.target.options[c.interaction.prepared.name].autoScroll,t=e.container||i(c.interaction.element),n=(new Date).getTime(),s=(n-c.prevTime)/1e3,a=e.speed*s;a>=1&&(o.window(t)?t.scrollBy(c.x*a,c.y*a):t&&(t.scrollLeft+=c.x*a,t.scrollTop+=c.y*a),c.prevTime=n),c.isScrolling&&(r.cancel(c.i),c.i=r.request(c.scroll))},check:function(e,t){var n=e.options;return n[t].autoScroll&&n[t].autoScroll.enabled},onInteractionMove:function(e){var t=e.interaction,n=e.pointer;if(t.interacting()&&c.check(t.target,t.prepared.name)){if(t.simulation)return void(c.x=c.y=0);var r=void 0,a=void 0,l=void 0,p=void 0,u=t.target.options[t.prepared.name].autoScroll,d=u.container||i(t.element);if(o.window(d))p=n.clientXd.innerWidth-c.margin,l=n.clientY>d.innerHeight-c.margin;else{var f=s.getElementClientRect(d);p=n.clientXf.right-c.margin,l=n.clientY>f.bottom-c.margin}c.x=a?1:p?-1:0,c.y=l?1:r?-1:0,c.isScrolling||(c.margin=u.margin,c.speed=u.speed,c.start(t))}}};a.signals.on("stop-active",function(){c.stop()}),a.signals.on("action-move",c.onInteractionMove),l.perAction.autoScroll=c.defaults,t.exports=c},{"./Interaction":5,"./defaultOptions":18,"./utils/domUtils":39,"./utils/is":46,"./utils/raf":50,"./utils/window":52}],12:[function(e,t,n){"use strict";var r=e("../Interactable"),i=e("../actions/base"),o=e("../utils/is"),s=e("../utils/domUtils");r.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},r.prototype.ignoreFrom=function(e){return this._backCompatOption("ignoreFrom",e)},r.prototype.allowFrom=function(e){return this._backCompatOption("allowFrom",e)},r.prototype.testIgnore=function(e,t,n){return!(!e||!o.element(n))&&(o.string(e)?s.matchesUpTo(n,e,t):!!o.element(e)&&s.nodeContains(e,n))},r.prototype.testAllow=function(e,t,n){return!e||!!o.element(n)&&(o.string(e)?s.matchesUpTo(n,e,t):!!o.element(e)&&s.nodeContains(e,n))},r.prototype.testIgnoreAllow=function(e,t,n){return!this.testIgnore(e.ignoreFrom,t,n)&&this.testAllow(e.allowFrom,t,n)},r.prototype.actionChecker=function(e){return o.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},r.prototype.styleCursor=function(e){return o.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},r.prototype.defaultActionChecker=function(e,t,n,r){for(var o=this.getRect(r),s=null,a=i.names,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var u=p;if((!n.pointerIsDown||!n.mouse||0!=(t.buttons&this.options[u].mouseButtons))&&(s=i[u].checker(e,t,this,r,n,o)))return s}}},{"../Interactable":4,"../actions/base":6,"../utils/domUtils":39,"../utils/is":46}],13:[function(e,t,n){"use strict";function r(e,t,n,r){return g.is.object(e)&&t.testIgnoreAllow(t.options[e.name],n,r)&&t.options[e.name].enabled&&a(t,n,e)?e:null}function i(e,t,n,i,o,s){for(var a=0,l=i.length;a=m.maxInteractions)return!1;if(u.target===e){if((a+=d===n.name|0)>=i)return!1;if(u.element===t&&(l++,d!==n.name||l>=o))return!1}}}return m.maxInteractions>0}}var l=e("../interact"),c=e("../Interactable"),p=e("../Interaction"),u=e("../actions/base"),d=e("../defaultOptions"),f=e("../utils/browser"),v=e("../scope"),g=e("../utils"),h=e("../utils/Signals").new();e("./InteractableMethods");var m={signals:h,withinInteractionLimit:a,maxInteractions:1/0,defaults:{perAction:{manualStart:!1,max:1/0,maxPerElement:1,allowFrom:null,ignoreFrom:null}},setActionDefaults:function(e){g.extend(e.defaults,m.defaults.perAction)}};p.signals.on("down",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;if(!t.interacting()){s(t,o(t,n,r,i))}}),p.signals.on("move",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;if(t.mouse&&!t.pointerIsDown&&!t.interacting()){s(t,o(t,n,r,i))}}),p.signals.on("move",function(e){var t=e.interaction,n=e.event;if(t.pointerIsDown&&!t.interacting()&&t.pointerWasMoved&&t.prepared.name){h.fire("before-start",e);var r=t.target;t.prepared.name&&r&&(r.options[t.prepared.name].manualStart||!a(r,t.element,t.prepared)?t.stop(n):t.start(t.prepared,r,t.element))}}),p.signals.on("stop",function(e){var t=e.interaction,n=t.target;n&&n.options.styleCursor&&(n._doc.documentElement.style.cursor="")}),c.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},c.prototype.actionChecker=function(e){return g.is.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},c.prototype.styleCursor=function(e){return g.is.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},c.prototype.defaultActionChecker=function(e,t,n,r){for(var i=this.getRect(r),o=t.buttons||{0:1,1:4,3:8,4:16}[t.button],s=null,a=u.names,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var d=p;if((!n.pointerIsDown||!n.mouse||0!=(o&this.options[d].mouseButtons))&&(s=u[d].checker(e,t,this,r,n,i)))return s}},l.maxInteractions=function(e){return g.is.number(e)?(m.maxInteractions=e,this):m.maxInteractions},c.settingsMethods.push("styleCursor"),c.settingsMethods.push("actionChecker"),c.settingsMethods.push("ignoreFrom"),c.settingsMethods.push("allowFrom"),d.base.actionChecker=null,d.base.styleCursor=!0,g.extend(d.perAction,m.defaults.perAction),t.exports=m},{"../Interactable":4,"../Interaction":5,"../actions/base":6,"../defaultOptions":18,"../interact":21,"../scope":34,"../utils":44,"../utils/Signals":35,"../utils/browser":37,"./InteractableMethods":12}],14:[function(e,t,n){"use strict";var r=e("./base"),i=e("../Interaction");i.signals.on("new",function(e){e.delayTimer=null}),r.signals.on("prepared",function(e){var t=e.interaction,n=t.prepared.name;if(n){var r=t.target.options[n].delay;r>0&&(t.delayTimer=setTimeout(function(){t.start(t.prepared,t.target,t.element)},r))}}),i.signals.on("move",function(e){var t=e.interaction,n=e.duplicate;t.pointerWasMoved&&!n&&clearTimeout(t.delayTimer)}),r.signals.on("before-start",function(e){var t=e.interaction,n=t.prepared.name;if(n){t.target.options[n].delay>0&&(t.prepared.name=null)}})},{"../Interaction":5,"./base":13}],15:[function(e,t,n){"use strict";function r(e,t){if(!t)return!1;var n=t.options.drag.startAxis;return"xy"===e||"xy"===n||n===e}var i=e("./base"),o=e("../scope"),s=e("../utils/browser"),a=e("../utils/is"),l=e("../utils/domUtils"),c=l.matchesSelector,p=l.parentNode;i.setActionDefaults(e("../actions/drag")),i.signals.on("before-start",function(e){var t=e.interaction,n=e.eventTarget,l=e.dx,u=e.dy;if("drag"===t.prepared.name){var d=Math.abs(l),f=Math.abs(u),v=t.target.options.drag,g=v.startAxis,h=d>f?"x":dl.minSpeed&&g>l.endSpeed,b={interaction:t,pageCoords:v,statuses:f,preEnd:!0,requireEndOnly:!0};y&&!x&&(c.resetStatuses(f),m=c.setAll(b),m.shouldMove&&m.locked&&(h=!0)),(x||h)&&(p.copyCoords(i.upCoords,t.curCoords),t.pointers[0]=i.startEvent=new a(t,n,t.prepared.name,"inertiastart",t.element),i.t0=d,i.active=!0,i.allowResume=l.allowResume,t.simulation=i,o.fire(i.startEvent),x?(i.vx0=t.pointerDelta.client.vx,i.vy0=t.pointerDelta.client.vy,i.v0=g,r(t,i),p.extend(v,t.curCoords.page),v.x+=i.xe,v.y+=i.ye,c.resetStatuses(f),m=c.setAll(b),i.modifiedXe+=m.dx,i.modifiedYe+=m.dy,i.i=u.request(t.boundInertiaFrame)):(i.smoothEnd=!0,i.xe=m.dx,i.ye=m.dy,i.sx=i.sy=0,i.i=u.request(t.boundSmoothEndFrame)))}}),l.signals.on("stop-active",function(e){var t=e.interaction,n=t.inertiaStatus;n.active&&(u.cancel(n.i),n.active=!1,t.simulation=null)})},{"./InteractEvent":3,"./Interaction":5,"./modifiers":24,"./utils":44,"./utils/raf":50}],21:[function(e,t,n){"use strict";function r(e,t){var n=a.interactables.get(e,t);return n||(n=new l(e,t),n.events.global=p),n}var i=e("./utils/browser"),o=e("./utils/events"),s=e("./utils"),a=e("./scope"),l=e("./Interactable"),c=e("./Interaction"),p={};r.isSet=function(e,t){return-1!==a.interactables.indexOfElement(e,t&&t.context)},r.on=function(e,t,n){if(s.is.string(e)&&-1!==e.search(" ")&&(e=e.trim().split(/ +/)),s.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.on(f,t,n)}return r}if(s.is.object(e)){for(var v in e)r.on(v,e[v],t);return r}return s.contains(l.eventTypes,e)?p[e]?p[e].push(t):p[e]=[t]:o.add(a.document,e,t,{options:n}),r},r.off=function(e,t,n){if(s.is.string(e)&&-1!==e.search(" ")&&(e=e.trim().split(/ +/)),s.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.off(f,t,n)}return r}if(s.is.object(e)){for(var v in e)r.off(v,e[v],t);return r}if(s.contains(l.eventTypes,e)){var g=void 0;e in p&&-1!==(g=s.indexOf(p[e],t))&&p[e].splice(g,1)}else o.remove(a.document,e,t,n);return r},r.debug=function(){return a},r.getPointerAverage=s.pointerAverage,r.getTouchBBox=s.touchBBox,r.getTouchDistance=s.touchDistance,r.getTouchAngle=s.touchAngle,r.getElementRect=s.getElementRect,r.getElementClientRect=s.getElementClientRect,r.matchesSelector=s.matchesSelector,r.closest=s.closest,r.supportsTouch=function(){return i.supportsTouch},r.supportsPointerEvent=function(){return i.supportsPointerEvent},r.stop=function(e){for(var t=a.interactions.length-1;t>=0;t--)a.interactions[t].stop(e);return r},r.pointerMoveTolerance=function(e){return s.is.number(e)?(c.pointerMoveTolerance=e,this):c.pointerMoveTolerance},r.addDocument=a.addDocument,r.removeDocument=a.removeDocument,a.interact=r,t.exports=r},{"./Interactable":4,"./Interaction":5,"./scope":34,"./utils":44,"./utils/browser":37,"./utils/events":40}],22:[function(e,t,n){"use strict";function r(e){var t=e.interaction,n=e.event;t.target&&t.target.checkAndPreventDefault(n)}var i=e("./Interactable"),o=e("./Interaction"),s=e("./scope"),a=e("./utils/is"),l=e("./utils/events"),c=e("./utils/domUtils"),p=c.nodeContains,u=c.matchesSelector;i.prototype.preventDefault=function(e){return/^(always|never|auto)$/.test(e)?(this.options.preventDefault=e,this):a.bool(e)?(this.options.preventDefault=e?"always":"never",this):this.options.preventDefault},i.prototype.checkAndPreventDefault=function(e){var t=this.options.preventDefault;if("never"!==t)return"always"===t?void e.preventDefault():void(l.supportsOptions||/^(mouse|pointer|touch)*(down|start)/i.test(e.type)||a.element(e.target)&&u(e.target,"input,select,textarea,[contenteditable=true],[contenteditable=true] *")||e.preventDefault())};for(var d=["down","move","up","cancel"],f=0;f=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i;if(o.element&&(o.element===e.target||p(o.element,e.target)))return void o.target.checkAndPreventDefault(e)}}},{"./Interactable":4,"./Interaction":5,"./scope":34,"./utils/domUtils":39,"./utils/events":40,"./utils/is":46}],23:[function(e,t,n){"use strict";function r(e){var t=e.target,n=a.search(e,e.type,t);n&&n.prevTap&&e.clientX===n.prevTap.clientX&&e.clientY===n.prevTap.clientY&&t===n.prevTap.target&&(n.downTargets[0]=t,n.downTimes[0]=(new Date).getTime(),l.fire({interaction:n,event:e,eventTarget:t,pointer:e,type:"tap"}))}var i=e("./scope"),o=e("./utils/events"),s=e("./utils/browser"),a=e("./utils/interactionFinder"),l=e("./pointerEvents/base"),c=e("./utils/window"),p=c.window,u=Object.prototype.toString;if(p.Array.isArray||(p.Array.isArray=function(e){return"[object Array]"===u.call(e)}),String.prototype.trim||(String.prototype.trim=function(){return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")}),s.isIE8){var d=function(e){for(var t=i.interactions,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var o;if(n){if(r>=t.length)break;o=t[r++]}else{if(r=t.next(),r.done)break;o=r.value}var s=o;s.interacting()&&s.target.checkAndPreventDefault(e)}},f=function(e,t){var n=e.doc,i=(e.win,0===t.indexOf("listen")?o.add:o.remove);i(n,"selectstart",d),l&&i(n,"dblclick",r)};i.signals.on("add-document",f),i.signals.on("remove-document",f)}t.exports=null},{"./pointerEvents/base":31,"./scope":34,"./utils/browser":37,"./utils/events":40,"./utils/interactionFinder":45,"./utils/window":52}],24:[function(e,t,n){"use strict";function r(e,t,n){return e&&e.enabled&&(t||!e.endOnly)&&(!n||e.endOnly)}var i=e("../InteractEvent"),o=e("../Interaction"),s=e("../utils/extend"),a={names:[],setOffsets:function(e){var t=e.interaction,n=e.pageCoords,r=t.target,i=t.element,o=t.startOffset,s=r.getRect(i);s?(o.left=n.x-s.left,o.top=n.y-s.top,o.right=s.right-n.x,o.bottom=s.bottom-n.y,"width"in s||(s.width=s.right-s.left),"height"in s||(s.height=s.bottom-s.top)):o.left=o.top=o.right=o.bottom=0,e.rect=s,e.interactable=r,e.element=i;for(var l=0;l=p.length)break;f=p[d++]}else{if(d=p.next(),d.done)break;f=d.value}var v=f,g=a[v],h=t.target.options[t.prepared.name][v];r(h,i,o)&&(e.status=e.status=n[v],e.options=h,e.offset=e.interaction.modifierOffsets[v],g.set(e),e.status.locked&&(l.x+=e.status.dx,l.y+=e.status.dy,c.dx+=e.status.dx,c.dy+=e.status.dy,c.locked=!0))}return c.shouldMove=!e.status||!c.locked||e.status.changed,c},resetStatuses:function(e){for(var t=a.names,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var i;if(n){if(r>=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i,s=e[o]||{};s.dx=s.dy=0,s.modifiedX=s.modifiedY=NaN,s.locked=!1,s.changed=!0,e[o]=s}return e},start:function(e,t){var n=e.interaction,r={interaction:n,pageCoords:("action-resume"===t?n.curCoords:n.startCoords).page,startOffset:n.startOffset,statuses:n.modifierStatuses,preEnd:!1,requireEndOnly:!1};a.setOffsets(r),a.resetStatuses(r.statuses),r.pageCoords=s({},n.startCoords.page),n.modifierResult=a.setAll(r)}};o.signals.on("new",function(e){e.startOffset={left:0,right:0,top:0,bottom:0},e.modifierOffsets={},e.modifierStatuses=a.resetStatuses({}),e.modifierResult=null}),o.signals.on("action-start",a.start),o.signals.on("action-resume",a.start),o.signals.on("before-action-move",function(e){var t=e.interaction,n=e.preEnd,r=e.interactingBeforeMove,i=a.setAll({interaction:t,preEnd:n,pageCoords:t.curCoords.page,statuses:t.modifierStatuses,requireEndOnly:!1});!i.shouldMove&&r&&(t._dontFireMove=!0),t.modifierResult=i}),o.signals.on("action-end",function(e){for(var t=e.interaction,n=e.event,i=0;i=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}var m=h,y=m.x,x=m.y;l.push({x:s.left-i.width*y+u.x,y:s.top-i.height*x+u.y})}else l.push(u);return l},set:function(e){var t=e.interaction,n=e.pageCoords,r=e.status,i=e.options,s=e.offset,a=[],l=void 0,c=void 0,p=void 0;if(r.useStatusXY)c={x:r.x,y:r.y};else{var u=o.getOriginXY(t.target,t.element,t.prepared.name);c=o.extend({},n),c.x-=u.x,c.y-=u.y}r.realX=c.x,r.realY=c.y;for(var d=i.targets?i.targets.length:0,f=s,v=Array.isArray(f),g=0,f=v?f:f[Symbol.iterator]();;){var h;if(v){if(g>=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}for(var m=h,y=m.x,x=m.y,b=c.x-y,w=c.y-x,E=i.targets,S=Array.isArray(E),T=0,E=S?E:E[Symbol.iterator]();;){var C;if(S){if(T>=E.length)break;C=E[T++]}else{if(T=E.next(),T.done)break;C=T.value}var A=C;l=o.is.function(A)?A(b,w,t):A,l&&a.push({x:o.is.number(l.x)?l.x+y:b,y:o.is.number(l.y)?l.y+x:w,range:o.is.number(l.range)?l.range:i.range})}}var D={target:null,inRange:!1,distance:0,range:0,dx:0,dy:0};for(p=0,d=a.length;p=p.length)break;f=p[d++]}else{if(d=p.next(),d.done)break;f=d.value}var v=f,g=void 0;g=a.is.function(v)?v(l,c,t):v,g&&("width"in g&&"height"in g&&(g.x=g.width, +g.y=g.height),e.options.targets.push(g))}i.set(e)},modifyCoords:function(e){var t=e.options;e.options=a.extend({},t),e.options.enabled=t.enabled,e.options.relativePoints=[null],i.modifyCoords(e)}};r.snapSize=l,r.names.push("snapSize"),o.perAction.snapSize=l.defaults,s.defaults.snapSize=l.defaults,t.exports=l},{"../actions/resize":10,"../defaultOptions":18,"../utils/":44,"./index":24,"./snap":28}],30:[function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=e("../utils/pointerUtils");t.exports=function(){function e(t,n,o,s,a){if(r(this,e),i.pointerExtend(this,o),o!==n&&i.pointerExtend(this,n),this.interaction=a,this.timeStamp=(new Date).getTime(),this.originalEvent=o,this.type=t,this.pointerId=i.getPointerId(n),this.pointerType=i.getPointerType(n),this.target=s,this.currentTarget=null,"tap"===t){var l=a.getPointerIndex(n);this.dt=this.timeStamp-a.downTimes[l];var c=this.timeStamp-a.tapTime;this.double=!!(a.prevTap&&"doubletap"!==a.prevTap.type&&a.prevTap.target===this.target&&c<500)}else"doubletap"===t&&(this.dt=n.timeStamp-a.tapTime)}return e.prototype.subtractOrigin=function(e){var t=e.x,n=e.y;return this.pageX-=t,this.pageY-=n,this.clientX-=t,this.clientY-=n,this},e.prototype.addOrigin=function(e){var t=e.x,n=e.y;return this.pageX+=t,this.pageY+=n,this.clientX+=t,this.clientY+=n,this},e.prototype.preventDefault=function(){this.originalEvent.preventDefault()},e.prototype.stopPropagation=function(){this.propagationStopped=!0},e.prototype.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},e}()},{"../utils/pointerUtils":49}],31:[function(e,t,n){"use strict";function r(e){for(var t=e.interaction,n=e.pointer,s=e.event,l=e.eventTarget,c=e.type,u=void 0===c?e.pointerEvent.type:c,d=e.targets,f=void 0===d?i(e):d,v=e.pointerEvent,g=void 0===v?new o(u,n,s,l,t):v,h={interaction:t,pointer:n,event:s,eventTarget:l,targets:f,type:u,pointerEvent:g},m=0;m=u.length)break;g=u[v++]}else{if(v=u.next(),v.done)break;g=v.value}var h=g;c.element=h,p.fire("collect-targets",c)}return"hold"===o&&(c.targets=d(c.targets,function(e){return e.eventable.options.holdDuration===t.holdTimers[s].duration})),c.targets}var o=e("./PointerEvent"),s=e("../Interaction"),a=e("../utils"),l=e("../utils/browser"),c=e("../defaultOptions"),p=e("../utils/Signals").new(),u=e("../utils/arr"),d=u.filter,f=["down","up","cancel"],v=["down","up","cancel"],g={PointerEvent:o,fire:r,collectEventTargets:i,signals:p,defaults:{holdDuration:600,ignoreFrom:null,allowFrom:null,origin:{x:0,y:0}},types:["down","move","up","cancel","tap","doubletap","hold"]};s.signals.on("update-pointer-down",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers[n]={duration:1/0,timeout:null}}),s.signals.on("remove-pointer",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers.splice(n,1)}),s.signals.on("move",function(e){var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,s=e.duplicateMove,a=t.getPointerIndex(n);s||t.pointerIsDown&&!t.pointerWasMoved||(t.pointerIsDown&&clearTimeout(t.holdTimers[a].timeout),r({interaction:t,pointer:n,event:i,eventTarget:o,type:"move"}))}),s.signals.on("down",function(e){for(var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,s=e.pointerIndex,c=l.isIE8?a.extend({},i):i,u=t.holdTimers[s],d=a.getPath(o),f={interaction:t,pointer:n,event:i,eventTarget:o,type:"hold",targets:[],path:d,element:null},v=d,g=Array.isArray(v),h=0,v=g?v:v[Symbol.iterator]();;){var m;if(g){if(h>=v.length)break;m=v[h++]}else{if(h=v.next(),h.done)break;m=h.value}var y=m;f.element=y,p.fire("collect-targets",f)}if(f.targets.length){for(var x=1/0,b=0;b=0&&(p.selectors[u]!==e||p.contexts[u]!==t);u--);-1===u&&(u=p.selectors.length,p.selectors.push(e),p.contexts.push(t),p.listeners.push([])),p.listeners[u].push([i,!!s.capture,s.passive])}function s(e,t,n,r,o){var s=f(o),c=O[n],p=!1,u=void 0;if(c)for(u=c.selectors.length-1;u>=0;u--)if(c.selectors[u]===e&&c.contexts[u]===t){for(var d=c.listeners[u],v=d.length-1;v>=0;v--){var g=d[v],h=g[0],m=g[1],y=g[2];if(h===r&&m===!!s.capture&&y===s.passive){d.splice(v,1),d.length||(c.selectors.splice(u,1),c.contexts.splice(u,1),c.listeners.splice(u,1),i(t,n,a),i(t,n,l,!0),c.selectors.length||(O[n]=null)),p=!0;break}}if(p)break}}function a(e,t){var n=f(t),r={},i=O[e.type],o=g.getActualElement(e.path?e.path[0]:e.target),s=o;for(h(r,e),r.originalEvent=e,r.preventDefault=p;v.element(s);){for(var a=0;a=l.length)break;u=l[p++]}else{if(p=l.next(),p.done)break;u=p.value}var d=u,f=o[d](a);if(f)return f}},simulationResume:function(e){var t=e.pointerType,n=e.eventType,o=e.eventTarget;if(!/down|start/i.test(n))return null;for(var s=r.interactions,a=Array.isArray(s),l=0,s=a?s:s[Symbol.iterator]();;){var c;if(a){if(l>=s.length)break;c=s[l++]}else{if(l=s.next(),l.done)break;c=l.value}var p=c,u=o;if(p.simulation&&p.simulation.allowResume&&p.pointerType===t)for(;u;){if(u===p.element)return p;u=i.parentNode(u)}}return null},mouseOrPen:function(e){var t=e.pointerId,n=e.pointerType,o=e.eventType;if("mouse"!==n&&"pen"!==n)return null;for(var s=void 0,a=r.interactions,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var u=p;if(u.pointerType===n){if(u.simulation&&!i.contains(u.pointerIds,t))continue;if(u.interacting())return u;s||(s=u)}}if(s)return s;for(var d=r.interactions,f=Array.isArray(d),v=0,d=f?d:d[Symbol.iterator]();;){var g;if(f){if(v>=d.length)break;g=d[v++]}else{if(v=d.next(),v.done)break;g=v.value}var h=g;if(!(h.pointerType!==n||/down/i.test(o)&&h.simulation))return h}return null},hasPointer:function(e){for(var t=e.pointerId,n=r.interactions,o=Array.isArray(n),s=0,n=o?n:n[Symbol.iterator]();;){var a;if(o){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var l=a;if(i.contains(l.pointerIds,t))return l}},idle:function(e){for(var t=e.pointerType,n=r.interactions,i=Array.isArray(n),o=0,n=i?n:n[Symbol.iterator]();;){var s;if(i){if(o>=n.length)break;s=n[o++]}else{if(o=n.next(),o.done)break;s=o.value}var a=s;if(1===a.pointerIds.length){var l=a.target;if(l&&!l.options.gesture.enabled)continue}else if(a.pointerIds.length>=2)continue;if(!a.interacting()&&t===a.pointerType)return a}return null}};t.exports=o},{"../scope":34,"./index":44}],46:[function(e,t,n){"use strict";var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},i=e("./window"),o=e("./isWindow"),s={array:function(){},window:function(e){return e===i.window||o(e)},docFrag:function(e){return s.object(e)&&11===e.nodeType},object:function(e){return!!e&&"object"===(void 0===e?"undefined":r(e))},function:function(e){return"function"==typeof e},number:function(e){return"number"==typeof e},bool:function(e){return"boolean"==typeof e},string:function(e){return"string"==typeof e},element:function(e){if(!e||"object"!==(void 0===e?"undefined":r(e)))return!1;var t=i.getWindow(e)||i.window;return/object|function/.test(r(t.Element))?e instanceof t.Element:1===e.nodeType&&"string"==typeof e.nodeName}};s.array=function(e){return s.object(e)&&void 0!==e.length&&s.function(e.splice)},t.exports=s},{"./isWindow":47,"./window":52}],47:[function(e,t,n){"use strict";t.exports=function(e){return!(!e||!e.Window)&&e instanceof e.Window}},{}],48:[function(e,t,n){"use strict";function r(e,n){for(var r in n){var i=t.exports.prefixedPropREs,o=!1;for(var s in i)if(0===r.indexOf(s)&&i[s].test(r)){o=!0;break}o||"function"==typeof n[r]||(e[r]=n[r])}return e}r.prefixedPropREs={webkit:/(Movement[XY]|Radius[XY]|RotationAngle|Force)$/},t.exports=r},{}],49:[function(e,t,n){"use strict";var r=e("./hypot"),i=e("./browser"),o=e("./domObjects"),s=e("./domUtils"),a=e("./domObjects"),l=e("./is"),c=e("./pointerExtend"),p={copyCoords:function(e,t){e.page=e.page||{},e.page.x=t.page.x,e.page.y=t.page.y,e.client=e.client||{},e.client.x=t.client.x,e.client.y=t.client.y,e.timeStamp=t.timeStamp},setCoordDeltas:function(e,t,n){e.page.x=n.page.x-t.page.x,e.page.y=n.page.y-t.page.y,e.client.x=n.client.x-t.client.x,e.client.y=n.client.y-t.client.y,e.timeStamp=n.timeStamp-t.timeStamp;var i=Math.max(e.timeStamp/1e3,.001);e.page.speed=r(e.page.x,e.page.y)/i,e.page.vx=e.page.x/i,e.page.vy=e.page.y/i,e.client.speed=r(e.client.x,e.page.y)/i,e.client.vx=e.client.x/i,e.client.vy=e.client.y/i},isNativePointer:function(e){return e instanceof o.Event||e instanceof o.Touch},getXY:function(e,t,n){return n=n||{},e=e||"page",n.x=t[e+"X"],n.y=t[e+"Y"],n},getPageXY:function(e,t){return t=t||{},i.isOperaMobile&&p.isNativePointer(e)?(p.getXY("screen",e,t),t.x+=window.scrollX,t.y+=window.scrollY):p.getXY("page",e,t),t},getClientXY:function(e,t){return t=t||{},i.isOperaMobile&&p.isNativePointer(e)?p.getXY("screen",e,t):p.getXY("client",e,t),t},getPointerId:function(e){return l.number(e.pointerId)?e.pointerId:e.identifier},setCoords:function(e,t,n){var r=t.length>1?p.pointerAverage(t):t[0],i={};p.getPageXY(r,i),e.page.x=i.x,e.page.y=i.y,p.getClientXY(r,i),e.client.x=i.x,e.client.y=i.y,e.timeStamp=l.number(n)?n:(new Date).getTime()},pointerExtend:c,getTouchPair:function(e){var t=[];return l.array(e)?(t[0]=e[0],t[1]=e[1]):"touchend"===e.type?1===e.touches.length?(t[0]=e.touches[0],t[1]=e.changedTouches[0]):0===e.touches.length&&(t[0]=e.changedTouches[0],t[1]=e.changedTouches[1]):(t[0]=e.touches[0],t[1]=e.touches[1]),t},pointerAverage:function(e){for(var t={pageX:0,pageY:0,clientX:0,clientY:0,screenX:0,screenY:0},n=e,r=Array.isArray(n),i=0,n=r?n:n[Symbol.iterator]();;){var o;if(r){if(i>=n.length)break;o=n[i++]}else{if(i=n.next(),i.done)break;o=i.value}var s=o;for(var a in t)t[a]+=s[a]}for(var l in t)t[l]/=e.length;return t},touchBBox:function(e){if(e.length||e.touches&&e.touches.length>1){var t=p.getTouchPair(e),n=Math.min(t[0].pageX,t[1].pageX),r=Math.min(t[0].pageY,t[1].pageY);return{x:n,y:r,left:n,top:r,width:Math.max(t[0].pageX,t[1].pageX)-n,height:Math.max(t[0].pageY,t[1].pageY)-r}}},touchDistance:function(e,t){var n=t+"X",i=t+"Y",o=p.getTouchPair(e),s=o[0][n]-o[1][n],a=o[0][i]-o[1][i];return r(s,a)},touchAngle:function(e,t,n){var r=n+"X",i=n+"Y",o=p.getTouchPair(e),s=o[1][r]-o[0][r],a=o[1][i]-o[0][i];return 180*Math.atan2(a,s)/Math.PI},getPointerType:function(e){return l.string(e.pointerType)?e.pointerType:l.number(e.pointerType)?[void 0,void 0,"touch","pen","mouse"][e.pointerType]:/touch/.test(e.type)||e instanceof a.Touch?"touch":"mouse"},getEventTargets:function(e){return[s.getActualElement(e.path?e.path[0]:e.target),s.getActualElement(e.currentTarget)]}};t.exports=p},{"./browser":37,"./domObjects":38,"./domUtils":39,"./hypot":43,"./is":46,"./pointerExtend":48}],50:[function(e,t,n){"use strict";for(var r=e("./window"),i=r.window,o=["ms","moz","webkit","o"],s=0,a=void 0,l=void 0,c=0;c\n * Open source under the MIT License.\n * https://raw.github.com/taye/interact.js/master/LICENSE\n */\n","/*\n * In a (windowless) server environment this file exports a factory function\n * that takes the window to use.\n *\n * var interact = require('interact.js')(windowObject);\n *\n * See https://github.com/taye/interact.js/issues/187\n */\nif (typeof window === 'undefined') {\n module.exports = function (window) {\n require('./src/utils/window').init(window);\n\n return require('./src/index');\n };\n}\nelse {\n module.exports = require('./src/index');\n}\n","const { indexOf } = require('./utils/arr');\nconst extend = require('./utils/extend.js');\n\nfunction fireUntilImmediateStopped (event, listeners) {\n for (let i = 0, len = listeners.length; i < len && !event.immediatePropagationStopped; i++) {\n listeners[i](event);\n }\n}\n\nclass Eventable {\n\n constructor (options) {\n this.options = extend({}, options || {});\n }\n\n fire (event) {\n let listeners;\n const onEvent = 'on' + event.type;\n const global = this.global;\n\n // Interactable#on() listeners\n if ((listeners = this[event.type])) {\n fireUntilImmediateStopped(event, listeners);\n }\n\n // interactable.onevent listener\n if (this[onEvent]) {\n this[onEvent](event);\n }\n\n // interact.on() listeners\n if (!event.propagationStopped && global && (listeners = global[event.type])) {\n fireUntilImmediateStopped(event, listeners);\n }\n }\n\n on (eventType, listener) {\n // if this type of event was never bound\n if (this[eventType]) {\n this[eventType].push(listener);\n }\n else {\n this[eventType] = [listener];\n }\n }\n\n off (eventType, listener) {\n // if it is an action event type\n const eventList = this[eventType];\n const index = eventList? indexOf(eventList, listener) : -1;\n\n if (index !== -1) {\n eventList.splice(index, 1);\n }\n\n if (eventList && eventList.length === 0 || !listener) {\n this[eventType] = listener;\n }\n }\n}\n\nmodule.exports = Eventable;\n","const extend = require('./utils/extend');\nconst getOriginXY = require('./utils/getOriginXY');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nclass InteractEvent {\n constructor (interaction, event, action, phase, element, related, preEnd = false) {\n const target = interaction.target;\n const deltaSource = (target && target.options || defaults).deltaSource;\n const origin = getOriginXY(target, element, action);\n const starting = phase === 'start';\n const ending = phase === 'end';\n const coords = starting? interaction.startCoords : interaction.curCoords;\n const prevEvent = interaction.prevEvent;\n\n element = element || interaction.element;\n\n const page = extend({}, coords.page);\n const client = extend({}, coords.client);\n\n page.x -= origin.x;\n page.y -= origin.y;\n\n client.x -= origin.x;\n client.y -= origin.y;\n\n this.ctrlKey = event.ctrlKey;\n this.altKey = event.altKey;\n this.shiftKey = event.shiftKey;\n this.metaKey = event.metaKey;\n this.button = event.button;\n this.buttons = event.buttons;\n this.target = element;\n this.currentTarget = element;\n this.relatedTarget = related || null;\n this.preEnd = preEnd;\n this.type = action + (phase || '');\n this.interaction = interaction;\n this.interactable = target;\n\n this.t0 = starting ? interaction.downTimes[interaction.downTimes.length - 1]\n : prevEvent.t0;\n\n const signalArg = {\n interaction,\n event,\n action,\n phase,\n element,\n related,\n page,\n client,\n coords,\n starting,\n ending,\n deltaSource,\n iEvent: this,\n };\n\n signals.fire('set-xy', signalArg);\n\n if (ending) {\n // use previous coords when ending\n this.pageX = prevEvent.pageX;\n this.pageY = prevEvent.pageY;\n this.clientX = prevEvent.clientX;\n this.clientY = prevEvent.clientY;\n }\n else {\n this.pageX = page.x;\n this.pageY = page.y;\n this.clientX = client.x;\n this.clientY = client.y;\n }\n\n this.x0 = interaction.startCoords.page.x - origin.x;\n this.y0 = interaction.startCoords.page.y - origin.y;\n this.clientX0 = interaction.startCoords.client.x - origin.x;\n this.clientY0 = interaction.startCoords.client.y - origin.y;\n\n signals.fire('set-delta', signalArg);\n\n this.timeStamp = coords.timeStamp;\n this.dt = interaction.pointerDelta.timeStamp;\n this.duration = this.timeStamp - this.t0;\n\n // speed and velocity in pixels per second\n this.speed = interaction.pointerDelta[deltaSource].speed;\n this.velocityX = interaction.pointerDelta[deltaSource].vx;\n this.velocityY = interaction.pointerDelta[deltaSource].vy;\n\n this.swipe = (ending || phase === 'inertiastart')? this.getSwipe() : null;\n\n signals.fire('new', signalArg);\n }\n\n getSwipe () {\n const interaction = this.interaction;\n\n if (interaction.prevEvent.speed < 600\n || this.timeStamp - interaction.prevEvent.timeStamp > 150) {\n return null;\n }\n\n let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI;\n const overlap = 22.5;\n\n if (angle < 0) {\n angle += 360;\n }\n\n const left = 135 - overlap <= angle && angle < 225 + overlap;\n const up = 225 - overlap <= angle && angle < 315 + overlap;\n\n const right = !left && (315 - overlap <= angle || angle < 45 + overlap);\n const down = !up && 45 - overlap <= angle && angle < 135 + overlap;\n\n return {\n up,\n down,\n left,\n right,\n angle,\n speed: interaction.prevEvent.speed,\n velocity: {\n x: interaction.prevEvent.velocityX,\n y: interaction.prevEvent.velocityY,\n },\n };\n }\n\n preventDefault () {}\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n}\n\nsignals.on('set-delta', function ({ iEvent, interaction, starting, deltaSource }) {\n const prevEvent = starting? iEvent : interaction.prevEvent;\n\n if (deltaSource === 'client') {\n iEvent.dx = iEvent.clientX - prevEvent.clientX;\n iEvent.dy = iEvent.clientY - prevEvent.clientY;\n }\n else {\n iEvent.dx = iEvent.pageX - prevEvent.pageX;\n iEvent.dy = iEvent.pageY - prevEvent.pageY;\n }\n});\n\nInteractEvent.signals = signals;\n\nmodule.exports = InteractEvent;\n","const is = require('./utils/is');\nconst events = require('./utils/events');\nconst extend = require('./utils/extend');\nconst actions = require('./actions/base');\nconst scope = require('./scope');\nconst Eventable = require('./Eventable');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nconst {\n getElementRect,\n nodeContains,\n trySelector,\n} = require('./utils/domUtils');\nconst { getWindow } = require('./utils/window');\nconst { indexOf, contains } = require('./utils/arr');\nconst { wheelEvent } = require('./utils/browser');\n\n// all set interactables\nscope.interactables = [];\n\n/*\\\n * Interactable\n [ property ]\n **\n * Object type returned by @interact\n\\*/\nclass Interactable {\n constructor (target, options) {\n options = options || {};\n\n this.target = target;\n this.events = new Eventable();\n this._context = options.context || scope.document;\n this._win = getWindow(trySelector(target)? this._context : target);\n this._doc = this._win.document;\n\n signals.fire('new', {\n target,\n options,\n interactable: this,\n win: this._win,\n });\n\n scope.addDocument( this._doc, this._win );\n\n scope.interactables.push(this);\n\n this.set(options);\n }\n\n setOnEvents (action, phases) {\n const onAction = 'on' + action;\n\n if (is.function(phases.onstart) ) { this.events[onAction + 'start' ] = phases.onstart ; }\n if (is.function(phases.onmove) ) { this.events[onAction + 'move' ] = phases.onmove ; }\n if (is.function(phases.onend) ) { this.events[onAction + 'end' ] = phases.onend ; }\n if (is.function(phases.oninertiastart)) { this.events[onAction + 'inertiastart' ] = phases.oninertiastart ; }\n\n return this;\n }\n\n setPerAction (action, options) {\n // for all the default per-action options\n for (const option in options) {\n // if this option exists for this action\n if (option in defaults[action]) {\n // if the option in the options arg is an object value\n if (is.object(options[option])) {\n // duplicate the object\n this.options[action][option] = extend(this.options[action][option] || {}, options[option]);\n\n if (is.object(defaults.perAction[option]) && 'enabled' in defaults.perAction[option]) {\n this.options[action][option].enabled = options[option].enabled === false? false : true;\n }\n }\n else if (is.bool(options[option]) && is.object(defaults.perAction[option])) {\n this.options[action][option].enabled = options[option];\n }\n else if (options[option] !== undefined) {\n // or if it's not undefined, do a plain assignment\n this.options[action][option] = options[option];\n }\n }\n }\n }\n\n /*\\\n * Interactable.getRect\n [ method ]\n *\n * The default function to get an Interactables bounding rect. Can be\n * overridden using @Interactable.rectChecker.\n *\n - element (Element) #optional The element to measure.\n = (object) The object's bounding rectangle.\n o {\n o top : 0,\n o left : 0,\n o bottom: 0,\n o right : 0,\n o width : 0,\n o height: 0\n o }\n \\*/\n getRect (element) {\n element = element || this.target;\n\n if (is.string(this.target) && !(is.element(element))) {\n element = this._context.querySelector(this.target);\n }\n\n return getElementRect(element);\n }\n\n /*\\\n * Interactable.rectChecker\n [ method ]\n *\n * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n - checker (function) #optional A function which returns this Interactable's bounding rectangle. See @Interactable.getRect\n = (function | object) The checker function or this Interactable\n \\*/\n rectChecker (checker) {\n if (is.function(checker)) {\n this.getRect = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.getRect;\n\n return this;\n }\n\n return this.getRect;\n }\n\n _backCompatOption (optionName, newValue) {\n if (trySelector(newValue) || is.object(newValue)) {\n this.options[optionName] = newValue;\n\n for (const action of actions.names) {\n this.options[action][optionName] = newValue;\n }\n\n return this;\n }\n\n return this.options[optionName];\n }\n\n /*\\\n * Interactable.origin\n [ method ]\n *\n * Gets or sets the origin of the Interactable's element. The x and y\n * of the origin will be subtracted from action event coordinates.\n *\n - origin (object | string) #optional An object eg. { x: 0, y: 0 } or string 'parent', 'self' or any CSS selector\n * OR\n - origin (Element) #optional An HTML or SVG Element whose rect will be used\n **\n = (object) The current origin or this Interactable\n \\*/\n origin (newValue) {\n return this._backCompatOption('origin', newValue);\n }\n\n /*\\\n * Interactable.deltaSource\n [ method ]\n *\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n - newValue (string) #optional Use 'client' if you will be scrolling while interacting; Use 'page' if you want autoScroll to work\n = (string | object) The current deltaSource or this Interactable\n \\*/\n deltaSource (newValue) {\n if (newValue === 'page' || newValue === 'client') {\n this.options.deltaSource = newValue;\n\n return this;\n }\n\n return this.options.deltaSource;\n }\n\n /*\\\n * Interactable.context\n [ method ]\n *\n * Gets the selector context Node of the Interactable. The default is `window.document`.\n *\n = (Node) The context Node of this Interactable\n **\n \\*/\n context () {\n return this._context;\n }\n\n inContext (element) {\n return (this._context === element.ownerDocument\n || nodeContains(this._context, element));\n }\n\n /*\\\n * Interactable.fire\n [ method ]\n *\n * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n - iEvent (InteractEvent) The InteractEvent object to be fired on this Interactable\n = (Interactable) this Interactable\n \\*/\n fire (iEvent) {\n this.events.fire(iEvent);\n\n return this;\n }\n\n _onOffMultiple (method, eventType, listener, options) {\n if (is.string(eventType) && eventType.search(' ') !== -1) {\n eventType = eventType.trim().split(/ +/);\n }\n\n if (is.array(eventType)) {\n for (let i = 0; i < eventType.length; i++) {\n this[method](eventType[i], listener, options);\n }\n\n return true;\n }\n\n if (is.object(eventType)) {\n for (const prop in eventType) {\n this[method](prop, eventType[prop], listener);\n }\n\n return true;\n }\n }\n\n /*\\\n * Interactable.on\n [ method ]\n *\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n - eventType (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) This Interactable\n \\*/\n on (eventType, listener, options) {\n if (this._onOffMultiple('on', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.on(eventType, listener);\n }\n // delegated event for selector\n else if (is.string(this.target)) {\n events.addDelegate(this.target, this._context, eventType, listener, options);\n }\n else {\n events.add(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.off\n [ method ]\n *\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n - eventType (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) This Interactable\n \\*/\n off (eventType, listener, options) {\n if (this._onOffMultiple('off', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n // if it is an action event type\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.off(eventType, listener);\n }\n // delegated event\n else if (is.string(this.target)) {\n events.removeDelegate(this.target, this._context, eventType, listener, options);\n }\n // remove listener from this Interatable's element\n else {\n events.remove(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.set\n [ method ]\n *\n * Reset the options of this Interactable\n - options (object) The new settings to apply\n = (object) This Interactable\n \\*/\n set (options) {\n if (!is.object(options)) {\n options = {};\n }\n\n this.options = extend({}, defaults.base);\n\n const perActions = extend({}, defaults.perAction);\n\n for (const actionName in actions.methodDict) {\n const methodName = actions.methodDict[actionName];\n\n this.options[actionName] = extend({}, defaults[actionName]);\n\n this.setPerAction(actionName, perActions);\n\n this[methodName](options[actionName]);\n }\n\n for (const setting of Interactable.settingsMethods) {\n this.options[setting] = defaults.base[setting];\n\n if (setting in options) {\n this[setting](options[setting]);\n }\n }\n\n signals.fire('set', {\n options,\n interactable: this,\n });\n\n return this;\n }\n\n /*\\\n * Interactable.unset\n [ method ]\n *\n * Remove this interactable from the list of interactables and remove\n * it's action capabilities and event listeners\n *\n = (object) @interact\n \\*/\n unset () {\n events.remove(this.target, 'all');\n\n if (is.string(this.target)) {\n // remove delegated events\n for (const type in events.delegatedEvents) {\n const delegated = events.delegatedEvents[type];\n\n if (delegated.selectors[0] === this.target\n && delegated.contexts[0] === this._context) {\n\n delegated.selectors.splice(0, 1);\n delegated.contexts .splice(0, 1);\n delegated.listeners.splice(0, 1);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegated[type] = null;\n }\n }\n\n events.remove(this._context, type, events.delegateListener);\n events.remove(this._context, type, events.delegateUseCapture, true);\n }\n }\n else {\n events.remove(this, 'all');\n }\n\n signals.fire('unset', { interactable: this });\n\n scope.interactables.splice(indexOf(scope.interactables, this), 1);\n\n // Stop related interactions when an Interactable is unset\n for (const interaction of scope.interactions || []) {\n if (interaction.target === this && interaction.interacting()) {\n interaction.stop();\n }\n }\n\n return scope.interact;\n }\n}\n\nscope.interactables.indexOfElement = function indexOfElement (target, context) {\n context = context || scope.document;\n\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n if (interactable.target === target && interactable._context === context) {\n return i;\n }\n }\n return -1;\n};\n\nscope.interactables.get = function interactableGet (element, options, dontCheckInContext) {\n const ret = this[this.indexOfElement(element, options && options.context)];\n\n return ret && (is.string(element) || dontCheckInContext || ret.inContext(element))? ret : null;\n};\n\nscope.interactables.forEachSelector = function (callback, element) {\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n // skip non CSS selector targets and out of context elements\n if (!is.string(interactable.target)\n || (element && !interactable.inContext(element))) {\n continue;\n }\n\n const ret = callback(interactable, interactable.target, interactable._context, i, this);\n\n if (ret !== undefined) {\n return ret;\n }\n }\n};\n\n// all interact.js eventTypes\nInteractable.eventTypes = scope.eventTypes = [];\n\nInteractable.signals = signals;\n\nInteractable.settingsMethods = [ 'deltaSource', 'origin', 'preventDefault', 'rectChecker' ];\n\nmodule.exports = Interactable;\n","const scope = require('./scope');\nconst utils = require('./utils');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst finder = require('./utils/interactionFinder');\nconst signals = require('./utils/Signals').new();\n\nconst listeners = {};\nconst methodNames = [\n 'pointerDown', 'pointerMove', 'pointerUp',\n 'updatePointer', 'removePointer',\n];\n\n// for ignoring browser's simulated mouse events\nlet prevTouchTime = 0;\n\n// all active and idle interactions\nscope.interactions = [];\n\nclass Interaction {\n constructor () {\n this.target = null; // current interactable being interacted with\n this.element = null; // the target element of the interactable\n\n this.prepared = { // action that's ready to be fired on next move event\n name : null,\n axis : null,\n edges: null,\n };\n\n // keep track of added pointers\n this.pointers = [];\n this.pointerIds = [];\n this.downTargets = [];\n this.downTimes = [];\n\n // Previous native pointer move event coordinates\n this.prevCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n // current native pointer move event coordinates\n this.curCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Starting InteractEvent pointer coordinates\n this.startCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Change in coordinates and time of the pointer\n this.pointerDelta = {\n page : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n client : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n timeStamp: 0,\n };\n\n this.downEvent = null; // pointerdown/mousedown/touchstart event\n this.downPointer = {};\n\n this._eventTarget = null;\n this._curEventTarget = null;\n\n this.prevEvent = null; // previous action event\n\n this.pointerIsDown = false;\n this.pointerWasMoved = false;\n this._interacting = false;\n\n this.mouse = false;\n\n signals.fire('new', this);\n\n scope.interactions.push(this);\n }\n\n pointerDown (pointer, event, eventTarget) {\n const pointerIndex = this.updatePointer(pointer, event, true);\n\n signals.fire('down', {\n pointer,\n event,\n eventTarget,\n pointerIndex,\n interaction: this,\n });\n }\n\n /*\\\n * Interaction.start\n [ method ]\n *\n * Start an action with the given Interactable and Element as tartgets. The\n * action must be enabled for the target Interactable and an appropriate number\n * of pointers must be held down - 1 for drag/resize, 2 for gesture.\n *\n * Use it with `interactable.able({ manualStart: false })` to always\n * [start actions manually](https://github.com/taye/interact.js/issues/114)\n *\n - action (object) The action to be performed - drag, resize, etc.\n - target (Interactable) The Interactable to target\n - element (Element) The DOM Element to target\n = (object) interact\n **\n | interact(target)\n | .draggable({\n | // disable the default drag start by down->move\n | manualStart: true\n | })\n | // start dragging after the user holds the pointer down\n | .on('hold', function (event) {\n | var interaction = event.interaction;\n |\n | if (!interaction.interacting()) {\n | interaction.start({ name: 'drag' },\n | event.interactable,\n | event.currentTarget);\n | }\n | });\n \\*/\n start (action, target, element) {\n if (this.interacting()\n || !this.pointerIsDown\n || this.pointerIds.length < (action.name === 'gesture'? 2 : 1)) {\n return;\n }\n\n // if this interaction had been removed after stopping\n // add it back\n if (utils.indexOf(scope.interactions, this) === -1) {\n scope.interactions.push(this);\n }\n\n utils.copyAction(this.prepared, action);\n this.target = target;\n this.element = element;\n\n signals.fire('action-start', {\n interaction: this,\n event: this.downEvent,\n });\n }\n\n pointerMove (pointer, event, eventTarget) {\n if (!this.simulation) {\n this.updatePointer(pointer);\n utils.setCoords(this.curCoords, this.pointers);\n }\n\n const duplicateMove = (this.curCoords.page.x === this.prevCoords.page.x\n && this.curCoords.page.y === this.prevCoords.page.y\n && this.curCoords.client.x === this.prevCoords.client.x\n && this.curCoords.client.y === this.prevCoords.client.y);\n\n let dx;\n let dy;\n\n // register movement greater than pointerMoveTolerance\n if (this.pointerIsDown && !this.pointerWasMoved) {\n dx = this.curCoords.client.x - this.startCoords.client.x;\n dy = this.curCoords.client.y - this.startCoords.client.y;\n\n this.pointerWasMoved = utils.hypot(dx, dy) > Interaction.pointerMoveTolerance;\n }\n\n const signalArg = {\n pointer,\n pointerIndex: this.getPointerIndex(pointer),\n event,\n eventTarget,\n dx,\n dy,\n duplicate: duplicateMove,\n interaction: this,\n interactingBeforeMove: this.interacting(),\n };\n\n if (!duplicateMove) {\n // set pointer coordinate, time changes and speeds\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n }\n\n signals.fire('move', signalArg);\n\n if (!duplicateMove) {\n // if interacting, fire an 'action-move' signal etc\n if (this.interacting()) {\n this.doMove(signalArg);\n }\n\n if (this.pointerWasMoved) {\n utils.copyCoords(this.prevCoords, this.curCoords);\n }\n }\n }\n\n /*\\\n * Interaction.doMove\n [ method ]\n *\n * Force a move of the current action at the same coordinates. Useful if\n * snap/restrict has been changed and you want a movement with the new\n * settings.\n *\n **\n | interact(target)\n | .draggable(true)\n | .on('dragmove', function (event) {\n | if (someCondition) {\n | // change the snap settings\n | event.interactable.draggable({ snap: { targets: [] }});\n | // fire another move event with re-calculated snap\n | event.interaction.doMove();\n | }\n | });\n \\*/\n doMove (signalArg) {\n signalArg = utils.extend({\n pointer: this.pointers[0],\n event: this.prevEvent,\n eventTarget: this._eventTarget,\n interaction: this,\n }, signalArg || {});\n\n signals.fire('before-action-move', signalArg);\n\n if (!this._dontFireMove) {\n signals.fire('action-move', signalArg);\n }\n\n this._dontFireMove = false;\n }\n\n // End interact move events and stop auto-scroll unless simulation is running\n pointerUp (pointer, event, eventTarget, curEventTarget) {\n const pointerIndex = this.getPointerIndex(pointer);\n\n signals.fire(/cancel$/i.test(event.type)? 'cancel' : 'up', {\n pointer,\n pointerIndex,\n event,\n eventTarget,\n curEventTarget,\n interaction: this,\n });\n\n if (!this.simulation) {\n this.end(event);\n }\n\n this.pointerIsDown = false;\n this.removePointer(pointer, event);\n }\n\n /*\\\n * Interaction.end\n [ method ]\n *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n - event (PointerEvent) #optional\n **\n | interact(target)\n | .draggable(true)\n | .on('move', function (event) {\n | if (event.pageX > 1000) {\n | // end the current action\n | event.interaction.end();\n | // stop all further listeners from being called\n | event.stopImmediatePropagation();\n | }\n | });\n \\*/\n end (event) {\n event = event || this.prevEvent;\n\n if (this.interacting()) {\n signals.fire('action-end', {\n event,\n interaction: this,\n });\n }\n\n this.stop();\n }\n\n currentAction () {\n return this._interacting? this.prepared.name: null;\n }\n\n interacting () {\n return this._interacting;\n }\n\n stop () {\n signals.fire('stop', { interaction: this });\n\n if (this._interacting) {\n signals.fire('stop-active', { interaction: this });\n signals.fire('stop-' + this.prepared.name, { interaction: this });\n }\n\n this.target = this.element = null;\n\n this._interacting = false;\n this.prepared.name = this.prevEvent = null;\n }\n\n getPointerIndex (pointer) {\n return utils.indexOf(this.pointerIds, utils.getPointerId(pointer));\n }\n\n updatePointer (pointer, event, down = event && /(down|start)$/i.test(event.type)) {\n const id = utils.getPointerId(pointer);\n let index = this.getPointerIndex(pointer);\n\n if (index === -1) {\n index = this.pointerIds.length;\n this.pointerIds[index] = id;\n }\n\n if (down) {\n signals.fire('update-pointer-down', {\n pointer,\n event,\n down,\n pointerId: id,\n pointerIndex: index,\n interaction: this,\n });\n }\n\n this.pointers[index] = pointer;\n\n return index;\n }\n\n removePointer (pointer, event) {\n const id = utils.getPointerId(pointer);\n const index = this.mouse? 0 : utils.indexOf(this.pointerIds, id);\n\n if (index === -1) { return; }\n\n signals.fire('remove-pointer', {\n pointer,\n event,\n pointerIndex: index,\n interaction: this,\n });\n\n this.pointers .splice(index, 1);\n this.pointerIds .splice(index, 1);\n this.downTargets.splice(index, 1);\n this.downTimes .splice(index, 1);\n }\n\n _updateEventTargets (target, currentTarget) {\n this._eventTarget = target;\n this._curEventTarget = currentTarget;\n }\n}\n\nfor (let i = 0, len = methodNames.length; i < len; i++) {\n const method = methodNames[i];\n\n listeners[method] = doOnInteractions(method);\n}\n\nfunction doOnInteractions (method) {\n return (function (event) {\n const [eventTarget, curEventTarget] = utils.getEventTargets(event);\n const matches = []; // [ [pointer, interaction], ...]\n\n if (browser.supportsTouch && /touch/.test(event.type)) {\n prevTouchTime = new Date().getTime();\n\n for (let i = 0; i < event.changedTouches.length; i++) {\n const pointer = event.changedTouches[i];\n const interaction = finder.search(pointer, event.type, eventTarget);\n\n matches.push([pointer, interaction || new Interaction()]);\n }\n }\n else {\n let invalidPointer = false;\n\n if (!browser.supportsPointerEvent && /mouse/.test(event.type)) {\n // ignore mouse events while touch interactions are active\n for (let i = 0; i < scope.interactions.length && !invalidPointer; i++) {\n invalidPointer = !scope.interactions[i].mouse && scope.interactions[i].pointerIsDown;\n }\n\n // try to ignore mouse events that are simulated by the browser\n // after a touch event\n invalidPointer = invalidPointer\n || (new Date().getTime() - prevTouchTime < 500)\n // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated\n || event.timeStamp === 0;\n }\n\n if (!invalidPointer) {\n let interaction = finder.search(event, event.type, eventTarget);\n\n if (!interaction) {\n\n interaction = new Interaction();\n interaction.mouse = (/mouse/i.test(event.pointerType || event.type)\n // MSPointerEvent.MSPOINTER_TYPE_MOUSE\n || event.pointerType === 4\n || !event.pointerType);\n }\n\n matches.push([event, interaction]);\n }\n }\n\n for (const [pointer, interaction] of matches) {\n interaction._updateEventTargets(eventTarget, curEventTarget);\n interaction[method](pointer, event, eventTarget, curEventTarget);\n }\n });\n}\n\nfunction endAll (event) {\n for (let i = 0; i < scope.interactions.length; i++) {\n const interaction = scope.interactions[i];\n\n interaction.end(event);\n signals.fire('endall', { event, interaction });\n }\n}\n\nconst docEvents = { /* 'eventType': listenerFunc */ };\nconst pEventTypes = browser.pEventTypes;\n\nif (scope.PointerEvent) {\n docEvents[pEventTypes.down ] = listeners.pointerDown;\n docEvents[pEventTypes.move ] = listeners.pointerMove;\n docEvents[pEventTypes.up ] = listeners.pointerUp;\n docEvents[pEventTypes.cancel] = listeners.pointerUp;\n}\nelse {\n docEvents.mousedown = listeners.pointerDown;\n docEvents.mousemove = listeners.pointerMove;\n docEvents.mouseup = listeners.pointerUp;\n\n docEvents.touchstart = listeners.pointerDown;\n docEvents.touchmove = listeners.pointerMove;\n docEvents.touchend = listeners.pointerUp;\n docEvents.touchcancel = listeners.pointerUp;\n}\n\ndocEvents.blur = endAll;\n\nfunction onDocSignal ({ doc }, signalName) {\n const eventMethod = signalName.indexOf('add') === 0\n ? events.add : events.remove;\n\n // delegate event listener\n for (const eventType in scope.delegatedEvents) {\n eventMethod(doc, eventType, events.delegateListener);\n eventMethod(doc, eventType, events.delegateUseCapture, true);\n }\n\n for (const eventType in docEvents) {\n eventMethod(doc, eventType, docEvents[eventType]);\n }\n}\n\nsignals.on('update-pointer-down', ({ interaction, pointer, pointerId, pointerIndex, event, eventTarget, down }) => {\n interaction.pointerIds[pointerIndex] = pointerId;\n interaction.pointers[pointerIndex] = pointer;\n\n if (down) {\n interaction.pointerIsDown = true;\n }\n\n if (!interaction.interacting()) {\n utils.setCoords(interaction.startCoords, interaction.pointers);\n\n utils.copyCoords(interaction.curCoords , interaction.startCoords);\n utils.copyCoords(interaction.prevCoords, interaction.startCoords);\n\n interaction.downEvent = event;\n interaction.downTimes[pointerIndex] = interaction.curCoords.timeStamp;\n interaction.downTargets[pointerIndex] = eventTarget || event && utils.getEventTargets(event)[0];\n interaction.pointerWasMoved = false;\n\n utils.pointerExtend(interaction.downPointer, pointer);\n }\n});\n\nscope.signals.on('add-document' , onDocSignal);\nscope.signals.on('remove-document', onDocSignal);\n\nInteraction.pointerMoveTolerance = 1;\nInteraction.doOnInteractions = doOnInteractions;\nInteraction.endAll = endAll;\nInteraction.signals = signals;\nInteraction.docEvents = docEvents;\n\nscope.endAllInteractions = endAll;\n\nmodule.exports = Interaction;\n","const Interaction = require('../Interaction');\nconst InteractEvent = require('../InteractEvent');\n\nconst actions = {\n firePrepared,\n names: [],\n methodDict: {},\n};\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n interaction._interacting = true;\n firePrepared(interaction, event, 'start');\n});\n\nInteraction.signals.on('action-move', function ({ interaction, event, preEnd }) {\n firePrepared(interaction, event, 'move', preEnd);\n\n // if the action was ended in a listener\n if (!interaction.interacting()) { return false; }\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n firePrepared(interaction, event, 'end');\n});\n\nfunction firePrepared (interaction, event, phase, preEnd) {\n const actionName = interaction.prepared.name;\n\n const newEvent = new InteractEvent(interaction, event, actionName, phase, interaction.element, null, preEnd);\n\n interaction.target.fire(newEvent);\n interaction.prevEvent = newEvent;\n}\n\nmodule.exports = actions;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drag = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n startAxis : 'xy',\n lockAxis : 'xy',\n },\n\n checker: function (pointer, event, interactable) {\n const dragOptions = interactable.options.drag;\n\n return dragOptions.enabled\n ? { name: 'drag', axis: (dragOptions.lockAxis === 'start'\n ? dragOptions.startAxis\n : dragOptions.lockAxis)}\n : null;\n },\n\n getCursor: function () {\n return 'move';\n },\n};\n\nInteraction.signals.on('before-action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n interaction.curCoords.page.y = interaction.startCoords.page.y;\n interaction.curCoords.client.y = interaction.startCoords.client.y;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vx);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vx);\n interaction.pointerDelta.client.vy = 0;\n interaction.pointerDelta.page.vy = 0;\n }\n else if (axis === 'y') {\n interaction.curCoords.page.x = interaction.startCoords.page.x;\n interaction.curCoords.client.x = interaction.startCoords.client.x;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vy);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vy);\n interaction.pointerDelta.client.vx = 0;\n interaction.pointerDelta.page.vx = 0;\n }\n});\n\n// dragmove\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'dragmove') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n iEvent.pageY = interaction.startCoords.page.y;\n iEvent.clientY = interaction.startCoords.client.y;\n iEvent.dy = 0;\n }\n else if (axis === 'y') {\n iEvent.pageX = interaction.startCoords.page.x;\n iEvent.clientX = interaction.startCoords.client.x;\n iEvent.dx = 0;\n }\n});\n\n/*\\\n * Interactable.draggable\n [ method ]\n *\n * Gets or sets whether drag actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of drag events\n | var isDraggable = interact('ul li').draggable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on drag events (object makes the Interactable draggable)\n = (object) This Interactable\n | interact(element).draggable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // the axis in which the first movement must be\n | // for the drag sequence to start\n | // 'xy' by default - any direction\n | startAxis: 'x' || 'y' || 'xy',\n |\n | // 'xy' by default - don't restrict to one axis (move in any direction)\n | // 'x' or 'y' to restrict movement to either axis\n | // 'start' to restrict movement to the axis the drag started in\n | lockAxis: 'x' || 'y' || 'xy' || 'start',\n |\n | // max number of drags that can happen concurrently\n | // with elements of this Interactable. Infinity by default\n | max: Infinity,\n |\n | // max number of drags that can target the same element+Interactable\n | // 1 by default\n | maxPerElement: 2\n | });\n\\*/\nInteractable.prototype.draggable = function (options) {\n if (utils.is.object(options)) {\n this.options.drag.enabled = options.enabled === false? false: true;\n this.setPerAction('drag', options);\n this.setOnEvents('drag', options);\n\n if (/^(xy|x|y|start)$/.test(options.lockAxis)) {\n this.options.drag.lockAxis = options.lockAxis;\n }\n if (/^(xy|x|y)$/.test(options.startAxis)) {\n this.options.drag.startAxis = options.startAxis;\n }\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drag.enabled = options;\n\n if (!options) {\n this.ondragstart = this.ondragstart = this.ondragend = null;\n }\n\n return this;\n }\n\n return this.options.drag;\n};\n\nactions.drag = drag;\nactions.names.push('drag');\nutils.merge(Interactable.eventTypes, [\n 'dragstart',\n 'dragmove',\n 'draginertiastart',\n 'draginertiaresume',\n 'dragend',\n]);\nactions.methodDict.drag = 'draggable';\n\ndefaultOptions.drag = drag.defaults;\n\nmodule.exports = drag;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst scope = require('../scope');\nconst interact = require('../interact');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drop = {\n defaults: {\n enabled: false,\n accept : null,\n overlap: 'pointer',\n },\n};\n\nlet dynamicDrop = false;\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // reset active dropzones\n interaction.activeDrops.dropzones = [];\n interaction.activeDrops.elements = [];\n interaction.activeDrops.rects = [];\n\n interaction.dropEvents = null;\n\n if (!interaction.dynamicDrop) {\n setActiveDrops(interaction, interaction.element);\n }\n\n const dragEvent = interaction.prevEvent;\n const dropEvents = getDropEvents(interaction, event, dragEvent);\n\n if (dropEvents.activate) {\n fireActiveDrops(interaction, dropEvents.activate);\n }\n});\n\nInteractEvent.signals.on('new', function ({ interaction, iEvent, event }) {\n if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { return; }\n\n const draggableElement = interaction.element;\n const dragEvent = iEvent;\n const dropResult = getDrop(dragEvent, event, draggableElement);\n\n interaction.dropTarget = dropResult.dropzone;\n interaction.dropElement = dropResult.element;\n\n interaction.dropEvents = getDropEvents(interaction, event, dragEvent);\n});\n\nInteraction.signals.on('action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n fireDropEvents(interaction, interaction.dropEvents);\n});\n\nInteraction.signals.on('action-end', function ({ interaction }) {\n if (interaction.prepared.name === 'drag') {\n fireDropEvents(interaction, interaction.dropEvents);\n }\n});\n\nInteraction.signals.on('stop-drag', function ({ interaction }) {\n interaction.activeDrops.dropzones =\n interaction.activeDrops.elements =\n interaction.activeDrops.rects =\n interaction.dropEvents = null;\n});\n\nfunction collectDrops (interaction, element) {\n const drops = [];\n const elements = [];\n\n element = element || interaction.element;\n\n // collect all dropzones and their elements which qualify for a drop\n for (const current of scope.interactables) {\n if (!current.options.drop.enabled) { continue; }\n\n const accept = current.options.drop.accept;\n\n // test the draggable element against the dropzone's accept setting\n if ((utils.is.element(accept) && accept !== element)\n || (utils.is.string(accept)\n && !utils.matchesSelector(element, accept))) {\n\n continue;\n }\n\n // query for new elements if necessary\n const dropElements = utils.is.string(current.target)\n ? current._context.querySelectorAll(current.target)\n : [current.target];\n\n for (let i = 0; i < dropElements.length; i++) {\n const currentElement = dropElements[i];\n\n if (currentElement !== element) {\n drops.push(current);\n elements.push(currentElement);\n }\n }\n }\n\n return {\n elements,\n dropzones: drops,\n };\n}\n\nfunction fireActiveDrops (interaction, event) {\n let prevElement;\n\n // loop through all active dropzones and trigger event\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n const current = interaction.activeDrops.dropzones[i];\n const currentElement = interaction.activeDrops.elements [i];\n\n // prevent trigger of duplicate events on same element\n if (currentElement !== prevElement) {\n // set current element as event target\n event.target = currentElement;\n current.fire(event);\n }\n prevElement = currentElement;\n }\n}\n\n// Collect a new set of possible drops and save them in activeDrops.\n// setActiveDrops should always be called when a drag has just started or a\n// drag event happens while dynamicDrop is true\nfunction setActiveDrops (interaction, dragElement) {\n // get dropzones and their elements that could receive the draggable\n const possibleDrops = collectDrops(interaction, dragElement, true);\n\n interaction.activeDrops.dropzones = possibleDrops.dropzones;\n interaction.activeDrops.elements = possibleDrops.elements;\n interaction.activeDrops.rects = [];\n\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n interaction.activeDrops.rects[i] =\n interaction.activeDrops.dropzones[i].getRect(interaction.activeDrops.elements[i]);\n }\n}\n\nfunction getDrop (dragEvent, event, dragElement) {\n const interaction = dragEvent.interaction;\n const validDrops = [];\n\n if (dynamicDrop) {\n setActiveDrops(interaction, dragElement);\n }\n\n // collect all dropzones and their elements which qualify for a drop\n for (let j = 0; j < interaction.activeDrops.dropzones.length; j++) {\n const current = interaction.activeDrops.dropzones[j];\n const currentElement = interaction.activeDrops.elements [j];\n const rect = interaction.activeDrops.rects [j];\n\n validDrops.push(current.dropCheck(dragEvent, event, interaction.target, dragElement, currentElement, rect)\n ? currentElement\n : null);\n }\n\n // get the most appropriate dropzone based on DOM depth and order\n const dropIndex = utils.indexOfDeepestElement(validDrops);\n\n return {\n dropzone: interaction.activeDrops.dropzones[dropIndex] || null,\n element : interaction.activeDrops.elements [dropIndex] || null,\n };\n}\n\nfunction getDropEvents (interaction, pointerEvent, dragEvent) {\n const dropEvents = {\n enter : null,\n leave : null,\n activate : null,\n deactivate: null,\n move : null,\n drop : null,\n };\n\n const tmpl = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n };\n\n if (interaction.dropElement !== interaction.prevDropElement) {\n // if there was a prevDropTarget, create a dragleave event\n if (interaction.prevDropTarget) {\n dropEvents.leave = utils.extend({ type: 'dragleave' }, tmpl);\n\n dragEvent.dragLeave = dropEvents.leave.target = interaction.prevDropElement;\n dragEvent.prevDropzone = dropEvents.leave.dropzone = interaction.prevDropTarget;\n }\n // if the dropTarget is not null, create a dragenter event\n if (interaction.dropTarget) {\n dropEvents.enter = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n type : 'dragenter',\n };\n\n dragEvent.dragEnter = interaction.dropElement;\n dragEvent.dropzone = interaction.dropTarget;\n }\n }\n\n if (dragEvent.type === 'dragend' && interaction.dropTarget) {\n dropEvents.drop = utils.extend({ type: 'drop' }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n dragEvent.relatedTarget = interaction.dropElement;\n }\n if (dragEvent.type === 'dragstart') {\n dropEvents.activate = utils.extend({ type: 'dropactivate' }, tmpl);\n\n dropEvents.activate.target = null;\n dropEvents.activate.dropzone = null;\n }\n if (dragEvent.type === 'dragend') {\n dropEvents.deactivate = utils.extend({ type: 'dropdeactivate' }, tmpl);\n\n dropEvents.deactivate.target = null;\n dropEvents.deactivate.dropzone = null;\n }\n if (dragEvent.type === 'dragmove' && interaction.dropTarget) {\n dropEvents.move = utils.extend({\n dragmove : dragEvent,\n type : 'dropmove',\n }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n }\n\n return dropEvents;\n}\n\nfunction fireDropEvents (interaction, dropEvents) {\n if (dropEvents.leave) { interaction.prevDropTarget.fire(dropEvents.leave); }\n if (dropEvents.move ) { interaction.dropTarget.fire(dropEvents.move ); }\n if (dropEvents.enter) { interaction.dropTarget.fire(dropEvents.enter); }\n if (dropEvents.drop ) { interaction.dropTarget.fire(dropEvents.drop ); }\n if (dropEvents.deactivate) {\n fireActiveDrops(interaction, dropEvents.deactivate);\n }\n\n interaction.prevDropTarget = interaction.dropTarget;\n interaction.prevDropElement = interaction.dropElement;\n}\n\n/*\\\n * Interactable.dropzone\n [ method ]\n *\n * Returns or sets whether elements can be dropped onto this\n * Interactable to trigger drop events\n *\n * Dropzones can receive the following events:\n * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends\n * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone\n * - `dragmove` when a draggable that has entered the dropzone is moved\n * - `drop` when a draggable is dropped into this dropzone\n *\n * Use the `accept` option to allow only elements that match the given CSS\n * selector or element. The value can be:\n *\n * - **an Element** - only that element can be dropped into this dropzone.\n * - **a string**, - the element being dragged must match it as a CSS selector.\n * - **`null`** - accept options is cleared - it accepts any element.\n *\n * Use the `overlap` option to set how drops are checked for. The allowed\n * values are:\n *\n * - `'pointer'`, the pointer must be over the dropzone (default)\n * - `'center'`, the draggable element's center must be over the dropzone\n * - a number from 0-1 which is the `(intersection area) / (draggable area)`.\n * e.g. `0.5` for drop to happen when half of the area of the draggable is\n * over the dropzone\n *\n * Use the `checker` option to specify a function to check if a dragged\n * element is over this Interactable.\n *\n | interact(target)\n | .dropChecker(function(dragEvent, // related dragmove or dragend event\n | event, // TouchEvent/PointerEvent/MouseEvent\n | dropped, // bool result of the default checker\n | dropzone, // dropzone Interactable\n | dropElement, // dropzone elemnt\n | draggable, // draggable Interactable\n | draggableElement) {// draggable element\n |\n | return dropped && event.target.hasAttribute('allow-drop');\n | }\n *\n *\n - options (boolean | object | null) #optional The new value to be set.\n | interact('.drop').dropzone({\n | accept: '.can-drop' || document.getElementById('single-drop'),\n | overlap: 'pointer' || 'center' || zeroToOne\n | }\n = (boolean | object) The current setting or this Interactable\n\\*/\nInteractable.prototype.dropzone = function (options) {\n if (utils.is.object(options)) {\n this.options.drop.enabled = options.enabled === false? false: true;\n\n if (utils.is.function(options.ondrop) ) { this.events.ondrop = options.ondrop ; }\n if (utils.is.function(options.ondropactivate) ) { this.events.ondropactivate = options.ondropactivate ; }\n if (utils.is.function(options.ondropdeactivate)) { this.events.ondropdeactivate = options.ondropdeactivate; }\n if (utils.is.function(options.ondragenter) ) { this.events.ondragenter = options.ondragenter ; }\n if (utils.is.function(options.ondragleave) ) { this.events.ondragleave = options.ondragleave ; }\n if (utils.is.function(options.ondropmove) ) { this.events.ondropmove = options.ondropmove ; }\n\n if (/^(pointer|center)$/.test(options.overlap)) {\n this.options.drop.overlap = options.overlap;\n }\n else if (utils.is.number(options.overlap)) {\n this.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0);\n }\n if ('accept' in options) {\n this.options.drop.accept = options.accept;\n }\n if ('checker' in options) {\n this.options.drop.checker = options.checker;\n }\n\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drop.enabled = options;\n\n if (!options) {\n this.ondragenter = this.ondragleave = this.ondrop\n = this.ondropactivate = this.ondropdeactivate = null;\n }\n\n return this;\n }\n\n return this.options.drop;\n};\n\nInteractable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) {\n let dropped = false;\n\n // if the dropzone has no rect (eg. display: none)\n // call the custom dropChecker or just return false\n if (!(rect = rect || this.getRect(dropElement))) {\n return (this.options.drop.checker\n ? this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement)\n : false);\n }\n\n const dropOverlap = this.options.drop.overlap;\n\n if (dropOverlap === 'pointer') {\n const origin = utils.getOriginXY(draggable, draggableElement, 'drag');\n const page = utils.getPageXY(dragEvent);\n\n page.x += origin.x;\n page.y += origin.y;\n\n const horizontal = (page.x > rect.left) && (page.x < rect.right);\n const vertical = (page.y > rect.top ) && (page.y < rect.bottom);\n\n dropped = horizontal && vertical;\n }\n\n const dragRect = draggable.getRect(draggableElement);\n\n if (dragRect && dropOverlap === 'center') {\n const cx = dragRect.left + dragRect.width / 2;\n const cy = dragRect.top + dragRect.height / 2;\n\n dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom;\n }\n\n if (dragRect && utils.is.number(dropOverlap)) {\n const overlapArea = (Math.max(0, Math.min(rect.right , dragRect.right ) - Math.max(rect.left, dragRect.left))\n * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top , dragRect.top )));\n\n const overlapRatio = overlapArea / (dragRect.width * dragRect.height);\n\n dropped = overlapRatio >= dropOverlap;\n }\n\n if (this.options.drop.checker) {\n dropped = this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement);\n }\n\n return dropped;\n};\n\nInteractable.signals.on('unset', function ({ interactable }) {\n interactable.dropzone(false);\n});\n\nInteractable.settingsMethods.push('dropChecker');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.dropTarget = null; // the dropzone a drag target might be dropped into\n interaction.dropElement = null; // the element at the time of checking\n interaction.prevDropTarget = null; // the dropzone that was recently dragged away from\n interaction.prevDropElement = null; // the element at the time of checking\n interaction.dropEvents = null; // the dropEvents related to the current drag event\n\n interaction.activeDrops = {\n dropzones: [], // the dropzones that are mentioned below\n elements : [], // elements of dropzones that accept the target draggable\n rects : [], // the rects of the elements mentioned above\n };\n\n});\n\nInteraction.signals.on('stop', function ({ interaction }) {\n interaction.dropTarget = interaction.dropElement =\n interaction.prevDropTarget = interaction.prevDropElement = null;\n});\n\n/*\\\n * interact.dynamicDrop\n [ method ]\n *\n * Returns or sets whether the dimensions of dropzone elements are\n * calculated on every dragmove or only on dragstart for the default\n * dropChecker\n *\n - newValue (boolean) #optional True to check on each move. False to check only before start\n = (boolean | interact) The current setting or interact\n\\*/\ninteract.dynamicDrop = function (newValue) {\n if (utils.is.bool(newValue)) {\n //if (dragging && dynamicDrop !== newValue && !newValue) {\n //calcRects(dropzones);\n //}\n\n dynamicDrop = newValue;\n\n return interact;\n }\n return dynamicDrop;\n};\n\nutils.merge(Interactable.eventTypes, [\n 'dragenter',\n 'dragleave',\n 'dropactivate',\n 'dropdeactivate',\n 'dropmove',\n 'drop',\n]);\nactions.methodDict.drop = 'dropzone';\n\ndefaultOptions.drop = drop.defaults;\n\nmodule.exports = drop;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst gesture = {\n defaults: {\n enabled : false,\n origin : null,\n restrict: null,\n },\n\n checker: function (pointer, event, interactable, element, interaction) {\n if (interaction.pointerIds.length >= 2) {\n return { name: 'gesture' };\n }\n\n return null;\n },\n\n getCursor: function () {\n return '';\n },\n};\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturestart') { return; }\n iEvent.ds = 0;\n\n interaction.gesture.startDistance = interaction.gesture.prevDistance = iEvent.distance;\n interaction.gesture.startAngle = interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.scale = 1;\n});\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturemove') { return; }\n\n iEvent.ds = iEvent.scale - interaction.gesture.scale;\n\n interaction.target.fire(iEvent);\n\n interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.prevDistance = iEvent.distance;\n\n if (iEvent.scale !== Infinity\n && iEvent.scale !== null\n && iEvent.scale !== undefined\n && !isNaN(iEvent.scale)) {\n\n interaction.gesture.scale = iEvent.scale;\n }\n});\n\n/*\\\n * Interactable.gesturable\n [ method ]\n *\n * Gets or sets whether multitouch gestures can be performed on the\n * Interactable's element\n *\n = (boolean) Indicates if this can be the target of gesture events\n | var isGestureable = interact(element).gesturable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on gesture events (makes the Interactable gesturable)\n = (object) this Interactable\n | interact(element).gesturable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // limit multiple gestures.\n | // See the explanation in @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n\\*/\nInteractable.prototype.gesturable = function (options) {\n if (utils.is.object(options)) {\n this.options.gesture.enabled = options.enabled === false? false: true;\n this.setPerAction('gesture', options);\n this.setOnEvents('gesture', options);\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.gesture.enabled = options;\n\n if (!options) {\n this.ongesturestart = this.ongesturestart = this.ongestureend = null;\n }\n\n return this;\n }\n\n return this.options.gesture;\n};\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action, event, starting, ending, deltaSource }) {\n if (action !== 'gesture') { return; }\n\n const pointers = interaction.pointers;\n\n iEvent.touches = [pointers[0], pointers[1]];\n\n if (starting) {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = 1;\n iEvent.ds = 0;\n iEvent.angle = utils.touchAngle(pointers, undefined, deltaSource);\n iEvent.da = 0;\n }\n else if (ending || event instanceof InteractEvent) {\n iEvent.distance = interaction.prevEvent.distance;\n iEvent.box = interaction.prevEvent.box;\n iEvent.scale = interaction.prevEvent.scale;\n iEvent.ds = iEvent.scale - 1;\n iEvent.angle = interaction.prevEvent.angle;\n iEvent.da = iEvent.angle - interaction.gesture.startAngle;\n }\n else {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = iEvent.distance / interaction.gesture.startDistance;\n iEvent.angle = utils.touchAngle(pointers, interaction.gesture.prevAngle, deltaSource);\n\n iEvent.ds = iEvent.scale - interaction.gesture.prevScale;\n iEvent.da = iEvent.angle - interaction.gesture.prevAngle;\n }\n});\n\nInteraction.signals.on('new', function (interaction) {\n interaction.gesture = {\n start: { x: 0, y: 0 },\n\n startDistance: 0, // distance between two touches of touchStart\n prevDistance : 0,\n distance : 0,\n\n scale: 1, // gesture.distance / gesture.startDistance\n\n startAngle: 0, // angle of line joining two touches\n prevAngle : 0, // angle of the previous gesture event\n };\n});\n\nactions.gesture = gesture;\nactions.names.push('gesture');\nutils.merge(Interactable.eventTypes, [\n 'gesturestart',\n 'gesturemove',\n 'gestureend',\n]);\nactions.methodDict.gesture = 'gesturable';\n\ndefaultOptions.gesture = gesture.defaults;\n\nmodule.exports = gesture;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\n// Less Precision with touch input\nconst defaultMargin = browser.supportsTouch || browser.supportsPointerEvent? 20: 10;\n\nconst resize = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n square: false,\n preserveAspectRatio: false,\n axis: 'xy',\n\n // use default margin\n margin: NaN,\n\n // object with props left, right, top, bottom which are\n // true/false values to resize when the pointer is over that edge,\n // CSS selectors to match the handles for each direction\n // or the Elements for each handle\n edges: null,\n\n // a value of 'none' will limit the resize rect to a minimum of 0x0\n // 'negate' will alow the rect to have negative width/height\n // 'reposition' will keep the width/height positive by swapping\n // the top and bottom edges and/or swapping the left and right edges\n invert: 'none',\n },\n\n checker: function (pointer, event, interactable, element, interaction, rect) {\n if (!rect) { return null; }\n\n const page = utils.extend({}, interaction.curCoords.page);\n const options = interactable.options;\n\n if (options.resize.enabled) {\n const resizeOptions = options.resize;\n const resizeEdges = { left: false, right: false, top: false, bottom: false };\n\n // if using resize.edges\n if (utils.is.object(resizeOptions.edges)) {\n for (const edge in resizeEdges) {\n resizeEdges[edge] = checkResizeEdge(edge,\n resizeOptions.edges[edge],\n page,\n interaction._eventTarget,\n element,\n rect,\n resizeOptions.margin || defaultMargin);\n }\n\n resizeEdges.left = resizeEdges.left && !resizeEdges.right;\n resizeEdges.top = resizeEdges.top && !resizeEdges.bottom;\n\n if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) {\n return {\n name: 'resize',\n edges: resizeEdges,\n };\n }\n }\n else {\n const right = options.resize.axis !== 'y' && page.x > (rect.right - defaultMargin);\n const bottom = options.resize.axis !== 'x' && page.y > (rect.bottom - defaultMargin);\n\n if (right || bottom) {\n return {\n name: 'resize',\n axes: (right? 'x' : '') + (bottom? 'y' : ''),\n };\n }\n }\n }\n\n return null;\n },\n\n cursors: (browser.isIe9OrOlder ? {\n x : 'e-resize',\n y : 's-resize',\n xy: 'se-resize',\n\n top : 'n-resize',\n left : 'w-resize',\n bottom : 's-resize',\n right : 'e-resize',\n topleft : 'se-resize',\n bottomright: 'se-resize',\n topright : 'ne-resize',\n bottomleft : 'ne-resize',\n } : {\n x : 'ew-resize',\n y : 'ns-resize',\n xy: 'nwse-resize',\n\n top : 'ns-resize',\n left : 'ew-resize',\n bottom : 'ns-resize',\n right : 'ew-resize',\n topleft : 'nwse-resize',\n bottomright: 'nwse-resize',\n topright : 'nesw-resize',\n bottomleft : 'nesw-resize',\n }),\n\n getCursor: function (action) {\n if (action.axis) {\n return resize.cursors[action.name + action.axis];\n }\n else if (action.edges) {\n let cursorKey = '';\n const edgeNames = ['top', 'bottom', 'left', 'right'];\n\n for (let i = 0; i < 4; i++) {\n if (action.edges[edgeNames[i]]) {\n cursorKey += edgeNames[i];\n }\n }\n\n return resize.cursors[cursorKey];\n }\n },\n};\n\n// resizestart\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'resizestart' || !interaction.prepared.edges) {\n return;\n }\n\n const startRect = interaction.target.getRect(interaction.element);\n const resizeOptions = interaction.target.options.resize;\n\n /*\n * When using the `resizable.square` or `resizable.preserveAspectRatio` options, resizing from one edge\n * will affect another. E.g. with `resizable.square`, resizing to make the right edge larger will make\n * the bottom edge larger by the same amount. We call these 'linked' edges. Any linked edges will depend\n * on the active edges and the edge being interacted with.\n */\n if (resizeOptions.square || resizeOptions.preserveAspectRatio) {\n const linkedEdges = utils.extend({}, interaction.prepared.edges);\n\n linkedEdges.top = linkedEdges.top || (linkedEdges.left && !linkedEdges.bottom);\n linkedEdges.left = linkedEdges.left || (linkedEdges.top && !linkedEdges.right );\n linkedEdges.bottom = linkedEdges.bottom || (linkedEdges.right && !linkedEdges.top );\n linkedEdges.right = linkedEdges.right || (linkedEdges.bottom && !linkedEdges.left );\n\n interaction.prepared._linkedEdges = linkedEdges;\n }\n else {\n interaction.prepared._linkedEdges = null;\n }\n\n // if using `resizable.preserveAspectRatio` option, record aspect ratio at the start of the resize\n if (resizeOptions.preserveAspectRatio) {\n interaction.resizeStartAspectRatio = startRect.width / startRect.height;\n }\n\n interaction.resizeRects = {\n start : startRect,\n current : utils.extend({}, startRect),\n inverted : utils.extend({}, startRect),\n previous : utils.extend({}, startRect),\n delta : {\n left: 0, right : 0, width : 0,\n top : 0, bottom: 0, height: 0,\n },\n };\n\n iEvent.rect = interaction.resizeRects.inverted;\n iEvent.deltaRect = interaction.resizeRects.delta;\n});\n\n// resizemove\nInteractEvent.signals.on('new', function ({ iEvent, phase, interaction }) {\n if (phase !== 'move' || !interaction.prepared.edges) { return; }\n\n const resizeOptions = interaction.target.options.resize;\n const invert = resizeOptions.invert;\n const invertible = invert === 'reposition' || invert === 'negate';\n\n let edges = interaction.prepared.edges;\n\n const start = interaction.resizeRects.start;\n const current = interaction.resizeRects.current;\n const inverted = interaction.resizeRects.inverted;\n const delta = interaction.resizeRects.delta;\n const previous = utils.extend(interaction.resizeRects.previous, inverted);\n const originalEdges = edges;\n\n let dx = iEvent.dx;\n let dy = iEvent.dy;\n\n if (resizeOptions.preserveAspectRatio || resizeOptions.square) {\n // `resize.preserveAspectRatio` takes precedence over `resize.square`\n const startAspectRatio = resizeOptions.preserveAspectRatio\n ? interaction.resizeStartAspectRatio\n : 1;\n\n edges = interaction.prepared._linkedEdges;\n\n if ((originalEdges.left && originalEdges.bottom)\n || (originalEdges.right && originalEdges.top)) {\n dy = -dx / startAspectRatio;\n }\n else if (originalEdges.left || originalEdges.right ) { dy = dx / startAspectRatio; }\n else if (originalEdges.top || originalEdges.bottom) { dx = dy * startAspectRatio; }\n }\n\n // update the 'current' rect without modifications\n if (edges.top ) { current.top += dy; }\n if (edges.bottom) { current.bottom += dy; }\n if (edges.left ) { current.left += dx; }\n if (edges.right ) { current.right += dx; }\n\n if (invertible) {\n // if invertible, copy the current rect\n utils.extend(inverted, current);\n\n if (invert === 'reposition') {\n // swap edge values if necessary to keep width/height positive\n let swap;\n\n if (inverted.top > inverted.bottom) {\n swap = inverted.top;\n\n inverted.top = inverted.bottom;\n inverted.bottom = swap;\n }\n if (inverted.left > inverted.right) {\n swap = inverted.left;\n\n inverted.left = inverted.right;\n inverted.right = swap;\n }\n }\n }\n else {\n // if not invertible, restrict to minimum of 0x0 rect\n inverted.top = Math.min(current.top, start.bottom);\n inverted.bottom = Math.max(current.bottom, start.top);\n inverted.left = Math.min(current.left, start.right);\n inverted.right = Math.max(current.right, start.left);\n }\n\n inverted.width = inverted.right - inverted.left;\n inverted.height = inverted.bottom - inverted.top ;\n\n for (const edge in inverted) {\n delta[edge] = inverted[edge] - previous[edge];\n }\n\n iEvent.edges = interaction.prepared.edges;\n iEvent.rect = inverted;\n iEvent.deltaRect = delta;\n});\n\n/*\\\n * Interactable.resizable\n [ method ]\n *\n * Gets or sets whether resize actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of resize elements\n | var isResizeable = interact('input[type=text]').resizable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on resize events (object makes the Interactable resizable)\n = (object) This Interactable\n | interact(element).resizable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | edges: {\n | top : true, // Use pointer coords to check for resize.\n | left : false, // Disable resizing from left edge.\n | bottom: '.resize-s',// Resize if pointer target matches selector\n | right : handleEl // Resize if pointer target is the given Element\n | },\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height are adjusted at a 1:1 ratio.\n | square: false,\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height maintain the aspect ratio they had when resizing started.\n | preserveAspectRatio: false,\n |\n | // a value of 'none' will limit the resize rect to a minimum of 0x0\n | // 'negate' will allow the rect to have negative width/height\n | // 'reposition' will keep the width/height positive by swapping\n | // the top and bottom edges and/or swapping the left and right edges\n | invert: 'none' || 'negate' || 'reposition'\n |\n | // limit multiple resizes.\n | // See the explanation in the @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n \\*/\nInteractable.prototype.resizable = function (options) {\n if (utils.is.object(options)) {\n this.options.resize.enabled = options.enabled === false? false: true;\n this.setPerAction('resize', options);\n this.setOnEvents('resize', options);\n\n if (/^x$|^y$|^xy$/.test(options.axis)) {\n this.options.resize.axis = options.axis;\n }\n else if (options.axis === null) {\n this.options.resize.axis = defaultOptions.resize.axis;\n }\n\n if (utils.is.bool(options.preserveAspectRatio)) {\n this.options.resize.preserveAspectRatio = options.preserveAspectRatio;\n }\n else if (utils.is.bool(options.square)) {\n this.options.resize.square = options.square;\n }\n\n return this;\n }\n if (utils.is.bool(options)) {\n this.options.resize.enabled = options;\n\n if (!options) {\n this.onresizestart = this.onresizestart = this.onresizeend = null;\n }\n\n return this;\n }\n return this.options.resize;\n};\n\nfunction checkResizeEdge (name, value, page, element, interactableElement, rect, margin) {\n // false, '', undefined, null\n if (!value) { return false; }\n\n // true value, use pointer coords and element rect\n if (value === true) {\n // if dimensions are negative, \"switch\" edges\n const width = utils.is.number(rect.width )? rect.width : rect.right - rect.left;\n const height = utils.is.number(rect.height)? rect.height : rect.bottom - rect.top ;\n\n if (width < 0) {\n if (name === 'left' ) { name = 'right'; }\n else if (name === 'right') { name = 'left' ; }\n }\n if (height < 0) {\n if (name === 'top' ) { name = 'bottom'; }\n else if (name === 'bottom') { name = 'top' ; }\n }\n\n if (name === 'left' ) { return page.x < ((width >= 0? rect.left: rect.right ) + margin); }\n if (name === 'top' ) { return page.y < ((height >= 0? rect.top : rect.bottom) + margin); }\n\n if (name === 'right' ) { return page.x > ((width >= 0? rect.right : rect.left) - margin); }\n if (name === 'bottom') { return page.y > ((height >= 0? rect.bottom: rect.top ) - margin); }\n }\n\n // the remaining checks require an element\n if (!utils.is.element(element)) { return false; }\n\n return utils.is.element(value)\n // the value is an element to use as a resize handle\n ? value === element\n // otherwise check if element matches value as selector\n : utils.matchesUpTo(element, value, interactableElement);\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.resizeAxes = 'xy';\n});\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action }) {\n if (action !== 'resize' || !interaction.resizeAxes) { return; }\n\n const options = interaction.target.options;\n\n if (options.resize.square) {\n if (interaction.resizeAxes === 'y') {\n iEvent.dx = iEvent.dy;\n }\n else {\n iEvent.dy = iEvent.dx;\n }\n iEvent.axes = 'xy';\n }\n else {\n iEvent.axes = interaction.resizeAxes;\n\n if (interaction.resizeAxes === 'x') {\n iEvent.dy = 0;\n }\n else if (interaction.resizeAxes === 'y') {\n iEvent.dx = 0;\n }\n }\n});\n\nactions.resize = resize;\nactions.names.push('resize');\nutils.merge(Interactable.eventTypes, [\n 'resizestart',\n 'resizemove',\n 'resizeinertiastart',\n 'resizeinertiaresume',\n 'resizeend',\n]);\nactions.methodDict.resize = 'resizable';\n\ndefaultOptions.resize = resize.defaults;\n\nmodule.exports = resize;\n","const raf = require('./utils/raf');\nconst getWindow = require('./utils/window').getWindow;\nconst is = require('./utils/is');\nconst domUtils = require('./utils/domUtils');\nconst Interaction = require('./Interaction');\nconst defaultOptions = require('./defaultOptions');\n\nconst autoScroll = {\n defaults: {\n enabled : false,\n container: null, // the item that is scrolled (Window or HTMLElement)\n margin : 60,\n speed : 300, // the scroll speed in pixels per second\n },\n\n interaction: null,\n i: null, // the handle returned by window.setInterval\n x: 0, y: 0, // Direction each pulse is to scroll in\n\n isScrolling: false,\n prevTime: 0,\n\n start: function (interaction) {\n autoScroll.isScrolling = true;\n raf.cancel(autoScroll.i);\n\n autoScroll.interaction = interaction;\n autoScroll.prevTime = new Date().getTime();\n autoScroll.i = raf.request(autoScroll.scroll);\n },\n\n stop: function () {\n autoScroll.isScrolling = false;\n raf.cancel(autoScroll.i);\n },\n\n // scroll the window by the values in scroll.x/y\n scroll: function () {\n const options = autoScroll.interaction.target.options[autoScroll.interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(autoScroll.interaction.element);\n const now = new Date().getTime();\n // change in time in seconds\n const dt = (now - autoScroll.prevTime) / 1000;\n // displacement\n const s = options.speed * dt;\n\n if (s >= 1) {\n if (is.window(container)) {\n container.scrollBy(autoScroll.x * s, autoScroll.y * s);\n }\n else if (container) {\n container.scrollLeft += autoScroll.x * s;\n container.scrollTop += autoScroll.y * s;\n }\n\n autoScroll.prevTime = now;\n }\n\n if (autoScroll.isScrolling) {\n raf.cancel(autoScroll.i);\n autoScroll.i = raf.request(autoScroll.scroll);\n }\n },\n check: function (interactable, actionName) {\n const options = interactable.options;\n\n return options[actionName].autoScroll && options[actionName].autoScroll.enabled;\n },\n onInteractionMove: function ({ interaction, pointer }) {\n if (!(interaction.interacting()\n && autoScroll.check(interaction.target, interaction.prepared.name))) {\n return;\n }\n\n if (interaction.simulation) {\n autoScroll.x = autoScroll.y = 0;\n return;\n }\n\n let top;\n let right;\n let bottom;\n let left;\n\n const options = interaction.target.options[interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(interaction.element);\n\n if (is.window(container)) {\n left = pointer.clientX < autoScroll.margin;\n top = pointer.clientY < autoScroll.margin;\n right = pointer.clientX > container.innerWidth - autoScroll.margin;\n bottom = pointer.clientY > container.innerHeight - autoScroll.margin;\n }\n else {\n const rect = domUtils.getElementClientRect(container);\n\n left = pointer.clientX < rect.left + autoScroll.margin;\n top = pointer.clientY < rect.top + autoScroll.margin;\n right = pointer.clientX > rect.right - autoScroll.margin;\n bottom = pointer.clientY > rect.bottom - autoScroll.margin;\n }\n\n autoScroll.x = (right ? 1: left? -1: 0);\n autoScroll.y = (bottom? 1: top? -1: 0);\n\n if (!autoScroll.isScrolling) {\n // set the autoScroll properties to those of the target\n autoScroll.margin = options.margin;\n autoScroll.speed = options.speed;\n\n autoScroll.start(interaction);\n }\n },\n};\n\nInteraction.signals.on('stop-active', function () {\n autoScroll.stop();\n});\n\nInteraction.signals.on('action-move', autoScroll.onInteractionMove);\n\ndefaultOptions.perAction.autoScroll = autoScroll.defaults;\n\nmodule.exports = autoScroll;\n","const Interactable = require('../Interactable');\nconst actions = require('../actions/base');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.ignoreFrom\n [ method ]\n *\n * If the target of the `mousedown`, `pointerdown` or `touchstart`\n * event or any of it's parents match the given CSS selector or\n * Element, no drag/resize/gesture is started.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to not ignore any elements\n = (string | Element | object) The current ignoreFrom value or this Interactable\n **\n | interact(element, { ignoreFrom: document.getElementById('no-action') });\n | // or\n | interact(element).ignoreFrom('input, textarea, a');\n\\*/\nInteractable.prototype.ignoreFrom = function (newValue) {\n return this._backCompatOption('ignoreFrom', newValue);\n};\n\n/*\\\n * Interactable.allowFrom\n [ method ]\n *\n * A drag/resize/gesture is started only If the target of the\n * `mousedown`, `pointerdown` or `touchstart` event or any of it's\n * parents match the given CSS selector or Element.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to allow from any element\n = (string | Element | object) The current allowFrom value or this Interactable\n **\n | interact(element, { allowFrom: document.getElementById('drag-handle') });\n | // or\n | interact(element).allowFrom('.handle');\n\\*/\nInteractable.prototype.allowFrom = function (newValue) {\n return this._backCompatOption('allowFrom', newValue);\n};\n\nInteractable.prototype.testIgnore = function (ignoreFrom, interactableElement, element) {\n if (!ignoreFrom || !is.element(element)) { return false; }\n\n if (is.string(ignoreFrom)) {\n return domUtils.matchesUpTo(element, ignoreFrom, interactableElement);\n }\n else if (is.element(ignoreFrom)) {\n return domUtils.nodeContains(ignoreFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testAllow = function (allowFrom, interactableElement, element) {\n if (!allowFrom) { return true; }\n\n if (!is.element(element)) { return false; }\n\n if (is.string(allowFrom)) {\n return domUtils.matchesUpTo(element, allowFrom, interactableElement);\n }\n else if (is.element(allowFrom)) {\n return domUtils.nodeContains(allowFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testIgnoreAllow = function (options, interactableElement, eventTarget) {\n return (!this.testIgnore(options.ignoreFrom, interactableElement, eventTarget)\n && this.testAllow(options.allowFrom, interactableElement, eventTarget));\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (event.buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\n","const interact = require('../interact');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst actions = require('../actions/base');\nconst defaultOptions = require('../defaultOptions');\nconst browser = require('../utils/browser');\nconst scope = require('../scope');\nconst utils = require('../utils');\nconst signals = require('../utils/Signals').new();\n\nrequire('./InteractableMethods');\n\nconst autoStart = {\n signals,\n withinInteractionLimit,\n // Allow this many interactions to happen simultaneously\n maxInteractions: Infinity,\n defaults: {\n perAction: {\n manualStart: false,\n max: Infinity,\n maxPerElement: 1,\n allowFrom: null,\n ignoreFrom: null,\n },\n },\n setActionDefaults: function (action) {\n utils.extend(action.defaults, autoStart.defaults.perAction);\n },\n};\n\n// set cursor style on mousedown\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget }) {\n if (interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\n// set cursor style on mousemove\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget }) {\n if (!interaction.mouse\n || interaction.pointerIsDown\n || interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\nInteraction.signals.on('move', function (arg) {\n const { interaction, event } = arg;\n\n if (!interaction.pointerIsDown\n || interaction.interacting()\n || !interaction.pointerWasMoved\n || !interaction.prepared.name) {\n return;\n }\n\n signals.fire('before-start', arg);\n\n const target = interaction.target;\n\n if (interaction.prepared.name && target) {\n // check manualStart and interaction limit\n if (target.options[interaction.prepared.name].manualStart\n || !withinInteractionLimit(target, interaction.element, interaction.prepared)) {\n interaction.stop(event);\n }\n else {\n interaction.start(interaction.prepared, target, interaction.element);\n }\n }\n});\n\n// Check if the current target supports the action.\n// If so, return the validated action. Otherwise, return null\nfunction validateAction (action, interactable, element, eventTarget) {\n if (utils.is.object(action)\n && interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget)\n && interactable.options[action.name].enabled\n && withinInteractionLimit(interactable, element, action)) {\n return action;\n }\n\n return null;\n}\n\nfunction validateSelector (interaction, pointer, event, matches, matchElements, eventTarget) {\n for (let i = 0, len = matches.length; i < len; i++) {\n const match = matches[i];\n const matchElement = matchElements[i];\n const action = validateAction(match.getAction(pointer, event, interaction, matchElement),\n match,\n matchElement,\n eventTarget);\n\n if (action) {\n return {\n action,\n target: match,\n element: matchElement,\n };\n }\n }\n\n return {};\n}\n\nfunction getActionInfo (interaction, pointer, event, eventTarget) {\n let matches = [];\n let matchElements = [];\n\n let element = eventTarget;\n let action = null;\n\n function pushMatches (interactable, selector, context) {\n const elements = (browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined);\n\n if (utils.matchesSelector(element, selector, elements)) {\n\n matches.push(interactable);\n matchElements.push(element);\n }\n }\n\n while (utils.is.element(element)) {\n matches = [];\n matchElements = [];\n\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && (action = validateAction(elementInteractable.getAction(pointer, event, interaction, element, eventTarget),\n elementInteractable,\n element,\n eventTarget))\n && !elementInteractable.options[action.name].manualStart) {\n return {\n element,\n action,\n target: elementInteractable,\n };\n }\n else {\n scope.interactables.forEachSelector(pushMatches, element);\n\n const actionInfo = validateSelector(interaction, pointer, event, matches, matchElements, eventTarget);\n\n if (actionInfo.action\n && !actionInfo.target.options[actionInfo.action.name].manualStart) {\n return actionInfo;\n }\n }\n\n element = utils.parentNode(element);\n }\n\n return {};\n}\n\nfunction prepare (interaction, { action, target, element }) {\n action = action || {};\n\n if (interaction.target && interaction.target.options.styleCursor) {\n interaction.target._doc.documentElement.style.cursor = '';\n }\n\n interaction.target = target;\n interaction.element = element;\n utils.copyAction(interaction.prepared, action);\n\n if (target && target.options.styleCursor) {\n const cursor = action? actions[action.name].getCursor(action) : '';\n interaction.target._doc.documentElement.style.cursor = cursor;\n }\n\n signals.fire('prepared', { interaction: interaction });\n}\n\nInteraction.signals.on('stop', function ({ interaction }) {\n const target = interaction.target;\n\n if (target && target.options.styleCursor) {\n target._doc.documentElement.style.cursor = '';\n }\n});\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (utils.is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (utils.is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n const buttons = event.buttons || ({\n 0: 1,\n 1: 4,\n 3: 8,\n 4: 16,\n })[event.button];\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\nfunction withinInteractionLimit (interactable, element, action) {\n const options = interactable.options;\n const maxActions = options[action.name].max;\n const maxPerElement = options[action.name].maxPerElement;\n let activeInteractions = 0;\n let targetCount = 0;\n let targetElementCount = 0;\n\n // no actions if any of these values == 0\n if (!(maxActions && maxPerElement && autoStart.maxInteractions)) { return; }\n\n for (let i = 0, len = scope.interactions.length; i < len; i++) {\n const interaction = scope.interactions[i];\n const otherAction = interaction.prepared.name;\n\n if (!interaction.interacting()) { continue; }\n\n activeInteractions++;\n\n if (activeInteractions >= autoStart.maxInteractions) {\n return false;\n }\n\n if (interaction.target !== interactable) { continue; }\n\n targetCount += (otherAction === action.name)|0;\n\n if (targetCount >= maxActions) {\n return false;\n }\n\n if (interaction.element === element) {\n targetElementCount++;\n\n if (otherAction !== action.name || targetElementCount >= maxPerElement) {\n return false;\n }\n }\n }\n\n return autoStart.maxInteractions > 0;\n}\n\n/*\\\n * interact.maxInteractions\n [ method ]\n **\n * Returns or sets the maximum number of concurrent interactions allowed.\n * By default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables\n * and elements, you need to enable it in the draggable, resizable and\n * gesturable `'max'` and `'maxPerElement'` options.\n **\n - newValue (number) #optional Any number. newValue <= 0 means no interactions.\n\\*/\ninteract.maxInteractions = function (newValue) {\n if (utils.is.number(newValue)) {\n autoStart.maxInteractions = newValue;\n\n return this;\n }\n\n return autoStart.maxInteractions;\n};\n\nInteractable.settingsMethods.push('styleCursor');\nInteractable.settingsMethods.push('actionChecker');\nInteractable.settingsMethods.push('ignoreFrom');\nInteractable.settingsMethods.push('allowFrom');\n\ndefaultOptions.base.actionChecker = null;\ndefaultOptions.base.styleCursor = true;\n\nutils.extend(defaultOptions.perAction, autoStart.defaults.perAction);\n\nmodule.exports = autoStart;\n","const autoStart = require('./base');\nconst Interaction = require('../Interaction');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.delayTimer = null;\n});\n\nautoStart.signals.on('prepared', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.delayTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.target, interaction.element);\n }, delay);\n }\n});\n\nInteraction.signals.on('move', function ({ interaction, duplicate }) {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.delayTimer);\n }\n});\n\n// prevent regular down->move autoStart\nautoStart.signals.on('before-start', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.prepared.name = null;\n }\n});\n","const autoStart = require('./base');\nconst scope = require('../scope');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\n\nconst { matchesSelector, parentNode } = require('../utils/domUtils');\n\nautoStart.setActionDefaults(require('../actions/drag'));\n\nautoStart.signals.on('before-start', function ({ interaction, eventTarget, dx, dy }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // check if a drag is in the correct axis\n const absX = Math.abs(dx);\n const absY = Math.abs(dy);\n const options = interaction.target.options.drag;\n const startAxis = options.startAxis;\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy');\n\n interaction.prepared.axis = options.lockAxis === 'start'\n ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n : options.lockAxis;\n\n // if the movement isn't in the startAxis of the interactable\n if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) {\n // cancel the prepared action\n interaction.prepared.name = null;\n\n // then try to get a drag from another ineractable\n\n if (!interaction.prepared.name) {\n\n let element = eventTarget;\n\n const getDraggable = function (interactable, selector, context) {\n const elements = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n if (interactable === interaction.target) { return; }\n\n if (!options.manualStart\n && !interactable.testIgnoreAllow(options, element, eventTarget)\n && matchesSelector(element, selector, elements)) {\n\n const action = interactable.getAction(interaction.downPointer,\n interaction.downEvent,\n interaction,\n element);\n\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, interactable)\n && autoStart.validateAction(action, interactable, element, eventTarget)) {\n\n return interactable;\n }\n }\n };\n\n let action = null;\n\n // check all interactables\n while (is.element(element)) {\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && elementInteractable !== interaction.target\n && !elementInteractable.options.drag.manualStart) {\n\n action = elementInteractable.getAction(interaction.downPointer, interaction.downEvent, interaction, element);\n }\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, elementInteractable)) {\n\n interaction.prepared.name = 'drag';\n interaction.target = elementInteractable;\n interaction.element = element;\n break;\n }\n\n const selectorInteractable = scope.interactables.forEachSelector(getDraggable, element);\n\n if (selectorInteractable) {\n interaction.prepared.name = 'drag';\n interaction.target = selectorInteractable;\n interaction.element = element;\n break;\n }\n\n element = parentNode(element);\n }\n }\n }\n});\n\nfunction checkStartAxis (startAxis, interactable) {\n if (!interactable) { return false; }\n\n const thisAxis = interactable.options.drag.startAxis;\n\n return (startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis);\n}\n","require('./base').setActionDefaults(require('../actions/gesture'));\n","require('./base').setActionDefaults(require('../actions/resize'));\n","module.exports = {\n base: {\n accept : null,\n preventDefault: 'auto',\n deltaSource : 'page',\n },\n\n perAction: {\n origin: { x: 0, y: 0 },\n\n // only allow left button by default\n // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n mouseButtons: 1,\n\n inertia: {\n enabled : false,\n resistance : 10, // the lambda in exponential decay\n minSpeed : 100, // target speed must be above this for inertia to start\n endSpeed : 10, // the speed at which inertia is slow enough to stop\n allowResume : true, // allow resuming an action in inertia phase\n smoothEndDuration: 300, // animate to snap/restrict endOnly if there's no inertia\n },\n },\n};\n","/* browser entry point */\n\n// Legacy browser support\nrequire('./legacyBrowsers');\n\n// inertia\nrequire('./inertia');\n\n// modifiers\nrequire('./modifiers/snap');\nrequire('./modifiers/restrict');\n\n// pointerEvents\nrequire('./pointerEvents/base');\nrequire('./pointerEvents/holdRepeat');\nrequire('./pointerEvents/interactableTargets');\n\n// delay\nrequire('./autoStart/delay');\n\n// actions\nrequire('./actions/gesture');\nrequire('./actions/resize');\nrequire('./actions/drag');\nrequire('./actions/drop');\n\n// load these modifiers after resize is loaded\nrequire('./modifiers/snapSize');\nrequire('./modifiers/restrictEdges');\nrequire('./modifiers/restrictSize');\n\n// autoStart actions\nrequire('./autoStart/gesture');\nrequire('./autoStart/resize');\nrequire('./autoStart/drag');\n\n// Interactable preventDefault setting\nrequire('./interactablePreventDefault.js');\n\n// autoScroll\nrequire('./autoScroll');\n\n// export interact\nmodule.exports = require('./interact');\n","const InteractEvent = require('./InteractEvent');\nconst Interaction = require('./Interaction');\nconst modifiers = require('./modifiers');\nconst utils = require('./utils');\nconst animationFrame = require('./utils/raf');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.inertiaStatus = {\n active : false,\n smoothEnd : false,\n allowResume: false,\n\n startEvent: null,\n upCoords : {},\n\n xe: 0, ye: 0,\n sx: 0, sy: 0,\n\n t0: 0,\n vx0: 0, vys: 0,\n duration: 0,\n\n lambda_v0: 0,\n one_ve_v0: 0,\n i : null,\n };\n\n interaction.boundInertiaFrame = () => inertiaFrame .apply(interaction);\n interaction.boundSmoothEndFrame = () => smoothEndFrame.apply(interaction);\n});\n\nInteraction.signals.on('down', function ({ interaction, event, pointer, eventTarget }) {\n const status = interaction.inertiaStatus;\n\n // Check if the down event hits the current inertia target\n if (status.active) {\n let element = eventTarget;\n\n // climb up the DOM tree from the event target\n while (utils.is.element(element)) {\n\n // if interaction element is the current inertia target element\n if (element === interaction.element) {\n // stop inertia\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n\n // update pointers to the down event's coordinates\n interaction.updatePointer(pointer);\n utils.setCoords(interaction.curCoords, interaction.pointers);\n\n // fire appropriate signals\n const signalArg = { interaction };\n Interaction.signals.fire('before-action-move', signalArg);\n Interaction.signals.fire('action-resume' , signalArg);\n\n // fire a reume event\n const resumeEvent = new InteractEvent(interaction,\n event,\n interaction.prepared.name,\n 'inertiaresume',\n interaction.element);\n\n interaction.target.fire(resumeEvent);\n interaction.prevEvent = resumeEvent;\n modifiers.resetStatuses(interaction.modifierStatuses);\n\n utils.copyCoords(interaction.prevCoords, interaction.curCoords);\n break;\n }\n\n element = utils.parentNode(element);\n }\n }\n});\n\nInteraction.signals.on('up', function ({ interaction, event }) {\n const status = interaction.inertiaStatus;\n\n if (!interaction.interacting() || status.active) { return; }\n\n const target = interaction.target;\n const options = target && target.options;\n const inertiaOptions = options && interaction.prepared.name && options[interaction.prepared.name].inertia;\n\n const now = new Date().getTime();\n const statuses = {};\n const page = utils.extend({}, interaction.curCoords.page);\n const pointerSpeed = interaction.pointerDelta.client.speed;\n\n let smoothEnd = false;\n let modifierResult;\n\n // check if inertia should be started\n const inertiaPossible = (inertiaOptions && inertiaOptions.enabled\n && interaction.prepared.name !== 'gesture'\n && event !== status.startEvent);\n\n const inertia = (inertiaPossible\n && (now - interaction.curCoords.timeStamp) < 50\n && pointerSpeed > inertiaOptions.minSpeed\n && pointerSpeed > inertiaOptions.endSpeed);\n\n const modifierArg = {\n interaction,\n pageCoords: page,\n statuses,\n preEnd: true,\n requireEndOnly: true,\n };\n\n // smoothEnd\n if (inertiaPossible && !inertia) {\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n if (modifierResult.shouldMove && modifierResult.locked) {\n smoothEnd = true;\n }\n }\n\n if (!(inertia || smoothEnd)) { return; }\n\n utils.copyCoords(status.upCoords, interaction.curCoords);\n\n interaction.pointers[0] = status.startEvent =\n new InteractEvent(interaction, event, interaction.prepared.name, 'inertiastart', interaction.element);\n\n status.t0 = now;\n\n status.active = true;\n status.allowResume = inertiaOptions.allowResume;\n interaction.simulation = status;\n\n target.fire(status.startEvent);\n\n if (inertia) {\n status.vx0 = interaction.pointerDelta.client.vx;\n status.vy0 = interaction.pointerDelta.client.vy;\n status.v0 = pointerSpeed;\n\n calcInertia(interaction, status);\n\n utils.extend(page, interaction.curCoords.page);\n\n page.x += status.xe;\n page.y += status.ye;\n\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n status.modifiedXe += modifierResult.dx;\n status.modifiedYe += modifierResult.dy;\n\n status.i = animationFrame.request(interaction.boundInertiaFrame);\n }\n else {\n status.smoothEnd = true;\n status.xe = modifierResult.dx;\n status.ye = modifierResult.dy;\n\n status.sx = status.sy = 0;\n\n status.i = animationFrame.request(interaction.boundSmoothEndFrame);\n }\n});\n\nInteraction.signals.on('stop-active', function ({ interaction }) {\n const status = interaction.inertiaStatus;\n\n if (status.active) {\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n }\n});\n\nfunction calcInertia (interaction, status) {\n const inertiaOptions = interaction.target.options[interaction.prepared.name].inertia;\n const lambda = inertiaOptions.resistance;\n const inertiaDur = -Math.log(inertiaOptions.endSpeed / status.v0) / lambda;\n\n status.x0 = interaction.prevEvent.pageX;\n status.y0 = interaction.prevEvent.pageY;\n status.t0 = status.startEvent.timeStamp / 1000;\n status.sx = status.sy = 0;\n\n status.modifiedXe = status.xe = (status.vx0 - inertiaDur) / lambda;\n status.modifiedYe = status.ye = (status.vy0 - inertiaDur) / lambda;\n status.te = inertiaDur;\n\n status.lambda_v0 = lambda / status.v0;\n status.one_ve_v0 = 1 - inertiaOptions.endSpeed / status.v0;\n}\n\nfunction inertiaFrame () {\n updateInertiaCoords(this);\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n\n const status = this.inertiaStatus;\n const options = this.target.options[this.prepared.name].inertia;\n const lambda = options.resistance;\n const t = new Date().getTime() / 1000 - status.t0;\n\n if (t < status.te) {\n\n const progress = 1 - (Math.exp(-lambda * t) - status.lambda_v0) / status.one_ve_v0;\n\n if (status.modifiedXe === status.xe && status.modifiedYe === status.ye) {\n status.sx = status.xe * progress;\n status.sy = status.ye * progress;\n }\n else {\n const quadPoint = utils.getQuadraticCurvePoint(0, 0,\n status.xe,\n status.ye,\n status.modifiedXe,\n status.modifiedYe,\n progress);\n\n status.sx = quadPoint.x;\n status.sy = quadPoint.y;\n }\n\n this.doMove();\n\n status.i = animationFrame.request(this.boundInertiaFrame);\n }\n else {\n status.sx = status.modifiedXe;\n status.sy = status.modifiedYe;\n\n this.doMove();\n this.end(status.startEvent);\n status.active = false;\n this.simulation = null;\n }\n\n utils.copyCoords(this.prevCoords, this.curCoords);\n}\n\nfunction smoothEndFrame () {\n updateInertiaCoords(this);\n\n const status = this.inertiaStatus;\n const t = new Date().getTime() - status.t0;\n const duration = this.target.options[this.prepared.name].inertia.smoothEndDuration;\n\n if (t < duration) {\n status.sx = utils.easeOutQuad(t, 0, status.xe, duration);\n status.sy = utils.easeOutQuad(t, 0, status.ye, duration);\n\n this.pointerMove(status.startEvent, status.startEvent);\n\n status.i = animationFrame.request(this.boundSmoothEndFrame);\n }\n else {\n status.sx = status.xe;\n status.sy = status.ye;\n\n this.pointerMove(status.startEvent, status.startEvent);\n this.end(status.startEvent);\n\n status.smoothEnd =\n status.active = false;\n this.simulation = null;\n }\n}\n\nfunction updateInertiaCoords (interaction) {\n const status = interaction.inertiaStatus;\n\n // return if inertia isn't running\n if (!status.active) { return; }\n\n const pageUp = status.upCoords.page;\n const clientUp = status.upCoords.client;\n\n utils.setCoords(interaction.curCoords, [ {\n pageX : pageUp.x + status.sx,\n pageY : pageUp.y + status.sy,\n clientX: clientUp.x + status.sx,\n clientY: clientUp.y + status.sy,\n } ]);\n}\n","const browser = require('./utils/browser');\nconst events = require('./utils/events');\nconst utils = require('./utils');\nconst scope = require('./scope');\nconst Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\n\nconst globalEvents = {};\n\n/*\\\n * interact\n [ method ]\n *\n * The methods of this variable can be used to set elements as\n * interactables and also to change various default settings.\n *\n * Calling it as a function and passing an element or a valid CSS selector\n * string returns an Interactable object which has various methods to\n * configure it.\n *\n - element (Element | string) The HTML or SVG Element to interact with or CSS selector\n = (object) An @Interactable\n *\n > Usage\n | interact('#draggable').draggable(true);\n |\n | var rectables = interact('rect');\n | rectables\n | .gesturable(true)\n | .on('gesturemove', function (event) {\n | // ...\n | });\n\\*/\nfunction interact (element, options) {\n let interactable = scope.interactables.get(element, options);\n\n if (!interactable) {\n interactable = new Interactable(element, options);\n interactable.events.global = globalEvents;\n }\n\n return interactable;\n}\n\n/*\\\n * interact.isSet\n [ method ]\n *\n * Check if an element has been set\n - element (Element) The Element being searched for\n = (boolean) Indicates if the element or CSS selector was previously passed to interact\n\\*/\ninteract.isSet = function (element, options) {\n return scope.interactables.indexOfElement(element, options && options.context) !== -1;\n};\n\n/*\\\n * interact.on\n [ method ]\n *\n * Adds a global listener for an InteractEvent or adds a DOM event to\n * `document`\n *\n - type (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) interact\n\\*/\ninteract.on = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.on(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.on(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n // if it is an InteractEvent type, add listener to globalEvents\n if (utils.contains(Interactable.eventTypes, type)) {\n // if this type of event was never bound\n if (!globalEvents[type]) {\n globalEvents[type] = [listener];\n }\n else {\n globalEvents[type].push(listener);\n }\n }\n // If non InteractEvent type, addEventListener to document\n else {\n events.add(scope.document, type, listener, { options });\n }\n\n return interact;\n};\n\n/*\\\n * interact.off\n [ method ]\n *\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n - type (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) interact\n \\*/\ninteract.off = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.off(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.off(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n if (!utils.contains(Interactable.eventTypes, type)) {\n events.remove(scope.document, type, listener, options);\n }\n else {\n let index;\n\n if (type in globalEvents\n && (index = utils.indexOf(globalEvents[type], listener)) !== -1) {\n globalEvents[type].splice(index, 1);\n }\n }\n\n return interact;\n};\n\n/*\\\n * interact.debug\n [ method ]\n *\n * Returns an object which exposes internal data\n = (object) An object with properties that outline the current state and expose internal functions and variables\n\\*/\ninteract.debug = function () {\n return scope;\n};\n\n// expose the functions used to calculate multi-touch properties\ninteract.getPointerAverage = utils.pointerAverage;\ninteract.getTouchBBox = utils.touchBBox;\ninteract.getTouchDistance = utils.touchDistance;\ninteract.getTouchAngle = utils.touchAngle;\n\ninteract.getElementRect = utils.getElementRect;\ninteract.getElementClientRect = utils.getElementClientRect;\ninteract.matchesSelector = utils.matchesSelector;\ninteract.closest = utils.closest;\n\n/*\\\n * interact.supportsTouch\n [ method ]\n *\n = (boolean) Whether or not the browser supports touch input\n\\*/\ninteract.supportsTouch = function () {\n return browser.supportsTouch;\n};\n\n/*\\\n * interact.supportsPointerEvent\n [ method ]\n *\n = (boolean) Whether or not the browser supports PointerEvents\n\\*/\ninteract.supportsPointerEvent = function () {\n return browser.supportsPointerEvent;\n};\n\n/*\\\n * interact.stop\n [ method ]\n *\n * Cancels all interactions (end events are not fired)\n *\n - event (Event) An event on which to call preventDefault()\n = (object) interact\n\\*/\ninteract.stop = function (event) {\n for (let i = scope.interactions.length - 1; i >= 0; i--) {\n scope.interactions[i].stop(event);\n }\n\n return interact;\n};\n\n/*\\\n * interact.pointerMoveTolerance\n [ method ]\n * Returns or sets the distance the pointer must be moved before an action\n * sequence occurs. This also affects tolerance for tap events.\n *\n - newValue (number) #optional The movement from the start position must be greater than this value\n = (number | Interactable) The current setting or interact\n\\*/\ninteract.pointerMoveTolerance = function (newValue) {\n if (utils.is.number(newValue)) {\n Interaction.pointerMoveTolerance = newValue;\n\n return this;\n }\n\n return Interaction.pointerMoveTolerance;\n};\n\ninteract.addDocument = scope.addDocument;\ninteract.removeDocument = scope.removeDocument;\n\nscope.interact = interact;\n\nmodule.exports = interact;\n","const Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\nconst scope = require('./scope');\nconst is = require('./utils/is');\nconst events = require('./utils/events');\n\nconst { nodeContains, matchesSelector } = require('./utils/domUtils');\n\n/*\\\n * Interactable.preventDefault\n [ method ]\n *\n * Returns or sets whether to prevent the browser's default behaviour\n * in response to pointer events. Can be set to:\n * - `'always'` to always prevent\n * - `'never'` to never prevent\n * - `'auto'` to let interact.js try to determine what would be best\n *\n - newValue (string) #optional `true`, `false` or `'auto'`\n = (string | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.preventDefault = function (newValue) {\n if (/^(always|never|auto)$/.test(newValue)) {\n this.options.preventDefault = newValue;\n return this;\n }\n\n if (is.bool(newValue)) {\n this.options.preventDefault = newValue? 'always' : 'never';\n return this;\n }\n\n return this.options.preventDefault;\n};\n\nInteractable.prototype.checkAndPreventDefault = function (event) {\n const setting = this.options.preventDefault;\n\n if (setting === 'never') { return; }\n\n if (setting === 'always') {\n event.preventDefault();\n return;\n }\n\n // setting === 'auto'\n\n // don't preventDefault if the browser supports passiveEvents\n // CSS touch-action and user-selecct should be used instead\n if (events.supportsOptions) {\n return;\n }\n\n // don't preventDefault of pointerdown events\n if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) {\n return;\n }\n\n // don't preventDefault on editable elements\n if (is.element(event.target)\n && matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) {\n return;\n }\n\n event.preventDefault();\n};\n\nfunction onInteractionEvent ({ interaction, event }) {\n if (interaction.target) {\n interaction.target.checkAndPreventDefault(event);\n }\n}\n\nfor (const eventSignal of ['down', 'move', 'up', 'cancel']) {\n Interaction.signals.on(eventSignal, onInteractionEvent);\n}\n\n// prevent native HTML5 drag on interact.js target elements\nInteraction.docEvents.dragstart = function preventNativeDrag (event) {\n for (const interaction of scope.interactions) {\n\n if (interaction.element\n && (interaction.element === event.target\n || nodeContains(interaction.element, event.target))) {\n\n interaction.target.checkAndPreventDefault(event);\n return;\n }\n }\n};\n","const scope = require('./scope');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst iFinder = require('./utils/interactionFinder');\nconst pointerEvents = require('./pointerEvents/base');\n\nconst { window } = require('./utils/window');\n\nconst toString = Object.prototype.toString;\n\nif (!window.Array.isArray) {\n window.Array.isArray = function (obj) {\n return toString.call(obj) === '[object Array]';\n };\n}\n\nif (!String.prototype.trim) {\n String.prototype.trim = function () {\n return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n };\n}\n\n// http://www.quirksmode.org/dom/events/click.html\n// >Events leading to dblclick\n//\n// IE8 doesn't fire down event before dblclick.\n// This workaround tries to fire a tap and doubletap after dblclick\nfunction onIE8Dblclick (event) {\n const eventTarget = event.target;\n const interaction = iFinder.search(event, event.type, eventTarget);\n\n if (!interaction) { return; }\n\n if (interaction.prevTap\n && event.clientX === interaction.prevTap.clientX\n && event.clientY === interaction.prevTap.clientY\n && eventTarget === interaction.prevTap.target) {\n\n interaction.downTargets[0] = eventTarget;\n interaction.downTimes [0] = new Date().getTime();\n\n pointerEvents.fire({\n interaction,\n event,\n eventTarget,\n pointer: event,\n type: 'tap',\n });\n }\n}\n\nif (browser.isIE8) {\n const selectFix = function (event) {\n for (const interaction of scope.interactions) {\n if (interaction.interacting()) {\n interaction.target.checkAndPreventDefault(event);\n }\n }\n };\n\n const onDocIE8 = function onDocIE8 ({ doc, win }, signalName) {\n const eventMethod = signalName.indexOf('listen') === 0\n ? events.add : events.remove;\n\n // For IE's lack of Event#preventDefault\n eventMethod(doc, 'selectstart', selectFix);\n\n if (pointerEvents) {\n eventMethod(doc, 'dblclick', onIE8Dblclick);\n }\n };\n\n scope.signals.on('add-document' , onDocIE8);\n scope.signals.on('remove-document', onDocIE8);\n}\n\nmodule.exports = null;\n","const InteractEvent = require('../InteractEvent');\nconst Interaction = require('../Interaction');\nconst extend = require('../utils/extend');\n\nconst modifiers = {\n names: [],\n\n setOffsets: function (arg) {\n const { interaction, pageCoords: page } = arg;\n const { target, element, startOffset } = interaction;\n const rect = target.getRect(element);\n\n if (rect) {\n startOffset.left = page.x - rect.left;\n startOffset.top = page.y - rect.top;\n\n startOffset.right = rect.right - page.x;\n startOffset.bottom = rect.bottom - page.y;\n\n if (!('width' in rect)) { rect.width = rect.right - rect.left; }\n if (!('height' in rect)) { rect.height = rect.bottom - rect.top ; }\n }\n else {\n startOffset.left = startOffset.top = startOffset.right = startOffset.bottom = 0;\n }\n\n arg.rect = rect;\n arg.interactable = target;\n arg.element = element;\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n\n arg.options = target.options[interaction.prepared.name][modifierName];\n\n if (!arg.options) {\n continue;\n }\n\n interaction.modifierOffsets[modifierName] = modifiers[modifierName].setOffset(arg);\n }\n },\n\n setAll: function (arg) {\n const { interaction, statuses, preEnd, requireEndOnly } = arg;\n const coords = extend({}, arg.pageCoords);\n const result = {\n dx: 0,\n dy: 0,\n changed: false,\n locked: false,\n shouldMove: true,\n };\n\n for (const modifierName of modifiers.names) {\n const modifier = modifiers[modifierName];\n const options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!shouldDo(options, preEnd, requireEndOnly)) { continue; }\n\n arg.status = arg.status = statuses[modifierName];\n arg.options = options;\n arg.offset = arg.interaction.modifierOffsets[modifierName];\n\n modifier.set(arg);\n\n if (arg.status.locked) {\n coords.x += arg.status.dx;\n coords.y += arg.status.dy;\n\n result.dx += arg.status.dx;\n result.dy += arg.status.dy;\n\n result.locked = true;\n }\n }\n\n // a move should be fired if:\n // - there are no modifiers enabled,\n // - no modifiers are \"locked\" i.e. have changed the pointer's coordinates, or\n // - the locked coords have changed since the last pointer move\n result.shouldMove = !arg.status || !result.locked || arg.status.changed;\n\n return result;\n },\n\n resetStatuses: function (statuses) {\n for (const modifierName of modifiers.names) {\n const status = statuses[modifierName] || {};\n\n status.dx = status.dy = 0;\n status.modifiedX = status.modifiedY = NaN;\n status.locked = false;\n status.changed = true;\n\n statuses[modifierName] = status;\n }\n\n return statuses;\n },\n\n start: function ({ interaction }, signalName) {\n const arg = {\n interaction,\n pageCoords: (signalName === 'action-resume' ?\n interaction.curCoords : interaction.startCoords).page,\n startOffset: interaction.startOffset,\n statuses: interaction.modifierStatuses,\n preEnd: false,\n requireEndOnly: false,\n };\n\n modifiers.setOffsets(arg);\n modifiers.resetStatuses(arg.statuses);\n\n arg.pageCoords = extend({}, interaction.startCoords.page);\n interaction.modifierResult = modifiers.setAll(arg);\n },\n};\n\nInteraction.signals.on('new', function (interaction) {\n interaction.startOffset = { left: 0, right: 0, top: 0, bottom: 0 };\n interaction.modifierOffsets = {};\n interaction.modifierStatuses = modifiers.resetStatuses({});\n interaction.modifierResult = null;\n});\n\nInteraction.signals.on('action-start' , modifiers.start);\nInteraction.signals.on('action-resume', modifiers.start);\n\nInteraction.signals.on('before-action-move', function ({ interaction, preEnd, interactingBeforeMove }) {\n const modifierResult = modifiers.setAll({\n interaction,\n preEnd,\n pageCoords: interaction.curCoords.page,\n statuses: interaction.modifierStatuses,\n requireEndOnly: false,\n });\n\n // don't fire an action move if a modifier would keep the event in the same\n // cordinates as before\n if (!modifierResult.shouldMove && interactingBeforeMove) {\n interaction._dontFireMove = true;\n }\n\n interaction.modifierResult = modifierResult;\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n for (let i = 0; i < modifiers.names.length; i++) {\n const options = interaction.target.options[interaction.prepared.name][modifiers.names[i]];\n\n // if the endOnly option is true for any modifier\n if (shouldDo(options, true, true)) {\n // fire a move event at the modified coordinates\n interaction.doMove({ event, preEnd: true });\n break;\n }\n }\n});\n\nInteractEvent.signals.on('set-xy', function (arg) {\n const { iEvent, interaction } = arg;\n const modifierArg = extend({}, arg);\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n modifierArg.options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!modifierArg.options) {\n continue;\n }\n\n const modifier = modifiers[modifierName];\n\n modifierArg.status = interaction.modifierStatuses[modifierName];\n\n iEvent[modifierName] = modifier.modifyCoords(modifierArg);\n }\n});\n\nfunction shouldDo (options, preEnd, requireEndOnly) {\n return (options && options.enabled\n && (preEnd || !options.endOnly)\n && (!requireEndOnly || options.endOnly));\n}\n\nmodule.exports = modifiers;\n","const modifiers = require('./index');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst restrict = {\n defaults: {\n enabled : false,\n endOnly : false,\n restriction: null,\n elementRect: null,\n },\n\n setOffset: function ({ rect, startOffset, options }) {\n const elementRect = options && options.elementRect;\n const offset = {};\n\n if (rect && elementRect) {\n offset.left = startOffset.left - (rect.width * elementRect.left);\n offset.top = startOffset.top - (rect.height * elementRect.top);\n\n offset.right = startOffset.right - (rect.width * (1 - elementRect.right));\n offset.bottom = startOffset.bottom - (rect.height * (1 - elementRect.bottom));\n }\n else {\n offset.left = offset.top = offset.right = offset.bottom = 0;\n }\n\n return offset;\n },\n\n set: function ({ pageCoords, interaction, status, options }) {\n if (!options) { return status; }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n\n const restriction = getRestrictionRect(options.restriction, interaction, page);\n\n if (!restriction) { return status; }\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n const rect = restriction;\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n const offset = interaction.modifierOffsets.restrict;\n\n // object is assumed to have\n // x, y, width, height or\n // left, top, right, bottom\n if ('x' in restriction && 'y' in restriction) {\n modifiedX = Math.max(Math.min(rect.x + rect.width - offset.right , page.x), rect.x + offset.left);\n modifiedY = Math.max(Math.min(rect.y + rect.height - offset.bottom, page.y), rect.y + offset.top );\n }\n else {\n modifiedX = Math.max(Math.min(rect.right - offset.right , page.x), rect.left + offset.left);\n modifiedY = Math.max(Math.min(rect.bottom - offset.bottom, page.y), rect.top + offset.top );\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const elementRect = options && options.elementRect;\n\n if (options && options.enabled\n && !(phase === 'start' && elementRect && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n getRestrictionRect,\n};\n\nfunction getRestrictionRect (value, interaction, page) {\n if (utils.is.function(value)) {\n return utils.resolveRectLike(value, interaction.target, interaction.element, [page.x, page.y, interaction]);\n } else {\n return utils.resolveRectLike(value, interaction.target, interaction.element);\n }\n}\n\nmodifiers.restrict = restrict;\nmodifiers.names.push('restrict');\n\ndefaultOptions.perAction.restrict = restrict.defaults;\n\nmodule.exports = restrict;\n","// This module adds the options.resize.restrictEdges setting which sets min and\n// max for the top, left, bottom and right edges of the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictEdges: {\n// inner: { top: 200, left: 200, right: 400, bottom: 400 },\n// outer: { top: 0, left: 0, right: 600, bottom: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst { getRestrictionRect } = require('./restrict');\n\nconst noInner = { top: +Infinity, left: +Infinity, bottom: -Infinity, right: -Infinity };\nconst noOuter = { top: -Infinity, left: -Infinity, bottom: +Infinity, right: +Infinity };\n\nconst restrictEdges = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n offset: null,\n },\n\n setOffset: function ({ interaction, startOffset, options }) {\n if (!options) {\n return utils.extend({}, startOffset);\n }\n\n const offset = getRestrictionRect(options.offset, interaction, interaction.startCoords.page);\n\n if (offset) {\n return {\n top: startOffset.top + offset.y,\n left: startOffset.left + offset.x,\n bottom: startOffset.bottom + offset.y,\n right: startOffset.right + offset.x,\n };\n }\n\n return startOffset;\n },\n\n set: function ({ pageCoords, interaction, status, offset, options }) {\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n const inner = rectUtils.xywhToTlbr(getRestrictionRect(options.inner, interaction, page)) || noInner;\n const outer = rectUtils.xywhToTlbr(getRestrictionRect(options.outer, interaction, page)) || noOuter;\n\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n if (edges.top) {\n modifiedY = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top);\n }\n else if (edges.bottom) {\n modifiedY = Math.max(Math.min(outer.bottom - offset.bottom, page.y), inner.bottom - offset.bottom);\n }\n if (edges.left) {\n modifiedX = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left);\n }\n else if (edges.right) {\n modifiedX = Math.max(Math.min(outer.right - offset.right, page.x), inner.right - offset.right);\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n if (options && options.enabled\n && !(phase === 'start' && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n noInner,\n noOuter,\n getRestrictionRect,\n};\n\nmodifiers.restrictEdges = restrictEdges;\nmodifiers.names.push('restrictEdges');\n\ndefaultOptions.perAction.restrictEdges = restrictEdges.defaults;\nresize.defaults.restrictEdges = restrictEdges.defaults;\n\nmodule.exports = restrictEdges;\n","// This module adds the options.resize.restrictSize setting which sets min and\n// max width and height for the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictSize: {\n// min: { width: -600, height: -600 },\n// max: { width: 600, height: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst restrictEdges = require('./restrictEdges');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst noMin = { width: -Infinity, height: -Infinity };\nconst noMax = { width: +Infinity, height: +Infinity };\n\nconst restrictSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n },\n\n setOffset: function ({ interaction }) {\n return interaction.startOffset;\n },\n\n set: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const rect = rectUtils.xywhToTlbr(interaction.resizeRects.inverted);\n\n const minSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.min, interaction)) || noMin;\n const maxSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.max, interaction)) || noMax;\n\n arg.options = {\n enabled: options.enabled,\n endOnly: options.endOnly,\n inner: utils.extend({}, restrictEdges.noInner),\n outer: utils.extend({}, restrictEdges.noOuter),\n };\n\n if (edges.top) {\n arg.options.inner.top = rect.bottom - minSize.height;\n arg.options.outer.top = rect.bottom - maxSize.height;\n }\n else if (edges.bottom) {\n arg.options.inner.bottom = rect.top + minSize.height;\n arg.options.outer.bottom = rect.top + maxSize.height;\n }\n if (edges.left) {\n arg.options.inner.left = rect.right - minSize.width;\n arg.options.outer.left = rect.right - maxSize.width;\n }\n else if (edges.right) {\n arg.options.inner.right = rect.left + minSize.width;\n arg.options.outer.right = rect.left + maxSize.width;\n }\n\n restrictEdges.set(arg);\n },\n\n modifyCoords: restrictEdges.modifyCoords,\n};\n\nmodifiers.restrictSize = restrictSize;\nmodifiers.names.push('restrictSize');\n\ndefaultOptions.perAction.restrictSize = restrictSize.defaults;\nresize.defaults.restrictSize = restrictSize.defaults;\n\nmodule.exports = restrictSize;\n","const modifiers = require('./index');\nconst interact = require('../interact');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst snap = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n\n relativePoints: null,\n },\n\n setOffset: function ({ interaction, interactable, element, rect, startOffset, options }) {\n const offsets = [];\n const optionsOrigin = utils.rectToXY(utils.resolveRectLike(options.origin));\n const origin = optionsOrigin || utils.getOriginXY(interactable, element, interaction.prepared.name);\n options = options || interactable.options[interaction.prepared.name].snap || {};\n\n let snapOffset;\n\n if (options.offset === 'startCoords') {\n snapOffset = {\n x: interaction.startCoords.page.x - origin.x,\n y: interaction.startCoords.page.y - origin.y,\n };\n }\n else {\n const offsetRect = utils.resolveRectLike(options.offset, interactable, element, [interaction]);\n\n snapOffset = utils.rectToXY(offsetRect) || { x: 0, y: 0 };\n }\n\n if (rect && options.relativePoints && options.relativePoints.length) {\n for (const { x: relativeX, y: relativeY } of options.relativePoints) {\n offsets.push({\n x: startOffset.left - (rect.width * relativeX) + snapOffset.x,\n y: startOffset.top - (rect.height * relativeY) + snapOffset.y,\n });\n }\n }\n else {\n offsets.push(snapOffset);\n }\n\n return offsets;\n },\n\n set: function ({ interaction, pageCoords, status, options, offset: offsets }) {\n const targets = [];\n let target;\n let page;\n let i;\n\n if (status.useStatusXY) {\n page = { x: status.x, y: status.y };\n }\n else {\n const origin = utils.getOriginXY(interaction.target, interaction.element, interaction.prepared.name);\n\n page = utils.extend({}, pageCoords);\n\n page.x -= origin.x;\n page.y -= origin.y;\n }\n\n status.realX = page.x;\n status.realY = page.y;\n\n let len = options.targets? options.targets.length : 0;\n\n for (const { x: offsetX, y: offsetY } of offsets) {\n const relativeX = page.x - offsetX;\n const relativeY = page.y - offsetY;\n\n for (const snapTarget of options.targets) {\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n targets.push({\n x: utils.is.number(target.x) ? (target.x + offsetX) : relativeX,\n y: utils.is.number(target.y) ? (target.y + offsetY) : relativeY,\n\n range: utils.is.number(target.range)? target.range: options.range,\n });\n }\n }\n\n const closest = {\n target: null,\n inRange: false,\n distance: 0,\n range: 0,\n dx: 0,\n dy: 0,\n };\n\n for (i = 0, len = targets.length; i < len; i++) {\n target = targets[i];\n\n const range = target.range;\n const dx = target.x - page.x;\n const dy = target.y - page.y;\n const distance = utils.hypot(dx, dy);\n let inRange = distance <= range;\n\n // Infinite targets count as being out of range\n // compared to non infinite ones that are in range\n if (range === Infinity && closest.inRange && closest.range !== Infinity) {\n inRange = false;\n }\n\n if (!closest.target || (inRange\n // is the closest target in range?\n ? (closest.inRange && range !== Infinity\n // the pointer is relatively deeper in this target\n ? distance / range < closest.distance / closest.range\n // this target has Infinite range and the closest doesn't\n : (range === Infinity && closest.range !== Infinity)\n // OR this target is closer that the previous closest\n || distance < closest.distance)\n // The other is not in range and the pointer is closer to this target\n : (!closest.inRange && distance < closest.distance))) {\n\n closest.target = target;\n closest.distance = distance;\n closest.range = range;\n closest.inRange = inRange;\n closest.dx = dx;\n closest.dy = dy;\n\n status.range = range;\n }\n }\n\n let snapChanged;\n\n if (closest.target) {\n snapChanged = (status.modifiedX !== closest.target.x || status.modifiedY !== closest.target.y);\n\n status.modifiedX = closest.target.x;\n status.modifiedY = closest.target.y;\n }\n else {\n snapChanged = true;\n\n status.modifiedX = NaN;\n status.modifiedY = NaN;\n }\n\n status.dx = closest.dx;\n status.dy = closest.dy;\n\n status.changed = (snapChanged || (closest.inRange && !status.locked));\n status.locked = closest.inRange;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const relativePoints = options && options.relativePoints;\n\n if (options && options.enabled\n && !(phase === 'start' && relativePoints && relativePoints.length)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n }\n\n return {\n range : status.range,\n locked : status.locked,\n x : status.modifiedX,\n y : status.modifiedY,\n realX : status.realX,\n realY : status.realY,\n dx : status.dx,\n dy : status.dy,\n };\n }\n },\n};\n\ninteract.createSnapGrid = function (grid) {\n return function (x, y) {\n const limits = grid.limits || {\n left : -Infinity,\n right : Infinity,\n top : -Infinity,\n bottom: Infinity,\n };\n let offsetX = 0;\n let offsetY = 0;\n\n if (utils.is.object(grid.offset)) {\n offsetX = grid.offset.x;\n offsetY = grid.offset.y;\n }\n\n const gridx = Math.round((x - offsetX) / grid.x);\n const gridy = Math.round((y - offsetY) / grid.y);\n\n const newX = Math.max(limits.left, Math.min(limits.right , gridx * grid.x + offsetX));\n const newY = Math.max(limits.top , Math.min(limits.bottom, gridy * grid.y + offsetY));\n\n return {\n x: newX,\n y: newY,\n range: grid.range,\n };\n };\n};\n\nmodifiers.snap = snap;\nmodifiers.names.push('snap');\n\ndefaultOptions.perAction.snap = snap.defaults;\n\nmodule.exports = snap;\n","// This module allows snapping of the size of targets during resize\n// interactions.\n\nconst modifiers = require('./index');\nconst snap = require('./snap');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\nconst utils = require('../utils/');\n\nconst snapSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n },\n\n setOffset: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.edges;\n\n if (!edges) { return; }\n\n arg.options = {\n relativePoints: [{\n x: edges.left? 0 : 1,\n y: edges.top ? 0 : 1,\n }],\n origin: { x: 0, y: 0 },\n offset: 'self',\n range: options.range,\n };\n\n const offsets = snap.setOffset(arg);\n arg.options = options;\n\n return offsets;\n },\n\n set: function (arg) {\n const { interaction, options, offset, pageCoords } = arg;\n const page = utils.extend({}, pageCoords);\n const relativeX = page.x - offset[0].x;\n const relativeY = page.y - offset[0].y;\n\n arg.options = utils.extend({}, options);\n arg.options.targets = [];\n\n for (const snapTarget of options.targets) {\n let target;\n\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n if ('width' in target && 'height' in target) {\n target.x = target.width;\n target.y = target.height;\n }\n\n arg.options.targets.push(target);\n }\n\n snap.set(arg);\n },\n\n modifyCoords: function (arg) {\n const { options } = arg;\n\n arg.options = utils.extend({}, options);\n arg.options.enabled = options.enabled;\n arg.options.relativePoints = [null];\n\n snap.modifyCoords(arg);\n },\n};\n\nmodifiers.snapSize = snapSize;\nmodifiers.names.push('snapSize');\n\ndefaultOptions.perAction.snapSize = snapSize.defaults;\nresize.defaults.snapSize = snapSize.defaults;\n\nmodule.exports = snapSize;\n","const pointerUtils = require('../utils/pointerUtils');\n\nmodule.exports = class PointerEvent {\n constructor (type, pointer, event, eventTarget, interaction) {\n pointerUtils.pointerExtend(this, event);\n\n if (event !== pointer) {\n pointerUtils.pointerExtend(this, pointer);\n }\n\n this.interaction = interaction;\n\n this.timeStamp = new Date().getTime();\n this.originalEvent = event;\n this.type = type;\n this.pointerId = pointerUtils.getPointerId(pointer);\n this.pointerType = pointerUtils.getPointerType(pointer, interaction);\n this.target = eventTarget;\n this.currentTarget = null;\n\n if (type === 'tap') {\n const pointerIndex = interaction.getPointerIndex(pointer);\n this.dt = this.timeStamp - interaction.downTimes[pointerIndex];\n\n const interval = this.timeStamp - interaction.tapTime;\n\n this.double = !!(interaction.prevTap\n && interaction.prevTap.type !== 'doubletap'\n && interaction.prevTap.target === this.target\n && interval < 500);\n }\n else if (type === 'doubletap') {\n this.dt = pointer.timeStamp - interaction.tapTime;\n }\n }\n\n subtractOrigin ({ x: originX, y: originY }) {\n this.pageX -= originX;\n this.pageY -= originY;\n this.clientX -= originX;\n this.clientY -= originY;\n\n return this;\n }\n\n addOrigin ({ x: originX, y: originY }) {\n this.pageX += originX;\n this.pageY += originY;\n this.clientX += originX;\n this.clientY += originY;\n\n return this;\n }\n\n preventDefault () {\n this.originalEvent.preventDefault();\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n};\n","const PointerEvent = require('./PointerEvent');\nconst Interaction = require('../Interaction');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst defaults = require('../defaultOptions');\nconst signals = require('../utils/Signals').new();\nconst { filter } = require('../utils/arr');\n\nconst simpleSignals = [ 'down', 'up', 'cancel' ];\nconst simpleEvents = [ 'down', 'up', 'cancel' ];\n\nconst pointerEvents = {\n PointerEvent,\n fire,\n collectEventTargets,\n signals,\n defaults: {\n holdDuration: 600,\n ignoreFrom : null,\n allowFrom : null,\n origin : { x: 0, y: 0 },\n },\n types: [\n 'down',\n 'move',\n 'up',\n 'cancel',\n 'tap',\n 'doubletap',\n 'hold',\n ],\n};\n\nfunction fire (arg) {\n const {\n interaction, pointer, event, eventTarget,\n type = arg.pointerEvent.type,\n targets = collectEventTargets(arg),\n pointerEvent = new PointerEvent(type, pointer, event, eventTarget, interaction),\n } = arg;\n\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n targets,\n type,\n pointerEvent,\n };\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n\n for (const prop in target.props || {}) {\n pointerEvent[prop] = target.props[prop];\n }\n\n const origin = utils.getOriginXY(target.eventable, target.element);\n\n pointerEvent.subtractOrigin(origin);\n pointerEvent.eventable = target.eventable;\n pointerEvent.currentTarget = target.element;\n\n target.eventable.fire(pointerEvent);\n\n pointerEvent.addOrigin(origin);\n\n if (pointerEvent.immediatePropagationStopped\n || (pointerEvent.propagationStopped\n && (i + 1) < targets.length && targets[i + 1].element !== pointerEvent.currentTarget)) {\n break;\n }\n }\n\n signals.fire('fired', signalArg);\n\n if (type === 'tap') {\n // if pointerEvent should make a double tap, create and fire a doubletap\n // PointerEvent and use that as the prevTap\n const prevTap = pointerEvent.double\n ? fire({\n interaction, pointer, event, eventTarget,\n type: 'doubletap',\n })\n : pointerEvent;\n\n interaction.prevTap = prevTap;\n interaction.tapTime = prevTap.timeStamp;\n }\n\n return pointerEvent;\n}\n\nfunction collectEventTargets ({ interaction, pointer, event, eventTarget, type }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n // do not fire a tap event if the pointer was moved before being lifted\n if (type === 'tap' && (interaction.pointerWasMoved\n // or if the pointerup target is different to the pointerdown target\n || !(interaction.downTargets[pointerIndex] && interaction.downTargets[pointerIndex] === eventTarget))) {\n return [];\n }\n\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n path,\n targets: [],\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (type === 'hold') {\n signalArg.targets = filter(signalArg.targets, target =>\n target.eventable.options.holdDuration === interaction.holdTimers[pointerIndex].duration);\n }\n\n return signalArg.targets;\n}\n\nInteraction.signals.on('update-pointer-down', function ({ interaction, pointerIndex }) {\n interaction.holdTimers[pointerIndex] = { duration: Infinity, timeout: null };\n});\n\nInteraction.signals.on('remove-pointer', function ({ interaction, pointerIndex }) {\n interaction.holdTimers.splice(pointerIndex, 1);\n});\n\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget, duplicateMove }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n if (!duplicateMove && (!interaction.pointerIsDown || interaction.pointerWasMoved)) {\n if (interaction.pointerIsDown) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n\n fire({\n interaction, pointer, event, eventTarget,\n type: 'move',\n });\n }\n});\n\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget, pointerIndex }) {\n // copy event to be used in timeout for IE8\n const eventCopy = browser.isIE8? utils.extend({}, event) : event;\n\n const timer = interaction.holdTimers[pointerIndex];\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'hold',\n targets: [],\n path,\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (!signalArg.targets.length) { return; }\n\n let minDuration = Infinity;\n\n for (let i = 0; i < signalArg.targets.length; i++) {\n const target = signalArg.targets[i];\n const holdDuration = target.eventable.options.holdDuration;\n\n if (holdDuration < minDuration) {\n minDuration = holdDuration;\n }\n }\n\n timer.duration = minDuration;\n timer.timeout = setTimeout(function () {\n fire({\n interaction, eventCopy, eventTarget,\n pointer: browser.isIE8? eventCopy : pointer,\n type: 'hold',\n });\n }, minDuration);\n});\n\nInteraction.signals.on('up', ({ interaction, pointer, event, eventTarget }) => {\n if (!interaction.pointerWasMoved) {\n fire({ interaction, eventTarget, pointer, event, type: 'tap' });\n }\n});\n\n['up', 'cancel'].forEach(function (signalName) {\n Interaction.signals.on(signalName, function ({ interaction, pointerIndex }) {\n if (interaction.holdTimers[pointerIndex]) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n });\n});\n\nfunction createSignalListener (type) {\n return function ({ interaction, pointer, event, eventTarget }) {\n fire({ interaction, eventTarget, pointer, event, type });\n };\n}\n\nfor (let i = 0; i < simpleSignals.length; i++) {\n Interaction.signals.on(simpleSignals[i], createSignalListener(simpleEvents[i]));\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.prevTap = null; // the most recent tap event on this interaction\n interaction.tapTime = 0; // time of the most recent tap event\n interaction.holdTimers = []; // [{ duration, timeout }]\n});\n\ndefaults.pointerEvents = pointerEvents.defaults;\nmodule.exports = pointerEvents;\n","const pointerEvents = require('./base');\nconst Interaction = require('../Interaction');\n\npointerEvents.signals.on('new', onNew);\npointerEvents.signals.on('fired', onFired);\n\nfor (const signal of ['move', 'up', 'cancel', 'endall']) {\n Interaction.signals.on(signal, endHoldRepeat);\n}\n\nfunction onNew ({ pointerEvent }) {\n if (pointerEvent.type !== 'hold') { return; }\n\n pointerEvent.count = (pointerEvent.count || 0) + 1;\n}\n\nfunction onFired ({ interaction, pointerEvent, eventTarget, targets }) {\n if (pointerEvent.type !== 'hold' || !targets.length) { return; }\n\n // get the repeat interval from the first eventable\n const interval = targets[0].eventable.options.holdRepeatInterval;\n\n // don't repeat if the interval is 0 or less\n if (interval <= 0) { return; }\n\n // set a timeout to fire the holdrepeat event\n interaction.holdIntervalHandle = setTimeout(function () {\n pointerEvents.fire({\n interaction,\n eventTarget,\n type: 'hold',\n pointer: pointerEvent,\n event: pointerEvent,\n });\n }, interval);\n}\n\nfunction endHoldRepeat ({ interaction }) {\n // set the interaction's holdStopTime property\n // to stop further holdRepeat events\n if (interaction.holdIntervalHandle) {\n clearInterval(interaction.holdIntervalHandle);\n interaction.holdIntervalHandle = null;\n }\n}\n\n// don't repeat by default\npointerEvents.defaults.holdRepeatInterval = 0;\npointerEvents.types.push('holdrepeat');\n\nmodule.exports = {\n onNew,\n onFired,\n endHoldRepeat,\n};\n","const pointerEvents = require('./base');\nconst Interactable = require('../Interactable');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\nconst scope = require('../scope');\nconst extend = require('../utils/extend');\nconst { merge } = require('../utils/arr');\n\npointerEvents.signals.on('collect-targets', function ({ targets, element, type, eventTarget }) {\n function collectSelectors (interactable, selector, context) {\n const els = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && is.element(element)\n && domUtils.matchesSelector(element, selector, els)\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n const interactable = scope.interactables.get(element);\n\n if (interactable) {\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n scope.interactables.forEachSelector(collectSelectors, element);\n});\n\nInteractable.signals.on('new', function ({ interactable }) {\n interactable.events.getRect = function (element) {\n return interactable.getRect(element);\n };\n});\n\nInteractable.signals.on('set', function ({ interactable, options }) {\n extend(interactable.events.options, pointerEvents.defaults);\n extend(interactable.events.options, options);\n});\n\nmerge(Interactable.eventTypes, pointerEvents.types);\n\nInteractable.prototype.pointerEvents = function (options) {\n extend(this.events.options, options);\n\n return this;\n};\n\nconst __backCompatOption = Interactable.prototype._backCompatOption;\n\nInteractable.prototype._backCompatOption = function (optionName, newValue) {\n const ret = __backCompatOption.call(this, optionName, newValue);\n\n if (ret === this) {\n this.events.options[optionName] = newValue;\n }\n\n return ret;\n};\n\nInteractable.settingsMethods.push('pointerEvents');\n","const utils = require('./utils');\nconst events = require('./utils/events');\nconst signals = require('./utils/Signals').new();\n\nconst scope = {\n signals,\n events,\n utils,\n\n // main document\n document: require('./utils/domObjects').document,\n // all documents being listened to\n documents: [],\n\n addDocument: function (doc, win) {\n // do nothing if document is already known\n if (utils.contains(scope.documents, doc)) { return false; }\n\n win = win || scope.getWindow(doc);\n\n scope.documents.push(doc);\n events.documents.push(doc);\n\n // don't add an unload event for the main document\n // so that the page may be cached in browser history\n if (doc !== scope.document) {\n events.add(win, 'unload', scope.onWindowUnload);\n }\n\n signals.fire('add-document', { doc, win });\n },\n\n removeDocument: function (doc, win) {\n const index = utils.indexOf(scope.documents, doc);\n\n win = win || scope.getWindow(doc);\n\n events.remove(win, 'unload', scope.onWindowUnload);\n\n scope.documents.splice(index, 1);\n events.documents.splice(index, 1);\n\n signals.fire('remove-document', { win, doc });\n },\n\n onWindowUnload: function () {\n scope.removeDocument(this.document, this);\n },\n};\n\nmodule.exports = scope;\n","const { indexOf } = require('./arr');\n\nclass Signals {\n constructor () {\n this.listeners = {\n // signalName: [listeners],\n };\n }\n\n on (name, listener) {\n if (!this.listeners[name]) {\n this.listeners[name] = [listener];\n return;\n }\n\n this.listeners[name].push(listener);\n }\n\n off (name, listener) {\n if (!this.listeners[name]) { return; }\n\n const index = indexOf(this.listeners[name], listener);\n\n if (index !== -1) {\n this.listeners[name].splice(index, 1);\n }\n }\n\n fire (name, arg) {\n const targetListeners = this.listeners[name];\n\n if (!targetListeners) { return; }\n\n for (let i = 0; i < targetListeners.length; i++) {\n if (targetListeners[i](arg, name) === false) {\n return;\n }\n }\n }\n}\n\nSignals.new = function () {\n return new Signals();\n};\n\nmodule.exports = Signals;\n","function indexOf (array, target) {\n for (let i = 0, len = array.length; i < len; i++) {\n if (array[i] === target) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction contains (array, target) {\n return indexOf(array, target) !== -1;\n}\n\nfunction merge (target, source) {\n for (let i = 0; i < source.length; i++) {\n target.push(source[i]);\n }\n\n return target;\n}\n\nfunction filter (array, test) {\n const result = [];\n\n for (let i = 0; i < array.length; i++) {\n if (test(array[i])) {\n result.push(array[i]);\n }\n }\n\n return result;\n}\n\nmodule.exports = {\n indexOf,\n contains,\n merge,\n filter,\n};\n","const { window } = require('./window');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst Element = domObjects.Element;\nconst navigator = window.navigator;\n\nconst browser = {\n // Does the browser support touch input?\n supportsTouch: !!(('ontouchstart' in window) || is.function(window.DocumentTouch)\n && domObjects.document instanceof window.DocumentTouch),\n\n // Does the browser support PointerEvents\n supportsPointerEvent: !!domObjects.PointerEvent,\n\n isIE8: ('attachEvent' in window) && !('addEventListener' in window),\n\n // Opera Mobile must be handled differently\n isOperaMobile: (navigator.appName === 'Opera'\n && browser.supportsTouch\n && navigator.userAgent.match('Presto')),\n\n // scrolling doesn't change the result of getClientRects on iOS 7\n isIOS7: (/iP(hone|od|ad)/.test(navigator.platform)\n && /OS 7[^\\d]/.test(navigator.appVersion)),\n\n isIe9OrOlder: /MSIE (8|9)/.test(navigator.userAgent),\n\n // prefix matchesSelector\n prefixedMatchesSelector: 'matches' in Element.prototype\n ? 'matches': 'webkitMatchesSelector' in Element.prototype\n ? 'webkitMatchesSelector': 'mozMatchesSelector' in Element.prototype\n ? 'mozMatchesSelector': 'oMatchesSelector' in Element.prototype\n ? 'oMatchesSelector': 'msMatchesSelector',\n\n useMatchesSelectorPolyfill: false,\n\n pEventTypes: (domObjects.PointerEvent\n ? (domObjects.PointerEvent === window.MSPointerEvent\n ? {\n up: 'MSPointerUp',\n down: 'MSPointerDown',\n over: 'mouseover',\n out: 'mouseout',\n move: 'MSPointerMove',\n cancel: 'MSPointerCancel',\n }\n : {\n up: 'pointerup',\n down: 'pointerdown',\n over: 'pointerover',\n out: 'pointerout',\n move: 'pointermove',\n cancel: 'pointercancel',\n })\n : null),\n\n // because Webkit and Opera still use 'mousewheel' event type\n wheelEvent: 'onmousewheel' in domObjects.document? 'mousewheel': 'wheel',\n\n};\n\nbrowser.useMatchesSelectorPolyfill = !is.function(Element.prototype[browser.prefixedMatchesSelector]);\n\nmodule.exports = browser;\n","const domObjects = {};\nconst win = require('./window').window;\n\nfunction blank () {}\n\ndomObjects.document = win.document;\ndomObjects.DocumentFragment = win.DocumentFragment || blank;\ndomObjects.SVGElement = win.SVGElement || blank;\ndomObjects.SVGSVGElement = win.SVGSVGElement || blank;\ndomObjects.SVGElementInstance = win.SVGElementInstance || blank;\ndomObjects.Element = win.Element || blank;\ndomObjects.HTMLElement = win.HTMLElement || domObjects.Element;\n\ndomObjects.Event = win.Event;\ndomObjects.Touch = win.Touch || blank;\ndomObjects.PointerEvent = (win.PointerEvent || win.MSPointerEvent);\n\nmodule.exports = domObjects;\n","const win = require('./window');\nconst browser = require('./browser');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst domUtils = {\n nodeContains: function (parent, child) {\n while (child) {\n if (child === parent) {\n return true;\n }\n\n child = child.parentNode;\n }\n\n return false;\n },\n\n closest: function (element, selector) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) { return element; }\n\n element = domUtils.parentNode(element);\n }\n\n return null;\n },\n\n parentNode: function (node) {\n let parent = node.parentNode;\n\n if (is.docFrag(parent)) {\n // skip past #shado-root fragments\n while ((parent = parent.host) && is.docFrag(parent)) {\n continue;\n }\n\n return parent;\n }\n\n return parent;\n },\n\n // taken from http://tanalin.com/en/blog/2012/12/matches-selector-ie8/ and modified\n matchesSelectorPolyfill: browser.useMatchesSelectorPolyfill\n ? function (element, selector, elems) {\n elems = elems || element.parentNode.querySelectorAll(selector);\n\n for (let i = 0, len = elems.length; i < len; i++) {\n if (elems[i] === element) {\n return true;\n }\n }\n\n return false;\n }\n : null,\n\n matchesSelector: function (element, selector, nodeList) {\n if (browser.useMatchesSelectorPolyfill) {\n return domUtils.matchesSelectorPolyfill(element, selector, nodeList);\n }\n\n // remove /deep/ from selectors if shadowDOM polyfill is used\n if (win.window !== win.realWindow) {\n selector = selector.replace(/\\/deep\\//g, ' ');\n }\n\n return element[browser.prefixedMatchesSelector](selector);\n },\n\n // Test for the element that's \"above\" all other qualifiers\n indexOfDeepestElement: function (elements) {\n let deepestZoneParents = [];\n let dropzoneParents = [];\n let dropzone;\n let deepestZone = elements[0];\n let index = deepestZone? 0: -1;\n let parent;\n let child;\n let i;\n let n;\n\n for (i = 1; i < elements.length; i++) {\n dropzone = elements[i];\n\n // an element might belong to multiple selector dropzones\n if (!dropzone || dropzone === deepestZone) {\n continue;\n }\n\n if (!deepestZone) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n // check if the deepest or current are document.documentElement or document.rootElement\n // - if the current dropzone is, do nothing and continue\n if (dropzone.parentNode === dropzone.ownerDocument) {\n continue;\n }\n // - if deepest is, update with the current dropzone and continue to next\n else if (deepestZone.parentNode === dropzone.ownerDocument) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n if (!deepestZoneParents.length) {\n parent = deepestZone;\n while (parent.parentNode && parent.parentNode !== parent.ownerDocument) {\n deepestZoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n }\n\n // if this element is an svg element and the current deepest is\n // an HTMLElement\n if (deepestZone instanceof domObjects.HTMLElement\n && dropzone instanceof domObjects.SVGElement\n && !(dropzone instanceof domObjects.SVGSVGElement)) {\n\n if (dropzone === deepestZone.parentNode) {\n continue;\n }\n\n parent = dropzone.ownerSVGElement;\n }\n else {\n parent = dropzone;\n }\n\n dropzoneParents = [];\n\n while (parent.parentNode !== parent.ownerDocument) {\n dropzoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n\n n = 0;\n\n // get (position of last common ancestor) + 1\n while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) {\n n++;\n }\n\n const parents = [\n dropzoneParents[n - 1],\n dropzoneParents[n],\n deepestZoneParents[n],\n ];\n\n child = parents[0].lastChild;\n\n while (child) {\n if (child === parents[1]) {\n deepestZone = dropzone;\n index = i;\n deepestZoneParents = [];\n\n break;\n }\n else if (child === parents[2]) {\n break;\n }\n\n child = child.previousSibling;\n }\n }\n\n return index;\n },\n\n matchesUpTo: function (element, selector, limit) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) {\n return true;\n }\n\n element = domUtils.parentNode(element);\n\n if (element === limit) {\n return domUtils.matchesSelector(element, selector);\n }\n }\n\n return false;\n },\n\n getActualElement: function (element) {\n return (element instanceof domObjects.SVGElementInstance\n ? element.correspondingUseElement\n : element);\n },\n\n getScrollXY: function (relevantWindow) {\n relevantWindow = relevantWindow || win.window;\n return {\n x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft,\n y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop,\n };\n },\n\n getElementClientRect: function (element) {\n const clientRect = (element instanceof domObjects.SVGElement\n ? element.getBoundingClientRect()\n : element.getClientRects()[0]);\n\n return clientRect && {\n left : clientRect.left,\n right : clientRect.right,\n top : clientRect.top,\n bottom: clientRect.bottom,\n width : clientRect.width || clientRect.right - clientRect.left,\n height: clientRect.height || clientRect.bottom - clientRect.top,\n };\n },\n\n getElementRect: function (element) {\n const clientRect = domUtils.getElementClientRect(element);\n\n if (!browser.isIOS7 && clientRect) {\n const scroll = domUtils.getScrollXY(win.getWindow(element));\n\n clientRect.left += scroll.x;\n clientRect.right += scroll.x;\n clientRect.top += scroll.y;\n clientRect.bottom += scroll.y;\n }\n\n return clientRect;\n },\n\n getPath: function (element) {\n const path = [];\n\n while (element) {\n path.push(element);\n element = domUtils.parentNode(element);\n }\n\n return path;\n },\n\n trySelector: value => {\n if (!is.string(value)) { return false; }\n\n // an exception will be raised if it is invalid\n domObjects.document.querySelector(value);\n return true;\n },\n};\n\nmodule.exports = domUtils;\n","const is = require('./is');\nconst domUtils = require('./domUtils');\nconst pExtend = require('./pointerExtend');\n\nconst { window, getWindow } = require('./window');\nconst { indexOf, contains } = require('./arr');\n\nconst useAttachEvent = ('attachEvent' in window) && !('addEventListener' in window);\nconst addEvent = useAttachEvent? 'attachEvent': 'addEventListener';\nconst removeEvent = useAttachEvent? 'detachEvent': 'removeEventListener';\nconst on = useAttachEvent? 'on': '';\n\nconst elements = [];\nconst targets = [];\nconst attachedListeners = [];\n\n// {\n// type: {\n// selectors: ['selector', ...],\n// contexts : [document, ...],\n// listeners: [[listener, capture, passive], ...]\n// }\n// }\nconst delegatedEvents = {};\n\nconst documents = [];\n\nconst supportsOptions = !useAttachEvent && (() => {\n let supported = false;\n\n window.document.createElement('div').addEventListener('test', null, {\n get capture () { supported = true; },\n });\n\n return supported;\n})();\n\nfunction add (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n let elementIndex = indexOf(elements, element);\n let target = targets[elementIndex];\n\n if (!target) {\n target = {\n events: {},\n typeCount: 0,\n };\n\n elementIndex = elements.push(element) - 1;\n targets.push(target);\n\n attachedListeners.push(useAttachEvent\n ? {\n supplied: [],\n wrapped : [],\n useCount: [],\n }\n : null);\n }\n\n if (!target.events[type]) {\n target.events[type] = [];\n target.typeCount++;\n }\n\n if (!contains(target.events[type], listener)) {\n let ret;\n\n if (useAttachEvent) {\n const { supplied, wrapped, useCount } = attachedListeners[elementIndex];\n const listenerIndex = indexOf(supplied, listener);\n\n const wrappedListener = wrapped[listenerIndex] || function (event) {\n if (!event.immediatePropagationStopped) {\n event.target = event.srcElement;\n event.currentTarget = element;\n\n event.preventDefault = event.preventDefault || preventDef;\n event.stopPropagation = event.stopPropagation || stopProp;\n event.stopImmediatePropagation = event.stopImmediatePropagation || stopImmProp;\n\n if (/mouse|click/.test(event.type)) {\n event.pageX = event.clientX + getWindow(element).document.documentElement.scrollLeft;\n event.pageY = event.clientY + getWindow(element).document.documentElement.scrollTop;\n }\n\n listener(event);\n }\n };\n\n ret = element[addEvent](on + type, wrappedListener, !!options.capture);\n\n if (listenerIndex === -1) {\n supplied.push(listener);\n wrapped.push(wrappedListener);\n useCount.push(1);\n }\n else {\n useCount[listenerIndex]++;\n }\n }\n else {\n ret = element[addEvent](type, listener, supportsOptions? options : !!options.capture);\n }\n target.events[type].push(listener);\n\n return ret;\n }\n}\n\nfunction remove (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const elementIndex = indexOf(elements, element);\n const target = targets[elementIndex];\n\n if (!target || !target.events) {\n return;\n }\n\n let wrappedListener = listener;\n let listeners;\n let listenerIndex;\n\n if (useAttachEvent) {\n listeners = attachedListeners[elementIndex];\n listenerIndex = indexOf(listeners.supplied, listener);\n wrappedListener = listeners.wrapped[listenerIndex];\n }\n\n if (type === 'all') {\n for (type in target.events) {\n if (target.events.hasOwnProperty(type)) {\n remove(element, type, 'all');\n }\n }\n return;\n }\n\n if (target.events[type]) {\n const len = target.events[type].length;\n\n if (listener === 'all') {\n for (let i = 0; i < len; i++) {\n remove(element, type, target.events[type][i], options);\n }\n return;\n }\n else {\n for (let i = 0; i < len; i++) {\n if (target.events[type][i] === listener) {\n element[removeEvent](on + type, wrappedListener, supportsOptions? options : !!options.capture);\n target.events[type].splice(i, 1);\n\n if (useAttachEvent && listeners) {\n listeners.useCount[listenerIndex]--;\n if (listeners.useCount[listenerIndex] === 0) {\n listeners.supplied.splice(listenerIndex, 1);\n listeners.wrapped.splice(listenerIndex, 1);\n listeners.useCount.splice(listenerIndex, 1);\n }\n }\n\n break;\n }\n }\n }\n\n if (target.events[type] && target.events[type].length === 0) {\n target.events[type] = null;\n target.typeCount--;\n }\n }\n\n if (!target.typeCount) {\n targets.splice(elementIndex, 1);\n elements.splice(elementIndex, 1);\n attachedListeners.splice(elementIndex, 1);\n }\n}\n\nfunction addDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n if (!delegatedEvents[type]) {\n delegatedEvents[type] = {\n selectors: [],\n contexts : [],\n listeners: [],\n };\n\n // add delegate listener functions\n for (let i = 0; i < documents.length; i++) {\n add(documents[i], type, delegateListener);\n add(documents[i], type, delegateUseCapture, true);\n }\n }\n\n const delegated = delegatedEvents[type];\n let index;\n\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n break;\n }\n }\n\n if (index === -1) {\n index = delegated.selectors.length;\n\n delegated.selectors.push(selector);\n delegated.contexts .push(context);\n delegated.listeners.push([]);\n }\n\n // keep listener and capture and passive flags\n delegated.listeners[index].push([listener, !!options.capture, options.passive]);\n}\n\nfunction removeDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const delegated = delegatedEvents[type];\n let matchFound = false;\n let index;\n\n if (!delegated) { return; }\n\n // count from last index of delegated to 0\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n // look for matching selector and context Node\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n\n const listeners = delegated.listeners[index];\n\n // each item of the listeners array is an array: [function, capture, passive]\n for (let i = listeners.length - 1; i >= 0; i--) {\n const [fn, capture, passive] = listeners[i];\n\n // check if the listener functions and capture and passive flags match\n if (fn === listener && capture === !!options.capture && passive === options.passive) {\n // remove the listener from the array of listeners\n listeners.splice(i, 1);\n\n // if all listeners for this interactable have been removed\n // remove the interactable from the delegated arrays\n if (!listeners.length) {\n delegated.selectors.splice(index, 1);\n delegated.contexts .splice(index, 1);\n delegated.listeners.splice(index, 1);\n\n // remove delegate function from context\n remove(context, type, delegateListener);\n remove(context, type, delegateUseCapture, true);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegatedEvents[type] = null;\n }\n }\n\n // only remove one listener\n matchFound = true;\n break;\n }\n }\n\n if (matchFound) { break; }\n }\n }\n}\n\n// bound to the interactable context when a DOM event\n// listener is added to a selector interactable\nfunction delegateListener (event, optionalArg) {\n const options = getOptions(optionalArg);\n const fakeEvent = {};\n const delegated = delegatedEvents[event.type];\n const eventTarget = (domUtils.getActualElement(event.path\n ? event.path[0]\n : event.target));\n let element = eventTarget;\n\n // duplicate the event so that currentTarget can be changed\n pExtend(fakeEvent, event);\n\n fakeEvent.originalEvent = event;\n fakeEvent.preventDefault = preventOriginalDefault;\n\n // climb up document tree looking for selector matches\n while (is.element(element)) {\n for (let i = 0; i < delegated.selectors.length; i++) {\n const selector = delegated.selectors[i];\n const context = delegated.contexts[i];\n\n if (domUtils.matchesSelector(element, selector)\n && domUtils.nodeContains(context, eventTarget)\n && domUtils.nodeContains(context, element)) {\n\n const listeners = delegated.listeners[i];\n\n fakeEvent.currentTarget = element;\n\n for (let j = 0; j < listeners.length; j++) {\n const [fn, capture, passive] = listeners[j];\n\n if (capture === !!options.capture && passive === options.passive) {\n fn(fakeEvent);\n }\n }\n }\n }\n\n element = domUtils.parentNode(element);\n }\n}\n\nfunction delegateUseCapture (event) {\n return delegateListener.call(this, event, true);\n}\n\nfunction preventDef () {\n this.returnValue = false;\n}\n\nfunction preventOriginalDefault () {\n this.originalEvent.preventDefault();\n}\n\nfunction stopProp () {\n this.cancelBubble = true;\n}\n\nfunction stopImmProp () {\n this.cancelBubble = true;\n this.immediatePropagationStopped = true;\n}\n\nfunction getOptions (param) {\n return is.object(param)? param : { capture: param };\n}\n\nmodule.exports = {\n add,\n remove,\n\n addDelegate,\n removeDelegate,\n\n delegateListener,\n delegateUseCapture,\n delegatedEvents,\n documents,\n\n useAttachEvent,\n supportsOptions,\n\n _elements: elements,\n _targets: targets,\n _attachedListeners: attachedListeners,\n};\n","module.exports = function extend (dest, source) {\n for (const prop in source) {\n dest[prop] = source[prop];\n }\n return dest;\n};\n","const {\n resolveRectLike,\n rectToXY,\n} = require('./rect');\n\nmodule.exports = function (target, element, action) {\n const actionOptions = target.options[action];\n const actionOrigin = actionOptions && actionOptions.origin;\n const origin = actionOrigin || target.options.origin;\n\n const originRect = resolveRectLike(origin, target, element, [target && element]);\n\n return rectToXY(originRect) || { x: 0, y: 0 };\n};\n","module.exports = (x, y) => Math.sqrt(x * x + y * y);\n","const extend = require('./extend');\nconst win = require('./window');\n\nconst utils = {\n warnOnce: function (method, message) {\n let warned = false;\n\n return function () {\n if (!warned) {\n win.window.console.warn(message);\n warned = true;\n }\n\n return method.apply(this, arguments);\n };\n },\n\n // http://stackoverflow.com/a/5634528/2280888\n _getQBezierValue: function (t, p1, p2, p3) {\n const iT = 1 - t;\n return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3;\n },\n\n getQuadraticCurvePoint: function (startX, startY, cpX, cpY, endX, endY, position) {\n return {\n x: utils._getQBezierValue(position, startX, cpX, endX),\n y: utils._getQBezierValue(position, startY, cpY, endY),\n };\n },\n\n // http://gizma.com/easing/\n easeOutQuad: function (t, b, c, d) {\n t /= d;\n return -c * t*(t-2) + b;\n },\n\n copyAction: function (dest, src) {\n dest.name = src.name;\n dest.axis = src.axis;\n dest.edges = src.edges;\n\n return dest;\n },\n\n is : require('./is'),\n extend : extend,\n hypot : require('./hypot'),\n getOriginXY: require('./getOriginXY'),\n};\n\nextend(utils, require('./arr'));\nextend(utils, require('./domUtils'));\nextend(utils, require('./pointerUtils'));\nextend(utils, require('./rect'));\n\nmodule.exports = utils;\n","const scope = require('../scope');\nconst utils = require('./index');\nconst browser = require('./browser');\n\nconst finder = {\n methodOrder: [ 'simulationResume', 'mouse', 'hasPointer', 'idle' ],\n\n search: function (pointer, eventType, eventTarget) {\n const mouseEvent = (/mouse/i.test(pointer.pointerType || eventType)\n // MSPointerEvent.MSPOINTER_TYPE_MOUSE\n || pointer.pointerType === 4);\n const pointerId = utils.getPointerId(pointer);\n const details = { pointer, pointerId, mouseEvent, eventType, eventTarget };\n\n for (const method of finder.methodOrder) {\n const interaction = finder[method](details);\n\n if (interaction) {\n return interaction;\n }\n }\n },\n\n // try to resume simulation with a new pointer\n simulationResume: function ({ mouseEvent, eventType, eventTarget }) {\n if (!/down|start/i.test(eventType)) {\n return null;\n }\n\n for (const interaction of scope.interactions) {\n let element = eventTarget;\n\n if (interaction.simulation && interaction.simulation.allowResume\n && (interaction.mouse === mouseEvent)) {\n while (element) {\n // if the element is the interaction element\n if (element === interaction.element) {\n return interaction;\n }\n element = utils.parentNode(element);\n }\n }\n }\n\n return null;\n },\n\n // if it's a mouse interaction\n mouse: function ({ pointerId, mouseEvent, eventType }) {\n if (!mouseEvent && (browser.supportsTouch || browser.supportsPointerEvent)) {\n return null;\n }\n\n let firstNonActive;\n\n for (const interaction of scope.interactions) {\n if (interaction.mouse) {\n // if it's a down event, skip interactions with running simulations\n if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; }\n\n // if the interaction is active, return it immediately\n if (interaction.interacting()) {\n return interaction;\n }\n // otherwise save it and look for another active interaction\n else if (!firstNonActive) {\n firstNonActive = interaction;\n }\n }\n }\n\n // if no active mouse interaction was found use the first inactive mouse\n // interaction\n if (firstNonActive) {\n return firstNonActive;\n }\n\n // Find any interaction specifically for mouse.\n // ignore the interaction if the eventType is a mousedown, and a simulation\n // is active\n for (const interaction of scope.interactions) {\n if (interaction.mouse && !(/down/.test(eventType) && interaction.simulation)) {\n return interaction;\n }\n }\n\n return null;\n },\n\n // get interaction that has this pointer\n hasPointer: function ({ pointerId }) {\n for (const interaction of scope.interactions) {\n if (utils.contains(interaction.pointerIds, pointerId)) {\n return interaction;\n }\n }\n },\n\n // get first idle interaction\n idle: function ({ mouseEvent }) {\n for (const interaction of scope.interactions) {\n // if there's already a pointer held down\n if (interaction.pointerIds.length === 1) {\n const target = interaction.target;\n // don't add this pointer if there is a target interactable and it\n // isn't gesturable\n if (target && !target.options.gesture.enabled) {\n continue;\n }\n }\n // maximum of 2 pointers per interaction\n else if (interaction.pointerIds.length >= 2) {\n continue;\n }\n\n if (!interaction.interacting() && (mouseEvent === interaction.mouse)) {\n return interaction;\n }\n }\n\n return null;\n },\n};\n\nmodule.exports = finder;\n","const win = require('./window');\nconst isWindow = require('./isWindow');\n\nconst is = {\n array : () => {},\n\n window : thing => thing === win.window || isWindow(thing),\n\n docFrag : thing => is.object(thing) && thing.nodeType === 11,\n\n object : thing => !!thing && (typeof thing === 'object'),\n\n function: thing => typeof thing === 'function',\n\n number : thing => typeof thing === 'number' ,\n\n bool : thing => typeof thing === 'boolean' ,\n\n string : thing => typeof thing === 'string' ,\n\n element: thing => {\n if (!thing || (typeof thing !== 'object')) { return false; }\n\n const _window = win.getWindow(thing) || win.window;\n\n return (/object|function/.test(typeof _window.Element)\n ? thing instanceof _window.Element //DOM2\n : thing.nodeType === 1 && typeof thing.nodeName === 'string');\n },\n};\n\nis.array = thing => (is.object(thing)\n && (typeof thing.length !== 'undefined')\n && is.function(thing.splice));\n\nmodule.exports = is;\n","module.exports = (thing) => !!(thing && thing.Window) && (thing instanceof thing.Window);\n","function pointerExtend (dest, source) {\n for (const prop in source) {\n const prefixedPropREs = module.exports.prefixedPropREs;\n let deprecated = false;\n\n // skip deprecated prefixed properties\n for (const vendor in prefixedPropREs) {\n if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) {\n deprecated = true;\n break;\n }\n }\n\n if (!deprecated && typeof source[prop] !== 'function') {\n dest[prop] = source[prop];\n }\n }\n return dest;\n}\n\npointerExtend.prefixedPropREs = {\n webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/,\n};\n\nmodule.exports = pointerExtend;\n","const hypot = require('./hypot');\nconst browser = require('./browser');\nconst dom = require('./domObjects');\nconst domUtils = require('./domUtils');\nconst is = require('./is');\nconst pointerExtend = require('./pointerExtend');\n\nconst pointerUtils = {\n copyCoords: function (dest, src) {\n dest.page = dest.page || {};\n dest.page.x = src.page.x;\n dest.page.y = src.page.y;\n\n dest.client = dest.client || {};\n dest.client.x = src.client.x;\n dest.client.y = src.client.y;\n\n dest.timeStamp = src.timeStamp;\n },\n\n setCoordDeltas: function (targetObj, prev, cur) {\n targetObj.page.x = cur.page.x - prev.page.x;\n targetObj.page.y = cur.page.y - prev.page.y;\n targetObj.client.x = cur.client.x - prev.client.x;\n targetObj.client.y = cur.client.y - prev.client.y;\n targetObj.timeStamp = cur.timeStamp - prev.timeStamp;\n\n // set pointer velocity\n const dt = Math.max(targetObj.timeStamp / 1000, 0.001);\n\n targetObj.page.speed = hypot(targetObj.page.x, targetObj.page.y) / dt;\n targetObj.page.vx = targetObj.page.x / dt;\n targetObj.page.vy = targetObj.page.y / dt;\n\n targetObj.client.speed = hypot(targetObj.client.x, targetObj.page.y) / dt;\n targetObj.client.vx = targetObj.client.x / dt;\n targetObj.client.vy = targetObj.client.y / dt;\n },\n\n isNativePointer: function (pointer) {\n return (pointer instanceof dom.Event || pointer instanceof dom.Touch);\n },\n\n // Get specified X/Y coords for mouse or event.touches[0]\n getXY: function (type, pointer, xy) {\n xy = xy || {};\n type = type || 'page';\n\n xy.x = pointer[type + 'X'];\n xy.y = pointer[type + 'Y'];\n\n return xy;\n },\n\n getPageXY: function (pointer, page) {\n page = page || {};\n\n // Opera Mobile handles the viewport and scrolling oddly\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n pointerUtils.getXY('screen', pointer, page);\n\n page.x += window.scrollX;\n page.y += window.scrollY;\n }\n else {\n pointerUtils.getXY('page', pointer, page);\n }\n\n return page;\n },\n\n getClientXY: function (pointer, client) {\n client = client || {};\n\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n // Opera Mobile handles the viewport and scrolling oddly\n pointerUtils.getXY('screen', pointer, client);\n }\n else {\n pointerUtils.getXY('client', pointer, client);\n }\n\n return client;\n },\n\n getPointerId: function (pointer) {\n return is.number(pointer.pointerId)? pointer.pointerId : pointer.identifier;\n },\n\n setCoords: function (targetObj, pointers, timeStamp) {\n const pointer = (pointers.length > 1\n ? pointerUtils.pointerAverage(pointers)\n : pointers[0]);\n\n const tmpXY = {};\n\n pointerUtils.getPageXY(pointer, tmpXY);\n targetObj.page.x = tmpXY.x;\n targetObj.page.y = tmpXY.y;\n\n pointerUtils.getClientXY(pointer, tmpXY);\n targetObj.client.x = tmpXY.x;\n targetObj.client.y = tmpXY.y;\n\n targetObj.timeStamp = is.number(timeStamp) ? timeStamp :new Date().getTime();\n },\n\n pointerExtend: pointerExtend,\n\n getTouchPair: function (event) {\n const touches = [];\n\n // array of touches is supplied\n if (is.array(event)) {\n touches[0] = event[0];\n touches[1] = event[1];\n }\n // an event\n else {\n if (event.type === 'touchend') {\n if (event.touches.length === 1) {\n touches[0] = event.touches[0];\n touches[1] = event.changedTouches[0];\n }\n else if (event.touches.length === 0) {\n touches[0] = event.changedTouches[0];\n touches[1] = event.changedTouches[1];\n }\n }\n else {\n touches[0] = event.touches[0];\n touches[1] = event.touches[1];\n }\n }\n\n return touches;\n },\n\n pointerAverage: function (pointers) {\n const average = {\n pageX : 0,\n pageY : 0,\n clientX: 0,\n clientY: 0,\n screenX: 0,\n screenY: 0,\n };\n\n for (const pointer of pointers) {\n for (const prop in average) {\n average[prop] += pointer[prop];\n }\n }\n for (const prop in average) {\n average[prop] /= pointers.length;\n }\n\n return average;\n },\n\n touchBBox: function (event) {\n if (!event.length && !(event.touches && event.touches.length > 1)) {\n return;\n }\n\n const touches = pointerUtils.getTouchPair(event);\n const minX = Math.min(touches[0].pageX, touches[1].pageX);\n const minY = Math.min(touches[0].pageY, touches[1].pageY);\n const maxX = Math.max(touches[0].pageX, touches[1].pageX);\n const maxY = Math.max(touches[0].pageY, touches[1].pageY);\n\n return {\n x: minX,\n y: minY,\n left: minX,\n top: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n },\n\n touchDistance: function (event, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n\n\n const dx = touches[0][sourceX] - touches[1][sourceX];\n const dy = touches[0][sourceY] - touches[1][sourceY];\n\n return hypot(dx, dy);\n },\n\n touchAngle: function (event, prevAngle, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n const dx = touches[1][sourceX] - touches[0][sourceX];\n const dy = touches[1][sourceY] - touches[0][sourceY];\n const angle = 180 * Math.atan2(dy , dx) / Math.PI;\n\n return angle;\n },\n\n getPointerType: function (pointer, interaction) {\n // if the PointerEvent API isn't available, then the pointer must be ither\n // a MouseEvent or TouchEvent\n if (interaction.mouse) { return 'mouse'; }\n if (!browser.supportsPointerEvent) { return 'touch'; }\n\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : [undefined, undefined,'touch', 'pen', 'mouse'][pointer.pointerType];\n },\n\n // [ event.target, event.currentTarget ]\n getEventTargets: function (event) {\n return [\n domUtils.getActualElement(event.path ? event.path[0] : event.target),\n domUtils.getActualElement(event.currentTarget),\n ];\n },\n};\n\nmodule.exports = pointerUtils;\n","const { window } = require('./window');\n\nconst vendors = ['ms', 'moz', 'webkit', 'o'];\nlet lastTime = 0;\nlet request;\nlet cancel;\n\nfor (let x = 0; x < vendors.length && !window.requestAnimationFrame; x++) {\n request = window[vendors[x] + 'RequestAnimationFrame'];\n cancel = window[vendors[x] +'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n}\n\nif (!request) {\n request = function (callback) {\n const currTime = new Date().getTime();\n const timeToCall = Math.max(0, 16 - (currTime - lastTime));\n const id = setTimeout(function () { callback(currTime + timeToCall); },\n timeToCall);\n\n lastTime = currTime + timeToCall;\n return id;\n };\n}\n\nif (!cancel) {\n cancel = function (id) {\n clearTimeout(id);\n };\n}\n\nmodule.exports = {\n request,\n cancel,\n};\n","const extend = require('./extend');\nconst is = require('./is');\nconst {\n closest,\n parentNode,\n getElementRect,\n} = require('./domUtils');\n\nconst rectUtils = {\n getStringOptionResult: function (value, interactable, element) {\n if (!is.string(value)) {\n return null;\n }\n\n if (value === 'parent') {\n value = parentNode(element);\n }\n else if (value === 'self') {\n value = interactable.getRect(element);\n }\n else {\n value = closest(element, value);\n }\n\n return value;\n },\n\n resolveRectLike: function (value, interactable, element, functionArgs) {\n value = rectUtils.getStringOptionResult(value, interactable, element) || value;\n\n if (is.function(value)) {\n value = value.apply(null, functionArgs);\n }\n\n if (is.element(value)) {\n value = getElementRect(value);\n }\n\n return value;\n },\n\n rectToXY: function (rect) {\n return rect && {\n x: 'x' in rect ? rect.x : rect.left,\n y: 'y' in rect ? rect.y : rect.top,\n };\n },\n\n xywhToTlbr: function (rect) {\n if (rect && !('left' in rect && 'top' in rect)) {\n rect = extend({}, rect);\n\n rect.left = rect.x || 0;\n rect.top = rect.y || 0;\n rect.right = rect.right || (rect.left + rect.width);\n rect.bottom = rect.bottom || (rect.top + rect.height);\n }\n\n return rect;\n },\n\n tlbrToXywh: function (rect) {\n if (rect && !('x' in rect && 'y' in rect)) {\n rect = extend({}, rect);\n\n rect.x = rect.left || 0;\n rect.top = rect.top || 0;\n rect.width = rect.width || (rect.right - rect.x);\n rect.height = rect.height || (rect.bottom - rect.y);\n }\n\n return rect;\n },\n};\n\nmodule.exports = rectUtils;\n","const win = module.exports;\nconst isWindow = require('./isWindow');\n\nfunction init (window) {\n // get wrapped window if using Shadow DOM polyfill\n\n win.realWindow = window;\n\n // create a TextNode\n const el = window.document.createTextNode('');\n\n // check if it's wrapped by a polyfill\n if (el.ownerDocument !== window.document\n && typeof window.wrap === 'function'\n && window.wrap(el) === el) {\n // use wrapped window\n window = window.wrap(window);\n }\n\n win.window = window;\n}\n\nif (typeof window === 'undefined') {\n win.window = undefined;\n win.realWindow = undefined;\n}\nelse {\n init(window);\n}\n\nwin.getWindow = function getWindow (node) {\n if (isWindow(node)) {\n return node;\n }\n\n const rootNode = (node.ownerDocument || node);\n\n return rootNode.defaultView || rootNode.parentWindow || win.window;\n};\n\nwin.init = init;\n"]} \ No newline at end of file +{"version":3,"sources":["src/minHeader.js","src/header.js","index.js","src/Eventable.js","src/InteractEvent.js","src/Interactable.js","src/Interaction.js","src/actions/base.js","src/actions/drag.js","src/actions/drop.js","src/actions/gesture.js","src/actions/resize.js","src/autoScroll.js","src/autoStart/InteractableMethods.js","src/autoStart/base.js","src/autoStart/delay.js","src/autoStart/drag.js","src/autoStart/gesture.js","src/autoStart/resize.js","src/defaultOptions.js","src/index.js","src/inertia.js","src/interact.js","src/interactablePreventDefault.js","src/legacyBrowsers.js","src/modifiers/index.js","src/modifiers/restrict.js","src/modifiers/restrictEdges.js","src/modifiers/restrictSize.js","src/modifiers/snap.js","src/modifiers/snapSize.js","src/pointerEvents/PointerEvent.js","src/pointerEvents/base.js","src/pointerEvents/holdRepeat.js","src/pointerEvents/interactableTargets.js","src/scope.js","src/utils/Signals.js","src/utils/arr.js","src/utils/browser.js","src/utils/domObjects.js","src/utils/domUtils.js","src/utils/events.js","src/utils/extend.js","src/utils/getOriginXY.js","src/utils/hypot.js","src/utils/index.js","src/utils/interactionFinder.js","src/utils/is.js","src/utils/isWindow.js","src/utils/pointerExtend.js","src/utils/pointerUtils.js","src/utils/raf.js","src/utils/rect.js","src/utils/window.js"],"names":[],"mappings":"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","file":"interact.min.js","sourceRoot":"","sourcesContent":["/* interact.js v1.3.0-alpha.4+sha.7970416-dirty | https://raw.github.com/taye/interact.js/master/LICENSE */\n","/**\n * interact.js v1.3.0-alpha.4+sha.7970416-dirty\n *\n * Copyright (c) 2012-2017 Taye Adeyemi \n * Open source under the MIT License.\n * https://raw.github.com/taye/interact.js/master/LICENSE\n */\n","/*\n * In a (windowless) server environment this file exports a factory function\n * that takes the window to use.\n *\n * var interact = require('interact.js')(windowObject);\n *\n * See https://github.com/taye/interact.js/issues/187\n */\nif (typeof window === 'undefined') {\n module.exports = function (window) {\n require('./src/utils/window').init(window);\n\n return require('./src/index');\n };\n}\nelse {\n module.exports = require('./src/index');\n}\n","const { indexOf } = require('./utils/arr');\nconst extend = require('./utils/extend.js');\n\nfunction fireUntilImmediateStopped (event, listeners) {\n for (let i = 0, len = listeners.length; i < len && !event.immediatePropagationStopped; i++) {\n listeners[i](event);\n }\n}\n\nclass Eventable {\n\n constructor (options) {\n this.options = extend({}, options || {});\n }\n\n fire (event) {\n let listeners;\n const onEvent = 'on' + event.type;\n const global = this.global;\n\n // Interactable#on() listeners\n if ((listeners = this[event.type])) {\n fireUntilImmediateStopped(event, listeners);\n }\n\n // interactable.onevent listener\n if (this[onEvent]) {\n this[onEvent](event);\n }\n\n // interact.on() listeners\n if (!event.propagationStopped && global && (listeners = global[event.type])) {\n fireUntilImmediateStopped(event, listeners);\n }\n }\n\n on (eventType, listener) {\n // if this type of event was never bound\n if (this[eventType]) {\n this[eventType].push(listener);\n }\n else {\n this[eventType] = [listener];\n }\n }\n\n off (eventType, listener) {\n // if it is an action event type\n const eventList = this[eventType];\n const index = eventList? indexOf(eventList, listener) : -1;\n\n if (index !== -1) {\n eventList.splice(index, 1);\n }\n\n if (eventList && eventList.length === 0 || !listener) {\n this[eventType] = listener;\n }\n }\n}\n\nmodule.exports = Eventable;\n","const extend = require('./utils/extend');\nconst getOriginXY = require('./utils/getOriginXY');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nclass InteractEvent {\n constructor (interaction, event, action, phase, element, related, preEnd = false) {\n const target = interaction.target;\n const deltaSource = (target && target.options || defaults).deltaSource;\n const origin = getOriginXY(target, element, action);\n const starting = phase === 'start';\n const ending = phase === 'end';\n const coords = starting? interaction.startCoords : interaction.curCoords;\n const prevEvent = interaction.prevEvent;\n\n element = element || interaction.element;\n\n const page = extend({}, coords.page);\n const client = extend({}, coords.client);\n\n page.x -= origin.x;\n page.y -= origin.y;\n\n client.x -= origin.x;\n client.y -= origin.y;\n\n this.ctrlKey = event.ctrlKey;\n this.altKey = event.altKey;\n this.shiftKey = event.shiftKey;\n this.metaKey = event.metaKey;\n this.button = event.button;\n this.buttons = event.buttons;\n this.target = element;\n this.currentTarget = element;\n this.relatedTarget = related || null;\n this.preEnd = preEnd;\n this.type = action + (phase || '');\n this.interaction = interaction;\n this.interactable = target;\n\n this.t0 = starting ? interaction.downTimes[interaction.downTimes.length - 1]\n : prevEvent.t0;\n\n const signalArg = {\n interaction,\n event,\n action,\n phase,\n element,\n related,\n page,\n client,\n coords,\n starting,\n ending,\n deltaSource,\n iEvent: this,\n };\n\n signals.fire('set-xy', signalArg);\n\n if (ending) {\n // use previous coords when ending\n this.pageX = prevEvent.pageX;\n this.pageY = prevEvent.pageY;\n this.clientX = prevEvent.clientX;\n this.clientY = prevEvent.clientY;\n }\n else {\n this.pageX = page.x;\n this.pageY = page.y;\n this.clientX = client.x;\n this.clientY = client.y;\n }\n\n this.x0 = interaction.startCoords.page.x - origin.x;\n this.y0 = interaction.startCoords.page.y - origin.y;\n this.clientX0 = interaction.startCoords.client.x - origin.x;\n this.clientY0 = interaction.startCoords.client.y - origin.y;\n\n signals.fire('set-delta', signalArg);\n\n this.timeStamp = coords.timeStamp;\n this.dt = interaction.pointerDelta.timeStamp;\n this.duration = this.timeStamp - this.t0;\n\n // speed and velocity in pixels per second\n this.speed = interaction.pointerDelta[deltaSource].speed;\n this.velocityX = interaction.pointerDelta[deltaSource].vx;\n this.velocityY = interaction.pointerDelta[deltaSource].vy;\n\n this.swipe = (ending || phase === 'inertiastart')? this.getSwipe() : null;\n\n signals.fire('new', signalArg);\n }\n\n getSwipe () {\n const interaction = this.interaction;\n\n if (interaction.prevEvent.speed < 600\n || this.timeStamp - interaction.prevEvent.timeStamp > 150) {\n return null;\n }\n\n let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI;\n const overlap = 22.5;\n\n if (angle < 0) {\n angle += 360;\n }\n\n const left = 135 - overlap <= angle && angle < 225 + overlap;\n const up = 225 - overlap <= angle && angle < 315 + overlap;\n\n const right = !left && (315 - overlap <= angle || angle < 45 + overlap);\n const down = !up && 45 - overlap <= angle && angle < 135 + overlap;\n\n return {\n up,\n down,\n left,\n right,\n angle,\n speed: interaction.prevEvent.speed,\n velocity: {\n x: interaction.prevEvent.velocityX,\n y: interaction.prevEvent.velocityY,\n },\n };\n }\n\n preventDefault () {}\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n}\n\nsignals.on('set-delta', function ({ iEvent, interaction, starting, deltaSource }) {\n const prevEvent = starting? iEvent : interaction.prevEvent;\n\n if (deltaSource === 'client') {\n iEvent.dx = iEvent.clientX - prevEvent.clientX;\n iEvent.dy = iEvent.clientY - prevEvent.clientY;\n }\n else {\n iEvent.dx = iEvent.pageX - prevEvent.pageX;\n iEvent.dy = iEvent.pageY - prevEvent.pageY;\n }\n});\n\nInteractEvent.signals = signals;\n\nmodule.exports = InteractEvent;\n","const is = require('./utils/is');\nconst events = require('./utils/events');\nconst extend = require('./utils/extend');\nconst actions = require('./actions/base');\nconst scope = require('./scope');\nconst Eventable = require('./Eventable');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nconst {\n getElementRect,\n nodeContains,\n trySelector,\n} = require('./utils/domUtils');\nconst { getWindow } = require('./utils/window');\nconst { indexOf, contains } = require('./utils/arr');\nconst { wheelEvent } = require('./utils/browser');\n\n// all set interactables\nscope.interactables = [];\n\n/*\\\n * Interactable\n [ property ]\n **\n * Object type returned by @interact\n\\*/\nclass Interactable {\n constructor (target, options) {\n options = options || {};\n\n this.target = target;\n this.events = new Eventable();\n this._context = options.context || scope.document;\n this._win = getWindow(trySelector(target)? this._context : target);\n this._doc = this._win.document;\n\n signals.fire('new', {\n target,\n options,\n interactable: this,\n win: this._win,\n });\n\n scope.addDocument( this._doc, this._win );\n\n scope.interactables.push(this);\n\n this.set(options);\n }\n\n setOnEvents (action, phases) {\n const onAction = 'on' + action;\n\n if (is.function(phases.onstart) ) { this.events[onAction + 'start' ] = phases.onstart ; }\n if (is.function(phases.onmove) ) { this.events[onAction + 'move' ] = phases.onmove ; }\n if (is.function(phases.onend) ) { this.events[onAction + 'end' ] = phases.onend ; }\n if (is.function(phases.oninertiastart)) { this.events[onAction + 'inertiastart' ] = phases.oninertiastart ; }\n\n return this;\n }\n\n setPerAction (action, options) {\n // for all the default per-action options\n for (const option in options) {\n // if this option exists for this action\n if (option in defaults[action]) {\n // if the option in the options arg is an object value\n if (is.object(options[option])) {\n // duplicate the object\n this.options[action][option] = extend(this.options[action][option] || {}, options[option]);\n\n if (is.object(defaults.perAction[option]) && 'enabled' in defaults.perAction[option]) {\n this.options[action][option].enabled = options[option].enabled === false? false : true;\n }\n }\n else if (is.bool(options[option]) && is.object(defaults.perAction[option])) {\n this.options[action][option].enabled = options[option];\n }\n else if (options[option] !== undefined) {\n // or if it's not undefined, do a plain assignment\n this.options[action][option] = options[option];\n }\n }\n }\n }\n\n /*\\\n * Interactable.getRect\n [ method ]\n *\n * The default function to get an Interactables bounding rect. Can be\n * overridden using @Interactable.rectChecker.\n *\n - element (Element) #optional The element to measure.\n = (object) The object's bounding rectangle.\n o {\n o top : 0,\n o left : 0,\n o bottom: 0,\n o right : 0,\n o width : 0,\n o height: 0\n o }\n \\*/\n getRect (element) {\n element = element || this.target;\n\n if (is.string(this.target) && !(is.element(element))) {\n element = this._context.querySelector(this.target);\n }\n\n return getElementRect(element);\n }\n\n /*\\\n * Interactable.rectChecker\n [ method ]\n *\n * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n - checker (function) #optional A function which returns this Interactable's bounding rectangle. See @Interactable.getRect\n = (function | object) The checker function or this Interactable\n \\*/\n rectChecker (checker) {\n if (is.function(checker)) {\n this.getRect = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.getRect;\n\n return this;\n }\n\n return this.getRect;\n }\n\n _backCompatOption (optionName, newValue) {\n if (trySelector(newValue) || is.object(newValue)) {\n this.options[optionName] = newValue;\n\n for (const action of actions.names) {\n this.options[action][optionName] = newValue;\n }\n\n return this;\n }\n\n return this.options[optionName];\n }\n\n /*\\\n * Interactable.origin\n [ method ]\n *\n * Gets or sets the origin of the Interactable's element. The x and y\n * of the origin will be subtracted from action event coordinates.\n *\n - origin (object | string) #optional An object eg. { x: 0, y: 0 } or string 'parent', 'self' or any CSS selector\n * OR\n - origin (Element) #optional An HTML or SVG Element whose rect will be used\n **\n = (object) The current origin or this Interactable\n \\*/\n origin (newValue) {\n return this._backCompatOption('origin', newValue);\n }\n\n /*\\\n * Interactable.deltaSource\n [ method ]\n *\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n - newValue (string) #optional Use 'client' if you will be scrolling while interacting; Use 'page' if you want autoScroll to work\n = (string | object) The current deltaSource or this Interactable\n \\*/\n deltaSource (newValue) {\n if (newValue === 'page' || newValue === 'client') {\n this.options.deltaSource = newValue;\n\n return this;\n }\n\n return this.options.deltaSource;\n }\n\n /*\\\n * Interactable.context\n [ method ]\n *\n * Gets the selector context Node of the Interactable. The default is `window.document`.\n *\n = (Node) The context Node of this Interactable\n **\n \\*/\n context () {\n return this._context;\n }\n\n inContext (element) {\n return (this._context === element.ownerDocument\n || nodeContains(this._context, element));\n }\n\n /*\\\n * Interactable.fire\n [ method ]\n *\n * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n - iEvent (InteractEvent) The InteractEvent object to be fired on this Interactable\n = (Interactable) this Interactable\n \\*/\n fire (iEvent) {\n this.events.fire(iEvent);\n\n return this;\n }\n\n _onOffMultiple (method, eventType, listener, options) {\n if (is.string(eventType) && eventType.search(' ') !== -1) {\n eventType = eventType.trim().split(/ +/);\n }\n\n if (is.array(eventType)) {\n for (let i = 0; i < eventType.length; i++) {\n this[method](eventType[i], listener, options);\n }\n\n return true;\n }\n\n if (is.object(eventType)) {\n for (const prop in eventType) {\n this[method](prop, eventType[prop], listener);\n }\n\n return true;\n }\n }\n\n /*\\\n * Interactable.on\n [ method ]\n *\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n - eventType (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) This Interactable\n \\*/\n on (eventType, listener, options) {\n if (this._onOffMultiple('on', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.on(eventType, listener);\n }\n // delegated event for selector\n else if (is.string(this.target)) {\n events.addDelegate(this.target, this._context, eventType, listener, options);\n }\n else {\n events.add(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.off\n [ method ]\n *\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n - eventType (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) This Interactable\n \\*/\n off (eventType, listener, options) {\n if (this._onOffMultiple('off', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n // if it is an action event type\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.off(eventType, listener);\n }\n // delegated event\n else if (is.string(this.target)) {\n events.removeDelegate(this.target, this._context, eventType, listener, options);\n }\n // remove listener from this Interatable's element\n else {\n events.remove(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.set\n [ method ]\n *\n * Reset the options of this Interactable\n - options (object) The new settings to apply\n = (object) This Interactable\n \\*/\n set (options) {\n if (!is.object(options)) {\n options = {};\n }\n\n this.options = extend({}, defaults.base);\n\n const perActions = extend({}, defaults.perAction);\n\n for (const actionName in actions.methodDict) {\n const methodName = actions.methodDict[actionName];\n\n this.options[actionName] = extend({}, defaults[actionName]);\n\n this.setPerAction(actionName, perActions);\n\n this[methodName](options[actionName]);\n }\n\n for (const setting of Interactable.settingsMethods) {\n this.options[setting] = defaults.base[setting];\n\n if (setting in options) {\n this[setting](options[setting]);\n }\n }\n\n signals.fire('set', {\n options,\n interactable: this,\n });\n\n return this;\n }\n\n /*\\\n * Interactable.unset\n [ method ]\n *\n * Remove this interactable from the list of interactables and remove\n * it's action capabilities and event listeners\n *\n = (object) @interact\n \\*/\n unset () {\n events.remove(this.target, 'all');\n\n if (is.string(this.target)) {\n // remove delegated events\n for (const type in events.delegatedEvents) {\n const delegated = events.delegatedEvents[type];\n\n if (delegated.selectors[0] === this.target\n && delegated.contexts[0] === this._context) {\n\n delegated.selectors.splice(0, 1);\n delegated.contexts .splice(0, 1);\n delegated.listeners.splice(0, 1);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegated[type] = null;\n }\n }\n\n events.remove(this._context, type, events.delegateListener);\n events.remove(this._context, type, events.delegateUseCapture, true);\n }\n }\n else {\n events.remove(this, 'all');\n }\n\n signals.fire('unset', { interactable: this });\n\n scope.interactables.splice(indexOf(scope.interactables, this), 1);\n\n // Stop related interactions when an Interactable is unset\n for (const interaction of scope.interactions || []) {\n if (interaction.target === this && interaction.interacting()) {\n interaction.stop();\n }\n }\n\n return scope.interact;\n }\n}\n\nscope.interactables.indexOfElement = function indexOfElement (target, context) {\n context = context || scope.document;\n\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n if (interactable.target === target && interactable._context === context) {\n return i;\n }\n }\n return -1;\n};\n\nscope.interactables.get = function interactableGet (element, options, dontCheckInContext) {\n const ret = this[this.indexOfElement(element, options && options.context)];\n\n return ret && (is.string(element) || dontCheckInContext || ret.inContext(element))? ret : null;\n};\n\nscope.interactables.forEachSelector = function (callback, element) {\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n // skip non CSS selector targets and out of context elements\n if (!is.string(interactable.target)\n || (element && !interactable.inContext(element))) {\n continue;\n }\n\n const ret = callback(interactable, interactable.target, interactable._context, i, this);\n\n if (ret !== undefined) {\n return ret;\n }\n }\n};\n\n// all interact.js eventTypes\nInteractable.eventTypes = scope.eventTypes = [];\n\nInteractable.signals = signals;\n\nInteractable.settingsMethods = [ 'deltaSource', 'origin', 'preventDefault', 'rectChecker' ];\n\nmodule.exports = Interactable;\n","const scope = require('./scope');\nconst utils = require('./utils');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst domObjects = require('./utils/domObjects');\nconst finder = require('./utils/interactionFinder');\nconst signals = require('./utils/Signals').new();\n\nconst listeners = {};\nconst methodNames = [\n 'pointerDown', 'pointerMove', 'pointerUp',\n 'updatePointer', 'removePointer',\n];\n\n// for ignoring browser's simulated mouse events\nlet prevTouchTime = 0;\n\n// all active and idle interactions\nscope.interactions = [];\n\nclass Interaction {\n constructor ({ pointerType }) {\n this.target = null; // current interactable being interacted with\n this.element = null; // the target element of the interactable\n\n this.prepared = { // action that's ready to be fired on next move event\n name : null,\n axis : null,\n edges: null,\n };\n\n // keep track of added pointers\n this.pointers = [];\n this.pointerIds = [];\n this.downTargets = [];\n this.downTimes = [];\n\n // Previous native pointer move event coordinates\n this.prevCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n // current native pointer move event coordinates\n this.curCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Starting InteractEvent pointer coordinates\n this.startCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Change in coordinates and time of the pointer\n this.pointerDelta = {\n page : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n client : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n timeStamp: 0,\n };\n\n this.downEvent = null; // pointerdown/mousedown/touchstart event\n this.downPointer = {};\n\n this._eventTarget = null;\n this._curEventTarget = null;\n\n this.prevEvent = null; // previous action event\n\n this.pointerIsDown = false;\n this.pointerWasMoved = false;\n this._interacting = false;\n\n this.pointerType = pointerType;\n\n signals.fire('new', this);\n\n scope.interactions.push(this);\n }\n\n pointerDown (pointer, event, eventTarget) {\n const pointerIndex = this.updatePointer(pointer, event, true);\n\n signals.fire('down', {\n pointer,\n event,\n eventTarget,\n pointerIndex,\n interaction: this,\n });\n }\n\n /*\\\n * Interaction.start\n [ method ]\n *\n * Start an action with the given Interactable and Element as tartgets. The\n * action must be enabled for the target Interactable and an appropriate number\n * of pointers must be held down - 1 for drag/resize, 2 for gesture.\n *\n * Use it with `interactable.able({ manualStart: false })` to always\n * [start actions manually](https://github.com/taye/interact.js/issues/114)\n *\n - action (object) The action to be performed - drag, resize, etc.\n - target (Interactable) The Interactable to target\n - element (Element) The DOM Element to target\n = (object) interact\n **\n | interact(target)\n | .draggable({\n | // disable the default drag start by down->move\n | manualStart: true\n | })\n | // start dragging after the user holds the pointer down\n | .on('hold', function (event) {\n | var interaction = event.interaction;\n |\n | if (!interaction.interacting()) {\n | interaction.start({ name: 'drag' },\n | event.interactable,\n | event.currentTarget);\n | }\n | });\n \\*/\n start (action, target, element) {\n if (this.interacting()\n || !this.pointerIsDown\n || this.pointerIds.length < (action.name === 'gesture'? 2 : 1)) {\n return;\n }\n\n // if this interaction had been removed after stopping\n // add it back\n if (utils.indexOf(scope.interactions, this) === -1) {\n scope.interactions.push(this);\n }\n\n utils.copyAction(this.prepared, action);\n this.target = target;\n this.element = element;\n\n signals.fire('action-start', {\n interaction: this,\n event: this.downEvent,\n });\n }\n\n pointerMove (pointer, event, eventTarget) {\n if (!this.simulation) {\n this.updatePointer(pointer);\n utils.setCoords(this.curCoords, this.pointers);\n }\n\n const duplicateMove = (this.curCoords.page.x === this.prevCoords.page.x\n && this.curCoords.page.y === this.prevCoords.page.y\n && this.curCoords.client.x === this.prevCoords.client.x\n && this.curCoords.client.y === this.prevCoords.client.y);\n\n let dx;\n let dy;\n\n // register movement greater than pointerMoveTolerance\n if (this.pointerIsDown && !this.pointerWasMoved) {\n dx = this.curCoords.client.x - this.startCoords.client.x;\n dy = this.curCoords.client.y - this.startCoords.client.y;\n\n this.pointerWasMoved = utils.hypot(dx, dy) > Interaction.pointerMoveTolerance;\n }\n\n const signalArg = {\n pointer,\n pointerIndex: this.getPointerIndex(pointer),\n event,\n eventTarget,\n dx,\n dy,\n duplicate: duplicateMove,\n interaction: this,\n interactingBeforeMove: this.interacting(),\n };\n\n if (!duplicateMove) {\n // set pointer coordinate, time changes and speeds\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n }\n\n signals.fire('move', signalArg);\n\n if (!duplicateMove) {\n // if interacting, fire an 'action-move' signal etc\n if (this.interacting()) {\n this.doMove(signalArg);\n }\n\n if (this.pointerWasMoved) {\n utils.copyCoords(this.prevCoords, this.curCoords);\n }\n }\n }\n\n /*\\\n * Interaction.doMove\n [ method ]\n *\n * Force a move of the current action at the same coordinates. Useful if\n * snap/restrict has been changed and you want a movement with the new\n * settings.\n *\n **\n | interact(target)\n | .draggable(true)\n | .on('dragmove', function (event) {\n | if (someCondition) {\n | // change the snap settings\n | event.interactable.draggable({ snap: { targets: [] }});\n | // fire another move event with re-calculated snap\n | event.interaction.doMove();\n | }\n | });\n \\*/\n doMove (signalArg) {\n signalArg = utils.extend({\n pointer: this.pointers[0],\n event: this.prevEvent,\n eventTarget: this._eventTarget,\n interaction: this,\n }, signalArg || {});\n\n signals.fire('before-action-move', signalArg);\n\n if (!this._dontFireMove) {\n signals.fire('action-move', signalArg);\n }\n\n this._dontFireMove = false;\n }\n\n // End interact move events and stop auto-scroll unless simulation is running\n pointerUp (pointer, event, eventTarget, curEventTarget) {\n const pointerIndex = this.getPointerIndex(pointer);\n\n signals.fire(/cancel$/i.test(event.type)? 'cancel' : 'up', {\n pointer,\n pointerIndex,\n event,\n eventTarget,\n curEventTarget,\n interaction: this,\n });\n\n if (!this.simulation) {\n this.end(event);\n }\n\n this.pointerIsDown = false;\n this.removePointer(pointer, event);\n }\n\n /*\\\n * Interaction.end\n [ method ]\n *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n - event (PointerEvent) #optional\n **\n | interact(target)\n | .draggable(true)\n | .on('move', function (event) {\n | if (event.pageX > 1000) {\n | // end the current action\n | event.interaction.end();\n | // stop all further listeners from being called\n | event.stopImmediatePropagation();\n | }\n | });\n \\*/\n end (event) {\n event = event || this.prevEvent;\n\n if (this.interacting()) {\n signals.fire('action-end', {\n event,\n interaction: this,\n });\n }\n\n this.stop();\n }\n\n currentAction () {\n return this._interacting? this.prepared.name: null;\n }\n\n interacting () {\n return this._interacting;\n }\n\n stop () {\n signals.fire('stop', { interaction: this });\n\n if (this._interacting) {\n signals.fire('stop-active', { interaction: this });\n signals.fire('stop-' + this.prepared.name, { interaction: this });\n }\n\n this.target = this.element = null;\n\n this._interacting = false;\n this.prepared.name = this.prevEvent = null;\n }\n\n getPointerIndex (pointer) {\n // mouse and pen interactions may have only one pointer\n if (this.pointerType === 'mouse' || this.pointerType === 'pen') {\n return 0;\n }\n\n return utils.indexOf(this.pointerIds, utils.getPointerId(pointer));\n }\n\n updatePointer (pointer, event, down = event && /(down|start)$/i.test(event.type)) {\n const id = utils.getPointerId(pointer);\n let index = this.getPointerIndex(pointer);\n\n if (index === -1) {\n index = this.pointerIds.length;\n this.pointerIds[index] = id;\n }\n\n if (down) {\n signals.fire('update-pointer-down', {\n pointer,\n event,\n down,\n pointerId: id,\n pointerIndex: index,\n interaction: this,\n });\n }\n\n this.pointers[index] = pointer;\n\n return index;\n }\n\n removePointer (pointer, event) {\n const index = this.getPointerIndex(pointer);\n\n if (index === -1) { return; }\n\n signals.fire('remove-pointer', {\n pointer,\n event,\n pointerIndex: index,\n interaction: this,\n });\n\n this.pointers .splice(index, 1);\n this.pointerIds .splice(index, 1);\n this.downTargets.splice(index, 1);\n this.downTimes .splice(index, 1);\n }\n\n _updateEventTargets (target, currentTarget) {\n this._eventTarget = target;\n this._curEventTarget = currentTarget;\n }\n}\n\nfor (let i = 0, len = methodNames.length; i < len; i++) {\n const method = methodNames[i];\n\n listeners[method] = doOnInteractions(method);\n}\n\nfunction doOnInteractions (method) {\n return (function (event) {\n const pointerType = utils.getPointerType(event);\n const [eventTarget, curEventTarget] = utils.getEventTargets(event);\n const matches = []; // [ [pointer, interaction], ...]\n\n if (browser.supportsTouch && /touch/.test(event.type)) {\n prevTouchTime = new Date().getTime();\n\n for (let i = 0; i < event.changedTouches.length; i++) {\n const pointer = event.changedTouches[i];\n const interaction = finder.search(pointer, event.type, eventTarget);\n\n matches.push([pointer, interaction || new Interaction({ pointerType })]);\n }\n }\n else {\n let invalidPointer = false;\n\n if (!browser.supportsPointerEvent && /mouse/.test(event.type)) {\n // ignore mouse events while touch interactions are active\n for (let i = 0; i < scope.interactions.length && !invalidPointer; i++) {\n invalidPointer = scope.interactions[i].pointerType !== 'mouse' && scope.interactions[i].pointerIsDown;\n }\n\n // try to ignore mouse events that are simulated by the browser\n // after a touch event\n invalidPointer = invalidPointer\n || (new Date().getTime() - prevTouchTime < 500)\n // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated\n || event.timeStamp === 0;\n }\n\n if (!invalidPointer) {\n let interaction = finder.search(event, event.type, eventTarget);\n\n if (!interaction) {\n interaction = new Interaction({ pointerType });\n }\n\n matches.push([event, interaction]);\n }\n }\n\n for (const [pointer, interaction] of matches) {\n interaction._updateEventTargets(eventTarget, curEventTarget);\n interaction[method](pointer, event, eventTarget, curEventTarget);\n }\n });\n}\n\nfunction endAll (event) {\n for (let i = 0; i < scope.interactions.length; i++) {\n const interaction = scope.interactions[i];\n\n interaction.end(event);\n signals.fire('endall', { event, interaction });\n }\n}\n\nconst docEvents = { /* 'eventType': listenerFunc */ };\nconst pEventTypes = browser.pEventTypes;\n\nif (domObjects.PointerEvent) {\n docEvents[pEventTypes.down ] = listeners.pointerDown;\n docEvents[pEventTypes.move ] = listeners.pointerMove;\n docEvents[pEventTypes.up ] = listeners.pointerUp;\n docEvents[pEventTypes.cancel] = listeners.pointerUp;\n}\nelse {\n docEvents.mousedown = listeners.pointerDown;\n docEvents.mousemove = listeners.pointerMove;\n docEvents.mouseup = listeners.pointerUp;\n\n docEvents.touchstart = listeners.pointerDown;\n docEvents.touchmove = listeners.pointerMove;\n docEvents.touchend = listeners.pointerUp;\n docEvents.touchcancel = listeners.pointerUp;\n}\n\ndocEvents.blur = endAll;\n\nfunction onDocSignal ({ doc }, signalName) {\n const eventMethod = signalName.indexOf('add') === 0\n ? events.add : events.remove;\n\n // delegate event listener\n for (const eventType in scope.delegatedEvents) {\n eventMethod(doc, eventType, events.delegateListener);\n eventMethod(doc, eventType, events.delegateUseCapture, true);\n }\n\n for (const eventType in docEvents) {\n eventMethod(doc, eventType, docEvents[eventType]);\n }\n}\n\nsignals.on('update-pointer-down', ({ interaction, pointer, pointerId, pointerIndex, event, eventTarget, down }) => {\n interaction.pointerIds[pointerIndex] = pointerId;\n interaction.pointers[pointerIndex] = pointer;\n\n if (down) {\n interaction.pointerIsDown = true;\n }\n\n if (!interaction.interacting()) {\n utils.setCoords(interaction.startCoords, interaction.pointers);\n\n utils.copyCoords(interaction.curCoords , interaction.startCoords);\n utils.copyCoords(interaction.prevCoords, interaction.startCoords);\n\n interaction.downEvent = event;\n interaction.downTimes[pointerIndex] = interaction.curCoords.timeStamp;\n interaction.downTargets[pointerIndex] = eventTarget || event && utils.getEventTargets(event)[0];\n interaction.pointerWasMoved = false;\n\n utils.pointerExtend(interaction.downPointer, pointer);\n }\n});\n\nscope.signals.on('add-document' , onDocSignal);\nscope.signals.on('remove-document', onDocSignal);\n\nInteraction.pointerMoveTolerance = 1;\nInteraction.doOnInteractions = doOnInteractions;\nInteraction.endAll = endAll;\nInteraction.signals = signals;\nInteraction.docEvents = docEvents;\n\nscope.endAllInteractions = endAll;\n\nmodule.exports = Interaction;\n","const Interaction = require('../Interaction');\nconst InteractEvent = require('../InteractEvent');\n\nconst actions = {\n firePrepared,\n names: [],\n methodDict: {},\n};\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n interaction._interacting = true;\n firePrepared(interaction, event, 'start');\n});\n\nInteraction.signals.on('action-move', function ({ interaction, event, preEnd }) {\n firePrepared(interaction, event, 'move', preEnd);\n\n // if the action was ended in a listener\n if (!interaction.interacting()) { return false; }\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n firePrepared(interaction, event, 'end');\n});\n\nfunction firePrepared (interaction, event, phase, preEnd) {\n const actionName = interaction.prepared.name;\n\n const newEvent = new InteractEvent(interaction, event, actionName, phase, interaction.element, null, preEnd);\n\n interaction.target.fire(newEvent);\n interaction.prevEvent = newEvent;\n}\n\nmodule.exports = actions;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drag = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n startAxis : 'xy',\n lockAxis : 'xy',\n },\n\n checker: function (pointer, event, interactable) {\n const dragOptions = interactable.options.drag;\n\n return dragOptions.enabled\n ? { name: 'drag', axis: (dragOptions.lockAxis === 'start'\n ? dragOptions.startAxis\n : dragOptions.lockAxis)}\n : null;\n },\n\n getCursor: function () {\n return 'move';\n },\n};\n\nInteraction.signals.on('before-action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n interaction.curCoords.page.y = interaction.startCoords.page.y;\n interaction.curCoords.client.y = interaction.startCoords.client.y;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vx);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vx);\n interaction.pointerDelta.client.vy = 0;\n interaction.pointerDelta.page.vy = 0;\n }\n else if (axis === 'y') {\n interaction.curCoords.page.x = interaction.startCoords.page.x;\n interaction.curCoords.client.x = interaction.startCoords.client.x;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vy);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vy);\n interaction.pointerDelta.client.vx = 0;\n interaction.pointerDelta.page.vx = 0;\n }\n});\n\n// dragmove\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'dragmove') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n iEvent.pageY = interaction.startCoords.page.y;\n iEvent.clientY = interaction.startCoords.client.y;\n iEvent.dy = 0;\n }\n else if (axis === 'y') {\n iEvent.pageX = interaction.startCoords.page.x;\n iEvent.clientX = interaction.startCoords.client.x;\n iEvent.dx = 0;\n }\n});\n\n/*\\\n * Interactable.draggable\n [ method ]\n *\n * Gets or sets whether drag actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of drag events\n | var isDraggable = interact('ul li').draggable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on drag events (object makes the Interactable draggable)\n = (object) This Interactable\n | interact(element).draggable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // the axis in which the first movement must be\n | // for the drag sequence to start\n | // 'xy' by default - any direction\n | startAxis: 'x' || 'y' || 'xy',\n |\n | // 'xy' by default - don't restrict to one axis (move in any direction)\n | // 'x' or 'y' to restrict movement to either axis\n | // 'start' to restrict movement to the axis the drag started in\n | lockAxis: 'x' || 'y' || 'xy' || 'start',\n |\n | // max number of drags that can happen concurrently\n | // with elements of this Interactable. Infinity by default\n | max: Infinity,\n |\n | // max number of drags that can target the same element+Interactable\n | // 1 by default\n | maxPerElement: 2\n | });\n\\*/\nInteractable.prototype.draggable = function (options) {\n if (utils.is.object(options)) {\n this.options.drag.enabled = options.enabled === false? false: true;\n this.setPerAction('drag', options);\n this.setOnEvents('drag', options);\n\n if (/^(xy|x|y|start)$/.test(options.lockAxis)) {\n this.options.drag.lockAxis = options.lockAxis;\n }\n if (/^(xy|x|y)$/.test(options.startAxis)) {\n this.options.drag.startAxis = options.startAxis;\n }\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drag.enabled = options;\n\n if (!options) {\n this.ondragstart = this.ondragstart = this.ondragend = null;\n }\n\n return this;\n }\n\n return this.options.drag;\n};\n\nactions.drag = drag;\nactions.names.push('drag');\nutils.merge(Interactable.eventTypes, [\n 'dragstart',\n 'dragmove',\n 'draginertiastart',\n 'draginertiaresume',\n 'dragend',\n]);\nactions.methodDict.drag = 'draggable';\n\ndefaultOptions.drag = drag.defaults;\n\nmodule.exports = drag;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst scope = require('../scope');\nconst interact = require('../interact');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drop = {\n defaults: {\n enabled: false,\n accept : null,\n overlap: 'pointer',\n },\n};\n\nlet dynamicDrop = false;\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // reset active dropzones\n interaction.activeDrops.dropzones = [];\n interaction.activeDrops.elements = [];\n interaction.activeDrops.rects = [];\n\n interaction.dropEvents = null;\n\n if (!interaction.dynamicDrop) {\n setActiveDrops(interaction, interaction.element);\n }\n\n const dragEvent = interaction.prevEvent;\n const dropEvents = getDropEvents(interaction, event, dragEvent);\n\n if (dropEvents.activate) {\n fireActiveDrops(interaction, dropEvents.activate);\n }\n});\n\nInteractEvent.signals.on('new', function ({ interaction, iEvent, event }) {\n if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { return; }\n\n const draggableElement = interaction.element;\n const dragEvent = iEvent;\n const dropResult = getDrop(dragEvent, event, draggableElement);\n\n interaction.dropTarget = dropResult.dropzone;\n interaction.dropElement = dropResult.element;\n\n interaction.dropEvents = getDropEvents(interaction, event, dragEvent);\n});\n\nInteraction.signals.on('action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n fireDropEvents(interaction, interaction.dropEvents);\n});\n\nInteraction.signals.on('action-end', function ({ interaction }) {\n if (interaction.prepared.name === 'drag') {\n fireDropEvents(interaction, interaction.dropEvents);\n }\n});\n\nInteraction.signals.on('stop-drag', function ({ interaction }) {\n interaction.activeDrops.dropzones =\n interaction.activeDrops.elements =\n interaction.activeDrops.rects =\n interaction.dropEvents = null;\n});\n\nfunction collectDrops (interaction, element) {\n const drops = [];\n const elements = [];\n\n element = element || interaction.element;\n\n // collect all dropzones and their elements which qualify for a drop\n for (const current of scope.interactables) {\n if (!current.options.drop.enabled) { continue; }\n\n const accept = current.options.drop.accept;\n\n // test the draggable element against the dropzone's accept setting\n if ((utils.is.element(accept) && accept !== element)\n || (utils.is.string(accept)\n && !utils.matchesSelector(element, accept))) {\n\n continue;\n }\n\n // query for new elements if necessary\n const dropElements = utils.is.string(current.target)\n ? current._context.querySelectorAll(current.target)\n : [current.target];\n\n for (let i = 0; i < dropElements.length; i++) {\n const currentElement = dropElements[i];\n\n if (currentElement !== element) {\n drops.push(current);\n elements.push(currentElement);\n }\n }\n }\n\n return {\n elements,\n dropzones: drops,\n };\n}\n\nfunction fireActiveDrops (interaction, event) {\n let prevElement;\n\n // loop through all active dropzones and trigger event\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n const current = interaction.activeDrops.dropzones[i];\n const currentElement = interaction.activeDrops.elements [i];\n\n // prevent trigger of duplicate events on same element\n if (currentElement !== prevElement) {\n // set current element as event target\n event.target = currentElement;\n current.fire(event);\n }\n prevElement = currentElement;\n }\n}\n\n// Collect a new set of possible drops and save them in activeDrops.\n// setActiveDrops should always be called when a drag has just started or a\n// drag event happens while dynamicDrop is true\nfunction setActiveDrops (interaction, dragElement) {\n // get dropzones and their elements that could receive the draggable\n const possibleDrops = collectDrops(interaction, dragElement, true);\n\n interaction.activeDrops.dropzones = possibleDrops.dropzones;\n interaction.activeDrops.elements = possibleDrops.elements;\n interaction.activeDrops.rects = [];\n\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n interaction.activeDrops.rects[i] =\n interaction.activeDrops.dropzones[i].getRect(interaction.activeDrops.elements[i]);\n }\n}\n\nfunction getDrop (dragEvent, event, dragElement) {\n const interaction = dragEvent.interaction;\n const validDrops = [];\n\n if (dynamicDrop) {\n setActiveDrops(interaction, dragElement);\n }\n\n // collect all dropzones and their elements which qualify for a drop\n for (let j = 0; j < interaction.activeDrops.dropzones.length; j++) {\n const current = interaction.activeDrops.dropzones[j];\n const currentElement = interaction.activeDrops.elements [j];\n const rect = interaction.activeDrops.rects [j];\n\n validDrops.push(current.dropCheck(dragEvent, event, interaction.target, dragElement, currentElement, rect)\n ? currentElement\n : null);\n }\n\n // get the most appropriate dropzone based on DOM depth and order\n const dropIndex = utils.indexOfDeepestElement(validDrops);\n\n return {\n dropzone: interaction.activeDrops.dropzones[dropIndex] || null,\n element : interaction.activeDrops.elements [dropIndex] || null,\n };\n}\n\nfunction getDropEvents (interaction, pointerEvent, dragEvent) {\n const dropEvents = {\n enter : null,\n leave : null,\n activate : null,\n deactivate: null,\n move : null,\n drop : null,\n };\n\n const tmpl = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n };\n\n if (interaction.dropElement !== interaction.prevDropElement) {\n // if there was a prevDropTarget, create a dragleave event\n if (interaction.prevDropTarget) {\n dropEvents.leave = utils.extend({ type: 'dragleave' }, tmpl);\n\n dragEvent.dragLeave = dropEvents.leave.target = interaction.prevDropElement;\n dragEvent.prevDropzone = dropEvents.leave.dropzone = interaction.prevDropTarget;\n }\n // if the dropTarget is not null, create a dragenter event\n if (interaction.dropTarget) {\n dropEvents.enter = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n type : 'dragenter',\n };\n\n dragEvent.dragEnter = interaction.dropElement;\n dragEvent.dropzone = interaction.dropTarget;\n }\n }\n\n if (dragEvent.type === 'dragend' && interaction.dropTarget) {\n dropEvents.drop = utils.extend({ type: 'drop' }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n dragEvent.relatedTarget = interaction.dropElement;\n }\n if (dragEvent.type === 'dragstart') {\n dropEvents.activate = utils.extend({ type: 'dropactivate' }, tmpl);\n\n dropEvents.activate.target = null;\n dropEvents.activate.dropzone = null;\n }\n if (dragEvent.type === 'dragend') {\n dropEvents.deactivate = utils.extend({ type: 'dropdeactivate' }, tmpl);\n\n dropEvents.deactivate.target = null;\n dropEvents.deactivate.dropzone = null;\n }\n if (dragEvent.type === 'dragmove' && interaction.dropTarget) {\n dropEvents.move = utils.extend({\n dragmove : dragEvent,\n type : 'dropmove',\n }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n }\n\n return dropEvents;\n}\n\nfunction fireDropEvents (interaction, dropEvents) {\n if (dropEvents.leave) { interaction.prevDropTarget.fire(dropEvents.leave); }\n if (dropEvents.move ) { interaction.dropTarget.fire(dropEvents.move ); }\n if (dropEvents.enter) { interaction.dropTarget.fire(dropEvents.enter); }\n if (dropEvents.drop ) { interaction.dropTarget.fire(dropEvents.drop ); }\n if (dropEvents.deactivate) {\n fireActiveDrops(interaction, dropEvents.deactivate);\n }\n\n interaction.prevDropTarget = interaction.dropTarget;\n interaction.prevDropElement = interaction.dropElement;\n}\n\n/*\\\n * Interactable.dropzone\n [ method ]\n *\n * Returns or sets whether elements can be dropped onto this\n * Interactable to trigger drop events\n *\n * Dropzones can receive the following events:\n * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends\n * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone\n * - `dragmove` when a draggable that has entered the dropzone is moved\n * - `drop` when a draggable is dropped into this dropzone\n *\n * Use the `accept` option to allow only elements that match the given CSS\n * selector or element. The value can be:\n *\n * - **an Element** - only that element can be dropped into this dropzone.\n * - **a string**, - the element being dragged must match it as a CSS selector.\n * - **`null`** - accept options is cleared - it accepts any element.\n *\n * Use the `overlap` option to set how drops are checked for. The allowed\n * values are:\n *\n * - `'pointer'`, the pointer must be over the dropzone (default)\n * - `'center'`, the draggable element's center must be over the dropzone\n * - a number from 0-1 which is the `(intersection area) / (draggable area)`.\n * e.g. `0.5` for drop to happen when half of the area of the draggable is\n * over the dropzone\n *\n * Use the `checker` option to specify a function to check if a dragged\n * element is over this Interactable.\n *\n | interact(target)\n | .dropChecker(function(dragEvent, // related dragmove or dragend event\n | event, // TouchEvent/PointerEvent/MouseEvent\n | dropped, // bool result of the default checker\n | dropzone, // dropzone Interactable\n | dropElement, // dropzone elemnt\n | draggable, // draggable Interactable\n | draggableElement) {// draggable element\n |\n | return dropped && event.target.hasAttribute('allow-drop');\n | }\n *\n *\n - options (boolean | object | null) #optional The new value to be set.\n | interact('.drop').dropzone({\n | accept: '.can-drop' || document.getElementById('single-drop'),\n | overlap: 'pointer' || 'center' || zeroToOne\n | }\n = (boolean | object) The current setting or this Interactable\n\\*/\nInteractable.prototype.dropzone = function (options) {\n if (utils.is.object(options)) {\n this.options.drop.enabled = options.enabled === false? false: true;\n\n if (utils.is.function(options.ondrop) ) { this.events.ondrop = options.ondrop ; }\n if (utils.is.function(options.ondropactivate) ) { this.events.ondropactivate = options.ondropactivate ; }\n if (utils.is.function(options.ondropdeactivate)) { this.events.ondropdeactivate = options.ondropdeactivate; }\n if (utils.is.function(options.ondragenter) ) { this.events.ondragenter = options.ondragenter ; }\n if (utils.is.function(options.ondragleave) ) { this.events.ondragleave = options.ondragleave ; }\n if (utils.is.function(options.ondropmove) ) { this.events.ondropmove = options.ondropmove ; }\n\n if (/^(pointer|center)$/.test(options.overlap)) {\n this.options.drop.overlap = options.overlap;\n }\n else if (utils.is.number(options.overlap)) {\n this.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0);\n }\n if ('accept' in options) {\n this.options.drop.accept = options.accept;\n }\n if ('checker' in options) {\n this.options.drop.checker = options.checker;\n }\n\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drop.enabled = options;\n\n if (!options) {\n this.ondragenter = this.ondragleave = this.ondrop\n = this.ondropactivate = this.ondropdeactivate = null;\n }\n\n return this;\n }\n\n return this.options.drop;\n};\n\nInteractable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) {\n let dropped = false;\n\n // if the dropzone has no rect (eg. display: none)\n // call the custom dropChecker or just return false\n if (!(rect = rect || this.getRect(dropElement))) {\n return (this.options.drop.checker\n ? this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement)\n : false);\n }\n\n const dropOverlap = this.options.drop.overlap;\n\n if (dropOverlap === 'pointer') {\n const origin = utils.getOriginXY(draggable, draggableElement, 'drag');\n const page = utils.getPageXY(dragEvent);\n\n page.x += origin.x;\n page.y += origin.y;\n\n const horizontal = (page.x > rect.left) && (page.x < rect.right);\n const vertical = (page.y > rect.top ) && (page.y < rect.bottom);\n\n dropped = horizontal && vertical;\n }\n\n const dragRect = draggable.getRect(draggableElement);\n\n if (dragRect && dropOverlap === 'center') {\n const cx = dragRect.left + dragRect.width / 2;\n const cy = dragRect.top + dragRect.height / 2;\n\n dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom;\n }\n\n if (dragRect && utils.is.number(dropOverlap)) {\n const overlapArea = (Math.max(0, Math.min(rect.right , dragRect.right ) - Math.max(rect.left, dragRect.left))\n * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top , dragRect.top )));\n\n const overlapRatio = overlapArea / (dragRect.width * dragRect.height);\n\n dropped = overlapRatio >= dropOverlap;\n }\n\n if (this.options.drop.checker) {\n dropped = this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement);\n }\n\n return dropped;\n};\n\nInteractable.signals.on('unset', function ({ interactable }) {\n interactable.dropzone(false);\n});\n\nInteractable.settingsMethods.push('dropChecker');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.dropTarget = null; // the dropzone a drag target might be dropped into\n interaction.dropElement = null; // the element at the time of checking\n interaction.prevDropTarget = null; // the dropzone that was recently dragged away from\n interaction.prevDropElement = null; // the element at the time of checking\n interaction.dropEvents = null; // the dropEvents related to the current drag event\n\n interaction.activeDrops = {\n dropzones: [], // the dropzones that are mentioned below\n elements : [], // elements of dropzones that accept the target draggable\n rects : [], // the rects of the elements mentioned above\n };\n\n});\n\nInteraction.signals.on('stop', function ({ interaction }) {\n interaction.dropTarget = interaction.dropElement =\n interaction.prevDropTarget = interaction.prevDropElement = null;\n});\n\n/*\\\n * interact.dynamicDrop\n [ method ]\n *\n * Returns or sets whether the dimensions of dropzone elements are\n * calculated on every dragmove or only on dragstart for the default\n * dropChecker\n *\n - newValue (boolean) #optional True to check on each move. False to check only before start\n = (boolean | interact) The current setting or interact\n\\*/\ninteract.dynamicDrop = function (newValue) {\n if (utils.is.bool(newValue)) {\n //if (dragging && dynamicDrop !== newValue && !newValue) {\n //calcRects(dropzones);\n //}\n\n dynamicDrop = newValue;\n\n return interact;\n }\n return dynamicDrop;\n};\n\nutils.merge(Interactable.eventTypes, [\n 'dragenter',\n 'dragleave',\n 'dropactivate',\n 'dropdeactivate',\n 'dropmove',\n 'drop',\n]);\nactions.methodDict.drop = 'dropzone';\n\ndefaultOptions.drop = drop.defaults;\n\nmodule.exports = drop;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst gesture = {\n defaults: {\n enabled : false,\n origin : null,\n restrict: null,\n },\n\n checker: function (pointer, event, interactable, element, interaction) {\n if (interaction.pointerIds.length >= 2) {\n return { name: 'gesture' };\n }\n\n return null;\n },\n\n getCursor: function () {\n return '';\n },\n};\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturestart') { return; }\n iEvent.ds = 0;\n\n interaction.gesture.startDistance = interaction.gesture.prevDistance = iEvent.distance;\n interaction.gesture.startAngle = interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.scale = 1;\n});\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturemove') { return; }\n\n iEvent.ds = iEvent.scale - interaction.gesture.scale;\n\n interaction.target.fire(iEvent);\n\n interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.prevDistance = iEvent.distance;\n\n if (iEvent.scale !== Infinity\n && iEvent.scale !== null\n && iEvent.scale !== undefined\n && !isNaN(iEvent.scale)) {\n\n interaction.gesture.scale = iEvent.scale;\n }\n});\n\n/*\\\n * Interactable.gesturable\n [ method ]\n *\n * Gets or sets whether multitouch gestures can be performed on the\n * Interactable's element\n *\n = (boolean) Indicates if this can be the target of gesture events\n | var isGestureable = interact(element).gesturable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on gesture events (makes the Interactable gesturable)\n = (object) this Interactable\n | interact(element).gesturable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // limit multiple gestures.\n | // See the explanation in @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n\\*/\nInteractable.prototype.gesturable = function (options) {\n if (utils.is.object(options)) {\n this.options.gesture.enabled = options.enabled === false? false: true;\n this.setPerAction('gesture', options);\n this.setOnEvents('gesture', options);\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.gesture.enabled = options;\n\n if (!options) {\n this.ongesturestart = this.ongesturestart = this.ongestureend = null;\n }\n\n return this;\n }\n\n return this.options.gesture;\n};\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action, event, starting, ending, deltaSource }) {\n if (action !== 'gesture') { return; }\n\n const pointers = interaction.pointers;\n\n iEvent.touches = [pointers[0], pointers[1]];\n\n if (starting) {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = 1;\n iEvent.ds = 0;\n iEvent.angle = utils.touchAngle(pointers, undefined, deltaSource);\n iEvent.da = 0;\n }\n else if (ending || event instanceof InteractEvent) {\n iEvent.distance = interaction.prevEvent.distance;\n iEvent.box = interaction.prevEvent.box;\n iEvent.scale = interaction.prevEvent.scale;\n iEvent.ds = iEvent.scale - 1;\n iEvent.angle = interaction.prevEvent.angle;\n iEvent.da = iEvent.angle - interaction.gesture.startAngle;\n }\n else {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = iEvent.distance / interaction.gesture.startDistance;\n iEvent.angle = utils.touchAngle(pointers, interaction.gesture.prevAngle, deltaSource);\n\n iEvent.ds = iEvent.scale - interaction.gesture.prevScale;\n iEvent.da = iEvent.angle - interaction.gesture.prevAngle;\n }\n});\n\nInteraction.signals.on('new', function (interaction) {\n interaction.gesture = {\n start: { x: 0, y: 0 },\n\n startDistance: 0, // distance between two touches of touchStart\n prevDistance : 0,\n distance : 0,\n\n scale: 1, // gesture.distance / gesture.startDistance\n\n startAngle: 0, // angle of line joining two touches\n prevAngle : 0, // angle of the previous gesture event\n };\n});\n\nactions.gesture = gesture;\nactions.names.push('gesture');\nutils.merge(Interactable.eventTypes, [\n 'gesturestart',\n 'gesturemove',\n 'gestureend',\n]);\nactions.methodDict.gesture = 'gesturable';\n\ndefaultOptions.gesture = gesture.defaults;\n\nmodule.exports = gesture;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\n// Less Precision with touch input\nconst defaultMargin = browser.supportsTouch || browser.supportsPointerEvent? 20: 10;\n\nconst resize = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n square: false,\n preserveAspectRatio: false,\n axis: 'xy',\n\n // use default margin\n margin: NaN,\n\n // object with props left, right, top, bottom which are\n // true/false values to resize when the pointer is over that edge,\n // CSS selectors to match the handles for each direction\n // or the Elements for each handle\n edges: null,\n\n // a value of 'none' will limit the resize rect to a minimum of 0x0\n // 'negate' will alow the rect to have negative width/height\n // 'reposition' will keep the width/height positive by swapping\n // the top and bottom edges and/or swapping the left and right edges\n invert: 'none',\n },\n\n checker: function (pointer, event, interactable, element, interaction, rect) {\n if (!rect) { return null; }\n\n const page = utils.extend({}, interaction.curCoords.page);\n const options = interactable.options;\n\n if (options.resize.enabled) {\n const resizeOptions = options.resize;\n const resizeEdges = { left: false, right: false, top: false, bottom: false };\n\n // if using resize.edges\n if (utils.is.object(resizeOptions.edges)) {\n for (const edge in resizeEdges) {\n resizeEdges[edge] = checkResizeEdge(edge,\n resizeOptions.edges[edge],\n page,\n interaction._eventTarget,\n element,\n rect,\n resizeOptions.margin || defaultMargin);\n }\n\n resizeEdges.left = resizeEdges.left && !resizeEdges.right;\n resizeEdges.top = resizeEdges.top && !resizeEdges.bottom;\n\n if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) {\n return {\n name: 'resize',\n edges: resizeEdges,\n };\n }\n }\n else {\n const right = options.resize.axis !== 'y' && page.x > (rect.right - defaultMargin);\n const bottom = options.resize.axis !== 'x' && page.y > (rect.bottom - defaultMargin);\n\n if (right || bottom) {\n return {\n name: 'resize',\n axes: (right? 'x' : '') + (bottom? 'y' : ''),\n };\n }\n }\n }\n\n return null;\n },\n\n cursors: (browser.isIe9OrOlder ? {\n x : 'e-resize',\n y : 's-resize',\n xy: 'se-resize',\n\n top : 'n-resize',\n left : 'w-resize',\n bottom : 's-resize',\n right : 'e-resize',\n topleft : 'se-resize',\n bottomright: 'se-resize',\n topright : 'ne-resize',\n bottomleft : 'ne-resize',\n } : {\n x : 'ew-resize',\n y : 'ns-resize',\n xy: 'nwse-resize',\n\n top : 'ns-resize',\n left : 'ew-resize',\n bottom : 'ns-resize',\n right : 'ew-resize',\n topleft : 'nwse-resize',\n bottomright: 'nwse-resize',\n topright : 'nesw-resize',\n bottomleft : 'nesw-resize',\n }),\n\n getCursor: function (action) {\n if (action.axis) {\n return resize.cursors[action.name + action.axis];\n }\n else if (action.edges) {\n let cursorKey = '';\n const edgeNames = ['top', 'bottom', 'left', 'right'];\n\n for (let i = 0; i < 4; i++) {\n if (action.edges[edgeNames[i]]) {\n cursorKey += edgeNames[i];\n }\n }\n\n return resize.cursors[cursorKey];\n }\n },\n};\n\n// resizestart\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'resizestart' || !interaction.prepared.edges) {\n return;\n }\n\n const startRect = interaction.target.getRect(interaction.element);\n const resizeOptions = interaction.target.options.resize;\n\n /*\n * When using the `resizable.square` or `resizable.preserveAspectRatio` options, resizing from one edge\n * will affect another. E.g. with `resizable.square`, resizing to make the right edge larger will make\n * the bottom edge larger by the same amount. We call these 'linked' edges. Any linked edges will depend\n * on the active edges and the edge being interacted with.\n */\n if (resizeOptions.square || resizeOptions.preserveAspectRatio) {\n const linkedEdges = utils.extend({}, interaction.prepared.edges);\n\n linkedEdges.top = linkedEdges.top || (linkedEdges.left && !linkedEdges.bottom);\n linkedEdges.left = linkedEdges.left || (linkedEdges.top && !linkedEdges.right );\n linkedEdges.bottom = linkedEdges.bottom || (linkedEdges.right && !linkedEdges.top );\n linkedEdges.right = linkedEdges.right || (linkedEdges.bottom && !linkedEdges.left );\n\n interaction.prepared._linkedEdges = linkedEdges;\n }\n else {\n interaction.prepared._linkedEdges = null;\n }\n\n // if using `resizable.preserveAspectRatio` option, record aspect ratio at the start of the resize\n if (resizeOptions.preserveAspectRatio) {\n interaction.resizeStartAspectRatio = startRect.width / startRect.height;\n }\n\n interaction.resizeRects = {\n start : startRect,\n current : utils.extend({}, startRect),\n inverted : utils.extend({}, startRect),\n previous : utils.extend({}, startRect),\n delta : {\n left: 0, right : 0, width : 0,\n top : 0, bottom: 0, height: 0,\n },\n };\n\n iEvent.rect = interaction.resizeRects.inverted;\n iEvent.deltaRect = interaction.resizeRects.delta;\n});\n\n// resizemove\nInteractEvent.signals.on('new', function ({ iEvent, phase, interaction }) {\n if (phase !== 'move' || !interaction.prepared.edges) { return; }\n\n const resizeOptions = interaction.target.options.resize;\n const invert = resizeOptions.invert;\n const invertible = invert === 'reposition' || invert === 'negate';\n\n let edges = interaction.prepared.edges;\n\n const start = interaction.resizeRects.start;\n const current = interaction.resizeRects.current;\n const inverted = interaction.resizeRects.inverted;\n const delta = interaction.resizeRects.delta;\n const previous = utils.extend(interaction.resizeRects.previous, inverted);\n const originalEdges = edges;\n\n let dx = iEvent.dx;\n let dy = iEvent.dy;\n\n if (resizeOptions.preserveAspectRatio || resizeOptions.square) {\n // `resize.preserveAspectRatio` takes precedence over `resize.square`\n const startAspectRatio = resizeOptions.preserveAspectRatio\n ? interaction.resizeStartAspectRatio\n : 1;\n\n edges = interaction.prepared._linkedEdges;\n\n if ((originalEdges.left && originalEdges.bottom)\n || (originalEdges.right && originalEdges.top)) {\n dy = -dx / startAspectRatio;\n }\n else if (originalEdges.left || originalEdges.right ) { dy = dx / startAspectRatio; }\n else if (originalEdges.top || originalEdges.bottom) { dx = dy * startAspectRatio; }\n }\n\n // update the 'current' rect without modifications\n if (edges.top ) { current.top += dy; }\n if (edges.bottom) { current.bottom += dy; }\n if (edges.left ) { current.left += dx; }\n if (edges.right ) { current.right += dx; }\n\n if (invertible) {\n // if invertible, copy the current rect\n utils.extend(inverted, current);\n\n if (invert === 'reposition') {\n // swap edge values if necessary to keep width/height positive\n let swap;\n\n if (inverted.top > inverted.bottom) {\n swap = inverted.top;\n\n inverted.top = inverted.bottom;\n inverted.bottom = swap;\n }\n if (inverted.left > inverted.right) {\n swap = inverted.left;\n\n inverted.left = inverted.right;\n inverted.right = swap;\n }\n }\n }\n else {\n // if not invertible, restrict to minimum of 0x0 rect\n inverted.top = Math.min(current.top, start.bottom);\n inverted.bottom = Math.max(current.bottom, start.top);\n inverted.left = Math.min(current.left, start.right);\n inverted.right = Math.max(current.right, start.left);\n }\n\n inverted.width = inverted.right - inverted.left;\n inverted.height = inverted.bottom - inverted.top ;\n\n for (const edge in inverted) {\n delta[edge] = inverted[edge] - previous[edge];\n }\n\n iEvent.edges = interaction.prepared.edges;\n iEvent.rect = inverted;\n iEvent.deltaRect = delta;\n});\n\n/*\\\n * Interactable.resizable\n [ method ]\n *\n * Gets or sets whether resize actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of resize elements\n | var isResizeable = interact('input[type=text]').resizable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on resize events (object makes the Interactable resizable)\n = (object) This Interactable\n | interact(element).resizable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | edges: {\n | top : true, // Use pointer coords to check for resize.\n | left : false, // Disable resizing from left edge.\n | bottom: '.resize-s',// Resize if pointer target matches selector\n | right : handleEl // Resize if pointer target is the given Element\n | },\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height are adjusted at a 1:1 ratio.\n | square: false,\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height maintain the aspect ratio they had when resizing started.\n | preserveAspectRatio: false,\n |\n | // a value of 'none' will limit the resize rect to a minimum of 0x0\n | // 'negate' will allow the rect to have negative width/height\n | // 'reposition' will keep the width/height positive by swapping\n | // the top and bottom edges and/or swapping the left and right edges\n | invert: 'none' || 'negate' || 'reposition'\n |\n | // limit multiple resizes.\n | // See the explanation in the @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n \\*/\nInteractable.prototype.resizable = function (options) {\n if (utils.is.object(options)) {\n this.options.resize.enabled = options.enabled === false? false: true;\n this.setPerAction('resize', options);\n this.setOnEvents('resize', options);\n\n if (/^x$|^y$|^xy$/.test(options.axis)) {\n this.options.resize.axis = options.axis;\n }\n else if (options.axis === null) {\n this.options.resize.axis = defaultOptions.resize.axis;\n }\n\n if (utils.is.bool(options.preserveAspectRatio)) {\n this.options.resize.preserveAspectRatio = options.preserveAspectRatio;\n }\n else if (utils.is.bool(options.square)) {\n this.options.resize.square = options.square;\n }\n\n return this;\n }\n if (utils.is.bool(options)) {\n this.options.resize.enabled = options;\n\n if (!options) {\n this.onresizestart = this.onresizestart = this.onresizeend = null;\n }\n\n return this;\n }\n return this.options.resize;\n};\n\nfunction checkResizeEdge (name, value, page, element, interactableElement, rect, margin) {\n // false, '', undefined, null\n if (!value) { return false; }\n\n // true value, use pointer coords and element rect\n if (value === true) {\n // if dimensions are negative, \"switch\" edges\n const width = utils.is.number(rect.width )? rect.width : rect.right - rect.left;\n const height = utils.is.number(rect.height)? rect.height : rect.bottom - rect.top ;\n\n if (width < 0) {\n if (name === 'left' ) { name = 'right'; }\n else if (name === 'right') { name = 'left' ; }\n }\n if (height < 0) {\n if (name === 'top' ) { name = 'bottom'; }\n else if (name === 'bottom') { name = 'top' ; }\n }\n\n if (name === 'left' ) { return page.x < ((width >= 0? rect.left: rect.right ) + margin); }\n if (name === 'top' ) { return page.y < ((height >= 0? rect.top : rect.bottom) + margin); }\n\n if (name === 'right' ) { return page.x > ((width >= 0? rect.right : rect.left) - margin); }\n if (name === 'bottom') { return page.y > ((height >= 0? rect.bottom: rect.top ) - margin); }\n }\n\n // the remaining checks require an element\n if (!utils.is.element(element)) { return false; }\n\n return utils.is.element(value)\n // the value is an element to use as a resize handle\n ? value === element\n // otherwise check if element matches value as selector\n : utils.matchesUpTo(element, value, interactableElement);\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.resizeAxes = 'xy';\n});\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action }) {\n if (action !== 'resize' || !interaction.resizeAxes) { return; }\n\n const options = interaction.target.options;\n\n if (options.resize.square) {\n if (interaction.resizeAxes === 'y') {\n iEvent.dx = iEvent.dy;\n }\n else {\n iEvent.dy = iEvent.dx;\n }\n iEvent.axes = 'xy';\n }\n else {\n iEvent.axes = interaction.resizeAxes;\n\n if (interaction.resizeAxes === 'x') {\n iEvent.dy = 0;\n }\n else if (interaction.resizeAxes === 'y') {\n iEvent.dx = 0;\n }\n }\n});\n\nactions.resize = resize;\nactions.names.push('resize');\nutils.merge(Interactable.eventTypes, [\n 'resizestart',\n 'resizemove',\n 'resizeinertiastart',\n 'resizeinertiaresume',\n 'resizeend',\n]);\nactions.methodDict.resize = 'resizable';\n\ndefaultOptions.resize = resize.defaults;\n\nmodule.exports = resize;\n","const raf = require('./utils/raf');\nconst getWindow = require('./utils/window').getWindow;\nconst is = require('./utils/is');\nconst domUtils = require('./utils/domUtils');\nconst Interaction = require('./Interaction');\nconst defaultOptions = require('./defaultOptions');\n\nconst autoScroll = {\n defaults: {\n enabled : false,\n container: null, // the item that is scrolled (Window or HTMLElement)\n margin : 60,\n speed : 300, // the scroll speed in pixels per second\n },\n\n interaction: null,\n i: null, // the handle returned by window.setInterval\n x: 0, y: 0, // Direction each pulse is to scroll in\n\n isScrolling: false,\n prevTime: 0,\n\n start: function (interaction) {\n autoScroll.isScrolling = true;\n raf.cancel(autoScroll.i);\n\n autoScroll.interaction = interaction;\n autoScroll.prevTime = new Date().getTime();\n autoScroll.i = raf.request(autoScroll.scroll);\n },\n\n stop: function () {\n autoScroll.isScrolling = false;\n raf.cancel(autoScroll.i);\n },\n\n // scroll the window by the values in scroll.x/y\n scroll: function () {\n const options = autoScroll.interaction.target.options[autoScroll.interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(autoScroll.interaction.element);\n const now = new Date().getTime();\n // change in time in seconds\n const dt = (now - autoScroll.prevTime) / 1000;\n // displacement\n const s = options.speed * dt;\n\n if (s >= 1) {\n if (is.window(container)) {\n container.scrollBy(autoScroll.x * s, autoScroll.y * s);\n }\n else if (container) {\n container.scrollLeft += autoScroll.x * s;\n container.scrollTop += autoScroll.y * s;\n }\n\n autoScroll.prevTime = now;\n }\n\n if (autoScroll.isScrolling) {\n raf.cancel(autoScroll.i);\n autoScroll.i = raf.request(autoScroll.scroll);\n }\n },\n check: function (interactable, actionName) {\n const options = interactable.options;\n\n return options[actionName].autoScroll && options[actionName].autoScroll.enabled;\n },\n onInteractionMove: function ({ interaction, pointer }) {\n if (!(interaction.interacting()\n && autoScroll.check(interaction.target, interaction.prepared.name))) {\n return;\n }\n\n if (interaction.simulation) {\n autoScroll.x = autoScroll.y = 0;\n return;\n }\n\n let top;\n let right;\n let bottom;\n let left;\n\n const options = interaction.target.options[interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(interaction.element);\n\n if (is.window(container)) {\n left = pointer.clientX < autoScroll.margin;\n top = pointer.clientY < autoScroll.margin;\n right = pointer.clientX > container.innerWidth - autoScroll.margin;\n bottom = pointer.clientY > container.innerHeight - autoScroll.margin;\n }\n else {\n const rect = domUtils.getElementClientRect(container);\n\n left = pointer.clientX < rect.left + autoScroll.margin;\n top = pointer.clientY < rect.top + autoScroll.margin;\n right = pointer.clientX > rect.right - autoScroll.margin;\n bottom = pointer.clientY > rect.bottom - autoScroll.margin;\n }\n\n autoScroll.x = (right ? 1: left? -1: 0);\n autoScroll.y = (bottom? 1: top? -1: 0);\n\n if (!autoScroll.isScrolling) {\n // set the autoScroll properties to those of the target\n autoScroll.margin = options.margin;\n autoScroll.speed = options.speed;\n\n autoScroll.start(interaction);\n }\n },\n};\n\nInteraction.signals.on('stop-active', function () {\n autoScroll.stop();\n});\n\nInteraction.signals.on('action-move', autoScroll.onInteractionMove);\n\ndefaultOptions.perAction.autoScroll = autoScroll.defaults;\n\nmodule.exports = autoScroll;\n","const Interactable = require('../Interactable');\nconst actions = require('../actions/base');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.ignoreFrom\n [ method ]\n *\n * If the target of the `mousedown`, `pointerdown` or `touchstart`\n * event or any of it's parents match the given CSS selector or\n * Element, no drag/resize/gesture is started.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to not ignore any elements\n = (string | Element | object) The current ignoreFrom value or this Interactable\n **\n | interact(element, { ignoreFrom: document.getElementById('no-action') });\n | // or\n | interact(element).ignoreFrom('input, textarea, a');\n\\*/\nInteractable.prototype.ignoreFrom = function (newValue) {\n return this._backCompatOption('ignoreFrom', newValue);\n};\n\n/*\\\n * Interactable.allowFrom\n [ method ]\n *\n * A drag/resize/gesture is started only If the target of the\n * `mousedown`, `pointerdown` or `touchstart` event or any of it's\n * parents match the given CSS selector or Element.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to allow from any element\n = (string | Element | object) The current allowFrom value or this Interactable\n **\n | interact(element, { allowFrom: document.getElementById('drag-handle') });\n | // or\n | interact(element).allowFrom('.handle');\n\\*/\nInteractable.prototype.allowFrom = function (newValue) {\n return this._backCompatOption('allowFrom', newValue);\n};\n\nInteractable.prototype.testIgnore = function (ignoreFrom, interactableElement, element) {\n if (!ignoreFrom || !is.element(element)) { return false; }\n\n if (is.string(ignoreFrom)) {\n return domUtils.matchesUpTo(element, ignoreFrom, interactableElement);\n }\n else if (is.element(ignoreFrom)) {\n return domUtils.nodeContains(ignoreFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testAllow = function (allowFrom, interactableElement, element) {\n if (!allowFrom) { return true; }\n\n if (!is.element(element)) { return false; }\n\n if (is.string(allowFrom)) {\n return domUtils.matchesUpTo(element, allowFrom, interactableElement);\n }\n else if (is.element(allowFrom)) {\n return domUtils.nodeContains(allowFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testIgnoreAllow = function (options, interactableElement, eventTarget) {\n return (!this.testIgnore(options.ignoreFrom, interactableElement, eventTarget)\n && this.testAllow(options.allowFrom, interactableElement, eventTarget));\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (event.buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\n","const interact = require('../interact');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst actions = require('../actions/base');\nconst defaultOptions = require('../defaultOptions');\nconst browser = require('../utils/browser');\nconst scope = require('../scope');\nconst utils = require('../utils');\nconst signals = require('../utils/Signals').new();\n\nrequire('./InteractableMethods');\n\nconst autoStart = {\n signals,\n withinInteractionLimit,\n // Allow this many interactions to happen simultaneously\n maxInteractions: Infinity,\n defaults: {\n perAction: {\n manualStart: false,\n max: Infinity,\n maxPerElement: 1,\n allowFrom: null,\n ignoreFrom: null,\n },\n },\n setActionDefaults: function (action) {\n utils.extend(action.defaults, autoStart.defaults.perAction);\n },\n};\n\n// set cursor style on mousedown\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget }) {\n if (interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\n// set cursor style on mousemove\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget }) {\n if (!interaction.mouse\n || interaction.pointerIsDown\n || interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\nInteraction.signals.on('move', function (arg) {\n const { interaction, event } = arg;\n\n if (!interaction.pointerIsDown\n || interaction.interacting()\n || !interaction.pointerWasMoved\n || !interaction.prepared.name) {\n return;\n }\n\n signals.fire('before-start', arg);\n\n const target = interaction.target;\n\n if (interaction.prepared.name && target) {\n // check manualStart and interaction limit\n if (target.options[interaction.prepared.name].manualStart\n || !withinInteractionLimit(target, interaction.element, interaction.prepared)) {\n interaction.stop(event);\n }\n else {\n interaction.start(interaction.prepared, target, interaction.element);\n }\n }\n});\n\n// Check if the current target supports the action.\n// If so, return the validated action. Otherwise, return null\nfunction validateAction (action, interactable, element, eventTarget) {\n if (utils.is.object(action)\n && interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget)\n && interactable.options[action.name].enabled\n && withinInteractionLimit(interactable, element, action)) {\n return action;\n }\n\n return null;\n}\n\nfunction validateSelector (interaction, pointer, event, matches, matchElements, eventTarget) {\n for (let i = 0, len = matches.length; i < len; i++) {\n const match = matches[i];\n const matchElement = matchElements[i];\n const action = validateAction(match.getAction(pointer, event, interaction, matchElement),\n match,\n matchElement,\n eventTarget);\n\n if (action) {\n return {\n action,\n target: match,\n element: matchElement,\n };\n }\n }\n\n return {};\n}\n\nfunction getActionInfo (interaction, pointer, event, eventTarget) {\n let matches = [];\n let matchElements = [];\n\n let element = eventTarget;\n let action = null;\n\n function pushMatches (interactable, selector, context) {\n const elements = (browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined);\n\n if (utils.matchesSelector(element, selector, elements)) {\n\n matches.push(interactable);\n matchElements.push(element);\n }\n }\n\n while (utils.is.element(element)) {\n matches = [];\n matchElements = [];\n\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && (action = validateAction(elementInteractable.getAction(pointer, event, interaction, element, eventTarget),\n elementInteractable,\n element,\n eventTarget))\n && !elementInteractable.options[action.name].manualStart) {\n return {\n element,\n action,\n target: elementInteractable,\n };\n }\n else {\n scope.interactables.forEachSelector(pushMatches, element);\n\n const actionInfo = validateSelector(interaction, pointer, event, matches, matchElements, eventTarget);\n\n if (actionInfo.action\n && !actionInfo.target.options[actionInfo.action.name].manualStart) {\n return actionInfo;\n }\n }\n\n element = utils.parentNode(element);\n }\n\n return {};\n}\n\nfunction prepare (interaction, { action, target, element }) {\n action = action || {};\n\n if (interaction.target && interaction.target.options.styleCursor) {\n interaction.target._doc.documentElement.style.cursor = '';\n }\n\n interaction.target = target;\n interaction.element = element;\n utils.copyAction(interaction.prepared, action);\n\n if (target && target.options.styleCursor) {\n const cursor = action? actions[action.name].getCursor(action) : '';\n interaction.target._doc.documentElement.style.cursor = cursor;\n }\n\n signals.fire('prepared', { interaction: interaction });\n}\n\nInteraction.signals.on('stop', function ({ interaction }) {\n const target = interaction.target;\n\n if (target && target.options.styleCursor) {\n target._doc.documentElement.style.cursor = '';\n }\n});\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (utils.is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (utils.is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n const buttons = event.buttons || ({\n 0: 1,\n 1: 4,\n 3: 8,\n 4: 16,\n })[event.button];\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\nfunction withinInteractionLimit (interactable, element, action) {\n const options = interactable.options;\n const maxActions = options[action.name].max;\n const maxPerElement = options[action.name].maxPerElement;\n let activeInteractions = 0;\n let targetCount = 0;\n let targetElementCount = 0;\n\n // no actions if any of these values == 0\n if (!(maxActions && maxPerElement && autoStart.maxInteractions)) { return; }\n\n for (let i = 0, len = scope.interactions.length; i < len; i++) {\n const interaction = scope.interactions[i];\n const otherAction = interaction.prepared.name;\n\n if (!interaction.interacting()) { continue; }\n\n activeInteractions++;\n\n if (activeInteractions >= autoStart.maxInteractions) {\n return false;\n }\n\n if (interaction.target !== interactable) { continue; }\n\n targetCount += (otherAction === action.name)|0;\n\n if (targetCount >= maxActions) {\n return false;\n }\n\n if (interaction.element === element) {\n targetElementCount++;\n\n if (otherAction !== action.name || targetElementCount >= maxPerElement) {\n return false;\n }\n }\n }\n\n return autoStart.maxInteractions > 0;\n}\n\n/*\\\n * interact.maxInteractions\n [ method ]\n **\n * Returns or sets the maximum number of concurrent interactions allowed.\n * By default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables\n * and elements, you need to enable it in the draggable, resizable and\n * gesturable `'max'` and `'maxPerElement'` options.\n **\n - newValue (number) #optional Any number. newValue <= 0 means no interactions.\n\\*/\ninteract.maxInteractions = function (newValue) {\n if (utils.is.number(newValue)) {\n autoStart.maxInteractions = newValue;\n\n return this;\n }\n\n return autoStart.maxInteractions;\n};\n\nInteractable.settingsMethods.push('styleCursor');\nInteractable.settingsMethods.push('actionChecker');\nInteractable.settingsMethods.push('ignoreFrom');\nInteractable.settingsMethods.push('allowFrom');\n\ndefaultOptions.base.actionChecker = null;\ndefaultOptions.base.styleCursor = true;\n\nutils.extend(defaultOptions.perAction, autoStart.defaults.perAction);\n\nmodule.exports = autoStart;\n","const autoStart = require('./base');\nconst Interaction = require('../Interaction');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.delayTimer = null;\n});\n\nautoStart.signals.on('prepared', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.delayTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.target, interaction.element);\n }, delay);\n }\n});\n\nInteraction.signals.on('move', function ({ interaction, duplicate }) {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.delayTimer);\n }\n});\n\n// prevent regular down->move autoStart\nautoStart.signals.on('before-start', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.prepared.name = null;\n }\n});\n","const autoStart = require('./base');\nconst scope = require('../scope');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\n\nconst { matchesSelector, parentNode } = require('../utils/domUtils');\n\nautoStart.setActionDefaults(require('../actions/drag'));\n\nautoStart.signals.on('before-start', function ({ interaction, eventTarget, dx, dy }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // check if a drag is in the correct axis\n const absX = Math.abs(dx);\n const absY = Math.abs(dy);\n const options = interaction.target.options.drag;\n const startAxis = options.startAxis;\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy');\n\n interaction.prepared.axis = options.lockAxis === 'start'\n ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n : options.lockAxis;\n\n // if the movement isn't in the startAxis of the interactable\n if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) {\n // cancel the prepared action\n interaction.prepared.name = null;\n\n // then try to get a drag from another ineractable\n\n if (!interaction.prepared.name) {\n\n let element = eventTarget;\n\n const getDraggable = function (interactable, selector, context) {\n const elements = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n if (interactable === interaction.target) { return; }\n\n if (!options.manualStart\n && !interactable.testIgnoreAllow(options, element, eventTarget)\n && matchesSelector(element, selector, elements)) {\n\n const action = interactable.getAction(interaction.downPointer,\n interaction.downEvent,\n interaction,\n element);\n\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, interactable)\n && autoStart.validateAction(action, interactable, element, eventTarget)) {\n\n return interactable;\n }\n }\n };\n\n let action = null;\n\n // check all interactables\n while (is.element(element)) {\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && elementInteractable !== interaction.target\n && !elementInteractable.options.drag.manualStart) {\n\n action = elementInteractable.getAction(interaction.downPointer, interaction.downEvent, interaction, element);\n }\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, elementInteractable)) {\n\n interaction.prepared.name = 'drag';\n interaction.target = elementInteractable;\n interaction.element = element;\n break;\n }\n\n const selectorInteractable = scope.interactables.forEachSelector(getDraggable, element);\n\n if (selectorInteractable) {\n interaction.prepared.name = 'drag';\n interaction.target = selectorInteractable;\n interaction.element = element;\n break;\n }\n\n element = parentNode(element);\n }\n }\n }\n});\n\nfunction checkStartAxis (startAxis, interactable) {\n if (!interactable) { return false; }\n\n const thisAxis = interactable.options.drag.startAxis;\n\n return (startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis);\n}\n","require('./base').setActionDefaults(require('../actions/gesture'));\n","require('./base').setActionDefaults(require('../actions/resize'));\n","module.exports = {\n base: {\n accept : null,\n preventDefault: 'auto',\n deltaSource : 'page',\n },\n\n perAction: {\n origin: { x: 0, y: 0 },\n\n // only allow left button by default\n // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n mouseButtons: 1,\n\n inertia: {\n enabled : false,\n resistance : 10, // the lambda in exponential decay\n minSpeed : 100, // target speed must be above this for inertia to start\n endSpeed : 10, // the speed at which inertia is slow enough to stop\n allowResume : true, // allow resuming an action in inertia phase\n smoothEndDuration: 300, // animate to snap/restrict endOnly if there's no inertia\n },\n },\n};\n","/* browser entry point */\n\n// Legacy browser support\nrequire('./legacyBrowsers');\n\n// inertia\nrequire('./inertia');\n\n// modifiers\nrequire('./modifiers/snap');\nrequire('./modifiers/restrict');\n\n// pointerEvents\nrequire('./pointerEvents/base');\nrequire('./pointerEvents/holdRepeat');\nrequire('./pointerEvents/interactableTargets');\n\n// delay\nrequire('./autoStart/delay');\n\n// actions\nrequire('./actions/gesture');\nrequire('./actions/resize');\nrequire('./actions/drag');\nrequire('./actions/drop');\n\n// load these modifiers after resize is loaded\nrequire('./modifiers/snapSize');\nrequire('./modifiers/restrictEdges');\nrequire('./modifiers/restrictSize');\n\n// autoStart actions\nrequire('./autoStart/gesture');\nrequire('./autoStart/resize');\nrequire('./autoStart/drag');\n\n// Interactable preventDefault setting\nrequire('./interactablePreventDefault.js');\n\n// autoScroll\nrequire('./autoScroll');\n\n// export interact\nmodule.exports = require('./interact');\n","const InteractEvent = require('./InteractEvent');\nconst Interaction = require('./Interaction');\nconst modifiers = require('./modifiers');\nconst utils = require('./utils');\nconst animationFrame = require('./utils/raf');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.inertiaStatus = {\n active : false,\n smoothEnd : false,\n allowResume: false,\n\n startEvent: null,\n upCoords : {},\n\n xe: 0, ye: 0,\n sx: 0, sy: 0,\n\n t0: 0,\n vx0: 0, vys: 0,\n duration: 0,\n\n lambda_v0: 0,\n one_ve_v0: 0,\n i : null,\n };\n\n interaction.boundInertiaFrame = () => inertiaFrame .apply(interaction);\n interaction.boundSmoothEndFrame = () => smoothEndFrame.apply(interaction);\n});\n\nInteraction.signals.on('down', function ({ interaction, event, pointer, eventTarget }) {\n const status = interaction.inertiaStatus;\n\n // Check if the down event hits the current inertia target\n if (status.active) {\n let element = eventTarget;\n\n // climb up the DOM tree from the event target\n while (utils.is.element(element)) {\n\n // if interaction element is the current inertia target element\n if (element === interaction.element) {\n // stop inertia\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n\n // update pointers to the down event's coordinates\n interaction.updatePointer(pointer);\n utils.setCoords(interaction.curCoords, interaction.pointers);\n\n // fire appropriate signals\n const signalArg = { interaction };\n Interaction.signals.fire('before-action-move', signalArg);\n Interaction.signals.fire('action-resume' , signalArg);\n\n // fire a reume event\n const resumeEvent = new InteractEvent(interaction,\n event,\n interaction.prepared.name,\n 'inertiaresume',\n interaction.element);\n\n interaction.target.fire(resumeEvent);\n interaction.prevEvent = resumeEvent;\n modifiers.resetStatuses(interaction.modifierStatuses);\n\n utils.copyCoords(interaction.prevCoords, interaction.curCoords);\n break;\n }\n\n element = utils.parentNode(element);\n }\n }\n});\n\nInteraction.signals.on('up', function ({ interaction, event }) {\n const status = interaction.inertiaStatus;\n\n if (!interaction.interacting() || status.active) { return; }\n\n const target = interaction.target;\n const options = target && target.options;\n const inertiaOptions = options && interaction.prepared.name && options[interaction.prepared.name].inertia;\n\n const now = new Date().getTime();\n const statuses = {};\n const page = utils.extend({}, interaction.curCoords.page);\n const pointerSpeed = interaction.pointerDelta.client.speed;\n\n let smoothEnd = false;\n let modifierResult;\n\n // check if inertia should be started\n const inertiaPossible = (inertiaOptions && inertiaOptions.enabled\n && interaction.prepared.name !== 'gesture'\n && event !== status.startEvent);\n\n const inertia = (inertiaPossible\n && (now - interaction.curCoords.timeStamp) < 50\n && pointerSpeed > inertiaOptions.minSpeed\n && pointerSpeed > inertiaOptions.endSpeed);\n\n const modifierArg = {\n interaction,\n pageCoords: page,\n statuses,\n preEnd: true,\n requireEndOnly: true,\n };\n\n // smoothEnd\n if (inertiaPossible && !inertia) {\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n if (modifierResult.shouldMove && modifierResult.locked) {\n smoothEnd = true;\n }\n }\n\n if (!(inertia || smoothEnd)) { return; }\n\n utils.copyCoords(status.upCoords, interaction.curCoords);\n\n interaction.pointers[0] = status.startEvent =\n new InteractEvent(interaction, event, interaction.prepared.name, 'inertiastart', interaction.element);\n\n status.t0 = now;\n\n status.active = true;\n status.allowResume = inertiaOptions.allowResume;\n interaction.simulation = status;\n\n target.fire(status.startEvent);\n\n if (inertia) {\n status.vx0 = interaction.pointerDelta.client.vx;\n status.vy0 = interaction.pointerDelta.client.vy;\n status.v0 = pointerSpeed;\n\n calcInertia(interaction, status);\n\n utils.extend(page, interaction.curCoords.page);\n\n page.x += status.xe;\n page.y += status.ye;\n\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n status.modifiedXe += modifierResult.dx;\n status.modifiedYe += modifierResult.dy;\n\n status.i = animationFrame.request(interaction.boundInertiaFrame);\n }\n else {\n status.smoothEnd = true;\n status.xe = modifierResult.dx;\n status.ye = modifierResult.dy;\n\n status.sx = status.sy = 0;\n\n status.i = animationFrame.request(interaction.boundSmoothEndFrame);\n }\n});\n\nInteraction.signals.on('stop-active', function ({ interaction }) {\n const status = interaction.inertiaStatus;\n\n if (status.active) {\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n }\n});\n\nfunction calcInertia (interaction, status) {\n const inertiaOptions = interaction.target.options[interaction.prepared.name].inertia;\n const lambda = inertiaOptions.resistance;\n const inertiaDur = -Math.log(inertiaOptions.endSpeed / status.v0) / lambda;\n\n status.x0 = interaction.prevEvent.pageX;\n status.y0 = interaction.prevEvent.pageY;\n status.t0 = status.startEvent.timeStamp / 1000;\n status.sx = status.sy = 0;\n\n status.modifiedXe = status.xe = (status.vx0 - inertiaDur) / lambda;\n status.modifiedYe = status.ye = (status.vy0 - inertiaDur) / lambda;\n status.te = inertiaDur;\n\n status.lambda_v0 = lambda / status.v0;\n status.one_ve_v0 = 1 - inertiaOptions.endSpeed / status.v0;\n}\n\nfunction inertiaFrame () {\n updateInertiaCoords(this);\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n\n const status = this.inertiaStatus;\n const options = this.target.options[this.prepared.name].inertia;\n const lambda = options.resistance;\n const t = new Date().getTime() / 1000 - status.t0;\n\n if (t < status.te) {\n\n const progress = 1 - (Math.exp(-lambda * t) - status.lambda_v0) / status.one_ve_v0;\n\n if (status.modifiedXe === status.xe && status.modifiedYe === status.ye) {\n status.sx = status.xe * progress;\n status.sy = status.ye * progress;\n }\n else {\n const quadPoint = utils.getQuadraticCurvePoint(0, 0,\n status.xe,\n status.ye,\n status.modifiedXe,\n status.modifiedYe,\n progress);\n\n status.sx = quadPoint.x;\n status.sy = quadPoint.y;\n }\n\n this.doMove();\n\n status.i = animationFrame.request(this.boundInertiaFrame);\n }\n else {\n status.sx = status.modifiedXe;\n status.sy = status.modifiedYe;\n\n this.doMove();\n this.end(status.startEvent);\n status.active = false;\n this.simulation = null;\n }\n\n utils.copyCoords(this.prevCoords, this.curCoords);\n}\n\nfunction smoothEndFrame () {\n updateInertiaCoords(this);\n\n const status = this.inertiaStatus;\n const t = new Date().getTime() - status.t0;\n const duration = this.target.options[this.prepared.name].inertia.smoothEndDuration;\n\n if (t < duration) {\n status.sx = utils.easeOutQuad(t, 0, status.xe, duration);\n status.sy = utils.easeOutQuad(t, 0, status.ye, duration);\n\n this.pointerMove(status.startEvent, status.startEvent);\n\n status.i = animationFrame.request(this.boundSmoothEndFrame);\n }\n else {\n status.sx = status.xe;\n status.sy = status.ye;\n\n this.pointerMove(status.startEvent, status.startEvent);\n this.end(status.startEvent);\n\n status.smoothEnd =\n status.active = false;\n this.simulation = null;\n }\n}\n\nfunction updateInertiaCoords (interaction) {\n const status = interaction.inertiaStatus;\n\n // return if inertia isn't running\n if (!status.active) { return; }\n\n const pageUp = status.upCoords.page;\n const clientUp = status.upCoords.client;\n\n utils.setCoords(interaction.curCoords, [ {\n pageX : pageUp.x + status.sx,\n pageY : pageUp.y + status.sy,\n clientX: clientUp.x + status.sx,\n clientY: clientUp.y + status.sy,\n } ]);\n}\n","const browser = require('./utils/browser');\nconst events = require('./utils/events');\nconst utils = require('./utils');\nconst scope = require('./scope');\nconst Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\n\nconst globalEvents = {};\n\n/*\\\n * interact\n [ method ]\n *\n * The methods of this variable can be used to set elements as\n * interactables and also to change various default settings.\n *\n * Calling it as a function and passing an element or a valid CSS selector\n * string returns an Interactable object which has various methods to\n * configure it.\n *\n - element (Element | string) The HTML or SVG Element to interact with or CSS selector\n = (object) An @Interactable\n *\n > Usage\n | interact('#draggable').draggable(true);\n |\n | var rectables = interact('rect');\n | rectables\n | .gesturable(true)\n | .on('gesturemove', function (event) {\n | // ...\n | });\n\\*/\nfunction interact (element, options) {\n let interactable = scope.interactables.get(element, options);\n\n if (!interactable) {\n interactable = new Interactable(element, options);\n interactable.events.global = globalEvents;\n }\n\n return interactable;\n}\n\n/*\\\n * interact.isSet\n [ method ]\n *\n * Check if an element has been set\n - element (Element) The Element being searched for\n = (boolean) Indicates if the element or CSS selector was previously passed to interact\n\\*/\ninteract.isSet = function (element, options) {\n return scope.interactables.indexOfElement(element, options && options.context) !== -1;\n};\n\n/*\\\n * interact.on\n [ method ]\n *\n * Adds a global listener for an InteractEvent or adds a DOM event to\n * `document`\n *\n - type (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) interact\n\\*/\ninteract.on = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.on(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.on(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n // if it is an InteractEvent type, add listener to globalEvents\n if (utils.contains(Interactable.eventTypes, type)) {\n // if this type of event was never bound\n if (!globalEvents[type]) {\n globalEvents[type] = [listener];\n }\n else {\n globalEvents[type].push(listener);\n }\n }\n // If non InteractEvent type, addEventListener to document\n else {\n events.add(scope.document, type, listener, { options });\n }\n\n return interact;\n};\n\n/*\\\n * interact.off\n [ method ]\n *\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n - type (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) interact\n \\*/\ninteract.off = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.off(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.off(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n if (!utils.contains(Interactable.eventTypes, type)) {\n events.remove(scope.document, type, listener, options);\n }\n else {\n let index;\n\n if (type in globalEvents\n && (index = utils.indexOf(globalEvents[type], listener)) !== -1) {\n globalEvents[type].splice(index, 1);\n }\n }\n\n return interact;\n};\n\n/*\\\n * interact.debug\n [ method ]\n *\n * Returns an object which exposes internal data\n = (object) An object with properties that outline the current state and expose internal functions and variables\n\\*/\ninteract.debug = function () {\n return scope;\n};\n\n// expose the functions used to calculate multi-touch properties\ninteract.getPointerAverage = utils.pointerAverage;\ninteract.getTouchBBox = utils.touchBBox;\ninteract.getTouchDistance = utils.touchDistance;\ninteract.getTouchAngle = utils.touchAngle;\n\ninteract.getElementRect = utils.getElementRect;\ninteract.getElementClientRect = utils.getElementClientRect;\ninteract.matchesSelector = utils.matchesSelector;\ninteract.closest = utils.closest;\n\n/*\\\n * interact.supportsTouch\n [ method ]\n *\n = (boolean) Whether or not the browser supports touch input\n\\*/\ninteract.supportsTouch = function () {\n return browser.supportsTouch;\n};\n\n/*\\\n * interact.supportsPointerEvent\n [ method ]\n *\n = (boolean) Whether or not the browser supports PointerEvents\n\\*/\ninteract.supportsPointerEvent = function () {\n return browser.supportsPointerEvent;\n};\n\n/*\\\n * interact.stop\n [ method ]\n *\n * Cancels all interactions (end events are not fired)\n *\n - event (Event) An event on which to call preventDefault()\n = (object) interact\n\\*/\ninteract.stop = function (event) {\n for (let i = scope.interactions.length - 1; i >= 0; i--) {\n scope.interactions[i].stop(event);\n }\n\n return interact;\n};\n\n/*\\\n * interact.pointerMoveTolerance\n [ method ]\n * Returns or sets the distance the pointer must be moved before an action\n * sequence occurs. This also affects tolerance for tap events.\n *\n - newValue (number) #optional The movement from the start position must be greater than this value\n = (number | Interactable) The current setting or interact\n\\*/\ninteract.pointerMoveTolerance = function (newValue) {\n if (utils.is.number(newValue)) {\n Interaction.pointerMoveTolerance = newValue;\n\n return this;\n }\n\n return Interaction.pointerMoveTolerance;\n};\n\ninteract.addDocument = scope.addDocument;\ninteract.removeDocument = scope.removeDocument;\n\nscope.interact = interact;\n\nmodule.exports = interact;\n","const Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\nconst scope = require('./scope');\nconst is = require('./utils/is');\nconst events = require('./utils/events');\n\nconst { nodeContains, matchesSelector } = require('./utils/domUtils');\n\n/*\\\n * Interactable.preventDefault\n [ method ]\n *\n * Returns or sets whether to prevent the browser's default behaviour\n * in response to pointer events. Can be set to:\n * - `'always'` to always prevent\n * - `'never'` to never prevent\n * - `'auto'` to let interact.js try to determine what would be best\n *\n - newValue (string) #optional `true`, `false` or `'auto'`\n = (string | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.preventDefault = function (newValue) {\n if (/^(always|never|auto)$/.test(newValue)) {\n this.options.preventDefault = newValue;\n return this;\n }\n\n if (is.bool(newValue)) {\n this.options.preventDefault = newValue? 'always' : 'never';\n return this;\n }\n\n return this.options.preventDefault;\n};\n\nInteractable.prototype.checkAndPreventDefault = function (event) {\n const setting = this.options.preventDefault;\n\n if (setting === 'never') { return; }\n\n if (setting === 'always') {\n event.preventDefault();\n return;\n }\n\n // setting === 'auto'\n\n // don't preventDefault if the browser supports passiveEvents\n // CSS touch-action and user-selecct should be used instead\n if (events.supportsOptions) {\n return;\n }\n\n // don't preventDefault of pointerdown events\n if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) {\n return;\n }\n\n // don't preventDefault on editable elements\n if (is.element(event.target)\n && matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) {\n return;\n }\n\n event.preventDefault();\n};\n\nfunction onInteractionEvent ({ interaction, event }) {\n if (interaction.target) {\n interaction.target.checkAndPreventDefault(event);\n }\n}\n\nfor (const eventSignal of ['down', 'move', 'up', 'cancel']) {\n Interaction.signals.on(eventSignal, onInteractionEvent);\n}\n\n// prevent native HTML5 drag on interact.js target elements\nInteraction.docEvents.dragstart = function preventNativeDrag (event) {\n for (const interaction of scope.interactions) {\n\n if (interaction.element\n && (interaction.element === event.target\n || nodeContains(interaction.element, event.target))) {\n\n interaction.target.checkAndPreventDefault(event);\n return;\n }\n }\n};\n","const scope = require('./scope');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst iFinder = require('./utils/interactionFinder');\nconst pointerEvents = require('./pointerEvents/base');\n\nconst { window } = require('./utils/window');\n\nconst toString = Object.prototype.toString;\n\nif (!window.Array.isArray) {\n window.Array.isArray = function (obj) {\n return toString.call(obj) === '[object Array]';\n };\n}\n\nif (!String.prototype.trim) {\n String.prototype.trim = function () {\n return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n };\n}\n\n// http://www.quirksmode.org/dom/events/click.html\n// >Events leading to dblclick\n//\n// IE8 doesn't fire down event before dblclick.\n// This workaround tries to fire a tap and doubletap after dblclick\nfunction onIE8Dblclick (event) {\n const eventTarget = event.target;\n const interaction = iFinder.search(event, event.type, eventTarget);\n\n if (!interaction) { return; }\n\n if (interaction.prevTap\n && event.clientX === interaction.prevTap.clientX\n && event.clientY === interaction.prevTap.clientY\n && eventTarget === interaction.prevTap.target) {\n\n interaction.downTargets[0] = eventTarget;\n interaction.downTimes [0] = new Date().getTime();\n\n pointerEvents.fire({\n interaction,\n event,\n eventTarget,\n pointer: event,\n type: 'tap',\n });\n }\n}\n\nif (browser.isIE8) {\n const selectFix = function (event) {\n for (const interaction of scope.interactions) {\n if (interaction.interacting()) {\n interaction.target.checkAndPreventDefault(event);\n }\n }\n };\n\n const onDocIE8 = function onDocIE8 ({ doc, win }, signalName) {\n const eventMethod = signalName.indexOf('listen') === 0\n ? events.add : events.remove;\n\n // For IE's lack of Event#preventDefault\n eventMethod(doc, 'selectstart', selectFix);\n\n if (pointerEvents) {\n eventMethod(doc, 'dblclick', onIE8Dblclick);\n }\n };\n\n scope.signals.on('add-document' , onDocIE8);\n scope.signals.on('remove-document', onDocIE8);\n}\n\nmodule.exports = null;\n","const InteractEvent = require('../InteractEvent');\nconst Interaction = require('../Interaction');\nconst extend = require('../utils/extend');\n\nconst modifiers = {\n names: [],\n\n setOffsets: function (arg) {\n const { interaction, pageCoords: page } = arg;\n const { target, element, startOffset } = interaction;\n const rect = target.getRect(element);\n\n if (rect) {\n startOffset.left = page.x - rect.left;\n startOffset.top = page.y - rect.top;\n\n startOffset.right = rect.right - page.x;\n startOffset.bottom = rect.bottom - page.y;\n\n if (!('width' in rect)) { rect.width = rect.right - rect.left; }\n if (!('height' in rect)) { rect.height = rect.bottom - rect.top ; }\n }\n else {\n startOffset.left = startOffset.top = startOffset.right = startOffset.bottom = 0;\n }\n\n arg.rect = rect;\n arg.interactable = target;\n arg.element = element;\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n\n arg.options = target.options[interaction.prepared.name][modifierName];\n\n if (!arg.options) {\n continue;\n }\n\n interaction.modifierOffsets[modifierName] = modifiers[modifierName].setOffset(arg);\n }\n },\n\n setAll: function (arg) {\n const { interaction, statuses, preEnd, requireEndOnly } = arg;\n const coords = extend({}, arg.pageCoords);\n const result = {\n dx: 0,\n dy: 0,\n changed: false,\n locked: false,\n shouldMove: true,\n };\n\n for (const modifierName of modifiers.names) {\n const modifier = modifiers[modifierName];\n const options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!shouldDo(options, preEnd, requireEndOnly)) { continue; }\n\n arg.status = arg.status = statuses[modifierName];\n arg.options = options;\n arg.offset = arg.interaction.modifierOffsets[modifierName];\n\n modifier.set(arg);\n\n if (arg.status.locked) {\n coords.x += arg.status.dx;\n coords.y += arg.status.dy;\n\n result.dx += arg.status.dx;\n result.dy += arg.status.dy;\n\n result.locked = true;\n }\n }\n\n // a move should be fired if:\n // - there are no modifiers enabled,\n // - no modifiers are \"locked\" i.e. have changed the pointer's coordinates, or\n // - the locked coords have changed since the last pointer move\n result.shouldMove = !arg.status || !result.locked || arg.status.changed;\n\n return result;\n },\n\n resetStatuses: function (statuses) {\n for (const modifierName of modifiers.names) {\n const status = statuses[modifierName] || {};\n\n status.dx = status.dy = 0;\n status.modifiedX = status.modifiedY = NaN;\n status.locked = false;\n status.changed = true;\n\n statuses[modifierName] = status;\n }\n\n return statuses;\n },\n\n start: function ({ interaction }, signalName) {\n const arg = {\n interaction,\n pageCoords: (signalName === 'action-resume' ?\n interaction.curCoords : interaction.startCoords).page,\n startOffset: interaction.startOffset,\n statuses: interaction.modifierStatuses,\n preEnd: false,\n requireEndOnly: false,\n };\n\n modifiers.setOffsets(arg);\n modifiers.resetStatuses(arg.statuses);\n\n arg.pageCoords = extend({}, interaction.startCoords.page);\n interaction.modifierResult = modifiers.setAll(arg);\n },\n};\n\nInteraction.signals.on('new', function (interaction) {\n interaction.startOffset = { left: 0, right: 0, top: 0, bottom: 0 };\n interaction.modifierOffsets = {};\n interaction.modifierStatuses = modifiers.resetStatuses({});\n interaction.modifierResult = null;\n});\n\nInteraction.signals.on('action-start' , modifiers.start);\nInteraction.signals.on('action-resume', modifiers.start);\n\nInteraction.signals.on('before-action-move', function ({ interaction, preEnd, interactingBeforeMove }) {\n const modifierResult = modifiers.setAll({\n interaction,\n preEnd,\n pageCoords: interaction.curCoords.page,\n statuses: interaction.modifierStatuses,\n requireEndOnly: false,\n });\n\n // don't fire an action move if a modifier would keep the event in the same\n // cordinates as before\n if (!modifierResult.shouldMove && interactingBeforeMove) {\n interaction._dontFireMove = true;\n }\n\n interaction.modifierResult = modifierResult;\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n for (let i = 0; i < modifiers.names.length; i++) {\n const options = interaction.target.options[interaction.prepared.name][modifiers.names[i]];\n\n // if the endOnly option is true for any modifier\n if (shouldDo(options, true, true)) {\n // fire a move event at the modified coordinates\n interaction.doMove({ event, preEnd: true });\n break;\n }\n }\n});\n\nInteractEvent.signals.on('set-xy', function (arg) {\n const { iEvent, interaction } = arg;\n const modifierArg = extend({}, arg);\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n modifierArg.options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!modifierArg.options) {\n continue;\n }\n\n const modifier = modifiers[modifierName];\n\n modifierArg.status = interaction.modifierStatuses[modifierName];\n\n iEvent[modifierName] = modifier.modifyCoords(modifierArg);\n }\n});\n\nfunction shouldDo (options, preEnd, requireEndOnly) {\n return (options && options.enabled\n && (preEnd || !options.endOnly)\n && (!requireEndOnly || options.endOnly));\n}\n\nmodule.exports = modifiers;\n","const modifiers = require('./index');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst restrict = {\n defaults: {\n enabled : false,\n endOnly : false,\n restriction: null,\n elementRect: null,\n },\n\n setOffset: function ({ rect, startOffset, options }) {\n const elementRect = options && options.elementRect;\n const offset = {};\n\n if (rect && elementRect) {\n offset.left = startOffset.left - (rect.width * elementRect.left);\n offset.top = startOffset.top - (rect.height * elementRect.top);\n\n offset.right = startOffset.right - (rect.width * (1 - elementRect.right));\n offset.bottom = startOffset.bottom - (rect.height * (1 - elementRect.bottom));\n }\n else {\n offset.left = offset.top = offset.right = offset.bottom = 0;\n }\n\n return offset;\n },\n\n set: function ({ pageCoords, interaction, status, options }) {\n if (!options) { return status; }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n\n const restriction = getRestrictionRect(options.restriction, interaction, page);\n\n if (!restriction) { return status; }\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n const rect = restriction;\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n const offset = interaction.modifierOffsets.restrict;\n\n // object is assumed to have\n // x, y, width, height or\n // left, top, right, bottom\n if ('x' in restriction && 'y' in restriction) {\n modifiedX = Math.max(Math.min(rect.x + rect.width - offset.right , page.x), rect.x + offset.left);\n modifiedY = Math.max(Math.min(rect.y + rect.height - offset.bottom, page.y), rect.y + offset.top );\n }\n else {\n modifiedX = Math.max(Math.min(rect.right - offset.right , page.x), rect.left + offset.left);\n modifiedY = Math.max(Math.min(rect.bottom - offset.bottom, page.y), rect.top + offset.top );\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const elementRect = options && options.elementRect;\n\n if (options && options.enabled\n && !(phase === 'start' && elementRect && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n getRestrictionRect,\n};\n\nfunction getRestrictionRect (value, interaction, page) {\n if (utils.is.function(value)) {\n return utils.resolveRectLike(value, interaction.target, interaction.element, [page.x, page.y, interaction]);\n } else {\n return utils.resolveRectLike(value, interaction.target, interaction.element);\n }\n}\n\nmodifiers.restrict = restrict;\nmodifiers.names.push('restrict');\n\ndefaultOptions.perAction.restrict = restrict.defaults;\n\nmodule.exports = restrict;\n","// This module adds the options.resize.restrictEdges setting which sets min and\n// max for the top, left, bottom and right edges of the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictEdges: {\n// inner: { top: 200, left: 200, right: 400, bottom: 400 },\n// outer: { top: 0, left: 0, right: 600, bottom: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst { getRestrictionRect } = require('./restrict');\n\nconst noInner = { top: +Infinity, left: +Infinity, bottom: -Infinity, right: -Infinity };\nconst noOuter = { top: -Infinity, left: -Infinity, bottom: +Infinity, right: +Infinity };\n\nconst restrictEdges = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n offset: null,\n },\n\n setOffset: function ({ interaction, startOffset, options }) {\n if (!options) {\n return utils.extend({}, startOffset);\n }\n\n const offset = getRestrictionRect(options.offset, interaction, interaction.startCoords.page);\n\n if (offset) {\n return {\n top: startOffset.top + offset.y,\n left: startOffset.left + offset.x,\n bottom: startOffset.bottom + offset.y,\n right: startOffset.right + offset.x,\n };\n }\n\n return startOffset;\n },\n\n set: function ({ pageCoords, interaction, status, offset, options }) {\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n const inner = rectUtils.xywhToTlbr(getRestrictionRect(options.inner, interaction, page)) || noInner;\n const outer = rectUtils.xywhToTlbr(getRestrictionRect(options.outer, interaction, page)) || noOuter;\n\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n if (edges.top) {\n modifiedY = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top);\n }\n else if (edges.bottom) {\n modifiedY = Math.max(Math.min(outer.bottom - offset.bottom, page.y), inner.bottom - offset.bottom);\n }\n if (edges.left) {\n modifiedX = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left);\n }\n else if (edges.right) {\n modifiedX = Math.max(Math.min(outer.right - offset.right, page.x), inner.right - offset.right);\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n if (options && options.enabled\n && !(phase === 'start' && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n noInner,\n noOuter,\n getRestrictionRect,\n};\n\nmodifiers.restrictEdges = restrictEdges;\nmodifiers.names.push('restrictEdges');\n\ndefaultOptions.perAction.restrictEdges = restrictEdges.defaults;\nresize.defaults.restrictEdges = restrictEdges.defaults;\n\nmodule.exports = restrictEdges;\n","// This module adds the options.resize.restrictSize setting which sets min and\n// max width and height for the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictSize: {\n// min: { width: -600, height: -600 },\n// max: { width: 600, height: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst restrictEdges = require('./restrictEdges');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst noMin = { width: -Infinity, height: -Infinity };\nconst noMax = { width: +Infinity, height: +Infinity };\n\nconst restrictSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n },\n\n setOffset: function ({ interaction }) {\n return interaction.startOffset;\n },\n\n set: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const rect = rectUtils.xywhToTlbr(interaction.resizeRects.inverted);\n\n const minSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.min, interaction)) || noMin;\n const maxSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.max, interaction)) || noMax;\n\n arg.options = {\n enabled: options.enabled,\n endOnly: options.endOnly,\n inner: utils.extend({}, restrictEdges.noInner),\n outer: utils.extend({}, restrictEdges.noOuter),\n };\n\n if (edges.top) {\n arg.options.inner.top = rect.bottom - minSize.height;\n arg.options.outer.top = rect.bottom - maxSize.height;\n }\n else if (edges.bottom) {\n arg.options.inner.bottom = rect.top + minSize.height;\n arg.options.outer.bottom = rect.top + maxSize.height;\n }\n if (edges.left) {\n arg.options.inner.left = rect.right - minSize.width;\n arg.options.outer.left = rect.right - maxSize.width;\n }\n else if (edges.right) {\n arg.options.inner.right = rect.left + minSize.width;\n arg.options.outer.right = rect.left + maxSize.width;\n }\n\n restrictEdges.set(arg);\n },\n\n modifyCoords: restrictEdges.modifyCoords,\n};\n\nmodifiers.restrictSize = restrictSize;\nmodifiers.names.push('restrictSize');\n\ndefaultOptions.perAction.restrictSize = restrictSize.defaults;\nresize.defaults.restrictSize = restrictSize.defaults;\n\nmodule.exports = restrictSize;\n","const modifiers = require('./index');\nconst interact = require('../interact');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst snap = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n\n relativePoints: null,\n },\n\n setOffset: function ({ interaction, interactable, element, rect, startOffset, options }) {\n const offsets = [];\n const optionsOrigin = utils.rectToXY(utils.resolveRectLike(options.origin));\n const origin = optionsOrigin || utils.getOriginXY(interactable, element, interaction.prepared.name);\n options = options || interactable.options[interaction.prepared.name].snap || {};\n\n let snapOffset;\n\n if (options.offset === 'startCoords') {\n snapOffset = {\n x: interaction.startCoords.page.x - origin.x,\n y: interaction.startCoords.page.y - origin.y,\n };\n }\n else {\n const offsetRect = utils.resolveRectLike(options.offset, interactable, element, [interaction]);\n\n snapOffset = utils.rectToXY(offsetRect) || { x: 0, y: 0 };\n }\n\n if (rect && options.relativePoints && options.relativePoints.length) {\n for (const { x: relativeX, y: relativeY } of options.relativePoints) {\n offsets.push({\n x: startOffset.left - (rect.width * relativeX) + snapOffset.x,\n y: startOffset.top - (rect.height * relativeY) + snapOffset.y,\n });\n }\n }\n else {\n offsets.push(snapOffset);\n }\n\n return offsets;\n },\n\n set: function ({ interaction, pageCoords, status, options, offset: offsets }) {\n const targets = [];\n let target;\n let page;\n let i;\n\n if (status.useStatusXY) {\n page = { x: status.x, y: status.y };\n }\n else {\n const origin = utils.getOriginXY(interaction.target, interaction.element, interaction.prepared.name);\n\n page = utils.extend({}, pageCoords);\n\n page.x -= origin.x;\n page.y -= origin.y;\n }\n\n status.realX = page.x;\n status.realY = page.y;\n\n let len = options.targets? options.targets.length : 0;\n\n for (const { x: offsetX, y: offsetY } of offsets) {\n const relativeX = page.x - offsetX;\n const relativeY = page.y - offsetY;\n\n for (const snapTarget of options.targets) {\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n targets.push({\n x: utils.is.number(target.x) ? (target.x + offsetX) : relativeX,\n y: utils.is.number(target.y) ? (target.y + offsetY) : relativeY,\n\n range: utils.is.number(target.range)? target.range: options.range,\n });\n }\n }\n\n const closest = {\n target: null,\n inRange: false,\n distance: 0,\n range: 0,\n dx: 0,\n dy: 0,\n };\n\n for (i = 0, len = targets.length; i < len; i++) {\n target = targets[i];\n\n const range = target.range;\n const dx = target.x - page.x;\n const dy = target.y - page.y;\n const distance = utils.hypot(dx, dy);\n let inRange = distance <= range;\n\n // Infinite targets count as being out of range\n // compared to non infinite ones that are in range\n if (range === Infinity && closest.inRange && closest.range !== Infinity) {\n inRange = false;\n }\n\n if (!closest.target || (inRange\n // is the closest target in range?\n ? (closest.inRange && range !== Infinity\n // the pointer is relatively deeper in this target\n ? distance / range < closest.distance / closest.range\n // this target has Infinite range and the closest doesn't\n : (range === Infinity && closest.range !== Infinity)\n // OR this target is closer that the previous closest\n || distance < closest.distance)\n // The other is not in range and the pointer is closer to this target\n : (!closest.inRange && distance < closest.distance))) {\n\n closest.target = target;\n closest.distance = distance;\n closest.range = range;\n closest.inRange = inRange;\n closest.dx = dx;\n closest.dy = dy;\n\n status.range = range;\n }\n }\n\n let snapChanged;\n\n if (closest.target) {\n snapChanged = (status.modifiedX !== closest.target.x || status.modifiedY !== closest.target.y);\n\n status.modifiedX = closest.target.x;\n status.modifiedY = closest.target.y;\n }\n else {\n snapChanged = true;\n\n status.modifiedX = NaN;\n status.modifiedY = NaN;\n }\n\n status.dx = closest.dx;\n status.dy = closest.dy;\n\n status.changed = (snapChanged || (closest.inRange && !status.locked));\n status.locked = closest.inRange;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const relativePoints = options && options.relativePoints;\n\n if (options && options.enabled\n && !(phase === 'start' && relativePoints && relativePoints.length)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n }\n\n return {\n range : status.range,\n locked : status.locked,\n x : status.modifiedX,\n y : status.modifiedY,\n realX : status.realX,\n realY : status.realY,\n dx : status.dx,\n dy : status.dy,\n };\n }\n },\n};\n\ninteract.createSnapGrid = function (grid) {\n return function (x, y) {\n const limits = grid.limits || {\n left : -Infinity,\n right : Infinity,\n top : -Infinity,\n bottom: Infinity,\n };\n let offsetX = 0;\n let offsetY = 0;\n\n if (utils.is.object(grid.offset)) {\n offsetX = grid.offset.x;\n offsetY = grid.offset.y;\n }\n\n const gridx = Math.round((x - offsetX) / grid.x);\n const gridy = Math.round((y - offsetY) / grid.y);\n\n const newX = Math.max(limits.left, Math.min(limits.right , gridx * grid.x + offsetX));\n const newY = Math.max(limits.top , Math.min(limits.bottom, gridy * grid.y + offsetY));\n\n return {\n x: newX,\n y: newY,\n range: grid.range,\n };\n };\n};\n\nmodifiers.snap = snap;\nmodifiers.names.push('snap');\n\ndefaultOptions.perAction.snap = snap.defaults;\n\nmodule.exports = snap;\n","// This module allows snapping of the size of targets during resize\n// interactions.\n\nconst modifiers = require('./index');\nconst snap = require('./snap');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\nconst utils = require('../utils/');\n\nconst snapSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n },\n\n setOffset: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.edges;\n\n if (!edges) { return; }\n\n arg.options = {\n relativePoints: [{\n x: edges.left? 0 : 1,\n y: edges.top ? 0 : 1,\n }],\n origin: { x: 0, y: 0 },\n offset: 'self',\n range: options.range,\n };\n\n const offsets = snap.setOffset(arg);\n arg.options = options;\n\n return offsets;\n },\n\n set: function (arg) {\n const { interaction, options, offset, pageCoords } = arg;\n const page = utils.extend({}, pageCoords);\n const relativeX = page.x - offset[0].x;\n const relativeY = page.y - offset[0].y;\n\n arg.options = utils.extend({}, options);\n arg.options.targets = [];\n\n for (const snapTarget of options.targets) {\n let target;\n\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n if ('width' in target && 'height' in target) {\n target.x = target.width;\n target.y = target.height;\n }\n\n arg.options.targets.push(target);\n }\n\n snap.set(arg);\n },\n\n modifyCoords: function (arg) {\n const { options } = arg;\n\n arg.options = utils.extend({}, options);\n arg.options.enabled = options.enabled;\n arg.options.relativePoints = [null];\n\n snap.modifyCoords(arg);\n },\n};\n\nmodifiers.snapSize = snapSize;\nmodifiers.names.push('snapSize');\n\ndefaultOptions.perAction.snapSize = snapSize.defaults;\nresize.defaults.snapSize = snapSize.defaults;\n\nmodule.exports = snapSize;\n","const pointerUtils = require('../utils/pointerUtils');\n\nmodule.exports = class PointerEvent {\n constructor (type, pointer, event, eventTarget, interaction) {\n pointerUtils.pointerExtend(this, event);\n\n if (event !== pointer) {\n pointerUtils.pointerExtend(this, pointer);\n }\n\n this.interaction = interaction;\n\n this.timeStamp = new Date().getTime();\n this.originalEvent = event;\n this.type = type;\n this.pointerId = pointerUtils.getPointerId(pointer);\n this.pointerType = pointerUtils.getPointerType(pointer);\n this.target = eventTarget;\n this.currentTarget = null;\n\n if (type === 'tap') {\n const pointerIndex = interaction.getPointerIndex(pointer);\n this.dt = this.timeStamp - interaction.downTimes[pointerIndex];\n\n const interval = this.timeStamp - interaction.tapTime;\n\n this.double = !!(interaction.prevTap\n && interaction.prevTap.type !== 'doubletap'\n && interaction.prevTap.target === this.target\n && interval < 500);\n }\n else if (type === 'doubletap') {\n this.dt = pointer.timeStamp - interaction.tapTime;\n }\n }\n\n subtractOrigin ({ x: originX, y: originY }) {\n this.pageX -= originX;\n this.pageY -= originY;\n this.clientX -= originX;\n this.clientY -= originY;\n\n return this;\n }\n\n addOrigin ({ x: originX, y: originY }) {\n this.pageX += originX;\n this.pageY += originY;\n this.clientX += originX;\n this.clientY += originY;\n\n return this;\n }\n\n preventDefault () {\n this.originalEvent.preventDefault();\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n};\n","const PointerEvent = require('./PointerEvent');\nconst Interaction = require('../Interaction');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst defaults = require('../defaultOptions');\nconst signals = require('../utils/Signals').new();\nconst { filter } = require('../utils/arr');\n\nconst simpleSignals = [ 'down', 'up', 'cancel' ];\nconst simpleEvents = [ 'down', 'up', 'cancel' ];\n\nconst pointerEvents = {\n PointerEvent,\n fire,\n collectEventTargets,\n signals,\n defaults: {\n holdDuration: 600,\n ignoreFrom : null,\n allowFrom : null,\n origin : { x: 0, y: 0 },\n },\n types: [\n 'down',\n 'move',\n 'up',\n 'cancel',\n 'tap',\n 'doubletap',\n 'hold',\n ],\n};\n\nfunction fire (arg) {\n const {\n interaction, pointer, event, eventTarget,\n type = arg.pointerEvent.type,\n targets = collectEventTargets(arg),\n pointerEvent = new PointerEvent(type, pointer, event, eventTarget, interaction),\n } = arg;\n\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n targets,\n type,\n pointerEvent,\n };\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n\n for (const prop in target.props || {}) {\n pointerEvent[prop] = target.props[prop];\n }\n\n const origin = utils.getOriginXY(target.eventable, target.element);\n\n pointerEvent.subtractOrigin(origin);\n pointerEvent.eventable = target.eventable;\n pointerEvent.currentTarget = target.element;\n\n target.eventable.fire(pointerEvent);\n\n pointerEvent.addOrigin(origin);\n\n if (pointerEvent.immediatePropagationStopped\n || (pointerEvent.propagationStopped\n && (i + 1) < targets.length && targets[i + 1].element !== pointerEvent.currentTarget)) {\n break;\n }\n }\n\n signals.fire('fired', signalArg);\n\n if (type === 'tap') {\n // if pointerEvent should make a double tap, create and fire a doubletap\n // PointerEvent and use that as the prevTap\n const prevTap = pointerEvent.double\n ? fire({\n interaction, pointer, event, eventTarget,\n type: 'doubletap',\n })\n : pointerEvent;\n\n interaction.prevTap = prevTap;\n interaction.tapTime = prevTap.timeStamp;\n }\n\n return pointerEvent;\n}\n\nfunction collectEventTargets ({ interaction, pointer, event, eventTarget, type }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n // do not fire a tap event if the pointer was moved before being lifted\n if (type === 'tap' && (interaction.pointerWasMoved\n // or if the pointerup target is different to the pointerdown target\n || !(interaction.downTargets[pointerIndex] && interaction.downTargets[pointerIndex] === eventTarget))) {\n return [];\n }\n\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n path,\n targets: [],\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (type === 'hold') {\n signalArg.targets = filter(signalArg.targets, target =>\n target.eventable.options.holdDuration === interaction.holdTimers[pointerIndex].duration);\n }\n\n return signalArg.targets;\n}\n\nInteraction.signals.on('update-pointer-down', function ({ interaction, pointerIndex }) {\n interaction.holdTimers[pointerIndex] = { duration: Infinity, timeout: null };\n});\n\nInteraction.signals.on('remove-pointer', function ({ interaction, pointerIndex }) {\n interaction.holdTimers.splice(pointerIndex, 1);\n});\n\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget, duplicateMove }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n if (!duplicateMove && (!interaction.pointerIsDown || interaction.pointerWasMoved)) {\n if (interaction.pointerIsDown) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n\n fire({\n interaction, pointer, event, eventTarget,\n type: 'move',\n });\n }\n});\n\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget, pointerIndex }) {\n // copy event to be used in timeout for IE8\n const eventCopy = browser.isIE8? utils.extend({}, event) : event;\n\n const timer = interaction.holdTimers[pointerIndex];\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'hold',\n targets: [],\n path,\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (!signalArg.targets.length) { return; }\n\n let minDuration = Infinity;\n\n for (let i = 0; i < signalArg.targets.length; i++) {\n const target = signalArg.targets[i];\n const holdDuration = target.eventable.options.holdDuration;\n\n if (holdDuration < minDuration) {\n minDuration = holdDuration;\n }\n }\n\n timer.duration = minDuration;\n timer.timeout = setTimeout(function () {\n fire({\n interaction,\n eventTarget,\n pointer: browser.isIE8? eventCopy : pointer,\n event: eventCopy,\n type: 'hold',\n });\n }, minDuration);\n});\n\nInteraction.signals.on('up', ({ interaction, pointer, event, eventTarget }) => {\n if (!interaction.pointerWasMoved) {\n fire({ interaction, eventTarget, pointer, event, type: 'tap' });\n }\n});\n\n['up', 'cancel'].forEach(function (signalName) {\n Interaction.signals.on(signalName, function ({ interaction, pointerIndex }) {\n if (interaction.holdTimers[pointerIndex]) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n });\n});\n\nfunction createSignalListener (type) {\n return function ({ interaction, pointer, event, eventTarget }) {\n fire({ interaction, eventTarget, pointer, event, type });\n };\n}\n\nfor (let i = 0; i < simpleSignals.length; i++) {\n Interaction.signals.on(simpleSignals[i], createSignalListener(simpleEvents[i]));\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.prevTap = null; // the most recent tap event on this interaction\n interaction.tapTime = 0; // time of the most recent tap event\n interaction.holdTimers = []; // [{ duration, timeout }]\n});\n\ndefaults.pointerEvents = pointerEvents.defaults;\nmodule.exports = pointerEvents;\n","const pointerEvents = require('./base');\nconst Interaction = require('../Interaction');\n\npointerEvents.signals.on('new', onNew);\npointerEvents.signals.on('fired', onFired);\n\nfor (const signal of ['move', 'up', 'cancel', 'endall']) {\n Interaction.signals.on(signal, endHoldRepeat);\n}\n\nfunction onNew ({ pointerEvent }) {\n if (pointerEvent.type !== 'hold') { return; }\n\n pointerEvent.count = (pointerEvent.count || 0) + 1;\n}\n\nfunction onFired ({ interaction, pointerEvent, eventTarget, targets }) {\n if (pointerEvent.type !== 'hold' || !targets.length) { return; }\n\n // get the repeat interval from the first eventable\n const interval = targets[0].eventable.options.holdRepeatInterval;\n\n // don't repeat if the interval is 0 or less\n if (interval <= 0) { return; }\n\n // set a timeout to fire the holdrepeat event\n interaction.holdIntervalHandle = setTimeout(function () {\n pointerEvents.fire({\n interaction,\n eventTarget,\n type: 'hold',\n pointer: pointerEvent,\n event: pointerEvent,\n });\n }, interval);\n}\n\nfunction endHoldRepeat ({ interaction }) {\n // set the interaction's holdStopTime property\n // to stop further holdRepeat events\n if (interaction.holdIntervalHandle) {\n clearInterval(interaction.holdIntervalHandle);\n interaction.holdIntervalHandle = null;\n }\n}\n\n// don't repeat by default\npointerEvents.defaults.holdRepeatInterval = 0;\npointerEvents.types.push('holdrepeat');\n\nmodule.exports = {\n onNew,\n onFired,\n endHoldRepeat,\n};\n","const pointerEvents = require('./base');\nconst Interactable = require('../Interactable');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\nconst scope = require('../scope');\nconst extend = require('../utils/extend');\nconst { merge } = require('../utils/arr');\n\npointerEvents.signals.on('collect-targets', function ({ targets, element, type, eventTarget }) {\n function collectSelectors (interactable, selector, context) {\n const els = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && is.element(element)\n && domUtils.matchesSelector(element, selector, els)\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n const interactable = scope.interactables.get(element);\n\n if (interactable) {\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n scope.interactables.forEachSelector(collectSelectors, element);\n});\n\nInteractable.signals.on('new', function ({ interactable }) {\n interactable.events.getRect = function (element) {\n return interactable.getRect(element);\n };\n});\n\nInteractable.signals.on('set', function ({ interactable, options }) {\n extend(interactable.events.options, pointerEvents.defaults);\n extend(interactable.events.options, options);\n});\n\nmerge(Interactable.eventTypes, pointerEvents.types);\n\nInteractable.prototype.pointerEvents = function (options) {\n extend(this.events.options, options);\n\n return this;\n};\n\nconst __backCompatOption = Interactable.prototype._backCompatOption;\n\nInteractable.prototype._backCompatOption = function (optionName, newValue) {\n const ret = __backCompatOption.call(this, optionName, newValue);\n\n if (ret === this) {\n this.events.options[optionName] = newValue;\n }\n\n return ret;\n};\n\nInteractable.settingsMethods.push('pointerEvents');\n","const utils = require('./utils');\nconst events = require('./utils/events');\nconst signals = require('./utils/Signals').new();\n\nconst scope = {\n signals,\n events,\n utils,\n\n // main document\n document: require('./utils/domObjects').document,\n // all documents being listened to\n documents: [],\n\n addDocument: function (doc, win) {\n // do nothing if document is already known\n if (utils.contains(scope.documents, doc)) { return false; }\n\n win = win || scope.getWindow(doc);\n\n scope.documents.push(doc);\n events.documents.push(doc);\n\n // don't add an unload event for the main document\n // so that the page may be cached in browser history\n if (doc !== scope.document) {\n events.add(win, 'unload', scope.onWindowUnload);\n }\n\n signals.fire('add-document', { doc, win });\n },\n\n removeDocument: function (doc, win) {\n const index = utils.indexOf(scope.documents, doc);\n\n win = win || scope.getWindow(doc);\n\n events.remove(win, 'unload', scope.onWindowUnload);\n\n scope.documents.splice(index, 1);\n events.documents.splice(index, 1);\n\n signals.fire('remove-document', { win, doc });\n },\n\n onWindowUnload: function () {\n scope.removeDocument(this.document, this);\n },\n};\n\nmodule.exports = scope;\n","const { indexOf } = require('./arr');\n\nclass Signals {\n constructor () {\n this.listeners = {\n // signalName: [listeners],\n };\n }\n\n on (name, listener) {\n if (!this.listeners[name]) {\n this.listeners[name] = [listener];\n return;\n }\n\n this.listeners[name].push(listener);\n }\n\n off (name, listener) {\n if (!this.listeners[name]) { return; }\n\n const index = indexOf(this.listeners[name], listener);\n\n if (index !== -1) {\n this.listeners[name].splice(index, 1);\n }\n }\n\n fire (name, arg) {\n const targetListeners = this.listeners[name];\n\n if (!targetListeners) { return; }\n\n for (let i = 0; i < targetListeners.length; i++) {\n if (targetListeners[i](arg, name) === false) {\n return;\n }\n }\n }\n}\n\nSignals.new = function () {\n return new Signals();\n};\n\nmodule.exports = Signals;\n","function indexOf (array, target) {\n for (let i = 0, len = array.length; i < len; i++) {\n if (array[i] === target) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction contains (array, target) {\n return indexOf(array, target) !== -1;\n}\n\nfunction merge (target, source) {\n for (let i = 0; i < source.length; i++) {\n target.push(source[i]);\n }\n\n return target;\n}\n\nfunction filter (array, test) {\n const result = [];\n\n for (let i = 0; i < array.length; i++) {\n if (test(array[i])) {\n result.push(array[i]);\n }\n }\n\n return result;\n}\n\nmodule.exports = {\n indexOf,\n contains,\n merge,\n filter,\n};\n","const { window } = require('./window');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst Element = domObjects.Element;\nconst navigator = window.navigator;\n\nconst browser = {\n // Does the browser support touch input?\n supportsTouch: !!(('ontouchstart' in window) || is.function(window.DocumentTouch)\n && domObjects.document instanceof window.DocumentTouch),\n\n // Does the browser support PointerEvents\n supportsPointerEvent: !!domObjects.PointerEvent,\n\n isIE8: ('attachEvent' in window) && !('addEventListener' in window),\n\n // Opera Mobile must be handled differently\n isOperaMobile: (navigator.appName === 'Opera'\n && browser.supportsTouch\n && navigator.userAgent.match('Presto')),\n\n // scrolling doesn't change the result of getClientRects on iOS 7\n isIOS7: (/iP(hone|od|ad)/.test(navigator.platform)\n && /OS 7[^\\d]/.test(navigator.appVersion)),\n\n isIe9OrOlder: /MSIE (8|9)/.test(navigator.userAgent),\n\n // prefix matchesSelector\n prefixedMatchesSelector: 'matches' in Element.prototype\n ? 'matches': 'webkitMatchesSelector' in Element.prototype\n ? 'webkitMatchesSelector': 'mozMatchesSelector' in Element.prototype\n ? 'mozMatchesSelector': 'oMatchesSelector' in Element.prototype\n ? 'oMatchesSelector': 'msMatchesSelector',\n\n useMatchesSelectorPolyfill: false,\n\n pEventTypes: (domObjects.PointerEvent\n ? (domObjects.PointerEvent === window.MSPointerEvent\n ? {\n up: 'MSPointerUp',\n down: 'MSPointerDown',\n over: 'mouseover',\n out: 'mouseout',\n move: 'MSPointerMove',\n cancel: 'MSPointerCancel',\n }\n : {\n up: 'pointerup',\n down: 'pointerdown',\n over: 'pointerover',\n out: 'pointerout',\n move: 'pointermove',\n cancel: 'pointercancel',\n })\n : null),\n\n // because Webkit and Opera still use 'mousewheel' event type\n wheelEvent: 'onmousewheel' in domObjects.document? 'mousewheel': 'wheel',\n\n};\n\nbrowser.useMatchesSelectorPolyfill = !is.function(Element.prototype[browser.prefixedMatchesSelector]);\n\nmodule.exports = browser;\n","const domObjects = {};\nconst win = require('./window').window;\n\nfunction blank () {}\n\ndomObjects.document = win.document;\ndomObjects.DocumentFragment = win.DocumentFragment || blank;\ndomObjects.SVGElement = win.SVGElement || blank;\ndomObjects.SVGSVGElement = win.SVGSVGElement || blank;\ndomObjects.SVGElementInstance = win.SVGElementInstance || blank;\ndomObjects.Element = win.Element || blank;\ndomObjects.HTMLElement = win.HTMLElement || domObjects.Element;\n\ndomObjects.Event = win.Event;\ndomObjects.Touch = win.Touch || blank;\ndomObjects.PointerEvent = (win.PointerEvent || win.MSPointerEvent);\n\nmodule.exports = domObjects;\n","const win = require('./window');\nconst browser = require('./browser');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst domUtils = {\n nodeContains: function (parent, child) {\n while (child) {\n if (child === parent) {\n return true;\n }\n\n child = child.parentNode;\n }\n\n return false;\n },\n\n closest: function (element, selector) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) { return element; }\n\n element = domUtils.parentNode(element);\n }\n\n return null;\n },\n\n parentNode: function (node) {\n let parent = node.parentNode;\n\n if (is.docFrag(parent)) {\n // skip past #shado-root fragments\n while ((parent = parent.host) && is.docFrag(parent)) {\n continue;\n }\n\n return parent;\n }\n\n return parent;\n },\n\n // taken from http://tanalin.com/en/blog/2012/12/matches-selector-ie8/ and modified\n matchesSelectorPolyfill: browser.useMatchesSelectorPolyfill\n ? function (element, selector, elems) {\n elems = elems || element.parentNode.querySelectorAll(selector);\n\n for (let i = 0, len = elems.length; i < len; i++) {\n if (elems[i] === element) {\n return true;\n }\n }\n\n return false;\n }\n : null,\n\n matchesSelector: function (element, selector, nodeList) {\n if (browser.useMatchesSelectorPolyfill) {\n return domUtils.matchesSelectorPolyfill(element, selector, nodeList);\n }\n\n // remove /deep/ from selectors if shadowDOM polyfill is used\n if (win.window !== win.realWindow) {\n selector = selector.replace(/\\/deep\\//g, ' ');\n }\n\n return element[browser.prefixedMatchesSelector](selector);\n },\n\n // Test for the element that's \"above\" all other qualifiers\n indexOfDeepestElement: function (elements) {\n let deepestZoneParents = [];\n let dropzoneParents = [];\n let dropzone;\n let deepestZone = elements[0];\n let index = deepestZone? 0: -1;\n let parent;\n let child;\n let i;\n let n;\n\n for (i = 1; i < elements.length; i++) {\n dropzone = elements[i];\n\n // an element might belong to multiple selector dropzones\n if (!dropzone || dropzone === deepestZone) {\n continue;\n }\n\n if (!deepestZone) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n // check if the deepest or current are document.documentElement or document.rootElement\n // - if the current dropzone is, do nothing and continue\n if (dropzone.parentNode === dropzone.ownerDocument) {\n continue;\n }\n // - if deepest is, update with the current dropzone and continue to next\n else if (deepestZone.parentNode === dropzone.ownerDocument) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n if (!deepestZoneParents.length) {\n parent = deepestZone;\n while (parent.parentNode && parent.parentNode !== parent.ownerDocument) {\n deepestZoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n }\n\n // if this element is an svg element and the current deepest is\n // an HTMLElement\n if (deepestZone instanceof domObjects.HTMLElement\n && dropzone instanceof domObjects.SVGElement\n && !(dropzone instanceof domObjects.SVGSVGElement)) {\n\n if (dropzone === deepestZone.parentNode) {\n continue;\n }\n\n parent = dropzone.ownerSVGElement;\n }\n else {\n parent = dropzone;\n }\n\n dropzoneParents = [];\n\n while (parent.parentNode !== parent.ownerDocument) {\n dropzoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n\n n = 0;\n\n // get (position of last common ancestor) + 1\n while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) {\n n++;\n }\n\n const parents = [\n dropzoneParents[n - 1],\n dropzoneParents[n],\n deepestZoneParents[n],\n ];\n\n child = parents[0].lastChild;\n\n while (child) {\n if (child === parents[1]) {\n deepestZone = dropzone;\n index = i;\n deepestZoneParents = [];\n\n break;\n }\n else if (child === parents[2]) {\n break;\n }\n\n child = child.previousSibling;\n }\n }\n\n return index;\n },\n\n matchesUpTo: function (element, selector, limit) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) {\n return true;\n }\n\n element = domUtils.parentNode(element);\n\n if (element === limit) {\n return domUtils.matchesSelector(element, selector);\n }\n }\n\n return false;\n },\n\n getActualElement: function (element) {\n return (element instanceof domObjects.SVGElementInstance\n ? element.correspondingUseElement\n : element);\n },\n\n getScrollXY: function (relevantWindow) {\n relevantWindow = relevantWindow || win.window;\n return {\n x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft,\n y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop,\n };\n },\n\n getElementClientRect: function (element) {\n const clientRect = (element instanceof domObjects.SVGElement\n ? element.getBoundingClientRect()\n : element.getClientRects()[0]);\n\n return clientRect && {\n left : clientRect.left,\n right : clientRect.right,\n top : clientRect.top,\n bottom: clientRect.bottom,\n width : clientRect.width || clientRect.right - clientRect.left,\n height: clientRect.height || clientRect.bottom - clientRect.top,\n };\n },\n\n getElementRect: function (element) {\n const clientRect = domUtils.getElementClientRect(element);\n\n if (!browser.isIOS7 && clientRect) {\n const scroll = domUtils.getScrollXY(win.getWindow(element));\n\n clientRect.left += scroll.x;\n clientRect.right += scroll.x;\n clientRect.top += scroll.y;\n clientRect.bottom += scroll.y;\n }\n\n return clientRect;\n },\n\n getPath: function (element) {\n const path = [];\n\n while (element) {\n path.push(element);\n element = domUtils.parentNode(element);\n }\n\n return path;\n },\n\n trySelector: value => {\n if (!is.string(value)) { return false; }\n\n // an exception will be raised if it is invalid\n domObjects.document.querySelector(value);\n return true;\n },\n};\n\nmodule.exports = domUtils;\n","const is = require('./is');\nconst domUtils = require('./domUtils');\nconst pExtend = require('./pointerExtend');\n\nconst { window, getWindow } = require('./window');\nconst { indexOf, contains } = require('./arr');\n\nconst useAttachEvent = ('attachEvent' in window) && !('addEventListener' in window);\nconst addEvent = useAttachEvent? 'attachEvent': 'addEventListener';\nconst removeEvent = useAttachEvent? 'detachEvent': 'removeEventListener';\nconst on = useAttachEvent? 'on': '';\n\nconst elements = [];\nconst targets = [];\nconst attachedListeners = [];\n\n// {\n// type: {\n// selectors: ['selector', ...],\n// contexts : [document, ...],\n// listeners: [[listener, capture, passive], ...]\n// }\n// }\nconst delegatedEvents = {};\n\nconst documents = [];\n\nconst supportsOptions = !useAttachEvent && (() => {\n let supported = false;\n\n window.document.createElement('div').addEventListener('test', null, {\n get capture () { supported = true; },\n });\n\n return supported;\n})();\n\nfunction add (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n let elementIndex = indexOf(elements, element);\n let target = targets[elementIndex];\n\n if (!target) {\n target = {\n events: {},\n typeCount: 0,\n };\n\n elementIndex = elements.push(element) - 1;\n targets.push(target);\n\n attachedListeners.push(useAttachEvent\n ? {\n supplied: [],\n wrapped : [],\n useCount: [],\n }\n : null);\n }\n\n if (!target.events[type]) {\n target.events[type] = [];\n target.typeCount++;\n }\n\n if (!contains(target.events[type], listener)) {\n let ret;\n\n if (useAttachEvent) {\n const { supplied, wrapped, useCount } = attachedListeners[elementIndex];\n const listenerIndex = indexOf(supplied, listener);\n\n const wrappedListener = wrapped[listenerIndex] || function (event) {\n if (!event.immediatePropagationStopped) {\n event.target = event.srcElement;\n event.currentTarget = element;\n\n event.preventDefault = event.preventDefault || preventDef;\n event.stopPropagation = event.stopPropagation || stopProp;\n event.stopImmediatePropagation = event.stopImmediatePropagation || stopImmProp;\n\n if (/mouse|click/.test(event.type)) {\n event.pageX = event.clientX + getWindow(element).document.documentElement.scrollLeft;\n event.pageY = event.clientY + getWindow(element).document.documentElement.scrollTop;\n }\n\n listener(event);\n }\n };\n\n ret = element[addEvent](on + type, wrappedListener, !!options.capture);\n\n if (listenerIndex === -1) {\n supplied.push(listener);\n wrapped.push(wrappedListener);\n useCount.push(1);\n }\n else {\n useCount[listenerIndex]++;\n }\n }\n else {\n ret = element[addEvent](type, listener, supportsOptions? options : !!options.capture);\n }\n target.events[type].push(listener);\n\n return ret;\n }\n}\n\nfunction remove (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const elementIndex = indexOf(elements, element);\n const target = targets[elementIndex];\n\n if (!target || !target.events) {\n return;\n }\n\n let wrappedListener = listener;\n let listeners;\n let listenerIndex;\n\n if (useAttachEvent) {\n listeners = attachedListeners[elementIndex];\n listenerIndex = indexOf(listeners.supplied, listener);\n wrappedListener = listeners.wrapped[listenerIndex];\n }\n\n if (type === 'all') {\n for (type in target.events) {\n if (target.events.hasOwnProperty(type)) {\n remove(element, type, 'all');\n }\n }\n return;\n }\n\n if (target.events[type]) {\n const len = target.events[type].length;\n\n if (listener === 'all') {\n for (let i = 0; i < len; i++) {\n remove(element, type, target.events[type][i], options);\n }\n return;\n }\n else {\n for (let i = 0; i < len; i++) {\n if (target.events[type][i] === listener) {\n element[removeEvent](on + type, wrappedListener, supportsOptions? options : !!options.capture);\n target.events[type].splice(i, 1);\n\n if (useAttachEvent && listeners) {\n listeners.useCount[listenerIndex]--;\n if (listeners.useCount[listenerIndex] === 0) {\n listeners.supplied.splice(listenerIndex, 1);\n listeners.wrapped.splice(listenerIndex, 1);\n listeners.useCount.splice(listenerIndex, 1);\n }\n }\n\n break;\n }\n }\n }\n\n if (target.events[type] && target.events[type].length === 0) {\n target.events[type] = null;\n target.typeCount--;\n }\n }\n\n if (!target.typeCount) {\n targets.splice(elementIndex, 1);\n elements.splice(elementIndex, 1);\n attachedListeners.splice(elementIndex, 1);\n }\n}\n\nfunction addDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n if (!delegatedEvents[type]) {\n delegatedEvents[type] = {\n selectors: [],\n contexts : [],\n listeners: [],\n };\n\n // add delegate listener functions\n for (let i = 0; i < documents.length; i++) {\n add(documents[i], type, delegateListener);\n add(documents[i], type, delegateUseCapture, true);\n }\n }\n\n const delegated = delegatedEvents[type];\n let index;\n\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n break;\n }\n }\n\n if (index === -1) {\n index = delegated.selectors.length;\n\n delegated.selectors.push(selector);\n delegated.contexts .push(context);\n delegated.listeners.push([]);\n }\n\n // keep listener and capture and passive flags\n delegated.listeners[index].push([listener, !!options.capture, options.passive]);\n}\n\nfunction removeDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const delegated = delegatedEvents[type];\n let matchFound = false;\n let index;\n\n if (!delegated) { return; }\n\n // count from last index of delegated to 0\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n // look for matching selector and context Node\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n\n const listeners = delegated.listeners[index];\n\n // each item of the listeners array is an array: [function, capture, passive]\n for (let i = listeners.length - 1; i >= 0; i--) {\n const [fn, capture, passive] = listeners[i];\n\n // check if the listener functions and capture and passive flags match\n if (fn === listener && capture === !!options.capture && passive === options.passive) {\n // remove the listener from the array of listeners\n listeners.splice(i, 1);\n\n // if all listeners for this interactable have been removed\n // remove the interactable from the delegated arrays\n if (!listeners.length) {\n delegated.selectors.splice(index, 1);\n delegated.contexts .splice(index, 1);\n delegated.listeners.splice(index, 1);\n\n // remove delegate function from context\n remove(context, type, delegateListener);\n remove(context, type, delegateUseCapture, true);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegatedEvents[type] = null;\n }\n }\n\n // only remove one listener\n matchFound = true;\n break;\n }\n }\n\n if (matchFound) { break; }\n }\n }\n}\n\n// bound to the interactable context when a DOM event\n// listener is added to a selector interactable\nfunction delegateListener (event, optionalArg) {\n const options = getOptions(optionalArg);\n const fakeEvent = {};\n const delegated = delegatedEvents[event.type];\n const eventTarget = (domUtils.getActualElement(event.path\n ? event.path[0]\n : event.target));\n let element = eventTarget;\n\n // duplicate the event so that currentTarget can be changed\n pExtend(fakeEvent, event);\n\n fakeEvent.originalEvent = event;\n fakeEvent.preventDefault = preventOriginalDefault;\n\n // climb up document tree looking for selector matches\n while (is.element(element)) {\n for (let i = 0; i < delegated.selectors.length; i++) {\n const selector = delegated.selectors[i];\n const context = delegated.contexts[i];\n\n if (domUtils.matchesSelector(element, selector)\n && domUtils.nodeContains(context, eventTarget)\n && domUtils.nodeContains(context, element)) {\n\n const listeners = delegated.listeners[i];\n\n fakeEvent.currentTarget = element;\n\n for (let j = 0; j < listeners.length; j++) {\n const [fn, capture, passive] = listeners[j];\n\n if (capture === !!options.capture && passive === options.passive) {\n fn(fakeEvent);\n }\n }\n }\n }\n\n element = domUtils.parentNode(element);\n }\n}\n\nfunction delegateUseCapture (event) {\n return delegateListener.call(this, event, true);\n}\n\nfunction preventDef () {\n this.returnValue = false;\n}\n\nfunction preventOriginalDefault () {\n this.originalEvent.preventDefault();\n}\n\nfunction stopProp () {\n this.cancelBubble = true;\n}\n\nfunction stopImmProp () {\n this.cancelBubble = true;\n this.immediatePropagationStopped = true;\n}\n\nfunction getOptions (param) {\n return is.object(param)? param : { capture: param };\n}\n\nmodule.exports = {\n add,\n remove,\n\n addDelegate,\n removeDelegate,\n\n delegateListener,\n delegateUseCapture,\n delegatedEvents,\n documents,\n\n useAttachEvent,\n supportsOptions,\n\n _elements: elements,\n _targets: targets,\n _attachedListeners: attachedListeners,\n};\n","module.exports = function extend (dest, source) {\n for (const prop in source) {\n dest[prop] = source[prop];\n }\n return dest;\n};\n","const {\n resolveRectLike,\n rectToXY,\n} = require('./rect');\n\nmodule.exports = function (target, element, action) {\n const actionOptions = target.options[action];\n const actionOrigin = actionOptions && actionOptions.origin;\n const origin = actionOrigin || target.options.origin;\n\n const originRect = resolveRectLike(origin, target, element, [target && element]);\n\n return rectToXY(originRect) || { x: 0, y: 0 };\n};\n","module.exports = (x, y) => Math.sqrt(x * x + y * y);\n","const extend = require('./extend');\nconst win = require('./window');\n\nconst utils = {\n warnOnce: function (method, message) {\n let warned = false;\n\n return function () {\n if (!warned) {\n win.window.console.warn(message);\n warned = true;\n }\n\n return method.apply(this, arguments);\n };\n },\n\n // http://stackoverflow.com/a/5634528/2280888\n _getQBezierValue: function (t, p1, p2, p3) {\n const iT = 1 - t;\n return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3;\n },\n\n getQuadraticCurvePoint: function (startX, startY, cpX, cpY, endX, endY, position) {\n return {\n x: utils._getQBezierValue(position, startX, cpX, endX),\n y: utils._getQBezierValue(position, startY, cpY, endY),\n };\n },\n\n // http://gizma.com/easing/\n easeOutQuad: function (t, b, c, d) {\n t /= d;\n return -c * t*(t-2) + b;\n },\n\n copyAction: function (dest, src) {\n dest.name = src.name;\n dest.axis = src.axis;\n dest.edges = src.edges;\n\n return dest;\n },\n\n is : require('./is'),\n extend : extend,\n hypot : require('./hypot'),\n getOriginXY: require('./getOriginXY'),\n};\n\nextend(utils, require('./arr'));\nextend(utils, require('./domUtils'));\nextend(utils, require('./pointerUtils'));\nextend(utils, require('./rect'));\n\nmodule.exports = utils;\n","const scope = require('../scope');\nconst utils = require('./index');\n\nconst finder = {\n methodOrder: [ 'simulationResume', 'mouseOrPen', 'hasPointer', 'idle' ],\n\n search: function (pointer, eventType, eventTarget) {\n const pointerType = utils.getPointerType(pointer);\n const pointerId = utils.getPointerId(pointer);\n const details = { pointer, pointerId, pointerType, eventType, eventTarget };\n\n for (const method of finder.methodOrder) {\n const interaction = finder[method](details);\n\n if (interaction) {\n return interaction;\n }\n }\n },\n\n // try to resume simulation with a new pointer\n simulationResume: function ({ pointerType, eventType, eventTarget }) {\n if (!/down|start/i.test(eventType)) {\n return null;\n }\n\n for (const interaction of scope.interactions) {\n let element = eventTarget;\n\n if (interaction.simulation && interaction.simulation.allowResume\n && (interaction.pointerType === pointerType)) {\n while (element) {\n // if the element is the interaction element\n if (element === interaction.element) {\n return interaction;\n }\n element = utils.parentNode(element);\n }\n }\n }\n\n return null;\n },\n\n // if it's a mouse or pen interaction\n mouseOrPen: function ({ pointerId, pointerType, eventType }) {\n if (pointerType !== 'mouse' && pointerType !== 'pen') {\n return null;\n }\n\n let firstNonActive;\n\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType) {\n // if it's a down event, skip interactions with running simulations\n if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; }\n\n // if the interaction is active, return it immediately\n if (interaction.interacting()) {\n return interaction;\n }\n // otherwise save it and look for another active interaction\n else if (!firstNonActive) {\n firstNonActive = interaction;\n }\n }\n }\n\n // if no active mouse interaction was found use the first inactive mouse\n // interaction\n if (firstNonActive) {\n return firstNonActive;\n }\n\n // find any mouse or pen interaction.\n // ignore the interaction if the eventType is a *down, and a simulation\n // is active\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType && !(/down/i.test(eventType) && interaction.simulation)) {\n return interaction;\n }\n }\n\n return null;\n },\n\n // get interaction that has this pointer\n hasPointer: function ({ pointerId }) {\n for (const interaction of scope.interactions) {\n if (utils.contains(interaction.pointerIds, pointerId)) {\n return interaction;\n }\n }\n },\n\n // get first idle interaction with a matching pointerType\n idle: function ({ pointerType }) {\n for (const interaction of scope.interactions) {\n // if there's already a pointer held down\n if (interaction.pointerIds.length === 1) {\n const target = interaction.target;\n // don't add this pointer if there is a target interactable and it\n // isn't gesturable\n if (target && !target.options.gesture.enabled) {\n continue;\n }\n }\n // maximum of 2 pointers per interaction\n else if (interaction.pointerIds.length >= 2) {\n continue;\n }\n\n if (!interaction.interacting() && (pointerType === interaction.pointerType)) {\n return interaction;\n }\n }\n\n return null;\n },\n};\n\nmodule.exports = finder;\n","const win = require('./window');\nconst isWindow = require('./isWindow');\n\nconst is = {\n array : () => {},\n\n window : thing => thing === win.window || isWindow(thing),\n\n docFrag : thing => is.object(thing) && thing.nodeType === 11,\n\n object : thing => !!thing && (typeof thing === 'object'),\n\n function: thing => typeof thing === 'function',\n\n number : thing => typeof thing === 'number' ,\n\n bool : thing => typeof thing === 'boolean' ,\n\n string : thing => typeof thing === 'string' ,\n\n element: thing => {\n if (!thing || (typeof thing !== 'object')) { return false; }\n\n const _window = win.getWindow(thing) || win.window;\n\n return (/object|function/.test(typeof _window.Element)\n ? thing instanceof _window.Element //DOM2\n : thing.nodeType === 1 && typeof thing.nodeName === 'string');\n },\n};\n\nis.array = thing => (is.object(thing)\n && (typeof thing.length !== 'undefined')\n && is.function(thing.splice));\n\nmodule.exports = is;\n","module.exports = (thing) => !!(thing && thing.Window) && (thing instanceof thing.Window);\n","function pointerExtend (dest, source) {\n for (const prop in source) {\n const prefixedPropREs = module.exports.prefixedPropREs;\n let deprecated = false;\n\n // skip deprecated prefixed properties\n for (const vendor in prefixedPropREs) {\n if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) {\n deprecated = true;\n break;\n }\n }\n\n if (!deprecated && typeof source[prop] !== 'function') {\n dest[prop] = source[prop];\n }\n }\n return dest;\n}\n\npointerExtend.prefixedPropREs = {\n webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/,\n};\n\nmodule.exports = pointerExtend;\n","const hypot = require('./hypot');\nconst browser = require('./browser');\nconst dom = require('./domObjects');\nconst domUtils = require('./domUtils');\nconst domObjects = require('./domObjects');\nconst is = require('./is');\nconst pointerExtend = require('./pointerExtend');\n\nconst pointerUtils = {\n copyCoords: function (dest, src) {\n dest.page = dest.page || {};\n dest.page.x = src.page.x;\n dest.page.y = src.page.y;\n\n dest.client = dest.client || {};\n dest.client.x = src.client.x;\n dest.client.y = src.client.y;\n\n dest.timeStamp = src.timeStamp;\n },\n\n setCoordDeltas: function (targetObj, prev, cur) {\n targetObj.page.x = cur.page.x - prev.page.x;\n targetObj.page.y = cur.page.y - prev.page.y;\n targetObj.client.x = cur.client.x - prev.client.x;\n targetObj.client.y = cur.client.y - prev.client.y;\n targetObj.timeStamp = cur.timeStamp - prev.timeStamp;\n\n // set pointer velocity\n const dt = Math.max(targetObj.timeStamp / 1000, 0.001);\n\n targetObj.page.speed = hypot(targetObj.page.x, targetObj.page.y) / dt;\n targetObj.page.vx = targetObj.page.x / dt;\n targetObj.page.vy = targetObj.page.y / dt;\n\n targetObj.client.speed = hypot(targetObj.client.x, targetObj.page.y) / dt;\n targetObj.client.vx = targetObj.client.x / dt;\n targetObj.client.vy = targetObj.client.y / dt;\n },\n\n isNativePointer: function (pointer) {\n return (pointer instanceof dom.Event || pointer instanceof dom.Touch);\n },\n\n // Get specified X/Y coords for mouse or event.touches[0]\n getXY: function (type, pointer, xy) {\n xy = xy || {};\n type = type || 'page';\n\n xy.x = pointer[type + 'X'];\n xy.y = pointer[type + 'Y'];\n\n return xy;\n },\n\n getPageXY: function (pointer, page) {\n page = page || {};\n\n // Opera Mobile handles the viewport and scrolling oddly\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n pointerUtils.getXY('screen', pointer, page);\n\n page.x += window.scrollX;\n page.y += window.scrollY;\n }\n else {\n pointerUtils.getXY('page', pointer, page);\n }\n\n return page;\n },\n\n getClientXY: function (pointer, client) {\n client = client || {};\n\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n // Opera Mobile handles the viewport and scrolling oddly\n pointerUtils.getXY('screen', pointer, client);\n }\n else {\n pointerUtils.getXY('client', pointer, client);\n }\n\n return client;\n },\n\n getPointerId: function (pointer) {\n return is.number(pointer.pointerId)? pointer.pointerId : pointer.identifier;\n },\n\n setCoords: function (targetObj, pointers, timeStamp) {\n const pointer = (pointers.length > 1\n ? pointerUtils.pointerAverage(pointers)\n : pointers[0]);\n\n const tmpXY = {};\n\n pointerUtils.getPageXY(pointer, tmpXY);\n targetObj.page.x = tmpXY.x;\n targetObj.page.y = tmpXY.y;\n\n pointerUtils.getClientXY(pointer, tmpXY);\n targetObj.client.x = tmpXY.x;\n targetObj.client.y = tmpXY.y;\n\n targetObj.timeStamp = is.number(timeStamp) ? timeStamp :new Date().getTime();\n },\n\n pointerExtend: pointerExtend,\n\n getTouchPair: function (event) {\n const touches = [];\n\n // array of touches is supplied\n if (is.array(event)) {\n touches[0] = event[0];\n touches[1] = event[1];\n }\n // an event\n else {\n if (event.type === 'touchend') {\n if (event.touches.length === 1) {\n touches[0] = event.touches[0];\n touches[1] = event.changedTouches[0];\n }\n else if (event.touches.length === 0) {\n touches[0] = event.changedTouches[0];\n touches[1] = event.changedTouches[1];\n }\n }\n else {\n touches[0] = event.touches[0];\n touches[1] = event.touches[1];\n }\n }\n\n return touches;\n },\n\n pointerAverage: function (pointers) {\n const average = {\n pageX : 0,\n pageY : 0,\n clientX: 0,\n clientY: 0,\n screenX: 0,\n screenY: 0,\n };\n\n for (const pointer of pointers) {\n for (const prop in average) {\n average[prop] += pointer[prop];\n }\n }\n for (const prop in average) {\n average[prop] /= pointers.length;\n }\n\n return average;\n },\n\n touchBBox: function (event) {\n if (!event.length && !(event.touches && event.touches.length > 1)) {\n return;\n }\n\n const touches = pointerUtils.getTouchPair(event);\n const minX = Math.min(touches[0].pageX, touches[1].pageX);\n const minY = Math.min(touches[0].pageY, touches[1].pageY);\n const maxX = Math.max(touches[0].pageX, touches[1].pageX);\n const maxY = Math.max(touches[0].pageY, touches[1].pageY);\n\n return {\n x: minX,\n y: minY,\n left: minX,\n top: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n },\n\n touchDistance: function (event, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n\n\n const dx = touches[0][sourceX] - touches[1][sourceX];\n const dy = touches[0][sourceY] - touches[1][sourceY];\n\n return hypot(dx, dy);\n },\n\n touchAngle: function (event, prevAngle, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n const dx = touches[1][sourceX] - touches[0][sourceX];\n const dy = touches[1][sourceY] - touches[0][sourceY];\n const angle = 180 * Math.atan2(dy , dx) / Math.PI;\n\n return angle;\n },\n\n getPointerType: function (pointer) {\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : is.number(pointer.pointerType)\n ? [undefined, undefined,'touch', 'pen', 'mouse'][pointer.pointerType]\n // if the PointerEvent API isn't available, then the \"pointer\" must\n // be either a MouseEvent, TouchEvent, or Touch object\n : /touch/.test(pointer.type) || pointer instanceof domObjects.Touch\n ? 'touch'\n : 'mouse';\n },\n\n // [ event.target, event.currentTarget ]\n getEventTargets: function (event) {\n return [\n domUtils.getActualElement(event.path ? event.path[0] : event.target),\n domUtils.getActualElement(event.currentTarget),\n ];\n },\n};\n\nmodule.exports = pointerUtils;\n","const { window } = require('./window');\n\nconst vendors = ['ms', 'moz', 'webkit', 'o'];\nlet lastTime = 0;\nlet request;\nlet cancel;\n\nfor (let x = 0; x < vendors.length && !window.requestAnimationFrame; x++) {\n request = window[vendors[x] + 'RequestAnimationFrame'];\n cancel = window[vendors[x] +'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n}\n\nif (!request) {\n request = function (callback) {\n const currTime = new Date().getTime();\n const timeToCall = Math.max(0, 16 - (currTime - lastTime));\n const id = setTimeout(function () { callback(currTime + timeToCall); },\n timeToCall);\n\n lastTime = currTime + timeToCall;\n return id;\n };\n}\n\nif (!cancel) {\n cancel = function (id) {\n clearTimeout(id);\n };\n}\n\nmodule.exports = {\n request,\n cancel,\n};\n","const extend = require('./extend');\nconst is = require('./is');\nconst {\n closest,\n parentNode,\n getElementRect,\n} = require('./domUtils');\n\nconst rectUtils = {\n getStringOptionResult: function (value, interactable, element) {\n if (!is.string(value)) {\n return null;\n }\n\n if (value === 'parent') {\n value = parentNode(element);\n }\n else if (value === 'self') {\n value = interactable.getRect(element);\n }\n else {\n value = closest(element, value);\n }\n\n return value;\n },\n\n resolveRectLike: function (value, interactable, element, functionArgs) {\n value = rectUtils.getStringOptionResult(value, interactable, element) || value;\n\n if (is.function(value)) {\n value = value.apply(null, functionArgs);\n }\n\n if (is.element(value)) {\n value = getElementRect(value);\n }\n\n return value;\n },\n\n rectToXY: function (rect) {\n return rect && {\n x: 'x' in rect ? rect.x : rect.left,\n y: 'y' in rect ? rect.y : rect.top,\n };\n },\n\n xywhToTlbr: function (rect) {\n if (rect && !('left' in rect && 'top' in rect)) {\n rect = extend({}, rect);\n\n rect.left = rect.x || 0;\n rect.top = rect.y || 0;\n rect.right = rect.right || (rect.left + rect.width);\n rect.bottom = rect.bottom || (rect.top + rect.height);\n }\n\n return rect;\n },\n\n tlbrToXywh: function (rect) {\n if (rect && !('x' in rect && 'y' in rect)) {\n rect = extend({}, rect);\n\n rect.x = rect.left || 0;\n rect.top = rect.top || 0;\n rect.width = rect.width || (rect.right - rect.x);\n rect.height = rect.height || (rect.bottom - rect.y);\n }\n\n return rect;\n },\n};\n\nmodule.exports = rectUtils;\n","const win = module.exports;\nconst isWindow = require('./isWindow');\n\nfunction init (window) {\n // get wrapped window if using Shadow DOM polyfill\n\n win.realWindow = window;\n\n // create a TextNode\n const el = window.document.createTextNode('');\n\n // check if it's wrapped by a polyfill\n if (el.ownerDocument !== window.document\n && typeof window.wrap === 'function'\n && window.wrap(el) === el) {\n // use wrapped window\n window = window.wrap(window);\n }\n\n win.window = window;\n}\n\nif (typeof window === 'undefined') {\n win.window = undefined;\n win.realWindow = undefined;\n}\nelse {\n init(window);\n}\n\nwin.getWindow = function getWindow (node) {\n if (isWindow(node)) {\n return node;\n }\n\n const rootNode = (node.ownerDocument || node);\n\n return rootNode.defaultView || rootNode.parentWindow || win.window;\n};\n\nwin.init = init;\n"]} \ No newline at end of file diff --git a/package.json b/package.json index 76f3e9969..f39704e99 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "interactjs", - "version": "1.3.0-alpha.3+sha.9595c40", + "version": "1.3.0-alpha.4+sha.7970416", "repository": { "type": "git", "url": "https://github.com/taye/interact.js.git"
- Interactable.preventDefault([newValue])⚓➭ + Interactable.preventDefault([newValue])⚓➭ @@ -1718,7 +1718,7 @@ Parameters - interact(element)⚓➭ + interact(element)⚓➭ @@ -1821,7 +1821,7 @@ Usage - interact.isSet(element)⚓➭ + interact.isSet(element)⚓➭ @@ -1881,7 +1881,7 @@ Parameters - interact.on(type, listener, [options])⚓➭ + interact.on(type, listener, [options])⚓➭ @@ -1948,7 +1948,7 @@ Parameters - interact.off(type, listener, [options])⚓➭ + interact.off(type, listener, [options])⚓➭ @@ -2014,7 +2014,7 @@ Parameters - interact.debug()⚓➭ + interact.debug()⚓➭ @@ -2056,7 +2056,7 @@ interact.debug() - interact.supportsTouch()⚓➭ + interact.supportsTouch()⚓➭ @@ -2097,7 +2097,7 @@ interact.supportsTouch() - interact.supportsPointerEvent()⚓➭ + interact.supportsPointerEvent()⚓➭ @@ -2138,7 +2138,7 @@ interact.supportsPointerEvent() - interact.stop(event)⚓➭ + interact.stop(event)⚓➭ @@ -2198,7 +2198,7 @@ Parameters - interact.pointerMoveTolerance([newValue])⚓➭ + interact.pointerMoveTolerance([newValue])⚓➭ @@ -2261,7 +2261,7 @@ Parameters - Interaction.start(action, target, element)⚓➭ + Interaction.start(action, target, element)⚓➭ @@ -2356,7 +2356,7 @@ Parameters - Interaction.doMove()⚓➭ + Interaction.doMove()⚓➭ @@ -2403,7 +2403,7 @@ Interaction.doMove() - Interaction.end([event])⚓➭ + Interaction.end([event])⚓➭ diff --git a/dist/interact.js b/dist/interact.js index e8ae35c3b..c78a3c751 100644 --- a/dist/interact.js +++ b/dist/interact.js @@ -1,5 +1,5 @@ /** - * interact.js v1.3.0-alpha.3+sha.9595c40 + * interact.js v1.3.0-alpha.4+sha.7970416-dirty * * Copyright (c) 2012-2017 Taye Adeyemi * Open source under the MIT License. @@ -816,6 +816,7 @@ var scope = require('./scope'); var utils = require('./utils'); var events = require('./utils/events'); var browser = require('./utils/browser'); +var domObjects = require('./utils/domObjects'); var finder = require('./utils/interactionFinder'); var signals = require('./utils/Signals').new(); @@ -829,7 +830,9 @@ var prevTouchTime = 0; scope.interactions = []; var Interaction = function () { - function Interaction() { + function Interaction(_ref) { + var pointerType = _ref.pointerType; + _classCallCheck(this, Interaction); this.target = null; // current interactable being interacted with @@ -886,7 +889,7 @@ var Interaction = function () { this.pointerWasMoved = false; this._interacting = false; - this.mouse = false; + this.pointerType = pointerType; signals.fire('new', this); @@ -1130,6 +1133,11 @@ var Interaction = function () { }; Interaction.prototype.getPointerIndex = function getPointerIndex(pointer) { + // mouse and pen interactions may have only one pointer + if (this.pointerType === 'mouse' || this.pointerType === 'pen') { + return 0; + } + return utils.indexOf(this.pointerIds, utils.getPointerId(pointer)); }; @@ -1161,8 +1169,7 @@ var Interaction = function () { }; Interaction.prototype.removePointer = function removePointer(pointer, event) { - var id = utils.getPointerId(pointer); - var index = this.mouse ? 0 : utils.indexOf(this.pointerIds, id); + var index = this.getPointerIndex(pointer); if (index === -1) { return; @@ -1197,6 +1204,8 @@ for (var i = 0, len = methodNames.length; i < len; i++) { function doOnInteractions(method) { return function (event) { + var pointerType = utils.getPointerType(event); + var _utils$getEventTarget = utils.getEventTargets(event), eventTarget = _utils$getEventTarget[0], curEventTarget = _utils$getEventTarget[1]; @@ -1210,7 +1219,7 @@ function doOnInteractions(method) { var pointer = event.changedTouches[_i]; var interaction = finder.search(pointer, event.type, eventTarget); - matches.push([pointer, interaction || new Interaction()]); + matches.push([pointer, interaction || new Interaction({ pointerType: pointerType })]); } } else { var invalidPointer = false; @@ -1218,7 +1227,7 @@ function doOnInteractions(method) { if (!browser.supportsPointerEvent && /mouse/.test(event.type)) { // ignore mouse events while touch interactions are active for (var _i2 = 0; _i2 < scope.interactions.length && !invalidPointer; _i2++) { - invalidPointer = !scope.interactions[_i2].mouse && scope.interactions[_i2].pointerIsDown; + invalidPointer = scope.interactions[_i2].pointerType !== 'mouse' && scope.interactions[_i2].pointerIsDown; } // try to ignore mouse events that are simulated by the browser @@ -1232,11 +1241,7 @@ function doOnInteractions(method) { var _interaction = finder.search(event, event.type, eventTarget); if (!_interaction) { - - _interaction = new Interaction(); - _interaction.mouse = /mouse/i.test(event.pointerType || event.type) - // MSPointerEvent.MSPOINTER_TYPE_MOUSE - || event.pointerType === 4 || !event.pointerType; + _interaction = new Interaction({ pointerType: pointerType }); } matches.push([event, _interaction]); @@ -1244,20 +1249,20 @@ function doOnInteractions(method) { } for (var _iterator = matches, _isArray = Array.isArray(_iterator), _i3 = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { - var _ref; + var _ref2; if (_isArray) { if (_i3 >= _iterator.length) break; - _ref = _iterator[_i3++]; + _ref2 = _iterator[_i3++]; } else { _i3 = _iterator.next(); if (_i3.done) break; - _ref = _i3.value; + _ref2 = _i3.value; } - var _ref2 = _ref, - _pointer = _ref2[0], - _interaction2 = _ref2[1]; + var _ref3 = _ref2, + _pointer = _ref3[0], + _interaction2 = _ref3[1]; _interaction2._updateEventTargets(eventTarget, curEventTarget); _interaction2[method](_pointer, event, eventTarget, curEventTarget); @@ -1277,7 +1282,7 @@ function endAll(event) { var docEvents = {/* 'eventType': listenerFunc */}; var pEventTypes = browser.pEventTypes; -if (scope.PointerEvent) { +if (domObjects.PointerEvent) { docEvents[pEventTypes.down] = listeners.pointerDown; docEvents[pEventTypes.move] = listeners.pointerMove; docEvents[pEventTypes.up] = listeners.pointerUp; @@ -1295,8 +1300,8 @@ if (scope.PointerEvent) { docEvents.blur = endAll; -function onDocSignal(_ref3, signalName) { - var doc = _ref3.doc; +function onDocSignal(_ref4, signalName) { + var doc = _ref4.doc; var eventMethod = signalName.indexOf('add') === 0 ? events.add : events.remove; @@ -1311,14 +1316,14 @@ function onDocSignal(_ref3, signalName) { } } -signals.on('update-pointer-down', function (_ref4) { - var interaction = _ref4.interaction, - pointer = _ref4.pointer, - pointerId = _ref4.pointerId, - pointerIndex = _ref4.pointerIndex, - event = _ref4.event, - eventTarget = _ref4.eventTarget, - down = _ref4.down; +signals.on('update-pointer-down', function (_ref5) { + var interaction = _ref5.interaction, + pointer = _ref5.pointer, + pointerId = _ref5.pointerId, + pointerIndex = _ref5.pointerIndex, + event = _ref5.event, + eventTarget = _ref5.eventTarget, + down = _ref5.down; interaction.pointerIds[pointerIndex] = pointerId; interaction.pointers[pointerIndex] = pointer; @@ -1355,7 +1360,7 @@ scope.endAllInteractions = endAll; module.exports = Interaction; -},{"./scope":34,"./utils":44,"./utils/Signals":35,"./utils/browser":37,"./utils/events":40,"./utils/interactionFinder":45}],6:[function(require,module,exports){ +},{"./scope":34,"./utils":44,"./utils/Signals":35,"./utils/browser":37,"./utils/domObjects":38,"./utils/events":40,"./utils/interactionFinder":45}],6:[function(require,module,exports){ 'use strict'; var Interaction = require('../Interaction'); @@ -5460,7 +5465,7 @@ module.exports = function () { this.originalEvent = event; this.type = type; this.pointerId = pointerUtils.getPointerId(pointer); - this.pointerType = pointerUtils.getPointerType(pointer, interaction); + this.pointerType = pointerUtils.getPointerType(pointer); this.target = eventTarget; this.currentTarget = null; @@ -5758,8 +5763,10 @@ Interaction.signals.on('down', function (_ref6) { timer.duration = minDuration; timer.timeout = setTimeout(function () { fire({ - interaction: interaction, eventCopy: eventCopy, eventTarget: eventTarget, + interaction: interaction, + eventTarget: eventTarget, pointer: browser.isIE8 ? eventCopy : pointer, + event: eventCopy, type: 'hold' }); }, minDuration); @@ -6946,17 +6953,14 @@ module.exports = utils; var scope = require('../scope'); var utils = require('./index'); -var browser = require('./browser'); var finder = { - methodOrder: ['simulationResume', 'mouse', 'hasPointer', 'idle'], + methodOrder: ['simulationResume', 'mouseOrPen', 'hasPointer', 'idle'], search: function search(pointer, eventType, eventTarget) { - var mouseEvent = /mouse/i.test(pointer.pointerType || eventType) - // MSPointerEvent.MSPOINTER_TYPE_MOUSE - || pointer.pointerType === 4; + var pointerType = utils.getPointerType(pointer); var pointerId = utils.getPointerId(pointer); - var details = { pointer: pointer, pointerId: pointerId, mouseEvent: mouseEvent, eventType: eventType, eventTarget: eventTarget }; + var details = { pointer: pointer, pointerId: pointerId, pointerType: pointerType, eventType: eventType, eventTarget: eventTarget }; for (var _iterator = finder.methodOrder, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { var _ref; @@ -6982,7 +6986,7 @@ var finder = { // try to resume simulation with a new pointer simulationResume: function simulationResume(_ref2) { - var mouseEvent = _ref2.mouseEvent, + var pointerType = _ref2.pointerType, eventType = _ref2.eventType, eventTarget = _ref2.eventTarget; @@ -7006,7 +7010,7 @@ var finder = { var element = eventTarget; - if (interaction.simulation && interaction.simulation.allowResume && interaction.mouse === mouseEvent) { + if (interaction.simulation && interaction.simulation.allowResume && interaction.pointerType === pointerType) { while (element) { // if the element is the interaction element if (element === interaction.element) { @@ -7020,13 +7024,13 @@ var finder = { return null; }, - // if it's a mouse interaction - mouse: function mouse(_ref4) { + // if it's a mouse or pen interaction + mouseOrPen: function mouseOrPen(_ref4) { var pointerId = _ref4.pointerId, - mouseEvent = _ref4.mouseEvent, + pointerType = _ref4.pointerType, eventType = _ref4.eventType; - if (!mouseEvent && (browser.supportsTouch || browser.supportsPointerEvent)) { + if (pointerType !== 'mouse' && pointerType !== 'pen') { return null; } @@ -7046,7 +7050,7 @@ var finder = { var interaction = _ref5; - if (interaction.mouse) { + if (interaction.pointerType === pointerType) { // if it's a down event, skip interactions with running simulations if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; @@ -7069,8 +7073,8 @@ var finder = { return firstNonActive; } - // Find any interaction specifically for mouse. - // ignore the interaction if the eventType is a mousedown, and a simulation + // find any mouse or pen interaction. + // ignore the interaction if the eventType is a *down, and a simulation // is active for (var _iterator4 = scope.interactions, _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) { var _ref6; @@ -7086,7 +7090,7 @@ var finder = { var _interaction = _ref6; - if (_interaction.mouse && !(/down/.test(eventType) && _interaction.simulation)) { + if (_interaction.pointerType === pointerType && !(/down/i.test(eventType) && _interaction.simulation)) { return _interaction; } } @@ -7118,9 +7122,9 @@ var finder = { } }, - // get first idle interaction + // get first idle interaction with a matching pointerType idle: function idle(_ref9) { - var mouseEvent = _ref9.mouseEvent; + var pointerType = _ref9.pointerType; for (var _iterator6 = scope.interactions, _isArray6 = Array.isArray(_iterator6), _i6 = 0, _iterator6 = _isArray6 ? _iterator6 : _iterator6[Symbol.iterator]();;) { var _ref10; @@ -7150,7 +7154,7 @@ var finder = { continue; } - if (!interaction.interacting() && mouseEvent === interaction.mouse) { + if (!interaction.interacting() && pointerType === interaction.pointerType) { return interaction; } } @@ -7161,7 +7165,7 @@ var finder = { module.exports = finder; -},{"../scope":34,"./browser":37,"./index":44}],46:[function(require,module,exports){ +},{"../scope":34,"./index":44}],46:[function(require,module,exports){ 'use strict'; var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; @@ -7262,6 +7266,7 @@ var hypot = require('./hypot'); var browser = require('./browser'); var dom = require('./domObjects'); var domUtils = require('./domUtils'); +var domObjects = require('./domObjects'); var is = require('./is'); var pointerExtend = require('./pointerExtend'); @@ -7468,17 +7473,11 @@ var pointerUtils = { return angle; }, - getPointerType: function getPointerType(pointer, interaction) { - // if the PointerEvent API isn't available, then the pointer must be ither - // a MouseEvent or TouchEvent - if (interaction.mouse) { - return 'mouse'; - } - if (!browser.supportsPointerEvent) { - return 'touch'; - } - - return is.string(pointer.pointerType) ? pointer.pointerType : [undefined, undefined, 'touch', 'pen', 'mouse'][pointer.pointerType]; + getPointerType: function getPointerType(pointer) { + return is.string(pointer.pointerType) ? pointer.pointerType : is.number(pointer.pointerType) ? [undefined, undefined, 'touch', 'pen', 'mouse'][pointer.pointerType] + // if the PointerEvent API isn't available, then the "pointer" must + // be either a MouseEvent, TouchEvent, or Touch object + : /touch/.test(pointer.type) || pointer instanceof domObjects.Touch ? 'touch' : 'mouse'; }, // [ event.target, event.currentTarget ] diff --git a/dist/interact.js.map b/dist/interact.js.map index 60832b766..4f3a62ba8 100644 --- a/dist/interact.js.map +++ b/dist/interact.js.map @@ -1 +1 @@ -{"version":3,"sources":["src/header.js","node_modules/browser-pack/_prelude.js","index.js","src/Eventable.js","src/InteractEvent.js","src/Interactable.js","src/Interaction.js","src/actions/base.js","src/actions/drag.js","src/actions/drop.js","src/actions/gesture.js","src/actions/resize.js","src/autoScroll.js","src/autoStart/InteractableMethods.js","src/autoStart/base.js","src/autoStart/delay.js","src/autoStart/drag.js","src/autoStart/gesture.js","src/autoStart/resize.js","src/defaultOptions.js","src/index.js","src/inertia.js","src/interact.js","src/interactablePreventDefault.js","src/legacyBrowsers.js","src/modifiers/index.js","src/modifiers/restrict.js","src/modifiers/restrictEdges.js","src/modifiers/restrictSize.js","src/modifiers/snap.js","src/modifiers/snapSize.js","src/pointerEvents/PointerEvent.js","src/pointerEvents/base.js","src/pointerEvents/holdRepeat.js","src/pointerEvents/interactableTargets.js","src/scope.js","src/utils/Signals.js","src/utils/arr.js","src/utils/browser.js","src/utils/domObjects.js","src/utils/domUtils.js","src/utils/events.js","src/utils/extend.js","src/utils/getOriginXY.js","src/utils/hypot.js","src/utils/index.js","src/utils/interactionFinder.js","src/utils/is.js","src/utils/isWindow.js","src/utils/pointerExtend.js","src/utils/pointerUtils.js","src/utils/raf.js","src/utils/rect.js","src/utils/window.js"],"names":[],"mappings":"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","file":"interact.js","sourceRoot":"","sourcesContent":["/**\n * interact.js v1.3.0-alpha.3+sha.9595c40\n *\n * Copyright (c) 2012-2017 Taye Adeyemi \n * Open source under the MIT License.\n * https://raw.github.com/taye/interact.js/master/LICENSE\n */\n","(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o 150) {\n return null;\n }\n\n let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI;\n const overlap = 22.5;\n\n if (angle < 0) {\n angle += 360;\n }\n\n const left = 135 - overlap <= angle && angle < 225 + overlap;\n const up = 225 - overlap <= angle && angle < 315 + overlap;\n\n const right = !left && (315 - overlap <= angle || angle < 45 + overlap);\n const down = !up && 45 - overlap <= angle && angle < 135 + overlap;\n\n return {\n up,\n down,\n left,\n right,\n angle,\n speed: interaction.prevEvent.speed,\n velocity: {\n x: interaction.prevEvent.velocityX,\n y: interaction.prevEvent.velocityY,\n },\n };\n }\n\n preventDefault () {}\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n}\n\nsignals.on('set-delta', function ({ iEvent, interaction, starting, deltaSource }) {\n const prevEvent = starting? iEvent : interaction.prevEvent;\n\n if (deltaSource === 'client') {\n iEvent.dx = iEvent.clientX - prevEvent.clientX;\n iEvent.dy = iEvent.clientY - prevEvent.clientY;\n }\n else {\n iEvent.dx = iEvent.pageX - prevEvent.pageX;\n iEvent.dy = iEvent.pageY - prevEvent.pageY;\n }\n});\n\nInteractEvent.signals = signals;\n\nmodule.exports = InteractEvent;\n","const is = require('./utils/is');\nconst events = require('./utils/events');\nconst extend = require('./utils/extend');\nconst actions = require('./actions/base');\nconst scope = require('./scope');\nconst Eventable = require('./Eventable');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nconst {\n getElementRect,\n nodeContains,\n trySelector,\n} = require('./utils/domUtils');\nconst { getWindow } = require('./utils/window');\nconst { indexOf, contains } = require('./utils/arr');\nconst { wheelEvent } = require('./utils/browser');\n\n// all set interactables\nscope.interactables = [];\n\n/*\\\n * Interactable\n [ property ]\n **\n * Object type returned by @interact\n\\*/\nclass Interactable {\n constructor (target, options) {\n options = options || {};\n\n this.target = target;\n this.events = new Eventable();\n this._context = options.context || scope.document;\n this._win = getWindow(trySelector(target)? this._context : target);\n this._doc = this._win.document;\n\n signals.fire('new', {\n target,\n options,\n interactable: this,\n win: this._win,\n });\n\n scope.addDocument( this._doc, this._win );\n\n scope.interactables.push(this);\n\n this.set(options);\n }\n\n setOnEvents (action, phases) {\n const onAction = 'on' + action;\n\n if (is.function(phases.onstart) ) { this.events[onAction + 'start' ] = phases.onstart ; }\n if (is.function(phases.onmove) ) { this.events[onAction + 'move' ] = phases.onmove ; }\n if (is.function(phases.onend) ) { this.events[onAction + 'end' ] = phases.onend ; }\n if (is.function(phases.oninertiastart)) { this.events[onAction + 'inertiastart' ] = phases.oninertiastart ; }\n\n return this;\n }\n\n setPerAction (action, options) {\n // for all the default per-action options\n for (const option in options) {\n // if this option exists for this action\n if (option in defaults[action]) {\n // if the option in the options arg is an object value\n if (is.object(options[option])) {\n // duplicate the object\n this.options[action][option] = extend(this.options[action][option] || {}, options[option]);\n\n if (is.object(defaults.perAction[option]) && 'enabled' in defaults.perAction[option]) {\n this.options[action][option].enabled = options[option].enabled === false? false : true;\n }\n }\n else if (is.bool(options[option]) && is.object(defaults.perAction[option])) {\n this.options[action][option].enabled = options[option];\n }\n else if (options[option] !== undefined) {\n // or if it's not undefined, do a plain assignment\n this.options[action][option] = options[option];\n }\n }\n }\n }\n\n /*\\\n * Interactable.getRect\n [ method ]\n *\n * The default function to get an Interactables bounding rect. Can be\n * overridden using @Interactable.rectChecker.\n *\n - element (Element) #optional The element to measure.\n = (object) The object's bounding rectangle.\n o {\n o top : 0,\n o left : 0,\n o bottom: 0,\n o right : 0,\n o width : 0,\n o height: 0\n o }\n \\*/\n getRect (element) {\n element = element || this.target;\n\n if (is.string(this.target) && !(is.element(element))) {\n element = this._context.querySelector(this.target);\n }\n\n return getElementRect(element);\n }\n\n /*\\\n * Interactable.rectChecker\n [ method ]\n *\n * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n - checker (function) #optional A function which returns this Interactable's bounding rectangle. See @Interactable.getRect\n = (function | object) The checker function or this Interactable\n \\*/\n rectChecker (checker) {\n if (is.function(checker)) {\n this.getRect = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.getRect;\n\n return this;\n }\n\n return this.getRect;\n }\n\n _backCompatOption (optionName, newValue) {\n if (trySelector(newValue) || is.object(newValue)) {\n this.options[optionName] = newValue;\n\n for (const action of actions.names) {\n this.options[action][optionName] = newValue;\n }\n\n return this;\n }\n\n return this.options[optionName];\n }\n\n /*\\\n * Interactable.origin\n [ method ]\n *\n * Gets or sets the origin of the Interactable's element. The x and y\n * of the origin will be subtracted from action event coordinates.\n *\n - origin (object | string) #optional An object eg. { x: 0, y: 0 } or string 'parent', 'self' or any CSS selector\n * OR\n - origin (Element) #optional An HTML or SVG Element whose rect will be used\n **\n = (object) The current origin or this Interactable\n \\*/\n origin (newValue) {\n return this._backCompatOption('origin', newValue);\n }\n\n /*\\\n * Interactable.deltaSource\n [ method ]\n *\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n - newValue (string) #optional Use 'client' if you will be scrolling while interacting; Use 'page' if you want autoScroll to work\n = (string | object) The current deltaSource or this Interactable\n \\*/\n deltaSource (newValue) {\n if (newValue === 'page' || newValue === 'client') {\n this.options.deltaSource = newValue;\n\n return this;\n }\n\n return this.options.deltaSource;\n }\n\n /*\\\n * Interactable.context\n [ method ]\n *\n * Gets the selector context Node of the Interactable. The default is `window.document`.\n *\n = (Node) The context Node of this Interactable\n **\n \\*/\n context () {\n return this._context;\n }\n\n inContext (element) {\n return (this._context === element.ownerDocument\n || nodeContains(this._context, element));\n }\n\n /*\\\n * Interactable.fire\n [ method ]\n *\n * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n - iEvent (InteractEvent) The InteractEvent object to be fired on this Interactable\n = (Interactable) this Interactable\n \\*/\n fire (iEvent) {\n this.events.fire(iEvent);\n\n return this;\n }\n\n _onOffMultiple (method, eventType, listener, options) {\n if (is.string(eventType) && eventType.search(' ') !== -1) {\n eventType = eventType.trim().split(/ +/);\n }\n\n if (is.array(eventType)) {\n for (let i = 0; i < eventType.length; i++) {\n this[method](eventType[i], listener, options);\n }\n\n return true;\n }\n\n if (is.object(eventType)) {\n for (const prop in eventType) {\n this[method](prop, eventType[prop], listener);\n }\n\n return true;\n }\n }\n\n /*\\\n * Interactable.on\n [ method ]\n *\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n - eventType (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) This Interactable\n \\*/\n on (eventType, listener, options) {\n if (this._onOffMultiple('on', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.on(eventType, listener);\n }\n // delegated event for selector\n else if (is.string(this.target)) {\n events.addDelegate(this.target, this._context, eventType, listener, options);\n }\n else {\n events.add(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.off\n [ method ]\n *\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n - eventType (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) This Interactable\n \\*/\n off (eventType, listener, options) {\n if (this._onOffMultiple('off', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n // if it is an action event type\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.off(eventType, listener);\n }\n // delegated event\n else if (is.string(this.target)) {\n events.removeDelegate(this.target, this._context, eventType, listener, options);\n }\n // remove listener from this Interatable's element\n else {\n events.remove(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.set\n [ method ]\n *\n * Reset the options of this Interactable\n - options (object) The new settings to apply\n = (object) This Interactable\n \\*/\n set (options) {\n if (!is.object(options)) {\n options = {};\n }\n\n this.options = extend({}, defaults.base);\n\n const perActions = extend({}, defaults.perAction);\n\n for (const actionName in actions.methodDict) {\n const methodName = actions.methodDict[actionName];\n\n this.options[actionName] = extend({}, defaults[actionName]);\n\n this.setPerAction(actionName, perActions);\n\n this[methodName](options[actionName]);\n }\n\n for (const setting of Interactable.settingsMethods) {\n this.options[setting] = defaults.base[setting];\n\n if (setting in options) {\n this[setting](options[setting]);\n }\n }\n\n signals.fire('set', {\n options,\n interactable: this,\n });\n\n return this;\n }\n\n /*\\\n * Interactable.unset\n [ method ]\n *\n * Remove this interactable from the list of interactables and remove\n * it's action capabilities and event listeners\n *\n = (object) @interact\n \\*/\n unset () {\n events.remove(this.target, 'all');\n\n if (is.string(this.target)) {\n // remove delegated events\n for (const type in events.delegatedEvents) {\n const delegated = events.delegatedEvents[type];\n\n if (delegated.selectors[0] === this.target\n && delegated.contexts[0] === this._context) {\n\n delegated.selectors.splice(0, 1);\n delegated.contexts .splice(0, 1);\n delegated.listeners.splice(0, 1);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegated[type] = null;\n }\n }\n\n events.remove(this._context, type, events.delegateListener);\n events.remove(this._context, type, events.delegateUseCapture, true);\n }\n }\n else {\n events.remove(this, 'all');\n }\n\n signals.fire('unset', { interactable: this });\n\n scope.interactables.splice(indexOf(scope.interactables, this), 1);\n\n // Stop related interactions when an Interactable is unset\n for (const interaction of scope.interactions || []) {\n if (interaction.target === this && interaction.interacting()) {\n interaction.stop();\n }\n }\n\n return scope.interact;\n }\n}\n\nscope.interactables.indexOfElement = function indexOfElement (target, context) {\n context = context || scope.document;\n\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n if (interactable.target === target && interactable._context === context) {\n return i;\n }\n }\n return -1;\n};\n\nscope.interactables.get = function interactableGet (element, options, dontCheckInContext) {\n const ret = this[this.indexOfElement(element, options && options.context)];\n\n return ret && (is.string(element) || dontCheckInContext || ret.inContext(element))? ret : null;\n};\n\nscope.interactables.forEachSelector = function (callback, element) {\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n // skip non CSS selector targets and out of context elements\n if (!is.string(interactable.target)\n || (element && !interactable.inContext(element))) {\n continue;\n }\n\n const ret = callback(interactable, interactable.target, interactable._context, i, this);\n\n if (ret !== undefined) {\n return ret;\n }\n }\n};\n\n// all interact.js eventTypes\nInteractable.eventTypes = scope.eventTypes = [];\n\nInteractable.signals = signals;\n\nInteractable.settingsMethods = [ 'deltaSource', 'origin', 'preventDefault', 'rectChecker' ];\n\nmodule.exports = Interactable;\n","const scope = require('./scope');\nconst utils = require('./utils');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst finder = require('./utils/interactionFinder');\nconst signals = require('./utils/Signals').new();\n\nconst listeners = {};\nconst methodNames = [\n 'pointerDown', 'pointerMove', 'pointerUp',\n 'updatePointer', 'removePointer',\n];\n\n// for ignoring browser's simulated mouse events\nlet prevTouchTime = 0;\n\n// all active and idle interactions\nscope.interactions = [];\n\nclass Interaction {\n constructor () {\n this.target = null; // current interactable being interacted with\n this.element = null; // the target element of the interactable\n\n this.prepared = { // action that's ready to be fired on next move event\n name : null,\n axis : null,\n edges: null,\n };\n\n // keep track of added pointers\n this.pointers = [];\n this.pointerIds = [];\n this.downTargets = [];\n this.downTimes = [];\n\n // Previous native pointer move event coordinates\n this.prevCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n // current native pointer move event coordinates\n this.curCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Starting InteractEvent pointer coordinates\n this.startCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Change in coordinates and time of the pointer\n this.pointerDelta = {\n page : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n client : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n timeStamp: 0,\n };\n\n this.downEvent = null; // pointerdown/mousedown/touchstart event\n this.downPointer = {};\n\n this._eventTarget = null;\n this._curEventTarget = null;\n\n this.prevEvent = null; // previous action event\n\n this.pointerIsDown = false;\n this.pointerWasMoved = false;\n this._interacting = false;\n\n this.mouse = false;\n\n signals.fire('new', this);\n\n scope.interactions.push(this);\n }\n\n pointerDown (pointer, event, eventTarget) {\n const pointerIndex = this.updatePointer(pointer, event, true);\n\n signals.fire('down', {\n pointer,\n event,\n eventTarget,\n pointerIndex,\n interaction: this,\n });\n }\n\n /*\\\n * Interaction.start\n [ method ]\n *\n * Start an action with the given Interactable and Element as tartgets. The\n * action must be enabled for the target Interactable and an appropriate number\n * of pointers must be held down - 1 for drag/resize, 2 for gesture.\n *\n * Use it with `interactable.able({ manualStart: false })` to always\n * [start actions manually](https://github.com/taye/interact.js/issues/114)\n *\n - action (object) The action to be performed - drag, resize, etc.\n - target (Interactable) The Interactable to target\n - element (Element) The DOM Element to target\n = (object) interact\n **\n | interact(target)\n | .draggable({\n | // disable the default drag start by down->move\n | manualStart: true\n | })\n | // start dragging after the user holds the pointer down\n | .on('hold', function (event) {\n | var interaction = event.interaction;\n |\n | if (!interaction.interacting()) {\n | interaction.start({ name: 'drag' },\n | event.interactable,\n | event.currentTarget);\n | }\n | });\n \\*/\n start (action, target, element) {\n if (this.interacting()\n || !this.pointerIsDown\n || this.pointerIds.length < (action.name === 'gesture'? 2 : 1)) {\n return;\n }\n\n // if this interaction had been removed after stopping\n // add it back\n if (utils.indexOf(scope.interactions, this) === -1) {\n scope.interactions.push(this);\n }\n\n utils.copyAction(this.prepared, action);\n this.target = target;\n this.element = element;\n\n signals.fire('action-start', {\n interaction: this,\n event: this.downEvent,\n });\n }\n\n pointerMove (pointer, event, eventTarget) {\n if (!this.simulation) {\n this.updatePointer(pointer);\n utils.setCoords(this.curCoords, this.pointers);\n }\n\n const duplicateMove = (this.curCoords.page.x === this.prevCoords.page.x\n && this.curCoords.page.y === this.prevCoords.page.y\n && this.curCoords.client.x === this.prevCoords.client.x\n && this.curCoords.client.y === this.prevCoords.client.y);\n\n let dx;\n let dy;\n\n // register movement greater than pointerMoveTolerance\n if (this.pointerIsDown && !this.pointerWasMoved) {\n dx = this.curCoords.client.x - this.startCoords.client.x;\n dy = this.curCoords.client.y - this.startCoords.client.y;\n\n this.pointerWasMoved = utils.hypot(dx, dy) > Interaction.pointerMoveTolerance;\n }\n\n const signalArg = {\n pointer,\n pointerIndex: this.getPointerIndex(pointer),\n event,\n eventTarget,\n dx,\n dy,\n duplicate: duplicateMove,\n interaction: this,\n interactingBeforeMove: this.interacting(),\n };\n\n if (!duplicateMove) {\n // set pointer coordinate, time changes and speeds\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n }\n\n signals.fire('move', signalArg);\n\n if (!duplicateMove) {\n // if interacting, fire an 'action-move' signal etc\n if (this.interacting()) {\n this.doMove(signalArg);\n }\n\n if (this.pointerWasMoved) {\n utils.copyCoords(this.prevCoords, this.curCoords);\n }\n }\n }\n\n /*\\\n * Interaction.doMove\n [ method ]\n *\n * Force a move of the current action at the same coordinates. Useful if\n * snap/restrict has been changed and you want a movement with the new\n * settings.\n *\n **\n | interact(target)\n | .draggable(true)\n | .on('dragmove', function (event) {\n | if (someCondition) {\n | // change the snap settings\n | event.interactable.draggable({ snap: { targets: [] }});\n | // fire another move event with re-calculated snap\n | event.interaction.doMove();\n | }\n | });\n \\*/\n doMove (signalArg) {\n signalArg = utils.extend({\n pointer: this.pointers[0],\n event: this.prevEvent,\n eventTarget: this._eventTarget,\n interaction: this,\n }, signalArg || {});\n\n signals.fire('before-action-move', signalArg);\n\n if (!this._dontFireMove) {\n signals.fire('action-move', signalArg);\n }\n\n this._dontFireMove = false;\n }\n\n // End interact move events and stop auto-scroll unless simulation is running\n pointerUp (pointer, event, eventTarget, curEventTarget) {\n const pointerIndex = this.getPointerIndex(pointer);\n\n signals.fire(/cancel$/i.test(event.type)? 'cancel' : 'up', {\n pointer,\n pointerIndex,\n event,\n eventTarget,\n curEventTarget,\n interaction: this,\n });\n\n if (!this.simulation) {\n this.end(event);\n }\n\n this.pointerIsDown = false;\n this.removePointer(pointer, event);\n }\n\n /*\\\n * Interaction.end\n [ method ]\n *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n - event (PointerEvent) #optional\n **\n | interact(target)\n | .draggable(true)\n | .on('move', function (event) {\n | if (event.pageX > 1000) {\n | // end the current action\n | event.interaction.end();\n | // stop all further listeners from being called\n | event.stopImmediatePropagation();\n | }\n | });\n \\*/\n end (event) {\n event = event || this.prevEvent;\n\n if (this.interacting()) {\n signals.fire('action-end', {\n event,\n interaction: this,\n });\n }\n\n this.stop();\n }\n\n currentAction () {\n return this._interacting? this.prepared.name: null;\n }\n\n interacting () {\n return this._interacting;\n }\n\n stop () {\n signals.fire('stop', { interaction: this });\n\n if (this._interacting) {\n signals.fire('stop-active', { interaction: this });\n signals.fire('stop-' + this.prepared.name, { interaction: this });\n }\n\n this.target = this.element = null;\n\n this._interacting = false;\n this.prepared.name = this.prevEvent = null;\n }\n\n getPointerIndex (pointer) {\n return utils.indexOf(this.pointerIds, utils.getPointerId(pointer));\n }\n\n updatePointer (pointer, event, down = event && /(down|start)$/i.test(event.type)) {\n const id = utils.getPointerId(pointer);\n let index = this.getPointerIndex(pointer);\n\n if (index === -1) {\n index = this.pointerIds.length;\n this.pointerIds[index] = id;\n }\n\n if (down) {\n signals.fire('update-pointer-down', {\n pointer,\n event,\n down,\n pointerId: id,\n pointerIndex: index,\n interaction: this,\n });\n }\n\n this.pointers[index] = pointer;\n\n return index;\n }\n\n removePointer (pointer, event) {\n const id = utils.getPointerId(pointer);\n const index = this.mouse? 0 : utils.indexOf(this.pointerIds, id);\n\n if (index === -1) { return; }\n\n signals.fire('remove-pointer', {\n pointer,\n event,\n pointerIndex: index,\n interaction: this,\n });\n\n this.pointers .splice(index, 1);\n this.pointerIds .splice(index, 1);\n this.downTargets.splice(index, 1);\n this.downTimes .splice(index, 1);\n }\n\n _updateEventTargets (target, currentTarget) {\n this._eventTarget = target;\n this._curEventTarget = currentTarget;\n }\n}\n\nfor (let i = 0, len = methodNames.length; i < len; i++) {\n const method = methodNames[i];\n\n listeners[method] = doOnInteractions(method);\n}\n\nfunction doOnInteractions (method) {\n return (function (event) {\n const [eventTarget, curEventTarget] = utils.getEventTargets(event);\n const matches = []; // [ [pointer, interaction], ...]\n\n if (browser.supportsTouch && /touch/.test(event.type)) {\n prevTouchTime = new Date().getTime();\n\n for (let i = 0; i < event.changedTouches.length; i++) {\n const pointer = event.changedTouches[i];\n const interaction = finder.search(pointer, event.type, eventTarget);\n\n matches.push([pointer, interaction || new Interaction()]);\n }\n }\n else {\n let invalidPointer = false;\n\n if (!browser.supportsPointerEvent && /mouse/.test(event.type)) {\n // ignore mouse events while touch interactions are active\n for (let i = 0; i < scope.interactions.length && !invalidPointer; i++) {\n invalidPointer = !scope.interactions[i].mouse && scope.interactions[i].pointerIsDown;\n }\n\n // try to ignore mouse events that are simulated by the browser\n // after a touch event\n invalidPointer = invalidPointer\n || (new Date().getTime() - prevTouchTime < 500)\n // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated\n || event.timeStamp === 0;\n }\n\n if (!invalidPointer) {\n let interaction = finder.search(event, event.type, eventTarget);\n\n if (!interaction) {\n\n interaction = new Interaction();\n interaction.mouse = (/mouse/i.test(event.pointerType || event.type)\n // MSPointerEvent.MSPOINTER_TYPE_MOUSE\n || event.pointerType === 4\n || !event.pointerType);\n }\n\n matches.push([event, interaction]);\n }\n }\n\n for (const [pointer, interaction] of matches) {\n interaction._updateEventTargets(eventTarget, curEventTarget);\n interaction[method](pointer, event, eventTarget, curEventTarget);\n }\n });\n}\n\nfunction endAll (event) {\n for (let i = 0; i < scope.interactions.length; i++) {\n const interaction = scope.interactions[i];\n\n interaction.end(event);\n signals.fire('endall', { event, interaction });\n }\n}\n\nconst docEvents = { /* 'eventType': listenerFunc */ };\nconst pEventTypes = browser.pEventTypes;\n\nif (scope.PointerEvent) {\n docEvents[pEventTypes.down ] = listeners.pointerDown;\n docEvents[pEventTypes.move ] = listeners.pointerMove;\n docEvents[pEventTypes.up ] = listeners.pointerUp;\n docEvents[pEventTypes.cancel] = listeners.pointerUp;\n}\nelse {\n docEvents.mousedown = listeners.pointerDown;\n docEvents.mousemove = listeners.pointerMove;\n docEvents.mouseup = listeners.pointerUp;\n\n docEvents.touchstart = listeners.pointerDown;\n docEvents.touchmove = listeners.pointerMove;\n docEvents.touchend = listeners.pointerUp;\n docEvents.touchcancel = listeners.pointerUp;\n}\n\ndocEvents.blur = endAll;\n\nfunction onDocSignal ({ doc }, signalName) {\n const eventMethod = signalName.indexOf('add') === 0\n ? events.add : events.remove;\n\n // delegate event listener\n for (const eventType in scope.delegatedEvents) {\n eventMethod(doc, eventType, events.delegateListener);\n eventMethod(doc, eventType, events.delegateUseCapture, true);\n }\n\n for (const eventType in docEvents) {\n eventMethod(doc, eventType, docEvents[eventType]);\n }\n}\n\nsignals.on('update-pointer-down', ({ interaction, pointer, pointerId, pointerIndex, event, eventTarget, down }) => {\n interaction.pointerIds[pointerIndex] = pointerId;\n interaction.pointers[pointerIndex] = pointer;\n\n if (down) {\n interaction.pointerIsDown = true;\n }\n\n if (!interaction.interacting()) {\n utils.setCoords(interaction.startCoords, interaction.pointers);\n\n utils.copyCoords(interaction.curCoords , interaction.startCoords);\n utils.copyCoords(interaction.prevCoords, interaction.startCoords);\n\n interaction.downEvent = event;\n interaction.downTimes[pointerIndex] = interaction.curCoords.timeStamp;\n interaction.downTargets[pointerIndex] = eventTarget || event && utils.getEventTargets(event)[0];\n interaction.pointerWasMoved = false;\n\n utils.pointerExtend(interaction.downPointer, pointer);\n }\n});\n\nscope.signals.on('add-document' , onDocSignal);\nscope.signals.on('remove-document', onDocSignal);\n\nInteraction.pointerMoveTolerance = 1;\nInteraction.doOnInteractions = doOnInteractions;\nInteraction.endAll = endAll;\nInteraction.signals = signals;\nInteraction.docEvents = docEvents;\n\nscope.endAllInteractions = endAll;\n\nmodule.exports = Interaction;\n","const Interaction = require('../Interaction');\nconst InteractEvent = require('../InteractEvent');\n\nconst actions = {\n firePrepared,\n names: [],\n methodDict: {},\n};\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n interaction._interacting = true;\n firePrepared(interaction, event, 'start');\n});\n\nInteraction.signals.on('action-move', function ({ interaction, event, preEnd }) {\n firePrepared(interaction, event, 'move', preEnd);\n\n // if the action was ended in a listener\n if (!interaction.interacting()) { return false; }\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n firePrepared(interaction, event, 'end');\n});\n\nfunction firePrepared (interaction, event, phase, preEnd) {\n const actionName = interaction.prepared.name;\n\n const newEvent = new InteractEvent(interaction, event, actionName, phase, interaction.element, null, preEnd);\n\n interaction.target.fire(newEvent);\n interaction.prevEvent = newEvent;\n}\n\nmodule.exports = actions;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drag = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n startAxis : 'xy',\n lockAxis : 'xy',\n },\n\n checker: function (pointer, event, interactable) {\n const dragOptions = interactable.options.drag;\n\n return dragOptions.enabled\n ? { name: 'drag', axis: (dragOptions.lockAxis === 'start'\n ? dragOptions.startAxis\n : dragOptions.lockAxis)}\n : null;\n },\n\n getCursor: function () {\n return 'move';\n },\n};\n\nInteraction.signals.on('before-action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n interaction.curCoords.page.y = interaction.startCoords.page.y;\n interaction.curCoords.client.y = interaction.startCoords.client.y;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vx);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vx);\n interaction.pointerDelta.client.vy = 0;\n interaction.pointerDelta.page.vy = 0;\n }\n else if (axis === 'y') {\n interaction.curCoords.page.x = interaction.startCoords.page.x;\n interaction.curCoords.client.x = interaction.startCoords.client.x;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vy);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vy);\n interaction.pointerDelta.client.vx = 0;\n interaction.pointerDelta.page.vx = 0;\n }\n});\n\n// dragmove\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'dragmove') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n iEvent.pageY = interaction.startCoords.page.y;\n iEvent.clientY = interaction.startCoords.client.y;\n iEvent.dy = 0;\n }\n else if (axis === 'y') {\n iEvent.pageX = interaction.startCoords.page.x;\n iEvent.clientX = interaction.startCoords.client.x;\n iEvent.dx = 0;\n }\n});\n\n/*\\\n * Interactable.draggable\n [ method ]\n *\n * Gets or sets whether drag actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of drag events\n | var isDraggable = interact('ul li').draggable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on drag events (object makes the Interactable draggable)\n = (object) This Interactable\n | interact(element).draggable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // the axis in which the first movement must be\n | // for the drag sequence to start\n | // 'xy' by default - any direction\n | startAxis: 'x' || 'y' || 'xy',\n |\n | // 'xy' by default - don't restrict to one axis (move in any direction)\n | // 'x' or 'y' to restrict movement to either axis\n | // 'start' to restrict movement to the axis the drag started in\n | lockAxis: 'x' || 'y' || 'xy' || 'start',\n |\n | // max number of drags that can happen concurrently\n | // with elements of this Interactable. Infinity by default\n | max: Infinity,\n |\n | // max number of drags that can target the same element+Interactable\n | // 1 by default\n | maxPerElement: 2\n | });\n\\*/\nInteractable.prototype.draggable = function (options) {\n if (utils.is.object(options)) {\n this.options.drag.enabled = options.enabled === false? false: true;\n this.setPerAction('drag', options);\n this.setOnEvents('drag', options);\n\n if (/^(xy|x|y|start)$/.test(options.lockAxis)) {\n this.options.drag.lockAxis = options.lockAxis;\n }\n if (/^(xy|x|y)$/.test(options.startAxis)) {\n this.options.drag.startAxis = options.startAxis;\n }\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drag.enabled = options;\n\n if (!options) {\n this.ondragstart = this.ondragstart = this.ondragend = null;\n }\n\n return this;\n }\n\n return this.options.drag;\n};\n\nactions.drag = drag;\nactions.names.push('drag');\nutils.merge(Interactable.eventTypes, [\n 'dragstart',\n 'dragmove',\n 'draginertiastart',\n 'draginertiaresume',\n 'dragend',\n]);\nactions.methodDict.drag = 'draggable';\n\ndefaultOptions.drag = drag.defaults;\n\nmodule.exports = drag;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst scope = require('../scope');\nconst interact = require('../interact');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drop = {\n defaults: {\n enabled: false,\n accept : null,\n overlap: 'pointer',\n },\n};\n\nlet dynamicDrop = false;\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // reset active dropzones\n interaction.activeDrops.dropzones = [];\n interaction.activeDrops.elements = [];\n interaction.activeDrops.rects = [];\n\n interaction.dropEvents = null;\n\n if (!interaction.dynamicDrop) {\n setActiveDrops(interaction, interaction.element);\n }\n\n const dragEvent = interaction.prevEvent;\n const dropEvents = getDropEvents(interaction, event, dragEvent);\n\n if (dropEvents.activate) {\n fireActiveDrops(interaction, dropEvents.activate);\n }\n});\n\nInteractEvent.signals.on('new', function ({ interaction, iEvent, event }) {\n if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { return; }\n\n const draggableElement = interaction.element;\n const dragEvent = iEvent;\n const dropResult = getDrop(dragEvent, event, draggableElement);\n\n interaction.dropTarget = dropResult.dropzone;\n interaction.dropElement = dropResult.element;\n\n interaction.dropEvents = getDropEvents(interaction, event, dragEvent);\n});\n\nInteraction.signals.on('action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n fireDropEvents(interaction, interaction.dropEvents);\n});\n\nInteraction.signals.on('action-end', function ({ interaction }) {\n if (interaction.prepared.name === 'drag') {\n fireDropEvents(interaction, interaction.dropEvents);\n }\n});\n\nInteraction.signals.on('stop-drag', function ({ interaction }) {\n interaction.activeDrops.dropzones =\n interaction.activeDrops.elements =\n interaction.activeDrops.rects =\n interaction.dropEvents = null;\n});\n\nfunction collectDrops (interaction, element) {\n const drops = [];\n const elements = [];\n\n element = element || interaction.element;\n\n // collect all dropzones and their elements which qualify for a drop\n for (const current of scope.interactables) {\n if (!current.options.drop.enabled) { continue; }\n\n const accept = current.options.drop.accept;\n\n // test the draggable element against the dropzone's accept setting\n if ((utils.is.element(accept) && accept !== element)\n || (utils.is.string(accept)\n && !utils.matchesSelector(element, accept))) {\n\n continue;\n }\n\n // query for new elements if necessary\n const dropElements = utils.is.string(current.target)\n ? current._context.querySelectorAll(current.target)\n : [current.target];\n\n for (let i = 0; i < dropElements.length; i++) {\n const currentElement = dropElements[i];\n\n if (currentElement !== element) {\n drops.push(current);\n elements.push(currentElement);\n }\n }\n }\n\n return {\n elements,\n dropzones: drops,\n };\n}\n\nfunction fireActiveDrops (interaction, event) {\n let prevElement;\n\n // loop through all active dropzones and trigger event\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n const current = interaction.activeDrops.dropzones[i];\n const currentElement = interaction.activeDrops.elements [i];\n\n // prevent trigger of duplicate events on same element\n if (currentElement !== prevElement) {\n // set current element as event target\n event.target = currentElement;\n current.fire(event);\n }\n prevElement = currentElement;\n }\n}\n\n// Collect a new set of possible drops and save them in activeDrops.\n// setActiveDrops should always be called when a drag has just started or a\n// drag event happens while dynamicDrop is true\nfunction setActiveDrops (interaction, dragElement) {\n // get dropzones and their elements that could receive the draggable\n const possibleDrops = collectDrops(interaction, dragElement, true);\n\n interaction.activeDrops.dropzones = possibleDrops.dropzones;\n interaction.activeDrops.elements = possibleDrops.elements;\n interaction.activeDrops.rects = [];\n\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n interaction.activeDrops.rects[i] =\n interaction.activeDrops.dropzones[i].getRect(interaction.activeDrops.elements[i]);\n }\n}\n\nfunction getDrop (dragEvent, event, dragElement) {\n const interaction = dragEvent.interaction;\n const validDrops = [];\n\n if (dynamicDrop) {\n setActiveDrops(interaction, dragElement);\n }\n\n // collect all dropzones and their elements which qualify for a drop\n for (let j = 0; j < interaction.activeDrops.dropzones.length; j++) {\n const current = interaction.activeDrops.dropzones[j];\n const currentElement = interaction.activeDrops.elements [j];\n const rect = interaction.activeDrops.rects [j];\n\n validDrops.push(current.dropCheck(dragEvent, event, interaction.target, dragElement, currentElement, rect)\n ? currentElement\n : null);\n }\n\n // get the most appropriate dropzone based on DOM depth and order\n const dropIndex = utils.indexOfDeepestElement(validDrops);\n\n return {\n dropzone: interaction.activeDrops.dropzones[dropIndex] || null,\n element : interaction.activeDrops.elements [dropIndex] || null,\n };\n}\n\nfunction getDropEvents (interaction, pointerEvent, dragEvent) {\n const dropEvents = {\n enter : null,\n leave : null,\n activate : null,\n deactivate: null,\n move : null,\n drop : null,\n };\n\n const tmpl = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n };\n\n if (interaction.dropElement !== interaction.prevDropElement) {\n // if there was a prevDropTarget, create a dragleave event\n if (interaction.prevDropTarget) {\n dropEvents.leave = utils.extend({ type: 'dragleave' }, tmpl);\n\n dragEvent.dragLeave = dropEvents.leave.target = interaction.prevDropElement;\n dragEvent.prevDropzone = dropEvents.leave.dropzone = interaction.prevDropTarget;\n }\n // if the dropTarget is not null, create a dragenter event\n if (interaction.dropTarget) {\n dropEvents.enter = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n type : 'dragenter',\n };\n\n dragEvent.dragEnter = interaction.dropElement;\n dragEvent.dropzone = interaction.dropTarget;\n }\n }\n\n if (dragEvent.type === 'dragend' && interaction.dropTarget) {\n dropEvents.drop = utils.extend({ type: 'drop' }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n dragEvent.relatedTarget = interaction.dropElement;\n }\n if (dragEvent.type === 'dragstart') {\n dropEvents.activate = utils.extend({ type: 'dropactivate' }, tmpl);\n\n dropEvents.activate.target = null;\n dropEvents.activate.dropzone = null;\n }\n if (dragEvent.type === 'dragend') {\n dropEvents.deactivate = utils.extend({ type: 'dropdeactivate' }, tmpl);\n\n dropEvents.deactivate.target = null;\n dropEvents.deactivate.dropzone = null;\n }\n if (dragEvent.type === 'dragmove' && interaction.dropTarget) {\n dropEvents.move = utils.extend({\n dragmove : dragEvent,\n type : 'dropmove',\n }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n }\n\n return dropEvents;\n}\n\nfunction fireDropEvents (interaction, dropEvents) {\n if (dropEvents.leave) { interaction.prevDropTarget.fire(dropEvents.leave); }\n if (dropEvents.move ) { interaction.dropTarget.fire(dropEvents.move ); }\n if (dropEvents.enter) { interaction.dropTarget.fire(dropEvents.enter); }\n if (dropEvents.drop ) { interaction.dropTarget.fire(dropEvents.drop ); }\n if (dropEvents.deactivate) {\n fireActiveDrops(interaction, dropEvents.deactivate);\n }\n\n interaction.prevDropTarget = interaction.dropTarget;\n interaction.prevDropElement = interaction.dropElement;\n}\n\n/*\\\n * Interactable.dropzone\n [ method ]\n *\n * Returns or sets whether elements can be dropped onto this\n * Interactable to trigger drop events\n *\n * Dropzones can receive the following events:\n * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends\n * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone\n * - `dragmove` when a draggable that has entered the dropzone is moved\n * - `drop` when a draggable is dropped into this dropzone\n *\n * Use the `accept` option to allow only elements that match the given CSS\n * selector or element. The value can be:\n *\n * - **an Element** - only that element can be dropped into this dropzone.\n * - **a string**, - the element being dragged must match it as a CSS selector.\n * - **`null`** - accept options is cleared - it accepts any element.\n *\n * Use the `overlap` option to set how drops are checked for. The allowed\n * values are:\n *\n * - `'pointer'`, the pointer must be over the dropzone (default)\n * - `'center'`, the draggable element's center must be over the dropzone\n * - a number from 0-1 which is the `(intersection area) / (draggable area)`.\n * e.g. `0.5` for drop to happen when half of the area of the draggable is\n * over the dropzone\n *\n * Use the `checker` option to specify a function to check if a dragged\n * element is over this Interactable.\n *\n | interact(target)\n | .dropChecker(function(dragEvent, // related dragmove or dragend event\n | event, // TouchEvent/PointerEvent/MouseEvent\n | dropped, // bool result of the default checker\n | dropzone, // dropzone Interactable\n | dropElement, // dropzone elemnt\n | draggable, // draggable Interactable\n | draggableElement) {// draggable element\n |\n | return dropped && event.target.hasAttribute('allow-drop');\n | }\n *\n *\n - options (boolean | object | null) #optional The new value to be set.\n | interact('.drop').dropzone({\n | accept: '.can-drop' || document.getElementById('single-drop'),\n | overlap: 'pointer' || 'center' || zeroToOne\n | }\n = (boolean | object) The current setting or this Interactable\n\\*/\nInteractable.prototype.dropzone = function (options) {\n if (utils.is.object(options)) {\n this.options.drop.enabled = options.enabled === false? false: true;\n\n if (utils.is.function(options.ondrop) ) { this.events.ondrop = options.ondrop ; }\n if (utils.is.function(options.ondropactivate) ) { this.events.ondropactivate = options.ondropactivate ; }\n if (utils.is.function(options.ondropdeactivate)) { this.events.ondropdeactivate = options.ondropdeactivate; }\n if (utils.is.function(options.ondragenter) ) { this.events.ondragenter = options.ondragenter ; }\n if (utils.is.function(options.ondragleave) ) { this.events.ondragleave = options.ondragleave ; }\n if (utils.is.function(options.ondropmove) ) { this.events.ondropmove = options.ondropmove ; }\n\n if (/^(pointer|center)$/.test(options.overlap)) {\n this.options.drop.overlap = options.overlap;\n }\n else if (utils.is.number(options.overlap)) {\n this.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0);\n }\n if ('accept' in options) {\n this.options.drop.accept = options.accept;\n }\n if ('checker' in options) {\n this.options.drop.checker = options.checker;\n }\n\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drop.enabled = options;\n\n if (!options) {\n this.ondragenter = this.ondragleave = this.ondrop\n = this.ondropactivate = this.ondropdeactivate = null;\n }\n\n return this;\n }\n\n return this.options.drop;\n};\n\nInteractable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) {\n let dropped = false;\n\n // if the dropzone has no rect (eg. display: none)\n // call the custom dropChecker or just return false\n if (!(rect = rect || this.getRect(dropElement))) {\n return (this.options.drop.checker\n ? this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement)\n : false);\n }\n\n const dropOverlap = this.options.drop.overlap;\n\n if (dropOverlap === 'pointer') {\n const origin = utils.getOriginXY(draggable, draggableElement, 'drag');\n const page = utils.getPageXY(dragEvent);\n\n page.x += origin.x;\n page.y += origin.y;\n\n const horizontal = (page.x > rect.left) && (page.x < rect.right);\n const vertical = (page.y > rect.top ) && (page.y < rect.bottom);\n\n dropped = horizontal && vertical;\n }\n\n const dragRect = draggable.getRect(draggableElement);\n\n if (dragRect && dropOverlap === 'center') {\n const cx = dragRect.left + dragRect.width / 2;\n const cy = dragRect.top + dragRect.height / 2;\n\n dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom;\n }\n\n if (dragRect && utils.is.number(dropOverlap)) {\n const overlapArea = (Math.max(0, Math.min(rect.right , dragRect.right ) - Math.max(rect.left, dragRect.left))\n * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top , dragRect.top )));\n\n const overlapRatio = overlapArea / (dragRect.width * dragRect.height);\n\n dropped = overlapRatio >= dropOverlap;\n }\n\n if (this.options.drop.checker) {\n dropped = this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement);\n }\n\n return dropped;\n};\n\nInteractable.signals.on('unset', function ({ interactable }) {\n interactable.dropzone(false);\n});\n\nInteractable.settingsMethods.push('dropChecker');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.dropTarget = null; // the dropzone a drag target might be dropped into\n interaction.dropElement = null; // the element at the time of checking\n interaction.prevDropTarget = null; // the dropzone that was recently dragged away from\n interaction.prevDropElement = null; // the element at the time of checking\n interaction.dropEvents = null; // the dropEvents related to the current drag event\n\n interaction.activeDrops = {\n dropzones: [], // the dropzones that are mentioned below\n elements : [], // elements of dropzones that accept the target draggable\n rects : [], // the rects of the elements mentioned above\n };\n\n});\n\nInteraction.signals.on('stop', function ({ interaction }) {\n interaction.dropTarget = interaction.dropElement =\n interaction.prevDropTarget = interaction.prevDropElement = null;\n});\n\n/*\\\n * interact.dynamicDrop\n [ method ]\n *\n * Returns or sets whether the dimensions of dropzone elements are\n * calculated on every dragmove or only on dragstart for the default\n * dropChecker\n *\n - newValue (boolean) #optional True to check on each move. False to check only before start\n = (boolean | interact) The current setting or interact\n\\*/\ninteract.dynamicDrop = function (newValue) {\n if (utils.is.bool(newValue)) {\n //if (dragging && dynamicDrop !== newValue && !newValue) {\n //calcRects(dropzones);\n //}\n\n dynamicDrop = newValue;\n\n return interact;\n }\n return dynamicDrop;\n};\n\nutils.merge(Interactable.eventTypes, [\n 'dragenter',\n 'dragleave',\n 'dropactivate',\n 'dropdeactivate',\n 'dropmove',\n 'drop',\n]);\nactions.methodDict.drop = 'dropzone';\n\ndefaultOptions.drop = drop.defaults;\n\nmodule.exports = drop;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst gesture = {\n defaults: {\n enabled : false,\n origin : null,\n restrict: null,\n },\n\n checker: function (pointer, event, interactable, element, interaction) {\n if (interaction.pointerIds.length >= 2) {\n return { name: 'gesture' };\n }\n\n return null;\n },\n\n getCursor: function () {\n return '';\n },\n};\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturestart') { return; }\n iEvent.ds = 0;\n\n interaction.gesture.startDistance = interaction.gesture.prevDistance = iEvent.distance;\n interaction.gesture.startAngle = interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.scale = 1;\n});\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturemove') { return; }\n\n iEvent.ds = iEvent.scale - interaction.gesture.scale;\n\n interaction.target.fire(iEvent);\n\n interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.prevDistance = iEvent.distance;\n\n if (iEvent.scale !== Infinity\n && iEvent.scale !== null\n && iEvent.scale !== undefined\n && !isNaN(iEvent.scale)) {\n\n interaction.gesture.scale = iEvent.scale;\n }\n});\n\n/*\\\n * Interactable.gesturable\n [ method ]\n *\n * Gets or sets whether multitouch gestures can be performed on the\n * Interactable's element\n *\n = (boolean) Indicates if this can be the target of gesture events\n | var isGestureable = interact(element).gesturable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on gesture events (makes the Interactable gesturable)\n = (object) this Interactable\n | interact(element).gesturable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // limit multiple gestures.\n | // See the explanation in @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n\\*/\nInteractable.prototype.gesturable = function (options) {\n if (utils.is.object(options)) {\n this.options.gesture.enabled = options.enabled === false? false: true;\n this.setPerAction('gesture', options);\n this.setOnEvents('gesture', options);\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.gesture.enabled = options;\n\n if (!options) {\n this.ongesturestart = this.ongesturestart = this.ongestureend = null;\n }\n\n return this;\n }\n\n return this.options.gesture;\n};\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action, event, starting, ending, deltaSource }) {\n if (action !== 'gesture') { return; }\n\n const pointers = interaction.pointers;\n\n iEvent.touches = [pointers[0], pointers[1]];\n\n if (starting) {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = 1;\n iEvent.ds = 0;\n iEvent.angle = utils.touchAngle(pointers, undefined, deltaSource);\n iEvent.da = 0;\n }\n else if (ending || event instanceof InteractEvent) {\n iEvent.distance = interaction.prevEvent.distance;\n iEvent.box = interaction.prevEvent.box;\n iEvent.scale = interaction.prevEvent.scale;\n iEvent.ds = iEvent.scale - 1;\n iEvent.angle = interaction.prevEvent.angle;\n iEvent.da = iEvent.angle - interaction.gesture.startAngle;\n }\n else {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = iEvent.distance / interaction.gesture.startDistance;\n iEvent.angle = utils.touchAngle(pointers, interaction.gesture.prevAngle, deltaSource);\n\n iEvent.ds = iEvent.scale - interaction.gesture.prevScale;\n iEvent.da = iEvent.angle - interaction.gesture.prevAngle;\n }\n});\n\nInteraction.signals.on('new', function (interaction) {\n interaction.gesture = {\n start: { x: 0, y: 0 },\n\n startDistance: 0, // distance between two touches of touchStart\n prevDistance : 0,\n distance : 0,\n\n scale: 1, // gesture.distance / gesture.startDistance\n\n startAngle: 0, // angle of line joining two touches\n prevAngle : 0, // angle of the previous gesture event\n };\n});\n\nactions.gesture = gesture;\nactions.names.push('gesture');\nutils.merge(Interactable.eventTypes, [\n 'gesturestart',\n 'gesturemove',\n 'gestureend',\n]);\nactions.methodDict.gesture = 'gesturable';\n\ndefaultOptions.gesture = gesture.defaults;\n\nmodule.exports = gesture;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\n// Less Precision with touch input\nconst defaultMargin = browser.supportsTouch || browser.supportsPointerEvent? 20: 10;\n\nconst resize = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n square: false,\n preserveAspectRatio: false,\n axis: 'xy',\n\n // use default margin\n margin: NaN,\n\n // object with props left, right, top, bottom which are\n // true/false values to resize when the pointer is over that edge,\n // CSS selectors to match the handles for each direction\n // or the Elements for each handle\n edges: null,\n\n // a value of 'none' will limit the resize rect to a minimum of 0x0\n // 'negate' will alow the rect to have negative width/height\n // 'reposition' will keep the width/height positive by swapping\n // the top and bottom edges and/or swapping the left and right edges\n invert: 'none',\n },\n\n checker: function (pointer, event, interactable, element, interaction, rect) {\n if (!rect) { return null; }\n\n const page = utils.extend({}, interaction.curCoords.page);\n const options = interactable.options;\n\n if (options.resize.enabled) {\n const resizeOptions = options.resize;\n const resizeEdges = { left: false, right: false, top: false, bottom: false };\n\n // if using resize.edges\n if (utils.is.object(resizeOptions.edges)) {\n for (const edge in resizeEdges) {\n resizeEdges[edge] = checkResizeEdge(edge,\n resizeOptions.edges[edge],\n page,\n interaction._eventTarget,\n element,\n rect,\n resizeOptions.margin || defaultMargin);\n }\n\n resizeEdges.left = resizeEdges.left && !resizeEdges.right;\n resizeEdges.top = resizeEdges.top && !resizeEdges.bottom;\n\n if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) {\n return {\n name: 'resize',\n edges: resizeEdges,\n };\n }\n }\n else {\n const right = options.resize.axis !== 'y' && page.x > (rect.right - defaultMargin);\n const bottom = options.resize.axis !== 'x' && page.y > (rect.bottom - defaultMargin);\n\n if (right || bottom) {\n return {\n name: 'resize',\n axes: (right? 'x' : '') + (bottom? 'y' : ''),\n };\n }\n }\n }\n\n return null;\n },\n\n cursors: (browser.isIe9OrOlder ? {\n x : 'e-resize',\n y : 's-resize',\n xy: 'se-resize',\n\n top : 'n-resize',\n left : 'w-resize',\n bottom : 's-resize',\n right : 'e-resize',\n topleft : 'se-resize',\n bottomright: 'se-resize',\n topright : 'ne-resize',\n bottomleft : 'ne-resize',\n } : {\n x : 'ew-resize',\n y : 'ns-resize',\n xy: 'nwse-resize',\n\n top : 'ns-resize',\n left : 'ew-resize',\n bottom : 'ns-resize',\n right : 'ew-resize',\n topleft : 'nwse-resize',\n bottomright: 'nwse-resize',\n topright : 'nesw-resize',\n bottomleft : 'nesw-resize',\n }),\n\n getCursor: function (action) {\n if (action.axis) {\n return resize.cursors[action.name + action.axis];\n }\n else if (action.edges) {\n let cursorKey = '';\n const edgeNames = ['top', 'bottom', 'left', 'right'];\n\n for (let i = 0; i < 4; i++) {\n if (action.edges[edgeNames[i]]) {\n cursorKey += edgeNames[i];\n }\n }\n\n return resize.cursors[cursorKey];\n }\n },\n};\n\n// resizestart\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'resizestart' || !interaction.prepared.edges) {\n return;\n }\n\n const startRect = interaction.target.getRect(interaction.element);\n const resizeOptions = interaction.target.options.resize;\n\n /*\n * When using the `resizable.square` or `resizable.preserveAspectRatio` options, resizing from one edge\n * will affect another. E.g. with `resizable.square`, resizing to make the right edge larger will make\n * the bottom edge larger by the same amount. We call these 'linked' edges. Any linked edges will depend\n * on the active edges and the edge being interacted with.\n */\n if (resizeOptions.square || resizeOptions.preserveAspectRatio) {\n const linkedEdges = utils.extend({}, interaction.prepared.edges);\n\n linkedEdges.top = linkedEdges.top || (linkedEdges.left && !linkedEdges.bottom);\n linkedEdges.left = linkedEdges.left || (linkedEdges.top && !linkedEdges.right );\n linkedEdges.bottom = linkedEdges.bottom || (linkedEdges.right && !linkedEdges.top );\n linkedEdges.right = linkedEdges.right || (linkedEdges.bottom && !linkedEdges.left );\n\n interaction.prepared._linkedEdges = linkedEdges;\n }\n else {\n interaction.prepared._linkedEdges = null;\n }\n\n // if using `resizable.preserveAspectRatio` option, record aspect ratio at the start of the resize\n if (resizeOptions.preserveAspectRatio) {\n interaction.resizeStartAspectRatio = startRect.width / startRect.height;\n }\n\n interaction.resizeRects = {\n start : startRect,\n current : utils.extend({}, startRect),\n inverted : utils.extend({}, startRect),\n previous : utils.extend({}, startRect),\n delta : {\n left: 0, right : 0, width : 0,\n top : 0, bottom: 0, height: 0,\n },\n };\n\n iEvent.rect = interaction.resizeRects.inverted;\n iEvent.deltaRect = interaction.resizeRects.delta;\n});\n\n// resizemove\nInteractEvent.signals.on('new', function ({ iEvent, phase, interaction }) {\n if (phase !== 'move' || !interaction.prepared.edges) { return; }\n\n const resizeOptions = interaction.target.options.resize;\n const invert = resizeOptions.invert;\n const invertible = invert === 'reposition' || invert === 'negate';\n\n let edges = interaction.prepared.edges;\n\n const start = interaction.resizeRects.start;\n const current = interaction.resizeRects.current;\n const inverted = interaction.resizeRects.inverted;\n const delta = interaction.resizeRects.delta;\n const previous = utils.extend(interaction.resizeRects.previous, inverted);\n const originalEdges = edges;\n\n let dx = iEvent.dx;\n let dy = iEvent.dy;\n\n if (resizeOptions.preserveAspectRatio || resizeOptions.square) {\n // `resize.preserveAspectRatio` takes precedence over `resize.square`\n const startAspectRatio = resizeOptions.preserveAspectRatio\n ? interaction.resizeStartAspectRatio\n : 1;\n\n edges = interaction.prepared._linkedEdges;\n\n if ((originalEdges.left && originalEdges.bottom)\n || (originalEdges.right && originalEdges.top)) {\n dy = -dx / startAspectRatio;\n }\n else if (originalEdges.left || originalEdges.right ) { dy = dx / startAspectRatio; }\n else if (originalEdges.top || originalEdges.bottom) { dx = dy * startAspectRatio; }\n }\n\n // update the 'current' rect without modifications\n if (edges.top ) { current.top += dy; }\n if (edges.bottom) { current.bottom += dy; }\n if (edges.left ) { current.left += dx; }\n if (edges.right ) { current.right += dx; }\n\n if (invertible) {\n // if invertible, copy the current rect\n utils.extend(inverted, current);\n\n if (invert === 'reposition') {\n // swap edge values if necessary to keep width/height positive\n let swap;\n\n if (inverted.top > inverted.bottom) {\n swap = inverted.top;\n\n inverted.top = inverted.bottom;\n inverted.bottom = swap;\n }\n if (inverted.left > inverted.right) {\n swap = inverted.left;\n\n inverted.left = inverted.right;\n inverted.right = swap;\n }\n }\n }\n else {\n // if not invertible, restrict to minimum of 0x0 rect\n inverted.top = Math.min(current.top, start.bottom);\n inverted.bottom = Math.max(current.bottom, start.top);\n inverted.left = Math.min(current.left, start.right);\n inverted.right = Math.max(current.right, start.left);\n }\n\n inverted.width = inverted.right - inverted.left;\n inverted.height = inverted.bottom - inverted.top ;\n\n for (const edge in inverted) {\n delta[edge] = inverted[edge] - previous[edge];\n }\n\n iEvent.edges = interaction.prepared.edges;\n iEvent.rect = inverted;\n iEvent.deltaRect = delta;\n});\n\n/*\\\n * Interactable.resizable\n [ method ]\n *\n * Gets or sets whether resize actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of resize elements\n | var isResizeable = interact('input[type=text]').resizable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on resize events (object makes the Interactable resizable)\n = (object) This Interactable\n | interact(element).resizable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | edges: {\n | top : true, // Use pointer coords to check for resize.\n | left : false, // Disable resizing from left edge.\n | bottom: '.resize-s',// Resize if pointer target matches selector\n | right : handleEl // Resize if pointer target is the given Element\n | },\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height are adjusted at a 1:1 ratio.\n | square: false,\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height maintain the aspect ratio they had when resizing started.\n | preserveAspectRatio: false,\n |\n | // a value of 'none' will limit the resize rect to a minimum of 0x0\n | // 'negate' will allow the rect to have negative width/height\n | // 'reposition' will keep the width/height positive by swapping\n | // the top and bottom edges and/or swapping the left and right edges\n | invert: 'none' || 'negate' || 'reposition'\n |\n | // limit multiple resizes.\n | // See the explanation in the @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n \\*/\nInteractable.prototype.resizable = function (options) {\n if (utils.is.object(options)) {\n this.options.resize.enabled = options.enabled === false? false: true;\n this.setPerAction('resize', options);\n this.setOnEvents('resize', options);\n\n if (/^x$|^y$|^xy$/.test(options.axis)) {\n this.options.resize.axis = options.axis;\n }\n else if (options.axis === null) {\n this.options.resize.axis = defaultOptions.resize.axis;\n }\n\n if (utils.is.bool(options.preserveAspectRatio)) {\n this.options.resize.preserveAspectRatio = options.preserveAspectRatio;\n }\n else if (utils.is.bool(options.square)) {\n this.options.resize.square = options.square;\n }\n\n return this;\n }\n if (utils.is.bool(options)) {\n this.options.resize.enabled = options;\n\n if (!options) {\n this.onresizestart = this.onresizestart = this.onresizeend = null;\n }\n\n return this;\n }\n return this.options.resize;\n};\n\nfunction checkResizeEdge (name, value, page, element, interactableElement, rect, margin) {\n // false, '', undefined, null\n if (!value) { return false; }\n\n // true value, use pointer coords and element rect\n if (value === true) {\n // if dimensions are negative, \"switch\" edges\n const width = utils.is.number(rect.width )? rect.width : rect.right - rect.left;\n const height = utils.is.number(rect.height)? rect.height : rect.bottom - rect.top ;\n\n if (width < 0) {\n if (name === 'left' ) { name = 'right'; }\n else if (name === 'right') { name = 'left' ; }\n }\n if (height < 0) {\n if (name === 'top' ) { name = 'bottom'; }\n else if (name === 'bottom') { name = 'top' ; }\n }\n\n if (name === 'left' ) { return page.x < ((width >= 0? rect.left: rect.right ) + margin); }\n if (name === 'top' ) { return page.y < ((height >= 0? rect.top : rect.bottom) + margin); }\n\n if (name === 'right' ) { return page.x > ((width >= 0? rect.right : rect.left) - margin); }\n if (name === 'bottom') { return page.y > ((height >= 0? rect.bottom: rect.top ) - margin); }\n }\n\n // the remaining checks require an element\n if (!utils.is.element(element)) { return false; }\n\n return utils.is.element(value)\n // the value is an element to use as a resize handle\n ? value === element\n // otherwise check if element matches value as selector\n : utils.matchesUpTo(element, value, interactableElement);\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.resizeAxes = 'xy';\n});\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action }) {\n if (action !== 'resize' || !interaction.resizeAxes) { return; }\n\n const options = interaction.target.options;\n\n if (options.resize.square) {\n if (interaction.resizeAxes === 'y') {\n iEvent.dx = iEvent.dy;\n }\n else {\n iEvent.dy = iEvent.dx;\n }\n iEvent.axes = 'xy';\n }\n else {\n iEvent.axes = interaction.resizeAxes;\n\n if (interaction.resizeAxes === 'x') {\n iEvent.dy = 0;\n }\n else if (interaction.resizeAxes === 'y') {\n iEvent.dx = 0;\n }\n }\n});\n\nactions.resize = resize;\nactions.names.push('resize');\nutils.merge(Interactable.eventTypes, [\n 'resizestart',\n 'resizemove',\n 'resizeinertiastart',\n 'resizeinertiaresume',\n 'resizeend',\n]);\nactions.methodDict.resize = 'resizable';\n\ndefaultOptions.resize = resize.defaults;\n\nmodule.exports = resize;\n","const raf = require('./utils/raf');\nconst getWindow = require('./utils/window').getWindow;\nconst is = require('./utils/is');\nconst domUtils = require('./utils/domUtils');\nconst Interaction = require('./Interaction');\nconst defaultOptions = require('./defaultOptions');\n\nconst autoScroll = {\n defaults: {\n enabled : false,\n container: null, // the item that is scrolled (Window or HTMLElement)\n margin : 60,\n speed : 300, // the scroll speed in pixels per second\n },\n\n interaction: null,\n i: null, // the handle returned by window.setInterval\n x: 0, y: 0, // Direction each pulse is to scroll in\n\n isScrolling: false,\n prevTime: 0,\n\n start: function (interaction) {\n autoScroll.isScrolling = true;\n raf.cancel(autoScroll.i);\n\n autoScroll.interaction = interaction;\n autoScroll.prevTime = new Date().getTime();\n autoScroll.i = raf.request(autoScroll.scroll);\n },\n\n stop: function () {\n autoScroll.isScrolling = false;\n raf.cancel(autoScroll.i);\n },\n\n // scroll the window by the values in scroll.x/y\n scroll: function () {\n const options = autoScroll.interaction.target.options[autoScroll.interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(autoScroll.interaction.element);\n const now = new Date().getTime();\n // change in time in seconds\n const dt = (now - autoScroll.prevTime) / 1000;\n // displacement\n const s = options.speed * dt;\n\n if (s >= 1) {\n if (is.window(container)) {\n container.scrollBy(autoScroll.x * s, autoScroll.y * s);\n }\n else if (container) {\n container.scrollLeft += autoScroll.x * s;\n container.scrollTop += autoScroll.y * s;\n }\n\n autoScroll.prevTime = now;\n }\n\n if (autoScroll.isScrolling) {\n raf.cancel(autoScroll.i);\n autoScroll.i = raf.request(autoScroll.scroll);\n }\n },\n check: function (interactable, actionName) {\n const options = interactable.options;\n\n return options[actionName].autoScroll && options[actionName].autoScroll.enabled;\n },\n onInteractionMove: function ({ interaction, pointer }) {\n if (!(interaction.interacting()\n && autoScroll.check(interaction.target, interaction.prepared.name))) {\n return;\n }\n\n if (interaction.simulation) {\n autoScroll.x = autoScroll.y = 0;\n return;\n }\n\n let top;\n let right;\n let bottom;\n let left;\n\n const options = interaction.target.options[interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(interaction.element);\n\n if (is.window(container)) {\n left = pointer.clientX < autoScroll.margin;\n top = pointer.clientY < autoScroll.margin;\n right = pointer.clientX > container.innerWidth - autoScroll.margin;\n bottom = pointer.clientY > container.innerHeight - autoScroll.margin;\n }\n else {\n const rect = domUtils.getElementClientRect(container);\n\n left = pointer.clientX < rect.left + autoScroll.margin;\n top = pointer.clientY < rect.top + autoScroll.margin;\n right = pointer.clientX > rect.right - autoScroll.margin;\n bottom = pointer.clientY > rect.bottom - autoScroll.margin;\n }\n\n autoScroll.x = (right ? 1: left? -1: 0);\n autoScroll.y = (bottom? 1: top? -1: 0);\n\n if (!autoScroll.isScrolling) {\n // set the autoScroll properties to those of the target\n autoScroll.margin = options.margin;\n autoScroll.speed = options.speed;\n\n autoScroll.start(interaction);\n }\n },\n};\n\nInteraction.signals.on('stop-active', function () {\n autoScroll.stop();\n});\n\nInteraction.signals.on('action-move', autoScroll.onInteractionMove);\n\ndefaultOptions.perAction.autoScroll = autoScroll.defaults;\n\nmodule.exports = autoScroll;\n","const Interactable = require('../Interactable');\nconst actions = require('../actions/base');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.ignoreFrom\n [ method ]\n *\n * If the target of the `mousedown`, `pointerdown` or `touchstart`\n * event or any of it's parents match the given CSS selector or\n * Element, no drag/resize/gesture is started.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to not ignore any elements\n = (string | Element | object) The current ignoreFrom value or this Interactable\n **\n | interact(element, { ignoreFrom: document.getElementById('no-action') });\n | // or\n | interact(element).ignoreFrom('input, textarea, a');\n\\*/\nInteractable.prototype.ignoreFrom = function (newValue) {\n return this._backCompatOption('ignoreFrom', newValue);\n};\n\n/*\\\n * Interactable.allowFrom\n [ method ]\n *\n * A drag/resize/gesture is started only If the target of the\n * `mousedown`, `pointerdown` or `touchstart` event or any of it's\n * parents match the given CSS selector or Element.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to allow from any element\n = (string | Element | object) The current allowFrom value or this Interactable\n **\n | interact(element, { allowFrom: document.getElementById('drag-handle') });\n | // or\n | interact(element).allowFrom('.handle');\n\\*/\nInteractable.prototype.allowFrom = function (newValue) {\n return this._backCompatOption('allowFrom', newValue);\n};\n\nInteractable.prototype.testIgnore = function (ignoreFrom, interactableElement, element) {\n if (!ignoreFrom || !is.element(element)) { return false; }\n\n if (is.string(ignoreFrom)) {\n return domUtils.matchesUpTo(element, ignoreFrom, interactableElement);\n }\n else if (is.element(ignoreFrom)) {\n return domUtils.nodeContains(ignoreFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testAllow = function (allowFrom, interactableElement, element) {\n if (!allowFrom) { return true; }\n\n if (!is.element(element)) { return false; }\n\n if (is.string(allowFrom)) {\n return domUtils.matchesUpTo(element, allowFrom, interactableElement);\n }\n else if (is.element(allowFrom)) {\n return domUtils.nodeContains(allowFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testIgnoreAllow = function (options, interactableElement, eventTarget) {\n return (!this.testIgnore(options.ignoreFrom, interactableElement, eventTarget)\n && this.testAllow(options.allowFrom, interactableElement, eventTarget));\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (event.buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\n","const interact = require('../interact');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst actions = require('../actions/base');\nconst defaultOptions = require('../defaultOptions');\nconst browser = require('../utils/browser');\nconst scope = require('../scope');\nconst utils = require('../utils');\nconst signals = require('../utils/Signals').new();\n\nrequire('./InteractableMethods');\n\nconst autoStart = {\n signals,\n withinInteractionLimit,\n // Allow this many interactions to happen simultaneously\n maxInteractions: Infinity,\n defaults: {\n perAction: {\n manualStart: false,\n max: Infinity,\n maxPerElement: 1,\n allowFrom: null,\n ignoreFrom: null,\n },\n },\n setActionDefaults: function (action) {\n utils.extend(action.defaults, autoStart.defaults.perAction);\n },\n};\n\n// set cursor style on mousedown\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget }) {\n if (interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\n// set cursor style on mousemove\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget }) {\n if (!interaction.mouse\n || interaction.pointerIsDown\n || interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\nInteraction.signals.on('move', function (arg) {\n const { interaction, event } = arg;\n\n if (!interaction.pointerIsDown\n || interaction.interacting()\n || !interaction.pointerWasMoved\n || !interaction.prepared.name) {\n return;\n }\n\n signals.fire('before-start', arg);\n\n const target = interaction.target;\n\n if (interaction.prepared.name && target) {\n // check manualStart and interaction limit\n if (target.options[interaction.prepared.name].manualStart\n || !withinInteractionLimit(target, interaction.element, interaction.prepared)) {\n interaction.stop(event);\n }\n else {\n interaction.start(interaction.prepared, target, interaction.element);\n }\n }\n});\n\n// Check if the current target supports the action.\n// If so, return the validated action. Otherwise, return null\nfunction validateAction (action, interactable, element, eventTarget) {\n if (utils.is.object(action)\n && interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget)\n && interactable.options[action.name].enabled\n && withinInteractionLimit(interactable, element, action)) {\n return action;\n }\n\n return null;\n}\n\nfunction validateSelector (interaction, pointer, event, matches, matchElements, eventTarget) {\n for (let i = 0, len = matches.length; i < len; i++) {\n const match = matches[i];\n const matchElement = matchElements[i];\n const action = validateAction(match.getAction(pointer, event, interaction, matchElement),\n match,\n matchElement,\n eventTarget);\n\n if (action) {\n return {\n action,\n target: match,\n element: matchElement,\n };\n }\n }\n\n return {};\n}\n\nfunction getActionInfo (interaction, pointer, event, eventTarget) {\n let matches = [];\n let matchElements = [];\n\n let element = eventTarget;\n let action = null;\n\n function pushMatches (interactable, selector, context) {\n const elements = (browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined);\n\n if (utils.matchesSelector(element, selector, elements)) {\n\n matches.push(interactable);\n matchElements.push(element);\n }\n }\n\n while (utils.is.element(element)) {\n matches = [];\n matchElements = [];\n\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && (action = validateAction(elementInteractable.getAction(pointer, event, interaction, element, eventTarget),\n elementInteractable,\n element,\n eventTarget))\n && !elementInteractable.options[action.name].manualStart) {\n return {\n element,\n action,\n target: elementInteractable,\n };\n }\n else {\n scope.interactables.forEachSelector(pushMatches, element);\n\n const actionInfo = validateSelector(interaction, pointer, event, matches, matchElements, eventTarget);\n\n if (actionInfo.action\n && !actionInfo.target.options[actionInfo.action.name].manualStart) {\n return actionInfo;\n }\n }\n\n element = utils.parentNode(element);\n }\n\n return {};\n}\n\nfunction prepare (interaction, { action, target, element }) {\n action = action || {};\n\n if (interaction.target && interaction.target.options.styleCursor) {\n interaction.target._doc.documentElement.style.cursor = '';\n }\n\n interaction.target = target;\n interaction.element = element;\n utils.copyAction(interaction.prepared, action);\n\n if (target && target.options.styleCursor) {\n const cursor = action? actions[action.name].getCursor(action) : '';\n interaction.target._doc.documentElement.style.cursor = cursor;\n }\n\n signals.fire('prepared', { interaction: interaction });\n}\n\nInteraction.signals.on('stop', function ({ interaction }) {\n const target = interaction.target;\n\n if (target && target.options.styleCursor) {\n target._doc.documentElement.style.cursor = '';\n }\n});\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (utils.is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (utils.is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n const buttons = event.buttons || ({\n 0: 1,\n 1: 4,\n 3: 8,\n 4: 16,\n })[event.button];\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\nfunction withinInteractionLimit (interactable, element, action) {\n const options = interactable.options;\n const maxActions = options[action.name].max;\n const maxPerElement = options[action.name].maxPerElement;\n let activeInteractions = 0;\n let targetCount = 0;\n let targetElementCount = 0;\n\n // no actions if any of these values == 0\n if (!(maxActions && maxPerElement && autoStart.maxInteractions)) { return; }\n\n for (let i = 0, len = scope.interactions.length; i < len; i++) {\n const interaction = scope.interactions[i];\n const otherAction = interaction.prepared.name;\n\n if (!interaction.interacting()) { continue; }\n\n activeInteractions++;\n\n if (activeInteractions >= autoStart.maxInteractions) {\n return false;\n }\n\n if (interaction.target !== interactable) { continue; }\n\n targetCount += (otherAction === action.name)|0;\n\n if (targetCount >= maxActions) {\n return false;\n }\n\n if (interaction.element === element) {\n targetElementCount++;\n\n if (otherAction !== action.name || targetElementCount >= maxPerElement) {\n return false;\n }\n }\n }\n\n return autoStart.maxInteractions > 0;\n}\n\n/*\\\n * interact.maxInteractions\n [ method ]\n **\n * Returns or sets the maximum number of concurrent interactions allowed.\n * By default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables\n * and elements, you need to enable it in the draggable, resizable and\n * gesturable `'max'` and `'maxPerElement'` options.\n **\n - newValue (number) #optional Any number. newValue <= 0 means no interactions.\n\\*/\ninteract.maxInteractions = function (newValue) {\n if (utils.is.number(newValue)) {\n autoStart.maxInteractions = newValue;\n\n return this;\n }\n\n return autoStart.maxInteractions;\n};\n\nInteractable.settingsMethods.push('styleCursor');\nInteractable.settingsMethods.push('actionChecker');\nInteractable.settingsMethods.push('ignoreFrom');\nInteractable.settingsMethods.push('allowFrom');\n\ndefaultOptions.base.actionChecker = null;\ndefaultOptions.base.styleCursor = true;\n\nutils.extend(defaultOptions.perAction, autoStart.defaults.perAction);\n\nmodule.exports = autoStart;\n","const autoStart = require('./base');\nconst Interaction = require('../Interaction');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.delayTimer = null;\n});\n\nautoStart.signals.on('prepared', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.delayTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.target, interaction.element);\n }, delay);\n }\n});\n\nInteraction.signals.on('move', function ({ interaction, duplicate }) {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.delayTimer);\n }\n});\n\n// prevent regular down->move autoStart\nautoStart.signals.on('before-start', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.prepared.name = null;\n }\n});\n","const autoStart = require('./base');\nconst scope = require('../scope');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\n\nconst { matchesSelector, parentNode } = require('../utils/domUtils');\n\nautoStart.setActionDefaults(require('../actions/drag'));\n\nautoStart.signals.on('before-start', function ({ interaction, eventTarget, dx, dy }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // check if a drag is in the correct axis\n const absX = Math.abs(dx);\n const absY = Math.abs(dy);\n const options = interaction.target.options.drag;\n const startAxis = options.startAxis;\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy');\n\n interaction.prepared.axis = options.lockAxis === 'start'\n ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n : options.lockAxis;\n\n // if the movement isn't in the startAxis of the interactable\n if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) {\n // cancel the prepared action\n interaction.prepared.name = null;\n\n // then try to get a drag from another ineractable\n\n if (!interaction.prepared.name) {\n\n let element = eventTarget;\n\n const getDraggable = function (interactable, selector, context) {\n const elements = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n if (interactable === interaction.target) { return; }\n\n if (!options.manualStart\n && !interactable.testIgnoreAllow(options, element, eventTarget)\n && matchesSelector(element, selector, elements)) {\n\n const action = interactable.getAction(interaction.downPointer,\n interaction.downEvent,\n interaction,\n element);\n\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, interactable)\n && autoStart.validateAction(action, interactable, element, eventTarget)) {\n\n return interactable;\n }\n }\n };\n\n let action = null;\n\n // check all interactables\n while (is.element(element)) {\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && elementInteractable !== interaction.target\n && !elementInteractable.options.drag.manualStart) {\n\n action = elementInteractable.getAction(interaction.downPointer, interaction.downEvent, interaction, element);\n }\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, elementInteractable)) {\n\n interaction.prepared.name = 'drag';\n interaction.target = elementInteractable;\n interaction.element = element;\n break;\n }\n\n const selectorInteractable = scope.interactables.forEachSelector(getDraggable, element);\n\n if (selectorInteractable) {\n interaction.prepared.name = 'drag';\n interaction.target = selectorInteractable;\n interaction.element = element;\n break;\n }\n\n element = parentNode(element);\n }\n }\n }\n});\n\nfunction checkStartAxis (startAxis, interactable) {\n if (!interactable) { return false; }\n\n const thisAxis = interactable.options.drag.startAxis;\n\n return (startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis);\n}\n","require('./base').setActionDefaults(require('../actions/gesture'));\n","require('./base').setActionDefaults(require('../actions/resize'));\n","module.exports = {\n base: {\n accept : null,\n preventDefault: 'auto',\n deltaSource : 'page',\n },\n\n perAction: {\n origin: { x: 0, y: 0 },\n\n // only allow left button by default\n // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n mouseButtons: 1,\n\n inertia: {\n enabled : false,\n resistance : 10, // the lambda in exponential decay\n minSpeed : 100, // target speed must be above this for inertia to start\n endSpeed : 10, // the speed at which inertia is slow enough to stop\n allowResume : true, // allow resuming an action in inertia phase\n smoothEndDuration: 300, // animate to snap/restrict endOnly if there's no inertia\n },\n },\n};\n","/* browser entry point */\n\n// Legacy browser support\nrequire('./legacyBrowsers');\n\n// inertia\nrequire('./inertia');\n\n// modifiers\nrequire('./modifiers/snap');\nrequire('./modifiers/restrict');\n\n// pointerEvents\nrequire('./pointerEvents/base');\nrequire('./pointerEvents/holdRepeat');\nrequire('./pointerEvents/interactableTargets');\n\n// delay\nrequire('./autoStart/delay');\n\n// actions\nrequire('./actions/gesture');\nrequire('./actions/resize');\nrequire('./actions/drag');\nrequire('./actions/drop');\n\n// load these modifiers after resize is loaded\nrequire('./modifiers/snapSize');\nrequire('./modifiers/restrictEdges');\nrequire('./modifiers/restrictSize');\n\n// autoStart actions\nrequire('./autoStart/gesture');\nrequire('./autoStart/resize');\nrequire('./autoStart/drag');\n\n// Interactable preventDefault setting\nrequire('./interactablePreventDefault.js');\n\n// autoScroll\nrequire('./autoScroll');\n\n// export interact\nmodule.exports = require('./interact');\n","const InteractEvent = require('./InteractEvent');\nconst Interaction = require('./Interaction');\nconst modifiers = require('./modifiers');\nconst utils = require('./utils');\nconst animationFrame = require('./utils/raf');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.inertiaStatus = {\n active : false,\n smoothEnd : false,\n allowResume: false,\n\n startEvent: null,\n upCoords : {},\n\n xe: 0, ye: 0,\n sx: 0, sy: 0,\n\n t0: 0,\n vx0: 0, vys: 0,\n duration: 0,\n\n lambda_v0: 0,\n one_ve_v0: 0,\n i : null,\n };\n\n interaction.boundInertiaFrame = () => inertiaFrame .apply(interaction);\n interaction.boundSmoothEndFrame = () => smoothEndFrame.apply(interaction);\n});\n\nInteraction.signals.on('down', function ({ interaction, event, pointer, eventTarget }) {\n const status = interaction.inertiaStatus;\n\n // Check if the down event hits the current inertia target\n if (status.active) {\n let element = eventTarget;\n\n // climb up the DOM tree from the event target\n while (utils.is.element(element)) {\n\n // if interaction element is the current inertia target element\n if (element === interaction.element) {\n // stop inertia\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n\n // update pointers to the down event's coordinates\n interaction.updatePointer(pointer);\n utils.setCoords(interaction.curCoords, interaction.pointers);\n\n // fire appropriate signals\n const signalArg = { interaction };\n Interaction.signals.fire('before-action-move', signalArg);\n Interaction.signals.fire('action-resume' , signalArg);\n\n // fire a reume event\n const resumeEvent = new InteractEvent(interaction,\n event,\n interaction.prepared.name,\n 'inertiaresume',\n interaction.element);\n\n interaction.target.fire(resumeEvent);\n interaction.prevEvent = resumeEvent;\n modifiers.resetStatuses(interaction.modifierStatuses);\n\n utils.copyCoords(interaction.prevCoords, interaction.curCoords);\n break;\n }\n\n element = utils.parentNode(element);\n }\n }\n});\n\nInteraction.signals.on('up', function ({ interaction, event }) {\n const status = interaction.inertiaStatus;\n\n if (!interaction.interacting() || status.active) { return; }\n\n const target = interaction.target;\n const options = target && target.options;\n const inertiaOptions = options && interaction.prepared.name && options[interaction.prepared.name].inertia;\n\n const now = new Date().getTime();\n const statuses = {};\n const page = utils.extend({}, interaction.curCoords.page);\n const pointerSpeed = interaction.pointerDelta.client.speed;\n\n let smoothEnd = false;\n let modifierResult;\n\n // check if inertia should be started\n const inertiaPossible = (inertiaOptions && inertiaOptions.enabled\n && interaction.prepared.name !== 'gesture'\n && event !== status.startEvent);\n\n const inertia = (inertiaPossible\n && (now - interaction.curCoords.timeStamp) < 50\n && pointerSpeed > inertiaOptions.minSpeed\n && pointerSpeed > inertiaOptions.endSpeed);\n\n const modifierArg = {\n interaction,\n pageCoords: page,\n statuses,\n preEnd: true,\n requireEndOnly: true,\n };\n\n // smoothEnd\n if (inertiaPossible && !inertia) {\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n if (modifierResult.shouldMove && modifierResult.locked) {\n smoothEnd = true;\n }\n }\n\n if (!(inertia || smoothEnd)) { return; }\n\n utils.copyCoords(status.upCoords, interaction.curCoords);\n\n interaction.pointers[0] = status.startEvent =\n new InteractEvent(interaction, event, interaction.prepared.name, 'inertiastart', interaction.element);\n\n status.t0 = now;\n\n status.active = true;\n status.allowResume = inertiaOptions.allowResume;\n interaction.simulation = status;\n\n target.fire(status.startEvent);\n\n if (inertia) {\n status.vx0 = interaction.pointerDelta.client.vx;\n status.vy0 = interaction.pointerDelta.client.vy;\n status.v0 = pointerSpeed;\n\n calcInertia(interaction, status);\n\n utils.extend(page, interaction.curCoords.page);\n\n page.x += status.xe;\n page.y += status.ye;\n\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n status.modifiedXe += modifierResult.dx;\n status.modifiedYe += modifierResult.dy;\n\n status.i = animationFrame.request(interaction.boundInertiaFrame);\n }\n else {\n status.smoothEnd = true;\n status.xe = modifierResult.dx;\n status.ye = modifierResult.dy;\n\n status.sx = status.sy = 0;\n\n status.i = animationFrame.request(interaction.boundSmoothEndFrame);\n }\n});\n\nInteraction.signals.on('stop-active', function ({ interaction }) {\n const status = interaction.inertiaStatus;\n\n if (status.active) {\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n }\n});\n\nfunction calcInertia (interaction, status) {\n const inertiaOptions = interaction.target.options[interaction.prepared.name].inertia;\n const lambda = inertiaOptions.resistance;\n const inertiaDur = -Math.log(inertiaOptions.endSpeed / status.v0) / lambda;\n\n status.x0 = interaction.prevEvent.pageX;\n status.y0 = interaction.prevEvent.pageY;\n status.t0 = status.startEvent.timeStamp / 1000;\n status.sx = status.sy = 0;\n\n status.modifiedXe = status.xe = (status.vx0 - inertiaDur) / lambda;\n status.modifiedYe = status.ye = (status.vy0 - inertiaDur) / lambda;\n status.te = inertiaDur;\n\n status.lambda_v0 = lambda / status.v0;\n status.one_ve_v0 = 1 - inertiaOptions.endSpeed / status.v0;\n}\n\nfunction inertiaFrame () {\n updateInertiaCoords(this);\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n\n const status = this.inertiaStatus;\n const options = this.target.options[this.prepared.name].inertia;\n const lambda = options.resistance;\n const t = new Date().getTime() / 1000 - status.t0;\n\n if (t < status.te) {\n\n const progress = 1 - (Math.exp(-lambda * t) - status.lambda_v0) / status.one_ve_v0;\n\n if (status.modifiedXe === status.xe && status.modifiedYe === status.ye) {\n status.sx = status.xe * progress;\n status.sy = status.ye * progress;\n }\n else {\n const quadPoint = utils.getQuadraticCurvePoint(0, 0,\n status.xe,\n status.ye,\n status.modifiedXe,\n status.modifiedYe,\n progress);\n\n status.sx = quadPoint.x;\n status.sy = quadPoint.y;\n }\n\n this.doMove();\n\n status.i = animationFrame.request(this.boundInertiaFrame);\n }\n else {\n status.sx = status.modifiedXe;\n status.sy = status.modifiedYe;\n\n this.doMove();\n this.end(status.startEvent);\n status.active = false;\n this.simulation = null;\n }\n\n utils.copyCoords(this.prevCoords, this.curCoords);\n}\n\nfunction smoothEndFrame () {\n updateInertiaCoords(this);\n\n const status = this.inertiaStatus;\n const t = new Date().getTime() - status.t0;\n const duration = this.target.options[this.prepared.name].inertia.smoothEndDuration;\n\n if (t < duration) {\n status.sx = utils.easeOutQuad(t, 0, status.xe, duration);\n status.sy = utils.easeOutQuad(t, 0, status.ye, duration);\n\n this.pointerMove(status.startEvent, status.startEvent);\n\n status.i = animationFrame.request(this.boundSmoothEndFrame);\n }\n else {\n status.sx = status.xe;\n status.sy = status.ye;\n\n this.pointerMove(status.startEvent, status.startEvent);\n this.end(status.startEvent);\n\n status.smoothEnd =\n status.active = false;\n this.simulation = null;\n }\n}\n\nfunction updateInertiaCoords (interaction) {\n const status = interaction.inertiaStatus;\n\n // return if inertia isn't running\n if (!status.active) { return; }\n\n const pageUp = status.upCoords.page;\n const clientUp = status.upCoords.client;\n\n utils.setCoords(interaction.curCoords, [ {\n pageX : pageUp.x + status.sx,\n pageY : pageUp.y + status.sy,\n clientX: clientUp.x + status.sx,\n clientY: clientUp.y + status.sy,\n } ]);\n}\n","const browser = require('./utils/browser');\nconst events = require('./utils/events');\nconst utils = require('./utils');\nconst scope = require('./scope');\nconst Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\n\nconst globalEvents = {};\n\n/*\\\n * interact\n [ method ]\n *\n * The methods of this variable can be used to set elements as\n * interactables and also to change various default settings.\n *\n * Calling it as a function and passing an element or a valid CSS selector\n * string returns an Interactable object which has various methods to\n * configure it.\n *\n - element (Element | string) The HTML or SVG Element to interact with or CSS selector\n = (object) An @Interactable\n *\n > Usage\n | interact('#draggable').draggable(true);\n |\n | var rectables = interact('rect');\n | rectables\n | .gesturable(true)\n | .on('gesturemove', function (event) {\n | // ...\n | });\n\\*/\nfunction interact (element, options) {\n let interactable = scope.interactables.get(element, options);\n\n if (!interactable) {\n interactable = new Interactable(element, options);\n interactable.events.global = globalEvents;\n }\n\n return interactable;\n}\n\n/*\\\n * interact.isSet\n [ method ]\n *\n * Check if an element has been set\n - element (Element) The Element being searched for\n = (boolean) Indicates if the element or CSS selector was previously passed to interact\n\\*/\ninteract.isSet = function (element, options) {\n return scope.interactables.indexOfElement(element, options && options.context) !== -1;\n};\n\n/*\\\n * interact.on\n [ method ]\n *\n * Adds a global listener for an InteractEvent or adds a DOM event to\n * `document`\n *\n - type (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) interact\n\\*/\ninteract.on = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.on(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.on(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n // if it is an InteractEvent type, add listener to globalEvents\n if (utils.contains(Interactable.eventTypes, type)) {\n // if this type of event was never bound\n if (!globalEvents[type]) {\n globalEvents[type] = [listener];\n }\n else {\n globalEvents[type].push(listener);\n }\n }\n // If non InteractEvent type, addEventListener to document\n else {\n events.add(scope.document, type, listener, { options });\n }\n\n return interact;\n};\n\n/*\\\n * interact.off\n [ method ]\n *\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n - type (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) interact\n \\*/\ninteract.off = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.off(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.off(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n if (!utils.contains(Interactable.eventTypes, type)) {\n events.remove(scope.document, type, listener, options);\n }\n else {\n let index;\n\n if (type in globalEvents\n && (index = utils.indexOf(globalEvents[type], listener)) !== -1) {\n globalEvents[type].splice(index, 1);\n }\n }\n\n return interact;\n};\n\n/*\\\n * interact.debug\n [ method ]\n *\n * Returns an object which exposes internal data\n = (object) An object with properties that outline the current state and expose internal functions and variables\n\\*/\ninteract.debug = function () {\n return scope;\n};\n\n// expose the functions used to calculate multi-touch properties\ninteract.getPointerAverage = utils.pointerAverage;\ninteract.getTouchBBox = utils.touchBBox;\ninteract.getTouchDistance = utils.touchDistance;\ninteract.getTouchAngle = utils.touchAngle;\n\ninteract.getElementRect = utils.getElementRect;\ninteract.getElementClientRect = utils.getElementClientRect;\ninteract.matchesSelector = utils.matchesSelector;\ninteract.closest = utils.closest;\n\n/*\\\n * interact.supportsTouch\n [ method ]\n *\n = (boolean) Whether or not the browser supports touch input\n\\*/\ninteract.supportsTouch = function () {\n return browser.supportsTouch;\n};\n\n/*\\\n * interact.supportsPointerEvent\n [ method ]\n *\n = (boolean) Whether or not the browser supports PointerEvents\n\\*/\ninteract.supportsPointerEvent = function () {\n return browser.supportsPointerEvent;\n};\n\n/*\\\n * interact.stop\n [ method ]\n *\n * Cancels all interactions (end events are not fired)\n *\n - event (Event) An event on which to call preventDefault()\n = (object) interact\n\\*/\ninteract.stop = function (event) {\n for (let i = scope.interactions.length - 1; i >= 0; i--) {\n scope.interactions[i].stop(event);\n }\n\n return interact;\n};\n\n/*\\\n * interact.pointerMoveTolerance\n [ method ]\n * Returns or sets the distance the pointer must be moved before an action\n * sequence occurs. This also affects tolerance for tap events.\n *\n - newValue (number) #optional The movement from the start position must be greater than this value\n = (number | Interactable) The current setting or interact\n\\*/\ninteract.pointerMoveTolerance = function (newValue) {\n if (utils.is.number(newValue)) {\n Interaction.pointerMoveTolerance = newValue;\n\n return this;\n }\n\n return Interaction.pointerMoveTolerance;\n};\n\ninteract.addDocument = scope.addDocument;\ninteract.removeDocument = scope.removeDocument;\n\nscope.interact = interact;\n\nmodule.exports = interact;\n","const Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\nconst scope = require('./scope');\nconst is = require('./utils/is');\nconst events = require('./utils/events');\n\nconst { nodeContains, matchesSelector } = require('./utils/domUtils');\n\n/*\\\n * Interactable.preventDefault\n [ method ]\n *\n * Returns or sets whether to prevent the browser's default behaviour\n * in response to pointer events. Can be set to:\n * - `'always'` to always prevent\n * - `'never'` to never prevent\n * - `'auto'` to let interact.js try to determine what would be best\n *\n - newValue (string) #optional `true`, `false` or `'auto'`\n = (string | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.preventDefault = function (newValue) {\n if (/^(always|never|auto)$/.test(newValue)) {\n this.options.preventDefault = newValue;\n return this;\n }\n\n if (is.bool(newValue)) {\n this.options.preventDefault = newValue? 'always' : 'never';\n return this;\n }\n\n return this.options.preventDefault;\n};\n\nInteractable.prototype.checkAndPreventDefault = function (event) {\n const setting = this.options.preventDefault;\n\n if (setting === 'never') { return; }\n\n if (setting === 'always') {\n event.preventDefault();\n return;\n }\n\n // setting === 'auto'\n\n // don't preventDefault if the browser supports passiveEvents\n // CSS touch-action and user-selecct should be used instead\n if (events.supportsOptions) {\n return;\n }\n\n // don't preventDefault of pointerdown events\n if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) {\n return;\n }\n\n // don't preventDefault on editable elements\n if (is.element(event.target)\n && matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) {\n return;\n }\n\n event.preventDefault();\n};\n\nfunction onInteractionEvent ({ interaction, event }) {\n if (interaction.target) {\n interaction.target.checkAndPreventDefault(event);\n }\n}\n\nfor (const eventSignal of ['down', 'move', 'up', 'cancel']) {\n Interaction.signals.on(eventSignal, onInteractionEvent);\n}\n\n// prevent native HTML5 drag on interact.js target elements\nInteraction.docEvents.dragstart = function preventNativeDrag (event) {\n for (const interaction of scope.interactions) {\n\n if (interaction.element\n && (interaction.element === event.target\n || nodeContains(interaction.element, event.target))) {\n\n interaction.target.checkAndPreventDefault(event);\n return;\n }\n }\n};\n","const scope = require('./scope');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst iFinder = require('./utils/interactionFinder');\nconst pointerEvents = require('./pointerEvents/base');\n\nconst { window } = require('./utils/window');\n\nconst toString = Object.prototype.toString;\n\nif (!window.Array.isArray) {\n window.Array.isArray = function (obj) {\n return toString.call(obj) === '[object Array]';\n };\n}\n\nif (!String.prototype.trim) {\n String.prototype.trim = function () {\n return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n };\n}\n\n// http://www.quirksmode.org/dom/events/click.html\n// >Events leading to dblclick\n//\n// IE8 doesn't fire down event before dblclick.\n// This workaround tries to fire a tap and doubletap after dblclick\nfunction onIE8Dblclick (event) {\n const eventTarget = event.target;\n const interaction = iFinder.search(event, event.type, eventTarget);\n\n if (!interaction) { return; }\n\n if (interaction.prevTap\n && event.clientX === interaction.prevTap.clientX\n && event.clientY === interaction.prevTap.clientY\n && eventTarget === interaction.prevTap.target) {\n\n interaction.downTargets[0] = eventTarget;\n interaction.downTimes [0] = new Date().getTime();\n\n pointerEvents.fire({\n interaction,\n event,\n eventTarget,\n pointer: event,\n type: 'tap',\n });\n }\n}\n\nif (browser.isIE8) {\n const selectFix = function (event) {\n for (const interaction of scope.interactions) {\n if (interaction.interacting()) {\n interaction.target.checkAndPreventDefault(event);\n }\n }\n };\n\n const onDocIE8 = function onDocIE8 ({ doc, win }, signalName) {\n const eventMethod = signalName.indexOf('listen') === 0\n ? events.add : events.remove;\n\n // For IE's lack of Event#preventDefault\n eventMethod(doc, 'selectstart', selectFix);\n\n if (pointerEvents) {\n eventMethod(doc, 'dblclick', onIE8Dblclick);\n }\n };\n\n scope.signals.on('add-document' , onDocIE8);\n scope.signals.on('remove-document', onDocIE8);\n}\n\nmodule.exports = null;\n","const InteractEvent = require('../InteractEvent');\nconst Interaction = require('../Interaction');\nconst extend = require('../utils/extend');\n\nconst modifiers = {\n names: [],\n\n setOffsets: function (arg) {\n const { interaction, pageCoords: page } = arg;\n const { target, element, startOffset } = interaction;\n const rect = target.getRect(element);\n\n if (rect) {\n startOffset.left = page.x - rect.left;\n startOffset.top = page.y - rect.top;\n\n startOffset.right = rect.right - page.x;\n startOffset.bottom = rect.bottom - page.y;\n\n if (!('width' in rect)) { rect.width = rect.right - rect.left; }\n if (!('height' in rect)) { rect.height = rect.bottom - rect.top ; }\n }\n else {\n startOffset.left = startOffset.top = startOffset.right = startOffset.bottom = 0;\n }\n\n arg.rect = rect;\n arg.interactable = target;\n arg.element = element;\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n\n arg.options = target.options[interaction.prepared.name][modifierName];\n\n if (!arg.options) {\n continue;\n }\n\n interaction.modifierOffsets[modifierName] = modifiers[modifierName].setOffset(arg);\n }\n },\n\n setAll: function (arg) {\n const { interaction, statuses, preEnd, requireEndOnly } = arg;\n const coords = extend({}, arg.pageCoords);\n const result = {\n dx: 0,\n dy: 0,\n changed: false,\n locked: false,\n shouldMove: true,\n };\n\n for (const modifierName of modifiers.names) {\n const modifier = modifiers[modifierName];\n const options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!shouldDo(options, preEnd, requireEndOnly)) { continue; }\n\n arg.status = arg.status = statuses[modifierName];\n arg.options = options;\n arg.offset = arg.interaction.modifierOffsets[modifierName];\n\n modifier.set(arg);\n\n if (arg.status.locked) {\n coords.x += arg.status.dx;\n coords.y += arg.status.dy;\n\n result.dx += arg.status.dx;\n result.dy += arg.status.dy;\n\n result.locked = true;\n }\n }\n\n // a move should be fired if:\n // - there are no modifiers enabled,\n // - no modifiers are \"locked\" i.e. have changed the pointer's coordinates, or\n // - the locked coords have changed since the last pointer move\n result.shouldMove = !arg.status || !result.locked || arg.status.changed;\n\n return result;\n },\n\n resetStatuses: function (statuses) {\n for (const modifierName of modifiers.names) {\n const status = statuses[modifierName] || {};\n\n status.dx = status.dy = 0;\n status.modifiedX = status.modifiedY = NaN;\n status.locked = false;\n status.changed = true;\n\n statuses[modifierName] = status;\n }\n\n return statuses;\n },\n\n start: function ({ interaction }, signalName) {\n const arg = {\n interaction,\n pageCoords: (signalName === 'action-resume' ?\n interaction.curCoords : interaction.startCoords).page,\n startOffset: interaction.startOffset,\n statuses: interaction.modifierStatuses,\n preEnd: false,\n requireEndOnly: false,\n };\n\n modifiers.setOffsets(arg);\n modifiers.resetStatuses(arg.statuses);\n\n arg.pageCoords = extend({}, interaction.startCoords.page);\n interaction.modifierResult = modifiers.setAll(arg);\n },\n};\n\nInteraction.signals.on('new', function (interaction) {\n interaction.startOffset = { left: 0, right: 0, top: 0, bottom: 0 };\n interaction.modifierOffsets = {};\n interaction.modifierStatuses = modifiers.resetStatuses({});\n interaction.modifierResult = null;\n});\n\nInteraction.signals.on('action-start' , modifiers.start);\nInteraction.signals.on('action-resume', modifiers.start);\n\nInteraction.signals.on('before-action-move', function ({ interaction, preEnd, interactingBeforeMove }) {\n const modifierResult = modifiers.setAll({\n interaction,\n preEnd,\n pageCoords: interaction.curCoords.page,\n statuses: interaction.modifierStatuses,\n requireEndOnly: false,\n });\n\n // don't fire an action move if a modifier would keep the event in the same\n // cordinates as before\n if (!modifierResult.shouldMove && interactingBeforeMove) {\n interaction._dontFireMove = true;\n }\n\n interaction.modifierResult = modifierResult;\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n for (let i = 0; i < modifiers.names.length; i++) {\n const options = interaction.target.options[interaction.prepared.name][modifiers.names[i]];\n\n // if the endOnly option is true for any modifier\n if (shouldDo(options, true, true)) {\n // fire a move event at the modified coordinates\n interaction.doMove({ event, preEnd: true });\n break;\n }\n }\n});\n\nInteractEvent.signals.on('set-xy', function (arg) {\n const { iEvent, interaction } = arg;\n const modifierArg = extend({}, arg);\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n modifierArg.options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!modifierArg.options) {\n continue;\n }\n\n const modifier = modifiers[modifierName];\n\n modifierArg.status = interaction.modifierStatuses[modifierName];\n\n iEvent[modifierName] = modifier.modifyCoords(modifierArg);\n }\n});\n\nfunction shouldDo (options, preEnd, requireEndOnly) {\n return (options && options.enabled\n && (preEnd || !options.endOnly)\n && (!requireEndOnly || options.endOnly));\n}\n\nmodule.exports = modifiers;\n","const modifiers = require('./index');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst restrict = {\n defaults: {\n enabled : false,\n endOnly : false,\n restriction: null,\n elementRect: null,\n },\n\n setOffset: function ({ rect, startOffset, options }) {\n const elementRect = options && options.elementRect;\n const offset = {};\n\n if (rect && elementRect) {\n offset.left = startOffset.left - (rect.width * elementRect.left);\n offset.top = startOffset.top - (rect.height * elementRect.top);\n\n offset.right = startOffset.right - (rect.width * (1 - elementRect.right));\n offset.bottom = startOffset.bottom - (rect.height * (1 - elementRect.bottom));\n }\n else {\n offset.left = offset.top = offset.right = offset.bottom = 0;\n }\n\n return offset;\n },\n\n set: function ({ pageCoords, interaction, status, options }) {\n if (!options) { return status; }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n\n const restriction = getRestrictionRect(options.restriction, interaction, page);\n\n if (!restriction) { return status; }\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n const rect = restriction;\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n const offset = interaction.modifierOffsets.restrict;\n\n // object is assumed to have\n // x, y, width, height or\n // left, top, right, bottom\n if ('x' in restriction && 'y' in restriction) {\n modifiedX = Math.max(Math.min(rect.x + rect.width - offset.right , page.x), rect.x + offset.left);\n modifiedY = Math.max(Math.min(rect.y + rect.height - offset.bottom, page.y), rect.y + offset.top );\n }\n else {\n modifiedX = Math.max(Math.min(rect.right - offset.right , page.x), rect.left + offset.left);\n modifiedY = Math.max(Math.min(rect.bottom - offset.bottom, page.y), rect.top + offset.top );\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const elementRect = options && options.elementRect;\n\n if (options && options.enabled\n && !(phase === 'start' && elementRect && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n getRestrictionRect,\n};\n\nfunction getRestrictionRect (value, interaction, page) {\n if (utils.is.function(value)) {\n return utils.resolveRectLike(value, interaction.target, interaction.element, [page.x, page.y, interaction]);\n } else {\n return utils.resolveRectLike(value, interaction.target, interaction.element);\n }\n}\n\nmodifiers.restrict = restrict;\nmodifiers.names.push('restrict');\n\ndefaultOptions.perAction.restrict = restrict.defaults;\n\nmodule.exports = restrict;\n","// This module adds the options.resize.restrictEdges setting which sets min and\n// max for the top, left, bottom and right edges of the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictEdges: {\n// inner: { top: 200, left: 200, right: 400, bottom: 400 },\n// outer: { top: 0, left: 0, right: 600, bottom: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst { getRestrictionRect } = require('./restrict');\n\nconst noInner = { top: +Infinity, left: +Infinity, bottom: -Infinity, right: -Infinity };\nconst noOuter = { top: -Infinity, left: -Infinity, bottom: +Infinity, right: +Infinity };\n\nconst restrictEdges = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n offset: null,\n },\n\n setOffset: function ({ interaction, startOffset, options }) {\n if (!options) {\n return utils.extend({}, startOffset);\n }\n\n const offset = getRestrictionRect(options.offset, interaction, interaction.startCoords.page);\n\n if (offset) {\n return {\n top: startOffset.top + offset.y,\n left: startOffset.left + offset.x,\n bottom: startOffset.bottom + offset.y,\n right: startOffset.right + offset.x,\n };\n }\n\n return startOffset;\n },\n\n set: function ({ pageCoords, interaction, status, offset, options }) {\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n const inner = rectUtils.xywhToTlbr(getRestrictionRect(options.inner, interaction, page)) || noInner;\n const outer = rectUtils.xywhToTlbr(getRestrictionRect(options.outer, interaction, page)) || noOuter;\n\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n if (edges.top) {\n modifiedY = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top);\n }\n else if (edges.bottom) {\n modifiedY = Math.max(Math.min(outer.bottom - offset.bottom, page.y), inner.bottom - offset.bottom);\n }\n if (edges.left) {\n modifiedX = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left);\n }\n else if (edges.right) {\n modifiedX = Math.max(Math.min(outer.right - offset.right, page.x), inner.right - offset.right);\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n if (options && options.enabled\n && !(phase === 'start' && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n noInner,\n noOuter,\n getRestrictionRect,\n};\n\nmodifiers.restrictEdges = restrictEdges;\nmodifiers.names.push('restrictEdges');\n\ndefaultOptions.perAction.restrictEdges = restrictEdges.defaults;\nresize.defaults.restrictEdges = restrictEdges.defaults;\n\nmodule.exports = restrictEdges;\n","// This module adds the options.resize.restrictSize setting which sets min and\n// max width and height for the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictSize: {\n// min: { width: -600, height: -600 },\n// max: { width: 600, height: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst restrictEdges = require('./restrictEdges');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst noMin = { width: -Infinity, height: -Infinity };\nconst noMax = { width: +Infinity, height: +Infinity };\n\nconst restrictSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n },\n\n setOffset: function ({ interaction }) {\n return interaction.startOffset;\n },\n\n set: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const rect = rectUtils.xywhToTlbr(interaction.resizeRects.inverted);\n\n const minSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.min, interaction)) || noMin;\n const maxSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.max, interaction)) || noMax;\n\n arg.options = {\n enabled: options.enabled,\n endOnly: options.endOnly,\n inner: utils.extend({}, restrictEdges.noInner),\n outer: utils.extend({}, restrictEdges.noOuter),\n };\n\n if (edges.top) {\n arg.options.inner.top = rect.bottom - minSize.height;\n arg.options.outer.top = rect.bottom - maxSize.height;\n }\n else if (edges.bottom) {\n arg.options.inner.bottom = rect.top + minSize.height;\n arg.options.outer.bottom = rect.top + maxSize.height;\n }\n if (edges.left) {\n arg.options.inner.left = rect.right - minSize.width;\n arg.options.outer.left = rect.right - maxSize.width;\n }\n else if (edges.right) {\n arg.options.inner.right = rect.left + minSize.width;\n arg.options.outer.right = rect.left + maxSize.width;\n }\n\n restrictEdges.set(arg);\n },\n\n modifyCoords: restrictEdges.modifyCoords,\n};\n\nmodifiers.restrictSize = restrictSize;\nmodifiers.names.push('restrictSize');\n\ndefaultOptions.perAction.restrictSize = restrictSize.defaults;\nresize.defaults.restrictSize = restrictSize.defaults;\n\nmodule.exports = restrictSize;\n","const modifiers = require('./index');\nconst interact = require('../interact');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst snap = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n\n relativePoints: null,\n },\n\n setOffset: function ({ interaction, interactable, element, rect, startOffset, options }) {\n const offsets = [];\n const optionsOrigin = utils.rectToXY(utils.resolveRectLike(options.origin));\n const origin = optionsOrigin || utils.getOriginXY(interactable, element, interaction.prepared.name);\n options = options || interactable.options[interaction.prepared.name].snap || {};\n\n let snapOffset;\n\n if (options.offset === 'startCoords') {\n snapOffset = {\n x: interaction.startCoords.page.x - origin.x,\n y: interaction.startCoords.page.y - origin.y,\n };\n }\n else {\n const offsetRect = utils.resolveRectLike(options.offset, interactable, element, [interaction]);\n\n snapOffset = utils.rectToXY(offsetRect) || { x: 0, y: 0 };\n }\n\n if (rect && options.relativePoints && options.relativePoints.length) {\n for (const { x: relativeX, y: relativeY } of options.relativePoints) {\n offsets.push({\n x: startOffset.left - (rect.width * relativeX) + snapOffset.x,\n y: startOffset.top - (rect.height * relativeY) + snapOffset.y,\n });\n }\n }\n else {\n offsets.push(snapOffset);\n }\n\n return offsets;\n },\n\n set: function ({ interaction, pageCoords, status, options, offset: offsets }) {\n const targets = [];\n let target;\n let page;\n let i;\n\n if (status.useStatusXY) {\n page = { x: status.x, y: status.y };\n }\n else {\n const origin = utils.getOriginXY(interaction.target, interaction.element, interaction.prepared.name);\n\n page = utils.extend({}, pageCoords);\n\n page.x -= origin.x;\n page.y -= origin.y;\n }\n\n status.realX = page.x;\n status.realY = page.y;\n\n let len = options.targets? options.targets.length : 0;\n\n for (const { x: offsetX, y: offsetY } of offsets) {\n const relativeX = page.x - offsetX;\n const relativeY = page.y - offsetY;\n\n for (const snapTarget of options.targets) {\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n targets.push({\n x: utils.is.number(target.x) ? (target.x + offsetX) : relativeX,\n y: utils.is.number(target.y) ? (target.y + offsetY) : relativeY,\n\n range: utils.is.number(target.range)? target.range: options.range,\n });\n }\n }\n\n const closest = {\n target: null,\n inRange: false,\n distance: 0,\n range: 0,\n dx: 0,\n dy: 0,\n };\n\n for (i = 0, len = targets.length; i < len; i++) {\n target = targets[i];\n\n const range = target.range;\n const dx = target.x - page.x;\n const dy = target.y - page.y;\n const distance = utils.hypot(dx, dy);\n let inRange = distance <= range;\n\n // Infinite targets count as being out of range\n // compared to non infinite ones that are in range\n if (range === Infinity && closest.inRange && closest.range !== Infinity) {\n inRange = false;\n }\n\n if (!closest.target || (inRange\n // is the closest target in range?\n ? (closest.inRange && range !== Infinity\n // the pointer is relatively deeper in this target\n ? distance / range < closest.distance / closest.range\n // this target has Infinite range and the closest doesn't\n : (range === Infinity && closest.range !== Infinity)\n // OR this target is closer that the previous closest\n || distance < closest.distance)\n // The other is not in range and the pointer is closer to this target\n : (!closest.inRange && distance < closest.distance))) {\n\n closest.target = target;\n closest.distance = distance;\n closest.range = range;\n closest.inRange = inRange;\n closest.dx = dx;\n closest.dy = dy;\n\n status.range = range;\n }\n }\n\n let snapChanged;\n\n if (closest.target) {\n snapChanged = (status.modifiedX !== closest.target.x || status.modifiedY !== closest.target.y);\n\n status.modifiedX = closest.target.x;\n status.modifiedY = closest.target.y;\n }\n else {\n snapChanged = true;\n\n status.modifiedX = NaN;\n status.modifiedY = NaN;\n }\n\n status.dx = closest.dx;\n status.dy = closest.dy;\n\n status.changed = (snapChanged || (closest.inRange && !status.locked));\n status.locked = closest.inRange;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const relativePoints = options && options.relativePoints;\n\n if (options && options.enabled\n && !(phase === 'start' && relativePoints && relativePoints.length)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n }\n\n return {\n range : status.range,\n locked : status.locked,\n x : status.modifiedX,\n y : status.modifiedY,\n realX : status.realX,\n realY : status.realY,\n dx : status.dx,\n dy : status.dy,\n };\n }\n },\n};\n\ninteract.createSnapGrid = function (grid) {\n return function (x, y) {\n const limits = grid.limits || {\n left : -Infinity,\n right : Infinity,\n top : -Infinity,\n bottom: Infinity,\n };\n let offsetX = 0;\n let offsetY = 0;\n\n if (utils.is.object(grid.offset)) {\n offsetX = grid.offset.x;\n offsetY = grid.offset.y;\n }\n\n const gridx = Math.round((x - offsetX) / grid.x);\n const gridy = Math.round((y - offsetY) / grid.y);\n\n const newX = Math.max(limits.left, Math.min(limits.right , gridx * grid.x + offsetX));\n const newY = Math.max(limits.top , Math.min(limits.bottom, gridy * grid.y + offsetY));\n\n return {\n x: newX,\n y: newY,\n range: grid.range,\n };\n };\n};\n\nmodifiers.snap = snap;\nmodifiers.names.push('snap');\n\ndefaultOptions.perAction.snap = snap.defaults;\n\nmodule.exports = snap;\n","// This module allows snapping of the size of targets during resize\n// interactions.\n\nconst modifiers = require('./index');\nconst snap = require('./snap');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\nconst utils = require('../utils/');\n\nconst snapSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n },\n\n setOffset: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.edges;\n\n if (!edges) { return; }\n\n arg.options = {\n relativePoints: [{\n x: edges.left? 0 : 1,\n y: edges.top ? 0 : 1,\n }],\n origin: { x: 0, y: 0 },\n offset: 'self',\n range: options.range,\n };\n\n const offsets = snap.setOffset(arg);\n arg.options = options;\n\n return offsets;\n },\n\n set: function (arg) {\n const { interaction, options, offset, pageCoords } = arg;\n const page = utils.extend({}, pageCoords);\n const relativeX = page.x - offset[0].x;\n const relativeY = page.y - offset[0].y;\n\n arg.options = utils.extend({}, options);\n arg.options.targets = [];\n\n for (const snapTarget of options.targets) {\n let target;\n\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n if ('width' in target && 'height' in target) {\n target.x = target.width;\n target.y = target.height;\n }\n\n arg.options.targets.push(target);\n }\n\n snap.set(arg);\n },\n\n modifyCoords: function (arg) {\n const { options } = arg;\n\n arg.options = utils.extend({}, options);\n arg.options.enabled = options.enabled;\n arg.options.relativePoints = [null];\n\n snap.modifyCoords(arg);\n },\n};\n\nmodifiers.snapSize = snapSize;\nmodifiers.names.push('snapSize');\n\ndefaultOptions.perAction.snapSize = snapSize.defaults;\nresize.defaults.snapSize = snapSize.defaults;\n\nmodule.exports = snapSize;\n","const pointerUtils = require('../utils/pointerUtils');\n\nmodule.exports = class PointerEvent {\n constructor (type, pointer, event, eventTarget, interaction) {\n pointerUtils.pointerExtend(this, event);\n\n if (event !== pointer) {\n pointerUtils.pointerExtend(this, pointer);\n }\n\n this.interaction = interaction;\n\n this.timeStamp = new Date().getTime();\n this.originalEvent = event;\n this.type = type;\n this.pointerId = pointerUtils.getPointerId(pointer);\n this.pointerType = pointerUtils.getPointerType(pointer, interaction);\n this.target = eventTarget;\n this.currentTarget = null;\n\n if (type === 'tap') {\n const pointerIndex = interaction.getPointerIndex(pointer);\n this.dt = this.timeStamp - interaction.downTimes[pointerIndex];\n\n const interval = this.timeStamp - interaction.tapTime;\n\n this.double = !!(interaction.prevTap\n && interaction.prevTap.type !== 'doubletap'\n && interaction.prevTap.target === this.target\n && interval < 500);\n }\n else if (type === 'doubletap') {\n this.dt = pointer.timeStamp - interaction.tapTime;\n }\n }\n\n subtractOrigin ({ x: originX, y: originY }) {\n this.pageX -= originX;\n this.pageY -= originY;\n this.clientX -= originX;\n this.clientY -= originY;\n\n return this;\n }\n\n addOrigin ({ x: originX, y: originY }) {\n this.pageX += originX;\n this.pageY += originY;\n this.clientX += originX;\n this.clientY += originY;\n\n return this;\n }\n\n preventDefault () {\n this.originalEvent.preventDefault();\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n};\n","const PointerEvent = require('./PointerEvent');\nconst Interaction = require('../Interaction');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst defaults = require('../defaultOptions');\nconst signals = require('../utils/Signals').new();\nconst { filter } = require('../utils/arr');\n\nconst simpleSignals = [ 'down', 'up', 'cancel' ];\nconst simpleEvents = [ 'down', 'up', 'cancel' ];\n\nconst pointerEvents = {\n PointerEvent,\n fire,\n collectEventTargets,\n signals,\n defaults: {\n holdDuration: 600,\n ignoreFrom : null,\n allowFrom : null,\n origin : { x: 0, y: 0 },\n },\n types: [\n 'down',\n 'move',\n 'up',\n 'cancel',\n 'tap',\n 'doubletap',\n 'hold',\n ],\n};\n\nfunction fire (arg) {\n const {\n interaction, pointer, event, eventTarget,\n type = arg.pointerEvent.type,\n targets = collectEventTargets(arg),\n pointerEvent = new PointerEvent(type, pointer, event, eventTarget, interaction),\n } = arg;\n\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n targets,\n type,\n pointerEvent,\n };\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n\n for (const prop in target.props || {}) {\n pointerEvent[prop] = target.props[prop];\n }\n\n const origin = utils.getOriginXY(target.eventable, target.element);\n\n pointerEvent.subtractOrigin(origin);\n pointerEvent.eventable = target.eventable;\n pointerEvent.currentTarget = target.element;\n\n target.eventable.fire(pointerEvent);\n\n pointerEvent.addOrigin(origin);\n\n if (pointerEvent.immediatePropagationStopped\n || (pointerEvent.propagationStopped\n && (i + 1) < targets.length && targets[i + 1].element !== pointerEvent.currentTarget)) {\n break;\n }\n }\n\n signals.fire('fired', signalArg);\n\n if (type === 'tap') {\n // if pointerEvent should make a double tap, create and fire a doubletap\n // PointerEvent and use that as the prevTap\n const prevTap = pointerEvent.double\n ? fire({\n interaction, pointer, event, eventTarget,\n type: 'doubletap',\n })\n : pointerEvent;\n\n interaction.prevTap = prevTap;\n interaction.tapTime = prevTap.timeStamp;\n }\n\n return pointerEvent;\n}\n\nfunction collectEventTargets ({ interaction, pointer, event, eventTarget, type }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n // do not fire a tap event if the pointer was moved before being lifted\n if (type === 'tap' && (interaction.pointerWasMoved\n // or if the pointerup target is different to the pointerdown target\n || !(interaction.downTargets[pointerIndex] && interaction.downTargets[pointerIndex] === eventTarget))) {\n return [];\n }\n\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n path,\n targets: [],\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (type === 'hold') {\n signalArg.targets = filter(signalArg.targets, target =>\n target.eventable.options.holdDuration === interaction.holdTimers[pointerIndex].duration);\n }\n\n return signalArg.targets;\n}\n\nInteraction.signals.on('update-pointer-down', function ({ interaction, pointerIndex }) {\n interaction.holdTimers[pointerIndex] = { duration: Infinity, timeout: null };\n});\n\nInteraction.signals.on('remove-pointer', function ({ interaction, pointerIndex }) {\n interaction.holdTimers.splice(pointerIndex, 1);\n});\n\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget, duplicateMove }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n if (!duplicateMove && (!interaction.pointerIsDown || interaction.pointerWasMoved)) {\n if (interaction.pointerIsDown) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n\n fire({\n interaction, pointer, event, eventTarget,\n type: 'move',\n });\n }\n});\n\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget, pointerIndex }) {\n // copy event to be used in timeout for IE8\n const eventCopy = browser.isIE8? utils.extend({}, event) : event;\n\n const timer = interaction.holdTimers[pointerIndex];\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'hold',\n targets: [],\n path,\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (!signalArg.targets.length) { return; }\n\n let minDuration = Infinity;\n\n for (let i = 0; i < signalArg.targets.length; i++) {\n const target = signalArg.targets[i];\n const holdDuration = target.eventable.options.holdDuration;\n\n if (holdDuration < minDuration) {\n minDuration = holdDuration;\n }\n }\n\n timer.duration = minDuration;\n timer.timeout = setTimeout(function () {\n fire({\n interaction, eventCopy, eventTarget,\n pointer: browser.isIE8? eventCopy : pointer,\n type: 'hold',\n });\n }, minDuration);\n});\n\nInteraction.signals.on('up', ({ interaction, pointer, event, eventTarget }) => {\n if (!interaction.pointerWasMoved) {\n fire({ interaction, eventTarget, pointer, event, type: 'tap' });\n }\n});\n\n['up', 'cancel'].forEach(function (signalName) {\n Interaction.signals.on(signalName, function ({ interaction, pointerIndex }) {\n if (interaction.holdTimers[pointerIndex]) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n });\n});\n\nfunction createSignalListener (type) {\n return function ({ interaction, pointer, event, eventTarget }) {\n fire({ interaction, eventTarget, pointer, event, type });\n };\n}\n\nfor (let i = 0; i < simpleSignals.length; i++) {\n Interaction.signals.on(simpleSignals[i], createSignalListener(simpleEvents[i]));\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.prevTap = null; // the most recent tap event on this interaction\n interaction.tapTime = 0; // time of the most recent tap event\n interaction.holdTimers = []; // [{ duration, timeout }]\n});\n\ndefaults.pointerEvents = pointerEvents.defaults;\nmodule.exports = pointerEvents;\n","const pointerEvents = require('./base');\nconst Interaction = require('../Interaction');\n\npointerEvents.signals.on('new', onNew);\npointerEvents.signals.on('fired', onFired);\n\nfor (const signal of ['move', 'up', 'cancel', 'endall']) {\n Interaction.signals.on(signal, endHoldRepeat);\n}\n\nfunction onNew ({ pointerEvent }) {\n if (pointerEvent.type !== 'hold') { return; }\n\n pointerEvent.count = (pointerEvent.count || 0) + 1;\n}\n\nfunction onFired ({ interaction, pointerEvent, eventTarget, targets }) {\n if (pointerEvent.type !== 'hold' || !targets.length) { return; }\n\n // get the repeat interval from the first eventable\n const interval = targets[0].eventable.options.holdRepeatInterval;\n\n // don't repeat if the interval is 0 or less\n if (interval <= 0) { return; }\n\n // set a timeout to fire the holdrepeat event\n interaction.holdIntervalHandle = setTimeout(function () {\n pointerEvents.fire({\n interaction,\n eventTarget,\n type: 'hold',\n pointer: pointerEvent,\n event: pointerEvent,\n });\n }, interval);\n}\n\nfunction endHoldRepeat ({ interaction }) {\n // set the interaction's holdStopTime property\n // to stop further holdRepeat events\n if (interaction.holdIntervalHandle) {\n clearInterval(interaction.holdIntervalHandle);\n interaction.holdIntervalHandle = null;\n }\n}\n\n// don't repeat by default\npointerEvents.defaults.holdRepeatInterval = 0;\npointerEvents.types.push('holdrepeat');\n\nmodule.exports = {\n onNew,\n onFired,\n endHoldRepeat,\n};\n","const pointerEvents = require('./base');\nconst Interactable = require('../Interactable');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\nconst scope = require('../scope');\nconst extend = require('../utils/extend');\nconst { merge } = require('../utils/arr');\n\npointerEvents.signals.on('collect-targets', function ({ targets, element, type, eventTarget }) {\n function collectSelectors (interactable, selector, context) {\n const els = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && is.element(element)\n && domUtils.matchesSelector(element, selector, els)\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n const interactable = scope.interactables.get(element);\n\n if (interactable) {\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n scope.interactables.forEachSelector(collectSelectors, element);\n});\n\nInteractable.signals.on('new', function ({ interactable }) {\n interactable.events.getRect = function (element) {\n return interactable.getRect(element);\n };\n});\n\nInteractable.signals.on('set', function ({ interactable, options }) {\n extend(interactable.events.options, pointerEvents.defaults);\n extend(interactable.events.options, options);\n});\n\nmerge(Interactable.eventTypes, pointerEvents.types);\n\nInteractable.prototype.pointerEvents = function (options) {\n extend(this.events.options, options);\n\n return this;\n};\n\nconst __backCompatOption = Interactable.prototype._backCompatOption;\n\nInteractable.prototype._backCompatOption = function (optionName, newValue) {\n const ret = __backCompatOption.call(this, optionName, newValue);\n\n if (ret === this) {\n this.events.options[optionName] = newValue;\n }\n\n return ret;\n};\n\nInteractable.settingsMethods.push('pointerEvents');\n","const utils = require('./utils');\nconst events = require('./utils/events');\nconst signals = require('./utils/Signals').new();\n\nconst scope = {\n signals,\n events,\n utils,\n\n // main document\n document: require('./utils/domObjects').document,\n // all documents being listened to\n documents: [],\n\n addDocument: function (doc, win) {\n // do nothing if document is already known\n if (utils.contains(scope.documents, doc)) { return false; }\n\n win = win || scope.getWindow(doc);\n\n scope.documents.push(doc);\n events.documents.push(doc);\n\n // don't add an unload event for the main document\n // so that the page may be cached in browser history\n if (doc !== scope.document) {\n events.add(win, 'unload', scope.onWindowUnload);\n }\n\n signals.fire('add-document', { doc, win });\n },\n\n removeDocument: function (doc, win) {\n const index = utils.indexOf(scope.documents, doc);\n\n win = win || scope.getWindow(doc);\n\n events.remove(win, 'unload', scope.onWindowUnload);\n\n scope.documents.splice(index, 1);\n events.documents.splice(index, 1);\n\n signals.fire('remove-document', { win, doc });\n },\n\n onWindowUnload: function () {\n scope.removeDocument(this.document, this);\n },\n};\n\nmodule.exports = scope;\n","const { indexOf } = require('./arr');\n\nclass Signals {\n constructor () {\n this.listeners = {\n // signalName: [listeners],\n };\n }\n\n on (name, listener) {\n if (!this.listeners[name]) {\n this.listeners[name] = [listener];\n return;\n }\n\n this.listeners[name].push(listener);\n }\n\n off (name, listener) {\n if (!this.listeners[name]) { return; }\n\n const index = indexOf(this.listeners[name], listener);\n\n if (index !== -1) {\n this.listeners[name].splice(index, 1);\n }\n }\n\n fire (name, arg) {\n const targetListeners = this.listeners[name];\n\n if (!targetListeners) { return; }\n\n for (let i = 0; i < targetListeners.length; i++) {\n if (targetListeners[i](arg, name) === false) {\n return;\n }\n }\n }\n}\n\nSignals.new = function () {\n return new Signals();\n};\n\nmodule.exports = Signals;\n","function indexOf (array, target) {\n for (let i = 0, len = array.length; i < len; i++) {\n if (array[i] === target) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction contains (array, target) {\n return indexOf(array, target) !== -1;\n}\n\nfunction merge (target, source) {\n for (let i = 0; i < source.length; i++) {\n target.push(source[i]);\n }\n\n return target;\n}\n\nfunction filter (array, test) {\n const result = [];\n\n for (let i = 0; i < array.length; i++) {\n if (test(array[i])) {\n result.push(array[i]);\n }\n }\n\n return result;\n}\n\nmodule.exports = {\n indexOf,\n contains,\n merge,\n filter,\n};\n","const { window } = require('./window');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst Element = domObjects.Element;\nconst navigator = window.navigator;\n\nconst browser = {\n // Does the browser support touch input?\n supportsTouch: !!(('ontouchstart' in window) || is.function(window.DocumentTouch)\n && domObjects.document instanceof window.DocumentTouch),\n\n // Does the browser support PointerEvents\n supportsPointerEvent: !!domObjects.PointerEvent,\n\n isIE8: ('attachEvent' in window) && !('addEventListener' in window),\n\n // Opera Mobile must be handled differently\n isOperaMobile: (navigator.appName === 'Opera'\n && browser.supportsTouch\n && navigator.userAgent.match('Presto')),\n\n // scrolling doesn't change the result of getClientRects on iOS 7\n isIOS7: (/iP(hone|od|ad)/.test(navigator.platform)\n && /OS 7[^\\d]/.test(navigator.appVersion)),\n\n isIe9OrOlder: /MSIE (8|9)/.test(navigator.userAgent),\n\n // prefix matchesSelector\n prefixedMatchesSelector: 'matches' in Element.prototype\n ? 'matches': 'webkitMatchesSelector' in Element.prototype\n ? 'webkitMatchesSelector': 'mozMatchesSelector' in Element.prototype\n ? 'mozMatchesSelector': 'oMatchesSelector' in Element.prototype\n ? 'oMatchesSelector': 'msMatchesSelector',\n\n useMatchesSelectorPolyfill: false,\n\n pEventTypes: (domObjects.PointerEvent\n ? (domObjects.PointerEvent === window.MSPointerEvent\n ? {\n up: 'MSPointerUp',\n down: 'MSPointerDown',\n over: 'mouseover',\n out: 'mouseout',\n move: 'MSPointerMove',\n cancel: 'MSPointerCancel',\n }\n : {\n up: 'pointerup',\n down: 'pointerdown',\n over: 'pointerover',\n out: 'pointerout',\n move: 'pointermove',\n cancel: 'pointercancel',\n })\n : null),\n\n // because Webkit and Opera still use 'mousewheel' event type\n wheelEvent: 'onmousewheel' in domObjects.document? 'mousewheel': 'wheel',\n\n};\n\nbrowser.useMatchesSelectorPolyfill = !is.function(Element.prototype[browser.prefixedMatchesSelector]);\n\nmodule.exports = browser;\n","const domObjects = {};\nconst win = require('./window').window;\n\nfunction blank () {}\n\ndomObjects.document = win.document;\ndomObjects.DocumentFragment = win.DocumentFragment || blank;\ndomObjects.SVGElement = win.SVGElement || blank;\ndomObjects.SVGSVGElement = win.SVGSVGElement || blank;\ndomObjects.SVGElementInstance = win.SVGElementInstance || blank;\ndomObjects.Element = win.Element || blank;\ndomObjects.HTMLElement = win.HTMLElement || domObjects.Element;\n\ndomObjects.Event = win.Event;\ndomObjects.Touch = win.Touch || blank;\ndomObjects.PointerEvent = (win.PointerEvent || win.MSPointerEvent);\n\nmodule.exports = domObjects;\n","const win = require('./window');\nconst browser = require('./browser');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst domUtils = {\n nodeContains: function (parent, child) {\n while (child) {\n if (child === parent) {\n return true;\n }\n\n child = child.parentNode;\n }\n\n return false;\n },\n\n closest: function (element, selector) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) { return element; }\n\n element = domUtils.parentNode(element);\n }\n\n return null;\n },\n\n parentNode: function (node) {\n let parent = node.parentNode;\n\n if (is.docFrag(parent)) {\n // skip past #shado-root fragments\n while ((parent = parent.host) && is.docFrag(parent)) {\n continue;\n }\n\n return parent;\n }\n\n return parent;\n },\n\n // taken from http://tanalin.com/en/blog/2012/12/matches-selector-ie8/ and modified\n matchesSelectorPolyfill: browser.useMatchesSelectorPolyfill\n ? function (element, selector, elems) {\n elems = elems || element.parentNode.querySelectorAll(selector);\n\n for (let i = 0, len = elems.length; i < len; i++) {\n if (elems[i] === element) {\n return true;\n }\n }\n\n return false;\n }\n : null,\n\n matchesSelector: function (element, selector, nodeList) {\n if (browser.useMatchesSelectorPolyfill) {\n return domUtils.matchesSelectorPolyfill(element, selector, nodeList);\n }\n\n // remove /deep/ from selectors if shadowDOM polyfill is used\n if (win.window !== win.realWindow) {\n selector = selector.replace(/\\/deep\\//g, ' ');\n }\n\n return element[browser.prefixedMatchesSelector](selector);\n },\n\n // Test for the element that's \"above\" all other qualifiers\n indexOfDeepestElement: function (elements) {\n let deepestZoneParents = [];\n let dropzoneParents = [];\n let dropzone;\n let deepestZone = elements[0];\n let index = deepestZone? 0: -1;\n let parent;\n let child;\n let i;\n let n;\n\n for (i = 1; i < elements.length; i++) {\n dropzone = elements[i];\n\n // an element might belong to multiple selector dropzones\n if (!dropzone || dropzone === deepestZone) {\n continue;\n }\n\n if (!deepestZone) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n // check if the deepest or current are document.documentElement or document.rootElement\n // - if the current dropzone is, do nothing and continue\n if (dropzone.parentNode === dropzone.ownerDocument) {\n continue;\n }\n // - if deepest is, update with the current dropzone and continue to next\n else if (deepestZone.parentNode === dropzone.ownerDocument) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n if (!deepestZoneParents.length) {\n parent = deepestZone;\n while (parent.parentNode && parent.parentNode !== parent.ownerDocument) {\n deepestZoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n }\n\n // if this element is an svg element and the current deepest is\n // an HTMLElement\n if (deepestZone instanceof domObjects.HTMLElement\n && dropzone instanceof domObjects.SVGElement\n && !(dropzone instanceof domObjects.SVGSVGElement)) {\n\n if (dropzone === deepestZone.parentNode) {\n continue;\n }\n\n parent = dropzone.ownerSVGElement;\n }\n else {\n parent = dropzone;\n }\n\n dropzoneParents = [];\n\n while (parent.parentNode !== parent.ownerDocument) {\n dropzoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n\n n = 0;\n\n // get (position of last common ancestor) + 1\n while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) {\n n++;\n }\n\n const parents = [\n dropzoneParents[n - 1],\n dropzoneParents[n],\n deepestZoneParents[n],\n ];\n\n child = parents[0].lastChild;\n\n while (child) {\n if (child === parents[1]) {\n deepestZone = dropzone;\n index = i;\n deepestZoneParents = [];\n\n break;\n }\n else if (child === parents[2]) {\n break;\n }\n\n child = child.previousSibling;\n }\n }\n\n return index;\n },\n\n matchesUpTo: function (element, selector, limit) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) {\n return true;\n }\n\n element = domUtils.parentNode(element);\n\n if (element === limit) {\n return domUtils.matchesSelector(element, selector);\n }\n }\n\n return false;\n },\n\n getActualElement: function (element) {\n return (element instanceof domObjects.SVGElementInstance\n ? element.correspondingUseElement\n : element);\n },\n\n getScrollXY: function (relevantWindow) {\n relevantWindow = relevantWindow || win.window;\n return {\n x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft,\n y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop,\n };\n },\n\n getElementClientRect: function (element) {\n const clientRect = (element instanceof domObjects.SVGElement\n ? element.getBoundingClientRect()\n : element.getClientRects()[0]);\n\n return clientRect && {\n left : clientRect.left,\n right : clientRect.right,\n top : clientRect.top,\n bottom: clientRect.bottom,\n width : clientRect.width || clientRect.right - clientRect.left,\n height: clientRect.height || clientRect.bottom - clientRect.top,\n };\n },\n\n getElementRect: function (element) {\n const clientRect = domUtils.getElementClientRect(element);\n\n if (!browser.isIOS7 && clientRect) {\n const scroll = domUtils.getScrollXY(win.getWindow(element));\n\n clientRect.left += scroll.x;\n clientRect.right += scroll.x;\n clientRect.top += scroll.y;\n clientRect.bottom += scroll.y;\n }\n\n return clientRect;\n },\n\n getPath: function (element) {\n const path = [];\n\n while (element) {\n path.push(element);\n element = domUtils.parentNode(element);\n }\n\n return path;\n },\n\n trySelector: value => {\n if (!is.string(value)) { return false; }\n\n // an exception will be raised if it is invalid\n domObjects.document.querySelector(value);\n return true;\n },\n};\n\nmodule.exports = domUtils;\n","const is = require('./is');\nconst domUtils = require('./domUtils');\nconst pExtend = require('./pointerExtend');\n\nconst { window, getWindow } = require('./window');\nconst { indexOf, contains } = require('./arr');\n\nconst useAttachEvent = ('attachEvent' in window) && !('addEventListener' in window);\nconst addEvent = useAttachEvent? 'attachEvent': 'addEventListener';\nconst removeEvent = useAttachEvent? 'detachEvent': 'removeEventListener';\nconst on = useAttachEvent? 'on': '';\n\nconst elements = [];\nconst targets = [];\nconst attachedListeners = [];\n\n// {\n// type: {\n// selectors: ['selector', ...],\n// contexts : [document, ...],\n// listeners: [[listener, capture, passive], ...]\n// }\n// }\nconst delegatedEvents = {};\n\nconst documents = [];\n\nconst supportsOptions = !useAttachEvent && (() => {\n let supported = false;\n\n window.document.createElement('div').addEventListener('test', null, {\n get capture () { supported = true; },\n });\n\n return supported;\n})();\n\nfunction add (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n let elementIndex = indexOf(elements, element);\n let target = targets[elementIndex];\n\n if (!target) {\n target = {\n events: {},\n typeCount: 0,\n };\n\n elementIndex = elements.push(element) - 1;\n targets.push(target);\n\n attachedListeners.push(useAttachEvent\n ? {\n supplied: [],\n wrapped : [],\n useCount: [],\n }\n : null);\n }\n\n if (!target.events[type]) {\n target.events[type] = [];\n target.typeCount++;\n }\n\n if (!contains(target.events[type], listener)) {\n let ret;\n\n if (useAttachEvent) {\n const { supplied, wrapped, useCount } = attachedListeners[elementIndex];\n const listenerIndex = indexOf(supplied, listener);\n\n const wrappedListener = wrapped[listenerIndex] || function (event) {\n if (!event.immediatePropagationStopped) {\n event.target = event.srcElement;\n event.currentTarget = element;\n\n event.preventDefault = event.preventDefault || preventDef;\n event.stopPropagation = event.stopPropagation || stopProp;\n event.stopImmediatePropagation = event.stopImmediatePropagation || stopImmProp;\n\n if (/mouse|click/.test(event.type)) {\n event.pageX = event.clientX + getWindow(element).document.documentElement.scrollLeft;\n event.pageY = event.clientY + getWindow(element).document.documentElement.scrollTop;\n }\n\n listener(event);\n }\n };\n\n ret = element[addEvent](on + type, wrappedListener, !!options.capture);\n\n if (listenerIndex === -1) {\n supplied.push(listener);\n wrapped.push(wrappedListener);\n useCount.push(1);\n }\n else {\n useCount[listenerIndex]++;\n }\n }\n else {\n ret = element[addEvent](type, listener, supportsOptions? options : !!options.capture);\n }\n target.events[type].push(listener);\n\n return ret;\n }\n}\n\nfunction remove (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const elementIndex = indexOf(elements, element);\n const target = targets[elementIndex];\n\n if (!target || !target.events) {\n return;\n }\n\n let wrappedListener = listener;\n let listeners;\n let listenerIndex;\n\n if (useAttachEvent) {\n listeners = attachedListeners[elementIndex];\n listenerIndex = indexOf(listeners.supplied, listener);\n wrappedListener = listeners.wrapped[listenerIndex];\n }\n\n if (type === 'all') {\n for (type in target.events) {\n if (target.events.hasOwnProperty(type)) {\n remove(element, type, 'all');\n }\n }\n return;\n }\n\n if (target.events[type]) {\n const len = target.events[type].length;\n\n if (listener === 'all') {\n for (let i = 0; i < len; i++) {\n remove(element, type, target.events[type][i], options);\n }\n return;\n }\n else {\n for (let i = 0; i < len; i++) {\n if (target.events[type][i] === listener) {\n element[removeEvent](on + type, wrappedListener, supportsOptions? options : !!options.capture);\n target.events[type].splice(i, 1);\n\n if (useAttachEvent && listeners) {\n listeners.useCount[listenerIndex]--;\n if (listeners.useCount[listenerIndex] === 0) {\n listeners.supplied.splice(listenerIndex, 1);\n listeners.wrapped.splice(listenerIndex, 1);\n listeners.useCount.splice(listenerIndex, 1);\n }\n }\n\n break;\n }\n }\n }\n\n if (target.events[type] && target.events[type].length === 0) {\n target.events[type] = null;\n target.typeCount--;\n }\n }\n\n if (!target.typeCount) {\n targets.splice(elementIndex, 1);\n elements.splice(elementIndex, 1);\n attachedListeners.splice(elementIndex, 1);\n }\n}\n\nfunction addDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n if (!delegatedEvents[type]) {\n delegatedEvents[type] = {\n selectors: [],\n contexts : [],\n listeners: [],\n };\n\n // add delegate listener functions\n for (let i = 0; i < documents.length; i++) {\n add(documents[i], type, delegateListener);\n add(documents[i], type, delegateUseCapture, true);\n }\n }\n\n const delegated = delegatedEvents[type];\n let index;\n\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n break;\n }\n }\n\n if (index === -1) {\n index = delegated.selectors.length;\n\n delegated.selectors.push(selector);\n delegated.contexts .push(context);\n delegated.listeners.push([]);\n }\n\n // keep listener and capture and passive flags\n delegated.listeners[index].push([listener, !!options.capture, options.passive]);\n}\n\nfunction removeDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const delegated = delegatedEvents[type];\n let matchFound = false;\n let index;\n\n if (!delegated) { return; }\n\n // count from last index of delegated to 0\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n // look for matching selector and context Node\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n\n const listeners = delegated.listeners[index];\n\n // each item of the listeners array is an array: [function, capture, passive]\n for (let i = listeners.length - 1; i >= 0; i--) {\n const [fn, capture, passive] = listeners[i];\n\n // check if the listener functions and capture and passive flags match\n if (fn === listener && capture === !!options.capture && passive === options.passive) {\n // remove the listener from the array of listeners\n listeners.splice(i, 1);\n\n // if all listeners for this interactable have been removed\n // remove the interactable from the delegated arrays\n if (!listeners.length) {\n delegated.selectors.splice(index, 1);\n delegated.contexts .splice(index, 1);\n delegated.listeners.splice(index, 1);\n\n // remove delegate function from context\n remove(context, type, delegateListener);\n remove(context, type, delegateUseCapture, true);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegatedEvents[type] = null;\n }\n }\n\n // only remove one listener\n matchFound = true;\n break;\n }\n }\n\n if (matchFound) { break; }\n }\n }\n}\n\n// bound to the interactable context when a DOM event\n// listener is added to a selector interactable\nfunction delegateListener (event, optionalArg) {\n const options = getOptions(optionalArg);\n const fakeEvent = {};\n const delegated = delegatedEvents[event.type];\n const eventTarget = (domUtils.getActualElement(event.path\n ? event.path[0]\n : event.target));\n let element = eventTarget;\n\n // duplicate the event so that currentTarget can be changed\n pExtend(fakeEvent, event);\n\n fakeEvent.originalEvent = event;\n fakeEvent.preventDefault = preventOriginalDefault;\n\n // climb up document tree looking for selector matches\n while (is.element(element)) {\n for (let i = 0; i < delegated.selectors.length; i++) {\n const selector = delegated.selectors[i];\n const context = delegated.contexts[i];\n\n if (domUtils.matchesSelector(element, selector)\n && domUtils.nodeContains(context, eventTarget)\n && domUtils.nodeContains(context, element)) {\n\n const listeners = delegated.listeners[i];\n\n fakeEvent.currentTarget = element;\n\n for (let j = 0; j < listeners.length; j++) {\n const [fn, capture, passive] = listeners[j];\n\n if (capture === !!options.capture && passive === options.passive) {\n fn(fakeEvent);\n }\n }\n }\n }\n\n element = domUtils.parentNode(element);\n }\n}\n\nfunction delegateUseCapture (event) {\n return delegateListener.call(this, event, true);\n}\n\nfunction preventDef () {\n this.returnValue = false;\n}\n\nfunction preventOriginalDefault () {\n this.originalEvent.preventDefault();\n}\n\nfunction stopProp () {\n this.cancelBubble = true;\n}\n\nfunction stopImmProp () {\n this.cancelBubble = true;\n this.immediatePropagationStopped = true;\n}\n\nfunction getOptions (param) {\n return is.object(param)? param : { capture: param };\n}\n\nmodule.exports = {\n add,\n remove,\n\n addDelegate,\n removeDelegate,\n\n delegateListener,\n delegateUseCapture,\n delegatedEvents,\n documents,\n\n useAttachEvent,\n supportsOptions,\n\n _elements: elements,\n _targets: targets,\n _attachedListeners: attachedListeners,\n};\n","module.exports = function extend (dest, source) {\n for (const prop in source) {\n dest[prop] = source[prop];\n }\n return dest;\n};\n","const {\n resolveRectLike,\n rectToXY,\n} = require('./rect');\n\nmodule.exports = function (target, element, action) {\n const actionOptions = target.options[action];\n const actionOrigin = actionOptions && actionOptions.origin;\n const origin = actionOrigin || target.options.origin;\n\n const originRect = resolveRectLike(origin, target, element, [target && element]);\n\n return rectToXY(originRect) || { x: 0, y: 0 };\n};\n","module.exports = (x, y) => Math.sqrt(x * x + y * y);\n","const extend = require('./extend');\nconst win = require('./window');\n\nconst utils = {\n warnOnce: function (method, message) {\n let warned = false;\n\n return function () {\n if (!warned) {\n win.window.console.warn(message);\n warned = true;\n }\n\n return method.apply(this, arguments);\n };\n },\n\n // http://stackoverflow.com/a/5634528/2280888\n _getQBezierValue: function (t, p1, p2, p3) {\n const iT = 1 - t;\n return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3;\n },\n\n getQuadraticCurvePoint: function (startX, startY, cpX, cpY, endX, endY, position) {\n return {\n x: utils._getQBezierValue(position, startX, cpX, endX),\n y: utils._getQBezierValue(position, startY, cpY, endY),\n };\n },\n\n // http://gizma.com/easing/\n easeOutQuad: function (t, b, c, d) {\n t /= d;\n return -c * t*(t-2) + b;\n },\n\n copyAction: function (dest, src) {\n dest.name = src.name;\n dest.axis = src.axis;\n dest.edges = src.edges;\n\n return dest;\n },\n\n is : require('./is'),\n extend : extend,\n hypot : require('./hypot'),\n getOriginXY: require('./getOriginXY'),\n};\n\nextend(utils, require('./arr'));\nextend(utils, require('./domUtils'));\nextend(utils, require('./pointerUtils'));\nextend(utils, require('./rect'));\n\nmodule.exports = utils;\n","const scope = require('../scope');\nconst utils = require('./index');\nconst browser = require('./browser');\n\nconst finder = {\n methodOrder: [ 'simulationResume', 'mouse', 'hasPointer', 'idle' ],\n\n search: function (pointer, eventType, eventTarget) {\n const mouseEvent = (/mouse/i.test(pointer.pointerType || eventType)\n // MSPointerEvent.MSPOINTER_TYPE_MOUSE\n || pointer.pointerType === 4);\n const pointerId = utils.getPointerId(pointer);\n const details = { pointer, pointerId, mouseEvent, eventType, eventTarget };\n\n for (const method of finder.methodOrder) {\n const interaction = finder[method](details);\n\n if (interaction) {\n return interaction;\n }\n }\n },\n\n // try to resume simulation with a new pointer\n simulationResume: function ({ mouseEvent, eventType, eventTarget }) {\n if (!/down|start/i.test(eventType)) {\n return null;\n }\n\n for (const interaction of scope.interactions) {\n let element = eventTarget;\n\n if (interaction.simulation && interaction.simulation.allowResume\n && (interaction.mouse === mouseEvent)) {\n while (element) {\n // if the element is the interaction element\n if (element === interaction.element) {\n return interaction;\n }\n element = utils.parentNode(element);\n }\n }\n }\n\n return null;\n },\n\n // if it's a mouse interaction\n mouse: function ({ pointerId, mouseEvent, eventType }) {\n if (!mouseEvent && (browser.supportsTouch || browser.supportsPointerEvent)) {\n return null;\n }\n\n let firstNonActive;\n\n for (const interaction of scope.interactions) {\n if (interaction.mouse) {\n // if it's a down event, skip interactions with running simulations\n if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; }\n\n // if the interaction is active, return it immediately\n if (interaction.interacting()) {\n return interaction;\n }\n // otherwise save it and look for another active interaction\n else if (!firstNonActive) {\n firstNonActive = interaction;\n }\n }\n }\n\n // if no active mouse interaction was found use the first inactive mouse\n // interaction\n if (firstNonActive) {\n return firstNonActive;\n }\n\n // Find any interaction specifically for mouse.\n // ignore the interaction if the eventType is a mousedown, and a simulation\n // is active\n for (const interaction of scope.interactions) {\n if (interaction.mouse && !(/down/.test(eventType) && interaction.simulation)) {\n return interaction;\n }\n }\n\n return null;\n },\n\n // get interaction that has this pointer\n hasPointer: function ({ pointerId }) {\n for (const interaction of scope.interactions) {\n if (utils.contains(interaction.pointerIds, pointerId)) {\n return interaction;\n }\n }\n },\n\n // get first idle interaction\n idle: function ({ mouseEvent }) {\n for (const interaction of scope.interactions) {\n // if there's already a pointer held down\n if (interaction.pointerIds.length === 1) {\n const target = interaction.target;\n // don't add this pointer if there is a target interactable and it\n // isn't gesturable\n if (target && !target.options.gesture.enabled) {\n continue;\n }\n }\n // maximum of 2 pointers per interaction\n else if (interaction.pointerIds.length >= 2) {\n continue;\n }\n\n if (!interaction.interacting() && (mouseEvent === interaction.mouse)) {\n return interaction;\n }\n }\n\n return null;\n },\n};\n\nmodule.exports = finder;\n","const win = require('./window');\nconst isWindow = require('./isWindow');\n\nconst is = {\n array : () => {},\n\n window : thing => thing === win.window || isWindow(thing),\n\n docFrag : thing => is.object(thing) && thing.nodeType === 11,\n\n object : thing => !!thing && (typeof thing === 'object'),\n\n function: thing => typeof thing === 'function',\n\n number : thing => typeof thing === 'number' ,\n\n bool : thing => typeof thing === 'boolean' ,\n\n string : thing => typeof thing === 'string' ,\n\n element: thing => {\n if (!thing || (typeof thing !== 'object')) { return false; }\n\n const _window = win.getWindow(thing) || win.window;\n\n return (/object|function/.test(typeof _window.Element)\n ? thing instanceof _window.Element //DOM2\n : thing.nodeType === 1 && typeof thing.nodeName === 'string');\n },\n};\n\nis.array = thing => (is.object(thing)\n && (typeof thing.length !== 'undefined')\n && is.function(thing.splice));\n\nmodule.exports = is;\n","module.exports = (thing) => !!(thing && thing.Window) && (thing instanceof thing.Window);\n","function pointerExtend (dest, source) {\n for (const prop in source) {\n const prefixedPropREs = module.exports.prefixedPropREs;\n let deprecated = false;\n\n // skip deprecated prefixed properties\n for (const vendor in prefixedPropREs) {\n if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) {\n deprecated = true;\n break;\n }\n }\n\n if (!deprecated && typeof source[prop] !== 'function') {\n dest[prop] = source[prop];\n }\n }\n return dest;\n}\n\npointerExtend.prefixedPropREs = {\n webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/,\n};\n\nmodule.exports = pointerExtend;\n","const hypot = require('./hypot');\nconst browser = require('./browser');\nconst dom = require('./domObjects');\nconst domUtils = require('./domUtils');\nconst is = require('./is');\nconst pointerExtend = require('./pointerExtend');\n\nconst pointerUtils = {\n copyCoords: function (dest, src) {\n dest.page = dest.page || {};\n dest.page.x = src.page.x;\n dest.page.y = src.page.y;\n\n dest.client = dest.client || {};\n dest.client.x = src.client.x;\n dest.client.y = src.client.y;\n\n dest.timeStamp = src.timeStamp;\n },\n\n setCoordDeltas: function (targetObj, prev, cur) {\n targetObj.page.x = cur.page.x - prev.page.x;\n targetObj.page.y = cur.page.y - prev.page.y;\n targetObj.client.x = cur.client.x - prev.client.x;\n targetObj.client.y = cur.client.y - prev.client.y;\n targetObj.timeStamp = cur.timeStamp - prev.timeStamp;\n\n // set pointer velocity\n const dt = Math.max(targetObj.timeStamp / 1000, 0.001);\n\n targetObj.page.speed = hypot(targetObj.page.x, targetObj.page.y) / dt;\n targetObj.page.vx = targetObj.page.x / dt;\n targetObj.page.vy = targetObj.page.y / dt;\n\n targetObj.client.speed = hypot(targetObj.client.x, targetObj.page.y) / dt;\n targetObj.client.vx = targetObj.client.x / dt;\n targetObj.client.vy = targetObj.client.y / dt;\n },\n\n isNativePointer: function (pointer) {\n return (pointer instanceof dom.Event || pointer instanceof dom.Touch);\n },\n\n // Get specified X/Y coords for mouse or event.touches[0]\n getXY: function (type, pointer, xy) {\n xy = xy || {};\n type = type || 'page';\n\n xy.x = pointer[type + 'X'];\n xy.y = pointer[type + 'Y'];\n\n return xy;\n },\n\n getPageXY: function (pointer, page) {\n page = page || {};\n\n // Opera Mobile handles the viewport and scrolling oddly\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n pointerUtils.getXY('screen', pointer, page);\n\n page.x += window.scrollX;\n page.y += window.scrollY;\n }\n else {\n pointerUtils.getXY('page', pointer, page);\n }\n\n return page;\n },\n\n getClientXY: function (pointer, client) {\n client = client || {};\n\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n // Opera Mobile handles the viewport and scrolling oddly\n pointerUtils.getXY('screen', pointer, client);\n }\n else {\n pointerUtils.getXY('client', pointer, client);\n }\n\n return client;\n },\n\n getPointerId: function (pointer) {\n return is.number(pointer.pointerId)? pointer.pointerId : pointer.identifier;\n },\n\n setCoords: function (targetObj, pointers, timeStamp) {\n const pointer = (pointers.length > 1\n ? pointerUtils.pointerAverage(pointers)\n : pointers[0]);\n\n const tmpXY = {};\n\n pointerUtils.getPageXY(pointer, tmpXY);\n targetObj.page.x = tmpXY.x;\n targetObj.page.y = tmpXY.y;\n\n pointerUtils.getClientXY(pointer, tmpXY);\n targetObj.client.x = tmpXY.x;\n targetObj.client.y = tmpXY.y;\n\n targetObj.timeStamp = is.number(timeStamp) ? timeStamp :new Date().getTime();\n },\n\n pointerExtend: pointerExtend,\n\n getTouchPair: function (event) {\n const touches = [];\n\n // array of touches is supplied\n if (is.array(event)) {\n touches[0] = event[0];\n touches[1] = event[1];\n }\n // an event\n else {\n if (event.type === 'touchend') {\n if (event.touches.length === 1) {\n touches[0] = event.touches[0];\n touches[1] = event.changedTouches[0];\n }\n else if (event.touches.length === 0) {\n touches[0] = event.changedTouches[0];\n touches[1] = event.changedTouches[1];\n }\n }\n else {\n touches[0] = event.touches[0];\n touches[1] = event.touches[1];\n }\n }\n\n return touches;\n },\n\n pointerAverage: function (pointers) {\n const average = {\n pageX : 0,\n pageY : 0,\n clientX: 0,\n clientY: 0,\n screenX: 0,\n screenY: 0,\n };\n\n for (const pointer of pointers) {\n for (const prop in average) {\n average[prop] += pointer[prop];\n }\n }\n for (const prop in average) {\n average[prop] /= pointers.length;\n }\n\n return average;\n },\n\n touchBBox: function (event) {\n if (!event.length && !(event.touches && event.touches.length > 1)) {\n return;\n }\n\n const touches = pointerUtils.getTouchPair(event);\n const minX = Math.min(touches[0].pageX, touches[1].pageX);\n const minY = Math.min(touches[0].pageY, touches[1].pageY);\n const maxX = Math.max(touches[0].pageX, touches[1].pageX);\n const maxY = Math.max(touches[0].pageY, touches[1].pageY);\n\n return {\n x: minX,\n y: minY,\n left: minX,\n top: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n },\n\n touchDistance: function (event, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n\n\n const dx = touches[0][sourceX] - touches[1][sourceX];\n const dy = touches[0][sourceY] - touches[1][sourceY];\n\n return hypot(dx, dy);\n },\n\n touchAngle: function (event, prevAngle, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n const dx = touches[1][sourceX] - touches[0][sourceX];\n const dy = touches[1][sourceY] - touches[0][sourceY];\n const angle = 180 * Math.atan2(dy , dx) / Math.PI;\n\n return angle;\n },\n\n getPointerType: function (pointer, interaction) {\n // if the PointerEvent API isn't available, then the pointer must be ither\n // a MouseEvent or TouchEvent\n if (interaction.mouse) { return 'mouse'; }\n if (!browser.supportsPointerEvent) { return 'touch'; }\n\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : [undefined, undefined,'touch', 'pen', 'mouse'][pointer.pointerType];\n },\n\n // [ event.target, event.currentTarget ]\n getEventTargets: function (event) {\n return [\n domUtils.getActualElement(event.path ? event.path[0] : event.target),\n domUtils.getActualElement(event.currentTarget),\n ];\n },\n};\n\nmodule.exports = pointerUtils;\n","const { window } = require('./window');\n\nconst vendors = ['ms', 'moz', 'webkit', 'o'];\nlet lastTime = 0;\nlet request;\nlet cancel;\n\nfor (let x = 0; x < vendors.length && !window.requestAnimationFrame; x++) {\n request = window[vendors[x] + 'RequestAnimationFrame'];\n cancel = window[vendors[x] +'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n}\n\nif (!request) {\n request = function (callback) {\n const currTime = new Date().getTime();\n const timeToCall = Math.max(0, 16 - (currTime - lastTime));\n const id = setTimeout(function () { callback(currTime + timeToCall); },\n timeToCall);\n\n lastTime = currTime + timeToCall;\n return id;\n };\n}\n\nif (!cancel) {\n cancel = function (id) {\n clearTimeout(id);\n };\n}\n\nmodule.exports = {\n request,\n cancel,\n};\n","const extend = require('./extend');\nconst is = require('./is');\nconst {\n closest,\n parentNode,\n getElementRect,\n} = require('./domUtils');\n\nconst rectUtils = {\n getStringOptionResult: function (value, interactable, element) {\n if (!is.string(value)) {\n return null;\n }\n\n if (value === 'parent') {\n value = parentNode(element);\n }\n else if (value === 'self') {\n value = interactable.getRect(element);\n }\n else {\n value = closest(element, value);\n }\n\n return value;\n },\n\n resolveRectLike: function (value, interactable, element, functionArgs) {\n value = rectUtils.getStringOptionResult(value, interactable, element) || value;\n\n if (is.function(value)) {\n value = value.apply(null, functionArgs);\n }\n\n if (is.element(value)) {\n value = getElementRect(value);\n }\n\n return value;\n },\n\n rectToXY: function (rect) {\n return rect && {\n x: 'x' in rect ? rect.x : rect.left,\n y: 'y' in rect ? rect.y : rect.top,\n };\n },\n\n xywhToTlbr: function (rect) {\n if (rect && !('left' in rect && 'top' in rect)) {\n rect = extend({}, rect);\n\n rect.left = rect.x || 0;\n rect.top = rect.y || 0;\n rect.right = rect.right || (rect.left + rect.width);\n rect.bottom = rect.bottom || (rect.top + rect.height);\n }\n\n return rect;\n },\n\n tlbrToXywh: function (rect) {\n if (rect && !('x' in rect && 'y' in rect)) {\n rect = extend({}, rect);\n\n rect.x = rect.left || 0;\n rect.top = rect.top || 0;\n rect.width = rect.width || (rect.right - rect.x);\n rect.height = rect.height || (rect.bottom - rect.y);\n }\n\n return rect;\n },\n};\n\nmodule.exports = rectUtils;\n","const win = module.exports;\nconst isWindow = require('./isWindow');\n\nfunction init (window) {\n // get wrapped window if using Shadow DOM polyfill\n\n win.realWindow = window;\n\n // create a TextNode\n const el = window.document.createTextNode('');\n\n // check if it's wrapped by a polyfill\n if (el.ownerDocument !== window.document\n && typeof window.wrap === 'function'\n && window.wrap(el) === el) {\n // use wrapped window\n window = window.wrap(window);\n }\n\n win.window = window;\n}\n\nif (typeof window === 'undefined') {\n win.window = undefined;\n win.realWindow = undefined;\n}\nelse {\n init(window);\n}\n\nwin.getWindow = function getWindow (node) {\n if (isWindow(node)) {\n return node;\n }\n\n const rootNode = (node.ownerDocument || node);\n\n return rootNode.defaultView || rootNode.parentWindow || win.window;\n};\n\nwin.init = init;\n"]} \ No newline at end of file +{"version":3,"sources":["src/header.js","node_modules/browser-pack/_prelude.js","index.js","src/Eventable.js","src/InteractEvent.js","src/Interactable.js","src/Interaction.js","src/actions/base.js","src/actions/drag.js","src/actions/drop.js","src/actions/gesture.js","src/actions/resize.js","src/autoScroll.js","src/autoStart/InteractableMethods.js","src/autoStart/base.js","src/autoStart/delay.js","src/autoStart/drag.js","src/autoStart/gesture.js","src/autoStart/resize.js","src/defaultOptions.js","src/index.js","src/inertia.js","src/interact.js","src/interactablePreventDefault.js","src/legacyBrowsers.js","src/modifiers/index.js","src/modifiers/restrict.js","src/modifiers/restrictEdges.js","src/modifiers/restrictSize.js","src/modifiers/snap.js","src/modifiers/snapSize.js","src/pointerEvents/PointerEvent.js","src/pointerEvents/base.js","src/pointerEvents/holdRepeat.js","src/pointerEvents/interactableTargets.js","src/scope.js","src/utils/Signals.js","src/utils/arr.js","src/utils/browser.js","src/utils/domObjects.js","src/utils/domUtils.js","src/utils/events.js","src/utils/extend.js","src/utils/getOriginXY.js","src/utils/hypot.js","src/utils/index.js","src/utils/interactionFinder.js","src/utils/is.js","src/utils/isWindow.js","src/utils/pointerExtend.js","src/utils/pointerUtils.js","src/utils/raf.js","src/utils/rect.js","src/utils/window.js"],"names":[],"mappings":"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","file":"interact.js","sourceRoot":"","sourcesContent":["/**\n * interact.js v1.3.0-alpha.4+sha.7970416-dirty\n *\n * Copyright (c) 2012-2017 Taye Adeyemi \n * Open source under the MIT License.\n * https://raw.github.com/taye/interact.js/master/LICENSE\n */\n","(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o 150) {\n return null;\n }\n\n let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI;\n const overlap = 22.5;\n\n if (angle < 0) {\n angle += 360;\n }\n\n const left = 135 - overlap <= angle && angle < 225 + overlap;\n const up = 225 - overlap <= angle && angle < 315 + overlap;\n\n const right = !left && (315 - overlap <= angle || angle < 45 + overlap);\n const down = !up && 45 - overlap <= angle && angle < 135 + overlap;\n\n return {\n up,\n down,\n left,\n right,\n angle,\n speed: interaction.prevEvent.speed,\n velocity: {\n x: interaction.prevEvent.velocityX,\n y: interaction.prevEvent.velocityY,\n },\n };\n }\n\n preventDefault () {}\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n}\n\nsignals.on('set-delta', function ({ iEvent, interaction, starting, deltaSource }) {\n const prevEvent = starting? iEvent : interaction.prevEvent;\n\n if (deltaSource === 'client') {\n iEvent.dx = iEvent.clientX - prevEvent.clientX;\n iEvent.dy = iEvent.clientY - prevEvent.clientY;\n }\n else {\n iEvent.dx = iEvent.pageX - prevEvent.pageX;\n iEvent.dy = iEvent.pageY - prevEvent.pageY;\n }\n});\n\nInteractEvent.signals = signals;\n\nmodule.exports = InteractEvent;\n","const is = require('./utils/is');\nconst events = require('./utils/events');\nconst extend = require('./utils/extend');\nconst actions = require('./actions/base');\nconst scope = require('./scope');\nconst Eventable = require('./Eventable');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nconst {\n getElementRect,\n nodeContains,\n trySelector,\n} = require('./utils/domUtils');\nconst { getWindow } = require('./utils/window');\nconst { indexOf, contains } = require('./utils/arr');\nconst { wheelEvent } = require('./utils/browser');\n\n// all set interactables\nscope.interactables = [];\n\n/*\\\n * Interactable\n [ property ]\n **\n * Object type returned by @interact\n\\*/\nclass Interactable {\n constructor (target, options) {\n options = options || {};\n\n this.target = target;\n this.events = new Eventable();\n this._context = options.context || scope.document;\n this._win = getWindow(trySelector(target)? this._context : target);\n this._doc = this._win.document;\n\n signals.fire('new', {\n target,\n options,\n interactable: this,\n win: this._win,\n });\n\n scope.addDocument( this._doc, this._win );\n\n scope.interactables.push(this);\n\n this.set(options);\n }\n\n setOnEvents (action, phases) {\n const onAction = 'on' + action;\n\n if (is.function(phases.onstart) ) { this.events[onAction + 'start' ] = phases.onstart ; }\n if (is.function(phases.onmove) ) { this.events[onAction + 'move' ] = phases.onmove ; }\n if (is.function(phases.onend) ) { this.events[onAction + 'end' ] = phases.onend ; }\n if (is.function(phases.oninertiastart)) { this.events[onAction + 'inertiastart' ] = phases.oninertiastart ; }\n\n return this;\n }\n\n setPerAction (action, options) {\n // for all the default per-action options\n for (const option in options) {\n // if this option exists for this action\n if (option in defaults[action]) {\n // if the option in the options arg is an object value\n if (is.object(options[option])) {\n // duplicate the object\n this.options[action][option] = extend(this.options[action][option] || {}, options[option]);\n\n if (is.object(defaults.perAction[option]) && 'enabled' in defaults.perAction[option]) {\n this.options[action][option].enabled = options[option].enabled === false? false : true;\n }\n }\n else if (is.bool(options[option]) && is.object(defaults.perAction[option])) {\n this.options[action][option].enabled = options[option];\n }\n else if (options[option] !== undefined) {\n // or if it's not undefined, do a plain assignment\n this.options[action][option] = options[option];\n }\n }\n }\n }\n\n /*\\\n * Interactable.getRect\n [ method ]\n *\n * The default function to get an Interactables bounding rect. Can be\n * overridden using @Interactable.rectChecker.\n *\n - element (Element) #optional The element to measure.\n = (object) The object's bounding rectangle.\n o {\n o top : 0,\n o left : 0,\n o bottom: 0,\n o right : 0,\n o width : 0,\n o height: 0\n o }\n \\*/\n getRect (element) {\n element = element || this.target;\n\n if (is.string(this.target) && !(is.element(element))) {\n element = this._context.querySelector(this.target);\n }\n\n return getElementRect(element);\n }\n\n /*\\\n * Interactable.rectChecker\n [ method ]\n *\n * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n - checker (function) #optional A function which returns this Interactable's bounding rectangle. See @Interactable.getRect\n = (function | object) The checker function or this Interactable\n \\*/\n rectChecker (checker) {\n if (is.function(checker)) {\n this.getRect = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.getRect;\n\n return this;\n }\n\n return this.getRect;\n }\n\n _backCompatOption (optionName, newValue) {\n if (trySelector(newValue) || is.object(newValue)) {\n this.options[optionName] = newValue;\n\n for (const action of actions.names) {\n this.options[action][optionName] = newValue;\n }\n\n return this;\n }\n\n return this.options[optionName];\n }\n\n /*\\\n * Interactable.origin\n [ method ]\n *\n * Gets or sets the origin of the Interactable's element. The x and y\n * of the origin will be subtracted from action event coordinates.\n *\n - origin (object | string) #optional An object eg. { x: 0, y: 0 } or string 'parent', 'self' or any CSS selector\n * OR\n - origin (Element) #optional An HTML or SVG Element whose rect will be used\n **\n = (object) The current origin or this Interactable\n \\*/\n origin (newValue) {\n return this._backCompatOption('origin', newValue);\n }\n\n /*\\\n * Interactable.deltaSource\n [ method ]\n *\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n - newValue (string) #optional Use 'client' if you will be scrolling while interacting; Use 'page' if you want autoScroll to work\n = (string | object) The current deltaSource or this Interactable\n \\*/\n deltaSource (newValue) {\n if (newValue === 'page' || newValue === 'client') {\n this.options.deltaSource = newValue;\n\n return this;\n }\n\n return this.options.deltaSource;\n }\n\n /*\\\n * Interactable.context\n [ method ]\n *\n * Gets the selector context Node of the Interactable. The default is `window.document`.\n *\n = (Node) The context Node of this Interactable\n **\n \\*/\n context () {\n return this._context;\n }\n\n inContext (element) {\n return (this._context === element.ownerDocument\n || nodeContains(this._context, element));\n }\n\n /*\\\n * Interactable.fire\n [ method ]\n *\n * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n - iEvent (InteractEvent) The InteractEvent object to be fired on this Interactable\n = (Interactable) this Interactable\n \\*/\n fire (iEvent) {\n this.events.fire(iEvent);\n\n return this;\n }\n\n _onOffMultiple (method, eventType, listener, options) {\n if (is.string(eventType) && eventType.search(' ') !== -1) {\n eventType = eventType.trim().split(/ +/);\n }\n\n if (is.array(eventType)) {\n for (let i = 0; i < eventType.length; i++) {\n this[method](eventType[i], listener, options);\n }\n\n return true;\n }\n\n if (is.object(eventType)) {\n for (const prop in eventType) {\n this[method](prop, eventType[prop], listener);\n }\n\n return true;\n }\n }\n\n /*\\\n * Interactable.on\n [ method ]\n *\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n - eventType (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) This Interactable\n \\*/\n on (eventType, listener, options) {\n if (this._onOffMultiple('on', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.on(eventType, listener);\n }\n // delegated event for selector\n else if (is.string(this.target)) {\n events.addDelegate(this.target, this._context, eventType, listener, options);\n }\n else {\n events.add(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.off\n [ method ]\n *\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n - eventType (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) This Interactable\n \\*/\n off (eventType, listener, options) {\n if (this._onOffMultiple('off', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n // if it is an action event type\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.off(eventType, listener);\n }\n // delegated event\n else if (is.string(this.target)) {\n events.removeDelegate(this.target, this._context, eventType, listener, options);\n }\n // remove listener from this Interatable's element\n else {\n events.remove(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.set\n [ method ]\n *\n * Reset the options of this Interactable\n - options (object) The new settings to apply\n = (object) This Interactable\n \\*/\n set (options) {\n if (!is.object(options)) {\n options = {};\n }\n\n this.options = extend({}, defaults.base);\n\n const perActions = extend({}, defaults.perAction);\n\n for (const actionName in actions.methodDict) {\n const methodName = actions.methodDict[actionName];\n\n this.options[actionName] = extend({}, defaults[actionName]);\n\n this.setPerAction(actionName, perActions);\n\n this[methodName](options[actionName]);\n }\n\n for (const setting of Interactable.settingsMethods) {\n this.options[setting] = defaults.base[setting];\n\n if (setting in options) {\n this[setting](options[setting]);\n }\n }\n\n signals.fire('set', {\n options,\n interactable: this,\n });\n\n return this;\n }\n\n /*\\\n * Interactable.unset\n [ method ]\n *\n * Remove this interactable from the list of interactables and remove\n * it's action capabilities and event listeners\n *\n = (object) @interact\n \\*/\n unset () {\n events.remove(this.target, 'all');\n\n if (is.string(this.target)) {\n // remove delegated events\n for (const type in events.delegatedEvents) {\n const delegated = events.delegatedEvents[type];\n\n if (delegated.selectors[0] === this.target\n && delegated.contexts[0] === this._context) {\n\n delegated.selectors.splice(0, 1);\n delegated.contexts .splice(0, 1);\n delegated.listeners.splice(0, 1);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegated[type] = null;\n }\n }\n\n events.remove(this._context, type, events.delegateListener);\n events.remove(this._context, type, events.delegateUseCapture, true);\n }\n }\n else {\n events.remove(this, 'all');\n }\n\n signals.fire('unset', { interactable: this });\n\n scope.interactables.splice(indexOf(scope.interactables, this), 1);\n\n // Stop related interactions when an Interactable is unset\n for (const interaction of scope.interactions || []) {\n if (interaction.target === this && interaction.interacting()) {\n interaction.stop();\n }\n }\n\n return scope.interact;\n }\n}\n\nscope.interactables.indexOfElement = function indexOfElement (target, context) {\n context = context || scope.document;\n\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n if (interactable.target === target && interactable._context === context) {\n return i;\n }\n }\n return -1;\n};\n\nscope.interactables.get = function interactableGet (element, options, dontCheckInContext) {\n const ret = this[this.indexOfElement(element, options && options.context)];\n\n return ret && (is.string(element) || dontCheckInContext || ret.inContext(element))? ret : null;\n};\n\nscope.interactables.forEachSelector = function (callback, element) {\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n // skip non CSS selector targets and out of context elements\n if (!is.string(interactable.target)\n || (element && !interactable.inContext(element))) {\n continue;\n }\n\n const ret = callback(interactable, interactable.target, interactable._context, i, this);\n\n if (ret !== undefined) {\n return ret;\n }\n }\n};\n\n// all interact.js eventTypes\nInteractable.eventTypes = scope.eventTypes = [];\n\nInteractable.signals = signals;\n\nInteractable.settingsMethods = [ 'deltaSource', 'origin', 'preventDefault', 'rectChecker' ];\n\nmodule.exports = Interactable;\n","const scope = require('./scope');\nconst utils = require('./utils');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst domObjects = require('./utils/domObjects');\nconst finder = require('./utils/interactionFinder');\nconst signals = require('./utils/Signals').new();\n\nconst listeners = {};\nconst methodNames = [\n 'pointerDown', 'pointerMove', 'pointerUp',\n 'updatePointer', 'removePointer',\n];\n\n// for ignoring browser's simulated mouse events\nlet prevTouchTime = 0;\n\n// all active and idle interactions\nscope.interactions = [];\n\nclass Interaction {\n constructor ({ pointerType }) {\n this.target = null; // current interactable being interacted with\n this.element = null; // the target element of the interactable\n\n this.prepared = { // action that's ready to be fired on next move event\n name : null,\n axis : null,\n edges: null,\n };\n\n // keep track of added pointers\n this.pointers = [];\n this.pointerIds = [];\n this.downTargets = [];\n this.downTimes = [];\n\n // Previous native pointer move event coordinates\n this.prevCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n // current native pointer move event coordinates\n this.curCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Starting InteractEvent pointer coordinates\n this.startCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Change in coordinates and time of the pointer\n this.pointerDelta = {\n page : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n client : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n timeStamp: 0,\n };\n\n this.downEvent = null; // pointerdown/mousedown/touchstart event\n this.downPointer = {};\n\n this._eventTarget = null;\n this._curEventTarget = null;\n\n this.prevEvent = null; // previous action event\n\n this.pointerIsDown = false;\n this.pointerWasMoved = false;\n this._interacting = false;\n\n this.pointerType = pointerType;\n\n signals.fire('new', this);\n\n scope.interactions.push(this);\n }\n\n pointerDown (pointer, event, eventTarget) {\n const pointerIndex = this.updatePointer(pointer, event, true);\n\n signals.fire('down', {\n pointer,\n event,\n eventTarget,\n pointerIndex,\n interaction: this,\n });\n }\n\n /*\\\n * Interaction.start\n [ method ]\n *\n * Start an action with the given Interactable and Element as tartgets. The\n * action must be enabled for the target Interactable and an appropriate number\n * of pointers must be held down - 1 for drag/resize, 2 for gesture.\n *\n * Use it with `interactable.able({ manualStart: false })` to always\n * [start actions manually](https://github.com/taye/interact.js/issues/114)\n *\n - action (object) The action to be performed - drag, resize, etc.\n - target (Interactable) The Interactable to target\n - element (Element) The DOM Element to target\n = (object) interact\n **\n | interact(target)\n | .draggable({\n | // disable the default drag start by down->move\n | manualStart: true\n | })\n | // start dragging after the user holds the pointer down\n | .on('hold', function (event) {\n | var interaction = event.interaction;\n |\n | if (!interaction.interacting()) {\n | interaction.start({ name: 'drag' },\n | event.interactable,\n | event.currentTarget);\n | }\n | });\n \\*/\n start (action, target, element) {\n if (this.interacting()\n || !this.pointerIsDown\n || this.pointerIds.length < (action.name === 'gesture'? 2 : 1)) {\n return;\n }\n\n // if this interaction had been removed after stopping\n // add it back\n if (utils.indexOf(scope.interactions, this) === -1) {\n scope.interactions.push(this);\n }\n\n utils.copyAction(this.prepared, action);\n this.target = target;\n this.element = element;\n\n signals.fire('action-start', {\n interaction: this,\n event: this.downEvent,\n });\n }\n\n pointerMove (pointer, event, eventTarget) {\n if (!this.simulation) {\n this.updatePointer(pointer);\n utils.setCoords(this.curCoords, this.pointers);\n }\n\n const duplicateMove = (this.curCoords.page.x === this.prevCoords.page.x\n && this.curCoords.page.y === this.prevCoords.page.y\n && this.curCoords.client.x === this.prevCoords.client.x\n && this.curCoords.client.y === this.prevCoords.client.y);\n\n let dx;\n let dy;\n\n // register movement greater than pointerMoveTolerance\n if (this.pointerIsDown && !this.pointerWasMoved) {\n dx = this.curCoords.client.x - this.startCoords.client.x;\n dy = this.curCoords.client.y - this.startCoords.client.y;\n\n this.pointerWasMoved = utils.hypot(dx, dy) > Interaction.pointerMoveTolerance;\n }\n\n const signalArg = {\n pointer,\n pointerIndex: this.getPointerIndex(pointer),\n event,\n eventTarget,\n dx,\n dy,\n duplicate: duplicateMove,\n interaction: this,\n interactingBeforeMove: this.interacting(),\n };\n\n if (!duplicateMove) {\n // set pointer coordinate, time changes and speeds\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n }\n\n signals.fire('move', signalArg);\n\n if (!duplicateMove) {\n // if interacting, fire an 'action-move' signal etc\n if (this.interacting()) {\n this.doMove(signalArg);\n }\n\n if (this.pointerWasMoved) {\n utils.copyCoords(this.prevCoords, this.curCoords);\n }\n }\n }\n\n /*\\\n * Interaction.doMove\n [ method ]\n *\n * Force a move of the current action at the same coordinates. Useful if\n * snap/restrict has been changed and you want a movement with the new\n * settings.\n *\n **\n | interact(target)\n | .draggable(true)\n | .on('dragmove', function (event) {\n | if (someCondition) {\n | // change the snap settings\n | event.interactable.draggable({ snap: { targets: [] }});\n | // fire another move event with re-calculated snap\n | event.interaction.doMove();\n | }\n | });\n \\*/\n doMove (signalArg) {\n signalArg = utils.extend({\n pointer: this.pointers[0],\n event: this.prevEvent,\n eventTarget: this._eventTarget,\n interaction: this,\n }, signalArg || {});\n\n signals.fire('before-action-move', signalArg);\n\n if (!this._dontFireMove) {\n signals.fire('action-move', signalArg);\n }\n\n this._dontFireMove = false;\n }\n\n // End interact move events and stop auto-scroll unless simulation is running\n pointerUp (pointer, event, eventTarget, curEventTarget) {\n const pointerIndex = this.getPointerIndex(pointer);\n\n signals.fire(/cancel$/i.test(event.type)? 'cancel' : 'up', {\n pointer,\n pointerIndex,\n event,\n eventTarget,\n curEventTarget,\n interaction: this,\n });\n\n if (!this.simulation) {\n this.end(event);\n }\n\n this.pointerIsDown = false;\n this.removePointer(pointer, event);\n }\n\n /*\\\n * Interaction.end\n [ method ]\n *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n - event (PointerEvent) #optional\n **\n | interact(target)\n | .draggable(true)\n | .on('move', function (event) {\n | if (event.pageX > 1000) {\n | // end the current action\n | event.interaction.end();\n | // stop all further listeners from being called\n | event.stopImmediatePropagation();\n | }\n | });\n \\*/\n end (event) {\n event = event || this.prevEvent;\n\n if (this.interacting()) {\n signals.fire('action-end', {\n event,\n interaction: this,\n });\n }\n\n this.stop();\n }\n\n currentAction () {\n return this._interacting? this.prepared.name: null;\n }\n\n interacting () {\n return this._interacting;\n }\n\n stop () {\n signals.fire('stop', { interaction: this });\n\n if (this._interacting) {\n signals.fire('stop-active', { interaction: this });\n signals.fire('stop-' + this.prepared.name, { interaction: this });\n }\n\n this.target = this.element = null;\n\n this._interacting = false;\n this.prepared.name = this.prevEvent = null;\n }\n\n getPointerIndex (pointer) {\n // mouse and pen interactions may have only one pointer\n if (this.pointerType === 'mouse' || this.pointerType === 'pen') {\n return 0;\n }\n\n return utils.indexOf(this.pointerIds, utils.getPointerId(pointer));\n }\n\n updatePointer (pointer, event, down = event && /(down|start)$/i.test(event.type)) {\n const id = utils.getPointerId(pointer);\n let index = this.getPointerIndex(pointer);\n\n if (index === -1) {\n index = this.pointerIds.length;\n this.pointerIds[index] = id;\n }\n\n if (down) {\n signals.fire('update-pointer-down', {\n pointer,\n event,\n down,\n pointerId: id,\n pointerIndex: index,\n interaction: this,\n });\n }\n\n this.pointers[index] = pointer;\n\n return index;\n }\n\n removePointer (pointer, event) {\n const index = this.getPointerIndex(pointer);\n\n if (index === -1) { return; }\n\n signals.fire('remove-pointer', {\n pointer,\n event,\n pointerIndex: index,\n interaction: this,\n });\n\n this.pointers .splice(index, 1);\n this.pointerIds .splice(index, 1);\n this.downTargets.splice(index, 1);\n this.downTimes .splice(index, 1);\n }\n\n _updateEventTargets (target, currentTarget) {\n this._eventTarget = target;\n this._curEventTarget = currentTarget;\n }\n}\n\nfor (let i = 0, len = methodNames.length; i < len; i++) {\n const method = methodNames[i];\n\n listeners[method] = doOnInteractions(method);\n}\n\nfunction doOnInteractions (method) {\n return (function (event) {\n const pointerType = utils.getPointerType(event);\n const [eventTarget, curEventTarget] = utils.getEventTargets(event);\n const matches = []; // [ [pointer, interaction], ...]\n\n if (browser.supportsTouch && /touch/.test(event.type)) {\n prevTouchTime = new Date().getTime();\n\n for (let i = 0; i < event.changedTouches.length; i++) {\n const pointer = event.changedTouches[i];\n const interaction = finder.search(pointer, event.type, eventTarget);\n\n matches.push([pointer, interaction || new Interaction({ pointerType })]);\n }\n }\n else {\n let invalidPointer = false;\n\n if (!browser.supportsPointerEvent && /mouse/.test(event.type)) {\n // ignore mouse events while touch interactions are active\n for (let i = 0; i < scope.interactions.length && !invalidPointer; i++) {\n invalidPointer = scope.interactions[i].pointerType !== 'mouse' && scope.interactions[i].pointerIsDown;\n }\n\n // try to ignore mouse events that are simulated by the browser\n // after a touch event\n invalidPointer = invalidPointer\n || (new Date().getTime() - prevTouchTime < 500)\n // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated\n || event.timeStamp === 0;\n }\n\n if (!invalidPointer) {\n let interaction = finder.search(event, event.type, eventTarget);\n\n if (!interaction) {\n interaction = new Interaction({ pointerType });\n }\n\n matches.push([event, interaction]);\n }\n }\n\n for (const [pointer, interaction] of matches) {\n interaction._updateEventTargets(eventTarget, curEventTarget);\n interaction[method](pointer, event, eventTarget, curEventTarget);\n }\n });\n}\n\nfunction endAll (event) {\n for (let i = 0; i < scope.interactions.length; i++) {\n const interaction = scope.interactions[i];\n\n interaction.end(event);\n signals.fire('endall', { event, interaction });\n }\n}\n\nconst docEvents = { /* 'eventType': listenerFunc */ };\nconst pEventTypes = browser.pEventTypes;\n\nif (domObjects.PointerEvent) {\n docEvents[pEventTypes.down ] = listeners.pointerDown;\n docEvents[pEventTypes.move ] = listeners.pointerMove;\n docEvents[pEventTypes.up ] = listeners.pointerUp;\n docEvents[pEventTypes.cancel] = listeners.pointerUp;\n}\nelse {\n docEvents.mousedown = listeners.pointerDown;\n docEvents.mousemove = listeners.pointerMove;\n docEvents.mouseup = listeners.pointerUp;\n\n docEvents.touchstart = listeners.pointerDown;\n docEvents.touchmove = listeners.pointerMove;\n docEvents.touchend = listeners.pointerUp;\n docEvents.touchcancel = listeners.pointerUp;\n}\n\ndocEvents.blur = endAll;\n\nfunction onDocSignal ({ doc }, signalName) {\n const eventMethod = signalName.indexOf('add') === 0\n ? events.add : events.remove;\n\n // delegate event listener\n for (const eventType in scope.delegatedEvents) {\n eventMethod(doc, eventType, events.delegateListener);\n eventMethod(doc, eventType, events.delegateUseCapture, true);\n }\n\n for (const eventType in docEvents) {\n eventMethod(doc, eventType, docEvents[eventType]);\n }\n}\n\nsignals.on('update-pointer-down', ({ interaction, pointer, pointerId, pointerIndex, event, eventTarget, down }) => {\n interaction.pointerIds[pointerIndex] = pointerId;\n interaction.pointers[pointerIndex] = pointer;\n\n if (down) {\n interaction.pointerIsDown = true;\n }\n\n if (!interaction.interacting()) {\n utils.setCoords(interaction.startCoords, interaction.pointers);\n\n utils.copyCoords(interaction.curCoords , interaction.startCoords);\n utils.copyCoords(interaction.prevCoords, interaction.startCoords);\n\n interaction.downEvent = event;\n interaction.downTimes[pointerIndex] = interaction.curCoords.timeStamp;\n interaction.downTargets[pointerIndex] = eventTarget || event && utils.getEventTargets(event)[0];\n interaction.pointerWasMoved = false;\n\n utils.pointerExtend(interaction.downPointer, pointer);\n }\n});\n\nscope.signals.on('add-document' , onDocSignal);\nscope.signals.on('remove-document', onDocSignal);\n\nInteraction.pointerMoveTolerance = 1;\nInteraction.doOnInteractions = doOnInteractions;\nInteraction.endAll = endAll;\nInteraction.signals = signals;\nInteraction.docEvents = docEvents;\n\nscope.endAllInteractions = endAll;\n\nmodule.exports = Interaction;\n","const Interaction = require('../Interaction');\nconst InteractEvent = require('../InteractEvent');\n\nconst actions = {\n firePrepared,\n names: [],\n methodDict: {},\n};\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n interaction._interacting = true;\n firePrepared(interaction, event, 'start');\n});\n\nInteraction.signals.on('action-move', function ({ interaction, event, preEnd }) {\n firePrepared(interaction, event, 'move', preEnd);\n\n // if the action was ended in a listener\n if (!interaction.interacting()) { return false; }\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n firePrepared(interaction, event, 'end');\n});\n\nfunction firePrepared (interaction, event, phase, preEnd) {\n const actionName = interaction.prepared.name;\n\n const newEvent = new InteractEvent(interaction, event, actionName, phase, interaction.element, null, preEnd);\n\n interaction.target.fire(newEvent);\n interaction.prevEvent = newEvent;\n}\n\nmodule.exports = actions;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drag = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n startAxis : 'xy',\n lockAxis : 'xy',\n },\n\n checker: function (pointer, event, interactable) {\n const dragOptions = interactable.options.drag;\n\n return dragOptions.enabled\n ? { name: 'drag', axis: (dragOptions.lockAxis === 'start'\n ? dragOptions.startAxis\n : dragOptions.lockAxis)}\n : null;\n },\n\n getCursor: function () {\n return 'move';\n },\n};\n\nInteraction.signals.on('before-action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n interaction.curCoords.page.y = interaction.startCoords.page.y;\n interaction.curCoords.client.y = interaction.startCoords.client.y;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vx);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vx);\n interaction.pointerDelta.client.vy = 0;\n interaction.pointerDelta.page.vy = 0;\n }\n else if (axis === 'y') {\n interaction.curCoords.page.x = interaction.startCoords.page.x;\n interaction.curCoords.client.x = interaction.startCoords.client.x;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vy);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vy);\n interaction.pointerDelta.client.vx = 0;\n interaction.pointerDelta.page.vx = 0;\n }\n});\n\n// dragmove\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'dragmove') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n iEvent.pageY = interaction.startCoords.page.y;\n iEvent.clientY = interaction.startCoords.client.y;\n iEvent.dy = 0;\n }\n else if (axis === 'y') {\n iEvent.pageX = interaction.startCoords.page.x;\n iEvent.clientX = interaction.startCoords.client.x;\n iEvent.dx = 0;\n }\n});\n\n/*\\\n * Interactable.draggable\n [ method ]\n *\n * Gets or sets whether drag actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of drag events\n | var isDraggable = interact('ul li').draggable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on drag events (object makes the Interactable draggable)\n = (object) This Interactable\n | interact(element).draggable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // the axis in which the first movement must be\n | // for the drag sequence to start\n | // 'xy' by default - any direction\n | startAxis: 'x' || 'y' || 'xy',\n |\n | // 'xy' by default - don't restrict to one axis (move in any direction)\n | // 'x' or 'y' to restrict movement to either axis\n | // 'start' to restrict movement to the axis the drag started in\n | lockAxis: 'x' || 'y' || 'xy' || 'start',\n |\n | // max number of drags that can happen concurrently\n | // with elements of this Interactable. Infinity by default\n | max: Infinity,\n |\n | // max number of drags that can target the same element+Interactable\n | // 1 by default\n | maxPerElement: 2\n | });\n\\*/\nInteractable.prototype.draggable = function (options) {\n if (utils.is.object(options)) {\n this.options.drag.enabled = options.enabled === false? false: true;\n this.setPerAction('drag', options);\n this.setOnEvents('drag', options);\n\n if (/^(xy|x|y|start)$/.test(options.lockAxis)) {\n this.options.drag.lockAxis = options.lockAxis;\n }\n if (/^(xy|x|y)$/.test(options.startAxis)) {\n this.options.drag.startAxis = options.startAxis;\n }\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drag.enabled = options;\n\n if (!options) {\n this.ondragstart = this.ondragstart = this.ondragend = null;\n }\n\n return this;\n }\n\n return this.options.drag;\n};\n\nactions.drag = drag;\nactions.names.push('drag');\nutils.merge(Interactable.eventTypes, [\n 'dragstart',\n 'dragmove',\n 'draginertiastart',\n 'draginertiaresume',\n 'dragend',\n]);\nactions.methodDict.drag = 'draggable';\n\ndefaultOptions.drag = drag.defaults;\n\nmodule.exports = drag;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst scope = require('../scope');\nconst interact = require('../interact');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drop = {\n defaults: {\n enabled: false,\n accept : null,\n overlap: 'pointer',\n },\n};\n\nlet dynamicDrop = false;\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // reset active dropzones\n interaction.activeDrops.dropzones = [];\n interaction.activeDrops.elements = [];\n interaction.activeDrops.rects = [];\n\n interaction.dropEvents = null;\n\n if (!interaction.dynamicDrop) {\n setActiveDrops(interaction, interaction.element);\n }\n\n const dragEvent = interaction.prevEvent;\n const dropEvents = getDropEvents(interaction, event, dragEvent);\n\n if (dropEvents.activate) {\n fireActiveDrops(interaction, dropEvents.activate);\n }\n});\n\nInteractEvent.signals.on('new', function ({ interaction, iEvent, event }) {\n if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { return; }\n\n const draggableElement = interaction.element;\n const dragEvent = iEvent;\n const dropResult = getDrop(dragEvent, event, draggableElement);\n\n interaction.dropTarget = dropResult.dropzone;\n interaction.dropElement = dropResult.element;\n\n interaction.dropEvents = getDropEvents(interaction, event, dragEvent);\n});\n\nInteraction.signals.on('action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n fireDropEvents(interaction, interaction.dropEvents);\n});\n\nInteraction.signals.on('action-end', function ({ interaction }) {\n if (interaction.prepared.name === 'drag') {\n fireDropEvents(interaction, interaction.dropEvents);\n }\n});\n\nInteraction.signals.on('stop-drag', function ({ interaction }) {\n interaction.activeDrops.dropzones =\n interaction.activeDrops.elements =\n interaction.activeDrops.rects =\n interaction.dropEvents = null;\n});\n\nfunction collectDrops (interaction, element) {\n const drops = [];\n const elements = [];\n\n element = element || interaction.element;\n\n // collect all dropzones and their elements which qualify for a drop\n for (const current of scope.interactables) {\n if (!current.options.drop.enabled) { continue; }\n\n const accept = current.options.drop.accept;\n\n // test the draggable element against the dropzone's accept setting\n if ((utils.is.element(accept) && accept !== element)\n || (utils.is.string(accept)\n && !utils.matchesSelector(element, accept))) {\n\n continue;\n }\n\n // query for new elements if necessary\n const dropElements = utils.is.string(current.target)\n ? current._context.querySelectorAll(current.target)\n : [current.target];\n\n for (let i = 0; i < dropElements.length; i++) {\n const currentElement = dropElements[i];\n\n if (currentElement !== element) {\n drops.push(current);\n elements.push(currentElement);\n }\n }\n }\n\n return {\n elements,\n dropzones: drops,\n };\n}\n\nfunction fireActiveDrops (interaction, event) {\n let prevElement;\n\n // loop through all active dropzones and trigger event\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n const current = interaction.activeDrops.dropzones[i];\n const currentElement = interaction.activeDrops.elements [i];\n\n // prevent trigger of duplicate events on same element\n if (currentElement !== prevElement) {\n // set current element as event target\n event.target = currentElement;\n current.fire(event);\n }\n prevElement = currentElement;\n }\n}\n\n// Collect a new set of possible drops and save them in activeDrops.\n// setActiveDrops should always be called when a drag has just started or a\n// drag event happens while dynamicDrop is true\nfunction setActiveDrops (interaction, dragElement) {\n // get dropzones and their elements that could receive the draggable\n const possibleDrops = collectDrops(interaction, dragElement, true);\n\n interaction.activeDrops.dropzones = possibleDrops.dropzones;\n interaction.activeDrops.elements = possibleDrops.elements;\n interaction.activeDrops.rects = [];\n\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n interaction.activeDrops.rects[i] =\n interaction.activeDrops.dropzones[i].getRect(interaction.activeDrops.elements[i]);\n }\n}\n\nfunction getDrop (dragEvent, event, dragElement) {\n const interaction = dragEvent.interaction;\n const validDrops = [];\n\n if (dynamicDrop) {\n setActiveDrops(interaction, dragElement);\n }\n\n // collect all dropzones and their elements which qualify for a drop\n for (let j = 0; j < interaction.activeDrops.dropzones.length; j++) {\n const current = interaction.activeDrops.dropzones[j];\n const currentElement = interaction.activeDrops.elements [j];\n const rect = interaction.activeDrops.rects [j];\n\n validDrops.push(current.dropCheck(dragEvent, event, interaction.target, dragElement, currentElement, rect)\n ? currentElement\n : null);\n }\n\n // get the most appropriate dropzone based on DOM depth and order\n const dropIndex = utils.indexOfDeepestElement(validDrops);\n\n return {\n dropzone: interaction.activeDrops.dropzones[dropIndex] || null,\n element : interaction.activeDrops.elements [dropIndex] || null,\n };\n}\n\nfunction getDropEvents (interaction, pointerEvent, dragEvent) {\n const dropEvents = {\n enter : null,\n leave : null,\n activate : null,\n deactivate: null,\n move : null,\n drop : null,\n };\n\n const tmpl = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n };\n\n if (interaction.dropElement !== interaction.prevDropElement) {\n // if there was a prevDropTarget, create a dragleave event\n if (interaction.prevDropTarget) {\n dropEvents.leave = utils.extend({ type: 'dragleave' }, tmpl);\n\n dragEvent.dragLeave = dropEvents.leave.target = interaction.prevDropElement;\n dragEvent.prevDropzone = dropEvents.leave.dropzone = interaction.prevDropTarget;\n }\n // if the dropTarget is not null, create a dragenter event\n if (interaction.dropTarget) {\n dropEvents.enter = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n type : 'dragenter',\n };\n\n dragEvent.dragEnter = interaction.dropElement;\n dragEvent.dropzone = interaction.dropTarget;\n }\n }\n\n if (dragEvent.type === 'dragend' && interaction.dropTarget) {\n dropEvents.drop = utils.extend({ type: 'drop' }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n dragEvent.relatedTarget = interaction.dropElement;\n }\n if (dragEvent.type === 'dragstart') {\n dropEvents.activate = utils.extend({ type: 'dropactivate' }, tmpl);\n\n dropEvents.activate.target = null;\n dropEvents.activate.dropzone = null;\n }\n if (dragEvent.type === 'dragend') {\n dropEvents.deactivate = utils.extend({ type: 'dropdeactivate' }, tmpl);\n\n dropEvents.deactivate.target = null;\n dropEvents.deactivate.dropzone = null;\n }\n if (dragEvent.type === 'dragmove' && interaction.dropTarget) {\n dropEvents.move = utils.extend({\n dragmove : dragEvent,\n type : 'dropmove',\n }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n }\n\n return dropEvents;\n}\n\nfunction fireDropEvents (interaction, dropEvents) {\n if (dropEvents.leave) { interaction.prevDropTarget.fire(dropEvents.leave); }\n if (dropEvents.move ) { interaction.dropTarget.fire(dropEvents.move ); }\n if (dropEvents.enter) { interaction.dropTarget.fire(dropEvents.enter); }\n if (dropEvents.drop ) { interaction.dropTarget.fire(dropEvents.drop ); }\n if (dropEvents.deactivate) {\n fireActiveDrops(interaction, dropEvents.deactivate);\n }\n\n interaction.prevDropTarget = interaction.dropTarget;\n interaction.prevDropElement = interaction.dropElement;\n}\n\n/*\\\n * Interactable.dropzone\n [ method ]\n *\n * Returns or sets whether elements can be dropped onto this\n * Interactable to trigger drop events\n *\n * Dropzones can receive the following events:\n * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends\n * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone\n * - `dragmove` when a draggable that has entered the dropzone is moved\n * - `drop` when a draggable is dropped into this dropzone\n *\n * Use the `accept` option to allow only elements that match the given CSS\n * selector or element. The value can be:\n *\n * - **an Element** - only that element can be dropped into this dropzone.\n * - **a string**, - the element being dragged must match it as a CSS selector.\n * - **`null`** - accept options is cleared - it accepts any element.\n *\n * Use the `overlap` option to set how drops are checked for. The allowed\n * values are:\n *\n * - `'pointer'`, the pointer must be over the dropzone (default)\n * - `'center'`, the draggable element's center must be over the dropzone\n * - a number from 0-1 which is the `(intersection area) / (draggable area)`.\n * e.g. `0.5` for drop to happen when half of the area of the draggable is\n * over the dropzone\n *\n * Use the `checker` option to specify a function to check if a dragged\n * element is over this Interactable.\n *\n | interact(target)\n | .dropChecker(function(dragEvent, // related dragmove or dragend event\n | event, // TouchEvent/PointerEvent/MouseEvent\n | dropped, // bool result of the default checker\n | dropzone, // dropzone Interactable\n | dropElement, // dropzone elemnt\n | draggable, // draggable Interactable\n | draggableElement) {// draggable element\n |\n | return dropped && event.target.hasAttribute('allow-drop');\n | }\n *\n *\n - options (boolean | object | null) #optional The new value to be set.\n | interact('.drop').dropzone({\n | accept: '.can-drop' || document.getElementById('single-drop'),\n | overlap: 'pointer' || 'center' || zeroToOne\n | }\n = (boolean | object) The current setting or this Interactable\n\\*/\nInteractable.prototype.dropzone = function (options) {\n if (utils.is.object(options)) {\n this.options.drop.enabled = options.enabled === false? false: true;\n\n if (utils.is.function(options.ondrop) ) { this.events.ondrop = options.ondrop ; }\n if (utils.is.function(options.ondropactivate) ) { this.events.ondropactivate = options.ondropactivate ; }\n if (utils.is.function(options.ondropdeactivate)) { this.events.ondropdeactivate = options.ondropdeactivate; }\n if (utils.is.function(options.ondragenter) ) { this.events.ondragenter = options.ondragenter ; }\n if (utils.is.function(options.ondragleave) ) { this.events.ondragleave = options.ondragleave ; }\n if (utils.is.function(options.ondropmove) ) { this.events.ondropmove = options.ondropmove ; }\n\n if (/^(pointer|center)$/.test(options.overlap)) {\n this.options.drop.overlap = options.overlap;\n }\n else if (utils.is.number(options.overlap)) {\n this.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0);\n }\n if ('accept' in options) {\n this.options.drop.accept = options.accept;\n }\n if ('checker' in options) {\n this.options.drop.checker = options.checker;\n }\n\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drop.enabled = options;\n\n if (!options) {\n this.ondragenter = this.ondragleave = this.ondrop\n = this.ondropactivate = this.ondropdeactivate = null;\n }\n\n return this;\n }\n\n return this.options.drop;\n};\n\nInteractable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) {\n let dropped = false;\n\n // if the dropzone has no rect (eg. display: none)\n // call the custom dropChecker or just return false\n if (!(rect = rect || this.getRect(dropElement))) {\n return (this.options.drop.checker\n ? this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement)\n : false);\n }\n\n const dropOverlap = this.options.drop.overlap;\n\n if (dropOverlap === 'pointer') {\n const origin = utils.getOriginXY(draggable, draggableElement, 'drag');\n const page = utils.getPageXY(dragEvent);\n\n page.x += origin.x;\n page.y += origin.y;\n\n const horizontal = (page.x > rect.left) && (page.x < rect.right);\n const vertical = (page.y > rect.top ) && (page.y < rect.bottom);\n\n dropped = horizontal && vertical;\n }\n\n const dragRect = draggable.getRect(draggableElement);\n\n if (dragRect && dropOverlap === 'center') {\n const cx = dragRect.left + dragRect.width / 2;\n const cy = dragRect.top + dragRect.height / 2;\n\n dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom;\n }\n\n if (dragRect && utils.is.number(dropOverlap)) {\n const overlapArea = (Math.max(0, Math.min(rect.right , dragRect.right ) - Math.max(rect.left, dragRect.left))\n * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top , dragRect.top )));\n\n const overlapRatio = overlapArea / (dragRect.width * dragRect.height);\n\n dropped = overlapRatio >= dropOverlap;\n }\n\n if (this.options.drop.checker) {\n dropped = this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement);\n }\n\n return dropped;\n};\n\nInteractable.signals.on('unset', function ({ interactable }) {\n interactable.dropzone(false);\n});\n\nInteractable.settingsMethods.push('dropChecker');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.dropTarget = null; // the dropzone a drag target might be dropped into\n interaction.dropElement = null; // the element at the time of checking\n interaction.prevDropTarget = null; // the dropzone that was recently dragged away from\n interaction.prevDropElement = null; // the element at the time of checking\n interaction.dropEvents = null; // the dropEvents related to the current drag event\n\n interaction.activeDrops = {\n dropzones: [], // the dropzones that are mentioned below\n elements : [], // elements of dropzones that accept the target draggable\n rects : [], // the rects of the elements mentioned above\n };\n\n});\n\nInteraction.signals.on('stop', function ({ interaction }) {\n interaction.dropTarget = interaction.dropElement =\n interaction.prevDropTarget = interaction.prevDropElement = null;\n});\n\n/*\\\n * interact.dynamicDrop\n [ method ]\n *\n * Returns or sets whether the dimensions of dropzone elements are\n * calculated on every dragmove or only on dragstart for the default\n * dropChecker\n *\n - newValue (boolean) #optional True to check on each move. False to check only before start\n = (boolean | interact) The current setting or interact\n\\*/\ninteract.dynamicDrop = function (newValue) {\n if (utils.is.bool(newValue)) {\n //if (dragging && dynamicDrop !== newValue && !newValue) {\n //calcRects(dropzones);\n //}\n\n dynamicDrop = newValue;\n\n return interact;\n }\n return dynamicDrop;\n};\n\nutils.merge(Interactable.eventTypes, [\n 'dragenter',\n 'dragleave',\n 'dropactivate',\n 'dropdeactivate',\n 'dropmove',\n 'drop',\n]);\nactions.methodDict.drop = 'dropzone';\n\ndefaultOptions.drop = drop.defaults;\n\nmodule.exports = drop;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst gesture = {\n defaults: {\n enabled : false,\n origin : null,\n restrict: null,\n },\n\n checker: function (pointer, event, interactable, element, interaction) {\n if (interaction.pointerIds.length >= 2) {\n return { name: 'gesture' };\n }\n\n return null;\n },\n\n getCursor: function () {\n return '';\n },\n};\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturestart') { return; }\n iEvent.ds = 0;\n\n interaction.gesture.startDistance = interaction.gesture.prevDistance = iEvent.distance;\n interaction.gesture.startAngle = interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.scale = 1;\n});\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturemove') { return; }\n\n iEvent.ds = iEvent.scale - interaction.gesture.scale;\n\n interaction.target.fire(iEvent);\n\n interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.prevDistance = iEvent.distance;\n\n if (iEvent.scale !== Infinity\n && iEvent.scale !== null\n && iEvent.scale !== undefined\n && !isNaN(iEvent.scale)) {\n\n interaction.gesture.scale = iEvent.scale;\n }\n});\n\n/*\\\n * Interactable.gesturable\n [ method ]\n *\n * Gets or sets whether multitouch gestures can be performed on the\n * Interactable's element\n *\n = (boolean) Indicates if this can be the target of gesture events\n | var isGestureable = interact(element).gesturable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on gesture events (makes the Interactable gesturable)\n = (object) this Interactable\n | interact(element).gesturable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // limit multiple gestures.\n | // See the explanation in @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n\\*/\nInteractable.prototype.gesturable = function (options) {\n if (utils.is.object(options)) {\n this.options.gesture.enabled = options.enabled === false? false: true;\n this.setPerAction('gesture', options);\n this.setOnEvents('gesture', options);\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.gesture.enabled = options;\n\n if (!options) {\n this.ongesturestart = this.ongesturestart = this.ongestureend = null;\n }\n\n return this;\n }\n\n return this.options.gesture;\n};\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action, event, starting, ending, deltaSource }) {\n if (action !== 'gesture') { return; }\n\n const pointers = interaction.pointers;\n\n iEvent.touches = [pointers[0], pointers[1]];\n\n if (starting) {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = 1;\n iEvent.ds = 0;\n iEvent.angle = utils.touchAngle(pointers, undefined, deltaSource);\n iEvent.da = 0;\n }\n else if (ending || event instanceof InteractEvent) {\n iEvent.distance = interaction.prevEvent.distance;\n iEvent.box = interaction.prevEvent.box;\n iEvent.scale = interaction.prevEvent.scale;\n iEvent.ds = iEvent.scale - 1;\n iEvent.angle = interaction.prevEvent.angle;\n iEvent.da = iEvent.angle - interaction.gesture.startAngle;\n }\n else {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = iEvent.distance / interaction.gesture.startDistance;\n iEvent.angle = utils.touchAngle(pointers, interaction.gesture.prevAngle, deltaSource);\n\n iEvent.ds = iEvent.scale - interaction.gesture.prevScale;\n iEvent.da = iEvent.angle - interaction.gesture.prevAngle;\n }\n});\n\nInteraction.signals.on('new', function (interaction) {\n interaction.gesture = {\n start: { x: 0, y: 0 },\n\n startDistance: 0, // distance between two touches of touchStart\n prevDistance : 0,\n distance : 0,\n\n scale: 1, // gesture.distance / gesture.startDistance\n\n startAngle: 0, // angle of line joining two touches\n prevAngle : 0, // angle of the previous gesture event\n };\n});\n\nactions.gesture = gesture;\nactions.names.push('gesture');\nutils.merge(Interactable.eventTypes, [\n 'gesturestart',\n 'gesturemove',\n 'gestureend',\n]);\nactions.methodDict.gesture = 'gesturable';\n\ndefaultOptions.gesture = gesture.defaults;\n\nmodule.exports = gesture;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\n// Less Precision with touch input\nconst defaultMargin = browser.supportsTouch || browser.supportsPointerEvent? 20: 10;\n\nconst resize = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n square: false,\n preserveAspectRatio: false,\n axis: 'xy',\n\n // use default margin\n margin: NaN,\n\n // object with props left, right, top, bottom which are\n // true/false values to resize when the pointer is over that edge,\n // CSS selectors to match the handles for each direction\n // or the Elements for each handle\n edges: null,\n\n // a value of 'none' will limit the resize rect to a minimum of 0x0\n // 'negate' will alow the rect to have negative width/height\n // 'reposition' will keep the width/height positive by swapping\n // the top and bottom edges and/or swapping the left and right edges\n invert: 'none',\n },\n\n checker: function (pointer, event, interactable, element, interaction, rect) {\n if (!rect) { return null; }\n\n const page = utils.extend({}, interaction.curCoords.page);\n const options = interactable.options;\n\n if (options.resize.enabled) {\n const resizeOptions = options.resize;\n const resizeEdges = { left: false, right: false, top: false, bottom: false };\n\n // if using resize.edges\n if (utils.is.object(resizeOptions.edges)) {\n for (const edge in resizeEdges) {\n resizeEdges[edge] = checkResizeEdge(edge,\n resizeOptions.edges[edge],\n page,\n interaction._eventTarget,\n element,\n rect,\n resizeOptions.margin || defaultMargin);\n }\n\n resizeEdges.left = resizeEdges.left && !resizeEdges.right;\n resizeEdges.top = resizeEdges.top && !resizeEdges.bottom;\n\n if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) {\n return {\n name: 'resize',\n edges: resizeEdges,\n };\n }\n }\n else {\n const right = options.resize.axis !== 'y' && page.x > (rect.right - defaultMargin);\n const bottom = options.resize.axis !== 'x' && page.y > (rect.bottom - defaultMargin);\n\n if (right || bottom) {\n return {\n name: 'resize',\n axes: (right? 'x' : '') + (bottom? 'y' : ''),\n };\n }\n }\n }\n\n return null;\n },\n\n cursors: (browser.isIe9OrOlder ? {\n x : 'e-resize',\n y : 's-resize',\n xy: 'se-resize',\n\n top : 'n-resize',\n left : 'w-resize',\n bottom : 's-resize',\n right : 'e-resize',\n topleft : 'se-resize',\n bottomright: 'se-resize',\n topright : 'ne-resize',\n bottomleft : 'ne-resize',\n } : {\n x : 'ew-resize',\n y : 'ns-resize',\n xy: 'nwse-resize',\n\n top : 'ns-resize',\n left : 'ew-resize',\n bottom : 'ns-resize',\n right : 'ew-resize',\n topleft : 'nwse-resize',\n bottomright: 'nwse-resize',\n topright : 'nesw-resize',\n bottomleft : 'nesw-resize',\n }),\n\n getCursor: function (action) {\n if (action.axis) {\n return resize.cursors[action.name + action.axis];\n }\n else if (action.edges) {\n let cursorKey = '';\n const edgeNames = ['top', 'bottom', 'left', 'right'];\n\n for (let i = 0; i < 4; i++) {\n if (action.edges[edgeNames[i]]) {\n cursorKey += edgeNames[i];\n }\n }\n\n return resize.cursors[cursorKey];\n }\n },\n};\n\n// resizestart\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'resizestart' || !interaction.prepared.edges) {\n return;\n }\n\n const startRect = interaction.target.getRect(interaction.element);\n const resizeOptions = interaction.target.options.resize;\n\n /*\n * When using the `resizable.square` or `resizable.preserveAspectRatio` options, resizing from one edge\n * will affect another. E.g. with `resizable.square`, resizing to make the right edge larger will make\n * the bottom edge larger by the same amount. We call these 'linked' edges. Any linked edges will depend\n * on the active edges and the edge being interacted with.\n */\n if (resizeOptions.square || resizeOptions.preserveAspectRatio) {\n const linkedEdges = utils.extend({}, interaction.prepared.edges);\n\n linkedEdges.top = linkedEdges.top || (linkedEdges.left && !linkedEdges.bottom);\n linkedEdges.left = linkedEdges.left || (linkedEdges.top && !linkedEdges.right );\n linkedEdges.bottom = linkedEdges.bottom || (linkedEdges.right && !linkedEdges.top );\n linkedEdges.right = linkedEdges.right || (linkedEdges.bottom && !linkedEdges.left );\n\n interaction.prepared._linkedEdges = linkedEdges;\n }\n else {\n interaction.prepared._linkedEdges = null;\n }\n\n // if using `resizable.preserveAspectRatio` option, record aspect ratio at the start of the resize\n if (resizeOptions.preserveAspectRatio) {\n interaction.resizeStartAspectRatio = startRect.width / startRect.height;\n }\n\n interaction.resizeRects = {\n start : startRect,\n current : utils.extend({}, startRect),\n inverted : utils.extend({}, startRect),\n previous : utils.extend({}, startRect),\n delta : {\n left: 0, right : 0, width : 0,\n top : 0, bottom: 0, height: 0,\n },\n };\n\n iEvent.rect = interaction.resizeRects.inverted;\n iEvent.deltaRect = interaction.resizeRects.delta;\n});\n\n// resizemove\nInteractEvent.signals.on('new', function ({ iEvent, phase, interaction }) {\n if (phase !== 'move' || !interaction.prepared.edges) { return; }\n\n const resizeOptions = interaction.target.options.resize;\n const invert = resizeOptions.invert;\n const invertible = invert === 'reposition' || invert === 'negate';\n\n let edges = interaction.prepared.edges;\n\n const start = interaction.resizeRects.start;\n const current = interaction.resizeRects.current;\n const inverted = interaction.resizeRects.inverted;\n const delta = interaction.resizeRects.delta;\n const previous = utils.extend(interaction.resizeRects.previous, inverted);\n const originalEdges = edges;\n\n let dx = iEvent.dx;\n let dy = iEvent.dy;\n\n if (resizeOptions.preserveAspectRatio || resizeOptions.square) {\n // `resize.preserveAspectRatio` takes precedence over `resize.square`\n const startAspectRatio = resizeOptions.preserveAspectRatio\n ? interaction.resizeStartAspectRatio\n : 1;\n\n edges = interaction.prepared._linkedEdges;\n\n if ((originalEdges.left && originalEdges.bottom)\n || (originalEdges.right && originalEdges.top)) {\n dy = -dx / startAspectRatio;\n }\n else if (originalEdges.left || originalEdges.right ) { dy = dx / startAspectRatio; }\n else if (originalEdges.top || originalEdges.bottom) { dx = dy * startAspectRatio; }\n }\n\n // update the 'current' rect without modifications\n if (edges.top ) { current.top += dy; }\n if (edges.bottom) { current.bottom += dy; }\n if (edges.left ) { current.left += dx; }\n if (edges.right ) { current.right += dx; }\n\n if (invertible) {\n // if invertible, copy the current rect\n utils.extend(inverted, current);\n\n if (invert === 'reposition') {\n // swap edge values if necessary to keep width/height positive\n let swap;\n\n if (inverted.top > inverted.bottom) {\n swap = inverted.top;\n\n inverted.top = inverted.bottom;\n inverted.bottom = swap;\n }\n if (inverted.left > inverted.right) {\n swap = inverted.left;\n\n inverted.left = inverted.right;\n inverted.right = swap;\n }\n }\n }\n else {\n // if not invertible, restrict to minimum of 0x0 rect\n inverted.top = Math.min(current.top, start.bottom);\n inverted.bottom = Math.max(current.bottom, start.top);\n inverted.left = Math.min(current.left, start.right);\n inverted.right = Math.max(current.right, start.left);\n }\n\n inverted.width = inverted.right - inverted.left;\n inverted.height = inverted.bottom - inverted.top ;\n\n for (const edge in inverted) {\n delta[edge] = inverted[edge] - previous[edge];\n }\n\n iEvent.edges = interaction.prepared.edges;\n iEvent.rect = inverted;\n iEvent.deltaRect = delta;\n});\n\n/*\\\n * Interactable.resizable\n [ method ]\n *\n * Gets or sets whether resize actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of resize elements\n | var isResizeable = interact('input[type=text]').resizable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on resize events (object makes the Interactable resizable)\n = (object) This Interactable\n | interact(element).resizable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | edges: {\n | top : true, // Use pointer coords to check for resize.\n | left : false, // Disable resizing from left edge.\n | bottom: '.resize-s',// Resize if pointer target matches selector\n | right : handleEl // Resize if pointer target is the given Element\n | },\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height are adjusted at a 1:1 ratio.\n | square: false,\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height maintain the aspect ratio they had when resizing started.\n | preserveAspectRatio: false,\n |\n | // a value of 'none' will limit the resize rect to a minimum of 0x0\n | // 'negate' will allow the rect to have negative width/height\n | // 'reposition' will keep the width/height positive by swapping\n | // the top and bottom edges and/or swapping the left and right edges\n | invert: 'none' || 'negate' || 'reposition'\n |\n | // limit multiple resizes.\n | // See the explanation in the @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n \\*/\nInteractable.prototype.resizable = function (options) {\n if (utils.is.object(options)) {\n this.options.resize.enabled = options.enabled === false? false: true;\n this.setPerAction('resize', options);\n this.setOnEvents('resize', options);\n\n if (/^x$|^y$|^xy$/.test(options.axis)) {\n this.options.resize.axis = options.axis;\n }\n else if (options.axis === null) {\n this.options.resize.axis = defaultOptions.resize.axis;\n }\n\n if (utils.is.bool(options.preserveAspectRatio)) {\n this.options.resize.preserveAspectRatio = options.preserveAspectRatio;\n }\n else if (utils.is.bool(options.square)) {\n this.options.resize.square = options.square;\n }\n\n return this;\n }\n if (utils.is.bool(options)) {\n this.options.resize.enabled = options;\n\n if (!options) {\n this.onresizestart = this.onresizestart = this.onresizeend = null;\n }\n\n return this;\n }\n return this.options.resize;\n};\n\nfunction checkResizeEdge (name, value, page, element, interactableElement, rect, margin) {\n // false, '', undefined, null\n if (!value) { return false; }\n\n // true value, use pointer coords and element rect\n if (value === true) {\n // if dimensions are negative, \"switch\" edges\n const width = utils.is.number(rect.width )? rect.width : rect.right - rect.left;\n const height = utils.is.number(rect.height)? rect.height : rect.bottom - rect.top ;\n\n if (width < 0) {\n if (name === 'left' ) { name = 'right'; }\n else if (name === 'right') { name = 'left' ; }\n }\n if (height < 0) {\n if (name === 'top' ) { name = 'bottom'; }\n else if (name === 'bottom') { name = 'top' ; }\n }\n\n if (name === 'left' ) { return page.x < ((width >= 0? rect.left: rect.right ) + margin); }\n if (name === 'top' ) { return page.y < ((height >= 0? rect.top : rect.bottom) + margin); }\n\n if (name === 'right' ) { return page.x > ((width >= 0? rect.right : rect.left) - margin); }\n if (name === 'bottom') { return page.y > ((height >= 0? rect.bottom: rect.top ) - margin); }\n }\n\n // the remaining checks require an element\n if (!utils.is.element(element)) { return false; }\n\n return utils.is.element(value)\n // the value is an element to use as a resize handle\n ? value === element\n // otherwise check if element matches value as selector\n : utils.matchesUpTo(element, value, interactableElement);\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.resizeAxes = 'xy';\n});\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action }) {\n if (action !== 'resize' || !interaction.resizeAxes) { return; }\n\n const options = interaction.target.options;\n\n if (options.resize.square) {\n if (interaction.resizeAxes === 'y') {\n iEvent.dx = iEvent.dy;\n }\n else {\n iEvent.dy = iEvent.dx;\n }\n iEvent.axes = 'xy';\n }\n else {\n iEvent.axes = interaction.resizeAxes;\n\n if (interaction.resizeAxes === 'x') {\n iEvent.dy = 0;\n }\n else if (interaction.resizeAxes === 'y') {\n iEvent.dx = 0;\n }\n }\n});\n\nactions.resize = resize;\nactions.names.push('resize');\nutils.merge(Interactable.eventTypes, [\n 'resizestart',\n 'resizemove',\n 'resizeinertiastart',\n 'resizeinertiaresume',\n 'resizeend',\n]);\nactions.methodDict.resize = 'resizable';\n\ndefaultOptions.resize = resize.defaults;\n\nmodule.exports = resize;\n","const raf = require('./utils/raf');\nconst getWindow = require('./utils/window').getWindow;\nconst is = require('./utils/is');\nconst domUtils = require('./utils/domUtils');\nconst Interaction = require('./Interaction');\nconst defaultOptions = require('./defaultOptions');\n\nconst autoScroll = {\n defaults: {\n enabled : false,\n container: null, // the item that is scrolled (Window or HTMLElement)\n margin : 60,\n speed : 300, // the scroll speed in pixels per second\n },\n\n interaction: null,\n i: null, // the handle returned by window.setInterval\n x: 0, y: 0, // Direction each pulse is to scroll in\n\n isScrolling: false,\n prevTime: 0,\n\n start: function (interaction) {\n autoScroll.isScrolling = true;\n raf.cancel(autoScroll.i);\n\n autoScroll.interaction = interaction;\n autoScroll.prevTime = new Date().getTime();\n autoScroll.i = raf.request(autoScroll.scroll);\n },\n\n stop: function () {\n autoScroll.isScrolling = false;\n raf.cancel(autoScroll.i);\n },\n\n // scroll the window by the values in scroll.x/y\n scroll: function () {\n const options = autoScroll.interaction.target.options[autoScroll.interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(autoScroll.interaction.element);\n const now = new Date().getTime();\n // change in time in seconds\n const dt = (now - autoScroll.prevTime) / 1000;\n // displacement\n const s = options.speed * dt;\n\n if (s >= 1) {\n if (is.window(container)) {\n container.scrollBy(autoScroll.x * s, autoScroll.y * s);\n }\n else if (container) {\n container.scrollLeft += autoScroll.x * s;\n container.scrollTop += autoScroll.y * s;\n }\n\n autoScroll.prevTime = now;\n }\n\n if (autoScroll.isScrolling) {\n raf.cancel(autoScroll.i);\n autoScroll.i = raf.request(autoScroll.scroll);\n }\n },\n check: function (interactable, actionName) {\n const options = interactable.options;\n\n return options[actionName].autoScroll && options[actionName].autoScroll.enabled;\n },\n onInteractionMove: function ({ interaction, pointer }) {\n if (!(interaction.interacting()\n && autoScroll.check(interaction.target, interaction.prepared.name))) {\n return;\n }\n\n if (interaction.simulation) {\n autoScroll.x = autoScroll.y = 0;\n return;\n }\n\n let top;\n let right;\n let bottom;\n let left;\n\n const options = interaction.target.options[interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(interaction.element);\n\n if (is.window(container)) {\n left = pointer.clientX < autoScroll.margin;\n top = pointer.clientY < autoScroll.margin;\n right = pointer.clientX > container.innerWidth - autoScroll.margin;\n bottom = pointer.clientY > container.innerHeight - autoScroll.margin;\n }\n else {\n const rect = domUtils.getElementClientRect(container);\n\n left = pointer.clientX < rect.left + autoScroll.margin;\n top = pointer.clientY < rect.top + autoScroll.margin;\n right = pointer.clientX > rect.right - autoScroll.margin;\n bottom = pointer.clientY > rect.bottom - autoScroll.margin;\n }\n\n autoScroll.x = (right ? 1: left? -1: 0);\n autoScroll.y = (bottom? 1: top? -1: 0);\n\n if (!autoScroll.isScrolling) {\n // set the autoScroll properties to those of the target\n autoScroll.margin = options.margin;\n autoScroll.speed = options.speed;\n\n autoScroll.start(interaction);\n }\n },\n};\n\nInteraction.signals.on('stop-active', function () {\n autoScroll.stop();\n});\n\nInteraction.signals.on('action-move', autoScroll.onInteractionMove);\n\ndefaultOptions.perAction.autoScroll = autoScroll.defaults;\n\nmodule.exports = autoScroll;\n","const Interactable = require('../Interactable');\nconst actions = require('../actions/base');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.ignoreFrom\n [ method ]\n *\n * If the target of the `mousedown`, `pointerdown` or `touchstart`\n * event or any of it's parents match the given CSS selector or\n * Element, no drag/resize/gesture is started.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to not ignore any elements\n = (string | Element | object) The current ignoreFrom value or this Interactable\n **\n | interact(element, { ignoreFrom: document.getElementById('no-action') });\n | // or\n | interact(element).ignoreFrom('input, textarea, a');\n\\*/\nInteractable.prototype.ignoreFrom = function (newValue) {\n return this._backCompatOption('ignoreFrom', newValue);\n};\n\n/*\\\n * Interactable.allowFrom\n [ method ]\n *\n * A drag/resize/gesture is started only If the target of the\n * `mousedown`, `pointerdown` or `touchstart` event or any of it's\n * parents match the given CSS selector or Element.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to allow from any element\n = (string | Element | object) The current allowFrom value or this Interactable\n **\n | interact(element, { allowFrom: document.getElementById('drag-handle') });\n | // or\n | interact(element).allowFrom('.handle');\n\\*/\nInteractable.prototype.allowFrom = function (newValue) {\n return this._backCompatOption('allowFrom', newValue);\n};\n\nInteractable.prototype.testIgnore = function (ignoreFrom, interactableElement, element) {\n if (!ignoreFrom || !is.element(element)) { return false; }\n\n if (is.string(ignoreFrom)) {\n return domUtils.matchesUpTo(element, ignoreFrom, interactableElement);\n }\n else if (is.element(ignoreFrom)) {\n return domUtils.nodeContains(ignoreFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testAllow = function (allowFrom, interactableElement, element) {\n if (!allowFrom) { return true; }\n\n if (!is.element(element)) { return false; }\n\n if (is.string(allowFrom)) {\n return domUtils.matchesUpTo(element, allowFrom, interactableElement);\n }\n else if (is.element(allowFrom)) {\n return domUtils.nodeContains(allowFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testIgnoreAllow = function (options, interactableElement, eventTarget) {\n return (!this.testIgnore(options.ignoreFrom, interactableElement, eventTarget)\n && this.testAllow(options.allowFrom, interactableElement, eventTarget));\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (event.buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\n","const interact = require('../interact');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst actions = require('../actions/base');\nconst defaultOptions = require('../defaultOptions');\nconst browser = require('../utils/browser');\nconst scope = require('../scope');\nconst utils = require('../utils');\nconst signals = require('../utils/Signals').new();\n\nrequire('./InteractableMethods');\n\nconst autoStart = {\n signals,\n withinInteractionLimit,\n // Allow this many interactions to happen simultaneously\n maxInteractions: Infinity,\n defaults: {\n perAction: {\n manualStart: false,\n max: Infinity,\n maxPerElement: 1,\n allowFrom: null,\n ignoreFrom: null,\n },\n },\n setActionDefaults: function (action) {\n utils.extend(action.defaults, autoStart.defaults.perAction);\n },\n};\n\n// set cursor style on mousedown\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget }) {\n if (interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\n// set cursor style on mousemove\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget }) {\n if (!interaction.mouse\n || interaction.pointerIsDown\n || interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\nInteraction.signals.on('move', function (arg) {\n const { interaction, event } = arg;\n\n if (!interaction.pointerIsDown\n || interaction.interacting()\n || !interaction.pointerWasMoved\n || !interaction.prepared.name) {\n return;\n }\n\n signals.fire('before-start', arg);\n\n const target = interaction.target;\n\n if (interaction.prepared.name && target) {\n // check manualStart and interaction limit\n if (target.options[interaction.prepared.name].manualStart\n || !withinInteractionLimit(target, interaction.element, interaction.prepared)) {\n interaction.stop(event);\n }\n else {\n interaction.start(interaction.prepared, target, interaction.element);\n }\n }\n});\n\n// Check if the current target supports the action.\n// If so, return the validated action. Otherwise, return null\nfunction validateAction (action, interactable, element, eventTarget) {\n if (utils.is.object(action)\n && interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget)\n && interactable.options[action.name].enabled\n && withinInteractionLimit(interactable, element, action)) {\n return action;\n }\n\n return null;\n}\n\nfunction validateSelector (interaction, pointer, event, matches, matchElements, eventTarget) {\n for (let i = 0, len = matches.length; i < len; i++) {\n const match = matches[i];\n const matchElement = matchElements[i];\n const action = validateAction(match.getAction(pointer, event, interaction, matchElement),\n match,\n matchElement,\n eventTarget);\n\n if (action) {\n return {\n action,\n target: match,\n element: matchElement,\n };\n }\n }\n\n return {};\n}\n\nfunction getActionInfo (interaction, pointer, event, eventTarget) {\n let matches = [];\n let matchElements = [];\n\n let element = eventTarget;\n let action = null;\n\n function pushMatches (interactable, selector, context) {\n const elements = (browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined);\n\n if (utils.matchesSelector(element, selector, elements)) {\n\n matches.push(interactable);\n matchElements.push(element);\n }\n }\n\n while (utils.is.element(element)) {\n matches = [];\n matchElements = [];\n\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && (action = validateAction(elementInteractable.getAction(pointer, event, interaction, element, eventTarget),\n elementInteractable,\n element,\n eventTarget))\n && !elementInteractable.options[action.name].manualStart) {\n return {\n element,\n action,\n target: elementInteractable,\n };\n }\n else {\n scope.interactables.forEachSelector(pushMatches, element);\n\n const actionInfo = validateSelector(interaction, pointer, event, matches, matchElements, eventTarget);\n\n if (actionInfo.action\n && !actionInfo.target.options[actionInfo.action.name].manualStart) {\n return actionInfo;\n }\n }\n\n element = utils.parentNode(element);\n }\n\n return {};\n}\n\nfunction prepare (interaction, { action, target, element }) {\n action = action || {};\n\n if (interaction.target && interaction.target.options.styleCursor) {\n interaction.target._doc.documentElement.style.cursor = '';\n }\n\n interaction.target = target;\n interaction.element = element;\n utils.copyAction(interaction.prepared, action);\n\n if (target && target.options.styleCursor) {\n const cursor = action? actions[action.name].getCursor(action) : '';\n interaction.target._doc.documentElement.style.cursor = cursor;\n }\n\n signals.fire('prepared', { interaction: interaction });\n}\n\nInteraction.signals.on('stop', function ({ interaction }) {\n const target = interaction.target;\n\n if (target && target.options.styleCursor) {\n target._doc.documentElement.style.cursor = '';\n }\n});\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (utils.is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (utils.is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n const buttons = event.buttons || ({\n 0: 1,\n 1: 4,\n 3: 8,\n 4: 16,\n })[event.button];\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\nfunction withinInteractionLimit (interactable, element, action) {\n const options = interactable.options;\n const maxActions = options[action.name].max;\n const maxPerElement = options[action.name].maxPerElement;\n let activeInteractions = 0;\n let targetCount = 0;\n let targetElementCount = 0;\n\n // no actions if any of these values == 0\n if (!(maxActions && maxPerElement && autoStart.maxInteractions)) { return; }\n\n for (let i = 0, len = scope.interactions.length; i < len; i++) {\n const interaction = scope.interactions[i];\n const otherAction = interaction.prepared.name;\n\n if (!interaction.interacting()) { continue; }\n\n activeInteractions++;\n\n if (activeInteractions >= autoStart.maxInteractions) {\n return false;\n }\n\n if (interaction.target !== interactable) { continue; }\n\n targetCount += (otherAction === action.name)|0;\n\n if (targetCount >= maxActions) {\n return false;\n }\n\n if (interaction.element === element) {\n targetElementCount++;\n\n if (otherAction !== action.name || targetElementCount >= maxPerElement) {\n return false;\n }\n }\n }\n\n return autoStart.maxInteractions > 0;\n}\n\n/*\\\n * interact.maxInteractions\n [ method ]\n **\n * Returns or sets the maximum number of concurrent interactions allowed.\n * By default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables\n * and elements, you need to enable it in the draggable, resizable and\n * gesturable `'max'` and `'maxPerElement'` options.\n **\n - newValue (number) #optional Any number. newValue <= 0 means no interactions.\n\\*/\ninteract.maxInteractions = function (newValue) {\n if (utils.is.number(newValue)) {\n autoStart.maxInteractions = newValue;\n\n return this;\n }\n\n return autoStart.maxInteractions;\n};\n\nInteractable.settingsMethods.push('styleCursor');\nInteractable.settingsMethods.push('actionChecker');\nInteractable.settingsMethods.push('ignoreFrom');\nInteractable.settingsMethods.push('allowFrom');\n\ndefaultOptions.base.actionChecker = null;\ndefaultOptions.base.styleCursor = true;\n\nutils.extend(defaultOptions.perAction, autoStart.defaults.perAction);\n\nmodule.exports = autoStart;\n","const autoStart = require('./base');\nconst Interaction = require('../Interaction');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.delayTimer = null;\n});\n\nautoStart.signals.on('prepared', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.delayTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.target, interaction.element);\n }, delay);\n }\n});\n\nInteraction.signals.on('move', function ({ interaction, duplicate }) {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.delayTimer);\n }\n});\n\n// prevent regular down->move autoStart\nautoStart.signals.on('before-start', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.prepared.name = null;\n }\n});\n","const autoStart = require('./base');\nconst scope = require('../scope');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\n\nconst { matchesSelector, parentNode } = require('../utils/domUtils');\n\nautoStart.setActionDefaults(require('../actions/drag'));\n\nautoStart.signals.on('before-start', function ({ interaction, eventTarget, dx, dy }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // check if a drag is in the correct axis\n const absX = Math.abs(dx);\n const absY = Math.abs(dy);\n const options = interaction.target.options.drag;\n const startAxis = options.startAxis;\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy');\n\n interaction.prepared.axis = options.lockAxis === 'start'\n ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n : options.lockAxis;\n\n // if the movement isn't in the startAxis of the interactable\n if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) {\n // cancel the prepared action\n interaction.prepared.name = null;\n\n // then try to get a drag from another ineractable\n\n if (!interaction.prepared.name) {\n\n let element = eventTarget;\n\n const getDraggable = function (interactable, selector, context) {\n const elements = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n if (interactable === interaction.target) { return; }\n\n if (!options.manualStart\n && !interactable.testIgnoreAllow(options, element, eventTarget)\n && matchesSelector(element, selector, elements)) {\n\n const action = interactable.getAction(interaction.downPointer,\n interaction.downEvent,\n interaction,\n element);\n\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, interactable)\n && autoStart.validateAction(action, interactable, element, eventTarget)) {\n\n return interactable;\n }\n }\n };\n\n let action = null;\n\n // check all interactables\n while (is.element(element)) {\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && elementInteractable !== interaction.target\n && !elementInteractable.options.drag.manualStart) {\n\n action = elementInteractable.getAction(interaction.downPointer, interaction.downEvent, interaction, element);\n }\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, elementInteractable)) {\n\n interaction.prepared.name = 'drag';\n interaction.target = elementInteractable;\n interaction.element = element;\n break;\n }\n\n const selectorInteractable = scope.interactables.forEachSelector(getDraggable, element);\n\n if (selectorInteractable) {\n interaction.prepared.name = 'drag';\n interaction.target = selectorInteractable;\n interaction.element = element;\n break;\n }\n\n element = parentNode(element);\n }\n }\n }\n});\n\nfunction checkStartAxis (startAxis, interactable) {\n if (!interactable) { return false; }\n\n const thisAxis = interactable.options.drag.startAxis;\n\n return (startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis);\n}\n","require('./base').setActionDefaults(require('../actions/gesture'));\n","require('./base').setActionDefaults(require('../actions/resize'));\n","module.exports = {\n base: {\n accept : null,\n preventDefault: 'auto',\n deltaSource : 'page',\n },\n\n perAction: {\n origin: { x: 0, y: 0 },\n\n // only allow left button by default\n // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n mouseButtons: 1,\n\n inertia: {\n enabled : false,\n resistance : 10, // the lambda in exponential decay\n minSpeed : 100, // target speed must be above this for inertia to start\n endSpeed : 10, // the speed at which inertia is slow enough to stop\n allowResume : true, // allow resuming an action in inertia phase\n smoothEndDuration: 300, // animate to snap/restrict endOnly if there's no inertia\n },\n },\n};\n","/* browser entry point */\n\n// Legacy browser support\nrequire('./legacyBrowsers');\n\n// inertia\nrequire('./inertia');\n\n// modifiers\nrequire('./modifiers/snap');\nrequire('./modifiers/restrict');\n\n// pointerEvents\nrequire('./pointerEvents/base');\nrequire('./pointerEvents/holdRepeat');\nrequire('./pointerEvents/interactableTargets');\n\n// delay\nrequire('./autoStart/delay');\n\n// actions\nrequire('./actions/gesture');\nrequire('./actions/resize');\nrequire('./actions/drag');\nrequire('./actions/drop');\n\n// load these modifiers after resize is loaded\nrequire('./modifiers/snapSize');\nrequire('./modifiers/restrictEdges');\nrequire('./modifiers/restrictSize');\n\n// autoStart actions\nrequire('./autoStart/gesture');\nrequire('./autoStart/resize');\nrequire('./autoStart/drag');\n\n// Interactable preventDefault setting\nrequire('./interactablePreventDefault.js');\n\n// autoScroll\nrequire('./autoScroll');\n\n// export interact\nmodule.exports = require('./interact');\n","const InteractEvent = require('./InteractEvent');\nconst Interaction = require('./Interaction');\nconst modifiers = require('./modifiers');\nconst utils = require('./utils');\nconst animationFrame = require('./utils/raf');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.inertiaStatus = {\n active : false,\n smoothEnd : false,\n allowResume: false,\n\n startEvent: null,\n upCoords : {},\n\n xe: 0, ye: 0,\n sx: 0, sy: 0,\n\n t0: 0,\n vx0: 0, vys: 0,\n duration: 0,\n\n lambda_v0: 0,\n one_ve_v0: 0,\n i : null,\n };\n\n interaction.boundInertiaFrame = () => inertiaFrame .apply(interaction);\n interaction.boundSmoothEndFrame = () => smoothEndFrame.apply(interaction);\n});\n\nInteraction.signals.on('down', function ({ interaction, event, pointer, eventTarget }) {\n const status = interaction.inertiaStatus;\n\n // Check if the down event hits the current inertia target\n if (status.active) {\n let element = eventTarget;\n\n // climb up the DOM tree from the event target\n while (utils.is.element(element)) {\n\n // if interaction element is the current inertia target element\n if (element === interaction.element) {\n // stop inertia\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n\n // update pointers to the down event's coordinates\n interaction.updatePointer(pointer);\n utils.setCoords(interaction.curCoords, interaction.pointers);\n\n // fire appropriate signals\n const signalArg = { interaction };\n Interaction.signals.fire('before-action-move', signalArg);\n Interaction.signals.fire('action-resume' , signalArg);\n\n // fire a reume event\n const resumeEvent = new InteractEvent(interaction,\n event,\n interaction.prepared.name,\n 'inertiaresume',\n interaction.element);\n\n interaction.target.fire(resumeEvent);\n interaction.prevEvent = resumeEvent;\n modifiers.resetStatuses(interaction.modifierStatuses);\n\n utils.copyCoords(interaction.prevCoords, interaction.curCoords);\n break;\n }\n\n element = utils.parentNode(element);\n }\n }\n});\n\nInteraction.signals.on('up', function ({ interaction, event }) {\n const status = interaction.inertiaStatus;\n\n if (!interaction.interacting() || status.active) { return; }\n\n const target = interaction.target;\n const options = target && target.options;\n const inertiaOptions = options && interaction.prepared.name && options[interaction.prepared.name].inertia;\n\n const now = new Date().getTime();\n const statuses = {};\n const page = utils.extend({}, interaction.curCoords.page);\n const pointerSpeed = interaction.pointerDelta.client.speed;\n\n let smoothEnd = false;\n let modifierResult;\n\n // check if inertia should be started\n const inertiaPossible = (inertiaOptions && inertiaOptions.enabled\n && interaction.prepared.name !== 'gesture'\n && event !== status.startEvent);\n\n const inertia = (inertiaPossible\n && (now - interaction.curCoords.timeStamp) < 50\n && pointerSpeed > inertiaOptions.minSpeed\n && pointerSpeed > inertiaOptions.endSpeed);\n\n const modifierArg = {\n interaction,\n pageCoords: page,\n statuses,\n preEnd: true,\n requireEndOnly: true,\n };\n\n // smoothEnd\n if (inertiaPossible && !inertia) {\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n if (modifierResult.shouldMove && modifierResult.locked) {\n smoothEnd = true;\n }\n }\n\n if (!(inertia || smoothEnd)) { return; }\n\n utils.copyCoords(status.upCoords, interaction.curCoords);\n\n interaction.pointers[0] = status.startEvent =\n new InteractEvent(interaction, event, interaction.prepared.name, 'inertiastart', interaction.element);\n\n status.t0 = now;\n\n status.active = true;\n status.allowResume = inertiaOptions.allowResume;\n interaction.simulation = status;\n\n target.fire(status.startEvent);\n\n if (inertia) {\n status.vx0 = interaction.pointerDelta.client.vx;\n status.vy0 = interaction.pointerDelta.client.vy;\n status.v0 = pointerSpeed;\n\n calcInertia(interaction, status);\n\n utils.extend(page, interaction.curCoords.page);\n\n page.x += status.xe;\n page.y += status.ye;\n\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n status.modifiedXe += modifierResult.dx;\n status.modifiedYe += modifierResult.dy;\n\n status.i = animationFrame.request(interaction.boundInertiaFrame);\n }\n else {\n status.smoothEnd = true;\n status.xe = modifierResult.dx;\n status.ye = modifierResult.dy;\n\n status.sx = status.sy = 0;\n\n status.i = animationFrame.request(interaction.boundSmoothEndFrame);\n }\n});\n\nInteraction.signals.on('stop-active', function ({ interaction }) {\n const status = interaction.inertiaStatus;\n\n if (status.active) {\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n }\n});\n\nfunction calcInertia (interaction, status) {\n const inertiaOptions = interaction.target.options[interaction.prepared.name].inertia;\n const lambda = inertiaOptions.resistance;\n const inertiaDur = -Math.log(inertiaOptions.endSpeed / status.v0) / lambda;\n\n status.x0 = interaction.prevEvent.pageX;\n status.y0 = interaction.prevEvent.pageY;\n status.t0 = status.startEvent.timeStamp / 1000;\n status.sx = status.sy = 0;\n\n status.modifiedXe = status.xe = (status.vx0 - inertiaDur) / lambda;\n status.modifiedYe = status.ye = (status.vy0 - inertiaDur) / lambda;\n status.te = inertiaDur;\n\n status.lambda_v0 = lambda / status.v0;\n status.one_ve_v0 = 1 - inertiaOptions.endSpeed / status.v0;\n}\n\nfunction inertiaFrame () {\n updateInertiaCoords(this);\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n\n const status = this.inertiaStatus;\n const options = this.target.options[this.prepared.name].inertia;\n const lambda = options.resistance;\n const t = new Date().getTime() / 1000 - status.t0;\n\n if (t < status.te) {\n\n const progress = 1 - (Math.exp(-lambda * t) - status.lambda_v0) / status.one_ve_v0;\n\n if (status.modifiedXe === status.xe && status.modifiedYe === status.ye) {\n status.sx = status.xe * progress;\n status.sy = status.ye * progress;\n }\n else {\n const quadPoint = utils.getQuadraticCurvePoint(0, 0,\n status.xe,\n status.ye,\n status.modifiedXe,\n status.modifiedYe,\n progress);\n\n status.sx = quadPoint.x;\n status.sy = quadPoint.y;\n }\n\n this.doMove();\n\n status.i = animationFrame.request(this.boundInertiaFrame);\n }\n else {\n status.sx = status.modifiedXe;\n status.sy = status.modifiedYe;\n\n this.doMove();\n this.end(status.startEvent);\n status.active = false;\n this.simulation = null;\n }\n\n utils.copyCoords(this.prevCoords, this.curCoords);\n}\n\nfunction smoothEndFrame () {\n updateInertiaCoords(this);\n\n const status = this.inertiaStatus;\n const t = new Date().getTime() - status.t0;\n const duration = this.target.options[this.prepared.name].inertia.smoothEndDuration;\n\n if (t < duration) {\n status.sx = utils.easeOutQuad(t, 0, status.xe, duration);\n status.sy = utils.easeOutQuad(t, 0, status.ye, duration);\n\n this.pointerMove(status.startEvent, status.startEvent);\n\n status.i = animationFrame.request(this.boundSmoothEndFrame);\n }\n else {\n status.sx = status.xe;\n status.sy = status.ye;\n\n this.pointerMove(status.startEvent, status.startEvent);\n this.end(status.startEvent);\n\n status.smoothEnd =\n status.active = false;\n this.simulation = null;\n }\n}\n\nfunction updateInertiaCoords (interaction) {\n const status = interaction.inertiaStatus;\n\n // return if inertia isn't running\n if (!status.active) { return; }\n\n const pageUp = status.upCoords.page;\n const clientUp = status.upCoords.client;\n\n utils.setCoords(interaction.curCoords, [ {\n pageX : pageUp.x + status.sx,\n pageY : pageUp.y + status.sy,\n clientX: clientUp.x + status.sx,\n clientY: clientUp.y + status.sy,\n } ]);\n}\n","const browser = require('./utils/browser');\nconst events = require('./utils/events');\nconst utils = require('./utils');\nconst scope = require('./scope');\nconst Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\n\nconst globalEvents = {};\n\n/*\\\n * interact\n [ method ]\n *\n * The methods of this variable can be used to set elements as\n * interactables and also to change various default settings.\n *\n * Calling it as a function and passing an element or a valid CSS selector\n * string returns an Interactable object which has various methods to\n * configure it.\n *\n - element (Element | string) The HTML or SVG Element to interact with or CSS selector\n = (object) An @Interactable\n *\n > Usage\n | interact('#draggable').draggable(true);\n |\n | var rectables = interact('rect');\n | rectables\n | .gesturable(true)\n | .on('gesturemove', function (event) {\n | // ...\n | });\n\\*/\nfunction interact (element, options) {\n let interactable = scope.interactables.get(element, options);\n\n if (!interactable) {\n interactable = new Interactable(element, options);\n interactable.events.global = globalEvents;\n }\n\n return interactable;\n}\n\n/*\\\n * interact.isSet\n [ method ]\n *\n * Check if an element has been set\n - element (Element) The Element being searched for\n = (boolean) Indicates if the element or CSS selector was previously passed to interact\n\\*/\ninteract.isSet = function (element, options) {\n return scope.interactables.indexOfElement(element, options && options.context) !== -1;\n};\n\n/*\\\n * interact.on\n [ method ]\n *\n * Adds a global listener for an InteractEvent or adds a DOM event to\n * `document`\n *\n - type (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) interact\n\\*/\ninteract.on = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.on(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.on(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n // if it is an InteractEvent type, add listener to globalEvents\n if (utils.contains(Interactable.eventTypes, type)) {\n // if this type of event was never bound\n if (!globalEvents[type]) {\n globalEvents[type] = [listener];\n }\n else {\n globalEvents[type].push(listener);\n }\n }\n // If non InteractEvent type, addEventListener to document\n else {\n events.add(scope.document, type, listener, { options });\n }\n\n return interact;\n};\n\n/*\\\n * interact.off\n [ method ]\n *\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n - type (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) interact\n \\*/\ninteract.off = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.off(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.off(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n if (!utils.contains(Interactable.eventTypes, type)) {\n events.remove(scope.document, type, listener, options);\n }\n else {\n let index;\n\n if (type in globalEvents\n && (index = utils.indexOf(globalEvents[type], listener)) !== -1) {\n globalEvents[type].splice(index, 1);\n }\n }\n\n return interact;\n};\n\n/*\\\n * interact.debug\n [ method ]\n *\n * Returns an object which exposes internal data\n = (object) An object with properties that outline the current state and expose internal functions and variables\n\\*/\ninteract.debug = function () {\n return scope;\n};\n\n// expose the functions used to calculate multi-touch properties\ninteract.getPointerAverage = utils.pointerAverage;\ninteract.getTouchBBox = utils.touchBBox;\ninteract.getTouchDistance = utils.touchDistance;\ninteract.getTouchAngle = utils.touchAngle;\n\ninteract.getElementRect = utils.getElementRect;\ninteract.getElementClientRect = utils.getElementClientRect;\ninteract.matchesSelector = utils.matchesSelector;\ninteract.closest = utils.closest;\n\n/*\\\n * interact.supportsTouch\n [ method ]\n *\n = (boolean) Whether or not the browser supports touch input\n\\*/\ninteract.supportsTouch = function () {\n return browser.supportsTouch;\n};\n\n/*\\\n * interact.supportsPointerEvent\n [ method ]\n *\n = (boolean) Whether or not the browser supports PointerEvents\n\\*/\ninteract.supportsPointerEvent = function () {\n return browser.supportsPointerEvent;\n};\n\n/*\\\n * interact.stop\n [ method ]\n *\n * Cancels all interactions (end events are not fired)\n *\n - event (Event) An event on which to call preventDefault()\n = (object) interact\n\\*/\ninteract.stop = function (event) {\n for (let i = scope.interactions.length - 1; i >= 0; i--) {\n scope.interactions[i].stop(event);\n }\n\n return interact;\n};\n\n/*\\\n * interact.pointerMoveTolerance\n [ method ]\n * Returns or sets the distance the pointer must be moved before an action\n * sequence occurs. This also affects tolerance for tap events.\n *\n - newValue (number) #optional The movement from the start position must be greater than this value\n = (number | Interactable) The current setting or interact\n\\*/\ninteract.pointerMoveTolerance = function (newValue) {\n if (utils.is.number(newValue)) {\n Interaction.pointerMoveTolerance = newValue;\n\n return this;\n }\n\n return Interaction.pointerMoveTolerance;\n};\n\ninteract.addDocument = scope.addDocument;\ninteract.removeDocument = scope.removeDocument;\n\nscope.interact = interact;\n\nmodule.exports = interact;\n","const Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\nconst scope = require('./scope');\nconst is = require('./utils/is');\nconst events = require('./utils/events');\n\nconst { nodeContains, matchesSelector } = require('./utils/domUtils');\n\n/*\\\n * Interactable.preventDefault\n [ method ]\n *\n * Returns or sets whether to prevent the browser's default behaviour\n * in response to pointer events. Can be set to:\n * - `'always'` to always prevent\n * - `'never'` to never prevent\n * - `'auto'` to let interact.js try to determine what would be best\n *\n - newValue (string) #optional `true`, `false` or `'auto'`\n = (string | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.preventDefault = function (newValue) {\n if (/^(always|never|auto)$/.test(newValue)) {\n this.options.preventDefault = newValue;\n return this;\n }\n\n if (is.bool(newValue)) {\n this.options.preventDefault = newValue? 'always' : 'never';\n return this;\n }\n\n return this.options.preventDefault;\n};\n\nInteractable.prototype.checkAndPreventDefault = function (event) {\n const setting = this.options.preventDefault;\n\n if (setting === 'never') { return; }\n\n if (setting === 'always') {\n event.preventDefault();\n return;\n }\n\n // setting === 'auto'\n\n // don't preventDefault if the browser supports passiveEvents\n // CSS touch-action and user-selecct should be used instead\n if (events.supportsOptions) {\n return;\n }\n\n // don't preventDefault of pointerdown events\n if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) {\n return;\n }\n\n // don't preventDefault on editable elements\n if (is.element(event.target)\n && matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) {\n return;\n }\n\n event.preventDefault();\n};\n\nfunction onInteractionEvent ({ interaction, event }) {\n if (interaction.target) {\n interaction.target.checkAndPreventDefault(event);\n }\n}\n\nfor (const eventSignal of ['down', 'move', 'up', 'cancel']) {\n Interaction.signals.on(eventSignal, onInteractionEvent);\n}\n\n// prevent native HTML5 drag on interact.js target elements\nInteraction.docEvents.dragstart = function preventNativeDrag (event) {\n for (const interaction of scope.interactions) {\n\n if (interaction.element\n && (interaction.element === event.target\n || nodeContains(interaction.element, event.target))) {\n\n interaction.target.checkAndPreventDefault(event);\n return;\n }\n }\n};\n","const scope = require('./scope');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst iFinder = require('./utils/interactionFinder');\nconst pointerEvents = require('./pointerEvents/base');\n\nconst { window } = require('./utils/window');\n\nconst toString = Object.prototype.toString;\n\nif (!window.Array.isArray) {\n window.Array.isArray = function (obj) {\n return toString.call(obj) === '[object Array]';\n };\n}\n\nif (!String.prototype.trim) {\n String.prototype.trim = function () {\n return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n };\n}\n\n// http://www.quirksmode.org/dom/events/click.html\n// >Events leading to dblclick\n//\n// IE8 doesn't fire down event before dblclick.\n// This workaround tries to fire a tap and doubletap after dblclick\nfunction onIE8Dblclick (event) {\n const eventTarget = event.target;\n const interaction = iFinder.search(event, event.type, eventTarget);\n\n if (!interaction) { return; }\n\n if (interaction.prevTap\n && event.clientX === interaction.prevTap.clientX\n && event.clientY === interaction.prevTap.clientY\n && eventTarget === interaction.prevTap.target) {\n\n interaction.downTargets[0] = eventTarget;\n interaction.downTimes [0] = new Date().getTime();\n\n pointerEvents.fire({\n interaction,\n event,\n eventTarget,\n pointer: event,\n type: 'tap',\n });\n }\n}\n\nif (browser.isIE8) {\n const selectFix = function (event) {\n for (const interaction of scope.interactions) {\n if (interaction.interacting()) {\n interaction.target.checkAndPreventDefault(event);\n }\n }\n };\n\n const onDocIE8 = function onDocIE8 ({ doc, win }, signalName) {\n const eventMethod = signalName.indexOf('listen') === 0\n ? events.add : events.remove;\n\n // For IE's lack of Event#preventDefault\n eventMethod(doc, 'selectstart', selectFix);\n\n if (pointerEvents) {\n eventMethod(doc, 'dblclick', onIE8Dblclick);\n }\n };\n\n scope.signals.on('add-document' , onDocIE8);\n scope.signals.on('remove-document', onDocIE8);\n}\n\nmodule.exports = null;\n","const InteractEvent = require('../InteractEvent');\nconst Interaction = require('../Interaction');\nconst extend = require('../utils/extend');\n\nconst modifiers = {\n names: [],\n\n setOffsets: function (arg) {\n const { interaction, pageCoords: page } = arg;\n const { target, element, startOffset } = interaction;\n const rect = target.getRect(element);\n\n if (rect) {\n startOffset.left = page.x - rect.left;\n startOffset.top = page.y - rect.top;\n\n startOffset.right = rect.right - page.x;\n startOffset.bottom = rect.bottom - page.y;\n\n if (!('width' in rect)) { rect.width = rect.right - rect.left; }\n if (!('height' in rect)) { rect.height = rect.bottom - rect.top ; }\n }\n else {\n startOffset.left = startOffset.top = startOffset.right = startOffset.bottom = 0;\n }\n\n arg.rect = rect;\n arg.interactable = target;\n arg.element = element;\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n\n arg.options = target.options[interaction.prepared.name][modifierName];\n\n if (!arg.options) {\n continue;\n }\n\n interaction.modifierOffsets[modifierName] = modifiers[modifierName].setOffset(arg);\n }\n },\n\n setAll: function (arg) {\n const { interaction, statuses, preEnd, requireEndOnly } = arg;\n const coords = extend({}, arg.pageCoords);\n const result = {\n dx: 0,\n dy: 0,\n changed: false,\n locked: false,\n shouldMove: true,\n };\n\n for (const modifierName of modifiers.names) {\n const modifier = modifiers[modifierName];\n const options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!shouldDo(options, preEnd, requireEndOnly)) { continue; }\n\n arg.status = arg.status = statuses[modifierName];\n arg.options = options;\n arg.offset = arg.interaction.modifierOffsets[modifierName];\n\n modifier.set(arg);\n\n if (arg.status.locked) {\n coords.x += arg.status.dx;\n coords.y += arg.status.dy;\n\n result.dx += arg.status.dx;\n result.dy += arg.status.dy;\n\n result.locked = true;\n }\n }\n\n // a move should be fired if:\n // - there are no modifiers enabled,\n // - no modifiers are \"locked\" i.e. have changed the pointer's coordinates, or\n // - the locked coords have changed since the last pointer move\n result.shouldMove = !arg.status || !result.locked || arg.status.changed;\n\n return result;\n },\n\n resetStatuses: function (statuses) {\n for (const modifierName of modifiers.names) {\n const status = statuses[modifierName] || {};\n\n status.dx = status.dy = 0;\n status.modifiedX = status.modifiedY = NaN;\n status.locked = false;\n status.changed = true;\n\n statuses[modifierName] = status;\n }\n\n return statuses;\n },\n\n start: function ({ interaction }, signalName) {\n const arg = {\n interaction,\n pageCoords: (signalName === 'action-resume' ?\n interaction.curCoords : interaction.startCoords).page,\n startOffset: interaction.startOffset,\n statuses: interaction.modifierStatuses,\n preEnd: false,\n requireEndOnly: false,\n };\n\n modifiers.setOffsets(arg);\n modifiers.resetStatuses(arg.statuses);\n\n arg.pageCoords = extend({}, interaction.startCoords.page);\n interaction.modifierResult = modifiers.setAll(arg);\n },\n};\n\nInteraction.signals.on('new', function (interaction) {\n interaction.startOffset = { left: 0, right: 0, top: 0, bottom: 0 };\n interaction.modifierOffsets = {};\n interaction.modifierStatuses = modifiers.resetStatuses({});\n interaction.modifierResult = null;\n});\n\nInteraction.signals.on('action-start' , modifiers.start);\nInteraction.signals.on('action-resume', modifiers.start);\n\nInteraction.signals.on('before-action-move', function ({ interaction, preEnd, interactingBeforeMove }) {\n const modifierResult = modifiers.setAll({\n interaction,\n preEnd,\n pageCoords: interaction.curCoords.page,\n statuses: interaction.modifierStatuses,\n requireEndOnly: false,\n });\n\n // don't fire an action move if a modifier would keep the event in the same\n // cordinates as before\n if (!modifierResult.shouldMove && interactingBeforeMove) {\n interaction._dontFireMove = true;\n }\n\n interaction.modifierResult = modifierResult;\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n for (let i = 0; i < modifiers.names.length; i++) {\n const options = interaction.target.options[interaction.prepared.name][modifiers.names[i]];\n\n // if the endOnly option is true for any modifier\n if (shouldDo(options, true, true)) {\n // fire a move event at the modified coordinates\n interaction.doMove({ event, preEnd: true });\n break;\n }\n }\n});\n\nInteractEvent.signals.on('set-xy', function (arg) {\n const { iEvent, interaction } = arg;\n const modifierArg = extend({}, arg);\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n modifierArg.options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!modifierArg.options) {\n continue;\n }\n\n const modifier = modifiers[modifierName];\n\n modifierArg.status = interaction.modifierStatuses[modifierName];\n\n iEvent[modifierName] = modifier.modifyCoords(modifierArg);\n }\n});\n\nfunction shouldDo (options, preEnd, requireEndOnly) {\n return (options && options.enabled\n && (preEnd || !options.endOnly)\n && (!requireEndOnly || options.endOnly));\n}\n\nmodule.exports = modifiers;\n","const modifiers = require('./index');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst restrict = {\n defaults: {\n enabled : false,\n endOnly : false,\n restriction: null,\n elementRect: null,\n },\n\n setOffset: function ({ rect, startOffset, options }) {\n const elementRect = options && options.elementRect;\n const offset = {};\n\n if (rect && elementRect) {\n offset.left = startOffset.left - (rect.width * elementRect.left);\n offset.top = startOffset.top - (rect.height * elementRect.top);\n\n offset.right = startOffset.right - (rect.width * (1 - elementRect.right));\n offset.bottom = startOffset.bottom - (rect.height * (1 - elementRect.bottom));\n }\n else {\n offset.left = offset.top = offset.right = offset.bottom = 0;\n }\n\n return offset;\n },\n\n set: function ({ pageCoords, interaction, status, options }) {\n if (!options) { return status; }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n\n const restriction = getRestrictionRect(options.restriction, interaction, page);\n\n if (!restriction) { return status; }\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n const rect = restriction;\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n const offset = interaction.modifierOffsets.restrict;\n\n // object is assumed to have\n // x, y, width, height or\n // left, top, right, bottom\n if ('x' in restriction && 'y' in restriction) {\n modifiedX = Math.max(Math.min(rect.x + rect.width - offset.right , page.x), rect.x + offset.left);\n modifiedY = Math.max(Math.min(rect.y + rect.height - offset.bottom, page.y), rect.y + offset.top );\n }\n else {\n modifiedX = Math.max(Math.min(rect.right - offset.right , page.x), rect.left + offset.left);\n modifiedY = Math.max(Math.min(rect.bottom - offset.bottom, page.y), rect.top + offset.top );\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const elementRect = options && options.elementRect;\n\n if (options && options.enabled\n && !(phase === 'start' && elementRect && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n getRestrictionRect,\n};\n\nfunction getRestrictionRect (value, interaction, page) {\n if (utils.is.function(value)) {\n return utils.resolveRectLike(value, interaction.target, interaction.element, [page.x, page.y, interaction]);\n } else {\n return utils.resolveRectLike(value, interaction.target, interaction.element);\n }\n}\n\nmodifiers.restrict = restrict;\nmodifiers.names.push('restrict');\n\ndefaultOptions.perAction.restrict = restrict.defaults;\n\nmodule.exports = restrict;\n","// This module adds the options.resize.restrictEdges setting which sets min and\n// max for the top, left, bottom and right edges of the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictEdges: {\n// inner: { top: 200, left: 200, right: 400, bottom: 400 },\n// outer: { top: 0, left: 0, right: 600, bottom: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst { getRestrictionRect } = require('./restrict');\n\nconst noInner = { top: +Infinity, left: +Infinity, bottom: -Infinity, right: -Infinity };\nconst noOuter = { top: -Infinity, left: -Infinity, bottom: +Infinity, right: +Infinity };\n\nconst restrictEdges = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n offset: null,\n },\n\n setOffset: function ({ interaction, startOffset, options }) {\n if (!options) {\n return utils.extend({}, startOffset);\n }\n\n const offset = getRestrictionRect(options.offset, interaction, interaction.startCoords.page);\n\n if (offset) {\n return {\n top: startOffset.top + offset.y,\n left: startOffset.left + offset.x,\n bottom: startOffset.bottom + offset.y,\n right: startOffset.right + offset.x,\n };\n }\n\n return startOffset;\n },\n\n set: function ({ pageCoords, interaction, status, offset, options }) {\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n const inner = rectUtils.xywhToTlbr(getRestrictionRect(options.inner, interaction, page)) || noInner;\n const outer = rectUtils.xywhToTlbr(getRestrictionRect(options.outer, interaction, page)) || noOuter;\n\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n if (edges.top) {\n modifiedY = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top);\n }\n else if (edges.bottom) {\n modifiedY = Math.max(Math.min(outer.bottom - offset.bottom, page.y), inner.bottom - offset.bottom);\n }\n if (edges.left) {\n modifiedX = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left);\n }\n else if (edges.right) {\n modifiedX = Math.max(Math.min(outer.right - offset.right, page.x), inner.right - offset.right);\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n if (options && options.enabled\n && !(phase === 'start' && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n noInner,\n noOuter,\n getRestrictionRect,\n};\n\nmodifiers.restrictEdges = restrictEdges;\nmodifiers.names.push('restrictEdges');\n\ndefaultOptions.perAction.restrictEdges = restrictEdges.defaults;\nresize.defaults.restrictEdges = restrictEdges.defaults;\n\nmodule.exports = restrictEdges;\n","// This module adds the options.resize.restrictSize setting which sets min and\n// max width and height for the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictSize: {\n// min: { width: -600, height: -600 },\n// max: { width: 600, height: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst restrictEdges = require('./restrictEdges');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst noMin = { width: -Infinity, height: -Infinity };\nconst noMax = { width: +Infinity, height: +Infinity };\n\nconst restrictSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n },\n\n setOffset: function ({ interaction }) {\n return interaction.startOffset;\n },\n\n set: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const rect = rectUtils.xywhToTlbr(interaction.resizeRects.inverted);\n\n const minSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.min, interaction)) || noMin;\n const maxSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.max, interaction)) || noMax;\n\n arg.options = {\n enabled: options.enabled,\n endOnly: options.endOnly,\n inner: utils.extend({}, restrictEdges.noInner),\n outer: utils.extend({}, restrictEdges.noOuter),\n };\n\n if (edges.top) {\n arg.options.inner.top = rect.bottom - minSize.height;\n arg.options.outer.top = rect.bottom - maxSize.height;\n }\n else if (edges.bottom) {\n arg.options.inner.bottom = rect.top + minSize.height;\n arg.options.outer.bottom = rect.top + maxSize.height;\n }\n if (edges.left) {\n arg.options.inner.left = rect.right - minSize.width;\n arg.options.outer.left = rect.right - maxSize.width;\n }\n else if (edges.right) {\n arg.options.inner.right = rect.left + minSize.width;\n arg.options.outer.right = rect.left + maxSize.width;\n }\n\n restrictEdges.set(arg);\n },\n\n modifyCoords: restrictEdges.modifyCoords,\n};\n\nmodifiers.restrictSize = restrictSize;\nmodifiers.names.push('restrictSize');\n\ndefaultOptions.perAction.restrictSize = restrictSize.defaults;\nresize.defaults.restrictSize = restrictSize.defaults;\n\nmodule.exports = restrictSize;\n","const modifiers = require('./index');\nconst interact = require('../interact');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst snap = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n\n relativePoints: null,\n },\n\n setOffset: function ({ interaction, interactable, element, rect, startOffset, options }) {\n const offsets = [];\n const optionsOrigin = utils.rectToXY(utils.resolveRectLike(options.origin));\n const origin = optionsOrigin || utils.getOriginXY(interactable, element, interaction.prepared.name);\n options = options || interactable.options[interaction.prepared.name].snap || {};\n\n let snapOffset;\n\n if (options.offset === 'startCoords') {\n snapOffset = {\n x: interaction.startCoords.page.x - origin.x,\n y: interaction.startCoords.page.y - origin.y,\n };\n }\n else {\n const offsetRect = utils.resolveRectLike(options.offset, interactable, element, [interaction]);\n\n snapOffset = utils.rectToXY(offsetRect) || { x: 0, y: 0 };\n }\n\n if (rect && options.relativePoints && options.relativePoints.length) {\n for (const { x: relativeX, y: relativeY } of options.relativePoints) {\n offsets.push({\n x: startOffset.left - (rect.width * relativeX) + snapOffset.x,\n y: startOffset.top - (rect.height * relativeY) + snapOffset.y,\n });\n }\n }\n else {\n offsets.push(snapOffset);\n }\n\n return offsets;\n },\n\n set: function ({ interaction, pageCoords, status, options, offset: offsets }) {\n const targets = [];\n let target;\n let page;\n let i;\n\n if (status.useStatusXY) {\n page = { x: status.x, y: status.y };\n }\n else {\n const origin = utils.getOriginXY(interaction.target, interaction.element, interaction.prepared.name);\n\n page = utils.extend({}, pageCoords);\n\n page.x -= origin.x;\n page.y -= origin.y;\n }\n\n status.realX = page.x;\n status.realY = page.y;\n\n let len = options.targets? options.targets.length : 0;\n\n for (const { x: offsetX, y: offsetY } of offsets) {\n const relativeX = page.x - offsetX;\n const relativeY = page.y - offsetY;\n\n for (const snapTarget of options.targets) {\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n targets.push({\n x: utils.is.number(target.x) ? (target.x + offsetX) : relativeX,\n y: utils.is.number(target.y) ? (target.y + offsetY) : relativeY,\n\n range: utils.is.number(target.range)? target.range: options.range,\n });\n }\n }\n\n const closest = {\n target: null,\n inRange: false,\n distance: 0,\n range: 0,\n dx: 0,\n dy: 0,\n };\n\n for (i = 0, len = targets.length; i < len; i++) {\n target = targets[i];\n\n const range = target.range;\n const dx = target.x - page.x;\n const dy = target.y - page.y;\n const distance = utils.hypot(dx, dy);\n let inRange = distance <= range;\n\n // Infinite targets count as being out of range\n // compared to non infinite ones that are in range\n if (range === Infinity && closest.inRange && closest.range !== Infinity) {\n inRange = false;\n }\n\n if (!closest.target || (inRange\n // is the closest target in range?\n ? (closest.inRange && range !== Infinity\n // the pointer is relatively deeper in this target\n ? distance / range < closest.distance / closest.range\n // this target has Infinite range and the closest doesn't\n : (range === Infinity && closest.range !== Infinity)\n // OR this target is closer that the previous closest\n || distance < closest.distance)\n // The other is not in range and the pointer is closer to this target\n : (!closest.inRange && distance < closest.distance))) {\n\n closest.target = target;\n closest.distance = distance;\n closest.range = range;\n closest.inRange = inRange;\n closest.dx = dx;\n closest.dy = dy;\n\n status.range = range;\n }\n }\n\n let snapChanged;\n\n if (closest.target) {\n snapChanged = (status.modifiedX !== closest.target.x || status.modifiedY !== closest.target.y);\n\n status.modifiedX = closest.target.x;\n status.modifiedY = closest.target.y;\n }\n else {\n snapChanged = true;\n\n status.modifiedX = NaN;\n status.modifiedY = NaN;\n }\n\n status.dx = closest.dx;\n status.dy = closest.dy;\n\n status.changed = (snapChanged || (closest.inRange && !status.locked));\n status.locked = closest.inRange;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const relativePoints = options && options.relativePoints;\n\n if (options && options.enabled\n && !(phase === 'start' && relativePoints && relativePoints.length)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n }\n\n return {\n range : status.range,\n locked : status.locked,\n x : status.modifiedX,\n y : status.modifiedY,\n realX : status.realX,\n realY : status.realY,\n dx : status.dx,\n dy : status.dy,\n };\n }\n },\n};\n\ninteract.createSnapGrid = function (grid) {\n return function (x, y) {\n const limits = grid.limits || {\n left : -Infinity,\n right : Infinity,\n top : -Infinity,\n bottom: Infinity,\n };\n let offsetX = 0;\n let offsetY = 0;\n\n if (utils.is.object(grid.offset)) {\n offsetX = grid.offset.x;\n offsetY = grid.offset.y;\n }\n\n const gridx = Math.round((x - offsetX) / grid.x);\n const gridy = Math.round((y - offsetY) / grid.y);\n\n const newX = Math.max(limits.left, Math.min(limits.right , gridx * grid.x + offsetX));\n const newY = Math.max(limits.top , Math.min(limits.bottom, gridy * grid.y + offsetY));\n\n return {\n x: newX,\n y: newY,\n range: grid.range,\n };\n };\n};\n\nmodifiers.snap = snap;\nmodifiers.names.push('snap');\n\ndefaultOptions.perAction.snap = snap.defaults;\n\nmodule.exports = snap;\n","// This module allows snapping of the size of targets during resize\n// interactions.\n\nconst modifiers = require('./index');\nconst snap = require('./snap');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\nconst utils = require('../utils/');\n\nconst snapSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n },\n\n setOffset: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.edges;\n\n if (!edges) { return; }\n\n arg.options = {\n relativePoints: [{\n x: edges.left? 0 : 1,\n y: edges.top ? 0 : 1,\n }],\n origin: { x: 0, y: 0 },\n offset: 'self',\n range: options.range,\n };\n\n const offsets = snap.setOffset(arg);\n arg.options = options;\n\n return offsets;\n },\n\n set: function (arg) {\n const { interaction, options, offset, pageCoords } = arg;\n const page = utils.extend({}, pageCoords);\n const relativeX = page.x - offset[0].x;\n const relativeY = page.y - offset[0].y;\n\n arg.options = utils.extend({}, options);\n arg.options.targets = [];\n\n for (const snapTarget of options.targets) {\n let target;\n\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n if ('width' in target && 'height' in target) {\n target.x = target.width;\n target.y = target.height;\n }\n\n arg.options.targets.push(target);\n }\n\n snap.set(arg);\n },\n\n modifyCoords: function (arg) {\n const { options } = arg;\n\n arg.options = utils.extend({}, options);\n arg.options.enabled = options.enabled;\n arg.options.relativePoints = [null];\n\n snap.modifyCoords(arg);\n },\n};\n\nmodifiers.snapSize = snapSize;\nmodifiers.names.push('snapSize');\n\ndefaultOptions.perAction.snapSize = snapSize.defaults;\nresize.defaults.snapSize = snapSize.defaults;\n\nmodule.exports = snapSize;\n","const pointerUtils = require('../utils/pointerUtils');\n\nmodule.exports = class PointerEvent {\n constructor (type, pointer, event, eventTarget, interaction) {\n pointerUtils.pointerExtend(this, event);\n\n if (event !== pointer) {\n pointerUtils.pointerExtend(this, pointer);\n }\n\n this.interaction = interaction;\n\n this.timeStamp = new Date().getTime();\n this.originalEvent = event;\n this.type = type;\n this.pointerId = pointerUtils.getPointerId(pointer);\n this.pointerType = pointerUtils.getPointerType(pointer);\n this.target = eventTarget;\n this.currentTarget = null;\n\n if (type === 'tap') {\n const pointerIndex = interaction.getPointerIndex(pointer);\n this.dt = this.timeStamp - interaction.downTimes[pointerIndex];\n\n const interval = this.timeStamp - interaction.tapTime;\n\n this.double = !!(interaction.prevTap\n && interaction.prevTap.type !== 'doubletap'\n && interaction.prevTap.target === this.target\n && interval < 500);\n }\n else if (type === 'doubletap') {\n this.dt = pointer.timeStamp - interaction.tapTime;\n }\n }\n\n subtractOrigin ({ x: originX, y: originY }) {\n this.pageX -= originX;\n this.pageY -= originY;\n this.clientX -= originX;\n this.clientY -= originY;\n\n return this;\n }\n\n addOrigin ({ x: originX, y: originY }) {\n this.pageX += originX;\n this.pageY += originY;\n this.clientX += originX;\n this.clientY += originY;\n\n return this;\n }\n\n preventDefault () {\n this.originalEvent.preventDefault();\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n};\n","const PointerEvent = require('./PointerEvent');\nconst Interaction = require('../Interaction');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst defaults = require('../defaultOptions');\nconst signals = require('../utils/Signals').new();\nconst { filter } = require('../utils/arr');\n\nconst simpleSignals = [ 'down', 'up', 'cancel' ];\nconst simpleEvents = [ 'down', 'up', 'cancel' ];\n\nconst pointerEvents = {\n PointerEvent,\n fire,\n collectEventTargets,\n signals,\n defaults: {\n holdDuration: 600,\n ignoreFrom : null,\n allowFrom : null,\n origin : { x: 0, y: 0 },\n },\n types: [\n 'down',\n 'move',\n 'up',\n 'cancel',\n 'tap',\n 'doubletap',\n 'hold',\n ],\n};\n\nfunction fire (arg) {\n const {\n interaction, pointer, event, eventTarget,\n type = arg.pointerEvent.type,\n targets = collectEventTargets(arg),\n pointerEvent = new PointerEvent(type, pointer, event, eventTarget, interaction),\n } = arg;\n\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n targets,\n type,\n pointerEvent,\n };\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n\n for (const prop in target.props || {}) {\n pointerEvent[prop] = target.props[prop];\n }\n\n const origin = utils.getOriginXY(target.eventable, target.element);\n\n pointerEvent.subtractOrigin(origin);\n pointerEvent.eventable = target.eventable;\n pointerEvent.currentTarget = target.element;\n\n target.eventable.fire(pointerEvent);\n\n pointerEvent.addOrigin(origin);\n\n if (pointerEvent.immediatePropagationStopped\n || (pointerEvent.propagationStopped\n && (i + 1) < targets.length && targets[i + 1].element !== pointerEvent.currentTarget)) {\n break;\n }\n }\n\n signals.fire('fired', signalArg);\n\n if (type === 'tap') {\n // if pointerEvent should make a double tap, create and fire a doubletap\n // PointerEvent and use that as the prevTap\n const prevTap = pointerEvent.double\n ? fire({\n interaction, pointer, event, eventTarget,\n type: 'doubletap',\n })\n : pointerEvent;\n\n interaction.prevTap = prevTap;\n interaction.tapTime = prevTap.timeStamp;\n }\n\n return pointerEvent;\n}\n\nfunction collectEventTargets ({ interaction, pointer, event, eventTarget, type }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n // do not fire a tap event if the pointer was moved before being lifted\n if (type === 'tap' && (interaction.pointerWasMoved\n // or if the pointerup target is different to the pointerdown target\n || !(interaction.downTargets[pointerIndex] && interaction.downTargets[pointerIndex] === eventTarget))) {\n return [];\n }\n\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n path,\n targets: [],\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (type === 'hold') {\n signalArg.targets = filter(signalArg.targets, target =>\n target.eventable.options.holdDuration === interaction.holdTimers[pointerIndex].duration);\n }\n\n return signalArg.targets;\n}\n\nInteraction.signals.on('update-pointer-down', function ({ interaction, pointerIndex }) {\n interaction.holdTimers[pointerIndex] = { duration: Infinity, timeout: null };\n});\n\nInteraction.signals.on('remove-pointer', function ({ interaction, pointerIndex }) {\n interaction.holdTimers.splice(pointerIndex, 1);\n});\n\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget, duplicateMove }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n if (!duplicateMove && (!interaction.pointerIsDown || interaction.pointerWasMoved)) {\n if (interaction.pointerIsDown) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n\n fire({\n interaction, pointer, event, eventTarget,\n type: 'move',\n });\n }\n});\n\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget, pointerIndex }) {\n // copy event to be used in timeout for IE8\n const eventCopy = browser.isIE8? utils.extend({}, event) : event;\n\n const timer = interaction.holdTimers[pointerIndex];\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'hold',\n targets: [],\n path,\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (!signalArg.targets.length) { return; }\n\n let minDuration = Infinity;\n\n for (let i = 0; i < signalArg.targets.length; i++) {\n const target = signalArg.targets[i];\n const holdDuration = target.eventable.options.holdDuration;\n\n if (holdDuration < minDuration) {\n minDuration = holdDuration;\n }\n }\n\n timer.duration = minDuration;\n timer.timeout = setTimeout(function () {\n fire({\n interaction,\n eventTarget,\n pointer: browser.isIE8? eventCopy : pointer,\n event: eventCopy,\n type: 'hold',\n });\n }, minDuration);\n});\n\nInteraction.signals.on('up', ({ interaction, pointer, event, eventTarget }) => {\n if (!interaction.pointerWasMoved) {\n fire({ interaction, eventTarget, pointer, event, type: 'tap' });\n }\n});\n\n['up', 'cancel'].forEach(function (signalName) {\n Interaction.signals.on(signalName, function ({ interaction, pointerIndex }) {\n if (interaction.holdTimers[pointerIndex]) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n });\n});\n\nfunction createSignalListener (type) {\n return function ({ interaction, pointer, event, eventTarget }) {\n fire({ interaction, eventTarget, pointer, event, type });\n };\n}\n\nfor (let i = 0; i < simpleSignals.length; i++) {\n Interaction.signals.on(simpleSignals[i], createSignalListener(simpleEvents[i]));\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.prevTap = null; // the most recent tap event on this interaction\n interaction.tapTime = 0; // time of the most recent tap event\n interaction.holdTimers = []; // [{ duration, timeout }]\n});\n\ndefaults.pointerEvents = pointerEvents.defaults;\nmodule.exports = pointerEvents;\n","const pointerEvents = require('./base');\nconst Interaction = require('../Interaction');\n\npointerEvents.signals.on('new', onNew);\npointerEvents.signals.on('fired', onFired);\n\nfor (const signal of ['move', 'up', 'cancel', 'endall']) {\n Interaction.signals.on(signal, endHoldRepeat);\n}\n\nfunction onNew ({ pointerEvent }) {\n if (pointerEvent.type !== 'hold') { return; }\n\n pointerEvent.count = (pointerEvent.count || 0) + 1;\n}\n\nfunction onFired ({ interaction, pointerEvent, eventTarget, targets }) {\n if (pointerEvent.type !== 'hold' || !targets.length) { return; }\n\n // get the repeat interval from the first eventable\n const interval = targets[0].eventable.options.holdRepeatInterval;\n\n // don't repeat if the interval is 0 or less\n if (interval <= 0) { return; }\n\n // set a timeout to fire the holdrepeat event\n interaction.holdIntervalHandle = setTimeout(function () {\n pointerEvents.fire({\n interaction,\n eventTarget,\n type: 'hold',\n pointer: pointerEvent,\n event: pointerEvent,\n });\n }, interval);\n}\n\nfunction endHoldRepeat ({ interaction }) {\n // set the interaction's holdStopTime property\n // to stop further holdRepeat events\n if (interaction.holdIntervalHandle) {\n clearInterval(interaction.holdIntervalHandle);\n interaction.holdIntervalHandle = null;\n }\n}\n\n// don't repeat by default\npointerEvents.defaults.holdRepeatInterval = 0;\npointerEvents.types.push('holdrepeat');\n\nmodule.exports = {\n onNew,\n onFired,\n endHoldRepeat,\n};\n","const pointerEvents = require('./base');\nconst Interactable = require('../Interactable');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\nconst scope = require('../scope');\nconst extend = require('../utils/extend');\nconst { merge } = require('../utils/arr');\n\npointerEvents.signals.on('collect-targets', function ({ targets, element, type, eventTarget }) {\n function collectSelectors (interactable, selector, context) {\n const els = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && is.element(element)\n && domUtils.matchesSelector(element, selector, els)\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n const interactable = scope.interactables.get(element);\n\n if (interactable) {\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n scope.interactables.forEachSelector(collectSelectors, element);\n});\n\nInteractable.signals.on('new', function ({ interactable }) {\n interactable.events.getRect = function (element) {\n return interactable.getRect(element);\n };\n});\n\nInteractable.signals.on('set', function ({ interactable, options }) {\n extend(interactable.events.options, pointerEvents.defaults);\n extend(interactable.events.options, options);\n});\n\nmerge(Interactable.eventTypes, pointerEvents.types);\n\nInteractable.prototype.pointerEvents = function (options) {\n extend(this.events.options, options);\n\n return this;\n};\n\nconst __backCompatOption = Interactable.prototype._backCompatOption;\n\nInteractable.prototype._backCompatOption = function (optionName, newValue) {\n const ret = __backCompatOption.call(this, optionName, newValue);\n\n if (ret === this) {\n this.events.options[optionName] = newValue;\n }\n\n return ret;\n};\n\nInteractable.settingsMethods.push('pointerEvents');\n","const utils = require('./utils');\nconst events = require('./utils/events');\nconst signals = require('./utils/Signals').new();\n\nconst scope = {\n signals,\n events,\n utils,\n\n // main document\n document: require('./utils/domObjects').document,\n // all documents being listened to\n documents: [],\n\n addDocument: function (doc, win) {\n // do nothing if document is already known\n if (utils.contains(scope.documents, doc)) { return false; }\n\n win = win || scope.getWindow(doc);\n\n scope.documents.push(doc);\n events.documents.push(doc);\n\n // don't add an unload event for the main document\n // so that the page may be cached in browser history\n if (doc !== scope.document) {\n events.add(win, 'unload', scope.onWindowUnload);\n }\n\n signals.fire('add-document', { doc, win });\n },\n\n removeDocument: function (doc, win) {\n const index = utils.indexOf(scope.documents, doc);\n\n win = win || scope.getWindow(doc);\n\n events.remove(win, 'unload', scope.onWindowUnload);\n\n scope.documents.splice(index, 1);\n events.documents.splice(index, 1);\n\n signals.fire('remove-document', { win, doc });\n },\n\n onWindowUnload: function () {\n scope.removeDocument(this.document, this);\n },\n};\n\nmodule.exports = scope;\n","const { indexOf } = require('./arr');\n\nclass Signals {\n constructor () {\n this.listeners = {\n // signalName: [listeners],\n };\n }\n\n on (name, listener) {\n if (!this.listeners[name]) {\n this.listeners[name] = [listener];\n return;\n }\n\n this.listeners[name].push(listener);\n }\n\n off (name, listener) {\n if (!this.listeners[name]) { return; }\n\n const index = indexOf(this.listeners[name], listener);\n\n if (index !== -1) {\n this.listeners[name].splice(index, 1);\n }\n }\n\n fire (name, arg) {\n const targetListeners = this.listeners[name];\n\n if (!targetListeners) { return; }\n\n for (let i = 0; i < targetListeners.length; i++) {\n if (targetListeners[i](arg, name) === false) {\n return;\n }\n }\n }\n}\n\nSignals.new = function () {\n return new Signals();\n};\n\nmodule.exports = Signals;\n","function indexOf (array, target) {\n for (let i = 0, len = array.length; i < len; i++) {\n if (array[i] === target) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction contains (array, target) {\n return indexOf(array, target) !== -1;\n}\n\nfunction merge (target, source) {\n for (let i = 0; i < source.length; i++) {\n target.push(source[i]);\n }\n\n return target;\n}\n\nfunction filter (array, test) {\n const result = [];\n\n for (let i = 0; i < array.length; i++) {\n if (test(array[i])) {\n result.push(array[i]);\n }\n }\n\n return result;\n}\n\nmodule.exports = {\n indexOf,\n contains,\n merge,\n filter,\n};\n","const { window } = require('./window');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst Element = domObjects.Element;\nconst navigator = window.navigator;\n\nconst browser = {\n // Does the browser support touch input?\n supportsTouch: !!(('ontouchstart' in window) || is.function(window.DocumentTouch)\n && domObjects.document instanceof window.DocumentTouch),\n\n // Does the browser support PointerEvents\n supportsPointerEvent: !!domObjects.PointerEvent,\n\n isIE8: ('attachEvent' in window) && !('addEventListener' in window),\n\n // Opera Mobile must be handled differently\n isOperaMobile: (navigator.appName === 'Opera'\n && browser.supportsTouch\n && navigator.userAgent.match('Presto')),\n\n // scrolling doesn't change the result of getClientRects on iOS 7\n isIOS7: (/iP(hone|od|ad)/.test(navigator.platform)\n && /OS 7[^\\d]/.test(navigator.appVersion)),\n\n isIe9OrOlder: /MSIE (8|9)/.test(navigator.userAgent),\n\n // prefix matchesSelector\n prefixedMatchesSelector: 'matches' in Element.prototype\n ? 'matches': 'webkitMatchesSelector' in Element.prototype\n ? 'webkitMatchesSelector': 'mozMatchesSelector' in Element.prototype\n ? 'mozMatchesSelector': 'oMatchesSelector' in Element.prototype\n ? 'oMatchesSelector': 'msMatchesSelector',\n\n useMatchesSelectorPolyfill: false,\n\n pEventTypes: (domObjects.PointerEvent\n ? (domObjects.PointerEvent === window.MSPointerEvent\n ? {\n up: 'MSPointerUp',\n down: 'MSPointerDown',\n over: 'mouseover',\n out: 'mouseout',\n move: 'MSPointerMove',\n cancel: 'MSPointerCancel',\n }\n : {\n up: 'pointerup',\n down: 'pointerdown',\n over: 'pointerover',\n out: 'pointerout',\n move: 'pointermove',\n cancel: 'pointercancel',\n })\n : null),\n\n // because Webkit and Opera still use 'mousewheel' event type\n wheelEvent: 'onmousewheel' in domObjects.document? 'mousewheel': 'wheel',\n\n};\n\nbrowser.useMatchesSelectorPolyfill = !is.function(Element.prototype[browser.prefixedMatchesSelector]);\n\nmodule.exports = browser;\n","const domObjects = {};\nconst win = require('./window').window;\n\nfunction blank () {}\n\ndomObjects.document = win.document;\ndomObjects.DocumentFragment = win.DocumentFragment || blank;\ndomObjects.SVGElement = win.SVGElement || blank;\ndomObjects.SVGSVGElement = win.SVGSVGElement || blank;\ndomObjects.SVGElementInstance = win.SVGElementInstance || blank;\ndomObjects.Element = win.Element || blank;\ndomObjects.HTMLElement = win.HTMLElement || domObjects.Element;\n\ndomObjects.Event = win.Event;\ndomObjects.Touch = win.Touch || blank;\ndomObjects.PointerEvent = (win.PointerEvent || win.MSPointerEvent);\n\nmodule.exports = domObjects;\n","const win = require('./window');\nconst browser = require('./browser');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst domUtils = {\n nodeContains: function (parent, child) {\n while (child) {\n if (child === parent) {\n return true;\n }\n\n child = child.parentNode;\n }\n\n return false;\n },\n\n closest: function (element, selector) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) { return element; }\n\n element = domUtils.parentNode(element);\n }\n\n return null;\n },\n\n parentNode: function (node) {\n let parent = node.parentNode;\n\n if (is.docFrag(parent)) {\n // skip past #shado-root fragments\n while ((parent = parent.host) && is.docFrag(parent)) {\n continue;\n }\n\n return parent;\n }\n\n return parent;\n },\n\n // taken from http://tanalin.com/en/blog/2012/12/matches-selector-ie8/ and modified\n matchesSelectorPolyfill: browser.useMatchesSelectorPolyfill\n ? function (element, selector, elems) {\n elems = elems || element.parentNode.querySelectorAll(selector);\n\n for (let i = 0, len = elems.length; i < len; i++) {\n if (elems[i] === element) {\n return true;\n }\n }\n\n return false;\n }\n : null,\n\n matchesSelector: function (element, selector, nodeList) {\n if (browser.useMatchesSelectorPolyfill) {\n return domUtils.matchesSelectorPolyfill(element, selector, nodeList);\n }\n\n // remove /deep/ from selectors if shadowDOM polyfill is used\n if (win.window !== win.realWindow) {\n selector = selector.replace(/\\/deep\\//g, ' ');\n }\n\n return element[browser.prefixedMatchesSelector](selector);\n },\n\n // Test for the element that's \"above\" all other qualifiers\n indexOfDeepestElement: function (elements) {\n let deepestZoneParents = [];\n let dropzoneParents = [];\n let dropzone;\n let deepestZone = elements[0];\n let index = deepestZone? 0: -1;\n let parent;\n let child;\n let i;\n let n;\n\n for (i = 1; i < elements.length; i++) {\n dropzone = elements[i];\n\n // an element might belong to multiple selector dropzones\n if (!dropzone || dropzone === deepestZone) {\n continue;\n }\n\n if (!deepestZone) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n // check if the deepest or current are document.documentElement or document.rootElement\n // - if the current dropzone is, do nothing and continue\n if (dropzone.parentNode === dropzone.ownerDocument) {\n continue;\n }\n // - if deepest is, update with the current dropzone and continue to next\n else if (deepestZone.parentNode === dropzone.ownerDocument) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n if (!deepestZoneParents.length) {\n parent = deepestZone;\n while (parent.parentNode && parent.parentNode !== parent.ownerDocument) {\n deepestZoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n }\n\n // if this element is an svg element and the current deepest is\n // an HTMLElement\n if (deepestZone instanceof domObjects.HTMLElement\n && dropzone instanceof domObjects.SVGElement\n && !(dropzone instanceof domObjects.SVGSVGElement)) {\n\n if (dropzone === deepestZone.parentNode) {\n continue;\n }\n\n parent = dropzone.ownerSVGElement;\n }\n else {\n parent = dropzone;\n }\n\n dropzoneParents = [];\n\n while (parent.parentNode !== parent.ownerDocument) {\n dropzoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n\n n = 0;\n\n // get (position of last common ancestor) + 1\n while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) {\n n++;\n }\n\n const parents = [\n dropzoneParents[n - 1],\n dropzoneParents[n],\n deepestZoneParents[n],\n ];\n\n child = parents[0].lastChild;\n\n while (child) {\n if (child === parents[1]) {\n deepestZone = dropzone;\n index = i;\n deepestZoneParents = [];\n\n break;\n }\n else if (child === parents[2]) {\n break;\n }\n\n child = child.previousSibling;\n }\n }\n\n return index;\n },\n\n matchesUpTo: function (element, selector, limit) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) {\n return true;\n }\n\n element = domUtils.parentNode(element);\n\n if (element === limit) {\n return domUtils.matchesSelector(element, selector);\n }\n }\n\n return false;\n },\n\n getActualElement: function (element) {\n return (element instanceof domObjects.SVGElementInstance\n ? element.correspondingUseElement\n : element);\n },\n\n getScrollXY: function (relevantWindow) {\n relevantWindow = relevantWindow || win.window;\n return {\n x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft,\n y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop,\n };\n },\n\n getElementClientRect: function (element) {\n const clientRect = (element instanceof domObjects.SVGElement\n ? element.getBoundingClientRect()\n : element.getClientRects()[0]);\n\n return clientRect && {\n left : clientRect.left,\n right : clientRect.right,\n top : clientRect.top,\n bottom: clientRect.bottom,\n width : clientRect.width || clientRect.right - clientRect.left,\n height: clientRect.height || clientRect.bottom - clientRect.top,\n };\n },\n\n getElementRect: function (element) {\n const clientRect = domUtils.getElementClientRect(element);\n\n if (!browser.isIOS7 && clientRect) {\n const scroll = domUtils.getScrollXY(win.getWindow(element));\n\n clientRect.left += scroll.x;\n clientRect.right += scroll.x;\n clientRect.top += scroll.y;\n clientRect.bottom += scroll.y;\n }\n\n return clientRect;\n },\n\n getPath: function (element) {\n const path = [];\n\n while (element) {\n path.push(element);\n element = domUtils.parentNode(element);\n }\n\n return path;\n },\n\n trySelector: value => {\n if (!is.string(value)) { return false; }\n\n // an exception will be raised if it is invalid\n domObjects.document.querySelector(value);\n return true;\n },\n};\n\nmodule.exports = domUtils;\n","const is = require('./is');\nconst domUtils = require('./domUtils');\nconst pExtend = require('./pointerExtend');\n\nconst { window, getWindow } = require('./window');\nconst { indexOf, contains } = require('./arr');\n\nconst useAttachEvent = ('attachEvent' in window) && !('addEventListener' in window);\nconst addEvent = useAttachEvent? 'attachEvent': 'addEventListener';\nconst removeEvent = useAttachEvent? 'detachEvent': 'removeEventListener';\nconst on = useAttachEvent? 'on': '';\n\nconst elements = [];\nconst targets = [];\nconst attachedListeners = [];\n\n// {\n// type: {\n// selectors: ['selector', ...],\n// contexts : [document, ...],\n// listeners: [[listener, capture, passive], ...]\n// }\n// }\nconst delegatedEvents = {};\n\nconst documents = [];\n\nconst supportsOptions = !useAttachEvent && (() => {\n let supported = false;\n\n window.document.createElement('div').addEventListener('test', null, {\n get capture () { supported = true; },\n });\n\n return supported;\n})();\n\nfunction add (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n let elementIndex = indexOf(elements, element);\n let target = targets[elementIndex];\n\n if (!target) {\n target = {\n events: {},\n typeCount: 0,\n };\n\n elementIndex = elements.push(element) - 1;\n targets.push(target);\n\n attachedListeners.push(useAttachEvent\n ? {\n supplied: [],\n wrapped : [],\n useCount: [],\n }\n : null);\n }\n\n if (!target.events[type]) {\n target.events[type] = [];\n target.typeCount++;\n }\n\n if (!contains(target.events[type], listener)) {\n let ret;\n\n if (useAttachEvent) {\n const { supplied, wrapped, useCount } = attachedListeners[elementIndex];\n const listenerIndex = indexOf(supplied, listener);\n\n const wrappedListener = wrapped[listenerIndex] || function (event) {\n if (!event.immediatePropagationStopped) {\n event.target = event.srcElement;\n event.currentTarget = element;\n\n event.preventDefault = event.preventDefault || preventDef;\n event.stopPropagation = event.stopPropagation || stopProp;\n event.stopImmediatePropagation = event.stopImmediatePropagation || stopImmProp;\n\n if (/mouse|click/.test(event.type)) {\n event.pageX = event.clientX + getWindow(element).document.documentElement.scrollLeft;\n event.pageY = event.clientY + getWindow(element).document.documentElement.scrollTop;\n }\n\n listener(event);\n }\n };\n\n ret = element[addEvent](on + type, wrappedListener, !!options.capture);\n\n if (listenerIndex === -1) {\n supplied.push(listener);\n wrapped.push(wrappedListener);\n useCount.push(1);\n }\n else {\n useCount[listenerIndex]++;\n }\n }\n else {\n ret = element[addEvent](type, listener, supportsOptions? options : !!options.capture);\n }\n target.events[type].push(listener);\n\n return ret;\n }\n}\n\nfunction remove (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const elementIndex = indexOf(elements, element);\n const target = targets[elementIndex];\n\n if (!target || !target.events) {\n return;\n }\n\n let wrappedListener = listener;\n let listeners;\n let listenerIndex;\n\n if (useAttachEvent) {\n listeners = attachedListeners[elementIndex];\n listenerIndex = indexOf(listeners.supplied, listener);\n wrappedListener = listeners.wrapped[listenerIndex];\n }\n\n if (type === 'all') {\n for (type in target.events) {\n if (target.events.hasOwnProperty(type)) {\n remove(element, type, 'all');\n }\n }\n return;\n }\n\n if (target.events[type]) {\n const len = target.events[type].length;\n\n if (listener === 'all') {\n for (let i = 0; i < len; i++) {\n remove(element, type, target.events[type][i], options);\n }\n return;\n }\n else {\n for (let i = 0; i < len; i++) {\n if (target.events[type][i] === listener) {\n element[removeEvent](on + type, wrappedListener, supportsOptions? options : !!options.capture);\n target.events[type].splice(i, 1);\n\n if (useAttachEvent && listeners) {\n listeners.useCount[listenerIndex]--;\n if (listeners.useCount[listenerIndex] === 0) {\n listeners.supplied.splice(listenerIndex, 1);\n listeners.wrapped.splice(listenerIndex, 1);\n listeners.useCount.splice(listenerIndex, 1);\n }\n }\n\n break;\n }\n }\n }\n\n if (target.events[type] && target.events[type].length === 0) {\n target.events[type] = null;\n target.typeCount--;\n }\n }\n\n if (!target.typeCount) {\n targets.splice(elementIndex, 1);\n elements.splice(elementIndex, 1);\n attachedListeners.splice(elementIndex, 1);\n }\n}\n\nfunction addDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n if (!delegatedEvents[type]) {\n delegatedEvents[type] = {\n selectors: [],\n contexts : [],\n listeners: [],\n };\n\n // add delegate listener functions\n for (let i = 0; i < documents.length; i++) {\n add(documents[i], type, delegateListener);\n add(documents[i], type, delegateUseCapture, true);\n }\n }\n\n const delegated = delegatedEvents[type];\n let index;\n\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n break;\n }\n }\n\n if (index === -1) {\n index = delegated.selectors.length;\n\n delegated.selectors.push(selector);\n delegated.contexts .push(context);\n delegated.listeners.push([]);\n }\n\n // keep listener and capture and passive flags\n delegated.listeners[index].push([listener, !!options.capture, options.passive]);\n}\n\nfunction removeDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const delegated = delegatedEvents[type];\n let matchFound = false;\n let index;\n\n if (!delegated) { return; }\n\n // count from last index of delegated to 0\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n // look for matching selector and context Node\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n\n const listeners = delegated.listeners[index];\n\n // each item of the listeners array is an array: [function, capture, passive]\n for (let i = listeners.length - 1; i >= 0; i--) {\n const [fn, capture, passive] = listeners[i];\n\n // check if the listener functions and capture and passive flags match\n if (fn === listener && capture === !!options.capture && passive === options.passive) {\n // remove the listener from the array of listeners\n listeners.splice(i, 1);\n\n // if all listeners for this interactable have been removed\n // remove the interactable from the delegated arrays\n if (!listeners.length) {\n delegated.selectors.splice(index, 1);\n delegated.contexts .splice(index, 1);\n delegated.listeners.splice(index, 1);\n\n // remove delegate function from context\n remove(context, type, delegateListener);\n remove(context, type, delegateUseCapture, true);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegatedEvents[type] = null;\n }\n }\n\n // only remove one listener\n matchFound = true;\n break;\n }\n }\n\n if (matchFound) { break; }\n }\n }\n}\n\n// bound to the interactable context when a DOM event\n// listener is added to a selector interactable\nfunction delegateListener (event, optionalArg) {\n const options = getOptions(optionalArg);\n const fakeEvent = {};\n const delegated = delegatedEvents[event.type];\n const eventTarget = (domUtils.getActualElement(event.path\n ? event.path[0]\n : event.target));\n let element = eventTarget;\n\n // duplicate the event so that currentTarget can be changed\n pExtend(fakeEvent, event);\n\n fakeEvent.originalEvent = event;\n fakeEvent.preventDefault = preventOriginalDefault;\n\n // climb up document tree looking for selector matches\n while (is.element(element)) {\n for (let i = 0; i < delegated.selectors.length; i++) {\n const selector = delegated.selectors[i];\n const context = delegated.contexts[i];\n\n if (domUtils.matchesSelector(element, selector)\n && domUtils.nodeContains(context, eventTarget)\n && domUtils.nodeContains(context, element)) {\n\n const listeners = delegated.listeners[i];\n\n fakeEvent.currentTarget = element;\n\n for (let j = 0; j < listeners.length; j++) {\n const [fn, capture, passive] = listeners[j];\n\n if (capture === !!options.capture && passive === options.passive) {\n fn(fakeEvent);\n }\n }\n }\n }\n\n element = domUtils.parentNode(element);\n }\n}\n\nfunction delegateUseCapture (event) {\n return delegateListener.call(this, event, true);\n}\n\nfunction preventDef () {\n this.returnValue = false;\n}\n\nfunction preventOriginalDefault () {\n this.originalEvent.preventDefault();\n}\n\nfunction stopProp () {\n this.cancelBubble = true;\n}\n\nfunction stopImmProp () {\n this.cancelBubble = true;\n this.immediatePropagationStopped = true;\n}\n\nfunction getOptions (param) {\n return is.object(param)? param : { capture: param };\n}\n\nmodule.exports = {\n add,\n remove,\n\n addDelegate,\n removeDelegate,\n\n delegateListener,\n delegateUseCapture,\n delegatedEvents,\n documents,\n\n useAttachEvent,\n supportsOptions,\n\n _elements: elements,\n _targets: targets,\n _attachedListeners: attachedListeners,\n};\n","module.exports = function extend (dest, source) {\n for (const prop in source) {\n dest[prop] = source[prop];\n }\n return dest;\n};\n","const {\n resolveRectLike,\n rectToXY,\n} = require('./rect');\n\nmodule.exports = function (target, element, action) {\n const actionOptions = target.options[action];\n const actionOrigin = actionOptions && actionOptions.origin;\n const origin = actionOrigin || target.options.origin;\n\n const originRect = resolveRectLike(origin, target, element, [target && element]);\n\n return rectToXY(originRect) || { x: 0, y: 0 };\n};\n","module.exports = (x, y) => Math.sqrt(x * x + y * y);\n","const extend = require('./extend');\nconst win = require('./window');\n\nconst utils = {\n warnOnce: function (method, message) {\n let warned = false;\n\n return function () {\n if (!warned) {\n win.window.console.warn(message);\n warned = true;\n }\n\n return method.apply(this, arguments);\n };\n },\n\n // http://stackoverflow.com/a/5634528/2280888\n _getQBezierValue: function (t, p1, p2, p3) {\n const iT = 1 - t;\n return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3;\n },\n\n getQuadraticCurvePoint: function (startX, startY, cpX, cpY, endX, endY, position) {\n return {\n x: utils._getQBezierValue(position, startX, cpX, endX),\n y: utils._getQBezierValue(position, startY, cpY, endY),\n };\n },\n\n // http://gizma.com/easing/\n easeOutQuad: function (t, b, c, d) {\n t /= d;\n return -c * t*(t-2) + b;\n },\n\n copyAction: function (dest, src) {\n dest.name = src.name;\n dest.axis = src.axis;\n dest.edges = src.edges;\n\n return dest;\n },\n\n is : require('./is'),\n extend : extend,\n hypot : require('./hypot'),\n getOriginXY: require('./getOriginXY'),\n};\n\nextend(utils, require('./arr'));\nextend(utils, require('./domUtils'));\nextend(utils, require('./pointerUtils'));\nextend(utils, require('./rect'));\n\nmodule.exports = utils;\n","const scope = require('../scope');\nconst utils = require('./index');\n\nconst finder = {\n methodOrder: [ 'simulationResume', 'mouseOrPen', 'hasPointer', 'idle' ],\n\n search: function (pointer, eventType, eventTarget) {\n const pointerType = utils.getPointerType(pointer);\n const pointerId = utils.getPointerId(pointer);\n const details = { pointer, pointerId, pointerType, eventType, eventTarget };\n\n for (const method of finder.methodOrder) {\n const interaction = finder[method](details);\n\n if (interaction) {\n return interaction;\n }\n }\n },\n\n // try to resume simulation with a new pointer\n simulationResume: function ({ pointerType, eventType, eventTarget }) {\n if (!/down|start/i.test(eventType)) {\n return null;\n }\n\n for (const interaction of scope.interactions) {\n let element = eventTarget;\n\n if (interaction.simulation && interaction.simulation.allowResume\n && (interaction.pointerType === pointerType)) {\n while (element) {\n // if the element is the interaction element\n if (element === interaction.element) {\n return interaction;\n }\n element = utils.parentNode(element);\n }\n }\n }\n\n return null;\n },\n\n // if it's a mouse or pen interaction\n mouseOrPen: function ({ pointerId, pointerType, eventType }) {\n if (pointerType !== 'mouse' && pointerType !== 'pen') {\n return null;\n }\n\n let firstNonActive;\n\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType) {\n // if it's a down event, skip interactions with running simulations\n if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; }\n\n // if the interaction is active, return it immediately\n if (interaction.interacting()) {\n return interaction;\n }\n // otherwise save it and look for another active interaction\n else if (!firstNonActive) {\n firstNonActive = interaction;\n }\n }\n }\n\n // if no active mouse interaction was found use the first inactive mouse\n // interaction\n if (firstNonActive) {\n return firstNonActive;\n }\n\n // find any mouse or pen interaction.\n // ignore the interaction if the eventType is a *down, and a simulation\n // is active\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType && !(/down/i.test(eventType) && interaction.simulation)) {\n return interaction;\n }\n }\n\n return null;\n },\n\n // get interaction that has this pointer\n hasPointer: function ({ pointerId }) {\n for (const interaction of scope.interactions) {\n if (utils.contains(interaction.pointerIds, pointerId)) {\n return interaction;\n }\n }\n },\n\n // get first idle interaction with a matching pointerType\n idle: function ({ pointerType }) {\n for (const interaction of scope.interactions) {\n // if there's already a pointer held down\n if (interaction.pointerIds.length === 1) {\n const target = interaction.target;\n // don't add this pointer if there is a target interactable and it\n // isn't gesturable\n if (target && !target.options.gesture.enabled) {\n continue;\n }\n }\n // maximum of 2 pointers per interaction\n else if (interaction.pointerIds.length >= 2) {\n continue;\n }\n\n if (!interaction.interacting() && (pointerType === interaction.pointerType)) {\n return interaction;\n }\n }\n\n return null;\n },\n};\n\nmodule.exports = finder;\n","const win = require('./window');\nconst isWindow = require('./isWindow');\n\nconst is = {\n array : () => {},\n\n window : thing => thing === win.window || isWindow(thing),\n\n docFrag : thing => is.object(thing) && thing.nodeType === 11,\n\n object : thing => !!thing && (typeof thing === 'object'),\n\n function: thing => typeof thing === 'function',\n\n number : thing => typeof thing === 'number' ,\n\n bool : thing => typeof thing === 'boolean' ,\n\n string : thing => typeof thing === 'string' ,\n\n element: thing => {\n if (!thing || (typeof thing !== 'object')) { return false; }\n\n const _window = win.getWindow(thing) || win.window;\n\n return (/object|function/.test(typeof _window.Element)\n ? thing instanceof _window.Element //DOM2\n : thing.nodeType === 1 && typeof thing.nodeName === 'string');\n },\n};\n\nis.array = thing => (is.object(thing)\n && (typeof thing.length !== 'undefined')\n && is.function(thing.splice));\n\nmodule.exports = is;\n","module.exports = (thing) => !!(thing && thing.Window) && (thing instanceof thing.Window);\n","function pointerExtend (dest, source) {\n for (const prop in source) {\n const prefixedPropREs = module.exports.prefixedPropREs;\n let deprecated = false;\n\n // skip deprecated prefixed properties\n for (const vendor in prefixedPropREs) {\n if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) {\n deprecated = true;\n break;\n }\n }\n\n if (!deprecated && typeof source[prop] !== 'function') {\n dest[prop] = source[prop];\n }\n }\n return dest;\n}\n\npointerExtend.prefixedPropREs = {\n webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/,\n};\n\nmodule.exports = pointerExtend;\n","const hypot = require('./hypot');\nconst browser = require('./browser');\nconst dom = require('./domObjects');\nconst domUtils = require('./domUtils');\nconst domObjects = require('./domObjects');\nconst is = require('./is');\nconst pointerExtend = require('./pointerExtend');\n\nconst pointerUtils = {\n copyCoords: function (dest, src) {\n dest.page = dest.page || {};\n dest.page.x = src.page.x;\n dest.page.y = src.page.y;\n\n dest.client = dest.client || {};\n dest.client.x = src.client.x;\n dest.client.y = src.client.y;\n\n dest.timeStamp = src.timeStamp;\n },\n\n setCoordDeltas: function (targetObj, prev, cur) {\n targetObj.page.x = cur.page.x - prev.page.x;\n targetObj.page.y = cur.page.y - prev.page.y;\n targetObj.client.x = cur.client.x - prev.client.x;\n targetObj.client.y = cur.client.y - prev.client.y;\n targetObj.timeStamp = cur.timeStamp - prev.timeStamp;\n\n // set pointer velocity\n const dt = Math.max(targetObj.timeStamp / 1000, 0.001);\n\n targetObj.page.speed = hypot(targetObj.page.x, targetObj.page.y) / dt;\n targetObj.page.vx = targetObj.page.x / dt;\n targetObj.page.vy = targetObj.page.y / dt;\n\n targetObj.client.speed = hypot(targetObj.client.x, targetObj.page.y) / dt;\n targetObj.client.vx = targetObj.client.x / dt;\n targetObj.client.vy = targetObj.client.y / dt;\n },\n\n isNativePointer: function (pointer) {\n return (pointer instanceof dom.Event || pointer instanceof dom.Touch);\n },\n\n // Get specified X/Y coords for mouse or event.touches[0]\n getXY: function (type, pointer, xy) {\n xy = xy || {};\n type = type || 'page';\n\n xy.x = pointer[type + 'X'];\n xy.y = pointer[type + 'Y'];\n\n return xy;\n },\n\n getPageXY: function (pointer, page) {\n page = page || {};\n\n // Opera Mobile handles the viewport and scrolling oddly\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n pointerUtils.getXY('screen', pointer, page);\n\n page.x += window.scrollX;\n page.y += window.scrollY;\n }\n else {\n pointerUtils.getXY('page', pointer, page);\n }\n\n return page;\n },\n\n getClientXY: function (pointer, client) {\n client = client || {};\n\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n // Opera Mobile handles the viewport and scrolling oddly\n pointerUtils.getXY('screen', pointer, client);\n }\n else {\n pointerUtils.getXY('client', pointer, client);\n }\n\n return client;\n },\n\n getPointerId: function (pointer) {\n return is.number(pointer.pointerId)? pointer.pointerId : pointer.identifier;\n },\n\n setCoords: function (targetObj, pointers, timeStamp) {\n const pointer = (pointers.length > 1\n ? pointerUtils.pointerAverage(pointers)\n : pointers[0]);\n\n const tmpXY = {};\n\n pointerUtils.getPageXY(pointer, tmpXY);\n targetObj.page.x = tmpXY.x;\n targetObj.page.y = tmpXY.y;\n\n pointerUtils.getClientXY(pointer, tmpXY);\n targetObj.client.x = tmpXY.x;\n targetObj.client.y = tmpXY.y;\n\n targetObj.timeStamp = is.number(timeStamp) ? timeStamp :new Date().getTime();\n },\n\n pointerExtend: pointerExtend,\n\n getTouchPair: function (event) {\n const touches = [];\n\n // array of touches is supplied\n if (is.array(event)) {\n touches[0] = event[0];\n touches[1] = event[1];\n }\n // an event\n else {\n if (event.type === 'touchend') {\n if (event.touches.length === 1) {\n touches[0] = event.touches[0];\n touches[1] = event.changedTouches[0];\n }\n else if (event.touches.length === 0) {\n touches[0] = event.changedTouches[0];\n touches[1] = event.changedTouches[1];\n }\n }\n else {\n touches[0] = event.touches[0];\n touches[1] = event.touches[1];\n }\n }\n\n return touches;\n },\n\n pointerAverage: function (pointers) {\n const average = {\n pageX : 0,\n pageY : 0,\n clientX: 0,\n clientY: 0,\n screenX: 0,\n screenY: 0,\n };\n\n for (const pointer of pointers) {\n for (const prop in average) {\n average[prop] += pointer[prop];\n }\n }\n for (const prop in average) {\n average[prop] /= pointers.length;\n }\n\n return average;\n },\n\n touchBBox: function (event) {\n if (!event.length && !(event.touches && event.touches.length > 1)) {\n return;\n }\n\n const touches = pointerUtils.getTouchPair(event);\n const minX = Math.min(touches[0].pageX, touches[1].pageX);\n const minY = Math.min(touches[0].pageY, touches[1].pageY);\n const maxX = Math.max(touches[0].pageX, touches[1].pageX);\n const maxY = Math.max(touches[0].pageY, touches[1].pageY);\n\n return {\n x: minX,\n y: minY,\n left: minX,\n top: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n },\n\n touchDistance: function (event, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n\n\n const dx = touches[0][sourceX] - touches[1][sourceX];\n const dy = touches[0][sourceY] - touches[1][sourceY];\n\n return hypot(dx, dy);\n },\n\n touchAngle: function (event, prevAngle, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n const dx = touches[1][sourceX] - touches[0][sourceX];\n const dy = touches[1][sourceY] - touches[0][sourceY];\n const angle = 180 * Math.atan2(dy , dx) / Math.PI;\n\n return angle;\n },\n\n getPointerType: function (pointer) {\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : is.number(pointer.pointerType)\n ? [undefined, undefined,'touch', 'pen', 'mouse'][pointer.pointerType]\n // if the PointerEvent API isn't available, then the \"pointer\" must\n // be either a MouseEvent, TouchEvent, or Touch object\n : /touch/.test(pointer.type) || pointer instanceof domObjects.Touch\n ? 'touch'\n : 'mouse';\n },\n\n // [ event.target, event.currentTarget ]\n getEventTargets: function (event) {\n return [\n domUtils.getActualElement(event.path ? event.path[0] : event.target),\n domUtils.getActualElement(event.currentTarget),\n ];\n },\n};\n\nmodule.exports = pointerUtils;\n","const { window } = require('./window');\n\nconst vendors = ['ms', 'moz', 'webkit', 'o'];\nlet lastTime = 0;\nlet request;\nlet cancel;\n\nfor (let x = 0; x < vendors.length && !window.requestAnimationFrame; x++) {\n request = window[vendors[x] + 'RequestAnimationFrame'];\n cancel = window[vendors[x] +'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n}\n\nif (!request) {\n request = function (callback) {\n const currTime = new Date().getTime();\n const timeToCall = Math.max(0, 16 - (currTime - lastTime));\n const id = setTimeout(function () { callback(currTime + timeToCall); },\n timeToCall);\n\n lastTime = currTime + timeToCall;\n return id;\n };\n}\n\nif (!cancel) {\n cancel = function (id) {\n clearTimeout(id);\n };\n}\n\nmodule.exports = {\n request,\n cancel,\n};\n","const extend = require('./extend');\nconst is = require('./is');\nconst {\n closest,\n parentNode,\n getElementRect,\n} = require('./domUtils');\n\nconst rectUtils = {\n getStringOptionResult: function (value, interactable, element) {\n if (!is.string(value)) {\n return null;\n }\n\n if (value === 'parent') {\n value = parentNode(element);\n }\n else if (value === 'self') {\n value = interactable.getRect(element);\n }\n else {\n value = closest(element, value);\n }\n\n return value;\n },\n\n resolveRectLike: function (value, interactable, element, functionArgs) {\n value = rectUtils.getStringOptionResult(value, interactable, element) || value;\n\n if (is.function(value)) {\n value = value.apply(null, functionArgs);\n }\n\n if (is.element(value)) {\n value = getElementRect(value);\n }\n\n return value;\n },\n\n rectToXY: function (rect) {\n return rect && {\n x: 'x' in rect ? rect.x : rect.left,\n y: 'y' in rect ? rect.y : rect.top,\n };\n },\n\n xywhToTlbr: function (rect) {\n if (rect && !('left' in rect && 'top' in rect)) {\n rect = extend({}, rect);\n\n rect.left = rect.x || 0;\n rect.top = rect.y || 0;\n rect.right = rect.right || (rect.left + rect.width);\n rect.bottom = rect.bottom || (rect.top + rect.height);\n }\n\n return rect;\n },\n\n tlbrToXywh: function (rect) {\n if (rect && !('x' in rect && 'y' in rect)) {\n rect = extend({}, rect);\n\n rect.x = rect.left || 0;\n rect.top = rect.top || 0;\n rect.width = rect.width || (rect.right - rect.x);\n rect.height = rect.height || (rect.bottom - rect.y);\n }\n\n return rect;\n },\n};\n\nmodule.exports = rectUtils;\n","const win = module.exports;\nconst isWindow = require('./isWindow');\n\nfunction init (window) {\n // get wrapped window if using Shadow DOM polyfill\n\n win.realWindow = window;\n\n // create a TextNode\n const el = window.document.createTextNode('');\n\n // check if it's wrapped by a polyfill\n if (el.ownerDocument !== window.document\n && typeof window.wrap === 'function'\n && window.wrap(el) === el) {\n // use wrapped window\n window = window.wrap(window);\n }\n\n win.window = window;\n}\n\nif (typeof window === 'undefined') {\n win.window = undefined;\n win.realWindow = undefined;\n}\nelse {\n init(window);\n}\n\nwin.getWindow = function getWindow (node) {\n if (isWindow(node)) {\n return node;\n }\n\n const rootNode = (node.ownerDocument || node);\n\n return rootNode.defaultView || rootNode.parentWindow || win.window;\n};\n\nwin.init = init;\n"]} \ No newline at end of file diff --git a/dist/interact.min.js b/dist/interact.min.js index c0bb2476c..2d1f0fb62 100644 --- a/dist/interact.min.js +++ b/dist/interact.min.js @@ -1,6 +1,6 @@ -/* interact.js v1.3.0-alpha.3+sha.9595c40 | https://raw.github.com/taye/interact.js/master/LICENSE */ -!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var t;t="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,t.interact=e()}}(function(){return function e(t,n,r){function i(s,a){if(!n[s]){if(!t[s]){var l="function"==typeof require&&require;if(!a&&l)return l(s,!0);if(o)return o(s,!0);var c=new Error("Cannot find module '"+s+"'");throw c.code="MODULE_NOT_FOUND",c}var p=n[s]={exports:{}};t[s][0].call(p.exports,function(e){var n=t[s][1][e];return i(n||e)},p,p.exports,e,t,n,r)}return n[s].exports}for(var o="function"==typeof require&&require,s=0;s6&&void 0!==arguments[6]&&arguments[6];r(this,e);var f=t.target,v=(f&&f.options||s).deltaSource,g=o(f,p,l),h="start"===c,m="end"===c,y=h?t.startCoords:t.curCoords,x=t.prevEvent;p=p||t.element;var b=i({},y.page),w=i({},y.client);b.x-=g.x,b.y-=g.y,w.x-=g.x,w.y-=g.y,this.ctrlKey=n.ctrlKey,this.altKey=n.altKey,this.shiftKey=n.shiftKey,this.metaKey=n.metaKey,this.button=n.button,this.buttons=n.buttons,this.target=p,this.currentTarget=p,this.relatedTarget=u||null,this.preEnd=d,this.type=l+(c||""),this.interaction=t,this.interactable=f,this.t0=h?t.downTimes[t.downTimes.length-1]:x.t0;var E={interaction:t,event:n,action:l,phase:c,element:p,related:u,page:b,client:w,coords:y,starting:h,ending:m,deltaSource:v,iEvent:this};a.fire("set-xy",E),m?(this.pageX=x.pageX,this.pageY=x.pageY,this.clientX=x.clientX,this.clientY=x.clientY):(this.pageX=b.x,this.pageY=b.y,this.clientX=w.x,this.clientY=w.y),this.x0=t.startCoords.page.x-g.x,this.y0=t.startCoords.page.y-g.y,this.clientX0=t.startCoords.client.x-g.x,this.clientY0=t.startCoords.client.y-g.y,a.fire("set-delta",E),this.timeStamp=y.timeStamp,this.dt=t.pointerDelta.timeStamp,this.duration=this.timeStamp-this.t0,this.speed=t.pointerDelta[v].speed,this.velocityX=t.pointerDelta[v].vx,this.velocityY=t.pointerDelta[v].vy,this.swipe=m||"inertiastart"===c?this.getSwipe():null,a.fire("new",E)}return e.prototype.getSwipe=function(){var e=this.interaction;if(e.prevEvent.speed<600||this.timeStamp-e.prevEvent.timeStamp>150)return null;var t=180*Math.atan2(e.prevEvent.velocityY,e.prevEvent.velocityX)/Math.PI;t<0&&(t+=360);var n=112.5<=t&&t<247.5,r=202.5<=t&&t<337.5,i=!n&&(292.5<=t||t<67.5);return{up:r,down:!r&&22.5<=t&&t<157.5,left:n,right:i,angle:t,speed:e.prevEvent.speed,velocity:{x:e.prevEvent.velocityX,y:e.prevEvent.velocityY}}},e.prototype.preventDefault=function(){},e.prototype.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},e.prototype.stopPropagation=function(){this.propagationStopped=!0},e}();a.on("set-delta",function(e){var t=e.iEvent,n=e.interaction,r=e.starting,i=e.deltaSource,o=r?t:n.prevEvent;"client"===i?(t.dx=t.clientX-o.clientX,t.dy=t.clientY-o.clientY):(t.dx=t.pageX-o.pageX,t.dy=t.pageY-o.pageY)}),l.signals=a,t.exports=l},{"./defaultOptions":18,"./utils/Signals":35,"./utils/extend":41,"./utils/getOriginXY":42}],4:[function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=e("./utils/is"),o=e("./utils/events"),s=e("./utils/extend"),a=e("./actions/base"),l=e("./scope"),c=e("./Eventable"),p=e("./defaultOptions"),u=e("./utils/Signals").new(),d=e("./utils/domUtils"),f=d.getElementRect,v=d.nodeContains,g=d.trySelector,h=e("./utils/window"),m=h.getWindow,y=e("./utils/arr"),x=y.indexOf,b=y.contains,w=e("./utils/browser"),E=w.wheelEvent;l.interactables=[];var S=function(){function e(t,n){r(this,e),n=n||{},this.target=t,this.events=new c,this._context=n.context||l.document,this._win=m(g(t)?this._context:t),this._doc=this._win.document,u.fire("new",{target:t,options:n,interactable:this,win:this._win}),l.addDocument(this._doc,this._win),l.interactables.push(this),this.set(n)}return e.prototype.setOnEvents=function(e,t){var n="on"+e;return i.function(t.onstart)&&(this.events[n+"start"]=t.onstart),i.function(t.onmove)&&(this.events[n+"move"]=t.onmove),i.function(t.onend)&&(this.events[n+"end"]=t.onend),i.function(t.oninertiastart)&&(this.events[n+"inertiastart"]=t.oninertiastart),this},e.prototype.setPerAction=function(e,t){for(var n in t)n in p[e]&&(i.object(t[n])?(this.options[e][n]=s(this.options[e][n]||{},t[n]),i.object(p.perAction[n])&&"enabled"in p.perAction[n]&&(this.options[e][n].enabled=!1!==t[n].enabled)):i.bool(t[n])&&i.object(p.perAction[n])?this.options[e][n].enabled=t[n]:void 0!==t[n]&&(this.options[e][n]=t[n]))},e.prototype.getRect=function(e){return e=e||this.target,i.string(this.target)&&!i.element(e)&&(e=this._context.querySelector(this.target)),f(e)},e.prototype.rectChecker=function(e){return i.function(e)?(this.getRect=e,this):null===e?(delete this.options.getRect,this):this.getRect},e.prototype._backCompatOption=function(e,t){if(g(t)||i.object(t)){this.options[e]=t;for(var n=a.names,r=Array.isArray(n),o=0,n=r?n:n[Symbol.iterator]();;){var s;if(r){if(o>=n.length)break;s=n[o++]}else{if(o=n.next(),o.done)break;s=o.value}var l=s;this.options[l][e]=t}return this}return this.options[e]},e.prototype.origin=function(e){return this._backCompatOption("origin",e)},e.prototype.deltaSource=function(e){return"page"===e||"client"===e?(this.options.deltaSource=e,this):this.options.deltaSource},e.prototype.context=function(){return this._context},e.prototype.inContext=function(e){return this._context===e.ownerDocument||v(this._context,e)},e.prototype.fire=function(e){return this.events.fire(e),this},e.prototype._onOffMultiple=function(e,t,n,r){if(i.string(t)&&-1!==t.search(" ")&&(t=t.trim().split(/ +/)),i.array(t)){for(var o=0;o=l.length)break;f=l[d++]}else{if(d=l.next(),d.done)break;f=d.value}var v=f;this.options[v]=p.base[v],v in t&&this[v](t[v])}return u.fire("set",{options:t,interactable:this}),this},e.prototype.unset=function(){if(o.remove(this.target,"all"),i.string(this.target))for(var e in o.delegatedEvents){var t=o.delegatedEvents[e];t.selectors[0]===this.target&&t.contexts[0]===this._context&&(t.selectors.splice(0,1),t.contexts.splice(0,1),t.listeners.splice(0,1),t.selectors.length||(t[e]=null)),o.remove(this._context,e,o.delegateListener),o.remove(this._context,e,o.delegateUseCapture,!0)}else o.remove(this,"all");u.fire("unset",{interactable:this}),l.interactables.splice(x(l.interactables,this),1);for(var n=l.interactions||[],r=Array.isArray(n),s=0,n=r?n:n[Symbol.iterator]();;){var a;if(r){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var c=a;c.target===this&&c.interacting()&&c.stop()}return l.interact},e}();l.interactables.indexOfElement=function(e,t){t=t||l.document;for(var n=0;n=y.length)break;w=y[b++]}else{if(b=y.next(),b.done)break;w=b.value}var E=w,S=E[0],T=E[1];T._updateEventTargets(r,i),T[e](S,t,r,i)}}}function o(e){for(var t=0;te.pointerMoveTolerance);var a={pointer:t,pointerIndex:this.getPointerIndex(t),event:n,eventTarget:r,dx:o,dy:s,duplicate:i,interaction:this,interactingBeforeMove:this.interacting()};i||l.setCoordDeltas(this.pointerDelta,this.prevCoords,this.curCoords),d.fire("move",a),i||(this.interacting()&&this.doMove(a),this.pointerWasMoved&&l.copyCoords(this.prevCoords,this.curCoords))},e.prototype.doMove=function(e){e=l.extend({pointer:this.pointers[0],event:this.prevEvent,eventTarget:this._eventTarget,interaction:this},e||{}),d.fire("before-action-move",e),this._dontFireMove||d.fire("action-move",e),this._dontFireMove=!1},e.prototype.pointerUp=function(e,t,n,r){var i=this.getPointerIndex(e);d.fire(/cancel$/i.test(t.type)?"cancel":"up",{pointer:e,pointerIndex:i,event:t,eventTarget:n,curEventTarget:r,interaction:this}),this.simulation||this.end(t),this.pointerIsDown=!1,this.removePointer(e,t)},e.prototype.end=function(e){e=e||this.prevEvent,this.interacting()&&d.fire("action-end",{event:e,interaction:this}),this.stop()},e.prototype.currentAction=function(){return this._interacting?this.prepared.name:null},e.prototype.interacting=function(){return this._interacting},e.prototype.stop=function(){d.fire("stop",{interaction:this}),this._interacting&&(d.fire("stop-active",{interaction:this}),d.fire("stop-"+this.prepared.name,{interaction:this})),this.target=this.element=null,this._interacting=!1,this.prepared.name=this.prevEvent=null},e.prototype.getPointerIndex=function(e){return l.indexOf(this.pointerIds,l.getPointerId(e))},e.prototype.updatePointer=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:t&&/(down|start)$/i.test(t.type),r=l.getPointerId(e),i=this.getPointerIndex(e);return-1===i&&(i=this.pointerIds.length,this.pointerIds[i]=r),n&&d.fire("update-pointer-down",{pointer:e,event:t,down:n,pointerId:r,pointerIndex:i,interaction:this}),this.pointers[i]=e,i},e.prototype.removePointer=function(e,t){var n=l.getPointerId(e),r=this.mouse?0:l.indexOf(this.pointerIds,n);-1!==r&&(d.fire("remove-pointer",{pointer:e,event:t,pointerIndex:r,interaction:this}),this.pointers.splice(r,1),this.pointerIds.splice(r,1),this.downTargets.splice(r,1),this.downTimes.splice(r,1))},e.prototype._updateEventTargets=function(e,t){this._eventTarget=e,this._curEventTarget=t},e}(),m=0,y=v.length;m=i.length)break;a=i[s++]}else{if(s=i.next(),s.done)break;a=s.value}var l=a;if(l.options.drop.enabled){var c=l.options.drop.accept;if(!(p.is.element(c)&&c!==t||p.is.string(c)&&!p.matchesSelector(t,c)))for(var d=p.is.string(l.target)?l._context.querySelectorAll(l.target):[l.target],f=0;fo.left&&c.xo.top&&c.y=o.left&&v<=o.right&&g>=o.top&&g<=o.bottom}if(f&&p.is.number(a)){s=Math.max(0,Math.min(o.right,f.right)-Math.max(o.left,f.left))*Math.max(0,Math.min(o.bottom,f.bottom)-Math.max(o.top,f.top))/(f.width*f.height)>=a}return this.options.drop.checker&&(s=this.options.drop.checker(e,t,s,this,i,n,r)),s},v.signals.on("unset",function(e){e.interactable.dropzone(!1)}),v.settingsMethods.push("dropChecker"),g.signals.on("new",function(e){e.dropTarget=null,e.dropElement=null,e.prevDropTarget=null,e.prevDropElement=null,e.dropEvents=null,e.activeDrops={dropzones:[],elements:[],rects:[]}}),g.signals.on("stop",function(e){var t=e.interaction;t.dropTarget=t.dropElement=t.prevDropTarget=t.prevDropElement=null}),d.dynamicDrop=function(e){return p.is.bool(e)?(y=e,d):y},p.merge(v.eventTypes,["dragenter","dragleave","dropactivate","dropdeactivate","dropmove","drop"]),c.methodDict.drop="dropzone",h.drop=m.defaults,t.exports=m},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../interact":21,"../scope":34,"../utils":44,"./base":6}],9:[function(e,t,n){"use strict";var r=e("./base"),i=e("../utils"),o=e("../InteractEvent"),s=e("../Interactable"),a=e("../Interaction"),l=e("../defaultOptions"),c={defaults:{enabled:!1,origin:null,restrict:null},checker:function(e,t,n,r,i){return i.pointerIds.length>=2?{name:"gesture"}:null},getCursor:function(){return""}};o.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;"gesturestart"===t.type&&(t.ds=0,n.gesture.startDistance=n.gesture.prevDistance=t.distance,n.gesture.startAngle=n.gesture.prevAngle=t.angle,n.gesture.scale=1)}),o.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;"gesturemove"===t.type&&(t.ds=t.scale-n.gesture.scale,n.target.fire(t),n.gesture.prevAngle=t.angle,n.gesture.prevDistance=t.distance,t.scale===1/0||null===t.scale||void 0===t.scale||isNaN(t.scale)||(n.gesture.scale=t.scale))}),s.prototype.gesturable=function(e){return i.is.object(e)?(this.options.gesture.enabled=!1!==e.enabled,this.setPerAction("gesture",e),this.setOnEvents("gesture",e),this):i.is.bool(e)?(this.options.gesture.enabled=e,e||(this.ongesturestart=this.ongesturestart=this.ongestureend=null),this):this.options.gesture},o.signals.on("set-delta",function(e){var t=e.interaction,n=e.iEvent,r=e.action,s=e.event,a=e.starting,l=e.ending,c=e.deltaSource;if("gesture"===r){var p=t.pointers;n.touches=[p[0],p[1]],a?(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=1,n.ds=0,n.angle=i.touchAngle(p,void 0,c),n.da=0):l||s instanceof o?(n.distance=t.prevEvent.distance,n.box=t.prevEvent.box,n.scale=t.prevEvent.scale,n.ds=n.scale-1,n.angle=t.prevEvent.angle,n.da=n.angle-t.gesture.startAngle):(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=n.distance/t.gesture.startDistance,n.angle=i.touchAngle(p,t.gesture.prevAngle,c),n.ds=n.scale-t.gesture.prevScale,n.da=n.angle-t.gesture.prevAngle)}}),a.signals.on("new",function(e){e.gesture={start:{x:0,y:0},startDistance:0,prevDistance:0,distance:0,scale:1,startAngle:0,prevAngle:0}}),r.gesture=c,r.names.push("gesture"),i.merge(s.eventTypes,["gesturestart","gesturemove","gestureend"]),r.methodDict.gesture="gesturable",l.gesture=c.defaults,t.exports=c},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"./base":6}],10:[function(e,t,n){"use strict";function r(e,t,n,r,i,s,a){if(!t)return!1;if(!0===t){var l=o.is.number(s.width)?s.width:s.right-s.left,c=o.is.number(s.height)?s.height:s.bottom-s.top;if(l<0&&("left"===e?e="right":"right"===e&&(e="left")),c<0&&("top"===e?e="bottom":"bottom"===e&&(e="top")),"left"===e)return n.x<(l>=0?s.left:s.right)+a;if("top"===e)return n.y<(c>=0?s.top:s.bottom)+a;if("right"===e)return n.x>(l>=0?s.right:s.left)-a;if("bottom"===e)return n.y>(c>=0?s.bottom:s.top)-a}return!!o.is.element(r)&&(o.is.element(t)?t===r:o.matchesUpTo(r,t,i))}var i=e("./base"),o=e("../utils"),s=e("../utils/browser"),a=e("../InteractEvent"),l=e("../Interactable"),c=e("../Interaction"),p=e("../defaultOptions"),u=s.supportsTouch||s.supportsPointerEvent?20:10,d={defaults:{enabled:!1,mouseButtons:null,origin:null,snap:null,restrict:null,inertia:null,autoScroll:null,square:!1,preserveAspectRatio:!1,axis:"xy",margin:NaN,edges:null,invert:"none"},checker:function(e,t,n,i,s,a){if(!a)return null;var l=o.extend({},s.curCoords.page),c=n.options;if(c.resize.enabled){var p=c.resize,d={left:!1,right:!1,top:!1,bottom:!1};if(o.is.object(p.edges)){for(var f in d)d[f]=r(f,p.edges[f],l,s._eventTarget,i,a,p.margin||u);if(d.left=d.left&&!d.right,d.top=d.top&&!d.bottom,d.left||d.right||d.top||d.bottom)return{name:"resize",edges:d}}else{var v="y"!==c.resize.axis&&l.x>a.right-u,g="x"!==c.resize.axis&&l.y>a.bottom-u;if(v||g)return{name:"resize",axes:(v?"x":"")+(g?"y":"")}}}return null},cursors:s.isIe9OrOlder?{x:"e-resize",y:"s-resize",xy:"se-resize",top:"n-resize",left:"w-resize",bottom:"s-resize",right:"e-resize",topleft:"se-resize",bottomright:"se-resize",topright:"ne-resize",bottomleft:"ne-resize"}:{x:"ew-resize",y:"ns-resize",xy:"nwse-resize",top:"ns-resize",left:"ew-resize",bottom:"ns-resize",right:"ew-resize",topleft:"nwse-resize",bottomright:"nwse-resize",topright:"nesw-resize",bottomleft:"nesw-resize"},getCursor:function(e){if(e.axis)return d.cursors[e.name+e.axis];if(e.edges){for(var t="",n=["top","bottom","left","right"],r=0;r<4;r++)e.edges[n[r]]&&(t+=n[r]);return d.cursors[t]}}};a.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;if("resizestart"===t.type&&n.prepared.edges){var r=n.target.getRect(n.element),i=n.target.options.resize;if(i.square||i.preserveAspectRatio){var s=o.extend({},n.prepared.edges);s.top=s.top||s.left&&!s.bottom,s.left=s.left||s.top&&!s.right,s.bottom=s.bottom||s.right&&!s.top,s.right=s.right||s.bottom&&!s.left,n.prepared._linkedEdges=s}else n.prepared._linkedEdges=null;i.preserveAspectRatio&&(n.resizeStartAspectRatio=r.width/r.height),n.resizeRects={start:r,current:o.extend({},r),inverted:o.extend({},r),previous:o.extend({},r),delta:{left:0,right:0,width:0,top:0,bottom:0,height:0}},t.rect=n.resizeRects.inverted,t.deltaRect=n.resizeRects.delta}}),a.signals.on("new",function(e){var t=e.iEvent,n=e.phase,r=e.interaction;if("move"===n&&r.prepared.edges){var i=r.target.options.resize,s=i.invert,a="reposition"===s||"negate"===s,l=r.prepared.edges,c=r.resizeRects.start,p=r.resizeRects.current,u=r.resizeRects.inverted,d=r.resizeRects.delta,f=o.extend(r.resizeRects.previous,u),v=l,g=t.dx,h=t.dy;if(i.preserveAspectRatio||i.square){var m=i.preserveAspectRatio?r.resizeStartAspectRatio:1;l=r.prepared._linkedEdges,v.left&&v.bottom||v.right&&v.top?h=-g/m:v.left||v.right?h=g/m:(v.top||v.bottom)&&(g=h*m)}if(l.top&&(p.top+=h),l.bottom&&(p.bottom+=h),l.left&&(p.left+=g),l.right&&(p.right+=g),a){if(o.extend(u,p),"reposition"===s){var y=void 0;u.top>u.bottom&&(y=u.top,u.top=u.bottom,u.bottom=y),u.left>u.right&&(y=u.left,u.left=u.right,u.right=y)}}else u.top=Math.min(p.top,c.bottom),u.bottom=Math.max(p.bottom,c.top),u.left=Math.min(p.left,c.right),u.right=Math.max(p.right,c.left);u.width=u.right-u.left,u.height=u.bottom-u.top;for(var x in u)d[x]=u[x]-f[x];t.edges=r.prepared.edges,t.rect=u,t.deltaRect=d}}),l.prototype.resizable=function(e){return o.is.object(e)?(this.options.resize.enabled=!1!==e.enabled,this.setPerAction("resize",e),this.setOnEvents("resize",e),/^x$|^y$|^xy$/.test(e.axis)?this.options.resize.axis=e.axis:null===e.axis&&(this.options.resize.axis=p.resize.axis),o.is.bool(e.preserveAspectRatio)?this.options.resize.preserveAspectRatio=e.preserveAspectRatio:o.is.bool(e.square)&&(this.options.resize.square=e.square),this):o.is.bool(e)?(this.options.resize.enabled=e,e||(this.onresizestart=this.onresizestart=this.onresizeend=null),this):this.options.resize},c.signals.on("new",function(e){ -e.resizeAxes="xy"}),a.signals.on("set-delta",function(e){var t=e.interaction,n=e.iEvent;"resize"===e.action&&t.resizeAxes&&(t.target.options.resize.square?("y"===t.resizeAxes?n.dx=n.dy:n.dy=n.dx,n.axes="xy"):(n.axes=t.resizeAxes,"x"===t.resizeAxes?n.dy=0:"y"===t.resizeAxes&&(n.dx=0)))}),i.resize=d,i.names.push("resize"),o.merge(l.eventTypes,["resizestart","resizemove","resizeinertiastart","resizeinertiaresume","resizeend"]),i.methodDict.resize="resizable",p.resize=d.defaults,t.exports=d},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"../utils/browser":37,"./base":6}],11:[function(e,t,n){"use strict";var r=e("./utils/raf"),i=e("./utils/window").getWindow,o=e("./utils/is"),s=e("./utils/domUtils"),a=e("./Interaction"),l=e("./defaultOptions"),c={defaults:{enabled:!1,container:null,margin:60,speed:300},interaction:null,i:null,x:0,y:0,isScrolling:!1,prevTime:0,start:function(e){c.isScrolling=!0,r.cancel(c.i),c.interaction=e,c.prevTime=(new Date).getTime(),c.i=r.request(c.scroll)},stop:function(){c.isScrolling=!1,r.cancel(c.i)},scroll:function(){var e=c.interaction.target.options[c.interaction.prepared.name].autoScroll,t=e.container||i(c.interaction.element),n=(new Date).getTime(),s=(n-c.prevTime)/1e3,a=e.speed*s;a>=1&&(o.window(t)?t.scrollBy(c.x*a,c.y*a):t&&(t.scrollLeft+=c.x*a,t.scrollTop+=c.y*a),c.prevTime=n),c.isScrolling&&(r.cancel(c.i),c.i=r.request(c.scroll))},check:function(e,t){var n=e.options;return n[t].autoScroll&&n[t].autoScroll.enabled},onInteractionMove:function(e){var t=e.interaction,n=e.pointer;if(t.interacting()&&c.check(t.target,t.prepared.name)){if(t.simulation)return void(c.x=c.y=0);var r=void 0,a=void 0,l=void 0,p=void 0,u=t.target.options[t.prepared.name].autoScroll,d=u.container||i(t.element);if(o.window(d))p=n.clientXd.innerWidth-c.margin,l=n.clientY>d.innerHeight-c.margin;else{var f=s.getElementClientRect(d);p=n.clientXf.right-c.margin,l=n.clientY>f.bottom-c.margin}c.x=a?1:p?-1:0,c.y=l?1:r?-1:0,c.isScrolling||(c.margin=u.margin,c.speed=u.speed,c.start(t))}}};a.signals.on("stop-active",function(){c.stop()}),a.signals.on("action-move",c.onInteractionMove),l.perAction.autoScroll=c.defaults,t.exports=c},{"./Interaction":5,"./defaultOptions":18,"./utils/domUtils":39,"./utils/is":46,"./utils/raf":50,"./utils/window":52}],12:[function(e,t,n){"use strict";var r=e("../Interactable"),i=e("../actions/base"),o=e("../utils/is"),s=e("../utils/domUtils");r.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},r.prototype.ignoreFrom=function(e){return this._backCompatOption("ignoreFrom",e)},r.prototype.allowFrom=function(e){return this._backCompatOption("allowFrom",e)},r.prototype.testIgnore=function(e,t,n){return!(!e||!o.element(n))&&(o.string(e)?s.matchesUpTo(n,e,t):!!o.element(e)&&s.nodeContains(e,n))},r.prototype.testAllow=function(e,t,n){return!e||!!o.element(n)&&(o.string(e)?s.matchesUpTo(n,e,t):!!o.element(e)&&s.nodeContains(e,n))},r.prototype.testIgnoreAllow=function(e,t,n){return!this.testIgnore(e.ignoreFrom,t,n)&&this.testAllow(e.allowFrom,t,n)},r.prototype.actionChecker=function(e){return o.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},r.prototype.styleCursor=function(e){return o.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},r.prototype.defaultActionChecker=function(e,t,n,r){for(var o=this.getRect(r),s=null,a=i.names,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var u=p;if((!n.pointerIsDown||!n.mouse||0!=(t.buttons&this.options[u].mouseButtons))&&(s=i[u].checker(e,t,this,r,n,o)))return s}}},{"../Interactable":4,"../actions/base":6,"../utils/domUtils":39,"../utils/is":46}],13:[function(e,t,n){"use strict";function r(e,t,n,r){return g.is.object(e)&&t.testIgnoreAllow(t.options[e.name],n,r)&&t.options[e.name].enabled&&a(t,n,e)?e:null}function i(e,t,n,i,o,s){for(var a=0,l=i.length;a=m.maxInteractions)return!1;if(u.target===e){if((a+=d===n.name|0)>=i)return!1;if(u.element===t&&(l++,d!==n.name||l>=o))return!1}}}return m.maxInteractions>0}}var l=e("../interact"),c=e("../Interactable"),p=e("../Interaction"),u=e("../actions/base"),d=e("../defaultOptions"),f=e("../utils/browser"),v=e("../scope"),g=e("../utils"),h=e("../utils/Signals").new();e("./InteractableMethods");var m={signals:h,withinInteractionLimit:a,maxInteractions:1/0,defaults:{perAction:{manualStart:!1,max:1/0,maxPerElement:1,allowFrom:null,ignoreFrom:null}},setActionDefaults:function(e){g.extend(e.defaults,m.defaults.perAction)}};p.signals.on("down",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;if(!t.interacting()){s(t,o(t,n,r,i))}}),p.signals.on("move",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;if(t.mouse&&!t.pointerIsDown&&!t.interacting()){s(t,o(t,n,r,i))}}),p.signals.on("move",function(e){var t=e.interaction,n=e.event;if(t.pointerIsDown&&!t.interacting()&&t.pointerWasMoved&&t.prepared.name){h.fire("before-start",e);var r=t.target;t.prepared.name&&r&&(r.options[t.prepared.name].manualStart||!a(r,t.element,t.prepared)?t.stop(n):t.start(t.prepared,r,t.element))}}),p.signals.on("stop",function(e){var t=e.interaction,n=t.target;n&&n.options.styleCursor&&(n._doc.documentElement.style.cursor="")}),c.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},c.prototype.actionChecker=function(e){return g.is.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},c.prototype.styleCursor=function(e){return g.is.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},c.prototype.defaultActionChecker=function(e,t,n,r){for(var i=this.getRect(r),o=t.buttons||{0:1,1:4,3:8,4:16}[t.button],s=null,a=u.names,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var d=p;if((!n.pointerIsDown||!n.mouse||0!=(o&this.options[d].mouseButtons))&&(s=u[d].checker(e,t,this,r,n,i)))return s}},l.maxInteractions=function(e){return g.is.number(e)?(m.maxInteractions=e,this):m.maxInteractions},c.settingsMethods.push("styleCursor"),c.settingsMethods.push("actionChecker"),c.settingsMethods.push("ignoreFrom"),c.settingsMethods.push("allowFrom"),d.base.actionChecker=null,d.base.styleCursor=!0,g.extend(d.perAction,m.defaults.perAction),t.exports=m},{"../Interactable":4,"../Interaction":5,"../actions/base":6,"../defaultOptions":18,"../interact":21,"../scope":34,"../utils":44,"../utils/Signals":35,"../utils/browser":37,"./InteractableMethods":12}],14:[function(e,t,n){"use strict";var r=e("./base"),i=e("../Interaction");i.signals.on("new",function(e){e.delayTimer=null}),r.signals.on("prepared",function(e){var t=e.interaction,n=t.prepared.name;if(n){var r=t.target.options[n].delay;r>0&&(t.delayTimer=setTimeout(function(){t.start(t.prepared,t.target,t.element)},r))}}),i.signals.on("move",function(e){var t=e.interaction,n=e.duplicate;t.pointerWasMoved&&!n&&clearTimeout(t.delayTimer)}),r.signals.on("before-start",function(e){var t=e.interaction,n=t.prepared.name;if(n){t.target.options[n].delay>0&&(t.prepared.name=null)}})},{"../Interaction":5,"./base":13}],15:[function(e,t,n){"use strict";function r(e,t){if(!t)return!1;var n=t.options.drag.startAxis;return"xy"===e||"xy"===n||n===e}var i=e("./base"),o=e("../scope"),s=e("../utils/browser"),a=e("../utils/is"),l=e("../utils/domUtils"),c=l.matchesSelector,p=l.parentNode;i.setActionDefaults(e("../actions/drag")),i.signals.on("before-start",function(e){var t=e.interaction,n=e.eventTarget,l=e.dx,u=e.dy;if("drag"===t.prepared.name){var d=Math.abs(l),f=Math.abs(u),v=t.target.options.drag,g=v.startAxis,h=d>f?"x":dl.minSpeed&&g>l.endSpeed,b={interaction:t,pageCoords:v,statuses:f,preEnd:!0,requireEndOnly:!0};y&&!x&&(c.resetStatuses(f),m=c.setAll(b),m.shouldMove&&m.locked&&(h=!0)),(x||h)&&(p.copyCoords(i.upCoords,t.curCoords),t.pointers[0]=i.startEvent=new a(t,n,t.prepared.name,"inertiastart",t.element),i.t0=d,i.active=!0,i.allowResume=l.allowResume,t.simulation=i,o.fire(i.startEvent),x?(i.vx0=t.pointerDelta.client.vx,i.vy0=t.pointerDelta.client.vy,i.v0=g,r(t,i),p.extend(v,t.curCoords.page),v.x+=i.xe,v.y+=i.ye,c.resetStatuses(f),m=c.setAll(b),i.modifiedXe+=m.dx,i.modifiedYe+=m.dy,i.i=u.request(t.boundInertiaFrame)):(i.smoothEnd=!0,i.xe=m.dx,i.ye=m.dy,i.sx=i.sy=0,i.i=u.request(t.boundSmoothEndFrame)))}}),l.signals.on("stop-active",function(e){var t=e.interaction,n=t.inertiaStatus;n.active&&(u.cancel(n.i),n.active=!1,t.simulation=null)})},{"./InteractEvent":3,"./Interaction":5,"./modifiers":24,"./utils":44,"./utils/raf":50}],21:[function(e,t,n){"use strict";function r(e,t){var n=a.interactables.get(e,t);return n||(n=new l(e,t),n.events.global=p),n}var i=e("./utils/browser"),o=e("./utils/events"),s=e("./utils"),a=e("./scope"),l=e("./Interactable"),c=e("./Interaction"),p={};r.isSet=function(e,t){return-1!==a.interactables.indexOfElement(e,t&&t.context)},r.on=function(e,t,n){if(s.is.string(e)&&-1!==e.search(" ")&&(e=e.trim().split(/ +/)),s.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.on(f,t,n)}return r}if(s.is.object(e)){for(var v in e)r.on(v,e[v],t);return r}return s.contains(l.eventTypes,e)?p[e]?p[e].push(t):p[e]=[t]:o.add(a.document,e,t,{options:n}),r},r.off=function(e,t,n){if(s.is.string(e)&&-1!==e.search(" ")&&(e=e.trim().split(/ +/)),s.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.off(f,t,n)}return r}if(s.is.object(e)){for(var v in e)r.off(v,e[v],t);return r}if(s.contains(l.eventTypes,e)){var g=void 0;e in p&&-1!==(g=s.indexOf(p[e],t))&&p[e].splice(g,1)}else o.remove(a.document,e,t,n);return r},r.debug=function(){return a},r.getPointerAverage=s.pointerAverage,r.getTouchBBox=s.touchBBox,r.getTouchDistance=s.touchDistance,r.getTouchAngle=s.touchAngle,r.getElementRect=s.getElementRect,r.getElementClientRect=s.getElementClientRect,r.matchesSelector=s.matchesSelector,r.closest=s.closest,r.supportsTouch=function(){return i.supportsTouch},r.supportsPointerEvent=function(){return i.supportsPointerEvent},r.stop=function(e){for(var t=a.interactions.length-1;t>=0;t--)a.interactions[t].stop(e);return r},r.pointerMoveTolerance=function(e){return s.is.number(e)?(c.pointerMoveTolerance=e,this):c.pointerMoveTolerance},r.addDocument=a.addDocument,r.removeDocument=a.removeDocument,a.interact=r,t.exports=r},{"./Interactable":4,"./Interaction":5,"./scope":34,"./utils":44,"./utils/browser":37,"./utils/events":40}],22:[function(e,t,n){"use strict";function r(e){var t=e.interaction,n=e.event;t.target&&t.target.checkAndPreventDefault(n)}var i=e("./Interactable"),o=e("./Interaction"),s=e("./scope"),a=e("./utils/is"),l=e("./utils/events"),c=e("./utils/domUtils"),p=c.nodeContains,u=c.matchesSelector;i.prototype.preventDefault=function(e){return/^(always|never|auto)$/.test(e)?(this.options.preventDefault=e,this):a.bool(e)?(this.options.preventDefault=e?"always":"never",this):this.options.preventDefault},i.prototype.checkAndPreventDefault=function(e){var t=this.options.preventDefault;if("never"!==t)return"always"===t?void e.preventDefault():void(l.supportsOptions||/^(mouse|pointer|touch)*(down|start)/i.test(e.type)||a.element(e.target)&&u(e.target,"input,select,textarea,[contenteditable=true],[contenteditable=true] *")||e.preventDefault())};for(var d=["down","move","up","cancel"],f=0;f=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i;if(o.element&&(o.element===e.target||p(o.element,e.target)))return void o.target.checkAndPreventDefault(e)}}},{"./Interactable":4,"./Interaction":5,"./scope":34,"./utils/domUtils":39,"./utils/events":40,"./utils/is":46}],23:[function(e,t,n){"use strict";function r(e){var t=e.target,n=a.search(e,e.type,t);n&&n.prevTap&&e.clientX===n.prevTap.clientX&&e.clientY===n.prevTap.clientY&&t===n.prevTap.target&&(n.downTargets[0]=t,n.downTimes[0]=(new Date).getTime(),l.fire({interaction:n,event:e,eventTarget:t,pointer:e,type:"tap"}))}var i=e("./scope"),o=e("./utils/events"),s=e("./utils/browser"),a=e("./utils/interactionFinder"),l=e("./pointerEvents/base"),c=e("./utils/window"),p=c.window,u=Object.prototype.toString;if(p.Array.isArray||(p.Array.isArray=function(e){return"[object Array]"===u.call(e)}),String.prototype.trim||(String.prototype.trim=function(){return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")}),s.isIE8){var d=function(e){for(var t=i.interactions,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var o;if(n){if(r>=t.length)break;o=t[r++]}else{if(r=t.next(),r.done)break;o=r.value}var s=o;s.interacting()&&s.target.checkAndPreventDefault(e)}},f=function(e,t){var n=e.doc,i=(e.win,0===t.indexOf("listen")?o.add:o.remove);i(n,"selectstart",d),l&&i(n,"dblclick",r)};i.signals.on("add-document",f),i.signals.on("remove-document",f)}t.exports=null},{"./pointerEvents/base":31,"./scope":34,"./utils/browser":37,"./utils/events":40,"./utils/interactionFinder":45,"./utils/window":52}],24:[function(e,t,n){"use strict";function r(e,t,n){return e&&e.enabled&&(t||!e.endOnly)&&(!n||e.endOnly)}var i=e("../InteractEvent"),o=e("../Interaction"),s=e("../utils/extend"),a={names:[],setOffsets:function(e){var t=e.interaction,n=e.pageCoords,r=t.target,i=t.element,o=t.startOffset,s=r.getRect(i);s?(o.left=n.x-s.left,o.top=n.y-s.top,o.right=s.right-n.x,o.bottom=s.bottom-n.y,"width"in s||(s.width=s.right-s.left),"height"in s||(s.height=s.bottom-s.top)):o.left=o.top=o.right=o.bottom=0,e.rect=s,e.interactable=r,e.element=i;for(var l=0;l=p.length)break;f=p[d++]}else{if(d=p.next(),d.done)break;f=d.value}var v=f,g=a[v],h=t.target.options[t.prepared.name][v];r(h,i,o)&&(e.status=e.status=n[v],e.options=h,e.offset=e.interaction.modifierOffsets[v],g.set(e),e.status.locked&&(l.x+=e.status.dx,l.y+=e.status.dy,c.dx+=e.status.dx,c.dy+=e.status.dy,c.locked=!0))}return c.shouldMove=!e.status||!c.locked||e.status.changed,c},resetStatuses:function(e){for(var t=a.names,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var i;if(n){if(r>=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i,s=e[o]||{};s.dx=s.dy=0,s.modifiedX=s.modifiedY=NaN,s.locked=!1,s.changed=!0,e[o]=s}return e},start:function(e,t){var n=e.interaction,r={interaction:n,pageCoords:("action-resume"===t?n.curCoords:n.startCoords).page,startOffset:n.startOffset,statuses:n.modifierStatuses,preEnd:!1,requireEndOnly:!1};a.setOffsets(r),a.resetStatuses(r.statuses),r.pageCoords=s({},n.startCoords.page),n.modifierResult=a.setAll(r)}};o.signals.on("new",function(e){e.startOffset={left:0,right:0,top:0,bottom:0},e.modifierOffsets={},e.modifierStatuses=a.resetStatuses({}),e.modifierResult=null}),o.signals.on("action-start",a.start),o.signals.on("action-resume",a.start),o.signals.on("before-action-move",function(e){var t=e.interaction,n=e.preEnd,r=e.interactingBeforeMove,i=a.setAll({interaction:t,preEnd:n,pageCoords:t.curCoords.page,statuses:t.modifierStatuses,requireEndOnly:!1});!i.shouldMove&&r&&(t._dontFireMove=!0),t.modifierResult=i}),o.signals.on("action-end",function(e){for(var t=e.interaction,n=e.event,i=0;i=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}var m=h,y=m.x,x=m.y;l.push({x:s.left-i.width*y+u.x,y:s.top-i.height*x+u.y})}else l.push(u);return l},set:function(e){var t=e.interaction,n=e.pageCoords,r=e.status,i=e.options,s=e.offset,a=[],l=void 0,c=void 0,p=void 0;if(r.useStatusXY)c={x:r.x,y:r.y};else{var u=o.getOriginXY(t.target,t.element,t.prepared.name);c=o.extend({},n),c.x-=u.x,c.y-=u.y}r.realX=c.x,r.realY=c.y;for(var d=i.targets?i.targets.length:0,f=s,v=Array.isArray(f),g=0,f=v?f:f[Symbol.iterator]();;){var h;if(v){if(g>=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}for(var m=h,y=m.x,x=m.y,b=c.x-y,w=c.y-x,E=i.targets,S=Array.isArray(E),T=0,E=S?E:E[Symbol.iterator]();;){var C;if(S){if(T>=E.length)break;C=E[T++]}else{if(T=E.next(),T.done)break;C=T.value}var A=C;l=o.is.function(A)?A(b,w,t):A,l&&a.push({x:o.is.number(l.x)?l.x+y:b,y:o.is.number(l.y)?l.y+x:w,range:o.is.number(l.range)?l.range:i.range})}}var D={target:null,inRange:!1,distance:0,range:0,dx:0,dy:0};for(p=0,d=a.length;p=p.length)break;f=p[d++]}else{if(d=p.next(),d.done)break;f=d.value}var v=f,g=void 0;g=a.is.function(v)?v(l,c,t):v,g&&("width"in g&&"height"in g&&(g.x=g.width,g.y=g.height),e.options.targets.push(g))}i.set(e)},modifyCoords:function(e){var t=e.options;e.options=a.extend({},t), -e.options.enabled=t.enabled,e.options.relativePoints=[null],i.modifyCoords(e)}};r.snapSize=l,r.names.push("snapSize"),o.perAction.snapSize=l.defaults,s.defaults.snapSize=l.defaults,t.exports=l},{"../actions/resize":10,"../defaultOptions":18,"../utils/":44,"./index":24,"./snap":28}],30:[function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=e("../utils/pointerUtils");t.exports=function(){function e(t,n,o,s,a){if(r(this,e),i.pointerExtend(this,o),o!==n&&i.pointerExtend(this,n),this.interaction=a,this.timeStamp=(new Date).getTime(),this.originalEvent=o,this.type=t,this.pointerId=i.getPointerId(n),this.pointerType=i.getPointerType(n,a),this.target=s,this.currentTarget=null,"tap"===t){var l=a.getPointerIndex(n);this.dt=this.timeStamp-a.downTimes[l];var c=this.timeStamp-a.tapTime;this.double=!!(a.prevTap&&"doubletap"!==a.prevTap.type&&a.prevTap.target===this.target&&c<500)}else"doubletap"===t&&(this.dt=n.timeStamp-a.tapTime)}return e.prototype.subtractOrigin=function(e){var t=e.x,n=e.y;return this.pageX-=t,this.pageY-=n,this.clientX-=t,this.clientY-=n,this},e.prototype.addOrigin=function(e){var t=e.x,n=e.y;return this.pageX+=t,this.pageY+=n,this.clientX+=t,this.clientY+=n,this},e.prototype.preventDefault=function(){this.originalEvent.preventDefault()},e.prototype.stopPropagation=function(){this.propagationStopped=!0},e.prototype.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},e}()},{"../utils/pointerUtils":49}],31:[function(e,t,n){"use strict";function r(e){for(var t=e.interaction,n=e.pointer,s=e.event,l=e.eventTarget,c=e.type,u=void 0===c?e.pointerEvent.type:c,d=e.targets,f=void 0===d?i(e):d,v=e.pointerEvent,g=void 0===v?new o(u,n,s,l,t):v,h={interaction:t,pointer:n,event:s,eventTarget:l,targets:f,type:u,pointerEvent:g},m=0;m=u.length)break;g=u[v++]}else{if(v=u.next(),v.done)break;g=v.value}var h=g;c.element=h,p.fire("collect-targets",c)}return"hold"===o&&(c.targets=d(c.targets,function(e){return e.eventable.options.holdDuration===t.holdTimers[s].duration})),c.targets}var o=e("./PointerEvent"),s=e("../Interaction"),a=e("../utils"),l=e("../utils/browser"),c=e("../defaultOptions"),p=e("../utils/Signals").new(),u=e("../utils/arr"),d=u.filter,f=["down","up","cancel"],v=["down","up","cancel"],g={PointerEvent:o,fire:r,collectEventTargets:i,signals:p,defaults:{holdDuration:600,ignoreFrom:null,allowFrom:null,origin:{x:0,y:0}},types:["down","move","up","cancel","tap","doubletap","hold"]};s.signals.on("update-pointer-down",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers[n]={duration:1/0,timeout:null}}),s.signals.on("remove-pointer",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers.splice(n,1)}),s.signals.on("move",function(e){var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,s=e.duplicateMove,a=t.getPointerIndex(n);s||t.pointerIsDown&&!t.pointerWasMoved||(t.pointerIsDown&&clearTimeout(t.holdTimers[a].timeout),r({interaction:t,pointer:n,event:i,eventTarget:o,type:"move"}))}),s.signals.on("down",function(e){for(var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,s=e.pointerIndex,c=l.isIE8?a.extend({},i):i,u=t.holdTimers[s],d=a.getPath(o),f={interaction:t,pointer:n,event:i,eventTarget:o,type:"hold",targets:[],path:d,element:null},v=d,g=Array.isArray(v),h=0,v=g?v:v[Symbol.iterator]();;){var m;if(g){if(h>=v.length)break;m=v[h++]}else{if(h=v.next(),h.done)break;m=h.value}var y=m;f.element=y,p.fire("collect-targets",f)}if(f.targets.length){for(var x=1/0,b=0;b=0&&(p.selectors[u]!==e||p.contexts[u]!==t);u--);-1===u&&(u=p.selectors.length,p.selectors.push(e),p.contexts.push(t),p.listeners.push([])),p.listeners[u].push([i,!!s.capture,s.passive])}function s(e,t,n,r,o){var s=f(o),c=O[n],p=!1,u=void 0;if(c)for(u=c.selectors.length-1;u>=0;u--)if(c.selectors[u]===e&&c.contexts[u]===t){for(var d=c.listeners[u],v=d.length-1;v>=0;v--){var g=d[v],h=g[0],m=g[1],y=g[2];if(h===r&&m===!!s.capture&&y===s.passive){d.splice(v,1),d.length||(c.selectors.splice(u,1),c.contexts.splice(u,1),c.listeners.splice(u,1),i(t,n,a),i(t,n,l,!0),c.selectors.length||(O[n]=null)),p=!0;break}}if(p)break}}function a(e,t){var n=f(t),r={},i=O[e.type],o=g.getActualElement(e.path?e.path[0]:e.target),s=o;for(h(r,e),r.originalEvent=e,r.preventDefault=p;v.element(s);){for(var a=0;a=l.length)break;u=l[p++]}else{if(p=l.next(),p.done)break;u=p.value}var d=u,f=s[d](a);if(f)return f}},simulationResume:function(e){var t=e.mouseEvent,n=e.eventType,o=e.eventTarget;if(!/down|start/i.test(n))return null;for(var s=r.interactions,a=Array.isArray(s),l=0,s=a?s:s[Symbol.iterator]();;){var c;if(a){if(l>=s.length)break;c=s[l++]}else{if(l=s.next(),l.done)break;c=l.value}var p=c,u=o;if(p.simulation&&p.simulation.allowResume&&p.mouse===t)for(;u;){if(u===p.element)return p;u=i.parentNode(u)}}return null},mouse:function(e){var t=e.pointerId,n=e.mouseEvent,s=e.eventType;if(!n&&(o.supportsTouch||o.supportsPointerEvent))return null;for(var a=void 0,l=r.interactions,c=Array.isArray(l),p=0,l=c?l:l[Symbol.iterator]();;){var u;if(c){if(p>=l.length)break;u=l[p++]}else{if(p=l.next(),p.done)break;u=p.value}var d=u;if(d.mouse){if(d.simulation&&!i.contains(d.pointerIds,t))continue;if(d.interacting())return d;a||(a=d)}}if(a)return a;for(var f=r.interactions,v=Array.isArray(f),g=0,f=v?f:f[Symbol.iterator]();;){var h;if(v){if(g>=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}var m=h;if(m.mouse&&(!/down/.test(s)||!m.simulation))return m}return null},hasPointer:function(e){for(var t=e.pointerId,n=r.interactions,o=Array.isArray(n),s=0,n=o?n:n[Symbol.iterator]();;){var a;if(o){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var l=a;if(i.contains(l.pointerIds,t))return l}},idle:function(e){for(var t=e.mouseEvent,n=r.interactions,i=Array.isArray(n),o=0,n=i?n:n[Symbol.iterator]();;){var s;if(i){if(o>=n.length)break;s=n[o++]}else{if(o=n.next(),o.done)break;s=o.value}var a=s;if(1===a.pointerIds.length){var l=a.target;if(l&&!l.options.gesture.enabled)continue}else if(a.pointerIds.length>=2)continue;if(!a.interacting()&&t===a.mouse)return a}return null}};t.exports=s},{"../scope":34,"./browser":37,"./index":44}],46:[function(e,t,n){"use strict";var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},i=e("./window"),o=e("./isWindow"),s={array:function(){},window:function(e){return e===i.window||o(e)},docFrag:function(e){return s.object(e)&&11===e.nodeType},object:function(e){return!!e&&"object"===(void 0===e?"undefined":r(e))},function:function(e){return"function"==typeof e},number:function(e){return"number"==typeof e},bool:function(e){return"boolean"==typeof e},string:function(e){return"string"==typeof e},element:function(e){if(!e||"object"!==(void 0===e?"undefined":r(e)))return!1;var t=i.getWindow(e)||i.window;return/object|function/.test(r(t.Element))?e instanceof t.Element:1===e.nodeType&&"string"==typeof e.nodeName}};s.array=function(e){return s.object(e)&&void 0!==e.length&&s.function(e.splice)},t.exports=s},{"./isWindow":47,"./window":52}],47:[function(e,t,n){"use strict";t.exports=function(e){return!(!e||!e.Window)&&e instanceof e.Window}},{}],48:[function(e,t,n){"use strict";function r(e,n){for(var r in n){var i=t.exports.prefixedPropREs,o=!1;for(var s in i)if(0===r.indexOf(s)&&i[s].test(r)){o=!0;break}o||"function"==typeof n[r]||(e[r]=n[r])}return e}r.prefixedPropREs={webkit:/(Movement[XY]|Radius[XY]|RotationAngle|Force)$/},t.exports=r},{}],49:[function(e,t,n){"use strict";var r=e("./hypot"),i=e("./browser"),o=e("./domObjects"),s=e("./domUtils"),a=e("./is"),l=e("./pointerExtend"),c={copyCoords:function(e,t){e.page=e.page||{},e.page.x=t.page.x,e.page.y=t.page.y,e.client=e.client||{},e.client.x=t.client.x,e.client.y=t.client.y,e.timeStamp=t.timeStamp},setCoordDeltas:function(e,t,n){e.page.x=n.page.x-t.page.x,e.page.y=n.page.y-t.page.y,e.client.x=n.client.x-t.client.x,e.client.y=n.client.y-t.client.y,e.timeStamp=n.timeStamp-t.timeStamp;var i=Math.max(e.timeStamp/1e3,.001);e.page.speed=r(e.page.x,e.page.y)/i,e.page.vx=e.page.x/i,e.page.vy=e.page.y/i,e.client.speed=r(e.client.x,e.page.y)/i,e.client.vx=e.client.x/i,e.client.vy=e.client.y/i},isNativePointer:function(e){return e instanceof o.Event||e instanceof o.Touch},getXY:function(e,t,n){return n=n||{},e=e||"page",n.x=t[e+"X"],n.y=t[e+"Y"],n},getPageXY:function(e,t){return t=t||{},i.isOperaMobile&&c.isNativePointer(e)?(c.getXY("screen",e,t),t.x+=window.scrollX,t.y+=window.scrollY):c.getXY("page",e,t),t},getClientXY:function(e,t){return t=t||{},i.isOperaMobile&&c.isNativePointer(e)?c.getXY("screen",e,t):c.getXY("client",e,t),t},getPointerId:function(e){return a.number(e.pointerId)?e.pointerId:e.identifier},setCoords:function(e,t,n){var r=t.length>1?c.pointerAverage(t):t[0],i={};c.getPageXY(r,i),e.page.x=i.x,e.page.y=i.y,c.getClientXY(r,i),e.client.x=i.x,e.client.y=i.y,e.timeStamp=a.number(n)?n:(new Date).getTime()},pointerExtend:l,getTouchPair:function(e){var t=[];return a.array(e)?(t[0]=e[0],t[1]=e[1]):"touchend"===e.type?1===e.touches.length?(t[0]=e.touches[0],t[1]=e.changedTouches[0]):0===e.touches.length&&(t[0]=e.changedTouches[0],t[1]=e.changedTouches[1]):(t[0]=e.touches[0],t[1]=e.touches[1]),t},pointerAverage:function(e){for(var t={pageX:0,pageY:0,clientX:0,clientY:0,screenX:0,screenY:0},n=e,r=Array.isArray(n),i=0,n=r?n:n[Symbol.iterator]();;){var o;if(r){if(i>=n.length)break;o=n[i++]}else{if(i=n.next(),i.done)break;o=i.value}var s=o;for(var a in t)t[a]+=s[a]}for(var l in t)t[l]/=e.length;return t},touchBBox:function(e){if(e.length||e.touches&&e.touches.length>1){var t=c.getTouchPair(e),n=Math.min(t[0].pageX,t[1].pageX),r=Math.min(t[0].pageY,t[1].pageY);return{x:n,y:r,left:n,top:r,width:Math.max(t[0].pageX,t[1].pageX)-n,height:Math.max(t[0].pageY,t[1].pageY)-r}}},touchDistance:function(e,t){var n=t+"X",i=t+"Y",o=c.getTouchPair(e),s=o[0][n]-o[1][n],a=o[0][i]-o[1][i];return r(s,a)},touchAngle:function(e,t,n){var r=n+"X",i=n+"Y",o=c.getTouchPair(e),s=o[1][r]-o[0][r],a=o[1][i]-o[0][i];return 180*Math.atan2(a,s)/Math.PI},getPointerType:function(e,t){return t.mouse?"mouse":i.supportsPointerEvent?a.string(e.pointerType)?e.pointerType:[void 0,void 0,"touch","pen","mouse"][e.pointerType]:"touch"},getEventTargets:function(e){return[s.getActualElement(e.path?e.path[0]:e.target),s.getActualElement(e.currentTarget)]}};t.exports=c},{"./browser":37,"./domObjects":38,"./domUtils":39,"./hypot":43,"./is":46,"./pointerExtend":48}],50:[function(e,t,n){"use strict";for(var r=e("./window"),i=r.window,o=["ms","moz","webkit","o"],s=0,a=void 0,l=void 0,c=0;c6&&void 0!==arguments[6]&&arguments[6];r(this,e);var f=t.target,v=(f&&f.options||s).deltaSource,g=o(f,p,l),h="start"===c,m="end"===c,y=h?t.startCoords:t.curCoords,x=t.prevEvent;p=p||t.element;var b=i({},y.page),w=i({},y.client);b.x-=g.x,b.y-=g.y,w.x-=g.x,w.y-=g.y,this.ctrlKey=n.ctrlKey,this.altKey=n.altKey,this.shiftKey=n.shiftKey,this.metaKey=n.metaKey,this.button=n.button,this.buttons=n.buttons,this.target=p,this.currentTarget=p,this.relatedTarget=u||null,this.preEnd=d,this.type=l+(c||""),this.interaction=t,this.interactable=f,this.t0=h?t.downTimes[t.downTimes.length-1]:x.t0;var E={interaction:t,event:n,action:l,phase:c,element:p,related:u,page:b,client:w,coords:y,starting:h,ending:m,deltaSource:v,iEvent:this};a.fire("set-xy",E),m?(this.pageX=x.pageX,this.pageY=x.pageY,this.clientX=x.clientX,this.clientY=x.clientY):(this.pageX=b.x,this.pageY=b.y,this.clientX=w.x,this.clientY=w.y),this.x0=t.startCoords.page.x-g.x,this.y0=t.startCoords.page.y-g.y,this.clientX0=t.startCoords.client.x-g.x,this.clientY0=t.startCoords.client.y-g.y,a.fire("set-delta",E),this.timeStamp=y.timeStamp,this.dt=t.pointerDelta.timeStamp,this.duration=this.timeStamp-this.t0,this.speed=t.pointerDelta[v].speed,this.velocityX=t.pointerDelta[v].vx,this.velocityY=t.pointerDelta[v].vy,this.swipe=m||"inertiastart"===c?this.getSwipe():null,a.fire("new",E)}return e.prototype.getSwipe=function(){var e=this.interaction;if(e.prevEvent.speed<600||this.timeStamp-e.prevEvent.timeStamp>150)return null;var t=180*Math.atan2(e.prevEvent.velocityY,e.prevEvent.velocityX)/Math.PI;t<0&&(t+=360);var n=112.5<=t&&t<247.5,r=202.5<=t&&t<337.5,i=!n&&(292.5<=t||t<67.5);return{up:r,down:!r&&22.5<=t&&t<157.5,left:n,right:i,angle:t,speed:e.prevEvent.speed,velocity:{x:e.prevEvent.velocityX,y:e.prevEvent.velocityY}}},e.prototype.preventDefault=function(){},e.prototype.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},e.prototype.stopPropagation=function(){this.propagationStopped=!0},e}();a.on("set-delta",function(e){var t=e.iEvent,n=e.interaction,r=e.starting,i=e.deltaSource,o=r?t:n.prevEvent;"client"===i?(t.dx=t.clientX-o.clientX,t.dy=t.clientY-o.clientY):(t.dx=t.pageX-o.pageX,t.dy=t.pageY-o.pageY)}),l.signals=a,t.exports=l},{"./defaultOptions":18,"./utils/Signals":35,"./utils/extend":41,"./utils/getOriginXY":42}],4:[function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=e("./utils/is"),o=e("./utils/events"),s=e("./utils/extend"),a=e("./actions/base"),l=e("./scope"),c=e("./Eventable"),p=e("./defaultOptions"),u=e("./utils/Signals").new(),d=e("./utils/domUtils"),f=d.getElementRect,v=d.nodeContains,g=d.trySelector,h=e("./utils/window"),m=h.getWindow,y=e("./utils/arr"),x=y.indexOf,b=y.contains,w=e("./utils/browser"),E=w.wheelEvent;l.interactables=[];var S=function(){function e(t,n){r(this,e),n=n||{},this.target=t,this.events=new c,this._context=n.context||l.document,this._win=m(g(t)?this._context:t),this._doc=this._win.document,u.fire("new",{target:t,options:n,interactable:this,win:this._win}),l.addDocument(this._doc,this._win),l.interactables.push(this),this.set(n)}return e.prototype.setOnEvents=function(e,t){var n="on"+e;return i.function(t.onstart)&&(this.events[n+"start"]=t.onstart),i.function(t.onmove)&&(this.events[n+"move"]=t.onmove),i.function(t.onend)&&(this.events[n+"end"]=t.onend),i.function(t.oninertiastart)&&(this.events[n+"inertiastart"]=t.oninertiastart),this},e.prototype.setPerAction=function(e,t){for(var n in t)n in p[e]&&(i.object(t[n])?(this.options[e][n]=s(this.options[e][n]||{},t[n]),i.object(p.perAction[n])&&"enabled"in p.perAction[n]&&(this.options[e][n].enabled=!1!==t[n].enabled)):i.bool(t[n])&&i.object(p.perAction[n])?this.options[e][n].enabled=t[n]:void 0!==t[n]&&(this.options[e][n]=t[n]))},e.prototype.getRect=function(e){return e=e||this.target,i.string(this.target)&&!i.element(e)&&(e=this._context.querySelector(this.target)),f(e)},e.prototype.rectChecker=function(e){return i.function(e)?(this.getRect=e,this):null===e?(delete this.options.getRect,this):this.getRect},e.prototype._backCompatOption=function(e,t){if(g(t)||i.object(t)){this.options[e]=t;for(var n=a.names,r=Array.isArray(n),o=0,n=r?n:n[Symbol.iterator]();;){var s;if(r){if(o>=n.length)break;s=n[o++]}else{if(o=n.next(),o.done)break;s=o.value}var l=s;this.options[l][e]=t}return this}return this.options[e]},e.prototype.origin=function(e){return this._backCompatOption("origin",e)},e.prototype.deltaSource=function(e){return"page"===e||"client"===e?(this.options.deltaSource=e,this):this.options.deltaSource},e.prototype.context=function(){return this._context},e.prototype.inContext=function(e){return this._context===e.ownerDocument||v(this._context,e)},e.prototype.fire=function(e){return this.events.fire(e),this},e.prototype._onOffMultiple=function(e,t,n,r){if(i.string(t)&&-1!==t.search(" ")&&(t=t.trim().split(/ +/)),i.array(t)){for(var o=0;o=l.length)break;f=l[d++]}else{if(d=l.next(),d.done)break;f=d.value}var v=f;this.options[v]=p.base[v],v in t&&this[v](t[v])}return u.fire("set",{options:t,interactable:this}),this},e.prototype.unset=function(){if(o.remove(this.target,"all"),i.string(this.target))for(var e in o.delegatedEvents){var t=o.delegatedEvents[e];t.selectors[0]===this.target&&t.contexts[0]===this._context&&(t.selectors.splice(0,1),t.contexts.splice(0,1),t.listeners.splice(0,1),t.selectors.length||(t[e]=null)),o.remove(this._context,e,o.delegateListener),o.remove(this._context,e,o.delegateUseCapture,!0)}else o.remove(this,"all");u.fire("unset",{interactable:this}),l.interactables.splice(x(l.interactables,this),1);for(var n=l.interactions||[],r=Array.isArray(n),s=0,n=r?n:n[Symbol.iterator]();;){var a;if(r){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var c=a;c.target===this&&c.interacting()&&c.stop()}return l.interact},e}();l.interactables.indexOfElement=function(e,t){t=t||l.document;for(var n=0;n=x.length)break;E=x[w++]}else{if(w=x.next(),w.done)break;E=w.value}var S=E,T=S[0],C=S[1];C._updateEventTargets(i,o),C[e](T,t,i,o)}}}function o(e){for(var t=0;te.pointerMoveTolerance);var a={pointer:t,pointerIndex:this.getPointerIndex(t),event:n,eventTarget:r,dx:o,dy:s,duplicate:i,interaction:this,interactingBeforeMove:this.interacting()};i||l.setCoordDeltas(this.pointerDelta,this.prevCoords,this.curCoords),f.fire("move",a),i||(this.interacting()&&this.doMove(a),this.pointerWasMoved&&l.copyCoords(this.prevCoords,this.curCoords))},e.prototype.doMove=function(e){e=l.extend({pointer:this.pointers[0],event:this.prevEvent,eventTarget:this._eventTarget,interaction:this},e||{}),f.fire("before-action-move",e),this._dontFireMove||f.fire("action-move",e),this._dontFireMove=!1},e.prototype.pointerUp=function(e,t,n,r){var i=this.getPointerIndex(e);f.fire(/cancel$/i.test(t.type)?"cancel":"up",{pointer:e,pointerIndex:i,event:t,eventTarget:n,curEventTarget:r,interaction:this}),this.simulation||this.end(t),this.pointerIsDown=!1,this.removePointer(e,t)},e.prototype.end=function(e){e=e||this.prevEvent,this.interacting()&&f.fire("action-end",{event:e,interaction:this}),this.stop()},e.prototype.currentAction=function(){return this._interacting?this.prepared.name:null},e.prototype.interacting=function(){return this._interacting},e.prototype.stop=function(){f.fire("stop",{interaction:this}),this._interacting&&(f.fire("stop-active",{interaction:this}),f.fire("stop-"+this.prepared.name,{interaction:this})),this.target=this.element=null,this._interacting=!1,this.prepared.name=this.prevEvent=null},e.prototype.getPointerIndex=function(e){return"mouse"===this.pointerType||"pen"===this.pointerType?0:l.indexOf(this.pointerIds,l.getPointerId(e))},e.prototype.updatePointer=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:t&&/(down|start)$/i.test(t.type),r=l.getPointerId(e),i=this.getPointerIndex(e);return-1===i&&(i=this.pointerIds.length,this.pointerIds[i]=r),n&&f.fire("update-pointer-down",{pointer:e,event:t,down:n,pointerId:r,pointerIndex:i,interaction:this}),this.pointers[i]=e,i},e.prototype.removePointer=function(e,t){var n=this.getPointerIndex(e);-1!==n&&(f.fire("remove-pointer",{pointer:e,event:t,pointerIndex:n,interaction:this}),this.pointers.splice(n,1),this.pointerIds.splice(n,1),this.downTargets.splice(n,1),this.downTimes.splice(n,1))},e.prototype._updateEventTargets=function(e,t){this._eventTarget=e,this._curEventTarget=t},e}(),y=0,x=g.length;y=i.length)break;a=i[s++]}else{if(s=i.next(),s.done)break;a=s.value}var l=a;if(l.options.drop.enabled){var c=l.options.drop.accept;if(!(p.is.element(c)&&c!==t||p.is.string(c)&&!p.matchesSelector(t,c)))for(var d=p.is.string(l.target)?l._context.querySelectorAll(l.target):[l.target],f=0;fo.left&&c.xo.top&&c.y=o.left&&v<=o.right&&g>=o.top&&g<=o.bottom}if(f&&p.is.number(a)){s=Math.max(0,Math.min(o.right,f.right)-Math.max(o.left,f.left))*Math.max(0,Math.min(o.bottom,f.bottom)-Math.max(o.top,f.top))/(f.width*f.height)>=a}return this.options.drop.checker&&(s=this.options.drop.checker(e,t,s,this,i,n,r)),s},v.signals.on("unset",function(e){e.interactable.dropzone(!1)}),v.settingsMethods.push("dropChecker"),g.signals.on("new",function(e){e.dropTarget=null,e.dropElement=null,e.prevDropTarget=null,e.prevDropElement=null,e.dropEvents=null,e.activeDrops={dropzones:[],elements:[],rects:[]}}),g.signals.on("stop",function(e){var t=e.interaction;t.dropTarget=t.dropElement=t.prevDropTarget=t.prevDropElement=null}),d.dynamicDrop=function(e){return p.is.bool(e)?(y=e,d):y},p.merge(v.eventTypes,["dragenter","dragleave","dropactivate","dropdeactivate","dropmove","drop"]),c.methodDict.drop="dropzone",h.drop=m.defaults,t.exports=m},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../interact":21,"../scope":34,"../utils":44,"./base":6}],9:[function(e,t,n){"use strict";var r=e("./base"),i=e("../utils"),o=e("../InteractEvent"),s=e("../Interactable"),a=e("../Interaction"),l=e("../defaultOptions"),c={defaults:{enabled:!1,origin:null,restrict:null},checker:function(e,t,n,r,i){return i.pointerIds.length>=2?{name:"gesture"}:null},getCursor:function(){return""}};o.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;"gesturestart"===t.type&&(t.ds=0,n.gesture.startDistance=n.gesture.prevDistance=t.distance,n.gesture.startAngle=n.gesture.prevAngle=t.angle,n.gesture.scale=1)}),o.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;"gesturemove"===t.type&&(t.ds=t.scale-n.gesture.scale,n.target.fire(t),n.gesture.prevAngle=t.angle,n.gesture.prevDistance=t.distance,t.scale===1/0||null===t.scale||void 0===t.scale||isNaN(t.scale)||(n.gesture.scale=t.scale))}),s.prototype.gesturable=function(e){return i.is.object(e)?(this.options.gesture.enabled=!1!==e.enabled,this.setPerAction("gesture",e),this.setOnEvents("gesture",e),this):i.is.bool(e)?(this.options.gesture.enabled=e,e||(this.ongesturestart=this.ongesturestart=this.ongestureend=null),this):this.options.gesture},o.signals.on("set-delta",function(e){var t=e.interaction,n=e.iEvent,r=e.action,s=e.event,a=e.starting,l=e.ending,c=e.deltaSource;if("gesture"===r){var p=t.pointers;n.touches=[p[0],p[1]],a?(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=1,n.ds=0,n.angle=i.touchAngle(p,void 0,c),n.da=0):l||s instanceof o?(n.distance=t.prevEvent.distance,n.box=t.prevEvent.box,n.scale=t.prevEvent.scale,n.ds=n.scale-1,n.angle=t.prevEvent.angle,n.da=n.angle-t.gesture.startAngle):(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=n.distance/t.gesture.startDistance,n.angle=i.touchAngle(p,t.gesture.prevAngle,c),n.ds=n.scale-t.gesture.prevScale,n.da=n.angle-t.gesture.prevAngle)}}),a.signals.on("new",function(e){e.gesture={start:{x:0,y:0},startDistance:0,prevDistance:0,distance:0,scale:1,startAngle:0,prevAngle:0}}),r.gesture=c,r.names.push("gesture"),i.merge(s.eventTypes,["gesturestart","gesturemove","gestureend"]),r.methodDict.gesture="gesturable",l.gesture=c.defaults,t.exports=c},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"./base":6}],10:[function(e,t,n){"use strict";function r(e,t,n,r,i,s,a){if(!t)return!1;if(!0===t){var l=o.is.number(s.width)?s.width:s.right-s.left,c=o.is.number(s.height)?s.height:s.bottom-s.top;if(l<0&&("left"===e?e="right":"right"===e&&(e="left")),c<0&&("top"===e?e="bottom":"bottom"===e&&(e="top")),"left"===e)return n.x<(l>=0?s.left:s.right)+a;if("top"===e)return n.y<(c>=0?s.top:s.bottom)+a;if("right"===e)return n.x>(l>=0?s.right:s.left)-a;if("bottom"===e)return n.y>(c>=0?s.bottom:s.top)-a}return!!o.is.element(r)&&(o.is.element(t)?t===r:o.matchesUpTo(r,t,i))}var i=e("./base"),o=e("../utils"),s=e("../utils/browser"),a=e("../InteractEvent"),l=e("../Interactable"),c=e("../Interaction"),p=e("../defaultOptions"),u=s.supportsTouch||s.supportsPointerEvent?20:10,d={defaults:{enabled:!1,mouseButtons:null,origin:null,snap:null,restrict:null,inertia:null,autoScroll:null,square:!1,preserveAspectRatio:!1,axis:"xy",margin:NaN,edges:null,invert:"none"},checker:function(e,t,n,i,s,a){if(!a)return null;var l=o.extend({},s.curCoords.page),c=n.options;if(c.resize.enabled){var p=c.resize,d={left:!1,right:!1,top:!1,bottom:!1};if(o.is.object(p.edges)){for(var f in d)d[f]=r(f,p.edges[f],l,s._eventTarget,i,a,p.margin||u);if(d.left=d.left&&!d.right,d.top=d.top&&!d.bottom,d.left||d.right||d.top||d.bottom)return{name:"resize",edges:d}}else{var v="y"!==c.resize.axis&&l.x>a.right-u,g="x"!==c.resize.axis&&l.y>a.bottom-u;if(v||g)return{name:"resize",axes:(v?"x":"")+(g?"y":"")}}}return null},cursors:s.isIe9OrOlder?{x:"e-resize",y:"s-resize",xy:"se-resize",top:"n-resize",left:"w-resize",bottom:"s-resize",right:"e-resize",topleft:"se-resize",bottomright:"se-resize",topright:"ne-resize",bottomleft:"ne-resize"}:{x:"ew-resize",y:"ns-resize",xy:"nwse-resize",top:"ns-resize",left:"ew-resize",bottom:"ns-resize",right:"ew-resize",topleft:"nwse-resize",bottomright:"nwse-resize",topright:"nesw-resize",bottomleft:"nesw-resize"},getCursor:function(e){if(e.axis)return d.cursors[e.name+e.axis];if(e.edges){for(var t="",n=["top","bottom","left","right"],r=0;r<4;r++)e.edges[n[r]]&&(t+=n[r]);return d.cursors[t]}}};a.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;if("resizestart"===t.type&&n.prepared.edges){var r=n.target.getRect(n.element),i=n.target.options.resize;if(i.square||i.preserveAspectRatio){var s=o.extend({},n.prepared.edges);s.top=s.top||s.left&&!s.bottom,s.left=s.left||s.top&&!s.right,s.bottom=s.bottom||s.right&&!s.top,s.right=s.right||s.bottom&&!s.left,n.prepared._linkedEdges=s}else n.prepared._linkedEdges=null;i.preserveAspectRatio&&(n.resizeStartAspectRatio=r.width/r.height),n.resizeRects={start:r,current:o.extend({},r),inverted:o.extend({},r),previous:o.extend({},r),delta:{left:0,right:0,width:0,top:0,bottom:0,height:0}},t.rect=n.resizeRects.inverted,t.deltaRect=n.resizeRects.delta}}),a.signals.on("new",function(e){var t=e.iEvent,n=e.phase,r=e.interaction;if("move"===n&&r.prepared.edges){var i=r.target.options.resize,s=i.invert,a="reposition"===s||"negate"===s,l=r.prepared.edges,c=r.resizeRects.start,p=r.resizeRects.current,u=r.resizeRects.inverted,d=r.resizeRects.delta,f=o.extend(r.resizeRects.previous,u),v=l,g=t.dx,h=t.dy;if(i.preserveAspectRatio||i.square){var m=i.preserveAspectRatio?r.resizeStartAspectRatio:1;l=r.prepared._linkedEdges,v.left&&v.bottom||v.right&&v.top?h=-g/m:v.left||v.right?h=g/m:(v.top||v.bottom)&&(g=h*m)}if(l.top&&(p.top+=h),l.bottom&&(p.bottom+=h),l.left&&(p.left+=g),l.right&&(p.right+=g),a){if(o.extend(u,p),"reposition"===s){var y=void 0;u.top>u.bottom&&(y=u.top,u.top=u.bottom,u.bottom=y),u.left>u.right&&(y=u.left,u.left=u.right,u.right=y)}}else u.top=Math.min(p.top,c.bottom),u.bottom=Math.max(p.bottom,c.top),u.left=Math.min(p.left,c.right),u.right=Math.max(p.right,c.left);u.width=u.right-u.left,u.height=u.bottom-u.top;for(var x in u)d[x]=u[x]-f[x];t.edges=r.prepared.edges,t.rect=u,t.deltaRect=d}}),l.prototype.resizable=function(e){return o.is.object(e)?(this.options.resize.enabled=!1!==e.enabled,this.setPerAction("resize",e),this.setOnEvents("resize",e),/^x$|^y$|^xy$/.test(e.axis)?this.options.resize.axis=e.axis:null===e.axis&&(this.options.resize.axis=p.resize.axis),o.is.bool(e.preserveAspectRatio)?this.options.resize.preserveAspectRatio=e.preserveAspectRatio:o.is.bool(e.square)&&(this.options.resize.square=e.square),this):o.is.bool(e)?(this.options.resize.enabled=e, +e||(this.onresizestart=this.onresizestart=this.onresizeend=null),this):this.options.resize},c.signals.on("new",function(e){e.resizeAxes="xy"}),a.signals.on("set-delta",function(e){var t=e.interaction,n=e.iEvent;"resize"===e.action&&t.resizeAxes&&(t.target.options.resize.square?("y"===t.resizeAxes?n.dx=n.dy:n.dy=n.dx,n.axes="xy"):(n.axes=t.resizeAxes,"x"===t.resizeAxes?n.dy=0:"y"===t.resizeAxes&&(n.dx=0)))}),i.resize=d,i.names.push("resize"),o.merge(l.eventTypes,["resizestart","resizemove","resizeinertiastart","resizeinertiaresume","resizeend"]),i.methodDict.resize="resizable",p.resize=d.defaults,t.exports=d},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"../utils/browser":37,"./base":6}],11:[function(e,t,n){"use strict";var r=e("./utils/raf"),i=e("./utils/window").getWindow,o=e("./utils/is"),s=e("./utils/domUtils"),a=e("./Interaction"),l=e("./defaultOptions"),c={defaults:{enabled:!1,container:null,margin:60,speed:300},interaction:null,i:null,x:0,y:0,isScrolling:!1,prevTime:0,start:function(e){c.isScrolling=!0,r.cancel(c.i),c.interaction=e,c.prevTime=(new Date).getTime(),c.i=r.request(c.scroll)},stop:function(){c.isScrolling=!1,r.cancel(c.i)},scroll:function(){var e=c.interaction.target.options[c.interaction.prepared.name].autoScroll,t=e.container||i(c.interaction.element),n=(new Date).getTime(),s=(n-c.prevTime)/1e3,a=e.speed*s;a>=1&&(o.window(t)?t.scrollBy(c.x*a,c.y*a):t&&(t.scrollLeft+=c.x*a,t.scrollTop+=c.y*a),c.prevTime=n),c.isScrolling&&(r.cancel(c.i),c.i=r.request(c.scroll))},check:function(e,t){var n=e.options;return n[t].autoScroll&&n[t].autoScroll.enabled},onInteractionMove:function(e){var t=e.interaction,n=e.pointer;if(t.interacting()&&c.check(t.target,t.prepared.name)){if(t.simulation)return void(c.x=c.y=0);var r=void 0,a=void 0,l=void 0,p=void 0,u=t.target.options[t.prepared.name].autoScroll,d=u.container||i(t.element);if(o.window(d))p=n.clientXd.innerWidth-c.margin,l=n.clientY>d.innerHeight-c.margin;else{var f=s.getElementClientRect(d);p=n.clientXf.right-c.margin,l=n.clientY>f.bottom-c.margin}c.x=a?1:p?-1:0,c.y=l?1:r?-1:0,c.isScrolling||(c.margin=u.margin,c.speed=u.speed,c.start(t))}}};a.signals.on("stop-active",function(){c.stop()}),a.signals.on("action-move",c.onInteractionMove),l.perAction.autoScroll=c.defaults,t.exports=c},{"./Interaction":5,"./defaultOptions":18,"./utils/domUtils":39,"./utils/is":46,"./utils/raf":50,"./utils/window":52}],12:[function(e,t,n){"use strict";var r=e("../Interactable"),i=e("../actions/base"),o=e("../utils/is"),s=e("../utils/domUtils");r.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},r.prototype.ignoreFrom=function(e){return this._backCompatOption("ignoreFrom",e)},r.prototype.allowFrom=function(e){return this._backCompatOption("allowFrom",e)},r.prototype.testIgnore=function(e,t,n){return!(!e||!o.element(n))&&(o.string(e)?s.matchesUpTo(n,e,t):!!o.element(e)&&s.nodeContains(e,n))},r.prototype.testAllow=function(e,t,n){return!e||!!o.element(n)&&(o.string(e)?s.matchesUpTo(n,e,t):!!o.element(e)&&s.nodeContains(e,n))},r.prototype.testIgnoreAllow=function(e,t,n){return!this.testIgnore(e.ignoreFrom,t,n)&&this.testAllow(e.allowFrom,t,n)},r.prototype.actionChecker=function(e){return o.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},r.prototype.styleCursor=function(e){return o.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},r.prototype.defaultActionChecker=function(e,t,n,r){for(var o=this.getRect(r),s=null,a=i.names,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var u=p;if((!n.pointerIsDown||!n.mouse||0!=(t.buttons&this.options[u].mouseButtons))&&(s=i[u].checker(e,t,this,r,n,o)))return s}}},{"../Interactable":4,"../actions/base":6,"../utils/domUtils":39,"../utils/is":46}],13:[function(e,t,n){"use strict";function r(e,t,n,r){return g.is.object(e)&&t.testIgnoreAllow(t.options[e.name],n,r)&&t.options[e.name].enabled&&a(t,n,e)?e:null}function i(e,t,n,i,o,s){for(var a=0,l=i.length;a=m.maxInteractions)return!1;if(u.target===e){if((a+=d===n.name|0)>=i)return!1;if(u.element===t&&(l++,d!==n.name||l>=o))return!1}}}return m.maxInteractions>0}}var l=e("../interact"),c=e("../Interactable"),p=e("../Interaction"),u=e("../actions/base"),d=e("../defaultOptions"),f=e("../utils/browser"),v=e("../scope"),g=e("../utils"),h=e("../utils/Signals").new();e("./InteractableMethods");var m={signals:h,withinInteractionLimit:a,maxInteractions:1/0,defaults:{perAction:{manualStart:!1,max:1/0,maxPerElement:1,allowFrom:null,ignoreFrom:null}},setActionDefaults:function(e){g.extend(e.defaults,m.defaults.perAction)}};p.signals.on("down",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;if(!t.interacting()){s(t,o(t,n,r,i))}}),p.signals.on("move",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;if(t.mouse&&!t.pointerIsDown&&!t.interacting()){s(t,o(t,n,r,i))}}),p.signals.on("move",function(e){var t=e.interaction,n=e.event;if(t.pointerIsDown&&!t.interacting()&&t.pointerWasMoved&&t.prepared.name){h.fire("before-start",e);var r=t.target;t.prepared.name&&r&&(r.options[t.prepared.name].manualStart||!a(r,t.element,t.prepared)?t.stop(n):t.start(t.prepared,r,t.element))}}),p.signals.on("stop",function(e){var t=e.interaction,n=t.target;n&&n.options.styleCursor&&(n._doc.documentElement.style.cursor="")}),c.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},c.prototype.actionChecker=function(e){return g.is.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},c.prototype.styleCursor=function(e){return g.is.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},c.prototype.defaultActionChecker=function(e,t,n,r){for(var i=this.getRect(r),o=t.buttons||{0:1,1:4,3:8,4:16}[t.button],s=null,a=u.names,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var d=p;if((!n.pointerIsDown||!n.mouse||0!=(o&this.options[d].mouseButtons))&&(s=u[d].checker(e,t,this,r,n,i)))return s}},l.maxInteractions=function(e){return g.is.number(e)?(m.maxInteractions=e,this):m.maxInteractions},c.settingsMethods.push("styleCursor"),c.settingsMethods.push("actionChecker"),c.settingsMethods.push("ignoreFrom"),c.settingsMethods.push("allowFrom"),d.base.actionChecker=null,d.base.styleCursor=!0,g.extend(d.perAction,m.defaults.perAction),t.exports=m},{"../Interactable":4,"../Interaction":5,"../actions/base":6,"../defaultOptions":18,"../interact":21,"../scope":34,"../utils":44,"../utils/Signals":35,"../utils/browser":37,"./InteractableMethods":12}],14:[function(e,t,n){"use strict";var r=e("./base"),i=e("../Interaction");i.signals.on("new",function(e){e.delayTimer=null}),r.signals.on("prepared",function(e){var t=e.interaction,n=t.prepared.name;if(n){var r=t.target.options[n].delay;r>0&&(t.delayTimer=setTimeout(function(){t.start(t.prepared,t.target,t.element)},r))}}),i.signals.on("move",function(e){var t=e.interaction,n=e.duplicate;t.pointerWasMoved&&!n&&clearTimeout(t.delayTimer)}),r.signals.on("before-start",function(e){var t=e.interaction,n=t.prepared.name;if(n){t.target.options[n].delay>0&&(t.prepared.name=null)}})},{"../Interaction":5,"./base":13}],15:[function(e,t,n){"use strict";function r(e,t){if(!t)return!1;var n=t.options.drag.startAxis;return"xy"===e||"xy"===n||n===e}var i=e("./base"),o=e("../scope"),s=e("../utils/browser"),a=e("../utils/is"),l=e("../utils/domUtils"),c=l.matchesSelector,p=l.parentNode;i.setActionDefaults(e("../actions/drag")),i.signals.on("before-start",function(e){var t=e.interaction,n=e.eventTarget,l=e.dx,u=e.dy;if("drag"===t.prepared.name){var d=Math.abs(l),f=Math.abs(u),v=t.target.options.drag,g=v.startAxis,h=d>f?"x":dl.minSpeed&&g>l.endSpeed,b={interaction:t,pageCoords:v,statuses:f,preEnd:!0,requireEndOnly:!0};y&&!x&&(c.resetStatuses(f),m=c.setAll(b),m.shouldMove&&m.locked&&(h=!0)),(x||h)&&(p.copyCoords(i.upCoords,t.curCoords),t.pointers[0]=i.startEvent=new a(t,n,t.prepared.name,"inertiastart",t.element),i.t0=d,i.active=!0,i.allowResume=l.allowResume,t.simulation=i,o.fire(i.startEvent),x?(i.vx0=t.pointerDelta.client.vx,i.vy0=t.pointerDelta.client.vy,i.v0=g,r(t,i),p.extend(v,t.curCoords.page),v.x+=i.xe,v.y+=i.ye,c.resetStatuses(f),m=c.setAll(b),i.modifiedXe+=m.dx,i.modifiedYe+=m.dy,i.i=u.request(t.boundInertiaFrame)):(i.smoothEnd=!0,i.xe=m.dx,i.ye=m.dy,i.sx=i.sy=0,i.i=u.request(t.boundSmoothEndFrame)))}}),l.signals.on("stop-active",function(e){var t=e.interaction,n=t.inertiaStatus;n.active&&(u.cancel(n.i),n.active=!1,t.simulation=null)})},{"./InteractEvent":3,"./Interaction":5,"./modifiers":24,"./utils":44,"./utils/raf":50}],21:[function(e,t,n){"use strict";function r(e,t){var n=a.interactables.get(e,t);return n||(n=new l(e,t),n.events.global=p),n}var i=e("./utils/browser"),o=e("./utils/events"),s=e("./utils"),a=e("./scope"),l=e("./Interactable"),c=e("./Interaction"),p={};r.isSet=function(e,t){return-1!==a.interactables.indexOfElement(e,t&&t.context)},r.on=function(e,t,n){if(s.is.string(e)&&-1!==e.search(" ")&&(e=e.trim().split(/ +/)),s.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.on(f,t,n)}return r}if(s.is.object(e)){for(var v in e)r.on(v,e[v],t);return r}return s.contains(l.eventTypes,e)?p[e]?p[e].push(t):p[e]=[t]:o.add(a.document,e,t,{options:n}),r},r.off=function(e,t,n){if(s.is.string(e)&&-1!==e.search(" ")&&(e=e.trim().split(/ +/)),s.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.off(f,t,n)}return r}if(s.is.object(e)){for(var v in e)r.off(v,e[v],t);return r}if(s.contains(l.eventTypes,e)){var g=void 0;e in p&&-1!==(g=s.indexOf(p[e],t))&&p[e].splice(g,1)}else o.remove(a.document,e,t,n);return r},r.debug=function(){return a},r.getPointerAverage=s.pointerAverage,r.getTouchBBox=s.touchBBox,r.getTouchDistance=s.touchDistance,r.getTouchAngle=s.touchAngle,r.getElementRect=s.getElementRect,r.getElementClientRect=s.getElementClientRect,r.matchesSelector=s.matchesSelector,r.closest=s.closest,r.supportsTouch=function(){return i.supportsTouch},r.supportsPointerEvent=function(){return i.supportsPointerEvent},r.stop=function(e){for(var t=a.interactions.length-1;t>=0;t--)a.interactions[t].stop(e);return r},r.pointerMoveTolerance=function(e){return s.is.number(e)?(c.pointerMoveTolerance=e,this):c.pointerMoveTolerance},r.addDocument=a.addDocument,r.removeDocument=a.removeDocument,a.interact=r,t.exports=r},{"./Interactable":4,"./Interaction":5,"./scope":34,"./utils":44,"./utils/browser":37,"./utils/events":40}],22:[function(e,t,n){"use strict";function r(e){var t=e.interaction,n=e.event;t.target&&t.target.checkAndPreventDefault(n)}var i=e("./Interactable"),o=e("./Interaction"),s=e("./scope"),a=e("./utils/is"),l=e("./utils/events"),c=e("./utils/domUtils"),p=c.nodeContains,u=c.matchesSelector;i.prototype.preventDefault=function(e){return/^(always|never|auto)$/.test(e)?(this.options.preventDefault=e,this):a.bool(e)?(this.options.preventDefault=e?"always":"never",this):this.options.preventDefault},i.prototype.checkAndPreventDefault=function(e){var t=this.options.preventDefault;if("never"!==t)return"always"===t?void e.preventDefault():void(l.supportsOptions||/^(mouse|pointer|touch)*(down|start)/i.test(e.type)||a.element(e.target)&&u(e.target,"input,select,textarea,[contenteditable=true],[contenteditable=true] *")||e.preventDefault())};for(var d=["down","move","up","cancel"],f=0;f=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i;if(o.element&&(o.element===e.target||p(o.element,e.target)))return void o.target.checkAndPreventDefault(e)}}},{"./Interactable":4,"./Interaction":5,"./scope":34,"./utils/domUtils":39,"./utils/events":40,"./utils/is":46}],23:[function(e,t,n){"use strict";function r(e){var t=e.target,n=a.search(e,e.type,t);n&&n.prevTap&&e.clientX===n.prevTap.clientX&&e.clientY===n.prevTap.clientY&&t===n.prevTap.target&&(n.downTargets[0]=t,n.downTimes[0]=(new Date).getTime(),l.fire({interaction:n,event:e,eventTarget:t,pointer:e,type:"tap"}))}var i=e("./scope"),o=e("./utils/events"),s=e("./utils/browser"),a=e("./utils/interactionFinder"),l=e("./pointerEvents/base"),c=e("./utils/window"),p=c.window,u=Object.prototype.toString;if(p.Array.isArray||(p.Array.isArray=function(e){return"[object Array]"===u.call(e)}),String.prototype.trim||(String.prototype.trim=function(){return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")}),s.isIE8){var d=function(e){for(var t=i.interactions,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var o;if(n){if(r>=t.length)break;o=t[r++]}else{if(r=t.next(),r.done)break;o=r.value}var s=o;s.interacting()&&s.target.checkAndPreventDefault(e)}},f=function(e,t){var n=e.doc,i=(e.win,0===t.indexOf("listen")?o.add:o.remove);i(n,"selectstart",d),l&&i(n,"dblclick",r)};i.signals.on("add-document",f),i.signals.on("remove-document",f)}t.exports=null},{"./pointerEvents/base":31,"./scope":34,"./utils/browser":37,"./utils/events":40,"./utils/interactionFinder":45,"./utils/window":52}],24:[function(e,t,n){"use strict";function r(e,t,n){return e&&e.enabled&&(t||!e.endOnly)&&(!n||e.endOnly)}var i=e("../InteractEvent"),o=e("../Interaction"),s=e("../utils/extend"),a={names:[],setOffsets:function(e){var t=e.interaction,n=e.pageCoords,r=t.target,i=t.element,o=t.startOffset,s=r.getRect(i);s?(o.left=n.x-s.left,o.top=n.y-s.top,o.right=s.right-n.x,o.bottom=s.bottom-n.y,"width"in s||(s.width=s.right-s.left),"height"in s||(s.height=s.bottom-s.top)):o.left=o.top=o.right=o.bottom=0,e.rect=s,e.interactable=r,e.element=i;for(var l=0;l=p.length)break;f=p[d++]}else{if(d=p.next(),d.done)break;f=d.value}var v=f,g=a[v],h=t.target.options[t.prepared.name][v];r(h,i,o)&&(e.status=e.status=n[v],e.options=h,e.offset=e.interaction.modifierOffsets[v],g.set(e),e.status.locked&&(l.x+=e.status.dx,l.y+=e.status.dy,c.dx+=e.status.dx,c.dy+=e.status.dy,c.locked=!0))}return c.shouldMove=!e.status||!c.locked||e.status.changed,c},resetStatuses:function(e){for(var t=a.names,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var i;if(n){if(r>=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i,s=e[o]||{};s.dx=s.dy=0,s.modifiedX=s.modifiedY=NaN,s.locked=!1,s.changed=!0,e[o]=s}return e},start:function(e,t){var n=e.interaction,r={interaction:n,pageCoords:("action-resume"===t?n.curCoords:n.startCoords).page,startOffset:n.startOffset,statuses:n.modifierStatuses,preEnd:!1,requireEndOnly:!1};a.setOffsets(r),a.resetStatuses(r.statuses),r.pageCoords=s({},n.startCoords.page),n.modifierResult=a.setAll(r)}};o.signals.on("new",function(e){e.startOffset={left:0,right:0,top:0,bottom:0},e.modifierOffsets={},e.modifierStatuses=a.resetStatuses({}),e.modifierResult=null}),o.signals.on("action-start",a.start),o.signals.on("action-resume",a.start),o.signals.on("before-action-move",function(e){var t=e.interaction,n=e.preEnd,r=e.interactingBeforeMove,i=a.setAll({interaction:t,preEnd:n,pageCoords:t.curCoords.page,statuses:t.modifierStatuses,requireEndOnly:!1});!i.shouldMove&&r&&(t._dontFireMove=!0),t.modifierResult=i}),o.signals.on("action-end",function(e){for(var t=e.interaction,n=e.event,i=0;i=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}var m=h,y=m.x,x=m.y;l.push({x:s.left-i.width*y+u.x,y:s.top-i.height*x+u.y})}else l.push(u);return l},set:function(e){var t=e.interaction,n=e.pageCoords,r=e.status,i=e.options,s=e.offset,a=[],l=void 0,c=void 0,p=void 0;if(r.useStatusXY)c={x:r.x,y:r.y};else{var u=o.getOriginXY(t.target,t.element,t.prepared.name);c=o.extend({},n),c.x-=u.x,c.y-=u.y}r.realX=c.x,r.realY=c.y;for(var d=i.targets?i.targets.length:0,f=s,v=Array.isArray(f),g=0,f=v?f:f[Symbol.iterator]();;){var h;if(v){if(g>=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}for(var m=h,y=m.x,x=m.y,b=c.x-y,w=c.y-x,E=i.targets,S=Array.isArray(E),T=0,E=S?E:E[Symbol.iterator]();;){var C;if(S){if(T>=E.length)break;C=E[T++]}else{if(T=E.next(),T.done)break;C=T.value}var A=C;l=o.is.function(A)?A(b,w,t):A,l&&a.push({x:o.is.number(l.x)?l.x+y:b,y:o.is.number(l.y)?l.y+x:w,range:o.is.number(l.range)?l.range:i.range})}}var D={target:null,inRange:!1,distance:0,range:0,dx:0,dy:0};for(p=0,d=a.length;p=p.length)break;f=p[d++]}else{if(d=p.next(),d.done)break;f=d.value}var v=f,g=void 0;g=a.is.function(v)?v(l,c,t):v,g&&("width"in g&&"height"in g&&(g.x=g.width, +g.y=g.height),e.options.targets.push(g))}i.set(e)},modifyCoords:function(e){var t=e.options;e.options=a.extend({},t),e.options.enabled=t.enabled,e.options.relativePoints=[null],i.modifyCoords(e)}};r.snapSize=l,r.names.push("snapSize"),o.perAction.snapSize=l.defaults,s.defaults.snapSize=l.defaults,t.exports=l},{"../actions/resize":10,"../defaultOptions":18,"../utils/":44,"./index":24,"./snap":28}],30:[function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=e("../utils/pointerUtils");t.exports=function(){function e(t,n,o,s,a){if(r(this,e),i.pointerExtend(this,o),o!==n&&i.pointerExtend(this,n),this.interaction=a,this.timeStamp=(new Date).getTime(),this.originalEvent=o,this.type=t,this.pointerId=i.getPointerId(n),this.pointerType=i.getPointerType(n),this.target=s,this.currentTarget=null,"tap"===t){var l=a.getPointerIndex(n);this.dt=this.timeStamp-a.downTimes[l];var c=this.timeStamp-a.tapTime;this.double=!!(a.prevTap&&"doubletap"!==a.prevTap.type&&a.prevTap.target===this.target&&c<500)}else"doubletap"===t&&(this.dt=n.timeStamp-a.tapTime)}return e.prototype.subtractOrigin=function(e){var t=e.x,n=e.y;return this.pageX-=t,this.pageY-=n,this.clientX-=t,this.clientY-=n,this},e.prototype.addOrigin=function(e){var t=e.x,n=e.y;return this.pageX+=t,this.pageY+=n,this.clientX+=t,this.clientY+=n,this},e.prototype.preventDefault=function(){this.originalEvent.preventDefault()},e.prototype.stopPropagation=function(){this.propagationStopped=!0},e.prototype.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},e}()},{"../utils/pointerUtils":49}],31:[function(e,t,n){"use strict";function r(e){for(var t=e.interaction,n=e.pointer,s=e.event,l=e.eventTarget,c=e.type,u=void 0===c?e.pointerEvent.type:c,d=e.targets,f=void 0===d?i(e):d,v=e.pointerEvent,g=void 0===v?new o(u,n,s,l,t):v,h={interaction:t,pointer:n,event:s,eventTarget:l,targets:f,type:u,pointerEvent:g},m=0;m=u.length)break;g=u[v++]}else{if(v=u.next(),v.done)break;g=v.value}var h=g;c.element=h,p.fire("collect-targets",c)}return"hold"===o&&(c.targets=d(c.targets,function(e){return e.eventable.options.holdDuration===t.holdTimers[s].duration})),c.targets}var o=e("./PointerEvent"),s=e("../Interaction"),a=e("../utils"),l=e("../utils/browser"),c=e("../defaultOptions"),p=e("../utils/Signals").new(),u=e("../utils/arr"),d=u.filter,f=["down","up","cancel"],v=["down","up","cancel"],g={PointerEvent:o,fire:r,collectEventTargets:i,signals:p,defaults:{holdDuration:600,ignoreFrom:null,allowFrom:null,origin:{x:0,y:0}},types:["down","move","up","cancel","tap","doubletap","hold"]};s.signals.on("update-pointer-down",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers[n]={duration:1/0,timeout:null}}),s.signals.on("remove-pointer",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers.splice(n,1)}),s.signals.on("move",function(e){var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,s=e.duplicateMove,a=t.getPointerIndex(n);s||t.pointerIsDown&&!t.pointerWasMoved||(t.pointerIsDown&&clearTimeout(t.holdTimers[a].timeout),r({interaction:t,pointer:n,event:i,eventTarget:o,type:"move"}))}),s.signals.on("down",function(e){for(var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,s=e.pointerIndex,c=l.isIE8?a.extend({},i):i,u=t.holdTimers[s],d=a.getPath(o),f={interaction:t,pointer:n,event:i,eventTarget:o,type:"hold",targets:[],path:d,element:null},v=d,g=Array.isArray(v),h=0,v=g?v:v[Symbol.iterator]();;){var m;if(g){if(h>=v.length)break;m=v[h++]}else{if(h=v.next(),h.done)break;m=h.value}var y=m;f.element=y,p.fire("collect-targets",f)}if(f.targets.length){for(var x=1/0,b=0;b=0&&(p.selectors[u]!==e||p.contexts[u]!==t);u--);-1===u&&(u=p.selectors.length,p.selectors.push(e),p.contexts.push(t),p.listeners.push([])),p.listeners[u].push([i,!!s.capture,s.passive])}function s(e,t,n,r,o){var s=f(o),c=O[n],p=!1,u=void 0;if(c)for(u=c.selectors.length-1;u>=0;u--)if(c.selectors[u]===e&&c.contexts[u]===t){for(var d=c.listeners[u],v=d.length-1;v>=0;v--){var g=d[v],h=g[0],m=g[1],y=g[2];if(h===r&&m===!!s.capture&&y===s.passive){d.splice(v,1),d.length||(c.selectors.splice(u,1),c.contexts.splice(u,1),c.listeners.splice(u,1),i(t,n,a),i(t,n,l,!0),c.selectors.length||(O[n]=null)),p=!0;break}}if(p)break}}function a(e,t){var n=f(t),r={},i=O[e.type],o=g.getActualElement(e.path?e.path[0]:e.target),s=o;for(h(r,e),r.originalEvent=e,r.preventDefault=p;v.element(s);){for(var a=0;a=l.length)break;u=l[p++]}else{if(p=l.next(),p.done)break;u=p.value}var d=u,f=o[d](a);if(f)return f}},simulationResume:function(e){var t=e.pointerType,n=e.eventType,o=e.eventTarget;if(!/down|start/i.test(n))return null;for(var s=r.interactions,a=Array.isArray(s),l=0,s=a?s:s[Symbol.iterator]();;){var c;if(a){if(l>=s.length)break;c=s[l++]}else{if(l=s.next(),l.done)break;c=l.value}var p=c,u=o;if(p.simulation&&p.simulation.allowResume&&p.pointerType===t)for(;u;){if(u===p.element)return p;u=i.parentNode(u)}}return null},mouseOrPen:function(e){var t=e.pointerId,n=e.pointerType,o=e.eventType;if("mouse"!==n&&"pen"!==n)return null;for(var s=void 0,a=r.interactions,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var u=p;if(u.pointerType===n){if(u.simulation&&!i.contains(u.pointerIds,t))continue;if(u.interacting())return u;s||(s=u)}}if(s)return s;for(var d=r.interactions,f=Array.isArray(d),v=0,d=f?d:d[Symbol.iterator]();;){var g;if(f){if(v>=d.length)break;g=d[v++]}else{if(v=d.next(),v.done)break;g=v.value}var h=g;if(!(h.pointerType!==n||/down/i.test(o)&&h.simulation))return h}return null},hasPointer:function(e){for(var t=e.pointerId,n=r.interactions,o=Array.isArray(n),s=0,n=o?n:n[Symbol.iterator]();;){var a;if(o){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var l=a;if(i.contains(l.pointerIds,t))return l}},idle:function(e){for(var t=e.pointerType,n=r.interactions,i=Array.isArray(n),o=0,n=i?n:n[Symbol.iterator]();;){var s;if(i){if(o>=n.length)break;s=n[o++]}else{if(o=n.next(),o.done)break;s=o.value}var a=s;if(1===a.pointerIds.length){var l=a.target;if(l&&!l.options.gesture.enabled)continue}else if(a.pointerIds.length>=2)continue;if(!a.interacting()&&t===a.pointerType)return a}return null}};t.exports=o},{"../scope":34,"./index":44}],46:[function(e,t,n){"use strict";var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},i=e("./window"),o=e("./isWindow"),s={array:function(){},window:function(e){return e===i.window||o(e)},docFrag:function(e){return s.object(e)&&11===e.nodeType},object:function(e){return!!e&&"object"===(void 0===e?"undefined":r(e))},function:function(e){return"function"==typeof e},number:function(e){return"number"==typeof e},bool:function(e){return"boolean"==typeof e},string:function(e){return"string"==typeof e},element:function(e){if(!e||"object"!==(void 0===e?"undefined":r(e)))return!1;var t=i.getWindow(e)||i.window;return/object|function/.test(r(t.Element))?e instanceof t.Element:1===e.nodeType&&"string"==typeof e.nodeName}};s.array=function(e){return s.object(e)&&void 0!==e.length&&s.function(e.splice)},t.exports=s},{"./isWindow":47,"./window":52}],47:[function(e,t,n){"use strict";t.exports=function(e){return!(!e||!e.Window)&&e instanceof e.Window}},{}],48:[function(e,t,n){"use strict";function r(e,n){for(var r in n){var i=t.exports.prefixedPropREs,o=!1;for(var s in i)if(0===r.indexOf(s)&&i[s].test(r)){o=!0;break}o||"function"==typeof n[r]||(e[r]=n[r])}return e}r.prefixedPropREs={webkit:/(Movement[XY]|Radius[XY]|RotationAngle|Force)$/},t.exports=r},{}],49:[function(e,t,n){"use strict";var r=e("./hypot"),i=e("./browser"),o=e("./domObjects"),s=e("./domUtils"),a=e("./domObjects"),l=e("./is"),c=e("./pointerExtend"),p={copyCoords:function(e,t){e.page=e.page||{},e.page.x=t.page.x,e.page.y=t.page.y,e.client=e.client||{},e.client.x=t.client.x,e.client.y=t.client.y,e.timeStamp=t.timeStamp},setCoordDeltas:function(e,t,n){e.page.x=n.page.x-t.page.x,e.page.y=n.page.y-t.page.y,e.client.x=n.client.x-t.client.x,e.client.y=n.client.y-t.client.y,e.timeStamp=n.timeStamp-t.timeStamp;var i=Math.max(e.timeStamp/1e3,.001);e.page.speed=r(e.page.x,e.page.y)/i,e.page.vx=e.page.x/i,e.page.vy=e.page.y/i,e.client.speed=r(e.client.x,e.page.y)/i,e.client.vx=e.client.x/i,e.client.vy=e.client.y/i},isNativePointer:function(e){return e instanceof o.Event||e instanceof o.Touch},getXY:function(e,t,n){return n=n||{},e=e||"page",n.x=t[e+"X"],n.y=t[e+"Y"],n},getPageXY:function(e,t){return t=t||{},i.isOperaMobile&&p.isNativePointer(e)?(p.getXY("screen",e,t),t.x+=window.scrollX,t.y+=window.scrollY):p.getXY("page",e,t),t},getClientXY:function(e,t){return t=t||{},i.isOperaMobile&&p.isNativePointer(e)?p.getXY("screen",e,t):p.getXY("client",e,t),t},getPointerId:function(e){return l.number(e.pointerId)?e.pointerId:e.identifier},setCoords:function(e,t,n){var r=t.length>1?p.pointerAverage(t):t[0],i={};p.getPageXY(r,i),e.page.x=i.x,e.page.y=i.y,p.getClientXY(r,i),e.client.x=i.x,e.client.y=i.y,e.timeStamp=l.number(n)?n:(new Date).getTime()},pointerExtend:c,getTouchPair:function(e){var t=[];return l.array(e)?(t[0]=e[0],t[1]=e[1]):"touchend"===e.type?1===e.touches.length?(t[0]=e.touches[0],t[1]=e.changedTouches[0]):0===e.touches.length&&(t[0]=e.changedTouches[0],t[1]=e.changedTouches[1]):(t[0]=e.touches[0],t[1]=e.touches[1]),t},pointerAverage:function(e){for(var t={pageX:0,pageY:0,clientX:0,clientY:0,screenX:0,screenY:0},n=e,r=Array.isArray(n),i=0,n=r?n:n[Symbol.iterator]();;){var o;if(r){if(i>=n.length)break;o=n[i++]}else{if(i=n.next(),i.done)break;o=i.value}var s=o;for(var a in t)t[a]+=s[a]}for(var l in t)t[l]/=e.length;return t},touchBBox:function(e){if(e.length||e.touches&&e.touches.length>1){var t=p.getTouchPair(e),n=Math.min(t[0].pageX,t[1].pageX),r=Math.min(t[0].pageY,t[1].pageY);return{x:n,y:r,left:n,top:r,width:Math.max(t[0].pageX,t[1].pageX)-n,height:Math.max(t[0].pageY,t[1].pageY)-r}}},touchDistance:function(e,t){var n=t+"X",i=t+"Y",o=p.getTouchPair(e),s=o[0][n]-o[1][n],a=o[0][i]-o[1][i];return r(s,a)},touchAngle:function(e,t,n){var r=n+"X",i=n+"Y",o=p.getTouchPair(e),s=o[1][r]-o[0][r],a=o[1][i]-o[0][i];return 180*Math.atan2(a,s)/Math.PI},getPointerType:function(e){return l.string(e.pointerType)?e.pointerType:l.number(e.pointerType)?[void 0,void 0,"touch","pen","mouse"][e.pointerType]:/touch/.test(e.type)||e instanceof a.Touch?"touch":"mouse"},getEventTargets:function(e){return[s.getActualElement(e.path?e.path[0]:e.target),s.getActualElement(e.currentTarget)]}};t.exports=p},{"./browser":37,"./domObjects":38,"./domUtils":39,"./hypot":43,"./is":46,"./pointerExtend":48}],50:[function(e,t,n){"use strict";for(var r=e("./window"),i=r.window,o=["ms","moz","webkit","o"],s=0,a=void 0,l=void 0,c=0;c\n * Open source under the MIT License.\n * https://raw.github.com/taye/interact.js/master/LICENSE\n */\n","/*\n * In a (windowless) server environment this file exports a factory function\n * that takes the window to use.\n *\n * var interact = require('interact.js')(windowObject);\n *\n * See https://github.com/taye/interact.js/issues/187\n */\nif (typeof window === 'undefined') {\n module.exports = function (window) {\n require('./src/utils/window').init(window);\n\n return require('./src/index');\n };\n}\nelse {\n module.exports = require('./src/index');\n}\n","const { indexOf } = require('./utils/arr');\nconst extend = require('./utils/extend.js');\n\nfunction fireUntilImmediateStopped (event, listeners) {\n for (let i = 0, len = listeners.length; i < len && !event.immediatePropagationStopped; i++) {\n listeners[i](event);\n }\n}\n\nclass Eventable {\n\n constructor (options) {\n this.options = extend({}, options || {});\n }\n\n fire (event) {\n let listeners;\n const onEvent = 'on' + event.type;\n const global = this.global;\n\n // Interactable#on() listeners\n if ((listeners = this[event.type])) {\n fireUntilImmediateStopped(event, listeners);\n }\n\n // interactable.onevent listener\n if (this[onEvent]) {\n this[onEvent](event);\n }\n\n // interact.on() listeners\n if (!event.propagationStopped && global && (listeners = global[event.type])) {\n fireUntilImmediateStopped(event, listeners);\n }\n }\n\n on (eventType, listener) {\n // if this type of event was never bound\n if (this[eventType]) {\n this[eventType].push(listener);\n }\n else {\n this[eventType] = [listener];\n }\n }\n\n off (eventType, listener) {\n // if it is an action event type\n const eventList = this[eventType];\n const index = eventList? indexOf(eventList, listener) : -1;\n\n if (index !== -1) {\n eventList.splice(index, 1);\n }\n\n if (eventList && eventList.length === 0 || !listener) {\n this[eventType] = listener;\n }\n }\n}\n\nmodule.exports = Eventable;\n","const extend = require('./utils/extend');\nconst getOriginXY = require('./utils/getOriginXY');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nclass InteractEvent {\n constructor (interaction, event, action, phase, element, related, preEnd = false) {\n const target = interaction.target;\n const deltaSource = (target && target.options || defaults).deltaSource;\n const origin = getOriginXY(target, element, action);\n const starting = phase === 'start';\n const ending = phase === 'end';\n const coords = starting? interaction.startCoords : interaction.curCoords;\n const prevEvent = interaction.prevEvent;\n\n element = element || interaction.element;\n\n const page = extend({}, coords.page);\n const client = extend({}, coords.client);\n\n page.x -= origin.x;\n page.y -= origin.y;\n\n client.x -= origin.x;\n client.y -= origin.y;\n\n this.ctrlKey = event.ctrlKey;\n this.altKey = event.altKey;\n this.shiftKey = event.shiftKey;\n this.metaKey = event.metaKey;\n this.button = event.button;\n this.buttons = event.buttons;\n this.target = element;\n this.currentTarget = element;\n this.relatedTarget = related || null;\n this.preEnd = preEnd;\n this.type = action + (phase || '');\n this.interaction = interaction;\n this.interactable = target;\n\n this.t0 = starting ? interaction.downTimes[interaction.downTimes.length - 1]\n : prevEvent.t0;\n\n const signalArg = {\n interaction,\n event,\n action,\n phase,\n element,\n related,\n page,\n client,\n coords,\n starting,\n ending,\n deltaSource,\n iEvent: this,\n };\n\n signals.fire('set-xy', signalArg);\n\n if (ending) {\n // use previous coords when ending\n this.pageX = prevEvent.pageX;\n this.pageY = prevEvent.pageY;\n this.clientX = prevEvent.clientX;\n this.clientY = prevEvent.clientY;\n }\n else {\n this.pageX = page.x;\n this.pageY = page.y;\n this.clientX = client.x;\n this.clientY = client.y;\n }\n\n this.x0 = interaction.startCoords.page.x - origin.x;\n this.y0 = interaction.startCoords.page.y - origin.y;\n this.clientX0 = interaction.startCoords.client.x - origin.x;\n this.clientY0 = interaction.startCoords.client.y - origin.y;\n\n signals.fire('set-delta', signalArg);\n\n this.timeStamp = coords.timeStamp;\n this.dt = interaction.pointerDelta.timeStamp;\n this.duration = this.timeStamp - this.t0;\n\n // speed and velocity in pixels per second\n this.speed = interaction.pointerDelta[deltaSource].speed;\n this.velocityX = interaction.pointerDelta[deltaSource].vx;\n this.velocityY = interaction.pointerDelta[deltaSource].vy;\n\n this.swipe = (ending || phase === 'inertiastart')? this.getSwipe() : null;\n\n signals.fire('new', signalArg);\n }\n\n getSwipe () {\n const interaction = this.interaction;\n\n if (interaction.prevEvent.speed < 600\n || this.timeStamp - interaction.prevEvent.timeStamp > 150) {\n return null;\n }\n\n let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI;\n const overlap = 22.5;\n\n if (angle < 0) {\n angle += 360;\n }\n\n const left = 135 - overlap <= angle && angle < 225 + overlap;\n const up = 225 - overlap <= angle && angle < 315 + overlap;\n\n const right = !left && (315 - overlap <= angle || angle < 45 + overlap);\n const down = !up && 45 - overlap <= angle && angle < 135 + overlap;\n\n return {\n up,\n down,\n left,\n right,\n angle,\n speed: interaction.prevEvent.speed,\n velocity: {\n x: interaction.prevEvent.velocityX,\n y: interaction.prevEvent.velocityY,\n },\n };\n }\n\n preventDefault () {}\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n}\n\nsignals.on('set-delta', function ({ iEvent, interaction, starting, deltaSource }) {\n const prevEvent = starting? iEvent : interaction.prevEvent;\n\n if (deltaSource === 'client') {\n iEvent.dx = iEvent.clientX - prevEvent.clientX;\n iEvent.dy = iEvent.clientY - prevEvent.clientY;\n }\n else {\n iEvent.dx = iEvent.pageX - prevEvent.pageX;\n iEvent.dy = iEvent.pageY - prevEvent.pageY;\n }\n});\n\nInteractEvent.signals = signals;\n\nmodule.exports = InteractEvent;\n","const is = require('./utils/is');\nconst events = require('./utils/events');\nconst extend = require('./utils/extend');\nconst actions = require('./actions/base');\nconst scope = require('./scope');\nconst Eventable = require('./Eventable');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nconst {\n getElementRect,\n nodeContains,\n trySelector,\n} = require('./utils/domUtils');\nconst { getWindow } = require('./utils/window');\nconst { indexOf, contains } = require('./utils/arr');\nconst { wheelEvent } = require('./utils/browser');\n\n// all set interactables\nscope.interactables = [];\n\n/*\\\n * Interactable\n [ property ]\n **\n * Object type returned by @interact\n\\*/\nclass Interactable {\n constructor (target, options) {\n options = options || {};\n\n this.target = target;\n this.events = new Eventable();\n this._context = options.context || scope.document;\n this._win = getWindow(trySelector(target)? this._context : target);\n this._doc = this._win.document;\n\n signals.fire('new', {\n target,\n options,\n interactable: this,\n win: this._win,\n });\n\n scope.addDocument( this._doc, this._win );\n\n scope.interactables.push(this);\n\n this.set(options);\n }\n\n setOnEvents (action, phases) {\n const onAction = 'on' + action;\n\n if (is.function(phases.onstart) ) { this.events[onAction + 'start' ] = phases.onstart ; }\n if (is.function(phases.onmove) ) { this.events[onAction + 'move' ] = phases.onmove ; }\n if (is.function(phases.onend) ) { this.events[onAction + 'end' ] = phases.onend ; }\n if (is.function(phases.oninertiastart)) { this.events[onAction + 'inertiastart' ] = phases.oninertiastart ; }\n\n return this;\n }\n\n setPerAction (action, options) {\n // for all the default per-action options\n for (const option in options) {\n // if this option exists for this action\n if (option in defaults[action]) {\n // if the option in the options arg is an object value\n if (is.object(options[option])) {\n // duplicate the object\n this.options[action][option] = extend(this.options[action][option] || {}, options[option]);\n\n if (is.object(defaults.perAction[option]) && 'enabled' in defaults.perAction[option]) {\n this.options[action][option].enabled = options[option].enabled === false? false : true;\n }\n }\n else if (is.bool(options[option]) && is.object(defaults.perAction[option])) {\n this.options[action][option].enabled = options[option];\n }\n else if (options[option] !== undefined) {\n // or if it's not undefined, do a plain assignment\n this.options[action][option] = options[option];\n }\n }\n }\n }\n\n /*\\\n * Interactable.getRect\n [ method ]\n *\n * The default function to get an Interactables bounding rect. Can be\n * overridden using @Interactable.rectChecker.\n *\n - element (Element) #optional The element to measure.\n = (object) The object's bounding rectangle.\n o {\n o top : 0,\n o left : 0,\n o bottom: 0,\n o right : 0,\n o width : 0,\n o height: 0\n o }\n \\*/\n getRect (element) {\n element = element || this.target;\n\n if (is.string(this.target) && !(is.element(element))) {\n element = this._context.querySelector(this.target);\n }\n\n return getElementRect(element);\n }\n\n /*\\\n * Interactable.rectChecker\n [ method ]\n *\n * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n - checker (function) #optional A function which returns this Interactable's bounding rectangle. See @Interactable.getRect\n = (function | object) The checker function or this Interactable\n \\*/\n rectChecker (checker) {\n if (is.function(checker)) {\n this.getRect = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.getRect;\n\n return this;\n }\n\n return this.getRect;\n }\n\n _backCompatOption (optionName, newValue) {\n if (trySelector(newValue) || is.object(newValue)) {\n this.options[optionName] = newValue;\n\n for (const action of actions.names) {\n this.options[action][optionName] = newValue;\n }\n\n return this;\n }\n\n return this.options[optionName];\n }\n\n /*\\\n * Interactable.origin\n [ method ]\n *\n * Gets or sets the origin of the Interactable's element. The x and y\n * of the origin will be subtracted from action event coordinates.\n *\n - origin (object | string) #optional An object eg. { x: 0, y: 0 } or string 'parent', 'self' or any CSS selector\n * OR\n - origin (Element) #optional An HTML or SVG Element whose rect will be used\n **\n = (object) The current origin or this Interactable\n \\*/\n origin (newValue) {\n return this._backCompatOption('origin', newValue);\n }\n\n /*\\\n * Interactable.deltaSource\n [ method ]\n *\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n - newValue (string) #optional Use 'client' if you will be scrolling while interacting; Use 'page' if you want autoScroll to work\n = (string | object) The current deltaSource or this Interactable\n \\*/\n deltaSource (newValue) {\n if (newValue === 'page' || newValue === 'client') {\n this.options.deltaSource = newValue;\n\n return this;\n }\n\n return this.options.deltaSource;\n }\n\n /*\\\n * Interactable.context\n [ method ]\n *\n * Gets the selector context Node of the Interactable. The default is `window.document`.\n *\n = (Node) The context Node of this Interactable\n **\n \\*/\n context () {\n return this._context;\n }\n\n inContext (element) {\n return (this._context === element.ownerDocument\n || nodeContains(this._context, element));\n }\n\n /*\\\n * Interactable.fire\n [ method ]\n *\n * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n - iEvent (InteractEvent) The InteractEvent object to be fired on this Interactable\n = (Interactable) this Interactable\n \\*/\n fire (iEvent) {\n this.events.fire(iEvent);\n\n return this;\n }\n\n _onOffMultiple (method, eventType, listener, options) {\n if (is.string(eventType) && eventType.search(' ') !== -1) {\n eventType = eventType.trim().split(/ +/);\n }\n\n if (is.array(eventType)) {\n for (let i = 0; i < eventType.length; i++) {\n this[method](eventType[i], listener, options);\n }\n\n return true;\n }\n\n if (is.object(eventType)) {\n for (const prop in eventType) {\n this[method](prop, eventType[prop], listener);\n }\n\n return true;\n }\n }\n\n /*\\\n * Interactable.on\n [ method ]\n *\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n - eventType (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) This Interactable\n \\*/\n on (eventType, listener, options) {\n if (this._onOffMultiple('on', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.on(eventType, listener);\n }\n // delegated event for selector\n else if (is.string(this.target)) {\n events.addDelegate(this.target, this._context, eventType, listener, options);\n }\n else {\n events.add(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.off\n [ method ]\n *\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n - eventType (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) This Interactable\n \\*/\n off (eventType, listener, options) {\n if (this._onOffMultiple('off', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n // if it is an action event type\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.off(eventType, listener);\n }\n // delegated event\n else if (is.string(this.target)) {\n events.removeDelegate(this.target, this._context, eventType, listener, options);\n }\n // remove listener from this Interatable's element\n else {\n events.remove(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.set\n [ method ]\n *\n * Reset the options of this Interactable\n - options (object) The new settings to apply\n = (object) This Interactable\n \\*/\n set (options) {\n if (!is.object(options)) {\n options = {};\n }\n\n this.options = extend({}, defaults.base);\n\n const perActions = extend({}, defaults.perAction);\n\n for (const actionName in actions.methodDict) {\n const methodName = actions.methodDict[actionName];\n\n this.options[actionName] = extend({}, defaults[actionName]);\n\n this.setPerAction(actionName, perActions);\n\n this[methodName](options[actionName]);\n }\n\n for (const setting of Interactable.settingsMethods) {\n this.options[setting] = defaults.base[setting];\n\n if (setting in options) {\n this[setting](options[setting]);\n }\n }\n\n signals.fire('set', {\n options,\n interactable: this,\n });\n\n return this;\n }\n\n /*\\\n * Interactable.unset\n [ method ]\n *\n * Remove this interactable from the list of interactables and remove\n * it's action capabilities and event listeners\n *\n = (object) @interact\n \\*/\n unset () {\n events.remove(this.target, 'all');\n\n if (is.string(this.target)) {\n // remove delegated events\n for (const type in events.delegatedEvents) {\n const delegated = events.delegatedEvents[type];\n\n if (delegated.selectors[0] === this.target\n && delegated.contexts[0] === this._context) {\n\n delegated.selectors.splice(0, 1);\n delegated.contexts .splice(0, 1);\n delegated.listeners.splice(0, 1);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegated[type] = null;\n }\n }\n\n events.remove(this._context, type, events.delegateListener);\n events.remove(this._context, type, events.delegateUseCapture, true);\n }\n }\n else {\n events.remove(this, 'all');\n }\n\n signals.fire('unset', { interactable: this });\n\n scope.interactables.splice(indexOf(scope.interactables, this), 1);\n\n // Stop related interactions when an Interactable is unset\n for (const interaction of scope.interactions || []) {\n if (interaction.target === this && interaction.interacting()) {\n interaction.stop();\n }\n }\n\n return scope.interact;\n }\n}\n\nscope.interactables.indexOfElement = function indexOfElement (target, context) {\n context = context || scope.document;\n\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n if (interactable.target === target && interactable._context === context) {\n return i;\n }\n }\n return -1;\n};\n\nscope.interactables.get = function interactableGet (element, options, dontCheckInContext) {\n const ret = this[this.indexOfElement(element, options && options.context)];\n\n return ret && (is.string(element) || dontCheckInContext || ret.inContext(element))? ret : null;\n};\n\nscope.interactables.forEachSelector = function (callback, element) {\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n // skip non CSS selector targets and out of context elements\n if (!is.string(interactable.target)\n || (element && !interactable.inContext(element))) {\n continue;\n }\n\n const ret = callback(interactable, interactable.target, interactable._context, i, this);\n\n if (ret !== undefined) {\n return ret;\n }\n }\n};\n\n// all interact.js eventTypes\nInteractable.eventTypes = scope.eventTypes = [];\n\nInteractable.signals = signals;\n\nInteractable.settingsMethods = [ 'deltaSource', 'origin', 'preventDefault', 'rectChecker' ];\n\nmodule.exports = Interactable;\n","const scope = require('./scope');\nconst utils = require('./utils');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst finder = require('./utils/interactionFinder');\nconst signals = require('./utils/Signals').new();\n\nconst listeners = {};\nconst methodNames = [\n 'pointerDown', 'pointerMove', 'pointerUp',\n 'updatePointer', 'removePointer',\n];\n\n// for ignoring browser's simulated mouse events\nlet prevTouchTime = 0;\n\n// all active and idle interactions\nscope.interactions = [];\n\nclass Interaction {\n constructor () {\n this.target = null; // current interactable being interacted with\n this.element = null; // the target element of the interactable\n\n this.prepared = { // action that's ready to be fired on next move event\n name : null,\n axis : null,\n edges: null,\n };\n\n // keep track of added pointers\n this.pointers = [];\n this.pointerIds = [];\n this.downTargets = [];\n this.downTimes = [];\n\n // Previous native pointer move event coordinates\n this.prevCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n // current native pointer move event coordinates\n this.curCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Starting InteractEvent pointer coordinates\n this.startCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Change in coordinates and time of the pointer\n this.pointerDelta = {\n page : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n client : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n timeStamp: 0,\n };\n\n this.downEvent = null; // pointerdown/mousedown/touchstart event\n this.downPointer = {};\n\n this._eventTarget = null;\n this._curEventTarget = null;\n\n this.prevEvent = null; // previous action event\n\n this.pointerIsDown = false;\n this.pointerWasMoved = false;\n this._interacting = false;\n\n this.mouse = false;\n\n signals.fire('new', this);\n\n scope.interactions.push(this);\n }\n\n pointerDown (pointer, event, eventTarget) {\n const pointerIndex = this.updatePointer(pointer, event, true);\n\n signals.fire('down', {\n pointer,\n event,\n eventTarget,\n pointerIndex,\n interaction: this,\n });\n }\n\n /*\\\n * Interaction.start\n [ method ]\n *\n * Start an action with the given Interactable and Element as tartgets. The\n * action must be enabled for the target Interactable and an appropriate number\n * of pointers must be held down - 1 for drag/resize, 2 for gesture.\n *\n * Use it with `interactable.able({ manualStart: false })` to always\n * [start actions manually](https://github.com/taye/interact.js/issues/114)\n *\n - action (object) The action to be performed - drag, resize, etc.\n - target (Interactable) The Interactable to target\n - element (Element) The DOM Element to target\n = (object) interact\n **\n | interact(target)\n | .draggable({\n | // disable the default drag start by down->move\n | manualStart: true\n | })\n | // start dragging after the user holds the pointer down\n | .on('hold', function (event) {\n | var interaction = event.interaction;\n |\n | if (!interaction.interacting()) {\n | interaction.start({ name: 'drag' },\n | event.interactable,\n | event.currentTarget);\n | }\n | });\n \\*/\n start (action, target, element) {\n if (this.interacting()\n || !this.pointerIsDown\n || this.pointerIds.length < (action.name === 'gesture'? 2 : 1)) {\n return;\n }\n\n // if this interaction had been removed after stopping\n // add it back\n if (utils.indexOf(scope.interactions, this) === -1) {\n scope.interactions.push(this);\n }\n\n utils.copyAction(this.prepared, action);\n this.target = target;\n this.element = element;\n\n signals.fire('action-start', {\n interaction: this,\n event: this.downEvent,\n });\n }\n\n pointerMove (pointer, event, eventTarget) {\n if (!this.simulation) {\n this.updatePointer(pointer);\n utils.setCoords(this.curCoords, this.pointers);\n }\n\n const duplicateMove = (this.curCoords.page.x === this.prevCoords.page.x\n && this.curCoords.page.y === this.prevCoords.page.y\n && this.curCoords.client.x === this.prevCoords.client.x\n && this.curCoords.client.y === this.prevCoords.client.y);\n\n let dx;\n let dy;\n\n // register movement greater than pointerMoveTolerance\n if (this.pointerIsDown && !this.pointerWasMoved) {\n dx = this.curCoords.client.x - this.startCoords.client.x;\n dy = this.curCoords.client.y - this.startCoords.client.y;\n\n this.pointerWasMoved = utils.hypot(dx, dy) > Interaction.pointerMoveTolerance;\n }\n\n const signalArg = {\n pointer,\n pointerIndex: this.getPointerIndex(pointer),\n event,\n eventTarget,\n dx,\n dy,\n duplicate: duplicateMove,\n interaction: this,\n interactingBeforeMove: this.interacting(),\n };\n\n if (!duplicateMove) {\n // set pointer coordinate, time changes and speeds\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n }\n\n signals.fire('move', signalArg);\n\n if (!duplicateMove) {\n // if interacting, fire an 'action-move' signal etc\n if (this.interacting()) {\n this.doMove(signalArg);\n }\n\n if (this.pointerWasMoved) {\n utils.copyCoords(this.prevCoords, this.curCoords);\n }\n }\n }\n\n /*\\\n * Interaction.doMove\n [ method ]\n *\n * Force a move of the current action at the same coordinates. Useful if\n * snap/restrict has been changed and you want a movement with the new\n * settings.\n *\n **\n | interact(target)\n | .draggable(true)\n | .on('dragmove', function (event) {\n | if (someCondition) {\n | // change the snap settings\n | event.interactable.draggable({ snap: { targets: [] }});\n | // fire another move event with re-calculated snap\n | event.interaction.doMove();\n | }\n | });\n \\*/\n doMove (signalArg) {\n signalArg = utils.extend({\n pointer: this.pointers[0],\n event: this.prevEvent,\n eventTarget: this._eventTarget,\n interaction: this,\n }, signalArg || {});\n\n signals.fire('before-action-move', signalArg);\n\n if (!this._dontFireMove) {\n signals.fire('action-move', signalArg);\n }\n\n this._dontFireMove = false;\n }\n\n // End interact move events and stop auto-scroll unless simulation is running\n pointerUp (pointer, event, eventTarget, curEventTarget) {\n const pointerIndex = this.getPointerIndex(pointer);\n\n signals.fire(/cancel$/i.test(event.type)? 'cancel' : 'up', {\n pointer,\n pointerIndex,\n event,\n eventTarget,\n curEventTarget,\n interaction: this,\n });\n\n if (!this.simulation) {\n this.end(event);\n }\n\n this.pointerIsDown = false;\n this.removePointer(pointer, event);\n }\n\n /*\\\n * Interaction.end\n [ method ]\n *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n - event (PointerEvent) #optional\n **\n | interact(target)\n | .draggable(true)\n | .on('move', function (event) {\n | if (event.pageX > 1000) {\n | // end the current action\n | event.interaction.end();\n | // stop all further listeners from being called\n | event.stopImmediatePropagation();\n | }\n | });\n \\*/\n end (event) {\n event = event || this.prevEvent;\n\n if (this.interacting()) {\n signals.fire('action-end', {\n event,\n interaction: this,\n });\n }\n\n this.stop();\n }\n\n currentAction () {\n return this._interacting? this.prepared.name: null;\n }\n\n interacting () {\n return this._interacting;\n }\n\n stop () {\n signals.fire('stop', { interaction: this });\n\n if (this._interacting) {\n signals.fire('stop-active', { interaction: this });\n signals.fire('stop-' + this.prepared.name, { interaction: this });\n }\n\n this.target = this.element = null;\n\n this._interacting = false;\n this.prepared.name = this.prevEvent = null;\n }\n\n getPointerIndex (pointer) {\n return utils.indexOf(this.pointerIds, utils.getPointerId(pointer));\n }\n\n updatePointer (pointer, event, down = event && /(down|start)$/i.test(event.type)) {\n const id = utils.getPointerId(pointer);\n let index = this.getPointerIndex(pointer);\n\n if (index === -1) {\n index = this.pointerIds.length;\n this.pointerIds[index] = id;\n }\n\n if (down) {\n signals.fire('update-pointer-down', {\n pointer,\n event,\n down,\n pointerId: id,\n pointerIndex: index,\n interaction: this,\n });\n }\n\n this.pointers[index] = pointer;\n\n return index;\n }\n\n removePointer (pointer, event) {\n const id = utils.getPointerId(pointer);\n const index = this.mouse? 0 : utils.indexOf(this.pointerIds, id);\n\n if (index === -1) { return; }\n\n signals.fire('remove-pointer', {\n pointer,\n event,\n pointerIndex: index,\n interaction: this,\n });\n\n this.pointers .splice(index, 1);\n this.pointerIds .splice(index, 1);\n this.downTargets.splice(index, 1);\n this.downTimes .splice(index, 1);\n }\n\n _updateEventTargets (target, currentTarget) {\n this._eventTarget = target;\n this._curEventTarget = currentTarget;\n }\n}\n\nfor (let i = 0, len = methodNames.length; i < len; i++) {\n const method = methodNames[i];\n\n listeners[method] = doOnInteractions(method);\n}\n\nfunction doOnInteractions (method) {\n return (function (event) {\n const [eventTarget, curEventTarget] = utils.getEventTargets(event);\n const matches = []; // [ [pointer, interaction], ...]\n\n if (browser.supportsTouch && /touch/.test(event.type)) {\n prevTouchTime = new Date().getTime();\n\n for (let i = 0; i < event.changedTouches.length; i++) {\n const pointer = event.changedTouches[i];\n const interaction = finder.search(pointer, event.type, eventTarget);\n\n matches.push([pointer, interaction || new Interaction()]);\n }\n }\n else {\n let invalidPointer = false;\n\n if (!browser.supportsPointerEvent && /mouse/.test(event.type)) {\n // ignore mouse events while touch interactions are active\n for (let i = 0; i < scope.interactions.length && !invalidPointer; i++) {\n invalidPointer = !scope.interactions[i].mouse && scope.interactions[i].pointerIsDown;\n }\n\n // try to ignore mouse events that are simulated by the browser\n // after a touch event\n invalidPointer = invalidPointer\n || (new Date().getTime() - prevTouchTime < 500)\n // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated\n || event.timeStamp === 0;\n }\n\n if (!invalidPointer) {\n let interaction = finder.search(event, event.type, eventTarget);\n\n if (!interaction) {\n\n interaction = new Interaction();\n interaction.mouse = (/mouse/i.test(event.pointerType || event.type)\n // MSPointerEvent.MSPOINTER_TYPE_MOUSE\n || event.pointerType === 4\n || !event.pointerType);\n }\n\n matches.push([event, interaction]);\n }\n }\n\n for (const [pointer, interaction] of matches) {\n interaction._updateEventTargets(eventTarget, curEventTarget);\n interaction[method](pointer, event, eventTarget, curEventTarget);\n }\n });\n}\n\nfunction endAll (event) {\n for (let i = 0; i < scope.interactions.length; i++) {\n const interaction = scope.interactions[i];\n\n interaction.end(event);\n signals.fire('endall', { event, interaction });\n }\n}\n\nconst docEvents = { /* 'eventType': listenerFunc */ };\nconst pEventTypes = browser.pEventTypes;\n\nif (scope.PointerEvent) {\n docEvents[pEventTypes.down ] = listeners.pointerDown;\n docEvents[pEventTypes.move ] = listeners.pointerMove;\n docEvents[pEventTypes.up ] = listeners.pointerUp;\n docEvents[pEventTypes.cancel] = listeners.pointerUp;\n}\nelse {\n docEvents.mousedown = listeners.pointerDown;\n docEvents.mousemove = listeners.pointerMove;\n docEvents.mouseup = listeners.pointerUp;\n\n docEvents.touchstart = listeners.pointerDown;\n docEvents.touchmove = listeners.pointerMove;\n docEvents.touchend = listeners.pointerUp;\n docEvents.touchcancel = listeners.pointerUp;\n}\n\ndocEvents.blur = endAll;\n\nfunction onDocSignal ({ doc }, signalName) {\n const eventMethod = signalName.indexOf('add') === 0\n ? events.add : events.remove;\n\n // delegate event listener\n for (const eventType in scope.delegatedEvents) {\n eventMethod(doc, eventType, events.delegateListener);\n eventMethod(doc, eventType, events.delegateUseCapture, true);\n }\n\n for (const eventType in docEvents) {\n eventMethod(doc, eventType, docEvents[eventType]);\n }\n}\n\nsignals.on('update-pointer-down', ({ interaction, pointer, pointerId, pointerIndex, event, eventTarget, down }) => {\n interaction.pointerIds[pointerIndex] = pointerId;\n interaction.pointers[pointerIndex] = pointer;\n\n if (down) {\n interaction.pointerIsDown = true;\n }\n\n if (!interaction.interacting()) {\n utils.setCoords(interaction.startCoords, interaction.pointers);\n\n utils.copyCoords(interaction.curCoords , interaction.startCoords);\n utils.copyCoords(interaction.prevCoords, interaction.startCoords);\n\n interaction.downEvent = event;\n interaction.downTimes[pointerIndex] = interaction.curCoords.timeStamp;\n interaction.downTargets[pointerIndex] = eventTarget || event && utils.getEventTargets(event)[0];\n interaction.pointerWasMoved = false;\n\n utils.pointerExtend(interaction.downPointer, pointer);\n }\n});\n\nscope.signals.on('add-document' , onDocSignal);\nscope.signals.on('remove-document', onDocSignal);\n\nInteraction.pointerMoveTolerance = 1;\nInteraction.doOnInteractions = doOnInteractions;\nInteraction.endAll = endAll;\nInteraction.signals = signals;\nInteraction.docEvents = docEvents;\n\nscope.endAllInteractions = endAll;\n\nmodule.exports = Interaction;\n","const Interaction = require('../Interaction');\nconst InteractEvent = require('../InteractEvent');\n\nconst actions = {\n firePrepared,\n names: [],\n methodDict: {},\n};\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n interaction._interacting = true;\n firePrepared(interaction, event, 'start');\n});\n\nInteraction.signals.on('action-move', function ({ interaction, event, preEnd }) {\n firePrepared(interaction, event, 'move', preEnd);\n\n // if the action was ended in a listener\n if (!interaction.interacting()) { return false; }\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n firePrepared(interaction, event, 'end');\n});\n\nfunction firePrepared (interaction, event, phase, preEnd) {\n const actionName = interaction.prepared.name;\n\n const newEvent = new InteractEvent(interaction, event, actionName, phase, interaction.element, null, preEnd);\n\n interaction.target.fire(newEvent);\n interaction.prevEvent = newEvent;\n}\n\nmodule.exports = actions;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drag = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n startAxis : 'xy',\n lockAxis : 'xy',\n },\n\n checker: function (pointer, event, interactable) {\n const dragOptions = interactable.options.drag;\n\n return dragOptions.enabled\n ? { name: 'drag', axis: (dragOptions.lockAxis === 'start'\n ? dragOptions.startAxis\n : dragOptions.lockAxis)}\n : null;\n },\n\n getCursor: function () {\n return 'move';\n },\n};\n\nInteraction.signals.on('before-action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n interaction.curCoords.page.y = interaction.startCoords.page.y;\n interaction.curCoords.client.y = interaction.startCoords.client.y;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vx);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vx);\n interaction.pointerDelta.client.vy = 0;\n interaction.pointerDelta.page.vy = 0;\n }\n else if (axis === 'y') {\n interaction.curCoords.page.x = interaction.startCoords.page.x;\n interaction.curCoords.client.x = interaction.startCoords.client.x;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vy);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vy);\n interaction.pointerDelta.client.vx = 0;\n interaction.pointerDelta.page.vx = 0;\n }\n});\n\n// dragmove\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'dragmove') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n iEvent.pageY = interaction.startCoords.page.y;\n iEvent.clientY = interaction.startCoords.client.y;\n iEvent.dy = 0;\n }\n else if (axis === 'y') {\n iEvent.pageX = interaction.startCoords.page.x;\n iEvent.clientX = interaction.startCoords.client.x;\n iEvent.dx = 0;\n }\n});\n\n/*\\\n * Interactable.draggable\n [ method ]\n *\n * Gets or sets whether drag actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of drag events\n | var isDraggable = interact('ul li').draggable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on drag events (object makes the Interactable draggable)\n = (object) This Interactable\n | interact(element).draggable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // the axis in which the first movement must be\n | // for the drag sequence to start\n | // 'xy' by default - any direction\n | startAxis: 'x' || 'y' || 'xy',\n |\n | // 'xy' by default - don't restrict to one axis (move in any direction)\n | // 'x' or 'y' to restrict movement to either axis\n | // 'start' to restrict movement to the axis the drag started in\n | lockAxis: 'x' || 'y' || 'xy' || 'start',\n |\n | // max number of drags that can happen concurrently\n | // with elements of this Interactable. Infinity by default\n | max: Infinity,\n |\n | // max number of drags that can target the same element+Interactable\n | // 1 by default\n | maxPerElement: 2\n | });\n\\*/\nInteractable.prototype.draggable = function (options) {\n if (utils.is.object(options)) {\n this.options.drag.enabled = options.enabled === false? false: true;\n this.setPerAction('drag', options);\n this.setOnEvents('drag', options);\n\n if (/^(xy|x|y|start)$/.test(options.lockAxis)) {\n this.options.drag.lockAxis = options.lockAxis;\n }\n if (/^(xy|x|y)$/.test(options.startAxis)) {\n this.options.drag.startAxis = options.startAxis;\n }\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drag.enabled = options;\n\n if (!options) {\n this.ondragstart = this.ondragstart = this.ondragend = null;\n }\n\n return this;\n }\n\n return this.options.drag;\n};\n\nactions.drag = drag;\nactions.names.push('drag');\nutils.merge(Interactable.eventTypes, [\n 'dragstart',\n 'dragmove',\n 'draginertiastart',\n 'draginertiaresume',\n 'dragend',\n]);\nactions.methodDict.drag = 'draggable';\n\ndefaultOptions.drag = drag.defaults;\n\nmodule.exports = drag;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst scope = require('../scope');\nconst interact = require('../interact');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drop = {\n defaults: {\n enabled: false,\n accept : null,\n overlap: 'pointer',\n },\n};\n\nlet dynamicDrop = false;\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // reset active dropzones\n interaction.activeDrops.dropzones = [];\n interaction.activeDrops.elements = [];\n interaction.activeDrops.rects = [];\n\n interaction.dropEvents = null;\n\n if (!interaction.dynamicDrop) {\n setActiveDrops(interaction, interaction.element);\n }\n\n const dragEvent = interaction.prevEvent;\n const dropEvents = getDropEvents(interaction, event, dragEvent);\n\n if (dropEvents.activate) {\n fireActiveDrops(interaction, dropEvents.activate);\n }\n});\n\nInteractEvent.signals.on('new', function ({ interaction, iEvent, event }) {\n if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { return; }\n\n const draggableElement = interaction.element;\n const dragEvent = iEvent;\n const dropResult = getDrop(dragEvent, event, draggableElement);\n\n interaction.dropTarget = dropResult.dropzone;\n interaction.dropElement = dropResult.element;\n\n interaction.dropEvents = getDropEvents(interaction, event, dragEvent);\n});\n\nInteraction.signals.on('action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n fireDropEvents(interaction, interaction.dropEvents);\n});\n\nInteraction.signals.on('action-end', function ({ interaction }) {\n if (interaction.prepared.name === 'drag') {\n fireDropEvents(interaction, interaction.dropEvents);\n }\n});\n\nInteraction.signals.on('stop-drag', function ({ interaction }) {\n interaction.activeDrops.dropzones =\n interaction.activeDrops.elements =\n interaction.activeDrops.rects =\n interaction.dropEvents = null;\n});\n\nfunction collectDrops (interaction, element) {\n const drops = [];\n const elements = [];\n\n element = element || interaction.element;\n\n // collect all dropzones and their elements which qualify for a drop\n for (const current of scope.interactables) {\n if (!current.options.drop.enabled) { continue; }\n\n const accept = current.options.drop.accept;\n\n // test the draggable element against the dropzone's accept setting\n if ((utils.is.element(accept) && accept !== element)\n || (utils.is.string(accept)\n && !utils.matchesSelector(element, accept))) {\n\n continue;\n }\n\n // query for new elements if necessary\n const dropElements = utils.is.string(current.target)\n ? current._context.querySelectorAll(current.target)\n : [current.target];\n\n for (let i = 0; i < dropElements.length; i++) {\n const currentElement = dropElements[i];\n\n if (currentElement !== element) {\n drops.push(current);\n elements.push(currentElement);\n }\n }\n }\n\n return {\n elements,\n dropzones: drops,\n };\n}\n\nfunction fireActiveDrops (interaction, event) {\n let prevElement;\n\n // loop through all active dropzones and trigger event\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n const current = interaction.activeDrops.dropzones[i];\n const currentElement = interaction.activeDrops.elements [i];\n\n // prevent trigger of duplicate events on same element\n if (currentElement !== prevElement) {\n // set current element as event target\n event.target = currentElement;\n current.fire(event);\n }\n prevElement = currentElement;\n }\n}\n\n// Collect a new set of possible drops and save them in activeDrops.\n// setActiveDrops should always be called when a drag has just started or a\n// drag event happens while dynamicDrop is true\nfunction setActiveDrops (interaction, dragElement) {\n // get dropzones and their elements that could receive the draggable\n const possibleDrops = collectDrops(interaction, dragElement, true);\n\n interaction.activeDrops.dropzones = possibleDrops.dropzones;\n interaction.activeDrops.elements = possibleDrops.elements;\n interaction.activeDrops.rects = [];\n\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n interaction.activeDrops.rects[i] =\n interaction.activeDrops.dropzones[i].getRect(interaction.activeDrops.elements[i]);\n }\n}\n\nfunction getDrop (dragEvent, event, dragElement) {\n const interaction = dragEvent.interaction;\n const validDrops = [];\n\n if (dynamicDrop) {\n setActiveDrops(interaction, dragElement);\n }\n\n // collect all dropzones and their elements which qualify for a drop\n for (let j = 0; j < interaction.activeDrops.dropzones.length; j++) {\n const current = interaction.activeDrops.dropzones[j];\n const currentElement = interaction.activeDrops.elements [j];\n const rect = interaction.activeDrops.rects [j];\n\n validDrops.push(current.dropCheck(dragEvent, event, interaction.target, dragElement, currentElement, rect)\n ? currentElement\n : null);\n }\n\n // get the most appropriate dropzone based on DOM depth and order\n const dropIndex = utils.indexOfDeepestElement(validDrops);\n\n return {\n dropzone: interaction.activeDrops.dropzones[dropIndex] || null,\n element : interaction.activeDrops.elements [dropIndex] || null,\n };\n}\n\nfunction getDropEvents (interaction, pointerEvent, dragEvent) {\n const dropEvents = {\n enter : null,\n leave : null,\n activate : null,\n deactivate: null,\n move : null,\n drop : null,\n };\n\n const tmpl = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n };\n\n if (interaction.dropElement !== interaction.prevDropElement) {\n // if there was a prevDropTarget, create a dragleave event\n if (interaction.prevDropTarget) {\n dropEvents.leave = utils.extend({ type: 'dragleave' }, tmpl);\n\n dragEvent.dragLeave = dropEvents.leave.target = interaction.prevDropElement;\n dragEvent.prevDropzone = dropEvents.leave.dropzone = interaction.prevDropTarget;\n }\n // if the dropTarget is not null, create a dragenter event\n if (interaction.dropTarget) {\n dropEvents.enter = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n type : 'dragenter',\n };\n\n dragEvent.dragEnter = interaction.dropElement;\n dragEvent.dropzone = interaction.dropTarget;\n }\n }\n\n if (dragEvent.type === 'dragend' && interaction.dropTarget) {\n dropEvents.drop = utils.extend({ type: 'drop' }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n dragEvent.relatedTarget = interaction.dropElement;\n }\n if (dragEvent.type === 'dragstart') {\n dropEvents.activate = utils.extend({ type: 'dropactivate' }, tmpl);\n\n dropEvents.activate.target = null;\n dropEvents.activate.dropzone = null;\n }\n if (dragEvent.type === 'dragend') {\n dropEvents.deactivate = utils.extend({ type: 'dropdeactivate' }, tmpl);\n\n dropEvents.deactivate.target = null;\n dropEvents.deactivate.dropzone = null;\n }\n if (dragEvent.type === 'dragmove' && interaction.dropTarget) {\n dropEvents.move = utils.extend({\n dragmove : dragEvent,\n type : 'dropmove',\n }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n }\n\n return dropEvents;\n}\n\nfunction fireDropEvents (interaction, dropEvents) {\n if (dropEvents.leave) { interaction.prevDropTarget.fire(dropEvents.leave); }\n if (dropEvents.move ) { interaction.dropTarget.fire(dropEvents.move ); }\n if (dropEvents.enter) { interaction.dropTarget.fire(dropEvents.enter); }\n if (dropEvents.drop ) { interaction.dropTarget.fire(dropEvents.drop ); }\n if (dropEvents.deactivate) {\n fireActiveDrops(interaction, dropEvents.deactivate);\n }\n\n interaction.prevDropTarget = interaction.dropTarget;\n interaction.prevDropElement = interaction.dropElement;\n}\n\n/*\\\n * Interactable.dropzone\n [ method ]\n *\n * Returns or sets whether elements can be dropped onto this\n * Interactable to trigger drop events\n *\n * Dropzones can receive the following events:\n * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends\n * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone\n * - `dragmove` when a draggable that has entered the dropzone is moved\n * - `drop` when a draggable is dropped into this dropzone\n *\n * Use the `accept` option to allow only elements that match the given CSS\n * selector or element. The value can be:\n *\n * - **an Element** - only that element can be dropped into this dropzone.\n * - **a string**, - the element being dragged must match it as a CSS selector.\n * - **`null`** - accept options is cleared - it accepts any element.\n *\n * Use the `overlap` option to set how drops are checked for. The allowed\n * values are:\n *\n * - `'pointer'`, the pointer must be over the dropzone (default)\n * - `'center'`, the draggable element's center must be over the dropzone\n * - a number from 0-1 which is the `(intersection area) / (draggable area)`.\n * e.g. `0.5` for drop to happen when half of the area of the draggable is\n * over the dropzone\n *\n * Use the `checker` option to specify a function to check if a dragged\n * element is over this Interactable.\n *\n | interact(target)\n | .dropChecker(function(dragEvent, // related dragmove or dragend event\n | event, // TouchEvent/PointerEvent/MouseEvent\n | dropped, // bool result of the default checker\n | dropzone, // dropzone Interactable\n | dropElement, // dropzone elemnt\n | draggable, // draggable Interactable\n | draggableElement) {// draggable element\n |\n | return dropped && event.target.hasAttribute('allow-drop');\n | }\n *\n *\n - options (boolean | object | null) #optional The new value to be set.\n | interact('.drop').dropzone({\n | accept: '.can-drop' || document.getElementById('single-drop'),\n | overlap: 'pointer' || 'center' || zeroToOne\n | }\n = (boolean | object) The current setting or this Interactable\n\\*/\nInteractable.prototype.dropzone = function (options) {\n if (utils.is.object(options)) {\n this.options.drop.enabled = options.enabled === false? false: true;\n\n if (utils.is.function(options.ondrop) ) { this.events.ondrop = options.ondrop ; }\n if (utils.is.function(options.ondropactivate) ) { this.events.ondropactivate = options.ondropactivate ; }\n if (utils.is.function(options.ondropdeactivate)) { this.events.ondropdeactivate = options.ondropdeactivate; }\n if (utils.is.function(options.ondragenter) ) { this.events.ondragenter = options.ondragenter ; }\n if (utils.is.function(options.ondragleave) ) { this.events.ondragleave = options.ondragleave ; }\n if (utils.is.function(options.ondropmove) ) { this.events.ondropmove = options.ondropmove ; }\n\n if (/^(pointer|center)$/.test(options.overlap)) {\n this.options.drop.overlap = options.overlap;\n }\n else if (utils.is.number(options.overlap)) {\n this.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0);\n }\n if ('accept' in options) {\n this.options.drop.accept = options.accept;\n }\n if ('checker' in options) {\n this.options.drop.checker = options.checker;\n }\n\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drop.enabled = options;\n\n if (!options) {\n this.ondragenter = this.ondragleave = this.ondrop\n = this.ondropactivate = this.ondropdeactivate = null;\n }\n\n return this;\n }\n\n return this.options.drop;\n};\n\nInteractable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) {\n let dropped = false;\n\n // if the dropzone has no rect (eg. display: none)\n // call the custom dropChecker or just return false\n if (!(rect = rect || this.getRect(dropElement))) {\n return (this.options.drop.checker\n ? this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement)\n : false);\n }\n\n const dropOverlap = this.options.drop.overlap;\n\n if (dropOverlap === 'pointer') {\n const origin = utils.getOriginXY(draggable, draggableElement, 'drag');\n const page = utils.getPageXY(dragEvent);\n\n page.x += origin.x;\n page.y += origin.y;\n\n const horizontal = (page.x > rect.left) && (page.x < rect.right);\n const vertical = (page.y > rect.top ) && (page.y < rect.bottom);\n\n dropped = horizontal && vertical;\n }\n\n const dragRect = draggable.getRect(draggableElement);\n\n if (dragRect && dropOverlap === 'center') {\n const cx = dragRect.left + dragRect.width / 2;\n const cy = dragRect.top + dragRect.height / 2;\n\n dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom;\n }\n\n if (dragRect && utils.is.number(dropOverlap)) {\n const overlapArea = (Math.max(0, Math.min(rect.right , dragRect.right ) - Math.max(rect.left, dragRect.left))\n * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top , dragRect.top )));\n\n const overlapRatio = overlapArea / (dragRect.width * dragRect.height);\n\n dropped = overlapRatio >= dropOverlap;\n }\n\n if (this.options.drop.checker) {\n dropped = this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement);\n }\n\n return dropped;\n};\n\nInteractable.signals.on('unset', function ({ interactable }) {\n interactable.dropzone(false);\n});\n\nInteractable.settingsMethods.push('dropChecker');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.dropTarget = null; // the dropzone a drag target might be dropped into\n interaction.dropElement = null; // the element at the time of checking\n interaction.prevDropTarget = null; // the dropzone that was recently dragged away from\n interaction.prevDropElement = null; // the element at the time of checking\n interaction.dropEvents = null; // the dropEvents related to the current drag event\n\n interaction.activeDrops = {\n dropzones: [], // the dropzones that are mentioned below\n elements : [], // elements of dropzones that accept the target draggable\n rects : [], // the rects of the elements mentioned above\n };\n\n});\n\nInteraction.signals.on('stop', function ({ interaction }) {\n interaction.dropTarget = interaction.dropElement =\n interaction.prevDropTarget = interaction.prevDropElement = null;\n});\n\n/*\\\n * interact.dynamicDrop\n [ method ]\n *\n * Returns or sets whether the dimensions of dropzone elements are\n * calculated on every dragmove or only on dragstart for the default\n * dropChecker\n *\n - newValue (boolean) #optional True to check on each move. False to check only before start\n = (boolean | interact) The current setting or interact\n\\*/\ninteract.dynamicDrop = function (newValue) {\n if (utils.is.bool(newValue)) {\n //if (dragging && dynamicDrop !== newValue && !newValue) {\n //calcRects(dropzones);\n //}\n\n dynamicDrop = newValue;\n\n return interact;\n }\n return dynamicDrop;\n};\n\nutils.merge(Interactable.eventTypes, [\n 'dragenter',\n 'dragleave',\n 'dropactivate',\n 'dropdeactivate',\n 'dropmove',\n 'drop',\n]);\nactions.methodDict.drop = 'dropzone';\n\ndefaultOptions.drop = drop.defaults;\n\nmodule.exports = drop;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst gesture = {\n defaults: {\n enabled : false,\n origin : null,\n restrict: null,\n },\n\n checker: function (pointer, event, interactable, element, interaction) {\n if (interaction.pointerIds.length >= 2) {\n return { name: 'gesture' };\n }\n\n return null;\n },\n\n getCursor: function () {\n return '';\n },\n};\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturestart') { return; }\n iEvent.ds = 0;\n\n interaction.gesture.startDistance = interaction.gesture.prevDistance = iEvent.distance;\n interaction.gesture.startAngle = interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.scale = 1;\n});\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturemove') { return; }\n\n iEvent.ds = iEvent.scale - interaction.gesture.scale;\n\n interaction.target.fire(iEvent);\n\n interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.prevDistance = iEvent.distance;\n\n if (iEvent.scale !== Infinity\n && iEvent.scale !== null\n && iEvent.scale !== undefined\n && !isNaN(iEvent.scale)) {\n\n interaction.gesture.scale = iEvent.scale;\n }\n});\n\n/*\\\n * Interactable.gesturable\n [ method ]\n *\n * Gets or sets whether multitouch gestures can be performed on the\n * Interactable's element\n *\n = (boolean) Indicates if this can be the target of gesture events\n | var isGestureable = interact(element).gesturable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on gesture events (makes the Interactable gesturable)\n = (object) this Interactable\n | interact(element).gesturable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // limit multiple gestures.\n | // See the explanation in @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n\\*/\nInteractable.prototype.gesturable = function (options) {\n if (utils.is.object(options)) {\n this.options.gesture.enabled = options.enabled === false? false: true;\n this.setPerAction('gesture', options);\n this.setOnEvents('gesture', options);\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.gesture.enabled = options;\n\n if (!options) {\n this.ongesturestart = this.ongesturestart = this.ongestureend = null;\n }\n\n return this;\n }\n\n return this.options.gesture;\n};\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action, event, starting, ending, deltaSource }) {\n if (action !== 'gesture') { return; }\n\n const pointers = interaction.pointers;\n\n iEvent.touches = [pointers[0], pointers[1]];\n\n if (starting) {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = 1;\n iEvent.ds = 0;\n iEvent.angle = utils.touchAngle(pointers, undefined, deltaSource);\n iEvent.da = 0;\n }\n else if (ending || event instanceof InteractEvent) {\n iEvent.distance = interaction.prevEvent.distance;\n iEvent.box = interaction.prevEvent.box;\n iEvent.scale = interaction.prevEvent.scale;\n iEvent.ds = iEvent.scale - 1;\n iEvent.angle = interaction.prevEvent.angle;\n iEvent.da = iEvent.angle - interaction.gesture.startAngle;\n }\n else {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = iEvent.distance / interaction.gesture.startDistance;\n iEvent.angle = utils.touchAngle(pointers, interaction.gesture.prevAngle, deltaSource);\n\n iEvent.ds = iEvent.scale - interaction.gesture.prevScale;\n iEvent.da = iEvent.angle - interaction.gesture.prevAngle;\n }\n});\n\nInteraction.signals.on('new', function (interaction) {\n interaction.gesture = {\n start: { x: 0, y: 0 },\n\n startDistance: 0, // distance between two touches of touchStart\n prevDistance : 0,\n distance : 0,\n\n scale: 1, // gesture.distance / gesture.startDistance\n\n startAngle: 0, // angle of line joining two touches\n prevAngle : 0, // angle of the previous gesture event\n };\n});\n\nactions.gesture = gesture;\nactions.names.push('gesture');\nutils.merge(Interactable.eventTypes, [\n 'gesturestart',\n 'gesturemove',\n 'gestureend',\n]);\nactions.methodDict.gesture = 'gesturable';\n\ndefaultOptions.gesture = gesture.defaults;\n\nmodule.exports = gesture;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\n// Less Precision with touch input\nconst defaultMargin = browser.supportsTouch || browser.supportsPointerEvent? 20: 10;\n\nconst resize = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n square: false,\n preserveAspectRatio: false,\n axis: 'xy',\n\n // use default margin\n margin: NaN,\n\n // object with props left, right, top, bottom which are\n // true/false values to resize when the pointer is over that edge,\n // CSS selectors to match the handles for each direction\n // or the Elements for each handle\n edges: null,\n\n // a value of 'none' will limit the resize rect to a minimum of 0x0\n // 'negate' will alow the rect to have negative width/height\n // 'reposition' will keep the width/height positive by swapping\n // the top and bottom edges and/or swapping the left and right edges\n invert: 'none',\n },\n\n checker: function (pointer, event, interactable, element, interaction, rect) {\n if (!rect) { return null; }\n\n const page = utils.extend({}, interaction.curCoords.page);\n const options = interactable.options;\n\n if (options.resize.enabled) {\n const resizeOptions = options.resize;\n const resizeEdges = { left: false, right: false, top: false, bottom: false };\n\n // if using resize.edges\n if (utils.is.object(resizeOptions.edges)) {\n for (const edge in resizeEdges) {\n resizeEdges[edge] = checkResizeEdge(edge,\n resizeOptions.edges[edge],\n page,\n interaction._eventTarget,\n element,\n rect,\n resizeOptions.margin || defaultMargin);\n }\n\n resizeEdges.left = resizeEdges.left && !resizeEdges.right;\n resizeEdges.top = resizeEdges.top && !resizeEdges.bottom;\n\n if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) {\n return {\n name: 'resize',\n edges: resizeEdges,\n };\n }\n }\n else {\n const right = options.resize.axis !== 'y' && page.x > (rect.right - defaultMargin);\n const bottom = options.resize.axis !== 'x' && page.y > (rect.bottom - defaultMargin);\n\n if (right || bottom) {\n return {\n name: 'resize',\n axes: (right? 'x' : '') + (bottom? 'y' : ''),\n };\n }\n }\n }\n\n return null;\n },\n\n cursors: (browser.isIe9OrOlder ? {\n x : 'e-resize',\n y : 's-resize',\n xy: 'se-resize',\n\n top : 'n-resize',\n left : 'w-resize',\n bottom : 's-resize',\n right : 'e-resize',\n topleft : 'se-resize',\n bottomright: 'se-resize',\n topright : 'ne-resize',\n bottomleft : 'ne-resize',\n } : {\n x : 'ew-resize',\n y : 'ns-resize',\n xy: 'nwse-resize',\n\n top : 'ns-resize',\n left : 'ew-resize',\n bottom : 'ns-resize',\n right : 'ew-resize',\n topleft : 'nwse-resize',\n bottomright: 'nwse-resize',\n topright : 'nesw-resize',\n bottomleft : 'nesw-resize',\n }),\n\n getCursor: function (action) {\n if (action.axis) {\n return resize.cursors[action.name + action.axis];\n }\n else if (action.edges) {\n let cursorKey = '';\n const edgeNames = ['top', 'bottom', 'left', 'right'];\n\n for (let i = 0; i < 4; i++) {\n if (action.edges[edgeNames[i]]) {\n cursorKey += edgeNames[i];\n }\n }\n\n return resize.cursors[cursorKey];\n }\n },\n};\n\n// resizestart\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'resizestart' || !interaction.prepared.edges) {\n return;\n }\n\n const startRect = interaction.target.getRect(interaction.element);\n const resizeOptions = interaction.target.options.resize;\n\n /*\n * When using the `resizable.square` or `resizable.preserveAspectRatio` options, resizing from one edge\n * will affect another. E.g. with `resizable.square`, resizing to make the right edge larger will make\n * the bottom edge larger by the same amount. We call these 'linked' edges. Any linked edges will depend\n * on the active edges and the edge being interacted with.\n */\n if (resizeOptions.square || resizeOptions.preserveAspectRatio) {\n const linkedEdges = utils.extend({}, interaction.prepared.edges);\n\n linkedEdges.top = linkedEdges.top || (linkedEdges.left && !linkedEdges.bottom);\n linkedEdges.left = linkedEdges.left || (linkedEdges.top && !linkedEdges.right );\n linkedEdges.bottom = linkedEdges.bottom || (linkedEdges.right && !linkedEdges.top );\n linkedEdges.right = linkedEdges.right || (linkedEdges.bottom && !linkedEdges.left );\n\n interaction.prepared._linkedEdges = linkedEdges;\n }\n else {\n interaction.prepared._linkedEdges = null;\n }\n\n // if using `resizable.preserveAspectRatio` option, record aspect ratio at the start of the resize\n if (resizeOptions.preserveAspectRatio) {\n interaction.resizeStartAspectRatio = startRect.width / startRect.height;\n }\n\n interaction.resizeRects = {\n start : startRect,\n current : utils.extend({}, startRect),\n inverted : utils.extend({}, startRect),\n previous : utils.extend({}, startRect),\n delta : {\n left: 0, right : 0, width : 0,\n top : 0, bottom: 0, height: 0,\n },\n };\n\n iEvent.rect = interaction.resizeRects.inverted;\n iEvent.deltaRect = interaction.resizeRects.delta;\n});\n\n// resizemove\nInteractEvent.signals.on('new', function ({ iEvent, phase, interaction }) {\n if (phase !== 'move' || !interaction.prepared.edges) { return; }\n\n const resizeOptions = interaction.target.options.resize;\n const invert = resizeOptions.invert;\n const invertible = invert === 'reposition' || invert === 'negate';\n\n let edges = interaction.prepared.edges;\n\n const start = interaction.resizeRects.start;\n const current = interaction.resizeRects.current;\n const inverted = interaction.resizeRects.inverted;\n const delta = interaction.resizeRects.delta;\n const previous = utils.extend(interaction.resizeRects.previous, inverted);\n const originalEdges = edges;\n\n let dx = iEvent.dx;\n let dy = iEvent.dy;\n\n if (resizeOptions.preserveAspectRatio || resizeOptions.square) {\n // `resize.preserveAspectRatio` takes precedence over `resize.square`\n const startAspectRatio = resizeOptions.preserveAspectRatio\n ? interaction.resizeStartAspectRatio\n : 1;\n\n edges = interaction.prepared._linkedEdges;\n\n if ((originalEdges.left && originalEdges.bottom)\n || (originalEdges.right && originalEdges.top)) {\n dy = -dx / startAspectRatio;\n }\n else if (originalEdges.left || originalEdges.right ) { dy = dx / startAspectRatio; }\n else if (originalEdges.top || originalEdges.bottom) { dx = dy * startAspectRatio; }\n }\n\n // update the 'current' rect without modifications\n if (edges.top ) { current.top += dy; }\n if (edges.bottom) { current.bottom += dy; }\n if (edges.left ) { current.left += dx; }\n if (edges.right ) { current.right += dx; }\n\n if (invertible) {\n // if invertible, copy the current rect\n utils.extend(inverted, current);\n\n if (invert === 'reposition') {\n // swap edge values if necessary to keep width/height positive\n let swap;\n\n if (inverted.top > inverted.bottom) {\n swap = inverted.top;\n\n inverted.top = inverted.bottom;\n inverted.bottom = swap;\n }\n if (inverted.left > inverted.right) {\n swap = inverted.left;\n\n inverted.left = inverted.right;\n inverted.right = swap;\n }\n }\n }\n else {\n // if not invertible, restrict to minimum of 0x0 rect\n inverted.top = Math.min(current.top, start.bottom);\n inverted.bottom = Math.max(current.bottom, start.top);\n inverted.left = Math.min(current.left, start.right);\n inverted.right = Math.max(current.right, start.left);\n }\n\n inverted.width = inverted.right - inverted.left;\n inverted.height = inverted.bottom - inverted.top ;\n\n for (const edge in inverted) {\n delta[edge] = inverted[edge] - previous[edge];\n }\n\n iEvent.edges = interaction.prepared.edges;\n iEvent.rect = inverted;\n iEvent.deltaRect = delta;\n});\n\n/*\\\n * Interactable.resizable\n [ method ]\n *\n * Gets or sets whether resize actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of resize elements\n | var isResizeable = interact('input[type=text]').resizable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on resize events (object makes the Interactable resizable)\n = (object) This Interactable\n | interact(element).resizable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | edges: {\n | top : true, // Use pointer coords to check for resize.\n | left : false, // Disable resizing from left edge.\n | bottom: '.resize-s',// Resize if pointer target matches selector\n | right : handleEl // Resize if pointer target is the given Element\n | },\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height are adjusted at a 1:1 ratio.\n | square: false,\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height maintain the aspect ratio they had when resizing started.\n | preserveAspectRatio: false,\n |\n | // a value of 'none' will limit the resize rect to a minimum of 0x0\n | // 'negate' will allow the rect to have negative width/height\n | // 'reposition' will keep the width/height positive by swapping\n | // the top and bottom edges and/or swapping the left and right edges\n | invert: 'none' || 'negate' || 'reposition'\n |\n | // limit multiple resizes.\n | // See the explanation in the @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n \\*/\nInteractable.prototype.resizable = function (options) {\n if (utils.is.object(options)) {\n this.options.resize.enabled = options.enabled === false? false: true;\n this.setPerAction('resize', options);\n this.setOnEvents('resize', options);\n\n if (/^x$|^y$|^xy$/.test(options.axis)) {\n this.options.resize.axis = options.axis;\n }\n else if (options.axis === null) {\n this.options.resize.axis = defaultOptions.resize.axis;\n }\n\n if (utils.is.bool(options.preserveAspectRatio)) {\n this.options.resize.preserveAspectRatio = options.preserveAspectRatio;\n }\n else if (utils.is.bool(options.square)) {\n this.options.resize.square = options.square;\n }\n\n return this;\n }\n if (utils.is.bool(options)) {\n this.options.resize.enabled = options;\n\n if (!options) {\n this.onresizestart = this.onresizestart = this.onresizeend = null;\n }\n\n return this;\n }\n return this.options.resize;\n};\n\nfunction checkResizeEdge (name, value, page, element, interactableElement, rect, margin) {\n // false, '', undefined, null\n if (!value) { return false; }\n\n // true value, use pointer coords and element rect\n if (value === true) {\n // if dimensions are negative, \"switch\" edges\n const width = utils.is.number(rect.width )? rect.width : rect.right - rect.left;\n const height = utils.is.number(rect.height)? rect.height : rect.bottom - rect.top ;\n\n if (width < 0) {\n if (name === 'left' ) { name = 'right'; }\n else if (name === 'right') { name = 'left' ; }\n }\n if (height < 0) {\n if (name === 'top' ) { name = 'bottom'; }\n else if (name === 'bottom') { name = 'top' ; }\n }\n\n if (name === 'left' ) { return page.x < ((width >= 0? rect.left: rect.right ) + margin); }\n if (name === 'top' ) { return page.y < ((height >= 0? rect.top : rect.bottom) + margin); }\n\n if (name === 'right' ) { return page.x > ((width >= 0? rect.right : rect.left) - margin); }\n if (name === 'bottom') { return page.y > ((height >= 0? rect.bottom: rect.top ) - margin); }\n }\n\n // the remaining checks require an element\n if (!utils.is.element(element)) { return false; }\n\n return utils.is.element(value)\n // the value is an element to use as a resize handle\n ? value === element\n // otherwise check if element matches value as selector\n : utils.matchesUpTo(element, value, interactableElement);\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.resizeAxes = 'xy';\n});\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action }) {\n if (action !== 'resize' || !interaction.resizeAxes) { return; }\n\n const options = interaction.target.options;\n\n if (options.resize.square) {\n if (interaction.resizeAxes === 'y') {\n iEvent.dx = iEvent.dy;\n }\n else {\n iEvent.dy = iEvent.dx;\n }\n iEvent.axes = 'xy';\n }\n else {\n iEvent.axes = interaction.resizeAxes;\n\n if (interaction.resizeAxes === 'x') {\n iEvent.dy = 0;\n }\n else if (interaction.resizeAxes === 'y') {\n iEvent.dx = 0;\n }\n }\n});\n\nactions.resize = resize;\nactions.names.push('resize');\nutils.merge(Interactable.eventTypes, [\n 'resizestart',\n 'resizemove',\n 'resizeinertiastart',\n 'resizeinertiaresume',\n 'resizeend',\n]);\nactions.methodDict.resize = 'resizable';\n\ndefaultOptions.resize = resize.defaults;\n\nmodule.exports = resize;\n","const raf = require('./utils/raf');\nconst getWindow = require('./utils/window').getWindow;\nconst is = require('./utils/is');\nconst domUtils = require('./utils/domUtils');\nconst Interaction = require('./Interaction');\nconst defaultOptions = require('./defaultOptions');\n\nconst autoScroll = {\n defaults: {\n enabled : false,\n container: null, // the item that is scrolled (Window or HTMLElement)\n margin : 60,\n speed : 300, // the scroll speed in pixels per second\n },\n\n interaction: null,\n i: null, // the handle returned by window.setInterval\n x: 0, y: 0, // Direction each pulse is to scroll in\n\n isScrolling: false,\n prevTime: 0,\n\n start: function (interaction) {\n autoScroll.isScrolling = true;\n raf.cancel(autoScroll.i);\n\n autoScroll.interaction = interaction;\n autoScroll.prevTime = new Date().getTime();\n autoScroll.i = raf.request(autoScroll.scroll);\n },\n\n stop: function () {\n autoScroll.isScrolling = false;\n raf.cancel(autoScroll.i);\n },\n\n // scroll the window by the values in scroll.x/y\n scroll: function () {\n const options = autoScroll.interaction.target.options[autoScroll.interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(autoScroll.interaction.element);\n const now = new Date().getTime();\n // change in time in seconds\n const dt = (now - autoScroll.prevTime) / 1000;\n // displacement\n const s = options.speed * dt;\n\n if (s >= 1) {\n if (is.window(container)) {\n container.scrollBy(autoScroll.x * s, autoScroll.y * s);\n }\n else if (container) {\n container.scrollLeft += autoScroll.x * s;\n container.scrollTop += autoScroll.y * s;\n }\n\n autoScroll.prevTime = now;\n }\n\n if (autoScroll.isScrolling) {\n raf.cancel(autoScroll.i);\n autoScroll.i = raf.request(autoScroll.scroll);\n }\n },\n check: function (interactable, actionName) {\n const options = interactable.options;\n\n return options[actionName].autoScroll && options[actionName].autoScroll.enabled;\n },\n onInteractionMove: function ({ interaction, pointer }) {\n if (!(interaction.interacting()\n && autoScroll.check(interaction.target, interaction.prepared.name))) {\n return;\n }\n\n if (interaction.simulation) {\n autoScroll.x = autoScroll.y = 0;\n return;\n }\n\n let top;\n let right;\n let bottom;\n let left;\n\n const options = interaction.target.options[interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(interaction.element);\n\n if (is.window(container)) {\n left = pointer.clientX < autoScroll.margin;\n top = pointer.clientY < autoScroll.margin;\n right = pointer.clientX > container.innerWidth - autoScroll.margin;\n bottom = pointer.clientY > container.innerHeight - autoScroll.margin;\n }\n else {\n const rect = domUtils.getElementClientRect(container);\n\n left = pointer.clientX < rect.left + autoScroll.margin;\n top = pointer.clientY < rect.top + autoScroll.margin;\n right = pointer.clientX > rect.right - autoScroll.margin;\n bottom = pointer.clientY > rect.bottom - autoScroll.margin;\n }\n\n autoScroll.x = (right ? 1: left? -1: 0);\n autoScroll.y = (bottom? 1: top? -1: 0);\n\n if (!autoScroll.isScrolling) {\n // set the autoScroll properties to those of the target\n autoScroll.margin = options.margin;\n autoScroll.speed = options.speed;\n\n autoScroll.start(interaction);\n }\n },\n};\n\nInteraction.signals.on('stop-active', function () {\n autoScroll.stop();\n});\n\nInteraction.signals.on('action-move', autoScroll.onInteractionMove);\n\ndefaultOptions.perAction.autoScroll = autoScroll.defaults;\n\nmodule.exports = autoScroll;\n","const Interactable = require('../Interactable');\nconst actions = require('../actions/base');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.ignoreFrom\n [ method ]\n *\n * If the target of the `mousedown`, `pointerdown` or `touchstart`\n * event or any of it's parents match the given CSS selector or\n * Element, no drag/resize/gesture is started.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to not ignore any elements\n = (string | Element | object) The current ignoreFrom value or this Interactable\n **\n | interact(element, { ignoreFrom: document.getElementById('no-action') });\n | // or\n | interact(element).ignoreFrom('input, textarea, a');\n\\*/\nInteractable.prototype.ignoreFrom = function (newValue) {\n return this._backCompatOption('ignoreFrom', newValue);\n};\n\n/*\\\n * Interactable.allowFrom\n [ method ]\n *\n * A drag/resize/gesture is started only If the target of the\n * `mousedown`, `pointerdown` or `touchstart` event or any of it's\n * parents match the given CSS selector or Element.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to allow from any element\n = (string | Element | object) The current allowFrom value or this Interactable\n **\n | interact(element, { allowFrom: document.getElementById('drag-handle') });\n | // or\n | interact(element).allowFrom('.handle');\n\\*/\nInteractable.prototype.allowFrom = function (newValue) {\n return this._backCompatOption('allowFrom', newValue);\n};\n\nInteractable.prototype.testIgnore = function (ignoreFrom, interactableElement, element) {\n if (!ignoreFrom || !is.element(element)) { return false; }\n\n if (is.string(ignoreFrom)) {\n return domUtils.matchesUpTo(element, ignoreFrom, interactableElement);\n }\n else if (is.element(ignoreFrom)) {\n return domUtils.nodeContains(ignoreFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testAllow = function (allowFrom, interactableElement, element) {\n if (!allowFrom) { return true; }\n\n if (!is.element(element)) { return false; }\n\n if (is.string(allowFrom)) {\n return domUtils.matchesUpTo(element, allowFrom, interactableElement);\n }\n else if (is.element(allowFrom)) {\n return domUtils.nodeContains(allowFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testIgnoreAllow = function (options, interactableElement, eventTarget) {\n return (!this.testIgnore(options.ignoreFrom, interactableElement, eventTarget)\n && this.testAllow(options.allowFrom, interactableElement, eventTarget));\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (event.buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\n","const interact = require('../interact');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst actions = require('../actions/base');\nconst defaultOptions = require('../defaultOptions');\nconst browser = require('../utils/browser');\nconst scope = require('../scope');\nconst utils = require('../utils');\nconst signals = require('../utils/Signals').new();\n\nrequire('./InteractableMethods');\n\nconst autoStart = {\n signals,\n withinInteractionLimit,\n // Allow this many interactions to happen simultaneously\n maxInteractions: Infinity,\n defaults: {\n perAction: {\n manualStart: false,\n max: Infinity,\n maxPerElement: 1,\n allowFrom: null,\n ignoreFrom: null,\n },\n },\n setActionDefaults: function (action) {\n utils.extend(action.defaults, autoStart.defaults.perAction);\n },\n};\n\n// set cursor style on mousedown\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget }) {\n if (interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\n// set cursor style on mousemove\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget }) {\n if (!interaction.mouse\n || interaction.pointerIsDown\n || interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\nInteraction.signals.on('move', function (arg) {\n const { interaction, event } = arg;\n\n if (!interaction.pointerIsDown\n || interaction.interacting()\n || !interaction.pointerWasMoved\n || !interaction.prepared.name) {\n return;\n }\n\n signals.fire('before-start', arg);\n\n const target = interaction.target;\n\n if (interaction.prepared.name && target) {\n // check manualStart and interaction limit\n if (target.options[interaction.prepared.name].manualStart\n || !withinInteractionLimit(target, interaction.element, interaction.prepared)) {\n interaction.stop(event);\n }\n else {\n interaction.start(interaction.prepared, target, interaction.element);\n }\n }\n});\n\n// Check if the current target supports the action.\n// If so, return the validated action. Otherwise, return null\nfunction validateAction (action, interactable, element, eventTarget) {\n if (utils.is.object(action)\n && interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget)\n && interactable.options[action.name].enabled\n && withinInteractionLimit(interactable, element, action)) {\n return action;\n }\n\n return null;\n}\n\nfunction validateSelector (interaction, pointer, event, matches, matchElements, eventTarget) {\n for (let i = 0, len = matches.length; i < len; i++) {\n const match = matches[i];\n const matchElement = matchElements[i];\n const action = validateAction(match.getAction(pointer, event, interaction, matchElement),\n match,\n matchElement,\n eventTarget);\n\n if (action) {\n return {\n action,\n target: match,\n element: matchElement,\n };\n }\n }\n\n return {};\n}\n\nfunction getActionInfo (interaction, pointer, event, eventTarget) {\n let matches = [];\n let matchElements = [];\n\n let element = eventTarget;\n let action = null;\n\n function pushMatches (interactable, selector, context) {\n const elements = (browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined);\n\n if (utils.matchesSelector(element, selector, elements)) {\n\n matches.push(interactable);\n matchElements.push(element);\n }\n }\n\n while (utils.is.element(element)) {\n matches = [];\n matchElements = [];\n\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && (action = validateAction(elementInteractable.getAction(pointer, event, interaction, element, eventTarget),\n elementInteractable,\n element,\n eventTarget))\n && !elementInteractable.options[action.name].manualStart) {\n return {\n element,\n action,\n target: elementInteractable,\n };\n }\n else {\n scope.interactables.forEachSelector(pushMatches, element);\n\n const actionInfo = validateSelector(interaction, pointer, event, matches, matchElements, eventTarget);\n\n if (actionInfo.action\n && !actionInfo.target.options[actionInfo.action.name].manualStart) {\n return actionInfo;\n }\n }\n\n element = utils.parentNode(element);\n }\n\n return {};\n}\n\nfunction prepare (interaction, { action, target, element }) {\n action = action || {};\n\n if (interaction.target && interaction.target.options.styleCursor) {\n interaction.target._doc.documentElement.style.cursor = '';\n }\n\n interaction.target = target;\n interaction.element = element;\n utils.copyAction(interaction.prepared, action);\n\n if (target && target.options.styleCursor) {\n const cursor = action? actions[action.name].getCursor(action) : '';\n interaction.target._doc.documentElement.style.cursor = cursor;\n }\n\n signals.fire('prepared', { interaction: interaction });\n}\n\nInteraction.signals.on('stop', function ({ interaction }) {\n const target = interaction.target;\n\n if (target && target.options.styleCursor) {\n target._doc.documentElement.style.cursor = '';\n }\n});\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (utils.is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (utils.is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n const buttons = event.buttons || ({\n 0: 1,\n 1: 4,\n 3: 8,\n 4: 16,\n })[event.button];\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\nfunction withinInteractionLimit (interactable, element, action) {\n const options = interactable.options;\n const maxActions = options[action.name].max;\n const maxPerElement = options[action.name].maxPerElement;\n let activeInteractions = 0;\n let targetCount = 0;\n let targetElementCount = 0;\n\n // no actions if any of these values == 0\n if (!(maxActions && maxPerElement && autoStart.maxInteractions)) { return; }\n\n for (let i = 0, len = scope.interactions.length; i < len; i++) {\n const interaction = scope.interactions[i];\n const otherAction = interaction.prepared.name;\n\n if (!interaction.interacting()) { continue; }\n\n activeInteractions++;\n\n if (activeInteractions >= autoStart.maxInteractions) {\n return false;\n }\n\n if (interaction.target !== interactable) { continue; }\n\n targetCount += (otherAction === action.name)|0;\n\n if (targetCount >= maxActions) {\n return false;\n }\n\n if (interaction.element === element) {\n targetElementCount++;\n\n if (otherAction !== action.name || targetElementCount >= maxPerElement) {\n return false;\n }\n }\n }\n\n return autoStart.maxInteractions > 0;\n}\n\n/*\\\n * interact.maxInteractions\n [ method ]\n **\n * Returns or sets the maximum number of concurrent interactions allowed.\n * By default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables\n * and elements, you need to enable it in the draggable, resizable and\n * gesturable `'max'` and `'maxPerElement'` options.\n **\n - newValue (number) #optional Any number. newValue <= 0 means no interactions.\n\\*/\ninteract.maxInteractions = function (newValue) {\n if (utils.is.number(newValue)) {\n autoStart.maxInteractions = newValue;\n\n return this;\n }\n\n return autoStart.maxInteractions;\n};\n\nInteractable.settingsMethods.push('styleCursor');\nInteractable.settingsMethods.push('actionChecker');\nInteractable.settingsMethods.push('ignoreFrom');\nInteractable.settingsMethods.push('allowFrom');\n\ndefaultOptions.base.actionChecker = null;\ndefaultOptions.base.styleCursor = true;\n\nutils.extend(defaultOptions.perAction, autoStart.defaults.perAction);\n\nmodule.exports = autoStart;\n","const autoStart = require('./base');\nconst Interaction = require('../Interaction');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.delayTimer = null;\n});\n\nautoStart.signals.on('prepared', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.delayTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.target, interaction.element);\n }, delay);\n }\n});\n\nInteraction.signals.on('move', function ({ interaction, duplicate }) {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.delayTimer);\n }\n});\n\n// prevent regular down->move autoStart\nautoStart.signals.on('before-start', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.prepared.name = null;\n }\n});\n","const autoStart = require('./base');\nconst scope = require('../scope');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\n\nconst { matchesSelector, parentNode } = require('../utils/domUtils');\n\nautoStart.setActionDefaults(require('../actions/drag'));\n\nautoStart.signals.on('before-start', function ({ interaction, eventTarget, dx, dy }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // check if a drag is in the correct axis\n const absX = Math.abs(dx);\n const absY = Math.abs(dy);\n const options = interaction.target.options.drag;\n const startAxis = options.startAxis;\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy');\n\n interaction.prepared.axis = options.lockAxis === 'start'\n ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n : options.lockAxis;\n\n // if the movement isn't in the startAxis of the interactable\n if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) {\n // cancel the prepared action\n interaction.prepared.name = null;\n\n // then try to get a drag from another ineractable\n\n if (!interaction.prepared.name) {\n\n let element = eventTarget;\n\n const getDraggable = function (interactable, selector, context) {\n const elements = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n if (interactable === interaction.target) { return; }\n\n if (!options.manualStart\n && !interactable.testIgnoreAllow(options, element, eventTarget)\n && matchesSelector(element, selector, elements)) {\n\n const action = interactable.getAction(interaction.downPointer,\n interaction.downEvent,\n interaction,\n element);\n\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, interactable)\n && autoStart.validateAction(action, interactable, element, eventTarget)) {\n\n return interactable;\n }\n }\n };\n\n let action = null;\n\n // check all interactables\n while (is.element(element)) {\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && elementInteractable !== interaction.target\n && !elementInteractable.options.drag.manualStart) {\n\n action = elementInteractable.getAction(interaction.downPointer, interaction.downEvent, interaction, element);\n }\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, elementInteractable)) {\n\n interaction.prepared.name = 'drag';\n interaction.target = elementInteractable;\n interaction.element = element;\n break;\n }\n\n const selectorInteractable = scope.interactables.forEachSelector(getDraggable, element);\n\n if (selectorInteractable) {\n interaction.prepared.name = 'drag';\n interaction.target = selectorInteractable;\n interaction.element = element;\n break;\n }\n\n element = parentNode(element);\n }\n }\n }\n});\n\nfunction checkStartAxis (startAxis, interactable) {\n if (!interactable) { return false; }\n\n const thisAxis = interactable.options.drag.startAxis;\n\n return (startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis);\n}\n","require('./base').setActionDefaults(require('../actions/gesture'));\n","require('./base').setActionDefaults(require('../actions/resize'));\n","module.exports = {\n base: {\n accept : null,\n preventDefault: 'auto',\n deltaSource : 'page',\n },\n\n perAction: {\n origin: { x: 0, y: 0 },\n\n // only allow left button by default\n // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n mouseButtons: 1,\n\n inertia: {\n enabled : false,\n resistance : 10, // the lambda in exponential decay\n minSpeed : 100, // target speed must be above this for inertia to start\n endSpeed : 10, // the speed at which inertia is slow enough to stop\n allowResume : true, // allow resuming an action in inertia phase\n smoothEndDuration: 300, // animate to snap/restrict endOnly if there's no inertia\n },\n },\n};\n","/* browser entry point */\n\n// Legacy browser support\nrequire('./legacyBrowsers');\n\n// inertia\nrequire('./inertia');\n\n// modifiers\nrequire('./modifiers/snap');\nrequire('./modifiers/restrict');\n\n// pointerEvents\nrequire('./pointerEvents/base');\nrequire('./pointerEvents/holdRepeat');\nrequire('./pointerEvents/interactableTargets');\n\n// delay\nrequire('./autoStart/delay');\n\n// actions\nrequire('./actions/gesture');\nrequire('./actions/resize');\nrequire('./actions/drag');\nrequire('./actions/drop');\n\n// load these modifiers after resize is loaded\nrequire('./modifiers/snapSize');\nrequire('./modifiers/restrictEdges');\nrequire('./modifiers/restrictSize');\n\n// autoStart actions\nrequire('./autoStart/gesture');\nrequire('./autoStart/resize');\nrequire('./autoStart/drag');\n\n// Interactable preventDefault setting\nrequire('./interactablePreventDefault.js');\n\n// autoScroll\nrequire('./autoScroll');\n\n// export interact\nmodule.exports = require('./interact');\n","const InteractEvent = require('./InteractEvent');\nconst Interaction = require('./Interaction');\nconst modifiers = require('./modifiers');\nconst utils = require('./utils');\nconst animationFrame = require('./utils/raf');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.inertiaStatus = {\n active : false,\n smoothEnd : false,\n allowResume: false,\n\n startEvent: null,\n upCoords : {},\n\n xe: 0, ye: 0,\n sx: 0, sy: 0,\n\n t0: 0,\n vx0: 0, vys: 0,\n duration: 0,\n\n lambda_v0: 0,\n one_ve_v0: 0,\n i : null,\n };\n\n interaction.boundInertiaFrame = () => inertiaFrame .apply(interaction);\n interaction.boundSmoothEndFrame = () => smoothEndFrame.apply(interaction);\n});\n\nInteraction.signals.on('down', function ({ interaction, event, pointer, eventTarget }) {\n const status = interaction.inertiaStatus;\n\n // Check if the down event hits the current inertia target\n if (status.active) {\n let element = eventTarget;\n\n // climb up the DOM tree from the event target\n while (utils.is.element(element)) {\n\n // if interaction element is the current inertia target element\n if (element === interaction.element) {\n // stop inertia\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n\n // update pointers to the down event's coordinates\n interaction.updatePointer(pointer);\n utils.setCoords(interaction.curCoords, interaction.pointers);\n\n // fire appropriate signals\n const signalArg = { interaction };\n Interaction.signals.fire('before-action-move', signalArg);\n Interaction.signals.fire('action-resume' , signalArg);\n\n // fire a reume event\n const resumeEvent = new InteractEvent(interaction,\n event,\n interaction.prepared.name,\n 'inertiaresume',\n interaction.element);\n\n interaction.target.fire(resumeEvent);\n interaction.prevEvent = resumeEvent;\n modifiers.resetStatuses(interaction.modifierStatuses);\n\n utils.copyCoords(interaction.prevCoords, interaction.curCoords);\n break;\n }\n\n element = utils.parentNode(element);\n }\n }\n});\n\nInteraction.signals.on('up', function ({ interaction, event }) {\n const status = interaction.inertiaStatus;\n\n if (!interaction.interacting() || status.active) { return; }\n\n const target = interaction.target;\n const options = target && target.options;\n const inertiaOptions = options && interaction.prepared.name && options[interaction.prepared.name].inertia;\n\n const now = new Date().getTime();\n const statuses = {};\n const page = utils.extend({}, interaction.curCoords.page);\n const pointerSpeed = interaction.pointerDelta.client.speed;\n\n let smoothEnd = false;\n let modifierResult;\n\n // check if inertia should be started\n const inertiaPossible = (inertiaOptions && inertiaOptions.enabled\n && interaction.prepared.name !== 'gesture'\n && event !== status.startEvent);\n\n const inertia = (inertiaPossible\n && (now - interaction.curCoords.timeStamp) < 50\n && pointerSpeed > inertiaOptions.minSpeed\n && pointerSpeed > inertiaOptions.endSpeed);\n\n const modifierArg = {\n interaction,\n pageCoords: page,\n statuses,\n preEnd: true,\n requireEndOnly: true,\n };\n\n // smoothEnd\n if (inertiaPossible && !inertia) {\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n if (modifierResult.shouldMove && modifierResult.locked) {\n smoothEnd = true;\n }\n }\n\n if (!(inertia || smoothEnd)) { return; }\n\n utils.copyCoords(status.upCoords, interaction.curCoords);\n\n interaction.pointers[0] = status.startEvent =\n new InteractEvent(interaction, event, interaction.prepared.name, 'inertiastart', interaction.element);\n\n status.t0 = now;\n\n status.active = true;\n status.allowResume = inertiaOptions.allowResume;\n interaction.simulation = status;\n\n target.fire(status.startEvent);\n\n if (inertia) {\n status.vx0 = interaction.pointerDelta.client.vx;\n status.vy0 = interaction.pointerDelta.client.vy;\n status.v0 = pointerSpeed;\n\n calcInertia(interaction, status);\n\n utils.extend(page, interaction.curCoords.page);\n\n page.x += status.xe;\n page.y += status.ye;\n\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n status.modifiedXe += modifierResult.dx;\n status.modifiedYe += modifierResult.dy;\n\n status.i = animationFrame.request(interaction.boundInertiaFrame);\n }\n else {\n status.smoothEnd = true;\n status.xe = modifierResult.dx;\n status.ye = modifierResult.dy;\n\n status.sx = status.sy = 0;\n\n status.i = animationFrame.request(interaction.boundSmoothEndFrame);\n }\n});\n\nInteraction.signals.on('stop-active', function ({ interaction }) {\n const status = interaction.inertiaStatus;\n\n if (status.active) {\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n }\n});\n\nfunction calcInertia (interaction, status) {\n const inertiaOptions = interaction.target.options[interaction.prepared.name].inertia;\n const lambda = inertiaOptions.resistance;\n const inertiaDur = -Math.log(inertiaOptions.endSpeed / status.v0) / lambda;\n\n status.x0 = interaction.prevEvent.pageX;\n status.y0 = interaction.prevEvent.pageY;\n status.t0 = status.startEvent.timeStamp / 1000;\n status.sx = status.sy = 0;\n\n status.modifiedXe = status.xe = (status.vx0 - inertiaDur) / lambda;\n status.modifiedYe = status.ye = (status.vy0 - inertiaDur) / lambda;\n status.te = inertiaDur;\n\n status.lambda_v0 = lambda / status.v0;\n status.one_ve_v0 = 1 - inertiaOptions.endSpeed / status.v0;\n}\n\nfunction inertiaFrame () {\n updateInertiaCoords(this);\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n\n const status = this.inertiaStatus;\n const options = this.target.options[this.prepared.name].inertia;\n const lambda = options.resistance;\n const t = new Date().getTime() / 1000 - status.t0;\n\n if (t < status.te) {\n\n const progress = 1 - (Math.exp(-lambda * t) - status.lambda_v0) / status.one_ve_v0;\n\n if (status.modifiedXe === status.xe && status.modifiedYe === status.ye) {\n status.sx = status.xe * progress;\n status.sy = status.ye * progress;\n }\n else {\n const quadPoint = utils.getQuadraticCurvePoint(0, 0,\n status.xe,\n status.ye,\n status.modifiedXe,\n status.modifiedYe,\n progress);\n\n status.sx = quadPoint.x;\n status.sy = quadPoint.y;\n }\n\n this.doMove();\n\n status.i = animationFrame.request(this.boundInertiaFrame);\n }\n else {\n status.sx = status.modifiedXe;\n status.sy = status.modifiedYe;\n\n this.doMove();\n this.end(status.startEvent);\n status.active = false;\n this.simulation = null;\n }\n\n utils.copyCoords(this.prevCoords, this.curCoords);\n}\n\nfunction smoothEndFrame () {\n updateInertiaCoords(this);\n\n const status = this.inertiaStatus;\n const t = new Date().getTime() - status.t0;\n const duration = this.target.options[this.prepared.name].inertia.smoothEndDuration;\n\n if (t < duration) {\n status.sx = utils.easeOutQuad(t, 0, status.xe, duration);\n status.sy = utils.easeOutQuad(t, 0, status.ye, duration);\n\n this.pointerMove(status.startEvent, status.startEvent);\n\n status.i = animationFrame.request(this.boundSmoothEndFrame);\n }\n else {\n status.sx = status.xe;\n status.sy = status.ye;\n\n this.pointerMove(status.startEvent, status.startEvent);\n this.end(status.startEvent);\n\n status.smoothEnd =\n status.active = false;\n this.simulation = null;\n }\n}\n\nfunction updateInertiaCoords (interaction) {\n const status = interaction.inertiaStatus;\n\n // return if inertia isn't running\n if (!status.active) { return; }\n\n const pageUp = status.upCoords.page;\n const clientUp = status.upCoords.client;\n\n utils.setCoords(interaction.curCoords, [ {\n pageX : pageUp.x + status.sx,\n pageY : pageUp.y + status.sy,\n clientX: clientUp.x + status.sx,\n clientY: clientUp.y + status.sy,\n } ]);\n}\n","const browser = require('./utils/browser');\nconst events = require('./utils/events');\nconst utils = require('./utils');\nconst scope = require('./scope');\nconst Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\n\nconst globalEvents = {};\n\n/*\\\n * interact\n [ method ]\n *\n * The methods of this variable can be used to set elements as\n * interactables and also to change various default settings.\n *\n * Calling it as a function and passing an element or a valid CSS selector\n * string returns an Interactable object which has various methods to\n * configure it.\n *\n - element (Element | string) The HTML or SVG Element to interact with or CSS selector\n = (object) An @Interactable\n *\n > Usage\n | interact('#draggable').draggable(true);\n |\n | var rectables = interact('rect');\n | rectables\n | .gesturable(true)\n | .on('gesturemove', function (event) {\n | // ...\n | });\n\\*/\nfunction interact (element, options) {\n let interactable = scope.interactables.get(element, options);\n\n if (!interactable) {\n interactable = new Interactable(element, options);\n interactable.events.global = globalEvents;\n }\n\n return interactable;\n}\n\n/*\\\n * interact.isSet\n [ method ]\n *\n * Check if an element has been set\n - element (Element) The Element being searched for\n = (boolean) Indicates if the element or CSS selector was previously passed to interact\n\\*/\ninteract.isSet = function (element, options) {\n return scope.interactables.indexOfElement(element, options && options.context) !== -1;\n};\n\n/*\\\n * interact.on\n [ method ]\n *\n * Adds a global listener for an InteractEvent or adds a DOM event to\n * `document`\n *\n - type (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) interact\n\\*/\ninteract.on = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.on(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.on(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n // if it is an InteractEvent type, add listener to globalEvents\n if (utils.contains(Interactable.eventTypes, type)) {\n // if this type of event was never bound\n if (!globalEvents[type]) {\n globalEvents[type] = [listener];\n }\n else {\n globalEvents[type].push(listener);\n }\n }\n // If non InteractEvent type, addEventListener to document\n else {\n events.add(scope.document, type, listener, { options });\n }\n\n return interact;\n};\n\n/*\\\n * interact.off\n [ method ]\n *\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n - type (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) interact\n \\*/\ninteract.off = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.off(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.off(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n if (!utils.contains(Interactable.eventTypes, type)) {\n events.remove(scope.document, type, listener, options);\n }\n else {\n let index;\n\n if (type in globalEvents\n && (index = utils.indexOf(globalEvents[type], listener)) !== -1) {\n globalEvents[type].splice(index, 1);\n }\n }\n\n return interact;\n};\n\n/*\\\n * interact.debug\n [ method ]\n *\n * Returns an object which exposes internal data\n = (object) An object with properties that outline the current state and expose internal functions and variables\n\\*/\ninteract.debug = function () {\n return scope;\n};\n\n// expose the functions used to calculate multi-touch properties\ninteract.getPointerAverage = utils.pointerAverage;\ninteract.getTouchBBox = utils.touchBBox;\ninteract.getTouchDistance = utils.touchDistance;\ninteract.getTouchAngle = utils.touchAngle;\n\ninteract.getElementRect = utils.getElementRect;\ninteract.getElementClientRect = utils.getElementClientRect;\ninteract.matchesSelector = utils.matchesSelector;\ninteract.closest = utils.closest;\n\n/*\\\n * interact.supportsTouch\n [ method ]\n *\n = (boolean) Whether or not the browser supports touch input\n\\*/\ninteract.supportsTouch = function () {\n return browser.supportsTouch;\n};\n\n/*\\\n * interact.supportsPointerEvent\n [ method ]\n *\n = (boolean) Whether or not the browser supports PointerEvents\n\\*/\ninteract.supportsPointerEvent = function () {\n return browser.supportsPointerEvent;\n};\n\n/*\\\n * interact.stop\n [ method ]\n *\n * Cancels all interactions (end events are not fired)\n *\n - event (Event) An event on which to call preventDefault()\n = (object) interact\n\\*/\ninteract.stop = function (event) {\n for (let i = scope.interactions.length - 1; i >= 0; i--) {\n scope.interactions[i].stop(event);\n }\n\n return interact;\n};\n\n/*\\\n * interact.pointerMoveTolerance\n [ method ]\n * Returns or sets the distance the pointer must be moved before an action\n * sequence occurs. This also affects tolerance for tap events.\n *\n - newValue (number) #optional The movement from the start position must be greater than this value\n = (number | Interactable) The current setting or interact\n\\*/\ninteract.pointerMoveTolerance = function (newValue) {\n if (utils.is.number(newValue)) {\n Interaction.pointerMoveTolerance = newValue;\n\n return this;\n }\n\n return Interaction.pointerMoveTolerance;\n};\n\ninteract.addDocument = scope.addDocument;\ninteract.removeDocument = scope.removeDocument;\n\nscope.interact = interact;\n\nmodule.exports = interact;\n","const Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\nconst scope = require('./scope');\nconst is = require('./utils/is');\nconst events = require('./utils/events');\n\nconst { nodeContains, matchesSelector } = require('./utils/domUtils');\n\n/*\\\n * Interactable.preventDefault\n [ method ]\n *\n * Returns or sets whether to prevent the browser's default behaviour\n * in response to pointer events. Can be set to:\n * - `'always'` to always prevent\n * - `'never'` to never prevent\n * - `'auto'` to let interact.js try to determine what would be best\n *\n - newValue (string) #optional `true`, `false` or `'auto'`\n = (string | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.preventDefault = function (newValue) {\n if (/^(always|never|auto)$/.test(newValue)) {\n this.options.preventDefault = newValue;\n return this;\n }\n\n if (is.bool(newValue)) {\n this.options.preventDefault = newValue? 'always' : 'never';\n return this;\n }\n\n return this.options.preventDefault;\n};\n\nInteractable.prototype.checkAndPreventDefault = function (event) {\n const setting = this.options.preventDefault;\n\n if (setting === 'never') { return; }\n\n if (setting === 'always') {\n event.preventDefault();\n return;\n }\n\n // setting === 'auto'\n\n // don't preventDefault if the browser supports passiveEvents\n // CSS touch-action and user-selecct should be used instead\n if (events.supportsOptions) {\n return;\n }\n\n // don't preventDefault of pointerdown events\n if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) {\n return;\n }\n\n // don't preventDefault on editable elements\n if (is.element(event.target)\n && matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) {\n return;\n }\n\n event.preventDefault();\n};\n\nfunction onInteractionEvent ({ interaction, event }) {\n if (interaction.target) {\n interaction.target.checkAndPreventDefault(event);\n }\n}\n\nfor (const eventSignal of ['down', 'move', 'up', 'cancel']) {\n Interaction.signals.on(eventSignal, onInteractionEvent);\n}\n\n// prevent native HTML5 drag on interact.js target elements\nInteraction.docEvents.dragstart = function preventNativeDrag (event) {\n for (const interaction of scope.interactions) {\n\n if (interaction.element\n && (interaction.element === event.target\n || nodeContains(interaction.element, event.target))) {\n\n interaction.target.checkAndPreventDefault(event);\n return;\n }\n }\n};\n","const scope = require('./scope');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst iFinder = require('./utils/interactionFinder');\nconst pointerEvents = require('./pointerEvents/base');\n\nconst { window } = require('./utils/window');\n\nconst toString = Object.prototype.toString;\n\nif (!window.Array.isArray) {\n window.Array.isArray = function (obj) {\n return toString.call(obj) === '[object Array]';\n };\n}\n\nif (!String.prototype.trim) {\n String.prototype.trim = function () {\n return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n };\n}\n\n// http://www.quirksmode.org/dom/events/click.html\n// >Events leading to dblclick\n//\n// IE8 doesn't fire down event before dblclick.\n// This workaround tries to fire a tap and doubletap after dblclick\nfunction onIE8Dblclick (event) {\n const eventTarget = event.target;\n const interaction = iFinder.search(event, event.type, eventTarget);\n\n if (!interaction) { return; }\n\n if (interaction.prevTap\n && event.clientX === interaction.prevTap.clientX\n && event.clientY === interaction.prevTap.clientY\n && eventTarget === interaction.prevTap.target) {\n\n interaction.downTargets[0] = eventTarget;\n interaction.downTimes [0] = new Date().getTime();\n\n pointerEvents.fire({\n interaction,\n event,\n eventTarget,\n pointer: event,\n type: 'tap',\n });\n }\n}\n\nif (browser.isIE8) {\n const selectFix = function (event) {\n for (const interaction of scope.interactions) {\n if (interaction.interacting()) {\n interaction.target.checkAndPreventDefault(event);\n }\n }\n };\n\n const onDocIE8 = function onDocIE8 ({ doc, win }, signalName) {\n const eventMethod = signalName.indexOf('listen') === 0\n ? events.add : events.remove;\n\n // For IE's lack of Event#preventDefault\n eventMethod(doc, 'selectstart', selectFix);\n\n if (pointerEvents) {\n eventMethod(doc, 'dblclick', onIE8Dblclick);\n }\n };\n\n scope.signals.on('add-document' , onDocIE8);\n scope.signals.on('remove-document', onDocIE8);\n}\n\nmodule.exports = null;\n","const InteractEvent = require('../InteractEvent');\nconst Interaction = require('../Interaction');\nconst extend = require('../utils/extend');\n\nconst modifiers = {\n names: [],\n\n setOffsets: function (arg) {\n const { interaction, pageCoords: page } = arg;\n const { target, element, startOffset } = interaction;\n const rect = target.getRect(element);\n\n if (rect) {\n startOffset.left = page.x - rect.left;\n startOffset.top = page.y - rect.top;\n\n startOffset.right = rect.right - page.x;\n startOffset.bottom = rect.bottom - page.y;\n\n if (!('width' in rect)) { rect.width = rect.right - rect.left; }\n if (!('height' in rect)) { rect.height = rect.bottom - rect.top ; }\n }\n else {\n startOffset.left = startOffset.top = startOffset.right = startOffset.bottom = 0;\n }\n\n arg.rect = rect;\n arg.interactable = target;\n arg.element = element;\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n\n arg.options = target.options[interaction.prepared.name][modifierName];\n\n if (!arg.options) {\n continue;\n }\n\n interaction.modifierOffsets[modifierName] = modifiers[modifierName].setOffset(arg);\n }\n },\n\n setAll: function (arg) {\n const { interaction, statuses, preEnd, requireEndOnly } = arg;\n const coords = extend({}, arg.pageCoords);\n const result = {\n dx: 0,\n dy: 0,\n changed: false,\n locked: false,\n shouldMove: true,\n };\n\n for (const modifierName of modifiers.names) {\n const modifier = modifiers[modifierName];\n const options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!shouldDo(options, preEnd, requireEndOnly)) { continue; }\n\n arg.status = arg.status = statuses[modifierName];\n arg.options = options;\n arg.offset = arg.interaction.modifierOffsets[modifierName];\n\n modifier.set(arg);\n\n if (arg.status.locked) {\n coords.x += arg.status.dx;\n coords.y += arg.status.dy;\n\n result.dx += arg.status.dx;\n result.dy += arg.status.dy;\n\n result.locked = true;\n }\n }\n\n // a move should be fired if:\n // - there are no modifiers enabled,\n // - no modifiers are \"locked\" i.e. have changed the pointer's coordinates, or\n // - the locked coords have changed since the last pointer move\n result.shouldMove = !arg.status || !result.locked || arg.status.changed;\n\n return result;\n },\n\n resetStatuses: function (statuses) {\n for (const modifierName of modifiers.names) {\n const status = statuses[modifierName] || {};\n\n status.dx = status.dy = 0;\n status.modifiedX = status.modifiedY = NaN;\n status.locked = false;\n status.changed = true;\n\n statuses[modifierName] = status;\n }\n\n return statuses;\n },\n\n start: function ({ interaction }, signalName) {\n const arg = {\n interaction,\n pageCoords: (signalName === 'action-resume' ?\n interaction.curCoords : interaction.startCoords).page,\n startOffset: interaction.startOffset,\n statuses: interaction.modifierStatuses,\n preEnd: false,\n requireEndOnly: false,\n };\n\n modifiers.setOffsets(arg);\n modifiers.resetStatuses(arg.statuses);\n\n arg.pageCoords = extend({}, interaction.startCoords.page);\n interaction.modifierResult = modifiers.setAll(arg);\n },\n};\n\nInteraction.signals.on('new', function (interaction) {\n interaction.startOffset = { left: 0, right: 0, top: 0, bottom: 0 };\n interaction.modifierOffsets = {};\n interaction.modifierStatuses = modifiers.resetStatuses({});\n interaction.modifierResult = null;\n});\n\nInteraction.signals.on('action-start' , modifiers.start);\nInteraction.signals.on('action-resume', modifiers.start);\n\nInteraction.signals.on('before-action-move', function ({ interaction, preEnd, interactingBeforeMove }) {\n const modifierResult = modifiers.setAll({\n interaction,\n preEnd,\n pageCoords: interaction.curCoords.page,\n statuses: interaction.modifierStatuses,\n requireEndOnly: false,\n });\n\n // don't fire an action move if a modifier would keep the event in the same\n // cordinates as before\n if (!modifierResult.shouldMove && interactingBeforeMove) {\n interaction._dontFireMove = true;\n }\n\n interaction.modifierResult = modifierResult;\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n for (let i = 0; i < modifiers.names.length; i++) {\n const options = interaction.target.options[interaction.prepared.name][modifiers.names[i]];\n\n // if the endOnly option is true for any modifier\n if (shouldDo(options, true, true)) {\n // fire a move event at the modified coordinates\n interaction.doMove({ event, preEnd: true });\n break;\n }\n }\n});\n\nInteractEvent.signals.on('set-xy', function (arg) {\n const { iEvent, interaction } = arg;\n const modifierArg = extend({}, arg);\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n modifierArg.options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!modifierArg.options) {\n continue;\n }\n\n const modifier = modifiers[modifierName];\n\n modifierArg.status = interaction.modifierStatuses[modifierName];\n\n iEvent[modifierName] = modifier.modifyCoords(modifierArg);\n }\n});\n\nfunction shouldDo (options, preEnd, requireEndOnly) {\n return (options && options.enabled\n && (preEnd || !options.endOnly)\n && (!requireEndOnly || options.endOnly));\n}\n\nmodule.exports = modifiers;\n","const modifiers = require('./index');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst restrict = {\n defaults: {\n enabled : false,\n endOnly : false,\n restriction: null,\n elementRect: null,\n },\n\n setOffset: function ({ rect, startOffset, options }) {\n const elementRect = options && options.elementRect;\n const offset = {};\n\n if (rect && elementRect) {\n offset.left = startOffset.left - (rect.width * elementRect.left);\n offset.top = startOffset.top - (rect.height * elementRect.top);\n\n offset.right = startOffset.right - (rect.width * (1 - elementRect.right));\n offset.bottom = startOffset.bottom - (rect.height * (1 - elementRect.bottom));\n }\n else {\n offset.left = offset.top = offset.right = offset.bottom = 0;\n }\n\n return offset;\n },\n\n set: function ({ pageCoords, interaction, status, options }) {\n if (!options) { return status; }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n\n const restriction = getRestrictionRect(options.restriction, interaction, page);\n\n if (!restriction) { return status; }\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n const rect = restriction;\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n const offset = interaction.modifierOffsets.restrict;\n\n // object is assumed to have\n // x, y, width, height or\n // left, top, right, bottom\n if ('x' in restriction && 'y' in restriction) {\n modifiedX = Math.max(Math.min(rect.x + rect.width - offset.right , page.x), rect.x + offset.left);\n modifiedY = Math.max(Math.min(rect.y + rect.height - offset.bottom, page.y), rect.y + offset.top );\n }\n else {\n modifiedX = Math.max(Math.min(rect.right - offset.right , page.x), rect.left + offset.left);\n modifiedY = Math.max(Math.min(rect.bottom - offset.bottom, page.y), rect.top + offset.top );\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const elementRect = options && options.elementRect;\n\n if (options && options.enabled\n && !(phase === 'start' && elementRect && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n getRestrictionRect,\n};\n\nfunction getRestrictionRect (value, interaction, page) {\n if (utils.is.function(value)) {\n return utils.resolveRectLike(value, interaction.target, interaction.element, [page.x, page.y, interaction]);\n } else {\n return utils.resolveRectLike(value, interaction.target, interaction.element);\n }\n}\n\nmodifiers.restrict = restrict;\nmodifiers.names.push('restrict');\n\ndefaultOptions.perAction.restrict = restrict.defaults;\n\nmodule.exports = restrict;\n","// This module adds the options.resize.restrictEdges setting which sets min and\n// max for the top, left, bottom and right edges of the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictEdges: {\n// inner: { top: 200, left: 200, right: 400, bottom: 400 },\n// outer: { top: 0, left: 0, right: 600, bottom: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst { getRestrictionRect } = require('./restrict');\n\nconst noInner = { top: +Infinity, left: +Infinity, bottom: -Infinity, right: -Infinity };\nconst noOuter = { top: -Infinity, left: -Infinity, bottom: +Infinity, right: +Infinity };\n\nconst restrictEdges = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n offset: null,\n },\n\n setOffset: function ({ interaction, startOffset, options }) {\n if (!options) {\n return utils.extend({}, startOffset);\n }\n\n const offset = getRestrictionRect(options.offset, interaction, interaction.startCoords.page);\n\n if (offset) {\n return {\n top: startOffset.top + offset.y,\n left: startOffset.left + offset.x,\n bottom: startOffset.bottom + offset.y,\n right: startOffset.right + offset.x,\n };\n }\n\n return startOffset;\n },\n\n set: function ({ pageCoords, interaction, status, offset, options }) {\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n const inner = rectUtils.xywhToTlbr(getRestrictionRect(options.inner, interaction, page)) || noInner;\n const outer = rectUtils.xywhToTlbr(getRestrictionRect(options.outer, interaction, page)) || noOuter;\n\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n if (edges.top) {\n modifiedY = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top);\n }\n else if (edges.bottom) {\n modifiedY = Math.max(Math.min(outer.bottom - offset.bottom, page.y), inner.bottom - offset.bottom);\n }\n if (edges.left) {\n modifiedX = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left);\n }\n else if (edges.right) {\n modifiedX = Math.max(Math.min(outer.right - offset.right, page.x), inner.right - offset.right);\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n if (options && options.enabled\n && !(phase === 'start' && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n noInner,\n noOuter,\n getRestrictionRect,\n};\n\nmodifiers.restrictEdges = restrictEdges;\nmodifiers.names.push('restrictEdges');\n\ndefaultOptions.perAction.restrictEdges = restrictEdges.defaults;\nresize.defaults.restrictEdges = restrictEdges.defaults;\n\nmodule.exports = restrictEdges;\n","// This module adds the options.resize.restrictSize setting which sets min and\n// max width and height for the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictSize: {\n// min: { width: -600, height: -600 },\n// max: { width: 600, height: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst restrictEdges = require('./restrictEdges');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst noMin = { width: -Infinity, height: -Infinity };\nconst noMax = { width: +Infinity, height: +Infinity };\n\nconst restrictSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n },\n\n setOffset: function ({ interaction }) {\n return interaction.startOffset;\n },\n\n set: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const rect = rectUtils.xywhToTlbr(interaction.resizeRects.inverted);\n\n const minSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.min, interaction)) || noMin;\n const maxSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.max, interaction)) || noMax;\n\n arg.options = {\n enabled: options.enabled,\n endOnly: options.endOnly,\n inner: utils.extend({}, restrictEdges.noInner),\n outer: utils.extend({}, restrictEdges.noOuter),\n };\n\n if (edges.top) {\n arg.options.inner.top = rect.bottom - minSize.height;\n arg.options.outer.top = rect.bottom - maxSize.height;\n }\n else if (edges.bottom) {\n arg.options.inner.bottom = rect.top + minSize.height;\n arg.options.outer.bottom = rect.top + maxSize.height;\n }\n if (edges.left) {\n arg.options.inner.left = rect.right - minSize.width;\n arg.options.outer.left = rect.right - maxSize.width;\n }\n else if (edges.right) {\n arg.options.inner.right = rect.left + minSize.width;\n arg.options.outer.right = rect.left + maxSize.width;\n }\n\n restrictEdges.set(arg);\n },\n\n modifyCoords: restrictEdges.modifyCoords,\n};\n\nmodifiers.restrictSize = restrictSize;\nmodifiers.names.push('restrictSize');\n\ndefaultOptions.perAction.restrictSize = restrictSize.defaults;\nresize.defaults.restrictSize = restrictSize.defaults;\n\nmodule.exports = restrictSize;\n","const modifiers = require('./index');\nconst interact = require('../interact');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst snap = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n\n relativePoints: null,\n },\n\n setOffset: function ({ interaction, interactable, element, rect, startOffset, options }) {\n const offsets = [];\n const optionsOrigin = utils.rectToXY(utils.resolveRectLike(options.origin));\n const origin = optionsOrigin || utils.getOriginXY(interactable, element, interaction.prepared.name);\n options = options || interactable.options[interaction.prepared.name].snap || {};\n\n let snapOffset;\n\n if (options.offset === 'startCoords') {\n snapOffset = {\n x: interaction.startCoords.page.x - origin.x,\n y: interaction.startCoords.page.y - origin.y,\n };\n }\n else {\n const offsetRect = utils.resolveRectLike(options.offset, interactable, element, [interaction]);\n\n snapOffset = utils.rectToXY(offsetRect) || { x: 0, y: 0 };\n }\n\n if (rect && options.relativePoints && options.relativePoints.length) {\n for (const { x: relativeX, y: relativeY } of options.relativePoints) {\n offsets.push({\n x: startOffset.left - (rect.width * relativeX) + snapOffset.x,\n y: startOffset.top - (rect.height * relativeY) + snapOffset.y,\n });\n }\n }\n else {\n offsets.push(snapOffset);\n }\n\n return offsets;\n },\n\n set: function ({ interaction, pageCoords, status, options, offset: offsets }) {\n const targets = [];\n let target;\n let page;\n let i;\n\n if (status.useStatusXY) {\n page = { x: status.x, y: status.y };\n }\n else {\n const origin = utils.getOriginXY(interaction.target, interaction.element, interaction.prepared.name);\n\n page = utils.extend({}, pageCoords);\n\n page.x -= origin.x;\n page.y -= origin.y;\n }\n\n status.realX = page.x;\n status.realY = page.y;\n\n let len = options.targets? options.targets.length : 0;\n\n for (const { x: offsetX, y: offsetY } of offsets) {\n const relativeX = page.x - offsetX;\n const relativeY = page.y - offsetY;\n\n for (const snapTarget of options.targets) {\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n targets.push({\n x: utils.is.number(target.x) ? (target.x + offsetX) : relativeX,\n y: utils.is.number(target.y) ? (target.y + offsetY) : relativeY,\n\n range: utils.is.number(target.range)? target.range: options.range,\n });\n }\n }\n\n const closest = {\n target: null,\n inRange: false,\n distance: 0,\n range: 0,\n dx: 0,\n dy: 0,\n };\n\n for (i = 0, len = targets.length; i < len; i++) {\n target = targets[i];\n\n const range = target.range;\n const dx = target.x - page.x;\n const dy = target.y - page.y;\n const distance = utils.hypot(dx, dy);\n let inRange = distance <= range;\n\n // Infinite targets count as being out of range\n // compared to non infinite ones that are in range\n if (range === Infinity && closest.inRange && closest.range !== Infinity) {\n inRange = false;\n }\n\n if (!closest.target || (inRange\n // is the closest target in range?\n ? (closest.inRange && range !== Infinity\n // the pointer is relatively deeper in this target\n ? distance / range < closest.distance / closest.range\n // this target has Infinite range and the closest doesn't\n : (range === Infinity && closest.range !== Infinity)\n // OR this target is closer that the previous closest\n || distance < closest.distance)\n // The other is not in range and the pointer is closer to this target\n : (!closest.inRange && distance < closest.distance))) {\n\n closest.target = target;\n closest.distance = distance;\n closest.range = range;\n closest.inRange = inRange;\n closest.dx = dx;\n closest.dy = dy;\n\n status.range = range;\n }\n }\n\n let snapChanged;\n\n if (closest.target) {\n snapChanged = (status.modifiedX !== closest.target.x || status.modifiedY !== closest.target.y);\n\n status.modifiedX = closest.target.x;\n status.modifiedY = closest.target.y;\n }\n else {\n snapChanged = true;\n\n status.modifiedX = NaN;\n status.modifiedY = NaN;\n }\n\n status.dx = closest.dx;\n status.dy = closest.dy;\n\n status.changed = (snapChanged || (closest.inRange && !status.locked));\n status.locked = closest.inRange;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const relativePoints = options && options.relativePoints;\n\n if (options && options.enabled\n && !(phase === 'start' && relativePoints && relativePoints.length)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n }\n\n return {\n range : status.range,\n locked : status.locked,\n x : status.modifiedX,\n y : status.modifiedY,\n realX : status.realX,\n realY : status.realY,\n dx : status.dx,\n dy : status.dy,\n };\n }\n },\n};\n\ninteract.createSnapGrid = function (grid) {\n return function (x, y) {\n const limits = grid.limits || {\n left : -Infinity,\n right : Infinity,\n top : -Infinity,\n bottom: Infinity,\n };\n let offsetX = 0;\n let offsetY = 0;\n\n if (utils.is.object(grid.offset)) {\n offsetX = grid.offset.x;\n offsetY = grid.offset.y;\n }\n\n const gridx = Math.round((x - offsetX) / grid.x);\n const gridy = Math.round((y - offsetY) / grid.y);\n\n const newX = Math.max(limits.left, Math.min(limits.right , gridx * grid.x + offsetX));\n const newY = Math.max(limits.top , Math.min(limits.bottom, gridy * grid.y + offsetY));\n\n return {\n x: newX,\n y: newY,\n range: grid.range,\n };\n };\n};\n\nmodifiers.snap = snap;\nmodifiers.names.push('snap');\n\ndefaultOptions.perAction.snap = snap.defaults;\n\nmodule.exports = snap;\n","// This module allows snapping of the size of targets during resize\n// interactions.\n\nconst modifiers = require('./index');\nconst snap = require('./snap');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\nconst utils = require('../utils/');\n\nconst snapSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n },\n\n setOffset: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.edges;\n\n if (!edges) { return; }\n\n arg.options = {\n relativePoints: [{\n x: edges.left? 0 : 1,\n y: edges.top ? 0 : 1,\n }],\n origin: { x: 0, y: 0 },\n offset: 'self',\n range: options.range,\n };\n\n const offsets = snap.setOffset(arg);\n arg.options = options;\n\n return offsets;\n },\n\n set: function (arg) {\n const { interaction, options, offset, pageCoords } = arg;\n const page = utils.extend({}, pageCoords);\n const relativeX = page.x - offset[0].x;\n const relativeY = page.y - offset[0].y;\n\n arg.options = utils.extend({}, options);\n arg.options.targets = [];\n\n for (const snapTarget of options.targets) {\n let target;\n\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n if ('width' in target && 'height' in target) {\n target.x = target.width;\n target.y = target.height;\n }\n\n arg.options.targets.push(target);\n }\n\n snap.set(arg);\n },\n\n modifyCoords: function (arg) {\n const { options } = arg;\n\n arg.options = utils.extend({}, options);\n arg.options.enabled = options.enabled;\n arg.options.relativePoints = [null];\n\n snap.modifyCoords(arg);\n },\n};\n\nmodifiers.snapSize = snapSize;\nmodifiers.names.push('snapSize');\n\ndefaultOptions.perAction.snapSize = snapSize.defaults;\nresize.defaults.snapSize = snapSize.defaults;\n\nmodule.exports = snapSize;\n","const pointerUtils = require('../utils/pointerUtils');\n\nmodule.exports = class PointerEvent {\n constructor (type, pointer, event, eventTarget, interaction) {\n pointerUtils.pointerExtend(this, event);\n\n if (event !== pointer) {\n pointerUtils.pointerExtend(this, pointer);\n }\n\n this.interaction = interaction;\n\n this.timeStamp = new Date().getTime();\n this.originalEvent = event;\n this.type = type;\n this.pointerId = pointerUtils.getPointerId(pointer);\n this.pointerType = pointerUtils.getPointerType(pointer, interaction);\n this.target = eventTarget;\n this.currentTarget = null;\n\n if (type === 'tap') {\n const pointerIndex = interaction.getPointerIndex(pointer);\n this.dt = this.timeStamp - interaction.downTimes[pointerIndex];\n\n const interval = this.timeStamp - interaction.tapTime;\n\n this.double = !!(interaction.prevTap\n && interaction.prevTap.type !== 'doubletap'\n && interaction.prevTap.target === this.target\n && interval < 500);\n }\n else if (type === 'doubletap') {\n this.dt = pointer.timeStamp - interaction.tapTime;\n }\n }\n\n subtractOrigin ({ x: originX, y: originY }) {\n this.pageX -= originX;\n this.pageY -= originY;\n this.clientX -= originX;\n this.clientY -= originY;\n\n return this;\n }\n\n addOrigin ({ x: originX, y: originY }) {\n this.pageX += originX;\n this.pageY += originY;\n this.clientX += originX;\n this.clientY += originY;\n\n return this;\n }\n\n preventDefault () {\n this.originalEvent.preventDefault();\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n};\n","const PointerEvent = require('./PointerEvent');\nconst Interaction = require('../Interaction');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst defaults = require('../defaultOptions');\nconst signals = require('../utils/Signals').new();\nconst { filter } = require('../utils/arr');\n\nconst simpleSignals = [ 'down', 'up', 'cancel' ];\nconst simpleEvents = [ 'down', 'up', 'cancel' ];\n\nconst pointerEvents = {\n PointerEvent,\n fire,\n collectEventTargets,\n signals,\n defaults: {\n holdDuration: 600,\n ignoreFrom : null,\n allowFrom : null,\n origin : { x: 0, y: 0 },\n },\n types: [\n 'down',\n 'move',\n 'up',\n 'cancel',\n 'tap',\n 'doubletap',\n 'hold',\n ],\n};\n\nfunction fire (arg) {\n const {\n interaction, pointer, event, eventTarget,\n type = arg.pointerEvent.type,\n targets = collectEventTargets(arg),\n pointerEvent = new PointerEvent(type, pointer, event, eventTarget, interaction),\n } = arg;\n\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n targets,\n type,\n pointerEvent,\n };\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n\n for (const prop in target.props || {}) {\n pointerEvent[prop] = target.props[prop];\n }\n\n const origin = utils.getOriginXY(target.eventable, target.element);\n\n pointerEvent.subtractOrigin(origin);\n pointerEvent.eventable = target.eventable;\n pointerEvent.currentTarget = target.element;\n\n target.eventable.fire(pointerEvent);\n\n pointerEvent.addOrigin(origin);\n\n if (pointerEvent.immediatePropagationStopped\n || (pointerEvent.propagationStopped\n && (i + 1) < targets.length && targets[i + 1].element !== pointerEvent.currentTarget)) {\n break;\n }\n }\n\n signals.fire('fired', signalArg);\n\n if (type === 'tap') {\n // if pointerEvent should make a double tap, create and fire a doubletap\n // PointerEvent and use that as the prevTap\n const prevTap = pointerEvent.double\n ? fire({\n interaction, pointer, event, eventTarget,\n type: 'doubletap',\n })\n : pointerEvent;\n\n interaction.prevTap = prevTap;\n interaction.tapTime = prevTap.timeStamp;\n }\n\n return pointerEvent;\n}\n\nfunction collectEventTargets ({ interaction, pointer, event, eventTarget, type }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n // do not fire a tap event if the pointer was moved before being lifted\n if (type === 'tap' && (interaction.pointerWasMoved\n // or if the pointerup target is different to the pointerdown target\n || !(interaction.downTargets[pointerIndex] && interaction.downTargets[pointerIndex] === eventTarget))) {\n return [];\n }\n\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n path,\n targets: [],\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (type === 'hold') {\n signalArg.targets = filter(signalArg.targets, target =>\n target.eventable.options.holdDuration === interaction.holdTimers[pointerIndex].duration);\n }\n\n return signalArg.targets;\n}\n\nInteraction.signals.on('update-pointer-down', function ({ interaction, pointerIndex }) {\n interaction.holdTimers[pointerIndex] = { duration: Infinity, timeout: null };\n});\n\nInteraction.signals.on('remove-pointer', function ({ interaction, pointerIndex }) {\n interaction.holdTimers.splice(pointerIndex, 1);\n});\n\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget, duplicateMove }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n if (!duplicateMove && (!interaction.pointerIsDown || interaction.pointerWasMoved)) {\n if (interaction.pointerIsDown) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n\n fire({\n interaction, pointer, event, eventTarget,\n type: 'move',\n });\n }\n});\n\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget, pointerIndex }) {\n // copy event to be used in timeout for IE8\n const eventCopy = browser.isIE8? utils.extend({}, event) : event;\n\n const timer = interaction.holdTimers[pointerIndex];\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'hold',\n targets: [],\n path,\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (!signalArg.targets.length) { return; }\n\n let minDuration = Infinity;\n\n for (let i = 0; i < signalArg.targets.length; i++) {\n const target = signalArg.targets[i];\n const holdDuration = target.eventable.options.holdDuration;\n\n if (holdDuration < minDuration) {\n minDuration = holdDuration;\n }\n }\n\n timer.duration = minDuration;\n timer.timeout = setTimeout(function () {\n fire({\n interaction, eventCopy, eventTarget,\n pointer: browser.isIE8? eventCopy : pointer,\n type: 'hold',\n });\n }, minDuration);\n});\n\nInteraction.signals.on('up', ({ interaction, pointer, event, eventTarget }) => {\n if (!interaction.pointerWasMoved) {\n fire({ interaction, eventTarget, pointer, event, type: 'tap' });\n }\n});\n\n['up', 'cancel'].forEach(function (signalName) {\n Interaction.signals.on(signalName, function ({ interaction, pointerIndex }) {\n if (interaction.holdTimers[pointerIndex]) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n });\n});\n\nfunction createSignalListener (type) {\n return function ({ interaction, pointer, event, eventTarget }) {\n fire({ interaction, eventTarget, pointer, event, type });\n };\n}\n\nfor (let i = 0; i < simpleSignals.length; i++) {\n Interaction.signals.on(simpleSignals[i], createSignalListener(simpleEvents[i]));\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.prevTap = null; // the most recent tap event on this interaction\n interaction.tapTime = 0; // time of the most recent tap event\n interaction.holdTimers = []; // [{ duration, timeout }]\n});\n\ndefaults.pointerEvents = pointerEvents.defaults;\nmodule.exports = pointerEvents;\n","const pointerEvents = require('./base');\nconst Interaction = require('../Interaction');\n\npointerEvents.signals.on('new', onNew);\npointerEvents.signals.on('fired', onFired);\n\nfor (const signal of ['move', 'up', 'cancel', 'endall']) {\n Interaction.signals.on(signal, endHoldRepeat);\n}\n\nfunction onNew ({ pointerEvent }) {\n if (pointerEvent.type !== 'hold') { return; }\n\n pointerEvent.count = (pointerEvent.count || 0) + 1;\n}\n\nfunction onFired ({ interaction, pointerEvent, eventTarget, targets }) {\n if (pointerEvent.type !== 'hold' || !targets.length) { return; }\n\n // get the repeat interval from the first eventable\n const interval = targets[0].eventable.options.holdRepeatInterval;\n\n // don't repeat if the interval is 0 or less\n if (interval <= 0) { return; }\n\n // set a timeout to fire the holdrepeat event\n interaction.holdIntervalHandle = setTimeout(function () {\n pointerEvents.fire({\n interaction,\n eventTarget,\n type: 'hold',\n pointer: pointerEvent,\n event: pointerEvent,\n });\n }, interval);\n}\n\nfunction endHoldRepeat ({ interaction }) {\n // set the interaction's holdStopTime property\n // to stop further holdRepeat events\n if (interaction.holdIntervalHandle) {\n clearInterval(interaction.holdIntervalHandle);\n interaction.holdIntervalHandle = null;\n }\n}\n\n// don't repeat by default\npointerEvents.defaults.holdRepeatInterval = 0;\npointerEvents.types.push('holdrepeat');\n\nmodule.exports = {\n onNew,\n onFired,\n endHoldRepeat,\n};\n","const pointerEvents = require('./base');\nconst Interactable = require('../Interactable');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\nconst scope = require('../scope');\nconst extend = require('../utils/extend');\nconst { merge } = require('../utils/arr');\n\npointerEvents.signals.on('collect-targets', function ({ targets, element, type, eventTarget }) {\n function collectSelectors (interactable, selector, context) {\n const els = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && is.element(element)\n && domUtils.matchesSelector(element, selector, els)\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n const interactable = scope.interactables.get(element);\n\n if (interactable) {\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n scope.interactables.forEachSelector(collectSelectors, element);\n});\n\nInteractable.signals.on('new', function ({ interactable }) {\n interactable.events.getRect = function (element) {\n return interactable.getRect(element);\n };\n});\n\nInteractable.signals.on('set', function ({ interactable, options }) {\n extend(interactable.events.options, pointerEvents.defaults);\n extend(interactable.events.options, options);\n});\n\nmerge(Interactable.eventTypes, pointerEvents.types);\n\nInteractable.prototype.pointerEvents = function (options) {\n extend(this.events.options, options);\n\n return this;\n};\n\nconst __backCompatOption = Interactable.prototype._backCompatOption;\n\nInteractable.prototype._backCompatOption = function (optionName, newValue) {\n const ret = __backCompatOption.call(this, optionName, newValue);\n\n if (ret === this) {\n this.events.options[optionName] = newValue;\n }\n\n return ret;\n};\n\nInteractable.settingsMethods.push('pointerEvents');\n","const utils = require('./utils');\nconst events = require('./utils/events');\nconst signals = require('./utils/Signals').new();\n\nconst scope = {\n signals,\n events,\n utils,\n\n // main document\n document: require('./utils/domObjects').document,\n // all documents being listened to\n documents: [],\n\n addDocument: function (doc, win) {\n // do nothing if document is already known\n if (utils.contains(scope.documents, doc)) { return false; }\n\n win = win || scope.getWindow(doc);\n\n scope.documents.push(doc);\n events.documents.push(doc);\n\n // don't add an unload event for the main document\n // so that the page may be cached in browser history\n if (doc !== scope.document) {\n events.add(win, 'unload', scope.onWindowUnload);\n }\n\n signals.fire('add-document', { doc, win });\n },\n\n removeDocument: function (doc, win) {\n const index = utils.indexOf(scope.documents, doc);\n\n win = win || scope.getWindow(doc);\n\n events.remove(win, 'unload', scope.onWindowUnload);\n\n scope.documents.splice(index, 1);\n events.documents.splice(index, 1);\n\n signals.fire('remove-document', { win, doc });\n },\n\n onWindowUnload: function () {\n scope.removeDocument(this.document, this);\n },\n};\n\nmodule.exports = scope;\n","const { indexOf } = require('./arr');\n\nclass Signals {\n constructor () {\n this.listeners = {\n // signalName: [listeners],\n };\n }\n\n on (name, listener) {\n if (!this.listeners[name]) {\n this.listeners[name] = [listener];\n return;\n }\n\n this.listeners[name].push(listener);\n }\n\n off (name, listener) {\n if (!this.listeners[name]) { return; }\n\n const index = indexOf(this.listeners[name], listener);\n\n if (index !== -1) {\n this.listeners[name].splice(index, 1);\n }\n }\n\n fire (name, arg) {\n const targetListeners = this.listeners[name];\n\n if (!targetListeners) { return; }\n\n for (let i = 0; i < targetListeners.length; i++) {\n if (targetListeners[i](arg, name) === false) {\n return;\n }\n }\n }\n}\n\nSignals.new = function () {\n return new Signals();\n};\n\nmodule.exports = Signals;\n","function indexOf (array, target) {\n for (let i = 0, len = array.length; i < len; i++) {\n if (array[i] === target) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction contains (array, target) {\n return indexOf(array, target) !== -1;\n}\n\nfunction merge (target, source) {\n for (let i = 0; i < source.length; i++) {\n target.push(source[i]);\n }\n\n return target;\n}\n\nfunction filter (array, test) {\n const result = [];\n\n for (let i = 0; i < array.length; i++) {\n if (test(array[i])) {\n result.push(array[i]);\n }\n }\n\n return result;\n}\n\nmodule.exports = {\n indexOf,\n contains,\n merge,\n filter,\n};\n","const { window } = require('./window');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst Element = domObjects.Element;\nconst navigator = window.navigator;\n\nconst browser = {\n // Does the browser support touch input?\n supportsTouch: !!(('ontouchstart' in window) || is.function(window.DocumentTouch)\n && domObjects.document instanceof window.DocumentTouch),\n\n // Does the browser support PointerEvents\n supportsPointerEvent: !!domObjects.PointerEvent,\n\n isIE8: ('attachEvent' in window) && !('addEventListener' in window),\n\n // Opera Mobile must be handled differently\n isOperaMobile: (navigator.appName === 'Opera'\n && browser.supportsTouch\n && navigator.userAgent.match('Presto')),\n\n // scrolling doesn't change the result of getClientRects on iOS 7\n isIOS7: (/iP(hone|od|ad)/.test(navigator.platform)\n && /OS 7[^\\d]/.test(navigator.appVersion)),\n\n isIe9OrOlder: /MSIE (8|9)/.test(navigator.userAgent),\n\n // prefix matchesSelector\n prefixedMatchesSelector: 'matches' in Element.prototype\n ? 'matches': 'webkitMatchesSelector' in Element.prototype\n ? 'webkitMatchesSelector': 'mozMatchesSelector' in Element.prototype\n ? 'mozMatchesSelector': 'oMatchesSelector' in Element.prototype\n ? 'oMatchesSelector': 'msMatchesSelector',\n\n useMatchesSelectorPolyfill: false,\n\n pEventTypes: (domObjects.PointerEvent\n ? (domObjects.PointerEvent === window.MSPointerEvent\n ? {\n up: 'MSPointerUp',\n down: 'MSPointerDown',\n over: 'mouseover',\n out: 'mouseout',\n move: 'MSPointerMove',\n cancel: 'MSPointerCancel',\n }\n : {\n up: 'pointerup',\n down: 'pointerdown',\n over: 'pointerover',\n out: 'pointerout',\n move: 'pointermove',\n cancel: 'pointercancel',\n })\n : null),\n\n // because Webkit and Opera still use 'mousewheel' event type\n wheelEvent: 'onmousewheel' in domObjects.document? 'mousewheel': 'wheel',\n\n};\n\nbrowser.useMatchesSelectorPolyfill = !is.function(Element.prototype[browser.prefixedMatchesSelector]);\n\nmodule.exports = browser;\n","const domObjects = {};\nconst win = require('./window').window;\n\nfunction blank () {}\n\ndomObjects.document = win.document;\ndomObjects.DocumentFragment = win.DocumentFragment || blank;\ndomObjects.SVGElement = win.SVGElement || blank;\ndomObjects.SVGSVGElement = win.SVGSVGElement || blank;\ndomObjects.SVGElementInstance = win.SVGElementInstance || blank;\ndomObjects.Element = win.Element || blank;\ndomObjects.HTMLElement = win.HTMLElement || domObjects.Element;\n\ndomObjects.Event = win.Event;\ndomObjects.Touch = win.Touch || blank;\ndomObjects.PointerEvent = (win.PointerEvent || win.MSPointerEvent);\n\nmodule.exports = domObjects;\n","const win = require('./window');\nconst browser = require('./browser');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst domUtils = {\n nodeContains: function (parent, child) {\n while (child) {\n if (child === parent) {\n return true;\n }\n\n child = child.parentNode;\n }\n\n return false;\n },\n\n closest: function (element, selector) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) { return element; }\n\n element = domUtils.parentNode(element);\n }\n\n return null;\n },\n\n parentNode: function (node) {\n let parent = node.parentNode;\n\n if (is.docFrag(parent)) {\n // skip past #shado-root fragments\n while ((parent = parent.host) && is.docFrag(parent)) {\n continue;\n }\n\n return parent;\n }\n\n return parent;\n },\n\n // taken from http://tanalin.com/en/blog/2012/12/matches-selector-ie8/ and modified\n matchesSelectorPolyfill: browser.useMatchesSelectorPolyfill\n ? function (element, selector, elems) {\n elems = elems || element.parentNode.querySelectorAll(selector);\n\n for (let i = 0, len = elems.length; i < len; i++) {\n if (elems[i] === element) {\n return true;\n }\n }\n\n return false;\n }\n : null,\n\n matchesSelector: function (element, selector, nodeList) {\n if (browser.useMatchesSelectorPolyfill) {\n return domUtils.matchesSelectorPolyfill(element, selector, nodeList);\n }\n\n // remove /deep/ from selectors if shadowDOM polyfill is used\n if (win.window !== win.realWindow) {\n selector = selector.replace(/\\/deep\\//g, ' ');\n }\n\n return element[browser.prefixedMatchesSelector](selector);\n },\n\n // Test for the element that's \"above\" all other qualifiers\n indexOfDeepestElement: function (elements) {\n let deepestZoneParents = [];\n let dropzoneParents = [];\n let dropzone;\n let deepestZone = elements[0];\n let index = deepestZone? 0: -1;\n let parent;\n let child;\n let i;\n let n;\n\n for (i = 1; i < elements.length; i++) {\n dropzone = elements[i];\n\n // an element might belong to multiple selector dropzones\n if (!dropzone || dropzone === deepestZone) {\n continue;\n }\n\n if (!deepestZone) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n // check if the deepest or current are document.documentElement or document.rootElement\n // - if the current dropzone is, do nothing and continue\n if (dropzone.parentNode === dropzone.ownerDocument) {\n continue;\n }\n // - if deepest is, update with the current dropzone and continue to next\n else if (deepestZone.parentNode === dropzone.ownerDocument) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n if (!deepestZoneParents.length) {\n parent = deepestZone;\n while (parent.parentNode && parent.parentNode !== parent.ownerDocument) {\n deepestZoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n }\n\n // if this element is an svg element and the current deepest is\n // an HTMLElement\n if (deepestZone instanceof domObjects.HTMLElement\n && dropzone instanceof domObjects.SVGElement\n && !(dropzone instanceof domObjects.SVGSVGElement)) {\n\n if (dropzone === deepestZone.parentNode) {\n continue;\n }\n\n parent = dropzone.ownerSVGElement;\n }\n else {\n parent = dropzone;\n }\n\n dropzoneParents = [];\n\n while (parent.parentNode !== parent.ownerDocument) {\n dropzoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n\n n = 0;\n\n // get (position of last common ancestor) + 1\n while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) {\n n++;\n }\n\n const parents = [\n dropzoneParents[n - 1],\n dropzoneParents[n],\n deepestZoneParents[n],\n ];\n\n child = parents[0].lastChild;\n\n while (child) {\n if (child === parents[1]) {\n deepestZone = dropzone;\n index = i;\n deepestZoneParents = [];\n\n break;\n }\n else if (child === parents[2]) {\n break;\n }\n\n child = child.previousSibling;\n }\n }\n\n return index;\n },\n\n matchesUpTo: function (element, selector, limit) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) {\n return true;\n }\n\n element = domUtils.parentNode(element);\n\n if (element === limit) {\n return domUtils.matchesSelector(element, selector);\n }\n }\n\n return false;\n },\n\n getActualElement: function (element) {\n return (element instanceof domObjects.SVGElementInstance\n ? element.correspondingUseElement\n : element);\n },\n\n getScrollXY: function (relevantWindow) {\n relevantWindow = relevantWindow || win.window;\n return {\n x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft,\n y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop,\n };\n },\n\n getElementClientRect: function (element) {\n const clientRect = (element instanceof domObjects.SVGElement\n ? element.getBoundingClientRect()\n : element.getClientRects()[0]);\n\n return clientRect && {\n left : clientRect.left,\n right : clientRect.right,\n top : clientRect.top,\n bottom: clientRect.bottom,\n width : clientRect.width || clientRect.right - clientRect.left,\n height: clientRect.height || clientRect.bottom - clientRect.top,\n };\n },\n\n getElementRect: function (element) {\n const clientRect = domUtils.getElementClientRect(element);\n\n if (!browser.isIOS7 && clientRect) {\n const scroll = domUtils.getScrollXY(win.getWindow(element));\n\n clientRect.left += scroll.x;\n clientRect.right += scroll.x;\n clientRect.top += scroll.y;\n clientRect.bottom += scroll.y;\n }\n\n return clientRect;\n },\n\n getPath: function (element) {\n const path = [];\n\n while (element) {\n path.push(element);\n element = domUtils.parentNode(element);\n }\n\n return path;\n },\n\n trySelector: value => {\n if (!is.string(value)) { return false; }\n\n // an exception will be raised if it is invalid\n domObjects.document.querySelector(value);\n return true;\n },\n};\n\nmodule.exports = domUtils;\n","const is = require('./is');\nconst domUtils = require('./domUtils');\nconst pExtend = require('./pointerExtend');\n\nconst { window, getWindow } = require('./window');\nconst { indexOf, contains } = require('./arr');\n\nconst useAttachEvent = ('attachEvent' in window) && !('addEventListener' in window);\nconst addEvent = useAttachEvent? 'attachEvent': 'addEventListener';\nconst removeEvent = useAttachEvent? 'detachEvent': 'removeEventListener';\nconst on = useAttachEvent? 'on': '';\n\nconst elements = [];\nconst targets = [];\nconst attachedListeners = [];\n\n// {\n// type: {\n// selectors: ['selector', ...],\n// contexts : [document, ...],\n// listeners: [[listener, capture, passive], ...]\n// }\n// }\nconst delegatedEvents = {};\n\nconst documents = [];\n\nconst supportsOptions = !useAttachEvent && (() => {\n let supported = false;\n\n window.document.createElement('div').addEventListener('test', null, {\n get capture () { supported = true; },\n });\n\n return supported;\n})();\n\nfunction add (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n let elementIndex = indexOf(elements, element);\n let target = targets[elementIndex];\n\n if (!target) {\n target = {\n events: {},\n typeCount: 0,\n };\n\n elementIndex = elements.push(element) - 1;\n targets.push(target);\n\n attachedListeners.push(useAttachEvent\n ? {\n supplied: [],\n wrapped : [],\n useCount: [],\n }\n : null);\n }\n\n if (!target.events[type]) {\n target.events[type] = [];\n target.typeCount++;\n }\n\n if (!contains(target.events[type], listener)) {\n let ret;\n\n if (useAttachEvent) {\n const { supplied, wrapped, useCount } = attachedListeners[elementIndex];\n const listenerIndex = indexOf(supplied, listener);\n\n const wrappedListener = wrapped[listenerIndex] || function (event) {\n if (!event.immediatePropagationStopped) {\n event.target = event.srcElement;\n event.currentTarget = element;\n\n event.preventDefault = event.preventDefault || preventDef;\n event.stopPropagation = event.stopPropagation || stopProp;\n event.stopImmediatePropagation = event.stopImmediatePropagation || stopImmProp;\n\n if (/mouse|click/.test(event.type)) {\n event.pageX = event.clientX + getWindow(element).document.documentElement.scrollLeft;\n event.pageY = event.clientY + getWindow(element).document.documentElement.scrollTop;\n }\n\n listener(event);\n }\n };\n\n ret = element[addEvent](on + type, wrappedListener, !!options.capture);\n\n if (listenerIndex === -1) {\n supplied.push(listener);\n wrapped.push(wrappedListener);\n useCount.push(1);\n }\n else {\n useCount[listenerIndex]++;\n }\n }\n else {\n ret = element[addEvent](type, listener, supportsOptions? options : !!options.capture);\n }\n target.events[type].push(listener);\n\n return ret;\n }\n}\n\nfunction remove (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const elementIndex = indexOf(elements, element);\n const target = targets[elementIndex];\n\n if (!target || !target.events) {\n return;\n }\n\n let wrappedListener = listener;\n let listeners;\n let listenerIndex;\n\n if (useAttachEvent) {\n listeners = attachedListeners[elementIndex];\n listenerIndex = indexOf(listeners.supplied, listener);\n wrappedListener = listeners.wrapped[listenerIndex];\n }\n\n if (type === 'all') {\n for (type in target.events) {\n if (target.events.hasOwnProperty(type)) {\n remove(element, type, 'all');\n }\n }\n return;\n }\n\n if (target.events[type]) {\n const len = target.events[type].length;\n\n if (listener === 'all') {\n for (let i = 0; i < len; i++) {\n remove(element, type, target.events[type][i], options);\n }\n return;\n }\n else {\n for (let i = 0; i < len; i++) {\n if (target.events[type][i] === listener) {\n element[removeEvent](on + type, wrappedListener, supportsOptions? options : !!options.capture);\n target.events[type].splice(i, 1);\n\n if (useAttachEvent && listeners) {\n listeners.useCount[listenerIndex]--;\n if (listeners.useCount[listenerIndex] === 0) {\n listeners.supplied.splice(listenerIndex, 1);\n listeners.wrapped.splice(listenerIndex, 1);\n listeners.useCount.splice(listenerIndex, 1);\n }\n }\n\n break;\n }\n }\n }\n\n if (target.events[type] && target.events[type].length === 0) {\n target.events[type] = null;\n target.typeCount--;\n }\n }\n\n if (!target.typeCount) {\n targets.splice(elementIndex, 1);\n elements.splice(elementIndex, 1);\n attachedListeners.splice(elementIndex, 1);\n }\n}\n\nfunction addDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n if (!delegatedEvents[type]) {\n delegatedEvents[type] = {\n selectors: [],\n contexts : [],\n listeners: [],\n };\n\n // add delegate listener functions\n for (let i = 0; i < documents.length; i++) {\n add(documents[i], type, delegateListener);\n add(documents[i], type, delegateUseCapture, true);\n }\n }\n\n const delegated = delegatedEvents[type];\n let index;\n\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n break;\n }\n }\n\n if (index === -1) {\n index = delegated.selectors.length;\n\n delegated.selectors.push(selector);\n delegated.contexts .push(context);\n delegated.listeners.push([]);\n }\n\n // keep listener and capture and passive flags\n delegated.listeners[index].push([listener, !!options.capture, options.passive]);\n}\n\nfunction removeDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const delegated = delegatedEvents[type];\n let matchFound = false;\n let index;\n\n if (!delegated) { return; }\n\n // count from last index of delegated to 0\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n // look for matching selector and context Node\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n\n const listeners = delegated.listeners[index];\n\n // each item of the listeners array is an array: [function, capture, passive]\n for (let i = listeners.length - 1; i >= 0; i--) {\n const [fn, capture, passive] = listeners[i];\n\n // check if the listener functions and capture and passive flags match\n if (fn === listener && capture === !!options.capture && passive === options.passive) {\n // remove the listener from the array of listeners\n listeners.splice(i, 1);\n\n // if all listeners for this interactable have been removed\n // remove the interactable from the delegated arrays\n if (!listeners.length) {\n delegated.selectors.splice(index, 1);\n delegated.contexts .splice(index, 1);\n delegated.listeners.splice(index, 1);\n\n // remove delegate function from context\n remove(context, type, delegateListener);\n remove(context, type, delegateUseCapture, true);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegatedEvents[type] = null;\n }\n }\n\n // only remove one listener\n matchFound = true;\n break;\n }\n }\n\n if (matchFound) { break; }\n }\n }\n}\n\n// bound to the interactable context when a DOM event\n// listener is added to a selector interactable\nfunction delegateListener (event, optionalArg) {\n const options = getOptions(optionalArg);\n const fakeEvent = {};\n const delegated = delegatedEvents[event.type];\n const eventTarget = (domUtils.getActualElement(event.path\n ? event.path[0]\n : event.target));\n let element = eventTarget;\n\n // duplicate the event so that currentTarget can be changed\n pExtend(fakeEvent, event);\n\n fakeEvent.originalEvent = event;\n fakeEvent.preventDefault = preventOriginalDefault;\n\n // climb up document tree looking for selector matches\n while (is.element(element)) {\n for (let i = 0; i < delegated.selectors.length; i++) {\n const selector = delegated.selectors[i];\n const context = delegated.contexts[i];\n\n if (domUtils.matchesSelector(element, selector)\n && domUtils.nodeContains(context, eventTarget)\n && domUtils.nodeContains(context, element)) {\n\n const listeners = delegated.listeners[i];\n\n fakeEvent.currentTarget = element;\n\n for (let j = 0; j < listeners.length; j++) {\n const [fn, capture, passive] = listeners[j];\n\n if (capture === !!options.capture && passive === options.passive) {\n fn(fakeEvent);\n }\n }\n }\n }\n\n element = domUtils.parentNode(element);\n }\n}\n\nfunction delegateUseCapture (event) {\n return delegateListener.call(this, event, true);\n}\n\nfunction preventDef () {\n this.returnValue = false;\n}\n\nfunction preventOriginalDefault () {\n this.originalEvent.preventDefault();\n}\n\nfunction stopProp () {\n this.cancelBubble = true;\n}\n\nfunction stopImmProp () {\n this.cancelBubble = true;\n this.immediatePropagationStopped = true;\n}\n\nfunction getOptions (param) {\n return is.object(param)? param : { capture: param };\n}\n\nmodule.exports = {\n add,\n remove,\n\n addDelegate,\n removeDelegate,\n\n delegateListener,\n delegateUseCapture,\n delegatedEvents,\n documents,\n\n useAttachEvent,\n supportsOptions,\n\n _elements: elements,\n _targets: targets,\n _attachedListeners: attachedListeners,\n};\n","module.exports = function extend (dest, source) {\n for (const prop in source) {\n dest[prop] = source[prop];\n }\n return dest;\n};\n","const {\n resolveRectLike,\n rectToXY,\n} = require('./rect');\n\nmodule.exports = function (target, element, action) {\n const actionOptions = target.options[action];\n const actionOrigin = actionOptions && actionOptions.origin;\n const origin = actionOrigin || target.options.origin;\n\n const originRect = resolveRectLike(origin, target, element, [target && element]);\n\n return rectToXY(originRect) || { x: 0, y: 0 };\n};\n","module.exports = (x, y) => Math.sqrt(x * x + y * y);\n","const extend = require('./extend');\nconst win = require('./window');\n\nconst utils = {\n warnOnce: function (method, message) {\n let warned = false;\n\n return function () {\n if (!warned) {\n win.window.console.warn(message);\n warned = true;\n }\n\n return method.apply(this, arguments);\n };\n },\n\n // http://stackoverflow.com/a/5634528/2280888\n _getQBezierValue: function (t, p1, p2, p3) {\n const iT = 1 - t;\n return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3;\n },\n\n getQuadraticCurvePoint: function (startX, startY, cpX, cpY, endX, endY, position) {\n return {\n x: utils._getQBezierValue(position, startX, cpX, endX),\n y: utils._getQBezierValue(position, startY, cpY, endY),\n };\n },\n\n // http://gizma.com/easing/\n easeOutQuad: function (t, b, c, d) {\n t /= d;\n return -c * t*(t-2) + b;\n },\n\n copyAction: function (dest, src) {\n dest.name = src.name;\n dest.axis = src.axis;\n dest.edges = src.edges;\n\n return dest;\n },\n\n is : require('./is'),\n extend : extend,\n hypot : require('./hypot'),\n getOriginXY: require('./getOriginXY'),\n};\n\nextend(utils, require('./arr'));\nextend(utils, require('./domUtils'));\nextend(utils, require('./pointerUtils'));\nextend(utils, require('./rect'));\n\nmodule.exports = utils;\n","const scope = require('../scope');\nconst utils = require('./index');\nconst browser = require('./browser');\n\nconst finder = {\n methodOrder: [ 'simulationResume', 'mouse', 'hasPointer', 'idle' ],\n\n search: function (pointer, eventType, eventTarget) {\n const mouseEvent = (/mouse/i.test(pointer.pointerType || eventType)\n // MSPointerEvent.MSPOINTER_TYPE_MOUSE\n || pointer.pointerType === 4);\n const pointerId = utils.getPointerId(pointer);\n const details = { pointer, pointerId, mouseEvent, eventType, eventTarget };\n\n for (const method of finder.methodOrder) {\n const interaction = finder[method](details);\n\n if (interaction) {\n return interaction;\n }\n }\n },\n\n // try to resume simulation with a new pointer\n simulationResume: function ({ mouseEvent, eventType, eventTarget }) {\n if (!/down|start/i.test(eventType)) {\n return null;\n }\n\n for (const interaction of scope.interactions) {\n let element = eventTarget;\n\n if (interaction.simulation && interaction.simulation.allowResume\n && (interaction.mouse === mouseEvent)) {\n while (element) {\n // if the element is the interaction element\n if (element === interaction.element) {\n return interaction;\n }\n element = utils.parentNode(element);\n }\n }\n }\n\n return null;\n },\n\n // if it's a mouse interaction\n mouse: function ({ pointerId, mouseEvent, eventType }) {\n if (!mouseEvent && (browser.supportsTouch || browser.supportsPointerEvent)) {\n return null;\n }\n\n let firstNonActive;\n\n for (const interaction of scope.interactions) {\n if (interaction.mouse) {\n // if it's a down event, skip interactions with running simulations\n if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; }\n\n // if the interaction is active, return it immediately\n if (interaction.interacting()) {\n return interaction;\n }\n // otherwise save it and look for another active interaction\n else if (!firstNonActive) {\n firstNonActive = interaction;\n }\n }\n }\n\n // if no active mouse interaction was found use the first inactive mouse\n // interaction\n if (firstNonActive) {\n return firstNonActive;\n }\n\n // Find any interaction specifically for mouse.\n // ignore the interaction if the eventType is a mousedown, and a simulation\n // is active\n for (const interaction of scope.interactions) {\n if (interaction.mouse && !(/down/.test(eventType) && interaction.simulation)) {\n return interaction;\n }\n }\n\n return null;\n },\n\n // get interaction that has this pointer\n hasPointer: function ({ pointerId }) {\n for (const interaction of scope.interactions) {\n if (utils.contains(interaction.pointerIds, pointerId)) {\n return interaction;\n }\n }\n },\n\n // get first idle interaction\n idle: function ({ mouseEvent }) {\n for (const interaction of scope.interactions) {\n // if there's already a pointer held down\n if (interaction.pointerIds.length === 1) {\n const target = interaction.target;\n // don't add this pointer if there is a target interactable and it\n // isn't gesturable\n if (target && !target.options.gesture.enabled) {\n continue;\n }\n }\n // maximum of 2 pointers per interaction\n else if (interaction.pointerIds.length >= 2) {\n continue;\n }\n\n if (!interaction.interacting() && (mouseEvent === interaction.mouse)) {\n return interaction;\n }\n }\n\n return null;\n },\n};\n\nmodule.exports = finder;\n","const win = require('./window');\nconst isWindow = require('./isWindow');\n\nconst is = {\n array : () => {},\n\n window : thing => thing === win.window || isWindow(thing),\n\n docFrag : thing => is.object(thing) && thing.nodeType === 11,\n\n object : thing => !!thing && (typeof thing === 'object'),\n\n function: thing => typeof thing === 'function',\n\n number : thing => typeof thing === 'number' ,\n\n bool : thing => typeof thing === 'boolean' ,\n\n string : thing => typeof thing === 'string' ,\n\n element: thing => {\n if (!thing || (typeof thing !== 'object')) { return false; }\n\n const _window = win.getWindow(thing) || win.window;\n\n return (/object|function/.test(typeof _window.Element)\n ? thing instanceof _window.Element //DOM2\n : thing.nodeType === 1 && typeof thing.nodeName === 'string');\n },\n};\n\nis.array = thing => (is.object(thing)\n && (typeof thing.length !== 'undefined')\n && is.function(thing.splice));\n\nmodule.exports = is;\n","module.exports = (thing) => !!(thing && thing.Window) && (thing instanceof thing.Window);\n","function pointerExtend (dest, source) {\n for (const prop in source) {\n const prefixedPropREs = module.exports.prefixedPropREs;\n let deprecated = false;\n\n // skip deprecated prefixed properties\n for (const vendor in prefixedPropREs) {\n if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) {\n deprecated = true;\n break;\n }\n }\n\n if (!deprecated && typeof source[prop] !== 'function') {\n dest[prop] = source[prop];\n }\n }\n return dest;\n}\n\npointerExtend.prefixedPropREs = {\n webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/,\n};\n\nmodule.exports = pointerExtend;\n","const hypot = require('./hypot');\nconst browser = require('./browser');\nconst dom = require('./domObjects');\nconst domUtils = require('./domUtils');\nconst is = require('./is');\nconst pointerExtend = require('./pointerExtend');\n\nconst pointerUtils = {\n copyCoords: function (dest, src) {\n dest.page = dest.page || {};\n dest.page.x = src.page.x;\n dest.page.y = src.page.y;\n\n dest.client = dest.client || {};\n dest.client.x = src.client.x;\n dest.client.y = src.client.y;\n\n dest.timeStamp = src.timeStamp;\n },\n\n setCoordDeltas: function (targetObj, prev, cur) {\n targetObj.page.x = cur.page.x - prev.page.x;\n targetObj.page.y = cur.page.y - prev.page.y;\n targetObj.client.x = cur.client.x - prev.client.x;\n targetObj.client.y = cur.client.y - prev.client.y;\n targetObj.timeStamp = cur.timeStamp - prev.timeStamp;\n\n // set pointer velocity\n const dt = Math.max(targetObj.timeStamp / 1000, 0.001);\n\n targetObj.page.speed = hypot(targetObj.page.x, targetObj.page.y) / dt;\n targetObj.page.vx = targetObj.page.x / dt;\n targetObj.page.vy = targetObj.page.y / dt;\n\n targetObj.client.speed = hypot(targetObj.client.x, targetObj.page.y) / dt;\n targetObj.client.vx = targetObj.client.x / dt;\n targetObj.client.vy = targetObj.client.y / dt;\n },\n\n isNativePointer: function (pointer) {\n return (pointer instanceof dom.Event || pointer instanceof dom.Touch);\n },\n\n // Get specified X/Y coords for mouse or event.touches[0]\n getXY: function (type, pointer, xy) {\n xy = xy || {};\n type = type || 'page';\n\n xy.x = pointer[type + 'X'];\n xy.y = pointer[type + 'Y'];\n\n return xy;\n },\n\n getPageXY: function (pointer, page) {\n page = page || {};\n\n // Opera Mobile handles the viewport and scrolling oddly\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n pointerUtils.getXY('screen', pointer, page);\n\n page.x += window.scrollX;\n page.y += window.scrollY;\n }\n else {\n pointerUtils.getXY('page', pointer, page);\n }\n\n return page;\n },\n\n getClientXY: function (pointer, client) {\n client = client || {};\n\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n // Opera Mobile handles the viewport and scrolling oddly\n pointerUtils.getXY('screen', pointer, client);\n }\n else {\n pointerUtils.getXY('client', pointer, client);\n }\n\n return client;\n },\n\n getPointerId: function (pointer) {\n return is.number(pointer.pointerId)? pointer.pointerId : pointer.identifier;\n },\n\n setCoords: function (targetObj, pointers, timeStamp) {\n const pointer = (pointers.length > 1\n ? pointerUtils.pointerAverage(pointers)\n : pointers[0]);\n\n const tmpXY = {};\n\n pointerUtils.getPageXY(pointer, tmpXY);\n targetObj.page.x = tmpXY.x;\n targetObj.page.y = tmpXY.y;\n\n pointerUtils.getClientXY(pointer, tmpXY);\n targetObj.client.x = tmpXY.x;\n targetObj.client.y = tmpXY.y;\n\n targetObj.timeStamp = is.number(timeStamp) ? timeStamp :new Date().getTime();\n },\n\n pointerExtend: pointerExtend,\n\n getTouchPair: function (event) {\n const touches = [];\n\n // array of touches is supplied\n if (is.array(event)) {\n touches[0] = event[0];\n touches[1] = event[1];\n }\n // an event\n else {\n if (event.type === 'touchend') {\n if (event.touches.length === 1) {\n touches[0] = event.touches[0];\n touches[1] = event.changedTouches[0];\n }\n else if (event.touches.length === 0) {\n touches[0] = event.changedTouches[0];\n touches[1] = event.changedTouches[1];\n }\n }\n else {\n touches[0] = event.touches[0];\n touches[1] = event.touches[1];\n }\n }\n\n return touches;\n },\n\n pointerAverage: function (pointers) {\n const average = {\n pageX : 0,\n pageY : 0,\n clientX: 0,\n clientY: 0,\n screenX: 0,\n screenY: 0,\n };\n\n for (const pointer of pointers) {\n for (const prop in average) {\n average[prop] += pointer[prop];\n }\n }\n for (const prop in average) {\n average[prop] /= pointers.length;\n }\n\n return average;\n },\n\n touchBBox: function (event) {\n if (!event.length && !(event.touches && event.touches.length > 1)) {\n return;\n }\n\n const touches = pointerUtils.getTouchPair(event);\n const minX = Math.min(touches[0].pageX, touches[1].pageX);\n const minY = Math.min(touches[0].pageY, touches[1].pageY);\n const maxX = Math.max(touches[0].pageX, touches[1].pageX);\n const maxY = Math.max(touches[0].pageY, touches[1].pageY);\n\n return {\n x: minX,\n y: minY,\n left: minX,\n top: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n },\n\n touchDistance: function (event, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n\n\n const dx = touches[0][sourceX] - touches[1][sourceX];\n const dy = touches[0][sourceY] - touches[1][sourceY];\n\n return hypot(dx, dy);\n },\n\n touchAngle: function (event, prevAngle, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n const dx = touches[1][sourceX] - touches[0][sourceX];\n const dy = touches[1][sourceY] - touches[0][sourceY];\n const angle = 180 * Math.atan2(dy , dx) / Math.PI;\n\n return angle;\n },\n\n getPointerType: function (pointer, interaction) {\n // if the PointerEvent API isn't available, then the pointer must be ither\n // a MouseEvent or TouchEvent\n if (interaction.mouse) { return 'mouse'; }\n if (!browser.supportsPointerEvent) { return 'touch'; }\n\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : [undefined, undefined,'touch', 'pen', 'mouse'][pointer.pointerType];\n },\n\n // [ event.target, event.currentTarget ]\n getEventTargets: function (event) {\n return [\n domUtils.getActualElement(event.path ? event.path[0] : event.target),\n domUtils.getActualElement(event.currentTarget),\n ];\n },\n};\n\nmodule.exports = pointerUtils;\n","const { window } = require('./window');\n\nconst vendors = ['ms', 'moz', 'webkit', 'o'];\nlet lastTime = 0;\nlet request;\nlet cancel;\n\nfor (let x = 0; x < vendors.length && !window.requestAnimationFrame; x++) {\n request = window[vendors[x] + 'RequestAnimationFrame'];\n cancel = window[vendors[x] +'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n}\n\nif (!request) {\n request = function (callback) {\n const currTime = new Date().getTime();\n const timeToCall = Math.max(0, 16 - (currTime - lastTime));\n const id = setTimeout(function () { callback(currTime + timeToCall); },\n timeToCall);\n\n lastTime = currTime + timeToCall;\n return id;\n };\n}\n\nif (!cancel) {\n cancel = function (id) {\n clearTimeout(id);\n };\n}\n\nmodule.exports = {\n request,\n cancel,\n};\n","const extend = require('./extend');\nconst is = require('./is');\nconst {\n closest,\n parentNode,\n getElementRect,\n} = require('./domUtils');\n\nconst rectUtils = {\n getStringOptionResult: function (value, interactable, element) {\n if (!is.string(value)) {\n return null;\n }\n\n if (value === 'parent') {\n value = parentNode(element);\n }\n else if (value === 'self') {\n value = interactable.getRect(element);\n }\n else {\n value = closest(element, value);\n }\n\n return value;\n },\n\n resolveRectLike: function (value, interactable, element, functionArgs) {\n value = rectUtils.getStringOptionResult(value, interactable, element) || value;\n\n if (is.function(value)) {\n value = value.apply(null, functionArgs);\n }\n\n if (is.element(value)) {\n value = getElementRect(value);\n }\n\n return value;\n },\n\n rectToXY: function (rect) {\n return rect && {\n x: 'x' in rect ? rect.x : rect.left,\n y: 'y' in rect ? rect.y : rect.top,\n };\n },\n\n xywhToTlbr: function (rect) {\n if (rect && !('left' in rect && 'top' in rect)) {\n rect = extend({}, rect);\n\n rect.left = rect.x || 0;\n rect.top = rect.y || 0;\n rect.right = rect.right || (rect.left + rect.width);\n rect.bottom = rect.bottom || (rect.top + rect.height);\n }\n\n return rect;\n },\n\n tlbrToXywh: function (rect) {\n if (rect && !('x' in rect && 'y' in rect)) {\n rect = extend({}, rect);\n\n rect.x = rect.left || 0;\n rect.top = rect.top || 0;\n rect.width = rect.width || (rect.right - rect.x);\n rect.height = rect.height || (rect.bottom - rect.y);\n }\n\n return rect;\n },\n};\n\nmodule.exports = rectUtils;\n","const win = module.exports;\nconst isWindow = require('./isWindow');\n\nfunction init (window) {\n // get wrapped window if using Shadow DOM polyfill\n\n win.realWindow = window;\n\n // create a TextNode\n const el = window.document.createTextNode('');\n\n // check if it's wrapped by a polyfill\n if (el.ownerDocument !== window.document\n && typeof window.wrap === 'function'\n && window.wrap(el) === el) {\n // use wrapped window\n window = window.wrap(window);\n }\n\n win.window = window;\n}\n\nif (typeof window === 'undefined') {\n win.window = undefined;\n win.realWindow = undefined;\n}\nelse {\n init(window);\n}\n\nwin.getWindow = function getWindow (node) {\n if (isWindow(node)) {\n return node;\n }\n\n const rootNode = (node.ownerDocument || node);\n\n return rootNode.defaultView || rootNode.parentWindow || win.window;\n};\n\nwin.init = init;\n"]} \ No newline at end of file +{"version":3,"sources":["src/minHeader.js","src/header.js","index.js","src/Eventable.js","src/InteractEvent.js","src/Interactable.js","src/Interaction.js","src/actions/base.js","src/actions/drag.js","src/actions/drop.js","src/actions/gesture.js","src/actions/resize.js","src/autoScroll.js","src/autoStart/InteractableMethods.js","src/autoStart/base.js","src/autoStart/delay.js","src/autoStart/drag.js","src/autoStart/gesture.js","src/autoStart/resize.js","src/defaultOptions.js","src/index.js","src/inertia.js","src/interact.js","src/interactablePreventDefault.js","src/legacyBrowsers.js","src/modifiers/index.js","src/modifiers/restrict.js","src/modifiers/restrictEdges.js","src/modifiers/restrictSize.js","src/modifiers/snap.js","src/modifiers/snapSize.js","src/pointerEvents/PointerEvent.js","src/pointerEvents/base.js","src/pointerEvents/holdRepeat.js","src/pointerEvents/interactableTargets.js","src/scope.js","src/utils/Signals.js","src/utils/arr.js","src/utils/browser.js","src/utils/domObjects.js","src/utils/domUtils.js","src/utils/events.js","src/utils/extend.js","src/utils/getOriginXY.js","src/utils/hypot.js","src/utils/index.js","src/utils/interactionFinder.js","src/utils/is.js","src/utils/isWindow.js","src/utils/pointerExtend.js","src/utils/pointerUtils.js","src/utils/raf.js","src/utils/rect.js","src/utils/window.js"],"names":[],"mappings":"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","file":"interact.min.js","sourceRoot":"","sourcesContent":["/* interact.js v1.3.0-alpha.4+sha.7970416-dirty | https://raw.github.com/taye/interact.js/master/LICENSE */\n","/**\n * interact.js v1.3.0-alpha.4+sha.7970416-dirty\n *\n * Copyright (c) 2012-2017 Taye Adeyemi \n * Open source under the MIT License.\n * https://raw.github.com/taye/interact.js/master/LICENSE\n */\n","/*\n * In a (windowless) server environment this file exports a factory function\n * that takes the window to use.\n *\n * var interact = require('interact.js')(windowObject);\n *\n * See https://github.com/taye/interact.js/issues/187\n */\nif (typeof window === 'undefined') {\n module.exports = function (window) {\n require('./src/utils/window').init(window);\n\n return require('./src/index');\n };\n}\nelse {\n module.exports = require('./src/index');\n}\n","const { indexOf } = require('./utils/arr');\nconst extend = require('./utils/extend.js');\n\nfunction fireUntilImmediateStopped (event, listeners) {\n for (let i = 0, len = listeners.length; i < len && !event.immediatePropagationStopped; i++) {\n listeners[i](event);\n }\n}\n\nclass Eventable {\n\n constructor (options) {\n this.options = extend({}, options || {});\n }\n\n fire (event) {\n let listeners;\n const onEvent = 'on' + event.type;\n const global = this.global;\n\n // Interactable#on() listeners\n if ((listeners = this[event.type])) {\n fireUntilImmediateStopped(event, listeners);\n }\n\n // interactable.onevent listener\n if (this[onEvent]) {\n this[onEvent](event);\n }\n\n // interact.on() listeners\n if (!event.propagationStopped && global && (listeners = global[event.type])) {\n fireUntilImmediateStopped(event, listeners);\n }\n }\n\n on (eventType, listener) {\n // if this type of event was never bound\n if (this[eventType]) {\n this[eventType].push(listener);\n }\n else {\n this[eventType] = [listener];\n }\n }\n\n off (eventType, listener) {\n // if it is an action event type\n const eventList = this[eventType];\n const index = eventList? indexOf(eventList, listener) : -1;\n\n if (index !== -1) {\n eventList.splice(index, 1);\n }\n\n if (eventList && eventList.length === 0 || !listener) {\n this[eventType] = listener;\n }\n }\n}\n\nmodule.exports = Eventable;\n","const extend = require('./utils/extend');\nconst getOriginXY = require('./utils/getOriginXY');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nclass InteractEvent {\n constructor (interaction, event, action, phase, element, related, preEnd = false) {\n const target = interaction.target;\n const deltaSource = (target && target.options || defaults).deltaSource;\n const origin = getOriginXY(target, element, action);\n const starting = phase === 'start';\n const ending = phase === 'end';\n const coords = starting? interaction.startCoords : interaction.curCoords;\n const prevEvent = interaction.prevEvent;\n\n element = element || interaction.element;\n\n const page = extend({}, coords.page);\n const client = extend({}, coords.client);\n\n page.x -= origin.x;\n page.y -= origin.y;\n\n client.x -= origin.x;\n client.y -= origin.y;\n\n this.ctrlKey = event.ctrlKey;\n this.altKey = event.altKey;\n this.shiftKey = event.shiftKey;\n this.metaKey = event.metaKey;\n this.button = event.button;\n this.buttons = event.buttons;\n this.target = element;\n this.currentTarget = element;\n this.relatedTarget = related || null;\n this.preEnd = preEnd;\n this.type = action + (phase || '');\n this.interaction = interaction;\n this.interactable = target;\n\n this.t0 = starting ? interaction.downTimes[interaction.downTimes.length - 1]\n : prevEvent.t0;\n\n const signalArg = {\n interaction,\n event,\n action,\n phase,\n element,\n related,\n page,\n client,\n coords,\n starting,\n ending,\n deltaSource,\n iEvent: this,\n };\n\n signals.fire('set-xy', signalArg);\n\n if (ending) {\n // use previous coords when ending\n this.pageX = prevEvent.pageX;\n this.pageY = prevEvent.pageY;\n this.clientX = prevEvent.clientX;\n this.clientY = prevEvent.clientY;\n }\n else {\n this.pageX = page.x;\n this.pageY = page.y;\n this.clientX = client.x;\n this.clientY = client.y;\n }\n\n this.x0 = interaction.startCoords.page.x - origin.x;\n this.y0 = interaction.startCoords.page.y - origin.y;\n this.clientX0 = interaction.startCoords.client.x - origin.x;\n this.clientY0 = interaction.startCoords.client.y - origin.y;\n\n signals.fire('set-delta', signalArg);\n\n this.timeStamp = coords.timeStamp;\n this.dt = interaction.pointerDelta.timeStamp;\n this.duration = this.timeStamp - this.t0;\n\n // speed and velocity in pixels per second\n this.speed = interaction.pointerDelta[deltaSource].speed;\n this.velocityX = interaction.pointerDelta[deltaSource].vx;\n this.velocityY = interaction.pointerDelta[deltaSource].vy;\n\n this.swipe = (ending || phase === 'inertiastart')? this.getSwipe() : null;\n\n signals.fire('new', signalArg);\n }\n\n getSwipe () {\n const interaction = this.interaction;\n\n if (interaction.prevEvent.speed < 600\n || this.timeStamp - interaction.prevEvent.timeStamp > 150) {\n return null;\n }\n\n let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI;\n const overlap = 22.5;\n\n if (angle < 0) {\n angle += 360;\n }\n\n const left = 135 - overlap <= angle && angle < 225 + overlap;\n const up = 225 - overlap <= angle && angle < 315 + overlap;\n\n const right = !left && (315 - overlap <= angle || angle < 45 + overlap);\n const down = !up && 45 - overlap <= angle && angle < 135 + overlap;\n\n return {\n up,\n down,\n left,\n right,\n angle,\n speed: interaction.prevEvent.speed,\n velocity: {\n x: interaction.prevEvent.velocityX,\n y: interaction.prevEvent.velocityY,\n },\n };\n }\n\n preventDefault () {}\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n}\n\nsignals.on('set-delta', function ({ iEvent, interaction, starting, deltaSource }) {\n const prevEvent = starting? iEvent : interaction.prevEvent;\n\n if (deltaSource === 'client') {\n iEvent.dx = iEvent.clientX - prevEvent.clientX;\n iEvent.dy = iEvent.clientY - prevEvent.clientY;\n }\n else {\n iEvent.dx = iEvent.pageX - prevEvent.pageX;\n iEvent.dy = iEvent.pageY - prevEvent.pageY;\n }\n});\n\nInteractEvent.signals = signals;\n\nmodule.exports = InteractEvent;\n","const is = require('./utils/is');\nconst events = require('./utils/events');\nconst extend = require('./utils/extend');\nconst actions = require('./actions/base');\nconst scope = require('./scope');\nconst Eventable = require('./Eventable');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nconst {\n getElementRect,\n nodeContains,\n trySelector,\n} = require('./utils/domUtils');\nconst { getWindow } = require('./utils/window');\nconst { indexOf, contains } = require('./utils/arr');\nconst { wheelEvent } = require('./utils/browser');\n\n// all set interactables\nscope.interactables = [];\n\n/*\\\n * Interactable\n [ property ]\n **\n * Object type returned by @interact\n\\*/\nclass Interactable {\n constructor (target, options) {\n options = options || {};\n\n this.target = target;\n this.events = new Eventable();\n this._context = options.context || scope.document;\n this._win = getWindow(trySelector(target)? this._context : target);\n this._doc = this._win.document;\n\n signals.fire('new', {\n target,\n options,\n interactable: this,\n win: this._win,\n });\n\n scope.addDocument( this._doc, this._win );\n\n scope.interactables.push(this);\n\n this.set(options);\n }\n\n setOnEvents (action, phases) {\n const onAction = 'on' + action;\n\n if (is.function(phases.onstart) ) { this.events[onAction + 'start' ] = phases.onstart ; }\n if (is.function(phases.onmove) ) { this.events[onAction + 'move' ] = phases.onmove ; }\n if (is.function(phases.onend) ) { this.events[onAction + 'end' ] = phases.onend ; }\n if (is.function(phases.oninertiastart)) { this.events[onAction + 'inertiastart' ] = phases.oninertiastart ; }\n\n return this;\n }\n\n setPerAction (action, options) {\n // for all the default per-action options\n for (const option in options) {\n // if this option exists for this action\n if (option in defaults[action]) {\n // if the option in the options arg is an object value\n if (is.object(options[option])) {\n // duplicate the object\n this.options[action][option] = extend(this.options[action][option] || {}, options[option]);\n\n if (is.object(defaults.perAction[option]) && 'enabled' in defaults.perAction[option]) {\n this.options[action][option].enabled = options[option].enabled === false? false : true;\n }\n }\n else if (is.bool(options[option]) && is.object(defaults.perAction[option])) {\n this.options[action][option].enabled = options[option];\n }\n else if (options[option] !== undefined) {\n // or if it's not undefined, do a plain assignment\n this.options[action][option] = options[option];\n }\n }\n }\n }\n\n /*\\\n * Interactable.getRect\n [ method ]\n *\n * The default function to get an Interactables bounding rect. Can be\n * overridden using @Interactable.rectChecker.\n *\n - element (Element) #optional The element to measure.\n = (object) The object's bounding rectangle.\n o {\n o top : 0,\n o left : 0,\n o bottom: 0,\n o right : 0,\n o width : 0,\n o height: 0\n o }\n \\*/\n getRect (element) {\n element = element || this.target;\n\n if (is.string(this.target) && !(is.element(element))) {\n element = this._context.querySelector(this.target);\n }\n\n return getElementRect(element);\n }\n\n /*\\\n * Interactable.rectChecker\n [ method ]\n *\n * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n - checker (function) #optional A function which returns this Interactable's bounding rectangle. See @Interactable.getRect\n = (function | object) The checker function or this Interactable\n \\*/\n rectChecker (checker) {\n if (is.function(checker)) {\n this.getRect = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.getRect;\n\n return this;\n }\n\n return this.getRect;\n }\n\n _backCompatOption (optionName, newValue) {\n if (trySelector(newValue) || is.object(newValue)) {\n this.options[optionName] = newValue;\n\n for (const action of actions.names) {\n this.options[action][optionName] = newValue;\n }\n\n return this;\n }\n\n return this.options[optionName];\n }\n\n /*\\\n * Interactable.origin\n [ method ]\n *\n * Gets or sets the origin of the Interactable's element. The x and y\n * of the origin will be subtracted from action event coordinates.\n *\n - origin (object | string) #optional An object eg. { x: 0, y: 0 } or string 'parent', 'self' or any CSS selector\n * OR\n - origin (Element) #optional An HTML or SVG Element whose rect will be used\n **\n = (object) The current origin or this Interactable\n \\*/\n origin (newValue) {\n return this._backCompatOption('origin', newValue);\n }\n\n /*\\\n * Interactable.deltaSource\n [ method ]\n *\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n - newValue (string) #optional Use 'client' if you will be scrolling while interacting; Use 'page' if you want autoScroll to work\n = (string | object) The current deltaSource or this Interactable\n \\*/\n deltaSource (newValue) {\n if (newValue === 'page' || newValue === 'client') {\n this.options.deltaSource = newValue;\n\n return this;\n }\n\n return this.options.deltaSource;\n }\n\n /*\\\n * Interactable.context\n [ method ]\n *\n * Gets the selector context Node of the Interactable. The default is `window.document`.\n *\n = (Node) The context Node of this Interactable\n **\n \\*/\n context () {\n return this._context;\n }\n\n inContext (element) {\n return (this._context === element.ownerDocument\n || nodeContains(this._context, element));\n }\n\n /*\\\n * Interactable.fire\n [ method ]\n *\n * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n - iEvent (InteractEvent) The InteractEvent object to be fired on this Interactable\n = (Interactable) this Interactable\n \\*/\n fire (iEvent) {\n this.events.fire(iEvent);\n\n return this;\n }\n\n _onOffMultiple (method, eventType, listener, options) {\n if (is.string(eventType) && eventType.search(' ') !== -1) {\n eventType = eventType.trim().split(/ +/);\n }\n\n if (is.array(eventType)) {\n for (let i = 0; i < eventType.length; i++) {\n this[method](eventType[i], listener, options);\n }\n\n return true;\n }\n\n if (is.object(eventType)) {\n for (const prop in eventType) {\n this[method](prop, eventType[prop], listener);\n }\n\n return true;\n }\n }\n\n /*\\\n * Interactable.on\n [ method ]\n *\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n - eventType (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) This Interactable\n \\*/\n on (eventType, listener, options) {\n if (this._onOffMultiple('on', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.on(eventType, listener);\n }\n // delegated event for selector\n else if (is.string(this.target)) {\n events.addDelegate(this.target, this._context, eventType, listener, options);\n }\n else {\n events.add(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.off\n [ method ]\n *\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n - eventType (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) This Interactable\n \\*/\n off (eventType, listener, options) {\n if (this._onOffMultiple('off', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n // if it is an action event type\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.off(eventType, listener);\n }\n // delegated event\n else if (is.string(this.target)) {\n events.removeDelegate(this.target, this._context, eventType, listener, options);\n }\n // remove listener from this Interatable's element\n else {\n events.remove(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.set\n [ method ]\n *\n * Reset the options of this Interactable\n - options (object) The new settings to apply\n = (object) This Interactable\n \\*/\n set (options) {\n if (!is.object(options)) {\n options = {};\n }\n\n this.options = extend({}, defaults.base);\n\n const perActions = extend({}, defaults.perAction);\n\n for (const actionName in actions.methodDict) {\n const methodName = actions.methodDict[actionName];\n\n this.options[actionName] = extend({}, defaults[actionName]);\n\n this.setPerAction(actionName, perActions);\n\n this[methodName](options[actionName]);\n }\n\n for (const setting of Interactable.settingsMethods) {\n this.options[setting] = defaults.base[setting];\n\n if (setting in options) {\n this[setting](options[setting]);\n }\n }\n\n signals.fire('set', {\n options,\n interactable: this,\n });\n\n return this;\n }\n\n /*\\\n * Interactable.unset\n [ method ]\n *\n * Remove this interactable from the list of interactables and remove\n * it's action capabilities and event listeners\n *\n = (object) @interact\n \\*/\n unset () {\n events.remove(this.target, 'all');\n\n if (is.string(this.target)) {\n // remove delegated events\n for (const type in events.delegatedEvents) {\n const delegated = events.delegatedEvents[type];\n\n if (delegated.selectors[0] === this.target\n && delegated.contexts[0] === this._context) {\n\n delegated.selectors.splice(0, 1);\n delegated.contexts .splice(0, 1);\n delegated.listeners.splice(0, 1);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegated[type] = null;\n }\n }\n\n events.remove(this._context, type, events.delegateListener);\n events.remove(this._context, type, events.delegateUseCapture, true);\n }\n }\n else {\n events.remove(this, 'all');\n }\n\n signals.fire('unset', { interactable: this });\n\n scope.interactables.splice(indexOf(scope.interactables, this), 1);\n\n // Stop related interactions when an Interactable is unset\n for (const interaction of scope.interactions || []) {\n if (interaction.target === this && interaction.interacting()) {\n interaction.stop();\n }\n }\n\n return scope.interact;\n }\n}\n\nscope.interactables.indexOfElement = function indexOfElement (target, context) {\n context = context || scope.document;\n\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n if (interactable.target === target && interactable._context === context) {\n return i;\n }\n }\n return -1;\n};\n\nscope.interactables.get = function interactableGet (element, options, dontCheckInContext) {\n const ret = this[this.indexOfElement(element, options && options.context)];\n\n return ret && (is.string(element) || dontCheckInContext || ret.inContext(element))? ret : null;\n};\n\nscope.interactables.forEachSelector = function (callback, element) {\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n // skip non CSS selector targets and out of context elements\n if (!is.string(interactable.target)\n || (element && !interactable.inContext(element))) {\n continue;\n }\n\n const ret = callback(interactable, interactable.target, interactable._context, i, this);\n\n if (ret !== undefined) {\n return ret;\n }\n }\n};\n\n// all interact.js eventTypes\nInteractable.eventTypes = scope.eventTypes = [];\n\nInteractable.signals = signals;\n\nInteractable.settingsMethods = [ 'deltaSource', 'origin', 'preventDefault', 'rectChecker' ];\n\nmodule.exports = Interactable;\n","const scope = require('./scope');\nconst utils = require('./utils');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst domObjects = require('./utils/domObjects');\nconst finder = require('./utils/interactionFinder');\nconst signals = require('./utils/Signals').new();\n\nconst listeners = {};\nconst methodNames = [\n 'pointerDown', 'pointerMove', 'pointerUp',\n 'updatePointer', 'removePointer',\n];\n\n// for ignoring browser's simulated mouse events\nlet prevTouchTime = 0;\n\n// all active and idle interactions\nscope.interactions = [];\n\nclass Interaction {\n constructor ({ pointerType }) {\n this.target = null; // current interactable being interacted with\n this.element = null; // the target element of the interactable\n\n this.prepared = { // action that's ready to be fired on next move event\n name : null,\n axis : null,\n edges: null,\n };\n\n // keep track of added pointers\n this.pointers = [];\n this.pointerIds = [];\n this.downTargets = [];\n this.downTimes = [];\n\n // Previous native pointer move event coordinates\n this.prevCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n // current native pointer move event coordinates\n this.curCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Starting InteractEvent pointer coordinates\n this.startCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Change in coordinates and time of the pointer\n this.pointerDelta = {\n page : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n client : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n timeStamp: 0,\n };\n\n this.downEvent = null; // pointerdown/mousedown/touchstart event\n this.downPointer = {};\n\n this._eventTarget = null;\n this._curEventTarget = null;\n\n this.prevEvent = null; // previous action event\n\n this.pointerIsDown = false;\n this.pointerWasMoved = false;\n this._interacting = false;\n\n this.pointerType = pointerType;\n\n signals.fire('new', this);\n\n scope.interactions.push(this);\n }\n\n pointerDown (pointer, event, eventTarget) {\n const pointerIndex = this.updatePointer(pointer, event, true);\n\n signals.fire('down', {\n pointer,\n event,\n eventTarget,\n pointerIndex,\n interaction: this,\n });\n }\n\n /*\\\n * Interaction.start\n [ method ]\n *\n * Start an action with the given Interactable and Element as tartgets. The\n * action must be enabled for the target Interactable and an appropriate number\n * of pointers must be held down - 1 for drag/resize, 2 for gesture.\n *\n * Use it with `interactable.able({ manualStart: false })` to always\n * [start actions manually](https://github.com/taye/interact.js/issues/114)\n *\n - action (object) The action to be performed - drag, resize, etc.\n - target (Interactable) The Interactable to target\n - element (Element) The DOM Element to target\n = (object) interact\n **\n | interact(target)\n | .draggable({\n | // disable the default drag start by down->move\n | manualStart: true\n | })\n | // start dragging after the user holds the pointer down\n | .on('hold', function (event) {\n | var interaction = event.interaction;\n |\n | if (!interaction.interacting()) {\n | interaction.start({ name: 'drag' },\n | event.interactable,\n | event.currentTarget);\n | }\n | });\n \\*/\n start (action, target, element) {\n if (this.interacting()\n || !this.pointerIsDown\n || this.pointerIds.length < (action.name === 'gesture'? 2 : 1)) {\n return;\n }\n\n // if this interaction had been removed after stopping\n // add it back\n if (utils.indexOf(scope.interactions, this) === -1) {\n scope.interactions.push(this);\n }\n\n utils.copyAction(this.prepared, action);\n this.target = target;\n this.element = element;\n\n signals.fire('action-start', {\n interaction: this,\n event: this.downEvent,\n });\n }\n\n pointerMove (pointer, event, eventTarget) {\n if (!this.simulation) {\n this.updatePointer(pointer);\n utils.setCoords(this.curCoords, this.pointers);\n }\n\n const duplicateMove = (this.curCoords.page.x === this.prevCoords.page.x\n && this.curCoords.page.y === this.prevCoords.page.y\n && this.curCoords.client.x === this.prevCoords.client.x\n && this.curCoords.client.y === this.prevCoords.client.y);\n\n let dx;\n let dy;\n\n // register movement greater than pointerMoveTolerance\n if (this.pointerIsDown && !this.pointerWasMoved) {\n dx = this.curCoords.client.x - this.startCoords.client.x;\n dy = this.curCoords.client.y - this.startCoords.client.y;\n\n this.pointerWasMoved = utils.hypot(dx, dy) > Interaction.pointerMoveTolerance;\n }\n\n const signalArg = {\n pointer,\n pointerIndex: this.getPointerIndex(pointer),\n event,\n eventTarget,\n dx,\n dy,\n duplicate: duplicateMove,\n interaction: this,\n interactingBeforeMove: this.interacting(),\n };\n\n if (!duplicateMove) {\n // set pointer coordinate, time changes and speeds\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n }\n\n signals.fire('move', signalArg);\n\n if (!duplicateMove) {\n // if interacting, fire an 'action-move' signal etc\n if (this.interacting()) {\n this.doMove(signalArg);\n }\n\n if (this.pointerWasMoved) {\n utils.copyCoords(this.prevCoords, this.curCoords);\n }\n }\n }\n\n /*\\\n * Interaction.doMove\n [ method ]\n *\n * Force a move of the current action at the same coordinates. Useful if\n * snap/restrict has been changed and you want a movement with the new\n * settings.\n *\n **\n | interact(target)\n | .draggable(true)\n | .on('dragmove', function (event) {\n | if (someCondition) {\n | // change the snap settings\n | event.interactable.draggable({ snap: { targets: [] }});\n | // fire another move event with re-calculated snap\n | event.interaction.doMove();\n | }\n | });\n \\*/\n doMove (signalArg) {\n signalArg = utils.extend({\n pointer: this.pointers[0],\n event: this.prevEvent,\n eventTarget: this._eventTarget,\n interaction: this,\n }, signalArg || {});\n\n signals.fire('before-action-move', signalArg);\n\n if (!this._dontFireMove) {\n signals.fire('action-move', signalArg);\n }\n\n this._dontFireMove = false;\n }\n\n // End interact move events and stop auto-scroll unless simulation is running\n pointerUp (pointer, event, eventTarget, curEventTarget) {\n const pointerIndex = this.getPointerIndex(pointer);\n\n signals.fire(/cancel$/i.test(event.type)? 'cancel' : 'up', {\n pointer,\n pointerIndex,\n event,\n eventTarget,\n curEventTarget,\n interaction: this,\n });\n\n if (!this.simulation) {\n this.end(event);\n }\n\n this.pointerIsDown = false;\n this.removePointer(pointer, event);\n }\n\n /*\\\n * Interaction.end\n [ method ]\n *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n - event (PointerEvent) #optional\n **\n | interact(target)\n | .draggable(true)\n | .on('move', function (event) {\n | if (event.pageX > 1000) {\n | // end the current action\n | event.interaction.end();\n | // stop all further listeners from being called\n | event.stopImmediatePropagation();\n | }\n | });\n \\*/\n end (event) {\n event = event || this.prevEvent;\n\n if (this.interacting()) {\n signals.fire('action-end', {\n event,\n interaction: this,\n });\n }\n\n this.stop();\n }\n\n currentAction () {\n return this._interacting? this.prepared.name: null;\n }\n\n interacting () {\n return this._interacting;\n }\n\n stop () {\n signals.fire('stop', { interaction: this });\n\n if (this._interacting) {\n signals.fire('stop-active', { interaction: this });\n signals.fire('stop-' + this.prepared.name, { interaction: this });\n }\n\n this.target = this.element = null;\n\n this._interacting = false;\n this.prepared.name = this.prevEvent = null;\n }\n\n getPointerIndex (pointer) {\n // mouse and pen interactions may have only one pointer\n if (this.pointerType === 'mouse' || this.pointerType === 'pen') {\n return 0;\n }\n\n return utils.indexOf(this.pointerIds, utils.getPointerId(pointer));\n }\n\n updatePointer (pointer, event, down = event && /(down|start)$/i.test(event.type)) {\n const id = utils.getPointerId(pointer);\n let index = this.getPointerIndex(pointer);\n\n if (index === -1) {\n index = this.pointerIds.length;\n this.pointerIds[index] = id;\n }\n\n if (down) {\n signals.fire('update-pointer-down', {\n pointer,\n event,\n down,\n pointerId: id,\n pointerIndex: index,\n interaction: this,\n });\n }\n\n this.pointers[index] = pointer;\n\n return index;\n }\n\n removePointer (pointer, event) {\n const index = this.getPointerIndex(pointer);\n\n if (index === -1) { return; }\n\n signals.fire('remove-pointer', {\n pointer,\n event,\n pointerIndex: index,\n interaction: this,\n });\n\n this.pointers .splice(index, 1);\n this.pointerIds .splice(index, 1);\n this.downTargets.splice(index, 1);\n this.downTimes .splice(index, 1);\n }\n\n _updateEventTargets (target, currentTarget) {\n this._eventTarget = target;\n this._curEventTarget = currentTarget;\n }\n}\n\nfor (let i = 0, len = methodNames.length; i < len; i++) {\n const method = methodNames[i];\n\n listeners[method] = doOnInteractions(method);\n}\n\nfunction doOnInteractions (method) {\n return (function (event) {\n const pointerType = utils.getPointerType(event);\n const [eventTarget, curEventTarget] = utils.getEventTargets(event);\n const matches = []; // [ [pointer, interaction], ...]\n\n if (browser.supportsTouch && /touch/.test(event.type)) {\n prevTouchTime = new Date().getTime();\n\n for (let i = 0; i < event.changedTouches.length; i++) {\n const pointer = event.changedTouches[i];\n const interaction = finder.search(pointer, event.type, eventTarget);\n\n matches.push([pointer, interaction || new Interaction({ pointerType })]);\n }\n }\n else {\n let invalidPointer = false;\n\n if (!browser.supportsPointerEvent && /mouse/.test(event.type)) {\n // ignore mouse events while touch interactions are active\n for (let i = 0; i < scope.interactions.length && !invalidPointer; i++) {\n invalidPointer = scope.interactions[i].pointerType !== 'mouse' && scope.interactions[i].pointerIsDown;\n }\n\n // try to ignore mouse events that are simulated by the browser\n // after a touch event\n invalidPointer = invalidPointer\n || (new Date().getTime() - prevTouchTime < 500)\n // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated\n || event.timeStamp === 0;\n }\n\n if (!invalidPointer) {\n let interaction = finder.search(event, event.type, eventTarget);\n\n if (!interaction) {\n interaction = new Interaction({ pointerType });\n }\n\n matches.push([event, interaction]);\n }\n }\n\n for (const [pointer, interaction] of matches) {\n interaction._updateEventTargets(eventTarget, curEventTarget);\n interaction[method](pointer, event, eventTarget, curEventTarget);\n }\n });\n}\n\nfunction endAll (event) {\n for (let i = 0; i < scope.interactions.length; i++) {\n const interaction = scope.interactions[i];\n\n interaction.end(event);\n signals.fire('endall', { event, interaction });\n }\n}\n\nconst docEvents = { /* 'eventType': listenerFunc */ };\nconst pEventTypes = browser.pEventTypes;\n\nif (domObjects.PointerEvent) {\n docEvents[pEventTypes.down ] = listeners.pointerDown;\n docEvents[pEventTypes.move ] = listeners.pointerMove;\n docEvents[pEventTypes.up ] = listeners.pointerUp;\n docEvents[pEventTypes.cancel] = listeners.pointerUp;\n}\nelse {\n docEvents.mousedown = listeners.pointerDown;\n docEvents.mousemove = listeners.pointerMove;\n docEvents.mouseup = listeners.pointerUp;\n\n docEvents.touchstart = listeners.pointerDown;\n docEvents.touchmove = listeners.pointerMove;\n docEvents.touchend = listeners.pointerUp;\n docEvents.touchcancel = listeners.pointerUp;\n}\n\ndocEvents.blur = endAll;\n\nfunction onDocSignal ({ doc }, signalName) {\n const eventMethod = signalName.indexOf('add') === 0\n ? events.add : events.remove;\n\n // delegate event listener\n for (const eventType in scope.delegatedEvents) {\n eventMethod(doc, eventType, events.delegateListener);\n eventMethod(doc, eventType, events.delegateUseCapture, true);\n }\n\n for (const eventType in docEvents) {\n eventMethod(doc, eventType, docEvents[eventType]);\n }\n}\n\nsignals.on('update-pointer-down', ({ interaction, pointer, pointerId, pointerIndex, event, eventTarget, down }) => {\n interaction.pointerIds[pointerIndex] = pointerId;\n interaction.pointers[pointerIndex] = pointer;\n\n if (down) {\n interaction.pointerIsDown = true;\n }\n\n if (!interaction.interacting()) {\n utils.setCoords(interaction.startCoords, interaction.pointers);\n\n utils.copyCoords(interaction.curCoords , interaction.startCoords);\n utils.copyCoords(interaction.prevCoords, interaction.startCoords);\n\n interaction.downEvent = event;\n interaction.downTimes[pointerIndex] = interaction.curCoords.timeStamp;\n interaction.downTargets[pointerIndex] = eventTarget || event && utils.getEventTargets(event)[0];\n interaction.pointerWasMoved = false;\n\n utils.pointerExtend(interaction.downPointer, pointer);\n }\n});\n\nscope.signals.on('add-document' , onDocSignal);\nscope.signals.on('remove-document', onDocSignal);\n\nInteraction.pointerMoveTolerance = 1;\nInteraction.doOnInteractions = doOnInteractions;\nInteraction.endAll = endAll;\nInteraction.signals = signals;\nInteraction.docEvents = docEvents;\n\nscope.endAllInteractions = endAll;\n\nmodule.exports = Interaction;\n","const Interaction = require('../Interaction');\nconst InteractEvent = require('../InteractEvent');\n\nconst actions = {\n firePrepared,\n names: [],\n methodDict: {},\n};\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n interaction._interacting = true;\n firePrepared(interaction, event, 'start');\n});\n\nInteraction.signals.on('action-move', function ({ interaction, event, preEnd }) {\n firePrepared(interaction, event, 'move', preEnd);\n\n // if the action was ended in a listener\n if (!interaction.interacting()) { return false; }\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n firePrepared(interaction, event, 'end');\n});\n\nfunction firePrepared (interaction, event, phase, preEnd) {\n const actionName = interaction.prepared.name;\n\n const newEvent = new InteractEvent(interaction, event, actionName, phase, interaction.element, null, preEnd);\n\n interaction.target.fire(newEvent);\n interaction.prevEvent = newEvent;\n}\n\nmodule.exports = actions;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drag = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n startAxis : 'xy',\n lockAxis : 'xy',\n },\n\n checker: function (pointer, event, interactable) {\n const dragOptions = interactable.options.drag;\n\n return dragOptions.enabled\n ? { name: 'drag', axis: (dragOptions.lockAxis === 'start'\n ? dragOptions.startAxis\n : dragOptions.lockAxis)}\n : null;\n },\n\n getCursor: function () {\n return 'move';\n },\n};\n\nInteraction.signals.on('before-action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n interaction.curCoords.page.y = interaction.startCoords.page.y;\n interaction.curCoords.client.y = interaction.startCoords.client.y;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vx);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vx);\n interaction.pointerDelta.client.vy = 0;\n interaction.pointerDelta.page.vy = 0;\n }\n else if (axis === 'y') {\n interaction.curCoords.page.x = interaction.startCoords.page.x;\n interaction.curCoords.client.x = interaction.startCoords.client.x;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vy);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vy);\n interaction.pointerDelta.client.vx = 0;\n interaction.pointerDelta.page.vx = 0;\n }\n});\n\n// dragmove\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'dragmove') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n iEvent.pageY = interaction.startCoords.page.y;\n iEvent.clientY = interaction.startCoords.client.y;\n iEvent.dy = 0;\n }\n else if (axis === 'y') {\n iEvent.pageX = interaction.startCoords.page.x;\n iEvent.clientX = interaction.startCoords.client.x;\n iEvent.dx = 0;\n }\n});\n\n/*\\\n * Interactable.draggable\n [ method ]\n *\n * Gets or sets whether drag actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of drag events\n | var isDraggable = interact('ul li').draggable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on drag events (object makes the Interactable draggable)\n = (object) This Interactable\n | interact(element).draggable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // the axis in which the first movement must be\n | // for the drag sequence to start\n | // 'xy' by default - any direction\n | startAxis: 'x' || 'y' || 'xy',\n |\n | // 'xy' by default - don't restrict to one axis (move in any direction)\n | // 'x' or 'y' to restrict movement to either axis\n | // 'start' to restrict movement to the axis the drag started in\n | lockAxis: 'x' || 'y' || 'xy' || 'start',\n |\n | // max number of drags that can happen concurrently\n | // with elements of this Interactable. Infinity by default\n | max: Infinity,\n |\n | // max number of drags that can target the same element+Interactable\n | // 1 by default\n | maxPerElement: 2\n | });\n\\*/\nInteractable.prototype.draggable = function (options) {\n if (utils.is.object(options)) {\n this.options.drag.enabled = options.enabled === false? false: true;\n this.setPerAction('drag', options);\n this.setOnEvents('drag', options);\n\n if (/^(xy|x|y|start)$/.test(options.lockAxis)) {\n this.options.drag.lockAxis = options.lockAxis;\n }\n if (/^(xy|x|y)$/.test(options.startAxis)) {\n this.options.drag.startAxis = options.startAxis;\n }\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drag.enabled = options;\n\n if (!options) {\n this.ondragstart = this.ondragstart = this.ondragend = null;\n }\n\n return this;\n }\n\n return this.options.drag;\n};\n\nactions.drag = drag;\nactions.names.push('drag');\nutils.merge(Interactable.eventTypes, [\n 'dragstart',\n 'dragmove',\n 'draginertiastart',\n 'draginertiaresume',\n 'dragend',\n]);\nactions.methodDict.drag = 'draggable';\n\ndefaultOptions.drag = drag.defaults;\n\nmodule.exports = drag;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst scope = require('../scope');\nconst interact = require('../interact');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drop = {\n defaults: {\n enabled: false,\n accept : null,\n overlap: 'pointer',\n },\n};\n\nlet dynamicDrop = false;\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // reset active dropzones\n interaction.activeDrops.dropzones = [];\n interaction.activeDrops.elements = [];\n interaction.activeDrops.rects = [];\n\n interaction.dropEvents = null;\n\n if (!interaction.dynamicDrop) {\n setActiveDrops(interaction, interaction.element);\n }\n\n const dragEvent = interaction.prevEvent;\n const dropEvents = getDropEvents(interaction, event, dragEvent);\n\n if (dropEvents.activate) {\n fireActiveDrops(interaction, dropEvents.activate);\n }\n});\n\nInteractEvent.signals.on('new', function ({ interaction, iEvent, event }) {\n if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { return; }\n\n const draggableElement = interaction.element;\n const dragEvent = iEvent;\n const dropResult = getDrop(dragEvent, event, draggableElement);\n\n interaction.dropTarget = dropResult.dropzone;\n interaction.dropElement = dropResult.element;\n\n interaction.dropEvents = getDropEvents(interaction, event, dragEvent);\n});\n\nInteraction.signals.on('action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n fireDropEvents(interaction, interaction.dropEvents);\n});\n\nInteraction.signals.on('action-end', function ({ interaction }) {\n if (interaction.prepared.name === 'drag') {\n fireDropEvents(interaction, interaction.dropEvents);\n }\n});\n\nInteraction.signals.on('stop-drag', function ({ interaction }) {\n interaction.activeDrops.dropzones =\n interaction.activeDrops.elements =\n interaction.activeDrops.rects =\n interaction.dropEvents = null;\n});\n\nfunction collectDrops (interaction, element) {\n const drops = [];\n const elements = [];\n\n element = element || interaction.element;\n\n // collect all dropzones and their elements which qualify for a drop\n for (const current of scope.interactables) {\n if (!current.options.drop.enabled) { continue; }\n\n const accept = current.options.drop.accept;\n\n // test the draggable element against the dropzone's accept setting\n if ((utils.is.element(accept) && accept !== element)\n || (utils.is.string(accept)\n && !utils.matchesSelector(element, accept))) {\n\n continue;\n }\n\n // query for new elements if necessary\n const dropElements = utils.is.string(current.target)\n ? current._context.querySelectorAll(current.target)\n : [current.target];\n\n for (let i = 0; i < dropElements.length; i++) {\n const currentElement = dropElements[i];\n\n if (currentElement !== element) {\n drops.push(current);\n elements.push(currentElement);\n }\n }\n }\n\n return {\n elements,\n dropzones: drops,\n };\n}\n\nfunction fireActiveDrops (interaction, event) {\n let prevElement;\n\n // loop through all active dropzones and trigger event\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n const current = interaction.activeDrops.dropzones[i];\n const currentElement = interaction.activeDrops.elements [i];\n\n // prevent trigger of duplicate events on same element\n if (currentElement !== prevElement) {\n // set current element as event target\n event.target = currentElement;\n current.fire(event);\n }\n prevElement = currentElement;\n }\n}\n\n// Collect a new set of possible drops and save them in activeDrops.\n// setActiveDrops should always be called when a drag has just started or a\n// drag event happens while dynamicDrop is true\nfunction setActiveDrops (interaction, dragElement) {\n // get dropzones and their elements that could receive the draggable\n const possibleDrops = collectDrops(interaction, dragElement, true);\n\n interaction.activeDrops.dropzones = possibleDrops.dropzones;\n interaction.activeDrops.elements = possibleDrops.elements;\n interaction.activeDrops.rects = [];\n\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n interaction.activeDrops.rects[i] =\n interaction.activeDrops.dropzones[i].getRect(interaction.activeDrops.elements[i]);\n }\n}\n\nfunction getDrop (dragEvent, event, dragElement) {\n const interaction = dragEvent.interaction;\n const validDrops = [];\n\n if (dynamicDrop) {\n setActiveDrops(interaction, dragElement);\n }\n\n // collect all dropzones and their elements which qualify for a drop\n for (let j = 0; j < interaction.activeDrops.dropzones.length; j++) {\n const current = interaction.activeDrops.dropzones[j];\n const currentElement = interaction.activeDrops.elements [j];\n const rect = interaction.activeDrops.rects [j];\n\n validDrops.push(current.dropCheck(dragEvent, event, interaction.target, dragElement, currentElement, rect)\n ? currentElement\n : null);\n }\n\n // get the most appropriate dropzone based on DOM depth and order\n const dropIndex = utils.indexOfDeepestElement(validDrops);\n\n return {\n dropzone: interaction.activeDrops.dropzones[dropIndex] || null,\n element : interaction.activeDrops.elements [dropIndex] || null,\n };\n}\n\nfunction getDropEvents (interaction, pointerEvent, dragEvent) {\n const dropEvents = {\n enter : null,\n leave : null,\n activate : null,\n deactivate: null,\n move : null,\n drop : null,\n };\n\n const tmpl = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n };\n\n if (interaction.dropElement !== interaction.prevDropElement) {\n // if there was a prevDropTarget, create a dragleave event\n if (interaction.prevDropTarget) {\n dropEvents.leave = utils.extend({ type: 'dragleave' }, tmpl);\n\n dragEvent.dragLeave = dropEvents.leave.target = interaction.prevDropElement;\n dragEvent.prevDropzone = dropEvents.leave.dropzone = interaction.prevDropTarget;\n }\n // if the dropTarget is not null, create a dragenter event\n if (interaction.dropTarget) {\n dropEvents.enter = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n type : 'dragenter',\n };\n\n dragEvent.dragEnter = interaction.dropElement;\n dragEvent.dropzone = interaction.dropTarget;\n }\n }\n\n if (dragEvent.type === 'dragend' && interaction.dropTarget) {\n dropEvents.drop = utils.extend({ type: 'drop' }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n dragEvent.relatedTarget = interaction.dropElement;\n }\n if (dragEvent.type === 'dragstart') {\n dropEvents.activate = utils.extend({ type: 'dropactivate' }, tmpl);\n\n dropEvents.activate.target = null;\n dropEvents.activate.dropzone = null;\n }\n if (dragEvent.type === 'dragend') {\n dropEvents.deactivate = utils.extend({ type: 'dropdeactivate' }, tmpl);\n\n dropEvents.deactivate.target = null;\n dropEvents.deactivate.dropzone = null;\n }\n if (dragEvent.type === 'dragmove' && interaction.dropTarget) {\n dropEvents.move = utils.extend({\n dragmove : dragEvent,\n type : 'dropmove',\n }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n }\n\n return dropEvents;\n}\n\nfunction fireDropEvents (interaction, dropEvents) {\n if (dropEvents.leave) { interaction.prevDropTarget.fire(dropEvents.leave); }\n if (dropEvents.move ) { interaction.dropTarget.fire(dropEvents.move ); }\n if (dropEvents.enter) { interaction.dropTarget.fire(dropEvents.enter); }\n if (dropEvents.drop ) { interaction.dropTarget.fire(dropEvents.drop ); }\n if (dropEvents.deactivate) {\n fireActiveDrops(interaction, dropEvents.deactivate);\n }\n\n interaction.prevDropTarget = interaction.dropTarget;\n interaction.prevDropElement = interaction.dropElement;\n}\n\n/*\\\n * Interactable.dropzone\n [ method ]\n *\n * Returns or sets whether elements can be dropped onto this\n * Interactable to trigger drop events\n *\n * Dropzones can receive the following events:\n * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends\n * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone\n * - `dragmove` when a draggable that has entered the dropzone is moved\n * - `drop` when a draggable is dropped into this dropzone\n *\n * Use the `accept` option to allow only elements that match the given CSS\n * selector or element. The value can be:\n *\n * - **an Element** - only that element can be dropped into this dropzone.\n * - **a string**, - the element being dragged must match it as a CSS selector.\n * - **`null`** - accept options is cleared - it accepts any element.\n *\n * Use the `overlap` option to set how drops are checked for. The allowed\n * values are:\n *\n * - `'pointer'`, the pointer must be over the dropzone (default)\n * - `'center'`, the draggable element's center must be over the dropzone\n * - a number from 0-1 which is the `(intersection area) / (draggable area)`.\n * e.g. `0.5` for drop to happen when half of the area of the draggable is\n * over the dropzone\n *\n * Use the `checker` option to specify a function to check if a dragged\n * element is over this Interactable.\n *\n | interact(target)\n | .dropChecker(function(dragEvent, // related dragmove or dragend event\n | event, // TouchEvent/PointerEvent/MouseEvent\n | dropped, // bool result of the default checker\n | dropzone, // dropzone Interactable\n | dropElement, // dropzone elemnt\n | draggable, // draggable Interactable\n | draggableElement) {// draggable element\n |\n | return dropped && event.target.hasAttribute('allow-drop');\n | }\n *\n *\n - options (boolean | object | null) #optional The new value to be set.\n | interact('.drop').dropzone({\n | accept: '.can-drop' || document.getElementById('single-drop'),\n | overlap: 'pointer' || 'center' || zeroToOne\n | }\n = (boolean | object) The current setting or this Interactable\n\\*/\nInteractable.prototype.dropzone = function (options) {\n if (utils.is.object(options)) {\n this.options.drop.enabled = options.enabled === false? false: true;\n\n if (utils.is.function(options.ondrop) ) { this.events.ondrop = options.ondrop ; }\n if (utils.is.function(options.ondropactivate) ) { this.events.ondropactivate = options.ondropactivate ; }\n if (utils.is.function(options.ondropdeactivate)) { this.events.ondropdeactivate = options.ondropdeactivate; }\n if (utils.is.function(options.ondragenter) ) { this.events.ondragenter = options.ondragenter ; }\n if (utils.is.function(options.ondragleave) ) { this.events.ondragleave = options.ondragleave ; }\n if (utils.is.function(options.ondropmove) ) { this.events.ondropmove = options.ondropmove ; }\n\n if (/^(pointer|center)$/.test(options.overlap)) {\n this.options.drop.overlap = options.overlap;\n }\n else if (utils.is.number(options.overlap)) {\n this.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0);\n }\n if ('accept' in options) {\n this.options.drop.accept = options.accept;\n }\n if ('checker' in options) {\n this.options.drop.checker = options.checker;\n }\n\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drop.enabled = options;\n\n if (!options) {\n this.ondragenter = this.ondragleave = this.ondrop\n = this.ondropactivate = this.ondropdeactivate = null;\n }\n\n return this;\n }\n\n return this.options.drop;\n};\n\nInteractable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) {\n let dropped = false;\n\n // if the dropzone has no rect (eg. display: none)\n // call the custom dropChecker or just return false\n if (!(rect = rect || this.getRect(dropElement))) {\n return (this.options.drop.checker\n ? this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement)\n : false);\n }\n\n const dropOverlap = this.options.drop.overlap;\n\n if (dropOverlap === 'pointer') {\n const origin = utils.getOriginXY(draggable, draggableElement, 'drag');\n const page = utils.getPageXY(dragEvent);\n\n page.x += origin.x;\n page.y += origin.y;\n\n const horizontal = (page.x > rect.left) && (page.x < rect.right);\n const vertical = (page.y > rect.top ) && (page.y < rect.bottom);\n\n dropped = horizontal && vertical;\n }\n\n const dragRect = draggable.getRect(draggableElement);\n\n if (dragRect && dropOverlap === 'center') {\n const cx = dragRect.left + dragRect.width / 2;\n const cy = dragRect.top + dragRect.height / 2;\n\n dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom;\n }\n\n if (dragRect && utils.is.number(dropOverlap)) {\n const overlapArea = (Math.max(0, Math.min(rect.right , dragRect.right ) - Math.max(rect.left, dragRect.left))\n * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top , dragRect.top )));\n\n const overlapRatio = overlapArea / (dragRect.width * dragRect.height);\n\n dropped = overlapRatio >= dropOverlap;\n }\n\n if (this.options.drop.checker) {\n dropped = this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement);\n }\n\n return dropped;\n};\n\nInteractable.signals.on('unset', function ({ interactable }) {\n interactable.dropzone(false);\n});\n\nInteractable.settingsMethods.push('dropChecker');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.dropTarget = null; // the dropzone a drag target might be dropped into\n interaction.dropElement = null; // the element at the time of checking\n interaction.prevDropTarget = null; // the dropzone that was recently dragged away from\n interaction.prevDropElement = null; // the element at the time of checking\n interaction.dropEvents = null; // the dropEvents related to the current drag event\n\n interaction.activeDrops = {\n dropzones: [], // the dropzones that are mentioned below\n elements : [], // elements of dropzones that accept the target draggable\n rects : [], // the rects of the elements mentioned above\n };\n\n});\n\nInteraction.signals.on('stop', function ({ interaction }) {\n interaction.dropTarget = interaction.dropElement =\n interaction.prevDropTarget = interaction.prevDropElement = null;\n});\n\n/*\\\n * interact.dynamicDrop\n [ method ]\n *\n * Returns or sets whether the dimensions of dropzone elements are\n * calculated on every dragmove or only on dragstart for the default\n * dropChecker\n *\n - newValue (boolean) #optional True to check on each move. False to check only before start\n = (boolean | interact) The current setting or interact\n\\*/\ninteract.dynamicDrop = function (newValue) {\n if (utils.is.bool(newValue)) {\n //if (dragging && dynamicDrop !== newValue && !newValue) {\n //calcRects(dropzones);\n //}\n\n dynamicDrop = newValue;\n\n return interact;\n }\n return dynamicDrop;\n};\n\nutils.merge(Interactable.eventTypes, [\n 'dragenter',\n 'dragleave',\n 'dropactivate',\n 'dropdeactivate',\n 'dropmove',\n 'drop',\n]);\nactions.methodDict.drop = 'dropzone';\n\ndefaultOptions.drop = drop.defaults;\n\nmodule.exports = drop;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst gesture = {\n defaults: {\n enabled : false,\n origin : null,\n restrict: null,\n },\n\n checker: function (pointer, event, interactable, element, interaction) {\n if (interaction.pointerIds.length >= 2) {\n return { name: 'gesture' };\n }\n\n return null;\n },\n\n getCursor: function () {\n return '';\n },\n};\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturestart') { return; }\n iEvent.ds = 0;\n\n interaction.gesture.startDistance = interaction.gesture.prevDistance = iEvent.distance;\n interaction.gesture.startAngle = interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.scale = 1;\n});\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturemove') { return; }\n\n iEvent.ds = iEvent.scale - interaction.gesture.scale;\n\n interaction.target.fire(iEvent);\n\n interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.prevDistance = iEvent.distance;\n\n if (iEvent.scale !== Infinity\n && iEvent.scale !== null\n && iEvent.scale !== undefined\n && !isNaN(iEvent.scale)) {\n\n interaction.gesture.scale = iEvent.scale;\n }\n});\n\n/*\\\n * Interactable.gesturable\n [ method ]\n *\n * Gets or sets whether multitouch gestures can be performed on the\n * Interactable's element\n *\n = (boolean) Indicates if this can be the target of gesture events\n | var isGestureable = interact(element).gesturable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on gesture events (makes the Interactable gesturable)\n = (object) this Interactable\n | interact(element).gesturable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // limit multiple gestures.\n | // See the explanation in @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n\\*/\nInteractable.prototype.gesturable = function (options) {\n if (utils.is.object(options)) {\n this.options.gesture.enabled = options.enabled === false? false: true;\n this.setPerAction('gesture', options);\n this.setOnEvents('gesture', options);\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.gesture.enabled = options;\n\n if (!options) {\n this.ongesturestart = this.ongesturestart = this.ongestureend = null;\n }\n\n return this;\n }\n\n return this.options.gesture;\n};\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action, event, starting, ending, deltaSource }) {\n if (action !== 'gesture') { return; }\n\n const pointers = interaction.pointers;\n\n iEvent.touches = [pointers[0], pointers[1]];\n\n if (starting) {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = 1;\n iEvent.ds = 0;\n iEvent.angle = utils.touchAngle(pointers, undefined, deltaSource);\n iEvent.da = 0;\n }\n else if (ending || event instanceof InteractEvent) {\n iEvent.distance = interaction.prevEvent.distance;\n iEvent.box = interaction.prevEvent.box;\n iEvent.scale = interaction.prevEvent.scale;\n iEvent.ds = iEvent.scale - 1;\n iEvent.angle = interaction.prevEvent.angle;\n iEvent.da = iEvent.angle - interaction.gesture.startAngle;\n }\n else {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = iEvent.distance / interaction.gesture.startDistance;\n iEvent.angle = utils.touchAngle(pointers, interaction.gesture.prevAngle, deltaSource);\n\n iEvent.ds = iEvent.scale - interaction.gesture.prevScale;\n iEvent.da = iEvent.angle - interaction.gesture.prevAngle;\n }\n});\n\nInteraction.signals.on('new', function (interaction) {\n interaction.gesture = {\n start: { x: 0, y: 0 },\n\n startDistance: 0, // distance between two touches of touchStart\n prevDistance : 0,\n distance : 0,\n\n scale: 1, // gesture.distance / gesture.startDistance\n\n startAngle: 0, // angle of line joining two touches\n prevAngle : 0, // angle of the previous gesture event\n };\n});\n\nactions.gesture = gesture;\nactions.names.push('gesture');\nutils.merge(Interactable.eventTypes, [\n 'gesturestart',\n 'gesturemove',\n 'gestureend',\n]);\nactions.methodDict.gesture = 'gesturable';\n\ndefaultOptions.gesture = gesture.defaults;\n\nmodule.exports = gesture;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\n// Less Precision with touch input\nconst defaultMargin = browser.supportsTouch || browser.supportsPointerEvent? 20: 10;\n\nconst resize = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n square: false,\n preserveAspectRatio: false,\n axis: 'xy',\n\n // use default margin\n margin: NaN,\n\n // object with props left, right, top, bottom which are\n // true/false values to resize when the pointer is over that edge,\n // CSS selectors to match the handles for each direction\n // or the Elements for each handle\n edges: null,\n\n // a value of 'none' will limit the resize rect to a minimum of 0x0\n // 'negate' will alow the rect to have negative width/height\n // 'reposition' will keep the width/height positive by swapping\n // the top and bottom edges and/or swapping the left and right edges\n invert: 'none',\n },\n\n checker: function (pointer, event, interactable, element, interaction, rect) {\n if (!rect) { return null; }\n\n const page = utils.extend({}, interaction.curCoords.page);\n const options = interactable.options;\n\n if (options.resize.enabled) {\n const resizeOptions = options.resize;\n const resizeEdges = { left: false, right: false, top: false, bottom: false };\n\n // if using resize.edges\n if (utils.is.object(resizeOptions.edges)) {\n for (const edge in resizeEdges) {\n resizeEdges[edge] = checkResizeEdge(edge,\n resizeOptions.edges[edge],\n page,\n interaction._eventTarget,\n element,\n rect,\n resizeOptions.margin || defaultMargin);\n }\n\n resizeEdges.left = resizeEdges.left && !resizeEdges.right;\n resizeEdges.top = resizeEdges.top && !resizeEdges.bottom;\n\n if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) {\n return {\n name: 'resize',\n edges: resizeEdges,\n };\n }\n }\n else {\n const right = options.resize.axis !== 'y' && page.x > (rect.right - defaultMargin);\n const bottom = options.resize.axis !== 'x' && page.y > (rect.bottom - defaultMargin);\n\n if (right || bottom) {\n return {\n name: 'resize',\n axes: (right? 'x' : '') + (bottom? 'y' : ''),\n };\n }\n }\n }\n\n return null;\n },\n\n cursors: (browser.isIe9OrOlder ? {\n x : 'e-resize',\n y : 's-resize',\n xy: 'se-resize',\n\n top : 'n-resize',\n left : 'w-resize',\n bottom : 's-resize',\n right : 'e-resize',\n topleft : 'se-resize',\n bottomright: 'se-resize',\n topright : 'ne-resize',\n bottomleft : 'ne-resize',\n } : {\n x : 'ew-resize',\n y : 'ns-resize',\n xy: 'nwse-resize',\n\n top : 'ns-resize',\n left : 'ew-resize',\n bottom : 'ns-resize',\n right : 'ew-resize',\n topleft : 'nwse-resize',\n bottomright: 'nwse-resize',\n topright : 'nesw-resize',\n bottomleft : 'nesw-resize',\n }),\n\n getCursor: function (action) {\n if (action.axis) {\n return resize.cursors[action.name + action.axis];\n }\n else if (action.edges) {\n let cursorKey = '';\n const edgeNames = ['top', 'bottom', 'left', 'right'];\n\n for (let i = 0; i < 4; i++) {\n if (action.edges[edgeNames[i]]) {\n cursorKey += edgeNames[i];\n }\n }\n\n return resize.cursors[cursorKey];\n }\n },\n};\n\n// resizestart\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'resizestart' || !interaction.prepared.edges) {\n return;\n }\n\n const startRect = interaction.target.getRect(interaction.element);\n const resizeOptions = interaction.target.options.resize;\n\n /*\n * When using the `resizable.square` or `resizable.preserveAspectRatio` options, resizing from one edge\n * will affect another. E.g. with `resizable.square`, resizing to make the right edge larger will make\n * the bottom edge larger by the same amount. We call these 'linked' edges. Any linked edges will depend\n * on the active edges and the edge being interacted with.\n */\n if (resizeOptions.square || resizeOptions.preserveAspectRatio) {\n const linkedEdges = utils.extend({}, interaction.prepared.edges);\n\n linkedEdges.top = linkedEdges.top || (linkedEdges.left && !linkedEdges.bottom);\n linkedEdges.left = linkedEdges.left || (linkedEdges.top && !linkedEdges.right );\n linkedEdges.bottom = linkedEdges.bottom || (linkedEdges.right && !linkedEdges.top );\n linkedEdges.right = linkedEdges.right || (linkedEdges.bottom && !linkedEdges.left );\n\n interaction.prepared._linkedEdges = linkedEdges;\n }\n else {\n interaction.prepared._linkedEdges = null;\n }\n\n // if using `resizable.preserveAspectRatio` option, record aspect ratio at the start of the resize\n if (resizeOptions.preserveAspectRatio) {\n interaction.resizeStartAspectRatio = startRect.width / startRect.height;\n }\n\n interaction.resizeRects = {\n start : startRect,\n current : utils.extend({}, startRect),\n inverted : utils.extend({}, startRect),\n previous : utils.extend({}, startRect),\n delta : {\n left: 0, right : 0, width : 0,\n top : 0, bottom: 0, height: 0,\n },\n };\n\n iEvent.rect = interaction.resizeRects.inverted;\n iEvent.deltaRect = interaction.resizeRects.delta;\n});\n\n// resizemove\nInteractEvent.signals.on('new', function ({ iEvent, phase, interaction }) {\n if (phase !== 'move' || !interaction.prepared.edges) { return; }\n\n const resizeOptions = interaction.target.options.resize;\n const invert = resizeOptions.invert;\n const invertible = invert === 'reposition' || invert === 'negate';\n\n let edges = interaction.prepared.edges;\n\n const start = interaction.resizeRects.start;\n const current = interaction.resizeRects.current;\n const inverted = interaction.resizeRects.inverted;\n const delta = interaction.resizeRects.delta;\n const previous = utils.extend(interaction.resizeRects.previous, inverted);\n const originalEdges = edges;\n\n let dx = iEvent.dx;\n let dy = iEvent.dy;\n\n if (resizeOptions.preserveAspectRatio || resizeOptions.square) {\n // `resize.preserveAspectRatio` takes precedence over `resize.square`\n const startAspectRatio = resizeOptions.preserveAspectRatio\n ? interaction.resizeStartAspectRatio\n : 1;\n\n edges = interaction.prepared._linkedEdges;\n\n if ((originalEdges.left && originalEdges.bottom)\n || (originalEdges.right && originalEdges.top)) {\n dy = -dx / startAspectRatio;\n }\n else if (originalEdges.left || originalEdges.right ) { dy = dx / startAspectRatio; }\n else if (originalEdges.top || originalEdges.bottom) { dx = dy * startAspectRatio; }\n }\n\n // update the 'current' rect without modifications\n if (edges.top ) { current.top += dy; }\n if (edges.bottom) { current.bottom += dy; }\n if (edges.left ) { current.left += dx; }\n if (edges.right ) { current.right += dx; }\n\n if (invertible) {\n // if invertible, copy the current rect\n utils.extend(inverted, current);\n\n if (invert === 'reposition') {\n // swap edge values if necessary to keep width/height positive\n let swap;\n\n if (inverted.top > inverted.bottom) {\n swap = inverted.top;\n\n inverted.top = inverted.bottom;\n inverted.bottom = swap;\n }\n if (inverted.left > inverted.right) {\n swap = inverted.left;\n\n inverted.left = inverted.right;\n inverted.right = swap;\n }\n }\n }\n else {\n // if not invertible, restrict to minimum of 0x0 rect\n inverted.top = Math.min(current.top, start.bottom);\n inverted.bottom = Math.max(current.bottom, start.top);\n inverted.left = Math.min(current.left, start.right);\n inverted.right = Math.max(current.right, start.left);\n }\n\n inverted.width = inverted.right - inverted.left;\n inverted.height = inverted.bottom - inverted.top ;\n\n for (const edge in inverted) {\n delta[edge] = inverted[edge] - previous[edge];\n }\n\n iEvent.edges = interaction.prepared.edges;\n iEvent.rect = inverted;\n iEvent.deltaRect = delta;\n});\n\n/*\\\n * Interactable.resizable\n [ method ]\n *\n * Gets or sets whether resize actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of resize elements\n | var isResizeable = interact('input[type=text]').resizable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on resize events (object makes the Interactable resizable)\n = (object) This Interactable\n | interact(element).resizable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | edges: {\n | top : true, // Use pointer coords to check for resize.\n | left : false, // Disable resizing from left edge.\n | bottom: '.resize-s',// Resize if pointer target matches selector\n | right : handleEl // Resize if pointer target is the given Element\n | },\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height are adjusted at a 1:1 ratio.\n | square: false,\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height maintain the aspect ratio they had when resizing started.\n | preserveAspectRatio: false,\n |\n | // a value of 'none' will limit the resize rect to a minimum of 0x0\n | // 'negate' will allow the rect to have negative width/height\n | // 'reposition' will keep the width/height positive by swapping\n | // the top and bottom edges and/or swapping the left and right edges\n | invert: 'none' || 'negate' || 'reposition'\n |\n | // limit multiple resizes.\n | // See the explanation in the @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n \\*/\nInteractable.prototype.resizable = function (options) {\n if (utils.is.object(options)) {\n this.options.resize.enabled = options.enabled === false? false: true;\n this.setPerAction('resize', options);\n this.setOnEvents('resize', options);\n\n if (/^x$|^y$|^xy$/.test(options.axis)) {\n this.options.resize.axis = options.axis;\n }\n else if (options.axis === null) {\n this.options.resize.axis = defaultOptions.resize.axis;\n }\n\n if (utils.is.bool(options.preserveAspectRatio)) {\n this.options.resize.preserveAspectRatio = options.preserveAspectRatio;\n }\n else if (utils.is.bool(options.square)) {\n this.options.resize.square = options.square;\n }\n\n return this;\n }\n if (utils.is.bool(options)) {\n this.options.resize.enabled = options;\n\n if (!options) {\n this.onresizestart = this.onresizestart = this.onresizeend = null;\n }\n\n return this;\n }\n return this.options.resize;\n};\n\nfunction checkResizeEdge (name, value, page, element, interactableElement, rect, margin) {\n // false, '', undefined, null\n if (!value) { return false; }\n\n // true value, use pointer coords and element rect\n if (value === true) {\n // if dimensions are negative, \"switch\" edges\n const width = utils.is.number(rect.width )? rect.width : rect.right - rect.left;\n const height = utils.is.number(rect.height)? rect.height : rect.bottom - rect.top ;\n\n if (width < 0) {\n if (name === 'left' ) { name = 'right'; }\n else if (name === 'right') { name = 'left' ; }\n }\n if (height < 0) {\n if (name === 'top' ) { name = 'bottom'; }\n else if (name === 'bottom') { name = 'top' ; }\n }\n\n if (name === 'left' ) { return page.x < ((width >= 0? rect.left: rect.right ) + margin); }\n if (name === 'top' ) { return page.y < ((height >= 0? rect.top : rect.bottom) + margin); }\n\n if (name === 'right' ) { return page.x > ((width >= 0? rect.right : rect.left) - margin); }\n if (name === 'bottom') { return page.y > ((height >= 0? rect.bottom: rect.top ) - margin); }\n }\n\n // the remaining checks require an element\n if (!utils.is.element(element)) { return false; }\n\n return utils.is.element(value)\n // the value is an element to use as a resize handle\n ? value === element\n // otherwise check if element matches value as selector\n : utils.matchesUpTo(element, value, interactableElement);\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.resizeAxes = 'xy';\n});\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action }) {\n if (action !== 'resize' || !interaction.resizeAxes) { return; }\n\n const options = interaction.target.options;\n\n if (options.resize.square) {\n if (interaction.resizeAxes === 'y') {\n iEvent.dx = iEvent.dy;\n }\n else {\n iEvent.dy = iEvent.dx;\n }\n iEvent.axes = 'xy';\n }\n else {\n iEvent.axes = interaction.resizeAxes;\n\n if (interaction.resizeAxes === 'x') {\n iEvent.dy = 0;\n }\n else if (interaction.resizeAxes === 'y') {\n iEvent.dx = 0;\n }\n }\n});\n\nactions.resize = resize;\nactions.names.push('resize');\nutils.merge(Interactable.eventTypes, [\n 'resizestart',\n 'resizemove',\n 'resizeinertiastart',\n 'resizeinertiaresume',\n 'resizeend',\n]);\nactions.methodDict.resize = 'resizable';\n\ndefaultOptions.resize = resize.defaults;\n\nmodule.exports = resize;\n","const raf = require('./utils/raf');\nconst getWindow = require('./utils/window').getWindow;\nconst is = require('./utils/is');\nconst domUtils = require('./utils/domUtils');\nconst Interaction = require('./Interaction');\nconst defaultOptions = require('./defaultOptions');\n\nconst autoScroll = {\n defaults: {\n enabled : false,\n container: null, // the item that is scrolled (Window or HTMLElement)\n margin : 60,\n speed : 300, // the scroll speed in pixels per second\n },\n\n interaction: null,\n i: null, // the handle returned by window.setInterval\n x: 0, y: 0, // Direction each pulse is to scroll in\n\n isScrolling: false,\n prevTime: 0,\n\n start: function (interaction) {\n autoScroll.isScrolling = true;\n raf.cancel(autoScroll.i);\n\n autoScroll.interaction = interaction;\n autoScroll.prevTime = new Date().getTime();\n autoScroll.i = raf.request(autoScroll.scroll);\n },\n\n stop: function () {\n autoScroll.isScrolling = false;\n raf.cancel(autoScroll.i);\n },\n\n // scroll the window by the values in scroll.x/y\n scroll: function () {\n const options = autoScroll.interaction.target.options[autoScroll.interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(autoScroll.interaction.element);\n const now = new Date().getTime();\n // change in time in seconds\n const dt = (now - autoScroll.prevTime) / 1000;\n // displacement\n const s = options.speed * dt;\n\n if (s >= 1) {\n if (is.window(container)) {\n container.scrollBy(autoScroll.x * s, autoScroll.y * s);\n }\n else if (container) {\n container.scrollLeft += autoScroll.x * s;\n container.scrollTop += autoScroll.y * s;\n }\n\n autoScroll.prevTime = now;\n }\n\n if (autoScroll.isScrolling) {\n raf.cancel(autoScroll.i);\n autoScroll.i = raf.request(autoScroll.scroll);\n }\n },\n check: function (interactable, actionName) {\n const options = interactable.options;\n\n return options[actionName].autoScroll && options[actionName].autoScroll.enabled;\n },\n onInteractionMove: function ({ interaction, pointer }) {\n if (!(interaction.interacting()\n && autoScroll.check(interaction.target, interaction.prepared.name))) {\n return;\n }\n\n if (interaction.simulation) {\n autoScroll.x = autoScroll.y = 0;\n return;\n }\n\n let top;\n let right;\n let bottom;\n let left;\n\n const options = interaction.target.options[interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(interaction.element);\n\n if (is.window(container)) {\n left = pointer.clientX < autoScroll.margin;\n top = pointer.clientY < autoScroll.margin;\n right = pointer.clientX > container.innerWidth - autoScroll.margin;\n bottom = pointer.clientY > container.innerHeight - autoScroll.margin;\n }\n else {\n const rect = domUtils.getElementClientRect(container);\n\n left = pointer.clientX < rect.left + autoScroll.margin;\n top = pointer.clientY < rect.top + autoScroll.margin;\n right = pointer.clientX > rect.right - autoScroll.margin;\n bottom = pointer.clientY > rect.bottom - autoScroll.margin;\n }\n\n autoScroll.x = (right ? 1: left? -1: 0);\n autoScroll.y = (bottom? 1: top? -1: 0);\n\n if (!autoScroll.isScrolling) {\n // set the autoScroll properties to those of the target\n autoScroll.margin = options.margin;\n autoScroll.speed = options.speed;\n\n autoScroll.start(interaction);\n }\n },\n};\n\nInteraction.signals.on('stop-active', function () {\n autoScroll.stop();\n});\n\nInteraction.signals.on('action-move', autoScroll.onInteractionMove);\n\ndefaultOptions.perAction.autoScroll = autoScroll.defaults;\n\nmodule.exports = autoScroll;\n","const Interactable = require('../Interactable');\nconst actions = require('../actions/base');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.ignoreFrom\n [ method ]\n *\n * If the target of the `mousedown`, `pointerdown` or `touchstart`\n * event or any of it's parents match the given CSS selector or\n * Element, no drag/resize/gesture is started.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to not ignore any elements\n = (string | Element | object) The current ignoreFrom value or this Interactable\n **\n | interact(element, { ignoreFrom: document.getElementById('no-action') });\n | // or\n | interact(element).ignoreFrom('input, textarea, a');\n\\*/\nInteractable.prototype.ignoreFrom = function (newValue) {\n return this._backCompatOption('ignoreFrom', newValue);\n};\n\n/*\\\n * Interactable.allowFrom\n [ method ]\n *\n * A drag/resize/gesture is started only If the target of the\n * `mousedown`, `pointerdown` or `touchstart` event or any of it's\n * parents match the given CSS selector or Element.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to allow from any element\n = (string | Element | object) The current allowFrom value or this Interactable\n **\n | interact(element, { allowFrom: document.getElementById('drag-handle') });\n | // or\n | interact(element).allowFrom('.handle');\n\\*/\nInteractable.prototype.allowFrom = function (newValue) {\n return this._backCompatOption('allowFrom', newValue);\n};\n\nInteractable.prototype.testIgnore = function (ignoreFrom, interactableElement, element) {\n if (!ignoreFrom || !is.element(element)) { return false; }\n\n if (is.string(ignoreFrom)) {\n return domUtils.matchesUpTo(element, ignoreFrom, interactableElement);\n }\n else if (is.element(ignoreFrom)) {\n return domUtils.nodeContains(ignoreFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testAllow = function (allowFrom, interactableElement, element) {\n if (!allowFrom) { return true; }\n\n if (!is.element(element)) { return false; }\n\n if (is.string(allowFrom)) {\n return domUtils.matchesUpTo(element, allowFrom, interactableElement);\n }\n else if (is.element(allowFrom)) {\n return domUtils.nodeContains(allowFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testIgnoreAllow = function (options, interactableElement, eventTarget) {\n return (!this.testIgnore(options.ignoreFrom, interactableElement, eventTarget)\n && this.testAllow(options.allowFrom, interactableElement, eventTarget));\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (event.buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\n","const interact = require('../interact');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst actions = require('../actions/base');\nconst defaultOptions = require('../defaultOptions');\nconst browser = require('../utils/browser');\nconst scope = require('../scope');\nconst utils = require('../utils');\nconst signals = require('../utils/Signals').new();\n\nrequire('./InteractableMethods');\n\nconst autoStart = {\n signals,\n withinInteractionLimit,\n // Allow this many interactions to happen simultaneously\n maxInteractions: Infinity,\n defaults: {\n perAction: {\n manualStart: false,\n max: Infinity,\n maxPerElement: 1,\n allowFrom: null,\n ignoreFrom: null,\n },\n },\n setActionDefaults: function (action) {\n utils.extend(action.defaults, autoStart.defaults.perAction);\n },\n};\n\n// set cursor style on mousedown\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget }) {\n if (interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\n// set cursor style on mousemove\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget }) {\n if (!interaction.mouse\n || interaction.pointerIsDown\n || interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\nInteraction.signals.on('move', function (arg) {\n const { interaction, event } = arg;\n\n if (!interaction.pointerIsDown\n || interaction.interacting()\n || !interaction.pointerWasMoved\n || !interaction.prepared.name) {\n return;\n }\n\n signals.fire('before-start', arg);\n\n const target = interaction.target;\n\n if (interaction.prepared.name && target) {\n // check manualStart and interaction limit\n if (target.options[interaction.prepared.name].manualStart\n || !withinInteractionLimit(target, interaction.element, interaction.prepared)) {\n interaction.stop(event);\n }\n else {\n interaction.start(interaction.prepared, target, interaction.element);\n }\n }\n});\n\n// Check if the current target supports the action.\n// If so, return the validated action. Otherwise, return null\nfunction validateAction (action, interactable, element, eventTarget) {\n if (utils.is.object(action)\n && interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget)\n && interactable.options[action.name].enabled\n && withinInteractionLimit(interactable, element, action)) {\n return action;\n }\n\n return null;\n}\n\nfunction validateSelector (interaction, pointer, event, matches, matchElements, eventTarget) {\n for (let i = 0, len = matches.length; i < len; i++) {\n const match = matches[i];\n const matchElement = matchElements[i];\n const action = validateAction(match.getAction(pointer, event, interaction, matchElement),\n match,\n matchElement,\n eventTarget);\n\n if (action) {\n return {\n action,\n target: match,\n element: matchElement,\n };\n }\n }\n\n return {};\n}\n\nfunction getActionInfo (interaction, pointer, event, eventTarget) {\n let matches = [];\n let matchElements = [];\n\n let element = eventTarget;\n let action = null;\n\n function pushMatches (interactable, selector, context) {\n const elements = (browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined);\n\n if (utils.matchesSelector(element, selector, elements)) {\n\n matches.push(interactable);\n matchElements.push(element);\n }\n }\n\n while (utils.is.element(element)) {\n matches = [];\n matchElements = [];\n\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && (action = validateAction(elementInteractable.getAction(pointer, event, interaction, element, eventTarget),\n elementInteractable,\n element,\n eventTarget))\n && !elementInteractable.options[action.name].manualStart) {\n return {\n element,\n action,\n target: elementInteractable,\n };\n }\n else {\n scope.interactables.forEachSelector(pushMatches, element);\n\n const actionInfo = validateSelector(interaction, pointer, event, matches, matchElements, eventTarget);\n\n if (actionInfo.action\n && !actionInfo.target.options[actionInfo.action.name].manualStart) {\n return actionInfo;\n }\n }\n\n element = utils.parentNode(element);\n }\n\n return {};\n}\n\nfunction prepare (interaction, { action, target, element }) {\n action = action || {};\n\n if (interaction.target && interaction.target.options.styleCursor) {\n interaction.target._doc.documentElement.style.cursor = '';\n }\n\n interaction.target = target;\n interaction.element = element;\n utils.copyAction(interaction.prepared, action);\n\n if (target && target.options.styleCursor) {\n const cursor = action? actions[action.name].getCursor(action) : '';\n interaction.target._doc.documentElement.style.cursor = cursor;\n }\n\n signals.fire('prepared', { interaction: interaction });\n}\n\nInteraction.signals.on('stop', function ({ interaction }) {\n const target = interaction.target;\n\n if (target && target.options.styleCursor) {\n target._doc.documentElement.style.cursor = '';\n }\n});\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (utils.is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (utils.is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n const buttons = event.buttons || ({\n 0: 1,\n 1: 4,\n 3: 8,\n 4: 16,\n })[event.button];\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\nfunction withinInteractionLimit (interactable, element, action) {\n const options = interactable.options;\n const maxActions = options[action.name].max;\n const maxPerElement = options[action.name].maxPerElement;\n let activeInteractions = 0;\n let targetCount = 0;\n let targetElementCount = 0;\n\n // no actions if any of these values == 0\n if (!(maxActions && maxPerElement && autoStart.maxInteractions)) { return; }\n\n for (let i = 0, len = scope.interactions.length; i < len; i++) {\n const interaction = scope.interactions[i];\n const otherAction = interaction.prepared.name;\n\n if (!interaction.interacting()) { continue; }\n\n activeInteractions++;\n\n if (activeInteractions >= autoStart.maxInteractions) {\n return false;\n }\n\n if (interaction.target !== interactable) { continue; }\n\n targetCount += (otherAction === action.name)|0;\n\n if (targetCount >= maxActions) {\n return false;\n }\n\n if (interaction.element === element) {\n targetElementCount++;\n\n if (otherAction !== action.name || targetElementCount >= maxPerElement) {\n return false;\n }\n }\n }\n\n return autoStart.maxInteractions > 0;\n}\n\n/*\\\n * interact.maxInteractions\n [ method ]\n **\n * Returns or sets the maximum number of concurrent interactions allowed.\n * By default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables\n * and elements, you need to enable it in the draggable, resizable and\n * gesturable `'max'` and `'maxPerElement'` options.\n **\n - newValue (number) #optional Any number. newValue <= 0 means no interactions.\n\\*/\ninteract.maxInteractions = function (newValue) {\n if (utils.is.number(newValue)) {\n autoStart.maxInteractions = newValue;\n\n return this;\n }\n\n return autoStart.maxInteractions;\n};\n\nInteractable.settingsMethods.push('styleCursor');\nInteractable.settingsMethods.push('actionChecker');\nInteractable.settingsMethods.push('ignoreFrom');\nInteractable.settingsMethods.push('allowFrom');\n\ndefaultOptions.base.actionChecker = null;\ndefaultOptions.base.styleCursor = true;\n\nutils.extend(defaultOptions.perAction, autoStart.defaults.perAction);\n\nmodule.exports = autoStart;\n","const autoStart = require('./base');\nconst Interaction = require('../Interaction');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.delayTimer = null;\n});\n\nautoStart.signals.on('prepared', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.delayTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.target, interaction.element);\n }, delay);\n }\n});\n\nInteraction.signals.on('move', function ({ interaction, duplicate }) {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.delayTimer);\n }\n});\n\n// prevent regular down->move autoStart\nautoStart.signals.on('before-start', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.prepared.name = null;\n }\n});\n","const autoStart = require('./base');\nconst scope = require('../scope');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\n\nconst { matchesSelector, parentNode } = require('../utils/domUtils');\n\nautoStart.setActionDefaults(require('../actions/drag'));\n\nautoStart.signals.on('before-start', function ({ interaction, eventTarget, dx, dy }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // check if a drag is in the correct axis\n const absX = Math.abs(dx);\n const absY = Math.abs(dy);\n const options = interaction.target.options.drag;\n const startAxis = options.startAxis;\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy');\n\n interaction.prepared.axis = options.lockAxis === 'start'\n ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n : options.lockAxis;\n\n // if the movement isn't in the startAxis of the interactable\n if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) {\n // cancel the prepared action\n interaction.prepared.name = null;\n\n // then try to get a drag from another ineractable\n\n if (!interaction.prepared.name) {\n\n let element = eventTarget;\n\n const getDraggable = function (interactable, selector, context) {\n const elements = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n if (interactable === interaction.target) { return; }\n\n if (!options.manualStart\n && !interactable.testIgnoreAllow(options, element, eventTarget)\n && matchesSelector(element, selector, elements)) {\n\n const action = interactable.getAction(interaction.downPointer,\n interaction.downEvent,\n interaction,\n element);\n\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, interactable)\n && autoStart.validateAction(action, interactable, element, eventTarget)) {\n\n return interactable;\n }\n }\n };\n\n let action = null;\n\n // check all interactables\n while (is.element(element)) {\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && elementInteractable !== interaction.target\n && !elementInteractable.options.drag.manualStart) {\n\n action = elementInteractable.getAction(interaction.downPointer, interaction.downEvent, interaction, element);\n }\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, elementInteractable)) {\n\n interaction.prepared.name = 'drag';\n interaction.target = elementInteractable;\n interaction.element = element;\n break;\n }\n\n const selectorInteractable = scope.interactables.forEachSelector(getDraggable, element);\n\n if (selectorInteractable) {\n interaction.prepared.name = 'drag';\n interaction.target = selectorInteractable;\n interaction.element = element;\n break;\n }\n\n element = parentNode(element);\n }\n }\n }\n});\n\nfunction checkStartAxis (startAxis, interactable) {\n if (!interactable) { return false; }\n\n const thisAxis = interactable.options.drag.startAxis;\n\n return (startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis);\n}\n","require('./base').setActionDefaults(require('../actions/gesture'));\n","require('./base').setActionDefaults(require('../actions/resize'));\n","module.exports = {\n base: {\n accept : null,\n preventDefault: 'auto',\n deltaSource : 'page',\n },\n\n perAction: {\n origin: { x: 0, y: 0 },\n\n // only allow left button by default\n // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n mouseButtons: 1,\n\n inertia: {\n enabled : false,\n resistance : 10, // the lambda in exponential decay\n minSpeed : 100, // target speed must be above this for inertia to start\n endSpeed : 10, // the speed at which inertia is slow enough to stop\n allowResume : true, // allow resuming an action in inertia phase\n smoothEndDuration: 300, // animate to snap/restrict endOnly if there's no inertia\n },\n },\n};\n","/* browser entry point */\n\n// Legacy browser support\nrequire('./legacyBrowsers');\n\n// inertia\nrequire('./inertia');\n\n// modifiers\nrequire('./modifiers/snap');\nrequire('./modifiers/restrict');\n\n// pointerEvents\nrequire('./pointerEvents/base');\nrequire('./pointerEvents/holdRepeat');\nrequire('./pointerEvents/interactableTargets');\n\n// delay\nrequire('./autoStart/delay');\n\n// actions\nrequire('./actions/gesture');\nrequire('./actions/resize');\nrequire('./actions/drag');\nrequire('./actions/drop');\n\n// load these modifiers after resize is loaded\nrequire('./modifiers/snapSize');\nrequire('./modifiers/restrictEdges');\nrequire('./modifiers/restrictSize');\n\n// autoStart actions\nrequire('./autoStart/gesture');\nrequire('./autoStart/resize');\nrequire('./autoStart/drag');\n\n// Interactable preventDefault setting\nrequire('./interactablePreventDefault.js');\n\n// autoScroll\nrequire('./autoScroll');\n\n// export interact\nmodule.exports = require('./interact');\n","const InteractEvent = require('./InteractEvent');\nconst Interaction = require('./Interaction');\nconst modifiers = require('./modifiers');\nconst utils = require('./utils');\nconst animationFrame = require('./utils/raf');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.inertiaStatus = {\n active : false,\n smoothEnd : false,\n allowResume: false,\n\n startEvent: null,\n upCoords : {},\n\n xe: 0, ye: 0,\n sx: 0, sy: 0,\n\n t0: 0,\n vx0: 0, vys: 0,\n duration: 0,\n\n lambda_v0: 0,\n one_ve_v0: 0,\n i : null,\n };\n\n interaction.boundInertiaFrame = () => inertiaFrame .apply(interaction);\n interaction.boundSmoothEndFrame = () => smoothEndFrame.apply(interaction);\n});\n\nInteraction.signals.on('down', function ({ interaction, event, pointer, eventTarget }) {\n const status = interaction.inertiaStatus;\n\n // Check if the down event hits the current inertia target\n if (status.active) {\n let element = eventTarget;\n\n // climb up the DOM tree from the event target\n while (utils.is.element(element)) {\n\n // if interaction element is the current inertia target element\n if (element === interaction.element) {\n // stop inertia\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n\n // update pointers to the down event's coordinates\n interaction.updatePointer(pointer);\n utils.setCoords(interaction.curCoords, interaction.pointers);\n\n // fire appropriate signals\n const signalArg = { interaction };\n Interaction.signals.fire('before-action-move', signalArg);\n Interaction.signals.fire('action-resume' , signalArg);\n\n // fire a reume event\n const resumeEvent = new InteractEvent(interaction,\n event,\n interaction.prepared.name,\n 'inertiaresume',\n interaction.element);\n\n interaction.target.fire(resumeEvent);\n interaction.prevEvent = resumeEvent;\n modifiers.resetStatuses(interaction.modifierStatuses);\n\n utils.copyCoords(interaction.prevCoords, interaction.curCoords);\n break;\n }\n\n element = utils.parentNode(element);\n }\n }\n});\n\nInteraction.signals.on('up', function ({ interaction, event }) {\n const status = interaction.inertiaStatus;\n\n if (!interaction.interacting() || status.active) { return; }\n\n const target = interaction.target;\n const options = target && target.options;\n const inertiaOptions = options && interaction.prepared.name && options[interaction.prepared.name].inertia;\n\n const now = new Date().getTime();\n const statuses = {};\n const page = utils.extend({}, interaction.curCoords.page);\n const pointerSpeed = interaction.pointerDelta.client.speed;\n\n let smoothEnd = false;\n let modifierResult;\n\n // check if inertia should be started\n const inertiaPossible = (inertiaOptions && inertiaOptions.enabled\n && interaction.prepared.name !== 'gesture'\n && event !== status.startEvent);\n\n const inertia = (inertiaPossible\n && (now - interaction.curCoords.timeStamp) < 50\n && pointerSpeed > inertiaOptions.minSpeed\n && pointerSpeed > inertiaOptions.endSpeed);\n\n const modifierArg = {\n interaction,\n pageCoords: page,\n statuses,\n preEnd: true,\n requireEndOnly: true,\n };\n\n // smoothEnd\n if (inertiaPossible && !inertia) {\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n if (modifierResult.shouldMove && modifierResult.locked) {\n smoothEnd = true;\n }\n }\n\n if (!(inertia || smoothEnd)) { return; }\n\n utils.copyCoords(status.upCoords, interaction.curCoords);\n\n interaction.pointers[0] = status.startEvent =\n new InteractEvent(interaction, event, interaction.prepared.name, 'inertiastart', interaction.element);\n\n status.t0 = now;\n\n status.active = true;\n status.allowResume = inertiaOptions.allowResume;\n interaction.simulation = status;\n\n target.fire(status.startEvent);\n\n if (inertia) {\n status.vx0 = interaction.pointerDelta.client.vx;\n status.vy0 = interaction.pointerDelta.client.vy;\n status.v0 = pointerSpeed;\n\n calcInertia(interaction, status);\n\n utils.extend(page, interaction.curCoords.page);\n\n page.x += status.xe;\n page.y += status.ye;\n\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n status.modifiedXe += modifierResult.dx;\n status.modifiedYe += modifierResult.dy;\n\n status.i = animationFrame.request(interaction.boundInertiaFrame);\n }\n else {\n status.smoothEnd = true;\n status.xe = modifierResult.dx;\n status.ye = modifierResult.dy;\n\n status.sx = status.sy = 0;\n\n status.i = animationFrame.request(interaction.boundSmoothEndFrame);\n }\n});\n\nInteraction.signals.on('stop-active', function ({ interaction }) {\n const status = interaction.inertiaStatus;\n\n if (status.active) {\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n }\n});\n\nfunction calcInertia (interaction, status) {\n const inertiaOptions = interaction.target.options[interaction.prepared.name].inertia;\n const lambda = inertiaOptions.resistance;\n const inertiaDur = -Math.log(inertiaOptions.endSpeed / status.v0) / lambda;\n\n status.x0 = interaction.prevEvent.pageX;\n status.y0 = interaction.prevEvent.pageY;\n status.t0 = status.startEvent.timeStamp / 1000;\n status.sx = status.sy = 0;\n\n status.modifiedXe = status.xe = (status.vx0 - inertiaDur) / lambda;\n status.modifiedYe = status.ye = (status.vy0 - inertiaDur) / lambda;\n status.te = inertiaDur;\n\n status.lambda_v0 = lambda / status.v0;\n status.one_ve_v0 = 1 - inertiaOptions.endSpeed / status.v0;\n}\n\nfunction inertiaFrame () {\n updateInertiaCoords(this);\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n\n const status = this.inertiaStatus;\n const options = this.target.options[this.prepared.name].inertia;\n const lambda = options.resistance;\n const t = new Date().getTime() / 1000 - status.t0;\n\n if (t < status.te) {\n\n const progress = 1 - (Math.exp(-lambda * t) - status.lambda_v0) / status.one_ve_v0;\n\n if (status.modifiedXe === status.xe && status.modifiedYe === status.ye) {\n status.sx = status.xe * progress;\n status.sy = status.ye * progress;\n }\n else {\n const quadPoint = utils.getQuadraticCurvePoint(0, 0,\n status.xe,\n status.ye,\n status.modifiedXe,\n status.modifiedYe,\n progress);\n\n status.sx = quadPoint.x;\n status.sy = quadPoint.y;\n }\n\n this.doMove();\n\n status.i = animationFrame.request(this.boundInertiaFrame);\n }\n else {\n status.sx = status.modifiedXe;\n status.sy = status.modifiedYe;\n\n this.doMove();\n this.end(status.startEvent);\n status.active = false;\n this.simulation = null;\n }\n\n utils.copyCoords(this.prevCoords, this.curCoords);\n}\n\nfunction smoothEndFrame () {\n updateInertiaCoords(this);\n\n const status = this.inertiaStatus;\n const t = new Date().getTime() - status.t0;\n const duration = this.target.options[this.prepared.name].inertia.smoothEndDuration;\n\n if (t < duration) {\n status.sx = utils.easeOutQuad(t, 0, status.xe, duration);\n status.sy = utils.easeOutQuad(t, 0, status.ye, duration);\n\n this.pointerMove(status.startEvent, status.startEvent);\n\n status.i = animationFrame.request(this.boundSmoothEndFrame);\n }\n else {\n status.sx = status.xe;\n status.sy = status.ye;\n\n this.pointerMove(status.startEvent, status.startEvent);\n this.end(status.startEvent);\n\n status.smoothEnd =\n status.active = false;\n this.simulation = null;\n }\n}\n\nfunction updateInertiaCoords (interaction) {\n const status = interaction.inertiaStatus;\n\n // return if inertia isn't running\n if (!status.active) { return; }\n\n const pageUp = status.upCoords.page;\n const clientUp = status.upCoords.client;\n\n utils.setCoords(interaction.curCoords, [ {\n pageX : pageUp.x + status.sx,\n pageY : pageUp.y + status.sy,\n clientX: clientUp.x + status.sx,\n clientY: clientUp.y + status.sy,\n } ]);\n}\n","const browser = require('./utils/browser');\nconst events = require('./utils/events');\nconst utils = require('./utils');\nconst scope = require('./scope');\nconst Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\n\nconst globalEvents = {};\n\n/*\\\n * interact\n [ method ]\n *\n * The methods of this variable can be used to set elements as\n * interactables and also to change various default settings.\n *\n * Calling it as a function and passing an element or a valid CSS selector\n * string returns an Interactable object which has various methods to\n * configure it.\n *\n - element (Element | string) The HTML or SVG Element to interact with or CSS selector\n = (object) An @Interactable\n *\n > Usage\n | interact('#draggable').draggable(true);\n |\n | var rectables = interact('rect');\n | rectables\n | .gesturable(true)\n | .on('gesturemove', function (event) {\n | // ...\n | });\n\\*/\nfunction interact (element, options) {\n let interactable = scope.interactables.get(element, options);\n\n if (!interactable) {\n interactable = new Interactable(element, options);\n interactable.events.global = globalEvents;\n }\n\n return interactable;\n}\n\n/*\\\n * interact.isSet\n [ method ]\n *\n * Check if an element has been set\n - element (Element) The Element being searched for\n = (boolean) Indicates if the element or CSS selector was previously passed to interact\n\\*/\ninteract.isSet = function (element, options) {\n return scope.interactables.indexOfElement(element, options && options.context) !== -1;\n};\n\n/*\\\n * interact.on\n [ method ]\n *\n * Adds a global listener for an InteractEvent or adds a DOM event to\n * `document`\n *\n - type (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) interact\n\\*/\ninteract.on = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.on(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.on(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n // if it is an InteractEvent type, add listener to globalEvents\n if (utils.contains(Interactable.eventTypes, type)) {\n // if this type of event was never bound\n if (!globalEvents[type]) {\n globalEvents[type] = [listener];\n }\n else {\n globalEvents[type].push(listener);\n }\n }\n // If non InteractEvent type, addEventListener to document\n else {\n events.add(scope.document, type, listener, { options });\n }\n\n return interact;\n};\n\n/*\\\n * interact.off\n [ method ]\n *\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n - type (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) interact\n \\*/\ninteract.off = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.off(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.off(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n if (!utils.contains(Interactable.eventTypes, type)) {\n events.remove(scope.document, type, listener, options);\n }\n else {\n let index;\n\n if (type in globalEvents\n && (index = utils.indexOf(globalEvents[type], listener)) !== -1) {\n globalEvents[type].splice(index, 1);\n }\n }\n\n return interact;\n};\n\n/*\\\n * interact.debug\n [ method ]\n *\n * Returns an object which exposes internal data\n = (object) An object with properties that outline the current state and expose internal functions and variables\n\\*/\ninteract.debug = function () {\n return scope;\n};\n\n// expose the functions used to calculate multi-touch properties\ninteract.getPointerAverage = utils.pointerAverage;\ninteract.getTouchBBox = utils.touchBBox;\ninteract.getTouchDistance = utils.touchDistance;\ninteract.getTouchAngle = utils.touchAngle;\n\ninteract.getElementRect = utils.getElementRect;\ninteract.getElementClientRect = utils.getElementClientRect;\ninteract.matchesSelector = utils.matchesSelector;\ninteract.closest = utils.closest;\n\n/*\\\n * interact.supportsTouch\n [ method ]\n *\n = (boolean) Whether or not the browser supports touch input\n\\*/\ninteract.supportsTouch = function () {\n return browser.supportsTouch;\n};\n\n/*\\\n * interact.supportsPointerEvent\n [ method ]\n *\n = (boolean) Whether or not the browser supports PointerEvents\n\\*/\ninteract.supportsPointerEvent = function () {\n return browser.supportsPointerEvent;\n};\n\n/*\\\n * interact.stop\n [ method ]\n *\n * Cancels all interactions (end events are not fired)\n *\n - event (Event) An event on which to call preventDefault()\n = (object) interact\n\\*/\ninteract.stop = function (event) {\n for (let i = scope.interactions.length - 1; i >= 0; i--) {\n scope.interactions[i].stop(event);\n }\n\n return interact;\n};\n\n/*\\\n * interact.pointerMoveTolerance\n [ method ]\n * Returns or sets the distance the pointer must be moved before an action\n * sequence occurs. This also affects tolerance for tap events.\n *\n - newValue (number) #optional The movement from the start position must be greater than this value\n = (number | Interactable) The current setting or interact\n\\*/\ninteract.pointerMoveTolerance = function (newValue) {\n if (utils.is.number(newValue)) {\n Interaction.pointerMoveTolerance = newValue;\n\n return this;\n }\n\n return Interaction.pointerMoveTolerance;\n};\n\ninteract.addDocument = scope.addDocument;\ninteract.removeDocument = scope.removeDocument;\n\nscope.interact = interact;\n\nmodule.exports = interact;\n","const Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\nconst scope = require('./scope');\nconst is = require('./utils/is');\nconst events = require('./utils/events');\n\nconst { nodeContains, matchesSelector } = require('./utils/domUtils');\n\n/*\\\n * Interactable.preventDefault\n [ method ]\n *\n * Returns or sets whether to prevent the browser's default behaviour\n * in response to pointer events. Can be set to:\n * - `'always'` to always prevent\n * - `'never'` to never prevent\n * - `'auto'` to let interact.js try to determine what would be best\n *\n - newValue (string) #optional `true`, `false` or `'auto'`\n = (string | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.preventDefault = function (newValue) {\n if (/^(always|never|auto)$/.test(newValue)) {\n this.options.preventDefault = newValue;\n return this;\n }\n\n if (is.bool(newValue)) {\n this.options.preventDefault = newValue? 'always' : 'never';\n return this;\n }\n\n return this.options.preventDefault;\n};\n\nInteractable.prototype.checkAndPreventDefault = function (event) {\n const setting = this.options.preventDefault;\n\n if (setting === 'never') { return; }\n\n if (setting === 'always') {\n event.preventDefault();\n return;\n }\n\n // setting === 'auto'\n\n // don't preventDefault if the browser supports passiveEvents\n // CSS touch-action and user-selecct should be used instead\n if (events.supportsOptions) {\n return;\n }\n\n // don't preventDefault of pointerdown events\n if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) {\n return;\n }\n\n // don't preventDefault on editable elements\n if (is.element(event.target)\n && matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) {\n return;\n }\n\n event.preventDefault();\n};\n\nfunction onInteractionEvent ({ interaction, event }) {\n if (interaction.target) {\n interaction.target.checkAndPreventDefault(event);\n }\n}\n\nfor (const eventSignal of ['down', 'move', 'up', 'cancel']) {\n Interaction.signals.on(eventSignal, onInteractionEvent);\n}\n\n// prevent native HTML5 drag on interact.js target elements\nInteraction.docEvents.dragstart = function preventNativeDrag (event) {\n for (const interaction of scope.interactions) {\n\n if (interaction.element\n && (interaction.element === event.target\n || nodeContains(interaction.element, event.target))) {\n\n interaction.target.checkAndPreventDefault(event);\n return;\n }\n }\n};\n","const scope = require('./scope');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst iFinder = require('./utils/interactionFinder');\nconst pointerEvents = require('./pointerEvents/base');\n\nconst { window } = require('./utils/window');\n\nconst toString = Object.prototype.toString;\n\nif (!window.Array.isArray) {\n window.Array.isArray = function (obj) {\n return toString.call(obj) === '[object Array]';\n };\n}\n\nif (!String.prototype.trim) {\n String.prototype.trim = function () {\n return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n };\n}\n\n// http://www.quirksmode.org/dom/events/click.html\n// >Events leading to dblclick\n//\n// IE8 doesn't fire down event before dblclick.\n// This workaround tries to fire a tap and doubletap after dblclick\nfunction onIE8Dblclick (event) {\n const eventTarget = event.target;\n const interaction = iFinder.search(event, event.type, eventTarget);\n\n if (!interaction) { return; }\n\n if (interaction.prevTap\n && event.clientX === interaction.prevTap.clientX\n && event.clientY === interaction.prevTap.clientY\n && eventTarget === interaction.prevTap.target) {\n\n interaction.downTargets[0] = eventTarget;\n interaction.downTimes [0] = new Date().getTime();\n\n pointerEvents.fire({\n interaction,\n event,\n eventTarget,\n pointer: event,\n type: 'tap',\n });\n }\n}\n\nif (browser.isIE8) {\n const selectFix = function (event) {\n for (const interaction of scope.interactions) {\n if (interaction.interacting()) {\n interaction.target.checkAndPreventDefault(event);\n }\n }\n };\n\n const onDocIE8 = function onDocIE8 ({ doc, win }, signalName) {\n const eventMethod = signalName.indexOf('listen') === 0\n ? events.add : events.remove;\n\n // For IE's lack of Event#preventDefault\n eventMethod(doc, 'selectstart', selectFix);\n\n if (pointerEvents) {\n eventMethod(doc, 'dblclick', onIE8Dblclick);\n }\n };\n\n scope.signals.on('add-document' , onDocIE8);\n scope.signals.on('remove-document', onDocIE8);\n}\n\nmodule.exports = null;\n","const InteractEvent = require('../InteractEvent');\nconst Interaction = require('../Interaction');\nconst extend = require('../utils/extend');\n\nconst modifiers = {\n names: [],\n\n setOffsets: function (arg) {\n const { interaction, pageCoords: page } = arg;\n const { target, element, startOffset } = interaction;\n const rect = target.getRect(element);\n\n if (rect) {\n startOffset.left = page.x - rect.left;\n startOffset.top = page.y - rect.top;\n\n startOffset.right = rect.right - page.x;\n startOffset.bottom = rect.bottom - page.y;\n\n if (!('width' in rect)) { rect.width = rect.right - rect.left; }\n if (!('height' in rect)) { rect.height = rect.bottom - rect.top ; }\n }\n else {\n startOffset.left = startOffset.top = startOffset.right = startOffset.bottom = 0;\n }\n\n arg.rect = rect;\n arg.interactable = target;\n arg.element = element;\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n\n arg.options = target.options[interaction.prepared.name][modifierName];\n\n if (!arg.options) {\n continue;\n }\n\n interaction.modifierOffsets[modifierName] = modifiers[modifierName].setOffset(arg);\n }\n },\n\n setAll: function (arg) {\n const { interaction, statuses, preEnd, requireEndOnly } = arg;\n const coords = extend({}, arg.pageCoords);\n const result = {\n dx: 0,\n dy: 0,\n changed: false,\n locked: false,\n shouldMove: true,\n };\n\n for (const modifierName of modifiers.names) {\n const modifier = modifiers[modifierName];\n const options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!shouldDo(options, preEnd, requireEndOnly)) { continue; }\n\n arg.status = arg.status = statuses[modifierName];\n arg.options = options;\n arg.offset = arg.interaction.modifierOffsets[modifierName];\n\n modifier.set(arg);\n\n if (arg.status.locked) {\n coords.x += arg.status.dx;\n coords.y += arg.status.dy;\n\n result.dx += arg.status.dx;\n result.dy += arg.status.dy;\n\n result.locked = true;\n }\n }\n\n // a move should be fired if:\n // - there are no modifiers enabled,\n // - no modifiers are \"locked\" i.e. have changed the pointer's coordinates, or\n // - the locked coords have changed since the last pointer move\n result.shouldMove = !arg.status || !result.locked || arg.status.changed;\n\n return result;\n },\n\n resetStatuses: function (statuses) {\n for (const modifierName of modifiers.names) {\n const status = statuses[modifierName] || {};\n\n status.dx = status.dy = 0;\n status.modifiedX = status.modifiedY = NaN;\n status.locked = false;\n status.changed = true;\n\n statuses[modifierName] = status;\n }\n\n return statuses;\n },\n\n start: function ({ interaction }, signalName) {\n const arg = {\n interaction,\n pageCoords: (signalName === 'action-resume' ?\n interaction.curCoords : interaction.startCoords).page,\n startOffset: interaction.startOffset,\n statuses: interaction.modifierStatuses,\n preEnd: false,\n requireEndOnly: false,\n };\n\n modifiers.setOffsets(arg);\n modifiers.resetStatuses(arg.statuses);\n\n arg.pageCoords = extend({}, interaction.startCoords.page);\n interaction.modifierResult = modifiers.setAll(arg);\n },\n};\n\nInteraction.signals.on('new', function (interaction) {\n interaction.startOffset = { left: 0, right: 0, top: 0, bottom: 0 };\n interaction.modifierOffsets = {};\n interaction.modifierStatuses = modifiers.resetStatuses({});\n interaction.modifierResult = null;\n});\n\nInteraction.signals.on('action-start' , modifiers.start);\nInteraction.signals.on('action-resume', modifiers.start);\n\nInteraction.signals.on('before-action-move', function ({ interaction, preEnd, interactingBeforeMove }) {\n const modifierResult = modifiers.setAll({\n interaction,\n preEnd,\n pageCoords: interaction.curCoords.page,\n statuses: interaction.modifierStatuses,\n requireEndOnly: false,\n });\n\n // don't fire an action move if a modifier would keep the event in the same\n // cordinates as before\n if (!modifierResult.shouldMove && interactingBeforeMove) {\n interaction._dontFireMove = true;\n }\n\n interaction.modifierResult = modifierResult;\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n for (let i = 0; i < modifiers.names.length; i++) {\n const options = interaction.target.options[interaction.prepared.name][modifiers.names[i]];\n\n // if the endOnly option is true for any modifier\n if (shouldDo(options, true, true)) {\n // fire a move event at the modified coordinates\n interaction.doMove({ event, preEnd: true });\n break;\n }\n }\n});\n\nInteractEvent.signals.on('set-xy', function (arg) {\n const { iEvent, interaction } = arg;\n const modifierArg = extend({}, arg);\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n modifierArg.options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!modifierArg.options) {\n continue;\n }\n\n const modifier = modifiers[modifierName];\n\n modifierArg.status = interaction.modifierStatuses[modifierName];\n\n iEvent[modifierName] = modifier.modifyCoords(modifierArg);\n }\n});\n\nfunction shouldDo (options, preEnd, requireEndOnly) {\n return (options && options.enabled\n && (preEnd || !options.endOnly)\n && (!requireEndOnly || options.endOnly));\n}\n\nmodule.exports = modifiers;\n","const modifiers = require('./index');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst restrict = {\n defaults: {\n enabled : false,\n endOnly : false,\n restriction: null,\n elementRect: null,\n },\n\n setOffset: function ({ rect, startOffset, options }) {\n const elementRect = options && options.elementRect;\n const offset = {};\n\n if (rect && elementRect) {\n offset.left = startOffset.left - (rect.width * elementRect.left);\n offset.top = startOffset.top - (rect.height * elementRect.top);\n\n offset.right = startOffset.right - (rect.width * (1 - elementRect.right));\n offset.bottom = startOffset.bottom - (rect.height * (1 - elementRect.bottom));\n }\n else {\n offset.left = offset.top = offset.right = offset.bottom = 0;\n }\n\n return offset;\n },\n\n set: function ({ pageCoords, interaction, status, options }) {\n if (!options) { return status; }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n\n const restriction = getRestrictionRect(options.restriction, interaction, page);\n\n if (!restriction) { return status; }\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n const rect = restriction;\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n const offset = interaction.modifierOffsets.restrict;\n\n // object is assumed to have\n // x, y, width, height or\n // left, top, right, bottom\n if ('x' in restriction && 'y' in restriction) {\n modifiedX = Math.max(Math.min(rect.x + rect.width - offset.right , page.x), rect.x + offset.left);\n modifiedY = Math.max(Math.min(rect.y + rect.height - offset.bottom, page.y), rect.y + offset.top );\n }\n else {\n modifiedX = Math.max(Math.min(rect.right - offset.right , page.x), rect.left + offset.left);\n modifiedY = Math.max(Math.min(rect.bottom - offset.bottom, page.y), rect.top + offset.top );\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const elementRect = options && options.elementRect;\n\n if (options && options.enabled\n && !(phase === 'start' && elementRect && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n getRestrictionRect,\n};\n\nfunction getRestrictionRect (value, interaction, page) {\n if (utils.is.function(value)) {\n return utils.resolveRectLike(value, interaction.target, interaction.element, [page.x, page.y, interaction]);\n } else {\n return utils.resolveRectLike(value, interaction.target, interaction.element);\n }\n}\n\nmodifiers.restrict = restrict;\nmodifiers.names.push('restrict');\n\ndefaultOptions.perAction.restrict = restrict.defaults;\n\nmodule.exports = restrict;\n","// This module adds the options.resize.restrictEdges setting which sets min and\n// max for the top, left, bottom and right edges of the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictEdges: {\n// inner: { top: 200, left: 200, right: 400, bottom: 400 },\n// outer: { top: 0, left: 0, right: 600, bottom: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst { getRestrictionRect } = require('./restrict');\n\nconst noInner = { top: +Infinity, left: +Infinity, bottom: -Infinity, right: -Infinity };\nconst noOuter = { top: -Infinity, left: -Infinity, bottom: +Infinity, right: +Infinity };\n\nconst restrictEdges = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n offset: null,\n },\n\n setOffset: function ({ interaction, startOffset, options }) {\n if (!options) {\n return utils.extend({}, startOffset);\n }\n\n const offset = getRestrictionRect(options.offset, interaction, interaction.startCoords.page);\n\n if (offset) {\n return {\n top: startOffset.top + offset.y,\n left: startOffset.left + offset.x,\n bottom: startOffset.bottom + offset.y,\n right: startOffset.right + offset.x,\n };\n }\n\n return startOffset;\n },\n\n set: function ({ pageCoords, interaction, status, offset, options }) {\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n const inner = rectUtils.xywhToTlbr(getRestrictionRect(options.inner, interaction, page)) || noInner;\n const outer = rectUtils.xywhToTlbr(getRestrictionRect(options.outer, interaction, page)) || noOuter;\n\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n if (edges.top) {\n modifiedY = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top);\n }\n else if (edges.bottom) {\n modifiedY = Math.max(Math.min(outer.bottom - offset.bottom, page.y), inner.bottom - offset.bottom);\n }\n if (edges.left) {\n modifiedX = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left);\n }\n else if (edges.right) {\n modifiedX = Math.max(Math.min(outer.right - offset.right, page.x), inner.right - offset.right);\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n if (options && options.enabled\n && !(phase === 'start' && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n noInner,\n noOuter,\n getRestrictionRect,\n};\n\nmodifiers.restrictEdges = restrictEdges;\nmodifiers.names.push('restrictEdges');\n\ndefaultOptions.perAction.restrictEdges = restrictEdges.defaults;\nresize.defaults.restrictEdges = restrictEdges.defaults;\n\nmodule.exports = restrictEdges;\n","// This module adds the options.resize.restrictSize setting which sets min and\n// max width and height for the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictSize: {\n// min: { width: -600, height: -600 },\n// max: { width: 600, height: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst restrictEdges = require('./restrictEdges');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst noMin = { width: -Infinity, height: -Infinity };\nconst noMax = { width: +Infinity, height: +Infinity };\n\nconst restrictSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n },\n\n setOffset: function ({ interaction }) {\n return interaction.startOffset;\n },\n\n set: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const rect = rectUtils.xywhToTlbr(interaction.resizeRects.inverted);\n\n const minSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.min, interaction)) || noMin;\n const maxSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.max, interaction)) || noMax;\n\n arg.options = {\n enabled: options.enabled,\n endOnly: options.endOnly,\n inner: utils.extend({}, restrictEdges.noInner),\n outer: utils.extend({}, restrictEdges.noOuter),\n };\n\n if (edges.top) {\n arg.options.inner.top = rect.bottom - minSize.height;\n arg.options.outer.top = rect.bottom - maxSize.height;\n }\n else if (edges.bottom) {\n arg.options.inner.bottom = rect.top + minSize.height;\n arg.options.outer.bottom = rect.top + maxSize.height;\n }\n if (edges.left) {\n arg.options.inner.left = rect.right - minSize.width;\n arg.options.outer.left = rect.right - maxSize.width;\n }\n else if (edges.right) {\n arg.options.inner.right = rect.left + minSize.width;\n arg.options.outer.right = rect.left + maxSize.width;\n }\n\n restrictEdges.set(arg);\n },\n\n modifyCoords: restrictEdges.modifyCoords,\n};\n\nmodifiers.restrictSize = restrictSize;\nmodifiers.names.push('restrictSize');\n\ndefaultOptions.perAction.restrictSize = restrictSize.defaults;\nresize.defaults.restrictSize = restrictSize.defaults;\n\nmodule.exports = restrictSize;\n","const modifiers = require('./index');\nconst interact = require('../interact');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst snap = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n\n relativePoints: null,\n },\n\n setOffset: function ({ interaction, interactable, element, rect, startOffset, options }) {\n const offsets = [];\n const optionsOrigin = utils.rectToXY(utils.resolveRectLike(options.origin));\n const origin = optionsOrigin || utils.getOriginXY(interactable, element, interaction.prepared.name);\n options = options || interactable.options[interaction.prepared.name].snap || {};\n\n let snapOffset;\n\n if (options.offset === 'startCoords') {\n snapOffset = {\n x: interaction.startCoords.page.x - origin.x,\n y: interaction.startCoords.page.y - origin.y,\n };\n }\n else {\n const offsetRect = utils.resolveRectLike(options.offset, interactable, element, [interaction]);\n\n snapOffset = utils.rectToXY(offsetRect) || { x: 0, y: 0 };\n }\n\n if (rect && options.relativePoints && options.relativePoints.length) {\n for (const { x: relativeX, y: relativeY } of options.relativePoints) {\n offsets.push({\n x: startOffset.left - (rect.width * relativeX) + snapOffset.x,\n y: startOffset.top - (rect.height * relativeY) + snapOffset.y,\n });\n }\n }\n else {\n offsets.push(snapOffset);\n }\n\n return offsets;\n },\n\n set: function ({ interaction, pageCoords, status, options, offset: offsets }) {\n const targets = [];\n let target;\n let page;\n let i;\n\n if (status.useStatusXY) {\n page = { x: status.x, y: status.y };\n }\n else {\n const origin = utils.getOriginXY(interaction.target, interaction.element, interaction.prepared.name);\n\n page = utils.extend({}, pageCoords);\n\n page.x -= origin.x;\n page.y -= origin.y;\n }\n\n status.realX = page.x;\n status.realY = page.y;\n\n let len = options.targets? options.targets.length : 0;\n\n for (const { x: offsetX, y: offsetY } of offsets) {\n const relativeX = page.x - offsetX;\n const relativeY = page.y - offsetY;\n\n for (const snapTarget of options.targets) {\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n targets.push({\n x: utils.is.number(target.x) ? (target.x + offsetX) : relativeX,\n y: utils.is.number(target.y) ? (target.y + offsetY) : relativeY,\n\n range: utils.is.number(target.range)? target.range: options.range,\n });\n }\n }\n\n const closest = {\n target: null,\n inRange: false,\n distance: 0,\n range: 0,\n dx: 0,\n dy: 0,\n };\n\n for (i = 0, len = targets.length; i < len; i++) {\n target = targets[i];\n\n const range = target.range;\n const dx = target.x - page.x;\n const dy = target.y - page.y;\n const distance = utils.hypot(dx, dy);\n let inRange = distance <= range;\n\n // Infinite targets count as being out of range\n // compared to non infinite ones that are in range\n if (range === Infinity && closest.inRange && closest.range !== Infinity) {\n inRange = false;\n }\n\n if (!closest.target || (inRange\n // is the closest target in range?\n ? (closest.inRange && range !== Infinity\n // the pointer is relatively deeper in this target\n ? distance / range < closest.distance / closest.range\n // this target has Infinite range and the closest doesn't\n : (range === Infinity && closest.range !== Infinity)\n // OR this target is closer that the previous closest\n || distance < closest.distance)\n // The other is not in range and the pointer is closer to this target\n : (!closest.inRange && distance < closest.distance))) {\n\n closest.target = target;\n closest.distance = distance;\n closest.range = range;\n closest.inRange = inRange;\n closest.dx = dx;\n closest.dy = dy;\n\n status.range = range;\n }\n }\n\n let snapChanged;\n\n if (closest.target) {\n snapChanged = (status.modifiedX !== closest.target.x || status.modifiedY !== closest.target.y);\n\n status.modifiedX = closest.target.x;\n status.modifiedY = closest.target.y;\n }\n else {\n snapChanged = true;\n\n status.modifiedX = NaN;\n status.modifiedY = NaN;\n }\n\n status.dx = closest.dx;\n status.dy = closest.dy;\n\n status.changed = (snapChanged || (closest.inRange && !status.locked));\n status.locked = closest.inRange;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const relativePoints = options && options.relativePoints;\n\n if (options && options.enabled\n && !(phase === 'start' && relativePoints && relativePoints.length)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n }\n\n return {\n range : status.range,\n locked : status.locked,\n x : status.modifiedX,\n y : status.modifiedY,\n realX : status.realX,\n realY : status.realY,\n dx : status.dx,\n dy : status.dy,\n };\n }\n },\n};\n\ninteract.createSnapGrid = function (grid) {\n return function (x, y) {\n const limits = grid.limits || {\n left : -Infinity,\n right : Infinity,\n top : -Infinity,\n bottom: Infinity,\n };\n let offsetX = 0;\n let offsetY = 0;\n\n if (utils.is.object(grid.offset)) {\n offsetX = grid.offset.x;\n offsetY = grid.offset.y;\n }\n\n const gridx = Math.round((x - offsetX) / grid.x);\n const gridy = Math.round((y - offsetY) / grid.y);\n\n const newX = Math.max(limits.left, Math.min(limits.right , gridx * grid.x + offsetX));\n const newY = Math.max(limits.top , Math.min(limits.bottom, gridy * grid.y + offsetY));\n\n return {\n x: newX,\n y: newY,\n range: grid.range,\n };\n };\n};\n\nmodifiers.snap = snap;\nmodifiers.names.push('snap');\n\ndefaultOptions.perAction.snap = snap.defaults;\n\nmodule.exports = snap;\n","// This module allows snapping of the size of targets during resize\n// interactions.\n\nconst modifiers = require('./index');\nconst snap = require('./snap');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\nconst utils = require('../utils/');\n\nconst snapSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n },\n\n setOffset: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.edges;\n\n if (!edges) { return; }\n\n arg.options = {\n relativePoints: [{\n x: edges.left? 0 : 1,\n y: edges.top ? 0 : 1,\n }],\n origin: { x: 0, y: 0 },\n offset: 'self',\n range: options.range,\n };\n\n const offsets = snap.setOffset(arg);\n arg.options = options;\n\n return offsets;\n },\n\n set: function (arg) {\n const { interaction, options, offset, pageCoords } = arg;\n const page = utils.extend({}, pageCoords);\n const relativeX = page.x - offset[0].x;\n const relativeY = page.y - offset[0].y;\n\n arg.options = utils.extend({}, options);\n arg.options.targets = [];\n\n for (const snapTarget of options.targets) {\n let target;\n\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n if ('width' in target && 'height' in target) {\n target.x = target.width;\n target.y = target.height;\n }\n\n arg.options.targets.push(target);\n }\n\n snap.set(arg);\n },\n\n modifyCoords: function (arg) {\n const { options } = arg;\n\n arg.options = utils.extend({}, options);\n arg.options.enabled = options.enabled;\n arg.options.relativePoints = [null];\n\n snap.modifyCoords(arg);\n },\n};\n\nmodifiers.snapSize = snapSize;\nmodifiers.names.push('snapSize');\n\ndefaultOptions.perAction.snapSize = snapSize.defaults;\nresize.defaults.snapSize = snapSize.defaults;\n\nmodule.exports = snapSize;\n","const pointerUtils = require('../utils/pointerUtils');\n\nmodule.exports = class PointerEvent {\n constructor (type, pointer, event, eventTarget, interaction) {\n pointerUtils.pointerExtend(this, event);\n\n if (event !== pointer) {\n pointerUtils.pointerExtend(this, pointer);\n }\n\n this.interaction = interaction;\n\n this.timeStamp = new Date().getTime();\n this.originalEvent = event;\n this.type = type;\n this.pointerId = pointerUtils.getPointerId(pointer);\n this.pointerType = pointerUtils.getPointerType(pointer);\n this.target = eventTarget;\n this.currentTarget = null;\n\n if (type === 'tap') {\n const pointerIndex = interaction.getPointerIndex(pointer);\n this.dt = this.timeStamp - interaction.downTimes[pointerIndex];\n\n const interval = this.timeStamp - interaction.tapTime;\n\n this.double = !!(interaction.prevTap\n && interaction.prevTap.type !== 'doubletap'\n && interaction.prevTap.target === this.target\n && interval < 500);\n }\n else if (type === 'doubletap') {\n this.dt = pointer.timeStamp - interaction.tapTime;\n }\n }\n\n subtractOrigin ({ x: originX, y: originY }) {\n this.pageX -= originX;\n this.pageY -= originY;\n this.clientX -= originX;\n this.clientY -= originY;\n\n return this;\n }\n\n addOrigin ({ x: originX, y: originY }) {\n this.pageX += originX;\n this.pageY += originY;\n this.clientX += originX;\n this.clientY += originY;\n\n return this;\n }\n\n preventDefault () {\n this.originalEvent.preventDefault();\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n};\n","const PointerEvent = require('./PointerEvent');\nconst Interaction = require('../Interaction');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst defaults = require('../defaultOptions');\nconst signals = require('../utils/Signals').new();\nconst { filter } = require('../utils/arr');\n\nconst simpleSignals = [ 'down', 'up', 'cancel' ];\nconst simpleEvents = [ 'down', 'up', 'cancel' ];\n\nconst pointerEvents = {\n PointerEvent,\n fire,\n collectEventTargets,\n signals,\n defaults: {\n holdDuration: 600,\n ignoreFrom : null,\n allowFrom : null,\n origin : { x: 0, y: 0 },\n },\n types: [\n 'down',\n 'move',\n 'up',\n 'cancel',\n 'tap',\n 'doubletap',\n 'hold',\n ],\n};\n\nfunction fire (arg) {\n const {\n interaction, pointer, event, eventTarget,\n type = arg.pointerEvent.type,\n targets = collectEventTargets(arg),\n pointerEvent = new PointerEvent(type, pointer, event, eventTarget, interaction),\n } = arg;\n\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n targets,\n type,\n pointerEvent,\n };\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n\n for (const prop in target.props || {}) {\n pointerEvent[prop] = target.props[prop];\n }\n\n const origin = utils.getOriginXY(target.eventable, target.element);\n\n pointerEvent.subtractOrigin(origin);\n pointerEvent.eventable = target.eventable;\n pointerEvent.currentTarget = target.element;\n\n target.eventable.fire(pointerEvent);\n\n pointerEvent.addOrigin(origin);\n\n if (pointerEvent.immediatePropagationStopped\n || (pointerEvent.propagationStopped\n && (i + 1) < targets.length && targets[i + 1].element !== pointerEvent.currentTarget)) {\n break;\n }\n }\n\n signals.fire('fired', signalArg);\n\n if (type === 'tap') {\n // if pointerEvent should make a double tap, create and fire a doubletap\n // PointerEvent and use that as the prevTap\n const prevTap = pointerEvent.double\n ? fire({\n interaction, pointer, event, eventTarget,\n type: 'doubletap',\n })\n : pointerEvent;\n\n interaction.prevTap = prevTap;\n interaction.tapTime = prevTap.timeStamp;\n }\n\n return pointerEvent;\n}\n\nfunction collectEventTargets ({ interaction, pointer, event, eventTarget, type }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n // do not fire a tap event if the pointer was moved before being lifted\n if (type === 'tap' && (interaction.pointerWasMoved\n // or if the pointerup target is different to the pointerdown target\n || !(interaction.downTargets[pointerIndex] && interaction.downTargets[pointerIndex] === eventTarget))) {\n return [];\n }\n\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n path,\n targets: [],\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (type === 'hold') {\n signalArg.targets = filter(signalArg.targets, target =>\n target.eventable.options.holdDuration === interaction.holdTimers[pointerIndex].duration);\n }\n\n return signalArg.targets;\n}\n\nInteraction.signals.on('update-pointer-down', function ({ interaction, pointerIndex }) {\n interaction.holdTimers[pointerIndex] = { duration: Infinity, timeout: null };\n});\n\nInteraction.signals.on('remove-pointer', function ({ interaction, pointerIndex }) {\n interaction.holdTimers.splice(pointerIndex, 1);\n});\n\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget, duplicateMove }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n if (!duplicateMove && (!interaction.pointerIsDown || interaction.pointerWasMoved)) {\n if (interaction.pointerIsDown) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n\n fire({\n interaction, pointer, event, eventTarget,\n type: 'move',\n });\n }\n});\n\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget, pointerIndex }) {\n // copy event to be used in timeout for IE8\n const eventCopy = browser.isIE8? utils.extend({}, event) : event;\n\n const timer = interaction.holdTimers[pointerIndex];\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'hold',\n targets: [],\n path,\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (!signalArg.targets.length) { return; }\n\n let minDuration = Infinity;\n\n for (let i = 0; i < signalArg.targets.length; i++) {\n const target = signalArg.targets[i];\n const holdDuration = target.eventable.options.holdDuration;\n\n if (holdDuration < minDuration) {\n minDuration = holdDuration;\n }\n }\n\n timer.duration = minDuration;\n timer.timeout = setTimeout(function () {\n fire({\n interaction,\n eventTarget,\n pointer: browser.isIE8? eventCopy : pointer,\n event: eventCopy,\n type: 'hold',\n });\n }, minDuration);\n});\n\nInteraction.signals.on('up', ({ interaction, pointer, event, eventTarget }) => {\n if (!interaction.pointerWasMoved) {\n fire({ interaction, eventTarget, pointer, event, type: 'tap' });\n }\n});\n\n['up', 'cancel'].forEach(function (signalName) {\n Interaction.signals.on(signalName, function ({ interaction, pointerIndex }) {\n if (interaction.holdTimers[pointerIndex]) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n });\n});\n\nfunction createSignalListener (type) {\n return function ({ interaction, pointer, event, eventTarget }) {\n fire({ interaction, eventTarget, pointer, event, type });\n };\n}\n\nfor (let i = 0; i < simpleSignals.length; i++) {\n Interaction.signals.on(simpleSignals[i], createSignalListener(simpleEvents[i]));\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.prevTap = null; // the most recent tap event on this interaction\n interaction.tapTime = 0; // time of the most recent tap event\n interaction.holdTimers = []; // [{ duration, timeout }]\n});\n\ndefaults.pointerEvents = pointerEvents.defaults;\nmodule.exports = pointerEvents;\n","const pointerEvents = require('./base');\nconst Interaction = require('../Interaction');\n\npointerEvents.signals.on('new', onNew);\npointerEvents.signals.on('fired', onFired);\n\nfor (const signal of ['move', 'up', 'cancel', 'endall']) {\n Interaction.signals.on(signal, endHoldRepeat);\n}\n\nfunction onNew ({ pointerEvent }) {\n if (pointerEvent.type !== 'hold') { return; }\n\n pointerEvent.count = (pointerEvent.count || 0) + 1;\n}\n\nfunction onFired ({ interaction, pointerEvent, eventTarget, targets }) {\n if (pointerEvent.type !== 'hold' || !targets.length) { return; }\n\n // get the repeat interval from the first eventable\n const interval = targets[0].eventable.options.holdRepeatInterval;\n\n // don't repeat if the interval is 0 or less\n if (interval <= 0) { return; }\n\n // set a timeout to fire the holdrepeat event\n interaction.holdIntervalHandle = setTimeout(function () {\n pointerEvents.fire({\n interaction,\n eventTarget,\n type: 'hold',\n pointer: pointerEvent,\n event: pointerEvent,\n });\n }, interval);\n}\n\nfunction endHoldRepeat ({ interaction }) {\n // set the interaction's holdStopTime property\n // to stop further holdRepeat events\n if (interaction.holdIntervalHandle) {\n clearInterval(interaction.holdIntervalHandle);\n interaction.holdIntervalHandle = null;\n }\n}\n\n// don't repeat by default\npointerEvents.defaults.holdRepeatInterval = 0;\npointerEvents.types.push('holdrepeat');\n\nmodule.exports = {\n onNew,\n onFired,\n endHoldRepeat,\n};\n","const pointerEvents = require('./base');\nconst Interactable = require('../Interactable');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\nconst scope = require('../scope');\nconst extend = require('../utils/extend');\nconst { merge } = require('../utils/arr');\n\npointerEvents.signals.on('collect-targets', function ({ targets, element, type, eventTarget }) {\n function collectSelectors (interactable, selector, context) {\n const els = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && is.element(element)\n && domUtils.matchesSelector(element, selector, els)\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n const interactable = scope.interactables.get(element);\n\n if (interactable) {\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n scope.interactables.forEachSelector(collectSelectors, element);\n});\n\nInteractable.signals.on('new', function ({ interactable }) {\n interactable.events.getRect = function (element) {\n return interactable.getRect(element);\n };\n});\n\nInteractable.signals.on('set', function ({ interactable, options }) {\n extend(interactable.events.options, pointerEvents.defaults);\n extend(interactable.events.options, options);\n});\n\nmerge(Interactable.eventTypes, pointerEvents.types);\n\nInteractable.prototype.pointerEvents = function (options) {\n extend(this.events.options, options);\n\n return this;\n};\n\nconst __backCompatOption = Interactable.prototype._backCompatOption;\n\nInteractable.prototype._backCompatOption = function (optionName, newValue) {\n const ret = __backCompatOption.call(this, optionName, newValue);\n\n if (ret === this) {\n this.events.options[optionName] = newValue;\n }\n\n return ret;\n};\n\nInteractable.settingsMethods.push('pointerEvents');\n","const utils = require('./utils');\nconst events = require('./utils/events');\nconst signals = require('./utils/Signals').new();\n\nconst scope = {\n signals,\n events,\n utils,\n\n // main document\n document: require('./utils/domObjects').document,\n // all documents being listened to\n documents: [],\n\n addDocument: function (doc, win) {\n // do nothing if document is already known\n if (utils.contains(scope.documents, doc)) { return false; }\n\n win = win || scope.getWindow(doc);\n\n scope.documents.push(doc);\n events.documents.push(doc);\n\n // don't add an unload event for the main document\n // so that the page may be cached in browser history\n if (doc !== scope.document) {\n events.add(win, 'unload', scope.onWindowUnload);\n }\n\n signals.fire('add-document', { doc, win });\n },\n\n removeDocument: function (doc, win) {\n const index = utils.indexOf(scope.documents, doc);\n\n win = win || scope.getWindow(doc);\n\n events.remove(win, 'unload', scope.onWindowUnload);\n\n scope.documents.splice(index, 1);\n events.documents.splice(index, 1);\n\n signals.fire('remove-document', { win, doc });\n },\n\n onWindowUnload: function () {\n scope.removeDocument(this.document, this);\n },\n};\n\nmodule.exports = scope;\n","const { indexOf } = require('./arr');\n\nclass Signals {\n constructor () {\n this.listeners = {\n // signalName: [listeners],\n };\n }\n\n on (name, listener) {\n if (!this.listeners[name]) {\n this.listeners[name] = [listener];\n return;\n }\n\n this.listeners[name].push(listener);\n }\n\n off (name, listener) {\n if (!this.listeners[name]) { return; }\n\n const index = indexOf(this.listeners[name], listener);\n\n if (index !== -1) {\n this.listeners[name].splice(index, 1);\n }\n }\n\n fire (name, arg) {\n const targetListeners = this.listeners[name];\n\n if (!targetListeners) { return; }\n\n for (let i = 0; i < targetListeners.length; i++) {\n if (targetListeners[i](arg, name) === false) {\n return;\n }\n }\n }\n}\n\nSignals.new = function () {\n return new Signals();\n};\n\nmodule.exports = Signals;\n","function indexOf (array, target) {\n for (let i = 0, len = array.length; i < len; i++) {\n if (array[i] === target) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction contains (array, target) {\n return indexOf(array, target) !== -1;\n}\n\nfunction merge (target, source) {\n for (let i = 0; i < source.length; i++) {\n target.push(source[i]);\n }\n\n return target;\n}\n\nfunction filter (array, test) {\n const result = [];\n\n for (let i = 0; i < array.length; i++) {\n if (test(array[i])) {\n result.push(array[i]);\n }\n }\n\n return result;\n}\n\nmodule.exports = {\n indexOf,\n contains,\n merge,\n filter,\n};\n","const { window } = require('./window');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst Element = domObjects.Element;\nconst navigator = window.navigator;\n\nconst browser = {\n // Does the browser support touch input?\n supportsTouch: !!(('ontouchstart' in window) || is.function(window.DocumentTouch)\n && domObjects.document instanceof window.DocumentTouch),\n\n // Does the browser support PointerEvents\n supportsPointerEvent: !!domObjects.PointerEvent,\n\n isIE8: ('attachEvent' in window) && !('addEventListener' in window),\n\n // Opera Mobile must be handled differently\n isOperaMobile: (navigator.appName === 'Opera'\n && browser.supportsTouch\n && navigator.userAgent.match('Presto')),\n\n // scrolling doesn't change the result of getClientRects on iOS 7\n isIOS7: (/iP(hone|od|ad)/.test(navigator.platform)\n && /OS 7[^\\d]/.test(navigator.appVersion)),\n\n isIe9OrOlder: /MSIE (8|9)/.test(navigator.userAgent),\n\n // prefix matchesSelector\n prefixedMatchesSelector: 'matches' in Element.prototype\n ? 'matches': 'webkitMatchesSelector' in Element.prototype\n ? 'webkitMatchesSelector': 'mozMatchesSelector' in Element.prototype\n ? 'mozMatchesSelector': 'oMatchesSelector' in Element.prototype\n ? 'oMatchesSelector': 'msMatchesSelector',\n\n useMatchesSelectorPolyfill: false,\n\n pEventTypes: (domObjects.PointerEvent\n ? (domObjects.PointerEvent === window.MSPointerEvent\n ? {\n up: 'MSPointerUp',\n down: 'MSPointerDown',\n over: 'mouseover',\n out: 'mouseout',\n move: 'MSPointerMove',\n cancel: 'MSPointerCancel',\n }\n : {\n up: 'pointerup',\n down: 'pointerdown',\n over: 'pointerover',\n out: 'pointerout',\n move: 'pointermove',\n cancel: 'pointercancel',\n })\n : null),\n\n // because Webkit and Opera still use 'mousewheel' event type\n wheelEvent: 'onmousewheel' in domObjects.document? 'mousewheel': 'wheel',\n\n};\n\nbrowser.useMatchesSelectorPolyfill = !is.function(Element.prototype[browser.prefixedMatchesSelector]);\n\nmodule.exports = browser;\n","const domObjects = {};\nconst win = require('./window').window;\n\nfunction blank () {}\n\ndomObjects.document = win.document;\ndomObjects.DocumentFragment = win.DocumentFragment || blank;\ndomObjects.SVGElement = win.SVGElement || blank;\ndomObjects.SVGSVGElement = win.SVGSVGElement || blank;\ndomObjects.SVGElementInstance = win.SVGElementInstance || blank;\ndomObjects.Element = win.Element || blank;\ndomObjects.HTMLElement = win.HTMLElement || domObjects.Element;\n\ndomObjects.Event = win.Event;\ndomObjects.Touch = win.Touch || blank;\ndomObjects.PointerEvent = (win.PointerEvent || win.MSPointerEvent);\n\nmodule.exports = domObjects;\n","const win = require('./window');\nconst browser = require('./browser');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst domUtils = {\n nodeContains: function (parent, child) {\n while (child) {\n if (child === parent) {\n return true;\n }\n\n child = child.parentNode;\n }\n\n return false;\n },\n\n closest: function (element, selector) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) { return element; }\n\n element = domUtils.parentNode(element);\n }\n\n return null;\n },\n\n parentNode: function (node) {\n let parent = node.parentNode;\n\n if (is.docFrag(parent)) {\n // skip past #shado-root fragments\n while ((parent = parent.host) && is.docFrag(parent)) {\n continue;\n }\n\n return parent;\n }\n\n return parent;\n },\n\n // taken from http://tanalin.com/en/blog/2012/12/matches-selector-ie8/ and modified\n matchesSelectorPolyfill: browser.useMatchesSelectorPolyfill\n ? function (element, selector, elems) {\n elems = elems || element.parentNode.querySelectorAll(selector);\n\n for (let i = 0, len = elems.length; i < len; i++) {\n if (elems[i] === element) {\n return true;\n }\n }\n\n return false;\n }\n : null,\n\n matchesSelector: function (element, selector, nodeList) {\n if (browser.useMatchesSelectorPolyfill) {\n return domUtils.matchesSelectorPolyfill(element, selector, nodeList);\n }\n\n // remove /deep/ from selectors if shadowDOM polyfill is used\n if (win.window !== win.realWindow) {\n selector = selector.replace(/\\/deep\\//g, ' ');\n }\n\n return element[browser.prefixedMatchesSelector](selector);\n },\n\n // Test for the element that's \"above\" all other qualifiers\n indexOfDeepestElement: function (elements) {\n let deepestZoneParents = [];\n let dropzoneParents = [];\n let dropzone;\n let deepestZone = elements[0];\n let index = deepestZone? 0: -1;\n let parent;\n let child;\n let i;\n let n;\n\n for (i = 1; i < elements.length; i++) {\n dropzone = elements[i];\n\n // an element might belong to multiple selector dropzones\n if (!dropzone || dropzone === deepestZone) {\n continue;\n }\n\n if (!deepestZone) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n // check if the deepest or current are document.documentElement or document.rootElement\n // - if the current dropzone is, do nothing and continue\n if (dropzone.parentNode === dropzone.ownerDocument) {\n continue;\n }\n // - if deepest is, update with the current dropzone and continue to next\n else if (deepestZone.parentNode === dropzone.ownerDocument) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n if (!deepestZoneParents.length) {\n parent = deepestZone;\n while (parent.parentNode && parent.parentNode !== parent.ownerDocument) {\n deepestZoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n }\n\n // if this element is an svg element and the current deepest is\n // an HTMLElement\n if (deepestZone instanceof domObjects.HTMLElement\n && dropzone instanceof domObjects.SVGElement\n && !(dropzone instanceof domObjects.SVGSVGElement)) {\n\n if (dropzone === deepestZone.parentNode) {\n continue;\n }\n\n parent = dropzone.ownerSVGElement;\n }\n else {\n parent = dropzone;\n }\n\n dropzoneParents = [];\n\n while (parent.parentNode !== parent.ownerDocument) {\n dropzoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n\n n = 0;\n\n // get (position of last common ancestor) + 1\n while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) {\n n++;\n }\n\n const parents = [\n dropzoneParents[n - 1],\n dropzoneParents[n],\n deepestZoneParents[n],\n ];\n\n child = parents[0].lastChild;\n\n while (child) {\n if (child === parents[1]) {\n deepestZone = dropzone;\n index = i;\n deepestZoneParents = [];\n\n break;\n }\n else if (child === parents[2]) {\n break;\n }\n\n child = child.previousSibling;\n }\n }\n\n return index;\n },\n\n matchesUpTo: function (element, selector, limit) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) {\n return true;\n }\n\n element = domUtils.parentNode(element);\n\n if (element === limit) {\n return domUtils.matchesSelector(element, selector);\n }\n }\n\n return false;\n },\n\n getActualElement: function (element) {\n return (element instanceof domObjects.SVGElementInstance\n ? element.correspondingUseElement\n : element);\n },\n\n getScrollXY: function (relevantWindow) {\n relevantWindow = relevantWindow || win.window;\n return {\n x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft,\n y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop,\n };\n },\n\n getElementClientRect: function (element) {\n const clientRect = (element instanceof domObjects.SVGElement\n ? element.getBoundingClientRect()\n : element.getClientRects()[0]);\n\n return clientRect && {\n left : clientRect.left,\n right : clientRect.right,\n top : clientRect.top,\n bottom: clientRect.bottom,\n width : clientRect.width || clientRect.right - clientRect.left,\n height: clientRect.height || clientRect.bottom - clientRect.top,\n };\n },\n\n getElementRect: function (element) {\n const clientRect = domUtils.getElementClientRect(element);\n\n if (!browser.isIOS7 && clientRect) {\n const scroll = domUtils.getScrollXY(win.getWindow(element));\n\n clientRect.left += scroll.x;\n clientRect.right += scroll.x;\n clientRect.top += scroll.y;\n clientRect.bottom += scroll.y;\n }\n\n return clientRect;\n },\n\n getPath: function (element) {\n const path = [];\n\n while (element) {\n path.push(element);\n element = domUtils.parentNode(element);\n }\n\n return path;\n },\n\n trySelector: value => {\n if (!is.string(value)) { return false; }\n\n // an exception will be raised if it is invalid\n domObjects.document.querySelector(value);\n return true;\n },\n};\n\nmodule.exports = domUtils;\n","const is = require('./is');\nconst domUtils = require('./domUtils');\nconst pExtend = require('./pointerExtend');\n\nconst { window, getWindow } = require('./window');\nconst { indexOf, contains } = require('./arr');\n\nconst useAttachEvent = ('attachEvent' in window) && !('addEventListener' in window);\nconst addEvent = useAttachEvent? 'attachEvent': 'addEventListener';\nconst removeEvent = useAttachEvent? 'detachEvent': 'removeEventListener';\nconst on = useAttachEvent? 'on': '';\n\nconst elements = [];\nconst targets = [];\nconst attachedListeners = [];\n\n// {\n// type: {\n// selectors: ['selector', ...],\n// contexts : [document, ...],\n// listeners: [[listener, capture, passive], ...]\n// }\n// }\nconst delegatedEvents = {};\n\nconst documents = [];\n\nconst supportsOptions = !useAttachEvent && (() => {\n let supported = false;\n\n window.document.createElement('div').addEventListener('test', null, {\n get capture () { supported = true; },\n });\n\n return supported;\n})();\n\nfunction add (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n let elementIndex = indexOf(elements, element);\n let target = targets[elementIndex];\n\n if (!target) {\n target = {\n events: {},\n typeCount: 0,\n };\n\n elementIndex = elements.push(element) - 1;\n targets.push(target);\n\n attachedListeners.push(useAttachEvent\n ? {\n supplied: [],\n wrapped : [],\n useCount: [],\n }\n : null);\n }\n\n if (!target.events[type]) {\n target.events[type] = [];\n target.typeCount++;\n }\n\n if (!contains(target.events[type], listener)) {\n let ret;\n\n if (useAttachEvent) {\n const { supplied, wrapped, useCount } = attachedListeners[elementIndex];\n const listenerIndex = indexOf(supplied, listener);\n\n const wrappedListener = wrapped[listenerIndex] || function (event) {\n if (!event.immediatePropagationStopped) {\n event.target = event.srcElement;\n event.currentTarget = element;\n\n event.preventDefault = event.preventDefault || preventDef;\n event.stopPropagation = event.stopPropagation || stopProp;\n event.stopImmediatePropagation = event.stopImmediatePropagation || stopImmProp;\n\n if (/mouse|click/.test(event.type)) {\n event.pageX = event.clientX + getWindow(element).document.documentElement.scrollLeft;\n event.pageY = event.clientY + getWindow(element).document.documentElement.scrollTop;\n }\n\n listener(event);\n }\n };\n\n ret = element[addEvent](on + type, wrappedListener, !!options.capture);\n\n if (listenerIndex === -1) {\n supplied.push(listener);\n wrapped.push(wrappedListener);\n useCount.push(1);\n }\n else {\n useCount[listenerIndex]++;\n }\n }\n else {\n ret = element[addEvent](type, listener, supportsOptions? options : !!options.capture);\n }\n target.events[type].push(listener);\n\n return ret;\n }\n}\n\nfunction remove (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const elementIndex = indexOf(elements, element);\n const target = targets[elementIndex];\n\n if (!target || !target.events) {\n return;\n }\n\n let wrappedListener = listener;\n let listeners;\n let listenerIndex;\n\n if (useAttachEvent) {\n listeners = attachedListeners[elementIndex];\n listenerIndex = indexOf(listeners.supplied, listener);\n wrappedListener = listeners.wrapped[listenerIndex];\n }\n\n if (type === 'all') {\n for (type in target.events) {\n if (target.events.hasOwnProperty(type)) {\n remove(element, type, 'all');\n }\n }\n return;\n }\n\n if (target.events[type]) {\n const len = target.events[type].length;\n\n if (listener === 'all') {\n for (let i = 0; i < len; i++) {\n remove(element, type, target.events[type][i], options);\n }\n return;\n }\n else {\n for (let i = 0; i < len; i++) {\n if (target.events[type][i] === listener) {\n element[removeEvent](on + type, wrappedListener, supportsOptions? options : !!options.capture);\n target.events[type].splice(i, 1);\n\n if (useAttachEvent && listeners) {\n listeners.useCount[listenerIndex]--;\n if (listeners.useCount[listenerIndex] === 0) {\n listeners.supplied.splice(listenerIndex, 1);\n listeners.wrapped.splice(listenerIndex, 1);\n listeners.useCount.splice(listenerIndex, 1);\n }\n }\n\n break;\n }\n }\n }\n\n if (target.events[type] && target.events[type].length === 0) {\n target.events[type] = null;\n target.typeCount--;\n }\n }\n\n if (!target.typeCount) {\n targets.splice(elementIndex, 1);\n elements.splice(elementIndex, 1);\n attachedListeners.splice(elementIndex, 1);\n }\n}\n\nfunction addDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n if (!delegatedEvents[type]) {\n delegatedEvents[type] = {\n selectors: [],\n contexts : [],\n listeners: [],\n };\n\n // add delegate listener functions\n for (let i = 0; i < documents.length; i++) {\n add(documents[i], type, delegateListener);\n add(documents[i], type, delegateUseCapture, true);\n }\n }\n\n const delegated = delegatedEvents[type];\n let index;\n\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n break;\n }\n }\n\n if (index === -1) {\n index = delegated.selectors.length;\n\n delegated.selectors.push(selector);\n delegated.contexts .push(context);\n delegated.listeners.push([]);\n }\n\n // keep listener and capture and passive flags\n delegated.listeners[index].push([listener, !!options.capture, options.passive]);\n}\n\nfunction removeDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const delegated = delegatedEvents[type];\n let matchFound = false;\n let index;\n\n if (!delegated) { return; }\n\n // count from last index of delegated to 0\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n // look for matching selector and context Node\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n\n const listeners = delegated.listeners[index];\n\n // each item of the listeners array is an array: [function, capture, passive]\n for (let i = listeners.length - 1; i >= 0; i--) {\n const [fn, capture, passive] = listeners[i];\n\n // check if the listener functions and capture and passive flags match\n if (fn === listener && capture === !!options.capture && passive === options.passive) {\n // remove the listener from the array of listeners\n listeners.splice(i, 1);\n\n // if all listeners for this interactable have been removed\n // remove the interactable from the delegated arrays\n if (!listeners.length) {\n delegated.selectors.splice(index, 1);\n delegated.contexts .splice(index, 1);\n delegated.listeners.splice(index, 1);\n\n // remove delegate function from context\n remove(context, type, delegateListener);\n remove(context, type, delegateUseCapture, true);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegatedEvents[type] = null;\n }\n }\n\n // only remove one listener\n matchFound = true;\n break;\n }\n }\n\n if (matchFound) { break; }\n }\n }\n}\n\n// bound to the interactable context when a DOM event\n// listener is added to a selector interactable\nfunction delegateListener (event, optionalArg) {\n const options = getOptions(optionalArg);\n const fakeEvent = {};\n const delegated = delegatedEvents[event.type];\n const eventTarget = (domUtils.getActualElement(event.path\n ? event.path[0]\n : event.target));\n let element = eventTarget;\n\n // duplicate the event so that currentTarget can be changed\n pExtend(fakeEvent, event);\n\n fakeEvent.originalEvent = event;\n fakeEvent.preventDefault = preventOriginalDefault;\n\n // climb up document tree looking for selector matches\n while (is.element(element)) {\n for (let i = 0; i < delegated.selectors.length; i++) {\n const selector = delegated.selectors[i];\n const context = delegated.contexts[i];\n\n if (domUtils.matchesSelector(element, selector)\n && domUtils.nodeContains(context, eventTarget)\n && domUtils.nodeContains(context, element)) {\n\n const listeners = delegated.listeners[i];\n\n fakeEvent.currentTarget = element;\n\n for (let j = 0; j < listeners.length; j++) {\n const [fn, capture, passive] = listeners[j];\n\n if (capture === !!options.capture && passive === options.passive) {\n fn(fakeEvent);\n }\n }\n }\n }\n\n element = domUtils.parentNode(element);\n }\n}\n\nfunction delegateUseCapture (event) {\n return delegateListener.call(this, event, true);\n}\n\nfunction preventDef () {\n this.returnValue = false;\n}\n\nfunction preventOriginalDefault () {\n this.originalEvent.preventDefault();\n}\n\nfunction stopProp () {\n this.cancelBubble = true;\n}\n\nfunction stopImmProp () {\n this.cancelBubble = true;\n this.immediatePropagationStopped = true;\n}\n\nfunction getOptions (param) {\n return is.object(param)? param : { capture: param };\n}\n\nmodule.exports = {\n add,\n remove,\n\n addDelegate,\n removeDelegate,\n\n delegateListener,\n delegateUseCapture,\n delegatedEvents,\n documents,\n\n useAttachEvent,\n supportsOptions,\n\n _elements: elements,\n _targets: targets,\n _attachedListeners: attachedListeners,\n};\n","module.exports = function extend (dest, source) {\n for (const prop in source) {\n dest[prop] = source[prop];\n }\n return dest;\n};\n","const {\n resolveRectLike,\n rectToXY,\n} = require('./rect');\n\nmodule.exports = function (target, element, action) {\n const actionOptions = target.options[action];\n const actionOrigin = actionOptions && actionOptions.origin;\n const origin = actionOrigin || target.options.origin;\n\n const originRect = resolveRectLike(origin, target, element, [target && element]);\n\n return rectToXY(originRect) || { x: 0, y: 0 };\n};\n","module.exports = (x, y) => Math.sqrt(x * x + y * y);\n","const extend = require('./extend');\nconst win = require('./window');\n\nconst utils = {\n warnOnce: function (method, message) {\n let warned = false;\n\n return function () {\n if (!warned) {\n win.window.console.warn(message);\n warned = true;\n }\n\n return method.apply(this, arguments);\n };\n },\n\n // http://stackoverflow.com/a/5634528/2280888\n _getQBezierValue: function (t, p1, p2, p3) {\n const iT = 1 - t;\n return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3;\n },\n\n getQuadraticCurvePoint: function (startX, startY, cpX, cpY, endX, endY, position) {\n return {\n x: utils._getQBezierValue(position, startX, cpX, endX),\n y: utils._getQBezierValue(position, startY, cpY, endY),\n };\n },\n\n // http://gizma.com/easing/\n easeOutQuad: function (t, b, c, d) {\n t /= d;\n return -c * t*(t-2) + b;\n },\n\n copyAction: function (dest, src) {\n dest.name = src.name;\n dest.axis = src.axis;\n dest.edges = src.edges;\n\n return dest;\n },\n\n is : require('./is'),\n extend : extend,\n hypot : require('./hypot'),\n getOriginXY: require('./getOriginXY'),\n};\n\nextend(utils, require('./arr'));\nextend(utils, require('./domUtils'));\nextend(utils, require('./pointerUtils'));\nextend(utils, require('./rect'));\n\nmodule.exports = utils;\n","const scope = require('../scope');\nconst utils = require('./index');\n\nconst finder = {\n methodOrder: [ 'simulationResume', 'mouseOrPen', 'hasPointer', 'idle' ],\n\n search: function (pointer, eventType, eventTarget) {\n const pointerType = utils.getPointerType(pointer);\n const pointerId = utils.getPointerId(pointer);\n const details = { pointer, pointerId, pointerType, eventType, eventTarget };\n\n for (const method of finder.methodOrder) {\n const interaction = finder[method](details);\n\n if (interaction) {\n return interaction;\n }\n }\n },\n\n // try to resume simulation with a new pointer\n simulationResume: function ({ pointerType, eventType, eventTarget }) {\n if (!/down|start/i.test(eventType)) {\n return null;\n }\n\n for (const interaction of scope.interactions) {\n let element = eventTarget;\n\n if (interaction.simulation && interaction.simulation.allowResume\n && (interaction.pointerType === pointerType)) {\n while (element) {\n // if the element is the interaction element\n if (element === interaction.element) {\n return interaction;\n }\n element = utils.parentNode(element);\n }\n }\n }\n\n return null;\n },\n\n // if it's a mouse or pen interaction\n mouseOrPen: function ({ pointerId, pointerType, eventType }) {\n if (pointerType !== 'mouse' && pointerType !== 'pen') {\n return null;\n }\n\n let firstNonActive;\n\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType) {\n // if it's a down event, skip interactions with running simulations\n if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; }\n\n // if the interaction is active, return it immediately\n if (interaction.interacting()) {\n return interaction;\n }\n // otherwise save it and look for another active interaction\n else if (!firstNonActive) {\n firstNonActive = interaction;\n }\n }\n }\n\n // if no active mouse interaction was found use the first inactive mouse\n // interaction\n if (firstNonActive) {\n return firstNonActive;\n }\n\n // find any mouse or pen interaction.\n // ignore the interaction if the eventType is a *down, and a simulation\n // is active\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType && !(/down/i.test(eventType) && interaction.simulation)) {\n return interaction;\n }\n }\n\n return null;\n },\n\n // get interaction that has this pointer\n hasPointer: function ({ pointerId }) {\n for (const interaction of scope.interactions) {\n if (utils.contains(interaction.pointerIds, pointerId)) {\n return interaction;\n }\n }\n },\n\n // get first idle interaction with a matching pointerType\n idle: function ({ pointerType }) {\n for (const interaction of scope.interactions) {\n // if there's already a pointer held down\n if (interaction.pointerIds.length === 1) {\n const target = interaction.target;\n // don't add this pointer if there is a target interactable and it\n // isn't gesturable\n if (target && !target.options.gesture.enabled) {\n continue;\n }\n }\n // maximum of 2 pointers per interaction\n else if (interaction.pointerIds.length >= 2) {\n continue;\n }\n\n if (!interaction.interacting() && (pointerType === interaction.pointerType)) {\n return interaction;\n }\n }\n\n return null;\n },\n};\n\nmodule.exports = finder;\n","const win = require('./window');\nconst isWindow = require('./isWindow');\n\nconst is = {\n array : () => {},\n\n window : thing => thing === win.window || isWindow(thing),\n\n docFrag : thing => is.object(thing) && thing.nodeType === 11,\n\n object : thing => !!thing && (typeof thing === 'object'),\n\n function: thing => typeof thing === 'function',\n\n number : thing => typeof thing === 'number' ,\n\n bool : thing => typeof thing === 'boolean' ,\n\n string : thing => typeof thing === 'string' ,\n\n element: thing => {\n if (!thing || (typeof thing !== 'object')) { return false; }\n\n const _window = win.getWindow(thing) || win.window;\n\n return (/object|function/.test(typeof _window.Element)\n ? thing instanceof _window.Element //DOM2\n : thing.nodeType === 1 && typeof thing.nodeName === 'string');\n },\n};\n\nis.array = thing => (is.object(thing)\n && (typeof thing.length !== 'undefined')\n && is.function(thing.splice));\n\nmodule.exports = is;\n","module.exports = (thing) => !!(thing && thing.Window) && (thing instanceof thing.Window);\n","function pointerExtend (dest, source) {\n for (const prop in source) {\n const prefixedPropREs = module.exports.prefixedPropREs;\n let deprecated = false;\n\n // skip deprecated prefixed properties\n for (const vendor in prefixedPropREs) {\n if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) {\n deprecated = true;\n break;\n }\n }\n\n if (!deprecated && typeof source[prop] !== 'function') {\n dest[prop] = source[prop];\n }\n }\n return dest;\n}\n\npointerExtend.prefixedPropREs = {\n webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/,\n};\n\nmodule.exports = pointerExtend;\n","const hypot = require('./hypot');\nconst browser = require('./browser');\nconst dom = require('./domObjects');\nconst domUtils = require('./domUtils');\nconst domObjects = require('./domObjects');\nconst is = require('./is');\nconst pointerExtend = require('./pointerExtend');\n\nconst pointerUtils = {\n copyCoords: function (dest, src) {\n dest.page = dest.page || {};\n dest.page.x = src.page.x;\n dest.page.y = src.page.y;\n\n dest.client = dest.client || {};\n dest.client.x = src.client.x;\n dest.client.y = src.client.y;\n\n dest.timeStamp = src.timeStamp;\n },\n\n setCoordDeltas: function (targetObj, prev, cur) {\n targetObj.page.x = cur.page.x - prev.page.x;\n targetObj.page.y = cur.page.y - prev.page.y;\n targetObj.client.x = cur.client.x - prev.client.x;\n targetObj.client.y = cur.client.y - prev.client.y;\n targetObj.timeStamp = cur.timeStamp - prev.timeStamp;\n\n // set pointer velocity\n const dt = Math.max(targetObj.timeStamp / 1000, 0.001);\n\n targetObj.page.speed = hypot(targetObj.page.x, targetObj.page.y) / dt;\n targetObj.page.vx = targetObj.page.x / dt;\n targetObj.page.vy = targetObj.page.y / dt;\n\n targetObj.client.speed = hypot(targetObj.client.x, targetObj.page.y) / dt;\n targetObj.client.vx = targetObj.client.x / dt;\n targetObj.client.vy = targetObj.client.y / dt;\n },\n\n isNativePointer: function (pointer) {\n return (pointer instanceof dom.Event || pointer instanceof dom.Touch);\n },\n\n // Get specified X/Y coords for mouse or event.touches[0]\n getXY: function (type, pointer, xy) {\n xy = xy || {};\n type = type || 'page';\n\n xy.x = pointer[type + 'X'];\n xy.y = pointer[type + 'Y'];\n\n return xy;\n },\n\n getPageXY: function (pointer, page) {\n page = page || {};\n\n // Opera Mobile handles the viewport and scrolling oddly\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n pointerUtils.getXY('screen', pointer, page);\n\n page.x += window.scrollX;\n page.y += window.scrollY;\n }\n else {\n pointerUtils.getXY('page', pointer, page);\n }\n\n return page;\n },\n\n getClientXY: function (pointer, client) {\n client = client || {};\n\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n // Opera Mobile handles the viewport and scrolling oddly\n pointerUtils.getXY('screen', pointer, client);\n }\n else {\n pointerUtils.getXY('client', pointer, client);\n }\n\n return client;\n },\n\n getPointerId: function (pointer) {\n return is.number(pointer.pointerId)? pointer.pointerId : pointer.identifier;\n },\n\n setCoords: function (targetObj, pointers, timeStamp) {\n const pointer = (pointers.length > 1\n ? pointerUtils.pointerAverage(pointers)\n : pointers[0]);\n\n const tmpXY = {};\n\n pointerUtils.getPageXY(pointer, tmpXY);\n targetObj.page.x = tmpXY.x;\n targetObj.page.y = tmpXY.y;\n\n pointerUtils.getClientXY(pointer, tmpXY);\n targetObj.client.x = tmpXY.x;\n targetObj.client.y = tmpXY.y;\n\n targetObj.timeStamp = is.number(timeStamp) ? timeStamp :new Date().getTime();\n },\n\n pointerExtend: pointerExtend,\n\n getTouchPair: function (event) {\n const touches = [];\n\n // array of touches is supplied\n if (is.array(event)) {\n touches[0] = event[0];\n touches[1] = event[1];\n }\n // an event\n else {\n if (event.type === 'touchend') {\n if (event.touches.length === 1) {\n touches[0] = event.touches[0];\n touches[1] = event.changedTouches[0];\n }\n else if (event.touches.length === 0) {\n touches[0] = event.changedTouches[0];\n touches[1] = event.changedTouches[1];\n }\n }\n else {\n touches[0] = event.touches[0];\n touches[1] = event.touches[1];\n }\n }\n\n return touches;\n },\n\n pointerAverage: function (pointers) {\n const average = {\n pageX : 0,\n pageY : 0,\n clientX: 0,\n clientY: 0,\n screenX: 0,\n screenY: 0,\n };\n\n for (const pointer of pointers) {\n for (const prop in average) {\n average[prop] += pointer[prop];\n }\n }\n for (const prop in average) {\n average[prop] /= pointers.length;\n }\n\n return average;\n },\n\n touchBBox: function (event) {\n if (!event.length && !(event.touches && event.touches.length > 1)) {\n return;\n }\n\n const touches = pointerUtils.getTouchPair(event);\n const minX = Math.min(touches[0].pageX, touches[1].pageX);\n const minY = Math.min(touches[0].pageY, touches[1].pageY);\n const maxX = Math.max(touches[0].pageX, touches[1].pageX);\n const maxY = Math.max(touches[0].pageY, touches[1].pageY);\n\n return {\n x: minX,\n y: minY,\n left: minX,\n top: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n },\n\n touchDistance: function (event, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n\n\n const dx = touches[0][sourceX] - touches[1][sourceX];\n const dy = touches[0][sourceY] - touches[1][sourceY];\n\n return hypot(dx, dy);\n },\n\n touchAngle: function (event, prevAngle, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n const dx = touches[1][sourceX] - touches[0][sourceX];\n const dy = touches[1][sourceY] - touches[0][sourceY];\n const angle = 180 * Math.atan2(dy , dx) / Math.PI;\n\n return angle;\n },\n\n getPointerType: function (pointer) {\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : is.number(pointer.pointerType)\n ? [undefined, undefined,'touch', 'pen', 'mouse'][pointer.pointerType]\n // if the PointerEvent API isn't available, then the \"pointer\" must\n // be either a MouseEvent, TouchEvent, or Touch object\n : /touch/.test(pointer.type) || pointer instanceof domObjects.Touch\n ? 'touch'\n : 'mouse';\n },\n\n // [ event.target, event.currentTarget ]\n getEventTargets: function (event) {\n return [\n domUtils.getActualElement(event.path ? event.path[0] : event.target),\n domUtils.getActualElement(event.currentTarget),\n ];\n },\n};\n\nmodule.exports = pointerUtils;\n","const { window } = require('./window');\n\nconst vendors = ['ms', 'moz', 'webkit', 'o'];\nlet lastTime = 0;\nlet request;\nlet cancel;\n\nfor (let x = 0; x < vendors.length && !window.requestAnimationFrame; x++) {\n request = window[vendors[x] + 'RequestAnimationFrame'];\n cancel = window[vendors[x] +'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n}\n\nif (!request) {\n request = function (callback) {\n const currTime = new Date().getTime();\n const timeToCall = Math.max(0, 16 - (currTime - lastTime));\n const id = setTimeout(function () { callback(currTime + timeToCall); },\n timeToCall);\n\n lastTime = currTime + timeToCall;\n return id;\n };\n}\n\nif (!cancel) {\n cancel = function (id) {\n clearTimeout(id);\n };\n}\n\nmodule.exports = {\n request,\n cancel,\n};\n","const extend = require('./extend');\nconst is = require('./is');\nconst {\n closest,\n parentNode,\n getElementRect,\n} = require('./domUtils');\n\nconst rectUtils = {\n getStringOptionResult: function (value, interactable, element) {\n if (!is.string(value)) {\n return null;\n }\n\n if (value === 'parent') {\n value = parentNode(element);\n }\n else if (value === 'self') {\n value = interactable.getRect(element);\n }\n else {\n value = closest(element, value);\n }\n\n return value;\n },\n\n resolveRectLike: function (value, interactable, element, functionArgs) {\n value = rectUtils.getStringOptionResult(value, interactable, element) || value;\n\n if (is.function(value)) {\n value = value.apply(null, functionArgs);\n }\n\n if (is.element(value)) {\n value = getElementRect(value);\n }\n\n return value;\n },\n\n rectToXY: function (rect) {\n return rect && {\n x: 'x' in rect ? rect.x : rect.left,\n y: 'y' in rect ? rect.y : rect.top,\n };\n },\n\n xywhToTlbr: function (rect) {\n if (rect && !('left' in rect && 'top' in rect)) {\n rect = extend({}, rect);\n\n rect.left = rect.x || 0;\n rect.top = rect.y || 0;\n rect.right = rect.right || (rect.left + rect.width);\n rect.bottom = rect.bottom || (rect.top + rect.height);\n }\n\n return rect;\n },\n\n tlbrToXywh: function (rect) {\n if (rect && !('x' in rect && 'y' in rect)) {\n rect = extend({}, rect);\n\n rect.x = rect.left || 0;\n rect.top = rect.top || 0;\n rect.width = rect.width || (rect.right - rect.x);\n rect.height = rect.height || (rect.bottom - rect.y);\n }\n\n return rect;\n },\n};\n\nmodule.exports = rectUtils;\n","const win = module.exports;\nconst isWindow = require('./isWindow');\n\nfunction init (window) {\n // get wrapped window if using Shadow DOM polyfill\n\n win.realWindow = window;\n\n // create a TextNode\n const el = window.document.createTextNode('');\n\n // check if it's wrapped by a polyfill\n if (el.ownerDocument !== window.document\n && typeof window.wrap === 'function'\n && window.wrap(el) === el) {\n // use wrapped window\n window = window.wrap(window);\n }\n\n win.window = window;\n}\n\nif (typeof window === 'undefined') {\n win.window = undefined;\n win.realWindow = undefined;\n}\nelse {\n init(window);\n}\n\nwin.getWindow = function getWindow (node) {\n if (isWindow(node)) {\n return node;\n }\n\n const rootNode = (node.ownerDocument || node);\n\n return rootNode.defaultView || rootNode.parentWindow || win.window;\n};\n\nwin.init = init;\n"]} \ No newline at end of file diff --git a/package.json b/package.json index 76f3e9969..f39704e99 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "interactjs", - "version": "1.3.0-alpha.3+sha.9595c40", + "version": "1.3.0-alpha.4+sha.7970416", "repository": { "type": "git", "url": "https://github.com/taye/interact.js.git"
- interact(element)⚓➭ + interact(element)⚓➭ @@ -1821,7 +1821,7 @@ Usage - interact.isSet(element)⚓➭ + interact.isSet(element)⚓➭ @@ -1881,7 +1881,7 @@ Parameters - interact.on(type, listener, [options])⚓➭ + interact.on(type, listener, [options])⚓➭ @@ -1948,7 +1948,7 @@ Parameters - interact.off(type, listener, [options])⚓➭ + interact.off(type, listener, [options])⚓➭ @@ -2014,7 +2014,7 @@ Parameters - interact.debug()⚓➭ + interact.debug()⚓➭ @@ -2056,7 +2056,7 @@ interact.debug() - interact.supportsTouch()⚓➭ + interact.supportsTouch()⚓➭ @@ -2097,7 +2097,7 @@ interact.supportsTouch() - interact.supportsPointerEvent()⚓➭ + interact.supportsPointerEvent()⚓➭ @@ -2138,7 +2138,7 @@ interact.supportsPointerEvent() - interact.stop(event)⚓➭ + interact.stop(event)⚓➭ @@ -2198,7 +2198,7 @@ Parameters - interact.pointerMoveTolerance([newValue])⚓➭ + interact.pointerMoveTolerance([newValue])⚓➭ @@ -2261,7 +2261,7 @@ Parameters - Interaction.start(action, target, element)⚓➭ + Interaction.start(action, target, element)⚓➭ @@ -2356,7 +2356,7 @@ Parameters - Interaction.doMove()⚓➭ + Interaction.doMove()⚓➭ @@ -2403,7 +2403,7 @@ Interaction.doMove() - Interaction.end([event])⚓➭ + Interaction.end([event])⚓➭ diff --git a/dist/interact.js b/dist/interact.js index e8ae35c3b..c78a3c751 100644 --- a/dist/interact.js +++ b/dist/interact.js @@ -1,5 +1,5 @@ /** - * interact.js v1.3.0-alpha.3+sha.9595c40 + * interact.js v1.3.0-alpha.4+sha.7970416-dirty * * Copyright (c) 2012-2017 Taye Adeyemi * Open source under the MIT License. @@ -816,6 +816,7 @@ var scope = require('./scope'); var utils = require('./utils'); var events = require('./utils/events'); var browser = require('./utils/browser'); +var domObjects = require('./utils/domObjects'); var finder = require('./utils/interactionFinder'); var signals = require('./utils/Signals').new(); @@ -829,7 +830,9 @@ var prevTouchTime = 0; scope.interactions = []; var Interaction = function () { - function Interaction() { + function Interaction(_ref) { + var pointerType = _ref.pointerType; + _classCallCheck(this, Interaction); this.target = null; // current interactable being interacted with @@ -886,7 +889,7 @@ var Interaction = function () { this.pointerWasMoved = false; this._interacting = false; - this.mouse = false; + this.pointerType = pointerType; signals.fire('new', this); @@ -1130,6 +1133,11 @@ var Interaction = function () { }; Interaction.prototype.getPointerIndex = function getPointerIndex(pointer) { + // mouse and pen interactions may have only one pointer + if (this.pointerType === 'mouse' || this.pointerType === 'pen') { + return 0; + } + return utils.indexOf(this.pointerIds, utils.getPointerId(pointer)); }; @@ -1161,8 +1169,7 @@ var Interaction = function () { }; Interaction.prototype.removePointer = function removePointer(pointer, event) { - var id = utils.getPointerId(pointer); - var index = this.mouse ? 0 : utils.indexOf(this.pointerIds, id); + var index = this.getPointerIndex(pointer); if (index === -1) { return; @@ -1197,6 +1204,8 @@ for (var i = 0, len = methodNames.length; i < len; i++) { function doOnInteractions(method) { return function (event) { + var pointerType = utils.getPointerType(event); + var _utils$getEventTarget = utils.getEventTargets(event), eventTarget = _utils$getEventTarget[0], curEventTarget = _utils$getEventTarget[1]; @@ -1210,7 +1219,7 @@ function doOnInteractions(method) { var pointer = event.changedTouches[_i]; var interaction = finder.search(pointer, event.type, eventTarget); - matches.push([pointer, interaction || new Interaction()]); + matches.push([pointer, interaction || new Interaction({ pointerType: pointerType })]); } } else { var invalidPointer = false; @@ -1218,7 +1227,7 @@ function doOnInteractions(method) { if (!browser.supportsPointerEvent && /mouse/.test(event.type)) { // ignore mouse events while touch interactions are active for (var _i2 = 0; _i2 < scope.interactions.length && !invalidPointer; _i2++) { - invalidPointer = !scope.interactions[_i2].mouse && scope.interactions[_i2].pointerIsDown; + invalidPointer = scope.interactions[_i2].pointerType !== 'mouse' && scope.interactions[_i2].pointerIsDown; } // try to ignore mouse events that are simulated by the browser @@ -1232,11 +1241,7 @@ function doOnInteractions(method) { var _interaction = finder.search(event, event.type, eventTarget); if (!_interaction) { - - _interaction = new Interaction(); - _interaction.mouse = /mouse/i.test(event.pointerType || event.type) - // MSPointerEvent.MSPOINTER_TYPE_MOUSE - || event.pointerType === 4 || !event.pointerType; + _interaction = new Interaction({ pointerType: pointerType }); } matches.push([event, _interaction]); @@ -1244,20 +1249,20 @@ function doOnInteractions(method) { } for (var _iterator = matches, _isArray = Array.isArray(_iterator), _i3 = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { - var _ref; + var _ref2; if (_isArray) { if (_i3 >= _iterator.length) break; - _ref = _iterator[_i3++]; + _ref2 = _iterator[_i3++]; } else { _i3 = _iterator.next(); if (_i3.done) break; - _ref = _i3.value; + _ref2 = _i3.value; } - var _ref2 = _ref, - _pointer = _ref2[0], - _interaction2 = _ref2[1]; + var _ref3 = _ref2, + _pointer = _ref3[0], + _interaction2 = _ref3[1]; _interaction2._updateEventTargets(eventTarget, curEventTarget); _interaction2[method](_pointer, event, eventTarget, curEventTarget); @@ -1277,7 +1282,7 @@ function endAll(event) { var docEvents = {/* 'eventType': listenerFunc */}; var pEventTypes = browser.pEventTypes; -if (scope.PointerEvent) { +if (domObjects.PointerEvent) { docEvents[pEventTypes.down] = listeners.pointerDown; docEvents[pEventTypes.move] = listeners.pointerMove; docEvents[pEventTypes.up] = listeners.pointerUp; @@ -1295,8 +1300,8 @@ if (scope.PointerEvent) { docEvents.blur = endAll; -function onDocSignal(_ref3, signalName) { - var doc = _ref3.doc; +function onDocSignal(_ref4, signalName) { + var doc = _ref4.doc; var eventMethod = signalName.indexOf('add') === 0 ? events.add : events.remove; @@ -1311,14 +1316,14 @@ function onDocSignal(_ref3, signalName) { } } -signals.on('update-pointer-down', function (_ref4) { - var interaction = _ref4.interaction, - pointer = _ref4.pointer, - pointerId = _ref4.pointerId, - pointerIndex = _ref4.pointerIndex, - event = _ref4.event, - eventTarget = _ref4.eventTarget, - down = _ref4.down; +signals.on('update-pointer-down', function (_ref5) { + var interaction = _ref5.interaction, + pointer = _ref5.pointer, + pointerId = _ref5.pointerId, + pointerIndex = _ref5.pointerIndex, + event = _ref5.event, + eventTarget = _ref5.eventTarget, + down = _ref5.down; interaction.pointerIds[pointerIndex] = pointerId; interaction.pointers[pointerIndex] = pointer; @@ -1355,7 +1360,7 @@ scope.endAllInteractions = endAll; module.exports = Interaction; -},{"./scope":34,"./utils":44,"./utils/Signals":35,"./utils/browser":37,"./utils/events":40,"./utils/interactionFinder":45}],6:[function(require,module,exports){ +},{"./scope":34,"./utils":44,"./utils/Signals":35,"./utils/browser":37,"./utils/domObjects":38,"./utils/events":40,"./utils/interactionFinder":45}],6:[function(require,module,exports){ 'use strict'; var Interaction = require('../Interaction'); @@ -5460,7 +5465,7 @@ module.exports = function () { this.originalEvent = event; this.type = type; this.pointerId = pointerUtils.getPointerId(pointer); - this.pointerType = pointerUtils.getPointerType(pointer, interaction); + this.pointerType = pointerUtils.getPointerType(pointer); this.target = eventTarget; this.currentTarget = null; @@ -5758,8 +5763,10 @@ Interaction.signals.on('down', function (_ref6) { timer.duration = minDuration; timer.timeout = setTimeout(function () { fire({ - interaction: interaction, eventCopy: eventCopy, eventTarget: eventTarget, + interaction: interaction, + eventTarget: eventTarget, pointer: browser.isIE8 ? eventCopy : pointer, + event: eventCopy, type: 'hold' }); }, minDuration); @@ -6946,17 +6953,14 @@ module.exports = utils; var scope = require('../scope'); var utils = require('./index'); -var browser = require('./browser'); var finder = { - methodOrder: ['simulationResume', 'mouse', 'hasPointer', 'idle'], + methodOrder: ['simulationResume', 'mouseOrPen', 'hasPointer', 'idle'], search: function search(pointer, eventType, eventTarget) { - var mouseEvent = /mouse/i.test(pointer.pointerType || eventType) - // MSPointerEvent.MSPOINTER_TYPE_MOUSE - || pointer.pointerType === 4; + var pointerType = utils.getPointerType(pointer); var pointerId = utils.getPointerId(pointer); - var details = { pointer: pointer, pointerId: pointerId, mouseEvent: mouseEvent, eventType: eventType, eventTarget: eventTarget }; + var details = { pointer: pointer, pointerId: pointerId, pointerType: pointerType, eventType: eventType, eventTarget: eventTarget }; for (var _iterator = finder.methodOrder, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { var _ref; @@ -6982,7 +6986,7 @@ var finder = { // try to resume simulation with a new pointer simulationResume: function simulationResume(_ref2) { - var mouseEvent = _ref2.mouseEvent, + var pointerType = _ref2.pointerType, eventType = _ref2.eventType, eventTarget = _ref2.eventTarget; @@ -7006,7 +7010,7 @@ var finder = { var element = eventTarget; - if (interaction.simulation && interaction.simulation.allowResume && interaction.mouse === mouseEvent) { + if (interaction.simulation && interaction.simulation.allowResume && interaction.pointerType === pointerType) { while (element) { // if the element is the interaction element if (element === interaction.element) { @@ -7020,13 +7024,13 @@ var finder = { return null; }, - // if it's a mouse interaction - mouse: function mouse(_ref4) { + // if it's a mouse or pen interaction + mouseOrPen: function mouseOrPen(_ref4) { var pointerId = _ref4.pointerId, - mouseEvent = _ref4.mouseEvent, + pointerType = _ref4.pointerType, eventType = _ref4.eventType; - if (!mouseEvent && (browser.supportsTouch || browser.supportsPointerEvent)) { + if (pointerType !== 'mouse' && pointerType !== 'pen') { return null; } @@ -7046,7 +7050,7 @@ var finder = { var interaction = _ref5; - if (interaction.mouse) { + if (interaction.pointerType === pointerType) { // if it's a down event, skip interactions with running simulations if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; @@ -7069,8 +7073,8 @@ var finder = { return firstNonActive; } - // Find any interaction specifically for mouse. - // ignore the interaction if the eventType is a mousedown, and a simulation + // find any mouse or pen interaction. + // ignore the interaction if the eventType is a *down, and a simulation // is active for (var _iterator4 = scope.interactions, _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) { var _ref6; @@ -7086,7 +7090,7 @@ var finder = { var _interaction = _ref6; - if (_interaction.mouse && !(/down/.test(eventType) && _interaction.simulation)) { + if (_interaction.pointerType === pointerType && !(/down/i.test(eventType) && _interaction.simulation)) { return _interaction; } } @@ -7118,9 +7122,9 @@ var finder = { } }, - // get first idle interaction + // get first idle interaction with a matching pointerType idle: function idle(_ref9) { - var mouseEvent = _ref9.mouseEvent; + var pointerType = _ref9.pointerType; for (var _iterator6 = scope.interactions, _isArray6 = Array.isArray(_iterator6), _i6 = 0, _iterator6 = _isArray6 ? _iterator6 : _iterator6[Symbol.iterator]();;) { var _ref10; @@ -7150,7 +7154,7 @@ var finder = { continue; } - if (!interaction.interacting() && mouseEvent === interaction.mouse) { + if (!interaction.interacting() && pointerType === interaction.pointerType) { return interaction; } } @@ -7161,7 +7165,7 @@ var finder = { module.exports = finder; -},{"../scope":34,"./browser":37,"./index":44}],46:[function(require,module,exports){ +},{"../scope":34,"./index":44}],46:[function(require,module,exports){ 'use strict'; var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; @@ -7262,6 +7266,7 @@ var hypot = require('./hypot'); var browser = require('./browser'); var dom = require('./domObjects'); var domUtils = require('./domUtils'); +var domObjects = require('./domObjects'); var is = require('./is'); var pointerExtend = require('./pointerExtend'); @@ -7468,17 +7473,11 @@ var pointerUtils = { return angle; }, - getPointerType: function getPointerType(pointer, interaction) { - // if the PointerEvent API isn't available, then the pointer must be ither - // a MouseEvent or TouchEvent - if (interaction.mouse) { - return 'mouse'; - } - if (!browser.supportsPointerEvent) { - return 'touch'; - } - - return is.string(pointer.pointerType) ? pointer.pointerType : [undefined, undefined, 'touch', 'pen', 'mouse'][pointer.pointerType]; + getPointerType: function getPointerType(pointer) { + return is.string(pointer.pointerType) ? pointer.pointerType : is.number(pointer.pointerType) ? [undefined, undefined, 'touch', 'pen', 'mouse'][pointer.pointerType] + // if the PointerEvent API isn't available, then the "pointer" must + // be either a MouseEvent, TouchEvent, or Touch object + : /touch/.test(pointer.type) || pointer instanceof domObjects.Touch ? 'touch' : 'mouse'; }, // [ event.target, event.currentTarget ] diff --git a/dist/interact.js.map b/dist/interact.js.map index 60832b766..4f3a62ba8 100644 --- a/dist/interact.js.map +++ b/dist/interact.js.map @@ -1 +1 @@ -{"version":3,"sources":["src/header.js","node_modules/browser-pack/_prelude.js","index.js","src/Eventable.js","src/InteractEvent.js","src/Interactable.js","src/Interaction.js","src/actions/base.js","src/actions/drag.js","src/actions/drop.js","src/actions/gesture.js","src/actions/resize.js","src/autoScroll.js","src/autoStart/InteractableMethods.js","src/autoStart/base.js","src/autoStart/delay.js","src/autoStart/drag.js","src/autoStart/gesture.js","src/autoStart/resize.js","src/defaultOptions.js","src/index.js","src/inertia.js","src/interact.js","src/interactablePreventDefault.js","src/legacyBrowsers.js","src/modifiers/index.js","src/modifiers/restrict.js","src/modifiers/restrictEdges.js","src/modifiers/restrictSize.js","src/modifiers/snap.js","src/modifiers/snapSize.js","src/pointerEvents/PointerEvent.js","src/pointerEvents/base.js","src/pointerEvents/holdRepeat.js","src/pointerEvents/interactableTargets.js","src/scope.js","src/utils/Signals.js","src/utils/arr.js","src/utils/browser.js","src/utils/domObjects.js","src/utils/domUtils.js","src/utils/events.js","src/utils/extend.js","src/utils/getOriginXY.js","src/utils/hypot.js","src/utils/index.js","src/utils/interactionFinder.js","src/utils/is.js","src/utils/isWindow.js","src/utils/pointerExtend.js","src/utils/pointerUtils.js","src/utils/raf.js","src/utils/rect.js","src/utils/window.js"],"names":[],"mappings":"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","file":"interact.js","sourceRoot":"","sourcesContent":["/**\n * interact.js v1.3.0-alpha.3+sha.9595c40\n *\n * Copyright (c) 2012-2017 Taye Adeyemi \n * Open source under the MIT License.\n * https://raw.github.com/taye/interact.js/master/LICENSE\n */\n","(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o 150) {\n return null;\n }\n\n let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI;\n const overlap = 22.5;\n\n if (angle < 0) {\n angle += 360;\n }\n\n const left = 135 - overlap <= angle && angle < 225 + overlap;\n const up = 225 - overlap <= angle && angle < 315 + overlap;\n\n const right = !left && (315 - overlap <= angle || angle < 45 + overlap);\n const down = !up && 45 - overlap <= angle && angle < 135 + overlap;\n\n return {\n up,\n down,\n left,\n right,\n angle,\n speed: interaction.prevEvent.speed,\n velocity: {\n x: interaction.prevEvent.velocityX,\n y: interaction.prevEvent.velocityY,\n },\n };\n }\n\n preventDefault () {}\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n}\n\nsignals.on('set-delta', function ({ iEvent, interaction, starting, deltaSource }) {\n const prevEvent = starting? iEvent : interaction.prevEvent;\n\n if (deltaSource === 'client') {\n iEvent.dx = iEvent.clientX - prevEvent.clientX;\n iEvent.dy = iEvent.clientY - prevEvent.clientY;\n }\n else {\n iEvent.dx = iEvent.pageX - prevEvent.pageX;\n iEvent.dy = iEvent.pageY - prevEvent.pageY;\n }\n});\n\nInteractEvent.signals = signals;\n\nmodule.exports = InteractEvent;\n","const is = require('./utils/is');\nconst events = require('./utils/events');\nconst extend = require('./utils/extend');\nconst actions = require('./actions/base');\nconst scope = require('./scope');\nconst Eventable = require('./Eventable');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nconst {\n getElementRect,\n nodeContains,\n trySelector,\n} = require('./utils/domUtils');\nconst { getWindow } = require('./utils/window');\nconst { indexOf, contains } = require('./utils/arr');\nconst { wheelEvent } = require('./utils/browser');\n\n// all set interactables\nscope.interactables = [];\n\n/*\\\n * Interactable\n [ property ]\n **\n * Object type returned by @interact\n\\*/\nclass Interactable {\n constructor (target, options) {\n options = options || {};\n\n this.target = target;\n this.events = new Eventable();\n this._context = options.context || scope.document;\n this._win = getWindow(trySelector(target)? this._context : target);\n this._doc = this._win.document;\n\n signals.fire('new', {\n target,\n options,\n interactable: this,\n win: this._win,\n });\n\n scope.addDocument( this._doc, this._win );\n\n scope.interactables.push(this);\n\n this.set(options);\n }\n\n setOnEvents (action, phases) {\n const onAction = 'on' + action;\n\n if (is.function(phases.onstart) ) { this.events[onAction + 'start' ] = phases.onstart ; }\n if (is.function(phases.onmove) ) { this.events[onAction + 'move' ] = phases.onmove ; }\n if (is.function(phases.onend) ) { this.events[onAction + 'end' ] = phases.onend ; }\n if (is.function(phases.oninertiastart)) { this.events[onAction + 'inertiastart' ] = phases.oninertiastart ; }\n\n return this;\n }\n\n setPerAction (action, options) {\n // for all the default per-action options\n for (const option in options) {\n // if this option exists for this action\n if (option in defaults[action]) {\n // if the option in the options arg is an object value\n if (is.object(options[option])) {\n // duplicate the object\n this.options[action][option] = extend(this.options[action][option] || {}, options[option]);\n\n if (is.object(defaults.perAction[option]) && 'enabled' in defaults.perAction[option]) {\n this.options[action][option].enabled = options[option].enabled === false? false : true;\n }\n }\n else if (is.bool(options[option]) && is.object(defaults.perAction[option])) {\n this.options[action][option].enabled = options[option];\n }\n else if (options[option] !== undefined) {\n // or if it's not undefined, do a plain assignment\n this.options[action][option] = options[option];\n }\n }\n }\n }\n\n /*\\\n * Interactable.getRect\n [ method ]\n *\n * The default function to get an Interactables bounding rect. Can be\n * overridden using @Interactable.rectChecker.\n *\n - element (Element) #optional The element to measure.\n = (object) The object's bounding rectangle.\n o {\n o top : 0,\n o left : 0,\n o bottom: 0,\n o right : 0,\n o width : 0,\n o height: 0\n o }\n \\*/\n getRect (element) {\n element = element || this.target;\n\n if (is.string(this.target) && !(is.element(element))) {\n element = this._context.querySelector(this.target);\n }\n\n return getElementRect(element);\n }\n\n /*\\\n * Interactable.rectChecker\n [ method ]\n *\n * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n - checker (function) #optional A function which returns this Interactable's bounding rectangle. See @Interactable.getRect\n = (function | object) The checker function or this Interactable\n \\*/\n rectChecker (checker) {\n if (is.function(checker)) {\n this.getRect = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.getRect;\n\n return this;\n }\n\n return this.getRect;\n }\n\n _backCompatOption (optionName, newValue) {\n if (trySelector(newValue) || is.object(newValue)) {\n this.options[optionName] = newValue;\n\n for (const action of actions.names) {\n this.options[action][optionName] = newValue;\n }\n\n return this;\n }\n\n return this.options[optionName];\n }\n\n /*\\\n * Interactable.origin\n [ method ]\n *\n * Gets or sets the origin of the Interactable's element. The x and y\n * of the origin will be subtracted from action event coordinates.\n *\n - origin (object | string) #optional An object eg. { x: 0, y: 0 } or string 'parent', 'self' or any CSS selector\n * OR\n - origin (Element) #optional An HTML or SVG Element whose rect will be used\n **\n = (object) The current origin or this Interactable\n \\*/\n origin (newValue) {\n return this._backCompatOption('origin', newValue);\n }\n\n /*\\\n * Interactable.deltaSource\n [ method ]\n *\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n - newValue (string) #optional Use 'client' if you will be scrolling while interacting; Use 'page' if you want autoScroll to work\n = (string | object) The current deltaSource or this Interactable\n \\*/\n deltaSource (newValue) {\n if (newValue === 'page' || newValue === 'client') {\n this.options.deltaSource = newValue;\n\n return this;\n }\n\n return this.options.deltaSource;\n }\n\n /*\\\n * Interactable.context\n [ method ]\n *\n * Gets the selector context Node of the Interactable. The default is `window.document`.\n *\n = (Node) The context Node of this Interactable\n **\n \\*/\n context () {\n return this._context;\n }\n\n inContext (element) {\n return (this._context === element.ownerDocument\n || nodeContains(this._context, element));\n }\n\n /*\\\n * Interactable.fire\n [ method ]\n *\n * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n - iEvent (InteractEvent) The InteractEvent object to be fired on this Interactable\n = (Interactable) this Interactable\n \\*/\n fire (iEvent) {\n this.events.fire(iEvent);\n\n return this;\n }\n\n _onOffMultiple (method, eventType, listener, options) {\n if (is.string(eventType) && eventType.search(' ') !== -1) {\n eventType = eventType.trim().split(/ +/);\n }\n\n if (is.array(eventType)) {\n for (let i = 0; i < eventType.length; i++) {\n this[method](eventType[i], listener, options);\n }\n\n return true;\n }\n\n if (is.object(eventType)) {\n for (const prop in eventType) {\n this[method](prop, eventType[prop], listener);\n }\n\n return true;\n }\n }\n\n /*\\\n * Interactable.on\n [ method ]\n *\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n - eventType (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) This Interactable\n \\*/\n on (eventType, listener, options) {\n if (this._onOffMultiple('on', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.on(eventType, listener);\n }\n // delegated event for selector\n else if (is.string(this.target)) {\n events.addDelegate(this.target, this._context, eventType, listener, options);\n }\n else {\n events.add(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.off\n [ method ]\n *\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n - eventType (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) This Interactable\n \\*/\n off (eventType, listener, options) {\n if (this._onOffMultiple('off', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n // if it is an action event type\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.off(eventType, listener);\n }\n // delegated event\n else if (is.string(this.target)) {\n events.removeDelegate(this.target, this._context, eventType, listener, options);\n }\n // remove listener from this Interatable's element\n else {\n events.remove(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.set\n [ method ]\n *\n * Reset the options of this Interactable\n - options (object) The new settings to apply\n = (object) This Interactable\n \\*/\n set (options) {\n if (!is.object(options)) {\n options = {};\n }\n\n this.options = extend({}, defaults.base);\n\n const perActions = extend({}, defaults.perAction);\n\n for (const actionName in actions.methodDict) {\n const methodName = actions.methodDict[actionName];\n\n this.options[actionName] = extend({}, defaults[actionName]);\n\n this.setPerAction(actionName, perActions);\n\n this[methodName](options[actionName]);\n }\n\n for (const setting of Interactable.settingsMethods) {\n this.options[setting] = defaults.base[setting];\n\n if (setting in options) {\n this[setting](options[setting]);\n }\n }\n\n signals.fire('set', {\n options,\n interactable: this,\n });\n\n return this;\n }\n\n /*\\\n * Interactable.unset\n [ method ]\n *\n * Remove this interactable from the list of interactables and remove\n * it's action capabilities and event listeners\n *\n = (object) @interact\n \\*/\n unset () {\n events.remove(this.target, 'all');\n\n if (is.string(this.target)) {\n // remove delegated events\n for (const type in events.delegatedEvents) {\n const delegated = events.delegatedEvents[type];\n\n if (delegated.selectors[0] === this.target\n && delegated.contexts[0] === this._context) {\n\n delegated.selectors.splice(0, 1);\n delegated.contexts .splice(0, 1);\n delegated.listeners.splice(0, 1);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegated[type] = null;\n }\n }\n\n events.remove(this._context, type, events.delegateListener);\n events.remove(this._context, type, events.delegateUseCapture, true);\n }\n }\n else {\n events.remove(this, 'all');\n }\n\n signals.fire('unset', { interactable: this });\n\n scope.interactables.splice(indexOf(scope.interactables, this), 1);\n\n // Stop related interactions when an Interactable is unset\n for (const interaction of scope.interactions || []) {\n if (interaction.target === this && interaction.interacting()) {\n interaction.stop();\n }\n }\n\n return scope.interact;\n }\n}\n\nscope.interactables.indexOfElement = function indexOfElement (target, context) {\n context = context || scope.document;\n\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n if (interactable.target === target && interactable._context === context) {\n return i;\n }\n }\n return -1;\n};\n\nscope.interactables.get = function interactableGet (element, options, dontCheckInContext) {\n const ret = this[this.indexOfElement(element, options && options.context)];\n\n return ret && (is.string(element) || dontCheckInContext || ret.inContext(element))? ret : null;\n};\n\nscope.interactables.forEachSelector = function (callback, element) {\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n // skip non CSS selector targets and out of context elements\n if (!is.string(interactable.target)\n || (element && !interactable.inContext(element))) {\n continue;\n }\n\n const ret = callback(interactable, interactable.target, interactable._context, i, this);\n\n if (ret !== undefined) {\n return ret;\n }\n }\n};\n\n// all interact.js eventTypes\nInteractable.eventTypes = scope.eventTypes = [];\n\nInteractable.signals = signals;\n\nInteractable.settingsMethods = [ 'deltaSource', 'origin', 'preventDefault', 'rectChecker' ];\n\nmodule.exports = Interactable;\n","const scope = require('./scope');\nconst utils = require('./utils');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst finder = require('./utils/interactionFinder');\nconst signals = require('./utils/Signals').new();\n\nconst listeners = {};\nconst methodNames = [\n 'pointerDown', 'pointerMove', 'pointerUp',\n 'updatePointer', 'removePointer',\n];\n\n// for ignoring browser's simulated mouse events\nlet prevTouchTime = 0;\n\n// all active and idle interactions\nscope.interactions = [];\n\nclass Interaction {\n constructor () {\n this.target = null; // current interactable being interacted with\n this.element = null; // the target element of the interactable\n\n this.prepared = { // action that's ready to be fired on next move event\n name : null,\n axis : null,\n edges: null,\n };\n\n // keep track of added pointers\n this.pointers = [];\n this.pointerIds = [];\n this.downTargets = [];\n this.downTimes = [];\n\n // Previous native pointer move event coordinates\n this.prevCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n // current native pointer move event coordinates\n this.curCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Starting InteractEvent pointer coordinates\n this.startCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Change in coordinates and time of the pointer\n this.pointerDelta = {\n page : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n client : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n timeStamp: 0,\n };\n\n this.downEvent = null; // pointerdown/mousedown/touchstart event\n this.downPointer = {};\n\n this._eventTarget = null;\n this._curEventTarget = null;\n\n this.prevEvent = null; // previous action event\n\n this.pointerIsDown = false;\n this.pointerWasMoved = false;\n this._interacting = false;\n\n this.mouse = false;\n\n signals.fire('new', this);\n\n scope.interactions.push(this);\n }\n\n pointerDown (pointer, event, eventTarget) {\n const pointerIndex = this.updatePointer(pointer, event, true);\n\n signals.fire('down', {\n pointer,\n event,\n eventTarget,\n pointerIndex,\n interaction: this,\n });\n }\n\n /*\\\n * Interaction.start\n [ method ]\n *\n * Start an action with the given Interactable and Element as tartgets. The\n * action must be enabled for the target Interactable and an appropriate number\n * of pointers must be held down - 1 for drag/resize, 2 for gesture.\n *\n * Use it with `interactable.able({ manualStart: false })` to always\n * [start actions manually](https://github.com/taye/interact.js/issues/114)\n *\n - action (object) The action to be performed - drag, resize, etc.\n - target (Interactable) The Interactable to target\n - element (Element) The DOM Element to target\n = (object) interact\n **\n | interact(target)\n | .draggable({\n | // disable the default drag start by down->move\n | manualStart: true\n | })\n | // start dragging after the user holds the pointer down\n | .on('hold', function (event) {\n | var interaction = event.interaction;\n |\n | if (!interaction.interacting()) {\n | interaction.start({ name: 'drag' },\n | event.interactable,\n | event.currentTarget);\n | }\n | });\n \\*/\n start (action, target, element) {\n if (this.interacting()\n || !this.pointerIsDown\n || this.pointerIds.length < (action.name === 'gesture'? 2 : 1)) {\n return;\n }\n\n // if this interaction had been removed after stopping\n // add it back\n if (utils.indexOf(scope.interactions, this) === -1) {\n scope.interactions.push(this);\n }\n\n utils.copyAction(this.prepared, action);\n this.target = target;\n this.element = element;\n\n signals.fire('action-start', {\n interaction: this,\n event: this.downEvent,\n });\n }\n\n pointerMove (pointer, event, eventTarget) {\n if (!this.simulation) {\n this.updatePointer(pointer);\n utils.setCoords(this.curCoords, this.pointers);\n }\n\n const duplicateMove = (this.curCoords.page.x === this.prevCoords.page.x\n && this.curCoords.page.y === this.prevCoords.page.y\n && this.curCoords.client.x === this.prevCoords.client.x\n && this.curCoords.client.y === this.prevCoords.client.y);\n\n let dx;\n let dy;\n\n // register movement greater than pointerMoveTolerance\n if (this.pointerIsDown && !this.pointerWasMoved) {\n dx = this.curCoords.client.x - this.startCoords.client.x;\n dy = this.curCoords.client.y - this.startCoords.client.y;\n\n this.pointerWasMoved = utils.hypot(dx, dy) > Interaction.pointerMoveTolerance;\n }\n\n const signalArg = {\n pointer,\n pointerIndex: this.getPointerIndex(pointer),\n event,\n eventTarget,\n dx,\n dy,\n duplicate: duplicateMove,\n interaction: this,\n interactingBeforeMove: this.interacting(),\n };\n\n if (!duplicateMove) {\n // set pointer coordinate, time changes and speeds\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n }\n\n signals.fire('move', signalArg);\n\n if (!duplicateMove) {\n // if interacting, fire an 'action-move' signal etc\n if (this.interacting()) {\n this.doMove(signalArg);\n }\n\n if (this.pointerWasMoved) {\n utils.copyCoords(this.prevCoords, this.curCoords);\n }\n }\n }\n\n /*\\\n * Interaction.doMove\n [ method ]\n *\n * Force a move of the current action at the same coordinates. Useful if\n * snap/restrict has been changed and you want a movement with the new\n * settings.\n *\n **\n | interact(target)\n | .draggable(true)\n | .on('dragmove', function (event) {\n | if (someCondition) {\n | // change the snap settings\n | event.interactable.draggable({ snap: { targets: [] }});\n | // fire another move event with re-calculated snap\n | event.interaction.doMove();\n | }\n | });\n \\*/\n doMove (signalArg) {\n signalArg = utils.extend({\n pointer: this.pointers[0],\n event: this.prevEvent,\n eventTarget: this._eventTarget,\n interaction: this,\n }, signalArg || {});\n\n signals.fire('before-action-move', signalArg);\n\n if (!this._dontFireMove) {\n signals.fire('action-move', signalArg);\n }\n\n this._dontFireMove = false;\n }\n\n // End interact move events and stop auto-scroll unless simulation is running\n pointerUp (pointer, event, eventTarget, curEventTarget) {\n const pointerIndex = this.getPointerIndex(pointer);\n\n signals.fire(/cancel$/i.test(event.type)? 'cancel' : 'up', {\n pointer,\n pointerIndex,\n event,\n eventTarget,\n curEventTarget,\n interaction: this,\n });\n\n if (!this.simulation) {\n this.end(event);\n }\n\n this.pointerIsDown = false;\n this.removePointer(pointer, event);\n }\n\n /*\\\n * Interaction.end\n [ method ]\n *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n - event (PointerEvent) #optional\n **\n | interact(target)\n | .draggable(true)\n | .on('move', function (event) {\n | if (event.pageX > 1000) {\n | // end the current action\n | event.interaction.end();\n | // stop all further listeners from being called\n | event.stopImmediatePropagation();\n | }\n | });\n \\*/\n end (event) {\n event = event || this.prevEvent;\n\n if (this.interacting()) {\n signals.fire('action-end', {\n event,\n interaction: this,\n });\n }\n\n this.stop();\n }\n\n currentAction () {\n return this._interacting? this.prepared.name: null;\n }\n\n interacting () {\n return this._interacting;\n }\n\n stop () {\n signals.fire('stop', { interaction: this });\n\n if (this._interacting) {\n signals.fire('stop-active', { interaction: this });\n signals.fire('stop-' + this.prepared.name, { interaction: this });\n }\n\n this.target = this.element = null;\n\n this._interacting = false;\n this.prepared.name = this.prevEvent = null;\n }\n\n getPointerIndex (pointer) {\n return utils.indexOf(this.pointerIds, utils.getPointerId(pointer));\n }\n\n updatePointer (pointer, event, down = event && /(down|start)$/i.test(event.type)) {\n const id = utils.getPointerId(pointer);\n let index = this.getPointerIndex(pointer);\n\n if (index === -1) {\n index = this.pointerIds.length;\n this.pointerIds[index] = id;\n }\n\n if (down) {\n signals.fire('update-pointer-down', {\n pointer,\n event,\n down,\n pointerId: id,\n pointerIndex: index,\n interaction: this,\n });\n }\n\n this.pointers[index] = pointer;\n\n return index;\n }\n\n removePointer (pointer, event) {\n const id = utils.getPointerId(pointer);\n const index = this.mouse? 0 : utils.indexOf(this.pointerIds, id);\n\n if (index === -1) { return; }\n\n signals.fire('remove-pointer', {\n pointer,\n event,\n pointerIndex: index,\n interaction: this,\n });\n\n this.pointers .splice(index, 1);\n this.pointerIds .splice(index, 1);\n this.downTargets.splice(index, 1);\n this.downTimes .splice(index, 1);\n }\n\n _updateEventTargets (target, currentTarget) {\n this._eventTarget = target;\n this._curEventTarget = currentTarget;\n }\n}\n\nfor (let i = 0, len = methodNames.length; i < len; i++) {\n const method = methodNames[i];\n\n listeners[method] = doOnInteractions(method);\n}\n\nfunction doOnInteractions (method) {\n return (function (event) {\n const [eventTarget, curEventTarget] = utils.getEventTargets(event);\n const matches = []; // [ [pointer, interaction], ...]\n\n if (browser.supportsTouch && /touch/.test(event.type)) {\n prevTouchTime = new Date().getTime();\n\n for (let i = 0; i < event.changedTouches.length; i++) {\n const pointer = event.changedTouches[i];\n const interaction = finder.search(pointer, event.type, eventTarget);\n\n matches.push([pointer, interaction || new Interaction()]);\n }\n }\n else {\n let invalidPointer = false;\n\n if (!browser.supportsPointerEvent && /mouse/.test(event.type)) {\n // ignore mouse events while touch interactions are active\n for (let i = 0; i < scope.interactions.length && !invalidPointer; i++) {\n invalidPointer = !scope.interactions[i].mouse && scope.interactions[i].pointerIsDown;\n }\n\n // try to ignore mouse events that are simulated by the browser\n // after a touch event\n invalidPointer = invalidPointer\n || (new Date().getTime() - prevTouchTime < 500)\n // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated\n || event.timeStamp === 0;\n }\n\n if (!invalidPointer) {\n let interaction = finder.search(event, event.type, eventTarget);\n\n if (!interaction) {\n\n interaction = new Interaction();\n interaction.mouse = (/mouse/i.test(event.pointerType || event.type)\n // MSPointerEvent.MSPOINTER_TYPE_MOUSE\n || event.pointerType === 4\n || !event.pointerType);\n }\n\n matches.push([event, interaction]);\n }\n }\n\n for (const [pointer, interaction] of matches) {\n interaction._updateEventTargets(eventTarget, curEventTarget);\n interaction[method](pointer, event, eventTarget, curEventTarget);\n }\n });\n}\n\nfunction endAll (event) {\n for (let i = 0; i < scope.interactions.length; i++) {\n const interaction = scope.interactions[i];\n\n interaction.end(event);\n signals.fire('endall', { event, interaction });\n }\n}\n\nconst docEvents = { /* 'eventType': listenerFunc */ };\nconst pEventTypes = browser.pEventTypes;\n\nif (scope.PointerEvent) {\n docEvents[pEventTypes.down ] = listeners.pointerDown;\n docEvents[pEventTypes.move ] = listeners.pointerMove;\n docEvents[pEventTypes.up ] = listeners.pointerUp;\n docEvents[pEventTypes.cancel] = listeners.pointerUp;\n}\nelse {\n docEvents.mousedown = listeners.pointerDown;\n docEvents.mousemove = listeners.pointerMove;\n docEvents.mouseup = listeners.pointerUp;\n\n docEvents.touchstart = listeners.pointerDown;\n docEvents.touchmove = listeners.pointerMove;\n docEvents.touchend = listeners.pointerUp;\n docEvents.touchcancel = listeners.pointerUp;\n}\n\ndocEvents.blur = endAll;\n\nfunction onDocSignal ({ doc }, signalName) {\n const eventMethod = signalName.indexOf('add') === 0\n ? events.add : events.remove;\n\n // delegate event listener\n for (const eventType in scope.delegatedEvents) {\n eventMethod(doc, eventType, events.delegateListener);\n eventMethod(doc, eventType, events.delegateUseCapture, true);\n }\n\n for (const eventType in docEvents) {\n eventMethod(doc, eventType, docEvents[eventType]);\n }\n}\n\nsignals.on('update-pointer-down', ({ interaction, pointer, pointerId, pointerIndex, event, eventTarget, down }) => {\n interaction.pointerIds[pointerIndex] = pointerId;\n interaction.pointers[pointerIndex] = pointer;\n\n if (down) {\n interaction.pointerIsDown = true;\n }\n\n if (!interaction.interacting()) {\n utils.setCoords(interaction.startCoords, interaction.pointers);\n\n utils.copyCoords(interaction.curCoords , interaction.startCoords);\n utils.copyCoords(interaction.prevCoords, interaction.startCoords);\n\n interaction.downEvent = event;\n interaction.downTimes[pointerIndex] = interaction.curCoords.timeStamp;\n interaction.downTargets[pointerIndex] = eventTarget || event && utils.getEventTargets(event)[0];\n interaction.pointerWasMoved = false;\n\n utils.pointerExtend(interaction.downPointer, pointer);\n }\n});\n\nscope.signals.on('add-document' , onDocSignal);\nscope.signals.on('remove-document', onDocSignal);\n\nInteraction.pointerMoveTolerance = 1;\nInteraction.doOnInteractions = doOnInteractions;\nInteraction.endAll = endAll;\nInteraction.signals = signals;\nInteraction.docEvents = docEvents;\n\nscope.endAllInteractions = endAll;\n\nmodule.exports = Interaction;\n","const Interaction = require('../Interaction');\nconst InteractEvent = require('../InteractEvent');\n\nconst actions = {\n firePrepared,\n names: [],\n methodDict: {},\n};\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n interaction._interacting = true;\n firePrepared(interaction, event, 'start');\n});\n\nInteraction.signals.on('action-move', function ({ interaction, event, preEnd }) {\n firePrepared(interaction, event, 'move', preEnd);\n\n // if the action was ended in a listener\n if (!interaction.interacting()) { return false; }\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n firePrepared(interaction, event, 'end');\n});\n\nfunction firePrepared (interaction, event, phase, preEnd) {\n const actionName = interaction.prepared.name;\n\n const newEvent = new InteractEvent(interaction, event, actionName, phase, interaction.element, null, preEnd);\n\n interaction.target.fire(newEvent);\n interaction.prevEvent = newEvent;\n}\n\nmodule.exports = actions;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drag = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n startAxis : 'xy',\n lockAxis : 'xy',\n },\n\n checker: function (pointer, event, interactable) {\n const dragOptions = interactable.options.drag;\n\n return dragOptions.enabled\n ? { name: 'drag', axis: (dragOptions.lockAxis === 'start'\n ? dragOptions.startAxis\n : dragOptions.lockAxis)}\n : null;\n },\n\n getCursor: function () {\n return 'move';\n },\n};\n\nInteraction.signals.on('before-action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n interaction.curCoords.page.y = interaction.startCoords.page.y;\n interaction.curCoords.client.y = interaction.startCoords.client.y;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vx);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vx);\n interaction.pointerDelta.client.vy = 0;\n interaction.pointerDelta.page.vy = 0;\n }\n else if (axis === 'y') {\n interaction.curCoords.page.x = interaction.startCoords.page.x;\n interaction.curCoords.client.x = interaction.startCoords.client.x;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vy);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vy);\n interaction.pointerDelta.client.vx = 0;\n interaction.pointerDelta.page.vx = 0;\n }\n});\n\n// dragmove\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'dragmove') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n iEvent.pageY = interaction.startCoords.page.y;\n iEvent.clientY = interaction.startCoords.client.y;\n iEvent.dy = 0;\n }\n else if (axis === 'y') {\n iEvent.pageX = interaction.startCoords.page.x;\n iEvent.clientX = interaction.startCoords.client.x;\n iEvent.dx = 0;\n }\n});\n\n/*\\\n * Interactable.draggable\n [ method ]\n *\n * Gets or sets whether drag actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of drag events\n | var isDraggable = interact('ul li').draggable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on drag events (object makes the Interactable draggable)\n = (object) This Interactable\n | interact(element).draggable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // the axis in which the first movement must be\n | // for the drag sequence to start\n | // 'xy' by default - any direction\n | startAxis: 'x' || 'y' || 'xy',\n |\n | // 'xy' by default - don't restrict to one axis (move in any direction)\n | // 'x' or 'y' to restrict movement to either axis\n | // 'start' to restrict movement to the axis the drag started in\n | lockAxis: 'x' || 'y' || 'xy' || 'start',\n |\n | // max number of drags that can happen concurrently\n | // with elements of this Interactable. Infinity by default\n | max: Infinity,\n |\n | // max number of drags that can target the same element+Interactable\n | // 1 by default\n | maxPerElement: 2\n | });\n\\*/\nInteractable.prototype.draggable = function (options) {\n if (utils.is.object(options)) {\n this.options.drag.enabled = options.enabled === false? false: true;\n this.setPerAction('drag', options);\n this.setOnEvents('drag', options);\n\n if (/^(xy|x|y|start)$/.test(options.lockAxis)) {\n this.options.drag.lockAxis = options.lockAxis;\n }\n if (/^(xy|x|y)$/.test(options.startAxis)) {\n this.options.drag.startAxis = options.startAxis;\n }\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drag.enabled = options;\n\n if (!options) {\n this.ondragstart = this.ondragstart = this.ondragend = null;\n }\n\n return this;\n }\n\n return this.options.drag;\n};\n\nactions.drag = drag;\nactions.names.push('drag');\nutils.merge(Interactable.eventTypes, [\n 'dragstart',\n 'dragmove',\n 'draginertiastart',\n 'draginertiaresume',\n 'dragend',\n]);\nactions.methodDict.drag = 'draggable';\n\ndefaultOptions.drag = drag.defaults;\n\nmodule.exports = drag;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst scope = require('../scope');\nconst interact = require('../interact');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drop = {\n defaults: {\n enabled: false,\n accept : null,\n overlap: 'pointer',\n },\n};\n\nlet dynamicDrop = false;\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // reset active dropzones\n interaction.activeDrops.dropzones = [];\n interaction.activeDrops.elements = [];\n interaction.activeDrops.rects = [];\n\n interaction.dropEvents = null;\n\n if (!interaction.dynamicDrop) {\n setActiveDrops(interaction, interaction.element);\n }\n\n const dragEvent = interaction.prevEvent;\n const dropEvents = getDropEvents(interaction, event, dragEvent);\n\n if (dropEvents.activate) {\n fireActiveDrops(interaction, dropEvents.activate);\n }\n});\n\nInteractEvent.signals.on('new', function ({ interaction, iEvent, event }) {\n if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { return; }\n\n const draggableElement = interaction.element;\n const dragEvent = iEvent;\n const dropResult = getDrop(dragEvent, event, draggableElement);\n\n interaction.dropTarget = dropResult.dropzone;\n interaction.dropElement = dropResult.element;\n\n interaction.dropEvents = getDropEvents(interaction, event, dragEvent);\n});\n\nInteraction.signals.on('action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n fireDropEvents(interaction, interaction.dropEvents);\n});\n\nInteraction.signals.on('action-end', function ({ interaction }) {\n if (interaction.prepared.name === 'drag') {\n fireDropEvents(interaction, interaction.dropEvents);\n }\n});\n\nInteraction.signals.on('stop-drag', function ({ interaction }) {\n interaction.activeDrops.dropzones =\n interaction.activeDrops.elements =\n interaction.activeDrops.rects =\n interaction.dropEvents = null;\n});\n\nfunction collectDrops (interaction, element) {\n const drops = [];\n const elements = [];\n\n element = element || interaction.element;\n\n // collect all dropzones and their elements which qualify for a drop\n for (const current of scope.interactables) {\n if (!current.options.drop.enabled) { continue; }\n\n const accept = current.options.drop.accept;\n\n // test the draggable element against the dropzone's accept setting\n if ((utils.is.element(accept) && accept !== element)\n || (utils.is.string(accept)\n && !utils.matchesSelector(element, accept))) {\n\n continue;\n }\n\n // query for new elements if necessary\n const dropElements = utils.is.string(current.target)\n ? current._context.querySelectorAll(current.target)\n : [current.target];\n\n for (let i = 0; i < dropElements.length; i++) {\n const currentElement = dropElements[i];\n\n if (currentElement !== element) {\n drops.push(current);\n elements.push(currentElement);\n }\n }\n }\n\n return {\n elements,\n dropzones: drops,\n };\n}\n\nfunction fireActiveDrops (interaction, event) {\n let prevElement;\n\n // loop through all active dropzones and trigger event\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n const current = interaction.activeDrops.dropzones[i];\n const currentElement = interaction.activeDrops.elements [i];\n\n // prevent trigger of duplicate events on same element\n if (currentElement !== prevElement) {\n // set current element as event target\n event.target = currentElement;\n current.fire(event);\n }\n prevElement = currentElement;\n }\n}\n\n// Collect a new set of possible drops and save them in activeDrops.\n// setActiveDrops should always be called when a drag has just started or a\n// drag event happens while dynamicDrop is true\nfunction setActiveDrops (interaction, dragElement) {\n // get dropzones and their elements that could receive the draggable\n const possibleDrops = collectDrops(interaction, dragElement, true);\n\n interaction.activeDrops.dropzones = possibleDrops.dropzones;\n interaction.activeDrops.elements = possibleDrops.elements;\n interaction.activeDrops.rects = [];\n\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n interaction.activeDrops.rects[i] =\n interaction.activeDrops.dropzones[i].getRect(interaction.activeDrops.elements[i]);\n }\n}\n\nfunction getDrop (dragEvent, event, dragElement) {\n const interaction = dragEvent.interaction;\n const validDrops = [];\n\n if (dynamicDrop) {\n setActiveDrops(interaction, dragElement);\n }\n\n // collect all dropzones and their elements which qualify for a drop\n for (let j = 0; j < interaction.activeDrops.dropzones.length; j++) {\n const current = interaction.activeDrops.dropzones[j];\n const currentElement = interaction.activeDrops.elements [j];\n const rect = interaction.activeDrops.rects [j];\n\n validDrops.push(current.dropCheck(dragEvent, event, interaction.target, dragElement, currentElement, rect)\n ? currentElement\n : null);\n }\n\n // get the most appropriate dropzone based on DOM depth and order\n const dropIndex = utils.indexOfDeepestElement(validDrops);\n\n return {\n dropzone: interaction.activeDrops.dropzones[dropIndex] || null,\n element : interaction.activeDrops.elements [dropIndex] || null,\n };\n}\n\nfunction getDropEvents (interaction, pointerEvent, dragEvent) {\n const dropEvents = {\n enter : null,\n leave : null,\n activate : null,\n deactivate: null,\n move : null,\n drop : null,\n };\n\n const tmpl = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n };\n\n if (interaction.dropElement !== interaction.prevDropElement) {\n // if there was a prevDropTarget, create a dragleave event\n if (interaction.prevDropTarget) {\n dropEvents.leave = utils.extend({ type: 'dragleave' }, tmpl);\n\n dragEvent.dragLeave = dropEvents.leave.target = interaction.prevDropElement;\n dragEvent.prevDropzone = dropEvents.leave.dropzone = interaction.prevDropTarget;\n }\n // if the dropTarget is not null, create a dragenter event\n if (interaction.dropTarget) {\n dropEvents.enter = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n type : 'dragenter',\n };\n\n dragEvent.dragEnter = interaction.dropElement;\n dragEvent.dropzone = interaction.dropTarget;\n }\n }\n\n if (dragEvent.type === 'dragend' && interaction.dropTarget) {\n dropEvents.drop = utils.extend({ type: 'drop' }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n dragEvent.relatedTarget = interaction.dropElement;\n }\n if (dragEvent.type === 'dragstart') {\n dropEvents.activate = utils.extend({ type: 'dropactivate' }, tmpl);\n\n dropEvents.activate.target = null;\n dropEvents.activate.dropzone = null;\n }\n if (dragEvent.type === 'dragend') {\n dropEvents.deactivate = utils.extend({ type: 'dropdeactivate' }, tmpl);\n\n dropEvents.deactivate.target = null;\n dropEvents.deactivate.dropzone = null;\n }\n if (dragEvent.type === 'dragmove' && interaction.dropTarget) {\n dropEvents.move = utils.extend({\n dragmove : dragEvent,\n type : 'dropmove',\n }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n }\n\n return dropEvents;\n}\n\nfunction fireDropEvents (interaction, dropEvents) {\n if (dropEvents.leave) { interaction.prevDropTarget.fire(dropEvents.leave); }\n if (dropEvents.move ) { interaction.dropTarget.fire(dropEvents.move ); }\n if (dropEvents.enter) { interaction.dropTarget.fire(dropEvents.enter); }\n if (dropEvents.drop ) { interaction.dropTarget.fire(dropEvents.drop ); }\n if (dropEvents.deactivate) {\n fireActiveDrops(interaction, dropEvents.deactivate);\n }\n\n interaction.prevDropTarget = interaction.dropTarget;\n interaction.prevDropElement = interaction.dropElement;\n}\n\n/*\\\n * Interactable.dropzone\n [ method ]\n *\n * Returns or sets whether elements can be dropped onto this\n * Interactable to trigger drop events\n *\n * Dropzones can receive the following events:\n * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends\n * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone\n * - `dragmove` when a draggable that has entered the dropzone is moved\n * - `drop` when a draggable is dropped into this dropzone\n *\n * Use the `accept` option to allow only elements that match the given CSS\n * selector or element. The value can be:\n *\n * - **an Element** - only that element can be dropped into this dropzone.\n * - **a string**, - the element being dragged must match it as a CSS selector.\n * - **`null`** - accept options is cleared - it accepts any element.\n *\n * Use the `overlap` option to set how drops are checked for. The allowed\n * values are:\n *\n * - `'pointer'`, the pointer must be over the dropzone (default)\n * - `'center'`, the draggable element's center must be over the dropzone\n * - a number from 0-1 which is the `(intersection area) / (draggable area)`.\n * e.g. `0.5` for drop to happen when half of the area of the draggable is\n * over the dropzone\n *\n * Use the `checker` option to specify a function to check if a dragged\n * element is over this Interactable.\n *\n | interact(target)\n | .dropChecker(function(dragEvent, // related dragmove or dragend event\n | event, // TouchEvent/PointerEvent/MouseEvent\n | dropped, // bool result of the default checker\n | dropzone, // dropzone Interactable\n | dropElement, // dropzone elemnt\n | draggable, // draggable Interactable\n | draggableElement) {// draggable element\n |\n | return dropped && event.target.hasAttribute('allow-drop');\n | }\n *\n *\n - options (boolean | object | null) #optional The new value to be set.\n | interact('.drop').dropzone({\n | accept: '.can-drop' || document.getElementById('single-drop'),\n | overlap: 'pointer' || 'center' || zeroToOne\n | }\n = (boolean | object) The current setting or this Interactable\n\\*/\nInteractable.prototype.dropzone = function (options) {\n if (utils.is.object(options)) {\n this.options.drop.enabled = options.enabled === false? false: true;\n\n if (utils.is.function(options.ondrop) ) { this.events.ondrop = options.ondrop ; }\n if (utils.is.function(options.ondropactivate) ) { this.events.ondropactivate = options.ondropactivate ; }\n if (utils.is.function(options.ondropdeactivate)) { this.events.ondropdeactivate = options.ondropdeactivate; }\n if (utils.is.function(options.ondragenter) ) { this.events.ondragenter = options.ondragenter ; }\n if (utils.is.function(options.ondragleave) ) { this.events.ondragleave = options.ondragleave ; }\n if (utils.is.function(options.ondropmove) ) { this.events.ondropmove = options.ondropmove ; }\n\n if (/^(pointer|center)$/.test(options.overlap)) {\n this.options.drop.overlap = options.overlap;\n }\n else if (utils.is.number(options.overlap)) {\n this.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0);\n }\n if ('accept' in options) {\n this.options.drop.accept = options.accept;\n }\n if ('checker' in options) {\n this.options.drop.checker = options.checker;\n }\n\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drop.enabled = options;\n\n if (!options) {\n this.ondragenter = this.ondragleave = this.ondrop\n = this.ondropactivate = this.ondropdeactivate = null;\n }\n\n return this;\n }\n\n return this.options.drop;\n};\n\nInteractable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) {\n let dropped = false;\n\n // if the dropzone has no rect (eg. display: none)\n // call the custom dropChecker or just return false\n if (!(rect = rect || this.getRect(dropElement))) {\n return (this.options.drop.checker\n ? this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement)\n : false);\n }\n\n const dropOverlap = this.options.drop.overlap;\n\n if (dropOverlap === 'pointer') {\n const origin = utils.getOriginXY(draggable, draggableElement, 'drag');\n const page = utils.getPageXY(dragEvent);\n\n page.x += origin.x;\n page.y += origin.y;\n\n const horizontal = (page.x > rect.left) && (page.x < rect.right);\n const vertical = (page.y > rect.top ) && (page.y < rect.bottom);\n\n dropped = horizontal && vertical;\n }\n\n const dragRect = draggable.getRect(draggableElement);\n\n if (dragRect && dropOverlap === 'center') {\n const cx = dragRect.left + dragRect.width / 2;\n const cy = dragRect.top + dragRect.height / 2;\n\n dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom;\n }\n\n if (dragRect && utils.is.number(dropOverlap)) {\n const overlapArea = (Math.max(0, Math.min(rect.right , dragRect.right ) - Math.max(rect.left, dragRect.left))\n * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top , dragRect.top )));\n\n const overlapRatio = overlapArea / (dragRect.width * dragRect.height);\n\n dropped = overlapRatio >= dropOverlap;\n }\n\n if (this.options.drop.checker) {\n dropped = this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement);\n }\n\n return dropped;\n};\n\nInteractable.signals.on('unset', function ({ interactable }) {\n interactable.dropzone(false);\n});\n\nInteractable.settingsMethods.push('dropChecker');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.dropTarget = null; // the dropzone a drag target might be dropped into\n interaction.dropElement = null; // the element at the time of checking\n interaction.prevDropTarget = null; // the dropzone that was recently dragged away from\n interaction.prevDropElement = null; // the element at the time of checking\n interaction.dropEvents = null; // the dropEvents related to the current drag event\n\n interaction.activeDrops = {\n dropzones: [], // the dropzones that are mentioned below\n elements : [], // elements of dropzones that accept the target draggable\n rects : [], // the rects of the elements mentioned above\n };\n\n});\n\nInteraction.signals.on('stop', function ({ interaction }) {\n interaction.dropTarget = interaction.dropElement =\n interaction.prevDropTarget = interaction.prevDropElement = null;\n});\n\n/*\\\n * interact.dynamicDrop\n [ method ]\n *\n * Returns or sets whether the dimensions of dropzone elements are\n * calculated on every dragmove or only on dragstart for the default\n * dropChecker\n *\n - newValue (boolean) #optional True to check on each move. False to check only before start\n = (boolean | interact) The current setting or interact\n\\*/\ninteract.dynamicDrop = function (newValue) {\n if (utils.is.bool(newValue)) {\n //if (dragging && dynamicDrop !== newValue && !newValue) {\n //calcRects(dropzones);\n //}\n\n dynamicDrop = newValue;\n\n return interact;\n }\n return dynamicDrop;\n};\n\nutils.merge(Interactable.eventTypes, [\n 'dragenter',\n 'dragleave',\n 'dropactivate',\n 'dropdeactivate',\n 'dropmove',\n 'drop',\n]);\nactions.methodDict.drop = 'dropzone';\n\ndefaultOptions.drop = drop.defaults;\n\nmodule.exports = drop;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst gesture = {\n defaults: {\n enabled : false,\n origin : null,\n restrict: null,\n },\n\n checker: function (pointer, event, interactable, element, interaction) {\n if (interaction.pointerIds.length >= 2) {\n return { name: 'gesture' };\n }\n\n return null;\n },\n\n getCursor: function () {\n return '';\n },\n};\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturestart') { return; }\n iEvent.ds = 0;\n\n interaction.gesture.startDistance = interaction.gesture.prevDistance = iEvent.distance;\n interaction.gesture.startAngle = interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.scale = 1;\n});\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturemove') { return; }\n\n iEvent.ds = iEvent.scale - interaction.gesture.scale;\n\n interaction.target.fire(iEvent);\n\n interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.prevDistance = iEvent.distance;\n\n if (iEvent.scale !== Infinity\n && iEvent.scale !== null\n && iEvent.scale !== undefined\n && !isNaN(iEvent.scale)) {\n\n interaction.gesture.scale = iEvent.scale;\n }\n});\n\n/*\\\n * Interactable.gesturable\n [ method ]\n *\n * Gets or sets whether multitouch gestures can be performed on the\n * Interactable's element\n *\n = (boolean) Indicates if this can be the target of gesture events\n | var isGestureable = interact(element).gesturable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on gesture events (makes the Interactable gesturable)\n = (object) this Interactable\n | interact(element).gesturable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // limit multiple gestures.\n | // See the explanation in @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n\\*/\nInteractable.prototype.gesturable = function (options) {\n if (utils.is.object(options)) {\n this.options.gesture.enabled = options.enabled === false? false: true;\n this.setPerAction('gesture', options);\n this.setOnEvents('gesture', options);\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.gesture.enabled = options;\n\n if (!options) {\n this.ongesturestart = this.ongesturestart = this.ongestureend = null;\n }\n\n return this;\n }\n\n return this.options.gesture;\n};\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action, event, starting, ending, deltaSource }) {\n if (action !== 'gesture') { return; }\n\n const pointers = interaction.pointers;\n\n iEvent.touches = [pointers[0], pointers[1]];\n\n if (starting) {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = 1;\n iEvent.ds = 0;\n iEvent.angle = utils.touchAngle(pointers, undefined, deltaSource);\n iEvent.da = 0;\n }\n else if (ending || event instanceof InteractEvent) {\n iEvent.distance = interaction.prevEvent.distance;\n iEvent.box = interaction.prevEvent.box;\n iEvent.scale = interaction.prevEvent.scale;\n iEvent.ds = iEvent.scale - 1;\n iEvent.angle = interaction.prevEvent.angle;\n iEvent.da = iEvent.angle - interaction.gesture.startAngle;\n }\n else {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = iEvent.distance / interaction.gesture.startDistance;\n iEvent.angle = utils.touchAngle(pointers, interaction.gesture.prevAngle, deltaSource);\n\n iEvent.ds = iEvent.scale - interaction.gesture.prevScale;\n iEvent.da = iEvent.angle - interaction.gesture.prevAngle;\n }\n});\n\nInteraction.signals.on('new', function (interaction) {\n interaction.gesture = {\n start: { x: 0, y: 0 },\n\n startDistance: 0, // distance between two touches of touchStart\n prevDistance : 0,\n distance : 0,\n\n scale: 1, // gesture.distance / gesture.startDistance\n\n startAngle: 0, // angle of line joining two touches\n prevAngle : 0, // angle of the previous gesture event\n };\n});\n\nactions.gesture = gesture;\nactions.names.push('gesture');\nutils.merge(Interactable.eventTypes, [\n 'gesturestart',\n 'gesturemove',\n 'gestureend',\n]);\nactions.methodDict.gesture = 'gesturable';\n\ndefaultOptions.gesture = gesture.defaults;\n\nmodule.exports = gesture;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\n// Less Precision with touch input\nconst defaultMargin = browser.supportsTouch || browser.supportsPointerEvent? 20: 10;\n\nconst resize = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n square: false,\n preserveAspectRatio: false,\n axis: 'xy',\n\n // use default margin\n margin: NaN,\n\n // object with props left, right, top, bottom which are\n // true/false values to resize when the pointer is over that edge,\n // CSS selectors to match the handles for each direction\n // or the Elements for each handle\n edges: null,\n\n // a value of 'none' will limit the resize rect to a minimum of 0x0\n // 'negate' will alow the rect to have negative width/height\n // 'reposition' will keep the width/height positive by swapping\n // the top and bottom edges and/or swapping the left and right edges\n invert: 'none',\n },\n\n checker: function (pointer, event, interactable, element, interaction, rect) {\n if (!rect) { return null; }\n\n const page = utils.extend({}, interaction.curCoords.page);\n const options = interactable.options;\n\n if (options.resize.enabled) {\n const resizeOptions = options.resize;\n const resizeEdges = { left: false, right: false, top: false, bottom: false };\n\n // if using resize.edges\n if (utils.is.object(resizeOptions.edges)) {\n for (const edge in resizeEdges) {\n resizeEdges[edge] = checkResizeEdge(edge,\n resizeOptions.edges[edge],\n page,\n interaction._eventTarget,\n element,\n rect,\n resizeOptions.margin || defaultMargin);\n }\n\n resizeEdges.left = resizeEdges.left && !resizeEdges.right;\n resizeEdges.top = resizeEdges.top && !resizeEdges.bottom;\n\n if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) {\n return {\n name: 'resize',\n edges: resizeEdges,\n };\n }\n }\n else {\n const right = options.resize.axis !== 'y' && page.x > (rect.right - defaultMargin);\n const bottom = options.resize.axis !== 'x' && page.y > (rect.bottom - defaultMargin);\n\n if (right || bottom) {\n return {\n name: 'resize',\n axes: (right? 'x' : '') + (bottom? 'y' : ''),\n };\n }\n }\n }\n\n return null;\n },\n\n cursors: (browser.isIe9OrOlder ? {\n x : 'e-resize',\n y : 's-resize',\n xy: 'se-resize',\n\n top : 'n-resize',\n left : 'w-resize',\n bottom : 's-resize',\n right : 'e-resize',\n topleft : 'se-resize',\n bottomright: 'se-resize',\n topright : 'ne-resize',\n bottomleft : 'ne-resize',\n } : {\n x : 'ew-resize',\n y : 'ns-resize',\n xy: 'nwse-resize',\n\n top : 'ns-resize',\n left : 'ew-resize',\n bottom : 'ns-resize',\n right : 'ew-resize',\n topleft : 'nwse-resize',\n bottomright: 'nwse-resize',\n topright : 'nesw-resize',\n bottomleft : 'nesw-resize',\n }),\n\n getCursor: function (action) {\n if (action.axis) {\n return resize.cursors[action.name + action.axis];\n }\n else if (action.edges) {\n let cursorKey = '';\n const edgeNames = ['top', 'bottom', 'left', 'right'];\n\n for (let i = 0; i < 4; i++) {\n if (action.edges[edgeNames[i]]) {\n cursorKey += edgeNames[i];\n }\n }\n\n return resize.cursors[cursorKey];\n }\n },\n};\n\n// resizestart\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'resizestart' || !interaction.prepared.edges) {\n return;\n }\n\n const startRect = interaction.target.getRect(interaction.element);\n const resizeOptions = interaction.target.options.resize;\n\n /*\n * When using the `resizable.square` or `resizable.preserveAspectRatio` options, resizing from one edge\n * will affect another. E.g. with `resizable.square`, resizing to make the right edge larger will make\n * the bottom edge larger by the same amount. We call these 'linked' edges. Any linked edges will depend\n * on the active edges and the edge being interacted with.\n */\n if (resizeOptions.square || resizeOptions.preserveAspectRatio) {\n const linkedEdges = utils.extend({}, interaction.prepared.edges);\n\n linkedEdges.top = linkedEdges.top || (linkedEdges.left && !linkedEdges.bottom);\n linkedEdges.left = linkedEdges.left || (linkedEdges.top && !linkedEdges.right );\n linkedEdges.bottom = linkedEdges.bottom || (linkedEdges.right && !linkedEdges.top );\n linkedEdges.right = linkedEdges.right || (linkedEdges.bottom && !linkedEdges.left );\n\n interaction.prepared._linkedEdges = linkedEdges;\n }\n else {\n interaction.prepared._linkedEdges = null;\n }\n\n // if using `resizable.preserveAspectRatio` option, record aspect ratio at the start of the resize\n if (resizeOptions.preserveAspectRatio) {\n interaction.resizeStartAspectRatio = startRect.width / startRect.height;\n }\n\n interaction.resizeRects = {\n start : startRect,\n current : utils.extend({}, startRect),\n inverted : utils.extend({}, startRect),\n previous : utils.extend({}, startRect),\n delta : {\n left: 0, right : 0, width : 0,\n top : 0, bottom: 0, height: 0,\n },\n };\n\n iEvent.rect = interaction.resizeRects.inverted;\n iEvent.deltaRect = interaction.resizeRects.delta;\n});\n\n// resizemove\nInteractEvent.signals.on('new', function ({ iEvent, phase, interaction }) {\n if (phase !== 'move' || !interaction.prepared.edges) { return; }\n\n const resizeOptions = interaction.target.options.resize;\n const invert = resizeOptions.invert;\n const invertible = invert === 'reposition' || invert === 'negate';\n\n let edges = interaction.prepared.edges;\n\n const start = interaction.resizeRects.start;\n const current = interaction.resizeRects.current;\n const inverted = interaction.resizeRects.inverted;\n const delta = interaction.resizeRects.delta;\n const previous = utils.extend(interaction.resizeRects.previous, inverted);\n const originalEdges = edges;\n\n let dx = iEvent.dx;\n let dy = iEvent.dy;\n\n if (resizeOptions.preserveAspectRatio || resizeOptions.square) {\n // `resize.preserveAspectRatio` takes precedence over `resize.square`\n const startAspectRatio = resizeOptions.preserveAspectRatio\n ? interaction.resizeStartAspectRatio\n : 1;\n\n edges = interaction.prepared._linkedEdges;\n\n if ((originalEdges.left && originalEdges.bottom)\n || (originalEdges.right && originalEdges.top)) {\n dy = -dx / startAspectRatio;\n }\n else if (originalEdges.left || originalEdges.right ) { dy = dx / startAspectRatio; }\n else if (originalEdges.top || originalEdges.bottom) { dx = dy * startAspectRatio; }\n }\n\n // update the 'current' rect without modifications\n if (edges.top ) { current.top += dy; }\n if (edges.bottom) { current.bottom += dy; }\n if (edges.left ) { current.left += dx; }\n if (edges.right ) { current.right += dx; }\n\n if (invertible) {\n // if invertible, copy the current rect\n utils.extend(inverted, current);\n\n if (invert === 'reposition') {\n // swap edge values if necessary to keep width/height positive\n let swap;\n\n if (inverted.top > inverted.bottom) {\n swap = inverted.top;\n\n inverted.top = inverted.bottom;\n inverted.bottom = swap;\n }\n if (inverted.left > inverted.right) {\n swap = inverted.left;\n\n inverted.left = inverted.right;\n inverted.right = swap;\n }\n }\n }\n else {\n // if not invertible, restrict to minimum of 0x0 rect\n inverted.top = Math.min(current.top, start.bottom);\n inverted.bottom = Math.max(current.bottom, start.top);\n inverted.left = Math.min(current.left, start.right);\n inverted.right = Math.max(current.right, start.left);\n }\n\n inverted.width = inverted.right - inverted.left;\n inverted.height = inverted.bottom - inverted.top ;\n\n for (const edge in inverted) {\n delta[edge] = inverted[edge] - previous[edge];\n }\n\n iEvent.edges = interaction.prepared.edges;\n iEvent.rect = inverted;\n iEvent.deltaRect = delta;\n});\n\n/*\\\n * Interactable.resizable\n [ method ]\n *\n * Gets or sets whether resize actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of resize elements\n | var isResizeable = interact('input[type=text]').resizable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on resize events (object makes the Interactable resizable)\n = (object) This Interactable\n | interact(element).resizable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | edges: {\n | top : true, // Use pointer coords to check for resize.\n | left : false, // Disable resizing from left edge.\n | bottom: '.resize-s',// Resize if pointer target matches selector\n | right : handleEl // Resize if pointer target is the given Element\n | },\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height are adjusted at a 1:1 ratio.\n | square: false,\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height maintain the aspect ratio they had when resizing started.\n | preserveAspectRatio: false,\n |\n | // a value of 'none' will limit the resize rect to a minimum of 0x0\n | // 'negate' will allow the rect to have negative width/height\n | // 'reposition' will keep the width/height positive by swapping\n | // the top and bottom edges and/or swapping the left and right edges\n | invert: 'none' || 'negate' || 'reposition'\n |\n | // limit multiple resizes.\n | // See the explanation in the @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n \\*/\nInteractable.prototype.resizable = function (options) {\n if (utils.is.object(options)) {\n this.options.resize.enabled = options.enabled === false? false: true;\n this.setPerAction('resize', options);\n this.setOnEvents('resize', options);\n\n if (/^x$|^y$|^xy$/.test(options.axis)) {\n this.options.resize.axis = options.axis;\n }\n else if (options.axis === null) {\n this.options.resize.axis = defaultOptions.resize.axis;\n }\n\n if (utils.is.bool(options.preserveAspectRatio)) {\n this.options.resize.preserveAspectRatio = options.preserveAspectRatio;\n }\n else if (utils.is.bool(options.square)) {\n this.options.resize.square = options.square;\n }\n\n return this;\n }\n if (utils.is.bool(options)) {\n this.options.resize.enabled = options;\n\n if (!options) {\n this.onresizestart = this.onresizestart = this.onresizeend = null;\n }\n\n return this;\n }\n return this.options.resize;\n};\n\nfunction checkResizeEdge (name, value, page, element, interactableElement, rect, margin) {\n // false, '', undefined, null\n if (!value) { return false; }\n\n // true value, use pointer coords and element rect\n if (value === true) {\n // if dimensions are negative, \"switch\" edges\n const width = utils.is.number(rect.width )? rect.width : rect.right - rect.left;\n const height = utils.is.number(rect.height)? rect.height : rect.bottom - rect.top ;\n\n if (width < 0) {\n if (name === 'left' ) { name = 'right'; }\n else if (name === 'right') { name = 'left' ; }\n }\n if (height < 0) {\n if (name === 'top' ) { name = 'bottom'; }\n else if (name === 'bottom') { name = 'top' ; }\n }\n\n if (name === 'left' ) { return page.x < ((width >= 0? rect.left: rect.right ) + margin); }\n if (name === 'top' ) { return page.y < ((height >= 0? rect.top : rect.bottom) + margin); }\n\n if (name === 'right' ) { return page.x > ((width >= 0? rect.right : rect.left) - margin); }\n if (name === 'bottom') { return page.y > ((height >= 0? rect.bottom: rect.top ) - margin); }\n }\n\n // the remaining checks require an element\n if (!utils.is.element(element)) { return false; }\n\n return utils.is.element(value)\n // the value is an element to use as a resize handle\n ? value === element\n // otherwise check if element matches value as selector\n : utils.matchesUpTo(element, value, interactableElement);\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.resizeAxes = 'xy';\n});\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action }) {\n if (action !== 'resize' || !interaction.resizeAxes) { return; }\n\n const options = interaction.target.options;\n\n if (options.resize.square) {\n if (interaction.resizeAxes === 'y') {\n iEvent.dx = iEvent.dy;\n }\n else {\n iEvent.dy = iEvent.dx;\n }\n iEvent.axes = 'xy';\n }\n else {\n iEvent.axes = interaction.resizeAxes;\n\n if (interaction.resizeAxes === 'x') {\n iEvent.dy = 0;\n }\n else if (interaction.resizeAxes === 'y') {\n iEvent.dx = 0;\n }\n }\n});\n\nactions.resize = resize;\nactions.names.push('resize');\nutils.merge(Interactable.eventTypes, [\n 'resizestart',\n 'resizemove',\n 'resizeinertiastart',\n 'resizeinertiaresume',\n 'resizeend',\n]);\nactions.methodDict.resize = 'resizable';\n\ndefaultOptions.resize = resize.defaults;\n\nmodule.exports = resize;\n","const raf = require('./utils/raf');\nconst getWindow = require('./utils/window').getWindow;\nconst is = require('./utils/is');\nconst domUtils = require('./utils/domUtils');\nconst Interaction = require('./Interaction');\nconst defaultOptions = require('./defaultOptions');\n\nconst autoScroll = {\n defaults: {\n enabled : false,\n container: null, // the item that is scrolled (Window or HTMLElement)\n margin : 60,\n speed : 300, // the scroll speed in pixels per second\n },\n\n interaction: null,\n i: null, // the handle returned by window.setInterval\n x: 0, y: 0, // Direction each pulse is to scroll in\n\n isScrolling: false,\n prevTime: 0,\n\n start: function (interaction) {\n autoScroll.isScrolling = true;\n raf.cancel(autoScroll.i);\n\n autoScroll.interaction = interaction;\n autoScroll.prevTime = new Date().getTime();\n autoScroll.i = raf.request(autoScroll.scroll);\n },\n\n stop: function () {\n autoScroll.isScrolling = false;\n raf.cancel(autoScroll.i);\n },\n\n // scroll the window by the values in scroll.x/y\n scroll: function () {\n const options = autoScroll.interaction.target.options[autoScroll.interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(autoScroll.interaction.element);\n const now = new Date().getTime();\n // change in time in seconds\n const dt = (now - autoScroll.prevTime) / 1000;\n // displacement\n const s = options.speed * dt;\n\n if (s >= 1) {\n if (is.window(container)) {\n container.scrollBy(autoScroll.x * s, autoScroll.y * s);\n }\n else if (container) {\n container.scrollLeft += autoScroll.x * s;\n container.scrollTop += autoScroll.y * s;\n }\n\n autoScroll.prevTime = now;\n }\n\n if (autoScroll.isScrolling) {\n raf.cancel(autoScroll.i);\n autoScroll.i = raf.request(autoScroll.scroll);\n }\n },\n check: function (interactable, actionName) {\n const options = interactable.options;\n\n return options[actionName].autoScroll && options[actionName].autoScroll.enabled;\n },\n onInteractionMove: function ({ interaction, pointer }) {\n if (!(interaction.interacting()\n && autoScroll.check(interaction.target, interaction.prepared.name))) {\n return;\n }\n\n if (interaction.simulation) {\n autoScroll.x = autoScroll.y = 0;\n return;\n }\n\n let top;\n let right;\n let bottom;\n let left;\n\n const options = interaction.target.options[interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(interaction.element);\n\n if (is.window(container)) {\n left = pointer.clientX < autoScroll.margin;\n top = pointer.clientY < autoScroll.margin;\n right = pointer.clientX > container.innerWidth - autoScroll.margin;\n bottom = pointer.clientY > container.innerHeight - autoScroll.margin;\n }\n else {\n const rect = domUtils.getElementClientRect(container);\n\n left = pointer.clientX < rect.left + autoScroll.margin;\n top = pointer.clientY < rect.top + autoScroll.margin;\n right = pointer.clientX > rect.right - autoScroll.margin;\n bottom = pointer.clientY > rect.bottom - autoScroll.margin;\n }\n\n autoScroll.x = (right ? 1: left? -1: 0);\n autoScroll.y = (bottom? 1: top? -1: 0);\n\n if (!autoScroll.isScrolling) {\n // set the autoScroll properties to those of the target\n autoScroll.margin = options.margin;\n autoScroll.speed = options.speed;\n\n autoScroll.start(interaction);\n }\n },\n};\n\nInteraction.signals.on('stop-active', function () {\n autoScroll.stop();\n});\n\nInteraction.signals.on('action-move', autoScroll.onInteractionMove);\n\ndefaultOptions.perAction.autoScroll = autoScroll.defaults;\n\nmodule.exports = autoScroll;\n","const Interactable = require('../Interactable');\nconst actions = require('../actions/base');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.ignoreFrom\n [ method ]\n *\n * If the target of the `mousedown`, `pointerdown` or `touchstart`\n * event or any of it's parents match the given CSS selector or\n * Element, no drag/resize/gesture is started.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to not ignore any elements\n = (string | Element | object) The current ignoreFrom value or this Interactable\n **\n | interact(element, { ignoreFrom: document.getElementById('no-action') });\n | // or\n | interact(element).ignoreFrom('input, textarea, a');\n\\*/\nInteractable.prototype.ignoreFrom = function (newValue) {\n return this._backCompatOption('ignoreFrom', newValue);\n};\n\n/*\\\n * Interactable.allowFrom\n [ method ]\n *\n * A drag/resize/gesture is started only If the target of the\n * `mousedown`, `pointerdown` or `touchstart` event or any of it's\n * parents match the given CSS selector or Element.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to allow from any element\n = (string | Element | object) The current allowFrom value or this Interactable\n **\n | interact(element, { allowFrom: document.getElementById('drag-handle') });\n | // or\n | interact(element).allowFrom('.handle');\n\\*/\nInteractable.prototype.allowFrom = function (newValue) {\n return this._backCompatOption('allowFrom', newValue);\n};\n\nInteractable.prototype.testIgnore = function (ignoreFrom, interactableElement, element) {\n if (!ignoreFrom || !is.element(element)) { return false; }\n\n if (is.string(ignoreFrom)) {\n return domUtils.matchesUpTo(element, ignoreFrom, interactableElement);\n }\n else if (is.element(ignoreFrom)) {\n return domUtils.nodeContains(ignoreFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testAllow = function (allowFrom, interactableElement, element) {\n if (!allowFrom) { return true; }\n\n if (!is.element(element)) { return false; }\n\n if (is.string(allowFrom)) {\n return domUtils.matchesUpTo(element, allowFrom, interactableElement);\n }\n else if (is.element(allowFrom)) {\n return domUtils.nodeContains(allowFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testIgnoreAllow = function (options, interactableElement, eventTarget) {\n return (!this.testIgnore(options.ignoreFrom, interactableElement, eventTarget)\n && this.testAllow(options.allowFrom, interactableElement, eventTarget));\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (event.buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\n","const interact = require('../interact');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst actions = require('../actions/base');\nconst defaultOptions = require('../defaultOptions');\nconst browser = require('../utils/browser');\nconst scope = require('../scope');\nconst utils = require('../utils');\nconst signals = require('../utils/Signals').new();\n\nrequire('./InteractableMethods');\n\nconst autoStart = {\n signals,\n withinInteractionLimit,\n // Allow this many interactions to happen simultaneously\n maxInteractions: Infinity,\n defaults: {\n perAction: {\n manualStart: false,\n max: Infinity,\n maxPerElement: 1,\n allowFrom: null,\n ignoreFrom: null,\n },\n },\n setActionDefaults: function (action) {\n utils.extend(action.defaults, autoStart.defaults.perAction);\n },\n};\n\n// set cursor style on mousedown\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget }) {\n if (interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\n// set cursor style on mousemove\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget }) {\n if (!interaction.mouse\n || interaction.pointerIsDown\n || interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\nInteraction.signals.on('move', function (arg) {\n const { interaction, event } = arg;\n\n if (!interaction.pointerIsDown\n || interaction.interacting()\n || !interaction.pointerWasMoved\n || !interaction.prepared.name) {\n return;\n }\n\n signals.fire('before-start', arg);\n\n const target = interaction.target;\n\n if (interaction.prepared.name && target) {\n // check manualStart and interaction limit\n if (target.options[interaction.prepared.name].manualStart\n || !withinInteractionLimit(target, interaction.element, interaction.prepared)) {\n interaction.stop(event);\n }\n else {\n interaction.start(interaction.prepared, target, interaction.element);\n }\n }\n});\n\n// Check if the current target supports the action.\n// If so, return the validated action. Otherwise, return null\nfunction validateAction (action, interactable, element, eventTarget) {\n if (utils.is.object(action)\n && interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget)\n && interactable.options[action.name].enabled\n && withinInteractionLimit(interactable, element, action)) {\n return action;\n }\n\n return null;\n}\n\nfunction validateSelector (interaction, pointer, event, matches, matchElements, eventTarget) {\n for (let i = 0, len = matches.length; i < len; i++) {\n const match = matches[i];\n const matchElement = matchElements[i];\n const action = validateAction(match.getAction(pointer, event, interaction, matchElement),\n match,\n matchElement,\n eventTarget);\n\n if (action) {\n return {\n action,\n target: match,\n element: matchElement,\n };\n }\n }\n\n return {};\n}\n\nfunction getActionInfo (interaction, pointer, event, eventTarget) {\n let matches = [];\n let matchElements = [];\n\n let element = eventTarget;\n let action = null;\n\n function pushMatches (interactable, selector, context) {\n const elements = (browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined);\n\n if (utils.matchesSelector(element, selector, elements)) {\n\n matches.push(interactable);\n matchElements.push(element);\n }\n }\n\n while (utils.is.element(element)) {\n matches = [];\n matchElements = [];\n\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && (action = validateAction(elementInteractable.getAction(pointer, event, interaction, element, eventTarget),\n elementInteractable,\n element,\n eventTarget))\n && !elementInteractable.options[action.name].manualStart) {\n return {\n element,\n action,\n target: elementInteractable,\n };\n }\n else {\n scope.interactables.forEachSelector(pushMatches, element);\n\n const actionInfo = validateSelector(interaction, pointer, event, matches, matchElements, eventTarget);\n\n if (actionInfo.action\n && !actionInfo.target.options[actionInfo.action.name].manualStart) {\n return actionInfo;\n }\n }\n\n element = utils.parentNode(element);\n }\n\n return {};\n}\n\nfunction prepare (interaction, { action, target, element }) {\n action = action || {};\n\n if (interaction.target && interaction.target.options.styleCursor) {\n interaction.target._doc.documentElement.style.cursor = '';\n }\n\n interaction.target = target;\n interaction.element = element;\n utils.copyAction(interaction.prepared, action);\n\n if (target && target.options.styleCursor) {\n const cursor = action? actions[action.name].getCursor(action) : '';\n interaction.target._doc.documentElement.style.cursor = cursor;\n }\n\n signals.fire('prepared', { interaction: interaction });\n}\n\nInteraction.signals.on('stop', function ({ interaction }) {\n const target = interaction.target;\n\n if (target && target.options.styleCursor) {\n target._doc.documentElement.style.cursor = '';\n }\n});\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (utils.is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (utils.is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n const buttons = event.buttons || ({\n 0: 1,\n 1: 4,\n 3: 8,\n 4: 16,\n })[event.button];\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\nfunction withinInteractionLimit (interactable, element, action) {\n const options = interactable.options;\n const maxActions = options[action.name].max;\n const maxPerElement = options[action.name].maxPerElement;\n let activeInteractions = 0;\n let targetCount = 0;\n let targetElementCount = 0;\n\n // no actions if any of these values == 0\n if (!(maxActions && maxPerElement && autoStart.maxInteractions)) { return; }\n\n for (let i = 0, len = scope.interactions.length; i < len; i++) {\n const interaction = scope.interactions[i];\n const otherAction = interaction.prepared.name;\n\n if (!interaction.interacting()) { continue; }\n\n activeInteractions++;\n\n if (activeInteractions >= autoStart.maxInteractions) {\n return false;\n }\n\n if (interaction.target !== interactable) { continue; }\n\n targetCount += (otherAction === action.name)|0;\n\n if (targetCount >= maxActions) {\n return false;\n }\n\n if (interaction.element === element) {\n targetElementCount++;\n\n if (otherAction !== action.name || targetElementCount >= maxPerElement) {\n return false;\n }\n }\n }\n\n return autoStart.maxInteractions > 0;\n}\n\n/*\\\n * interact.maxInteractions\n [ method ]\n **\n * Returns or sets the maximum number of concurrent interactions allowed.\n * By default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables\n * and elements, you need to enable it in the draggable, resizable and\n * gesturable `'max'` and `'maxPerElement'` options.\n **\n - newValue (number) #optional Any number. newValue <= 0 means no interactions.\n\\*/\ninteract.maxInteractions = function (newValue) {\n if (utils.is.number(newValue)) {\n autoStart.maxInteractions = newValue;\n\n return this;\n }\n\n return autoStart.maxInteractions;\n};\n\nInteractable.settingsMethods.push('styleCursor');\nInteractable.settingsMethods.push('actionChecker');\nInteractable.settingsMethods.push('ignoreFrom');\nInteractable.settingsMethods.push('allowFrom');\n\ndefaultOptions.base.actionChecker = null;\ndefaultOptions.base.styleCursor = true;\n\nutils.extend(defaultOptions.perAction, autoStart.defaults.perAction);\n\nmodule.exports = autoStart;\n","const autoStart = require('./base');\nconst Interaction = require('../Interaction');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.delayTimer = null;\n});\n\nautoStart.signals.on('prepared', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.delayTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.target, interaction.element);\n }, delay);\n }\n});\n\nInteraction.signals.on('move', function ({ interaction, duplicate }) {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.delayTimer);\n }\n});\n\n// prevent regular down->move autoStart\nautoStart.signals.on('before-start', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.prepared.name = null;\n }\n});\n","const autoStart = require('./base');\nconst scope = require('../scope');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\n\nconst { matchesSelector, parentNode } = require('../utils/domUtils');\n\nautoStart.setActionDefaults(require('../actions/drag'));\n\nautoStart.signals.on('before-start', function ({ interaction, eventTarget, dx, dy }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // check if a drag is in the correct axis\n const absX = Math.abs(dx);\n const absY = Math.abs(dy);\n const options = interaction.target.options.drag;\n const startAxis = options.startAxis;\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy');\n\n interaction.prepared.axis = options.lockAxis === 'start'\n ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n : options.lockAxis;\n\n // if the movement isn't in the startAxis of the interactable\n if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) {\n // cancel the prepared action\n interaction.prepared.name = null;\n\n // then try to get a drag from another ineractable\n\n if (!interaction.prepared.name) {\n\n let element = eventTarget;\n\n const getDraggable = function (interactable, selector, context) {\n const elements = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n if (interactable === interaction.target) { return; }\n\n if (!options.manualStart\n && !interactable.testIgnoreAllow(options, element, eventTarget)\n && matchesSelector(element, selector, elements)) {\n\n const action = interactable.getAction(interaction.downPointer,\n interaction.downEvent,\n interaction,\n element);\n\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, interactable)\n && autoStart.validateAction(action, interactable, element, eventTarget)) {\n\n return interactable;\n }\n }\n };\n\n let action = null;\n\n // check all interactables\n while (is.element(element)) {\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && elementInteractable !== interaction.target\n && !elementInteractable.options.drag.manualStart) {\n\n action = elementInteractable.getAction(interaction.downPointer, interaction.downEvent, interaction, element);\n }\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, elementInteractable)) {\n\n interaction.prepared.name = 'drag';\n interaction.target = elementInteractable;\n interaction.element = element;\n break;\n }\n\n const selectorInteractable = scope.interactables.forEachSelector(getDraggable, element);\n\n if (selectorInteractable) {\n interaction.prepared.name = 'drag';\n interaction.target = selectorInteractable;\n interaction.element = element;\n break;\n }\n\n element = parentNode(element);\n }\n }\n }\n});\n\nfunction checkStartAxis (startAxis, interactable) {\n if (!interactable) { return false; }\n\n const thisAxis = interactable.options.drag.startAxis;\n\n return (startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis);\n}\n","require('./base').setActionDefaults(require('../actions/gesture'));\n","require('./base').setActionDefaults(require('../actions/resize'));\n","module.exports = {\n base: {\n accept : null,\n preventDefault: 'auto',\n deltaSource : 'page',\n },\n\n perAction: {\n origin: { x: 0, y: 0 },\n\n // only allow left button by default\n // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n mouseButtons: 1,\n\n inertia: {\n enabled : false,\n resistance : 10, // the lambda in exponential decay\n minSpeed : 100, // target speed must be above this for inertia to start\n endSpeed : 10, // the speed at which inertia is slow enough to stop\n allowResume : true, // allow resuming an action in inertia phase\n smoothEndDuration: 300, // animate to snap/restrict endOnly if there's no inertia\n },\n },\n};\n","/* browser entry point */\n\n// Legacy browser support\nrequire('./legacyBrowsers');\n\n// inertia\nrequire('./inertia');\n\n// modifiers\nrequire('./modifiers/snap');\nrequire('./modifiers/restrict');\n\n// pointerEvents\nrequire('./pointerEvents/base');\nrequire('./pointerEvents/holdRepeat');\nrequire('./pointerEvents/interactableTargets');\n\n// delay\nrequire('./autoStart/delay');\n\n// actions\nrequire('./actions/gesture');\nrequire('./actions/resize');\nrequire('./actions/drag');\nrequire('./actions/drop');\n\n// load these modifiers after resize is loaded\nrequire('./modifiers/snapSize');\nrequire('./modifiers/restrictEdges');\nrequire('./modifiers/restrictSize');\n\n// autoStart actions\nrequire('./autoStart/gesture');\nrequire('./autoStart/resize');\nrequire('./autoStart/drag');\n\n// Interactable preventDefault setting\nrequire('./interactablePreventDefault.js');\n\n// autoScroll\nrequire('./autoScroll');\n\n// export interact\nmodule.exports = require('./interact');\n","const InteractEvent = require('./InteractEvent');\nconst Interaction = require('./Interaction');\nconst modifiers = require('./modifiers');\nconst utils = require('./utils');\nconst animationFrame = require('./utils/raf');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.inertiaStatus = {\n active : false,\n smoothEnd : false,\n allowResume: false,\n\n startEvent: null,\n upCoords : {},\n\n xe: 0, ye: 0,\n sx: 0, sy: 0,\n\n t0: 0,\n vx0: 0, vys: 0,\n duration: 0,\n\n lambda_v0: 0,\n one_ve_v0: 0,\n i : null,\n };\n\n interaction.boundInertiaFrame = () => inertiaFrame .apply(interaction);\n interaction.boundSmoothEndFrame = () => smoothEndFrame.apply(interaction);\n});\n\nInteraction.signals.on('down', function ({ interaction, event, pointer, eventTarget }) {\n const status = interaction.inertiaStatus;\n\n // Check if the down event hits the current inertia target\n if (status.active) {\n let element = eventTarget;\n\n // climb up the DOM tree from the event target\n while (utils.is.element(element)) {\n\n // if interaction element is the current inertia target element\n if (element === interaction.element) {\n // stop inertia\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n\n // update pointers to the down event's coordinates\n interaction.updatePointer(pointer);\n utils.setCoords(interaction.curCoords, interaction.pointers);\n\n // fire appropriate signals\n const signalArg = { interaction };\n Interaction.signals.fire('before-action-move', signalArg);\n Interaction.signals.fire('action-resume' , signalArg);\n\n // fire a reume event\n const resumeEvent = new InteractEvent(interaction,\n event,\n interaction.prepared.name,\n 'inertiaresume',\n interaction.element);\n\n interaction.target.fire(resumeEvent);\n interaction.prevEvent = resumeEvent;\n modifiers.resetStatuses(interaction.modifierStatuses);\n\n utils.copyCoords(interaction.prevCoords, interaction.curCoords);\n break;\n }\n\n element = utils.parentNode(element);\n }\n }\n});\n\nInteraction.signals.on('up', function ({ interaction, event }) {\n const status = interaction.inertiaStatus;\n\n if (!interaction.interacting() || status.active) { return; }\n\n const target = interaction.target;\n const options = target && target.options;\n const inertiaOptions = options && interaction.prepared.name && options[interaction.prepared.name].inertia;\n\n const now = new Date().getTime();\n const statuses = {};\n const page = utils.extend({}, interaction.curCoords.page);\n const pointerSpeed = interaction.pointerDelta.client.speed;\n\n let smoothEnd = false;\n let modifierResult;\n\n // check if inertia should be started\n const inertiaPossible = (inertiaOptions && inertiaOptions.enabled\n && interaction.prepared.name !== 'gesture'\n && event !== status.startEvent);\n\n const inertia = (inertiaPossible\n && (now - interaction.curCoords.timeStamp) < 50\n && pointerSpeed > inertiaOptions.minSpeed\n && pointerSpeed > inertiaOptions.endSpeed);\n\n const modifierArg = {\n interaction,\n pageCoords: page,\n statuses,\n preEnd: true,\n requireEndOnly: true,\n };\n\n // smoothEnd\n if (inertiaPossible && !inertia) {\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n if (modifierResult.shouldMove && modifierResult.locked) {\n smoothEnd = true;\n }\n }\n\n if (!(inertia || smoothEnd)) { return; }\n\n utils.copyCoords(status.upCoords, interaction.curCoords);\n\n interaction.pointers[0] = status.startEvent =\n new InteractEvent(interaction, event, interaction.prepared.name, 'inertiastart', interaction.element);\n\n status.t0 = now;\n\n status.active = true;\n status.allowResume = inertiaOptions.allowResume;\n interaction.simulation = status;\n\n target.fire(status.startEvent);\n\n if (inertia) {\n status.vx0 = interaction.pointerDelta.client.vx;\n status.vy0 = interaction.pointerDelta.client.vy;\n status.v0 = pointerSpeed;\n\n calcInertia(interaction, status);\n\n utils.extend(page, interaction.curCoords.page);\n\n page.x += status.xe;\n page.y += status.ye;\n\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n status.modifiedXe += modifierResult.dx;\n status.modifiedYe += modifierResult.dy;\n\n status.i = animationFrame.request(interaction.boundInertiaFrame);\n }\n else {\n status.smoothEnd = true;\n status.xe = modifierResult.dx;\n status.ye = modifierResult.dy;\n\n status.sx = status.sy = 0;\n\n status.i = animationFrame.request(interaction.boundSmoothEndFrame);\n }\n});\n\nInteraction.signals.on('stop-active', function ({ interaction }) {\n const status = interaction.inertiaStatus;\n\n if (status.active) {\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n }\n});\n\nfunction calcInertia (interaction, status) {\n const inertiaOptions = interaction.target.options[interaction.prepared.name].inertia;\n const lambda = inertiaOptions.resistance;\n const inertiaDur = -Math.log(inertiaOptions.endSpeed / status.v0) / lambda;\n\n status.x0 = interaction.prevEvent.pageX;\n status.y0 = interaction.prevEvent.pageY;\n status.t0 = status.startEvent.timeStamp / 1000;\n status.sx = status.sy = 0;\n\n status.modifiedXe = status.xe = (status.vx0 - inertiaDur) / lambda;\n status.modifiedYe = status.ye = (status.vy0 - inertiaDur) / lambda;\n status.te = inertiaDur;\n\n status.lambda_v0 = lambda / status.v0;\n status.one_ve_v0 = 1 - inertiaOptions.endSpeed / status.v0;\n}\n\nfunction inertiaFrame () {\n updateInertiaCoords(this);\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n\n const status = this.inertiaStatus;\n const options = this.target.options[this.prepared.name].inertia;\n const lambda = options.resistance;\n const t = new Date().getTime() / 1000 - status.t0;\n\n if (t < status.te) {\n\n const progress = 1 - (Math.exp(-lambda * t) - status.lambda_v0) / status.one_ve_v0;\n\n if (status.modifiedXe === status.xe && status.modifiedYe === status.ye) {\n status.sx = status.xe * progress;\n status.sy = status.ye * progress;\n }\n else {\n const quadPoint = utils.getQuadraticCurvePoint(0, 0,\n status.xe,\n status.ye,\n status.modifiedXe,\n status.modifiedYe,\n progress);\n\n status.sx = quadPoint.x;\n status.sy = quadPoint.y;\n }\n\n this.doMove();\n\n status.i = animationFrame.request(this.boundInertiaFrame);\n }\n else {\n status.sx = status.modifiedXe;\n status.sy = status.modifiedYe;\n\n this.doMove();\n this.end(status.startEvent);\n status.active = false;\n this.simulation = null;\n }\n\n utils.copyCoords(this.prevCoords, this.curCoords);\n}\n\nfunction smoothEndFrame () {\n updateInertiaCoords(this);\n\n const status = this.inertiaStatus;\n const t = new Date().getTime() - status.t0;\n const duration = this.target.options[this.prepared.name].inertia.smoothEndDuration;\n\n if (t < duration) {\n status.sx = utils.easeOutQuad(t, 0, status.xe, duration);\n status.sy = utils.easeOutQuad(t, 0, status.ye, duration);\n\n this.pointerMove(status.startEvent, status.startEvent);\n\n status.i = animationFrame.request(this.boundSmoothEndFrame);\n }\n else {\n status.sx = status.xe;\n status.sy = status.ye;\n\n this.pointerMove(status.startEvent, status.startEvent);\n this.end(status.startEvent);\n\n status.smoothEnd =\n status.active = false;\n this.simulation = null;\n }\n}\n\nfunction updateInertiaCoords (interaction) {\n const status = interaction.inertiaStatus;\n\n // return if inertia isn't running\n if (!status.active) { return; }\n\n const pageUp = status.upCoords.page;\n const clientUp = status.upCoords.client;\n\n utils.setCoords(interaction.curCoords, [ {\n pageX : pageUp.x + status.sx,\n pageY : pageUp.y + status.sy,\n clientX: clientUp.x + status.sx,\n clientY: clientUp.y + status.sy,\n } ]);\n}\n","const browser = require('./utils/browser');\nconst events = require('./utils/events');\nconst utils = require('./utils');\nconst scope = require('./scope');\nconst Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\n\nconst globalEvents = {};\n\n/*\\\n * interact\n [ method ]\n *\n * The methods of this variable can be used to set elements as\n * interactables and also to change various default settings.\n *\n * Calling it as a function and passing an element or a valid CSS selector\n * string returns an Interactable object which has various methods to\n * configure it.\n *\n - element (Element | string) The HTML or SVG Element to interact with or CSS selector\n = (object) An @Interactable\n *\n > Usage\n | interact('#draggable').draggable(true);\n |\n | var rectables = interact('rect');\n | rectables\n | .gesturable(true)\n | .on('gesturemove', function (event) {\n | // ...\n | });\n\\*/\nfunction interact (element, options) {\n let interactable = scope.interactables.get(element, options);\n\n if (!interactable) {\n interactable = new Interactable(element, options);\n interactable.events.global = globalEvents;\n }\n\n return interactable;\n}\n\n/*\\\n * interact.isSet\n [ method ]\n *\n * Check if an element has been set\n - element (Element) The Element being searched for\n = (boolean) Indicates if the element or CSS selector was previously passed to interact\n\\*/\ninteract.isSet = function (element, options) {\n return scope.interactables.indexOfElement(element, options && options.context) !== -1;\n};\n\n/*\\\n * interact.on\n [ method ]\n *\n * Adds a global listener for an InteractEvent or adds a DOM event to\n * `document`\n *\n - type (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) interact\n\\*/\ninteract.on = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.on(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.on(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n // if it is an InteractEvent type, add listener to globalEvents\n if (utils.contains(Interactable.eventTypes, type)) {\n // if this type of event was never bound\n if (!globalEvents[type]) {\n globalEvents[type] = [listener];\n }\n else {\n globalEvents[type].push(listener);\n }\n }\n // If non InteractEvent type, addEventListener to document\n else {\n events.add(scope.document, type, listener, { options });\n }\n\n return interact;\n};\n\n/*\\\n * interact.off\n [ method ]\n *\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n - type (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) interact\n \\*/\ninteract.off = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.off(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.off(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n if (!utils.contains(Interactable.eventTypes, type)) {\n events.remove(scope.document, type, listener, options);\n }\n else {\n let index;\n\n if (type in globalEvents\n && (index = utils.indexOf(globalEvents[type], listener)) !== -1) {\n globalEvents[type].splice(index, 1);\n }\n }\n\n return interact;\n};\n\n/*\\\n * interact.debug\n [ method ]\n *\n * Returns an object which exposes internal data\n = (object) An object with properties that outline the current state and expose internal functions and variables\n\\*/\ninteract.debug = function () {\n return scope;\n};\n\n// expose the functions used to calculate multi-touch properties\ninteract.getPointerAverage = utils.pointerAverage;\ninteract.getTouchBBox = utils.touchBBox;\ninteract.getTouchDistance = utils.touchDistance;\ninteract.getTouchAngle = utils.touchAngle;\n\ninteract.getElementRect = utils.getElementRect;\ninteract.getElementClientRect = utils.getElementClientRect;\ninteract.matchesSelector = utils.matchesSelector;\ninteract.closest = utils.closest;\n\n/*\\\n * interact.supportsTouch\n [ method ]\n *\n = (boolean) Whether or not the browser supports touch input\n\\*/\ninteract.supportsTouch = function () {\n return browser.supportsTouch;\n};\n\n/*\\\n * interact.supportsPointerEvent\n [ method ]\n *\n = (boolean) Whether or not the browser supports PointerEvents\n\\*/\ninteract.supportsPointerEvent = function () {\n return browser.supportsPointerEvent;\n};\n\n/*\\\n * interact.stop\n [ method ]\n *\n * Cancels all interactions (end events are not fired)\n *\n - event (Event) An event on which to call preventDefault()\n = (object) interact\n\\*/\ninteract.stop = function (event) {\n for (let i = scope.interactions.length - 1; i >= 0; i--) {\n scope.interactions[i].stop(event);\n }\n\n return interact;\n};\n\n/*\\\n * interact.pointerMoveTolerance\n [ method ]\n * Returns or sets the distance the pointer must be moved before an action\n * sequence occurs. This also affects tolerance for tap events.\n *\n - newValue (number) #optional The movement from the start position must be greater than this value\n = (number | Interactable) The current setting or interact\n\\*/\ninteract.pointerMoveTolerance = function (newValue) {\n if (utils.is.number(newValue)) {\n Interaction.pointerMoveTolerance = newValue;\n\n return this;\n }\n\n return Interaction.pointerMoveTolerance;\n};\n\ninteract.addDocument = scope.addDocument;\ninteract.removeDocument = scope.removeDocument;\n\nscope.interact = interact;\n\nmodule.exports = interact;\n","const Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\nconst scope = require('./scope');\nconst is = require('./utils/is');\nconst events = require('./utils/events');\n\nconst { nodeContains, matchesSelector } = require('./utils/domUtils');\n\n/*\\\n * Interactable.preventDefault\n [ method ]\n *\n * Returns or sets whether to prevent the browser's default behaviour\n * in response to pointer events. Can be set to:\n * - `'always'` to always prevent\n * - `'never'` to never prevent\n * - `'auto'` to let interact.js try to determine what would be best\n *\n - newValue (string) #optional `true`, `false` or `'auto'`\n = (string | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.preventDefault = function (newValue) {\n if (/^(always|never|auto)$/.test(newValue)) {\n this.options.preventDefault = newValue;\n return this;\n }\n\n if (is.bool(newValue)) {\n this.options.preventDefault = newValue? 'always' : 'never';\n return this;\n }\n\n return this.options.preventDefault;\n};\n\nInteractable.prototype.checkAndPreventDefault = function (event) {\n const setting = this.options.preventDefault;\n\n if (setting === 'never') { return; }\n\n if (setting === 'always') {\n event.preventDefault();\n return;\n }\n\n // setting === 'auto'\n\n // don't preventDefault if the browser supports passiveEvents\n // CSS touch-action and user-selecct should be used instead\n if (events.supportsOptions) {\n return;\n }\n\n // don't preventDefault of pointerdown events\n if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) {\n return;\n }\n\n // don't preventDefault on editable elements\n if (is.element(event.target)\n && matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) {\n return;\n }\n\n event.preventDefault();\n};\n\nfunction onInteractionEvent ({ interaction, event }) {\n if (interaction.target) {\n interaction.target.checkAndPreventDefault(event);\n }\n}\n\nfor (const eventSignal of ['down', 'move', 'up', 'cancel']) {\n Interaction.signals.on(eventSignal, onInteractionEvent);\n}\n\n// prevent native HTML5 drag on interact.js target elements\nInteraction.docEvents.dragstart = function preventNativeDrag (event) {\n for (const interaction of scope.interactions) {\n\n if (interaction.element\n && (interaction.element === event.target\n || nodeContains(interaction.element, event.target))) {\n\n interaction.target.checkAndPreventDefault(event);\n return;\n }\n }\n};\n","const scope = require('./scope');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst iFinder = require('./utils/interactionFinder');\nconst pointerEvents = require('./pointerEvents/base');\n\nconst { window } = require('./utils/window');\n\nconst toString = Object.prototype.toString;\n\nif (!window.Array.isArray) {\n window.Array.isArray = function (obj) {\n return toString.call(obj) === '[object Array]';\n };\n}\n\nif (!String.prototype.trim) {\n String.prototype.trim = function () {\n return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n };\n}\n\n// http://www.quirksmode.org/dom/events/click.html\n// >Events leading to dblclick\n//\n// IE8 doesn't fire down event before dblclick.\n// This workaround tries to fire a tap and doubletap after dblclick\nfunction onIE8Dblclick (event) {\n const eventTarget = event.target;\n const interaction = iFinder.search(event, event.type, eventTarget);\n\n if (!interaction) { return; }\n\n if (interaction.prevTap\n && event.clientX === interaction.prevTap.clientX\n && event.clientY === interaction.prevTap.clientY\n && eventTarget === interaction.prevTap.target) {\n\n interaction.downTargets[0] = eventTarget;\n interaction.downTimes [0] = new Date().getTime();\n\n pointerEvents.fire({\n interaction,\n event,\n eventTarget,\n pointer: event,\n type: 'tap',\n });\n }\n}\n\nif (browser.isIE8) {\n const selectFix = function (event) {\n for (const interaction of scope.interactions) {\n if (interaction.interacting()) {\n interaction.target.checkAndPreventDefault(event);\n }\n }\n };\n\n const onDocIE8 = function onDocIE8 ({ doc, win }, signalName) {\n const eventMethod = signalName.indexOf('listen') === 0\n ? events.add : events.remove;\n\n // For IE's lack of Event#preventDefault\n eventMethod(doc, 'selectstart', selectFix);\n\n if (pointerEvents) {\n eventMethod(doc, 'dblclick', onIE8Dblclick);\n }\n };\n\n scope.signals.on('add-document' , onDocIE8);\n scope.signals.on('remove-document', onDocIE8);\n}\n\nmodule.exports = null;\n","const InteractEvent = require('../InteractEvent');\nconst Interaction = require('../Interaction');\nconst extend = require('../utils/extend');\n\nconst modifiers = {\n names: [],\n\n setOffsets: function (arg) {\n const { interaction, pageCoords: page } = arg;\n const { target, element, startOffset } = interaction;\n const rect = target.getRect(element);\n\n if (rect) {\n startOffset.left = page.x - rect.left;\n startOffset.top = page.y - rect.top;\n\n startOffset.right = rect.right - page.x;\n startOffset.bottom = rect.bottom - page.y;\n\n if (!('width' in rect)) { rect.width = rect.right - rect.left; }\n if (!('height' in rect)) { rect.height = rect.bottom - rect.top ; }\n }\n else {\n startOffset.left = startOffset.top = startOffset.right = startOffset.bottom = 0;\n }\n\n arg.rect = rect;\n arg.interactable = target;\n arg.element = element;\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n\n arg.options = target.options[interaction.prepared.name][modifierName];\n\n if (!arg.options) {\n continue;\n }\n\n interaction.modifierOffsets[modifierName] = modifiers[modifierName].setOffset(arg);\n }\n },\n\n setAll: function (arg) {\n const { interaction, statuses, preEnd, requireEndOnly } = arg;\n const coords = extend({}, arg.pageCoords);\n const result = {\n dx: 0,\n dy: 0,\n changed: false,\n locked: false,\n shouldMove: true,\n };\n\n for (const modifierName of modifiers.names) {\n const modifier = modifiers[modifierName];\n const options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!shouldDo(options, preEnd, requireEndOnly)) { continue; }\n\n arg.status = arg.status = statuses[modifierName];\n arg.options = options;\n arg.offset = arg.interaction.modifierOffsets[modifierName];\n\n modifier.set(arg);\n\n if (arg.status.locked) {\n coords.x += arg.status.dx;\n coords.y += arg.status.dy;\n\n result.dx += arg.status.dx;\n result.dy += arg.status.dy;\n\n result.locked = true;\n }\n }\n\n // a move should be fired if:\n // - there are no modifiers enabled,\n // - no modifiers are \"locked\" i.e. have changed the pointer's coordinates, or\n // - the locked coords have changed since the last pointer move\n result.shouldMove = !arg.status || !result.locked || arg.status.changed;\n\n return result;\n },\n\n resetStatuses: function (statuses) {\n for (const modifierName of modifiers.names) {\n const status = statuses[modifierName] || {};\n\n status.dx = status.dy = 0;\n status.modifiedX = status.modifiedY = NaN;\n status.locked = false;\n status.changed = true;\n\n statuses[modifierName] = status;\n }\n\n return statuses;\n },\n\n start: function ({ interaction }, signalName) {\n const arg = {\n interaction,\n pageCoords: (signalName === 'action-resume' ?\n interaction.curCoords : interaction.startCoords).page,\n startOffset: interaction.startOffset,\n statuses: interaction.modifierStatuses,\n preEnd: false,\n requireEndOnly: false,\n };\n\n modifiers.setOffsets(arg);\n modifiers.resetStatuses(arg.statuses);\n\n arg.pageCoords = extend({}, interaction.startCoords.page);\n interaction.modifierResult = modifiers.setAll(arg);\n },\n};\n\nInteraction.signals.on('new', function (interaction) {\n interaction.startOffset = { left: 0, right: 0, top: 0, bottom: 0 };\n interaction.modifierOffsets = {};\n interaction.modifierStatuses = modifiers.resetStatuses({});\n interaction.modifierResult = null;\n});\n\nInteraction.signals.on('action-start' , modifiers.start);\nInteraction.signals.on('action-resume', modifiers.start);\n\nInteraction.signals.on('before-action-move', function ({ interaction, preEnd, interactingBeforeMove }) {\n const modifierResult = modifiers.setAll({\n interaction,\n preEnd,\n pageCoords: interaction.curCoords.page,\n statuses: interaction.modifierStatuses,\n requireEndOnly: false,\n });\n\n // don't fire an action move if a modifier would keep the event in the same\n // cordinates as before\n if (!modifierResult.shouldMove && interactingBeforeMove) {\n interaction._dontFireMove = true;\n }\n\n interaction.modifierResult = modifierResult;\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n for (let i = 0; i < modifiers.names.length; i++) {\n const options = interaction.target.options[interaction.prepared.name][modifiers.names[i]];\n\n // if the endOnly option is true for any modifier\n if (shouldDo(options, true, true)) {\n // fire a move event at the modified coordinates\n interaction.doMove({ event, preEnd: true });\n break;\n }\n }\n});\n\nInteractEvent.signals.on('set-xy', function (arg) {\n const { iEvent, interaction } = arg;\n const modifierArg = extend({}, arg);\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n modifierArg.options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!modifierArg.options) {\n continue;\n }\n\n const modifier = modifiers[modifierName];\n\n modifierArg.status = interaction.modifierStatuses[modifierName];\n\n iEvent[modifierName] = modifier.modifyCoords(modifierArg);\n }\n});\n\nfunction shouldDo (options, preEnd, requireEndOnly) {\n return (options && options.enabled\n && (preEnd || !options.endOnly)\n && (!requireEndOnly || options.endOnly));\n}\n\nmodule.exports = modifiers;\n","const modifiers = require('./index');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst restrict = {\n defaults: {\n enabled : false,\n endOnly : false,\n restriction: null,\n elementRect: null,\n },\n\n setOffset: function ({ rect, startOffset, options }) {\n const elementRect = options && options.elementRect;\n const offset = {};\n\n if (rect && elementRect) {\n offset.left = startOffset.left - (rect.width * elementRect.left);\n offset.top = startOffset.top - (rect.height * elementRect.top);\n\n offset.right = startOffset.right - (rect.width * (1 - elementRect.right));\n offset.bottom = startOffset.bottom - (rect.height * (1 - elementRect.bottom));\n }\n else {\n offset.left = offset.top = offset.right = offset.bottom = 0;\n }\n\n return offset;\n },\n\n set: function ({ pageCoords, interaction, status, options }) {\n if (!options) { return status; }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n\n const restriction = getRestrictionRect(options.restriction, interaction, page);\n\n if (!restriction) { return status; }\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n const rect = restriction;\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n const offset = interaction.modifierOffsets.restrict;\n\n // object is assumed to have\n // x, y, width, height or\n // left, top, right, bottom\n if ('x' in restriction && 'y' in restriction) {\n modifiedX = Math.max(Math.min(rect.x + rect.width - offset.right , page.x), rect.x + offset.left);\n modifiedY = Math.max(Math.min(rect.y + rect.height - offset.bottom, page.y), rect.y + offset.top );\n }\n else {\n modifiedX = Math.max(Math.min(rect.right - offset.right , page.x), rect.left + offset.left);\n modifiedY = Math.max(Math.min(rect.bottom - offset.bottom, page.y), rect.top + offset.top );\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const elementRect = options && options.elementRect;\n\n if (options && options.enabled\n && !(phase === 'start' && elementRect && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n getRestrictionRect,\n};\n\nfunction getRestrictionRect (value, interaction, page) {\n if (utils.is.function(value)) {\n return utils.resolveRectLike(value, interaction.target, interaction.element, [page.x, page.y, interaction]);\n } else {\n return utils.resolveRectLike(value, interaction.target, interaction.element);\n }\n}\n\nmodifiers.restrict = restrict;\nmodifiers.names.push('restrict');\n\ndefaultOptions.perAction.restrict = restrict.defaults;\n\nmodule.exports = restrict;\n","// This module adds the options.resize.restrictEdges setting which sets min and\n// max for the top, left, bottom and right edges of the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictEdges: {\n// inner: { top: 200, left: 200, right: 400, bottom: 400 },\n// outer: { top: 0, left: 0, right: 600, bottom: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst { getRestrictionRect } = require('./restrict');\n\nconst noInner = { top: +Infinity, left: +Infinity, bottom: -Infinity, right: -Infinity };\nconst noOuter = { top: -Infinity, left: -Infinity, bottom: +Infinity, right: +Infinity };\n\nconst restrictEdges = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n offset: null,\n },\n\n setOffset: function ({ interaction, startOffset, options }) {\n if (!options) {\n return utils.extend({}, startOffset);\n }\n\n const offset = getRestrictionRect(options.offset, interaction, interaction.startCoords.page);\n\n if (offset) {\n return {\n top: startOffset.top + offset.y,\n left: startOffset.left + offset.x,\n bottom: startOffset.bottom + offset.y,\n right: startOffset.right + offset.x,\n };\n }\n\n return startOffset;\n },\n\n set: function ({ pageCoords, interaction, status, offset, options }) {\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n const inner = rectUtils.xywhToTlbr(getRestrictionRect(options.inner, interaction, page)) || noInner;\n const outer = rectUtils.xywhToTlbr(getRestrictionRect(options.outer, interaction, page)) || noOuter;\n\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n if (edges.top) {\n modifiedY = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top);\n }\n else if (edges.bottom) {\n modifiedY = Math.max(Math.min(outer.bottom - offset.bottom, page.y), inner.bottom - offset.bottom);\n }\n if (edges.left) {\n modifiedX = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left);\n }\n else if (edges.right) {\n modifiedX = Math.max(Math.min(outer.right - offset.right, page.x), inner.right - offset.right);\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n if (options && options.enabled\n && !(phase === 'start' && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n noInner,\n noOuter,\n getRestrictionRect,\n};\n\nmodifiers.restrictEdges = restrictEdges;\nmodifiers.names.push('restrictEdges');\n\ndefaultOptions.perAction.restrictEdges = restrictEdges.defaults;\nresize.defaults.restrictEdges = restrictEdges.defaults;\n\nmodule.exports = restrictEdges;\n","// This module adds the options.resize.restrictSize setting which sets min and\n// max width and height for the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictSize: {\n// min: { width: -600, height: -600 },\n// max: { width: 600, height: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst restrictEdges = require('./restrictEdges');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst noMin = { width: -Infinity, height: -Infinity };\nconst noMax = { width: +Infinity, height: +Infinity };\n\nconst restrictSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n },\n\n setOffset: function ({ interaction }) {\n return interaction.startOffset;\n },\n\n set: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const rect = rectUtils.xywhToTlbr(interaction.resizeRects.inverted);\n\n const minSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.min, interaction)) || noMin;\n const maxSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.max, interaction)) || noMax;\n\n arg.options = {\n enabled: options.enabled,\n endOnly: options.endOnly,\n inner: utils.extend({}, restrictEdges.noInner),\n outer: utils.extend({}, restrictEdges.noOuter),\n };\n\n if (edges.top) {\n arg.options.inner.top = rect.bottom - minSize.height;\n arg.options.outer.top = rect.bottom - maxSize.height;\n }\n else if (edges.bottom) {\n arg.options.inner.bottom = rect.top + minSize.height;\n arg.options.outer.bottom = rect.top + maxSize.height;\n }\n if (edges.left) {\n arg.options.inner.left = rect.right - minSize.width;\n arg.options.outer.left = rect.right - maxSize.width;\n }\n else if (edges.right) {\n arg.options.inner.right = rect.left + minSize.width;\n arg.options.outer.right = rect.left + maxSize.width;\n }\n\n restrictEdges.set(arg);\n },\n\n modifyCoords: restrictEdges.modifyCoords,\n};\n\nmodifiers.restrictSize = restrictSize;\nmodifiers.names.push('restrictSize');\n\ndefaultOptions.perAction.restrictSize = restrictSize.defaults;\nresize.defaults.restrictSize = restrictSize.defaults;\n\nmodule.exports = restrictSize;\n","const modifiers = require('./index');\nconst interact = require('../interact');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst snap = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n\n relativePoints: null,\n },\n\n setOffset: function ({ interaction, interactable, element, rect, startOffset, options }) {\n const offsets = [];\n const optionsOrigin = utils.rectToXY(utils.resolveRectLike(options.origin));\n const origin = optionsOrigin || utils.getOriginXY(interactable, element, interaction.prepared.name);\n options = options || interactable.options[interaction.prepared.name].snap || {};\n\n let snapOffset;\n\n if (options.offset === 'startCoords') {\n snapOffset = {\n x: interaction.startCoords.page.x - origin.x,\n y: interaction.startCoords.page.y - origin.y,\n };\n }\n else {\n const offsetRect = utils.resolveRectLike(options.offset, interactable, element, [interaction]);\n\n snapOffset = utils.rectToXY(offsetRect) || { x: 0, y: 0 };\n }\n\n if (rect && options.relativePoints && options.relativePoints.length) {\n for (const { x: relativeX, y: relativeY } of options.relativePoints) {\n offsets.push({\n x: startOffset.left - (rect.width * relativeX) + snapOffset.x,\n y: startOffset.top - (rect.height * relativeY) + snapOffset.y,\n });\n }\n }\n else {\n offsets.push(snapOffset);\n }\n\n return offsets;\n },\n\n set: function ({ interaction, pageCoords, status, options, offset: offsets }) {\n const targets = [];\n let target;\n let page;\n let i;\n\n if (status.useStatusXY) {\n page = { x: status.x, y: status.y };\n }\n else {\n const origin = utils.getOriginXY(interaction.target, interaction.element, interaction.prepared.name);\n\n page = utils.extend({}, pageCoords);\n\n page.x -= origin.x;\n page.y -= origin.y;\n }\n\n status.realX = page.x;\n status.realY = page.y;\n\n let len = options.targets? options.targets.length : 0;\n\n for (const { x: offsetX, y: offsetY } of offsets) {\n const relativeX = page.x - offsetX;\n const relativeY = page.y - offsetY;\n\n for (const snapTarget of options.targets) {\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n targets.push({\n x: utils.is.number(target.x) ? (target.x + offsetX) : relativeX,\n y: utils.is.number(target.y) ? (target.y + offsetY) : relativeY,\n\n range: utils.is.number(target.range)? target.range: options.range,\n });\n }\n }\n\n const closest = {\n target: null,\n inRange: false,\n distance: 0,\n range: 0,\n dx: 0,\n dy: 0,\n };\n\n for (i = 0, len = targets.length; i < len; i++) {\n target = targets[i];\n\n const range = target.range;\n const dx = target.x - page.x;\n const dy = target.y - page.y;\n const distance = utils.hypot(dx, dy);\n let inRange = distance <= range;\n\n // Infinite targets count as being out of range\n // compared to non infinite ones that are in range\n if (range === Infinity && closest.inRange && closest.range !== Infinity) {\n inRange = false;\n }\n\n if (!closest.target || (inRange\n // is the closest target in range?\n ? (closest.inRange && range !== Infinity\n // the pointer is relatively deeper in this target\n ? distance / range < closest.distance / closest.range\n // this target has Infinite range and the closest doesn't\n : (range === Infinity && closest.range !== Infinity)\n // OR this target is closer that the previous closest\n || distance < closest.distance)\n // The other is not in range and the pointer is closer to this target\n : (!closest.inRange && distance < closest.distance))) {\n\n closest.target = target;\n closest.distance = distance;\n closest.range = range;\n closest.inRange = inRange;\n closest.dx = dx;\n closest.dy = dy;\n\n status.range = range;\n }\n }\n\n let snapChanged;\n\n if (closest.target) {\n snapChanged = (status.modifiedX !== closest.target.x || status.modifiedY !== closest.target.y);\n\n status.modifiedX = closest.target.x;\n status.modifiedY = closest.target.y;\n }\n else {\n snapChanged = true;\n\n status.modifiedX = NaN;\n status.modifiedY = NaN;\n }\n\n status.dx = closest.dx;\n status.dy = closest.dy;\n\n status.changed = (snapChanged || (closest.inRange && !status.locked));\n status.locked = closest.inRange;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const relativePoints = options && options.relativePoints;\n\n if (options && options.enabled\n && !(phase === 'start' && relativePoints && relativePoints.length)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n }\n\n return {\n range : status.range,\n locked : status.locked,\n x : status.modifiedX,\n y : status.modifiedY,\n realX : status.realX,\n realY : status.realY,\n dx : status.dx,\n dy : status.dy,\n };\n }\n },\n};\n\ninteract.createSnapGrid = function (grid) {\n return function (x, y) {\n const limits = grid.limits || {\n left : -Infinity,\n right : Infinity,\n top : -Infinity,\n bottom: Infinity,\n };\n let offsetX = 0;\n let offsetY = 0;\n\n if (utils.is.object(grid.offset)) {\n offsetX = grid.offset.x;\n offsetY = grid.offset.y;\n }\n\n const gridx = Math.round((x - offsetX) / grid.x);\n const gridy = Math.round((y - offsetY) / grid.y);\n\n const newX = Math.max(limits.left, Math.min(limits.right , gridx * grid.x + offsetX));\n const newY = Math.max(limits.top , Math.min(limits.bottom, gridy * grid.y + offsetY));\n\n return {\n x: newX,\n y: newY,\n range: grid.range,\n };\n };\n};\n\nmodifiers.snap = snap;\nmodifiers.names.push('snap');\n\ndefaultOptions.perAction.snap = snap.defaults;\n\nmodule.exports = snap;\n","// This module allows snapping of the size of targets during resize\n// interactions.\n\nconst modifiers = require('./index');\nconst snap = require('./snap');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\nconst utils = require('../utils/');\n\nconst snapSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n },\n\n setOffset: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.edges;\n\n if (!edges) { return; }\n\n arg.options = {\n relativePoints: [{\n x: edges.left? 0 : 1,\n y: edges.top ? 0 : 1,\n }],\n origin: { x: 0, y: 0 },\n offset: 'self',\n range: options.range,\n };\n\n const offsets = snap.setOffset(arg);\n arg.options = options;\n\n return offsets;\n },\n\n set: function (arg) {\n const { interaction, options, offset, pageCoords } = arg;\n const page = utils.extend({}, pageCoords);\n const relativeX = page.x - offset[0].x;\n const relativeY = page.y - offset[0].y;\n\n arg.options = utils.extend({}, options);\n arg.options.targets = [];\n\n for (const snapTarget of options.targets) {\n let target;\n\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n if ('width' in target && 'height' in target) {\n target.x = target.width;\n target.y = target.height;\n }\n\n arg.options.targets.push(target);\n }\n\n snap.set(arg);\n },\n\n modifyCoords: function (arg) {\n const { options } = arg;\n\n arg.options = utils.extend({}, options);\n arg.options.enabled = options.enabled;\n arg.options.relativePoints = [null];\n\n snap.modifyCoords(arg);\n },\n};\n\nmodifiers.snapSize = snapSize;\nmodifiers.names.push('snapSize');\n\ndefaultOptions.perAction.snapSize = snapSize.defaults;\nresize.defaults.snapSize = snapSize.defaults;\n\nmodule.exports = snapSize;\n","const pointerUtils = require('../utils/pointerUtils');\n\nmodule.exports = class PointerEvent {\n constructor (type, pointer, event, eventTarget, interaction) {\n pointerUtils.pointerExtend(this, event);\n\n if (event !== pointer) {\n pointerUtils.pointerExtend(this, pointer);\n }\n\n this.interaction = interaction;\n\n this.timeStamp = new Date().getTime();\n this.originalEvent = event;\n this.type = type;\n this.pointerId = pointerUtils.getPointerId(pointer);\n this.pointerType = pointerUtils.getPointerType(pointer, interaction);\n this.target = eventTarget;\n this.currentTarget = null;\n\n if (type === 'tap') {\n const pointerIndex = interaction.getPointerIndex(pointer);\n this.dt = this.timeStamp - interaction.downTimes[pointerIndex];\n\n const interval = this.timeStamp - interaction.tapTime;\n\n this.double = !!(interaction.prevTap\n && interaction.prevTap.type !== 'doubletap'\n && interaction.prevTap.target === this.target\n && interval < 500);\n }\n else if (type === 'doubletap') {\n this.dt = pointer.timeStamp - interaction.tapTime;\n }\n }\n\n subtractOrigin ({ x: originX, y: originY }) {\n this.pageX -= originX;\n this.pageY -= originY;\n this.clientX -= originX;\n this.clientY -= originY;\n\n return this;\n }\n\n addOrigin ({ x: originX, y: originY }) {\n this.pageX += originX;\n this.pageY += originY;\n this.clientX += originX;\n this.clientY += originY;\n\n return this;\n }\n\n preventDefault () {\n this.originalEvent.preventDefault();\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n};\n","const PointerEvent = require('./PointerEvent');\nconst Interaction = require('../Interaction');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst defaults = require('../defaultOptions');\nconst signals = require('../utils/Signals').new();\nconst { filter } = require('../utils/arr');\n\nconst simpleSignals = [ 'down', 'up', 'cancel' ];\nconst simpleEvents = [ 'down', 'up', 'cancel' ];\n\nconst pointerEvents = {\n PointerEvent,\n fire,\n collectEventTargets,\n signals,\n defaults: {\n holdDuration: 600,\n ignoreFrom : null,\n allowFrom : null,\n origin : { x: 0, y: 0 },\n },\n types: [\n 'down',\n 'move',\n 'up',\n 'cancel',\n 'tap',\n 'doubletap',\n 'hold',\n ],\n};\n\nfunction fire (arg) {\n const {\n interaction, pointer, event, eventTarget,\n type = arg.pointerEvent.type,\n targets = collectEventTargets(arg),\n pointerEvent = new PointerEvent(type, pointer, event, eventTarget, interaction),\n } = arg;\n\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n targets,\n type,\n pointerEvent,\n };\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n\n for (const prop in target.props || {}) {\n pointerEvent[prop] = target.props[prop];\n }\n\n const origin = utils.getOriginXY(target.eventable, target.element);\n\n pointerEvent.subtractOrigin(origin);\n pointerEvent.eventable = target.eventable;\n pointerEvent.currentTarget = target.element;\n\n target.eventable.fire(pointerEvent);\n\n pointerEvent.addOrigin(origin);\n\n if (pointerEvent.immediatePropagationStopped\n || (pointerEvent.propagationStopped\n && (i + 1) < targets.length && targets[i + 1].element !== pointerEvent.currentTarget)) {\n break;\n }\n }\n\n signals.fire('fired', signalArg);\n\n if (type === 'tap') {\n // if pointerEvent should make a double tap, create and fire a doubletap\n // PointerEvent and use that as the prevTap\n const prevTap = pointerEvent.double\n ? fire({\n interaction, pointer, event, eventTarget,\n type: 'doubletap',\n })\n : pointerEvent;\n\n interaction.prevTap = prevTap;\n interaction.tapTime = prevTap.timeStamp;\n }\n\n return pointerEvent;\n}\n\nfunction collectEventTargets ({ interaction, pointer, event, eventTarget, type }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n // do not fire a tap event if the pointer was moved before being lifted\n if (type === 'tap' && (interaction.pointerWasMoved\n // or if the pointerup target is different to the pointerdown target\n || !(interaction.downTargets[pointerIndex] && interaction.downTargets[pointerIndex] === eventTarget))) {\n return [];\n }\n\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n path,\n targets: [],\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (type === 'hold') {\n signalArg.targets = filter(signalArg.targets, target =>\n target.eventable.options.holdDuration === interaction.holdTimers[pointerIndex].duration);\n }\n\n return signalArg.targets;\n}\n\nInteraction.signals.on('update-pointer-down', function ({ interaction, pointerIndex }) {\n interaction.holdTimers[pointerIndex] = { duration: Infinity, timeout: null };\n});\n\nInteraction.signals.on('remove-pointer', function ({ interaction, pointerIndex }) {\n interaction.holdTimers.splice(pointerIndex, 1);\n});\n\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget, duplicateMove }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n if (!duplicateMove && (!interaction.pointerIsDown || interaction.pointerWasMoved)) {\n if (interaction.pointerIsDown) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n\n fire({\n interaction, pointer, event, eventTarget,\n type: 'move',\n });\n }\n});\n\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget, pointerIndex }) {\n // copy event to be used in timeout for IE8\n const eventCopy = browser.isIE8? utils.extend({}, event) : event;\n\n const timer = interaction.holdTimers[pointerIndex];\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'hold',\n targets: [],\n path,\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (!signalArg.targets.length) { return; }\n\n let minDuration = Infinity;\n\n for (let i = 0; i < signalArg.targets.length; i++) {\n const target = signalArg.targets[i];\n const holdDuration = target.eventable.options.holdDuration;\n\n if (holdDuration < minDuration) {\n minDuration = holdDuration;\n }\n }\n\n timer.duration = minDuration;\n timer.timeout = setTimeout(function () {\n fire({\n interaction, eventCopy, eventTarget,\n pointer: browser.isIE8? eventCopy : pointer,\n type: 'hold',\n });\n }, minDuration);\n});\n\nInteraction.signals.on('up', ({ interaction, pointer, event, eventTarget }) => {\n if (!interaction.pointerWasMoved) {\n fire({ interaction, eventTarget, pointer, event, type: 'tap' });\n }\n});\n\n['up', 'cancel'].forEach(function (signalName) {\n Interaction.signals.on(signalName, function ({ interaction, pointerIndex }) {\n if (interaction.holdTimers[pointerIndex]) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n });\n});\n\nfunction createSignalListener (type) {\n return function ({ interaction, pointer, event, eventTarget }) {\n fire({ interaction, eventTarget, pointer, event, type });\n };\n}\n\nfor (let i = 0; i < simpleSignals.length; i++) {\n Interaction.signals.on(simpleSignals[i], createSignalListener(simpleEvents[i]));\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.prevTap = null; // the most recent tap event on this interaction\n interaction.tapTime = 0; // time of the most recent tap event\n interaction.holdTimers = []; // [{ duration, timeout }]\n});\n\ndefaults.pointerEvents = pointerEvents.defaults;\nmodule.exports = pointerEvents;\n","const pointerEvents = require('./base');\nconst Interaction = require('../Interaction');\n\npointerEvents.signals.on('new', onNew);\npointerEvents.signals.on('fired', onFired);\n\nfor (const signal of ['move', 'up', 'cancel', 'endall']) {\n Interaction.signals.on(signal, endHoldRepeat);\n}\n\nfunction onNew ({ pointerEvent }) {\n if (pointerEvent.type !== 'hold') { return; }\n\n pointerEvent.count = (pointerEvent.count || 0) + 1;\n}\n\nfunction onFired ({ interaction, pointerEvent, eventTarget, targets }) {\n if (pointerEvent.type !== 'hold' || !targets.length) { return; }\n\n // get the repeat interval from the first eventable\n const interval = targets[0].eventable.options.holdRepeatInterval;\n\n // don't repeat if the interval is 0 or less\n if (interval <= 0) { return; }\n\n // set a timeout to fire the holdrepeat event\n interaction.holdIntervalHandle = setTimeout(function () {\n pointerEvents.fire({\n interaction,\n eventTarget,\n type: 'hold',\n pointer: pointerEvent,\n event: pointerEvent,\n });\n }, interval);\n}\n\nfunction endHoldRepeat ({ interaction }) {\n // set the interaction's holdStopTime property\n // to stop further holdRepeat events\n if (interaction.holdIntervalHandle) {\n clearInterval(interaction.holdIntervalHandle);\n interaction.holdIntervalHandle = null;\n }\n}\n\n// don't repeat by default\npointerEvents.defaults.holdRepeatInterval = 0;\npointerEvents.types.push('holdrepeat');\n\nmodule.exports = {\n onNew,\n onFired,\n endHoldRepeat,\n};\n","const pointerEvents = require('./base');\nconst Interactable = require('../Interactable');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\nconst scope = require('../scope');\nconst extend = require('../utils/extend');\nconst { merge } = require('../utils/arr');\n\npointerEvents.signals.on('collect-targets', function ({ targets, element, type, eventTarget }) {\n function collectSelectors (interactable, selector, context) {\n const els = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && is.element(element)\n && domUtils.matchesSelector(element, selector, els)\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n const interactable = scope.interactables.get(element);\n\n if (interactable) {\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n scope.interactables.forEachSelector(collectSelectors, element);\n});\n\nInteractable.signals.on('new', function ({ interactable }) {\n interactable.events.getRect = function (element) {\n return interactable.getRect(element);\n };\n});\n\nInteractable.signals.on('set', function ({ interactable, options }) {\n extend(interactable.events.options, pointerEvents.defaults);\n extend(interactable.events.options, options);\n});\n\nmerge(Interactable.eventTypes, pointerEvents.types);\n\nInteractable.prototype.pointerEvents = function (options) {\n extend(this.events.options, options);\n\n return this;\n};\n\nconst __backCompatOption = Interactable.prototype._backCompatOption;\n\nInteractable.prototype._backCompatOption = function (optionName, newValue) {\n const ret = __backCompatOption.call(this, optionName, newValue);\n\n if (ret === this) {\n this.events.options[optionName] = newValue;\n }\n\n return ret;\n};\n\nInteractable.settingsMethods.push('pointerEvents');\n","const utils = require('./utils');\nconst events = require('./utils/events');\nconst signals = require('./utils/Signals').new();\n\nconst scope = {\n signals,\n events,\n utils,\n\n // main document\n document: require('./utils/domObjects').document,\n // all documents being listened to\n documents: [],\n\n addDocument: function (doc, win) {\n // do nothing if document is already known\n if (utils.contains(scope.documents, doc)) { return false; }\n\n win = win || scope.getWindow(doc);\n\n scope.documents.push(doc);\n events.documents.push(doc);\n\n // don't add an unload event for the main document\n // so that the page may be cached in browser history\n if (doc !== scope.document) {\n events.add(win, 'unload', scope.onWindowUnload);\n }\n\n signals.fire('add-document', { doc, win });\n },\n\n removeDocument: function (doc, win) {\n const index = utils.indexOf(scope.documents, doc);\n\n win = win || scope.getWindow(doc);\n\n events.remove(win, 'unload', scope.onWindowUnload);\n\n scope.documents.splice(index, 1);\n events.documents.splice(index, 1);\n\n signals.fire('remove-document', { win, doc });\n },\n\n onWindowUnload: function () {\n scope.removeDocument(this.document, this);\n },\n};\n\nmodule.exports = scope;\n","const { indexOf } = require('./arr');\n\nclass Signals {\n constructor () {\n this.listeners = {\n // signalName: [listeners],\n };\n }\n\n on (name, listener) {\n if (!this.listeners[name]) {\n this.listeners[name] = [listener];\n return;\n }\n\n this.listeners[name].push(listener);\n }\n\n off (name, listener) {\n if (!this.listeners[name]) { return; }\n\n const index = indexOf(this.listeners[name], listener);\n\n if (index !== -1) {\n this.listeners[name].splice(index, 1);\n }\n }\n\n fire (name, arg) {\n const targetListeners = this.listeners[name];\n\n if (!targetListeners) { return; }\n\n for (let i = 0; i < targetListeners.length; i++) {\n if (targetListeners[i](arg, name) === false) {\n return;\n }\n }\n }\n}\n\nSignals.new = function () {\n return new Signals();\n};\n\nmodule.exports = Signals;\n","function indexOf (array, target) {\n for (let i = 0, len = array.length; i < len; i++) {\n if (array[i] === target) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction contains (array, target) {\n return indexOf(array, target) !== -1;\n}\n\nfunction merge (target, source) {\n for (let i = 0; i < source.length; i++) {\n target.push(source[i]);\n }\n\n return target;\n}\n\nfunction filter (array, test) {\n const result = [];\n\n for (let i = 0; i < array.length; i++) {\n if (test(array[i])) {\n result.push(array[i]);\n }\n }\n\n return result;\n}\n\nmodule.exports = {\n indexOf,\n contains,\n merge,\n filter,\n};\n","const { window } = require('./window');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst Element = domObjects.Element;\nconst navigator = window.navigator;\n\nconst browser = {\n // Does the browser support touch input?\n supportsTouch: !!(('ontouchstart' in window) || is.function(window.DocumentTouch)\n && domObjects.document instanceof window.DocumentTouch),\n\n // Does the browser support PointerEvents\n supportsPointerEvent: !!domObjects.PointerEvent,\n\n isIE8: ('attachEvent' in window) && !('addEventListener' in window),\n\n // Opera Mobile must be handled differently\n isOperaMobile: (navigator.appName === 'Opera'\n && browser.supportsTouch\n && navigator.userAgent.match('Presto')),\n\n // scrolling doesn't change the result of getClientRects on iOS 7\n isIOS7: (/iP(hone|od|ad)/.test(navigator.platform)\n && /OS 7[^\\d]/.test(navigator.appVersion)),\n\n isIe9OrOlder: /MSIE (8|9)/.test(navigator.userAgent),\n\n // prefix matchesSelector\n prefixedMatchesSelector: 'matches' in Element.prototype\n ? 'matches': 'webkitMatchesSelector' in Element.prototype\n ? 'webkitMatchesSelector': 'mozMatchesSelector' in Element.prototype\n ? 'mozMatchesSelector': 'oMatchesSelector' in Element.prototype\n ? 'oMatchesSelector': 'msMatchesSelector',\n\n useMatchesSelectorPolyfill: false,\n\n pEventTypes: (domObjects.PointerEvent\n ? (domObjects.PointerEvent === window.MSPointerEvent\n ? {\n up: 'MSPointerUp',\n down: 'MSPointerDown',\n over: 'mouseover',\n out: 'mouseout',\n move: 'MSPointerMove',\n cancel: 'MSPointerCancel',\n }\n : {\n up: 'pointerup',\n down: 'pointerdown',\n over: 'pointerover',\n out: 'pointerout',\n move: 'pointermove',\n cancel: 'pointercancel',\n })\n : null),\n\n // because Webkit and Opera still use 'mousewheel' event type\n wheelEvent: 'onmousewheel' in domObjects.document? 'mousewheel': 'wheel',\n\n};\n\nbrowser.useMatchesSelectorPolyfill = !is.function(Element.prototype[browser.prefixedMatchesSelector]);\n\nmodule.exports = browser;\n","const domObjects = {};\nconst win = require('./window').window;\n\nfunction blank () {}\n\ndomObjects.document = win.document;\ndomObjects.DocumentFragment = win.DocumentFragment || blank;\ndomObjects.SVGElement = win.SVGElement || blank;\ndomObjects.SVGSVGElement = win.SVGSVGElement || blank;\ndomObjects.SVGElementInstance = win.SVGElementInstance || blank;\ndomObjects.Element = win.Element || blank;\ndomObjects.HTMLElement = win.HTMLElement || domObjects.Element;\n\ndomObjects.Event = win.Event;\ndomObjects.Touch = win.Touch || blank;\ndomObjects.PointerEvent = (win.PointerEvent || win.MSPointerEvent);\n\nmodule.exports = domObjects;\n","const win = require('./window');\nconst browser = require('./browser');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst domUtils = {\n nodeContains: function (parent, child) {\n while (child) {\n if (child === parent) {\n return true;\n }\n\n child = child.parentNode;\n }\n\n return false;\n },\n\n closest: function (element, selector) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) { return element; }\n\n element = domUtils.parentNode(element);\n }\n\n return null;\n },\n\n parentNode: function (node) {\n let parent = node.parentNode;\n\n if (is.docFrag(parent)) {\n // skip past #shado-root fragments\n while ((parent = parent.host) && is.docFrag(parent)) {\n continue;\n }\n\n return parent;\n }\n\n return parent;\n },\n\n // taken from http://tanalin.com/en/blog/2012/12/matches-selector-ie8/ and modified\n matchesSelectorPolyfill: browser.useMatchesSelectorPolyfill\n ? function (element, selector, elems) {\n elems = elems || element.parentNode.querySelectorAll(selector);\n\n for (let i = 0, len = elems.length; i < len; i++) {\n if (elems[i] === element) {\n return true;\n }\n }\n\n return false;\n }\n : null,\n\n matchesSelector: function (element, selector, nodeList) {\n if (browser.useMatchesSelectorPolyfill) {\n return domUtils.matchesSelectorPolyfill(element, selector, nodeList);\n }\n\n // remove /deep/ from selectors if shadowDOM polyfill is used\n if (win.window !== win.realWindow) {\n selector = selector.replace(/\\/deep\\//g, ' ');\n }\n\n return element[browser.prefixedMatchesSelector](selector);\n },\n\n // Test for the element that's \"above\" all other qualifiers\n indexOfDeepestElement: function (elements) {\n let deepestZoneParents = [];\n let dropzoneParents = [];\n let dropzone;\n let deepestZone = elements[0];\n let index = deepestZone? 0: -1;\n let parent;\n let child;\n let i;\n let n;\n\n for (i = 1; i < elements.length; i++) {\n dropzone = elements[i];\n\n // an element might belong to multiple selector dropzones\n if (!dropzone || dropzone === deepestZone) {\n continue;\n }\n\n if (!deepestZone) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n // check if the deepest or current are document.documentElement or document.rootElement\n // - if the current dropzone is, do nothing and continue\n if (dropzone.parentNode === dropzone.ownerDocument) {\n continue;\n }\n // - if deepest is, update with the current dropzone and continue to next\n else if (deepestZone.parentNode === dropzone.ownerDocument) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n if (!deepestZoneParents.length) {\n parent = deepestZone;\n while (parent.parentNode && parent.parentNode !== parent.ownerDocument) {\n deepestZoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n }\n\n // if this element is an svg element and the current deepest is\n // an HTMLElement\n if (deepestZone instanceof domObjects.HTMLElement\n && dropzone instanceof domObjects.SVGElement\n && !(dropzone instanceof domObjects.SVGSVGElement)) {\n\n if (dropzone === deepestZone.parentNode) {\n continue;\n }\n\n parent = dropzone.ownerSVGElement;\n }\n else {\n parent = dropzone;\n }\n\n dropzoneParents = [];\n\n while (parent.parentNode !== parent.ownerDocument) {\n dropzoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n\n n = 0;\n\n // get (position of last common ancestor) + 1\n while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) {\n n++;\n }\n\n const parents = [\n dropzoneParents[n - 1],\n dropzoneParents[n],\n deepestZoneParents[n],\n ];\n\n child = parents[0].lastChild;\n\n while (child) {\n if (child === parents[1]) {\n deepestZone = dropzone;\n index = i;\n deepestZoneParents = [];\n\n break;\n }\n else if (child === parents[2]) {\n break;\n }\n\n child = child.previousSibling;\n }\n }\n\n return index;\n },\n\n matchesUpTo: function (element, selector, limit) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) {\n return true;\n }\n\n element = domUtils.parentNode(element);\n\n if (element === limit) {\n return domUtils.matchesSelector(element, selector);\n }\n }\n\n return false;\n },\n\n getActualElement: function (element) {\n return (element instanceof domObjects.SVGElementInstance\n ? element.correspondingUseElement\n : element);\n },\n\n getScrollXY: function (relevantWindow) {\n relevantWindow = relevantWindow || win.window;\n return {\n x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft,\n y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop,\n };\n },\n\n getElementClientRect: function (element) {\n const clientRect = (element instanceof domObjects.SVGElement\n ? element.getBoundingClientRect()\n : element.getClientRects()[0]);\n\n return clientRect && {\n left : clientRect.left,\n right : clientRect.right,\n top : clientRect.top,\n bottom: clientRect.bottom,\n width : clientRect.width || clientRect.right - clientRect.left,\n height: clientRect.height || clientRect.bottom - clientRect.top,\n };\n },\n\n getElementRect: function (element) {\n const clientRect = domUtils.getElementClientRect(element);\n\n if (!browser.isIOS7 && clientRect) {\n const scroll = domUtils.getScrollXY(win.getWindow(element));\n\n clientRect.left += scroll.x;\n clientRect.right += scroll.x;\n clientRect.top += scroll.y;\n clientRect.bottom += scroll.y;\n }\n\n return clientRect;\n },\n\n getPath: function (element) {\n const path = [];\n\n while (element) {\n path.push(element);\n element = domUtils.parentNode(element);\n }\n\n return path;\n },\n\n trySelector: value => {\n if (!is.string(value)) { return false; }\n\n // an exception will be raised if it is invalid\n domObjects.document.querySelector(value);\n return true;\n },\n};\n\nmodule.exports = domUtils;\n","const is = require('./is');\nconst domUtils = require('./domUtils');\nconst pExtend = require('./pointerExtend');\n\nconst { window, getWindow } = require('./window');\nconst { indexOf, contains } = require('./arr');\n\nconst useAttachEvent = ('attachEvent' in window) && !('addEventListener' in window);\nconst addEvent = useAttachEvent? 'attachEvent': 'addEventListener';\nconst removeEvent = useAttachEvent? 'detachEvent': 'removeEventListener';\nconst on = useAttachEvent? 'on': '';\n\nconst elements = [];\nconst targets = [];\nconst attachedListeners = [];\n\n// {\n// type: {\n// selectors: ['selector', ...],\n// contexts : [document, ...],\n// listeners: [[listener, capture, passive], ...]\n// }\n// }\nconst delegatedEvents = {};\n\nconst documents = [];\n\nconst supportsOptions = !useAttachEvent && (() => {\n let supported = false;\n\n window.document.createElement('div').addEventListener('test', null, {\n get capture () { supported = true; },\n });\n\n return supported;\n})();\n\nfunction add (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n let elementIndex = indexOf(elements, element);\n let target = targets[elementIndex];\n\n if (!target) {\n target = {\n events: {},\n typeCount: 0,\n };\n\n elementIndex = elements.push(element) - 1;\n targets.push(target);\n\n attachedListeners.push(useAttachEvent\n ? {\n supplied: [],\n wrapped : [],\n useCount: [],\n }\n : null);\n }\n\n if (!target.events[type]) {\n target.events[type] = [];\n target.typeCount++;\n }\n\n if (!contains(target.events[type], listener)) {\n let ret;\n\n if (useAttachEvent) {\n const { supplied, wrapped, useCount } = attachedListeners[elementIndex];\n const listenerIndex = indexOf(supplied, listener);\n\n const wrappedListener = wrapped[listenerIndex] || function (event) {\n if (!event.immediatePropagationStopped) {\n event.target = event.srcElement;\n event.currentTarget = element;\n\n event.preventDefault = event.preventDefault || preventDef;\n event.stopPropagation = event.stopPropagation || stopProp;\n event.stopImmediatePropagation = event.stopImmediatePropagation || stopImmProp;\n\n if (/mouse|click/.test(event.type)) {\n event.pageX = event.clientX + getWindow(element).document.documentElement.scrollLeft;\n event.pageY = event.clientY + getWindow(element).document.documentElement.scrollTop;\n }\n\n listener(event);\n }\n };\n\n ret = element[addEvent](on + type, wrappedListener, !!options.capture);\n\n if (listenerIndex === -1) {\n supplied.push(listener);\n wrapped.push(wrappedListener);\n useCount.push(1);\n }\n else {\n useCount[listenerIndex]++;\n }\n }\n else {\n ret = element[addEvent](type, listener, supportsOptions? options : !!options.capture);\n }\n target.events[type].push(listener);\n\n return ret;\n }\n}\n\nfunction remove (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const elementIndex = indexOf(elements, element);\n const target = targets[elementIndex];\n\n if (!target || !target.events) {\n return;\n }\n\n let wrappedListener = listener;\n let listeners;\n let listenerIndex;\n\n if (useAttachEvent) {\n listeners = attachedListeners[elementIndex];\n listenerIndex = indexOf(listeners.supplied, listener);\n wrappedListener = listeners.wrapped[listenerIndex];\n }\n\n if (type === 'all') {\n for (type in target.events) {\n if (target.events.hasOwnProperty(type)) {\n remove(element, type, 'all');\n }\n }\n return;\n }\n\n if (target.events[type]) {\n const len = target.events[type].length;\n\n if (listener === 'all') {\n for (let i = 0; i < len; i++) {\n remove(element, type, target.events[type][i], options);\n }\n return;\n }\n else {\n for (let i = 0; i < len; i++) {\n if (target.events[type][i] === listener) {\n element[removeEvent](on + type, wrappedListener, supportsOptions? options : !!options.capture);\n target.events[type].splice(i, 1);\n\n if (useAttachEvent && listeners) {\n listeners.useCount[listenerIndex]--;\n if (listeners.useCount[listenerIndex] === 0) {\n listeners.supplied.splice(listenerIndex, 1);\n listeners.wrapped.splice(listenerIndex, 1);\n listeners.useCount.splice(listenerIndex, 1);\n }\n }\n\n break;\n }\n }\n }\n\n if (target.events[type] && target.events[type].length === 0) {\n target.events[type] = null;\n target.typeCount--;\n }\n }\n\n if (!target.typeCount) {\n targets.splice(elementIndex, 1);\n elements.splice(elementIndex, 1);\n attachedListeners.splice(elementIndex, 1);\n }\n}\n\nfunction addDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n if (!delegatedEvents[type]) {\n delegatedEvents[type] = {\n selectors: [],\n contexts : [],\n listeners: [],\n };\n\n // add delegate listener functions\n for (let i = 0; i < documents.length; i++) {\n add(documents[i], type, delegateListener);\n add(documents[i], type, delegateUseCapture, true);\n }\n }\n\n const delegated = delegatedEvents[type];\n let index;\n\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n break;\n }\n }\n\n if (index === -1) {\n index = delegated.selectors.length;\n\n delegated.selectors.push(selector);\n delegated.contexts .push(context);\n delegated.listeners.push([]);\n }\n\n // keep listener and capture and passive flags\n delegated.listeners[index].push([listener, !!options.capture, options.passive]);\n}\n\nfunction removeDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const delegated = delegatedEvents[type];\n let matchFound = false;\n let index;\n\n if (!delegated) { return; }\n\n // count from last index of delegated to 0\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n // look for matching selector and context Node\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n\n const listeners = delegated.listeners[index];\n\n // each item of the listeners array is an array: [function, capture, passive]\n for (let i = listeners.length - 1; i >= 0; i--) {\n const [fn, capture, passive] = listeners[i];\n\n // check if the listener functions and capture and passive flags match\n if (fn === listener && capture === !!options.capture && passive === options.passive) {\n // remove the listener from the array of listeners\n listeners.splice(i, 1);\n\n // if all listeners for this interactable have been removed\n // remove the interactable from the delegated arrays\n if (!listeners.length) {\n delegated.selectors.splice(index, 1);\n delegated.contexts .splice(index, 1);\n delegated.listeners.splice(index, 1);\n\n // remove delegate function from context\n remove(context, type, delegateListener);\n remove(context, type, delegateUseCapture, true);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegatedEvents[type] = null;\n }\n }\n\n // only remove one listener\n matchFound = true;\n break;\n }\n }\n\n if (matchFound) { break; }\n }\n }\n}\n\n// bound to the interactable context when a DOM event\n// listener is added to a selector interactable\nfunction delegateListener (event, optionalArg) {\n const options = getOptions(optionalArg);\n const fakeEvent = {};\n const delegated = delegatedEvents[event.type];\n const eventTarget = (domUtils.getActualElement(event.path\n ? event.path[0]\n : event.target));\n let element = eventTarget;\n\n // duplicate the event so that currentTarget can be changed\n pExtend(fakeEvent, event);\n\n fakeEvent.originalEvent = event;\n fakeEvent.preventDefault = preventOriginalDefault;\n\n // climb up document tree looking for selector matches\n while (is.element(element)) {\n for (let i = 0; i < delegated.selectors.length; i++) {\n const selector = delegated.selectors[i];\n const context = delegated.contexts[i];\n\n if (domUtils.matchesSelector(element, selector)\n && domUtils.nodeContains(context, eventTarget)\n && domUtils.nodeContains(context, element)) {\n\n const listeners = delegated.listeners[i];\n\n fakeEvent.currentTarget = element;\n\n for (let j = 0; j < listeners.length; j++) {\n const [fn, capture, passive] = listeners[j];\n\n if (capture === !!options.capture && passive === options.passive) {\n fn(fakeEvent);\n }\n }\n }\n }\n\n element = domUtils.parentNode(element);\n }\n}\n\nfunction delegateUseCapture (event) {\n return delegateListener.call(this, event, true);\n}\n\nfunction preventDef () {\n this.returnValue = false;\n}\n\nfunction preventOriginalDefault () {\n this.originalEvent.preventDefault();\n}\n\nfunction stopProp () {\n this.cancelBubble = true;\n}\n\nfunction stopImmProp () {\n this.cancelBubble = true;\n this.immediatePropagationStopped = true;\n}\n\nfunction getOptions (param) {\n return is.object(param)? param : { capture: param };\n}\n\nmodule.exports = {\n add,\n remove,\n\n addDelegate,\n removeDelegate,\n\n delegateListener,\n delegateUseCapture,\n delegatedEvents,\n documents,\n\n useAttachEvent,\n supportsOptions,\n\n _elements: elements,\n _targets: targets,\n _attachedListeners: attachedListeners,\n};\n","module.exports = function extend (dest, source) {\n for (const prop in source) {\n dest[prop] = source[prop];\n }\n return dest;\n};\n","const {\n resolveRectLike,\n rectToXY,\n} = require('./rect');\n\nmodule.exports = function (target, element, action) {\n const actionOptions = target.options[action];\n const actionOrigin = actionOptions && actionOptions.origin;\n const origin = actionOrigin || target.options.origin;\n\n const originRect = resolveRectLike(origin, target, element, [target && element]);\n\n return rectToXY(originRect) || { x: 0, y: 0 };\n};\n","module.exports = (x, y) => Math.sqrt(x * x + y * y);\n","const extend = require('./extend');\nconst win = require('./window');\n\nconst utils = {\n warnOnce: function (method, message) {\n let warned = false;\n\n return function () {\n if (!warned) {\n win.window.console.warn(message);\n warned = true;\n }\n\n return method.apply(this, arguments);\n };\n },\n\n // http://stackoverflow.com/a/5634528/2280888\n _getQBezierValue: function (t, p1, p2, p3) {\n const iT = 1 - t;\n return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3;\n },\n\n getQuadraticCurvePoint: function (startX, startY, cpX, cpY, endX, endY, position) {\n return {\n x: utils._getQBezierValue(position, startX, cpX, endX),\n y: utils._getQBezierValue(position, startY, cpY, endY),\n };\n },\n\n // http://gizma.com/easing/\n easeOutQuad: function (t, b, c, d) {\n t /= d;\n return -c * t*(t-2) + b;\n },\n\n copyAction: function (dest, src) {\n dest.name = src.name;\n dest.axis = src.axis;\n dest.edges = src.edges;\n\n return dest;\n },\n\n is : require('./is'),\n extend : extend,\n hypot : require('./hypot'),\n getOriginXY: require('./getOriginXY'),\n};\n\nextend(utils, require('./arr'));\nextend(utils, require('./domUtils'));\nextend(utils, require('./pointerUtils'));\nextend(utils, require('./rect'));\n\nmodule.exports = utils;\n","const scope = require('../scope');\nconst utils = require('./index');\nconst browser = require('./browser');\n\nconst finder = {\n methodOrder: [ 'simulationResume', 'mouse', 'hasPointer', 'idle' ],\n\n search: function (pointer, eventType, eventTarget) {\n const mouseEvent = (/mouse/i.test(pointer.pointerType || eventType)\n // MSPointerEvent.MSPOINTER_TYPE_MOUSE\n || pointer.pointerType === 4);\n const pointerId = utils.getPointerId(pointer);\n const details = { pointer, pointerId, mouseEvent, eventType, eventTarget };\n\n for (const method of finder.methodOrder) {\n const interaction = finder[method](details);\n\n if (interaction) {\n return interaction;\n }\n }\n },\n\n // try to resume simulation with a new pointer\n simulationResume: function ({ mouseEvent, eventType, eventTarget }) {\n if (!/down|start/i.test(eventType)) {\n return null;\n }\n\n for (const interaction of scope.interactions) {\n let element = eventTarget;\n\n if (interaction.simulation && interaction.simulation.allowResume\n && (interaction.mouse === mouseEvent)) {\n while (element) {\n // if the element is the interaction element\n if (element === interaction.element) {\n return interaction;\n }\n element = utils.parentNode(element);\n }\n }\n }\n\n return null;\n },\n\n // if it's a mouse interaction\n mouse: function ({ pointerId, mouseEvent, eventType }) {\n if (!mouseEvent && (browser.supportsTouch || browser.supportsPointerEvent)) {\n return null;\n }\n\n let firstNonActive;\n\n for (const interaction of scope.interactions) {\n if (interaction.mouse) {\n // if it's a down event, skip interactions with running simulations\n if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; }\n\n // if the interaction is active, return it immediately\n if (interaction.interacting()) {\n return interaction;\n }\n // otherwise save it and look for another active interaction\n else if (!firstNonActive) {\n firstNonActive = interaction;\n }\n }\n }\n\n // if no active mouse interaction was found use the first inactive mouse\n // interaction\n if (firstNonActive) {\n return firstNonActive;\n }\n\n // Find any interaction specifically for mouse.\n // ignore the interaction if the eventType is a mousedown, and a simulation\n // is active\n for (const interaction of scope.interactions) {\n if (interaction.mouse && !(/down/.test(eventType) && interaction.simulation)) {\n return interaction;\n }\n }\n\n return null;\n },\n\n // get interaction that has this pointer\n hasPointer: function ({ pointerId }) {\n for (const interaction of scope.interactions) {\n if (utils.contains(interaction.pointerIds, pointerId)) {\n return interaction;\n }\n }\n },\n\n // get first idle interaction\n idle: function ({ mouseEvent }) {\n for (const interaction of scope.interactions) {\n // if there's already a pointer held down\n if (interaction.pointerIds.length === 1) {\n const target = interaction.target;\n // don't add this pointer if there is a target interactable and it\n // isn't gesturable\n if (target && !target.options.gesture.enabled) {\n continue;\n }\n }\n // maximum of 2 pointers per interaction\n else if (interaction.pointerIds.length >= 2) {\n continue;\n }\n\n if (!interaction.interacting() && (mouseEvent === interaction.mouse)) {\n return interaction;\n }\n }\n\n return null;\n },\n};\n\nmodule.exports = finder;\n","const win = require('./window');\nconst isWindow = require('./isWindow');\n\nconst is = {\n array : () => {},\n\n window : thing => thing === win.window || isWindow(thing),\n\n docFrag : thing => is.object(thing) && thing.nodeType === 11,\n\n object : thing => !!thing && (typeof thing === 'object'),\n\n function: thing => typeof thing === 'function',\n\n number : thing => typeof thing === 'number' ,\n\n bool : thing => typeof thing === 'boolean' ,\n\n string : thing => typeof thing === 'string' ,\n\n element: thing => {\n if (!thing || (typeof thing !== 'object')) { return false; }\n\n const _window = win.getWindow(thing) || win.window;\n\n return (/object|function/.test(typeof _window.Element)\n ? thing instanceof _window.Element //DOM2\n : thing.nodeType === 1 && typeof thing.nodeName === 'string');\n },\n};\n\nis.array = thing => (is.object(thing)\n && (typeof thing.length !== 'undefined')\n && is.function(thing.splice));\n\nmodule.exports = is;\n","module.exports = (thing) => !!(thing && thing.Window) && (thing instanceof thing.Window);\n","function pointerExtend (dest, source) {\n for (const prop in source) {\n const prefixedPropREs = module.exports.prefixedPropREs;\n let deprecated = false;\n\n // skip deprecated prefixed properties\n for (const vendor in prefixedPropREs) {\n if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) {\n deprecated = true;\n break;\n }\n }\n\n if (!deprecated && typeof source[prop] !== 'function') {\n dest[prop] = source[prop];\n }\n }\n return dest;\n}\n\npointerExtend.prefixedPropREs = {\n webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/,\n};\n\nmodule.exports = pointerExtend;\n","const hypot = require('./hypot');\nconst browser = require('./browser');\nconst dom = require('./domObjects');\nconst domUtils = require('./domUtils');\nconst is = require('./is');\nconst pointerExtend = require('./pointerExtend');\n\nconst pointerUtils = {\n copyCoords: function (dest, src) {\n dest.page = dest.page || {};\n dest.page.x = src.page.x;\n dest.page.y = src.page.y;\n\n dest.client = dest.client || {};\n dest.client.x = src.client.x;\n dest.client.y = src.client.y;\n\n dest.timeStamp = src.timeStamp;\n },\n\n setCoordDeltas: function (targetObj, prev, cur) {\n targetObj.page.x = cur.page.x - prev.page.x;\n targetObj.page.y = cur.page.y - prev.page.y;\n targetObj.client.x = cur.client.x - prev.client.x;\n targetObj.client.y = cur.client.y - prev.client.y;\n targetObj.timeStamp = cur.timeStamp - prev.timeStamp;\n\n // set pointer velocity\n const dt = Math.max(targetObj.timeStamp / 1000, 0.001);\n\n targetObj.page.speed = hypot(targetObj.page.x, targetObj.page.y) / dt;\n targetObj.page.vx = targetObj.page.x / dt;\n targetObj.page.vy = targetObj.page.y / dt;\n\n targetObj.client.speed = hypot(targetObj.client.x, targetObj.page.y) / dt;\n targetObj.client.vx = targetObj.client.x / dt;\n targetObj.client.vy = targetObj.client.y / dt;\n },\n\n isNativePointer: function (pointer) {\n return (pointer instanceof dom.Event || pointer instanceof dom.Touch);\n },\n\n // Get specified X/Y coords for mouse or event.touches[0]\n getXY: function (type, pointer, xy) {\n xy = xy || {};\n type = type || 'page';\n\n xy.x = pointer[type + 'X'];\n xy.y = pointer[type + 'Y'];\n\n return xy;\n },\n\n getPageXY: function (pointer, page) {\n page = page || {};\n\n // Opera Mobile handles the viewport and scrolling oddly\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n pointerUtils.getXY('screen', pointer, page);\n\n page.x += window.scrollX;\n page.y += window.scrollY;\n }\n else {\n pointerUtils.getXY('page', pointer, page);\n }\n\n return page;\n },\n\n getClientXY: function (pointer, client) {\n client = client || {};\n\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n // Opera Mobile handles the viewport and scrolling oddly\n pointerUtils.getXY('screen', pointer, client);\n }\n else {\n pointerUtils.getXY('client', pointer, client);\n }\n\n return client;\n },\n\n getPointerId: function (pointer) {\n return is.number(pointer.pointerId)? pointer.pointerId : pointer.identifier;\n },\n\n setCoords: function (targetObj, pointers, timeStamp) {\n const pointer = (pointers.length > 1\n ? pointerUtils.pointerAverage(pointers)\n : pointers[0]);\n\n const tmpXY = {};\n\n pointerUtils.getPageXY(pointer, tmpXY);\n targetObj.page.x = tmpXY.x;\n targetObj.page.y = tmpXY.y;\n\n pointerUtils.getClientXY(pointer, tmpXY);\n targetObj.client.x = tmpXY.x;\n targetObj.client.y = tmpXY.y;\n\n targetObj.timeStamp = is.number(timeStamp) ? timeStamp :new Date().getTime();\n },\n\n pointerExtend: pointerExtend,\n\n getTouchPair: function (event) {\n const touches = [];\n\n // array of touches is supplied\n if (is.array(event)) {\n touches[0] = event[0];\n touches[1] = event[1];\n }\n // an event\n else {\n if (event.type === 'touchend') {\n if (event.touches.length === 1) {\n touches[0] = event.touches[0];\n touches[1] = event.changedTouches[0];\n }\n else if (event.touches.length === 0) {\n touches[0] = event.changedTouches[0];\n touches[1] = event.changedTouches[1];\n }\n }\n else {\n touches[0] = event.touches[0];\n touches[1] = event.touches[1];\n }\n }\n\n return touches;\n },\n\n pointerAverage: function (pointers) {\n const average = {\n pageX : 0,\n pageY : 0,\n clientX: 0,\n clientY: 0,\n screenX: 0,\n screenY: 0,\n };\n\n for (const pointer of pointers) {\n for (const prop in average) {\n average[prop] += pointer[prop];\n }\n }\n for (const prop in average) {\n average[prop] /= pointers.length;\n }\n\n return average;\n },\n\n touchBBox: function (event) {\n if (!event.length && !(event.touches && event.touches.length > 1)) {\n return;\n }\n\n const touches = pointerUtils.getTouchPair(event);\n const minX = Math.min(touches[0].pageX, touches[1].pageX);\n const minY = Math.min(touches[0].pageY, touches[1].pageY);\n const maxX = Math.max(touches[0].pageX, touches[1].pageX);\n const maxY = Math.max(touches[0].pageY, touches[1].pageY);\n\n return {\n x: minX,\n y: minY,\n left: minX,\n top: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n },\n\n touchDistance: function (event, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n\n\n const dx = touches[0][sourceX] - touches[1][sourceX];\n const dy = touches[0][sourceY] - touches[1][sourceY];\n\n return hypot(dx, dy);\n },\n\n touchAngle: function (event, prevAngle, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n const dx = touches[1][sourceX] - touches[0][sourceX];\n const dy = touches[1][sourceY] - touches[0][sourceY];\n const angle = 180 * Math.atan2(dy , dx) / Math.PI;\n\n return angle;\n },\n\n getPointerType: function (pointer, interaction) {\n // if the PointerEvent API isn't available, then the pointer must be ither\n // a MouseEvent or TouchEvent\n if (interaction.mouse) { return 'mouse'; }\n if (!browser.supportsPointerEvent) { return 'touch'; }\n\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : [undefined, undefined,'touch', 'pen', 'mouse'][pointer.pointerType];\n },\n\n // [ event.target, event.currentTarget ]\n getEventTargets: function (event) {\n return [\n domUtils.getActualElement(event.path ? event.path[0] : event.target),\n domUtils.getActualElement(event.currentTarget),\n ];\n },\n};\n\nmodule.exports = pointerUtils;\n","const { window } = require('./window');\n\nconst vendors = ['ms', 'moz', 'webkit', 'o'];\nlet lastTime = 0;\nlet request;\nlet cancel;\n\nfor (let x = 0; x < vendors.length && !window.requestAnimationFrame; x++) {\n request = window[vendors[x] + 'RequestAnimationFrame'];\n cancel = window[vendors[x] +'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n}\n\nif (!request) {\n request = function (callback) {\n const currTime = new Date().getTime();\n const timeToCall = Math.max(0, 16 - (currTime - lastTime));\n const id = setTimeout(function () { callback(currTime + timeToCall); },\n timeToCall);\n\n lastTime = currTime + timeToCall;\n return id;\n };\n}\n\nif (!cancel) {\n cancel = function (id) {\n clearTimeout(id);\n };\n}\n\nmodule.exports = {\n request,\n cancel,\n};\n","const extend = require('./extend');\nconst is = require('./is');\nconst {\n closest,\n parentNode,\n getElementRect,\n} = require('./domUtils');\n\nconst rectUtils = {\n getStringOptionResult: function (value, interactable, element) {\n if (!is.string(value)) {\n return null;\n }\n\n if (value === 'parent') {\n value = parentNode(element);\n }\n else if (value === 'self') {\n value = interactable.getRect(element);\n }\n else {\n value = closest(element, value);\n }\n\n return value;\n },\n\n resolveRectLike: function (value, interactable, element, functionArgs) {\n value = rectUtils.getStringOptionResult(value, interactable, element) || value;\n\n if (is.function(value)) {\n value = value.apply(null, functionArgs);\n }\n\n if (is.element(value)) {\n value = getElementRect(value);\n }\n\n return value;\n },\n\n rectToXY: function (rect) {\n return rect && {\n x: 'x' in rect ? rect.x : rect.left,\n y: 'y' in rect ? rect.y : rect.top,\n };\n },\n\n xywhToTlbr: function (rect) {\n if (rect && !('left' in rect && 'top' in rect)) {\n rect = extend({}, rect);\n\n rect.left = rect.x || 0;\n rect.top = rect.y || 0;\n rect.right = rect.right || (rect.left + rect.width);\n rect.bottom = rect.bottom || (rect.top + rect.height);\n }\n\n return rect;\n },\n\n tlbrToXywh: function (rect) {\n if (rect && !('x' in rect && 'y' in rect)) {\n rect = extend({}, rect);\n\n rect.x = rect.left || 0;\n rect.top = rect.top || 0;\n rect.width = rect.width || (rect.right - rect.x);\n rect.height = rect.height || (rect.bottom - rect.y);\n }\n\n return rect;\n },\n};\n\nmodule.exports = rectUtils;\n","const win = module.exports;\nconst isWindow = require('./isWindow');\n\nfunction init (window) {\n // get wrapped window if using Shadow DOM polyfill\n\n win.realWindow = window;\n\n // create a TextNode\n const el = window.document.createTextNode('');\n\n // check if it's wrapped by a polyfill\n if (el.ownerDocument !== window.document\n && typeof window.wrap === 'function'\n && window.wrap(el) === el) {\n // use wrapped window\n window = window.wrap(window);\n }\n\n win.window = window;\n}\n\nif (typeof window === 'undefined') {\n win.window = undefined;\n win.realWindow = undefined;\n}\nelse {\n init(window);\n}\n\nwin.getWindow = function getWindow (node) {\n if (isWindow(node)) {\n return node;\n }\n\n const rootNode = (node.ownerDocument || node);\n\n return rootNode.defaultView || rootNode.parentWindow || win.window;\n};\n\nwin.init = init;\n"]} \ No newline at end of file +{"version":3,"sources":["src/header.js","node_modules/browser-pack/_prelude.js","index.js","src/Eventable.js","src/InteractEvent.js","src/Interactable.js","src/Interaction.js","src/actions/base.js","src/actions/drag.js","src/actions/drop.js","src/actions/gesture.js","src/actions/resize.js","src/autoScroll.js","src/autoStart/InteractableMethods.js","src/autoStart/base.js","src/autoStart/delay.js","src/autoStart/drag.js","src/autoStart/gesture.js","src/autoStart/resize.js","src/defaultOptions.js","src/index.js","src/inertia.js","src/interact.js","src/interactablePreventDefault.js","src/legacyBrowsers.js","src/modifiers/index.js","src/modifiers/restrict.js","src/modifiers/restrictEdges.js","src/modifiers/restrictSize.js","src/modifiers/snap.js","src/modifiers/snapSize.js","src/pointerEvents/PointerEvent.js","src/pointerEvents/base.js","src/pointerEvents/holdRepeat.js","src/pointerEvents/interactableTargets.js","src/scope.js","src/utils/Signals.js","src/utils/arr.js","src/utils/browser.js","src/utils/domObjects.js","src/utils/domUtils.js","src/utils/events.js","src/utils/extend.js","src/utils/getOriginXY.js","src/utils/hypot.js","src/utils/index.js","src/utils/interactionFinder.js","src/utils/is.js","src/utils/isWindow.js","src/utils/pointerExtend.js","src/utils/pointerUtils.js","src/utils/raf.js","src/utils/rect.js","src/utils/window.js"],"names":[],"mappings":";AAAA;AACA;AACA;AACA;AACA;AACA;ACLA,ADMA;AACA;;AEPA;;;;;;;;AAQA,IAAI,OAAO,MAAP,KAAkB,WAAtB,EAAmC;AACjC,SAAO,OAAP,GAAiB,UAAU,MAAV,EAAkB;AACjC,YAAQ,oBAAR,EAA8B,IAA9B,CAAmC,MAAnC;;AAEA,WAAO,QAAQ,aAAR,CAAP;AACD,GAJD;AAKD,CAND,MAOK;AACH,SAAO,OAAP,GAAiB,QAAQ,aAAR,CAAjB;AACD;;;;;;;eCjBmB,QAAQ,aAAR,C;IAAZ,O,YAAA,O;;AACR,IAAM,SAAS,QAAQ,mBAAR,CAAf;;AAEA,SAAS,yBAAT,CAAoC,KAApC,EAA2C,SAA3C,EAAsD;AACpD,OAAK,IAAI,IAAI,CAAR,EAAW,MAAM,UAAU,MAAhC,EAAwC,IAAI,GAAJ,IAAW,CAAC,MAAM,2BAA1D,EAAuF,GAAvF,EAA4F;AAC1F,cAAU,CAAV,EAAa,KAAb;AACD;AACF;;IAEK,S;AAEJ,qBAAa,OAAb,EAAsB;AAAA;;AACpB,SAAK,OAAL,GAAe,OAAO,EAAP,EAAW,WAAW,EAAtB,CAAf;AACD;;sBAED,I,iBAAM,K,EAAO;AACX,QAAI,kBAAJ;AACA,QAAM,UAAU,OAAO,MAAM,IAA7B;AACA,QAAM,SAAS,KAAK,MAApB;;AAEA;AACA,QAAK,YAAY,KAAK,MAAM,IAAX,CAAjB,EAAoC;AAClC,gCAA0B,KAA1B,EAAiC,SAAjC;AACD;;AAED;AACA,QAAI,KAAK,OAAL,CAAJ,EAAmB;AACjB,WAAK,OAAL,EAAc,KAAd;AACD;;AAED;AACA,QAAI,CAAC,MAAM,kBAAP,IAA6B,MAA7B,KAAwC,YAAY,OAAO,MAAM,IAAb,CAApD,CAAJ,EAA8E;AAC5E,gCAA0B,KAA1B,EAAiC,SAAjC;AACD;AACF,G;;sBAED,E,eAAI,S,EAAW,Q,EAAU;AACvB;AACA,QAAI,KAAK,SAAL,CAAJ,EAAqB;AACnB,WAAK,SAAL,EAAgB,IAAhB,CAAqB,QAArB;AACD,KAFD,MAGK;AACH,WAAK,SAAL,IAAkB,CAAC,QAAD,CAAlB;AACD;AACF,G;;sBAED,G,gBAAK,S,EAAW,Q,EAAU;AACxB;AACA,QAAM,YAAY,KAAK,SAAL,CAAlB;AACA,QAAM,QAAY,YAAW,QAAQ,SAAR,EAAmB,QAAnB,CAAX,GAA0C,CAAC,CAA7D;;AAEA,QAAI,UAAU,CAAC,CAAf,EAAkB;AAChB,gBAAU,MAAV,CAAiB,KAAjB,EAAwB,CAAxB;AACD;;AAED,QAAI,aAAa,UAAU,MAAV,KAAqB,CAAlC,IAAuC,CAAC,QAA5C,EAAsD;AACpD,WAAK,SAAL,IAAkB,QAAlB;AACD;AACF,G;;;;;AAGH,OAAO,OAAP,GAAiB,SAAjB;;;;;;;AC7DA,IAAM,SAAc,QAAQ,gBAAR,CAApB;AACA,IAAM,cAAc,QAAQ,qBAAR,CAApB;AACA,IAAM,WAAc,QAAQ,kBAAR,CAApB;AACA,IAAM,UAAc,QAAQ,iBAAR,EAA2B,GAA3B,EAApB;;IAEM,a;AACJ,yBAAa,WAAb,EAA0B,KAA1B,EAAiC,MAAjC,EAAyC,KAAzC,EAAgD,OAAhD,EAAyD,OAAzD,EAAkF;AAAA,QAAhB,MAAgB,uEAAP,KAAO;;AAAA;;AAChF,QAAM,SAAc,YAAY,MAAhC;AACA,QAAM,cAAc,CAAC,UAAU,OAAO,OAAjB,IAA4B,QAA7B,EAAuC,WAA3D;AACA,QAAM,SAAc,YAAY,MAAZ,EAAoB,OAApB,EAA6B,MAA7B,CAApB;AACA,QAAM,WAAc,UAAU,OAA9B;AACA,QAAM,SAAc,UAAU,KAA9B;AACA,QAAM,SAAc,WAAU,YAAY,WAAtB,GAAoC,YAAY,SAApE;AACA,QAAM,YAAc,YAAY,SAAhC;;AAEA,cAAU,WAAW,YAAY,OAAjC;;AAEA,QAAM,OAAS,OAAO,EAAP,EAAW,OAAO,IAAlB,CAAf;AACA,QAAM,SAAS,OAAO,EAAP,EAAW,OAAO,MAAlB,CAAf;;AAEA,SAAK,CAAL,IAAU,OAAO,CAAjB;AACA,SAAK,CAAL,IAAU,OAAO,CAAjB;;AAEA,WAAO,CAAP,IAAY,OAAO,CAAnB;AACA,WAAO,CAAP,IAAY,OAAO,CAAnB;;AAEA,SAAK,OAAL,GAAqB,MAAM,OAA3B;AACA,SAAK,MAAL,GAAqB,MAAM,MAA3B;AACA,SAAK,QAAL,GAAqB,MAAM,QAA3B;AACA,SAAK,OAAL,GAAqB,MAAM,OAA3B;AACA,SAAK,MAAL,GAAqB,MAAM,MAA3B;AACA,SAAK,OAAL,GAAqB,MAAM,OAA3B;AACA,SAAK,MAAL,GAAqB,OAArB;AACA,SAAK,aAAL,GAAqB,OAArB;AACA,SAAK,aAAL,GAAqB,WAAW,IAAhC;AACA,SAAK,MAAL,GAAqB,MAArB;AACA,SAAK,IAAL,GAAqB,UAAU,SAAS,EAAnB,CAArB;AACA,SAAK,WAAL,GAAqB,WAArB;AACA,SAAK,YAAL,GAAqB,MAArB;;AAEA,SAAK,EAAL,GAAU,WAAW,YAAY,SAAZ,CAAsB,YAAY,SAAZ,CAAsB,MAAtB,GAA+B,CAArD,CAAX,GACW,UAAU,EAD/B;;AAGA,QAAM,YAAY;AAChB,8BADgB;AAEhB,kBAFgB;AAGhB,oBAHgB;AAIhB,kBAJgB;AAKhB,sBALgB;AAMhB,sBANgB;AAOhB,gBAPgB;AAQhB,oBARgB;AAShB,oBATgB;AAUhB,wBAVgB;AAWhB,oBAXgB;AAYhB,8BAZgB;AAahB,cAAQ;AAbQ,KAAlB;;AAgBA,YAAQ,IAAR,CAAa,QAAb,EAAuB,SAAvB;;AAEA,QAAI,MAAJ,EAAY;AACV;AACA,WAAK,KAAL,GAAa,UAAU,KAAvB;AACA,WAAK,KAAL,GAAa,UAAU,KAAvB;AACA,WAAK,OAAL,GAAe,UAAU,OAAzB;AACA,WAAK,OAAL,GAAe,UAAU,OAAzB;AACD,KAND,MAOK;AACH,WAAK,KAAL,GAAiB,KAAK,CAAtB;AACA,WAAK,KAAL,GAAiB,KAAK,CAAtB;AACA,WAAK,OAAL,GAAiB,OAAO,CAAxB;AACA,WAAK,OAAL,GAAiB,OAAO,CAAxB;AACD;;AAED,SAAK,EAAL,GAAiB,YAAY,WAAZ,CAAwB,IAAxB,CAA6B,CAA7B,GAAiC,OAAO,CAAzD;AACA,SAAK,EAAL,GAAiB,YAAY,WAAZ,CAAwB,IAAxB,CAA6B,CAA7B,GAAiC,OAAO,CAAzD;AACA,SAAK,QAAL,GAAiB,YAAY,WAAZ,CAAwB,MAAxB,CAA+B,CAA/B,GAAmC,OAAO,CAA3D;AACA,SAAK,QAAL,GAAiB,YAAY,WAAZ,CAAwB,MAAxB,CAA+B,CAA/B,GAAmC,OAAO,CAA3D;;AAEA,YAAQ,IAAR,CAAa,WAAb,EAA0B,SAA1B;;AAEA,SAAK,SAAL,GAAiB,OAAO,SAAxB;AACA,SAAK,EAAL,GAAiB,YAAY,YAAZ,CAAyB,SAA1C;AACA,SAAK,QAAL,GAAiB,KAAK,SAAL,GAAiB,KAAK,EAAvC;;AAEA;AACA,SAAK,KAAL,GAAa,YAAY,YAAZ,CAAyB,WAAzB,EAAsC,KAAnD;AACA,SAAK,SAAL,GAAiB,YAAY,YAAZ,CAAyB,WAAzB,EAAsC,EAAvD;AACA,SAAK,SAAL,GAAiB,YAAY,YAAZ,CAAyB,WAAzB,EAAsC,EAAvD;;AAEA,SAAK,KAAL,GAAc,UAAU,UAAU,cAArB,GAAsC,KAAK,QAAL,EAAtC,GAAwD,IAArE;;AAEA,YAAQ,IAAR,CAAa,KAAb,EAAoB,SAApB;AACD;;0BAED,Q,uBAAY;AACV,QAAM,cAAc,KAAK,WAAzB;;AAEA,QAAI,YAAY,SAAZ,CAAsB,KAAtB,GAA8B,GAA9B,IACG,KAAK,SAAL,GAAiB,YAAY,SAAZ,CAAsB,SAAvC,GAAmD,GAD1D,EAC+D;AAC7D,aAAO,IAAP;AACD;;AAED,QAAI,QAAQ,MAAM,KAAK,KAAL,CAAW,YAAY,SAAZ,CAAsB,SAAjC,EAA4C,YAAY,SAAZ,CAAsB,SAAlE,CAAN,GAAqF,KAAK,EAAtG;AACA,QAAM,UAAU,IAAhB;;AAEA,QAAI,QAAQ,CAAZ,EAAe;AACb,eAAS,GAAT;AACD;;AAED,QAAM,OAAO,MAAM,OAAN,IAAiB,KAAjB,IAA0B,QAAQ,MAAM,OAArD;AACA,QAAM,KAAO,MAAM,OAAN,IAAiB,KAAjB,IAA0B,QAAQ,MAAM,OAArD;;AAEA,QAAM,QAAQ,CAAC,IAAD,KAAU,MAAM,OAAN,IAAiB,KAAjB,IAA0B,QAAS,KAAK,OAAlD,CAAd;AACA,QAAM,OAAQ,CAAC,EAAD,IAAW,KAAK,OAAL,IAAgB,KAA3B,IAAoC,QAAQ,MAAM,OAAhE;;AAEA,WAAO;AACL,YADK;AAEL,gBAFK;AAGL,gBAHK;AAIL,kBAJK;AAKL,kBALK;AAML,aAAO,YAAY,SAAZ,CAAsB,KANxB;AAOL,gBAAU;AACR,WAAG,YAAY,SAAZ,CAAsB,SADjB;AAER,WAAG,YAAY,SAAZ,CAAsB;AAFjB;AAPL,KAAP;AAYD,G;;0BAED,c,6BAAkB,CAAE,C;;0BAEpB,wB,uCAA4B;AAC1B,SAAK,2BAAL,GAAmC,KAAK,kBAAL,GAA0B,IAA7D;AACD,G;;0BAED,e,8BAAmB;AACjB,SAAK,kBAAL,GAA0B,IAA1B;AACD,G;;;;;AAGH,QAAQ,EAAR,CAAW,WAAX,EAAwB,gBAA0D;AAAA,MAA9C,MAA8C,QAA9C,MAA8C;AAAA,MAAtC,WAAsC,QAAtC,WAAsC;AAAA,MAAzB,QAAyB,QAAzB,QAAyB;AAAA,MAAf,WAAe,QAAf,WAAe;;AAChF,MAAM,YAAY,WAAU,MAAV,GAAmB,YAAY,SAAjD;;AAEA,MAAI,gBAAgB,QAApB,EAA8B;AAC5B,WAAO,EAAP,GAAY,OAAO,OAAP,GAAiB,UAAU,OAAvC;AACA,WAAO,EAAP,GAAY,OAAO,OAAP,GAAiB,UAAU,OAAvC;AACD,GAHD,MAIK;AACH,WAAO,EAAP,GAAY,OAAO,KAAP,GAAe,UAAU,KAArC;AACA,WAAO,EAAP,GAAY,OAAO,KAAP,GAAe,UAAU,KAArC;AACD;AACF,CAXD;;AAaA,cAAc,OAAd,GAAwB,OAAxB;;AAEA,OAAO,OAAP,GAAiB,aAAjB;;;;;;;AC7JA,IAAM,KAAY,QAAQ,YAAR,CAAlB;AACA,IAAM,SAAY,QAAQ,gBAAR,CAAlB;AACA,IAAM,SAAY,QAAQ,gBAAR,CAAlB;AACA,IAAM,UAAY,QAAQ,gBAAR,CAAlB;AACA,IAAM,QAAY,QAAQ,SAAR,CAAlB;AACA,IAAM,YAAY,QAAQ,aAAR,CAAlB;AACA,IAAM,WAAY,QAAQ,kBAAR,CAAlB;AACA,IAAM,UAAY,QAAQ,iBAAR,EAA2B,GAA3B,EAAlB;;eAM8B,QAAQ,kBAAR,C;IAH5B,c,YAAA,c;IACA,Y,YAAA,Y;IACA,W,YAAA,W;;gBAE4B,QAAQ,gBAAR,C;IAAtB,S,aAAA,S;;gBACsB,QAAQ,aAAR,C;IAAtB,O,aAAA,O;IAAS,Q,aAAA,Q;;gBACa,QAAQ,iBAAR,C;IAAtB,U,aAAA,U;;AAER;;;AACA,MAAM,aAAN,GAAsB,EAAtB;;AAEA;;;;;;;IAMM,Y;AACJ,wBAAa,MAAb,EAAqB,OAArB,EAA8B;AAAA;;AAC5B,cAAU,WAAW,EAArB;;AAEA,SAAK,MAAL,GAAgB,MAAhB;AACA,SAAK,MAAL,GAAgB,IAAI,SAAJ,EAAhB;AACA,SAAK,QAAL,GAAgB,QAAQ,OAAR,IAAmB,MAAM,QAAzC;AACA,SAAK,IAAL,GAAgB,UAAU,YAAY,MAAZ,IAAqB,KAAK,QAA1B,GAAqC,MAA/C,CAAhB;AACA,SAAK,IAAL,GAAgB,KAAK,IAAL,CAAU,QAA1B;;AAEA,YAAQ,IAAR,CAAa,KAAb,EAAoB;AAClB,oBADkB;AAElB,sBAFkB;AAGlB,oBAAc,IAHI;AAIlB,WAAK,KAAK;AAJQ,KAApB;;AAOA,UAAM,WAAN,CAAmB,KAAK,IAAxB,EAA8B,KAAK,IAAnC;;AAEA,UAAM,aAAN,CAAoB,IAApB,CAAyB,IAAzB;;AAEA,SAAK,GAAL,CAAS,OAAT;AACD;;yBAED,W,wBAAa,M,EAAQ,M,EAAQ;AAC3B,QAAM,WAAW,OAAO,MAAxB;;AAEA,QAAI,GAAG,QAAH,CAAY,OAAO,OAAnB,CAAJ,EAAwC;AAAE,WAAK,MAAL,CAAY,WAAW,OAAvB,IAA0C,OAAO,OAAjD;AAAoE;AAC9G,QAAI,GAAG,QAAH,CAAY,OAAO,MAAnB,CAAJ,EAAwC;AAAE,WAAK,MAAL,CAAY,WAAW,MAAvB,IAA0C,OAAO,MAAjD;AAAoE;AAC9G,QAAI,GAAG,QAAH,CAAY,OAAO,KAAnB,CAAJ,EAAwC;AAAE,WAAK,MAAL,CAAY,WAAW,KAAvB,IAA0C,OAAO,KAAjD;AAAoE;AAC9G,QAAI,GAAG,QAAH,CAAY,OAAO,cAAnB,CAAJ,EAAwC;AAAE,WAAK,MAAL,CAAY,WAAW,cAAvB,IAA0C,OAAO,cAAjD;AAAoE;;AAE9G,WAAO,IAAP;AACD,G;;yBAED,Y,yBAAc,M,EAAQ,O,EAAS;AAC7B;AACA,SAAK,IAAM,MAAX,IAAqB,OAArB,EAA8B;AAC5B;AACA,UAAI,UAAU,SAAS,MAAT,CAAd,EAAgC;AAC9B;AACA,YAAI,GAAG,MAAH,CAAU,QAAQ,MAAR,CAAV,CAAJ,EAAgC;AAC9B;AACA,eAAK,OAAL,CAAa,MAAb,EAAqB,MAArB,IAA+B,OAAO,KAAK,OAAL,CAAa,MAAb,EAAqB,MAArB,KAAgC,EAAvC,EAA2C,QAAQ,MAAR,CAA3C,CAA/B;;AAEA,cAAI,GAAG,MAAH,CAAU,SAAS,SAAT,CAAmB,MAAnB,CAAV,KAAyC,aAAa,SAAS,SAAT,CAAmB,MAAnB,CAA1D,EAAsF;AACpF,iBAAK,OAAL,CAAa,MAAb,EAAqB,MAArB,EAA6B,OAA7B,GAAuC,QAAQ,MAAR,EAAgB,OAAhB,KAA4B,KAA5B,GAAmC,KAAnC,GAA2C,IAAlF;AACD;AACF,SAPD,MAQK,IAAI,GAAG,IAAH,CAAQ,QAAQ,MAAR,CAAR,KAA4B,GAAG,MAAH,CAAU,SAAS,SAAT,CAAmB,MAAnB,CAAV,CAAhC,EAAuE;AAC1E,eAAK,OAAL,CAAa,MAAb,EAAqB,MAArB,EAA6B,OAA7B,GAAuC,QAAQ,MAAR,CAAvC;AACD,SAFI,MAGA,IAAI,QAAQ,MAAR,MAAoB,SAAxB,EAAmC;AACtC;AACA,eAAK,OAAL,CAAa,MAAb,EAAqB,MAArB,IAA+B,QAAQ,MAAR,CAA/B;AACD;AACF;AACF;AACF,G;;AAED;;;;;;;;;;;;;;;;;;;;yBAkBA,O,oBAAS,O,EAAS;AAChB,cAAU,WAAW,KAAK,MAA1B;;AAEA,QAAI,GAAG,MAAH,CAAU,KAAK,MAAf,KAA0B,CAAE,GAAG,OAAH,CAAW,OAAX,CAAhC,EAAsD;AACpD,gBAAU,KAAK,QAAL,CAAc,aAAd,CAA4B,KAAK,MAAjC,CAAV;AACD;;AAED,WAAO,eAAe,OAAf,CAAP;AACD,G;;AAED;;;;;;;;;;;;yBAUA,W,wBAAa,O,EAAS;AACpB,QAAI,GAAG,QAAH,CAAY,OAAZ,CAAJ,EAA0B;AACxB,WAAK,OAAL,GAAe,OAAf;;AAEA,aAAO,IAAP;AACD;;AAED,QAAI,YAAY,IAAhB,EAAsB;AACpB,aAAO,KAAK,OAAL,CAAa,OAApB;;AAEA,aAAO,IAAP;AACD;;AAED,WAAO,KAAK,OAAZ;AACD,G;;yBAED,iB,8BAAmB,U,EAAY,Q,EAAU;AACvC,QAAI,YAAY,QAAZ,KAAyB,GAAG,MAAH,CAAU,QAAV,CAA7B,EAAkD;AAChD,WAAK,OAAL,CAAa,UAAb,IAA2B,QAA3B;;AAEA,2BAAqB,QAAQ,KAA7B,kHAAoC;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,YAAzB,MAAyB;;AAClC,aAAK,OAAL,CAAa,MAAb,EAAqB,UAArB,IAAmC,QAAnC;AACD;;AAED,aAAO,IAAP;AACD;;AAED,WAAO,KAAK,OAAL,CAAa,UAAb,CAAP;AACD,G;;AAED;;;;;;;;;;;;;;;yBAaA,M,mBAAQ,Q,EAAU;AAChB,WAAO,KAAK,iBAAL,CAAuB,QAAvB,EAAiC,QAAjC,CAAP;AACD,G;;AAED;;;;;;;;;;;;yBAUA,W,wBAAa,Q,EAAU;AACrB,QAAI,aAAa,MAAb,IAAuB,aAAa,QAAxC,EAAkD;AAChD,WAAK,OAAL,CAAa,WAAb,GAA2B,QAA3B;;AAEA,aAAO,IAAP;AACD;;AAED,WAAO,KAAK,OAAL,CAAa,WAApB;AACD,G;;AAED;;;;;;;;;;;yBASA,O,sBAAW;AACT,WAAO,KAAK,QAAZ;AACD,G;;yBAED,S,sBAAW,O,EAAS;AAClB,WAAQ,KAAK,QAAL,KAAkB,QAAQ,aAA1B,IACG,aAAa,KAAK,QAAlB,EAA4B,OAA5B,CADX;AAED,G;;AAED;;;;;;;;;;;;yBAUA,I,iBAAM,M,EAAQ;AACZ,SAAK,MAAL,CAAY,IAAZ,CAAiB,MAAjB;;AAEA,WAAO,IAAP;AACD,G;;yBAED,c,2BAAgB,M,EAAQ,S,EAAW,Q,EAAU,O,EAAS;AACpD,QAAI,GAAG,MAAH,CAAU,SAAV,KAAwB,UAAU,MAAV,CAAiB,GAAjB,MAA0B,CAAC,CAAvD,EAA0D;AACxD,kBAAY,UAAU,IAAV,GAAiB,KAAjB,CAAuB,IAAvB,CAAZ;AACD;;AAED,QAAI,GAAG,KAAH,CAAS,SAAT,CAAJ,EAAyB;AACvB,WAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,UAAU,MAA9B,EAAsC,GAAtC,EAA2C;AACzC,aAAK,MAAL,EAAa,UAAU,CAAV,CAAb,EAA2B,QAA3B,EAAqC,OAArC;AACD;;AAED,aAAO,IAAP;AACD;;AAED,QAAI,GAAG,MAAH,CAAU,SAAV,CAAJ,EAA0B;AACxB,WAAK,IAAM,IAAX,IAAmB,SAAnB,EAA8B;AAC5B,aAAK,MAAL,EAAa,IAAb,EAAmB,UAAU,IAAV,CAAnB,EAAoC,QAApC;AACD;;AAED,aAAO,IAAP;AACD;AACF,G;;AAED;;;;;;;;;;;;;yBAWA,E,eAAI,S,EAAW,Q,EAAU,O,EAAS;AAChC,QAAI,KAAK,cAAL,CAAoB,IAApB,EAA0B,SAA1B,EAAqC,QAArC,EAA+C,OAA/C,CAAJ,EAA6D;AAC3D,aAAO,IAAP;AACD;;AAED,QAAI,cAAc,OAAlB,EAA2B;AAAE,kBAAY,UAAZ;AAAyB;;AAEtD,QAAI,SAAS,aAAa,UAAtB,EAAkC,SAAlC,CAAJ,EAAkD;AAChD,WAAK,MAAL,CAAY,EAAZ,CAAe,SAAf,EAA0B,QAA1B;AACD;AACD;AAHA,SAIK,IAAI,GAAG,MAAH,CAAU,KAAK,MAAf,CAAJ,EAA4B;AAC/B,eAAO,WAAP,CAAmB,KAAK,MAAxB,EAAgC,KAAK,QAArC,EAA+C,SAA/C,EAA0D,QAA1D,EAAoE,OAApE;AACD,OAFI,MAGA;AACH,eAAO,GAAP,CAAW,KAAK,MAAhB,EAAwB,SAAxB,EAAmC,QAAnC,EAA6C,OAA7C;AACD;;AAED,WAAO,IAAP;AACD,G;;AAED;;;;;;;;;;;;;yBAWA,G,gBAAK,S,EAAW,Q,EAAU,O,EAAS;AACjC,QAAI,KAAK,cAAL,CAAoB,KAApB,EAA2B,SAA3B,EAAsC,QAAtC,EAAgD,OAAhD,CAAJ,EAA8D;AAC5D,aAAO,IAAP;AACD;;AAED,QAAI,cAAc,OAAlB,EAA2B;AAAE,kBAAY,UAAZ;AAAyB;;AAEtD;AACA,QAAI,SAAS,aAAa,UAAtB,EAAkC,SAAlC,CAAJ,EAAkD;AAChD,WAAK,MAAL,CAAY,GAAZ,CAAgB,SAAhB,EAA2B,QAA3B;AACD;AACD;AAHA,SAIK,IAAI,GAAG,MAAH,CAAU,KAAK,MAAf,CAAJ,EAA4B;AAC/B,eAAO,cAAP,CAAsB,KAAK,MAA3B,EAAmC,KAAK,QAAxC,EAAkD,SAAlD,EAA6D,QAA7D,EAAuE,OAAvE;AACD;AACD;AAHK,WAIA;AACH,iBAAO,MAAP,CAAc,KAAK,MAAnB,EAA2B,SAA3B,EAAsC,QAAtC,EAAgD,OAAhD;AACD;;AAED,WAAO,IAAP;AACD,G;;AAED;;;;;;;;;;yBAQA,G,gBAAK,O,EAAS;AACZ,QAAI,CAAC,GAAG,MAAH,CAAU,OAAV,CAAL,EAAyB;AACvB,gBAAU,EAAV;AACD;;AAED,SAAK,OAAL,GAAe,OAAO,EAAP,EAAW,SAAS,IAApB,CAAf;;AAEA,QAAM,aAAa,OAAO,EAAP,EAAW,SAAS,SAApB,CAAnB;;AAEA,SAAK,IAAM,UAAX,IAAyB,QAAQ,UAAjC,EAA6C;AAC3C,UAAM,aAAa,QAAQ,UAAR,CAAmB,UAAnB,CAAnB;;AAEA,WAAK,OAAL,CAAa,UAAb,IAA2B,OAAO,EAAP,EAAW,SAAS,UAAT,CAAX,CAA3B;;AAEA,WAAK,YAAL,CAAkB,UAAlB,EAA8B,UAA9B;;AAEA,WAAK,UAAL,EAAiB,QAAQ,UAAR,CAAjB;AACD;;AAED,0BAAsB,aAAa,eAAnC,yHAAoD;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAAzC,OAAyC;;AAClD,WAAK,OAAL,CAAa,OAAb,IAAwB,SAAS,IAAT,CAAc,OAAd,CAAxB;;AAEA,UAAI,WAAW,OAAf,EAAwB;AACtB,aAAK,OAAL,EAAc,QAAQ,OAAR,CAAd;AACD;AACF;;AAED,YAAQ,IAAR,CAAa,KAAb,EAAoB;AAClB,sBADkB;AAElB,oBAAc;AAFI,KAApB;;AAKA,WAAO,IAAP;AACD,G;;AAED;;;;;;;;;;;yBASA,K,oBAAS;AACP,WAAO,MAAP,CAAc,KAAK,MAAnB,EAA2B,KAA3B;;AAEA,QAAI,GAAG,MAAH,CAAU,KAAK,MAAf,CAAJ,EAA4B;AAC1B;AACA,WAAK,IAAM,IAAX,IAAmB,OAAO,eAA1B,EAA2C;AACzC,YAAM,YAAY,OAAO,eAAP,CAAuB,IAAvB,CAAlB;;AAEA,YAAI,UAAU,SAAV,CAAoB,CAApB,MAA2B,KAAK,MAAhC,IACG,UAAU,QAAV,CAAmB,CAAnB,MAA0B,KAAK,QADtC,EACgD;;AAE9C,oBAAU,SAAV,CAAoB,MAApB,CAA2B,CAA3B,EAA8B,CAA9B;AACA,oBAAU,QAAV,CAAoB,MAApB,CAA2B,CAA3B,EAA8B,CAA9B;AACA,oBAAU,SAAV,CAAoB,MAApB,CAA2B,CAA3B,EAA8B,CAA9B;;AAEA;AACA,cAAI,CAAC,UAAU,SAAV,CAAoB,MAAzB,EAAiC;AAC/B,sBAAU,IAAV,IAAkB,IAAlB;AACD;AACF;;AAED,eAAO,MAAP,CAAc,KAAK,QAAnB,EAA6B,IAA7B,EAAmC,OAAO,gBAA1C;AACA,eAAO,MAAP,CAAc,KAAK,QAAnB,EAA6B,IAA7B,EAAmC,OAAO,kBAA1C,EAA8D,IAA9D;AACD;AACF,KArBD,MAsBK;AACH,aAAO,MAAP,CAAc,IAAd,EAAoB,KAApB;AACD;;AAED,YAAQ,IAAR,CAAa,OAAb,EAAsB,EAAE,cAAc,IAAhB,EAAtB;;AAEA,UAAM,aAAN,CAAoB,MAApB,CAA2B,QAAQ,MAAM,aAAd,EAA6B,IAA7B,CAA3B,EAA+D,CAA/D;;AAEA;AACA,0BAA0B,MAAM,YAAN,IAAsB,EAAhD,yHAAoD;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAAzC,WAAyC;;AAClD,UAAI,YAAY,MAAZ,KAAuB,IAAvB,IAA+B,YAAY,WAAZ,EAAnC,EAA8D;AAC5D,oBAAY,IAAZ;AACD;AACF;;AAED,WAAO,MAAM,QAAb;AACD,G;;;;;AAGH,MAAM,aAAN,CAAoB,cAApB,GAAqC,SAAS,cAAT,CAAyB,MAAzB,EAAiC,OAAjC,EAA0C;AAC7E,YAAU,WAAW,MAAM,QAA3B;;AAEA,OAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,KAAK,MAAzB,EAAiC,GAAjC,EAAsC;AACpC,QAAM,eAAe,KAAK,CAAL,CAArB;;AAEA,QAAI,aAAa,MAAb,KAAwB,MAAxB,IAAkC,aAAa,QAAb,KAA0B,OAAhE,EAAyE;AACvE,aAAO,CAAP;AACD;AACF;AACD,SAAO,CAAC,CAAR;AACD,CAXD;;AAaA,MAAM,aAAN,CAAoB,GAApB,GAA0B,SAAS,eAAT,CAA0B,OAA1B,EAAmC,OAAnC,EAA4C,kBAA5C,EAAgE;AACxF,MAAM,MAAM,KAAK,KAAK,cAAL,CAAoB,OAApB,EAA6B,WAAW,QAAQ,OAAhD,CAAL,CAAZ;;AAEA,SAAO,QAAQ,GAAG,MAAH,CAAU,OAAV,KAAsB,kBAAtB,IAA4C,IAAI,SAAJ,CAAc,OAAd,CAApD,IAA6E,GAA7E,GAAmF,IAA1F;AACD,CAJD;;AAMA,MAAM,aAAN,CAAoB,eAApB,GAAsC,UAAU,QAAV,EAAoB,OAApB,EAA6B;AACjE,OAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,KAAK,MAAzB,EAAiC,GAAjC,EAAsC;AACpC,QAAM,eAAe,KAAK,CAAL,CAArB;;AAEA;AACA,QAAI,CAAC,GAAG,MAAH,CAAU,aAAa,MAAvB,CAAD,IACI,WAAW,CAAC,aAAa,SAAb,CAAuB,OAAvB,CADpB,EACsD;AACpD;AACD;;AAED,QAAM,MAAM,SAAS,YAAT,EAAuB,aAAa,MAApC,EAA4C,aAAa,QAAzD,EAAmE,CAAnE,EAAsE,IAAtE,CAAZ;;AAEA,QAAI,QAAQ,SAAZ,EAAuB;AACrB,aAAO,GAAP;AACD;AACF;AACF,CAhBD;;AAkBA;AACA,aAAa,UAAb,GAA0B,MAAM,UAAN,GAAmB,EAA7C;;AAEA,aAAa,OAAb,GAAuB,OAAvB;;AAEA,aAAa,eAAb,GAA+B,CAAE,aAAF,EAAiB,QAAjB,EAA2B,gBAA3B,EAA6C,aAA7C,CAA/B;;AAEA,OAAO,OAAP,GAAiB,YAAjB;;;;;;;ACtcA,IAAM,QAAa,QAAQ,SAAR,CAAnB;AACA,IAAM,QAAa,QAAQ,SAAR,CAAnB;AACA,IAAM,SAAa,QAAQ,gBAAR,CAAnB;AACA,IAAM,UAAa,QAAQ,iBAAR,CAAnB;AACA,IAAM,aAAa,QAAQ,oBAAR,CAAnB;AACA,IAAM,SAAa,QAAQ,2BAAR,CAAnB;AACA,IAAM,UAAa,QAAQ,iBAAR,EAA2B,GAA3B,EAAnB;;AAEA,IAAM,YAAc,EAApB;AACA,IAAM,cAAc,CAClB,aADkB,EACH,aADG,EACY,WADZ,EAElB,eAFkB,EAED,eAFC,CAApB;;AAKA;AACA,IAAI,gBAAgB,CAApB;;AAEA;AACA,MAAM,YAAN,GAAqB,EAArB;;IAEM,W;AACJ,6BAA8B;AAAA,QAAf,WAAe,QAAf,WAAe;;AAAA;;AAC5B,SAAK,MAAL,GAAqB,IAArB,CAD4B,CACD;AAC3B,SAAK,OAAL,GAAqB,IAArB,CAF4B,CAED;;AAE3B,SAAK,QAAL,GAAqB,EAAM;AACzB,YAAO,IADY;AAEnB,YAAO,IAFY;AAGnB,aAAO;AAHY,KAArB;;AAMA;AACA,SAAK,QAAL,GAAmB,EAAnB;AACA,SAAK,UAAL,GAAmB,EAAnB;AACA,SAAK,WAAL,GAAmB,EAAnB;AACA,SAAK,SAAL,GAAmB,EAAnB;;AAEA;AACA,SAAK,UAAL,GAAkB;AAChB,YAAW,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EADK;AAEhB,cAAW,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EAFK;AAGhB,iBAAW;AAHK,KAAlB;AAKA;AACA,SAAK,SAAL,GAAiB;AACf,YAAW,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EADI;AAEf,cAAW,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EAFI;AAGf,iBAAW;AAHI,KAAjB;;AAMA;AACA,SAAK,WAAL,GAAmB;AACjB,YAAW,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EADM;AAEjB,cAAW,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EAFM;AAGjB,iBAAW;AAHM,KAAnB;;AAMA;AACA,SAAK,YAAL,GAAoB;AAClB,YAAW,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EAAc,IAAI,CAAlB,EAAqB,IAAI,CAAzB,EAA4B,OAAO,CAAnC,EADO;AAElB,cAAW,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EAAc,IAAI,CAAlB,EAAqB,IAAI,CAAzB,EAA4B,OAAO,CAAnC,EAFO;AAGlB,iBAAW;AAHO,KAApB;;AAMA,SAAK,SAAL,GAAmB,IAAnB,CA3C4B,CA2CA;AAC5B,SAAK,WAAL,GAAmB,EAAnB;;AAEA,SAAK,YAAL,GAAuB,IAAvB;AACA,SAAK,eAAL,GAAuB,IAAvB;;AAEA,SAAK,SAAL,GAAiB,IAAjB,CAjD4B,CAiDA;;AAE5B,SAAK,aAAL,GAAuB,KAAvB;AACA,SAAK,eAAL,GAAuB,KAAvB;AACA,SAAK,YAAL,GAAuB,KAAvB;;AAEA,SAAK,WAAL,GAAmB,WAAnB;;AAEA,YAAQ,IAAR,CAAa,KAAb,EAAoB,IAApB;;AAEA,UAAM,YAAN,CAAmB,IAAnB,CAAwB,IAAxB;AACD;;wBAED,W,wBAAa,O,EAAS,K,EAAO,W,EAAa;AACxC,QAAM,eAAe,KAAK,aAAL,CAAmB,OAAnB,EAA4B,KAA5B,EAAmC,IAAnC,CAArB;;AAEA,YAAQ,IAAR,CAAa,MAAb,EAAqB;AACnB,sBADmB;AAEnB,kBAFmB;AAGnB,8BAHmB;AAInB,gCAJmB;AAKnB,mBAAa;AALM,KAArB;AAOD,G;;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wBAgCA,K,kBAAO,M,EAAQ,M,EAAQ,O,EAAS;AAC9B,QAAI,KAAK,WAAL,MACG,CAAC,KAAK,aADT,IAEG,KAAK,UAAL,CAAgB,MAAhB,IAA0B,OAAO,IAAP,KAAgB,SAAhB,GAA2B,CAA3B,GAA+B,CAAzD,CAFP,EAEoE;AAClE;AACD;;AAED;AACA;AACA,QAAI,MAAM,OAAN,CAAc,MAAM,YAApB,EAAkC,IAAlC,MAA4C,CAAC,CAAjD,EAAoD;AAClD,YAAM,YAAN,CAAmB,IAAnB,CAAwB,IAAxB;AACD;;AAED,UAAM,UAAN,CAAiB,KAAK,QAAtB,EAAgC,MAAhC;AACA,SAAK,MAAL,GAAsB,MAAtB;AACA,SAAK,OAAL,GAAsB,OAAtB;;AAEA,YAAQ,IAAR,CAAa,cAAb,EAA6B;AAC3B,mBAAa,IADc;AAE3B,aAAO,KAAK;AAFe,KAA7B;AAID,G;;wBAED,W,wBAAa,O,EAAS,K,EAAO,W,EAAa;AACxC,QAAI,CAAC,KAAK,UAAV,EAAsB;AACpB,WAAK,aAAL,CAAmB,OAAnB;AACA,YAAM,SAAN,CAAgB,KAAK,SAArB,EAAgC,KAAK,QAArC;AACD;;AAED,QAAM,gBAAiB,KAAK,SAAL,CAAe,IAAf,CAAoB,CAApB,KAA0B,KAAK,UAAL,CAAgB,IAAhB,CAAqB,CAA/C,IACG,KAAK,SAAL,CAAe,IAAf,CAAoB,CAApB,KAA0B,KAAK,UAAL,CAAgB,IAAhB,CAAqB,CADlD,IAEG,KAAK,SAAL,CAAe,MAAf,CAAsB,CAAtB,KAA4B,KAAK,UAAL,CAAgB,MAAhB,CAAuB,CAFtD,IAGG,KAAK,SAAL,CAAe,MAAf,CAAsB,CAAtB,KAA4B,KAAK,UAAL,CAAgB,MAAhB,CAAuB,CAH7E;;AAKA,QAAI,WAAJ;AACA,QAAI,WAAJ;;AAEA;AACA,QAAI,KAAK,aAAL,IAAsB,CAAC,KAAK,eAAhC,EAAiD;AAC/C,WAAK,KAAK,SAAL,CAAe,MAAf,CAAsB,CAAtB,GAA0B,KAAK,WAAL,CAAiB,MAAjB,CAAwB,CAAvD;AACA,WAAK,KAAK,SAAL,CAAe,MAAf,CAAsB,CAAtB,GAA0B,KAAK,WAAL,CAAiB,MAAjB,CAAwB,CAAvD;;AAEA,WAAK,eAAL,GAAuB,MAAM,KAAN,CAAY,EAAZ,EAAgB,EAAhB,IAAsB,YAAY,oBAAzD;AACD;;AAED,QAAM,YAAY;AAChB,sBADgB;AAEhB,oBAAc,KAAK,eAAL,CAAqB,OAArB,CAFE;AAGhB,kBAHgB;AAIhB,8BAJgB;AAKhB,YALgB;AAMhB,YANgB;AAOhB,iBAAW,aAPK;AAQhB,mBAAa,IARG;AAShB,6BAAuB,KAAK,WAAL;AATP,KAAlB;;AAYA,QAAI,CAAC,aAAL,EAAoB;AAClB;AACA,YAAM,cAAN,CAAqB,KAAK,YAA1B,EAAwC,KAAK,UAA7C,EAAyD,KAAK,SAA9D;AACD;;AAED,YAAQ,IAAR,CAAa,MAAb,EAAqB,SAArB;;AAEA,QAAI,CAAC,aAAL,EAAoB;AAClB;AACA,UAAI,KAAK,WAAL,EAAJ,EAAwB;AACtB,aAAK,MAAL,CAAY,SAAZ;AACD;;AAED,UAAI,KAAK,eAAT,EAA0B;AACxB,cAAM,UAAN,CAAiB,KAAK,UAAtB,EAAkC,KAAK,SAAvC;AACD;AACF;AACF,G;;AAED;;;;;;;;;;;;;;;;;;;;;;wBAoBA,M,mBAAQ,S,EAAW;AACjB,gBAAY,MAAM,MAAN,CAAa;AACvB,eAAS,KAAK,QAAL,CAAc,CAAd,CADc;AAEvB,aAAO,KAAK,SAFW;AAGvB,mBAAa,KAAK,YAHK;AAIvB,mBAAa;AAJU,KAAb,EAKT,aAAa,EALJ,CAAZ;;AAOA,YAAQ,IAAR,CAAa,oBAAb,EAAmC,SAAnC;;AAEA,QAAI,CAAC,KAAK,aAAV,EAAyB;AACvB,cAAQ,IAAR,CAAa,aAAb,EAA4B,SAA5B;AACD;;AAED,SAAK,aAAL,GAAqB,KAArB;AACD,G;;AAED;;;wBACA,S,sBAAW,O,EAAS,K,EAAO,W,EAAa,c,EAAgB;AACtD,QAAM,eAAe,KAAK,eAAL,CAAqB,OAArB,CAArB;;AAEA,YAAQ,IAAR,CAAa,WAAW,IAAX,CAAgB,MAAM,IAAtB,IAA6B,QAA7B,GAAwC,IAArD,EAA2D;AACzD,sBADyD;AAEzD,gCAFyD;AAGzD,kBAHyD;AAIzD,8BAJyD;AAKzD,oCALyD;AAMzD,mBAAa;AAN4C,KAA3D;;AASA,QAAI,CAAC,KAAK,UAAV,EAAsB;AACpB,WAAK,GAAL,CAAS,KAAT;AACD;;AAED,SAAK,aAAL,GAAqB,KAArB;AACA,SAAK,aAAL,CAAmB,OAAnB,EAA4B,KAA5B;AACD,G;;AAED;;;;;;;;;;;;;;;;;;;;;;wBAoBA,G,gBAAK,K,EAAO;AACV,YAAQ,SAAS,KAAK,SAAtB;;AAEA,QAAI,KAAK,WAAL,EAAJ,EAAwB;AACtB,cAAQ,IAAR,CAAa,YAAb,EAA2B;AACzB,oBADyB;AAEzB,qBAAa;AAFY,OAA3B;AAID;;AAED,SAAK,IAAL;AACD,G;;wBAED,a,4BAAiB;AACf,WAAO,KAAK,YAAL,GAAmB,KAAK,QAAL,CAAc,IAAjC,GAAuC,IAA9C;AACD,G;;wBAED,W,0BAAe;AACb,WAAO,KAAK,YAAZ;AACD,G;;wBAED,I,mBAAQ;AACN,YAAQ,IAAR,CAAa,MAAb,EAAqB,EAAE,aAAa,IAAf,EAArB;;AAEA,QAAI,KAAK,YAAT,EAAuB;AACrB,cAAQ,IAAR,CAAa,aAAb,EAA4B,EAAE,aAAa,IAAf,EAA5B;AACA,cAAQ,IAAR,CAAa,UAAU,KAAK,QAAL,CAAc,IAArC,EAA2C,EAAE,aAAa,IAAf,EAA3C;AACD;;AAED,SAAK,MAAL,GAAc,KAAK,OAAL,GAAe,IAA7B;;AAEA,SAAK,YAAL,GAAoB,KAApB;AACA,SAAK,QAAL,CAAc,IAAd,GAAqB,KAAK,SAAL,GAAiB,IAAtC;AACD,G;;wBAED,e,4BAAiB,O,EAAS;AACxB;AACA,QAAI,KAAK,WAAL,KAAqB,OAArB,IAAgC,KAAK,WAAL,KAAqB,KAAzD,EAAgE;AAC9D,aAAO,CAAP;AACD;;AAED,WAAO,MAAM,OAAN,CAAc,KAAK,UAAnB,EAA+B,MAAM,YAAN,CAAmB,OAAnB,CAA/B,CAAP;AACD,G;;wBAED,a,0BAAe,O,EAAS,K,EAA0D;AAAA,QAAnD,IAAmD,uEAA5C,SAAS,iBAAiB,IAAjB,CAAsB,MAAM,IAA5B,CAAmC;;AAChF,QAAM,KAAK,MAAM,YAAN,CAAmB,OAAnB,CAAX;AACA,QAAI,QAAQ,KAAK,eAAL,CAAqB,OAArB,CAAZ;;AAEA,QAAI,UAAU,CAAC,CAAf,EAAkB;AAChB,cAAQ,KAAK,UAAL,CAAgB,MAAxB;AACA,WAAK,UAAL,CAAgB,KAAhB,IAAyB,EAAzB;AACD;;AAED,QAAI,IAAJ,EAAU;AACR,cAAQ,IAAR,CAAa,qBAAb,EAAoC;AAClC,wBADkC;AAElC,oBAFkC;AAGlC,kBAHkC;AAIlC,mBAAW,EAJuB;AAKlC,sBAAc,KALoB;AAMlC,qBAAa;AANqB,OAApC;AAQD;;AAED,SAAK,QAAL,CAAc,KAAd,IAAuB,OAAvB;;AAEA,WAAO,KAAP;AACD,G;;wBAED,a,0BAAe,O,EAAS,K,EAAO;AAC7B,QAAM,QAAQ,KAAK,eAAL,CAAqB,OAArB,CAAd;;AAEA,QAAI,UAAU,CAAC,CAAf,EAAkB;AAAE;AAAS;;AAE7B,YAAQ,IAAR,CAAa,gBAAb,EAA+B;AAC7B,sBAD6B;AAE7B,kBAF6B;AAG7B,oBAAc,KAHe;AAI7B,mBAAa;AAJgB,KAA/B;;AAOA,SAAK,QAAL,CAAiB,MAAjB,CAAwB,KAAxB,EAA+B,CAA/B;AACA,SAAK,UAAL,CAAiB,MAAjB,CAAwB,KAAxB,EAA+B,CAA/B;AACA,SAAK,WAAL,CAAiB,MAAjB,CAAwB,KAAxB,EAA+B,CAA/B;AACA,SAAK,SAAL,CAAiB,MAAjB,CAAwB,KAAxB,EAA+B,CAA/B;AACD,G;;wBAED,mB,gCAAqB,M,EAAQ,a,EAAe;AAC1C,SAAK,YAAL,GAAuB,MAAvB;AACA,SAAK,eAAL,GAAuB,aAAvB;AACD,G;;;;;AAGH,KAAK,IAAI,IAAI,CAAR,EAAW,MAAM,YAAY,MAAlC,EAA0C,IAAI,GAA9C,EAAmD,GAAnD,EAAwD;AACtD,MAAM,SAAS,YAAY,CAAZ,CAAf;;AAEA,YAAU,MAAV,IAAoB,iBAAiB,MAAjB,CAApB;AACD;;AAED,SAAS,gBAAT,CAA2B,MAA3B,EAAmC;AACjC,SAAQ,UAAU,KAAV,EAAiB;AACvB,QAAM,cAAc,MAAM,cAAN,CAAqB,KAArB,CAApB;;AADuB,gCAEe,MAAM,eAAN,CAAsB,KAAtB,CAFf;AAAA,QAEhB,WAFgB;AAAA,QAEH,cAFG;;AAGvB,QAAM,UAAU,EAAhB,CAHuB,CAGH;;AAEpB,QAAI,QAAQ,aAAR,IAAyB,QAAQ,IAAR,CAAa,MAAM,IAAnB,CAA7B,EAAuD;AACrD,sBAAgB,IAAI,IAAJ,GAAW,OAAX,EAAhB;;AAEA,WAAK,IAAI,KAAI,CAAb,EAAgB,KAAI,MAAM,cAAN,CAAqB,MAAzC,EAAiD,IAAjD,EAAsD;AACpD,YAAM,UAAU,MAAM,cAAN,CAAqB,EAArB,CAAhB;AACA,YAAM,cAAc,OAAO,MAAP,CAAc,OAAd,EAAuB,MAAM,IAA7B,EAAmC,WAAnC,CAApB;;AAEA,gBAAQ,IAAR,CAAa,CAAC,OAAD,EAAU,eAAe,IAAI,WAAJ,CAAgB,EAAE,wBAAF,EAAhB,CAAzB,CAAb;AACD;AACF,KATD,MAUK;AACH,UAAI,iBAAiB,KAArB;;AAEA,UAAI,CAAC,QAAQ,oBAAT,IAAiC,QAAQ,IAAR,CAAa,MAAM,IAAnB,CAArC,EAA+D;AAC7D;AACA,aAAK,IAAI,MAAI,CAAb,EAAgB,MAAI,MAAM,YAAN,CAAmB,MAAvB,IAAiC,CAAC,cAAlD,EAAkE,KAAlE,EAAuE;AACrE,2BAAiB,MAAM,YAAN,CAAmB,GAAnB,EAAsB,WAAtB,KAAsC,OAAtC,IAAiD,MAAM,YAAN,CAAmB,GAAnB,EAAsB,aAAxF;AACD;;AAED;AACA;AACA,yBAAiB,kBACX,IAAI,IAAJ,GAAW,OAAX,KAAuB,aAAvB,GAAuC;AAC3C;AAFe,WAGZ,MAAM,SAAN,KAAoB,CAHzB;AAID;;AAED,UAAI,CAAC,cAAL,EAAqB;AACnB,YAAI,eAAc,OAAO,MAAP,CAAc,KAAd,EAAqB,MAAM,IAA3B,EAAiC,WAAjC,CAAlB;;AAEA,YAAI,CAAC,YAAL,EAAkB;AAChB,yBAAc,IAAI,WAAJ,CAAgB,EAAE,wBAAF,EAAhB,CAAd;AACD;;AAED,gBAAQ,IAAR,CAAa,CAAC,KAAD,EAAQ,YAAR,CAAb;AACD;AACF;;AAED,yBAAqC,OAArC,mHAA8C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,UAAlC,QAAkC;AAAA,UAAzB,aAAyB;;AAC5C,oBAAY,mBAAZ,CAAgC,WAAhC,EAA6C,cAA7C;AACA,oBAAY,MAAZ,EAAoB,QAApB,EAA6B,KAA7B,EAAoC,WAApC,EAAiD,cAAjD;AACD;AACF,GA/CD;AAgDD;;AAED,SAAS,MAAT,CAAiB,KAAjB,EAAwB;AACtB,OAAK,IAAI,MAAI,CAAb,EAAgB,MAAI,MAAM,YAAN,CAAmB,MAAvC,EAA+C,KAA/C,EAAoD;AAClD,QAAM,cAAc,MAAM,YAAN,CAAmB,GAAnB,CAApB;;AAEA,gBAAY,GAAZ,CAAgB,KAAhB;AACA,YAAQ,IAAR,CAAa,QAAb,EAAuB,EAAE,YAAF,EAAS,wBAAT,EAAvB;AACD;AACF;;AAED,IAAM,YAAY,CAAE,+BAAF,CAAlB;AACA,IAAM,cAAc,QAAQ,WAA5B;;AAEA,IAAI,WAAW,YAAf,EAA6B;AAC3B,YAAU,YAAY,IAAtB,IAAgC,UAAU,WAA1C;AACA,YAAU,YAAY,IAAtB,IAAgC,UAAU,WAA1C;AACA,YAAU,YAAY,EAAtB,IAAgC,UAAU,SAA1C;AACA,YAAU,YAAY,MAAtB,IAAgC,UAAU,SAA1C;AACD,CALD,MAMK;AACH,YAAU,SAAV,GAAwB,UAAU,WAAlC;AACA,YAAU,SAAV,GAAwB,UAAU,WAAlC;AACA,YAAU,OAAV,GAAwB,UAAU,SAAlC;;AAEA,YAAU,UAAV,GAAwB,UAAU,WAAlC;AACA,YAAU,SAAV,GAAwB,UAAU,WAAlC;AACA,YAAU,QAAV,GAAwB,UAAU,SAAlC;AACA,YAAU,WAAV,GAAwB,UAAU,SAAlC;AACD;;AAED,UAAU,IAAV,GAAiB,MAAjB;;AAEA,SAAS,WAAT,QAA+B,UAA/B,EAA2C;AAAA,MAAnB,GAAmB,SAAnB,GAAmB;;AACzC,MAAM,cAAc,WAAW,OAAX,CAAmB,KAAnB,MAA8B,CAA9B,GAChB,OAAO,GADS,GACH,OAAO,MADxB;;AAGA;AACA,OAAK,IAAM,SAAX,IAAwB,MAAM,eAA9B,EAA+C;AAC7C,gBAAY,GAAZ,EAAiB,SAAjB,EAA4B,OAAO,gBAAnC;AACA,gBAAY,GAAZ,EAAiB,SAAjB,EAA4B,OAAO,kBAAnC,EAAuD,IAAvD;AACD;;AAED,OAAK,IAAM,UAAX,IAAwB,SAAxB,EAAmC;AACjC,gBAAY,GAAZ,EAAiB,UAAjB,EAA4B,UAAU,UAAV,CAA5B;AACD;AACF;;AAED,QAAQ,EAAR,CAAW,qBAAX,EAAkC,iBAAiF;AAAA,MAA9E,WAA8E,SAA9E,WAA8E;AAAA,MAAjE,OAAiE,SAAjE,OAAiE;AAAA,MAAxD,SAAwD,SAAxD,SAAwD;AAAA,MAA7C,YAA6C,SAA7C,YAA6C;AAAA,MAA/B,KAA+B,SAA/B,KAA+B;AAAA,MAAxB,WAAwB,SAAxB,WAAwB;AAAA,MAAX,IAAW,SAAX,IAAW;;AACjH,cAAY,UAAZ,CAAuB,YAAvB,IAAuC,SAAvC;AACA,cAAY,QAAZ,CAAqB,YAArB,IAAqC,OAArC;;AAEA,MAAI,IAAJ,EAAU;AACR,gBAAY,aAAZ,GAA4B,IAA5B;AACD;;AAED,MAAI,CAAC,YAAY,WAAZ,EAAL,EAAgC;AAC9B,UAAM,SAAN,CAAgB,YAAY,WAA5B,EAAyC,YAAY,QAArD;;AAEA,UAAM,UAAN,CAAiB,YAAY,SAA7B,EAAyC,YAAY,WAArD;AACA,UAAM,UAAN,CAAiB,YAAY,UAA7B,EAAyC,YAAY,WAArD;;AAEA,gBAAY,SAAZ,GAAwC,KAAxC;AACA,gBAAY,SAAZ,CAAsB,YAAtB,IAAwC,YAAY,SAAZ,CAAsB,SAA9D;AACA,gBAAY,WAAZ,CAAwB,YAAxB,IAAwC,eAAe,SAAS,MAAM,eAAN,CAAsB,KAAtB,EAA6B,CAA7B,CAAhE;AACA,gBAAY,eAAZ,GAAwC,KAAxC;;AAEA,UAAM,aAAN,CAAoB,YAAY,WAAhC,EAA6C,OAA7C;AACD;AACF,CArBD;;AAuBA,MAAM,OAAN,CAAc,EAAd,CAAiB,cAAjB,EAAoC,WAApC;AACA,MAAM,OAAN,CAAc,EAAd,CAAiB,iBAAjB,EAAoC,WAApC;;AAEA,YAAY,oBAAZ,GAAmC,CAAnC;AACA,YAAY,gBAAZ,GAA+B,gBAA/B;AACA,YAAY,MAAZ,GAAqB,MAArB;AACA,YAAY,OAAZ,GAAsB,OAAtB;AACA,YAAY,SAAZ,GAAwB,SAAxB;;AAEA,MAAM,kBAAN,GAA2B,MAA3B;;AAEA,OAAO,OAAP,GAAiB,WAAjB;;;;;AC/fA,IAAM,cAAgB,QAAQ,gBAAR,CAAtB;AACA,IAAM,gBAAgB,QAAQ,kBAAR,CAAtB;;AAEA,IAAM,UAAU;AACd,4BADc;AAEd,SAAO,EAFO;AAGd,cAAY;AAHE,CAAhB;;AAMA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,cAAvB,EAAuC,gBAAkC;AAAA,MAAtB,WAAsB,QAAtB,WAAsB;AAAA,MAAT,KAAS,QAAT,KAAS;;AACvE,cAAY,YAAZ,GAA2B,IAA3B;AACA,eAAa,WAAb,EAA0B,KAA1B,EAAiC,OAAjC;AACD,CAHD;;AAKA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,aAAvB,EAAsC,iBAA0C;AAAA,MAA9B,WAA8B,SAA9B,WAA8B;AAAA,MAAjB,KAAiB,SAAjB,KAAiB;AAAA,MAAV,MAAU,SAAV,MAAU;;AAC9E,eAAa,WAAb,EAA0B,KAA1B,EAAiC,MAAjC,EAAyC,MAAzC;;AAEA;AACA,MAAI,CAAC,YAAY,WAAZ,EAAL,EAAgC;AAAE,WAAO,KAAP;AAAe;AAClD,CALD;;AAOA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,YAAvB,EAAqC,iBAAkC;AAAA,MAAtB,WAAsB,SAAtB,WAAsB;AAAA,MAAT,KAAS,SAAT,KAAS;;AACrE,eAAa,WAAb,EAA0B,KAA1B,EAAiC,KAAjC;AACD,CAFD;;AAIA,SAAS,YAAT,CAAuB,WAAvB,EAAoC,KAApC,EAA2C,KAA3C,EAAkD,MAAlD,EAA0D;AACxD,MAAM,aAAa,YAAY,QAAZ,CAAqB,IAAxC;;AAEA,MAAM,WAAW,IAAI,aAAJ,CAAkB,WAAlB,EAA+B,KAA/B,EAAsC,UAAtC,EAAkD,KAAlD,EAAyD,YAAY,OAArE,EAA8E,IAA9E,EAAoF,MAApF,CAAjB;;AAEA,cAAY,MAAZ,CAAmB,IAAnB,CAAwB,QAAxB;AACA,cAAY,SAAZ,GAAwB,QAAxB;AACD;;AAED,OAAO,OAAP,GAAiB,OAAjB;;;;;AClCA,IAAM,UAAiB,QAAQ,QAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,UAAR,CAAvB;AACA,IAAM,gBAAiB,QAAQ,kBAAR,CAAvB;AACA,IAAM,eAAiB,QAAQ,iBAAR,CAAvB;AACA,IAAM,cAAiB,QAAQ,gBAAR,CAAvB;AACA,IAAM,iBAAiB,QAAQ,mBAAR,CAAvB;;AAEA,IAAM,OAAO;AACX,YAAU;AACR,aAAc,KADN;AAER,kBAAc,IAFN;;AAIR,YAAY,IAJJ;AAKR,UAAY,IALJ;AAMR,cAAY,IANJ;AAOR,aAAY,IAPJ;AAQR,gBAAY,IARJ;;AAUR,eAAY,IAVJ;AAWR,cAAY;AAXJ,GADC;;AAeX,WAAS,iBAAU,OAAV,EAAmB,KAAnB,EAA0B,YAA1B,EAAwC;AAC/C,QAAM,cAAc,aAAa,OAAb,CAAqB,IAAzC;;AAEA,WAAO,YAAY,OAAZ,GACH,EAAE,MAAM,MAAR,EAAgB,MAAO,YAAY,QAAZ,KAAyB,OAAzB,GACE,YAAY,SADd,GAEE,YAAY,QAFrC,EADG,GAIH,IAJJ;AAKD,GAvBU;;AAyBX,aAAW,qBAAY;AACrB,WAAO,MAAP;AACD;AA3BU,CAAb;;AA8BA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,oBAAvB,EAA6C,gBAA2B;AAAA,MAAf,WAAe,QAAf,WAAe;;AACtE,MAAI,YAAY,QAAZ,CAAqB,IAArB,KAA8B,MAAlC,EAA0C;AAAE;AAAS;;AAErD,MAAM,OAAO,YAAY,QAAZ,CAAqB,IAAlC;;AAEA,MAAI,SAAS,GAAb,EAAkB;AAChB,gBAAY,SAAZ,CAAsB,IAAtB,CAA2B,CAA3B,GAAiC,YAAY,WAAZ,CAAwB,IAAxB,CAA6B,CAA9D;AACA,gBAAY,SAAZ,CAAsB,MAAtB,CAA6B,CAA7B,GAAiC,YAAY,WAAZ,CAAwB,MAAxB,CAA+B,CAAhE;;AAEA,gBAAY,YAAZ,CAAyB,IAAzB,CAA8B,KAA9B,GAAwC,KAAK,GAAL,CAAS,YAAY,YAAZ,CAAyB,IAAzB,CAA8B,EAAvC,CAAxC;AACA,gBAAY,YAAZ,CAAyB,MAAzB,CAAgC,KAAhC,GAAwC,KAAK,GAAL,CAAS,YAAY,YAAZ,CAAyB,MAAzB,CAAgC,EAAzC,CAAxC;AACA,gBAAY,YAAZ,CAAyB,MAAzB,CAAgC,EAAhC,GAAqC,CAArC;AACA,gBAAY,YAAZ,CAAyB,IAAzB,CAA8B,EAA9B,GAAqC,CAArC;AACD,GARD,MASK,IAAI,SAAS,GAAb,EAAkB;AACrB,gBAAY,SAAZ,CAAsB,IAAtB,CAA2B,CAA3B,GAAiC,YAAY,WAAZ,CAAwB,IAAxB,CAA6B,CAA9D;AACA,gBAAY,SAAZ,CAAsB,MAAtB,CAA6B,CAA7B,GAAiC,YAAY,WAAZ,CAAwB,MAAxB,CAA+B,CAAhE;;AAEA,gBAAY,YAAZ,CAAyB,IAAzB,CAA8B,KAA9B,GAAwC,KAAK,GAAL,CAAS,YAAY,YAAZ,CAAyB,IAAzB,CAA8B,EAAvC,CAAxC;AACA,gBAAY,YAAZ,CAAyB,MAAzB,CAAgC,KAAhC,GAAwC,KAAK,GAAL,CAAS,YAAY,YAAZ,CAAyB,MAAzB,CAAgC,EAAzC,CAAxC;AACA,gBAAY,YAAZ,CAAyB,MAAzB,CAAgC,EAAhC,GAAqC,CAArC;AACA,gBAAY,YAAZ,CAAyB,IAAzB,CAA8B,EAA9B,GAAqC,CAArC;AACD;AACF,CAvBD;;AAyBA;AACA,cAAc,OAAd,CAAsB,EAAtB,CAAyB,KAAzB,EAAgC,iBAAmC;AAAA,MAAvB,MAAuB,SAAvB,MAAuB;AAAA,MAAf,WAAe,SAAf,WAAe;;AACjE,MAAI,OAAO,IAAP,KAAgB,UAApB,EAAgC;AAAE;AAAS;;AAE3C,MAAM,OAAO,YAAY,QAAZ,CAAqB,IAAlC;;AAEA,MAAI,SAAS,GAAb,EAAkB;AAChB,WAAO,KAAP,GAAiB,YAAY,WAAZ,CAAwB,IAAxB,CAA6B,CAA9C;AACA,WAAO,OAAP,GAAiB,YAAY,WAAZ,CAAwB,MAAxB,CAA+B,CAAhD;AACA,WAAO,EAAP,GAAY,CAAZ;AACD,GAJD,MAKK,IAAI,SAAS,GAAb,EAAkB;AACrB,WAAO,KAAP,GAAiB,YAAY,WAAZ,CAAwB,IAAxB,CAA6B,CAA9C;AACA,WAAO,OAAP,GAAiB,YAAY,WAAZ,CAAwB,MAAxB,CAA+B,CAAhD;AACA,WAAO,EAAP,GAAY,CAAZ;AACD;AACF,CAfD;;AAiBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoCA,aAAa,SAAb,CAAuB,SAAvB,GAAmC,UAAU,OAAV,EAAmB;AACpD,MAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,OAAhB,CAAJ,EAA8B;AAC5B,SAAK,OAAL,CAAa,IAAb,CAAkB,OAAlB,GAA4B,QAAQ,OAAR,KAAoB,KAApB,GAA2B,KAA3B,GAAkC,IAA9D;AACA,SAAK,YAAL,CAAkB,MAAlB,EAA0B,OAA1B;AACA,SAAK,WAAL,CAAiB,MAAjB,EAAyB,OAAzB;;AAEA,QAAI,mBAAmB,IAAnB,CAAwB,QAAQ,QAAhC,CAAJ,EAA+C;AAC7C,WAAK,OAAL,CAAa,IAAb,CAAkB,QAAlB,GAA6B,QAAQ,QAArC;AACD;AACD,QAAI,aAAa,IAAb,CAAkB,QAAQ,SAA1B,CAAJ,EAA0C;AACxC,WAAK,OAAL,CAAa,IAAb,CAAkB,SAAlB,GAA8B,QAAQ,SAAtC;AACD;;AAED,WAAO,IAAP;AACD;;AAED,MAAI,MAAM,EAAN,CAAS,IAAT,CAAc,OAAd,CAAJ,EAA4B;AAC1B,SAAK,OAAL,CAAa,IAAb,CAAkB,OAAlB,GAA4B,OAA5B;;AAEA,QAAI,CAAC,OAAL,EAAc;AACZ,WAAK,WAAL,GAAmB,KAAK,WAAL,GAAmB,KAAK,SAAL,GAAiB,IAAvD;AACD;;AAED,WAAO,IAAP;AACD;;AAED,SAAO,KAAK,OAAL,CAAa,IAApB;AACD,CA3BD;;AA6BA,QAAQ,IAAR,GAAe,IAAf;AACA,QAAQ,KAAR,CAAc,IAAd,CAAmB,MAAnB;AACA,MAAM,KAAN,CAAY,aAAa,UAAzB,EAAqC,CACnC,WADmC,EAEnC,UAFmC,EAGnC,kBAHmC,EAInC,mBAJmC,EAKnC,SALmC,CAArC;AAOA,QAAQ,UAAR,CAAmB,IAAnB,GAA0B,WAA1B;;AAEA,eAAe,IAAf,GAAsB,KAAK,QAA3B;;AAEA,OAAO,OAAP,GAAiB,IAAjB;;;;;AC9JA,IAAM,UAAiB,QAAQ,QAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,UAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,UAAR,CAAvB;AACA,IAAM,WAAiB,QAAQ,aAAR,CAAvB;AACA,IAAM,gBAAiB,QAAQ,kBAAR,CAAvB;AACA,IAAM,eAAiB,QAAQ,iBAAR,CAAvB;AACA,IAAM,cAAiB,QAAQ,gBAAR,CAAvB;AACA,IAAM,iBAAiB,QAAQ,mBAAR,CAAvB;;AAEA,IAAM,OAAO;AACX,YAAU;AACR,aAAS,KADD;AAER,YAAS,IAFD;AAGR,aAAS;AAHD;AADC,CAAb;;AAQA,IAAI,cAAc,KAAlB;;AAEA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,cAAvB,EAAuC,gBAAkC;AAAA,MAAtB,WAAsB,QAAtB,WAAsB;AAAA,MAAT,KAAS,QAAT,KAAS;;AACvE,MAAI,YAAY,QAAZ,CAAqB,IAArB,KAA8B,MAAlC,EAA0C;AAAE;AAAS;;AAErD;AACA,cAAY,WAAZ,CAAwB,SAAxB,GAAoC,EAApC;AACA,cAAY,WAAZ,CAAwB,QAAxB,GAAoC,EAApC;AACA,cAAY,WAAZ,CAAwB,KAAxB,GAAoC,EAApC;;AAEA,cAAY,UAAZ,GAAyB,IAAzB;;AAEA,MAAI,CAAC,YAAY,WAAjB,EAA8B;AAC5B,mBAAe,WAAf,EAA4B,YAAY,OAAxC;AACD;;AAED,MAAM,YAAY,YAAY,SAA9B;AACA,MAAM,aAAa,cAAc,WAAd,EAA2B,KAA3B,EAAkC,SAAlC,CAAnB;;AAEA,MAAI,WAAW,QAAf,EAAyB;AACvB,oBAAgB,WAAhB,EAA6B,WAAW,QAAxC;AACD;AACF,CApBD;;AAsBA,cAAc,OAAd,CAAsB,EAAtB,CAAyB,KAAzB,EAAgC,iBAA0C;AAAA,MAA9B,WAA8B,SAA9B,WAA8B;AAAA,MAAjB,MAAiB,SAAjB,MAAiB;AAAA,MAAT,KAAS,SAAT,KAAS;;AACxE,MAAI,OAAO,IAAP,KAAgB,UAAhB,IAA8B,OAAO,IAAP,KAAgB,SAAlD,EAA6D;AAAE;AAAS;;AAExE,MAAM,mBAAmB,YAAY,OAArC;AACA,MAAM,YAAY,MAAlB;AACA,MAAM,aAAa,QAAQ,SAAR,EAAmB,KAAnB,EAA0B,gBAA1B,CAAnB;;AAEA,cAAY,UAAZ,GAA0B,WAAW,QAArC;AACA,cAAY,WAAZ,GAA0B,WAAW,OAArC;;AAEA,cAAY,UAAZ,GAAyB,cAAc,WAAd,EAA2B,KAA3B,EAAkC,SAAlC,CAAzB;AACD,CAXD;;AAaA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,aAAvB,EAAsC,iBAA2B;AAAA,MAAf,WAAe,SAAf,WAAe;;AAC/D,MAAI,YAAY,QAAZ,CAAqB,IAArB,KAA8B,MAAlC,EAA0C;AAAE;AAAS;;AAErD,iBAAe,WAAf,EAA4B,YAAY,UAAxC;AACD,CAJD;;AAMA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,YAAvB,EAAqC,iBAA2B;AAAA,MAAf,WAAe,SAAf,WAAe;;AAC9D,MAAI,YAAY,QAAZ,CAAqB,IAArB,KAA8B,MAAlC,EAA0C;AACxC,mBAAe,WAAf,EAA4B,YAAY,UAAxC;AACD;AACF,CAJD;;AAMA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,WAAvB,EAAoC,iBAA2B;AAAA,MAAf,WAAe,SAAf,WAAe;;AAC7D,cAAY,WAAZ,CAAwB,SAAxB,GACE,YAAY,WAAZ,CAAwB,QAAxB,GACA,YAAY,WAAZ,CAAwB,KAAxB,GACA,YAAY,UAAZ,GAAyB,IAH3B;AAID,CALD;;AAOA,SAAS,YAAT,CAAuB,WAAvB,EAAoC,OAApC,EAA6C;AAC3C,MAAM,QAAQ,EAAd;AACA,MAAM,WAAW,EAAjB;;AAEA,YAAU,WAAW,YAAY,OAAjC;;AAEA;AACA,uBAAsB,MAAM,aAA5B,kHAA2C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,QAAhC,OAAgC;;AACzC,QAAI,CAAC,QAAQ,OAAR,CAAgB,IAAhB,CAAqB,OAA1B,EAAmC;AAAE;AAAW;;AAEhD,QAAM,SAAS,QAAQ,OAAR,CAAgB,IAAhB,CAAqB,MAApC;;AAEA;AACA,QAAK,MAAM,EAAN,CAAS,OAAT,CAAiB,MAAjB,KAA4B,WAAW,OAAxC,IACI,MAAM,EAAN,CAAS,MAAT,CAAgB,MAAhB,KACD,CAAC,MAAM,eAAN,CAAsB,OAAtB,EAA+B,MAA/B,CAFR,EAEiD;;AAE/C;AACD;;AAED;AACA,QAAM,eAAe,MAAM,EAAN,CAAS,MAAT,CAAgB,QAAQ,MAAxB,IACjB,QAAQ,QAAR,CAAiB,gBAAjB,CAAkC,QAAQ,MAA1C,CADiB,GAEjB,CAAC,QAAQ,MAAT,CAFJ;;AAIA,SAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,aAAa,MAAjC,EAAyC,GAAzC,EAA8C;AAC5C,UAAM,iBAAiB,aAAa,CAAb,CAAvB;;AAEA,UAAI,mBAAmB,OAAvB,EAAgC;AAC9B,cAAM,IAAN,CAAW,OAAX;AACA,iBAAS,IAAT,CAAc,cAAd;AACD;AACF;AACF;;AAED,SAAO;AACL,sBADK;AAEL,eAAW;AAFN,GAAP;AAID;;AAED,SAAS,eAAT,CAA0B,WAA1B,EAAuC,KAAvC,EAA8C;AAC5C,MAAI,oBAAJ;;AAEA;AACA,OAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,YAAY,WAAZ,CAAwB,SAAxB,CAAkC,MAAtD,EAA8D,GAA9D,EAAmE;AACjE,QAAM,UAAU,YAAY,WAAZ,CAAwB,SAAxB,CAAkC,CAAlC,CAAhB;AACA,QAAM,iBAAiB,YAAY,WAAZ,CAAwB,QAAxB,CAAkC,CAAlC,CAAvB;;AAEA;AACA,QAAI,mBAAmB,WAAvB,EAAoC;AAClC;AACA,YAAM,MAAN,GAAe,cAAf;AACA,cAAQ,IAAR,CAAa,KAAb;AACD;AACD,kBAAc,cAAd;AACD;AACF;;AAED;AACA;AACA;AACA,SAAS,cAAT,CAAyB,WAAzB,EAAsC,WAAtC,EAAmD;AACjD;AACA,MAAM,gBAAgB,aAAa,WAAb,EAA0B,WAA1B,EAAuC,IAAvC,CAAtB;;AAEA,cAAY,WAAZ,CAAwB,SAAxB,GAAoC,cAAc,SAAlD;AACA,cAAY,WAAZ,CAAwB,QAAxB,GAAoC,cAAc,QAAlD;AACA,cAAY,WAAZ,CAAwB,KAAxB,GAAoC,EAApC;;AAEA,OAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,YAAY,WAAZ,CAAwB,SAAxB,CAAkC,MAAtD,EAA8D,GAA9D,EAAmE;AACjE,gBAAY,WAAZ,CAAwB,KAAxB,CAA8B,CAA9B,IACE,YAAY,WAAZ,CAAwB,SAAxB,CAAkC,CAAlC,EAAqC,OAArC,CAA6C,YAAY,WAAZ,CAAwB,QAAxB,CAAiC,CAAjC,CAA7C,CADF;AAED;AACF;;AAED,SAAS,OAAT,CAAkB,SAAlB,EAA6B,KAA7B,EAAoC,WAApC,EAAiD;AAC/C,MAAM,cAAc,UAAU,WAA9B;AACA,MAAM,aAAa,EAAnB;;AAEA,MAAI,WAAJ,EAAiB;AACf,mBAAe,WAAf,EAA4B,WAA5B;AACD;;AAED;AACA,OAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,YAAY,WAAZ,CAAwB,SAAxB,CAAkC,MAAtD,EAA8D,GAA9D,EAAmE;AACjE,QAAM,UAAiB,YAAY,WAAZ,CAAwB,SAAxB,CAAkC,CAAlC,CAAvB;AACA,QAAM,iBAAiB,YAAY,WAAZ,CAAwB,QAAxB,CAAkC,CAAlC,CAAvB;AACA,QAAM,OAAiB,YAAY,WAAZ,CAAwB,KAAxB,CAAkC,CAAlC,CAAvB;;AAEA,eAAW,IAAX,CAAgB,QAAQ,SAAR,CAAkB,SAAlB,EAA6B,KAA7B,EAAoC,YAAY,MAAhD,EAAwD,WAAxD,EAAqE,cAArE,EAAqF,IAArF,IACZ,cADY,GAEZ,IAFJ;AAGD;;AAED;AACA,MAAM,YAAY,MAAM,qBAAN,CAA4B,UAA5B,CAAlB;;AAEA,SAAO;AACL,cAAU,YAAY,WAAZ,CAAwB,SAAxB,CAAkC,SAAlC,KAAgD,IADrD;AAEL,aAAU,YAAY,WAAZ,CAAwB,QAAxB,CAAkC,SAAlC,KAAgD;AAFrD,GAAP;AAID;;AAED,SAAS,aAAT,CAAwB,WAAxB,EAAqC,YAArC,EAAmD,SAAnD,EAA8D;AAC5D,MAAM,aAAa;AACjB,WAAY,IADK;AAEjB,WAAY,IAFK;AAGjB,cAAY,IAHK;AAIjB,gBAAY,IAJK;AAKjB,UAAY,IALK;AAMjB,UAAY;AANK,GAAnB;;AASA,MAAM,OAAO;AACX,wBADW;AAEX,4BAFW;AAGX,YAAe,YAAY,WAHhB;AAIX,cAAe,YAAY,UAJhB;AAKX,mBAAe,UAAU,MALd;AAMX,eAAe,UAAU,YANd;AAOX,eAAe,UAAU;AAPd,GAAb;;AAUA,MAAI,YAAY,WAAZ,KAA4B,YAAY,eAA5C,EAA6D;AAC3D;AACA,QAAI,YAAY,cAAhB,EAAgC;AAC9B,iBAAW,KAAX,GAAmB,MAAM,MAAN,CAAa,EAAE,MAAM,WAAR,EAAb,EAAoC,IAApC,CAAnB;;AAEA,gBAAU,SAAV,GAAyB,WAAW,KAAX,CAAiB,MAAjB,GAA4B,YAAY,eAAjE;AACA,gBAAU,YAAV,GAAyB,WAAW,KAAX,CAAiB,QAAjB,GAA4B,YAAY,cAAjE;AACD;AACD;AACA,QAAI,YAAY,UAAhB,EAA4B;AAC1B,iBAAW,KAAX,GAAmB;AACjB,4BADiB;AAEjB,gCAFiB;AAGjB,gBAAe,YAAY,WAHV;AAIjB,kBAAe,YAAY,UAJV;AAKjB,uBAAe,UAAU,MALR;AAMjB,mBAAe,UAAU,YANR;AAOjB,mBAAe,UAAU,SAPR;AAQjB,cAAe;AARE,OAAnB;;AAWA,gBAAU,SAAV,GAAsB,YAAY,WAAlC;AACA,gBAAU,QAAV,GAAqB,YAAY,UAAjC;AACD;AACF;;AAED,MAAI,UAAU,IAAV,KAAmB,SAAnB,IAAgC,YAAY,UAAhD,EAA4D;AAC1D,eAAW,IAAX,GAAkB,MAAM,MAAN,CAAa,EAAE,MAAM,MAAR,EAAb,EAA+B,IAA/B,CAAlB;;AAEA,cAAU,QAAV,GAAqB,YAAY,UAAjC;AACA,cAAU,aAAV,GAA0B,YAAY,WAAtC;AACD;AACD,MAAI,UAAU,IAAV,KAAmB,WAAvB,EAAoC;AAClC,eAAW,QAAX,GAAsB,MAAM,MAAN,CAAa,EAAE,MAAM,cAAR,EAAb,EAAuC,IAAvC,CAAtB;;AAEA,eAAW,QAAX,CAAoB,MAApB,GAA+B,IAA/B;AACA,eAAW,QAAX,CAAoB,QAApB,GAA+B,IAA/B;AACD;AACD,MAAI,UAAU,IAAV,KAAmB,SAAvB,EAAkC;AAChC,eAAW,UAAX,GAAwB,MAAM,MAAN,CAAa,EAAE,MAAM,gBAAR,EAAb,EAAyC,IAAzC,CAAxB;;AAEA,eAAW,UAAX,CAAsB,MAAtB,GAAiC,IAAjC;AACA,eAAW,UAAX,CAAsB,QAAtB,GAAiC,IAAjC;AACD;AACD,MAAI,UAAU,IAAV,KAAmB,UAAnB,IAAiC,YAAY,UAAjD,EAA6D;AAC3D,eAAW,IAAX,GAAkB,MAAM,MAAN,CAAa;AAC7B,gBAAe,SADc;AAE7B,YAAe;AAFc,KAAb,EAGf,IAHe,CAAlB;;AAKA,cAAU,QAAV,GAAqB,YAAY,UAAjC;AACD;;AAED,SAAO,UAAP;AACD;;AAED,SAAS,cAAT,CAAyB,WAAzB,EAAsC,UAAtC,EAAkD;AAChD,MAAI,WAAW,KAAf,EAAsB;AAAE,gBAAY,cAAZ,CAA2B,IAA3B,CAAgC,WAAW,KAA3C;AAAoD;AAC5E,MAAI,WAAW,IAAf,EAAsB;AAAM,gBAAY,UAAZ,CAAuB,IAAvB,CAA4B,WAAW,IAAvC;AAAgD;AAC5E,MAAI,WAAW,KAAf,EAAsB;AAAM,gBAAY,UAAZ,CAAuB,IAAvB,CAA4B,WAAW,KAAvC;AAAgD;AAC5E,MAAI,WAAW,IAAf,EAAsB;AAAM,gBAAY,UAAZ,CAAuB,IAAvB,CAA4B,WAAW,IAAvC;AAAgD;AAC5E,MAAI,WAAW,UAAf,EAA2B;AACzB,oBAAgB,WAAhB,EAA6B,WAAW,UAAxC;AACD;;AAED,cAAY,cAAZ,GAA8B,YAAY,UAA1C;AACA,cAAY,eAAZ,GAA8B,YAAY,WAA1C;AACD;;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoDA,aAAa,SAAb,CAAuB,QAAvB,GAAkC,UAAU,OAAV,EAAmB;AACnD,MAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,OAAhB,CAAJ,EAA8B;AAC5B,SAAK,OAAL,CAAa,IAAb,CAAkB,OAAlB,GAA4B,QAAQ,OAAR,KAAoB,KAApB,GAA2B,KAA3B,GAAkC,IAA9D;;AAEA,QAAI,MAAM,EAAN,CAAS,QAAT,CAAkB,QAAQ,MAA1B,CAAJ,EAAiD;AAAE,WAAK,MAAL,CAAY,MAAZ,GAA+B,QAAQ,MAAvC;AAA0D;AAC7G,QAAI,MAAM,EAAN,CAAS,QAAT,CAAkB,QAAQ,cAA1B,CAAJ,EAAiD;AAAE,WAAK,MAAL,CAAY,cAAZ,GAA+B,QAAQ,cAAvC;AAA0D;AAC7G,QAAI,MAAM,EAAN,CAAS,QAAT,CAAkB,QAAQ,gBAA1B,CAAJ,EAAiD;AAAE,WAAK,MAAL,CAAY,gBAAZ,GAA+B,QAAQ,gBAAvC;AAA0D;AAC7G,QAAI,MAAM,EAAN,CAAS,QAAT,CAAkB,QAAQ,WAA1B,CAAJ,EAAiD;AAAE,WAAK,MAAL,CAAY,WAAZ,GAA+B,QAAQ,WAAvC;AAA0D;AAC7G,QAAI,MAAM,EAAN,CAAS,QAAT,CAAkB,QAAQ,WAA1B,CAAJ,EAAiD;AAAE,WAAK,MAAL,CAAY,WAAZ,GAA+B,QAAQ,WAAvC;AAA0D;AAC7G,QAAI,MAAM,EAAN,CAAS,QAAT,CAAkB,QAAQ,UAA1B,CAAJ,EAAiD;AAAE,WAAK,MAAL,CAAY,UAAZ,GAA+B,QAAQ,UAAvC;AAA0D;;AAE7G,QAAI,qBAAqB,IAArB,CAA0B,QAAQ,OAAlC,CAAJ,EAAgD;AAC9C,WAAK,OAAL,CAAa,IAAb,CAAkB,OAAlB,GAA4B,QAAQ,OAApC;AACD,KAFD,MAGK,IAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,QAAQ,OAAxB,CAAJ,EAAsC;AACzC,WAAK,OAAL,CAAa,IAAb,CAAkB,OAAlB,GAA4B,KAAK,GAAL,CAAS,KAAK,GAAL,CAAS,CAAT,EAAY,QAAQ,OAApB,CAAT,EAAuC,CAAvC,CAA5B;AACD;AACD,QAAI,YAAY,OAAhB,EAAyB;AACvB,WAAK,OAAL,CAAa,IAAb,CAAkB,MAAlB,GAA2B,QAAQ,MAAnC;AACD;AACD,QAAI,aAAa,OAAjB,EAA0B;AACxB,WAAK,OAAL,CAAa,IAAb,CAAkB,OAAlB,GAA4B,QAAQ,OAApC;AACD;;AAGD,WAAO,IAAP;AACD;;AAED,MAAI,MAAM,EAAN,CAAS,IAAT,CAAc,OAAd,CAAJ,EAA4B;AAC1B,SAAK,OAAL,CAAa,IAAb,CAAkB,OAAlB,GAA4B,OAA5B;;AAEA,QAAI,CAAC,OAAL,EAAc;AACZ,WAAK,WAAL,GAAmB,KAAK,WAAL,GAAmB,KAAK,MAAL,GAClC,KAAK,cAAL,GAAsB,KAAK,gBAAL,GAAwB,IADlD;AAED;;AAED,WAAO,IAAP;AACD;;AAED,SAAO,KAAK,OAAL,CAAa,IAApB;AACD,CAxCD;;AA0CA,aAAa,SAAb,CAAuB,SAAvB,GAAmC,UAAU,SAAV,EAAqB,KAArB,EAA4B,SAA5B,EAAuC,gBAAvC,EAAyD,WAAzD,EAAsE,IAAtE,EAA4E;AAC7G,MAAI,UAAU,KAAd;;AAEA;AACA;AACA,MAAI,EAAE,OAAO,QAAQ,KAAK,OAAL,CAAa,WAAb,CAAjB,CAAJ,EAAiD;AAC/C,WAAQ,KAAK,OAAL,CAAa,IAAb,CAAkB,OAAlB,GACJ,KAAK,OAAL,CAAa,IAAb,CAAkB,OAAlB,CAA0B,SAA1B,EAAqC,KAArC,EAA4C,OAA5C,EAAqD,IAArD,EAA2D,WAA3D,EAAwE,SAAxE,EAAmF,gBAAnF,CADI,GAEJ,KAFJ;AAGD;;AAED,MAAM,cAAc,KAAK,OAAL,CAAa,IAAb,CAAkB,OAAtC;;AAEA,MAAI,gBAAgB,SAApB,EAA+B;AAC7B,QAAM,SAAS,MAAM,WAAN,CAAkB,SAAlB,EAA6B,gBAA7B,EAA+C,MAA/C,CAAf;AACA,QAAM,OAAO,MAAM,SAAN,CAAgB,SAAhB,CAAb;;AAEA,SAAK,CAAL,IAAU,OAAO,CAAjB;AACA,SAAK,CAAL,IAAU,OAAO,CAAjB;;AAEA,QAAM,aAAc,KAAK,CAAL,GAAS,KAAK,IAAf,IAAyB,KAAK,CAAL,GAAS,KAAK,KAA1D;AACA,QAAM,WAAc,KAAK,CAAL,GAAS,KAAK,GAAf,IAAyB,KAAK,CAAL,GAAS,KAAK,MAA1D;;AAEA,cAAU,cAAc,QAAxB;AACD;;AAED,MAAM,WAAW,UAAU,OAAV,CAAkB,gBAAlB,CAAjB;;AAEA,MAAI,YAAY,gBAAgB,QAAhC,EAA0C;AACxC,QAAM,KAAK,SAAS,IAAT,GAAgB,SAAS,KAAT,GAAkB,CAA7C;AACA,QAAM,KAAK,SAAS,GAAT,GAAgB,SAAS,MAAT,GAAkB,CAA7C;;AAEA,cAAU,MAAM,KAAK,IAAX,IAAmB,MAAM,KAAK,KAA9B,IAAuC,MAAM,KAAK,GAAlD,IAAyD,MAAM,KAAK,MAA9E;AACD;;AAED,MAAI,YAAY,MAAM,EAAN,CAAS,MAAT,CAAgB,WAAhB,CAAhB,EAA8C;AAC5C,QAAM,cAAgB,KAAK,GAAL,CAAS,CAAT,EAAY,KAAK,GAAL,CAAS,KAAK,KAAd,EAAsB,SAAS,KAA/B,IAAyC,KAAK,GAAL,CAAS,KAAK,IAAd,EAAoB,SAAS,IAA7B,CAArD,IACE,KAAK,GAAL,CAAS,CAAT,EAAY,KAAK,GAAL,CAAS,KAAK,MAAd,EAAsB,SAAS,MAA/B,IAAyC,KAAK,GAAL,CAAS,KAAK,GAAd,EAAoB,SAAS,GAA7B,CAArD,CADxB;;AAGA,QAAM,eAAe,eAAe,SAAS,KAAT,GAAiB,SAAS,MAAzC,CAArB;;AAEA,cAAU,gBAAgB,WAA1B;AACD;;AAED,MAAI,KAAK,OAAL,CAAa,IAAb,CAAkB,OAAtB,EAA+B;AAC7B,cAAU,KAAK,OAAL,CAAa,IAAb,CAAkB,OAAlB,CAA0B,SAA1B,EAAqC,KAArC,EAA4C,OAA5C,EAAqD,IAArD,EAA2D,WAA3D,EAAwE,SAAxE,EAAmF,gBAAnF,CAAV;AACD;;AAED,SAAO,OAAP;AACD,CAjDD;;AAmDA,aAAa,OAAb,CAAqB,EAArB,CAAwB,OAAxB,EAAiC,iBAA4B;AAAA,MAAhB,YAAgB,SAAhB,YAAgB;;AAC3D,eAAa,QAAb,CAAsB,KAAtB;AACD,CAFD;;AAIA,aAAa,eAAb,CAA6B,IAA7B,CAAkC,aAAlC;;AAEA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,KAAvB,EAA8B,UAAU,WAAV,EAAuB;AACnD,cAAY,UAAZ,GAA8B,IAA9B,CADmD,CACf;AACpC,cAAY,WAAZ,GAA8B,IAA9B,CAFmD,CAEf;AACpC,cAAY,cAAZ,GAA8B,IAA9B,CAHmD,CAGf;AACpC,cAAY,eAAZ,GAA8B,IAA9B,CAJmD,CAIf;AACpC,cAAY,UAAZ,GAA8B,IAA9B,CALmD,CAKf;;AAEpC,cAAY,WAAZ,GAA0B;AACxB,eAAW,EADa,EACJ;AACpB,cAAW,EAFa,EAEJ;AACpB,WAAW,EAHa,CAGJ;AAHI,GAA1B;AAMD,CAbD;;AAeA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,MAAvB,EAA+B,iBAA2B;AAAA,MAAf,WAAe,SAAf,WAAe;;AACxD,cAAY,UAAZ,GAAyB,YAAY,WAAZ,GACvB,YAAY,cAAZ,GAA6B,YAAY,eAAZ,GAA8B,IAD7D;AAED,CAHD;;AAKA;;;;;;;;;;;AAWA,SAAS,WAAT,GAAuB,UAAU,QAAV,EAAoB;AACzC,MAAI,MAAM,EAAN,CAAS,IAAT,CAAc,QAAd,CAAJ,EAA6B;AAC3B;AACE;AACF;;AAEA,kBAAc,QAAd;;AAEA,WAAO,QAAP;AACD;AACD,SAAO,WAAP;AACD,CAXD;;AAaA,MAAM,KAAN,CAAY,aAAa,UAAzB,EAAqC,CACnC,WADmC,EAEnC,WAFmC,EAGnC,cAHmC,EAInC,gBAJmC,EAKnC,UALmC,EAMnC,MANmC,CAArC;AAQA,QAAQ,UAAR,CAAmB,IAAnB,GAA0B,UAA1B;;AAEA,eAAe,IAAf,GAAsB,KAAK,QAA3B;;AAEA,OAAO,OAAP,GAAiB,IAAjB;;;;;ACzdA,IAAM,UAAiB,QAAQ,QAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,UAAR,CAAvB;AACA,IAAM,gBAAiB,QAAQ,kBAAR,CAAvB;AACA,IAAM,eAAiB,QAAQ,iBAAR,CAAvB;AACA,IAAM,cAAiB,QAAQ,gBAAR,CAAvB;AACA,IAAM,iBAAiB,QAAQ,mBAAR,CAAvB;;AAEA,IAAM,UAAU;AACd,YAAU;AACR,aAAU,KADF;AAER,YAAU,IAFF;AAGR,cAAU;AAHF,GADI;;AAOd,WAAS,iBAAU,OAAV,EAAmB,KAAnB,EAA0B,YAA1B,EAAwC,OAAxC,EAAiD,WAAjD,EAA8D;AACrE,QAAI,YAAY,UAAZ,CAAuB,MAAvB,IAAiC,CAArC,EAAwC;AACtC,aAAO,EAAE,MAAM,SAAR,EAAP;AACD;;AAED,WAAO,IAAP;AACD,GAba;;AAed,aAAW,qBAAY;AACrB,WAAO,EAAP;AACD;AAjBa,CAAhB;;AAoBA,cAAc,OAAd,CAAsB,EAAtB,CAAyB,KAAzB,EAAgC,gBAAmC;AAAA,MAAvB,MAAuB,QAAvB,MAAuB;AAAA,MAAf,WAAe,QAAf,WAAe;;AACjE,MAAI,OAAO,IAAP,KAAgB,cAApB,EAAoC;AAAE;AAAS;AAC/C,SAAO,EAAP,GAAY,CAAZ;;AAEA,cAAY,OAAZ,CAAoB,aAApB,GAAoC,YAAY,OAAZ,CAAoB,YAApB,GAAmC,OAAO,QAA9E;AACA,cAAY,OAAZ,CAAoB,UAApB,GAAiC,YAAY,OAAZ,CAAoB,SAApB,GAAgC,OAAO,KAAxE;AACA,cAAY,OAAZ,CAAoB,KAApB,GAA4B,CAA5B;AACD,CAPD;;AASA,cAAc,OAAd,CAAsB,EAAtB,CAAyB,KAAzB,EAAgC,iBAAmC;AAAA,MAAvB,MAAuB,SAAvB,MAAuB;AAAA,MAAf,WAAe,SAAf,WAAe;;AACjE,MAAI,OAAO,IAAP,KAAgB,aAApB,EAAmC;AAAE;AAAS;;AAE9C,SAAO,EAAP,GAAY,OAAO,KAAP,GAAe,YAAY,OAAZ,CAAoB,KAA/C;;AAEA,cAAY,MAAZ,CAAmB,IAAnB,CAAwB,MAAxB;;AAEA,cAAY,OAAZ,CAAoB,SAApB,GAAgC,OAAO,KAAvC;AACA,cAAY,OAAZ,CAAoB,YAApB,GAAmC,OAAO,QAA1C;;AAEA,MAAI,OAAO,KAAP,KAAiB,QAAjB,IACG,OAAO,KAAP,KAAiB,IADpB,IAEG,OAAO,KAAP,KAAiB,SAFpB,IAGG,CAAC,MAAM,OAAO,KAAb,CAHR,EAG6B;;AAE3B,gBAAY,OAAZ,CAAoB,KAApB,GAA4B,OAAO,KAAnC;AACD;AACF,CAjBD;;AAmBA;;;;;;;;;;;;;;;;;;;;;;;AAuBA,aAAa,SAAb,CAAuB,UAAvB,GAAoC,UAAU,OAAV,EAAmB;AACrD,MAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,OAAhB,CAAJ,EAA8B;AAC5B,SAAK,OAAL,CAAa,OAAb,CAAqB,OAArB,GAA+B,QAAQ,OAAR,KAAoB,KAApB,GAA2B,KAA3B,GAAkC,IAAjE;AACA,SAAK,YAAL,CAAkB,SAAlB,EAA6B,OAA7B;AACA,SAAK,WAAL,CAAiB,SAAjB,EAA4B,OAA5B;;AAEA,WAAO,IAAP;AACD;;AAED,MAAI,MAAM,EAAN,CAAS,IAAT,CAAc,OAAd,CAAJ,EAA4B;AAC1B,SAAK,OAAL,CAAa,OAAb,CAAqB,OAArB,GAA+B,OAA/B;;AAEA,QAAI,CAAC,OAAL,EAAc;AACZ,WAAK,cAAL,GAAsB,KAAK,cAAL,GAAsB,KAAK,YAAL,GAAoB,IAAhE;AACD;;AAED,WAAO,IAAP;AACD;;AAED,SAAO,KAAK,OAAL,CAAa,OAApB;AACD,CApBD;;AAsBA,cAAc,OAAd,CAAsB,EAAtB,CAAyB,WAAzB,EAAsC,iBAAiF;AAAA,MAArE,WAAqE,SAArE,WAAqE;AAAA,MAAxD,MAAwD,SAAxD,MAAwD;AAAA,MAAhD,MAAgD,SAAhD,MAAgD;AAAA,MAAxC,KAAwC,SAAxC,KAAwC;AAAA,MAAjC,QAAiC,SAAjC,QAAiC;AAAA,MAAvB,MAAuB,SAAvB,MAAuB;AAAA,MAAf,WAAe,SAAf,WAAe;;AACrH,MAAI,WAAW,SAAf,EAA0B;AAAE;AAAS;;AAErC,MAAM,WAAW,YAAY,QAA7B;;AAEA,SAAO,OAAP,GAAiB,CAAC,SAAS,CAAT,CAAD,EAAc,SAAS,CAAT,CAAd,CAAjB;;AAEA,MAAI,QAAJ,EAAc;AACZ,WAAO,QAAP,GAAkB,MAAM,aAAN,CAAoB,QAApB,EAA8B,WAA9B,CAAlB;AACA,WAAO,GAAP,GAAkB,MAAM,SAAN,CAAgB,QAAhB,CAAlB;AACA,WAAO,KAAP,GAAkB,CAAlB;AACA,WAAO,EAAP,GAAkB,CAAlB;AACA,WAAO,KAAP,GAAkB,MAAM,UAAN,CAAiB,QAAjB,EAA2B,SAA3B,EAAsC,WAAtC,CAAlB;AACA,WAAO,EAAP,GAAkB,CAAlB;AACD,GAPD,MAQK,IAAI,UAAU,iBAAiB,aAA/B,EAA8C;AACjD,WAAO,QAAP,GAAkB,YAAY,SAAZ,CAAsB,QAAxC;AACA,WAAO,GAAP,GAAkB,YAAY,SAAZ,CAAsB,GAAxC;AACA,WAAO,KAAP,GAAkB,YAAY,SAAZ,CAAsB,KAAxC;AACA,WAAO,EAAP,GAAkB,OAAO,KAAP,GAAe,CAAjC;AACA,WAAO,KAAP,GAAkB,YAAY,SAAZ,CAAsB,KAAxC;AACA,WAAO,EAAP,GAAkB,OAAO,KAAP,GAAe,YAAY,OAAZ,CAAoB,UAArD;AACD,GAPI,MAQA;AACH,WAAO,QAAP,GAAkB,MAAM,aAAN,CAAoB,QAApB,EAA8B,WAA9B,CAAlB;AACA,WAAO,GAAP,GAAkB,MAAM,SAAN,CAAgB,QAAhB,CAAlB;AACA,WAAO,KAAP,GAAkB,OAAO,QAAP,GAAkB,YAAY,OAAZ,CAAoB,aAAxD;AACA,WAAO,KAAP,GAAkB,MAAM,UAAN,CAAiB,QAAjB,EAA2B,YAAY,OAAZ,CAAoB,SAA/C,EAA0D,WAA1D,CAAlB;;AAEA,WAAO,EAAP,GAAY,OAAO,KAAP,GAAe,YAAY,OAAZ,CAAoB,SAA/C;AACA,WAAO,EAAP,GAAY,OAAO,KAAP,GAAe,YAAY,OAAZ,CAAoB,SAA/C;AACD;AACF,CAhCD;;AAkCA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,KAAvB,EAA8B,UAAU,WAAV,EAAuB;AACnD,cAAY,OAAZ,GAAsB;AACpB,WAAO,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EADa;;AAGpB,mBAAe,CAHK,EAGA;AACpB,kBAAe,CAJK;AAKpB,cAAe,CALK;;AAOpB,WAAO,CAPa,EAOA;;AAEpB,gBAAY,CATQ,EASA;AACpB,eAAY,CAVQ,CAUA;AAVA,GAAtB;AAYD,CAbD;;AAeA,QAAQ,OAAR,GAAkB,OAAlB;AACA,QAAQ,KAAR,CAAc,IAAd,CAAmB,SAAnB;AACA,MAAM,KAAN,CAAY,aAAa,UAAzB,EAAqC,CACnC,cADmC,EAEnC,aAFmC,EAGnC,YAHmC,CAArC;AAKA,QAAQ,UAAR,CAAmB,OAAnB,GAA6B,YAA7B;;AAEA,eAAe,OAAf,GAAyB,QAAQ,QAAjC;;AAEA,OAAO,OAAP,GAAiB,OAAjB;;;;;AChKA,IAAM,UAAiB,QAAQ,QAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,UAAR,CAAvB;AACA,IAAM,UAAiB,QAAQ,kBAAR,CAAvB;AACA,IAAM,gBAAiB,QAAQ,kBAAR,CAAvB;AACA,IAAM,eAAiB,QAAQ,iBAAR,CAAvB;AACA,IAAM,cAAiB,QAAQ,gBAAR,CAAvB;AACA,IAAM,iBAAiB,QAAQ,mBAAR,CAAvB;;AAEA;AACA,IAAM,gBAAgB,QAAQ,aAAR,IAAyB,QAAQ,oBAAjC,GAAuD,EAAvD,GAA2D,EAAjF;;AAEA,IAAM,SAAS;AACb,YAAU;AACR,aAAc,KADN;AAER,kBAAc,IAFN;;AAIR,YAAY,IAJJ;AAKR,UAAY,IALJ;AAMR,cAAY,IANJ;AAOR,aAAY,IAPJ;AAQR,gBAAY,IARJ;;AAUR,YAAQ,KAVA;AAWR,yBAAqB,KAXb;AAYR,UAAM,IAZE;;AAcR;AACA,YAAQ,GAfA;;AAiBR;AACA;AACA;AACA;AACA,WAAO,IArBC;;AAuBR;AACA;AACA;AACA;AACA,YAAQ;AA3BA,GADG;;AA+Bb,WAAS,iBAAU,OAAV,EAAmB,KAAnB,EAA0B,YAA1B,EAAwC,OAAxC,EAAiD,WAAjD,EAA8D,IAA9D,EAAoE;AAC3E,QAAI,CAAC,IAAL,EAAW;AAAE,aAAO,IAAP;AAAc;;AAE3B,QAAM,OAAO,MAAM,MAAN,CAAa,EAAb,EAAiB,YAAY,SAAZ,CAAsB,IAAvC,CAAb;AACA,QAAM,UAAU,aAAa,OAA7B;;AAEA,QAAI,QAAQ,MAAR,CAAe,OAAnB,EAA4B;AAC1B,UAAM,gBAAgB,QAAQ,MAA9B;AACA,UAAM,cAAc,EAAE,MAAM,KAAR,EAAe,OAAO,KAAtB,EAA6B,KAAK,KAAlC,EAAyC,QAAQ,KAAjD,EAApB;;AAEA;AACA,UAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,cAAc,KAA9B,CAAJ,EAA0C;AACxC,aAAK,IAAM,IAAX,IAAmB,WAAnB,EAAgC;AAC9B,sBAAY,IAAZ,IAAoB,gBAAgB,IAAhB,EACgB,cAAc,KAAd,CAAoB,IAApB,CADhB,EAEgB,IAFhB,EAGgB,YAAY,YAH5B,EAIgB,OAJhB,EAKgB,IALhB,EAMgB,cAAc,MAAd,IAAwB,aANxC,CAApB;AAOD;;AAED,oBAAY,IAAZ,GAAmB,YAAY,IAAZ,IAAoB,CAAC,YAAY,KAApD;AACA,oBAAY,GAAZ,GAAmB,YAAY,GAAZ,IAAoB,CAAC,YAAY,MAApD;;AAEA,YAAI,YAAY,IAAZ,IAAoB,YAAY,KAAhC,IAAyC,YAAY,GAArD,IAA4D,YAAY,MAA5E,EAAoF;AAClF,iBAAO;AACL,kBAAM,QADD;AAEL,mBAAO;AAFF,WAAP;AAID;AACF,OApBD,MAqBK;AACH,YAAM,QAAS,QAAQ,MAAR,CAAe,IAAf,KAAwB,GAAxB,IAA+B,KAAK,CAAL,GAAU,KAAK,KAAL,GAAc,aAAtE;AACA,YAAM,SAAS,QAAQ,MAAR,CAAe,IAAf,KAAwB,GAAxB,IAA+B,KAAK,CAAL,GAAU,KAAK,MAAL,GAAc,aAAtE;;AAEA,YAAI,SAAS,MAAb,EAAqB;AACnB,iBAAO;AACL,kBAAM,QADD;AAEL,kBAAM,CAAC,QAAO,GAAP,GAAa,EAAd,KAAqB,SAAQ,GAAR,GAAc,EAAnC;AAFD,WAAP;AAID;AACF;AACF;;AAED,WAAO,IAAP;AACD,GA7EY;;AA+Eb,WAAU,QAAQ,YAAR,GAAuB;AAC/B,OAAI,UAD2B;AAE/B,OAAI,UAF2B;AAG/B,QAAI,WAH2B;;AAK/B,SAAa,UALkB;AAM/B,UAAa,UANkB;AAO/B,YAAa,UAPkB;AAQ/B,WAAa,UARkB;AAS/B,aAAa,WATkB;AAU/B,iBAAa,WAVkB;AAW/B,cAAa,WAXkB;AAY/B,gBAAa;AAZkB,GAAvB,GAaN;AACF,OAAI,WADF;AAEF,OAAI,WAFF;AAGF,QAAI,aAHF;;AAKF,SAAa,WALX;AAMF,UAAa,WANX;AAOF,YAAa,WAPX;AAQF,WAAa,WARX;AASF,aAAa,aATX;AAUF,iBAAa,aAVX;AAWF,cAAa,aAXX;AAYF,gBAAa;AAZX,GA5FS;;AA2Gb,aAAW,mBAAU,MAAV,EAAkB;AAC3B,QAAI,OAAO,IAAX,EAAiB;AACf,aAAO,OAAO,OAAP,CAAe,OAAO,IAAP,GAAc,OAAO,IAApC,CAAP;AACD,KAFD,MAGK,IAAI,OAAO,KAAX,EAAkB;AACrB,UAAI,YAAY,EAAhB;AACA,UAAM,YAAY,CAAC,KAAD,EAAQ,QAAR,EAAkB,MAAlB,EAA0B,OAA1B,CAAlB;;AAEA,WAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,CAApB,EAAuB,GAAvB,EAA4B;AAC1B,YAAI,OAAO,KAAP,CAAa,UAAU,CAAV,CAAb,CAAJ,EAAgC;AAC9B,uBAAa,UAAU,CAAV,CAAb;AACD;AACF;;AAED,aAAO,OAAO,OAAP,CAAe,SAAf,CAAP;AACD;AACF;AA3HY,CAAf;;AA8HA;AACA,cAAc,OAAd,CAAsB,EAAtB,CAAyB,KAAzB,EAAgC,gBAAmC;AAAA,MAAvB,MAAuB,QAAvB,MAAuB;AAAA,MAAf,WAAe,QAAf,WAAe;;AACjE,MAAI,OAAO,IAAP,KAAgB,aAAhB,IAAiC,CAAC,YAAY,QAAZ,CAAqB,KAA3D,EAAkE;AAChE;AACD;;AAED,MAAM,YAAY,YAAY,MAAZ,CAAmB,OAAnB,CAA2B,YAAY,OAAvC,CAAlB;AACA,MAAM,gBAAgB,YAAY,MAAZ,CAAmB,OAAnB,CAA2B,MAAjD;;AAEA;;;;;;AAMA,MAAI,cAAc,MAAd,IAAwB,cAAc,mBAA1C,EAA+D;AAC7D,QAAM,cAAc,MAAM,MAAN,CAAa,EAAb,EAAiB,YAAY,QAAZ,CAAqB,KAAtC,CAApB;;AAEA,gBAAY,GAAZ,GAAqB,YAAY,GAAZ,IAAuB,YAAY,IAAZ,IAAsB,CAAC,YAAY,MAA/E;AACA,gBAAY,IAAZ,GAAqB,YAAY,IAAZ,IAAuB,YAAY,GAAZ,IAAsB,CAAC,YAAY,KAA/E;AACA,gBAAY,MAAZ,GAAqB,YAAY,MAAZ,IAAuB,YAAY,KAAZ,IAAsB,CAAC,YAAY,GAA/E;AACA,gBAAY,KAAZ,GAAqB,YAAY,KAAZ,IAAuB,YAAY,MAAZ,IAAsB,CAAC,YAAY,IAA/E;;AAEA,gBAAY,QAAZ,CAAqB,YAArB,GAAoC,WAApC;AACD,GATD,MAUK;AACH,gBAAY,QAAZ,CAAqB,YAArB,GAAoC,IAApC;AACD;;AAED;AACA,MAAI,cAAc,mBAAlB,EAAuC;AACrC,gBAAY,sBAAZ,GAAqC,UAAU,KAAV,GAAkB,UAAU,MAAjE;AACD;;AAED,cAAY,WAAZ,GAA0B;AACxB,WAAY,SADY;AAExB,aAAY,MAAM,MAAN,CAAa,EAAb,EAAiB,SAAjB,CAFY;AAGxB,cAAY,MAAM,MAAN,CAAa,EAAb,EAAiB,SAAjB,CAHY;AAIxB,cAAY,MAAM,MAAN,CAAa,EAAb,EAAiB,SAAjB,CAJY;AAKxB,WAAY;AACV,YAAM,CADI,EACD,OAAQ,CADP,EACU,OAAQ,CADlB;AAEV,WAAM,CAFI,EAED,QAAQ,CAFP,EAEU,QAAQ;AAFlB;AALY,GAA1B;;AAWA,SAAO,IAAP,GAAc,YAAY,WAAZ,CAAwB,QAAtC;AACA,SAAO,SAAP,GAAmB,YAAY,WAAZ,CAAwB,KAA3C;AACD,CA9CD;;AAgDA;AACA,cAAc,OAAd,CAAsB,EAAtB,CAAyB,KAAzB,EAAgC,iBAA0C;AAAA,MAA9B,MAA8B,SAA9B,MAA8B;AAAA,MAAtB,KAAsB,SAAtB,KAAsB;AAAA,MAAf,WAAe,SAAf,WAAe;;AACxE,MAAI,UAAU,MAAV,IAAoB,CAAC,YAAY,QAAZ,CAAqB,KAA9C,EAAqD;AAAE;AAAS;;AAEhE,MAAM,gBAAgB,YAAY,MAAZ,CAAmB,OAAnB,CAA2B,MAAjD;AACA,MAAM,SAAS,cAAc,MAA7B;AACA,MAAM,aAAa,WAAW,YAAX,IAA2B,WAAW,QAAzD;;AAEA,MAAI,QAAQ,YAAY,QAAZ,CAAqB,KAAjC;;AAEA,MAAM,QAAa,YAAY,WAAZ,CAAwB,KAA3C;AACA,MAAM,UAAa,YAAY,WAAZ,CAAwB,OAA3C;AACA,MAAM,WAAa,YAAY,WAAZ,CAAwB,QAA3C;AACA,MAAM,QAAa,YAAY,WAAZ,CAAwB,KAA3C;AACA,MAAM,WAAa,MAAM,MAAN,CAAa,YAAY,WAAZ,CAAwB,QAArC,EAA+C,QAA/C,CAAnB;AACA,MAAM,gBAAgB,KAAtB;;AAEA,MAAI,KAAK,OAAO,EAAhB;AACA,MAAI,KAAK,OAAO,EAAhB;;AAEA,MAAI,cAAc,mBAAd,IAAqC,cAAc,MAAvD,EAA+D;AAC7D;AACA,QAAM,mBAAmB,cAAc,mBAAd,GACrB,YAAY,sBADS,GAErB,CAFJ;;AAIA,YAAQ,YAAY,QAAZ,CAAqB,YAA7B;;AAEA,QAAK,cAAc,IAAd,IAAsB,cAAc,MAArC,IACI,cAAc,KAAd,IAAuB,cAAc,GAD7C,EACmD;AACjD,WAAK,CAAC,EAAD,GAAM,gBAAX;AACD,KAHD,MAIK,IAAI,cAAc,IAAd,IAAsB,cAAc,KAAxC,EAAgD;AAAE,WAAK,KAAK,gBAAV;AAA6B,KAA/E,MACA,IAAI,cAAc,GAAd,IAAsB,cAAc,MAAxC,EAAgD;AAAE,WAAK,KAAK,gBAAV;AAA6B;AACrF;;AAED;AACA,MAAI,MAAM,GAAV,EAAkB;AAAE,YAAQ,GAAR,IAAkB,EAAlB;AAAuB;AAC3C,MAAI,MAAM,MAAV,EAAkB;AAAE,YAAQ,MAAR,IAAkB,EAAlB;AAAuB;AAC3C,MAAI,MAAM,IAAV,EAAkB;AAAE,YAAQ,IAAR,IAAkB,EAAlB;AAAuB;AAC3C,MAAI,MAAM,KAAV,EAAkB;AAAE,YAAQ,KAAR,IAAkB,EAAlB;AAAuB;;AAE3C,MAAI,UAAJ,EAAgB;AACd;AACA,UAAM,MAAN,CAAa,QAAb,EAAuB,OAAvB;;AAEA,QAAI,WAAW,YAAf,EAA6B;AAC3B;AACA,UAAI,aAAJ;;AAEA,UAAI,SAAS,GAAT,GAAe,SAAS,MAA5B,EAAoC;AAClC,eAAO,SAAS,GAAhB;;AAEA,iBAAS,GAAT,GAAe,SAAS,MAAxB;AACA,iBAAS,MAAT,GAAkB,IAAlB;AACD;AACD,UAAI,SAAS,IAAT,GAAgB,SAAS,KAA7B,EAAoC;AAClC,eAAO,SAAS,IAAhB;;AAEA,iBAAS,IAAT,GAAgB,SAAS,KAAzB;AACA,iBAAS,KAAT,GAAiB,IAAjB;AACD;AACF;AACF,GArBD,MAsBK;AACH;AACA,aAAS,GAAT,GAAkB,KAAK,GAAL,CAAS,QAAQ,GAAjB,EAAsB,MAAM,MAA5B,CAAlB;AACA,aAAS,MAAT,GAAkB,KAAK,GAAL,CAAS,QAAQ,MAAjB,EAAyB,MAAM,GAA/B,CAAlB;AACA,aAAS,IAAT,GAAkB,KAAK,GAAL,CAAS,QAAQ,IAAjB,EAAuB,MAAM,KAA7B,CAAlB;AACA,aAAS,KAAT,GAAkB,KAAK,GAAL,CAAS,QAAQ,KAAjB,EAAwB,MAAM,IAA9B,CAAlB;AACD;;AAED,WAAS,KAAT,GAAkB,SAAS,KAAT,GAAkB,SAAS,IAA7C;AACA,WAAS,MAAT,GAAkB,SAAS,MAAT,GAAkB,SAAS,GAA7C;;AAEA,OAAK,IAAM,IAAX,IAAmB,QAAnB,EAA6B;AAC3B,UAAM,IAAN,IAAc,SAAS,IAAT,IAAiB,SAAS,IAAT,CAA/B;AACD;;AAED,SAAO,KAAP,GAAe,YAAY,QAAZ,CAAqB,KAApC;AACA,SAAO,IAAP,GAAc,QAAd;AACA,SAAO,SAAP,GAAmB,KAAnB;AACD,CAjFD;;AAmFA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4CA,aAAa,SAAb,CAAuB,SAAvB,GAAmC,UAAU,OAAV,EAAmB;AACpD,MAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,OAAhB,CAAJ,EAA8B;AAC5B,SAAK,OAAL,CAAa,MAAb,CAAoB,OAApB,GAA8B,QAAQ,OAAR,KAAoB,KAApB,GAA2B,KAA3B,GAAkC,IAAhE;AACA,SAAK,YAAL,CAAkB,QAAlB,EAA4B,OAA5B;AACA,SAAK,WAAL,CAAiB,QAAjB,EAA2B,OAA3B;;AAEA,QAAI,eAAe,IAAf,CAAoB,QAAQ,IAA5B,CAAJ,EAAuC;AACrC,WAAK,OAAL,CAAa,MAAb,CAAoB,IAApB,GAA2B,QAAQ,IAAnC;AACD,KAFD,MAGK,IAAI,QAAQ,IAAR,KAAiB,IAArB,EAA2B;AAC9B,WAAK,OAAL,CAAa,MAAb,CAAoB,IAApB,GAA2B,eAAe,MAAf,CAAsB,IAAjD;AACD;;AAED,QAAI,MAAM,EAAN,CAAS,IAAT,CAAc,QAAQ,mBAAtB,CAAJ,EAAgD;AAC9C,WAAK,OAAL,CAAa,MAAb,CAAoB,mBAApB,GAA0C,QAAQ,mBAAlD;AACD,KAFD,MAGK,IAAI,MAAM,EAAN,CAAS,IAAT,CAAc,QAAQ,MAAtB,CAAJ,EAAmC;AACtC,WAAK,OAAL,CAAa,MAAb,CAAoB,MAApB,GAA6B,QAAQ,MAArC;AACD;;AAED,WAAO,IAAP;AACD;AACD,MAAI,MAAM,EAAN,CAAS,IAAT,CAAc,OAAd,CAAJ,EAA4B;AAC1B,SAAK,OAAL,CAAa,MAAb,CAAoB,OAApB,GAA8B,OAA9B;;AAEA,QAAI,CAAC,OAAL,EAAc;AACZ,WAAK,aAAL,GAAqB,KAAK,aAAL,GAAqB,KAAK,WAAL,GAAmB,IAA7D;AACD;;AAED,WAAO,IAAP;AACD;AACD,SAAO,KAAK,OAAL,CAAa,MAApB;AACD,CAhCD;;AAkCA,SAAS,eAAT,CAA0B,IAA1B,EAAgC,KAAhC,EAAuC,IAAvC,EAA6C,OAA7C,EAAsD,mBAAtD,EAA2E,IAA3E,EAAiF,MAAjF,EAAyF;AACvF;AACA,MAAI,CAAC,KAAL,EAAY;AAAE,WAAO,KAAP;AAAe;;AAE7B;AACA,MAAI,UAAU,IAAd,EAAoB;AAClB;AACA,QAAM,QAAS,MAAM,EAAN,CAAS,MAAT,CAAgB,KAAK,KAArB,IAA8B,KAAK,KAAnC,GAA4C,KAAK,KAAL,GAAc,KAAK,IAA9E;AACA,QAAM,SAAS,MAAM,EAAN,CAAS,MAAT,CAAgB,KAAK,MAArB,IAA8B,KAAK,MAAnC,GAA4C,KAAK,MAAL,GAAc,KAAK,GAA9E;;AAEA,QAAI,QAAQ,CAAZ,EAAe;AACb,UAAS,SAAS,MAAlB,EAA2B;AAAE,eAAO,OAAP;AAAiB,OAA9C,MACK,IAAI,SAAS,OAAb,EAAsB;AAAE,eAAO,MAAP;AAAiB;AAC/C;AACD,QAAI,SAAS,CAAb,EAAgB;AACd,UAAS,SAAS,KAAlB,EAA4B;AAAE,eAAO,QAAP;AAAkB,OAAhD,MACK,IAAI,SAAS,QAAb,EAAuB;AAAE,eAAO,KAAP;AAAkB;AACjD;;AAED,QAAI,SAAS,MAAb,EAAuB;AAAE,aAAO,KAAK,CAAL,GAAU,CAAC,SAAU,CAAV,GAAa,KAAK,IAAlB,GAAwB,KAAK,KAA9B,IAAwC,MAAzD;AAAmE;AAC5F,QAAI,SAAS,KAAb,EAAuB;AAAE,aAAO,KAAK,CAAL,GAAU,CAAC,UAAU,CAAV,GAAa,KAAK,GAAlB,GAAwB,KAAK,MAA9B,IAAwC,MAAzD;AAAmE;;AAE5F,QAAI,SAAS,OAAb,EAAuB;AAAE,aAAO,KAAK,CAAL,GAAU,CAAC,SAAU,CAAV,GAAa,KAAK,KAAlB,GAA0B,KAAK,IAAhC,IAAwC,MAAzD;AAAmE;AAC5F,QAAI,SAAS,QAAb,EAAuB;AAAE,aAAO,KAAK,CAAL,GAAU,CAAC,UAAU,CAAV,GAAa,KAAK,MAAlB,GAA0B,KAAK,GAAhC,IAAwC,MAAzD;AAAmE;AAC7F;;AAED;AACA,MAAI,CAAC,MAAM,EAAN,CAAS,OAAT,CAAiB,OAAjB,CAAL,EAAgC;AAAE,WAAO,KAAP;AAAe;;AAEjD,SAAO,MAAM,EAAN,CAAS,OAAT,CAAiB,KAAjB;AACP;AADO,IAEH,UAAU;AACZ;AAHK,IAIH,MAAM,WAAN,CAAkB,OAAlB,EAA2B,KAA3B,EAAkC,mBAAlC,CAJJ;AAKD;;AAED,YAAY,OAAZ,CAAoB,EAApB,CAAuB,KAAvB,EAA8B,UAAU,WAAV,EAAuB;AACnD,cAAY,UAAZ,GAAyB,IAAzB;AACD,CAFD;;AAIA,cAAc,OAAd,CAAsB,EAAtB,CAAyB,WAAzB,EAAsC,iBAA2C;AAAA,MAA/B,WAA+B,SAA/B,WAA+B;AAAA,MAAlB,MAAkB,SAAlB,MAAkB;AAAA,MAAV,MAAU,SAAV,MAAU;;AAC/E,MAAI,WAAW,QAAX,IAAuB,CAAC,YAAY,UAAxC,EAAoD;AAAE;AAAS;;AAE/D,MAAM,UAAU,YAAY,MAAZ,CAAmB,OAAnC;;AAEA,MAAI,QAAQ,MAAR,CAAe,MAAnB,EAA2B;AACzB,QAAI,YAAY,UAAZ,KAA2B,GAA/B,EAAoC;AAClC,aAAO,EAAP,GAAY,OAAO,EAAnB;AACD,KAFD,MAGK;AACH,aAAO,EAAP,GAAY,OAAO,EAAnB;AACD;AACD,WAAO,IAAP,GAAc,IAAd;AACD,GARD,MASK;AACH,WAAO,IAAP,GAAc,YAAY,UAA1B;;AAEA,QAAI,YAAY,UAAZ,KAA2B,GAA/B,EAAoC;AAClC,aAAO,EAAP,GAAY,CAAZ;AACD,KAFD,MAGK,IAAI,YAAY,UAAZ,KAA2B,GAA/B,EAAoC;AACvC,aAAO,EAAP,GAAY,CAAZ;AACD;AACF;AACF,CAxBD;;AA0BA,QAAQ,MAAR,GAAiB,MAAjB;AACA,QAAQ,KAAR,CAAc,IAAd,CAAmB,QAAnB;AACA,MAAM,KAAN,CAAY,aAAa,UAAzB,EAAqC,CACnC,aADmC,EAEnC,YAFmC,EAGnC,oBAHmC,EAInC,qBAJmC,EAKnC,WALmC,CAArC;AAOA,QAAQ,UAAR,CAAmB,MAAnB,GAA4B,WAA5B;;AAEA,eAAe,MAAf,GAAwB,OAAO,QAA/B;;AAEA,OAAO,OAAP,GAAiB,MAAjB;;;;;AC3aA,IAAM,MAAiB,QAAQ,aAAR,CAAvB;AACA,IAAM,YAAiB,QAAQ,gBAAR,EAA0B,SAAjD;AACA,IAAM,KAAiB,QAAQ,YAAR,CAAvB;AACA,IAAM,WAAiB,QAAQ,kBAAR,CAAvB;AACA,IAAM,cAAiB,QAAQ,eAAR,CAAvB;AACA,IAAM,iBAAiB,QAAQ,kBAAR,CAAvB;;AAEA,IAAM,aAAa;AACjB,YAAU;AACR,aAAW,KADH;AAER,eAAW,IAFH,EAEa;AACrB,YAAW,EAHH;AAIR,WAAW,GAJH,CAIa;AAJb,GADO;;AAQjB,eAAa,IARI;AASjB,KAAG,IATc,EASL;AACZ,KAAG,CAVc,EAUX,GAAG,CAVQ,EAUL;;AAEZ,eAAa,KAZI;AAajB,YAAU,CAbO;;AAejB,SAAO,eAAU,WAAV,EAAuB;AAC5B,eAAW,WAAX,GAAyB,IAAzB;AACA,QAAI,MAAJ,CAAW,WAAW,CAAtB;;AAEA,eAAW,WAAX,GAAyB,WAAzB;AACA,eAAW,QAAX,GAAsB,IAAI,IAAJ,GAAW,OAAX,EAAtB;AACA,eAAW,CAAX,GAAe,IAAI,OAAJ,CAAY,WAAW,MAAvB,CAAf;AACD,GAtBgB;;AAwBjB,QAAM,gBAAY;AAChB,eAAW,WAAX,GAAyB,KAAzB;AACA,QAAI,MAAJ,CAAW,WAAW,CAAtB;AACD,GA3BgB;;AA6BjB;AACA,UAAQ,kBAAY;AAClB,QAAM,UAAU,WAAW,WAAX,CAAuB,MAAvB,CAA8B,OAA9B,CAAsC,WAAW,WAAX,CAAuB,QAAvB,CAAgC,IAAtE,EAA4E,UAA5F;AACA,QAAM,YAAY,QAAQ,SAAR,IAAqB,UAAU,WAAW,WAAX,CAAuB,OAAjC,CAAvC;AACA,QAAM,MAAM,IAAI,IAAJ,GAAW,OAAX,EAAZ;AACA;AACA,QAAM,KAAK,CAAC,MAAM,WAAW,QAAlB,IAA8B,IAAzC;AACA;AACA,QAAM,IAAI,QAAQ,KAAR,GAAgB,EAA1B;;AAEA,QAAI,KAAK,CAAT,EAAY;AACV,UAAI,GAAG,MAAH,CAAU,SAAV,CAAJ,EAA0B;AACxB,kBAAU,QAAV,CAAmB,WAAW,CAAX,GAAe,CAAlC,EAAqC,WAAW,CAAX,GAAe,CAApD;AACD,OAFD,MAGK,IAAI,SAAJ,EAAe;AAClB,kBAAU,UAAV,IAAwB,WAAW,CAAX,GAAe,CAAvC;AACA,kBAAU,SAAV,IAAwB,WAAW,CAAX,GAAe,CAAvC;AACD;;AAED,iBAAW,QAAX,GAAsB,GAAtB;AACD;;AAED,QAAI,WAAW,WAAf,EAA4B;AAC1B,UAAI,MAAJ,CAAW,WAAW,CAAtB;AACA,iBAAW,CAAX,GAAe,IAAI,OAAJ,CAAY,WAAW,MAAvB,CAAf;AACD;AACF,GAvDgB;AAwDjB,SAAO,eAAU,YAAV,EAAwB,UAAxB,EAAoC;AACzC,QAAM,UAAU,aAAa,OAA7B;;AAEA,WAAO,QAAQ,UAAR,EAAoB,UAApB,IAAkC,QAAQ,UAAR,EAAoB,UAApB,CAA+B,OAAxE;AACD,GA5DgB;AA6DjB,qBAAmB,iCAAoC;AAAA,QAAxB,WAAwB,QAAxB,WAAwB;AAAA,QAAX,OAAW,QAAX,OAAW;;AACrD,QAAI,EAAE,YAAY,WAAZ,MACG,WAAW,KAAX,CAAiB,YAAY,MAA7B,EAAqC,YAAY,QAAZ,CAAqB,IAA1D,CADL,CAAJ,EAC2E;AACzE;AACD;;AAED,QAAI,YAAY,UAAhB,EAA4B;AAC1B,iBAAW,CAAX,GAAe,WAAW,CAAX,GAAe,CAA9B;AACA;AACD;;AAED,QAAI,YAAJ;AACA,QAAI,cAAJ;AACA,QAAI,eAAJ;AACA,QAAI,aAAJ;;AAEA,QAAM,UAAU,YAAY,MAAZ,CAAmB,OAAnB,CAA2B,YAAY,QAAZ,CAAqB,IAAhD,EAAsD,UAAtE;AACA,QAAM,YAAY,QAAQ,SAAR,IAAqB,UAAU,YAAY,OAAtB,CAAvC;;AAEA,QAAI,GAAG,MAAH,CAAU,SAAV,CAAJ,EAA0B;AACxB,aAAS,QAAQ,OAAR,GAAkB,WAAW,MAAtC;AACA,YAAS,QAAQ,OAAR,GAAkB,WAAW,MAAtC;AACA,cAAS,QAAQ,OAAR,GAAkB,UAAU,UAAV,GAAwB,WAAW,MAA9D;AACA,eAAS,QAAQ,OAAR,GAAkB,UAAU,WAAV,GAAwB,WAAW,MAA9D;AACD,KALD,MAMK;AACH,UAAM,OAAO,SAAS,oBAAT,CAA8B,SAA9B,CAAb;;AAEA,aAAS,QAAQ,OAAR,GAAkB,KAAK,IAAL,GAAc,WAAW,MAApD;AACA,YAAS,QAAQ,OAAR,GAAkB,KAAK,GAAL,GAAc,WAAW,MAApD;AACA,cAAS,QAAQ,OAAR,GAAkB,KAAK,KAAL,GAAc,WAAW,MAApD;AACA,eAAS,QAAQ,OAAR,GAAkB,KAAK,MAAL,GAAc,WAAW,MAApD;AACD;;AAED,eAAW,CAAX,GAAgB,QAAQ,CAAR,GAAW,OAAM,CAAC,CAAP,GAAU,CAArC;AACA,eAAW,CAAX,GAAgB,SAAQ,CAAR,GAAY,MAAK,CAAC,CAAN,GAAS,CAArC;;AAEA,QAAI,CAAC,WAAW,WAAhB,EAA6B;AAC3B;AACA,iBAAW,MAAX,GAAoB,QAAQ,MAA5B;AACA,iBAAW,KAAX,GAAoB,QAAQ,KAA5B;;AAEA,iBAAW,KAAX,CAAiB,WAAjB;AACD;AACF;AAzGgB,CAAnB;;AA4GA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,aAAvB,EAAsC,YAAY;AAChD,aAAW,IAAX;AACD,CAFD;;AAIA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,aAAvB,EAAsC,WAAW,iBAAjD;;AAEA,eAAe,SAAf,CAAyB,UAAzB,GAAsC,WAAW,QAAjD;;AAEA,OAAO,OAAP,GAAiB,UAAjB;;;;;AC3HA,IAAM,eAAe,QAAQ,iBAAR,CAArB;AACA,IAAM,UAAe,QAAQ,iBAAR,CAArB;AACA,IAAM,KAAe,QAAQ,aAAR,CAArB;AACA,IAAM,WAAe,QAAQ,mBAAR,CAArB;;AAEA,aAAa,SAAb,CAAuB,SAAvB,GAAmC,UAAU,OAAV,EAAmB,KAAnB,EAA0B,WAA1B,EAAuC,OAAvC,EAAgD;AACjF,MAAM,SAAS,KAAK,oBAAL,CAA0B,OAA1B,EAAmC,KAAnC,EAA0C,WAA1C,EAAuD,OAAvD,CAAf;;AAEA,MAAI,KAAK,OAAL,CAAa,aAAjB,EAAgC;AAC9B,WAAO,KAAK,OAAL,CAAa,aAAb,CAA2B,OAA3B,EAAoC,KAApC,EAA2C,MAA3C,EAAmD,IAAnD,EAAyD,OAAzD,EAAkE,WAAlE,CAAP;AACD;;AAED,SAAO,MAAP;AACD,CARD;;AAUA;;;;;;;;;;;;;;;AAeA,aAAa,SAAb,CAAuB,UAAvB,GAAoC,UAAU,QAAV,EAAoB;AACtD,SAAO,KAAK,iBAAL,CAAuB,YAAvB,EAAqC,QAArC,CAAP;AACD,CAFD;;AAIA;;;;;;;;;;;;;;;AAeA,aAAa,SAAb,CAAuB,SAAvB,GAAmC,UAAU,QAAV,EAAoB;AACrD,SAAO,KAAK,iBAAL,CAAuB,WAAvB,EAAoC,QAApC,CAAP;AACD,CAFD;;AAIA,aAAa,SAAb,CAAuB,UAAvB,GAAoC,UAAU,UAAV,EAAsB,mBAAtB,EAA2C,OAA3C,EAAoD;AACtF,MAAI,CAAC,UAAD,IAAe,CAAC,GAAG,OAAH,CAAW,OAAX,CAApB,EAAyC;AAAE,WAAO,KAAP;AAAe;;AAE1D,MAAI,GAAG,MAAH,CAAU,UAAV,CAAJ,EAA2B;AACzB,WAAO,SAAS,WAAT,CAAqB,OAArB,EAA8B,UAA9B,EAA0C,mBAA1C,CAAP;AACD,GAFD,MAGK,IAAI,GAAG,OAAH,CAAW,UAAX,CAAJ,EAA4B;AAC/B,WAAO,SAAS,YAAT,CAAsB,UAAtB,EAAkC,OAAlC,CAAP;AACD;;AAED,SAAO,KAAP;AACD,CAXD;;AAaA,aAAa,SAAb,CAAuB,SAAvB,GAAmC,UAAU,SAAV,EAAqB,mBAArB,EAA0C,OAA1C,EAAmD;AACpF,MAAI,CAAC,SAAL,EAAgB;AAAE,WAAO,IAAP;AAAc;;AAEhC,MAAI,CAAC,GAAG,OAAH,CAAW,OAAX,CAAL,EAA0B;AAAE,WAAO,KAAP;AAAe;;AAE3C,MAAI,GAAG,MAAH,CAAU,SAAV,CAAJ,EAA0B;AACxB,WAAO,SAAS,WAAT,CAAqB,OAArB,EAA8B,SAA9B,EAAyC,mBAAzC,CAAP;AACD,GAFD,MAGK,IAAI,GAAG,OAAH,CAAW,SAAX,CAAJ,EAA2B;AAC9B,WAAO,SAAS,YAAT,CAAsB,SAAtB,EAAiC,OAAjC,CAAP;AACD;;AAED,SAAO,KAAP;AACD,CAbD;;AAeA,aAAa,SAAb,CAAuB,eAAvB,GAAyC,UAAU,OAAV,EAAmB,mBAAnB,EAAwC,WAAxC,EAAqD;AAC5F,SAAQ,CAAC,KAAK,UAAL,CAAgB,QAAQ,UAAxB,EAAoC,mBAApC,EAAyD,WAAzD,CAAD,IACH,KAAK,SAAL,CAAe,QAAQ,SAAvB,EAAkC,mBAAlC,EAAuD,WAAvD,CADL;AAED,CAHD;;AAKA;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4BA,aAAa,SAAb,CAAuB,aAAvB,GAAuC,UAAU,OAAV,EAAmB;AACxD,MAAI,GAAG,QAAH,CAAY,OAAZ,CAAJ,EAA0B;AACxB,SAAK,OAAL,CAAa,aAAb,GAA6B,OAA7B;;AAEA,WAAO,IAAP;AACD;;AAED,MAAI,YAAY,IAAhB,EAAsB;AACpB,WAAO,KAAK,OAAL,CAAa,aAApB;;AAEA,WAAO,IAAP;AACD;;AAED,SAAO,KAAK,OAAL,CAAa,aAApB;AACD,CAdD;;AAgBA;;;;;;;;;;AAUA,aAAa,SAAb,CAAuB,WAAvB,GAAqC,UAAU,QAAV,EAAoB;AACvD,MAAI,GAAG,IAAH,CAAQ,QAAR,CAAJ,EAAuB;AACrB,SAAK,OAAL,CAAa,WAAb,GAA2B,QAA3B;;AAEA,WAAO,IAAP;AACD;;AAED,MAAI,aAAa,IAAjB,EAAuB;AACrB,WAAO,KAAK,OAAL,CAAa,WAApB;;AAEA,WAAO,IAAP;AACD;;AAED,SAAO,KAAK,OAAL,CAAa,WAApB;AACD,CAdD;;AAgBA,aAAa,SAAb,CAAuB,oBAAvB,GAA8C,UAAU,OAAV,EAAmB,KAAnB,EAA0B,WAA1B,EAAuC,OAAvC,EAAgD;AAC5F,MAAM,OAAO,KAAK,OAAL,CAAa,OAAb,CAAb;AACA,MAAI,SAAS,IAAb;;AAEA,uBAAyB,QAAQ,KAAjC,kHAAwC;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,QAA7B,UAA6B;;AACtC;AACA,QAAI,YAAY,aAAZ,IACG,YAAY,KADf,IAEG,CAAC,MAAM,OAAN,GAAgB,KAAK,OAAL,CAAa,UAAb,EAAyB,YAA1C,MAA4D,CAFnE,EAEsE;AACpE;AACD;;AAED,aAAS,QAAQ,UAAR,EAAoB,OAApB,CAA4B,OAA5B,EAAqC,KAArC,EAA4C,IAA5C,EAAkD,OAAlD,EAA2D,WAA3D,EAAwE,IAAxE,CAAT;;AAEA,QAAI,MAAJ,EAAY;AACV,aAAO,MAAP;AACD;AACF;AACF,CAlBD;;;;;AC5JA,IAAM,WAAiB,QAAQ,aAAR,CAAvB;AACA,IAAM,eAAiB,QAAQ,iBAAR,CAAvB;AACA,IAAM,cAAiB,QAAQ,gBAAR,CAAvB;AACA,IAAM,UAAiB,QAAQ,iBAAR,CAAvB;AACA,IAAM,iBAAiB,QAAQ,mBAAR,CAAvB;AACA,IAAM,UAAiB,QAAQ,kBAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,UAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,UAAR,CAAvB;AACA,IAAM,UAAiB,QAAQ,kBAAR,EAA4B,GAA5B,EAAvB;;AAEA,QAAQ,uBAAR;;AAEA,IAAM,YAAY;AAChB,kBADgB;AAEhB,gDAFgB;AAGhB;AACA,mBAAiB,QAJD;AAKhB,YAAU;AACR,eAAW;AACT,mBAAa,KADJ;AAET,WAAK,QAFI;AAGT,qBAAe,CAHN;AAIT,iBAAY,IAJH;AAKT,kBAAY;AALH;AADH,GALM;AAchB,qBAAmB,2BAAU,MAAV,EAAkB;AACnC,UAAM,MAAN,CAAa,OAAO,QAApB,EAA8B,UAAU,QAAV,CAAmB,SAAjD;AACD;AAhBe,CAAlB;;AAmBA;AACA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,MAAvB,EAA+B,gBAAwD;AAAA,MAA5C,WAA4C,QAA5C,WAA4C;AAAA,MAA/B,OAA+B,QAA/B,OAA+B;AAAA,MAAtB,KAAsB,QAAtB,KAAsB;AAAA,MAAf,WAAe,QAAf,WAAe;;AACrF,MAAI,YAAY,WAAZ,EAAJ,EAA+B;AAAE;AAAS;;AAE1C,MAAM,aAAa,cAAc,WAAd,EAA2B,OAA3B,EAAoC,KAApC,EAA2C,WAA3C,CAAnB;AACA,UAAQ,WAAR,EAAqB,UAArB;AACD,CALD;;AAOA;AACA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,MAAvB,EAA+B,iBAAwD;AAAA,MAA5C,WAA4C,SAA5C,WAA4C;AAAA,MAA/B,OAA+B,SAA/B,OAA+B;AAAA,MAAtB,KAAsB,SAAtB,KAAsB;AAAA,MAAf,WAAe,SAAf,WAAe;;AACrF,MAAI,CAAC,YAAY,KAAb,IACG,YAAY,aADf,IAEG,YAAY,WAAZ,EAFP,EAEkC;AAAE;AAAS;;AAE7C,MAAM,aAAa,cAAc,WAAd,EAA2B,OAA3B,EAAoC,KAApC,EAA2C,WAA3C,CAAnB;AACA,UAAQ,WAAR,EAAqB,UAArB;AACD,CAPD;;AASA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,MAAvB,EAA+B,UAAU,GAAV,EAAe;AAAA,MACpC,WADoC,GACb,GADa,CACpC,WADoC;AAAA,MACvB,KADuB,GACb,GADa,CACvB,KADuB;;;AAG5C,MAAI,CAAC,YAAY,aAAb,IACG,YAAY,WAAZ,EADH,IAEG,CAAC,YAAY,eAFhB,IAGG,CAAC,YAAY,QAAZ,CAAqB,IAH7B,EAGmC;AACjC;AACD;;AAED,UAAQ,IAAR,CAAa,cAAb,EAA6B,GAA7B;;AAEA,MAAM,SAAS,YAAY,MAA3B;;AAEA,MAAI,YAAY,QAAZ,CAAqB,IAArB,IAA6B,MAAjC,EAAyC;AACvC;AACA,QAAI,OAAO,OAAP,CAAe,YAAY,QAAZ,CAAqB,IAApC,EAA0C,WAA1C,IACG,CAAC,uBAAuB,MAAvB,EAA+B,YAAY,OAA3C,EAAoD,YAAY,QAAhE,CADR,EACmF;AACjF,kBAAY,IAAZ,CAAiB,KAAjB;AACD,KAHD,MAIK;AACH,kBAAY,KAAZ,CAAkB,YAAY,QAA9B,EAAwC,MAAxC,EAAgD,YAAY,OAA5D;AACD;AACF;AACF,CAxBD;;AA0BA;AACA;AACA,SAAS,cAAT,CAAyB,MAAzB,EAAiC,YAAjC,EAA+C,OAA/C,EAAwD,WAAxD,EAAqE;AACnE,MAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,MAAhB,KACG,aAAa,eAAb,CAA6B,aAAa,OAAb,CAAqB,OAAO,IAA5B,CAA7B,EAAgE,OAAhE,EAAyE,WAAzE,CADH,IAEG,aAAa,OAAb,CAAqB,OAAO,IAA5B,EAAkC,OAFrC,IAGG,uBAAuB,YAAvB,EAAqC,OAArC,EAA8C,MAA9C,CAHP,EAG8D;AAC5D,WAAO,MAAP;AACD;;AAED,SAAO,IAAP;AACD;;AAED,SAAS,gBAAT,CAA2B,WAA3B,EAAwC,OAAxC,EAAiD,KAAjD,EAAwD,OAAxD,EAAiE,aAAjE,EAAgF,WAAhF,EAA6F;AAC3F,OAAK,IAAI,IAAI,CAAR,EAAW,MAAM,QAAQ,MAA9B,EAAsC,IAAI,GAA1C,EAA+C,GAA/C,EAAoD;AAClD,QAAM,QAAQ,QAAQ,CAAR,CAAd;AACA,QAAM,eAAe,cAAc,CAAd,CAArB;AACA,QAAM,SAAS,eAAe,MAAM,SAAN,CAAgB,OAAhB,EAAyB,KAAzB,EAAgC,WAAhC,EAA6C,YAA7C,CAAf,EACe,KADf,EAEe,YAFf,EAGe,WAHf,CAAf;;AAKA,QAAI,MAAJ,EAAY;AACV,aAAO;AACL,sBADK;AAEL,gBAAQ,KAFH;AAGL,iBAAS;AAHJ,OAAP;AAKD;AACF;;AAED,SAAO,EAAP;AACD;;AAED,SAAS,aAAT,CAAwB,WAAxB,EAAqC,OAArC,EAA8C,KAA9C,EAAqD,WAArD,EAAkE;AAChE,MAAI,UAAU,EAAd;AACA,MAAI,gBAAgB,EAApB;;AAEA,MAAI,UAAU,WAAd;AACA,MAAI,SAAS,IAAb;;AAEA,WAAS,WAAT,CAAsB,YAAtB,EAAoC,QAApC,EAA8C,OAA9C,EAAuD;AACrD,QAAM,WAAY,QAAQ,0BAAR,GACd,QAAQ,gBAAR,CAAyB,QAAzB,CADc,GAEd,SAFJ;;AAIA,QAAI,MAAM,eAAN,CAAsB,OAAtB,EAA+B,QAA/B,EAAyC,QAAzC,CAAJ,EAAwD;;AAEtD,cAAQ,IAAR,CAAa,YAAb;AACA,oBAAc,IAAd,CAAmB,OAAnB;AACD;AACF;;AAED,SAAO,MAAM,EAAN,CAAS,OAAT,CAAiB,OAAjB,CAAP,EAAkC;AAChC,cAAU,EAAV;AACA,oBAAgB,EAAhB;;AAEA,QAAM,sBAAsB,MAAM,aAAN,CAAoB,GAApB,CAAwB,OAAxB,CAA5B;;AAEA,QAAI,wBACI,SAAS,eAAe,oBAAoB,SAApB,CAA8B,OAA9B,EAAuC,KAAvC,EAA8C,WAA9C,EAA2D,OAA3D,EAAoE,WAApE,CAAf,EACe,mBADf,EAEe,OAFf,EAGe,WAHf,CADb,KAKG,CAAC,oBAAoB,OAApB,CAA4B,OAAO,IAAnC,EAAyC,WALjD,EAK8D;AAC5D,aAAO;AACL,wBADK;AAEL,sBAFK;AAGL,gBAAQ;AAHH,OAAP;AAKD,KAXD,MAYK;AACH,YAAM,aAAN,CAAoB,eAApB,CAAoC,WAApC,EAAiD,OAAjD;;AAEA,UAAM,aAAa,iBAAiB,WAAjB,EAA8B,OAA9B,EAAuC,KAAvC,EAA8C,OAA9C,EAAuD,aAAvD,EAAsE,WAAtE,CAAnB;;AAEA,UAAI,WAAW,MAAX,IACG,CAAC,WAAW,MAAX,CAAkB,OAAlB,CAA0B,WAAW,MAAX,CAAkB,IAA5C,EAAkD,WAD1D,EACuE;AACrE,eAAO,UAAP;AACD;AACF;;AAED,cAAU,MAAM,UAAN,CAAiB,OAAjB,CAAV;AACD;;AAED,SAAO,EAAP;AACD;;AAED,SAAS,OAAT,CAAkB,WAAlB,SAA4D;AAAA,MAA3B,MAA2B,SAA3B,MAA2B;AAAA,MAAnB,MAAmB,SAAnB,MAAmB;AAAA,MAAX,OAAW,SAAX,OAAW;;AAC1D,WAAS,UAAU,EAAnB;;AAEA,MAAI,YAAY,MAAZ,IAAsB,YAAY,MAAZ,CAAmB,OAAnB,CAA2B,WAArD,EAAkE;AAChE,gBAAY,MAAZ,CAAmB,IAAnB,CAAwB,eAAxB,CAAwC,KAAxC,CAA8C,MAA9C,GAAuD,EAAvD;AACD;;AAED,cAAY,MAAZ,GAAqB,MAArB;AACA,cAAY,OAAZ,GAAsB,OAAtB;AACA,QAAM,UAAN,CAAiB,YAAY,QAA7B,EAAuC,MAAvC;;AAEA,MAAI,UAAU,OAAO,OAAP,CAAe,WAA7B,EAA0C;AACxC,QAAM,SAAS,SAAQ,QAAQ,OAAO,IAAf,EAAqB,SAArB,CAA+B,MAA/B,CAAR,GAAiD,EAAhE;AACA,gBAAY,MAAZ,CAAmB,IAAnB,CAAwB,eAAxB,CAAwC,KAAxC,CAA8C,MAA9C,GAAuD,MAAvD;AACD;;AAED,UAAQ,IAAR,CAAa,UAAb,EAAyB,EAAE,aAAa,WAAf,EAAzB;AACD;;AAED,YAAY,OAAZ,CAAoB,EAApB,CAAuB,MAAvB,EAA+B,iBAA2B;AAAA,MAAf,WAAe,SAAf,WAAe;;AACxD,MAAM,SAAS,YAAY,MAA3B;;AAEA,MAAI,UAAU,OAAO,OAAP,CAAe,WAA7B,EAA0C;AACxC,WAAO,IAAP,CAAY,eAAZ,CAA4B,KAA5B,CAAkC,MAAlC,GAA2C,EAA3C;AACD;AACF,CAND;;AAQA,aAAa,SAAb,CAAuB,SAAvB,GAAmC,UAAU,OAAV,EAAmB,KAAnB,EAA0B,WAA1B,EAAuC,OAAvC,EAAgD;AACjF,MAAM,SAAS,KAAK,oBAAL,CAA0B,OAA1B,EAAmC,KAAnC,EAA0C,WAA1C,EAAuD,OAAvD,CAAf;;AAEA,MAAI,KAAK,OAAL,CAAa,aAAjB,EAAgC;AAC9B,WAAO,KAAK,OAAL,CAAa,aAAb,CAA2B,OAA3B,EAAoC,KAApC,EAA2C,MAA3C,EAAmD,IAAnD,EAAyD,OAAzD,EAAkE,WAAlE,CAAP;AACD;;AAED,SAAO,MAAP;AACD,CARD;;AAUA;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4BA,aAAa,SAAb,CAAuB,aAAvB,GAAuC,UAAU,OAAV,EAAmB;AACxD,MAAI,MAAM,EAAN,CAAS,QAAT,CAAkB,OAAlB,CAAJ,EAAgC;AAC9B,SAAK,OAAL,CAAa,aAAb,GAA6B,OAA7B;;AAEA,WAAO,IAAP;AACD;;AAED,MAAI,YAAY,IAAhB,EAAsB;AACpB,WAAO,KAAK,OAAL,CAAa,aAApB;;AAEA,WAAO,IAAP;AACD;;AAED,SAAO,KAAK,OAAL,CAAa,aAApB;AACD,CAdD;;AAgBA;;;;;;;;;;AAUA,aAAa,SAAb,CAAuB,WAAvB,GAAqC,UAAU,QAAV,EAAoB;AACvD,MAAI,MAAM,EAAN,CAAS,IAAT,CAAc,QAAd,CAAJ,EAA6B;AAC3B,SAAK,OAAL,CAAa,WAAb,GAA2B,QAA3B;;AAEA,WAAO,IAAP;AACD;;AAED,MAAI,aAAa,IAAjB,EAAuB;AACrB,WAAO,KAAK,OAAL,CAAa,WAApB;;AAEA,WAAO,IAAP;AACD;;AAED,SAAO,KAAK,OAAL,CAAa,WAApB;AACD,CAdD;;AAgBA,aAAa,SAAb,CAAuB,oBAAvB,GAA8C,UAAU,OAAV,EAAmB,KAAnB,EAA0B,WAA1B,EAAuC,OAAvC,EAAgD;AAC5F,MAAM,OAAO,KAAK,OAAL,CAAa,OAAb,CAAb;AACA,MAAM,UAAU,MAAM,OAAN,IAAkB;AAChC,OAAG,CAD6B;AAEhC,OAAG,CAF6B;AAGhC,OAAG,CAH6B;AAIhC,OAAG;AAJ6B,GAAD,CAK9B,MAAM,MALwB,CAAjC;AAMA,MAAI,SAAS,IAAb;;AAEA,uBAAyB,QAAQ,KAAjC,kHAAwC;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,QAA7B,UAA6B;;AACtC;AACA,QAAI,YAAY,aAAZ,IACG,YAAY,KADf,IAEG,CAAC,UAAU,KAAK,OAAL,CAAa,UAAb,EAAyB,YAApC,MAAsD,CAF7D,EAEgE;AAC9D;AACD;;AAED,aAAS,QAAQ,UAAR,EAAoB,OAApB,CAA4B,OAA5B,EAAqC,KAArC,EAA4C,IAA5C,EAAkD,OAAlD,EAA2D,WAA3D,EAAwE,IAAxE,CAAT;;AAEA,QAAI,MAAJ,EAAY;AACV,aAAO,MAAP;AACD;AACF;AACF,CAxBD;;AA0BA,SAAS,sBAAT,CAAiC,YAAjC,EAA+C,OAA/C,EAAwD,MAAxD,EAAgE;AAC9D,MAAM,UAAU,aAAa,OAA7B;AACA,MAAM,aAAa,QAAQ,OAAO,IAAf,EAAqB,GAAxC;AACA,MAAM,gBAAgB,QAAQ,OAAO,IAAf,EAAqB,aAA3C;AACA,MAAI,qBAAqB,CAAzB;AACA,MAAI,cAAc,CAAlB;AACA,MAAI,qBAAqB,CAAzB;;AAEA;AACA,MAAI,EAAE,cAAc,aAAd,IAA+B,UAAU,eAA3C,CAAJ,EAAiE;AAAE;AAAS;;AAE5E,OAAK,IAAI,IAAI,CAAR,EAAW,MAAM,MAAM,YAAN,CAAmB,MAAzC,EAAiD,IAAI,GAArD,EAA0D,GAA1D,EAA+D;AAC7D,QAAM,cAAc,MAAM,YAAN,CAAmB,CAAnB,CAApB;AACA,QAAM,cAAc,YAAY,QAAZ,CAAqB,IAAzC;;AAEA,QAAI,CAAC,YAAY,WAAZ,EAAL,EAAgC;AAAE;AAAW;;AAE7C;;AAEA,QAAI,sBAAsB,UAAU,eAApC,EAAqD;AACnD,aAAO,KAAP;AACD;;AAED,QAAI,YAAY,MAAZ,KAAuB,YAA3B,EAAyC;AAAE;AAAW;;AAEtD,mBAAgB,gBAAgB,OAAO,IAAxB,GAA8B,CAA7C;;AAEA,QAAI,eAAe,UAAnB,EAA+B;AAC7B,aAAO,KAAP;AACD;;AAED,QAAI,YAAY,OAAZ,KAAwB,OAA5B,EAAqC;AACnC;;AAEA,UAAI,gBAAgB,OAAO,IAAvB,IAA+B,sBAAsB,aAAzD,EAAwE;AACtE,eAAO,KAAP;AACD;AACF;AACF;;AAED,SAAO,UAAU,eAAV,GAA4B,CAAnC;AACD;;AAED;;;;;;;;;;;;AAYA,SAAS,eAAT,GAA2B,UAAU,QAAV,EAAoB;AAC7C,MAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,QAAhB,CAAJ,EAA+B;AAC7B,cAAU,eAAV,GAA4B,QAA5B;;AAEA,WAAO,IAAP;AACD;;AAED,SAAO,UAAU,eAAjB;AACD,CARD;;AAUA,aAAa,eAAb,CAA6B,IAA7B,CAAkC,aAAlC;AACA,aAAa,eAAb,CAA6B,IAA7B,CAAkC,eAAlC;AACA,aAAa,eAAb,CAA6B,IAA7B,CAAkC,YAAlC;AACA,aAAa,eAAb,CAA6B,IAA7B,CAAkC,WAAlC;;AAEA,eAAe,IAAf,CAAoB,aAApB,GAAoC,IAApC;AACA,eAAe,IAAf,CAAoB,WAApB,GAAkC,IAAlC;;AAEA,MAAM,MAAN,CAAa,eAAe,SAA5B,EAAuC,UAAU,QAAV,CAAmB,SAA1D;;AAEA,OAAO,OAAP,GAAiB,SAAjB;;;;;ACnXA,IAAM,YAAc,QAAQ,QAAR,CAApB;AACA,IAAM,cAAc,QAAQ,gBAAR,CAApB;;AAEA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,KAAvB,EAA8B,UAAU,WAAV,EAAuB;AACnD,cAAY,UAAZ,GAAyB,IAAzB;AACD,CAFD;;AAIA,UAAU,OAAV,CAAkB,EAAlB,CAAqB,UAArB,EAAiC,gBAA2B;AAAA,MAAf,WAAe,QAAf,WAAe;;AAC1D,MAAM,aAAa,YAAY,QAAZ,CAAqB,IAAxC;;AAEA,MAAI,CAAC,UAAL,EAAiB;AAAE;AAAS;;AAE5B,MAAM,QAAQ,YAAY,MAAZ,CAAmB,OAAnB,CAA2B,UAA3B,EAAuC,KAArD;;AAEA,MAAI,QAAQ,CAAZ,EAAe;AACb,gBAAY,UAAZ,GAAyB,WAAW,YAAM;AACxC,kBAAY,KAAZ,CAAkB,YAAY,QAA9B,EAAwC,YAAY,MAApD,EAA4D,YAAY,OAAxE;AACD,KAFwB,EAEtB,KAFsB,CAAzB;AAGD;AACF,CAZD;;AAcA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,MAAvB,EAA+B,iBAAsC;AAAA,MAA1B,WAA0B,SAA1B,WAA0B;AAAA,MAAb,SAAa,SAAb,SAAa;;AACnE,MAAI,YAAY,eAAZ,IAA+B,CAAC,SAApC,EAA+C;AAC7C,iBAAa,YAAY,UAAzB;AACD;AACF,CAJD;;AAMA;AACA,UAAU,OAAV,CAAkB,EAAlB,CAAqB,cAArB,EAAqC,iBAA2B;AAAA,MAAf,WAAe,SAAf,WAAe;;AAC9D,MAAM,aAAa,YAAY,QAAZ,CAAqB,IAAxC;;AAEA,MAAI,CAAC,UAAL,EAAiB;AAAE;AAAS;;AAE5B,MAAM,QAAQ,YAAY,MAAZ,CAAmB,OAAnB,CAA2B,UAA3B,EAAuC,KAArD;;AAEA,MAAI,QAAQ,CAAZ,EAAe;AACb,gBAAY,QAAZ,CAAqB,IAArB,GAA4B,IAA5B;AACD;AACF,CAVD;;;;;AC5BA,IAAM,YAAY,QAAQ,QAAR,CAAlB;AACA,IAAM,QAAY,QAAQ,UAAR,CAAlB;AACA,IAAM,UAAY,QAAQ,kBAAR,CAAlB;AACA,IAAM,KAAY,QAAQ,aAAR,CAAlB;;eAEwC,QAAQ,mBAAR,C;IAAhC,e,YAAA,e;IAAiB,U,YAAA,U;;AAEzB,UAAU,iBAAV,CAA4B,QAAQ,iBAAR,CAA5B;;AAEA,UAAU,OAAV,CAAkB,EAAlB,CAAqB,cAArB,EAAsC,gBAAgD;AAAA,MAApC,WAAoC,QAApC,WAAoC;AAAA,MAAvB,WAAuB,QAAvB,WAAuB;AAAA,MAAV,EAAU,QAAV,EAAU;AAAA,MAAN,EAAM,QAAN,EAAM;;AACpF,MAAI,YAAY,QAAZ,CAAqB,IAArB,KAA8B,MAAlC,EAA0C;AAAE;AAAS;;AAErD;AACA,MAAM,OAAO,KAAK,GAAL,CAAS,EAAT,CAAb;AACA,MAAM,OAAO,KAAK,GAAL,CAAS,EAAT,CAAb;AACA,MAAM,UAAU,YAAY,MAAZ,CAAmB,OAAnB,CAA2B,IAA3C;AACA,MAAM,YAAY,QAAQ,SAA1B;AACA,MAAM,cAAe,OAAO,IAAP,GAAc,GAAd,GAAoB,OAAO,IAAP,GAAc,GAAd,GAAoB,IAA7D;;AAEA,cAAY,QAAZ,CAAqB,IAArB,GAA4B,QAAQ,QAAR,KAAqB,OAArB,GACxB,YAAY,CAAZ,CADwB,CACT;AADS,IAExB,QAAQ,QAFZ;;AAIA;AACA,MAAI,gBAAgB,IAAhB,IAAwB,cAAc,IAAtC,IAA8C,cAAc,WAAhE,EAA6E;AAC3E;AACA,gBAAY,QAAZ,CAAqB,IAArB,GAA4B,IAA5B;;AAEA;;AAEA,QAAI,CAAC,YAAY,QAAZ,CAAqB,IAA1B,EAAgC;;AAE9B,UAAI,UAAU,WAAd;;AAEA,UAAM,eAAe,SAAf,YAAe,CAAU,YAAV,EAAwB,QAAxB,EAAkC,OAAlC,EAA2C;AAC9D,YAAM,WAAW,QAAQ,0BAAR,GACX,QAAQ,gBAAR,CAAyB,QAAzB,CADW,GAEX,SAFN;;AAIA,YAAI,iBAAiB,YAAY,MAAjC,EAAyC;AAAE;AAAS;;AAEpD,YAAI,CAAC,QAAQ,WAAT,IACG,CAAC,aAAa,eAAb,CAA6B,OAA7B,EAAsC,OAAtC,EAA+C,WAA/C,CADJ,IAEG,gBAAgB,OAAhB,EAAyB,QAAzB,EAAmC,QAAnC,CAFP,EAEqD;;AAEnD,cAAM,UAAS,aAAa,SAAb,CAAuB,YAAY,WAAnC,EACuB,YAAY,SADnC,EAEuB,WAFvB,EAGuB,OAHvB,CAAf;;AAKA,cAAI,WACG,QAAO,IAAP,KAAgB,MADnB,IAEG,eAAe,WAAf,EAA4B,YAA5B,CAFH,IAGG,UAAU,cAAV,CAAyB,OAAzB,EAAiC,YAAjC,EAA+C,OAA/C,EAAwD,WAAxD,CAHP,EAG6E;;AAE3E,mBAAO,YAAP;AACD;AACF;AACF,OAxBD;;AA0BA,UAAI,SAAS,IAAb;;AAEA;AACA,aAAO,GAAG,OAAH,CAAW,OAAX,CAAP,EAA4B;AAC1B,YAAM,sBAAsB,MAAM,aAAN,CAAoB,GAApB,CAAwB,OAAxB,CAA5B;;AAEA,YAAI,uBACG,wBAAwB,YAAY,MADvC,IAEG,CAAC,oBAAoB,OAApB,CAA4B,IAA5B,CAAiC,WAFzC,EAEsD;;AAEpD,mBAAS,oBAAoB,SAApB,CAA8B,YAAY,WAA1C,EAAuD,YAAY,SAAnE,EAA8E,WAA9E,EAA2F,OAA3F,CAAT;AACD;AACD,YAAI,UACG,OAAO,IAAP,KAAgB,MADnB,IAEG,eAAe,WAAf,EAA4B,mBAA5B,CAFP,EAEyD;;AAEvD,sBAAY,QAAZ,CAAqB,IAArB,GAA4B,MAA5B;AACA,sBAAY,MAAZ,GAAqB,mBAArB;AACA,sBAAY,OAAZ,GAAsB,OAAtB;AACA;AACD;;AAED,YAAM,uBAAuB,MAAM,aAAN,CAAoB,eAApB,CAAoC,YAApC,EAAkD,OAAlD,CAA7B;;AAEA,YAAI,oBAAJ,EAA0B;AACxB,sBAAY,QAAZ,CAAqB,IAArB,GAA4B,MAA5B;AACA,sBAAY,MAAZ,GAAqB,oBAArB;AACA,sBAAY,OAAZ,GAAsB,OAAtB;AACA;AACD;;AAED,kBAAU,WAAW,OAAX,CAAV;AACD;AACF;AACF;AACF,CAtFD;;AAwFA,SAAS,cAAT,CAAyB,SAAzB,EAAoC,YAApC,EAAkD;AAChD,MAAI,CAAC,YAAL,EAAmB;AAAE,WAAO,KAAP;AAAe;;AAEpC,MAAM,WAAW,aAAa,OAAb,CAAqB,IAArB,CAA0B,SAA3C;;AAEA,SAAQ,cAAc,IAAd,IAAsB,aAAa,IAAnC,IAA2C,aAAa,SAAhE;AACD;;;;;ACvGD,QAAQ,QAAR,EAAkB,iBAAlB,CAAoC,QAAQ,oBAAR,CAApC;;;;;ACAA,QAAQ,QAAR,EAAkB,iBAAlB,CAAoC,QAAQ,mBAAR,CAApC;;;;;ACAA,OAAO,OAAP,GAAiB;AACf,QAAM;AACJ,YAAgB,IADZ;AAEJ,oBAAgB,MAFZ;AAGJ,iBAAgB;AAHZ,GADS;;AAOf,aAAW;AACT,YAAQ,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EADC;;AAGT;AACA;AACA,kBAAc,CALL;;AAOT,aAAS;AACP,eAAmB,KADZ;AAEP,kBAAmB,EAFZ,EAEmB;AAC1B,gBAAmB,GAHZ,EAGmB;AAC1B,gBAAmB,EAJZ,EAImB;AAC1B,mBAAmB,IALZ,EAKmB;AAC1B,yBAAmB,GANZ,CAMmB;AANnB;AAPA;AAPI,CAAjB;;;;;ACAA;;AAEA;AACA,QAAQ,kBAAR;;AAEA;AACA,QAAQ,WAAR;;AAEA;AACA,QAAQ,kBAAR;AACA,QAAQ,sBAAR;;AAEA;AACA,QAAQ,sBAAR;AACA,QAAQ,4BAAR;AACA,QAAQ,qCAAR;;AAEA;AACA,QAAQ,mBAAR;;AAEA;AACA,QAAQ,mBAAR;AACA,QAAQ,kBAAR;AACA,QAAQ,gBAAR;AACA,QAAQ,gBAAR;;AAEA;AACA,QAAQ,sBAAR;AACA,QAAQ,2BAAR;AACA,QAAQ,0BAAR;;AAEA;AACA,QAAQ,qBAAR;AACA,QAAQ,oBAAR;AACA,QAAQ,kBAAR;;AAEA;AACA,QAAQ,iCAAR;;AAEA;AACA,QAAQ,cAAR;;AAEA;AACA,OAAO,OAAP,GAAiB,QAAQ,YAAR,CAAjB;;;;;AC3CA,IAAM,gBAAiB,QAAQ,iBAAR,CAAvB;AACA,IAAM,cAAiB,QAAQ,eAAR,CAAvB;AACA,IAAM,YAAiB,QAAQ,aAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,SAAR,CAAvB;AACA,IAAM,iBAAiB,QAAQ,aAAR,CAAvB;;AAEA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,KAAvB,EAA8B,UAAU,WAAV,EAAuB;AACnD,cAAY,aAAZ,GAA4B;AAC1B,YAAa,KADa;AAE1B,eAAa,KAFa;AAG1B,iBAAa,KAHa;;AAK1B,gBAAY,IALc;AAM1B,cAAY,EANc;;AAQ1B,QAAI,CARsB,EAQnB,IAAI,CARe;AAS1B,QAAI,CATsB,EASnB,IAAI,CATe;;AAW1B,QAAI,CAXsB;AAY1B,SAAK,CAZqB,EAYlB,KAAK,CAZa;AAa1B,cAAU,CAbgB;;AAe1B,eAAW,CAfe;AAgB1B,eAAW,CAhBe;AAiB1B,OAAK;AAjBqB,GAA5B;;AAoBA,cAAY,iBAAZ,GAAkC;AAAA,WAAM,aAAe,KAAf,CAAqB,WAArB,CAAN;AAAA,GAAlC;AACA,cAAY,mBAAZ,GAAkC;AAAA,WAAM,eAAe,KAAf,CAAqB,WAArB,CAAN;AAAA,GAAlC;AACD,CAvBD;;AAyBA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,MAAvB,EAA+B,gBAAwD;AAAA,MAA5C,WAA4C,QAA5C,WAA4C;AAAA,MAA/B,KAA+B,QAA/B,KAA+B;AAAA,MAAxB,OAAwB,QAAxB,OAAwB;AAAA,MAAf,WAAe,QAAf,WAAe;;AACrF,MAAM,SAAS,YAAY,aAA3B;;AAEA;AACA,MAAI,OAAO,MAAX,EAAmB;AACjB,QAAI,UAAU,WAAd;;AAEA;AACA,WAAO,MAAM,EAAN,CAAS,OAAT,CAAiB,OAAjB,CAAP,EAAkC;;AAEhC;AACA,UAAI,YAAY,YAAY,OAA5B,EAAqC;AACnC;AACA,uBAAe,MAAf,CAAsB,OAAO,CAA7B;AACA,eAAO,MAAP,GAAgB,KAAhB;AACA,oBAAY,UAAZ,GAAyB,IAAzB;;AAEA;AACA,oBAAY,aAAZ,CAA0B,OAA1B;AACA,cAAM,SAAN,CAAgB,YAAY,SAA5B,EAAuC,YAAY,QAAnD;;AAEA;AACA,YAAM,YAAY,EAAE,wBAAF,EAAlB;AACA,oBAAY,OAAZ,CAAoB,IAApB,CAAyB,oBAAzB,EAA+C,SAA/C;AACA,oBAAY,OAAZ,CAAoB,IAApB,CAAyB,eAAzB,EAA+C,SAA/C;;AAEA;AACA,YAAM,cAAc,IAAI,aAAJ,CAAkB,WAAlB,EACkB,KADlB,EAEkB,YAAY,QAAZ,CAAqB,IAFvC,EAGkB,eAHlB,EAIkB,YAAY,OAJ9B,CAApB;;AAMA,oBAAY,MAAZ,CAAmB,IAAnB,CAAwB,WAAxB;AACA,oBAAY,SAAZ,GAAwB,WAAxB;AACA,kBAAU,aAAV,CAAwB,YAAY,gBAApC;;AAEA,cAAM,UAAN,CAAiB,YAAY,UAA7B,EAAyC,YAAY,SAArD;AACA;AACD;;AAED,gBAAU,MAAM,UAAN,CAAiB,OAAjB,CAAV;AACD;AACF;AACF,CA5CD;;AA8CA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,IAAvB,EAA6B,iBAAkC;AAAA,MAAtB,WAAsB,SAAtB,WAAsB;AAAA,MAAT,KAAS,SAAT,KAAS;;AAC7D,MAAM,SAAS,YAAY,aAA3B;;AAEA,MAAI,CAAC,YAAY,WAAZ,EAAD,IAA8B,OAAO,MAAzC,EAAiD;AAAE;AAAS;;AAE5D,MAAM,SAAS,YAAY,MAA3B;AACA,MAAM,UAAU,UAAU,OAAO,OAAjC;AACA,MAAM,iBAAiB,WAAW,YAAY,QAAZ,CAAqB,IAAhC,IAAwC,QAAQ,YAAY,QAAZ,CAAqB,IAA7B,EAAmC,OAAlG;;AAEA,MAAM,MAAM,IAAI,IAAJ,GAAW,OAAX,EAAZ;AACA,MAAM,WAAW,EAAjB;AACA,MAAM,OAAO,MAAM,MAAN,CAAa,EAAb,EAAiB,YAAY,SAAZ,CAAsB,IAAvC,CAAb;AACA,MAAM,eAAe,YAAY,YAAZ,CAAyB,MAAzB,CAAgC,KAArD;;AAEA,MAAI,YAAY,KAAhB;AACA,MAAI,uBAAJ;;AAEA;AACA,MAAM,kBAAmB,kBAAkB,eAAe,OAAjC,IACH,YAAY,QAAZ,CAAqB,IAArB,KAA8B,SAD3B,IAEH,UAAU,OAAO,UAFvC;;AAIA,MAAM,UAAW,mBACX,MAAM,YAAY,SAAZ,CAAsB,SAA7B,GAA0C,EAD9B,IAEZ,eAAe,eAAe,QAFlB,IAGZ,eAAe,eAAe,QAHnC;;AAKA,MAAM,cAAc;AAClB,4BADkB;AAElB,gBAAY,IAFM;AAGlB,sBAHkB;AAIlB,YAAQ,IAJU;AAKlB,oBAAgB;AALE,GAApB;;AAQA;AACA,MAAI,mBAAmB,CAAC,OAAxB,EAAiC;AAC/B,cAAU,aAAV,CAAwB,QAAxB;;AAEA,qBAAiB,UAAU,MAAV,CAAiB,WAAjB,CAAjB;;AAEA,QAAI,eAAe,UAAf,IAA6B,eAAe,MAAhD,EAAwD;AACtD,kBAAY,IAAZ;AACD;AACF;;AAED,MAAI,EAAE,WAAW,SAAb,CAAJ,EAA6B;AAAE;AAAS;;AAExC,QAAM,UAAN,CAAiB,OAAO,QAAxB,EAAkC,YAAY,SAA9C;;AAEA,cAAY,QAAZ,CAAqB,CAArB,IAA0B,OAAO,UAAP,GACxB,IAAI,aAAJ,CAAkB,WAAlB,EAA+B,KAA/B,EAAsC,YAAY,QAAZ,CAAqB,IAA3D,EAAiE,cAAjE,EAAiF,YAAY,OAA7F,CADF;;AAGA,SAAO,EAAP,GAAY,GAAZ;;AAEA,SAAO,MAAP,GAAgB,IAAhB;AACA,SAAO,WAAP,GAAqB,eAAe,WAApC;AACA,cAAY,UAAZ,GAAyB,MAAzB;;AAEA,SAAO,IAAP,CAAY,OAAO,UAAnB;;AAEA,MAAI,OAAJ,EAAa;AACX,WAAO,GAAP,GAAa,YAAY,YAAZ,CAAyB,MAAzB,CAAgC,EAA7C;AACA,WAAO,GAAP,GAAa,YAAY,YAAZ,CAAyB,MAAzB,CAAgC,EAA7C;AACA,WAAO,EAAP,GAAY,YAAZ;;AAEA,gBAAY,WAAZ,EAAyB,MAAzB;;AAEA,UAAM,MAAN,CAAa,IAAb,EAAmB,YAAY,SAAZ,CAAsB,IAAzC;;AAEA,SAAK,CAAL,IAAU,OAAO,EAAjB;AACA,SAAK,CAAL,IAAU,OAAO,EAAjB;;AAEA,cAAU,aAAV,CAAwB,QAAxB;;AAEA,qBAAiB,UAAU,MAAV,CAAiB,WAAjB,CAAjB;;AAEA,WAAO,UAAP,IAAqB,eAAe,EAApC;AACA,WAAO,UAAP,IAAqB,eAAe,EAApC;;AAEA,WAAO,CAAP,GAAW,eAAe,OAAf,CAAuB,YAAY,iBAAnC,CAAX;AACD,GApBD,MAqBK;AACH,WAAO,SAAP,GAAmB,IAAnB;AACA,WAAO,EAAP,GAAY,eAAe,EAA3B;AACA,WAAO,EAAP,GAAY,eAAe,EAA3B;;AAEA,WAAO,EAAP,GAAY,OAAO,EAAP,GAAY,CAAxB;;AAEA,WAAO,CAAP,GAAW,eAAe,OAAf,CAAuB,YAAY,mBAAnC,CAAX;AACD;AACF,CA3FD;;AA6FA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,aAAvB,EAAsC,iBAA2B;AAAA,MAAf,WAAe,SAAf,WAAe;;AAC/D,MAAM,SAAS,YAAY,aAA3B;;AAEA,MAAI,OAAO,MAAX,EAAmB;AACjB,mBAAe,MAAf,CAAsB,OAAO,CAA7B;AACA,WAAO,MAAP,GAAgB,KAAhB;AACA,gBAAY,UAAZ,GAAyB,IAAzB;AACD;AACF,CARD;;AAUA,SAAS,WAAT,CAAsB,WAAtB,EAAmC,MAAnC,EAA2C;AACzC,MAAM,iBAAiB,YAAY,MAAZ,CAAmB,OAAnB,CAA2B,YAAY,QAAZ,CAAqB,IAAhD,EAAsD,OAA7E;AACA,MAAM,SAAS,eAAe,UAA9B;AACA,MAAM,aAAa,CAAC,KAAK,GAAL,CAAS,eAAe,QAAf,GAA0B,OAAO,EAA1C,CAAD,GAAiD,MAApE;;AAEA,SAAO,EAAP,GAAY,YAAY,SAAZ,CAAsB,KAAlC;AACA,SAAO,EAAP,GAAY,YAAY,SAAZ,CAAsB,KAAlC;AACA,SAAO,EAAP,GAAY,OAAO,UAAP,CAAkB,SAAlB,GAA8B,IAA1C;AACA,SAAO,EAAP,GAAY,OAAO,EAAP,GAAY,CAAxB;;AAEA,SAAO,UAAP,GAAoB,OAAO,EAAP,GAAY,CAAC,OAAO,GAAP,GAAa,UAAd,IAA4B,MAA5D;AACA,SAAO,UAAP,GAAoB,OAAO,EAAP,GAAY,CAAC,OAAO,GAAP,GAAa,UAAd,IAA4B,MAA5D;AACA,SAAO,EAAP,GAAY,UAAZ;;AAEA,SAAO,SAAP,GAAmB,SAAS,OAAO,EAAnC;AACA,SAAO,SAAP,GAAmB,IAAI,eAAe,QAAf,GAA0B,OAAO,EAAxD;AACD;;AAED,SAAS,YAAT,GAAyB;AACvB,sBAAoB,IAApB;AACA,QAAM,cAAN,CAAqB,KAAK,YAA1B,EAAwC,KAAK,UAA7C,EAAyD,KAAK,SAA9D;;AAEA,MAAM,SAAS,KAAK,aAApB;AACA,MAAM,UAAU,KAAK,MAAL,CAAY,OAAZ,CAAoB,KAAK,QAAL,CAAc,IAAlC,EAAwC,OAAxD;AACA,MAAM,SAAS,QAAQ,UAAvB;AACA,MAAM,IAAI,IAAI,IAAJ,GAAW,OAAX,KAAuB,IAAvB,GAA8B,OAAO,EAA/C;;AAEA,MAAI,IAAI,OAAO,EAAf,EAAmB;;AAEjB,QAAM,WAAY,IAAI,CAAC,KAAK,GAAL,CAAS,CAAC,MAAD,GAAU,CAAnB,IAAwB,OAAO,SAAhC,IAA6C,OAAO,SAA1E;;AAEA,QAAI,OAAO,UAAP,KAAsB,OAAO,EAA7B,IAAmC,OAAO,UAAP,KAAsB,OAAO,EAApE,EAAwE;AACtE,aAAO,EAAP,GAAY,OAAO,EAAP,GAAY,QAAxB;AACA,aAAO,EAAP,GAAY,OAAO,EAAP,GAAY,QAAxB;AACD,KAHD,MAIK;AACH,UAAM,YAAY,MAAM,sBAAN,CAA6B,CAA7B,EAAgC,CAAhC,EAC6B,OAAO,EADpC,EAE6B,OAAO,EAFpC,EAG6B,OAAO,UAHpC,EAI6B,OAAO,UAJpC,EAK6B,QAL7B,CAAlB;;AAOA,aAAO,EAAP,GAAY,UAAU,CAAtB;AACA,aAAO,EAAP,GAAY,UAAU,CAAtB;AACD;;AAED,SAAK,MAAL;;AAEA,WAAO,CAAP,GAAW,eAAe,OAAf,CAAuB,KAAK,iBAA5B,CAAX;AACD,GAvBD,MAwBK;AACH,WAAO,EAAP,GAAY,OAAO,UAAnB;AACA,WAAO,EAAP,GAAY,OAAO,UAAnB;;AAEA,SAAK,MAAL;AACA,SAAK,GAAL,CAAS,OAAO,UAAhB;AACA,WAAO,MAAP,GAAgB,KAAhB;AACA,SAAK,UAAL,GAAkB,IAAlB;AACD;;AAED,QAAM,UAAN,CAAiB,KAAK,UAAtB,EAAkC,KAAK,SAAvC;AACD;;AAED,SAAS,cAAT,GAA2B;AACzB,sBAAoB,IAApB;;AAEA,MAAM,SAAS,KAAK,aAApB;AACA,MAAM,IAAI,IAAI,IAAJ,GAAW,OAAX,KAAuB,OAAO,EAAxC;AACA,MAAM,WAAW,KAAK,MAAL,CAAY,OAAZ,CAAoB,KAAK,QAAL,CAAc,IAAlC,EAAwC,OAAxC,CAAgD,iBAAjE;;AAEA,MAAI,IAAI,QAAR,EAAkB;AAChB,WAAO,EAAP,GAAY,MAAM,WAAN,CAAkB,CAAlB,EAAqB,CAArB,EAAwB,OAAO,EAA/B,EAAmC,QAAnC,CAAZ;AACA,WAAO,EAAP,GAAY,MAAM,WAAN,CAAkB,CAAlB,EAAqB,CAArB,EAAwB,OAAO,EAA/B,EAAmC,QAAnC,CAAZ;;AAEA,SAAK,WAAL,CAAiB,OAAO,UAAxB,EAAoC,OAAO,UAA3C;;AAEA,WAAO,CAAP,GAAW,eAAe,OAAf,CAAuB,KAAK,mBAA5B,CAAX;AACD,GAPD,MAQK;AACH,WAAO,EAAP,GAAY,OAAO,EAAnB;AACA,WAAO,EAAP,GAAY,OAAO,EAAnB;;AAEA,SAAK,WAAL,CAAiB,OAAO,UAAxB,EAAoC,OAAO,UAA3C;AACA,SAAK,GAAL,CAAS,OAAO,UAAhB;;AAEA,WAAO,SAAP,GACE,OAAO,MAAP,GAAgB,KADlB;AAEA,SAAK,UAAL,GAAkB,IAAlB;AACD;AACF;;AAED,SAAS,mBAAT,CAA8B,WAA9B,EAA2C;AACzC,MAAM,SAAS,YAAY,aAA3B;;AAEA;AACA,MAAI,CAAC,OAAO,MAAZ,EAAoB;AAAE;AAAS;;AAE/B,MAAM,SAAW,OAAO,QAAP,CAAgB,IAAjC;AACA,MAAM,WAAW,OAAO,QAAP,CAAgB,MAAjC;;AAEA,QAAM,SAAN,CAAgB,YAAY,SAA5B,EAAuC,CAAE;AACvC,WAAS,OAAO,CAAP,GAAa,OAAO,EADU;AAEvC,WAAS,OAAO,CAAP,GAAa,OAAO,EAFU;AAGvC,aAAS,SAAS,CAAT,GAAa,OAAO,EAHU;AAIvC,aAAS,SAAS,CAAT,GAAa,OAAO;AAJU,GAAF,CAAvC;AAMD;;;;;AC/RD,IAAM,UAAe,QAAQ,iBAAR,CAArB;AACA,IAAM,SAAe,QAAQ,gBAAR,CAArB;AACA,IAAM,QAAe,QAAQ,SAAR,CAArB;AACA,IAAM,QAAe,QAAQ,SAAR,CAArB;AACA,IAAM,eAAe,QAAQ,gBAAR,CAArB;AACA,IAAM,cAAe,QAAQ,eAAR,CAArB;;AAEA,IAAM,eAAe,EAArB;;AAEA;;;;;;;;;;;;;;;;;;;;;;;;AAwBA,SAAS,QAAT,CAAmB,OAAnB,EAA4B,OAA5B,EAAqC;AACnC,MAAI,eAAe,MAAM,aAAN,CAAoB,GAApB,CAAwB,OAAxB,EAAiC,OAAjC,CAAnB;;AAEA,MAAI,CAAC,YAAL,EAAmB;AACjB,mBAAe,IAAI,YAAJ,CAAiB,OAAjB,EAA0B,OAA1B,CAAf;AACA,iBAAa,MAAb,CAAoB,MAApB,GAA6B,YAA7B;AACD;;AAED,SAAO,YAAP;AACD;;AAED;;;;;;;;AAQA,SAAS,KAAT,GAAiB,UAAU,OAAV,EAAmB,OAAnB,EAA4B;AAC3C,SAAO,MAAM,aAAN,CAAoB,cAApB,CAAmC,OAAnC,EAA4C,WAAW,QAAQ,OAA/D,MAA4E,CAAC,CAApF;AACD,CAFD;;AAIA;;;;;;;;;;;;AAYA,SAAS,EAAT,GAAc,UAAU,IAAV,EAAgB,QAAhB,EAA0B,OAA1B,EAAmC;AAC/C,MAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,IAAhB,KAAyB,KAAK,MAAL,CAAY,GAAZ,MAAqB,CAAC,CAAnD,EAAsD;AACpD,WAAO,KAAK,IAAL,GAAY,KAAZ,CAAkB,IAAlB,CAAP;AACD;;AAED,MAAI,MAAM,EAAN,CAAS,KAAT,CAAe,IAAf,CAAJ,EAA0B;AACxB,yBAAwB,IAAxB,kHAA8B;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAAnB,SAAmB;;AAC5B,eAAS,EAAT,CAAY,SAAZ,EAAuB,QAAvB,EAAiC,OAAjC;AACD;;AAED,WAAO,QAAP;AACD;;AAED,MAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,IAAhB,CAAJ,EAA2B;AACzB,SAAK,IAAM,IAAX,IAAmB,IAAnB,EAAyB;AACvB,eAAS,EAAT,CAAY,IAAZ,EAAkB,KAAK,IAAL,CAAlB,EAA8B,QAA9B;AACD;;AAED,WAAO,QAAP;AACD;;AAED;AACA,MAAI,MAAM,QAAN,CAAe,aAAa,UAA5B,EAAwC,IAAxC,CAAJ,EAAmD;AACjD;AACA,QAAI,CAAC,aAAa,IAAb,CAAL,EAAyB;AACvB,mBAAa,IAAb,IAAqB,CAAC,QAAD,CAArB;AACD,KAFD,MAGK;AACH,mBAAa,IAAb,EAAmB,IAAnB,CAAwB,QAAxB;AACD;AACF;AACD;AATA,OAUK;AACH,aAAO,GAAP,CAAW,MAAM,QAAjB,EAA2B,IAA3B,EAAiC,QAAjC,EAA2C,EAAE,gBAAF,EAA3C;AACD;;AAED,SAAO,QAAP;AACD,CArCD;;AAuCA;;;;;;;;;;;AAWA,SAAS,GAAT,GAAe,UAAU,IAAV,EAAgB,QAAhB,EAA0B,OAA1B,EAAmC;AAChD,MAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,IAAhB,KAAyB,KAAK,MAAL,CAAY,GAAZ,MAAqB,CAAC,CAAnD,EAAsD;AACpD,WAAO,KAAK,IAAL,GAAY,KAAZ,CAAkB,IAAlB,CAAP;AACD;;AAED,MAAI,MAAM,EAAN,CAAS,KAAT,CAAe,IAAf,CAAJ,EAA0B;AACxB,0BAAwB,IAAxB,yHAA8B;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAAnB,SAAmB;;AAC5B,eAAS,GAAT,CAAa,SAAb,EAAwB,QAAxB,EAAkC,OAAlC;AACD;;AAED,WAAO,QAAP;AACD;;AAED,MAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,IAAhB,CAAJ,EAA2B;AACzB,SAAK,IAAM,IAAX,IAAmB,IAAnB,EAAyB;AACvB,eAAS,GAAT,CAAa,IAAb,EAAmB,KAAK,IAAL,CAAnB,EAA+B,QAA/B;AACD;;AAED,WAAO,QAAP;AACD;;AAED,MAAI,CAAC,MAAM,QAAN,CAAe,aAAa,UAA5B,EAAwC,IAAxC,CAAL,EAAoD;AAClD,WAAO,MAAP,CAAc,MAAM,QAApB,EAA8B,IAA9B,EAAoC,QAApC,EAA8C,OAA9C;AACD,GAFD,MAGK;AACH,QAAI,cAAJ;;AAEA,QAAI,QAAQ,YAAR,IACG,CAAC,QAAQ,MAAM,OAAN,CAAc,aAAa,IAAb,CAAd,EAAkC,QAAlC,CAAT,MAA0D,CAAC,CADlE,EACqE;AACnE,mBAAa,IAAb,EAAmB,MAAnB,CAA0B,KAA1B,EAAiC,CAAjC;AACD;AACF;;AAED,SAAO,QAAP;AACD,CAlCD;;AAoCA;;;;;;;AAOA,SAAS,KAAT,GAAiB,YAAY;AAC3B,SAAO,KAAP;AACD,CAFD;;AAIA;AACA,SAAS,iBAAT,GAA8B,MAAM,cAApC;AACA,SAAS,YAAT,GAA8B,MAAM,SAApC;AACA,SAAS,gBAAT,GAA8B,MAAM,aAApC;AACA,SAAS,aAAT,GAA8B,MAAM,UAApC;;AAEA,SAAS,cAAT,GAAgC,MAAM,cAAtC;AACA,SAAS,oBAAT,GAAgC,MAAM,oBAAtC;AACA,SAAS,eAAT,GAAgC,MAAM,eAAtC;AACA,SAAS,OAAT,GAAgC,MAAM,OAAtC;;AAEA;;;;;;AAMA,SAAS,aAAT,GAAyB,YAAY;AACnC,SAAO,QAAQ,aAAf;AACD,CAFD;;AAIA;;;;;;AAMA,SAAS,oBAAT,GAAgC,YAAY;AAC1C,SAAO,QAAQ,oBAAf;AACD,CAFD;;AAIA;;;;;;;;;AASA,SAAS,IAAT,GAAgB,UAAU,KAAV,EAAiB;AAC/B,OAAK,IAAI,IAAI,MAAM,YAAN,CAAmB,MAAnB,GAA4B,CAAzC,EAA4C,KAAK,CAAjD,EAAoD,GAApD,EAAyD;AACvD,UAAM,YAAN,CAAmB,CAAnB,EAAsB,IAAtB,CAA2B,KAA3B;AACD;;AAED,SAAO,QAAP;AACD,CAND;;AAQA;;;;;;;;;AASA,SAAS,oBAAT,GAAgC,UAAU,QAAV,EAAoB;AAClD,MAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,QAAhB,CAAJ,EAA+B;AAC7B,gBAAY,oBAAZ,GAAmC,QAAnC;;AAEA,WAAO,IAAP;AACD;;AAED,SAAO,YAAY,oBAAnB;AACD,CARD;;AAUA,SAAS,WAAT,GAA0B,MAAM,WAAhC;AACA,SAAS,cAAT,GAA0B,MAAM,cAAhC;;AAEA,MAAM,QAAN,GAAiB,QAAjB;;AAEA,OAAO,OAAP,GAAiB,QAAjB;;;;;AC7OA,IAAM,eAAe,QAAQ,gBAAR,CAArB;AACA,IAAM,cAAe,QAAQ,eAAR,CAArB;AACA,IAAM,QAAe,QAAQ,SAAR,CAArB;AACA,IAAM,KAAe,QAAQ,YAAR,CAArB;AACA,IAAM,SAAe,QAAQ,gBAAR,CAArB;;eAE0C,QAAQ,kBAAR,C;IAAlC,Y,YAAA,Y;IAAc,e,YAAA,e;;AAEtB;;;;;;;;;;;;;;;AAaA,aAAa,SAAb,CAAuB,cAAvB,GAAwC,UAAU,QAAV,EAAoB;AAC1D,MAAI,wBAAwB,IAAxB,CAA6B,QAA7B,CAAJ,EAA4C;AAC1C,SAAK,OAAL,CAAa,cAAb,GAA8B,QAA9B;AACA,WAAO,IAAP;AACD;;AAED,MAAI,GAAG,IAAH,CAAQ,QAAR,CAAJ,EAAuB;AACrB,SAAK,OAAL,CAAa,cAAb,GAA8B,WAAU,QAAV,GAAqB,OAAnD;AACA,WAAO,IAAP;AACD;;AAED,SAAO,KAAK,OAAL,CAAa,cAApB;AACD,CAZD;;AAcA,aAAa,SAAb,CAAuB,sBAAvB,GAAgD,UAAU,KAAV,EAAiB;AAC/D,MAAM,UAAU,KAAK,OAAL,CAAa,cAA7B;;AAEA,MAAI,YAAY,OAAhB,EAAyB;AAAE;AAAS;;AAEpC,MAAI,YAAY,QAAhB,EAA0B;AACxB,UAAM,cAAN;AACA;AACD;;AAED;;AAEA;AACA;AACA,MAAI,OAAO,eAAX,EAA4B;AAC1B;AACD;;AAED;AACA,MAAI,uCAAuC,IAAvC,CAA4C,MAAM,IAAlD,CAAJ,EAA6D;AAC3D;AACD;;AAED;AACA,MAAI,GAAG,OAAH,CAAW,MAAM,MAAjB,KACG,gBAAgB,MAAM,MAAtB,EAA8B,uEAA9B,CADP,EAC+G;AAC7G;AACD;;AAED,QAAM,cAAN;AACD,CA9BD;;AAgCA,SAAS,kBAAT,OAAqD;AAAA,MAAtB,WAAsB,QAAtB,WAAsB;AAAA,MAAT,KAAS,QAAT,KAAS;;AACnD,MAAI,YAAY,MAAhB,EAAwB;AACtB,gBAAY,MAAZ,CAAmB,sBAAnB,CAA0C,KAA1C;AACD;AACF;;WAEyB,CAAC,MAAD,EAAS,MAAT,EAAiB,IAAjB,EAAuB,QAAvB,C;AAA1B,yCAA4D;AAAvD,MAAM,sBAAN;AACH,cAAY,OAAZ,CAAoB,EAApB,CAAuB,WAAvB,EAAoC,kBAApC;AACD;;AAED;AACA,YAAY,SAAZ,CAAsB,SAAtB,GAAkC,SAAS,iBAAT,CAA4B,KAA5B,EAAmC;AACnE,uBAA0B,MAAM,YAAhC,mHAA8C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,QAAnC,WAAmC;;;AAE5C,QAAI,YAAY,OAAZ,KACI,YAAY,OAAZ,KAAwB,MAAM,MAA9B,IACG,aAAa,YAAY,OAAzB,EAAkC,MAAM,MAAxC,CAFP,CAAJ,EAE6D;;AAE3D,kBAAY,MAAZ,CAAmB,sBAAnB,CAA0C,KAA1C;AACA;AACD;AACF;AACF,CAXD;;;;;AC9EA,IAAM,QAAgB,QAAQ,SAAR,CAAtB;AACA,IAAM,SAAgB,QAAQ,gBAAR,CAAtB;AACA,IAAM,UAAgB,QAAQ,iBAAR,CAAtB;AACA,IAAM,UAAgB,QAAQ,2BAAR,CAAtB;AACA,IAAM,gBAAgB,QAAQ,sBAAR,CAAtB;;eAEmB,QAAQ,gBAAR,C;IAAX,M,YAAA,M;;AAER,IAAM,WAAW,OAAO,SAAP,CAAiB,QAAlC;;AAEA,IAAI,CAAC,OAAO,KAAP,CAAa,OAAlB,EAA2B;AACzB,SAAO,KAAP,CAAa,OAAb,GAAuB,UAAU,GAAV,EAAe;AACpC,WAAO,SAAS,IAAT,CAAc,GAAd,MAAuB,gBAA9B;AACD,GAFD;AAGD;;AAED,IAAI,CAAC,OAAO,SAAP,CAAiB,IAAtB,EAA4B;AAC1B,SAAO,SAAP,CAAiB,IAAjB,GAAwB,YAAY;AAClC,WAAO,KAAK,OAAL,CAAa,oCAAb,EAAmD,EAAnD,CAAP;AACD,GAFD;AAGD;;AAED;AACA;AACA;AACA;AACA;AACA,SAAS,aAAT,CAAwB,KAAxB,EAA+B;AAC7B,MAAM,cAAc,MAAM,MAA1B;AACA,MAAM,cAAc,QAAQ,MAAR,CAAe,KAAf,EAAsB,MAAM,IAA5B,EAAkC,WAAlC,CAApB;;AAEA,MAAI,CAAC,WAAL,EAAkB;AAAE;AAAS;;AAE7B,MAAI,YAAY,OAAZ,IACG,MAAM,OAAN,KAAkB,YAAY,OAAZ,CAAoB,OADzC,IAEG,MAAM,OAAN,KAAkB,YAAY,OAAZ,CAAoB,OAFzC,IAGG,gBAAkB,YAAY,OAAZ,CAAoB,MAH7C,EAGqD;;AAEnD,gBAAY,WAAZ,CAAwB,CAAxB,IAA6B,WAA7B;AACA,gBAAY,SAAZ,CAAwB,CAAxB,IAA6B,IAAI,IAAJ,GAAW,OAAX,EAA7B;;AAEA,kBAAc,IAAd,CAAmB;AACjB,8BADiB;AAEjB,kBAFiB;AAGjB,8BAHiB;AAIjB,eAAS,KAJQ;AAKjB,YAAM;AALW,KAAnB;AAOD;AACF;;AAED,IAAI,QAAQ,KAAZ,EAAmB;AACjB,MAAM,YAAY,SAAZ,SAAY,CAAU,KAAV,EAAiB;AACjC,yBAA0B,MAAM,YAAhC,kHAA8C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAAnC,WAAmC;;AAC5C,UAAI,YAAY,WAAZ,EAAJ,EAA+B;AAC7B,oBAAY,MAAZ,CAAmB,sBAAnB,CAA0C,KAA1C;AACD;AACF;AACF,GAND;;AAQA,MAAM,WAAW,SAAS,QAAT,QAAiC,UAAjC,EAA6C;AAAA,QAAxB,GAAwB,SAAxB,GAAwB;AAAA,QAAnB,GAAmB,SAAnB,GAAmB;;AAC5D,QAAM,cAAc,WAAW,OAAX,CAAmB,QAAnB,MAAiC,CAAjC,GAChB,OAAO,GADS,GACH,OAAO,MADxB;;AAGA;AACA,gBAAY,GAAZ,EAAiB,aAAjB,EAAgC,SAAhC;;AAEA,QAAI,aAAJ,EAAmB;AACjB,kBAAY,GAAZ,EAAiB,UAAjB,EAA6B,aAA7B;AACD;AACF,GAVD;;AAYA,QAAM,OAAN,CAAc,EAAd,CAAiB,cAAjB,EAAoC,QAApC;AACA,QAAM,OAAN,CAAc,EAAd,CAAiB,iBAAjB,EAAoC,QAApC;AACD;;AAED,OAAO,OAAP,GAAiB,IAAjB;;;;;AC5EA,IAAM,gBAAgB,QAAQ,kBAAR,CAAtB;AACA,IAAM,cAAgB,QAAQ,gBAAR,CAAtB;AACA,IAAM,SAAgB,QAAQ,iBAAR,CAAtB;;AAEA,IAAM,YAAY;AAChB,SAAO,EADS;;AAGhB,cAAY,oBAAU,GAAV,EAAe;AAAA,QACjB,WADiB,GACiB,GADjB,CACjB,WADiB;AAAA,QACQ,IADR,GACiB,GADjB,CACJ,UADI;AAAA,QAEjB,MAFiB,GAEgB,WAFhB,CAEjB,MAFiB;AAAA,QAET,OAFS,GAEgB,WAFhB,CAET,OAFS;AAAA,QAEA,WAFA,GAEgB,WAFhB,CAEA,WAFA;;AAGzB,QAAM,OAAO,OAAO,OAAP,CAAe,OAAf,CAAb;;AAEA,QAAI,IAAJ,EAAU;AACR,kBAAY,IAAZ,GAAmB,KAAK,CAAL,GAAS,KAAK,IAAjC;AACA,kBAAY,GAAZ,GAAmB,KAAK,CAAL,GAAS,KAAK,GAAjC;;AAEA,kBAAY,KAAZ,GAAqB,KAAK,KAAL,GAAc,KAAK,CAAxC;AACA,kBAAY,MAAZ,GAAqB,KAAK,MAAL,GAAc,KAAK,CAAxC;;AAEA,UAAI,EAAE,WAAY,IAAd,CAAJ,EAAyB;AAAE,aAAK,KAAL,GAAc,KAAK,KAAL,GAAc,KAAK,IAAjC;AAAwC;AACnE,UAAI,EAAE,YAAY,IAAd,CAAJ,EAAyB;AAAE,aAAK,MAAL,GAAc,KAAK,MAAL,GAAc,KAAK,GAAjC;AAAwC;AACpE,KATD,MAUK;AACH,kBAAY,IAAZ,GAAmB,YAAY,GAAZ,GAAkB,YAAY,KAAZ,GAAoB,YAAY,MAAZ,GAAqB,CAA9E;AACD;;AAED,QAAI,IAAJ,GAAW,IAAX;AACA,QAAI,YAAJ,GAAmB,MAAnB;AACA,QAAI,OAAJ,GAAc,OAAd;;AAEA,SAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,UAAU,KAAV,CAAgB,MAApC,EAA4C,GAA5C,EAAiD;AAC/C,UAAM,eAAe,UAAU,KAAV,CAAgB,CAAhB,CAArB;;AAEA,UAAI,OAAJ,GAAc,OAAO,OAAP,CAAe,YAAY,QAAZ,CAAqB,IAApC,EAA0C,YAA1C,CAAd;;AAEA,UAAI,CAAC,IAAI,OAAT,EAAkB;AAChB;AACD;;AAED,kBAAY,eAAZ,CAA4B,YAA5B,IAA4C,UAAU,YAAV,EAAwB,SAAxB,CAAkC,GAAlC,CAA5C;AACD;AACF,GArCe;;AAuChB,UAAQ,gBAAU,GAAV,EAAe;AAAA,QACb,WADa,GACqC,GADrC,CACb,WADa;AAAA,QACA,QADA,GACqC,GADrC,CACA,QADA;AAAA,QACU,MADV,GACqC,GADrC,CACU,MADV;AAAA,QACkB,cADlB,GACqC,GADrC,CACkB,cADlB;;AAErB,QAAM,SAAS,OAAO,EAAP,EAAW,IAAI,UAAf,CAAf;AACA,QAAM,SAAS;AACb,UAAI,CADS;AAEb,UAAI,CAFS;AAGb,eAAS,KAHI;AAIb,cAAQ,KAJK;AAKb,kBAAY;AALC,KAAf;;AAQA,yBAA2B,UAAU,KAArC,kHAA4C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAAjC,YAAiC;;AAC1C,UAAM,WAAW,UAAU,YAAV,CAAjB;AACA,UAAM,UAAU,YAAY,MAAZ,CAAmB,OAAnB,CAA2B,YAAY,QAAZ,CAAqB,IAAhD,EAAsD,YAAtD,CAAhB;;AAEA,UAAI,CAAC,SAAS,OAAT,EAAkB,MAAlB,EAA0B,cAA1B,CAAL,EAAgD;AAAE;AAAW;;AAE7D,UAAI,MAAJ,GAAa,IAAI,MAAJ,GAAa,SAAS,YAAT,CAA1B;AACA,UAAI,OAAJ,GAAc,OAAd;AACA,UAAI,MAAJ,GAAa,IAAI,WAAJ,CAAgB,eAAhB,CAAgC,YAAhC,CAAb;;AAEA,eAAS,GAAT,CAAa,GAAb;;AAEA,UAAI,IAAI,MAAJ,CAAW,MAAf,EAAuB;AACrB,eAAO,CAAP,IAAY,IAAI,MAAJ,CAAW,EAAvB;AACA,eAAO,CAAP,IAAY,IAAI,MAAJ,CAAW,EAAvB;;AAEA,eAAO,EAAP,IAAa,IAAI,MAAJ,CAAW,EAAxB;AACA,eAAO,EAAP,IAAa,IAAI,MAAJ,CAAW,EAAxB;;AAEA,eAAO,MAAP,GAAgB,IAAhB;AACD;AACF;;AAED;AACA;AACA;AACA;AACA,WAAO,UAAP,GAAoB,CAAC,IAAI,MAAL,IAAe,CAAC,OAAO,MAAvB,IAAiC,IAAI,MAAJ,CAAW,OAAhE;;AAEA,WAAO,MAAP;AACD,GAhFe;;AAkFhB,iBAAe,uBAAU,QAAV,EAAoB;AACjC,0BAA2B,UAAU,KAArC,yHAA4C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAAjC,YAAiC;;AAC1C,UAAM,SAAS,SAAS,YAAT,KAA0B,EAAzC;;AAEA,aAAO,EAAP,GAAY,OAAO,EAAP,GAAY,CAAxB;AACA,aAAO,SAAP,GAAmB,OAAO,SAAP,GAAmB,GAAtC;AACA,aAAO,MAAP,GAAgB,KAAhB;AACA,aAAO,OAAP,GAAiB,IAAjB;;AAEA,eAAS,YAAT,IAAyB,MAAzB;AACD;;AAED,WAAO,QAAP;AACD,GA/Fe;;AAiGhB,SAAO,sBAA2B,UAA3B,EAAuC;AAAA,QAA3B,WAA2B,SAA3B,WAA2B;;AAC5C,QAAM,MAAM;AACV,8BADU;AAEV,kBAAY,CAAC,eAAe,eAAf,GACA,YAAY,SADZ,GACwB,YAAY,WADrC,EACkD,IAHpD;AAIV,mBAAa,YAAY,WAJf;AAKV,gBAAU,YAAY,gBALZ;AAMV,cAAQ,KANE;AAOV,sBAAgB;AAPN,KAAZ;;AAUA,cAAU,UAAV,CAAqB,GAArB;AACA,cAAU,aAAV,CAAwB,IAAI,QAA5B;;AAEA,QAAI,UAAJ,GAAiB,OAAO,EAAP,EAAW,YAAY,WAAZ,CAAwB,IAAnC,CAAjB;AACA,gBAAY,cAAZ,GAA6B,UAAU,MAAV,CAAiB,GAAjB,CAA7B;AACD;AAjHe,CAAlB;;AAoHA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,KAAvB,EAA8B,UAAU,WAAV,EAAuB;AACnD,cAAY,WAAZ,GAA+B,EAAE,MAAM,CAAR,EAAW,OAAO,CAAlB,EAAqB,KAAK,CAA1B,EAA6B,QAAQ,CAArC,EAA/B;AACA,cAAY,eAAZ,GAA+B,EAA/B;AACA,cAAY,gBAAZ,GAA+B,UAAU,aAAV,CAAwB,EAAxB,CAA/B;AACA,cAAY,cAAZ,GAA+B,IAA/B;AACD,CALD;;AAOA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,cAAvB,EAAwC,UAAU,KAAlD;AACA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,eAAvB,EAAwC,UAAU,KAAlD;;AAEA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,oBAAvB,EAA6C,iBAA0D;AAAA,MAA9C,WAA8C,SAA9C,WAA8C;AAAA,MAAjC,MAAiC,SAAjC,MAAiC;AAAA,MAAzB,qBAAyB,SAAzB,qBAAyB;;AACrG,MAAM,iBAAiB,UAAU,MAAV,CAAiB;AACtC,4BADsC;AAEtC,kBAFsC;AAGtC,gBAAY,YAAY,SAAZ,CAAsB,IAHI;AAItC,cAAU,YAAY,gBAJgB;AAKtC,oBAAgB;AALsB,GAAjB,CAAvB;;AAQA;AACA;AACA,MAAI,CAAC,eAAe,UAAhB,IAA8B,qBAAlC,EAAyD;AACvD,gBAAY,aAAZ,GAA4B,IAA5B;AACD;;AAED,cAAY,cAAZ,GAA6B,cAA7B;AACD,CAhBD;;AAkBA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,YAAvB,EAAqC,iBAAkC;AAAA,MAAtB,WAAsB,SAAtB,WAAsB;AAAA,MAAT,KAAS,SAAT,KAAS;;AACrE,OAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,UAAU,KAAV,CAAgB,MAApC,EAA4C,GAA5C,EAAiD;AAC/C,QAAM,UAAU,YAAY,MAAZ,CAAmB,OAAnB,CAA2B,YAAY,QAAZ,CAAqB,IAAhD,EAAsD,UAAU,KAAV,CAAgB,CAAhB,CAAtD,CAAhB;;AAEA;AACA,QAAI,SAAS,OAAT,EAAkB,IAAlB,EAAwB,IAAxB,CAAJ,EAAmC;AACjC;AACA,kBAAY,MAAZ,CAAmB,EAAE,YAAF,EAAS,QAAQ,IAAjB,EAAnB;AACA;AACD;AACF;AACF,CAXD;;AAaA,cAAc,OAAd,CAAsB,EAAtB,CAAyB,QAAzB,EAAmC,UAAU,GAAV,EAAe;AAAA,MACxC,MADwC,GAChB,GADgB,CACxC,MADwC;AAAA,MAChC,WADgC,GAChB,GADgB,CAChC,WADgC;;AAEhD,MAAM,cAAc,OAAO,EAAP,EAAW,GAAX,CAApB;;AAEA,OAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,UAAU,KAAV,CAAgB,MAApC,EAA4C,GAA5C,EAAiD;AAC/C,QAAM,eAAe,UAAU,KAAV,CAAgB,CAAhB,CAArB;AACA,gBAAY,OAAZ,GAAsB,YAAY,MAAZ,CAAmB,OAAnB,CAA2B,YAAY,QAAZ,CAAqB,IAAhD,EAAsD,YAAtD,CAAtB;;AAEA,QAAI,CAAC,YAAY,OAAjB,EAA0B;AACxB;AACD;;AAED,QAAM,WAAW,UAAU,YAAV,CAAjB;;AAEA,gBAAY,MAAZ,GAAqB,YAAY,gBAAZ,CAA6B,YAA7B,CAArB;;AAEA,WAAO,YAAP,IAAuB,SAAS,YAAT,CAAsB,WAAtB,CAAvB;AACD;AACF,CAlBD;;AAoBA,SAAS,QAAT,CAAmB,OAAnB,EAA4B,MAA5B,EAAoC,cAApC,EAAoD;AAClD,SAAQ,WAAW,QAAQ,OAAnB,KACI,UAAU,CAAC,QAAQ,OADvB,MAEI,CAAC,cAAD,IAAmB,QAAQ,OAF/B,CAAR;AAGD;;AAED,OAAO,OAAP,GAAiB,SAAjB;;;;;AC3LA,IAAM,YAAiB,QAAQ,SAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,UAAR,CAAvB;AACA,IAAM,iBAAiB,QAAQ,mBAAR,CAAvB;;AAEA,IAAM,WAAW;AACf,YAAU;AACR,aAAa,KADL;AAER,aAAa,KAFL;AAGR,iBAAa,IAHL;AAIR,iBAAa;AAJL,GADK;;AAQf,aAAW,yBAA0C;AAAA,QAA9B,IAA8B,QAA9B,IAA8B;AAAA,QAAxB,WAAwB,QAAxB,WAAwB;AAAA,QAAX,OAAW,QAAX,OAAW;;AACnD,QAAM,cAAc,WAAW,QAAQ,WAAvC;AACA,QAAM,SAAS,EAAf;;AAEA,QAAI,QAAQ,WAAZ,EAAyB;AACvB,aAAO,IAAP,GAAc,YAAY,IAAZ,GAAoB,KAAK,KAAL,GAAc,YAAY,IAA5D;AACA,aAAO,GAAP,GAAc,YAAY,GAAZ,GAAoB,KAAK,MAAL,GAAc,YAAY,GAA5D;;AAEA,aAAO,KAAP,GAAgB,YAAY,KAAZ,GAAsB,KAAK,KAAL,IAAe,IAAI,YAAY,KAA/B,CAAtC;AACA,aAAO,MAAP,GAAgB,YAAY,MAAZ,GAAsB,KAAK,MAAL,IAAe,IAAI,YAAY,MAA/B,CAAtC;AACD,KAND,MAOK;AACH,aAAO,IAAP,GAAc,OAAO,GAAP,GAAa,OAAO,KAAP,GAAe,OAAO,MAAP,GAAgB,CAA1D;AACD;;AAED,WAAO,MAAP;AACD,GAxBc;;AA0Bf,OAAK,oBAAwD;AAAA,QAA5C,UAA4C,SAA5C,UAA4C;AAAA,QAAhC,WAAgC,SAAhC,WAAgC;AAAA,QAAnB,MAAmB,SAAnB,MAAmB;AAAA,QAAX,OAAW,SAAX,OAAW;;AAC3D,QAAI,CAAC,OAAL,EAAc;AAAE,aAAO,MAAP;AAAgB;;AAEhC,QAAM,OAAO,OAAO,WAAP,GACT,EAAE,GAAG,OAAO,CAAZ,EAAe,GAAG,OAAO,CAAzB,EADS,GAET,MAAM,MAAN,CAAa,EAAb,EAAiB,UAAjB,CAFJ;;AAIA,QAAM,cAAc,mBAAmB,QAAQ,WAA3B,EAAwC,WAAxC,EAAqD,IAArD,CAApB;;AAEA,QAAI,CAAC,WAAL,EAAkB;AAAE,aAAO,MAAP;AAAgB;;AAEpC,WAAO,EAAP,GAAY,CAAZ;AACA,WAAO,EAAP,GAAY,CAAZ;AACA,WAAO,MAAP,GAAgB,KAAhB;;AAEA,QAAM,OAAO,WAAb;AACA,QAAI,YAAY,KAAK,CAArB;AACA,QAAI,YAAY,KAAK,CAArB;;AAEA,QAAM,SAAS,YAAY,eAAZ,CAA4B,QAA3C;;AAEA;AACA;AACA;AACA,QAAI,OAAO,WAAP,IAAsB,OAAO,WAAjC,EAA8C;AAC5C,kBAAY,KAAK,GAAL,CAAS,KAAK,GAAL,CAAS,KAAK,CAAL,GAAS,KAAK,KAAd,GAAuB,OAAO,KAAvC,EAA+C,KAAK,CAApD,CAAT,EAAiE,KAAK,CAAL,GAAS,OAAO,IAAjF,CAAZ;AACA,kBAAY,KAAK,GAAL,CAAS,KAAK,GAAL,CAAS,KAAK,CAAL,GAAS,KAAK,MAAd,GAAuB,OAAO,MAAvC,EAA+C,KAAK,CAApD,CAAT,EAAiE,KAAK,CAAL,GAAS,OAAO,GAAjF,CAAZ;AACD,KAHD,MAIK;AACH,kBAAY,KAAK,GAAL,CAAS,KAAK,GAAL,CAAS,KAAK,KAAL,GAAc,OAAO,KAA9B,EAAsC,KAAK,CAA3C,CAAT,EAAwD,KAAK,IAAL,GAAY,OAAO,IAA3E,CAAZ;AACA,kBAAY,KAAK,GAAL,CAAS,KAAK,GAAL,CAAS,KAAK,MAAL,GAAc,OAAO,MAA9B,EAAsC,KAAK,CAA3C,CAAT,EAAwD,KAAK,GAAL,GAAY,OAAO,GAA3E,CAAZ;AACD;;AAED,WAAO,EAAP,GAAY,YAAY,KAAK,CAA7B;AACA,WAAO,EAAP,GAAY,YAAY,KAAK,CAA7B;;AAEA,WAAO,OAAP,GAAiB,OAAO,SAAP,KAAqB,SAArB,IAAkC,OAAO,SAAP,KAAqB,SAAxE;AACA,WAAO,MAAP,GAAgB,CAAC,EAAE,OAAO,EAAP,IAAa,OAAO,EAAtB,CAAjB;;AAEA,WAAO,SAAP,GAAmB,SAAnB;AACA,WAAO,SAAP,GAAmB,SAAnB;AACD,GAnEc;;AAqEf,gBAAc,6BAAoD;AAAA,QAAxC,IAAwC,SAAxC,IAAwC;AAAA,QAAlC,MAAkC,SAAlC,MAAkC;AAAA,QAA1B,MAA0B,SAA1B,MAA0B;AAAA,QAAlB,KAAkB,SAAlB,KAAkB;AAAA,QAAX,OAAW,SAAX,OAAW;;AAChE,QAAM,cAAc,WAAW,QAAQ,WAAvC;;AAEA,QAAI,WAAW,QAAQ,OAAnB,IACG,EAAE,UAAU,OAAV,IAAqB,WAArB,IAAoC,OAAO,MAA7C,CADP,EAC6D;;AAE3D,UAAI,OAAO,MAAX,EAAmB;AACjB,aAAK,CAAL,IAAU,OAAO,EAAjB;AACA,aAAK,CAAL,IAAU,OAAO,EAAjB;AACA,eAAO,CAAP,IAAY,OAAO,EAAnB;AACA,eAAO,CAAP,IAAY,OAAO,EAAnB;;AAEA,eAAO;AACL,cAAI,OAAO,EADN;AAEL,cAAI,OAAO;AAFN,SAAP;AAID;AACF;AACF,GAvFc;;AAyFf;AAzFe,CAAjB;;AA4FA,SAAS,kBAAT,CAA6B,KAA7B,EAAoC,WAApC,EAAiD,IAAjD,EAAuD;AACrD,MAAI,MAAM,EAAN,CAAS,QAAT,CAAkB,KAAlB,CAAJ,EAA8B;AAC5B,WAAO,MAAM,eAAN,CAAsB,KAAtB,EAA6B,YAAY,MAAzC,EAAiD,YAAY,OAA7D,EAAsE,CAAC,KAAK,CAAN,EAAS,KAAK,CAAd,EAAiB,WAAjB,CAAtE,CAAP;AACD,GAFD,MAEO;AACL,WAAO,MAAM,eAAN,CAAsB,KAAtB,EAA6B,YAAY,MAAzC,EAAiD,YAAY,OAA7D,CAAP;AACD;AACF;;AAED,UAAU,QAAV,GAAqB,QAArB;AACA,UAAU,KAAV,CAAgB,IAAhB,CAAqB,UAArB;;AAEA,eAAe,SAAf,CAAyB,QAAzB,GAAoC,SAAS,QAA7C;;AAEA,OAAO,OAAP,GAAiB,QAAjB;;;;;AC7GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,IAAM,YAAiB,QAAQ,SAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,UAAR,CAAvB;AACA,IAAM,YAAiB,QAAQ,eAAR,CAAvB;AACA,IAAM,iBAAiB,QAAQ,mBAAR,CAAvB;AACA,IAAM,SAAiB,QAAQ,mBAAR,CAAvB;;eAE+B,QAAQ,YAAR,C;IAAvB,kB,YAAA,kB;;AAER,IAAM,UAAU,EAAE,KAAK,CAAC,QAAR,EAAkB,MAAM,CAAC,QAAzB,EAAmC,QAAQ,CAAC,QAA5C,EAAsD,OAAO,CAAC,QAA9D,EAAhB;AACA,IAAM,UAAU,EAAE,KAAK,CAAC,QAAR,EAAkB,MAAM,CAAC,QAAzB,EAAmC,QAAQ,CAAC,QAA5C,EAAsD,OAAO,CAAC,QAA9D,EAAhB;;AAEA,IAAM,gBAAgB;AACpB,YAAU;AACR,aAAS,KADD;AAER,aAAS,KAFD;AAGR,SAAK,IAHG;AAIR,SAAK,IAJG;AAKR,YAAQ;AALA,GADU;;AASpB,aAAW,yBAAiD;AAAA,QAArC,WAAqC,QAArC,WAAqC;AAAA,QAAxB,WAAwB,QAAxB,WAAwB;AAAA,QAAX,OAAW,QAAX,OAAW;;AAC1D,QAAI,CAAC,OAAL,EAAc;AACZ,aAAO,MAAM,MAAN,CAAa,EAAb,EAAiB,WAAjB,CAAP;AACD;;AAED,QAAM,SAAS,mBAAmB,QAAQ,MAA3B,EAAmC,WAAnC,EAAgD,YAAY,WAAZ,CAAwB,IAAxE,CAAf;;AAEA,QAAI,MAAJ,EAAY;AACV,aAAO;AACL,aAAQ,YAAY,GAAZ,GAAqB,OAAO,CAD/B;AAEL,cAAQ,YAAY,IAAZ,GAAqB,OAAO,CAF/B;AAGL,gBAAQ,YAAY,MAAZ,GAAqB,OAAO,CAH/B;AAIL,eAAQ,YAAY,KAAZ,GAAqB,OAAO;AAJ/B,OAAP;AAMD;;AAED,WAAO,WAAP;AACD,GA1BmB;;AA4BpB,OAAK,oBAAgE;AAAA,QAApD,UAAoD,SAApD,UAAoD;AAAA,QAAxC,WAAwC,SAAxC,WAAwC;AAAA,QAA3B,MAA2B,SAA3B,MAA2B;AAAA,QAAnB,MAAmB,SAAnB,MAAmB;AAAA,QAAX,OAAW,SAAX,OAAW;;AACnE,QAAM,QAAQ,YAAY,QAAZ,CAAqB,WAArB,IAAoC,YAAY,QAAZ,CAAqB,KAAvE;;AAEA,QAAI,CAAC,YAAY,WAAZ,EAAD,IAA8B,CAAC,KAAnC,EAA0C;AACxC;AACD;;AAED,QAAM,OAAO,OAAO,WAAP,GACT,EAAE,GAAG,OAAO,CAAZ,EAAe,GAAG,OAAO,CAAzB,EADS,GAET,MAAM,MAAN,CAAa,EAAb,EAAiB,UAAjB,CAFJ;AAGA,QAAM,QAAQ,UAAU,UAAV,CAAqB,mBAAmB,QAAQ,KAA3B,EAAkC,WAAlC,EAA+C,IAA/C,CAArB,KAA8E,OAA5F;AACA,QAAM,QAAQ,UAAU,UAAV,CAAqB,mBAAmB,QAAQ,KAA3B,EAAkC,WAAlC,EAA+C,IAA/C,CAArB,KAA8E,OAA5F;;AAEA,QAAI,YAAY,KAAK,CAArB;AACA,QAAI,YAAY,KAAK,CAArB;;AAEA,WAAO,EAAP,GAAY,CAAZ;AACA,WAAO,EAAP,GAAY,CAAZ;AACA,WAAO,MAAP,GAAgB,KAAhB;;AAEA,QAAI,MAAM,GAAV,EAAe;AACb,kBAAY,KAAK,GAAL,CAAS,KAAK,GAAL,CAAS,MAAM,GAAN,GAAe,OAAO,GAA/B,EAAuC,KAAK,CAA5C,CAAT,EAAyD,MAAM,GAAN,GAAe,OAAO,GAA/E,CAAZ;AACD,KAFD,MAGK,IAAI,MAAM,MAAV,EAAkB;AACrB,kBAAY,KAAK,GAAL,CAAS,KAAK,GAAL,CAAS,MAAM,MAAN,GAAe,OAAO,MAA/B,EAAuC,KAAK,CAA5C,CAAT,EAAyD,MAAM,MAAN,GAAe,OAAO,MAA/E,CAAZ;AACD;AACD,QAAI,MAAM,IAAV,EAAgB;AACd,kBAAY,KAAK,GAAL,CAAS,KAAK,GAAL,CAAS,MAAM,IAAN,GAAe,OAAO,IAA/B,EAAuC,KAAK,CAA5C,CAAT,EAAyD,MAAM,IAAN,GAAe,OAAO,IAA/E,CAAZ;AACD,KAFD,MAGK,IAAI,MAAM,KAAV,EAAiB;AACpB,kBAAY,KAAK,GAAL,CAAS,KAAK,GAAL,CAAS,MAAM,KAAN,GAAe,OAAO,KAA/B,EAAuC,KAAK,CAA5C,CAAT,EAAyD,MAAM,KAAN,GAAe,OAAO,KAA/E,CAAZ;AACD;;AAED,WAAO,EAAP,GAAY,YAAY,KAAK,CAA7B;AACA,WAAO,EAAP,GAAY,YAAY,KAAK,CAA7B;;AAEA,WAAO,OAAP,GAAiB,OAAO,SAAP,KAAqB,SAArB,IAAkC,OAAO,SAAP,KAAqB,SAAxE;AACA,WAAO,MAAP,GAAgB,CAAC,EAAE,OAAO,EAAP,IAAa,OAAO,EAAtB,CAAjB;;AAEA,WAAO,SAAP,GAAmB,SAAnB;AACA,WAAO,SAAP,GAAmB,SAAnB;AACD,GArEmB;;AAuEpB,gBAAc,6BAAoD;AAAA,QAAxC,IAAwC,SAAxC,IAAwC;AAAA,QAAlC,MAAkC,SAAlC,MAAkC;AAAA,QAA1B,MAA0B,SAA1B,MAA0B;AAAA,QAAlB,KAAkB,SAAlB,KAAkB;AAAA,QAAX,OAAW,SAAX,OAAW;;AAChE,QAAI,WAAW,QAAQ,OAAnB,IACG,EAAE,UAAU,OAAV,IAAqB,OAAO,MAA9B,CADP,EAC8C;;AAE5C,UAAI,OAAO,MAAX,EAAmB;AACjB,aAAK,CAAL,IAAU,OAAO,EAAjB;AACA,aAAK,CAAL,IAAU,OAAO,EAAjB;AACA,eAAO,CAAP,IAAY,OAAO,EAAnB;AACA,eAAO,CAAP,IAAY,OAAO,EAAnB;;AAEA,eAAO;AACL,cAAI,OAAO,EADN;AAEL,cAAI,OAAO;AAFN,SAAP;AAID;AACF;AACF,GAvFmB;;AAyFpB,kBAzFoB;AA0FpB,kBA1FoB;AA2FpB;AA3FoB,CAAtB;;AA8FA,UAAU,aAAV,GAA0B,aAA1B;AACA,UAAU,KAAV,CAAgB,IAAhB,CAAqB,eAArB;;AAEA,eAAe,SAAf,CAAyB,aAAzB,GAAyC,cAAc,QAAvD;AACA,OAAO,QAAP,CAAgB,aAAhB,GAAyC,cAAc,QAAvD;;AAEA,OAAO,OAAP,GAAiB,aAAjB;;;;;AC1HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,IAAM,YAAiB,QAAQ,SAAR,CAAvB;AACA,IAAM,gBAAiB,QAAQ,iBAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,UAAR,CAAvB;AACA,IAAM,YAAiB,QAAQ,eAAR,CAAvB;AACA,IAAM,iBAAiB,QAAQ,mBAAR,CAAvB;AACA,IAAM,SAAiB,QAAQ,mBAAR,CAAvB;;AAEA,IAAM,QAAQ,EAAE,OAAO,CAAC,QAAV,EAAoB,QAAQ,CAAC,QAA7B,EAAd;AACA,IAAM,QAAQ,EAAE,OAAO,CAAC,QAAV,EAAoB,QAAQ,CAAC,QAA7B,EAAd;;AAEA,IAAM,eAAe;AACnB,YAAU;AACR,aAAS,KADD;AAER,aAAS,KAFD;AAGR,SAAK,IAHG;AAIR,SAAK;AAJG,GADS;;AAQnB,aAAW,yBAA2B;AAAA,QAAf,WAAe,QAAf,WAAe;;AACpC,WAAO,YAAY,WAAnB;AACD,GAVkB;;AAYnB,OAAK,aAAU,GAAV,EAAe;AAAA,QACV,WADU,GACe,GADf,CACV,WADU;AAAA,QACG,OADH,GACe,GADf,CACG,OADH;;AAElB,QAAM,QAAQ,YAAY,QAAZ,CAAqB,WAArB,IAAoC,YAAY,QAAZ,CAAqB,KAAvE;;AAEA,QAAI,CAAC,YAAY,WAAZ,EAAD,IAA8B,CAAC,KAAnC,EAA0C;AACxC;AACD;;AAED,QAAM,OAAO,UAAU,UAAV,CAAqB,YAAY,WAAZ,CAAwB,QAA7C,CAAb;;AAEA,QAAM,UAAU,UAAU,UAAV,CAAqB,cAAc,kBAAd,CAAiC,QAAQ,GAAzC,EAA8C,WAA9C,CAArB,KAAoF,KAApG;AACA,QAAM,UAAU,UAAU,UAAV,CAAqB,cAAc,kBAAd,CAAiC,QAAQ,GAAzC,EAA8C,WAA9C,CAArB,KAAoF,KAApG;;AAEA,QAAI,OAAJ,GAAc;AACZ,eAAS,QAAQ,OADL;AAEZ,eAAS,QAAQ,OAFL;AAGZ,aAAO,MAAM,MAAN,CAAa,EAAb,EAAiB,cAAc,OAA/B,CAHK;AAIZ,aAAO,MAAM,MAAN,CAAa,EAAb,EAAiB,cAAc,OAA/B;AAJK,KAAd;;AAOA,QAAI,MAAM,GAAV,EAAe;AACb,UAAI,OAAJ,CAAY,KAAZ,CAAkB,GAAlB,GAAwB,KAAK,MAAL,GAAc,QAAQ,MAA9C;AACA,UAAI,OAAJ,CAAY,KAAZ,CAAkB,GAAlB,GAAwB,KAAK,MAAL,GAAc,QAAQ,MAA9C;AACD,KAHD,MAIK,IAAI,MAAM,MAAV,EAAkB;AACrB,UAAI,OAAJ,CAAY,KAAZ,CAAkB,MAAlB,GAA2B,KAAK,GAAL,GAAW,QAAQ,MAA9C;AACA,UAAI,OAAJ,CAAY,KAAZ,CAAkB,MAAlB,GAA2B,KAAK,GAAL,GAAW,QAAQ,MAA9C;AACD;AACD,QAAI,MAAM,IAAV,EAAgB;AACd,UAAI,OAAJ,CAAY,KAAZ,CAAkB,IAAlB,GAAyB,KAAK,KAAL,GAAa,QAAQ,KAA9C;AACA,UAAI,OAAJ,CAAY,KAAZ,CAAkB,IAAlB,GAAyB,KAAK,KAAL,GAAa,QAAQ,KAA9C;AACD,KAHD,MAIK,IAAI,MAAM,KAAV,EAAiB;AACpB,UAAI,OAAJ,CAAY,KAAZ,CAAkB,KAAlB,GAA0B,KAAK,IAAL,GAAY,QAAQ,KAA9C;AACA,UAAI,OAAJ,CAAY,KAAZ,CAAkB,KAAlB,GAA0B,KAAK,IAAL,GAAY,QAAQ,KAA9C;AACD;;AAED,kBAAc,GAAd,CAAkB,GAAlB;AACD,GAlDkB;;AAoDnB,gBAAc,cAAc;AApDT,CAArB;;AAuDA,UAAU,YAAV,GAAyB,YAAzB;AACA,UAAU,KAAV,CAAgB,IAAhB,CAAqB,cAArB;;AAEA,eAAe,SAAf,CAAyB,YAAzB,GAAwC,aAAa,QAArD;AACA,OAAO,QAAP,CAAgB,YAAhB,GAAwC,aAAa,QAArD;;AAEA,OAAO,OAAP,GAAiB,YAAjB;;;;;AClFA,IAAM,YAAiB,QAAQ,SAAR,CAAvB;AACA,IAAM,WAAiB,QAAQ,aAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,UAAR,CAAvB;AACA,IAAM,iBAAiB,QAAQ,mBAAR,CAAvB;;AAEA,IAAM,OAAO;AACX,YAAU;AACR,aAAS,KADD;AAER,aAAS,KAFD;AAGR,WAAS,QAHD;AAIR,aAAS,IAJD;AAKR,aAAS,IALD;;AAOR,oBAAgB;AAPR,GADC;;AAWX,aAAW,yBAA8E;AAAA,QAAlE,WAAkE,QAAlE,WAAkE;AAAA,QAArD,YAAqD,QAArD,YAAqD;AAAA,QAAvC,OAAuC,QAAvC,OAAuC;AAAA,QAA9B,IAA8B,QAA9B,IAA8B;AAAA,QAAxB,WAAwB,QAAxB,WAAwB;AAAA,QAAX,OAAW,QAAX,OAAW;;AACvF,QAAM,UAAU,EAAhB;AACA,QAAM,gBAAgB,MAAM,QAAN,CAAe,MAAM,eAAN,CAAsB,QAAQ,MAA9B,CAAf,CAAtB;AACA,QAAM,SAAS,iBAAiB,MAAM,WAAN,CAAkB,YAAlB,EAAgC,OAAhC,EAAyC,YAAY,QAAZ,CAAqB,IAA9D,CAAhC;AACA,cAAU,WAAW,aAAa,OAAb,CAAqB,YAAY,QAAZ,CAAqB,IAA1C,EAAgD,IAA3D,IAAmE,EAA7E;;AAEA,QAAI,mBAAJ;;AAEA,QAAI,QAAQ,MAAR,KAAmB,aAAvB,EAAsC;AACpC,mBAAa;AACX,WAAG,YAAY,WAAZ,CAAwB,IAAxB,CAA6B,CAA7B,GAAiC,OAAO,CADhC;AAEX,WAAG,YAAY,WAAZ,CAAwB,IAAxB,CAA6B,CAA7B,GAAiC,OAAO;AAFhC,OAAb;AAID,KALD,MAMM;AACJ,UAAM,aAAa,MAAM,eAAN,CAAsB,QAAQ,MAA9B,EAAsC,YAAtC,EAAoD,OAApD,EAA6D,CAAC,WAAD,CAA7D,CAAnB;;AAEA,mBAAa,MAAM,QAAN,CAAe,UAAf,KAA8B,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EAA3C;AACD;;AAED,QAAI,QAAQ,QAAQ,cAAhB,IAAkC,QAAQ,cAAR,CAAuB,MAA7D,EAAqE;AACnE,2BAA6C,QAAQ,cAArD,kHAAqE;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,YAArD,SAAqD,SAAxD,CAAwD;AAAA,YAAvC,SAAuC,SAA1C,CAA0C;;AACnE,gBAAQ,IAAR,CAAa;AACX,aAAG,YAAY,IAAZ,GAAoB,KAAK,KAAL,GAAc,SAAlC,GAA+C,WAAW,CADlD;AAEX,aAAG,YAAY,GAAZ,GAAoB,KAAK,MAAL,GAAc,SAAlC,GAA+C,WAAW;AAFlD,SAAb;AAID;AACF,KAPD,MAQK;AACH,cAAQ,IAAR,CAAa,UAAb;AACD;;AAED,WAAO,OAAP;AACD,GA5CU;;AA8CX,OAAK,oBAAyE;AAAA,QAA7D,WAA6D,SAA7D,WAA6D;AAAA,QAAhD,UAAgD,SAAhD,UAAgD;AAAA,QAApC,MAAoC,SAApC,MAAoC;AAAA,QAA5B,OAA4B,SAA5B,OAA4B;AAAA,QAAX,OAAW,SAAnB,MAAmB;;AAC5E,QAAM,UAAU,EAAhB;AACA,QAAI,eAAJ;AACA,QAAI,aAAJ;AACA,QAAI,UAAJ;;AAEA,QAAI,OAAO,WAAX,EAAwB;AACtB,aAAO,EAAE,GAAG,OAAO,CAAZ,EAAe,GAAG,OAAO,CAAzB,EAAP;AACD,KAFD,MAGK;AACH,UAAM,SAAS,MAAM,WAAN,CAAkB,YAAY,MAA9B,EAAsC,YAAY,OAAlD,EAA2D,YAAY,QAAZ,CAAqB,IAAhF,CAAf;;AAEA,aAAO,MAAM,MAAN,CAAa,EAAb,EAAiB,UAAjB,CAAP;;AAEA,WAAK,CAAL,IAAU,OAAO,CAAjB;AACA,WAAK,CAAL,IAAU,OAAO,CAAjB;AACD;;AAED,WAAO,KAAP,GAAe,KAAK,CAApB;AACA,WAAO,KAAP,GAAe,KAAK,CAApB;;AAEA,QAAI,MAAM,QAAQ,OAAR,GAAiB,QAAQ,OAAR,CAAgB,MAAjC,GAA0C,CAApD;;AAEA,0BAAyC,OAAzC,yHAAkD;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,UAAlC,OAAkC,SAArC,CAAqC;AAAA,UAAtB,OAAsB,SAAzB,CAAyB;;AAChD,UAAM,YAAY,KAAK,CAAL,GAAS,OAA3B;AACA,UAAM,YAAY,KAAK,CAAL,GAAS,OAA3B;;AAEA,4BAAyB,QAAQ,OAAjC,yHAA0C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,YAA/B,UAA+B;;AACxC,YAAI,MAAM,EAAN,CAAS,QAAT,CAAkB,UAAlB,CAAJ,EAAmC;AACjC,mBAAS,WAAW,SAAX,EAAsB,SAAtB,EAAiC,WAAjC,CAAT;AACD,SAFD,MAGK;AACH,mBAAS,UAAT;AACD;;AAED,YAAI,CAAC,MAAL,EAAa;AAAE;AAAW;;AAE1B,gBAAQ,IAAR,CAAa;AACX,aAAG,MAAM,EAAN,CAAS,MAAT,CAAgB,OAAO,CAAvB,IAA6B,OAAO,CAAP,GAAW,OAAxC,GAAmD,SAD3C;AAEX,aAAG,MAAM,EAAN,CAAS,MAAT,CAAgB,OAAO,CAAvB,IAA6B,OAAO,CAAP,GAAW,OAAxC,GAAmD,SAF3C;;AAIX,iBAAO,MAAM,EAAN,CAAS,MAAT,CAAgB,OAAO,KAAvB,IAA+B,OAAO,KAAtC,GAA6C,QAAQ;AAJjD,SAAb;AAMD;AACF;;AAED,QAAM,UAAU;AACd,cAAQ,IADM;AAEd,eAAS,KAFK;AAGd,gBAAU,CAHI;AAId,aAAO,CAJO;AAKd,UAAI,CALU;AAMd,UAAI;AANU,KAAhB;;AASA,SAAK,IAAI,CAAJ,EAAO,MAAM,QAAQ,MAA1B,EAAkC,IAAI,GAAtC,EAA2C,GAA3C,EAAgD;AAC9C,eAAS,QAAQ,CAAR,CAAT;;AAEA,UAAM,QAAQ,OAAO,KAArB;AACA,UAAM,KAAK,OAAO,CAAP,GAAW,KAAK,CAA3B;AACA,UAAM,KAAK,OAAO,CAAP,GAAW,KAAK,CAA3B;AACA,UAAM,WAAW,MAAM,KAAN,CAAY,EAAZ,EAAgB,EAAhB,CAAjB;AACA,UAAI,UAAU,YAAY,KAA1B;;AAEA;AACA;AACA,UAAI,UAAU,QAAV,IAAsB,QAAQ,OAA9B,IAAyC,QAAQ,KAAR,KAAkB,QAA/D,EAAyE;AACvE,kBAAU,KAAV;AACD;;AAED,UAAI,CAAC,QAAQ,MAAT,KAAoB;AACpB;AADoB,QAEjB,QAAQ,OAAR,IAAmB,UAAU;AAChC;AADG,QAED,WAAW,KAAX,GAAmB,QAAQ,QAAR,GAAmB,QAAQ;AAChD;AAHG,QAIA,UAAU,QAAV,IAAsB,QAAQ,KAAR,KAAkB,QAAzC;AACF;AACC,iBAAW,QAAQ,QARA;AASpB;AACG,OAAC,QAAQ,OAAT,IAAoB,WAAW,QAAQ,QAV1C,CAAJ,EAU0D;;AAExD,gBAAQ,MAAR,GAAiB,MAAjB;AACA,gBAAQ,QAAR,GAAmB,QAAnB;AACA,gBAAQ,KAAR,GAAgB,KAAhB;AACA,gBAAQ,OAAR,GAAkB,OAAlB;AACA,gBAAQ,EAAR,GAAa,EAAb;AACA,gBAAQ,EAAR,GAAa,EAAb;;AAEA,eAAO,KAAP,GAAe,KAAf;AACD;AACF;;AAED,QAAI,oBAAJ;;AAEA,QAAI,QAAQ,MAAZ,EAAoB;AAClB,oBAAe,OAAO,SAAP,KAAqB,QAAQ,MAAR,CAAe,CAApC,IAAyC,OAAO,SAAP,KAAqB,QAAQ,MAAR,CAAe,CAA5F;;AAEA,aAAO,SAAP,GAAmB,QAAQ,MAAR,CAAe,CAAlC;AACA,aAAO,SAAP,GAAmB,QAAQ,MAAR,CAAe,CAAlC;AACD,KALD,MAMK;AACH,oBAAc,IAAd;;AAEA,aAAO,SAAP,GAAmB,GAAnB;AACA,aAAO,SAAP,GAAmB,GAAnB;AACD;;AAED,WAAO,EAAP,GAAY,QAAQ,EAApB;AACA,WAAO,EAAP,GAAY,QAAQ,EAApB;;AAEA,WAAO,OAAP,GAAkB,eAAgB,QAAQ,OAAR,IAAmB,CAAC,OAAO,MAA7D;AACA,WAAO,MAAP,GAAgB,QAAQ,OAAxB;AACD,GA/JU;;AAiKX,gBAAc,6BAAoD;AAAA,QAAxC,IAAwC,SAAxC,IAAwC;AAAA,QAAlC,MAAkC,SAAlC,MAAkC;AAAA,QAA1B,MAA0B,SAA1B,MAA0B;AAAA,QAAlB,KAAkB,SAAlB,KAAkB;AAAA,QAAX,OAAW,SAAX,OAAW;;AAChE,QAAM,iBAAiB,WAAW,QAAQ,cAA1C;;AAEA,QAAI,WAAW,QAAQ,OAAnB,IACG,EAAE,UAAU,OAAV,IAAqB,cAArB,IAAuC,eAAe,MAAxD,CADP,EACwE;;AAEtE,UAAI,OAAO,MAAX,EAAmB;AACjB,aAAK,CAAL,IAAU,OAAO,EAAjB;AACA,aAAK,CAAL,IAAU,OAAO,EAAjB;AACA,eAAO,CAAP,IAAY,OAAO,EAAnB;AACA,eAAO,CAAP,IAAY,OAAO,EAAnB;AACD;;AAED,aAAO;AACL,eAAS,OAAO,KADX;AAEL,gBAAS,OAAO,MAFX;AAGL,WAAS,OAAO,SAHX;AAIL,WAAS,OAAO,SAJX;AAKL,eAAS,OAAO,KALX;AAML,eAAS,OAAO,KANX;AAOL,YAAS,OAAO,EAPX;AAQL,YAAS,OAAO;AARX,OAAP;AAUD;AACF;AAzLU,CAAb;;AA4LA,SAAS,cAAT,GAA0B,UAAU,IAAV,EAAgB;AACxC,SAAO,UAAU,CAAV,EAAa,CAAb,EAAgB;AACrB,QAAM,SAAS,KAAK,MAAL,IAAe;AAC5B,YAAQ,CAAC,QADmB;AAE5B,aAAS,QAFmB;AAG5B,WAAQ,CAAC,QAHmB;AAI5B,cAAS;AAJmB,KAA9B;AAMA,QAAI,UAAU,CAAd;AACA,QAAI,UAAU,CAAd;;AAEA,QAAI,MAAM,EAAN,CAAS,MAAT,CAAgB,KAAK,MAArB,CAAJ,EAAkC;AAChC,gBAAU,KAAK,MAAL,CAAY,CAAtB;AACA,gBAAU,KAAK,MAAL,CAAY,CAAtB;AACD;;AAED,QAAM,QAAQ,KAAK,KAAL,CAAW,CAAC,IAAI,OAAL,IAAgB,KAAK,CAAhC,CAAd;AACA,QAAM,QAAQ,KAAK,KAAL,CAAW,CAAC,IAAI,OAAL,IAAgB,KAAK,CAAhC,CAAd;;AAEA,QAAM,OAAO,KAAK,GAAL,CAAS,OAAO,IAAhB,EAAsB,KAAK,GAAL,CAAS,OAAO,KAAhB,EAAwB,QAAQ,KAAK,CAAb,GAAiB,OAAzC,CAAtB,CAAb;AACA,QAAM,OAAO,KAAK,GAAL,CAAS,OAAO,GAAhB,EAAsB,KAAK,GAAL,CAAS,OAAO,MAAhB,EAAwB,QAAQ,KAAK,CAAb,GAAiB,OAAzC,CAAtB,CAAb;;AAEA,WAAO;AACL,SAAG,IADE;AAEL,SAAG,IAFE;AAGL,aAAO,KAAK;AAHP,KAAP;AAKD,GA1BD;AA2BD,CA5BD;;AA8BA,UAAU,IAAV,GAAiB,IAAjB;AACA,UAAU,KAAV,CAAgB,IAAhB,CAAqB,MAArB;;AAEA,eAAe,SAAf,CAAyB,IAAzB,GAAgC,KAAK,QAArC;;AAEA,OAAO,OAAP,GAAiB,IAAjB;;;;;ACpOA;AACA;;AAEA,IAAM,YAAiB,QAAQ,SAAR,CAAvB;AACA,IAAM,OAAiB,QAAQ,QAAR,CAAvB;AACA,IAAM,iBAAiB,QAAQ,mBAAR,CAAvB;AACA,IAAM,SAAiB,QAAQ,mBAAR,CAAvB;AACA,IAAM,QAAiB,QAAQ,WAAR,CAAvB;;AAEA,IAAM,WAAW;AACf,YAAU;AACR,aAAS,KADD;AAER,aAAS,KAFD;AAGR,WAAS,QAHD;AAIR,aAAS,IAJD;AAKR,aAAS;AALD,GADK;;AASf,aAAW,mBAAU,GAAV,EAAe;AAAA,QAChB,WADgB,GACS,GADT,CAChB,WADgB;AAAA,QACH,OADG,GACS,GADT,CACH,OADG;;AAExB,QAAM,QAAQ,YAAY,QAAZ,CAAqB,KAAnC;;AAEA,QAAI,CAAC,KAAL,EAAY;AAAE;AAAS;;AAEvB,QAAI,OAAJ,GAAc;AACZ,sBAAgB,CAAC;AACf,WAAG,MAAM,IAAN,GAAY,CAAZ,GAAgB,CADJ;AAEf,WAAG,MAAM,GAAN,GAAY,CAAZ,GAAgB;AAFJ,OAAD,CADJ;AAKZ,cAAQ,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EALI;AAMZ,cAAQ,MANI;AAOZ,aAAO,QAAQ;AAPH,KAAd;;AAUA,QAAM,UAAU,KAAK,SAAL,CAAe,GAAf,CAAhB;AACA,QAAI,OAAJ,GAAc,OAAd;;AAEA,WAAO,OAAP;AACD,GA7Bc;;AA+Bf,OAAK,aAAU,GAAV,EAAe;AAAA,QACV,WADU,GACmC,GADnC,CACV,WADU;AAAA,QACG,OADH,GACmC,GADnC,CACG,OADH;AAAA,QACY,MADZ,GACmC,GADnC,CACY,MADZ;AAAA,QACoB,UADpB,GACmC,GADnC,CACoB,UADpB;;AAElB,QAAM,OAAO,MAAM,MAAN,CAAa,EAAb,EAAiB,UAAjB,CAAb;AACA,QAAM,YAAY,KAAK,CAAL,GAAS,OAAO,CAAP,EAAU,CAArC;AACA,QAAM,YAAY,KAAK,CAAL,GAAS,OAAO,CAAP,EAAU,CAArC;;AAEA,QAAI,OAAJ,GAAc,MAAM,MAAN,CAAa,EAAb,EAAiB,OAAjB,CAAd;AACA,QAAI,OAAJ,CAAY,OAAZ,GAAsB,EAAtB;;AAEA,yBAAyB,QAAQ,OAAjC,kHAA0C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAA/B,UAA+B;;AACxC,UAAI,eAAJ;;AAEA,UAAI,MAAM,EAAN,CAAS,QAAT,CAAkB,UAAlB,CAAJ,EAAmC;AACjC,iBAAS,WAAW,SAAX,EAAsB,SAAtB,EAAiC,WAAjC,CAAT;AACD,OAFD,MAGK;AACH,iBAAS,UAAT;AACD;;AAED,UAAI,CAAC,MAAL,EAAa;AAAE;AAAW;;AAE1B,UAAI,WAAW,MAAX,IAAqB,YAAY,MAArC,EAA6C;AAC3C,eAAO,CAAP,GAAW,OAAO,KAAlB;AACA,eAAO,CAAP,GAAW,OAAO,MAAlB;AACD;;AAED,UAAI,OAAJ,CAAY,OAAZ,CAAoB,IAApB,CAAyB,MAAzB;AACD;;AAED,SAAK,GAAL,CAAS,GAAT;AACD,GA7Dc;;AA+Df,gBAAc,sBAAU,GAAV,EAAe;AAAA,QACnB,OADmB,GACP,GADO,CACnB,OADmB;;;AAG3B,QAAI,OAAJ,GAAc,MAAM,MAAN,CAAa,EAAb,EAAiB,OAAjB,CAAd;AACA,QAAI,OAAJ,CAAY,OAAZ,GAAsB,QAAQ,OAA9B;AACA,QAAI,OAAJ,CAAY,cAAZ,GAA6B,CAAC,IAAD,CAA7B;;AAEA,SAAK,YAAL,CAAkB,GAAlB;AACD;AAvEc,CAAjB;;AA0EA,UAAU,QAAV,GAAqB,QAArB;AACA,UAAU,KAAV,CAAgB,IAAhB,CAAqB,UAArB;;AAEA,eAAe,SAAf,CAAyB,QAAzB,GAAoC,SAAS,QAA7C;AACA,OAAO,QAAP,CAAgB,QAAhB,GAAoC,SAAS,QAA7C;;AAEA,OAAO,OAAP,GAAiB,QAAjB;;;;;;;ACzFA,IAAM,eAAe,QAAQ,uBAAR,CAArB;;AAEA,OAAO,OAAP;AACE,wBAAa,IAAb,EAAmB,OAAnB,EAA4B,KAA5B,EAAmC,WAAnC,EAAgD,WAAhD,EAA6D;AAAA;;AAC3D,iBAAa,aAAb,CAA2B,IAA3B,EAAiC,KAAjC;;AAEA,QAAI,UAAU,OAAd,EAAuB;AACrB,mBAAa,aAAb,CAA2B,IAA3B,EAAiC,OAAjC;AACD;;AAED,SAAK,WAAL,GAAmB,WAAnB;;AAEA,SAAK,SAAL,GAAqB,IAAI,IAAJ,GAAW,OAAX,EAArB;AACA,SAAK,aAAL,GAAqB,KAArB;AACA,SAAK,IAAL,GAAqB,IAArB;AACA,SAAK,SAAL,GAAqB,aAAa,YAAb,CAA0B,OAA1B,CAArB;AACA,SAAK,WAAL,GAAqB,aAAa,cAAb,CAA4B,OAA5B,CAArB;AACA,SAAK,MAAL,GAAqB,WAArB;AACA,SAAK,aAAL,GAAqB,IAArB;;AAEA,QAAI,SAAS,KAAb,EAAoB;AAClB,UAAM,eAAe,YAAY,eAAZ,CAA4B,OAA5B,CAArB;AACA,WAAK,EAAL,GAAU,KAAK,SAAL,GAAiB,YAAY,SAAZ,CAAsB,YAAtB,CAA3B;;AAEA,UAAM,WAAW,KAAK,SAAL,GAAiB,YAAY,OAA9C;;AAEA,WAAK,MAAL,GAAc,CAAC,EAAE,YAAY,OAAZ,IACZ,YAAY,OAAZ,CAAoB,IAApB,KAA6B,WADjB,IAEZ,YAAY,OAAZ,CAAoB,MAApB,KAA+B,KAAK,MAFxB,IAGZ,WAAW,GAHD,CAAf;AAID,KAVD,MAWK,IAAI,SAAS,WAAb,EAA0B;AAC7B,WAAK,EAAL,GAAU,QAAQ,SAAR,GAAoB,YAAY,OAA1C;AACD;AACF;;AAhCH,yBAkCE,cAlCF,iCAkC8C;AAAA,QAAvB,OAAuB,QAA1B,CAA0B;AAAA,QAAX,OAAW,QAAd,CAAc;;AAC1C,SAAK,KAAL,IAAgB,OAAhB;AACA,SAAK,KAAL,IAAgB,OAAhB;AACA,SAAK,OAAL,IAAgB,OAAhB;AACA,SAAK,OAAL,IAAgB,OAAhB;;AAEA,WAAO,IAAP;AACD,GAzCH;;AAAA,yBA2CE,SA3CF,6BA2CyC;AAAA,QAAvB,OAAuB,SAA1B,CAA0B;AAAA,QAAX,OAAW,SAAd,CAAc;;AACrC,SAAK,KAAL,IAAgB,OAAhB;AACA,SAAK,KAAL,IAAgB,OAAhB;AACA,SAAK,OAAL,IAAgB,OAAhB;AACA,SAAK,OAAL,IAAgB,OAAhB;;AAEA,WAAO,IAAP;AACD,GAlDH;;AAAA,yBAoDE,cApDF,6BAoDoB;AAChB,SAAK,aAAL,CAAmB,cAAnB;AACD,GAtDH;;AAAA,yBAwDE,eAxDF,8BAwDqB;AACjB,SAAK,kBAAL,GAA0B,IAA1B;AACD,GA1DH;;AAAA,yBA4DE,wBA5DF,uCA4D8B;AAC1B,SAAK,2BAAL,GAAmC,KAAK,kBAAL,GAA0B,IAA7D;AACD,GA9DH;;AAAA;AAAA;;;;;ACFA,IAAM,eAAe,QAAQ,gBAAR,CAArB;AACA,IAAM,cAAe,QAAQ,gBAAR,CAArB;AACA,IAAM,QAAe,QAAQ,UAAR,CAArB;AACA,IAAM,UAAe,QAAQ,kBAAR,CAArB;AACA,IAAM,WAAe,QAAQ,mBAAR,CAArB;AACA,IAAM,UAAe,QAAQ,kBAAR,EAA4B,GAA5B,EAArB;;eACqB,QAAQ,cAAR,C;IAAb,M,YAAA,M;;AAER,IAAM,gBAAgB,CAAE,MAAF,EAAU,IAAV,EAAgB,QAAhB,CAAtB;AACA,IAAM,eAAgB,CAAE,MAAF,EAAU,IAAV,EAAgB,QAAhB,CAAtB;;AAEA,IAAM,gBAAgB;AACpB,4BADoB;AAEpB,YAFoB;AAGpB,0CAHoB;AAIpB,kBAJoB;AAKpB,YAAU;AACR,kBAAc,GADN;AAER,gBAAc,IAFN;AAGR,eAAc,IAHN;AAIR,YAAc,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX;AAJN,GALU;AAWpB,SAAO,CACL,MADK,EAEL,MAFK,EAGL,IAHK,EAIL,QAJK,EAKL,KALK,EAML,WANK,EAOL,MAPK;AAXa,CAAtB;;AAsBA,SAAS,IAAT,CAAe,GAAf,EAAoB;AAAA,MAEhB,WAFgB,GAMd,GANc,CAEhB,WAFgB;AAAA,MAEH,OAFG,GAMd,GANc,CAEH,OAFG;AAAA,MAEM,KAFN,GAMd,GANc,CAEM,KAFN;AAAA,MAEa,WAFb,GAMd,GANc,CAEa,WAFb;AAAA,kBAMd,GANc,CAGhB,IAHgB;AAAA,MAGhB,IAHgB,6BAGT,IAAI,YAAJ,CAAiB,IAHR;AAAA,qBAMd,GANc,CAIhB,OAJgB;AAAA,MAIhB,OAJgB,gCAIN,oBAAoB,GAApB,CAJM;AAAA,0BAMd,GANc,CAKhB,YALgB;AAAA,MAKhB,YALgB,qCAKD,IAAI,YAAJ,CAAiB,IAAjB,EAAuB,OAAvB,EAAgC,KAAhC,EAAuC,WAAvC,EAAoD,WAApD,CALC;;;AAQlB,MAAM,YAAY;AAChB,4BADgB;AAEhB,oBAFgB;AAGhB,gBAHgB;AAIhB,4BAJgB;AAKhB,oBALgB;AAMhB,cANgB;AAOhB;AAPgB,GAAlB;;AAUA,OAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,QAAQ,MAA5B,EAAoC,GAApC,EAAyC;AACvC,QAAM,SAAS,QAAQ,CAAR,CAAf;;AAEA,SAAK,IAAM,IAAX,IAAmB,OAAO,KAAP,IAAgB,EAAnC,EAAuC;AACrC,mBAAa,IAAb,IAAqB,OAAO,KAAP,CAAa,IAAb,CAArB;AACD;;AAED,QAAM,SAAS,MAAM,WAAN,CAAkB,OAAO,SAAzB,EAAoC,OAAO,OAA3C,CAAf;;AAEA,iBAAa,cAAb,CAA4B,MAA5B;AACA,iBAAa,SAAb,GAAyB,OAAO,SAAhC;AACA,iBAAa,aAAb,GAA6B,OAAO,OAApC;;AAEA,WAAO,SAAP,CAAiB,IAAjB,CAAsB,YAAtB;;AAEA,iBAAa,SAAb,CAAuB,MAAvB;;AAEA,QAAI,aAAa,2BAAb,IACI,aAAa,kBAAb,IACI,IAAI,CAAL,GAAU,QAAQ,MADrB,IAC+B,QAAQ,IAAI,CAAZ,EAAe,OAAf,KAA2B,aAAa,aAF/E,EAE+F;AAC7F;AACD;AACF;;AAED,UAAQ,IAAR,CAAa,OAAb,EAAsB,SAAtB;;AAEA,MAAI,SAAS,KAAb,EAAoB;AAClB;AACA;AACA,QAAM,UAAU,aAAa,MAAb,GACZ,KAAK;AACL,8BADK,EACQ,gBADR,EACiB,YADjB,EACwB,wBADxB;AAEL,YAAM;AAFD,KAAL,CADY,GAKZ,YALJ;;AAOA,gBAAY,OAAZ,GAAsB,OAAtB;AACA,gBAAY,OAAZ,GAAsB,QAAQ,SAA9B;AACD;;AAED,SAAO,YAAP;AACD;;AAED,SAAS,mBAAT,OAAkF;AAAA,MAAlD,WAAkD,QAAlD,WAAkD;AAAA,MAArC,OAAqC,QAArC,OAAqC;AAAA,MAA5B,KAA4B,QAA5B,KAA4B;AAAA,MAArB,WAAqB,QAArB,WAAqB;AAAA,MAAR,IAAQ,QAAR,IAAQ;;AAChF,MAAM,eAAe,YAAY,eAAZ,CAA4B,OAA5B,CAArB;;AAEA;AACA,MAAI,SAAS,KAAT,KAAmB,YAAY;AAC/B;AADmB,KAEhB,EAAE,YAAY,WAAZ,CAAwB,YAAxB,KAAyC,YAAY,WAAZ,CAAwB,YAAxB,MAA0C,WAArF,CAFH,CAAJ,EAE2G;AACzG,WAAO,EAAP;AACD;;AAED,MAAM,OAAO,MAAM,OAAN,CAAc,WAAd,CAAb;AACA,MAAM,YAAY;AAChB,4BADgB;AAEhB,oBAFgB;AAGhB,gBAHgB;AAIhB,4BAJgB;AAKhB,cALgB;AAMhB,cANgB;AAOhB,aAAS,EAPO;AAQhB,aAAS;AARO,GAAlB;;AAWA,uBAAsB,IAAtB,kHAA4B;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,QAAjB,OAAiB;;AAC1B,cAAU,OAAV,GAAoB,OAApB;;AAEA,YAAQ,IAAR,CAAa,iBAAb,EAAgC,SAAhC;AACD;;AAED,MAAI,SAAS,MAAb,EAAqB;AACnB,cAAU,OAAV,GAAoB,OAAO,UAAU,OAAjB,EAA0B;AAAA,aAC5C,OAAO,SAAP,CAAiB,OAAjB,CAAyB,YAAzB,KAA0C,YAAY,UAAZ,CAAuB,YAAvB,EAAqC,QADnC;AAAA,KAA1B,CAApB;AAED;;AAED,SAAO,UAAU,OAAjB;AACD;;AAED,YAAY,OAAZ,CAAoB,EAApB,CAAuB,qBAAvB,EAA8C,iBAAyC;AAAA,MAA7B,WAA6B,SAA7B,WAA6B;AAAA,MAAhB,YAAgB,SAAhB,YAAgB;;AACrF,cAAY,UAAZ,CAAuB,YAAvB,IAAuC,EAAE,UAAU,QAAZ,EAAsB,SAAS,IAA/B,EAAvC;AACD,CAFD;;AAIA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,gBAAvB,EAAyC,iBAAyC;AAAA,MAA7B,WAA6B,SAA7B,WAA6B;AAAA,MAAhB,YAAgB,SAAhB,YAAgB;;AAChF,cAAY,UAAZ,CAAuB,MAAvB,CAA8B,YAA9B,EAA4C,CAA5C;AACD,CAFD;;AAIA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,MAAvB,EAA+B,iBAAuE;AAAA,MAA3D,WAA2D,SAA3D,WAA2D;AAAA,MAA9C,OAA8C,SAA9C,OAA8C;AAAA,MAArC,KAAqC,SAArC,KAAqC;AAAA,MAA9B,WAA8B,SAA9B,WAA8B;AAAA,MAAjB,aAAiB,SAAjB,aAAiB;;AACpG,MAAM,eAAe,YAAY,eAAZ,CAA4B,OAA5B,CAArB;;AAEA,MAAI,CAAC,aAAD,KAAmB,CAAC,YAAY,aAAb,IAA8B,YAAY,eAA7D,CAAJ,EAAmF;AACjF,QAAI,YAAY,aAAhB,EAA+B;AAC7B,mBAAa,YAAY,UAAZ,CAAuB,YAAvB,EAAqC,OAAlD;AACD;;AAED,SAAK;AACH,8BADG,EACU,gBADV,EACmB,YADnB,EAC0B,wBAD1B;AAEH,YAAM;AAFH,KAAL;AAID;AACF,CAbD;;AAeA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,MAAvB,EAA+B,iBAAsE;AAAA,MAA1D,WAA0D,SAA1D,WAA0D;AAAA,MAA7C,OAA6C,SAA7C,OAA6C;AAAA,MAApC,KAAoC,SAApC,KAAoC;AAAA,MAA7B,WAA6B,SAA7B,WAA6B;AAAA,MAAhB,YAAgB,SAAhB,YAAgB;;AACnG;AACA,MAAM,YAAY,QAAQ,KAAR,GAAe,MAAM,MAAN,CAAa,EAAb,EAAiB,KAAjB,CAAf,GAAyC,KAA3D;;AAEA,MAAM,QAAQ,YAAY,UAAZ,CAAuB,YAAvB,CAAd;AACA,MAAM,OAAO,MAAM,OAAN,CAAc,WAAd,CAAb;AACA,MAAM,YAAY;AAChB,4BADgB;AAEhB,oBAFgB;AAGhB,gBAHgB;AAIhB,4BAJgB;AAKhB,UAAM,MALU;AAMhB,aAAS,EANO;AAOhB,cAPgB;AAQhB,aAAS;AARO,GAAlB;;AAWA,wBAAsB,IAAtB,yHAA4B;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,QAAjB,OAAiB;;AAC1B,cAAU,OAAV,GAAoB,OAApB;;AAEA,YAAQ,IAAR,CAAa,iBAAb,EAAgC,SAAhC;AACD;;AAED,MAAI,CAAC,UAAU,OAAV,CAAkB,MAAvB,EAA+B;AAAE;AAAS;;AAE1C,MAAI,cAAc,QAAlB;;AAEA,OAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,UAAU,OAAV,CAAkB,MAAtC,EAA8C,GAA9C,EAAmD;AACjD,QAAM,SAAS,UAAU,OAAV,CAAkB,CAAlB,CAAf;AACA,QAAM,eAAe,OAAO,SAAP,CAAiB,OAAjB,CAAyB,YAA9C;;AAEA,QAAI,eAAe,WAAnB,EAAgC;AAC9B,oBAAc,YAAd;AACD;AACF;;AAED,QAAM,QAAN,GAAiB,WAAjB;AACA,QAAM,OAAN,GAAgB,WAAW,YAAY;AACrC,SAAK;AACH,8BADG;AAEH,8BAFG;AAGH,eAAS,QAAQ,KAAR,GAAe,SAAf,GAA2B,OAHjC;AAIH,aAAO,SAJJ;AAKH,YAAM;AALH,KAAL;AAOD,GARe,EAQb,WARa,CAAhB;AASD,CA9CD;;AAgDA,YAAY,OAAZ,CAAoB,EAApB,CAAuB,IAAvB,EAA6B,iBAAkD;AAAA,MAA/C,WAA+C,SAA/C,WAA+C;AAAA,MAAlC,OAAkC,SAAlC,OAAkC;AAAA,MAAzB,KAAyB,SAAzB,KAAyB;AAAA,MAAlB,WAAkB,SAAlB,WAAkB;;AAC7E,MAAI,CAAC,YAAY,eAAjB,EAAkC;AAChC,SAAK,EAAE,wBAAF,EAAe,wBAAf,EAA4B,gBAA5B,EAAqC,YAArC,EAA4C,MAAM,KAAlD,EAAL;AACD;AACF,CAJD;;AAMA,CAAC,IAAD,EAAO,QAAP,EAAiB,OAAjB,CAAyB,UAAU,UAAV,EAAsB;AAC7C,cAAY,OAAZ,CAAoB,EAApB,CAAuB,UAAvB,EAAmC,iBAAyC;AAAA,QAA7B,WAA6B,SAA7B,WAA6B;AAAA,QAAhB,YAAgB,SAAhB,YAAgB;;AAC1E,QAAI,YAAY,UAAZ,CAAuB,YAAvB,CAAJ,EAA0C;AACxC,mBAAa,YAAY,UAAZ,CAAuB,YAAvB,EAAqC,OAAlD;AACD;AACF,GAJD;AAKD,CAND;;AAQA,SAAS,oBAAT,CAA+B,IAA/B,EAAqC;AACnC,SAAO,kBAAwD;AAAA,QAA5C,WAA4C,UAA5C,WAA4C;AAAA,QAA/B,OAA+B,UAA/B,OAA+B;AAAA,QAAtB,KAAsB,UAAtB,KAAsB;AAAA,QAAf,WAAe,UAAf,WAAe;;AAC7D,SAAK,EAAE,wBAAF,EAAe,wBAAf,EAA4B,gBAA5B,EAAqC,YAArC,EAA4C,UAA5C,EAAL;AACD,GAFD;AAGD;;AAED,KAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,cAAc,MAAlC,EAA0C,GAA1C,EAA+C;AAC7C,cAAY,OAAZ,CAAoB,EAApB,CAAuB,cAAc,CAAd,CAAvB,EAAyC,qBAAqB,aAAa,CAAb,CAArB,CAAzC;AACD;;AAED,YAAY,OAAZ,CAAoB,EAApB,CAAuB,KAAvB,EAA8B,UAAU,WAAV,EAAuB;AACnD,cAAY,OAAZ,GAAyB,IAAzB,CADmD,CACnB;AAChC,cAAY,OAAZ,GAAyB,CAAzB,CAFmD,CAEnB;AAChC,cAAY,UAAZ,GAAyB,EAAzB,CAHmD,CAGnB;AACjC,CAJD;;AAMA,SAAS,aAAT,GAAyB,cAAc,QAAvC;AACA,OAAO,OAAP,GAAiB,aAAjB;;;;;ACxOA,IAAM,gBAAgB,QAAQ,QAAR,CAAtB;AACA,IAAM,cAAgB,QAAQ,gBAAR,CAAtB;;AAEA,cAAc,OAAd,CAAsB,EAAtB,CAAyB,KAAzB,EAAgC,KAAhC;AACA,cAAc,OAAd,CAAsB,EAAtB,CAAyB,OAAzB,EAAkC,OAAlC;;WAEqB,CAAC,MAAD,EAAS,IAAT,EAAe,QAAf,EAAyB,QAAzB,C;AAArB,yCAAyD;AAApD,MAAM,iBAAN;AACH,cAAY,OAAZ,CAAoB,EAApB,CAAuB,MAAvB,EAA+B,aAA/B;AACD;;AAED,SAAS,KAAT,OAAkC;AAAA,MAAhB,YAAgB,QAAhB,YAAgB;;AAChC,MAAI,aAAa,IAAb,KAAsB,MAA1B,EAAkC;AAAE;AAAS;;AAE7C,eAAa,KAAb,GAAqB,CAAC,aAAa,KAAb,IAAsB,CAAvB,IAA4B,CAAjD;AACD;;AAED,SAAS,OAAT,QAAuE;AAAA,MAAnD,WAAmD,SAAnD,WAAmD;AAAA,MAAtC,YAAsC,SAAtC,YAAsC;AAAA,MAAxB,WAAwB,SAAxB,WAAwB;AAAA,MAAX,OAAW,SAAX,OAAW;;AACrE,MAAI,aAAa,IAAb,KAAsB,MAAtB,IAAgC,CAAC,QAAQ,MAA7C,EAAqD;AAAE;AAAS;;AAEhE;AACA,MAAM,WAAW,QAAQ,CAAR,EAAW,SAAX,CAAqB,OAArB,CAA6B,kBAA9C;;AAEA;AACA,MAAI,YAAY,CAAhB,EAAmB;AAAE;AAAS;;AAE9B;AACA,cAAY,kBAAZ,GAAiC,WAAW,YAAY;AACtD,kBAAc,IAAd,CAAmB;AACjB,8BADiB;AAEjB,8BAFiB;AAGjB,YAAM,MAHW;AAIjB,eAAS,YAJQ;AAKjB,aAAO;AALU,KAAnB;AAOD,GARgC,EAQ9B,QAR8B,CAAjC;AASD;;AAED,SAAS,aAAT,QAAyC;AAAA,MAAf,WAAe,SAAf,WAAe;;AACvC;AACA;AACA,MAAI,YAAY,kBAAhB,EAAoC;AAClC,kBAAc,YAAY,kBAA1B;AACA,gBAAY,kBAAZ,GAAiC,IAAjC;AACD;AACF;;AAED;AACA,cAAc,QAAd,CAAuB,kBAAvB,GAA4C,CAA5C;AACA,cAAc,KAAd,CAAoB,IAApB,CAAyB,YAAzB;;AAEA,OAAO,OAAP,GAAiB;AACf,cADe;AAEf,kBAFe;AAGf;AAHe,CAAjB;;;;;AClDA,IAAM,gBAAgB,QAAQ,QAAR,CAAtB;AACA,IAAM,eAAgB,QAAQ,iBAAR,CAAtB;AACA,IAAM,UAAgB,QAAQ,kBAAR,CAAtB;AACA,IAAM,KAAgB,QAAQ,aAAR,CAAtB;AACA,IAAM,WAAgB,QAAQ,mBAAR,CAAtB;AACA,IAAM,QAAgB,QAAQ,UAAR,CAAtB;AACA,IAAM,SAAgB,QAAQ,iBAAR,CAAtB;;eACsB,QAAQ,cAAR,C;IAAd,K,YAAA,K;;AAER,cAAc,OAAd,CAAsB,EAAtB,CAAyB,iBAAzB,EAA4C,gBAAmD;AAAA,MAAvC,OAAuC,QAAvC,OAAuC;AAAA,MAA9B,OAA8B,QAA9B,OAA8B;AAAA,MAArB,IAAqB,QAArB,IAAqB;AAAA,MAAf,WAAe,QAAf,WAAe;;AAC7F,WAAS,gBAAT,CAA2B,YAA3B,EAAyC,QAAzC,EAAmD,OAAnD,EAA4D;AAC1D,QAAM,MAAM,QAAQ,0BAAR,GACN,QAAQ,gBAAR,CAAyB,QAAzB,CADM,GAEN,SAFN;;AAIA,QAAM,YAAY,aAAa,MAA/B;AACA,QAAM,UAAU,UAAU,OAA1B;;AAEA,QAAI,UAAU,IAAV,KACG,GAAG,OAAH,CAAW,OAAX,CADH,IAEG,SAAS,eAAT,CAAyB,OAAzB,EAAkC,QAAlC,EAA4C,GAA5C,CAFH,IAGG,aAAa,eAAb,CAA6B,OAA7B,EAAsC,OAAtC,EAA+C,WAA/C,CAHP,EAGoE;;AAElE,cAAQ,IAAR,CAAa;AACX,wBADW;AAEX,4BAFW;AAGX,eAAO,EAAE,0BAAF;AAHI,OAAb;AAKD;AACF;;AAED,MAAM,eAAe,MAAM,aAAN,CAAoB,GAApB,CAAwB,OAAxB,CAArB;;AAEA,MAAI,YAAJ,EAAkB;AAChB,QAAM,YAAY,aAAa,MAA/B;AACA,QAAM,UAAU,UAAU,OAA1B;;AAEA,QAAI,UAAU,IAAV,KACG,aAAa,eAAb,CAA6B,OAA7B,EAAsC,OAAtC,EAA+C,WAA/C,CADP,EACoE;AAClE,cAAQ,IAAR,CAAa;AACX,wBADW;AAEX,4BAFW;AAGX,eAAO,EAAE,0BAAF;AAHI,OAAb;AAKD;AACF;;AAED,QAAM,aAAN,CAAoB,eAApB,CAAoC,gBAApC,EAAsD,OAAtD;AACD,CAvCD;;AAyCA,aAAa,OAAb,CAAqB,EAArB,CAAwB,KAAxB,EAA+B,iBAA4B;AAAA,MAAhB,YAAgB,SAAhB,YAAgB;;AACzD,eAAa,MAAb,CAAoB,OAApB,GAA8B,UAAU,OAAV,EAAmB;AAC/C,WAAO,aAAa,OAAb,CAAqB,OAArB,CAAP;AACD,GAFD;AAGD,CAJD;;AAMA,aAAa,OAAb,CAAqB,EAArB,CAAwB,KAAxB,EAA+B,iBAAqC;AAAA,MAAzB,YAAyB,SAAzB,YAAyB;AAAA,MAAX,OAAW,SAAX,OAAW;;AAClE,SAAO,aAAa,MAAb,CAAoB,OAA3B,EAAoC,cAAc,QAAlD;AACA,SAAO,aAAa,MAAb,CAAoB,OAA3B,EAAoC,OAApC;AACD,CAHD;;AAKA,MAAM,aAAa,UAAnB,EAA+B,cAAc,KAA7C;;AAEA,aAAa,SAAb,CAAuB,aAAvB,GAAuC,UAAU,OAAV,EAAmB;AACxD,SAAO,KAAK,MAAL,CAAY,OAAnB,EAA4B,OAA5B;;AAEA,SAAO,IAAP;AACD,CAJD;;AAMA,IAAM,qBAAqB,aAAa,SAAb,CAAuB,iBAAlD;;AAEA,aAAa,SAAb,CAAuB,iBAAvB,GAA2C,UAAU,UAAV,EAAsB,QAAtB,EAAgC;AACzE,MAAM,MAAM,mBAAmB,IAAnB,CAAwB,IAAxB,EAA8B,UAA9B,EAA0C,QAA1C,CAAZ;;AAEA,MAAI,QAAQ,IAAZ,EAAkB;AAChB,SAAK,MAAL,CAAY,OAAZ,CAAoB,UAApB,IAAkC,QAAlC;AACD;;AAED,SAAO,GAAP;AACD,CARD;;AAUA,aAAa,eAAb,CAA6B,IAA7B,CAAkC,eAAlC;;;;;ACjFA,IAAM,QAAU,QAAQ,SAAR,CAAhB;AACA,IAAM,SAAU,QAAQ,gBAAR,CAAhB;AACA,IAAM,UAAU,QAAQ,iBAAR,EAA2B,GAA3B,EAAhB;;AAEA,IAAM,QAAQ;AACZ,kBADY;AAEZ,gBAFY;AAGZ,cAHY;;AAKZ;AACA,YAAU,QAAQ,oBAAR,EAA8B,QAN5B;AAOZ;AACA,aAAW,EARC;;AAUZ,eAAa,qBAAU,GAAV,EAAe,GAAf,EAAoB;AAC/B;AACA,QAAI,MAAM,QAAN,CAAe,MAAM,SAArB,EAAgC,GAAhC,CAAJ,EAA0C;AAAE,aAAO,KAAP;AAAe;;AAE3D,UAAM,OAAO,MAAM,SAAN,CAAgB,GAAhB,CAAb;;AAEA,UAAM,SAAN,CAAgB,IAAhB,CAAqB,GAArB;AACA,WAAO,SAAP,CAAiB,IAAjB,CAAsB,GAAtB;;AAEA;AACA;AACA,QAAI,QAAQ,MAAM,QAAlB,EAA4B;AAC1B,aAAO,GAAP,CAAW,GAAX,EAAgB,QAAhB,EAA0B,MAAM,cAAhC;AACD;;AAED,YAAQ,IAAR,CAAa,cAAb,EAA6B,EAAE,QAAF,EAAO,QAAP,EAA7B;AACD,GA1BW;;AA4BZ,kBAAgB,wBAAU,GAAV,EAAe,GAAf,EAAoB;AAClC,QAAM,QAAQ,MAAM,OAAN,CAAc,MAAM,SAApB,EAA+B,GAA/B,CAAd;;AAEA,UAAM,OAAO,MAAM,SAAN,CAAgB,GAAhB,CAAb;;AAEA,WAAO,MAAP,CAAc,GAAd,EAAmB,QAAnB,EAA6B,MAAM,cAAnC;;AAEA,UAAM,SAAN,CAAgB,MAAhB,CAAuB,KAAvB,EAA8B,CAA9B;AACA,WAAO,SAAP,CAAiB,MAAjB,CAAwB,KAAxB,EAA+B,CAA/B;;AAEA,YAAQ,IAAR,CAAa,iBAAb,EAAgC,EAAE,QAAF,EAAO,QAAP,EAAhC;AACD,GAvCW;;AAyCZ,kBAAgB,0BAAY;AAC1B,UAAM,cAAN,CAAqB,KAAK,QAA1B,EAAoC,IAApC;AACD;AA3CW,CAAd;;AA8CA,OAAO,OAAP,GAAiB,KAAjB;;;;;;;eClDoB,QAAQ,OAAR,C;IAAZ,O,YAAA,O;;IAEF,O;AACJ,qBAAe;AAAA;;AACb,SAAK,SAAL,GAAiB;AACf;AADe,KAAjB;AAGD;;oBAED,E,eAAI,I,EAAM,Q,EAAU;AAClB,QAAI,CAAC,KAAK,SAAL,CAAe,IAAf,CAAL,EAA2B;AACzB,WAAK,SAAL,CAAe,IAAf,IAAuB,CAAC,QAAD,CAAvB;AACA;AACD;;AAED,SAAK,SAAL,CAAe,IAAf,EAAqB,IAArB,CAA0B,QAA1B;AACD,G;;oBAED,G,gBAAK,I,EAAM,Q,EAAU;AACnB,QAAI,CAAC,KAAK,SAAL,CAAe,IAAf,CAAL,EAA2B;AAAE;AAAS;;AAEtC,QAAM,QAAQ,QAAQ,KAAK,SAAL,CAAe,IAAf,CAAR,EAA8B,QAA9B,CAAd;;AAEA,QAAI,UAAU,CAAC,CAAf,EAAkB;AAChB,WAAK,SAAL,CAAe,IAAf,EAAqB,MAArB,CAA4B,KAA5B,EAAmC,CAAnC;AACD;AACF,G;;oBAED,I,iBAAM,I,EAAM,G,EAAK;AACf,QAAM,kBAAkB,KAAK,SAAL,CAAe,IAAf,CAAxB;;AAEA,QAAI,CAAC,eAAL,EAAsB;AAAE;AAAS;;AAEjC,SAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,gBAAgB,MAApC,EAA4C,GAA5C,EAAiD;AAC/C,UAAI,gBAAgB,CAAhB,EAAmB,GAAnB,EAAwB,IAAxB,MAAkC,KAAtC,EAA6C;AAC3C;AACD;AACF;AACF,G;;;;;AAGH,QAAQ,GAAR,GAAc,YAAY;AACxB,SAAO,IAAI,OAAJ,EAAP;AACD,CAFD;;AAIA,OAAO,OAAP,GAAiB,OAAjB;;;;;AC7CA,SAAS,OAAT,CAAkB,KAAlB,EAAyB,MAAzB,EAAiC;AAC/B,OAAK,IAAI,IAAI,CAAR,EAAW,MAAM,MAAM,MAA5B,EAAoC,IAAI,GAAxC,EAA6C,GAA7C,EAAkD;AAChD,QAAI,MAAM,CAAN,MAAa,MAAjB,EAAyB;AACvB,aAAO,CAAP;AACD;AACF;;AAED,SAAO,CAAC,CAAR;AACD;;AAED,SAAS,QAAT,CAAmB,KAAnB,EAA0B,MAA1B,EAAkC;AAChC,SAAO,QAAQ,KAAR,EAAe,MAAf,MAA2B,CAAC,CAAnC;AACD;;AAED,SAAS,KAAT,CAAgB,MAAhB,EAAwB,MAAxB,EAAgC;AAC9B,OAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,OAAO,MAA3B,EAAmC,GAAnC,EAAwC;AACtC,WAAO,IAAP,CAAY,OAAO,CAAP,CAAZ;AACD;;AAED,SAAO,MAAP;AACD;;AAED,SAAS,MAAT,CAAiB,KAAjB,EAAwB,IAAxB,EAA8B;AAC5B,MAAM,SAAS,EAAf;;AAEA,OAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,MAAM,MAA1B,EAAkC,GAAlC,EAAuC;AACrC,QAAI,KAAK,MAAM,CAAN,CAAL,CAAJ,EAAoB;AAClB,aAAO,IAAP,CAAY,MAAM,CAAN,CAAZ;AACD;AACF;;AAED,SAAO,MAAP;AACD;;AAED,OAAO,OAAP,GAAiB;AACf,kBADe;AAEf,oBAFe;AAGf,cAHe;AAIf;AAJe,CAAjB;;;;;eClCmB,QAAQ,UAAR,C;IAAX,M,YAAA,M;;AACR,IAAM,KAAS,QAAQ,MAAR,CAAf;AACA,IAAM,aAAa,QAAQ,cAAR,CAAnB;;AAEA,IAAM,UAAU,WAAW,OAA3B;AACA,IAAM,YAAa,OAAO,SAA1B;;AAEA,IAAM,UAAU;AACd;AACA,iBAAe,CAAC,EAAG,kBAAkB,MAAnB,IAA8B,GAAG,QAAH,CAAY,OAAO,aAAnB,KAC1B,WAAW,QAAX,YAA+B,OAAO,aAD5C,CAFF;;AAKd;AACA,wBAAsB,CAAC,CAAC,WAAW,YANrB;;AAQd,SAAQ,iBAAiB,MAAlB,IAA6B,EAAE,sBAAsB,MAAxB,CARtB;;AAUd;AACA,iBAAgB,UAAU,OAAV,KAAsB,OAAtB,IACT,QAAQ,aADC,IAET,UAAU,SAAV,CAAoB,KAApB,CAA0B,QAA1B,CAbO;;AAed;AACA,UAAS,iBAAiB,IAAjB,CAAsB,UAAU,QAAhC,KACG,YAAY,IAAZ,CAAiB,UAAU,UAA3B,CAjBE;;AAmBd,gBAAc,aAAa,IAAb,CAAkB,UAAU,SAA5B,CAnBA;;AAqBd;AACA,2BAAyB,aAAa,QAAQ,SAArB,GACrB,SADqB,GACV,2BAA2B,QAAQ,SAAnC,GACX,uBADW,GACc,wBAAwB,QAAQ,SAAhC,GACzB,oBADyB,GACH,sBAAsB,QAAQ,SAA9B,GACtB,kBADsB,GACF,mBA1BV;;AA4Bd,8BAA4B,KA5Bd;;AA8Bd,eAAc,WAAW,YAAX,GACT,WAAW,YAAX,KAA4B,OAAO,cAAnC,GACC;AACA,QAAQ,aADR;AAEA,UAAQ,eAFR;AAGA,UAAQ,WAHR;AAIA,SAAQ,UAJR;AAKA,UAAQ,eALR;AAMA,YAAQ;AANR,GADD,GASC;AACA,QAAQ,WADR;AAEA,UAAQ,aAFR;AAGA,UAAQ,aAHR;AAIA,SAAQ,YAJR;AAKA,UAAQ,aALR;AAMA,YAAQ;AANR,GAVQ,GAkBV,IAhDU;;AAkDd;AACA,cAAY,kBAAkB,WAAW,QAA7B,GAAuC,YAAvC,GAAqD;;AAnDnD,CAAhB;;AAuDA,QAAQ,0BAAR,GAAqC,CAAC,GAAG,QAAH,CAAY,QAAQ,SAAR,CAAkB,QAAQ,uBAA1B,CAAZ,CAAtC;;AAEA,OAAO,OAAP,GAAiB,OAAjB;;;;;AChEA,IAAM,aAAa,EAAnB;AACA,IAAM,MAAM,QAAQ,UAAR,EAAoB,MAAhC;;AAEA,SAAS,KAAT,GAAkB,CAAE;;AAEpB,WAAW,QAAX,GAAgC,IAAI,QAApC;AACA,WAAW,gBAAX,GAAgC,IAAI,gBAAJ,IAA0B,KAA1D;AACA,WAAW,UAAX,GAAgC,IAAI,UAAJ,IAA0B,KAA1D;AACA,WAAW,aAAX,GAAgC,IAAI,aAAJ,IAA0B,KAA1D;AACA,WAAW,kBAAX,GAAgC,IAAI,kBAAJ,IAA0B,KAA1D;AACA,WAAW,OAAX,GAAgC,IAAI,OAAJ,IAA0B,KAA1D;AACA,WAAW,WAAX,GAAgC,IAAI,WAAJ,IAA0B,WAAW,OAArE;;AAEA,WAAW,KAAX,GAA0B,IAAI,KAA9B;AACA,WAAW,KAAX,GAA0B,IAAI,KAAJ,IAAa,KAAvC;AACA,WAAW,YAAX,GAA2B,IAAI,YAAJ,IAAoB,IAAI,cAAnD;;AAEA,OAAO,OAAP,GAAiB,UAAjB;;;;;ACjBA,IAAM,MAAa,QAAQ,UAAR,CAAnB;AACA,IAAM,UAAa,QAAQ,WAAR,CAAnB;AACA,IAAM,KAAa,QAAQ,MAAR,CAAnB;AACA,IAAM,aAAa,QAAQ,cAAR,CAAnB;;AAEA,IAAM,WAAW;AACf,gBAAc,sBAAU,MAAV,EAAkB,KAAlB,EAAyB;AACrC,WAAO,KAAP,EAAc;AACZ,UAAI,UAAU,MAAd,EAAsB;AACpB,eAAO,IAAP;AACD;;AAED,cAAQ,MAAM,UAAd;AACD;;AAED,WAAO,KAAP;AACD,GAXc;;AAaf,WAAS,iBAAU,OAAV,EAAmB,QAAnB,EAA6B;AACpC,WAAO,GAAG,OAAH,CAAW,OAAX,CAAP,EAA4B;AAC1B,UAAI,SAAS,eAAT,CAAyB,OAAzB,EAAkC,QAAlC,CAAJ,EAAiD;AAAE,eAAO,OAAP;AAAiB;;AAEpE,gBAAU,SAAS,UAAT,CAAoB,OAApB,CAAV;AACD;;AAED,WAAO,IAAP;AACD,GArBc;;AAuBf,cAAY,oBAAU,IAAV,EAAgB;AAC1B,QAAI,SAAS,KAAK,UAAlB;;AAEA,QAAI,GAAG,OAAH,CAAW,MAAX,CAAJ,EAAwB;AACtB;AACA,aAAO,CAAC,SAAS,OAAO,IAAjB,KAA0B,GAAG,OAAH,CAAW,MAAX,CAAjC,EAAqD;AACnD;AACD;;AAED,aAAO,MAAP;AACD;;AAED,WAAO,MAAP;AACD,GApCc;;AAsCf;AACA,2BAAyB,QAAQ,0BAAR,GACrB,UAAU,OAAV,EAAmB,QAAnB,EAA6B,KAA7B,EAAoC;AACpC,YAAQ,SAAS,QAAQ,UAAR,CAAmB,gBAAnB,CAAoC,QAApC,CAAjB;;AAEA,SAAK,IAAI,IAAI,CAAR,EAAW,MAAM,MAAM,MAA5B,EAAoC,IAAI,GAAxC,EAA6C,GAA7C,EAAkD;AAChD,UAAI,MAAM,CAAN,MAAa,OAAjB,EAA0B;AACxB,eAAO,IAAP;AACD;AACF;;AAED,WAAO,KAAP;AACD,GAXsB,GAYrB,IAnDW;;AAqDf,mBAAiB,yBAAU,OAAV,EAAmB,QAAnB,EAA6B,QAA7B,EAAuC;AACtD,QAAI,QAAQ,0BAAZ,EAAwC;AACtC,aAAO,SAAS,uBAAT,CAAiC,OAAjC,EAA0C,QAA1C,EAAoD,QAApD,CAAP;AACD;;AAED;AACA,QAAI,IAAI,MAAJ,KAAe,IAAI,UAAvB,EAAmC;AACjC,iBAAW,SAAS,OAAT,CAAiB,WAAjB,EAA8B,GAA9B,CAAX;AACD;;AAED,WAAO,QAAQ,QAAQ,uBAAhB,EAAyC,QAAzC,CAAP;AACD,GAhEc;;AAkEf;AACA,yBAAuB,+BAAU,QAAV,EAAoB;AACzC,QAAI,qBAAqB,EAAzB;AACA,QAAI,kBAAkB,EAAtB;AACA,QAAI,iBAAJ;AACA,QAAI,cAAc,SAAS,CAAT,CAAlB;AACA,QAAI,QAAQ,cAAa,CAAb,GAAgB,CAAC,CAA7B;AACA,QAAI,eAAJ;AACA,QAAI,cAAJ;AACA,QAAI,UAAJ;AACA,QAAI,UAAJ;;AAEA,SAAK,IAAI,CAAT,EAAY,IAAI,SAAS,MAAzB,EAAiC,GAAjC,EAAsC;AACpC,iBAAW,SAAS,CAAT,CAAX;;AAEA;AACA,UAAI,CAAC,QAAD,IAAa,aAAa,WAA9B,EAA2C;AACzC;AACD;;AAED,UAAI,CAAC,WAAL,EAAkB;AAChB,sBAAc,QAAd;AACA,gBAAQ,CAAR;AACA;AACD;;AAED;AACA;AACA,UAAI,SAAS,UAAT,KAAwB,SAAS,aAArC,EAAoD;AAClD;AACD;AACD;AAHA,WAIK,IAAI,YAAY,UAAZ,KAA2B,SAAS,aAAxC,EAAuD;AAC1D,wBAAc,QAAd;AACA,kBAAQ,CAAR;AACA;AACD;;AAED,UAAI,CAAC,mBAAmB,MAAxB,EAAgC;AAC9B,iBAAS,WAAT;AACA,eAAO,OAAO,UAAP,IAAqB,OAAO,UAAP,KAAsB,OAAO,aAAzD,EAAwE;AACtE,6BAAmB,OAAnB,CAA2B,MAA3B;AACA,mBAAS,OAAO,UAAhB;AACD;AACF;;AAED;AACA;AACA,UAAI,uBAAuB,WAAW,WAAlC,IACG,oBAAoB,WAAW,UADlC,IAEG,EAAE,oBAAoB,WAAW,aAAjC,CAFP,EAEwD;;AAEtD,YAAI,aAAa,YAAY,UAA7B,EAAyC;AACvC;AACD;;AAED,iBAAS,SAAS,eAAlB;AACD,OATD,MAUK;AACH,iBAAS,QAAT;AACD;;AAED,wBAAkB,EAAlB;;AAEA,aAAO,OAAO,UAAP,KAAsB,OAAO,aAApC,EAAmD;AACjD,wBAAgB,OAAhB,CAAwB,MAAxB;AACA,iBAAS,OAAO,UAAhB;AACD;;AAED,UAAI,CAAJ;;AAEA;AACA,aAAO,gBAAgB,CAAhB,KAAsB,gBAAgB,CAAhB,MAAuB,mBAAmB,CAAnB,CAApD,EAA2E;AACzE;AACD;;AAED,UAAM,UAAU,CACd,gBAAgB,IAAI,CAApB,CADc,EAEd,gBAAgB,CAAhB,CAFc,EAGd,mBAAmB,CAAnB,CAHc,CAAhB;;AAMA,cAAQ,QAAQ,CAAR,EAAW,SAAnB;;AAEA,aAAO,KAAP,EAAc;AACZ,YAAI,UAAU,QAAQ,CAAR,CAAd,EAA0B;AACxB,wBAAc,QAAd;AACA,kBAAQ,CAAR;AACA,+BAAqB,EAArB;;AAEA;AACD,SAND,MAOK,IAAI,UAAU,QAAQ,CAAR,CAAd,EAA0B;AAC7B;AACD;;AAED,gBAAQ,MAAM,eAAd;AACD;AACF;;AAED,WAAO,KAAP;AACD,GAvKc;;AAyKf,eAAa,qBAAU,OAAV,EAAmB,QAAnB,EAA6B,KAA7B,EAAoC;AAC/C,WAAO,GAAG,OAAH,CAAW,OAAX,CAAP,EAA4B;AAC1B,UAAI,SAAS,eAAT,CAAyB,OAAzB,EAAkC,QAAlC,CAAJ,EAAiD;AAC/C,eAAO,IAAP;AACD;;AAED,gBAAU,SAAS,UAAT,CAAoB,OAApB,CAAV;;AAEA,UAAI,YAAY,KAAhB,EAAuB;AACrB,eAAO,SAAS,eAAT,CAAyB,OAAzB,EAAkC,QAAlC,CAAP;AACD;AACF;;AAED,WAAO,KAAP;AACD,GAvLc;;AAyLf,oBAAkB,0BAAU,OAAV,EAAmB;AACnC,WAAQ,mBAAmB,WAAW,kBAA9B,GACJ,QAAQ,uBADJ,GAEJ,OAFJ;AAGD,GA7Lc;;AA+Lf,eAAa,qBAAU,cAAV,EAA0B;AACrC,qBAAiB,kBAAkB,IAAI,MAAvC;AACA,WAAO;AACL,SAAG,eAAe,OAAf,IAA0B,eAAe,QAAf,CAAwB,eAAxB,CAAwC,UADhE;AAEL,SAAG,eAAe,OAAf,IAA0B,eAAe,QAAf,CAAwB,eAAxB,CAAwC;AAFhE,KAAP;AAID,GArMc;;AAuMf,wBAAsB,8BAAU,OAAV,EAAmB;AACvC,QAAM,aAAc,mBAAmB,WAAW,UAA9B,GAChB,QAAQ,qBAAR,EADgB,GAEhB,QAAQ,cAAR,GAAyB,CAAzB,CAFJ;;AAIA,WAAO,cAAc;AACnB,YAAQ,WAAW,IADA;AAEnB,aAAQ,WAAW,KAFA;AAGnB,WAAQ,WAAW,GAHA;AAInB,cAAQ,WAAW,MAJA;AAKnB,aAAQ,WAAW,KAAX,IAAqB,WAAW,KAAX,GAAoB,WAAW,IALzC;AAMnB,cAAQ,WAAW,MAAX,IAAqB,WAAW,MAAX,GAAoB,WAAW;AANzC,KAArB;AAQD,GApNc;;AAsNf,kBAAgB,wBAAU,OAAV,EAAmB;AACjC,QAAM,aAAa,SAAS,oBAAT,CAA8B,OAA9B,CAAnB;;AAEA,QAAI,CAAC,QAAQ,MAAT,IAAmB,UAAvB,EAAmC;AACjC,UAAM,SAAS,SAAS,WAAT,CAAqB,IAAI,SAAJ,CAAc,OAAd,CAArB,CAAf;;AAEA,iBAAW,IAAX,IAAqB,OAAO,CAA5B;AACA,iBAAW,KAAX,IAAqB,OAAO,CAA5B;AACA,iBAAW,GAAX,IAAqB,OAAO,CAA5B;AACA,iBAAW,MAAX,IAAqB,OAAO,CAA5B;AACD;;AAED,WAAO,UAAP;AACD,GAnOc;;AAqOf,WAAS,iBAAU,OAAV,EAAmB;AAC1B,QAAM,OAAO,EAAb;;AAEA,WAAO,OAAP,EAAgB;AACd,WAAK,IAAL,CAAU,OAAV;AACA,gBAAU,SAAS,UAAT,CAAoB,OAApB,CAAV;AACD;;AAED,WAAO,IAAP;AACD,GA9Oc;;AAgPf,eAAa,4BAAS;AACpB,QAAI,CAAC,GAAG,MAAH,CAAU,KAAV,CAAL,EAAuB;AAAE,aAAO,KAAP;AAAe;;AAExC;AACA,eAAW,QAAX,CAAoB,aAApB,CAAkC,KAAlC;AACA,WAAO,IAAP;AACD;AAtPc,CAAjB;;AAyPA,OAAO,OAAP,GAAiB,QAAjB;;;;;AC9PA,IAAM,KAAO,QAAQ,MAAR,CAAb;AACA,IAAM,WAAW,QAAQ,YAAR,CAAjB;AACA,IAAM,UAAW,QAAQ,iBAAR,CAAjB;;eAE+B,QAAQ,UAAR,C;IAAvB,M,YAAA,M;IAAQ,S,YAAA,S;;gBACc,QAAQ,OAAR,C;IAAtB,O,aAAA,O;IAAS,Q,aAAA,Q;;AAEjB,IAAM,iBAAkB,iBAAiB,MAAlB,IAA6B,EAAE,sBAAsB,MAAxB,CAApD;AACA,IAAM,WAAiB,iBAAiB,aAAjB,GAAgC,kBAAvD;AACA,IAAM,cAAiB,iBAAiB,aAAjB,GAAgC,qBAAvD;AACA,IAAM,KAAiB,iBAAgB,IAAhB,GAAsB,EAA7C;;AAEA,IAAM,WAAoB,EAA1B;AACA,IAAM,UAAoB,EAA1B;AACA,IAAM,oBAAoB,EAA1B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAM,kBAAkB,EAAxB;;AAEA,IAAM,YAAY,EAAlB;;AAEA,IAAM,kBAAkB,CAAC,cAAD,IAAoB,YAAM;AAChD,MAAI,YAAY,KAAhB;;AAEA,SAAO,QAAP,CAAgB,aAAhB,CAA8B,KAA9B,EAAqC,gBAArC,CAAsD,MAAtD,EAA8D,IAA9D,EAAoE;AAClE,QAAI,OAAJ,GAAe;AAAE,kBAAY,IAAZ;AAAmB;AAD8B,GAApE;;AAIA,SAAO,SAAP;AACD,CAR0C,EAA3C;;AAUA,SAAS,GAAT,CAAc,OAAd,EAAuB,IAAvB,EAA6B,QAA7B,EAAuC,WAAvC,EAAoD;AAClD,MAAM,UAAU,WAAW,WAAX,CAAhB;AACA,MAAI,eAAe,QAAQ,QAAR,EAAkB,OAAlB,CAAnB;AACA,MAAI,SAAS,QAAQ,YAAR,CAAb;;AAEA,MAAI,CAAC,MAAL,EAAa;AACX,aAAS;AACP,cAAQ,EADD;AAEP,iBAAW;AAFJ,KAAT;;AAKA,mBAAe,SAAS,IAAT,CAAc,OAAd,IAAyB,CAAxC;AACA,YAAQ,IAAR,CAAa,MAAb;;AAEA,sBAAkB,IAAlB,CAAuB,iBACnB;AACA,gBAAU,EADV;AAEA,eAAU,EAFV;AAGA,gBAAU;AAHV,KADmB,GAMnB,IANJ;AAOD;;AAED,MAAI,CAAC,OAAO,MAAP,CAAc,IAAd,CAAL,EAA0B;AACxB,WAAO,MAAP,CAAc,IAAd,IAAsB,EAAtB;AACA,WAAO,SAAP;AACD;;AAED,MAAI,CAAC,SAAS,OAAO,MAAP,CAAc,IAAd,CAAT,EAA8B,QAA9B,CAAL,EAA8C;AAC5C,QAAI,YAAJ;;AAEA,QAAI,cAAJ,EAAoB;AAAA,kCACsB,kBAAkB,YAAlB,CADtB;AAAA,UACV,QADU,yBACV,QADU;AAAA,UACA,OADA,yBACA,OADA;AAAA,UACS,QADT,yBACS,QADT;;AAElB,UAAM,gBAAgB,QAAQ,QAAR,EAAkB,QAAlB,CAAtB;;AAEA,UAAM,kBAAkB,QAAQ,aAAR,KAA0B,UAAU,KAAV,EAAiB;AACjE,YAAI,CAAC,MAAM,2BAAX,EAAwC;AACtC,gBAAM,MAAN,GAAe,MAAM,UAArB;AACA,gBAAM,aAAN,GAAsB,OAAtB;;AAEA,gBAAM,cAAN,GAAiC,MAAM,cAAN,IAAkC,UAAnE;AACA,gBAAM,eAAN,GAAiC,MAAM,eAAN,IAAkC,QAAnE;AACA,gBAAM,wBAAN,GAAiC,MAAM,wBAAN,IAAkC,WAAnE;;AAEA,cAAI,cAAc,IAAd,CAAmB,MAAM,IAAzB,CAAJ,EAAoC;AAClC,kBAAM,KAAN,GAAc,MAAM,OAAN,GAAgB,UAAU,OAAV,EAAmB,QAAnB,CAA4B,eAA5B,CAA4C,UAA1E;AACA,kBAAM,KAAN,GAAc,MAAM,OAAN,GAAgB,UAAU,OAAV,EAAmB,QAAnB,CAA4B,eAA5B,CAA4C,SAA1E;AACD;;AAED,mBAAS,KAAT;AACD;AACF,OAhBD;;AAkBA,YAAM,QAAQ,QAAR,EAAkB,KAAK,IAAvB,EAA6B,eAA7B,EAA8C,CAAC,CAAC,QAAQ,OAAxD,CAAN;;AAEA,UAAI,kBAAkB,CAAC,CAAvB,EAA0B;AACxB,iBAAS,IAAT,CAAc,QAAd;AACA,gBAAQ,IAAR,CAAa,eAAb;AACA,iBAAS,IAAT,CAAc,CAAd;AACD,OAJD,MAKK;AACH,iBAAS,aAAT;AACD;AACF,KAhCD,MAiCK;AACH,YAAM,QAAQ,QAAR,EAAkB,IAAlB,EAAwB,QAAxB,EAAkC,kBAAiB,OAAjB,GAA2B,CAAC,CAAC,QAAQ,OAAvE,CAAN;AACD;AACD,WAAO,MAAP,CAAc,IAAd,EAAoB,IAApB,CAAyB,QAAzB;;AAEA,WAAO,GAAP;AACD;AACF;;AAED,SAAS,MAAT,CAAiB,OAAjB,EAA0B,IAA1B,EAAgC,QAAhC,EAA0C,WAA1C,EAAuD;AACrD,MAAM,UAAU,WAAW,WAAX,CAAhB;AACA,MAAM,eAAe,QAAQ,QAAR,EAAkB,OAAlB,CAArB;AACA,MAAM,SAAS,QAAQ,YAAR,CAAf;;AAEA,MAAI,CAAC,MAAD,IAAW,CAAC,OAAO,MAAvB,EAA+B;AAC7B;AACD;;AAED,MAAI,kBAAkB,QAAtB;AACA,MAAI,kBAAJ;AACA,MAAI,sBAAJ;;AAEA,MAAI,cAAJ,EAAoB;AAClB,gBAAY,kBAAkB,YAAlB,CAAZ;AACA,oBAAgB,QAAQ,UAAU,QAAlB,EAA4B,QAA5B,CAAhB;AACA,sBAAkB,UAAU,OAAV,CAAkB,aAAlB,CAAlB;AACD;;AAED,MAAI,SAAS,KAAb,EAAoB;AAClB,SAAK,IAAL,IAAa,OAAO,MAApB,EAA4B;AAC1B,UAAI,OAAO,MAAP,CAAc,cAAd,CAA6B,IAA7B,CAAJ,EAAwC;AACtC,eAAO,OAAP,EAAgB,IAAhB,EAAsB,KAAtB;AACD;AACF;AACD;AACD;;AAED,MAAI,OAAO,MAAP,CAAc,IAAd,CAAJ,EAAyB;AACvB,QAAM,MAAM,OAAO,MAAP,CAAc,IAAd,EAAoB,MAAhC;;AAEA,QAAI,aAAa,KAAjB,EAAwB;AACtB,WAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,GAApB,EAAyB,GAAzB,EAA8B;AAC5B,eAAO,OAAP,EAAgB,IAAhB,EAAsB,OAAO,MAAP,CAAc,IAAd,EAAoB,CAApB,CAAtB,EAA8C,OAA9C;AACD;AACD;AACD,KALD,MAMK;AACH,WAAK,IAAI,KAAI,CAAb,EAAgB,KAAI,GAApB,EAAyB,IAAzB,EAA8B;AAC5B,YAAI,OAAO,MAAP,CAAc,IAAd,EAAoB,EAApB,MAA2B,QAA/B,EAAyC;AACvC,kBAAQ,WAAR,EAAqB,KAAK,IAA1B,EAAgC,eAAhC,EAAiD,kBAAiB,OAAjB,GAA2B,CAAC,CAAC,QAAQ,OAAtF;AACA,iBAAO,MAAP,CAAc,IAAd,EAAoB,MAApB,CAA2B,EAA3B,EAA8B,CAA9B;;AAEA,cAAI,kBAAkB,SAAtB,EAAiC;AAC/B,sBAAU,QAAV,CAAmB,aAAnB;AACA,gBAAI,UAAU,QAAV,CAAmB,aAAnB,MAAsC,CAA1C,EAA6C;AAC3C,wBAAU,QAAV,CAAmB,MAAnB,CAA0B,aAA1B,EAAyC,CAAzC;AACA,wBAAU,OAAV,CAAkB,MAAlB,CAAyB,aAAzB,EAAwC,CAAxC;AACA,wBAAU,QAAV,CAAmB,MAAnB,CAA0B,aAA1B,EAAyC,CAAzC;AACD;AACF;;AAED;AACD;AACF;AACF;;AAED,QAAI,OAAO,MAAP,CAAc,IAAd,KAAuB,OAAO,MAAP,CAAc,IAAd,EAAoB,MAApB,KAA+B,CAA1D,EAA6D;AAC3D,aAAO,MAAP,CAAc,IAAd,IAAsB,IAAtB;AACA,aAAO,SAAP;AACD;AACF;;AAED,MAAI,CAAC,OAAO,SAAZ,EAAuB;AACrB,YAAQ,MAAR,CAAe,YAAf,EAA6B,CAA7B;AACA,aAAS,MAAT,CAAgB,YAAhB,EAA8B,CAA9B;AACA,sBAAkB,MAAlB,CAAyB,YAAzB,EAAuC,CAAvC;AACD;AACF;;AAED,SAAS,WAAT,CAAsB,QAAtB,EAAgC,OAAhC,EAAyC,IAAzC,EAA+C,QAA/C,EAAyD,WAAzD,EAAsE;AACpE,MAAM,UAAU,WAAW,WAAX,CAAhB;AACA,MAAI,CAAC,gBAAgB,IAAhB,CAAL,EAA4B;AAC1B,oBAAgB,IAAhB,IAAwB;AACtB,iBAAW,EADW;AAEtB,gBAAW,EAFW;AAGtB,iBAAW;AAHW,KAAxB;;AAMA;AACA,SAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,UAAU,MAA9B,EAAsC,GAAtC,EAA2C;AACzC,UAAI,UAAU,CAAV,CAAJ,EAAkB,IAAlB,EAAwB,gBAAxB;AACA,UAAI,UAAU,CAAV,CAAJ,EAAkB,IAAlB,EAAwB,kBAAxB,EAA4C,IAA5C;AACD;AACF;;AAED,MAAM,YAAY,gBAAgB,IAAhB,CAAlB;AACA,MAAI,cAAJ;;AAEA,OAAK,QAAQ,UAAU,SAAV,CAAoB,MAApB,GAA6B,CAA1C,EAA6C,SAAS,CAAtD,EAAyD,OAAzD,EAAkE;AAChE,QAAI,UAAU,SAAV,CAAoB,KAApB,MAA+B,QAA/B,IACG,UAAU,QAAV,CAAmB,KAAnB,MAA8B,OADrC,EAC8C;AAC5C;AACD;AACF;;AAED,MAAI,UAAU,CAAC,CAAf,EAAkB;AAChB,YAAQ,UAAU,SAAV,CAAoB,MAA5B;;AAEA,cAAU,SAAV,CAAoB,IAApB,CAAyB,QAAzB;AACA,cAAU,QAAV,CAAoB,IAApB,CAAyB,OAAzB;AACA,cAAU,SAAV,CAAoB,IAApB,CAAyB,EAAzB;AACD;;AAED;AACA,YAAU,SAAV,CAAoB,KAApB,EAA2B,IAA3B,CAAgC,CAAC,QAAD,EAAW,CAAC,CAAC,QAAQ,OAArB,EAA8B,QAAQ,OAAtC,CAAhC;AACD;;AAED,SAAS,cAAT,CAAyB,QAAzB,EAAmC,OAAnC,EAA4C,IAA5C,EAAkD,QAAlD,EAA4D,WAA5D,EAAyE;AACvE,MAAM,UAAU,WAAW,WAAX,CAAhB;AACA,MAAM,YAAY,gBAAgB,IAAhB,CAAlB;AACA,MAAI,aAAa,KAAjB;AACA,MAAI,cAAJ;;AAEA,MAAI,CAAC,SAAL,EAAgB;AAAE;AAAS;;AAE3B;AACA,OAAK,QAAQ,UAAU,SAAV,CAAoB,MAApB,GAA6B,CAA1C,EAA6C,SAAS,CAAtD,EAAyD,OAAzD,EAAkE;AAChE;AACA,QAAI,UAAU,SAAV,CAAoB,KAApB,MAA+B,QAA/B,IACG,UAAU,QAAV,CAAmB,KAAnB,MAA8B,OADrC,EAC8C;;AAE5C,UAAM,YAAY,UAAU,SAAV,CAAoB,KAApB,CAAlB;;AAEA;AACA,WAAK,IAAI,IAAI,UAAU,MAAV,GAAmB,CAAhC,EAAmC,KAAK,CAAxC,EAA2C,GAA3C,EAAgD;AAAA,2BACf,UAAU,CAAV,CADe;AAAA,YACvC,EADuC;AAAA,YACnC,OADmC;AAAA,YAC1B,OAD0B;;AAG9C;;AACA,YAAI,OAAO,QAAP,IAAmB,YAAY,CAAC,CAAC,QAAQ,OAAzC,IAAoD,YAAY,QAAQ,OAA5E,EAAqF;AACnF;AACA,oBAAU,MAAV,CAAiB,CAAjB,EAAoB,CAApB;;AAEA;AACA;AACA,cAAI,CAAC,UAAU,MAAf,EAAuB;AACrB,sBAAU,SAAV,CAAoB,MAApB,CAA2B,KAA3B,EAAkC,CAAlC;AACA,sBAAU,QAAV,CAAoB,MAApB,CAA2B,KAA3B,EAAkC,CAAlC;AACA,sBAAU,SAAV,CAAoB,MAApB,CAA2B,KAA3B,EAAkC,CAAlC;;AAEA;AACA,mBAAO,OAAP,EAAgB,IAAhB,EAAsB,gBAAtB;AACA,mBAAO,OAAP,EAAgB,IAAhB,EAAsB,kBAAtB,EAA0C,IAA1C;;AAEA;AACA,gBAAI,CAAC,UAAU,SAAV,CAAoB,MAAzB,EAAiC;AAC/B,8BAAgB,IAAhB,IAAwB,IAAxB;AACD;AACF;;AAED;AACA,uBAAa,IAAb;AACA;AACD;AACF;;AAED,UAAI,UAAJ,EAAgB;AAAE;AAAQ;AAC3B;AACF;AACF;;AAED;AACA;AACA,SAAS,gBAAT,CAA2B,KAA3B,EAAkC,WAAlC,EAA+C;AAC7C,MAAM,UAAU,WAAW,WAAX,CAAhB;AACA,MAAM,YAAY,EAAlB;AACA,MAAM,YAAY,gBAAgB,MAAM,IAAtB,CAAlB;AACA,MAAM,cAAe,SAAS,gBAAT,CAA0B,MAAM,IAAN,GAC3C,MAAM,IAAN,CAAW,CAAX,CAD2C,GAE3C,MAAM,MAFW,CAArB;AAGA,MAAI,UAAU,WAAd;;AAEA;AACA,UAAQ,SAAR,EAAmB,KAAnB;;AAEA,YAAU,aAAV,GAA0B,KAA1B;AACA,YAAU,cAAV,GAA2B,sBAA3B;;AAEA;AACA,SAAO,GAAG,OAAH,CAAW,OAAX,CAAP,EAA4B;AAC1B,SAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,UAAU,SAAV,CAAoB,MAAxC,EAAgD,GAAhD,EAAqD;AACnD,UAAM,WAAW,UAAU,SAAV,CAAoB,CAApB,CAAjB;AACA,UAAM,UAAU,UAAU,QAAV,CAAmB,CAAnB,CAAhB;;AAEA,UAAI,SAAS,eAAT,CAAyB,OAAzB,EAAkC,QAAlC,KACG,SAAS,YAAT,CAAsB,OAAtB,EAA+B,WAA/B,CADH,IAEG,SAAS,YAAT,CAAsB,OAAtB,EAA+B,OAA/B,CAFP,EAEgD;;AAE9C,YAAM,YAAY,UAAU,SAAV,CAAoB,CAApB,CAAlB;;AAEA,kBAAU,aAAV,GAA0B,OAA1B;;AAEA,aAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,UAAU,MAA9B,EAAsC,GAAtC,EAA2C;AAAA,6BACV,UAAU,CAAV,CADU;AAAA,cAClC,EADkC;AAAA,cAC9B,OAD8B;AAAA,cACrB,OADqB;;;AAGzC,cAAI,YAAY,CAAC,CAAC,QAAQ,OAAtB,IAAiC,YAAY,QAAQ,OAAzD,EAAkE;AAChE,eAAG,SAAH;AACD;AACF;AACF;AACF;;AAED,cAAU,SAAS,UAAT,CAAoB,OAApB,CAAV;AACD;AACF;;AAED,SAAS,kBAAT,CAA6B,KAA7B,EAAoC;AAClC,SAAO,iBAAiB,IAAjB,CAAsB,IAAtB,EAA4B,KAA5B,EAAmC,IAAnC,CAAP;AACD;;AAED,SAAS,UAAT,GAAuB;AACrB,OAAK,WAAL,GAAmB,KAAnB;AACD;;AAED,SAAS,sBAAT,GAAmC;AACjC,OAAK,aAAL,CAAmB,cAAnB;AACD;;AAED,SAAS,QAAT,GAAqB;AACnB,OAAK,YAAL,GAAoB,IAApB;AACD;;AAED,SAAS,WAAT,GAAwB;AACtB,OAAK,YAAL,GAAoB,IAApB;AACA,OAAK,2BAAL,GAAmC,IAAnC;AACD;;AAED,SAAS,UAAT,CAAqB,KAArB,EAA4B;AAC1B,SAAO,GAAG,MAAH,CAAU,KAAV,IAAkB,KAAlB,GAA0B,EAAE,SAAS,KAAX,EAAjC;AACD;;AAED,OAAO,OAAP,GAAiB;AACf,UADe;AAEf,gBAFe;;AAIf,0BAJe;AAKf,gCALe;;AAOf,oCAPe;AAQf,wCARe;AASf,kCATe;AAUf,sBAVe;;AAYf,gCAZe;AAaf,kCAbe;;AAef,aAAW,QAfI;AAgBf,YAAU,OAhBK;AAiBf,sBAAoB;AAjBL,CAAjB;;;;;ACrVA,OAAO,OAAP,GAAiB,SAAS,MAAT,CAAiB,IAAjB,EAAuB,MAAvB,EAA+B;AAC9C,OAAK,IAAM,IAAX,IAAmB,MAAnB,EAA2B;AACzB,SAAK,IAAL,IAAa,OAAO,IAAP,CAAb;AACD;AACD,SAAO,IAAP;AACD,CALD;;;;;eCGI,QAAQ,QAAR,C;IAFF,e,YAAA,e;IACA,Q,YAAA,Q;;AAGF,OAAO,OAAP,GAAiB,UAAU,MAAV,EAAkB,OAAlB,EAA2B,MAA3B,EAAmC;AAClD,MAAM,gBAAgB,OAAO,OAAP,CAAe,MAAf,CAAtB;AACA,MAAM,eAAe,iBAAiB,cAAc,MAApD;AACA,MAAM,SAAS,gBAAgB,OAAO,OAAP,CAAe,MAA9C;;AAEA,MAAM,aAAa,gBAAgB,MAAhB,EAAwB,MAAxB,EAAgC,OAAhC,EAAyC,CAAC,UAAU,OAAX,CAAzC,CAAnB;;AAEA,SAAO,SAAS,UAAT,KAAwB,EAAE,GAAG,CAAL,EAAQ,GAAG,CAAX,EAA/B;AACD,CARD;;;;;ACLA,OAAO,OAAP,GAAiB,UAAC,CAAD,EAAI,CAAJ;AAAA,SAAW,KAAK,IAAL,CAAU,IAAI,CAAJ,GAAQ,IAAI,CAAtB,CAAX;AAAA,CAAjB;;;;;ACAA,IAAM,SAAS,QAAQ,UAAR,CAAf;AACA,IAAM,MAAS,QAAQ,UAAR,CAAf;;AAEA,IAAM,QAAQ;AACZ,YAAU,kBAAU,MAAV,EAAkB,OAAlB,EAA2B;AACnC,QAAI,SAAS,KAAb;;AAEA,WAAO,YAAY;AACjB,UAAI,CAAC,MAAL,EAAa;AACX,YAAI,MAAJ,CAAW,OAAX,CAAmB,IAAnB,CAAwB,OAAxB;AACA,iBAAS,IAAT;AACD;;AAED,aAAO,OAAO,KAAP,CAAa,IAAb,EAAmB,SAAnB,CAAP;AACD,KAPD;AAQD,GAZW;;AAcZ;AACA,oBAAkB,0BAAU,CAAV,EAAa,EAAb,EAAiB,EAAjB,EAAqB,EAArB,EAAyB;AACzC,QAAM,KAAK,IAAI,CAAf;AACA,WAAO,KAAK,EAAL,GAAU,EAAV,GAAe,IAAI,EAAJ,GAAS,CAAT,GAAa,EAA5B,GAAiC,IAAI,CAAJ,GAAQ,EAAhD;AACD,GAlBW;;AAoBZ,0BAAwB,gCAAU,MAAV,EAAkB,MAAlB,EAA0B,GAA1B,EAA+B,GAA/B,EAAoC,IAApC,EAA0C,IAA1C,EAAgD,QAAhD,EAA0D;AAChF,WAAO;AACL,SAAI,MAAM,gBAAN,CAAuB,QAAvB,EAAiC,MAAjC,EAAyC,GAAzC,EAA8C,IAA9C,CADC;AAEL,SAAI,MAAM,gBAAN,CAAuB,QAAvB,EAAiC,MAAjC,EAAyC,GAAzC,EAA8C,IAA9C;AAFC,KAAP;AAID,GAzBW;;AA2BZ;AACA,eAAa,qBAAU,CAAV,EAAa,CAAb,EAAgB,CAAhB,EAAmB,CAAnB,EAAsB;AACjC,SAAK,CAAL;AACA,WAAO,CAAC,CAAD,GAAK,CAAL,IAAQ,IAAE,CAAV,IAAe,CAAtB;AACD,GA/BW;;AAiCZ,cAAY,oBAAU,IAAV,EAAgB,GAAhB,EAAqB;AAC/B,SAAK,IAAL,GAAa,IAAI,IAAjB;AACA,SAAK,IAAL,GAAa,IAAI,IAAjB;AACA,SAAK,KAAL,GAAa,IAAI,KAAjB;;AAEA,WAAO,IAAP;AACD,GAvCW;;AAyCZ,MAAa,QAAQ,MAAR,CAzCD;AA0CZ,UAAa,MA1CD;AA2CZ,SAAa,QAAQ,SAAR,CA3CD;AA4CZ,eAAa,QAAQ,eAAR;AA5CD,CAAd;;AA+CA,OAAO,KAAP,EAAc,QAAQ,OAAR,CAAd;AACA,OAAO,KAAP,EAAc,QAAQ,YAAR,CAAd;AACA,OAAO,KAAP,EAAc,QAAQ,gBAAR,CAAd;AACA,OAAO,KAAP,EAAc,QAAQ,QAAR,CAAd;;AAEA,OAAO,OAAP,GAAiB,KAAjB;;;;;ACvDA,IAAM,QAAU,QAAQ,UAAR,CAAhB;AACA,IAAM,QAAU,QAAQ,SAAR,CAAhB;;AAEA,IAAM,SAAS;AACb,eAAa,CAAE,kBAAF,EAAsB,YAAtB,EAAoC,YAApC,EAAkD,MAAlD,CADA;;AAGb,UAAQ,gBAAU,OAAV,EAAmB,SAAnB,EAA8B,WAA9B,EAA2C;AACjD,QAAM,cAAc,MAAM,cAAN,CAAqB,OAArB,CAApB;AACA,QAAM,YAAY,MAAM,YAAN,CAAmB,OAAnB,CAAlB;AACA,QAAM,UAAU,EAAE,gBAAF,EAAW,oBAAX,EAAsB,wBAAtB,EAAmC,oBAAnC,EAA8C,wBAA9C,EAAhB;;AAEA,yBAAqB,OAAO,WAA5B,kHAAyC;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAA9B,MAA8B;;AACvC,UAAM,cAAc,OAAO,MAAP,EAAe,OAAf,CAApB;;AAEA,UAAI,WAAJ,EAAiB;AACf,eAAO,WAAP;AACD;AACF;AACF,GAfY;;AAiBb;AACA,oBAAkB,iCAAmD;AAAA,QAAvC,WAAuC,SAAvC,WAAuC;AAAA,QAA1B,SAA0B,SAA1B,SAA0B;AAAA,QAAf,WAAe,SAAf,WAAe;;AACnE,QAAI,CAAC,cAAc,IAAd,CAAmB,SAAnB,CAAL,EAAoC;AAClC,aAAO,IAAP;AACD;;AAED,0BAA0B,MAAM,YAAhC,yHAA8C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAAnC,WAAmC;;AAC5C,UAAI,UAAU,WAAd;;AAEA,UAAI,YAAY,UAAZ,IAA0B,YAAY,UAAZ,CAAuB,WAAjD,IACI,YAAY,WAAZ,KAA4B,WADpC,EACkD;AAChD,eAAO,OAAP,EAAgB;AACd;AACA,cAAI,YAAY,YAAY,OAA5B,EAAqC;AACnC,mBAAO,WAAP;AACD;AACD,oBAAU,MAAM,UAAN,CAAiB,OAAjB,CAAV;AACD;AACF;AACF;;AAED,WAAO,IAAP;AACD,GAvCY;;AAyCb;AACA,cAAY,2BAAiD;AAAA,QAArC,SAAqC,SAArC,SAAqC;AAAA,QAA1B,WAA0B,SAA1B,WAA0B;AAAA,QAAb,SAAa,SAAb,SAAa;;AAC3D,QAAI,gBAAgB,OAAhB,IAA2B,gBAAgB,KAA/C,EAAsD;AACpD,aAAO,IAAP;AACD;;AAED,QAAI,uBAAJ;;AAEA,0BAA0B,MAAM,YAAhC,yHAA8C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAAnC,WAAmC;;AAC5C,UAAI,YAAY,WAAZ,KAA4B,WAAhC,EAA6C;AAC3C;AACA,YAAI,YAAY,UAAZ,IAA0B,CAAC,MAAM,QAAN,CAAe,YAAY,UAA3B,EAAuC,SAAvC,CAA/B,EAAkF;AAAE;AAAW;;AAE/F;AACA,YAAI,YAAY,WAAZ,EAAJ,EAA+B;AAC7B,iBAAO,WAAP;AACD;AACD;AAHA,aAIK,IAAI,CAAC,cAAL,EAAqB;AACxB,6BAAiB,WAAjB;AACD;AACF;AACF;;AAED;AACA;AACA,QAAI,cAAJ,EAAoB;AAClB,aAAO,cAAP;AACD;;AAED;AACA;AACA;AACA,0BAA0B,MAAM,YAAhC,yHAA8C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAAnC,YAAmC;;AAC5C,UAAI,aAAY,WAAZ,KAA4B,WAA5B,IAA2C,EAAE,QAAQ,IAAR,CAAa,SAAb,KAA2B,aAAY,UAAzC,CAA/C,EAAqG;AACnG,eAAO,YAAP;AACD;AACF;;AAED,WAAO,IAAP;AACD,GAjFY;;AAmFb;AACA,cAAY,2BAAyB;AAAA,QAAb,SAAa,SAAb,SAAa;;AACnC,0BAA0B,MAAM,YAAhC,yHAA8C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAAnC,WAAmC;;AAC5C,UAAI,MAAM,QAAN,CAAe,YAAY,UAA3B,EAAuC,SAAvC,CAAJ,EAAuD;AACrD,eAAO,WAAP;AACD;AACF;AACF,GA1FY;;AA4Fb;AACA,QAAM,qBAA2B;AAAA,QAAf,WAAe,SAAf,WAAe;;AAC/B,0BAA0B,MAAM,YAAhC,yHAA8C;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAAnC,WAAmC;;AAC5C;AACA,UAAI,YAAY,UAAZ,CAAuB,MAAvB,KAAkC,CAAtC,EAAyC;AACvC,YAAM,SAAS,YAAY,MAA3B;AACA;AACA;AACA,YAAI,UAAU,CAAC,OAAO,OAAP,CAAe,OAAf,CAAuB,OAAtC,EAA+C;AAC7C;AACD;AACF;AACD;AARA,WASK,IAAI,YAAY,UAAZ,CAAuB,MAAvB,IAAiC,CAArC,EAAwC;AAC3C;AACD;;AAED,UAAI,CAAC,YAAY,WAAZ,EAAD,IAA+B,gBAAgB,YAAY,WAA/D,EAA6E;AAC3E,eAAO,WAAP;AACD;AACF;;AAED,WAAO,IAAP;AACD;AAnHY,CAAf;;AAsHA,OAAO,OAAP,GAAiB,MAAjB;;;;;;;ACzHA,IAAM,MAAa,QAAQ,UAAR,CAAnB;AACA,IAAM,WAAa,QAAQ,YAAR,CAAnB;;AAEA,IAAM,KAAK;AACT,SAAU,iBAAM,CAAE,CADT;;AAGT,UAAU;AAAA,WAAS,UAAU,IAAI,MAAd,IAAwB,SAAS,KAAT,CAAjC;AAAA,GAHD;;AAKT,WAAU;AAAA,WAAS,GAAG,MAAH,CAAU,KAAV,KAAoB,MAAM,QAAN,KAAmB,EAAhD;AAAA,GALD;;AAOT,UAAU;AAAA,WAAS,CAAC,CAAC,KAAF,IAAY,QAAO,KAAP,yCAAO,KAAP,OAAiB,QAAtC;AAAA,GAPD;;AAST,YAAU;AAAA,WAAS,OAAO,KAAP,KAAiB,UAA1B;AAAA,GATD;;AAWT,UAAU;AAAA,WAAS,OAAO,KAAP,KAAiB,QAA1B;AAAA,GAXD;;AAaT,QAAU;AAAA,WAAS,OAAO,KAAP,KAAiB,SAA1B;AAAA,GAbD;;AAeT,UAAU;AAAA,WAAS,OAAO,KAAP,KAAiB,QAA1B;AAAA,GAfD;;AAiBT,WAAS,wBAAS;AAChB,QAAI,CAAC,KAAD,IAAW,QAAO,KAAP,yCAAO,KAAP,OAAiB,QAAhC,EAA2C;AAAE,aAAO,KAAP;AAAe;;AAE5D,QAAM,UAAU,IAAI,SAAJ,CAAc,KAAd,KAAwB,IAAI,MAA5C;;AAEA,WAAQ,mBAAkB,IAAlB,SAA8B,QAAQ,OAAtC,KACJ,iBAAiB,QAAQ,OADrB,CAC6B;AAD7B,QAEJ,MAAM,QAAN,KAAmB,CAAnB,IAAwB,OAAO,MAAM,QAAb,KAA0B;AAFtD;AAGD;AAzBQ,CAAX;;AA4BA,GAAG,KAAH,GAAW;AAAA,SAAU,GAAG,MAAH,CAAU,KAAV,KACf,OAAO,MAAM,MAAb,KAAwB,WADT,IAEhB,GAAG,QAAH,CAAY,MAAM,MAAlB,CAFM;AAAA,CAAX;;AAIA,OAAO,OAAP,GAAiB,EAAjB;;;;;ACnCA,OAAO,OAAP,GAAiB,UAAC,KAAD;AAAA,SAAW,CAAC,EAAE,SAAS,MAAM,MAAjB,CAAD,IAA8B,iBAAiB,MAAM,MAAhE;AAAA,CAAjB;;;;;ACAA,SAAS,aAAT,CAAwB,IAAxB,EAA8B,MAA9B,EAAsC;AACpC,OAAK,IAAM,IAAX,IAAmB,MAAnB,EAA2B;AACzB,QAAM,kBAAkB,OAAO,OAAP,CAAe,eAAvC;AACA,QAAI,aAAa,KAAjB;;AAEA;AACA,SAAK,IAAM,MAAX,IAAqB,eAArB,EAAsC;AACpC,UAAI,KAAK,OAAL,CAAa,MAAb,MAAyB,CAAzB,IAA8B,gBAAgB,MAAhB,EAAwB,IAAxB,CAA6B,IAA7B,CAAlC,EAAsE;AACpE,qBAAa,IAAb;AACA;AACD;AACF;;AAED,QAAI,CAAC,UAAD,IAAe,OAAO,OAAO,IAAP,CAAP,KAAwB,UAA3C,EAAuD;AACrD,WAAK,IAAL,IAAa,OAAO,IAAP,CAAb;AACD;AACF;AACD,SAAO,IAAP;AACD;;AAED,cAAc,eAAd,GAAgC;AAC9B,UAAQ;AADsB,CAAhC;;AAIA,OAAO,OAAP,GAAiB,aAAjB;;;;;ACxBA,IAAM,QAAgB,QAAQ,SAAR,CAAtB;AACA,IAAM,UAAgB,QAAQ,WAAR,CAAtB;AACA,IAAM,MAAgB,QAAQ,cAAR,CAAtB;AACA,IAAM,WAAgB,QAAQ,YAAR,CAAtB;AACA,IAAM,aAAgB,QAAQ,cAAR,CAAtB;AACA,IAAM,KAAgB,QAAQ,MAAR,CAAtB;AACA,IAAM,gBAAgB,QAAQ,iBAAR,CAAtB;;AAEA,IAAM,eAAe;AACnB,cAAY,oBAAU,IAAV,EAAgB,GAAhB,EAAqB;AAC/B,SAAK,IAAL,GAAY,KAAK,IAAL,IAAa,EAAzB;AACA,SAAK,IAAL,CAAU,CAAV,GAAc,IAAI,IAAJ,CAAS,CAAvB;AACA,SAAK,IAAL,CAAU,CAAV,GAAc,IAAI,IAAJ,CAAS,CAAvB;;AAEA,SAAK,MAAL,GAAc,KAAK,MAAL,IAAe,EAA7B;AACA,SAAK,MAAL,CAAY,CAAZ,GAAgB,IAAI,MAAJ,CAAW,CAA3B;AACA,SAAK,MAAL,CAAY,CAAZ,GAAgB,IAAI,MAAJ,CAAW,CAA3B;;AAEA,SAAK,SAAL,GAAiB,IAAI,SAArB;AACD,GAXkB;;AAanB,kBAAgB,wBAAU,SAAV,EAAqB,IAArB,EAA2B,GAA3B,EAAgC;AAC9C,cAAU,IAAV,CAAe,CAAf,GAAsB,IAAI,IAAJ,CAAS,CAAT,GAAgB,KAAK,IAAL,CAAU,CAAhD;AACA,cAAU,IAAV,CAAe,CAAf,GAAsB,IAAI,IAAJ,CAAS,CAAT,GAAgB,KAAK,IAAL,CAAU,CAAhD;AACA,cAAU,MAAV,CAAiB,CAAjB,GAAsB,IAAI,MAAJ,CAAW,CAAX,GAAgB,KAAK,MAAL,CAAY,CAAlD;AACA,cAAU,MAAV,CAAiB,CAAjB,GAAsB,IAAI,MAAJ,CAAW,CAAX,GAAgB,KAAK,MAAL,CAAY,CAAlD;AACA,cAAU,SAAV,GAAsB,IAAI,SAAJ,GAAgB,KAAK,SAA3C;;AAEA;AACA,QAAM,KAAK,KAAK,GAAL,CAAS,UAAU,SAAV,GAAsB,IAA/B,EAAqC,KAArC,CAAX;;AAEA,cAAU,IAAV,CAAe,KAAf,GAAyB,MAAM,UAAU,IAAV,CAAe,CAArB,EAAwB,UAAU,IAAV,CAAe,CAAvC,IAA4C,EAArE;AACA,cAAU,IAAV,CAAe,EAAf,GAAyB,UAAU,IAAV,CAAe,CAAf,GAAmB,EAA5C;AACA,cAAU,IAAV,CAAe,EAAf,GAAyB,UAAU,IAAV,CAAe,CAAf,GAAmB,EAA5C;;AAEA,cAAU,MAAV,CAAiB,KAAjB,GAAyB,MAAM,UAAU,MAAV,CAAiB,CAAvB,EAA0B,UAAU,IAAV,CAAe,CAAzC,IAA8C,EAAvE;AACA,cAAU,MAAV,CAAiB,EAAjB,GAAyB,UAAU,MAAV,CAAiB,CAAjB,GAAqB,EAA9C;AACA,cAAU,MAAV,CAAiB,EAAjB,GAAyB,UAAU,MAAV,CAAiB,CAAjB,GAAqB,EAA9C;AACD,GA9BkB;;AAgCnB,mBAAiB,yBAAW,OAAX,EAAoB;AACnC,WAAQ,mBAAmB,IAAI,KAAvB,IAAgC,mBAAmB,IAAI,KAA/D;AACD,GAlCkB;;AAoCnB;AACA,SAAO,eAAU,IAAV,EAAgB,OAAhB,EAAyB,EAAzB,EAA6B;AAClC,SAAK,MAAM,EAAX;AACA,WAAO,QAAQ,MAAf;;AAEA,OAAG,CAAH,GAAO,QAAQ,OAAO,GAAf,CAAP;AACA,OAAG,CAAH,GAAO,QAAQ,OAAO,GAAf,CAAP;;AAEA,WAAO,EAAP;AACD,GA7CkB;;AA+CnB,aAAW,mBAAU,OAAV,EAAmB,IAAnB,EAAyB;AAClC,WAAO,QAAQ,EAAf;;AAEA;AACA,QAAI,QAAQ,aAAR,IAAyB,aAAa,eAAb,CAA6B,OAA7B,CAA7B,EAAoE;AAClE,mBAAa,KAAb,CAAmB,QAAnB,EAA6B,OAA7B,EAAsC,IAAtC;;AAEA,WAAK,CAAL,IAAU,OAAO,OAAjB;AACA,WAAK,CAAL,IAAU,OAAO,OAAjB;AACD,KALD,MAMK;AACH,mBAAa,KAAb,CAAmB,MAAnB,EAA2B,OAA3B,EAAoC,IAApC;AACD;;AAED,WAAO,IAAP;AACD,GA9DkB;;AAgEnB,eAAa,qBAAU,OAAV,EAAmB,MAAnB,EAA2B;AACtC,aAAS,UAAU,EAAnB;;AAEA,QAAI,QAAQ,aAAR,IAAyB,aAAa,eAAb,CAA6B,OAA7B,CAA7B,EAAoE;AAClE;AACA,mBAAa,KAAb,CAAmB,QAAnB,EAA6B,OAA7B,EAAsC,MAAtC;AACD,KAHD,MAIK;AACH,mBAAa,KAAb,CAAmB,QAAnB,EAA6B,OAA7B,EAAsC,MAAtC;AACD;;AAED,WAAO,MAAP;AACD,GA5EkB;;AA8EnB,gBAAc,sBAAU,OAAV,EAAmB;AAC/B,WAAO,GAAG,MAAH,CAAU,QAAQ,SAAlB,IAA8B,QAAQ,SAAtC,GAAkD,QAAQ,UAAjE;AACD,GAhFkB;;AAkFnB,aAAW,mBAAU,SAAV,EAAqB,QAArB,EAA+B,SAA/B,EAA0C;AACnD,QAAM,UAAW,SAAS,MAAT,GAAkB,CAAlB,GACE,aAAa,cAAb,CAA4B,QAA5B,CADF,GAEE,SAAS,CAAT,CAFnB;;AAIA,QAAM,QAAQ,EAAd;;AAEA,iBAAa,SAAb,CAAuB,OAAvB,EAAgC,KAAhC;AACA,cAAU,IAAV,CAAe,CAAf,GAAmB,MAAM,CAAzB;AACA,cAAU,IAAV,CAAe,CAAf,GAAmB,MAAM,CAAzB;;AAEA,iBAAa,WAAb,CAAyB,OAAzB,EAAkC,KAAlC;AACA,cAAU,MAAV,CAAiB,CAAjB,GAAqB,MAAM,CAA3B;AACA,cAAU,MAAV,CAAiB,CAAjB,GAAqB,MAAM,CAA3B;;AAEA,cAAU,SAAV,GAAsB,GAAG,MAAH,CAAU,SAAV,IAAuB,SAAvB,GAAkC,IAAI,IAAJ,GAAW,OAAX,EAAxD;AACD,GAlGkB;;AAoGnB,iBAAe,aApGI;;AAsGnB,gBAAc,sBAAU,KAAV,EAAiB;AAC7B,QAAM,UAAU,EAAhB;;AAEA;AACA,QAAI,GAAG,KAAH,CAAS,KAAT,CAAJ,EAAqB;AACnB,cAAQ,CAAR,IAAa,MAAM,CAAN,CAAb;AACA,cAAQ,CAAR,IAAa,MAAM,CAAN,CAAb;AACD;AACD;AAJA,SAKK;AACH,YAAI,MAAM,IAAN,KAAe,UAAnB,EAA+B;AAC7B,cAAI,MAAM,OAAN,CAAc,MAAd,KAAyB,CAA7B,EAAgC;AAC9B,oBAAQ,CAAR,IAAa,MAAM,OAAN,CAAc,CAAd,CAAb;AACA,oBAAQ,CAAR,IAAa,MAAM,cAAN,CAAqB,CAArB,CAAb;AACD,WAHD,MAIK,IAAI,MAAM,OAAN,CAAc,MAAd,KAAyB,CAA7B,EAAgC;AACnC,oBAAQ,CAAR,IAAa,MAAM,cAAN,CAAqB,CAArB,CAAb;AACA,oBAAQ,CAAR,IAAa,MAAM,cAAN,CAAqB,CAArB,CAAb;AACD;AACF,SATD,MAUK;AACH,kBAAQ,CAAR,IAAa,MAAM,OAAN,CAAc,CAAd,CAAb;AACA,kBAAQ,CAAR,IAAa,MAAM,OAAN,CAAc,CAAd,CAAb;AACD;AACF;;AAED,WAAO,OAAP;AACD,GAjIkB;;AAmInB,kBAAgB,wBAAU,QAAV,EAAoB;AAClC,QAAM,UAAU;AACd,aAAS,CADK;AAEd,aAAS,CAFK;AAGd,eAAS,CAHK;AAId,eAAS,CAJK;AAKd,eAAS,CALK;AAMd,eAAS;AANK,KAAhB;;AASA,yBAAsB,QAAtB,kHAAgC;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,UAArB,OAAqB;;AAC9B,WAAK,IAAM,KAAX,IAAmB,OAAnB,EAA4B;AAC1B,gBAAQ,KAAR,KAAiB,QAAQ,KAAR,CAAjB;AACD;AACF;AACD,SAAK,IAAM,IAAX,IAAmB,OAAnB,EAA4B;AAC1B,cAAQ,IAAR,KAAiB,SAAS,MAA1B;AACD;;AAED,WAAO,OAAP;AACD,GAvJkB;;AAyJnB,aAAW,mBAAU,KAAV,EAAiB;AAC1B,QAAI,CAAC,MAAM,MAAP,IAAiB,EAAE,MAAM,OAAN,IAAiB,MAAM,OAAN,CAAc,MAAd,GAAuB,CAA1C,CAArB,EAAmE;AACjE;AACD;;AAED,QAAM,UAAU,aAAa,YAAb,CAA0B,KAA1B,CAAhB;AACA,QAAM,OAAO,KAAK,GAAL,CAAS,QAAQ,CAAR,EAAW,KAApB,EAA2B,QAAQ,CAAR,EAAW,KAAtC,CAAb;AACA,QAAM,OAAO,KAAK,GAAL,CAAS,QAAQ,CAAR,EAAW,KAApB,EAA2B,QAAQ,CAAR,EAAW,KAAtC,CAAb;AACA,QAAM,OAAO,KAAK,GAAL,CAAS,QAAQ,CAAR,EAAW,KAApB,EAA2B,QAAQ,CAAR,EAAW,KAAtC,CAAb;AACA,QAAM,OAAO,KAAK,GAAL,CAAS,QAAQ,CAAR,EAAW,KAApB,EAA2B,QAAQ,CAAR,EAAW,KAAtC,CAAb;;AAEA,WAAO;AACL,SAAG,IADE;AAEL,SAAG,IAFE;AAGL,YAAM,IAHD;AAIL,WAAK,IAJA;AAKL,aAAO,OAAO,IALT;AAML,cAAQ,OAAO;AANV,KAAP;AAQD,GA5KkB;;AA8KnB,iBAAe,uBAAU,KAAV,EAAiB,WAAjB,EAA8B;AAC3C,QAAM,UAAU,cAAc,GAA9B;AACA,QAAM,UAAU,cAAc,GAA9B;AACA,QAAM,UAAU,aAAa,YAAb,CAA0B,KAA1B,CAAhB;;AAGA,QAAM,KAAK,QAAQ,CAAR,EAAW,OAAX,IAAsB,QAAQ,CAAR,EAAW,OAAX,CAAjC;AACA,QAAM,KAAK,QAAQ,CAAR,EAAW,OAAX,IAAsB,QAAQ,CAAR,EAAW,OAAX,CAAjC;;AAEA,WAAO,MAAM,EAAN,EAAU,EAAV,CAAP;AACD,GAxLkB;;AA0LnB,cAAY,oBAAU,KAAV,EAAiB,SAAjB,EAA4B,WAA5B,EAAyC;AACnD,QAAM,UAAU,cAAc,GAA9B;AACA,QAAM,UAAU,cAAc,GAA9B;AACA,QAAM,UAAU,aAAa,YAAb,CAA0B,KAA1B,CAAhB;AACA,QAAM,KAAK,QAAQ,CAAR,EAAW,OAAX,IAAsB,QAAQ,CAAR,EAAW,OAAX,CAAjC;AACA,QAAM,KAAK,QAAQ,CAAR,EAAW,OAAX,IAAsB,QAAQ,CAAR,EAAW,OAAX,CAAjC;AACA,QAAM,QAAQ,MAAM,KAAK,KAAL,CAAW,EAAX,EAAgB,EAAhB,CAAN,GAA4B,KAAK,EAA/C;;AAEA,WAAQ,KAAR;AACD,GAnMkB;;AAqMnB,kBAAgB,wBAAU,OAAV,EAAmB;AACjC,WAAO,GAAG,MAAH,CAAU,QAAQ,WAAlB,IACH,QAAQ,WADL,GAEH,GAAG,MAAH,CAAU,QAAQ,WAAlB,IACE,CAAC,SAAD,EAAY,SAAZ,EAAsB,OAAtB,EAA+B,KAA/B,EAAsC,OAAtC,EAA+C,QAAQ,WAAvD;AACA;AACA;AAHF,MAII,QAAQ,IAAR,CAAa,QAAQ,IAArB,KAA8B,mBAAmB,WAAW,KAA5D,GACE,OADF,GAEE,OARV;AASD,GA/MkB;;AAiNnB;AACA,mBAAiB,yBAAU,KAAV,EAAiB;AAChC,WAAO,CACL,SAAS,gBAAT,CAA0B,MAAM,IAAN,GAAa,MAAM,IAAN,CAAW,CAAX,CAAb,GAA6B,MAAM,MAA7D,CADK,EAEL,SAAS,gBAAT,CAA0B,MAAM,aAAhC,CAFK,CAAP;AAID;AAvNkB,CAArB;;AA0NA,OAAO,OAAP,GAAiB,YAAjB;;;;;eClOmB,QAAQ,UAAR,C;IAAX,M,YAAA,M;;AAER,IAAM,UAAU,CAAC,IAAD,EAAO,KAAP,EAAc,QAAd,EAAwB,GAAxB,CAAhB;AACA,IAAI,WAAW,CAAf;AACA,IAAI,gBAAJ;AACA,IAAI,eAAJ;;AAEA,KAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,QAAQ,MAAZ,IAAsB,CAAC,OAAO,qBAA9C,EAAqE,GAArE,EAA0E;AACxE,YAAU,OAAO,QAAQ,CAAR,IAAa,uBAApB,CAAV;AACA,WAAS,OAAO,QAAQ,CAAR,IAAY,sBAAnB,KAA8C,OAAO,QAAQ,CAAR,IAAa,6BAApB,CAAvD;AACD;;AAED,IAAI,CAAC,OAAL,EAAc;AACZ,YAAU,iBAAU,QAAV,EAAoB;AAC5B,QAAM,WAAW,IAAI,IAAJ,GAAW,OAAX,EAAjB;AACA,QAAM,aAAa,KAAK,GAAL,CAAS,CAAT,EAAY,MAAM,WAAW,QAAjB,CAAZ,CAAnB;AACA,QAAM,KAAK,WAAW,YAAY;AAAE,eAAS,WAAW,UAApB;AAAkC,KAA3D,EACW,UADX,CAAX;;AAGA,eAAW,WAAW,UAAtB;AACA,WAAO,EAAP;AACD,GARD;AASD;;AAED,IAAI,CAAC,MAAL,EAAa;AACX,WAAS,gBAAU,EAAV,EAAc;AACrB,iBAAa,EAAb;AACD,GAFD;AAGD;;AAED,OAAO,OAAP,GAAiB;AACf,kBADe;AAEf;AAFe,CAAjB;;;;;AC9BA,IAAM,SAAS,QAAQ,UAAR,CAAf;AACA,IAAM,KAAK,QAAQ,MAAR,CAAX;;eAKI,QAAQ,YAAR,C;IAHF,O,YAAA,O;IACA,U,YAAA,U;IACA,c,YAAA,c;;AAGF,IAAM,YAAY;AAChB,yBAAuB,+BAAU,KAAV,EAAiB,YAAjB,EAA+B,OAA/B,EAAwC;AAC7D,QAAI,CAAC,GAAG,MAAH,CAAU,KAAV,CAAL,EAAuB;AACrB,aAAO,IAAP;AACD;;AAED,QAAI,UAAU,QAAd,EAAwB;AACtB,cAAQ,WAAW,OAAX,CAAR;AACD,KAFD,MAGK,IAAI,UAAU,MAAd,EAAsB;AACzB,cAAQ,aAAa,OAAb,CAAqB,OAArB,CAAR;AACD,KAFI,MAGA;AACH,cAAQ,QAAQ,OAAR,EAAiB,KAAjB,CAAR;AACD;;AAED,WAAO,KAAP;AACD,GAjBe;;AAmBhB,mBAAiB,yBAAU,KAAV,EAAiB,YAAjB,EAA+B,OAA/B,EAAwC,YAAxC,EAAsD;AACrE,YAAQ,UAAU,qBAAV,CAAgC,KAAhC,EAAuC,YAAvC,EAAqD,OAArD,KAAiE,KAAzE;;AAEA,QAAI,GAAG,QAAH,CAAY,KAAZ,CAAJ,EAAwB;AACtB,cAAQ,MAAM,KAAN,CAAY,IAAZ,EAAkB,YAAlB,CAAR;AACD;;AAED,QAAI,GAAG,OAAH,CAAW,KAAX,CAAJ,EAAuB;AACrB,cAAQ,eAAe,KAAf,CAAR;AACD;;AAED,WAAO,KAAP;AACD,GA/Be;;AAiChB,YAAU,kBAAU,IAAV,EAAgB;AACxB,WAAQ,QAAQ;AACd,SAAG,OAAO,IAAP,GAAc,KAAK,CAAnB,GAAuB,KAAK,IADjB;AAEd,SAAG,OAAO,IAAP,GAAc,KAAK,CAAnB,GAAuB,KAAK;AAFjB,KAAhB;AAID,GAtCe;;AAwChB,cAAY,oBAAU,IAAV,EAAgB;AAC1B,QAAI,QAAQ,EAAE,UAAU,IAAV,IAAkB,SAAS,IAA7B,CAAZ,EAAgD;AAC9C,aAAO,OAAO,EAAP,EAAW,IAAX,CAAP;;AAEA,WAAK,IAAL,GAAc,KAAK,CAAL,IAAU,CAAxB;AACA,WAAK,GAAL,GAAc,KAAK,CAAL,IAAU,CAAxB;AACA,WAAK,KAAL,GAAc,KAAK,KAAL,IAAiB,KAAK,IAAL,GAAY,KAAK,KAAhD;AACA,WAAK,MAAL,GAAc,KAAK,MAAL,IAAiB,KAAK,GAAL,GAAW,KAAK,MAA/C;AACD;;AAED,WAAO,IAAP;AACD,GAnDe;;AAqDhB,cAAY,oBAAU,IAAV,EAAgB;AAC1B,QAAI,QAAQ,EAAE,OAAO,IAAP,IAAe,OAAO,IAAxB,CAAZ,EAA2C;AACzC,aAAO,OAAO,EAAP,EAAW,IAAX,CAAP;;AAEA,WAAK,CAAL,GAAc,KAAK,IAAL,IAAa,CAA3B;AACA,WAAK,GAAL,GAAc,KAAK,GAAL,IAAa,CAA3B;AACA,WAAK,KAAL,GAAc,KAAK,KAAL,IAAgB,KAAK,KAAL,GAAc,KAAK,CAAjD;AACA,WAAK,MAAL,GAAc,KAAK,MAAL,IAAgB,KAAK,MAAL,GAAc,KAAK,CAAjD;AACD;;AAED,WAAO,IAAP;AACD;AAhEe,CAAlB;;AAmEA,OAAO,OAAP,GAAiB,SAAjB;;;;;AC3EA,IAAM,MAAM,OAAO,OAAnB;AACA,IAAM,WAAW,QAAQ,YAAR,CAAjB;;AAEA,SAAS,IAAT,CAAe,MAAf,EAAuB;AACrB;;AAEA,MAAI,UAAJ,GAAiB,MAAjB;;AAEA;AACA,MAAM,KAAK,OAAO,QAAP,CAAgB,cAAhB,CAA+B,EAA/B,CAAX;;AAEA;AACA,MAAI,GAAG,aAAH,KAAqB,OAAO,QAA5B,IACG,OAAO,OAAO,IAAd,KAAuB,UAD1B,IAEC,OAAO,IAAP,CAAY,EAAZ,MAAoB,EAFzB,EAE6B;AAC3B;AACA,aAAS,OAAO,IAAP,CAAY,MAAZ,CAAT;AACD;;AAED,MAAI,MAAJ,GAAa,MAAb;AACD;;AAED,IAAI,OAAO,MAAP,KAAkB,WAAtB,EAAmC;AACjC,MAAI,MAAJ,GAAiB,SAAjB;AACA,MAAI,UAAJ,GAAiB,SAAjB;AACD,CAHD,MAIK;AACH,OAAK,MAAL;AACD;;AAED,IAAI,SAAJ,GAAgB,SAAS,SAAT,CAAoB,IAApB,EAA0B;AACxC,MAAI,SAAS,IAAT,CAAJ,EAAoB;AAClB,WAAO,IAAP;AACD;;AAED,MAAM,WAAY,KAAK,aAAL,IAAsB,IAAxC;;AAEA,SAAO,SAAS,WAAT,IAAwB,SAAS,YAAjC,IAAiD,IAAI,MAA5D;AACD,CARD;;AAUA,IAAI,IAAJ,GAAW,IAAX","file":"interact.js","sourceRoot":"","sourcesContent":["/**\n * interact.js v1.3.0-alpha.4+sha.7970416-dirty\n *\n * Copyright (c) 2012-2017 Taye Adeyemi \n * Open source under the MIT License.\n * https://raw.github.com/taye/interact.js/master/LICENSE\n */\n","(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o 150) {\n return null;\n }\n\n let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI;\n const overlap = 22.5;\n\n if (angle < 0) {\n angle += 360;\n }\n\n const left = 135 - overlap <= angle && angle < 225 + overlap;\n const up = 225 - overlap <= angle && angle < 315 + overlap;\n\n const right = !left && (315 - overlap <= angle || angle < 45 + overlap);\n const down = !up && 45 - overlap <= angle && angle < 135 + overlap;\n\n return {\n up,\n down,\n left,\n right,\n angle,\n speed: interaction.prevEvent.speed,\n velocity: {\n x: interaction.prevEvent.velocityX,\n y: interaction.prevEvent.velocityY,\n },\n };\n }\n\n preventDefault () {}\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n}\n\nsignals.on('set-delta', function ({ iEvent, interaction, starting, deltaSource }) {\n const prevEvent = starting? iEvent : interaction.prevEvent;\n\n if (deltaSource === 'client') {\n iEvent.dx = iEvent.clientX - prevEvent.clientX;\n iEvent.dy = iEvent.clientY - prevEvent.clientY;\n }\n else {\n iEvent.dx = iEvent.pageX - prevEvent.pageX;\n iEvent.dy = iEvent.pageY - prevEvent.pageY;\n }\n});\n\nInteractEvent.signals = signals;\n\nmodule.exports = InteractEvent;\n","const is = require('./utils/is');\nconst events = require('./utils/events');\nconst extend = require('./utils/extend');\nconst actions = require('./actions/base');\nconst scope = require('./scope');\nconst Eventable = require('./Eventable');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nconst {\n getElementRect,\n nodeContains,\n trySelector,\n} = require('./utils/domUtils');\nconst { getWindow } = require('./utils/window');\nconst { indexOf, contains } = require('./utils/arr');\nconst { wheelEvent } = require('./utils/browser');\n\n// all set interactables\nscope.interactables = [];\n\n/*\\\n * Interactable\n [ property ]\n **\n * Object type returned by @interact\n\\*/\nclass Interactable {\n constructor (target, options) {\n options = options || {};\n\n this.target = target;\n this.events = new Eventable();\n this._context = options.context || scope.document;\n this._win = getWindow(trySelector(target)? this._context : target);\n this._doc = this._win.document;\n\n signals.fire('new', {\n target,\n options,\n interactable: this,\n win: this._win,\n });\n\n scope.addDocument( this._doc, this._win );\n\n scope.interactables.push(this);\n\n this.set(options);\n }\n\n setOnEvents (action, phases) {\n const onAction = 'on' + action;\n\n if (is.function(phases.onstart) ) { this.events[onAction + 'start' ] = phases.onstart ; }\n if (is.function(phases.onmove) ) { this.events[onAction + 'move' ] = phases.onmove ; }\n if (is.function(phases.onend) ) { this.events[onAction + 'end' ] = phases.onend ; }\n if (is.function(phases.oninertiastart)) { this.events[onAction + 'inertiastart' ] = phases.oninertiastart ; }\n\n return this;\n }\n\n setPerAction (action, options) {\n // for all the default per-action options\n for (const option in options) {\n // if this option exists for this action\n if (option in defaults[action]) {\n // if the option in the options arg is an object value\n if (is.object(options[option])) {\n // duplicate the object\n this.options[action][option] = extend(this.options[action][option] || {}, options[option]);\n\n if (is.object(defaults.perAction[option]) && 'enabled' in defaults.perAction[option]) {\n this.options[action][option].enabled = options[option].enabled === false? false : true;\n }\n }\n else if (is.bool(options[option]) && is.object(defaults.perAction[option])) {\n this.options[action][option].enabled = options[option];\n }\n else if (options[option] !== undefined) {\n // or if it's not undefined, do a plain assignment\n this.options[action][option] = options[option];\n }\n }\n }\n }\n\n /*\\\n * Interactable.getRect\n [ method ]\n *\n * The default function to get an Interactables bounding rect. Can be\n * overridden using @Interactable.rectChecker.\n *\n - element (Element) #optional The element to measure.\n = (object) The object's bounding rectangle.\n o {\n o top : 0,\n o left : 0,\n o bottom: 0,\n o right : 0,\n o width : 0,\n o height: 0\n o }\n \\*/\n getRect (element) {\n element = element || this.target;\n\n if (is.string(this.target) && !(is.element(element))) {\n element = this._context.querySelector(this.target);\n }\n\n return getElementRect(element);\n }\n\n /*\\\n * Interactable.rectChecker\n [ method ]\n *\n * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n - checker (function) #optional A function which returns this Interactable's bounding rectangle. See @Interactable.getRect\n = (function | object) The checker function or this Interactable\n \\*/\n rectChecker (checker) {\n if (is.function(checker)) {\n this.getRect = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.getRect;\n\n return this;\n }\n\n return this.getRect;\n }\n\n _backCompatOption (optionName, newValue) {\n if (trySelector(newValue) || is.object(newValue)) {\n this.options[optionName] = newValue;\n\n for (const action of actions.names) {\n this.options[action][optionName] = newValue;\n }\n\n return this;\n }\n\n return this.options[optionName];\n }\n\n /*\\\n * Interactable.origin\n [ method ]\n *\n * Gets or sets the origin of the Interactable's element. The x and y\n * of the origin will be subtracted from action event coordinates.\n *\n - origin (object | string) #optional An object eg. { x: 0, y: 0 } or string 'parent', 'self' or any CSS selector\n * OR\n - origin (Element) #optional An HTML or SVG Element whose rect will be used\n **\n = (object) The current origin or this Interactable\n \\*/\n origin (newValue) {\n return this._backCompatOption('origin', newValue);\n }\n\n /*\\\n * Interactable.deltaSource\n [ method ]\n *\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n - newValue (string) #optional Use 'client' if you will be scrolling while interacting; Use 'page' if you want autoScroll to work\n = (string | object) The current deltaSource or this Interactable\n \\*/\n deltaSource (newValue) {\n if (newValue === 'page' || newValue === 'client') {\n this.options.deltaSource = newValue;\n\n return this;\n }\n\n return this.options.deltaSource;\n }\n\n /*\\\n * Interactable.context\n [ method ]\n *\n * Gets the selector context Node of the Interactable. The default is `window.document`.\n *\n = (Node) The context Node of this Interactable\n **\n \\*/\n context () {\n return this._context;\n }\n\n inContext (element) {\n return (this._context === element.ownerDocument\n || nodeContains(this._context, element));\n }\n\n /*\\\n * Interactable.fire\n [ method ]\n *\n * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n - iEvent (InteractEvent) The InteractEvent object to be fired on this Interactable\n = (Interactable) this Interactable\n \\*/\n fire (iEvent) {\n this.events.fire(iEvent);\n\n return this;\n }\n\n _onOffMultiple (method, eventType, listener, options) {\n if (is.string(eventType) && eventType.search(' ') !== -1) {\n eventType = eventType.trim().split(/ +/);\n }\n\n if (is.array(eventType)) {\n for (let i = 0; i < eventType.length; i++) {\n this[method](eventType[i], listener, options);\n }\n\n return true;\n }\n\n if (is.object(eventType)) {\n for (const prop in eventType) {\n this[method](prop, eventType[prop], listener);\n }\n\n return true;\n }\n }\n\n /*\\\n * Interactable.on\n [ method ]\n *\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n - eventType (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) This Interactable\n \\*/\n on (eventType, listener, options) {\n if (this._onOffMultiple('on', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.on(eventType, listener);\n }\n // delegated event for selector\n else if (is.string(this.target)) {\n events.addDelegate(this.target, this._context, eventType, listener, options);\n }\n else {\n events.add(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.off\n [ method ]\n *\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n - eventType (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) This Interactable\n \\*/\n off (eventType, listener, options) {\n if (this._onOffMultiple('off', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n // if it is an action event type\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.off(eventType, listener);\n }\n // delegated event\n else if (is.string(this.target)) {\n events.removeDelegate(this.target, this._context, eventType, listener, options);\n }\n // remove listener from this Interatable's element\n else {\n events.remove(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.set\n [ method ]\n *\n * Reset the options of this Interactable\n - options (object) The new settings to apply\n = (object) This Interactable\n \\*/\n set (options) {\n if (!is.object(options)) {\n options = {};\n }\n\n this.options = extend({}, defaults.base);\n\n const perActions = extend({}, defaults.perAction);\n\n for (const actionName in actions.methodDict) {\n const methodName = actions.methodDict[actionName];\n\n this.options[actionName] = extend({}, defaults[actionName]);\n\n this.setPerAction(actionName, perActions);\n\n this[methodName](options[actionName]);\n }\n\n for (const setting of Interactable.settingsMethods) {\n this.options[setting] = defaults.base[setting];\n\n if (setting in options) {\n this[setting](options[setting]);\n }\n }\n\n signals.fire('set', {\n options,\n interactable: this,\n });\n\n return this;\n }\n\n /*\\\n * Interactable.unset\n [ method ]\n *\n * Remove this interactable from the list of interactables and remove\n * it's action capabilities and event listeners\n *\n = (object) @interact\n \\*/\n unset () {\n events.remove(this.target, 'all');\n\n if (is.string(this.target)) {\n // remove delegated events\n for (const type in events.delegatedEvents) {\n const delegated = events.delegatedEvents[type];\n\n if (delegated.selectors[0] === this.target\n && delegated.contexts[0] === this._context) {\n\n delegated.selectors.splice(0, 1);\n delegated.contexts .splice(0, 1);\n delegated.listeners.splice(0, 1);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegated[type] = null;\n }\n }\n\n events.remove(this._context, type, events.delegateListener);\n events.remove(this._context, type, events.delegateUseCapture, true);\n }\n }\n else {\n events.remove(this, 'all');\n }\n\n signals.fire('unset', { interactable: this });\n\n scope.interactables.splice(indexOf(scope.interactables, this), 1);\n\n // Stop related interactions when an Interactable is unset\n for (const interaction of scope.interactions || []) {\n if (interaction.target === this && interaction.interacting()) {\n interaction.stop();\n }\n }\n\n return scope.interact;\n }\n}\n\nscope.interactables.indexOfElement = function indexOfElement (target, context) {\n context = context || scope.document;\n\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n if (interactable.target === target && interactable._context === context) {\n return i;\n }\n }\n return -1;\n};\n\nscope.interactables.get = function interactableGet (element, options, dontCheckInContext) {\n const ret = this[this.indexOfElement(element, options && options.context)];\n\n return ret && (is.string(element) || dontCheckInContext || ret.inContext(element))? ret : null;\n};\n\nscope.interactables.forEachSelector = function (callback, element) {\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n // skip non CSS selector targets and out of context elements\n if (!is.string(interactable.target)\n || (element && !interactable.inContext(element))) {\n continue;\n }\n\n const ret = callback(interactable, interactable.target, interactable._context, i, this);\n\n if (ret !== undefined) {\n return ret;\n }\n }\n};\n\n// all interact.js eventTypes\nInteractable.eventTypes = scope.eventTypes = [];\n\nInteractable.signals = signals;\n\nInteractable.settingsMethods = [ 'deltaSource', 'origin', 'preventDefault', 'rectChecker' ];\n\nmodule.exports = Interactable;\n","const scope = require('./scope');\nconst utils = require('./utils');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst domObjects = require('./utils/domObjects');\nconst finder = require('./utils/interactionFinder');\nconst signals = require('./utils/Signals').new();\n\nconst listeners = {};\nconst methodNames = [\n 'pointerDown', 'pointerMove', 'pointerUp',\n 'updatePointer', 'removePointer',\n];\n\n// for ignoring browser's simulated mouse events\nlet prevTouchTime = 0;\n\n// all active and idle interactions\nscope.interactions = [];\n\nclass Interaction {\n constructor ({ pointerType }) {\n this.target = null; // current interactable being interacted with\n this.element = null; // the target element of the interactable\n\n this.prepared = { // action that's ready to be fired on next move event\n name : null,\n axis : null,\n edges: null,\n };\n\n // keep track of added pointers\n this.pointers = [];\n this.pointerIds = [];\n this.downTargets = [];\n this.downTimes = [];\n\n // Previous native pointer move event coordinates\n this.prevCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n // current native pointer move event coordinates\n this.curCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Starting InteractEvent pointer coordinates\n this.startCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Change in coordinates and time of the pointer\n this.pointerDelta = {\n page : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n client : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n timeStamp: 0,\n };\n\n this.downEvent = null; // pointerdown/mousedown/touchstart event\n this.downPointer = {};\n\n this._eventTarget = null;\n this._curEventTarget = null;\n\n this.prevEvent = null; // previous action event\n\n this.pointerIsDown = false;\n this.pointerWasMoved = false;\n this._interacting = false;\n\n this.pointerType = pointerType;\n\n signals.fire('new', this);\n\n scope.interactions.push(this);\n }\n\n pointerDown (pointer, event, eventTarget) {\n const pointerIndex = this.updatePointer(pointer, event, true);\n\n signals.fire('down', {\n pointer,\n event,\n eventTarget,\n pointerIndex,\n interaction: this,\n });\n }\n\n /*\\\n * Interaction.start\n [ method ]\n *\n * Start an action with the given Interactable and Element as tartgets. The\n * action must be enabled for the target Interactable and an appropriate number\n * of pointers must be held down - 1 for drag/resize, 2 for gesture.\n *\n * Use it with `interactable.able({ manualStart: false })` to always\n * [start actions manually](https://github.com/taye/interact.js/issues/114)\n *\n - action (object) The action to be performed - drag, resize, etc.\n - target (Interactable) The Interactable to target\n - element (Element) The DOM Element to target\n = (object) interact\n **\n | interact(target)\n | .draggable({\n | // disable the default drag start by down->move\n | manualStart: true\n | })\n | // start dragging after the user holds the pointer down\n | .on('hold', function (event) {\n | var interaction = event.interaction;\n |\n | if (!interaction.interacting()) {\n | interaction.start({ name: 'drag' },\n | event.interactable,\n | event.currentTarget);\n | }\n | });\n \\*/\n start (action, target, element) {\n if (this.interacting()\n || !this.pointerIsDown\n || this.pointerIds.length < (action.name === 'gesture'? 2 : 1)) {\n return;\n }\n\n // if this interaction had been removed after stopping\n // add it back\n if (utils.indexOf(scope.interactions, this) === -1) {\n scope.interactions.push(this);\n }\n\n utils.copyAction(this.prepared, action);\n this.target = target;\n this.element = element;\n\n signals.fire('action-start', {\n interaction: this,\n event: this.downEvent,\n });\n }\n\n pointerMove (pointer, event, eventTarget) {\n if (!this.simulation) {\n this.updatePointer(pointer);\n utils.setCoords(this.curCoords, this.pointers);\n }\n\n const duplicateMove = (this.curCoords.page.x === this.prevCoords.page.x\n && this.curCoords.page.y === this.prevCoords.page.y\n && this.curCoords.client.x === this.prevCoords.client.x\n && this.curCoords.client.y === this.prevCoords.client.y);\n\n let dx;\n let dy;\n\n // register movement greater than pointerMoveTolerance\n if (this.pointerIsDown && !this.pointerWasMoved) {\n dx = this.curCoords.client.x - this.startCoords.client.x;\n dy = this.curCoords.client.y - this.startCoords.client.y;\n\n this.pointerWasMoved = utils.hypot(dx, dy) > Interaction.pointerMoveTolerance;\n }\n\n const signalArg = {\n pointer,\n pointerIndex: this.getPointerIndex(pointer),\n event,\n eventTarget,\n dx,\n dy,\n duplicate: duplicateMove,\n interaction: this,\n interactingBeforeMove: this.interacting(),\n };\n\n if (!duplicateMove) {\n // set pointer coordinate, time changes and speeds\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n }\n\n signals.fire('move', signalArg);\n\n if (!duplicateMove) {\n // if interacting, fire an 'action-move' signal etc\n if (this.interacting()) {\n this.doMove(signalArg);\n }\n\n if (this.pointerWasMoved) {\n utils.copyCoords(this.prevCoords, this.curCoords);\n }\n }\n }\n\n /*\\\n * Interaction.doMove\n [ method ]\n *\n * Force a move of the current action at the same coordinates. Useful if\n * snap/restrict has been changed and you want a movement with the new\n * settings.\n *\n **\n | interact(target)\n | .draggable(true)\n | .on('dragmove', function (event) {\n | if (someCondition) {\n | // change the snap settings\n | event.interactable.draggable({ snap: { targets: [] }});\n | // fire another move event with re-calculated snap\n | event.interaction.doMove();\n | }\n | });\n \\*/\n doMove (signalArg) {\n signalArg = utils.extend({\n pointer: this.pointers[0],\n event: this.prevEvent,\n eventTarget: this._eventTarget,\n interaction: this,\n }, signalArg || {});\n\n signals.fire('before-action-move', signalArg);\n\n if (!this._dontFireMove) {\n signals.fire('action-move', signalArg);\n }\n\n this._dontFireMove = false;\n }\n\n // End interact move events and stop auto-scroll unless simulation is running\n pointerUp (pointer, event, eventTarget, curEventTarget) {\n const pointerIndex = this.getPointerIndex(pointer);\n\n signals.fire(/cancel$/i.test(event.type)? 'cancel' : 'up', {\n pointer,\n pointerIndex,\n event,\n eventTarget,\n curEventTarget,\n interaction: this,\n });\n\n if (!this.simulation) {\n this.end(event);\n }\n\n this.pointerIsDown = false;\n this.removePointer(pointer, event);\n }\n\n /*\\\n * Interaction.end\n [ method ]\n *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n - event (PointerEvent) #optional\n **\n | interact(target)\n | .draggable(true)\n | .on('move', function (event) {\n | if (event.pageX > 1000) {\n | // end the current action\n | event.interaction.end();\n | // stop all further listeners from being called\n | event.stopImmediatePropagation();\n | }\n | });\n \\*/\n end (event) {\n event = event || this.prevEvent;\n\n if (this.interacting()) {\n signals.fire('action-end', {\n event,\n interaction: this,\n });\n }\n\n this.stop();\n }\n\n currentAction () {\n return this._interacting? this.prepared.name: null;\n }\n\n interacting () {\n return this._interacting;\n }\n\n stop () {\n signals.fire('stop', { interaction: this });\n\n if (this._interacting) {\n signals.fire('stop-active', { interaction: this });\n signals.fire('stop-' + this.prepared.name, { interaction: this });\n }\n\n this.target = this.element = null;\n\n this._interacting = false;\n this.prepared.name = this.prevEvent = null;\n }\n\n getPointerIndex (pointer) {\n // mouse and pen interactions may have only one pointer\n if (this.pointerType === 'mouse' || this.pointerType === 'pen') {\n return 0;\n }\n\n return utils.indexOf(this.pointerIds, utils.getPointerId(pointer));\n }\n\n updatePointer (pointer, event, down = event && /(down|start)$/i.test(event.type)) {\n const id = utils.getPointerId(pointer);\n let index = this.getPointerIndex(pointer);\n\n if (index === -1) {\n index = this.pointerIds.length;\n this.pointerIds[index] = id;\n }\n\n if (down) {\n signals.fire('update-pointer-down', {\n pointer,\n event,\n down,\n pointerId: id,\n pointerIndex: index,\n interaction: this,\n });\n }\n\n this.pointers[index] = pointer;\n\n return index;\n }\n\n removePointer (pointer, event) {\n const index = this.getPointerIndex(pointer);\n\n if (index === -1) { return; }\n\n signals.fire('remove-pointer', {\n pointer,\n event,\n pointerIndex: index,\n interaction: this,\n });\n\n this.pointers .splice(index, 1);\n this.pointerIds .splice(index, 1);\n this.downTargets.splice(index, 1);\n this.downTimes .splice(index, 1);\n }\n\n _updateEventTargets (target, currentTarget) {\n this._eventTarget = target;\n this._curEventTarget = currentTarget;\n }\n}\n\nfor (let i = 0, len = methodNames.length; i < len; i++) {\n const method = methodNames[i];\n\n listeners[method] = doOnInteractions(method);\n}\n\nfunction doOnInteractions (method) {\n return (function (event) {\n const pointerType = utils.getPointerType(event);\n const [eventTarget, curEventTarget] = utils.getEventTargets(event);\n const matches = []; // [ [pointer, interaction], ...]\n\n if (browser.supportsTouch && /touch/.test(event.type)) {\n prevTouchTime = new Date().getTime();\n\n for (let i = 0; i < event.changedTouches.length; i++) {\n const pointer = event.changedTouches[i];\n const interaction = finder.search(pointer, event.type, eventTarget);\n\n matches.push([pointer, interaction || new Interaction({ pointerType })]);\n }\n }\n else {\n let invalidPointer = false;\n\n if (!browser.supportsPointerEvent && /mouse/.test(event.type)) {\n // ignore mouse events while touch interactions are active\n for (let i = 0; i < scope.interactions.length && !invalidPointer; i++) {\n invalidPointer = scope.interactions[i].pointerType !== 'mouse' && scope.interactions[i].pointerIsDown;\n }\n\n // try to ignore mouse events that are simulated by the browser\n // after a touch event\n invalidPointer = invalidPointer\n || (new Date().getTime() - prevTouchTime < 500)\n // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated\n || event.timeStamp === 0;\n }\n\n if (!invalidPointer) {\n let interaction = finder.search(event, event.type, eventTarget);\n\n if (!interaction) {\n interaction = new Interaction({ pointerType });\n }\n\n matches.push([event, interaction]);\n }\n }\n\n for (const [pointer, interaction] of matches) {\n interaction._updateEventTargets(eventTarget, curEventTarget);\n interaction[method](pointer, event, eventTarget, curEventTarget);\n }\n });\n}\n\nfunction endAll (event) {\n for (let i = 0; i < scope.interactions.length; i++) {\n const interaction = scope.interactions[i];\n\n interaction.end(event);\n signals.fire('endall', { event, interaction });\n }\n}\n\nconst docEvents = { /* 'eventType': listenerFunc */ };\nconst pEventTypes = browser.pEventTypes;\n\nif (domObjects.PointerEvent) {\n docEvents[pEventTypes.down ] = listeners.pointerDown;\n docEvents[pEventTypes.move ] = listeners.pointerMove;\n docEvents[pEventTypes.up ] = listeners.pointerUp;\n docEvents[pEventTypes.cancel] = listeners.pointerUp;\n}\nelse {\n docEvents.mousedown = listeners.pointerDown;\n docEvents.mousemove = listeners.pointerMove;\n docEvents.mouseup = listeners.pointerUp;\n\n docEvents.touchstart = listeners.pointerDown;\n docEvents.touchmove = listeners.pointerMove;\n docEvents.touchend = listeners.pointerUp;\n docEvents.touchcancel = listeners.pointerUp;\n}\n\ndocEvents.blur = endAll;\n\nfunction onDocSignal ({ doc }, signalName) {\n const eventMethod = signalName.indexOf('add') === 0\n ? events.add : events.remove;\n\n // delegate event listener\n for (const eventType in scope.delegatedEvents) {\n eventMethod(doc, eventType, events.delegateListener);\n eventMethod(doc, eventType, events.delegateUseCapture, true);\n }\n\n for (const eventType in docEvents) {\n eventMethod(doc, eventType, docEvents[eventType]);\n }\n}\n\nsignals.on('update-pointer-down', ({ interaction, pointer, pointerId, pointerIndex, event, eventTarget, down }) => {\n interaction.pointerIds[pointerIndex] = pointerId;\n interaction.pointers[pointerIndex] = pointer;\n\n if (down) {\n interaction.pointerIsDown = true;\n }\n\n if (!interaction.interacting()) {\n utils.setCoords(interaction.startCoords, interaction.pointers);\n\n utils.copyCoords(interaction.curCoords , interaction.startCoords);\n utils.copyCoords(interaction.prevCoords, interaction.startCoords);\n\n interaction.downEvent = event;\n interaction.downTimes[pointerIndex] = interaction.curCoords.timeStamp;\n interaction.downTargets[pointerIndex] = eventTarget || event && utils.getEventTargets(event)[0];\n interaction.pointerWasMoved = false;\n\n utils.pointerExtend(interaction.downPointer, pointer);\n }\n});\n\nscope.signals.on('add-document' , onDocSignal);\nscope.signals.on('remove-document', onDocSignal);\n\nInteraction.pointerMoveTolerance = 1;\nInteraction.doOnInteractions = doOnInteractions;\nInteraction.endAll = endAll;\nInteraction.signals = signals;\nInteraction.docEvents = docEvents;\n\nscope.endAllInteractions = endAll;\n\nmodule.exports = Interaction;\n","const Interaction = require('../Interaction');\nconst InteractEvent = require('../InteractEvent');\n\nconst actions = {\n firePrepared,\n names: [],\n methodDict: {},\n};\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n interaction._interacting = true;\n firePrepared(interaction, event, 'start');\n});\n\nInteraction.signals.on('action-move', function ({ interaction, event, preEnd }) {\n firePrepared(interaction, event, 'move', preEnd);\n\n // if the action was ended in a listener\n if (!interaction.interacting()) { return false; }\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n firePrepared(interaction, event, 'end');\n});\n\nfunction firePrepared (interaction, event, phase, preEnd) {\n const actionName = interaction.prepared.name;\n\n const newEvent = new InteractEvent(interaction, event, actionName, phase, interaction.element, null, preEnd);\n\n interaction.target.fire(newEvent);\n interaction.prevEvent = newEvent;\n}\n\nmodule.exports = actions;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drag = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n startAxis : 'xy',\n lockAxis : 'xy',\n },\n\n checker: function (pointer, event, interactable) {\n const dragOptions = interactable.options.drag;\n\n return dragOptions.enabled\n ? { name: 'drag', axis: (dragOptions.lockAxis === 'start'\n ? dragOptions.startAxis\n : dragOptions.lockAxis)}\n : null;\n },\n\n getCursor: function () {\n return 'move';\n },\n};\n\nInteraction.signals.on('before-action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n interaction.curCoords.page.y = interaction.startCoords.page.y;\n interaction.curCoords.client.y = interaction.startCoords.client.y;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vx);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vx);\n interaction.pointerDelta.client.vy = 0;\n interaction.pointerDelta.page.vy = 0;\n }\n else if (axis === 'y') {\n interaction.curCoords.page.x = interaction.startCoords.page.x;\n interaction.curCoords.client.x = interaction.startCoords.client.x;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vy);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vy);\n interaction.pointerDelta.client.vx = 0;\n interaction.pointerDelta.page.vx = 0;\n }\n});\n\n// dragmove\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'dragmove') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n iEvent.pageY = interaction.startCoords.page.y;\n iEvent.clientY = interaction.startCoords.client.y;\n iEvent.dy = 0;\n }\n else if (axis === 'y') {\n iEvent.pageX = interaction.startCoords.page.x;\n iEvent.clientX = interaction.startCoords.client.x;\n iEvent.dx = 0;\n }\n});\n\n/*\\\n * Interactable.draggable\n [ method ]\n *\n * Gets or sets whether drag actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of drag events\n | var isDraggable = interact('ul li').draggable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on drag events (object makes the Interactable draggable)\n = (object) This Interactable\n | interact(element).draggable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // the axis in which the first movement must be\n | // for the drag sequence to start\n | // 'xy' by default - any direction\n | startAxis: 'x' || 'y' || 'xy',\n |\n | // 'xy' by default - don't restrict to one axis (move in any direction)\n | // 'x' or 'y' to restrict movement to either axis\n | // 'start' to restrict movement to the axis the drag started in\n | lockAxis: 'x' || 'y' || 'xy' || 'start',\n |\n | // max number of drags that can happen concurrently\n | // with elements of this Interactable. Infinity by default\n | max: Infinity,\n |\n | // max number of drags that can target the same element+Interactable\n | // 1 by default\n | maxPerElement: 2\n | });\n\\*/\nInteractable.prototype.draggable = function (options) {\n if (utils.is.object(options)) {\n this.options.drag.enabled = options.enabled === false? false: true;\n this.setPerAction('drag', options);\n this.setOnEvents('drag', options);\n\n if (/^(xy|x|y|start)$/.test(options.lockAxis)) {\n this.options.drag.lockAxis = options.lockAxis;\n }\n if (/^(xy|x|y)$/.test(options.startAxis)) {\n this.options.drag.startAxis = options.startAxis;\n }\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drag.enabled = options;\n\n if (!options) {\n this.ondragstart = this.ondragstart = this.ondragend = null;\n }\n\n return this;\n }\n\n return this.options.drag;\n};\n\nactions.drag = drag;\nactions.names.push('drag');\nutils.merge(Interactable.eventTypes, [\n 'dragstart',\n 'dragmove',\n 'draginertiastart',\n 'draginertiaresume',\n 'dragend',\n]);\nactions.methodDict.drag = 'draggable';\n\ndefaultOptions.drag = drag.defaults;\n\nmodule.exports = drag;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst scope = require('../scope');\nconst interact = require('../interact');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drop = {\n defaults: {\n enabled: false,\n accept : null,\n overlap: 'pointer',\n },\n};\n\nlet dynamicDrop = false;\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // reset active dropzones\n interaction.activeDrops.dropzones = [];\n interaction.activeDrops.elements = [];\n interaction.activeDrops.rects = [];\n\n interaction.dropEvents = null;\n\n if (!interaction.dynamicDrop) {\n setActiveDrops(interaction, interaction.element);\n }\n\n const dragEvent = interaction.prevEvent;\n const dropEvents = getDropEvents(interaction, event, dragEvent);\n\n if (dropEvents.activate) {\n fireActiveDrops(interaction, dropEvents.activate);\n }\n});\n\nInteractEvent.signals.on('new', function ({ interaction, iEvent, event }) {\n if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { return; }\n\n const draggableElement = interaction.element;\n const dragEvent = iEvent;\n const dropResult = getDrop(dragEvent, event, draggableElement);\n\n interaction.dropTarget = dropResult.dropzone;\n interaction.dropElement = dropResult.element;\n\n interaction.dropEvents = getDropEvents(interaction, event, dragEvent);\n});\n\nInteraction.signals.on('action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n fireDropEvents(interaction, interaction.dropEvents);\n});\n\nInteraction.signals.on('action-end', function ({ interaction }) {\n if (interaction.prepared.name === 'drag') {\n fireDropEvents(interaction, interaction.dropEvents);\n }\n});\n\nInteraction.signals.on('stop-drag', function ({ interaction }) {\n interaction.activeDrops.dropzones =\n interaction.activeDrops.elements =\n interaction.activeDrops.rects =\n interaction.dropEvents = null;\n});\n\nfunction collectDrops (interaction, element) {\n const drops = [];\n const elements = [];\n\n element = element || interaction.element;\n\n // collect all dropzones and their elements which qualify for a drop\n for (const current of scope.interactables) {\n if (!current.options.drop.enabled) { continue; }\n\n const accept = current.options.drop.accept;\n\n // test the draggable element against the dropzone's accept setting\n if ((utils.is.element(accept) && accept !== element)\n || (utils.is.string(accept)\n && !utils.matchesSelector(element, accept))) {\n\n continue;\n }\n\n // query for new elements if necessary\n const dropElements = utils.is.string(current.target)\n ? current._context.querySelectorAll(current.target)\n : [current.target];\n\n for (let i = 0; i < dropElements.length; i++) {\n const currentElement = dropElements[i];\n\n if (currentElement !== element) {\n drops.push(current);\n elements.push(currentElement);\n }\n }\n }\n\n return {\n elements,\n dropzones: drops,\n };\n}\n\nfunction fireActiveDrops (interaction, event) {\n let prevElement;\n\n // loop through all active dropzones and trigger event\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n const current = interaction.activeDrops.dropzones[i];\n const currentElement = interaction.activeDrops.elements [i];\n\n // prevent trigger of duplicate events on same element\n if (currentElement !== prevElement) {\n // set current element as event target\n event.target = currentElement;\n current.fire(event);\n }\n prevElement = currentElement;\n }\n}\n\n// Collect a new set of possible drops and save them in activeDrops.\n// setActiveDrops should always be called when a drag has just started or a\n// drag event happens while dynamicDrop is true\nfunction setActiveDrops (interaction, dragElement) {\n // get dropzones and their elements that could receive the draggable\n const possibleDrops = collectDrops(interaction, dragElement, true);\n\n interaction.activeDrops.dropzones = possibleDrops.dropzones;\n interaction.activeDrops.elements = possibleDrops.elements;\n interaction.activeDrops.rects = [];\n\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n interaction.activeDrops.rects[i] =\n interaction.activeDrops.dropzones[i].getRect(interaction.activeDrops.elements[i]);\n }\n}\n\nfunction getDrop (dragEvent, event, dragElement) {\n const interaction = dragEvent.interaction;\n const validDrops = [];\n\n if (dynamicDrop) {\n setActiveDrops(interaction, dragElement);\n }\n\n // collect all dropzones and their elements which qualify for a drop\n for (let j = 0; j < interaction.activeDrops.dropzones.length; j++) {\n const current = interaction.activeDrops.dropzones[j];\n const currentElement = interaction.activeDrops.elements [j];\n const rect = interaction.activeDrops.rects [j];\n\n validDrops.push(current.dropCheck(dragEvent, event, interaction.target, dragElement, currentElement, rect)\n ? currentElement\n : null);\n }\n\n // get the most appropriate dropzone based on DOM depth and order\n const dropIndex = utils.indexOfDeepestElement(validDrops);\n\n return {\n dropzone: interaction.activeDrops.dropzones[dropIndex] || null,\n element : interaction.activeDrops.elements [dropIndex] || null,\n };\n}\n\nfunction getDropEvents (interaction, pointerEvent, dragEvent) {\n const dropEvents = {\n enter : null,\n leave : null,\n activate : null,\n deactivate: null,\n move : null,\n drop : null,\n };\n\n const tmpl = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n };\n\n if (interaction.dropElement !== interaction.prevDropElement) {\n // if there was a prevDropTarget, create a dragleave event\n if (interaction.prevDropTarget) {\n dropEvents.leave = utils.extend({ type: 'dragleave' }, tmpl);\n\n dragEvent.dragLeave = dropEvents.leave.target = interaction.prevDropElement;\n dragEvent.prevDropzone = dropEvents.leave.dropzone = interaction.prevDropTarget;\n }\n // if the dropTarget is not null, create a dragenter event\n if (interaction.dropTarget) {\n dropEvents.enter = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n type : 'dragenter',\n };\n\n dragEvent.dragEnter = interaction.dropElement;\n dragEvent.dropzone = interaction.dropTarget;\n }\n }\n\n if (dragEvent.type === 'dragend' && interaction.dropTarget) {\n dropEvents.drop = utils.extend({ type: 'drop' }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n dragEvent.relatedTarget = interaction.dropElement;\n }\n if (dragEvent.type === 'dragstart') {\n dropEvents.activate = utils.extend({ type: 'dropactivate' }, tmpl);\n\n dropEvents.activate.target = null;\n dropEvents.activate.dropzone = null;\n }\n if (dragEvent.type === 'dragend') {\n dropEvents.deactivate = utils.extend({ type: 'dropdeactivate' }, tmpl);\n\n dropEvents.deactivate.target = null;\n dropEvents.deactivate.dropzone = null;\n }\n if (dragEvent.type === 'dragmove' && interaction.dropTarget) {\n dropEvents.move = utils.extend({\n dragmove : dragEvent,\n type : 'dropmove',\n }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n }\n\n return dropEvents;\n}\n\nfunction fireDropEvents (interaction, dropEvents) {\n if (dropEvents.leave) { interaction.prevDropTarget.fire(dropEvents.leave); }\n if (dropEvents.move ) { interaction.dropTarget.fire(dropEvents.move ); }\n if (dropEvents.enter) { interaction.dropTarget.fire(dropEvents.enter); }\n if (dropEvents.drop ) { interaction.dropTarget.fire(dropEvents.drop ); }\n if (dropEvents.deactivate) {\n fireActiveDrops(interaction, dropEvents.deactivate);\n }\n\n interaction.prevDropTarget = interaction.dropTarget;\n interaction.prevDropElement = interaction.dropElement;\n}\n\n/*\\\n * Interactable.dropzone\n [ method ]\n *\n * Returns or sets whether elements can be dropped onto this\n * Interactable to trigger drop events\n *\n * Dropzones can receive the following events:\n * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends\n * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone\n * - `dragmove` when a draggable that has entered the dropzone is moved\n * - `drop` when a draggable is dropped into this dropzone\n *\n * Use the `accept` option to allow only elements that match the given CSS\n * selector or element. The value can be:\n *\n * - **an Element** - only that element can be dropped into this dropzone.\n * - **a string**, - the element being dragged must match it as a CSS selector.\n * - **`null`** - accept options is cleared - it accepts any element.\n *\n * Use the `overlap` option to set how drops are checked for. The allowed\n * values are:\n *\n * - `'pointer'`, the pointer must be over the dropzone (default)\n * - `'center'`, the draggable element's center must be over the dropzone\n * - a number from 0-1 which is the `(intersection area) / (draggable area)`.\n * e.g. `0.5` for drop to happen when half of the area of the draggable is\n * over the dropzone\n *\n * Use the `checker` option to specify a function to check if a dragged\n * element is over this Interactable.\n *\n | interact(target)\n | .dropChecker(function(dragEvent, // related dragmove or dragend event\n | event, // TouchEvent/PointerEvent/MouseEvent\n | dropped, // bool result of the default checker\n | dropzone, // dropzone Interactable\n | dropElement, // dropzone elemnt\n | draggable, // draggable Interactable\n | draggableElement) {// draggable element\n |\n | return dropped && event.target.hasAttribute('allow-drop');\n | }\n *\n *\n - options (boolean | object | null) #optional The new value to be set.\n | interact('.drop').dropzone({\n | accept: '.can-drop' || document.getElementById('single-drop'),\n | overlap: 'pointer' || 'center' || zeroToOne\n | }\n = (boolean | object) The current setting or this Interactable\n\\*/\nInteractable.prototype.dropzone = function (options) {\n if (utils.is.object(options)) {\n this.options.drop.enabled = options.enabled === false? false: true;\n\n if (utils.is.function(options.ondrop) ) { this.events.ondrop = options.ondrop ; }\n if (utils.is.function(options.ondropactivate) ) { this.events.ondropactivate = options.ondropactivate ; }\n if (utils.is.function(options.ondropdeactivate)) { this.events.ondropdeactivate = options.ondropdeactivate; }\n if (utils.is.function(options.ondragenter) ) { this.events.ondragenter = options.ondragenter ; }\n if (utils.is.function(options.ondragleave) ) { this.events.ondragleave = options.ondragleave ; }\n if (utils.is.function(options.ondropmove) ) { this.events.ondropmove = options.ondropmove ; }\n\n if (/^(pointer|center)$/.test(options.overlap)) {\n this.options.drop.overlap = options.overlap;\n }\n else if (utils.is.number(options.overlap)) {\n this.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0);\n }\n if ('accept' in options) {\n this.options.drop.accept = options.accept;\n }\n if ('checker' in options) {\n this.options.drop.checker = options.checker;\n }\n\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drop.enabled = options;\n\n if (!options) {\n this.ondragenter = this.ondragleave = this.ondrop\n = this.ondropactivate = this.ondropdeactivate = null;\n }\n\n return this;\n }\n\n return this.options.drop;\n};\n\nInteractable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) {\n let dropped = false;\n\n // if the dropzone has no rect (eg. display: none)\n // call the custom dropChecker or just return false\n if (!(rect = rect || this.getRect(dropElement))) {\n return (this.options.drop.checker\n ? this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement)\n : false);\n }\n\n const dropOverlap = this.options.drop.overlap;\n\n if (dropOverlap === 'pointer') {\n const origin = utils.getOriginXY(draggable, draggableElement, 'drag');\n const page = utils.getPageXY(dragEvent);\n\n page.x += origin.x;\n page.y += origin.y;\n\n const horizontal = (page.x > rect.left) && (page.x < rect.right);\n const vertical = (page.y > rect.top ) && (page.y < rect.bottom);\n\n dropped = horizontal && vertical;\n }\n\n const dragRect = draggable.getRect(draggableElement);\n\n if (dragRect && dropOverlap === 'center') {\n const cx = dragRect.left + dragRect.width / 2;\n const cy = dragRect.top + dragRect.height / 2;\n\n dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom;\n }\n\n if (dragRect && utils.is.number(dropOverlap)) {\n const overlapArea = (Math.max(0, Math.min(rect.right , dragRect.right ) - Math.max(rect.left, dragRect.left))\n * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top , dragRect.top )));\n\n const overlapRatio = overlapArea / (dragRect.width * dragRect.height);\n\n dropped = overlapRatio >= dropOverlap;\n }\n\n if (this.options.drop.checker) {\n dropped = this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement);\n }\n\n return dropped;\n};\n\nInteractable.signals.on('unset', function ({ interactable }) {\n interactable.dropzone(false);\n});\n\nInteractable.settingsMethods.push('dropChecker');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.dropTarget = null; // the dropzone a drag target might be dropped into\n interaction.dropElement = null; // the element at the time of checking\n interaction.prevDropTarget = null; // the dropzone that was recently dragged away from\n interaction.prevDropElement = null; // the element at the time of checking\n interaction.dropEvents = null; // the dropEvents related to the current drag event\n\n interaction.activeDrops = {\n dropzones: [], // the dropzones that are mentioned below\n elements : [], // elements of dropzones that accept the target draggable\n rects : [], // the rects of the elements mentioned above\n };\n\n});\n\nInteraction.signals.on('stop', function ({ interaction }) {\n interaction.dropTarget = interaction.dropElement =\n interaction.prevDropTarget = interaction.prevDropElement = null;\n});\n\n/*\\\n * interact.dynamicDrop\n [ method ]\n *\n * Returns or sets whether the dimensions of dropzone elements are\n * calculated on every dragmove or only on dragstart for the default\n * dropChecker\n *\n - newValue (boolean) #optional True to check on each move. False to check only before start\n = (boolean | interact) The current setting or interact\n\\*/\ninteract.dynamicDrop = function (newValue) {\n if (utils.is.bool(newValue)) {\n //if (dragging && dynamicDrop !== newValue && !newValue) {\n //calcRects(dropzones);\n //}\n\n dynamicDrop = newValue;\n\n return interact;\n }\n return dynamicDrop;\n};\n\nutils.merge(Interactable.eventTypes, [\n 'dragenter',\n 'dragleave',\n 'dropactivate',\n 'dropdeactivate',\n 'dropmove',\n 'drop',\n]);\nactions.methodDict.drop = 'dropzone';\n\ndefaultOptions.drop = drop.defaults;\n\nmodule.exports = drop;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst gesture = {\n defaults: {\n enabled : false,\n origin : null,\n restrict: null,\n },\n\n checker: function (pointer, event, interactable, element, interaction) {\n if (interaction.pointerIds.length >= 2) {\n return { name: 'gesture' };\n }\n\n return null;\n },\n\n getCursor: function () {\n return '';\n },\n};\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturestart') { return; }\n iEvent.ds = 0;\n\n interaction.gesture.startDistance = interaction.gesture.prevDistance = iEvent.distance;\n interaction.gesture.startAngle = interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.scale = 1;\n});\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturemove') { return; }\n\n iEvent.ds = iEvent.scale - interaction.gesture.scale;\n\n interaction.target.fire(iEvent);\n\n interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.prevDistance = iEvent.distance;\n\n if (iEvent.scale !== Infinity\n && iEvent.scale !== null\n && iEvent.scale !== undefined\n && !isNaN(iEvent.scale)) {\n\n interaction.gesture.scale = iEvent.scale;\n }\n});\n\n/*\\\n * Interactable.gesturable\n [ method ]\n *\n * Gets or sets whether multitouch gestures can be performed on the\n * Interactable's element\n *\n = (boolean) Indicates if this can be the target of gesture events\n | var isGestureable = interact(element).gesturable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on gesture events (makes the Interactable gesturable)\n = (object) this Interactable\n | interact(element).gesturable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // limit multiple gestures.\n | // See the explanation in @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n\\*/\nInteractable.prototype.gesturable = function (options) {\n if (utils.is.object(options)) {\n this.options.gesture.enabled = options.enabled === false? false: true;\n this.setPerAction('gesture', options);\n this.setOnEvents('gesture', options);\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.gesture.enabled = options;\n\n if (!options) {\n this.ongesturestart = this.ongesturestart = this.ongestureend = null;\n }\n\n return this;\n }\n\n return this.options.gesture;\n};\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action, event, starting, ending, deltaSource }) {\n if (action !== 'gesture') { return; }\n\n const pointers = interaction.pointers;\n\n iEvent.touches = [pointers[0], pointers[1]];\n\n if (starting) {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = 1;\n iEvent.ds = 0;\n iEvent.angle = utils.touchAngle(pointers, undefined, deltaSource);\n iEvent.da = 0;\n }\n else if (ending || event instanceof InteractEvent) {\n iEvent.distance = interaction.prevEvent.distance;\n iEvent.box = interaction.prevEvent.box;\n iEvent.scale = interaction.prevEvent.scale;\n iEvent.ds = iEvent.scale - 1;\n iEvent.angle = interaction.prevEvent.angle;\n iEvent.da = iEvent.angle - interaction.gesture.startAngle;\n }\n else {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = iEvent.distance / interaction.gesture.startDistance;\n iEvent.angle = utils.touchAngle(pointers, interaction.gesture.prevAngle, deltaSource);\n\n iEvent.ds = iEvent.scale - interaction.gesture.prevScale;\n iEvent.da = iEvent.angle - interaction.gesture.prevAngle;\n }\n});\n\nInteraction.signals.on('new', function (interaction) {\n interaction.gesture = {\n start: { x: 0, y: 0 },\n\n startDistance: 0, // distance between two touches of touchStart\n prevDistance : 0,\n distance : 0,\n\n scale: 1, // gesture.distance / gesture.startDistance\n\n startAngle: 0, // angle of line joining two touches\n prevAngle : 0, // angle of the previous gesture event\n };\n});\n\nactions.gesture = gesture;\nactions.names.push('gesture');\nutils.merge(Interactable.eventTypes, [\n 'gesturestart',\n 'gesturemove',\n 'gestureend',\n]);\nactions.methodDict.gesture = 'gesturable';\n\ndefaultOptions.gesture = gesture.defaults;\n\nmodule.exports = gesture;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\n// Less Precision with touch input\nconst defaultMargin = browser.supportsTouch || browser.supportsPointerEvent? 20: 10;\n\nconst resize = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n square: false,\n preserveAspectRatio: false,\n axis: 'xy',\n\n // use default margin\n margin: NaN,\n\n // object with props left, right, top, bottom which are\n // true/false values to resize when the pointer is over that edge,\n // CSS selectors to match the handles for each direction\n // or the Elements for each handle\n edges: null,\n\n // a value of 'none' will limit the resize rect to a minimum of 0x0\n // 'negate' will alow the rect to have negative width/height\n // 'reposition' will keep the width/height positive by swapping\n // the top and bottom edges and/or swapping the left and right edges\n invert: 'none',\n },\n\n checker: function (pointer, event, interactable, element, interaction, rect) {\n if (!rect) { return null; }\n\n const page = utils.extend({}, interaction.curCoords.page);\n const options = interactable.options;\n\n if (options.resize.enabled) {\n const resizeOptions = options.resize;\n const resizeEdges = { left: false, right: false, top: false, bottom: false };\n\n // if using resize.edges\n if (utils.is.object(resizeOptions.edges)) {\n for (const edge in resizeEdges) {\n resizeEdges[edge] = checkResizeEdge(edge,\n resizeOptions.edges[edge],\n page,\n interaction._eventTarget,\n element,\n rect,\n resizeOptions.margin || defaultMargin);\n }\n\n resizeEdges.left = resizeEdges.left && !resizeEdges.right;\n resizeEdges.top = resizeEdges.top && !resizeEdges.bottom;\n\n if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) {\n return {\n name: 'resize',\n edges: resizeEdges,\n };\n }\n }\n else {\n const right = options.resize.axis !== 'y' && page.x > (rect.right - defaultMargin);\n const bottom = options.resize.axis !== 'x' && page.y > (rect.bottom - defaultMargin);\n\n if (right || bottom) {\n return {\n name: 'resize',\n axes: (right? 'x' : '') + (bottom? 'y' : ''),\n };\n }\n }\n }\n\n return null;\n },\n\n cursors: (browser.isIe9OrOlder ? {\n x : 'e-resize',\n y : 's-resize',\n xy: 'se-resize',\n\n top : 'n-resize',\n left : 'w-resize',\n bottom : 's-resize',\n right : 'e-resize',\n topleft : 'se-resize',\n bottomright: 'se-resize',\n topright : 'ne-resize',\n bottomleft : 'ne-resize',\n } : {\n x : 'ew-resize',\n y : 'ns-resize',\n xy: 'nwse-resize',\n\n top : 'ns-resize',\n left : 'ew-resize',\n bottom : 'ns-resize',\n right : 'ew-resize',\n topleft : 'nwse-resize',\n bottomright: 'nwse-resize',\n topright : 'nesw-resize',\n bottomleft : 'nesw-resize',\n }),\n\n getCursor: function (action) {\n if (action.axis) {\n return resize.cursors[action.name + action.axis];\n }\n else if (action.edges) {\n let cursorKey = '';\n const edgeNames = ['top', 'bottom', 'left', 'right'];\n\n for (let i = 0; i < 4; i++) {\n if (action.edges[edgeNames[i]]) {\n cursorKey += edgeNames[i];\n }\n }\n\n return resize.cursors[cursorKey];\n }\n },\n};\n\n// resizestart\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'resizestart' || !interaction.prepared.edges) {\n return;\n }\n\n const startRect = interaction.target.getRect(interaction.element);\n const resizeOptions = interaction.target.options.resize;\n\n /*\n * When using the `resizable.square` or `resizable.preserveAspectRatio` options, resizing from one edge\n * will affect another. E.g. with `resizable.square`, resizing to make the right edge larger will make\n * the bottom edge larger by the same amount. We call these 'linked' edges. Any linked edges will depend\n * on the active edges and the edge being interacted with.\n */\n if (resizeOptions.square || resizeOptions.preserveAspectRatio) {\n const linkedEdges = utils.extend({}, interaction.prepared.edges);\n\n linkedEdges.top = linkedEdges.top || (linkedEdges.left && !linkedEdges.bottom);\n linkedEdges.left = linkedEdges.left || (linkedEdges.top && !linkedEdges.right );\n linkedEdges.bottom = linkedEdges.bottom || (linkedEdges.right && !linkedEdges.top );\n linkedEdges.right = linkedEdges.right || (linkedEdges.bottom && !linkedEdges.left );\n\n interaction.prepared._linkedEdges = linkedEdges;\n }\n else {\n interaction.prepared._linkedEdges = null;\n }\n\n // if using `resizable.preserveAspectRatio` option, record aspect ratio at the start of the resize\n if (resizeOptions.preserveAspectRatio) {\n interaction.resizeStartAspectRatio = startRect.width / startRect.height;\n }\n\n interaction.resizeRects = {\n start : startRect,\n current : utils.extend({}, startRect),\n inverted : utils.extend({}, startRect),\n previous : utils.extend({}, startRect),\n delta : {\n left: 0, right : 0, width : 0,\n top : 0, bottom: 0, height: 0,\n },\n };\n\n iEvent.rect = interaction.resizeRects.inverted;\n iEvent.deltaRect = interaction.resizeRects.delta;\n});\n\n// resizemove\nInteractEvent.signals.on('new', function ({ iEvent, phase, interaction }) {\n if (phase !== 'move' || !interaction.prepared.edges) { return; }\n\n const resizeOptions = interaction.target.options.resize;\n const invert = resizeOptions.invert;\n const invertible = invert === 'reposition' || invert === 'negate';\n\n let edges = interaction.prepared.edges;\n\n const start = interaction.resizeRects.start;\n const current = interaction.resizeRects.current;\n const inverted = interaction.resizeRects.inverted;\n const delta = interaction.resizeRects.delta;\n const previous = utils.extend(interaction.resizeRects.previous, inverted);\n const originalEdges = edges;\n\n let dx = iEvent.dx;\n let dy = iEvent.dy;\n\n if (resizeOptions.preserveAspectRatio || resizeOptions.square) {\n // `resize.preserveAspectRatio` takes precedence over `resize.square`\n const startAspectRatio = resizeOptions.preserveAspectRatio\n ? interaction.resizeStartAspectRatio\n : 1;\n\n edges = interaction.prepared._linkedEdges;\n\n if ((originalEdges.left && originalEdges.bottom)\n || (originalEdges.right && originalEdges.top)) {\n dy = -dx / startAspectRatio;\n }\n else if (originalEdges.left || originalEdges.right ) { dy = dx / startAspectRatio; }\n else if (originalEdges.top || originalEdges.bottom) { dx = dy * startAspectRatio; }\n }\n\n // update the 'current' rect without modifications\n if (edges.top ) { current.top += dy; }\n if (edges.bottom) { current.bottom += dy; }\n if (edges.left ) { current.left += dx; }\n if (edges.right ) { current.right += dx; }\n\n if (invertible) {\n // if invertible, copy the current rect\n utils.extend(inverted, current);\n\n if (invert === 'reposition') {\n // swap edge values if necessary to keep width/height positive\n let swap;\n\n if (inverted.top > inverted.bottom) {\n swap = inverted.top;\n\n inverted.top = inverted.bottom;\n inverted.bottom = swap;\n }\n if (inverted.left > inverted.right) {\n swap = inverted.left;\n\n inverted.left = inverted.right;\n inverted.right = swap;\n }\n }\n }\n else {\n // if not invertible, restrict to minimum of 0x0 rect\n inverted.top = Math.min(current.top, start.bottom);\n inverted.bottom = Math.max(current.bottom, start.top);\n inverted.left = Math.min(current.left, start.right);\n inverted.right = Math.max(current.right, start.left);\n }\n\n inverted.width = inverted.right - inverted.left;\n inverted.height = inverted.bottom - inverted.top ;\n\n for (const edge in inverted) {\n delta[edge] = inverted[edge] - previous[edge];\n }\n\n iEvent.edges = interaction.prepared.edges;\n iEvent.rect = inverted;\n iEvent.deltaRect = delta;\n});\n\n/*\\\n * Interactable.resizable\n [ method ]\n *\n * Gets or sets whether resize actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of resize elements\n | var isResizeable = interact('input[type=text]').resizable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on resize events (object makes the Interactable resizable)\n = (object) This Interactable\n | interact(element).resizable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | edges: {\n | top : true, // Use pointer coords to check for resize.\n | left : false, // Disable resizing from left edge.\n | bottom: '.resize-s',// Resize if pointer target matches selector\n | right : handleEl // Resize if pointer target is the given Element\n | },\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height are adjusted at a 1:1 ratio.\n | square: false,\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height maintain the aspect ratio they had when resizing started.\n | preserveAspectRatio: false,\n |\n | // a value of 'none' will limit the resize rect to a minimum of 0x0\n | // 'negate' will allow the rect to have negative width/height\n | // 'reposition' will keep the width/height positive by swapping\n | // the top and bottom edges and/or swapping the left and right edges\n | invert: 'none' || 'negate' || 'reposition'\n |\n | // limit multiple resizes.\n | // See the explanation in the @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n \\*/\nInteractable.prototype.resizable = function (options) {\n if (utils.is.object(options)) {\n this.options.resize.enabled = options.enabled === false? false: true;\n this.setPerAction('resize', options);\n this.setOnEvents('resize', options);\n\n if (/^x$|^y$|^xy$/.test(options.axis)) {\n this.options.resize.axis = options.axis;\n }\n else if (options.axis === null) {\n this.options.resize.axis = defaultOptions.resize.axis;\n }\n\n if (utils.is.bool(options.preserveAspectRatio)) {\n this.options.resize.preserveAspectRatio = options.preserveAspectRatio;\n }\n else if (utils.is.bool(options.square)) {\n this.options.resize.square = options.square;\n }\n\n return this;\n }\n if (utils.is.bool(options)) {\n this.options.resize.enabled = options;\n\n if (!options) {\n this.onresizestart = this.onresizestart = this.onresizeend = null;\n }\n\n return this;\n }\n return this.options.resize;\n};\n\nfunction checkResizeEdge (name, value, page, element, interactableElement, rect, margin) {\n // false, '', undefined, null\n if (!value) { return false; }\n\n // true value, use pointer coords and element rect\n if (value === true) {\n // if dimensions are negative, \"switch\" edges\n const width = utils.is.number(rect.width )? rect.width : rect.right - rect.left;\n const height = utils.is.number(rect.height)? rect.height : rect.bottom - rect.top ;\n\n if (width < 0) {\n if (name === 'left' ) { name = 'right'; }\n else if (name === 'right') { name = 'left' ; }\n }\n if (height < 0) {\n if (name === 'top' ) { name = 'bottom'; }\n else if (name === 'bottom') { name = 'top' ; }\n }\n\n if (name === 'left' ) { return page.x < ((width >= 0? rect.left: rect.right ) + margin); }\n if (name === 'top' ) { return page.y < ((height >= 0? rect.top : rect.bottom) + margin); }\n\n if (name === 'right' ) { return page.x > ((width >= 0? rect.right : rect.left) - margin); }\n if (name === 'bottom') { return page.y > ((height >= 0? rect.bottom: rect.top ) - margin); }\n }\n\n // the remaining checks require an element\n if (!utils.is.element(element)) { return false; }\n\n return utils.is.element(value)\n // the value is an element to use as a resize handle\n ? value === element\n // otherwise check if element matches value as selector\n : utils.matchesUpTo(element, value, interactableElement);\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.resizeAxes = 'xy';\n});\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action }) {\n if (action !== 'resize' || !interaction.resizeAxes) { return; }\n\n const options = interaction.target.options;\n\n if (options.resize.square) {\n if (interaction.resizeAxes === 'y') {\n iEvent.dx = iEvent.dy;\n }\n else {\n iEvent.dy = iEvent.dx;\n }\n iEvent.axes = 'xy';\n }\n else {\n iEvent.axes = interaction.resizeAxes;\n\n if (interaction.resizeAxes === 'x') {\n iEvent.dy = 0;\n }\n else if (interaction.resizeAxes === 'y') {\n iEvent.dx = 0;\n }\n }\n});\n\nactions.resize = resize;\nactions.names.push('resize');\nutils.merge(Interactable.eventTypes, [\n 'resizestart',\n 'resizemove',\n 'resizeinertiastart',\n 'resizeinertiaresume',\n 'resizeend',\n]);\nactions.methodDict.resize = 'resizable';\n\ndefaultOptions.resize = resize.defaults;\n\nmodule.exports = resize;\n","const raf = require('./utils/raf');\nconst getWindow = require('./utils/window').getWindow;\nconst is = require('./utils/is');\nconst domUtils = require('./utils/domUtils');\nconst Interaction = require('./Interaction');\nconst defaultOptions = require('./defaultOptions');\n\nconst autoScroll = {\n defaults: {\n enabled : false,\n container: null, // the item that is scrolled (Window or HTMLElement)\n margin : 60,\n speed : 300, // the scroll speed in pixels per second\n },\n\n interaction: null,\n i: null, // the handle returned by window.setInterval\n x: 0, y: 0, // Direction each pulse is to scroll in\n\n isScrolling: false,\n prevTime: 0,\n\n start: function (interaction) {\n autoScroll.isScrolling = true;\n raf.cancel(autoScroll.i);\n\n autoScroll.interaction = interaction;\n autoScroll.prevTime = new Date().getTime();\n autoScroll.i = raf.request(autoScroll.scroll);\n },\n\n stop: function () {\n autoScroll.isScrolling = false;\n raf.cancel(autoScroll.i);\n },\n\n // scroll the window by the values in scroll.x/y\n scroll: function () {\n const options = autoScroll.interaction.target.options[autoScroll.interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(autoScroll.interaction.element);\n const now = new Date().getTime();\n // change in time in seconds\n const dt = (now - autoScroll.prevTime) / 1000;\n // displacement\n const s = options.speed * dt;\n\n if (s >= 1) {\n if (is.window(container)) {\n container.scrollBy(autoScroll.x * s, autoScroll.y * s);\n }\n else if (container) {\n container.scrollLeft += autoScroll.x * s;\n container.scrollTop += autoScroll.y * s;\n }\n\n autoScroll.prevTime = now;\n }\n\n if (autoScroll.isScrolling) {\n raf.cancel(autoScroll.i);\n autoScroll.i = raf.request(autoScroll.scroll);\n }\n },\n check: function (interactable, actionName) {\n const options = interactable.options;\n\n return options[actionName].autoScroll && options[actionName].autoScroll.enabled;\n },\n onInteractionMove: function ({ interaction, pointer }) {\n if (!(interaction.interacting()\n && autoScroll.check(interaction.target, interaction.prepared.name))) {\n return;\n }\n\n if (interaction.simulation) {\n autoScroll.x = autoScroll.y = 0;\n return;\n }\n\n let top;\n let right;\n let bottom;\n let left;\n\n const options = interaction.target.options[interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(interaction.element);\n\n if (is.window(container)) {\n left = pointer.clientX < autoScroll.margin;\n top = pointer.clientY < autoScroll.margin;\n right = pointer.clientX > container.innerWidth - autoScroll.margin;\n bottom = pointer.clientY > container.innerHeight - autoScroll.margin;\n }\n else {\n const rect = domUtils.getElementClientRect(container);\n\n left = pointer.clientX < rect.left + autoScroll.margin;\n top = pointer.clientY < rect.top + autoScroll.margin;\n right = pointer.clientX > rect.right - autoScroll.margin;\n bottom = pointer.clientY > rect.bottom - autoScroll.margin;\n }\n\n autoScroll.x = (right ? 1: left? -1: 0);\n autoScroll.y = (bottom? 1: top? -1: 0);\n\n if (!autoScroll.isScrolling) {\n // set the autoScroll properties to those of the target\n autoScroll.margin = options.margin;\n autoScroll.speed = options.speed;\n\n autoScroll.start(interaction);\n }\n },\n};\n\nInteraction.signals.on('stop-active', function () {\n autoScroll.stop();\n});\n\nInteraction.signals.on('action-move', autoScroll.onInteractionMove);\n\ndefaultOptions.perAction.autoScroll = autoScroll.defaults;\n\nmodule.exports = autoScroll;\n","const Interactable = require('../Interactable');\nconst actions = require('../actions/base');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.ignoreFrom\n [ method ]\n *\n * If the target of the `mousedown`, `pointerdown` or `touchstart`\n * event or any of it's parents match the given CSS selector or\n * Element, no drag/resize/gesture is started.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to not ignore any elements\n = (string | Element | object) The current ignoreFrom value or this Interactable\n **\n | interact(element, { ignoreFrom: document.getElementById('no-action') });\n | // or\n | interact(element).ignoreFrom('input, textarea, a');\n\\*/\nInteractable.prototype.ignoreFrom = function (newValue) {\n return this._backCompatOption('ignoreFrom', newValue);\n};\n\n/*\\\n * Interactable.allowFrom\n [ method ]\n *\n * A drag/resize/gesture is started only If the target of the\n * `mousedown`, `pointerdown` or `touchstart` event or any of it's\n * parents match the given CSS selector or Element.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to allow from any element\n = (string | Element | object) The current allowFrom value or this Interactable\n **\n | interact(element, { allowFrom: document.getElementById('drag-handle') });\n | // or\n | interact(element).allowFrom('.handle');\n\\*/\nInteractable.prototype.allowFrom = function (newValue) {\n return this._backCompatOption('allowFrom', newValue);\n};\n\nInteractable.prototype.testIgnore = function (ignoreFrom, interactableElement, element) {\n if (!ignoreFrom || !is.element(element)) { return false; }\n\n if (is.string(ignoreFrom)) {\n return domUtils.matchesUpTo(element, ignoreFrom, interactableElement);\n }\n else if (is.element(ignoreFrom)) {\n return domUtils.nodeContains(ignoreFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testAllow = function (allowFrom, interactableElement, element) {\n if (!allowFrom) { return true; }\n\n if (!is.element(element)) { return false; }\n\n if (is.string(allowFrom)) {\n return domUtils.matchesUpTo(element, allowFrom, interactableElement);\n }\n else if (is.element(allowFrom)) {\n return domUtils.nodeContains(allowFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testIgnoreAllow = function (options, interactableElement, eventTarget) {\n return (!this.testIgnore(options.ignoreFrom, interactableElement, eventTarget)\n && this.testAllow(options.allowFrom, interactableElement, eventTarget));\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (event.buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\n","const interact = require('../interact');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst actions = require('../actions/base');\nconst defaultOptions = require('../defaultOptions');\nconst browser = require('../utils/browser');\nconst scope = require('../scope');\nconst utils = require('../utils');\nconst signals = require('../utils/Signals').new();\n\nrequire('./InteractableMethods');\n\nconst autoStart = {\n signals,\n withinInteractionLimit,\n // Allow this many interactions to happen simultaneously\n maxInteractions: Infinity,\n defaults: {\n perAction: {\n manualStart: false,\n max: Infinity,\n maxPerElement: 1,\n allowFrom: null,\n ignoreFrom: null,\n },\n },\n setActionDefaults: function (action) {\n utils.extend(action.defaults, autoStart.defaults.perAction);\n },\n};\n\n// set cursor style on mousedown\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget }) {\n if (interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\n// set cursor style on mousemove\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget }) {\n if (!interaction.mouse\n || interaction.pointerIsDown\n || interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\nInteraction.signals.on('move', function (arg) {\n const { interaction, event } = arg;\n\n if (!interaction.pointerIsDown\n || interaction.interacting()\n || !interaction.pointerWasMoved\n || !interaction.prepared.name) {\n return;\n }\n\n signals.fire('before-start', arg);\n\n const target = interaction.target;\n\n if (interaction.prepared.name && target) {\n // check manualStart and interaction limit\n if (target.options[interaction.prepared.name].manualStart\n || !withinInteractionLimit(target, interaction.element, interaction.prepared)) {\n interaction.stop(event);\n }\n else {\n interaction.start(interaction.prepared, target, interaction.element);\n }\n }\n});\n\n// Check if the current target supports the action.\n// If so, return the validated action. Otherwise, return null\nfunction validateAction (action, interactable, element, eventTarget) {\n if (utils.is.object(action)\n && interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget)\n && interactable.options[action.name].enabled\n && withinInteractionLimit(interactable, element, action)) {\n return action;\n }\n\n return null;\n}\n\nfunction validateSelector (interaction, pointer, event, matches, matchElements, eventTarget) {\n for (let i = 0, len = matches.length; i < len; i++) {\n const match = matches[i];\n const matchElement = matchElements[i];\n const action = validateAction(match.getAction(pointer, event, interaction, matchElement),\n match,\n matchElement,\n eventTarget);\n\n if (action) {\n return {\n action,\n target: match,\n element: matchElement,\n };\n }\n }\n\n return {};\n}\n\nfunction getActionInfo (interaction, pointer, event, eventTarget) {\n let matches = [];\n let matchElements = [];\n\n let element = eventTarget;\n let action = null;\n\n function pushMatches (interactable, selector, context) {\n const elements = (browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined);\n\n if (utils.matchesSelector(element, selector, elements)) {\n\n matches.push(interactable);\n matchElements.push(element);\n }\n }\n\n while (utils.is.element(element)) {\n matches = [];\n matchElements = [];\n\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && (action = validateAction(elementInteractable.getAction(pointer, event, interaction, element, eventTarget),\n elementInteractable,\n element,\n eventTarget))\n && !elementInteractable.options[action.name].manualStart) {\n return {\n element,\n action,\n target: elementInteractable,\n };\n }\n else {\n scope.interactables.forEachSelector(pushMatches, element);\n\n const actionInfo = validateSelector(interaction, pointer, event, matches, matchElements, eventTarget);\n\n if (actionInfo.action\n && !actionInfo.target.options[actionInfo.action.name].manualStart) {\n return actionInfo;\n }\n }\n\n element = utils.parentNode(element);\n }\n\n return {};\n}\n\nfunction prepare (interaction, { action, target, element }) {\n action = action || {};\n\n if (interaction.target && interaction.target.options.styleCursor) {\n interaction.target._doc.documentElement.style.cursor = '';\n }\n\n interaction.target = target;\n interaction.element = element;\n utils.copyAction(interaction.prepared, action);\n\n if (target && target.options.styleCursor) {\n const cursor = action? actions[action.name].getCursor(action) : '';\n interaction.target._doc.documentElement.style.cursor = cursor;\n }\n\n signals.fire('prepared', { interaction: interaction });\n}\n\nInteraction.signals.on('stop', function ({ interaction }) {\n const target = interaction.target;\n\n if (target && target.options.styleCursor) {\n target._doc.documentElement.style.cursor = '';\n }\n});\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (utils.is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (utils.is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n const buttons = event.buttons || ({\n 0: 1,\n 1: 4,\n 3: 8,\n 4: 16,\n })[event.button];\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\nfunction withinInteractionLimit (interactable, element, action) {\n const options = interactable.options;\n const maxActions = options[action.name].max;\n const maxPerElement = options[action.name].maxPerElement;\n let activeInteractions = 0;\n let targetCount = 0;\n let targetElementCount = 0;\n\n // no actions if any of these values == 0\n if (!(maxActions && maxPerElement && autoStart.maxInteractions)) { return; }\n\n for (let i = 0, len = scope.interactions.length; i < len; i++) {\n const interaction = scope.interactions[i];\n const otherAction = interaction.prepared.name;\n\n if (!interaction.interacting()) { continue; }\n\n activeInteractions++;\n\n if (activeInteractions >= autoStart.maxInteractions) {\n return false;\n }\n\n if (interaction.target !== interactable) { continue; }\n\n targetCount += (otherAction === action.name)|0;\n\n if (targetCount >= maxActions) {\n return false;\n }\n\n if (interaction.element === element) {\n targetElementCount++;\n\n if (otherAction !== action.name || targetElementCount >= maxPerElement) {\n return false;\n }\n }\n }\n\n return autoStart.maxInteractions > 0;\n}\n\n/*\\\n * interact.maxInteractions\n [ method ]\n **\n * Returns or sets the maximum number of concurrent interactions allowed.\n * By default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables\n * and elements, you need to enable it in the draggable, resizable and\n * gesturable `'max'` and `'maxPerElement'` options.\n **\n - newValue (number) #optional Any number. newValue <= 0 means no interactions.\n\\*/\ninteract.maxInteractions = function (newValue) {\n if (utils.is.number(newValue)) {\n autoStart.maxInteractions = newValue;\n\n return this;\n }\n\n return autoStart.maxInteractions;\n};\n\nInteractable.settingsMethods.push('styleCursor');\nInteractable.settingsMethods.push('actionChecker');\nInteractable.settingsMethods.push('ignoreFrom');\nInteractable.settingsMethods.push('allowFrom');\n\ndefaultOptions.base.actionChecker = null;\ndefaultOptions.base.styleCursor = true;\n\nutils.extend(defaultOptions.perAction, autoStart.defaults.perAction);\n\nmodule.exports = autoStart;\n","const autoStart = require('./base');\nconst Interaction = require('../Interaction');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.delayTimer = null;\n});\n\nautoStart.signals.on('prepared', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.delayTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.target, interaction.element);\n }, delay);\n }\n});\n\nInteraction.signals.on('move', function ({ interaction, duplicate }) {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.delayTimer);\n }\n});\n\n// prevent regular down->move autoStart\nautoStart.signals.on('before-start', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.prepared.name = null;\n }\n});\n","const autoStart = require('./base');\nconst scope = require('../scope');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\n\nconst { matchesSelector, parentNode } = require('../utils/domUtils');\n\nautoStart.setActionDefaults(require('../actions/drag'));\n\nautoStart.signals.on('before-start', function ({ interaction, eventTarget, dx, dy }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // check if a drag is in the correct axis\n const absX = Math.abs(dx);\n const absY = Math.abs(dy);\n const options = interaction.target.options.drag;\n const startAxis = options.startAxis;\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy');\n\n interaction.prepared.axis = options.lockAxis === 'start'\n ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n : options.lockAxis;\n\n // if the movement isn't in the startAxis of the interactable\n if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) {\n // cancel the prepared action\n interaction.prepared.name = null;\n\n // then try to get a drag from another ineractable\n\n if (!interaction.prepared.name) {\n\n let element = eventTarget;\n\n const getDraggable = function (interactable, selector, context) {\n const elements = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n if (interactable === interaction.target) { return; }\n\n if (!options.manualStart\n && !interactable.testIgnoreAllow(options, element, eventTarget)\n && matchesSelector(element, selector, elements)) {\n\n const action = interactable.getAction(interaction.downPointer,\n interaction.downEvent,\n interaction,\n element);\n\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, interactable)\n && autoStart.validateAction(action, interactable, element, eventTarget)) {\n\n return interactable;\n }\n }\n };\n\n let action = null;\n\n // check all interactables\n while (is.element(element)) {\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && elementInteractable !== interaction.target\n && !elementInteractable.options.drag.manualStart) {\n\n action = elementInteractable.getAction(interaction.downPointer, interaction.downEvent, interaction, element);\n }\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, elementInteractable)) {\n\n interaction.prepared.name = 'drag';\n interaction.target = elementInteractable;\n interaction.element = element;\n break;\n }\n\n const selectorInteractable = scope.interactables.forEachSelector(getDraggable, element);\n\n if (selectorInteractable) {\n interaction.prepared.name = 'drag';\n interaction.target = selectorInteractable;\n interaction.element = element;\n break;\n }\n\n element = parentNode(element);\n }\n }\n }\n});\n\nfunction checkStartAxis (startAxis, interactable) {\n if (!interactable) { return false; }\n\n const thisAxis = interactable.options.drag.startAxis;\n\n return (startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis);\n}\n","require('./base').setActionDefaults(require('../actions/gesture'));\n","require('./base').setActionDefaults(require('../actions/resize'));\n","module.exports = {\n base: {\n accept : null,\n preventDefault: 'auto',\n deltaSource : 'page',\n },\n\n perAction: {\n origin: { x: 0, y: 0 },\n\n // only allow left button by default\n // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n mouseButtons: 1,\n\n inertia: {\n enabled : false,\n resistance : 10, // the lambda in exponential decay\n minSpeed : 100, // target speed must be above this for inertia to start\n endSpeed : 10, // the speed at which inertia is slow enough to stop\n allowResume : true, // allow resuming an action in inertia phase\n smoothEndDuration: 300, // animate to snap/restrict endOnly if there's no inertia\n },\n },\n};\n","/* browser entry point */\n\n// Legacy browser support\nrequire('./legacyBrowsers');\n\n// inertia\nrequire('./inertia');\n\n// modifiers\nrequire('./modifiers/snap');\nrequire('./modifiers/restrict');\n\n// pointerEvents\nrequire('./pointerEvents/base');\nrequire('./pointerEvents/holdRepeat');\nrequire('./pointerEvents/interactableTargets');\n\n// delay\nrequire('./autoStart/delay');\n\n// actions\nrequire('./actions/gesture');\nrequire('./actions/resize');\nrequire('./actions/drag');\nrequire('./actions/drop');\n\n// load these modifiers after resize is loaded\nrequire('./modifiers/snapSize');\nrequire('./modifiers/restrictEdges');\nrequire('./modifiers/restrictSize');\n\n// autoStart actions\nrequire('./autoStart/gesture');\nrequire('./autoStart/resize');\nrequire('./autoStart/drag');\n\n// Interactable preventDefault setting\nrequire('./interactablePreventDefault.js');\n\n// autoScroll\nrequire('./autoScroll');\n\n// export interact\nmodule.exports = require('./interact');\n","const InteractEvent = require('./InteractEvent');\nconst Interaction = require('./Interaction');\nconst modifiers = require('./modifiers');\nconst utils = require('./utils');\nconst animationFrame = require('./utils/raf');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.inertiaStatus = {\n active : false,\n smoothEnd : false,\n allowResume: false,\n\n startEvent: null,\n upCoords : {},\n\n xe: 0, ye: 0,\n sx: 0, sy: 0,\n\n t0: 0,\n vx0: 0, vys: 0,\n duration: 0,\n\n lambda_v0: 0,\n one_ve_v0: 0,\n i : null,\n };\n\n interaction.boundInertiaFrame = () => inertiaFrame .apply(interaction);\n interaction.boundSmoothEndFrame = () => smoothEndFrame.apply(interaction);\n});\n\nInteraction.signals.on('down', function ({ interaction, event, pointer, eventTarget }) {\n const status = interaction.inertiaStatus;\n\n // Check if the down event hits the current inertia target\n if (status.active) {\n let element = eventTarget;\n\n // climb up the DOM tree from the event target\n while (utils.is.element(element)) {\n\n // if interaction element is the current inertia target element\n if (element === interaction.element) {\n // stop inertia\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n\n // update pointers to the down event's coordinates\n interaction.updatePointer(pointer);\n utils.setCoords(interaction.curCoords, interaction.pointers);\n\n // fire appropriate signals\n const signalArg = { interaction };\n Interaction.signals.fire('before-action-move', signalArg);\n Interaction.signals.fire('action-resume' , signalArg);\n\n // fire a reume event\n const resumeEvent = new InteractEvent(interaction,\n event,\n interaction.prepared.name,\n 'inertiaresume',\n interaction.element);\n\n interaction.target.fire(resumeEvent);\n interaction.prevEvent = resumeEvent;\n modifiers.resetStatuses(interaction.modifierStatuses);\n\n utils.copyCoords(interaction.prevCoords, interaction.curCoords);\n break;\n }\n\n element = utils.parentNode(element);\n }\n }\n});\n\nInteraction.signals.on('up', function ({ interaction, event }) {\n const status = interaction.inertiaStatus;\n\n if (!interaction.interacting() || status.active) { return; }\n\n const target = interaction.target;\n const options = target && target.options;\n const inertiaOptions = options && interaction.prepared.name && options[interaction.prepared.name].inertia;\n\n const now = new Date().getTime();\n const statuses = {};\n const page = utils.extend({}, interaction.curCoords.page);\n const pointerSpeed = interaction.pointerDelta.client.speed;\n\n let smoothEnd = false;\n let modifierResult;\n\n // check if inertia should be started\n const inertiaPossible = (inertiaOptions && inertiaOptions.enabled\n && interaction.prepared.name !== 'gesture'\n && event !== status.startEvent);\n\n const inertia = (inertiaPossible\n && (now - interaction.curCoords.timeStamp) < 50\n && pointerSpeed > inertiaOptions.minSpeed\n && pointerSpeed > inertiaOptions.endSpeed);\n\n const modifierArg = {\n interaction,\n pageCoords: page,\n statuses,\n preEnd: true,\n requireEndOnly: true,\n };\n\n // smoothEnd\n if (inertiaPossible && !inertia) {\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n if (modifierResult.shouldMove && modifierResult.locked) {\n smoothEnd = true;\n }\n }\n\n if (!(inertia || smoothEnd)) { return; }\n\n utils.copyCoords(status.upCoords, interaction.curCoords);\n\n interaction.pointers[0] = status.startEvent =\n new InteractEvent(interaction, event, interaction.prepared.name, 'inertiastart', interaction.element);\n\n status.t0 = now;\n\n status.active = true;\n status.allowResume = inertiaOptions.allowResume;\n interaction.simulation = status;\n\n target.fire(status.startEvent);\n\n if (inertia) {\n status.vx0 = interaction.pointerDelta.client.vx;\n status.vy0 = interaction.pointerDelta.client.vy;\n status.v0 = pointerSpeed;\n\n calcInertia(interaction, status);\n\n utils.extend(page, interaction.curCoords.page);\n\n page.x += status.xe;\n page.y += status.ye;\n\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n status.modifiedXe += modifierResult.dx;\n status.modifiedYe += modifierResult.dy;\n\n status.i = animationFrame.request(interaction.boundInertiaFrame);\n }\n else {\n status.smoothEnd = true;\n status.xe = modifierResult.dx;\n status.ye = modifierResult.dy;\n\n status.sx = status.sy = 0;\n\n status.i = animationFrame.request(interaction.boundSmoothEndFrame);\n }\n});\n\nInteraction.signals.on('stop-active', function ({ interaction }) {\n const status = interaction.inertiaStatus;\n\n if (status.active) {\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n }\n});\n\nfunction calcInertia (interaction, status) {\n const inertiaOptions = interaction.target.options[interaction.prepared.name].inertia;\n const lambda = inertiaOptions.resistance;\n const inertiaDur = -Math.log(inertiaOptions.endSpeed / status.v0) / lambda;\n\n status.x0 = interaction.prevEvent.pageX;\n status.y0 = interaction.prevEvent.pageY;\n status.t0 = status.startEvent.timeStamp / 1000;\n status.sx = status.sy = 0;\n\n status.modifiedXe = status.xe = (status.vx0 - inertiaDur) / lambda;\n status.modifiedYe = status.ye = (status.vy0 - inertiaDur) / lambda;\n status.te = inertiaDur;\n\n status.lambda_v0 = lambda / status.v0;\n status.one_ve_v0 = 1 - inertiaOptions.endSpeed / status.v0;\n}\n\nfunction inertiaFrame () {\n updateInertiaCoords(this);\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n\n const status = this.inertiaStatus;\n const options = this.target.options[this.prepared.name].inertia;\n const lambda = options.resistance;\n const t = new Date().getTime() / 1000 - status.t0;\n\n if (t < status.te) {\n\n const progress = 1 - (Math.exp(-lambda * t) - status.lambda_v0) / status.one_ve_v0;\n\n if (status.modifiedXe === status.xe && status.modifiedYe === status.ye) {\n status.sx = status.xe * progress;\n status.sy = status.ye * progress;\n }\n else {\n const quadPoint = utils.getQuadraticCurvePoint(0, 0,\n status.xe,\n status.ye,\n status.modifiedXe,\n status.modifiedYe,\n progress);\n\n status.sx = quadPoint.x;\n status.sy = quadPoint.y;\n }\n\n this.doMove();\n\n status.i = animationFrame.request(this.boundInertiaFrame);\n }\n else {\n status.sx = status.modifiedXe;\n status.sy = status.modifiedYe;\n\n this.doMove();\n this.end(status.startEvent);\n status.active = false;\n this.simulation = null;\n }\n\n utils.copyCoords(this.prevCoords, this.curCoords);\n}\n\nfunction smoothEndFrame () {\n updateInertiaCoords(this);\n\n const status = this.inertiaStatus;\n const t = new Date().getTime() - status.t0;\n const duration = this.target.options[this.prepared.name].inertia.smoothEndDuration;\n\n if (t < duration) {\n status.sx = utils.easeOutQuad(t, 0, status.xe, duration);\n status.sy = utils.easeOutQuad(t, 0, status.ye, duration);\n\n this.pointerMove(status.startEvent, status.startEvent);\n\n status.i = animationFrame.request(this.boundSmoothEndFrame);\n }\n else {\n status.sx = status.xe;\n status.sy = status.ye;\n\n this.pointerMove(status.startEvent, status.startEvent);\n this.end(status.startEvent);\n\n status.smoothEnd =\n status.active = false;\n this.simulation = null;\n }\n}\n\nfunction updateInertiaCoords (interaction) {\n const status = interaction.inertiaStatus;\n\n // return if inertia isn't running\n if (!status.active) { return; }\n\n const pageUp = status.upCoords.page;\n const clientUp = status.upCoords.client;\n\n utils.setCoords(interaction.curCoords, [ {\n pageX : pageUp.x + status.sx,\n pageY : pageUp.y + status.sy,\n clientX: clientUp.x + status.sx,\n clientY: clientUp.y + status.sy,\n } ]);\n}\n","const browser = require('./utils/browser');\nconst events = require('./utils/events');\nconst utils = require('./utils');\nconst scope = require('./scope');\nconst Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\n\nconst globalEvents = {};\n\n/*\\\n * interact\n [ method ]\n *\n * The methods of this variable can be used to set elements as\n * interactables and also to change various default settings.\n *\n * Calling it as a function and passing an element or a valid CSS selector\n * string returns an Interactable object which has various methods to\n * configure it.\n *\n - element (Element | string) The HTML or SVG Element to interact with or CSS selector\n = (object) An @Interactable\n *\n > Usage\n | interact('#draggable').draggable(true);\n |\n | var rectables = interact('rect');\n | rectables\n | .gesturable(true)\n | .on('gesturemove', function (event) {\n | // ...\n | });\n\\*/\nfunction interact (element, options) {\n let interactable = scope.interactables.get(element, options);\n\n if (!interactable) {\n interactable = new Interactable(element, options);\n interactable.events.global = globalEvents;\n }\n\n return interactable;\n}\n\n/*\\\n * interact.isSet\n [ method ]\n *\n * Check if an element has been set\n - element (Element) The Element being searched for\n = (boolean) Indicates if the element or CSS selector was previously passed to interact\n\\*/\ninteract.isSet = function (element, options) {\n return scope.interactables.indexOfElement(element, options && options.context) !== -1;\n};\n\n/*\\\n * interact.on\n [ method ]\n *\n * Adds a global listener for an InteractEvent or adds a DOM event to\n * `document`\n *\n - type (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) interact\n\\*/\ninteract.on = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.on(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.on(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n // if it is an InteractEvent type, add listener to globalEvents\n if (utils.contains(Interactable.eventTypes, type)) {\n // if this type of event was never bound\n if (!globalEvents[type]) {\n globalEvents[type] = [listener];\n }\n else {\n globalEvents[type].push(listener);\n }\n }\n // If non InteractEvent type, addEventListener to document\n else {\n events.add(scope.document, type, listener, { options });\n }\n\n return interact;\n};\n\n/*\\\n * interact.off\n [ method ]\n *\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n - type (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) interact\n \\*/\ninteract.off = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.off(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.off(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n if (!utils.contains(Interactable.eventTypes, type)) {\n events.remove(scope.document, type, listener, options);\n }\n else {\n let index;\n\n if (type in globalEvents\n && (index = utils.indexOf(globalEvents[type], listener)) !== -1) {\n globalEvents[type].splice(index, 1);\n }\n }\n\n return interact;\n};\n\n/*\\\n * interact.debug\n [ method ]\n *\n * Returns an object which exposes internal data\n = (object) An object with properties that outline the current state and expose internal functions and variables\n\\*/\ninteract.debug = function () {\n return scope;\n};\n\n// expose the functions used to calculate multi-touch properties\ninteract.getPointerAverage = utils.pointerAverage;\ninteract.getTouchBBox = utils.touchBBox;\ninteract.getTouchDistance = utils.touchDistance;\ninteract.getTouchAngle = utils.touchAngle;\n\ninteract.getElementRect = utils.getElementRect;\ninteract.getElementClientRect = utils.getElementClientRect;\ninteract.matchesSelector = utils.matchesSelector;\ninteract.closest = utils.closest;\n\n/*\\\n * interact.supportsTouch\n [ method ]\n *\n = (boolean) Whether or not the browser supports touch input\n\\*/\ninteract.supportsTouch = function () {\n return browser.supportsTouch;\n};\n\n/*\\\n * interact.supportsPointerEvent\n [ method ]\n *\n = (boolean) Whether or not the browser supports PointerEvents\n\\*/\ninteract.supportsPointerEvent = function () {\n return browser.supportsPointerEvent;\n};\n\n/*\\\n * interact.stop\n [ method ]\n *\n * Cancels all interactions (end events are not fired)\n *\n - event (Event) An event on which to call preventDefault()\n = (object) interact\n\\*/\ninteract.stop = function (event) {\n for (let i = scope.interactions.length - 1; i >= 0; i--) {\n scope.interactions[i].stop(event);\n }\n\n return interact;\n};\n\n/*\\\n * interact.pointerMoveTolerance\n [ method ]\n * Returns or sets the distance the pointer must be moved before an action\n * sequence occurs. This also affects tolerance for tap events.\n *\n - newValue (number) #optional The movement from the start position must be greater than this value\n = (number | Interactable) The current setting or interact\n\\*/\ninteract.pointerMoveTolerance = function (newValue) {\n if (utils.is.number(newValue)) {\n Interaction.pointerMoveTolerance = newValue;\n\n return this;\n }\n\n return Interaction.pointerMoveTolerance;\n};\n\ninteract.addDocument = scope.addDocument;\ninteract.removeDocument = scope.removeDocument;\n\nscope.interact = interact;\n\nmodule.exports = interact;\n","const Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\nconst scope = require('./scope');\nconst is = require('./utils/is');\nconst events = require('./utils/events');\n\nconst { nodeContains, matchesSelector } = require('./utils/domUtils');\n\n/*\\\n * Interactable.preventDefault\n [ method ]\n *\n * Returns or sets whether to prevent the browser's default behaviour\n * in response to pointer events. Can be set to:\n * - `'always'` to always prevent\n * - `'never'` to never prevent\n * - `'auto'` to let interact.js try to determine what would be best\n *\n - newValue (string) #optional `true`, `false` or `'auto'`\n = (string | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.preventDefault = function (newValue) {\n if (/^(always|never|auto)$/.test(newValue)) {\n this.options.preventDefault = newValue;\n return this;\n }\n\n if (is.bool(newValue)) {\n this.options.preventDefault = newValue? 'always' : 'never';\n return this;\n }\n\n return this.options.preventDefault;\n};\n\nInteractable.prototype.checkAndPreventDefault = function (event) {\n const setting = this.options.preventDefault;\n\n if (setting === 'never') { return; }\n\n if (setting === 'always') {\n event.preventDefault();\n return;\n }\n\n // setting === 'auto'\n\n // don't preventDefault if the browser supports passiveEvents\n // CSS touch-action and user-selecct should be used instead\n if (events.supportsOptions) {\n return;\n }\n\n // don't preventDefault of pointerdown events\n if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) {\n return;\n }\n\n // don't preventDefault on editable elements\n if (is.element(event.target)\n && matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) {\n return;\n }\n\n event.preventDefault();\n};\n\nfunction onInteractionEvent ({ interaction, event }) {\n if (interaction.target) {\n interaction.target.checkAndPreventDefault(event);\n }\n}\n\nfor (const eventSignal of ['down', 'move', 'up', 'cancel']) {\n Interaction.signals.on(eventSignal, onInteractionEvent);\n}\n\n// prevent native HTML5 drag on interact.js target elements\nInteraction.docEvents.dragstart = function preventNativeDrag (event) {\n for (const interaction of scope.interactions) {\n\n if (interaction.element\n && (interaction.element === event.target\n || nodeContains(interaction.element, event.target))) {\n\n interaction.target.checkAndPreventDefault(event);\n return;\n }\n }\n};\n","const scope = require('./scope');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst iFinder = require('./utils/interactionFinder');\nconst pointerEvents = require('./pointerEvents/base');\n\nconst { window } = require('./utils/window');\n\nconst toString = Object.prototype.toString;\n\nif (!window.Array.isArray) {\n window.Array.isArray = function (obj) {\n return toString.call(obj) === '[object Array]';\n };\n}\n\nif (!String.prototype.trim) {\n String.prototype.trim = function () {\n return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n };\n}\n\n// http://www.quirksmode.org/dom/events/click.html\n// >Events leading to dblclick\n//\n// IE8 doesn't fire down event before dblclick.\n// This workaround tries to fire a tap and doubletap after dblclick\nfunction onIE8Dblclick (event) {\n const eventTarget = event.target;\n const interaction = iFinder.search(event, event.type, eventTarget);\n\n if (!interaction) { return; }\n\n if (interaction.prevTap\n && event.clientX === interaction.prevTap.clientX\n && event.clientY === interaction.prevTap.clientY\n && eventTarget === interaction.prevTap.target) {\n\n interaction.downTargets[0] = eventTarget;\n interaction.downTimes [0] = new Date().getTime();\n\n pointerEvents.fire({\n interaction,\n event,\n eventTarget,\n pointer: event,\n type: 'tap',\n });\n }\n}\n\nif (browser.isIE8) {\n const selectFix = function (event) {\n for (const interaction of scope.interactions) {\n if (interaction.interacting()) {\n interaction.target.checkAndPreventDefault(event);\n }\n }\n };\n\n const onDocIE8 = function onDocIE8 ({ doc, win }, signalName) {\n const eventMethod = signalName.indexOf('listen') === 0\n ? events.add : events.remove;\n\n // For IE's lack of Event#preventDefault\n eventMethod(doc, 'selectstart', selectFix);\n\n if (pointerEvents) {\n eventMethod(doc, 'dblclick', onIE8Dblclick);\n }\n };\n\n scope.signals.on('add-document' , onDocIE8);\n scope.signals.on('remove-document', onDocIE8);\n}\n\nmodule.exports = null;\n","const InteractEvent = require('../InteractEvent');\nconst Interaction = require('../Interaction');\nconst extend = require('../utils/extend');\n\nconst modifiers = {\n names: [],\n\n setOffsets: function (arg) {\n const { interaction, pageCoords: page } = arg;\n const { target, element, startOffset } = interaction;\n const rect = target.getRect(element);\n\n if (rect) {\n startOffset.left = page.x - rect.left;\n startOffset.top = page.y - rect.top;\n\n startOffset.right = rect.right - page.x;\n startOffset.bottom = rect.bottom - page.y;\n\n if (!('width' in rect)) { rect.width = rect.right - rect.left; }\n if (!('height' in rect)) { rect.height = rect.bottom - rect.top ; }\n }\n else {\n startOffset.left = startOffset.top = startOffset.right = startOffset.bottom = 0;\n }\n\n arg.rect = rect;\n arg.interactable = target;\n arg.element = element;\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n\n arg.options = target.options[interaction.prepared.name][modifierName];\n\n if (!arg.options) {\n continue;\n }\n\n interaction.modifierOffsets[modifierName] = modifiers[modifierName].setOffset(arg);\n }\n },\n\n setAll: function (arg) {\n const { interaction, statuses, preEnd, requireEndOnly } = arg;\n const coords = extend({}, arg.pageCoords);\n const result = {\n dx: 0,\n dy: 0,\n changed: false,\n locked: false,\n shouldMove: true,\n };\n\n for (const modifierName of modifiers.names) {\n const modifier = modifiers[modifierName];\n const options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!shouldDo(options, preEnd, requireEndOnly)) { continue; }\n\n arg.status = arg.status = statuses[modifierName];\n arg.options = options;\n arg.offset = arg.interaction.modifierOffsets[modifierName];\n\n modifier.set(arg);\n\n if (arg.status.locked) {\n coords.x += arg.status.dx;\n coords.y += arg.status.dy;\n\n result.dx += arg.status.dx;\n result.dy += arg.status.dy;\n\n result.locked = true;\n }\n }\n\n // a move should be fired if:\n // - there are no modifiers enabled,\n // - no modifiers are \"locked\" i.e. have changed the pointer's coordinates, or\n // - the locked coords have changed since the last pointer move\n result.shouldMove = !arg.status || !result.locked || arg.status.changed;\n\n return result;\n },\n\n resetStatuses: function (statuses) {\n for (const modifierName of modifiers.names) {\n const status = statuses[modifierName] || {};\n\n status.dx = status.dy = 0;\n status.modifiedX = status.modifiedY = NaN;\n status.locked = false;\n status.changed = true;\n\n statuses[modifierName] = status;\n }\n\n return statuses;\n },\n\n start: function ({ interaction }, signalName) {\n const arg = {\n interaction,\n pageCoords: (signalName === 'action-resume' ?\n interaction.curCoords : interaction.startCoords).page,\n startOffset: interaction.startOffset,\n statuses: interaction.modifierStatuses,\n preEnd: false,\n requireEndOnly: false,\n };\n\n modifiers.setOffsets(arg);\n modifiers.resetStatuses(arg.statuses);\n\n arg.pageCoords = extend({}, interaction.startCoords.page);\n interaction.modifierResult = modifiers.setAll(arg);\n },\n};\n\nInteraction.signals.on('new', function (interaction) {\n interaction.startOffset = { left: 0, right: 0, top: 0, bottom: 0 };\n interaction.modifierOffsets = {};\n interaction.modifierStatuses = modifiers.resetStatuses({});\n interaction.modifierResult = null;\n});\n\nInteraction.signals.on('action-start' , modifiers.start);\nInteraction.signals.on('action-resume', modifiers.start);\n\nInteraction.signals.on('before-action-move', function ({ interaction, preEnd, interactingBeforeMove }) {\n const modifierResult = modifiers.setAll({\n interaction,\n preEnd,\n pageCoords: interaction.curCoords.page,\n statuses: interaction.modifierStatuses,\n requireEndOnly: false,\n });\n\n // don't fire an action move if a modifier would keep the event in the same\n // cordinates as before\n if (!modifierResult.shouldMove && interactingBeforeMove) {\n interaction._dontFireMove = true;\n }\n\n interaction.modifierResult = modifierResult;\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n for (let i = 0; i < modifiers.names.length; i++) {\n const options = interaction.target.options[interaction.prepared.name][modifiers.names[i]];\n\n // if the endOnly option is true for any modifier\n if (shouldDo(options, true, true)) {\n // fire a move event at the modified coordinates\n interaction.doMove({ event, preEnd: true });\n break;\n }\n }\n});\n\nInteractEvent.signals.on('set-xy', function (arg) {\n const { iEvent, interaction } = arg;\n const modifierArg = extend({}, arg);\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n modifierArg.options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!modifierArg.options) {\n continue;\n }\n\n const modifier = modifiers[modifierName];\n\n modifierArg.status = interaction.modifierStatuses[modifierName];\n\n iEvent[modifierName] = modifier.modifyCoords(modifierArg);\n }\n});\n\nfunction shouldDo (options, preEnd, requireEndOnly) {\n return (options && options.enabled\n && (preEnd || !options.endOnly)\n && (!requireEndOnly || options.endOnly));\n}\n\nmodule.exports = modifiers;\n","const modifiers = require('./index');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst restrict = {\n defaults: {\n enabled : false,\n endOnly : false,\n restriction: null,\n elementRect: null,\n },\n\n setOffset: function ({ rect, startOffset, options }) {\n const elementRect = options && options.elementRect;\n const offset = {};\n\n if (rect && elementRect) {\n offset.left = startOffset.left - (rect.width * elementRect.left);\n offset.top = startOffset.top - (rect.height * elementRect.top);\n\n offset.right = startOffset.right - (rect.width * (1 - elementRect.right));\n offset.bottom = startOffset.bottom - (rect.height * (1 - elementRect.bottom));\n }\n else {\n offset.left = offset.top = offset.right = offset.bottom = 0;\n }\n\n return offset;\n },\n\n set: function ({ pageCoords, interaction, status, options }) {\n if (!options) { return status; }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n\n const restriction = getRestrictionRect(options.restriction, interaction, page);\n\n if (!restriction) { return status; }\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n const rect = restriction;\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n const offset = interaction.modifierOffsets.restrict;\n\n // object is assumed to have\n // x, y, width, height or\n // left, top, right, bottom\n if ('x' in restriction && 'y' in restriction) {\n modifiedX = Math.max(Math.min(rect.x + rect.width - offset.right , page.x), rect.x + offset.left);\n modifiedY = Math.max(Math.min(rect.y + rect.height - offset.bottom, page.y), rect.y + offset.top );\n }\n else {\n modifiedX = Math.max(Math.min(rect.right - offset.right , page.x), rect.left + offset.left);\n modifiedY = Math.max(Math.min(rect.bottom - offset.bottom, page.y), rect.top + offset.top );\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const elementRect = options && options.elementRect;\n\n if (options && options.enabled\n && !(phase === 'start' && elementRect && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n getRestrictionRect,\n};\n\nfunction getRestrictionRect (value, interaction, page) {\n if (utils.is.function(value)) {\n return utils.resolveRectLike(value, interaction.target, interaction.element, [page.x, page.y, interaction]);\n } else {\n return utils.resolveRectLike(value, interaction.target, interaction.element);\n }\n}\n\nmodifiers.restrict = restrict;\nmodifiers.names.push('restrict');\n\ndefaultOptions.perAction.restrict = restrict.defaults;\n\nmodule.exports = restrict;\n","// This module adds the options.resize.restrictEdges setting which sets min and\n// max for the top, left, bottom and right edges of the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictEdges: {\n// inner: { top: 200, left: 200, right: 400, bottom: 400 },\n// outer: { top: 0, left: 0, right: 600, bottom: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst { getRestrictionRect } = require('./restrict');\n\nconst noInner = { top: +Infinity, left: +Infinity, bottom: -Infinity, right: -Infinity };\nconst noOuter = { top: -Infinity, left: -Infinity, bottom: +Infinity, right: +Infinity };\n\nconst restrictEdges = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n offset: null,\n },\n\n setOffset: function ({ interaction, startOffset, options }) {\n if (!options) {\n return utils.extend({}, startOffset);\n }\n\n const offset = getRestrictionRect(options.offset, interaction, interaction.startCoords.page);\n\n if (offset) {\n return {\n top: startOffset.top + offset.y,\n left: startOffset.left + offset.x,\n bottom: startOffset.bottom + offset.y,\n right: startOffset.right + offset.x,\n };\n }\n\n return startOffset;\n },\n\n set: function ({ pageCoords, interaction, status, offset, options }) {\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n const inner = rectUtils.xywhToTlbr(getRestrictionRect(options.inner, interaction, page)) || noInner;\n const outer = rectUtils.xywhToTlbr(getRestrictionRect(options.outer, interaction, page)) || noOuter;\n\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n if (edges.top) {\n modifiedY = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top);\n }\n else if (edges.bottom) {\n modifiedY = Math.max(Math.min(outer.bottom - offset.bottom, page.y), inner.bottom - offset.bottom);\n }\n if (edges.left) {\n modifiedX = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left);\n }\n else if (edges.right) {\n modifiedX = Math.max(Math.min(outer.right - offset.right, page.x), inner.right - offset.right);\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n if (options && options.enabled\n && !(phase === 'start' && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n noInner,\n noOuter,\n getRestrictionRect,\n};\n\nmodifiers.restrictEdges = restrictEdges;\nmodifiers.names.push('restrictEdges');\n\ndefaultOptions.perAction.restrictEdges = restrictEdges.defaults;\nresize.defaults.restrictEdges = restrictEdges.defaults;\n\nmodule.exports = restrictEdges;\n","// This module adds the options.resize.restrictSize setting which sets min and\n// max width and height for the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictSize: {\n// min: { width: -600, height: -600 },\n// max: { width: 600, height: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst restrictEdges = require('./restrictEdges');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst noMin = { width: -Infinity, height: -Infinity };\nconst noMax = { width: +Infinity, height: +Infinity };\n\nconst restrictSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n },\n\n setOffset: function ({ interaction }) {\n return interaction.startOffset;\n },\n\n set: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const rect = rectUtils.xywhToTlbr(interaction.resizeRects.inverted);\n\n const minSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.min, interaction)) || noMin;\n const maxSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.max, interaction)) || noMax;\n\n arg.options = {\n enabled: options.enabled,\n endOnly: options.endOnly,\n inner: utils.extend({}, restrictEdges.noInner),\n outer: utils.extend({}, restrictEdges.noOuter),\n };\n\n if (edges.top) {\n arg.options.inner.top = rect.bottom - minSize.height;\n arg.options.outer.top = rect.bottom - maxSize.height;\n }\n else if (edges.bottom) {\n arg.options.inner.bottom = rect.top + minSize.height;\n arg.options.outer.bottom = rect.top + maxSize.height;\n }\n if (edges.left) {\n arg.options.inner.left = rect.right - minSize.width;\n arg.options.outer.left = rect.right - maxSize.width;\n }\n else if (edges.right) {\n arg.options.inner.right = rect.left + minSize.width;\n arg.options.outer.right = rect.left + maxSize.width;\n }\n\n restrictEdges.set(arg);\n },\n\n modifyCoords: restrictEdges.modifyCoords,\n};\n\nmodifiers.restrictSize = restrictSize;\nmodifiers.names.push('restrictSize');\n\ndefaultOptions.perAction.restrictSize = restrictSize.defaults;\nresize.defaults.restrictSize = restrictSize.defaults;\n\nmodule.exports = restrictSize;\n","const modifiers = require('./index');\nconst interact = require('../interact');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst snap = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n\n relativePoints: null,\n },\n\n setOffset: function ({ interaction, interactable, element, rect, startOffset, options }) {\n const offsets = [];\n const optionsOrigin = utils.rectToXY(utils.resolveRectLike(options.origin));\n const origin = optionsOrigin || utils.getOriginXY(interactable, element, interaction.prepared.name);\n options = options || interactable.options[interaction.prepared.name].snap || {};\n\n let snapOffset;\n\n if (options.offset === 'startCoords') {\n snapOffset = {\n x: interaction.startCoords.page.x - origin.x,\n y: interaction.startCoords.page.y - origin.y,\n };\n }\n else {\n const offsetRect = utils.resolveRectLike(options.offset, interactable, element, [interaction]);\n\n snapOffset = utils.rectToXY(offsetRect) || { x: 0, y: 0 };\n }\n\n if (rect && options.relativePoints && options.relativePoints.length) {\n for (const { x: relativeX, y: relativeY } of options.relativePoints) {\n offsets.push({\n x: startOffset.left - (rect.width * relativeX) + snapOffset.x,\n y: startOffset.top - (rect.height * relativeY) + snapOffset.y,\n });\n }\n }\n else {\n offsets.push(snapOffset);\n }\n\n return offsets;\n },\n\n set: function ({ interaction, pageCoords, status, options, offset: offsets }) {\n const targets = [];\n let target;\n let page;\n let i;\n\n if (status.useStatusXY) {\n page = { x: status.x, y: status.y };\n }\n else {\n const origin = utils.getOriginXY(interaction.target, interaction.element, interaction.prepared.name);\n\n page = utils.extend({}, pageCoords);\n\n page.x -= origin.x;\n page.y -= origin.y;\n }\n\n status.realX = page.x;\n status.realY = page.y;\n\n let len = options.targets? options.targets.length : 0;\n\n for (const { x: offsetX, y: offsetY } of offsets) {\n const relativeX = page.x - offsetX;\n const relativeY = page.y - offsetY;\n\n for (const snapTarget of options.targets) {\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n targets.push({\n x: utils.is.number(target.x) ? (target.x + offsetX) : relativeX,\n y: utils.is.number(target.y) ? (target.y + offsetY) : relativeY,\n\n range: utils.is.number(target.range)? target.range: options.range,\n });\n }\n }\n\n const closest = {\n target: null,\n inRange: false,\n distance: 0,\n range: 0,\n dx: 0,\n dy: 0,\n };\n\n for (i = 0, len = targets.length; i < len; i++) {\n target = targets[i];\n\n const range = target.range;\n const dx = target.x - page.x;\n const dy = target.y - page.y;\n const distance = utils.hypot(dx, dy);\n let inRange = distance <= range;\n\n // Infinite targets count as being out of range\n // compared to non infinite ones that are in range\n if (range === Infinity && closest.inRange && closest.range !== Infinity) {\n inRange = false;\n }\n\n if (!closest.target || (inRange\n // is the closest target in range?\n ? (closest.inRange && range !== Infinity\n // the pointer is relatively deeper in this target\n ? distance / range < closest.distance / closest.range\n // this target has Infinite range and the closest doesn't\n : (range === Infinity && closest.range !== Infinity)\n // OR this target is closer that the previous closest\n || distance < closest.distance)\n // The other is not in range and the pointer is closer to this target\n : (!closest.inRange && distance < closest.distance))) {\n\n closest.target = target;\n closest.distance = distance;\n closest.range = range;\n closest.inRange = inRange;\n closest.dx = dx;\n closest.dy = dy;\n\n status.range = range;\n }\n }\n\n let snapChanged;\n\n if (closest.target) {\n snapChanged = (status.modifiedX !== closest.target.x || status.modifiedY !== closest.target.y);\n\n status.modifiedX = closest.target.x;\n status.modifiedY = closest.target.y;\n }\n else {\n snapChanged = true;\n\n status.modifiedX = NaN;\n status.modifiedY = NaN;\n }\n\n status.dx = closest.dx;\n status.dy = closest.dy;\n\n status.changed = (snapChanged || (closest.inRange && !status.locked));\n status.locked = closest.inRange;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const relativePoints = options && options.relativePoints;\n\n if (options && options.enabled\n && !(phase === 'start' && relativePoints && relativePoints.length)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n }\n\n return {\n range : status.range,\n locked : status.locked,\n x : status.modifiedX,\n y : status.modifiedY,\n realX : status.realX,\n realY : status.realY,\n dx : status.dx,\n dy : status.dy,\n };\n }\n },\n};\n\ninteract.createSnapGrid = function (grid) {\n return function (x, y) {\n const limits = grid.limits || {\n left : -Infinity,\n right : Infinity,\n top : -Infinity,\n bottom: Infinity,\n };\n let offsetX = 0;\n let offsetY = 0;\n\n if (utils.is.object(grid.offset)) {\n offsetX = grid.offset.x;\n offsetY = grid.offset.y;\n }\n\n const gridx = Math.round((x - offsetX) / grid.x);\n const gridy = Math.round((y - offsetY) / grid.y);\n\n const newX = Math.max(limits.left, Math.min(limits.right , gridx * grid.x + offsetX));\n const newY = Math.max(limits.top , Math.min(limits.bottom, gridy * grid.y + offsetY));\n\n return {\n x: newX,\n y: newY,\n range: grid.range,\n };\n };\n};\n\nmodifiers.snap = snap;\nmodifiers.names.push('snap');\n\ndefaultOptions.perAction.snap = snap.defaults;\n\nmodule.exports = snap;\n","// This module allows snapping of the size of targets during resize\n// interactions.\n\nconst modifiers = require('./index');\nconst snap = require('./snap');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\nconst utils = require('../utils/');\n\nconst snapSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n },\n\n setOffset: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.edges;\n\n if (!edges) { return; }\n\n arg.options = {\n relativePoints: [{\n x: edges.left? 0 : 1,\n y: edges.top ? 0 : 1,\n }],\n origin: { x: 0, y: 0 },\n offset: 'self',\n range: options.range,\n };\n\n const offsets = snap.setOffset(arg);\n arg.options = options;\n\n return offsets;\n },\n\n set: function (arg) {\n const { interaction, options, offset, pageCoords } = arg;\n const page = utils.extend({}, pageCoords);\n const relativeX = page.x - offset[0].x;\n const relativeY = page.y - offset[0].y;\n\n arg.options = utils.extend({}, options);\n arg.options.targets = [];\n\n for (const snapTarget of options.targets) {\n let target;\n\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n if ('width' in target && 'height' in target) {\n target.x = target.width;\n target.y = target.height;\n }\n\n arg.options.targets.push(target);\n }\n\n snap.set(arg);\n },\n\n modifyCoords: function (arg) {\n const { options } = arg;\n\n arg.options = utils.extend({}, options);\n arg.options.enabled = options.enabled;\n arg.options.relativePoints = [null];\n\n snap.modifyCoords(arg);\n },\n};\n\nmodifiers.snapSize = snapSize;\nmodifiers.names.push('snapSize');\n\ndefaultOptions.perAction.snapSize = snapSize.defaults;\nresize.defaults.snapSize = snapSize.defaults;\n\nmodule.exports = snapSize;\n","const pointerUtils = require('../utils/pointerUtils');\n\nmodule.exports = class PointerEvent {\n constructor (type, pointer, event, eventTarget, interaction) {\n pointerUtils.pointerExtend(this, event);\n\n if (event !== pointer) {\n pointerUtils.pointerExtend(this, pointer);\n }\n\n this.interaction = interaction;\n\n this.timeStamp = new Date().getTime();\n this.originalEvent = event;\n this.type = type;\n this.pointerId = pointerUtils.getPointerId(pointer);\n this.pointerType = pointerUtils.getPointerType(pointer);\n this.target = eventTarget;\n this.currentTarget = null;\n\n if (type === 'tap') {\n const pointerIndex = interaction.getPointerIndex(pointer);\n this.dt = this.timeStamp - interaction.downTimes[pointerIndex];\n\n const interval = this.timeStamp - interaction.tapTime;\n\n this.double = !!(interaction.prevTap\n && interaction.prevTap.type !== 'doubletap'\n && interaction.prevTap.target === this.target\n && interval < 500);\n }\n else if (type === 'doubletap') {\n this.dt = pointer.timeStamp - interaction.tapTime;\n }\n }\n\n subtractOrigin ({ x: originX, y: originY }) {\n this.pageX -= originX;\n this.pageY -= originY;\n this.clientX -= originX;\n this.clientY -= originY;\n\n return this;\n }\n\n addOrigin ({ x: originX, y: originY }) {\n this.pageX += originX;\n this.pageY += originY;\n this.clientX += originX;\n this.clientY += originY;\n\n return this;\n }\n\n preventDefault () {\n this.originalEvent.preventDefault();\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n};\n","const PointerEvent = require('./PointerEvent');\nconst Interaction = require('../Interaction');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst defaults = require('../defaultOptions');\nconst signals = require('../utils/Signals').new();\nconst { filter } = require('../utils/arr');\n\nconst simpleSignals = [ 'down', 'up', 'cancel' ];\nconst simpleEvents = [ 'down', 'up', 'cancel' ];\n\nconst pointerEvents = {\n PointerEvent,\n fire,\n collectEventTargets,\n signals,\n defaults: {\n holdDuration: 600,\n ignoreFrom : null,\n allowFrom : null,\n origin : { x: 0, y: 0 },\n },\n types: [\n 'down',\n 'move',\n 'up',\n 'cancel',\n 'tap',\n 'doubletap',\n 'hold',\n ],\n};\n\nfunction fire (arg) {\n const {\n interaction, pointer, event, eventTarget,\n type = arg.pointerEvent.type,\n targets = collectEventTargets(arg),\n pointerEvent = new PointerEvent(type, pointer, event, eventTarget, interaction),\n } = arg;\n\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n targets,\n type,\n pointerEvent,\n };\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n\n for (const prop in target.props || {}) {\n pointerEvent[prop] = target.props[prop];\n }\n\n const origin = utils.getOriginXY(target.eventable, target.element);\n\n pointerEvent.subtractOrigin(origin);\n pointerEvent.eventable = target.eventable;\n pointerEvent.currentTarget = target.element;\n\n target.eventable.fire(pointerEvent);\n\n pointerEvent.addOrigin(origin);\n\n if (pointerEvent.immediatePropagationStopped\n || (pointerEvent.propagationStopped\n && (i + 1) < targets.length && targets[i + 1].element !== pointerEvent.currentTarget)) {\n break;\n }\n }\n\n signals.fire('fired', signalArg);\n\n if (type === 'tap') {\n // if pointerEvent should make a double tap, create and fire a doubletap\n // PointerEvent and use that as the prevTap\n const prevTap = pointerEvent.double\n ? fire({\n interaction, pointer, event, eventTarget,\n type: 'doubletap',\n })\n : pointerEvent;\n\n interaction.prevTap = prevTap;\n interaction.tapTime = prevTap.timeStamp;\n }\n\n return pointerEvent;\n}\n\nfunction collectEventTargets ({ interaction, pointer, event, eventTarget, type }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n // do not fire a tap event if the pointer was moved before being lifted\n if (type === 'tap' && (interaction.pointerWasMoved\n // or if the pointerup target is different to the pointerdown target\n || !(interaction.downTargets[pointerIndex] && interaction.downTargets[pointerIndex] === eventTarget))) {\n return [];\n }\n\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n path,\n targets: [],\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (type === 'hold') {\n signalArg.targets = filter(signalArg.targets, target =>\n target.eventable.options.holdDuration === interaction.holdTimers[pointerIndex].duration);\n }\n\n return signalArg.targets;\n}\n\nInteraction.signals.on('update-pointer-down', function ({ interaction, pointerIndex }) {\n interaction.holdTimers[pointerIndex] = { duration: Infinity, timeout: null };\n});\n\nInteraction.signals.on('remove-pointer', function ({ interaction, pointerIndex }) {\n interaction.holdTimers.splice(pointerIndex, 1);\n});\n\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget, duplicateMove }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n if (!duplicateMove && (!interaction.pointerIsDown || interaction.pointerWasMoved)) {\n if (interaction.pointerIsDown) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n\n fire({\n interaction, pointer, event, eventTarget,\n type: 'move',\n });\n }\n});\n\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget, pointerIndex }) {\n // copy event to be used in timeout for IE8\n const eventCopy = browser.isIE8? utils.extend({}, event) : event;\n\n const timer = interaction.holdTimers[pointerIndex];\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'hold',\n targets: [],\n path,\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (!signalArg.targets.length) { return; }\n\n let minDuration = Infinity;\n\n for (let i = 0; i < signalArg.targets.length; i++) {\n const target = signalArg.targets[i];\n const holdDuration = target.eventable.options.holdDuration;\n\n if (holdDuration < minDuration) {\n minDuration = holdDuration;\n }\n }\n\n timer.duration = minDuration;\n timer.timeout = setTimeout(function () {\n fire({\n interaction,\n eventTarget,\n pointer: browser.isIE8? eventCopy : pointer,\n event: eventCopy,\n type: 'hold',\n });\n }, minDuration);\n});\n\nInteraction.signals.on('up', ({ interaction, pointer, event, eventTarget }) => {\n if (!interaction.pointerWasMoved) {\n fire({ interaction, eventTarget, pointer, event, type: 'tap' });\n }\n});\n\n['up', 'cancel'].forEach(function (signalName) {\n Interaction.signals.on(signalName, function ({ interaction, pointerIndex }) {\n if (interaction.holdTimers[pointerIndex]) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n });\n});\n\nfunction createSignalListener (type) {\n return function ({ interaction, pointer, event, eventTarget }) {\n fire({ interaction, eventTarget, pointer, event, type });\n };\n}\n\nfor (let i = 0; i < simpleSignals.length; i++) {\n Interaction.signals.on(simpleSignals[i], createSignalListener(simpleEvents[i]));\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.prevTap = null; // the most recent tap event on this interaction\n interaction.tapTime = 0; // time of the most recent tap event\n interaction.holdTimers = []; // [{ duration, timeout }]\n});\n\ndefaults.pointerEvents = pointerEvents.defaults;\nmodule.exports = pointerEvents;\n","const pointerEvents = require('./base');\nconst Interaction = require('../Interaction');\n\npointerEvents.signals.on('new', onNew);\npointerEvents.signals.on('fired', onFired);\n\nfor (const signal of ['move', 'up', 'cancel', 'endall']) {\n Interaction.signals.on(signal, endHoldRepeat);\n}\n\nfunction onNew ({ pointerEvent }) {\n if (pointerEvent.type !== 'hold') { return; }\n\n pointerEvent.count = (pointerEvent.count || 0) + 1;\n}\n\nfunction onFired ({ interaction, pointerEvent, eventTarget, targets }) {\n if (pointerEvent.type !== 'hold' || !targets.length) { return; }\n\n // get the repeat interval from the first eventable\n const interval = targets[0].eventable.options.holdRepeatInterval;\n\n // don't repeat if the interval is 0 or less\n if (interval <= 0) { return; }\n\n // set a timeout to fire the holdrepeat event\n interaction.holdIntervalHandle = setTimeout(function () {\n pointerEvents.fire({\n interaction,\n eventTarget,\n type: 'hold',\n pointer: pointerEvent,\n event: pointerEvent,\n });\n }, interval);\n}\n\nfunction endHoldRepeat ({ interaction }) {\n // set the interaction's holdStopTime property\n // to stop further holdRepeat events\n if (interaction.holdIntervalHandle) {\n clearInterval(interaction.holdIntervalHandle);\n interaction.holdIntervalHandle = null;\n }\n}\n\n// don't repeat by default\npointerEvents.defaults.holdRepeatInterval = 0;\npointerEvents.types.push('holdrepeat');\n\nmodule.exports = {\n onNew,\n onFired,\n endHoldRepeat,\n};\n","const pointerEvents = require('./base');\nconst Interactable = require('../Interactable');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\nconst scope = require('../scope');\nconst extend = require('../utils/extend');\nconst { merge } = require('../utils/arr');\n\npointerEvents.signals.on('collect-targets', function ({ targets, element, type, eventTarget }) {\n function collectSelectors (interactable, selector, context) {\n const els = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && is.element(element)\n && domUtils.matchesSelector(element, selector, els)\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n const interactable = scope.interactables.get(element);\n\n if (interactable) {\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n scope.interactables.forEachSelector(collectSelectors, element);\n});\n\nInteractable.signals.on('new', function ({ interactable }) {\n interactable.events.getRect = function (element) {\n return interactable.getRect(element);\n };\n});\n\nInteractable.signals.on('set', function ({ interactable, options }) {\n extend(interactable.events.options, pointerEvents.defaults);\n extend(interactable.events.options, options);\n});\n\nmerge(Interactable.eventTypes, pointerEvents.types);\n\nInteractable.prototype.pointerEvents = function (options) {\n extend(this.events.options, options);\n\n return this;\n};\n\nconst __backCompatOption = Interactable.prototype._backCompatOption;\n\nInteractable.prototype._backCompatOption = function (optionName, newValue) {\n const ret = __backCompatOption.call(this, optionName, newValue);\n\n if (ret === this) {\n this.events.options[optionName] = newValue;\n }\n\n return ret;\n};\n\nInteractable.settingsMethods.push('pointerEvents');\n","const utils = require('./utils');\nconst events = require('./utils/events');\nconst signals = require('./utils/Signals').new();\n\nconst scope = {\n signals,\n events,\n utils,\n\n // main document\n document: require('./utils/domObjects').document,\n // all documents being listened to\n documents: [],\n\n addDocument: function (doc, win) {\n // do nothing if document is already known\n if (utils.contains(scope.documents, doc)) { return false; }\n\n win = win || scope.getWindow(doc);\n\n scope.documents.push(doc);\n events.documents.push(doc);\n\n // don't add an unload event for the main document\n // so that the page may be cached in browser history\n if (doc !== scope.document) {\n events.add(win, 'unload', scope.onWindowUnload);\n }\n\n signals.fire('add-document', { doc, win });\n },\n\n removeDocument: function (doc, win) {\n const index = utils.indexOf(scope.documents, doc);\n\n win = win || scope.getWindow(doc);\n\n events.remove(win, 'unload', scope.onWindowUnload);\n\n scope.documents.splice(index, 1);\n events.documents.splice(index, 1);\n\n signals.fire('remove-document', { win, doc });\n },\n\n onWindowUnload: function () {\n scope.removeDocument(this.document, this);\n },\n};\n\nmodule.exports = scope;\n","const { indexOf } = require('./arr');\n\nclass Signals {\n constructor () {\n this.listeners = {\n // signalName: [listeners],\n };\n }\n\n on (name, listener) {\n if (!this.listeners[name]) {\n this.listeners[name] = [listener];\n return;\n }\n\n this.listeners[name].push(listener);\n }\n\n off (name, listener) {\n if (!this.listeners[name]) { return; }\n\n const index = indexOf(this.listeners[name], listener);\n\n if (index !== -1) {\n this.listeners[name].splice(index, 1);\n }\n }\n\n fire (name, arg) {\n const targetListeners = this.listeners[name];\n\n if (!targetListeners) { return; }\n\n for (let i = 0; i < targetListeners.length; i++) {\n if (targetListeners[i](arg, name) === false) {\n return;\n }\n }\n }\n}\n\nSignals.new = function () {\n return new Signals();\n};\n\nmodule.exports = Signals;\n","function indexOf (array, target) {\n for (let i = 0, len = array.length; i < len; i++) {\n if (array[i] === target) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction contains (array, target) {\n return indexOf(array, target) !== -1;\n}\n\nfunction merge (target, source) {\n for (let i = 0; i < source.length; i++) {\n target.push(source[i]);\n }\n\n return target;\n}\n\nfunction filter (array, test) {\n const result = [];\n\n for (let i = 0; i < array.length; i++) {\n if (test(array[i])) {\n result.push(array[i]);\n }\n }\n\n return result;\n}\n\nmodule.exports = {\n indexOf,\n contains,\n merge,\n filter,\n};\n","const { window } = require('./window');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst Element = domObjects.Element;\nconst navigator = window.navigator;\n\nconst browser = {\n // Does the browser support touch input?\n supportsTouch: !!(('ontouchstart' in window) || is.function(window.DocumentTouch)\n && domObjects.document instanceof window.DocumentTouch),\n\n // Does the browser support PointerEvents\n supportsPointerEvent: !!domObjects.PointerEvent,\n\n isIE8: ('attachEvent' in window) && !('addEventListener' in window),\n\n // Opera Mobile must be handled differently\n isOperaMobile: (navigator.appName === 'Opera'\n && browser.supportsTouch\n && navigator.userAgent.match('Presto')),\n\n // scrolling doesn't change the result of getClientRects on iOS 7\n isIOS7: (/iP(hone|od|ad)/.test(navigator.platform)\n && /OS 7[^\\d]/.test(navigator.appVersion)),\n\n isIe9OrOlder: /MSIE (8|9)/.test(navigator.userAgent),\n\n // prefix matchesSelector\n prefixedMatchesSelector: 'matches' in Element.prototype\n ? 'matches': 'webkitMatchesSelector' in Element.prototype\n ? 'webkitMatchesSelector': 'mozMatchesSelector' in Element.prototype\n ? 'mozMatchesSelector': 'oMatchesSelector' in Element.prototype\n ? 'oMatchesSelector': 'msMatchesSelector',\n\n useMatchesSelectorPolyfill: false,\n\n pEventTypes: (domObjects.PointerEvent\n ? (domObjects.PointerEvent === window.MSPointerEvent\n ? {\n up: 'MSPointerUp',\n down: 'MSPointerDown',\n over: 'mouseover',\n out: 'mouseout',\n move: 'MSPointerMove',\n cancel: 'MSPointerCancel',\n }\n : {\n up: 'pointerup',\n down: 'pointerdown',\n over: 'pointerover',\n out: 'pointerout',\n move: 'pointermove',\n cancel: 'pointercancel',\n })\n : null),\n\n // because Webkit and Opera still use 'mousewheel' event type\n wheelEvent: 'onmousewheel' in domObjects.document? 'mousewheel': 'wheel',\n\n};\n\nbrowser.useMatchesSelectorPolyfill = !is.function(Element.prototype[browser.prefixedMatchesSelector]);\n\nmodule.exports = browser;\n","const domObjects = {};\nconst win = require('./window').window;\n\nfunction blank () {}\n\ndomObjects.document = win.document;\ndomObjects.DocumentFragment = win.DocumentFragment || blank;\ndomObjects.SVGElement = win.SVGElement || blank;\ndomObjects.SVGSVGElement = win.SVGSVGElement || blank;\ndomObjects.SVGElementInstance = win.SVGElementInstance || blank;\ndomObjects.Element = win.Element || blank;\ndomObjects.HTMLElement = win.HTMLElement || domObjects.Element;\n\ndomObjects.Event = win.Event;\ndomObjects.Touch = win.Touch || blank;\ndomObjects.PointerEvent = (win.PointerEvent || win.MSPointerEvent);\n\nmodule.exports = domObjects;\n","const win = require('./window');\nconst browser = require('./browser');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst domUtils = {\n nodeContains: function (parent, child) {\n while (child) {\n if (child === parent) {\n return true;\n }\n\n child = child.parentNode;\n }\n\n return false;\n },\n\n closest: function (element, selector) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) { return element; }\n\n element = domUtils.parentNode(element);\n }\n\n return null;\n },\n\n parentNode: function (node) {\n let parent = node.parentNode;\n\n if (is.docFrag(parent)) {\n // skip past #shado-root fragments\n while ((parent = parent.host) && is.docFrag(parent)) {\n continue;\n }\n\n return parent;\n }\n\n return parent;\n },\n\n // taken from http://tanalin.com/en/blog/2012/12/matches-selector-ie8/ and modified\n matchesSelectorPolyfill: browser.useMatchesSelectorPolyfill\n ? function (element, selector, elems) {\n elems = elems || element.parentNode.querySelectorAll(selector);\n\n for (let i = 0, len = elems.length; i < len; i++) {\n if (elems[i] === element) {\n return true;\n }\n }\n\n return false;\n }\n : null,\n\n matchesSelector: function (element, selector, nodeList) {\n if (browser.useMatchesSelectorPolyfill) {\n return domUtils.matchesSelectorPolyfill(element, selector, nodeList);\n }\n\n // remove /deep/ from selectors if shadowDOM polyfill is used\n if (win.window !== win.realWindow) {\n selector = selector.replace(/\\/deep\\//g, ' ');\n }\n\n return element[browser.prefixedMatchesSelector](selector);\n },\n\n // Test for the element that's \"above\" all other qualifiers\n indexOfDeepestElement: function (elements) {\n let deepestZoneParents = [];\n let dropzoneParents = [];\n let dropzone;\n let deepestZone = elements[0];\n let index = deepestZone? 0: -1;\n let parent;\n let child;\n let i;\n let n;\n\n for (i = 1; i < elements.length; i++) {\n dropzone = elements[i];\n\n // an element might belong to multiple selector dropzones\n if (!dropzone || dropzone === deepestZone) {\n continue;\n }\n\n if (!deepestZone) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n // check if the deepest or current are document.documentElement or document.rootElement\n // - if the current dropzone is, do nothing and continue\n if (dropzone.parentNode === dropzone.ownerDocument) {\n continue;\n }\n // - if deepest is, update with the current dropzone and continue to next\n else if (deepestZone.parentNode === dropzone.ownerDocument) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n if (!deepestZoneParents.length) {\n parent = deepestZone;\n while (parent.parentNode && parent.parentNode !== parent.ownerDocument) {\n deepestZoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n }\n\n // if this element is an svg element and the current deepest is\n // an HTMLElement\n if (deepestZone instanceof domObjects.HTMLElement\n && dropzone instanceof domObjects.SVGElement\n && !(dropzone instanceof domObjects.SVGSVGElement)) {\n\n if (dropzone === deepestZone.parentNode) {\n continue;\n }\n\n parent = dropzone.ownerSVGElement;\n }\n else {\n parent = dropzone;\n }\n\n dropzoneParents = [];\n\n while (parent.parentNode !== parent.ownerDocument) {\n dropzoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n\n n = 0;\n\n // get (position of last common ancestor) + 1\n while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) {\n n++;\n }\n\n const parents = [\n dropzoneParents[n - 1],\n dropzoneParents[n],\n deepestZoneParents[n],\n ];\n\n child = parents[0].lastChild;\n\n while (child) {\n if (child === parents[1]) {\n deepestZone = dropzone;\n index = i;\n deepestZoneParents = [];\n\n break;\n }\n else if (child === parents[2]) {\n break;\n }\n\n child = child.previousSibling;\n }\n }\n\n return index;\n },\n\n matchesUpTo: function (element, selector, limit) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) {\n return true;\n }\n\n element = domUtils.parentNode(element);\n\n if (element === limit) {\n return domUtils.matchesSelector(element, selector);\n }\n }\n\n return false;\n },\n\n getActualElement: function (element) {\n return (element instanceof domObjects.SVGElementInstance\n ? element.correspondingUseElement\n : element);\n },\n\n getScrollXY: function (relevantWindow) {\n relevantWindow = relevantWindow || win.window;\n return {\n x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft,\n y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop,\n };\n },\n\n getElementClientRect: function (element) {\n const clientRect = (element instanceof domObjects.SVGElement\n ? element.getBoundingClientRect()\n : element.getClientRects()[0]);\n\n return clientRect && {\n left : clientRect.left,\n right : clientRect.right,\n top : clientRect.top,\n bottom: clientRect.bottom,\n width : clientRect.width || clientRect.right - clientRect.left,\n height: clientRect.height || clientRect.bottom - clientRect.top,\n };\n },\n\n getElementRect: function (element) {\n const clientRect = domUtils.getElementClientRect(element);\n\n if (!browser.isIOS7 && clientRect) {\n const scroll = domUtils.getScrollXY(win.getWindow(element));\n\n clientRect.left += scroll.x;\n clientRect.right += scroll.x;\n clientRect.top += scroll.y;\n clientRect.bottom += scroll.y;\n }\n\n return clientRect;\n },\n\n getPath: function (element) {\n const path = [];\n\n while (element) {\n path.push(element);\n element = domUtils.parentNode(element);\n }\n\n return path;\n },\n\n trySelector: value => {\n if (!is.string(value)) { return false; }\n\n // an exception will be raised if it is invalid\n domObjects.document.querySelector(value);\n return true;\n },\n};\n\nmodule.exports = domUtils;\n","const is = require('./is');\nconst domUtils = require('./domUtils');\nconst pExtend = require('./pointerExtend');\n\nconst { window, getWindow } = require('./window');\nconst { indexOf, contains } = require('./arr');\n\nconst useAttachEvent = ('attachEvent' in window) && !('addEventListener' in window);\nconst addEvent = useAttachEvent? 'attachEvent': 'addEventListener';\nconst removeEvent = useAttachEvent? 'detachEvent': 'removeEventListener';\nconst on = useAttachEvent? 'on': '';\n\nconst elements = [];\nconst targets = [];\nconst attachedListeners = [];\n\n// {\n// type: {\n// selectors: ['selector', ...],\n// contexts : [document, ...],\n// listeners: [[listener, capture, passive], ...]\n// }\n// }\nconst delegatedEvents = {};\n\nconst documents = [];\n\nconst supportsOptions = !useAttachEvent && (() => {\n let supported = false;\n\n window.document.createElement('div').addEventListener('test', null, {\n get capture () { supported = true; },\n });\n\n return supported;\n})();\n\nfunction add (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n let elementIndex = indexOf(elements, element);\n let target = targets[elementIndex];\n\n if (!target) {\n target = {\n events: {},\n typeCount: 0,\n };\n\n elementIndex = elements.push(element) - 1;\n targets.push(target);\n\n attachedListeners.push(useAttachEvent\n ? {\n supplied: [],\n wrapped : [],\n useCount: [],\n }\n : null);\n }\n\n if (!target.events[type]) {\n target.events[type] = [];\n target.typeCount++;\n }\n\n if (!contains(target.events[type], listener)) {\n let ret;\n\n if (useAttachEvent) {\n const { supplied, wrapped, useCount } = attachedListeners[elementIndex];\n const listenerIndex = indexOf(supplied, listener);\n\n const wrappedListener = wrapped[listenerIndex] || function (event) {\n if (!event.immediatePropagationStopped) {\n event.target = event.srcElement;\n event.currentTarget = element;\n\n event.preventDefault = event.preventDefault || preventDef;\n event.stopPropagation = event.stopPropagation || stopProp;\n event.stopImmediatePropagation = event.stopImmediatePropagation || stopImmProp;\n\n if (/mouse|click/.test(event.type)) {\n event.pageX = event.clientX + getWindow(element).document.documentElement.scrollLeft;\n event.pageY = event.clientY + getWindow(element).document.documentElement.scrollTop;\n }\n\n listener(event);\n }\n };\n\n ret = element[addEvent](on + type, wrappedListener, !!options.capture);\n\n if (listenerIndex === -1) {\n supplied.push(listener);\n wrapped.push(wrappedListener);\n useCount.push(1);\n }\n else {\n useCount[listenerIndex]++;\n }\n }\n else {\n ret = element[addEvent](type, listener, supportsOptions? options : !!options.capture);\n }\n target.events[type].push(listener);\n\n return ret;\n }\n}\n\nfunction remove (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const elementIndex = indexOf(elements, element);\n const target = targets[elementIndex];\n\n if (!target || !target.events) {\n return;\n }\n\n let wrappedListener = listener;\n let listeners;\n let listenerIndex;\n\n if (useAttachEvent) {\n listeners = attachedListeners[elementIndex];\n listenerIndex = indexOf(listeners.supplied, listener);\n wrappedListener = listeners.wrapped[listenerIndex];\n }\n\n if (type === 'all') {\n for (type in target.events) {\n if (target.events.hasOwnProperty(type)) {\n remove(element, type, 'all');\n }\n }\n return;\n }\n\n if (target.events[type]) {\n const len = target.events[type].length;\n\n if (listener === 'all') {\n for (let i = 0; i < len; i++) {\n remove(element, type, target.events[type][i], options);\n }\n return;\n }\n else {\n for (let i = 0; i < len; i++) {\n if (target.events[type][i] === listener) {\n element[removeEvent](on + type, wrappedListener, supportsOptions? options : !!options.capture);\n target.events[type].splice(i, 1);\n\n if (useAttachEvent && listeners) {\n listeners.useCount[listenerIndex]--;\n if (listeners.useCount[listenerIndex] === 0) {\n listeners.supplied.splice(listenerIndex, 1);\n listeners.wrapped.splice(listenerIndex, 1);\n listeners.useCount.splice(listenerIndex, 1);\n }\n }\n\n break;\n }\n }\n }\n\n if (target.events[type] && target.events[type].length === 0) {\n target.events[type] = null;\n target.typeCount--;\n }\n }\n\n if (!target.typeCount) {\n targets.splice(elementIndex, 1);\n elements.splice(elementIndex, 1);\n attachedListeners.splice(elementIndex, 1);\n }\n}\n\nfunction addDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n if (!delegatedEvents[type]) {\n delegatedEvents[type] = {\n selectors: [],\n contexts : [],\n listeners: [],\n };\n\n // add delegate listener functions\n for (let i = 0; i < documents.length; i++) {\n add(documents[i], type, delegateListener);\n add(documents[i], type, delegateUseCapture, true);\n }\n }\n\n const delegated = delegatedEvents[type];\n let index;\n\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n break;\n }\n }\n\n if (index === -1) {\n index = delegated.selectors.length;\n\n delegated.selectors.push(selector);\n delegated.contexts .push(context);\n delegated.listeners.push([]);\n }\n\n // keep listener and capture and passive flags\n delegated.listeners[index].push([listener, !!options.capture, options.passive]);\n}\n\nfunction removeDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const delegated = delegatedEvents[type];\n let matchFound = false;\n let index;\n\n if (!delegated) { return; }\n\n // count from last index of delegated to 0\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n // look for matching selector and context Node\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n\n const listeners = delegated.listeners[index];\n\n // each item of the listeners array is an array: [function, capture, passive]\n for (let i = listeners.length - 1; i >= 0; i--) {\n const [fn, capture, passive] = listeners[i];\n\n // check if the listener functions and capture and passive flags match\n if (fn === listener && capture === !!options.capture && passive === options.passive) {\n // remove the listener from the array of listeners\n listeners.splice(i, 1);\n\n // if all listeners for this interactable have been removed\n // remove the interactable from the delegated arrays\n if (!listeners.length) {\n delegated.selectors.splice(index, 1);\n delegated.contexts .splice(index, 1);\n delegated.listeners.splice(index, 1);\n\n // remove delegate function from context\n remove(context, type, delegateListener);\n remove(context, type, delegateUseCapture, true);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegatedEvents[type] = null;\n }\n }\n\n // only remove one listener\n matchFound = true;\n break;\n }\n }\n\n if (matchFound) { break; }\n }\n }\n}\n\n// bound to the interactable context when a DOM event\n// listener is added to a selector interactable\nfunction delegateListener (event, optionalArg) {\n const options = getOptions(optionalArg);\n const fakeEvent = {};\n const delegated = delegatedEvents[event.type];\n const eventTarget = (domUtils.getActualElement(event.path\n ? event.path[0]\n : event.target));\n let element = eventTarget;\n\n // duplicate the event so that currentTarget can be changed\n pExtend(fakeEvent, event);\n\n fakeEvent.originalEvent = event;\n fakeEvent.preventDefault = preventOriginalDefault;\n\n // climb up document tree looking for selector matches\n while (is.element(element)) {\n for (let i = 0; i < delegated.selectors.length; i++) {\n const selector = delegated.selectors[i];\n const context = delegated.contexts[i];\n\n if (domUtils.matchesSelector(element, selector)\n && domUtils.nodeContains(context, eventTarget)\n && domUtils.nodeContains(context, element)) {\n\n const listeners = delegated.listeners[i];\n\n fakeEvent.currentTarget = element;\n\n for (let j = 0; j < listeners.length; j++) {\n const [fn, capture, passive] = listeners[j];\n\n if (capture === !!options.capture && passive === options.passive) {\n fn(fakeEvent);\n }\n }\n }\n }\n\n element = domUtils.parentNode(element);\n }\n}\n\nfunction delegateUseCapture (event) {\n return delegateListener.call(this, event, true);\n}\n\nfunction preventDef () {\n this.returnValue = false;\n}\n\nfunction preventOriginalDefault () {\n this.originalEvent.preventDefault();\n}\n\nfunction stopProp () {\n this.cancelBubble = true;\n}\n\nfunction stopImmProp () {\n this.cancelBubble = true;\n this.immediatePropagationStopped = true;\n}\n\nfunction getOptions (param) {\n return is.object(param)? param : { capture: param };\n}\n\nmodule.exports = {\n add,\n remove,\n\n addDelegate,\n removeDelegate,\n\n delegateListener,\n delegateUseCapture,\n delegatedEvents,\n documents,\n\n useAttachEvent,\n supportsOptions,\n\n _elements: elements,\n _targets: targets,\n _attachedListeners: attachedListeners,\n};\n","module.exports = function extend (dest, source) {\n for (const prop in source) {\n dest[prop] = source[prop];\n }\n return dest;\n};\n","const {\n resolveRectLike,\n rectToXY,\n} = require('./rect');\n\nmodule.exports = function (target, element, action) {\n const actionOptions = target.options[action];\n const actionOrigin = actionOptions && actionOptions.origin;\n const origin = actionOrigin || target.options.origin;\n\n const originRect = resolveRectLike(origin, target, element, [target && element]);\n\n return rectToXY(originRect) || { x: 0, y: 0 };\n};\n","module.exports = (x, y) => Math.sqrt(x * x + y * y);\n","const extend = require('./extend');\nconst win = require('./window');\n\nconst utils = {\n warnOnce: function (method, message) {\n let warned = false;\n\n return function () {\n if (!warned) {\n win.window.console.warn(message);\n warned = true;\n }\n\n return method.apply(this, arguments);\n };\n },\n\n // http://stackoverflow.com/a/5634528/2280888\n _getQBezierValue: function (t, p1, p2, p3) {\n const iT = 1 - t;\n return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3;\n },\n\n getQuadraticCurvePoint: function (startX, startY, cpX, cpY, endX, endY, position) {\n return {\n x: utils._getQBezierValue(position, startX, cpX, endX),\n y: utils._getQBezierValue(position, startY, cpY, endY),\n };\n },\n\n // http://gizma.com/easing/\n easeOutQuad: function (t, b, c, d) {\n t /= d;\n return -c * t*(t-2) + b;\n },\n\n copyAction: function (dest, src) {\n dest.name = src.name;\n dest.axis = src.axis;\n dest.edges = src.edges;\n\n return dest;\n },\n\n is : require('./is'),\n extend : extend,\n hypot : require('./hypot'),\n getOriginXY: require('./getOriginXY'),\n};\n\nextend(utils, require('./arr'));\nextend(utils, require('./domUtils'));\nextend(utils, require('./pointerUtils'));\nextend(utils, require('./rect'));\n\nmodule.exports = utils;\n","const scope = require('../scope');\nconst utils = require('./index');\n\nconst finder = {\n methodOrder: [ 'simulationResume', 'mouseOrPen', 'hasPointer', 'idle' ],\n\n search: function (pointer, eventType, eventTarget) {\n const pointerType = utils.getPointerType(pointer);\n const pointerId = utils.getPointerId(pointer);\n const details = { pointer, pointerId, pointerType, eventType, eventTarget };\n\n for (const method of finder.methodOrder) {\n const interaction = finder[method](details);\n\n if (interaction) {\n return interaction;\n }\n }\n },\n\n // try to resume simulation with a new pointer\n simulationResume: function ({ pointerType, eventType, eventTarget }) {\n if (!/down|start/i.test(eventType)) {\n return null;\n }\n\n for (const interaction of scope.interactions) {\n let element = eventTarget;\n\n if (interaction.simulation && interaction.simulation.allowResume\n && (interaction.pointerType === pointerType)) {\n while (element) {\n // if the element is the interaction element\n if (element === interaction.element) {\n return interaction;\n }\n element = utils.parentNode(element);\n }\n }\n }\n\n return null;\n },\n\n // if it's a mouse or pen interaction\n mouseOrPen: function ({ pointerId, pointerType, eventType }) {\n if (pointerType !== 'mouse' && pointerType !== 'pen') {\n return null;\n }\n\n let firstNonActive;\n\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType) {\n // if it's a down event, skip interactions with running simulations\n if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; }\n\n // if the interaction is active, return it immediately\n if (interaction.interacting()) {\n return interaction;\n }\n // otherwise save it and look for another active interaction\n else if (!firstNonActive) {\n firstNonActive = interaction;\n }\n }\n }\n\n // if no active mouse interaction was found use the first inactive mouse\n // interaction\n if (firstNonActive) {\n return firstNonActive;\n }\n\n // find any mouse or pen interaction.\n // ignore the interaction if the eventType is a *down, and a simulation\n // is active\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType && !(/down/i.test(eventType) && interaction.simulation)) {\n return interaction;\n }\n }\n\n return null;\n },\n\n // get interaction that has this pointer\n hasPointer: function ({ pointerId }) {\n for (const interaction of scope.interactions) {\n if (utils.contains(interaction.pointerIds, pointerId)) {\n return interaction;\n }\n }\n },\n\n // get first idle interaction with a matching pointerType\n idle: function ({ pointerType }) {\n for (const interaction of scope.interactions) {\n // if there's already a pointer held down\n if (interaction.pointerIds.length === 1) {\n const target = interaction.target;\n // don't add this pointer if there is a target interactable and it\n // isn't gesturable\n if (target && !target.options.gesture.enabled) {\n continue;\n }\n }\n // maximum of 2 pointers per interaction\n else if (interaction.pointerIds.length >= 2) {\n continue;\n }\n\n if (!interaction.interacting() && (pointerType === interaction.pointerType)) {\n return interaction;\n }\n }\n\n return null;\n },\n};\n\nmodule.exports = finder;\n","const win = require('./window');\nconst isWindow = require('./isWindow');\n\nconst is = {\n array : () => {},\n\n window : thing => thing === win.window || isWindow(thing),\n\n docFrag : thing => is.object(thing) && thing.nodeType === 11,\n\n object : thing => !!thing && (typeof thing === 'object'),\n\n function: thing => typeof thing === 'function',\n\n number : thing => typeof thing === 'number' ,\n\n bool : thing => typeof thing === 'boolean' ,\n\n string : thing => typeof thing === 'string' ,\n\n element: thing => {\n if (!thing || (typeof thing !== 'object')) { return false; }\n\n const _window = win.getWindow(thing) || win.window;\n\n return (/object|function/.test(typeof _window.Element)\n ? thing instanceof _window.Element //DOM2\n : thing.nodeType === 1 && typeof thing.nodeName === 'string');\n },\n};\n\nis.array = thing => (is.object(thing)\n && (typeof thing.length !== 'undefined')\n && is.function(thing.splice));\n\nmodule.exports = is;\n","module.exports = (thing) => !!(thing && thing.Window) && (thing instanceof thing.Window);\n","function pointerExtend (dest, source) {\n for (const prop in source) {\n const prefixedPropREs = module.exports.prefixedPropREs;\n let deprecated = false;\n\n // skip deprecated prefixed properties\n for (const vendor in prefixedPropREs) {\n if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) {\n deprecated = true;\n break;\n }\n }\n\n if (!deprecated && typeof source[prop] !== 'function') {\n dest[prop] = source[prop];\n }\n }\n return dest;\n}\n\npointerExtend.prefixedPropREs = {\n webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/,\n};\n\nmodule.exports = pointerExtend;\n","const hypot = require('./hypot');\nconst browser = require('./browser');\nconst dom = require('./domObjects');\nconst domUtils = require('./domUtils');\nconst domObjects = require('./domObjects');\nconst is = require('./is');\nconst pointerExtend = require('./pointerExtend');\n\nconst pointerUtils = {\n copyCoords: function (dest, src) {\n dest.page = dest.page || {};\n dest.page.x = src.page.x;\n dest.page.y = src.page.y;\n\n dest.client = dest.client || {};\n dest.client.x = src.client.x;\n dest.client.y = src.client.y;\n\n dest.timeStamp = src.timeStamp;\n },\n\n setCoordDeltas: function (targetObj, prev, cur) {\n targetObj.page.x = cur.page.x - prev.page.x;\n targetObj.page.y = cur.page.y - prev.page.y;\n targetObj.client.x = cur.client.x - prev.client.x;\n targetObj.client.y = cur.client.y - prev.client.y;\n targetObj.timeStamp = cur.timeStamp - prev.timeStamp;\n\n // set pointer velocity\n const dt = Math.max(targetObj.timeStamp / 1000, 0.001);\n\n targetObj.page.speed = hypot(targetObj.page.x, targetObj.page.y) / dt;\n targetObj.page.vx = targetObj.page.x / dt;\n targetObj.page.vy = targetObj.page.y / dt;\n\n targetObj.client.speed = hypot(targetObj.client.x, targetObj.page.y) / dt;\n targetObj.client.vx = targetObj.client.x / dt;\n targetObj.client.vy = targetObj.client.y / dt;\n },\n\n isNativePointer: function (pointer) {\n return (pointer instanceof dom.Event || pointer instanceof dom.Touch);\n },\n\n // Get specified X/Y coords for mouse or event.touches[0]\n getXY: function (type, pointer, xy) {\n xy = xy || {};\n type = type || 'page';\n\n xy.x = pointer[type + 'X'];\n xy.y = pointer[type + 'Y'];\n\n return xy;\n },\n\n getPageXY: function (pointer, page) {\n page = page || {};\n\n // Opera Mobile handles the viewport and scrolling oddly\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n pointerUtils.getXY('screen', pointer, page);\n\n page.x += window.scrollX;\n page.y += window.scrollY;\n }\n else {\n pointerUtils.getXY('page', pointer, page);\n }\n\n return page;\n },\n\n getClientXY: function (pointer, client) {\n client = client || {};\n\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n // Opera Mobile handles the viewport and scrolling oddly\n pointerUtils.getXY('screen', pointer, client);\n }\n else {\n pointerUtils.getXY('client', pointer, client);\n }\n\n return client;\n },\n\n getPointerId: function (pointer) {\n return is.number(pointer.pointerId)? pointer.pointerId : pointer.identifier;\n },\n\n setCoords: function (targetObj, pointers, timeStamp) {\n const pointer = (pointers.length > 1\n ? pointerUtils.pointerAverage(pointers)\n : pointers[0]);\n\n const tmpXY = {};\n\n pointerUtils.getPageXY(pointer, tmpXY);\n targetObj.page.x = tmpXY.x;\n targetObj.page.y = tmpXY.y;\n\n pointerUtils.getClientXY(pointer, tmpXY);\n targetObj.client.x = tmpXY.x;\n targetObj.client.y = tmpXY.y;\n\n targetObj.timeStamp = is.number(timeStamp) ? timeStamp :new Date().getTime();\n },\n\n pointerExtend: pointerExtend,\n\n getTouchPair: function (event) {\n const touches = [];\n\n // array of touches is supplied\n if (is.array(event)) {\n touches[0] = event[0];\n touches[1] = event[1];\n }\n // an event\n else {\n if (event.type === 'touchend') {\n if (event.touches.length === 1) {\n touches[0] = event.touches[0];\n touches[1] = event.changedTouches[0];\n }\n else if (event.touches.length === 0) {\n touches[0] = event.changedTouches[0];\n touches[1] = event.changedTouches[1];\n }\n }\n else {\n touches[0] = event.touches[0];\n touches[1] = event.touches[1];\n }\n }\n\n return touches;\n },\n\n pointerAverage: function (pointers) {\n const average = {\n pageX : 0,\n pageY : 0,\n clientX: 0,\n clientY: 0,\n screenX: 0,\n screenY: 0,\n };\n\n for (const pointer of pointers) {\n for (const prop in average) {\n average[prop] += pointer[prop];\n }\n }\n for (const prop in average) {\n average[prop] /= pointers.length;\n }\n\n return average;\n },\n\n touchBBox: function (event) {\n if (!event.length && !(event.touches && event.touches.length > 1)) {\n return;\n }\n\n const touches = pointerUtils.getTouchPair(event);\n const minX = Math.min(touches[0].pageX, touches[1].pageX);\n const minY = Math.min(touches[0].pageY, touches[1].pageY);\n const maxX = Math.max(touches[0].pageX, touches[1].pageX);\n const maxY = Math.max(touches[0].pageY, touches[1].pageY);\n\n return {\n x: minX,\n y: minY,\n left: minX,\n top: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n },\n\n touchDistance: function (event, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n\n\n const dx = touches[0][sourceX] - touches[1][sourceX];\n const dy = touches[0][sourceY] - touches[1][sourceY];\n\n return hypot(dx, dy);\n },\n\n touchAngle: function (event, prevAngle, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n const dx = touches[1][sourceX] - touches[0][sourceX];\n const dy = touches[1][sourceY] - touches[0][sourceY];\n const angle = 180 * Math.atan2(dy , dx) / Math.PI;\n\n return angle;\n },\n\n getPointerType: function (pointer) {\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : is.number(pointer.pointerType)\n ? [undefined, undefined,'touch', 'pen', 'mouse'][pointer.pointerType]\n // if the PointerEvent API isn't available, then the \"pointer\" must\n // be either a MouseEvent, TouchEvent, or Touch object\n : /touch/.test(pointer.type) || pointer instanceof domObjects.Touch\n ? 'touch'\n : 'mouse';\n },\n\n // [ event.target, event.currentTarget ]\n getEventTargets: function (event) {\n return [\n domUtils.getActualElement(event.path ? event.path[0] : event.target),\n domUtils.getActualElement(event.currentTarget),\n ];\n },\n};\n\nmodule.exports = pointerUtils;\n","const { window } = require('./window');\n\nconst vendors = ['ms', 'moz', 'webkit', 'o'];\nlet lastTime = 0;\nlet request;\nlet cancel;\n\nfor (let x = 0; x < vendors.length && !window.requestAnimationFrame; x++) {\n request = window[vendors[x] + 'RequestAnimationFrame'];\n cancel = window[vendors[x] +'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n}\n\nif (!request) {\n request = function (callback) {\n const currTime = new Date().getTime();\n const timeToCall = Math.max(0, 16 - (currTime - lastTime));\n const id = setTimeout(function () { callback(currTime + timeToCall); },\n timeToCall);\n\n lastTime = currTime + timeToCall;\n return id;\n };\n}\n\nif (!cancel) {\n cancel = function (id) {\n clearTimeout(id);\n };\n}\n\nmodule.exports = {\n request,\n cancel,\n};\n","const extend = require('./extend');\nconst is = require('./is');\nconst {\n closest,\n parentNode,\n getElementRect,\n} = require('./domUtils');\n\nconst rectUtils = {\n getStringOptionResult: function (value, interactable, element) {\n if (!is.string(value)) {\n return null;\n }\n\n if (value === 'parent') {\n value = parentNode(element);\n }\n else if (value === 'self') {\n value = interactable.getRect(element);\n }\n else {\n value = closest(element, value);\n }\n\n return value;\n },\n\n resolveRectLike: function (value, interactable, element, functionArgs) {\n value = rectUtils.getStringOptionResult(value, interactable, element) || value;\n\n if (is.function(value)) {\n value = value.apply(null, functionArgs);\n }\n\n if (is.element(value)) {\n value = getElementRect(value);\n }\n\n return value;\n },\n\n rectToXY: function (rect) {\n return rect && {\n x: 'x' in rect ? rect.x : rect.left,\n y: 'y' in rect ? rect.y : rect.top,\n };\n },\n\n xywhToTlbr: function (rect) {\n if (rect && !('left' in rect && 'top' in rect)) {\n rect = extend({}, rect);\n\n rect.left = rect.x || 0;\n rect.top = rect.y || 0;\n rect.right = rect.right || (rect.left + rect.width);\n rect.bottom = rect.bottom || (rect.top + rect.height);\n }\n\n return rect;\n },\n\n tlbrToXywh: function (rect) {\n if (rect && !('x' in rect && 'y' in rect)) {\n rect = extend({}, rect);\n\n rect.x = rect.left || 0;\n rect.top = rect.top || 0;\n rect.width = rect.width || (rect.right - rect.x);\n rect.height = rect.height || (rect.bottom - rect.y);\n }\n\n return rect;\n },\n};\n\nmodule.exports = rectUtils;\n","const win = module.exports;\nconst isWindow = require('./isWindow');\n\nfunction init (window) {\n // get wrapped window if using Shadow DOM polyfill\n\n win.realWindow = window;\n\n // create a TextNode\n const el = window.document.createTextNode('');\n\n // check if it's wrapped by a polyfill\n if (el.ownerDocument !== window.document\n && typeof window.wrap === 'function'\n && window.wrap(el) === el) {\n // use wrapped window\n window = window.wrap(window);\n }\n\n win.window = window;\n}\n\nif (typeof window === 'undefined') {\n win.window = undefined;\n win.realWindow = undefined;\n}\nelse {\n init(window);\n}\n\nwin.getWindow = function getWindow (node) {\n if (isWindow(node)) {\n return node;\n }\n\n const rootNode = (node.ownerDocument || node);\n\n return rootNode.defaultView || rootNode.parentWindow || win.window;\n};\n\nwin.init = init;\n"]} \ No newline at end of file diff --git a/dist/interact.min.js b/dist/interact.min.js index c0bb2476c..2d1f0fb62 100644 --- a/dist/interact.min.js +++ b/dist/interact.min.js @@ -1,6 +1,6 @@ -/* interact.js v1.3.0-alpha.3+sha.9595c40 | https://raw.github.com/taye/interact.js/master/LICENSE */ -!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var t;t="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,t.interact=e()}}(function(){return function e(t,n,r){function i(s,a){if(!n[s]){if(!t[s]){var l="function"==typeof require&&require;if(!a&&l)return l(s,!0);if(o)return o(s,!0);var c=new Error("Cannot find module '"+s+"'");throw c.code="MODULE_NOT_FOUND",c}var p=n[s]={exports:{}};t[s][0].call(p.exports,function(e){var n=t[s][1][e];return i(n||e)},p,p.exports,e,t,n,r)}return n[s].exports}for(var o="function"==typeof require&&require,s=0;s6&&void 0!==arguments[6]&&arguments[6];r(this,e);var f=t.target,v=(f&&f.options||s).deltaSource,g=o(f,p,l),h="start"===c,m="end"===c,y=h?t.startCoords:t.curCoords,x=t.prevEvent;p=p||t.element;var b=i({},y.page),w=i({},y.client);b.x-=g.x,b.y-=g.y,w.x-=g.x,w.y-=g.y,this.ctrlKey=n.ctrlKey,this.altKey=n.altKey,this.shiftKey=n.shiftKey,this.metaKey=n.metaKey,this.button=n.button,this.buttons=n.buttons,this.target=p,this.currentTarget=p,this.relatedTarget=u||null,this.preEnd=d,this.type=l+(c||""),this.interaction=t,this.interactable=f,this.t0=h?t.downTimes[t.downTimes.length-1]:x.t0;var E={interaction:t,event:n,action:l,phase:c,element:p,related:u,page:b,client:w,coords:y,starting:h,ending:m,deltaSource:v,iEvent:this};a.fire("set-xy",E),m?(this.pageX=x.pageX,this.pageY=x.pageY,this.clientX=x.clientX,this.clientY=x.clientY):(this.pageX=b.x,this.pageY=b.y,this.clientX=w.x,this.clientY=w.y),this.x0=t.startCoords.page.x-g.x,this.y0=t.startCoords.page.y-g.y,this.clientX0=t.startCoords.client.x-g.x,this.clientY0=t.startCoords.client.y-g.y,a.fire("set-delta",E),this.timeStamp=y.timeStamp,this.dt=t.pointerDelta.timeStamp,this.duration=this.timeStamp-this.t0,this.speed=t.pointerDelta[v].speed,this.velocityX=t.pointerDelta[v].vx,this.velocityY=t.pointerDelta[v].vy,this.swipe=m||"inertiastart"===c?this.getSwipe():null,a.fire("new",E)}return e.prototype.getSwipe=function(){var e=this.interaction;if(e.prevEvent.speed<600||this.timeStamp-e.prevEvent.timeStamp>150)return null;var t=180*Math.atan2(e.prevEvent.velocityY,e.prevEvent.velocityX)/Math.PI;t<0&&(t+=360);var n=112.5<=t&&t<247.5,r=202.5<=t&&t<337.5,i=!n&&(292.5<=t||t<67.5);return{up:r,down:!r&&22.5<=t&&t<157.5,left:n,right:i,angle:t,speed:e.prevEvent.speed,velocity:{x:e.prevEvent.velocityX,y:e.prevEvent.velocityY}}},e.prototype.preventDefault=function(){},e.prototype.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},e.prototype.stopPropagation=function(){this.propagationStopped=!0},e}();a.on("set-delta",function(e){var t=e.iEvent,n=e.interaction,r=e.starting,i=e.deltaSource,o=r?t:n.prevEvent;"client"===i?(t.dx=t.clientX-o.clientX,t.dy=t.clientY-o.clientY):(t.dx=t.pageX-o.pageX,t.dy=t.pageY-o.pageY)}),l.signals=a,t.exports=l},{"./defaultOptions":18,"./utils/Signals":35,"./utils/extend":41,"./utils/getOriginXY":42}],4:[function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=e("./utils/is"),o=e("./utils/events"),s=e("./utils/extend"),a=e("./actions/base"),l=e("./scope"),c=e("./Eventable"),p=e("./defaultOptions"),u=e("./utils/Signals").new(),d=e("./utils/domUtils"),f=d.getElementRect,v=d.nodeContains,g=d.trySelector,h=e("./utils/window"),m=h.getWindow,y=e("./utils/arr"),x=y.indexOf,b=y.contains,w=e("./utils/browser"),E=w.wheelEvent;l.interactables=[];var S=function(){function e(t,n){r(this,e),n=n||{},this.target=t,this.events=new c,this._context=n.context||l.document,this._win=m(g(t)?this._context:t),this._doc=this._win.document,u.fire("new",{target:t,options:n,interactable:this,win:this._win}),l.addDocument(this._doc,this._win),l.interactables.push(this),this.set(n)}return e.prototype.setOnEvents=function(e,t){var n="on"+e;return i.function(t.onstart)&&(this.events[n+"start"]=t.onstart),i.function(t.onmove)&&(this.events[n+"move"]=t.onmove),i.function(t.onend)&&(this.events[n+"end"]=t.onend),i.function(t.oninertiastart)&&(this.events[n+"inertiastart"]=t.oninertiastart),this},e.prototype.setPerAction=function(e,t){for(var n in t)n in p[e]&&(i.object(t[n])?(this.options[e][n]=s(this.options[e][n]||{},t[n]),i.object(p.perAction[n])&&"enabled"in p.perAction[n]&&(this.options[e][n].enabled=!1!==t[n].enabled)):i.bool(t[n])&&i.object(p.perAction[n])?this.options[e][n].enabled=t[n]:void 0!==t[n]&&(this.options[e][n]=t[n]))},e.prototype.getRect=function(e){return e=e||this.target,i.string(this.target)&&!i.element(e)&&(e=this._context.querySelector(this.target)),f(e)},e.prototype.rectChecker=function(e){return i.function(e)?(this.getRect=e,this):null===e?(delete this.options.getRect,this):this.getRect},e.prototype._backCompatOption=function(e,t){if(g(t)||i.object(t)){this.options[e]=t;for(var n=a.names,r=Array.isArray(n),o=0,n=r?n:n[Symbol.iterator]();;){var s;if(r){if(o>=n.length)break;s=n[o++]}else{if(o=n.next(),o.done)break;s=o.value}var l=s;this.options[l][e]=t}return this}return this.options[e]},e.prototype.origin=function(e){return this._backCompatOption("origin",e)},e.prototype.deltaSource=function(e){return"page"===e||"client"===e?(this.options.deltaSource=e,this):this.options.deltaSource},e.prototype.context=function(){return this._context},e.prototype.inContext=function(e){return this._context===e.ownerDocument||v(this._context,e)},e.prototype.fire=function(e){return this.events.fire(e),this},e.prototype._onOffMultiple=function(e,t,n,r){if(i.string(t)&&-1!==t.search(" ")&&(t=t.trim().split(/ +/)),i.array(t)){for(var o=0;o=l.length)break;f=l[d++]}else{if(d=l.next(),d.done)break;f=d.value}var v=f;this.options[v]=p.base[v],v in t&&this[v](t[v])}return u.fire("set",{options:t,interactable:this}),this},e.prototype.unset=function(){if(o.remove(this.target,"all"),i.string(this.target))for(var e in o.delegatedEvents){var t=o.delegatedEvents[e];t.selectors[0]===this.target&&t.contexts[0]===this._context&&(t.selectors.splice(0,1),t.contexts.splice(0,1),t.listeners.splice(0,1),t.selectors.length||(t[e]=null)),o.remove(this._context,e,o.delegateListener),o.remove(this._context,e,o.delegateUseCapture,!0)}else o.remove(this,"all");u.fire("unset",{interactable:this}),l.interactables.splice(x(l.interactables,this),1);for(var n=l.interactions||[],r=Array.isArray(n),s=0,n=r?n:n[Symbol.iterator]();;){var a;if(r){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var c=a;c.target===this&&c.interacting()&&c.stop()}return l.interact},e}();l.interactables.indexOfElement=function(e,t){t=t||l.document;for(var n=0;n=y.length)break;w=y[b++]}else{if(b=y.next(),b.done)break;w=b.value}var E=w,S=E[0],T=E[1];T._updateEventTargets(r,i),T[e](S,t,r,i)}}}function o(e){for(var t=0;te.pointerMoveTolerance);var a={pointer:t,pointerIndex:this.getPointerIndex(t),event:n,eventTarget:r,dx:o,dy:s,duplicate:i,interaction:this,interactingBeforeMove:this.interacting()};i||l.setCoordDeltas(this.pointerDelta,this.prevCoords,this.curCoords),d.fire("move",a),i||(this.interacting()&&this.doMove(a),this.pointerWasMoved&&l.copyCoords(this.prevCoords,this.curCoords))},e.prototype.doMove=function(e){e=l.extend({pointer:this.pointers[0],event:this.prevEvent,eventTarget:this._eventTarget,interaction:this},e||{}),d.fire("before-action-move",e),this._dontFireMove||d.fire("action-move",e),this._dontFireMove=!1},e.prototype.pointerUp=function(e,t,n,r){var i=this.getPointerIndex(e);d.fire(/cancel$/i.test(t.type)?"cancel":"up",{pointer:e,pointerIndex:i,event:t,eventTarget:n,curEventTarget:r,interaction:this}),this.simulation||this.end(t),this.pointerIsDown=!1,this.removePointer(e,t)},e.prototype.end=function(e){e=e||this.prevEvent,this.interacting()&&d.fire("action-end",{event:e,interaction:this}),this.stop()},e.prototype.currentAction=function(){return this._interacting?this.prepared.name:null},e.prototype.interacting=function(){return this._interacting},e.prototype.stop=function(){d.fire("stop",{interaction:this}),this._interacting&&(d.fire("stop-active",{interaction:this}),d.fire("stop-"+this.prepared.name,{interaction:this})),this.target=this.element=null,this._interacting=!1,this.prepared.name=this.prevEvent=null},e.prototype.getPointerIndex=function(e){return l.indexOf(this.pointerIds,l.getPointerId(e))},e.prototype.updatePointer=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:t&&/(down|start)$/i.test(t.type),r=l.getPointerId(e),i=this.getPointerIndex(e);return-1===i&&(i=this.pointerIds.length,this.pointerIds[i]=r),n&&d.fire("update-pointer-down",{pointer:e,event:t,down:n,pointerId:r,pointerIndex:i,interaction:this}),this.pointers[i]=e,i},e.prototype.removePointer=function(e,t){var n=l.getPointerId(e),r=this.mouse?0:l.indexOf(this.pointerIds,n);-1!==r&&(d.fire("remove-pointer",{pointer:e,event:t,pointerIndex:r,interaction:this}),this.pointers.splice(r,1),this.pointerIds.splice(r,1),this.downTargets.splice(r,1),this.downTimes.splice(r,1))},e.prototype._updateEventTargets=function(e,t){this._eventTarget=e,this._curEventTarget=t},e}(),m=0,y=v.length;m=i.length)break;a=i[s++]}else{if(s=i.next(),s.done)break;a=s.value}var l=a;if(l.options.drop.enabled){var c=l.options.drop.accept;if(!(p.is.element(c)&&c!==t||p.is.string(c)&&!p.matchesSelector(t,c)))for(var d=p.is.string(l.target)?l._context.querySelectorAll(l.target):[l.target],f=0;fo.left&&c.xo.top&&c.y=o.left&&v<=o.right&&g>=o.top&&g<=o.bottom}if(f&&p.is.number(a)){s=Math.max(0,Math.min(o.right,f.right)-Math.max(o.left,f.left))*Math.max(0,Math.min(o.bottom,f.bottom)-Math.max(o.top,f.top))/(f.width*f.height)>=a}return this.options.drop.checker&&(s=this.options.drop.checker(e,t,s,this,i,n,r)),s},v.signals.on("unset",function(e){e.interactable.dropzone(!1)}),v.settingsMethods.push("dropChecker"),g.signals.on("new",function(e){e.dropTarget=null,e.dropElement=null,e.prevDropTarget=null,e.prevDropElement=null,e.dropEvents=null,e.activeDrops={dropzones:[],elements:[],rects:[]}}),g.signals.on("stop",function(e){var t=e.interaction;t.dropTarget=t.dropElement=t.prevDropTarget=t.prevDropElement=null}),d.dynamicDrop=function(e){return p.is.bool(e)?(y=e,d):y},p.merge(v.eventTypes,["dragenter","dragleave","dropactivate","dropdeactivate","dropmove","drop"]),c.methodDict.drop="dropzone",h.drop=m.defaults,t.exports=m},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../interact":21,"../scope":34,"../utils":44,"./base":6}],9:[function(e,t,n){"use strict";var r=e("./base"),i=e("../utils"),o=e("../InteractEvent"),s=e("../Interactable"),a=e("../Interaction"),l=e("../defaultOptions"),c={defaults:{enabled:!1,origin:null,restrict:null},checker:function(e,t,n,r,i){return i.pointerIds.length>=2?{name:"gesture"}:null},getCursor:function(){return""}};o.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;"gesturestart"===t.type&&(t.ds=0,n.gesture.startDistance=n.gesture.prevDistance=t.distance,n.gesture.startAngle=n.gesture.prevAngle=t.angle,n.gesture.scale=1)}),o.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;"gesturemove"===t.type&&(t.ds=t.scale-n.gesture.scale,n.target.fire(t),n.gesture.prevAngle=t.angle,n.gesture.prevDistance=t.distance,t.scale===1/0||null===t.scale||void 0===t.scale||isNaN(t.scale)||(n.gesture.scale=t.scale))}),s.prototype.gesturable=function(e){return i.is.object(e)?(this.options.gesture.enabled=!1!==e.enabled,this.setPerAction("gesture",e),this.setOnEvents("gesture",e),this):i.is.bool(e)?(this.options.gesture.enabled=e,e||(this.ongesturestart=this.ongesturestart=this.ongestureend=null),this):this.options.gesture},o.signals.on("set-delta",function(e){var t=e.interaction,n=e.iEvent,r=e.action,s=e.event,a=e.starting,l=e.ending,c=e.deltaSource;if("gesture"===r){var p=t.pointers;n.touches=[p[0],p[1]],a?(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=1,n.ds=0,n.angle=i.touchAngle(p,void 0,c),n.da=0):l||s instanceof o?(n.distance=t.prevEvent.distance,n.box=t.prevEvent.box,n.scale=t.prevEvent.scale,n.ds=n.scale-1,n.angle=t.prevEvent.angle,n.da=n.angle-t.gesture.startAngle):(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=n.distance/t.gesture.startDistance,n.angle=i.touchAngle(p,t.gesture.prevAngle,c),n.ds=n.scale-t.gesture.prevScale,n.da=n.angle-t.gesture.prevAngle)}}),a.signals.on("new",function(e){e.gesture={start:{x:0,y:0},startDistance:0,prevDistance:0,distance:0,scale:1,startAngle:0,prevAngle:0}}),r.gesture=c,r.names.push("gesture"),i.merge(s.eventTypes,["gesturestart","gesturemove","gestureend"]),r.methodDict.gesture="gesturable",l.gesture=c.defaults,t.exports=c},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"./base":6}],10:[function(e,t,n){"use strict";function r(e,t,n,r,i,s,a){if(!t)return!1;if(!0===t){var l=o.is.number(s.width)?s.width:s.right-s.left,c=o.is.number(s.height)?s.height:s.bottom-s.top;if(l<0&&("left"===e?e="right":"right"===e&&(e="left")),c<0&&("top"===e?e="bottom":"bottom"===e&&(e="top")),"left"===e)return n.x<(l>=0?s.left:s.right)+a;if("top"===e)return n.y<(c>=0?s.top:s.bottom)+a;if("right"===e)return n.x>(l>=0?s.right:s.left)-a;if("bottom"===e)return n.y>(c>=0?s.bottom:s.top)-a}return!!o.is.element(r)&&(o.is.element(t)?t===r:o.matchesUpTo(r,t,i))}var i=e("./base"),o=e("../utils"),s=e("../utils/browser"),a=e("../InteractEvent"),l=e("../Interactable"),c=e("../Interaction"),p=e("../defaultOptions"),u=s.supportsTouch||s.supportsPointerEvent?20:10,d={defaults:{enabled:!1,mouseButtons:null,origin:null,snap:null,restrict:null,inertia:null,autoScroll:null,square:!1,preserveAspectRatio:!1,axis:"xy",margin:NaN,edges:null,invert:"none"},checker:function(e,t,n,i,s,a){if(!a)return null;var l=o.extend({},s.curCoords.page),c=n.options;if(c.resize.enabled){var p=c.resize,d={left:!1,right:!1,top:!1,bottom:!1};if(o.is.object(p.edges)){for(var f in d)d[f]=r(f,p.edges[f],l,s._eventTarget,i,a,p.margin||u);if(d.left=d.left&&!d.right,d.top=d.top&&!d.bottom,d.left||d.right||d.top||d.bottom)return{name:"resize",edges:d}}else{var v="y"!==c.resize.axis&&l.x>a.right-u,g="x"!==c.resize.axis&&l.y>a.bottom-u;if(v||g)return{name:"resize",axes:(v?"x":"")+(g?"y":"")}}}return null},cursors:s.isIe9OrOlder?{x:"e-resize",y:"s-resize",xy:"se-resize",top:"n-resize",left:"w-resize",bottom:"s-resize",right:"e-resize",topleft:"se-resize",bottomright:"se-resize",topright:"ne-resize",bottomleft:"ne-resize"}:{x:"ew-resize",y:"ns-resize",xy:"nwse-resize",top:"ns-resize",left:"ew-resize",bottom:"ns-resize",right:"ew-resize",topleft:"nwse-resize",bottomright:"nwse-resize",topright:"nesw-resize",bottomleft:"nesw-resize"},getCursor:function(e){if(e.axis)return d.cursors[e.name+e.axis];if(e.edges){for(var t="",n=["top","bottom","left","right"],r=0;r<4;r++)e.edges[n[r]]&&(t+=n[r]);return d.cursors[t]}}};a.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;if("resizestart"===t.type&&n.prepared.edges){var r=n.target.getRect(n.element),i=n.target.options.resize;if(i.square||i.preserveAspectRatio){var s=o.extend({},n.prepared.edges);s.top=s.top||s.left&&!s.bottom,s.left=s.left||s.top&&!s.right,s.bottom=s.bottom||s.right&&!s.top,s.right=s.right||s.bottom&&!s.left,n.prepared._linkedEdges=s}else n.prepared._linkedEdges=null;i.preserveAspectRatio&&(n.resizeStartAspectRatio=r.width/r.height),n.resizeRects={start:r,current:o.extend({},r),inverted:o.extend({},r),previous:o.extend({},r),delta:{left:0,right:0,width:0,top:0,bottom:0,height:0}},t.rect=n.resizeRects.inverted,t.deltaRect=n.resizeRects.delta}}),a.signals.on("new",function(e){var t=e.iEvent,n=e.phase,r=e.interaction;if("move"===n&&r.prepared.edges){var i=r.target.options.resize,s=i.invert,a="reposition"===s||"negate"===s,l=r.prepared.edges,c=r.resizeRects.start,p=r.resizeRects.current,u=r.resizeRects.inverted,d=r.resizeRects.delta,f=o.extend(r.resizeRects.previous,u),v=l,g=t.dx,h=t.dy;if(i.preserveAspectRatio||i.square){var m=i.preserveAspectRatio?r.resizeStartAspectRatio:1;l=r.prepared._linkedEdges,v.left&&v.bottom||v.right&&v.top?h=-g/m:v.left||v.right?h=g/m:(v.top||v.bottom)&&(g=h*m)}if(l.top&&(p.top+=h),l.bottom&&(p.bottom+=h),l.left&&(p.left+=g),l.right&&(p.right+=g),a){if(o.extend(u,p),"reposition"===s){var y=void 0;u.top>u.bottom&&(y=u.top,u.top=u.bottom,u.bottom=y),u.left>u.right&&(y=u.left,u.left=u.right,u.right=y)}}else u.top=Math.min(p.top,c.bottom),u.bottom=Math.max(p.bottom,c.top),u.left=Math.min(p.left,c.right),u.right=Math.max(p.right,c.left);u.width=u.right-u.left,u.height=u.bottom-u.top;for(var x in u)d[x]=u[x]-f[x];t.edges=r.prepared.edges,t.rect=u,t.deltaRect=d}}),l.prototype.resizable=function(e){return o.is.object(e)?(this.options.resize.enabled=!1!==e.enabled,this.setPerAction("resize",e),this.setOnEvents("resize",e),/^x$|^y$|^xy$/.test(e.axis)?this.options.resize.axis=e.axis:null===e.axis&&(this.options.resize.axis=p.resize.axis),o.is.bool(e.preserveAspectRatio)?this.options.resize.preserveAspectRatio=e.preserveAspectRatio:o.is.bool(e.square)&&(this.options.resize.square=e.square),this):o.is.bool(e)?(this.options.resize.enabled=e,e||(this.onresizestart=this.onresizestart=this.onresizeend=null),this):this.options.resize},c.signals.on("new",function(e){ -e.resizeAxes="xy"}),a.signals.on("set-delta",function(e){var t=e.interaction,n=e.iEvent;"resize"===e.action&&t.resizeAxes&&(t.target.options.resize.square?("y"===t.resizeAxes?n.dx=n.dy:n.dy=n.dx,n.axes="xy"):(n.axes=t.resizeAxes,"x"===t.resizeAxes?n.dy=0:"y"===t.resizeAxes&&(n.dx=0)))}),i.resize=d,i.names.push("resize"),o.merge(l.eventTypes,["resizestart","resizemove","resizeinertiastart","resizeinertiaresume","resizeend"]),i.methodDict.resize="resizable",p.resize=d.defaults,t.exports=d},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"../utils/browser":37,"./base":6}],11:[function(e,t,n){"use strict";var r=e("./utils/raf"),i=e("./utils/window").getWindow,o=e("./utils/is"),s=e("./utils/domUtils"),a=e("./Interaction"),l=e("./defaultOptions"),c={defaults:{enabled:!1,container:null,margin:60,speed:300},interaction:null,i:null,x:0,y:0,isScrolling:!1,prevTime:0,start:function(e){c.isScrolling=!0,r.cancel(c.i),c.interaction=e,c.prevTime=(new Date).getTime(),c.i=r.request(c.scroll)},stop:function(){c.isScrolling=!1,r.cancel(c.i)},scroll:function(){var e=c.interaction.target.options[c.interaction.prepared.name].autoScroll,t=e.container||i(c.interaction.element),n=(new Date).getTime(),s=(n-c.prevTime)/1e3,a=e.speed*s;a>=1&&(o.window(t)?t.scrollBy(c.x*a,c.y*a):t&&(t.scrollLeft+=c.x*a,t.scrollTop+=c.y*a),c.prevTime=n),c.isScrolling&&(r.cancel(c.i),c.i=r.request(c.scroll))},check:function(e,t){var n=e.options;return n[t].autoScroll&&n[t].autoScroll.enabled},onInteractionMove:function(e){var t=e.interaction,n=e.pointer;if(t.interacting()&&c.check(t.target,t.prepared.name)){if(t.simulation)return void(c.x=c.y=0);var r=void 0,a=void 0,l=void 0,p=void 0,u=t.target.options[t.prepared.name].autoScroll,d=u.container||i(t.element);if(o.window(d))p=n.clientXd.innerWidth-c.margin,l=n.clientY>d.innerHeight-c.margin;else{var f=s.getElementClientRect(d);p=n.clientXf.right-c.margin,l=n.clientY>f.bottom-c.margin}c.x=a?1:p?-1:0,c.y=l?1:r?-1:0,c.isScrolling||(c.margin=u.margin,c.speed=u.speed,c.start(t))}}};a.signals.on("stop-active",function(){c.stop()}),a.signals.on("action-move",c.onInteractionMove),l.perAction.autoScroll=c.defaults,t.exports=c},{"./Interaction":5,"./defaultOptions":18,"./utils/domUtils":39,"./utils/is":46,"./utils/raf":50,"./utils/window":52}],12:[function(e,t,n){"use strict";var r=e("../Interactable"),i=e("../actions/base"),o=e("../utils/is"),s=e("../utils/domUtils");r.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},r.prototype.ignoreFrom=function(e){return this._backCompatOption("ignoreFrom",e)},r.prototype.allowFrom=function(e){return this._backCompatOption("allowFrom",e)},r.prototype.testIgnore=function(e,t,n){return!(!e||!o.element(n))&&(o.string(e)?s.matchesUpTo(n,e,t):!!o.element(e)&&s.nodeContains(e,n))},r.prototype.testAllow=function(e,t,n){return!e||!!o.element(n)&&(o.string(e)?s.matchesUpTo(n,e,t):!!o.element(e)&&s.nodeContains(e,n))},r.prototype.testIgnoreAllow=function(e,t,n){return!this.testIgnore(e.ignoreFrom,t,n)&&this.testAllow(e.allowFrom,t,n)},r.prototype.actionChecker=function(e){return o.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},r.prototype.styleCursor=function(e){return o.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},r.prototype.defaultActionChecker=function(e,t,n,r){for(var o=this.getRect(r),s=null,a=i.names,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var u=p;if((!n.pointerIsDown||!n.mouse||0!=(t.buttons&this.options[u].mouseButtons))&&(s=i[u].checker(e,t,this,r,n,o)))return s}}},{"../Interactable":4,"../actions/base":6,"../utils/domUtils":39,"../utils/is":46}],13:[function(e,t,n){"use strict";function r(e,t,n,r){return g.is.object(e)&&t.testIgnoreAllow(t.options[e.name],n,r)&&t.options[e.name].enabled&&a(t,n,e)?e:null}function i(e,t,n,i,o,s){for(var a=0,l=i.length;a=m.maxInteractions)return!1;if(u.target===e){if((a+=d===n.name|0)>=i)return!1;if(u.element===t&&(l++,d!==n.name||l>=o))return!1}}}return m.maxInteractions>0}}var l=e("../interact"),c=e("../Interactable"),p=e("../Interaction"),u=e("../actions/base"),d=e("../defaultOptions"),f=e("../utils/browser"),v=e("../scope"),g=e("../utils"),h=e("../utils/Signals").new();e("./InteractableMethods");var m={signals:h,withinInteractionLimit:a,maxInteractions:1/0,defaults:{perAction:{manualStart:!1,max:1/0,maxPerElement:1,allowFrom:null,ignoreFrom:null}},setActionDefaults:function(e){g.extend(e.defaults,m.defaults.perAction)}};p.signals.on("down",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;if(!t.interacting()){s(t,o(t,n,r,i))}}),p.signals.on("move",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;if(t.mouse&&!t.pointerIsDown&&!t.interacting()){s(t,o(t,n,r,i))}}),p.signals.on("move",function(e){var t=e.interaction,n=e.event;if(t.pointerIsDown&&!t.interacting()&&t.pointerWasMoved&&t.prepared.name){h.fire("before-start",e);var r=t.target;t.prepared.name&&r&&(r.options[t.prepared.name].manualStart||!a(r,t.element,t.prepared)?t.stop(n):t.start(t.prepared,r,t.element))}}),p.signals.on("stop",function(e){var t=e.interaction,n=t.target;n&&n.options.styleCursor&&(n._doc.documentElement.style.cursor="")}),c.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},c.prototype.actionChecker=function(e){return g.is.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},c.prototype.styleCursor=function(e){return g.is.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},c.prototype.defaultActionChecker=function(e,t,n,r){for(var i=this.getRect(r),o=t.buttons||{0:1,1:4,3:8,4:16}[t.button],s=null,a=u.names,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var d=p;if((!n.pointerIsDown||!n.mouse||0!=(o&this.options[d].mouseButtons))&&(s=u[d].checker(e,t,this,r,n,i)))return s}},l.maxInteractions=function(e){return g.is.number(e)?(m.maxInteractions=e,this):m.maxInteractions},c.settingsMethods.push("styleCursor"),c.settingsMethods.push("actionChecker"),c.settingsMethods.push("ignoreFrom"),c.settingsMethods.push("allowFrom"),d.base.actionChecker=null,d.base.styleCursor=!0,g.extend(d.perAction,m.defaults.perAction),t.exports=m},{"../Interactable":4,"../Interaction":5,"../actions/base":6,"../defaultOptions":18,"../interact":21,"../scope":34,"../utils":44,"../utils/Signals":35,"../utils/browser":37,"./InteractableMethods":12}],14:[function(e,t,n){"use strict";var r=e("./base"),i=e("../Interaction");i.signals.on("new",function(e){e.delayTimer=null}),r.signals.on("prepared",function(e){var t=e.interaction,n=t.prepared.name;if(n){var r=t.target.options[n].delay;r>0&&(t.delayTimer=setTimeout(function(){t.start(t.prepared,t.target,t.element)},r))}}),i.signals.on("move",function(e){var t=e.interaction,n=e.duplicate;t.pointerWasMoved&&!n&&clearTimeout(t.delayTimer)}),r.signals.on("before-start",function(e){var t=e.interaction,n=t.prepared.name;if(n){t.target.options[n].delay>0&&(t.prepared.name=null)}})},{"../Interaction":5,"./base":13}],15:[function(e,t,n){"use strict";function r(e,t){if(!t)return!1;var n=t.options.drag.startAxis;return"xy"===e||"xy"===n||n===e}var i=e("./base"),o=e("../scope"),s=e("../utils/browser"),a=e("../utils/is"),l=e("../utils/domUtils"),c=l.matchesSelector,p=l.parentNode;i.setActionDefaults(e("../actions/drag")),i.signals.on("before-start",function(e){var t=e.interaction,n=e.eventTarget,l=e.dx,u=e.dy;if("drag"===t.prepared.name){var d=Math.abs(l),f=Math.abs(u),v=t.target.options.drag,g=v.startAxis,h=d>f?"x":dl.minSpeed&&g>l.endSpeed,b={interaction:t,pageCoords:v,statuses:f,preEnd:!0,requireEndOnly:!0};y&&!x&&(c.resetStatuses(f),m=c.setAll(b),m.shouldMove&&m.locked&&(h=!0)),(x||h)&&(p.copyCoords(i.upCoords,t.curCoords),t.pointers[0]=i.startEvent=new a(t,n,t.prepared.name,"inertiastart",t.element),i.t0=d,i.active=!0,i.allowResume=l.allowResume,t.simulation=i,o.fire(i.startEvent),x?(i.vx0=t.pointerDelta.client.vx,i.vy0=t.pointerDelta.client.vy,i.v0=g,r(t,i),p.extend(v,t.curCoords.page),v.x+=i.xe,v.y+=i.ye,c.resetStatuses(f),m=c.setAll(b),i.modifiedXe+=m.dx,i.modifiedYe+=m.dy,i.i=u.request(t.boundInertiaFrame)):(i.smoothEnd=!0,i.xe=m.dx,i.ye=m.dy,i.sx=i.sy=0,i.i=u.request(t.boundSmoothEndFrame)))}}),l.signals.on("stop-active",function(e){var t=e.interaction,n=t.inertiaStatus;n.active&&(u.cancel(n.i),n.active=!1,t.simulation=null)})},{"./InteractEvent":3,"./Interaction":5,"./modifiers":24,"./utils":44,"./utils/raf":50}],21:[function(e,t,n){"use strict";function r(e,t){var n=a.interactables.get(e,t);return n||(n=new l(e,t),n.events.global=p),n}var i=e("./utils/browser"),o=e("./utils/events"),s=e("./utils"),a=e("./scope"),l=e("./Interactable"),c=e("./Interaction"),p={};r.isSet=function(e,t){return-1!==a.interactables.indexOfElement(e,t&&t.context)},r.on=function(e,t,n){if(s.is.string(e)&&-1!==e.search(" ")&&(e=e.trim().split(/ +/)),s.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.on(f,t,n)}return r}if(s.is.object(e)){for(var v in e)r.on(v,e[v],t);return r}return s.contains(l.eventTypes,e)?p[e]?p[e].push(t):p[e]=[t]:o.add(a.document,e,t,{options:n}),r},r.off=function(e,t,n){if(s.is.string(e)&&-1!==e.search(" ")&&(e=e.trim().split(/ +/)),s.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.off(f,t,n)}return r}if(s.is.object(e)){for(var v in e)r.off(v,e[v],t);return r}if(s.contains(l.eventTypes,e)){var g=void 0;e in p&&-1!==(g=s.indexOf(p[e],t))&&p[e].splice(g,1)}else o.remove(a.document,e,t,n);return r},r.debug=function(){return a},r.getPointerAverage=s.pointerAverage,r.getTouchBBox=s.touchBBox,r.getTouchDistance=s.touchDistance,r.getTouchAngle=s.touchAngle,r.getElementRect=s.getElementRect,r.getElementClientRect=s.getElementClientRect,r.matchesSelector=s.matchesSelector,r.closest=s.closest,r.supportsTouch=function(){return i.supportsTouch},r.supportsPointerEvent=function(){return i.supportsPointerEvent},r.stop=function(e){for(var t=a.interactions.length-1;t>=0;t--)a.interactions[t].stop(e);return r},r.pointerMoveTolerance=function(e){return s.is.number(e)?(c.pointerMoveTolerance=e,this):c.pointerMoveTolerance},r.addDocument=a.addDocument,r.removeDocument=a.removeDocument,a.interact=r,t.exports=r},{"./Interactable":4,"./Interaction":5,"./scope":34,"./utils":44,"./utils/browser":37,"./utils/events":40}],22:[function(e,t,n){"use strict";function r(e){var t=e.interaction,n=e.event;t.target&&t.target.checkAndPreventDefault(n)}var i=e("./Interactable"),o=e("./Interaction"),s=e("./scope"),a=e("./utils/is"),l=e("./utils/events"),c=e("./utils/domUtils"),p=c.nodeContains,u=c.matchesSelector;i.prototype.preventDefault=function(e){return/^(always|never|auto)$/.test(e)?(this.options.preventDefault=e,this):a.bool(e)?(this.options.preventDefault=e?"always":"never",this):this.options.preventDefault},i.prototype.checkAndPreventDefault=function(e){var t=this.options.preventDefault;if("never"!==t)return"always"===t?void e.preventDefault():void(l.supportsOptions||/^(mouse|pointer|touch)*(down|start)/i.test(e.type)||a.element(e.target)&&u(e.target,"input,select,textarea,[contenteditable=true],[contenteditable=true] *")||e.preventDefault())};for(var d=["down","move","up","cancel"],f=0;f=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i;if(o.element&&(o.element===e.target||p(o.element,e.target)))return void o.target.checkAndPreventDefault(e)}}},{"./Interactable":4,"./Interaction":5,"./scope":34,"./utils/domUtils":39,"./utils/events":40,"./utils/is":46}],23:[function(e,t,n){"use strict";function r(e){var t=e.target,n=a.search(e,e.type,t);n&&n.prevTap&&e.clientX===n.prevTap.clientX&&e.clientY===n.prevTap.clientY&&t===n.prevTap.target&&(n.downTargets[0]=t,n.downTimes[0]=(new Date).getTime(),l.fire({interaction:n,event:e,eventTarget:t,pointer:e,type:"tap"}))}var i=e("./scope"),o=e("./utils/events"),s=e("./utils/browser"),a=e("./utils/interactionFinder"),l=e("./pointerEvents/base"),c=e("./utils/window"),p=c.window,u=Object.prototype.toString;if(p.Array.isArray||(p.Array.isArray=function(e){return"[object Array]"===u.call(e)}),String.prototype.trim||(String.prototype.trim=function(){return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")}),s.isIE8){var d=function(e){for(var t=i.interactions,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var o;if(n){if(r>=t.length)break;o=t[r++]}else{if(r=t.next(),r.done)break;o=r.value}var s=o;s.interacting()&&s.target.checkAndPreventDefault(e)}},f=function(e,t){var n=e.doc,i=(e.win,0===t.indexOf("listen")?o.add:o.remove);i(n,"selectstart",d),l&&i(n,"dblclick",r)};i.signals.on("add-document",f),i.signals.on("remove-document",f)}t.exports=null},{"./pointerEvents/base":31,"./scope":34,"./utils/browser":37,"./utils/events":40,"./utils/interactionFinder":45,"./utils/window":52}],24:[function(e,t,n){"use strict";function r(e,t,n){return e&&e.enabled&&(t||!e.endOnly)&&(!n||e.endOnly)}var i=e("../InteractEvent"),o=e("../Interaction"),s=e("../utils/extend"),a={names:[],setOffsets:function(e){var t=e.interaction,n=e.pageCoords,r=t.target,i=t.element,o=t.startOffset,s=r.getRect(i);s?(o.left=n.x-s.left,o.top=n.y-s.top,o.right=s.right-n.x,o.bottom=s.bottom-n.y,"width"in s||(s.width=s.right-s.left),"height"in s||(s.height=s.bottom-s.top)):o.left=o.top=o.right=o.bottom=0,e.rect=s,e.interactable=r,e.element=i;for(var l=0;l=p.length)break;f=p[d++]}else{if(d=p.next(),d.done)break;f=d.value}var v=f,g=a[v],h=t.target.options[t.prepared.name][v];r(h,i,o)&&(e.status=e.status=n[v],e.options=h,e.offset=e.interaction.modifierOffsets[v],g.set(e),e.status.locked&&(l.x+=e.status.dx,l.y+=e.status.dy,c.dx+=e.status.dx,c.dy+=e.status.dy,c.locked=!0))}return c.shouldMove=!e.status||!c.locked||e.status.changed,c},resetStatuses:function(e){for(var t=a.names,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var i;if(n){if(r>=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i,s=e[o]||{};s.dx=s.dy=0,s.modifiedX=s.modifiedY=NaN,s.locked=!1,s.changed=!0,e[o]=s}return e},start:function(e,t){var n=e.interaction,r={interaction:n,pageCoords:("action-resume"===t?n.curCoords:n.startCoords).page,startOffset:n.startOffset,statuses:n.modifierStatuses,preEnd:!1,requireEndOnly:!1};a.setOffsets(r),a.resetStatuses(r.statuses),r.pageCoords=s({},n.startCoords.page),n.modifierResult=a.setAll(r)}};o.signals.on("new",function(e){e.startOffset={left:0,right:0,top:0,bottom:0},e.modifierOffsets={},e.modifierStatuses=a.resetStatuses({}),e.modifierResult=null}),o.signals.on("action-start",a.start),o.signals.on("action-resume",a.start),o.signals.on("before-action-move",function(e){var t=e.interaction,n=e.preEnd,r=e.interactingBeforeMove,i=a.setAll({interaction:t,preEnd:n,pageCoords:t.curCoords.page,statuses:t.modifierStatuses,requireEndOnly:!1});!i.shouldMove&&r&&(t._dontFireMove=!0),t.modifierResult=i}),o.signals.on("action-end",function(e){for(var t=e.interaction,n=e.event,i=0;i=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}var m=h,y=m.x,x=m.y;l.push({x:s.left-i.width*y+u.x,y:s.top-i.height*x+u.y})}else l.push(u);return l},set:function(e){var t=e.interaction,n=e.pageCoords,r=e.status,i=e.options,s=e.offset,a=[],l=void 0,c=void 0,p=void 0;if(r.useStatusXY)c={x:r.x,y:r.y};else{var u=o.getOriginXY(t.target,t.element,t.prepared.name);c=o.extend({},n),c.x-=u.x,c.y-=u.y}r.realX=c.x,r.realY=c.y;for(var d=i.targets?i.targets.length:0,f=s,v=Array.isArray(f),g=0,f=v?f:f[Symbol.iterator]();;){var h;if(v){if(g>=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}for(var m=h,y=m.x,x=m.y,b=c.x-y,w=c.y-x,E=i.targets,S=Array.isArray(E),T=0,E=S?E:E[Symbol.iterator]();;){var C;if(S){if(T>=E.length)break;C=E[T++]}else{if(T=E.next(),T.done)break;C=T.value}var A=C;l=o.is.function(A)?A(b,w,t):A,l&&a.push({x:o.is.number(l.x)?l.x+y:b,y:o.is.number(l.y)?l.y+x:w,range:o.is.number(l.range)?l.range:i.range})}}var D={target:null,inRange:!1,distance:0,range:0,dx:0,dy:0};for(p=0,d=a.length;p=p.length)break;f=p[d++]}else{if(d=p.next(),d.done)break;f=d.value}var v=f,g=void 0;g=a.is.function(v)?v(l,c,t):v,g&&("width"in g&&"height"in g&&(g.x=g.width,g.y=g.height),e.options.targets.push(g))}i.set(e)},modifyCoords:function(e){var t=e.options;e.options=a.extend({},t), -e.options.enabled=t.enabled,e.options.relativePoints=[null],i.modifyCoords(e)}};r.snapSize=l,r.names.push("snapSize"),o.perAction.snapSize=l.defaults,s.defaults.snapSize=l.defaults,t.exports=l},{"../actions/resize":10,"../defaultOptions":18,"../utils/":44,"./index":24,"./snap":28}],30:[function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=e("../utils/pointerUtils");t.exports=function(){function e(t,n,o,s,a){if(r(this,e),i.pointerExtend(this,o),o!==n&&i.pointerExtend(this,n),this.interaction=a,this.timeStamp=(new Date).getTime(),this.originalEvent=o,this.type=t,this.pointerId=i.getPointerId(n),this.pointerType=i.getPointerType(n,a),this.target=s,this.currentTarget=null,"tap"===t){var l=a.getPointerIndex(n);this.dt=this.timeStamp-a.downTimes[l];var c=this.timeStamp-a.tapTime;this.double=!!(a.prevTap&&"doubletap"!==a.prevTap.type&&a.prevTap.target===this.target&&c<500)}else"doubletap"===t&&(this.dt=n.timeStamp-a.tapTime)}return e.prototype.subtractOrigin=function(e){var t=e.x,n=e.y;return this.pageX-=t,this.pageY-=n,this.clientX-=t,this.clientY-=n,this},e.prototype.addOrigin=function(e){var t=e.x,n=e.y;return this.pageX+=t,this.pageY+=n,this.clientX+=t,this.clientY+=n,this},e.prototype.preventDefault=function(){this.originalEvent.preventDefault()},e.prototype.stopPropagation=function(){this.propagationStopped=!0},e.prototype.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},e}()},{"../utils/pointerUtils":49}],31:[function(e,t,n){"use strict";function r(e){for(var t=e.interaction,n=e.pointer,s=e.event,l=e.eventTarget,c=e.type,u=void 0===c?e.pointerEvent.type:c,d=e.targets,f=void 0===d?i(e):d,v=e.pointerEvent,g=void 0===v?new o(u,n,s,l,t):v,h={interaction:t,pointer:n,event:s,eventTarget:l,targets:f,type:u,pointerEvent:g},m=0;m=u.length)break;g=u[v++]}else{if(v=u.next(),v.done)break;g=v.value}var h=g;c.element=h,p.fire("collect-targets",c)}return"hold"===o&&(c.targets=d(c.targets,function(e){return e.eventable.options.holdDuration===t.holdTimers[s].duration})),c.targets}var o=e("./PointerEvent"),s=e("../Interaction"),a=e("../utils"),l=e("../utils/browser"),c=e("../defaultOptions"),p=e("../utils/Signals").new(),u=e("../utils/arr"),d=u.filter,f=["down","up","cancel"],v=["down","up","cancel"],g={PointerEvent:o,fire:r,collectEventTargets:i,signals:p,defaults:{holdDuration:600,ignoreFrom:null,allowFrom:null,origin:{x:0,y:0}},types:["down","move","up","cancel","tap","doubletap","hold"]};s.signals.on("update-pointer-down",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers[n]={duration:1/0,timeout:null}}),s.signals.on("remove-pointer",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers.splice(n,1)}),s.signals.on("move",function(e){var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,s=e.duplicateMove,a=t.getPointerIndex(n);s||t.pointerIsDown&&!t.pointerWasMoved||(t.pointerIsDown&&clearTimeout(t.holdTimers[a].timeout),r({interaction:t,pointer:n,event:i,eventTarget:o,type:"move"}))}),s.signals.on("down",function(e){for(var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,s=e.pointerIndex,c=l.isIE8?a.extend({},i):i,u=t.holdTimers[s],d=a.getPath(o),f={interaction:t,pointer:n,event:i,eventTarget:o,type:"hold",targets:[],path:d,element:null},v=d,g=Array.isArray(v),h=0,v=g?v:v[Symbol.iterator]();;){var m;if(g){if(h>=v.length)break;m=v[h++]}else{if(h=v.next(),h.done)break;m=h.value}var y=m;f.element=y,p.fire("collect-targets",f)}if(f.targets.length){for(var x=1/0,b=0;b=0&&(p.selectors[u]!==e||p.contexts[u]!==t);u--);-1===u&&(u=p.selectors.length,p.selectors.push(e),p.contexts.push(t),p.listeners.push([])),p.listeners[u].push([i,!!s.capture,s.passive])}function s(e,t,n,r,o){var s=f(o),c=O[n],p=!1,u=void 0;if(c)for(u=c.selectors.length-1;u>=0;u--)if(c.selectors[u]===e&&c.contexts[u]===t){for(var d=c.listeners[u],v=d.length-1;v>=0;v--){var g=d[v],h=g[0],m=g[1],y=g[2];if(h===r&&m===!!s.capture&&y===s.passive){d.splice(v,1),d.length||(c.selectors.splice(u,1),c.contexts.splice(u,1),c.listeners.splice(u,1),i(t,n,a),i(t,n,l,!0),c.selectors.length||(O[n]=null)),p=!0;break}}if(p)break}}function a(e,t){var n=f(t),r={},i=O[e.type],o=g.getActualElement(e.path?e.path[0]:e.target),s=o;for(h(r,e),r.originalEvent=e,r.preventDefault=p;v.element(s);){for(var a=0;a=l.length)break;u=l[p++]}else{if(p=l.next(),p.done)break;u=p.value}var d=u,f=s[d](a);if(f)return f}},simulationResume:function(e){var t=e.mouseEvent,n=e.eventType,o=e.eventTarget;if(!/down|start/i.test(n))return null;for(var s=r.interactions,a=Array.isArray(s),l=0,s=a?s:s[Symbol.iterator]();;){var c;if(a){if(l>=s.length)break;c=s[l++]}else{if(l=s.next(),l.done)break;c=l.value}var p=c,u=o;if(p.simulation&&p.simulation.allowResume&&p.mouse===t)for(;u;){if(u===p.element)return p;u=i.parentNode(u)}}return null},mouse:function(e){var t=e.pointerId,n=e.mouseEvent,s=e.eventType;if(!n&&(o.supportsTouch||o.supportsPointerEvent))return null;for(var a=void 0,l=r.interactions,c=Array.isArray(l),p=0,l=c?l:l[Symbol.iterator]();;){var u;if(c){if(p>=l.length)break;u=l[p++]}else{if(p=l.next(),p.done)break;u=p.value}var d=u;if(d.mouse){if(d.simulation&&!i.contains(d.pointerIds,t))continue;if(d.interacting())return d;a||(a=d)}}if(a)return a;for(var f=r.interactions,v=Array.isArray(f),g=0,f=v?f:f[Symbol.iterator]();;){var h;if(v){if(g>=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}var m=h;if(m.mouse&&(!/down/.test(s)||!m.simulation))return m}return null},hasPointer:function(e){for(var t=e.pointerId,n=r.interactions,o=Array.isArray(n),s=0,n=o?n:n[Symbol.iterator]();;){var a;if(o){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var l=a;if(i.contains(l.pointerIds,t))return l}},idle:function(e){for(var t=e.mouseEvent,n=r.interactions,i=Array.isArray(n),o=0,n=i?n:n[Symbol.iterator]();;){var s;if(i){if(o>=n.length)break;s=n[o++]}else{if(o=n.next(),o.done)break;s=o.value}var a=s;if(1===a.pointerIds.length){var l=a.target;if(l&&!l.options.gesture.enabled)continue}else if(a.pointerIds.length>=2)continue;if(!a.interacting()&&t===a.mouse)return a}return null}};t.exports=s},{"../scope":34,"./browser":37,"./index":44}],46:[function(e,t,n){"use strict";var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},i=e("./window"),o=e("./isWindow"),s={array:function(){},window:function(e){return e===i.window||o(e)},docFrag:function(e){return s.object(e)&&11===e.nodeType},object:function(e){return!!e&&"object"===(void 0===e?"undefined":r(e))},function:function(e){return"function"==typeof e},number:function(e){return"number"==typeof e},bool:function(e){return"boolean"==typeof e},string:function(e){return"string"==typeof e},element:function(e){if(!e||"object"!==(void 0===e?"undefined":r(e)))return!1;var t=i.getWindow(e)||i.window;return/object|function/.test(r(t.Element))?e instanceof t.Element:1===e.nodeType&&"string"==typeof e.nodeName}};s.array=function(e){return s.object(e)&&void 0!==e.length&&s.function(e.splice)},t.exports=s},{"./isWindow":47,"./window":52}],47:[function(e,t,n){"use strict";t.exports=function(e){return!(!e||!e.Window)&&e instanceof e.Window}},{}],48:[function(e,t,n){"use strict";function r(e,n){for(var r in n){var i=t.exports.prefixedPropREs,o=!1;for(var s in i)if(0===r.indexOf(s)&&i[s].test(r)){o=!0;break}o||"function"==typeof n[r]||(e[r]=n[r])}return e}r.prefixedPropREs={webkit:/(Movement[XY]|Radius[XY]|RotationAngle|Force)$/},t.exports=r},{}],49:[function(e,t,n){"use strict";var r=e("./hypot"),i=e("./browser"),o=e("./domObjects"),s=e("./domUtils"),a=e("./is"),l=e("./pointerExtend"),c={copyCoords:function(e,t){e.page=e.page||{},e.page.x=t.page.x,e.page.y=t.page.y,e.client=e.client||{},e.client.x=t.client.x,e.client.y=t.client.y,e.timeStamp=t.timeStamp},setCoordDeltas:function(e,t,n){e.page.x=n.page.x-t.page.x,e.page.y=n.page.y-t.page.y,e.client.x=n.client.x-t.client.x,e.client.y=n.client.y-t.client.y,e.timeStamp=n.timeStamp-t.timeStamp;var i=Math.max(e.timeStamp/1e3,.001);e.page.speed=r(e.page.x,e.page.y)/i,e.page.vx=e.page.x/i,e.page.vy=e.page.y/i,e.client.speed=r(e.client.x,e.page.y)/i,e.client.vx=e.client.x/i,e.client.vy=e.client.y/i},isNativePointer:function(e){return e instanceof o.Event||e instanceof o.Touch},getXY:function(e,t,n){return n=n||{},e=e||"page",n.x=t[e+"X"],n.y=t[e+"Y"],n},getPageXY:function(e,t){return t=t||{},i.isOperaMobile&&c.isNativePointer(e)?(c.getXY("screen",e,t),t.x+=window.scrollX,t.y+=window.scrollY):c.getXY("page",e,t),t},getClientXY:function(e,t){return t=t||{},i.isOperaMobile&&c.isNativePointer(e)?c.getXY("screen",e,t):c.getXY("client",e,t),t},getPointerId:function(e){return a.number(e.pointerId)?e.pointerId:e.identifier},setCoords:function(e,t,n){var r=t.length>1?c.pointerAverage(t):t[0],i={};c.getPageXY(r,i),e.page.x=i.x,e.page.y=i.y,c.getClientXY(r,i),e.client.x=i.x,e.client.y=i.y,e.timeStamp=a.number(n)?n:(new Date).getTime()},pointerExtend:l,getTouchPair:function(e){var t=[];return a.array(e)?(t[0]=e[0],t[1]=e[1]):"touchend"===e.type?1===e.touches.length?(t[0]=e.touches[0],t[1]=e.changedTouches[0]):0===e.touches.length&&(t[0]=e.changedTouches[0],t[1]=e.changedTouches[1]):(t[0]=e.touches[0],t[1]=e.touches[1]),t},pointerAverage:function(e){for(var t={pageX:0,pageY:0,clientX:0,clientY:0,screenX:0,screenY:0},n=e,r=Array.isArray(n),i=0,n=r?n:n[Symbol.iterator]();;){var o;if(r){if(i>=n.length)break;o=n[i++]}else{if(i=n.next(),i.done)break;o=i.value}var s=o;for(var a in t)t[a]+=s[a]}for(var l in t)t[l]/=e.length;return t},touchBBox:function(e){if(e.length||e.touches&&e.touches.length>1){var t=c.getTouchPair(e),n=Math.min(t[0].pageX,t[1].pageX),r=Math.min(t[0].pageY,t[1].pageY);return{x:n,y:r,left:n,top:r,width:Math.max(t[0].pageX,t[1].pageX)-n,height:Math.max(t[0].pageY,t[1].pageY)-r}}},touchDistance:function(e,t){var n=t+"X",i=t+"Y",o=c.getTouchPair(e),s=o[0][n]-o[1][n],a=o[0][i]-o[1][i];return r(s,a)},touchAngle:function(e,t,n){var r=n+"X",i=n+"Y",o=c.getTouchPair(e),s=o[1][r]-o[0][r],a=o[1][i]-o[0][i];return 180*Math.atan2(a,s)/Math.PI},getPointerType:function(e,t){return t.mouse?"mouse":i.supportsPointerEvent?a.string(e.pointerType)?e.pointerType:[void 0,void 0,"touch","pen","mouse"][e.pointerType]:"touch"},getEventTargets:function(e){return[s.getActualElement(e.path?e.path[0]:e.target),s.getActualElement(e.currentTarget)]}};t.exports=c},{"./browser":37,"./domObjects":38,"./domUtils":39,"./hypot":43,"./is":46,"./pointerExtend":48}],50:[function(e,t,n){"use strict";for(var r=e("./window"),i=r.window,o=["ms","moz","webkit","o"],s=0,a=void 0,l=void 0,c=0;c6&&void 0!==arguments[6]&&arguments[6];r(this,e);var f=t.target,v=(f&&f.options||s).deltaSource,g=o(f,p,l),h="start"===c,m="end"===c,y=h?t.startCoords:t.curCoords,x=t.prevEvent;p=p||t.element;var b=i({},y.page),w=i({},y.client);b.x-=g.x,b.y-=g.y,w.x-=g.x,w.y-=g.y,this.ctrlKey=n.ctrlKey,this.altKey=n.altKey,this.shiftKey=n.shiftKey,this.metaKey=n.metaKey,this.button=n.button,this.buttons=n.buttons,this.target=p,this.currentTarget=p,this.relatedTarget=u||null,this.preEnd=d,this.type=l+(c||""),this.interaction=t,this.interactable=f,this.t0=h?t.downTimes[t.downTimes.length-1]:x.t0;var E={interaction:t,event:n,action:l,phase:c,element:p,related:u,page:b,client:w,coords:y,starting:h,ending:m,deltaSource:v,iEvent:this};a.fire("set-xy",E),m?(this.pageX=x.pageX,this.pageY=x.pageY,this.clientX=x.clientX,this.clientY=x.clientY):(this.pageX=b.x,this.pageY=b.y,this.clientX=w.x,this.clientY=w.y),this.x0=t.startCoords.page.x-g.x,this.y0=t.startCoords.page.y-g.y,this.clientX0=t.startCoords.client.x-g.x,this.clientY0=t.startCoords.client.y-g.y,a.fire("set-delta",E),this.timeStamp=y.timeStamp,this.dt=t.pointerDelta.timeStamp,this.duration=this.timeStamp-this.t0,this.speed=t.pointerDelta[v].speed,this.velocityX=t.pointerDelta[v].vx,this.velocityY=t.pointerDelta[v].vy,this.swipe=m||"inertiastart"===c?this.getSwipe():null,a.fire("new",E)}return e.prototype.getSwipe=function(){var e=this.interaction;if(e.prevEvent.speed<600||this.timeStamp-e.prevEvent.timeStamp>150)return null;var t=180*Math.atan2(e.prevEvent.velocityY,e.prevEvent.velocityX)/Math.PI;t<0&&(t+=360);var n=112.5<=t&&t<247.5,r=202.5<=t&&t<337.5,i=!n&&(292.5<=t||t<67.5);return{up:r,down:!r&&22.5<=t&&t<157.5,left:n,right:i,angle:t,speed:e.prevEvent.speed,velocity:{x:e.prevEvent.velocityX,y:e.prevEvent.velocityY}}},e.prototype.preventDefault=function(){},e.prototype.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},e.prototype.stopPropagation=function(){this.propagationStopped=!0},e}();a.on("set-delta",function(e){var t=e.iEvent,n=e.interaction,r=e.starting,i=e.deltaSource,o=r?t:n.prevEvent;"client"===i?(t.dx=t.clientX-o.clientX,t.dy=t.clientY-o.clientY):(t.dx=t.pageX-o.pageX,t.dy=t.pageY-o.pageY)}),l.signals=a,t.exports=l},{"./defaultOptions":18,"./utils/Signals":35,"./utils/extend":41,"./utils/getOriginXY":42}],4:[function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=e("./utils/is"),o=e("./utils/events"),s=e("./utils/extend"),a=e("./actions/base"),l=e("./scope"),c=e("./Eventable"),p=e("./defaultOptions"),u=e("./utils/Signals").new(),d=e("./utils/domUtils"),f=d.getElementRect,v=d.nodeContains,g=d.trySelector,h=e("./utils/window"),m=h.getWindow,y=e("./utils/arr"),x=y.indexOf,b=y.contains,w=e("./utils/browser"),E=w.wheelEvent;l.interactables=[];var S=function(){function e(t,n){r(this,e),n=n||{},this.target=t,this.events=new c,this._context=n.context||l.document,this._win=m(g(t)?this._context:t),this._doc=this._win.document,u.fire("new",{target:t,options:n,interactable:this,win:this._win}),l.addDocument(this._doc,this._win),l.interactables.push(this),this.set(n)}return e.prototype.setOnEvents=function(e,t){var n="on"+e;return i.function(t.onstart)&&(this.events[n+"start"]=t.onstart),i.function(t.onmove)&&(this.events[n+"move"]=t.onmove),i.function(t.onend)&&(this.events[n+"end"]=t.onend),i.function(t.oninertiastart)&&(this.events[n+"inertiastart"]=t.oninertiastart),this},e.prototype.setPerAction=function(e,t){for(var n in t)n in p[e]&&(i.object(t[n])?(this.options[e][n]=s(this.options[e][n]||{},t[n]),i.object(p.perAction[n])&&"enabled"in p.perAction[n]&&(this.options[e][n].enabled=!1!==t[n].enabled)):i.bool(t[n])&&i.object(p.perAction[n])?this.options[e][n].enabled=t[n]:void 0!==t[n]&&(this.options[e][n]=t[n]))},e.prototype.getRect=function(e){return e=e||this.target,i.string(this.target)&&!i.element(e)&&(e=this._context.querySelector(this.target)),f(e)},e.prototype.rectChecker=function(e){return i.function(e)?(this.getRect=e,this):null===e?(delete this.options.getRect,this):this.getRect},e.prototype._backCompatOption=function(e,t){if(g(t)||i.object(t)){this.options[e]=t;for(var n=a.names,r=Array.isArray(n),o=0,n=r?n:n[Symbol.iterator]();;){var s;if(r){if(o>=n.length)break;s=n[o++]}else{if(o=n.next(),o.done)break;s=o.value}var l=s;this.options[l][e]=t}return this}return this.options[e]},e.prototype.origin=function(e){return this._backCompatOption("origin",e)},e.prototype.deltaSource=function(e){return"page"===e||"client"===e?(this.options.deltaSource=e,this):this.options.deltaSource},e.prototype.context=function(){return this._context},e.prototype.inContext=function(e){return this._context===e.ownerDocument||v(this._context,e)},e.prototype.fire=function(e){return this.events.fire(e),this},e.prototype._onOffMultiple=function(e,t,n,r){if(i.string(t)&&-1!==t.search(" ")&&(t=t.trim().split(/ +/)),i.array(t)){for(var o=0;o=l.length)break;f=l[d++]}else{if(d=l.next(),d.done)break;f=d.value}var v=f;this.options[v]=p.base[v],v in t&&this[v](t[v])}return u.fire("set",{options:t,interactable:this}),this},e.prototype.unset=function(){if(o.remove(this.target,"all"),i.string(this.target))for(var e in o.delegatedEvents){var t=o.delegatedEvents[e];t.selectors[0]===this.target&&t.contexts[0]===this._context&&(t.selectors.splice(0,1),t.contexts.splice(0,1),t.listeners.splice(0,1),t.selectors.length||(t[e]=null)),o.remove(this._context,e,o.delegateListener),o.remove(this._context,e,o.delegateUseCapture,!0)}else o.remove(this,"all");u.fire("unset",{interactable:this}),l.interactables.splice(x(l.interactables,this),1);for(var n=l.interactions||[],r=Array.isArray(n),s=0,n=r?n:n[Symbol.iterator]();;){var a;if(r){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var c=a;c.target===this&&c.interacting()&&c.stop()}return l.interact},e}();l.interactables.indexOfElement=function(e,t){t=t||l.document;for(var n=0;n=x.length)break;E=x[w++]}else{if(w=x.next(),w.done)break;E=w.value}var S=E,T=S[0],C=S[1];C._updateEventTargets(i,o),C[e](T,t,i,o)}}}function o(e){for(var t=0;te.pointerMoveTolerance);var a={pointer:t,pointerIndex:this.getPointerIndex(t),event:n,eventTarget:r,dx:o,dy:s,duplicate:i,interaction:this,interactingBeforeMove:this.interacting()};i||l.setCoordDeltas(this.pointerDelta,this.prevCoords,this.curCoords),f.fire("move",a),i||(this.interacting()&&this.doMove(a),this.pointerWasMoved&&l.copyCoords(this.prevCoords,this.curCoords))},e.prototype.doMove=function(e){e=l.extend({pointer:this.pointers[0],event:this.prevEvent,eventTarget:this._eventTarget,interaction:this},e||{}),f.fire("before-action-move",e),this._dontFireMove||f.fire("action-move",e),this._dontFireMove=!1},e.prototype.pointerUp=function(e,t,n,r){var i=this.getPointerIndex(e);f.fire(/cancel$/i.test(t.type)?"cancel":"up",{pointer:e,pointerIndex:i,event:t,eventTarget:n,curEventTarget:r,interaction:this}),this.simulation||this.end(t),this.pointerIsDown=!1,this.removePointer(e,t)},e.prototype.end=function(e){e=e||this.prevEvent,this.interacting()&&f.fire("action-end",{event:e,interaction:this}),this.stop()},e.prototype.currentAction=function(){return this._interacting?this.prepared.name:null},e.prototype.interacting=function(){return this._interacting},e.prototype.stop=function(){f.fire("stop",{interaction:this}),this._interacting&&(f.fire("stop-active",{interaction:this}),f.fire("stop-"+this.prepared.name,{interaction:this})),this.target=this.element=null,this._interacting=!1,this.prepared.name=this.prevEvent=null},e.prototype.getPointerIndex=function(e){return"mouse"===this.pointerType||"pen"===this.pointerType?0:l.indexOf(this.pointerIds,l.getPointerId(e))},e.prototype.updatePointer=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:t&&/(down|start)$/i.test(t.type),r=l.getPointerId(e),i=this.getPointerIndex(e);return-1===i&&(i=this.pointerIds.length,this.pointerIds[i]=r),n&&f.fire("update-pointer-down",{pointer:e,event:t,down:n,pointerId:r,pointerIndex:i,interaction:this}),this.pointers[i]=e,i},e.prototype.removePointer=function(e,t){var n=this.getPointerIndex(e);-1!==n&&(f.fire("remove-pointer",{pointer:e,event:t,pointerIndex:n,interaction:this}),this.pointers.splice(n,1),this.pointerIds.splice(n,1),this.downTargets.splice(n,1),this.downTimes.splice(n,1))},e.prototype._updateEventTargets=function(e,t){this._eventTarget=e,this._curEventTarget=t},e}(),y=0,x=g.length;y=i.length)break;a=i[s++]}else{if(s=i.next(),s.done)break;a=s.value}var l=a;if(l.options.drop.enabled){var c=l.options.drop.accept;if(!(p.is.element(c)&&c!==t||p.is.string(c)&&!p.matchesSelector(t,c)))for(var d=p.is.string(l.target)?l._context.querySelectorAll(l.target):[l.target],f=0;fo.left&&c.xo.top&&c.y=o.left&&v<=o.right&&g>=o.top&&g<=o.bottom}if(f&&p.is.number(a)){s=Math.max(0,Math.min(o.right,f.right)-Math.max(o.left,f.left))*Math.max(0,Math.min(o.bottom,f.bottom)-Math.max(o.top,f.top))/(f.width*f.height)>=a}return this.options.drop.checker&&(s=this.options.drop.checker(e,t,s,this,i,n,r)),s},v.signals.on("unset",function(e){e.interactable.dropzone(!1)}),v.settingsMethods.push("dropChecker"),g.signals.on("new",function(e){e.dropTarget=null,e.dropElement=null,e.prevDropTarget=null,e.prevDropElement=null,e.dropEvents=null,e.activeDrops={dropzones:[],elements:[],rects:[]}}),g.signals.on("stop",function(e){var t=e.interaction;t.dropTarget=t.dropElement=t.prevDropTarget=t.prevDropElement=null}),d.dynamicDrop=function(e){return p.is.bool(e)?(y=e,d):y},p.merge(v.eventTypes,["dragenter","dragleave","dropactivate","dropdeactivate","dropmove","drop"]),c.methodDict.drop="dropzone",h.drop=m.defaults,t.exports=m},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../interact":21,"../scope":34,"../utils":44,"./base":6}],9:[function(e,t,n){"use strict";var r=e("./base"),i=e("../utils"),o=e("../InteractEvent"),s=e("../Interactable"),a=e("../Interaction"),l=e("../defaultOptions"),c={defaults:{enabled:!1,origin:null,restrict:null},checker:function(e,t,n,r,i){return i.pointerIds.length>=2?{name:"gesture"}:null},getCursor:function(){return""}};o.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;"gesturestart"===t.type&&(t.ds=0,n.gesture.startDistance=n.gesture.prevDistance=t.distance,n.gesture.startAngle=n.gesture.prevAngle=t.angle,n.gesture.scale=1)}),o.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;"gesturemove"===t.type&&(t.ds=t.scale-n.gesture.scale,n.target.fire(t),n.gesture.prevAngle=t.angle,n.gesture.prevDistance=t.distance,t.scale===1/0||null===t.scale||void 0===t.scale||isNaN(t.scale)||(n.gesture.scale=t.scale))}),s.prototype.gesturable=function(e){return i.is.object(e)?(this.options.gesture.enabled=!1!==e.enabled,this.setPerAction("gesture",e),this.setOnEvents("gesture",e),this):i.is.bool(e)?(this.options.gesture.enabled=e,e||(this.ongesturestart=this.ongesturestart=this.ongestureend=null),this):this.options.gesture},o.signals.on("set-delta",function(e){var t=e.interaction,n=e.iEvent,r=e.action,s=e.event,a=e.starting,l=e.ending,c=e.deltaSource;if("gesture"===r){var p=t.pointers;n.touches=[p[0],p[1]],a?(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=1,n.ds=0,n.angle=i.touchAngle(p,void 0,c),n.da=0):l||s instanceof o?(n.distance=t.prevEvent.distance,n.box=t.prevEvent.box,n.scale=t.prevEvent.scale,n.ds=n.scale-1,n.angle=t.prevEvent.angle,n.da=n.angle-t.gesture.startAngle):(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=n.distance/t.gesture.startDistance,n.angle=i.touchAngle(p,t.gesture.prevAngle,c),n.ds=n.scale-t.gesture.prevScale,n.da=n.angle-t.gesture.prevAngle)}}),a.signals.on("new",function(e){e.gesture={start:{x:0,y:0},startDistance:0,prevDistance:0,distance:0,scale:1,startAngle:0,prevAngle:0}}),r.gesture=c,r.names.push("gesture"),i.merge(s.eventTypes,["gesturestart","gesturemove","gestureend"]),r.methodDict.gesture="gesturable",l.gesture=c.defaults,t.exports=c},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"./base":6}],10:[function(e,t,n){"use strict";function r(e,t,n,r,i,s,a){if(!t)return!1;if(!0===t){var l=o.is.number(s.width)?s.width:s.right-s.left,c=o.is.number(s.height)?s.height:s.bottom-s.top;if(l<0&&("left"===e?e="right":"right"===e&&(e="left")),c<0&&("top"===e?e="bottom":"bottom"===e&&(e="top")),"left"===e)return n.x<(l>=0?s.left:s.right)+a;if("top"===e)return n.y<(c>=0?s.top:s.bottom)+a;if("right"===e)return n.x>(l>=0?s.right:s.left)-a;if("bottom"===e)return n.y>(c>=0?s.bottom:s.top)-a}return!!o.is.element(r)&&(o.is.element(t)?t===r:o.matchesUpTo(r,t,i))}var i=e("./base"),o=e("../utils"),s=e("../utils/browser"),a=e("../InteractEvent"),l=e("../Interactable"),c=e("../Interaction"),p=e("../defaultOptions"),u=s.supportsTouch||s.supportsPointerEvent?20:10,d={defaults:{enabled:!1,mouseButtons:null,origin:null,snap:null,restrict:null,inertia:null,autoScroll:null,square:!1,preserveAspectRatio:!1,axis:"xy",margin:NaN,edges:null,invert:"none"},checker:function(e,t,n,i,s,a){if(!a)return null;var l=o.extend({},s.curCoords.page),c=n.options;if(c.resize.enabled){var p=c.resize,d={left:!1,right:!1,top:!1,bottom:!1};if(o.is.object(p.edges)){for(var f in d)d[f]=r(f,p.edges[f],l,s._eventTarget,i,a,p.margin||u);if(d.left=d.left&&!d.right,d.top=d.top&&!d.bottom,d.left||d.right||d.top||d.bottom)return{name:"resize",edges:d}}else{var v="y"!==c.resize.axis&&l.x>a.right-u,g="x"!==c.resize.axis&&l.y>a.bottom-u;if(v||g)return{name:"resize",axes:(v?"x":"")+(g?"y":"")}}}return null},cursors:s.isIe9OrOlder?{x:"e-resize",y:"s-resize",xy:"se-resize",top:"n-resize",left:"w-resize",bottom:"s-resize",right:"e-resize",topleft:"se-resize",bottomright:"se-resize",topright:"ne-resize",bottomleft:"ne-resize"}:{x:"ew-resize",y:"ns-resize",xy:"nwse-resize",top:"ns-resize",left:"ew-resize",bottom:"ns-resize",right:"ew-resize",topleft:"nwse-resize",bottomright:"nwse-resize",topright:"nesw-resize",bottomleft:"nesw-resize"},getCursor:function(e){if(e.axis)return d.cursors[e.name+e.axis];if(e.edges){for(var t="",n=["top","bottom","left","right"],r=0;r<4;r++)e.edges[n[r]]&&(t+=n[r]);return d.cursors[t]}}};a.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;if("resizestart"===t.type&&n.prepared.edges){var r=n.target.getRect(n.element),i=n.target.options.resize;if(i.square||i.preserveAspectRatio){var s=o.extend({},n.prepared.edges);s.top=s.top||s.left&&!s.bottom,s.left=s.left||s.top&&!s.right,s.bottom=s.bottom||s.right&&!s.top,s.right=s.right||s.bottom&&!s.left,n.prepared._linkedEdges=s}else n.prepared._linkedEdges=null;i.preserveAspectRatio&&(n.resizeStartAspectRatio=r.width/r.height),n.resizeRects={start:r,current:o.extend({},r),inverted:o.extend({},r),previous:o.extend({},r),delta:{left:0,right:0,width:0,top:0,bottom:0,height:0}},t.rect=n.resizeRects.inverted,t.deltaRect=n.resizeRects.delta}}),a.signals.on("new",function(e){var t=e.iEvent,n=e.phase,r=e.interaction;if("move"===n&&r.prepared.edges){var i=r.target.options.resize,s=i.invert,a="reposition"===s||"negate"===s,l=r.prepared.edges,c=r.resizeRects.start,p=r.resizeRects.current,u=r.resizeRects.inverted,d=r.resizeRects.delta,f=o.extend(r.resizeRects.previous,u),v=l,g=t.dx,h=t.dy;if(i.preserveAspectRatio||i.square){var m=i.preserveAspectRatio?r.resizeStartAspectRatio:1;l=r.prepared._linkedEdges,v.left&&v.bottom||v.right&&v.top?h=-g/m:v.left||v.right?h=g/m:(v.top||v.bottom)&&(g=h*m)}if(l.top&&(p.top+=h),l.bottom&&(p.bottom+=h),l.left&&(p.left+=g),l.right&&(p.right+=g),a){if(o.extend(u,p),"reposition"===s){var y=void 0;u.top>u.bottom&&(y=u.top,u.top=u.bottom,u.bottom=y),u.left>u.right&&(y=u.left,u.left=u.right,u.right=y)}}else u.top=Math.min(p.top,c.bottom),u.bottom=Math.max(p.bottom,c.top),u.left=Math.min(p.left,c.right),u.right=Math.max(p.right,c.left);u.width=u.right-u.left,u.height=u.bottom-u.top;for(var x in u)d[x]=u[x]-f[x];t.edges=r.prepared.edges,t.rect=u,t.deltaRect=d}}),l.prototype.resizable=function(e){return o.is.object(e)?(this.options.resize.enabled=!1!==e.enabled,this.setPerAction("resize",e),this.setOnEvents("resize",e),/^x$|^y$|^xy$/.test(e.axis)?this.options.resize.axis=e.axis:null===e.axis&&(this.options.resize.axis=p.resize.axis),o.is.bool(e.preserveAspectRatio)?this.options.resize.preserveAspectRatio=e.preserveAspectRatio:o.is.bool(e.square)&&(this.options.resize.square=e.square),this):o.is.bool(e)?(this.options.resize.enabled=e, +e||(this.onresizestart=this.onresizestart=this.onresizeend=null),this):this.options.resize},c.signals.on("new",function(e){e.resizeAxes="xy"}),a.signals.on("set-delta",function(e){var t=e.interaction,n=e.iEvent;"resize"===e.action&&t.resizeAxes&&(t.target.options.resize.square?("y"===t.resizeAxes?n.dx=n.dy:n.dy=n.dx,n.axes="xy"):(n.axes=t.resizeAxes,"x"===t.resizeAxes?n.dy=0:"y"===t.resizeAxes&&(n.dx=0)))}),i.resize=d,i.names.push("resize"),o.merge(l.eventTypes,["resizestart","resizemove","resizeinertiastart","resizeinertiaresume","resizeend"]),i.methodDict.resize="resizable",p.resize=d.defaults,t.exports=d},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"../utils/browser":37,"./base":6}],11:[function(e,t,n){"use strict";var r=e("./utils/raf"),i=e("./utils/window").getWindow,o=e("./utils/is"),s=e("./utils/domUtils"),a=e("./Interaction"),l=e("./defaultOptions"),c={defaults:{enabled:!1,container:null,margin:60,speed:300},interaction:null,i:null,x:0,y:0,isScrolling:!1,prevTime:0,start:function(e){c.isScrolling=!0,r.cancel(c.i),c.interaction=e,c.prevTime=(new Date).getTime(),c.i=r.request(c.scroll)},stop:function(){c.isScrolling=!1,r.cancel(c.i)},scroll:function(){var e=c.interaction.target.options[c.interaction.prepared.name].autoScroll,t=e.container||i(c.interaction.element),n=(new Date).getTime(),s=(n-c.prevTime)/1e3,a=e.speed*s;a>=1&&(o.window(t)?t.scrollBy(c.x*a,c.y*a):t&&(t.scrollLeft+=c.x*a,t.scrollTop+=c.y*a),c.prevTime=n),c.isScrolling&&(r.cancel(c.i),c.i=r.request(c.scroll))},check:function(e,t){var n=e.options;return n[t].autoScroll&&n[t].autoScroll.enabled},onInteractionMove:function(e){var t=e.interaction,n=e.pointer;if(t.interacting()&&c.check(t.target,t.prepared.name)){if(t.simulation)return void(c.x=c.y=0);var r=void 0,a=void 0,l=void 0,p=void 0,u=t.target.options[t.prepared.name].autoScroll,d=u.container||i(t.element);if(o.window(d))p=n.clientXd.innerWidth-c.margin,l=n.clientY>d.innerHeight-c.margin;else{var f=s.getElementClientRect(d);p=n.clientXf.right-c.margin,l=n.clientY>f.bottom-c.margin}c.x=a?1:p?-1:0,c.y=l?1:r?-1:0,c.isScrolling||(c.margin=u.margin,c.speed=u.speed,c.start(t))}}};a.signals.on("stop-active",function(){c.stop()}),a.signals.on("action-move",c.onInteractionMove),l.perAction.autoScroll=c.defaults,t.exports=c},{"./Interaction":5,"./defaultOptions":18,"./utils/domUtils":39,"./utils/is":46,"./utils/raf":50,"./utils/window":52}],12:[function(e,t,n){"use strict";var r=e("../Interactable"),i=e("../actions/base"),o=e("../utils/is"),s=e("../utils/domUtils");r.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},r.prototype.ignoreFrom=function(e){return this._backCompatOption("ignoreFrom",e)},r.prototype.allowFrom=function(e){return this._backCompatOption("allowFrom",e)},r.prototype.testIgnore=function(e,t,n){return!(!e||!o.element(n))&&(o.string(e)?s.matchesUpTo(n,e,t):!!o.element(e)&&s.nodeContains(e,n))},r.prototype.testAllow=function(e,t,n){return!e||!!o.element(n)&&(o.string(e)?s.matchesUpTo(n,e,t):!!o.element(e)&&s.nodeContains(e,n))},r.prototype.testIgnoreAllow=function(e,t,n){return!this.testIgnore(e.ignoreFrom,t,n)&&this.testAllow(e.allowFrom,t,n)},r.prototype.actionChecker=function(e){return o.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},r.prototype.styleCursor=function(e){return o.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},r.prototype.defaultActionChecker=function(e,t,n,r){for(var o=this.getRect(r),s=null,a=i.names,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var u=p;if((!n.pointerIsDown||!n.mouse||0!=(t.buttons&this.options[u].mouseButtons))&&(s=i[u].checker(e,t,this,r,n,o)))return s}}},{"../Interactable":4,"../actions/base":6,"../utils/domUtils":39,"../utils/is":46}],13:[function(e,t,n){"use strict";function r(e,t,n,r){return g.is.object(e)&&t.testIgnoreAllow(t.options[e.name],n,r)&&t.options[e.name].enabled&&a(t,n,e)?e:null}function i(e,t,n,i,o,s){for(var a=0,l=i.length;a=m.maxInteractions)return!1;if(u.target===e){if((a+=d===n.name|0)>=i)return!1;if(u.element===t&&(l++,d!==n.name||l>=o))return!1}}}return m.maxInteractions>0}}var l=e("../interact"),c=e("../Interactable"),p=e("../Interaction"),u=e("../actions/base"),d=e("../defaultOptions"),f=e("../utils/browser"),v=e("../scope"),g=e("../utils"),h=e("../utils/Signals").new();e("./InteractableMethods");var m={signals:h,withinInteractionLimit:a,maxInteractions:1/0,defaults:{perAction:{manualStart:!1,max:1/0,maxPerElement:1,allowFrom:null,ignoreFrom:null}},setActionDefaults:function(e){g.extend(e.defaults,m.defaults.perAction)}};p.signals.on("down",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;if(!t.interacting()){s(t,o(t,n,r,i))}}),p.signals.on("move",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;if(t.mouse&&!t.pointerIsDown&&!t.interacting()){s(t,o(t,n,r,i))}}),p.signals.on("move",function(e){var t=e.interaction,n=e.event;if(t.pointerIsDown&&!t.interacting()&&t.pointerWasMoved&&t.prepared.name){h.fire("before-start",e);var r=t.target;t.prepared.name&&r&&(r.options[t.prepared.name].manualStart||!a(r,t.element,t.prepared)?t.stop(n):t.start(t.prepared,r,t.element))}}),p.signals.on("stop",function(e){var t=e.interaction,n=t.target;n&&n.options.styleCursor&&(n._doc.documentElement.style.cursor="")}),c.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},c.prototype.actionChecker=function(e){return g.is.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},c.prototype.styleCursor=function(e){return g.is.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},c.prototype.defaultActionChecker=function(e,t,n,r){for(var i=this.getRect(r),o=t.buttons||{0:1,1:4,3:8,4:16}[t.button],s=null,a=u.names,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var d=p;if((!n.pointerIsDown||!n.mouse||0!=(o&this.options[d].mouseButtons))&&(s=u[d].checker(e,t,this,r,n,i)))return s}},l.maxInteractions=function(e){return g.is.number(e)?(m.maxInteractions=e,this):m.maxInteractions},c.settingsMethods.push("styleCursor"),c.settingsMethods.push("actionChecker"),c.settingsMethods.push("ignoreFrom"),c.settingsMethods.push("allowFrom"),d.base.actionChecker=null,d.base.styleCursor=!0,g.extend(d.perAction,m.defaults.perAction),t.exports=m},{"../Interactable":4,"../Interaction":5,"../actions/base":6,"../defaultOptions":18,"../interact":21,"../scope":34,"../utils":44,"../utils/Signals":35,"../utils/browser":37,"./InteractableMethods":12}],14:[function(e,t,n){"use strict";var r=e("./base"),i=e("../Interaction");i.signals.on("new",function(e){e.delayTimer=null}),r.signals.on("prepared",function(e){var t=e.interaction,n=t.prepared.name;if(n){var r=t.target.options[n].delay;r>0&&(t.delayTimer=setTimeout(function(){t.start(t.prepared,t.target,t.element)},r))}}),i.signals.on("move",function(e){var t=e.interaction,n=e.duplicate;t.pointerWasMoved&&!n&&clearTimeout(t.delayTimer)}),r.signals.on("before-start",function(e){var t=e.interaction,n=t.prepared.name;if(n){t.target.options[n].delay>0&&(t.prepared.name=null)}})},{"../Interaction":5,"./base":13}],15:[function(e,t,n){"use strict";function r(e,t){if(!t)return!1;var n=t.options.drag.startAxis;return"xy"===e||"xy"===n||n===e}var i=e("./base"),o=e("../scope"),s=e("../utils/browser"),a=e("../utils/is"),l=e("../utils/domUtils"),c=l.matchesSelector,p=l.parentNode;i.setActionDefaults(e("../actions/drag")),i.signals.on("before-start",function(e){var t=e.interaction,n=e.eventTarget,l=e.dx,u=e.dy;if("drag"===t.prepared.name){var d=Math.abs(l),f=Math.abs(u),v=t.target.options.drag,g=v.startAxis,h=d>f?"x":dl.minSpeed&&g>l.endSpeed,b={interaction:t,pageCoords:v,statuses:f,preEnd:!0,requireEndOnly:!0};y&&!x&&(c.resetStatuses(f),m=c.setAll(b),m.shouldMove&&m.locked&&(h=!0)),(x||h)&&(p.copyCoords(i.upCoords,t.curCoords),t.pointers[0]=i.startEvent=new a(t,n,t.prepared.name,"inertiastart",t.element),i.t0=d,i.active=!0,i.allowResume=l.allowResume,t.simulation=i,o.fire(i.startEvent),x?(i.vx0=t.pointerDelta.client.vx,i.vy0=t.pointerDelta.client.vy,i.v0=g,r(t,i),p.extend(v,t.curCoords.page),v.x+=i.xe,v.y+=i.ye,c.resetStatuses(f),m=c.setAll(b),i.modifiedXe+=m.dx,i.modifiedYe+=m.dy,i.i=u.request(t.boundInertiaFrame)):(i.smoothEnd=!0,i.xe=m.dx,i.ye=m.dy,i.sx=i.sy=0,i.i=u.request(t.boundSmoothEndFrame)))}}),l.signals.on("stop-active",function(e){var t=e.interaction,n=t.inertiaStatus;n.active&&(u.cancel(n.i),n.active=!1,t.simulation=null)})},{"./InteractEvent":3,"./Interaction":5,"./modifiers":24,"./utils":44,"./utils/raf":50}],21:[function(e,t,n){"use strict";function r(e,t){var n=a.interactables.get(e,t);return n||(n=new l(e,t),n.events.global=p),n}var i=e("./utils/browser"),o=e("./utils/events"),s=e("./utils"),a=e("./scope"),l=e("./Interactable"),c=e("./Interaction"),p={};r.isSet=function(e,t){return-1!==a.interactables.indexOfElement(e,t&&t.context)},r.on=function(e,t,n){if(s.is.string(e)&&-1!==e.search(" ")&&(e=e.trim().split(/ +/)),s.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.on(f,t,n)}return r}if(s.is.object(e)){for(var v in e)r.on(v,e[v],t);return r}return s.contains(l.eventTypes,e)?p[e]?p[e].push(t):p[e]=[t]:o.add(a.document,e,t,{options:n}),r},r.off=function(e,t,n){if(s.is.string(e)&&-1!==e.search(" ")&&(e=e.trim().split(/ +/)),s.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.off(f,t,n)}return r}if(s.is.object(e)){for(var v in e)r.off(v,e[v],t);return r}if(s.contains(l.eventTypes,e)){var g=void 0;e in p&&-1!==(g=s.indexOf(p[e],t))&&p[e].splice(g,1)}else o.remove(a.document,e,t,n);return r},r.debug=function(){return a},r.getPointerAverage=s.pointerAverage,r.getTouchBBox=s.touchBBox,r.getTouchDistance=s.touchDistance,r.getTouchAngle=s.touchAngle,r.getElementRect=s.getElementRect,r.getElementClientRect=s.getElementClientRect,r.matchesSelector=s.matchesSelector,r.closest=s.closest,r.supportsTouch=function(){return i.supportsTouch},r.supportsPointerEvent=function(){return i.supportsPointerEvent},r.stop=function(e){for(var t=a.interactions.length-1;t>=0;t--)a.interactions[t].stop(e);return r},r.pointerMoveTolerance=function(e){return s.is.number(e)?(c.pointerMoveTolerance=e,this):c.pointerMoveTolerance},r.addDocument=a.addDocument,r.removeDocument=a.removeDocument,a.interact=r,t.exports=r},{"./Interactable":4,"./Interaction":5,"./scope":34,"./utils":44,"./utils/browser":37,"./utils/events":40}],22:[function(e,t,n){"use strict";function r(e){var t=e.interaction,n=e.event;t.target&&t.target.checkAndPreventDefault(n)}var i=e("./Interactable"),o=e("./Interaction"),s=e("./scope"),a=e("./utils/is"),l=e("./utils/events"),c=e("./utils/domUtils"),p=c.nodeContains,u=c.matchesSelector;i.prototype.preventDefault=function(e){return/^(always|never|auto)$/.test(e)?(this.options.preventDefault=e,this):a.bool(e)?(this.options.preventDefault=e?"always":"never",this):this.options.preventDefault},i.prototype.checkAndPreventDefault=function(e){var t=this.options.preventDefault;if("never"!==t)return"always"===t?void e.preventDefault():void(l.supportsOptions||/^(mouse|pointer|touch)*(down|start)/i.test(e.type)||a.element(e.target)&&u(e.target,"input,select,textarea,[contenteditable=true],[contenteditable=true] *")||e.preventDefault())};for(var d=["down","move","up","cancel"],f=0;f=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i;if(o.element&&(o.element===e.target||p(o.element,e.target)))return void o.target.checkAndPreventDefault(e)}}},{"./Interactable":4,"./Interaction":5,"./scope":34,"./utils/domUtils":39,"./utils/events":40,"./utils/is":46}],23:[function(e,t,n){"use strict";function r(e){var t=e.target,n=a.search(e,e.type,t);n&&n.prevTap&&e.clientX===n.prevTap.clientX&&e.clientY===n.prevTap.clientY&&t===n.prevTap.target&&(n.downTargets[0]=t,n.downTimes[0]=(new Date).getTime(),l.fire({interaction:n,event:e,eventTarget:t,pointer:e,type:"tap"}))}var i=e("./scope"),o=e("./utils/events"),s=e("./utils/browser"),a=e("./utils/interactionFinder"),l=e("./pointerEvents/base"),c=e("./utils/window"),p=c.window,u=Object.prototype.toString;if(p.Array.isArray||(p.Array.isArray=function(e){return"[object Array]"===u.call(e)}),String.prototype.trim||(String.prototype.trim=function(){return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")}),s.isIE8){var d=function(e){for(var t=i.interactions,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var o;if(n){if(r>=t.length)break;o=t[r++]}else{if(r=t.next(),r.done)break;o=r.value}var s=o;s.interacting()&&s.target.checkAndPreventDefault(e)}},f=function(e,t){var n=e.doc,i=(e.win,0===t.indexOf("listen")?o.add:o.remove);i(n,"selectstart",d),l&&i(n,"dblclick",r)};i.signals.on("add-document",f),i.signals.on("remove-document",f)}t.exports=null},{"./pointerEvents/base":31,"./scope":34,"./utils/browser":37,"./utils/events":40,"./utils/interactionFinder":45,"./utils/window":52}],24:[function(e,t,n){"use strict";function r(e,t,n){return e&&e.enabled&&(t||!e.endOnly)&&(!n||e.endOnly)}var i=e("../InteractEvent"),o=e("../Interaction"),s=e("../utils/extend"),a={names:[],setOffsets:function(e){var t=e.interaction,n=e.pageCoords,r=t.target,i=t.element,o=t.startOffset,s=r.getRect(i);s?(o.left=n.x-s.left,o.top=n.y-s.top,o.right=s.right-n.x,o.bottom=s.bottom-n.y,"width"in s||(s.width=s.right-s.left),"height"in s||(s.height=s.bottom-s.top)):o.left=o.top=o.right=o.bottom=0,e.rect=s,e.interactable=r,e.element=i;for(var l=0;l=p.length)break;f=p[d++]}else{if(d=p.next(),d.done)break;f=d.value}var v=f,g=a[v],h=t.target.options[t.prepared.name][v];r(h,i,o)&&(e.status=e.status=n[v],e.options=h,e.offset=e.interaction.modifierOffsets[v],g.set(e),e.status.locked&&(l.x+=e.status.dx,l.y+=e.status.dy,c.dx+=e.status.dx,c.dy+=e.status.dy,c.locked=!0))}return c.shouldMove=!e.status||!c.locked||e.status.changed,c},resetStatuses:function(e){for(var t=a.names,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var i;if(n){if(r>=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i,s=e[o]||{};s.dx=s.dy=0,s.modifiedX=s.modifiedY=NaN,s.locked=!1,s.changed=!0,e[o]=s}return e},start:function(e,t){var n=e.interaction,r={interaction:n,pageCoords:("action-resume"===t?n.curCoords:n.startCoords).page,startOffset:n.startOffset,statuses:n.modifierStatuses,preEnd:!1,requireEndOnly:!1};a.setOffsets(r),a.resetStatuses(r.statuses),r.pageCoords=s({},n.startCoords.page),n.modifierResult=a.setAll(r)}};o.signals.on("new",function(e){e.startOffset={left:0,right:0,top:0,bottom:0},e.modifierOffsets={},e.modifierStatuses=a.resetStatuses({}),e.modifierResult=null}),o.signals.on("action-start",a.start),o.signals.on("action-resume",a.start),o.signals.on("before-action-move",function(e){var t=e.interaction,n=e.preEnd,r=e.interactingBeforeMove,i=a.setAll({interaction:t,preEnd:n,pageCoords:t.curCoords.page,statuses:t.modifierStatuses,requireEndOnly:!1});!i.shouldMove&&r&&(t._dontFireMove=!0),t.modifierResult=i}),o.signals.on("action-end",function(e){for(var t=e.interaction,n=e.event,i=0;i=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}var m=h,y=m.x,x=m.y;l.push({x:s.left-i.width*y+u.x,y:s.top-i.height*x+u.y})}else l.push(u);return l},set:function(e){var t=e.interaction,n=e.pageCoords,r=e.status,i=e.options,s=e.offset,a=[],l=void 0,c=void 0,p=void 0;if(r.useStatusXY)c={x:r.x,y:r.y};else{var u=o.getOriginXY(t.target,t.element,t.prepared.name);c=o.extend({},n),c.x-=u.x,c.y-=u.y}r.realX=c.x,r.realY=c.y;for(var d=i.targets?i.targets.length:0,f=s,v=Array.isArray(f),g=0,f=v?f:f[Symbol.iterator]();;){var h;if(v){if(g>=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}for(var m=h,y=m.x,x=m.y,b=c.x-y,w=c.y-x,E=i.targets,S=Array.isArray(E),T=0,E=S?E:E[Symbol.iterator]();;){var C;if(S){if(T>=E.length)break;C=E[T++]}else{if(T=E.next(),T.done)break;C=T.value}var A=C;l=o.is.function(A)?A(b,w,t):A,l&&a.push({x:o.is.number(l.x)?l.x+y:b,y:o.is.number(l.y)?l.y+x:w,range:o.is.number(l.range)?l.range:i.range})}}var D={target:null,inRange:!1,distance:0,range:0,dx:0,dy:0};for(p=0,d=a.length;p=p.length)break;f=p[d++]}else{if(d=p.next(),d.done)break;f=d.value}var v=f,g=void 0;g=a.is.function(v)?v(l,c,t):v,g&&("width"in g&&"height"in g&&(g.x=g.width, +g.y=g.height),e.options.targets.push(g))}i.set(e)},modifyCoords:function(e){var t=e.options;e.options=a.extend({},t),e.options.enabled=t.enabled,e.options.relativePoints=[null],i.modifyCoords(e)}};r.snapSize=l,r.names.push("snapSize"),o.perAction.snapSize=l.defaults,s.defaults.snapSize=l.defaults,t.exports=l},{"../actions/resize":10,"../defaultOptions":18,"../utils/":44,"./index":24,"./snap":28}],30:[function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=e("../utils/pointerUtils");t.exports=function(){function e(t,n,o,s,a){if(r(this,e),i.pointerExtend(this,o),o!==n&&i.pointerExtend(this,n),this.interaction=a,this.timeStamp=(new Date).getTime(),this.originalEvent=o,this.type=t,this.pointerId=i.getPointerId(n),this.pointerType=i.getPointerType(n),this.target=s,this.currentTarget=null,"tap"===t){var l=a.getPointerIndex(n);this.dt=this.timeStamp-a.downTimes[l];var c=this.timeStamp-a.tapTime;this.double=!!(a.prevTap&&"doubletap"!==a.prevTap.type&&a.prevTap.target===this.target&&c<500)}else"doubletap"===t&&(this.dt=n.timeStamp-a.tapTime)}return e.prototype.subtractOrigin=function(e){var t=e.x,n=e.y;return this.pageX-=t,this.pageY-=n,this.clientX-=t,this.clientY-=n,this},e.prototype.addOrigin=function(e){var t=e.x,n=e.y;return this.pageX+=t,this.pageY+=n,this.clientX+=t,this.clientY+=n,this},e.prototype.preventDefault=function(){this.originalEvent.preventDefault()},e.prototype.stopPropagation=function(){this.propagationStopped=!0},e.prototype.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},e}()},{"../utils/pointerUtils":49}],31:[function(e,t,n){"use strict";function r(e){for(var t=e.interaction,n=e.pointer,s=e.event,l=e.eventTarget,c=e.type,u=void 0===c?e.pointerEvent.type:c,d=e.targets,f=void 0===d?i(e):d,v=e.pointerEvent,g=void 0===v?new o(u,n,s,l,t):v,h={interaction:t,pointer:n,event:s,eventTarget:l,targets:f,type:u,pointerEvent:g},m=0;m=u.length)break;g=u[v++]}else{if(v=u.next(),v.done)break;g=v.value}var h=g;c.element=h,p.fire("collect-targets",c)}return"hold"===o&&(c.targets=d(c.targets,function(e){return e.eventable.options.holdDuration===t.holdTimers[s].duration})),c.targets}var o=e("./PointerEvent"),s=e("../Interaction"),a=e("../utils"),l=e("../utils/browser"),c=e("../defaultOptions"),p=e("../utils/Signals").new(),u=e("../utils/arr"),d=u.filter,f=["down","up","cancel"],v=["down","up","cancel"],g={PointerEvent:o,fire:r,collectEventTargets:i,signals:p,defaults:{holdDuration:600,ignoreFrom:null,allowFrom:null,origin:{x:0,y:0}},types:["down","move","up","cancel","tap","doubletap","hold"]};s.signals.on("update-pointer-down",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers[n]={duration:1/0,timeout:null}}),s.signals.on("remove-pointer",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers.splice(n,1)}),s.signals.on("move",function(e){var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,s=e.duplicateMove,a=t.getPointerIndex(n);s||t.pointerIsDown&&!t.pointerWasMoved||(t.pointerIsDown&&clearTimeout(t.holdTimers[a].timeout),r({interaction:t,pointer:n,event:i,eventTarget:o,type:"move"}))}),s.signals.on("down",function(e){for(var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,s=e.pointerIndex,c=l.isIE8?a.extend({},i):i,u=t.holdTimers[s],d=a.getPath(o),f={interaction:t,pointer:n,event:i,eventTarget:o,type:"hold",targets:[],path:d,element:null},v=d,g=Array.isArray(v),h=0,v=g?v:v[Symbol.iterator]();;){var m;if(g){if(h>=v.length)break;m=v[h++]}else{if(h=v.next(),h.done)break;m=h.value}var y=m;f.element=y,p.fire("collect-targets",f)}if(f.targets.length){for(var x=1/0,b=0;b=0&&(p.selectors[u]!==e||p.contexts[u]!==t);u--);-1===u&&(u=p.selectors.length,p.selectors.push(e),p.contexts.push(t),p.listeners.push([])),p.listeners[u].push([i,!!s.capture,s.passive])}function s(e,t,n,r,o){var s=f(o),c=O[n],p=!1,u=void 0;if(c)for(u=c.selectors.length-1;u>=0;u--)if(c.selectors[u]===e&&c.contexts[u]===t){for(var d=c.listeners[u],v=d.length-1;v>=0;v--){var g=d[v],h=g[0],m=g[1],y=g[2];if(h===r&&m===!!s.capture&&y===s.passive){d.splice(v,1),d.length||(c.selectors.splice(u,1),c.contexts.splice(u,1),c.listeners.splice(u,1),i(t,n,a),i(t,n,l,!0),c.selectors.length||(O[n]=null)),p=!0;break}}if(p)break}}function a(e,t){var n=f(t),r={},i=O[e.type],o=g.getActualElement(e.path?e.path[0]:e.target),s=o;for(h(r,e),r.originalEvent=e,r.preventDefault=p;v.element(s);){for(var a=0;a=l.length)break;u=l[p++]}else{if(p=l.next(),p.done)break;u=p.value}var d=u,f=o[d](a);if(f)return f}},simulationResume:function(e){var t=e.pointerType,n=e.eventType,o=e.eventTarget;if(!/down|start/i.test(n))return null;for(var s=r.interactions,a=Array.isArray(s),l=0,s=a?s:s[Symbol.iterator]();;){var c;if(a){if(l>=s.length)break;c=s[l++]}else{if(l=s.next(),l.done)break;c=l.value}var p=c,u=o;if(p.simulation&&p.simulation.allowResume&&p.pointerType===t)for(;u;){if(u===p.element)return p;u=i.parentNode(u)}}return null},mouseOrPen:function(e){var t=e.pointerId,n=e.pointerType,o=e.eventType;if("mouse"!==n&&"pen"!==n)return null;for(var s=void 0,a=r.interactions,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var u=p;if(u.pointerType===n){if(u.simulation&&!i.contains(u.pointerIds,t))continue;if(u.interacting())return u;s||(s=u)}}if(s)return s;for(var d=r.interactions,f=Array.isArray(d),v=0,d=f?d:d[Symbol.iterator]();;){var g;if(f){if(v>=d.length)break;g=d[v++]}else{if(v=d.next(),v.done)break;g=v.value}var h=g;if(!(h.pointerType!==n||/down/i.test(o)&&h.simulation))return h}return null},hasPointer:function(e){for(var t=e.pointerId,n=r.interactions,o=Array.isArray(n),s=0,n=o?n:n[Symbol.iterator]();;){var a;if(o){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var l=a;if(i.contains(l.pointerIds,t))return l}},idle:function(e){for(var t=e.pointerType,n=r.interactions,i=Array.isArray(n),o=0,n=i?n:n[Symbol.iterator]();;){var s;if(i){if(o>=n.length)break;s=n[o++]}else{if(o=n.next(),o.done)break;s=o.value}var a=s;if(1===a.pointerIds.length){var l=a.target;if(l&&!l.options.gesture.enabled)continue}else if(a.pointerIds.length>=2)continue;if(!a.interacting()&&t===a.pointerType)return a}return null}};t.exports=o},{"../scope":34,"./index":44}],46:[function(e,t,n){"use strict";var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},i=e("./window"),o=e("./isWindow"),s={array:function(){},window:function(e){return e===i.window||o(e)},docFrag:function(e){return s.object(e)&&11===e.nodeType},object:function(e){return!!e&&"object"===(void 0===e?"undefined":r(e))},function:function(e){return"function"==typeof e},number:function(e){return"number"==typeof e},bool:function(e){return"boolean"==typeof e},string:function(e){return"string"==typeof e},element:function(e){if(!e||"object"!==(void 0===e?"undefined":r(e)))return!1;var t=i.getWindow(e)||i.window;return/object|function/.test(r(t.Element))?e instanceof t.Element:1===e.nodeType&&"string"==typeof e.nodeName}};s.array=function(e){return s.object(e)&&void 0!==e.length&&s.function(e.splice)},t.exports=s},{"./isWindow":47,"./window":52}],47:[function(e,t,n){"use strict";t.exports=function(e){return!(!e||!e.Window)&&e instanceof e.Window}},{}],48:[function(e,t,n){"use strict";function r(e,n){for(var r in n){var i=t.exports.prefixedPropREs,o=!1;for(var s in i)if(0===r.indexOf(s)&&i[s].test(r)){o=!0;break}o||"function"==typeof n[r]||(e[r]=n[r])}return e}r.prefixedPropREs={webkit:/(Movement[XY]|Radius[XY]|RotationAngle|Force)$/},t.exports=r},{}],49:[function(e,t,n){"use strict";var r=e("./hypot"),i=e("./browser"),o=e("./domObjects"),s=e("./domUtils"),a=e("./domObjects"),l=e("./is"),c=e("./pointerExtend"),p={copyCoords:function(e,t){e.page=e.page||{},e.page.x=t.page.x,e.page.y=t.page.y,e.client=e.client||{},e.client.x=t.client.x,e.client.y=t.client.y,e.timeStamp=t.timeStamp},setCoordDeltas:function(e,t,n){e.page.x=n.page.x-t.page.x,e.page.y=n.page.y-t.page.y,e.client.x=n.client.x-t.client.x,e.client.y=n.client.y-t.client.y,e.timeStamp=n.timeStamp-t.timeStamp;var i=Math.max(e.timeStamp/1e3,.001);e.page.speed=r(e.page.x,e.page.y)/i,e.page.vx=e.page.x/i,e.page.vy=e.page.y/i,e.client.speed=r(e.client.x,e.page.y)/i,e.client.vx=e.client.x/i,e.client.vy=e.client.y/i},isNativePointer:function(e){return e instanceof o.Event||e instanceof o.Touch},getXY:function(e,t,n){return n=n||{},e=e||"page",n.x=t[e+"X"],n.y=t[e+"Y"],n},getPageXY:function(e,t){return t=t||{},i.isOperaMobile&&p.isNativePointer(e)?(p.getXY("screen",e,t),t.x+=window.scrollX,t.y+=window.scrollY):p.getXY("page",e,t),t},getClientXY:function(e,t){return t=t||{},i.isOperaMobile&&p.isNativePointer(e)?p.getXY("screen",e,t):p.getXY("client",e,t),t},getPointerId:function(e){return l.number(e.pointerId)?e.pointerId:e.identifier},setCoords:function(e,t,n){var r=t.length>1?p.pointerAverage(t):t[0],i={};p.getPageXY(r,i),e.page.x=i.x,e.page.y=i.y,p.getClientXY(r,i),e.client.x=i.x,e.client.y=i.y,e.timeStamp=l.number(n)?n:(new Date).getTime()},pointerExtend:c,getTouchPair:function(e){var t=[];return l.array(e)?(t[0]=e[0],t[1]=e[1]):"touchend"===e.type?1===e.touches.length?(t[0]=e.touches[0],t[1]=e.changedTouches[0]):0===e.touches.length&&(t[0]=e.changedTouches[0],t[1]=e.changedTouches[1]):(t[0]=e.touches[0],t[1]=e.touches[1]),t},pointerAverage:function(e){for(var t={pageX:0,pageY:0,clientX:0,clientY:0,screenX:0,screenY:0},n=e,r=Array.isArray(n),i=0,n=r?n:n[Symbol.iterator]();;){var o;if(r){if(i>=n.length)break;o=n[i++]}else{if(i=n.next(),i.done)break;o=i.value}var s=o;for(var a in t)t[a]+=s[a]}for(var l in t)t[l]/=e.length;return t},touchBBox:function(e){if(e.length||e.touches&&e.touches.length>1){var t=p.getTouchPair(e),n=Math.min(t[0].pageX,t[1].pageX),r=Math.min(t[0].pageY,t[1].pageY);return{x:n,y:r,left:n,top:r,width:Math.max(t[0].pageX,t[1].pageX)-n,height:Math.max(t[0].pageY,t[1].pageY)-r}}},touchDistance:function(e,t){var n=t+"X",i=t+"Y",o=p.getTouchPair(e),s=o[0][n]-o[1][n],a=o[0][i]-o[1][i];return r(s,a)},touchAngle:function(e,t,n){var r=n+"X",i=n+"Y",o=p.getTouchPair(e),s=o[1][r]-o[0][r],a=o[1][i]-o[0][i];return 180*Math.atan2(a,s)/Math.PI},getPointerType:function(e){return l.string(e.pointerType)?e.pointerType:l.number(e.pointerType)?[void 0,void 0,"touch","pen","mouse"][e.pointerType]:/touch/.test(e.type)||e instanceof a.Touch?"touch":"mouse"},getEventTargets:function(e){return[s.getActualElement(e.path?e.path[0]:e.target),s.getActualElement(e.currentTarget)]}};t.exports=p},{"./browser":37,"./domObjects":38,"./domUtils":39,"./hypot":43,"./is":46,"./pointerExtend":48}],50:[function(e,t,n){"use strict";for(var r=e("./window"),i=r.window,o=["ms","moz","webkit","o"],s=0,a=void 0,l=void 0,c=0;c\n * Open source under the MIT License.\n * https://raw.github.com/taye/interact.js/master/LICENSE\n */\n","/*\n * In a (windowless) server environment this file exports a factory function\n * that takes the window to use.\n *\n * var interact = require('interact.js')(windowObject);\n *\n * See https://github.com/taye/interact.js/issues/187\n */\nif (typeof window === 'undefined') {\n module.exports = function (window) {\n require('./src/utils/window').init(window);\n\n return require('./src/index');\n };\n}\nelse {\n module.exports = require('./src/index');\n}\n","const { indexOf } = require('./utils/arr');\nconst extend = require('./utils/extend.js');\n\nfunction fireUntilImmediateStopped (event, listeners) {\n for (let i = 0, len = listeners.length; i < len && !event.immediatePropagationStopped; i++) {\n listeners[i](event);\n }\n}\n\nclass Eventable {\n\n constructor (options) {\n this.options = extend({}, options || {});\n }\n\n fire (event) {\n let listeners;\n const onEvent = 'on' + event.type;\n const global = this.global;\n\n // Interactable#on() listeners\n if ((listeners = this[event.type])) {\n fireUntilImmediateStopped(event, listeners);\n }\n\n // interactable.onevent listener\n if (this[onEvent]) {\n this[onEvent](event);\n }\n\n // interact.on() listeners\n if (!event.propagationStopped && global && (listeners = global[event.type])) {\n fireUntilImmediateStopped(event, listeners);\n }\n }\n\n on (eventType, listener) {\n // if this type of event was never bound\n if (this[eventType]) {\n this[eventType].push(listener);\n }\n else {\n this[eventType] = [listener];\n }\n }\n\n off (eventType, listener) {\n // if it is an action event type\n const eventList = this[eventType];\n const index = eventList? indexOf(eventList, listener) : -1;\n\n if (index !== -1) {\n eventList.splice(index, 1);\n }\n\n if (eventList && eventList.length === 0 || !listener) {\n this[eventType] = listener;\n }\n }\n}\n\nmodule.exports = Eventable;\n","const extend = require('./utils/extend');\nconst getOriginXY = require('./utils/getOriginXY');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nclass InteractEvent {\n constructor (interaction, event, action, phase, element, related, preEnd = false) {\n const target = interaction.target;\n const deltaSource = (target && target.options || defaults).deltaSource;\n const origin = getOriginXY(target, element, action);\n const starting = phase === 'start';\n const ending = phase === 'end';\n const coords = starting? interaction.startCoords : interaction.curCoords;\n const prevEvent = interaction.prevEvent;\n\n element = element || interaction.element;\n\n const page = extend({}, coords.page);\n const client = extend({}, coords.client);\n\n page.x -= origin.x;\n page.y -= origin.y;\n\n client.x -= origin.x;\n client.y -= origin.y;\n\n this.ctrlKey = event.ctrlKey;\n this.altKey = event.altKey;\n this.shiftKey = event.shiftKey;\n this.metaKey = event.metaKey;\n this.button = event.button;\n this.buttons = event.buttons;\n this.target = element;\n this.currentTarget = element;\n this.relatedTarget = related || null;\n this.preEnd = preEnd;\n this.type = action + (phase || '');\n this.interaction = interaction;\n this.interactable = target;\n\n this.t0 = starting ? interaction.downTimes[interaction.downTimes.length - 1]\n : prevEvent.t0;\n\n const signalArg = {\n interaction,\n event,\n action,\n phase,\n element,\n related,\n page,\n client,\n coords,\n starting,\n ending,\n deltaSource,\n iEvent: this,\n };\n\n signals.fire('set-xy', signalArg);\n\n if (ending) {\n // use previous coords when ending\n this.pageX = prevEvent.pageX;\n this.pageY = prevEvent.pageY;\n this.clientX = prevEvent.clientX;\n this.clientY = prevEvent.clientY;\n }\n else {\n this.pageX = page.x;\n this.pageY = page.y;\n this.clientX = client.x;\n this.clientY = client.y;\n }\n\n this.x0 = interaction.startCoords.page.x - origin.x;\n this.y0 = interaction.startCoords.page.y - origin.y;\n this.clientX0 = interaction.startCoords.client.x - origin.x;\n this.clientY0 = interaction.startCoords.client.y - origin.y;\n\n signals.fire('set-delta', signalArg);\n\n this.timeStamp = coords.timeStamp;\n this.dt = interaction.pointerDelta.timeStamp;\n this.duration = this.timeStamp - this.t0;\n\n // speed and velocity in pixels per second\n this.speed = interaction.pointerDelta[deltaSource].speed;\n this.velocityX = interaction.pointerDelta[deltaSource].vx;\n this.velocityY = interaction.pointerDelta[deltaSource].vy;\n\n this.swipe = (ending || phase === 'inertiastart')? this.getSwipe() : null;\n\n signals.fire('new', signalArg);\n }\n\n getSwipe () {\n const interaction = this.interaction;\n\n if (interaction.prevEvent.speed < 600\n || this.timeStamp - interaction.prevEvent.timeStamp > 150) {\n return null;\n }\n\n let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI;\n const overlap = 22.5;\n\n if (angle < 0) {\n angle += 360;\n }\n\n const left = 135 - overlap <= angle && angle < 225 + overlap;\n const up = 225 - overlap <= angle && angle < 315 + overlap;\n\n const right = !left && (315 - overlap <= angle || angle < 45 + overlap);\n const down = !up && 45 - overlap <= angle && angle < 135 + overlap;\n\n return {\n up,\n down,\n left,\n right,\n angle,\n speed: interaction.prevEvent.speed,\n velocity: {\n x: interaction.prevEvent.velocityX,\n y: interaction.prevEvent.velocityY,\n },\n };\n }\n\n preventDefault () {}\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n}\n\nsignals.on('set-delta', function ({ iEvent, interaction, starting, deltaSource }) {\n const prevEvent = starting? iEvent : interaction.prevEvent;\n\n if (deltaSource === 'client') {\n iEvent.dx = iEvent.clientX - prevEvent.clientX;\n iEvent.dy = iEvent.clientY - prevEvent.clientY;\n }\n else {\n iEvent.dx = iEvent.pageX - prevEvent.pageX;\n iEvent.dy = iEvent.pageY - prevEvent.pageY;\n }\n});\n\nInteractEvent.signals = signals;\n\nmodule.exports = InteractEvent;\n","const is = require('./utils/is');\nconst events = require('./utils/events');\nconst extend = require('./utils/extend');\nconst actions = require('./actions/base');\nconst scope = require('./scope');\nconst Eventable = require('./Eventable');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nconst {\n getElementRect,\n nodeContains,\n trySelector,\n} = require('./utils/domUtils');\nconst { getWindow } = require('./utils/window');\nconst { indexOf, contains } = require('./utils/arr');\nconst { wheelEvent } = require('./utils/browser');\n\n// all set interactables\nscope.interactables = [];\n\n/*\\\n * Interactable\n [ property ]\n **\n * Object type returned by @interact\n\\*/\nclass Interactable {\n constructor (target, options) {\n options = options || {};\n\n this.target = target;\n this.events = new Eventable();\n this._context = options.context || scope.document;\n this._win = getWindow(trySelector(target)? this._context : target);\n this._doc = this._win.document;\n\n signals.fire('new', {\n target,\n options,\n interactable: this,\n win: this._win,\n });\n\n scope.addDocument( this._doc, this._win );\n\n scope.interactables.push(this);\n\n this.set(options);\n }\n\n setOnEvents (action, phases) {\n const onAction = 'on' + action;\n\n if (is.function(phases.onstart) ) { this.events[onAction + 'start' ] = phases.onstart ; }\n if (is.function(phases.onmove) ) { this.events[onAction + 'move' ] = phases.onmove ; }\n if (is.function(phases.onend) ) { this.events[onAction + 'end' ] = phases.onend ; }\n if (is.function(phases.oninertiastart)) { this.events[onAction + 'inertiastart' ] = phases.oninertiastart ; }\n\n return this;\n }\n\n setPerAction (action, options) {\n // for all the default per-action options\n for (const option in options) {\n // if this option exists for this action\n if (option in defaults[action]) {\n // if the option in the options arg is an object value\n if (is.object(options[option])) {\n // duplicate the object\n this.options[action][option] = extend(this.options[action][option] || {}, options[option]);\n\n if (is.object(defaults.perAction[option]) && 'enabled' in defaults.perAction[option]) {\n this.options[action][option].enabled = options[option].enabled === false? false : true;\n }\n }\n else if (is.bool(options[option]) && is.object(defaults.perAction[option])) {\n this.options[action][option].enabled = options[option];\n }\n else if (options[option] !== undefined) {\n // or if it's not undefined, do a plain assignment\n this.options[action][option] = options[option];\n }\n }\n }\n }\n\n /*\\\n * Interactable.getRect\n [ method ]\n *\n * The default function to get an Interactables bounding rect. Can be\n * overridden using @Interactable.rectChecker.\n *\n - element (Element) #optional The element to measure.\n = (object) The object's bounding rectangle.\n o {\n o top : 0,\n o left : 0,\n o bottom: 0,\n o right : 0,\n o width : 0,\n o height: 0\n o }\n \\*/\n getRect (element) {\n element = element || this.target;\n\n if (is.string(this.target) && !(is.element(element))) {\n element = this._context.querySelector(this.target);\n }\n\n return getElementRect(element);\n }\n\n /*\\\n * Interactable.rectChecker\n [ method ]\n *\n * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n - checker (function) #optional A function which returns this Interactable's bounding rectangle. See @Interactable.getRect\n = (function | object) The checker function or this Interactable\n \\*/\n rectChecker (checker) {\n if (is.function(checker)) {\n this.getRect = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.getRect;\n\n return this;\n }\n\n return this.getRect;\n }\n\n _backCompatOption (optionName, newValue) {\n if (trySelector(newValue) || is.object(newValue)) {\n this.options[optionName] = newValue;\n\n for (const action of actions.names) {\n this.options[action][optionName] = newValue;\n }\n\n return this;\n }\n\n return this.options[optionName];\n }\n\n /*\\\n * Interactable.origin\n [ method ]\n *\n * Gets or sets the origin of the Interactable's element. The x and y\n * of the origin will be subtracted from action event coordinates.\n *\n - origin (object | string) #optional An object eg. { x: 0, y: 0 } or string 'parent', 'self' or any CSS selector\n * OR\n - origin (Element) #optional An HTML or SVG Element whose rect will be used\n **\n = (object) The current origin or this Interactable\n \\*/\n origin (newValue) {\n return this._backCompatOption('origin', newValue);\n }\n\n /*\\\n * Interactable.deltaSource\n [ method ]\n *\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n - newValue (string) #optional Use 'client' if you will be scrolling while interacting; Use 'page' if you want autoScroll to work\n = (string | object) The current deltaSource or this Interactable\n \\*/\n deltaSource (newValue) {\n if (newValue === 'page' || newValue === 'client') {\n this.options.deltaSource = newValue;\n\n return this;\n }\n\n return this.options.deltaSource;\n }\n\n /*\\\n * Interactable.context\n [ method ]\n *\n * Gets the selector context Node of the Interactable. The default is `window.document`.\n *\n = (Node) The context Node of this Interactable\n **\n \\*/\n context () {\n return this._context;\n }\n\n inContext (element) {\n return (this._context === element.ownerDocument\n || nodeContains(this._context, element));\n }\n\n /*\\\n * Interactable.fire\n [ method ]\n *\n * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n - iEvent (InteractEvent) The InteractEvent object to be fired on this Interactable\n = (Interactable) this Interactable\n \\*/\n fire (iEvent) {\n this.events.fire(iEvent);\n\n return this;\n }\n\n _onOffMultiple (method, eventType, listener, options) {\n if (is.string(eventType) && eventType.search(' ') !== -1) {\n eventType = eventType.trim().split(/ +/);\n }\n\n if (is.array(eventType)) {\n for (let i = 0; i < eventType.length; i++) {\n this[method](eventType[i], listener, options);\n }\n\n return true;\n }\n\n if (is.object(eventType)) {\n for (const prop in eventType) {\n this[method](prop, eventType[prop], listener);\n }\n\n return true;\n }\n }\n\n /*\\\n * Interactable.on\n [ method ]\n *\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n - eventType (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) This Interactable\n \\*/\n on (eventType, listener, options) {\n if (this._onOffMultiple('on', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.on(eventType, listener);\n }\n // delegated event for selector\n else if (is.string(this.target)) {\n events.addDelegate(this.target, this._context, eventType, listener, options);\n }\n else {\n events.add(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.off\n [ method ]\n *\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n - eventType (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) This Interactable\n \\*/\n off (eventType, listener, options) {\n if (this._onOffMultiple('off', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n // if it is an action event type\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.off(eventType, listener);\n }\n // delegated event\n else if (is.string(this.target)) {\n events.removeDelegate(this.target, this._context, eventType, listener, options);\n }\n // remove listener from this Interatable's element\n else {\n events.remove(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.set\n [ method ]\n *\n * Reset the options of this Interactable\n - options (object) The new settings to apply\n = (object) This Interactable\n \\*/\n set (options) {\n if (!is.object(options)) {\n options = {};\n }\n\n this.options = extend({}, defaults.base);\n\n const perActions = extend({}, defaults.perAction);\n\n for (const actionName in actions.methodDict) {\n const methodName = actions.methodDict[actionName];\n\n this.options[actionName] = extend({}, defaults[actionName]);\n\n this.setPerAction(actionName, perActions);\n\n this[methodName](options[actionName]);\n }\n\n for (const setting of Interactable.settingsMethods) {\n this.options[setting] = defaults.base[setting];\n\n if (setting in options) {\n this[setting](options[setting]);\n }\n }\n\n signals.fire('set', {\n options,\n interactable: this,\n });\n\n return this;\n }\n\n /*\\\n * Interactable.unset\n [ method ]\n *\n * Remove this interactable from the list of interactables and remove\n * it's action capabilities and event listeners\n *\n = (object) @interact\n \\*/\n unset () {\n events.remove(this.target, 'all');\n\n if (is.string(this.target)) {\n // remove delegated events\n for (const type in events.delegatedEvents) {\n const delegated = events.delegatedEvents[type];\n\n if (delegated.selectors[0] === this.target\n && delegated.contexts[0] === this._context) {\n\n delegated.selectors.splice(0, 1);\n delegated.contexts .splice(0, 1);\n delegated.listeners.splice(0, 1);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegated[type] = null;\n }\n }\n\n events.remove(this._context, type, events.delegateListener);\n events.remove(this._context, type, events.delegateUseCapture, true);\n }\n }\n else {\n events.remove(this, 'all');\n }\n\n signals.fire('unset', { interactable: this });\n\n scope.interactables.splice(indexOf(scope.interactables, this), 1);\n\n // Stop related interactions when an Interactable is unset\n for (const interaction of scope.interactions || []) {\n if (interaction.target === this && interaction.interacting()) {\n interaction.stop();\n }\n }\n\n return scope.interact;\n }\n}\n\nscope.interactables.indexOfElement = function indexOfElement (target, context) {\n context = context || scope.document;\n\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n if (interactable.target === target && interactable._context === context) {\n return i;\n }\n }\n return -1;\n};\n\nscope.interactables.get = function interactableGet (element, options, dontCheckInContext) {\n const ret = this[this.indexOfElement(element, options && options.context)];\n\n return ret && (is.string(element) || dontCheckInContext || ret.inContext(element))? ret : null;\n};\n\nscope.interactables.forEachSelector = function (callback, element) {\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n // skip non CSS selector targets and out of context elements\n if (!is.string(interactable.target)\n || (element && !interactable.inContext(element))) {\n continue;\n }\n\n const ret = callback(interactable, interactable.target, interactable._context, i, this);\n\n if (ret !== undefined) {\n return ret;\n }\n }\n};\n\n// all interact.js eventTypes\nInteractable.eventTypes = scope.eventTypes = [];\n\nInteractable.signals = signals;\n\nInteractable.settingsMethods = [ 'deltaSource', 'origin', 'preventDefault', 'rectChecker' ];\n\nmodule.exports = Interactable;\n","const scope = require('./scope');\nconst utils = require('./utils');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst finder = require('./utils/interactionFinder');\nconst signals = require('./utils/Signals').new();\n\nconst listeners = {};\nconst methodNames = [\n 'pointerDown', 'pointerMove', 'pointerUp',\n 'updatePointer', 'removePointer',\n];\n\n// for ignoring browser's simulated mouse events\nlet prevTouchTime = 0;\n\n// all active and idle interactions\nscope.interactions = [];\n\nclass Interaction {\n constructor () {\n this.target = null; // current interactable being interacted with\n this.element = null; // the target element of the interactable\n\n this.prepared = { // action that's ready to be fired on next move event\n name : null,\n axis : null,\n edges: null,\n };\n\n // keep track of added pointers\n this.pointers = [];\n this.pointerIds = [];\n this.downTargets = [];\n this.downTimes = [];\n\n // Previous native pointer move event coordinates\n this.prevCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n // current native pointer move event coordinates\n this.curCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Starting InteractEvent pointer coordinates\n this.startCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Change in coordinates and time of the pointer\n this.pointerDelta = {\n page : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n client : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n timeStamp: 0,\n };\n\n this.downEvent = null; // pointerdown/mousedown/touchstart event\n this.downPointer = {};\n\n this._eventTarget = null;\n this._curEventTarget = null;\n\n this.prevEvent = null; // previous action event\n\n this.pointerIsDown = false;\n this.pointerWasMoved = false;\n this._interacting = false;\n\n this.mouse = false;\n\n signals.fire('new', this);\n\n scope.interactions.push(this);\n }\n\n pointerDown (pointer, event, eventTarget) {\n const pointerIndex = this.updatePointer(pointer, event, true);\n\n signals.fire('down', {\n pointer,\n event,\n eventTarget,\n pointerIndex,\n interaction: this,\n });\n }\n\n /*\\\n * Interaction.start\n [ method ]\n *\n * Start an action with the given Interactable and Element as tartgets. The\n * action must be enabled for the target Interactable and an appropriate number\n * of pointers must be held down - 1 for drag/resize, 2 for gesture.\n *\n * Use it with `interactable.able({ manualStart: false })` to always\n * [start actions manually](https://github.com/taye/interact.js/issues/114)\n *\n - action (object) The action to be performed - drag, resize, etc.\n - target (Interactable) The Interactable to target\n - element (Element) The DOM Element to target\n = (object) interact\n **\n | interact(target)\n | .draggable({\n | // disable the default drag start by down->move\n | manualStart: true\n | })\n | // start dragging after the user holds the pointer down\n | .on('hold', function (event) {\n | var interaction = event.interaction;\n |\n | if (!interaction.interacting()) {\n | interaction.start({ name: 'drag' },\n | event.interactable,\n | event.currentTarget);\n | }\n | });\n \\*/\n start (action, target, element) {\n if (this.interacting()\n || !this.pointerIsDown\n || this.pointerIds.length < (action.name === 'gesture'? 2 : 1)) {\n return;\n }\n\n // if this interaction had been removed after stopping\n // add it back\n if (utils.indexOf(scope.interactions, this) === -1) {\n scope.interactions.push(this);\n }\n\n utils.copyAction(this.prepared, action);\n this.target = target;\n this.element = element;\n\n signals.fire('action-start', {\n interaction: this,\n event: this.downEvent,\n });\n }\n\n pointerMove (pointer, event, eventTarget) {\n if (!this.simulation) {\n this.updatePointer(pointer);\n utils.setCoords(this.curCoords, this.pointers);\n }\n\n const duplicateMove = (this.curCoords.page.x === this.prevCoords.page.x\n && this.curCoords.page.y === this.prevCoords.page.y\n && this.curCoords.client.x === this.prevCoords.client.x\n && this.curCoords.client.y === this.prevCoords.client.y);\n\n let dx;\n let dy;\n\n // register movement greater than pointerMoveTolerance\n if (this.pointerIsDown && !this.pointerWasMoved) {\n dx = this.curCoords.client.x - this.startCoords.client.x;\n dy = this.curCoords.client.y - this.startCoords.client.y;\n\n this.pointerWasMoved = utils.hypot(dx, dy) > Interaction.pointerMoveTolerance;\n }\n\n const signalArg = {\n pointer,\n pointerIndex: this.getPointerIndex(pointer),\n event,\n eventTarget,\n dx,\n dy,\n duplicate: duplicateMove,\n interaction: this,\n interactingBeforeMove: this.interacting(),\n };\n\n if (!duplicateMove) {\n // set pointer coordinate, time changes and speeds\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n }\n\n signals.fire('move', signalArg);\n\n if (!duplicateMove) {\n // if interacting, fire an 'action-move' signal etc\n if (this.interacting()) {\n this.doMove(signalArg);\n }\n\n if (this.pointerWasMoved) {\n utils.copyCoords(this.prevCoords, this.curCoords);\n }\n }\n }\n\n /*\\\n * Interaction.doMove\n [ method ]\n *\n * Force a move of the current action at the same coordinates. Useful if\n * snap/restrict has been changed and you want a movement with the new\n * settings.\n *\n **\n | interact(target)\n | .draggable(true)\n | .on('dragmove', function (event) {\n | if (someCondition) {\n | // change the snap settings\n | event.interactable.draggable({ snap: { targets: [] }});\n | // fire another move event with re-calculated snap\n | event.interaction.doMove();\n | }\n | });\n \\*/\n doMove (signalArg) {\n signalArg = utils.extend({\n pointer: this.pointers[0],\n event: this.prevEvent,\n eventTarget: this._eventTarget,\n interaction: this,\n }, signalArg || {});\n\n signals.fire('before-action-move', signalArg);\n\n if (!this._dontFireMove) {\n signals.fire('action-move', signalArg);\n }\n\n this._dontFireMove = false;\n }\n\n // End interact move events and stop auto-scroll unless simulation is running\n pointerUp (pointer, event, eventTarget, curEventTarget) {\n const pointerIndex = this.getPointerIndex(pointer);\n\n signals.fire(/cancel$/i.test(event.type)? 'cancel' : 'up', {\n pointer,\n pointerIndex,\n event,\n eventTarget,\n curEventTarget,\n interaction: this,\n });\n\n if (!this.simulation) {\n this.end(event);\n }\n\n this.pointerIsDown = false;\n this.removePointer(pointer, event);\n }\n\n /*\\\n * Interaction.end\n [ method ]\n *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n - event (PointerEvent) #optional\n **\n | interact(target)\n | .draggable(true)\n | .on('move', function (event) {\n | if (event.pageX > 1000) {\n | // end the current action\n | event.interaction.end();\n | // stop all further listeners from being called\n | event.stopImmediatePropagation();\n | }\n | });\n \\*/\n end (event) {\n event = event || this.prevEvent;\n\n if (this.interacting()) {\n signals.fire('action-end', {\n event,\n interaction: this,\n });\n }\n\n this.stop();\n }\n\n currentAction () {\n return this._interacting? this.prepared.name: null;\n }\n\n interacting () {\n return this._interacting;\n }\n\n stop () {\n signals.fire('stop', { interaction: this });\n\n if (this._interacting) {\n signals.fire('stop-active', { interaction: this });\n signals.fire('stop-' + this.prepared.name, { interaction: this });\n }\n\n this.target = this.element = null;\n\n this._interacting = false;\n this.prepared.name = this.prevEvent = null;\n }\n\n getPointerIndex (pointer) {\n return utils.indexOf(this.pointerIds, utils.getPointerId(pointer));\n }\n\n updatePointer (pointer, event, down = event && /(down|start)$/i.test(event.type)) {\n const id = utils.getPointerId(pointer);\n let index = this.getPointerIndex(pointer);\n\n if (index === -1) {\n index = this.pointerIds.length;\n this.pointerIds[index] = id;\n }\n\n if (down) {\n signals.fire('update-pointer-down', {\n pointer,\n event,\n down,\n pointerId: id,\n pointerIndex: index,\n interaction: this,\n });\n }\n\n this.pointers[index] = pointer;\n\n return index;\n }\n\n removePointer (pointer, event) {\n const id = utils.getPointerId(pointer);\n const index = this.mouse? 0 : utils.indexOf(this.pointerIds, id);\n\n if (index === -1) { return; }\n\n signals.fire('remove-pointer', {\n pointer,\n event,\n pointerIndex: index,\n interaction: this,\n });\n\n this.pointers .splice(index, 1);\n this.pointerIds .splice(index, 1);\n this.downTargets.splice(index, 1);\n this.downTimes .splice(index, 1);\n }\n\n _updateEventTargets (target, currentTarget) {\n this._eventTarget = target;\n this._curEventTarget = currentTarget;\n }\n}\n\nfor (let i = 0, len = methodNames.length; i < len; i++) {\n const method = methodNames[i];\n\n listeners[method] = doOnInteractions(method);\n}\n\nfunction doOnInteractions (method) {\n return (function (event) {\n const [eventTarget, curEventTarget] = utils.getEventTargets(event);\n const matches = []; // [ [pointer, interaction], ...]\n\n if (browser.supportsTouch && /touch/.test(event.type)) {\n prevTouchTime = new Date().getTime();\n\n for (let i = 0; i < event.changedTouches.length; i++) {\n const pointer = event.changedTouches[i];\n const interaction = finder.search(pointer, event.type, eventTarget);\n\n matches.push([pointer, interaction || new Interaction()]);\n }\n }\n else {\n let invalidPointer = false;\n\n if (!browser.supportsPointerEvent && /mouse/.test(event.type)) {\n // ignore mouse events while touch interactions are active\n for (let i = 0; i < scope.interactions.length && !invalidPointer; i++) {\n invalidPointer = !scope.interactions[i].mouse && scope.interactions[i].pointerIsDown;\n }\n\n // try to ignore mouse events that are simulated by the browser\n // after a touch event\n invalidPointer = invalidPointer\n || (new Date().getTime() - prevTouchTime < 500)\n // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated\n || event.timeStamp === 0;\n }\n\n if (!invalidPointer) {\n let interaction = finder.search(event, event.type, eventTarget);\n\n if (!interaction) {\n\n interaction = new Interaction();\n interaction.mouse = (/mouse/i.test(event.pointerType || event.type)\n // MSPointerEvent.MSPOINTER_TYPE_MOUSE\n || event.pointerType === 4\n || !event.pointerType);\n }\n\n matches.push([event, interaction]);\n }\n }\n\n for (const [pointer, interaction] of matches) {\n interaction._updateEventTargets(eventTarget, curEventTarget);\n interaction[method](pointer, event, eventTarget, curEventTarget);\n }\n });\n}\n\nfunction endAll (event) {\n for (let i = 0; i < scope.interactions.length; i++) {\n const interaction = scope.interactions[i];\n\n interaction.end(event);\n signals.fire('endall', { event, interaction });\n }\n}\n\nconst docEvents = { /* 'eventType': listenerFunc */ };\nconst pEventTypes = browser.pEventTypes;\n\nif (scope.PointerEvent) {\n docEvents[pEventTypes.down ] = listeners.pointerDown;\n docEvents[pEventTypes.move ] = listeners.pointerMove;\n docEvents[pEventTypes.up ] = listeners.pointerUp;\n docEvents[pEventTypes.cancel] = listeners.pointerUp;\n}\nelse {\n docEvents.mousedown = listeners.pointerDown;\n docEvents.mousemove = listeners.pointerMove;\n docEvents.mouseup = listeners.pointerUp;\n\n docEvents.touchstart = listeners.pointerDown;\n docEvents.touchmove = listeners.pointerMove;\n docEvents.touchend = listeners.pointerUp;\n docEvents.touchcancel = listeners.pointerUp;\n}\n\ndocEvents.blur = endAll;\n\nfunction onDocSignal ({ doc }, signalName) {\n const eventMethod = signalName.indexOf('add') === 0\n ? events.add : events.remove;\n\n // delegate event listener\n for (const eventType in scope.delegatedEvents) {\n eventMethod(doc, eventType, events.delegateListener);\n eventMethod(doc, eventType, events.delegateUseCapture, true);\n }\n\n for (const eventType in docEvents) {\n eventMethod(doc, eventType, docEvents[eventType]);\n }\n}\n\nsignals.on('update-pointer-down', ({ interaction, pointer, pointerId, pointerIndex, event, eventTarget, down }) => {\n interaction.pointerIds[pointerIndex] = pointerId;\n interaction.pointers[pointerIndex] = pointer;\n\n if (down) {\n interaction.pointerIsDown = true;\n }\n\n if (!interaction.interacting()) {\n utils.setCoords(interaction.startCoords, interaction.pointers);\n\n utils.copyCoords(interaction.curCoords , interaction.startCoords);\n utils.copyCoords(interaction.prevCoords, interaction.startCoords);\n\n interaction.downEvent = event;\n interaction.downTimes[pointerIndex] = interaction.curCoords.timeStamp;\n interaction.downTargets[pointerIndex] = eventTarget || event && utils.getEventTargets(event)[0];\n interaction.pointerWasMoved = false;\n\n utils.pointerExtend(interaction.downPointer, pointer);\n }\n});\n\nscope.signals.on('add-document' , onDocSignal);\nscope.signals.on('remove-document', onDocSignal);\n\nInteraction.pointerMoveTolerance = 1;\nInteraction.doOnInteractions = doOnInteractions;\nInteraction.endAll = endAll;\nInteraction.signals = signals;\nInteraction.docEvents = docEvents;\n\nscope.endAllInteractions = endAll;\n\nmodule.exports = Interaction;\n","const Interaction = require('../Interaction');\nconst InteractEvent = require('../InteractEvent');\n\nconst actions = {\n firePrepared,\n names: [],\n methodDict: {},\n};\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n interaction._interacting = true;\n firePrepared(interaction, event, 'start');\n});\n\nInteraction.signals.on('action-move', function ({ interaction, event, preEnd }) {\n firePrepared(interaction, event, 'move', preEnd);\n\n // if the action was ended in a listener\n if (!interaction.interacting()) { return false; }\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n firePrepared(interaction, event, 'end');\n});\n\nfunction firePrepared (interaction, event, phase, preEnd) {\n const actionName = interaction.prepared.name;\n\n const newEvent = new InteractEvent(interaction, event, actionName, phase, interaction.element, null, preEnd);\n\n interaction.target.fire(newEvent);\n interaction.prevEvent = newEvent;\n}\n\nmodule.exports = actions;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drag = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n startAxis : 'xy',\n lockAxis : 'xy',\n },\n\n checker: function (pointer, event, interactable) {\n const dragOptions = interactable.options.drag;\n\n return dragOptions.enabled\n ? { name: 'drag', axis: (dragOptions.lockAxis === 'start'\n ? dragOptions.startAxis\n : dragOptions.lockAxis)}\n : null;\n },\n\n getCursor: function () {\n return 'move';\n },\n};\n\nInteraction.signals.on('before-action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n interaction.curCoords.page.y = interaction.startCoords.page.y;\n interaction.curCoords.client.y = interaction.startCoords.client.y;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vx);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vx);\n interaction.pointerDelta.client.vy = 0;\n interaction.pointerDelta.page.vy = 0;\n }\n else if (axis === 'y') {\n interaction.curCoords.page.x = interaction.startCoords.page.x;\n interaction.curCoords.client.x = interaction.startCoords.client.x;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vy);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vy);\n interaction.pointerDelta.client.vx = 0;\n interaction.pointerDelta.page.vx = 0;\n }\n});\n\n// dragmove\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'dragmove') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n iEvent.pageY = interaction.startCoords.page.y;\n iEvent.clientY = interaction.startCoords.client.y;\n iEvent.dy = 0;\n }\n else if (axis === 'y') {\n iEvent.pageX = interaction.startCoords.page.x;\n iEvent.clientX = interaction.startCoords.client.x;\n iEvent.dx = 0;\n }\n});\n\n/*\\\n * Interactable.draggable\n [ method ]\n *\n * Gets or sets whether drag actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of drag events\n | var isDraggable = interact('ul li').draggable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on drag events (object makes the Interactable draggable)\n = (object) This Interactable\n | interact(element).draggable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // the axis in which the first movement must be\n | // for the drag sequence to start\n | // 'xy' by default - any direction\n | startAxis: 'x' || 'y' || 'xy',\n |\n | // 'xy' by default - don't restrict to one axis (move in any direction)\n | // 'x' or 'y' to restrict movement to either axis\n | // 'start' to restrict movement to the axis the drag started in\n | lockAxis: 'x' || 'y' || 'xy' || 'start',\n |\n | // max number of drags that can happen concurrently\n | // with elements of this Interactable. Infinity by default\n | max: Infinity,\n |\n | // max number of drags that can target the same element+Interactable\n | // 1 by default\n | maxPerElement: 2\n | });\n\\*/\nInteractable.prototype.draggable = function (options) {\n if (utils.is.object(options)) {\n this.options.drag.enabled = options.enabled === false? false: true;\n this.setPerAction('drag', options);\n this.setOnEvents('drag', options);\n\n if (/^(xy|x|y|start)$/.test(options.lockAxis)) {\n this.options.drag.lockAxis = options.lockAxis;\n }\n if (/^(xy|x|y)$/.test(options.startAxis)) {\n this.options.drag.startAxis = options.startAxis;\n }\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drag.enabled = options;\n\n if (!options) {\n this.ondragstart = this.ondragstart = this.ondragend = null;\n }\n\n return this;\n }\n\n return this.options.drag;\n};\n\nactions.drag = drag;\nactions.names.push('drag');\nutils.merge(Interactable.eventTypes, [\n 'dragstart',\n 'dragmove',\n 'draginertiastart',\n 'draginertiaresume',\n 'dragend',\n]);\nactions.methodDict.drag = 'draggable';\n\ndefaultOptions.drag = drag.defaults;\n\nmodule.exports = drag;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst scope = require('../scope');\nconst interact = require('../interact');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drop = {\n defaults: {\n enabled: false,\n accept : null,\n overlap: 'pointer',\n },\n};\n\nlet dynamicDrop = false;\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // reset active dropzones\n interaction.activeDrops.dropzones = [];\n interaction.activeDrops.elements = [];\n interaction.activeDrops.rects = [];\n\n interaction.dropEvents = null;\n\n if (!interaction.dynamicDrop) {\n setActiveDrops(interaction, interaction.element);\n }\n\n const dragEvent = interaction.prevEvent;\n const dropEvents = getDropEvents(interaction, event, dragEvent);\n\n if (dropEvents.activate) {\n fireActiveDrops(interaction, dropEvents.activate);\n }\n});\n\nInteractEvent.signals.on('new', function ({ interaction, iEvent, event }) {\n if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { return; }\n\n const draggableElement = interaction.element;\n const dragEvent = iEvent;\n const dropResult = getDrop(dragEvent, event, draggableElement);\n\n interaction.dropTarget = dropResult.dropzone;\n interaction.dropElement = dropResult.element;\n\n interaction.dropEvents = getDropEvents(interaction, event, dragEvent);\n});\n\nInteraction.signals.on('action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n fireDropEvents(interaction, interaction.dropEvents);\n});\n\nInteraction.signals.on('action-end', function ({ interaction }) {\n if (interaction.prepared.name === 'drag') {\n fireDropEvents(interaction, interaction.dropEvents);\n }\n});\n\nInteraction.signals.on('stop-drag', function ({ interaction }) {\n interaction.activeDrops.dropzones =\n interaction.activeDrops.elements =\n interaction.activeDrops.rects =\n interaction.dropEvents = null;\n});\n\nfunction collectDrops (interaction, element) {\n const drops = [];\n const elements = [];\n\n element = element || interaction.element;\n\n // collect all dropzones and their elements which qualify for a drop\n for (const current of scope.interactables) {\n if (!current.options.drop.enabled) { continue; }\n\n const accept = current.options.drop.accept;\n\n // test the draggable element against the dropzone's accept setting\n if ((utils.is.element(accept) && accept !== element)\n || (utils.is.string(accept)\n && !utils.matchesSelector(element, accept))) {\n\n continue;\n }\n\n // query for new elements if necessary\n const dropElements = utils.is.string(current.target)\n ? current._context.querySelectorAll(current.target)\n : [current.target];\n\n for (let i = 0; i < dropElements.length; i++) {\n const currentElement = dropElements[i];\n\n if (currentElement !== element) {\n drops.push(current);\n elements.push(currentElement);\n }\n }\n }\n\n return {\n elements,\n dropzones: drops,\n };\n}\n\nfunction fireActiveDrops (interaction, event) {\n let prevElement;\n\n // loop through all active dropzones and trigger event\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n const current = interaction.activeDrops.dropzones[i];\n const currentElement = interaction.activeDrops.elements [i];\n\n // prevent trigger of duplicate events on same element\n if (currentElement !== prevElement) {\n // set current element as event target\n event.target = currentElement;\n current.fire(event);\n }\n prevElement = currentElement;\n }\n}\n\n// Collect a new set of possible drops and save them in activeDrops.\n// setActiveDrops should always be called when a drag has just started or a\n// drag event happens while dynamicDrop is true\nfunction setActiveDrops (interaction, dragElement) {\n // get dropzones and their elements that could receive the draggable\n const possibleDrops = collectDrops(interaction, dragElement, true);\n\n interaction.activeDrops.dropzones = possibleDrops.dropzones;\n interaction.activeDrops.elements = possibleDrops.elements;\n interaction.activeDrops.rects = [];\n\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n interaction.activeDrops.rects[i] =\n interaction.activeDrops.dropzones[i].getRect(interaction.activeDrops.elements[i]);\n }\n}\n\nfunction getDrop (dragEvent, event, dragElement) {\n const interaction = dragEvent.interaction;\n const validDrops = [];\n\n if (dynamicDrop) {\n setActiveDrops(interaction, dragElement);\n }\n\n // collect all dropzones and their elements which qualify for a drop\n for (let j = 0; j < interaction.activeDrops.dropzones.length; j++) {\n const current = interaction.activeDrops.dropzones[j];\n const currentElement = interaction.activeDrops.elements [j];\n const rect = interaction.activeDrops.rects [j];\n\n validDrops.push(current.dropCheck(dragEvent, event, interaction.target, dragElement, currentElement, rect)\n ? currentElement\n : null);\n }\n\n // get the most appropriate dropzone based on DOM depth and order\n const dropIndex = utils.indexOfDeepestElement(validDrops);\n\n return {\n dropzone: interaction.activeDrops.dropzones[dropIndex] || null,\n element : interaction.activeDrops.elements [dropIndex] || null,\n };\n}\n\nfunction getDropEvents (interaction, pointerEvent, dragEvent) {\n const dropEvents = {\n enter : null,\n leave : null,\n activate : null,\n deactivate: null,\n move : null,\n drop : null,\n };\n\n const tmpl = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n };\n\n if (interaction.dropElement !== interaction.prevDropElement) {\n // if there was a prevDropTarget, create a dragleave event\n if (interaction.prevDropTarget) {\n dropEvents.leave = utils.extend({ type: 'dragleave' }, tmpl);\n\n dragEvent.dragLeave = dropEvents.leave.target = interaction.prevDropElement;\n dragEvent.prevDropzone = dropEvents.leave.dropzone = interaction.prevDropTarget;\n }\n // if the dropTarget is not null, create a dragenter event\n if (interaction.dropTarget) {\n dropEvents.enter = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n type : 'dragenter',\n };\n\n dragEvent.dragEnter = interaction.dropElement;\n dragEvent.dropzone = interaction.dropTarget;\n }\n }\n\n if (dragEvent.type === 'dragend' && interaction.dropTarget) {\n dropEvents.drop = utils.extend({ type: 'drop' }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n dragEvent.relatedTarget = interaction.dropElement;\n }\n if (dragEvent.type === 'dragstart') {\n dropEvents.activate = utils.extend({ type: 'dropactivate' }, tmpl);\n\n dropEvents.activate.target = null;\n dropEvents.activate.dropzone = null;\n }\n if (dragEvent.type === 'dragend') {\n dropEvents.deactivate = utils.extend({ type: 'dropdeactivate' }, tmpl);\n\n dropEvents.deactivate.target = null;\n dropEvents.deactivate.dropzone = null;\n }\n if (dragEvent.type === 'dragmove' && interaction.dropTarget) {\n dropEvents.move = utils.extend({\n dragmove : dragEvent,\n type : 'dropmove',\n }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n }\n\n return dropEvents;\n}\n\nfunction fireDropEvents (interaction, dropEvents) {\n if (dropEvents.leave) { interaction.prevDropTarget.fire(dropEvents.leave); }\n if (dropEvents.move ) { interaction.dropTarget.fire(dropEvents.move ); }\n if (dropEvents.enter) { interaction.dropTarget.fire(dropEvents.enter); }\n if (dropEvents.drop ) { interaction.dropTarget.fire(dropEvents.drop ); }\n if (dropEvents.deactivate) {\n fireActiveDrops(interaction, dropEvents.deactivate);\n }\n\n interaction.prevDropTarget = interaction.dropTarget;\n interaction.prevDropElement = interaction.dropElement;\n}\n\n/*\\\n * Interactable.dropzone\n [ method ]\n *\n * Returns or sets whether elements can be dropped onto this\n * Interactable to trigger drop events\n *\n * Dropzones can receive the following events:\n * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends\n * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone\n * - `dragmove` when a draggable that has entered the dropzone is moved\n * - `drop` when a draggable is dropped into this dropzone\n *\n * Use the `accept` option to allow only elements that match the given CSS\n * selector or element. The value can be:\n *\n * - **an Element** - only that element can be dropped into this dropzone.\n * - **a string**, - the element being dragged must match it as a CSS selector.\n * - **`null`** - accept options is cleared - it accepts any element.\n *\n * Use the `overlap` option to set how drops are checked for. The allowed\n * values are:\n *\n * - `'pointer'`, the pointer must be over the dropzone (default)\n * - `'center'`, the draggable element's center must be over the dropzone\n * - a number from 0-1 which is the `(intersection area) / (draggable area)`.\n * e.g. `0.5` for drop to happen when half of the area of the draggable is\n * over the dropzone\n *\n * Use the `checker` option to specify a function to check if a dragged\n * element is over this Interactable.\n *\n | interact(target)\n | .dropChecker(function(dragEvent, // related dragmove or dragend event\n | event, // TouchEvent/PointerEvent/MouseEvent\n | dropped, // bool result of the default checker\n | dropzone, // dropzone Interactable\n | dropElement, // dropzone elemnt\n | draggable, // draggable Interactable\n | draggableElement) {// draggable element\n |\n | return dropped && event.target.hasAttribute('allow-drop');\n | }\n *\n *\n - options (boolean | object | null) #optional The new value to be set.\n | interact('.drop').dropzone({\n | accept: '.can-drop' || document.getElementById('single-drop'),\n | overlap: 'pointer' || 'center' || zeroToOne\n | }\n = (boolean | object) The current setting or this Interactable\n\\*/\nInteractable.prototype.dropzone = function (options) {\n if (utils.is.object(options)) {\n this.options.drop.enabled = options.enabled === false? false: true;\n\n if (utils.is.function(options.ondrop) ) { this.events.ondrop = options.ondrop ; }\n if (utils.is.function(options.ondropactivate) ) { this.events.ondropactivate = options.ondropactivate ; }\n if (utils.is.function(options.ondropdeactivate)) { this.events.ondropdeactivate = options.ondropdeactivate; }\n if (utils.is.function(options.ondragenter) ) { this.events.ondragenter = options.ondragenter ; }\n if (utils.is.function(options.ondragleave) ) { this.events.ondragleave = options.ondragleave ; }\n if (utils.is.function(options.ondropmove) ) { this.events.ondropmove = options.ondropmove ; }\n\n if (/^(pointer|center)$/.test(options.overlap)) {\n this.options.drop.overlap = options.overlap;\n }\n else if (utils.is.number(options.overlap)) {\n this.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0);\n }\n if ('accept' in options) {\n this.options.drop.accept = options.accept;\n }\n if ('checker' in options) {\n this.options.drop.checker = options.checker;\n }\n\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drop.enabled = options;\n\n if (!options) {\n this.ondragenter = this.ondragleave = this.ondrop\n = this.ondropactivate = this.ondropdeactivate = null;\n }\n\n return this;\n }\n\n return this.options.drop;\n};\n\nInteractable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) {\n let dropped = false;\n\n // if the dropzone has no rect (eg. display: none)\n // call the custom dropChecker or just return false\n if (!(rect = rect || this.getRect(dropElement))) {\n return (this.options.drop.checker\n ? this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement)\n : false);\n }\n\n const dropOverlap = this.options.drop.overlap;\n\n if (dropOverlap === 'pointer') {\n const origin = utils.getOriginXY(draggable, draggableElement, 'drag');\n const page = utils.getPageXY(dragEvent);\n\n page.x += origin.x;\n page.y += origin.y;\n\n const horizontal = (page.x > rect.left) && (page.x < rect.right);\n const vertical = (page.y > rect.top ) && (page.y < rect.bottom);\n\n dropped = horizontal && vertical;\n }\n\n const dragRect = draggable.getRect(draggableElement);\n\n if (dragRect && dropOverlap === 'center') {\n const cx = dragRect.left + dragRect.width / 2;\n const cy = dragRect.top + dragRect.height / 2;\n\n dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom;\n }\n\n if (dragRect && utils.is.number(dropOverlap)) {\n const overlapArea = (Math.max(0, Math.min(rect.right , dragRect.right ) - Math.max(rect.left, dragRect.left))\n * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top , dragRect.top )));\n\n const overlapRatio = overlapArea / (dragRect.width * dragRect.height);\n\n dropped = overlapRatio >= dropOverlap;\n }\n\n if (this.options.drop.checker) {\n dropped = this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement);\n }\n\n return dropped;\n};\n\nInteractable.signals.on('unset', function ({ interactable }) {\n interactable.dropzone(false);\n});\n\nInteractable.settingsMethods.push('dropChecker');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.dropTarget = null; // the dropzone a drag target might be dropped into\n interaction.dropElement = null; // the element at the time of checking\n interaction.prevDropTarget = null; // the dropzone that was recently dragged away from\n interaction.prevDropElement = null; // the element at the time of checking\n interaction.dropEvents = null; // the dropEvents related to the current drag event\n\n interaction.activeDrops = {\n dropzones: [], // the dropzones that are mentioned below\n elements : [], // elements of dropzones that accept the target draggable\n rects : [], // the rects of the elements mentioned above\n };\n\n});\n\nInteraction.signals.on('stop', function ({ interaction }) {\n interaction.dropTarget = interaction.dropElement =\n interaction.prevDropTarget = interaction.prevDropElement = null;\n});\n\n/*\\\n * interact.dynamicDrop\n [ method ]\n *\n * Returns or sets whether the dimensions of dropzone elements are\n * calculated on every dragmove or only on dragstart for the default\n * dropChecker\n *\n - newValue (boolean) #optional True to check on each move. False to check only before start\n = (boolean | interact) The current setting or interact\n\\*/\ninteract.dynamicDrop = function (newValue) {\n if (utils.is.bool(newValue)) {\n //if (dragging && dynamicDrop !== newValue && !newValue) {\n //calcRects(dropzones);\n //}\n\n dynamicDrop = newValue;\n\n return interact;\n }\n return dynamicDrop;\n};\n\nutils.merge(Interactable.eventTypes, [\n 'dragenter',\n 'dragleave',\n 'dropactivate',\n 'dropdeactivate',\n 'dropmove',\n 'drop',\n]);\nactions.methodDict.drop = 'dropzone';\n\ndefaultOptions.drop = drop.defaults;\n\nmodule.exports = drop;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst gesture = {\n defaults: {\n enabled : false,\n origin : null,\n restrict: null,\n },\n\n checker: function (pointer, event, interactable, element, interaction) {\n if (interaction.pointerIds.length >= 2) {\n return { name: 'gesture' };\n }\n\n return null;\n },\n\n getCursor: function () {\n return '';\n },\n};\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturestart') { return; }\n iEvent.ds = 0;\n\n interaction.gesture.startDistance = interaction.gesture.prevDistance = iEvent.distance;\n interaction.gesture.startAngle = interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.scale = 1;\n});\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturemove') { return; }\n\n iEvent.ds = iEvent.scale - interaction.gesture.scale;\n\n interaction.target.fire(iEvent);\n\n interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.prevDistance = iEvent.distance;\n\n if (iEvent.scale !== Infinity\n && iEvent.scale !== null\n && iEvent.scale !== undefined\n && !isNaN(iEvent.scale)) {\n\n interaction.gesture.scale = iEvent.scale;\n }\n});\n\n/*\\\n * Interactable.gesturable\n [ method ]\n *\n * Gets or sets whether multitouch gestures can be performed on the\n * Interactable's element\n *\n = (boolean) Indicates if this can be the target of gesture events\n | var isGestureable = interact(element).gesturable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on gesture events (makes the Interactable gesturable)\n = (object) this Interactable\n | interact(element).gesturable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // limit multiple gestures.\n | // See the explanation in @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n\\*/\nInteractable.prototype.gesturable = function (options) {\n if (utils.is.object(options)) {\n this.options.gesture.enabled = options.enabled === false? false: true;\n this.setPerAction('gesture', options);\n this.setOnEvents('gesture', options);\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.gesture.enabled = options;\n\n if (!options) {\n this.ongesturestart = this.ongesturestart = this.ongestureend = null;\n }\n\n return this;\n }\n\n return this.options.gesture;\n};\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action, event, starting, ending, deltaSource }) {\n if (action !== 'gesture') { return; }\n\n const pointers = interaction.pointers;\n\n iEvent.touches = [pointers[0], pointers[1]];\n\n if (starting) {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = 1;\n iEvent.ds = 0;\n iEvent.angle = utils.touchAngle(pointers, undefined, deltaSource);\n iEvent.da = 0;\n }\n else if (ending || event instanceof InteractEvent) {\n iEvent.distance = interaction.prevEvent.distance;\n iEvent.box = interaction.prevEvent.box;\n iEvent.scale = interaction.prevEvent.scale;\n iEvent.ds = iEvent.scale - 1;\n iEvent.angle = interaction.prevEvent.angle;\n iEvent.da = iEvent.angle - interaction.gesture.startAngle;\n }\n else {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = iEvent.distance / interaction.gesture.startDistance;\n iEvent.angle = utils.touchAngle(pointers, interaction.gesture.prevAngle, deltaSource);\n\n iEvent.ds = iEvent.scale - interaction.gesture.prevScale;\n iEvent.da = iEvent.angle - interaction.gesture.prevAngle;\n }\n});\n\nInteraction.signals.on('new', function (interaction) {\n interaction.gesture = {\n start: { x: 0, y: 0 },\n\n startDistance: 0, // distance between two touches of touchStart\n prevDistance : 0,\n distance : 0,\n\n scale: 1, // gesture.distance / gesture.startDistance\n\n startAngle: 0, // angle of line joining two touches\n prevAngle : 0, // angle of the previous gesture event\n };\n});\n\nactions.gesture = gesture;\nactions.names.push('gesture');\nutils.merge(Interactable.eventTypes, [\n 'gesturestart',\n 'gesturemove',\n 'gestureend',\n]);\nactions.methodDict.gesture = 'gesturable';\n\ndefaultOptions.gesture = gesture.defaults;\n\nmodule.exports = gesture;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\n// Less Precision with touch input\nconst defaultMargin = browser.supportsTouch || browser.supportsPointerEvent? 20: 10;\n\nconst resize = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n square: false,\n preserveAspectRatio: false,\n axis: 'xy',\n\n // use default margin\n margin: NaN,\n\n // object with props left, right, top, bottom which are\n // true/false values to resize when the pointer is over that edge,\n // CSS selectors to match the handles for each direction\n // or the Elements for each handle\n edges: null,\n\n // a value of 'none' will limit the resize rect to a minimum of 0x0\n // 'negate' will alow the rect to have negative width/height\n // 'reposition' will keep the width/height positive by swapping\n // the top and bottom edges and/or swapping the left and right edges\n invert: 'none',\n },\n\n checker: function (pointer, event, interactable, element, interaction, rect) {\n if (!rect) { return null; }\n\n const page = utils.extend({}, interaction.curCoords.page);\n const options = interactable.options;\n\n if (options.resize.enabled) {\n const resizeOptions = options.resize;\n const resizeEdges = { left: false, right: false, top: false, bottom: false };\n\n // if using resize.edges\n if (utils.is.object(resizeOptions.edges)) {\n for (const edge in resizeEdges) {\n resizeEdges[edge] = checkResizeEdge(edge,\n resizeOptions.edges[edge],\n page,\n interaction._eventTarget,\n element,\n rect,\n resizeOptions.margin || defaultMargin);\n }\n\n resizeEdges.left = resizeEdges.left && !resizeEdges.right;\n resizeEdges.top = resizeEdges.top && !resizeEdges.bottom;\n\n if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) {\n return {\n name: 'resize',\n edges: resizeEdges,\n };\n }\n }\n else {\n const right = options.resize.axis !== 'y' && page.x > (rect.right - defaultMargin);\n const bottom = options.resize.axis !== 'x' && page.y > (rect.bottom - defaultMargin);\n\n if (right || bottom) {\n return {\n name: 'resize',\n axes: (right? 'x' : '') + (bottom? 'y' : ''),\n };\n }\n }\n }\n\n return null;\n },\n\n cursors: (browser.isIe9OrOlder ? {\n x : 'e-resize',\n y : 's-resize',\n xy: 'se-resize',\n\n top : 'n-resize',\n left : 'w-resize',\n bottom : 's-resize',\n right : 'e-resize',\n topleft : 'se-resize',\n bottomright: 'se-resize',\n topright : 'ne-resize',\n bottomleft : 'ne-resize',\n } : {\n x : 'ew-resize',\n y : 'ns-resize',\n xy: 'nwse-resize',\n\n top : 'ns-resize',\n left : 'ew-resize',\n bottom : 'ns-resize',\n right : 'ew-resize',\n topleft : 'nwse-resize',\n bottomright: 'nwse-resize',\n topright : 'nesw-resize',\n bottomleft : 'nesw-resize',\n }),\n\n getCursor: function (action) {\n if (action.axis) {\n return resize.cursors[action.name + action.axis];\n }\n else if (action.edges) {\n let cursorKey = '';\n const edgeNames = ['top', 'bottom', 'left', 'right'];\n\n for (let i = 0; i < 4; i++) {\n if (action.edges[edgeNames[i]]) {\n cursorKey += edgeNames[i];\n }\n }\n\n return resize.cursors[cursorKey];\n }\n },\n};\n\n// resizestart\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'resizestart' || !interaction.prepared.edges) {\n return;\n }\n\n const startRect = interaction.target.getRect(interaction.element);\n const resizeOptions = interaction.target.options.resize;\n\n /*\n * When using the `resizable.square` or `resizable.preserveAspectRatio` options, resizing from one edge\n * will affect another. E.g. with `resizable.square`, resizing to make the right edge larger will make\n * the bottom edge larger by the same amount. We call these 'linked' edges. Any linked edges will depend\n * on the active edges and the edge being interacted with.\n */\n if (resizeOptions.square || resizeOptions.preserveAspectRatio) {\n const linkedEdges = utils.extend({}, interaction.prepared.edges);\n\n linkedEdges.top = linkedEdges.top || (linkedEdges.left && !linkedEdges.bottom);\n linkedEdges.left = linkedEdges.left || (linkedEdges.top && !linkedEdges.right );\n linkedEdges.bottom = linkedEdges.bottom || (linkedEdges.right && !linkedEdges.top );\n linkedEdges.right = linkedEdges.right || (linkedEdges.bottom && !linkedEdges.left );\n\n interaction.prepared._linkedEdges = linkedEdges;\n }\n else {\n interaction.prepared._linkedEdges = null;\n }\n\n // if using `resizable.preserveAspectRatio` option, record aspect ratio at the start of the resize\n if (resizeOptions.preserveAspectRatio) {\n interaction.resizeStartAspectRatio = startRect.width / startRect.height;\n }\n\n interaction.resizeRects = {\n start : startRect,\n current : utils.extend({}, startRect),\n inverted : utils.extend({}, startRect),\n previous : utils.extend({}, startRect),\n delta : {\n left: 0, right : 0, width : 0,\n top : 0, bottom: 0, height: 0,\n },\n };\n\n iEvent.rect = interaction.resizeRects.inverted;\n iEvent.deltaRect = interaction.resizeRects.delta;\n});\n\n// resizemove\nInteractEvent.signals.on('new', function ({ iEvent, phase, interaction }) {\n if (phase !== 'move' || !interaction.prepared.edges) { return; }\n\n const resizeOptions = interaction.target.options.resize;\n const invert = resizeOptions.invert;\n const invertible = invert === 'reposition' || invert === 'negate';\n\n let edges = interaction.prepared.edges;\n\n const start = interaction.resizeRects.start;\n const current = interaction.resizeRects.current;\n const inverted = interaction.resizeRects.inverted;\n const delta = interaction.resizeRects.delta;\n const previous = utils.extend(interaction.resizeRects.previous, inverted);\n const originalEdges = edges;\n\n let dx = iEvent.dx;\n let dy = iEvent.dy;\n\n if (resizeOptions.preserveAspectRatio || resizeOptions.square) {\n // `resize.preserveAspectRatio` takes precedence over `resize.square`\n const startAspectRatio = resizeOptions.preserveAspectRatio\n ? interaction.resizeStartAspectRatio\n : 1;\n\n edges = interaction.prepared._linkedEdges;\n\n if ((originalEdges.left && originalEdges.bottom)\n || (originalEdges.right && originalEdges.top)) {\n dy = -dx / startAspectRatio;\n }\n else if (originalEdges.left || originalEdges.right ) { dy = dx / startAspectRatio; }\n else if (originalEdges.top || originalEdges.bottom) { dx = dy * startAspectRatio; }\n }\n\n // update the 'current' rect without modifications\n if (edges.top ) { current.top += dy; }\n if (edges.bottom) { current.bottom += dy; }\n if (edges.left ) { current.left += dx; }\n if (edges.right ) { current.right += dx; }\n\n if (invertible) {\n // if invertible, copy the current rect\n utils.extend(inverted, current);\n\n if (invert === 'reposition') {\n // swap edge values if necessary to keep width/height positive\n let swap;\n\n if (inverted.top > inverted.bottom) {\n swap = inverted.top;\n\n inverted.top = inverted.bottom;\n inverted.bottom = swap;\n }\n if (inverted.left > inverted.right) {\n swap = inverted.left;\n\n inverted.left = inverted.right;\n inverted.right = swap;\n }\n }\n }\n else {\n // if not invertible, restrict to minimum of 0x0 rect\n inverted.top = Math.min(current.top, start.bottom);\n inverted.bottom = Math.max(current.bottom, start.top);\n inverted.left = Math.min(current.left, start.right);\n inverted.right = Math.max(current.right, start.left);\n }\n\n inverted.width = inverted.right - inverted.left;\n inverted.height = inverted.bottom - inverted.top ;\n\n for (const edge in inverted) {\n delta[edge] = inverted[edge] - previous[edge];\n }\n\n iEvent.edges = interaction.prepared.edges;\n iEvent.rect = inverted;\n iEvent.deltaRect = delta;\n});\n\n/*\\\n * Interactable.resizable\n [ method ]\n *\n * Gets or sets whether resize actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of resize elements\n | var isResizeable = interact('input[type=text]').resizable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on resize events (object makes the Interactable resizable)\n = (object) This Interactable\n | interact(element).resizable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | edges: {\n | top : true, // Use pointer coords to check for resize.\n | left : false, // Disable resizing from left edge.\n | bottom: '.resize-s',// Resize if pointer target matches selector\n | right : handleEl // Resize if pointer target is the given Element\n | },\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height are adjusted at a 1:1 ratio.\n | square: false,\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height maintain the aspect ratio they had when resizing started.\n | preserveAspectRatio: false,\n |\n | // a value of 'none' will limit the resize rect to a minimum of 0x0\n | // 'negate' will allow the rect to have negative width/height\n | // 'reposition' will keep the width/height positive by swapping\n | // the top and bottom edges and/or swapping the left and right edges\n | invert: 'none' || 'negate' || 'reposition'\n |\n | // limit multiple resizes.\n | // See the explanation in the @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n \\*/\nInteractable.prototype.resizable = function (options) {\n if (utils.is.object(options)) {\n this.options.resize.enabled = options.enabled === false? false: true;\n this.setPerAction('resize', options);\n this.setOnEvents('resize', options);\n\n if (/^x$|^y$|^xy$/.test(options.axis)) {\n this.options.resize.axis = options.axis;\n }\n else if (options.axis === null) {\n this.options.resize.axis = defaultOptions.resize.axis;\n }\n\n if (utils.is.bool(options.preserveAspectRatio)) {\n this.options.resize.preserveAspectRatio = options.preserveAspectRatio;\n }\n else if (utils.is.bool(options.square)) {\n this.options.resize.square = options.square;\n }\n\n return this;\n }\n if (utils.is.bool(options)) {\n this.options.resize.enabled = options;\n\n if (!options) {\n this.onresizestart = this.onresizestart = this.onresizeend = null;\n }\n\n return this;\n }\n return this.options.resize;\n};\n\nfunction checkResizeEdge (name, value, page, element, interactableElement, rect, margin) {\n // false, '', undefined, null\n if (!value) { return false; }\n\n // true value, use pointer coords and element rect\n if (value === true) {\n // if dimensions are negative, \"switch\" edges\n const width = utils.is.number(rect.width )? rect.width : rect.right - rect.left;\n const height = utils.is.number(rect.height)? rect.height : rect.bottom - rect.top ;\n\n if (width < 0) {\n if (name === 'left' ) { name = 'right'; }\n else if (name === 'right') { name = 'left' ; }\n }\n if (height < 0) {\n if (name === 'top' ) { name = 'bottom'; }\n else if (name === 'bottom') { name = 'top' ; }\n }\n\n if (name === 'left' ) { return page.x < ((width >= 0? rect.left: rect.right ) + margin); }\n if (name === 'top' ) { return page.y < ((height >= 0? rect.top : rect.bottom) + margin); }\n\n if (name === 'right' ) { return page.x > ((width >= 0? rect.right : rect.left) - margin); }\n if (name === 'bottom') { return page.y > ((height >= 0? rect.bottom: rect.top ) - margin); }\n }\n\n // the remaining checks require an element\n if (!utils.is.element(element)) { return false; }\n\n return utils.is.element(value)\n // the value is an element to use as a resize handle\n ? value === element\n // otherwise check if element matches value as selector\n : utils.matchesUpTo(element, value, interactableElement);\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.resizeAxes = 'xy';\n});\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action }) {\n if (action !== 'resize' || !interaction.resizeAxes) { return; }\n\n const options = interaction.target.options;\n\n if (options.resize.square) {\n if (interaction.resizeAxes === 'y') {\n iEvent.dx = iEvent.dy;\n }\n else {\n iEvent.dy = iEvent.dx;\n }\n iEvent.axes = 'xy';\n }\n else {\n iEvent.axes = interaction.resizeAxes;\n\n if (interaction.resizeAxes === 'x') {\n iEvent.dy = 0;\n }\n else if (interaction.resizeAxes === 'y') {\n iEvent.dx = 0;\n }\n }\n});\n\nactions.resize = resize;\nactions.names.push('resize');\nutils.merge(Interactable.eventTypes, [\n 'resizestart',\n 'resizemove',\n 'resizeinertiastart',\n 'resizeinertiaresume',\n 'resizeend',\n]);\nactions.methodDict.resize = 'resizable';\n\ndefaultOptions.resize = resize.defaults;\n\nmodule.exports = resize;\n","const raf = require('./utils/raf');\nconst getWindow = require('./utils/window').getWindow;\nconst is = require('./utils/is');\nconst domUtils = require('./utils/domUtils');\nconst Interaction = require('./Interaction');\nconst defaultOptions = require('./defaultOptions');\n\nconst autoScroll = {\n defaults: {\n enabled : false,\n container: null, // the item that is scrolled (Window or HTMLElement)\n margin : 60,\n speed : 300, // the scroll speed in pixels per second\n },\n\n interaction: null,\n i: null, // the handle returned by window.setInterval\n x: 0, y: 0, // Direction each pulse is to scroll in\n\n isScrolling: false,\n prevTime: 0,\n\n start: function (interaction) {\n autoScroll.isScrolling = true;\n raf.cancel(autoScroll.i);\n\n autoScroll.interaction = interaction;\n autoScroll.prevTime = new Date().getTime();\n autoScroll.i = raf.request(autoScroll.scroll);\n },\n\n stop: function () {\n autoScroll.isScrolling = false;\n raf.cancel(autoScroll.i);\n },\n\n // scroll the window by the values in scroll.x/y\n scroll: function () {\n const options = autoScroll.interaction.target.options[autoScroll.interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(autoScroll.interaction.element);\n const now = new Date().getTime();\n // change in time in seconds\n const dt = (now - autoScroll.prevTime) / 1000;\n // displacement\n const s = options.speed * dt;\n\n if (s >= 1) {\n if (is.window(container)) {\n container.scrollBy(autoScroll.x * s, autoScroll.y * s);\n }\n else if (container) {\n container.scrollLeft += autoScroll.x * s;\n container.scrollTop += autoScroll.y * s;\n }\n\n autoScroll.prevTime = now;\n }\n\n if (autoScroll.isScrolling) {\n raf.cancel(autoScroll.i);\n autoScroll.i = raf.request(autoScroll.scroll);\n }\n },\n check: function (interactable, actionName) {\n const options = interactable.options;\n\n return options[actionName].autoScroll && options[actionName].autoScroll.enabled;\n },\n onInteractionMove: function ({ interaction, pointer }) {\n if (!(interaction.interacting()\n && autoScroll.check(interaction.target, interaction.prepared.name))) {\n return;\n }\n\n if (interaction.simulation) {\n autoScroll.x = autoScroll.y = 0;\n return;\n }\n\n let top;\n let right;\n let bottom;\n let left;\n\n const options = interaction.target.options[interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(interaction.element);\n\n if (is.window(container)) {\n left = pointer.clientX < autoScroll.margin;\n top = pointer.clientY < autoScroll.margin;\n right = pointer.clientX > container.innerWidth - autoScroll.margin;\n bottom = pointer.clientY > container.innerHeight - autoScroll.margin;\n }\n else {\n const rect = domUtils.getElementClientRect(container);\n\n left = pointer.clientX < rect.left + autoScroll.margin;\n top = pointer.clientY < rect.top + autoScroll.margin;\n right = pointer.clientX > rect.right - autoScroll.margin;\n bottom = pointer.clientY > rect.bottom - autoScroll.margin;\n }\n\n autoScroll.x = (right ? 1: left? -1: 0);\n autoScroll.y = (bottom? 1: top? -1: 0);\n\n if (!autoScroll.isScrolling) {\n // set the autoScroll properties to those of the target\n autoScroll.margin = options.margin;\n autoScroll.speed = options.speed;\n\n autoScroll.start(interaction);\n }\n },\n};\n\nInteraction.signals.on('stop-active', function () {\n autoScroll.stop();\n});\n\nInteraction.signals.on('action-move', autoScroll.onInteractionMove);\n\ndefaultOptions.perAction.autoScroll = autoScroll.defaults;\n\nmodule.exports = autoScroll;\n","const Interactable = require('../Interactable');\nconst actions = require('../actions/base');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.ignoreFrom\n [ method ]\n *\n * If the target of the `mousedown`, `pointerdown` or `touchstart`\n * event or any of it's parents match the given CSS selector or\n * Element, no drag/resize/gesture is started.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to not ignore any elements\n = (string | Element | object) The current ignoreFrom value or this Interactable\n **\n | interact(element, { ignoreFrom: document.getElementById('no-action') });\n | // or\n | interact(element).ignoreFrom('input, textarea, a');\n\\*/\nInteractable.prototype.ignoreFrom = function (newValue) {\n return this._backCompatOption('ignoreFrom', newValue);\n};\n\n/*\\\n * Interactable.allowFrom\n [ method ]\n *\n * A drag/resize/gesture is started only If the target of the\n * `mousedown`, `pointerdown` or `touchstart` event or any of it's\n * parents match the given CSS selector or Element.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to allow from any element\n = (string | Element | object) The current allowFrom value or this Interactable\n **\n | interact(element, { allowFrom: document.getElementById('drag-handle') });\n | // or\n | interact(element).allowFrom('.handle');\n\\*/\nInteractable.prototype.allowFrom = function (newValue) {\n return this._backCompatOption('allowFrom', newValue);\n};\n\nInteractable.prototype.testIgnore = function (ignoreFrom, interactableElement, element) {\n if (!ignoreFrom || !is.element(element)) { return false; }\n\n if (is.string(ignoreFrom)) {\n return domUtils.matchesUpTo(element, ignoreFrom, interactableElement);\n }\n else if (is.element(ignoreFrom)) {\n return domUtils.nodeContains(ignoreFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testAllow = function (allowFrom, interactableElement, element) {\n if (!allowFrom) { return true; }\n\n if (!is.element(element)) { return false; }\n\n if (is.string(allowFrom)) {\n return domUtils.matchesUpTo(element, allowFrom, interactableElement);\n }\n else if (is.element(allowFrom)) {\n return domUtils.nodeContains(allowFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testIgnoreAllow = function (options, interactableElement, eventTarget) {\n return (!this.testIgnore(options.ignoreFrom, interactableElement, eventTarget)\n && this.testAllow(options.allowFrom, interactableElement, eventTarget));\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (event.buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\n","const interact = require('../interact');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst actions = require('../actions/base');\nconst defaultOptions = require('../defaultOptions');\nconst browser = require('../utils/browser');\nconst scope = require('../scope');\nconst utils = require('../utils');\nconst signals = require('../utils/Signals').new();\n\nrequire('./InteractableMethods');\n\nconst autoStart = {\n signals,\n withinInteractionLimit,\n // Allow this many interactions to happen simultaneously\n maxInteractions: Infinity,\n defaults: {\n perAction: {\n manualStart: false,\n max: Infinity,\n maxPerElement: 1,\n allowFrom: null,\n ignoreFrom: null,\n },\n },\n setActionDefaults: function (action) {\n utils.extend(action.defaults, autoStart.defaults.perAction);\n },\n};\n\n// set cursor style on mousedown\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget }) {\n if (interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\n// set cursor style on mousemove\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget }) {\n if (!interaction.mouse\n || interaction.pointerIsDown\n || interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\nInteraction.signals.on('move', function (arg) {\n const { interaction, event } = arg;\n\n if (!interaction.pointerIsDown\n || interaction.interacting()\n || !interaction.pointerWasMoved\n || !interaction.prepared.name) {\n return;\n }\n\n signals.fire('before-start', arg);\n\n const target = interaction.target;\n\n if (interaction.prepared.name && target) {\n // check manualStart and interaction limit\n if (target.options[interaction.prepared.name].manualStart\n || !withinInteractionLimit(target, interaction.element, interaction.prepared)) {\n interaction.stop(event);\n }\n else {\n interaction.start(interaction.prepared, target, interaction.element);\n }\n }\n});\n\n// Check if the current target supports the action.\n// If so, return the validated action. Otherwise, return null\nfunction validateAction (action, interactable, element, eventTarget) {\n if (utils.is.object(action)\n && interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget)\n && interactable.options[action.name].enabled\n && withinInteractionLimit(interactable, element, action)) {\n return action;\n }\n\n return null;\n}\n\nfunction validateSelector (interaction, pointer, event, matches, matchElements, eventTarget) {\n for (let i = 0, len = matches.length; i < len; i++) {\n const match = matches[i];\n const matchElement = matchElements[i];\n const action = validateAction(match.getAction(pointer, event, interaction, matchElement),\n match,\n matchElement,\n eventTarget);\n\n if (action) {\n return {\n action,\n target: match,\n element: matchElement,\n };\n }\n }\n\n return {};\n}\n\nfunction getActionInfo (interaction, pointer, event, eventTarget) {\n let matches = [];\n let matchElements = [];\n\n let element = eventTarget;\n let action = null;\n\n function pushMatches (interactable, selector, context) {\n const elements = (browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined);\n\n if (utils.matchesSelector(element, selector, elements)) {\n\n matches.push(interactable);\n matchElements.push(element);\n }\n }\n\n while (utils.is.element(element)) {\n matches = [];\n matchElements = [];\n\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && (action = validateAction(elementInteractable.getAction(pointer, event, interaction, element, eventTarget),\n elementInteractable,\n element,\n eventTarget))\n && !elementInteractable.options[action.name].manualStart) {\n return {\n element,\n action,\n target: elementInteractable,\n };\n }\n else {\n scope.interactables.forEachSelector(pushMatches, element);\n\n const actionInfo = validateSelector(interaction, pointer, event, matches, matchElements, eventTarget);\n\n if (actionInfo.action\n && !actionInfo.target.options[actionInfo.action.name].manualStart) {\n return actionInfo;\n }\n }\n\n element = utils.parentNode(element);\n }\n\n return {};\n}\n\nfunction prepare (interaction, { action, target, element }) {\n action = action || {};\n\n if (interaction.target && interaction.target.options.styleCursor) {\n interaction.target._doc.documentElement.style.cursor = '';\n }\n\n interaction.target = target;\n interaction.element = element;\n utils.copyAction(interaction.prepared, action);\n\n if (target && target.options.styleCursor) {\n const cursor = action? actions[action.name].getCursor(action) : '';\n interaction.target._doc.documentElement.style.cursor = cursor;\n }\n\n signals.fire('prepared', { interaction: interaction });\n}\n\nInteraction.signals.on('stop', function ({ interaction }) {\n const target = interaction.target;\n\n if (target && target.options.styleCursor) {\n target._doc.documentElement.style.cursor = '';\n }\n});\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (utils.is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (utils.is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n const buttons = event.buttons || ({\n 0: 1,\n 1: 4,\n 3: 8,\n 4: 16,\n })[event.button];\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\nfunction withinInteractionLimit (interactable, element, action) {\n const options = interactable.options;\n const maxActions = options[action.name].max;\n const maxPerElement = options[action.name].maxPerElement;\n let activeInteractions = 0;\n let targetCount = 0;\n let targetElementCount = 0;\n\n // no actions if any of these values == 0\n if (!(maxActions && maxPerElement && autoStart.maxInteractions)) { return; }\n\n for (let i = 0, len = scope.interactions.length; i < len; i++) {\n const interaction = scope.interactions[i];\n const otherAction = interaction.prepared.name;\n\n if (!interaction.interacting()) { continue; }\n\n activeInteractions++;\n\n if (activeInteractions >= autoStart.maxInteractions) {\n return false;\n }\n\n if (interaction.target !== interactable) { continue; }\n\n targetCount += (otherAction === action.name)|0;\n\n if (targetCount >= maxActions) {\n return false;\n }\n\n if (interaction.element === element) {\n targetElementCount++;\n\n if (otherAction !== action.name || targetElementCount >= maxPerElement) {\n return false;\n }\n }\n }\n\n return autoStart.maxInteractions > 0;\n}\n\n/*\\\n * interact.maxInteractions\n [ method ]\n **\n * Returns or sets the maximum number of concurrent interactions allowed.\n * By default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables\n * and elements, you need to enable it in the draggable, resizable and\n * gesturable `'max'` and `'maxPerElement'` options.\n **\n - newValue (number) #optional Any number. newValue <= 0 means no interactions.\n\\*/\ninteract.maxInteractions = function (newValue) {\n if (utils.is.number(newValue)) {\n autoStart.maxInteractions = newValue;\n\n return this;\n }\n\n return autoStart.maxInteractions;\n};\n\nInteractable.settingsMethods.push('styleCursor');\nInteractable.settingsMethods.push('actionChecker');\nInteractable.settingsMethods.push('ignoreFrom');\nInteractable.settingsMethods.push('allowFrom');\n\ndefaultOptions.base.actionChecker = null;\ndefaultOptions.base.styleCursor = true;\n\nutils.extend(defaultOptions.perAction, autoStart.defaults.perAction);\n\nmodule.exports = autoStart;\n","const autoStart = require('./base');\nconst Interaction = require('../Interaction');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.delayTimer = null;\n});\n\nautoStart.signals.on('prepared', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.delayTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.target, interaction.element);\n }, delay);\n }\n});\n\nInteraction.signals.on('move', function ({ interaction, duplicate }) {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.delayTimer);\n }\n});\n\n// prevent regular down->move autoStart\nautoStart.signals.on('before-start', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.prepared.name = null;\n }\n});\n","const autoStart = require('./base');\nconst scope = require('../scope');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\n\nconst { matchesSelector, parentNode } = require('../utils/domUtils');\n\nautoStart.setActionDefaults(require('../actions/drag'));\n\nautoStart.signals.on('before-start', function ({ interaction, eventTarget, dx, dy }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // check if a drag is in the correct axis\n const absX = Math.abs(dx);\n const absY = Math.abs(dy);\n const options = interaction.target.options.drag;\n const startAxis = options.startAxis;\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy');\n\n interaction.prepared.axis = options.lockAxis === 'start'\n ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n : options.lockAxis;\n\n // if the movement isn't in the startAxis of the interactable\n if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) {\n // cancel the prepared action\n interaction.prepared.name = null;\n\n // then try to get a drag from another ineractable\n\n if (!interaction.prepared.name) {\n\n let element = eventTarget;\n\n const getDraggable = function (interactable, selector, context) {\n const elements = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n if (interactable === interaction.target) { return; }\n\n if (!options.manualStart\n && !interactable.testIgnoreAllow(options, element, eventTarget)\n && matchesSelector(element, selector, elements)) {\n\n const action = interactable.getAction(interaction.downPointer,\n interaction.downEvent,\n interaction,\n element);\n\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, interactable)\n && autoStart.validateAction(action, interactable, element, eventTarget)) {\n\n return interactable;\n }\n }\n };\n\n let action = null;\n\n // check all interactables\n while (is.element(element)) {\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && elementInteractable !== interaction.target\n && !elementInteractable.options.drag.manualStart) {\n\n action = elementInteractable.getAction(interaction.downPointer, interaction.downEvent, interaction, element);\n }\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, elementInteractable)) {\n\n interaction.prepared.name = 'drag';\n interaction.target = elementInteractable;\n interaction.element = element;\n break;\n }\n\n const selectorInteractable = scope.interactables.forEachSelector(getDraggable, element);\n\n if (selectorInteractable) {\n interaction.prepared.name = 'drag';\n interaction.target = selectorInteractable;\n interaction.element = element;\n break;\n }\n\n element = parentNode(element);\n }\n }\n }\n});\n\nfunction checkStartAxis (startAxis, interactable) {\n if (!interactable) { return false; }\n\n const thisAxis = interactable.options.drag.startAxis;\n\n return (startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis);\n}\n","require('./base').setActionDefaults(require('../actions/gesture'));\n","require('./base').setActionDefaults(require('../actions/resize'));\n","module.exports = {\n base: {\n accept : null,\n preventDefault: 'auto',\n deltaSource : 'page',\n },\n\n perAction: {\n origin: { x: 0, y: 0 },\n\n // only allow left button by default\n // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n mouseButtons: 1,\n\n inertia: {\n enabled : false,\n resistance : 10, // the lambda in exponential decay\n minSpeed : 100, // target speed must be above this for inertia to start\n endSpeed : 10, // the speed at which inertia is slow enough to stop\n allowResume : true, // allow resuming an action in inertia phase\n smoothEndDuration: 300, // animate to snap/restrict endOnly if there's no inertia\n },\n },\n};\n","/* browser entry point */\n\n// Legacy browser support\nrequire('./legacyBrowsers');\n\n// inertia\nrequire('./inertia');\n\n// modifiers\nrequire('./modifiers/snap');\nrequire('./modifiers/restrict');\n\n// pointerEvents\nrequire('./pointerEvents/base');\nrequire('./pointerEvents/holdRepeat');\nrequire('./pointerEvents/interactableTargets');\n\n// delay\nrequire('./autoStart/delay');\n\n// actions\nrequire('./actions/gesture');\nrequire('./actions/resize');\nrequire('./actions/drag');\nrequire('./actions/drop');\n\n// load these modifiers after resize is loaded\nrequire('./modifiers/snapSize');\nrequire('./modifiers/restrictEdges');\nrequire('./modifiers/restrictSize');\n\n// autoStart actions\nrequire('./autoStart/gesture');\nrequire('./autoStart/resize');\nrequire('./autoStart/drag');\n\n// Interactable preventDefault setting\nrequire('./interactablePreventDefault.js');\n\n// autoScroll\nrequire('./autoScroll');\n\n// export interact\nmodule.exports = require('./interact');\n","const InteractEvent = require('./InteractEvent');\nconst Interaction = require('./Interaction');\nconst modifiers = require('./modifiers');\nconst utils = require('./utils');\nconst animationFrame = require('./utils/raf');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.inertiaStatus = {\n active : false,\n smoothEnd : false,\n allowResume: false,\n\n startEvent: null,\n upCoords : {},\n\n xe: 0, ye: 0,\n sx: 0, sy: 0,\n\n t0: 0,\n vx0: 0, vys: 0,\n duration: 0,\n\n lambda_v0: 0,\n one_ve_v0: 0,\n i : null,\n };\n\n interaction.boundInertiaFrame = () => inertiaFrame .apply(interaction);\n interaction.boundSmoothEndFrame = () => smoothEndFrame.apply(interaction);\n});\n\nInteraction.signals.on('down', function ({ interaction, event, pointer, eventTarget }) {\n const status = interaction.inertiaStatus;\n\n // Check if the down event hits the current inertia target\n if (status.active) {\n let element = eventTarget;\n\n // climb up the DOM tree from the event target\n while (utils.is.element(element)) {\n\n // if interaction element is the current inertia target element\n if (element === interaction.element) {\n // stop inertia\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n\n // update pointers to the down event's coordinates\n interaction.updatePointer(pointer);\n utils.setCoords(interaction.curCoords, interaction.pointers);\n\n // fire appropriate signals\n const signalArg = { interaction };\n Interaction.signals.fire('before-action-move', signalArg);\n Interaction.signals.fire('action-resume' , signalArg);\n\n // fire a reume event\n const resumeEvent = new InteractEvent(interaction,\n event,\n interaction.prepared.name,\n 'inertiaresume',\n interaction.element);\n\n interaction.target.fire(resumeEvent);\n interaction.prevEvent = resumeEvent;\n modifiers.resetStatuses(interaction.modifierStatuses);\n\n utils.copyCoords(interaction.prevCoords, interaction.curCoords);\n break;\n }\n\n element = utils.parentNode(element);\n }\n }\n});\n\nInteraction.signals.on('up', function ({ interaction, event }) {\n const status = interaction.inertiaStatus;\n\n if (!interaction.interacting() || status.active) { return; }\n\n const target = interaction.target;\n const options = target && target.options;\n const inertiaOptions = options && interaction.prepared.name && options[interaction.prepared.name].inertia;\n\n const now = new Date().getTime();\n const statuses = {};\n const page = utils.extend({}, interaction.curCoords.page);\n const pointerSpeed = interaction.pointerDelta.client.speed;\n\n let smoothEnd = false;\n let modifierResult;\n\n // check if inertia should be started\n const inertiaPossible = (inertiaOptions && inertiaOptions.enabled\n && interaction.prepared.name !== 'gesture'\n && event !== status.startEvent);\n\n const inertia = (inertiaPossible\n && (now - interaction.curCoords.timeStamp) < 50\n && pointerSpeed > inertiaOptions.minSpeed\n && pointerSpeed > inertiaOptions.endSpeed);\n\n const modifierArg = {\n interaction,\n pageCoords: page,\n statuses,\n preEnd: true,\n requireEndOnly: true,\n };\n\n // smoothEnd\n if (inertiaPossible && !inertia) {\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n if (modifierResult.shouldMove && modifierResult.locked) {\n smoothEnd = true;\n }\n }\n\n if (!(inertia || smoothEnd)) { return; }\n\n utils.copyCoords(status.upCoords, interaction.curCoords);\n\n interaction.pointers[0] = status.startEvent =\n new InteractEvent(interaction, event, interaction.prepared.name, 'inertiastart', interaction.element);\n\n status.t0 = now;\n\n status.active = true;\n status.allowResume = inertiaOptions.allowResume;\n interaction.simulation = status;\n\n target.fire(status.startEvent);\n\n if (inertia) {\n status.vx0 = interaction.pointerDelta.client.vx;\n status.vy0 = interaction.pointerDelta.client.vy;\n status.v0 = pointerSpeed;\n\n calcInertia(interaction, status);\n\n utils.extend(page, interaction.curCoords.page);\n\n page.x += status.xe;\n page.y += status.ye;\n\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n status.modifiedXe += modifierResult.dx;\n status.modifiedYe += modifierResult.dy;\n\n status.i = animationFrame.request(interaction.boundInertiaFrame);\n }\n else {\n status.smoothEnd = true;\n status.xe = modifierResult.dx;\n status.ye = modifierResult.dy;\n\n status.sx = status.sy = 0;\n\n status.i = animationFrame.request(interaction.boundSmoothEndFrame);\n }\n});\n\nInteraction.signals.on('stop-active', function ({ interaction }) {\n const status = interaction.inertiaStatus;\n\n if (status.active) {\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n }\n});\n\nfunction calcInertia (interaction, status) {\n const inertiaOptions = interaction.target.options[interaction.prepared.name].inertia;\n const lambda = inertiaOptions.resistance;\n const inertiaDur = -Math.log(inertiaOptions.endSpeed / status.v0) / lambda;\n\n status.x0 = interaction.prevEvent.pageX;\n status.y0 = interaction.prevEvent.pageY;\n status.t0 = status.startEvent.timeStamp / 1000;\n status.sx = status.sy = 0;\n\n status.modifiedXe = status.xe = (status.vx0 - inertiaDur) / lambda;\n status.modifiedYe = status.ye = (status.vy0 - inertiaDur) / lambda;\n status.te = inertiaDur;\n\n status.lambda_v0 = lambda / status.v0;\n status.one_ve_v0 = 1 - inertiaOptions.endSpeed / status.v0;\n}\n\nfunction inertiaFrame () {\n updateInertiaCoords(this);\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n\n const status = this.inertiaStatus;\n const options = this.target.options[this.prepared.name].inertia;\n const lambda = options.resistance;\n const t = new Date().getTime() / 1000 - status.t0;\n\n if (t < status.te) {\n\n const progress = 1 - (Math.exp(-lambda * t) - status.lambda_v0) / status.one_ve_v0;\n\n if (status.modifiedXe === status.xe && status.modifiedYe === status.ye) {\n status.sx = status.xe * progress;\n status.sy = status.ye * progress;\n }\n else {\n const quadPoint = utils.getQuadraticCurvePoint(0, 0,\n status.xe,\n status.ye,\n status.modifiedXe,\n status.modifiedYe,\n progress);\n\n status.sx = quadPoint.x;\n status.sy = quadPoint.y;\n }\n\n this.doMove();\n\n status.i = animationFrame.request(this.boundInertiaFrame);\n }\n else {\n status.sx = status.modifiedXe;\n status.sy = status.modifiedYe;\n\n this.doMove();\n this.end(status.startEvent);\n status.active = false;\n this.simulation = null;\n }\n\n utils.copyCoords(this.prevCoords, this.curCoords);\n}\n\nfunction smoothEndFrame () {\n updateInertiaCoords(this);\n\n const status = this.inertiaStatus;\n const t = new Date().getTime() - status.t0;\n const duration = this.target.options[this.prepared.name].inertia.smoothEndDuration;\n\n if (t < duration) {\n status.sx = utils.easeOutQuad(t, 0, status.xe, duration);\n status.sy = utils.easeOutQuad(t, 0, status.ye, duration);\n\n this.pointerMove(status.startEvent, status.startEvent);\n\n status.i = animationFrame.request(this.boundSmoothEndFrame);\n }\n else {\n status.sx = status.xe;\n status.sy = status.ye;\n\n this.pointerMove(status.startEvent, status.startEvent);\n this.end(status.startEvent);\n\n status.smoothEnd =\n status.active = false;\n this.simulation = null;\n }\n}\n\nfunction updateInertiaCoords (interaction) {\n const status = interaction.inertiaStatus;\n\n // return if inertia isn't running\n if (!status.active) { return; }\n\n const pageUp = status.upCoords.page;\n const clientUp = status.upCoords.client;\n\n utils.setCoords(interaction.curCoords, [ {\n pageX : pageUp.x + status.sx,\n pageY : pageUp.y + status.sy,\n clientX: clientUp.x + status.sx,\n clientY: clientUp.y + status.sy,\n } ]);\n}\n","const browser = require('./utils/browser');\nconst events = require('./utils/events');\nconst utils = require('./utils');\nconst scope = require('./scope');\nconst Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\n\nconst globalEvents = {};\n\n/*\\\n * interact\n [ method ]\n *\n * The methods of this variable can be used to set elements as\n * interactables and also to change various default settings.\n *\n * Calling it as a function and passing an element or a valid CSS selector\n * string returns an Interactable object which has various methods to\n * configure it.\n *\n - element (Element | string) The HTML or SVG Element to interact with or CSS selector\n = (object) An @Interactable\n *\n > Usage\n | interact('#draggable').draggable(true);\n |\n | var rectables = interact('rect');\n | rectables\n | .gesturable(true)\n | .on('gesturemove', function (event) {\n | // ...\n | });\n\\*/\nfunction interact (element, options) {\n let interactable = scope.interactables.get(element, options);\n\n if (!interactable) {\n interactable = new Interactable(element, options);\n interactable.events.global = globalEvents;\n }\n\n return interactable;\n}\n\n/*\\\n * interact.isSet\n [ method ]\n *\n * Check if an element has been set\n - element (Element) The Element being searched for\n = (boolean) Indicates if the element or CSS selector was previously passed to interact\n\\*/\ninteract.isSet = function (element, options) {\n return scope.interactables.indexOfElement(element, options && options.context) !== -1;\n};\n\n/*\\\n * interact.on\n [ method ]\n *\n * Adds a global listener for an InteractEvent or adds a DOM event to\n * `document`\n *\n - type (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) interact\n\\*/\ninteract.on = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.on(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.on(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n // if it is an InteractEvent type, add listener to globalEvents\n if (utils.contains(Interactable.eventTypes, type)) {\n // if this type of event was never bound\n if (!globalEvents[type]) {\n globalEvents[type] = [listener];\n }\n else {\n globalEvents[type].push(listener);\n }\n }\n // If non InteractEvent type, addEventListener to document\n else {\n events.add(scope.document, type, listener, { options });\n }\n\n return interact;\n};\n\n/*\\\n * interact.off\n [ method ]\n *\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n - type (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) interact\n \\*/\ninteract.off = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.off(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.off(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n if (!utils.contains(Interactable.eventTypes, type)) {\n events.remove(scope.document, type, listener, options);\n }\n else {\n let index;\n\n if (type in globalEvents\n && (index = utils.indexOf(globalEvents[type], listener)) !== -1) {\n globalEvents[type].splice(index, 1);\n }\n }\n\n return interact;\n};\n\n/*\\\n * interact.debug\n [ method ]\n *\n * Returns an object which exposes internal data\n = (object) An object with properties that outline the current state and expose internal functions and variables\n\\*/\ninteract.debug = function () {\n return scope;\n};\n\n// expose the functions used to calculate multi-touch properties\ninteract.getPointerAverage = utils.pointerAverage;\ninteract.getTouchBBox = utils.touchBBox;\ninteract.getTouchDistance = utils.touchDistance;\ninteract.getTouchAngle = utils.touchAngle;\n\ninteract.getElementRect = utils.getElementRect;\ninteract.getElementClientRect = utils.getElementClientRect;\ninteract.matchesSelector = utils.matchesSelector;\ninteract.closest = utils.closest;\n\n/*\\\n * interact.supportsTouch\n [ method ]\n *\n = (boolean) Whether or not the browser supports touch input\n\\*/\ninteract.supportsTouch = function () {\n return browser.supportsTouch;\n};\n\n/*\\\n * interact.supportsPointerEvent\n [ method ]\n *\n = (boolean) Whether or not the browser supports PointerEvents\n\\*/\ninteract.supportsPointerEvent = function () {\n return browser.supportsPointerEvent;\n};\n\n/*\\\n * interact.stop\n [ method ]\n *\n * Cancels all interactions (end events are not fired)\n *\n - event (Event) An event on which to call preventDefault()\n = (object) interact\n\\*/\ninteract.stop = function (event) {\n for (let i = scope.interactions.length - 1; i >= 0; i--) {\n scope.interactions[i].stop(event);\n }\n\n return interact;\n};\n\n/*\\\n * interact.pointerMoveTolerance\n [ method ]\n * Returns or sets the distance the pointer must be moved before an action\n * sequence occurs. This also affects tolerance for tap events.\n *\n - newValue (number) #optional The movement from the start position must be greater than this value\n = (number | Interactable) The current setting or interact\n\\*/\ninteract.pointerMoveTolerance = function (newValue) {\n if (utils.is.number(newValue)) {\n Interaction.pointerMoveTolerance = newValue;\n\n return this;\n }\n\n return Interaction.pointerMoveTolerance;\n};\n\ninteract.addDocument = scope.addDocument;\ninteract.removeDocument = scope.removeDocument;\n\nscope.interact = interact;\n\nmodule.exports = interact;\n","const Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\nconst scope = require('./scope');\nconst is = require('./utils/is');\nconst events = require('./utils/events');\n\nconst { nodeContains, matchesSelector } = require('./utils/domUtils');\n\n/*\\\n * Interactable.preventDefault\n [ method ]\n *\n * Returns or sets whether to prevent the browser's default behaviour\n * in response to pointer events. Can be set to:\n * - `'always'` to always prevent\n * - `'never'` to never prevent\n * - `'auto'` to let interact.js try to determine what would be best\n *\n - newValue (string) #optional `true`, `false` or `'auto'`\n = (string | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.preventDefault = function (newValue) {\n if (/^(always|never|auto)$/.test(newValue)) {\n this.options.preventDefault = newValue;\n return this;\n }\n\n if (is.bool(newValue)) {\n this.options.preventDefault = newValue? 'always' : 'never';\n return this;\n }\n\n return this.options.preventDefault;\n};\n\nInteractable.prototype.checkAndPreventDefault = function (event) {\n const setting = this.options.preventDefault;\n\n if (setting === 'never') { return; }\n\n if (setting === 'always') {\n event.preventDefault();\n return;\n }\n\n // setting === 'auto'\n\n // don't preventDefault if the browser supports passiveEvents\n // CSS touch-action and user-selecct should be used instead\n if (events.supportsOptions) {\n return;\n }\n\n // don't preventDefault of pointerdown events\n if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) {\n return;\n }\n\n // don't preventDefault on editable elements\n if (is.element(event.target)\n && matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) {\n return;\n }\n\n event.preventDefault();\n};\n\nfunction onInteractionEvent ({ interaction, event }) {\n if (interaction.target) {\n interaction.target.checkAndPreventDefault(event);\n }\n}\n\nfor (const eventSignal of ['down', 'move', 'up', 'cancel']) {\n Interaction.signals.on(eventSignal, onInteractionEvent);\n}\n\n// prevent native HTML5 drag on interact.js target elements\nInteraction.docEvents.dragstart = function preventNativeDrag (event) {\n for (const interaction of scope.interactions) {\n\n if (interaction.element\n && (interaction.element === event.target\n || nodeContains(interaction.element, event.target))) {\n\n interaction.target.checkAndPreventDefault(event);\n return;\n }\n }\n};\n","const scope = require('./scope');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst iFinder = require('./utils/interactionFinder');\nconst pointerEvents = require('./pointerEvents/base');\n\nconst { window } = require('./utils/window');\n\nconst toString = Object.prototype.toString;\n\nif (!window.Array.isArray) {\n window.Array.isArray = function (obj) {\n return toString.call(obj) === '[object Array]';\n };\n}\n\nif (!String.prototype.trim) {\n String.prototype.trim = function () {\n return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n };\n}\n\n// http://www.quirksmode.org/dom/events/click.html\n// >Events leading to dblclick\n//\n// IE8 doesn't fire down event before dblclick.\n// This workaround tries to fire a tap and doubletap after dblclick\nfunction onIE8Dblclick (event) {\n const eventTarget = event.target;\n const interaction = iFinder.search(event, event.type, eventTarget);\n\n if (!interaction) { return; }\n\n if (interaction.prevTap\n && event.clientX === interaction.prevTap.clientX\n && event.clientY === interaction.prevTap.clientY\n && eventTarget === interaction.prevTap.target) {\n\n interaction.downTargets[0] = eventTarget;\n interaction.downTimes [0] = new Date().getTime();\n\n pointerEvents.fire({\n interaction,\n event,\n eventTarget,\n pointer: event,\n type: 'tap',\n });\n }\n}\n\nif (browser.isIE8) {\n const selectFix = function (event) {\n for (const interaction of scope.interactions) {\n if (interaction.interacting()) {\n interaction.target.checkAndPreventDefault(event);\n }\n }\n };\n\n const onDocIE8 = function onDocIE8 ({ doc, win }, signalName) {\n const eventMethod = signalName.indexOf('listen') === 0\n ? events.add : events.remove;\n\n // For IE's lack of Event#preventDefault\n eventMethod(doc, 'selectstart', selectFix);\n\n if (pointerEvents) {\n eventMethod(doc, 'dblclick', onIE8Dblclick);\n }\n };\n\n scope.signals.on('add-document' , onDocIE8);\n scope.signals.on('remove-document', onDocIE8);\n}\n\nmodule.exports = null;\n","const InteractEvent = require('../InteractEvent');\nconst Interaction = require('../Interaction');\nconst extend = require('../utils/extend');\n\nconst modifiers = {\n names: [],\n\n setOffsets: function (arg) {\n const { interaction, pageCoords: page } = arg;\n const { target, element, startOffset } = interaction;\n const rect = target.getRect(element);\n\n if (rect) {\n startOffset.left = page.x - rect.left;\n startOffset.top = page.y - rect.top;\n\n startOffset.right = rect.right - page.x;\n startOffset.bottom = rect.bottom - page.y;\n\n if (!('width' in rect)) { rect.width = rect.right - rect.left; }\n if (!('height' in rect)) { rect.height = rect.bottom - rect.top ; }\n }\n else {\n startOffset.left = startOffset.top = startOffset.right = startOffset.bottom = 0;\n }\n\n arg.rect = rect;\n arg.interactable = target;\n arg.element = element;\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n\n arg.options = target.options[interaction.prepared.name][modifierName];\n\n if (!arg.options) {\n continue;\n }\n\n interaction.modifierOffsets[modifierName] = modifiers[modifierName].setOffset(arg);\n }\n },\n\n setAll: function (arg) {\n const { interaction, statuses, preEnd, requireEndOnly } = arg;\n const coords = extend({}, arg.pageCoords);\n const result = {\n dx: 0,\n dy: 0,\n changed: false,\n locked: false,\n shouldMove: true,\n };\n\n for (const modifierName of modifiers.names) {\n const modifier = modifiers[modifierName];\n const options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!shouldDo(options, preEnd, requireEndOnly)) { continue; }\n\n arg.status = arg.status = statuses[modifierName];\n arg.options = options;\n arg.offset = arg.interaction.modifierOffsets[modifierName];\n\n modifier.set(arg);\n\n if (arg.status.locked) {\n coords.x += arg.status.dx;\n coords.y += arg.status.dy;\n\n result.dx += arg.status.dx;\n result.dy += arg.status.dy;\n\n result.locked = true;\n }\n }\n\n // a move should be fired if:\n // - there are no modifiers enabled,\n // - no modifiers are \"locked\" i.e. have changed the pointer's coordinates, or\n // - the locked coords have changed since the last pointer move\n result.shouldMove = !arg.status || !result.locked || arg.status.changed;\n\n return result;\n },\n\n resetStatuses: function (statuses) {\n for (const modifierName of modifiers.names) {\n const status = statuses[modifierName] || {};\n\n status.dx = status.dy = 0;\n status.modifiedX = status.modifiedY = NaN;\n status.locked = false;\n status.changed = true;\n\n statuses[modifierName] = status;\n }\n\n return statuses;\n },\n\n start: function ({ interaction }, signalName) {\n const arg = {\n interaction,\n pageCoords: (signalName === 'action-resume' ?\n interaction.curCoords : interaction.startCoords).page,\n startOffset: interaction.startOffset,\n statuses: interaction.modifierStatuses,\n preEnd: false,\n requireEndOnly: false,\n };\n\n modifiers.setOffsets(arg);\n modifiers.resetStatuses(arg.statuses);\n\n arg.pageCoords = extend({}, interaction.startCoords.page);\n interaction.modifierResult = modifiers.setAll(arg);\n },\n};\n\nInteraction.signals.on('new', function (interaction) {\n interaction.startOffset = { left: 0, right: 0, top: 0, bottom: 0 };\n interaction.modifierOffsets = {};\n interaction.modifierStatuses = modifiers.resetStatuses({});\n interaction.modifierResult = null;\n});\n\nInteraction.signals.on('action-start' , modifiers.start);\nInteraction.signals.on('action-resume', modifiers.start);\n\nInteraction.signals.on('before-action-move', function ({ interaction, preEnd, interactingBeforeMove }) {\n const modifierResult = modifiers.setAll({\n interaction,\n preEnd,\n pageCoords: interaction.curCoords.page,\n statuses: interaction.modifierStatuses,\n requireEndOnly: false,\n });\n\n // don't fire an action move if a modifier would keep the event in the same\n // cordinates as before\n if (!modifierResult.shouldMove && interactingBeforeMove) {\n interaction._dontFireMove = true;\n }\n\n interaction.modifierResult = modifierResult;\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n for (let i = 0; i < modifiers.names.length; i++) {\n const options = interaction.target.options[interaction.prepared.name][modifiers.names[i]];\n\n // if the endOnly option is true for any modifier\n if (shouldDo(options, true, true)) {\n // fire a move event at the modified coordinates\n interaction.doMove({ event, preEnd: true });\n break;\n }\n }\n});\n\nInteractEvent.signals.on('set-xy', function (arg) {\n const { iEvent, interaction } = arg;\n const modifierArg = extend({}, arg);\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n modifierArg.options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!modifierArg.options) {\n continue;\n }\n\n const modifier = modifiers[modifierName];\n\n modifierArg.status = interaction.modifierStatuses[modifierName];\n\n iEvent[modifierName] = modifier.modifyCoords(modifierArg);\n }\n});\n\nfunction shouldDo (options, preEnd, requireEndOnly) {\n return (options && options.enabled\n && (preEnd || !options.endOnly)\n && (!requireEndOnly || options.endOnly));\n}\n\nmodule.exports = modifiers;\n","const modifiers = require('./index');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst restrict = {\n defaults: {\n enabled : false,\n endOnly : false,\n restriction: null,\n elementRect: null,\n },\n\n setOffset: function ({ rect, startOffset, options }) {\n const elementRect = options && options.elementRect;\n const offset = {};\n\n if (rect && elementRect) {\n offset.left = startOffset.left - (rect.width * elementRect.left);\n offset.top = startOffset.top - (rect.height * elementRect.top);\n\n offset.right = startOffset.right - (rect.width * (1 - elementRect.right));\n offset.bottom = startOffset.bottom - (rect.height * (1 - elementRect.bottom));\n }\n else {\n offset.left = offset.top = offset.right = offset.bottom = 0;\n }\n\n return offset;\n },\n\n set: function ({ pageCoords, interaction, status, options }) {\n if (!options) { return status; }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n\n const restriction = getRestrictionRect(options.restriction, interaction, page);\n\n if (!restriction) { return status; }\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n const rect = restriction;\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n const offset = interaction.modifierOffsets.restrict;\n\n // object is assumed to have\n // x, y, width, height or\n // left, top, right, bottom\n if ('x' in restriction && 'y' in restriction) {\n modifiedX = Math.max(Math.min(rect.x + rect.width - offset.right , page.x), rect.x + offset.left);\n modifiedY = Math.max(Math.min(rect.y + rect.height - offset.bottom, page.y), rect.y + offset.top );\n }\n else {\n modifiedX = Math.max(Math.min(rect.right - offset.right , page.x), rect.left + offset.left);\n modifiedY = Math.max(Math.min(rect.bottom - offset.bottom, page.y), rect.top + offset.top );\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const elementRect = options && options.elementRect;\n\n if (options && options.enabled\n && !(phase === 'start' && elementRect && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n getRestrictionRect,\n};\n\nfunction getRestrictionRect (value, interaction, page) {\n if (utils.is.function(value)) {\n return utils.resolveRectLike(value, interaction.target, interaction.element, [page.x, page.y, interaction]);\n } else {\n return utils.resolveRectLike(value, interaction.target, interaction.element);\n }\n}\n\nmodifiers.restrict = restrict;\nmodifiers.names.push('restrict');\n\ndefaultOptions.perAction.restrict = restrict.defaults;\n\nmodule.exports = restrict;\n","// This module adds the options.resize.restrictEdges setting which sets min and\n// max for the top, left, bottom and right edges of the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictEdges: {\n// inner: { top: 200, left: 200, right: 400, bottom: 400 },\n// outer: { top: 0, left: 0, right: 600, bottom: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst { getRestrictionRect } = require('./restrict');\n\nconst noInner = { top: +Infinity, left: +Infinity, bottom: -Infinity, right: -Infinity };\nconst noOuter = { top: -Infinity, left: -Infinity, bottom: +Infinity, right: +Infinity };\n\nconst restrictEdges = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n offset: null,\n },\n\n setOffset: function ({ interaction, startOffset, options }) {\n if (!options) {\n return utils.extend({}, startOffset);\n }\n\n const offset = getRestrictionRect(options.offset, interaction, interaction.startCoords.page);\n\n if (offset) {\n return {\n top: startOffset.top + offset.y,\n left: startOffset.left + offset.x,\n bottom: startOffset.bottom + offset.y,\n right: startOffset.right + offset.x,\n };\n }\n\n return startOffset;\n },\n\n set: function ({ pageCoords, interaction, status, offset, options }) {\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n const inner = rectUtils.xywhToTlbr(getRestrictionRect(options.inner, interaction, page)) || noInner;\n const outer = rectUtils.xywhToTlbr(getRestrictionRect(options.outer, interaction, page)) || noOuter;\n\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n if (edges.top) {\n modifiedY = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top);\n }\n else if (edges.bottom) {\n modifiedY = Math.max(Math.min(outer.bottom - offset.bottom, page.y), inner.bottom - offset.bottom);\n }\n if (edges.left) {\n modifiedX = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left);\n }\n else if (edges.right) {\n modifiedX = Math.max(Math.min(outer.right - offset.right, page.x), inner.right - offset.right);\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n if (options && options.enabled\n && !(phase === 'start' && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n noInner,\n noOuter,\n getRestrictionRect,\n};\n\nmodifiers.restrictEdges = restrictEdges;\nmodifiers.names.push('restrictEdges');\n\ndefaultOptions.perAction.restrictEdges = restrictEdges.defaults;\nresize.defaults.restrictEdges = restrictEdges.defaults;\n\nmodule.exports = restrictEdges;\n","// This module adds the options.resize.restrictSize setting which sets min and\n// max width and height for the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictSize: {\n// min: { width: -600, height: -600 },\n// max: { width: 600, height: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst restrictEdges = require('./restrictEdges');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst noMin = { width: -Infinity, height: -Infinity };\nconst noMax = { width: +Infinity, height: +Infinity };\n\nconst restrictSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n },\n\n setOffset: function ({ interaction }) {\n return interaction.startOffset;\n },\n\n set: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const rect = rectUtils.xywhToTlbr(interaction.resizeRects.inverted);\n\n const minSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.min, interaction)) || noMin;\n const maxSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.max, interaction)) || noMax;\n\n arg.options = {\n enabled: options.enabled,\n endOnly: options.endOnly,\n inner: utils.extend({}, restrictEdges.noInner),\n outer: utils.extend({}, restrictEdges.noOuter),\n };\n\n if (edges.top) {\n arg.options.inner.top = rect.bottom - minSize.height;\n arg.options.outer.top = rect.bottom - maxSize.height;\n }\n else if (edges.bottom) {\n arg.options.inner.bottom = rect.top + minSize.height;\n arg.options.outer.bottom = rect.top + maxSize.height;\n }\n if (edges.left) {\n arg.options.inner.left = rect.right - minSize.width;\n arg.options.outer.left = rect.right - maxSize.width;\n }\n else if (edges.right) {\n arg.options.inner.right = rect.left + minSize.width;\n arg.options.outer.right = rect.left + maxSize.width;\n }\n\n restrictEdges.set(arg);\n },\n\n modifyCoords: restrictEdges.modifyCoords,\n};\n\nmodifiers.restrictSize = restrictSize;\nmodifiers.names.push('restrictSize');\n\ndefaultOptions.perAction.restrictSize = restrictSize.defaults;\nresize.defaults.restrictSize = restrictSize.defaults;\n\nmodule.exports = restrictSize;\n","const modifiers = require('./index');\nconst interact = require('../interact');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst snap = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n\n relativePoints: null,\n },\n\n setOffset: function ({ interaction, interactable, element, rect, startOffset, options }) {\n const offsets = [];\n const optionsOrigin = utils.rectToXY(utils.resolveRectLike(options.origin));\n const origin = optionsOrigin || utils.getOriginXY(interactable, element, interaction.prepared.name);\n options = options || interactable.options[interaction.prepared.name].snap || {};\n\n let snapOffset;\n\n if (options.offset === 'startCoords') {\n snapOffset = {\n x: interaction.startCoords.page.x - origin.x,\n y: interaction.startCoords.page.y - origin.y,\n };\n }\n else {\n const offsetRect = utils.resolveRectLike(options.offset, interactable, element, [interaction]);\n\n snapOffset = utils.rectToXY(offsetRect) || { x: 0, y: 0 };\n }\n\n if (rect && options.relativePoints && options.relativePoints.length) {\n for (const { x: relativeX, y: relativeY } of options.relativePoints) {\n offsets.push({\n x: startOffset.left - (rect.width * relativeX) + snapOffset.x,\n y: startOffset.top - (rect.height * relativeY) + snapOffset.y,\n });\n }\n }\n else {\n offsets.push(snapOffset);\n }\n\n return offsets;\n },\n\n set: function ({ interaction, pageCoords, status, options, offset: offsets }) {\n const targets = [];\n let target;\n let page;\n let i;\n\n if (status.useStatusXY) {\n page = { x: status.x, y: status.y };\n }\n else {\n const origin = utils.getOriginXY(interaction.target, interaction.element, interaction.prepared.name);\n\n page = utils.extend({}, pageCoords);\n\n page.x -= origin.x;\n page.y -= origin.y;\n }\n\n status.realX = page.x;\n status.realY = page.y;\n\n let len = options.targets? options.targets.length : 0;\n\n for (const { x: offsetX, y: offsetY } of offsets) {\n const relativeX = page.x - offsetX;\n const relativeY = page.y - offsetY;\n\n for (const snapTarget of options.targets) {\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n targets.push({\n x: utils.is.number(target.x) ? (target.x + offsetX) : relativeX,\n y: utils.is.number(target.y) ? (target.y + offsetY) : relativeY,\n\n range: utils.is.number(target.range)? target.range: options.range,\n });\n }\n }\n\n const closest = {\n target: null,\n inRange: false,\n distance: 0,\n range: 0,\n dx: 0,\n dy: 0,\n };\n\n for (i = 0, len = targets.length; i < len; i++) {\n target = targets[i];\n\n const range = target.range;\n const dx = target.x - page.x;\n const dy = target.y - page.y;\n const distance = utils.hypot(dx, dy);\n let inRange = distance <= range;\n\n // Infinite targets count as being out of range\n // compared to non infinite ones that are in range\n if (range === Infinity && closest.inRange && closest.range !== Infinity) {\n inRange = false;\n }\n\n if (!closest.target || (inRange\n // is the closest target in range?\n ? (closest.inRange && range !== Infinity\n // the pointer is relatively deeper in this target\n ? distance / range < closest.distance / closest.range\n // this target has Infinite range and the closest doesn't\n : (range === Infinity && closest.range !== Infinity)\n // OR this target is closer that the previous closest\n || distance < closest.distance)\n // The other is not in range and the pointer is closer to this target\n : (!closest.inRange && distance < closest.distance))) {\n\n closest.target = target;\n closest.distance = distance;\n closest.range = range;\n closest.inRange = inRange;\n closest.dx = dx;\n closest.dy = dy;\n\n status.range = range;\n }\n }\n\n let snapChanged;\n\n if (closest.target) {\n snapChanged = (status.modifiedX !== closest.target.x || status.modifiedY !== closest.target.y);\n\n status.modifiedX = closest.target.x;\n status.modifiedY = closest.target.y;\n }\n else {\n snapChanged = true;\n\n status.modifiedX = NaN;\n status.modifiedY = NaN;\n }\n\n status.dx = closest.dx;\n status.dy = closest.dy;\n\n status.changed = (snapChanged || (closest.inRange && !status.locked));\n status.locked = closest.inRange;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const relativePoints = options && options.relativePoints;\n\n if (options && options.enabled\n && !(phase === 'start' && relativePoints && relativePoints.length)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n }\n\n return {\n range : status.range,\n locked : status.locked,\n x : status.modifiedX,\n y : status.modifiedY,\n realX : status.realX,\n realY : status.realY,\n dx : status.dx,\n dy : status.dy,\n };\n }\n },\n};\n\ninteract.createSnapGrid = function (grid) {\n return function (x, y) {\n const limits = grid.limits || {\n left : -Infinity,\n right : Infinity,\n top : -Infinity,\n bottom: Infinity,\n };\n let offsetX = 0;\n let offsetY = 0;\n\n if (utils.is.object(grid.offset)) {\n offsetX = grid.offset.x;\n offsetY = grid.offset.y;\n }\n\n const gridx = Math.round((x - offsetX) / grid.x);\n const gridy = Math.round((y - offsetY) / grid.y);\n\n const newX = Math.max(limits.left, Math.min(limits.right , gridx * grid.x + offsetX));\n const newY = Math.max(limits.top , Math.min(limits.bottom, gridy * grid.y + offsetY));\n\n return {\n x: newX,\n y: newY,\n range: grid.range,\n };\n };\n};\n\nmodifiers.snap = snap;\nmodifiers.names.push('snap');\n\ndefaultOptions.perAction.snap = snap.defaults;\n\nmodule.exports = snap;\n","// This module allows snapping of the size of targets during resize\n// interactions.\n\nconst modifiers = require('./index');\nconst snap = require('./snap');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\nconst utils = require('../utils/');\n\nconst snapSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n },\n\n setOffset: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.edges;\n\n if (!edges) { return; }\n\n arg.options = {\n relativePoints: [{\n x: edges.left? 0 : 1,\n y: edges.top ? 0 : 1,\n }],\n origin: { x: 0, y: 0 },\n offset: 'self',\n range: options.range,\n };\n\n const offsets = snap.setOffset(arg);\n arg.options = options;\n\n return offsets;\n },\n\n set: function (arg) {\n const { interaction, options, offset, pageCoords } = arg;\n const page = utils.extend({}, pageCoords);\n const relativeX = page.x - offset[0].x;\n const relativeY = page.y - offset[0].y;\n\n arg.options = utils.extend({}, options);\n arg.options.targets = [];\n\n for (const snapTarget of options.targets) {\n let target;\n\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n if ('width' in target && 'height' in target) {\n target.x = target.width;\n target.y = target.height;\n }\n\n arg.options.targets.push(target);\n }\n\n snap.set(arg);\n },\n\n modifyCoords: function (arg) {\n const { options } = arg;\n\n arg.options = utils.extend({}, options);\n arg.options.enabled = options.enabled;\n arg.options.relativePoints = [null];\n\n snap.modifyCoords(arg);\n },\n};\n\nmodifiers.snapSize = snapSize;\nmodifiers.names.push('snapSize');\n\ndefaultOptions.perAction.snapSize = snapSize.defaults;\nresize.defaults.snapSize = snapSize.defaults;\n\nmodule.exports = snapSize;\n","const pointerUtils = require('../utils/pointerUtils');\n\nmodule.exports = class PointerEvent {\n constructor (type, pointer, event, eventTarget, interaction) {\n pointerUtils.pointerExtend(this, event);\n\n if (event !== pointer) {\n pointerUtils.pointerExtend(this, pointer);\n }\n\n this.interaction = interaction;\n\n this.timeStamp = new Date().getTime();\n this.originalEvent = event;\n this.type = type;\n this.pointerId = pointerUtils.getPointerId(pointer);\n this.pointerType = pointerUtils.getPointerType(pointer, interaction);\n this.target = eventTarget;\n this.currentTarget = null;\n\n if (type === 'tap') {\n const pointerIndex = interaction.getPointerIndex(pointer);\n this.dt = this.timeStamp - interaction.downTimes[pointerIndex];\n\n const interval = this.timeStamp - interaction.tapTime;\n\n this.double = !!(interaction.prevTap\n && interaction.prevTap.type !== 'doubletap'\n && interaction.prevTap.target === this.target\n && interval < 500);\n }\n else if (type === 'doubletap') {\n this.dt = pointer.timeStamp - interaction.tapTime;\n }\n }\n\n subtractOrigin ({ x: originX, y: originY }) {\n this.pageX -= originX;\n this.pageY -= originY;\n this.clientX -= originX;\n this.clientY -= originY;\n\n return this;\n }\n\n addOrigin ({ x: originX, y: originY }) {\n this.pageX += originX;\n this.pageY += originY;\n this.clientX += originX;\n this.clientY += originY;\n\n return this;\n }\n\n preventDefault () {\n this.originalEvent.preventDefault();\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n};\n","const PointerEvent = require('./PointerEvent');\nconst Interaction = require('../Interaction');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst defaults = require('../defaultOptions');\nconst signals = require('../utils/Signals').new();\nconst { filter } = require('../utils/arr');\n\nconst simpleSignals = [ 'down', 'up', 'cancel' ];\nconst simpleEvents = [ 'down', 'up', 'cancel' ];\n\nconst pointerEvents = {\n PointerEvent,\n fire,\n collectEventTargets,\n signals,\n defaults: {\n holdDuration: 600,\n ignoreFrom : null,\n allowFrom : null,\n origin : { x: 0, y: 0 },\n },\n types: [\n 'down',\n 'move',\n 'up',\n 'cancel',\n 'tap',\n 'doubletap',\n 'hold',\n ],\n};\n\nfunction fire (arg) {\n const {\n interaction, pointer, event, eventTarget,\n type = arg.pointerEvent.type,\n targets = collectEventTargets(arg),\n pointerEvent = new PointerEvent(type, pointer, event, eventTarget, interaction),\n } = arg;\n\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n targets,\n type,\n pointerEvent,\n };\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n\n for (const prop in target.props || {}) {\n pointerEvent[prop] = target.props[prop];\n }\n\n const origin = utils.getOriginXY(target.eventable, target.element);\n\n pointerEvent.subtractOrigin(origin);\n pointerEvent.eventable = target.eventable;\n pointerEvent.currentTarget = target.element;\n\n target.eventable.fire(pointerEvent);\n\n pointerEvent.addOrigin(origin);\n\n if (pointerEvent.immediatePropagationStopped\n || (pointerEvent.propagationStopped\n && (i + 1) < targets.length && targets[i + 1].element !== pointerEvent.currentTarget)) {\n break;\n }\n }\n\n signals.fire('fired', signalArg);\n\n if (type === 'tap') {\n // if pointerEvent should make a double tap, create and fire a doubletap\n // PointerEvent and use that as the prevTap\n const prevTap = pointerEvent.double\n ? fire({\n interaction, pointer, event, eventTarget,\n type: 'doubletap',\n })\n : pointerEvent;\n\n interaction.prevTap = prevTap;\n interaction.tapTime = prevTap.timeStamp;\n }\n\n return pointerEvent;\n}\n\nfunction collectEventTargets ({ interaction, pointer, event, eventTarget, type }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n // do not fire a tap event if the pointer was moved before being lifted\n if (type === 'tap' && (interaction.pointerWasMoved\n // or if the pointerup target is different to the pointerdown target\n || !(interaction.downTargets[pointerIndex] && interaction.downTargets[pointerIndex] === eventTarget))) {\n return [];\n }\n\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n path,\n targets: [],\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (type === 'hold') {\n signalArg.targets = filter(signalArg.targets, target =>\n target.eventable.options.holdDuration === interaction.holdTimers[pointerIndex].duration);\n }\n\n return signalArg.targets;\n}\n\nInteraction.signals.on('update-pointer-down', function ({ interaction, pointerIndex }) {\n interaction.holdTimers[pointerIndex] = { duration: Infinity, timeout: null };\n});\n\nInteraction.signals.on('remove-pointer', function ({ interaction, pointerIndex }) {\n interaction.holdTimers.splice(pointerIndex, 1);\n});\n\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget, duplicateMove }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n if (!duplicateMove && (!interaction.pointerIsDown || interaction.pointerWasMoved)) {\n if (interaction.pointerIsDown) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n\n fire({\n interaction, pointer, event, eventTarget,\n type: 'move',\n });\n }\n});\n\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget, pointerIndex }) {\n // copy event to be used in timeout for IE8\n const eventCopy = browser.isIE8? utils.extend({}, event) : event;\n\n const timer = interaction.holdTimers[pointerIndex];\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'hold',\n targets: [],\n path,\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (!signalArg.targets.length) { return; }\n\n let minDuration = Infinity;\n\n for (let i = 0; i < signalArg.targets.length; i++) {\n const target = signalArg.targets[i];\n const holdDuration = target.eventable.options.holdDuration;\n\n if (holdDuration < minDuration) {\n minDuration = holdDuration;\n }\n }\n\n timer.duration = minDuration;\n timer.timeout = setTimeout(function () {\n fire({\n interaction, eventCopy, eventTarget,\n pointer: browser.isIE8? eventCopy : pointer,\n type: 'hold',\n });\n }, minDuration);\n});\n\nInteraction.signals.on('up', ({ interaction, pointer, event, eventTarget }) => {\n if (!interaction.pointerWasMoved) {\n fire({ interaction, eventTarget, pointer, event, type: 'tap' });\n }\n});\n\n['up', 'cancel'].forEach(function (signalName) {\n Interaction.signals.on(signalName, function ({ interaction, pointerIndex }) {\n if (interaction.holdTimers[pointerIndex]) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n });\n});\n\nfunction createSignalListener (type) {\n return function ({ interaction, pointer, event, eventTarget }) {\n fire({ interaction, eventTarget, pointer, event, type });\n };\n}\n\nfor (let i = 0; i < simpleSignals.length; i++) {\n Interaction.signals.on(simpleSignals[i], createSignalListener(simpleEvents[i]));\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.prevTap = null; // the most recent tap event on this interaction\n interaction.tapTime = 0; // time of the most recent tap event\n interaction.holdTimers = []; // [{ duration, timeout }]\n});\n\ndefaults.pointerEvents = pointerEvents.defaults;\nmodule.exports = pointerEvents;\n","const pointerEvents = require('./base');\nconst Interaction = require('../Interaction');\n\npointerEvents.signals.on('new', onNew);\npointerEvents.signals.on('fired', onFired);\n\nfor (const signal of ['move', 'up', 'cancel', 'endall']) {\n Interaction.signals.on(signal, endHoldRepeat);\n}\n\nfunction onNew ({ pointerEvent }) {\n if (pointerEvent.type !== 'hold') { return; }\n\n pointerEvent.count = (pointerEvent.count || 0) + 1;\n}\n\nfunction onFired ({ interaction, pointerEvent, eventTarget, targets }) {\n if (pointerEvent.type !== 'hold' || !targets.length) { return; }\n\n // get the repeat interval from the first eventable\n const interval = targets[0].eventable.options.holdRepeatInterval;\n\n // don't repeat if the interval is 0 or less\n if (interval <= 0) { return; }\n\n // set a timeout to fire the holdrepeat event\n interaction.holdIntervalHandle = setTimeout(function () {\n pointerEvents.fire({\n interaction,\n eventTarget,\n type: 'hold',\n pointer: pointerEvent,\n event: pointerEvent,\n });\n }, interval);\n}\n\nfunction endHoldRepeat ({ interaction }) {\n // set the interaction's holdStopTime property\n // to stop further holdRepeat events\n if (interaction.holdIntervalHandle) {\n clearInterval(interaction.holdIntervalHandle);\n interaction.holdIntervalHandle = null;\n }\n}\n\n// don't repeat by default\npointerEvents.defaults.holdRepeatInterval = 0;\npointerEvents.types.push('holdrepeat');\n\nmodule.exports = {\n onNew,\n onFired,\n endHoldRepeat,\n};\n","const pointerEvents = require('./base');\nconst Interactable = require('../Interactable');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\nconst scope = require('../scope');\nconst extend = require('../utils/extend');\nconst { merge } = require('../utils/arr');\n\npointerEvents.signals.on('collect-targets', function ({ targets, element, type, eventTarget }) {\n function collectSelectors (interactable, selector, context) {\n const els = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && is.element(element)\n && domUtils.matchesSelector(element, selector, els)\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n const interactable = scope.interactables.get(element);\n\n if (interactable) {\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n scope.interactables.forEachSelector(collectSelectors, element);\n});\n\nInteractable.signals.on('new', function ({ interactable }) {\n interactable.events.getRect = function (element) {\n return interactable.getRect(element);\n };\n});\n\nInteractable.signals.on('set', function ({ interactable, options }) {\n extend(interactable.events.options, pointerEvents.defaults);\n extend(interactable.events.options, options);\n});\n\nmerge(Interactable.eventTypes, pointerEvents.types);\n\nInteractable.prototype.pointerEvents = function (options) {\n extend(this.events.options, options);\n\n return this;\n};\n\nconst __backCompatOption = Interactable.prototype._backCompatOption;\n\nInteractable.prototype._backCompatOption = function (optionName, newValue) {\n const ret = __backCompatOption.call(this, optionName, newValue);\n\n if (ret === this) {\n this.events.options[optionName] = newValue;\n }\n\n return ret;\n};\n\nInteractable.settingsMethods.push('pointerEvents');\n","const utils = require('./utils');\nconst events = require('./utils/events');\nconst signals = require('./utils/Signals').new();\n\nconst scope = {\n signals,\n events,\n utils,\n\n // main document\n document: require('./utils/domObjects').document,\n // all documents being listened to\n documents: [],\n\n addDocument: function (doc, win) {\n // do nothing if document is already known\n if (utils.contains(scope.documents, doc)) { return false; }\n\n win = win || scope.getWindow(doc);\n\n scope.documents.push(doc);\n events.documents.push(doc);\n\n // don't add an unload event for the main document\n // so that the page may be cached in browser history\n if (doc !== scope.document) {\n events.add(win, 'unload', scope.onWindowUnload);\n }\n\n signals.fire('add-document', { doc, win });\n },\n\n removeDocument: function (doc, win) {\n const index = utils.indexOf(scope.documents, doc);\n\n win = win || scope.getWindow(doc);\n\n events.remove(win, 'unload', scope.onWindowUnload);\n\n scope.documents.splice(index, 1);\n events.documents.splice(index, 1);\n\n signals.fire('remove-document', { win, doc });\n },\n\n onWindowUnload: function () {\n scope.removeDocument(this.document, this);\n },\n};\n\nmodule.exports = scope;\n","const { indexOf } = require('./arr');\n\nclass Signals {\n constructor () {\n this.listeners = {\n // signalName: [listeners],\n };\n }\n\n on (name, listener) {\n if (!this.listeners[name]) {\n this.listeners[name] = [listener];\n return;\n }\n\n this.listeners[name].push(listener);\n }\n\n off (name, listener) {\n if (!this.listeners[name]) { return; }\n\n const index = indexOf(this.listeners[name], listener);\n\n if (index !== -1) {\n this.listeners[name].splice(index, 1);\n }\n }\n\n fire (name, arg) {\n const targetListeners = this.listeners[name];\n\n if (!targetListeners) { return; }\n\n for (let i = 0; i < targetListeners.length; i++) {\n if (targetListeners[i](arg, name) === false) {\n return;\n }\n }\n }\n}\n\nSignals.new = function () {\n return new Signals();\n};\n\nmodule.exports = Signals;\n","function indexOf (array, target) {\n for (let i = 0, len = array.length; i < len; i++) {\n if (array[i] === target) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction contains (array, target) {\n return indexOf(array, target) !== -1;\n}\n\nfunction merge (target, source) {\n for (let i = 0; i < source.length; i++) {\n target.push(source[i]);\n }\n\n return target;\n}\n\nfunction filter (array, test) {\n const result = [];\n\n for (let i = 0; i < array.length; i++) {\n if (test(array[i])) {\n result.push(array[i]);\n }\n }\n\n return result;\n}\n\nmodule.exports = {\n indexOf,\n contains,\n merge,\n filter,\n};\n","const { window } = require('./window');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst Element = domObjects.Element;\nconst navigator = window.navigator;\n\nconst browser = {\n // Does the browser support touch input?\n supportsTouch: !!(('ontouchstart' in window) || is.function(window.DocumentTouch)\n && domObjects.document instanceof window.DocumentTouch),\n\n // Does the browser support PointerEvents\n supportsPointerEvent: !!domObjects.PointerEvent,\n\n isIE8: ('attachEvent' in window) && !('addEventListener' in window),\n\n // Opera Mobile must be handled differently\n isOperaMobile: (navigator.appName === 'Opera'\n && browser.supportsTouch\n && navigator.userAgent.match('Presto')),\n\n // scrolling doesn't change the result of getClientRects on iOS 7\n isIOS7: (/iP(hone|od|ad)/.test(navigator.platform)\n && /OS 7[^\\d]/.test(navigator.appVersion)),\n\n isIe9OrOlder: /MSIE (8|9)/.test(navigator.userAgent),\n\n // prefix matchesSelector\n prefixedMatchesSelector: 'matches' in Element.prototype\n ? 'matches': 'webkitMatchesSelector' in Element.prototype\n ? 'webkitMatchesSelector': 'mozMatchesSelector' in Element.prototype\n ? 'mozMatchesSelector': 'oMatchesSelector' in Element.prototype\n ? 'oMatchesSelector': 'msMatchesSelector',\n\n useMatchesSelectorPolyfill: false,\n\n pEventTypes: (domObjects.PointerEvent\n ? (domObjects.PointerEvent === window.MSPointerEvent\n ? {\n up: 'MSPointerUp',\n down: 'MSPointerDown',\n over: 'mouseover',\n out: 'mouseout',\n move: 'MSPointerMove',\n cancel: 'MSPointerCancel',\n }\n : {\n up: 'pointerup',\n down: 'pointerdown',\n over: 'pointerover',\n out: 'pointerout',\n move: 'pointermove',\n cancel: 'pointercancel',\n })\n : null),\n\n // because Webkit and Opera still use 'mousewheel' event type\n wheelEvent: 'onmousewheel' in domObjects.document? 'mousewheel': 'wheel',\n\n};\n\nbrowser.useMatchesSelectorPolyfill = !is.function(Element.prototype[browser.prefixedMatchesSelector]);\n\nmodule.exports = browser;\n","const domObjects = {};\nconst win = require('./window').window;\n\nfunction blank () {}\n\ndomObjects.document = win.document;\ndomObjects.DocumentFragment = win.DocumentFragment || blank;\ndomObjects.SVGElement = win.SVGElement || blank;\ndomObjects.SVGSVGElement = win.SVGSVGElement || blank;\ndomObjects.SVGElementInstance = win.SVGElementInstance || blank;\ndomObjects.Element = win.Element || blank;\ndomObjects.HTMLElement = win.HTMLElement || domObjects.Element;\n\ndomObjects.Event = win.Event;\ndomObjects.Touch = win.Touch || blank;\ndomObjects.PointerEvent = (win.PointerEvent || win.MSPointerEvent);\n\nmodule.exports = domObjects;\n","const win = require('./window');\nconst browser = require('./browser');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst domUtils = {\n nodeContains: function (parent, child) {\n while (child) {\n if (child === parent) {\n return true;\n }\n\n child = child.parentNode;\n }\n\n return false;\n },\n\n closest: function (element, selector) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) { return element; }\n\n element = domUtils.parentNode(element);\n }\n\n return null;\n },\n\n parentNode: function (node) {\n let parent = node.parentNode;\n\n if (is.docFrag(parent)) {\n // skip past #shado-root fragments\n while ((parent = parent.host) && is.docFrag(parent)) {\n continue;\n }\n\n return parent;\n }\n\n return parent;\n },\n\n // taken from http://tanalin.com/en/blog/2012/12/matches-selector-ie8/ and modified\n matchesSelectorPolyfill: browser.useMatchesSelectorPolyfill\n ? function (element, selector, elems) {\n elems = elems || element.parentNode.querySelectorAll(selector);\n\n for (let i = 0, len = elems.length; i < len; i++) {\n if (elems[i] === element) {\n return true;\n }\n }\n\n return false;\n }\n : null,\n\n matchesSelector: function (element, selector, nodeList) {\n if (browser.useMatchesSelectorPolyfill) {\n return domUtils.matchesSelectorPolyfill(element, selector, nodeList);\n }\n\n // remove /deep/ from selectors if shadowDOM polyfill is used\n if (win.window !== win.realWindow) {\n selector = selector.replace(/\\/deep\\//g, ' ');\n }\n\n return element[browser.prefixedMatchesSelector](selector);\n },\n\n // Test for the element that's \"above\" all other qualifiers\n indexOfDeepestElement: function (elements) {\n let deepestZoneParents = [];\n let dropzoneParents = [];\n let dropzone;\n let deepestZone = elements[0];\n let index = deepestZone? 0: -1;\n let parent;\n let child;\n let i;\n let n;\n\n for (i = 1; i < elements.length; i++) {\n dropzone = elements[i];\n\n // an element might belong to multiple selector dropzones\n if (!dropzone || dropzone === deepestZone) {\n continue;\n }\n\n if (!deepestZone) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n // check if the deepest or current are document.documentElement or document.rootElement\n // - if the current dropzone is, do nothing and continue\n if (dropzone.parentNode === dropzone.ownerDocument) {\n continue;\n }\n // - if deepest is, update with the current dropzone and continue to next\n else if (deepestZone.parentNode === dropzone.ownerDocument) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n if (!deepestZoneParents.length) {\n parent = deepestZone;\n while (parent.parentNode && parent.parentNode !== parent.ownerDocument) {\n deepestZoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n }\n\n // if this element is an svg element and the current deepest is\n // an HTMLElement\n if (deepestZone instanceof domObjects.HTMLElement\n && dropzone instanceof domObjects.SVGElement\n && !(dropzone instanceof domObjects.SVGSVGElement)) {\n\n if (dropzone === deepestZone.parentNode) {\n continue;\n }\n\n parent = dropzone.ownerSVGElement;\n }\n else {\n parent = dropzone;\n }\n\n dropzoneParents = [];\n\n while (parent.parentNode !== parent.ownerDocument) {\n dropzoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n\n n = 0;\n\n // get (position of last common ancestor) + 1\n while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) {\n n++;\n }\n\n const parents = [\n dropzoneParents[n - 1],\n dropzoneParents[n],\n deepestZoneParents[n],\n ];\n\n child = parents[0].lastChild;\n\n while (child) {\n if (child === parents[1]) {\n deepestZone = dropzone;\n index = i;\n deepestZoneParents = [];\n\n break;\n }\n else if (child === parents[2]) {\n break;\n }\n\n child = child.previousSibling;\n }\n }\n\n return index;\n },\n\n matchesUpTo: function (element, selector, limit) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) {\n return true;\n }\n\n element = domUtils.parentNode(element);\n\n if (element === limit) {\n return domUtils.matchesSelector(element, selector);\n }\n }\n\n return false;\n },\n\n getActualElement: function (element) {\n return (element instanceof domObjects.SVGElementInstance\n ? element.correspondingUseElement\n : element);\n },\n\n getScrollXY: function (relevantWindow) {\n relevantWindow = relevantWindow || win.window;\n return {\n x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft,\n y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop,\n };\n },\n\n getElementClientRect: function (element) {\n const clientRect = (element instanceof domObjects.SVGElement\n ? element.getBoundingClientRect()\n : element.getClientRects()[0]);\n\n return clientRect && {\n left : clientRect.left,\n right : clientRect.right,\n top : clientRect.top,\n bottom: clientRect.bottom,\n width : clientRect.width || clientRect.right - clientRect.left,\n height: clientRect.height || clientRect.bottom - clientRect.top,\n };\n },\n\n getElementRect: function (element) {\n const clientRect = domUtils.getElementClientRect(element);\n\n if (!browser.isIOS7 && clientRect) {\n const scroll = domUtils.getScrollXY(win.getWindow(element));\n\n clientRect.left += scroll.x;\n clientRect.right += scroll.x;\n clientRect.top += scroll.y;\n clientRect.bottom += scroll.y;\n }\n\n return clientRect;\n },\n\n getPath: function (element) {\n const path = [];\n\n while (element) {\n path.push(element);\n element = domUtils.parentNode(element);\n }\n\n return path;\n },\n\n trySelector: value => {\n if (!is.string(value)) { return false; }\n\n // an exception will be raised if it is invalid\n domObjects.document.querySelector(value);\n return true;\n },\n};\n\nmodule.exports = domUtils;\n","const is = require('./is');\nconst domUtils = require('./domUtils');\nconst pExtend = require('./pointerExtend');\n\nconst { window, getWindow } = require('./window');\nconst { indexOf, contains } = require('./arr');\n\nconst useAttachEvent = ('attachEvent' in window) && !('addEventListener' in window);\nconst addEvent = useAttachEvent? 'attachEvent': 'addEventListener';\nconst removeEvent = useAttachEvent? 'detachEvent': 'removeEventListener';\nconst on = useAttachEvent? 'on': '';\n\nconst elements = [];\nconst targets = [];\nconst attachedListeners = [];\n\n// {\n// type: {\n// selectors: ['selector', ...],\n// contexts : [document, ...],\n// listeners: [[listener, capture, passive], ...]\n// }\n// }\nconst delegatedEvents = {};\n\nconst documents = [];\n\nconst supportsOptions = !useAttachEvent && (() => {\n let supported = false;\n\n window.document.createElement('div').addEventListener('test', null, {\n get capture () { supported = true; },\n });\n\n return supported;\n})();\n\nfunction add (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n let elementIndex = indexOf(elements, element);\n let target = targets[elementIndex];\n\n if (!target) {\n target = {\n events: {},\n typeCount: 0,\n };\n\n elementIndex = elements.push(element) - 1;\n targets.push(target);\n\n attachedListeners.push(useAttachEvent\n ? {\n supplied: [],\n wrapped : [],\n useCount: [],\n }\n : null);\n }\n\n if (!target.events[type]) {\n target.events[type] = [];\n target.typeCount++;\n }\n\n if (!contains(target.events[type], listener)) {\n let ret;\n\n if (useAttachEvent) {\n const { supplied, wrapped, useCount } = attachedListeners[elementIndex];\n const listenerIndex = indexOf(supplied, listener);\n\n const wrappedListener = wrapped[listenerIndex] || function (event) {\n if (!event.immediatePropagationStopped) {\n event.target = event.srcElement;\n event.currentTarget = element;\n\n event.preventDefault = event.preventDefault || preventDef;\n event.stopPropagation = event.stopPropagation || stopProp;\n event.stopImmediatePropagation = event.stopImmediatePropagation || stopImmProp;\n\n if (/mouse|click/.test(event.type)) {\n event.pageX = event.clientX + getWindow(element).document.documentElement.scrollLeft;\n event.pageY = event.clientY + getWindow(element).document.documentElement.scrollTop;\n }\n\n listener(event);\n }\n };\n\n ret = element[addEvent](on + type, wrappedListener, !!options.capture);\n\n if (listenerIndex === -1) {\n supplied.push(listener);\n wrapped.push(wrappedListener);\n useCount.push(1);\n }\n else {\n useCount[listenerIndex]++;\n }\n }\n else {\n ret = element[addEvent](type, listener, supportsOptions? options : !!options.capture);\n }\n target.events[type].push(listener);\n\n return ret;\n }\n}\n\nfunction remove (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const elementIndex = indexOf(elements, element);\n const target = targets[elementIndex];\n\n if (!target || !target.events) {\n return;\n }\n\n let wrappedListener = listener;\n let listeners;\n let listenerIndex;\n\n if (useAttachEvent) {\n listeners = attachedListeners[elementIndex];\n listenerIndex = indexOf(listeners.supplied, listener);\n wrappedListener = listeners.wrapped[listenerIndex];\n }\n\n if (type === 'all') {\n for (type in target.events) {\n if (target.events.hasOwnProperty(type)) {\n remove(element, type, 'all');\n }\n }\n return;\n }\n\n if (target.events[type]) {\n const len = target.events[type].length;\n\n if (listener === 'all') {\n for (let i = 0; i < len; i++) {\n remove(element, type, target.events[type][i], options);\n }\n return;\n }\n else {\n for (let i = 0; i < len; i++) {\n if (target.events[type][i] === listener) {\n element[removeEvent](on + type, wrappedListener, supportsOptions? options : !!options.capture);\n target.events[type].splice(i, 1);\n\n if (useAttachEvent && listeners) {\n listeners.useCount[listenerIndex]--;\n if (listeners.useCount[listenerIndex] === 0) {\n listeners.supplied.splice(listenerIndex, 1);\n listeners.wrapped.splice(listenerIndex, 1);\n listeners.useCount.splice(listenerIndex, 1);\n }\n }\n\n break;\n }\n }\n }\n\n if (target.events[type] && target.events[type].length === 0) {\n target.events[type] = null;\n target.typeCount--;\n }\n }\n\n if (!target.typeCount) {\n targets.splice(elementIndex, 1);\n elements.splice(elementIndex, 1);\n attachedListeners.splice(elementIndex, 1);\n }\n}\n\nfunction addDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n if (!delegatedEvents[type]) {\n delegatedEvents[type] = {\n selectors: [],\n contexts : [],\n listeners: [],\n };\n\n // add delegate listener functions\n for (let i = 0; i < documents.length; i++) {\n add(documents[i], type, delegateListener);\n add(documents[i], type, delegateUseCapture, true);\n }\n }\n\n const delegated = delegatedEvents[type];\n let index;\n\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n break;\n }\n }\n\n if (index === -1) {\n index = delegated.selectors.length;\n\n delegated.selectors.push(selector);\n delegated.contexts .push(context);\n delegated.listeners.push([]);\n }\n\n // keep listener and capture and passive flags\n delegated.listeners[index].push([listener, !!options.capture, options.passive]);\n}\n\nfunction removeDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const delegated = delegatedEvents[type];\n let matchFound = false;\n let index;\n\n if (!delegated) { return; }\n\n // count from last index of delegated to 0\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n // look for matching selector and context Node\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n\n const listeners = delegated.listeners[index];\n\n // each item of the listeners array is an array: [function, capture, passive]\n for (let i = listeners.length - 1; i >= 0; i--) {\n const [fn, capture, passive] = listeners[i];\n\n // check if the listener functions and capture and passive flags match\n if (fn === listener && capture === !!options.capture && passive === options.passive) {\n // remove the listener from the array of listeners\n listeners.splice(i, 1);\n\n // if all listeners for this interactable have been removed\n // remove the interactable from the delegated arrays\n if (!listeners.length) {\n delegated.selectors.splice(index, 1);\n delegated.contexts .splice(index, 1);\n delegated.listeners.splice(index, 1);\n\n // remove delegate function from context\n remove(context, type, delegateListener);\n remove(context, type, delegateUseCapture, true);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegatedEvents[type] = null;\n }\n }\n\n // only remove one listener\n matchFound = true;\n break;\n }\n }\n\n if (matchFound) { break; }\n }\n }\n}\n\n// bound to the interactable context when a DOM event\n// listener is added to a selector interactable\nfunction delegateListener (event, optionalArg) {\n const options = getOptions(optionalArg);\n const fakeEvent = {};\n const delegated = delegatedEvents[event.type];\n const eventTarget = (domUtils.getActualElement(event.path\n ? event.path[0]\n : event.target));\n let element = eventTarget;\n\n // duplicate the event so that currentTarget can be changed\n pExtend(fakeEvent, event);\n\n fakeEvent.originalEvent = event;\n fakeEvent.preventDefault = preventOriginalDefault;\n\n // climb up document tree looking for selector matches\n while (is.element(element)) {\n for (let i = 0; i < delegated.selectors.length; i++) {\n const selector = delegated.selectors[i];\n const context = delegated.contexts[i];\n\n if (domUtils.matchesSelector(element, selector)\n && domUtils.nodeContains(context, eventTarget)\n && domUtils.nodeContains(context, element)) {\n\n const listeners = delegated.listeners[i];\n\n fakeEvent.currentTarget = element;\n\n for (let j = 0; j < listeners.length; j++) {\n const [fn, capture, passive] = listeners[j];\n\n if (capture === !!options.capture && passive === options.passive) {\n fn(fakeEvent);\n }\n }\n }\n }\n\n element = domUtils.parentNode(element);\n }\n}\n\nfunction delegateUseCapture (event) {\n return delegateListener.call(this, event, true);\n}\n\nfunction preventDef () {\n this.returnValue = false;\n}\n\nfunction preventOriginalDefault () {\n this.originalEvent.preventDefault();\n}\n\nfunction stopProp () {\n this.cancelBubble = true;\n}\n\nfunction stopImmProp () {\n this.cancelBubble = true;\n this.immediatePropagationStopped = true;\n}\n\nfunction getOptions (param) {\n return is.object(param)? param : { capture: param };\n}\n\nmodule.exports = {\n add,\n remove,\n\n addDelegate,\n removeDelegate,\n\n delegateListener,\n delegateUseCapture,\n delegatedEvents,\n documents,\n\n useAttachEvent,\n supportsOptions,\n\n _elements: elements,\n _targets: targets,\n _attachedListeners: attachedListeners,\n};\n","module.exports = function extend (dest, source) {\n for (const prop in source) {\n dest[prop] = source[prop];\n }\n return dest;\n};\n","const {\n resolveRectLike,\n rectToXY,\n} = require('./rect');\n\nmodule.exports = function (target, element, action) {\n const actionOptions = target.options[action];\n const actionOrigin = actionOptions && actionOptions.origin;\n const origin = actionOrigin || target.options.origin;\n\n const originRect = resolveRectLike(origin, target, element, [target && element]);\n\n return rectToXY(originRect) || { x: 0, y: 0 };\n};\n","module.exports = (x, y) => Math.sqrt(x * x + y * y);\n","const extend = require('./extend');\nconst win = require('./window');\n\nconst utils = {\n warnOnce: function (method, message) {\n let warned = false;\n\n return function () {\n if (!warned) {\n win.window.console.warn(message);\n warned = true;\n }\n\n return method.apply(this, arguments);\n };\n },\n\n // http://stackoverflow.com/a/5634528/2280888\n _getQBezierValue: function (t, p1, p2, p3) {\n const iT = 1 - t;\n return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3;\n },\n\n getQuadraticCurvePoint: function (startX, startY, cpX, cpY, endX, endY, position) {\n return {\n x: utils._getQBezierValue(position, startX, cpX, endX),\n y: utils._getQBezierValue(position, startY, cpY, endY),\n };\n },\n\n // http://gizma.com/easing/\n easeOutQuad: function (t, b, c, d) {\n t /= d;\n return -c * t*(t-2) + b;\n },\n\n copyAction: function (dest, src) {\n dest.name = src.name;\n dest.axis = src.axis;\n dest.edges = src.edges;\n\n return dest;\n },\n\n is : require('./is'),\n extend : extend,\n hypot : require('./hypot'),\n getOriginXY: require('./getOriginXY'),\n};\n\nextend(utils, require('./arr'));\nextend(utils, require('./domUtils'));\nextend(utils, require('./pointerUtils'));\nextend(utils, require('./rect'));\n\nmodule.exports = utils;\n","const scope = require('../scope');\nconst utils = require('./index');\nconst browser = require('./browser');\n\nconst finder = {\n methodOrder: [ 'simulationResume', 'mouse', 'hasPointer', 'idle' ],\n\n search: function (pointer, eventType, eventTarget) {\n const mouseEvent = (/mouse/i.test(pointer.pointerType || eventType)\n // MSPointerEvent.MSPOINTER_TYPE_MOUSE\n || pointer.pointerType === 4);\n const pointerId = utils.getPointerId(pointer);\n const details = { pointer, pointerId, mouseEvent, eventType, eventTarget };\n\n for (const method of finder.methodOrder) {\n const interaction = finder[method](details);\n\n if (interaction) {\n return interaction;\n }\n }\n },\n\n // try to resume simulation with a new pointer\n simulationResume: function ({ mouseEvent, eventType, eventTarget }) {\n if (!/down|start/i.test(eventType)) {\n return null;\n }\n\n for (const interaction of scope.interactions) {\n let element = eventTarget;\n\n if (interaction.simulation && interaction.simulation.allowResume\n && (interaction.mouse === mouseEvent)) {\n while (element) {\n // if the element is the interaction element\n if (element === interaction.element) {\n return interaction;\n }\n element = utils.parentNode(element);\n }\n }\n }\n\n return null;\n },\n\n // if it's a mouse interaction\n mouse: function ({ pointerId, mouseEvent, eventType }) {\n if (!mouseEvent && (browser.supportsTouch || browser.supportsPointerEvent)) {\n return null;\n }\n\n let firstNonActive;\n\n for (const interaction of scope.interactions) {\n if (interaction.mouse) {\n // if it's a down event, skip interactions with running simulations\n if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; }\n\n // if the interaction is active, return it immediately\n if (interaction.interacting()) {\n return interaction;\n }\n // otherwise save it and look for another active interaction\n else if (!firstNonActive) {\n firstNonActive = interaction;\n }\n }\n }\n\n // if no active mouse interaction was found use the first inactive mouse\n // interaction\n if (firstNonActive) {\n return firstNonActive;\n }\n\n // Find any interaction specifically for mouse.\n // ignore the interaction if the eventType is a mousedown, and a simulation\n // is active\n for (const interaction of scope.interactions) {\n if (interaction.mouse && !(/down/.test(eventType) && interaction.simulation)) {\n return interaction;\n }\n }\n\n return null;\n },\n\n // get interaction that has this pointer\n hasPointer: function ({ pointerId }) {\n for (const interaction of scope.interactions) {\n if (utils.contains(interaction.pointerIds, pointerId)) {\n return interaction;\n }\n }\n },\n\n // get first idle interaction\n idle: function ({ mouseEvent }) {\n for (const interaction of scope.interactions) {\n // if there's already a pointer held down\n if (interaction.pointerIds.length === 1) {\n const target = interaction.target;\n // don't add this pointer if there is a target interactable and it\n // isn't gesturable\n if (target && !target.options.gesture.enabled) {\n continue;\n }\n }\n // maximum of 2 pointers per interaction\n else if (interaction.pointerIds.length >= 2) {\n continue;\n }\n\n if (!interaction.interacting() && (mouseEvent === interaction.mouse)) {\n return interaction;\n }\n }\n\n return null;\n },\n};\n\nmodule.exports = finder;\n","const win = require('./window');\nconst isWindow = require('./isWindow');\n\nconst is = {\n array : () => {},\n\n window : thing => thing === win.window || isWindow(thing),\n\n docFrag : thing => is.object(thing) && thing.nodeType === 11,\n\n object : thing => !!thing && (typeof thing === 'object'),\n\n function: thing => typeof thing === 'function',\n\n number : thing => typeof thing === 'number' ,\n\n bool : thing => typeof thing === 'boolean' ,\n\n string : thing => typeof thing === 'string' ,\n\n element: thing => {\n if (!thing || (typeof thing !== 'object')) { return false; }\n\n const _window = win.getWindow(thing) || win.window;\n\n return (/object|function/.test(typeof _window.Element)\n ? thing instanceof _window.Element //DOM2\n : thing.nodeType === 1 && typeof thing.nodeName === 'string');\n },\n};\n\nis.array = thing => (is.object(thing)\n && (typeof thing.length !== 'undefined')\n && is.function(thing.splice));\n\nmodule.exports = is;\n","module.exports = (thing) => !!(thing && thing.Window) && (thing instanceof thing.Window);\n","function pointerExtend (dest, source) {\n for (const prop in source) {\n const prefixedPropREs = module.exports.prefixedPropREs;\n let deprecated = false;\n\n // skip deprecated prefixed properties\n for (const vendor in prefixedPropREs) {\n if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) {\n deprecated = true;\n break;\n }\n }\n\n if (!deprecated && typeof source[prop] !== 'function') {\n dest[prop] = source[prop];\n }\n }\n return dest;\n}\n\npointerExtend.prefixedPropREs = {\n webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/,\n};\n\nmodule.exports = pointerExtend;\n","const hypot = require('./hypot');\nconst browser = require('./browser');\nconst dom = require('./domObjects');\nconst domUtils = require('./domUtils');\nconst is = require('./is');\nconst pointerExtend = require('./pointerExtend');\n\nconst pointerUtils = {\n copyCoords: function (dest, src) {\n dest.page = dest.page || {};\n dest.page.x = src.page.x;\n dest.page.y = src.page.y;\n\n dest.client = dest.client || {};\n dest.client.x = src.client.x;\n dest.client.y = src.client.y;\n\n dest.timeStamp = src.timeStamp;\n },\n\n setCoordDeltas: function (targetObj, prev, cur) {\n targetObj.page.x = cur.page.x - prev.page.x;\n targetObj.page.y = cur.page.y - prev.page.y;\n targetObj.client.x = cur.client.x - prev.client.x;\n targetObj.client.y = cur.client.y - prev.client.y;\n targetObj.timeStamp = cur.timeStamp - prev.timeStamp;\n\n // set pointer velocity\n const dt = Math.max(targetObj.timeStamp / 1000, 0.001);\n\n targetObj.page.speed = hypot(targetObj.page.x, targetObj.page.y) / dt;\n targetObj.page.vx = targetObj.page.x / dt;\n targetObj.page.vy = targetObj.page.y / dt;\n\n targetObj.client.speed = hypot(targetObj.client.x, targetObj.page.y) / dt;\n targetObj.client.vx = targetObj.client.x / dt;\n targetObj.client.vy = targetObj.client.y / dt;\n },\n\n isNativePointer: function (pointer) {\n return (pointer instanceof dom.Event || pointer instanceof dom.Touch);\n },\n\n // Get specified X/Y coords for mouse or event.touches[0]\n getXY: function (type, pointer, xy) {\n xy = xy || {};\n type = type || 'page';\n\n xy.x = pointer[type + 'X'];\n xy.y = pointer[type + 'Y'];\n\n return xy;\n },\n\n getPageXY: function (pointer, page) {\n page = page || {};\n\n // Opera Mobile handles the viewport and scrolling oddly\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n pointerUtils.getXY('screen', pointer, page);\n\n page.x += window.scrollX;\n page.y += window.scrollY;\n }\n else {\n pointerUtils.getXY('page', pointer, page);\n }\n\n return page;\n },\n\n getClientXY: function (pointer, client) {\n client = client || {};\n\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n // Opera Mobile handles the viewport and scrolling oddly\n pointerUtils.getXY('screen', pointer, client);\n }\n else {\n pointerUtils.getXY('client', pointer, client);\n }\n\n return client;\n },\n\n getPointerId: function (pointer) {\n return is.number(pointer.pointerId)? pointer.pointerId : pointer.identifier;\n },\n\n setCoords: function (targetObj, pointers, timeStamp) {\n const pointer = (pointers.length > 1\n ? pointerUtils.pointerAverage(pointers)\n : pointers[0]);\n\n const tmpXY = {};\n\n pointerUtils.getPageXY(pointer, tmpXY);\n targetObj.page.x = tmpXY.x;\n targetObj.page.y = tmpXY.y;\n\n pointerUtils.getClientXY(pointer, tmpXY);\n targetObj.client.x = tmpXY.x;\n targetObj.client.y = tmpXY.y;\n\n targetObj.timeStamp = is.number(timeStamp) ? timeStamp :new Date().getTime();\n },\n\n pointerExtend: pointerExtend,\n\n getTouchPair: function (event) {\n const touches = [];\n\n // array of touches is supplied\n if (is.array(event)) {\n touches[0] = event[0];\n touches[1] = event[1];\n }\n // an event\n else {\n if (event.type === 'touchend') {\n if (event.touches.length === 1) {\n touches[0] = event.touches[0];\n touches[1] = event.changedTouches[0];\n }\n else if (event.touches.length === 0) {\n touches[0] = event.changedTouches[0];\n touches[1] = event.changedTouches[1];\n }\n }\n else {\n touches[0] = event.touches[0];\n touches[1] = event.touches[1];\n }\n }\n\n return touches;\n },\n\n pointerAverage: function (pointers) {\n const average = {\n pageX : 0,\n pageY : 0,\n clientX: 0,\n clientY: 0,\n screenX: 0,\n screenY: 0,\n };\n\n for (const pointer of pointers) {\n for (const prop in average) {\n average[prop] += pointer[prop];\n }\n }\n for (const prop in average) {\n average[prop] /= pointers.length;\n }\n\n return average;\n },\n\n touchBBox: function (event) {\n if (!event.length && !(event.touches && event.touches.length > 1)) {\n return;\n }\n\n const touches = pointerUtils.getTouchPair(event);\n const minX = Math.min(touches[0].pageX, touches[1].pageX);\n const minY = Math.min(touches[0].pageY, touches[1].pageY);\n const maxX = Math.max(touches[0].pageX, touches[1].pageX);\n const maxY = Math.max(touches[0].pageY, touches[1].pageY);\n\n return {\n x: minX,\n y: minY,\n left: minX,\n top: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n },\n\n touchDistance: function (event, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n\n\n const dx = touches[0][sourceX] - touches[1][sourceX];\n const dy = touches[0][sourceY] - touches[1][sourceY];\n\n return hypot(dx, dy);\n },\n\n touchAngle: function (event, prevAngle, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n const dx = touches[1][sourceX] - touches[0][sourceX];\n const dy = touches[1][sourceY] - touches[0][sourceY];\n const angle = 180 * Math.atan2(dy , dx) / Math.PI;\n\n return angle;\n },\n\n getPointerType: function (pointer, interaction) {\n // if the PointerEvent API isn't available, then the pointer must be ither\n // a MouseEvent or TouchEvent\n if (interaction.mouse) { return 'mouse'; }\n if (!browser.supportsPointerEvent) { return 'touch'; }\n\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : [undefined, undefined,'touch', 'pen', 'mouse'][pointer.pointerType];\n },\n\n // [ event.target, event.currentTarget ]\n getEventTargets: function (event) {\n return [\n domUtils.getActualElement(event.path ? event.path[0] : event.target),\n domUtils.getActualElement(event.currentTarget),\n ];\n },\n};\n\nmodule.exports = pointerUtils;\n","const { window } = require('./window');\n\nconst vendors = ['ms', 'moz', 'webkit', 'o'];\nlet lastTime = 0;\nlet request;\nlet cancel;\n\nfor (let x = 0; x < vendors.length && !window.requestAnimationFrame; x++) {\n request = window[vendors[x] + 'RequestAnimationFrame'];\n cancel = window[vendors[x] +'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n}\n\nif (!request) {\n request = function (callback) {\n const currTime = new Date().getTime();\n const timeToCall = Math.max(0, 16 - (currTime - lastTime));\n const id = setTimeout(function () { callback(currTime + timeToCall); },\n timeToCall);\n\n lastTime = currTime + timeToCall;\n return id;\n };\n}\n\nif (!cancel) {\n cancel = function (id) {\n clearTimeout(id);\n };\n}\n\nmodule.exports = {\n request,\n cancel,\n};\n","const extend = require('./extend');\nconst is = require('./is');\nconst {\n closest,\n parentNode,\n getElementRect,\n} = require('./domUtils');\n\nconst rectUtils = {\n getStringOptionResult: function (value, interactable, element) {\n if (!is.string(value)) {\n return null;\n }\n\n if (value === 'parent') {\n value = parentNode(element);\n }\n else if (value === 'self') {\n value = interactable.getRect(element);\n }\n else {\n value = closest(element, value);\n }\n\n return value;\n },\n\n resolveRectLike: function (value, interactable, element, functionArgs) {\n value = rectUtils.getStringOptionResult(value, interactable, element) || value;\n\n if (is.function(value)) {\n value = value.apply(null, functionArgs);\n }\n\n if (is.element(value)) {\n value = getElementRect(value);\n }\n\n return value;\n },\n\n rectToXY: function (rect) {\n return rect && {\n x: 'x' in rect ? rect.x : rect.left,\n y: 'y' in rect ? rect.y : rect.top,\n };\n },\n\n xywhToTlbr: function (rect) {\n if (rect && !('left' in rect && 'top' in rect)) {\n rect = extend({}, rect);\n\n rect.left = rect.x || 0;\n rect.top = rect.y || 0;\n rect.right = rect.right || (rect.left + rect.width);\n rect.bottom = rect.bottom || (rect.top + rect.height);\n }\n\n return rect;\n },\n\n tlbrToXywh: function (rect) {\n if (rect && !('x' in rect && 'y' in rect)) {\n rect = extend({}, rect);\n\n rect.x = rect.left || 0;\n rect.top = rect.top || 0;\n rect.width = rect.width || (rect.right - rect.x);\n rect.height = rect.height || (rect.bottom - rect.y);\n }\n\n return rect;\n },\n};\n\nmodule.exports = rectUtils;\n","const win = module.exports;\nconst isWindow = require('./isWindow');\n\nfunction init (window) {\n // get wrapped window if using Shadow DOM polyfill\n\n win.realWindow = window;\n\n // create a TextNode\n const el = window.document.createTextNode('');\n\n // check if it's wrapped by a polyfill\n if (el.ownerDocument !== window.document\n && typeof window.wrap === 'function'\n && window.wrap(el) === el) {\n // use wrapped window\n window = window.wrap(window);\n }\n\n win.window = window;\n}\n\nif (typeof window === 'undefined') {\n win.window = undefined;\n win.realWindow = undefined;\n}\nelse {\n init(window);\n}\n\nwin.getWindow = function getWindow (node) {\n if (isWindow(node)) {\n return node;\n }\n\n const rootNode = (node.ownerDocument || node);\n\n return rootNode.defaultView || rootNode.parentWindow || win.window;\n};\n\nwin.init = init;\n"]} \ No newline at end of file +{"version":3,"sources":["src/minHeader.js","src/header.js","index.js","src/Eventable.js","src/InteractEvent.js","src/Interactable.js","src/Interaction.js","src/actions/base.js","src/actions/drag.js","src/actions/drop.js","src/actions/gesture.js","src/actions/resize.js","src/autoScroll.js","src/autoStart/InteractableMethods.js","src/autoStart/base.js","src/autoStart/delay.js","src/autoStart/drag.js","src/autoStart/gesture.js","src/autoStart/resize.js","src/defaultOptions.js","src/index.js","src/inertia.js","src/interact.js","src/interactablePreventDefault.js","src/legacyBrowsers.js","src/modifiers/index.js","src/modifiers/restrict.js","src/modifiers/restrictEdges.js","src/modifiers/restrictSize.js","src/modifiers/snap.js","src/modifiers/snapSize.js","src/pointerEvents/PointerEvent.js","src/pointerEvents/base.js","src/pointerEvents/holdRepeat.js","src/pointerEvents/interactableTargets.js","src/scope.js","src/utils/Signals.js","src/utils/arr.js","src/utils/browser.js","src/utils/domObjects.js","src/utils/domUtils.js","src/utils/events.js","src/utils/extend.js","src/utils/getOriginXY.js","src/utils/hypot.js","src/utils/index.js","src/utils/interactionFinder.js","src/utils/is.js","src/utils/isWindow.js","src/utils/pointerExtend.js","src/utils/pointerUtils.js","src/utils/raf.js","src/utils/rect.js","src/utils/window.js"],"names":[],"mappings":"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","file":"interact.min.js","sourceRoot":"","sourcesContent":["/* interact.js v1.3.0-alpha.4+sha.7970416-dirty | https://raw.github.com/taye/interact.js/master/LICENSE */\n","/**\n * interact.js v1.3.0-alpha.4+sha.7970416-dirty\n *\n * Copyright (c) 2012-2017 Taye Adeyemi \n * Open source under the MIT License.\n * https://raw.github.com/taye/interact.js/master/LICENSE\n */\n","/*\n * In a (windowless) server environment this file exports a factory function\n * that takes the window to use.\n *\n * var interact = require('interact.js')(windowObject);\n *\n * See https://github.com/taye/interact.js/issues/187\n */\nif (typeof window === 'undefined') {\n module.exports = function (window) {\n require('./src/utils/window').init(window);\n\n return require('./src/index');\n };\n}\nelse {\n module.exports = require('./src/index');\n}\n","const { indexOf } = require('./utils/arr');\nconst extend = require('./utils/extend.js');\n\nfunction fireUntilImmediateStopped (event, listeners) {\n for (let i = 0, len = listeners.length; i < len && !event.immediatePropagationStopped; i++) {\n listeners[i](event);\n }\n}\n\nclass Eventable {\n\n constructor (options) {\n this.options = extend({}, options || {});\n }\n\n fire (event) {\n let listeners;\n const onEvent = 'on' + event.type;\n const global = this.global;\n\n // Interactable#on() listeners\n if ((listeners = this[event.type])) {\n fireUntilImmediateStopped(event, listeners);\n }\n\n // interactable.onevent listener\n if (this[onEvent]) {\n this[onEvent](event);\n }\n\n // interact.on() listeners\n if (!event.propagationStopped && global && (listeners = global[event.type])) {\n fireUntilImmediateStopped(event, listeners);\n }\n }\n\n on (eventType, listener) {\n // if this type of event was never bound\n if (this[eventType]) {\n this[eventType].push(listener);\n }\n else {\n this[eventType] = [listener];\n }\n }\n\n off (eventType, listener) {\n // if it is an action event type\n const eventList = this[eventType];\n const index = eventList? indexOf(eventList, listener) : -1;\n\n if (index !== -1) {\n eventList.splice(index, 1);\n }\n\n if (eventList && eventList.length === 0 || !listener) {\n this[eventType] = listener;\n }\n }\n}\n\nmodule.exports = Eventable;\n","const extend = require('./utils/extend');\nconst getOriginXY = require('./utils/getOriginXY');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nclass InteractEvent {\n constructor (interaction, event, action, phase, element, related, preEnd = false) {\n const target = interaction.target;\n const deltaSource = (target && target.options || defaults).deltaSource;\n const origin = getOriginXY(target, element, action);\n const starting = phase === 'start';\n const ending = phase === 'end';\n const coords = starting? interaction.startCoords : interaction.curCoords;\n const prevEvent = interaction.prevEvent;\n\n element = element || interaction.element;\n\n const page = extend({}, coords.page);\n const client = extend({}, coords.client);\n\n page.x -= origin.x;\n page.y -= origin.y;\n\n client.x -= origin.x;\n client.y -= origin.y;\n\n this.ctrlKey = event.ctrlKey;\n this.altKey = event.altKey;\n this.shiftKey = event.shiftKey;\n this.metaKey = event.metaKey;\n this.button = event.button;\n this.buttons = event.buttons;\n this.target = element;\n this.currentTarget = element;\n this.relatedTarget = related || null;\n this.preEnd = preEnd;\n this.type = action + (phase || '');\n this.interaction = interaction;\n this.interactable = target;\n\n this.t0 = starting ? interaction.downTimes[interaction.downTimes.length - 1]\n : prevEvent.t0;\n\n const signalArg = {\n interaction,\n event,\n action,\n phase,\n element,\n related,\n page,\n client,\n coords,\n starting,\n ending,\n deltaSource,\n iEvent: this,\n };\n\n signals.fire('set-xy', signalArg);\n\n if (ending) {\n // use previous coords when ending\n this.pageX = prevEvent.pageX;\n this.pageY = prevEvent.pageY;\n this.clientX = prevEvent.clientX;\n this.clientY = prevEvent.clientY;\n }\n else {\n this.pageX = page.x;\n this.pageY = page.y;\n this.clientX = client.x;\n this.clientY = client.y;\n }\n\n this.x0 = interaction.startCoords.page.x - origin.x;\n this.y0 = interaction.startCoords.page.y - origin.y;\n this.clientX0 = interaction.startCoords.client.x - origin.x;\n this.clientY0 = interaction.startCoords.client.y - origin.y;\n\n signals.fire('set-delta', signalArg);\n\n this.timeStamp = coords.timeStamp;\n this.dt = interaction.pointerDelta.timeStamp;\n this.duration = this.timeStamp - this.t0;\n\n // speed and velocity in pixels per second\n this.speed = interaction.pointerDelta[deltaSource].speed;\n this.velocityX = interaction.pointerDelta[deltaSource].vx;\n this.velocityY = interaction.pointerDelta[deltaSource].vy;\n\n this.swipe = (ending || phase === 'inertiastart')? this.getSwipe() : null;\n\n signals.fire('new', signalArg);\n }\n\n getSwipe () {\n const interaction = this.interaction;\n\n if (interaction.prevEvent.speed < 600\n || this.timeStamp - interaction.prevEvent.timeStamp > 150) {\n return null;\n }\n\n let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI;\n const overlap = 22.5;\n\n if (angle < 0) {\n angle += 360;\n }\n\n const left = 135 - overlap <= angle && angle < 225 + overlap;\n const up = 225 - overlap <= angle && angle < 315 + overlap;\n\n const right = !left && (315 - overlap <= angle || angle < 45 + overlap);\n const down = !up && 45 - overlap <= angle && angle < 135 + overlap;\n\n return {\n up,\n down,\n left,\n right,\n angle,\n speed: interaction.prevEvent.speed,\n velocity: {\n x: interaction.prevEvent.velocityX,\n y: interaction.prevEvent.velocityY,\n },\n };\n }\n\n preventDefault () {}\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n}\n\nsignals.on('set-delta', function ({ iEvent, interaction, starting, deltaSource }) {\n const prevEvent = starting? iEvent : interaction.prevEvent;\n\n if (deltaSource === 'client') {\n iEvent.dx = iEvent.clientX - prevEvent.clientX;\n iEvent.dy = iEvent.clientY - prevEvent.clientY;\n }\n else {\n iEvent.dx = iEvent.pageX - prevEvent.pageX;\n iEvent.dy = iEvent.pageY - prevEvent.pageY;\n }\n});\n\nInteractEvent.signals = signals;\n\nmodule.exports = InteractEvent;\n","const is = require('./utils/is');\nconst events = require('./utils/events');\nconst extend = require('./utils/extend');\nconst actions = require('./actions/base');\nconst scope = require('./scope');\nconst Eventable = require('./Eventable');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nconst {\n getElementRect,\n nodeContains,\n trySelector,\n} = require('./utils/domUtils');\nconst { getWindow } = require('./utils/window');\nconst { indexOf, contains } = require('./utils/arr');\nconst { wheelEvent } = require('./utils/browser');\n\n// all set interactables\nscope.interactables = [];\n\n/*\\\n * Interactable\n [ property ]\n **\n * Object type returned by @interact\n\\*/\nclass Interactable {\n constructor (target, options) {\n options = options || {};\n\n this.target = target;\n this.events = new Eventable();\n this._context = options.context || scope.document;\n this._win = getWindow(trySelector(target)? this._context : target);\n this._doc = this._win.document;\n\n signals.fire('new', {\n target,\n options,\n interactable: this,\n win: this._win,\n });\n\n scope.addDocument( this._doc, this._win );\n\n scope.interactables.push(this);\n\n this.set(options);\n }\n\n setOnEvents (action, phases) {\n const onAction = 'on' + action;\n\n if (is.function(phases.onstart) ) { this.events[onAction + 'start' ] = phases.onstart ; }\n if (is.function(phases.onmove) ) { this.events[onAction + 'move' ] = phases.onmove ; }\n if (is.function(phases.onend) ) { this.events[onAction + 'end' ] = phases.onend ; }\n if (is.function(phases.oninertiastart)) { this.events[onAction + 'inertiastart' ] = phases.oninertiastart ; }\n\n return this;\n }\n\n setPerAction (action, options) {\n // for all the default per-action options\n for (const option in options) {\n // if this option exists for this action\n if (option in defaults[action]) {\n // if the option in the options arg is an object value\n if (is.object(options[option])) {\n // duplicate the object\n this.options[action][option] = extend(this.options[action][option] || {}, options[option]);\n\n if (is.object(defaults.perAction[option]) && 'enabled' in defaults.perAction[option]) {\n this.options[action][option].enabled = options[option].enabled === false? false : true;\n }\n }\n else if (is.bool(options[option]) && is.object(defaults.perAction[option])) {\n this.options[action][option].enabled = options[option];\n }\n else if (options[option] !== undefined) {\n // or if it's not undefined, do a plain assignment\n this.options[action][option] = options[option];\n }\n }\n }\n }\n\n /*\\\n * Interactable.getRect\n [ method ]\n *\n * The default function to get an Interactables bounding rect. Can be\n * overridden using @Interactable.rectChecker.\n *\n - element (Element) #optional The element to measure.\n = (object) The object's bounding rectangle.\n o {\n o top : 0,\n o left : 0,\n o bottom: 0,\n o right : 0,\n o width : 0,\n o height: 0\n o }\n \\*/\n getRect (element) {\n element = element || this.target;\n\n if (is.string(this.target) && !(is.element(element))) {\n element = this._context.querySelector(this.target);\n }\n\n return getElementRect(element);\n }\n\n /*\\\n * Interactable.rectChecker\n [ method ]\n *\n * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n - checker (function) #optional A function which returns this Interactable's bounding rectangle. See @Interactable.getRect\n = (function | object) The checker function or this Interactable\n \\*/\n rectChecker (checker) {\n if (is.function(checker)) {\n this.getRect = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.getRect;\n\n return this;\n }\n\n return this.getRect;\n }\n\n _backCompatOption (optionName, newValue) {\n if (trySelector(newValue) || is.object(newValue)) {\n this.options[optionName] = newValue;\n\n for (const action of actions.names) {\n this.options[action][optionName] = newValue;\n }\n\n return this;\n }\n\n return this.options[optionName];\n }\n\n /*\\\n * Interactable.origin\n [ method ]\n *\n * Gets or sets the origin of the Interactable's element. The x and y\n * of the origin will be subtracted from action event coordinates.\n *\n - origin (object | string) #optional An object eg. { x: 0, y: 0 } or string 'parent', 'self' or any CSS selector\n * OR\n - origin (Element) #optional An HTML or SVG Element whose rect will be used\n **\n = (object) The current origin or this Interactable\n \\*/\n origin (newValue) {\n return this._backCompatOption('origin', newValue);\n }\n\n /*\\\n * Interactable.deltaSource\n [ method ]\n *\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n - newValue (string) #optional Use 'client' if you will be scrolling while interacting; Use 'page' if you want autoScroll to work\n = (string | object) The current deltaSource or this Interactable\n \\*/\n deltaSource (newValue) {\n if (newValue === 'page' || newValue === 'client') {\n this.options.deltaSource = newValue;\n\n return this;\n }\n\n return this.options.deltaSource;\n }\n\n /*\\\n * Interactable.context\n [ method ]\n *\n * Gets the selector context Node of the Interactable. The default is `window.document`.\n *\n = (Node) The context Node of this Interactable\n **\n \\*/\n context () {\n return this._context;\n }\n\n inContext (element) {\n return (this._context === element.ownerDocument\n || nodeContains(this._context, element));\n }\n\n /*\\\n * Interactable.fire\n [ method ]\n *\n * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n - iEvent (InteractEvent) The InteractEvent object to be fired on this Interactable\n = (Interactable) this Interactable\n \\*/\n fire (iEvent) {\n this.events.fire(iEvent);\n\n return this;\n }\n\n _onOffMultiple (method, eventType, listener, options) {\n if (is.string(eventType) && eventType.search(' ') !== -1) {\n eventType = eventType.trim().split(/ +/);\n }\n\n if (is.array(eventType)) {\n for (let i = 0; i < eventType.length; i++) {\n this[method](eventType[i], listener, options);\n }\n\n return true;\n }\n\n if (is.object(eventType)) {\n for (const prop in eventType) {\n this[method](prop, eventType[prop], listener);\n }\n\n return true;\n }\n }\n\n /*\\\n * Interactable.on\n [ method ]\n *\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n - eventType (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) This Interactable\n \\*/\n on (eventType, listener, options) {\n if (this._onOffMultiple('on', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.on(eventType, listener);\n }\n // delegated event for selector\n else if (is.string(this.target)) {\n events.addDelegate(this.target, this._context, eventType, listener, options);\n }\n else {\n events.add(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.off\n [ method ]\n *\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n - eventType (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) This Interactable\n \\*/\n off (eventType, listener, options) {\n if (this._onOffMultiple('off', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n // if it is an action event type\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.off(eventType, listener);\n }\n // delegated event\n else if (is.string(this.target)) {\n events.removeDelegate(this.target, this._context, eventType, listener, options);\n }\n // remove listener from this Interatable's element\n else {\n events.remove(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.set\n [ method ]\n *\n * Reset the options of this Interactable\n - options (object) The new settings to apply\n = (object) This Interactable\n \\*/\n set (options) {\n if (!is.object(options)) {\n options = {};\n }\n\n this.options = extend({}, defaults.base);\n\n const perActions = extend({}, defaults.perAction);\n\n for (const actionName in actions.methodDict) {\n const methodName = actions.methodDict[actionName];\n\n this.options[actionName] = extend({}, defaults[actionName]);\n\n this.setPerAction(actionName, perActions);\n\n this[methodName](options[actionName]);\n }\n\n for (const setting of Interactable.settingsMethods) {\n this.options[setting] = defaults.base[setting];\n\n if (setting in options) {\n this[setting](options[setting]);\n }\n }\n\n signals.fire('set', {\n options,\n interactable: this,\n });\n\n return this;\n }\n\n /*\\\n * Interactable.unset\n [ method ]\n *\n * Remove this interactable from the list of interactables and remove\n * it's action capabilities and event listeners\n *\n = (object) @interact\n \\*/\n unset () {\n events.remove(this.target, 'all');\n\n if (is.string(this.target)) {\n // remove delegated events\n for (const type in events.delegatedEvents) {\n const delegated = events.delegatedEvents[type];\n\n if (delegated.selectors[0] === this.target\n && delegated.contexts[0] === this._context) {\n\n delegated.selectors.splice(0, 1);\n delegated.contexts .splice(0, 1);\n delegated.listeners.splice(0, 1);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegated[type] = null;\n }\n }\n\n events.remove(this._context, type, events.delegateListener);\n events.remove(this._context, type, events.delegateUseCapture, true);\n }\n }\n else {\n events.remove(this, 'all');\n }\n\n signals.fire('unset', { interactable: this });\n\n scope.interactables.splice(indexOf(scope.interactables, this), 1);\n\n // Stop related interactions when an Interactable is unset\n for (const interaction of scope.interactions || []) {\n if (interaction.target === this && interaction.interacting()) {\n interaction.stop();\n }\n }\n\n return scope.interact;\n }\n}\n\nscope.interactables.indexOfElement = function indexOfElement (target, context) {\n context = context || scope.document;\n\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n if (interactable.target === target && interactable._context === context) {\n return i;\n }\n }\n return -1;\n};\n\nscope.interactables.get = function interactableGet (element, options, dontCheckInContext) {\n const ret = this[this.indexOfElement(element, options && options.context)];\n\n return ret && (is.string(element) || dontCheckInContext || ret.inContext(element))? ret : null;\n};\n\nscope.interactables.forEachSelector = function (callback, element) {\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n // skip non CSS selector targets and out of context elements\n if (!is.string(interactable.target)\n || (element && !interactable.inContext(element))) {\n continue;\n }\n\n const ret = callback(interactable, interactable.target, interactable._context, i, this);\n\n if (ret !== undefined) {\n return ret;\n }\n }\n};\n\n// all interact.js eventTypes\nInteractable.eventTypes = scope.eventTypes = [];\n\nInteractable.signals = signals;\n\nInteractable.settingsMethods = [ 'deltaSource', 'origin', 'preventDefault', 'rectChecker' ];\n\nmodule.exports = Interactable;\n","const scope = require('./scope');\nconst utils = require('./utils');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst domObjects = require('./utils/domObjects');\nconst finder = require('./utils/interactionFinder');\nconst signals = require('./utils/Signals').new();\n\nconst listeners = {};\nconst methodNames = [\n 'pointerDown', 'pointerMove', 'pointerUp',\n 'updatePointer', 'removePointer',\n];\n\n// for ignoring browser's simulated mouse events\nlet prevTouchTime = 0;\n\n// all active and idle interactions\nscope.interactions = [];\n\nclass Interaction {\n constructor ({ pointerType }) {\n this.target = null; // current interactable being interacted with\n this.element = null; // the target element of the interactable\n\n this.prepared = { // action that's ready to be fired on next move event\n name : null,\n axis : null,\n edges: null,\n };\n\n // keep track of added pointers\n this.pointers = [];\n this.pointerIds = [];\n this.downTargets = [];\n this.downTimes = [];\n\n // Previous native pointer move event coordinates\n this.prevCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n // current native pointer move event coordinates\n this.curCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Starting InteractEvent pointer coordinates\n this.startCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Change in coordinates and time of the pointer\n this.pointerDelta = {\n page : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n client : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n timeStamp: 0,\n };\n\n this.downEvent = null; // pointerdown/mousedown/touchstart event\n this.downPointer = {};\n\n this._eventTarget = null;\n this._curEventTarget = null;\n\n this.prevEvent = null; // previous action event\n\n this.pointerIsDown = false;\n this.pointerWasMoved = false;\n this._interacting = false;\n\n this.pointerType = pointerType;\n\n signals.fire('new', this);\n\n scope.interactions.push(this);\n }\n\n pointerDown (pointer, event, eventTarget) {\n const pointerIndex = this.updatePointer(pointer, event, true);\n\n signals.fire('down', {\n pointer,\n event,\n eventTarget,\n pointerIndex,\n interaction: this,\n });\n }\n\n /*\\\n * Interaction.start\n [ method ]\n *\n * Start an action with the given Interactable and Element as tartgets. The\n * action must be enabled for the target Interactable and an appropriate number\n * of pointers must be held down - 1 for drag/resize, 2 for gesture.\n *\n * Use it with `interactable.able({ manualStart: false })` to always\n * [start actions manually](https://github.com/taye/interact.js/issues/114)\n *\n - action (object) The action to be performed - drag, resize, etc.\n - target (Interactable) The Interactable to target\n - element (Element) The DOM Element to target\n = (object) interact\n **\n | interact(target)\n | .draggable({\n | // disable the default drag start by down->move\n | manualStart: true\n | })\n | // start dragging after the user holds the pointer down\n | .on('hold', function (event) {\n | var interaction = event.interaction;\n |\n | if (!interaction.interacting()) {\n | interaction.start({ name: 'drag' },\n | event.interactable,\n | event.currentTarget);\n | }\n | });\n \\*/\n start (action, target, element) {\n if (this.interacting()\n || !this.pointerIsDown\n || this.pointerIds.length < (action.name === 'gesture'? 2 : 1)) {\n return;\n }\n\n // if this interaction had been removed after stopping\n // add it back\n if (utils.indexOf(scope.interactions, this) === -1) {\n scope.interactions.push(this);\n }\n\n utils.copyAction(this.prepared, action);\n this.target = target;\n this.element = element;\n\n signals.fire('action-start', {\n interaction: this,\n event: this.downEvent,\n });\n }\n\n pointerMove (pointer, event, eventTarget) {\n if (!this.simulation) {\n this.updatePointer(pointer);\n utils.setCoords(this.curCoords, this.pointers);\n }\n\n const duplicateMove = (this.curCoords.page.x === this.prevCoords.page.x\n && this.curCoords.page.y === this.prevCoords.page.y\n && this.curCoords.client.x === this.prevCoords.client.x\n && this.curCoords.client.y === this.prevCoords.client.y);\n\n let dx;\n let dy;\n\n // register movement greater than pointerMoveTolerance\n if (this.pointerIsDown && !this.pointerWasMoved) {\n dx = this.curCoords.client.x - this.startCoords.client.x;\n dy = this.curCoords.client.y - this.startCoords.client.y;\n\n this.pointerWasMoved = utils.hypot(dx, dy) > Interaction.pointerMoveTolerance;\n }\n\n const signalArg = {\n pointer,\n pointerIndex: this.getPointerIndex(pointer),\n event,\n eventTarget,\n dx,\n dy,\n duplicate: duplicateMove,\n interaction: this,\n interactingBeforeMove: this.interacting(),\n };\n\n if (!duplicateMove) {\n // set pointer coordinate, time changes and speeds\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n }\n\n signals.fire('move', signalArg);\n\n if (!duplicateMove) {\n // if interacting, fire an 'action-move' signal etc\n if (this.interacting()) {\n this.doMove(signalArg);\n }\n\n if (this.pointerWasMoved) {\n utils.copyCoords(this.prevCoords, this.curCoords);\n }\n }\n }\n\n /*\\\n * Interaction.doMove\n [ method ]\n *\n * Force a move of the current action at the same coordinates. Useful if\n * snap/restrict has been changed and you want a movement with the new\n * settings.\n *\n **\n | interact(target)\n | .draggable(true)\n | .on('dragmove', function (event) {\n | if (someCondition) {\n | // change the snap settings\n | event.interactable.draggable({ snap: { targets: [] }});\n | // fire another move event with re-calculated snap\n | event.interaction.doMove();\n | }\n | });\n \\*/\n doMove (signalArg) {\n signalArg = utils.extend({\n pointer: this.pointers[0],\n event: this.prevEvent,\n eventTarget: this._eventTarget,\n interaction: this,\n }, signalArg || {});\n\n signals.fire('before-action-move', signalArg);\n\n if (!this._dontFireMove) {\n signals.fire('action-move', signalArg);\n }\n\n this._dontFireMove = false;\n }\n\n // End interact move events and stop auto-scroll unless simulation is running\n pointerUp (pointer, event, eventTarget, curEventTarget) {\n const pointerIndex = this.getPointerIndex(pointer);\n\n signals.fire(/cancel$/i.test(event.type)? 'cancel' : 'up', {\n pointer,\n pointerIndex,\n event,\n eventTarget,\n curEventTarget,\n interaction: this,\n });\n\n if (!this.simulation) {\n this.end(event);\n }\n\n this.pointerIsDown = false;\n this.removePointer(pointer, event);\n }\n\n /*\\\n * Interaction.end\n [ method ]\n *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n - event (PointerEvent) #optional\n **\n | interact(target)\n | .draggable(true)\n | .on('move', function (event) {\n | if (event.pageX > 1000) {\n | // end the current action\n | event.interaction.end();\n | // stop all further listeners from being called\n | event.stopImmediatePropagation();\n | }\n | });\n \\*/\n end (event) {\n event = event || this.prevEvent;\n\n if (this.interacting()) {\n signals.fire('action-end', {\n event,\n interaction: this,\n });\n }\n\n this.stop();\n }\n\n currentAction () {\n return this._interacting? this.prepared.name: null;\n }\n\n interacting () {\n return this._interacting;\n }\n\n stop () {\n signals.fire('stop', { interaction: this });\n\n if (this._interacting) {\n signals.fire('stop-active', { interaction: this });\n signals.fire('stop-' + this.prepared.name, { interaction: this });\n }\n\n this.target = this.element = null;\n\n this._interacting = false;\n this.prepared.name = this.prevEvent = null;\n }\n\n getPointerIndex (pointer) {\n // mouse and pen interactions may have only one pointer\n if (this.pointerType === 'mouse' || this.pointerType === 'pen') {\n return 0;\n }\n\n return utils.indexOf(this.pointerIds, utils.getPointerId(pointer));\n }\n\n updatePointer (pointer, event, down = event && /(down|start)$/i.test(event.type)) {\n const id = utils.getPointerId(pointer);\n let index = this.getPointerIndex(pointer);\n\n if (index === -1) {\n index = this.pointerIds.length;\n this.pointerIds[index] = id;\n }\n\n if (down) {\n signals.fire('update-pointer-down', {\n pointer,\n event,\n down,\n pointerId: id,\n pointerIndex: index,\n interaction: this,\n });\n }\n\n this.pointers[index] = pointer;\n\n return index;\n }\n\n removePointer (pointer, event) {\n const index = this.getPointerIndex(pointer);\n\n if (index === -1) { return; }\n\n signals.fire('remove-pointer', {\n pointer,\n event,\n pointerIndex: index,\n interaction: this,\n });\n\n this.pointers .splice(index, 1);\n this.pointerIds .splice(index, 1);\n this.downTargets.splice(index, 1);\n this.downTimes .splice(index, 1);\n }\n\n _updateEventTargets (target, currentTarget) {\n this._eventTarget = target;\n this._curEventTarget = currentTarget;\n }\n}\n\nfor (let i = 0, len = methodNames.length; i < len; i++) {\n const method = methodNames[i];\n\n listeners[method] = doOnInteractions(method);\n}\n\nfunction doOnInteractions (method) {\n return (function (event) {\n const pointerType = utils.getPointerType(event);\n const [eventTarget, curEventTarget] = utils.getEventTargets(event);\n const matches = []; // [ [pointer, interaction], ...]\n\n if (browser.supportsTouch && /touch/.test(event.type)) {\n prevTouchTime = new Date().getTime();\n\n for (let i = 0; i < event.changedTouches.length; i++) {\n const pointer = event.changedTouches[i];\n const interaction = finder.search(pointer, event.type, eventTarget);\n\n matches.push([pointer, interaction || new Interaction({ pointerType })]);\n }\n }\n else {\n let invalidPointer = false;\n\n if (!browser.supportsPointerEvent && /mouse/.test(event.type)) {\n // ignore mouse events while touch interactions are active\n for (let i = 0; i < scope.interactions.length && !invalidPointer; i++) {\n invalidPointer = scope.interactions[i].pointerType !== 'mouse' && scope.interactions[i].pointerIsDown;\n }\n\n // try to ignore mouse events that are simulated by the browser\n // after a touch event\n invalidPointer = invalidPointer\n || (new Date().getTime() - prevTouchTime < 500)\n // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated\n || event.timeStamp === 0;\n }\n\n if (!invalidPointer) {\n let interaction = finder.search(event, event.type, eventTarget);\n\n if (!interaction) {\n interaction = new Interaction({ pointerType });\n }\n\n matches.push([event, interaction]);\n }\n }\n\n for (const [pointer, interaction] of matches) {\n interaction._updateEventTargets(eventTarget, curEventTarget);\n interaction[method](pointer, event, eventTarget, curEventTarget);\n }\n });\n}\n\nfunction endAll (event) {\n for (let i = 0; i < scope.interactions.length; i++) {\n const interaction = scope.interactions[i];\n\n interaction.end(event);\n signals.fire('endall', { event, interaction });\n }\n}\n\nconst docEvents = { /* 'eventType': listenerFunc */ };\nconst pEventTypes = browser.pEventTypes;\n\nif (domObjects.PointerEvent) {\n docEvents[pEventTypes.down ] = listeners.pointerDown;\n docEvents[pEventTypes.move ] = listeners.pointerMove;\n docEvents[pEventTypes.up ] = listeners.pointerUp;\n docEvents[pEventTypes.cancel] = listeners.pointerUp;\n}\nelse {\n docEvents.mousedown = listeners.pointerDown;\n docEvents.mousemove = listeners.pointerMove;\n docEvents.mouseup = listeners.pointerUp;\n\n docEvents.touchstart = listeners.pointerDown;\n docEvents.touchmove = listeners.pointerMove;\n docEvents.touchend = listeners.pointerUp;\n docEvents.touchcancel = listeners.pointerUp;\n}\n\ndocEvents.blur = endAll;\n\nfunction onDocSignal ({ doc }, signalName) {\n const eventMethod = signalName.indexOf('add') === 0\n ? events.add : events.remove;\n\n // delegate event listener\n for (const eventType in scope.delegatedEvents) {\n eventMethod(doc, eventType, events.delegateListener);\n eventMethod(doc, eventType, events.delegateUseCapture, true);\n }\n\n for (const eventType in docEvents) {\n eventMethod(doc, eventType, docEvents[eventType]);\n }\n}\n\nsignals.on('update-pointer-down', ({ interaction, pointer, pointerId, pointerIndex, event, eventTarget, down }) => {\n interaction.pointerIds[pointerIndex] = pointerId;\n interaction.pointers[pointerIndex] = pointer;\n\n if (down) {\n interaction.pointerIsDown = true;\n }\n\n if (!interaction.interacting()) {\n utils.setCoords(interaction.startCoords, interaction.pointers);\n\n utils.copyCoords(interaction.curCoords , interaction.startCoords);\n utils.copyCoords(interaction.prevCoords, interaction.startCoords);\n\n interaction.downEvent = event;\n interaction.downTimes[pointerIndex] = interaction.curCoords.timeStamp;\n interaction.downTargets[pointerIndex] = eventTarget || event && utils.getEventTargets(event)[0];\n interaction.pointerWasMoved = false;\n\n utils.pointerExtend(interaction.downPointer, pointer);\n }\n});\n\nscope.signals.on('add-document' , onDocSignal);\nscope.signals.on('remove-document', onDocSignal);\n\nInteraction.pointerMoveTolerance = 1;\nInteraction.doOnInteractions = doOnInteractions;\nInteraction.endAll = endAll;\nInteraction.signals = signals;\nInteraction.docEvents = docEvents;\n\nscope.endAllInteractions = endAll;\n\nmodule.exports = Interaction;\n","const Interaction = require('../Interaction');\nconst InteractEvent = require('../InteractEvent');\n\nconst actions = {\n firePrepared,\n names: [],\n methodDict: {},\n};\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n interaction._interacting = true;\n firePrepared(interaction, event, 'start');\n});\n\nInteraction.signals.on('action-move', function ({ interaction, event, preEnd }) {\n firePrepared(interaction, event, 'move', preEnd);\n\n // if the action was ended in a listener\n if (!interaction.interacting()) { return false; }\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n firePrepared(interaction, event, 'end');\n});\n\nfunction firePrepared (interaction, event, phase, preEnd) {\n const actionName = interaction.prepared.name;\n\n const newEvent = new InteractEvent(interaction, event, actionName, phase, interaction.element, null, preEnd);\n\n interaction.target.fire(newEvent);\n interaction.prevEvent = newEvent;\n}\n\nmodule.exports = actions;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drag = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n startAxis : 'xy',\n lockAxis : 'xy',\n },\n\n checker: function (pointer, event, interactable) {\n const dragOptions = interactable.options.drag;\n\n return dragOptions.enabled\n ? { name: 'drag', axis: (dragOptions.lockAxis === 'start'\n ? dragOptions.startAxis\n : dragOptions.lockAxis)}\n : null;\n },\n\n getCursor: function () {\n return 'move';\n },\n};\n\nInteraction.signals.on('before-action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n interaction.curCoords.page.y = interaction.startCoords.page.y;\n interaction.curCoords.client.y = interaction.startCoords.client.y;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vx);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vx);\n interaction.pointerDelta.client.vy = 0;\n interaction.pointerDelta.page.vy = 0;\n }\n else if (axis === 'y') {\n interaction.curCoords.page.x = interaction.startCoords.page.x;\n interaction.curCoords.client.x = interaction.startCoords.client.x;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vy);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vy);\n interaction.pointerDelta.client.vx = 0;\n interaction.pointerDelta.page.vx = 0;\n }\n});\n\n// dragmove\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'dragmove') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n iEvent.pageY = interaction.startCoords.page.y;\n iEvent.clientY = interaction.startCoords.client.y;\n iEvent.dy = 0;\n }\n else if (axis === 'y') {\n iEvent.pageX = interaction.startCoords.page.x;\n iEvent.clientX = interaction.startCoords.client.x;\n iEvent.dx = 0;\n }\n});\n\n/*\\\n * Interactable.draggable\n [ method ]\n *\n * Gets or sets whether drag actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of drag events\n | var isDraggable = interact('ul li').draggable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on drag events (object makes the Interactable draggable)\n = (object) This Interactable\n | interact(element).draggable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // the axis in which the first movement must be\n | // for the drag sequence to start\n | // 'xy' by default - any direction\n | startAxis: 'x' || 'y' || 'xy',\n |\n | // 'xy' by default - don't restrict to one axis (move in any direction)\n | // 'x' or 'y' to restrict movement to either axis\n | // 'start' to restrict movement to the axis the drag started in\n | lockAxis: 'x' || 'y' || 'xy' || 'start',\n |\n | // max number of drags that can happen concurrently\n | // with elements of this Interactable. Infinity by default\n | max: Infinity,\n |\n | // max number of drags that can target the same element+Interactable\n | // 1 by default\n | maxPerElement: 2\n | });\n\\*/\nInteractable.prototype.draggable = function (options) {\n if (utils.is.object(options)) {\n this.options.drag.enabled = options.enabled === false? false: true;\n this.setPerAction('drag', options);\n this.setOnEvents('drag', options);\n\n if (/^(xy|x|y|start)$/.test(options.lockAxis)) {\n this.options.drag.lockAxis = options.lockAxis;\n }\n if (/^(xy|x|y)$/.test(options.startAxis)) {\n this.options.drag.startAxis = options.startAxis;\n }\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drag.enabled = options;\n\n if (!options) {\n this.ondragstart = this.ondragstart = this.ondragend = null;\n }\n\n return this;\n }\n\n return this.options.drag;\n};\n\nactions.drag = drag;\nactions.names.push('drag');\nutils.merge(Interactable.eventTypes, [\n 'dragstart',\n 'dragmove',\n 'draginertiastart',\n 'draginertiaresume',\n 'dragend',\n]);\nactions.methodDict.drag = 'draggable';\n\ndefaultOptions.drag = drag.defaults;\n\nmodule.exports = drag;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst scope = require('../scope');\nconst interact = require('../interact');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drop = {\n defaults: {\n enabled: false,\n accept : null,\n overlap: 'pointer',\n },\n};\n\nlet dynamicDrop = false;\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // reset active dropzones\n interaction.activeDrops.dropzones = [];\n interaction.activeDrops.elements = [];\n interaction.activeDrops.rects = [];\n\n interaction.dropEvents = null;\n\n if (!interaction.dynamicDrop) {\n setActiveDrops(interaction, interaction.element);\n }\n\n const dragEvent = interaction.prevEvent;\n const dropEvents = getDropEvents(interaction, event, dragEvent);\n\n if (dropEvents.activate) {\n fireActiveDrops(interaction, dropEvents.activate);\n }\n});\n\nInteractEvent.signals.on('new', function ({ interaction, iEvent, event }) {\n if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { return; }\n\n const draggableElement = interaction.element;\n const dragEvent = iEvent;\n const dropResult = getDrop(dragEvent, event, draggableElement);\n\n interaction.dropTarget = dropResult.dropzone;\n interaction.dropElement = dropResult.element;\n\n interaction.dropEvents = getDropEvents(interaction, event, dragEvent);\n});\n\nInteraction.signals.on('action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n fireDropEvents(interaction, interaction.dropEvents);\n});\n\nInteraction.signals.on('action-end', function ({ interaction }) {\n if (interaction.prepared.name === 'drag') {\n fireDropEvents(interaction, interaction.dropEvents);\n }\n});\n\nInteraction.signals.on('stop-drag', function ({ interaction }) {\n interaction.activeDrops.dropzones =\n interaction.activeDrops.elements =\n interaction.activeDrops.rects =\n interaction.dropEvents = null;\n});\n\nfunction collectDrops (interaction, element) {\n const drops = [];\n const elements = [];\n\n element = element || interaction.element;\n\n // collect all dropzones and their elements which qualify for a drop\n for (const current of scope.interactables) {\n if (!current.options.drop.enabled) { continue; }\n\n const accept = current.options.drop.accept;\n\n // test the draggable element against the dropzone's accept setting\n if ((utils.is.element(accept) && accept !== element)\n || (utils.is.string(accept)\n && !utils.matchesSelector(element, accept))) {\n\n continue;\n }\n\n // query for new elements if necessary\n const dropElements = utils.is.string(current.target)\n ? current._context.querySelectorAll(current.target)\n : [current.target];\n\n for (let i = 0; i < dropElements.length; i++) {\n const currentElement = dropElements[i];\n\n if (currentElement !== element) {\n drops.push(current);\n elements.push(currentElement);\n }\n }\n }\n\n return {\n elements,\n dropzones: drops,\n };\n}\n\nfunction fireActiveDrops (interaction, event) {\n let prevElement;\n\n // loop through all active dropzones and trigger event\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n const current = interaction.activeDrops.dropzones[i];\n const currentElement = interaction.activeDrops.elements [i];\n\n // prevent trigger of duplicate events on same element\n if (currentElement !== prevElement) {\n // set current element as event target\n event.target = currentElement;\n current.fire(event);\n }\n prevElement = currentElement;\n }\n}\n\n// Collect a new set of possible drops and save them in activeDrops.\n// setActiveDrops should always be called when a drag has just started or a\n// drag event happens while dynamicDrop is true\nfunction setActiveDrops (interaction, dragElement) {\n // get dropzones and their elements that could receive the draggable\n const possibleDrops = collectDrops(interaction, dragElement, true);\n\n interaction.activeDrops.dropzones = possibleDrops.dropzones;\n interaction.activeDrops.elements = possibleDrops.elements;\n interaction.activeDrops.rects = [];\n\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n interaction.activeDrops.rects[i] =\n interaction.activeDrops.dropzones[i].getRect(interaction.activeDrops.elements[i]);\n }\n}\n\nfunction getDrop (dragEvent, event, dragElement) {\n const interaction = dragEvent.interaction;\n const validDrops = [];\n\n if (dynamicDrop) {\n setActiveDrops(interaction, dragElement);\n }\n\n // collect all dropzones and their elements which qualify for a drop\n for (let j = 0; j < interaction.activeDrops.dropzones.length; j++) {\n const current = interaction.activeDrops.dropzones[j];\n const currentElement = interaction.activeDrops.elements [j];\n const rect = interaction.activeDrops.rects [j];\n\n validDrops.push(current.dropCheck(dragEvent, event, interaction.target, dragElement, currentElement, rect)\n ? currentElement\n : null);\n }\n\n // get the most appropriate dropzone based on DOM depth and order\n const dropIndex = utils.indexOfDeepestElement(validDrops);\n\n return {\n dropzone: interaction.activeDrops.dropzones[dropIndex] || null,\n element : interaction.activeDrops.elements [dropIndex] || null,\n };\n}\n\nfunction getDropEvents (interaction, pointerEvent, dragEvent) {\n const dropEvents = {\n enter : null,\n leave : null,\n activate : null,\n deactivate: null,\n move : null,\n drop : null,\n };\n\n const tmpl = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n };\n\n if (interaction.dropElement !== interaction.prevDropElement) {\n // if there was a prevDropTarget, create a dragleave event\n if (interaction.prevDropTarget) {\n dropEvents.leave = utils.extend({ type: 'dragleave' }, tmpl);\n\n dragEvent.dragLeave = dropEvents.leave.target = interaction.prevDropElement;\n dragEvent.prevDropzone = dropEvents.leave.dropzone = interaction.prevDropTarget;\n }\n // if the dropTarget is not null, create a dragenter event\n if (interaction.dropTarget) {\n dropEvents.enter = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n type : 'dragenter',\n };\n\n dragEvent.dragEnter = interaction.dropElement;\n dragEvent.dropzone = interaction.dropTarget;\n }\n }\n\n if (dragEvent.type === 'dragend' && interaction.dropTarget) {\n dropEvents.drop = utils.extend({ type: 'drop' }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n dragEvent.relatedTarget = interaction.dropElement;\n }\n if (dragEvent.type === 'dragstart') {\n dropEvents.activate = utils.extend({ type: 'dropactivate' }, tmpl);\n\n dropEvents.activate.target = null;\n dropEvents.activate.dropzone = null;\n }\n if (dragEvent.type === 'dragend') {\n dropEvents.deactivate = utils.extend({ type: 'dropdeactivate' }, tmpl);\n\n dropEvents.deactivate.target = null;\n dropEvents.deactivate.dropzone = null;\n }\n if (dragEvent.type === 'dragmove' && interaction.dropTarget) {\n dropEvents.move = utils.extend({\n dragmove : dragEvent,\n type : 'dropmove',\n }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n }\n\n return dropEvents;\n}\n\nfunction fireDropEvents (interaction, dropEvents) {\n if (dropEvents.leave) { interaction.prevDropTarget.fire(dropEvents.leave); }\n if (dropEvents.move ) { interaction.dropTarget.fire(dropEvents.move ); }\n if (dropEvents.enter) { interaction.dropTarget.fire(dropEvents.enter); }\n if (dropEvents.drop ) { interaction.dropTarget.fire(dropEvents.drop ); }\n if (dropEvents.deactivate) {\n fireActiveDrops(interaction, dropEvents.deactivate);\n }\n\n interaction.prevDropTarget = interaction.dropTarget;\n interaction.prevDropElement = interaction.dropElement;\n}\n\n/*\\\n * Interactable.dropzone\n [ method ]\n *\n * Returns or sets whether elements can be dropped onto this\n * Interactable to trigger drop events\n *\n * Dropzones can receive the following events:\n * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends\n * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone\n * - `dragmove` when a draggable that has entered the dropzone is moved\n * - `drop` when a draggable is dropped into this dropzone\n *\n * Use the `accept` option to allow only elements that match the given CSS\n * selector or element. The value can be:\n *\n * - **an Element** - only that element can be dropped into this dropzone.\n * - **a string**, - the element being dragged must match it as a CSS selector.\n * - **`null`** - accept options is cleared - it accepts any element.\n *\n * Use the `overlap` option to set how drops are checked for. The allowed\n * values are:\n *\n * - `'pointer'`, the pointer must be over the dropzone (default)\n * - `'center'`, the draggable element's center must be over the dropzone\n * - a number from 0-1 which is the `(intersection area) / (draggable area)`.\n * e.g. `0.5` for drop to happen when half of the area of the draggable is\n * over the dropzone\n *\n * Use the `checker` option to specify a function to check if a dragged\n * element is over this Interactable.\n *\n | interact(target)\n | .dropChecker(function(dragEvent, // related dragmove or dragend event\n | event, // TouchEvent/PointerEvent/MouseEvent\n | dropped, // bool result of the default checker\n | dropzone, // dropzone Interactable\n | dropElement, // dropzone elemnt\n | draggable, // draggable Interactable\n | draggableElement) {// draggable element\n |\n | return dropped && event.target.hasAttribute('allow-drop');\n | }\n *\n *\n - options (boolean | object | null) #optional The new value to be set.\n | interact('.drop').dropzone({\n | accept: '.can-drop' || document.getElementById('single-drop'),\n | overlap: 'pointer' || 'center' || zeroToOne\n | }\n = (boolean | object) The current setting or this Interactable\n\\*/\nInteractable.prototype.dropzone = function (options) {\n if (utils.is.object(options)) {\n this.options.drop.enabled = options.enabled === false? false: true;\n\n if (utils.is.function(options.ondrop) ) { this.events.ondrop = options.ondrop ; }\n if (utils.is.function(options.ondropactivate) ) { this.events.ondropactivate = options.ondropactivate ; }\n if (utils.is.function(options.ondropdeactivate)) { this.events.ondropdeactivate = options.ondropdeactivate; }\n if (utils.is.function(options.ondragenter) ) { this.events.ondragenter = options.ondragenter ; }\n if (utils.is.function(options.ondragleave) ) { this.events.ondragleave = options.ondragleave ; }\n if (utils.is.function(options.ondropmove) ) { this.events.ondropmove = options.ondropmove ; }\n\n if (/^(pointer|center)$/.test(options.overlap)) {\n this.options.drop.overlap = options.overlap;\n }\n else if (utils.is.number(options.overlap)) {\n this.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0);\n }\n if ('accept' in options) {\n this.options.drop.accept = options.accept;\n }\n if ('checker' in options) {\n this.options.drop.checker = options.checker;\n }\n\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drop.enabled = options;\n\n if (!options) {\n this.ondragenter = this.ondragleave = this.ondrop\n = this.ondropactivate = this.ondropdeactivate = null;\n }\n\n return this;\n }\n\n return this.options.drop;\n};\n\nInteractable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) {\n let dropped = false;\n\n // if the dropzone has no rect (eg. display: none)\n // call the custom dropChecker or just return false\n if (!(rect = rect || this.getRect(dropElement))) {\n return (this.options.drop.checker\n ? this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement)\n : false);\n }\n\n const dropOverlap = this.options.drop.overlap;\n\n if (dropOverlap === 'pointer') {\n const origin = utils.getOriginXY(draggable, draggableElement, 'drag');\n const page = utils.getPageXY(dragEvent);\n\n page.x += origin.x;\n page.y += origin.y;\n\n const horizontal = (page.x > rect.left) && (page.x < rect.right);\n const vertical = (page.y > rect.top ) && (page.y < rect.bottom);\n\n dropped = horizontal && vertical;\n }\n\n const dragRect = draggable.getRect(draggableElement);\n\n if (dragRect && dropOverlap === 'center') {\n const cx = dragRect.left + dragRect.width / 2;\n const cy = dragRect.top + dragRect.height / 2;\n\n dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom;\n }\n\n if (dragRect && utils.is.number(dropOverlap)) {\n const overlapArea = (Math.max(0, Math.min(rect.right , dragRect.right ) - Math.max(rect.left, dragRect.left))\n * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top , dragRect.top )));\n\n const overlapRatio = overlapArea / (dragRect.width * dragRect.height);\n\n dropped = overlapRatio >= dropOverlap;\n }\n\n if (this.options.drop.checker) {\n dropped = this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement);\n }\n\n return dropped;\n};\n\nInteractable.signals.on('unset', function ({ interactable }) {\n interactable.dropzone(false);\n});\n\nInteractable.settingsMethods.push('dropChecker');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.dropTarget = null; // the dropzone a drag target might be dropped into\n interaction.dropElement = null; // the element at the time of checking\n interaction.prevDropTarget = null; // the dropzone that was recently dragged away from\n interaction.prevDropElement = null; // the element at the time of checking\n interaction.dropEvents = null; // the dropEvents related to the current drag event\n\n interaction.activeDrops = {\n dropzones: [], // the dropzones that are mentioned below\n elements : [], // elements of dropzones that accept the target draggable\n rects : [], // the rects of the elements mentioned above\n };\n\n});\n\nInteraction.signals.on('stop', function ({ interaction }) {\n interaction.dropTarget = interaction.dropElement =\n interaction.prevDropTarget = interaction.prevDropElement = null;\n});\n\n/*\\\n * interact.dynamicDrop\n [ method ]\n *\n * Returns or sets whether the dimensions of dropzone elements are\n * calculated on every dragmove or only on dragstart for the default\n * dropChecker\n *\n - newValue (boolean) #optional True to check on each move. False to check only before start\n = (boolean | interact) The current setting or interact\n\\*/\ninteract.dynamicDrop = function (newValue) {\n if (utils.is.bool(newValue)) {\n //if (dragging && dynamicDrop !== newValue && !newValue) {\n //calcRects(dropzones);\n //}\n\n dynamicDrop = newValue;\n\n return interact;\n }\n return dynamicDrop;\n};\n\nutils.merge(Interactable.eventTypes, [\n 'dragenter',\n 'dragleave',\n 'dropactivate',\n 'dropdeactivate',\n 'dropmove',\n 'drop',\n]);\nactions.methodDict.drop = 'dropzone';\n\ndefaultOptions.drop = drop.defaults;\n\nmodule.exports = drop;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst gesture = {\n defaults: {\n enabled : false,\n origin : null,\n restrict: null,\n },\n\n checker: function (pointer, event, interactable, element, interaction) {\n if (interaction.pointerIds.length >= 2) {\n return { name: 'gesture' };\n }\n\n return null;\n },\n\n getCursor: function () {\n return '';\n },\n};\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturestart') { return; }\n iEvent.ds = 0;\n\n interaction.gesture.startDistance = interaction.gesture.prevDistance = iEvent.distance;\n interaction.gesture.startAngle = interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.scale = 1;\n});\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturemove') { return; }\n\n iEvent.ds = iEvent.scale - interaction.gesture.scale;\n\n interaction.target.fire(iEvent);\n\n interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.prevDistance = iEvent.distance;\n\n if (iEvent.scale !== Infinity\n && iEvent.scale !== null\n && iEvent.scale !== undefined\n && !isNaN(iEvent.scale)) {\n\n interaction.gesture.scale = iEvent.scale;\n }\n});\n\n/*\\\n * Interactable.gesturable\n [ method ]\n *\n * Gets or sets whether multitouch gestures can be performed on the\n * Interactable's element\n *\n = (boolean) Indicates if this can be the target of gesture events\n | var isGestureable = interact(element).gesturable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on gesture events (makes the Interactable gesturable)\n = (object) this Interactable\n | interact(element).gesturable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // limit multiple gestures.\n | // See the explanation in @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n\\*/\nInteractable.prototype.gesturable = function (options) {\n if (utils.is.object(options)) {\n this.options.gesture.enabled = options.enabled === false? false: true;\n this.setPerAction('gesture', options);\n this.setOnEvents('gesture', options);\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.gesture.enabled = options;\n\n if (!options) {\n this.ongesturestart = this.ongesturestart = this.ongestureend = null;\n }\n\n return this;\n }\n\n return this.options.gesture;\n};\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action, event, starting, ending, deltaSource }) {\n if (action !== 'gesture') { return; }\n\n const pointers = interaction.pointers;\n\n iEvent.touches = [pointers[0], pointers[1]];\n\n if (starting) {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = 1;\n iEvent.ds = 0;\n iEvent.angle = utils.touchAngle(pointers, undefined, deltaSource);\n iEvent.da = 0;\n }\n else if (ending || event instanceof InteractEvent) {\n iEvent.distance = interaction.prevEvent.distance;\n iEvent.box = interaction.prevEvent.box;\n iEvent.scale = interaction.prevEvent.scale;\n iEvent.ds = iEvent.scale - 1;\n iEvent.angle = interaction.prevEvent.angle;\n iEvent.da = iEvent.angle - interaction.gesture.startAngle;\n }\n else {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = iEvent.distance / interaction.gesture.startDistance;\n iEvent.angle = utils.touchAngle(pointers, interaction.gesture.prevAngle, deltaSource);\n\n iEvent.ds = iEvent.scale - interaction.gesture.prevScale;\n iEvent.da = iEvent.angle - interaction.gesture.prevAngle;\n }\n});\n\nInteraction.signals.on('new', function (interaction) {\n interaction.gesture = {\n start: { x: 0, y: 0 },\n\n startDistance: 0, // distance between two touches of touchStart\n prevDistance : 0,\n distance : 0,\n\n scale: 1, // gesture.distance / gesture.startDistance\n\n startAngle: 0, // angle of line joining two touches\n prevAngle : 0, // angle of the previous gesture event\n };\n});\n\nactions.gesture = gesture;\nactions.names.push('gesture');\nutils.merge(Interactable.eventTypes, [\n 'gesturestart',\n 'gesturemove',\n 'gestureend',\n]);\nactions.methodDict.gesture = 'gesturable';\n\ndefaultOptions.gesture = gesture.defaults;\n\nmodule.exports = gesture;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\n// Less Precision with touch input\nconst defaultMargin = browser.supportsTouch || browser.supportsPointerEvent? 20: 10;\n\nconst resize = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n square: false,\n preserveAspectRatio: false,\n axis: 'xy',\n\n // use default margin\n margin: NaN,\n\n // object with props left, right, top, bottom which are\n // true/false values to resize when the pointer is over that edge,\n // CSS selectors to match the handles for each direction\n // or the Elements for each handle\n edges: null,\n\n // a value of 'none' will limit the resize rect to a minimum of 0x0\n // 'negate' will alow the rect to have negative width/height\n // 'reposition' will keep the width/height positive by swapping\n // the top and bottom edges and/or swapping the left and right edges\n invert: 'none',\n },\n\n checker: function (pointer, event, interactable, element, interaction, rect) {\n if (!rect) { return null; }\n\n const page = utils.extend({}, interaction.curCoords.page);\n const options = interactable.options;\n\n if (options.resize.enabled) {\n const resizeOptions = options.resize;\n const resizeEdges = { left: false, right: false, top: false, bottom: false };\n\n // if using resize.edges\n if (utils.is.object(resizeOptions.edges)) {\n for (const edge in resizeEdges) {\n resizeEdges[edge] = checkResizeEdge(edge,\n resizeOptions.edges[edge],\n page,\n interaction._eventTarget,\n element,\n rect,\n resizeOptions.margin || defaultMargin);\n }\n\n resizeEdges.left = resizeEdges.left && !resizeEdges.right;\n resizeEdges.top = resizeEdges.top && !resizeEdges.bottom;\n\n if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) {\n return {\n name: 'resize',\n edges: resizeEdges,\n };\n }\n }\n else {\n const right = options.resize.axis !== 'y' && page.x > (rect.right - defaultMargin);\n const bottom = options.resize.axis !== 'x' && page.y > (rect.bottom - defaultMargin);\n\n if (right || bottom) {\n return {\n name: 'resize',\n axes: (right? 'x' : '') + (bottom? 'y' : ''),\n };\n }\n }\n }\n\n return null;\n },\n\n cursors: (browser.isIe9OrOlder ? {\n x : 'e-resize',\n y : 's-resize',\n xy: 'se-resize',\n\n top : 'n-resize',\n left : 'w-resize',\n bottom : 's-resize',\n right : 'e-resize',\n topleft : 'se-resize',\n bottomright: 'se-resize',\n topright : 'ne-resize',\n bottomleft : 'ne-resize',\n } : {\n x : 'ew-resize',\n y : 'ns-resize',\n xy: 'nwse-resize',\n\n top : 'ns-resize',\n left : 'ew-resize',\n bottom : 'ns-resize',\n right : 'ew-resize',\n topleft : 'nwse-resize',\n bottomright: 'nwse-resize',\n topright : 'nesw-resize',\n bottomleft : 'nesw-resize',\n }),\n\n getCursor: function (action) {\n if (action.axis) {\n return resize.cursors[action.name + action.axis];\n }\n else if (action.edges) {\n let cursorKey = '';\n const edgeNames = ['top', 'bottom', 'left', 'right'];\n\n for (let i = 0; i < 4; i++) {\n if (action.edges[edgeNames[i]]) {\n cursorKey += edgeNames[i];\n }\n }\n\n return resize.cursors[cursorKey];\n }\n },\n};\n\n// resizestart\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'resizestart' || !interaction.prepared.edges) {\n return;\n }\n\n const startRect = interaction.target.getRect(interaction.element);\n const resizeOptions = interaction.target.options.resize;\n\n /*\n * When using the `resizable.square` or `resizable.preserveAspectRatio` options, resizing from one edge\n * will affect another. E.g. with `resizable.square`, resizing to make the right edge larger will make\n * the bottom edge larger by the same amount. We call these 'linked' edges. Any linked edges will depend\n * on the active edges and the edge being interacted with.\n */\n if (resizeOptions.square || resizeOptions.preserveAspectRatio) {\n const linkedEdges = utils.extend({}, interaction.prepared.edges);\n\n linkedEdges.top = linkedEdges.top || (linkedEdges.left && !linkedEdges.bottom);\n linkedEdges.left = linkedEdges.left || (linkedEdges.top && !linkedEdges.right );\n linkedEdges.bottom = linkedEdges.bottom || (linkedEdges.right && !linkedEdges.top );\n linkedEdges.right = linkedEdges.right || (linkedEdges.bottom && !linkedEdges.left );\n\n interaction.prepared._linkedEdges = linkedEdges;\n }\n else {\n interaction.prepared._linkedEdges = null;\n }\n\n // if using `resizable.preserveAspectRatio` option, record aspect ratio at the start of the resize\n if (resizeOptions.preserveAspectRatio) {\n interaction.resizeStartAspectRatio = startRect.width / startRect.height;\n }\n\n interaction.resizeRects = {\n start : startRect,\n current : utils.extend({}, startRect),\n inverted : utils.extend({}, startRect),\n previous : utils.extend({}, startRect),\n delta : {\n left: 0, right : 0, width : 0,\n top : 0, bottom: 0, height: 0,\n },\n };\n\n iEvent.rect = interaction.resizeRects.inverted;\n iEvent.deltaRect = interaction.resizeRects.delta;\n});\n\n// resizemove\nInteractEvent.signals.on('new', function ({ iEvent, phase, interaction }) {\n if (phase !== 'move' || !interaction.prepared.edges) { return; }\n\n const resizeOptions = interaction.target.options.resize;\n const invert = resizeOptions.invert;\n const invertible = invert === 'reposition' || invert === 'negate';\n\n let edges = interaction.prepared.edges;\n\n const start = interaction.resizeRects.start;\n const current = interaction.resizeRects.current;\n const inverted = interaction.resizeRects.inverted;\n const delta = interaction.resizeRects.delta;\n const previous = utils.extend(interaction.resizeRects.previous, inverted);\n const originalEdges = edges;\n\n let dx = iEvent.dx;\n let dy = iEvent.dy;\n\n if (resizeOptions.preserveAspectRatio || resizeOptions.square) {\n // `resize.preserveAspectRatio` takes precedence over `resize.square`\n const startAspectRatio = resizeOptions.preserveAspectRatio\n ? interaction.resizeStartAspectRatio\n : 1;\n\n edges = interaction.prepared._linkedEdges;\n\n if ((originalEdges.left && originalEdges.bottom)\n || (originalEdges.right && originalEdges.top)) {\n dy = -dx / startAspectRatio;\n }\n else if (originalEdges.left || originalEdges.right ) { dy = dx / startAspectRatio; }\n else if (originalEdges.top || originalEdges.bottom) { dx = dy * startAspectRatio; }\n }\n\n // update the 'current' rect without modifications\n if (edges.top ) { current.top += dy; }\n if (edges.bottom) { current.bottom += dy; }\n if (edges.left ) { current.left += dx; }\n if (edges.right ) { current.right += dx; }\n\n if (invertible) {\n // if invertible, copy the current rect\n utils.extend(inverted, current);\n\n if (invert === 'reposition') {\n // swap edge values if necessary to keep width/height positive\n let swap;\n\n if (inverted.top > inverted.bottom) {\n swap = inverted.top;\n\n inverted.top = inverted.bottom;\n inverted.bottom = swap;\n }\n if (inverted.left > inverted.right) {\n swap = inverted.left;\n\n inverted.left = inverted.right;\n inverted.right = swap;\n }\n }\n }\n else {\n // if not invertible, restrict to minimum of 0x0 rect\n inverted.top = Math.min(current.top, start.bottom);\n inverted.bottom = Math.max(current.bottom, start.top);\n inverted.left = Math.min(current.left, start.right);\n inverted.right = Math.max(current.right, start.left);\n }\n\n inverted.width = inverted.right - inverted.left;\n inverted.height = inverted.bottom - inverted.top ;\n\n for (const edge in inverted) {\n delta[edge] = inverted[edge] - previous[edge];\n }\n\n iEvent.edges = interaction.prepared.edges;\n iEvent.rect = inverted;\n iEvent.deltaRect = delta;\n});\n\n/*\\\n * Interactable.resizable\n [ method ]\n *\n * Gets or sets whether resize actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of resize elements\n | var isResizeable = interact('input[type=text]').resizable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on resize events (object makes the Interactable resizable)\n = (object) This Interactable\n | interact(element).resizable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | edges: {\n | top : true, // Use pointer coords to check for resize.\n | left : false, // Disable resizing from left edge.\n | bottom: '.resize-s',// Resize if pointer target matches selector\n | right : handleEl // Resize if pointer target is the given Element\n | },\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height are adjusted at a 1:1 ratio.\n | square: false,\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height maintain the aspect ratio they had when resizing started.\n | preserveAspectRatio: false,\n |\n | // a value of 'none' will limit the resize rect to a minimum of 0x0\n | // 'negate' will allow the rect to have negative width/height\n | // 'reposition' will keep the width/height positive by swapping\n | // the top and bottom edges and/or swapping the left and right edges\n | invert: 'none' || 'negate' || 'reposition'\n |\n | // limit multiple resizes.\n | // See the explanation in the @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n \\*/\nInteractable.prototype.resizable = function (options) {\n if (utils.is.object(options)) {\n this.options.resize.enabled = options.enabled === false? false: true;\n this.setPerAction('resize', options);\n this.setOnEvents('resize', options);\n\n if (/^x$|^y$|^xy$/.test(options.axis)) {\n this.options.resize.axis = options.axis;\n }\n else if (options.axis === null) {\n this.options.resize.axis = defaultOptions.resize.axis;\n }\n\n if (utils.is.bool(options.preserveAspectRatio)) {\n this.options.resize.preserveAspectRatio = options.preserveAspectRatio;\n }\n else if (utils.is.bool(options.square)) {\n this.options.resize.square = options.square;\n }\n\n return this;\n }\n if (utils.is.bool(options)) {\n this.options.resize.enabled = options;\n\n if (!options) {\n this.onresizestart = this.onresizestart = this.onresizeend = null;\n }\n\n return this;\n }\n return this.options.resize;\n};\n\nfunction checkResizeEdge (name, value, page, element, interactableElement, rect, margin) {\n // false, '', undefined, null\n if (!value) { return false; }\n\n // true value, use pointer coords and element rect\n if (value === true) {\n // if dimensions are negative, \"switch\" edges\n const width = utils.is.number(rect.width )? rect.width : rect.right - rect.left;\n const height = utils.is.number(rect.height)? rect.height : rect.bottom - rect.top ;\n\n if (width < 0) {\n if (name === 'left' ) { name = 'right'; }\n else if (name === 'right') { name = 'left' ; }\n }\n if (height < 0) {\n if (name === 'top' ) { name = 'bottom'; }\n else if (name === 'bottom') { name = 'top' ; }\n }\n\n if (name === 'left' ) { return page.x < ((width >= 0? rect.left: rect.right ) + margin); }\n if (name === 'top' ) { return page.y < ((height >= 0? rect.top : rect.bottom) + margin); }\n\n if (name === 'right' ) { return page.x > ((width >= 0? rect.right : rect.left) - margin); }\n if (name === 'bottom') { return page.y > ((height >= 0? rect.bottom: rect.top ) - margin); }\n }\n\n // the remaining checks require an element\n if (!utils.is.element(element)) { return false; }\n\n return utils.is.element(value)\n // the value is an element to use as a resize handle\n ? value === element\n // otherwise check if element matches value as selector\n : utils.matchesUpTo(element, value, interactableElement);\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.resizeAxes = 'xy';\n});\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action }) {\n if (action !== 'resize' || !interaction.resizeAxes) { return; }\n\n const options = interaction.target.options;\n\n if (options.resize.square) {\n if (interaction.resizeAxes === 'y') {\n iEvent.dx = iEvent.dy;\n }\n else {\n iEvent.dy = iEvent.dx;\n }\n iEvent.axes = 'xy';\n }\n else {\n iEvent.axes = interaction.resizeAxes;\n\n if (interaction.resizeAxes === 'x') {\n iEvent.dy = 0;\n }\n else if (interaction.resizeAxes === 'y') {\n iEvent.dx = 0;\n }\n }\n});\n\nactions.resize = resize;\nactions.names.push('resize');\nutils.merge(Interactable.eventTypes, [\n 'resizestart',\n 'resizemove',\n 'resizeinertiastart',\n 'resizeinertiaresume',\n 'resizeend',\n]);\nactions.methodDict.resize = 'resizable';\n\ndefaultOptions.resize = resize.defaults;\n\nmodule.exports = resize;\n","const raf = require('./utils/raf');\nconst getWindow = require('./utils/window').getWindow;\nconst is = require('./utils/is');\nconst domUtils = require('./utils/domUtils');\nconst Interaction = require('./Interaction');\nconst defaultOptions = require('./defaultOptions');\n\nconst autoScroll = {\n defaults: {\n enabled : false,\n container: null, // the item that is scrolled (Window or HTMLElement)\n margin : 60,\n speed : 300, // the scroll speed in pixels per second\n },\n\n interaction: null,\n i: null, // the handle returned by window.setInterval\n x: 0, y: 0, // Direction each pulse is to scroll in\n\n isScrolling: false,\n prevTime: 0,\n\n start: function (interaction) {\n autoScroll.isScrolling = true;\n raf.cancel(autoScroll.i);\n\n autoScroll.interaction = interaction;\n autoScroll.prevTime = new Date().getTime();\n autoScroll.i = raf.request(autoScroll.scroll);\n },\n\n stop: function () {\n autoScroll.isScrolling = false;\n raf.cancel(autoScroll.i);\n },\n\n // scroll the window by the values in scroll.x/y\n scroll: function () {\n const options = autoScroll.interaction.target.options[autoScroll.interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(autoScroll.interaction.element);\n const now = new Date().getTime();\n // change in time in seconds\n const dt = (now - autoScroll.prevTime) / 1000;\n // displacement\n const s = options.speed * dt;\n\n if (s >= 1) {\n if (is.window(container)) {\n container.scrollBy(autoScroll.x * s, autoScroll.y * s);\n }\n else if (container) {\n container.scrollLeft += autoScroll.x * s;\n container.scrollTop += autoScroll.y * s;\n }\n\n autoScroll.prevTime = now;\n }\n\n if (autoScroll.isScrolling) {\n raf.cancel(autoScroll.i);\n autoScroll.i = raf.request(autoScroll.scroll);\n }\n },\n check: function (interactable, actionName) {\n const options = interactable.options;\n\n return options[actionName].autoScroll && options[actionName].autoScroll.enabled;\n },\n onInteractionMove: function ({ interaction, pointer }) {\n if (!(interaction.interacting()\n && autoScroll.check(interaction.target, interaction.prepared.name))) {\n return;\n }\n\n if (interaction.simulation) {\n autoScroll.x = autoScroll.y = 0;\n return;\n }\n\n let top;\n let right;\n let bottom;\n let left;\n\n const options = interaction.target.options[interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(interaction.element);\n\n if (is.window(container)) {\n left = pointer.clientX < autoScroll.margin;\n top = pointer.clientY < autoScroll.margin;\n right = pointer.clientX > container.innerWidth - autoScroll.margin;\n bottom = pointer.clientY > container.innerHeight - autoScroll.margin;\n }\n else {\n const rect = domUtils.getElementClientRect(container);\n\n left = pointer.clientX < rect.left + autoScroll.margin;\n top = pointer.clientY < rect.top + autoScroll.margin;\n right = pointer.clientX > rect.right - autoScroll.margin;\n bottom = pointer.clientY > rect.bottom - autoScroll.margin;\n }\n\n autoScroll.x = (right ? 1: left? -1: 0);\n autoScroll.y = (bottom? 1: top? -1: 0);\n\n if (!autoScroll.isScrolling) {\n // set the autoScroll properties to those of the target\n autoScroll.margin = options.margin;\n autoScroll.speed = options.speed;\n\n autoScroll.start(interaction);\n }\n },\n};\n\nInteraction.signals.on('stop-active', function () {\n autoScroll.stop();\n});\n\nInteraction.signals.on('action-move', autoScroll.onInteractionMove);\n\ndefaultOptions.perAction.autoScroll = autoScroll.defaults;\n\nmodule.exports = autoScroll;\n","const Interactable = require('../Interactable');\nconst actions = require('../actions/base');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.ignoreFrom\n [ method ]\n *\n * If the target of the `mousedown`, `pointerdown` or `touchstart`\n * event or any of it's parents match the given CSS selector or\n * Element, no drag/resize/gesture is started.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to not ignore any elements\n = (string | Element | object) The current ignoreFrom value or this Interactable\n **\n | interact(element, { ignoreFrom: document.getElementById('no-action') });\n | // or\n | interact(element).ignoreFrom('input, textarea, a');\n\\*/\nInteractable.prototype.ignoreFrom = function (newValue) {\n return this._backCompatOption('ignoreFrom', newValue);\n};\n\n/*\\\n * Interactable.allowFrom\n [ method ]\n *\n * A drag/resize/gesture is started only If the target of the\n * `mousedown`, `pointerdown` or `touchstart` event or any of it's\n * parents match the given CSS selector or Element.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to allow from any element\n = (string | Element | object) The current allowFrom value or this Interactable\n **\n | interact(element, { allowFrom: document.getElementById('drag-handle') });\n | // or\n | interact(element).allowFrom('.handle');\n\\*/\nInteractable.prototype.allowFrom = function (newValue) {\n return this._backCompatOption('allowFrom', newValue);\n};\n\nInteractable.prototype.testIgnore = function (ignoreFrom, interactableElement, element) {\n if (!ignoreFrom || !is.element(element)) { return false; }\n\n if (is.string(ignoreFrom)) {\n return domUtils.matchesUpTo(element, ignoreFrom, interactableElement);\n }\n else if (is.element(ignoreFrom)) {\n return domUtils.nodeContains(ignoreFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testAllow = function (allowFrom, interactableElement, element) {\n if (!allowFrom) { return true; }\n\n if (!is.element(element)) { return false; }\n\n if (is.string(allowFrom)) {\n return domUtils.matchesUpTo(element, allowFrom, interactableElement);\n }\n else if (is.element(allowFrom)) {\n return domUtils.nodeContains(allowFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testIgnoreAllow = function (options, interactableElement, eventTarget) {\n return (!this.testIgnore(options.ignoreFrom, interactableElement, eventTarget)\n && this.testAllow(options.allowFrom, interactableElement, eventTarget));\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (event.buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\n","const interact = require('../interact');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst actions = require('../actions/base');\nconst defaultOptions = require('../defaultOptions');\nconst browser = require('../utils/browser');\nconst scope = require('../scope');\nconst utils = require('../utils');\nconst signals = require('../utils/Signals').new();\n\nrequire('./InteractableMethods');\n\nconst autoStart = {\n signals,\n withinInteractionLimit,\n // Allow this many interactions to happen simultaneously\n maxInteractions: Infinity,\n defaults: {\n perAction: {\n manualStart: false,\n max: Infinity,\n maxPerElement: 1,\n allowFrom: null,\n ignoreFrom: null,\n },\n },\n setActionDefaults: function (action) {\n utils.extend(action.defaults, autoStart.defaults.perAction);\n },\n};\n\n// set cursor style on mousedown\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget }) {\n if (interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\n// set cursor style on mousemove\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget }) {\n if (!interaction.mouse\n || interaction.pointerIsDown\n || interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\nInteraction.signals.on('move', function (arg) {\n const { interaction, event } = arg;\n\n if (!interaction.pointerIsDown\n || interaction.interacting()\n || !interaction.pointerWasMoved\n || !interaction.prepared.name) {\n return;\n }\n\n signals.fire('before-start', arg);\n\n const target = interaction.target;\n\n if (interaction.prepared.name && target) {\n // check manualStart and interaction limit\n if (target.options[interaction.prepared.name].manualStart\n || !withinInteractionLimit(target, interaction.element, interaction.prepared)) {\n interaction.stop(event);\n }\n else {\n interaction.start(interaction.prepared, target, interaction.element);\n }\n }\n});\n\n// Check if the current target supports the action.\n// If so, return the validated action. Otherwise, return null\nfunction validateAction (action, interactable, element, eventTarget) {\n if (utils.is.object(action)\n && interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget)\n && interactable.options[action.name].enabled\n && withinInteractionLimit(interactable, element, action)) {\n return action;\n }\n\n return null;\n}\n\nfunction validateSelector (interaction, pointer, event, matches, matchElements, eventTarget) {\n for (let i = 0, len = matches.length; i < len; i++) {\n const match = matches[i];\n const matchElement = matchElements[i];\n const action = validateAction(match.getAction(pointer, event, interaction, matchElement),\n match,\n matchElement,\n eventTarget);\n\n if (action) {\n return {\n action,\n target: match,\n element: matchElement,\n };\n }\n }\n\n return {};\n}\n\nfunction getActionInfo (interaction, pointer, event, eventTarget) {\n let matches = [];\n let matchElements = [];\n\n let element = eventTarget;\n let action = null;\n\n function pushMatches (interactable, selector, context) {\n const elements = (browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined);\n\n if (utils.matchesSelector(element, selector, elements)) {\n\n matches.push(interactable);\n matchElements.push(element);\n }\n }\n\n while (utils.is.element(element)) {\n matches = [];\n matchElements = [];\n\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && (action = validateAction(elementInteractable.getAction(pointer, event, interaction, element, eventTarget),\n elementInteractable,\n element,\n eventTarget))\n && !elementInteractable.options[action.name].manualStart) {\n return {\n element,\n action,\n target: elementInteractable,\n };\n }\n else {\n scope.interactables.forEachSelector(pushMatches, element);\n\n const actionInfo = validateSelector(interaction, pointer, event, matches, matchElements, eventTarget);\n\n if (actionInfo.action\n && !actionInfo.target.options[actionInfo.action.name].manualStart) {\n return actionInfo;\n }\n }\n\n element = utils.parentNode(element);\n }\n\n return {};\n}\n\nfunction prepare (interaction, { action, target, element }) {\n action = action || {};\n\n if (interaction.target && interaction.target.options.styleCursor) {\n interaction.target._doc.documentElement.style.cursor = '';\n }\n\n interaction.target = target;\n interaction.element = element;\n utils.copyAction(interaction.prepared, action);\n\n if (target && target.options.styleCursor) {\n const cursor = action? actions[action.name].getCursor(action) : '';\n interaction.target._doc.documentElement.style.cursor = cursor;\n }\n\n signals.fire('prepared', { interaction: interaction });\n}\n\nInteraction.signals.on('stop', function ({ interaction }) {\n const target = interaction.target;\n\n if (target && target.options.styleCursor) {\n target._doc.documentElement.style.cursor = '';\n }\n});\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (utils.is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (utils.is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n const buttons = event.buttons || ({\n 0: 1,\n 1: 4,\n 3: 8,\n 4: 16,\n })[event.button];\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\nfunction withinInteractionLimit (interactable, element, action) {\n const options = interactable.options;\n const maxActions = options[action.name].max;\n const maxPerElement = options[action.name].maxPerElement;\n let activeInteractions = 0;\n let targetCount = 0;\n let targetElementCount = 0;\n\n // no actions if any of these values == 0\n if (!(maxActions && maxPerElement && autoStart.maxInteractions)) { return; }\n\n for (let i = 0, len = scope.interactions.length; i < len; i++) {\n const interaction = scope.interactions[i];\n const otherAction = interaction.prepared.name;\n\n if (!interaction.interacting()) { continue; }\n\n activeInteractions++;\n\n if (activeInteractions >= autoStart.maxInteractions) {\n return false;\n }\n\n if (interaction.target !== interactable) { continue; }\n\n targetCount += (otherAction === action.name)|0;\n\n if (targetCount >= maxActions) {\n return false;\n }\n\n if (interaction.element === element) {\n targetElementCount++;\n\n if (otherAction !== action.name || targetElementCount >= maxPerElement) {\n return false;\n }\n }\n }\n\n return autoStart.maxInteractions > 0;\n}\n\n/*\\\n * interact.maxInteractions\n [ method ]\n **\n * Returns or sets the maximum number of concurrent interactions allowed.\n * By default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables\n * and elements, you need to enable it in the draggable, resizable and\n * gesturable `'max'` and `'maxPerElement'` options.\n **\n - newValue (number) #optional Any number. newValue <= 0 means no interactions.\n\\*/\ninteract.maxInteractions = function (newValue) {\n if (utils.is.number(newValue)) {\n autoStart.maxInteractions = newValue;\n\n return this;\n }\n\n return autoStart.maxInteractions;\n};\n\nInteractable.settingsMethods.push('styleCursor');\nInteractable.settingsMethods.push('actionChecker');\nInteractable.settingsMethods.push('ignoreFrom');\nInteractable.settingsMethods.push('allowFrom');\n\ndefaultOptions.base.actionChecker = null;\ndefaultOptions.base.styleCursor = true;\n\nutils.extend(defaultOptions.perAction, autoStart.defaults.perAction);\n\nmodule.exports = autoStart;\n","const autoStart = require('./base');\nconst Interaction = require('../Interaction');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.delayTimer = null;\n});\n\nautoStart.signals.on('prepared', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.delayTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.target, interaction.element);\n }, delay);\n }\n});\n\nInteraction.signals.on('move', function ({ interaction, duplicate }) {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.delayTimer);\n }\n});\n\n// prevent regular down->move autoStart\nautoStart.signals.on('before-start', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.prepared.name = null;\n }\n});\n","const autoStart = require('./base');\nconst scope = require('../scope');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\n\nconst { matchesSelector, parentNode } = require('../utils/domUtils');\n\nautoStart.setActionDefaults(require('../actions/drag'));\n\nautoStart.signals.on('before-start', function ({ interaction, eventTarget, dx, dy }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // check if a drag is in the correct axis\n const absX = Math.abs(dx);\n const absY = Math.abs(dy);\n const options = interaction.target.options.drag;\n const startAxis = options.startAxis;\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy');\n\n interaction.prepared.axis = options.lockAxis === 'start'\n ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n : options.lockAxis;\n\n // if the movement isn't in the startAxis of the interactable\n if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) {\n // cancel the prepared action\n interaction.prepared.name = null;\n\n // then try to get a drag from another ineractable\n\n if (!interaction.prepared.name) {\n\n let element = eventTarget;\n\n const getDraggable = function (interactable, selector, context) {\n const elements = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n if (interactable === interaction.target) { return; }\n\n if (!options.manualStart\n && !interactable.testIgnoreAllow(options, element, eventTarget)\n && matchesSelector(element, selector, elements)) {\n\n const action = interactable.getAction(interaction.downPointer,\n interaction.downEvent,\n interaction,\n element);\n\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, interactable)\n && autoStart.validateAction(action, interactable, element, eventTarget)) {\n\n return interactable;\n }\n }\n };\n\n let action = null;\n\n // check all interactables\n while (is.element(element)) {\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && elementInteractable !== interaction.target\n && !elementInteractable.options.drag.manualStart) {\n\n action = elementInteractable.getAction(interaction.downPointer, interaction.downEvent, interaction, element);\n }\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, elementInteractable)) {\n\n interaction.prepared.name = 'drag';\n interaction.target = elementInteractable;\n interaction.element = element;\n break;\n }\n\n const selectorInteractable = scope.interactables.forEachSelector(getDraggable, element);\n\n if (selectorInteractable) {\n interaction.prepared.name = 'drag';\n interaction.target = selectorInteractable;\n interaction.element = element;\n break;\n }\n\n element = parentNode(element);\n }\n }\n }\n});\n\nfunction checkStartAxis (startAxis, interactable) {\n if (!interactable) { return false; }\n\n const thisAxis = interactable.options.drag.startAxis;\n\n return (startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis);\n}\n","require('./base').setActionDefaults(require('../actions/gesture'));\n","require('./base').setActionDefaults(require('../actions/resize'));\n","module.exports = {\n base: {\n accept : null,\n preventDefault: 'auto',\n deltaSource : 'page',\n },\n\n perAction: {\n origin: { x: 0, y: 0 },\n\n // only allow left button by default\n // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n mouseButtons: 1,\n\n inertia: {\n enabled : false,\n resistance : 10, // the lambda in exponential decay\n minSpeed : 100, // target speed must be above this for inertia to start\n endSpeed : 10, // the speed at which inertia is slow enough to stop\n allowResume : true, // allow resuming an action in inertia phase\n smoothEndDuration: 300, // animate to snap/restrict endOnly if there's no inertia\n },\n },\n};\n","/* browser entry point */\n\n// Legacy browser support\nrequire('./legacyBrowsers');\n\n// inertia\nrequire('./inertia');\n\n// modifiers\nrequire('./modifiers/snap');\nrequire('./modifiers/restrict');\n\n// pointerEvents\nrequire('./pointerEvents/base');\nrequire('./pointerEvents/holdRepeat');\nrequire('./pointerEvents/interactableTargets');\n\n// delay\nrequire('./autoStart/delay');\n\n// actions\nrequire('./actions/gesture');\nrequire('./actions/resize');\nrequire('./actions/drag');\nrequire('./actions/drop');\n\n// load these modifiers after resize is loaded\nrequire('./modifiers/snapSize');\nrequire('./modifiers/restrictEdges');\nrequire('./modifiers/restrictSize');\n\n// autoStart actions\nrequire('./autoStart/gesture');\nrequire('./autoStart/resize');\nrequire('./autoStart/drag');\n\n// Interactable preventDefault setting\nrequire('./interactablePreventDefault.js');\n\n// autoScroll\nrequire('./autoScroll');\n\n// export interact\nmodule.exports = require('./interact');\n","const InteractEvent = require('./InteractEvent');\nconst Interaction = require('./Interaction');\nconst modifiers = require('./modifiers');\nconst utils = require('./utils');\nconst animationFrame = require('./utils/raf');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.inertiaStatus = {\n active : false,\n smoothEnd : false,\n allowResume: false,\n\n startEvent: null,\n upCoords : {},\n\n xe: 0, ye: 0,\n sx: 0, sy: 0,\n\n t0: 0,\n vx0: 0, vys: 0,\n duration: 0,\n\n lambda_v0: 0,\n one_ve_v0: 0,\n i : null,\n };\n\n interaction.boundInertiaFrame = () => inertiaFrame .apply(interaction);\n interaction.boundSmoothEndFrame = () => smoothEndFrame.apply(interaction);\n});\n\nInteraction.signals.on('down', function ({ interaction, event, pointer, eventTarget }) {\n const status = interaction.inertiaStatus;\n\n // Check if the down event hits the current inertia target\n if (status.active) {\n let element = eventTarget;\n\n // climb up the DOM tree from the event target\n while (utils.is.element(element)) {\n\n // if interaction element is the current inertia target element\n if (element === interaction.element) {\n // stop inertia\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n\n // update pointers to the down event's coordinates\n interaction.updatePointer(pointer);\n utils.setCoords(interaction.curCoords, interaction.pointers);\n\n // fire appropriate signals\n const signalArg = { interaction };\n Interaction.signals.fire('before-action-move', signalArg);\n Interaction.signals.fire('action-resume' , signalArg);\n\n // fire a reume event\n const resumeEvent = new InteractEvent(interaction,\n event,\n interaction.prepared.name,\n 'inertiaresume',\n interaction.element);\n\n interaction.target.fire(resumeEvent);\n interaction.prevEvent = resumeEvent;\n modifiers.resetStatuses(interaction.modifierStatuses);\n\n utils.copyCoords(interaction.prevCoords, interaction.curCoords);\n break;\n }\n\n element = utils.parentNode(element);\n }\n }\n});\n\nInteraction.signals.on('up', function ({ interaction, event }) {\n const status = interaction.inertiaStatus;\n\n if (!interaction.interacting() || status.active) { return; }\n\n const target = interaction.target;\n const options = target && target.options;\n const inertiaOptions = options && interaction.prepared.name && options[interaction.prepared.name].inertia;\n\n const now = new Date().getTime();\n const statuses = {};\n const page = utils.extend({}, interaction.curCoords.page);\n const pointerSpeed = interaction.pointerDelta.client.speed;\n\n let smoothEnd = false;\n let modifierResult;\n\n // check if inertia should be started\n const inertiaPossible = (inertiaOptions && inertiaOptions.enabled\n && interaction.prepared.name !== 'gesture'\n && event !== status.startEvent);\n\n const inertia = (inertiaPossible\n && (now - interaction.curCoords.timeStamp) < 50\n && pointerSpeed > inertiaOptions.minSpeed\n && pointerSpeed > inertiaOptions.endSpeed);\n\n const modifierArg = {\n interaction,\n pageCoords: page,\n statuses,\n preEnd: true,\n requireEndOnly: true,\n };\n\n // smoothEnd\n if (inertiaPossible && !inertia) {\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n if (modifierResult.shouldMove && modifierResult.locked) {\n smoothEnd = true;\n }\n }\n\n if (!(inertia || smoothEnd)) { return; }\n\n utils.copyCoords(status.upCoords, interaction.curCoords);\n\n interaction.pointers[0] = status.startEvent =\n new InteractEvent(interaction, event, interaction.prepared.name, 'inertiastart', interaction.element);\n\n status.t0 = now;\n\n status.active = true;\n status.allowResume = inertiaOptions.allowResume;\n interaction.simulation = status;\n\n target.fire(status.startEvent);\n\n if (inertia) {\n status.vx0 = interaction.pointerDelta.client.vx;\n status.vy0 = interaction.pointerDelta.client.vy;\n status.v0 = pointerSpeed;\n\n calcInertia(interaction, status);\n\n utils.extend(page, interaction.curCoords.page);\n\n page.x += status.xe;\n page.y += status.ye;\n\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n status.modifiedXe += modifierResult.dx;\n status.modifiedYe += modifierResult.dy;\n\n status.i = animationFrame.request(interaction.boundInertiaFrame);\n }\n else {\n status.smoothEnd = true;\n status.xe = modifierResult.dx;\n status.ye = modifierResult.dy;\n\n status.sx = status.sy = 0;\n\n status.i = animationFrame.request(interaction.boundSmoothEndFrame);\n }\n});\n\nInteraction.signals.on('stop-active', function ({ interaction }) {\n const status = interaction.inertiaStatus;\n\n if (status.active) {\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n }\n});\n\nfunction calcInertia (interaction, status) {\n const inertiaOptions = interaction.target.options[interaction.prepared.name].inertia;\n const lambda = inertiaOptions.resistance;\n const inertiaDur = -Math.log(inertiaOptions.endSpeed / status.v0) / lambda;\n\n status.x0 = interaction.prevEvent.pageX;\n status.y0 = interaction.prevEvent.pageY;\n status.t0 = status.startEvent.timeStamp / 1000;\n status.sx = status.sy = 0;\n\n status.modifiedXe = status.xe = (status.vx0 - inertiaDur) / lambda;\n status.modifiedYe = status.ye = (status.vy0 - inertiaDur) / lambda;\n status.te = inertiaDur;\n\n status.lambda_v0 = lambda / status.v0;\n status.one_ve_v0 = 1 - inertiaOptions.endSpeed / status.v0;\n}\n\nfunction inertiaFrame () {\n updateInertiaCoords(this);\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n\n const status = this.inertiaStatus;\n const options = this.target.options[this.prepared.name].inertia;\n const lambda = options.resistance;\n const t = new Date().getTime() / 1000 - status.t0;\n\n if (t < status.te) {\n\n const progress = 1 - (Math.exp(-lambda * t) - status.lambda_v0) / status.one_ve_v0;\n\n if (status.modifiedXe === status.xe && status.modifiedYe === status.ye) {\n status.sx = status.xe * progress;\n status.sy = status.ye * progress;\n }\n else {\n const quadPoint = utils.getQuadraticCurvePoint(0, 0,\n status.xe,\n status.ye,\n status.modifiedXe,\n status.modifiedYe,\n progress);\n\n status.sx = quadPoint.x;\n status.sy = quadPoint.y;\n }\n\n this.doMove();\n\n status.i = animationFrame.request(this.boundInertiaFrame);\n }\n else {\n status.sx = status.modifiedXe;\n status.sy = status.modifiedYe;\n\n this.doMove();\n this.end(status.startEvent);\n status.active = false;\n this.simulation = null;\n }\n\n utils.copyCoords(this.prevCoords, this.curCoords);\n}\n\nfunction smoothEndFrame () {\n updateInertiaCoords(this);\n\n const status = this.inertiaStatus;\n const t = new Date().getTime() - status.t0;\n const duration = this.target.options[this.prepared.name].inertia.smoothEndDuration;\n\n if (t < duration) {\n status.sx = utils.easeOutQuad(t, 0, status.xe, duration);\n status.sy = utils.easeOutQuad(t, 0, status.ye, duration);\n\n this.pointerMove(status.startEvent, status.startEvent);\n\n status.i = animationFrame.request(this.boundSmoothEndFrame);\n }\n else {\n status.sx = status.xe;\n status.sy = status.ye;\n\n this.pointerMove(status.startEvent, status.startEvent);\n this.end(status.startEvent);\n\n status.smoothEnd =\n status.active = false;\n this.simulation = null;\n }\n}\n\nfunction updateInertiaCoords (interaction) {\n const status = interaction.inertiaStatus;\n\n // return if inertia isn't running\n if (!status.active) { return; }\n\n const pageUp = status.upCoords.page;\n const clientUp = status.upCoords.client;\n\n utils.setCoords(interaction.curCoords, [ {\n pageX : pageUp.x + status.sx,\n pageY : pageUp.y + status.sy,\n clientX: clientUp.x + status.sx,\n clientY: clientUp.y + status.sy,\n } ]);\n}\n","const browser = require('./utils/browser');\nconst events = require('./utils/events');\nconst utils = require('./utils');\nconst scope = require('./scope');\nconst Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\n\nconst globalEvents = {};\n\n/*\\\n * interact\n [ method ]\n *\n * The methods of this variable can be used to set elements as\n * interactables and also to change various default settings.\n *\n * Calling it as a function and passing an element or a valid CSS selector\n * string returns an Interactable object which has various methods to\n * configure it.\n *\n - element (Element | string) The HTML or SVG Element to interact with or CSS selector\n = (object) An @Interactable\n *\n > Usage\n | interact('#draggable').draggable(true);\n |\n | var rectables = interact('rect');\n | rectables\n | .gesturable(true)\n | .on('gesturemove', function (event) {\n | // ...\n | });\n\\*/\nfunction interact (element, options) {\n let interactable = scope.interactables.get(element, options);\n\n if (!interactable) {\n interactable = new Interactable(element, options);\n interactable.events.global = globalEvents;\n }\n\n return interactable;\n}\n\n/*\\\n * interact.isSet\n [ method ]\n *\n * Check if an element has been set\n - element (Element) The Element being searched for\n = (boolean) Indicates if the element or CSS selector was previously passed to interact\n\\*/\ninteract.isSet = function (element, options) {\n return scope.interactables.indexOfElement(element, options && options.context) !== -1;\n};\n\n/*\\\n * interact.on\n [ method ]\n *\n * Adds a global listener for an InteractEvent or adds a DOM event to\n * `document`\n *\n - type (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) interact\n\\*/\ninteract.on = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.on(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.on(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n // if it is an InteractEvent type, add listener to globalEvents\n if (utils.contains(Interactable.eventTypes, type)) {\n // if this type of event was never bound\n if (!globalEvents[type]) {\n globalEvents[type] = [listener];\n }\n else {\n globalEvents[type].push(listener);\n }\n }\n // If non InteractEvent type, addEventListener to document\n else {\n events.add(scope.document, type, listener, { options });\n }\n\n return interact;\n};\n\n/*\\\n * interact.off\n [ method ]\n *\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n - type (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) interact\n \\*/\ninteract.off = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.off(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.off(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n if (!utils.contains(Interactable.eventTypes, type)) {\n events.remove(scope.document, type, listener, options);\n }\n else {\n let index;\n\n if (type in globalEvents\n && (index = utils.indexOf(globalEvents[type], listener)) !== -1) {\n globalEvents[type].splice(index, 1);\n }\n }\n\n return interact;\n};\n\n/*\\\n * interact.debug\n [ method ]\n *\n * Returns an object which exposes internal data\n = (object) An object with properties that outline the current state and expose internal functions and variables\n\\*/\ninteract.debug = function () {\n return scope;\n};\n\n// expose the functions used to calculate multi-touch properties\ninteract.getPointerAverage = utils.pointerAverage;\ninteract.getTouchBBox = utils.touchBBox;\ninteract.getTouchDistance = utils.touchDistance;\ninteract.getTouchAngle = utils.touchAngle;\n\ninteract.getElementRect = utils.getElementRect;\ninteract.getElementClientRect = utils.getElementClientRect;\ninteract.matchesSelector = utils.matchesSelector;\ninteract.closest = utils.closest;\n\n/*\\\n * interact.supportsTouch\n [ method ]\n *\n = (boolean) Whether or not the browser supports touch input\n\\*/\ninteract.supportsTouch = function () {\n return browser.supportsTouch;\n};\n\n/*\\\n * interact.supportsPointerEvent\n [ method ]\n *\n = (boolean) Whether or not the browser supports PointerEvents\n\\*/\ninteract.supportsPointerEvent = function () {\n return browser.supportsPointerEvent;\n};\n\n/*\\\n * interact.stop\n [ method ]\n *\n * Cancels all interactions (end events are not fired)\n *\n - event (Event) An event on which to call preventDefault()\n = (object) interact\n\\*/\ninteract.stop = function (event) {\n for (let i = scope.interactions.length - 1; i >= 0; i--) {\n scope.interactions[i].stop(event);\n }\n\n return interact;\n};\n\n/*\\\n * interact.pointerMoveTolerance\n [ method ]\n * Returns or sets the distance the pointer must be moved before an action\n * sequence occurs. This also affects tolerance for tap events.\n *\n - newValue (number) #optional The movement from the start position must be greater than this value\n = (number | Interactable) The current setting or interact\n\\*/\ninteract.pointerMoveTolerance = function (newValue) {\n if (utils.is.number(newValue)) {\n Interaction.pointerMoveTolerance = newValue;\n\n return this;\n }\n\n return Interaction.pointerMoveTolerance;\n};\n\ninteract.addDocument = scope.addDocument;\ninteract.removeDocument = scope.removeDocument;\n\nscope.interact = interact;\n\nmodule.exports = interact;\n","const Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\nconst scope = require('./scope');\nconst is = require('./utils/is');\nconst events = require('./utils/events');\n\nconst { nodeContains, matchesSelector } = require('./utils/domUtils');\n\n/*\\\n * Interactable.preventDefault\n [ method ]\n *\n * Returns or sets whether to prevent the browser's default behaviour\n * in response to pointer events. Can be set to:\n * - `'always'` to always prevent\n * - `'never'` to never prevent\n * - `'auto'` to let interact.js try to determine what would be best\n *\n - newValue (string) #optional `true`, `false` or `'auto'`\n = (string | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.preventDefault = function (newValue) {\n if (/^(always|never|auto)$/.test(newValue)) {\n this.options.preventDefault = newValue;\n return this;\n }\n\n if (is.bool(newValue)) {\n this.options.preventDefault = newValue? 'always' : 'never';\n return this;\n }\n\n return this.options.preventDefault;\n};\n\nInteractable.prototype.checkAndPreventDefault = function (event) {\n const setting = this.options.preventDefault;\n\n if (setting === 'never') { return; }\n\n if (setting === 'always') {\n event.preventDefault();\n return;\n }\n\n // setting === 'auto'\n\n // don't preventDefault if the browser supports passiveEvents\n // CSS touch-action and user-selecct should be used instead\n if (events.supportsOptions) {\n return;\n }\n\n // don't preventDefault of pointerdown events\n if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) {\n return;\n }\n\n // don't preventDefault on editable elements\n if (is.element(event.target)\n && matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) {\n return;\n }\n\n event.preventDefault();\n};\n\nfunction onInteractionEvent ({ interaction, event }) {\n if (interaction.target) {\n interaction.target.checkAndPreventDefault(event);\n }\n}\n\nfor (const eventSignal of ['down', 'move', 'up', 'cancel']) {\n Interaction.signals.on(eventSignal, onInteractionEvent);\n}\n\n// prevent native HTML5 drag on interact.js target elements\nInteraction.docEvents.dragstart = function preventNativeDrag (event) {\n for (const interaction of scope.interactions) {\n\n if (interaction.element\n && (interaction.element === event.target\n || nodeContains(interaction.element, event.target))) {\n\n interaction.target.checkAndPreventDefault(event);\n return;\n }\n }\n};\n","const scope = require('./scope');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst iFinder = require('./utils/interactionFinder');\nconst pointerEvents = require('./pointerEvents/base');\n\nconst { window } = require('./utils/window');\n\nconst toString = Object.prototype.toString;\n\nif (!window.Array.isArray) {\n window.Array.isArray = function (obj) {\n return toString.call(obj) === '[object Array]';\n };\n}\n\nif (!String.prototype.trim) {\n String.prototype.trim = function () {\n return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n };\n}\n\n// http://www.quirksmode.org/dom/events/click.html\n// >Events leading to dblclick\n//\n// IE8 doesn't fire down event before dblclick.\n// This workaround tries to fire a tap and doubletap after dblclick\nfunction onIE8Dblclick (event) {\n const eventTarget = event.target;\n const interaction = iFinder.search(event, event.type, eventTarget);\n\n if (!interaction) { return; }\n\n if (interaction.prevTap\n && event.clientX === interaction.prevTap.clientX\n && event.clientY === interaction.prevTap.clientY\n && eventTarget === interaction.prevTap.target) {\n\n interaction.downTargets[0] = eventTarget;\n interaction.downTimes [0] = new Date().getTime();\n\n pointerEvents.fire({\n interaction,\n event,\n eventTarget,\n pointer: event,\n type: 'tap',\n });\n }\n}\n\nif (browser.isIE8) {\n const selectFix = function (event) {\n for (const interaction of scope.interactions) {\n if (interaction.interacting()) {\n interaction.target.checkAndPreventDefault(event);\n }\n }\n };\n\n const onDocIE8 = function onDocIE8 ({ doc, win }, signalName) {\n const eventMethod = signalName.indexOf('listen') === 0\n ? events.add : events.remove;\n\n // For IE's lack of Event#preventDefault\n eventMethod(doc, 'selectstart', selectFix);\n\n if (pointerEvents) {\n eventMethod(doc, 'dblclick', onIE8Dblclick);\n }\n };\n\n scope.signals.on('add-document' , onDocIE8);\n scope.signals.on('remove-document', onDocIE8);\n}\n\nmodule.exports = null;\n","const InteractEvent = require('../InteractEvent');\nconst Interaction = require('../Interaction');\nconst extend = require('../utils/extend');\n\nconst modifiers = {\n names: [],\n\n setOffsets: function (arg) {\n const { interaction, pageCoords: page } = arg;\n const { target, element, startOffset } = interaction;\n const rect = target.getRect(element);\n\n if (rect) {\n startOffset.left = page.x - rect.left;\n startOffset.top = page.y - rect.top;\n\n startOffset.right = rect.right - page.x;\n startOffset.bottom = rect.bottom - page.y;\n\n if (!('width' in rect)) { rect.width = rect.right - rect.left; }\n if (!('height' in rect)) { rect.height = rect.bottom - rect.top ; }\n }\n else {\n startOffset.left = startOffset.top = startOffset.right = startOffset.bottom = 0;\n }\n\n arg.rect = rect;\n arg.interactable = target;\n arg.element = element;\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n\n arg.options = target.options[interaction.prepared.name][modifierName];\n\n if (!arg.options) {\n continue;\n }\n\n interaction.modifierOffsets[modifierName] = modifiers[modifierName].setOffset(arg);\n }\n },\n\n setAll: function (arg) {\n const { interaction, statuses, preEnd, requireEndOnly } = arg;\n const coords = extend({}, arg.pageCoords);\n const result = {\n dx: 0,\n dy: 0,\n changed: false,\n locked: false,\n shouldMove: true,\n };\n\n for (const modifierName of modifiers.names) {\n const modifier = modifiers[modifierName];\n const options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!shouldDo(options, preEnd, requireEndOnly)) { continue; }\n\n arg.status = arg.status = statuses[modifierName];\n arg.options = options;\n arg.offset = arg.interaction.modifierOffsets[modifierName];\n\n modifier.set(arg);\n\n if (arg.status.locked) {\n coords.x += arg.status.dx;\n coords.y += arg.status.dy;\n\n result.dx += arg.status.dx;\n result.dy += arg.status.dy;\n\n result.locked = true;\n }\n }\n\n // a move should be fired if:\n // - there are no modifiers enabled,\n // - no modifiers are \"locked\" i.e. have changed the pointer's coordinates, or\n // - the locked coords have changed since the last pointer move\n result.shouldMove = !arg.status || !result.locked || arg.status.changed;\n\n return result;\n },\n\n resetStatuses: function (statuses) {\n for (const modifierName of modifiers.names) {\n const status = statuses[modifierName] || {};\n\n status.dx = status.dy = 0;\n status.modifiedX = status.modifiedY = NaN;\n status.locked = false;\n status.changed = true;\n\n statuses[modifierName] = status;\n }\n\n return statuses;\n },\n\n start: function ({ interaction }, signalName) {\n const arg = {\n interaction,\n pageCoords: (signalName === 'action-resume' ?\n interaction.curCoords : interaction.startCoords).page,\n startOffset: interaction.startOffset,\n statuses: interaction.modifierStatuses,\n preEnd: false,\n requireEndOnly: false,\n };\n\n modifiers.setOffsets(arg);\n modifiers.resetStatuses(arg.statuses);\n\n arg.pageCoords = extend({}, interaction.startCoords.page);\n interaction.modifierResult = modifiers.setAll(arg);\n },\n};\n\nInteraction.signals.on('new', function (interaction) {\n interaction.startOffset = { left: 0, right: 0, top: 0, bottom: 0 };\n interaction.modifierOffsets = {};\n interaction.modifierStatuses = modifiers.resetStatuses({});\n interaction.modifierResult = null;\n});\n\nInteraction.signals.on('action-start' , modifiers.start);\nInteraction.signals.on('action-resume', modifiers.start);\n\nInteraction.signals.on('before-action-move', function ({ interaction, preEnd, interactingBeforeMove }) {\n const modifierResult = modifiers.setAll({\n interaction,\n preEnd,\n pageCoords: interaction.curCoords.page,\n statuses: interaction.modifierStatuses,\n requireEndOnly: false,\n });\n\n // don't fire an action move if a modifier would keep the event in the same\n // cordinates as before\n if (!modifierResult.shouldMove && interactingBeforeMove) {\n interaction._dontFireMove = true;\n }\n\n interaction.modifierResult = modifierResult;\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n for (let i = 0; i < modifiers.names.length; i++) {\n const options = interaction.target.options[interaction.prepared.name][modifiers.names[i]];\n\n // if the endOnly option is true for any modifier\n if (shouldDo(options, true, true)) {\n // fire a move event at the modified coordinates\n interaction.doMove({ event, preEnd: true });\n break;\n }\n }\n});\n\nInteractEvent.signals.on('set-xy', function (arg) {\n const { iEvent, interaction } = arg;\n const modifierArg = extend({}, arg);\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n modifierArg.options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!modifierArg.options) {\n continue;\n }\n\n const modifier = modifiers[modifierName];\n\n modifierArg.status = interaction.modifierStatuses[modifierName];\n\n iEvent[modifierName] = modifier.modifyCoords(modifierArg);\n }\n});\n\nfunction shouldDo (options, preEnd, requireEndOnly) {\n return (options && options.enabled\n && (preEnd || !options.endOnly)\n && (!requireEndOnly || options.endOnly));\n}\n\nmodule.exports = modifiers;\n","const modifiers = require('./index');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst restrict = {\n defaults: {\n enabled : false,\n endOnly : false,\n restriction: null,\n elementRect: null,\n },\n\n setOffset: function ({ rect, startOffset, options }) {\n const elementRect = options && options.elementRect;\n const offset = {};\n\n if (rect && elementRect) {\n offset.left = startOffset.left - (rect.width * elementRect.left);\n offset.top = startOffset.top - (rect.height * elementRect.top);\n\n offset.right = startOffset.right - (rect.width * (1 - elementRect.right));\n offset.bottom = startOffset.bottom - (rect.height * (1 - elementRect.bottom));\n }\n else {\n offset.left = offset.top = offset.right = offset.bottom = 0;\n }\n\n return offset;\n },\n\n set: function ({ pageCoords, interaction, status, options }) {\n if (!options) { return status; }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n\n const restriction = getRestrictionRect(options.restriction, interaction, page);\n\n if (!restriction) { return status; }\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n const rect = restriction;\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n const offset = interaction.modifierOffsets.restrict;\n\n // object is assumed to have\n // x, y, width, height or\n // left, top, right, bottom\n if ('x' in restriction && 'y' in restriction) {\n modifiedX = Math.max(Math.min(rect.x + rect.width - offset.right , page.x), rect.x + offset.left);\n modifiedY = Math.max(Math.min(rect.y + rect.height - offset.bottom, page.y), rect.y + offset.top );\n }\n else {\n modifiedX = Math.max(Math.min(rect.right - offset.right , page.x), rect.left + offset.left);\n modifiedY = Math.max(Math.min(rect.bottom - offset.bottom, page.y), rect.top + offset.top );\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const elementRect = options && options.elementRect;\n\n if (options && options.enabled\n && !(phase === 'start' && elementRect && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n getRestrictionRect,\n};\n\nfunction getRestrictionRect (value, interaction, page) {\n if (utils.is.function(value)) {\n return utils.resolveRectLike(value, interaction.target, interaction.element, [page.x, page.y, interaction]);\n } else {\n return utils.resolveRectLike(value, interaction.target, interaction.element);\n }\n}\n\nmodifiers.restrict = restrict;\nmodifiers.names.push('restrict');\n\ndefaultOptions.perAction.restrict = restrict.defaults;\n\nmodule.exports = restrict;\n","// This module adds the options.resize.restrictEdges setting which sets min and\n// max for the top, left, bottom and right edges of the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictEdges: {\n// inner: { top: 200, left: 200, right: 400, bottom: 400 },\n// outer: { top: 0, left: 0, right: 600, bottom: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst { getRestrictionRect } = require('./restrict');\n\nconst noInner = { top: +Infinity, left: +Infinity, bottom: -Infinity, right: -Infinity };\nconst noOuter = { top: -Infinity, left: -Infinity, bottom: +Infinity, right: +Infinity };\n\nconst restrictEdges = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n offset: null,\n },\n\n setOffset: function ({ interaction, startOffset, options }) {\n if (!options) {\n return utils.extend({}, startOffset);\n }\n\n const offset = getRestrictionRect(options.offset, interaction, interaction.startCoords.page);\n\n if (offset) {\n return {\n top: startOffset.top + offset.y,\n left: startOffset.left + offset.x,\n bottom: startOffset.bottom + offset.y,\n right: startOffset.right + offset.x,\n };\n }\n\n return startOffset;\n },\n\n set: function ({ pageCoords, interaction, status, offset, options }) {\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n const inner = rectUtils.xywhToTlbr(getRestrictionRect(options.inner, interaction, page)) || noInner;\n const outer = rectUtils.xywhToTlbr(getRestrictionRect(options.outer, interaction, page)) || noOuter;\n\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n if (edges.top) {\n modifiedY = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top);\n }\n else if (edges.bottom) {\n modifiedY = Math.max(Math.min(outer.bottom - offset.bottom, page.y), inner.bottom - offset.bottom);\n }\n if (edges.left) {\n modifiedX = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left);\n }\n else if (edges.right) {\n modifiedX = Math.max(Math.min(outer.right - offset.right, page.x), inner.right - offset.right);\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n if (options && options.enabled\n && !(phase === 'start' && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n noInner,\n noOuter,\n getRestrictionRect,\n};\n\nmodifiers.restrictEdges = restrictEdges;\nmodifiers.names.push('restrictEdges');\n\ndefaultOptions.perAction.restrictEdges = restrictEdges.defaults;\nresize.defaults.restrictEdges = restrictEdges.defaults;\n\nmodule.exports = restrictEdges;\n","// This module adds the options.resize.restrictSize setting which sets min and\n// max width and height for the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictSize: {\n// min: { width: -600, height: -600 },\n// max: { width: 600, height: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst restrictEdges = require('./restrictEdges');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst noMin = { width: -Infinity, height: -Infinity };\nconst noMax = { width: +Infinity, height: +Infinity };\n\nconst restrictSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n },\n\n setOffset: function ({ interaction }) {\n return interaction.startOffset;\n },\n\n set: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const rect = rectUtils.xywhToTlbr(interaction.resizeRects.inverted);\n\n const minSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.min, interaction)) || noMin;\n const maxSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.max, interaction)) || noMax;\n\n arg.options = {\n enabled: options.enabled,\n endOnly: options.endOnly,\n inner: utils.extend({}, restrictEdges.noInner),\n outer: utils.extend({}, restrictEdges.noOuter),\n };\n\n if (edges.top) {\n arg.options.inner.top = rect.bottom - minSize.height;\n arg.options.outer.top = rect.bottom - maxSize.height;\n }\n else if (edges.bottom) {\n arg.options.inner.bottom = rect.top + minSize.height;\n arg.options.outer.bottom = rect.top + maxSize.height;\n }\n if (edges.left) {\n arg.options.inner.left = rect.right - minSize.width;\n arg.options.outer.left = rect.right - maxSize.width;\n }\n else if (edges.right) {\n arg.options.inner.right = rect.left + minSize.width;\n arg.options.outer.right = rect.left + maxSize.width;\n }\n\n restrictEdges.set(arg);\n },\n\n modifyCoords: restrictEdges.modifyCoords,\n};\n\nmodifiers.restrictSize = restrictSize;\nmodifiers.names.push('restrictSize');\n\ndefaultOptions.perAction.restrictSize = restrictSize.defaults;\nresize.defaults.restrictSize = restrictSize.defaults;\n\nmodule.exports = restrictSize;\n","const modifiers = require('./index');\nconst interact = require('../interact');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst snap = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n\n relativePoints: null,\n },\n\n setOffset: function ({ interaction, interactable, element, rect, startOffset, options }) {\n const offsets = [];\n const optionsOrigin = utils.rectToXY(utils.resolveRectLike(options.origin));\n const origin = optionsOrigin || utils.getOriginXY(interactable, element, interaction.prepared.name);\n options = options || interactable.options[interaction.prepared.name].snap || {};\n\n let snapOffset;\n\n if (options.offset === 'startCoords') {\n snapOffset = {\n x: interaction.startCoords.page.x - origin.x,\n y: interaction.startCoords.page.y - origin.y,\n };\n }\n else {\n const offsetRect = utils.resolveRectLike(options.offset, interactable, element, [interaction]);\n\n snapOffset = utils.rectToXY(offsetRect) || { x: 0, y: 0 };\n }\n\n if (rect && options.relativePoints && options.relativePoints.length) {\n for (const { x: relativeX, y: relativeY } of options.relativePoints) {\n offsets.push({\n x: startOffset.left - (rect.width * relativeX) + snapOffset.x,\n y: startOffset.top - (rect.height * relativeY) + snapOffset.y,\n });\n }\n }\n else {\n offsets.push(snapOffset);\n }\n\n return offsets;\n },\n\n set: function ({ interaction, pageCoords, status, options, offset: offsets }) {\n const targets = [];\n let target;\n let page;\n let i;\n\n if (status.useStatusXY) {\n page = { x: status.x, y: status.y };\n }\n else {\n const origin = utils.getOriginXY(interaction.target, interaction.element, interaction.prepared.name);\n\n page = utils.extend({}, pageCoords);\n\n page.x -= origin.x;\n page.y -= origin.y;\n }\n\n status.realX = page.x;\n status.realY = page.y;\n\n let len = options.targets? options.targets.length : 0;\n\n for (const { x: offsetX, y: offsetY } of offsets) {\n const relativeX = page.x - offsetX;\n const relativeY = page.y - offsetY;\n\n for (const snapTarget of options.targets) {\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n targets.push({\n x: utils.is.number(target.x) ? (target.x + offsetX) : relativeX,\n y: utils.is.number(target.y) ? (target.y + offsetY) : relativeY,\n\n range: utils.is.number(target.range)? target.range: options.range,\n });\n }\n }\n\n const closest = {\n target: null,\n inRange: false,\n distance: 0,\n range: 0,\n dx: 0,\n dy: 0,\n };\n\n for (i = 0, len = targets.length; i < len; i++) {\n target = targets[i];\n\n const range = target.range;\n const dx = target.x - page.x;\n const dy = target.y - page.y;\n const distance = utils.hypot(dx, dy);\n let inRange = distance <= range;\n\n // Infinite targets count as being out of range\n // compared to non infinite ones that are in range\n if (range === Infinity && closest.inRange && closest.range !== Infinity) {\n inRange = false;\n }\n\n if (!closest.target || (inRange\n // is the closest target in range?\n ? (closest.inRange && range !== Infinity\n // the pointer is relatively deeper in this target\n ? distance / range < closest.distance / closest.range\n // this target has Infinite range and the closest doesn't\n : (range === Infinity && closest.range !== Infinity)\n // OR this target is closer that the previous closest\n || distance < closest.distance)\n // The other is not in range and the pointer is closer to this target\n : (!closest.inRange && distance < closest.distance))) {\n\n closest.target = target;\n closest.distance = distance;\n closest.range = range;\n closest.inRange = inRange;\n closest.dx = dx;\n closest.dy = dy;\n\n status.range = range;\n }\n }\n\n let snapChanged;\n\n if (closest.target) {\n snapChanged = (status.modifiedX !== closest.target.x || status.modifiedY !== closest.target.y);\n\n status.modifiedX = closest.target.x;\n status.modifiedY = closest.target.y;\n }\n else {\n snapChanged = true;\n\n status.modifiedX = NaN;\n status.modifiedY = NaN;\n }\n\n status.dx = closest.dx;\n status.dy = closest.dy;\n\n status.changed = (snapChanged || (closest.inRange && !status.locked));\n status.locked = closest.inRange;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const relativePoints = options && options.relativePoints;\n\n if (options && options.enabled\n && !(phase === 'start' && relativePoints && relativePoints.length)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n }\n\n return {\n range : status.range,\n locked : status.locked,\n x : status.modifiedX,\n y : status.modifiedY,\n realX : status.realX,\n realY : status.realY,\n dx : status.dx,\n dy : status.dy,\n };\n }\n },\n};\n\ninteract.createSnapGrid = function (grid) {\n return function (x, y) {\n const limits = grid.limits || {\n left : -Infinity,\n right : Infinity,\n top : -Infinity,\n bottom: Infinity,\n };\n let offsetX = 0;\n let offsetY = 0;\n\n if (utils.is.object(grid.offset)) {\n offsetX = grid.offset.x;\n offsetY = grid.offset.y;\n }\n\n const gridx = Math.round((x - offsetX) / grid.x);\n const gridy = Math.round((y - offsetY) / grid.y);\n\n const newX = Math.max(limits.left, Math.min(limits.right , gridx * grid.x + offsetX));\n const newY = Math.max(limits.top , Math.min(limits.bottom, gridy * grid.y + offsetY));\n\n return {\n x: newX,\n y: newY,\n range: grid.range,\n };\n };\n};\n\nmodifiers.snap = snap;\nmodifiers.names.push('snap');\n\ndefaultOptions.perAction.snap = snap.defaults;\n\nmodule.exports = snap;\n","// This module allows snapping of the size of targets during resize\n// interactions.\n\nconst modifiers = require('./index');\nconst snap = require('./snap');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\nconst utils = require('../utils/');\n\nconst snapSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n },\n\n setOffset: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.edges;\n\n if (!edges) { return; }\n\n arg.options = {\n relativePoints: [{\n x: edges.left? 0 : 1,\n y: edges.top ? 0 : 1,\n }],\n origin: { x: 0, y: 0 },\n offset: 'self',\n range: options.range,\n };\n\n const offsets = snap.setOffset(arg);\n arg.options = options;\n\n return offsets;\n },\n\n set: function (arg) {\n const { interaction, options, offset, pageCoords } = arg;\n const page = utils.extend({}, pageCoords);\n const relativeX = page.x - offset[0].x;\n const relativeY = page.y - offset[0].y;\n\n arg.options = utils.extend({}, options);\n arg.options.targets = [];\n\n for (const snapTarget of options.targets) {\n let target;\n\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n if ('width' in target && 'height' in target) {\n target.x = target.width;\n target.y = target.height;\n }\n\n arg.options.targets.push(target);\n }\n\n snap.set(arg);\n },\n\n modifyCoords: function (arg) {\n const { options } = arg;\n\n arg.options = utils.extend({}, options);\n arg.options.enabled = options.enabled;\n arg.options.relativePoints = [null];\n\n snap.modifyCoords(arg);\n },\n};\n\nmodifiers.snapSize = snapSize;\nmodifiers.names.push('snapSize');\n\ndefaultOptions.perAction.snapSize = snapSize.defaults;\nresize.defaults.snapSize = snapSize.defaults;\n\nmodule.exports = snapSize;\n","const pointerUtils = require('../utils/pointerUtils');\n\nmodule.exports = class PointerEvent {\n constructor (type, pointer, event, eventTarget, interaction) {\n pointerUtils.pointerExtend(this, event);\n\n if (event !== pointer) {\n pointerUtils.pointerExtend(this, pointer);\n }\n\n this.interaction = interaction;\n\n this.timeStamp = new Date().getTime();\n this.originalEvent = event;\n this.type = type;\n this.pointerId = pointerUtils.getPointerId(pointer);\n this.pointerType = pointerUtils.getPointerType(pointer);\n this.target = eventTarget;\n this.currentTarget = null;\n\n if (type === 'tap') {\n const pointerIndex = interaction.getPointerIndex(pointer);\n this.dt = this.timeStamp - interaction.downTimes[pointerIndex];\n\n const interval = this.timeStamp - interaction.tapTime;\n\n this.double = !!(interaction.prevTap\n && interaction.prevTap.type !== 'doubletap'\n && interaction.prevTap.target === this.target\n && interval < 500);\n }\n else if (type === 'doubletap') {\n this.dt = pointer.timeStamp - interaction.tapTime;\n }\n }\n\n subtractOrigin ({ x: originX, y: originY }) {\n this.pageX -= originX;\n this.pageY -= originY;\n this.clientX -= originX;\n this.clientY -= originY;\n\n return this;\n }\n\n addOrigin ({ x: originX, y: originY }) {\n this.pageX += originX;\n this.pageY += originY;\n this.clientX += originX;\n this.clientY += originY;\n\n return this;\n }\n\n preventDefault () {\n this.originalEvent.preventDefault();\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n};\n","const PointerEvent = require('./PointerEvent');\nconst Interaction = require('../Interaction');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst defaults = require('../defaultOptions');\nconst signals = require('../utils/Signals').new();\nconst { filter } = require('../utils/arr');\n\nconst simpleSignals = [ 'down', 'up', 'cancel' ];\nconst simpleEvents = [ 'down', 'up', 'cancel' ];\n\nconst pointerEvents = {\n PointerEvent,\n fire,\n collectEventTargets,\n signals,\n defaults: {\n holdDuration: 600,\n ignoreFrom : null,\n allowFrom : null,\n origin : { x: 0, y: 0 },\n },\n types: [\n 'down',\n 'move',\n 'up',\n 'cancel',\n 'tap',\n 'doubletap',\n 'hold',\n ],\n};\n\nfunction fire (arg) {\n const {\n interaction, pointer, event, eventTarget,\n type = arg.pointerEvent.type,\n targets = collectEventTargets(arg),\n pointerEvent = new PointerEvent(type, pointer, event, eventTarget, interaction),\n } = arg;\n\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n targets,\n type,\n pointerEvent,\n };\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n\n for (const prop in target.props || {}) {\n pointerEvent[prop] = target.props[prop];\n }\n\n const origin = utils.getOriginXY(target.eventable, target.element);\n\n pointerEvent.subtractOrigin(origin);\n pointerEvent.eventable = target.eventable;\n pointerEvent.currentTarget = target.element;\n\n target.eventable.fire(pointerEvent);\n\n pointerEvent.addOrigin(origin);\n\n if (pointerEvent.immediatePropagationStopped\n || (pointerEvent.propagationStopped\n && (i + 1) < targets.length && targets[i + 1].element !== pointerEvent.currentTarget)) {\n break;\n }\n }\n\n signals.fire('fired', signalArg);\n\n if (type === 'tap') {\n // if pointerEvent should make a double tap, create and fire a doubletap\n // PointerEvent and use that as the prevTap\n const prevTap = pointerEvent.double\n ? fire({\n interaction, pointer, event, eventTarget,\n type: 'doubletap',\n })\n : pointerEvent;\n\n interaction.prevTap = prevTap;\n interaction.tapTime = prevTap.timeStamp;\n }\n\n return pointerEvent;\n}\n\nfunction collectEventTargets ({ interaction, pointer, event, eventTarget, type }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n // do not fire a tap event if the pointer was moved before being lifted\n if (type === 'tap' && (interaction.pointerWasMoved\n // or if the pointerup target is different to the pointerdown target\n || !(interaction.downTargets[pointerIndex] && interaction.downTargets[pointerIndex] === eventTarget))) {\n return [];\n }\n\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n path,\n targets: [],\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (type === 'hold') {\n signalArg.targets = filter(signalArg.targets, target =>\n target.eventable.options.holdDuration === interaction.holdTimers[pointerIndex].duration);\n }\n\n return signalArg.targets;\n}\n\nInteraction.signals.on('update-pointer-down', function ({ interaction, pointerIndex }) {\n interaction.holdTimers[pointerIndex] = { duration: Infinity, timeout: null };\n});\n\nInteraction.signals.on('remove-pointer', function ({ interaction, pointerIndex }) {\n interaction.holdTimers.splice(pointerIndex, 1);\n});\n\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget, duplicateMove }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n if (!duplicateMove && (!interaction.pointerIsDown || interaction.pointerWasMoved)) {\n if (interaction.pointerIsDown) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n\n fire({\n interaction, pointer, event, eventTarget,\n type: 'move',\n });\n }\n});\n\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget, pointerIndex }) {\n // copy event to be used in timeout for IE8\n const eventCopy = browser.isIE8? utils.extend({}, event) : event;\n\n const timer = interaction.holdTimers[pointerIndex];\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'hold',\n targets: [],\n path,\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (!signalArg.targets.length) { return; }\n\n let minDuration = Infinity;\n\n for (let i = 0; i < signalArg.targets.length; i++) {\n const target = signalArg.targets[i];\n const holdDuration = target.eventable.options.holdDuration;\n\n if (holdDuration < minDuration) {\n minDuration = holdDuration;\n }\n }\n\n timer.duration = minDuration;\n timer.timeout = setTimeout(function () {\n fire({\n interaction,\n eventTarget,\n pointer: browser.isIE8? eventCopy : pointer,\n event: eventCopy,\n type: 'hold',\n });\n }, minDuration);\n});\n\nInteraction.signals.on('up', ({ interaction, pointer, event, eventTarget }) => {\n if (!interaction.pointerWasMoved) {\n fire({ interaction, eventTarget, pointer, event, type: 'tap' });\n }\n});\n\n['up', 'cancel'].forEach(function (signalName) {\n Interaction.signals.on(signalName, function ({ interaction, pointerIndex }) {\n if (interaction.holdTimers[pointerIndex]) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n });\n});\n\nfunction createSignalListener (type) {\n return function ({ interaction, pointer, event, eventTarget }) {\n fire({ interaction, eventTarget, pointer, event, type });\n };\n}\n\nfor (let i = 0; i < simpleSignals.length; i++) {\n Interaction.signals.on(simpleSignals[i], createSignalListener(simpleEvents[i]));\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.prevTap = null; // the most recent tap event on this interaction\n interaction.tapTime = 0; // time of the most recent tap event\n interaction.holdTimers = []; // [{ duration, timeout }]\n});\n\ndefaults.pointerEvents = pointerEvents.defaults;\nmodule.exports = pointerEvents;\n","const pointerEvents = require('./base');\nconst Interaction = require('../Interaction');\n\npointerEvents.signals.on('new', onNew);\npointerEvents.signals.on('fired', onFired);\n\nfor (const signal of ['move', 'up', 'cancel', 'endall']) {\n Interaction.signals.on(signal, endHoldRepeat);\n}\n\nfunction onNew ({ pointerEvent }) {\n if (pointerEvent.type !== 'hold') { return; }\n\n pointerEvent.count = (pointerEvent.count || 0) + 1;\n}\n\nfunction onFired ({ interaction, pointerEvent, eventTarget, targets }) {\n if (pointerEvent.type !== 'hold' || !targets.length) { return; }\n\n // get the repeat interval from the first eventable\n const interval = targets[0].eventable.options.holdRepeatInterval;\n\n // don't repeat if the interval is 0 or less\n if (interval <= 0) { return; }\n\n // set a timeout to fire the holdrepeat event\n interaction.holdIntervalHandle = setTimeout(function () {\n pointerEvents.fire({\n interaction,\n eventTarget,\n type: 'hold',\n pointer: pointerEvent,\n event: pointerEvent,\n });\n }, interval);\n}\n\nfunction endHoldRepeat ({ interaction }) {\n // set the interaction's holdStopTime property\n // to stop further holdRepeat events\n if (interaction.holdIntervalHandle) {\n clearInterval(interaction.holdIntervalHandle);\n interaction.holdIntervalHandle = null;\n }\n}\n\n// don't repeat by default\npointerEvents.defaults.holdRepeatInterval = 0;\npointerEvents.types.push('holdrepeat');\n\nmodule.exports = {\n onNew,\n onFired,\n endHoldRepeat,\n};\n","const pointerEvents = require('./base');\nconst Interactable = require('../Interactable');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\nconst scope = require('../scope');\nconst extend = require('../utils/extend');\nconst { merge } = require('../utils/arr');\n\npointerEvents.signals.on('collect-targets', function ({ targets, element, type, eventTarget }) {\n function collectSelectors (interactable, selector, context) {\n const els = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && is.element(element)\n && domUtils.matchesSelector(element, selector, els)\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n const interactable = scope.interactables.get(element);\n\n if (interactable) {\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n scope.interactables.forEachSelector(collectSelectors, element);\n});\n\nInteractable.signals.on('new', function ({ interactable }) {\n interactable.events.getRect = function (element) {\n return interactable.getRect(element);\n };\n});\n\nInteractable.signals.on('set', function ({ interactable, options }) {\n extend(interactable.events.options, pointerEvents.defaults);\n extend(interactable.events.options, options);\n});\n\nmerge(Interactable.eventTypes, pointerEvents.types);\n\nInteractable.prototype.pointerEvents = function (options) {\n extend(this.events.options, options);\n\n return this;\n};\n\nconst __backCompatOption = Interactable.prototype._backCompatOption;\n\nInteractable.prototype._backCompatOption = function (optionName, newValue) {\n const ret = __backCompatOption.call(this, optionName, newValue);\n\n if (ret === this) {\n this.events.options[optionName] = newValue;\n }\n\n return ret;\n};\n\nInteractable.settingsMethods.push('pointerEvents');\n","const utils = require('./utils');\nconst events = require('./utils/events');\nconst signals = require('./utils/Signals').new();\n\nconst scope = {\n signals,\n events,\n utils,\n\n // main document\n document: require('./utils/domObjects').document,\n // all documents being listened to\n documents: [],\n\n addDocument: function (doc, win) {\n // do nothing if document is already known\n if (utils.contains(scope.documents, doc)) { return false; }\n\n win = win || scope.getWindow(doc);\n\n scope.documents.push(doc);\n events.documents.push(doc);\n\n // don't add an unload event for the main document\n // so that the page may be cached in browser history\n if (doc !== scope.document) {\n events.add(win, 'unload', scope.onWindowUnload);\n }\n\n signals.fire('add-document', { doc, win });\n },\n\n removeDocument: function (doc, win) {\n const index = utils.indexOf(scope.documents, doc);\n\n win = win || scope.getWindow(doc);\n\n events.remove(win, 'unload', scope.onWindowUnload);\n\n scope.documents.splice(index, 1);\n events.documents.splice(index, 1);\n\n signals.fire('remove-document', { win, doc });\n },\n\n onWindowUnload: function () {\n scope.removeDocument(this.document, this);\n },\n};\n\nmodule.exports = scope;\n","const { indexOf } = require('./arr');\n\nclass Signals {\n constructor () {\n this.listeners = {\n // signalName: [listeners],\n };\n }\n\n on (name, listener) {\n if (!this.listeners[name]) {\n this.listeners[name] = [listener];\n return;\n }\n\n this.listeners[name].push(listener);\n }\n\n off (name, listener) {\n if (!this.listeners[name]) { return; }\n\n const index = indexOf(this.listeners[name], listener);\n\n if (index !== -1) {\n this.listeners[name].splice(index, 1);\n }\n }\n\n fire (name, arg) {\n const targetListeners = this.listeners[name];\n\n if (!targetListeners) { return; }\n\n for (let i = 0; i < targetListeners.length; i++) {\n if (targetListeners[i](arg, name) === false) {\n return;\n }\n }\n }\n}\n\nSignals.new = function () {\n return new Signals();\n};\n\nmodule.exports = Signals;\n","function indexOf (array, target) {\n for (let i = 0, len = array.length; i < len; i++) {\n if (array[i] === target) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction contains (array, target) {\n return indexOf(array, target) !== -1;\n}\n\nfunction merge (target, source) {\n for (let i = 0; i < source.length; i++) {\n target.push(source[i]);\n }\n\n return target;\n}\n\nfunction filter (array, test) {\n const result = [];\n\n for (let i = 0; i < array.length; i++) {\n if (test(array[i])) {\n result.push(array[i]);\n }\n }\n\n return result;\n}\n\nmodule.exports = {\n indexOf,\n contains,\n merge,\n filter,\n};\n","const { window } = require('./window');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst Element = domObjects.Element;\nconst navigator = window.navigator;\n\nconst browser = {\n // Does the browser support touch input?\n supportsTouch: !!(('ontouchstart' in window) || is.function(window.DocumentTouch)\n && domObjects.document instanceof window.DocumentTouch),\n\n // Does the browser support PointerEvents\n supportsPointerEvent: !!domObjects.PointerEvent,\n\n isIE8: ('attachEvent' in window) && !('addEventListener' in window),\n\n // Opera Mobile must be handled differently\n isOperaMobile: (navigator.appName === 'Opera'\n && browser.supportsTouch\n && navigator.userAgent.match('Presto')),\n\n // scrolling doesn't change the result of getClientRects on iOS 7\n isIOS7: (/iP(hone|od|ad)/.test(navigator.platform)\n && /OS 7[^\\d]/.test(navigator.appVersion)),\n\n isIe9OrOlder: /MSIE (8|9)/.test(navigator.userAgent),\n\n // prefix matchesSelector\n prefixedMatchesSelector: 'matches' in Element.prototype\n ? 'matches': 'webkitMatchesSelector' in Element.prototype\n ? 'webkitMatchesSelector': 'mozMatchesSelector' in Element.prototype\n ? 'mozMatchesSelector': 'oMatchesSelector' in Element.prototype\n ? 'oMatchesSelector': 'msMatchesSelector',\n\n useMatchesSelectorPolyfill: false,\n\n pEventTypes: (domObjects.PointerEvent\n ? (domObjects.PointerEvent === window.MSPointerEvent\n ? {\n up: 'MSPointerUp',\n down: 'MSPointerDown',\n over: 'mouseover',\n out: 'mouseout',\n move: 'MSPointerMove',\n cancel: 'MSPointerCancel',\n }\n : {\n up: 'pointerup',\n down: 'pointerdown',\n over: 'pointerover',\n out: 'pointerout',\n move: 'pointermove',\n cancel: 'pointercancel',\n })\n : null),\n\n // because Webkit and Opera still use 'mousewheel' event type\n wheelEvent: 'onmousewheel' in domObjects.document? 'mousewheel': 'wheel',\n\n};\n\nbrowser.useMatchesSelectorPolyfill = !is.function(Element.prototype[browser.prefixedMatchesSelector]);\n\nmodule.exports = browser;\n","const domObjects = {};\nconst win = require('./window').window;\n\nfunction blank () {}\n\ndomObjects.document = win.document;\ndomObjects.DocumentFragment = win.DocumentFragment || blank;\ndomObjects.SVGElement = win.SVGElement || blank;\ndomObjects.SVGSVGElement = win.SVGSVGElement || blank;\ndomObjects.SVGElementInstance = win.SVGElementInstance || blank;\ndomObjects.Element = win.Element || blank;\ndomObjects.HTMLElement = win.HTMLElement || domObjects.Element;\n\ndomObjects.Event = win.Event;\ndomObjects.Touch = win.Touch || blank;\ndomObjects.PointerEvent = (win.PointerEvent || win.MSPointerEvent);\n\nmodule.exports = domObjects;\n","const win = require('./window');\nconst browser = require('./browser');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst domUtils = {\n nodeContains: function (parent, child) {\n while (child) {\n if (child === parent) {\n return true;\n }\n\n child = child.parentNode;\n }\n\n return false;\n },\n\n closest: function (element, selector) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) { return element; }\n\n element = domUtils.parentNode(element);\n }\n\n return null;\n },\n\n parentNode: function (node) {\n let parent = node.parentNode;\n\n if (is.docFrag(parent)) {\n // skip past #shado-root fragments\n while ((parent = parent.host) && is.docFrag(parent)) {\n continue;\n }\n\n return parent;\n }\n\n return parent;\n },\n\n // taken from http://tanalin.com/en/blog/2012/12/matches-selector-ie8/ and modified\n matchesSelectorPolyfill: browser.useMatchesSelectorPolyfill\n ? function (element, selector, elems) {\n elems = elems || element.parentNode.querySelectorAll(selector);\n\n for (let i = 0, len = elems.length; i < len; i++) {\n if (elems[i] === element) {\n return true;\n }\n }\n\n return false;\n }\n : null,\n\n matchesSelector: function (element, selector, nodeList) {\n if (browser.useMatchesSelectorPolyfill) {\n return domUtils.matchesSelectorPolyfill(element, selector, nodeList);\n }\n\n // remove /deep/ from selectors if shadowDOM polyfill is used\n if (win.window !== win.realWindow) {\n selector = selector.replace(/\\/deep\\//g, ' ');\n }\n\n return element[browser.prefixedMatchesSelector](selector);\n },\n\n // Test for the element that's \"above\" all other qualifiers\n indexOfDeepestElement: function (elements) {\n let deepestZoneParents = [];\n let dropzoneParents = [];\n let dropzone;\n let deepestZone = elements[0];\n let index = deepestZone? 0: -1;\n let parent;\n let child;\n let i;\n let n;\n\n for (i = 1; i < elements.length; i++) {\n dropzone = elements[i];\n\n // an element might belong to multiple selector dropzones\n if (!dropzone || dropzone === deepestZone) {\n continue;\n }\n\n if (!deepestZone) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n // check if the deepest or current are document.documentElement or document.rootElement\n // - if the current dropzone is, do nothing and continue\n if (dropzone.parentNode === dropzone.ownerDocument) {\n continue;\n }\n // - if deepest is, update with the current dropzone and continue to next\n else if (deepestZone.parentNode === dropzone.ownerDocument) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n if (!deepestZoneParents.length) {\n parent = deepestZone;\n while (parent.parentNode && parent.parentNode !== parent.ownerDocument) {\n deepestZoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n }\n\n // if this element is an svg element and the current deepest is\n // an HTMLElement\n if (deepestZone instanceof domObjects.HTMLElement\n && dropzone instanceof domObjects.SVGElement\n && !(dropzone instanceof domObjects.SVGSVGElement)) {\n\n if (dropzone === deepestZone.parentNode) {\n continue;\n }\n\n parent = dropzone.ownerSVGElement;\n }\n else {\n parent = dropzone;\n }\n\n dropzoneParents = [];\n\n while (parent.parentNode !== parent.ownerDocument) {\n dropzoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n\n n = 0;\n\n // get (position of last common ancestor) + 1\n while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) {\n n++;\n }\n\n const parents = [\n dropzoneParents[n - 1],\n dropzoneParents[n],\n deepestZoneParents[n],\n ];\n\n child = parents[0].lastChild;\n\n while (child) {\n if (child === parents[1]) {\n deepestZone = dropzone;\n index = i;\n deepestZoneParents = [];\n\n break;\n }\n else if (child === parents[2]) {\n break;\n }\n\n child = child.previousSibling;\n }\n }\n\n return index;\n },\n\n matchesUpTo: function (element, selector, limit) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) {\n return true;\n }\n\n element = domUtils.parentNode(element);\n\n if (element === limit) {\n return domUtils.matchesSelector(element, selector);\n }\n }\n\n return false;\n },\n\n getActualElement: function (element) {\n return (element instanceof domObjects.SVGElementInstance\n ? element.correspondingUseElement\n : element);\n },\n\n getScrollXY: function (relevantWindow) {\n relevantWindow = relevantWindow || win.window;\n return {\n x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft,\n y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop,\n };\n },\n\n getElementClientRect: function (element) {\n const clientRect = (element instanceof domObjects.SVGElement\n ? element.getBoundingClientRect()\n : element.getClientRects()[0]);\n\n return clientRect && {\n left : clientRect.left,\n right : clientRect.right,\n top : clientRect.top,\n bottom: clientRect.bottom,\n width : clientRect.width || clientRect.right - clientRect.left,\n height: clientRect.height || clientRect.bottom - clientRect.top,\n };\n },\n\n getElementRect: function (element) {\n const clientRect = domUtils.getElementClientRect(element);\n\n if (!browser.isIOS7 && clientRect) {\n const scroll = domUtils.getScrollXY(win.getWindow(element));\n\n clientRect.left += scroll.x;\n clientRect.right += scroll.x;\n clientRect.top += scroll.y;\n clientRect.bottom += scroll.y;\n }\n\n return clientRect;\n },\n\n getPath: function (element) {\n const path = [];\n\n while (element) {\n path.push(element);\n element = domUtils.parentNode(element);\n }\n\n return path;\n },\n\n trySelector: value => {\n if (!is.string(value)) { return false; }\n\n // an exception will be raised if it is invalid\n domObjects.document.querySelector(value);\n return true;\n },\n};\n\nmodule.exports = domUtils;\n","const is = require('./is');\nconst domUtils = require('./domUtils');\nconst pExtend = require('./pointerExtend');\n\nconst { window, getWindow } = require('./window');\nconst { indexOf, contains } = require('./arr');\n\nconst useAttachEvent = ('attachEvent' in window) && !('addEventListener' in window);\nconst addEvent = useAttachEvent? 'attachEvent': 'addEventListener';\nconst removeEvent = useAttachEvent? 'detachEvent': 'removeEventListener';\nconst on = useAttachEvent? 'on': '';\n\nconst elements = [];\nconst targets = [];\nconst attachedListeners = [];\n\n// {\n// type: {\n// selectors: ['selector', ...],\n// contexts : [document, ...],\n// listeners: [[listener, capture, passive], ...]\n// }\n// }\nconst delegatedEvents = {};\n\nconst documents = [];\n\nconst supportsOptions = !useAttachEvent && (() => {\n let supported = false;\n\n window.document.createElement('div').addEventListener('test', null, {\n get capture () { supported = true; },\n });\n\n return supported;\n})();\n\nfunction add (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n let elementIndex = indexOf(elements, element);\n let target = targets[elementIndex];\n\n if (!target) {\n target = {\n events: {},\n typeCount: 0,\n };\n\n elementIndex = elements.push(element) - 1;\n targets.push(target);\n\n attachedListeners.push(useAttachEvent\n ? {\n supplied: [],\n wrapped : [],\n useCount: [],\n }\n : null);\n }\n\n if (!target.events[type]) {\n target.events[type] = [];\n target.typeCount++;\n }\n\n if (!contains(target.events[type], listener)) {\n let ret;\n\n if (useAttachEvent) {\n const { supplied, wrapped, useCount } = attachedListeners[elementIndex];\n const listenerIndex = indexOf(supplied, listener);\n\n const wrappedListener = wrapped[listenerIndex] || function (event) {\n if (!event.immediatePropagationStopped) {\n event.target = event.srcElement;\n event.currentTarget = element;\n\n event.preventDefault = event.preventDefault || preventDef;\n event.stopPropagation = event.stopPropagation || stopProp;\n event.stopImmediatePropagation = event.stopImmediatePropagation || stopImmProp;\n\n if (/mouse|click/.test(event.type)) {\n event.pageX = event.clientX + getWindow(element).document.documentElement.scrollLeft;\n event.pageY = event.clientY + getWindow(element).document.documentElement.scrollTop;\n }\n\n listener(event);\n }\n };\n\n ret = element[addEvent](on + type, wrappedListener, !!options.capture);\n\n if (listenerIndex === -1) {\n supplied.push(listener);\n wrapped.push(wrappedListener);\n useCount.push(1);\n }\n else {\n useCount[listenerIndex]++;\n }\n }\n else {\n ret = element[addEvent](type, listener, supportsOptions? options : !!options.capture);\n }\n target.events[type].push(listener);\n\n return ret;\n }\n}\n\nfunction remove (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const elementIndex = indexOf(elements, element);\n const target = targets[elementIndex];\n\n if (!target || !target.events) {\n return;\n }\n\n let wrappedListener = listener;\n let listeners;\n let listenerIndex;\n\n if (useAttachEvent) {\n listeners = attachedListeners[elementIndex];\n listenerIndex = indexOf(listeners.supplied, listener);\n wrappedListener = listeners.wrapped[listenerIndex];\n }\n\n if (type === 'all') {\n for (type in target.events) {\n if (target.events.hasOwnProperty(type)) {\n remove(element, type, 'all');\n }\n }\n return;\n }\n\n if (target.events[type]) {\n const len = target.events[type].length;\n\n if (listener === 'all') {\n for (let i = 0; i < len; i++) {\n remove(element, type, target.events[type][i], options);\n }\n return;\n }\n else {\n for (let i = 0; i < len; i++) {\n if (target.events[type][i] === listener) {\n element[removeEvent](on + type, wrappedListener, supportsOptions? options : !!options.capture);\n target.events[type].splice(i, 1);\n\n if (useAttachEvent && listeners) {\n listeners.useCount[listenerIndex]--;\n if (listeners.useCount[listenerIndex] === 0) {\n listeners.supplied.splice(listenerIndex, 1);\n listeners.wrapped.splice(listenerIndex, 1);\n listeners.useCount.splice(listenerIndex, 1);\n }\n }\n\n break;\n }\n }\n }\n\n if (target.events[type] && target.events[type].length === 0) {\n target.events[type] = null;\n target.typeCount--;\n }\n }\n\n if (!target.typeCount) {\n targets.splice(elementIndex, 1);\n elements.splice(elementIndex, 1);\n attachedListeners.splice(elementIndex, 1);\n }\n}\n\nfunction addDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n if (!delegatedEvents[type]) {\n delegatedEvents[type] = {\n selectors: [],\n contexts : [],\n listeners: [],\n };\n\n // add delegate listener functions\n for (let i = 0; i < documents.length; i++) {\n add(documents[i], type, delegateListener);\n add(documents[i], type, delegateUseCapture, true);\n }\n }\n\n const delegated = delegatedEvents[type];\n let index;\n\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n break;\n }\n }\n\n if (index === -1) {\n index = delegated.selectors.length;\n\n delegated.selectors.push(selector);\n delegated.contexts .push(context);\n delegated.listeners.push([]);\n }\n\n // keep listener and capture and passive flags\n delegated.listeners[index].push([listener, !!options.capture, options.passive]);\n}\n\nfunction removeDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const delegated = delegatedEvents[type];\n let matchFound = false;\n let index;\n\n if (!delegated) { return; }\n\n // count from last index of delegated to 0\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n // look for matching selector and context Node\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n\n const listeners = delegated.listeners[index];\n\n // each item of the listeners array is an array: [function, capture, passive]\n for (let i = listeners.length - 1; i >= 0; i--) {\n const [fn, capture, passive] = listeners[i];\n\n // check if the listener functions and capture and passive flags match\n if (fn === listener && capture === !!options.capture && passive === options.passive) {\n // remove the listener from the array of listeners\n listeners.splice(i, 1);\n\n // if all listeners for this interactable have been removed\n // remove the interactable from the delegated arrays\n if (!listeners.length) {\n delegated.selectors.splice(index, 1);\n delegated.contexts .splice(index, 1);\n delegated.listeners.splice(index, 1);\n\n // remove delegate function from context\n remove(context, type, delegateListener);\n remove(context, type, delegateUseCapture, true);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegatedEvents[type] = null;\n }\n }\n\n // only remove one listener\n matchFound = true;\n break;\n }\n }\n\n if (matchFound) { break; }\n }\n }\n}\n\n// bound to the interactable context when a DOM event\n// listener is added to a selector interactable\nfunction delegateListener (event, optionalArg) {\n const options = getOptions(optionalArg);\n const fakeEvent = {};\n const delegated = delegatedEvents[event.type];\n const eventTarget = (domUtils.getActualElement(event.path\n ? event.path[0]\n : event.target));\n let element = eventTarget;\n\n // duplicate the event so that currentTarget can be changed\n pExtend(fakeEvent, event);\n\n fakeEvent.originalEvent = event;\n fakeEvent.preventDefault = preventOriginalDefault;\n\n // climb up document tree looking for selector matches\n while (is.element(element)) {\n for (let i = 0; i < delegated.selectors.length; i++) {\n const selector = delegated.selectors[i];\n const context = delegated.contexts[i];\n\n if (domUtils.matchesSelector(element, selector)\n && domUtils.nodeContains(context, eventTarget)\n && domUtils.nodeContains(context, element)) {\n\n const listeners = delegated.listeners[i];\n\n fakeEvent.currentTarget = element;\n\n for (let j = 0; j < listeners.length; j++) {\n const [fn, capture, passive] = listeners[j];\n\n if (capture === !!options.capture && passive === options.passive) {\n fn(fakeEvent);\n }\n }\n }\n }\n\n element = domUtils.parentNode(element);\n }\n}\n\nfunction delegateUseCapture (event) {\n return delegateListener.call(this, event, true);\n}\n\nfunction preventDef () {\n this.returnValue = false;\n}\n\nfunction preventOriginalDefault () {\n this.originalEvent.preventDefault();\n}\n\nfunction stopProp () {\n this.cancelBubble = true;\n}\n\nfunction stopImmProp () {\n this.cancelBubble = true;\n this.immediatePropagationStopped = true;\n}\n\nfunction getOptions (param) {\n return is.object(param)? param : { capture: param };\n}\n\nmodule.exports = {\n add,\n remove,\n\n addDelegate,\n removeDelegate,\n\n delegateListener,\n delegateUseCapture,\n delegatedEvents,\n documents,\n\n useAttachEvent,\n supportsOptions,\n\n _elements: elements,\n _targets: targets,\n _attachedListeners: attachedListeners,\n};\n","module.exports = function extend (dest, source) {\n for (const prop in source) {\n dest[prop] = source[prop];\n }\n return dest;\n};\n","const {\n resolveRectLike,\n rectToXY,\n} = require('./rect');\n\nmodule.exports = function (target, element, action) {\n const actionOptions = target.options[action];\n const actionOrigin = actionOptions && actionOptions.origin;\n const origin = actionOrigin || target.options.origin;\n\n const originRect = resolveRectLike(origin, target, element, [target && element]);\n\n return rectToXY(originRect) || { x: 0, y: 0 };\n};\n","module.exports = (x, y) => Math.sqrt(x * x + y * y);\n","const extend = require('./extend');\nconst win = require('./window');\n\nconst utils = {\n warnOnce: function (method, message) {\n let warned = false;\n\n return function () {\n if (!warned) {\n win.window.console.warn(message);\n warned = true;\n }\n\n return method.apply(this, arguments);\n };\n },\n\n // http://stackoverflow.com/a/5634528/2280888\n _getQBezierValue: function (t, p1, p2, p3) {\n const iT = 1 - t;\n return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3;\n },\n\n getQuadraticCurvePoint: function (startX, startY, cpX, cpY, endX, endY, position) {\n return {\n x: utils._getQBezierValue(position, startX, cpX, endX),\n y: utils._getQBezierValue(position, startY, cpY, endY),\n };\n },\n\n // http://gizma.com/easing/\n easeOutQuad: function (t, b, c, d) {\n t /= d;\n return -c * t*(t-2) + b;\n },\n\n copyAction: function (dest, src) {\n dest.name = src.name;\n dest.axis = src.axis;\n dest.edges = src.edges;\n\n return dest;\n },\n\n is : require('./is'),\n extend : extend,\n hypot : require('./hypot'),\n getOriginXY: require('./getOriginXY'),\n};\n\nextend(utils, require('./arr'));\nextend(utils, require('./domUtils'));\nextend(utils, require('./pointerUtils'));\nextend(utils, require('./rect'));\n\nmodule.exports = utils;\n","const scope = require('../scope');\nconst utils = require('./index');\n\nconst finder = {\n methodOrder: [ 'simulationResume', 'mouseOrPen', 'hasPointer', 'idle' ],\n\n search: function (pointer, eventType, eventTarget) {\n const pointerType = utils.getPointerType(pointer);\n const pointerId = utils.getPointerId(pointer);\n const details = { pointer, pointerId, pointerType, eventType, eventTarget };\n\n for (const method of finder.methodOrder) {\n const interaction = finder[method](details);\n\n if (interaction) {\n return interaction;\n }\n }\n },\n\n // try to resume simulation with a new pointer\n simulationResume: function ({ pointerType, eventType, eventTarget }) {\n if (!/down|start/i.test(eventType)) {\n return null;\n }\n\n for (const interaction of scope.interactions) {\n let element = eventTarget;\n\n if (interaction.simulation && interaction.simulation.allowResume\n && (interaction.pointerType === pointerType)) {\n while (element) {\n // if the element is the interaction element\n if (element === interaction.element) {\n return interaction;\n }\n element = utils.parentNode(element);\n }\n }\n }\n\n return null;\n },\n\n // if it's a mouse or pen interaction\n mouseOrPen: function ({ pointerId, pointerType, eventType }) {\n if (pointerType !== 'mouse' && pointerType !== 'pen') {\n return null;\n }\n\n let firstNonActive;\n\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType) {\n // if it's a down event, skip interactions with running simulations\n if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; }\n\n // if the interaction is active, return it immediately\n if (interaction.interacting()) {\n return interaction;\n }\n // otherwise save it and look for another active interaction\n else if (!firstNonActive) {\n firstNonActive = interaction;\n }\n }\n }\n\n // if no active mouse interaction was found use the first inactive mouse\n // interaction\n if (firstNonActive) {\n return firstNonActive;\n }\n\n // find any mouse or pen interaction.\n // ignore the interaction if the eventType is a *down, and a simulation\n // is active\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType && !(/down/i.test(eventType) && interaction.simulation)) {\n return interaction;\n }\n }\n\n return null;\n },\n\n // get interaction that has this pointer\n hasPointer: function ({ pointerId }) {\n for (const interaction of scope.interactions) {\n if (utils.contains(interaction.pointerIds, pointerId)) {\n return interaction;\n }\n }\n },\n\n // get first idle interaction with a matching pointerType\n idle: function ({ pointerType }) {\n for (const interaction of scope.interactions) {\n // if there's already a pointer held down\n if (interaction.pointerIds.length === 1) {\n const target = interaction.target;\n // don't add this pointer if there is a target interactable and it\n // isn't gesturable\n if (target && !target.options.gesture.enabled) {\n continue;\n }\n }\n // maximum of 2 pointers per interaction\n else if (interaction.pointerIds.length >= 2) {\n continue;\n }\n\n if (!interaction.interacting() && (pointerType === interaction.pointerType)) {\n return interaction;\n }\n }\n\n return null;\n },\n};\n\nmodule.exports = finder;\n","const win = require('./window');\nconst isWindow = require('./isWindow');\n\nconst is = {\n array : () => {},\n\n window : thing => thing === win.window || isWindow(thing),\n\n docFrag : thing => is.object(thing) && thing.nodeType === 11,\n\n object : thing => !!thing && (typeof thing === 'object'),\n\n function: thing => typeof thing === 'function',\n\n number : thing => typeof thing === 'number' ,\n\n bool : thing => typeof thing === 'boolean' ,\n\n string : thing => typeof thing === 'string' ,\n\n element: thing => {\n if (!thing || (typeof thing !== 'object')) { return false; }\n\n const _window = win.getWindow(thing) || win.window;\n\n return (/object|function/.test(typeof _window.Element)\n ? thing instanceof _window.Element //DOM2\n : thing.nodeType === 1 && typeof thing.nodeName === 'string');\n },\n};\n\nis.array = thing => (is.object(thing)\n && (typeof thing.length !== 'undefined')\n && is.function(thing.splice));\n\nmodule.exports = is;\n","module.exports = (thing) => !!(thing && thing.Window) && (thing instanceof thing.Window);\n","function pointerExtend (dest, source) {\n for (const prop in source) {\n const prefixedPropREs = module.exports.prefixedPropREs;\n let deprecated = false;\n\n // skip deprecated prefixed properties\n for (const vendor in prefixedPropREs) {\n if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) {\n deprecated = true;\n break;\n }\n }\n\n if (!deprecated && typeof source[prop] !== 'function') {\n dest[prop] = source[prop];\n }\n }\n return dest;\n}\n\npointerExtend.prefixedPropREs = {\n webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/,\n};\n\nmodule.exports = pointerExtend;\n","const hypot = require('./hypot');\nconst browser = require('./browser');\nconst dom = require('./domObjects');\nconst domUtils = require('./domUtils');\nconst domObjects = require('./domObjects');\nconst is = require('./is');\nconst pointerExtend = require('./pointerExtend');\n\nconst pointerUtils = {\n copyCoords: function (dest, src) {\n dest.page = dest.page || {};\n dest.page.x = src.page.x;\n dest.page.y = src.page.y;\n\n dest.client = dest.client || {};\n dest.client.x = src.client.x;\n dest.client.y = src.client.y;\n\n dest.timeStamp = src.timeStamp;\n },\n\n setCoordDeltas: function (targetObj, prev, cur) {\n targetObj.page.x = cur.page.x - prev.page.x;\n targetObj.page.y = cur.page.y - prev.page.y;\n targetObj.client.x = cur.client.x - prev.client.x;\n targetObj.client.y = cur.client.y - prev.client.y;\n targetObj.timeStamp = cur.timeStamp - prev.timeStamp;\n\n // set pointer velocity\n const dt = Math.max(targetObj.timeStamp / 1000, 0.001);\n\n targetObj.page.speed = hypot(targetObj.page.x, targetObj.page.y) / dt;\n targetObj.page.vx = targetObj.page.x / dt;\n targetObj.page.vy = targetObj.page.y / dt;\n\n targetObj.client.speed = hypot(targetObj.client.x, targetObj.page.y) / dt;\n targetObj.client.vx = targetObj.client.x / dt;\n targetObj.client.vy = targetObj.client.y / dt;\n },\n\n isNativePointer: function (pointer) {\n return (pointer instanceof dom.Event || pointer instanceof dom.Touch);\n },\n\n // Get specified X/Y coords for mouse or event.touches[0]\n getXY: function (type, pointer, xy) {\n xy = xy || {};\n type = type || 'page';\n\n xy.x = pointer[type + 'X'];\n xy.y = pointer[type + 'Y'];\n\n return xy;\n },\n\n getPageXY: function (pointer, page) {\n page = page || {};\n\n // Opera Mobile handles the viewport and scrolling oddly\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n pointerUtils.getXY('screen', pointer, page);\n\n page.x += window.scrollX;\n page.y += window.scrollY;\n }\n else {\n pointerUtils.getXY('page', pointer, page);\n }\n\n return page;\n },\n\n getClientXY: function (pointer, client) {\n client = client || {};\n\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n // Opera Mobile handles the viewport and scrolling oddly\n pointerUtils.getXY('screen', pointer, client);\n }\n else {\n pointerUtils.getXY('client', pointer, client);\n }\n\n return client;\n },\n\n getPointerId: function (pointer) {\n return is.number(pointer.pointerId)? pointer.pointerId : pointer.identifier;\n },\n\n setCoords: function (targetObj, pointers, timeStamp) {\n const pointer = (pointers.length > 1\n ? pointerUtils.pointerAverage(pointers)\n : pointers[0]);\n\n const tmpXY = {};\n\n pointerUtils.getPageXY(pointer, tmpXY);\n targetObj.page.x = tmpXY.x;\n targetObj.page.y = tmpXY.y;\n\n pointerUtils.getClientXY(pointer, tmpXY);\n targetObj.client.x = tmpXY.x;\n targetObj.client.y = tmpXY.y;\n\n targetObj.timeStamp = is.number(timeStamp) ? timeStamp :new Date().getTime();\n },\n\n pointerExtend: pointerExtend,\n\n getTouchPair: function (event) {\n const touches = [];\n\n // array of touches is supplied\n if (is.array(event)) {\n touches[0] = event[0];\n touches[1] = event[1];\n }\n // an event\n else {\n if (event.type === 'touchend') {\n if (event.touches.length === 1) {\n touches[0] = event.touches[0];\n touches[1] = event.changedTouches[0];\n }\n else if (event.touches.length === 0) {\n touches[0] = event.changedTouches[0];\n touches[1] = event.changedTouches[1];\n }\n }\n else {\n touches[0] = event.touches[0];\n touches[1] = event.touches[1];\n }\n }\n\n return touches;\n },\n\n pointerAverage: function (pointers) {\n const average = {\n pageX : 0,\n pageY : 0,\n clientX: 0,\n clientY: 0,\n screenX: 0,\n screenY: 0,\n };\n\n for (const pointer of pointers) {\n for (const prop in average) {\n average[prop] += pointer[prop];\n }\n }\n for (const prop in average) {\n average[prop] /= pointers.length;\n }\n\n return average;\n },\n\n touchBBox: function (event) {\n if (!event.length && !(event.touches && event.touches.length > 1)) {\n return;\n }\n\n const touches = pointerUtils.getTouchPair(event);\n const minX = Math.min(touches[0].pageX, touches[1].pageX);\n const minY = Math.min(touches[0].pageY, touches[1].pageY);\n const maxX = Math.max(touches[0].pageX, touches[1].pageX);\n const maxY = Math.max(touches[0].pageY, touches[1].pageY);\n\n return {\n x: minX,\n y: minY,\n left: minX,\n top: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n },\n\n touchDistance: function (event, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n\n\n const dx = touches[0][sourceX] - touches[1][sourceX];\n const dy = touches[0][sourceY] - touches[1][sourceY];\n\n return hypot(dx, dy);\n },\n\n touchAngle: function (event, prevAngle, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n const dx = touches[1][sourceX] - touches[0][sourceX];\n const dy = touches[1][sourceY] - touches[0][sourceY];\n const angle = 180 * Math.atan2(dy , dx) / Math.PI;\n\n return angle;\n },\n\n getPointerType: function (pointer) {\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : is.number(pointer.pointerType)\n ? [undefined, undefined,'touch', 'pen', 'mouse'][pointer.pointerType]\n // if the PointerEvent API isn't available, then the \"pointer\" must\n // be either a MouseEvent, TouchEvent, or Touch object\n : /touch/.test(pointer.type) || pointer instanceof domObjects.Touch\n ? 'touch'\n : 'mouse';\n },\n\n // [ event.target, event.currentTarget ]\n getEventTargets: function (event) {\n return [\n domUtils.getActualElement(event.path ? event.path[0] : event.target),\n domUtils.getActualElement(event.currentTarget),\n ];\n },\n};\n\nmodule.exports = pointerUtils;\n","const { window } = require('./window');\n\nconst vendors = ['ms', 'moz', 'webkit', 'o'];\nlet lastTime = 0;\nlet request;\nlet cancel;\n\nfor (let x = 0; x < vendors.length && !window.requestAnimationFrame; x++) {\n request = window[vendors[x] + 'RequestAnimationFrame'];\n cancel = window[vendors[x] +'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n}\n\nif (!request) {\n request = function (callback) {\n const currTime = new Date().getTime();\n const timeToCall = Math.max(0, 16 - (currTime - lastTime));\n const id = setTimeout(function () { callback(currTime + timeToCall); },\n timeToCall);\n\n lastTime = currTime + timeToCall;\n return id;\n };\n}\n\nif (!cancel) {\n cancel = function (id) {\n clearTimeout(id);\n };\n}\n\nmodule.exports = {\n request,\n cancel,\n};\n","const extend = require('./extend');\nconst is = require('./is');\nconst {\n closest,\n parentNode,\n getElementRect,\n} = require('./domUtils');\n\nconst rectUtils = {\n getStringOptionResult: function (value, interactable, element) {\n if (!is.string(value)) {\n return null;\n }\n\n if (value === 'parent') {\n value = parentNode(element);\n }\n else if (value === 'self') {\n value = interactable.getRect(element);\n }\n else {\n value = closest(element, value);\n }\n\n return value;\n },\n\n resolveRectLike: function (value, interactable, element, functionArgs) {\n value = rectUtils.getStringOptionResult(value, interactable, element) || value;\n\n if (is.function(value)) {\n value = value.apply(null, functionArgs);\n }\n\n if (is.element(value)) {\n value = getElementRect(value);\n }\n\n return value;\n },\n\n rectToXY: function (rect) {\n return rect && {\n x: 'x' in rect ? rect.x : rect.left,\n y: 'y' in rect ? rect.y : rect.top,\n };\n },\n\n xywhToTlbr: function (rect) {\n if (rect && !('left' in rect && 'top' in rect)) {\n rect = extend({}, rect);\n\n rect.left = rect.x || 0;\n rect.top = rect.y || 0;\n rect.right = rect.right || (rect.left + rect.width);\n rect.bottom = rect.bottom || (rect.top + rect.height);\n }\n\n return rect;\n },\n\n tlbrToXywh: function (rect) {\n if (rect && !('x' in rect && 'y' in rect)) {\n rect = extend({}, rect);\n\n rect.x = rect.left || 0;\n rect.top = rect.top || 0;\n rect.width = rect.width || (rect.right - rect.x);\n rect.height = rect.height || (rect.bottom - rect.y);\n }\n\n return rect;\n },\n};\n\nmodule.exports = rectUtils;\n","const win = module.exports;\nconst isWindow = require('./isWindow');\n\nfunction init (window) {\n // get wrapped window if using Shadow DOM polyfill\n\n win.realWindow = window;\n\n // create a TextNode\n const el = window.document.createTextNode('');\n\n // check if it's wrapped by a polyfill\n if (el.ownerDocument !== window.document\n && typeof window.wrap === 'function'\n && window.wrap(el) === el) {\n // use wrapped window\n window = window.wrap(window);\n }\n\n win.window = window;\n}\n\nif (typeof window === 'undefined') {\n win.window = undefined;\n win.realWindow = undefined;\n}\nelse {\n init(window);\n}\n\nwin.getWindow = function getWindow (node) {\n if (isWindow(node)) {\n return node;\n }\n\n const rootNode = (node.ownerDocument || node);\n\n return rootNode.defaultView || rootNode.parentWindow || win.window;\n};\n\nwin.init = init;\n"]} \ No newline at end of file diff --git a/package.json b/package.json index 76f3e9969..f39704e99 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "interactjs", - "version": "1.3.0-alpha.3+sha.9595c40", + "version": "1.3.0-alpha.4+sha.7970416", "repository": { "type": "git", "url": "https://github.com/taye/interact.js.git"
- interact.isSet(element)⚓➭ + interact.isSet(element)⚓➭ @@ -1881,7 +1881,7 @@ Parameters - interact.on(type, listener, [options])⚓➭ + interact.on(type, listener, [options])⚓➭ @@ -1948,7 +1948,7 @@ Parameters - interact.off(type, listener, [options])⚓➭ + interact.off(type, listener, [options])⚓➭ @@ -2014,7 +2014,7 @@ Parameters - interact.debug()⚓➭ + interact.debug()⚓➭ @@ -2056,7 +2056,7 @@ interact.debug() - interact.supportsTouch()⚓➭ + interact.supportsTouch()⚓➭ @@ -2097,7 +2097,7 @@ interact.supportsTouch() - interact.supportsPointerEvent()⚓➭ + interact.supportsPointerEvent()⚓➭ @@ -2138,7 +2138,7 @@ interact.supportsPointerEvent() - interact.stop(event)⚓➭ + interact.stop(event)⚓➭ @@ -2198,7 +2198,7 @@ Parameters - interact.pointerMoveTolerance([newValue])⚓➭ + interact.pointerMoveTolerance([newValue])⚓➭ @@ -2261,7 +2261,7 @@ Parameters - Interaction.start(action, target, element)⚓➭ + Interaction.start(action, target, element)⚓➭ @@ -2356,7 +2356,7 @@ Parameters - Interaction.doMove()⚓➭ + Interaction.doMove()⚓➭ @@ -2403,7 +2403,7 @@ Interaction.doMove() - Interaction.end([event])⚓➭ + Interaction.end([event])⚓➭ diff --git a/dist/interact.js b/dist/interact.js index e8ae35c3b..c78a3c751 100644 --- a/dist/interact.js +++ b/dist/interact.js @@ -1,5 +1,5 @@ /** - * interact.js v1.3.0-alpha.3+sha.9595c40 + * interact.js v1.3.0-alpha.4+sha.7970416-dirty * * Copyright (c) 2012-2017 Taye Adeyemi * Open source under the MIT License. @@ -816,6 +816,7 @@ var scope = require('./scope'); var utils = require('./utils'); var events = require('./utils/events'); var browser = require('./utils/browser'); +var domObjects = require('./utils/domObjects'); var finder = require('./utils/interactionFinder'); var signals = require('./utils/Signals').new(); @@ -829,7 +830,9 @@ var prevTouchTime = 0; scope.interactions = []; var Interaction = function () { - function Interaction() { + function Interaction(_ref) { + var pointerType = _ref.pointerType; + _classCallCheck(this, Interaction); this.target = null; // current interactable being interacted with @@ -886,7 +889,7 @@ var Interaction = function () { this.pointerWasMoved = false; this._interacting = false; - this.mouse = false; + this.pointerType = pointerType; signals.fire('new', this); @@ -1130,6 +1133,11 @@ var Interaction = function () { }; Interaction.prototype.getPointerIndex = function getPointerIndex(pointer) { + // mouse and pen interactions may have only one pointer + if (this.pointerType === 'mouse' || this.pointerType === 'pen') { + return 0; + } + return utils.indexOf(this.pointerIds, utils.getPointerId(pointer)); }; @@ -1161,8 +1169,7 @@ var Interaction = function () { }; Interaction.prototype.removePointer = function removePointer(pointer, event) { - var id = utils.getPointerId(pointer); - var index = this.mouse ? 0 : utils.indexOf(this.pointerIds, id); + var index = this.getPointerIndex(pointer); if (index === -1) { return; @@ -1197,6 +1204,8 @@ for (var i = 0, len = methodNames.length; i < len; i++) { function doOnInteractions(method) { return function (event) { + var pointerType = utils.getPointerType(event); + var _utils$getEventTarget = utils.getEventTargets(event), eventTarget = _utils$getEventTarget[0], curEventTarget = _utils$getEventTarget[1]; @@ -1210,7 +1219,7 @@ function doOnInteractions(method) { var pointer = event.changedTouches[_i]; var interaction = finder.search(pointer, event.type, eventTarget); - matches.push([pointer, interaction || new Interaction()]); + matches.push([pointer, interaction || new Interaction({ pointerType: pointerType })]); } } else { var invalidPointer = false; @@ -1218,7 +1227,7 @@ function doOnInteractions(method) { if (!browser.supportsPointerEvent && /mouse/.test(event.type)) { // ignore mouse events while touch interactions are active for (var _i2 = 0; _i2 < scope.interactions.length && !invalidPointer; _i2++) { - invalidPointer = !scope.interactions[_i2].mouse && scope.interactions[_i2].pointerIsDown; + invalidPointer = scope.interactions[_i2].pointerType !== 'mouse' && scope.interactions[_i2].pointerIsDown; } // try to ignore mouse events that are simulated by the browser @@ -1232,11 +1241,7 @@ function doOnInteractions(method) { var _interaction = finder.search(event, event.type, eventTarget); if (!_interaction) { - - _interaction = new Interaction(); - _interaction.mouse = /mouse/i.test(event.pointerType || event.type) - // MSPointerEvent.MSPOINTER_TYPE_MOUSE - || event.pointerType === 4 || !event.pointerType; + _interaction = new Interaction({ pointerType: pointerType }); } matches.push([event, _interaction]); @@ -1244,20 +1249,20 @@ function doOnInteractions(method) { } for (var _iterator = matches, _isArray = Array.isArray(_iterator), _i3 = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { - var _ref; + var _ref2; if (_isArray) { if (_i3 >= _iterator.length) break; - _ref = _iterator[_i3++]; + _ref2 = _iterator[_i3++]; } else { _i3 = _iterator.next(); if (_i3.done) break; - _ref = _i3.value; + _ref2 = _i3.value; } - var _ref2 = _ref, - _pointer = _ref2[0], - _interaction2 = _ref2[1]; + var _ref3 = _ref2, + _pointer = _ref3[0], + _interaction2 = _ref3[1]; _interaction2._updateEventTargets(eventTarget, curEventTarget); _interaction2[method](_pointer, event, eventTarget, curEventTarget); @@ -1277,7 +1282,7 @@ function endAll(event) { var docEvents = {/* 'eventType': listenerFunc */}; var pEventTypes = browser.pEventTypes; -if (scope.PointerEvent) { +if (domObjects.PointerEvent) { docEvents[pEventTypes.down] = listeners.pointerDown; docEvents[pEventTypes.move] = listeners.pointerMove; docEvents[pEventTypes.up] = listeners.pointerUp; @@ -1295,8 +1300,8 @@ if (scope.PointerEvent) { docEvents.blur = endAll; -function onDocSignal(_ref3, signalName) { - var doc = _ref3.doc; +function onDocSignal(_ref4, signalName) { + var doc = _ref4.doc; var eventMethod = signalName.indexOf('add') === 0 ? events.add : events.remove; @@ -1311,14 +1316,14 @@ function onDocSignal(_ref3, signalName) { } } -signals.on('update-pointer-down', function (_ref4) { - var interaction = _ref4.interaction, - pointer = _ref4.pointer, - pointerId = _ref4.pointerId, - pointerIndex = _ref4.pointerIndex, - event = _ref4.event, - eventTarget = _ref4.eventTarget, - down = _ref4.down; +signals.on('update-pointer-down', function (_ref5) { + var interaction = _ref5.interaction, + pointer = _ref5.pointer, + pointerId = _ref5.pointerId, + pointerIndex = _ref5.pointerIndex, + event = _ref5.event, + eventTarget = _ref5.eventTarget, + down = _ref5.down; interaction.pointerIds[pointerIndex] = pointerId; interaction.pointers[pointerIndex] = pointer; @@ -1355,7 +1360,7 @@ scope.endAllInteractions = endAll; module.exports = Interaction; -},{"./scope":34,"./utils":44,"./utils/Signals":35,"./utils/browser":37,"./utils/events":40,"./utils/interactionFinder":45}],6:[function(require,module,exports){ +},{"./scope":34,"./utils":44,"./utils/Signals":35,"./utils/browser":37,"./utils/domObjects":38,"./utils/events":40,"./utils/interactionFinder":45}],6:[function(require,module,exports){ 'use strict'; var Interaction = require('../Interaction'); @@ -5460,7 +5465,7 @@ module.exports = function () { this.originalEvent = event; this.type = type; this.pointerId = pointerUtils.getPointerId(pointer); - this.pointerType = pointerUtils.getPointerType(pointer, interaction); + this.pointerType = pointerUtils.getPointerType(pointer); this.target = eventTarget; this.currentTarget = null; @@ -5758,8 +5763,10 @@ Interaction.signals.on('down', function (_ref6) { timer.duration = minDuration; timer.timeout = setTimeout(function () { fire({ - interaction: interaction, eventCopy: eventCopy, eventTarget: eventTarget, + interaction: interaction, + eventTarget: eventTarget, pointer: browser.isIE8 ? eventCopy : pointer, + event: eventCopy, type: 'hold' }); }, minDuration); @@ -6946,17 +6953,14 @@ module.exports = utils; var scope = require('../scope'); var utils = require('./index'); -var browser = require('./browser'); var finder = { - methodOrder: ['simulationResume', 'mouse', 'hasPointer', 'idle'], + methodOrder: ['simulationResume', 'mouseOrPen', 'hasPointer', 'idle'], search: function search(pointer, eventType, eventTarget) { - var mouseEvent = /mouse/i.test(pointer.pointerType || eventType) - // MSPointerEvent.MSPOINTER_TYPE_MOUSE - || pointer.pointerType === 4; + var pointerType = utils.getPointerType(pointer); var pointerId = utils.getPointerId(pointer); - var details = { pointer: pointer, pointerId: pointerId, mouseEvent: mouseEvent, eventType: eventType, eventTarget: eventTarget }; + var details = { pointer: pointer, pointerId: pointerId, pointerType: pointerType, eventType: eventType, eventTarget: eventTarget }; for (var _iterator = finder.methodOrder, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { var _ref; @@ -6982,7 +6986,7 @@ var finder = { // try to resume simulation with a new pointer simulationResume: function simulationResume(_ref2) { - var mouseEvent = _ref2.mouseEvent, + var pointerType = _ref2.pointerType, eventType = _ref2.eventType, eventTarget = _ref2.eventTarget; @@ -7006,7 +7010,7 @@ var finder = { var element = eventTarget; - if (interaction.simulation && interaction.simulation.allowResume && interaction.mouse === mouseEvent) { + if (interaction.simulation && interaction.simulation.allowResume && interaction.pointerType === pointerType) { while (element) { // if the element is the interaction element if (element === interaction.element) { @@ -7020,13 +7024,13 @@ var finder = { return null; }, - // if it's a mouse interaction - mouse: function mouse(_ref4) { + // if it's a mouse or pen interaction + mouseOrPen: function mouseOrPen(_ref4) { var pointerId = _ref4.pointerId, - mouseEvent = _ref4.mouseEvent, + pointerType = _ref4.pointerType, eventType = _ref4.eventType; - if (!mouseEvent && (browser.supportsTouch || browser.supportsPointerEvent)) { + if (pointerType !== 'mouse' && pointerType !== 'pen') { return null; } @@ -7046,7 +7050,7 @@ var finder = { var interaction = _ref5; - if (interaction.mouse) { + if (interaction.pointerType === pointerType) { // if it's a down event, skip interactions with running simulations if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; @@ -7069,8 +7073,8 @@ var finder = { return firstNonActive; } - // Find any interaction specifically for mouse. - // ignore the interaction if the eventType is a mousedown, and a simulation + // find any mouse or pen interaction. + // ignore the interaction if the eventType is a *down, and a simulation // is active for (var _iterator4 = scope.interactions, _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) { var _ref6; @@ -7086,7 +7090,7 @@ var finder = { var _interaction = _ref6; - if (_interaction.mouse && !(/down/.test(eventType) && _interaction.simulation)) { + if (_interaction.pointerType === pointerType && !(/down/i.test(eventType) && _interaction.simulation)) { return _interaction; } } @@ -7118,9 +7122,9 @@ var finder = { } }, - // get first idle interaction + // get first idle interaction with a matching pointerType idle: function idle(_ref9) { - var mouseEvent = _ref9.mouseEvent; + var pointerType = _ref9.pointerType; for (var _iterator6 = scope.interactions, _isArray6 = Array.isArray(_iterator6), _i6 = 0, _iterator6 = _isArray6 ? _iterator6 : _iterator6[Symbol.iterator]();;) { var _ref10; @@ -7150,7 +7154,7 @@ var finder = { continue; } - if (!interaction.interacting() && mouseEvent === interaction.mouse) { + if (!interaction.interacting() && pointerType === interaction.pointerType) { return interaction; } } @@ -7161,7 +7165,7 @@ var finder = { module.exports = finder; -},{"../scope":34,"./browser":37,"./index":44}],46:[function(require,module,exports){ +},{"../scope":34,"./index":44}],46:[function(require,module,exports){ 'use strict'; var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; @@ -7262,6 +7266,7 @@ var hypot = require('./hypot'); var browser = require('./browser'); var dom = require('./domObjects'); var domUtils = require('./domUtils'); +var domObjects = require('./domObjects'); var is = require('./is'); var pointerExtend = require('./pointerExtend'); @@ -7468,17 +7473,11 @@ var pointerUtils = { return angle; }, - getPointerType: function getPointerType(pointer, interaction) { - // if the PointerEvent API isn't available, then the pointer must be ither - // a MouseEvent or TouchEvent - if (interaction.mouse) { - return 'mouse'; - } - if (!browser.supportsPointerEvent) { - return 'touch'; - } - - return is.string(pointer.pointerType) ? pointer.pointerType : [undefined, undefined, 'touch', 'pen', 'mouse'][pointer.pointerType]; + getPointerType: function getPointerType(pointer) { + return is.string(pointer.pointerType) ? pointer.pointerType : is.number(pointer.pointerType) ? [undefined, undefined, 'touch', 'pen', 'mouse'][pointer.pointerType] + // if the PointerEvent API isn't available, then the "pointer" must + // be either a MouseEvent, TouchEvent, or Touch object + : /touch/.test(pointer.type) || pointer instanceof domObjects.Touch ? 'touch' : 'mouse'; }, // [ event.target, event.currentTarget ] diff --git a/dist/interact.js.map b/dist/interact.js.map index 60832b766..4f3a62ba8 100644 --- a/dist/interact.js.map +++ b/dist/interact.js.map @@ -1 +1 @@ -{"version":3,"sources":["src/header.js","node_modules/browser-pack/_prelude.js","index.js","src/Eventable.js","src/InteractEvent.js","src/Interactable.js","src/Interaction.js","src/actions/base.js","src/actions/drag.js","src/actions/drop.js","src/actions/gesture.js","src/actions/resize.js","src/autoScroll.js","src/autoStart/InteractableMethods.js","src/autoStart/base.js","src/autoStart/delay.js","src/autoStart/drag.js","src/autoStart/gesture.js","src/autoStart/resize.js","src/defaultOptions.js","src/index.js","src/inertia.js","src/interact.js","src/interactablePreventDefault.js","src/legacyBrowsers.js","src/modifiers/index.js","src/modifiers/restrict.js","src/modifiers/restrictEdges.js","src/modifiers/restrictSize.js","src/modifiers/snap.js","src/modifiers/snapSize.js","src/pointerEvents/PointerEvent.js","src/pointerEvents/base.js","src/pointerEvents/holdRepeat.js","src/pointerEvents/interactableTargets.js","src/scope.js","src/utils/Signals.js","src/utils/arr.js","src/utils/browser.js","src/utils/domObjects.js","src/utils/domUtils.js","src/utils/events.js","src/utils/extend.js","src/utils/getOriginXY.js","src/utils/hypot.js","src/utils/index.js","src/utils/interactionFinder.js","src/utils/is.js","src/utils/isWindow.js","src/utils/pointerExtend.js","src/utils/pointerUtils.js","src/utils/raf.js","src/utils/rect.js","src/utils/window.js"],"names":[],"mappings":"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","file":"interact.js","sourceRoot":"","sourcesContent":["/**\n * interact.js v1.3.0-alpha.3+sha.9595c40\n *\n * Copyright (c) 2012-2017 Taye Adeyemi \n * Open source under the MIT License.\n * https://raw.github.com/taye/interact.js/master/LICENSE\n */\n","(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o 150) {\n return null;\n }\n\n let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI;\n const overlap = 22.5;\n\n if (angle < 0) {\n angle += 360;\n }\n\n const left = 135 - overlap <= angle && angle < 225 + overlap;\n const up = 225 - overlap <= angle && angle < 315 + overlap;\n\n const right = !left && (315 - overlap <= angle || angle < 45 + overlap);\n const down = !up && 45 - overlap <= angle && angle < 135 + overlap;\n\n return {\n up,\n down,\n left,\n right,\n angle,\n speed: interaction.prevEvent.speed,\n velocity: {\n x: interaction.prevEvent.velocityX,\n y: interaction.prevEvent.velocityY,\n },\n };\n }\n\n preventDefault () {}\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n}\n\nsignals.on('set-delta', function ({ iEvent, interaction, starting, deltaSource }) {\n const prevEvent = starting? iEvent : interaction.prevEvent;\n\n if (deltaSource === 'client') {\n iEvent.dx = iEvent.clientX - prevEvent.clientX;\n iEvent.dy = iEvent.clientY - prevEvent.clientY;\n }\n else {\n iEvent.dx = iEvent.pageX - prevEvent.pageX;\n iEvent.dy = iEvent.pageY - prevEvent.pageY;\n }\n});\n\nInteractEvent.signals = signals;\n\nmodule.exports = InteractEvent;\n","const is = require('./utils/is');\nconst events = require('./utils/events');\nconst extend = require('./utils/extend');\nconst actions = require('./actions/base');\nconst scope = require('./scope');\nconst Eventable = require('./Eventable');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nconst {\n getElementRect,\n nodeContains,\n trySelector,\n} = require('./utils/domUtils');\nconst { getWindow } = require('./utils/window');\nconst { indexOf, contains } = require('./utils/arr');\nconst { wheelEvent } = require('./utils/browser');\n\n// all set interactables\nscope.interactables = [];\n\n/*\\\n * Interactable\n [ property ]\n **\n * Object type returned by @interact\n\\*/\nclass Interactable {\n constructor (target, options) {\n options = options || {};\n\n this.target = target;\n this.events = new Eventable();\n this._context = options.context || scope.document;\n this._win = getWindow(trySelector(target)? this._context : target);\n this._doc = this._win.document;\n\n signals.fire('new', {\n target,\n options,\n interactable: this,\n win: this._win,\n });\n\n scope.addDocument( this._doc, this._win );\n\n scope.interactables.push(this);\n\n this.set(options);\n }\n\n setOnEvents (action, phases) {\n const onAction = 'on' + action;\n\n if (is.function(phases.onstart) ) { this.events[onAction + 'start' ] = phases.onstart ; }\n if (is.function(phases.onmove) ) { this.events[onAction + 'move' ] = phases.onmove ; }\n if (is.function(phases.onend) ) { this.events[onAction + 'end' ] = phases.onend ; }\n if (is.function(phases.oninertiastart)) { this.events[onAction + 'inertiastart' ] = phases.oninertiastart ; }\n\n return this;\n }\n\n setPerAction (action, options) {\n // for all the default per-action options\n for (const option in options) {\n // if this option exists for this action\n if (option in defaults[action]) {\n // if the option in the options arg is an object value\n if (is.object(options[option])) {\n // duplicate the object\n this.options[action][option] = extend(this.options[action][option] || {}, options[option]);\n\n if (is.object(defaults.perAction[option]) && 'enabled' in defaults.perAction[option]) {\n this.options[action][option].enabled = options[option].enabled === false? false : true;\n }\n }\n else if (is.bool(options[option]) && is.object(defaults.perAction[option])) {\n this.options[action][option].enabled = options[option];\n }\n else if (options[option] !== undefined) {\n // or if it's not undefined, do a plain assignment\n this.options[action][option] = options[option];\n }\n }\n }\n }\n\n /*\\\n * Interactable.getRect\n [ method ]\n *\n * The default function to get an Interactables bounding rect. Can be\n * overridden using @Interactable.rectChecker.\n *\n - element (Element) #optional The element to measure.\n = (object) The object's bounding rectangle.\n o {\n o top : 0,\n o left : 0,\n o bottom: 0,\n o right : 0,\n o width : 0,\n o height: 0\n o }\n \\*/\n getRect (element) {\n element = element || this.target;\n\n if (is.string(this.target) && !(is.element(element))) {\n element = this._context.querySelector(this.target);\n }\n\n return getElementRect(element);\n }\n\n /*\\\n * Interactable.rectChecker\n [ method ]\n *\n * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n - checker (function) #optional A function which returns this Interactable's bounding rectangle. See @Interactable.getRect\n = (function | object) The checker function or this Interactable\n \\*/\n rectChecker (checker) {\n if (is.function(checker)) {\n this.getRect = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.getRect;\n\n return this;\n }\n\n return this.getRect;\n }\n\n _backCompatOption (optionName, newValue) {\n if (trySelector(newValue) || is.object(newValue)) {\n this.options[optionName] = newValue;\n\n for (const action of actions.names) {\n this.options[action][optionName] = newValue;\n }\n\n return this;\n }\n\n return this.options[optionName];\n }\n\n /*\\\n * Interactable.origin\n [ method ]\n *\n * Gets or sets the origin of the Interactable's element. The x and y\n * of the origin will be subtracted from action event coordinates.\n *\n - origin (object | string) #optional An object eg. { x: 0, y: 0 } or string 'parent', 'self' or any CSS selector\n * OR\n - origin (Element) #optional An HTML or SVG Element whose rect will be used\n **\n = (object) The current origin or this Interactable\n \\*/\n origin (newValue) {\n return this._backCompatOption('origin', newValue);\n }\n\n /*\\\n * Interactable.deltaSource\n [ method ]\n *\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n - newValue (string) #optional Use 'client' if you will be scrolling while interacting; Use 'page' if you want autoScroll to work\n = (string | object) The current deltaSource or this Interactable\n \\*/\n deltaSource (newValue) {\n if (newValue === 'page' || newValue === 'client') {\n this.options.deltaSource = newValue;\n\n return this;\n }\n\n return this.options.deltaSource;\n }\n\n /*\\\n * Interactable.context\n [ method ]\n *\n * Gets the selector context Node of the Interactable. The default is `window.document`.\n *\n = (Node) The context Node of this Interactable\n **\n \\*/\n context () {\n return this._context;\n }\n\n inContext (element) {\n return (this._context === element.ownerDocument\n || nodeContains(this._context, element));\n }\n\n /*\\\n * Interactable.fire\n [ method ]\n *\n * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n - iEvent (InteractEvent) The InteractEvent object to be fired on this Interactable\n = (Interactable) this Interactable\n \\*/\n fire (iEvent) {\n this.events.fire(iEvent);\n\n return this;\n }\n\n _onOffMultiple (method, eventType, listener, options) {\n if (is.string(eventType) && eventType.search(' ') !== -1) {\n eventType = eventType.trim().split(/ +/);\n }\n\n if (is.array(eventType)) {\n for (let i = 0; i < eventType.length; i++) {\n this[method](eventType[i], listener, options);\n }\n\n return true;\n }\n\n if (is.object(eventType)) {\n for (const prop in eventType) {\n this[method](prop, eventType[prop], listener);\n }\n\n return true;\n }\n }\n\n /*\\\n * Interactable.on\n [ method ]\n *\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n - eventType (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) This Interactable\n \\*/\n on (eventType, listener, options) {\n if (this._onOffMultiple('on', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.on(eventType, listener);\n }\n // delegated event for selector\n else if (is.string(this.target)) {\n events.addDelegate(this.target, this._context, eventType, listener, options);\n }\n else {\n events.add(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.off\n [ method ]\n *\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n - eventType (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) This Interactable\n \\*/\n off (eventType, listener, options) {\n if (this._onOffMultiple('off', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n // if it is an action event type\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.off(eventType, listener);\n }\n // delegated event\n else if (is.string(this.target)) {\n events.removeDelegate(this.target, this._context, eventType, listener, options);\n }\n // remove listener from this Interatable's element\n else {\n events.remove(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.set\n [ method ]\n *\n * Reset the options of this Interactable\n - options (object) The new settings to apply\n = (object) This Interactable\n \\*/\n set (options) {\n if (!is.object(options)) {\n options = {};\n }\n\n this.options = extend({}, defaults.base);\n\n const perActions = extend({}, defaults.perAction);\n\n for (const actionName in actions.methodDict) {\n const methodName = actions.methodDict[actionName];\n\n this.options[actionName] = extend({}, defaults[actionName]);\n\n this.setPerAction(actionName, perActions);\n\n this[methodName](options[actionName]);\n }\n\n for (const setting of Interactable.settingsMethods) {\n this.options[setting] = defaults.base[setting];\n\n if (setting in options) {\n this[setting](options[setting]);\n }\n }\n\n signals.fire('set', {\n options,\n interactable: this,\n });\n\n return this;\n }\n\n /*\\\n * Interactable.unset\n [ method ]\n *\n * Remove this interactable from the list of interactables and remove\n * it's action capabilities and event listeners\n *\n = (object) @interact\n \\*/\n unset () {\n events.remove(this.target, 'all');\n\n if (is.string(this.target)) {\n // remove delegated events\n for (const type in events.delegatedEvents) {\n const delegated = events.delegatedEvents[type];\n\n if (delegated.selectors[0] === this.target\n && delegated.contexts[0] === this._context) {\n\n delegated.selectors.splice(0, 1);\n delegated.contexts .splice(0, 1);\n delegated.listeners.splice(0, 1);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegated[type] = null;\n }\n }\n\n events.remove(this._context, type, events.delegateListener);\n events.remove(this._context, type, events.delegateUseCapture, true);\n }\n }\n else {\n events.remove(this, 'all');\n }\n\n signals.fire('unset', { interactable: this });\n\n scope.interactables.splice(indexOf(scope.interactables, this), 1);\n\n // Stop related interactions when an Interactable is unset\n for (const interaction of scope.interactions || []) {\n if (interaction.target === this && interaction.interacting()) {\n interaction.stop();\n }\n }\n\n return scope.interact;\n }\n}\n\nscope.interactables.indexOfElement = function indexOfElement (target, context) {\n context = context || scope.document;\n\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n if (interactable.target === target && interactable._context === context) {\n return i;\n }\n }\n return -1;\n};\n\nscope.interactables.get = function interactableGet (element, options, dontCheckInContext) {\n const ret = this[this.indexOfElement(element, options && options.context)];\n\n return ret && (is.string(element) || dontCheckInContext || ret.inContext(element))? ret : null;\n};\n\nscope.interactables.forEachSelector = function (callback, element) {\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n // skip non CSS selector targets and out of context elements\n if (!is.string(interactable.target)\n || (element && !interactable.inContext(element))) {\n continue;\n }\n\n const ret = callback(interactable, interactable.target, interactable._context, i, this);\n\n if (ret !== undefined) {\n return ret;\n }\n }\n};\n\n// all interact.js eventTypes\nInteractable.eventTypes = scope.eventTypes = [];\n\nInteractable.signals = signals;\n\nInteractable.settingsMethods = [ 'deltaSource', 'origin', 'preventDefault', 'rectChecker' ];\n\nmodule.exports = Interactable;\n","const scope = require('./scope');\nconst utils = require('./utils');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst finder = require('./utils/interactionFinder');\nconst signals = require('./utils/Signals').new();\n\nconst listeners = {};\nconst methodNames = [\n 'pointerDown', 'pointerMove', 'pointerUp',\n 'updatePointer', 'removePointer',\n];\n\n// for ignoring browser's simulated mouse events\nlet prevTouchTime = 0;\n\n// all active and idle interactions\nscope.interactions = [];\n\nclass Interaction {\n constructor () {\n this.target = null; // current interactable being interacted with\n this.element = null; // the target element of the interactable\n\n this.prepared = { // action that's ready to be fired on next move event\n name : null,\n axis : null,\n edges: null,\n };\n\n // keep track of added pointers\n this.pointers = [];\n this.pointerIds = [];\n this.downTargets = [];\n this.downTimes = [];\n\n // Previous native pointer move event coordinates\n this.prevCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n // current native pointer move event coordinates\n this.curCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Starting InteractEvent pointer coordinates\n this.startCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Change in coordinates and time of the pointer\n this.pointerDelta = {\n page : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n client : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n timeStamp: 0,\n };\n\n this.downEvent = null; // pointerdown/mousedown/touchstart event\n this.downPointer = {};\n\n this._eventTarget = null;\n this._curEventTarget = null;\n\n this.prevEvent = null; // previous action event\n\n this.pointerIsDown = false;\n this.pointerWasMoved = false;\n this._interacting = false;\n\n this.mouse = false;\n\n signals.fire('new', this);\n\n scope.interactions.push(this);\n }\n\n pointerDown (pointer, event, eventTarget) {\n const pointerIndex = this.updatePointer(pointer, event, true);\n\n signals.fire('down', {\n pointer,\n event,\n eventTarget,\n pointerIndex,\n interaction: this,\n });\n }\n\n /*\\\n * Interaction.start\n [ method ]\n *\n * Start an action with the given Interactable and Element as tartgets. The\n * action must be enabled for the target Interactable and an appropriate number\n * of pointers must be held down - 1 for drag/resize, 2 for gesture.\n *\n * Use it with `interactable.able({ manualStart: false })` to always\n * [start actions manually](https://github.com/taye/interact.js/issues/114)\n *\n - action (object) The action to be performed - drag, resize, etc.\n - target (Interactable) The Interactable to target\n - element (Element) The DOM Element to target\n = (object) interact\n **\n | interact(target)\n | .draggable({\n | // disable the default drag start by down->move\n | manualStart: true\n | })\n | // start dragging after the user holds the pointer down\n | .on('hold', function (event) {\n | var interaction = event.interaction;\n |\n | if (!interaction.interacting()) {\n | interaction.start({ name: 'drag' },\n | event.interactable,\n | event.currentTarget);\n | }\n | });\n \\*/\n start (action, target, element) {\n if (this.interacting()\n || !this.pointerIsDown\n || this.pointerIds.length < (action.name === 'gesture'? 2 : 1)) {\n return;\n }\n\n // if this interaction had been removed after stopping\n // add it back\n if (utils.indexOf(scope.interactions, this) === -1) {\n scope.interactions.push(this);\n }\n\n utils.copyAction(this.prepared, action);\n this.target = target;\n this.element = element;\n\n signals.fire('action-start', {\n interaction: this,\n event: this.downEvent,\n });\n }\n\n pointerMove (pointer, event, eventTarget) {\n if (!this.simulation) {\n this.updatePointer(pointer);\n utils.setCoords(this.curCoords, this.pointers);\n }\n\n const duplicateMove = (this.curCoords.page.x === this.prevCoords.page.x\n && this.curCoords.page.y === this.prevCoords.page.y\n && this.curCoords.client.x === this.prevCoords.client.x\n && this.curCoords.client.y === this.prevCoords.client.y);\n\n let dx;\n let dy;\n\n // register movement greater than pointerMoveTolerance\n if (this.pointerIsDown && !this.pointerWasMoved) {\n dx = this.curCoords.client.x - this.startCoords.client.x;\n dy = this.curCoords.client.y - this.startCoords.client.y;\n\n this.pointerWasMoved = utils.hypot(dx, dy) > Interaction.pointerMoveTolerance;\n }\n\n const signalArg = {\n pointer,\n pointerIndex: this.getPointerIndex(pointer),\n event,\n eventTarget,\n dx,\n dy,\n duplicate: duplicateMove,\n interaction: this,\n interactingBeforeMove: this.interacting(),\n };\n\n if (!duplicateMove) {\n // set pointer coordinate, time changes and speeds\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n }\n\n signals.fire('move', signalArg);\n\n if (!duplicateMove) {\n // if interacting, fire an 'action-move' signal etc\n if (this.interacting()) {\n this.doMove(signalArg);\n }\n\n if (this.pointerWasMoved) {\n utils.copyCoords(this.prevCoords, this.curCoords);\n }\n }\n }\n\n /*\\\n * Interaction.doMove\n [ method ]\n *\n * Force a move of the current action at the same coordinates. Useful if\n * snap/restrict has been changed and you want a movement with the new\n * settings.\n *\n **\n | interact(target)\n | .draggable(true)\n | .on('dragmove', function (event) {\n | if (someCondition) {\n | // change the snap settings\n | event.interactable.draggable({ snap: { targets: [] }});\n | // fire another move event with re-calculated snap\n | event.interaction.doMove();\n | }\n | });\n \\*/\n doMove (signalArg) {\n signalArg = utils.extend({\n pointer: this.pointers[0],\n event: this.prevEvent,\n eventTarget: this._eventTarget,\n interaction: this,\n }, signalArg || {});\n\n signals.fire('before-action-move', signalArg);\n\n if (!this._dontFireMove) {\n signals.fire('action-move', signalArg);\n }\n\n this._dontFireMove = false;\n }\n\n // End interact move events and stop auto-scroll unless simulation is running\n pointerUp (pointer, event, eventTarget, curEventTarget) {\n const pointerIndex = this.getPointerIndex(pointer);\n\n signals.fire(/cancel$/i.test(event.type)? 'cancel' : 'up', {\n pointer,\n pointerIndex,\n event,\n eventTarget,\n curEventTarget,\n interaction: this,\n });\n\n if (!this.simulation) {\n this.end(event);\n }\n\n this.pointerIsDown = false;\n this.removePointer(pointer, event);\n }\n\n /*\\\n * Interaction.end\n [ method ]\n *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n - event (PointerEvent) #optional\n **\n | interact(target)\n | .draggable(true)\n | .on('move', function (event) {\n | if (event.pageX > 1000) {\n | // end the current action\n | event.interaction.end();\n | // stop all further listeners from being called\n | event.stopImmediatePropagation();\n | }\n | });\n \\*/\n end (event) {\n event = event || this.prevEvent;\n\n if (this.interacting()) {\n signals.fire('action-end', {\n event,\n interaction: this,\n });\n }\n\n this.stop();\n }\n\n currentAction () {\n return this._interacting? this.prepared.name: null;\n }\n\n interacting () {\n return this._interacting;\n }\n\n stop () {\n signals.fire('stop', { interaction: this });\n\n if (this._interacting) {\n signals.fire('stop-active', { interaction: this });\n signals.fire('stop-' + this.prepared.name, { interaction: this });\n }\n\n this.target = this.element = null;\n\n this._interacting = false;\n this.prepared.name = this.prevEvent = null;\n }\n\n getPointerIndex (pointer) {\n return utils.indexOf(this.pointerIds, utils.getPointerId(pointer));\n }\n\n updatePointer (pointer, event, down = event && /(down|start)$/i.test(event.type)) {\n const id = utils.getPointerId(pointer);\n let index = this.getPointerIndex(pointer);\n\n if (index === -1) {\n index = this.pointerIds.length;\n this.pointerIds[index] = id;\n }\n\n if (down) {\n signals.fire('update-pointer-down', {\n pointer,\n event,\n down,\n pointerId: id,\n pointerIndex: index,\n interaction: this,\n });\n }\n\n this.pointers[index] = pointer;\n\n return index;\n }\n\n removePointer (pointer, event) {\n const id = utils.getPointerId(pointer);\n const index = this.mouse? 0 : utils.indexOf(this.pointerIds, id);\n\n if (index === -1) { return; }\n\n signals.fire('remove-pointer', {\n pointer,\n event,\n pointerIndex: index,\n interaction: this,\n });\n\n this.pointers .splice(index, 1);\n this.pointerIds .splice(index, 1);\n this.downTargets.splice(index, 1);\n this.downTimes .splice(index, 1);\n }\n\n _updateEventTargets (target, currentTarget) {\n this._eventTarget = target;\n this._curEventTarget = currentTarget;\n }\n}\n\nfor (let i = 0, len = methodNames.length; i < len; i++) {\n const method = methodNames[i];\n\n listeners[method] = doOnInteractions(method);\n}\n\nfunction doOnInteractions (method) {\n return (function (event) {\n const [eventTarget, curEventTarget] = utils.getEventTargets(event);\n const matches = []; // [ [pointer, interaction], ...]\n\n if (browser.supportsTouch && /touch/.test(event.type)) {\n prevTouchTime = new Date().getTime();\n\n for (let i = 0; i < event.changedTouches.length; i++) {\n const pointer = event.changedTouches[i];\n const interaction = finder.search(pointer, event.type, eventTarget);\n\n matches.push([pointer, interaction || new Interaction()]);\n }\n }\n else {\n let invalidPointer = false;\n\n if (!browser.supportsPointerEvent && /mouse/.test(event.type)) {\n // ignore mouse events while touch interactions are active\n for (let i = 0; i < scope.interactions.length && !invalidPointer; i++) {\n invalidPointer = !scope.interactions[i].mouse && scope.interactions[i].pointerIsDown;\n }\n\n // try to ignore mouse events that are simulated by the browser\n // after a touch event\n invalidPointer = invalidPointer\n || (new Date().getTime() - prevTouchTime < 500)\n // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated\n || event.timeStamp === 0;\n }\n\n if (!invalidPointer) {\n let interaction = finder.search(event, event.type, eventTarget);\n\n if (!interaction) {\n\n interaction = new Interaction();\n interaction.mouse = (/mouse/i.test(event.pointerType || event.type)\n // MSPointerEvent.MSPOINTER_TYPE_MOUSE\n || event.pointerType === 4\n || !event.pointerType);\n }\n\n matches.push([event, interaction]);\n }\n }\n\n for (const [pointer, interaction] of matches) {\n interaction._updateEventTargets(eventTarget, curEventTarget);\n interaction[method](pointer, event, eventTarget, curEventTarget);\n }\n });\n}\n\nfunction endAll (event) {\n for (let i = 0; i < scope.interactions.length; i++) {\n const interaction = scope.interactions[i];\n\n interaction.end(event);\n signals.fire('endall', { event, interaction });\n }\n}\n\nconst docEvents = { /* 'eventType': listenerFunc */ };\nconst pEventTypes = browser.pEventTypes;\n\nif (scope.PointerEvent) {\n docEvents[pEventTypes.down ] = listeners.pointerDown;\n docEvents[pEventTypes.move ] = listeners.pointerMove;\n docEvents[pEventTypes.up ] = listeners.pointerUp;\n docEvents[pEventTypes.cancel] = listeners.pointerUp;\n}\nelse {\n docEvents.mousedown = listeners.pointerDown;\n docEvents.mousemove = listeners.pointerMove;\n docEvents.mouseup = listeners.pointerUp;\n\n docEvents.touchstart = listeners.pointerDown;\n docEvents.touchmove = listeners.pointerMove;\n docEvents.touchend = listeners.pointerUp;\n docEvents.touchcancel = listeners.pointerUp;\n}\n\ndocEvents.blur = endAll;\n\nfunction onDocSignal ({ doc }, signalName) {\n const eventMethod = signalName.indexOf('add') === 0\n ? events.add : events.remove;\n\n // delegate event listener\n for (const eventType in scope.delegatedEvents) {\n eventMethod(doc, eventType, events.delegateListener);\n eventMethod(doc, eventType, events.delegateUseCapture, true);\n }\n\n for (const eventType in docEvents) {\n eventMethod(doc, eventType, docEvents[eventType]);\n }\n}\n\nsignals.on('update-pointer-down', ({ interaction, pointer, pointerId, pointerIndex, event, eventTarget, down }) => {\n interaction.pointerIds[pointerIndex] = pointerId;\n interaction.pointers[pointerIndex] = pointer;\n\n if (down) {\n interaction.pointerIsDown = true;\n }\n\n if (!interaction.interacting()) {\n utils.setCoords(interaction.startCoords, interaction.pointers);\n\n utils.copyCoords(interaction.curCoords , interaction.startCoords);\n utils.copyCoords(interaction.prevCoords, interaction.startCoords);\n\n interaction.downEvent = event;\n interaction.downTimes[pointerIndex] = interaction.curCoords.timeStamp;\n interaction.downTargets[pointerIndex] = eventTarget || event && utils.getEventTargets(event)[0];\n interaction.pointerWasMoved = false;\n\n utils.pointerExtend(interaction.downPointer, pointer);\n }\n});\n\nscope.signals.on('add-document' , onDocSignal);\nscope.signals.on('remove-document', onDocSignal);\n\nInteraction.pointerMoveTolerance = 1;\nInteraction.doOnInteractions = doOnInteractions;\nInteraction.endAll = endAll;\nInteraction.signals = signals;\nInteraction.docEvents = docEvents;\n\nscope.endAllInteractions = endAll;\n\nmodule.exports = Interaction;\n","const Interaction = require('../Interaction');\nconst InteractEvent = require('../InteractEvent');\n\nconst actions = {\n firePrepared,\n names: [],\n methodDict: {},\n};\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n interaction._interacting = true;\n firePrepared(interaction, event, 'start');\n});\n\nInteraction.signals.on('action-move', function ({ interaction, event, preEnd }) {\n firePrepared(interaction, event, 'move', preEnd);\n\n // if the action was ended in a listener\n if (!interaction.interacting()) { return false; }\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n firePrepared(interaction, event, 'end');\n});\n\nfunction firePrepared (interaction, event, phase, preEnd) {\n const actionName = interaction.prepared.name;\n\n const newEvent = new InteractEvent(interaction, event, actionName, phase, interaction.element, null, preEnd);\n\n interaction.target.fire(newEvent);\n interaction.prevEvent = newEvent;\n}\n\nmodule.exports = actions;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drag = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n startAxis : 'xy',\n lockAxis : 'xy',\n },\n\n checker: function (pointer, event, interactable) {\n const dragOptions = interactable.options.drag;\n\n return dragOptions.enabled\n ? { name: 'drag', axis: (dragOptions.lockAxis === 'start'\n ? dragOptions.startAxis\n : dragOptions.lockAxis)}\n : null;\n },\n\n getCursor: function () {\n return 'move';\n },\n};\n\nInteraction.signals.on('before-action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n interaction.curCoords.page.y = interaction.startCoords.page.y;\n interaction.curCoords.client.y = interaction.startCoords.client.y;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vx);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vx);\n interaction.pointerDelta.client.vy = 0;\n interaction.pointerDelta.page.vy = 0;\n }\n else if (axis === 'y') {\n interaction.curCoords.page.x = interaction.startCoords.page.x;\n interaction.curCoords.client.x = interaction.startCoords.client.x;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vy);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vy);\n interaction.pointerDelta.client.vx = 0;\n interaction.pointerDelta.page.vx = 0;\n }\n});\n\n// dragmove\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'dragmove') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n iEvent.pageY = interaction.startCoords.page.y;\n iEvent.clientY = interaction.startCoords.client.y;\n iEvent.dy = 0;\n }\n else if (axis === 'y') {\n iEvent.pageX = interaction.startCoords.page.x;\n iEvent.clientX = interaction.startCoords.client.x;\n iEvent.dx = 0;\n }\n});\n\n/*\\\n * Interactable.draggable\n [ method ]\n *\n * Gets or sets whether drag actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of drag events\n | var isDraggable = interact('ul li').draggable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on drag events (object makes the Interactable draggable)\n = (object) This Interactable\n | interact(element).draggable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // the axis in which the first movement must be\n | // for the drag sequence to start\n | // 'xy' by default - any direction\n | startAxis: 'x' || 'y' || 'xy',\n |\n | // 'xy' by default - don't restrict to one axis (move in any direction)\n | // 'x' or 'y' to restrict movement to either axis\n | // 'start' to restrict movement to the axis the drag started in\n | lockAxis: 'x' || 'y' || 'xy' || 'start',\n |\n | // max number of drags that can happen concurrently\n | // with elements of this Interactable. Infinity by default\n | max: Infinity,\n |\n | // max number of drags that can target the same element+Interactable\n | // 1 by default\n | maxPerElement: 2\n | });\n\\*/\nInteractable.prototype.draggable = function (options) {\n if (utils.is.object(options)) {\n this.options.drag.enabled = options.enabled === false? false: true;\n this.setPerAction('drag', options);\n this.setOnEvents('drag', options);\n\n if (/^(xy|x|y|start)$/.test(options.lockAxis)) {\n this.options.drag.lockAxis = options.lockAxis;\n }\n if (/^(xy|x|y)$/.test(options.startAxis)) {\n this.options.drag.startAxis = options.startAxis;\n }\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drag.enabled = options;\n\n if (!options) {\n this.ondragstart = this.ondragstart = this.ondragend = null;\n }\n\n return this;\n }\n\n return this.options.drag;\n};\n\nactions.drag = drag;\nactions.names.push('drag');\nutils.merge(Interactable.eventTypes, [\n 'dragstart',\n 'dragmove',\n 'draginertiastart',\n 'draginertiaresume',\n 'dragend',\n]);\nactions.methodDict.drag = 'draggable';\n\ndefaultOptions.drag = drag.defaults;\n\nmodule.exports = drag;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst scope = require('../scope');\nconst interact = require('../interact');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drop = {\n defaults: {\n enabled: false,\n accept : null,\n overlap: 'pointer',\n },\n};\n\nlet dynamicDrop = false;\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // reset active dropzones\n interaction.activeDrops.dropzones = [];\n interaction.activeDrops.elements = [];\n interaction.activeDrops.rects = [];\n\n interaction.dropEvents = null;\n\n if (!interaction.dynamicDrop) {\n setActiveDrops(interaction, interaction.element);\n }\n\n const dragEvent = interaction.prevEvent;\n const dropEvents = getDropEvents(interaction, event, dragEvent);\n\n if (dropEvents.activate) {\n fireActiveDrops(interaction, dropEvents.activate);\n }\n});\n\nInteractEvent.signals.on('new', function ({ interaction, iEvent, event }) {\n if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { return; }\n\n const draggableElement = interaction.element;\n const dragEvent = iEvent;\n const dropResult = getDrop(dragEvent, event, draggableElement);\n\n interaction.dropTarget = dropResult.dropzone;\n interaction.dropElement = dropResult.element;\n\n interaction.dropEvents = getDropEvents(interaction, event, dragEvent);\n});\n\nInteraction.signals.on('action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n fireDropEvents(interaction, interaction.dropEvents);\n});\n\nInteraction.signals.on('action-end', function ({ interaction }) {\n if (interaction.prepared.name === 'drag') {\n fireDropEvents(interaction, interaction.dropEvents);\n }\n});\n\nInteraction.signals.on('stop-drag', function ({ interaction }) {\n interaction.activeDrops.dropzones =\n interaction.activeDrops.elements =\n interaction.activeDrops.rects =\n interaction.dropEvents = null;\n});\n\nfunction collectDrops (interaction, element) {\n const drops = [];\n const elements = [];\n\n element = element || interaction.element;\n\n // collect all dropzones and their elements which qualify for a drop\n for (const current of scope.interactables) {\n if (!current.options.drop.enabled) { continue; }\n\n const accept = current.options.drop.accept;\n\n // test the draggable element against the dropzone's accept setting\n if ((utils.is.element(accept) && accept !== element)\n || (utils.is.string(accept)\n && !utils.matchesSelector(element, accept))) {\n\n continue;\n }\n\n // query for new elements if necessary\n const dropElements = utils.is.string(current.target)\n ? current._context.querySelectorAll(current.target)\n : [current.target];\n\n for (let i = 0; i < dropElements.length; i++) {\n const currentElement = dropElements[i];\n\n if (currentElement !== element) {\n drops.push(current);\n elements.push(currentElement);\n }\n }\n }\n\n return {\n elements,\n dropzones: drops,\n };\n}\n\nfunction fireActiveDrops (interaction, event) {\n let prevElement;\n\n // loop through all active dropzones and trigger event\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n const current = interaction.activeDrops.dropzones[i];\n const currentElement = interaction.activeDrops.elements [i];\n\n // prevent trigger of duplicate events on same element\n if (currentElement !== prevElement) {\n // set current element as event target\n event.target = currentElement;\n current.fire(event);\n }\n prevElement = currentElement;\n }\n}\n\n// Collect a new set of possible drops and save them in activeDrops.\n// setActiveDrops should always be called when a drag has just started or a\n// drag event happens while dynamicDrop is true\nfunction setActiveDrops (interaction, dragElement) {\n // get dropzones and their elements that could receive the draggable\n const possibleDrops = collectDrops(interaction, dragElement, true);\n\n interaction.activeDrops.dropzones = possibleDrops.dropzones;\n interaction.activeDrops.elements = possibleDrops.elements;\n interaction.activeDrops.rects = [];\n\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n interaction.activeDrops.rects[i] =\n interaction.activeDrops.dropzones[i].getRect(interaction.activeDrops.elements[i]);\n }\n}\n\nfunction getDrop (dragEvent, event, dragElement) {\n const interaction = dragEvent.interaction;\n const validDrops = [];\n\n if (dynamicDrop) {\n setActiveDrops(interaction, dragElement);\n }\n\n // collect all dropzones and their elements which qualify for a drop\n for (let j = 0; j < interaction.activeDrops.dropzones.length; j++) {\n const current = interaction.activeDrops.dropzones[j];\n const currentElement = interaction.activeDrops.elements [j];\n const rect = interaction.activeDrops.rects [j];\n\n validDrops.push(current.dropCheck(dragEvent, event, interaction.target, dragElement, currentElement, rect)\n ? currentElement\n : null);\n }\n\n // get the most appropriate dropzone based on DOM depth and order\n const dropIndex = utils.indexOfDeepestElement(validDrops);\n\n return {\n dropzone: interaction.activeDrops.dropzones[dropIndex] || null,\n element : interaction.activeDrops.elements [dropIndex] || null,\n };\n}\n\nfunction getDropEvents (interaction, pointerEvent, dragEvent) {\n const dropEvents = {\n enter : null,\n leave : null,\n activate : null,\n deactivate: null,\n move : null,\n drop : null,\n };\n\n const tmpl = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n };\n\n if (interaction.dropElement !== interaction.prevDropElement) {\n // if there was a prevDropTarget, create a dragleave event\n if (interaction.prevDropTarget) {\n dropEvents.leave = utils.extend({ type: 'dragleave' }, tmpl);\n\n dragEvent.dragLeave = dropEvents.leave.target = interaction.prevDropElement;\n dragEvent.prevDropzone = dropEvents.leave.dropzone = interaction.prevDropTarget;\n }\n // if the dropTarget is not null, create a dragenter event\n if (interaction.dropTarget) {\n dropEvents.enter = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n type : 'dragenter',\n };\n\n dragEvent.dragEnter = interaction.dropElement;\n dragEvent.dropzone = interaction.dropTarget;\n }\n }\n\n if (dragEvent.type === 'dragend' && interaction.dropTarget) {\n dropEvents.drop = utils.extend({ type: 'drop' }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n dragEvent.relatedTarget = interaction.dropElement;\n }\n if (dragEvent.type === 'dragstart') {\n dropEvents.activate = utils.extend({ type: 'dropactivate' }, tmpl);\n\n dropEvents.activate.target = null;\n dropEvents.activate.dropzone = null;\n }\n if (dragEvent.type === 'dragend') {\n dropEvents.deactivate = utils.extend({ type: 'dropdeactivate' }, tmpl);\n\n dropEvents.deactivate.target = null;\n dropEvents.deactivate.dropzone = null;\n }\n if (dragEvent.type === 'dragmove' && interaction.dropTarget) {\n dropEvents.move = utils.extend({\n dragmove : dragEvent,\n type : 'dropmove',\n }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n }\n\n return dropEvents;\n}\n\nfunction fireDropEvents (interaction, dropEvents) {\n if (dropEvents.leave) { interaction.prevDropTarget.fire(dropEvents.leave); }\n if (dropEvents.move ) { interaction.dropTarget.fire(dropEvents.move ); }\n if (dropEvents.enter) { interaction.dropTarget.fire(dropEvents.enter); }\n if (dropEvents.drop ) { interaction.dropTarget.fire(dropEvents.drop ); }\n if (dropEvents.deactivate) {\n fireActiveDrops(interaction, dropEvents.deactivate);\n }\n\n interaction.prevDropTarget = interaction.dropTarget;\n interaction.prevDropElement = interaction.dropElement;\n}\n\n/*\\\n * Interactable.dropzone\n [ method ]\n *\n * Returns or sets whether elements can be dropped onto this\n * Interactable to trigger drop events\n *\n * Dropzones can receive the following events:\n * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends\n * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone\n * - `dragmove` when a draggable that has entered the dropzone is moved\n * - `drop` when a draggable is dropped into this dropzone\n *\n * Use the `accept` option to allow only elements that match the given CSS\n * selector or element. The value can be:\n *\n * - **an Element** - only that element can be dropped into this dropzone.\n * - **a string**, - the element being dragged must match it as a CSS selector.\n * - **`null`** - accept options is cleared - it accepts any element.\n *\n * Use the `overlap` option to set how drops are checked for. The allowed\n * values are:\n *\n * - `'pointer'`, the pointer must be over the dropzone (default)\n * - `'center'`, the draggable element's center must be over the dropzone\n * - a number from 0-1 which is the `(intersection area) / (draggable area)`.\n * e.g. `0.5` for drop to happen when half of the area of the draggable is\n * over the dropzone\n *\n * Use the `checker` option to specify a function to check if a dragged\n * element is over this Interactable.\n *\n | interact(target)\n | .dropChecker(function(dragEvent, // related dragmove or dragend event\n | event, // TouchEvent/PointerEvent/MouseEvent\n | dropped, // bool result of the default checker\n | dropzone, // dropzone Interactable\n | dropElement, // dropzone elemnt\n | draggable, // draggable Interactable\n | draggableElement) {// draggable element\n |\n | return dropped && event.target.hasAttribute('allow-drop');\n | }\n *\n *\n - options (boolean | object | null) #optional The new value to be set.\n | interact('.drop').dropzone({\n | accept: '.can-drop' || document.getElementById('single-drop'),\n | overlap: 'pointer' || 'center' || zeroToOne\n | }\n = (boolean | object) The current setting or this Interactable\n\\*/\nInteractable.prototype.dropzone = function (options) {\n if (utils.is.object(options)) {\n this.options.drop.enabled = options.enabled === false? false: true;\n\n if (utils.is.function(options.ondrop) ) { this.events.ondrop = options.ondrop ; }\n if (utils.is.function(options.ondropactivate) ) { this.events.ondropactivate = options.ondropactivate ; }\n if (utils.is.function(options.ondropdeactivate)) { this.events.ondropdeactivate = options.ondropdeactivate; }\n if (utils.is.function(options.ondragenter) ) { this.events.ondragenter = options.ondragenter ; }\n if (utils.is.function(options.ondragleave) ) { this.events.ondragleave = options.ondragleave ; }\n if (utils.is.function(options.ondropmove) ) { this.events.ondropmove = options.ondropmove ; }\n\n if (/^(pointer|center)$/.test(options.overlap)) {\n this.options.drop.overlap = options.overlap;\n }\n else if (utils.is.number(options.overlap)) {\n this.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0);\n }\n if ('accept' in options) {\n this.options.drop.accept = options.accept;\n }\n if ('checker' in options) {\n this.options.drop.checker = options.checker;\n }\n\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drop.enabled = options;\n\n if (!options) {\n this.ondragenter = this.ondragleave = this.ondrop\n = this.ondropactivate = this.ondropdeactivate = null;\n }\n\n return this;\n }\n\n return this.options.drop;\n};\n\nInteractable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) {\n let dropped = false;\n\n // if the dropzone has no rect (eg. display: none)\n // call the custom dropChecker or just return false\n if (!(rect = rect || this.getRect(dropElement))) {\n return (this.options.drop.checker\n ? this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement)\n : false);\n }\n\n const dropOverlap = this.options.drop.overlap;\n\n if (dropOverlap === 'pointer') {\n const origin = utils.getOriginXY(draggable, draggableElement, 'drag');\n const page = utils.getPageXY(dragEvent);\n\n page.x += origin.x;\n page.y += origin.y;\n\n const horizontal = (page.x > rect.left) && (page.x < rect.right);\n const vertical = (page.y > rect.top ) && (page.y < rect.bottom);\n\n dropped = horizontal && vertical;\n }\n\n const dragRect = draggable.getRect(draggableElement);\n\n if (dragRect && dropOverlap === 'center') {\n const cx = dragRect.left + dragRect.width / 2;\n const cy = dragRect.top + dragRect.height / 2;\n\n dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom;\n }\n\n if (dragRect && utils.is.number(dropOverlap)) {\n const overlapArea = (Math.max(0, Math.min(rect.right , dragRect.right ) - Math.max(rect.left, dragRect.left))\n * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top , dragRect.top )));\n\n const overlapRatio = overlapArea / (dragRect.width * dragRect.height);\n\n dropped = overlapRatio >= dropOverlap;\n }\n\n if (this.options.drop.checker) {\n dropped = this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement);\n }\n\n return dropped;\n};\n\nInteractable.signals.on('unset', function ({ interactable }) {\n interactable.dropzone(false);\n});\n\nInteractable.settingsMethods.push('dropChecker');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.dropTarget = null; // the dropzone a drag target might be dropped into\n interaction.dropElement = null; // the element at the time of checking\n interaction.prevDropTarget = null; // the dropzone that was recently dragged away from\n interaction.prevDropElement = null; // the element at the time of checking\n interaction.dropEvents = null; // the dropEvents related to the current drag event\n\n interaction.activeDrops = {\n dropzones: [], // the dropzones that are mentioned below\n elements : [], // elements of dropzones that accept the target draggable\n rects : [], // the rects of the elements mentioned above\n };\n\n});\n\nInteraction.signals.on('stop', function ({ interaction }) {\n interaction.dropTarget = interaction.dropElement =\n interaction.prevDropTarget = interaction.prevDropElement = null;\n});\n\n/*\\\n * interact.dynamicDrop\n [ method ]\n *\n * Returns or sets whether the dimensions of dropzone elements are\n * calculated on every dragmove or only on dragstart for the default\n * dropChecker\n *\n - newValue (boolean) #optional True to check on each move. False to check only before start\n = (boolean | interact) The current setting or interact\n\\*/\ninteract.dynamicDrop = function (newValue) {\n if (utils.is.bool(newValue)) {\n //if (dragging && dynamicDrop !== newValue && !newValue) {\n //calcRects(dropzones);\n //}\n\n dynamicDrop = newValue;\n\n return interact;\n }\n return dynamicDrop;\n};\n\nutils.merge(Interactable.eventTypes, [\n 'dragenter',\n 'dragleave',\n 'dropactivate',\n 'dropdeactivate',\n 'dropmove',\n 'drop',\n]);\nactions.methodDict.drop = 'dropzone';\n\ndefaultOptions.drop = drop.defaults;\n\nmodule.exports = drop;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst gesture = {\n defaults: {\n enabled : false,\n origin : null,\n restrict: null,\n },\n\n checker: function (pointer, event, interactable, element, interaction) {\n if (interaction.pointerIds.length >= 2) {\n return { name: 'gesture' };\n }\n\n return null;\n },\n\n getCursor: function () {\n return '';\n },\n};\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturestart') { return; }\n iEvent.ds = 0;\n\n interaction.gesture.startDistance = interaction.gesture.prevDistance = iEvent.distance;\n interaction.gesture.startAngle = interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.scale = 1;\n});\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturemove') { return; }\n\n iEvent.ds = iEvent.scale - interaction.gesture.scale;\n\n interaction.target.fire(iEvent);\n\n interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.prevDistance = iEvent.distance;\n\n if (iEvent.scale !== Infinity\n && iEvent.scale !== null\n && iEvent.scale !== undefined\n && !isNaN(iEvent.scale)) {\n\n interaction.gesture.scale = iEvent.scale;\n }\n});\n\n/*\\\n * Interactable.gesturable\n [ method ]\n *\n * Gets or sets whether multitouch gestures can be performed on the\n * Interactable's element\n *\n = (boolean) Indicates if this can be the target of gesture events\n | var isGestureable = interact(element).gesturable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on gesture events (makes the Interactable gesturable)\n = (object) this Interactable\n | interact(element).gesturable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // limit multiple gestures.\n | // See the explanation in @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n\\*/\nInteractable.prototype.gesturable = function (options) {\n if (utils.is.object(options)) {\n this.options.gesture.enabled = options.enabled === false? false: true;\n this.setPerAction('gesture', options);\n this.setOnEvents('gesture', options);\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.gesture.enabled = options;\n\n if (!options) {\n this.ongesturestart = this.ongesturestart = this.ongestureend = null;\n }\n\n return this;\n }\n\n return this.options.gesture;\n};\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action, event, starting, ending, deltaSource }) {\n if (action !== 'gesture') { return; }\n\n const pointers = interaction.pointers;\n\n iEvent.touches = [pointers[0], pointers[1]];\n\n if (starting) {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = 1;\n iEvent.ds = 0;\n iEvent.angle = utils.touchAngle(pointers, undefined, deltaSource);\n iEvent.da = 0;\n }\n else if (ending || event instanceof InteractEvent) {\n iEvent.distance = interaction.prevEvent.distance;\n iEvent.box = interaction.prevEvent.box;\n iEvent.scale = interaction.prevEvent.scale;\n iEvent.ds = iEvent.scale - 1;\n iEvent.angle = interaction.prevEvent.angle;\n iEvent.da = iEvent.angle - interaction.gesture.startAngle;\n }\n else {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = iEvent.distance / interaction.gesture.startDistance;\n iEvent.angle = utils.touchAngle(pointers, interaction.gesture.prevAngle, deltaSource);\n\n iEvent.ds = iEvent.scale - interaction.gesture.prevScale;\n iEvent.da = iEvent.angle - interaction.gesture.prevAngle;\n }\n});\n\nInteraction.signals.on('new', function (interaction) {\n interaction.gesture = {\n start: { x: 0, y: 0 },\n\n startDistance: 0, // distance between two touches of touchStart\n prevDistance : 0,\n distance : 0,\n\n scale: 1, // gesture.distance / gesture.startDistance\n\n startAngle: 0, // angle of line joining two touches\n prevAngle : 0, // angle of the previous gesture event\n };\n});\n\nactions.gesture = gesture;\nactions.names.push('gesture');\nutils.merge(Interactable.eventTypes, [\n 'gesturestart',\n 'gesturemove',\n 'gestureend',\n]);\nactions.methodDict.gesture = 'gesturable';\n\ndefaultOptions.gesture = gesture.defaults;\n\nmodule.exports = gesture;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\n// Less Precision with touch input\nconst defaultMargin = browser.supportsTouch || browser.supportsPointerEvent? 20: 10;\n\nconst resize = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n square: false,\n preserveAspectRatio: false,\n axis: 'xy',\n\n // use default margin\n margin: NaN,\n\n // object with props left, right, top, bottom which are\n // true/false values to resize when the pointer is over that edge,\n // CSS selectors to match the handles for each direction\n // or the Elements for each handle\n edges: null,\n\n // a value of 'none' will limit the resize rect to a minimum of 0x0\n // 'negate' will alow the rect to have negative width/height\n // 'reposition' will keep the width/height positive by swapping\n // the top and bottom edges and/or swapping the left and right edges\n invert: 'none',\n },\n\n checker: function (pointer, event, interactable, element, interaction, rect) {\n if (!rect) { return null; }\n\n const page = utils.extend({}, interaction.curCoords.page);\n const options = interactable.options;\n\n if (options.resize.enabled) {\n const resizeOptions = options.resize;\n const resizeEdges = { left: false, right: false, top: false, bottom: false };\n\n // if using resize.edges\n if (utils.is.object(resizeOptions.edges)) {\n for (const edge in resizeEdges) {\n resizeEdges[edge] = checkResizeEdge(edge,\n resizeOptions.edges[edge],\n page,\n interaction._eventTarget,\n element,\n rect,\n resizeOptions.margin || defaultMargin);\n }\n\n resizeEdges.left = resizeEdges.left && !resizeEdges.right;\n resizeEdges.top = resizeEdges.top && !resizeEdges.bottom;\n\n if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) {\n return {\n name: 'resize',\n edges: resizeEdges,\n };\n }\n }\n else {\n const right = options.resize.axis !== 'y' && page.x > (rect.right - defaultMargin);\n const bottom = options.resize.axis !== 'x' && page.y > (rect.bottom - defaultMargin);\n\n if (right || bottom) {\n return {\n name: 'resize',\n axes: (right? 'x' : '') + (bottom? 'y' : ''),\n };\n }\n }\n }\n\n return null;\n },\n\n cursors: (browser.isIe9OrOlder ? {\n x : 'e-resize',\n y : 's-resize',\n xy: 'se-resize',\n\n top : 'n-resize',\n left : 'w-resize',\n bottom : 's-resize',\n right : 'e-resize',\n topleft : 'se-resize',\n bottomright: 'se-resize',\n topright : 'ne-resize',\n bottomleft : 'ne-resize',\n } : {\n x : 'ew-resize',\n y : 'ns-resize',\n xy: 'nwse-resize',\n\n top : 'ns-resize',\n left : 'ew-resize',\n bottom : 'ns-resize',\n right : 'ew-resize',\n topleft : 'nwse-resize',\n bottomright: 'nwse-resize',\n topright : 'nesw-resize',\n bottomleft : 'nesw-resize',\n }),\n\n getCursor: function (action) {\n if (action.axis) {\n return resize.cursors[action.name + action.axis];\n }\n else if (action.edges) {\n let cursorKey = '';\n const edgeNames = ['top', 'bottom', 'left', 'right'];\n\n for (let i = 0; i < 4; i++) {\n if (action.edges[edgeNames[i]]) {\n cursorKey += edgeNames[i];\n }\n }\n\n return resize.cursors[cursorKey];\n }\n },\n};\n\n// resizestart\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'resizestart' || !interaction.prepared.edges) {\n return;\n }\n\n const startRect = interaction.target.getRect(interaction.element);\n const resizeOptions = interaction.target.options.resize;\n\n /*\n * When using the `resizable.square` or `resizable.preserveAspectRatio` options, resizing from one edge\n * will affect another. E.g. with `resizable.square`, resizing to make the right edge larger will make\n * the bottom edge larger by the same amount. We call these 'linked' edges. Any linked edges will depend\n * on the active edges and the edge being interacted with.\n */\n if (resizeOptions.square || resizeOptions.preserveAspectRatio) {\n const linkedEdges = utils.extend({}, interaction.prepared.edges);\n\n linkedEdges.top = linkedEdges.top || (linkedEdges.left && !linkedEdges.bottom);\n linkedEdges.left = linkedEdges.left || (linkedEdges.top && !linkedEdges.right );\n linkedEdges.bottom = linkedEdges.bottom || (linkedEdges.right && !linkedEdges.top );\n linkedEdges.right = linkedEdges.right || (linkedEdges.bottom && !linkedEdges.left );\n\n interaction.prepared._linkedEdges = linkedEdges;\n }\n else {\n interaction.prepared._linkedEdges = null;\n }\n\n // if using `resizable.preserveAspectRatio` option, record aspect ratio at the start of the resize\n if (resizeOptions.preserveAspectRatio) {\n interaction.resizeStartAspectRatio = startRect.width / startRect.height;\n }\n\n interaction.resizeRects = {\n start : startRect,\n current : utils.extend({}, startRect),\n inverted : utils.extend({}, startRect),\n previous : utils.extend({}, startRect),\n delta : {\n left: 0, right : 0, width : 0,\n top : 0, bottom: 0, height: 0,\n },\n };\n\n iEvent.rect = interaction.resizeRects.inverted;\n iEvent.deltaRect = interaction.resizeRects.delta;\n});\n\n// resizemove\nInteractEvent.signals.on('new', function ({ iEvent, phase, interaction }) {\n if (phase !== 'move' || !interaction.prepared.edges) { return; }\n\n const resizeOptions = interaction.target.options.resize;\n const invert = resizeOptions.invert;\n const invertible = invert === 'reposition' || invert === 'negate';\n\n let edges = interaction.prepared.edges;\n\n const start = interaction.resizeRects.start;\n const current = interaction.resizeRects.current;\n const inverted = interaction.resizeRects.inverted;\n const delta = interaction.resizeRects.delta;\n const previous = utils.extend(interaction.resizeRects.previous, inverted);\n const originalEdges = edges;\n\n let dx = iEvent.dx;\n let dy = iEvent.dy;\n\n if (resizeOptions.preserveAspectRatio || resizeOptions.square) {\n // `resize.preserveAspectRatio` takes precedence over `resize.square`\n const startAspectRatio = resizeOptions.preserveAspectRatio\n ? interaction.resizeStartAspectRatio\n : 1;\n\n edges = interaction.prepared._linkedEdges;\n\n if ((originalEdges.left && originalEdges.bottom)\n || (originalEdges.right && originalEdges.top)) {\n dy = -dx / startAspectRatio;\n }\n else if (originalEdges.left || originalEdges.right ) { dy = dx / startAspectRatio; }\n else if (originalEdges.top || originalEdges.bottom) { dx = dy * startAspectRatio; }\n }\n\n // update the 'current' rect without modifications\n if (edges.top ) { current.top += dy; }\n if (edges.bottom) { current.bottom += dy; }\n if (edges.left ) { current.left += dx; }\n if (edges.right ) { current.right += dx; }\n\n if (invertible) {\n // if invertible, copy the current rect\n utils.extend(inverted, current);\n\n if (invert === 'reposition') {\n // swap edge values if necessary to keep width/height positive\n let swap;\n\n if (inverted.top > inverted.bottom) {\n swap = inverted.top;\n\n inverted.top = inverted.bottom;\n inverted.bottom = swap;\n }\n if (inverted.left > inverted.right) {\n swap = inverted.left;\n\n inverted.left = inverted.right;\n inverted.right = swap;\n }\n }\n }\n else {\n // if not invertible, restrict to minimum of 0x0 rect\n inverted.top = Math.min(current.top, start.bottom);\n inverted.bottom = Math.max(current.bottom, start.top);\n inverted.left = Math.min(current.left, start.right);\n inverted.right = Math.max(current.right, start.left);\n }\n\n inverted.width = inverted.right - inverted.left;\n inverted.height = inverted.bottom - inverted.top ;\n\n for (const edge in inverted) {\n delta[edge] = inverted[edge] - previous[edge];\n }\n\n iEvent.edges = interaction.prepared.edges;\n iEvent.rect = inverted;\n iEvent.deltaRect = delta;\n});\n\n/*\\\n * Interactable.resizable\n [ method ]\n *\n * Gets or sets whether resize actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of resize elements\n | var isResizeable = interact('input[type=text]').resizable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on resize events (object makes the Interactable resizable)\n = (object) This Interactable\n | interact(element).resizable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | edges: {\n | top : true, // Use pointer coords to check for resize.\n | left : false, // Disable resizing from left edge.\n | bottom: '.resize-s',// Resize if pointer target matches selector\n | right : handleEl // Resize if pointer target is the given Element\n | },\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height are adjusted at a 1:1 ratio.\n | square: false,\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height maintain the aspect ratio they had when resizing started.\n | preserveAspectRatio: false,\n |\n | // a value of 'none' will limit the resize rect to a minimum of 0x0\n | // 'negate' will allow the rect to have negative width/height\n | // 'reposition' will keep the width/height positive by swapping\n | // the top and bottom edges and/or swapping the left and right edges\n | invert: 'none' || 'negate' || 'reposition'\n |\n | // limit multiple resizes.\n | // See the explanation in the @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n \\*/\nInteractable.prototype.resizable = function (options) {\n if (utils.is.object(options)) {\n this.options.resize.enabled = options.enabled === false? false: true;\n this.setPerAction('resize', options);\n this.setOnEvents('resize', options);\n\n if (/^x$|^y$|^xy$/.test(options.axis)) {\n this.options.resize.axis = options.axis;\n }\n else if (options.axis === null) {\n this.options.resize.axis = defaultOptions.resize.axis;\n }\n\n if (utils.is.bool(options.preserveAspectRatio)) {\n this.options.resize.preserveAspectRatio = options.preserveAspectRatio;\n }\n else if (utils.is.bool(options.square)) {\n this.options.resize.square = options.square;\n }\n\n return this;\n }\n if (utils.is.bool(options)) {\n this.options.resize.enabled = options;\n\n if (!options) {\n this.onresizestart = this.onresizestart = this.onresizeend = null;\n }\n\n return this;\n }\n return this.options.resize;\n};\n\nfunction checkResizeEdge (name, value, page, element, interactableElement, rect, margin) {\n // false, '', undefined, null\n if (!value) { return false; }\n\n // true value, use pointer coords and element rect\n if (value === true) {\n // if dimensions are negative, \"switch\" edges\n const width = utils.is.number(rect.width )? rect.width : rect.right - rect.left;\n const height = utils.is.number(rect.height)? rect.height : rect.bottom - rect.top ;\n\n if (width < 0) {\n if (name === 'left' ) { name = 'right'; }\n else if (name === 'right') { name = 'left' ; }\n }\n if (height < 0) {\n if (name === 'top' ) { name = 'bottom'; }\n else if (name === 'bottom') { name = 'top' ; }\n }\n\n if (name === 'left' ) { return page.x < ((width >= 0? rect.left: rect.right ) + margin); }\n if (name === 'top' ) { return page.y < ((height >= 0? rect.top : rect.bottom) + margin); }\n\n if (name === 'right' ) { return page.x > ((width >= 0? rect.right : rect.left) - margin); }\n if (name === 'bottom') { return page.y > ((height >= 0? rect.bottom: rect.top ) - margin); }\n }\n\n // the remaining checks require an element\n if (!utils.is.element(element)) { return false; }\n\n return utils.is.element(value)\n // the value is an element to use as a resize handle\n ? value === element\n // otherwise check if element matches value as selector\n : utils.matchesUpTo(element, value, interactableElement);\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.resizeAxes = 'xy';\n});\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action }) {\n if (action !== 'resize' || !interaction.resizeAxes) { return; }\n\n const options = interaction.target.options;\n\n if (options.resize.square) {\n if (interaction.resizeAxes === 'y') {\n iEvent.dx = iEvent.dy;\n }\n else {\n iEvent.dy = iEvent.dx;\n }\n iEvent.axes = 'xy';\n }\n else {\n iEvent.axes = interaction.resizeAxes;\n\n if (interaction.resizeAxes === 'x') {\n iEvent.dy = 0;\n }\n else if (interaction.resizeAxes === 'y') {\n iEvent.dx = 0;\n }\n }\n});\n\nactions.resize = resize;\nactions.names.push('resize');\nutils.merge(Interactable.eventTypes, [\n 'resizestart',\n 'resizemove',\n 'resizeinertiastart',\n 'resizeinertiaresume',\n 'resizeend',\n]);\nactions.methodDict.resize = 'resizable';\n\ndefaultOptions.resize = resize.defaults;\n\nmodule.exports = resize;\n","const raf = require('./utils/raf');\nconst getWindow = require('./utils/window').getWindow;\nconst is = require('./utils/is');\nconst domUtils = require('./utils/domUtils');\nconst Interaction = require('./Interaction');\nconst defaultOptions = require('./defaultOptions');\n\nconst autoScroll = {\n defaults: {\n enabled : false,\n container: null, // the item that is scrolled (Window or HTMLElement)\n margin : 60,\n speed : 300, // the scroll speed in pixels per second\n },\n\n interaction: null,\n i: null, // the handle returned by window.setInterval\n x: 0, y: 0, // Direction each pulse is to scroll in\n\n isScrolling: false,\n prevTime: 0,\n\n start: function (interaction) {\n autoScroll.isScrolling = true;\n raf.cancel(autoScroll.i);\n\n autoScroll.interaction = interaction;\n autoScroll.prevTime = new Date().getTime();\n autoScroll.i = raf.request(autoScroll.scroll);\n },\n\n stop: function () {\n autoScroll.isScrolling = false;\n raf.cancel(autoScroll.i);\n },\n\n // scroll the window by the values in scroll.x/y\n scroll: function () {\n const options = autoScroll.interaction.target.options[autoScroll.interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(autoScroll.interaction.element);\n const now = new Date().getTime();\n // change in time in seconds\n const dt = (now - autoScroll.prevTime) / 1000;\n // displacement\n const s = options.speed * dt;\n\n if (s >= 1) {\n if (is.window(container)) {\n container.scrollBy(autoScroll.x * s, autoScroll.y * s);\n }\n else if (container) {\n container.scrollLeft += autoScroll.x * s;\n container.scrollTop += autoScroll.y * s;\n }\n\n autoScroll.prevTime = now;\n }\n\n if (autoScroll.isScrolling) {\n raf.cancel(autoScroll.i);\n autoScroll.i = raf.request(autoScroll.scroll);\n }\n },\n check: function (interactable, actionName) {\n const options = interactable.options;\n\n return options[actionName].autoScroll && options[actionName].autoScroll.enabled;\n },\n onInteractionMove: function ({ interaction, pointer }) {\n if (!(interaction.interacting()\n && autoScroll.check(interaction.target, interaction.prepared.name))) {\n return;\n }\n\n if (interaction.simulation) {\n autoScroll.x = autoScroll.y = 0;\n return;\n }\n\n let top;\n let right;\n let bottom;\n let left;\n\n const options = interaction.target.options[interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(interaction.element);\n\n if (is.window(container)) {\n left = pointer.clientX < autoScroll.margin;\n top = pointer.clientY < autoScroll.margin;\n right = pointer.clientX > container.innerWidth - autoScroll.margin;\n bottom = pointer.clientY > container.innerHeight - autoScroll.margin;\n }\n else {\n const rect = domUtils.getElementClientRect(container);\n\n left = pointer.clientX < rect.left + autoScroll.margin;\n top = pointer.clientY < rect.top + autoScroll.margin;\n right = pointer.clientX > rect.right - autoScroll.margin;\n bottom = pointer.clientY > rect.bottom - autoScroll.margin;\n }\n\n autoScroll.x = (right ? 1: left? -1: 0);\n autoScroll.y = (bottom? 1: top? -1: 0);\n\n if (!autoScroll.isScrolling) {\n // set the autoScroll properties to those of the target\n autoScroll.margin = options.margin;\n autoScroll.speed = options.speed;\n\n autoScroll.start(interaction);\n }\n },\n};\n\nInteraction.signals.on('stop-active', function () {\n autoScroll.stop();\n});\n\nInteraction.signals.on('action-move', autoScroll.onInteractionMove);\n\ndefaultOptions.perAction.autoScroll = autoScroll.defaults;\n\nmodule.exports = autoScroll;\n","const Interactable = require('../Interactable');\nconst actions = require('../actions/base');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.ignoreFrom\n [ method ]\n *\n * If the target of the `mousedown`, `pointerdown` or `touchstart`\n * event or any of it's parents match the given CSS selector or\n * Element, no drag/resize/gesture is started.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to not ignore any elements\n = (string | Element | object) The current ignoreFrom value or this Interactable\n **\n | interact(element, { ignoreFrom: document.getElementById('no-action') });\n | // or\n | interact(element).ignoreFrom('input, textarea, a');\n\\*/\nInteractable.prototype.ignoreFrom = function (newValue) {\n return this._backCompatOption('ignoreFrom', newValue);\n};\n\n/*\\\n * Interactable.allowFrom\n [ method ]\n *\n * A drag/resize/gesture is started only If the target of the\n * `mousedown`, `pointerdown` or `touchstart` event or any of it's\n * parents match the given CSS selector or Element.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to allow from any element\n = (string | Element | object) The current allowFrom value or this Interactable\n **\n | interact(element, { allowFrom: document.getElementById('drag-handle') });\n | // or\n | interact(element).allowFrom('.handle');\n\\*/\nInteractable.prototype.allowFrom = function (newValue) {\n return this._backCompatOption('allowFrom', newValue);\n};\n\nInteractable.prototype.testIgnore = function (ignoreFrom, interactableElement, element) {\n if (!ignoreFrom || !is.element(element)) { return false; }\n\n if (is.string(ignoreFrom)) {\n return domUtils.matchesUpTo(element, ignoreFrom, interactableElement);\n }\n else if (is.element(ignoreFrom)) {\n return domUtils.nodeContains(ignoreFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testAllow = function (allowFrom, interactableElement, element) {\n if (!allowFrom) { return true; }\n\n if (!is.element(element)) { return false; }\n\n if (is.string(allowFrom)) {\n return domUtils.matchesUpTo(element, allowFrom, interactableElement);\n }\n else if (is.element(allowFrom)) {\n return domUtils.nodeContains(allowFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testIgnoreAllow = function (options, interactableElement, eventTarget) {\n return (!this.testIgnore(options.ignoreFrom, interactableElement, eventTarget)\n && this.testAllow(options.allowFrom, interactableElement, eventTarget));\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (event.buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\n","const interact = require('../interact');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst actions = require('../actions/base');\nconst defaultOptions = require('../defaultOptions');\nconst browser = require('../utils/browser');\nconst scope = require('../scope');\nconst utils = require('../utils');\nconst signals = require('../utils/Signals').new();\n\nrequire('./InteractableMethods');\n\nconst autoStart = {\n signals,\n withinInteractionLimit,\n // Allow this many interactions to happen simultaneously\n maxInteractions: Infinity,\n defaults: {\n perAction: {\n manualStart: false,\n max: Infinity,\n maxPerElement: 1,\n allowFrom: null,\n ignoreFrom: null,\n },\n },\n setActionDefaults: function (action) {\n utils.extend(action.defaults, autoStart.defaults.perAction);\n },\n};\n\n// set cursor style on mousedown\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget }) {\n if (interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\n// set cursor style on mousemove\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget }) {\n if (!interaction.mouse\n || interaction.pointerIsDown\n || interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\nInteraction.signals.on('move', function (arg) {\n const { interaction, event } = arg;\n\n if (!interaction.pointerIsDown\n || interaction.interacting()\n || !interaction.pointerWasMoved\n || !interaction.prepared.name) {\n return;\n }\n\n signals.fire('before-start', arg);\n\n const target = interaction.target;\n\n if (interaction.prepared.name && target) {\n // check manualStart and interaction limit\n if (target.options[interaction.prepared.name].manualStart\n || !withinInteractionLimit(target, interaction.element, interaction.prepared)) {\n interaction.stop(event);\n }\n else {\n interaction.start(interaction.prepared, target, interaction.element);\n }\n }\n});\n\n// Check if the current target supports the action.\n// If so, return the validated action. Otherwise, return null\nfunction validateAction (action, interactable, element, eventTarget) {\n if (utils.is.object(action)\n && interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget)\n && interactable.options[action.name].enabled\n && withinInteractionLimit(interactable, element, action)) {\n return action;\n }\n\n return null;\n}\n\nfunction validateSelector (interaction, pointer, event, matches, matchElements, eventTarget) {\n for (let i = 0, len = matches.length; i < len; i++) {\n const match = matches[i];\n const matchElement = matchElements[i];\n const action = validateAction(match.getAction(pointer, event, interaction, matchElement),\n match,\n matchElement,\n eventTarget);\n\n if (action) {\n return {\n action,\n target: match,\n element: matchElement,\n };\n }\n }\n\n return {};\n}\n\nfunction getActionInfo (interaction, pointer, event, eventTarget) {\n let matches = [];\n let matchElements = [];\n\n let element = eventTarget;\n let action = null;\n\n function pushMatches (interactable, selector, context) {\n const elements = (browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined);\n\n if (utils.matchesSelector(element, selector, elements)) {\n\n matches.push(interactable);\n matchElements.push(element);\n }\n }\n\n while (utils.is.element(element)) {\n matches = [];\n matchElements = [];\n\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && (action = validateAction(elementInteractable.getAction(pointer, event, interaction, element, eventTarget),\n elementInteractable,\n element,\n eventTarget))\n && !elementInteractable.options[action.name].manualStart) {\n return {\n element,\n action,\n target: elementInteractable,\n };\n }\n else {\n scope.interactables.forEachSelector(pushMatches, element);\n\n const actionInfo = validateSelector(interaction, pointer, event, matches, matchElements, eventTarget);\n\n if (actionInfo.action\n && !actionInfo.target.options[actionInfo.action.name].manualStart) {\n return actionInfo;\n }\n }\n\n element = utils.parentNode(element);\n }\n\n return {};\n}\n\nfunction prepare (interaction, { action, target, element }) {\n action = action || {};\n\n if (interaction.target && interaction.target.options.styleCursor) {\n interaction.target._doc.documentElement.style.cursor = '';\n }\n\n interaction.target = target;\n interaction.element = element;\n utils.copyAction(interaction.prepared, action);\n\n if (target && target.options.styleCursor) {\n const cursor = action? actions[action.name].getCursor(action) : '';\n interaction.target._doc.documentElement.style.cursor = cursor;\n }\n\n signals.fire('prepared', { interaction: interaction });\n}\n\nInteraction.signals.on('stop', function ({ interaction }) {\n const target = interaction.target;\n\n if (target && target.options.styleCursor) {\n target._doc.documentElement.style.cursor = '';\n }\n});\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (utils.is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (utils.is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n const buttons = event.buttons || ({\n 0: 1,\n 1: 4,\n 3: 8,\n 4: 16,\n })[event.button];\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\nfunction withinInteractionLimit (interactable, element, action) {\n const options = interactable.options;\n const maxActions = options[action.name].max;\n const maxPerElement = options[action.name].maxPerElement;\n let activeInteractions = 0;\n let targetCount = 0;\n let targetElementCount = 0;\n\n // no actions if any of these values == 0\n if (!(maxActions && maxPerElement && autoStart.maxInteractions)) { return; }\n\n for (let i = 0, len = scope.interactions.length; i < len; i++) {\n const interaction = scope.interactions[i];\n const otherAction = interaction.prepared.name;\n\n if (!interaction.interacting()) { continue; }\n\n activeInteractions++;\n\n if (activeInteractions >= autoStart.maxInteractions) {\n return false;\n }\n\n if (interaction.target !== interactable) { continue; }\n\n targetCount += (otherAction === action.name)|0;\n\n if (targetCount >= maxActions) {\n return false;\n }\n\n if (interaction.element === element) {\n targetElementCount++;\n\n if (otherAction !== action.name || targetElementCount >= maxPerElement) {\n return false;\n }\n }\n }\n\n return autoStart.maxInteractions > 0;\n}\n\n/*\\\n * interact.maxInteractions\n [ method ]\n **\n * Returns or sets the maximum number of concurrent interactions allowed.\n * By default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables\n * and elements, you need to enable it in the draggable, resizable and\n * gesturable `'max'` and `'maxPerElement'` options.\n **\n - newValue (number) #optional Any number. newValue <= 0 means no interactions.\n\\*/\ninteract.maxInteractions = function (newValue) {\n if (utils.is.number(newValue)) {\n autoStart.maxInteractions = newValue;\n\n return this;\n }\n\n return autoStart.maxInteractions;\n};\n\nInteractable.settingsMethods.push('styleCursor');\nInteractable.settingsMethods.push('actionChecker');\nInteractable.settingsMethods.push('ignoreFrom');\nInteractable.settingsMethods.push('allowFrom');\n\ndefaultOptions.base.actionChecker = null;\ndefaultOptions.base.styleCursor = true;\n\nutils.extend(defaultOptions.perAction, autoStart.defaults.perAction);\n\nmodule.exports = autoStart;\n","const autoStart = require('./base');\nconst Interaction = require('../Interaction');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.delayTimer = null;\n});\n\nautoStart.signals.on('prepared', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.delayTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.target, interaction.element);\n }, delay);\n }\n});\n\nInteraction.signals.on('move', function ({ interaction, duplicate }) {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.delayTimer);\n }\n});\n\n// prevent regular down->move autoStart\nautoStart.signals.on('before-start', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.prepared.name = null;\n }\n});\n","const autoStart = require('./base');\nconst scope = require('../scope');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\n\nconst { matchesSelector, parentNode } = require('../utils/domUtils');\n\nautoStart.setActionDefaults(require('../actions/drag'));\n\nautoStart.signals.on('before-start', function ({ interaction, eventTarget, dx, dy }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // check if a drag is in the correct axis\n const absX = Math.abs(dx);\n const absY = Math.abs(dy);\n const options = interaction.target.options.drag;\n const startAxis = options.startAxis;\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy');\n\n interaction.prepared.axis = options.lockAxis === 'start'\n ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n : options.lockAxis;\n\n // if the movement isn't in the startAxis of the interactable\n if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) {\n // cancel the prepared action\n interaction.prepared.name = null;\n\n // then try to get a drag from another ineractable\n\n if (!interaction.prepared.name) {\n\n let element = eventTarget;\n\n const getDraggable = function (interactable, selector, context) {\n const elements = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n if (interactable === interaction.target) { return; }\n\n if (!options.manualStart\n && !interactable.testIgnoreAllow(options, element, eventTarget)\n && matchesSelector(element, selector, elements)) {\n\n const action = interactable.getAction(interaction.downPointer,\n interaction.downEvent,\n interaction,\n element);\n\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, interactable)\n && autoStart.validateAction(action, interactable, element, eventTarget)) {\n\n return interactable;\n }\n }\n };\n\n let action = null;\n\n // check all interactables\n while (is.element(element)) {\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && elementInteractable !== interaction.target\n && !elementInteractable.options.drag.manualStart) {\n\n action = elementInteractable.getAction(interaction.downPointer, interaction.downEvent, interaction, element);\n }\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, elementInteractable)) {\n\n interaction.prepared.name = 'drag';\n interaction.target = elementInteractable;\n interaction.element = element;\n break;\n }\n\n const selectorInteractable = scope.interactables.forEachSelector(getDraggable, element);\n\n if (selectorInteractable) {\n interaction.prepared.name = 'drag';\n interaction.target = selectorInteractable;\n interaction.element = element;\n break;\n }\n\n element = parentNode(element);\n }\n }\n }\n});\n\nfunction checkStartAxis (startAxis, interactable) {\n if (!interactable) { return false; }\n\n const thisAxis = interactable.options.drag.startAxis;\n\n return (startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis);\n}\n","require('./base').setActionDefaults(require('../actions/gesture'));\n","require('./base').setActionDefaults(require('../actions/resize'));\n","module.exports = {\n base: {\n accept : null,\n preventDefault: 'auto',\n deltaSource : 'page',\n },\n\n perAction: {\n origin: { x: 0, y: 0 },\n\n // only allow left button by default\n // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n mouseButtons: 1,\n\n inertia: {\n enabled : false,\n resistance : 10, // the lambda in exponential decay\n minSpeed : 100, // target speed must be above this for inertia to start\n endSpeed : 10, // the speed at which inertia is slow enough to stop\n allowResume : true, // allow resuming an action in inertia phase\n smoothEndDuration: 300, // animate to snap/restrict endOnly if there's no inertia\n },\n },\n};\n","/* browser entry point */\n\n// Legacy browser support\nrequire('./legacyBrowsers');\n\n// inertia\nrequire('./inertia');\n\n// modifiers\nrequire('./modifiers/snap');\nrequire('./modifiers/restrict');\n\n// pointerEvents\nrequire('./pointerEvents/base');\nrequire('./pointerEvents/holdRepeat');\nrequire('./pointerEvents/interactableTargets');\n\n// delay\nrequire('./autoStart/delay');\n\n// actions\nrequire('./actions/gesture');\nrequire('./actions/resize');\nrequire('./actions/drag');\nrequire('./actions/drop');\n\n// load these modifiers after resize is loaded\nrequire('./modifiers/snapSize');\nrequire('./modifiers/restrictEdges');\nrequire('./modifiers/restrictSize');\n\n// autoStart actions\nrequire('./autoStart/gesture');\nrequire('./autoStart/resize');\nrequire('./autoStart/drag');\n\n// Interactable preventDefault setting\nrequire('./interactablePreventDefault.js');\n\n// autoScroll\nrequire('./autoScroll');\n\n// export interact\nmodule.exports = require('./interact');\n","const InteractEvent = require('./InteractEvent');\nconst Interaction = require('./Interaction');\nconst modifiers = require('./modifiers');\nconst utils = require('./utils');\nconst animationFrame = require('./utils/raf');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.inertiaStatus = {\n active : false,\n smoothEnd : false,\n allowResume: false,\n\n startEvent: null,\n upCoords : {},\n\n xe: 0, ye: 0,\n sx: 0, sy: 0,\n\n t0: 0,\n vx0: 0, vys: 0,\n duration: 0,\n\n lambda_v0: 0,\n one_ve_v0: 0,\n i : null,\n };\n\n interaction.boundInertiaFrame = () => inertiaFrame .apply(interaction);\n interaction.boundSmoothEndFrame = () => smoothEndFrame.apply(interaction);\n});\n\nInteraction.signals.on('down', function ({ interaction, event, pointer, eventTarget }) {\n const status = interaction.inertiaStatus;\n\n // Check if the down event hits the current inertia target\n if (status.active) {\n let element = eventTarget;\n\n // climb up the DOM tree from the event target\n while (utils.is.element(element)) {\n\n // if interaction element is the current inertia target element\n if (element === interaction.element) {\n // stop inertia\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n\n // update pointers to the down event's coordinates\n interaction.updatePointer(pointer);\n utils.setCoords(interaction.curCoords, interaction.pointers);\n\n // fire appropriate signals\n const signalArg = { interaction };\n Interaction.signals.fire('before-action-move', signalArg);\n Interaction.signals.fire('action-resume' , signalArg);\n\n // fire a reume event\n const resumeEvent = new InteractEvent(interaction,\n event,\n interaction.prepared.name,\n 'inertiaresume',\n interaction.element);\n\n interaction.target.fire(resumeEvent);\n interaction.prevEvent = resumeEvent;\n modifiers.resetStatuses(interaction.modifierStatuses);\n\n utils.copyCoords(interaction.prevCoords, interaction.curCoords);\n break;\n }\n\n element = utils.parentNode(element);\n }\n }\n});\n\nInteraction.signals.on('up', function ({ interaction, event }) {\n const status = interaction.inertiaStatus;\n\n if (!interaction.interacting() || status.active) { return; }\n\n const target = interaction.target;\n const options = target && target.options;\n const inertiaOptions = options && interaction.prepared.name && options[interaction.prepared.name].inertia;\n\n const now = new Date().getTime();\n const statuses = {};\n const page = utils.extend({}, interaction.curCoords.page);\n const pointerSpeed = interaction.pointerDelta.client.speed;\n\n let smoothEnd = false;\n let modifierResult;\n\n // check if inertia should be started\n const inertiaPossible = (inertiaOptions && inertiaOptions.enabled\n && interaction.prepared.name !== 'gesture'\n && event !== status.startEvent);\n\n const inertia = (inertiaPossible\n && (now - interaction.curCoords.timeStamp) < 50\n && pointerSpeed > inertiaOptions.minSpeed\n && pointerSpeed > inertiaOptions.endSpeed);\n\n const modifierArg = {\n interaction,\n pageCoords: page,\n statuses,\n preEnd: true,\n requireEndOnly: true,\n };\n\n // smoothEnd\n if (inertiaPossible && !inertia) {\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n if (modifierResult.shouldMove && modifierResult.locked) {\n smoothEnd = true;\n }\n }\n\n if (!(inertia || smoothEnd)) { return; }\n\n utils.copyCoords(status.upCoords, interaction.curCoords);\n\n interaction.pointers[0] = status.startEvent =\n new InteractEvent(interaction, event, interaction.prepared.name, 'inertiastart', interaction.element);\n\n status.t0 = now;\n\n status.active = true;\n status.allowResume = inertiaOptions.allowResume;\n interaction.simulation = status;\n\n target.fire(status.startEvent);\n\n if (inertia) {\n status.vx0 = interaction.pointerDelta.client.vx;\n status.vy0 = interaction.pointerDelta.client.vy;\n status.v0 = pointerSpeed;\n\n calcInertia(interaction, status);\n\n utils.extend(page, interaction.curCoords.page);\n\n page.x += status.xe;\n page.y += status.ye;\n\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n status.modifiedXe += modifierResult.dx;\n status.modifiedYe += modifierResult.dy;\n\n status.i = animationFrame.request(interaction.boundInertiaFrame);\n }\n else {\n status.smoothEnd = true;\n status.xe = modifierResult.dx;\n status.ye = modifierResult.dy;\n\n status.sx = status.sy = 0;\n\n status.i = animationFrame.request(interaction.boundSmoothEndFrame);\n }\n});\n\nInteraction.signals.on('stop-active', function ({ interaction }) {\n const status = interaction.inertiaStatus;\n\n if (status.active) {\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n }\n});\n\nfunction calcInertia (interaction, status) {\n const inertiaOptions = interaction.target.options[interaction.prepared.name].inertia;\n const lambda = inertiaOptions.resistance;\n const inertiaDur = -Math.log(inertiaOptions.endSpeed / status.v0) / lambda;\n\n status.x0 = interaction.prevEvent.pageX;\n status.y0 = interaction.prevEvent.pageY;\n status.t0 = status.startEvent.timeStamp / 1000;\n status.sx = status.sy = 0;\n\n status.modifiedXe = status.xe = (status.vx0 - inertiaDur) / lambda;\n status.modifiedYe = status.ye = (status.vy0 - inertiaDur) / lambda;\n status.te = inertiaDur;\n\n status.lambda_v0 = lambda / status.v0;\n status.one_ve_v0 = 1 - inertiaOptions.endSpeed / status.v0;\n}\n\nfunction inertiaFrame () {\n updateInertiaCoords(this);\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n\n const status = this.inertiaStatus;\n const options = this.target.options[this.prepared.name].inertia;\n const lambda = options.resistance;\n const t = new Date().getTime() / 1000 - status.t0;\n\n if (t < status.te) {\n\n const progress = 1 - (Math.exp(-lambda * t) - status.lambda_v0) / status.one_ve_v0;\n\n if (status.modifiedXe === status.xe && status.modifiedYe === status.ye) {\n status.sx = status.xe * progress;\n status.sy = status.ye * progress;\n }\n else {\n const quadPoint = utils.getQuadraticCurvePoint(0, 0,\n status.xe,\n status.ye,\n status.modifiedXe,\n status.modifiedYe,\n progress);\n\n status.sx = quadPoint.x;\n status.sy = quadPoint.y;\n }\n\n this.doMove();\n\n status.i = animationFrame.request(this.boundInertiaFrame);\n }\n else {\n status.sx = status.modifiedXe;\n status.sy = status.modifiedYe;\n\n this.doMove();\n this.end(status.startEvent);\n status.active = false;\n this.simulation = null;\n }\n\n utils.copyCoords(this.prevCoords, this.curCoords);\n}\n\nfunction smoothEndFrame () {\n updateInertiaCoords(this);\n\n const status = this.inertiaStatus;\n const t = new Date().getTime() - status.t0;\n const duration = this.target.options[this.prepared.name].inertia.smoothEndDuration;\n\n if (t < duration) {\n status.sx = utils.easeOutQuad(t, 0, status.xe, duration);\n status.sy = utils.easeOutQuad(t, 0, status.ye, duration);\n\n this.pointerMove(status.startEvent, status.startEvent);\n\n status.i = animationFrame.request(this.boundSmoothEndFrame);\n }\n else {\n status.sx = status.xe;\n status.sy = status.ye;\n\n this.pointerMove(status.startEvent, status.startEvent);\n this.end(status.startEvent);\n\n status.smoothEnd =\n status.active = false;\n this.simulation = null;\n }\n}\n\nfunction updateInertiaCoords (interaction) {\n const status = interaction.inertiaStatus;\n\n // return if inertia isn't running\n if (!status.active) { return; }\n\n const pageUp = status.upCoords.page;\n const clientUp = status.upCoords.client;\n\n utils.setCoords(interaction.curCoords, [ {\n pageX : pageUp.x + status.sx,\n pageY : pageUp.y + status.sy,\n clientX: clientUp.x + status.sx,\n clientY: clientUp.y + status.sy,\n } ]);\n}\n","const browser = require('./utils/browser');\nconst events = require('./utils/events');\nconst utils = require('./utils');\nconst scope = require('./scope');\nconst Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\n\nconst globalEvents = {};\n\n/*\\\n * interact\n [ method ]\n *\n * The methods of this variable can be used to set elements as\n * interactables and also to change various default settings.\n *\n * Calling it as a function and passing an element or a valid CSS selector\n * string returns an Interactable object which has various methods to\n * configure it.\n *\n - element (Element | string) The HTML or SVG Element to interact with or CSS selector\n = (object) An @Interactable\n *\n > Usage\n | interact('#draggable').draggable(true);\n |\n | var rectables = interact('rect');\n | rectables\n | .gesturable(true)\n | .on('gesturemove', function (event) {\n | // ...\n | });\n\\*/\nfunction interact (element, options) {\n let interactable = scope.interactables.get(element, options);\n\n if (!interactable) {\n interactable = new Interactable(element, options);\n interactable.events.global = globalEvents;\n }\n\n return interactable;\n}\n\n/*\\\n * interact.isSet\n [ method ]\n *\n * Check if an element has been set\n - element (Element) The Element being searched for\n = (boolean) Indicates if the element or CSS selector was previously passed to interact\n\\*/\ninteract.isSet = function (element, options) {\n return scope.interactables.indexOfElement(element, options && options.context) !== -1;\n};\n\n/*\\\n * interact.on\n [ method ]\n *\n * Adds a global listener for an InteractEvent or adds a DOM event to\n * `document`\n *\n - type (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) interact\n\\*/\ninteract.on = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.on(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.on(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n // if it is an InteractEvent type, add listener to globalEvents\n if (utils.contains(Interactable.eventTypes, type)) {\n // if this type of event was never bound\n if (!globalEvents[type]) {\n globalEvents[type] = [listener];\n }\n else {\n globalEvents[type].push(listener);\n }\n }\n // If non InteractEvent type, addEventListener to document\n else {\n events.add(scope.document, type, listener, { options });\n }\n\n return interact;\n};\n\n/*\\\n * interact.off\n [ method ]\n *\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n - type (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) interact\n \\*/\ninteract.off = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.off(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.off(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n if (!utils.contains(Interactable.eventTypes, type)) {\n events.remove(scope.document, type, listener, options);\n }\n else {\n let index;\n\n if (type in globalEvents\n && (index = utils.indexOf(globalEvents[type], listener)) !== -1) {\n globalEvents[type].splice(index, 1);\n }\n }\n\n return interact;\n};\n\n/*\\\n * interact.debug\n [ method ]\n *\n * Returns an object which exposes internal data\n = (object) An object with properties that outline the current state and expose internal functions and variables\n\\*/\ninteract.debug = function () {\n return scope;\n};\n\n// expose the functions used to calculate multi-touch properties\ninteract.getPointerAverage = utils.pointerAverage;\ninteract.getTouchBBox = utils.touchBBox;\ninteract.getTouchDistance = utils.touchDistance;\ninteract.getTouchAngle = utils.touchAngle;\n\ninteract.getElementRect = utils.getElementRect;\ninteract.getElementClientRect = utils.getElementClientRect;\ninteract.matchesSelector = utils.matchesSelector;\ninteract.closest = utils.closest;\n\n/*\\\n * interact.supportsTouch\n [ method ]\n *\n = (boolean) Whether or not the browser supports touch input\n\\*/\ninteract.supportsTouch = function () {\n return browser.supportsTouch;\n};\n\n/*\\\n * interact.supportsPointerEvent\n [ method ]\n *\n = (boolean) Whether or not the browser supports PointerEvents\n\\*/\ninteract.supportsPointerEvent = function () {\n return browser.supportsPointerEvent;\n};\n\n/*\\\n * interact.stop\n [ method ]\n *\n * Cancels all interactions (end events are not fired)\n *\n - event (Event) An event on which to call preventDefault()\n = (object) interact\n\\*/\ninteract.stop = function (event) {\n for (let i = scope.interactions.length - 1; i >= 0; i--) {\n scope.interactions[i].stop(event);\n }\n\n return interact;\n};\n\n/*\\\n * interact.pointerMoveTolerance\n [ method ]\n * Returns or sets the distance the pointer must be moved before an action\n * sequence occurs. This also affects tolerance for tap events.\n *\n - newValue (number) #optional The movement from the start position must be greater than this value\n = (number | Interactable) The current setting or interact\n\\*/\ninteract.pointerMoveTolerance = function (newValue) {\n if (utils.is.number(newValue)) {\n Interaction.pointerMoveTolerance = newValue;\n\n return this;\n }\n\n return Interaction.pointerMoveTolerance;\n};\n\ninteract.addDocument = scope.addDocument;\ninteract.removeDocument = scope.removeDocument;\n\nscope.interact = interact;\n\nmodule.exports = interact;\n","const Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\nconst scope = require('./scope');\nconst is = require('./utils/is');\nconst events = require('./utils/events');\n\nconst { nodeContains, matchesSelector } = require('./utils/domUtils');\n\n/*\\\n * Interactable.preventDefault\n [ method ]\n *\n * Returns or sets whether to prevent the browser's default behaviour\n * in response to pointer events. Can be set to:\n * - `'always'` to always prevent\n * - `'never'` to never prevent\n * - `'auto'` to let interact.js try to determine what would be best\n *\n - newValue (string) #optional `true`, `false` or `'auto'`\n = (string | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.preventDefault = function (newValue) {\n if (/^(always|never|auto)$/.test(newValue)) {\n this.options.preventDefault = newValue;\n return this;\n }\n\n if (is.bool(newValue)) {\n this.options.preventDefault = newValue? 'always' : 'never';\n return this;\n }\n\n return this.options.preventDefault;\n};\n\nInteractable.prototype.checkAndPreventDefault = function (event) {\n const setting = this.options.preventDefault;\n\n if (setting === 'never') { return; }\n\n if (setting === 'always') {\n event.preventDefault();\n return;\n }\n\n // setting === 'auto'\n\n // don't preventDefault if the browser supports passiveEvents\n // CSS touch-action and user-selecct should be used instead\n if (events.supportsOptions) {\n return;\n }\n\n // don't preventDefault of pointerdown events\n if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) {\n return;\n }\n\n // don't preventDefault on editable elements\n if (is.element(event.target)\n && matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) {\n return;\n }\n\n event.preventDefault();\n};\n\nfunction onInteractionEvent ({ interaction, event }) {\n if (interaction.target) {\n interaction.target.checkAndPreventDefault(event);\n }\n}\n\nfor (const eventSignal of ['down', 'move', 'up', 'cancel']) {\n Interaction.signals.on(eventSignal, onInteractionEvent);\n}\n\n// prevent native HTML5 drag on interact.js target elements\nInteraction.docEvents.dragstart = function preventNativeDrag (event) {\n for (const interaction of scope.interactions) {\n\n if (interaction.element\n && (interaction.element === event.target\n || nodeContains(interaction.element, event.target))) {\n\n interaction.target.checkAndPreventDefault(event);\n return;\n }\n }\n};\n","const scope = require('./scope');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst iFinder = require('./utils/interactionFinder');\nconst pointerEvents = require('./pointerEvents/base');\n\nconst { window } = require('./utils/window');\n\nconst toString = Object.prototype.toString;\n\nif (!window.Array.isArray) {\n window.Array.isArray = function (obj) {\n return toString.call(obj) === '[object Array]';\n };\n}\n\nif (!String.prototype.trim) {\n String.prototype.trim = function () {\n return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n };\n}\n\n// http://www.quirksmode.org/dom/events/click.html\n// >Events leading to dblclick\n//\n// IE8 doesn't fire down event before dblclick.\n// This workaround tries to fire a tap and doubletap after dblclick\nfunction onIE8Dblclick (event) {\n const eventTarget = event.target;\n const interaction = iFinder.search(event, event.type, eventTarget);\n\n if (!interaction) { return; }\n\n if (interaction.prevTap\n && event.clientX === interaction.prevTap.clientX\n && event.clientY === interaction.prevTap.clientY\n && eventTarget === interaction.prevTap.target) {\n\n interaction.downTargets[0] = eventTarget;\n interaction.downTimes [0] = new Date().getTime();\n\n pointerEvents.fire({\n interaction,\n event,\n eventTarget,\n pointer: event,\n type: 'tap',\n });\n }\n}\n\nif (browser.isIE8) {\n const selectFix = function (event) {\n for (const interaction of scope.interactions) {\n if (interaction.interacting()) {\n interaction.target.checkAndPreventDefault(event);\n }\n }\n };\n\n const onDocIE8 = function onDocIE8 ({ doc, win }, signalName) {\n const eventMethod = signalName.indexOf('listen') === 0\n ? events.add : events.remove;\n\n // For IE's lack of Event#preventDefault\n eventMethod(doc, 'selectstart', selectFix);\n\n if (pointerEvents) {\n eventMethod(doc, 'dblclick', onIE8Dblclick);\n }\n };\n\n scope.signals.on('add-document' , onDocIE8);\n scope.signals.on('remove-document', onDocIE8);\n}\n\nmodule.exports = null;\n","const InteractEvent = require('../InteractEvent');\nconst Interaction = require('../Interaction');\nconst extend = require('../utils/extend');\n\nconst modifiers = {\n names: [],\n\n setOffsets: function (arg) {\n const { interaction, pageCoords: page } = arg;\n const { target, element, startOffset } = interaction;\n const rect = target.getRect(element);\n\n if (rect) {\n startOffset.left = page.x - rect.left;\n startOffset.top = page.y - rect.top;\n\n startOffset.right = rect.right - page.x;\n startOffset.bottom = rect.bottom - page.y;\n\n if (!('width' in rect)) { rect.width = rect.right - rect.left; }\n if (!('height' in rect)) { rect.height = rect.bottom - rect.top ; }\n }\n else {\n startOffset.left = startOffset.top = startOffset.right = startOffset.bottom = 0;\n }\n\n arg.rect = rect;\n arg.interactable = target;\n arg.element = element;\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n\n arg.options = target.options[interaction.prepared.name][modifierName];\n\n if (!arg.options) {\n continue;\n }\n\n interaction.modifierOffsets[modifierName] = modifiers[modifierName].setOffset(arg);\n }\n },\n\n setAll: function (arg) {\n const { interaction, statuses, preEnd, requireEndOnly } = arg;\n const coords = extend({}, arg.pageCoords);\n const result = {\n dx: 0,\n dy: 0,\n changed: false,\n locked: false,\n shouldMove: true,\n };\n\n for (const modifierName of modifiers.names) {\n const modifier = modifiers[modifierName];\n const options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!shouldDo(options, preEnd, requireEndOnly)) { continue; }\n\n arg.status = arg.status = statuses[modifierName];\n arg.options = options;\n arg.offset = arg.interaction.modifierOffsets[modifierName];\n\n modifier.set(arg);\n\n if (arg.status.locked) {\n coords.x += arg.status.dx;\n coords.y += arg.status.dy;\n\n result.dx += arg.status.dx;\n result.dy += arg.status.dy;\n\n result.locked = true;\n }\n }\n\n // a move should be fired if:\n // - there are no modifiers enabled,\n // - no modifiers are \"locked\" i.e. have changed the pointer's coordinates, or\n // - the locked coords have changed since the last pointer move\n result.shouldMove = !arg.status || !result.locked || arg.status.changed;\n\n return result;\n },\n\n resetStatuses: function (statuses) {\n for (const modifierName of modifiers.names) {\n const status = statuses[modifierName] || {};\n\n status.dx = status.dy = 0;\n status.modifiedX = status.modifiedY = NaN;\n status.locked = false;\n status.changed = true;\n\n statuses[modifierName] = status;\n }\n\n return statuses;\n },\n\n start: function ({ interaction }, signalName) {\n const arg = {\n interaction,\n pageCoords: (signalName === 'action-resume' ?\n interaction.curCoords : interaction.startCoords).page,\n startOffset: interaction.startOffset,\n statuses: interaction.modifierStatuses,\n preEnd: false,\n requireEndOnly: false,\n };\n\n modifiers.setOffsets(arg);\n modifiers.resetStatuses(arg.statuses);\n\n arg.pageCoords = extend({}, interaction.startCoords.page);\n interaction.modifierResult = modifiers.setAll(arg);\n },\n};\n\nInteraction.signals.on('new', function (interaction) {\n interaction.startOffset = { left: 0, right: 0, top: 0, bottom: 0 };\n interaction.modifierOffsets = {};\n interaction.modifierStatuses = modifiers.resetStatuses({});\n interaction.modifierResult = null;\n});\n\nInteraction.signals.on('action-start' , modifiers.start);\nInteraction.signals.on('action-resume', modifiers.start);\n\nInteraction.signals.on('before-action-move', function ({ interaction, preEnd, interactingBeforeMove }) {\n const modifierResult = modifiers.setAll({\n interaction,\n preEnd,\n pageCoords: interaction.curCoords.page,\n statuses: interaction.modifierStatuses,\n requireEndOnly: false,\n });\n\n // don't fire an action move if a modifier would keep the event in the same\n // cordinates as before\n if (!modifierResult.shouldMove && interactingBeforeMove) {\n interaction._dontFireMove = true;\n }\n\n interaction.modifierResult = modifierResult;\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n for (let i = 0; i < modifiers.names.length; i++) {\n const options = interaction.target.options[interaction.prepared.name][modifiers.names[i]];\n\n // if the endOnly option is true for any modifier\n if (shouldDo(options, true, true)) {\n // fire a move event at the modified coordinates\n interaction.doMove({ event, preEnd: true });\n break;\n }\n }\n});\n\nInteractEvent.signals.on('set-xy', function (arg) {\n const { iEvent, interaction } = arg;\n const modifierArg = extend({}, arg);\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n modifierArg.options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!modifierArg.options) {\n continue;\n }\n\n const modifier = modifiers[modifierName];\n\n modifierArg.status = interaction.modifierStatuses[modifierName];\n\n iEvent[modifierName] = modifier.modifyCoords(modifierArg);\n }\n});\n\nfunction shouldDo (options, preEnd, requireEndOnly) {\n return (options && options.enabled\n && (preEnd || !options.endOnly)\n && (!requireEndOnly || options.endOnly));\n}\n\nmodule.exports = modifiers;\n","const modifiers = require('./index');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst restrict = {\n defaults: {\n enabled : false,\n endOnly : false,\n restriction: null,\n elementRect: null,\n },\n\n setOffset: function ({ rect, startOffset, options }) {\n const elementRect = options && options.elementRect;\n const offset = {};\n\n if (rect && elementRect) {\n offset.left = startOffset.left - (rect.width * elementRect.left);\n offset.top = startOffset.top - (rect.height * elementRect.top);\n\n offset.right = startOffset.right - (rect.width * (1 - elementRect.right));\n offset.bottom = startOffset.bottom - (rect.height * (1 - elementRect.bottom));\n }\n else {\n offset.left = offset.top = offset.right = offset.bottom = 0;\n }\n\n return offset;\n },\n\n set: function ({ pageCoords, interaction, status, options }) {\n if (!options) { return status; }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n\n const restriction = getRestrictionRect(options.restriction, interaction, page);\n\n if (!restriction) { return status; }\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n const rect = restriction;\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n const offset = interaction.modifierOffsets.restrict;\n\n // object is assumed to have\n // x, y, width, height or\n // left, top, right, bottom\n if ('x' in restriction && 'y' in restriction) {\n modifiedX = Math.max(Math.min(rect.x + rect.width - offset.right , page.x), rect.x + offset.left);\n modifiedY = Math.max(Math.min(rect.y + rect.height - offset.bottom, page.y), rect.y + offset.top );\n }\n else {\n modifiedX = Math.max(Math.min(rect.right - offset.right , page.x), rect.left + offset.left);\n modifiedY = Math.max(Math.min(rect.bottom - offset.bottom, page.y), rect.top + offset.top );\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const elementRect = options && options.elementRect;\n\n if (options && options.enabled\n && !(phase === 'start' && elementRect && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n getRestrictionRect,\n};\n\nfunction getRestrictionRect (value, interaction, page) {\n if (utils.is.function(value)) {\n return utils.resolveRectLike(value, interaction.target, interaction.element, [page.x, page.y, interaction]);\n } else {\n return utils.resolveRectLike(value, interaction.target, interaction.element);\n }\n}\n\nmodifiers.restrict = restrict;\nmodifiers.names.push('restrict');\n\ndefaultOptions.perAction.restrict = restrict.defaults;\n\nmodule.exports = restrict;\n","// This module adds the options.resize.restrictEdges setting which sets min and\n// max for the top, left, bottom and right edges of the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictEdges: {\n// inner: { top: 200, left: 200, right: 400, bottom: 400 },\n// outer: { top: 0, left: 0, right: 600, bottom: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst { getRestrictionRect } = require('./restrict');\n\nconst noInner = { top: +Infinity, left: +Infinity, bottom: -Infinity, right: -Infinity };\nconst noOuter = { top: -Infinity, left: -Infinity, bottom: +Infinity, right: +Infinity };\n\nconst restrictEdges = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n offset: null,\n },\n\n setOffset: function ({ interaction, startOffset, options }) {\n if (!options) {\n return utils.extend({}, startOffset);\n }\n\n const offset = getRestrictionRect(options.offset, interaction, interaction.startCoords.page);\n\n if (offset) {\n return {\n top: startOffset.top + offset.y,\n left: startOffset.left + offset.x,\n bottom: startOffset.bottom + offset.y,\n right: startOffset.right + offset.x,\n };\n }\n\n return startOffset;\n },\n\n set: function ({ pageCoords, interaction, status, offset, options }) {\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n const inner = rectUtils.xywhToTlbr(getRestrictionRect(options.inner, interaction, page)) || noInner;\n const outer = rectUtils.xywhToTlbr(getRestrictionRect(options.outer, interaction, page)) || noOuter;\n\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n if (edges.top) {\n modifiedY = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top);\n }\n else if (edges.bottom) {\n modifiedY = Math.max(Math.min(outer.bottom - offset.bottom, page.y), inner.bottom - offset.bottom);\n }\n if (edges.left) {\n modifiedX = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left);\n }\n else if (edges.right) {\n modifiedX = Math.max(Math.min(outer.right - offset.right, page.x), inner.right - offset.right);\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n if (options && options.enabled\n && !(phase === 'start' && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n noInner,\n noOuter,\n getRestrictionRect,\n};\n\nmodifiers.restrictEdges = restrictEdges;\nmodifiers.names.push('restrictEdges');\n\ndefaultOptions.perAction.restrictEdges = restrictEdges.defaults;\nresize.defaults.restrictEdges = restrictEdges.defaults;\n\nmodule.exports = restrictEdges;\n","// This module adds the options.resize.restrictSize setting which sets min and\n// max width and height for the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictSize: {\n// min: { width: -600, height: -600 },\n// max: { width: 600, height: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst restrictEdges = require('./restrictEdges');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst noMin = { width: -Infinity, height: -Infinity };\nconst noMax = { width: +Infinity, height: +Infinity };\n\nconst restrictSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n },\n\n setOffset: function ({ interaction }) {\n return interaction.startOffset;\n },\n\n set: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const rect = rectUtils.xywhToTlbr(interaction.resizeRects.inverted);\n\n const minSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.min, interaction)) || noMin;\n const maxSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.max, interaction)) || noMax;\n\n arg.options = {\n enabled: options.enabled,\n endOnly: options.endOnly,\n inner: utils.extend({}, restrictEdges.noInner),\n outer: utils.extend({}, restrictEdges.noOuter),\n };\n\n if (edges.top) {\n arg.options.inner.top = rect.bottom - minSize.height;\n arg.options.outer.top = rect.bottom - maxSize.height;\n }\n else if (edges.bottom) {\n arg.options.inner.bottom = rect.top + minSize.height;\n arg.options.outer.bottom = rect.top + maxSize.height;\n }\n if (edges.left) {\n arg.options.inner.left = rect.right - minSize.width;\n arg.options.outer.left = rect.right - maxSize.width;\n }\n else if (edges.right) {\n arg.options.inner.right = rect.left + minSize.width;\n arg.options.outer.right = rect.left + maxSize.width;\n }\n\n restrictEdges.set(arg);\n },\n\n modifyCoords: restrictEdges.modifyCoords,\n};\n\nmodifiers.restrictSize = restrictSize;\nmodifiers.names.push('restrictSize');\n\ndefaultOptions.perAction.restrictSize = restrictSize.defaults;\nresize.defaults.restrictSize = restrictSize.defaults;\n\nmodule.exports = restrictSize;\n","const modifiers = require('./index');\nconst interact = require('../interact');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst snap = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n\n relativePoints: null,\n },\n\n setOffset: function ({ interaction, interactable, element, rect, startOffset, options }) {\n const offsets = [];\n const optionsOrigin = utils.rectToXY(utils.resolveRectLike(options.origin));\n const origin = optionsOrigin || utils.getOriginXY(interactable, element, interaction.prepared.name);\n options = options || interactable.options[interaction.prepared.name].snap || {};\n\n let snapOffset;\n\n if (options.offset === 'startCoords') {\n snapOffset = {\n x: interaction.startCoords.page.x - origin.x,\n y: interaction.startCoords.page.y - origin.y,\n };\n }\n else {\n const offsetRect = utils.resolveRectLike(options.offset, interactable, element, [interaction]);\n\n snapOffset = utils.rectToXY(offsetRect) || { x: 0, y: 0 };\n }\n\n if (rect && options.relativePoints && options.relativePoints.length) {\n for (const { x: relativeX, y: relativeY } of options.relativePoints) {\n offsets.push({\n x: startOffset.left - (rect.width * relativeX) + snapOffset.x,\n y: startOffset.top - (rect.height * relativeY) + snapOffset.y,\n });\n }\n }\n else {\n offsets.push(snapOffset);\n }\n\n return offsets;\n },\n\n set: function ({ interaction, pageCoords, status, options, offset: offsets }) {\n const targets = [];\n let target;\n let page;\n let i;\n\n if (status.useStatusXY) {\n page = { x: status.x, y: status.y };\n }\n else {\n const origin = utils.getOriginXY(interaction.target, interaction.element, interaction.prepared.name);\n\n page = utils.extend({}, pageCoords);\n\n page.x -= origin.x;\n page.y -= origin.y;\n }\n\n status.realX = page.x;\n status.realY = page.y;\n\n let len = options.targets? options.targets.length : 0;\n\n for (const { x: offsetX, y: offsetY } of offsets) {\n const relativeX = page.x - offsetX;\n const relativeY = page.y - offsetY;\n\n for (const snapTarget of options.targets) {\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n targets.push({\n x: utils.is.number(target.x) ? (target.x + offsetX) : relativeX,\n y: utils.is.number(target.y) ? (target.y + offsetY) : relativeY,\n\n range: utils.is.number(target.range)? target.range: options.range,\n });\n }\n }\n\n const closest = {\n target: null,\n inRange: false,\n distance: 0,\n range: 0,\n dx: 0,\n dy: 0,\n };\n\n for (i = 0, len = targets.length; i < len; i++) {\n target = targets[i];\n\n const range = target.range;\n const dx = target.x - page.x;\n const dy = target.y - page.y;\n const distance = utils.hypot(dx, dy);\n let inRange = distance <= range;\n\n // Infinite targets count as being out of range\n // compared to non infinite ones that are in range\n if (range === Infinity && closest.inRange && closest.range !== Infinity) {\n inRange = false;\n }\n\n if (!closest.target || (inRange\n // is the closest target in range?\n ? (closest.inRange && range !== Infinity\n // the pointer is relatively deeper in this target\n ? distance / range < closest.distance / closest.range\n // this target has Infinite range and the closest doesn't\n : (range === Infinity && closest.range !== Infinity)\n // OR this target is closer that the previous closest\n || distance < closest.distance)\n // The other is not in range and the pointer is closer to this target\n : (!closest.inRange && distance < closest.distance))) {\n\n closest.target = target;\n closest.distance = distance;\n closest.range = range;\n closest.inRange = inRange;\n closest.dx = dx;\n closest.dy = dy;\n\n status.range = range;\n }\n }\n\n let snapChanged;\n\n if (closest.target) {\n snapChanged = (status.modifiedX !== closest.target.x || status.modifiedY !== closest.target.y);\n\n status.modifiedX = closest.target.x;\n status.modifiedY = closest.target.y;\n }\n else {\n snapChanged = true;\n\n status.modifiedX = NaN;\n status.modifiedY = NaN;\n }\n\n status.dx = closest.dx;\n status.dy = closest.dy;\n\n status.changed = (snapChanged || (closest.inRange && !status.locked));\n status.locked = closest.inRange;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const relativePoints = options && options.relativePoints;\n\n if (options && options.enabled\n && !(phase === 'start' && relativePoints && relativePoints.length)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n }\n\n return {\n range : status.range,\n locked : status.locked,\n x : status.modifiedX,\n y : status.modifiedY,\n realX : status.realX,\n realY : status.realY,\n dx : status.dx,\n dy : status.dy,\n };\n }\n },\n};\n\ninteract.createSnapGrid = function (grid) {\n return function (x, y) {\n const limits = grid.limits || {\n left : -Infinity,\n right : Infinity,\n top : -Infinity,\n bottom: Infinity,\n };\n let offsetX = 0;\n let offsetY = 0;\n\n if (utils.is.object(grid.offset)) {\n offsetX = grid.offset.x;\n offsetY = grid.offset.y;\n }\n\n const gridx = Math.round((x - offsetX) / grid.x);\n const gridy = Math.round((y - offsetY) / grid.y);\n\n const newX = Math.max(limits.left, Math.min(limits.right , gridx * grid.x + offsetX));\n const newY = Math.max(limits.top , Math.min(limits.bottom, gridy * grid.y + offsetY));\n\n return {\n x: newX,\n y: newY,\n range: grid.range,\n };\n };\n};\n\nmodifiers.snap = snap;\nmodifiers.names.push('snap');\n\ndefaultOptions.perAction.snap = snap.defaults;\n\nmodule.exports = snap;\n","// This module allows snapping of the size of targets during resize\n// interactions.\n\nconst modifiers = require('./index');\nconst snap = require('./snap');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\nconst utils = require('../utils/');\n\nconst snapSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n },\n\n setOffset: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.edges;\n\n if (!edges) { return; }\n\n arg.options = {\n relativePoints: [{\n x: edges.left? 0 : 1,\n y: edges.top ? 0 : 1,\n }],\n origin: { x: 0, y: 0 },\n offset: 'self',\n range: options.range,\n };\n\n const offsets = snap.setOffset(arg);\n arg.options = options;\n\n return offsets;\n },\n\n set: function (arg) {\n const { interaction, options, offset, pageCoords } = arg;\n const page = utils.extend({}, pageCoords);\n const relativeX = page.x - offset[0].x;\n const relativeY = page.y - offset[0].y;\n\n arg.options = utils.extend({}, options);\n arg.options.targets = [];\n\n for (const snapTarget of options.targets) {\n let target;\n\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n if ('width' in target && 'height' in target) {\n target.x = target.width;\n target.y = target.height;\n }\n\n arg.options.targets.push(target);\n }\n\n snap.set(arg);\n },\n\n modifyCoords: function (arg) {\n const { options } = arg;\n\n arg.options = utils.extend({}, options);\n arg.options.enabled = options.enabled;\n arg.options.relativePoints = [null];\n\n snap.modifyCoords(arg);\n },\n};\n\nmodifiers.snapSize = snapSize;\nmodifiers.names.push('snapSize');\n\ndefaultOptions.perAction.snapSize = snapSize.defaults;\nresize.defaults.snapSize = snapSize.defaults;\n\nmodule.exports = snapSize;\n","const pointerUtils = require('../utils/pointerUtils');\n\nmodule.exports = class PointerEvent {\n constructor (type, pointer, event, eventTarget, interaction) {\n pointerUtils.pointerExtend(this, event);\n\n if (event !== pointer) {\n pointerUtils.pointerExtend(this, pointer);\n }\n\n this.interaction = interaction;\n\n this.timeStamp = new Date().getTime();\n this.originalEvent = event;\n this.type = type;\n this.pointerId = pointerUtils.getPointerId(pointer);\n this.pointerType = pointerUtils.getPointerType(pointer, interaction);\n this.target = eventTarget;\n this.currentTarget = null;\n\n if (type === 'tap') {\n const pointerIndex = interaction.getPointerIndex(pointer);\n this.dt = this.timeStamp - interaction.downTimes[pointerIndex];\n\n const interval = this.timeStamp - interaction.tapTime;\n\n this.double = !!(interaction.prevTap\n && interaction.prevTap.type !== 'doubletap'\n && interaction.prevTap.target === this.target\n && interval < 500);\n }\n else if (type === 'doubletap') {\n this.dt = pointer.timeStamp - interaction.tapTime;\n }\n }\n\n subtractOrigin ({ x: originX, y: originY }) {\n this.pageX -= originX;\n this.pageY -= originY;\n this.clientX -= originX;\n this.clientY -= originY;\n\n return this;\n }\n\n addOrigin ({ x: originX, y: originY }) {\n this.pageX += originX;\n this.pageY += originY;\n this.clientX += originX;\n this.clientY += originY;\n\n return this;\n }\n\n preventDefault () {\n this.originalEvent.preventDefault();\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n};\n","const PointerEvent = require('./PointerEvent');\nconst Interaction = require('../Interaction');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst defaults = require('../defaultOptions');\nconst signals = require('../utils/Signals').new();\nconst { filter } = require('../utils/arr');\n\nconst simpleSignals = [ 'down', 'up', 'cancel' ];\nconst simpleEvents = [ 'down', 'up', 'cancel' ];\n\nconst pointerEvents = {\n PointerEvent,\n fire,\n collectEventTargets,\n signals,\n defaults: {\n holdDuration: 600,\n ignoreFrom : null,\n allowFrom : null,\n origin : { x: 0, y: 0 },\n },\n types: [\n 'down',\n 'move',\n 'up',\n 'cancel',\n 'tap',\n 'doubletap',\n 'hold',\n ],\n};\n\nfunction fire (arg) {\n const {\n interaction, pointer, event, eventTarget,\n type = arg.pointerEvent.type,\n targets = collectEventTargets(arg),\n pointerEvent = new PointerEvent(type, pointer, event, eventTarget, interaction),\n } = arg;\n\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n targets,\n type,\n pointerEvent,\n };\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n\n for (const prop in target.props || {}) {\n pointerEvent[prop] = target.props[prop];\n }\n\n const origin = utils.getOriginXY(target.eventable, target.element);\n\n pointerEvent.subtractOrigin(origin);\n pointerEvent.eventable = target.eventable;\n pointerEvent.currentTarget = target.element;\n\n target.eventable.fire(pointerEvent);\n\n pointerEvent.addOrigin(origin);\n\n if (pointerEvent.immediatePropagationStopped\n || (pointerEvent.propagationStopped\n && (i + 1) < targets.length && targets[i + 1].element !== pointerEvent.currentTarget)) {\n break;\n }\n }\n\n signals.fire('fired', signalArg);\n\n if (type === 'tap') {\n // if pointerEvent should make a double tap, create and fire a doubletap\n // PointerEvent and use that as the prevTap\n const prevTap = pointerEvent.double\n ? fire({\n interaction, pointer, event, eventTarget,\n type: 'doubletap',\n })\n : pointerEvent;\n\n interaction.prevTap = prevTap;\n interaction.tapTime = prevTap.timeStamp;\n }\n\n return pointerEvent;\n}\n\nfunction collectEventTargets ({ interaction, pointer, event, eventTarget, type }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n // do not fire a tap event if the pointer was moved before being lifted\n if (type === 'tap' && (interaction.pointerWasMoved\n // or if the pointerup target is different to the pointerdown target\n || !(interaction.downTargets[pointerIndex] && interaction.downTargets[pointerIndex] === eventTarget))) {\n return [];\n }\n\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n path,\n targets: [],\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (type === 'hold') {\n signalArg.targets = filter(signalArg.targets, target =>\n target.eventable.options.holdDuration === interaction.holdTimers[pointerIndex].duration);\n }\n\n return signalArg.targets;\n}\n\nInteraction.signals.on('update-pointer-down', function ({ interaction, pointerIndex }) {\n interaction.holdTimers[pointerIndex] = { duration: Infinity, timeout: null };\n});\n\nInteraction.signals.on('remove-pointer', function ({ interaction, pointerIndex }) {\n interaction.holdTimers.splice(pointerIndex, 1);\n});\n\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget, duplicateMove }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n if (!duplicateMove && (!interaction.pointerIsDown || interaction.pointerWasMoved)) {\n if (interaction.pointerIsDown) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n\n fire({\n interaction, pointer, event, eventTarget,\n type: 'move',\n });\n }\n});\n\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget, pointerIndex }) {\n // copy event to be used in timeout for IE8\n const eventCopy = browser.isIE8? utils.extend({}, event) : event;\n\n const timer = interaction.holdTimers[pointerIndex];\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'hold',\n targets: [],\n path,\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (!signalArg.targets.length) { return; }\n\n let minDuration = Infinity;\n\n for (let i = 0; i < signalArg.targets.length; i++) {\n const target = signalArg.targets[i];\n const holdDuration = target.eventable.options.holdDuration;\n\n if (holdDuration < minDuration) {\n minDuration = holdDuration;\n }\n }\n\n timer.duration = minDuration;\n timer.timeout = setTimeout(function () {\n fire({\n interaction, eventCopy, eventTarget,\n pointer: browser.isIE8? eventCopy : pointer,\n type: 'hold',\n });\n }, minDuration);\n});\n\nInteraction.signals.on('up', ({ interaction, pointer, event, eventTarget }) => {\n if (!interaction.pointerWasMoved) {\n fire({ interaction, eventTarget, pointer, event, type: 'tap' });\n }\n});\n\n['up', 'cancel'].forEach(function (signalName) {\n Interaction.signals.on(signalName, function ({ interaction, pointerIndex }) {\n if (interaction.holdTimers[pointerIndex]) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n });\n});\n\nfunction createSignalListener (type) {\n return function ({ interaction, pointer, event, eventTarget }) {\n fire({ interaction, eventTarget, pointer, event, type });\n };\n}\n\nfor (let i = 0; i < simpleSignals.length; i++) {\n Interaction.signals.on(simpleSignals[i], createSignalListener(simpleEvents[i]));\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.prevTap = null; // the most recent tap event on this interaction\n interaction.tapTime = 0; // time of the most recent tap event\n interaction.holdTimers = []; // [{ duration, timeout }]\n});\n\ndefaults.pointerEvents = pointerEvents.defaults;\nmodule.exports = pointerEvents;\n","const pointerEvents = require('./base');\nconst Interaction = require('../Interaction');\n\npointerEvents.signals.on('new', onNew);\npointerEvents.signals.on('fired', onFired);\n\nfor (const signal of ['move', 'up', 'cancel', 'endall']) {\n Interaction.signals.on(signal, endHoldRepeat);\n}\n\nfunction onNew ({ pointerEvent }) {\n if (pointerEvent.type !== 'hold') { return; }\n\n pointerEvent.count = (pointerEvent.count || 0) + 1;\n}\n\nfunction onFired ({ interaction, pointerEvent, eventTarget, targets }) {\n if (pointerEvent.type !== 'hold' || !targets.length) { return; }\n\n // get the repeat interval from the first eventable\n const interval = targets[0].eventable.options.holdRepeatInterval;\n\n // don't repeat if the interval is 0 or less\n if (interval <= 0) { return; }\n\n // set a timeout to fire the holdrepeat event\n interaction.holdIntervalHandle = setTimeout(function () {\n pointerEvents.fire({\n interaction,\n eventTarget,\n type: 'hold',\n pointer: pointerEvent,\n event: pointerEvent,\n });\n }, interval);\n}\n\nfunction endHoldRepeat ({ interaction }) {\n // set the interaction's holdStopTime property\n // to stop further holdRepeat events\n if (interaction.holdIntervalHandle) {\n clearInterval(interaction.holdIntervalHandle);\n interaction.holdIntervalHandle = null;\n }\n}\n\n// don't repeat by default\npointerEvents.defaults.holdRepeatInterval = 0;\npointerEvents.types.push('holdrepeat');\n\nmodule.exports = {\n onNew,\n onFired,\n endHoldRepeat,\n};\n","const pointerEvents = require('./base');\nconst Interactable = require('../Interactable');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\nconst scope = require('../scope');\nconst extend = require('../utils/extend');\nconst { merge } = require('../utils/arr');\n\npointerEvents.signals.on('collect-targets', function ({ targets, element, type, eventTarget }) {\n function collectSelectors (interactable, selector, context) {\n const els = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && is.element(element)\n && domUtils.matchesSelector(element, selector, els)\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n const interactable = scope.interactables.get(element);\n\n if (interactable) {\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n scope.interactables.forEachSelector(collectSelectors, element);\n});\n\nInteractable.signals.on('new', function ({ interactable }) {\n interactable.events.getRect = function (element) {\n return interactable.getRect(element);\n };\n});\n\nInteractable.signals.on('set', function ({ interactable, options }) {\n extend(interactable.events.options, pointerEvents.defaults);\n extend(interactable.events.options, options);\n});\n\nmerge(Interactable.eventTypes, pointerEvents.types);\n\nInteractable.prototype.pointerEvents = function (options) {\n extend(this.events.options, options);\n\n return this;\n};\n\nconst __backCompatOption = Interactable.prototype._backCompatOption;\n\nInteractable.prototype._backCompatOption = function (optionName, newValue) {\n const ret = __backCompatOption.call(this, optionName, newValue);\n\n if (ret === this) {\n this.events.options[optionName] = newValue;\n }\n\n return ret;\n};\n\nInteractable.settingsMethods.push('pointerEvents');\n","const utils = require('./utils');\nconst events = require('./utils/events');\nconst signals = require('./utils/Signals').new();\n\nconst scope = {\n signals,\n events,\n utils,\n\n // main document\n document: require('./utils/domObjects').document,\n // all documents being listened to\n documents: [],\n\n addDocument: function (doc, win) {\n // do nothing if document is already known\n if (utils.contains(scope.documents, doc)) { return false; }\n\n win = win || scope.getWindow(doc);\n\n scope.documents.push(doc);\n events.documents.push(doc);\n\n // don't add an unload event for the main document\n // so that the page may be cached in browser history\n if (doc !== scope.document) {\n events.add(win, 'unload', scope.onWindowUnload);\n }\n\n signals.fire('add-document', { doc, win });\n },\n\n removeDocument: function (doc, win) {\n const index = utils.indexOf(scope.documents, doc);\n\n win = win || scope.getWindow(doc);\n\n events.remove(win, 'unload', scope.onWindowUnload);\n\n scope.documents.splice(index, 1);\n events.documents.splice(index, 1);\n\n signals.fire('remove-document', { win, doc });\n },\n\n onWindowUnload: function () {\n scope.removeDocument(this.document, this);\n },\n};\n\nmodule.exports = scope;\n","const { indexOf } = require('./arr');\n\nclass Signals {\n constructor () {\n this.listeners = {\n // signalName: [listeners],\n };\n }\n\n on (name, listener) {\n if (!this.listeners[name]) {\n this.listeners[name] = [listener];\n return;\n }\n\n this.listeners[name].push(listener);\n }\n\n off (name, listener) {\n if (!this.listeners[name]) { return; }\n\n const index = indexOf(this.listeners[name], listener);\n\n if (index !== -1) {\n this.listeners[name].splice(index, 1);\n }\n }\n\n fire (name, arg) {\n const targetListeners = this.listeners[name];\n\n if (!targetListeners) { return; }\n\n for (let i = 0; i < targetListeners.length; i++) {\n if (targetListeners[i](arg, name) === false) {\n return;\n }\n }\n }\n}\n\nSignals.new = function () {\n return new Signals();\n};\n\nmodule.exports = Signals;\n","function indexOf (array, target) {\n for (let i = 0, len = array.length; i < len; i++) {\n if (array[i] === target) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction contains (array, target) {\n return indexOf(array, target) !== -1;\n}\n\nfunction merge (target, source) {\n for (let i = 0; i < source.length; i++) {\n target.push(source[i]);\n }\n\n return target;\n}\n\nfunction filter (array, test) {\n const result = [];\n\n for (let i = 0; i < array.length; i++) {\n if (test(array[i])) {\n result.push(array[i]);\n }\n }\n\n return result;\n}\n\nmodule.exports = {\n indexOf,\n contains,\n merge,\n filter,\n};\n","const { window } = require('./window');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst Element = domObjects.Element;\nconst navigator = window.navigator;\n\nconst browser = {\n // Does the browser support touch input?\n supportsTouch: !!(('ontouchstart' in window) || is.function(window.DocumentTouch)\n && domObjects.document instanceof window.DocumentTouch),\n\n // Does the browser support PointerEvents\n supportsPointerEvent: !!domObjects.PointerEvent,\n\n isIE8: ('attachEvent' in window) && !('addEventListener' in window),\n\n // Opera Mobile must be handled differently\n isOperaMobile: (navigator.appName === 'Opera'\n && browser.supportsTouch\n && navigator.userAgent.match('Presto')),\n\n // scrolling doesn't change the result of getClientRects on iOS 7\n isIOS7: (/iP(hone|od|ad)/.test(navigator.platform)\n && /OS 7[^\\d]/.test(navigator.appVersion)),\n\n isIe9OrOlder: /MSIE (8|9)/.test(navigator.userAgent),\n\n // prefix matchesSelector\n prefixedMatchesSelector: 'matches' in Element.prototype\n ? 'matches': 'webkitMatchesSelector' in Element.prototype\n ? 'webkitMatchesSelector': 'mozMatchesSelector' in Element.prototype\n ? 'mozMatchesSelector': 'oMatchesSelector' in Element.prototype\n ? 'oMatchesSelector': 'msMatchesSelector',\n\n useMatchesSelectorPolyfill: false,\n\n pEventTypes: (domObjects.PointerEvent\n ? (domObjects.PointerEvent === window.MSPointerEvent\n ? {\n up: 'MSPointerUp',\n down: 'MSPointerDown',\n over: 'mouseover',\n out: 'mouseout',\n move: 'MSPointerMove',\n cancel: 'MSPointerCancel',\n }\n : {\n up: 'pointerup',\n down: 'pointerdown',\n over: 'pointerover',\n out: 'pointerout',\n move: 'pointermove',\n cancel: 'pointercancel',\n })\n : null),\n\n // because Webkit and Opera still use 'mousewheel' event type\n wheelEvent: 'onmousewheel' in domObjects.document? 'mousewheel': 'wheel',\n\n};\n\nbrowser.useMatchesSelectorPolyfill = !is.function(Element.prototype[browser.prefixedMatchesSelector]);\n\nmodule.exports = browser;\n","const domObjects = {};\nconst win = require('./window').window;\n\nfunction blank () {}\n\ndomObjects.document = win.document;\ndomObjects.DocumentFragment = win.DocumentFragment || blank;\ndomObjects.SVGElement = win.SVGElement || blank;\ndomObjects.SVGSVGElement = win.SVGSVGElement || blank;\ndomObjects.SVGElementInstance = win.SVGElementInstance || blank;\ndomObjects.Element = win.Element || blank;\ndomObjects.HTMLElement = win.HTMLElement || domObjects.Element;\n\ndomObjects.Event = win.Event;\ndomObjects.Touch = win.Touch || blank;\ndomObjects.PointerEvent = (win.PointerEvent || win.MSPointerEvent);\n\nmodule.exports = domObjects;\n","const win = require('./window');\nconst browser = require('./browser');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst domUtils = {\n nodeContains: function (parent, child) {\n while (child) {\n if (child === parent) {\n return true;\n }\n\n child = child.parentNode;\n }\n\n return false;\n },\n\n closest: function (element, selector) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) { return element; }\n\n element = domUtils.parentNode(element);\n }\n\n return null;\n },\n\n parentNode: function (node) {\n let parent = node.parentNode;\n\n if (is.docFrag(parent)) {\n // skip past #shado-root fragments\n while ((parent = parent.host) && is.docFrag(parent)) {\n continue;\n }\n\n return parent;\n }\n\n return parent;\n },\n\n // taken from http://tanalin.com/en/blog/2012/12/matches-selector-ie8/ and modified\n matchesSelectorPolyfill: browser.useMatchesSelectorPolyfill\n ? function (element, selector, elems) {\n elems = elems || element.parentNode.querySelectorAll(selector);\n\n for (let i = 0, len = elems.length; i < len; i++) {\n if (elems[i] === element) {\n return true;\n }\n }\n\n return false;\n }\n : null,\n\n matchesSelector: function (element, selector, nodeList) {\n if (browser.useMatchesSelectorPolyfill) {\n return domUtils.matchesSelectorPolyfill(element, selector, nodeList);\n }\n\n // remove /deep/ from selectors if shadowDOM polyfill is used\n if (win.window !== win.realWindow) {\n selector = selector.replace(/\\/deep\\//g, ' ');\n }\n\n return element[browser.prefixedMatchesSelector](selector);\n },\n\n // Test for the element that's \"above\" all other qualifiers\n indexOfDeepestElement: function (elements) {\n let deepestZoneParents = [];\n let dropzoneParents = [];\n let dropzone;\n let deepestZone = elements[0];\n let index = deepestZone? 0: -1;\n let parent;\n let child;\n let i;\n let n;\n\n for (i = 1; i < elements.length; i++) {\n dropzone = elements[i];\n\n // an element might belong to multiple selector dropzones\n if (!dropzone || dropzone === deepestZone) {\n continue;\n }\n\n if (!deepestZone) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n // check if the deepest or current are document.documentElement or document.rootElement\n // - if the current dropzone is, do nothing and continue\n if (dropzone.parentNode === dropzone.ownerDocument) {\n continue;\n }\n // - if deepest is, update with the current dropzone and continue to next\n else if (deepestZone.parentNode === dropzone.ownerDocument) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n if (!deepestZoneParents.length) {\n parent = deepestZone;\n while (parent.parentNode && parent.parentNode !== parent.ownerDocument) {\n deepestZoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n }\n\n // if this element is an svg element and the current deepest is\n // an HTMLElement\n if (deepestZone instanceof domObjects.HTMLElement\n && dropzone instanceof domObjects.SVGElement\n && !(dropzone instanceof domObjects.SVGSVGElement)) {\n\n if (dropzone === deepestZone.parentNode) {\n continue;\n }\n\n parent = dropzone.ownerSVGElement;\n }\n else {\n parent = dropzone;\n }\n\n dropzoneParents = [];\n\n while (parent.parentNode !== parent.ownerDocument) {\n dropzoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n\n n = 0;\n\n // get (position of last common ancestor) + 1\n while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) {\n n++;\n }\n\n const parents = [\n dropzoneParents[n - 1],\n dropzoneParents[n],\n deepestZoneParents[n],\n ];\n\n child = parents[0].lastChild;\n\n while (child) {\n if (child === parents[1]) {\n deepestZone = dropzone;\n index = i;\n deepestZoneParents = [];\n\n break;\n }\n else if (child === parents[2]) {\n break;\n }\n\n child = child.previousSibling;\n }\n }\n\n return index;\n },\n\n matchesUpTo: function (element, selector, limit) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) {\n return true;\n }\n\n element = domUtils.parentNode(element);\n\n if (element === limit) {\n return domUtils.matchesSelector(element, selector);\n }\n }\n\n return false;\n },\n\n getActualElement: function (element) {\n return (element instanceof domObjects.SVGElementInstance\n ? element.correspondingUseElement\n : element);\n },\n\n getScrollXY: function (relevantWindow) {\n relevantWindow = relevantWindow || win.window;\n return {\n x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft,\n y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop,\n };\n },\n\n getElementClientRect: function (element) {\n const clientRect = (element instanceof domObjects.SVGElement\n ? element.getBoundingClientRect()\n : element.getClientRects()[0]);\n\n return clientRect && {\n left : clientRect.left,\n right : clientRect.right,\n top : clientRect.top,\n bottom: clientRect.bottom,\n width : clientRect.width || clientRect.right - clientRect.left,\n height: clientRect.height || clientRect.bottom - clientRect.top,\n };\n },\n\n getElementRect: function (element) {\n const clientRect = domUtils.getElementClientRect(element);\n\n if (!browser.isIOS7 && clientRect) {\n const scroll = domUtils.getScrollXY(win.getWindow(element));\n\n clientRect.left += scroll.x;\n clientRect.right += scroll.x;\n clientRect.top += scroll.y;\n clientRect.bottom += scroll.y;\n }\n\n return clientRect;\n },\n\n getPath: function (element) {\n const path = [];\n\n while (element) {\n path.push(element);\n element = domUtils.parentNode(element);\n }\n\n return path;\n },\n\n trySelector: value => {\n if (!is.string(value)) { return false; }\n\n // an exception will be raised if it is invalid\n domObjects.document.querySelector(value);\n return true;\n },\n};\n\nmodule.exports = domUtils;\n","const is = require('./is');\nconst domUtils = require('./domUtils');\nconst pExtend = require('./pointerExtend');\n\nconst { window, getWindow } = require('./window');\nconst { indexOf, contains } = require('./arr');\n\nconst useAttachEvent = ('attachEvent' in window) && !('addEventListener' in window);\nconst addEvent = useAttachEvent? 'attachEvent': 'addEventListener';\nconst removeEvent = useAttachEvent? 'detachEvent': 'removeEventListener';\nconst on = useAttachEvent? 'on': '';\n\nconst elements = [];\nconst targets = [];\nconst attachedListeners = [];\n\n// {\n// type: {\n// selectors: ['selector', ...],\n// contexts : [document, ...],\n// listeners: [[listener, capture, passive], ...]\n// }\n// }\nconst delegatedEvents = {};\n\nconst documents = [];\n\nconst supportsOptions = !useAttachEvent && (() => {\n let supported = false;\n\n window.document.createElement('div').addEventListener('test', null, {\n get capture () { supported = true; },\n });\n\n return supported;\n})();\n\nfunction add (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n let elementIndex = indexOf(elements, element);\n let target = targets[elementIndex];\n\n if (!target) {\n target = {\n events: {},\n typeCount: 0,\n };\n\n elementIndex = elements.push(element) - 1;\n targets.push(target);\n\n attachedListeners.push(useAttachEvent\n ? {\n supplied: [],\n wrapped : [],\n useCount: [],\n }\n : null);\n }\n\n if (!target.events[type]) {\n target.events[type] = [];\n target.typeCount++;\n }\n\n if (!contains(target.events[type], listener)) {\n let ret;\n\n if (useAttachEvent) {\n const { supplied, wrapped, useCount } = attachedListeners[elementIndex];\n const listenerIndex = indexOf(supplied, listener);\n\n const wrappedListener = wrapped[listenerIndex] || function (event) {\n if (!event.immediatePropagationStopped) {\n event.target = event.srcElement;\n event.currentTarget = element;\n\n event.preventDefault = event.preventDefault || preventDef;\n event.stopPropagation = event.stopPropagation || stopProp;\n event.stopImmediatePropagation = event.stopImmediatePropagation || stopImmProp;\n\n if (/mouse|click/.test(event.type)) {\n event.pageX = event.clientX + getWindow(element).document.documentElement.scrollLeft;\n event.pageY = event.clientY + getWindow(element).document.documentElement.scrollTop;\n }\n\n listener(event);\n }\n };\n\n ret = element[addEvent](on + type, wrappedListener, !!options.capture);\n\n if (listenerIndex === -1) {\n supplied.push(listener);\n wrapped.push(wrappedListener);\n useCount.push(1);\n }\n else {\n useCount[listenerIndex]++;\n }\n }\n else {\n ret = element[addEvent](type, listener, supportsOptions? options : !!options.capture);\n }\n target.events[type].push(listener);\n\n return ret;\n }\n}\n\nfunction remove (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const elementIndex = indexOf(elements, element);\n const target = targets[elementIndex];\n\n if (!target || !target.events) {\n return;\n }\n\n let wrappedListener = listener;\n let listeners;\n let listenerIndex;\n\n if (useAttachEvent) {\n listeners = attachedListeners[elementIndex];\n listenerIndex = indexOf(listeners.supplied, listener);\n wrappedListener = listeners.wrapped[listenerIndex];\n }\n\n if (type === 'all') {\n for (type in target.events) {\n if (target.events.hasOwnProperty(type)) {\n remove(element, type, 'all');\n }\n }\n return;\n }\n\n if (target.events[type]) {\n const len = target.events[type].length;\n\n if (listener === 'all') {\n for (let i = 0; i < len; i++) {\n remove(element, type, target.events[type][i], options);\n }\n return;\n }\n else {\n for (let i = 0; i < len; i++) {\n if (target.events[type][i] === listener) {\n element[removeEvent](on + type, wrappedListener, supportsOptions? options : !!options.capture);\n target.events[type].splice(i, 1);\n\n if (useAttachEvent && listeners) {\n listeners.useCount[listenerIndex]--;\n if (listeners.useCount[listenerIndex] === 0) {\n listeners.supplied.splice(listenerIndex, 1);\n listeners.wrapped.splice(listenerIndex, 1);\n listeners.useCount.splice(listenerIndex, 1);\n }\n }\n\n break;\n }\n }\n }\n\n if (target.events[type] && target.events[type].length === 0) {\n target.events[type] = null;\n target.typeCount--;\n }\n }\n\n if (!target.typeCount) {\n targets.splice(elementIndex, 1);\n elements.splice(elementIndex, 1);\n attachedListeners.splice(elementIndex, 1);\n }\n}\n\nfunction addDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n if (!delegatedEvents[type]) {\n delegatedEvents[type] = {\n selectors: [],\n contexts : [],\n listeners: [],\n };\n\n // add delegate listener functions\n for (let i = 0; i < documents.length; i++) {\n add(documents[i], type, delegateListener);\n add(documents[i], type, delegateUseCapture, true);\n }\n }\n\n const delegated = delegatedEvents[type];\n let index;\n\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n break;\n }\n }\n\n if (index === -1) {\n index = delegated.selectors.length;\n\n delegated.selectors.push(selector);\n delegated.contexts .push(context);\n delegated.listeners.push([]);\n }\n\n // keep listener and capture and passive flags\n delegated.listeners[index].push([listener, !!options.capture, options.passive]);\n}\n\nfunction removeDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const delegated = delegatedEvents[type];\n let matchFound = false;\n let index;\n\n if (!delegated) { return; }\n\n // count from last index of delegated to 0\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n // look for matching selector and context Node\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n\n const listeners = delegated.listeners[index];\n\n // each item of the listeners array is an array: [function, capture, passive]\n for (let i = listeners.length - 1; i >= 0; i--) {\n const [fn, capture, passive] = listeners[i];\n\n // check if the listener functions and capture and passive flags match\n if (fn === listener && capture === !!options.capture && passive === options.passive) {\n // remove the listener from the array of listeners\n listeners.splice(i, 1);\n\n // if all listeners for this interactable have been removed\n // remove the interactable from the delegated arrays\n if (!listeners.length) {\n delegated.selectors.splice(index, 1);\n delegated.contexts .splice(index, 1);\n delegated.listeners.splice(index, 1);\n\n // remove delegate function from context\n remove(context, type, delegateListener);\n remove(context, type, delegateUseCapture, true);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegatedEvents[type] = null;\n }\n }\n\n // only remove one listener\n matchFound = true;\n break;\n }\n }\n\n if (matchFound) { break; }\n }\n }\n}\n\n// bound to the interactable context when a DOM event\n// listener is added to a selector interactable\nfunction delegateListener (event, optionalArg) {\n const options = getOptions(optionalArg);\n const fakeEvent = {};\n const delegated = delegatedEvents[event.type];\n const eventTarget = (domUtils.getActualElement(event.path\n ? event.path[0]\n : event.target));\n let element = eventTarget;\n\n // duplicate the event so that currentTarget can be changed\n pExtend(fakeEvent, event);\n\n fakeEvent.originalEvent = event;\n fakeEvent.preventDefault = preventOriginalDefault;\n\n // climb up document tree looking for selector matches\n while (is.element(element)) {\n for (let i = 0; i < delegated.selectors.length; i++) {\n const selector = delegated.selectors[i];\n const context = delegated.contexts[i];\n\n if (domUtils.matchesSelector(element, selector)\n && domUtils.nodeContains(context, eventTarget)\n && domUtils.nodeContains(context, element)) {\n\n const listeners = delegated.listeners[i];\n\n fakeEvent.currentTarget = element;\n\n for (let j = 0; j < listeners.length; j++) {\n const [fn, capture, passive] = listeners[j];\n\n if (capture === !!options.capture && passive === options.passive) {\n fn(fakeEvent);\n }\n }\n }\n }\n\n element = domUtils.parentNode(element);\n }\n}\n\nfunction delegateUseCapture (event) {\n return delegateListener.call(this, event, true);\n}\n\nfunction preventDef () {\n this.returnValue = false;\n}\n\nfunction preventOriginalDefault () {\n this.originalEvent.preventDefault();\n}\n\nfunction stopProp () {\n this.cancelBubble = true;\n}\n\nfunction stopImmProp () {\n this.cancelBubble = true;\n this.immediatePropagationStopped = true;\n}\n\nfunction getOptions (param) {\n return is.object(param)? param : { capture: param };\n}\n\nmodule.exports = {\n add,\n remove,\n\n addDelegate,\n removeDelegate,\n\n delegateListener,\n delegateUseCapture,\n delegatedEvents,\n documents,\n\n useAttachEvent,\n supportsOptions,\n\n _elements: elements,\n _targets: targets,\n _attachedListeners: attachedListeners,\n};\n","module.exports = function extend (dest, source) {\n for (const prop in source) {\n dest[prop] = source[prop];\n }\n return dest;\n};\n","const {\n resolveRectLike,\n rectToXY,\n} = require('./rect');\n\nmodule.exports = function (target, element, action) {\n const actionOptions = target.options[action];\n const actionOrigin = actionOptions && actionOptions.origin;\n const origin = actionOrigin || target.options.origin;\n\n const originRect = resolveRectLike(origin, target, element, [target && element]);\n\n return rectToXY(originRect) || { x: 0, y: 0 };\n};\n","module.exports = (x, y) => Math.sqrt(x * x + y * y);\n","const extend = require('./extend');\nconst win = require('./window');\n\nconst utils = {\n warnOnce: function (method, message) {\n let warned = false;\n\n return function () {\n if (!warned) {\n win.window.console.warn(message);\n warned = true;\n }\n\n return method.apply(this, arguments);\n };\n },\n\n // http://stackoverflow.com/a/5634528/2280888\n _getQBezierValue: function (t, p1, p2, p3) {\n const iT = 1 - t;\n return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3;\n },\n\n getQuadraticCurvePoint: function (startX, startY, cpX, cpY, endX, endY, position) {\n return {\n x: utils._getQBezierValue(position, startX, cpX, endX),\n y: utils._getQBezierValue(position, startY, cpY, endY),\n };\n },\n\n // http://gizma.com/easing/\n easeOutQuad: function (t, b, c, d) {\n t /= d;\n return -c * t*(t-2) + b;\n },\n\n copyAction: function (dest, src) {\n dest.name = src.name;\n dest.axis = src.axis;\n dest.edges = src.edges;\n\n return dest;\n },\n\n is : require('./is'),\n extend : extend,\n hypot : require('./hypot'),\n getOriginXY: require('./getOriginXY'),\n};\n\nextend(utils, require('./arr'));\nextend(utils, require('./domUtils'));\nextend(utils, require('./pointerUtils'));\nextend(utils, require('./rect'));\n\nmodule.exports = utils;\n","const scope = require('../scope');\nconst utils = require('./index');\nconst browser = require('./browser');\n\nconst finder = {\n methodOrder: [ 'simulationResume', 'mouse', 'hasPointer', 'idle' ],\n\n search: function (pointer, eventType, eventTarget) {\n const mouseEvent = (/mouse/i.test(pointer.pointerType || eventType)\n // MSPointerEvent.MSPOINTER_TYPE_MOUSE\n || pointer.pointerType === 4);\n const pointerId = utils.getPointerId(pointer);\n const details = { pointer, pointerId, mouseEvent, eventType, eventTarget };\n\n for (const method of finder.methodOrder) {\n const interaction = finder[method](details);\n\n if (interaction) {\n return interaction;\n }\n }\n },\n\n // try to resume simulation with a new pointer\n simulationResume: function ({ mouseEvent, eventType, eventTarget }) {\n if (!/down|start/i.test(eventType)) {\n return null;\n }\n\n for (const interaction of scope.interactions) {\n let element = eventTarget;\n\n if (interaction.simulation && interaction.simulation.allowResume\n && (interaction.mouse === mouseEvent)) {\n while (element) {\n // if the element is the interaction element\n if (element === interaction.element) {\n return interaction;\n }\n element = utils.parentNode(element);\n }\n }\n }\n\n return null;\n },\n\n // if it's a mouse interaction\n mouse: function ({ pointerId, mouseEvent, eventType }) {\n if (!mouseEvent && (browser.supportsTouch || browser.supportsPointerEvent)) {\n return null;\n }\n\n let firstNonActive;\n\n for (const interaction of scope.interactions) {\n if (interaction.mouse) {\n // if it's a down event, skip interactions with running simulations\n if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; }\n\n // if the interaction is active, return it immediately\n if (interaction.interacting()) {\n return interaction;\n }\n // otherwise save it and look for another active interaction\n else if (!firstNonActive) {\n firstNonActive = interaction;\n }\n }\n }\n\n // if no active mouse interaction was found use the first inactive mouse\n // interaction\n if (firstNonActive) {\n return firstNonActive;\n }\n\n // Find any interaction specifically for mouse.\n // ignore the interaction if the eventType is a mousedown, and a simulation\n // is active\n for (const interaction of scope.interactions) {\n if (interaction.mouse && !(/down/.test(eventType) && interaction.simulation)) {\n return interaction;\n }\n }\n\n return null;\n },\n\n // get interaction that has this pointer\n hasPointer: function ({ pointerId }) {\n for (const interaction of scope.interactions) {\n if (utils.contains(interaction.pointerIds, pointerId)) {\n return interaction;\n }\n }\n },\n\n // get first idle interaction\n idle: function ({ mouseEvent }) {\n for (const interaction of scope.interactions) {\n // if there's already a pointer held down\n if (interaction.pointerIds.length === 1) {\n const target = interaction.target;\n // don't add this pointer if there is a target interactable and it\n // isn't gesturable\n if (target && !target.options.gesture.enabled) {\n continue;\n }\n }\n // maximum of 2 pointers per interaction\n else if (interaction.pointerIds.length >= 2) {\n continue;\n }\n\n if (!interaction.interacting() && (mouseEvent === interaction.mouse)) {\n return interaction;\n }\n }\n\n return null;\n },\n};\n\nmodule.exports = finder;\n","const win = require('./window');\nconst isWindow = require('./isWindow');\n\nconst is = {\n array : () => {},\n\n window : thing => thing === win.window || isWindow(thing),\n\n docFrag : thing => is.object(thing) && thing.nodeType === 11,\n\n object : thing => !!thing && (typeof thing === 'object'),\n\n function: thing => typeof thing === 'function',\n\n number : thing => typeof thing === 'number' ,\n\n bool : thing => typeof thing === 'boolean' ,\n\n string : thing => typeof thing === 'string' ,\n\n element: thing => {\n if (!thing || (typeof thing !== 'object')) { return false; }\n\n const _window = win.getWindow(thing) || win.window;\n\n return (/object|function/.test(typeof _window.Element)\n ? thing instanceof _window.Element //DOM2\n : thing.nodeType === 1 && typeof thing.nodeName === 'string');\n },\n};\n\nis.array = thing => (is.object(thing)\n && (typeof thing.length !== 'undefined')\n && is.function(thing.splice));\n\nmodule.exports = is;\n","module.exports = (thing) => !!(thing && thing.Window) && (thing instanceof thing.Window);\n","function pointerExtend (dest, source) {\n for (const prop in source) {\n const prefixedPropREs = module.exports.prefixedPropREs;\n let deprecated = false;\n\n // skip deprecated prefixed properties\n for (const vendor in prefixedPropREs) {\n if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) {\n deprecated = true;\n break;\n }\n }\n\n if (!deprecated && typeof source[prop] !== 'function') {\n dest[prop] = source[prop];\n }\n }\n return dest;\n}\n\npointerExtend.prefixedPropREs = {\n webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/,\n};\n\nmodule.exports = pointerExtend;\n","const hypot = require('./hypot');\nconst browser = require('./browser');\nconst dom = require('./domObjects');\nconst domUtils = require('./domUtils');\nconst is = require('./is');\nconst pointerExtend = require('./pointerExtend');\n\nconst pointerUtils = {\n copyCoords: function (dest, src) {\n dest.page = dest.page || {};\n dest.page.x = src.page.x;\n dest.page.y = src.page.y;\n\n dest.client = dest.client || {};\n dest.client.x = src.client.x;\n dest.client.y = src.client.y;\n\n dest.timeStamp = src.timeStamp;\n },\n\n setCoordDeltas: function (targetObj, prev, cur) {\n targetObj.page.x = cur.page.x - prev.page.x;\n targetObj.page.y = cur.page.y - prev.page.y;\n targetObj.client.x = cur.client.x - prev.client.x;\n targetObj.client.y = cur.client.y - prev.client.y;\n targetObj.timeStamp = cur.timeStamp - prev.timeStamp;\n\n // set pointer velocity\n const dt = Math.max(targetObj.timeStamp / 1000, 0.001);\n\n targetObj.page.speed = hypot(targetObj.page.x, targetObj.page.y) / dt;\n targetObj.page.vx = targetObj.page.x / dt;\n targetObj.page.vy = targetObj.page.y / dt;\n\n targetObj.client.speed = hypot(targetObj.client.x, targetObj.page.y) / dt;\n targetObj.client.vx = targetObj.client.x / dt;\n targetObj.client.vy = targetObj.client.y / dt;\n },\n\n isNativePointer: function (pointer) {\n return (pointer instanceof dom.Event || pointer instanceof dom.Touch);\n },\n\n // Get specified X/Y coords for mouse or event.touches[0]\n getXY: function (type, pointer, xy) {\n xy = xy || {};\n type = type || 'page';\n\n xy.x = pointer[type + 'X'];\n xy.y = pointer[type + 'Y'];\n\n return xy;\n },\n\n getPageXY: function (pointer, page) {\n page = page || {};\n\n // Opera Mobile handles the viewport and scrolling oddly\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n pointerUtils.getXY('screen', pointer, page);\n\n page.x += window.scrollX;\n page.y += window.scrollY;\n }\n else {\n pointerUtils.getXY('page', pointer, page);\n }\n\n return page;\n },\n\n getClientXY: function (pointer, client) {\n client = client || {};\n\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n // Opera Mobile handles the viewport and scrolling oddly\n pointerUtils.getXY('screen', pointer, client);\n }\n else {\n pointerUtils.getXY('client', pointer, client);\n }\n\n return client;\n },\n\n getPointerId: function (pointer) {\n return is.number(pointer.pointerId)? pointer.pointerId : pointer.identifier;\n },\n\n setCoords: function (targetObj, pointers, timeStamp) {\n const pointer = (pointers.length > 1\n ? pointerUtils.pointerAverage(pointers)\n : pointers[0]);\n\n const tmpXY = {};\n\n pointerUtils.getPageXY(pointer, tmpXY);\n targetObj.page.x = tmpXY.x;\n targetObj.page.y = tmpXY.y;\n\n pointerUtils.getClientXY(pointer, tmpXY);\n targetObj.client.x = tmpXY.x;\n targetObj.client.y = tmpXY.y;\n\n targetObj.timeStamp = is.number(timeStamp) ? timeStamp :new Date().getTime();\n },\n\n pointerExtend: pointerExtend,\n\n getTouchPair: function (event) {\n const touches = [];\n\n // array of touches is supplied\n if (is.array(event)) {\n touches[0] = event[0];\n touches[1] = event[1];\n }\n // an event\n else {\n if (event.type === 'touchend') {\n if (event.touches.length === 1) {\n touches[0] = event.touches[0];\n touches[1] = event.changedTouches[0];\n }\n else if (event.touches.length === 0) {\n touches[0] = event.changedTouches[0];\n touches[1] = event.changedTouches[1];\n }\n }\n else {\n touches[0] = event.touches[0];\n touches[1] = event.touches[1];\n }\n }\n\n return touches;\n },\n\n pointerAverage: function (pointers) {\n const average = {\n pageX : 0,\n pageY : 0,\n clientX: 0,\n clientY: 0,\n screenX: 0,\n screenY: 0,\n };\n\n for (const pointer of pointers) {\n for (const prop in average) {\n average[prop] += pointer[prop];\n }\n }\n for (const prop in average) {\n average[prop] /= pointers.length;\n }\n\n return average;\n },\n\n touchBBox: function (event) {\n if (!event.length && !(event.touches && event.touches.length > 1)) {\n return;\n }\n\n const touches = pointerUtils.getTouchPair(event);\n const minX = Math.min(touches[0].pageX, touches[1].pageX);\n const minY = Math.min(touches[0].pageY, touches[1].pageY);\n const maxX = Math.max(touches[0].pageX, touches[1].pageX);\n const maxY = Math.max(touches[0].pageY, touches[1].pageY);\n\n return {\n x: minX,\n y: minY,\n left: minX,\n top: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n },\n\n touchDistance: function (event, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n\n\n const dx = touches[0][sourceX] - touches[1][sourceX];\n const dy = touches[0][sourceY] - touches[1][sourceY];\n\n return hypot(dx, dy);\n },\n\n touchAngle: function (event, prevAngle, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n const dx = touches[1][sourceX] - touches[0][sourceX];\n const dy = touches[1][sourceY] - touches[0][sourceY];\n const angle = 180 * Math.atan2(dy , dx) / Math.PI;\n\n return angle;\n },\n\n getPointerType: function (pointer, interaction) {\n // if the PointerEvent API isn't available, then the pointer must be ither\n // a MouseEvent or TouchEvent\n if (interaction.mouse) { return 'mouse'; }\n if (!browser.supportsPointerEvent) { return 'touch'; }\n\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : [undefined, undefined,'touch', 'pen', 'mouse'][pointer.pointerType];\n },\n\n // [ event.target, event.currentTarget ]\n getEventTargets: function (event) {\n return [\n domUtils.getActualElement(event.path ? event.path[0] : event.target),\n domUtils.getActualElement(event.currentTarget),\n ];\n },\n};\n\nmodule.exports = pointerUtils;\n","const { window } = require('./window');\n\nconst vendors = ['ms', 'moz', 'webkit', 'o'];\nlet lastTime = 0;\nlet request;\nlet cancel;\n\nfor (let x = 0; x < vendors.length && !window.requestAnimationFrame; x++) {\n request = window[vendors[x] + 'RequestAnimationFrame'];\n cancel = window[vendors[x] +'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n}\n\nif (!request) {\n request = function (callback) {\n const currTime = new Date().getTime();\n const timeToCall = Math.max(0, 16 - (currTime - lastTime));\n const id = setTimeout(function () { callback(currTime + timeToCall); },\n timeToCall);\n\n lastTime = currTime + timeToCall;\n return id;\n };\n}\n\nif (!cancel) {\n cancel = function (id) {\n clearTimeout(id);\n };\n}\n\nmodule.exports = {\n request,\n cancel,\n};\n","const extend = require('./extend');\nconst is = require('./is');\nconst {\n closest,\n parentNode,\n getElementRect,\n} = require('./domUtils');\n\nconst rectUtils = {\n getStringOptionResult: function (value, interactable, element) {\n if (!is.string(value)) {\n return null;\n }\n\n if (value === 'parent') {\n value = parentNode(element);\n }\n else if (value === 'self') {\n value = interactable.getRect(element);\n }\n else {\n value = closest(element, value);\n }\n\n return value;\n },\n\n resolveRectLike: function (value, interactable, element, functionArgs) {\n value = rectUtils.getStringOptionResult(value, interactable, element) || value;\n\n if (is.function(value)) {\n value = value.apply(null, functionArgs);\n }\n\n if (is.element(value)) {\n value = getElementRect(value);\n }\n\n return value;\n },\n\n rectToXY: function (rect) {\n return rect && {\n x: 'x' in rect ? rect.x : rect.left,\n y: 'y' in rect ? rect.y : rect.top,\n };\n },\n\n xywhToTlbr: function (rect) {\n if (rect && !('left' in rect && 'top' in rect)) {\n rect = extend({}, rect);\n\n rect.left = rect.x || 0;\n rect.top = rect.y || 0;\n rect.right = rect.right || (rect.left + rect.width);\n rect.bottom = rect.bottom || (rect.top + rect.height);\n }\n\n return rect;\n },\n\n tlbrToXywh: function (rect) {\n if (rect && !('x' in rect && 'y' in rect)) {\n rect = extend({}, rect);\n\n rect.x = rect.left || 0;\n rect.top = rect.top || 0;\n rect.width = rect.width || (rect.right - rect.x);\n rect.height = rect.height || (rect.bottom - rect.y);\n }\n\n return rect;\n },\n};\n\nmodule.exports = rectUtils;\n","const win = module.exports;\nconst isWindow = require('./isWindow');\n\nfunction init (window) {\n // get wrapped window if using Shadow DOM polyfill\n\n win.realWindow = window;\n\n // create a TextNode\n const el = window.document.createTextNode('');\n\n // check if it's wrapped by a polyfill\n if (el.ownerDocument !== window.document\n && typeof window.wrap === 'function'\n && window.wrap(el) === el) {\n // use wrapped window\n window = window.wrap(window);\n }\n\n win.window = window;\n}\n\nif (typeof window === 'undefined') {\n win.window = undefined;\n win.realWindow = undefined;\n}\nelse {\n init(window);\n}\n\nwin.getWindow = function getWindow (node) {\n if (isWindow(node)) {\n return node;\n }\n\n const rootNode = (node.ownerDocument || node);\n\n return rootNode.defaultView || rootNode.parentWindow || win.window;\n};\n\nwin.init = init;\n"]} \ No newline at end of file +{"version":3,"sources":["src/header.js","node_modules/browser-pack/_prelude.js","index.js","src/Eventable.js","src/InteractEvent.js","src/Interactable.js","src/Interaction.js","src/actions/base.js","src/actions/drag.js","src/actions/drop.js","src/actions/gesture.js","src/actions/resize.js","src/autoScroll.js","src/autoStart/InteractableMethods.js","src/autoStart/base.js","src/autoStart/delay.js","src/autoStart/drag.js","src/autoStart/gesture.js","src/autoStart/resize.js","src/defaultOptions.js","src/index.js","src/inertia.js","src/interact.js","src/interactablePreventDefault.js","src/legacyBrowsers.js","src/modifiers/index.js","src/modifiers/restrict.js","src/modifiers/restrictEdges.js","src/modifiers/restrictSize.js","src/modifiers/snap.js","src/modifiers/snapSize.js","src/pointerEvents/PointerEvent.js","src/pointerEvents/base.js","src/pointerEvents/holdRepeat.js","src/pointerEvents/interactableTargets.js","src/scope.js","src/utils/Signals.js","src/utils/arr.js","src/utils/browser.js","src/utils/domObjects.js","src/utils/domUtils.js","src/utils/events.js","src/utils/extend.js","src/utils/getOriginXY.js","src/utils/hypot.js","src/utils/index.js","src/utils/interactionFinder.js","src/utils/is.js","src/utils/isWindow.js","src/utils/pointerExtend.js","src/utils/pointerUtils.js","src/utils/raf.js","src/utils/rect.js","src/utils/window.js"],"names":[],"mappings":"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","file":"interact.js","sourceRoot":"","sourcesContent":["/**\n * interact.js v1.3.0-alpha.4+sha.7970416-dirty\n *\n * Copyright (c) 2012-2017 Taye Adeyemi \n * Open source under the MIT License.\n * https://raw.github.com/taye/interact.js/master/LICENSE\n */\n","(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o 150) {\n return null;\n }\n\n let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI;\n const overlap = 22.5;\n\n if (angle < 0) {\n angle += 360;\n }\n\n const left = 135 - overlap <= angle && angle < 225 + overlap;\n const up = 225 - overlap <= angle && angle < 315 + overlap;\n\n const right = !left && (315 - overlap <= angle || angle < 45 + overlap);\n const down = !up && 45 - overlap <= angle && angle < 135 + overlap;\n\n return {\n up,\n down,\n left,\n right,\n angle,\n speed: interaction.prevEvent.speed,\n velocity: {\n x: interaction.prevEvent.velocityX,\n y: interaction.prevEvent.velocityY,\n },\n };\n }\n\n preventDefault () {}\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n}\n\nsignals.on('set-delta', function ({ iEvent, interaction, starting, deltaSource }) {\n const prevEvent = starting? iEvent : interaction.prevEvent;\n\n if (deltaSource === 'client') {\n iEvent.dx = iEvent.clientX - prevEvent.clientX;\n iEvent.dy = iEvent.clientY - prevEvent.clientY;\n }\n else {\n iEvent.dx = iEvent.pageX - prevEvent.pageX;\n iEvent.dy = iEvent.pageY - prevEvent.pageY;\n }\n});\n\nInteractEvent.signals = signals;\n\nmodule.exports = InteractEvent;\n","const is = require('./utils/is');\nconst events = require('./utils/events');\nconst extend = require('./utils/extend');\nconst actions = require('./actions/base');\nconst scope = require('./scope');\nconst Eventable = require('./Eventable');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nconst {\n getElementRect,\n nodeContains,\n trySelector,\n} = require('./utils/domUtils');\nconst { getWindow } = require('./utils/window');\nconst { indexOf, contains } = require('./utils/arr');\nconst { wheelEvent } = require('./utils/browser');\n\n// all set interactables\nscope.interactables = [];\n\n/*\\\n * Interactable\n [ property ]\n **\n * Object type returned by @interact\n\\*/\nclass Interactable {\n constructor (target, options) {\n options = options || {};\n\n this.target = target;\n this.events = new Eventable();\n this._context = options.context || scope.document;\n this._win = getWindow(trySelector(target)? this._context : target);\n this._doc = this._win.document;\n\n signals.fire('new', {\n target,\n options,\n interactable: this,\n win: this._win,\n });\n\n scope.addDocument( this._doc, this._win );\n\n scope.interactables.push(this);\n\n this.set(options);\n }\n\n setOnEvents (action, phases) {\n const onAction = 'on' + action;\n\n if (is.function(phases.onstart) ) { this.events[onAction + 'start' ] = phases.onstart ; }\n if (is.function(phases.onmove) ) { this.events[onAction + 'move' ] = phases.onmove ; }\n if (is.function(phases.onend) ) { this.events[onAction + 'end' ] = phases.onend ; }\n if (is.function(phases.oninertiastart)) { this.events[onAction + 'inertiastart' ] = phases.oninertiastart ; }\n\n return this;\n }\n\n setPerAction (action, options) {\n // for all the default per-action options\n for (const option in options) {\n // if this option exists for this action\n if (option in defaults[action]) {\n // if the option in the options arg is an object value\n if (is.object(options[option])) {\n // duplicate the object\n this.options[action][option] = extend(this.options[action][option] || {}, options[option]);\n\n if (is.object(defaults.perAction[option]) && 'enabled' in defaults.perAction[option]) {\n this.options[action][option].enabled = options[option].enabled === false? false : true;\n }\n }\n else if (is.bool(options[option]) && is.object(defaults.perAction[option])) {\n this.options[action][option].enabled = options[option];\n }\n else if (options[option] !== undefined) {\n // or if it's not undefined, do a plain assignment\n this.options[action][option] = options[option];\n }\n }\n }\n }\n\n /*\\\n * Interactable.getRect\n [ method ]\n *\n * The default function to get an Interactables bounding rect. Can be\n * overridden using @Interactable.rectChecker.\n *\n - element (Element) #optional The element to measure.\n = (object) The object's bounding rectangle.\n o {\n o top : 0,\n o left : 0,\n o bottom: 0,\n o right : 0,\n o width : 0,\n o height: 0\n o }\n \\*/\n getRect (element) {\n element = element || this.target;\n\n if (is.string(this.target) && !(is.element(element))) {\n element = this._context.querySelector(this.target);\n }\n\n return getElementRect(element);\n }\n\n /*\\\n * Interactable.rectChecker\n [ method ]\n *\n * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n - checker (function) #optional A function which returns this Interactable's bounding rectangle. See @Interactable.getRect\n = (function | object) The checker function or this Interactable\n \\*/\n rectChecker (checker) {\n if (is.function(checker)) {\n this.getRect = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.getRect;\n\n return this;\n }\n\n return this.getRect;\n }\n\n _backCompatOption (optionName, newValue) {\n if (trySelector(newValue) || is.object(newValue)) {\n this.options[optionName] = newValue;\n\n for (const action of actions.names) {\n this.options[action][optionName] = newValue;\n }\n\n return this;\n }\n\n return this.options[optionName];\n }\n\n /*\\\n * Interactable.origin\n [ method ]\n *\n * Gets or sets the origin of the Interactable's element. The x and y\n * of the origin will be subtracted from action event coordinates.\n *\n - origin (object | string) #optional An object eg. { x: 0, y: 0 } or string 'parent', 'self' or any CSS selector\n * OR\n - origin (Element) #optional An HTML or SVG Element whose rect will be used\n **\n = (object) The current origin or this Interactable\n \\*/\n origin (newValue) {\n return this._backCompatOption('origin', newValue);\n }\n\n /*\\\n * Interactable.deltaSource\n [ method ]\n *\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n - newValue (string) #optional Use 'client' if you will be scrolling while interacting; Use 'page' if you want autoScroll to work\n = (string | object) The current deltaSource or this Interactable\n \\*/\n deltaSource (newValue) {\n if (newValue === 'page' || newValue === 'client') {\n this.options.deltaSource = newValue;\n\n return this;\n }\n\n return this.options.deltaSource;\n }\n\n /*\\\n * Interactable.context\n [ method ]\n *\n * Gets the selector context Node of the Interactable. The default is `window.document`.\n *\n = (Node) The context Node of this Interactable\n **\n \\*/\n context () {\n return this._context;\n }\n\n inContext (element) {\n return (this._context === element.ownerDocument\n || nodeContains(this._context, element));\n }\n\n /*\\\n * Interactable.fire\n [ method ]\n *\n * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n - iEvent (InteractEvent) The InteractEvent object to be fired on this Interactable\n = (Interactable) this Interactable\n \\*/\n fire (iEvent) {\n this.events.fire(iEvent);\n\n return this;\n }\n\n _onOffMultiple (method, eventType, listener, options) {\n if (is.string(eventType) && eventType.search(' ') !== -1) {\n eventType = eventType.trim().split(/ +/);\n }\n\n if (is.array(eventType)) {\n for (let i = 0; i < eventType.length; i++) {\n this[method](eventType[i], listener, options);\n }\n\n return true;\n }\n\n if (is.object(eventType)) {\n for (const prop in eventType) {\n this[method](prop, eventType[prop], listener);\n }\n\n return true;\n }\n }\n\n /*\\\n * Interactable.on\n [ method ]\n *\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n - eventType (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) This Interactable\n \\*/\n on (eventType, listener, options) {\n if (this._onOffMultiple('on', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.on(eventType, listener);\n }\n // delegated event for selector\n else if (is.string(this.target)) {\n events.addDelegate(this.target, this._context, eventType, listener, options);\n }\n else {\n events.add(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.off\n [ method ]\n *\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n - eventType (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) This Interactable\n \\*/\n off (eventType, listener, options) {\n if (this._onOffMultiple('off', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n // if it is an action event type\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.off(eventType, listener);\n }\n // delegated event\n else if (is.string(this.target)) {\n events.removeDelegate(this.target, this._context, eventType, listener, options);\n }\n // remove listener from this Interatable's element\n else {\n events.remove(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.set\n [ method ]\n *\n * Reset the options of this Interactable\n - options (object) The new settings to apply\n = (object) This Interactable\n \\*/\n set (options) {\n if (!is.object(options)) {\n options = {};\n }\n\n this.options = extend({}, defaults.base);\n\n const perActions = extend({}, defaults.perAction);\n\n for (const actionName in actions.methodDict) {\n const methodName = actions.methodDict[actionName];\n\n this.options[actionName] = extend({}, defaults[actionName]);\n\n this.setPerAction(actionName, perActions);\n\n this[methodName](options[actionName]);\n }\n\n for (const setting of Interactable.settingsMethods) {\n this.options[setting] = defaults.base[setting];\n\n if (setting in options) {\n this[setting](options[setting]);\n }\n }\n\n signals.fire('set', {\n options,\n interactable: this,\n });\n\n return this;\n }\n\n /*\\\n * Interactable.unset\n [ method ]\n *\n * Remove this interactable from the list of interactables and remove\n * it's action capabilities and event listeners\n *\n = (object) @interact\n \\*/\n unset () {\n events.remove(this.target, 'all');\n\n if (is.string(this.target)) {\n // remove delegated events\n for (const type in events.delegatedEvents) {\n const delegated = events.delegatedEvents[type];\n\n if (delegated.selectors[0] === this.target\n && delegated.contexts[0] === this._context) {\n\n delegated.selectors.splice(0, 1);\n delegated.contexts .splice(0, 1);\n delegated.listeners.splice(0, 1);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegated[type] = null;\n }\n }\n\n events.remove(this._context, type, events.delegateListener);\n events.remove(this._context, type, events.delegateUseCapture, true);\n }\n }\n else {\n events.remove(this, 'all');\n }\n\n signals.fire('unset', { interactable: this });\n\n scope.interactables.splice(indexOf(scope.interactables, this), 1);\n\n // Stop related interactions when an Interactable is unset\n for (const interaction of scope.interactions || []) {\n if (interaction.target === this && interaction.interacting()) {\n interaction.stop();\n }\n }\n\n return scope.interact;\n }\n}\n\nscope.interactables.indexOfElement = function indexOfElement (target, context) {\n context = context || scope.document;\n\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n if (interactable.target === target && interactable._context === context) {\n return i;\n }\n }\n return -1;\n};\n\nscope.interactables.get = function interactableGet (element, options, dontCheckInContext) {\n const ret = this[this.indexOfElement(element, options && options.context)];\n\n return ret && (is.string(element) || dontCheckInContext || ret.inContext(element))? ret : null;\n};\n\nscope.interactables.forEachSelector = function (callback, element) {\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n // skip non CSS selector targets and out of context elements\n if (!is.string(interactable.target)\n || (element && !interactable.inContext(element))) {\n continue;\n }\n\n const ret = callback(interactable, interactable.target, interactable._context, i, this);\n\n if (ret !== undefined) {\n return ret;\n }\n }\n};\n\n// all interact.js eventTypes\nInteractable.eventTypes = scope.eventTypes = [];\n\nInteractable.signals = signals;\n\nInteractable.settingsMethods = [ 'deltaSource', 'origin', 'preventDefault', 'rectChecker' ];\n\nmodule.exports = Interactable;\n","const scope = require('./scope');\nconst utils = require('./utils');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst domObjects = require('./utils/domObjects');\nconst finder = require('./utils/interactionFinder');\nconst signals = require('./utils/Signals').new();\n\nconst listeners = {};\nconst methodNames = [\n 'pointerDown', 'pointerMove', 'pointerUp',\n 'updatePointer', 'removePointer',\n];\n\n// for ignoring browser's simulated mouse events\nlet prevTouchTime = 0;\n\n// all active and idle interactions\nscope.interactions = [];\n\nclass Interaction {\n constructor ({ pointerType }) {\n this.target = null; // current interactable being interacted with\n this.element = null; // the target element of the interactable\n\n this.prepared = { // action that's ready to be fired on next move event\n name : null,\n axis : null,\n edges: null,\n };\n\n // keep track of added pointers\n this.pointers = [];\n this.pointerIds = [];\n this.downTargets = [];\n this.downTimes = [];\n\n // Previous native pointer move event coordinates\n this.prevCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n // current native pointer move event coordinates\n this.curCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Starting InteractEvent pointer coordinates\n this.startCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Change in coordinates and time of the pointer\n this.pointerDelta = {\n page : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n client : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n timeStamp: 0,\n };\n\n this.downEvent = null; // pointerdown/mousedown/touchstart event\n this.downPointer = {};\n\n this._eventTarget = null;\n this._curEventTarget = null;\n\n this.prevEvent = null; // previous action event\n\n this.pointerIsDown = false;\n this.pointerWasMoved = false;\n this._interacting = false;\n\n this.pointerType = pointerType;\n\n signals.fire('new', this);\n\n scope.interactions.push(this);\n }\n\n pointerDown (pointer, event, eventTarget) {\n const pointerIndex = this.updatePointer(pointer, event, true);\n\n signals.fire('down', {\n pointer,\n event,\n eventTarget,\n pointerIndex,\n interaction: this,\n });\n }\n\n /*\\\n * Interaction.start\n [ method ]\n *\n * Start an action with the given Interactable and Element as tartgets. The\n * action must be enabled for the target Interactable and an appropriate number\n * of pointers must be held down - 1 for drag/resize, 2 for gesture.\n *\n * Use it with `interactable.able({ manualStart: false })` to always\n * [start actions manually](https://github.com/taye/interact.js/issues/114)\n *\n - action (object) The action to be performed - drag, resize, etc.\n - target (Interactable) The Interactable to target\n - element (Element) The DOM Element to target\n = (object) interact\n **\n | interact(target)\n | .draggable({\n | // disable the default drag start by down->move\n | manualStart: true\n | })\n | // start dragging after the user holds the pointer down\n | .on('hold', function (event) {\n | var interaction = event.interaction;\n |\n | if (!interaction.interacting()) {\n | interaction.start({ name: 'drag' },\n | event.interactable,\n | event.currentTarget);\n | }\n | });\n \\*/\n start (action, target, element) {\n if (this.interacting()\n || !this.pointerIsDown\n || this.pointerIds.length < (action.name === 'gesture'? 2 : 1)) {\n return;\n }\n\n // if this interaction had been removed after stopping\n // add it back\n if (utils.indexOf(scope.interactions, this) === -1) {\n scope.interactions.push(this);\n }\n\n utils.copyAction(this.prepared, action);\n this.target = target;\n this.element = element;\n\n signals.fire('action-start', {\n interaction: this,\n event: this.downEvent,\n });\n }\n\n pointerMove (pointer, event, eventTarget) {\n if (!this.simulation) {\n this.updatePointer(pointer);\n utils.setCoords(this.curCoords, this.pointers);\n }\n\n const duplicateMove = (this.curCoords.page.x === this.prevCoords.page.x\n && this.curCoords.page.y === this.prevCoords.page.y\n && this.curCoords.client.x === this.prevCoords.client.x\n && this.curCoords.client.y === this.prevCoords.client.y);\n\n let dx;\n let dy;\n\n // register movement greater than pointerMoveTolerance\n if (this.pointerIsDown && !this.pointerWasMoved) {\n dx = this.curCoords.client.x - this.startCoords.client.x;\n dy = this.curCoords.client.y - this.startCoords.client.y;\n\n this.pointerWasMoved = utils.hypot(dx, dy) > Interaction.pointerMoveTolerance;\n }\n\n const signalArg = {\n pointer,\n pointerIndex: this.getPointerIndex(pointer),\n event,\n eventTarget,\n dx,\n dy,\n duplicate: duplicateMove,\n interaction: this,\n interactingBeforeMove: this.interacting(),\n };\n\n if (!duplicateMove) {\n // set pointer coordinate, time changes and speeds\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n }\n\n signals.fire('move', signalArg);\n\n if (!duplicateMove) {\n // if interacting, fire an 'action-move' signal etc\n if (this.interacting()) {\n this.doMove(signalArg);\n }\n\n if (this.pointerWasMoved) {\n utils.copyCoords(this.prevCoords, this.curCoords);\n }\n }\n }\n\n /*\\\n * Interaction.doMove\n [ method ]\n *\n * Force a move of the current action at the same coordinates. Useful if\n * snap/restrict has been changed and you want a movement with the new\n * settings.\n *\n **\n | interact(target)\n | .draggable(true)\n | .on('dragmove', function (event) {\n | if (someCondition) {\n | // change the snap settings\n | event.interactable.draggable({ snap: { targets: [] }});\n | // fire another move event with re-calculated snap\n | event.interaction.doMove();\n | }\n | });\n \\*/\n doMove (signalArg) {\n signalArg = utils.extend({\n pointer: this.pointers[0],\n event: this.prevEvent,\n eventTarget: this._eventTarget,\n interaction: this,\n }, signalArg || {});\n\n signals.fire('before-action-move', signalArg);\n\n if (!this._dontFireMove) {\n signals.fire('action-move', signalArg);\n }\n\n this._dontFireMove = false;\n }\n\n // End interact move events and stop auto-scroll unless simulation is running\n pointerUp (pointer, event, eventTarget, curEventTarget) {\n const pointerIndex = this.getPointerIndex(pointer);\n\n signals.fire(/cancel$/i.test(event.type)? 'cancel' : 'up', {\n pointer,\n pointerIndex,\n event,\n eventTarget,\n curEventTarget,\n interaction: this,\n });\n\n if (!this.simulation) {\n this.end(event);\n }\n\n this.pointerIsDown = false;\n this.removePointer(pointer, event);\n }\n\n /*\\\n * Interaction.end\n [ method ]\n *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n - event (PointerEvent) #optional\n **\n | interact(target)\n | .draggable(true)\n | .on('move', function (event) {\n | if (event.pageX > 1000) {\n | // end the current action\n | event.interaction.end();\n | // stop all further listeners from being called\n | event.stopImmediatePropagation();\n | }\n | });\n \\*/\n end (event) {\n event = event || this.prevEvent;\n\n if (this.interacting()) {\n signals.fire('action-end', {\n event,\n interaction: this,\n });\n }\n\n this.stop();\n }\n\n currentAction () {\n return this._interacting? this.prepared.name: null;\n }\n\n interacting () {\n return this._interacting;\n }\n\n stop () {\n signals.fire('stop', { interaction: this });\n\n if (this._interacting) {\n signals.fire('stop-active', { interaction: this });\n signals.fire('stop-' + this.prepared.name, { interaction: this });\n }\n\n this.target = this.element = null;\n\n this._interacting = false;\n this.prepared.name = this.prevEvent = null;\n }\n\n getPointerIndex (pointer) {\n // mouse and pen interactions may have only one pointer\n if (this.pointerType === 'mouse' || this.pointerType === 'pen') {\n return 0;\n }\n\n return utils.indexOf(this.pointerIds, utils.getPointerId(pointer));\n }\n\n updatePointer (pointer, event, down = event && /(down|start)$/i.test(event.type)) {\n const id = utils.getPointerId(pointer);\n let index = this.getPointerIndex(pointer);\n\n if (index === -1) {\n index = this.pointerIds.length;\n this.pointerIds[index] = id;\n }\n\n if (down) {\n signals.fire('update-pointer-down', {\n pointer,\n event,\n down,\n pointerId: id,\n pointerIndex: index,\n interaction: this,\n });\n }\n\n this.pointers[index] = pointer;\n\n return index;\n }\n\n removePointer (pointer, event) {\n const index = this.getPointerIndex(pointer);\n\n if (index === -1) { return; }\n\n signals.fire('remove-pointer', {\n pointer,\n event,\n pointerIndex: index,\n interaction: this,\n });\n\n this.pointers .splice(index, 1);\n this.pointerIds .splice(index, 1);\n this.downTargets.splice(index, 1);\n this.downTimes .splice(index, 1);\n }\n\n _updateEventTargets (target, currentTarget) {\n this._eventTarget = target;\n this._curEventTarget = currentTarget;\n }\n}\n\nfor (let i = 0, len = methodNames.length; i < len; i++) {\n const method = methodNames[i];\n\n listeners[method] = doOnInteractions(method);\n}\n\nfunction doOnInteractions (method) {\n return (function (event) {\n const pointerType = utils.getPointerType(event);\n const [eventTarget, curEventTarget] = utils.getEventTargets(event);\n const matches = []; // [ [pointer, interaction], ...]\n\n if (browser.supportsTouch && /touch/.test(event.type)) {\n prevTouchTime = new Date().getTime();\n\n for (let i = 0; i < event.changedTouches.length; i++) {\n const pointer = event.changedTouches[i];\n const interaction = finder.search(pointer, event.type, eventTarget);\n\n matches.push([pointer, interaction || new Interaction({ pointerType })]);\n }\n }\n else {\n let invalidPointer = false;\n\n if (!browser.supportsPointerEvent && /mouse/.test(event.type)) {\n // ignore mouse events while touch interactions are active\n for (let i = 0; i < scope.interactions.length && !invalidPointer; i++) {\n invalidPointer = scope.interactions[i].pointerType !== 'mouse' && scope.interactions[i].pointerIsDown;\n }\n\n // try to ignore mouse events that are simulated by the browser\n // after a touch event\n invalidPointer = invalidPointer\n || (new Date().getTime() - prevTouchTime < 500)\n // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated\n || event.timeStamp === 0;\n }\n\n if (!invalidPointer) {\n let interaction = finder.search(event, event.type, eventTarget);\n\n if (!interaction) {\n interaction = new Interaction({ pointerType });\n }\n\n matches.push([event, interaction]);\n }\n }\n\n for (const [pointer, interaction] of matches) {\n interaction._updateEventTargets(eventTarget, curEventTarget);\n interaction[method](pointer, event, eventTarget, curEventTarget);\n }\n });\n}\n\nfunction endAll (event) {\n for (let i = 0; i < scope.interactions.length; i++) {\n const interaction = scope.interactions[i];\n\n interaction.end(event);\n signals.fire('endall', { event, interaction });\n }\n}\n\nconst docEvents = { /* 'eventType': listenerFunc */ };\nconst pEventTypes = browser.pEventTypes;\n\nif (domObjects.PointerEvent) {\n docEvents[pEventTypes.down ] = listeners.pointerDown;\n docEvents[pEventTypes.move ] = listeners.pointerMove;\n docEvents[pEventTypes.up ] = listeners.pointerUp;\n docEvents[pEventTypes.cancel] = listeners.pointerUp;\n}\nelse {\n docEvents.mousedown = listeners.pointerDown;\n docEvents.mousemove = listeners.pointerMove;\n docEvents.mouseup = listeners.pointerUp;\n\n docEvents.touchstart = listeners.pointerDown;\n docEvents.touchmove = listeners.pointerMove;\n docEvents.touchend = listeners.pointerUp;\n docEvents.touchcancel = listeners.pointerUp;\n}\n\ndocEvents.blur = endAll;\n\nfunction onDocSignal ({ doc }, signalName) {\n const eventMethod = signalName.indexOf('add') === 0\n ? events.add : events.remove;\n\n // delegate event listener\n for (const eventType in scope.delegatedEvents) {\n eventMethod(doc, eventType, events.delegateListener);\n eventMethod(doc, eventType, events.delegateUseCapture, true);\n }\n\n for (const eventType in docEvents) {\n eventMethod(doc, eventType, docEvents[eventType]);\n }\n}\n\nsignals.on('update-pointer-down', ({ interaction, pointer, pointerId, pointerIndex, event, eventTarget, down }) => {\n interaction.pointerIds[pointerIndex] = pointerId;\n interaction.pointers[pointerIndex] = pointer;\n\n if (down) {\n interaction.pointerIsDown = true;\n }\n\n if (!interaction.interacting()) {\n utils.setCoords(interaction.startCoords, interaction.pointers);\n\n utils.copyCoords(interaction.curCoords , interaction.startCoords);\n utils.copyCoords(interaction.prevCoords, interaction.startCoords);\n\n interaction.downEvent = event;\n interaction.downTimes[pointerIndex] = interaction.curCoords.timeStamp;\n interaction.downTargets[pointerIndex] = eventTarget || event && utils.getEventTargets(event)[0];\n interaction.pointerWasMoved = false;\n\n utils.pointerExtend(interaction.downPointer, pointer);\n }\n});\n\nscope.signals.on('add-document' , onDocSignal);\nscope.signals.on('remove-document', onDocSignal);\n\nInteraction.pointerMoveTolerance = 1;\nInteraction.doOnInteractions = doOnInteractions;\nInteraction.endAll = endAll;\nInteraction.signals = signals;\nInteraction.docEvents = docEvents;\n\nscope.endAllInteractions = endAll;\n\nmodule.exports = Interaction;\n","const Interaction = require('../Interaction');\nconst InteractEvent = require('../InteractEvent');\n\nconst actions = {\n firePrepared,\n names: [],\n methodDict: {},\n};\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n interaction._interacting = true;\n firePrepared(interaction, event, 'start');\n});\n\nInteraction.signals.on('action-move', function ({ interaction, event, preEnd }) {\n firePrepared(interaction, event, 'move', preEnd);\n\n // if the action was ended in a listener\n if (!interaction.interacting()) { return false; }\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n firePrepared(interaction, event, 'end');\n});\n\nfunction firePrepared (interaction, event, phase, preEnd) {\n const actionName = interaction.prepared.name;\n\n const newEvent = new InteractEvent(interaction, event, actionName, phase, interaction.element, null, preEnd);\n\n interaction.target.fire(newEvent);\n interaction.prevEvent = newEvent;\n}\n\nmodule.exports = actions;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drag = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n startAxis : 'xy',\n lockAxis : 'xy',\n },\n\n checker: function (pointer, event, interactable) {\n const dragOptions = interactable.options.drag;\n\n return dragOptions.enabled\n ? { name: 'drag', axis: (dragOptions.lockAxis === 'start'\n ? dragOptions.startAxis\n : dragOptions.lockAxis)}\n : null;\n },\n\n getCursor: function () {\n return 'move';\n },\n};\n\nInteraction.signals.on('before-action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n interaction.curCoords.page.y = interaction.startCoords.page.y;\n interaction.curCoords.client.y = interaction.startCoords.client.y;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vx);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vx);\n interaction.pointerDelta.client.vy = 0;\n interaction.pointerDelta.page.vy = 0;\n }\n else if (axis === 'y') {\n interaction.curCoords.page.x = interaction.startCoords.page.x;\n interaction.curCoords.client.x = interaction.startCoords.client.x;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vy);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vy);\n interaction.pointerDelta.client.vx = 0;\n interaction.pointerDelta.page.vx = 0;\n }\n});\n\n// dragmove\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'dragmove') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n iEvent.pageY = interaction.startCoords.page.y;\n iEvent.clientY = interaction.startCoords.client.y;\n iEvent.dy = 0;\n }\n else if (axis === 'y') {\n iEvent.pageX = interaction.startCoords.page.x;\n iEvent.clientX = interaction.startCoords.client.x;\n iEvent.dx = 0;\n }\n});\n\n/*\\\n * Interactable.draggable\n [ method ]\n *\n * Gets or sets whether drag actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of drag events\n | var isDraggable = interact('ul li').draggable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on drag events (object makes the Interactable draggable)\n = (object) This Interactable\n | interact(element).draggable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // the axis in which the first movement must be\n | // for the drag sequence to start\n | // 'xy' by default - any direction\n | startAxis: 'x' || 'y' || 'xy',\n |\n | // 'xy' by default - don't restrict to one axis (move in any direction)\n | // 'x' or 'y' to restrict movement to either axis\n | // 'start' to restrict movement to the axis the drag started in\n | lockAxis: 'x' || 'y' || 'xy' || 'start',\n |\n | // max number of drags that can happen concurrently\n | // with elements of this Interactable. Infinity by default\n | max: Infinity,\n |\n | // max number of drags that can target the same element+Interactable\n | // 1 by default\n | maxPerElement: 2\n | });\n\\*/\nInteractable.prototype.draggable = function (options) {\n if (utils.is.object(options)) {\n this.options.drag.enabled = options.enabled === false? false: true;\n this.setPerAction('drag', options);\n this.setOnEvents('drag', options);\n\n if (/^(xy|x|y|start)$/.test(options.lockAxis)) {\n this.options.drag.lockAxis = options.lockAxis;\n }\n if (/^(xy|x|y)$/.test(options.startAxis)) {\n this.options.drag.startAxis = options.startAxis;\n }\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drag.enabled = options;\n\n if (!options) {\n this.ondragstart = this.ondragstart = this.ondragend = null;\n }\n\n return this;\n }\n\n return this.options.drag;\n};\n\nactions.drag = drag;\nactions.names.push('drag');\nutils.merge(Interactable.eventTypes, [\n 'dragstart',\n 'dragmove',\n 'draginertiastart',\n 'draginertiaresume',\n 'dragend',\n]);\nactions.methodDict.drag = 'draggable';\n\ndefaultOptions.drag = drag.defaults;\n\nmodule.exports = drag;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst scope = require('../scope');\nconst interact = require('../interact');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drop = {\n defaults: {\n enabled: false,\n accept : null,\n overlap: 'pointer',\n },\n};\n\nlet dynamicDrop = false;\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // reset active dropzones\n interaction.activeDrops.dropzones = [];\n interaction.activeDrops.elements = [];\n interaction.activeDrops.rects = [];\n\n interaction.dropEvents = null;\n\n if (!interaction.dynamicDrop) {\n setActiveDrops(interaction, interaction.element);\n }\n\n const dragEvent = interaction.prevEvent;\n const dropEvents = getDropEvents(interaction, event, dragEvent);\n\n if (dropEvents.activate) {\n fireActiveDrops(interaction, dropEvents.activate);\n }\n});\n\nInteractEvent.signals.on('new', function ({ interaction, iEvent, event }) {\n if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { return; }\n\n const draggableElement = interaction.element;\n const dragEvent = iEvent;\n const dropResult = getDrop(dragEvent, event, draggableElement);\n\n interaction.dropTarget = dropResult.dropzone;\n interaction.dropElement = dropResult.element;\n\n interaction.dropEvents = getDropEvents(interaction, event, dragEvent);\n});\n\nInteraction.signals.on('action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n fireDropEvents(interaction, interaction.dropEvents);\n});\n\nInteraction.signals.on('action-end', function ({ interaction }) {\n if (interaction.prepared.name === 'drag') {\n fireDropEvents(interaction, interaction.dropEvents);\n }\n});\n\nInteraction.signals.on('stop-drag', function ({ interaction }) {\n interaction.activeDrops.dropzones =\n interaction.activeDrops.elements =\n interaction.activeDrops.rects =\n interaction.dropEvents = null;\n});\n\nfunction collectDrops (interaction, element) {\n const drops = [];\n const elements = [];\n\n element = element || interaction.element;\n\n // collect all dropzones and their elements which qualify for a drop\n for (const current of scope.interactables) {\n if (!current.options.drop.enabled) { continue; }\n\n const accept = current.options.drop.accept;\n\n // test the draggable element against the dropzone's accept setting\n if ((utils.is.element(accept) && accept !== element)\n || (utils.is.string(accept)\n && !utils.matchesSelector(element, accept))) {\n\n continue;\n }\n\n // query for new elements if necessary\n const dropElements = utils.is.string(current.target)\n ? current._context.querySelectorAll(current.target)\n : [current.target];\n\n for (let i = 0; i < dropElements.length; i++) {\n const currentElement = dropElements[i];\n\n if (currentElement !== element) {\n drops.push(current);\n elements.push(currentElement);\n }\n }\n }\n\n return {\n elements,\n dropzones: drops,\n };\n}\n\nfunction fireActiveDrops (interaction, event) {\n let prevElement;\n\n // loop through all active dropzones and trigger event\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n const current = interaction.activeDrops.dropzones[i];\n const currentElement = interaction.activeDrops.elements [i];\n\n // prevent trigger of duplicate events on same element\n if (currentElement !== prevElement) {\n // set current element as event target\n event.target = currentElement;\n current.fire(event);\n }\n prevElement = currentElement;\n }\n}\n\n// Collect a new set of possible drops and save them in activeDrops.\n// setActiveDrops should always be called when a drag has just started or a\n// drag event happens while dynamicDrop is true\nfunction setActiveDrops (interaction, dragElement) {\n // get dropzones and their elements that could receive the draggable\n const possibleDrops = collectDrops(interaction, dragElement, true);\n\n interaction.activeDrops.dropzones = possibleDrops.dropzones;\n interaction.activeDrops.elements = possibleDrops.elements;\n interaction.activeDrops.rects = [];\n\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n interaction.activeDrops.rects[i] =\n interaction.activeDrops.dropzones[i].getRect(interaction.activeDrops.elements[i]);\n }\n}\n\nfunction getDrop (dragEvent, event, dragElement) {\n const interaction = dragEvent.interaction;\n const validDrops = [];\n\n if (dynamicDrop) {\n setActiveDrops(interaction, dragElement);\n }\n\n // collect all dropzones and their elements which qualify for a drop\n for (let j = 0; j < interaction.activeDrops.dropzones.length; j++) {\n const current = interaction.activeDrops.dropzones[j];\n const currentElement = interaction.activeDrops.elements [j];\n const rect = interaction.activeDrops.rects [j];\n\n validDrops.push(current.dropCheck(dragEvent, event, interaction.target, dragElement, currentElement, rect)\n ? currentElement\n : null);\n }\n\n // get the most appropriate dropzone based on DOM depth and order\n const dropIndex = utils.indexOfDeepestElement(validDrops);\n\n return {\n dropzone: interaction.activeDrops.dropzones[dropIndex] || null,\n element : interaction.activeDrops.elements [dropIndex] || null,\n };\n}\n\nfunction getDropEvents (interaction, pointerEvent, dragEvent) {\n const dropEvents = {\n enter : null,\n leave : null,\n activate : null,\n deactivate: null,\n move : null,\n drop : null,\n };\n\n const tmpl = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n };\n\n if (interaction.dropElement !== interaction.prevDropElement) {\n // if there was a prevDropTarget, create a dragleave event\n if (interaction.prevDropTarget) {\n dropEvents.leave = utils.extend({ type: 'dragleave' }, tmpl);\n\n dragEvent.dragLeave = dropEvents.leave.target = interaction.prevDropElement;\n dragEvent.prevDropzone = dropEvents.leave.dropzone = interaction.prevDropTarget;\n }\n // if the dropTarget is not null, create a dragenter event\n if (interaction.dropTarget) {\n dropEvents.enter = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n type : 'dragenter',\n };\n\n dragEvent.dragEnter = interaction.dropElement;\n dragEvent.dropzone = interaction.dropTarget;\n }\n }\n\n if (dragEvent.type === 'dragend' && interaction.dropTarget) {\n dropEvents.drop = utils.extend({ type: 'drop' }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n dragEvent.relatedTarget = interaction.dropElement;\n }\n if (dragEvent.type === 'dragstart') {\n dropEvents.activate = utils.extend({ type: 'dropactivate' }, tmpl);\n\n dropEvents.activate.target = null;\n dropEvents.activate.dropzone = null;\n }\n if (dragEvent.type === 'dragend') {\n dropEvents.deactivate = utils.extend({ type: 'dropdeactivate' }, tmpl);\n\n dropEvents.deactivate.target = null;\n dropEvents.deactivate.dropzone = null;\n }\n if (dragEvent.type === 'dragmove' && interaction.dropTarget) {\n dropEvents.move = utils.extend({\n dragmove : dragEvent,\n type : 'dropmove',\n }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n }\n\n return dropEvents;\n}\n\nfunction fireDropEvents (interaction, dropEvents) {\n if (dropEvents.leave) { interaction.prevDropTarget.fire(dropEvents.leave); }\n if (dropEvents.move ) { interaction.dropTarget.fire(dropEvents.move ); }\n if (dropEvents.enter) { interaction.dropTarget.fire(dropEvents.enter); }\n if (dropEvents.drop ) { interaction.dropTarget.fire(dropEvents.drop ); }\n if (dropEvents.deactivate) {\n fireActiveDrops(interaction, dropEvents.deactivate);\n }\n\n interaction.prevDropTarget = interaction.dropTarget;\n interaction.prevDropElement = interaction.dropElement;\n}\n\n/*\\\n * Interactable.dropzone\n [ method ]\n *\n * Returns or sets whether elements can be dropped onto this\n * Interactable to trigger drop events\n *\n * Dropzones can receive the following events:\n * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends\n * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone\n * - `dragmove` when a draggable that has entered the dropzone is moved\n * - `drop` when a draggable is dropped into this dropzone\n *\n * Use the `accept` option to allow only elements that match the given CSS\n * selector or element. The value can be:\n *\n * - **an Element** - only that element can be dropped into this dropzone.\n * - **a string**, - the element being dragged must match it as a CSS selector.\n * - **`null`** - accept options is cleared - it accepts any element.\n *\n * Use the `overlap` option to set how drops are checked for. The allowed\n * values are:\n *\n * - `'pointer'`, the pointer must be over the dropzone (default)\n * - `'center'`, the draggable element's center must be over the dropzone\n * - a number from 0-1 which is the `(intersection area) / (draggable area)`.\n * e.g. `0.5` for drop to happen when half of the area of the draggable is\n * over the dropzone\n *\n * Use the `checker` option to specify a function to check if a dragged\n * element is over this Interactable.\n *\n | interact(target)\n | .dropChecker(function(dragEvent, // related dragmove or dragend event\n | event, // TouchEvent/PointerEvent/MouseEvent\n | dropped, // bool result of the default checker\n | dropzone, // dropzone Interactable\n | dropElement, // dropzone elemnt\n | draggable, // draggable Interactable\n | draggableElement) {// draggable element\n |\n | return dropped && event.target.hasAttribute('allow-drop');\n | }\n *\n *\n - options (boolean | object | null) #optional The new value to be set.\n | interact('.drop').dropzone({\n | accept: '.can-drop' || document.getElementById('single-drop'),\n | overlap: 'pointer' || 'center' || zeroToOne\n | }\n = (boolean | object) The current setting or this Interactable\n\\*/\nInteractable.prototype.dropzone = function (options) {\n if (utils.is.object(options)) {\n this.options.drop.enabled = options.enabled === false? false: true;\n\n if (utils.is.function(options.ondrop) ) { this.events.ondrop = options.ondrop ; }\n if (utils.is.function(options.ondropactivate) ) { this.events.ondropactivate = options.ondropactivate ; }\n if (utils.is.function(options.ondropdeactivate)) { this.events.ondropdeactivate = options.ondropdeactivate; }\n if (utils.is.function(options.ondragenter) ) { this.events.ondragenter = options.ondragenter ; }\n if (utils.is.function(options.ondragleave) ) { this.events.ondragleave = options.ondragleave ; }\n if (utils.is.function(options.ondropmove) ) { this.events.ondropmove = options.ondropmove ; }\n\n if (/^(pointer|center)$/.test(options.overlap)) {\n this.options.drop.overlap = options.overlap;\n }\n else if (utils.is.number(options.overlap)) {\n this.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0);\n }\n if ('accept' in options) {\n this.options.drop.accept = options.accept;\n }\n if ('checker' in options) {\n this.options.drop.checker = options.checker;\n }\n\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drop.enabled = options;\n\n if (!options) {\n this.ondragenter = this.ondragleave = this.ondrop\n = this.ondropactivate = this.ondropdeactivate = null;\n }\n\n return this;\n }\n\n return this.options.drop;\n};\n\nInteractable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) {\n let dropped = false;\n\n // if the dropzone has no rect (eg. display: none)\n // call the custom dropChecker or just return false\n if (!(rect = rect || this.getRect(dropElement))) {\n return (this.options.drop.checker\n ? this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement)\n : false);\n }\n\n const dropOverlap = this.options.drop.overlap;\n\n if (dropOverlap === 'pointer') {\n const origin = utils.getOriginXY(draggable, draggableElement, 'drag');\n const page = utils.getPageXY(dragEvent);\n\n page.x += origin.x;\n page.y += origin.y;\n\n const horizontal = (page.x > rect.left) && (page.x < rect.right);\n const vertical = (page.y > rect.top ) && (page.y < rect.bottom);\n\n dropped = horizontal && vertical;\n }\n\n const dragRect = draggable.getRect(draggableElement);\n\n if (dragRect && dropOverlap === 'center') {\n const cx = dragRect.left + dragRect.width / 2;\n const cy = dragRect.top + dragRect.height / 2;\n\n dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom;\n }\n\n if (dragRect && utils.is.number(dropOverlap)) {\n const overlapArea = (Math.max(0, Math.min(rect.right , dragRect.right ) - Math.max(rect.left, dragRect.left))\n * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top , dragRect.top )));\n\n const overlapRatio = overlapArea / (dragRect.width * dragRect.height);\n\n dropped = overlapRatio >= dropOverlap;\n }\n\n if (this.options.drop.checker) {\n dropped = this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement);\n }\n\n return dropped;\n};\n\nInteractable.signals.on('unset', function ({ interactable }) {\n interactable.dropzone(false);\n});\n\nInteractable.settingsMethods.push('dropChecker');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.dropTarget = null; // the dropzone a drag target might be dropped into\n interaction.dropElement = null; // the element at the time of checking\n interaction.prevDropTarget = null; // the dropzone that was recently dragged away from\n interaction.prevDropElement = null; // the element at the time of checking\n interaction.dropEvents = null; // the dropEvents related to the current drag event\n\n interaction.activeDrops = {\n dropzones: [], // the dropzones that are mentioned below\n elements : [], // elements of dropzones that accept the target draggable\n rects : [], // the rects of the elements mentioned above\n };\n\n});\n\nInteraction.signals.on('stop', function ({ interaction }) {\n interaction.dropTarget = interaction.dropElement =\n interaction.prevDropTarget = interaction.prevDropElement = null;\n});\n\n/*\\\n * interact.dynamicDrop\n [ method ]\n *\n * Returns or sets whether the dimensions of dropzone elements are\n * calculated on every dragmove or only on dragstart for the default\n * dropChecker\n *\n - newValue (boolean) #optional True to check on each move. False to check only before start\n = (boolean | interact) The current setting or interact\n\\*/\ninteract.dynamicDrop = function (newValue) {\n if (utils.is.bool(newValue)) {\n //if (dragging && dynamicDrop !== newValue && !newValue) {\n //calcRects(dropzones);\n //}\n\n dynamicDrop = newValue;\n\n return interact;\n }\n return dynamicDrop;\n};\n\nutils.merge(Interactable.eventTypes, [\n 'dragenter',\n 'dragleave',\n 'dropactivate',\n 'dropdeactivate',\n 'dropmove',\n 'drop',\n]);\nactions.methodDict.drop = 'dropzone';\n\ndefaultOptions.drop = drop.defaults;\n\nmodule.exports = drop;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst gesture = {\n defaults: {\n enabled : false,\n origin : null,\n restrict: null,\n },\n\n checker: function (pointer, event, interactable, element, interaction) {\n if (interaction.pointerIds.length >= 2) {\n return { name: 'gesture' };\n }\n\n return null;\n },\n\n getCursor: function () {\n return '';\n },\n};\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturestart') { return; }\n iEvent.ds = 0;\n\n interaction.gesture.startDistance = interaction.gesture.prevDistance = iEvent.distance;\n interaction.gesture.startAngle = interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.scale = 1;\n});\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturemove') { return; }\n\n iEvent.ds = iEvent.scale - interaction.gesture.scale;\n\n interaction.target.fire(iEvent);\n\n interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.prevDistance = iEvent.distance;\n\n if (iEvent.scale !== Infinity\n && iEvent.scale !== null\n && iEvent.scale !== undefined\n && !isNaN(iEvent.scale)) {\n\n interaction.gesture.scale = iEvent.scale;\n }\n});\n\n/*\\\n * Interactable.gesturable\n [ method ]\n *\n * Gets or sets whether multitouch gestures can be performed on the\n * Interactable's element\n *\n = (boolean) Indicates if this can be the target of gesture events\n | var isGestureable = interact(element).gesturable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on gesture events (makes the Interactable gesturable)\n = (object) this Interactable\n | interact(element).gesturable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // limit multiple gestures.\n | // See the explanation in @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n\\*/\nInteractable.prototype.gesturable = function (options) {\n if (utils.is.object(options)) {\n this.options.gesture.enabled = options.enabled === false? false: true;\n this.setPerAction('gesture', options);\n this.setOnEvents('gesture', options);\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.gesture.enabled = options;\n\n if (!options) {\n this.ongesturestart = this.ongesturestart = this.ongestureend = null;\n }\n\n return this;\n }\n\n return this.options.gesture;\n};\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action, event, starting, ending, deltaSource }) {\n if (action !== 'gesture') { return; }\n\n const pointers = interaction.pointers;\n\n iEvent.touches = [pointers[0], pointers[1]];\n\n if (starting) {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = 1;\n iEvent.ds = 0;\n iEvent.angle = utils.touchAngle(pointers, undefined, deltaSource);\n iEvent.da = 0;\n }\n else if (ending || event instanceof InteractEvent) {\n iEvent.distance = interaction.prevEvent.distance;\n iEvent.box = interaction.prevEvent.box;\n iEvent.scale = interaction.prevEvent.scale;\n iEvent.ds = iEvent.scale - 1;\n iEvent.angle = interaction.prevEvent.angle;\n iEvent.da = iEvent.angle - interaction.gesture.startAngle;\n }\n else {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = iEvent.distance / interaction.gesture.startDistance;\n iEvent.angle = utils.touchAngle(pointers, interaction.gesture.prevAngle, deltaSource);\n\n iEvent.ds = iEvent.scale - interaction.gesture.prevScale;\n iEvent.da = iEvent.angle - interaction.gesture.prevAngle;\n }\n});\n\nInteraction.signals.on('new', function (interaction) {\n interaction.gesture = {\n start: { x: 0, y: 0 },\n\n startDistance: 0, // distance between two touches of touchStart\n prevDistance : 0,\n distance : 0,\n\n scale: 1, // gesture.distance / gesture.startDistance\n\n startAngle: 0, // angle of line joining two touches\n prevAngle : 0, // angle of the previous gesture event\n };\n});\n\nactions.gesture = gesture;\nactions.names.push('gesture');\nutils.merge(Interactable.eventTypes, [\n 'gesturestart',\n 'gesturemove',\n 'gestureend',\n]);\nactions.methodDict.gesture = 'gesturable';\n\ndefaultOptions.gesture = gesture.defaults;\n\nmodule.exports = gesture;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\n// Less Precision with touch input\nconst defaultMargin = browser.supportsTouch || browser.supportsPointerEvent? 20: 10;\n\nconst resize = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n square: false,\n preserveAspectRatio: false,\n axis: 'xy',\n\n // use default margin\n margin: NaN,\n\n // object with props left, right, top, bottom which are\n // true/false values to resize when the pointer is over that edge,\n // CSS selectors to match the handles for each direction\n // or the Elements for each handle\n edges: null,\n\n // a value of 'none' will limit the resize rect to a minimum of 0x0\n // 'negate' will alow the rect to have negative width/height\n // 'reposition' will keep the width/height positive by swapping\n // the top and bottom edges and/or swapping the left and right edges\n invert: 'none',\n },\n\n checker: function (pointer, event, interactable, element, interaction, rect) {\n if (!rect) { return null; }\n\n const page = utils.extend({}, interaction.curCoords.page);\n const options = interactable.options;\n\n if (options.resize.enabled) {\n const resizeOptions = options.resize;\n const resizeEdges = { left: false, right: false, top: false, bottom: false };\n\n // if using resize.edges\n if (utils.is.object(resizeOptions.edges)) {\n for (const edge in resizeEdges) {\n resizeEdges[edge] = checkResizeEdge(edge,\n resizeOptions.edges[edge],\n page,\n interaction._eventTarget,\n element,\n rect,\n resizeOptions.margin || defaultMargin);\n }\n\n resizeEdges.left = resizeEdges.left && !resizeEdges.right;\n resizeEdges.top = resizeEdges.top && !resizeEdges.bottom;\n\n if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) {\n return {\n name: 'resize',\n edges: resizeEdges,\n };\n }\n }\n else {\n const right = options.resize.axis !== 'y' && page.x > (rect.right - defaultMargin);\n const bottom = options.resize.axis !== 'x' && page.y > (rect.bottom - defaultMargin);\n\n if (right || bottom) {\n return {\n name: 'resize',\n axes: (right? 'x' : '') + (bottom? 'y' : ''),\n };\n }\n }\n }\n\n return null;\n },\n\n cursors: (browser.isIe9OrOlder ? {\n x : 'e-resize',\n y : 's-resize',\n xy: 'se-resize',\n\n top : 'n-resize',\n left : 'w-resize',\n bottom : 's-resize',\n right : 'e-resize',\n topleft : 'se-resize',\n bottomright: 'se-resize',\n topright : 'ne-resize',\n bottomleft : 'ne-resize',\n } : {\n x : 'ew-resize',\n y : 'ns-resize',\n xy: 'nwse-resize',\n\n top : 'ns-resize',\n left : 'ew-resize',\n bottom : 'ns-resize',\n right : 'ew-resize',\n topleft : 'nwse-resize',\n bottomright: 'nwse-resize',\n topright : 'nesw-resize',\n bottomleft : 'nesw-resize',\n }),\n\n getCursor: function (action) {\n if (action.axis) {\n return resize.cursors[action.name + action.axis];\n }\n else if (action.edges) {\n let cursorKey = '';\n const edgeNames = ['top', 'bottom', 'left', 'right'];\n\n for (let i = 0; i < 4; i++) {\n if (action.edges[edgeNames[i]]) {\n cursorKey += edgeNames[i];\n }\n }\n\n return resize.cursors[cursorKey];\n }\n },\n};\n\n// resizestart\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'resizestart' || !interaction.prepared.edges) {\n return;\n }\n\n const startRect = interaction.target.getRect(interaction.element);\n const resizeOptions = interaction.target.options.resize;\n\n /*\n * When using the `resizable.square` or `resizable.preserveAspectRatio` options, resizing from one edge\n * will affect another. E.g. with `resizable.square`, resizing to make the right edge larger will make\n * the bottom edge larger by the same amount. We call these 'linked' edges. Any linked edges will depend\n * on the active edges and the edge being interacted with.\n */\n if (resizeOptions.square || resizeOptions.preserveAspectRatio) {\n const linkedEdges = utils.extend({}, interaction.prepared.edges);\n\n linkedEdges.top = linkedEdges.top || (linkedEdges.left && !linkedEdges.bottom);\n linkedEdges.left = linkedEdges.left || (linkedEdges.top && !linkedEdges.right );\n linkedEdges.bottom = linkedEdges.bottom || (linkedEdges.right && !linkedEdges.top );\n linkedEdges.right = linkedEdges.right || (linkedEdges.bottom && !linkedEdges.left );\n\n interaction.prepared._linkedEdges = linkedEdges;\n }\n else {\n interaction.prepared._linkedEdges = null;\n }\n\n // if using `resizable.preserveAspectRatio` option, record aspect ratio at the start of the resize\n if (resizeOptions.preserveAspectRatio) {\n interaction.resizeStartAspectRatio = startRect.width / startRect.height;\n }\n\n interaction.resizeRects = {\n start : startRect,\n current : utils.extend({}, startRect),\n inverted : utils.extend({}, startRect),\n previous : utils.extend({}, startRect),\n delta : {\n left: 0, right : 0, width : 0,\n top : 0, bottom: 0, height: 0,\n },\n };\n\n iEvent.rect = interaction.resizeRects.inverted;\n iEvent.deltaRect = interaction.resizeRects.delta;\n});\n\n// resizemove\nInteractEvent.signals.on('new', function ({ iEvent, phase, interaction }) {\n if (phase !== 'move' || !interaction.prepared.edges) { return; }\n\n const resizeOptions = interaction.target.options.resize;\n const invert = resizeOptions.invert;\n const invertible = invert === 'reposition' || invert === 'negate';\n\n let edges = interaction.prepared.edges;\n\n const start = interaction.resizeRects.start;\n const current = interaction.resizeRects.current;\n const inverted = interaction.resizeRects.inverted;\n const delta = interaction.resizeRects.delta;\n const previous = utils.extend(interaction.resizeRects.previous, inverted);\n const originalEdges = edges;\n\n let dx = iEvent.dx;\n let dy = iEvent.dy;\n\n if (resizeOptions.preserveAspectRatio || resizeOptions.square) {\n // `resize.preserveAspectRatio` takes precedence over `resize.square`\n const startAspectRatio = resizeOptions.preserveAspectRatio\n ? interaction.resizeStartAspectRatio\n : 1;\n\n edges = interaction.prepared._linkedEdges;\n\n if ((originalEdges.left && originalEdges.bottom)\n || (originalEdges.right && originalEdges.top)) {\n dy = -dx / startAspectRatio;\n }\n else if (originalEdges.left || originalEdges.right ) { dy = dx / startAspectRatio; }\n else if (originalEdges.top || originalEdges.bottom) { dx = dy * startAspectRatio; }\n }\n\n // update the 'current' rect without modifications\n if (edges.top ) { current.top += dy; }\n if (edges.bottom) { current.bottom += dy; }\n if (edges.left ) { current.left += dx; }\n if (edges.right ) { current.right += dx; }\n\n if (invertible) {\n // if invertible, copy the current rect\n utils.extend(inverted, current);\n\n if (invert === 'reposition') {\n // swap edge values if necessary to keep width/height positive\n let swap;\n\n if (inverted.top > inverted.bottom) {\n swap = inverted.top;\n\n inverted.top = inverted.bottom;\n inverted.bottom = swap;\n }\n if (inverted.left > inverted.right) {\n swap = inverted.left;\n\n inverted.left = inverted.right;\n inverted.right = swap;\n }\n }\n }\n else {\n // if not invertible, restrict to minimum of 0x0 rect\n inverted.top = Math.min(current.top, start.bottom);\n inverted.bottom = Math.max(current.bottom, start.top);\n inverted.left = Math.min(current.left, start.right);\n inverted.right = Math.max(current.right, start.left);\n }\n\n inverted.width = inverted.right - inverted.left;\n inverted.height = inverted.bottom - inverted.top ;\n\n for (const edge in inverted) {\n delta[edge] = inverted[edge] - previous[edge];\n }\n\n iEvent.edges = interaction.prepared.edges;\n iEvent.rect = inverted;\n iEvent.deltaRect = delta;\n});\n\n/*\\\n * Interactable.resizable\n [ method ]\n *\n * Gets or sets whether resize actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of resize elements\n | var isResizeable = interact('input[type=text]').resizable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on resize events (object makes the Interactable resizable)\n = (object) This Interactable\n | interact(element).resizable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | edges: {\n | top : true, // Use pointer coords to check for resize.\n | left : false, // Disable resizing from left edge.\n | bottom: '.resize-s',// Resize if pointer target matches selector\n | right : handleEl // Resize if pointer target is the given Element\n | },\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height are adjusted at a 1:1 ratio.\n | square: false,\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height maintain the aspect ratio they had when resizing started.\n | preserveAspectRatio: false,\n |\n | // a value of 'none' will limit the resize rect to a minimum of 0x0\n | // 'negate' will allow the rect to have negative width/height\n | // 'reposition' will keep the width/height positive by swapping\n | // the top and bottom edges and/or swapping the left and right edges\n | invert: 'none' || 'negate' || 'reposition'\n |\n | // limit multiple resizes.\n | // See the explanation in the @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n \\*/\nInteractable.prototype.resizable = function (options) {\n if (utils.is.object(options)) {\n this.options.resize.enabled = options.enabled === false? false: true;\n this.setPerAction('resize', options);\n this.setOnEvents('resize', options);\n\n if (/^x$|^y$|^xy$/.test(options.axis)) {\n this.options.resize.axis = options.axis;\n }\n else if (options.axis === null) {\n this.options.resize.axis = defaultOptions.resize.axis;\n }\n\n if (utils.is.bool(options.preserveAspectRatio)) {\n this.options.resize.preserveAspectRatio = options.preserveAspectRatio;\n }\n else if (utils.is.bool(options.square)) {\n this.options.resize.square = options.square;\n }\n\n return this;\n }\n if (utils.is.bool(options)) {\n this.options.resize.enabled = options;\n\n if (!options) {\n this.onresizestart = this.onresizestart = this.onresizeend = null;\n }\n\n return this;\n }\n return this.options.resize;\n};\n\nfunction checkResizeEdge (name, value, page, element, interactableElement, rect, margin) {\n // false, '', undefined, null\n if (!value) { return false; }\n\n // true value, use pointer coords and element rect\n if (value === true) {\n // if dimensions are negative, \"switch\" edges\n const width = utils.is.number(rect.width )? rect.width : rect.right - rect.left;\n const height = utils.is.number(rect.height)? rect.height : rect.bottom - rect.top ;\n\n if (width < 0) {\n if (name === 'left' ) { name = 'right'; }\n else if (name === 'right') { name = 'left' ; }\n }\n if (height < 0) {\n if (name === 'top' ) { name = 'bottom'; }\n else if (name === 'bottom') { name = 'top' ; }\n }\n\n if (name === 'left' ) { return page.x < ((width >= 0? rect.left: rect.right ) + margin); }\n if (name === 'top' ) { return page.y < ((height >= 0? rect.top : rect.bottom) + margin); }\n\n if (name === 'right' ) { return page.x > ((width >= 0? rect.right : rect.left) - margin); }\n if (name === 'bottom') { return page.y > ((height >= 0? rect.bottom: rect.top ) - margin); }\n }\n\n // the remaining checks require an element\n if (!utils.is.element(element)) { return false; }\n\n return utils.is.element(value)\n // the value is an element to use as a resize handle\n ? value === element\n // otherwise check if element matches value as selector\n : utils.matchesUpTo(element, value, interactableElement);\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.resizeAxes = 'xy';\n});\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action }) {\n if (action !== 'resize' || !interaction.resizeAxes) { return; }\n\n const options = interaction.target.options;\n\n if (options.resize.square) {\n if (interaction.resizeAxes === 'y') {\n iEvent.dx = iEvent.dy;\n }\n else {\n iEvent.dy = iEvent.dx;\n }\n iEvent.axes = 'xy';\n }\n else {\n iEvent.axes = interaction.resizeAxes;\n\n if (interaction.resizeAxes === 'x') {\n iEvent.dy = 0;\n }\n else if (interaction.resizeAxes === 'y') {\n iEvent.dx = 0;\n }\n }\n});\n\nactions.resize = resize;\nactions.names.push('resize');\nutils.merge(Interactable.eventTypes, [\n 'resizestart',\n 'resizemove',\n 'resizeinertiastart',\n 'resizeinertiaresume',\n 'resizeend',\n]);\nactions.methodDict.resize = 'resizable';\n\ndefaultOptions.resize = resize.defaults;\n\nmodule.exports = resize;\n","const raf = require('./utils/raf');\nconst getWindow = require('./utils/window').getWindow;\nconst is = require('./utils/is');\nconst domUtils = require('./utils/domUtils');\nconst Interaction = require('./Interaction');\nconst defaultOptions = require('./defaultOptions');\n\nconst autoScroll = {\n defaults: {\n enabled : false,\n container: null, // the item that is scrolled (Window or HTMLElement)\n margin : 60,\n speed : 300, // the scroll speed in pixels per second\n },\n\n interaction: null,\n i: null, // the handle returned by window.setInterval\n x: 0, y: 0, // Direction each pulse is to scroll in\n\n isScrolling: false,\n prevTime: 0,\n\n start: function (interaction) {\n autoScroll.isScrolling = true;\n raf.cancel(autoScroll.i);\n\n autoScroll.interaction = interaction;\n autoScroll.prevTime = new Date().getTime();\n autoScroll.i = raf.request(autoScroll.scroll);\n },\n\n stop: function () {\n autoScroll.isScrolling = false;\n raf.cancel(autoScroll.i);\n },\n\n // scroll the window by the values in scroll.x/y\n scroll: function () {\n const options = autoScroll.interaction.target.options[autoScroll.interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(autoScroll.interaction.element);\n const now = new Date().getTime();\n // change in time in seconds\n const dt = (now - autoScroll.prevTime) / 1000;\n // displacement\n const s = options.speed * dt;\n\n if (s >= 1) {\n if (is.window(container)) {\n container.scrollBy(autoScroll.x * s, autoScroll.y * s);\n }\n else if (container) {\n container.scrollLeft += autoScroll.x * s;\n container.scrollTop += autoScroll.y * s;\n }\n\n autoScroll.prevTime = now;\n }\n\n if (autoScroll.isScrolling) {\n raf.cancel(autoScroll.i);\n autoScroll.i = raf.request(autoScroll.scroll);\n }\n },\n check: function (interactable, actionName) {\n const options = interactable.options;\n\n return options[actionName].autoScroll && options[actionName].autoScroll.enabled;\n },\n onInteractionMove: function ({ interaction, pointer }) {\n if (!(interaction.interacting()\n && autoScroll.check(interaction.target, interaction.prepared.name))) {\n return;\n }\n\n if (interaction.simulation) {\n autoScroll.x = autoScroll.y = 0;\n return;\n }\n\n let top;\n let right;\n let bottom;\n let left;\n\n const options = interaction.target.options[interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(interaction.element);\n\n if (is.window(container)) {\n left = pointer.clientX < autoScroll.margin;\n top = pointer.clientY < autoScroll.margin;\n right = pointer.clientX > container.innerWidth - autoScroll.margin;\n bottom = pointer.clientY > container.innerHeight - autoScroll.margin;\n }\n else {\n const rect = domUtils.getElementClientRect(container);\n\n left = pointer.clientX < rect.left + autoScroll.margin;\n top = pointer.clientY < rect.top + autoScroll.margin;\n right = pointer.clientX > rect.right - autoScroll.margin;\n bottom = pointer.clientY > rect.bottom - autoScroll.margin;\n }\n\n autoScroll.x = (right ? 1: left? -1: 0);\n autoScroll.y = (bottom? 1: top? -1: 0);\n\n if (!autoScroll.isScrolling) {\n // set the autoScroll properties to those of the target\n autoScroll.margin = options.margin;\n autoScroll.speed = options.speed;\n\n autoScroll.start(interaction);\n }\n },\n};\n\nInteraction.signals.on('stop-active', function () {\n autoScroll.stop();\n});\n\nInteraction.signals.on('action-move', autoScroll.onInteractionMove);\n\ndefaultOptions.perAction.autoScroll = autoScroll.defaults;\n\nmodule.exports = autoScroll;\n","const Interactable = require('../Interactable');\nconst actions = require('../actions/base');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.ignoreFrom\n [ method ]\n *\n * If the target of the `mousedown`, `pointerdown` or `touchstart`\n * event or any of it's parents match the given CSS selector or\n * Element, no drag/resize/gesture is started.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to not ignore any elements\n = (string | Element | object) The current ignoreFrom value or this Interactable\n **\n | interact(element, { ignoreFrom: document.getElementById('no-action') });\n | // or\n | interact(element).ignoreFrom('input, textarea, a');\n\\*/\nInteractable.prototype.ignoreFrom = function (newValue) {\n return this._backCompatOption('ignoreFrom', newValue);\n};\n\n/*\\\n * Interactable.allowFrom\n [ method ]\n *\n * A drag/resize/gesture is started only If the target of the\n * `mousedown`, `pointerdown` or `touchstart` event or any of it's\n * parents match the given CSS selector or Element.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to allow from any element\n = (string | Element | object) The current allowFrom value or this Interactable\n **\n | interact(element, { allowFrom: document.getElementById('drag-handle') });\n | // or\n | interact(element).allowFrom('.handle');\n\\*/\nInteractable.prototype.allowFrom = function (newValue) {\n return this._backCompatOption('allowFrom', newValue);\n};\n\nInteractable.prototype.testIgnore = function (ignoreFrom, interactableElement, element) {\n if (!ignoreFrom || !is.element(element)) { return false; }\n\n if (is.string(ignoreFrom)) {\n return domUtils.matchesUpTo(element, ignoreFrom, interactableElement);\n }\n else if (is.element(ignoreFrom)) {\n return domUtils.nodeContains(ignoreFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testAllow = function (allowFrom, interactableElement, element) {\n if (!allowFrom) { return true; }\n\n if (!is.element(element)) { return false; }\n\n if (is.string(allowFrom)) {\n return domUtils.matchesUpTo(element, allowFrom, interactableElement);\n }\n else if (is.element(allowFrom)) {\n return domUtils.nodeContains(allowFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testIgnoreAllow = function (options, interactableElement, eventTarget) {\n return (!this.testIgnore(options.ignoreFrom, interactableElement, eventTarget)\n && this.testAllow(options.allowFrom, interactableElement, eventTarget));\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (event.buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\n","const interact = require('../interact');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst actions = require('../actions/base');\nconst defaultOptions = require('../defaultOptions');\nconst browser = require('../utils/browser');\nconst scope = require('../scope');\nconst utils = require('../utils');\nconst signals = require('../utils/Signals').new();\n\nrequire('./InteractableMethods');\n\nconst autoStart = {\n signals,\n withinInteractionLimit,\n // Allow this many interactions to happen simultaneously\n maxInteractions: Infinity,\n defaults: {\n perAction: {\n manualStart: false,\n max: Infinity,\n maxPerElement: 1,\n allowFrom: null,\n ignoreFrom: null,\n },\n },\n setActionDefaults: function (action) {\n utils.extend(action.defaults, autoStart.defaults.perAction);\n },\n};\n\n// set cursor style on mousedown\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget }) {\n if (interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\n// set cursor style on mousemove\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget }) {\n if (!interaction.mouse\n || interaction.pointerIsDown\n || interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\nInteraction.signals.on('move', function (arg) {\n const { interaction, event } = arg;\n\n if (!interaction.pointerIsDown\n || interaction.interacting()\n || !interaction.pointerWasMoved\n || !interaction.prepared.name) {\n return;\n }\n\n signals.fire('before-start', arg);\n\n const target = interaction.target;\n\n if (interaction.prepared.name && target) {\n // check manualStart and interaction limit\n if (target.options[interaction.prepared.name].manualStart\n || !withinInteractionLimit(target, interaction.element, interaction.prepared)) {\n interaction.stop(event);\n }\n else {\n interaction.start(interaction.prepared, target, interaction.element);\n }\n }\n});\n\n// Check if the current target supports the action.\n// If so, return the validated action. Otherwise, return null\nfunction validateAction (action, interactable, element, eventTarget) {\n if (utils.is.object(action)\n && interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget)\n && interactable.options[action.name].enabled\n && withinInteractionLimit(interactable, element, action)) {\n return action;\n }\n\n return null;\n}\n\nfunction validateSelector (interaction, pointer, event, matches, matchElements, eventTarget) {\n for (let i = 0, len = matches.length; i < len; i++) {\n const match = matches[i];\n const matchElement = matchElements[i];\n const action = validateAction(match.getAction(pointer, event, interaction, matchElement),\n match,\n matchElement,\n eventTarget);\n\n if (action) {\n return {\n action,\n target: match,\n element: matchElement,\n };\n }\n }\n\n return {};\n}\n\nfunction getActionInfo (interaction, pointer, event, eventTarget) {\n let matches = [];\n let matchElements = [];\n\n let element = eventTarget;\n let action = null;\n\n function pushMatches (interactable, selector, context) {\n const elements = (browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined);\n\n if (utils.matchesSelector(element, selector, elements)) {\n\n matches.push(interactable);\n matchElements.push(element);\n }\n }\n\n while (utils.is.element(element)) {\n matches = [];\n matchElements = [];\n\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && (action = validateAction(elementInteractable.getAction(pointer, event, interaction, element, eventTarget),\n elementInteractable,\n element,\n eventTarget))\n && !elementInteractable.options[action.name].manualStart) {\n return {\n element,\n action,\n target: elementInteractable,\n };\n }\n else {\n scope.interactables.forEachSelector(pushMatches, element);\n\n const actionInfo = validateSelector(interaction, pointer, event, matches, matchElements, eventTarget);\n\n if (actionInfo.action\n && !actionInfo.target.options[actionInfo.action.name].manualStart) {\n return actionInfo;\n }\n }\n\n element = utils.parentNode(element);\n }\n\n return {};\n}\n\nfunction prepare (interaction, { action, target, element }) {\n action = action || {};\n\n if (interaction.target && interaction.target.options.styleCursor) {\n interaction.target._doc.documentElement.style.cursor = '';\n }\n\n interaction.target = target;\n interaction.element = element;\n utils.copyAction(interaction.prepared, action);\n\n if (target && target.options.styleCursor) {\n const cursor = action? actions[action.name].getCursor(action) : '';\n interaction.target._doc.documentElement.style.cursor = cursor;\n }\n\n signals.fire('prepared', { interaction: interaction });\n}\n\nInteraction.signals.on('stop', function ({ interaction }) {\n const target = interaction.target;\n\n if (target && target.options.styleCursor) {\n target._doc.documentElement.style.cursor = '';\n }\n});\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (utils.is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (utils.is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n const buttons = event.buttons || ({\n 0: 1,\n 1: 4,\n 3: 8,\n 4: 16,\n })[event.button];\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\nfunction withinInteractionLimit (interactable, element, action) {\n const options = interactable.options;\n const maxActions = options[action.name].max;\n const maxPerElement = options[action.name].maxPerElement;\n let activeInteractions = 0;\n let targetCount = 0;\n let targetElementCount = 0;\n\n // no actions if any of these values == 0\n if (!(maxActions && maxPerElement && autoStart.maxInteractions)) { return; }\n\n for (let i = 0, len = scope.interactions.length; i < len; i++) {\n const interaction = scope.interactions[i];\n const otherAction = interaction.prepared.name;\n\n if (!interaction.interacting()) { continue; }\n\n activeInteractions++;\n\n if (activeInteractions >= autoStart.maxInteractions) {\n return false;\n }\n\n if (interaction.target !== interactable) { continue; }\n\n targetCount += (otherAction === action.name)|0;\n\n if (targetCount >= maxActions) {\n return false;\n }\n\n if (interaction.element === element) {\n targetElementCount++;\n\n if (otherAction !== action.name || targetElementCount >= maxPerElement) {\n return false;\n }\n }\n }\n\n return autoStart.maxInteractions > 0;\n}\n\n/*\\\n * interact.maxInteractions\n [ method ]\n **\n * Returns or sets the maximum number of concurrent interactions allowed.\n * By default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables\n * and elements, you need to enable it in the draggable, resizable and\n * gesturable `'max'` and `'maxPerElement'` options.\n **\n - newValue (number) #optional Any number. newValue <= 0 means no interactions.\n\\*/\ninteract.maxInteractions = function (newValue) {\n if (utils.is.number(newValue)) {\n autoStart.maxInteractions = newValue;\n\n return this;\n }\n\n return autoStart.maxInteractions;\n};\n\nInteractable.settingsMethods.push('styleCursor');\nInteractable.settingsMethods.push('actionChecker');\nInteractable.settingsMethods.push('ignoreFrom');\nInteractable.settingsMethods.push('allowFrom');\n\ndefaultOptions.base.actionChecker = null;\ndefaultOptions.base.styleCursor = true;\n\nutils.extend(defaultOptions.perAction, autoStart.defaults.perAction);\n\nmodule.exports = autoStart;\n","const autoStart = require('./base');\nconst Interaction = require('../Interaction');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.delayTimer = null;\n});\n\nautoStart.signals.on('prepared', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.delayTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.target, interaction.element);\n }, delay);\n }\n});\n\nInteraction.signals.on('move', function ({ interaction, duplicate }) {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.delayTimer);\n }\n});\n\n// prevent regular down->move autoStart\nautoStart.signals.on('before-start', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.prepared.name = null;\n }\n});\n","const autoStart = require('./base');\nconst scope = require('../scope');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\n\nconst { matchesSelector, parentNode } = require('../utils/domUtils');\n\nautoStart.setActionDefaults(require('../actions/drag'));\n\nautoStart.signals.on('before-start', function ({ interaction, eventTarget, dx, dy }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // check if a drag is in the correct axis\n const absX = Math.abs(dx);\n const absY = Math.abs(dy);\n const options = interaction.target.options.drag;\n const startAxis = options.startAxis;\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy');\n\n interaction.prepared.axis = options.lockAxis === 'start'\n ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n : options.lockAxis;\n\n // if the movement isn't in the startAxis of the interactable\n if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) {\n // cancel the prepared action\n interaction.prepared.name = null;\n\n // then try to get a drag from another ineractable\n\n if (!interaction.prepared.name) {\n\n let element = eventTarget;\n\n const getDraggable = function (interactable, selector, context) {\n const elements = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n if (interactable === interaction.target) { return; }\n\n if (!options.manualStart\n && !interactable.testIgnoreAllow(options, element, eventTarget)\n && matchesSelector(element, selector, elements)) {\n\n const action = interactable.getAction(interaction.downPointer,\n interaction.downEvent,\n interaction,\n element);\n\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, interactable)\n && autoStart.validateAction(action, interactable, element, eventTarget)) {\n\n return interactable;\n }\n }\n };\n\n let action = null;\n\n // check all interactables\n while (is.element(element)) {\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && elementInteractable !== interaction.target\n && !elementInteractable.options.drag.manualStart) {\n\n action = elementInteractable.getAction(interaction.downPointer, interaction.downEvent, interaction, element);\n }\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, elementInteractable)) {\n\n interaction.prepared.name = 'drag';\n interaction.target = elementInteractable;\n interaction.element = element;\n break;\n }\n\n const selectorInteractable = scope.interactables.forEachSelector(getDraggable, element);\n\n if (selectorInteractable) {\n interaction.prepared.name = 'drag';\n interaction.target = selectorInteractable;\n interaction.element = element;\n break;\n }\n\n element = parentNode(element);\n }\n }\n }\n});\n\nfunction checkStartAxis (startAxis, interactable) {\n if (!interactable) { return false; }\n\n const thisAxis = interactable.options.drag.startAxis;\n\n return (startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis);\n}\n","require('./base').setActionDefaults(require('../actions/gesture'));\n","require('./base').setActionDefaults(require('../actions/resize'));\n","module.exports = {\n base: {\n accept : null,\n preventDefault: 'auto',\n deltaSource : 'page',\n },\n\n perAction: {\n origin: { x: 0, y: 0 },\n\n // only allow left button by default\n // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n mouseButtons: 1,\n\n inertia: {\n enabled : false,\n resistance : 10, // the lambda in exponential decay\n minSpeed : 100, // target speed must be above this for inertia to start\n endSpeed : 10, // the speed at which inertia is slow enough to stop\n allowResume : true, // allow resuming an action in inertia phase\n smoothEndDuration: 300, // animate to snap/restrict endOnly if there's no inertia\n },\n },\n};\n","/* browser entry point */\n\n// Legacy browser support\nrequire('./legacyBrowsers');\n\n// inertia\nrequire('./inertia');\n\n// modifiers\nrequire('./modifiers/snap');\nrequire('./modifiers/restrict');\n\n// pointerEvents\nrequire('./pointerEvents/base');\nrequire('./pointerEvents/holdRepeat');\nrequire('./pointerEvents/interactableTargets');\n\n// delay\nrequire('./autoStart/delay');\n\n// actions\nrequire('./actions/gesture');\nrequire('./actions/resize');\nrequire('./actions/drag');\nrequire('./actions/drop');\n\n// load these modifiers after resize is loaded\nrequire('./modifiers/snapSize');\nrequire('./modifiers/restrictEdges');\nrequire('./modifiers/restrictSize');\n\n// autoStart actions\nrequire('./autoStart/gesture');\nrequire('./autoStart/resize');\nrequire('./autoStart/drag');\n\n// Interactable preventDefault setting\nrequire('./interactablePreventDefault.js');\n\n// autoScroll\nrequire('./autoScroll');\n\n// export interact\nmodule.exports = require('./interact');\n","const InteractEvent = require('./InteractEvent');\nconst Interaction = require('./Interaction');\nconst modifiers = require('./modifiers');\nconst utils = require('./utils');\nconst animationFrame = require('./utils/raf');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.inertiaStatus = {\n active : false,\n smoothEnd : false,\n allowResume: false,\n\n startEvent: null,\n upCoords : {},\n\n xe: 0, ye: 0,\n sx: 0, sy: 0,\n\n t0: 0,\n vx0: 0, vys: 0,\n duration: 0,\n\n lambda_v0: 0,\n one_ve_v0: 0,\n i : null,\n };\n\n interaction.boundInertiaFrame = () => inertiaFrame .apply(interaction);\n interaction.boundSmoothEndFrame = () => smoothEndFrame.apply(interaction);\n});\n\nInteraction.signals.on('down', function ({ interaction, event, pointer, eventTarget }) {\n const status = interaction.inertiaStatus;\n\n // Check if the down event hits the current inertia target\n if (status.active) {\n let element = eventTarget;\n\n // climb up the DOM tree from the event target\n while (utils.is.element(element)) {\n\n // if interaction element is the current inertia target element\n if (element === interaction.element) {\n // stop inertia\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n\n // update pointers to the down event's coordinates\n interaction.updatePointer(pointer);\n utils.setCoords(interaction.curCoords, interaction.pointers);\n\n // fire appropriate signals\n const signalArg = { interaction };\n Interaction.signals.fire('before-action-move', signalArg);\n Interaction.signals.fire('action-resume' , signalArg);\n\n // fire a reume event\n const resumeEvent = new InteractEvent(interaction,\n event,\n interaction.prepared.name,\n 'inertiaresume',\n interaction.element);\n\n interaction.target.fire(resumeEvent);\n interaction.prevEvent = resumeEvent;\n modifiers.resetStatuses(interaction.modifierStatuses);\n\n utils.copyCoords(interaction.prevCoords, interaction.curCoords);\n break;\n }\n\n element = utils.parentNode(element);\n }\n }\n});\n\nInteraction.signals.on('up', function ({ interaction, event }) {\n const status = interaction.inertiaStatus;\n\n if (!interaction.interacting() || status.active) { return; }\n\n const target = interaction.target;\n const options = target && target.options;\n const inertiaOptions = options && interaction.prepared.name && options[interaction.prepared.name].inertia;\n\n const now = new Date().getTime();\n const statuses = {};\n const page = utils.extend({}, interaction.curCoords.page);\n const pointerSpeed = interaction.pointerDelta.client.speed;\n\n let smoothEnd = false;\n let modifierResult;\n\n // check if inertia should be started\n const inertiaPossible = (inertiaOptions && inertiaOptions.enabled\n && interaction.prepared.name !== 'gesture'\n && event !== status.startEvent);\n\n const inertia = (inertiaPossible\n && (now - interaction.curCoords.timeStamp) < 50\n && pointerSpeed > inertiaOptions.minSpeed\n && pointerSpeed > inertiaOptions.endSpeed);\n\n const modifierArg = {\n interaction,\n pageCoords: page,\n statuses,\n preEnd: true,\n requireEndOnly: true,\n };\n\n // smoothEnd\n if (inertiaPossible && !inertia) {\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n if (modifierResult.shouldMove && modifierResult.locked) {\n smoothEnd = true;\n }\n }\n\n if (!(inertia || smoothEnd)) { return; }\n\n utils.copyCoords(status.upCoords, interaction.curCoords);\n\n interaction.pointers[0] = status.startEvent =\n new InteractEvent(interaction, event, interaction.prepared.name, 'inertiastart', interaction.element);\n\n status.t0 = now;\n\n status.active = true;\n status.allowResume = inertiaOptions.allowResume;\n interaction.simulation = status;\n\n target.fire(status.startEvent);\n\n if (inertia) {\n status.vx0 = interaction.pointerDelta.client.vx;\n status.vy0 = interaction.pointerDelta.client.vy;\n status.v0 = pointerSpeed;\n\n calcInertia(interaction, status);\n\n utils.extend(page, interaction.curCoords.page);\n\n page.x += status.xe;\n page.y += status.ye;\n\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n status.modifiedXe += modifierResult.dx;\n status.modifiedYe += modifierResult.dy;\n\n status.i = animationFrame.request(interaction.boundInertiaFrame);\n }\n else {\n status.smoothEnd = true;\n status.xe = modifierResult.dx;\n status.ye = modifierResult.dy;\n\n status.sx = status.sy = 0;\n\n status.i = animationFrame.request(interaction.boundSmoothEndFrame);\n }\n});\n\nInteraction.signals.on('stop-active', function ({ interaction }) {\n const status = interaction.inertiaStatus;\n\n if (status.active) {\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n }\n});\n\nfunction calcInertia (interaction, status) {\n const inertiaOptions = interaction.target.options[interaction.prepared.name].inertia;\n const lambda = inertiaOptions.resistance;\n const inertiaDur = -Math.log(inertiaOptions.endSpeed / status.v0) / lambda;\n\n status.x0 = interaction.prevEvent.pageX;\n status.y0 = interaction.prevEvent.pageY;\n status.t0 = status.startEvent.timeStamp / 1000;\n status.sx = status.sy = 0;\n\n status.modifiedXe = status.xe = (status.vx0 - inertiaDur) / lambda;\n status.modifiedYe = status.ye = (status.vy0 - inertiaDur) / lambda;\n status.te = inertiaDur;\n\n status.lambda_v0 = lambda / status.v0;\n status.one_ve_v0 = 1 - inertiaOptions.endSpeed / status.v0;\n}\n\nfunction inertiaFrame () {\n updateInertiaCoords(this);\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n\n const status = this.inertiaStatus;\n const options = this.target.options[this.prepared.name].inertia;\n const lambda = options.resistance;\n const t = new Date().getTime() / 1000 - status.t0;\n\n if (t < status.te) {\n\n const progress = 1 - (Math.exp(-lambda * t) - status.lambda_v0) / status.one_ve_v0;\n\n if (status.modifiedXe === status.xe && status.modifiedYe === status.ye) {\n status.sx = status.xe * progress;\n status.sy = status.ye * progress;\n }\n else {\n const quadPoint = utils.getQuadraticCurvePoint(0, 0,\n status.xe,\n status.ye,\n status.modifiedXe,\n status.modifiedYe,\n progress);\n\n status.sx = quadPoint.x;\n status.sy = quadPoint.y;\n }\n\n this.doMove();\n\n status.i = animationFrame.request(this.boundInertiaFrame);\n }\n else {\n status.sx = status.modifiedXe;\n status.sy = status.modifiedYe;\n\n this.doMove();\n this.end(status.startEvent);\n status.active = false;\n this.simulation = null;\n }\n\n utils.copyCoords(this.prevCoords, this.curCoords);\n}\n\nfunction smoothEndFrame () {\n updateInertiaCoords(this);\n\n const status = this.inertiaStatus;\n const t = new Date().getTime() - status.t0;\n const duration = this.target.options[this.prepared.name].inertia.smoothEndDuration;\n\n if (t < duration) {\n status.sx = utils.easeOutQuad(t, 0, status.xe, duration);\n status.sy = utils.easeOutQuad(t, 0, status.ye, duration);\n\n this.pointerMove(status.startEvent, status.startEvent);\n\n status.i = animationFrame.request(this.boundSmoothEndFrame);\n }\n else {\n status.sx = status.xe;\n status.sy = status.ye;\n\n this.pointerMove(status.startEvent, status.startEvent);\n this.end(status.startEvent);\n\n status.smoothEnd =\n status.active = false;\n this.simulation = null;\n }\n}\n\nfunction updateInertiaCoords (interaction) {\n const status = interaction.inertiaStatus;\n\n // return if inertia isn't running\n if (!status.active) { return; }\n\n const pageUp = status.upCoords.page;\n const clientUp = status.upCoords.client;\n\n utils.setCoords(interaction.curCoords, [ {\n pageX : pageUp.x + status.sx,\n pageY : pageUp.y + status.sy,\n clientX: clientUp.x + status.sx,\n clientY: clientUp.y + status.sy,\n } ]);\n}\n","const browser = require('./utils/browser');\nconst events = require('./utils/events');\nconst utils = require('./utils');\nconst scope = require('./scope');\nconst Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\n\nconst globalEvents = {};\n\n/*\\\n * interact\n [ method ]\n *\n * The methods of this variable can be used to set elements as\n * interactables and also to change various default settings.\n *\n * Calling it as a function and passing an element or a valid CSS selector\n * string returns an Interactable object which has various methods to\n * configure it.\n *\n - element (Element | string) The HTML or SVG Element to interact with or CSS selector\n = (object) An @Interactable\n *\n > Usage\n | interact('#draggable').draggable(true);\n |\n | var rectables = interact('rect');\n | rectables\n | .gesturable(true)\n | .on('gesturemove', function (event) {\n | // ...\n | });\n\\*/\nfunction interact (element, options) {\n let interactable = scope.interactables.get(element, options);\n\n if (!interactable) {\n interactable = new Interactable(element, options);\n interactable.events.global = globalEvents;\n }\n\n return interactable;\n}\n\n/*\\\n * interact.isSet\n [ method ]\n *\n * Check if an element has been set\n - element (Element) The Element being searched for\n = (boolean) Indicates if the element or CSS selector was previously passed to interact\n\\*/\ninteract.isSet = function (element, options) {\n return scope.interactables.indexOfElement(element, options && options.context) !== -1;\n};\n\n/*\\\n * interact.on\n [ method ]\n *\n * Adds a global listener for an InteractEvent or adds a DOM event to\n * `document`\n *\n - type (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) interact\n\\*/\ninteract.on = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.on(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.on(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n // if it is an InteractEvent type, add listener to globalEvents\n if (utils.contains(Interactable.eventTypes, type)) {\n // if this type of event was never bound\n if (!globalEvents[type]) {\n globalEvents[type] = [listener];\n }\n else {\n globalEvents[type].push(listener);\n }\n }\n // If non InteractEvent type, addEventListener to document\n else {\n events.add(scope.document, type, listener, { options });\n }\n\n return interact;\n};\n\n/*\\\n * interact.off\n [ method ]\n *\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n - type (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) interact\n \\*/\ninteract.off = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.off(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.off(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n if (!utils.contains(Interactable.eventTypes, type)) {\n events.remove(scope.document, type, listener, options);\n }\n else {\n let index;\n\n if (type in globalEvents\n && (index = utils.indexOf(globalEvents[type], listener)) !== -1) {\n globalEvents[type].splice(index, 1);\n }\n }\n\n return interact;\n};\n\n/*\\\n * interact.debug\n [ method ]\n *\n * Returns an object which exposes internal data\n = (object) An object with properties that outline the current state and expose internal functions and variables\n\\*/\ninteract.debug = function () {\n return scope;\n};\n\n// expose the functions used to calculate multi-touch properties\ninteract.getPointerAverage = utils.pointerAverage;\ninteract.getTouchBBox = utils.touchBBox;\ninteract.getTouchDistance = utils.touchDistance;\ninteract.getTouchAngle = utils.touchAngle;\n\ninteract.getElementRect = utils.getElementRect;\ninteract.getElementClientRect = utils.getElementClientRect;\ninteract.matchesSelector = utils.matchesSelector;\ninteract.closest = utils.closest;\n\n/*\\\n * interact.supportsTouch\n [ method ]\n *\n = (boolean) Whether or not the browser supports touch input\n\\*/\ninteract.supportsTouch = function () {\n return browser.supportsTouch;\n};\n\n/*\\\n * interact.supportsPointerEvent\n [ method ]\n *\n = (boolean) Whether or not the browser supports PointerEvents\n\\*/\ninteract.supportsPointerEvent = function () {\n return browser.supportsPointerEvent;\n};\n\n/*\\\n * interact.stop\n [ method ]\n *\n * Cancels all interactions (end events are not fired)\n *\n - event (Event) An event on which to call preventDefault()\n = (object) interact\n\\*/\ninteract.stop = function (event) {\n for (let i = scope.interactions.length - 1; i >= 0; i--) {\n scope.interactions[i].stop(event);\n }\n\n return interact;\n};\n\n/*\\\n * interact.pointerMoveTolerance\n [ method ]\n * Returns or sets the distance the pointer must be moved before an action\n * sequence occurs. This also affects tolerance for tap events.\n *\n - newValue (number) #optional The movement from the start position must be greater than this value\n = (number | Interactable) The current setting or interact\n\\*/\ninteract.pointerMoveTolerance = function (newValue) {\n if (utils.is.number(newValue)) {\n Interaction.pointerMoveTolerance = newValue;\n\n return this;\n }\n\n return Interaction.pointerMoveTolerance;\n};\n\ninteract.addDocument = scope.addDocument;\ninteract.removeDocument = scope.removeDocument;\n\nscope.interact = interact;\n\nmodule.exports = interact;\n","const Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\nconst scope = require('./scope');\nconst is = require('./utils/is');\nconst events = require('./utils/events');\n\nconst { nodeContains, matchesSelector } = require('./utils/domUtils');\n\n/*\\\n * Interactable.preventDefault\n [ method ]\n *\n * Returns or sets whether to prevent the browser's default behaviour\n * in response to pointer events. Can be set to:\n * - `'always'` to always prevent\n * - `'never'` to never prevent\n * - `'auto'` to let interact.js try to determine what would be best\n *\n - newValue (string) #optional `true`, `false` or `'auto'`\n = (string | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.preventDefault = function (newValue) {\n if (/^(always|never|auto)$/.test(newValue)) {\n this.options.preventDefault = newValue;\n return this;\n }\n\n if (is.bool(newValue)) {\n this.options.preventDefault = newValue? 'always' : 'never';\n return this;\n }\n\n return this.options.preventDefault;\n};\n\nInteractable.prototype.checkAndPreventDefault = function (event) {\n const setting = this.options.preventDefault;\n\n if (setting === 'never') { return; }\n\n if (setting === 'always') {\n event.preventDefault();\n return;\n }\n\n // setting === 'auto'\n\n // don't preventDefault if the browser supports passiveEvents\n // CSS touch-action and user-selecct should be used instead\n if (events.supportsOptions) {\n return;\n }\n\n // don't preventDefault of pointerdown events\n if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) {\n return;\n }\n\n // don't preventDefault on editable elements\n if (is.element(event.target)\n && matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) {\n return;\n }\n\n event.preventDefault();\n};\n\nfunction onInteractionEvent ({ interaction, event }) {\n if (interaction.target) {\n interaction.target.checkAndPreventDefault(event);\n }\n}\n\nfor (const eventSignal of ['down', 'move', 'up', 'cancel']) {\n Interaction.signals.on(eventSignal, onInteractionEvent);\n}\n\n// prevent native HTML5 drag on interact.js target elements\nInteraction.docEvents.dragstart = function preventNativeDrag (event) {\n for (const interaction of scope.interactions) {\n\n if (interaction.element\n && (interaction.element === event.target\n || nodeContains(interaction.element, event.target))) {\n\n interaction.target.checkAndPreventDefault(event);\n return;\n }\n }\n};\n","const scope = require('./scope');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst iFinder = require('./utils/interactionFinder');\nconst pointerEvents = require('./pointerEvents/base');\n\nconst { window } = require('./utils/window');\n\nconst toString = Object.prototype.toString;\n\nif (!window.Array.isArray) {\n window.Array.isArray = function (obj) {\n return toString.call(obj) === '[object Array]';\n };\n}\n\nif (!String.prototype.trim) {\n String.prototype.trim = function () {\n return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n };\n}\n\n// http://www.quirksmode.org/dom/events/click.html\n// >Events leading to dblclick\n//\n// IE8 doesn't fire down event before dblclick.\n// This workaround tries to fire a tap and doubletap after dblclick\nfunction onIE8Dblclick (event) {\n const eventTarget = event.target;\n const interaction = iFinder.search(event, event.type, eventTarget);\n\n if (!interaction) { return; }\n\n if (interaction.prevTap\n && event.clientX === interaction.prevTap.clientX\n && event.clientY === interaction.prevTap.clientY\n && eventTarget === interaction.prevTap.target) {\n\n interaction.downTargets[0] = eventTarget;\n interaction.downTimes [0] = new Date().getTime();\n\n pointerEvents.fire({\n interaction,\n event,\n eventTarget,\n pointer: event,\n type: 'tap',\n });\n }\n}\n\nif (browser.isIE8) {\n const selectFix = function (event) {\n for (const interaction of scope.interactions) {\n if (interaction.interacting()) {\n interaction.target.checkAndPreventDefault(event);\n }\n }\n };\n\n const onDocIE8 = function onDocIE8 ({ doc, win }, signalName) {\n const eventMethod = signalName.indexOf('listen') === 0\n ? events.add : events.remove;\n\n // For IE's lack of Event#preventDefault\n eventMethod(doc, 'selectstart', selectFix);\n\n if (pointerEvents) {\n eventMethod(doc, 'dblclick', onIE8Dblclick);\n }\n };\n\n scope.signals.on('add-document' , onDocIE8);\n scope.signals.on('remove-document', onDocIE8);\n}\n\nmodule.exports = null;\n","const InteractEvent = require('../InteractEvent');\nconst Interaction = require('../Interaction');\nconst extend = require('../utils/extend');\n\nconst modifiers = {\n names: [],\n\n setOffsets: function (arg) {\n const { interaction, pageCoords: page } = arg;\n const { target, element, startOffset } = interaction;\n const rect = target.getRect(element);\n\n if (rect) {\n startOffset.left = page.x - rect.left;\n startOffset.top = page.y - rect.top;\n\n startOffset.right = rect.right - page.x;\n startOffset.bottom = rect.bottom - page.y;\n\n if (!('width' in rect)) { rect.width = rect.right - rect.left; }\n if (!('height' in rect)) { rect.height = rect.bottom - rect.top ; }\n }\n else {\n startOffset.left = startOffset.top = startOffset.right = startOffset.bottom = 0;\n }\n\n arg.rect = rect;\n arg.interactable = target;\n arg.element = element;\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n\n arg.options = target.options[interaction.prepared.name][modifierName];\n\n if (!arg.options) {\n continue;\n }\n\n interaction.modifierOffsets[modifierName] = modifiers[modifierName].setOffset(arg);\n }\n },\n\n setAll: function (arg) {\n const { interaction, statuses, preEnd, requireEndOnly } = arg;\n const coords = extend({}, arg.pageCoords);\n const result = {\n dx: 0,\n dy: 0,\n changed: false,\n locked: false,\n shouldMove: true,\n };\n\n for (const modifierName of modifiers.names) {\n const modifier = modifiers[modifierName];\n const options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!shouldDo(options, preEnd, requireEndOnly)) { continue; }\n\n arg.status = arg.status = statuses[modifierName];\n arg.options = options;\n arg.offset = arg.interaction.modifierOffsets[modifierName];\n\n modifier.set(arg);\n\n if (arg.status.locked) {\n coords.x += arg.status.dx;\n coords.y += arg.status.dy;\n\n result.dx += arg.status.dx;\n result.dy += arg.status.dy;\n\n result.locked = true;\n }\n }\n\n // a move should be fired if:\n // - there are no modifiers enabled,\n // - no modifiers are \"locked\" i.e. have changed the pointer's coordinates, or\n // - the locked coords have changed since the last pointer move\n result.shouldMove = !arg.status || !result.locked || arg.status.changed;\n\n return result;\n },\n\n resetStatuses: function (statuses) {\n for (const modifierName of modifiers.names) {\n const status = statuses[modifierName] || {};\n\n status.dx = status.dy = 0;\n status.modifiedX = status.modifiedY = NaN;\n status.locked = false;\n status.changed = true;\n\n statuses[modifierName] = status;\n }\n\n return statuses;\n },\n\n start: function ({ interaction }, signalName) {\n const arg = {\n interaction,\n pageCoords: (signalName === 'action-resume' ?\n interaction.curCoords : interaction.startCoords).page,\n startOffset: interaction.startOffset,\n statuses: interaction.modifierStatuses,\n preEnd: false,\n requireEndOnly: false,\n };\n\n modifiers.setOffsets(arg);\n modifiers.resetStatuses(arg.statuses);\n\n arg.pageCoords = extend({}, interaction.startCoords.page);\n interaction.modifierResult = modifiers.setAll(arg);\n },\n};\n\nInteraction.signals.on('new', function (interaction) {\n interaction.startOffset = { left: 0, right: 0, top: 0, bottom: 0 };\n interaction.modifierOffsets = {};\n interaction.modifierStatuses = modifiers.resetStatuses({});\n interaction.modifierResult = null;\n});\n\nInteraction.signals.on('action-start' , modifiers.start);\nInteraction.signals.on('action-resume', modifiers.start);\n\nInteraction.signals.on('before-action-move', function ({ interaction, preEnd, interactingBeforeMove }) {\n const modifierResult = modifiers.setAll({\n interaction,\n preEnd,\n pageCoords: interaction.curCoords.page,\n statuses: interaction.modifierStatuses,\n requireEndOnly: false,\n });\n\n // don't fire an action move if a modifier would keep the event in the same\n // cordinates as before\n if (!modifierResult.shouldMove && interactingBeforeMove) {\n interaction._dontFireMove = true;\n }\n\n interaction.modifierResult = modifierResult;\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n for (let i = 0; i < modifiers.names.length; i++) {\n const options = interaction.target.options[interaction.prepared.name][modifiers.names[i]];\n\n // if the endOnly option is true for any modifier\n if (shouldDo(options, true, true)) {\n // fire a move event at the modified coordinates\n interaction.doMove({ event, preEnd: true });\n break;\n }\n }\n});\n\nInteractEvent.signals.on('set-xy', function (arg) {\n const { iEvent, interaction } = arg;\n const modifierArg = extend({}, arg);\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n modifierArg.options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!modifierArg.options) {\n continue;\n }\n\n const modifier = modifiers[modifierName];\n\n modifierArg.status = interaction.modifierStatuses[modifierName];\n\n iEvent[modifierName] = modifier.modifyCoords(modifierArg);\n }\n});\n\nfunction shouldDo (options, preEnd, requireEndOnly) {\n return (options && options.enabled\n && (preEnd || !options.endOnly)\n && (!requireEndOnly || options.endOnly));\n}\n\nmodule.exports = modifiers;\n","const modifiers = require('./index');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst restrict = {\n defaults: {\n enabled : false,\n endOnly : false,\n restriction: null,\n elementRect: null,\n },\n\n setOffset: function ({ rect, startOffset, options }) {\n const elementRect = options && options.elementRect;\n const offset = {};\n\n if (rect && elementRect) {\n offset.left = startOffset.left - (rect.width * elementRect.left);\n offset.top = startOffset.top - (rect.height * elementRect.top);\n\n offset.right = startOffset.right - (rect.width * (1 - elementRect.right));\n offset.bottom = startOffset.bottom - (rect.height * (1 - elementRect.bottom));\n }\n else {\n offset.left = offset.top = offset.right = offset.bottom = 0;\n }\n\n return offset;\n },\n\n set: function ({ pageCoords, interaction, status, options }) {\n if (!options) { return status; }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n\n const restriction = getRestrictionRect(options.restriction, interaction, page);\n\n if (!restriction) { return status; }\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n const rect = restriction;\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n const offset = interaction.modifierOffsets.restrict;\n\n // object is assumed to have\n // x, y, width, height or\n // left, top, right, bottom\n if ('x' in restriction && 'y' in restriction) {\n modifiedX = Math.max(Math.min(rect.x + rect.width - offset.right , page.x), rect.x + offset.left);\n modifiedY = Math.max(Math.min(rect.y + rect.height - offset.bottom, page.y), rect.y + offset.top );\n }\n else {\n modifiedX = Math.max(Math.min(rect.right - offset.right , page.x), rect.left + offset.left);\n modifiedY = Math.max(Math.min(rect.bottom - offset.bottom, page.y), rect.top + offset.top );\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const elementRect = options && options.elementRect;\n\n if (options && options.enabled\n && !(phase === 'start' && elementRect && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n getRestrictionRect,\n};\n\nfunction getRestrictionRect (value, interaction, page) {\n if (utils.is.function(value)) {\n return utils.resolveRectLike(value, interaction.target, interaction.element, [page.x, page.y, interaction]);\n } else {\n return utils.resolveRectLike(value, interaction.target, interaction.element);\n }\n}\n\nmodifiers.restrict = restrict;\nmodifiers.names.push('restrict');\n\ndefaultOptions.perAction.restrict = restrict.defaults;\n\nmodule.exports = restrict;\n","// This module adds the options.resize.restrictEdges setting which sets min and\n// max for the top, left, bottom and right edges of the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictEdges: {\n// inner: { top: 200, left: 200, right: 400, bottom: 400 },\n// outer: { top: 0, left: 0, right: 600, bottom: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst { getRestrictionRect } = require('./restrict');\n\nconst noInner = { top: +Infinity, left: +Infinity, bottom: -Infinity, right: -Infinity };\nconst noOuter = { top: -Infinity, left: -Infinity, bottom: +Infinity, right: +Infinity };\n\nconst restrictEdges = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n offset: null,\n },\n\n setOffset: function ({ interaction, startOffset, options }) {\n if (!options) {\n return utils.extend({}, startOffset);\n }\n\n const offset = getRestrictionRect(options.offset, interaction, interaction.startCoords.page);\n\n if (offset) {\n return {\n top: startOffset.top + offset.y,\n left: startOffset.left + offset.x,\n bottom: startOffset.bottom + offset.y,\n right: startOffset.right + offset.x,\n };\n }\n\n return startOffset;\n },\n\n set: function ({ pageCoords, interaction, status, offset, options }) {\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n const inner = rectUtils.xywhToTlbr(getRestrictionRect(options.inner, interaction, page)) || noInner;\n const outer = rectUtils.xywhToTlbr(getRestrictionRect(options.outer, interaction, page)) || noOuter;\n\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n if (edges.top) {\n modifiedY = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top);\n }\n else if (edges.bottom) {\n modifiedY = Math.max(Math.min(outer.bottom - offset.bottom, page.y), inner.bottom - offset.bottom);\n }\n if (edges.left) {\n modifiedX = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left);\n }\n else if (edges.right) {\n modifiedX = Math.max(Math.min(outer.right - offset.right, page.x), inner.right - offset.right);\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n if (options && options.enabled\n && !(phase === 'start' && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n noInner,\n noOuter,\n getRestrictionRect,\n};\n\nmodifiers.restrictEdges = restrictEdges;\nmodifiers.names.push('restrictEdges');\n\ndefaultOptions.perAction.restrictEdges = restrictEdges.defaults;\nresize.defaults.restrictEdges = restrictEdges.defaults;\n\nmodule.exports = restrictEdges;\n","// This module adds the options.resize.restrictSize setting which sets min and\n// max width and height for the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictSize: {\n// min: { width: -600, height: -600 },\n// max: { width: 600, height: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst restrictEdges = require('./restrictEdges');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst noMin = { width: -Infinity, height: -Infinity };\nconst noMax = { width: +Infinity, height: +Infinity };\n\nconst restrictSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n },\n\n setOffset: function ({ interaction }) {\n return interaction.startOffset;\n },\n\n set: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const rect = rectUtils.xywhToTlbr(interaction.resizeRects.inverted);\n\n const minSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.min, interaction)) || noMin;\n const maxSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.max, interaction)) || noMax;\n\n arg.options = {\n enabled: options.enabled,\n endOnly: options.endOnly,\n inner: utils.extend({}, restrictEdges.noInner),\n outer: utils.extend({}, restrictEdges.noOuter),\n };\n\n if (edges.top) {\n arg.options.inner.top = rect.bottom - minSize.height;\n arg.options.outer.top = rect.bottom - maxSize.height;\n }\n else if (edges.bottom) {\n arg.options.inner.bottom = rect.top + minSize.height;\n arg.options.outer.bottom = rect.top + maxSize.height;\n }\n if (edges.left) {\n arg.options.inner.left = rect.right - minSize.width;\n arg.options.outer.left = rect.right - maxSize.width;\n }\n else if (edges.right) {\n arg.options.inner.right = rect.left + minSize.width;\n arg.options.outer.right = rect.left + maxSize.width;\n }\n\n restrictEdges.set(arg);\n },\n\n modifyCoords: restrictEdges.modifyCoords,\n};\n\nmodifiers.restrictSize = restrictSize;\nmodifiers.names.push('restrictSize');\n\ndefaultOptions.perAction.restrictSize = restrictSize.defaults;\nresize.defaults.restrictSize = restrictSize.defaults;\n\nmodule.exports = restrictSize;\n","const modifiers = require('./index');\nconst interact = require('../interact');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst snap = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n\n relativePoints: null,\n },\n\n setOffset: function ({ interaction, interactable, element, rect, startOffset, options }) {\n const offsets = [];\n const optionsOrigin = utils.rectToXY(utils.resolveRectLike(options.origin));\n const origin = optionsOrigin || utils.getOriginXY(interactable, element, interaction.prepared.name);\n options = options || interactable.options[interaction.prepared.name].snap || {};\n\n let snapOffset;\n\n if (options.offset === 'startCoords') {\n snapOffset = {\n x: interaction.startCoords.page.x - origin.x,\n y: interaction.startCoords.page.y - origin.y,\n };\n }\n else {\n const offsetRect = utils.resolveRectLike(options.offset, interactable, element, [interaction]);\n\n snapOffset = utils.rectToXY(offsetRect) || { x: 0, y: 0 };\n }\n\n if (rect && options.relativePoints && options.relativePoints.length) {\n for (const { x: relativeX, y: relativeY } of options.relativePoints) {\n offsets.push({\n x: startOffset.left - (rect.width * relativeX) + snapOffset.x,\n y: startOffset.top - (rect.height * relativeY) + snapOffset.y,\n });\n }\n }\n else {\n offsets.push(snapOffset);\n }\n\n return offsets;\n },\n\n set: function ({ interaction, pageCoords, status, options, offset: offsets }) {\n const targets = [];\n let target;\n let page;\n let i;\n\n if (status.useStatusXY) {\n page = { x: status.x, y: status.y };\n }\n else {\n const origin = utils.getOriginXY(interaction.target, interaction.element, interaction.prepared.name);\n\n page = utils.extend({}, pageCoords);\n\n page.x -= origin.x;\n page.y -= origin.y;\n }\n\n status.realX = page.x;\n status.realY = page.y;\n\n let len = options.targets? options.targets.length : 0;\n\n for (const { x: offsetX, y: offsetY } of offsets) {\n const relativeX = page.x - offsetX;\n const relativeY = page.y - offsetY;\n\n for (const snapTarget of options.targets) {\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n targets.push({\n x: utils.is.number(target.x) ? (target.x + offsetX) : relativeX,\n y: utils.is.number(target.y) ? (target.y + offsetY) : relativeY,\n\n range: utils.is.number(target.range)? target.range: options.range,\n });\n }\n }\n\n const closest = {\n target: null,\n inRange: false,\n distance: 0,\n range: 0,\n dx: 0,\n dy: 0,\n };\n\n for (i = 0, len = targets.length; i < len; i++) {\n target = targets[i];\n\n const range = target.range;\n const dx = target.x - page.x;\n const dy = target.y - page.y;\n const distance = utils.hypot(dx, dy);\n let inRange = distance <= range;\n\n // Infinite targets count as being out of range\n // compared to non infinite ones that are in range\n if (range === Infinity && closest.inRange && closest.range !== Infinity) {\n inRange = false;\n }\n\n if (!closest.target || (inRange\n // is the closest target in range?\n ? (closest.inRange && range !== Infinity\n // the pointer is relatively deeper in this target\n ? distance / range < closest.distance / closest.range\n // this target has Infinite range and the closest doesn't\n : (range === Infinity && closest.range !== Infinity)\n // OR this target is closer that the previous closest\n || distance < closest.distance)\n // The other is not in range and the pointer is closer to this target\n : (!closest.inRange && distance < closest.distance))) {\n\n closest.target = target;\n closest.distance = distance;\n closest.range = range;\n closest.inRange = inRange;\n closest.dx = dx;\n closest.dy = dy;\n\n status.range = range;\n }\n }\n\n let snapChanged;\n\n if (closest.target) {\n snapChanged = (status.modifiedX !== closest.target.x || status.modifiedY !== closest.target.y);\n\n status.modifiedX = closest.target.x;\n status.modifiedY = closest.target.y;\n }\n else {\n snapChanged = true;\n\n status.modifiedX = NaN;\n status.modifiedY = NaN;\n }\n\n status.dx = closest.dx;\n status.dy = closest.dy;\n\n status.changed = (snapChanged || (closest.inRange && !status.locked));\n status.locked = closest.inRange;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const relativePoints = options && options.relativePoints;\n\n if (options && options.enabled\n && !(phase === 'start' && relativePoints && relativePoints.length)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n }\n\n return {\n range : status.range,\n locked : status.locked,\n x : status.modifiedX,\n y : status.modifiedY,\n realX : status.realX,\n realY : status.realY,\n dx : status.dx,\n dy : status.dy,\n };\n }\n },\n};\n\ninteract.createSnapGrid = function (grid) {\n return function (x, y) {\n const limits = grid.limits || {\n left : -Infinity,\n right : Infinity,\n top : -Infinity,\n bottom: Infinity,\n };\n let offsetX = 0;\n let offsetY = 0;\n\n if (utils.is.object(grid.offset)) {\n offsetX = grid.offset.x;\n offsetY = grid.offset.y;\n }\n\n const gridx = Math.round((x - offsetX) / grid.x);\n const gridy = Math.round((y - offsetY) / grid.y);\n\n const newX = Math.max(limits.left, Math.min(limits.right , gridx * grid.x + offsetX));\n const newY = Math.max(limits.top , Math.min(limits.bottom, gridy * grid.y + offsetY));\n\n return {\n x: newX,\n y: newY,\n range: grid.range,\n };\n };\n};\n\nmodifiers.snap = snap;\nmodifiers.names.push('snap');\n\ndefaultOptions.perAction.snap = snap.defaults;\n\nmodule.exports = snap;\n","// This module allows snapping of the size of targets during resize\n// interactions.\n\nconst modifiers = require('./index');\nconst snap = require('./snap');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\nconst utils = require('../utils/');\n\nconst snapSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n },\n\n setOffset: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.edges;\n\n if (!edges) { return; }\n\n arg.options = {\n relativePoints: [{\n x: edges.left? 0 : 1,\n y: edges.top ? 0 : 1,\n }],\n origin: { x: 0, y: 0 },\n offset: 'self',\n range: options.range,\n };\n\n const offsets = snap.setOffset(arg);\n arg.options = options;\n\n return offsets;\n },\n\n set: function (arg) {\n const { interaction, options, offset, pageCoords } = arg;\n const page = utils.extend({}, pageCoords);\n const relativeX = page.x - offset[0].x;\n const relativeY = page.y - offset[0].y;\n\n arg.options = utils.extend({}, options);\n arg.options.targets = [];\n\n for (const snapTarget of options.targets) {\n let target;\n\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n if ('width' in target && 'height' in target) {\n target.x = target.width;\n target.y = target.height;\n }\n\n arg.options.targets.push(target);\n }\n\n snap.set(arg);\n },\n\n modifyCoords: function (arg) {\n const { options } = arg;\n\n arg.options = utils.extend({}, options);\n arg.options.enabled = options.enabled;\n arg.options.relativePoints = [null];\n\n snap.modifyCoords(arg);\n },\n};\n\nmodifiers.snapSize = snapSize;\nmodifiers.names.push('snapSize');\n\ndefaultOptions.perAction.snapSize = snapSize.defaults;\nresize.defaults.snapSize = snapSize.defaults;\n\nmodule.exports = snapSize;\n","const pointerUtils = require('../utils/pointerUtils');\n\nmodule.exports = class PointerEvent {\n constructor (type, pointer, event, eventTarget, interaction) {\n pointerUtils.pointerExtend(this, event);\n\n if (event !== pointer) {\n pointerUtils.pointerExtend(this, pointer);\n }\n\n this.interaction = interaction;\n\n this.timeStamp = new Date().getTime();\n this.originalEvent = event;\n this.type = type;\n this.pointerId = pointerUtils.getPointerId(pointer);\n this.pointerType = pointerUtils.getPointerType(pointer);\n this.target = eventTarget;\n this.currentTarget = null;\n\n if (type === 'tap') {\n const pointerIndex = interaction.getPointerIndex(pointer);\n this.dt = this.timeStamp - interaction.downTimes[pointerIndex];\n\n const interval = this.timeStamp - interaction.tapTime;\n\n this.double = !!(interaction.prevTap\n && interaction.prevTap.type !== 'doubletap'\n && interaction.prevTap.target === this.target\n && interval < 500);\n }\n else if (type === 'doubletap') {\n this.dt = pointer.timeStamp - interaction.tapTime;\n }\n }\n\n subtractOrigin ({ x: originX, y: originY }) {\n this.pageX -= originX;\n this.pageY -= originY;\n this.clientX -= originX;\n this.clientY -= originY;\n\n return this;\n }\n\n addOrigin ({ x: originX, y: originY }) {\n this.pageX += originX;\n this.pageY += originY;\n this.clientX += originX;\n this.clientY += originY;\n\n return this;\n }\n\n preventDefault () {\n this.originalEvent.preventDefault();\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n};\n","const PointerEvent = require('./PointerEvent');\nconst Interaction = require('../Interaction');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst defaults = require('../defaultOptions');\nconst signals = require('../utils/Signals').new();\nconst { filter } = require('../utils/arr');\n\nconst simpleSignals = [ 'down', 'up', 'cancel' ];\nconst simpleEvents = [ 'down', 'up', 'cancel' ];\n\nconst pointerEvents = {\n PointerEvent,\n fire,\n collectEventTargets,\n signals,\n defaults: {\n holdDuration: 600,\n ignoreFrom : null,\n allowFrom : null,\n origin : { x: 0, y: 0 },\n },\n types: [\n 'down',\n 'move',\n 'up',\n 'cancel',\n 'tap',\n 'doubletap',\n 'hold',\n ],\n};\n\nfunction fire (arg) {\n const {\n interaction, pointer, event, eventTarget,\n type = arg.pointerEvent.type,\n targets = collectEventTargets(arg),\n pointerEvent = new PointerEvent(type, pointer, event, eventTarget, interaction),\n } = arg;\n\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n targets,\n type,\n pointerEvent,\n };\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n\n for (const prop in target.props || {}) {\n pointerEvent[prop] = target.props[prop];\n }\n\n const origin = utils.getOriginXY(target.eventable, target.element);\n\n pointerEvent.subtractOrigin(origin);\n pointerEvent.eventable = target.eventable;\n pointerEvent.currentTarget = target.element;\n\n target.eventable.fire(pointerEvent);\n\n pointerEvent.addOrigin(origin);\n\n if (pointerEvent.immediatePropagationStopped\n || (pointerEvent.propagationStopped\n && (i + 1) < targets.length && targets[i + 1].element !== pointerEvent.currentTarget)) {\n break;\n }\n }\n\n signals.fire('fired', signalArg);\n\n if (type === 'tap') {\n // if pointerEvent should make a double tap, create and fire a doubletap\n // PointerEvent and use that as the prevTap\n const prevTap = pointerEvent.double\n ? fire({\n interaction, pointer, event, eventTarget,\n type: 'doubletap',\n })\n : pointerEvent;\n\n interaction.prevTap = prevTap;\n interaction.tapTime = prevTap.timeStamp;\n }\n\n return pointerEvent;\n}\n\nfunction collectEventTargets ({ interaction, pointer, event, eventTarget, type }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n // do not fire a tap event if the pointer was moved before being lifted\n if (type === 'tap' && (interaction.pointerWasMoved\n // or if the pointerup target is different to the pointerdown target\n || !(interaction.downTargets[pointerIndex] && interaction.downTargets[pointerIndex] === eventTarget))) {\n return [];\n }\n\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n path,\n targets: [],\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (type === 'hold') {\n signalArg.targets = filter(signalArg.targets, target =>\n target.eventable.options.holdDuration === interaction.holdTimers[pointerIndex].duration);\n }\n\n return signalArg.targets;\n}\n\nInteraction.signals.on('update-pointer-down', function ({ interaction, pointerIndex }) {\n interaction.holdTimers[pointerIndex] = { duration: Infinity, timeout: null };\n});\n\nInteraction.signals.on('remove-pointer', function ({ interaction, pointerIndex }) {\n interaction.holdTimers.splice(pointerIndex, 1);\n});\n\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget, duplicateMove }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n if (!duplicateMove && (!interaction.pointerIsDown || interaction.pointerWasMoved)) {\n if (interaction.pointerIsDown) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n\n fire({\n interaction, pointer, event, eventTarget,\n type: 'move',\n });\n }\n});\n\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget, pointerIndex }) {\n // copy event to be used in timeout for IE8\n const eventCopy = browser.isIE8? utils.extend({}, event) : event;\n\n const timer = interaction.holdTimers[pointerIndex];\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'hold',\n targets: [],\n path,\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (!signalArg.targets.length) { return; }\n\n let minDuration = Infinity;\n\n for (let i = 0; i < signalArg.targets.length; i++) {\n const target = signalArg.targets[i];\n const holdDuration = target.eventable.options.holdDuration;\n\n if (holdDuration < minDuration) {\n minDuration = holdDuration;\n }\n }\n\n timer.duration = minDuration;\n timer.timeout = setTimeout(function () {\n fire({\n interaction,\n eventTarget,\n pointer: browser.isIE8? eventCopy : pointer,\n event: eventCopy,\n type: 'hold',\n });\n }, minDuration);\n});\n\nInteraction.signals.on('up', ({ interaction, pointer, event, eventTarget }) => {\n if (!interaction.pointerWasMoved) {\n fire({ interaction, eventTarget, pointer, event, type: 'tap' });\n }\n});\n\n['up', 'cancel'].forEach(function (signalName) {\n Interaction.signals.on(signalName, function ({ interaction, pointerIndex }) {\n if (interaction.holdTimers[pointerIndex]) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n });\n});\n\nfunction createSignalListener (type) {\n return function ({ interaction, pointer, event, eventTarget }) {\n fire({ interaction, eventTarget, pointer, event, type });\n };\n}\n\nfor (let i = 0; i < simpleSignals.length; i++) {\n Interaction.signals.on(simpleSignals[i], createSignalListener(simpleEvents[i]));\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.prevTap = null; // the most recent tap event on this interaction\n interaction.tapTime = 0; // time of the most recent tap event\n interaction.holdTimers = []; // [{ duration, timeout }]\n});\n\ndefaults.pointerEvents = pointerEvents.defaults;\nmodule.exports = pointerEvents;\n","const pointerEvents = require('./base');\nconst Interaction = require('../Interaction');\n\npointerEvents.signals.on('new', onNew);\npointerEvents.signals.on('fired', onFired);\n\nfor (const signal of ['move', 'up', 'cancel', 'endall']) {\n Interaction.signals.on(signal, endHoldRepeat);\n}\n\nfunction onNew ({ pointerEvent }) {\n if (pointerEvent.type !== 'hold') { return; }\n\n pointerEvent.count = (pointerEvent.count || 0) + 1;\n}\n\nfunction onFired ({ interaction, pointerEvent, eventTarget, targets }) {\n if (pointerEvent.type !== 'hold' || !targets.length) { return; }\n\n // get the repeat interval from the first eventable\n const interval = targets[0].eventable.options.holdRepeatInterval;\n\n // don't repeat if the interval is 0 or less\n if (interval <= 0) { return; }\n\n // set a timeout to fire the holdrepeat event\n interaction.holdIntervalHandle = setTimeout(function () {\n pointerEvents.fire({\n interaction,\n eventTarget,\n type: 'hold',\n pointer: pointerEvent,\n event: pointerEvent,\n });\n }, interval);\n}\n\nfunction endHoldRepeat ({ interaction }) {\n // set the interaction's holdStopTime property\n // to stop further holdRepeat events\n if (interaction.holdIntervalHandle) {\n clearInterval(interaction.holdIntervalHandle);\n interaction.holdIntervalHandle = null;\n }\n}\n\n// don't repeat by default\npointerEvents.defaults.holdRepeatInterval = 0;\npointerEvents.types.push('holdrepeat');\n\nmodule.exports = {\n onNew,\n onFired,\n endHoldRepeat,\n};\n","const pointerEvents = require('./base');\nconst Interactable = require('../Interactable');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\nconst scope = require('../scope');\nconst extend = require('../utils/extend');\nconst { merge } = require('../utils/arr');\n\npointerEvents.signals.on('collect-targets', function ({ targets, element, type, eventTarget }) {\n function collectSelectors (interactable, selector, context) {\n const els = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && is.element(element)\n && domUtils.matchesSelector(element, selector, els)\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n const interactable = scope.interactables.get(element);\n\n if (interactable) {\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n scope.interactables.forEachSelector(collectSelectors, element);\n});\n\nInteractable.signals.on('new', function ({ interactable }) {\n interactable.events.getRect = function (element) {\n return interactable.getRect(element);\n };\n});\n\nInteractable.signals.on('set', function ({ interactable, options }) {\n extend(interactable.events.options, pointerEvents.defaults);\n extend(interactable.events.options, options);\n});\n\nmerge(Interactable.eventTypes, pointerEvents.types);\n\nInteractable.prototype.pointerEvents = function (options) {\n extend(this.events.options, options);\n\n return this;\n};\n\nconst __backCompatOption = Interactable.prototype._backCompatOption;\n\nInteractable.prototype._backCompatOption = function (optionName, newValue) {\n const ret = __backCompatOption.call(this, optionName, newValue);\n\n if (ret === this) {\n this.events.options[optionName] = newValue;\n }\n\n return ret;\n};\n\nInteractable.settingsMethods.push('pointerEvents');\n","const utils = require('./utils');\nconst events = require('./utils/events');\nconst signals = require('./utils/Signals').new();\n\nconst scope = {\n signals,\n events,\n utils,\n\n // main document\n document: require('./utils/domObjects').document,\n // all documents being listened to\n documents: [],\n\n addDocument: function (doc, win) {\n // do nothing if document is already known\n if (utils.contains(scope.documents, doc)) { return false; }\n\n win = win || scope.getWindow(doc);\n\n scope.documents.push(doc);\n events.documents.push(doc);\n\n // don't add an unload event for the main document\n // so that the page may be cached in browser history\n if (doc !== scope.document) {\n events.add(win, 'unload', scope.onWindowUnload);\n }\n\n signals.fire('add-document', { doc, win });\n },\n\n removeDocument: function (doc, win) {\n const index = utils.indexOf(scope.documents, doc);\n\n win = win || scope.getWindow(doc);\n\n events.remove(win, 'unload', scope.onWindowUnload);\n\n scope.documents.splice(index, 1);\n events.documents.splice(index, 1);\n\n signals.fire('remove-document', { win, doc });\n },\n\n onWindowUnload: function () {\n scope.removeDocument(this.document, this);\n },\n};\n\nmodule.exports = scope;\n","const { indexOf } = require('./arr');\n\nclass Signals {\n constructor () {\n this.listeners = {\n // signalName: [listeners],\n };\n }\n\n on (name, listener) {\n if (!this.listeners[name]) {\n this.listeners[name] = [listener];\n return;\n }\n\n this.listeners[name].push(listener);\n }\n\n off (name, listener) {\n if (!this.listeners[name]) { return; }\n\n const index = indexOf(this.listeners[name], listener);\n\n if (index !== -1) {\n this.listeners[name].splice(index, 1);\n }\n }\n\n fire (name, arg) {\n const targetListeners = this.listeners[name];\n\n if (!targetListeners) { return; }\n\n for (let i = 0; i < targetListeners.length; i++) {\n if (targetListeners[i](arg, name) === false) {\n return;\n }\n }\n }\n}\n\nSignals.new = function () {\n return new Signals();\n};\n\nmodule.exports = Signals;\n","function indexOf (array, target) {\n for (let i = 0, len = array.length; i < len; i++) {\n if (array[i] === target) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction contains (array, target) {\n return indexOf(array, target) !== -1;\n}\n\nfunction merge (target, source) {\n for (let i = 0; i < source.length; i++) {\n target.push(source[i]);\n }\n\n return target;\n}\n\nfunction filter (array, test) {\n const result = [];\n\n for (let i = 0; i < array.length; i++) {\n if (test(array[i])) {\n result.push(array[i]);\n }\n }\n\n return result;\n}\n\nmodule.exports = {\n indexOf,\n contains,\n merge,\n filter,\n};\n","const { window } = require('./window');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst Element = domObjects.Element;\nconst navigator = window.navigator;\n\nconst browser = {\n // Does the browser support touch input?\n supportsTouch: !!(('ontouchstart' in window) || is.function(window.DocumentTouch)\n && domObjects.document instanceof window.DocumentTouch),\n\n // Does the browser support PointerEvents\n supportsPointerEvent: !!domObjects.PointerEvent,\n\n isIE8: ('attachEvent' in window) && !('addEventListener' in window),\n\n // Opera Mobile must be handled differently\n isOperaMobile: (navigator.appName === 'Opera'\n && browser.supportsTouch\n && navigator.userAgent.match('Presto')),\n\n // scrolling doesn't change the result of getClientRects on iOS 7\n isIOS7: (/iP(hone|od|ad)/.test(navigator.platform)\n && /OS 7[^\\d]/.test(navigator.appVersion)),\n\n isIe9OrOlder: /MSIE (8|9)/.test(navigator.userAgent),\n\n // prefix matchesSelector\n prefixedMatchesSelector: 'matches' in Element.prototype\n ? 'matches': 'webkitMatchesSelector' in Element.prototype\n ? 'webkitMatchesSelector': 'mozMatchesSelector' in Element.prototype\n ? 'mozMatchesSelector': 'oMatchesSelector' in Element.prototype\n ? 'oMatchesSelector': 'msMatchesSelector',\n\n useMatchesSelectorPolyfill: false,\n\n pEventTypes: (domObjects.PointerEvent\n ? (domObjects.PointerEvent === window.MSPointerEvent\n ? {\n up: 'MSPointerUp',\n down: 'MSPointerDown',\n over: 'mouseover',\n out: 'mouseout',\n move: 'MSPointerMove',\n cancel: 'MSPointerCancel',\n }\n : {\n up: 'pointerup',\n down: 'pointerdown',\n over: 'pointerover',\n out: 'pointerout',\n move: 'pointermove',\n cancel: 'pointercancel',\n })\n : null),\n\n // because Webkit and Opera still use 'mousewheel' event type\n wheelEvent: 'onmousewheel' in domObjects.document? 'mousewheel': 'wheel',\n\n};\n\nbrowser.useMatchesSelectorPolyfill = !is.function(Element.prototype[browser.prefixedMatchesSelector]);\n\nmodule.exports = browser;\n","const domObjects = {};\nconst win = require('./window').window;\n\nfunction blank () {}\n\ndomObjects.document = win.document;\ndomObjects.DocumentFragment = win.DocumentFragment || blank;\ndomObjects.SVGElement = win.SVGElement || blank;\ndomObjects.SVGSVGElement = win.SVGSVGElement || blank;\ndomObjects.SVGElementInstance = win.SVGElementInstance || blank;\ndomObjects.Element = win.Element || blank;\ndomObjects.HTMLElement = win.HTMLElement || domObjects.Element;\n\ndomObjects.Event = win.Event;\ndomObjects.Touch = win.Touch || blank;\ndomObjects.PointerEvent = (win.PointerEvent || win.MSPointerEvent);\n\nmodule.exports = domObjects;\n","const win = require('./window');\nconst browser = require('./browser');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst domUtils = {\n nodeContains: function (parent, child) {\n while (child) {\n if (child === parent) {\n return true;\n }\n\n child = child.parentNode;\n }\n\n return false;\n },\n\n closest: function (element, selector) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) { return element; }\n\n element = domUtils.parentNode(element);\n }\n\n return null;\n },\n\n parentNode: function (node) {\n let parent = node.parentNode;\n\n if (is.docFrag(parent)) {\n // skip past #shado-root fragments\n while ((parent = parent.host) && is.docFrag(parent)) {\n continue;\n }\n\n return parent;\n }\n\n return parent;\n },\n\n // taken from http://tanalin.com/en/blog/2012/12/matches-selector-ie8/ and modified\n matchesSelectorPolyfill: browser.useMatchesSelectorPolyfill\n ? function (element, selector, elems) {\n elems = elems || element.parentNode.querySelectorAll(selector);\n\n for (let i = 0, len = elems.length; i < len; i++) {\n if (elems[i] === element) {\n return true;\n }\n }\n\n return false;\n }\n : null,\n\n matchesSelector: function (element, selector, nodeList) {\n if (browser.useMatchesSelectorPolyfill) {\n return domUtils.matchesSelectorPolyfill(element, selector, nodeList);\n }\n\n // remove /deep/ from selectors if shadowDOM polyfill is used\n if (win.window !== win.realWindow) {\n selector = selector.replace(/\\/deep\\//g, ' ');\n }\n\n return element[browser.prefixedMatchesSelector](selector);\n },\n\n // Test for the element that's \"above\" all other qualifiers\n indexOfDeepestElement: function (elements) {\n let deepestZoneParents = [];\n let dropzoneParents = [];\n let dropzone;\n let deepestZone = elements[0];\n let index = deepestZone? 0: -1;\n let parent;\n let child;\n let i;\n let n;\n\n for (i = 1; i < elements.length; i++) {\n dropzone = elements[i];\n\n // an element might belong to multiple selector dropzones\n if (!dropzone || dropzone === deepestZone) {\n continue;\n }\n\n if (!deepestZone) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n // check if the deepest or current are document.documentElement or document.rootElement\n // - if the current dropzone is, do nothing and continue\n if (dropzone.parentNode === dropzone.ownerDocument) {\n continue;\n }\n // - if deepest is, update with the current dropzone and continue to next\n else if (deepestZone.parentNode === dropzone.ownerDocument) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n if (!deepestZoneParents.length) {\n parent = deepestZone;\n while (parent.parentNode && parent.parentNode !== parent.ownerDocument) {\n deepestZoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n }\n\n // if this element is an svg element and the current deepest is\n // an HTMLElement\n if (deepestZone instanceof domObjects.HTMLElement\n && dropzone instanceof domObjects.SVGElement\n && !(dropzone instanceof domObjects.SVGSVGElement)) {\n\n if (dropzone === deepestZone.parentNode) {\n continue;\n }\n\n parent = dropzone.ownerSVGElement;\n }\n else {\n parent = dropzone;\n }\n\n dropzoneParents = [];\n\n while (parent.parentNode !== parent.ownerDocument) {\n dropzoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n\n n = 0;\n\n // get (position of last common ancestor) + 1\n while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) {\n n++;\n }\n\n const parents = [\n dropzoneParents[n - 1],\n dropzoneParents[n],\n deepestZoneParents[n],\n ];\n\n child = parents[0].lastChild;\n\n while (child) {\n if (child === parents[1]) {\n deepestZone = dropzone;\n index = i;\n deepestZoneParents = [];\n\n break;\n }\n else if (child === parents[2]) {\n break;\n }\n\n child = child.previousSibling;\n }\n }\n\n return index;\n },\n\n matchesUpTo: function (element, selector, limit) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) {\n return true;\n }\n\n element = domUtils.parentNode(element);\n\n if (element === limit) {\n return domUtils.matchesSelector(element, selector);\n }\n }\n\n return false;\n },\n\n getActualElement: function (element) {\n return (element instanceof domObjects.SVGElementInstance\n ? element.correspondingUseElement\n : element);\n },\n\n getScrollXY: function (relevantWindow) {\n relevantWindow = relevantWindow || win.window;\n return {\n x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft,\n y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop,\n };\n },\n\n getElementClientRect: function (element) {\n const clientRect = (element instanceof domObjects.SVGElement\n ? element.getBoundingClientRect()\n : element.getClientRects()[0]);\n\n return clientRect && {\n left : clientRect.left,\n right : clientRect.right,\n top : clientRect.top,\n bottom: clientRect.bottom,\n width : clientRect.width || clientRect.right - clientRect.left,\n height: clientRect.height || clientRect.bottom - clientRect.top,\n };\n },\n\n getElementRect: function (element) {\n const clientRect = domUtils.getElementClientRect(element);\n\n if (!browser.isIOS7 && clientRect) {\n const scroll = domUtils.getScrollXY(win.getWindow(element));\n\n clientRect.left += scroll.x;\n clientRect.right += scroll.x;\n clientRect.top += scroll.y;\n clientRect.bottom += scroll.y;\n }\n\n return clientRect;\n },\n\n getPath: function (element) {\n const path = [];\n\n while (element) {\n path.push(element);\n element = domUtils.parentNode(element);\n }\n\n return path;\n },\n\n trySelector: value => {\n if (!is.string(value)) { return false; }\n\n // an exception will be raised if it is invalid\n domObjects.document.querySelector(value);\n return true;\n },\n};\n\nmodule.exports = domUtils;\n","const is = require('./is');\nconst domUtils = require('./domUtils');\nconst pExtend = require('./pointerExtend');\n\nconst { window, getWindow } = require('./window');\nconst { indexOf, contains } = require('./arr');\n\nconst useAttachEvent = ('attachEvent' in window) && !('addEventListener' in window);\nconst addEvent = useAttachEvent? 'attachEvent': 'addEventListener';\nconst removeEvent = useAttachEvent? 'detachEvent': 'removeEventListener';\nconst on = useAttachEvent? 'on': '';\n\nconst elements = [];\nconst targets = [];\nconst attachedListeners = [];\n\n// {\n// type: {\n// selectors: ['selector', ...],\n// contexts : [document, ...],\n// listeners: [[listener, capture, passive], ...]\n// }\n// }\nconst delegatedEvents = {};\n\nconst documents = [];\n\nconst supportsOptions = !useAttachEvent && (() => {\n let supported = false;\n\n window.document.createElement('div').addEventListener('test', null, {\n get capture () { supported = true; },\n });\n\n return supported;\n})();\n\nfunction add (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n let elementIndex = indexOf(elements, element);\n let target = targets[elementIndex];\n\n if (!target) {\n target = {\n events: {},\n typeCount: 0,\n };\n\n elementIndex = elements.push(element) - 1;\n targets.push(target);\n\n attachedListeners.push(useAttachEvent\n ? {\n supplied: [],\n wrapped : [],\n useCount: [],\n }\n : null);\n }\n\n if (!target.events[type]) {\n target.events[type] = [];\n target.typeCount++;\n }\n\n if (!contains(target.events[type], listener)) {\n let ret;\n\n if (useAttachEvent) {\n const { supplied, wrapped, useCount } = attachedListeners[elementIndex];\n const listenerIndex = indexOf(supplied, listener);\n\n const wrappedListener = wrapped[listenerIndex] || function (event) {\n if (!event.immediatePropagationStopped) {\n event.target = event.srcElement;\n event.currentTarget = element;\n\n event.preventDefault = event.preventDefault || preventDef;\n event.stopPropagation = event.stopPropagation || stopProp;\n event.stopImmediatePropagation = event.stopImmediatePropagation || stopImmProp;\n\n if (/mouse|click/.test(event.type)) {\n event.pageX = event.clientX + getWindow(element).document.documentElement.scrollLeft;\n event.pageY = event.clientY + getWindow(element).document.documentElement.scrollTop;\n }\n\n listener(event);\n }\n };\n\n ret = element[addEvent](on + type, wrappedListener, !!options.capture);\n\n if (listenerIndex === -1) {\n supplied.push(listener);\n wrapped.push(wrappedListener);\n useCount.push(1);\n }\n else {\n useCount[listenerIndex]++;\n }\n }\n else {\n ret = element[addEvent](type, listener, supportsOptions? options : !!options.capture);\n }\n target.events[type].push(listener);\n\n return ret;\n }\n}\n\nfunction remove (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const elementIndex = indexOf(elements, element);\n const target = targets[elementIndex];\n\n if (!target || !target.events) {\n return;\n }\n\n let wrappedListener = listener;\n let listeners;\n let listenerIndex;\n\n if (useAttachEvent) {\n listeners = attachedListeners[elementIndex];\n listenerIndex = indexOf(listeners.supplied, listener);\n wrappedListener = listeners.wrapped[listenerIndex];\n }\n\n if (type === 'all') {\n for (type in target.events) {\n if (target.events.hasOwnProperty(type)) {\n remove(element, type, 'all');\n }\n }\n return;\n }\n\n if (target.events[type]) {\n const len = target.events[type].length;\n\n if (listener === 'all') {\n for (let i = 0; i < len; i++) {\n remove(element, type, target.events[type][i], options);\n }\n return;\n }\n else {\n for (let i = 0; i < len; i++) {\n if (target.events[type][i] === listener) {\n element[removeEvent](on + type, wrappedListener, supportsOptions? options : !!options.capture);\n target.events[type].splice(i, 1);\n\n if (useAttachEvent && listeners) {\n listeners.useCount[listenerIndex]--;\n if (listeners.useCount[listenerIndex] === 0) {\n listeners.supplied.splice(listenerIndex, 1);\n listeners.wrapped.splice(listenerIndex, 1);\n listeners.useCount.splice(listenerIndex, 1);\n }\n }\n\n break;\n }\n }\n }\n\n if (target.events[type] && target.events[type].length === 0) {\n target.events[type] = null;\n target.typeCount--;\n }\n }\n\n if (!target.typeCount) {\n targets.splice(elementIndex, 1);\n elements.splice(elementIndex, 1);\n attachedListeners.splice(elementIndex, 1);\n }\n}\n\nfunction addDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n if (!delegatedEvents[type]) {\n delegatedEvents[type] = {\n selectors: [],\n contexts : [],\n listeners: [],\n };\n\n // add delegate listener functions\n for (let i = 0; i < documents.length; i++) {\n add(documents[i], type, delegateListener);\n add(documents[i], type, delegateUseCapture, true);\n }\n }\n\n const delegated = delegatedEvents[type];\n let index;\n\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n break;\n }\n }\n\n if (index === -1) {\n index = delegated.selectors.length;\n\n delegated.selectors.push(selector);\n delegated.contexts .push(context);\n delegated.listeners.push([]);\n }\n\n // keep listener and capture and passive flags\n delegated.listeners[index].push([listener, !!options.capture, options.passive]);\n}\n\nfunction removeDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const delegated = delegatedEvents[type];\n let matchFound = false;\n let index;\n\n if (!delegated) { return; }\n\n // count from last index of delegated to 0\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n // look for matching selector and context Node\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n\n const listeners = delegated.listeners[index];\n\n // each item of the listeners array is an array: [function, capture, passive]\n for (let i = listeners.length - 1; i >= 0; i--) {\n const [fn, capture, passive] = listeners[i];\n\n // check if the listener functions and capture and passive flags match\n if (fn === listener && capture === !!options.capture && passive === options.passive) {\n // remove the listener from the array of listeners\n listeners.splice(i, 1);\n\n // if all listeners for this interactable have been removed\n // remove the interactable from the delegated arrays\n if (!listeners.length) {\n delegated.selectors.splice(index, 1);\n delegated.contexts .splice(index, 1);\n delegated.listeners.splice(index, 1);\n\n // remove delegate function from context\n remove(context, type, delegateListener);\n remove(context, type, delegateUseCapture, true);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegatedEvents[type] = null;\n }\n }\n\n // only remove one listener\n matchFound = true;\n break;\n }\n }\n\n if (matchFound) { break; }\n }\n }\n}\n\n// bound to the interactable context when a DOM event\n// listener is added to a selector interactable\nfunction delegateListener (event, optionalArg) {\n const options = getOptions(optionalArg);\n const fakeEvent = {};\n const delegated = delegatedEvents[event.type];\n const eventTarget = (domUtils.getActualElement(event.path\n ? event.path[0]\n : event.target));\n let element = eventTarget;\n\n // duplicate the event so that currentTarget can be changed\n pExtend(fakeEvent, event);\n\n fakeEvent.originalEvent = event;\n fakeEvent.preventDefault = preventOriginalDefault;\n\n // climb up document tree looking for selector matches\n while (is.element(element)) {\n for (let i = 0; i < delegated.selectors.length; i++) {\n const selector = delegated.selectors[i];\n const context = delegated.contexts[i];\n\n if (domUtils.matchesSelector(element, selector)\n && domUtils.nodeContains(context, eventTarget)\n && domUtils.nodeContains(context, element)) {\n\n const listeners = delegated.listeners[i];\n\n fakeEvent.currentTarget = element;\n\n for (let j = 0; j < listeners.length; j++) {\n const [fn, capture, passive] = listeners[j];\n\n if (capture === !!options.capture && passive === options.passive) {\n fn(fakeEvent);\n }\n }\n }\n }\n\n element = domUtils.parentNode(element);\n }\n}\n\nfunction delegateUseCapture (event) {\n return delegateListener.call(this, event, true);\n}\n\nfunction preventDef () {\n this.returnValue = false;\n}\n\nfunction preventOriginalDefault () {\n this.originalEvent.preventDefault();\n}\n\nfunction stopProp () {\n this.cancelBubble = true;\n}\n\nfunction stopImmProp () {\n this.cancelBubble = true;\n this.immediatePropagationStopped = true;\n}\n\nfunction getOptions (param) {\n return is.object(param)? param : { capture: param };\n}\n\nmodule.exports = {\n add,\n remove,\n\n addDelegate,\n removeDelegate,\n\n delegateListener,\n delegateUseCapture,\n delegatedEvents,\n documents,\n\n useAttachEvent,\n supportsOptions,\n\n _elements: elements,\n _targets: targets,\n _attachedListeners: attachedListeners,\n};\n","module.exports = function extend (dest, source) {\n for (const prop in source) {\n dest[prop] = source[prop];\n }\n return dest;\n};\n","const {\n resolveRectLike,\n rectToXY,\n} = require('./rect');\n\nmodule.exports = function (target, element, action) {\n const actionOptions = target.options[action];\n const actionOrigin = actionOptions && actionOptions.origin;\n const origin = actionOrigin || target.options.origin;\n\n const originRect = resolveRectLike(origin, target, element, [target && element]);\n\n return rectToXY(originRect) || { x: 0, y: 0 };\n};\n","module.exports = (x, y) => Math.sqrt(x * x + y * y);\n","const extend = require('./extend');\nconst win = require('./window');\n\nconst utils = {\n warnOnce: function (method, message) {\n let warned = false;\n\n return function () {\n if (!warned) {\n win.window.console.warn(message);\n warned = true;\n }\n\n return method.apply(this, arguments);\n };\n },\n\n // http://stackoverflow.com/a/5634528/2280888\n _getQBezierValue: function (t, p1, p2, p3) {\n const iT = 1 - t;\n return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3;\n },\n\n getQuadraticCurvePoint: function (startX, startY, cpX, cpY, endX, endY, position) {\n return {\n x: utils._getQBezierValue(position, startX, cpX, endX),\n y: utils._getQBezierValue(position, startY, cpY, endY),\n };\n },\n\n // http://gizma.com/easing/\n easeOutQuad: function (t, b, c, d) {\n t /= d;\n return -c * t*(t-2) + b;\n },\n\n copyAction: function (dest, src) {\n dest.name = src.name;\n dest.axis = src.axis;\n dest.edges = src.edges;\n\n return dest;\n },\n\n is : require('./is'),\n extend : extend,\n hypot : require('./hypot'),\n getOriginXY: require('./getOriginXY'),\n};\n\nextend(utils, require('./arr'));\nextend(utils, require('./domUtils'));\nextend(utils, require('./pointerUtils'));\nextend(utils, require('./rect'));\n\nmodule.exports = utils;\n","const scope = require('../scope');\nconst utils = require('./index');\n\nconst finder = {\n methodOrder: [ 'simulationResume', 'mouseOrPen', 'hasPointer', 'idle' ],\n\n search: function (pointer, eventType, eventTarget) {\n const pointerType = utils.getPointerType(pointer);\n const pointerId = utils.getPointerId(pointer);\n const details = { pointer, pointerId, pointerType, eventType, eventTarget };\n\n for (const method of finder.methodOrder) {\n const interaction = finder[method](details);\n\n if (interaction) {\n return interaction;\n }\n }\n },\n\n // try to resume simulation with a new pointer\n simulationResume: function ({ pointerType, eventType, eventTarget }) {\n if (!/down|start/i.test(eventType)) {\n return null;\n }\n\n for (const interaction of scope.interactions) {\n let element = eventTarget;\n\n if (interaction.simulation && interaction.simulation.allowResume\n && (interaction.pointerType === pointerType)) {\n while (element) {\n // if the element is the interaction element\n if (element === interaction.element) {\n return interaction;\n }\n element = utils.parentNode(element);\n }\n }\n }\n\n return null;\n },\n\n // if it's a mouse or pen interaction\n mouseOrPen: function ({ pointerId, pointerType, eventType }) {\n if (pointerType !== 'mouse' && pointerType !== 'pen') {\n return null;\n }\n\n let firstNonActive;\n\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType) {\n // if it's a down event, skip interactions with running simulations\n if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; }\n\n // if the interaction is active, return it immediately\n if (interaction.interacting()) {\n return interaction;\n }\n // otherwise save it and look for another active interaction\n else if (!firstNonActive) {\n firstNonActive = interaction;\n }\n }\n }\n\n // if no active mouse interaction was found use the first inactive mouse\n // interaction\n if (firstNonActive) {\n return firstNonActive;\n }\n\n // find any mouse or pen interaction.\n // ignore the interaction if the eventType is a *down, and a simulation\n // is active\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType && !(/down/i.test(eventType) && interaction.simulation)) {\n return interaction;\n }\n }\n\n return null;\n },\n\n // get interaction that has this pointer\n hasPointer: function ({ pointerId }) {\n for (const interaction of scope.interactions) {\n if (utils.contains(interaction.pointerIds, pointerId)) {\n return interaction;\n }\n }\n },\n\n // get first idle interaction with a matching pointerType\n idle: function ({ pointerType }) {\n for (const interaction of scope.interactions) {\n // if there's already a pointer held down\n if (interaction.pointerIds.length === 1) {\n const target = interaction.target;\n // don't add this pointer if there is a target interactable and it\n // isn't gesturable\n if (target && !target.options.gesture.enabled) {\n continue;\n }\n }\n // maximum of 2 pointers per interaction\n else if (interaction.pointerIds.length >= 2) {\n continue;\n }\n\n if (!interaction.interacting() && (pointerType === interaction.pointerType)) {\n return interaction;\n }\n }\n\n return null;\n },\n};\n\nmodule.exports = finder;\n","const win = require('./window');\nconst isWindow = require('./isWindow');\n\nconst is = {\n array : () => {},\n\n window : thing => thing === win.window || isWindow(thing),\n\n docFrag : thing => is.object(thing) && thing.nodeType === 11,\n\n object : thing => !!thing && (typeof thing === 'object'),\n\n function: thing => typeof thing === 'function',\n\n number : thing => typeof thing === 'number' ,\n\n bool : thing => typeof thing === 'boolean' ,\n\n string : thing => typeof thing === 'string' ,\n\n element: thing => {\n if (!thing || (typeof thing !== 'object')) { return false; }\n\n const _window = win.getWindow(thing) || win.window;\n\n return (/object|function/.test(typeof _window.Element)\n ? thing instanceof _window.Element //DOM2\n : thing.nodeType === 1 && typeof thing.nodeName === 'string');\n },\n};\n\nis.array = thing => (is.object(thing)\n && (typeof thing.length !== 'undefined')\n && is.function(thing.splice));\n\nmodule.exports = is;\n","module.exports = (thing) => !!(thing && thing.Window) && (thing instanceof thing.Window);\n","function pointerExtend (dest, source) {\n for (const prop in source) {\n const prefixedPropREs = module.exports.prefixedPropREs;\n let deprecated = false;\n\n // skip deprecated prefixed properties\n for (const vendor in prefixedPropREs) {\n if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) {\n deprecated = true;\n break;\n }\n }\n\n if (!deprecated && typeof source[prop] !== 'function') {\n dest[prop] = source[prop];\n }\n }\n return dest;\n}\n\npointerExtend.prefixedPropREs = {\n webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/,\n};\n\nmodule.exports = pointerExtend;\n","const hypot = require('./hypot');\nconst browser = require('./browser');\nconst dom = require('./domObjects');\nconst domUtils = require('./domUtils');\nconst domObjects = require('./domObjects');\nconst is = require('./is');\nconst pointerExtend = require('./pointerExtend');\n\nconst pointerUtils = {\n copyCoords: function (dest, src) {\n dest.page = dest.page || {};\n dest.page.x = src.page.x;\n dest.page.y = src.page.y;\n\n dest.client = dest.client || {};\n dest.client.x = src.client.x;\n dest.client.y = src.client.y;\n\n dest.timeStamp = src.timeStamp;\n },\n\n setCoordDeltas: function (targetObj, prev, cur) {\n targetObj.page.x = cur.page.x - prev.page.x;\n targetObj.page.y = cur.page.y - prev.page.y;\n targetObj.client.x = cur.client.x - prev.client.x;\n targetObj.client.y = cur.client.y - prev.client.y;\n targetObj.timeStamp = cur.timeStamp - prev.timeStamp;\n\n // set pointer velocity\n const dt = Math.max(targetObj.timeStamp / 1000, 0.001);\n\n targetObj.page.speed = hypot(targetObj.page.x, targetObj.page.y) / dt;\n targetObj.page.vx = targetObj.page.x / dt;\n targetObj.page.vy = targetObj.page.y / dt;\n\n targetObj.client.speed = hypot(targetObj.client.x, targetObj.page.y) / dt;\n targetObj.client.vx = targetObj.client.x / dt;\n targetObj.client.vy = targetObj.client.y / dt;\n },\n\n isNativePointer: function (pointer) {\n return (pointer instanceof dom.Event || pointer instanceof dom.Touch);\n },\n\n // Get specified X/Y coords for mouse or event.touches[0]\n getXY: function (type, pointer, xy) {\n xy = xy || {};\n type = type || 'page';\n\n xy.x = pointer[type + 'X'];\n xy.y = pointer[type + 'Y'];\n\n return xy;\n },\n\n getPageXY: function (pointer, page) {\n page = page || {};\n\n // Opera Mobile handles the viewport and scrolling oddly\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n pointerUtils.getXY('screen', pointer, page);\n\n page.x += window.scrollX;\n page.y += window.scrollY;\n }\n else {\n pointerUtils.getXY('page', pointer, page);\n }\n\n return page;\n },\n\n getClientXY: function (pointer, client) {\n client = client || {};\n\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n // Opera Mobile handles the viewport and scrolling oddly\n pointerUtils.getXY('screen', pointer, client);\n }\n else {\n pointerUtils.getXY('client', pointer, client);\n }\n\n return client;\n },\n\n getPointerId: function (pointer) {\n return is.number(pointer.pointerId)? pointer.pointerId : pointer.identifier;\n },\n\n setCoords: function (targetObj, pointers, timeStamp) {\n const pointer = (pointers.length > 1\n ? pointerUtils.pointerAverage(pointers)\n : pointers[0]);\n\n const tmpXY = {};\n\n pointerUtils.getPageXY(pointer, tmpXY);\n targetObj.page.x = tmpXY.x;\n targetObj.page.y = tmpXY.y;\n\n pointerUtils.getClientXY(pointer, tmpXY);\n targetObj.client.x = tmpXY.x;\n targetObj.client.y = tmpXY.y;\n\n targetObj.timeStamp = is.number(timeStamp) ? timeStamp :new Date().getTime();\n },\n\n pointerExtend: pointerExtend,\n\n getTouchPair: function (event) {\n const touches = [];\n\n // array of touches is supplied\n if (is.array(event)) {\n touches[0] = event[0];\n touches[1] = event[1];\n }\n // an event\n else {\n if (event.type === 'touchend') {\n if (event.touches.length === 1) {\n touches[0] = event.touches[0];\n touches[1] = event.changedTouches[0];\n }\n else if (event.touches.length === 0) {\n touches[0] = event.changedTouches[0];\n touches[1] = event.changedTouches[1];\n }\n }\n else {\n touches[0] = event.touches[0];\n touches[1] = event.touches[1];\n }\n }\n\n return touches;\n },\n\n pointerAverage: function (pointers) {\n const average = {\n pageX : 0,\n pageY : 0,\n clientX: 0,\n clientY: 0,\n screenX: 0,\n screenY: 0,\n };\n\n for (const pointer of pointers) {\n for (const prop in average) {\n average[prop] += pointer[prop];\n }\n }\n for (const prop in average) {\n average[prop] /= pointers.length;\n }\n\n return average;\n },\n\n touchBBox: function (event) {\n if (!event.length && !(event.touches && event.touches.length > 1)) {\n return;\n }\n\n const touches = pointerUtils.getTouchPair(event);\n const minX = Math.min(touches[0].pageX, touches[1].pageX);\n const minY = Math.min(touches[0].pageY, touches[1].pageY);\n const maxX = Math.max(touches[0].pageX, touches[1].pageX);\n const maxY = Math.max(touches[0].pageY, touches[1].pageY);\n\n return {\n x: minX,\n y: minY,\n left: minX,\n top: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n },\n\n touchDistance: function (event, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n\n\n const dx = touches[0][sourceX] - touches[1][sourceX];\n const dy = touches[0][sourceY] - touches[1][sourceY];\n\n return hypot(dx, dy);\n },\n\n touchAngle: function (event, prevAngle, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n const dx = touches[1][sourceX] - touches[0][sourceX];\n const dy = touches[1][sourceY] - touches[0][sourceY];\n const angle = 180 * Math.atan2(dy , dx) / Math.PI;\n\n return angle;\n },\n\n getPointerType: function (pointer) {\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : is.number(pointer.pointerType)\n ? [undefined, undefined,'touch', 'pen', 'mouse'][pointer.pointerType]\n // if the PointerEvent API isn't available, then the \"pointer\" must\n // be either a MouseEvent, TouchEvent, or Touch object\n : /touch/.test(pointer.type) || pointer instanceof domObjects.Touch\n ? 'touch'\n : 'mouse';\n },\n\n // [ event.target, event.currentTarget ]\n getEventTargets: function (event) {\n return [\n domUtils.getActualElement(event.path ? event.path[0] : event.target),\n domUtils.getActualElement(event.currentTarget),\n ];\n },\n};\n\nmodule.exports = pointerUtils;\n","const { window } = require('./window');\n\nconst vendors = ['ms', 'moz', 'webkit', 'o'];\nlet lastTime = 0;\nlet request;\nlet cancel;\n\nfor (let x = 0; x < vendors.length && !window.requestAnimationFrame; x++) {\n request = window[vendors[x] + 'RequestAnimationFrame'];\n cancel = window[vendors[x] +'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n}\n\nif (!request) {\n request = function (callback) {\n const currTime = new Date().getTime();\n const timeToCall = Math.max(0, 16 - (currTime - lastTime));\n const id = setTimeout(function () { callback(currTime + timeToCall); },\n timeToCall);\n\n lastTime = currTime + timeToCall;\n return id;\n };\n}\n\nif (!cancel) {\n cancel = function (id) {\n clearTimeout(id);\n };\n}\n\nmodule.exports = {\n request,\n cancel,\n};\n","const extend = require('./extend');\nconst is = require('./is');\nconst {\n closest,\n parentNode,\n getElementRect,\n} = require('./domUtils');\n\nconst rectUtils = {\n getStringOptionResult: function (value, interactable, element) {\n if (!is.string(value)) {\n return null;\n }\n\n if (value === 'parent') {\n value = parentNode(element);\n }\n else if (value === 'self') {\n value = interactable.getRect(element);\n }\n else {\n value = closest(element, value);\n }\n\n return value;\n },\n\n resolveRectLike: function (value, interactable, element, functionArgs) {\n value = rectUtils.getStringOptionResult(value, interactable, element) || value;\n\n if (is.function(value)) {\n value = value.apply(null, functionArgs);\n }\n\n if (is.element(value)) {\n value = getElementRect(value);\n }\n\n return value;\n },\n\n rectToXY: function (rect) {\n return rect && {\n x: 'x' in rect ? rect.x : rect.left,\n y: 'y' in rect ? rect.y : rect.top,\n };\n },\n\n xywhToTlbr: function (rect) {\n if (rect && !('left' in rect && 'top' in rect)) {\n rect = extend({}, rect);\n\n rect.left = rect.x || 0;\n rect.top = rect.y || 0;\n rect.right = rect.right || (rect.left + rect.width);\n rect.bottom = rect.bottom || (rect.top + rect.height);\n }\n\n return rect;\n },\n\n tlbrToXywh: function (rect) {\n if (rect && !('x' in rect && 'y' in rect)) {\n rect = extend({}, rect);\n\n rect.x = rect.left || 0;\n rect.top = rect.top || 0;\n rect.width = rect.width || (rect.right - rect.x);\n rect.height = rect.height || (rect.bottom - rect.y);\n }\n\n return rect;\n },\n};\n\nmodule.exports = rectUtils;\n","const win = module.exports;\nconst isWindow = require('./isWindow');\n\nfunction init (window) {\n // get wrapped window if using Shadow DOM polyfill\n\n win.realWindow = window;\n\n // create a TextNode\n const el = window.document.createTextNode('');\n\n // check if it's wrapped by a polyfill\n if (el.ownerDocument !== window.document\n && typeof window.wrap === 'function'\n && window.wrap(el) === el) {\n // use wrapped window\n window = window.wrap(window);\n }\n\n win.window = window;\n}\n\nif (typeof window === 'undefined') {\n win.window = undefined;\n win.realWindow = undefined;\n}\nelse {\n init(window);\n}\n\nwin.getWindow = function getWindow (node) {\n if (isWindow(node)) {\n return node;\n }\n\n const rootNode = (node.ownerDocument || node);\n\n return rootNode.defaultView || rootNode.parentWindow || win.window;\n};\n\nwin.init = init;\n"]} \ No newline at end of file diff --git a/dist/interact.min.js b/dist/interact.min.js index c0bb2476c..2d1f0fb62 100644 --- a/dist/interact.min.js +++ b/dist/interact.min.js @@ -1,6 +1,6 @@ -/* interact.js v1.3.0-alpha.3+sha.9595c40 | https://raw.github.com/taye/interact.js/master/LICENSE */ -!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var t;t="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,t.interact=e()}}(function(){return function e(t,n,r){function i(s,a){if(!n[s]){if(!t[s]){var l="function"==typeof require&&require;if(!a&&l)return l(s,!0);if(o)return o(s,!0);var c=new Error("Cannot find module '"+s+"'");throw c.code="MODULE_NOT_FOUND",c}var p=n[s]={exports:{}};t[s][0].call(p.exports,function(e){var n=t[s][1][e];return i(n||e)},p,p.exports,e,t,n,r)}return n[s].exports}for(var o="function"==typeof require&&require,s=0;s6&&void 0!==arguments[6]&&arguments[6];r(this,e);var f=t.target,v=(f&&f.options||s).deltaSource,g=o(f,p,l),h="start"===c,m="end"===c,y=h?t.startCoords:t.curCoords,x=t.prevEvent;p=p||t.element;var b=i({},y.page),w=i({},y.client);b.x-=g.x,b.y-=g.y,w.x-=g.x,w.y-=g.y,this.ctrlKey=n.ctrlKey,this.altKey=n.altKey,this.shiftKey=n.shiftKey,this.metaKey=n.metaKey,this.button=n.button,this.buttons=n.buttons,this.target=p,this.currentTarget=p,this.relatedTarget=u||null,this.preEnd=d,this.type=l+(c||""),this.interaction=t,this.interactable=f,this.t0=h?t.downTimes[t.downTimes.length-1]:x.t0;var E={interaction:t,event:n,action:l,phase:c,element:p,related:u,page:b,client:w,coords:y,starting:h,ending:m,deltaSource:v,iEvent:this};a.fire("set-xy",E),m?(this.pageX=x.pageX,this.pageY=x.pageY,this.clientX=x.clientX,this.clientY=x.clientY):(this.pageX=b.x,this.pageY=b.y,this.clientX=w.x,this.clientY=w.y),this.x0=t.startCoords.page.x-g.x,this.y0=t.startCoords.page.y-g.y,this.clientX0=t.startCoords.client.x-g.x,this.clientY0=t.startCoords.client.y-g.y,a.fire("set-delta",E),this.timeStamp=y.timeStamp,this.dt=t.pointerDelta.timeStamp,this.duration=this.timeStamp-this.t0,this.speed=t.pointerDelta[v].speed,this.velocityX=t.pointerDelta[v].vx,this.velocityY=t.pointerDelta[v].vy,this.swipe=m||"inertiastart"===c?this.getSwipe():null,a.fire("new",E)}return e.prototype.getSwipe=function(){var e=this.interaction;if(e.prevEvent.speed<600||this.timeStamp-e.prevEvent.timeStamp>150)return null;var t=180*Math.atan2(e.prevEvent.velocityY,e.prevEvent.velocityX)/Math.PI;t<0&&(t+=360);var n=112.5<=t&&t<247.5,r=202.5<=t&&t<337.5,i=!n&&(292.5<=t||t<67.5);return{up:r,down:!r&&22.5<=t&&t<157.5,left:n,right:i,angle:t,speed:e.prevEvent.speed,velocity:{x:e.prevEvent.velocityX,y:e.prevEvent.velocityY}}},e.prototype.preventDefault=function(){},e.prototype.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},e.prototype.stopPropagation=function(){this.propagationStopped=!0},e}();a.on("set-delta",function(e){var t=e.iEvent,n=e.interaction,r=e.starting,i=e.deltaSource,o=r?t:n.prevEvent;"client"===i?(t.dx=t.clientX-o.clientX,t.dy=t.clientY-o.clientY):(t.dx=t.pageX-o.pageX,t.dy=t.pageY-o.pageY)}),l.signals=a,t.exports=l},{"./defaultOptions":18,"./utils/Signals":35,"./utils/extend":41,"./utils/getOriginXY":42}],4:[function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=e("./utils/is"),o=e("./utils/events"),s=e("./utils/extend"),a=e("./actions/base"),l=e("./scope"),c=e("./Eventable"),p=e("./defaultOptions"),u=e("./utils/Signals").new(),d=e("./utils/domUtils"),f=d.getElementRect,v=d.nodeContains,g=d.trySelector,h=e("./utils/window"),m=h.getWindow,y=e("./utils/arr"),x=y.indexOf,b=y.contains,w=e("./utils/browser"),E=w.wheelEvent;l.interactables=[];var S=function(){function e(t,n){r(this,e),n=n||{},this.target=t,this.events=new c,this._context=n.context||l.document,this._win=m(g(t)?this._context:t),this._doc=this._win.document,u.fire("new",{target:t,options:n,interactable:this,win:this._win}),l.addDocument(this._doc,this._win),l.interactables.push(this),this.set(n)}return e.prototype.setOnEvents=function(e,t){var n="on"+e;return i.function(t.onstart)&&(this.events[n+"start"]=t.onstart),i.function(t.onmove)&&(this.events[n+"move"]=t.onmove),i.function(t.onend)&&(this.events[n+"end"]=t.onend),i.function(t.oninertiastart)&&(this.events[n+"inertiastart"]=t.oninertiastart),this},e.prototype.setPerAction=function(e,t){for(var n in t)n in p[e]&&(i.object(t[n])?(this.options[e][n]=s(this.options[e][n]||{},t[n]),i.object(p.perAction[n])&&"enabled"in p.perAction[n]&&(this.options[e][n].enabled=!1!==t[n].enabled)):i.bool(t[n])&&i.object(p.perAction[n])?this.options[e][n].enabled=t[n]:void 0!==t[n]&&(this.options[e][n]=t[n]))},e.prototype.getRect=function(e){return e=e||this.target,i.string(this.target)&&!i.element(e)&&(e=this._context.querySelector(this.target)),f(e)},e.prototype.rectChecker=function(e){return i.function(e)?(this.getRect=e,this):null===e?(delete this.options.getRect,this):this.getRect},e.prototype._backCompatOption=function(e,t){if(g(t)||i.object(t)){this.options[e]=t;for(var n=a.names,r=Array.isArray(n),o=0,n=r?n:n[Symbol.iterator]();;){var s;if(r){if(o>=n.length)break;s=n[o++]}else{if(o=n.next(),o.done)break;s=o.value}var l=s;this.options[l][e]=t}return this}return this.options[e]},e.prototype.origin=function(e){return this._backCompatOption("origin",e)},e.prototype.deltaSource=function(e){return"page"===e||"client"===e?(this.options.deltaSource=e,this):this.options.deltaSource},e.prototype.context=function(){return this._context},e.prototype.inContext=function(e){return this._context===e.ownerDocument||v(this._context,e)},e.prototype.fire=function(e){return this.events.fire(e),this},e.prototype._onOffMultiple=function(e,t,n,r){if(i.string(t)&&-1!==t.search(" ")&&(t=t.trim().split(/ +/)),i.array(t)){for(var o=0;o=l.length)break;f=l[d++]}else{if(d=l.next(),d.done)break;f=d.value}var v=f;this.options[v]=p.base[v],v in t&&this[v](t[v])}return u.fire("set",{options:t,interactable:this}),this},e.prototype.unset=function(){if(o.remove(this.target,"all"),i.string(this.target))for(var e in o.delegatedEvents){var t=o.delegatedEvents[e];t.selectors[0]===this.target&&t.contexts[0]===this._context&&(t.selectors.splice(0,1),t.contexts.splice(0,1),t.listeners.splice(0,1),t.selectors.length||(t[e]=null)),o.remove(this._context,e,o.delegateListener),o.remove(this._context,e,o.delegateUseCapture,!0)}else o.remove(this,"all");u.fire("unset",{interactable:this}),l.interactables.splice(x(l.interactables,this),1);for(var n=l.interactions||[],r=Array.isArray(n),s=0,n=r?n:n[Symbol.iterator]();;){var a;if(r){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var c=a;c.target===this&&c.interacting()&&c.stop()}return l.interact},e}();l.interactables.indexOfElement=function(e,t){t=t||l.document;for(var n=0;n=y.length)break;w=y[b++]}else{if(b=y.next(),b.done)break;w=b.value}var E=w,S=E[0],T=E[1];T._updateEventTargets(r,i),T[e](S,t,r,i)}}}function o(e){for(var t=0;te.pointerMoveTolerance);var a={pointer:t,pointerIndex:this.getPointerIndex(t),event:n,eventTarget:r,dx:o,dy:s,duplicate:i,interaction:this,interactingBeforeMove:this.interacting()};i||l.setCoordDeltas(this.pointerDelta,this.prevCoords,this.curCoords),d.fire("move",a),i||(this.interacting()&&this.doMove(a),this.pointerWasMoved&&l.copyCoords(this.prevCoords,this.curCoords))},e.prototype.doMove=function(e){e=l.extend({pointer:this.pointers[0],event:this.prevEvent,eventTarget:this._eventTarget,interaction:this},e||{}),d.fire("before-action-move",e),this._dontFireMove||d.fire("action-move",e),this._dontFireMove=!1},e.prototype.pointerUp=function(e,t,n,r){var i=this.getPointerIndex(e);d.fire(/cancel$/i.test(t.type)?"cancel":"up",{pointer:e,pointerIndex:i,event:t,eventTarget:n,curEventTarget:r,interaction:this}),this.simulation||this.end(t),this.pointerIsDown=!1,this.removePointer(e,t)},e.prototype.end=function(e){e=e||this.prevEvent,this.interacting()&&d.fire("action-end",{event:e,interaction:this}),this.stop()},e.prototype.currentAction=function(){return this._interacting?this.prepared.name:null},e.prototype.interacting=function(){return this._interacting},e.prototype.stop=function(){d.fire("stop",{interaction:this}),this._interacting&&(d.fire("stop-active",{interaction:this}),d.fire("stop-"+this.prepared.name,{interaction:this})),this.target=this.element=null,this._interacting=!1,this.prepared.name=this.prevEvent=null},e.prototype.getPointerIndex=function(e){return l.indexOf(this.pointerIds,l.getPointerId(e))},e.prototype.updatePointer=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:t&&/(down|start)$/i.test(t.type),r=l.getPointerId(e),i=this.getPointerIndex(e);return-1===i&&(i=this.pointerIds.length,this.pointerIds[i]=r),n&&d.fire("update-pointer-down",{pointer:e,event:t,down:n,pointerId:r,pointerIndex:i,interaction:this}),this.pointers[i]=e,i},e.prototype.removePointer=function(e,t){var n=l.getPointerId(e),r=this.mouse?0:l.indexOf(this.pointerIds,n);-1!==r&&(d.fire("remove-pointer",{pointer:e,event:t,pointerIndex:r,interaction:this}),this.pointers.splice(r,1),this.pointerIds.splice(r,1),this.downTargets.splice(r,1),this.downTimes.splice(r,1))},e.prototype._updateEventTargets=function(e,t){this._eventTarget=e,this._curEventTarget=t},e}(),m=0,y=v.length;m=i.length)break;a=i[s++]}else{if(s=i.next(),s.done)break;a=s.value}var l=a;if(l.options.drop.enabled){var c=l.options.drop.accept;if(!(p.is.element(c)&&c!==t||p.is.string(c)&&!p.matchesSelector(t,c)))for(var d=p.is.string(l.target)?l._context.querySelectorAll(l.target):[l.target],f=0;fo.left&&c.xo.top&&c.y=o.left&&v<=o.right&&g>=o.top&&g<=o.bottom}if(f&&p.is.number(a)){s=Math.max(0,Math.min(o.right,f.right)-Math.max(o.left,f.left))*Math.max(0,Math.min(o.bottom,f.bottom)-Math.max(o.top,f.top))/(f.width*f.height)>=a}return this.options.drop.checker&&(s=this.options.drop.checker(e,t,s,this,i,n,r)),s},v.signals.on("unset",function(e){e.interactable.dropzone(!1)}),v.settingsMethods.push("dropChecker"),g.signals.on("new",function(e){e.dropTarget=null,e.dropElement=null,e.prevDropTarget=null,e.prevDropElement=null,e.dropEvents=null,e.activeDrops={dropzones:[],elements:[],rects:[]}}),g.signals.on("stop",function(e){var t=e.interaction;t.dropTarget=t.dropElement=t.prevDropTarget=t.prevDropElement=null}),d.dynamicDrop=function(e){return p.is.bool(e)?(y=e,d):y},p.merge(v.eventTypes,["dragenter","dragleave","dropactivate","dropdeactivate","dropmove","drop"]),c.methodDict.drop="dropzone",h.drop=m.defaults,t.exports=m},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../interact":21,"../scope":34,"../utils":44,"./base":6}],9:[function(e,t,n){"use strict";var r=e("./base"),i=e("../utils"),o=e("../InteractEvent"),s=e("../Interactable"),a=e("../Interaction"),l=e("../defaultOptions"),c={defaults:{enabled:!1,origin:null,restrict:null},checker:function(e,t,n,r,i){return i.pointerIds.length>=2?{name:"gesture"}:null},getCursor:function(){return""}};o.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;"gesturestart"===t.type&&(t.ds=0,n.gesture.startDistance=n.gesture.prevDistance=t.distance,n.gesture.startAngle=n.gesture.prevAngle=t.angle,n.gesture.scale=1)}),o.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;"gesturemove"===t.type&&(t.ds=t.scale-n.gesture.scale,n.target.fire(t),n.gesture.prevAngle=t.angle,n.gesture.prevDistance=t.distance,t.scale===1/0||null===t.scale||void 0===t.scale||isNaN(t.scale)||(n.gesture.scale=t.scale))}),s.prototype.gesturable=function(e){return i.is.object(e)?(this.options.gesture.enabled=!1!==e.enabled,this.setPerAction("gesture",e),this.setOnEvents("gesture",e),this):i.is.bool(e)?(this.options.gesture.enabled=e,e||(this.ongesturestart=this.ongesturestart=this.ongestureend=null),this):this.options.gesture},o.signals.on("set-delta",function(e){var t=e.interaction,n=e.iEvent,r=e.action,s=e.event,a=e.starting,l=e.ending,c=e.deltaSource;if("gesture"===r){var p=t.pointers;n.touches=[p[0],p[1]],a?(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=1,n.ds=0,n.angle=i.touchAngle(p,void 0,c),n.da=0):l||s instanceof o?(n.distance=t.prevEvent.distance,n.box=t.prevEvent.box,n.scale=t.prevEvent.scale,n.ds=n.scale-1,n.angle=t.prevEvent.angle,n.da=n.angle-t.gesture.startAngle):(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=n.distance/t.gesture.startDistance,n.angle=i.touchAngle(p,t.gesture.prevAngle,c),n.ds=n.scale-t.gesture.prevScale,n.da=n.angle-t.gesture.prevAngle)}}),a.signals.on("new",function(e){e.gesture={start:{x:0,y:0},startDistance:0,prevDistance:0,distance:0,scale:1,startAngle:0,prevAngle:0}}),r.gesture=c,r.names.push("gesture"),i.merge(s.eventTypes,["gesturestart","gesturemove","gestureend"]),r.methodDict.gesture="gesturable",l.gesture=c.defaults,t.exports=c},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"./base":6}],10:[function(e,t,n){"use strict";function r(e,t,n,r,i,s,a){if(!t)return!1;if(!0===t){var l=o.is.number(s.width)?s.width:s.right-s.left,c=o.is.number(s.height)?s.height:s.bottom-s.top;if(l<0&&("left"===e?e="right":"right"===e&&(e="left")),c<0&&("top"===e?e="bottom":"bottom"===e&&(e="top")),"left"===e)return n.x<(l>=0?s.left:s.right)+a;if("top"===e)return n.y<(c>=0?s.top:s.bottom)+a;if("right"===e)return n.x>(l>=0?s.right:s.left)-a;if("bottom"===e)return n.y>(c>=0?s.bottom:s.top)-a}return!!o.is.element(r)&&(o.is.element(t)?t===r:o.matchesUpTo(r,t,i))}var i=e("./base"),o=e("../utils"),s=e("../utils/browser"),a=e("../InteractEvent"),l=e("../Interactable"),c=e("../Interaction"),p=e("../defaultOptions"),u=s.supportsTouch||s.supportsPointerEvent?20:10,d={defaults:{enabled:!1,mouseButtons:null,origin:null,snap:null,restrict:null,inertia:null,autoScroll:null,square:!1,preserveAspectRatio:!1,axis:"xy",margin:NaN,edges:null,invert:"none"},checker:function(e,t,n,i,s,a){if(!a)return null;var l=o.extend({},s.curCoords.page),c=n.options;if(c.resize.enabled){var p=c.resize,d={left:!1,right:!1,top:!1,bottom:!1};if(o.is.object(p.edges)){for(var f in d)d[f]=r(f,p.edges[f],l,s._eventTarget,i,a,p.margin||u);if(d.left=d.left&&!d.right,d.top=d.top&&!d.bottom,d.left||d.right||d.top||d.bottom)return{name:"resize",edges:d}}else{var v="y"!==c.resize.axis&&l.x>a.right-u,g="x"!==c.resize.axis&&l.y>a.bottom-u;if(v||g)return{name:"resize",axes:(v?"x":"")+(g?"y":"")}}}return null},cursors:s.isIe9OrOlder?{x:"e-resize",y:"s-resize",xy:"se-resize",top:"n-resize",left:"w-resize",bottom:"s-resize",right:"e-resize",topleft:"se-resize",bottomright:"se-resize",topright:"ne-resize",bottomleft:"ne-resize"}:{x:"ew-resize",y:"ns-resize",xy:"nwse-resize",top:"ns-resize",left:"ew-resize",bottom:"ns-resize",right:"ew-resize",topleft:"nwse-resize",bottomright:"nwse-resize",topright:"nesw-resize",bottomleft:"nesw-resize"},getCursor:function(e){if(e.axis)return d.cursors[e.name+e.axis];if(e.edges){for(var t="",n=["top","bottom","left","right"],r=0;r<4;r++)e.edges[n[r]]&&(t+=n[r]);return d.cursors[t]}}};a.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;if("resizestart"===t.type&&n.prepared.edges){var r=n.target.getRect(n.element),i=n.target.options.resize;if(i.square||i.preserveAspectRatio){var s=o.extend({},n.prepared.edges);s.top=s.top||s.left&&!s.bottom,s.left=s.left||s.top&&!s.right,s.bottom=s.bottom||s.right&&!s.top,s.right=s.right||s.bottom&&!s.left,n.prepared._linkedEdges=s}else n.prepared._linkedEdges=null;i.preserveAspectRatio&&(n.resizeStartAspectRatio=r.width/r.height),n.resizeRects={start:r,current:o.extend({},r),inverted:o.extend({},r),previous:o.extend({},r),delta:{left:0,right:0,width:0,top:0,bottom:0,height:0}},t.rect=n.resizeRects.inverted,t.deltaRect=n.resizeRects.delta}}),a.signals.on("new",function(e){var t=e.iEvent,n=e.phase,r=e.interaction;if("move"===n&&r.prepared.edges){var i=r.target.options.resize,s=i.invert,a="reposition"===s||"negate"===s,l=r.prepared.edges,c=r.resizeRects.start,p=r.resizeRects.current,u=r.resizeRects.inverted,d=r.resizeRects.delta,f=o.extend(r.resizeRects.previous,u),v=l,g=t.dx,h=t.dy;if(i.preserveAspectRatio||i.square){var m=i.preserveAspectRatio?r.resizeStartAspectRatio:1;l=r.prepared._linkedEdges,v.left&&v.bottom||v.right&&v.top?h=-g/m:v.left||v.right?h=g/m:(v.top||v.bottom)&&(g=h*m)}if(l.top&&(p.top+=h),l.bottom&&(p.bottom+=h),l.left&&(p.left+=g),l.right&&(p.right+=g),a){if(o.extend(u,p),"reposition"===s){var y=void 0;u.top>u.bottom&&(y=u.top,u.top=u.bottom,u.bottom=y),u.left>u.right&&(y=u.left,u.left=u.right,u.right=y)}}else u.top=Math.min(p.top,c.bottom),u.bottom=Math.max(p.bottom,c.top),u.left=Math.min(p.left,c.right),u.right=Math.max(p.right,c.left);u.width=u.right-u.left,u.height=u.bottom-u.top;for(var x in u)d[x]=u[x]-f[x];t.edges=r.prepared.edges,t.rect=u,t.deltaRect=d}}),l.prototype.resizable=function(e){return o.is.object(e)?(this.options.resize.enabled=!1!==e.enabled,this.setPerAction("resize",e),this.setOnEvents("resize",e),/^x$|^y$|^xy$/.test(e.axis)?this.options.resize.axis=e.axis:null===e.axis&&(this.options.resize.axis=p.resize.axis),o.is.bool(e.preserveAspectRatio)?this.options.resize.preserveAspectRatio=e.preserveAspectRatio:o.is.bool(e.square)&&(this.options.resize.square=e.square),this):o.is.bool(e)?(this.options.resize.enabled=e,e||(this.onresizestart=this.onresizestart=this.onresizeend=null),this):this.options.resize},c.signals.on("new",function(e){ -e.resizeAxes="xy"}),a.signals.on("set-delta",function(e){var t=e.interaction,n=e.iEvent;"resize"===e.action&&t.resizeAxes&&(t.target.options.resize.square?("y"===t.resizeAxes?n.dx=n.dy:n.dy=n.dx,n.axes="xy"):(n.axes=t.resizeAxes,"x"===t.resizeAxes?n.dy=0:"y"===t.resizeAxes&&(n.dx=0)))}),i.resize=d,i.names.push("resize"),o.merge(l.eventTypes,["resizestart","resizemove","resizeinertiastart","resizeinertiaresume","resizeend"]),i.methodDict.resize="resizable",p.resize=d.defaults,t.exports=d},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"../utils/browser":37,"./base":6}],11:[function(e,t,n){"use strict";var r=e("./utils/raf"),i=e("./utils/window").getWindow,o=e("./utils/is"),s=e("./utils/domUtils"),a=e("./Interaction"),l=e("./defaultOptions"),c={defaults:{enabled:!1,container:null,margin:60,speed:300},interaction:null,i:null,x:0,y:0,isScrolling:!1,prevTime:0,start:function(e){c.isScrolling=!0,r.cancel(c.i),c.interaction=e,c.prevTime=(new Date).getTime(),c.i=r.request(c.scroll)},stop:function(){c.isScrolling=!1,r.cancel(c.i)},scroll:function(){var e=c.interaction.target.options[c.interaction.prepared.name].autoScroll,t=e.container||i(c.interaction.element),n=(new Date).getTime(),s=(n-c.prevTime)/1e3,a=e.speed*s;a>=1&&(o.window(t)?t.scrollBy(c.x*a,c.y*a):t&&(t.scrollLeft+=c.x*a,t.scrollTop+=c.y*a),c.prevTime=n),c.isScrolling&&(r.cancel(c.i),c.i=r.request(c.scroll))},check:function(e,t){var n=e.options;return n[t].autoScroll&&n[t].autoScroll.enabled},onInteractionMove:function(e){var t=e.interaction,n=e.pointer;if(t.interacting()&&c.check(t.target,t.prepared.name)){if(t.simulation)return void(c.x=c.y=0);var r=void 0,a=void 0,l=void 0,p=void 0,u=t.target.options[t.prepared.name].autoScroll,d=u.container||i(t.element);if(o.window(d))p=n.clientXd.innerWidth-c.margin,l=n.clientY>d.innerHeight-c.margin;else{var f=s.getElementClientRect(d);p=n.clientXf.right-c.margin,l=n.clientY>f.bottom-c.margin}c.x=a?1:p?-1:0,c.y=l?1:r?-1:0,c.isScrolling||(c.margin=u.margin,c.speed=u.speed,c.start(t))}}};a.signals.on("stop-active",function(){c.stop()}),a.signals.on("action-move",c.onInteractionMove),l.perAction.autoScroll=c.defaults,t.exports=c},{"./Interaction":5,"./defaultOptions":18,"./utils/domUtils":39,"./utils/is":46,"./utils/raf":50,"./utils/window":52}],12:[function(e,t,n){"use strict";var r=e("../Interactable"),i=e("../actions/base"),o=e("../utils/is"),s=e("../utils/domUtils");r.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},r.prototype.ignoreFrom=function(e){return this._backCompatOption("ignoreFrom",e)},r.prototype.allowFrom=function(e){return this._backCompatOption("allowFrom",e)},r.prototype.testIgnore=function(e,t,n){return!(!e||!o.element(n))&&(o.string(e)?s.matchesUpTo(n,e,t):!!o.element(e)&&s.nodeContains(e,n))},r.prototype.testAllow=function(e,t,n){return!e||!!o.element(n)&&(o.string(e)?s.matchesUpTo(n,e,t):!!o.element(e)&&s.nodeContains(e,n))},r.prototype.testIgnoreAllow=function(e,t,n){return!this.testIgnore(e.ignoreFrom,t,n)&&this.testAllow(e.allowFrom,t,n)},r.prototype.actionChecker=function(e){return o.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},r.prototype.styleCursor=function(e){return o.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},r.prototype.defaultActionChecker=function(e,t,n,r){for(var o=this.getRect(r),s=null,a=i.names,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var u=p;if((!n.pointerIsDown||!n.mouse||0!=(t.buttons&this.options[u].mouseButtons))&&(s=i[u].checker(e,t,this,r,n,o)))return s}}},{"../Interactable":4,"../actions/base":6,"../utils/domUtils":39,"../utils/is":46}],13:[function(e,t,n){"use strict";function r(e,t,n,r){return g.is.object(e)&&t.testIgnoreAllow(t.options[e.name],n,r)&&t.options[e.name].enabled&&a(t,n,e)?e:null}function i(e,t,n,i,o,s){for(var a=0,l=i.length;a=m.maxInteractions)return!1;if(u.target===e){if((a+=d===n.name|0)>=i)return!1;if(u.element===t&&(l++,d!==n.name||l>=o))return!1}}}return m.maxInteractions>0}}var l=e("../interact"),c=e("../Interactable"),p=e("../Interaction"),u=e("../actions/base"),d=e("../defaultOptions"),f=e("../utils/browser"),v=e("../scope"),g=e("../utils"),h=e("../utils/Signals").new();e("./InteractableMethods");var m={signals:h,withinInteractionLimit:a,maxInteractions:1/0,defaults:{perAction:{manualStart:!1,max:1/0,maxPerElement:1,allowFrom:null,ignoreFrom:null}},setActionDefaults:function(e){g.extend(e.defaults,m.defaults.perAction)}};p.signals.on("down",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;if(!t.interacting()){s(t,o(t,n,r,i))}}),p.signals.on("move",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;if(t.mouse&&!t.pointerIsDown&&!t.interacting()){s(t,o(t,n,r,i))}}),p.signals.on("move",function(e){var t=e.interaction,n=e.event;if(t.pointerIsDown&&!t.interacting()&&t.pointerWasMoved&&t.prepared.name){h.fire("before-start",e);var r=t.target;t.prepared.name&&r&&(r.options[t.prepared.name].manualStart||!a(r,t.element,t.prepared)?t.stop(n):t.start(t.prepared,r,t.element))}}),p.signals.on("stop",function(e){var t=e.interaction,n=t.target;n&&n.options.styleCursor&&(n._doc.documentElement.style.cursor="")}),c.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},c.prototype.actionChecker=function(e){return g.is.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},c.prototype.styleCursor=function(e){return g.is.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},c.prototype.defaultActionChecker=function(e,t,n,r){for(var i=this.getRect(r),o=t.buttons||{0:1,1:4,3:8,4:16}[t.button],s=null,a=u.names,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var d=p;if((!n.pointerIsDown||!n.mouse||0!=(o&this.options[d].mouseButtons))&&(s=u[d].checker(e,t,this,r,n,i)))return s}},l.maxInteractions=function(e){return g.is.number(e)?(m.maxInteractions=e,this):m.maxInteractions},c.settingsMethods.push("styleCursor"),c.settingsMethods.push("actionChecker"),c.settingsMethods.push("ignoreFrom"),c.settingsMethods.push("allowFrom"),d.base.actionChecker=null,d.base.styleCursor=!0,g.extend(d.perAction,m.defaults.perAction),t.exports=m},{"../Interactable":4,"../Interaction":5,"../actions/base":6,"../defaultOptions":18,"../interact":21,"../scope":34,"../utils":44,"../utils/Signals":35,"../utils/browser":37,"./InteractableMethods":12}],14:[function(e,t,n){"use strict";var r=e("./base"),i=e("../Interaction");i.signals.on("new",function(e){e.delayTimer=null}),r.signals.on("prepared",function(e){var t=e.interaction,n=t.prepared.name;if(n){var r=t.target.options[n].delay;r>0&&(t.delayTimer=setTimeout(function(){t.start(t.prepared,t.target,t.element)},r))}}),i.signals.on("move",function(e){var t=e.interaction,n=e.duplicate;t.pointerWasMoved&&!n&&clearTimeout(t.delayTimer)}),r.signals.on("before-start",function(e){var t=e.interaction,n=t.prepared.name;if(n){t.target.options[n].delay>0&&(t.prepared.name=null)}})},{"../Interaction":5,"./base":13}],15:[function(e,t,n){"use strict";function r(e,t){if(!t)return!1;var n=t.options.drag.startAxis;return"xy"===e||"xy"===n||n===e}var i=e("./base"),o=e("../scope"),s=e("../utils/browser"),a=e("../utils/is"),l=e("../utils/domUtils"),c=l.matchesSelector,p=l.parentNode;i.setActionDefaults(e("../actions/drag")),i.signals.on("before-start",function(e){var t=e.interaction,n=e.eventTarget,l=e.dx,u=e.dy;if("drag"===t.prepared.name){var d=Math.abs(l),f=Math.abs(u),v=t.target.options.drag,g=v.startAxis,h=d>f?"x":dl.minSpeed&&g>l.endSpeed,b={interaction:t,pageCoords:v,statuses:f,preEnd:!0,requireEndOnly:!0};y&&!x&&(c.resetStatuses(f),m=c.setAll(b),m.shouldMove&&m.locked&&(h=!0)),(x||h)&&(p.copyCoords(i.upCoords,t.curCoords),t.pointers[0]=i.startEvent=new a(t,n,t.prepared.name,"inertiastart",t.element),i.t0=d,i.active=!0,i.allowResume=l.allowResume,t.simulation=i,o.fire(i.startEvent),x?(i.vx0=t.pointerDelta.client.vx,i.vy0=t.pointerDelta.client.vy,i.v0=g,r(t,i),p.extend(v,t.curCoords.page),v.x+=i.xe,v.y+=i.ye,c.resetStatuses(f),m=c.setAll(b),i.modifiedXe+=m.dx,i.modifiedYe+=m.dy,i.i=u.request(t.boundInertiaFrame)):(i.smoothEnd=!0,i.xe=m.dx,i.ye=m.dy,i.sx=i.sy=0,i.i=u.request(t.boundSmoothEndFrame)))}}),l.signals.on("stop-active",function(e){var t=e.interaction,n=t.inertiaStatus;n.active&&(u.cancel(n.i),n.active=!1,t.simulation=null)})},{"./InteractEvent":3,"./Interaction":5,"./modifiers":24,"./utils":44,"./utils/raf":50}],21:[function(e,t,n){"use strict";function r(e,t){var n=a.interactables.get(e,t);return n||(n=new l(e,t),n.events.global=p),n}var i=e("./utils/browser"),o=e("./utils/events"),s=e("./utils"),a=e("./scope"),l=e("./Interactable"),c=e("./Interaction"),p={};r.isSet=function(e,t){return-1!==a.interactables.indexOfElement(e,t&&t.context)},r.on=function(e,t,n){if(s.is.string(e)&&-1!==e.search(" ")&&(e=e.trim().split(/ +/)),s.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.on(f,t,n)}return r}if(s.is.object(e)){for(var v in e)r.on(v,e[v],t);return r}return s.contains(l.eventTypes,e)?p[e]?p[e].push(t):p[e]=[t]:o.add(a.document,e,t,{options:n}),r},r.off=function(e,t,n){if(s.is.string(e)&&-1!==e.search(" ")&&(e=e.trim().split(/ +/)),s.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.off(f,t,n)}return r}if(s.is.object(e)){for(var v in e)r.off(v,e[v],t);return r}if(s.contains(l.eventTypes,e)){var g=void 0;e in p&&-1!==(g=s.indexOf(p[e],t))&&p[e].splice(g,1)}else o.remove(a.document,e,t,n);return r},r.debug=function(){return a},r.getPointerAverage=s.pointerAverage,r.getTouchBBox=s.touchBBox,r.getTouchDistance=s.touchDistance,r.getTouchAngle=s.touchAngle,r.getElementRect=s.getElementRect,r.getElementClientRect=s.getElementClientRect,r.matchesSelector=s.matchesSelector,r.closest=s.closest,r.supportsTouch=function(){return i.supportsTouch},r.supportsPointerEvent=function(){return i.supportsPointerEvent},r.stop=function(e){for(var t=a.interactions.length-1;t>=0;t--)a.interactions[t].stop(e);return r},r.pointerMoveTolerance=function(e){return s.is.number(e)?(c.pointerMoveTolerance=e,this):c.pointerMoveTolerance},r.addDocument=a.addDocument,r.removeDocument=a.removeDocument,a.interact=r,t.exports=r},{"./Interactable":4,"./Interaction":5,"./scope":34,"./utils":44,"./utils/browser":37,"./utils/events":40}],22:[function(e,t,n){"use strict";function r(e){var t=e.interaction,n=e.event;t.target&&t.target.checkAndPreventDefault(n)}var i=e("./Interactable"),o=e("./Interaction"),s=e("./scope"),a=e("./utils/is"),l=e("./utils/events"),c=e("./utils/domUtils"),p=c.nodeContains,u=c.matchesSelector;i.prototype.preventDefault=function(e){return/^(always|never|auto)$/.test(e)?(this.options.preventDefault=e,this):a.bool(e)?(this.options.preventDefault=e?"always":"never",this):this.options.preventDefault},i.prototype.checkAndPreventDefault=function(e){var t=this.options.preventDefault;if("never"!==t)return"always"===t?void e.preventDefault():void(l.supportsOptions||/^(mouse|pointer|touch)*(down|start)/i.test(e.type)||a.element(e.target)&&u(e.target,"input,select,textarea,[contenteditable=true],[contenteditable=true] *")||e.preventDefault())};for(var d=["down","move","up","cancel"],f=0;f=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i;if(o.element&&(o.element===e.target||p(o.element,e.target)))return void o.target.checkAndPreventDefault(e)}}},{"./Interactable":4,"./Interaction":5,"./scope":34,"./utils/domUtils":39,"./utils/events":40,"./utils/is":46}],23:[function(e,t,n){"use strict";function r(e){var t=e.target,n=a.search(e,e.type,t);n&&n.prevTap&&e.clientX===n.prevTap.clientX&&e.clientY===n.prevTap.clientY&&t===n.prevTap.target&&(n.downTargets[0]=t,n.downTimes[0]=(new Date).getTime(),l.fire({interaction:n,event:e,eventTarget:t,pointer:e,type:"tap"}))}var i=e("./scope"),o=e("./utils/events"),s=e("./utils/browser"),a=e("./utils/interactionFinder"),l=e("./pointerEvents/base"),c=e("./utils/window"),p=c.window,u=Object.prototype.toString;if(p.Array.isArray||(p.Array.isArray=function(e){return"[object Array]"===u.call(e)}),String.prototype.trim||(String.prototype.trim=function(){return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")}),s.isIE8){var d=function(e){for(var t=i.interactions,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var o;if(n){if(r>=t.length)break;o=t[r++]}else{if(r=t.next(),r.done)break;o=r.value}var s=o;s.interacting()&&s.target.checkAndPreventDefault(e)}},f=function(e,t){var n=e.doc,i=(e.win,0===t.indexOf("listen")?o.add:o.remove);i(n,"selectstart",d),l&&i(n,"dblclick",r)};i.signals.on("add-document",f),i.signals.on("remove-document",f)}t.exports=null},{"./pointerEvents/base":31,"./scope":34,"./utils/browser":37,"./utils/events":40,"./utils/interactionFinder":45,"./utils/window":52}],24:[function(e,t,n){"use strict";function r(e,t,n){return e&&e.enabled&&(t||!e.endOnly)&&(!n||e.endOnly)}var i=e("../InteractEvent"),o=e("../Interaction"),s=e("../utils/extend"),a={names:[],setOffsets:function(e){var t=e.interaction,n=e.pageCoords,r=t.target,i=t.element,o=t.startOffset,s=r.getRect(i);s?(o.left=n.x-s.left,o.top=n.y-s.top,o.right=s.right-n.x,o.bottom=s.bottom-n.y,"width"in s||(s.width=s.right-s.left),"height"in s||(s.height=s.bottom-s.top)):o.left=o.top=o.right=o.bottom=0,e.rect=s,e.interactable=r,e.element=i;for(var l=0;l=p.length)break;f=p[d++]}else{if(d=p.next(),d.done)break;f=d.value}var v=f,g=a[v],h=t.target.options[t.prepared.name][v];r(h,i,o)&&(e.status=e.status=n[v],e.options=h,e.offset=e.interaction.modifierOffsets[v],g.set(e),e.status.locked&&(l.x+=e.status.dx,l.y+=e.status.dy,c.dx+=e.status.dx,c.dy+=e.status.dy,c.locked=!0))}return c.shouldMove=!e.status||!c.locked||e.status.changed,c},resetStatuses:function(e){for(var t=a.names,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var i;if(n){if(r>=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i,s=e[o]||{};s.dx=s.dy=0,s.modifiedX=s.modifiedY=NaN,s.locked=!1,s.changed=!0,e[o]=s}return e},start:function(e,t){var n=e.interaction,r={interaction:n,pageCoords:("action-resume"===t?n.curCoords:n.startCoords).page,startOffset:n.startOffset,statuses:n.modifierStatuses,preEnd:!1,requireEndOnly:!1};a.setOffsets(r),a.resetStatuses(r.statuses),r.pageCoords=s({},n.startCoords.page),n.modifierResult=a.setAll(r)}};o.signals.on("new",function(e){e.startOffset={left:0,right:0,top:0,bottom:0},e.modifierOffsets={},e.modifierStatuses=a.resetStatuses({}),e.modifierResult=null}),o.signals.on("action-start",a.start),o.signals.on("action-resume",a.start),o.signals.on("before-action-move",function(e){var t=e.interaction,n=e.preEnd,r=e.interactingBeforeMove,i=a.setAll({interaction:t,preEnd:n,pageCoords:t.curCoords.page,statuses:t.modifierStatuses,requireEndOnly:!1});!i.shouldMove&&r&&(t._dontFireMove=!0),t.modifierResult=i}),o.signals.on("action-end",function(e){for(var t=e.interaction,n=e.event,i=0;i=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}var m=h,y=m.x,x=m.y;l.push({x:s.left-i.width*y+u.x,y:s.top-i.height*x+u.y})}else l.push(u);return l},set:function(e){var t=e.interaction,n=e.pageCoords,r=e.status,i=e.options,s=e.offset,a=[],l=void 0,c=void 0,p=void 0;if(r.useStatusXY)c={x:r.x,y:r.y};else{var u=o.getOriginXY(t.target,t.element,t.prepared.name);c=o.extend({},n),c.x-=u.x,c.y-=u.y}r.realX=c.x,r.realY=c.y;for(var d=i.targets?i.targets.length:0,f=s,v=Array.isArray(f),g=0,f=v?f:f[Symbol.iterator]();;){var h;if(v){if(g>=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}for(var m=h,y=m.x,x=m.y,b=c.x-y,w=c.y-x,E=i.targets,S=Array.isArray(E),T=0,E=S?E:E[Symbol.iterator]();;){var C;if(S){if(T>=E.length)break;C=E[T++]}else{if(T=E.next(),T.done)break;C=T.value}var A=C;l=o.is.function(A)?A(b,w,t):A,l&&a.push({x:o.is.number(l.x)?l.x+y:b,y:o.is.number(l.y)?l.y+x:w,range:o.is.number(l.range)?l.range:i.range})}}var D={target:null,inRange:!1,distance:0,range:0,dx:0,dy:0};for(p=0,d=a.length;p=p.length)break;f=p[d++]}else{if(d=p.next(),d.done)break;f=d.value}var v=f,g=void 0;g=a.is.function(v)?v(l,c,t):v,g&&("width"in g&&"height"in g&&(g.x=g.width,g.y=g.height),e.options.targets.push(g))}i.set(e)},modifyCoords:function(e){var t=e.options;e.options=a.extend({},t), -e.options.enabled=t.enabled,e.options.relativePoints=[null],i.modifyCoords(e)}};r.snapSize=l,r.names.push("snapSize"),o.perAction.snapSize=l.defaults,s.defaults.snapSize=l.defaults,t.exports=l},{"../actions/resize":10,"../defaultOptions":18,"../utils/":44,"./index":24,"./snap":28}],30:[function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=e("../utils/pointerUtils");t.exports=function(){function e(t,n,o,s,a){if(r(this,e),i.pointerExtend(this,o),o!==n&&i.pointerExtend(this,n),this.interaction=a,this.timeStamp=(new Date).getTime(),this.originalEvent=o,this.type=t,this.pointerId=i.getPointerId(n),this.pointerType=i.getPointerType(n,a),this.target=s,this.currentTarget=null,"tap"===t){var l=a.getPointerIndex(n);this.dt=this.timeStamp-a.downTimes[l];var c=this.timeStamp-a.tapTime;this.double=!!(a.prevTap&&"doubletap"!==a.prevTap.type&&a.prevTap.target===this.target&&c<500)}else"doubletap"===t&&(this.dt=n.timeStamp-a.tapTime)}return e.prototype.subtractOrigin=function(e){var t=e.x,n=e.y;return this.pageX-=t,this.pageY-=n,this.clientX-=t,this.clientY-=n,this},e.prototype.addOrigin=function(e){var t=e.x,n=e.y;return this.pageX+=t,this.pageY+=n,this.clientX+=t,this.clientY+=n,this},e.prototype.preventDefault=function(){this.originalEvent.preventDefault()},e.prototype.stopPropagation=function(){this.propagationStopped=!0},e.prototype.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},e}()},{"../utils/pointerUtils":49}],31:[function(e,t,n){"use strict";function r(e){for(var t=e.interaction,n=e.pointer,s=e.event,l=e.eventTarget,c=e.type,u=void 0===c?e.pointerEvent.type:c,d=e.targets,f=void 0===d?i(e):d,v=e.pointerEvent,g=void 0===v?new o(u,n,s,l,t):v,h={interaction:t,pointer:n,event:s,eventTarget:l,targets:f,type:u,pointerEvent:g},m=0;m=u.length)break;g=u[v++]}else{if(v=u.next(),v.done)break;g=v.value}var h=g;c.element=h,p.fire("collect-targets",c)}return"hold"===o&&(c.targets=d(c.targets,function(e){return e.eventable.options.holdDuration===t.holdTimers[s].duration})),c.targets}var o=e("./PointerEvent"),s=e("../Interaction"),a=e("../utils"),l=e("../utils/browser"),c=e("../defaultOptions"),p=e("../utils/Signals").new(),u=e("../utils/arr"),d=u.filter,f=["down","up","cancel"],v=["down","up","cancel"],g={PointerEvent:o,fire:r,collectEventTargets:i,signals:p,defaults:{holdDuration:600,ignoreFrom:null,allowFrom:null,origin:{x:0,y:0}},types:["down","move","up","cancel","tap","doubletap","hold"]};s.signals.on("update-pointer-down",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers[n]={duration:1/0,timeout:null}}),s.signals.on("remove-pointer",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers.splice(n,1)}),s.signals.on("move",function(e){var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,s=e.duplicateMove,a=t.getPointerIndex(n);s||t.pointerIsDown&&!t.pointerWasMoved||(t.pointerIsDown&&clearTimeout(t.holdTimers[a].timeout),r({interaction:t,pointer:n,event:i,eventTarget:o,type:"move"}))}),s.signals.on("down",function(e){for(var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,s=e.pointerIndex,c=l.isIE8?a.extend({},i):i,u=t.holdTimers[s],d=a.getPath(o),f={interaction:t,pointer:n,event:i,eventTarget:o,type:"hold",targets:[],path:d,element:null},v=d,g=Array.isArray(v),h=0,v=g?v:v[Symbol.iterator]();;){var m;if(g){if(h>=v.length)break;m=v[h++]}else{if(h=v.next(),h.done)break;m=h.value}var y=m;f.element=y,p.fire("collect-targets",f)}if(f.targets.length){for(var x=1/0,b=0;b=0&&(p.selectors[u]!==e||p.contexts[u]!==t);u--);-1===u&&(u=p.selectors.length,p.selectors.push(e),p.contexts.push(t),p.listeners.push([])),p.listeners[u].push([i,!!s.capture,s.passive])}function s(e,t,n,r,o){var s=f(o),c=O[n],p=!1,u=void 0;if(c)for(u=c.selectors.length-1;u>=0;u--)if(c.selectors[u]===e&&c.contexts[u]===t){for(var d=c.listeners[u],v=d.length-1;v>=0;v--){var g=d[v],h=g[0],m=g[1],y=g[2];if(h===r&&m===!!s.capture&&y===s.passive){d.splice(v,1),d.length||(c.selectors.splice(u,1),c.contexts.splice(u,1),c.listeners.splice(u,1),i(t,n,a),i(t,n,l,!0),c.selectors.length||(O[n]=null)),p=!0;break}}if(p)break}}function a(e,t){var n=f(t),r={},i=O[e.type],o=g.getActualElement(e.path?e.path[0]:e.target),s=o;for(h(r,e),r.originalEvent=e,r.preventDefault=p;v.element(s);){for(var a=0;a=l.length)break;u=l[p++]}else{if(p=l.next(),p.done)break;u=p.value}var d=u,f=s[d](a);if(f)return f}},simulationResume:function(e){var t=e.mouseEvent,n=e.eventType,o=e.eventTarget;if(!/down|start/i.test(n))return null;for(var s=r.interactions,a=Array.isArray(s),l=0,s=a?s:s[Symbol.iterator]();;){var c;if(a){if(l>=s.length)break;c=s[l++]}else{if(l=s.next(),l.done)break;c=l.value}var p=c,u=o;if(p.simulation&&p.simulation.allowResume&&p.mouse===t)for(;u;){if(u===p.element)return p;u=i.parentNode(u)}}return null},mouse:function(e){var t=e.pointerId,n=e.mouseEvent,s=e.eventType;if(!n&&(o.supportsTouch||o.supportsPointerEvent))return null;for(var a=void 0,l=r.interactions,c=Array.isArray(l),p=0,l=c?l:l[Symbol.iterator]();;){var u;if(c){if(p>=l.length)break;u=l[p++]}else{if(p=l.next(),p.done)break;u=p.value}var d=u;if(d.mouse){if(d.simulation&&!i.contains(d.pointerIds,t))continue;if(d.interacting())return d;a||(a=d)}}if(a)return a;for(var f=r.interactions,v=Array.isArray(f),g=0,f=v?f:f[Symbol.iterator]();;){var h;if(v){if(g>=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}var m=h;if(m.mouse&&(!/down/.test(s)||!m.simulation))return m}return null},hasPointer:function(e){for(var t=e.pointerId,n=r.interactions,o=Array.isArray(n),s=0,n=o?n:n[Symbol.iterator]();;){var a;if(o){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var l=a;if(i.contains(l.pointerIds,t))return l}},idle:function(e){for(var t=e.mouseEvent,n=r.interactions,i=Array.isArray(n),o=0,n=i?n:n[Symbol.iterator]();;){var s;if(i){if(o>=n.length)break;s=n[o++]}else{if(o=n.next(),o.done)break;s=o.value}var a=s;if(1===a.pointerIds.length){var l=a.target;if(l&&!l.options.gesture.enabled)continue}else if(a.pointerIds.length>=2)continue;if(!a.interacting()&&t===a.mouse)return a}return null}};t.exports=s},{"../scope":34,"./browser":37,"./index":44}],46:[function(e,t,n){"use strict";var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},i=e("./window"),o=e("./isWindow"),s={array:function(){},window:function(e){return e===i.window||o(e)},docFrag:function(e){return s.object(e)&&11===e.nodeType},object:function(e){return!!e&&"object"===(void 0===e?"undefined":r(e))},function:function(e){return"function"==typeof e},number:function(e){return"number"==typeof e},bool:function(e){return"boolean"==typeof e},string:function(e){return"string"==typeof e},element:function(e){if(!e||"object"!==(void 0===e?"undefined":r(e)))return!1;var t=i.getWindow(e)||i.window;return/object|function/.test(r(t.Element))?e instanceof t.Element:1===e.nodeType&&"string"==typeof e.nodeName}};s.array=function(e){return s.object(e)&&void 0!==e.length&&s.function(e.splice)},t.exports=s},{"./isWindow":47,"./window":52}],47:[function(e,t,n){"use strict";t.exports=function(e){return!(!e||!e.Window)&&e instanceof e.Window}},{}],48:[function(e,t,n){"use strict";function r(e,n){for(var r in n){var i=t.exports.prefixedPropREs,o=!1;for(var s in i)if(0===r.indexOf(s)&&i[s].test(r)){o=!0;break}o||"function"==typeof n[r]||(e[r]=n[r])}return e}r.prefixedPropREs={webkit:/(Movement[XY]|Radius[XY]|RotationAngle|Force)$/},t.exports=r},{}],49:[function(e,t,n){"use strict";var r=e("./hypot"),i=e("./browser"),o=e("./domObjects"),s=e("./domUtils"),a=e("./is"),l=e("./pointerExtend"),c={copyCoords:function(e,t){e.page=e.page||{},e.page.x=t.page.x,e.page.y=t.page.y,e.client=e.client||{},e.client.x=t.client.x,e.client.y=t.client.y,e.timeStamp=t.timeStamp},setCoordDeltas:function(e,t,n){e.page.x=n.page.x-t.page.x,e.page.y=n.page.y-t.page.y,e.client.x=n.client.x-t.client.x,e.client.y=n.client.y-t.client.y,e.timeStamp=n.timeStamp-t.timeStamp;var i=Math.max(e.timeStamp/1e3,.001);e.page.speed=r(e.page.x,e.page.y)/i,e.page.vx=e.page.x/i,e.page.vy=e.page.y/i,e.client.speed=r(e.client.x,e.page.y)/i,e.client.vx=e.client.x/i,e.client.vy=e.client.y/i},isNativePointer:function(e){return e instanceof o.Event||e instanceof o.Touch},getXY:function(e,t,n){return n=n||{},e=e||"page",n.x=t[e+"X"],n.y=t[e+"Y"],n},getPageXY:function(e,t){return t=t||{},i.isOperaMobile&&c.isNativePointer(e)?(c.getXY("screen",e,t),t.x+=window.scrollX,t.y+=window.scrollY):c.getXY("page",e,t),t},getClientXY:function(e,t){return t=t||{},i.isOperaMobile&&c.isNativePointer(e)?c.getXY("screen",e,t):c.getXY("client",e,t),t},getPointerId:function(e){return a.number(e.pointerId)?e.pointerId:e.identifier},setCoords:function(e,t,n){var r=t.length>1?c.pointerAverage(t):t[0],i={};c.getPageXY(r,i),e.page.x=i.x,e.page.y=i.y,c.getClientXY(r,i),e.client.x=i.x,e.client.y=i.y,e.timeStamp=a.number(n)?n:(new Date).getTime()},pointerExtend:l,getTouchPair:function(e){var t=[];return a.array(e)?(t[0]=e[0],t[1]=e[1]):"touchend"===e.type?1===e.touches.length?(t[0]=e.touches[0],t[1]=e.changedTouches[0]):0===e.touches.length&&(t[0]=e.changedTouches[0],t[1]=e.changedTouches[1]):(t[0]=e.touches[0],t[1]=e.touches[1]),t},pointerAverage:function(e){for(var t={pageX:0,pageY:0,clientX:0,clientY:0,screenX:0,screenY:0},n=e,r=Array.isArray(n),i=0,n=r?n:n[Symbol.iterator]();;){var o;if(r){if(i>=n.length)break;o=n[i++]}else{if(i=n.next(),i.done)break;o=i.value}var s=o;for(var a in t)t[a]+=s[a]}for(var l in t)t[l]/=e.length;return t},touchBBox:function(e){if(e.length||e.touches&&e.touches.length>1){var t=c.getTouchPair(e),n=Math.min(t[0].pageX,t[1].pageX),r=Math.min(t[0].pageY,t[1].pageY);return{x:n,y:r,left:n,top:r,width:Math.max(t[0].pageX,t[1].pageX)-n,height:Math.max(t[0].pageY,t[1].pageY)-r}}},touchDistance:function(e,t){var n=t+"X",i=t+"Y",o=c.getTouchPair(e),s=o[0][n]-o[1][n],a=o[0][i]-o[1][i];return r(s,a)},touchAngle:function(e,t,n){var r=n+"X",i=n+"Y",o=c.getTouchPair(e),s=o[1][r]-o[0][r],a=o[1][i]-o[0][i];return 180*Math.atan2(a,s)/Math.PI},getPointerType:function(e,t){return t.mouse?"mouse":i.supportsPointerEvent?a.string(e.pointerType)?e.pointerType:[void 0,void 0,"touch","pen","mouse"][e.pointerType]:"touch"},getEventTargets:function(e){return[s.getActualElement(e.path?e.path[0]:e.target),s.getActualElement(e.currentTarget)]}};t.exports=c},{"./browser":37,"./domObjects":38,"./domUtils":39,"./hypot":43,"./is":46,"./pointerExtend":48}],50:[function(e,t,n){"use strict";for(var r=e("./window"),i=r.window,o=["ms","moz","webkit","o"],s=0,a=void 0,l=void 0,c=0;c6&&void 0!==arguments[6]&&arguments[6];r(this,e);var f=t.target,v=(f&&f.options||s).deltaSource,g=o(f,p,l),h="start"===c,m="end"===c,y=h?t.startCoords:t.curCoords,x=t.prevEvent;p=p||t.element;var b=i({},y.page),w=i({},y.client);b.x-=g.x,b.y-=g.y,w.x-=g.x,w.y-=g.y,this.ctrlKey=n.ctrlKey,this.altKey=n.altKey,this.shiftKey=n.shiftKey,this.metaKey=n.metaKey,this.button=n.button,this.buttons=n.buttons,this.target=p,this.currentTarget=p,this.relatedTarget=u||null,this.preEnd=d,this.type=l+(c||""),this.interaction=t,this.interactable=f,this.t0=h?t.downTimes[t.downTimes.length-1]:x.t0;var E={interaction:t,event:n,action:l,phase:c,element:p,related:u,page:b,client:w,coords:y,starting:h,ending:m,deltaSource:v,iEvent:this};a.fire("set-xy",E),m?(this.pageX=x.pageX,this.pageY=x.pageY,this.clientX=x.clientX,this.clientY=x.clientY):(this.pageX=b.x,this.pageY=b.y,this.clientX=w.x,this.clientY=w.y),this.x0=t.startCoords.page.x-g.x,this.y0=t.startCoords.page.y-g.y,this.clientX0=t.startCoords.client.x-g.x,this.clientY0=t.startCoords.client.y-g.y,a.fire("set-delta",E),this.timeStamp=y.timeStamp,this.dt=t.pointerDelta.timeStamp,this.duration=this.timeStamp-this.t0,this.speed=t.pointerDelta[v].speed,this.velocityX=t.pointerDelta[v].vx,this.velocityY=t.pointerDelta[v].vy,this.swipe=m||"inertiastart"===c?this.getSwipe():null,a.fire("new",E)}return e.prototype.getSwipe=function(){var e=this.interaction;if(e.prevEvent.speed<600||this.timeStamp-e.prevEvent.timeStamp>150)return null;var t=180*Math.atan2(e.prevEvent.velocityY,e.prevEvent.velocityX)/Math.PI;t<0&&(t+=360);var n=112.5<=t&&t<247.5,r=202.5<=t&&t<337.5,i=!n&&(292.5<=t||t<67.5);return{up:r,down:!r&&22.5<=t&&t<157.5,left:n,right:i,angle:t,speed:e.prevEvent.speed,velocity:{x:e.prevEvent.velocityX,y:e.prevEvent.velocityY}}},e.prototype.preventDefault=function(){},e.prototype.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},e.prototype.stopPropagation=function(){this.propagationStopped=!0},e}();a.on("set-delta",function(e){var t=e.iEvent,n=e.interaction,r=e.starting,i=e.deltaSource,o=r?t:n.prevEvent;"client"===i?(t.dx=t.clientX-o.clientX,t.dy=t.clientY-o.clientY):(t.dx=t.pageX-o.pageX,t.dy=t.pageY-o.pageY)}),l.signals=a,t.exports=l},{"./defaultOptions":18,"./utils/Signals":35,"./utils/extend":41,"./utils/getOriginXY":42}],4:[function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=e("./utils/is"),o=e("./utils/events"),s=e("./utils/extend"),a=e("./actions/base"),l=e("./scope"),c=e("./Eventable"),p=e("./defaultOptions"),u=e("./utils/Signals").new(),d=e("./utils/domUtils"),f=d.getElementRect,v=d.nodeContains,g=d.trySelector,h=e("./utils/window"),m=h.getWindow,y=e("./utils/arr"),x=y.indexOf,b=y.contains,w=e("./utils/browser"),E=w.wheelEvent;l.interactables=[];var S=function(){function e(t,n){r(this,e),n=n||{},this.target=t,this.events=new c,this._context=n.context||l.document,this._win=m(g(t)?this._context:t),this._doc=this._win.document,u.fire("new",{target:t,options:n,interactable:this,win:this._win}),l.addDocument(this._doc,this._win),l.interactables.push(this),this.set(n)}return e.prototype.setOnEvents=function(e,t){var n="on"+e;return i.function(t.onstart)&&(this.events[n+"start"]=t.onstart),i.function(t.onmove)&&(this.events[n+"move"]=t.onmove),i.function(t.onend)&&(this.events[n+"end"]=t.onend),i.function(t.oninertiastart)&&(this.events[n+"inertiastart"]=t.oninertiastart),this},e.prototype.setPerAction=function(e,t){for(var n in t)n in p[e]&&(i.object(t[n])?(this.options[e][n]=s(this.options[e][n]||{},t[n]),i.object(p.perAction[n])&&"enabled"in p.perAction[n]&&(this.options[e][n].enabled=!1!==t[n].enabled)):i.bool(t[n])&&i.object(p.perAction[n])?this.options[e][n].enabled=t[n]:void 0!==t[n]&&(this.options[e][n]=t[n]))},e.prototype.getRect=function(e){return e=e||this.target,i.string(this.target)&&!i.element(e)&&(e=this._context.querySelector(this.target)),f(e)},e.prototype.rectChecker=function(e){return i.function(e)?(this.getRect=e,this):null===e?(delete this.options.getRect,this):this.getRect},e.prototype._backCompatOption=function(e,t){if(g(t)||i.object(t)){this.options[e]=t;for(var n=a.names,r=Array.isArray(n),o=0,n=r?n:n[Symbol.iterator]();;){var s;if(r){if(o>=n.length)break;s=n[o++]}else{if(o=n.next(),o.done)break;s=o.value}var l=s;this.options[l][e]=t}return this}return this.options[e]},e.prototype.origin=function(e){return this._backCompatOption("origin",e)},e.prototype.deltaSource=function(e){return"page"===e||"client"===e?(this.options.deltaSource=e,this):this.options.deltaSource},e.prototype.context=function(){return this._context},e.prototype.inContext=function(e){return this._context===e.ownerDocument||v(this._context,e)},e.prototype.fire=function(e){return this.events.fire(e),this},e.prototype._onOffMultiple=function(e,t,n,r){if(i.string(t)&&-1!==t.search(" ")&&(t=t.trim().split(/ +/)),i.array(t)){for(var o=0;o=l.length)break;f=l[d++]}else{if(d=l.next(),d.done)break;f=d.value}var v=f;this.options[v]=p.base[v],v in t&&this[v](t[v])}return u.fire("set",{options:t,interactable:this}),this},e.prototype.unset=function(){if(o.remove(this.target,"all"),i.string(this.target))for(var e in o.delegatedEvents){var t=o.delegatedEvents[e];t.selectors[0]===this.target&&t.contexts[0]===this._context&&(t.selectors.splice(0,1),t.contexts.splice(0,1),t.listeners.splice(0,1),t.selectors.length||(t[e]=null)),o.remove(this._context,e,o.delegateListener),o.remove(this._context,e,o.delegateUseCapture,!0)}else o.remove(this,"all");u.fire("unset",{interactable:this}),l.interactables.splice(x(l.interactables,this),1);for(var n=l.interactions||[],r=Array.isArray(n),s=0,n=r?n:n[Symbol.iterator]();;){var a;if(r){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var c=a;c.target===this&&c.interacting()&&c.stop()}return l.interact},e}();l.interactables.indexOfElement=function(e,t){t=t||l.document;for(var n=0;n=x.length)break;E=x[w++]}else{if(w=x.next(),w.done)break;E=w.value}var S=E,T=S[0],C=S[1];C._updateEventTargets(i,o),C[e](T,t,i,o)}}}function o(e){for(var t=0;te.pointerMoveTolerance);var a={pointer:t,pointerIndex:this.getPointerIndex(t),event:n,eventTarget:r,dx:o,dy:s,duplicate:i,interaction:this,interactingBeforeMove:this.interacting()};i||l.setCoordDeltas(this.pointerDelta,this.prevCoords,this.curCoords),f.fire("move",a),i||(this.interacting()&&this.doMove(a),this.pointerWasMoved&&l.copyCoords(this.prevCoords,this.curCoords))},e.prototype.doMove=function(e){e=l.extend({pointer:this.pointers[0],event:this.prevEvent,eventTarget:this._eventTarget,interaction:this},e||{}),f.fire("before-action-move",e),this._dontFireMove||f.fire("action-move",e),this._dontFireMove=!1},e.prototype.pointerUp=function(e,t,n,r){var i=this.getPointerIndex(e);f.fire(/cancel$/i.test(t.type)?"cancel":"up",{pointer:e,pointerIndex:i,event:t,eventTarget:n,curEventTarget:r,interaction:this}),this.simulation||this.end(t),this.pointerIsDown=!1,this.removePointer(e,t)},e.prototype.end=function(e){e=e||this.prevEvent,this.interacting()&&f.fire("action-end",{event:e,interaction:this}),this.stop()},e.prototype.currentAction=function(){return this._interacting?this.prepared.name:null},e.prototype.interacting=function(){return this._interacting},e.prototype.stop=function(){f.fire("stop",{interaction:this}),this._interacting&&(f.fire("stop-active",{interaction:this}),f.fire("stop-"+this.prepared.name,{interaction:this})),this.target=this.element=null,this._interacting=!1,this.prepared.name=this.prevEvent=null},e.prototype.getPointerIndex=function(e){return"mouse"===this.pointerType||"pen"===this.pointerType?0:l.indexOf(this.pointerIds,l.getPointerId(e))},e.prototype.updatePointer=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:t&&/(down|start)$/i.test(t.type),r=l.getPointerId(e),i=this.getPointerIndex(e);return-1===i&&(i=this.pointerIds.length,this.pointerIds[i]=r),n&&f.fire("update-pointer-down",{pointer:e,event:t,down:n,pointerId:r,pointerIndex:i,interaction:this}),this.pointers[i]=e,i},e.prototype.removePointer=function(e,t){var n=this.getPointerIndex(e);-1!==n&&(f.fire("remove-pointer",{pointer:e,event:t,pointerIndex:n,interaction:this}),this.pointers.splice(n,1),this.pointerIds.splice(n,1),this.downTargets.splice(n,1),this.downTimes.splice(n,1))},e.prototype._updateEventTargets=function(e,t){this._eventTarget=e,this._curEventTarget=t},e}(),y=0,x=g.length;y=i.length)break;a=i[s++]}else{if(s=i.next(),s.done)break;a=s.value}var l=a;if(l.options.drop.enabled){var c=l.options.drop.accept;if(!(p.is.element(c)&&c!==t||p.is.string(c)&&!p.matchesSelector(t,c)))for(var d=p.is.string(l.target)?l._context.querySelectorAll(l.target):[l.target],f=0;fo.left&&c.xo.top&&c.y=o.left&&v<=o.right&&g>=o.top&&g<=o.bottom}if(f&&p.is.number(a)){s=Math.max(0,Math.min(o.right,f.right)-Math.max(o.left,f.left))*Math.max(0,Math.min(o.bottom,f.bottom)-Math.max(o.top,f.top))/(f.width*f.height)>=a}return this.options.drop.checker&&(s=this.options.drop.checker(e,t,s,this,i,n,r)),s},v.signals.on("unset",function(e){e.interactable.dropzone(!1)}),v.settingsMethods.push("dropChecker"),g.signals.on("new",function(e){e.dropTarget=null,e.dropElement=null,e.prevDropTarget=null,e.prevDropElement=null,e.dropEvents=null,e.activeDrops={dropzones:[],elements:[],rects:[]}}),g.signals.on("stop",function(e){var t=e.interaction;t.dropTarget=t.dropElement=t.prevDropTarget=t.prevDropElement=null}),d.dynamicDrop=function(e){return p.is.bool(e)?(y=e,d):y},p.merge(v.eventTypes,["dragenter","dragleave","dropactivate","dropdeactivate","dropmove","drop"]),c.methodDict.drop="dropzone",h.drop=m.defaults,t.exports=m},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../interact":21,"../scope":34,"../utils":44,"./base":6}],9:[function(e,t,n){"use strict";var r=e("./base"),i=e("../utils"),o=e("../InteractEvent"),s=e("../Interactable"),a=e("../Interaction"),l=e("../defaultOptions"),c={defaults:{enabled:!1,origin:null,restrict:null},checker:function(e,t,n,r,i){return i.pointerIds.length>=2?{name:"gesture"}:null},getCursor:function(){return""}};o.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;"gesturestart"===t.type&&(t.ds=0,n.gesture.startDistance=n.gesture.prevDistance=t.distance,n.gesture.startAngle=n.gesture.prevAngle=t.angle,n.gesture.scale=1)}),o.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;"gesturemove"===t.type&&(t.ds=t.scale-n.gesture.scale,n.target.fire(t),n.gesture.prevAngle=t.angle,n.gesture.prevDistance=t.distance,t.scale===1/0||null===t.scale||void 0===t.scale||isNaN(t.scale)||(n.gesture.scale=t.scale))}),s.prototype.gesturable=function(e){return i.is.object(e)?(this.options.gesture.enabled=!1!==e.enabled,this.setPerAction("gesture",e),this.setOnEvents("gesture",e),this):i.is.bool(e)?(this.options.gesture.enabled=e,e||(this.ongesturestart=this.ongesturestart=this.ongestureend=null),this):this.options.gesture},o.signals.on("set-delta",function(e){var t=e.interaction,n=e.iEvent,r=e.action,s=e.event,a=e.starting,l=e.ending,c=e.deltaSource;if("gesture"===r){var p=t.pointers;n.touches=[p[0],p[1]],a?(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=1,n.ds=0,n.angle=i.touchAngle(p,void 0,c),n.da=0):l||s instanceof o?(n.distance=t.prevEvent.distance,n.box=t.prevEvent.box,n.scale=t.prevEvent.scale,n.ds=n.scale-1,n.angle=t.prevEvent.angle,n.da=n.angle-t.gesture.startAngle):(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=n.distance/t.gesture.startDistance,n.angle=i.touchAngle(p,t.gesture.prevAngle,c),n.ds=n.scale-t.gesture.prevScale,n.da=n.angle-t.gesture.prevAngle)}}),a.signals.on("new",function(e){e.gesture={start:{x:0,y:0},startDistance:0,prevDistance:0,distance:0,scale:1,startAngle:0,prevAngle:0}}),r.gesture=c,r.names.push("gesture"),i.merge(s.eventTypes,["gesturestart","gesturemove","gestureend"]),r.methodDict.gesture="gesturable",l.gesture=c.defaults,t.exports=c},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"./base":6}],10:[function(e,t,n){"use strict";function r(e,t,n,r,i,s,a){if(!t)return!1;if(!0===t){var l=o.is.number(s.width)?s.width:s.right-s.left,c=o.is.number(s.height)?s.height:s.bottom-s.top;if(l<0&&("left"===e?e="right":"right"===e&&(e="left")),c<0&&("top"===e?e="bottom":"bottom"===e&&(e="top")),"left"===e)return n.x<(l>=0?s.left:s.right)+a;if("top"===e)return n.y<(c>=0?s.top:s.bottom)+a;if("right"===e)return n.x>(l>=0?s.right:s.left)-a;if("bottom"===e)return n.y>(c>=0?s.bottom:s.top)-a}return!!o.is.element(r)&&(o.is.element(t)?t===r:o.matchesUpTo(r,t,i))}var i=e("./base"),o=e("../utils"),s=e("../utils/browser"),a=e("../InteractEvent"),l=e("../Interactable"),c=e("../Interaction"),p=e("../defaultOptions"),u=s.supportsTouch||s.supportsPointerEvent?20:10,d={defaults:{enabled:!1,mouseButtons:null,origin:null,snap:null,restrict:null,inertia:null,autoScroll:null,square:!1,preserveAspectRatio:!1,axis:"xy",margin:NaN,edges:null,invert:"none"},checker:function(e,t,n,i,s,a){if(!a)return null;var l=o.extend({},s.curCoords.page),c=n.options;if(c.resize.enabled){var p=c.resize,d={left:!1,right:!1,top:!1,bottom:!1};if(o.is.object(p.edges)){for(var f in d)d[f]=r(f,p.edges[f],l,s._eventTarget,i,a,p.margin||u);if(d.left=d.left&&!d.right,d.top=d.top&&!d.bottom,d.left||d.right||d.top||d.bottom)return{name:"resize",edges:d}}else{var v="y"!==c.resize.axis&&l.x>a.right-u,g="x"!==c.resize.axis&&l.y>a.bottom-u;if(v||g)return{name:"resize",axes:(v?"x":"")+(g?"y":"")}}}return null},cursors:s.isIe9OrOlder?{x:"e-resize",y:"s-resize",xy:"se-resize",top:"n-resize",left:"w-resize",bottom:"s-resize",right:"e-resize",topleft:"se-resize",bottomright:"se-resize",topright:"ne-resize",bottomleft:"ne-resize"}:{x:"ew-resize",y:"ns-resize",xy:"nwse-resize",top:"ns-resize",left:"ew-resize",bottom:"ns-resize",right:"ew-resize",topleft:"nwse-resize",bottomright:"nwse-resize",topright:"nesw-resize",bottomleft:"nesw-resize"},getCursor:function(e){if(e.axis)return d.cursors[e.name+e.axis];if(e.edges){for(var t="",n=["top","bottom","left","right"],r=0;r<4;r++)e.edges[n[r]]&&(t+=n[r]);return d.cursors[t]}}};a.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;if("resizestart"===t.type&&n.prepared.edges){var r=n.target.getRect(n.element),i=n.target.options.resize;if(i.square||i.preserveAspectRatio){var s=o.extend({},n.prepared.edges);s.top=s.top||s.left&&!s.bottom,s.left=s.left||s.top&&!s.right,s.bottom=s.bottom||s.right&&!s.top,s.right=s.right||s.bottom&&!s.left,n.prepared._linkedEdges=s}else n.prepared._linkedEdges=null;i.preserveAspectRatio&&(n.resizeStartAspectRatio=r.width/r.height),n.resizeRects={start:r,current:o.extend({},r),inverted:o.extend({},r),previous:o.extend({},r),delta:{left:0,right:0,width:0,top:0,bottom:0,height:0}},t.rect=n.resizeRects.inverted,t.deltaRect=n.resizeRects.delta}}),a.signals.on("new",function(e){var t=e.iEvent,n=e.phase,r=e.interaction;if("move"===n&&r.prepared.edges){var i=r.target.options.resize,s=i.invert,a="reposition"===s||"negate"===s,l=r.prepared.edges,c=r.resizeRects.start,p=r.resizeRects.current,u=r.resizeRects.inverted,d=r.resizeRects.delta,f=o.extend(r.resizeRects.previous,u),v=l,g=t.dx,h=t.dy;if(i.preserveAspectRatio||i.square){var m=i.preserveAspectRatio?r.resizeStartAspectRatio:1;l=r.prepared._linkedEdges,v.left&&v.bottom||v.right&&v.top?h=-g/m:v.left||v.right?h=g/m:(v.top||v.bottom)&&(g=h*m)}if(l.top&&(p.top+=h),l.bottom&&(p.bottom+=h),l.left&&(p.left+=g),l.right&&(p.right+=g),a){if(o.extend(u,p),"reposition"===s){var y=void 0;u.top>u.bottom&&(y=u.top,u.top=u.bottom,u.bottom=y),u.left>u.right&&(y=u.left,u.left=u.right,u.right=y)}}else u.top=Math.min(p.top,c.bottom),u.bottom=Math.max(p.bottom,c.top),u.left=Math.min(p.left,c.right),u.right=Math.max(p.right,c.left);u.width=u.right-u.left,u.height=u.bottom-u.top;for(var x in u)d[x]=u[x]-f[x];t.edges=r.prepared.edges,t.rect=u,t.deltaRect=d}}),l.prototype.resizable=function(e){return o.is.object(e)?(this.options.resize.enabled=!1!==e.enabled,this.setPerAction("resize",e),this.setOnEvents("resize",e),/^x$|^y$|^xy$/.test(e.axis)?this.options.resize.axis=e.axis:null===e.axis&&(this.options.resize.axis=p.resize.axis),o.is.bool(e.preserveAspectRatio)?this.options.resize.preserveAspectRatio=e.preserveAspectRatio:o.is.bool(e.square)&&(this.options.resize.square=e.square),this):o.is.bool(e)?(this.options.resize.enabled=e, +e||(this.onresizestart=this.onresizestart=this.onresizeend=null),this):this.options.resize},c.signals.on("new",function(e){e.resizeAxes="xy"}),a.signals.on("set-delta",function(e){var t=e.interaction,n=e.iEvent;"resize"===e.action&&t.resizeAxes&&(t.target.options.resize.square?("y"===t.resizeAxes?n.dx=n.dy:n.dy=n.dx,n.axes="xy"):(n.axes=t.resizeAxes,"x"===t.resizeAxes?n.dy=0:"y"===t.resizeAxes&&(n.dx=0)))}),i.resize=d,i.names.push("resize"),o.merge(l.eventTypes,["resizestart","resizemove","resizeinertiastart","resizeinertiaresume","resizeend"]),i.methodDict.resize="resizable",p.resize=d.defaults,t.exports=d},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"../utils/browser":37,"./base":6}],11:[function(e,t,n){"use strict";var r=e("./utils/raf"),i=e("./utils/window").getWindow,o=e("./utils/is"),s=e("./utils/domUtils"),a=e("./Interaction"),l=e("./defaultOptions"),c={defaults:{enabled:!1,container:null,margin:60,speed:300},interaction:null,i:null,x:0,y:0,isScrolling:!1,prevTime:0,start:function(e){c.isScrolling=!0,r.cancel(c.i),c.interaction=e,c.prevTime=(new Date).getTime(),c.i=r.request(c.scroll)},stop:function(){c.isScrolling=!1,r.cancel(c.i)},scroll:function(){var e=c.interaction.target.options[c.interaction.prepared.name].autoScroll,t=e.container||i(c.interaction.element),n=(new Date).getTime(),s=(n-c.prevTime)/1e3,a=e.speed*s;a>=1&&(o.window(t)?t.scrollBy(c.x*a,c.y*a):t&&(t.scrollLeft+=c.x*a,t.scrollTop+=c.y*a),c.prevTime=n),c.isScrolling&&(r.cancel(c.i),c.i=r.request(c.scroll))},check:function(e,t){var n=e.options;return n[t].autoScroll&&n[t].autoScroll.enabled},onInteractionMove:function(e){var t=e.interaction,n=e.pointer;if(t.interacting()&&c.check(t.target,t.prepared.name)){if(t.simulation)return void(c.x=c.y=0);var r=void 0,a=void 0,l=void 0,p=void 0,u=t.target.options[t.prepared.name].autoScroll,d=u.container||i(t.element);if(o.window(d))p=n.clientXd.innerWidth-c.margin,l=n.clientY>d.innerHeight-c.margin;else{var f=s.getElementClientRect(d);p=n.clientXf.right-c.margin,l=n.clientY>f.bottom-c.margin}c.x=a?1:p?-1:0,c.y=l?1:r?-1:0,c.isScrolling||(c.margin=u.margin,c.speed=u.speed,c.start(t))}}};a.signals.on("stop-active",function(){c.stop()}),a.signals.on("action-move",c.onInteractionMove),l.perAction.autoScroll=c.defaults,t.exports=c},{"./Interaction":5,"./defaultOptions":18,"./utils/domUtils":39,"./utils/is":46,"./utils/raf":50,"./utils/window":52}],12:[function(e,t,n){"use strict";var r=e("../Interactable"),i=e("../actions/base"),o=e("../utils/is"),s=e("../utils/domUtils");r.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},r.prototype.ignoreFrom=function(e){return this._backCompatOption("ignoreFrom",e)},r.prototype.allowFrom=function(e){return this._backCompatOption("allowFrom",e)},r.prototype.testIgnore=function(e,t,n){return!(!e||!o.element(n))&&(o.string(e)?s.matchesUpTo(n,e,t):!!o.element(e)&&s.nodeContains(e,n))},r.prototype.testAllow=function(e,t,n){return!e||!!o.element(n)&&(o.string(e)?s.matchesUpTo(n,e,t):!!o.element(e)&&s.nodeContains(e,n))},r.prototype.testIgnoreAllow=function(e,t,n){return!this.testIgnore(e.ignoreFrom,t,n)&&this.testAllow(e.allowFrom,t,n)},r.prototype.actionChecker=function(e){return o.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},r.prototype.styleCursor=function(e){return o.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},r.prototype.defaultActionChecker=function(e,t,n,r){for(var o=this.getRect(r),s=null,a=i.names,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var u=p;if((!n.pointerIsDown||!n.mouse||0!=(t.buttons&this.options[u].mouseButtons))&&(s=i[u].checker(e,t,this,r,n,o)))return s}}},{"../Interactable":4,"../actions/base":6,"../utils/domUtils":39,"../utils/is":46}],13:[function(e,t,n){"use strict";function r(e,t,n,r){return g.is.object(e)&&t.testIgnoreAllow(t.options[e.name],n,r)&&t.options[e.name].enabled&&a(t,n,e)?e:null}function i(e,t,n,i,o,s){for(var a=0,l=i.length;a=m.maxInteractions)return!1;if(u.target===e){if((a+=d===n.name|0)>=i)return!1;if(u.element===t&&(l++,d!==n.name||l>=o))return!1}}}return m.maxInteractions>0}}var l=e("../interact"),c=e("../Interactable"),p=e("../Interaction"),u=e("../actions/base"),d=e("../defaultOptions"),f=e("../utils/browser"),v=e("../scope"),g=e("../utils"),h=e("../utils/Signals").new();e("./InteractableMethods");var m={signals:h,withinInteractionLimit:a,maxInteractions:1/0,defaults:{perAction:{manualStart:!1,max:1/0,maxPerElement:1,allowFrom:null,ignoreFrom:null}},setActionDefaults:function(e){g.extend(e.defaults,m.defaults.perAction)}};p.signals.on("down",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;if(!t.interacting()){s(t,o(t,n,r,i))}}),p.signals.on("move",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;if(t.mouse&&!t.pointerIsDown&&!t.interacting()){s(t,o(t,n,r,i))}}),p.signals.on("move",function(e){var t=e.interaction,n=e.event;if(t.pointerIsDown&&!t.interacting()&&t.pointerWasMoved&&t.prepared.name){h.fire("before-start",e);var r=t.target;t.prepared.name&&r&&(r.options[t.prepared.name].manualStart||!a(r,t.element,t.prepared)?t.stop(n):t.start(t.prepared,r,t.element))}}),p.signals.on("stop",function(e){var t=e.interaction,n=t.target;n&&n.options.styleCursor&&(n._doc.documentElement.style.cursor="")}),c.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},c.prototype.actionChecker=function(e){return g.is.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},c.prototype.styleCursor=function(e){return g.is.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},c.prototype.defaultActionChecker=function(e,t,n,r){for(var i=this.getRect(r),o=t.buttons||{0:1,1:4,3:8,4:16}[t.button],s=null,a=u.names,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var d=p;if((!n.pointerIsDown||!n.mouse||0!=(o&this.options[d].mouseButtons))&&(s=u[d].checker(e,t,this,r,n,i)))return s}},l.maxInteractions=function(e){return g.is.number(e)?(m.maxInteractions=e,this):m.maxInteractions},c.settingsMethods.push("styleCursor"),c.settingsMethods.push("actionChecker"),c.settingsMethods.push("ignoreFrom"),c.settingsMethods.push("allowFrom"),d.base.actionChecker=null,d.base.styleCursor=!0,g.extend(d.perAction,m.defaults.perAction),t.exports=m},{"../Interactable":4,"../Interaction":5,"../actions/base":6,"../defaultOptions":18,"../interact":21,"../scope":34,"../utils":44,"../utils/Signals":35,"../utils/browser":37,"./InteractableMethods":12}],14:[function(e,t,n){"use strict";var r=e("./base"),i=e("../Interaction");i.signals.on("new",function(e){e.delayTimer=null}),r.signals.on("prepared",function(e){var t=e.interaction,n=t.prepared.name;if(n){var r=t.target.options[n].delay;r>0&&(t.delayTimer=setTimeout(function(){t.start(t.prepared,t.target,t.element)},r))}}),i.signals.on("move",function(e){var t=e.interaction,n=e.duplicate;t.pointerWasMoved&&!n&&clearTimeout(t.delayTimer)}),r.signals.on("before-start",function(e){var t=e.interaction,n=t.prepared.name;if(n){t.target.options[n].delay>0&&(t.prepared.name=null)}})},{"../Interaction":5,"./base":13}],15:[function(e,t,n){"use strict";function r(e,t){if(!t)return!1;var n=t.options.drag.startAxis;return"xy"===e||"xy"===n||n===e}var i=e("./base"),o=e("../scope"),s=e("../utils/browser"),a=e("../utils/is"),l=e("../utils/domUtils"),c=l.matchesSelector,p=l.parentNode;i.setActionDefaults(e("../actions/drag")),i.signals.on("before-start",function(e){var t=e.interaction,n=e.eventTarget,l=e.dx,u=e.dy;if("drag"===t.prepared.name){var d=Math.abs(l),f=Math.abs(u),v=t.target.options.drag,g=v.startAxis,h=d>f?"x":dl.minSpeed&&g>l.endSpeed,b={interaction:t,pageCoords:v,statuses:f,preEnd:!0,requireEndOnly:!0};y&&!x&&(c.resetStatuses(f),m=c.setAll(b),m.shouldMove&&m.locked&&(h=!0)),(x||h)&&(p.copyCoords(i.upCoords,t.curCoords),t.pointers[0]=i.startEvent=new a(t,n,t.prepared.name,"inertiastart",t.element),i.t0=d,i.active=!0,i.allowResume=l.allowResume,t.simulation=i,o.fire(i.startEvent),x?(i.vx0=t.pointerDelta.client.vx,i.vy0=t.pointerDelta.client.vy,i.v0=g,r(t,i),p.extend(v,t.curCoords.page),v.x+=i.xe,v.y+=i.ye,c.resetStatuses(f),m=c.setAll(b),i.modifiedXe+=m.dx,i.modifiedYe+=m.dy,i.i=u.request(t.boundInertiaFrame)):(i.smoothEnd=!0,i.xe=m.dx,i.ye=m.dy,i.sx=i.sy=0,i.i=u.request(t.boundSmoothEndFrame)))}}),l.signals.on("stop-active",function(e){var t=e.interaction,n=t.inertiaStatus;n.active&&(u.cancel(n.i),n.active=!1,t.simulation=null)})},{"./InteractEvent":3,"./Interaction":5,"./modifiers":24,"./utils":44,"./utils/raf":50}],21:[function(e,t,n){"use strict";function r(e,t){var n=a.interactables.get(e,t);return n||(n=new l(e,t),n.events.global=p),n}var i=e("./utils/browser"),o=e("./utils/events"),s=e("./utils"),a=e("./scope"),l=e("./Interactable"),c=e("./Interaction"),p={};r.isSet=function(e,t){return-1!==a.interactables.indexOfElement(e,t&&t.context)},r.on=function(e,t,n){if(s.is.string(e)&&-1!==e.search(" ")&&(e=e.trim().split(/ +/)),s.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.on(f,t,n)}return r}if(s.is.object(e)){for(var v in e)r.on(v,e[v],t);return r}return s.contains(l.eventTypes,e)?p[e]?p[e].push(t):p[e]=[t]:o.add(a.document,e,t,{options:n}),r},r.off=function(e,t,n){if(s.is.string(e)&&-1!==e.search(" ")&&(e=e.trim().split(/ +/)),s.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.off(f,t,n)}return r}if(s.is.object(e)){for(var v in e)r.off(v,e[v],t);return r}if(s.contains(l.eventTypes,e)){var g=void 0;e in p&&-1!==(g=s.indexOf(p[e],t))&&p[e].splice(g,1)}else o.remove(a.document,e,t,n);return r},r.debug=function(){return a},r.getPointerAverage=s.pointerAverage,r.getTouchBBox=s.touchBBox,r.getTouchDistance=s.touchDistance,r.getTouchAngle=s.touchAngle,r.getElementRect=s.getElementRect,r.getElementClientRect=s.getElementClientRect,r.matchesSelector=s.matchesSelector,r.closest=s.closest,r.supportsTouch=function(){return i.supportsTouch},r.supportsPointerEvent=function(){return i.supportsPointerEvent},r.stop=function(e){for(var t=a.interactions.length-1;t>=0;t--)a.interactions[t].stop(e);return r},r.pointerMoveTolerance=function(e){return s.is.number(e)?(c.pointerMoveTolerance=e,this):c.pointerMoveTolerance},r.addDocument=a.addDocument,r.removeDocument=a.removeDocument,a.interact=r,t.exports=r},{"./Interactable":4,"./Interaction":5,"./scope":34,"./utils":44,"./utils/browser":37,"./utils/events":40}],22:[function(e,t,n){"use strict";function r(e){var t=e.interaction,n=e.event;t.target&&t.target.checkAndPreventDefault(n)}var i=e("./Interactable"),o=e("./Interaction"),s=e("./scope"),a=e("./utils/is"),l=e("./utils/events"),c=e("./utils/domUtils"),p=c.nodeContains,u=c.matchesSelector;i.prototype.preventDefault=function(e){return/^(always|never|auto)$/.test(e)?(this.options.preventDefault=e,this):a.bool(e)?(this.options.preventDefault=e?"always":"never",this):this.options.preventDefault},i.prototype.checkAndPreventDefault=function(e){var t=this.options.preventDefault;if("never"!==t)return"always"===t?void e.preventDefault():void(l.supportsOptions||/^(mouse|pointer|touch)*(down|start)/i.test(e.type)||a.element(e.target)&&u(e.target,"input,select,textarea,[contenteditable=true],[contenteditable=true] *")||e.preventDefault())};for(var d=["down","move","up","cancel"],f=0;f=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i;if(o.element&&(o.element===e.target||p(o.element,e.target)))return void o.target.checkAndPreventDefault(e)}}},{"./Interactable":4,"./Interaction":5,"./scope":34,"./utils/domUtils":39,"./utils/events":40,"./utils/is":46}],23:[function(e,t,n){"use strict";function r(e){var t=e.target,n=a.search(e,e.type,t);n&&n.prevTap&&e.clientX===n.prevTap.clientX&&e.clientY===n.prevTap.clientY&&t===n.prevTap.target&&(n.downTargets[0]=t,n.downTimes[0]=(new Date).getTime(),l.fire({interaction:n,event:e,eventTarget:t,pointer:e,type:"tap"}))}var i=e("./scope"),o=e("./utils/events"),s=e("./utils/browser"),a=e("./utils/interactionFinder"),l=e("./pointerEvents/base"),c=e("./utils/window"),p=c.window,u=Object.prototype.toString;if(p.Array.isArray||(p.Array.isArray=function(e){return"[object Array]"===u.call(e)}),String.prototype.trim||(String.prototype.trim=function(){return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")}),s.isIE8){var d=function(e){for(var t=i.interactions,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var o;if(n){if(r>=t.length)break;o=t[r++]}else{if(r=t.next(),r.done)break;o=r.value}var s=o;s.interacting()&&s.target.checkAndPreventDefault(e)}},f=function(e,t){var n=e.doc,i=(e.win,0===t.indexOf("listen")?o.add:o.remove);i(n,"selectstart",d),l&&i(n,"dblclick",r)};i.signals.on("add-document",f),i.signals.on("remove-document",f)}t.exports=null},{"./pointerEvents/base":31,"./scope":34,"./utils/browser":37,"./utils/events":40,"./utils/interactionFinder":45,"./utils/window":52}],24:[function(e,t,n){"use strict";function r(e,t,n){return e&&e.enabled&&(t||!e.endOnly)&&(!n||e.endOnly)}var i=e("../InteractEvent"),o=e("../Interaction"),s=e("../utils/extend"),a={names:[],setOffsets:function(e){var t=e.interaction,n=e.pageCoords,r=t.target,i=t.element,o=t.startOffset,s=r.getRect(i);s?(o.left=n.x-s.left,o.top=n.y-s.top,o.right=s.right-n.x,o.bottom=s.bottom-n.y,"width"in s||(s.width=s.right-s.left),"height"in s||(s.height=s.bottom-s.top)):o.left=o.top=o.right=o.bottom=0,e.rect=s,e.interactable=r,e.element=i;for(var l=0;l=p.length)break;f=p[d++]}else{if(d=p.next(),d.done)break;f=d.value}var v=f,g=a[v],h=t.target.options[t.prepared.name][v];r(h,i,o)&&(e.status=e.status=n[v],e.options=h,e.offset=e.interaction.modifierOffsets[v],g.set(e),e.status.locked&&(l.x+=e.status.dx,l.y+=e.status.dy,c.dx+=e.status.dx,c.dy+=e.status.dy,c.locked=!0))}return c.shouldMove=!e.status||!c.locked||e.status.changed,c},resetStatuses:function(e){for(var t=a.names,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var i;if(n){if(r>=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i,s=e[o]||{};s.dx=s.dy=0,s.modifiedX=s.modifiedY=NaN,s.locked=!1,s.changed=!0,e[o]=s}return e},start:function(e,t){var n=e.interaction,r={interaction:n,pageCoords:("action-resume"===t?n.curCoords:n.startCoords).page,startOffset:n.startOffset,statuses:n.modifierStatuses,preEnd:!1,requireEndOnly:!1};a.setOffsets(r),a.resetStatuses(r.statuses),r.pageCoords=s({},n.startCoords.page),n.modifierResult=a.setAll(r)}};o.signals.on("new",function(e){e.startOffset={left:0,right:0,top:0,bottom:0},e.modifierOffsets={},e.modifierStatuses=a.resetStatuses({}),e.modifierResult=null}),o.signals.on("action-start",a.start),o.signals.on("action-resume",a.start),o.signals.on("before-action-move",function(e){var t=e.interaction,n=e.preEnd,r=e.interactingBeforeMove,i=a.setAll({interaction:t,preEnd:n,pageCoords:t.curCoords.page,statuses:t.modifierStatuses,requireEndOnly:!1});!i.shouldMove&&r&&(t._dontFireMove=!0),t.modifierResult=i}),o.signals.on("action-end",function(e){for(var t=e.interaction,n=e.event,i=0;i=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}var m=h,y=m.x,x=m.y;l.push({x:s.left-i.width*y+u.x,y:s.top-i.height*x+u.y})}else l.push(u);return l},set:function(e){var t=e.interaction,n=e.pageCoords,r=e.status,i=e.options,s=e.offset,a=[],l=void 0,c=void 0,p=void 0;if(r.useStatusXY)c={x:r.x,y:r.y};else{var u=o.getOriginXY(t.target,t.element,t.prepared.name);c=o.extend({},n),c.x-=u.x,c.y-=u.y}r.realX=c.x,r.realY=c.y;for(var d=i.targets?i.targets.length:0,f=s,v=Array.isArray(f),g=0,f=v?f:f[Symbol.iterator]();;){var h;if(v){if(g>=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}for(var m=h,y=m.x,x=m.y,b=c.x-y,w=c.y-x,E=i.targets,S=Array.isArray(E),T=0,E=S?E:E[Symbol.iterator]();;){var C;if(S){if(T>=E.length)break;C=E[T++]}else{if(T=E.next(),T.done)break;C=T.value}var A=C;l=o.is.function(A)?A(b,w,t):A,l&&a.push({x:o.is.number(l.x)?l.x+y:b,y:o.is.number(l.y)?l.y+x:w,range:o.is.number(l.range)?l.range:i.range})}}var D={target:null,inRange:!1,distance:0,range:0,dx:0,dy:0};for(p=0,d=a.length;p=p.length)break;f=p[d++]}else{if(d=p.next(),d.done)break;f=d.value}var v=f,g=void 0;g=a.is.function(v)?v(l,c,t):v,g&&("width"in g&&"height"in g&&(g.x=g.width, +g.y=g.height),e.options.targets.push(g))}i.set(e)},modifyCoords:function(e){var t=e.options;e.options=a.extend({},t),e.options.enabled=t.enabled,e.options.relativePoints=[null],i.modifyCoords(e)}};r.snapSize=l,r.names.push("snapSize"),o.perAction.snapSize=l.defaults,s.defaults.snapSize=l.defaults,t.exports=l},{"../actions/resize":10,"../defaultOptions":18,"../utils/":44,"./index":24,"./snap":28}],30:[function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=e("../utils/pointerUtils");t.exports=function(){function e(t,n,o,s,a){if(r(this,e),i.pointerExtend(this,o),o!==n&&i.pointerExtend(this,n),this.interaction=a,this.timeStamp=(new Date).getTime(),this.originalEvent=o,this.type=t,this.pointerId=i.getPointerId(n),this.pointerType=i.getPointerType(n),this.target=s,this.currentTarget=null,"tap"===t){var l=a.getPointerIndex(n);this.dt=this.timeStamp-a.downTimes[l];var c=this.timeStamp-a.tapTime;this.double=!!(a.prevTap&&"doubletap"!==a.prevTap.type&&a.prevTap.target===this.target&&c<500)}else"doubletap"===t&&(this.dt=n.timeStamp-a.tapTime)}return e.prototype.subtractOrigin=function(e){var t=e.x,n=e.y;return this.pageX-=t,this.pageY-=n,this.clientX-=t,this.clientY-=n,this},e.prototype.addOrigin=function(e){var t=e.x,n=e.y;return this.pageX+=t,this.pageY+=n,this.clientX+=t,this.clientY+=n,this},e.prototype.preventDefault=function(){this.originalEvent.preventDefault()},e.prototype.stopPropagation=function(){this.propagationStopped=!0},e.prototype.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},e}()},{"../utils/pointerUtils":49}],31:[function(e,t,n){"use strict";function r(e){for(var t=e.interaction,n=e.pointer,s=e.event,l=e.eventTarget,c=e.type,u=void 0===c?e.pointerEvent.type:c,d=e.targets,f=void 0===d?i(e):d,v=e.pointerEvent,g=void 0===v?new o(u,n,s,l,t):v,h={interaction:t,pointer:n,event:s,eventTarget:l,targets:f,type:u,pointerEvent:g},m=0;m=u.length)break;g=u[v++]}else{if(v=u.next(),v.done)break;g=v.value}var h=g;c.element=h,p.fire("collect-targets",c)}return"hold"===o&&(c.targets=d(c.targets,function(e){return e.eventable.options.holdDuration===t.holdTimers[s].duration})),c.targets}var o=e("./PointerEvent"),s=e("../Interaction"),a=e("../utils"),l=e("../utils/browser"),c=e("../defaultOptions"),p=e("../utils/Signals").new(),u=e("../utils/arr"),d=u.filter,f=["down","up","cancel"],v=["down","up","cancel"],g={PointerEvent:o,fire:r,collectEventTargets:i,signals:p,defaults:{holdDuration:600,ignoreFrom:null,allowFrom:null,origin:{x:0,y:0}},types:["down","move","up","cancel","tap","doubletap","hold"]};s.signals.on("update-pointer-down",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers[n]={duration:1/0,timeout:null}}),s.signals.on("remove-pointer",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers.splice(n,1)}),s.signals.on("move",function(e){var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,s=e.duplicateMove,a=t.getPointerIndex(n);s||t.pointerIsDown&&!t.pointerWasMoved||(t.pointerIsDown&&clearTimeout(t.holdTimers[a].timeout),r({interaction:t,pointer:n,event:i,eventTarget:o,type:"move"}))}),s.signals.on("down",function(e){for(var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,s=e.pointerIndex,c=l.isIE8?a.extend({},i):i,u=t.holdTimers[s],d=a.getPath(o),f={interaction:t,pointer:n,event:i,eventTarget:o,type:"hold",targets:[],path:d,element:null},v=d,g=Array.isArray(v),h=0,v=g?v:v[Symbol.iterator]();;){var m;if(g){if(h>=v.length)break;m=v[h++]}else{if(h=v.next(),h.done)break;m=h.value}var y=m;f.element=y,p.fire("collect-targets",f)}if(f.targets.length){for(var x=1/0,b=0;b=0&&(p.selectors[u]!==e||p.contexts[u]!==t);u--);-1===u&&(u=p.selectors.length,p.selectors.push(e),p.contexts.push(t),p.listeners.push([])),p.listeners[u].push([i,!!s.capture,s.passive])}function s(e,t,n,r,o){var s=f(o),c=O[n],p=!1,u=void 0;if(c)for(u=c.selectors.length-1;u>=0;u--)if(c.selectors[u]===e&&c.contexts[u]===t){for(var d=c.listeners[u],v=d.length-1;v>=0;v--){var g=d[v],h=g[0],m=g[1],y=g[2];if(h===r&&m===!!s.capture&&y===s.passive){d.splice(v,1),d.length||(c.selectors.splice(u,1),c.contexts.splice(u,1),c.listeners.splice(u,1),i(t,n,a),i(t,n,l,!0),c.selectors.length||(O[n]=null)),p=!0;break}}if(p)break}}function a(e,t){var n=f(t),r={},i=O[e.type],o=g.getActualElement(e.path?e.path[0]:e.target),s=o;for(h(r,e),r.originalEvent=e,r.preventDefault=p;v.element(s);){for(var a=0;a=l.length)break;u=l[p++]}else{if(p=l.next(),p.done)break;u=p.value}var d=u,f=o[d](a);if(f)return f}},simulationResume:function(e){var t=e.pointerType,n=e.eventType,o=e.eventTarget;if(!/down|start/i.test(n))return null;for(var s=r.interactions,a=Array.isArray(s),l=0,s=a?s:s[Symbol.iterator]();;){var c;if(a){if(l>=s.length)break;c=s[l++]}else{if(l=s.next(),l.done)break;c=l.value}var p=c,u=o;if(p.simulation&&p.simulation.allowResume&&p.pointerType===t)for(;u;){if(u===p.element)return p;u=i.parentNode(u)}}return null},mouseOrPen:function(e){var t=e.pointerId,n=e.pointerType,o=e.eventType;if("mouse"!==n&&"pen"!==n)return null;for(var s=void 0,a=r.interactions,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var u=p;if(u.pointerType===n){if(u.simulation&&!i.contains(u.pointerIds,t))continue;if(u.interacting())return u;s||(s=u)}}if(s)return s;for(var d=r.interactions,f=Array.isArray(d),v=0,d=f?d:d[Symbol.iterator]();;){var g;if(f){if(v>=d.length)break;g=d[v++]}else{if(v=d.next(),v.done)break;g=v.value}var h=g;if(!(h.pointerType!==n||/down/i.test(o)&&h.simulation))return h}return null},hasPointer:function(e){for(var t=e.pointerId,n=r.interactions,o=Array.isArray(n),s=0,n=o?n:n[Symbol.iterator]();;){var a;if(o){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var l=a;if(i.contains(l.pointerIds,t))return l}},idle:function(e){for(var t=e.pointerType,n=r.interactions,i=Array.isArray(n),o=0,n=i?n:n[Symbol.iterator]();;){var s;if(i){if(o>=n.length)break;s=n[o++]}else{if(o=n.next(),o.done)break;s=o.value}var a=s;if(1===a.pointerIds.length){var l=a.target;if(l&&!l.options.gesture.enabled)continue}else if(a.pointerIds.length>=2)continue;if(!a.interacting()&&t===a.pointerType)return a}return null}};t.exports=o},{"../scope":34,"./index":44}],46:[function(e,t,n){"use strict";var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},i=e("./window"),o=e("./isWindow"),s={array:function(){},window:function(e){return e===i.window||o(e)},docFrag:function(e){return s.object(e)&&11===e.nodeType},object:function(e){return!!e&&"object"===(void 0===e?"undefined":r(e))},function:function(e){return"function"==typeof e},number:function(e){return"number"==typeof e},bool:function(e){return"boolean"==typeof e},string:function(e){return"string"==typeof e},element:function(e){if(!e||"object"!==(void 0===e?"undefined":r(e)))return!1;var t=i.getWindow(e)||i.window;return/object|function/.test(r(t.Element))?e instanceof t.Element:1===e.nodeType&&"string"==typeof e.nodeName}};s.array=function(e){return s.object(e)&&void 0!==e.length&&s.function(e.splice)},t.exports=s},{"./isWindow":47,"./window":52}],47:[function(e,t,n){"use strict";t.exports=function(e){return!(!e||!e.Window)&&e instanceof e.Window}},{}],48:[function(e,t,n){"use strict";function r(e,n){for(var r in n){var i=t.exports.prefixedPropREs,o=!1;for(var s in i)if(0===r.indexOf(s)&&i[s].test(r)){o=!0;break}o||"function"==typeof n[r]||(e[r]=n[r])}return e}r.prefixedPropREs={webkit:/(Movement[XY]|Radius[XY]|RotationAngle|Force)$/},t.exports=r},{}],49:[function(e,t,n){"use strict";var r=e("./hypot"),i=e("./browser"),o=e("./domObjects"),s=e("./domUtils"),a=e("./domObjects"),l=e("./is"),c=e("./pointerExtend"),p={copyCoords:function(e,t){e.page=e.page||{},e.page.x=t.page.x,e.page.y=t.page.y,e.client=e.client||{},e.client.x=t.client.x,e.client.y=t.client.y,e.timeStamp=t.timeStamp},setCoordDeltas:function(e,t,n){e.page.x=n.page.x-t.page.x,e.page.y=n.page.y-t.page.y,e.client.x=n.client.x-t.client.x,e.client.y=n.client.y-t.client.y,e.timeStamp=n.timeStamp-t.timeStamp;var i=Math.max(e.timeStamp/1e3,.001);e.page.speed=r(e.page.x,e.page.y)/i,e.page.vx=e.page.x/i,e.page.vy=e.page.y/i,e.client.speed=r(e.client.x,e.page.y)/i,e.client.vx=e.client.x/i,e.client.vy=e.client.y/i},isNativePointer:function(e){return e instanceof o.Event||e instanceof o.Touch},getXY:function(e,t,n){return n=n||{},e=e||"page",n.x=t[e+"X"],n.y=t[e+"Y"],n},getPageXY:function(e,t){return t=t||{},i.isOperaMobile&&p.isNativePointer(e)?(p.getXY("screen",e,t),t.x+=window.scrollX,t.y+=window.scrollY):p.getXY("page",e,t),t},getClientXY:function(e,t){return t=t||{},i.isOperaMobile&&p.isNativePointer(e)?p.getXY("screen",e,t):p.getXY("client",e,t),t},getPointerId:function(e){return l.number(e.pointerId)?e.pointerId:e.identifier},setCoords:function(e,t,n){var r=t.length>1?p.pointerAverage(t):t[0],i={};p.getPageXY(r,i),e.page.x=i.x,e.page.y=i.y,p.getClientXY(r,i),e.client.x=i.x,e.client.y=i.y,e.timeStamp=l.number(n)?n:(new Date).getTime()},pointerExtend:c,getTouchPair:function(e){var t=[];return l.array(e)?(t[0]=e[0],t[1]=e[1]):"touchend"===e.type?1===e.touches.length?(t[0]=e.touches[0],t[1]=e.changedTouches[0]):0===e.touches.length&&(t[0]=e.changedTouches[0],t[1]=e.changedTouches[1]):(t[0]=e.touches[0],t[1]=e.touches[1]),t},pointerAverage:function(e){for(var t={pageX:0,pageY:0,clientX:0,clientY:0,screenX:0,screenY:0},n=e,r=Array.isArray(n),i=0,n=r?n:n[Symbol.iterator]();;){var o;if(r){if(i>=n.length)break;o=n[i++]}else{if(i=n.next(),i.done)break;o=i.value}var s=o;for(var a in t)t[a]+=s[a]}for(var l in t)t[l]/=e.length;return t},touchBBox:function(e){if(e.length||e.touches&&e.touches.length>1){var t=p.getTouchPair(e),n=Math.min(t[0].pageX,t[1].pageX),r=Math.min(t[0].pageY,t[1].pageY);return{x:n,y:r,left:n,top:r,width:Math.max(t[0].pageX,t[1].pageX)-n,height:Math.max(t[0].pageY,t[1].pageY)-r}}},touchDistance:function(e,t){var n=t+"X",i=t+"Y",o=p.getTouchPair(e),s=o[0][n]-o[1][n],a=o[0][i]-o[1][i];return r(s,a)},touchAngle:function(e,t,n){var r=n+"X",i=n+"Y",o=p.getTouchPair(e),s=o[1][r]-o[0][r],a=o[1][i]-o[0][i];return 180*Math.atan2(a,s)/Math.PI},getPointerType:function(e){return l.string(e.pointerType)?e.pointerType:l.number(e.pointerType)?[void 0,void 0,"touch","pen","mouse"][e.pointerType]:/touch/.test(e.type)||e instanceof a.Touch?"touch":"mouse"},getEventTargets:function(e){return[s.getActualElement(e.path?e.path[0]:e.target),s.getActualElement(e.currentTarget)]}};t.exports=p},{"./browser":37,"./domObjects":38,"./domUtils":39,"./hypot":43,"./is":46,"./pointerExtend":48}],50:[function(e,t,n){"use strict";for(var r=e("./window"),i=r.window,o=["ms","moz","webkit","o"],s=0,a=void 0,l=void 0,c=0;c\n * Open source under the MIT License.\n * https://raw.github.com/taye/interact.js/master/LICENSE\n */\n","/*\n * In a (windowless) server environment this file exports a factory function\n * that takes the window to use.\n *\n * var interact = require('interact.js')(windowObject);\n *\n * See https://github.com/taye/interact.js/issues/187\n */\nif (typeof window === 'undefined') {\n module.exports = function (window) {\n require('./src/utils/window').init(window);\n\n return require('./src/index');\n };\n}\nelse {\n module.exports = require('./src/index');\n}\n","const { indexOf } = require('./utils/arr');\nconst extend = require('./utils/extend.js');\n\nfunction fireUntilImmediateStopped (event, listeners) {\n for (let i = 0, len = listeners.length; i < len && !event.immediatePropagationStopped; i++) {\n listeners[i](event);\n }\n}\n\nclass Eventable {\n\n constructor (options) {\n this.options = extend({}, options || {});\n }\n\n fire (event) {\n let listeners;\n const onEvent = 'on' + event.type;\n const global = this.global;\n\n // Interactable#on() listeners\n if ((listeners = this[event.type])) {\n fireUntilImmediateStopped(event, listeners);\n }\n\n // interactable.onevent listener\n if (this[onEvent]) {\n this[onEvent](event);\n }\n\n // interact.on() listeners\n if (!event.propagationStopped && global && (listeners = global[event.type])) {\n fireUntilImmediateStopped(event, listeners);\n }\n }\n\n on (eventType, listener) {\n // if this type of event was never bound\n if (this[eventType]) {\n this[eventType].push(listener);\n }\n else {\n this[eventType] = [listener];\n }\n }\n\n off (eventType, listener) {\n // if it is an action event type\n const eventList = this[eventType];\n const index = eventList? indexOf(eventList, listener) : -1;\n\n if (index !== -1) {\n eventList.splice(index, 1);\n }\n\n if (eventList && eventList.length === 0 || !listener) {\n this[eventType] = listener;\n }\n }\n}\n\nmodule.exports = Eventable;\n","const extend = require('./utils/extend');\nconst getOriginXY = require('./utils/getOriginXY');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nclass InteractEvent {\n constructor (interaction, event, action, phase, element, related, preEnd = false) {\n const target = interaction.target;\n const deltaSource = (target && target.options || defaults).deltaSource;\n const origin = getOriginXY(target, element, action);\n const starting = phase === 'start';\n const ending = phase === 'end';\n const coords = starting? interaction.startCoords : interaction.curCoords;\n const prevEvent = interaction.prevEvent;\n\n element = element || interaction.element;\n\n const page = extend({}, coords.page);\n const client = extend({}, coords.client);\n\n page.x -= origin.x;\n page.y -= origin.y;\n\n client.x -= origin.x;\n client.y -= origin.y;\n\n this.ctrlKey = event.ctrlKey;\n this.altKey = event.altKey;\n this.shiftKey = event.shiftKey;\n this.metaKey = event.metaKey;\n this.button = event.button;\n this.buttons = event.buttons;\n this.target = element;\n this.currentTarget = element;\n this.relatedTarget = related || null;\n this.preEnd = preEnd;\n this.type = action + (phase || '');\n this.interaction = interaction;\n this.interactable = target;\n\n this.t0 = starting ? interaction.downTimes[interaction.downTimes.length - 1]\n : prevEvent.t0;\n\n const signalArg = {\n interaction,\n event,\n action,\n phase,\n element,\n related,\n page,\n client,\n coords,\n starting,\n ending,\n deltaSource,\n iEvent: this,\n };\n\n signals.fire('set-xy', signalArg);\n\n if (ending) {\n // use previous coords when ending\n this.pageX = prevEvent.pageX;\n this.pageY = prevEvent.pageY;\n this.clientX = prevEvent.clientX;\n this.clientY = prevEvent.clientY;\n }\n else {\n this.pageX = page.x;\n this.pageY = page.y;\n this.clientX = client.x;\n this.clientY = client.y;\n }\n\n this.x0 = interaction.startCoords.page.x - origin.x;\n this.y0 = interaction.startCoords.page.y - origin.y;\n this.clientX0 = interaction.startCoords.client.x - origin.x;\n this.clientY0 = interaction.startCoords.client.y - origin.y;\n\n signals.fire('set-delta', signalArg);\n\n this.timeStamp = coords.timeStamp;\n this.dt = interaction.pointerDelta.timeStamp;\n this.duration = this.timeStamp - this.t0;\n\n // speed and velocity in pixels per second\n this.speed = interaction.pointerDelta[deltaSource].speed;\n this.velocityX = interaction.pointerDelta[deltaSource].vx;\n this.velocityY = interaction.pointerDelta[deltaSource].vy;\n\n this.swipe = (ending || phase === 'inertiastart')? this.getSwipe() : null;\n\n signals.fire('new', signalArg);\n }\n\n getSwipe () {\n const interaction = this.interaction;\n\n if (interaction.prevEvent.speed < 600\n || this.timeStamp - interaction.prevEvent.timeStamp > 150) {\n return null;\n }\n\n let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI;\n const overlap = 22.5;\n\n if (angle < 0) {\n angle += 360;\n }\n\n const left = 135 - overlap <= angle && angle < 225 + overlap;\n const up = 225 - overlap <= angle && angle < 315 + overlap;\n\n const right = !left && (315 - overlap <= angle || angle < 45 + overlap);\n const down = !up && 45 - overlap <= angle && angle < 135 + overlap;\n\n return {\n up,\n down,\n left,\n right,\n angle,\n speed: interaction.prevEvent.speed,\n velocity: {\n x: interaction.prevEvent.velocityX,\n y: interaction.prevEvent.velocityY,\n },\n };\n }\n\n preventDefault () {}\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n}\n\nsignals.on('set-delta', function ({ iEvent, interaction, starting, deltaSource }) {\n const prevEvent = starting? iEvent : interaction.prevEvent;\n\n if (deltaSource === 'client') {\n iEvent.dx = iEvent.clientX - prevEvent.clientX;\n iEvent.dy = iEvent.clientY - prevEvent.clientY;\n }\n else {\n iEvent.dx = iEvent.pageX - prevEvent.pageX;\n iEvent.dy = iEvent.pageY - prevEvent.pageY;\n }\n});\n\nInteractEvent.signals = signals;\n\nmodule.exports = InteractEvent;\n","const is = require('./utils/is');\nconst events = require('./utils/events');\nconst extend = require('./utils/extend');\nconst actions = require('./actions/base');\nconst scope = require('./scope');\nconst Eventable = require('./Eventable');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nconst {\n getElementRect,\n nodeContains,\n trySelector,\n} = require('./utils/domUtils');\nconst { getWindow } = require('./utils/window');\nconst { indexOf, contains } = require('./utils/arr');\nconst { wheelEvent } = require('./utils/browser');\n\n// all set interactables\nscope.interactables = [];\n\n/*\\\n * Interactable\n [ property ]\n **\n * Object type returned by @interact\n\\*/\nclass Interactable {\n constructor (target, options) {\n options = options || {};\n\n this.target = target;\n this.events = new Eventable();\n this._context = options.context || scope.document;\n this._win = getWindow(trySelector(target)? this._context : target);\n this._doc = this._win.document;\n\n signals.fire('new', {\n target,\n options,\n interactable: this,\n win: this._win,\n });\n\n scope.addDocument( this._doc, this._win );\n\n scope.interactables.push(this);\n\n this.set(options);\n }\n\n setOnEvents (action, phases) {\n const onAction = 'on' + action;\n\n if (is.function(phases.onstart) ) { this.events[onAction + 'start' ] = phases.onstart ; }\n if (is.function(phases.onmove) ) { this.events[onAction + 'move' ] = phases.onmove ; }\n if (is.function(phases.onend) ) { this.events[onAction + 'end' ] = phases.onend ; }\n if (is.function(phases.oninertiastart)) { this.events[onAction + 'inertiastart' ] = phases.oninertiastart ; }\n\n return this;\n }\n\n setPerAction (action, options) {\n // for all the default per-action options\n for (const option in options) {\n // if this option exists for this action\n if (option in defaults[action]) {\n // if the option in the options arg is an object value\n if (is.object(options[option])) {\n // duplicate the object\n this.options[action][option] = extend(this.options[action][option] || {}, options[option]);\n\n if (is.object(defaults.perAction[option]) && 'enabled' in defaults.perAction[option]) {\n this.options[action][option].enabled = options[option].enabled === false? false : true;\n }\n }\n else if (is.bool(options[option]) && is.object(defaults.perAction[option])) {\n this.options[action][option].enabled = options[option];\n }\n else if (options[option] !== undefined) {\n // or if it's not undefined, do a plain assignment\n this.options[action][option] = options[option];\n }\n }\n }\n }\n\n /*\\\n * Interactable.getRect\n [ method ]\n *\n * The default function to get an Interactables bounding rect. Can be\n * overridden using @Interactable.rectChecker.\n *\n - element (Element) #optional The element to measure.\n = (object) The object's bounding rectangle.\n o {\n o top : 0,\n o left : 0,\n o bottom: 0,\n o right : 0,\n o width : 0,\n o height: 0\n o }\n \\*/\n getRect (element) {\n element = element || this.target;\n\n if (is.string(this.target) && !(is.element(element))) {\n element = this._context.querySelector(this.target);\n }\n\n return getElementRect(element);\n }\n\n /*\\\n * Interactable.rectChecker\n [ method ]\n *\n * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n - checker (function) #optional A function which returns this Interactable's bounding rectangle. See @Interactable.getRect\n = (function | object) The checker function or this Interactable\n \\*/\n rectChecker (checker) {\n if (is.function(checker)) {\n this.getRect = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.getRect;\n\n return this;\n }\n\n return this.getRect;\n }\n\n _backCompatOption (optionName, newValue) {\n if (trySelector(newValue) || is.object(newValue)) {\n this.options[optionName] = newValue;\n\n for (const action of actions.names) {\n this.options[action][optionName] = newValue;\n }\n\n return this;\n }\n\n return this.options[optionName];\n }\n\n /*\\\n * Interactable.origin\n [ method ]\n *\n * Gets or sets the origin of the Interactable's element. The x and y\n * of the origin will be subtracted from action event coordinates.\n *\n - origin (object | string) #optional An object eg. { x: 0, y: 0 } or string 'parent', 'self' or any CSS selector\n * OR\n - origin (Element) #optional An HTML or SVG Element whose rect will be used\n **\n = (object) The current origin or this Interactable\n \\*/\n origin (newValue) {\n return this._backCompatOption('origin', newValue);\n }\n\n /*\\\n * Interactable.deltaSource\n [ method ]\n *\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n - newValue (string) #optional Use 'client' if you will be scrolling while interacting; Use 'page' if you want autoScroll to work\n = (string | object) The current deltaSource or this Interactable\n \\*/\n deltaSource (newValue) {\n if (newValue === 'page' || newValue === 'client') {\n this.options.deltaSource = newValue;\n\n return this;\n }\n\n return this.options.deltaSource;\n }\n\n /*\\\n * Interactable.context\n [ method ]\n *\n * Gets the selector context Node of the Interactable. The default is `window.document`.\n *\n = (Node) The context Node of this Interactable\n **\n \\*/\n context () {\n return this._context;\n }\n\n inContext (element) {\n return (this._context === element.ownerDocument\n || nodeContains(this._context, element));\n }\n\n /*\\\n * Interactable.fire\n [ method ]\n *\n * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n - iEvent (InteractEvent) The InteractEvent object to be fired on this Interactable\n = (Interactable) this Interactable\n \\*/\n fire (iEvent) {\n this.events.fire(iEvent);\n\n return this;\n }\n\n _onOffMultiple (method, eventType, listener, options) {\n if (is.string(eventType) && eventType.search(' ') !== -1) {\n eventType = eventType.trim().split(/ +/);\n }\n\n if (is.array(eventType)) {\n for (let i = 0; i < eventType.length; i++) {\n this[method](eventType[i], listener, options);\n }\n\n return true;\n }\n\n if (is.object(eventType)) {\n for (const prop in eventType) {\n this[method](prop, eventType[prop], listener);\n }\n\n return true;\n }\n }\n\n /*\\\n * Interactable.on\n [ method ]\n *\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n - eventType (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) This Interactable\n \\*/\n on (eventType, listener, options) {\n if (this._onOffMultiple('on', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.on(eventType, listener);\n }\n // delegated event for selector\n else if (is.string(this.target)) {\n events.addDelegate(this.target, this._context, eventType, listener, options);\n }\n else {\n events.add(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.off\n [ method ]\n *\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n - eventType (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) This Interactable\n \\*/\n off (eventType, listener, options) {\n if (this._onOffMultiple('off', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n // if it is an action event type\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.off(eventType, listener);\n }\n // delegated event\n else if (is.string(this.target)) {\n events.removeDelegate(this.target, this._context, eventType, listener, options);\n }\n // remove listener from this Interatable's element\n else {\n events.remove(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.set\n [ method ]\n *\n * Reset the options of this Interactable\n - options (object) The new settings to apply\n = (object) This Interactable\n \\*/\n set (options) {\n if (!is.object(options)) {\n options = {};\n }\n\n this.options = extend({}, defaults.base);\n\n const perActions = extend({}, defaults.perAction);\n\n for (const actionName in actions.methodDict) {\n const methodName = actions.methodDict[actionName];\n\n this.options[actionName] = extend({}, defaults[actionName]);\n\n this.setPerAction(actionName, perActions);\n\n this[methodName](options[actionName]);\n }\n\n for (const setting of Interactable.settingsMethods) {\n this.options[setting] = defaults.base[setting];\n\n if (setting in options) {\n this[setting](options[setting]);\n }\n }\n\n signals.fire('set', {\n options,\n interactable: this,\n });\n\n return this;\n }\n\n /*\\\n * Interactable.unset\n [ method ]\n *\n * Remove this interactable from the list of interactables and remove\n * it's action capabilities and event listeners\n *\n = (object) @interact\n \\*/\n unset () {\n events.remove(this.target, 'all');\n\n if (is.string(this.target)) {\n // remove delegated events\n for (const type in events.delegatedEvents) {\n const delegated = events.delegatedEvents[type];\n\n if (delegated.selectors[0] === this.target\n && delegated.contexts[0] === this._context) {\n\n delegated.selectors.splice(0, 1);\n delegated.contexts .splice(0, 1);\n delegated.listeners.splice(0, 1);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegated[type] = null;\n }\n }\n\n events.remove(this._context, type, events.delegateListener);\n events.remove(this._context, type, events.delegateUseCapture, true);\n }\n }\n else {\n events.remove(this, 'all');\n }\n\n signals.fire('unset', { interactable: this });\n\n scope.interactables.splice(indexOf(scope.interactables, this), 1);\n\n // Stop related interactions when an Interactable is unset\n for (const interaction of scope.interactions || []) {\n if (interaction.target === this && interaction.interacting()) {\n interaction.stop();\n }\n }\n\n return scope.interact;\n }\n}\n\nscope.interactables.indexOfElement = function indexOfElement (target, context) {\n context = context || scope.document;\n\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n if (interactable.target === target && interactable._context === context) {\n return i;\n }\n }\n return -1;\n};\n\nscope.interactables.get = function interactableGet (element, options, dontCheckInContext) {\n const ret = this[this.indexOfElement(element, options && options.context)];\n\n return ret && (is.string(element) || dontCheckInContext || ret.inContext(element))? ret : null;\n};\n\nscope.interactables.forEachSelector = function (callback, element) {\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n // skip non CSS selector targets and out of context elements\n if (!is.string(interactable.target)\n || (element && !interactable.inContext(element))) {\n continue;\n }\n\n const ret = callback(interactable, interactable.target, interactable._context, i, this);\n\n if (ret !== undefined) {\n return ret;\n }\n }\n};\n\n// all interact.js eventTypes\nInteractable.eventTypes = scope.eventTypes = [];\n\nInteractable.signals = signals;\n\nInteractable.settingsMethods = [ 'deltaSource', 'origin', 'preventDefault', 'rectChecker' ];\n\nmodule.exports = Interactable;\n","const scope = require('./scope');\nconst utils = require('./utils');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst finder = require('./utils/interactionFinder');\nconst signals = require('./utils/Signals').new();\n\nconst listeners = {};\nconst methodNames = [\n 'pointerDown', 'pointerMove', 'pointerUp',\n 'updatePointer', 'removePointer',\n];\n\n// for ignoring browser's simulated mouse events\nlet prevTouchTime = 0;\n\n// all active and idle interactions\nscope.interactions = [];\n\nclass Interaction {\n constructor () {\n this.target = null; // current interactable being interacted with\n this.element = null; // the target element of the interactable\n\n this.prepared = { // action that's ready to be fired on next move event\n name : null,\n axis : null,\n edges: null,\n };\n\n // keep track of added pointers\n this.pointers = [];\n this.pointerIds = [];\n this.downTargets = [];\n this.downTimes = [];\n\n // Previous native pointer move event coordinates\n this.prevCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n // current native pointer move event coordinates\n this.curCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Starting InteractEvent pointer coordinates\n this.startCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Change in coordinates and time of the pointer\n this.pointerDelta = {\n page : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n client : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n timeStamp: 0,\n };\n\n this.downEvent = null; // pointerdown/mousedown/touchstart event\n this.downPointer = {};\n\n this._eventTarget = null;\n this._curEventTarget = null;\n\n this.prevEvent = null; // previous action event\n\n this.pointerIsDown = false;\n this.pointerWasMoved = false;\n this._interacting = false;\n\n this.mouse = false;\n\n signals.fire('new', this);\n\n scope.interactions.push(this);\n }\n\n pointerDown (pointer, event, eventTarget) {\n const pointerIndex = this.updatePointer(pointer, event, true);\n\n signals.fire('down', {\n pointer,\n event,\n eventTarget,\n pointerIndex,\n interaction: this,\n });\n }\n\n /*\\\n * Interaction.start\n [ method ]\n *\n * Start an action with the given Interactable and Element as tartgets. The\n * action must be enabled for the target Interactable and an appropriate number\n * of pointers must be held down - 1 for drag/resize, 2 for gesture.\n *\n * Use it with `interactable.able({ manualStart: false })` to always\n * [start actions manually](https://github.com/taye/interact.js/issues/114)\n *\n - action (object) The action to be performed - drag, resize, etc.\n - target (Interactable) The Interactable to target\n - element (Element) The DOM Element to target\n = (object) interact\n **\n | interact(target)\n | .draggable({\n | // disable the default drag start by down->move\n | manualStart: true\n | })\n | // start dragging after the user holds the pointer down\n | .on('hold', function (event) {\n | var interaction = event.interaction;\n |\n | if (!interaction.interacting()) {\n | interaction.start({ name: 'drag' },\n | event.interactable,\n | event.currentTarget);\n | }\n | });\n \\*/\n start (action, target, element) {\n if (this.interacting()\n || !this.pointerIsDown\n || this.pointerIds.length < (action.name === 'gesture'? 2 : 1)) {\n return;\n }\n\n // if this interaction had been removed after stopping\n // add it back\n if (utils.indexOf(scope.interactions, this) === -1) {\n scope.interactions.push(this);\n }\n\n utils.copyAction(this.prepared, action);\n this.target = target;\n this.element = element;\n\n signals.fire('action-start', {\n interaction: this,\n event: this.downEvent,\n });\n }\n\n pointerMove (pointer, event, eventTarget) {\n if (!this.simulation) {\n this.updatePointer(pointer);\n utils.setCoords(this.curCoords, this.pointers);\n }\n\n const duplicateMove = (this.curCoords.page.x === this.prevCoords.page.x\n && this.curCoords.page.y === this.prevCoords.page.y\n && this.curCoords.client.x === this.prevCoords.client.x\n && this.curCoords.client.y === this.prevCoords.client.y);\n\n let dx;\n let dy;\n\n // register movement greater than pointerMoveTolerance\n if (this.pointerIsDown && !this.pointerWasMoved) {\n dx = this.curCoords.client.x - this.startCoords.client.x;\n dy = this.curCoords.client.y - this.startCoords.client.y;\n\n this.pointerWasMoved = utils.hypot(dx, dy) > Interaction.pointerMoveTolerance;\n }\n\n const signalArg = {\n pointer,\n pointerIndex: this.getPointerIndex(pointer),\n event,\n eventTarget,\n dx,\n dy,\n duplicate: duplicateMove,\n interaction: this,\n interactingBeforeMove: this.interacting(),\n };\n\n if (!duplicateMove) {\n // set pointer coordinate, time changes and speeds\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n }\n\n signals.fire('move', signalArg);\n\n if (!duplicateMove) {\n // if interacting, fire an 'action-move' signal etc\n if (this.interacting()) {\n this.doMove(signalArg);\n }\n\n if (this.pointerWasMoved) {\n utils.copyCoords(this.prevCoords, this.curCoords);\n }\n }\n }\n\n /*\\\n * Interaction.doMove\n [ method ]\n *\n * Force a move of the current action at the same coordinates. Useful if\n * snap/restrict has been changed and you want a movement with the new\n * settings.\n *\n **\n | interact(target)\n | .draggable(true)\n | .on('dragmove', function (event) {\n | if (someCondition) {\n | // change the snap settings\n | event.interactable.draggable({ snap: { targets: [] }});\n | // fire another move event with re-calculated snap\n | event.interaction.doMove();\n | }\n | });\n \\*/\n doMove (signalArg) {\n signalArg = utils.extend({\n pointer: this.pointers[0],\n event: this.prevEvent,\n eventTarget: this._eventTarget,\n interaction: this,\n }, signalArg || {});\n\n signals.fire('before-action-move', signalArg);\n\n if (!this._dontFireMove) {\n signals.fire('action-move', signalArg);\n }\n\n this._dontFireMove = false;\n }\n\n // End interact move events and stop auto-scroll unless simulation is running\n pointerUp (pointer, event, eventTarget, curEventTarget) {\n const pointerIndex = this.getPointerIndex(pointer);\n\n signals.fire(/cancel$/i.test(event.type)? 'cancel' : 'up', {\n pointer,\n pointerIndex,\n event,\n eventTarget,\n curEventTarget,\n interaction: this,\n });\n\n if (!this.simulation) {\n this.end(event);\n }\n\n this.pointerIsDown = false;\n this.removePointer(pointer, event);\n }\n\n /*\\\n * Interaction.end\n [ method ]\n *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n - event (PointerEvent) #optional\n **\n | interact(target)\n | .draggable(true)\n | .on('move', function (event) {\n | if (event.pageX > 1000) {\n | // end the current action\n | event.interaction.end();\n | // stop all further listeners from being called\n | event.stopImmediatePropagation();\n | }\n | });\n \\*/\n end (event) {\n event = event || this.prevEvent;\n\n if (this.interacting()) {\n signals.fire('action-end', {\n event,\n interaction: this,\n });\n }\n\n this.stop();\n }\n\n currentAction () {\n return this._interacting? this.prepared.name: null;\n }\n\n interacting () {\n return this._interacting;\n }\n\n stop () {\n signals.fire('stop', { interaction: this });\n\n if (this._interacting) {\n signals.fire('stop-active', { interaction: this });\n signals.fire('stop-' + this.prepared.name, { interaction: this });\n }\n\n this.target = this.element = null;\n\n this._interacting = false;\n this.prepared.name = this.prevEvent = null;\n }\n\n getPointerIndex (pointer) {\n return utils.indexOf(this.pointerIds, utils.getPointerId(pointer));\n }\n\n updatePointer (pointer, event, down = event && /(down|start)$/i.test(event.type)) {\n const id = utils.getPointerId(pointer);\n let index = this.getPointerIndex(pointer);\n\n if (index === -1) {\n index = this.pointerIds.length;\n this.pointerIds[index] = id;\n }\n\n if (down) {\n signals.fire('update-pointer-down', {\n pointer,\n event,\n down,\n pointerId: id,\n pointerIndex: index,\n interaction: this,\n });\n }\n\n this.pointers[index] = pointer;\n\n return index;\n }\n\n removePointer (pointer, event) {\n const id = utils.getPointerId(pointer);\n const index = this.mouse? 0 : utils.indexOf(this.pointerIds, id);\n\n if (index === -1) { return; }\n\n signals.fire('remove-pointer', {\n pointer,\n event,\n pointerIndex: index,\n interaction: this,\n });\n\n this.pointers .splice(index, 1);\n this.pointerIds .splice(index, 1);\n this.downTargets.splice(index, 1);\n this.downTimes .splice(index, 1);\n }\n\n _updateEventTargets (target, currentTarget) {\n this._eventTarget = target;\n this._curEventTarget = currentTarget;\n }\n}\n\nfor (let i = 0, len = methodNames.length; i < len; i++) {\n const method = methodNames[i];\n\n listeners[method] = doOnInteractions(method);\n}\n\nfunction doOnInteractions (method) {\n return (function (event) {\n const [eventTarget, curEventTarget] = utils.getEventTargets(event);\n const matches = []; // [ [pointer, interaction], ...]\n\n if (browser.supportsTouch && /touch/.test(event.type)) {\n prevTouchTime = new Date().getTime();\n\n for (let i = 0; i < event.changedTouches.length; i++) {\n const pointer = event.changedTouches[i];\n const interaction = finder.search(pointer, event.type, eventTarget);\n\n matches.push([pointer, interaction || new Interaction()]);\n }\n }\n else {\n let invalidPointer = false;\n\n if (!browser.supportsPointerEvent && /mouse/.test(event.type)) {\n // ignore mouse events while touch interactions are active\n for (let i = 0; i < scope.interactions.length && !invalidPointer; i++) {\n invalidPointer = !scope.interactions[i].mouse && scope.interactions[i].pointerIsDown;\n }\n\n // try to ignore mouse events that are simulated by the browser\n // after a touch event\n invalidPointer = invalidPointer\n || (new Date().getTime() - prevTouchTime < 500)\n // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated\n || event.timeStamp === 0;\n }\n\n if (!invalidPointer) {\n let interaction = finder.search(event, event.type, eventTarget);\n\n if (!interaction) {\n\n interaction = new Interaction();\n interaction.mouse = (/mouse/i.test(event.pointerType || event.type)\n // MSPointerEvent.MSPOINTER_TYPE_MOUSE\n || event.pointerType === 4\n || !event.pointerType);\n }\n\n matches.push([event, interaction]);\n }\n }\n\n for (const [pointer, interaction] of matches) {\n interaction._updateEventTargets(eventTarget, curEventTarget);\n interaction[method](pointer, event, eventTarget, curEventTarget);\n }\n });\n}\n\nfunction endAll (event) {\n for (let i = 0; i < scope.interactions.length; i++) {\n const interaction = scope.interactions[i];\n\n interaction.end(event);\n signals.fire('endall', { event, interaction });\n }\n}\n\nconst docEvents = { /* 'eventType': listenerFunc */ };\nconst pEventTypes = browser.pEventTypes;\n\nif (scope.PointerEvent) {\n docEvents[pEventTypes.down ] = listeners.pointerDown;\n docEvents[pEventTypes.move ] = listeners.pointerMove;\n docEvents[pEventTypes.up ] = listeners.pointerUp;\n docEvents[pEventTypes.cancel] = listeners.pointerUp;\n}\nelse {\n docEvents.mousedown = listeners.pointerDown;\n docEvents.mousemove = listeners.pointerMove;\n docEvents.mouseup = listeners.pointerUp;\n\n docEvents.touchstart = listeners.pointerDown;\n docEvents.touchmove = listeners.pointerMove;\n docEvents.touchend = listeners.pointerUp;\n docEvents.touchcancel = listeners.pointerUp;\n}\n\ndocEvents.blur = endAll;\n\nfunction onDocSignal ({ doc }, signalName) {\n const eventMethod = signalName.indexOf('add') === 0\n ? events.add : events.remove;\n\n // delegate event listener\n for (const eventType in scope.delegatedEvents) {\n eventMethod(doc, eventType, events.delegateListener);\n eventMethod(doc, eventType, events.delegateUseCapture, true);\n }\n\n for (const eventType in docEvents) {\n eventMethod(doc, eventType, docEvents[eventType]);\n }\n}\n\nsignals.on('update-pointer-down', ({ interaction, pointer, pointerId, pointerIndex, event, eventTarget, down }) => {\n interaction.pointerIds[pointerIndex] = pointerId;\n interaction.pointers[pointerIndex] = pointer;\n\n if (down) {\n interaction.pointerIsDown = true;\n }\n\n if (!interaction.interacting()) {\n utils.setCoords(interaction.startCoords, interaction.pointers);\n\n utils.copyCoords(interaction.curCoords , interaction.startCoords);\n utils.copyCoords(interaction.prevCoords, interaction.startCoords);\n\n interaction.downEvent = event;\n interaction.downTimes[pointerIndex] = interaction.curCoords.timeStamp;\n interaction.downTargets[pointerIndex] = eventTarget || event && utils.getEventTargets(event)[0];\n interaction.pointerWasMoved = false;\n\n utils.pointerExtend(interaction.downPointer, pointer);\n }\n});\n\nscope.signals.on('add-document' , onDocSignal);\nscope.signals.on('remove-document', onDocSignal);\n\nInteraction.pointerMoveTolerance = 1;\nInteraction.doOnInteractions = doOnInteractions;\nInteraction.endAll = endAll;\nInteraction.signals = signals;\nInteraction.docEvents = docEvents;\n\nscope.endAllInteractions = endAll;\n\nmodule.exports = Interaction;\n","const Interaction = require('../Interaction');\nconst InteractEvent = require('../InteractEvent');\n\nconst actions = {\n firePrepared,\n names: [],\n methodDict: {},\n};\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n interaction._interacting = true;\n firePrepared(interaction, event, 'start');\n});\n\nInteraction.signals.on('action-move', function ({ interaction, event, preEnd }) {\n firePrepared(interaction, event, 'move', preEnd);\n\n // if the action was ended in a listener\n if (!interaction.interacting()) { return false; }\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n firePrepared(interaction, event, 'end');\n});\n\nfunction firePrepared (interaction, event, phase, preEnd) {\n const actionName = interaction.prepared.name;\n\n const newEvent = new InteractEvent(interaction, event, actionName, phase, interaction.element, null, preEnd);\n\n interaction.target.fire(newEvent);\n interaction.prevEvent = newEvent;\n}\n\nmodule.exports = actions;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drag = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n startAxis : 'xy',\n lockAxis : 'xy',\n },\n\n checker: function (pointer, event, interactable) {\n const dragOptions = interactable.options.drag;\n\n return dragOptions.enabled\n ? { name: 'drag', axis: (dragOptions.lockAxis === 'start'\n ? dragOptions.startAxis\n : dragOptions.lockAxis)}\n : null;\n },\n\n getCursor: function () {\n return 'move';\n },\n};\n\nInteraction.signals.on('before-action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n interaction.curCoords.page.y = interaction.startCoords.page.y;\n interaction.curCoords.client.y = interaction.startCoords.client.y;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vx);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vx);\n interaction.pointerDelta.client.vy = 0;\n interaction.pointerDelta.page.vy = 0;\n }\n else if (axis === 'y') {\n interaction.curCoords.page.x = interaction.startCoords.page.x;\n interaction.curCoords.client.x = interaction.startCoords.client.x;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vy);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vy);\n interaction.pointerDelta.client.vx = 0;\n interaction.pointerDelta.page.vx = 0;\n }\n});\n\n// dragmove\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'dragmove') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n iEvent.pageY = interaction.startCoords.page.y;\n iEvent.clientY = interaction.startCoords.client.y;\n iEvent.dy = 0;\n }\n else if (axis === 'y') {\n iEvent.pageX = interaction.startCoords.page.x;\n iEvent.clientX = interaction.startCoords.client.x;\n iEvent.dx = 0;\n }\n});\n\n/*\\\n * Interactable.draggable\n [ method ]\n *\n * Gets or sets whether drag actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of drag events\n | var isDraggable = interact('ul li').draggable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on drag events (object makes the Interactable draggable)\n = (object) This Interactable\n | interact(element).draggable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // the axis in which the first movement must be\n | // for the drag sequence to start\n | // 'xy' by default - any direction\n | startAxis: 'x' || 'y' || 'xy',\n |\n | // 'xy' by default - don't restrict to one axis (move in any direction)\n | // 'x' or 'y' to restrict movement to either axis\n | // 'start' to restrict movement to the axis the drag started in\n | lockAxis: 'x' || 'y' || 'xy' || 'start',\n |\n | // max number of drags that can happen concurrently\n | // with elements of this Interactable. Infinity by default\n | max: Infinity,\n |\n | // max number of drags that can target the same element+Interactable\n | // 1 by default\n | maxPerElement: 2\n | });\n\\*/\nInteractable.prototype.draggable = function (options) {\n if (utils.is.object(options)) {\n this.options.drag.enabled = options.enabled === false? false: true;\n this.setPerAction('drag', options);\n this.setOnEvents('drag', options);\n\n if (/^(xy|x|y|start)$/.test(options.lockAxis)) {\n this.options.drag.lockAxis = options.lockAxis;\n }\n if (/^(xy|x|y)$/.test(options.startAxis)) {\n this.options.drag.startAxis = options.startAxis;\n }\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drag.enabled = options;\n\n if (!options) {\n this.ondragstart = this.ondragstart = this.ondragend = null;\n }\n\n return this;\n }\n\n return this.options.drag;\n};\n\nactions.drag = drag;\nactions.names.push('drag');\nutils.merge(Interactable.eventTypes, [\n 'dragstart',\n 'dragmove',\n 'draginertiastart',\n 'draginertiaresume',\n 'dragend',\n]);\nactions.methodDict.drag = 'draggable';\n\ndefaultOptions.drag = drag.defaults;\n\nmodule.exports = drag;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst scope = require('../scope');\nconst interact = require('../interact');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drop = {\n defaults: {\n enabled: false,\n accept : null,\n overlap: 'pointer',\n },\n};\n\nlet dynamicDrop = false;\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // reset active dropzones\n interaction.activeDrops.dropzones = [];\n interaction.activeDrops.elements = [];\n interaction.activeDrops.rects = [];\n\n interaction.dropEvents = null;\n\n if (!interaction.dynamicDrop) {\n setActiveDrops(interaction, interaction.element);\n }\n\n const dragEvent = interaction.prevEvent;\n const dropEvents = getDropEvents(interaction, event, dragEvent);\n\n if (dropEvents.activate) {\n fireActiveDrops(interaction, dropEvents.activate);\n }\n});\n\nInteractEvent.signals.on('new', function ({ interaction, iEvent, event }) {\n if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { return; }\n\n const draggableElement = interaction.element;\n const dragEvent = iEvent;\n const dropResult = getDrop(dragEvent, event, draggableElement);\n\n interaction.dropTarget = dropResult.dropzone;\n interaction.dropElement = dropResult.element;\n\n interaction.dropEvents = getDropEvents(interaction, event, dragEvent);\n});\n\nInteraction.signals.on('action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n fireDropEvents(interaction, interaction.dropEvents);\n});\n\nInteraction.signals.on('action-end', function ({ interaction }) {\n if (interaction.prepared.name === 'drag') {\n fireDropEvents(interaction, interaction.dropEvents);\n }\n});\n\nInteraction.signals.on('stop-drag', function ({ interaction }) {\n interaction.activeDrops.dropzones =\n interaction.activeDrops.elements =\n interaction.activeDrops.rects =\n interaction.dropEvents = null;\n});\n\nfunction collectDrops (interaction, element) {\n const drops = [];\n const elements = [];\n\n element = element || interaction.element;\n\n // collect all dropzones and their elements which qualify for a drop\n for (const current of scope.interactables) {\n if (!current.options.drop.enabled) { continue; }\n\n const accept = current.options.drop.accept;\n\n // test the draggable element against the dropzone's accept setting\n if ((utils.is.element(accept) && accept !== element)\n || (utils.is.string(accept)\n && !utils.matchesSelector(element, accept))) {\n\n continue;\n }\n\n // query for new elements if necessary\n const dropElements = utils.is.string(current.target)\n ? current._context.querySelectorAll(current.target)\n : [current.target];\n\n for (let i = 0; i < dropElements.length; i++) {\n const currentElement = dropElements[i];\n\n if (currentElement !== element) {\n drops.push(current);\n elements.push(currentElement);\n }\n }\n }\n\n return {\n elements,\n dropzones: drops,\n };\n}\n\nfunction fireActiveDrops (interaction, event) {\n let prevElement;\n\n // loop through all active dropzones and trigger event\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n const current = interaction.activeDrops.dropzones[i];\n const currentElement = interaction.activeDrops.elements [i];\n\n // prevent trigger of duplicate events on same element\n if (currentElement !== prevElement) {\n // set current element as event target\n event.target = currentElement;\n current.fire(event);\n }\n prevElement = currentElement;\n }\n}\n\n// Collect a new set of possible drops and save them in activeDrops.\n// setActiveDrops should always be called when a drag has just started or a\n// drag event happens while dynamicDrop is true\nfunction setActiveDrops (interaction, dragElement) {\n // get dropzones and their elements that could receive the draggable\n const possibleDrops = collectDrops(interaction, dragElement, true);\n\n interaction.activeDrops.dropzones = possibleDrops.dropzones;\n interaction.activeDrops.elements = possibleDrops.elements;\n interaction.activeDrops.rects = [];\n\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n interaction.activeDrops.rects[i] =\n interaction.activeDrops.dropzones[i].getRect(interaction.activeDrops.elements[i]);\n }\n}\n\nfunction getDrop (dragEvent, event, dragElement) {\n const interaction = dragEvent.interaction;\n const validDrops = [];\n\n if (dynamicDrop) {\n setActiveDrops(interaction, dragElement);\n }\n\n // collect all dropzones and their elements which qualify for a drop\n for (let j = 0; j < interaction.activeDrops.dropzones.length; j++) {\n const current = interaction.activeDrops.dropzones[j];\n const currentElement = interaction.activeDrops.elements [j];\n const rect = interaction.activeDrops.rects [j];\n\n validDrops.push(current.dropCheck(dragEvent, event, interaction.target, dragElement, currentElement, rect)\n ? currentElement\n : null);\n }\n\n // get the most appropriate dropzone based on DOM depth and order\n const dropIndex = utils.indexOfDeepestElement(validDrops);\n\n return {\n dropzone: interaction.activeDrops.dropzones[dropIndex] || null,\n element : interaction.activeDrops.elements [dropIndex] || null,\n };\n}\n\nfunction getDropEvents (interaction, pointerEvent, dragEvent) {\n const dropEvents = {\n enter : null,\n leave : null,\n activate : null,\n deactivate: null,\n move : null,\n drop : null,\n };\n\n const tmpl = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n };\n\n if (interaction.dropElement !== interaction.prevDropElement) {\n // if there was a prevDropTarget, create a dragleave event\n if (interaction.prevDropTarget) {\n dropEvents.leave = utils.extend({ type: 'dragleave' }, tmpl);\n\n dragEvent.dragLeave = dropEvents.leave.target = interaction.prevDropElement;\n dragEvent.prevDropzone = dropEvents.leave.dropzone = interaction.prevDropTarget;\n }\n // if the dropTarget is not null, create a dragenter event\n if (interaction.dropTarget) {\n dropEvents.enter = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n type : 'dragenter',\n };\n\n dragEvent.dragEnter = interaction.dropElement;\n dragEvent.dropzone = interaction.dropTarget;\n }\n }\n\n if (dragEvent.type === 'dragend' && interaction.dropTarget) {\n dropEvents.drop = utils.extend({ type: 'drop' }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n dragEvent.relatedTarget = interaction.dropElement;\n }\n if (dragEvent.type === 'dragstart') {\n dropEvents.activate = utils.extend({ type: 'dropactivate' }, tmpl);\n\n dropEvents.activate.target = null;\n dropEvents.activate.dropzone = null;\n }\n if (dragEvent.type === 'dragend') {\n dropEvents.deactivate = utils.extend({ type: 'dropdeactivate' }, tmpl);\n\n dropEvents.deactivate.target = null;\n dropEvents.deactivate.dropzone = null;\n }\n if (dragEvent.type === 'dragmove' && interaction.dropTarget) {\n dropEvents.move = utils.extend({\n dragmove : dragEvent,\n type : 'dropmove',\n }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n }\n\n return dropEvents;\n}\n\nfunction fireDropEvents (interaction, dropEvents) {\n if (dropEvents.leave) { interaction.prevDropTarget.fire(dropEvents.leave); }\n if (dropEvents.move ) { interaction.dropTarget.fire(dropEvents.move ); }\n if (dropEvents.enter) { interaction.dropTarget.fire(dropEvents.enter); }\n if (dropEvents.drop ) { interaction.dropTarget.fire(dropEvents.drop ); }\n if (dropEvents.deactivate) {\n fireActiveDrops(interaction, dropEvents.deactivate);\n }\n\n interaction.prevDropTarget = interaction.dropTarget;\n interaction.prevDropElement = interaction.dropElement;\n}\n\n/*\\\n * Interactable.dropzone\n [ method ]\n *\n * Returns or sets whether elements can be dropped onto this\n * Interactable to trigger drop events\n *\n * Dropzones can receive the following events:\n * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends\n * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone\n * - `dragmove` when a draggable that has entered the dropzone is moved\n * - `drop` when a draggable is dropped into this dropzone\n *\n * Use the `accept` option to allow only elements that match the given CSS\n * selector or element. The value can be:\n *\n * - **an Element** - only that element can be dropped into this dropzone.\n * - **a string**, - the element being dragged must match it as a CSS selector.\n * - **`null`** - accept options is cleared - it accepts any element.\n *\n * Use the `overlap` option to set how drops are checked for. The allowed\n * values are:\n *\n * - `'pointer'`, the pointer must be over the dropzone (default)\n * - `'center'`, the draggable element's center must be over the dropzone\n * - a number from 0-1 which is the `(intersection area) / (draggable area)`.\n * e.g. `0.5` for drop to happen when half of the area of the draggable is\n * over the dropzone\n *\n * Use the `checker` option to specify a function to check if a dragged\n * element is over this Interactable.\n *\n | interact(target)\n | .dropChecker(function(dragEvent, // related dragmove or dragend event\n | event, // TouchEvent/PointerEvent/MouseEvent\n | dropped, // bool result of the default checker\n | dropzone, // dropzone Interactable\n | dropElement, // dropzone elemnt\n | draggable, // draggable Interactable\n | draggableElement) {// draggable element\n |\n | return dropped && event.target.hasAttribute('allow-drop');\n | }\n *\n *\n - options (boolean | object | null) #optional The new value to be set.\n | interact('.drop').dropzone({\n | accept: '.can-drop' || document.getElementById('single-drop'),\n | overlap: 'pointer' || 'center' || zeroToOne\n | }\n = (boolean | object) The current setting or this Interactable\n\\*/\nInteractable.prototype.dropzone = function (options) {\n if (utils.is.object(options)) {\n this.options.drop.enabled = options.enabled === false? false: true;\n\n if (utils.is.function(options.ondrop) ) { this.events.ondrop = options.ondrop ; }\n if (utils.is.function(options.ondropactivate) ) { this.events.ondropactivate = options.ondropactivate ; }\n if (utils.is.function(options.ondropdeactivate)) { this.events.ondropdeactivate = options.ondropdeactivate; }\n if (utils.is.function(options.ondragenter) ) { this.events.ondragenter = options.ondragenter ; }\n if (utils.is.function(options.ondragleave) ) { this.events.ondragleave = options.ondragleave ; }\n if (utils.is.function(options.ondropmove) ) { this.events.ondropmove = options.ondropmove ; }\n\n if (/^(pointer|center)$/.test(options.overlap)) {\n this.options.drop.overlap = options.overlap;\n }\n else if (utils.is.number(options.overlap)) {\n this.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0);\n }\n if ('accept' in options) {\n this.options.drop.accept = options.accept;\n }\n if ('checker' in options) {\n this.options.drop.checker = options.checker;\n }\n\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drop.enabled = options;\n\n if (!options) {\n this.ondragenter = this.ondragleave = this.ondrop\n = this.ondropactivate = this.ondropdeactivate = null;\n }\n\n return this;\n }\n\n return this.options.drop;\n};\n\nInteractable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) {\n let dropped = false;\n\n // if the dropzone has no rect (eg. display: none)\n // call the custom dropChecker or just return false\n if (!(rect = rect || this.getRect(dropElement))) {\n return (this.options.drop.checker\n ? this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement)\n : false);\n }\n\n const dropOverlap = this.options.drop.overlap;\n\n if (dropOverlap === 'pointer') {\n const origin = utils.getOriginXY(draggable, draggableElement, 'drag');\n const page = utils.getPageXY(dragEvent);\n\n page.x += origin.x;\n page.y += origin.y;\n\n const horizontal = (page.x > rect.left) && (page.x < rect.right);\n const vertical = (page.y > rect.top ) && (page.y < rect.bottom);\n\n dropped = horizontal && vertical;\n }\n\n const dragRect = draggable.getRect(draggableElement);\n\n if (dragRect && dropOverlap === 'center') {\n const cx = dragRect.left + dragRect.width / 2;\n const cy = dragRect.top + dragRect.height / 2;\n\n dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom;\n }\n\n if (dragRect && utils.is.number(dropOverlap)) {\n const overlapArea = (Math.max(0, Math.min(rect.right , dragRect.right ) - Math.max(rect.left, dragRect.left))\n * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top , dragRect.top )));\n\n const overlapRatio = overlapArea / (dragRect.width * dragRect.height);\n\n dropped = overlapRatio >= dropOverlap;\n }\n\n if (this.options.drop.checker) {\n dropped = this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement);\n }\n\n return dropped;\n};\n\nInteractable.signals.on('unset', function ({ interactable }) {\n interactable.dropzone(false);\n});\n\nInteractable.settingsMethods.push('dropChecker');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.dropTarget = null; // the dropzone a drag target might be dropped into\n interaction.dropElement = null; // the element at the time of checking\n interaction.prevDropTarget = null; // the dropzone that was recently dragged away from\n interaction.prevDropElement = null; // the element at the time of checking\n interaction.dropEvents = null; // the dropEvents related to the current drag event\n\n interaction.activeDrops = {\n dropzones: [], // the dropzones that are mentioned below\n elements : [], // elements of dropzones that accept the target draggable\n rects : [], // the rects of the elements mentioned above\n };\n\n});\n\nInteraction.signals.on('stop', function ({ interaction }) {\n interaction.dropTarget = interaction.dropElement =\n interaction.prevDropTarget = interaction.prevDropElement = null;\n});\n\n/*\\\n * interact.dynamicDrop\n [ method ]\n *\n * Returns or sets whether the dimensions of dropzone elements are\n * calculated on every dragmove or only on dragstart for the default\n * dropChecker\n *\n - newValue (boolean) #optional True to check on each move. False to check only before start\n = (boolean | interact) The current setting or interact\n\\*/\ninteract.dynamicDrop = function (newValue) {\n if (utils.is.bool(newValue)) {\n //if (dragging && dynamicDrop !== newValue && !newValue) {\n //calcRects(dropzones);\n //}\n\n dynamicDrop = newValue;\n\n return interact;\n }\n return dynamicDrop;\n};\n\nutils.merge(Interactable.eventTypes, [\n 'dragenter',\n 'dragleave',\n 'dropactivate',\n 'dropdeactivate',\n 'dropmove',\n 'drop',\n]);\nactions.methodDict.drop = 'dropzone';\n\ndefaultOptions.drop = drop.defaults;\n\nmodule.exports = drop;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst gesture = {\n defaults: {\n enabled : false,\n origin : null,\n restrict: null,\n },\n\n checker: function (pointer, event, interactable, element, interaction) {\n if (interaction.pointerIds.length >= 2) {\n return { name: 'gesture' };\n }\n\n return null;\n },\n\n getCursor: function () {\n return '';\n },\n};\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturestart') { return; }\n iEvent.ds = 0;\n\n interaction.gesture.startDistance = interaction.gesture.prevDistance = iEvent.distance;\n interaction.gesture.startAngle = interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.scale = 1;\n});\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturemove') { return; }\n\n iEvent.ds = iEvent.scale - interaction.gesture.scale;\n\n interaction.target.fire(iEvent);\n\n interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.prevDistance = iEvent.distance;\n\n if (iEvent.scale !== Infinity\n && iEvent.scale !== null\n && iEvent.scale !== undefined\n && !isNaN(iEvent.scale)) {\n\n interaction.gesture.scale = iEvent.scale;\n }\n});\n\n/*\\\n * Interactable.gesturable\n [ method ]\n *\n * Gets or sets whether multitouch gestures can be performed on the\n * Interactable's element\n *\n = (boolean) Indicates if this can be the target of gesture events\n | var isGestureable = interact(element).gesturable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on gesture events (makes the Interactable gesturable)\n = (object) this Interactable\n | interact(element).gesturable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // limit multiple gestures.\n | // See the explanation in @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n\\*/\nInteractable.prototype.gesturable = function (options) {\n if (utils.is.object(options)) {\n this.options.gesture.enabled = options.enabled === false? false: true;\n this.setPerAction('gesture', options);\n this.setOnEvents('gesture', options);\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.gesture.enabled = options;\n\n if (!options) {\n this.ongesturestart = this.ongesturestart = this.ongestureend = null;\n }\n\n return this;\n }\n\n return this.options.gesture;\n};\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action, event, starting, ending, deltaSource }) {\n if (action !== 'gesture') { return; }\n\n const pointers = interaction.pointers;\n\n iEvent.touches = [pointers[0], pointers[1]];\n\n if (starting) {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = 1;\n iEvent.ds = 0;\n iEvent.angle = utils.touchAngle(pointers, undefined, deltaSource);\n iEvent.da = 0;\n }\n else if (ending || event instanceof InteractEvent) {\n iEvent.distance = interaction.prevEvent.distance;\n iEvent.box = interaction.prevEvent.box;\n iEvent.scale = interaction.prevEvent.scale;\n iEvent.ds = iEvent.scale - 1;\n iEvent.angle = interaction.prevEvent.angle;\n iEvent.da = iEvent.angle - interaction.gesture.startAngle;\n }\n else {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = iEvent.distance / interaction.gesture.startDistance;\n iEvent.angle = utils.touchAngle(pointers, interaction.gesture.prevAngle, deltaSource);\n\n iEvent.ds = iEvent.scale - interaction.gesture.prevScale;\n iEvent.da = iEvent.angle - interaction.gesture.prevAngle;\n }\n});\n\nInteraction.signals.on('new', function (interaction) {\n interaction.gesture = {\n start: { x: 0, y: 0 },\n\n startDistance: 0, // distance between two touches of touchStart\n prevDistance : 0,\n distance : 0,\n\n scale: 1, // gesture.distance / gesture.startDistance\n\n startAngle: 0, // angle of line joining two touches\n prevAngle : 0, // angle of the previous gesture event\n };\n});\n\nactions.gesture = gesture;\nactions.names.push('gesture');\nutils.merge(Interactable.eventTypes, [\n 'gesturestart',\n 'gesturemove',\n 'gestureend',\n]);\nactions.methodDict.gesture = 'gesturable';\n\ndefaultOptions.gesture = gesture.defaults;\n\nmodule.exports = gesture;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\n// Less Precision with touch input\nconst defaultMargin = browser.supportsTouch || browser.supportsPointerEvent? 20: 10;\n\nconst resize = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n square: false,\n preserveAspectRatio: false,\n axis: 'xy',\n\n // use default margin\n margin: NaN,\n\n // object with props left, right, top, bottom which are\n // true/false values to resize when the pointer is over that edge,\n // CSS selectors to match the handles for each direction\n // or the Elements for each handle\n edges: null,\n\n // a value of 'none' will limit the resize rect to a minimum of 0x0\n // 'negate' will alow the rect to have negative width/height\n // 'reposition' will keep the width/height positive by swapping\n // the top and bottom edges and/or swapping the left and right edges\n invert: 'none',\n },\n\n checker: function (pointer, event, interactable, element, interaction, rect) {\n if (!rect) { return null; }\n\n const page = utils.extend({}, interaction.curCoords.page);\n const options = interactable.options;\n\n if (options.resize.enabled) {\n const resizeOptions = options.resize;\n const resizeEdges = { left: false, right: false, top: false, bottom: false };\n\n // if using resize.edges\n if (utils.is.object(resizeOptions.edges)) {\n for (const edge in resizeEdges) {\n resizeEdges[edge] = checkResizeEdge(edge,\n resizeOptions.edges[edge],\n page,\n interaction._eventTarget,\n element,\n rect,\n resizeOptions.margin || defaultMargin);\n }\n\n resizeEdges.left = resizeEdges.left && !resizeEdges.right;\n resizeEdges.top = resizeEdges.top && !resizeEdges.bottom;\n\n if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) {\n return {\n name: 'resize',\n edges: resizeEdges,\n };\n }\n }\n else {\n const right = options.resize.axis !== 'y' && page.x > (rect.right - defaultMargin);\n const bottom = options.resize.axis !== 'x' && page.y > (rect.bottom - defaultMargin);\n\n if (right || bottom) {\n return {\n name: 'resize',\n axes: (right? 'x' : '') + (bottom? 'y' : ''),\n };\n }\n }\n }\n\n return null;\n },\n\n cursors: (browser.isIe9OrOlder ? {\n x : 'e-resize',\n y : 's-resize',\n xy: 'se-resize',\n\n top : 'n-resize',\n left : 'w-resize',\n bottom : 's-resize',\n right : 'e-resize',\n topleft : 'se-resize',\n bottomright: 'se-resize',\n topright : 'ne-resize',\n bottomleft : 'ne-resize',\n } : {\n x : 'ew-resize',\n y : 'ns-resize',\n xy: 'nwse-resize',\n\n top : 'ns-resize',\n left : 'ew-resize',\n bottom : 'ns-resize',\n right : 'ew-resize',\n topleft : 'nwse-resize',\n bottomright: 'nwse-resize',\n topright : 'nesw-resize',\n bottomleft : 'nesw-resize',\n }),\n\n getCursor: function (action) {\n if (action.axis) {\n return resize.cursors[action.name + action.axis];\n }\n else if (action.edges) {\n let cursorKey = '';\n const edgeNames = ['top', 'bottom', 'left', 'right'];\n\n for (let i = 0; i < 4; i++) {\n if (action.edges[edgeNames[i]]) {\n cursorKey += edgeNames[i];\n }\n }\n\n return resize.cursors[cursorKey];\n }\n },\n};\n\n// resizestart\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'resizestart' || !interaction.prepared.edges) {\n return;\n }\n\n const startRect = interaction.target.getRect(interaction.element);\n const resizeOptions = interaction.target.options.resize;\n\n /*\n * When using the `resizable.square` or `resizable.preserveAspectRatio` options, resizing from one edge\n * will affect another. E.g. with `resizable.square`, resizing to make the right edge larger will make\n * the bottom edge larger by the same amount. We call these 'linked' edges. Any linked edges will depend\n * on the active edges and the edge being interacted with.\n */\n if (resizeOptions.square || resizeOptions.preserveAspectRatio) {\n const linkedEdges = utils.extend({}, interaction.prepared.edges);\n\n linkedEdges.top = linkedEdges.top || (linkedEdges.left && !linkedEdges.bottom);\n linkedEdges.left = linkedEdges.left || (linkedEdges.top && !linkedEdges.right );\n linkedEdges.bottom = linkedEdges.bottom || (linkedEdges.right && !linkedEdges.top );\n linkedEdges.right = linkedEdges.right || (linkedEdges.bottom && !linkedEdges.left );\n\n interaction.prepared._linkedEdges = linkedEdges;\n }\n else {\n interaction.prepared._linkedEdges = null;\n }\n\n // if using `resizable.preserveAspectRatio` option, record aspect ratio at the start of the resize\n if (resizeOptions.preserveAspectRatio) {\n interaction.resizeStartAspectRatio = startRect.width / startRect.height;\n }\n\n interaction.resizeRects = {\n start : startRect,\n current : utils.extend({}, startRect),\n inverted : utils.extend({}, startRect),\n previous : utils.extend({}, startRect),\n delta : {\n left: 0, right : 0, width : 0,\n top : 0, bottom: 0, height: 0,\n },\n };\n\n iEvent.rect = interaction.resizeRects.inverted;\n iEvent.deltaRect = interaction.resizeRects.delta;\n});\n\n// resizemove\nInteractEvent.signals.on('new', function ({ iEvent, phase, interaction }) {\n if (phase !== 'move' || !interaction.prepared.edges) { return; }\n\n const resizeOptions = interaction.target.options.resize;\n const invert = resizeOptions.invert;\n const invertible = invert === 'reposition' || invert === 'negate';\n\n let edges = interaction.prepared.edges;\n\n const start = interaction.resizeRects.start;\n const current = interaction.resizeRects.current;\n const inverted = interaction.resizeRects.inverted;\n const delta = interaction.resizeRects.delta;\n const previous = utils.extend(interaction.resizeRects.previous, inverted);\n const originalEdges = edges;\n\n let dx = iEvent.dx;\n let dy = iEvent.dy;\n\n if (resizeOptions.preserveAspectRatio || resizeOptions.square) {\n // `resize.preserveAspectRatio` takes precedence over `resize.square`\n const startAspectRatio = resizeOptions.preserveAspectRatio\n ? interaction.resizeStartAspectRatio\n : 1;\n\n edges = interaction.prepared._linkedEdges;\n\n if ((originalEdges.left && originalEdges.bottom)\n || (originalEdges.right && originalEdges.top)) {\n dy = -dx / startAspectRatio;\n }\n else if (originalEdges.left || originalEdges.right ) { dy = dx / startAspectRatio; }\n else if (originalEdges.top || originalEdges.bottom) { dx = dy * startAspectRatio; }\n }\n\n // update the 'current' rect without modifications\n if (edges.top ) { current.top += dy; }\n if (edges.bottom) { current.bottom += dy; }\n if (edges.left ) { current.left += dx; }\n if (edges.right ) { current.right += dx; }\n\n if (invertible) {\n // if invertible, copy the current rect\n utils.extend(inverted, current);\n\n if (invert === 'reposition') {\n // swap edge values if necessary to keep width/height positive\n let swap;\n\n if (inverted.top > inverted.bottom) {\n swap = inverted.top;\n\n inverted.top = inverted.bottom;\n inverted.bottom = swap;\n }\n if (inverted.left > inverted.right) {\n swap = inverted.left;\n\n inverted.left = inverted.right;\n inverted.right = swap;\n }\n }\n }\n else {\n // if not invertible, restrict to minimum of 0x0 rect\n inverted.top = Math.min(current.top, start.bottom);\n inverted.bottom = Math.max(current.bottom, start.top);\n inverted.left = Math.min(current.left, start.right);\n inverted.right = Math.max(current.right, start.left);\n }\n\n inverted.width = inverted.right - inverted.left;\n inverted.height = inverted.bottom - inverted.top ;\n\n for (const edge in inverted) {\n delta[edge] = inverted[edge] - previous[edge];\n }\n\n iEvent.edges = interaction.prepared.edges;\n iEvent.rect = inverted;\n iEvent.deltaRect = delta;\n});\n\n/*\\\n * Interactable.resizable\n [ method ]\n *\n * Gets or sets whether resize actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of resize elements\n | var isResizeable = interact('input[type=text]').resizable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on resize events (object makes the Interactable resizable)\n = (object) This Interactable\n | interact(element).resizable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | edges: {\n | top : true, // Use pointer coords to check for resize.\n | left : false, // Disable resizing from left edge.\n | bottom: '.resize-s',// Resize if pointer target matches selector\n | right : handleEl // Resize if pointer target is the given Element\n | },\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height are adjusted at a 1:1 ratio.\n | square: false,\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height maintain the aspect ratio they had when resizing started.\n | preserveAspectRatio: false,\n |\n | // a value of 'none' will limit the resize rect to a minimum of 0x0\n | // 'negate' will allow the rect to have negative width/height\n | // 'reposition' will keep the width/height positive by swapping\n | // the top and bottom edges and/or swapping the left and right edges\n | invert: 'none' || 'negate' || 'reposition'\n |\n | // limit multiple resizes.\n | // See the explanation in the @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n \\*/\nInteractable.prototype.resizable = function (options) {\n if (utils.is.object(options)) {\n this.options.resize.enabled = options.enabled === false? false: true;\n this.setPerAction('resize', options);\n this.setOnEvents('resize', options);\n\n if (/^x$|^y$|^xy$/.test(options.axis)) {\n this.options.resize.axis = options.axis;\n }\n else if (options.axis === null) {\n this.options.resize.axis = defaultOptions.resize.axis;\n }\n\n if (utils.is.bool(options.preserveAspectRatio)) {\n this.options.resize.preserveAspectRatio = options.preserveAspectRatio;\n }\n else if (utils.is.bool(options.square)) {\n this.options.resize.square = options.square;\n }\n\n return this;\n }\n if (utils.is.bool(options)) {\n this.options.resize.enabled = options;\n\n if (!options) {\n this.onresizestart = this.onresizestart = this.onresizeend = null;\n }\n\n return this;\n }\n return this.options.resize;\n};\n\nfunction checkResizeEdge (name, value, page, element, interactableElement, rect, margin) {\n // false, '', undefined, null\n if (!value) { return false; }\n\n // true value, use pointer coords and element rect\n if (value === true) {\n // if dimensions are negative, \"switch\" edges\n const width = utils.is.number(rect.width )? rect.width : rect.right - rect.left;\n const height = utils.is.number(rect.height)? rect.height : rect.bottom - rect.top ;\n\n if (width < 0) {\n if (name === 'left' ) { name = 'right'; }\n else if (name === 'right') { name = 'left' ; }\n }\n if (height < 0) {\n if (name === 'top' ) { name = 'bottom'; }\n else if (name === 'bottom') { name = 'top' ; }\n }\n\n if (name === 'left' ) { return page.x < ((width >= 0? rect.left: rect.right ) + margin); }\n if (name === 'top' ) { return page.y < ((height >= 0? rect.top : rect.bottom) + margin); }\n\n if (name === 'right' ) { return page.x > ((width >= 0? rect.right : rect.left) - margin); }\n if (name === 'bottom') { return page.y > ((height >= 0? rect.bottom: rect.top ) - margin); }\n }\n\n // the remaining checks require an element\n if (!utils.is.element(element)) { return false; }\n\n return utils.is.element(value)\n // the value is an element to use as a resize handle\n ? value === element\n // otherwise check if element matches value as selector\n : utils.matchesUpTo(element, value, interactableElement);\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.resizeAxes = 'xy';\n});\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action }) {\n if (action !== 'resize' || !interaction.resizeAxes) { return; }\n\n const options = interaction.target.options;\n\n if (options.resize.square) {\n if (interaction.resizeAxes === 'y') {\n iEvent.dx = iEvent.dy;\n }\n else {\n iEvent.dy = iEvent.dx;\n }\n iEvent.axes = 'xy';\n }\n else {\n iEvent.axes = interaction.resizeAxes;\n\n if (interaction.resizeAxes === 'x') {\n iEvent.dy = 0;\n }\n else if (interaction.resizeAxes === 'y') {\n iEvent.dx = 0;\n }\n }\n});\n\nactions.resize = resize;\nactions.names.push('resize');\nutils.merge(Interactable.eventTypes, [\n 'resizestart',\n 'resizemove',\n 'resizeinertiastart',\n 'resizeinertiaresume',\n 'resizeend',\n]);\nactions.methodDict.resize = 'resizable';\n\ndefaultOptions.resize = resize.defaults;\n\nmodule.exports = resize;\n","const raf = require('./utils/raf');\nconst getWindow = require('./utils/window').getWindow;\nconst is = require('./utils/is');\nconst domUtils = require('./utils/domUtils');\nconst Interaction = require('./Interaction');\nconst defaultOptions = require('./defaultOptions');\n\nconst autoScroll = {\n defaults: {\n enabled : false,\n container: null, // the item that is scrolled (Window or HTMLElement)\n margin : 60,\n speed : 300, // the scroll speed in pixels per second\n },\n\n interaction: null,\n i: null, // the handle returned by window.setInterval\n x: 0, y: 0, // Direction each pulse is to scroll in\n\n isScrolling: false,\n prevTime: 0,\n\n start: function (interaction) {\n autoScroll.isScrolling = true;\n raf.cancel(autoScroll.i);\n\n autoScroll.interaction = interaction;\n autoScroll.prevTime = new Date().getTime();\n autoScroll.i = raf.request(autoScroll.scroll);\n },\n\n stop: function () {\n autoScroll.isScrolling = false;\n raf.cancel(autoScroll.i);\n },\n\n // scroll the window by the values in scroll.x/y\n scroll: function () {\n const options = autoScroll.interaction.target.options[autoScroll.interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(autoScroll.interaction.element);\n const now = new Date().getTime();\n // change in time in seconds\n const dt = (now - autoScroll.prevTime) / 1000;\n // displacement\n const s = options.speed * dt;\n\n if (s >= 1) {\n if (is.window(container)) {\n container.scrollBy(autoScroll.x * s, autoScroll.y * s);\n }\n else if (container) {\n container.scrollLeft += autoScroll.x * s;\n container.scrollTop += autoScroll.y * s;\n }\n\n autoScroll.prevTime = now;\n }\n\n if (autoScroll.isScrolling) {\n raf.cancel(autoScroll.i);\n autoScroll.i = raf.request(autoScroll.scroll);\n }\n },\n check: function (interactable, actionName) {\n const options = interactable.options;\n\n return options[actionName].autoScroll && options[actionName].autoScroll.enabled;\n },\n onInteractionMove: function ({ interaction, pointer }) {\n if (!(interaction.interacting()\n && autoScroll.check(interaction.target, interaction.prepared.name))) {\n return;\n }\n\n if (interaction.simulation) {\n autoScroll.x = autoScroll.y = 0;\n return;\n }\n\n let top;\n let right;\n let bottom;\n let left;\n\n const options = interaction.target.options[interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(interaction.element);\n\n if (is.window(container)) {\n left = pointer.clientX < autoScroll.margin;\n top = pointer.clientY < autoScroll.margin;\n right = pointer.clientX > container.innerWidth - autoScroll.margin;\n bottom = pointer.clientY > container.innerHeight - autoScroll.margin;\n }\n else {\n const rect = domUtils.getElementClientRect(container);\n\n left = pointer.clientX < rect.left + autoScroll.margin;\n top = pointer.clientY < rect.top + autoScroll.margin;\n right = pointer.clientX > rect.right - autoScroll.margin;\n bottom = pointer.clientY > rect.bottom - autoScroll.margin;\n }\n\n autoScroll.x = (right ? 1: left? -1: 0);\n autoScroll.y = (bottom? 1: top? -1: 0);\n\n if (!autoScroll.isScrolling) {\n // set the autoScroll properties to those of the target\n autoScroll.margin = options.margin;\n autoScroll.speed = options.speed;\n\n autoScroll.start(interaction);\n }\n },\n};\n\nInteraction.signals.on('stop-active', function () {\n autoScroll.stop();\n});\n\nInteraction.signals.on('action-move', autoScroll.onInteractionMove);\n\ndefaultOptions.perAction.autoScroll = autoScroll.defaults;\n\nmodule.exports = autoScroll;\n","const Interactable = require('../Interactable');\nconst actions = require('../actions/base');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.ignoreFrom\n [ method ]\n *\n * If the target of the `mousedown`, `pointerdown` or `touchstart`\n * event or any of it's parents match the given CSS selector or\n * Element, no drag/resize/gesture is started.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to not ignore any elements\n = (string | Element | object) The current ignoreFrom value or this Interactable\n **\n | interact(element, { ignoreFrom: document.getElementById('no-action') });\n | // or\n | interact(element).ignoreFrom('input, textarea, a');\n\\*/\nInteractable.prototype.ignoreFrom = function (newValue) {\n return this._backCompatOption('ignoreFrom', newValue);\n};\n\n/*\\\n * Interactable.allowFrom\n [ method ]\n *\n * A drag/resize/gesture is started only If the target of the\n * `mousedown`, `pointerdown` or `touchstart` event or any of it's\n * parents match the given CSS selector or Element.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to allow from any element\n = (string | Element | object) The current allowFrom value or this Interactable\n **\n | interact(element, { allowFrom: document.getElementById('drag-handle') });\n | // or\n | interact(element).allowFrom('.handle');\n\\*/\nInteractable.prototype.allowFrom = function (newValue) {\n return this._backCompatOption('allowFrom', newValue);\n};\n\nInteractable.prototype.testIgnore = function (ignoreFrom, interactableElement, element) {\n if (!ignoreFrom || !is.element(element)) { return false; }\n\n if (is.string(ignoreFrom)) {\n return domUtils.matchesUpTo(element, ignoreFrom, interactableElement);\n }\n else if (is.element(ignoreFrom)) {\n return domUtils.nodeContains(ignoreFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testAllow = function (allowFrom, interactableElement, element) {\n if (!allowFrom) { return true; }\n\n if (!is.element(element)) { return false; }\n\n if (is.string(allowFrom)) {\n return domUtils.matchesUpTo(element, allowFrom, interactableElement);\n }\n else if (is.element(allowFrom)) {\n return domUtils.nodeContains(allowFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testIgnoreAllow = function (options, interactableElement, eventTarget) {\n return (!this.testIgnore(options.ignoreFrom, interactableElement, eventTarget)\n && this.testAllow(options.allowFrom, interactableElement, eventTarget));\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (event.buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\n","const interact = require('../interact');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst actions = require('../actions/base');\nconst defaultOptions = require('../defaultOptions');\nconst browser = require('../utils/browser');\nconst scope = require('../scope');\nconst utils = require('../utils');\nconst signals = require('../utils/Signals').new();\n\nrequire('./InteractableMethods');\n\nconst autoStart = {\n signals,\n withinInteractionLimit,\n // Allow this many interactions to happen simultaneously\n maxInteractions: Infinity,\n defaults: {\n perAction: {\n manualStart: false,\n max: Infinity,\n maxPerElement: 1,\n allowFrom: null,\n ignoreFrom: null,\n },\n },\n setActionDefaults: function (action) {\n utils.extend(action.defaults, autoStart.defaults.perAction);\n },\n};\n\n// set cursor style on mousedown\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget }) {\n if (interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\n// set cursor style on mousemove\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget }) {\n if (!interaction.mouse\n || interaction.pointerIsDown\n || interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\nInteraction.signals.on('move', function (arg) {\n const { interaction, event } = arg;\n\n if (!interaction.pointerIsDown\n || interaction.interacting()\n || !interaction.pointerWasMoved\n || !interaction.prepared.name) {\n return;\n }\n\n signals.fire('before-start', arg);\n\n const target = interaction.target;\n\n if (interaction.prepared.name && target) {\n // check manualStart and interaction limit\n if (target.options[interaction.prepared.name].manualStart\n || !withinInteractionLimit(target, interaction.element, interaction.prepared)) {\n interaction.stop(event);\n }\n else {\n interaction.start(interaction.prepared, target, interaction.element);\n }\n }\n});\n\n// Check if the current target supports the action.\n// If so, return the validated action. Otherwise, return null\nfunction validateAction (action, interactable, element, eventTarget) {\n if (utils.is.object(action)\n && interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget)\n && interactable.options[action.name].enabled\n && withinInteractionLimit(interactable, element, action)) {\n return action;\n }\n\n return null;\n}\n\nfunction validateSelector (interaction, pointer, event, matches, matchElements, eventTarget) {\n for (let i = 0, len = matches.length; i < len; i++) {\n const match = matches[i];\n const matchElement = matchElements[i];\n const action = validateAction(match.getAction(pointer, event, interaction, matchElement),\n match,\n matchElement,\n eventTarget);\n\n if (action) {\n return {\n action,\n target: match,\n element: matchElement,\n };\n }\n }\n\n return {};\n}\n\nfunction getActionInfo (interaction, pointer, event, eventTarget) {\n let matches = [];\n let matchElements = [];\n\n let element = eventTarget;\n let action = null;\n\n function pushMatches (interactable, selector, context) {\n const elements = (browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined);\n\n if (utils.matchesSelector(element, selector, elements)) {\n\n matches.push(interactable);\n matchElements.push(element);\n }\n }\n\n while (utils.is.element(element)) {\n matches = [];\n matchElements = [];\n\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && (action = validateAction(elementInteractable.getAction(pointer, event, interaction, element, eventTarget),\n elementInteractable,\n element,\n eventTarget))\n && !elementInteractable.options[action.name].manualStart) {\n return {\n element,\n action,\n target: elementInteractable,\n };\n }\n else {\n scope.interactables.forEachSelector(pushMatches, element);\n\n const actionInfo = validateSelector(interaction, pointer, event, matches, matchElements, eventTarget);\n\n if (actionInfo.action\n && !actionInfo.target.options[actionInfo.action.name].manualStart) {\n return actionInfo;\n }\n }\n\n element = utils.parentNode(element);\n }\n\n return {};\n}\n\nfunction prepare (interaction, { action, target, element }) {\n action = action || {};\n\n if (interaction.target && interaction.target.options.styleCursor) {\n interaction.target._doc.documentElement.style.cursor = '';\n }\n\n interaction.target = target;\n interaction.element = element;\n utils.copyAction(interaction.prepared, action);\n\n if (target && target.options.styleCursor) {\n const cursor = action? actions[action.name].getCursor(action) : '';\n interaction.target._doc.documentElement.style.cursor = cursor;\n }\n\n signals.fire('prepared', { interaction: interaction });\n}\n\nInteraction.signals.on('stop', function ({ interaction }) {\n const target = interaction.target;\n\n if (target && target.options.styleCursor) {\n target._doc.documentElement.style.cursor = '';\n }\n});\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (utils.is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (utils.is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n const buttons = event.buttons || ({\n 0: 1,\n 1: 4,\n 3: 8,\n 4: 16,\n })[event.button];\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\nfunction withinInteractionLimit (interactable, element, action) {\n const options = interactable.options;\n const maxActions = options[action.name].max;\n const maxPerElement = options[action.name].maxPerElement;\n let activeInteractions = 0;\n let targetCount = 0;\n let targetElementCount = 0;\n\n // no actions if any of these values == 0\n if (!(maxActions && maxPerElement && autoStart.maxInteractions)) { return; }\n\n for (let i = 0, len = scope.interactions.length; i < len; i++) {\n const interaction = scope.interactions[i];\n const otherAction = interaction.prepared.name;\n\n if (!interaction.interacting()) { continue; }\n\n activeInteractions++;\n\n if (activeInteractions >= autoStart.maxInteractions) {\n return false;\n }\n\n if (interaction.target !== interactable) { continue; }\n\n targetCount += (otherAction === action.name)|0;\n\n if (targetCount >= maxActions) {\n return false;\n }\n\n if (interaction.element === element) {\n targetElementCount++;\n\n if (otherAction !== action.name || targetElementCount >= maxPerElement) {\n return false;\n }\n }\n }\n\n return autoStart.maxInteractions > 0;\n}\n\n/*\\\n * interact.maxInteractions\n [ method ]\n **\n * Returns or sets the maximum number of concurrent interactions allowed.\n * By default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables\n * and elements, you need to enable it in the draggable, resizable and\n * gesturable `'max'` and `'maxPerElement'` options.\n **\n - newValue (number) #optional Any number. newValue <= 0 means no interactions.\n\\*/\ninteract.maxInteractions = function (newValue) {\n if (utils.is.number(newValue)) {\n autoStart.maxInteractions = newValue;\n\n return this;\n }\n\n return autoStart.maxInteractions;\n};\n\nInteractable.settingsMethods.push('styleCursor');\nInteractable.settingsMethods.push('actionChecker');\nInteractable.settingsMethods.push('ignoreFrom');\nInteractable.settingsMethods.push('allowFrom');\n\ndefaultOptions.base.actionChecker = null;\ndefaultOptions.base.styleCursor = true;\n\nutils.extend(defaultOptions.perAction, autoStart.defaults.perAction);\n\nmodule.exports = autoStart;\n","const autoStart = require('./base');\nconst Interaction = require('../Interaction');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.delayTimer = null;\n});\n\nautoStart.signals.on('prepared', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.delayTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.target, interaction.element);\n }, delay);\n }\n});\n\nInteraction.signals.on('move', function ({ interaction, duplicate }) {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.delayTimer);\n }\n});\n\n// prevent regular down->move autoStart\nautoStart.signals.on('before-start', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.prepared.name = null;\n }\n});\n","const autoStart = require('./base');\nconst scope = require('../scope');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\n\nconst { matchesSelector, parentNode } = require('../utils/domUtils');\n\nautoStart.setActionDefaults(require('../actions/drag'));\n\nautoStart.signals.on('before-start', function ({ interaction, eventTarget, dx, dy }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // check if a drag is in the correct axis\n const absX = Math.abs(dx);\n const absY = Math.abs(dy);\n const options = interaction.target.options.drag;\n const startAxis = options.startAxis;\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy');\n\n interaction.prepared.axis = options.lockAxis === 'start'\n ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n : options.lockAxis;\n\n // if the movement isn't in the startAxis of the interactable\n if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) {\n // cancel the prepared action\n interaction.prepared.name = null;\n\n // then try to get a drag from another ineractable\n\n if (!interaction.prepared.name) {\n\n let element = eventTarget;\n\n const getDraggable = function (interactable, selector, context) {\n const elements = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n if (interactable === interaction.target) { return; }\n\n if (!options.manualStart\n && !interactable.testIgnoreAllow(options, element, eventTarget)\n && matchesSelector(element, selector, elements)) {\n\n const action = interactable.getAction(interaction.downPointer,\n interaction.downEvent,\n interaction,\n element);\n\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, interactable)\n && autoStart.validateAction(action, interactable, element, eventTarget)) {\n\n return interactable;\n }\n }\n };\n\n let action = null;\n\n // check all interactables\n while (is.element(element)) {\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && elementInteractable !== interaction.target\n && !elementInteractable.options.drag.manualStart) {\n\n action = elementInteractable.getAction(interaction.downPointer, interaction.downEvent, interaction, element);\n }\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, elementInteractable)) {\n\n interaction.prepared.name = 'drag';\n interaction.target = elementInteractable;\n interaction.element = element;\n break;\n }\n\n const selectorInteractable = scope.interactables.forEachSelector(getDraggable, element);\n\n if (selectorInteractable) {\n interaction.prepared.name = 'drag';\n interaction.target = selectorInteractable;\n interaction.element = element;\n break;\n }\n\n element = parentNode(element);\n }\n }\n }\n});\n\nfunction checkStartAxis (startAxis, interactable) {\n if (!interactable) { return false; }\n\n const thisAxis = interactable.options.drag.startAxis;\n\n return (startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis);\n}\n","require('./base').setActionDefaults(require('../actions/gesture'));\n","require('./base').setActionDefaults(require('../actions/resize'));\n","module.exports = {\n base: {\n accept : null,\n preventDefault: 'auto',\n deltaSource : 'page',\n },\n\n perAction: {\n origin: { x: 0, y: 0 },\n\n // only allow left button by default\n // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n mouseButtons: 1,\n\n inertia: {\n enabled : false,\n resistance : 10, // the lambda in exponential decay\n minSpeed : 100, // target speed must be above this for inertia to start\n endSpeed : 10, // the speed at which inertia is slow enough to stop\n allowResume : true, // allow resuming an action in inertia phase\n smoothEndDuration: 300, // animate to snap/restrict endOnly if there's no inertia\n },\n },\n};\n","/* browser entry point */\n\n// Legacy browser support\nrequire('./legacyBrowsers');\n\n// inertia\nrequire('./inertia');\n\n// modifiers\nrequire('./modifiers/snap');\nrequire('./modifiers/restrict');\n\n// pointerEvents\nrequire('./pointerEvents/base');\nrequire('./pointerEvents/holdRepeat');\nrequire('./pointerEvents/interactableTargets');\n\n// delay\nrequire('./autoStart/delay');\n\n// actions\nrequire('./actions/gesture');\nrequire('./actions/resize');\nrequire('./actions/drag');\nrequire('./actions/drop');\n\n// load these modifiers after resize is loaded\nrequire('./modifiers/snapSize');\nrequire('./modifiers/restrictEdges');\nrequire('./modifiers/restrictSize');\n\n// autoStart actions\nrequire('./autoStart/gesture');\nrequire('./autoStart/resize');\nrequire('./autoStart/drag');\n\n// Interactable preventDefault setting\nrequire('./interactablePreventDefault.js');\n\n// autoScroll\nrequire('./autoScroll');\n\n// export interact\nmodule.exports = require('./interact');\n","const InteractEvent = require('./InteractEvent');\nconst Interaction = require('./Interaction');\nconst modifiers = require('./modifiers');\nconst utils = require('./utils');\nconst animationFrame = require('./utils/raf');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.inertiaStatus = {\n active : false,\n smoothEnd : false,\n allowResume: false,\n\n startEvent: null,\n upCoords : {},\n\n xe: 0, ye: 0,\n sx: 0, sy: 0,\n\n t0: 0,\n vx0: 0, vys: 0,\n duration: 0,\n\n lambda_v0: 0,\n one_ve_v0: 0,\n i : null,\n };\n\n interaction.boundInertiaFrame = () => inertiaFrame .apply(interaction);\n interaction.boundSmoothEndFrame = () => smoothEndFrame.apply(interaction);\n});\n\nInteraction.signals.on('down', function ({ interaction, event, pointer, eventTarget }) {\n const status = interaction.inertiaStatus;\n\n // Check if the down event hits the current inertia target\n if (status.active) {\n let element = eventTarget;\n\n // climb up the DOM tree from the event target\n while (utils.is.element(element)) {\n\n // if interaction element is the current inertia target element\n if (element === interaction.element) {\n // stop inertia\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n\n // update pointers to the down event's coordinates\n interaction.updatePointer(pointer);\n utils.setCoords(interaction.curCoords, interaction.pointers);\n\n // fire appropriate signals\n const signalArg = { interaction };\n Interaction.signals.fire('before-action-move', signalArg);\n Interaction.signals.fire('action-resume' , signalArg);\n\n // fire a reume event\n const resumeEvent = new InteractEvent(interaction,\n event,\n interaction.prepared.name,\n 'inertiaresume',\n interaction.element);\n\n interaction.target.fire(resumeEvent);\n interaction.prevEvent = resumeEvent;\n modifiers.resetStatuses(interaction.modifierStatuses);\n\n utils.copyCoords(interaction.prevCoords, interaction.curCoords);\n break;\n }\n\n element = utils.parentNode(element);\n }\n }\n});\n\nInteraction.signals.on('up', function ({ interaction, event }) {\n const status = interaction.inertiaStatus;\n\n if (!interaction.interacting() || status.active) { return; }\n\n const target = interaction.target;\n const options = target && target.options;\n const inertiaOptions = options && interaction.prepared.name && options[interaction.prepared.name].inertia;\n\n const now = new Date().getTime();\n const statuses = {};\n const page = utils.extend({}, interaction.curCoords.page);\n const pointerSpeed = interaction.pointerDelta.client.speed;\n\n let smoothEnd = false;\n let modifierResult;\n\n // check if inertia should be started\n const inertiaPossible = (inertiaOptions && inertiaOptions.enabled\n && interaction.prepared.name !== 'gesture'\n && event !== status.startEvent);\n\n const inertia = (inertiaPossible\n && (now - interaction.curCoords.timeStamp) < 50\n && pointerSpeed > inertiaOptions.minSpeed\n && pointerSpeed > inertiaOptions.endSpeed);\n\n const modifierArg = {\n interaction,\n pageCoords: page,\n statuses,\n preEnd: true,\n requireEndOnly: true,\n };\n\n // smoothEnd\n if (inertiaPossible && !inertia) {\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n if (modifierResult.shouldMove && modifierResult.locked) {\n smoothEnd = true;\n }\n }\n\n if (!(inertia || smoothEnd)) { return; }\n\n utils.copyCoords(status.upCoords, interaction.curCoords);\n\n interaction.pointers[0] = status.startEvent =\n new InteractEvent(interaction, event, interaction.prepared.name, 'inertiastart', interaction.element);\n\n status.t0 = now;\n\n status.active = true;\n status.allowResume = inertiaOptions.allowResume;\n interaction.simulation = status;\n\n target.fire(status.startEvent);\n\n if (inertia) {\n status.vx0 = interaction.pointerDelta.client.vx;\n status.vy0 = interaction.pointerDelta.client.vy;\n status.v0 = pointerSpeed;\n\n calcInertia(interaction, status);\n\n utils.extend(page, interaction.curCoords.page);\n\n page.x += status.xe;\n page.y += status.ye;\n\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n status.modifiedXe += modifierResult.dx;\n status.modifiedYe += modifierResult.dy;\n\n status.i = animationFrame.request(interaction.boundInertiaFrame);\n }\n else {\n status.smoothEnd = true;\n status.xe = modifierResult.dx;\n status.ye = modifierResult.dy;\n\n status.sx = status.sy = 0;\n\n status.i = animationFrame.request(interaction.boundSmoothEndFrame);\n }\n});\n\nInteraction.signals.on('stop-active', function ({ interaction }) {\n const status = interaction.inertiaStatus;\n\n if (status.active) {\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n }\n});\n\nfunction calcInertia (interaction, status) {\n const inertiaOptions = interaction.target.options[interaction.prepared.name].inertia;\n const lambda = inertiaOptions.resistance;\n const inertiaDur = -Math.log(inertiaOptions.endSpeed / status.v0) / lambda;\n\n status.x0 = interaction.prevEvent.pageX;\n status.y0 = interaction.prevEvent.pageY;\n status.t0 = status.startEvent.timeStamp / 1000;\n status.sx = status.sy = 0;\n\n status.modifiedXe = status.xe = (status.vx0 - inertiaDur) / lambda;\n status.modifiedYe = status.ye = (status.vy0 - inertiaDur) / lambda;\n status.te = inertiaDur;\n\n status.lambda_v0 = lambda / status.v0;\n status.one_ve_v0 = 1 - inertiaOptions.endSpeed / status.v0;\n}\n\nfunction inertiaFrame () {\n updateInertiaCoords(this);\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n\n const status = this.inertiaStatus;\n const options = this.target.options[this.prepared.name].inertia;\n const lambda = options.resistance;\n const t = new Date().getTime() / 1000 - status.t0;\n\n if (t < status.te) {\n\n const progress = 1 - (Math.exp(-lambda * t) - status.lambda_v0) / status.one_ve_v0;\n\n if (status.modifiedXe === status.xe && status.modifiedYe === status.ye) {\n status.sx = status.xe * progress;\n status.sy = status.ye * progress;\n }\n else {\n const quadPoint = utils.getQuadraticCurvePoint(0, 0,\n status.xe,\n status.ye,\n status.modifiedXe,\n status.modifiedYe,\n progress);\n\n status.sx = quadPoint.x;\n status.sy = quadPoint.y;\n }\n\n this.doMove();\n\n status.i = animationFrame.request(this.boundInertiaFrame);\n }\n else {\n status.sx = status.modifiedXe;\n status.sy = status.modifiedYe;\n\n this.doMove();\n this.end(status.startEvent);\n status.active = false;\n this.simulation = null;\n }\n\n utils.copyCoords(this.prevCoords, this.curCoords);\n}\n\nfunction smoothEndFrame () {\n updateInertiaCoords(this);\n\n const status = this.inertiaStatus;\n const t = new Date().getTime() - status.t0;\n const duration = this.target.options[this.prepared.name].inertia.smoothEndDuration;\n\n if (t < duration) {\n status.sx = utils.easeOutQuad(t, 0, status.xe, duration);\n status.sy = utils.easeOutQuad(t, 0, status.ye, duration);\n\n this.pointerMove(status.startEvent, status.startEvent);\n\n status.i = animationFrame.request(this.boundSmoothEndFrame);\n }\n else {\n status.sx = status.xe;\n status.sy = status.ye;\n\n this.pointerMove(status.startEvent, status.startEvent);\n this.end(status.startEvent);\n\n status.smoothEnd =\n status.active = false;\n this.simulation = null;\n }\n}\n\nfunction updateInertiaCoords (interaction) {\n const status = interaction.inertiaStatus;\n\n // return if inertia isn't running\n if (!status.active) { return; }\n\n const pageUp = status.upCoords.page;\n const clientUp = status.upCoords.client;\n\n utils.setCoords(interaction.curCoords, [ {\n pageX : pageUp.x + status.sx,\n pageY : pageUp.y + status.sy,\n clientX: clientUp.x + status.sx,\n clientY: clientUp.y + status.sy,\n } ]);\n}\n","const browser = require('./utils/browser');\nconst events = require('./utils/events');\nconst utils = require('./utils');\nconst scope = require('./scope');\nconst Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\n\nconst globalEvents = {};\n\n/*\\\n * interact\n [ method ]\n *\n * The methods of this variable can be used to set elements as\n * interactables and also to change various default settings.\n *\n * Calling it as a function and passing an element or a valid CSS selector\n * string returns an Interactable object which has various methods to\n * configure it.\n *\n - element (Element | string) The HTML or SVG Element to interact with or CSS selector\n = (object) An @Interactable\n *\n > Usage\n | interact('#draggable').draggable(true);\n |\n | var rectables = interact('rect');\n | rectables\n | .gesturable(true)\n | .on('gesturemove', function (event) {\n | // ...\n | });\n\\*/\nfunction interact (element, options) {\n let interactable = scope.interactables.get(element, options);\n\n if (!interactable) {\n interactable = new Interactable(element, options);\n interactable.events.global = globalEvents;\n }\n\n return interactable;\n}\n\n/*\\\n * interact.isSet\n [ method ]\n *\n * Check if an element has been set\n - element (Element) The Element being searched for\n = (boolean) Indicates if the element or CSS selector was previously passed to interact\n\\*/\ninteract.isSet = function (element, options) {\n return scope.interactables.indexOfElement(element, options && options.context) !== -1;\n};\n\n/*\\\n * interact.on\n [ method ]\n *\n * Adds a global listener for an InteractEvent or adds a DOM event to\n * `document`\n *\n - type (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) interact\n\\*/\ninteract.on = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.on(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.on(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n // if it is an InteractEvent type, add listener to globalEvents\n if (utils.contains(Interactable.eventTypes, type)) {\n // if this type of event was never bound\n if (!globalEvents[type]) {\n globalEvents[type] = [listener];\n }\n else {\n globalEvents[type].push(listener);\n }\n }\n // If non InteractEvent type, addEventListener to document\n else {\n events.add(scope.document, type, listener, { options });\n }\n\n return interact;\n};\n\n/*\\\n * interact.off\n [ method ]\n *\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n - type (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) interact\n \\*/\ninteract.off = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.off(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.off(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n if (!utils.contains(Interactable.eventTypes, type)) {\n events.remove(scope.document, type, listener, options);\n }\n else {\n let index;\n\n if (type in globalEvents\n && (index = utils.indexOf(globalEvents[type], listener)) !== -1) {\n globalEvents[type].splice(index, 1);\n }\n }\n\n return interact;\n};\n\n/*\\\n * interact.debug\n [ method ]\n *\n * Returns an object which exposes internal data\n = (object) An object with properties that outline the current state and expose internal functions and variables\n\\*/\ninteract.debug = function () {\n return scope;\n};\n\n// expose the functions used to calculate multi-touch properties\ninteract.getPointerAverage = utils.pointerAverage;\ninteract.getTouchBBox = utils.touchBBox;\ninteract.getTouchDistance = utils.touchDistance;\ninteract.getTouchAngle = utils.touchAngle;\n\ninteract.getElementRect = utils.getElementRect;\ninteract.getElementClientRect = utils.getElementClientRect;\ninteract.matchesSelector = utils.matchesSelector;\ninteract.closest = utils.closest;\n\n/*\\\n * interact.supportsTouch\n [ method ]\n *\n = (boolean) Whether or not the browser supports touch input\n\\*/\ninteract.supportsTouch = function () {\n return browser.supportsTouch;\n};\n\n/*\\\n * interact.supportsPointerEvent\n [ method ]\n *\n = (boolean) Whether or not the browser supports PointerEvents\n\\*/\ninteract.supportsPointerEvent = function () {\n return browser.supportsPointerEvent;\n};\n\n/*\\\n * interact.stop\n [ method ]\n *\n * Cancels all interactions (end events are not fired)\n *\n - event (Event) An event on which to call preventDefault()\n = (object) interact\n\\*/\ninteract.stop = function (event) {\n for (let i = scope.interactions.length - 1; i >= 0; i--) {\n scope.interactions[i].stop(event);\n }\n\n return interact;\n};\n\n/*\\\n * interact.pointerMoveTolerance\n [ method ]\n * Returns or sets the distance the pointer must be moved before an action\n * sequence occurs. This also affects tolerance for tap events.\n *\n - newValue (number) #optional The movement from the start position must be greater than this value\n = (number | Interactable) The current setting or interact\n\\*/\ninteract.pointerMoveTolerance = function (newValue) {\n if (utils.is.number(newValue)) {\n Interaction.pointerMoveTolerance = newValue;\n\n return this;\n }\n\n return Interaction.pointerMoveTolerance;\n};\n\ninteract.addDocument = scope.addDocument;\ninteract.removeDocument = scope.removeDocument;\n\nscope.interact = interact;\n\nmodule.exports = interact;\n","const Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\nconst scope = require('./scope');\nconst is = require('./utils/is');\nconst events = require('./utils/events');\n\nconst { nodeContains, matchesSelector } = require('./utils/domUtils');\n\n/*\\\n * Interactable.preventDefault\n [ method ]\n *\n * Returns or sets whether to prevent the browser's default behaviour\n * in response to pointer events. Can be set to:\n * - `'always'` to always prevent\n * - `'never'` to never prevent\n * - `'auto'` to let interact.js try to determine what would be best\n *\n - newValue (string) #optional `true`, `false` or `'auto'`\n = (string | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.preventDefault = function (newValue) {\n if (/^(always|never|auto)$/.test(newValue)) {\n this.options.preventDefault = newValue;\n return this;\n }\n\n if (is.bool(newValue)) {\n this.options.preventDefault = newValue? 'always' : 'never';\n return this;\n }\n\n return this.options.preventDefault;\n};\n\nInteractable.prototype.checkAndPreventDefault = function (event) {\n const setting = this.options.preventDefault;\n\n if (setting === 'never') { return; }\n\n if (setting === 'always') {\n event.preventDefault();\n return;\n }\n\n // setting === 'auto'\n\n // don't preventDefault if the browser supports passiveEvents\n // CSS touch-action and user-selecct should be used instead\n if (events.supportsOptions) {\n return;\n }\n\n // don't preventDefault of pointerdown events\n if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) {\n return;\n }\n\n // don't preventDefault on editable elements\n if (is.element(event.target)\n && matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) {\n return;\n }\n\n event.preventDefault();\n};\n\nfunction onInteractionEvent ({ interaction, event }) {\n if (interaction.target) {\n interaction.target.checkAndPreventDefault(event);\n }\n}\n\nfor (const eventSignal of ['down', 'move', 'up', 'cancel']) {\n Interaction.signals.on(eventSignal, onInteractionEvent);\n}\n\n// prevent native HTML5 drag on interact.js target elements\nInteraction.docEvents.dragstart = function preventNativeDrag (event) {\n for (const interaction of scope.interactions) {\n\n if (interaction.element\n && (interaction.element === event.target\n || nodeContains(interaction.element, event.target))) {\n\n interaction.target.checkAndPreventDefault(event);\n return;\n }\n }\n};\n","const scope = require('./scope');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst iFinder = require('./utils/interactionFinder');\nconst pointerEvents = require('./pointerEvents/base');\n\nconst { window } = require('./utils/window');\n\nconst toString = Object.prototype.toString;\n\nif (!window.Array.isArray) {\n window.Array.isArray = function (obj) {\n return toString.call(obj) === '[object Array]';\n };\n}\n\nif (!String.prototype.trim) {\n String.prototype.trim = function () {\n return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n };\n}\n\n// http://www.quirksmode.org/dom/events/click.html\n// >Events leading to dblclick\n//\n// IE8 doesn't fire down event before dblclick.\n// This workaround tries to fire a tap and doubletap after dblclick\nfunction onIE8Dblclick (event) {\n const eventTarget = event.target;\n const interaction = iFinder.search(event, event.type, eventTarget);\n\n if (!interaction) { return; }\n\n if (interaction.prevTap\n && event.clientX === interaction.prevTap.clientX\n && event.clientY === interaction.prevTap.clientY\n && eventTarget === interaction.prevTap.target) {\n\n interaction.downTargets[0] = eventTarget;\n interaction.downTimes [0] = new Date().getTime();\n\n pointerEvents.fire({\n interaction,\n event,\n eventTarget,\n pointer: event,\n type: 'tap',\n });\n }\n}\n\nif (browser.isIE8) {\n const selectFix = function (event) {\n for (const interaction of scope.interactions) {\n if (interaction.interacting()) {\n interaction.target.checkAndPreventDefault(event);\n }\n }\n };\n\n const onDocIE8 = function onDocIE8 ({ doc, win }, signalName) {\n const eventMethod = signalName.indexOf('listen') === 0\n ? events.add : events.remove;\n\n // For IE's lack of Event#preventDefault\n eventMethod(doc, 'selectstart', selectFix);\n\n if (pointerEvents) {\n eventMethod(doc, 'dblclick', onIE8Dblclick);\n }\n };\n\n scope.signals.on('add-document' , onDocIE8);\n scope.signals.on('remove-document', onDocIE8);\n}\n\nmodule.exports = null;\n","const InteractEvent = require('../InteractEvent');\nconst Interaction = require('../Interaction');\nconst extend = require('../utils/extend');\n\nconst modifiers = {\n names: [],\n\n setOffsets: function (arg) {\n const { interaction, pageCoords: page } = arg;\n const { target, element, startOffset } = interaction;\n const rect = target.getRect(element);\n\n if (rect) {\n startOffset.left = page.x - rect.left;\n startOffset.top = page.y - rect.top;\n\n startOffset.right = rect.right - page.x;\n startOffset.bottom = rect.bottom - page.y;\n\n if (!('width' in rect)) { rect.width = rect.right - rect.left; }\n if (!('height' in rect)) { rect.height = rect.bottom - rect.top ; }\n }\n else {\n startOffset.left = startOffset.top = startOffset.right = startOffset.bottom = 0;\n }\n\n arg.rect = rect;\n arg.interactable = target;\n arg.element = element;\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n\n arg.options = target.options[interaction.prepared.name][modifierName];\n\n if (!arg.options) {\n continue;\n }\n\n interaction.modifierOffsets[modifierName] = modifiers[modifierName].setOffset(arg);\n }\n },\n\n setAll: function (arg) {\n const { interaction, statuses, preEnd, requireEndOnly } = arg;\n const coords = extend({}, arg.pageCoords);\n const result = {\n dx: 0,\n dy: 0,\n changed: false,\n locked: false,\n shouldMove: true,\n };\n\n for (const modifierName of modifiers.names) {\n const modifier = modifiers[modifierName];\n const options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!shouldDo(options, preEnd, requireEndOnly)) { continue; }\n\n arg.status = arg.status = statuses[modifierName];\n arg.options = options;\n arg.offset = arg.interaction.modifierOffsets[modifierName];\n\n modifier.set(arg);\n\n if (arg.status.locked) {\n coords.x += arg.status.dx;\n coords.y += arg.status.dy;\n\n result.dx += arg.status.dx;\n result.dy += arg.status.dy;\n\n result.locked = true;\n }\n }\n\n // a move should be fired if:\n // - there are no modifiers enabled,\n // - no modifiers are \"locked\" i.e. have changed the pointer's coordinates, or\n // - the locked coords have changed since the last pointer move\n result.shouldMove = !arg.status || !result.locked || arg.status.changed;\n\n return result;\n },\n\n resetStatuses: function (statuses) {\n for (const modifierName of modifiers.names) {\n const status = statuses[modifierName] || {};\n\n status.dx = status.dy = 0;\n status.modifiedX = status.modifiedY = NaN;\n status.locked = false;\n status.changed = true;\n\n statuses[modifierName] = status;\n }\n\n return statuses;\n },\n\n start: function ({ interaction }, signalName) {\n const arg = {\n interaction,\n pageCoords: (signalName === 'action-resume' ?\n interaction.curCoords : interaction.startCoords).page,\n startOffset: interaction.startOffset,\n statuses: interaction.modifierStatuses,\n preEnd: false,\n requireEndOnly: false,\n };\n\n modifiers.setOffsets(arg);\n modifiers.resetStatuses(arg.statuses);\n\n arg.pageCoords = extend({}, interaction.startCoords.page);\n interaction.modifierResult = modifiers.setAll(arg);\n },\n};\n\nInteraction.signals.on('new', function (interaction) {\n interaction.startOffset = { left: 0, right: 0, top: 0, bottom: 0 };\n interaction.modifierOffsets = {};\n interaction.modifierStatuses = modifiers.resetStatuses({});\n interaction.modifierResult = null;\n});\n\nInteraction.signals.on('action-start' , modifiers.start);\nInteraction.signals.on('action-resume', modifiers.start);\n\nInteraction.signals.on('before-action-move', function ({ interaction, preEnd, interactingBeforeMove }) {\n const modifierResult = modifiers.setAll({\n interaction,\n preEnd,\n pageCoords: interaction.curCoords.page,\n statuses: interaction.modifierStatuses,\n requireEndOnly: false,\n });\n\n // don't fire an action move if a modifier would keep the event in the same\n // cordinates as before\n if (!modifierResult.shouldMove && interactingBeforeMove) {\n interaction._dontFireMove = true;\n }\n\n interaction.modifierResult = modifierResult;\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n for (let i = 0; i < modifiers.names.length; i++) {\n const options = interaction.target.options[interaction.prepared.name][modifiers.names[i]];\n\n // if the endOnly option is true for any modifier\n if (shouldDo(options, true, true)) {\n // fire a move event at the modified coordinates\n interaction.doMove({ event, preEnd: true });\n break;\n }\n }\n});\n\nInteractEvent.signals.on('set-xy', function (arg) {\n const { iEvent, interaction } = arg;\n const modifierArg = extend({}, arg);\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n modifierArg.options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!modifierArg.options) {\n continue;\n }\n\n const modifier = modifiers[modifierName];\n\n modifierArg.status = interaction.modifierStatuses[modifierName];\n\n iEvent[modifierName] = modifier.modifyCoords(modifierArg);\n }\n});\n\nfunction shouldDo (options, preEnd, requireEndOnly) {\n return (options && options.enabled\n && (preEnd || !options.endOnly)\n && (!requireEndOnly || options.endOnly));\n}\n\nmodule.exports = modifiers;\n","const modifiers = require('./index');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst restrict = {\n defaults: {\n enabled : false,\n endOnly : false,\n restriction: null,\n elementRect: null,\n },\n\n setOffset: function ({ rect, startOffset, options }) {\n const elementRect = options && options.elementRect;\n const offset = {};\n\n if (rect && elementRect) {\n offset.left = startOffset.left - (rect.width * elementRect.left);\n offset.top = startOffset.top - (rect.height * elementRect.top);\n\n offset.right = startOffset.right - (rect.width * (1 - elementRect.right));\n offset.bottom = startOffset.bottom - (rect.height * (1 - elementRect.bottom));\n }\n else {\n offset.left = offset.top = offset.right = offset.bottom = 0;\n }\n\n return offset;\n },\n\n set: function ({ pageCoords, interaction, status, options }) {\n if (!options) { return status; }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n\n const restriction = getRestrictionRect(options.restriction, interaction, page);\n\n if (!restriction) { return status; }\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n const rect = restriction;\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n const offset = interaction.modifierOffsets.restrict;\n\n // object is assumed to have\n // x, y, width, height or\n // left, top, right, bottom\n if ('x' in restriction && 'y' in restriction) {\n modifiedX = Math.max(Math.min(rect.x + rect.width - offset.right , page.x), rect.x + offset.left);\n modifiedY = Math.max(Math.min(rect.y + rect.height - offset.bottom, page.y), rect.y + offset.top );\n }\n else {\n modifiedX = Math.max(Math.min(rect.right - offset.right , page.x), rect.left + offset.left);\n modifiedY = Math.max(Math.min(rect.bottom - offset.bottom, page.y), rect.top + offset.top );\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const elementRect = options && options.elementRect;\n\n if (options && options.enabled\n && !(phase === 'start' && elementRect && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n getRestrictionRect,\n};\n\nfunction getRestrictionRect (value, interaction, page) {\n if (utils.is.function(value)) {\n return utils.resolveRectLike(value, interaction.target, interaction.element, [page.x, page.y, interaction]);\n } else {\n return utils.resolveRectLike(value, interaction.target, interaction.element);\n }\n}\n\nmodifiers.restrict = restrict;\nmodifiers.names.push('restrict');\n\ndefaultOptions.perAction.restrict = restrict.defaults;\n\nmodule.exports = restrict;\n","// This module adds the options.resize.restrictEdges setting which sets min and\n// max for the top, left, bottom and right edges of the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictEdges: {\n// inner: { top: 200, left: 200, right: 400, bottom: 400 },\n// outer: { top: 0, left: 0, right: 600, bottom: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst { getRestrictionRect } = require('./restrict');\n\nconst noInner = { top: +Infinity, left: +Infinity, bottom: -Infinity, right: -Infinity };\nconst noOuter = { top: -Infinity, left: -Infinity, bottom: +Infinity, right: +Infinity };\n\nconst restrictEdges = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n offset: null,\n },\n\n setOffset: function ({ interaction, startOffset, options }) {\n if (!options) {\n return utils.extend({}, startOffset);\n }\n\n const offset = getRestrictionRect(options.offset, interaction, interaction.startCoords.page);\n\n if (offset) {\n return {\n top: startOffset.top + offset.y,\n left: startOffset.left + offset.x,\n bottom: startOffset.bottom + offset.y,\n right: startOffset.right + offset.x,\n };\n }\n\n return startOffset;\n },\n\n set: function ({ pageCoords, interaction, status, offset, options }) {\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n const inner = rectUtils.xywhToTlbr(getRestrictionRect(options.inner, interaction, page)) || noInner;\n const outer = rectUtils.xywhToTlbr(getRestrictionRect(options.outer, interaction, page)) || noOuter;\n\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n if (edges.top) {\n modifiedY = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top);\n }\n else if (edges.bottom) {\n modifiedY = Math.max(Math.min(outer.bottom - offset.bottom, page.y), inner.bottom - offset.bottom);\n }\n if (edges.left) {\n modifiedX = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left);\n }\n else if (edges.right) {\n modifiedX = Math.max(Math.min(outer.right - offset.right, page.x), inner.right - offset.right);\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n if (options && options.enabled\n && !(phase === 'start' && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n noInner,\n noOuter,\n getRestrictionRect,\n};\n\nmodifiers.restrictEdges = restrictEdges;\nmodifiers.names.push('restrictEdges');\n\ndefaultOptions.perAction.restrictEdges = restrictEdges.defaults;\nresize.defaults.restrictEdges = restrictEdges.defaults;\n\nmodule.exports = restrictEdges;\n","// This module adds the options.resize.restrictSize setting which sets min and\n// max width and height for the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictSize: {\n// min: { width: -600, height: -600 },\n// max: { width: 600, height: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst restrictEdges = require('./restrictEdges');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst noMin = { width: -Infinity, height: -Infinity };\nconst noMax = { width: +Infinity, height: +Infinity };\n\nconst restrictSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n },\n\n setOffset: function ({ interaction }) {\n return interaction.startOffset;\n },\n\n set: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const rect = rectUtils.xywhToTlbr(interaction.resizeRects.inverted);\n\n const minSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.min, interaction)) || noMin;\n const maxSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.max, interaction)) || noMax;\n\n arg.options = {\n enabled: options.enabled,\n endOnly: options.endOnly,\n inner: utils.extend({}, restrictEdges.noInner),\n outer: utils.extend({}, restrictEdges.noOuter),\n };\n\n if (edges.top) {\n arg.options.inner.top = rect.bottom - minSize.height;\n arg.options.outer.top = rect.bottom - maxSize.height;\n }\n else if (edges.bottom) {\n arg.options.inner.bottom = rect.top + minSize.height;\n arg.options.outer.bottom = rect.top + maxSize.height;\n }\n if (edges.left) {\n arg.options.inner.left = rect.right - minSize.width;\n arg.options.outer.left = rect.right - maxSize.width;\n }\n else if (edges.right) {\n arg.options.inner.right = rect.left + minSize.width;\n arg.options.outer.right = rect.left + maxSize.width;\n }\n\n restrictEdges.set(arg);\n },\n\n modifyCoords: restrictEdges.modifyCoords,\n};\n\nmodifiers.restrictSize = restrictSize;\nmodifiers.names.push('restrictSize');\n\ndefaultOptions.perAction.restrictSize = restrictSize.defaults;\nresize.defaults.restrictSize = restrictSize.defaults;\n\nmodule.exports = restrictSize;\n","const modifiers = require('./index');\nconst interact = require('../interact');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst snap = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n\n relativePoints: null,\n },\n\n setOffset: function ({ interaction, interactable, element, rect, startOffset, options }) {\n const offsets = [];\n const optionsOrigin = utils.rectToXY(utils.resolveRectLike(options.origin));\n const origin = optionsOrigin || utils.getOriginXY(interactable, element, interaction.prepared.name);\n options = options || interactable.options[interaction.prepared.name].snap || {};\n\n let snapOffset;\n\n if (options.offset === 'startCoords') {\n snapOffset = {\n x: interaction.startCoords.page.x - origin.x,\n y: interaction.startCoords.page.y - origin.y,\n };\n }\n else {\n const offsetRect = utils.resolveRectLike(options.offset, interactable, element, [interaction]);\n\n snapOffset = utils.rectToXY(offsetRect) || { x: 0, y: 0 };\n }\n\n if (rect && options.relativePoints && options.relativePoints.length) {\n for (const { x: relativeX, y: relativeY } of options.relativePoints) {\n offsets.push({\n x: startOffset.left - (rect.width * relativeX) + snapOffset.x,\n y: startOffset.top - (rect.height * relativeY) + snapOffset.y,\n });\n }\n }\n else {\n offsets.push(snapOffset);\n }\n\n return offsets;\n },\n\n set: function ({ interaction, pageCoords, status, options, offset: offsets }) {\n const targets = [];\n let target;\n let page;\n let i;\n\n if (status.useStatusXY) {\n page = { x: status.x, y: status.y };\n }\n else {\n const origin = utils.getOriginXY(interaction.target, interaction.element, interaction.prepared.name);\n\n page = utils.extend({}, pageCoords);\n\n page.x -= origin.x;\n page.y -= origin.y;\n }\n\n status.realX = page.x;\n status.realY = page.y;\n\n let len = options.targets? options.targets.length : 0;\n\n for (const { x: offsetX, y: offsetY } of offsets) {\n const relativeX = page.x - offsetX;\n const relativeY = page.y - offsetY;\n\n for (const snapTarget of options.targets) {\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n targets.push({\n x: utils.is.number(target.x) ? (target.x + offsetX) : relativeX,\n y: utils.is.number(target.y) ? (target.y + offsetY) : relativeY,\n\n range: utils.is.number(target.range)? target.range: options.range,\n });\n }\n }\n\n const closest = {\n target: null,\n inRange: false,\n distance: 0,\n range: 0,\n dx: 0,\n dy: 0,\n };\n\n for (i = 0, len = targets.length; i < len; i++) {\n target = targets[i];\n\n const range = target.range;\n const dx = target.x - page.x;\n const dy = target.y - page.y;\n const distance = utils.hypot(dx, dy);\n let inRange = distance <= range;\n\n // Infinite targets count as being out of range\n // compared to non infinite ones that are in range\n if (range === Infinity && closest.inRange && closest.range !== Infinity) {\n inRange = false;\n }\n\n if (!closest.target || (inRange\n // is the closest target in range?\n ? (closest.inRange && range !== Infinity\n // the pointer is relatively deeper in this target\n ? distance / range < closest.distance / closest.range\n // this target has Infinite range and the closest doesn't\n : (range === Infinity && closest.range !== Infinity)\n // OR this target is closer that the previous closest\n || distance < closest.distance)\n // The other is not in range and the pointer is closer to this target\n : (!closest.inRange && distance < closest.distance))) {\n\n closest.target = target;\n closest.distance = distance;\n closest.range = range;\n closest.inRange = inRange;\n closest.dx = dx;\n closest.dy = dy;\n\n status.range = range;\n }\n }\n\n let snapChanged;\n\n if (closest.target) {\n snapChanged = (status.modifiedX !== closest.target.x || status.modifiedY !== closest.target.y);\n\n status.modifiedX = closest.target.x;\n status.modifiedY = closest.target.y;\n }\n else {\n snapChanged = true;\n\n status.modifiedX = NaN;\n status.modifiedY = NaN;\n }\n\n status.dx = closest.dx;\n status.dy = closest.dy;\n\n status.changed = (snapChanged || (closest.inRange && !status.locked));\n status.locked = closest.inRange;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const relativePoints = options && options.relativePoints;\n\n if (options && options.enabled\n && !(phase === 'start' && relativePoints && relativePoints.length)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n }\n\n return {\n range : status.range,\n locked : status.locked,\n x : status.modifiedX,\n y : status.modifiedY,\n realX : status.realX,\n realY : status.realY,\n dx : status.dx,\n dy : status.dy,\n };\n }\n },\n};\n\ninteract.createSnapGrid = function (grid) {\n return function (x, y) {\n const limits = grid.limits || {\n left : -Infinity,\n right : Infinity,\n top : -Infinity,\n bottom: Infinity,\n };\n let offsetX = 0;\n let offsetY = 0;\n\n if (utils.is.object(grid.offset)) {\n offsetX = grid.offset.x;\n offsetY = grid.offset.y;\n }\n\n const gridx = Math.round((x - offsetX) / grid.x);\n const gridy = Math.round((y - offsetY) / grid.y);\n\n const newX = Math.max(limits.left, Math.min(limits.right , gridx * grid.x + offsetX));\n const newY = Math.max(limits.top , Math.min(limits.bottom, gridy * grid.y + offsetY));\n\n return {\n x: newX,\n y: newY,\n range: grid.range,\n };\n };\n};\n\nmodifiers.snap = snap;\nmodifiers.names.push('snap');\n\ndefaultOptions.perAction.snap = snap.defaults;\n\nmodule.exports = snap;\n","// This module allows snapping of the size of targets during resize\n// interactions.\n\nconst modifiers = require('./index');\nconst snap = require('./snap');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\nconst utils = require('../utils/');\n\nconst snapSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n },\n\n setOffset: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.edges;\n\n if (!edges) { return; }\n\n arg.options = {\n relativePoints: [{\n x: edges.left? 0 : 1,\n y: edges.top ? 0 : 1,\n }],\n origin: { x: 0, y: 0 },\n offset: 'self',\n range: options.range,\n };\n\n const offsets = snap.setOffset(arg);\n arg.options = options;\n\n return offsets;\n },\n\n set: function (arg) {\n const { interaction, options, offset, pageCoords } = arg;\n const page = utils.extend({}, pageCoords);\n const relativeX = page.x - offset[0].x;\n const relativeY = page.y - offset[0].y;\n\n arg.options = utils.extend({}, options);\n arg.options.targets = [];\n\n for (const snapTarget of options.targets) {\n let target;\n\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n if ('width' in target && 'height' in target) {\n target.x = target.width;\n target.y = target.height;\n }\n\n arg.options.targets.push(target);\n }\n\n snap.set(arg);\n },\n\n modifyCoords: function (arg) {\n const { options } = arg;\n\n arg.options = utils.extend({}, options);\n arg.options.enabled = options.enabled;\n arg.options.relativePoints = [null];\n\n snap.modifyCoords(arg);\n },\n};\n\nmodifiers.snapSize = snapSize;\nmodifiers.names.push('snapSize');\n\ndefaultOptions.perAction.snapSize = snapSize.defaults;\nresize.defaults.snapSize = snapSize.defaults;\n\nmodule.exports = snapSize;\n","const pointerUtils = require('../utils/pointerUtils');\n\nmodule.exports = class PointerEvent {\n constructor (type, pointer, event, eventTarget, interaction) {\n pointerUtils.pointerExtend(this, event);\n\n if (event !== pointer) {\n pointerUtils.pointerExtend(this, pointer);\n }\n\n this.interaction = interaction;\n\n this.timeStamp = new Date().getTime();\n this.originalEvent = event;\n this.type = type;\n this.pointerId = pointerUtils.getPointerId(pointer);\n this.pointerType = pointerUtils.getPointerType(pointer, interaction);\n this.target = eventTarget;\n this.currentTarget = null;\n\n if (type === 'tap') {\n const pointerIndex = interaction.getPointerIndex(pointer);\n this.dt = this.timeStamp - interaction.downTimes[pointerIndex];\n\n const interval = this.timeStamp - interaction.tapTime;\n\n this.double = !!(interaction.prevTap\n && interaction.prevTap.type !== 'doubletap'\n && interaction.prevTap.target === this.target\n && interval < 500);\n }\n else if (type === 'doubletap') {\n this.dt = pointer.timeStamp - interaction.tapTime;\n }\n }\n\n subtractOrigin ({ x: originX, y: originY }) {\n this.pageX -= originX;\n this.pageY -= originY;\n this.clientX -= originX;\n this.clientY -= originY;\n\n return this;\n }\n\n addOrigin ({ x: originX, y: originY }) {\n this.pageX += originX;\n this.pageY += originY;\n this.clientX += originX;\n this.clientY += originY;\n\n return this;\n }\n\n preventDefault () {\n this.originalEvent.preventDefault();\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n};\n","const PointerEvent = require('./PointerEvent');\nconst Interaction = require('../Interaction');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst defaults = require('../defaultOptions');\nconst signals = require('../utils/Signals').new();\nconst { filter } = require('../utils/arr');\n\nconst simpleSignals = [ 'down', 'up', 'cancel' ];\nconst simpleEvents = [ 'down', 'up', 'cancel' ];\n\nconst pointerEvents = {\n PointerEvent,\n fire,\n collectEventTargets,\n signals,\n defaults: {\n holdDuration: 600,\n ignoreFrom : null,\n allowFrom : null,\n origin : { x: 0, y: 0 },\n },\n types: [\n 'down',\n 'move',\n 'up',\n 'cancel',\n 'tap',\n 'doubletap',\n 'hold',\n ],\n};\n\nfunction fire (arg) {\n const {\n interaction, pointer, event, eventTarget,\n type = arg.pointerEvent.type,\n targets = collectEventTargets(arg),\n pointerEvent = new PointerEvent(type, pointer, event, eventTarget, interaction),\n } = arg;\n\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n targets,\n type,\n pointerEvent,\n };\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n\n for (const prop in target.props || {}) {\n pointerEvent[prop] = target.props[prop];\n }\n\n const origin = utils.getOriginXY(target.eventable, target.element);\n\n pointerEvent.subtractOrigin(origin);\n pointerEvent.eventable = target.eventable;\n pointerEvent.currentTarget = target.element;\n\n target.eventable.fire(pointerEvent);\n\n pointerEvent.addOrigin(origin);\n\n if (pointerEvent.immediatePropagationStopped\n || (pointerEvent.propagationStopped\n && (i + 1) < targets.length && targets[i + 1].element !== pointerEvent.currentTarget)) {\n break;\n }\n }\n\n signals.fire('fired', signalArg);\n\n if (type === 'tap') {\n // if pointerEvent should make a double tap, create and fire a doubletap\n // PointerEvent and use that as the prevTap\n const prevTap = pointerEvent.double\n ? fire({\n interaction, pointer, event, eventTarget,\n type: 'doubletap',\n })\n : pointerEvent;\n\n interaction.prevTap = prevTap;\n interaction.tapTime = prevTap.timeStamp;\n }\n\n return pointerEvent;\n}\n\nfunction collectEventTargets ({ interaction, pointer, event, eventTarget, type }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n // do not fire a tap event if the pointer was moved before being lifted\n if (type === 'tap' && (interaction.pointerWasMoved\n // or if the pointerup target is different to the pointerdown target\n || !(interaction.downTargets[pointerIndex] && interaction.downTargets[pointerIndex] === eventTarget))) {\n return [];\n }\n\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n path,\n targets: [],\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (type === 'hold') {\n signalArg.targets = filter(signalArg.targets, target =>\n target.eventable.options.holdDuration === interaction.holdTimers[pointerIndex].duration);\n }\n\n return signalArg.targets;\n}\n\nInteraction.signals.on('update-pointer-down', function ({ interaction, pointerIndex }) {\n interaction.holdTimers[pointerIndex] = { duration: Infinity, timeout: null };\n});\n\nInteraction.signals.on('remove-pointer', function ({ interaction, pointerIndex }) {\n interaction.holdTimers.splice(pointerIndex, 1);\n});\n\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget, duplicateMove }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n if (!duplicateMove && (!interaction.pointerIsDown || interaction.pointerWasMoved)) {\n if (interaction.pointerIsDown) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n\n fire({\n interaction, pointer, event, eventTarget,\n type: 'move',\n });\n }\n});\n\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget, pointerIndex }) {\n // copy event to be used in timeout for IE8\n const eventCopy = browser.isIE8? utils.extend({}, event) : event;\n\n const timer = interaction.holdTimers[pointerIndex];\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'hold',\n targets: [],\n path,\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (!signalArg.targets.length) { return; }\n\n let minDuration = Infinity;\n\n for (let i = 0; i < signalArg.targets.length; i++) {\n const target = signalArg.targets[i];\n const holdDuration = target.eventable.options.holdDuration;\n\n if (holdDuration < minDuration) {\n minDuration = holdDuration;\n }\n }\n\n timer.duration = minDuration;\n timer.timeout = setTimeout(function () {\n fire({\n interaction, eventCopy, eventTarget,\n pointer: browser.isIE8? eventCopy : pointer,\n type: 'hold',\n });\n }, minDuration);\n});\n\nInteraction.signals.on('up', ({ interaction, pointer, event, eventTarget }) => {\n if (!interaction.pointerWasMoved) {\n fire({ interaction, eventTarget, pointer, event, type: 'tap' });\n }\n});\n\n['up', 'cancel'].forEach(function (signalName) {\n Interaction.signals.on(signalName, function ({ interaction, pointerIndex }) {\n if (interaction.holdTimers[pointerIndex]) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n });\n});\n\nfunction createSignalListener (type) {\n return function ({ interaction, pointer, event, eventTarget }) {\n fire({ interaction, eventTarget, pointer, event, type });\n };\n}\n\nfor (let i = 0; i < simpleSignals.length; i++) {\n Interaction.signals.on(simpleSignals[i], createSignalListener(simpleEvents[i]));\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.prevTap = null; // the most recent tap event on this interaction\n interaction.tapTime = 0; // time of the most recent tap event\n interaction.holdTimers = []; // [{ duration, timeout }]\n});\n\ndefaults.pointerEvents = pointerEvents.defaults;\nmodule.exports = pointerEvents;\n","const pointerEvents = require('./base');\nconst Interaction = require('../Interaction');\n\npointerEvents.signals.on('new', onNew);\npointerEvents.signals.on('fired', onFired);\n\nfor (const signal of ['move', 'up', 'cancel', 'endall']) {\n Interaction.signals.on(signal, endHoldRepeat);\n}\n\nfunction onNew ({ pointerEvent }) {\n if (pointerEvent.type !== 'hold') { return; }\n\n pointerEvent.count = (pointerEvent.count || 0) + 1;\n}\n\nfunction onFired ({ interaction, pointerEvent, eventTarget, targets }) {\n if (pointerEvent.type !== 'hold' || !targets.length) { return; }\n\n // get the repeat interval from the first eventable\n const interval = targets[0].eventable.options.holdRepeatInterval;\n\n // don't repeat if the interval is 0 or less\n if (interval <= 0) { return; }\n\n // set a timeout to fire the holdrepeat event\n interaction.holdIntervalHandle = setTimeout(function () {\n pointerEvents.fire({\n interaction,\n eventTarget,\n type: 'hold',\n pointer: pointerEvent,\n event: pointerEvent,\n });\n }, interval);\n}\n\nfunction endHoldRepeat ({ interaction }) {\n // set the interaction's holdStopTime property\n // to stop further holdRepeat events\n if (interaction.holdIntervalHandle) {\n clearInterval(interaction.holdIntervalHandle);\n interaction.holdIntervalHandle = null;\n }\n}\n\n// don't repeat by default\npointerEvents.defaults.holdRepeatInterval = 0;\npointerEvents.types.push('holdrepeat');\n\nmodule.exports = {\n onNew,\n onFired,\n endHoldRepeat,\n};\n","const pointerEvents = require('./base');\nconst Interactable = require('../Interactable');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\nconst scope = require('../scope');\nconst extend = require('../utils/extend');\nconst { merge } = require('../utils/arr');\n\npointerEvents.signals.on('collect-targets', function ({ targets, element, type, eventTarget }) {\n function collectSelectors (interactable, selector, context) {\n const els = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && is.element(element)\n && domUtils.matchesSelector(element, selector, els)\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n const interactable = scope.interactables.get(element);\n\n if (interactable) {\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n scope.interactables.forEachSelector(collectSelectors, element);\n});\n\nInteractable.signals.on('new', function ({ interactable }) {\n interactable.events.getRect = function (element) {\n return interactable.getRect(element);\n };\n});\n\nInteractable.signals.on('set', function ({ interactable, options }) {\n extend(interactable.events.options, pointerEvents.defaults);\n extend(interactable.events.options, options);\n});\n\nmerge(Interactable.eventTypes, pointerEvents.types);\n\nInteractable.prototype.pointerEvents = function (options) {\n extend(this.events.options, options);\n\n return this;\n};\n\nconst __backCompatOption = Interactable.prototype._backCompatOption;\n\nInteractable.prototype._backCompatOption = function (optionName, newValue) {\n const ret = __backCompatOption.call(this, optionName, newValue);\n\n if (ret === this) {\n this.events.options[optionName] = newValue;\n }\n\n return ret;\n};\n\nInteractable.settingsMethods.push('pointerEvents');\n","const utils = require('./utils');\nconst events = require('./utils/events');\nconst signals = require('./utils/Signals').new();\n\nconst scope = {\n signals,\n events,\n utils,\n\n // main document\n document: require('./utils/domObjects').document,\n // all documents being listened to\n documents: [],\n\n addDocument: function (doc, win) {\n // do nothing if document is already known\n if (utils.contains(scope.documents, doc)) { return false; }\n\n win = win || scope.getWindow(doc);\n\n scope.documents.push(doc);\n events.documents.push(doc);\n\n // don't add an unload event for the main document\n // so that the page may be cached in browser history\n if (doc !== scope.document) {\n events.add(win, 'unload', scope.onWindowUnload);\n }\n\n signals.fire('add-document', { doc, win });\n },\n\n removeDocument: function (doc, win) {\n const index = utils.indexOf(scope.documents, doc);\n\n win = win || scope.getWindow(doc);\n\n events.remove(win, 'unload', scope.onWindowUnload);\n\n scope.documents.splice(index, 1);\n events.documents.splice(index, 1);\n\n signals.fire('remove-document', { win, doc });\n },\n\n onWindowUnload: function () {\n scope.removeDocument(this.document, this);\n },\n};\n\nmodule.exports = scope;\n","const { indexOf } = require('./arr');\n\nclass Signals {\n constructor () {\n this.listeners = {\n // signalName: [listeners],\n };\n }\n\n on (name, listener) {\n if (!this.listeners[name]) {\n this.listeners[name] = [listener];\n return;\n }\n\n this.listeners[name].push(listener);\n }\n\n off (name, listener) {\n if (!this.listeners[name]) { return; }\n\n const index = indexOf(this.listeners[name], listener);\n\n if (index !== -1) {\n this.listeners[name].splice(index, 1);\n }\n }\n\n fire (name, arg) {\n const targetListeners = this.listeners[name];\n\n if (!targetListeners) { return; }\n\n for (let i = 0; i < targetListeners.length; i++) {\n if (targetListeners[i](arg, name) === false) {\n return;\n }\n }\n }\n}\n\nSignals.new = function () {\n return new Signals();\n};\n\nmodule.exports = Signals;\n","function indexOf (array, target) {\n for (let i = 0, len = array.length; i < len; i++) {\n if (array[i] === target) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction contains (array, target) {\n return indexOf(array, target) !== -1;\n}\n\nfunction merge (target, source) {\n for (let i = 0; i < source.length; i++) {\n target.push(source[i]);\n }\n\n return target;\n}\n\nfunction filter (array, test) {\n const result = [];\n\n for (let i = 0; i < array.length; i++) {\n if (test(array[i])) {\n result.push(array[i]);\n }\n }\n\n return result;\n}\n\nmodule.exports = {\n indexOf,\n contains,\n merge,\n filter,\n};\n","const { window } = require('./window');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst Element = domObjects.Element;\nconst navigator = window.navigator;\n\nconst browser = {\n // Does the browser support touch input?\n supportsTouch: !!(('ontouchstart' in window) || is.function(window.DocumentTouch)\n && domObjects.document instanceof window.DocumentTouch),\n\n // Does the browser support PointerEvents\n supportsPointerEvent: !!domObjects.PointerEvent,\n\n isIE8: ('attachEvent' in window) && !('addEventListener' in window),\n\n // Opera Mobile must be handled differently\n isOperaMobile: (navigator.appName === 'Opera'\n && browser.supportsTouch\n && navigator.userAgent.match('Presto')),\n\n // scrolling doesn't change the result of getClientRects on iOS 7\n isIOS7: (/iP(hone|od|ad)/.test(navigator.platform)\n && /OS 7[^\\d]/.test(navigator.appVersion)),\n\n isIe9OrOlder: /MSIE (8|9)/.test(navigator.userAgent),\n\n // prefix matchesSelector\n prefixedMatchesSelector: 'matches' in Element.prototype\n ? 'matches': 'webkitMatchesSelector' in Element.prototype\n ? 'webkitMatchesSelector': 'mozMatchesSelector' in Element.prototype\n ? 'mozMatchesSelector': 'oMatchesSelector' in Element.prototype\n ? 'oMatchesSelector': 'msMatchesSelector',\n\n useMatchesSelectorPolyfill: false,\n\n pEventTypes: (domObjects.PointerEvent\n ? (domObjects.PointerEvent === window.MSPointerEvent\n ? {\n up: 'MSPointerUp',\n down: 'MSPointerDown',\n over: 'mouseover',\n out: 'mouseout',\n move: 'MSPointerMove',\n cancel: 'MSPointerCancel',\n }\n : {\n up: 'pointerup',\n down: 'pointerdown',\n over: 'pointerover',\n out: 'pointerout',\n move: 'pointermove',\n cancel: 'pointercancel',\n })\n : null),\n\n // because Webkit and Opera still use 'mousewheel' event type\n wheelEvent: 'onmousewheel' in domObjects.document? 'mousewheel': 'wheel',\n\n};\n\nbrowser.useMatchesSelectorPolyfill = !is.function(Element.prototype[browser.prefixedMatchesSelector]);\n\nmodule.exports = browser;\n","const domObjects = {};\nconst win = require('./window').window;\n\nfunction blank () {}\n\ndomObjects.document = win.document;\ndomObjects.DocumentFragment = win.DocumentFragment || blank;\ndomObjects.SVGElement = win.SVGElement || blank;\ndomObjects.SVGSVGElement = win.SVGSVGElement || blank;\ndomObjects.SVGElementInstance = win.SVGElementInstance || blank;\ndomObjects.Element = win.Element || blank;\ndomObjects.HTMLElement = win.HTMLElement || domObjects.Element;\n\ndomObjects.Event = win.Event;\ndomObjects.Touch = win.Touch || blank;\ndomObjects.PointerEvent = (win.PointerEvent || win.MSPointerEvent);\n\nmodule.exports = domObjects;\n","const win = require('./window');\nconst browser = require('./browser');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst domUtils = {\n nodeContains: function (parent, child) {\n while (child) {\n if (child === parent) {\n return true;\n }\n\n child = child.parentNode;\n }\n\n return false;\n },\n\n closest: function (element, selector) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) { return element; }\n\n element = domUtils.parentNode(element);\n }\n\n return null;\n },\n\n parentNode: function (node) {\n let parent = node.parentNode;\n\n if (is.docFrag(parent)) {\n // skip past #shado-root fragments\n while ((parent = parent.host) && is.docFrag(parent)) {\n continue;\n }\n\n return parent;\n }\n\n return parent;\n },\n\n // taken from http://tanalin.com/en/blog/2012/12/matches-selector-ie8/ and modified\n matchesSelectorPolyfill: browser.useMatchesSelectorPolyfill\n ? function (element, selector, elems) {\n elems = elems || element.parentNode.querySelectorAll(selector);\n\n for (let i = 0, len = elems.length; i < len; i++) {\n if (elems[i] === element) {\n return true;\n }\n }\n\n return false;\n }\n : null,\n\n matchesSelector: function (element, selector, nodeList) {\n if (browser.useMatchesSelectorPolyfill) {\n return domUtils.matchesSelectorPolyfill(element, selector, nodeList);\n }\n\n // remove /deep/ from selectors if shadowDOM polyfill is used\n if (win.window !== win.realWindow) {\n selector = selector.replace(/\\/deep\\//g, ' ');\n }\n\n return element[browser.prefixedMatchesSelector](selector);\n },\n\n // Test for the element that's \"above\" all other qualifiers\n indexOfDeepestElement: function (elements) {\n let deepestZoneParents = [];\n let dropzoneParents = [];\n let dropzone;\n let deepestZone = elements[0];\n let index = deepestZone? 0: -1;\n let parent;\n let child;\n let i;\n let n;\n\n for (i = 1; i < elements.length; i++) {\n dropzone = elements[i];\n\n // an element might belong to multiple selector dropzones\n if (!dropzone || dropzone === deepestZone) {\n continue;\n }\n\n if (!deepestZone) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n // check if the deepest or current are document.documentElement or document.rootElement\n // - if the current dropzone is, do nothing and continue\n if (dropzone.parentNode === dropzone.ownerDocument) {\n continue;\n }\n // - if deepest is, update with the current dropzone and continue to next\n else if (deepestZone.parentNode === dropzone.ownerDocument) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n if (!deepestZoneParents.length) {\n parent = deepestZone;\n while (parent.parentNode && parent.parentNode !== parent.ownerDocument) {\n deepestZoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n }\n\n // if this element is an svg element and the current deepest is\n // an HTMLElement\n if (deepestZone instanceof domObjects.HTMLElement\n && dropzone instanceof domObjects.SVGElement\n && !(dropzone instanceof domObjects.SVGSVGElement)) {\n\n if (dropzone === deepestZone.parentNode) {\n continue;\n }\n\n parent = dropzone.ownerSVGElement;\n }\n else {\n parent = dropzone;\n }\n\n dropzoneParents = [];\n\n while (parent.parentNode !== parent.ownerDocument) {\n dropzoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n\n n = 0;\n\n // get (position of last common ancestor) + 1\n while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) {\n n++;\n }\n\n const parents = [\n dropzoneParents[n - 1],\n dropzoneParents[n],\n deepestZoneParents[n],\n ];\n\n child = parents[0].lastChild;\n\n while (child) {\n if (child === parents[1]) {\n deepestZone = dropzone;\n index = i;\n deepestZoneParents = [];\n\n break;\n }\n else if (child === parents[2]) {\n break;\n }\n\n child = child.previousSibling;\n }\n }\n\n return index;\n },\n\n matchesUpTo: function (element, selector, limit) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) {\n return true;\n }\n\n element = domUtils.parentNode(element);\n\n if (element === limit) {\n return domUtils.matchesSelector(element, selector);\n }\n }\n\n return false;\n },\n\n getActualElement: function (element) {\n return (element instanceof domObjects.SVGElementInstance\n ? element.correspondingUseElement\n : element);\n },\n\n getScrollXY: function (relevantWindow) {\n relevantWindow = relevantWindow || win.window;\n return {\n x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft,\n y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop,\n };\n },\n\n getElementClientRect: function (element) {\n const clientRect = (element instanceof domObjects.SVGElement\n ? element.getBoundingClientRect()\n : element.getClientRects()[0]);\n\n return clientRect && {\n left : clientRect.left,\n right : clientRect.right,\n top : clientRect.top,\n bottom: clientRect.bottom,\n width : clientRect.width || clientRect.right - clientRect.left,\n height: clientRect.height || clientRect.bottom - clientRect.top,\n };\n },\n\n getElementRect: function (element) {\n const clientRect = domUtils.getElementClientRect(element);\n\n if (!browser.isIOS7 && clientRect) {\n const scroll = domUtils.getScrollXY(win.getWindow(element));\n\n clientRect.left += scroll.x;\n clientRect.right += scroll.x;\n clientRect.top += scroll.y;\n clientRect.bottom += scroll.y;\n }\n\n return clientRect;\n },\n\n getPath: function (element) {\n const path = [];\n\n while (element) {\n path.push(element);\n element = domUtils.parentNode(element);\n }\n\n return path;\n },\n\n trySelector: value => {\n if (!is.string(value)) { return false; }\n\n // an exception will be raised if it is invalid\n domObjects.document.querySelector(value);\n return true;\n },\n};\n\nmodule.exports = domUtils;\n","const is = require('./is');\nconst domUtils = require('./domUtils');\nconst pExtend = require('./pointerExtend');\n\nconst { window, getWindow } = require('./window');\nconst { indexOf, contains } = require('./arr');\n\nconst useAttachEvent = ('attachEvent' in window) && !('addEventListener' in window);\nconst addEvent = useAttachEvent? 'attachEvent': 'addEventListener';\nconst removeEvent = useAttachEvent? 'detachEvent': 'removeEventListener';\nconst on = useAttachEvent? 'on': '';\n\nconst elements = [];\nconst targets = [];\nconst attachedListeners = [];\n\n// {\n// type: {\n// selectors: ['selector', ...],\n// contexts : [document, ...],\n// listeners: [[listener, capture, passive], ...]\n// }\n// }\nconst delegatedEvents = {};\n\nconst documents = [];\n\nconst supportsOptions = !useAttachEvent && (() => {\n let supported = false;\n\n window.document.createElement('div').addEventListener('test', null, {\n get capture () { supported = true; },\n });\n\n return supported;\n})();\n\nfunction add (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n let elementIndex = indexOf(elements, element);\n let target = targets[elementIndex];\n\n if (!target) {\n target = {\n events: {},\n typeCount: 0,\n };\n\n elementIndex = elements.push(element) - 1;\n targets.push(target);\n\n attachedListeners.push(useAttachEvent\n ? {\n supplied: [],\n wrapped : [],\n useCount: [],\n }\n : null);\n }\n\n if (!target.events[type]) {\n target.events[type] = [];\n target.typeCount++;\n }\n\n if (!contains(target.events[type], listener)) {\n let ret;\n\n if (useAttachEvent) {\n const { supplied, wrapped, useCount } = attachedListeners[elementIndex];\n const listenerIndex = indexOf(supplied, listener);\n\n const wrappedListener = wrapped[listenerIndex] || function (event) {\n if (!event.immediatePropagationStopped) {\n event.target = event.srcElement;\n event.currentTarget = element;\n\n event.preventDefault = event.preventDefault || preventDef;\n event.stopPropagation = event.stopPropagation || stopProp;\n event.stopImmediatePropagation = event.stopImmediatePropagation || stopImmProp;\n\n if (/mouse|click/.test(event.type)) {\n event.pageX = event.clientX + getWindow(element).document.documentElement.scrollLeft;\n event.pageY = event.clientY + getWindow(element).document.documentElement.scrollTop;\n }\n\n listener(event);\n }\n };\n\n ret = element[addEvent](on + type, wrappedListener, !!options.capture);\n\n if (listenerIndex === -1) {\n supplied.push(listener);\n wrapped.push(wrappedListener);\n useCount.push(1);\n }\n else {\n useCount[listenerIndex]++;\n }\n }\n else {\n ret = element[addEvent](type, listener, supportsOptions? options : !!options.capture);\n }\n target.events[type].push(listener);\n\n return ret;\n }\n}\n\nfunction remove (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const elementIndex = indexOf(elements, element);\n const target = targets[elementIndex];\n\n if (!target || !target.events) {\n return;\n }\n\n let wrappedListener = listener;\n let listeners;\n let listenerIndex;\n\n if (useAttachEvent) {\n listeners = attachedListeners[elementIndex];\n listenerIndex = indexOf(listeners.supplied, listener);\n wrappedListener = listeners.wrapped[listenerIndex];\n }\n\n if (type === 'all') {\n for (type in target.events) {\n if (target.events.hasOwnProperty(type)) {\n remove(element, type, 'all');\n }\n }\n return;\n }\n\n if (target.events[type]) {\n const len = target.events[type].length;\n\n if (listener === 'all') {\n for (let i = 0; i < len; i++) {\n remove(element, type, target.events[type][i], options);\n }\n return;\n }\n else {\n for (let i = 0; i < len; i++) {\n if (target.events[type][i] === listener) {\n element[removeEvent](on + type, wrappedListener, supportsOptions? options : !!options.capture);\n target.events[type].splice(i, 1);\n\n if (useAttachEvent && listeners) {\n listeners.useCount[listenerIndex]--;\n if (listeners.useCount[listenerIndex] === 0) {\n listeners.supplied.splice(listenerIndex, 1);\n listeners.wrapped.splice(listenerIndex, 1);\n listeners.useCount.splice(listenerIndex, 1);\n }\n }\n\n break;\n }\n }\n }\n\n if (target.events[type] && target.events[type].length === 0) {\n target.events[type] = null;\n target.typeCount--;\n }\n }\n\n if (!target.typeCount) {\n targets.splice(elementIndex, 1);\n elements.splice(elementIndex, 1);\n attachedListeners.splice(elementIndex, 1);\n }\n}\n\nfunction addDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n if (!delegatedEvents[type]) {\n delegatedEvents[type] = {\n selectors: [],\n contexts : [],\n listeners: [],\n };\n\n // add delegate listener functions\n for (let i = 0; i < documents.length; i++) {\n add(documents[i], type, delegateListener);\n add(documents[i], type, delegateUseCapture, true);\n }\n }\n\n const delegated = delegatedEvents[type];\n let index;\n\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n break;\n }\n }\n\n if (index === -1) {\n index = delegated.selectors.length;\n\n delegated.selectors.push(selector);\n delegated.contexts .push(context);\n delegated.listeners.push([]);\n }\n\n // keep listener and capture and passive flags\n delegated.listeners[index].push([listener, !!options.capture, options.passive]);\n}\n\nfunction removeDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const delegated = delegatedEvents[type];\n let matchFound = false;\n let index;\n\n if (!delegated) { return; }\n\n // count from last index of delegated to 0\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n // look for matching selector and context Node\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n\n const listeners = delegated.listeners[index];\n\n // each item of the listeners array is an array: [function, capture, passive]\n for (let i = listeners.length - 1; i >= 0; i--) {\n const [fn, capture, passive] = listeners[i];\n\n // check if the listener functions and capture and passive flags match\n if (fn === listener && capture === !!options.capture && passive === options.passive) {\n // remove the listener from the array of listeners\n listeners.splice(i, 1);\n\n // if all listeners for this interactable have been removed\n // remove the interactable from the delegated arrays\n if (!listeners.length) {\n delegated.selectors.splice(index, 1);\n delegated.contexts .splice(index, 1);\n delegated.listeners.splice(index, 1);\n\n // remove delegate function from context\n remove(context, type, delegateListener);\n remove(context, type, delegateUseCapture, true);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegatedEvents[type] = null;\n }\n }\n\n // only remove one listener\n matchFound = true;\n break;\n }\n }\n\n if (matchFound) { break; }\n }\n }\n}\n\n// bound to the interactable context when a DOM event\n// listener is added to a selector interactable\nfunction delegateListener (event, optionalArg) {\n const options = getOptions(optionalArg);\n const fakeEvent = {};\n const delegated = delegatedEvents[event.type];\n const eventTarget = (domUtils.getActualElement(event.path\n ? event.path[0]\n : event.target));\n let element = eventTarget;\n\n // duplicate the event so that currentTarget can be changed\n pExtend(fakeEvent, event);\n\n fakeEvent.originalEvent = event;\n fakeEvent.preventDefault = preventOriginalDefault;\n\n // climb up document tree looking for selector matches\n while (is.element(element)) {\n for (let i = 0; i < delegated.selectors.length; i++) {\n const selector = delegated.selectors[i];\n const context = delegated.contexts[i];\n\n if (domUtils.matchesSelector(element, selector)\n && domUtils.nodeContains(context, eventTarget)\n && domUtils.nodeContains(context, element)) {\n\n const listeners = delegated.listeners[i];\n\n fakeEvent.currentTarget = element;\n\n for (let j = 0; j < listeners.length; j++) {\n const [fn, capture, passive] = listeners[j];\n\n if (capture === !!options.capture && passive === options.passive) {\n fn(fakeEvent);\n }\n }\n }\n }\n\n element = domUtils.parentNode(element);\n }\n}\n\nfunction delegateUseCapture (event) {\n return delegateListener.call(this, event, true);\n}\n\nfunction preventDef () {\n this.returnValue = false;\n}\n\nfunction preventOriginalDefault () {\n this.originalEvent.preventDefault();\n}\n\nfunction stopProp () {\n this.cancelBubble = true;\n}\n\nfunction stopImmProp () {\n this.cancelBubble = true;\n this.immediatePropagationStopped = true;\n}\n\nfunction getOptions (param) {\n return is.object(param)? param : { capture: param };\n}\n\nmodule.exports = {\n add,\n remove,\n\n addDelegate,\n removeDelegate,\n\n delegateListener,\n delegateUseCapture,\n delegatedEvents,\n documents,\n\n useAttachEvent,\n supportsOptions,\n\n _elements: elements,\n _targets: targets,\n _attachedListeners: attachedListeners,\n};\n","module.exports = function extend (dest, source) {\n for (const prop in source) {\n dest[prop] = source[prop];\n }\n return dest;\n};\n","const {\n resolveRectLike,\n rectToXY,\n} = require('./rect');\n\nmodule.exports = function (target, element, action) {\n const actionOptions = target.options[action];\n const actionOrigin = actionOptions && actionOptions.origin;\n const origin = actionOrigin || target.options.origin;\n\n const originRect = resolveRectLike(origin, target, element, [target && element]);\n\n return rectToXY(originRect) || { x: 0, y: 0 };\n};\n","module.exports = (x, y) => Math.sqrt(x * x + y * y);\n","const extend = require('./extend');\nconst win = require('./window');\n\nconst utils = {\n warnOnce: function (method, message) {\n let warned = false;\n\n return function () {\n if (!warned) {\n win.window.console.warn(message);\n warned = true;\n }\n\n return method.apply(this, arguments);\n };\n },\n\n // http://stackoverflow.com/a/5634528/2280888\n _getQBezierValue: function (t, p1, p2, p3) {\n const iT = 1 - t;\n return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3;\n },\n\n getQuadraticCurvePoint: function (startX, startY, cpX, cpY, endX, endY, position) {\n return {\n x: utils._getQBezierValue(position, startX, cpX, endX),\n y: utils._getQBezierValue(position, startY, cpY, endY),\n };\n },\n\n // http://gizma.com/easing/\n easeOutQuad: function (t, b, c, d) {\n t /= d;\n return -c * t*(t-2) + b;\n },\n\n copyAction: function (dest, src) {\n dest.name = src.name;\n dest.axis = src.axis;\n dest.edges = src.edges;\n\n return dest;\n },\n\n is : require('./is'),\n extend : extend,\n hypot : require('./hypot'),\n getOriginXY: require('./getOriginXY'),\n};\n\nextend(utils, require('./arr'));\nextend(utils, require('./domUtils'));\nextend(utils, require('./pointerUtils'));\nextend(utils, require('./rect'));\n\nmodule.exports = utils;\n","const scope = require('../scope');\nconst utils = require('./index');\nconst browser = require('./browser');\n\nconst finder = {\n methodOrder: [ 'simulationResume', 'mouse', 'hasPointer', 'idle' ],\n\n search: function (pointer, eventType, eventTarget) {\n const mouseEvent = (/mouse/i.test(pointer.pointerType || eventType)\n // MSPointerEvent.MSPOINTER_TYPE_MOUSE\n || pointer.pointerType === 4);\n const pointerId = utils.getPointerId(pointer);\n const details = { pointer, pointerId, mouseEvent, eventType, eventTarget };\n\n for (const method of finder.methodOrder) {\n const interaction = finder[method](details);\n\n if (interaction) {\n return interaction;\n }\n }\n },\n\n // try to resume simulation with a new pointer\n simulationResume: function ({ mouseEvent, eventType, eventTarget }) {\n if (!/down|start/i.test(eventType)) {\n return null;\n }\n\n for (const interaction of scope.interactions) {\n let element = eventTarget;\n\n if (interaction.simulation && interaction.simulation.allowResume\n && (interaction.mouse === mouseEvent)) {\n while (element) {\n // if the element is the interaction element\n if (element === interaction.element) {\n return interaction;\n }\n element = utils.parentNode(element);\n }\n }\n }\n\n return null;\n },\n\n // if it's a mouse interaction\n mouse: function ({ pointerId, mouseEvent, eventType }) {\n if (!mouseEvent && (browser.supportsTouch || browser.supportsPointerEvent)) {\n return null;\n }\n\n let firstNonActive;\n\n for (const interaction of scope.interactions) {\n if (interaction.mouse) {\n // if it's a down event, skip interactions with running simulations\n if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; }\n\n // if the interaction is active, return it immediately\n if (interaction.interacting()) {\n return interaction;\n }\n // otherwise save it and look for another active interaction\n else if (!firstNonActive) {\n firstNonActive = interaction;\n }\n }\n }\n\n // if no active mouse interaction was found use the first inactive mouse\n // interaction\n if (firstNonActive) {\n return firstNonActive;\n }\n\n // Find any interaction specifically for mouse.\n // ignore the interaction if the eventType is a mousedown, and a simulation\n // is active\n for (const interaction of scope.interactions) {\n if (interaction.mouse && !(/down/.test(eventType) && interaction.simulation)) {\n return interaction;\n }\n }\n\n return null;\n },\n\n // get interaction that has this pointer\n hasPointer: function ({ pointerId }) {\n for (const interaction of scope.interactions) {\n if (utils.contains(interaction.pointerIds, pointerId)) {\n return interaction;\n }\n }\n },\n\n // get first idle interaction\n idle: function ({ mouseEvent }) {\n for (const interaction of scope.interactions) {\n // if there's already a pointer held down\n if (interaction.pointerIds.length === 1) {\n const target = interaction.target;\n // don't add this pointer if there is a target interactable and it\n // isn't gesturable\n if (target && !target.options.gesture.enabled) {\n continue;\n }\n }\n // maximum of 2 pointers per interaction\n else if (interaction.pointerIds.length >= 2) {\n continue;\n }\n\n if (!interaction.interacting() && (mouseEvent === interaction.mouse)) {\n return interaction;\n }\n }\n\n return null;\n },\n};\n\nmodule.exports = finder;\n","const win = require('./window');\nconst isWindow = require('./isWindow');\n\nconst is = {\n array : () => {},\n\n window : thing => thing === win.window || isWindow(thing),\n\n docFrag : thing => is.object(thing) && thing.nodeType === 11,\n\n object : thing => !!thing && (typeof thing === 'object'),\n\n function: thing => typeof thing === 'function',\n\n number : thing => typeof thing === 'number' ,\n\n bool : thing => typeof thing === 'boolean' ,\n\n string : thing => typeof thing === 'string' ,\n\n element: thing => {\n if (!thing || (typeof thing !== 'object')) { return false; }\n\n const _window = win.getWindow(thing) || win.window;\n\n return (/object|function/.test(typeof _window.Element)\n ? thing instanceof _window.Element //DOM2\n : thing.nodeType === 1 && typeof thing.nodeName === 'string');\n },\n};\n\nis.array = thing => (is.object(thing)\n && (typeof thing.length !== 'undefined')\n && is.function(thing.splice));\n\nmodule.exports = is;\n","module.exports = (thing) => !!(thing && thing.Window) && (thing instanceof thing.Window);\n","function pointerExtend (dest, source) {\n for (const prop in source) {\n const prefixedPropREs = module.exports.prefixedPropREs;\n let deprecated = false;\n\n // skip deprecated prefixed properties\n for (const vendor in prefixedPropREs) {\n if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) {\n deprecated = true;\n break;\n }\n }\n\n if (!deprecated && typeof source[prop] !== 'function') {\n dest[prop] = source[prop];\n }\n }\n return dest;\n}\n\npointerExtend.prefixedPropREs = {\n webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/,\n};\n\nmodule.exports = pointerExtend;\n","const hypot = require('./hypot');\nconst browser = require('./browser');\nconst dom = require('./domObjects');\nconst domUtils = require('./domUtils');\nconst is = require('./is');\nconst pointerExtend = require('./pointerExtend');\n\nconst pointerUtils = {\n copyCoords: function (dest, src) {\n dest.page = dest.page || {};\n dest.page.x = src.page.x;\n dest.page.y = src.page.y;\n\n dest.client = dest.client || {};\n dest.client.x = src.client.x;\n dest.client.y = src.client.y;\n\n dest.timeStamp = src.timeStamp;\n },\n\n setCoordDeltas: function (targetObj, prev, cur) {\n targetObj.page.x = cur.page.x - prev.page.x;\n targetObj.page.y = cur.page.y - prev.page.y;\n targetObj.client.x = cur.client.x - prev.client.x;\n targetObj.client.y = cur.client.y - prev.client.y;\n targetObj.timeStamp = cur.timeStamp - prev.timeStamp;\n\n // set pointer velocity\n const dt = Math.max(targetObj.timeStamp / 1000, 0.001);\n\n targetObj.page.speed = hypot(targetObj.page.x, targetObj.page.y) / dt;\n targetObj.page.vx = targetObj.page.x / dt;\n targetObj.page.vy = targetObj.page.y / dt;\n\n targetObj.client.speed = hypot(targetObj.client.x, targetObj.page.y) / dt;\n targetObj.client.vx = targetObj.client.x / dt;\n targetObj.client.vy = targetObj.client.y / dt;\n },\n\n isNativePointer: function (pointer) {\n return (pointer instanceof dom.Event || pointer instanceof dom.Touch);\n },\n\n // Get specified X/Y coords for mouse or event.touches[0]\n getXY: function (type, pointer, xy) {\n xy = xy || {};\n type = type || 'page';\n\n xy.x = pointer[type + 'X'];\n xy.y = pointer[type + 'Y'];\n\n return xy;\n },\n\n getPageXY: function (pointer, page) {\n page = page || {};\n\n // Opera Mobile handles the viewport and scrolling oddly\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n pointerUtils.getXY('screen', pointer, page);\n\n page.x += window.scrollX;\n page.y += window.scrollY;\n }\n else {\n pointerUtils.getXY('page', pointer, page);\n }\n\n return page;\n },\n\n getClientXY: function (pointer, client) {\n client = client || {};\n\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n // Opera Mobile handles the viewport and scrolling oddly\n pointerUtils.getXY('screen', pointer, client);\n }\n else {\n pointerUtils.getXY('client', pointer, client);\n }\n\n return client;\n },\n\n getPointerId: function (pointer) {\n return is.number(pointer.pointerId)? pointer.pointerId : pointer.identifier;\n },\n\n setCoords: function (targetObj, pointers, timeStamp) {\n const pointer = (pointers.length > 1\n ? pointerUtils.pointerAverage(pointers)\n : pointers[0]);\n\n const tmpXY = {};\n\n pointerUtils.getPageXY(pointer, tmpXY);\n targetObj.page.x = tmpXY.x;\n targetObj.page.y = tmpXY.y;\n\n pointerUtils.getClientXY(pointer, tmpXY);\n targetObj.client.x = tmpXY.x;\n targetObj.client.y = tmpXY.y;\n\n targetObj.timeStamp = is.number(timeStamp) ? timeStamp :new Date().getTime();\n },\n\n pointerExtend: pointerExtend,\n\n getTouchPair: function (event) {\n const touches = [];\n\n // array of touches is supplied\n if (is.array(event)) {\n touches[0] = event[0];\n touches[1] = event[1];\n }\n // an event\n else {\n if (event.type === 'touchend') {\n if (event.touches.length === 1) {\n touches[0] = event.touches[0];\n touches[1] = event.changedTouches[0];\n }\n else if (event.touches.length === 0) {\n touches[0] = event.changedTouches[0];\n touches[1] = event.changedTouches[1];\n }\n }\n else {\n touches[0] = event.touches[0];\n touches[1] = event.touches[1];\n }\n }\n\n return touches;\n },\n\n pointerAverage: function (pointers) {\n const average = {\n pageX : 0,\n pageY : 0,\n clientX: 0,\n clientY: 0,\n screenX: 0,\n screenY: 0,\n };\n\n for (const pointer of pointers) {\n for (const prop in average) {\n average[prop] += pointer[prop];\n }\n }\n for (const prop in average) {\n average[prop] /= pointers.length;\n }\n\n return average;\n },\n\n touchBBox: function (event) {\n if (!event.length && !(event.touches && event.touches.length > 1)) {\n return;\n }\n\n const touches = pointerUtils.getTouchPair(event);\n const minX = Math.min(touches[0].pageX, touches[1].pageX);\n const minY = Math.min(touches[0].pageY, touches[1].pageY);\n const maxX = Math.max(touches[0].pageX, touches[1].pageX);\n const maxY = Math.max(touches[0].pageY, touches[1].pageY);\n\n return {\n x: minX,\n y: minY,\n left: minX,\n top: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n },\n\n touchDistance: function (event, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n\n\n const dx = touches[0][sourceX] - touches[1][sourceX];\n const dy = touches[0][sourceY] - touches[1][sourceY];\n\n return hypot(dx, dy);\n },\n\n touchAngle: function (event, prevAngle, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n const dx = touches[1][sourceX] - touches[0][sourceX];\n const dy = touches[1][sourceY] - touches[0][sourceY];\n const angle = 180 * Math.atan2(dy , dx) / Math.PI;\n\n return angle;\n },\n\n getPointerType: function (pointer, interaction) {\n // if the PointerEvent API isn't available, then the pointer must be ither\n // a MouseEvent or TouchEvent\n if (interaction.mouse) { return 'mouse'; }\n if (!browser.supportsPointerEvent) { return 'touch'; }\n\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : [undefined, undefined,'touch', 'pen', 'mouse'][pointer.pointerType];\n },\n\n // [ event.target, event.currentTarget ]\n getEventTargets: function (event) {\n return [\n domUtils.getActualElement(event.path ? event.path[0] : event.target),\n domUtils.getActualElement(event.currentTarget),\n ];\n },\n};\n\nmodule.exports = pointerUtils;\n","const { window } = require('./window');\n\nconst vendors = ['ms', 'moz', 'webkit', 'o'];\nlet lastTime = 0;\nlet request;\nlet cancel;\n\nfor (let x = 0; x < vendors.length && !window.requestAnimationFrame; x++) {\n request = window[vendors[x] + 'RequestAnimationFrame'];\n cancel = window[vendors[x] +'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n}\n\nif (!request) {\n request = function (callback) {\n const currTime = new Date().getTime();\n const timeToCall = Math.max(0, 16 - (currTime - lastTime));\n const id = setTimeout(function () { callback(currTime + timeToCall); },\n timeToCall);\n\n lastTime = currTime + timeToCall;\n return id;\n };\n}\n\nif (!cancel) {\n cancel = function (id) {\n clearTimeout(id);\n };\n}\n\nmodule.exports = {\n request,\n cancel,\n};\n","const extend = require('./extend');\nconst is = require('./is');\nconst {\n closest,\n parentNode,\n getElementRect,\n} = require('./domUtils');\n\nconst rectUtils = {\n getStringOptionResult: function (value, interactable, element) {\n if (!is.string(value)) {\n return null;\n }\n\n if (value === 'parent') {\n value = parentNode(element);\n }\n else if (value === 'self') {\n value = interactable.getRect(element);\n }\n else {\n value = closest(element, value);\n }\n\n return value;\n },\n\n resolveRectLike: function (value, interactable, element, functionArgs) {\n value = rectUtils.getStringOptionResult(value, interactable, element) || value;\n\n if (is.function(value)) {\n value = value.apply(null, functionArgs);\n }\n\n if (is.element(value)) {\n value = getElementRect(value);\n }\n\n return value;\n },\n\n rectToXY: function (rect) {\n return rect && {\n x: 'x' in rect ? rect.x : rect.left,\n y: 'y' in rect ? rect.y : rect.top,\n };\n },\n\n xywhToTlbr: function (rect) {\n if (rect && !('left' in rect && 'top' in rect)) {\n rect = extend({}, rect);\n\n rect.left = rect.x || 0;\n rect.top = rect.y || 0;\n rect.right = rect.right || (rect.left + rect.width);\n rect.bottom = rect.bottom || (rect.top + rect.height);\n }\n\n return rect;\n },\n\n tlbrToXywh: function (rect) {\n if (rect && !('x' in rect && 'y' in rect)) {\n rect = extend({}, rect);\n\n rect.x = rect.left || 0;\n rect.top = rect.top || 0;\n rect.width = rect.width || (rect.right - rect.x);\n rect.height = rect.height || (rect.bottom - rect.y);\n }\n\n return rect;\n },\n};\n\nmodule.exports = rectUtils;\n","const win = module.exports;\nconst isWindow = require('./isWindow');\n\nfunction init (window) {\n // get wrapped window if using Shadow DOM polyfill\n\n win.realWindow = window;\n\n // create a TextNode\n const el = window.document.createTextNode('');\n\n // check if it's wrapped by a polyfill\n if (el.ownerDocument !== window.document\n && typeof window.wrap === 'function'\n && window.wrap(el) === el) {\n // use wrapped window\n window = window.wrap(window);\n }\n\n win.window = window;\n}\n\nif (typeof window === 'undefined') {\n win.window = undefined;\n win.realWindow = undefined;\n}\nelse {\n init(window);\n}\n\nwin.getWindow = function getWindow (node) {\n if (isWindow(node)) {\n return node;\n }\n\n const rootNode = (node.ownerDocument || node);\n\n return rootNode.defaultView || rootNode.parentWindow || win.window;\n};\n\nwin.init = init;\n"]} \ No newline at end of file +{"version":3,"sources":["src/minHeader.js","src/header.js","index.js","src/Eventable.js","src/InteractEvent.js","src/Interactable.js","src/Interaction.js","src/actions/base.js","src/actions/drag.js","src/actions/drop.js","src/actions/gesture.js","src/actions/resize.js","src/autoScroll.js","src/autoStart/InteractableMethods.js","src/autoStart/base.js","src/autoStart/delay.js","src/autoStart/drag.js","src/autoStart/gesture.js","src/autoStart/resize.js","src/defaultOptions.js","src/index.js","src/inertia.js","src/interact.js","src/interactablePreventDefault.js","src/legacyBrowsers.js","src/modifiers/index.js","src/modifiers/restrict.js","src/modifiers/restrictEdges.js","src/modifiers/restrictSize.js","src/modifiers/snap.js","src/modifiers/snapSize.js","src/pointerEvents/PointerEvent.js","src/pointerEvents/base.js","src/pointerEvents/holdRepeat.js","src/pointerEvents/interactableTargets.js","src/scope.js","src/utils/Signals.js","src/utils/arr.js","src/utils/browser.js","src/utils/domObjects.js","src/utils/domUtils.js","src/utils/events.js","src/utils/extend.js","src/utils/getOriginXY.js","src/utils/hypot.js","src/utils/index.js","src/utils/interactionFinder.js","src/utils/is.js","src/utils/isWindow.js","src/utils/pointerExtend.js","src/utils/pointerUtils.js","src/utils/raf.js","src/utils/rect.js","src/utils/window.js"],"names":[],"mappings":"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","file":"interact.min.js","sourceRoot":"","sourcesContent":["/* interact.js v1.3.0-alpha.4+sha.7970416-dirty | https://raw.github.com/taye/interact.js/master/LICENSE */\n","/**\n * interact.js v1.3.0-alpha.4+sha.7970416-dirty\n *\n * Copyright (c) 2012-2017 Taye Adeyemi \n * Open source under the MIT License.\n * https://raw.github.com/taye/interact.js/master/LICENSE\n */\n","/*\n * In a (windowless) server environment this file exports a factory function\n * that takes the window to use.\n *\n * var interact = require('interact.js')(windowObject);\n *\n * See https://github.com/taye/interact.js/issues/187\n */\nif (typeof window === 'undefined') {\n module.exports = function (window) {\n require('./src/utils/window').init(window);\n\n return require('./src/index');\n };\n}\nelse {\n module.exports = require('./src/index');\n}\n","const { indexOf } = require('./utils/arr');\nconst extend = require('./utils/extend.js');\n\nfunction fireUntilImmediateStopped (event, listeners) {\n for (let i = 0, len = listeners.length; i < len && !event.immediatePropagationStopped; i++) {\n listeners[i](event);\n }\n}\n\nclass Eventable {\n\n constructor (options) {\n this.options = extend({}, options || {});\n }\n\n fire (event) {\n let listeners;\n const onEvent = 'on' + event.type;\n const global = this.global;\n\n // Interactable#on() listeners\n if ((listeners = this[event.type])) {\n fireUntilImmediateStopped(event, listeners);\n }\n\n // interactable.onevent listener\n if (this[onEvent]) {\n this[onEvent](event);\n }\n\n // interact.on() listeners\n if (!event.propagationStopped && global && (listeners = global[event.type])) {\n fireUntilImmediateStopped(event, listeners);\n }\n }\n\n on (eventType, listener) {\n // if this type of event was never bound\n if (this[eventType]) {\n this[eventType].push(listener);\n }\n else {\n this[eventType] = [listener];\n }\n }\n\n off (eventType, listener) {\n // if it is an action event type\n const eventList = this[eventType];\n const index = eventList? indexOf(eventList, listener) : -1;\n\n if (index !== -1) {\n eventList.splice(index, 1);\n }\n\n if (eventList && eventList.length === 0 || !listener) {\n this[eventType] = listener;\n }\n }\n}\n\nmodule.exports = Eventable;\n","const extend = require('./utils/extend');\nconst getOriginXY = require('./utils/getOriginXY');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nclass InteractEvent {\n constructor (interaction, event, action, phase, element, related, preEnd = false) {\n const target = interaction.target;\n const deltaSource = (target && target.options || defaults).deltaSource;\n const origin = getOriginXY(target, element, action);\n const starting = phase === 'start';\n const ending = phase === 'end';\n const coords = starting? interaction.startCoords : interaction.curCoords;\n const prevEvent = interaction.prevEvent;\n\n element = element || interaction.element;\n\n const page = extend({}, coords.page);\n const client = extend({}, coords.client);\n\n page.x -= origin.x;\n page.y -= origin.y;\n\n client.x -= origin.x;\n client.y -= origin.y;\n\n this.ctrlKey = event.ctrlKey;\n this.altKey = event.altKey;\n this.shiftKey = event.shiftKey;\n this.metaKey = event.metaKey;\n this.button = event.button;\n this.buttons = event.buttons;\n this.target = element;\n this.currentTarget = element;\n this.relatedTarget = related || null;\n this.preEnd = preEnd;\n this.type = action + (phase || '');\n this.interaction = interaction;\n this.interactable = target;\n\n this.t0 = starting ? interaction.downTimes[interaction.downTimes.length - 1]\n : prevEvent.t0;\n\n const signalArg = {\n interaction,\n event,\n action,\n phase,\n element,\n related,\n page,\n client,\n coords,\n starting,\n ending,\n deltaSource,\n iEvent: this,\n };\n\n signals.fire('set-xy', signalArg);\n\n if (ending) {\n // use previous coords when ending\n this.pageX = prevEvent.pageX;\n this.pageY = prevEvent.pageY;\n this.clientX = prevEvent.clientX;\n this.clientY = prevEvent.clientY;\n }\n else {\n this.pageX = page.x;\n this.pageY = page.y;\n this.clientX = client.x;\n this.clientY = client.y;\n }\n\n this.x0 = interaction.startCoords.page.x - origin.x;\n this.y0 = interaction.startCoords.page.y - origin.y;\n this.clientX0 = interaction.startCoords.client.x - origin.x;\n this.clientY0 = interaction.startCoords.client.y - origin.y;\n\n signals.fire('set-delta', signalArg);\n\n this.timeStamp = coords.timeStamp;\n this.dt = interaction.pointerDelta.timeStamp;\n this.duration = this.timeStamp - this.t0;\n\n // speed and velocity in pixels per second\n this.speed = interaction.pointerDelta[deltaSource].speed;\n this.velocityX = interaction.pointerDelta[deltaSource].vx;\n this.velocityY = interaction.pointerDelta[deltaSource].vy;\n\n this.swipe = (ending || phase === 'inertiastart')? this.getSwipe() : null;\n\n signals.fire('new', signalArg);\n }\n\n getSwipe () {\n const interaction = this.interaction;\n\n if (interaction.prevEvent.speed < 600\n || this.timeStamp - interaction.prevEvent.timeStamp > 150) {\n return null;\n }\n\n let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI;\n const overlap = 22.5;\n\n if (angle < 0) {\n angle += 360;\n }\n\n const left = 135 - overlap <= angle && angle < 225 + overlap;\n const up = 225 - overlap <= angle && angle < 315 + overlap;\n\n const right = !left && (315 - overlap <= angle || angle < 45 + overlap);\n const down = !up && 45 - overlap <= angle && angle < 135 + overlap;\n\n return {\n up,\n down,\n left,\n right,\n angle,\n speed: interaction.prevEvent.speed,\n velocity: {\n x: interaction.prevEvent.velocityX,\n y: interaction.prevEvent.velocityY,\n },\n };\n }\n\n preventDefault () {}\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n}\n\nsignals.on('set-delta', function ({ iEvent, interaction, starting, deltaSource }) {\n const prevEvent = starting? iEvent : interaction.prevEvent;\n\n if (deltaSource === 'client') {\n iEvent.dx = iEvent.clientX - prevEvent.clientX;\n iEvent.dy = iEvent.clientY - prevEvent.clientY;\n }\n else {\n iEvent.dx = iEvent.pageX - prevEvent.pageX;\n iEvent.dy = iEvent.pageY - prevEvent.pageY;\n }\n});\n\nInteractEvent.signals = signals;\n\nmodule.exports = InteractEvent;\n","const is = require('./utils/is');\nconst events = require('./utils/events');\nconst extend = require('./utils/extend');\nconst actions = require('./actions/base');\nconst scope = require('./scope');\nconst Eventable = require('./Eventable');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nconst {\n getElementRect,\n nodeContains,\n trySelector,\n} = require('./utils/domUtils');\nconst { getWindow } = require('./utils/window');\nconst { indexOf, contains } = require('./utils/arr');\nconst { wheelEvent } = require('./utils/browser');\n\n// all set interactables\nscope.interactables = [];\n\n/*\\\n * Interactable\n [ property ]\n **\n * Object type returned by @interact\n\\*/\nclass Interactable {\n constructor (target, options) {\n options = options || {};\n\n this.target = target;\n this.events = new Eventable();\n this._context = options.context || scope.document;\n this._win = getWindow(trySelector(target)? this._context : target);\n this._doc = this._win.document;\n\n signals.fire('new', {\n target,\n options,\n interactable: this,\n win: this._win,\n });\n\n scope.addDocument( this._doc, this._win );\n\n scope.interactables.push(this);\n\n this.set(options);\n }\n\n setOnEvents (action, phases) {\n const onAction = 'on' + action;\n\n if (is.function(phases.onstart) ) { this.events[onAction + 'start' ] = phases.onstart ; }\n if (is.function(phases.onmove) ) { this.events[onAction + 'move' ] = phases.onmove ; }\n if (is.function(phases.onend) ) { this.events[onAction + 'end' ] = phases.onend ; }\n if (is.function(phases.oninertiastart)) { this.events[onAction + 'inertiastart' ] = phases.oninertiastart ; }\n\n return this;\n }\n\n setPerAction (action, options) {\n // for all the default per-action options\n for (const option in options) {\n // if this option exists for this action\n if (option in defaults[action]) {\n // if the option in the options arg is an object value\n if (is.object(options[option])) {\n // duplicate the object\n this.options[action][option] = extend(this.options[action][option] || {}, options[option]);\n\n if (is.object(defaults.perAction[option]) && 'enabled' in defaults.perAction[option]) {\n this.options[action][option].enabled = options[option].enabled === false? false : true;\n }\n }\n else if (is.bool(options[option]) && is.object(defaults.perAction[option])) {\n this.options[action][option].enabled = options[option];\n }\n else if (options[option] !== undefined) {\n // or if it's not undefined, do a plain assignment\n this.options[action][option] = options[option];\n }\n }\n }\n }\n\n /*\\\n * Interactable.getRect\n [ method ]\n *\n * The default function to get an Interactables bounding rect. Can be\n * overridden using @Interactable.rectChecker.\n *\n - element (Element) #optional The element to measure.\n = (object) The object's bounding rectangle.\n o {\n o top : 0,\n o left : 0,\n o bottom: 0,\n o right : 0,\n o width : 0,\n o height: 0\n o }\n \\*/\n getRect (element) {\n element = element || this.target;\n\n if (is.string(this.target) && !(is.element(element))) {\n element = this._context.querySelector(this.target);\n }\n\n return getElementRect(element);\n }\n\n /*\\\n * Interactable.rectChecker\n [ method ]\n *\n * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n - checker (function) #optional A function which returns this Interactable's bounding rectangle. See @Interactable.getRect\n = (function | object) The checker function or this Interactable\n \\*/\n rectChecker (checker) {\n if (is.function(checker)) {\n this.getRect = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.getRect;\n\n return this;\n }\n\n return this.getRect;\n }\n\n _backCompatOption (optionName, newValue) {\n if (trySelector(newValue) || is.object(newValue)) {\n this.options[optionName] = newValue;\n\n for (const action of actions.names) {\n this.options[action][optionName] = newValue;\n }\n\n return this;\n }\n\n return this.options[optionName];\n }\n\n /*\\\n * Interactable.origin\n [ method ]\n *\n * Gets or sets the origin of the Interactable's element. The x and y\n * of the origin will be subtracted from action event coordinates.\n *\n - origin (object | string) #optional An object eg. { x: 0, y: 0 } or string 'parent', 'self' or any CSS selector\n * OR\n - origin (Element) #optional An HTML or SVG Element whose rect will be used\n **\n = (object) The current origin or this Interactable\n \\*/\n origin (newValue) {\n return this._backCompatOption('origin', newValue);\n }\n\n /*\\\n * Interactable.deltaSource\n [ method ]\n *\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n - newValue (string) #optional Use 'client' if you will be scrolling while interacting; Use 'page' if you want autoScroll to work\n = (string | object) The current deltaSource or this Interactable\n \\*/\n deltaSource (newValue) {\n if (newValue === 'page' || newValue === 'client') {\n this.options.deltaSource = newValue;\n\n return this;\n }\n\n return this.options.deltaSource;\n }\n\n /*\\\n * Interactable.context\n [ method ]\n *\n * Gets the selector context Node of the Interactable. The default is `window.document`.\n *\n = (Node) The context Node of this Interactable\n **\n \\*/\n context () {\n return this._context;\n }\n\n inContext (element) {\n return (this._context === element.ownerDocument\n || nodeContains(this._context, element));\n }\n\n /*\\\n * Interactable.fire\n [ method ]\n *\n * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n - iEvent (InteractEvent) The InteractEvent object to be fired on this Interactable\n = (Interactable) this Interactable\n \\*/\n fire (iEvent) {\n this.events.fire(iEvent);\n\n return this;\n }\n\n _onOffMultiple (method, eventType, listener, options) {\n if (is.string(eventType) && eventType.search(' ') !== -1) {\n eventType = eventType.trim().split(/ +/);\n }\n\n if (is.array(eventType)) {\n for (let i = 0; i < eventType.length; i++) {\n this[method](eventType[i], listener, options);\n }\n\n return true;\n }\n\n if (is.object(eventType)) {\n for (const prop in eventType) {\n this[method](prop, eventType[prop], listener);\n }\n\n return true;\n }\n }\n\n /*\\\n * Interactable.on\n [ method ]\n *\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n - eventType (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) This Interactable\n \\*/\n on (eventType, listener, options) {\n if (this._onOffMultiple('on', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.on(eventType, listener);\n }\n // delegated event for selector\n else if (is.string(this.target)) {\n events.addDelegate(this.target, this._context, eventType, listener, options);\n }\n else {\n events.add(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.off\n [ method ]\n *\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n - eventType (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) This Interactable\n \\*/\n off (eventType, listener, options) {\n if (this._onOffMultiple('off', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n // if it is an action event type\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.off(eventType, listener);\n }\n // delegated event\n else if (is.string(this.target)) {\n events.removeDelegate(this.target, this._context, eventType, listener, options);\n }\n // remove listener from this Interatable's element\n else {\n events.remove(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.set\n [ method ]\n *\n * Reset the options of this Interactable\n - options (object) The new settings to apply\n = (object) This Interactable\n \\*/\n set (options) {\n if (!is.object(options)) {\n options = {};\n }\n\n this.options = extend({}, defaults.base);\n\n const perActions = extend({}, defaults.perAction);\n\n for (const actionName in actions.methodDict) {\n const methodName = actions.methodDict[actionName];\n\n this.options[actionName] = extend({}, defaults[actionName]);\n\n this.setPerAction(actionName, perActions);\n\n this[methodName](options[actionName]);\n }\n\n for (const setting of Interactable.settingsMethods) {\n this.options[setting] = defaults.base[setting];\n\n if (setting in options) {\n this[setting](options[setting]);\n }\n }\n\n signals.fire('set', {\n options,\n interactable: this,\n });\n\n return this;\n }\n\n /*\\\n * Interactable.unset\n [ method ]\n *\n * Remove this interactable from the list of interactables and remove\n * it's action capabilities and event listeners\n *\n = (object) @interact\n \\*/\n unset () {\n events.remove(this.target, 'all');\n\n if (is.string(this.target)) {\n // remove delegated events\n for (const type in events.delegatedEvents) {\n const delegated = events.delegatedEvents[type];\n\n if (delegated.selectors[0] === this.target\n && delegated.contexts[0] === this._context) {\n\n delegated.selectors.splice(0, 1);\n delegated.contexts .splice(0, 1);\n delegated.listeners.splice(0, 1);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegated[type] = null;\n }\n }\n\n events.remove(this._context, type, events.delegateListener);\n events.remove(this._context, type, events.delegateUseCapture, true);\n }\n }\n else {\n events.remove(this, 'all');\n }\n\n signals.fire('unset', { interactable: this });\n\n scope.interactables.splice(indexOf(scope.interactables, this), 1);\n\n // Stop related interactions when an Interactable is unset\n for (const interaction of scope.interactions || []) {\n if (interaction.target === this && interaction.interacting()) {\n interaction.stop();\n }\n }\n\n return scope.interact;\n }\n}\n\nscope.interactables.indexOfElement = function indexOfElement (target, context) {\n context = context || scope.document;\n\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n if (interactable.target === target && interactable._context === context) {\n return i;\n }\n }\n return -1;\n};\n\nscope.interactables.get = function interactableGet (element, options, dontCheckInContext) {\n const ret = this[this.indexOfElement(element, options && options.context)];\n\n return ret && (is.string(element) || dontCheckInContext || ret.inContext(element))? ret : null;\n};\n\nscope.interactables.forEachSelector = function (callback, element) {\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n // skip non CSS selector targets and out of context elements\n if (!is.string(interactable.target)\n || (element && !interactable.inContext(element))) {\n continue;\n }\n\n const ret = callback(interactable, interactable.target, interactable._context, i, this);\n\n if (ret !== undefined) {\n return ret;\n }\n }\n};\n\n// all interact.js eventTypes\nInteractable.eventTypes = scope.eventTypes = [];\n\nInteractable.signals = signals;\n\nInteractable.settingsMethods = [ 'deltaSource', 'origin', 'preventDefault', 'rectChecker' ];\n\nmodule.exports = Interactable;\n","const scope = require('./scope');\nconst utils = require('./utils');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst domObjects = require('./utils/domObjects');\nconst finder = require('./utils/interactionFinder');\nconst signals = require('./utils/Signals').new();\n\nconst listeners = {};\nconst methodNames = [\n 'pointerDown', 'pointerMove', 'pointerUp',\n 'updatePointer', 'removePointer',\n];\n\n// for ignoring browser's simulated mouse events\nlet prevTouchTime = 0;\n\n// all active and idle interactions\nscope.interactions = [];\n\nclass Interaction {\n constructor ({ pointerType }) {\n this.target = null; // current interactable being interacted with\n this.element = null; // the target element of the interactable\n\n this.prepared = { // action that's ready to be fired on next move event\n name : null,\n axis : null,\n edges: null,\n };\n\n // keep track of added pointers\n this.pointers = [];\n this.pointerIds = [];\n this.downTargets = [];\n this.downTimes = [];\n\n // Previous native pointer move event coordinates\n this.prevCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n // current native pointer move event coordinates\n this.curCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Starting InteractEvent pointer coordinates\n this.startCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Change in coordinates and time of the pointer\n this.pointerDelta = {\n page : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n client : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n timeStamp: 0,\n };\n\n this.downEvent = null; // pointerdown/mousedown/touchstart event\n this.downPointer = {};\n\n this._eventTarget = null;\n this._curEventTarget = null;\n\n this.prevEvent = null; // previous action event\n\n this.pointerIsDown = false;\n this.pointerWasMoved = false;\n this._interacting = false;\n\n this.pointerType = pointerType;\n\n signals.fire('new', this);\n\n scope.interactions.push(this);\n }\n\n pointerDown (pointer, event, eventTarget) {\n const pointerIndex = this.updatePointer(pointer, event, true);\n\n signals.fire('down', {\n pointer,\n event,\n eventTarget,\n pointerIndex,\n interaction: this,\n });\n }\n\n /*\\\n * Interaction.start\n [ method ]\n *\n * Start an action with the given Interactable and Element as tartgets. The\n * action must be enabled for the target Interactable and an appropriate number\n * of pointers must be held down - 1 for drag/resize, 2 for gesture.\n *\n * Use it with `interactable.able({ manualStart: false })` to always\n * [start actions manually](https://github.com/taye/interact.js/issues/114)\n *\n - action (object) The action to be performed - drag, resize, etc.\n - target (Interactable) The Interactable to target\n - element (Element) The DOM Element to target\n = (object) interact\n **\n | interact(target)\n | .draggable({\n | // disable the default drag start by down->move\n | manualStart: true\n | })\n | // start dragging after the user holds the pointer down\n | .on('hold', function (event) {\n | var interaction = event.interaction;\n |\n | if (!interaction.interacting()) {\n | interaction.start({ name: 'drag' },\n | event.interactable,\n | event.currentTarget);\n | }\n | });\n \\*/\n start (action, target, element) {\n if (this.interacting()\n || !this.pointerIsDown\n || this.pointerIds.length < (action.name === 'gesture'? 2 : 1)) {\n return;\n }\n\n // if this interaction had been removed after stopping\n // add it back\n if (utils.indexOf(scope.interactions, this) === -1) {\n scope.interactions.push(this);\n }\n\n utils.copyAction(this.prepared, action);\n this.target = target;\n this.element = element;\n\n signals.fire('action-start', {\n interaction: this,\n event: this.downEvent,\n });\n }\n\n pointerMove (pointer, event, eventTarget) {\n if (!this.simulation) {\n this.updatePointer(pointer);\n utils.setCoords(this.curCoords, this.pointers);\n }\n\n const duplicateMove = (this.curCoords.page.x === this.prevCoords.page.x\n && this.curCoords.page.y === this.prevCoords.page.y\n && this.curCoords.client.x === this.prevCoords.client.x\n && this.curCoords.client.y === this.prevCoords.client.y);\n\n let dx;\n let dy;\n\n // register movement greater than pointerMoveTolerance\n if (this.pointerIsDown && !this.pointerWasMoved) {\n dx = this.curCoords.client.x - this.startCoords.client.x;\n dy = this.curCoords.client.y - this.startCoords.client.y;\n\n this.pointerWasMoved = utils.hypot(dx, dy) > Interaction.pointerMoveTolerance;\n }\n\n const signalArg = {\n pointer,\n pointerIndex: this.getPointerIndex(pointer),\n event,\n eventTarget,\n dx,\n dy,\n duplicate: duplicateMove,\n interaction: this,\n interactingBeforeMove: this.interacting(),\n };\n\n if (!duplicateMove) {\n // set pointer coordinate, time changes and speeds\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n }\n\n signals.fire('move', signalArg);\n\n if (!duplicateMove) {\n // if interacting, fire an 'action-move' signal etc\n if (this.interacting()) {\n this.doMove(signalArg);\n }\n\n if (this.pointerWasMoved) {\n utils.copyCoords(this.prevCoords, this.curCoords);\n }\n }\n }\n\n /*\\\n * Interaction.doMove\n [ method ]\n *\n * Force a move of the current action at the same coordinates. Useful if\n * snap/restrict has been changed and you want a movement with the new\n * settings.\n *\n **\n | interact(target)\n | .draggable(true)\n | .on('dragmove', function (event) {\n | if (someCondition) {\n | // change the snap settings\n | event.interactable.draggable({ snap: { targets: [] }});\n | // fire another move event with re-calculated snap\n | event.interaction.doMove();\n | }\n | });\n \\*/\n doMove (signalArg) {\n signalArg = utils.extend({\n pointer: this.pointers[0],\n event: this.prevEvent,\n eventTarget: this._eventTarget,\n interaction: this,\n }, signalArg || {});\n\n signals.fire('before-action-move', signalArg);\n\n if (!this._dontFireMove) {\n signals.fire('action-move', signalArg);\n }\n\n this._dontFireMove = false;\n }\n\n // End interact move events and stop auto-scroll unless simulation is running\n pointerUp (pointer, event, eventTarget, curEventTarget) {\n const pointerIndex = this.getPointerIndex(pointer);\n\n signals.fire(/cancel$/i.test(event.type)? 'cancel' : 'up', {\n pointer,\n pointerIndex,\n event,\n eventTarget,\n curEventTarget,\n interaction: this,\n });\n\n if (!this.simulation) {\n this.end(event);\n }\n\n this.pointerIsDown = false;\n this.removePointer(pointer, event);\n }\n\n /*\\\n * Interaction.end\n [ method ]\n *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n - event (PointerEvent) #optional\n **\n | interact(target)\n | .draggable(true)\n | .on('move', function (event) {\n | if (event.pageX > 1000) {\n | // end the current action\n | event.interaction.end();\n | // stop all further listeners from being called\n | event.stopImmediatePropagation();\n | }\n | });\n \\*/\n end (event) {\n event = event || this.prevEvent;\n\n if (this.interacting()) {\n signals.fire('action-end', {\n event,\n interaction: this,\n });\n }\n\n this.stop();\n }\n\n currentAction () {\n return this._interacting? this.prepared.name: null;\n }\n\n interacting () {\n return this._interacting;\n }\n\n stop () {\n signals.fire('stop', { interaction: this });\n\n if (this._interacting) {\n signals.fire('stop-active', { interaction: this });\n signals.fire('stop-' + this.prepared.name, { interaction: this });\n }\n\n this.target = this.element = null;\n\n this._interacting = false;\n this.prepared.name = this.prevEvent = null;\n }\n\n getPointerIndex (pointer) {\n // mouse and pen interactions may have only one pointer\n if (this.pointerType === 'mouse' || this.pointerType === 'pen') {\n return 0;\n }\n\n return utils.indexOf(this.pointerIds, utils.getPointerId(pointer));\n }\n\n updatePointer (pointer, event, down = event && /(down|start)$/i.test(event.type)) {\n const id = utils.getPointerId(pointer);\n let index = this.getPointerIndex(pointer);\n\n if (index === -1) {\n index = this.pointerIds.length;\n this.pointerIds[index] = id;\n }\n\n if (down) {\n signals.fire('update-pointer-down', {\n pointer,\n event,\n down,\n pointerId: id,\n pointerIndex: index,\n interaction: this,\n });\n }\n\n this.pointers[index] = pointer;\n\n return index;\n }\n\n removePointer (pointer, event) {\n const index = this.getPointerIndex(pointer);\n\n if (index === -1) { return; }\n\n signals.fire('remove-pointer', {\n pointer,\n event,\n pointerIndex: index,\n interaction: this,\n });\n\n this.pointers .splice(index, 1);\n this.pointerIds .splice(index, 1);\n this.downTargets.splice(index, 1);\n this.downTimes .splice(index, 1);\n }\n\n _updateEventTargets (target, currentTarget) {\n this._eventTarget = target;\n this._curEventTarget = currentTarget;\n }\n}\n\nfor (let i = 0, len = methodNames.length; i < len; i++) {\n const method = methodNames[i];\n\n listeners[method] = doOnInteractions(method);\n}\n\nfunction doOnInteractions (method) {\n return (function (event) {\n const pointerType = utils.getPointerType(event);\n const [eventTarget, curEventTarget] = utils.getEventTargets(event);\n const matches = []; // [ [pointer, interaction], ...]\n\n if (browser.supportsTouch && /touch/.test(event.type)) {\n prevTouchTime = new Date().getTime();\n\n for (let i = 0; i < event.changedTouches.length; i++) {\n const pointer = event.changedTouches[i];\n const interaction = finder.search(pointer, event.type, eventTarget);\n\n matches.push([pointer, interaction || new Interaction({ pointerType })]);\n }\n }\n else {\n let invalidPointer = false;\n\n if (!browser.supportsPointerEvent && /mouse/.test(event.type)) {\n // ignore mouse events while touch interactions are active\n for (let i = 0; i < scope.interactions.length && !invalidPointer; i++) {\n invalidPointer = scope.interactions[i].pointerType !== 'mouse' && scope.interactions[i].pointerIsDown;\n }\n\n // try to ignore mouse events that are simulated by the browser\n // after a touch event\n invalidPointer = invalidPointer\n || (new Date().getTime() - prevTouchTime < 500)\n // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated\n || event.timeStamp === 0;\n }\n\n if (!invalidPointer) {\n let interaction = finder.search(event, event.type, eventTarget);\n\n if (!interaction) {\n interaction = new Interaction({ pointerType });\n }\n\n matches.push([event, interaction]);\n }\n }\n\n for (const [pointer, interaction] of matches) {\n interaction._updateEventTargets(eventTarget, curEventTarget);\n interaction[method](pointer, event, eventTarget, curEventTarget);\n }\n });\n}\n\nfunction endAll (event) {\n for (let i = 0; i < scope.interactions.length; i++) {\n const interaction = scope.interactions[i];\n\n interaction.end(event);\n signals.fire('endall', { event, interaction });\n }\n}\n\nconst docEvents = { /* 'eventType': listenerFunc */ };\nconst pEventTypes = browser.pEventTypes;\n\nif (domObjects.PointerEvent) {\n docEvents[pEventTypes.down ] = listeners.pointerDown;\n docEvents[pEventTypes.move ] = listeners.pointerMove;\n docEvents[pEventTypes.up ] = listeners.pointerUp;\n docEvents[pEventTypes.cancel] = listeners.pointerUp;\n}\nelse {\n docEvents.mousedown = listeners.pointerDown;\n docEvents.mousemove = listeners.pointerMove;\n docEvents.mouseup = listeners.pointerUp;\n\n docEvents.touchstart = listeners.pointerDown;\n docEvents.touchmove = listeners.pointerMove;\n docEvents.touchend = listeners.pointerUp;\n docEvents.touchcancel = listeners.pointerUp;\n}\n\ndocEvents.blur = endAll;\n\nfunction onDocSignal ({ doc }, signalName) {\n const eventMethod = signalName.indexOf('add') === 0\n ? events.add : events.remove;\n\n // delegate event listener\n for (const eventType in scope.delegatedEvents) {\n eventMethod(doc, eventType, events.delegateListener);\n eventMethod(doc, eventType, events.delegateUseCapture, true);\n }\n\n for (const eventType in docEvents) {\n eventMethod(doc, eventType, docEvents[eventType]);\n }\n}\n\nsignals.on('update-pointer-down', ({ interaction, pointer, pointerId, pointerIndex, event, eventTarget, down }) => {\n interaction.pointerIds[pointerIndex] = pointerId;\n interaction.pointers[pointerIndex] = pointer;\n\n if (down) {\n interaction.pointerIsDown = true;\n }\n\n if (!interaction.interacting()) {\n utils.setCoords(interaction.startCoords, interaction.pointers);\n\n utils.copyCoords(interaction.curCoords , interaction.startCoords);\n utils.copyCoords(interaction.prevCoords, interaction.startCoords);\n\n interaction.downEvent = event;\n interaction.downTimes[pointerIndex] = interaction.curCoords.timeStamp;\n interaction.downTargets[pointerIndex] = eventTarget || event && utils.getEventTargets(event)[0];\n interaction.pointerWasMoved = false;\n\n utils.pointerExtend(interaction.downPointer, pointer);\n }\n});\n\nscope.signals.on('add-document' , onDocSignal);\nscope.signals.on('remove-document', onDocSignal);\n\nInteraction.pointerMoveTolerance = 1;\nInteraction.doOnInteractions = doOnInteractions;\nInteraction.endAll = endAll;\nInteraction.signals = signals;\nInteraction.docEvents = docEvents;\n\nscope.endAllInteractions = endAll;\n\nmodule.exports = Interaction;\n","const Interaction = require('../Interaction');\nconst InteractEvent = require('../InteractEvent');\n\nconst actions = {\n firePrepared,\n names: [],\n methodDict: {},\n};\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n interaction._interacting = true;\n firePrepared(interaction, event, 'start');\n});\n\nInteraction.signals.on('action-move', function ({ interaction, event, preEnd }) {\n firePrepared(interaction, event, 'move', preEnd);\n\n // if the action was ended in a listener\n if (!interaction.interacting()) { return false; }\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n firePrepared(interaction, event, 'end');\n});\n\nfunction firePrepared (interaction, event, phase, preEnd) {\n const actionName = interaction.prepared.name;\n\n const newEvent = new InteractEvent(interaction, event, actionName, phase, interaction.element, null, preEnd);\n\n interaction.target.fire(newEvent);\n interaction.prevEvent = newEvent;\n}\n\nmodule.exports = actions;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drag = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n startAxis : 'xy',\n lockAxis : 'xy',\n },\n\n checker: function (pointer, event, interactable) {\n const dragOptions = interactable.options.drag;\n\n return dragOptions.enabled\n ? { name: 'drag', axis: (dragOptions.lockAxis === 'start'\n ? dragOptions.startAxis\n : dragOptions.lockAxis)}\n : null;\n },\n\n getCursor: function () {\n return 'move';\n },\n};\n\nInteraction.signals.on('before-action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n interaction.curCoords.page.y = interaction.startCoords.page.y;\n interaction.curCoords.client.y = interaction.startCoords.client.y;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vx);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vx);\n interaction.pointerDelta.client.vy = 0;\n interaction.pointerDelta.page.vy = 0;\n }\n else if (axis === 'y') {\n interaction.curCoords.page.x = interaction.startCoords.page.x;\n interaction.curCoords.client.x = interaction.startCoords.client.x;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vy);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vy);\n interaction.pointerDelta.client.vx = 0;\n interaction.pointerDelta.page.vx = 0;\n }\n});\n\n// dragmove\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'dragmove') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n iEvent.pageY = interaction.startCoords.page.y;\n iEvent.clientY = interaction.startCoords.client.y;\n iEvent.dy = 0;\n }\n else if (axis === 'y') {\n iEvent.pageX = interaction.startCoords.page.x;\n iEvent.clientX = interaction.startCoords.client.x;\n iEvent.dx = 0;\n }\n});\n\n/*\\\n * Interactable.draggable\n [ method ]\n *\n * Gets or sets whether drag actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of drag events\n | var isDraggable = interact('ul li').draggable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on drag events (object makes the Interactable draggable)\n = (object) This Interactable\n | interact(element).draggable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // the axis in which the first movement must be\n | // for the drag sequence to start\n | // 'xy' by default - any direction\n | startAxis: 'x' || 'y' || 'xy',\n |\n | // 'xy' by default - don't restrict to one axis (move in any direction)\n | // 'x' or 'y' to restrict movement to either axis\n | // 'start' to restrict movement to the axis the drag started in\n | lockAxis: 'x' || 'y' || 'xy' || 'start',\n |\n | // max number of drags that can happen concurrently\n | // with elements of this Interactable. Infinity by default\n | max: Infinity,\n |\n | // max number of drags that can target the same element+Interactable\n | // 1 by default\n | maxPerElement: 2\n | });\n\\*/\nInteractable.prototype.draggable = function (options) {\n if (utils.is.object(options)) {\n this.options.drag.enabled = options.enabled === false? false: true;\n this.setPerAction('drag', options);\n this.setOnEvents('drag', options);\n\n if (/^(xy|x|y|start)$/.test(options.lockAxis)) {\n this.options.drag.lockAxis = options.lockAxis;\n }\n if (/^(xy|x|y)$/.test(options.startAxis)) {\n this.options.drag.startAxis = options.startAxis;\n }\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drag.enabled = options;\n\n if (!options) {\n this.ondragstart = this.ondragstart = this.ondragend = null;\n }\n\n return this;\n }\n\n return this.options.drag;\n};\n\nactions.drag = drag;\nactions.names.push('drag');\nutils.merge(Interactable.eventTypes, [\n 'dragstart',\n 'dragmove',\n 'draginertiastart',\n 'draginertiaresume',\n 'dragend',\n]);\nactions.methodDict.drag = 'draggable';\n\ndefaultOptions.drag = drag.defaults;\n\nmodule.exports = drag;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst scope = require('../scope');\nconst interact = require('../interact');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drop = {\n defaults: {\n enabled: false,\n accept : null,\n overlap: 'pointer',\n },\n};\n\nlet dynamicDrop = false;\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // reset active dropzones\n interaction.activeDrops.dropzones = [];\n interaction.activeDrops.elements = [];\n interaction.activeDrops.rects = [];\n\n interaction.dropEvents = null;\n\n if (!interaction.dynamicDrop) {\n setActiveDrops(interaction, interaction.element);\n }\n\n const dragEvent = interaction.prevEvent;\n const dropEvents = getDropEvents(interaction, event, dragEvent);\n\n if (dropEvents.activate) {\n fireActiveDrops(interaction, dropEvents.activate);\n }\n});\n\nInteractEvent.signals.on('new', function ({ interaction, iEvent, event }) {\n if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { return; }\n\n const draggableElement = interaction.element;\n const dragEvent = iEvent;\n const dropResult = getDrop(dragEvent, event, draggableElement);\n\n interaction.dropTarget = dropResult.dropzone;\n interaction.dropElement = dropResult.element;\n\n interaction.dropEvents = getDropEvents(interaction, event, dragEvent);\n});\n\nInteraction.signals.on('action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n fireDropEvents(interaction, interaction.dropEvents);\n});\n\nInteraction.signals.on('action-end', function ({ interaction }) {\n if (interaction.prepared.name === 'drag') {\n fireDropEvents(interaction, interaction.dropEvents);\n }\n});\n\nInteraction.signals.on('stop-drag', function ({ interaction }) {\n interaction.activeDrops.dropzones =\n interaction.activeDrops.elements =\n interaction.activeDrops.rects =\n interaction.dropEvents = null;\n});\n\nfunction collectDrops (interaction, element) {\n const drops = [];\n const elements = [];\n\n element = element || interaction.element;\n\n // collect all dropzones and their elements which qualify for a drop\n for (const current of scope.interactables) {\n if (!current.options.drop.enabled) { continue; }\n\n const accept = current.options.drop.accept;\n\n // test the draggable element against the dropzone's accept setting\n if ((utils.is.element(accept) && accept !== element)\n || (utils.is.string(accept)\n && !utils.matchesSelector(element, accept))) {\n\n continue;\n }\n\n // query for new elements if necessary\n const dropElements = utils.is.string(current.target)\n ? current._context.querySelectorAll(current.target)\n : [current.target];\n\n for (let i = 0; i < dropElements.length; i++) {\n const currentElement = dropElements[i];\n\n if (currentElement !== element) {\n drops.push(current);\n elements.push(currentElement);\n }\n }\n }\n\n return {\n elements,\n dropzones: drops,\n };\n}\n\nfunction fireActiveDrops (interaction, event) {\n let prevElement;\n\n // loop through all active dropzones and trigger event\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n const current = interaction.activeDrops.dropzones[i];\n const currentElement = interaction.activeDrops.elements [i];\n\n // prevent trigger of duplicate events on same element\n if (currentElement !== prevElement) {\n // set current element as event target\n event.target = currentElement;\n current.fire(event);\n }\n prevElement = currentElement;\n }\n}\n\n// Collect a new set of possible drops and save them in activeDrops.\n// setActiveDrops should always be called when a drag has just started or a\n// drag event happens while dynamicDrop is true\nfunction setActiveDrops (interaction, dragElement) {\n // get dropzones and their elements that could receive the draggable\n const possibleDrops = collectDrops(interaction, dragElement, true);\n\n interaction.activeDrops.dropzones = possibleDrops.dropzones;\n interaction.activeDrops.elements = possibleDrops.elements;\n interaction.activeDrops.rects = [];\n\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n interaction.activeDrops.rects[i] =\n interaction.activeDrops.dropzones[i].getRect(interaction.activeDrops.elements[i]);\n }\n}\n\nfunction getDrop (dragEvent, event, dragElement) {\n const interaction = dragEvent.interaction;\n const validDrops = [];\n\n if (dynamicDrop) {\n setActiveDrops(interaction, dragElement);\n }\n\n // collect all dropzones and their elements which qualify for a drop\n for (let j = 0; j < interaction.activeDrops.dropzones.length; j++) {\n const current = interaction.activeDrops.dropzones[j];\n const currentElement = interaction.activeDrops.elements [j];\n const rect = interaction.activeDrops.rects [j];\n\n validDrops.push(current.dropCheck(dragEvent, event, interaction.target, dragElement, currentElement, rect)\n ? currentElement\n : null);\n }\n\n // get the most appropriate dropzone based on DOM depth and order\n const dropIndex = utils.indexOfDeepestElement(validDrops);\n\n return {\n dropzone: interaction.activeDrops.dropzones[dropIndex] || null,\n element : interaction.activeDrops.elements [dropIndex] || null,\n };\n}\n\nfunction getDropEvents (interaction, pointerEvent, dragEvent) {\n const dropEvents = {\n enter : null,\n leave : null,\n activate : null,\n deactivate: null,\n move : null,\n drop : null,\n };\n\n const tmpl = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n };\n\n if (interaction.dropElement !== interaction.prevDropElement) {\n // if there was a prevDropTarget, create a dragleave event\n if (interaction.prevDropTarget) {\n dropEvents.leave = utils.extend({ type: 'dragleave' }, tmpl);\n\n dragEvent.dragLeave = dropEvents.leave.target = interaction.prevDropElement;\n dragEvent.prevDropzone = dropEvents.leave.dropzone = interaction.prevDropTarget;\n }\n // if the dropTarget is not null, create a dragenter event\n if (interaction.dropTarget) {\n dropEvents.enter = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n type : 'dragenter',\n };\n\n dragEvent.dragEnter = interaction.dropElement;\n dragEvent.dropzone = interaction.dropTarget;\n }\n }\n\n if (dragEvent.type === 'dragend' && interaction.dropTarget) {\n dropEvents.drop = utils.extend({ type: 'drop' }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n dragEvent.relatedTarget = interaction.dropElement;\n }\n if (dragEvent.type === 'dragstart') {\n dropEvents.activate = utils.extend({ type: 'dropactivate' }, tmpl);\n\n dropEvents.activate.target = null;\n dropEvents.activate.dropzone = null;\n }\n if (dragEvent.type === 'dragend') {\n dropEvents.deactivate = utils.extend({ type: 'dropdeactivate' }, tmpl);\n\n dropEvents.deactivate.target = null;\n dropEvents.deactivate.dropzone = null;\n }\n if (dragEvent.type === 'dragmove' && interaction.dropTarget) {\n dropEvents.move = utils.extend({\n dragmove : dragEvent,\n type : 'dropmove',\n }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n }\n\n return dropEvents;\n}\n\nfunction fireDropEvents (interaction, dropEvents) {\n if (dropEvents.leave) { interaction.prevDropTarget.fire(dropEvents.leave); }\n if (dropEvents.move ) { interaction.dropTarget.fire(dropEvents.move ); }\n if (dropEvents.enter) { interaction.dropTarget.fire(dropEvents.enter); }\n if (dropEvents.drop ) { interaction.dropTarget.fire(dropEvents.drop ); }\n if (dropEvents.deactivate) {\n fireActiveDrops(interaction, dropEvents.deactivate);\n }\n\n interaction.prevDropTarget = interaction.dropTarget;\n interaction.prevDropElement = interaction.dropElement;\n}\n\n/*\\\n * Interactable.dropzone\n [ method ]\n *\n * Returns or sets whether elements can be dropped onto this\n * Interactable to trigger drop events\n *\n * Dropzones can receive the following events:\n * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends\n * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone\n * - `dragmove` when a draggable that has entered the dropzone is moved\n * - `drop` when a draggable is dropped into this dropzone\n *\n * Use the `accept` option to allow only elements that match the given CSS\n * selector or element. The value can be:\n *\n * - **an Element** - only that element can be dropped into this dropzone.\n * - **a string**, - the element being dragged must match it as a CSS selector.\n * - **`null`** - accept options is cleared - it accepts any element.\n *\n * Use the `overlap` option to set how drops are checked for. The allowed\n * values are:\n *\n * - `'pointer'`, the pointer must be over the dropzone (default)\n * - `'center'`, the draggable element's center must be over the dropzone\n * - a number from 0-1 which is the `(intersection area) / (draggable area)`.\n * e.g. `0.5` for drop to happen when half of the area of the draggable is\n * over the dropzone\n *\n * Use the `checker` option to specify a function to check if a dragged\n * element is over this Interactable.\n *\n | interact(target)\n | .dropChecker(function(dragEvent, // related dragmove or dragend event\n | event, // TouchEvent/PointerEvent/MouseEvent\n | dropped, // bool result of the default checker\n | dropzone, // dropzone Interactable\n | dropElement, // dropzone elemnt\n | draggable, // draggable Interactable\n | draggableElement) {// draggable element\n |\n | return dropped && event.target.hasAttribute('allow-drop');\n | }\n *\n *\n - options (boolean | object | null) #optional The new value to be set.\n | interact('.drop').dropzone({\n | accept: '.can-drop' || document.getElementById('single-drop'),\n | overlap: 'pointer' || 'center' || zeroToOne\n | }\n = (boolean | object) The current setting or this Interactable\n\\*/\nInteractable.prototype.dropzone = function (options) {\n if (utils.is.object(options)) {\n this.options.drop.enabled = options.enabled === false? false: true;\n\n if (utils.is.function(options.ondrop) ) { this.events.ondrop = options.ondrop ; }\n if (utils.is.function(options.ondropactivate) ) { this.events.ondropactivate = options.ondropactivate ; }\n if (utils.is.function(options.ondropdeactivate)) { this.events.ondropdeactivate = options.ondropdeactivate; }\n if (utils.is.function(options.ondragenter) ) { this.events.ondragenter = options.ondragenter ; }\n if (utils.is.function(options.ondragleave) ) { this.events.ondragleave = options.ondragleave ; }\n if (utils.is.function(options.ondropmove) ) { this.events.ondropmove = options.ondropmove ; }\n\n if (/^(pointer|center)$/.test(options.overlap)) {\n this.options.drop.overlap = options.overlap;\n }\n else if (utils.is.number(options.overlap)) {\n this.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0);\n }\n if ('accept' in options) {\n this.options.drop.accept = options.accept;\n }\n if ('checker' in options) {\n this.options.drop.checker = options.checker;\n }\n\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drop.enabled = options;\n\n if (!options) {\n this.ondragenter = this.ondragleave = this.ondrop\n = this.ondropactivate = this.ondropdeactivate = null;\n }\n\n return this;\n }\n\n return this.options.drop;\n};\n\nInteractable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) {\n let dropped = false;\n\n // if the dropzone has no rect (eg. display: none)\n // call the custom dropChecker or just return false\n if (!(rect = rect || this.getRect(dropElement))) {\n return (this.options.drop.checker\n ? this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement)\n : false);\n }\n\n const dropOverlap = this.options.drop.overlap;\n\n if (dropOverlap === 'pointer') {\n const origin = utils.getOriginXY(draggable, draggableElement, 'drag');\n const page = utils.getPageXY(dragEvent);\n\n page.x += origin.x;\n page.y += origin.y;\n\n const horizontal = (page.x > rect.left) && (page.x < rect.right);\n const vertical = (page.y > rect.top ) && (page.y < rect.bottom);\n\n dropped = horizontal && vertical;\n }\n\n const dragRect = draggable.getRect(draggableElement);\n\n if (dragRect && dropOverlap === 'center') {\n const cx = dragRect.left + dragRect.width / 2;\n const cy = dragRect.top + dragRect.height / 2;\n\n dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom;\n }\n\n if (dragRect && utils.is.number(dropOverlap)) {\n const overlapArea = (Math.max(0, Math.min(rect.right , dragRect.right ) - Math.max(rect.left, dragRect.left))\n * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top , dragRect.top )));\n\n const overlapRatio = overlapArea / (dragRect.width * dragRect.height);\n\n dropped = overlapRatio >= dropOverlap;\n }\n\n if (this.options.drop.checker) {\n dropped = this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement);\n }\n\n return dropped;\n};\n\nInteractable.signals.on('unset', function ({ interactable }) {\n interactable.dropzone(false);\n});\n\nInteractable.settingsMethods.push('dropChecker');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.dropTarget = null; // the dropzone a drag target might be dropped into\n interaction.dropElement = null; // the element at the time of checking\n interaction.prevDropTarget = null; // the dropzone that was recently dragged away from\n interaction.prevDropElement = null; // the element at the time of checking\n interaction.dropEvents = null; // the dropEvents related to the current drag event\n\n interaction.activeDrops = {\n dropzones: [], // the dropzones that are mentioned below\n elements : [], // elements of dropzones that accept the target draggable\n rects : [], // the rects of the elements mentioned above\n };\n\n});\n\nInteraction.signals.on('stop', function ({ interaction }) {\n interaction.dropTarget = interaction.dropElement =\n interaction.prevDropTarget = interaction.prevDropElement = null;\n});\n\n/*\\\n * interact.dynamicDrop\n [ method ]\n *\n * Returns or sets whether the dimensions of dropzone elements are\n * calculated on every dragmove or only on dragstart for the default\n * dropChecker\n *\n - newValue (boolean) #optional True to check on each move. False to check only before start\n = (boolean | interact) The current setting or interact\n\\*/\ninteract.dynamicDrop = function (newValue) {\n if (utils.is.bool(newValue)) {\n //if (dragging && dynamicDrop !== newValue && !newValue) {\n //calcRects(dropzones);\n //}\n\n dynamicDrop = newValue;\n\n return interact;\n }\n return dynamicDrop;\n};\n\nutils.merge(Interactable.eventTypes, [\n 'dragenter',\n 'dragleave',\n 'dropactivate',\n 'dropdeactivate',\n 'dropmove',\n 'drop',\n]);\nactions.methodDict.drop = 'dropzone';\n\ndefaultOptions.drop = drop.defaults;\n\nmodule.exports = drop;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst gesture = {\n defaults: {\n enabled : false,\n origin : null,\n restrict: null,\n },\n\n checker: function (pointer, event, interactable, element, interaction) {\n if (interaction.pointerIds.length >= 2) {\n return { name: 'gesture' };\n }\n\n return null;\n },\n\n getCursor: function () {\n return '';\n },\n};\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturestart') { return; }\n iEvent.ds = 0;\n\n interaction.gesture.startDistance = interaction.gesture.prevDistance = iEvent.distance;\n interaction.gesture.startAngle = interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.scale = 1;\n});\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturemove') { return; }\n\n iEvent.ds = iEvent.scale - interaction.gesture.scale;\n\n interaction.target.fire(iEvent);\n\n interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.prevDistance = iEvent.distance;\n\n if (iEvent.scale !== Infinity\n && iEvent.scale !== null\n && iEvent.scale !== undefined\n && !isNaN(iEvent.scale)) {\n\n interaction.gesture.scale = iEvent.scale;\n }\n});\n\n/*\\\n * Interactable.gesturable\n [ method ]\n *\n * Gets or sets whether multitouch gestures can be performed on the\n * Interactable's element\n *\n = (boolean) Indicates if this can be the target of gesture events\n | var isGestureable = interact(element).gesturable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on gesture events (makes the Interactable gesturable)\n = (object) this Interactable\n | interact(element).gesturable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // limit multiple gestures.\n | // See the explanation in @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n\\*/\nInteractable.prototype.gesturable = function (options) {\n if (utils.is.object(options)) {\n this.options.gesture.enabled = options.enabled === false? false: true;\n this.setPerAction('gesture', options);\n this.setOnEvents('gesture', options);\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.gesture.enabled = options;\n\n if (!options) {\n this.ongesturestart = this.ongesturestart = this.ongestureend = null;\n }\n\n return this;\n }\n\n return this.options.gesture;\n};\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action, event, starting, ending, deltaSource }) {\n if (action !== 'gesture') { return; }\n\n const pointers = interaction.pointers;\n\n iEvent.touches = [pointers[0], pointers[1]];\n\n if (starting) {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = 1;\n iEvent.ds = 0;\n iEvent.angle = utils.touchAngle(pointers, undefined, deltaSource);\n iEvent.da = 0;\n }\n else if (ending || event instanceof InteractEvent) {\n iEvent.distance = interaction.prevEvent.distance;\n iEvent.box = interaction.prevEvent.box;\n iEvent.scale = interaction.prevEvent.scale;\n iEvent.ds = iEvent.scale - 1;\n iEvent.angle = interaction.prevEvent.angle;\n iEvent.da = iEvent.angle - interaction.gesture.startAngle;\n }\n else {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = iEvent.distance / interaction.gesture.startDistance;\n iEvent.angle = utils.touchAngle(pointers, interaction.gesture.prevAngle, deltaSource);\n\n iEvent.ds = iEvent.scale - interaction.gesture.prevScale;\n iEvent.da = iEvent.angle - interaction.gesture.prevAngle;\n }\n});\n\nInteraction.signals.on('new', function (interaction) {\n interaction.gesture = {\n start: { x: 0, y: 0 },\n\n startDistance: 0, // distance between two touches of touchStart\n prevDistance : 0,\n distance : 0,\n\n scale: 1, // gesture.distance / gesture.startDistance\n\n startAngle: 0, // angle of line joining two touches\n prevAngle : 0, // angle of the previous gesture event\n };\n});\n\nactions.gesture = gesture;\nactions.names.push('gesture');\nutils.merge(Interactable.eventTypes, [\n 'gesturestart',\n 'gesturemove',\n 'gestureend',\n]);\nactions.methodDict.gesture = 'gesturable';\n\ndefaultOptions.gesture = gesture.defaults;\n\nmodule.exports = gesture;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\n// Less Precision with touch input\nconst defaultMargin = browser.supportsTouch || browser.supportsPointerEvent? 20: 10;\n\nconst resize = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n square: false,\n preserveAspectRatio: false,\n axis: 'xy',\n\n // use default margin\n margin: NaN,\n\n // object with props left, right, top, bottom which are\n // true/false values to resize when the pointer is over that edge,\n // CSS selectors to match the handles for each direction\n // or the Elements for each handle\n edges: null,\n\n // a value of 'none' will limit the resize rect to a minimum of 0x0\n // 'negate' will alow the rect to have negative width/height\n // 'reposition' will keep the width/height positive by swapping\n // the top and bottom edges and/or swapping the left and right edges\n invert: 'none',\n },\n\n checker: function (pointer, event, interactable, element, interaction, rect) {\n if (!rect) { return null; }\n\n const page = utils.extend({}, interaction.curCoords.page);\n const options = interactable.options;\n\n if (options.resize.enabled) {\n const resizeOptions = options.resize;\n const resizeEdges = { left: false, right: false, top: false, bottom: false };\n\n // if using resize.edges\n if (utils.is.object(resizeOptions.edges)) {\n for (const edge in resizeEdges) {\n resizeEdges[edge] = checkResizeEdge(edge,\n resizeOptions.edges[edge],\n page,\n interaction._eventTarget,\n element,\n rect,\n resizeOptions.margin || defaultMargin);\n }\n\n resizeEdges.left = resizeEdges.left && !resizeEdges.right;\n resizeEdges.top = resizeEdges.top && !resizeEdges.bottom;\n\n if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) {\n return {\n name: 'resize',\n edges: resizeEdges,\n };\n }\n }\n else {\n const right = options.resize.axis !== 'y' && page.x > (rect.right - defaultMargin);\n const bottom = options.resize.axis !== 'x' && page.y > (rect.bottom - defaultMargin);\n\n if (right || bottom) {\n return {\n name: 'resize',\n axes: (right? 'x' : '') + (bottom? 'y' : ''),\n };\n }\n }\n }\n\n return null;\n },\n\n cursors: (browser.isIe9OrOlder ? {\n x : 'e-resize',\n y : 's-resize',\n xy: 'se-resize',\n\n top : 'n-resize',\n left : 'w-resize',\n bottom : 's-resize',\n right : 'e-resize',\n topleft : 'se-resize',\n bottomright: 'se-resize',\n topright : 'ne-resize',\n bottomleft : 'ne-resize',\n } : {\n x : 'ew-resize',\n y : 'ns-resize',\n xy: 'nwse-resize',\n\n top : 'ns-resize',\n left : 'ew-resize',\n bottom : 'ns-resize',\n right : 'ew-resize',\n topleft : 'nwse-resize',\n bottomright: 'nwse-resize',\n topright : 'nesw-resize',\n bottomleft : 'nesw-resize',\n }),\n\n getCursor: function (action) {\n if (action.axis) {\n return resize.cursors[action.name + action.axis];\n }\n else if (action.edges) {\n let cursorKey = '';\n const edgeNames = ['top', 'bottom', 'left', 'right'];\n\n for (let i = 0; i < 4; i++) {\n if (action.edges[edgeNames[i]]) {\n cursorKey += edgeNames[i];\n }\n }\n\n return resize.cursors[cursorKey];\n }\n },\n};\n\n// resizestart\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'resizestart' || !interaction.prepared.edges) {\n return;\n }\n\n const startRect = interaction.target.getRect(interaction.element);\n const resizeOptions = interaction.target.options.resize;\n\n /*\n * When using the `resizable.square` or `resizable.preserveAspectRatio` options, resizing from one edge\n * will affect another. E.g. with `resizable.square`, resizing to make the right edge larger will make\n * the bottom edge larger by the same amount. We call these 'linked' edges. Any linked edges will depend\n * on the active edges and the edge being interacted with.\n */\n if (resizeOptions.square || resizeOptions.preserveAspectRatio) {\n const linkedEdges = utils.extend({}, interaction.prepared.edges);\n\n linkedEdges.top = linkedEdges.top || (linkedEdges.left && !linkedEdges.bottom);\n linkedEdges.left = linkedEdges.left || (linkedEdges.top && !linkedEdges.right );\n linkedEdges.bottom = linkedEdges.bottom || (linkedEdges.right && !linkedEdges.top );\n linkedEdges.right = linkedEdges.right || (linkedEdges.bottom && !linkedEdges.left );\n\n interaction.prepared._linkedEdges = linkedEdges;\n }\n else {\n interaction.prepared._linkedEdges = null;\n }\n\n // if using `resizable.preserveAspectRatio` option, record aspect ratio at the start of the resize\n if (resizeOptions.preserveAspectRatio) {\n interaction.resizeStartAspectRatio = startRect.width / startRect.height;\n }\n\n interaction.resizeRects = {\n start : startRect,\n current : utils.extend({}, startRect),\n inverted : utils.extend({}, startRect),\n previous : utils.extend({}, startRect),\n delta : {\n left: 0, right : 0, width : 0,\n top : 0, bottom: 0, height: 0,\n },\n };\n\n iEvent.rect = interaction.resizeRects.inverted;\n iEvent.deltaRect = interaction.resizeRects.delta;\n});\n\n// resizemove\nInteractEvent.signals.on('new', function ({ iEvent, phase, interaction }) {\n if (phase !== 'move' || !interaction.prepared.edges) { return; }\n\n const resizeOptions = interaction.target.options.resize;\n const invert = resizeOptions.invert;\n const invertible = invert === 'reposition' || invert === 'negate';\n\n let edges = interaction.prepared.edges;\n\n const start = interaction.resizeRects.start;\n const current = interaction.resizeRects.current;\n const inverted = interaction.resizeRects.inverted;\n const delta = interaction.resizeRects.delta;\n const previous = utils.extend(interaction.resizeRects.previous, inverted);\n const originalEdges = edges;\n\n let dx = iEvent.dx;\n let dy = iEvent.dy;\n\n if (resizeOptions.preserveAspectRatio || resizeOptions.square) {\n // `resize.preserveAspectRatio` takes precedence over `resize.square`\n const startAspectRatio = resizeOptions.preserveAspectRatio\n ? interaction.resizeStartAspectRatio\n : 1;\n\n edges = interaction.prepared._linkedEdges;\n\n if ((originalEdges.left && originalEdges.bottom)\n || (originalEdges.right && originalEdges.top)) {\n dy = -dx / startAspectRatio;\n }\n else if (originalEdges.left || originalEdges.right ) { dy = dx / startAspectRatio; }\n else if (originalEdges.top || originalEdges.bottom) { dx = dy * startAspectRatio; }\n }\n\n // update the 'current' rect without modifications\n if (edges.top ) { current.top += dy; }\n if (edges.bottom) { current.bottom += dy; }\n if (edges.left ) { current.left += dx; }\n if (edges.right ) { current.right += dx; }\n\n if (invertible) {\n // if invertible, copy the current rect\n utils.extend(inverted, current);\n\n if (invert === 'reposition') {\n // swap edge values if necessary to keep width/height positive\n let swap;\n\n if (inverted.top > inverted.bottom) {\n swap = inverted.top;\n\n inverted.top = inverted.bottom;\n inverted.bottom = swap;\n }\n if (inverted.left > inverted.right) {\n swap = inverted.left;\n\n inverted.left = inverted.right;\n inverted.right = swap;\n }\n }\n }\n else {\n // if not invertible, restrict to minimum of 0x0 rect\n inverted.top = Math.min(current.top, start.bottom);\n inverted.bottom = Math.max(current.bottom, start.top);\n inverted.left = Math.min(current.left, start.right);\n inverted.right = Math.max(current.right, start.left);\n }\n\n inverted.width = inverted.right - inverted.left;\n inverted.height = inverted.bottom - inverted.top ;\n\n for (const edge in inverted) {\n delta[edge] = inverted[edge] - previous[edge];\n }\n\n iEvent.edges = interaction.prepared.edges;\n iEvent.rect = inverted;\n iEvent.deltaRect = delta;\n});\n\n/*\\\n * Interactable.resizable\n [ method ]\n *\n * Gets or sets whether resize actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of resize elements\n | var isResizeable = interact('input[type=text]').resizable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on resize events (object makes the Interactable resizable)\n = (object) This Interactable\n | interact(element).resizable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | edges: {\n | top : true, // Use pointer coords to check for resize.\n | left : false, // Disable resizing from left edge.\n | bottom: '.resize-s',// Resize if pointer target matches selector\n | right : handleEl // Resize if pointer target is the given Element\n | },\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height are adjusted at a 1:1 ratio.\n | square: false,\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height maintain the aspect ratio they had when resizing started.\n | preserveAspectRatio: false,\n |\n | // a value of 'none' will limit the resize rect to a minimum of 0x0\n | // 'negate' will allow the rect to have negative width/height\n | // 'reposition' will keep the width/height positive by swapping\n | // the top and bottom edges and/or swapping the left and right edges\n | invert: 'none' || 'negate' || 'reposition'\n |\n | // limit multiple resizes.\n | // See the explanation in the @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n \\*/\nInteractable.prototype.resizable = function (options) {\n if (utils.is.object(options)) {\n this.options.resize.enabled = options.enabled === false? false: true;\n this.setPerAction('resize', options);\n this.setOnEvents('resize', options);\n\n if (/^x$|^y$|^xy$/.test(options.axis)) {\n this.options.resize.axis = options.axis;\n }\n else if (options.axis === null) {\n this.options.resize.axis = defaultOptions.resize.axis;\n }\n\n if (utils.is.bool(options.preserveAspectRatio)) {\n this.options.resize.preserveAspectRatio = options.preserveAspectRatio;\n }\n else if (utils.is.bool(options.square)) {\n this.options.resize.square = options.square;\n }\n\n return this;\n }\n if (utils.is.bool(options)) {\n this.options.resize.enabled = options;\n\n if (!options) {\n this.onresizestart = this.onresizestart = this.onresizeend = null;\n }\n\n return this;\n }\n return this.options.resize;\n};\n\nfunction checkResizeEdge (name, value, page, element, interactableElement, rect, margin) {\n // false, '', undefined, null\n if (!value) { return false; }\n\n // true value, use pointer coords and element rect\n if (value === true) {\n // if dimensions are negative, \"switch\" edges\n const width = utils.is.number(rect.width )? rect.width : rect.right - rect.left;\n const height = utils.is.number(rect.height)? rect.height : rect.bottom - rect.top ;\n\n if (width < 0) {\n if (name === 'left' ) { name = 'right'; }\n else if (name === 'right') { name = 'left' ; }\n }\n if (height < 0) {\n if (name === 'top' ) { name = 'bottom'; }\n else if (name === 'bottom') { name = 'top' ; }\n }\n\n if (name === 'left' ) { return page.x < ((width >= 0? rect.left: rect.right ) + margin); }\n if (name === 'top' ) { return page.y < ((height >= 0? rect.top : rect.bottom) + margin); }\n\n if (name === 'right' ) { return page.x > ((width >= 0? rect.right : rect.left) - margin); }\n if (name === 'bottom') { return page.y > ((height >= 0? rect.bottom: rect.top ) - margin); }\n }\n\n // the remaining checks require an element\n if (!utils.is.element(element)) { return false; }\n\n return utils.is.element(value)\n // the value is an element to use as a resize handle\n ? value === element\n // otherwise check if element matches value as selector\n : utils.matchesUpTo(element, value, interactableElement);\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.resizeAxes = 'xy';\n});\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action }) {\n if (action !== 'resize' || !interaction.resizeAxes) { return; }\n\n const options = interaction.target.options;\n\n if (options.resize.square) {\n if (interaction.resizeAxes === 'y') {\n iEvent.dx = iEvent.dy;\n }\n else {\n iEvent.dy = iEvent.dx;\n }\n iEvent.axes = 'xy';\n }\n else {\n iEvent.axes = interaction.resizeAxes;\n\n if (interaction.resizeAxes === 'x') {\n iEvent.dy = 0;\n }\n else if (interaction.resizeAxes === 'y') {\n iEvent.dx = 0;\n }\n }\n});\n\nactions.resize = resize;\nactions.names.push('resize');\nutils.merge(Interactable.eventTypes, [\n 'resizestart',\n 'resizemove',\n 'resizeinertiastart',\n 'resizeinertiaresume',\n 'resizeend',\n]);\nactions.methodDict.resize = 'resizable';\n\ndefaultOptions.resize = resize.defaults;\n\nmodule.exports = resize;\n","const raf = require('./utils/raf');\nconst getWindow = require('./utils/window').getWindow;\nconst is = require('./utils/is');\nconst domUtils = require('./utils/domUtils');\nconst Interaction = require('./Interaction');\nconst defaultOptions = require('./defaultOptions');\n\nconst autoScroll = {\n defaults: {\n enabled : false,\n container: null, // the item that is scrolled (Window or HTMLElement)\n margin : 60,\n speed : 300, // the scroll speed in pixels per second\n },\n\n interaction: null,\n i: null, // the handle returned by window.setInterval\n x: 0, y: 0, // Direction each pulse is to scroll in\n\n isScrolling: false,\n prevTime: 0,\n\n start: function (interaction) {\n autoScroll.isScrolling = true;\n raf.cancel(autoScroll.i);\n\n autoScroll.interaction = interaction;\n autoScroll.prevTime = new Date().getTime();\n autoScroll.i = raf.request(autoScroll.scroll);\n },\n\n stop: function () {\n autoScroll.isScrolling = false;\n raf.cancel(autoScroll.i);\n },\n\n // scroll the window by the values in scroll.x/y\n scroll: function () {\n const options = autoScroll.interaction.target.options[autoScroll.interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(autoScroll.interaction.element);\n const now = new Date().getTime();\n // change in time in seconds\n const dt = (now - autoScroll.prevTime) / 1000;\n // displacement\n const s = options.speed * dt;\n\n if (s >= 1) {\n if (is.window(container)) {\n container.scrollBy(autoScroll.x * s, autoScroll.y * s);\n }\n else if (container) {\n container.scrollLeft += autoScroll.x * s;\n container.scrollTop += autoScroll.y * s;\n }\n\n autoScroll.prevTime = now;\n }\n\n if (autoScroll.isScrolling) {\n raf.cancel(autoScroll.i);\n autoScroll.i = raf.request(autoScroll.scroll);\n }\n },\n check: function (interactable, actionName) {\n const options = interactable.options;\n\n return options[actionName].autoScroll && options[actionName].autoScroll.enabled;\n },\n onInteractionMove: function ({ interaction, pointer }) {\n if (!(interaction.interacting()\n && autoScroll.check(interaction.target, interaction.prepared.name))) {\n return;\n }\n\n if (interaction.simulation) {\n autoScroll.x = autoScroll.y = 0;\n return;\n }\n\n let top;\n let right;\n let bottom;\n let left;\n\n const options = interaction.target.options[interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(interaction.element);\n\n if (is.window(container)) {\n left = pointer.clientX < autoScroll.margin;\n top = pointer.clientY < autoScroll.margin;\n right = pointer.clientX > container.innerWidth - autoScroll.margin;\n bottom = pointer.clientY > container.innerHeight - autoScroll.margin;\n }\n else {\n const rect = domUtils.getElementClientRect(container);\n\n left = pointer.clientX < rect.left + autoScroll.margin;\n top = pointer.clientY < rect.top + autoScroll.margin;\n right = pointer.clientX > rect.right - autoScroll.margin;\n bottom = pointer.clientY > rect.bottom - autoScroll.margin;\n }\n\n autoScroll.x = (right ? 1: left? -1: 0);\n autoScroll.y = (bottom? 1: top? -1: 0);\n\n if (!autoScroll.isScrolling) {\n // set the autoScroll properties to those of the target\n autoScroll.margin = options.margin;\n autoScroll.speed = options.speed;\n\n autoScroll.start(interaction);\n }\n },\n};\n\nInteraction.signals.on('stop-active', function () {\n autoScroll.stop();\n});\n\nInteraction.signals.on('action-move', autoScroll.onInteractionMove);\n\ndefaultOptions.perAction.autoScroll = autoScroll.defaults;\n\nmodule.exports = autoScroll;\n","const Interactable = require('../Interactable');\nconst actions = require('../actions/base');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.ignoreFrom\n [ method ]\n *\n * If the target of the `mousedown`, `pointerdown` or `touchstart`\n * event or any of it's parents match the given CSS selector or\n * Element, no drag/resize/gesture is started.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to not ignore any elements\n = (string | Element | object) The current ignoreFrom value or this Interactable\n **\n | interact(element, { ignoreFrom: document.getElementById('no-action') });\n | // or\n | interact(element).ignoreFrom('input, textarea, a');\n\\*/\nInteractable.prototype.ignoreFrom = function (newValue) {\n return this._backCompatOption('ignoreFrom', newValue);\n};\n\n/*\\\n * Interactable.allowFrom\n [ method ]\n *\n * A drag/resize/gesture is started only If the target of the\n * `mousedown`, `pointerdown` or `touchstart` event or any of it's\n * parents match the given CSS selector or Element.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to allow from any element\n = (string | Element | object) The current allowFrom value or this Interactable\n **\n | interact(element, { allowFrom: document.getElementById('drag-handle') });\n | // or\n | interact(element).allowFrom('.handle');\n\\*/\nInteractable.prototype.allowFrom = function (newValue) {\n return this._backCompatOption('allowFrom', newValue);\n};\n\nInteractable.prototype.testIgnore = function (ignoreFrom, interactableElement, element) {\n if (!ignoreFrom || !is.element(element)) { return false; }\n\n if (is.string(ignoreFrom)) {\n return domUtils.matchesUpTo(element, ignoreFrom, interactableElement);\n }\n else if (is.element(ignoreFrom)) {\n return domUtils.nodeContains(ignoreFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testAllow = function (allowFrom, interactableElement, element) {\n if (!allowFrom) { return true; }\n\n if (!is.element(element)) { return false; }\n\n if (is.string(allowFrom)) {\n return domUtils.matchesUpTo(element, allowFrom, interactableElement);\n }\n else if (is.element(allowFrom)) {\n return domUtils.nodeContains(allowFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testIgnoreAllow = function (options, interactableElement, eventTarget) {\n return (!this.testIgnore(options.ignoreFrom, interactableElement, eventTarget)\n && this.testAllow(options.allowFrom, interactableElement, eventTarget));\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (event.buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\n","const interact = require('../interact');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst actions = require('../actions/base');\nconst defaultOptions = require('../defaultOptions');\nconst browser = require('../utils/browser');\nconst scope = require('../scope');\nconst utils = require('../utils');\nconst signals = require('../utils/Signals').new();\n\nrequire('./InteractableMethods');\n\nconst autoStart = {\n signals,\n withinInteractionLimit,\n // Allow this many interactions to happen simultaneously\n maxInteractions: Infinity,\n defaults: {\n perAction: {\n manualStart: false,\n max: Infinity,\n maxPerElement: 1,\n allowFrom: null,\n ignoreFrom: null,\n },\n },\n setActionDefaults: function (action) {\n utils.extend(action.defaults, autoStart.defaults.perAction);\n },\n};\n\n// set cursor style on mousedown\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget }) {\n if (interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\n// set cursor style on mousemove\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget }) {\n if (!interaction.mouse\n || interaction.pointerIsDown\n || interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\nInteraction.signals.on('move', function (arg) {\n const { interaction, event } = arg;\n\n if (!interaction.pointerIsDown\n || interaction.interacting()\n || !interaction.pointerWasMoved\n || !interaction.prepared.name) {\n return;\n }\n\n signals.fire('before-start', arg);\n\n const target = interaction.target;\n\n if (interaction.prepared.name && target) {\n // check manualStart and interaction limit\n if (target.options[interaction.prepared.name].manualStart\n || !withinInteractionLimit(target, interaction.element, interaction.prepared)) {\n interaction.stop(event);\n }\n else {\n interaction.start(interaction.prepared, target, interaction.element);\n }\n }\n});\n\n// Check if the current target supports the action.\n// If so, return the validated action. Otherwise, return null\nfunction validateAction (action, interactable, element, eventTarget) {\n if (utils.is.object(action)\n && interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget)\n && interactable.options[action.name].enabled\n && withinInteractionLimit(interactable, element, action)) {\n return action;\n }\n\n return null;\n}\n\nfunction validateSelector (interaction, pointer, event, matches, matchElements, eventTarget) {\n for (let i = 0, len = matches.length; i < len; i++) {\n const match = matches[i];\n const matchElement = matchElements[i];\n const action = validateAction(match.getAction(pointer, event, interaction, matchElement),\n match,\n matchElement,\n eventTarget);\n\n if (action) {\n return {\n action,\n target: match,\n element: matchElement,\n };\n }\n }\n\n return {};\n}\n\nfunction getActionInfo (interaction, pointer, event, eventTarget) {\n let matches = [];\n let matchElements = [];\n\n let element = eventTarget;\n let action = null;\n\n function pushMatches (interactable, selector, context) {\n const elements = (browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined);\n\n if (utils.matchesSelector(element, selector, elements)) {\n\n matches.push(interactable);\n matchElements.push(element);\n }\n }\n\n while (utils.is.element(element)) {\n matches = [];\n matchElements = [];\n\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && (action = validateAction(elementInteractable.getAction(pointer, event, interaction, element, eventTarget),\n elementInteractable,\n element,\n eventTarget))\n && !elementInteractable.options[action.name].manualStart) {\n return {\n element,\n action,\n target: elementInteractable,\n };\n }\n else {\n scope.interactables.forEachSelector(pushMatches, element);\n\n const actionInfo = validateSelector(interaction, pointer, event, matches, matchElements, eventTarget);\n\n if (actionInfo.action\n && !actionInfo.target.options[actionInfo.action.name].manualStart) {\n return actionInfo;\n }\n }\n\n element = utils.parentNode(element);\n }\n\n return {};\n}\n\nfunction prepare (interaction, { action, target, element }) {\n action = action || {};\n\n if (interaction.target && interaction.target.options.styleCursor) {\n interaction.target._doc.documentElement.style.cursor = '';\n }\n\n interaction.target = target;\n interaction.element = element;\n utils.copyAction(interaction.prepared, action);\n\n if (target && target.options.styleCursor) {\n const cursor = action? actions[action.name].getCursor(action) : '';\n interaction.target._doc.documentElement.style.cursor = cursor;\n }\n\n signals.fire('prepared', { interaction: interaction });\n}\n\nInteraction.signals.on('stop', function ({ interaction }) {\n const target = interaction.target;\n\n if (target && target.options.styleCursor) {\n target._doc.documentElement.style.cursor = '';\n }\n});\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (utils.is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (utils.is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n const buttons = event.buttons || ({\n 0: 1,\n 1: 4,\n 3: 8,\n 4: 16,\n })[event.button];\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\nfunction withinInteractionLimit (interactable, element, action) {\n const options = interactable.options;\n const maxActions = options[action.name].max;\n const maxPerElement = options[action.name].maxPerElement;\n let activeInteractions = 0;\n let targetCount = 0;\n let targetElementCount = 0;\n\n // no actions if any of these values == 0\n if (!(maxActions && maxPerElement && autoStart.maxInteractions)) { return; }\n\n for (let i = 0, len = scope.interactions.length; i < len; i++) {\n const interaction = scope.interactions[i];\n const otherAction = interaction.prepared.name;\n\n if (!interaction.interacting()) { continue; }\n\n activeInteractions++;\n\n if (activeInteractions >= autoStart.maxInteractions) {\n return false;\n }\n\n if (interaction.target !== interactable) { continue; }\n\n targetCount += (otherAction === action.name)|0;\n\n if (targetCount >= maxActions) {\n return false;\n }\n\n if (interaction.element === element) {\n targetElementCount++;\n\n if (otherAction !== action.name || targetElementCount >= maxPerElement) {\n return false;\n }\n }\n }\n\n return autoStart.maxInteractions > 0;\n}\n\n/*\\\n * interact.maxInteractions\n [ method ]\n **\n * Returns or sets the maximum number of concurrent interactions allowed.\n * By default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables\n * and elements, you need to enable it in the draggable, resizable and\n * gesturable `'max'` and `'maxPerElement'` options.\n **\n - newValue (number) #optional Any number. newValue <= 0 means no interactions.\n\\*/\ninteract.maxInteractions = function (newValue) {\n if (utils.is.number(newValue)) {\n autoStart.maxInteractions = newValue;\n\n return this;\n }\n\n return autoStart.maxInteractions;\n};\n\nInteractable.settingsMethods.push('styleCursor');\nInteractable.settingsMethods.push('actionChecker');\nInteractable.settingsMethods.push('ignoreFrom');\nInteractable.settingsMethods.push('allowFrom');\n\ndefaultOptions.base.actionChecker = null;\ndefaultOptions.base.styleCursor = true;\n\nutils.extend(defaultOptions.perAction, autoStart.defaults.perAction);\n\nmodule.exports = autoStart;\n","const autoStart = require('./base');\nconst Interaction = require('../Interaction');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.delayTimer = null;\n});\n\nautoStart.signals.on('prepared', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.delayTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.target, interaction.element);\n }, delay);\n }\n});\n\nInteraction.signals.on('move', function ({ interaction, duplicate }) {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.delayTimer);\n }\n});\n\n// prevent regular down->move autoStart\nautoStart.signals.on('before-start', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.prepared.name = null;\n }\n});\n","const autoStart = require('./base');\nconst scope = require('../scope');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\n\nconst { matchesSelector, parentNode } = require('../utils/domUtils');\n\nautoStart.setActionDefaults(require('../actions/drag'));\n\nautoStart.signals.on('before-start', function ({ interaction, eventTarget, dx, dy }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // check if a drag is in the correct axis\n const absX = Math.abs(dx);\n const absY = Math.abs(dy);\n const options = interaction.target.options.drag;\n const startAxis = options.startAxis;\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy');\n\n interaction.prepared.axis = options.lockAxis === 'start'\n ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n : options.lockAxis;\n\n // if the movement isn't in the startAxis of the interactable\n if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) {\n // cancel the prepared action\n interaction.prepared.name = null;\n\n // then try to get a drag from another ineractable\n\n if (!interaction.prepared.name) {\n\n let element = eventTarget;\n\n const getDraggable = function (interactable, selector, context) {\n const elements = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n if (interactable === interaction.target) { return; }\n\n if (!options.manualStart\n && !interactable.testIgnoreAllow(options, element, eventTarget)\n && matchesSelector(element, selector, elements)) {\n\n const action = interactable.getAction(interaction.downPointer,\n interaction.downEvent,\n interaction,\n element);\n\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, interactable)\n && autoStart.validateAction(action, interactable, element, eventTarget)) {\n\n return interactable;\n }\n }\n };\n\n let action = null;\n\n // check all interactables\n while (is.element(element)) {\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && elementInteractable !== interaction.target\n && !elementInteractable.options.drag.manualStart) {\n\n action = elementInteractable.getAction(interaction.downPointer, interaction.downEvent, interaction, element);\n }\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, elementInteractable)) {\n\n interaction.prepared.name = 'drag';\n interaction.target = elementInteractable;\n interaction.element = element;\n break;\n }\n\n const selectorInteractable = scope.interactables.forEachSelector(getDraggable, element);\n\n if (selectorInteractable) {\n interaction.prepared.name = 'drag';\n interaction.target = selectorInteractable;\n interaction.element = element;\n break;\n }\n\n element = parentNode(element);\n }\n }\n }\n});\n\nfunction checkStartAxis (startAxis, interactable) {\n if (!interactable) { return false; }\n\n const thisAxis = interactable.options.drag.startAxis;\n\n return (startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis);\n}\n","require('./base').setActionDefaults(require('../actions/gesture'));\n","require('./base').setActionDefaults(require('../actions/resize'));\n","module.exports = {\n base: {\n accept : null,\n preventDefault: 'auto',\n deltaSource : 'page',\n },\n\n perAction: {\n origin: { x: 0, y: 0 },\n\n // only allow left button by default\n // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n mouseButtons: 1,\n\n inertia: {\n enabled : false,\n resistance : 10, // the lambda in exponential decay\n minSpeed : 100, // target speed must be above this for inertia to start\n endSpeed : 10, // the speed at which inertia is slow enough to stop\n allowResume : true, // allow resuming an action in inertia phase\n smoothEndDuration: 300, // animate to snap/restrict endOnly if there's no inertia\n },\n },\n};\n","/* browser entry point */\n\n// Legacy browser support\nrequire('./legacyBrowsers');\n\n// inertia\nrequire('./inertia');\n\n// modifiers\nrequire('./modifiers/snap');\nrequire('./modifiers/restrict');\n\n// pointerEvents\nrequire('./pointerEvents/base');\nrequire('./pointerEvents/holdRepeat');\nrequire('./pointerEvents/interactableTargets');\n\n// delay\nrequire('./autoStart/delay');\n\n// actions\nrequire('./actions/gesture');\nrequire('./actions/resize');\nrequire('./actions/drag');\nrequire('./actions/drop');\n\n// load these modifiers after resize is loaded\nrequire('./modifiers/snapSize');\nrequire('./modifiers/restrictEdges');\nrequire('./modifiers/restrictSize');\n\n// autoStart actions\nrequire('./autoStart/gesture');\nrequire('./autoStart/resize');\nrequire('./autoStart/drag');\n\n// Interactable preventDefault setting\nrequire('./interactablePreventDefault.js');\n\n// autoScroll\nrequire('./autoScroll');\n\n// export interact\nmodule.exports = require('./interact');\n","const InteractEvent = require('./InteractEvent');\nconst Interaction = require('./Interaction');\nconst modifiers = require('./modifiers');\nconst utils = require('./utils');\nconst animationFrame = require('./utils/raf');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.inertiaStatus = {\n active : false,\n smoothEnd : false,\n allowResume: false,\n\n startEvent: null,\n upCoords : {},\n\n xe: 0, ye: 0,\n sx: 0, sy: 0,\n\n t0: 0,\n vx0: 0, vys: 0,\n duration: 0,\n\n lambda_v0: 0,\n one_ve_v0: 0,\n i : null,\n };\n\n interaction.boundInertiaFrame = () => inertiaFrame .apply(interaction);\n interaction.boundSmoothEndFrame = () => smoothEndFrame.apply(interaction);\n});\n\nInteraction.signals.on('down', function ({ interaction, event, pointer, eventTarget }) {\n const status = interaction.inertiaStatus;\n\n // Check if the down event hits the current inertia target\n if (status.active) {\n let element = eventTarget;\n\n // climb up the DOM tree from the event target\n while (utils.is.element(element)) {\n\n // if interaction element is the current inertia target element\n if (element === interaction.element) {\n // stop inertia\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n\n // update pointers to the down event's coordinates\n interaction.updatePointer(pointer);\n utils.setCoords(interaction.curCoords, interaction.pointers);\n\n // fire appropriate signals\n const signalArg = { interaction };\n Interaction.signals.fire('before-action-move', signalArg);\n Interaction.signals.fire('action-resume' , signalArg);\n\n // fire a reume event\n const resumeEvent = new InteractEvent(interaction,\n event,\n interaction.prepared.name,\n 'inertiaresume',\n interaction.element);\n\n interaction.target.fire(resumeEvent);\n interaction.prevEvent = resumeEvent;\n modifiers.resetStatuses(interaction.modifierStatuses);\n\n utils.copyCoords(interaction.prevCoords, interaction.curCoords);\n break;\n }\n\n element = utils.parentNode(element);\n }\n }\n});\n\nInteraction.signals.on('up', function ({ interaction, event }) {\n const status = interaction.inertiaStatus;\n\n if (!interaction.interacting() || status.active) { return; }\n\n const target = interaction.target;\n const options = target && target.options;\n const inertiaOptions = options && interaction.prepared.name && options[interaction.prepared.name].inertia;\n\n const now = new Date().getTime();\n const statuses = {};\n const page = utils.extend({}, interaction.curCoords.page);\n const pointerSpeed = interaction.pointerDelta.client.speed;\n\n let smoothEnd = false;\n let modifierResult;\n\n // check if inertia should be started\n const inertiaPossible = (inertiaOptions && inertiaOptions.enabled\n && interaction.prepared.name !== 'gesture'\n && event !== status.startEvent);\n\n const inertia = (inertiaPossible\n && (now - interaction.curCoords.timeStamp) < 50\n && pointerSpeed > inertiaOptions.minSpeed\n && pointerSpeed > inertiaOptions.endSpeed);\n\n const modifierArg = {\n interaction,\n pageCoords: page,\n statuses,\n preEnd: true,\n requireEndOnly: true,\n };\n\n // smoothEnd\n if (inertiaPossible && !inertia) {\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n if (modifierResult.shouldMove && modifierResult.locked) {\n smoothEnd = true;\n }\n }\n\n if (!(inertia || smoothEnd)) { return; }\n\n utils.copyCoords(status.upCoords, interaction.curCoords);\n\n interaction.pointers[0] = status.startEvent =\n new InteractEvent(interaction, event, interaction.prepared.name, 'inertiastart', interaction.element);\n\n status.t0 = now;\n\n status.active = true;\n status.allowResume = inertiaOptions.allowResume;\n interaction.simulation = status;\n\n target.fire(status.startEvent);\n\n if (inertia) {\n status.vx0 = interaction.pointerDelta.client.vx;\n status.vy0 = interaction.pointerDelta.client.vy;\n status.v0 = pointerSpeed;\n\n calcInertia(interaction, status);\n\n utils.extend(page, interaction.curCoords.page);\n\n page.x += status.xe;\n page.y += status.ye;\n\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n status.modifiedXe += modifierResult.dx;\n status.modifiedYe += modifierResult.dy;\n\n status.i = animationFrame.request(interaction.boundInertiaFrame);\n }\n else {\n status.smoothEnd = true;\n status.xe = modifierResult.dx;\n status.ye = modifierResult.dy;\n\n status.sx = status.sy = 0;\n\n status.i = animationFrame.request(interaction.boundSmoothEndFrame);\n }\n});\n\nInteraction.signals.on('stop-active', function ({ interaction }) {\n const status = interaction.inertiaStatus;\n\n if (status.active) {\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n }\n});\n\nfunction calcInertia (interaction, status) {\n const inertiaOptions = interaction.target.options[interaction.prepared.name].inertia;\n const lambda = inertiaOptions.resistance;\n const inertiaDur = -Math.log(inertiaOptions.endSpeed / status.v0) / lambda;\n\n status.x0 = interaction.prevEvent.pageX;\n status.y0 = interaction.prevEvent.pageY;\n status.t0 = status.startEvent.timeStamp / 1000;\n status.sx = status.sy = 0;\n\n status.modifiedXe = status.xe = (status.vx0 - inertiaDur) / lambda;\n status.modifiedYe = status.ye = (status.vy0 - inertiaDur) / lambda;\n status.te = inertiaDur;\n\n status.lambda_v0 = lambda / status.v0;\n status.one_ve_v0 = 1 - inertiaOptions.endSpeed / status.v0;\n}\n\nfunction inertiaFrame () {\n updateInertiaCoords(this);\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n\n const status = this.inertiaStatus;\n const options = this.target.options[this.prepared.name].inertia;\n const lambda = options.resistance;\n const t = new Date().getTime() / 1000 - status.t0;\n\n if (t < status.te) {\n\n const progress = 1 - (Math.exp(-lambda * t) - status.lambda_v0) / status.one_ve_v0;\n\n if (status.modifiedXe === status.xe && status.modifiedYe === status.ye) {\n status.sx = status.xe * progress;\n status.sy = status.ye * progress;\n }\n else {\n const quadPoint = utils.getQuadraticCurvePoint(0, 0,\n status.xe,\n status.ye,\n status.modifiedXe,\n status.modifiedYe,\n progress);\n\n status.sx = quadPoint.x;\n status.sy = quadPoint.y;\n }\n\n this.doMove();\n\n status.i = animationFrame.request(this.boundInertiaFrame);\n }\n else {\n status.sx = status.modifiedXe;\n status.sy = status.modifiedYe;\n\n this.doMove();\n this.end(status.startEvent);\n status.active = false;\n this.simulation = null;\n }\n\n utils.copyCoords(this.prevCoords, this.curCoords);\n}\n\nfunction smoothEndFrame () {\n updateInertiaCoords(this);\n\n const status = this.inertiaStatus;\n const t = new Date().getTime() - status.t0;\n const duration = this.target.options[this.prepared.name].inertia.smoothEndDuration;\n\n if (t < duration) {\n status.sx = utils.easeOutQuad(t, 0, status.xe, duration);\n status.sy = utils.easeOutQuad(t, 0, status.ye, duration);\n\n this.pointerMove(status.startEvent, status.startEvent);\n\n status.i = animationFrame.request(this.boundSmoothEndFrame);\n }\n else {\n status.sx = status.xe;\n status.sy = status.ye;\n\n this.pointerMove(status.startEvent, status.startEvent);\n this.end(status.startEvent);\n\n status.smoothEnd =\n status.active = false;\n this.simulation = null;\n }\n}\n\nfunction updateInertiaCoords (interaction) {\n const status = interaction.inertiaStatus;\n\n // return if inertia isn't running\n if (!status.active) { return; }\n\n const pageUp = status.upCoords.page;\n const clientUp = status.upCoords.client;\n\n utils.setCoords(interaction.curCoords, [ {\n pageX : pageUp.x + status.sx,\n pageY : pageUp.y + status.sy,\n clientX: clientUp.x + status.sx,\n clientY: clientUp.y + status.sy,\n } ]);\n}\n","const browser = require('./utils/browser');\nconst events = require('./utils/events');\nconst utils = require('./utils');\nconst scope = require('./scope');\nconst Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\n\nconst globalEvents = {};\n\n/*\\\n * interact\n [ method ]\n *\n * The methods of this variable can be used to set elements as\n * interactables and also to change various default settings.\n *\n * Calling it as a function and passing an element or a valid CSS selector\n * string returns an Interactable object which has various methods to\n * configure it.\n *\n - element (Element | string) The HTML or SVG Element to interact with or CSS selector\n = (object) An @Interactable\n *\n > Usage\n | interact('#draggable').draggable(true);\n |\n | var rectables = interact('rect');\n | rectables\n | .gesturable(true)\n | .on('gesturemove', function (event) {\n | // ...\n | });\n\\*/\nfunction interact (element, options) {\n let interactable = scope.interactables.get(element, options);\n\n if (!interactable) {\n interactable = new Interactable(element, options);\n interactable.events.global = globalEvents;\n }\n\n return interactable;\n}\n\n/*\\\n * interact.isSet\n [ method ]\n *\n * Check if an element has been set\n - element (Element) The Element being searched for\n = (boolean) Indicates if the element or CSS selector was previously passed to interact\n\\*/\ninteract.isSet = function (element, options) {\n return scope.interactables.indexOfElement(element, options && options.context) !== -1;\n};\n\n/*\\\n * interact.on\n [ method ]\n *\n * Adds a global listener for an InteractEvent or adds a DOM event to\n * `document`\n *\n - type (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) interact\n\\*/\ninteract.on = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.on(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.on(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n // if it is an InteractEvent type, add listener to globalEvents\n if (utils.contains(Interactable.eventTypes, type)) {\n // if this type of event was never bound\n if (!globalEvents[type]) {\n globalEvents[type] = [listener];\n }\n else {\n globalEvents[type].push(listener);\n }\n }\n // If non InteractEvent type, addEventListener to document\n else {\n events.add(scope.document, type, listener, { options });\n }\n\n return interact;\n};\n\n/*\\\n * interact.off\n [ method ]\n *\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n - type (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) interact\n \\*/\ninteract.off = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.off(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.off(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n if (!utils.contains(Interactable.eventTypes, type)) {\n events.remove(scope.document, type, listener, options);\n }\n else {\n let index;\n\n if (type in globalEvents\n && (index = utils.indexOf(globalEvents[type], listener)) !== -1) {\n globalEvents[type].splice(index, 1);\n }\n }\n\n return interact;\n};\n\n/*\\\n * interact.debug\n [ method ]\n *\n * Returns an object which exposes internal data\n = (object) An object with properties that outline the current state and expose internal functions and variables\n\\*/\ninteract.debug = function () {\n return scope;\n};\n\n// expose the functions used to calculate multi-touch properties\ninteract.getPointerAverage = utils.pointerAverage;\ninteract.getTouchBBox = utils.touchBBox;\ninteract.getTouchDistance = utils.touchDistance;\ninteract.getTouchAngle = utils.touchAngle;\n\ninteract.getElementRect = utils.getElementRect;\ninteract.getElementClientRect = utils.getElementClientRect;\ninteract.matchesSelector = utils.matchesSelector;\ninteract.closest = utils.closest;\n\n/*\\\n * interact.supportsTouch\n [ method ]\n *\n = (boolean) Whether or not the browser supports touch input\n\\*/\ninteract.supportsTouch = function () {\n return browser.supportsTouch;\n};\n\n/*\\\n * interact.supportsPointerEvent\n [ method ]\n *\n = (boolean) Whether or not the browser supports PointerEvents\n\\*/\ninteract.supportsPointerEvent = function () {\n return browser.supportsPointerEvent;\n};\n\n/*\\\n * interact.stop\n [ method ]\n *\n * Cancels all interactions (end events are not fired)\n *\n - event (Event) An event on which to call preventDefault()\n = (object) interact\n\\*/\ninteract.stop = function (event) {\n for (let i = scope.interactions.length - 1; i >= 0; i--) {\n scope.interactions[i].stop(event);\n }\n\n return interact;\n};\n\n/*\\\n * interact.pointerMoveTolerance\n [ method ]\n * Returns or sets the distance the pointer must be moved before an action\n * sequence occurs. This also affects tolerance for tap events.\n *\n - newValue (number) #optional The movement from the start position must be greater than this value\n = (number | Interactable) The current setting or interact\n\\*/\ninteract.pointerMoveTolerance = function (newValue) {\n if (utils.is.number(newValue)) {\n Interaction.pointerMoveTolerance = newValue;\n\n return this;\n }\n\n return Interaction.pointerMoveTolerance;\n};\n\ninteract.addDocument = scope.addDocument;\ninteract.removeDocument = scope.removeDocument;\n\nscope.interact = interact;\n\nmodule.exports = interact;\n","const Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\nconst scope = require('./scope');\nconst is = require('./utils/is');\nconst events = require('./utils/events');\n\nconst { nodeContains, matchesSelector } = require('./utils/domUtils');\n\n/*\\\n * Interactable.preventDefault\n [ method ]\n *\n * Returns or sets whether to prevent the browser's default behaviour\n * in response to pointer events. Can be set to:\n * - `'always'` to always prevent\n * - `'never'` to never prevent\n * - `'auto'` to let interact.js try to determine what would be best\n *\n - newValue (string) #optional `true`, `false` or `'auto'`\n = (string | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.preventDefault = function (newValue) {\n if (/^(always|never|auto)$/.test(newValue)) {\n this.options.preventDefault = newValue;\n return this;\n }\n\n if (is.bool(newValue)) {\n this.options.preventDefault = newValue? 'always' : 'never';\n return this;\n }\n\n return this.options.preventDefault;\n};\n\nInteractable.prototype.checkAndPreventDefault = function (event) {\n const setting = this.options.preventDefault;\n\n if (setting === 'never') { return; }\n\n if (setting === 'always') {\n event.preventDefault();\n return;\n }\n\n // setting === 'auto'\n\n // don't preventDefault if the browser supports passiveEvents\n // CSS touch-action and user-selecct should be used instead\n if (events.supportsOptions) {\n return;\n }\n\n // don't preventDefault of pointerdown events\n if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) {\n return;\n }\n\n // don't preventDefault on editable elements\n if (is.element(event.target)\n && matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) {\n return;\n }\n\n event.preventDefault();\n};\n\nfunction onInteractionEvent ({ interaction, event }) {\n if (interaction.target) {\n interaction.target.checkAndPreventDefault(event);\n }\n}\n\nfor (const eventSignal of ['down', 'move', 'up', 'cancel']) {\n Interaction.signals.on(eventSignal, onInteractionEvent);\n}\n\n// prevent native HTML5 drag on interact.js target elements\nInteraction.docEvents.dragstart = function preventNativeDrag (event) {\n for (const interaction of scope.interactions) {\n\n if (interaction.element\n && (interaction.element === event.target\n || nodeContains(interaction.element, event.target))) {\n\n interaction.target.checkAndPreventDefault(event);\n return;\n }\n }\n};\n","const scope = require('./scope');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst iFinder = require('./utils/interactionFinder');\nconst pointerEvents = require('./pointerEvents/base');\n\nconst { window } = require('./utils/window');\n\nconst toString = Object.prototype.toString;\n\nif (!window.Array.isArray) {\n window.Array.isArray = function (obj) {\n return toString.call(obj) === '[object Array]';\n };\n}\n\nif (!String.prototype.trim) {\n String.prototype.trim = function () {\n return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n };\n}\n\n// http://www.quirksmode.org/dom/events/click.html\n// >Events leading to dblclick\n//\n// IE8 doesn't fire down event before dblclick.\n// This workaround tries to fire a tap and doubletap after dblclick\nfunction onIE8Dblclick (event) {\n const eventTarget = event.target;\n const interaction = iFinder.search(event, event.type, eventTarget);\n\n if (!interaction) { return; }\n\n if (interaction.prevTap\n && event.clientX === interaction.prevTap.clientX\n && event.clientY === interaction.prevTap.clientY\n && eventTarget === interaction.prevTap.target) {\n\n interaction.downTargets[0] = eventTarget;\n interaction.downTimes [0] = new Date().getTime();\n\n pointerEvents.fire({\n interaction,\n event,\n eventTarget,\n pointer: event,\n type: 'tap',\n });\n }\n}\n\nif (browser.isIE8) {\n const selectFix = function (event) {\n for (const interaction of scope.interactions) {\n if (interaction.interacting()) {\n interaction.target.checkAndPreventDefault(event);\n }\n }\n };\n\n const onDocIE8 = function onDocIE8 ({ doc, win }, signalName) {\n const eventMethod = signalName.indexOf('listen') === 0\n ? events.add : events.remove;\n\n // For IE's lack of Event#preventDefault\n eventMethod(doc, 'selectstart', selectFix);\n\n if (pointerEvents) {\n eventMethod(doc, 'dblclick', onIE8Dblclick);\n }\n };\n\n scope.signals.on('add-document' , onDocIE8);\n scope.signals.on('remove-document', onDocIE8);\n}\n\nmodule.exports = null;\n","const InteractEvent = require('../InteractEvent');\nconst Interaction = require('../Interaction');\nconst extend = require('../utils/extend');\n\nconst modifiers = {\n names: [],\n\n setOffsets: function (arg) {\n const { interaction, pageCoords: page } = arg;\n const { target, element, startOffset } = interaction;\n const rect = target.getRect(element);\n\n if (rect) {\n startOffset.left = page.x - rect.left;\n startOffset.top = page.y - rect.top;\n\n startOffset.right = rect.right - page.x;\n startOffset.bottom = rect.bottom - page.y;\n\n if (!('width' in rect)) { rect.width = rect.right - rect.left; }\n if (!('height' in rect)) { rect.height = rect.bottom - rect.top ; }\n }\n else {\n startOffset.left = startOffset.top = startOffset.right = startOffset.bottom = 0;\n }\n\n arg.rect = rect;\n arg.interactable = target;\n arg.element = element;\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n\n arg.options = target.options[interaction.prepared.name][modifierName];\n\n if (!arg.options) {\n continue;\n }\n\n interaction.modifierOffsets[modifierName] = modifiers[modifierName].setOffset(arg);\n }\n },\n\n setAll: function (arg) {\n const { interaction, statuses, preEnd, requireEndOnly } = arg;\n const coords = extend({}, arg.pageCoords);\n const result = {\n dx: 0,\n dy: 0,\n changed: false,\n locked: false,\n shouldMove: true,\n };\n\n for (const modifierName of modifiers.names) {\n const modifier = modifiers[modifierName];\n const options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!shouldDo(options, preEnd, requireEndOnly)) { continue; }\n\n arg.status = arg.status = statuses[modifierName];\n arg.options = options;\n arg.offset = arg.interaction.modifierOffsets[modifierName];\n\n modifier.set(arg);\n\n if (arg.status.locked) {\n coords.x += arg.status.dx;\n coords.y += arg.status.dy;\n\n result.dx += arg.status.dx;\n result.dy += arg.status.dy;\n\n result.locked = true;\n }\n }\n\n // a move should be fired if:\n // - there are no modifiers enabled,\n // - no modifiers are \"locked\" i.e. have changed the pointer's coordinates, or\n // - the locked coords have changed since the last pointer move\n result.shouldMove = !arg.status || !result.locked || arg.status.changed;\n\n return result;\n },\n\n resetStatuses: function (statuses) {\n for (const modifierName of modifiers.names) {\n const status = statuses[modifierName] || {};\n\n status.dx = status.dy = 0;\n status.modifiedX = status.modifiedY = NaN;\n status.locked = false;\n status.changed = true;\n\n statuses[modifierName] = status;\n }\n\n return statuses;\n },\n\n start: function ({ interaction }, signalName) {\n const arg = {\n interaction,\n pageCoords: (signalName === 'action-resume' ?\n interaction.curCoords : interaction.startCoords).page,\n startOffset: interaction.startOffset,\n statuses: interaction.modifierStatuses,\n preEnd: false,\n requireEndOnly: false,\n };\n\n modifiers.setOffsets(arg);\n modifiers.resetStatuses(arg.statuses);\n\n arg.pageCoords = extend({}, interaction.startCoords.page);\n interaction.modifierResult = modifiers.setAll(arg);\n },\n};\n\nInteraction.signals.on('new', function (interaction) {\n interaction.startOffset = { left: 0, right: 0, top: 0, bottom: 0 };\n interaction.modifierOffsets = {};\n interaction.modifierStatuses = modifiers.resetStatuses({});\n interaction.modifierResult = null;\n});\n\nInteraction.signals.on('action-start' , modifiers.start);\nInteraction.signals.on('action-resume', modifiers.start);\n\nInteraction.signals.on('before-action-move', function ({ interaction, preEnd, interactingBeforeMove }) {\n const modifierResult = modifiers.setAll({\n interaction,\n preEnd,\n pageCoords: interaction.curCoords.page,\n statuses: interaction.modifierStatuses,\n requireEndOnly: false,\n });\n\n // don't fire an action move if a modifier would keep the event in the same\n // cordinates as before\n if (!modifierResult.shouldMove && interactingBeforeMove) {\n interaction._dontFireMove = true;\n }\n\n interaction.modifierResult = modifierResult;\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n for (let i = 0; i < modifiers.names.length; i++) {\n const options = interaction.target.options[interaction.prepared.name][modifiers.names[i]];\n\n // if the endOnly option is true for any modifier\n if (shouldDo(options, true, true)) {\n // fire a move event at the modified coordinates\n interaction.doMove({ event, preEnd: true });\n break;\n }\n }\n});\n\nInteractEvent.signals.on('set-xy', function (arg) {\n const { iEvent, interaction } = arg;\n const modifierArg = extend({}, arg);\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n modifierArg.options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!modifierArg.options) {\n continue;\n }\n\n const modifier = modifiers[modifierName];\n\n modifierArg.status = interaction.modifierStatuses[modifierName];\n\n iEvent[modifierName] = modifier.modifyCoords(modifierArg);\n }\n});\n\nfunction shouldDo (options, preEnd, requireEndOnly) {\n return (options && options.enabled\n && (preEnd || !options.endOnly)\n && (!requireEndOnly || options.endOnly));\n}\n\nmodule.exports = modifiers;\n","const modifiers = require('./index');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst restrict = {\n defaults: {\n enabled : false,\n endOnly : false,\n restriction: null,\n elementRect: null,\n },\n\n setOffset: function ({ rect, startOffset, options }) {\n const elementRect = options && options.elementRect;\n const offset = {};\n\n if (rect && elementRect) {\n offset.left = startOffset.left - (rect.width * elementRect.left);\n offset.top = startOffset.top - (rect.height * elementRect.top);\n\n offset.right = startOffset.right - (rect.width * (1 - elementRect.right));\n offset.bottom = startOffset.bottom - (rect.height * (1 - elementRect.bottom));\n }\n else {\n offset.left = offset.top = offset.right = offset.bottom = 0;\n }\n\n return offset;\n },\n\n set: function ({ pageCoords, interaction, status, options }) {\n if (!options) { return status; }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n\n const restriction = getRestrictionRect(options.restriction, interaction, page);\n\n if (!restriction) { return status; }\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n const rect = restriction;\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n const offset = interaction.modifierOffsets.restrict;\n\n // object is assumed to have\n // x, y, width, height or\n // left, top, right, bottom\n if ('x' in restriction && 'y' in restriction) {\n modifiedX = Math.max(Math.min(rect.x + rect.width - offset.right , page.x), rect.x + offset.left);\n modifiedY = Math.max(Math.min(rect.y + rect.height - offset.bottom, page.y), rect.y + offset.top );\n }\n else {\n modifiedX = Math.max(Math.min(rect.right - offset.right , page.x), rect.left + offset.left);\n modifiedY = Math.max(Math.min(rect.bottom - offset.bottom, page.y), rect.top + offset.top );\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const elementRect = options && options.elementRect;\n\n if (options && options.enabled\n && !(phase === 'start' && elementRect && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n getRestrictionRect,\n};\n\nfunction getRestrictionRect (value, interaction, page) {\n if (utils.is.function(value)) {\n return utils.resolveRectLike(value, interaction.target, interaction.element, [page.x, page.y, interaction]);\n } else {\n return utils.resolveRectLike(value, interaction.target, interaction.element);\n }\n}\n\nmodifiers.restrict = restrict;\nmodifiers.names.push('restrict');\n\ndefaultOptions.perAction.restrict = restrict.defaults;\n\nmodule.exports = restrict;\n","// This module adds the options.resize.restrictEdges setting which sets min and\n// max for the top, left, bottom and right edges of the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictEdges: {\n// inner: { top: 200, left: 200, right: 400, bottom: 400 },\n// outer: { top: 0, left: 0, right: 600, bottom: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst { getRestrictionRect } = require('./restrict');\n\nconst noInner = { top: +Infinity, left: +Infinity, bottom: -Infinity, right: -Infinity };\nconst noOuter = { top: -Infinity, left: -Infinity, bottom: +Infinity, right: +Infinity };\n\nconst restrictEdges = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n offset: null,\n },\n\n setOffset: function ({ interaction, startOffset, options }) {\n if (!options) {\n return utils.extend({}, startOffset);\n }\n\n const offset = getRestrictionRect(options.offset, interaction, interaction.startCoords.page);\n\n if (offset) {\n return {\n top: startOffset.top + offset.y,\n left: startOffset.left + offset.x,\n bottom: startOffset.bottom + offset.y,\n right: startOffset.right + offset.x,\n };\n }\n\n return startOffset;\n },\n\n set: function ({ pageCoords, interaction, status, offset, options }) {\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n const inner = rectUtils.xywhToTlbr(getRestrictionRect(options.inner, interaction, page)) || noInner;\n const outer = rectUtils.xywhToTlbr(getRestrictionRect(options.outer, interaction, page)) || noOuter;\n\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n if (edges.top) {\n modifiedY = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top);\n }\n else if (edges.bottom) {\n modifiedY = Math.max(Math.min(outer.bottom - offset.bottom, page.y), inner.bottom - offset.bottom);\n }\n if (edges.left) {\n modifiedX = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left);\n }\n else if (edges.right) {\n modifiedX = Math.max(Math.min(outer.right - offset.right, page.x), inner.right - offset.right);\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n if (options && options.enabled\n && !(phase === 'start' && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n noInner,\n noOuter,\n getRestrictionRect,\n};\n\nmodifiers.restrictEdges = restrictEdges;\nmodifiers.names.push('restrictEdges');\n\ndefaultOptions.perAction.restrictEdges = restrictEdges.defaults;\nresize.defaults.restrictEdges = restrictEdges.defaults;\n\nmodule.exports = restrictEdges;\n","// This module adds the options.resize.restrictSize setting which sets min and\n// max width and height for the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictSize: {\n// min: { width: -600, height: -600 },\n// max: { width: 600, height: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst restrictEdges = require('./restrictEdges');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst noMin = { width: -Infinity, height: -Infinity };\nconst noMax = { width: +Infinity, height: +Infinity };\n\nconst restrictSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n },\n\n setOffset: function ({ interaction }) {\n return interaction.startOffset;\n },\n\n set: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const rect = rectUtils.xywhToTlbr(interaction.resizeRects.inverted);\n\n const minSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.min, interaction)) || noMin;\n const maxSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.max, interaction)) || noMax;\n\n arg.options = {\n enabled: options.enabled,\n endOnly: options.endOnly,\n inner: utils.extend({}, restrictEdges.noInner),\n outer: utils.extend({}, restrictEdges.noOuter),\n };\n\n if (edges.top) {\n arg.options.inner.top = rect.bottom - minSize.height;\n arg.options.outer.top = rect.bottom - maxSize.height;\n }\n else if (edges.bottom) {\n arg.options.inner.bottom = rect.top + minSize.height;\n arg.options.outer.bottom = rect.top + maxSize.height;\n }\n if (edges.left) {\n arg.options.inner.left = rect.right - minSize.width;\n arg.options.outer.left = rect.right - maxSize.width;\n }\n else if (edges.right) {\n arg.options.inner.right = rect.left + minSize.width;\n arg.options.outer.right = rect.left + maxSize.width;\n }\n\n restrictEdges.set(arg);\n },\n\n modifyCoords: restrictEdges.modifyCoords,\n};\n\nmodifiers.restrictSize = restrictSize;\nmodifiers.names.push('restrictSize');\n\ndefaultOptions.perAction.restrictSize = restrictSize.defaults;\nresize.defaults.restrictSize = restrictSize.defaults;\n\nmodule.exports = restrictSize;\n","const modifiers = require('./index');\nconst interact = require('../interact');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst snap = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n\n relativePoints: null,\n },\n\n setOffset: function ({ interaction, interactable, element, rect, startOffset, options }) {\n const offsets = [];\n const optionsOrigin = utils.rectToXY(utils.resolveRectLike(options.origin));\n const origin = optionsOrigin || utils.getOriginXY(interactable, element, interaction.prepared.name);\n options = options || interactable.options[interaction.prepared.name].snap || {};\n\n let snapOffset;\n\n if (options.offset === 'startCoords') {\n snapOffset = {\n x: interaction.startCoords.page.x - origin.x,\n y: interaction.startCoords.page.y - origin.y,\n };\n }\n else {\n const offsetRect = utils.resolveRectLike(options.offset, interactable, element, [interaction]);\n\n snapOffset = utils.rectToXY(offsetRect) || { x: 0, y: 0 };\n }\n\n if (rect && options.relativePoints && options.relativePoints.length) {\n for (const { x: relativeX, y: relativeY } of options.relativePoints) {\n offsets.push({\n x: startOffset.left - (rect.width * relativeX) + snapOffset.x,\n y: startOffset.top - (rect.height * relativeY) + snapOffset.y,\n });\n }\n }\n else {\n offsets.push(snapOffset);\n }\n\n return offsets;\n },\n\n set: function ({ interaction, pageCoords, status, options, offset: offsets }) {\n const targets = [];\n let target;\n let page;\n let i;\n\n if (status.useStatusXY) {\n page = { x: status.x, y: status.y };\n }\n else {\n const origin = utils.getOriginXY(interaction.target, interaction.element, interaction.prepared.name);\n\n page = utils.extend({}, pageCoords);\n\n page.x -= origin.x;\n page.y -= origin.y;\n }\n\n status.realX = page.x;\n status.realY = page.y;\n\n let len = options.targets? options.targets.length : 0;\n\n for (const { x: offsetX, y: offsetY } of offsets) {\n const relativeX = page.x - offsetX;\n const relativeY = page.y - offsetY;\n\n for (const snapTarget of options.targets) {\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n targets.push({\n x: utils.is.number(target.x) ? (target.x + offsetX) : relativeX,\n y: utils.is.number(target.y) ? (target.y + offsetY) : relativeY,\n\n range: utils.is.number(target.range)? target.range: options.range,\n });\n }\n }\n\n const closest = {\n target: null,\n inRange: false,\n distance: 0,\n range: 0,\n dx: 0,\n dy: 0,\n };\n\n for (i = 0, len = targets.length; i < len; i++) {\n target = targets[i];\n\n const range = target.range;\n const dx = target.x - page.x;\n const dy = target.y - page.y;\n const distance = utils.hypot(dx, dy);\n let inRange = distance <= range;\n\n // Infinite targets count as being out of range\n // compared to non infinite ones that are in range\n if (range === Infinity && closest.inRange && closest.range !== Infinity) {\n inRange = false;\n }\n\n if (!closest.target || (inRange\n // is the closest target in range?\n ? (closest.inRange && range !== Infinity\n // the pointer is relatively deeper in this target\n ? distance / range < closest.distance / closest.range\n // this target has Infinite range and the closest doesn't\n : (range === Infinity && closest.range !== Infinity)\n // OR this target is closer that the previous closest\n || distance < closest.distance)\n // The other is not in range and the pointer is closer to this target\n : (!closest.inRange && distance < closest.distance))) {\n\n closest.target = target;\n closest.distance = distance;\n closest.range = range;\n closest.inRange = inRange;\n closest.dx = dx;\n closest.dy = dy;\n\n status.range = range;\n }\n }\n\n let snapChanged;\n\n if (closest.target) {\n snapChanged = (status.modifiedX !== closest.target.x || status.modifiedY !== closest.target.y);\n\n status.modifiedX = closest.target.x;\n status.modifiedY = closest.target.y;\n }\n else {\n snapChanged = true;\n\n status.modifiedX = NaN;\n status.modifiedY = NaN;\n }\n\n status.dx = closest.dx;\n status.dy = closest.dy;\n\n status.changed = (snapChanged || (closest.inRange && !status.locked));\n status.locked = closest.inRange;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const relativePoints = options && options.relativePoints;\n\n if (options && options.enabled\n && !(phase === 'start' && relativePoints && relativePoints.length)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n }\n\n return {\n range : status.range,\n locked : status.locked,\n x : status.modifiedX,\n y : status.modifiedY,\n realX : status.realX,\n realY : status.realY,\n dx : status.dx,\n dy : status.dy,\n };\n }\n },\n};\n\ninteract.createSnapGrid = function (grid) {\n return function (x, y) {\n const limits = grid.limits || {\n left : -Infinity,\n right : Infinity,\n top : -Infinity,\n bottom: Infinity,\n };\n let offsetX = 0;\n let offsetY = 0;\n\n if (utils.is.object(grid.offset)) {\n offsetX = grid.offset.x;\n offsetY = grid.offset.y;\n }\n\n const gridx = Math.round((x - offsetX) / grid.x);\n const gridy = Math.round((y - offsetY) / grid.y);\n\n const newX = Math.max(limits.left, Math.min(limits.right , gridx * grid.x + offsetX));\n const newY = Math.max(limits.top , Math.min(limits.bottom, gridy * grid.y + offsetY));\n\n return {\n x: newX,\n y: newY,\n range: grid.range,\n };\n };\n};\n\nmodifiers.snap = snap;\nmodifiers.names.push('snap');\n\ndefaultOptions.perAction.snap = snap.defaults;\n\nmodule.exports = snap;\n","// This module allows snapping of the size of targets during resize\n// interactions.\n\nconst modifiers = require('./index');\nconst snap = require('./snap');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\nconst utils = require('../utils/');\n\nconst snapSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n },\n\n setOffset: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.edges;\n\n if (!edges) { return; }\n\n arg.options = {\n relativePoints: [{\n x: edges.left? 0 : 1,\n y: edges.top ? 0 : 1,\n }],\n origin: { x: 0, y: 0 },\n offset: 'self',\n range: options.range,\n };\n\n const offsets = snap.setOffset(arg);\n arg.options = options;\n\n return offsets;\n },\n\n set: function (arg) {\n const { interaction, options, offset, pageCoords } = arg;\n const page = utils.extend({}, pageCoords);\n const relativeX = page.x - offset[0].x;\n const relativeY = page.y - offset[0].y;\n\n arg.options = utils.extend({}, options);\n arg.options.targets = [];\n\n for (const snapTarget of options.targets) {\n let target;\n\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n if ('width' in target && 'height' in target) {\n target.x = target.width;\n target.y = target.height;\n }\n\n arg.options.targets.push(target);\n }\n\n snap.set(arg);\n },\n\n modifyCoords: function (arg) {\n const { options } = arg;\n\n arg.options = utils.extend({}, options);\n arg.options.enabled = options.enabled;\n arg.options.relativePoints = [null];\n\n snap.modifyCoords(arg);\n },\n};\n\nmodifiers.snapSize = snapSize;\nmodifiers.names.push('snapSize');\n\ndefaultOptions.perAction.snapSize = snapSize.defaults;\nresize.defaults.snapSize = snapSize.defaults;\n\nmodule.exports = snapSize;\n","const pointerUtils = require('../utils/pointerUtils');\n\nmodule.exports = class PointerEvent {\n constructor (type, pointer, event, eventTarget, interaction) {\n pointerUtils.pointerExtend(this, event);\n\n if (event !== pointer) {\n pointerUtils.pointerExtend(this, pointer);\n }\n\n this.interaction = interaction;\n\n this.timeStamp = new Date().getTime();\n this.originalEvent = event;\n this.type = type;\n this.pointerId = pointerUtils.getPointerId(pointer);\n this.pointerType = pointerUtils.getPointerType(pointer);\n this.target = eventTarget;\n this.currentTarget = null;\n\n if (type === 'tap') {\n const pointerIndex = interaction.getPointerIndex(pointer);\n this.dt = this.timeStamp - interaction.downTimes[pointerIndex];\n\n const interval = this.timeStamp - interaction.tapTime;\n\n this.double = !!(interaction.prevTap\n && interaction.prevTap.type !== 'doubletap'\n && interaction.prevTap.target === this.target\n && interval < 500);\n }\n else if (type === 'doubletap') {\n this.dt = pointer.timeStamp - interaction.tapTime;\n }\n }\n\n subtractOrigin ({ x: originX, y: originY }) {\n this.pageX -= originX;\n this.pageY -= originY;\n this.clientX -= originX;\n this.clientY -= originY;\n\n return this;\n }\n\n addOrigin ({ x: originX, y: originY }) {\n this.pageX += originX;\n this.pageY += originY;\n this.clientX += originX;\n this.clientY += originY;\n\n return this;\n }\n\n preventDefault () {\n this.originalEvent.preventDefault();\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n};\n","const PointerEvent = require('./PointerEvent');\nconst Interaction = require('../Interaction');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst defaults = require('../defaultOptions');\nconst signals = require('../utils/Signals').new();\nconst { filter } = require('../utils/arr');\n\nconst simpleSignals = [ 'down', 'up', 'cancel' ];\nconst simpleEvents = [ 'down', 'up', 'cancel' ];\n\nconst pointerEvents = {\n PointerEvent,\n fire,\n collectEventTargets,\n signals,\n defaults: {\n holdDuration: 600,\n ignoreFrom : null,\n allowFrom : null,\n origin : { x: 0, y: 0 },\n },\n types: [\n 'down',\n 'move',\n 'up',\n 'cancel',\n 'tap',\n 'doubletap',\n 'hold',\n ],\n};\n\nfunction fire (arg) {\n const {\n interaction, pointer, event, eventTarget,\n type = arg.pointerEvent.type,\n targets = collectEventTargets(arg),\n pointerEvent = new PointerEvent(type, pointer, event, eventTarget, interaction),\n } = arg;\n\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n targets,\n type,\n pointerEvent,\n };\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n\n for (const prop in target.props || {}) {\n pointerEvent[prop] = target.props[prop];\n }\n\n const origin = utils.getOriginXY(target.eventable, target.element);\n\n pointerEvent.subtractOrigin(origin);\n pointerEvent.eventable = target.eventable;\n pointerEvent.currentTarget = target.element;\n\n target.eventable.fire(pointerEvent);\n\n pointerEvent.addOrigin(origin);\n\n if (pointerEvent.immediatePropagationStopped\n || (pointerEvent.propagationStopped\n && (i + 1) < targets.length && targets[i + 1].element !== pointerEvent.currentTarget)) {\n break;\n }\n }\n\n signals.fire('fired', signalArg);\n\n if (type === 'tap') {\n // if pointerEvent should make a double tap, create and fire a doubletap\n // PointerEvent and use that as the prevTap\n const prevTap = pointerEvent.double\n ? fire({\n interaction, pointer, event, eventTarget,\n type: 'doubletap',\n })\n : pointerEvent;\n\n interaction.prevTap = prevTap;\n interaction.tapTime = prevTap.timeStamp;\n }\n\n return pointerEvent;\n}\n\nfunction collectEventTargets ({ interaction, pointer, event, eventTarget, type }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n // do not fire a tap event if the pointer was moved before being lifted\n if (type === 'tap' && (interaction.pointerWasMoved\n // or if the pointerup target is different to the pointerdown target\n || !(interaction.downTargets[pointerIndex] && interaction.downTargets[pointerIndex] === eventTarget))) {\n return [];\n }\n\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n path,\n targets: [],\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (type === 'hold') {\n signalArg.targets = filter(signalArg.targets, target =>\n target.eventable.options.holdDuration === interaction.holdTimers[pointerIndex].duration);\n }\n\n return signalArg.targets;\n}\n\nInteraction.signals.on('update-pointer-down', function ({ interaction, pointerIndex }) {\n interaction.holdTimers[pointerIndex] = { duration: Infinity, timeout: null };\n});\n\nInteraction.signals.on('remove-pointer', function ({ interaction, pointerIndex }) {\n interaction.holdTimers.splice(pointerIndex, 1);\n});\n\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget, duplicateMove }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n if (!duplicateMove && (!interaction.pointerIsDown || interaction.pointerWasMoved)) {\n if (interaction.pointerIsDown) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n\n fire({\n interaction, pointer, event, eventTarget,\n type: 'move',\n });\n }\n});\n\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget, pointerIndex }) {\n // copy event to be used in timeout for IE8\n const eventCopy = browser.isIE8? utils.extend({}, event) : event;\n\n const timer = interaction.holdTimers[pointerIndex];\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'hold',\n targets: [],\n path,\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (!signalArg.targets.length) { return; }\n\n let minDuration = Infinity;\n\n for (let i = 0; i < signalArg.targets.length; i++) {\n const target = signalArg.targets[i];\n const holdDuration = target.eventable.options.holdDuration;\n\n if (holdDuration < minDuration) {\n minDuration = holdDuration;\n }\n }\n\n timer.duration = minDuration;\n timer.timeout = setTimeout(function () {\n fire({\n interaction,\n eventTarget,\n pointer: browser.isIE8? eventCopy : pointer,\n event: eventCopy,\n type: 'hold',\n });\n }, minDuration);\n});\n\nInteraction.signals.on('up', ({ interaction, pointer, event, eventTarget }) => {\n if (!interaction.pointerWasMoved) {\n fire({ interaction, eventTarget, pointer, event, type: 'tap' });\n }\n});\n\n['up', 'cancel'].forEach(function (signalName) {\n Interaction.signals.on(signalName, function ({ interaction, pointerIndex }) {\n if (interaction.holdTimers[pointerIndex]) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n });\n});\n\nfunction createSignalListener (type) {\n return function ({ interaction, pointer, event, eventTarget }) {\n fire({ interaction, eventTarget, pointer, event, type });\n };\n}\n\nfor (let i = 0; i < simpleSignals.length; i++) {\n Interaction.signals.on(simpleSignals[i], createSignalListener(simpleEvents[i]));\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.prevTap = null; // the most recent tap event on this interaction\n interaction.tapTime = 0; // time of the most recent tap event\n interaction.holdTimers = []; // [{ duration, timeout }]\n});\n\ndefaults.pointerEvents = pointerEvents.defaults;\nmodule.exports = pointerEvents;\n","const pointerEvents = require('./base');\nconst Interaction = require('../Interaction');\n\npointerEvents.signals.on('new', onNew);\npointerEvents.signals.on('fired', onFired);\n\nfor (const signal of ['move', 'up', 'cancel', 'endall']) {\n Interaction.signals.on(signal, endHoldRepeat);\n}\n\nfunction onNew ({ pointerEvent }) {\n if (pointerEvent.type !== 'hold') { return; }\n\n pointerEvent.count = (pointerEvent.count || 0) + 1;\n}\n\nfunction onFired ({ interaction, pointerEvent, eventTarget, targets }) {\n if (pointerEvent.type !== 'hold' || !targets.length) { return; }\n\n // get the repeat interval from the first eventable\n const interval = targets[0].eventable.options.holdRepeatInterval;\n\n // don't repeat if the interval is 0 or less\n if (interval <= 0) { return; }\n\n // set a timeout to fire the holdrepeat event\n interaction.holdIntervalHandle = setTimeout(function () {\n pointerEvents.fire({\n interaction,\n eventTarget,\n type: 'hold',\n pointer: pointerEvent,\n event: pointerEvent,\n });\n }, interval);\n}\n\nfunction endHoldRepeat ({ interaction }) {\n // set the interaction's holdStopTime property\n // to stop further holdRepeat events\n if (interaction.holdIntervalHandle) {\n clearInterval(interaction.holdIntervalHandle);\n interaction.holdIntervalHandle = null;\n }\n}\n\n// don't repeat by default\npointerEvents.defaults.holdRepeatInterval = 0;\npointerEvents.types.push('holdrepeat');\n\nmodule.exports = {\n onNew,\n onFired,\n endHoldRepeat,\n};\n","const pointerEvents = require('./base');\nconst Interactable = require('../Interactable');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\nconst scope = require('../scope');\nconst extend = require('../utils/extend');\nconst { merge } = require('../utils/arr');\n\npointerEvents.signals.on('collect-targets', function ({ targets, element, type, eventTarget }) {\n function collectSelectors (interactable, selector, context) {\n const els = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && is.element(element)\n && domUtils.matchesSelector(element, selector, els)\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n const interactable = scope.interactables.get(element);\n\n if (interactable) {\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n scope.interactables.forEachSelector(collectSelectors, element);\n});\n\nInteractable.signals.on('new', function ({ interactable }) {\n interactable.events.getRect = function (element) {\n return interactable.getRect(element);\n };\n});\n\nInteractable.signals.on('set', function ({ interactable, options }) {\n extend(interactable.events.options, pointerEvents.defaults);\n extend(interactable.events.options, options);\n});\n\nmerge(Interactable.eventTypes, pointerEvents.types);\n\nInteractable.prototype.pointerEvents = function (options) {\n extend(this.events.options, options);\n\n return this;\n};\n\nconst __backCompatOption = Interactable.prototype._backCompatOption;\n\nInteractable.prototype._backCompatOption = function (optionName, newValue) {\n const ret = __backCompatOption.call(this, optionName, newValue);\n\n if (ret === this) {\n this.events.options[optionName] = newValue;\n }\n\n return ret;\n};\n\nInteractable.settingsMethods.push('pointerEvents');\n","const utils = require('./utils');\nconst events = require('./utils/events');\nconst signals = require('./utils/Signals').new();\n\nconst scope = {\n signals,\n events,\n utils,\n\n // main document\n document: require('./utils/domObjects').document,\n // all documents being listened to\n documents: [],\n\n addDocument: function (doc, win) {\n // do nothing if document is already known\n if (utils.contains(scope.documents, doc)) { return false; }\n\n win = win || scope.getWindow(doc);\n\n scope.documents.push(doc);\n events.documents.push(doc);\n\n // don't add an unload event for the main document\n // so that the page may be cached in browser history\n if (doc !== scope.document) {\n events.add(win, 'unload', scope.onWindowUnload);\n }\n\n signals.fire('add-document', { doc, win });\n },\n\n removeDocument: function (doc, win) {\n const index = utils.indexOf(scope.documents, doc);\n\n win = win || scope.getWindow(doc);\n\n events.remove(win, 'unload', scope.onWindowUnload);\n\n scope.documents.splice(index, 1);\n events.documents.splice(index, 1);\n\n signals.fire('remove-document', { win, doc });\n },\n\n onWindowUnload: function () {\n scope.removeDocument(this.document, this);\n },\n};\n\nmodule.exports = scope;\n","const { indexOf } = require('./arr');\n\nclass Signals {\n constructor () {\n this.listeners = {\n // signalName: [listeners],\n };\n }\n\n on (name, listener) {\n if (!this.listeners[name]) {\n this.listeners[name] = [listener];\n return;\n }\n\n this.listeners[name].push(listener);\n }\n\n off (name, listener) {\n if (!this.listeners[name]) { return; }\n\n const index = indexOf(this.listeners[name], listener);\n\n if (index !== -1) {\n this.listeners[name].splice(index, 1);\n }\n }\n\n fire (name, arg) {\n const targetListeners = this.listeners[name];\n\n if (!targetListeners) { return; }\n\n for (let i = 0; i < targetListeners.length; i++) {\n if (targetListeners[i](arg, name) === false) {\n return;\n }\n }\n }\n}\n\nSignals.new = function () {\n return new Signals();\n};\n\nmodule.exports = Signals;\n","function indexOf (array, target) {\n for (let i = 0, len = array.length; i < len; i++) {\n if (array[i] === target) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction contains (array, target) {\n return indexOf(array, target) !== -1;\n}\n\nfunction merge (target, source) {\n for (let i = 0; i < source.length; i++) {\n target.push(source[i]);\n }\n\n return target;\n}\n\nfunction filter (array, test) {\n const result = [];\n\n for (let i = 0; i < array.length; i++) {\n if (test(array[i])) {\n result.push(array[i]);\n }\n }\n\n return result;\n}\n\nmodule.exports = {\n indexOf,\n contains,\n merge,\n filter,\n};\n","const { window } = require('./window');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst Element = domObjects.Element;\nconst navigator = window.navigator;\n\nconst browser = {\n // Does the browser support touch input?\n supportsTouch: !!(('ontouchstart' in window) || is.function(window.DocumentTouch)\n && domObjects.document instanceof window.DocumentTouch),\n\n // Does the browser support PointerEvents\n supportsPointerEvent: !!domObjects.PointerEvent,\n\n isIE8: ('attachEvent' in window) && !('addEventListener' in window),\n\n // Opera Mobile must be handled differently\n isOperaMobile: (navigator.appName === 'Opera'\n && browser.supportsTouch\n && navigator.userAgent.match('Presto')),\n\n // scrolling doesn't change the result of getClientRects on iOS 7\n isIOS7: (/iP(hone|od|ad)/.test(navigator.platform)\n && /OS 7[^\\d]/.test(navigator.appVersion)),\n\n isIe9OrOlder: /MSIE (8|9)/.test(navigator.userAgent),\n\n // prefix matchesSelector\n prefixedMatchesSelector: 'matches' in Element.prototype\n ? 'matches': 'webkitMatchesSelector' in Element.prototype\n ? 'webkitMatchesSelector': 'mozMatchesSelector' in Element.prototype\n ? 'mozMatchesSelector': 'oMatchesSelector' in Element.prototype\n ? 'oMatchesSelector': 'msMatchesSelector',\n\n useMatchesSelectorPolyfill: false,\n\n pEventTypes: (domObjects.PointerEvent\n ? (domObjects.PointerEvent === window.MSPointerEvent\n ? {\n up: 'MSPointerUp',\n down: 'MSPointerDown',\n over: 'mouseover',\n out: 'mouseout',\n move: 'MSPointerMove',\n cancel: 'MSPointerCancel',\n }\n : {\n up: 'pointerup',\n down: 'pointerdown',\n over: 'pointerover',\n out: 'pointerout',\n move: 'pointermove',\n cancel: 'pointercancel',\n })\n : null),\n\n // because Webkit and Opera still use 'mousewheel' event type\n wheelEvent: 'onmousewheel' in domObjects.document? 'mousewheel': 'wheel',\n\n};\n\nbrowser.useMatchesSelectorPolyfill = !is.function(Element.prototype[browser.prefixedMatchesSelector]);\n\nmodule.exports = browser;\n","const domObjects = {};\nconst win = require('./window').window;\n\nfunction blank () {}\n\ndomObjects.document = win.document;\ndomObjects.DocumentFragment = win.DocumentFragment || blank;\ndomObjects.SVGElement = win.SVGElement || blank;\ndomObjects.SVGSVGElement = win.SVGSVGElement || blank;\ndomObjects.SVGElementInstance = win.SVGElementInstance || blank;\ndomObjects.Element = win.Element || blank;\ndomObjects.HTMLElement = win.HTMLElement || domObjects.Element;\n\ndomObjects.Event = win.Event;\ndomObjects.Touch = win.Touch || blank;\ndomObjects.PointerEvent = (win.PointerEvent || win.MSPointerEvent);\n\nmodule.exports = domObjects;\n","const win = require('./window');\nconst browser = require('./browser');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst domUtils = {\n nodeContains: function (parent, child) {\n while (child) {\n if (child === parent) {\n return true;\n }\n\n child = child.parentNode;\n }\n\n return false;\n },\n\n closest: function (element, selector) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) { return element; }\n\n element = domUtils.parentNode(element);\n }\n\n return null;\n },\n\n parentNode: function (node) {\n let parent = node.parentNode;\n\n if (is.docFrag(parent)) {\n // skip past #shado-root fragments\n while ((parent = parent.host) && is.docFrag(parent)) {\n continue;\n }\n\n return parent;\n }\n\n return parent;\n },\n\n // taken from http://tanalin.com/en/blog/2012/12/matches-selector-ie8/ and modified\n matchesSelectorPolyfill: browser.useMatchesSelectorPolyfill\n ? function (element, selector, elems) {\n elems = elems || element.parentNode.querySelectorAll(selector);\n\n for (let i = 0, len = elems.length; i < len; i++) {\n if (elems[i] === element) {\n return true;\n }\n }\n\n return false;\n }\n : null,\n\n matchesSelector: function (element, selector, nodeList) {\n if (browser.useMatchesSelectorPolyfill) {\n return domUtils.matchesSelectorPolyfill(element, selector, nodeList);\n }\n\n // remove /deep/ from selectors if shadowDOM polyfill is used\n if (win.window !== win.realWindow) {\n selector = selector.replace(/\\/deep\\//g, ' ');\n }\n\n return element[browser.prefixedMatchesSelector](selector);\n },\n\n // Test for the element that's \"above\" all other qualifiers\n indexOfDeepestElement: function (elements) {\n let deepestZoneParents = [];\n let dropzoneParents = [];\n let dropzone;\n let deepestZone = elements[0];\n let index = deepestZone? 0: -1;\n let parent;\n let child;\n let i;\n let n;\n\n for (i = 1; i < elements.length; i++) {\n dropzone = elements[i];\n\n // an element might belong to multiple selector dropzones\n if (!dropzone || dropzone === deepestZone) {\n continue;\n }\n\n if (!deepestZone) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n // check if the deepest or current are document.documentElement or document.rootElement\n // - if the current dropzone is, do nothing and continue\n if (dropzone.parentNode === dropzone.ownerDocument) {\n continue;\n }\n // - if deepest is, update with the current dropzone and continue to next\n else if (deepestZone.parentNode === dropzone.ownerDocument) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n if (!deepestZoneParents.length) {\n parent = deepestZone;\n while (parent.parentNode && parent.parentNode !== parent.ownerDocument) {\n deepestZoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n }\n\n // if this element is an svg element and the current deepest is\n // an HTMLElement\n if (deepestZone instanceof domObjects.HTMLElement\n && dropzone instanceof domObjects.SVGElement\n && !(dropzone instanceof domObjects.SVGSVGElement)) {\n\n if (dropzone === deepestZone.parentNode) {\n continue;\n }\n\n parent = dropzone.ownerSVGElement;\n }\n else {\n parent = dropzone;\n }\n\n dropzoneParents = [];\n\n while (parent.parentNode !== parent.ownerDocument) {\n dropzoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n\n n = 0;\n\n // get (position of last common ancestor) + 1\n while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) {\n n++;\n }\n\n const parents = [\n dropzoneParents[n - 1],\n dropzoneParents[n],\n deepestZoneParents[n],\n ];\n\n child = parents[0].lastChild;\n\n while (child) {\n if (child === parents[1]) {\n deepestZone = dropzone;\n index = i;\n deepestZoneParents = [];\n\n break;\n }\n else if (child === parents[2]) {\n break;\n }\n\n child = child.previousSibling;\n }\n }\n\n return index;\n },\n\n matchesUpTo: function (element, selector, limit) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) {\n return true;\n }\n\n element = domUtils.parentNode(element);\n\n if (element === limit) {\n return domUtils.matchesSelector(element, selector);\n }\n }\n\n return false;\n },\n\n getActualElement: function (element) {\n return (element instanceof domObjects.SVGElementInstance\n ? element.correspondingUseElement\n : element);\n },\n\n getScrollXY: function (relevantWindow) {\n relevantWindow = relevantWindow || win.window;\n return {\n x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft,\n y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop,\n };\n },\n\n getElementClientRect: function (element) {\n const clientRect = (element instanceof domObjects.SVGElement\n ? element.getBoundingClientRect()\n : element.getClientRects()[0]);\n\n return clientRect && {\n left : clientRect.left,\n right : clientRect.right,\n top : clientRect.top,\n bottom: clientRect.bottom,\n width : clientRect.width || clientRect.right - clientRect.left,\n height: clientRect.height || clientRect.bottom - clientRect.top,\n };\n },\n\n getElementRect: function (element) {\n const clientRect = domUtils.getElementClientRect(element);\n\n if (!browser.isIOS7 && clientRect) {\n const scroll = domUtils.getScrollXY(win.getWindow(element));\n\n clientRect.left += scroll.x;\n clientRect.right += scroll.x;\n clientRect.top += scroll.y;\n clientRect.bottom += scroll.y;\n }\n\n return clientRect;\n },\n\n getPath: function (element) {\n const path = [];\n\n while (element) {\n path.push(element);\n element = domUtils.parentNode(element);\n }\n\n return path;\n },\n\n trySelector: value => {\n if (!is.string(value)) { return false; }\n\n // an exception will be raised if it is invalid\n domObjects.document.querySelector(value);\n return true;\n },\n};\n\nmodule.exports = domUtils;\n","const is = require('./is');\nconst domUtils = require('./domUtils');\nconst pExtend = require('./pointerExtend');\n\nconst { window, getWindow } = require('./window');\nconst { indexOf, contains } = require('./arr');\n\nconst useAttachEvent = ('attachEvent' in window) && !('addEventListener' in window);\nconst addEvent = useAttachEvent? 'attachEvent': 'addEventListener';\nconst removeEvent = useAttachEvent? 'detachEvent': 'removeEventListener';\nconst on = useAttachEvent? 'on': '';\n\nconst elements = [];\nconst targets = [];\nconst attachedListeners = [];\n\n// {\n// type: {\n// selectors: ['selector', ...],\n// contexts : [document, ...],\n// listeners: [[listener, capture, passive], ...]\n// }\n// }\nconst delegatedEvents = {};\n\nconst documents = [];\n\nconst supportsOptions = !useAttachEvent && (() => {\n let supported = false;\n\n window.document.createElement('div').addEventListener('test', null, {\n get capture () { supported = true; },\n });\n\n return supported;\n})();\n\nfunction add (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n let elementIndex = indexOf(elements, element);\n let target = targets[elementIndex];\n\n if (!target) {\n target = {\n events: {},\n typeCount: 0,\n };\n\n elementIndex = elements.push(element) - 1;\n targets.push(target);\n\n attachedListeners.push(useAttachEvent\n ? {\n supplied: [],\n wrapped : [],\n useCount: [],\n }\n : null);\n }\n\n if (!target.events[type]) {\n target.events[type] = [];\n target.typeCount++;\n }\n\n if (!contains(target.events[type], listener)) {\n let ret;\n\n if (useAttachEvent) {\n const { supplied, wrapped, useCount } = attachedListeners[elementIndex];\n const listenerIndex = indexOf(supplied, listener);\n\n const wrappedListener = wrapped[listenerIndex] || function (event) {\n if (!event.immediatePropagationStopped) {\n event.target = event.srcElement;\n event.currentTarget = element;\n\n event.preventDefault = event.preventDefault || preventDef;\n event.stopPropagation = event.stopPropagation || stopProp;\n event.stopImmediatePropagation = event.stopImmediatePropagation || stopImmProp;\n\n if (/mouse|click/.test(event.type)) {\n event.pageX = event.clientX + getWindow(element).document.documentElement.scrollLeft;\n event.pageY = event.clientY + getWindow(element).document.documentElement.scrollTop;\n }\n\n listener(event);\n }\n };\n\n ret = element[addEvent](on + type, wrappedListener, !!options.capture);\n\n if (listenerIndex === -1) {\n supplied.push(listener);\n wrapped.push(wrappedListener);\n useCount.push(1);\n }\n else {\n useCount[listenerIndex]++;\n }\n }\n else {\n ret = element[addEvent](type, listener, supportsOptions? options : !!options.capture);\n }\n target.events[type].push(listener);\n\n return ret;\n }\n}\n\nfunction remove (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const elementIndex = indexOf(elements, element);\n const target = targets[elementIndex];\n\n if (!target || !target.events) {\n return;\n }\n\n let wrappedListener = listener;\n let listeners;\n let listenerIndex;\n\n if (useAttachEvent) {\n listeners = attachedListeners[elementIndex];\n listenerIndex = indexOf(listeners.supplied, listener);\n wrappedListener = listeners.wrapped[listenerIndex];\n }\n\n if (type === 'all') {\n for (type in target.events) {\n if (target.events.hasOwnProperty(type)) {\n remove(element, type, 'all');\n }\n }\n return;\n }\n\n if (target.events[type]) {\n const len = target.events[type].length;\n\n if (listener === 'all') {\n for (let i = 0; i < len; i++) {\n remove(element, type, target.events[type][i], options);\n }\n return;\n }\n else {\n for (let i = 0; i < len; i++) {\n if (target.events[type][i] === listener) {\n element[removeEvent](on + type, wrappedListener, supportsOptions? options : !!options.capture);\n target.events[type].splice(i, 1);\n\n if (useAttachEvent && listeners) {\n listeners.useCount[listenerIndex]--;\n if (listeners.useCount[listenerIndex] === 0) {\n listeners.supplied.splice(listenerIndex, 1);\n listeners.wrapped.splice(listenerIndex, 1);\n listeners.useCount.splice(listenerIndex, 1);\n }\n }\n\n break;\n }\n }\n }\n\n if (target.events[type] && target.events[type].length === 0) {\n target.events[type] = null;\n target.typeCount--;\n }\n }\n\n if (!target.typeCount) {\n targets.splice(elementIndex, 1);\n elements.splice(elementIndex, 1);\n attachedListeners.splice(elementIndex, 1);\n }\n}\n\nfunction addDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n if (!delegatedEvents[type]) {\n delegatedEvents[type] = {\n selectors: [],\n contexts : [],\n listeners: [],\n };\n\n // add delegate listener functions\n for (let i = 0; i < documents.length; i++) {\n add(documents[i], type, delegateListener);\n add(documents[i], type, delegateUseCapture, true);\n }\n }\n\n const delegated = delegatedEvents[type];\n let index;\n\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n break;\n }\n }\n\n if (index === -1) {\n index = delegated.selectors.length;\n\n delegated.selectors.push(selector);\n delegated.contexts .push(context);\n delegated.listeners.push([]);\n }\n\n // keep listener and capture and passive flags\n delegated.listeners[index].push([listener, !!options.capture, options.passive]);\n}\n\nfunction removeDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const delegated = delegatedEvents[type];\n let matchFound = false;\n let index;\n\n if (!delegated) { return; }\n\n // count from last index of delegated to 0\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n // look for matching selector and context Node\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n\n const listeners = delegated.listeners[index];\n\n // each item of the listeners array is an array: [function, capture, passive]\n for (let i = listeners.length - 1; i >= 0; i--) {\n const [fn, capture, passive] = listeners[i];\n\n // check if the listener functions and capture and passive flags match\n if (fn === listener && capture === !!options.capture && passive === options.passive) {\n // remove the listener from the array of listeners\n listeners.splice(i, 1);\n\n // if all listeners for this interactable have been removed\n // remove the interactable from the delegated arrays\n if (!listeners.length) {\n delegated.selectors.splice(index, 1);\n delegated.contexts .splice(index, 1);\n delegated.listeners.splice(index, 1);\n\n // remove delegate function from context\n remove(context, type, delegateListener);\n remove(context, type, delegateUseCapture, true);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegatedEvents[type] = null;\n }\n }\n\n // only remove one listener\n matchFound = true;\n break;\n }\n }\n\n if (matchFound) { break; }\n }\n }\n}\n\n// bound to the interactable context when a DOM event\n// listener is added to a selector interactable\nfunction delegateListener (event, optionalArg) {\n const options = getOptions(optionalArg);\n const fakeEvent = {};\n const delegated = delegatedEvents[event.type];\n const eventTarget = (domUtils.getActualElement(event.path\n ? event.path[0]\n : event.target));\n let element = eventTarget;\n\n // duplicate the event so that currentTarget can be changed\n pExtend(fakeEvent, event);\n\n fakeEvent.originalEvent = event;\n fakeEvent.preventDefault = preventOriginalDefault;\n\n // climb up document tree looking for selector matches\n while (is.element(element)) {\n for (let i = 0; i < delegated.selectors.length; i++) {\n const selector = delegated.selectors[i];\n const context = delegated.contexts[i];\n\n if (domUtils.matchesSelector(element, selector)\n && domUtils.nodeContains(context, eventTarget)\n && domUtils.nodeContains(context, element)) {\n\n const listeners = delegated.listeners[i];\n\n fakeEvent.currentTarget = element;\n\n for (let j = 0; j < listeners.length; j++) {\n const [fn, capture, passive] = listeners[j];\n\n if (capture === !!options.capture && passive === options.passive) {\n fn(fakeEvent);\n }\n }\n }\n }\n\n element = domUtils.parentNode(element);\n }\n}\n\nfunction delegateUseCapture (event) {\n return delegateListener.call(this, event, true);\n}\n\nfunction preventDef () {\n this.returnValue = false;\n}\n\nfunction preventOriginalDefault () {\n this.originalEvent.preventDefault();\n}\n\nfunction stopProp () {\n this.cancelBubble = true;\n}\n\nfunction stopImmProp () {\n this.cancelBubble = true;\n this.immediatePropagationStopped = true;\n}\n\nfunction getOptions (param) {\n return is.object(param)? param : { capture: param };\n}\n\nmodule.exports = {\n add,\n remove,\n\n addDelegate,\n removeDelegate,\n\n delegateListener,\n delegateUseCapture,\n delegatedEvents,\n documents,\n\n useAttachEvent,\n supportsOptions,\n\n _elements: elements,\n _targets: targets,\n _attachedListeners: attachedListeners,\n};\n","module.exports = function extend (dest, source) {\n for (const prop in source) {\n dest[prop] = source[prop];\n }\n return dest;\n};\n","const {\n resolveRectLike,\n rectToXY,\n} = require('./rect');\n\nmodule.exports = function (target, element, action) {\n const actionOptions = target.options[action];\n const actionOrigin = actionOptions && actionOptions.origin;\n const origin = actionOrigin || target.options.origin;\n\n const originRect = resolveRectLike(origin, target, element, [target && element]);\n\n return rectToXY(originRect) || { x: 0, y: 0 };\n};\n","module.exports = (x, y) => Math.sqrt(x * x + y * y);\n","const extend = require('./extend');\nconst win = require('./window');\n\nconst utils = {\n warnOnce: function (method, message) {\n let warned = false;\n\n return function () {\n if (!warned) {\n win.window.console.warn(message);\n warned = true;\n }\n\n return method.apply(this, arguments);\n };\n },\n\n // http://stackoverflow.com/a/5634528/2280888\n _getQBezierValue: function (t, p1, p2, p3) {\n const iT = 1 - t;\n return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3;\n },\n\n getQuadraticCurvePoint: function (startX, startY, cpX, cpY, endX, endY, position) {\n return {\n x: utils._getQBezierValue(position, startX, cpX, endX),\n y: utils._getQBezierValue(position, startY, cpY, endY),\n };\n },\n\n // http://gizma.com/easing/\n easeOutQuad: function (t, b, c, d) {\n t /= d;\n return -c * t*(t-2) + b;\n },\n\n copyAction: function (dest, src) {\n dest.name = src.name;\n dest.axis = src.axis;\n dest.edges = src.edges;\n\n return dest;\n },\n\n is : require('./is'),\n extend : extend,\n hypot : require('./hypot'),\n getOriginXY: require('./getOriginXY'),\n};\n\nextend(utils, require('./arr'));\nextend(utils, require('./domUtils'));\nextend(utils, require('./pointerUtils'));\nextend(utils, require('./rect'));\n\nmodule.exports = utils;\n","const scope = require('../scope');\nconst utils = require('./index');\n\nconst finder = {\n methodOrder: [ 'simulationResume', 'mouseOrPen', 'hasPointer', 'idle' ],\n\n search: function (pointer, eventType, eventTarget) {\n const pointerType = utils.getPointerType(pointer);\n const pointerId = utils.getPointerId(pointer);\n const details = { pointer, pointerId, pointerType, eventType, eventTarget };\n\n for (const method of finder.methodOrder) {\n const interaction = finder[method](details);\n\n if (interaction) {\n return interaction;\n }\n }\n },\n\n // try to resume simulation with a new pointer\n simulationResume: function ({ pointerType, eventType, eventTarget }) {\n if (!/down|start/i.test(eventType)) {\n return null;\n }\n\n for (const interaction of scope.interactions) {\n let element = eventTarget;\n\n if (interaction.simulation && interaction.simulation.allowResume\n && (interaction.pointerType === pointerType)) {\n while (element) {\n // if the element is the interaction element\n if (element === interaction.element) {\n return interaction;\n }\n element = utils.parentNode(element);\n }\n }\n }\n\n return null;\n },\n\n // if it's a mouse or pen interaction\n mouseOrPen: function ({ pointerId, pointerType, eventType }) {\n if (pointerType !== 'mouse' && pointerType !== 'pen') {\n return null;\n }\n\n let firstNonActive;\n\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType) {\n // if it's a down event, skip interactions with running simulations\n if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; }\n\n // if the interaction is active, return it immediately\n if (interaction.interacting()) {\n return interaction;\n }\n // otherwise save it and look for another active interaction\n else if (!firstNonActive) {\n firstNonActive = interaction;\n }\n }\n }\n\n // if no active mouse interaction was found use the first inactive mouse\n // interaction\n if (firstNonActive) {\n return firstNonActive;\n }\n\n // find any mouse or pen interaction.\n // ignore the interaction if the eventType is a *down, and a simulation\n // is active\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType && !(/down/i.test(eventType) && interaction.simulation)) {\n return interaction;\n }\n }\n\n return null;\n },\n\n // get interaction that has this pointer\n hasPointer: function ({ pointerId }) {\n for (const interaction of scope.interactions) {\n if (utils.contains(interaction.pointerIds, pointerId)) {\n return interaction;\n }\n }\n },\n\n // get first idle interaction with a matching pointerType\n idle: function ({ pointerType }) {\n for (const interaction of scope.interactions) {\n // if there's already a pointer held down\n if (interaction.pointerIds.length === 1) {\n const target = interaction.target;\n // don't add this pointer if there is a target interactable and it\n // isn't gesturable\n if (target && !target.options.gesture.enabled) {\n continue;\n }\n }\n // maximum of 2 pointers per interaction\n else if (interaction.pointerIds.length >= 2) {\n continue;\n }\n\n if (!interaction.interacting() && (pointerType === interaction.pointerType)) {\n return interaction;\n }\n }\n\n return null;\n },\n};\n\nmodule.exports = finder;\n","const win = require('./window');\nconst isWindow = require('./isWindow');\n\nconst is = {\n array : () => {},\n\n window : thing => thing === win.window || isWindow(thing),\n\n docFrag : thing => is.object(thing) && thing.nodeType === 11,\n\n object : thing => !!thing && (typeof thing === 'object'),\n\n function: thing => typeof thing === 'function',\n\n number : thing => typeof thing === 'number' ,\n\n bool : thing => typeof thing === 'boolean' ,\n\n string : thing => typeof thing === 'string' ,\n\n element: thing => {\n if (!thing || (typeof thing !== 'object')) { return false; }\n\n const _window = win.getWindow(thing) || win.window;\n\n return (/object|function/.test(typeof _window.Element)\n ? thing instanceof _window.Element //DOM2\n : thing.nodeType === 1 && typeof thing.nodeName === 'string');\n },\n};\n\nis.array = thing => (is.object(thing)\n && (typeof thing.length !== 'undefined')\n && is.function(thing.splice));\n\nmodule.exports = is;\n","module.exports = (thing) => !!(thing && thing.Window) && (thing instanceof thing.Window);\n","function pointerExtend (dest, source) {\n for (const prop in source) {\n const prefixedPropREs = module.exports.prefixedPropREs;\n let deprecated = false;\n\n // skip deprecated prefixed properties\n for (const vendor in prefixedPropREs) {\n if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) {\n deprecated = true;\n break;\n }\n }\n\n if (!deprecated && typeof source[prop] !== 'function') {\n dest[prop] = source[prop];\n }\n }\n return dest;\n}\n\npointerExtend.prefixedPropREs = {\n webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/,\n};\n\nmodule.exports = pointerExtend;\n","const hypot = require('./hypot');\nconst browser = require('./browser');\nconst dom = require('./domObjects');\nconst domUtils = require('./domUtils');\nconst domObjects = require('./domObjects');\nconst is = require('./is');\nconst pointerExtend = require('./pointerExtend');\n\nconst pointerUtils = {\n copyCoords: function (dest, src) {\n dest.page = dest.page || {};\n dest.page.x = src.page.x;\n dest.page.y = src.page.y;\n\n dest.client = dest.client || {};\n dest.client.x = src.client.x;\n dest.client.y = src.client.y;\n\n dest.timeStamp = src.timeStamp;\n },\n\n setCoordDeltas: function (targetObj, prev, cur) {\n targetObj.page.x = cur.page.x - prev.page.x;\n targetObj.page.y = cur.page.y - prev.page.y;\n targetObj.client.x = cur.client.x - prev.client.x;\n targetObj.client.y = cur.client.y - prev.client.y;\n targetObj.timeStamp = cur.timeStamp - prev.timeStamp;\n\n // set pointer velocity\n const dt = Math.max(targetObj.timeStamp / 1000, 0.001);\n\n targetObj.page.speed = hypot(targetObj.page.x, targetObj.page.y) / dt;\n targetObj.page.vx = targetObj.page.x / dt;\n targetObj.page.vy = targetObj.page.y / dt;\n\n targetObj.client.speed = hypot(targetObj.client.x, targetObj.page.y) / dt;\n targetObj.client.vx = targetObj.client.x / dt;\n targetObj.client.vy = targetObj.client.y / dt;\n },\n\n isNativePointer: function (pointer) {\n return (pointer instanceof dom.Event || pointer instanceof dom.Touch);\n },\n\n // Get specified X/Y coords for mouse or event.touches[0]\n getXY: function (type, pointer, xy) {\n xy = xy || {};\n type = type || 'page';\n\n xy.x = pointer[type + 'X'];\n xy.y = pointer[type + 'Y'];\n\n return xy;\n },\n\n getPageXY: function (pointer, page) {\n page = page || {};\n\n // Opera Mobile handles the viewport and scrolling oddly\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n pointerUtils.getXY('screen', pointer, page);\n\n page.x += window.scrollX;\n page.y += window.scrollY;\n }\n else {\n pointerUtils.getXY('page', pointer, page);\n }\n\n return page;\n },\n\n getClientXY: function (pointer, client) {\n client = client || {};\n\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n // Opera Mobile handles the viewport and scrolling oddly\n pointerUtils.getXY('screen', pointer, client);\n }\n else {\n pointerUtils.getXY('client', pointer, client);\n }\n\n return client;\n },\n\n getPointerId: function (pointer) {\n return is.number(pointer.pointerId)? pointer.pointerId : pointer.identifier;\n },\n\n setCoords: function (targetObj, pointers, timeStamp) {\n const pointer = (pointers.length > 1\n ? pointerUtils.pointerAverage(pointers)\n : pointers[0]);\n\n const tmpXY = {};\n\n pointerUtils.getPageXY(pointer, tmpXY);\n targetObj.page.x = tmpXY.x;\n targetObj.page.y = tmpXY.y;\n\n pointerUtils.getClientXY(pointer, tmpXY);\n targetObj.client.x = tmpXY.x;\n targetObj.client.y = tmpXY.y;\n\n targetObj.timeStamp = is.number(timeStamp) ? timeStamp :new Date().getTime();\n },\n\n pointerExtend: pointerExtend,\n\n getTouchPair: function (event) {\n const touches = [];\n\n // array of touches is supplied\n if (is.array(event)) {\n touches[0] = event[0];\n touches[1] = event[1];\n }\n // an event\n else {\n if (event.type === 'touchend') {\n if (event.touches.length === 1) {\n touches[0] = event.touches[0];\n touches[1] = event.changedTouches[0];\n }\n else if (event.touches.length === 0) {\n touches[0] = event.changedTouches[0];\n touches[1] = event.changedTouches[1];\n }\n }\n else {\n touches[0] = event.touches[0];\n touches[1] = event.touches[1];\n }\n }\n\n return touches;\n },\n\n pointerAverage: function (pointers) {\n const average = {\n pageX : 0,\n pageY : 0,\n clientX: 0,\n clientY: 0,\n screenX: 0,\n screenY: 0,\n };\n\n for (const pointer of pointers) {\n for (const prop in average) {\n average[prop] += pointer[prop];\n }\n }\n for (const prop in average) {\n average[prop] /= pointers.length;\n }\n\n return average;\n },\n\n touchBBox: function (event) {\n if (!event.length && !(event.touches && event.touches.length > 1)) {\n return;\n }\n\n const touches = pointerUtils.getTouchPair(event);\n const minX = Math.min(touches[0].pageX, touches[1].pageX);\n const minY = Math.min(touches[0].pageY, touches[1].pageY);\n const maxX = Math.max(touches[0].pageX, touches[1].pageX);\n const maxY = Math.max(touches[0].pageY, touches[1].pageY);\n\n return {\n x: minX,\n y: minY,\n left: minX,\n top: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n },\n\n touchDistance: function (event, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n\n\n const dx = touches[0][sourceX] - touches[1][sourceX];\n const dy = touches[0][sourceY] - touches[1][sourceY];\n\n return hypot(dx, dy);\n },\n\n touchAngle: function (event, prevAngle, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n const dx = touches[1][sourceX] - touches[0][sourceX];\n const dy = touches[1][sourceY] - touches[0][sourceY];\n const angle = 180 * Math.atan2(dy , dx) / Math.PI;\n\n return angle;\n },\n\n getPointerType: function (pointer) {\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : is.number(pointer.pointerType)\n ? [undefined, undefined,'touch', 'pen', 'mouse'][pointer.pointerType]\n // if the PointerEvent API isn't available, then the \"pointer\" must\n // be either a MouseEvent, TouchEvent, or Touch object\n : /touch/.test(pointer.type) || pointer instanceof domObjects.Touch\n ? 'touch'\n : 'mouse';\n },\n\n // [ event.target, event.currentTarget ]\n getEventTargets: function (event) {\n return [\n domUtils.getActualElement(event.path ? event.path[0] : event.target),\n domUtils.getActualElement(event.currentTarget),\n ];\n },\n};\n\nmodule.exports = pointerUtils;\n","const { window } = require('./window');\n\nconst vendors = ['ms', 'moz', 'webkit', 'o'];\nlet lastTime = 0;\nlet request;\nlet cancel;\n\nfor (let x = 0; x < vendors.length && !window.requestAnimationFrame; x++) {\n request = window[vendors[x] + 'RequestAnimationFrame'];\n cancel = window[vendors[x] +'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n}\n\nif (!request) {\n request = function (callback) {\n const currTime = new Date().getTime();\n const timeToCall = Math.max(0, 16 - (currTime - lastTime));\n const id = setTimeout(function () { callback(currTime + timeToCall); },\n timeToCall);\n\n lastTime = currTime + timeToCall;\n return id;\n };\n}\n\nif (!cancel) {\n cancel = function (id) {\n clearTimeout(id);\n };\n}\n\nmodule.exports = {\n request,\n cancel,\n};\n","const extend = require('./extend');\nconst is = require('./is');\nconst {\n closest,\n parentNode,\n getElementRect,\n} = require('./domUtils');\n\nconst rectUtils = {\n getStringOptionResult: function (value, interactable, element) {\n if (!is.string(value)) {\n return null;\n }\n\n if (value === 'parent') {\n value = parentNode(element);\n }\n else if (value === 'self') {\n value = interactable.getRect(element);\n }\n else {\n value = closest(element, value);\n }\n\n return value;\n },\n\n resolveRectLike: function (value, interactable, element, functionArgs) {\n value = rectUtils.getStringOptionResult(value, interactable, element) || value;\n\n if (is.function(value)) {\n value = value.apply(null, functionArgs);\n }\n\n if (is.element(value)) {\n value = getElementRect(value);\n }\n\n return value;\n },\n\n rectToXY: function (rect) {\n return rect && {\n x: 'x' in rect ? rect.x : rect.left,\n y: 'y' in rect ? rect.y : rect.top,\n };\n },\n\n xywhToTlbr: function (rect) {\n if (rect && !('left' in rect && 'top' in rect)) {\n rect = extend({}, rect);\n\n rect.left = rect.x || 0;\n rect.top = rect.y || 0;\n rect.right = rect.right || (rect.left + rect.width);\n rect.bottom = rect.bottom || (rect.top + rect.height);\n }\n\n return rect;\n },\n\n tlbrToXywh: function (rect) {\n if (rect && !('x' in rect && 'y' in rect)) {\n rect = extend({}, rect);\n\n rect.x = rect.left || 0;\n rect.top = rect.top || 0;\n rect.width = rect.width || (rect.right - rect.x);\n rect.height = rect.height || (rect.bottom - rect.y);\n }\n\n return rect;\n },\n};\n\nmodule.exports = rectUtils;\n","const win = module.exports;\nconst isWindow = require('./isWindow');\n\nfunction init (window) {\n // get wrapped window if using Shadow DOM polyfill\n\n win.realWindow = window;\n\n // create a TextNode\n const el = window.document.createTextNode('');\n\n // check if it's wrapped by a polyfill\n if (el.ownerDocument !== window.document\n && typeof window.wrap === 'function'\n && window.wrap(el) === el) {\n // use wrapped window\n window = window.wrap(window);\n }\n\n win.window = window;\n}\n\nif (typeof window === 'undefined') {\n win.window = undefined;\n win.realWindow = undefined;\n}\nelse {\n init(window);\n}\n\nwin.getWindow = function getWindow (node) {\n if (isWindow(node)) {\n return node;\n }\n\n const rootNode = (node.ownerDocument || node);\n\n return rootNode.defaultView || rootNode.parentWindow || win.window;\n};\n\nwin.init = init;\n"]} \ No newline at end of file diff --git a/package.json b/package.json index 76f3e9969..f39704e99 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "interactjs", - "version": "1.3.0-alpha.3+sha.9595c40", + "version": "1.3.0-alpha.4+sha.7970416", "repository": { "type": "git", "url": "https://github.com/taye/interact.js.git"
- interact.on(type, listener, [options])⚓➭ + interact.on(type, listener, [options])⚓➭ @@ -1948,7 +1948,7 @@ Parameters - interact.off(type, listener, [options])⚓➭ + interact.off(type, listener, [options])⚓➭ @@ -2014,7 +2014,7 @@ Parameters - interact.debug()⚓➭ + interact.debug()⚓➭ @@ -2056,7 +2056,7 @@ interact.debug() - interact.supportsTouch()⚓➭ + interact.supportsTouch()⚓➭ @@ -2097,7 +2097,7 @@ interact.supportsTouch() - interact.supportsPointerEvent()⚓➭ + interact.supportsPointerEvent()⚓➭ @@ -2138,7 +2138,7 @@ interact.supportsPointerEvent() - interact.stop(event)⚓➭ + interact.stop(event)⚓➭ @@ -2198,7 +2198,7 @@ Parameters - interact.pointerMoveTolerance([newValue])⚓➭ + interact.pointerMoveTolerance([newValue])⚓➭ @@ -2261,7 +2261,7 @@ Parameters - Interaction.start(action, target, element)⚓➭ + Interaction.start(action, target, element)⚓➭ @@ -2356,7 +2356,7 @@ Parameters - Interaction.doMove()⚓➭ + Interaction.doMove()⚓➭ @@ -2403,7 +2403,7 @@ Interaction.doMove() - Interaction.end([event])⚓➭ + Interaction.end([event])⚓➭ diff --git a/dist/interact.js b/dist/interact.js index e8ae35c3b..c78a3c751 100644 --- a/dist/interact.js +++ b/dist/interact.js @@ -1,5 +1,5 @@ /** - * interact.js v1.3.0-alpha.3+sha.9595c40 + * interact.js v1.3.0-alpha.4+sha.7970416-dirty * * Copyright (c) 2012-2017 Taye Adeyemi * Open source under the MIT License. @@ -816,6 +816,7 @@ var scope = require('./scope'); var utils = require('./utils'); var events = require('./utils/events'); var browser = require('./utils/browser'); +var domObjects = require('./utils/domObjects'); var finder = require('./utils/interactionFinder'); var signals = require('./utils/Signals').new(); @@ -829,7 +830,9 @@ var prevTouchTime = 0; scope.interactions = []; var Interaction = function () { - function Interaction() { + function Interaction(_ref) { + var pointerType = _ref.pointerType; + _classCallCheck(this, Interaction); this.target = null; // current interactable being interacted with @@ -886,7 +889,7 @@ var Interaction = function () { this.pointerWasMoved = false; this._interacting = false; - this.mouse = false; + this.pointerType = pointerType; signals.fire('new', this); @@ -1130,6 +1133,11 @@ var Interaction = function () { }; Interaction.prototype.getPointerIndex = function getPointerIndex(pointer) { + // mouse and pen interactions may have only one pointer + if (this.pointerType === 'mouse' || this.pointerType === 'pen') { + return 0; + } + return utils.indexOf(this.pointerIds, utils.getPointerId(pointer)); }; @@ -1161,8 +1169,7 @@ var Interaction = function () { }; Interaction.prototype.removePointer = function removePointer(pointer, event) { - var id = utils.getPointerId(pointer); - var index = this.mouse ? 0 : utils.indexOf(this.pointerIds, id); + var index = this.getPointerIndex(pointer); if (index === -1) { return; @@ -1197,6 +1204,8 @@ for (var i = 0, len = methodNames.length; i < len; i++) { function doOnInteractions(method) { return function (event) { + var pointerType = utils.getPointerType(event); + var _utils$getEventTarget = utils.getEventTargets(event), eventTarget = _utils$getEventTarget[0], curEventTarget = _utils$getEventTarget[1]; @@ -1210,7 +1219,7 @@ function doOnInteractions(method) { var pointer = event.changedTouches[_i]; var interaction = finder.search(pointer, event.type, eventTarget); - matches.push([pointer, interaction || new Interaction()]); + matches.push([pointer, interaction || new Interaction({ pointerType: pointerType })]); } } else { var invalidPointer = false; @@ -1218,7 +1227,7 @@ function doOnInteractions(method) { if (!browser.supportsPointerEvent && /mouse/.test(event.type)) { // ignore mouse events while touch interactions are active for (var _i2 = 0; _i2 < scope.interactions.length && !invalidPointer; _i2++) { - invalidPointer = !scope.interactions[_i2].mouse && scope.interactions[_i2].pointerIsDown; + invalidPointer = scope.interactions[_i2].pointerType !== 'mouse' && scope.interactions[_i2].pointerIsDown; } // try to ignore mouse events that are simulated by the browser @@ -1232,11 +1241,7 @@ function doOnInteractions(method) { var _interaction = finder.search(event, event.type, eventTarget); if (!_interaction) { - - _interaction = new Interaction(); - _interaction.mouse = /mouse/i.test(event.pointerType || event.type) - // MSPointerEvent.MSPOINTER_TYPE_MOUSE - || event.pointerType === 4 || !event.pointerType; + _interaction = new Interaction({ pointerType: pointerType }); } matches.push([event, _interaction]); @@ -1244,20 +1249,20 @@ function doOnInteractions(method) { } for (var _iterator = matches, _isArray = Array.isArray(_iterator), _i3 = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { - var _ref; + var _ref2; if (_isArray) { if (_i3 >= _iterator.length) break; - _ref = _iterator[_i3++]; + _ref2 = _iterator[_i3++]; } else { _i3 = _iterator.next(); if (_i3.done) break; - _ref = _i3.value; + _ref2 = _i3.value; } - var _ref2 = _ref, - _pointer = _ref2[0], - _interaction2 = _ref2[1]; + var _ref3 = _ref2, + _pointer = _ref3[0], + _interaction2 = _ref3[1]; _interaction2._updateEventTargets(eventTarget, curEventTarget); _interaction2[method](_pointer, event, eventTarget, curEventTarget); @@ -1277,7 +1282,7 @@ function endAll(event) { var docEvents = {/* 'eventType': listenerFunc */}; var pEventTypes = browser.pEventTypes; -if (scope.PointerEvent) { +if (domObjects.PointerEvent) { docEvents[pEventTypes.down] = listeners.pointerDown; docEvents[pEventTypes.move] = listeners.pointerMove; docEvents[pEventTypes.up] = listeners.pointerUp; @@ -1295,8 +1300,8 @@ if (scope.PointerEvent) { docEvents.blur = endAll; -function onDocSignal(_ref3, signalName) { - var doc = _ref3.doc; +function onDocSignal(_ref4, signalName) { + var doc = _ref4.doc; var eventMethod = signalName.indexOf('add') === 0 ? events.add : events.remove; @@ -1311,14 +1316,14 @@ function onDocSignal(_ref3, signalName) { } } -signals.on('update-pointer-down', function (_ref4) { - var interaction = _ref4.interaction, - pointer = _ref4.pointer, - pointerId = _ref4.pointerId, - pointerIndex = _ref4.pointerIndex, - event = _ref4.event, - eventTarget = _ref4.eventTarget, - down = _ref4.down; +signals.on('update-pointer-down', function (_ref5) { + var interaction = _ref5.interaction, + pointer = _ref5.pointer, + pointerId = _ref5.pointerId, + pointerIndex = _ref5.pointerIndex, + event = _ref5.event, + eventTarget = _ref5.eventTarget, + down = _ref5.down; interaction.pointerIds[pointerIndex] = pointerId; interaction.pointers[pointerIndex] = pointer; @@ -1355,7 +1360,7 @@ scope.endAllInteractions = endAll; module.exports = Interaction; -},{"./scope":34,"./utils":44,"./utils/Signals":35,"./utils/browser":37,"./utils/events":40,"./utils/interactionFinder":45}],6:[function(require,module,exports){ +},{"./scope":34,"./utils":44,"./utils/Signals":35,"./utils/browser":37,"./utils/domObjects":38,"./utils/events":40,"./utils/interactionFinder":45}],6:[function(require,module,exports){ 'use strict'; var Interaction = require('../Interaction'); @@ -5460,7 +5465,7 @@ module.exports = function () { this.originalEvent = event; this.type = type; this.pointerId = pointerUtils.getPointerId(pointer); - this.pointerType = pointerUtils.getPointerType(pointer, interaction); + this.pointerType = pointerUtils.getPointerType(pointer); this.target = eventTarget; this.currentTarget = null; @@ -5758,8 +5763,10 @@ Interaction.signals.on('down', function (_ref6) { timer.duration = minDuration; timer.timeout = setTimeout(function () { fire({ - interaction: interaction, eventCopy: eventCopy, eventTarget: eventTarget, + interaction: interaction, + eventTarget: eventTarget, pointer: browser.isIE8 ? eventCopy : pointer, + event: eventCopy, type: 'hold' }); }, minDuration); @@ -6946,17 +6953,14 @@ module.exports = utils; var scope = require('../scope'); var utils = require('./index'); -var browser = require('./browser'); var finder = { - methodOrder: ['simulationResume', 'mouse', 'hasPointer', 'idle'], + methodOrder: ['simulationResume', 'mouseOrPen', 'hasPointer', 'idle'], search: function search(pointer, eventType, eventTarget) { - var mouseEvent = /mouse/i.test(pointer.pointerType || eventType) - // MSPointerEvent.MSPOINTER_TYPE_MOUSE - || pointer.pointerType === 4; + var pointerType = utils.getPointerType(pointer); var pointerId = utils.getPointerId(pointer); - var details = { pointer: pointer, pointerId: pointerId, mouseEvent: mouseEvent, eventType: eventType, eventTarget: eventTarget }; + var details = { pointer: pointer, pointerId: pointerId, pointerType: pointerType, eventType: eventType, eventTarget: eventTarget }; for (var _iterator = finder.methodOrder, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { var _ref; @@ -6982,7 +6986,7 @@ var finder = { // try to resume simulation with a new pointer simulationResume: function simulationResume(_ref2) { - var mouseEvent = _ref2.mouseEvent, + var pointerType = _ref2.pointerType, eventType = _ref2.eventType, eventTarget = _ref2.eventTarget; @@ -7006,7 +7010,7 @@ var finder = { var element = eventTarget; - if (interaction.simulation && interaction.simulation.allowResume && interaction.mouse === mouseEvent) { + if (interaction.simulation && interaction.simulation.allowResume && interaction.pointerType === pointerType) { while (element) { // if the element is the interaction element if (element === interaction.element) { @@ -7020,13 +7024,13 @@ var finder = { return null; }, - // if it's a mouse interaction - mouse: function mouse(_ref4) { + // if it's a mouse or pen interaction + mouseOrPen: function mouseOrPen(_ref4) { var pointerId = _ref4.pointerId, - mouseEvent = _ref4.mouseEvent, + pointerType = _ref4.pointerType, eventType = _ref4.eventType; - if (!mouseEvent && (browser.supportsTouch || browser.supportsPointerEvent)) { + if (pointerType !== 'mouse' && pointerType !== 'pen') { return null; } @@ -7046,7 +7050,7 @@ var finder = { var interaction = _ref5; - if (interaction.mouse) { + if (interaction.pointerType === pointerType) { // if it's a down event, skip interactions with running simulations if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; @@ -7069,8 +7073,8 @@ var finder = { return firstNonActive; } - // Find any interaction specifically for mouse. - // ignore the interaction if the eventType is a mousedown, and a simulation + // find any mouse or pen interaction. + // ignore the interaction if the eventType is a *down, and a simulation // is active for (var _iterator4 = scope.interactions, _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) { var _ref6; @@ -7086,7 +7090,7 @@ var finder = { var _interaction = _ref6; - if (_interaction.mouse && !(/down/.test(eventType) && _interaction.simulation)) { + if (_interaction.pointerType === pointerType && !(/down/i.test(eventType) && _interaction.simulation)) { return _interaction; } } @@ -7118,9 +7122,9 @@ var finder = { } }, - // get first idle interaction + // get first idle interaction with a matching pointerType idle: function idle(_ref9) { - var mouseEvent = _ref9.mouseEvent; + var pointerType = _ref9.pointerType; for (var _iterator6 = scope.interactions, _isArray6 = Array.isArray(_iterator6), _i6 = 0, _iterator6 = _isArray6 ? _iterator6 : _iterator6[Symbol.iterator]();;) { var _ref10; @@ -7150,7 +7154,7 @@ var finder = { continue; } - if (!interaction.interacting() && mouseEvent === interaction.mouse) { + if (!interaction.interacting() && pointerType === interaction.pointerType) { return interaction; } } @@ -7161,7 +7165,7 @@ var finder = { module.exports = finder; -},{"../scope":34,"./browser":37,"./index":44}],46:[function(require,module,exports){ +},{"../scope":34,"./index":44}],46:[function(require,module,exports){ 'use strict'; var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; @@ -7262,6 +7266,7 @@ var hypot = require('./hypot'); var browser = require('./browser'); var dom = require('./domObjects'); var domUtils = require('./domUtils'); +var domObjects = require('./domObjects'); var is = require('./is'); var pointerExtend = require('./pointerExtend'); @@ -7468,17 +7473,11 @@ var pointerUtils = { return angle; }, - getPointerType: function getPointerType(pointer, interaction) { - // if the PointerEvent API isn't available, then the pointer must be ither - // a MouseEvent or TouchEvent - if (interaction.mouse) { - return 'mouse'; - } - if (!browser.supportsPointerEvent) { - return 'touch'; - } - - return is.string(pointer.pointerType) ? pointer.pointerType : [undefined, undefined, 'touch', 'pen', 'mouse'][pointer.pointerType]; + getPointerType: function getPointerType(pointer) { + return is.string(pointer.pointerType) ? pointer.pointerType : is.number(pointer.pointerType) ? [undefined, undefined, 'touch', 'pen', 'mouse'][pointer.pointerType] + // if the PointerEvent API isn't available, then the "pointer" must + // be either a MouseEvent, TouchEvent, or Touch object + : /touch/.test(pointer.type) || pointer instanceof domObjects.Touch ? 'touch' : 'mouse'; }, // [ event.target, event.currentTarget ] diff --git a/dist/interact.js.map b/dist/interact.js.map index 60832b766..4f3a62ba8 100644 --- a/dist/interact.js.map +++ b/dist/interact.js.map @@ -1 +1 @@ -{"version":3,"sources":["src/header.js","node_modules/browser-pack/_prelude.js","index.js","src/Eventable.js","src/InteractEvent.js","src/Interactable.js","src/Interaction.js","src/actions/base.js","src/actions/drag.js","src/actions/drop.js","src/actions/gesture.js","src/actions/resize.js","src/autoScroll.js","src/autoStart/InteractableMethods.js","src/autoStart/base.js","src/autoStart/delay.js","src/autoStart/drag.js","src/autoStart/gesture.js","src/autoStart/resize.js","src/defaultOptions.js","src/index.js","src/inertia.js","src/interact.js","src/interactablePreventDefault.js","src/legacyBrowsers.js","src/modifiers/index.js","src/modifiers/restrict.js","src/modifiers/restrictEdges.js","src/modifiers/restrictSize.js","src/modifiers/snap.js","src/modifiers/snapSize.js","src/pointerEvents/PointerEvent.js","src/pointerEvents/base.js","src/pointerEvents/holdRepeat.js","src/pointerEvents/interactableTargets.js","src/scope.js","src/utils/Signals.js","src/utils/arr.js","src/utils/browser.js","src/utils/domObjects.js","src/utils/domUtils.js","src/utils/events.js","src/utils/extend.js","src/utils/getOriginXY.js","src/utils/hypot.js","src/utils/index.js","src/utils/interactionFinder.js","src/utils/is.js","src/utils/isWindow.js","src/utils/pointerExtend.js","src/utils/pointerUtils.js","src/utils/raf.js","src/utils/rect.js","src/utils/window.js"],"names":[],"mappings":"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","file":"interact.js","sourceRoot":"","sourcesContent":["/**\n * interact.js v1.3.0-alpha.3+sha.9595c40\n *\n * Copyright (c) 2012-2017 Taye Adeyemi \n * Open source under the MIT License.\n * https://raw.github.com/taye/interact.js/master/LICENSE\n */\n","(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o 150) {\n return null;\n }\n\n let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI;\n const overlap = 22.5;\n\n if (angle < 0) {\n angle += 360;\n }\n\n const left = 135 - overlap <= angle && angle < 225 + overlap;\n const up = 225 - overlap <= angle && angle < 315 + overlap;\n\n const right = !left && (315 - overlap <= angle || angle < 45 + overlap);\n const down = !up && 45 - overlap <= angle && angle < 135 + overlap;\n\n return {\n up,\n down,\n left,\n right,\n angle,\n speed: interaction.prevEvent.speed,\n velocity: {\n x: interaction.prevEvent.velocityX,\n y: interaction.prevEvent.velocityY,\n },\n };\n }\n\n preventDefault () {}\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n}\n\nsignals.on('set-delta', function ({ iEvent, interaction, starting, deltaSource }) {\n const prevEvent = starting? iEvent : interaction.prevEvent;\n\n if (deltaSource === 'client') {\n iEvent.dx = iEvent.clientX - prevEvent.clientX;\n iEvent.dy = iEvent.clientY - prevEvent.clientY;\n }\n else {\n iEvent.dx = iEvent.pageX - prevEvent.pageX;\n iEvent.dy = iEvent.pageY - prevEvent.pageY;\n }\n});\n\nInteractEvent.signals = signals;\n\nmodule.exports = InteractEvent;\n","const is = require('./utils/is');\nconst events = require('./utils/events');\nconst extend = require('./utils/extend');\nconst actions = require('./actions/base');\nconst scope = require('./scope');\nconst Eventable = require('./Eventable');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nconst {\n getElementRect,\n nodeContains,\n trySelector,\n} = require('./utils/domUtils');\nconst { getWindow } = require('./utils/window');\nconst { indexOf, contains } = require('./utils/arr');\nconst { wheelEvent } = require('./utils/browser');\n\n// all set interactables\nscope.interactables = [];\n\n/*\\\n * Interactable\n [ property ]\n **\n * Object type returned by @interact\n\\*/\nclass Interactable {\n constructor (target, options) {\n options = options || {};\n\n this.target = target;\n this.events = new Eventable();\n this._context = options.context || scope.document;\n this._win = getWindow(trySelector(target)? this._context : target);\n this._doc = this._win.document;\n\n signals.fire('new', {\n target,\n options,\n interactable: this,\n win: this._win,\n });\n\n scope.addDocument( this._doc, this._win );\n\n scope.interactables.push(this);\n\n this.set(options);\n }\n\n setOnEvents (action, phases) {\n const onAction = 'on' + action;\n\n if (is.function(phases.onstart) ) { this.events[onAction + 'start' ] = phases.onstart ; }\n if (is.function(phases.onmove) ) { this.events[onAction + 'move' ] = phases.onmove ; }\n if (is.function(phases.onend) ) { this.events[onAction + 'end' ] = phases.onend ; }\n if (is.function(phases.oninertiastart)) { this.events[onAction + 'inertiastart' ] = phases.oninertiastart ; }\n\n return this;\n }\n\n setPerAction (action, options) {\n // for all the default per-action options\n for (const option in options) {\n // if this option exists for this action\n if (option in defaults[action]) {\n // if the option in the options arg is an object value\n if (is.object(options[option])) {\n // duplicate the object\n this.options[action][option] = extend(this.options[action][option] || {}, options[option]);\n\n if (is.object(defaults.perAction[option]) && 'enabled' in defaults.perAction[option]) {\n this.options[action][option].enabled = options[option].enabled === false? false : true;\n }\n }\n else if (is.bool(options[option]) && is.object(defaults.perAction[option])) {\n this.options[action][option].enabled = options[option];\n }\n else if (options[option] !== undefined) {\n // or if it's not undefined, do a plain assignment\n this.options[action][option] = options[option];\n }\n }\n }\n }\n\n /*\\\n * Interactable.getRect\n [ method ]\n *\n * The default function to get an Interactables bounding rect. Can be\n * overridden using @Interactable.rectChecker.\n *\n - element (Element) #optional The element to measure.\n = (object) The object's bounding rectangle.\n o {\n o top : 0,\n o left : 0,\n o bottom: 0,\n o right : 0,\n o width : 0,\n o height: 0\n o }\n \\*/\n getRect (element) {\n element = element || this.target;\n\n if (is.string(this.target) && !(is.element(element))) {\n element = this._context.querySelector(this.target);\n }\n\n return getElementRect(element);\n }\n\n /*\\\n * Interactable.rectChecker\n [ method ]\n *\n * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n - checker (function) #optional A function which returns this Interactable's bounding rectangle. See @Interactable.getRect\n = (function | object) The checker function or this Interactable\n \\*/\n rectChecker (checker) {\n if (is.function(checker)) {\n this.getRect = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.getRect;\n\n return this;\n }\n\n return this.getRect;\n }\n\n _backCompatOption (optionName, newValue) {\n if (trySelector(newValue) || is.object(newValue)) {\n this.options[optionName] = newValue;\n\n for (const action of actions.names) {\n this.options[action][optionName] = newValue;\n }\n\n return this;\n }\n\n return this.options[optionName];\n }\n\n /*\\\n * Interactable.origin\n [ method ]\n *\n * Gets or sets the origin of the Interactable's element. The x and y\n * of the origin will be subtracted from action event coordinates.\n *\n - origin (object | string) #optional An object eg. { x: 0, y: 0 } or string 'parent', 'self' or any CSS selector\n * OR\n - origin (Element) #optional An HTML or SVG Element whose rect will be used\n **\n = (object) The current origin or this Interactable\n \\*/\n origin (newValue) {\n return this._backCompatOption('origin', newValue);\n }\n\n /*\\\n * Interactable.deltaSource\n [ method ]\n *\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n - newValue (string) #optional Use 'client' if you will be scrolling while interacting; Use 'page' if you want autoScroll to work\n = (string | object) The current deltaSource or this Interactable\n \\*/\n deltaSource (newValue) {\n if (newValue === 'page' || newValue === 'client') {\n this.options.deltaSource = newValue;\n\n return this;\n }\n\n return this.options.deltaSource;\n }\n\n /*\\\n * Interactable.context\n [ method ]\n *\n * Gets the selector context Node of the Interactable. The default is `window.document`.\n *\n = (Node) The context Node of this Interactable\n **\n \\*/\n context () {\n return this._context;\n }\n\n inContext (element) {\n return (this._context === element.ownerDocument\n || nodeContains(this._context, element));\n }\n\n /*\\\n * Interactable.fire\n [ method ]\n *\n * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n - iEvent (InteractEvent) The InteractEvent object to be fired on this Interactable\n = (Interactable) this Interactable\n \\*/\n fire (iEvent) {\n this.events.fire(iEvent);\n\n return this;\n }\n\n _onOffMultiple (method, eventType, listener, options) {\n if (is.string(eventType) && eventType.search(' ') !== -1) {\n eventType = eventType.trim().split(/ +/);\n }\n\n if (is.array(eventType)) {\n for (let i = 0; i < eventType.length; i++) {\n this[method](eventType[i], listener, options);\n }\n\n return true;\n }\n\n if (is.object(eventType)) {\n for (const prop in eventType) {\n this[method](prop, eventType[prop], listener);\n }\n\n return true;\n }\n }\n\n /*\\\n * Interactable.on\n [ method ]\n *\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n - eventType (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) This Interactable\n \\*/\n on (eventType, listener, options) {\n if (this._onOffMultiple('on', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.on(eventType, listener);\n }\n // delegated event for selector\n else if (is.string(this.target)) {\n events.addDelegate(this.target, this._context, eventType, listener, options);\n }\n else {\n events.add(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.off\n [ method ]\n *\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n - eventType (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) This Interactable\n \\*/\n off (eventType, listener, options) {\n if (this._onOffMultiple('off', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n // if it is an action event type\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.off(eventType, listener);\n }\n // delegated event\n else if (is.string(this.target)) {\n events.removeDelegate(this.target, this._context, eventType, listener, options);\n }\n // remove listener from this Interatable's element\n else {\n events.remove(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.set\n [ method ]\n *\n * Reset the options of this Interactable\n - options (object) The new settings to apply\n = (object) This Interactable\n \\*/\n set (options) {\n if (!is.object(options)) {\n options = {};\n }\n\n this.options = extend({}, defaults.base);\n\n const perActions = extend({}, defaults.perAction);\n\n for (const actionName in actions.methodDict) {\n const methodName = actions.methodDict[actionName];\n\n this.options[actionName] = extend({}, defaults[actionName]);\n\n this.setPerAction(actionName, perActions);\n\n this[methodName](options[actionName]);\n }\n\n for (const setting of Interactable.settingsMethods) {\n this.options[setting] = defaults.base[setting];\n\n if (setting in options) {\n this[setting](options[setting]);\n }\n }\n\n signals.fire('set', {\n options,\n interactable: this,\n });\n\n return this;\n }\n\n /*\\\n * Interactable.unset\n [ method ]\n *\n * Remove this interactable from the list of interactables and remove\n * it's action capabilities and event listeners\n *\n = (object) @interact\n \\*/\n unset () {\n events.remove(this.target, 'all');\n\n if (is.string(this.target)) {\n // remove delegated events\n for (const type in events.delegatedEvents) {\n const delegated = events.delegatedEvents[type];\n\n if (delegated.selectors[0] === this.target\n && delegated.contexts[0] === this._context) {\n\n delegated.selectors.splice(0, 1);\n delegated.contexts .splice(0, 1);\n delegated.listeners.splice(0, 1);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegated[type] = null;\n }\n }\n\n events.remove(this._context, type, events.delegateListener);\n events.remove(this._context, type, events.delegateUseCapture, true);\n }\n }\n else {\n events.remove(this, 'all');\n }\n\n signals.fire('unset', { interactable: this });\n\n scope.interactables.splice(indexOf(scope.interactables, this), 1);\n\n // Stop related interactions when an Interactable is unset\n for (const interaction of scope.interactions || []) {\n if (interaction.target === this && interaction.interacting()) {\n interaction.stop();\n }\n }\n\n return scope.interact;\n }\n}\n\nscope.interactables.indexOfElement = function indexOfElement (target, context) {\n context = context || scope.document;\n\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n if (interactable.target === target && interactable._context === context) {\n return i;\n }\n }\n return -1;\n};\n\nscope.interactables.get = function interactableGet (element, options, dontCheckInContext) {\n const ret = this[this.indexOfElement(element, options && options.context)];\n\n return ret && (is.string(element) || dontCheckInContext || ret.inContext(element))? ret : null;\n};\n\nscope.interactables.forEachSelector = function (callback, element) {\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n // skip non CSS selector targets and out of context elements\n if (!is.string(interactable.target)\n || (element && !interactable.inContext(element))) {\n continue;\n }\n\n const ret = callback(interactable, interactable.target, interactable._context, i, this);\n\n if (ret !== undefined) {\n return ret;\n }\n }\n};\n\n// all interact.js eventTypes\nInteractable.eventTypes = scope.eventTypes = [];\n\nInteractable.signals = signals;\n\nInteractable.settingsMethods = [ 'deltaSource', 'origin', 'preventDefault', 'rectChecker' ];\n\nmodule.exports = Interactable;\n","const scope = require('./scope');\nconst utils = require('./utils');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst finder = require('./utils/interactionFinder');\nconst signals = require('./utils/Signals').new();\n\nconst listeners = {};\nconst methodNames = [\n 'pointerDown', 'pointerMove', 'pointerUp',\n 'updatePointer', 'removePointer',\n];\n\n// for ignoring browser's simulated mouse events\nlet prevTouchTime = 0;\n\n// all active and idle interactions\nscope.interactions = [];\n\nclass Interaction {\n constructor () {\n this.target = null; // current interactable being interacted with\n this.element = null; // the target element of the interactable\n\n this.prepared = { // action that's ready to be fired on next move event\n name : null,\n axis : null,\n edges: null,\n };\n\n // keep track of added pointers\n this.pointers = [];\n this.pointerIds = [];\n this.downTargets = [];\n this.downTimes = [];\n\n // Previous native pointer move event coordinates\n this.prevCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n // current native pointer move event coordinates\n this.curCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Starting InteractEvent pointer coordinates\n this.startCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Change in coordinates and time of the pointer\n this.pointerDelta = {\n page : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n client : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n timeStamp: 0,\n };\n\n this.downEvent = null; // pointerdown/mousedown/touchstart event\n this.downPointer = {};\n\n this._eventTarget = null;\n this._curEventTarget = null;\n\n this.prevEvent = null; // previous action event\n\n this.pointerIsDown = false;\n this.pointerWasMoved = false;\n this._interacting = false;\n\n this.mouse = false;\n\n signals.fire('new', this);\n\n scope.interactions.push(this);\n }\n\n pointerDown (pointer, event, eventTarget) {\n const pointerIndex = this.updatePointer(pointer, event, true);\n\n signals.fire('down', {\n pointer,\n event,\n eventTarget,\n pointerIndex,\n interaction: this,\n });\n }\n\n /*\\\n * Interaction.start\n [ method ]\n *\n * Start an action with the given Interactable and Element as tartgets. The\n * action must be enabled for the target Interactable and an appropriate number\n * of pointers must be held down - 1 for drag/resize, 2 for gesture.\n *\n * Use it with `interactable.able({ manualStart: false })` to always\n * [start actions manually](https://github.com/taye/interact.js/issues/114)\n *\n - action (object) The action to be performed - drag, resize, etc.\n - target (Interactable) The Interactable to target\n - element (Element) The DOM Element to target\n = (object) interact\n **\n | interact(target)\n | .draggable({\n | // disable the default drag start by down->move\n | manualStart: true\n | })\n | // start dragging after the user holds the pointer down\n | .on('hold', function (event) {\n | var interaction = event.interaction;\n |\n | if (!interaction.interacting()) {\n | interaction.start({ name: 'drag' },\n | event.interactable,\n | event.currentTarget);\n | }\n | });\n \\*/\n start (action, target, element) {\n if (this.interacting()\n || !this.pointerIsDown\n || this.pointerIds.length < (action.name === 'gesture'? 2 : 1)) {\n return;\n }\n\n // if this interaction had been removed after stopping\n // add it back\n if (utils.indexOf(scope.interactions, this) === -1) {\n scope.interactions.push(this);\n }\n\n utils.copyAction(this.prepared, action);\n this.target = target;\n this.element = element;\n\n signals.fire('action-start', {\n interaction: this,\n event: this.downEvent,\n });\n }\n\n pointerMove (pointer, event, eventTarget) {\n if (!this.simulation) {\n this.updatePointer(pointer);\n utils.setCoords(this.curCoords, this.pointers);\n }\n\n const duplicateMove = (this.curCoords.page.x === this.prevCoords.page.x\n && this.curCoords.page.y === this.prevCoords.page.y\n && this.curCoords.client.x === this.prevCoords.client.x\n && this.curCoords.client.y === this.prevCoords.client.y);\n\n let dx;\n let dy;\n\n // register movement greater than pointerMoveTolerance\n if (this.pointerIsDown && !this.pointerWasMoved) {\n dx = this.curCoords.client.x - this.startCoords.client.x;\n dy = this.curCoords.client.y - this.startCoords.client.y;\n\n this.pointerWasMoved = utils.hypot(dx, dy) > Interaction.pointerMoveTolerance;\n }\n\n const signalArg = {\n pointer,\n pointerIndex: this.getPointerIndex(pointer),\n event,\n eventTarget,\n dx,\n dy,\n duplicate: duplicateMove,\n interaction: this,\n interactingBeforeMove: this.interacting(),\n };\n\n if (!duplicateMove) {\n // set pointer coordinate, time changes and speeds\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n }\n\n signals.fire('move', signalArg);\n\n if (!duplicateMove) {\n // if interacting, fire an 'action-move' signal etc\n if (this.interacting()) {\n this.doMove(signalArg);\n }\n\n if (this.pointerWasMoved) {\n utils.copyCoords(this.prevCoords, this.curCoords);\n }\n }\n }\n\n /*\\\n * Interaction.doMove\n [ method ]\n *\n * Force a move of the current action at the same coordinates. Useful if\n * snap/restrict has been changed and you want a movement with the new\n * settings.\n *\n **\n | interact(target)\n | .draggable(true)\n | .on('dragmove', function (event) {\n | if (someCondition) {\n | // change the snap settings\n | event.interactable.draggable({ snap: { targets: [] }});\n | // fire another move event with re-calculated snap\n | event.interaction.doMove();\n | }\n | });\n \\*/\n doMove (signalArg) {\n signalArg = utils.extend({\n pointer: this.pointers[0],\n event: this.prevEvent,\n eventTarget: this._eventTarget,\n interaction: this,\n }, signalArg || {});\n\n signals.fire('before-action-move', signalArg);\n\n if (!this._dontFireMove) {\n signals.fire('action-move', signalArg);\n }\n\n this._dontFireMove = false;\n }\n\n // End interact move events and stop auto-scroll unless simulation is running\n pointerUp (pointer, event, eventTarget, curEventTarget) {\n const pointerIndex = this.getPointerIndex(pointer);\n\n signals.fire(/cancel$/i.test(event.type)? 'cancel' : 'up', {\n pointer,\n pointerIndex,\n event,\n eventTarget,\n curEventTarget,\n interaction: this,\n });\n\n if (!this.simulation) {\n this.end(event);\n }\n\n this.pointerIsDown = false;\n this.removePointer(pointer, event);\n }\n\n /*\\\n * Interaction.end\n [ method ]\n *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n - event (PointerEvent) #optional\n **\n | interact(target)\n | .draggable(true)\n | .on('move', function (event) {\n | if (event.pageX > 1000) {\n | // end the current action\n | event.interaction.end();\n | // stop all further listeners from being called\n | event.stopImmediatePropagation();\n | }\n | });\n \\*/\n end (event) {\n event = event || this.prevEvent;\n\n if (this.interacting()) {\n signals.fire('action-end', {\n event,\n interaction: this,\n });\n }\n\n this.stop();\n }\n\n currentAction () {\n return this._interacting? this.prepared.name: null;\n }\n\n interacting () {\n return this._interacting;\n }\n\n stop () {\n signals.fire('stop', { interaction: this });\n\n if (this._interacting) {\n signals.fire('stop-active', { interaction: this });\n signals.fire('stop-' + this.prepared.name, { interaction: this });\n }\n\n this.target = this.element = null;\n\n this._interacting = false;\n this.prepared.name = this.prevEvent = null;\n }\n\n getPointerIndex (pointer) {\n return utils.indexOf(this.pointerIds, utils.getPointerId(pointer));\n }\n\n updatePointer (pointer, event, down = event && /(down|start)$/i.test(event.type)) {\n const id = utils.getPointerId(pointer);\n let index = this.getPointerIndex(pointer);\n\n if (index === -1) {\n index = this.pointerIds.length;\n this.pointerIds[index] = id;\n }\n\n if (down) {\n signals.fire('update-pointer-down', {\n pointer,\n event,\n down,\n pointerId: id,\n pointerIndex: index,\n interaction: this,\n });\n }\n\n this.pointers[index] = pointer;\n\n return index;\n }\n\n removePointer (pointer, event) {\n const id = utils.getPointerId(pointer);\n const index = this.mouse? 0 : utils.indexOf(this.pointerIds, id);\n\n if (index === -1) { return; }\n\n signals.fire('remove-pointer', {\n pointer,\n event,\n pointerIndex: index,\n interaction: this,\n });\n\n this.pointers .splice(index, 1);\n this.pointerIds .splice(index, 1);\n this.downTargets.splice(index, 1);\n this.downTimes .splice(index, 1);\n }\n\n _updateEventTargets (target, currentTarget) {\n this._eventTarget = target;\n this._curEventTarget = currentTarget;\n }\n}\n\nfor (let i = 0, len = methodNames.length; i < len; i++) {\n const method = methodNames[i];\n\n listeners[method] = doOnInteractions(method);\n}\n\nfunction doOnInteractions (method) {\n return (function (event) {\n const [eventTarget, curEventTarget] = utils.getEventTargets(event);\n const matches = []; // [ [pointer, interaction], ...]\n\n if (browser.supportsTouch && /touch/.test(event.type)) {\n prevTouchTime = new Date().getTime();\n\n for (let i = 0; i < event.changedTouches.length; i++) {\n const pointer = event.changedTouches[i];\n const interaction = finder.search(pointer, event.type, eventTarget);\n\n matches.push([pointer, interaction || new Interaction()]);\n }\n }\n else {\n let invalidPointer = false;\n\n if (!browser.supportsPointerEvent && /mouse/.test(event.type)) {\n // ignore mouse events while touch interactions are active\n for (let i = 0; i < scope.interactions.length && !invalidPointer; i++) {\n invalidPointer = !scope.interactions[i].mouse && scope.interactions[i].pointerIsDown;\n }\n\n // try to ignore mouse events that are simulated by the browser\n // after a touch event\n invalidPointer = invalidPointer\n || (new Date().getTime() - prevTouchTime < 500)\n // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated\n || event.timeStamp === 0;\n }\n\n if (!invalidPointer) {\n let interaction = finder.search(event, event.type, eventTarget);\n\n if (!interaction) {\n\n interaction = new Interaction();\n interaction.mouse = (/mouse/i.test(event.pointerType || event.type)\n // MSPointerEvent.MSPOINTER_TYPE_MOUSE\n || event.pointerType === 4\n || !event.pointerType);\n }\n\n matches.push([event, interaction]);\n }\n }\n\n for (const [pointer, interaction] of matches) {\n interaction._updateEventTargets(eventTarget, curEventTarget);\n interaction[method](pointer, event, eventTarget, curEventTarget);\n }\n });\n}\n\nfunction endAll (event) {\n for (let i = 0; i < scope.interactions.length; i++) {\n const interaction = scope.interactions[i];\n\n interaction.end(event);\n signals.fire('endall', { event, interaction });\n }\n}\n\nconst docEvents = { /* 'eventType': listenerFunc */ };\nconst pEventTypes = browser.pEventTypes;\n\nif (scope.PointerEvent) {\n docEvents[pEventTypes.down ] = listeners.pointerDown;\n docEvents[pEventTypes.move ] = listeners.pointerMove;\n docEvents[pEventTypes.up ] = listeners.pointerUp;\n docEvents[pEventTypes.cancel] = listeners.pointerUp;\n}\nelse {\n docEvents.mousedown = listeners.pointerDown;\n docEvents.mousemove = listeners.pointerMove;\n docEvents.mouseup = listeners.pointerUp;\n\n docEvents.touchstart = listeners.pointerDown;\n docEvents.touchmove = listeners.pointerMove;\n docEvents.touchend = listeners.pointerUp;\n docEvents.touchcancel = listeners.pointerUp;\n}\n\ndocEvents.blur = endAll;\n\nfunction onDocSignal ({ doc }, signalName) {\n const eventMethod = signalName.indexOf('add') === 0\n ? events.add : events.remove;\n\n // delegate event listener\n for (const eventType in scope.delegatedEvents) {\n eventMethod(doc, eventType, events.delegateListener);\n eventMethod(doc, eventType, events.delegateUseCapture, true);\n }\n\n for (const eventType in docEvents) {\n eventMethod(doc, eventType, docEvents[eventType]);\n }\n}\n\nsignals.on('update-pointer-down', ({ interaction, pointer, pointerId, pointerIndex, event, eventTarget, down }) => {\n interaction.pointerIds[pointerIndex] = pointerId;\n interaction.pointers[pointerIndex] = pointer;\n\n if (down) {\n interaction.pointerIsDown = true;\n }\n\n if (!interaction.interacting()) {\n utils.setCoords(interaction.startCoords, interaction.pointers);\n\n utils.copyCoords(interaction.curCoords , interaction.startCoords);\n utils.copyCoords(interaction.prevCoords, interaction.startCoords);\n\n interaction.downEvent = event;\n interaction.downTimes[pointerIndex] = interaction.curCoords.timeStamp;\n interaction.downTargets[pointerIndex] = eventTarget || event && utils.getEventTargets(event)[0];\n interaction.pointerWasMoved = false;\n\n utils.pointerExtend(interaction.downPointer, pointer);\n }\n});\n\nscope.signals.on('add-document' , onDocSignal);\nscope.signals.on('remove-document', onDocSignal);\n\nInteraction.pointerMoveTolerance = 1;\nInteraction.doOnInteractions = doOnInteractions;\nInteraction.endAll = endAll;\nInteraction.signals = signals;\nInteraction.docEvents = docEvents;\n\nscope.endAllInteractions = endAll;\n\nmodule.exports = Interaction;\n","const Interaction = require('../Interaction');\nconst InteractEvent = require('../InteractEvent');\n\nconst actions = {\n firePrepared,\n names: [],\n methodDict: {},\n};\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n interaction._interacting = true;\n firePrepared(interaction, event, 'start');\n});\n\nInteraction.signals.on('action-move', function ({ interaction, event, preEnd }) {\n firePrepared(interaction, event, 'move', preEnd);\n\n // if the action was ended in a listener\n if (!interaction.interacting()) { return false; }\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n firePrepared(interaction, event, 'end');\n});\n\nfunction firePrepared (interaction, event, phase, preEnd) {\n const actionName = interaction.prepared.name;\n\n const newEvent = new InteractEvent(interaction, event, actionName, phase, interaction.element, null, preEnd);\n\n interaction.target.fire(newEvent);\n interaction.prevEvent = newEvent;\n}\n\nmodule.exports = actions;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drag = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n startAxis : 'xy',\n lockAxis : 'xy',\n },\n\n checker: function (pointer, event, interactable) {\n const dragOptions = interactable.options.drag;\n\n return dragOptions.enabled\n ? { name: 'drag', axis: (dragOptions.lockAxis === 'start'\n ? dragOptions.startAxis\n : dragOptions.lockAxis)}\n : null;\n },\n\n getCursor: function () {\n return 'move';\n },\n};\n\nInteraction.signals.on('before-action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n interaction.curCoords.page.y = interaction.startCoords.page.y;\n interaction.curCoords.client.y = interaction.startCoords.client.y;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vx);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vx);\n interaction.pointerDelta.client.vy = 0;\n interaction.pointerDelta.page.vy = 0;\n }\n else if (axis === 'y') {\n interaction.curCoords.page.x = interaction.startCoords.page.x;\n interaction.curCoords.client.x = interaction.startCoords.client.x;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vy);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vy);\n interaction.pointerDelta.client.vx = 0;\n interaction.pointerDelta.page.vx = 0;\n }\n});\n\n// dragmove\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'dragmove') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n iEvent.pageY = interaction.startCoords.page.y;\n iEvent.clientY = interaction.startCoords.client.y;\n iEvent.dy = 0;\n }\n else if (axis === 'y') {\n iEvent.pageX = interaction.startCoords.page.x;\n iEvent.clientX = interaction.startCoords.client.x;\n iEvent.dx = 0;\n }\n});\n\n/*\\\n * Interactable.draggable\n [ method ]\n *\n * Gets or sets whether drag actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of drag events\n | var isDraggable = interact('ul li').draggable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on drag events (object makes the Interactable draggable)\n = (object) This Interactable\n | interact(element).draggable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // the axis in which the first movement must be\n | // for the drag sequence to start\n | // 'xy' by default - any direction\n | startAxis: 'x' || 'y' || 'xy',\n |\n | // 'xy' by default - don't restrict to one axis (move in any direction)\n | // 'x' or 'y' to restrict movement to either axis\n | // 'start' to restrict movement to the axis the drag started in\n | lockAxis: 'x' || 'y' || 'xy' || 'start',\n |\n | // max number of drags that can happen concurrently\n | // with elements of this Interactable. Infinity by default\n | max: Infinity,\n |\n | // max number of drags that can target the same element+Interactable\n | // 1 by default\n | maxPerElement: 2\n | });\n\\*/\nInteractable.prototype.draggable = function (options) {\n if (utils.is.object(options)) {\n this.options.drag.enabled = options.enabled === false? false: true;\n this.setPerAction('drag', options);\n this.setOnEvents('drag', options);\n\n if (/^(xy|x|y|start)$/.test(options.lockAxis)) {\n this.options.drag.lockAxis = options.lockAxis;\n }\n if (/^(xy|x|y)$/.test(options.startAxis)) {\n this.options.drag.startAxis = options.startAxis;\n }\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drag.enabled = options;\n\n if (!options) {\n this.ondragstart = this.ondragstart = this.ondragend = null;\n }\n\n return this;\n }\n\n return this.options.drag;\n};\n\nactions.drag = drag;\nactions.names.push('drag');\nutils.merge(Interactable.eventTypes, [\n 'dragstart',\n 'dragmove',\n 'draginertiastart',\n 'draginertiaresume',\n 'dragend',\n]);\nactions.methodDict.drag = 'draggable';\n\ndefaultOptions.drag = drag.defaults;\n\nmodule.exports = drag;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst scope = require('../scope');\nconst interact = require('../interact');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drop = {\n defaults: {\n enabled: false,\n accept : null,\n overlap: 'pointer',\n },\n};\n\nlet dynamicDrop = false;\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // reset active dropzones\n interaction.activeDrops.dropzones = [];\n interaction.activeDrops.elements = [];\n interaction.activeDrops.rects = [];\n\n interaction.dropEvents = null;\n\n if (!interaction.dynamicDrop) {\n setActiveDrops(interaction, interaction.element);\n }\n\n const dragEvent = interaction.prevEvent;\n const dropEvents = getDropEvents(interaction, event, dragEvent);\n\n if (dropEvents.activate) {\n fireActiveDrops(interaction, dropEvents.activate);\n }\n});\n\nInteractEvent.signals.on('new', function ({ interaction, iEvent, event }) {\n if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { return; }\n\n const draggableElement = interaction.element;\n const dragEvent = iEvent;\n const dropResult = getDrop(dragEvent, event, draggableElement);\n\n interaction.dropTarget = dropResult.dropzone;\n interaction.dropElement = dropResult.element;\n\n interaction.dropEvents = getDropEvents(interaction, event, dragEvent);\n});\n\nInteraction.signals.on('action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n fireDropEvents(interaction, interaction.dropEvents);\n});\n\nInteraction.signals.on('action-end', function ({ interaction }) {\n if (interaction.prepared.name === 'drag') {\n fireDropEvents(interaction, interaction.dropEvents);\n }\n});\n\nInteraction.signals.on('stop-drag', function ({ interaction }) {\n interaction.activeDrops.dropzones =\n interaction.activeDrops.elements =\n interaction.activeDrops.rects =\n interaction.dropEvents = null;\n});\n\nfunction collectDrops (interaction, element) {\n const drops = [];\n const elements = [];\n\n element = element || interaction.element;\n\n // collect all dropzones and their elements which qualify for a drop\n for (const current of scope.interactables) {\n if (!current.options.drop.enabled) { continue; }\n\n const accept = current.options.drop.accept;\n\n // test the draggable element against the dropzone's accept setting\n if ((utils.is.element(accept) && accept !== element)\n || (utils.is.string(accept)\n && !utils.matchesSelector(element, accept))) {\n\n continue;\n }\n\n // query for new elements if necessary\n const dropElements = utils.is.string(current.target)\n ? current._context.querySelectorAll(current.target)\n : [current.target];\n\n for (let i = 0; i < dropElements.length; i++) {\n const currentElement = dropElements[i];\n\n if (currentElement !== element) {\n drops.push(current);\n elements.push(currentElement);\n }\n }\n }\n\n return {\n elements,\n dropzones: drops,\n };\n}\n\nfunction fireActiveDrops (interaction, event) {\n let prevElement;\n\n // loop through all active dropzones and trigger event\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n const current = interaction.activeDrops.dropzones[i];\n const currentElement = interaction.activeDrops.elements [i];\n\n // prevent trigger of duplicate events on same element\n if (currentElement !== prevElement) {\n // set current element as event target\n event.target = currentElement;\n current.fire(event);\n }\n prevElement = currentElement;\n }\n}\n\n// Collect a new set of possible drops and save them in activeDrops.\n// setActiveDrops should always be called when a drag has just started or a\n// drag event happens while dynamicDrop is true\nfunction setActiveDrops (interaction, dragElement) {\n // get dropzones and their elements that could receive the draggable\n const possibleDrops = collectDrops(interaction, dragElement, true);\n\n interaction.activeDrops.dropzones = possibleDrops.dropzones;\n interaction.activeDrops.elements = possibleDrops.elements;\n interaction.activeDrops.rects = [];\n\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n interaction.activeDrops.rects[i] =\n interaction.activeDrops.dropzones[i].getRect(interaction.activeDrops.elements[i]);\n }\n}\n\nfunction getDrop (dragEvent, event, dragElement) {\n const interaction = dragEvent.interaction;\n const validDrops = [];\n\n if (dynamicDrop) {\n setActiveDrops(interaction, dragElement);\n }\n\n // collect all dropzones and their elements which qualify for a drop\n for (let j = 0; j < interaction.activeDrops.dropzones.length; j++) {\n const current = interaction.activeDrops.dropzones[j];\n const currentElement = interaction.activeDrops.elements [j];\n const rect = interaction.activeDrops.rects [j];\n\n validDrops.push(current.dropCheck(dragEvent, event, interaction.target, dragElement, currentElement, rect)\n ? currentElement\n : null);\n }\n\n // get the most appropriate dropzone based on DOM depth and order\n const dropIndex = utils.indexOfDeepestElement(validDrops);\n\n return {\n dropzone: interaction.activeDrops.dropzones[dropIndex] || null,\n element : interaction.activeDrops.elements [dropIndex] || null,\n };\n}\n\nfunction getDropEvents (interaction, pointerEvent, dragEvent) {\n const dropEvents = {\n enter : null,\n leave : null,\n activate : null,\n deactivate: null,\n move : null,\n drop : null,\n };\n\n const tmpl = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n };\n\n if (interaction.dropElement !== interaction.prevDropElement) {\n // if there was a prevDropTarget, create a dragleave event\n if (interaction.prevDropTarget) {\n dropEvents.leave = utils.extend({ type: 'dragleave' }, tmpl);\n\n dragEvent.dragLeave = dropEvents.leave.target = interaction.prevDropElement;\n dragEvent.prevDropzone = dropEvents.leave.dropzone = interaction.prevDropTarget;\n }\n // if the dropTarget is not null, create a dragenter event\n if (interaction.dropTarget) {\n dropEvents.enter = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n type : 'dragenter',\n };\n\n dragEvent.dragEnter = interaction.dropElement;\n dragEvent.dropzone = interaction.dropTarget;\n }\n }\n\n if (dragEvent.type === 'dragend' && interaction.dropTarget) {\n dropEvents.drop = utils.extend({ type: 'drop' }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n dragEvent.relatedTarget = interaction.dropElement;\n }\n if (dragEvent.type === 'dragstart') {\n dropEvents.activate = utils.extend({ type: 'dropactivate' }, tmpl);\n\n dropEvents.activate.target = null;\n dropEvents.activate.dropzone = null;\n }\n if (dragEvent.type === 'dragend') {\n dropEvents.deactivate = utils.extend({ type: 'dropdeactivate' }, tmpl);\n\n dropEvents.deactivate.target = null;\n dropEvents.deactivate.dropzone = null;\n }\n if (dragEvent.type === 'dragmove' && interaction.dropTarget) {\n dropEvents.move = utils.extend({\n dragmove : dragEvent,\n type : 'dropmove',\n }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n }\n\n return dropEvents;\n}\n\nfunction fireDropEvents (interaction, dropEvents) {\n if (dropEvents.leave) { interaction.prevDropTarget.fire(dropEvents.leave); }\n if (dropEvents.move ) { interaction.dropTarget.fire(dropEvents.move ); }\n if (dropEvents.enter) { interaction.dropTarget.fire(dropEvents.enter); }\n if (dropEvents.drop ) { interaction.dropTarget.fire(dropEvents.drop ); }\n if (dropEvents.deactivate) {\n fireActiveDrops(interaction, dropEvents.deactivate);\n }\n\n interaction.prevDropTarget = interaction.dropTarget;\n interaction.prevDropElement = interaction.dropElement;\n}\n\n/*\\\n * Interactable.dropzone\n [ method ]\n *\n * Returns or sets whether elements can be dropped onto this\n * Interactable to trigger drop events\n *\n * Dropzones can receive the following events:\n * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends\n * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone\n * - `dragmove` when a draggable that has entered the dropzone is moved\n * - `drop` when a draggable is dropped into this dropzone\n *\n * Use the `accept` option to allow only elements that match the given CSS\n * selector or element. The value can be:\n *\n * - **an Element** - only that element can be dropped into this dropzone.\n * - **a string**, - the element being dragged must match it as a CSS selector.\n * - **`null`** - accept options is cleared - it accepts any element.\n *\n * Use the `overlap` option to set how drops are checked for. The allowed\n * values are:\n *\n * - `'pointer'`, the pointer must be over the dropzone (default)\n * - `'center'`, the draggable element's center must be over the dropzone\n * - a number from 0-1 which is the `(intersection area) / (draggable area)`.\n * e.g. `0.5` for drop to happen when half of the area of the draggable is\n * over the dropzone\n *\n * Use the `checker` option to specify a function to check if a dragged\n * element is over this Interactable.\n *\n | interact(target)\n | .dropChecker(function(dragEvent, // related dragmove or dragend event\n | event, // TouchEvent/PointerEvent/MouseEvent\n | dropped, // bool result of the default checker\n | dropzone, // dropzone Interactable\n | dropElement, // dropzone elemnt\n | draggable, // draggable Interactable\n | draggableElement) {// draggable element\n |\n | return dropped && event.target.hasAttribute('allow-drop');\n | }\n *\n *\n - options (boolean | object | null) #optional The new value to be set.\n | interact('.drop').dropzone({\n | accept: '.can-drop' || document.getElementById('single-drop'),\n | overlap: 'pointer' || 'center' || zeroToOne\n | }\n = (boolean | object) The current setting or this Interactable\n\\*/\nInteractable.prototype.dropzone = function (options) {\n if (utils.is.object(options)) {\n this.options.drop.enabled = options.enabled === false? false: true;\n\n if (utils.is.function(options.ondrop) ) { this.events.ondrop = options.ondrop ; }\n if (utils.is.function(options.ondropactivate) ) { this.events.ondropactivate = options.ondropactivate ; }\n if (utils.is.function(options.ondropdeactivate)) { this.events.ondropdeactivate = options.ondropdeactivate; }\n if (utils.is.function(options.ondragenter) ) { this.events.ondragenter = options.ondragenter ; }\n if (utils.is.function(options.ondragleave) ) { this.events.ondragleave = options.ondragleave ; }\n if (utils.is.function(options.ondropmove) ) { this.events.ondropmove = options.ondropmove ; }\n\n if (/^(pointer|center)$/.test(options.overlap)) {\n this.options.drop.overlap = options.overlap;\n }\n else if (utils.is.number(options.overlap)) {\n this.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0);\n }\n if ('accept' in options) {\n this.options.drop.accept = options.accept;\n }\n if ('checker' in options) {\n this.options.drop.checker = options.checker;\n }\n\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drop.enabled = options;\n\n if (!options) {\n this.ondragenter = this.ondragleave = this.ondrop\n = this.ondropactivate = this.ondropdeactivate = null;\n }\n\n return this;\n }\n\n return this.options.drop;\n};\n\nInteractable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) {\n let dropped = false;\n\n // if the dropzone has no rect (eg. display: none)\n // call the custom dropChecker or just return false\n if (!(rect = rect || this.getRect(dropElement))) {\n return (this.options.drop.checker\n ? this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement)\n : false);\n }\n\n const dropOverlap = this.options.drop.overlap;\n\n if (dropOverlap === 'pointer') {\n const origin = utils.getOriginXY(draggable, draggableElement, 'drag');\n const page = utils.getPageXY(dragEvent);\n\n page.x += origin.x;\n page.y += origin.y;\n\n const horizontal = (page.x > rect.left) && (page.x < rect.right);\n const vertical = (page.y > rect.top ) && (page.y < rect.bottom);\n\n dropped = horizontal && vertical;\n }\n\n const dragRect = draggable.getRect(draggableElement);\n\n if (dragRect && dropOverlap === 'center') {\n const cx = dragRect.left + dragRect.width / 2;\n const cy = dragRect.top + dragRect.height / 2;\n\n dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom;\n }\n\n if (dragRect && utils.is.number(dropOverlap)) {\n const overlapArea = (Math.max(0, Math.min(rect.right , dragRect.right ) - Math.max(rect.left, dragRect.left))\n * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top , dragRect.top )));\n\n const overlapRatio = overlapArea / (dragRect.width * dragRect.height);\n\n dropped = overlapRatio >= dropOverlap;\n }\n\n if (this.options.drop.checker) {\n dropped = this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement);\n }\n\n return dropped;\n};\n\nInteractable.signals.on('unset', function ({ interactable }) {\n interactable.dropzone(false);\n});\n\nInteractable.settingsMethods.push('dropChecker');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.dropTarget = null; // the dropzone a drag target might be dropped into\n interaction.dropElement = null; // the element at the time of checking\n interaction.prevDropTarget = null; // the dropzone that was recently dragged away from\n interaction.prevDropElement = null; // the element at the time of checking\n interaction.dropEvents = null; // the dropEvents related to the current drag event\n\n interaction.activeDrops = {\n dropzones: [], // the dropzones that are mentioned below\n elements : [], // elements of dropzones that accept the target draggable\n rects : [], // the rects of the elements mentioned above\n };\n\n});\n\nInteraction.signals.on('stop', function ({ interaction }) {\n interaction.dropTarget = interaction.dropElement =\n interaction.prevDropTarget = interaction.prevDropElement = null;\n});\n\n/*\\\n * interact.dynamicDrop\n [ method ]\n *\n * Returns or sets whether the dimensions of dropzone elements are\n * calculated on every dragmove or only on dragstart for the default\n * dropChecker\n *\n - newValue (boolean) #optional True to check on each move. False to check only before start\n = (boolean | interact) The current setting or interact\n\\*/\ninteract.dynamicDrop = function (newValue) {\n if (utils.is.bool(newValue)) {\n //if (dragging && dynamicDrop !== newValue && !newValue) {\n //calcRects(dropzones);\n //}\n\n dynamicDrop = newValue;\n\n return interact;\n }\n return dynamicDrop;\n};\n\nutils.merge(Interactable.eventTypes, [\n 'dragenter',\n 'dragleave',\n 'dropactivate',\n 'dropdeactivate',\n 'dropmove',\n 'drop',\n]);\nactions.methodDict.drop = 'dropzone';\n\ndefaultOptions.drop = drop.defaults;\n\nmodule.exports = drop;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst gesture = {\n defaults: {\n enabled : false,\n origin : null,\n restrict: null,\n },\n\n checker: function (pointer, event, interactable, element, interaction) {\n if (interaction.pointerIds.length >= 2) {\n return { name: 'gesture' };\n }\n\n return null;\n },\n\n getCursor: function () {\n return '';\n },\n};\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturestart') { return; }\n iEvent.ds = 0;\n\n interaction.gesture.startDistance = interaction.gesture.prevDistance = iEvent.distance;\n interaction.gesture.startAngle = interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.scale = 1;\n});\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturemove') { return; }\n\n iEvent.ds = iEvent.scale - interaction.gesture.scale;\n\n interaction.target.fire(iEvent);\n\n interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.prevDistance = iEvent.distance;\n\n if (iEvent.scale !== Infinity\n && iEvent.scale !== null\n && iEvent.scale !== undefined\n && !isNaN(iEvent.scale)) {\n\n interaction.gesture.scale = iEvent.scale;\n }\n});\n\n/*\\\n * Interactable.gesturable\n [ method ]\n *\n * Gets or sets whether multitouch gestures can be performed on the\n * Interactable's element\n *\n = (boolean) Indicates if this can be the target of gesture events\n | var isGestureable = interact(element).gesturable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on gesture events (makes the Interactable gesturable)\n = (object) this Interactable\n | interact(element).gesturable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // limit multiple gestures.\n | // See the explanation in @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n\\*/\nInteractable.prototype.gesturable = function (options) {\n if (utils.is.object(options)) {\n this.options.gesture.enabled = options.enabled === false? false: true;\n this.setPerAction('gesture', options);\n this.setOnEvents('gesture', options);\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.gesture.enabled = options;\n\n if (!options) {\n this.ongesturestart = this.ongesturestart = this.ongestureend = null;\n }\n\n return this;\n }\n\n return this.options.gesture;\n};\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action, event, starting, ending, deltaSource }) {\n if (action !== 'gesture') { return; }\n\n const pointers = interaction.pointers;\n\n iEvent.touches = [pointers[0], pointers[1]];\n\n if (starting) {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = 1;\n iEvent.ds = 0;\n iEvent.angle = utils.touchAngle(pointers, undefined, deltaSource);\n iEvent.da = 0;\n }\n else if (ending || event instanceof InteractEvent) {\n iEvent.distance = interaction.prevEvent.distance;\n iEvent.box = interaction.prevEvent.box;\n iEvent.scale = interaction.prevEvent.scale;\n iEvent.ds = iEvent.scale - 1;\n iEvent.angle = interaction.prevEvent.angle;\n iEvent.da = iEvent.angle - interaction.gesture.startAngle;\n }\n else {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = iEvent.distance / interaction.gesture.startDistance;\n iEvent.angle = utils.touchAngle(pointers, interaction.gesture.prevAngle, deltaSource);\n\n iEvent.ds = iEvent.scale - interaction.gesture.prevScale;\n iEvent.da = iEvent.angle - interaction.gesture.prevAngle;\n }\n});\n\nInteraction.signals.on('new', function (interaction) {\n interaction.gesture = {\n start: { x: 0, y: 0 },\n\n startDistance: 0, // distance between two touches of touchStart\n prevDistance : 0,\n distance : 0,\n\n scale: 1, // gesture.distance / gesture.startDistance\n\n startAngle: 0, // angle of line joining two touches\n prevAngle : 0, // angle of the previous gesture event\n };\n});\n\nactions.gesture = gesture;\nactions.names.push('gesture');\nutils.merge(Interactable.eventTypes, [\n 'gesturestart',\n 'gesturemove',\n 'gestureend',\n]);\nactions.methodDict.gesture = 'gesturable';\n\ndefaultOptions.gesture = gesture.defaults;\n\nmodule.exports = gesture;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\n// Less Precision with touch input\nconst defaultMargin = browser.supportsTouch || browser.supportsPointerEvent? 20: 10;\n\nconst resize = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n square: false,\n preserveAspectRatio: false,\n axis: 'xy',\n\n // use default margin\n margin: NaN,\n\n // object with props left, right, top, bottom which are\n // true/false values to resize when the pointer is over that edge,\n // CSS selectors to match the handles for each direction\n // or the Elements for each handle\n edges: null,\n\n // a value of 'none' will limit the resize rect to a minimum of 0x0\n // 'negate' will alow the rect to have negative width/height\n // 'reposition' will keep the width/height positive by swapping\n // the top and bottom edges and/or swapping the left and right edges\n invert: 'none',\n },\n\n checker: function (pointer, event, interactable, element, interaction, rect) {\n if (!rect) { return null; }\n\n const page = utils.extend({}, interaction.curCoords.page);\n const options = interactable.options;\n\n if (options.resize.enabled) {\n const resizeOptions = options.resize;\n const resizeEdges = { left: false, right: false, top: false, bottom: false };\n\n // if using resize.edges\n if (utils.is.object(resizeOptions.edges)) {\n for (const edge in resizeEdges) {\n resizeEdges[edge] = checkResizeEdge(edge,\n resizeOptions.edges[edge],\n page,\n interaction._eventTarget,\n element,\n rect,\n resizeOptions.margin || defaultMargin);\n }\n\n resizeEdges.left = resizeEdges.left && !resizeEdges.right;\n resizeEdges.top = resizeEdges.top && !resizeEdges.bottom;\n\n if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) {\n return {\n name: 'resize',\n edges: resizeEdges,\n };\n }\n }\n else {\n const right = options.resize.axis !== 'y' && page.x > (rect.right - defaultMargin);\n const bottom = options.resize.axis !== 'x' && page.y > (rect.bottom - defaultMargin);\n\n if (right || bottom) {\n return {\n name: 'resize',\n axes: (right? 'x' : '') + (bottom? 'y' : ''),\n };\n }\n }\n }\n\n return null;\n },\n\n cursors: (browser.isIe9OrOlder ? {\n x : 'e-resize',\n y : 's-resize',\n xy: 'se-resize',\n\n top : 'n-resize',\n left : 'w-resize',\n bottom : 's-resize',\n right : 'e-resize',\n topleft : 'se-resize',\n bottomright: 'se-resize',\n topright : 'ne-resize',\n bottomleft : 'ne-resize',\n } : {\n x : 'ew-resize',\n y : 'ns-resize',\n xy: 'nwse-resize',\n\n top : 'ns-resize',\n left : 'ew-resize',\n bottom : 'ns-resize',\n right : 'ew-resize',\n topleft : 'nwse-resize',\n bottomright: 'nwse-resize',\n topright : 'nesw-resize',\n bottomleft : 'nesw-resize',\n }),\n\n getCursor: function (action) {\n if (action.axis) {\n return resize.cursors[action.name + action.axis];\n }\n else if (action.edges) {\n let cursorKey = '';\n const edgeNames = ['top', 'bottom', 'left', 'right'];\n\n for (let i = 0; i < 4; i++) {\n if (action.edges[edgeNames[i]]) {\n cursorKey += edgeNames[i];\n }\n }\n\n return resize.cursors[cursorKey];\n }\n },\n};\n\n// resizestart\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'resizestart' || !interaction.prepared.edges) {\n return;\n }\n\n const startRect = interaction.target.getRect(interaction.element);\n const resizeOptions = interaction.target.options.resize;\n\n /*\n * When using the `resizable.square` or `resizable.preserveAspectRatio` options, resizing from one edge\n * will affect another. E.g. with `resizable.square`, resizing to make the right edge larger will make\n * the bottom edge larger by the same amount. We call these 'linked' edges. Any linked edges will depend\n * on the active edges and the edge being interacted with.\n */\n if (resizeOptions.square || resizeOptions.preserveAspectRatio) {\n const linkedEdges = utils.extend({}, interaction.prepared.edges);\n\n linkedEdges.top = linkedEdges.top || (linkedEdges.left && !linkedEdges.bottom);\n linkedEdges.left = linkedEdges.left || (linkedEdges.top && !linkedEdges.right );\n linkedEdges.bottom = linkedEdges.bottom || (linkedEdges.right && !linkedEdges.top );\n linkedEdges.right = linkedEdges.right || (linkedEdges.bottom && !linkedEdges.left );\n\n interaction.prepared._linkedEdges = linkedEdges;\n }\n else {\n interaction.prepared._linkedEdges = null;\n }\n\n // if using `resizable.preserveAspectRatio` option, record aspect ratio at the start of the resize\n if (resizeOptions.preserveAspectRatio) {\n interaction.resizeStartAspectRatio = startRect.width / startRect.height;\n }\n\n interaction.resizeRects = {\n start : startRect,\n current : utils.extend({}, startRect),\n inverted : utils.extend({}, startRect),\n previous : utils.extend({}, startRect),\n delta : {\n left: 0, right : 0, width : 0,\n top : 0, bottom: 0, height: 0,\n },\n };\n\n iEvent.rect = interaction.resizeRects.inverted;\n iEvent.deltaRect = interaction.resizeRects.delta;\n});\n\n// resizemove\nInteractEvent.signals.on('new', function ({ iEvent, phase, interaction }) {\n if (phase !== 'move' || !interaction.prepared.edges) { return; }\n\n const resizeOptions = interaction.target.options.resize;\n const invert = resizeOptions.invert;\n const invertible = invert === 'reposition' || invert === 'negate';\n\n let edges = interaction.prepared.edges;\n\n const start = interaction.resizeRects.start;\n const current = interaction.resizeRects.current;\n const inverted = interaction.resizeRects.inverted;\n const delta = interaction.resizeRects.delta;\n const previous = utils.extend(interaction.resizeRects.previous, inverted);\n const originalEdges = edges;\n\n let dx = iEvent.dx;\n let dy = iEvent.dy;\n\n if (resizeOptions.preserveAspectRatio || resizeOptions.square) {\n // `resize.preserveAspectRatio` takes precedence over `resize.square`\n const startAspectRatio = resizeOptions.preserveAspectRatio\n ? interaction.resizeStartAspectRatio\n : 1;\n\n edges = interaction.prepared._linkedEdges;\n\n if ((originalEdges.left && originalEdges.bottom)\n || (originalEdges.right && originalEdges.top)) {\n dy = -dx / startAspectRatio;\n }\n else if (originalEdges.left || originalEdges.right ) { dy = dx / startAspectRatio; }\n else if (originalEdges.top || originalEdges.bottom) { dx = dy * startAspectRatio; }\n }\n\n // update the 'current' rect without modifications\n if (edges.top ) { current.top += dy; }\n if (edges.bottom) { current.bottom += dy; }\n if (edges.left ) { current.left += dx; }\n if (edges.right ) { current.right += dx; }\n\n if (invertible) {\n // if invertible, copy the current rect\n utils.extend(inverted, current);\n\n if (invert === 'reposition') {\n // swap edge values if necessary to keep width/height positive\n let swap;\n\n if (inverted.top > inverted.bottom) {\n swap = inverted.top;\n\n inverted.top = inverted.bottom;\n inverted.bottom = swap;\n }\n if (inverted.left > inverted.right) {\n swap = inverted.left;\n\n inverted.left = inverted.right;\n inverted.right = swap;\n }\n }\n }\n else {\n // if not invertible, restrict to minimum of 0x0 rect\n inverted.top = Math.min(current.top, start.bottom);\n inverted.bottom = Math.max(current.bottom, start.top);\n inverted.left = Math.min(current.left, start.right);\n inverted.right = Math.max(current.right, start.left);\n }\n\n inverted.width = inverted.right - inverted.left;\n inverted.height = inverted.bottom - inverted.top ;\n\n for (const edge in inverted) {\n delta[edge] = inverted[edge] - previous[edge];\n }\n\n iEvent.edges = interaction.prepared.edges;\n iEvent.rect = inverted;\n iEvent.deltaRect = delta;\n});\n\n/*\\\n * Interactable.resizable\n [ method ]\n *\n * Gets or sets whether resize actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of resize elements\n | var isResizeable = interact('input[type=text]').resizable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on resize events (object makes the Interactable resizable)\n = (object) This Interactable\n | interact(element).resizable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | edges: {\n | top : true, // Use pointer coords to check for resize.\n | left : false, // Disable resizing from left edge.\n | bottom: '.resize-s',// Resize if pointer target matches selector\n | right : handleEl // Resize if pointer target is the given Element\n | },\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height are adjusted at a 1:1 ratio.\n | square: false,\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height maintain the aspect ratio they had when resizing started.\n | preserveAspectRatio: false,\n |\n | // a value of 'none' will limit the resize rect to a minimum of 0x0\n | // 'negate' will allow the rect to have negative width/height\n | // 'reposition' will keep the width/height positive by swapping\n | // the top and bottom edges and/or swapping the left and right edges\n | invert: 'none' || 'negate' || 'reposition'\n |\n | // limit multiple resizes.\n | // See the explanation in the @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n \\*/\nInteractable.prototype.resizable = function (options) {\n if (utils.is.object(options)) {\n this.options.resize.enabled = options.enabled === false? false: true;\n this.setPerAction('resize', options);\n this.setOnEvents('resize', options);\n\n if (/^x$|^y$|^xy$/.test(options.axis)) {\n this.options.resize.axis = options.axis;\n }\n else if (options.axis === null) {\n this.options.resize.axis = defaultOptions.resize.axis;\n }\n\n if (utils.is.bool(options.preserveAspectRatio)) {\n this.options.resize.preserveAspectRatio = options.preserveAspectRatio;\n }\n else if (utils.is.bool(options.square)) {\n this.options.resize.square = options.square;\n }\n\n return this;\n }\n if (utils.is.bool(options)) {\n this.options.resize.enabled = options;\n\n if (!options) {\n this.onresizestart = this.onresizestart = this.onresizeend = null;\n }\n\n return this;\n }\n return this.options.resize;\n};\n\nfunction checkResizeEdge (name, value, page, element, interactableElement, rect, margin) {\n // false, '', undefined, null\n if (!value) { return false; }\n\n // true value, use pointer coords and element rect\n if (value === true) {\n // if dimensions are negative, \"switch\" edges\n const width = utils.is.number(rect.width )? rect.width : rect.right - rect.left;\n const height = utils.is.number(rect.height)? rect.height : rect.bottom - rect.top ;\n\n if (width < 0) {\n if (name === 'left' ) { name = 'right'; }\n else if (name === 'right') { name = 'left' ; }\n }\n if (height < 0) {\n if (name === 'top' ) { name = 'bottom'; }\n else if (name === 'bottom') { name = 'top' ; }\n }\n\n if (name === 'left' ) { return page.x < ((width >= 0? rect.left: rect.right ) + margin); }\n if (name === 'top' ) { return page.y < ((height >= 0? rect.top : rect.bottom) + margin); }\n\n if (name === 'right' ) { return page.x > ((width >= 0? rect.right : rect.left) - margin); }\n if (name === 'bottom') { return page.y > ((height >= 0? rect.bottom: rect.top ) - margin); }\n }\n\n // the remaining checks require an element\n if (!utils.is.element(element)) { return false; }\n\n return utils.is.element(value)\n // the value is an element to use as a resize handle\n ? value === element\n // otherwise check if element matches value as selector\n : utils.matchesUpTo(element, value, interactableElement);\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.resizeAxes = 'xy';\n});\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action }) {\n if (action !== 'resize' || !interaction.resizeAxes) { return; }\n\n const options = interaction.target.options;\n\n if (options.resize.square) {\n if (interaction.resizeAxes === 'y') {\n iEvent.dx = iEvent.dy;\n }\n else {\n iEvent.dy = iEvent.dx;\n }\n iEvent.axes = 'xy';\n }\n else {\n iEvent.axes = interaction.resizeAxes;\n\n if (interaction.resizeAxes === 'x') {\n iEvent.dy = 0;\n }\n else if (interaction.resizeAxes === 'y') {\n iEvent.dx = 0;\n }\n }\n});\n\nactions.resize = resize;\nactions.names.push('resize');\nutils.merge(Interactable.eventTypes, [\n 'resizestart',\n 'resizemove',\n 'resizeinertiastart',\n 'resizeinertiaresume',\n 'resizeend',\n]);\nactions.methodDict.resize = 'resizable';\n\ndefaultOptions.resize = resize.defaults;\n\nmodule.exports = resize;\n","const raf = require('./utils/raf');\nconst getWindow = require('./utils/window').getWindow;\nconst is = require('./utils/is');\nconst domUtils = require('./utils/domUtils');\nconst Interaction = require('./Interaction');\nconst defaultOptions = require('./defaultOptions');\n\nconst autoScroll = {\n defaults: {\n enabled : false,\n container: null, // the item that is scrolled (Window or HTMLElement)\n margin : 60,\n speed : 300, // the scroll speed in pixels per second\n },\n\n interaction: null,\n i: null, // the handle returned by window.setInterval\n x: 0, y: 0, // Direction each pulse is to scroll in\n\n isScrolling: false,\n prevTime: 0,\n\n start: function (interaction) {\n autoScroll.isScrolling = true;\n raf.cancel(autoScroll.i);\n\n autoScroll.interaction = interaction;\n autoScroll.prevTime = new Date().getTime();\n autoScroll.i = raf.request(autoScroll.scroll);\n },\n\n stop: function () {\n autoScroll.isScrolling = false;\n raf.cancel(autoScroll.i);\n },\n\n // scroll the window by the values in scroll.x/y\n scroll: function () {\n const options = autoScroll.interaction.target.options[autoScroll.interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(autoScroll.interaction.element);\n const now = new Date().getTime();\n // change in time in seconds\n const dt = (now - autoScroll.prevTime) / 1000;\n // displacement\n const s = options.speed * dt;\n\n if (s >= 1) {\n if (is.window(container)) {\n container.scrollBy(autoScroll.x * s, autoScroll.y * s);\n }\n else if (container) {\n container.scrollLeft += autoScroll.x * s;\n container.scrollTop += autoScroll.y * s;\n }\n\n autoScroll.prevTime = now;\n }\n\n if (autoScroll.isScrolling) {\n raf.cancel(autoScroll.i);\n autoScroll.i = raf.request(autoScroll.scroll);\n }\n },\n check: function (interactable, actionName) {\n const options = interactable.options;\n\n return options[actionName].autoScroll && options[actionName].autoScroll.enabled;\n },\n onInteractionMove: function ({ interaction, pointer }) {\n if (!(interaction.interacting()\n && autoScroll.check(interaction.target, interaction.prepared.name))) {\n return;\n }\n\n if (interaction.simulation) {\n autoScroll.x = autoScroll.y = 0;\n return;\n }\n\n let top;\n let right;\n let bottom;\n let left;\n\n const options = interaction.target.options[interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(interaction.element);\n\n if (is.window(container)) {\n left = pointer.clientX < autoScroll.margin;\n top = pointer.clientY < autoScroll.margin;\n right = pointer.clientX > container.innerWidth - autoScroll.margin;\n bottom = pointer.clientY > container.innerHeight - autoScroll.margin;\n }\n else {\n const rect = domUtils.getElementClientRect(container);\n\n left = pointer.clientX < rect.left + autoScroll.margin;\n top = pointer.clientY < rect.top + autoScroll.margin;\n right = pointer.clientX > rect.right - autoScroll.margin;\n bottom = pointer.clientY > rect.bottom - autoScroll.margin;\n }\n\n autoScroll.x = (right ? 1: left? -1: 0);\n autoScroll.y = (bottom? 1: top? -1: 0);\n\n if (!autoScroll.isScrolling) {\n // set the autoScroll properties to those of the target\n autoScroll.margin = options.margin;\n autoScroll.speed = options.speed;\n\n autoScroll.start(interaction);\n }\n },\n};\n\nInteraction.signals.on('stop-active', function () {\n autoScroll.stop();\n});\n\nInteraction.signals.on('action-move', autoScroll.onInteractionMove);\n\ndefaultOptions.perAction.autoScroll = autoScroll.defaults;\n\nmodule.exports = autoScroll;\n","const Interactable = require('../Interactable');\nconst actions = require('../actions/base');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.ignoreFrom\n [ method ]\n *\n * If the target of the `mousedown`, `pointerdown` or `touchstart`\n * event or any of it's parents match the given CSS selector or\n * Element, no drag/resize/gesture is started.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to not ignore any elements\n = (string | Element | object) The current ignoreFrom value or this Interactable\n **\n | interact(element, { ignoreFrom: document.getElementById('no-action') });\n | // or\n | interact(element).ignoreFrom('input, textarea, a');\n\\*/\nInteractable.prototype.ignoreFrom = function (newValue) {\n return this._backCompatOption('ignoreFrom', newValue);\n};\n\n/*\\\n * Interactable.allowFrom\n [ method ]\n *\n * A drag/resize/gesture is started only If the target of the\n * `mousedown`, `pointerdown` or `touchstart` event or any of it's\n * parents match the given CSS selector or Element.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to allow from any element\n = (string | Element | object) The current allowFrom value or this Interactable\n **\n | interact(element, { allowFrom: document.getElementById('drag-handle') });\n | // or\n | interact(element).allowFrom('.handle');\n\\*/\nInteractable.prototype.allowFrom = function (newValue) {\n return this._backCompatOption('allowFrom', newValue);\n};\n\nInteractable.prototype.testIgnore = function (ignoreFrom, interactableElement, element) {\n if (!ignoreFrom || !is.element(element)) { return false; }\n\n if (is.string(ignoreFrom)) {\n return domUtils.matchesUpTo(element, ignoreFrom, interactableElement);\n }\n else if (is.element(ignoreFrom)) {\n return domUtils.nodeContains(ignoreFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testAllow = function (allowFrom, interactableElement, element) {\n if (!allowFrom) { return true; }\n\n if (!is.element(element)) { return false; }\n\n if (is.string(allowFrom)) {\n return domUtils.matchesUpTo(element, allowFrom, interactableElement);\n }\n else if (is.element(allowFrom)) {\n return domUtils.nodeContains(allowFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testIgnoreAllow = function (options, interactableElement, eventTarget) {\n return (!this.testIgnore(options.ignoreFrom, interactableElement, eventTarget)\n && this.testAllow(options.allowFrom, interactableElement, eventTarget));\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (event.buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\n","const interact = require('../interact');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst actions = require('../actions/base');\nconst defaultOptions = require('../defaultOptions');\nconst browser = require('../utils/browser');\nconst scope = require('../scope');\nconst utils = require('../utils');\nconst signals = require('../utils/Signals').new();\n\nrequire('./InteractableMethods');\n\nconst autoStart = {\n signals,\n withinInteractionLimit,\n // Allow this many interactions to happen simultaneously\n maxInteractions: Infinity,\n defaults: {\n perAction: {\n manualStart: false,\n max: Infinity,\n maxPerElement: 1,\n allowFrom: null,\n ignoreFrom: null,\n },\n },\n setActionDefaults: function (action) {\n utils.extend(action.defaults, autoStart.defaults.perAction);\n },\n};\n\n// set cursor style on mousedown\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget }) {\n if (interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\n// set cursor style on mousemove\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget }) {\n if (!interaction.mouse\n || interaction.pointerIsDown\n || interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\nInteraction.signals.on('move', function (arg) {\n const { interaction, event } = arg;\n\n if (!interaction.pointerIsDown\n || interaction.interacting()\n || !interaction.pointerWasMoved\n || !interaction.prepared.name) {\n return;\n }\n\n signals.fire('before-start', arg);\n\n const target = interaction.target;\n\n if (interaction.prepared.name && target) {\n // check manualStart and interaction limit\n if (target.options[interaction.prepared.name].manualStart\n || !withinInteractionLimit(target, interaction.element, interaction.prepared)) {\n interaction.stop(event);\n }\n else {\n interaction.start(interaction.prepared, target, interaction.element);\n }\n }\n});\n\n// Check if the current target supports the action.\n// If so, return the validated action. Otherwise, return null\nfunction validateAction (action, interactable, element, eventTarget) {\n if (utils.is.object(action)\n && interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget)\n && interactable.options[action.name].enabled\n && withinInteractionLimit(interactable, element, action)) {\n return action;\n }\n\n return null;\n}\n\nfunction validateSelector (interaction, pointer, event, matches, matchElements, eventTarget) {\n for (let i = 0, len = matches.length; i < len; i++) {\n const match = matches[i];\n const matchElement = matchElements[i];\n const action = validateAction(match.getAction(pointer, event, interaction, matchElement),\n match,\n matchElement,\n eventTarget);\n\n if (action) {\n return {\n action,\n target: match,\n element: matchElement,\n };\n }\n }\n\n return {};\n}\n\nfunction getActionInfo (interaction, pointer, event, eventTarget) {\n let matches = [];\n let matchElements = [];\n\n let element = eventTarget;\n let action = null;\n\n function pushMatches (interactable, selector, context) {\n const elements = (browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined);\n\n if (utils.matchesSelector(element, selector, elements)) {\n\n matches.push(interactable);\n matchElements.push(element);\n }\n }\n\n while (utils.is.element(element)) {\n matches = [];\n matchElements = [];\n\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && (action = validateAction(elementInteractable.getAction(pointer, event, interaction, element, eventTarget),\n elementInteractable,\n element,\n eventTarget))\n && !elementInteractable.options[action.name].manualStart) {\n return {\n element,\n action,\n target: elementInteractable,\n };\n }\n else {\n scope.interactables.forEachSelector(pushMatches, element);\n\n const actionInfo = validateSelector(interaction, pointer, event, matches, matchElements, eventTarget);\n\n if (actionInfo.action\n && !actionInfo.target.options[actionInfo.action.name].manualStart) {\n return actionInfo;\n }\n }\n\n element = utils.parentNode(element);\n }\n\n return {};\n}\n\nfunction prepare (interaction, { action, target, element }) {\n action = action || {};\n\n if (interaction.target && interaction.target.options.styleCursor) {\n interaction.target._doc.documentElement.style.cursor = '';\n }\n\n interaction.target = target;\n interaction.element = element;\n utils.copyAction(interaction.prepared, action);\n\n if (target && target.options.styleCursor) {\n const cursor = action? actions[action.name].getCursor(action) : '';\n interaction.target._doc.documentElement.style.cursor = cursor;\n }\n\n signals.fire('prepared', { interaction: interaction });\n}\n\nInteraction.signals.on('stop', function ({ interaction }) {\n const target = interaction.target;\n\n if (target && target.options.styleCursor) {\n target._doc.documentElement.style.cursor = '';\n }\n});\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (utils.is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (utils.is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n const buttons = event.buttons || ({\n 0: 1,\n 1: 4,\n 3: 8,\n 4: 16,\n })[event.button];\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\nfunction withinInteractionLimit (interactable, element, action) {\n const options = interactable.options;\n const maxActions = options[action.name].max;\n const maxPerElement = options[action.name].maxPerElement;\n let activeInteractions = 0;\n let targetCount = 0;\n let targetElementCount = 0;\n\n // no actions if any of these values == 0\n if (!(maxActions && maxPerElement && autoStart.maxInteractions)) { return; }\n\n for (let i = 0, len = scope.interactions.length; i < len; i++) {\n const interaction = scope.interactions[i];\n const otherAction = interaction.prepared.name;\n\n if (!interaction.interacting()) { continue; }\n\n activeInteractions++;\n\n if (activeInteractions >= autoStart.maxInteractions) {\n return false;\n }\n\n if (interaction.target !== interactable) { continue; }\n\n targetCount += (otherAction === action.name)|0;\n\n if (targetCount >= maxActions) {\n return false;\n }\n\n if (interaction.element === element) {\n targetElementCount++;\n\n if (otherAction !== action.name || targetElementCount >= maxPerElement) {\n return false;\n }\n }\n }\n\n return autoStart.maxInteractions > 0;\n}\n\n/*\\\n * interact.maxInteractions\n [ method ]\n **\n * Returns or sets the maximum number of concurrent interactions allowed.\n * By default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables\n * and elements, you need to enable it in the draggable, resizable and\n * gesturable `'max'` and `'maxPerElement'` options.\n **\n - newValue (number) #optional Any number. newValue <= 0 means no interactions.\n\\*/\ninteract.maxInteractions = function (newValue) {\n if (utils.is.number(newValue)) {\n autoStart.maxInteractions = newValue;\n\n return this;\n }\n\n return autoStart.maxInteractions;\n};\n\nInteractable.settingsMethods.push('styleCursor');\nInteractable.settingsMethods.push('actionChecker');\nInteractable.settingsMethods.push('ignoreFrom');\nInteractable.settingsMethods.push('allowFrom');\n\ndefaultOptions.base.actionChecker = null;\ndefaultOptions.base.styleCursor = true;\n\nutils.extend(defaultOptions.perAction, autoStart.defaults.perAction);\n\nmodule.exports = autoStart;\n","const autoStart = require('./base');\nconst Interaction = require('../Interaction');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.delayTimer = null;\n});\n\nautoStart.signals.on('prepared', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.delayTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.target, interaction.element);\n }, delay);\n }\n});\n\nInteraction.signals.on('move', function ({ interaction, duplicate }) {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.delayTimer);\n }\n});\n\n// prevent regular down->move autoStart\nautoStart.signals.on('before-start', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.prepared.name = null;\n }\n});\n","const autoStart = require('./base');\nconst scope = require('../scope');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\n\nconst { matchesSelector, parentNode } = require('../utils/domUtils');\n\nautoStart.setActionDefaults(require('../actions/drag'));\n\nautoStart.signals.on('before-start', function ({ interaction, eventTarget, dx, dy }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // check if a drag is in the correct axis\n const absX = Math.abs(dx);\n const absY = Math.abs(dy);\n const options = interaction.target.options.drag;\n const startAxis = options.startAxis;\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy');\n\n interaction.prepared.axis = options.lockAxis === 'start'\n ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n : options.lockAxis;\n\n // if the movement isn't in the startAxis of the interactable\n if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) {\n // cancel the prepared action\n interaction.prepared.name = null;\n\n // then try to get a drag from another ineractable\n\n if (!interaction.prepared.name) {\n\n let element = eventTarget;\n\n const getDraggable = function (interactable, selector, context) {\n const elements = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n if (interactable === interaction.target) { return; }\n\n if (!options.manualStart\n && !interactable.testIgnoreAllow(options, element, eventTarget)\n && matchesSelector(element, selector, elements)) {\n\n const action = interactable.getAction(interaction.downPointer,\n interaction.downEvent,\n interaction,\n element);\n\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, interactable)\n && autoStart.validateAction(action, interactable, element, eventTarget)) {\n\n return interactable;\n }\n }\n };\n\n let action = null;\n\n // check all interactables\n while (is.element(element)) {\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && elementInteractable !== interaction.target\n && !elementInteractable.options.drag.manualStart) {\n\n action = elementInteractable.getAction(interaction.downPointer, interaction.downEvent, interaction, element);\n }\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, elementInteractable)) {\n\n interaction.prepared.name = 'drag';\n interaction.target = elementInteractable;\n interaction.element = element;\n break;\n }\n\n const selectorInteractable = scope.interactables.forEachSelector(getDraggable, element);\n\n if (selectorInteractable) {\n interaction.prepared.name = 'drag';\n interaction.target = selectorInteractable;\n interaction.element = element;\n break;\n }\n\n element = parentNode(element);\n }\n }\n }\n});\n\nfunction checkStartAxis (startAxis, interactable) {\n if (!interactable) { return false; }\n\n const thisAxis = interactable.options.drag.startAxis;\n\n return (startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis);\n}\n","require('./base').setActionDefaults(require('../actions/gesture'));\n","require('./base').setActionDefaults(require('../actions/resize'));\n","module.exports = {\n base: {\n accept : null,\n preventDefault: 'auto',\n deltaSource : 'page',\n },\n\n perAction: {\n origin: { x: 0, y: 0 },\n\n // only allow left button by default\n // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n mouseButtons: 1,\n\n inertia: {\n enabled : false,\n resistance : 10, // the lambda in exponential decay\n minSpeed : 100, // target speed must be above this for inertia to start\n endSpeed : 10, // the speed at which inertia is slow enough to stop\n allowResume : true, // allow resuming an action in inertia phase\n smoothEndDuration: 300, // animate to snap/restrict endOnly if there's no inertia\n },\n },\n};\n","/* browser entry point */\n\n// Legacy browser support\nrequire('./legacyBrowsers');\n\n// inertia\nrequire('./inertia');\n\n// modifiers\nrequire('./modifiers/snap');\nrequire('./modifiers/restrict');\n\n// pointerEvents\nrequire('./pointerEvents/base');\nrequire('./pointerEvents/holdRepeat');\nrequire('./pointerEvents/interactableTargets');\n\n// delay\nrequire('./autoStart/delay');\n\n// actions\nrequire('./actions/gesture');\nrequire('./actions/resize');\nrequire('./actions/drag');\nrequire('./actions/drop');\n\n// load these modifiers after resize is loaded\nrequire('./modifiers/snapSize');\nrequire('./modifiers/restrictEdges');\nrequire('./modifiers/restrictSize');\n\n// autoStart actions\nrequire('./autoStart/gesture');\nrequire('./autoStart/resize');\nrequire('./autoStart/drag');\n\n// Interactable preventDefault setting\nrequire('./interactablePreventDefault.js');\n\n// autoScroll\nrequire('./autoScroll');\n\n// export interact\nmodule.exports = require('./interact');\n","const InteractEvent = require('./InteractEvent');\nconst Interaction = require('./Interaction');\nconst modifiers = require('./modifiers');\nconst utils = require('./utils');\nconst animationFrame = require('./utils/raf');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.inertiaStatus = {\n active : false,\n smoothEnd : false,\n allowResume: false,\n\n startEvent: null,\n upCoords : {},\n\n xe: 0, ye: 0,\n sx: 0, sy: 0,\n\n t0: 0,\n vx0: 0, vys: 0,\n duration: 0,\n\n lambda_v0: 0,\n one_ve_v0: 0,\n i : null,\n };\n\n interaction.boundInertiaFrame = () => inertiaFrame .apply(interaction);\n interaction.boundSmoothEndFrame = () => smoothEndFrame.apply(interaction);\n});\n\nInteraction.signals.on('down', function ({ interaction, event, pointer, eventTarget }) {\n const status = interaction.inertiaStatus;\n\n // Check if the down event hits the current inertia target\n if (status.active) {\n let element = eventTarget;\n\n // climb up the DOM tree from the event target\n while (utils.is.element(element)) {\n\n // if interaction element is the current inertia target element\n if (element === interaction.element) {\n // stop inertia\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n\n // update pointers to the down event's coordinates\n interaction.updatePointer(pointer);\n utils.setCoords(interaction.curCoords, interaction.pointers);\n\n // fire appropriate signals\n const signalArg = { interaction };\n Interaction.signals.fire('before-action-move', signalArg);\n Interaction.signals.fire('action-resume' , signalArg);\n\n // fire a reume event\n const resumeEvent = new InteractEvent(interaction,\n event,\n interaction.prepared.name,\n 'inertiaresume',\n interaction.element);\n\n interaction.target.fire(resumeEvent);\n interaction.prevEvent = resumeEvent;\n modifiers.resetStatuses(interaction.modifierStatuses);\n\n utils.copyCoords(interaction.prevCoords, interaction.curCoords);\n break;\n }\n\n element = utils.parentNode(element);\n }\n }\n});\n\nInteraction.signals.on('up', function ({ interaction, event }) {\n const status = interaction.inertiaStatus;\n\n if (!interaction.interacting() || status.active) { return; }\n\n const target = interaction.target;\n const options = target && target.options;\n const inertiaOptions = options && interaction.prepared.name && options[interaction.prepared.name].inertia;\n\n const now = new Date().getTime();\n const statuses = {};\n const page = utils.extend({}, interaction.curCoords.page);\n const pointerSpeed = interaction.pointerDelta.client.speed;\n\n let smoothEnd = false;\n let modifierResult;\n\n // check if inertia should be started\n const inertiaPossible = (inertiaOptions && inertiaOptions.enabled\n && interaction.prepared.name !== 'gesture'\n && event !== status.startEvent);\n\n const inertia = (inertiaPossible\n && (now - interaction.curCoords.timeStamp) < 50\n && pointerSpeed > inertiaOptions.minSpeed\n && pointerSpeed > inertiaOptions.endSpeed);\n\n const modifierArg = {\n interaction,\n pageCoords: page,\n statuses,\n preEnd: true,\n requireEndOnly: true,\n };\n\n // smoothEnd\n if (inertiaPossible && !inertia) {\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n if (modifierResult.shouldMove && modifierResult.locked) {\n smoothEnd = true;\n }\n }\n\n if (!(inertia || smoothEnd)) { return; }\n\n utils.copyCoords(status.upCoords, interaction.curCoords);\n\n interaction.pointers[0] = status.startEvent =\n new InteractEvent(interaction, event, interaction.prepared.name, 'inertiastart', interaction.element);\n\n status.t0 = now;\n\n status.active = true;\n status.allowResume = inertiaOptions.allowResume;\n interaction.simulation = status;\n\n target.fire(status.startEvent);\n\n if (inertia) {\n status.vx0 = interaction.pointerDelta.client.vx;\n status.vy0 = interaction.pointerDelta.client.vy;\n status.v0 = pointerSpeed;\n\n calcInertia(interaction, status);\n\n utils.extend(page, interaction.curCoords.page);\n\n page.x += status.xe;\n page.y += status.ye;\n\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n status.modifiedXe += modifierResult.dx;\n status.modifiedYe += modifierResult.dy;\n\n status.i = animationFrame.request(interaction.boundInertiaFrame);\n }\n else {\n status.smoothEnd = true;\n status.xe = modifierResult.dx;\n status.ye = modifierResult.dy;\n\n status.sx = status.sy = 0;\n\n status.i = animationFrame.request(interaction.boundSmoothEndFrame);\n }\n});\n\nInteraction.signals.on('stop-active', function ({ interaction }) {\n const status = interaction.inertiaStatus;\n\n if (status.active) {\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n }\n});\n\nfunction calcInertia (interaction, status) {\n const inertiaOptions = interaction.target.options[interaction.prepared.name].inertia;\n const lambda = inertiaOptions.resistance;\n const inertiaDur = -Math.log(inertiaOptions.endSpeed / status.v0) / lambda;\n\n status.x0 = interaction.prevEvent.pageX;\n status.y0 = interaction.prevEvent.pageY;\n status.t0 = status.startEvent.timeStamp / 1000;\n status.sx = status.sy = 0;\n\n status.modifiedXe = status.xe = (status.vx0 - inertiaDur) / lambda;\n status.modifiedYe = status.ye = (status.vy0 - inertiaDur) / lambda;\n status.te = inertiaDur;\n\n status.lambda_v0 = lambda / status.v0;\n status.one_ve_v0 = 1 - inertiaOptions.endSpeed / status.v0;\n}\n\nfunction inertiaFrame () {\n updateInertiaCoords(this);\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n\n const status = this.inertiaStatus;\n const options = this.target.options[this.prepared.name].inertia;\n const lambda = options.resistance;\n const t = new Date().getTime() / 1000 - status.t0;\n\n if (t < status.te) {\n\n const progress = 1 - (Math.exp(-lambda * t) - status.lambda_v0) / status.one_ve_v0;\n\n if (status.modifiedXe === status.xe && status.modifiedYe === status.ye) {\n status.sx = status.xe * progress;\n status.sy = status.ye * progress;\n }\n else {\n const quadPoint = utils.getQuadraticCurvePoint(0, 0,\n status.xe,\n status.ye,\n status.modifiedXe,\n status.modifiedYe,\n progress);\n\n status.sx = quadPoint.x;\n status.sy = quadPoint.y;\n }\n\n this.doMove();\n\n status.i = animationFrame.request(this.boundInertiaFrame);\n }\n else {\n status.sx = status.modifiedXe;\n status.sy = status.modifiedYe;\n\n this.doMove();\n this.end(status.startEvent);\n status.active = false;\n this.simulation = null;\n }\n\n utils.copyCoords(this.prevCoords, this.curCoords);\n}\n\nfunction smoothEndFrame () {\n updateInertiaCoords(this);\n\n const status = this.inertiaStatus;\n const t = new Date().getTime() - status.t0;\n const duration = this.target.options[this.prepared.name].inertia.smoothEndDuration;\n\n if (t < duration) {\n status.sx = utils.easeOutQuad(t, 0, status.xe, duration);\n status.sy = utils.easeOutQuad(t, 0, status.ye, duration);\n\n this.pointerMove(status.startEvent, status.startEvent);\n\n status.i = animationFrame.request(this.boundSmoothEndFrame);\n }\n else {\n status.sx = status.xe;\n status.sy = status.ye;\n\n this.pointerMove(status.startEvent, status.startEvent);\n this.end(status.startEvent);\n\n status.smoothEnd =\n status.active = false;\n this.simulation = null;\n }\n}\n\nfunction updateInertiaCoords (interaction) {\n const status = interaction.inertiaStatus;\n\n // return if inertia isn't running\n if (!status.active) { return; }\n\n const pageUp = status.upCoords.page;\n const clientUp = status.upCoords.client;\n\n utils.setCoords(interaction.curCoords, [ {\n pageX : pageUp.x + status.sx,\n pageY : pageUp.y + status.sy,\n clientX: clientUp.x + status.sx,\n clientY: clientUp.y + status.sy,\n } ]);\n}\n","const browser = require('./utils/browser');\nconst events = require('./utils/events');\nconst utils = require('./utils');\nconst scope = require('./scope');\nconst Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\n\nconst globalEvents = {};\n\n/*\\\n * interact\n [ method ]\n *\n * The methods of this variable can be used to set elements as\n * interactables and also to change various default settings.\n *\n * Calling it as a function and passing an element or a valid CSS selector\n * string returns an Interactable object which has various methods to\n * configure it.\n *\n - element (Element | string) The HTML or SVG Element to interact with or CSS selector\n = (object) An @Interactable\n *\n > Usage\n | interact('#draggable').draggable(true);\n |\n | var rectables = interact('rect');\n | rectables\n | .gesturable(true)\n | .on('gesturemove', function (event) {\n | // ...\n | });\n\\*/\nfunction interact (element, options) {\n let interactable = scope.interactables.get(element, options);\n\n if (!interactable) {\n interactable = new Interactable(element, options);\n interactable.events.global = globalEvents;\n }\n\n return interactable;\n}\n\n/*\\\n * interact.isSet\n [ method ]\n *\n * Check if an element has been set\n - element (Element) The Element being searched for\n = (boolean) Indicates if the element or CSS selector was previously passed to interact\n\\*/\ninteract.isSet = function (element, options) {\n return scope.interactables.indexOfElement(element, options && options.context) !== -1;\n};\n\n/*\\\n * interact.on\n [ method ]\n *\n * Adds a global listener for an InteractEvent or adds a DOM event to\n * `document`\n *\n - type (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) interact\n\\*/\ninteract.on = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.on(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.on(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n // if it is an InteractEvent type, add listener to globalEvents\n if (utils.contains(Interactable.eventTypes, type)) {\n // if this type of event was never bound\n if (!globalEvents[type]) {\n globalEvents[type] = [listener];\n }\n else {\n globalEvents[type].push(listener);\n }\n }\n // If non InteractEvent type, addEventListener to document\n else {\n events.add(scope.document, type, listener, { options });\n }\n\n return interact;\n};\n\n/*\\\n * interact.off\n [ method ]\n *\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n - type (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) interact\n \\*/\ninteract.off = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.off(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.off(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n if (!utils.contains(Interactable.eventTypes, type)) {\n events.remove(scope.document, type, listener, options);\n }\n else {\n let index;\n\n if (type in globalEvents\n && (index = utils.indexOf(globalEvents[type], listener)) !== -1) {\n globalEvents[type].splice(index, 1);\n }\n }\n\n return interact;\n};\n\n/*\\\n * interact.debug\n [ method ]\n *\n * Returns an object which exposes internal data\n = (object) An object with properties that outline the current state and expose internal functions and variables\n\\*/\ninteract.debug = function () {\n return scope;\n};\n\n// expose the functions used to calculate multi-touch properties\ninteract.getPointerAverage = utils.pointerAverage;\ninteract.getTouchBBox = utils.touchBBox;\ninteract.getTouchDistance = utils.touchDistance;\ninteract.getTouchAngle = utils.touchAngle;\n\ninteract.getElementRect = utils.getElementRect;\ninteract.getElementClientRect = utils.getElementClientRect;\ninteract.matchesSelector = utils.matchesSelector;\ninteract.closest = utils.closest;\n\n/*\\\n * interact.supportsTouch\n [ method ]\n *\n = (boolean) Whether or not the browser supports touch input\n\\*/\ninteract.supportsTouch = function () {\n return browser.supportsTouch;\n};\n\n/*\\\n * interact.supportsPointerEvent\n [ method ]\n *\n = (boolean) Whether or not the browser supports PointerEvents\n\\*/\ninteract.supportsPointerEvent = function () {\n return browser.supportsPointerEvent;\n};\n\n/*\\\n * interact.stop\n [ method ]\n *\n * Cancels all interactions (end events are not fired)\n *\n - event (Event) An event on which to call preventDefault()\n = (object) interact\n\\*/\ninteract.stop = function (event) {\n for (let i = scope.interactions.length - 1; i >= 0; i--) {\n scope.interactions[i].stop(event);\n }\n\n return interact;\n};\n\n/*\\\n * interact.pointerMoveTolerance\n [ method ]\n * Returns or sets the distance the pointer must be moved before an action\n * sequence occurs. This also affects tolerance for tap events.\n *\n - newValue (number) #optional The movement from the start position must be greater than this value\n = (number | Interactable) The current setting or interact\n\\*/\ninteract.pointerMoveTolerance = function (newValue) {\n if (utils.is.number(newValue)) {\n Interaction.pointerMoveTolerance = newValue;\n\n return this;\n }\n\n return Interaction.pointerMoveTolerance;\n};\n\ninteract.addDocument = scope.addDocument;\ninteract.removeDocument = scope.removeDocument;\n\nscope.interact = interact;\n\nmodule.exports = interact;\n","const Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\nconst scope = require('./scope');\nconst is = require('./utils/is');\nconst events = require('./utils/events');\n\nconst { nodeContains, matchesSelector } = require('./utils/domUtils');\n\n/*\\\n * Interactable.preventDefault\n [ method ]\n *\n * Returns or sets whether to prevent the browser's default behaviour\n * in response to pointer events. Can be set to:\n * - `'always'` to always prevent\n * - `'never'` to never prevent\n * - `'auto'` to let interact.js try to determine what would be best\n *\n - newValue (string) #optional `true`, `false` or `'auto'`\n = (string | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.preventDefault = function (newValue) {\n if (/^(always|never|auto)$/.test(newValue)) {\n this.options.preventDefault = newValue;\n return this;\n }\n\n if (is.bool(newValue)) {\n this.options.preventDefault = newValue? 'always' : 'never';\n return this;\n }\n\n return this.options.preventDefault;\n};\n\nInteractable.prototype.checkAndPreventDefault = function (event) {\n const setting = this.options.preventDefault;\n\n if (setting === 'never') { return; }\n\n if (setting === 'always') {\n event.preventDefault();\n return;\n }\n\n // setting === 'auto'\n\n // don't preventDefault if the browser supports passiveEvents\n // CSS touch-action and user-selecct should be used instead\n if (events.supportsOptions) {\n return;\n }\n\n // don't preventDefault of pointerdown events\n if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) {\n return;\n }\n\n // don't preventDefault on editable elements\n if (is.element(event.target)\n && matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) {\n return;\n }\n\n event.preventDefault();\n};\n\nfunction onInteractionEvent ({ interaction, event }) {\n if (interaction.target) {\n interaction.target.checkAndPreventDefault(event);\n }\n}\n\nfor (const eventSignal of ['down', 'move', 'up', 'cancel']) {\n Interaction.signals.on(eventSignal, onInteractionEvent);\n}\n\n// prevent native HTML5 drag on interact.js target elements\nInteraction.docEvents.dragstart = function preventNativeDrag (event) {\n for (const interaction of scope.interactions) {\n\n if (interaction.element\n && (interaction.element === event.target\n || nodeContains(interaction.element, event.target))) {\n\n interaction.target.checkAndPreventDefault(event);\n return;\n }\n }\n};\n","const scope = require('./scope');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst iFinder = require('./utils/interactionFinder');\nconst pointerEvents = require('./pointerEvents/base');\n\nconst { window } = require('./utils/window');\n\nconst toString = Object.prototype.toString;\n\nif (!window.Array.isArray) {\n window.Array.isArray = function (obj) {\n return toString.call(obj) === '[object Array]';\n };\n}\n\nif (!String.prototype.trim) {\n String.prototype.trim = function () {\n return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n };\n}\n\n// http://www.quirksmode.org/dom/events/click.html\n// >Events leading to dblclick\n//\n// IE8 doesn't fire down event before dblclick.\n// This workaround tries to fire a tap and doubletap after dblclick\nfunction onIE8Dblclick (event) {\n const eventTarget = event.target;\n const interaction = iFinder.search(event, event.type, eventTarget);\n\n if (!interaction) { return; }\n\n if (interaction.prevTap\n && event.clientX === interaction.prevTap.clientX\n && event.clientY === interaction.prevTap.clientY\n && eventTarget === interaction.prevTap.target) {\n\n interaction.downTargets[0] = eventTarget;\n interaction.downTimes [0] = new Date().getTime();\n\n pointerEvents.fire({\n interaction,\n event,\n eventTarget,\n pointer: event,\n type: 'tap',\n });\n }\n}\n\nif (browser.isIE8) {\n const selectFix = function (event) {\n for (const interaction of scope.interactions) {\n if (interaction.interacting()) {\n interaction.target.checkAndPreventDefault(event);\n }\n }\n };\n\n const onDocIE8 = function onDocIE8 ({ doc, win }, signalName) {\n const eventMethod = signalName.indexOf('listen') === 0\n ? events.add : events.remove;\n\n // For IE's lack of Event#preventDefault\n eventMethod(doc, 'selectstart', selectFix);\n\n if (pointerEvents) {\n eventMethod(doc, 'dblclick', onIE8Dblclick);\n }\n };\n\n scope.signals.on('add-document' , onDocIE8);\n scope.signals.on('remove-document', onDocIE8);\n}\n\nmodule.exports = null;\n","const InteractEvent = require('../InteractEvent');\nconst Interaction = require('../Interaction');\nconst extend = require('../utils/extend');\n\nconst modifiers = {\n names: [],\n\n setOffsets: function (arg) {\n const { interaction, pageCoords: page } = arg;\n const { target, element, startOffset } = interaction;\n const rect = target.getRect(element);\n\n if (rect) {\n startOffset.left = page.x - rect.left;\n startOffset.top = page.y - rect.top;\n\n startOffset.right = rect.right - page.x;\n startOffset.bottom = rect.bottom - page.y;\n\n if (!('width' in rect)) { rect.width = rect.right - rect.left; }\n if (!('height' in rect)) { rect.height = rect.bottom - rect.top ; }\n }\n else {\n startOffset.left = startOffset.top = startOffset.right = startOffset.bottom = 0;\n }\n\n arg.rect = rect;\n arg.interactable = target;\n arg.element = element;\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n\n arg.options = target.options[interaction.prepared.name][modifierName];\n\n if (!arg.options) {\n continue;\n }\n\n interaction.modifierOffsets[modifierName] = modifiers[modifierName].setOffset(arg);\n }\n },\n\n setAll: function (arg) {\n const { interaction, statuses, preEnd, requireEndOnly } = arg;\n const coords = extend({}, arg.pageCoords);\n const result = {\n dx: 0,\n dy: 0,\n changed: false,\n locked: false,\n shouldMove: true,\n };\n\n for (const modifierName of modifiers.names) {\n const modifier = modifiers[modifierName];\n const options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!shouldDo(options, preEnd, requireEndOnly)) { continue; }\n\n arg.status = arg.status = statuses[modifierName];\n arg.options = options;\n arg.offset = arg.interaction.modifierOffsets[modifierName];\n\n modifier.set(arg);\n\n if (arg.status.locked) {\n coords.x += arg.status.dx;\n coords.y += arg.status.dy;\n\n result.dx += arg.status.dx;\n result.dy += arg.status.dy;\n\n result.locked = true;\n }\n }\n\n // a move should be fired if:\n // - there are no modifiers enabled,\n // - no modifiers are \"locked\" i.e. have changed the pointer's coordinates, or\n // - the locked coords have changed since the last pointer move\n result.shouldMove = !arg.status || !result.locked || arg.status.changed;\n\n return result;\n },\n\n resetStatuses: function (statuses) {\n for (const modifierName of modifiers.names) {\n const status = statuses[modifierName] || {};\n\n status.dx = status.dy = 0;\n status.modifiedX = status.modifiedY = NaN;\n status.locked = false;\n status.changed = true;\n\n statuses[modifierName] = status;\n }\n\n return statuses;\n },\n\n start: function ({ interaction }, signalName) {\n const arg = {\n interaction,\n pageCoords: (signalName === 'action-resume' ?\n interaction.curCoords : interaction.startCoords).page,\n startOffset: interaction.startOffset,\n statuses: interaction.modifierStatuses,\n preEnd: false,\n requireEndOnly: false,\n };\n\n modifiers.setOffsets(arg);\n modifiers.resetStatuses(arg.statuses);\n\n arg.pageCoords = extend({}, interaction.startCoords.page);\n interaction.modifierResult = modifiers.setAll(arg);\n },\n};\n\nInteraction.signals.on('new', function (interaction) {\n interaction.startOffset = { left: 0, right: 0, top: 0, bottom: 0 };\n interaction.modifierOffsets = {};\n interaction.modifierStatuses = modifiers.resetStatuses({});\n interaction.modifierResult = null;\n});\n\nInteraction.signals.on('action-start' , modifiers.start);\nInteraction.signals.on('action-resume', modifiers.start);\n\nInteraction.signals.on('before-action-move', function ({ interaction, preEnd, interactingBeforeMove }) {\n const modifierResult = modifiers.setAll({\n interaction,\n preEnd,\n pageCoords: interaction.curCoords.page,\n statuses: interaction.modifierStatuses,\n requireEndOnly: false,\n });\n\n // don't fire an action move if a modifier would keep the event in the same\n // cordinates as before\n if (!modifierResult.shouldMove && interactingBeforeMove) {\n interaction._dontFireMove = true;\n }\n\n interaction.modifierResult = modifierResult;\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n for (let i = 0; i < modifiers.names.length; i++) {\n const options = interaction.target.options[interaction.prepared.name][modifiers.names[i]];\n\n // if the endOnly option is true for any modifier\n if (shouldDo(options, true, true)) {\n // fire a move event at the modified coordinates\n interaction.doMove({ event, preEnd: true });\n break;\n }\n }\n});\n\nInteractEvent.signals.on('set-xy', function (arg) {\n const { iEvent, interaction } = arg;\n const modifierArg = extend({}, arg);\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n modifierArg.options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!modifierArg.options) {\n continue;\n }\n\n const modifier = modifiers[modifierName];\n\n modifierArg.status = interaction.modifierStatuses[modifierName];\n\n iEvent[modifierName] = modifier.modifyCoords(modifierArg);\n }\n});\n\nfunction shouldDo (options, preEnd, requireEndOnly) {\n return (options && options.enabled\n && (preEnd || !options.endOnly)\n && (!requireEndOnly || options.endOnly));\n}\n\nmodule.exports = modifiers;\n","const modifiers = require('./index');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst restrict = {\n defaults: {\n enabled : false,\n endOnly : false,\n restriction: null,\n elementRect: null,\n },\n\n setOffset: function ({ rect, startOffset, options }) {\n const elementRect = options && options.elementRect;\n const offset = {};\n\n if (rect && elementRect) {\n offset.left = startOffset.left - (rect.width * elementRect.left);\n offset.top = startOffset.top - (rect.height * elementRect.top);\n\n offset.right = startOffset.right - (rect.width * (1 - elementRect.right));\n offset.bottom = startOffset.bottom - (rect.height * (1 - elementRect.bottom));\n }\n else {\n offset.left = offset.top = offset.right = offset.bottom = 0;\n }\n\n return offset;\n },\n\n set: function ({ pageCoords, interaction, status, options }) {\n if (!options) { return status; }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n\n const restriction = getRestrictionRect(options.restriction, interaction, page);\n\n if (!restriction) { return status; }\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n const rect = restriction;\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n const offset = interaction.modifierOffsets.restrict;\n\n // object is assumed to have\n // x, y, width, height or\n // left, top, right, bottom\n if ('x' in restriction && 'y' in restriction) {\n modifiedX = Math.max(Math.min(rect.x + rect.width - offset.right , page.x), rect.x + offset.left);\n modifiedY = Math.max(Math.min(rect.y + rect.height - offset.bottom, page.y), rect.y + offset.top );\n }\n else {\n modifiedX = Math.max(Math.min(rect.right - offset.right , page.x), rect.left + offset.left);\n modifiedY = Math.max(Math.min(rect.bottom - offset.bottom, page.y), rect.top + offset.top );\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const elementRect = options && options.elementRect;\n\n if (options && options.enabled\n && !(phase === 'start' && elementRect && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n getRestrictionRect,\n};\n\nfunction getRestrictionRect (value, interaction, page) {\n if (utils.is.function(value)) {\n return utils.resolveRectLike(value, interaction.target, interaction.element, [page.x, page.y, interaction]);\n } else {\n return utils.resolveRectLike(value, interaction.target, interaction.element);\n }\n}\n\nmodifiers.restrict = restrict;\nmodifiers.names.push('restrict');\n\ndefaultOptions.perAction.restrict = restrict.defaults;\n\nmodule.exports = restrict;\n","// This module adds the options.resize.restrictEdges setting which sets min and\n// max for the top, left, bottom and right edges of the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictEdges: {\n// inner: { top: 200, left: 200, right: 400, bottom: 400 },\n// outer: { top: 0, left: 0, right: 600, bottom: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst { getRestrictionRect } = require('./restrict');\n\nconst noInner = { top: +Infinity, left: +Infinity, bottom: -Infinity, right: -Infinity };\nconst noOuter = { top: -Infinity, left: -Infinity, bottom: +Infinity, right: +Infinity };\n\nconst restrictEdges = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n offset: null,\n },\n\n setOffset: function ({ interaction, startOffset, options }) {\n if (!options) {\n return utils.extend({}, startOffset);\n }\n\n const offset = getRestrictionRect(options.offset, interaction, interaction.startCoords.page);\n\n if (offset) {\n return {\n top: startOffset.top + offset.y,\n left: startOffset.left + offset.x,\n bottom: startOffset.bottom + offset.y,\n right: startOffset.right + offset.x,\n };\n }\n\n return startOffset;\n },\n\n set: function ({ pageCoords, interaction, status, offset, options }) {\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n const inner = rectUtils.xywhToTlbr(getRestrictionRect(options.inner, interaction, page)) || noInner;\n const outer = rectUtils.xywhToTlbr(getRestrictionRect(options.outer, interaction, page)) || noOuter;\n\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n if (edges.top) {\n modifiedY = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top);\n }\n else if (edges.bottom) {\n modifiedY = Math.max(Math.min(outer.bottom - offset.bottom, page.y), inner.bottom - offset.bottom);\n }\n if (edges.left) {\n modifiedX = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left);\n }\n else if (edges.right) {\n modifiedX = Math.max(Math.min(outer.right - offset.right, page.x), inner.right - offset.right);\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n if (options && options.enabled\n && !(phase === 'start' && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n noInner,\n noOuter,\n getRestrictionRect,\n};\n\nmodifiers.restrictEdges = restrictEdges;\nmodifiers.names.push('restrictEdges');\n\ndefaultOptions.perAction.restrictEdges = restrictEdges.defaults;\nresize.defaults.restrictEdges = restrictEdges.defaults;\n\nmodule.exports = restrictEdges;\n","// This module adds the options.resize.restrictSize setting which sets min and\n// max width and height for the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictSize: {\n// min: { width: -600, height: -600 },\n// max: { width: 600, height: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst restrictEdges = require('./restrictEdges');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst noMin = { width: -Infinity, height: -Infinity };\nconst noMax = { width: +Infinity, height: +Infinity };\n\nconst restrictSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n },\n\n setOffset: function ({ interaction }) {\n return interaction.startOffset;\n },\n\n set: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const rect = rectUtils.xywhToTlbr(interaction.resizeRects.inverted);\n\n const minSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.min, interaction)) || noMin;\n const maxSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.max, interaction)) || noMax;\n\n arg.options = {\n enabled: options.enabled,\n endOnly: options.endOnly,\n inner: utils.extend({}, restrictEdges.noInner),\n outer: utils.extend({}, restrictEdges.noOuter),\n };\n\n if (edges.top) {\n arg.options.inner.top = rect.bottom - minSize.height;\n arg.options.outer.top = rect.bottom - maxSize.height;\n }\n else if (edges.bottom) {\n arg.options.inner.bottom = rect.top + minSize.height;\n arg.options.outer.bottom = rect.top + maxSize.height;\n }\n if (edges.left) {\n arg.options.inner.left = rect.right - minSize.width;\n arg.options.outer.left = rect.right - maxSize.width;\n }\n else if (edges.right) {\n arg.options.inner.right = rect.left + minSize.width;\n arg.options.outer.right = rect.left + maxSize.width;\n }\n\n restrictEdges.set(arg);\n },\n\n modifyCoords: restrictEdges.modifyCoords,\n};\n\nmodifiers.restrictSize = restrictSize;\nmodifiers.names.push('restrictSize');\n\ndefaultOptions.perAction.restrictSize = restrictSize.defaults;\nresize.defaults.restrictSize = restrictSize.defaults;\n\nmodule.exports = restrictSize;\n","const modifiers = require('./index');\nconst interact = require('../interact');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst snap = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n\n relativePoints: null,\n },\n\n setOffset: function ({ interaction, interactable, element, rect, startOffset, options }) {\n const offsets = [];\n const optionsOrigin = utils.rectToXY(utils.resolveRectLike(options.origin));\n const origin = optionsOrigin || utils.getOriginXY(interactable, element, interaction.prepared.name);\n options = options || interactable.options[interaction.prepared.name].snap || {};\n\n let snapOffset;\n\n if (options.offset === 'startCoords') {\n snapOffset = {\n x: interaction.startCoords.page.x - origin.x,\n y: interaction.startCoords.page.y - origin.y,\n };\n }\n else {\n const offsetRect = utils.resolveRectLike(options.offset, interactable, element, [interaction]);\n\n snapOffset = utils.rectToXY(offsetRect) || { x: 0, y: 0 };\n }\n\n if (rect && options.relativePoints && options.relativePoints.length) {\n for (const { x: relativeX, y: relativeY } of options.relativePoints) {\n offsets.push({\n x: startOffset.left - (rect.width * relativeX) + snapOffset.x,\n y: startOffset.top - (rect.height * relativeY) + snapOffset.y,\n });\n }\n }\n else {\n offsets.push(snapOffset);\n }\n\n return offsets;\n },\n\n set: function ({ interaction, pageCoords, status, options, offset: offsets }) {\n const targets = [];\n let target;\n let page;\n let i;\n\n if (status.useStatusXY) {\n page = { x: status.x, y: status.y };\n }\n else {\n const origin = utils.getOriginXY(interaction.target, interaction.element, interaction.prepared.name);\n\n page = utils.extend({}, pageCoords);\n\n page.x -= origin.x;\n page.y -= origin.y;\n }\n\n status.realX = page.x;\n status.realY = page.y;\n\n let len = options.targets? options.targets.length : 0;\n\n for (const { x: offsetX, y: offsetY } of offsets) {\n const relativeX = page.x - offsetX;\n const relativeY = page.y - offsetY;\n\n for (const snapTarget of options.targets) {\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n targets.push({\n x: utils.is.number(target.x) ? (target.x + offsetX) : relativeX,\n y: utils.is.number(target.y) ? (target.y + offsetY) : relativeY,\n\n range: utils.is.number(target.range)? target.range: options.range,\n });\n }\n }\n\n const closest = {\n target: null,\n inRange: false,\n distance: 0,\n range: 0,\n dx: 0,\n dy: 0,\n };\n\n for (i = 0, len = targets.length; i < len; i++) {\n target = targets[i];\n\n const range = target.range;\n const dx = target.x - page.x;\n const dy = target.y - page.y;\n const distance = utils.hypot(dx, dy);\n let inRange = distance <= range;\n\n // Infinite targets count as being out of range\n // compared to non infinite ones that are in range\n if (range === Infinity && closest.inRange && closest.range !== Infinity) {\n inRange = false;\n }\n\n if (!closest.target || (inRange\n // is the closest target in range?\n ? (closest.inRange && range !== Infinity\n // the pointer is relatively deeper in this target\n ? distance / range < closest.distance / closest.range\n // this target has Infinite range and the closest doesn't\n : (range === Infinity && closest.range !== Infinity)\n // OR this target is closer that the previous closest\n || distance < closest.distance)\n // The other is not in range and the pointer is closer to this target\n : (!closest.inRange && distance < closest.distance))) {\n\n closest.target = target;\n closest.distance = distance;\n closest.range = range;\n closest.inRange = inRange;\n closest.dx = dx;\n closest.dy = dy;\n\n status.range = range;\n }\n }\n\n let snapChanged;\n\n if (closest.target) {\n snapChanged = (status.modifiedX !== closest.target.x || status.modifiedY !== closest.target.y);\n\n status.modifiedX = closest.target.x;\n status.modifiedY = closest.target.y;\n }\n else {\n snapChanged = true;\n\n status.modifiedX = NaN;\n status.modifiedY = NaN;\n }\n\n status.dx = closest.dx;\n status.dy = closest.dy;\n\n status.changed = (snapChanged || (closest.inRange && !status.locked));\n status.locked = closest.inRange;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const relativePoints = options && options.relativePoints;\n\n if (options && options.enabled\n && !(phase === 'start' && relativePoints && relativePoints.length)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n }\n\n return {\n range : status.range,\n locked : status.locked,\n x : status.modifiedX,\n y : status.modifiedY,\n realX : status.realX,\n realY : status.realY,\n dx : status.dx,\n dy : status.dy,\n };\n }\n },\n};\n\ninteract.createSnapGrid = function (grid) {\n return function (x, y) {\n const limits = grid.limits || {\n left : -Infinity,\n right : Infinity,\n top : -Infinity,\n bottom: Infinity,\n };\n let offsetX = 0;\n let offsetY = 0;\n\n if (utils.is.object(grid.offset)) {\n offsetX = grid.offset.x;\n offsetY = grid.offset.y;\n }\n\n const gridx = Math.round((x - offsetX) / grid.x);\n const gridy = Math.round((y - offsetY) / grid.y);\n\n const newX = Math.max(limits.left, Math.min(limits.right , gridx * grid.x + offsetX));\n const newY = Math.max(limits.top , Math.min(limits.bottom, gridy * grid.y + offsetY));\n\n return {\n x: newX,\n y: newY,\n range: grid.range,\n };\n };\n};\n\nmodifiers.snap = snap;\nmodifiers.names.push('snap');\n\ndefaultOptions.perAction.snap = snap.defaults;\n\nmodule.exports = snap;\n","// This module allows snapping of the size of targets during resize\n// interactions.\n\nconst modifiers = require('./index');\nconst snap = require('./snap');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\nconst utils = require('../utils/');\n\nconst snapSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n },\n\n setOffset: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.edges;\n\n if (!edges) { return; }\n\n arg.options = {\n relativePoints: [{\n x: edges.left? 0 : 1,\n y: edges.top ? 0 : 1,\n }],\n origin: { x: 0, y: 0 },\n offset: 'self',\n range: options.range,\n };\n\n const offsets = snap.setOffset(arg);\n arg.options = options;\n\n return offsets;\n },\n\n set: function (arg) {\n const { interaction, options, offset, pageCoords } = arg;\n const page = utils.extend({}, pageCoords);\n const relativeX = page.x - offset[0].x;\n const relativeY = page.y - offset[0].y;\n\n arg.options = utils.extend({}, options);\n arg.options.targets = [];\n\n for (const snapTarget of options.targets) {\n let target;\n\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n if ('width' in target && 'height' in target) {\n target.x = target.width;\n target.y = target.height;\n }\n\n arg.options.targets.push(target);\n }\n\n snap.set(arg);\n },\n\n modifyCoords: function (arg) {\n const { options } = arg;\n\n arg.options = utils.extend({}, options);\n arg.options.enabled = options.enabled;\n arg.options.relativePoints = [null];\n\n snap.modifyCoords(arg);\n },\n};\n\nmodifiers.snapSize = snapSize;\nmodifiers.names.push('snapSize');\n\ndefaultOptions.perAction.snapSize = snapSize.defaults;\nresize.defaults.snapSize = snapSize.defaults;\n\nmodule.exports = snapSize;\n","const pointerUtils = require('../utils/pointerUtils');\n\nmodule.exports = class PointerEvent {\n constructor (type, pointer, event, eventTarget, interaction) {\n pointerUtils.pointerExtend(this, event);\n\n if (event !== pointer) {\n pointerUtils.pointerExtend(this, pointer);\n }\n\n this.interaction = interaction;\n\n this.timeStamp = new Date().getTime();\n this.originalEvent = event;\n this.type = type;\n this.pointerId = pointerUtils.getPointerId(pointer);\n this.pointerType = pointerUtils.getPointerType(pointer, interaction);\n this.target = eventTarget;\n this.currentTarget = null;\n\n if (type === 'tap') {\n const pointerIndex = interaction.getPointerIndex(pointer);\n this.dt = this.timeStamp - interaction.downTimes[pointerIndex];\n\n const interval = this.timeStamp - interaction.tapTime;\n\n this.double = !!(interaction.prevTap\n && interaction.prevTap.type !== 'doubletap'\n && interaction.prevTap.target === this.target\n && interval < 500);\n }\n else if (type === 'doubletap') {\n this.dt = pointer.timeStamp - interaction.tapTime;\n }\n }\n\n subtractOrigin ({ x: originX, y: originY }) {\n this.pageX -= originX;\n this.pageY -= originY;\n this.clientX -= originX;\n this.clientY -= originY;\n\n return this;\n }\n\n addOrigin ({ x: originX, y: originY }) {\n this.pageX += originX;\n this.pageY += originY;\n this.clientX += originX;\n this.clientY += originY;\n\n return this;\n }\n\n preventDefault () {\n this.originalEvent.preventDefault();\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n};\n","const PointerEvent = require('./PointerEvent');\nconst Interaction = require('../Interaction');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst defaults = require('../defaultOptions');\nconst signals = require('../utils/Signals').new();\nconst { filter } = require('../utils/arr');\n\nconst simpleSignals = [ 'down', 'up', 'cancel' ];\nconst simpleEvents = [ 'down', 'up', 'cancel' ];\n\nconst pointerEvents = {\n PointerEvent,\n fire,\n collectEventTargets,\n signals,\n defaults: {\n holdDuration: 600,\n ignoreFrom : null,\n allowFrom : null,\n origin : { x: 0, y: 0 },\n },\n types: [\n 'down',\n 'move',\n 'up',\n 'cancel',\n 'tap',\n 'doubletap',\n 'hold',\n ],\n};\n\nfunction fire (arg) {\n const {\n interaction, pointer, event, eventTarget,\n type = arg.pointerEvent.type,\n targets = collectEventTargets(arg),\n pointerEvent = new PointerEvent(type, pointer, event, eventTarget, interaction),\n } = arg;\n\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n targets,\n type,\n pointerEvent,\n };\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n\n for (const prop in target.props || {}) {\n pointerEvent[prop] = target.props[prop];\n }\n\n const origin = utils.getOriginXY(target.eventable, target.element);\n\n pointerEvent.subtractOrigin(origin);\n pointerEvent.eventable = target.eventable;\n pointerEvent.currentTarget = target.element;\n\n target.eventable.fire(pointerEvent);\n\n pointerEvent.addOrigin(origin);\n\n if (pointerEvent.immediatePropagationStopped\n || (pointerEvent.propagationStopped\n && (i + 1) < targets.length && targets[i + 1].element !== pointerEvent.currentTarget)) {\n break;\n }\n }\n\n signals.fire('fired', signalArg);\n\n if (type === 'tap') {\n // if pointerEvent should make a double tap, create and fire a doubletap\n // PointerEvent and use that as the prevTap\n const prevTap = pointerEvent.double\n ? fire({\n interaction, pointer, event, eventTarget,\n type: 'doubletap',\n })\n : pointerEvent;\n\n interaction.prevTap = prevTap;\n interaction.tapTime = prevTap.timeStamp;\n }\n\n return pointerEvent;\n}\n\nfunction collectEventTargets ({ interaction, pointer, event, eventTarget, type }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n // do not fire a tap event if the pointer was moved before being lifted\n if (type === 'tap' && (interaction.pointerWasMoved\n // or if the pointerup target is different to the pointerdown target\n || !(interaction.downTargets[pointerIndex] && interaction.downTargets[pointerIndex] === eventTarget))) {\n return [];\n }\n\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n path,\n targets: [],\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (type === 'hold') {\n signalArg.targets = filter(signalArg.targets, target =>\n target.eventable.options.holdDuration === interaction.holdTimers[pointerIndex].duration);\n }\n\n return signalArg.targets;\n}\n\nInteraction.signals.on('update-pointer-down', function ({ interaction, pointerIndex }) {\n interaction.holdTimers[pointerIndex] = { duration: Infinity, timeout: null };\n});\n\nInteraction.signals.on('remove-pointer', function ({ interaction, pointerIndex }) {\n interaction.holdTimers.splice(pointerIndex, 1);\n});\n\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget, duplicateMove }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n if (!duplicateMove && (!interaction.pointerIsDown || interaction.pointerWasMoved)) {\n if (interaction.pointerIsDown) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n\n fire({\n interaction, pointer, event, eventTarget,\n type: 'move',\n });\n }\n});\n\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget, pointerIndex }) {\n // copy event to be used in timeout for IE8\n const eventCopy = browser.isIE8? utils.extend({}, event) : event;\n\n const timer = interaction.holdTimers[pointerIndex];\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'hold',\n targets: [],\n path,\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (!signalArg.targets.length) { return; }\n\n let minDuration = Infinity;\n\n for (let i = 0; i < signalArg.targets.length; i++) {\n const target = signalArg.targets[i];\n const holdDuration = target.eventable.options.holdDuration;\n\n if (holdDuration < minDuration) {\n minDuration = holdDuration;\n }\n }\n\n timer.duration = minDuration;\n timer.timeout = setTimeout(function () {\n fire({\n interaction, eventCopy, eventTarget,\n pointer: browser.isIE8? eventCopy : pointer,\n type: 'hold',\n });\n }, minDuration);\n});\n\nInteraction.signals.on('up', ({ interaction, pointer, event, eventTarget }) => {\n if (!interaction.pointerWasMoved) {\n fire({ interaction, eventTarget, pointer, event, type: 'tap' });\n }\n});\n\n['up', 'cancel'].forEach(function (signalName) {\n Interaction.signals.on(signalName, function ({ interaction, pointerIndex }) {\n if (interaction.holdTimers[pointerIndex]) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n });\n});\n\nfunction createSignalListener (type) {\n return function ({ interaction, pointer, event, eventTarget }) {\n fire({ interaction, eventTarget, pointer, event, type });\n };\n}\n\nfor (let i = 0; i < simpleSignals.length; i++) {\n Interaction.signals.on(simpleSignals[i], createSignalListener(simpleEvents[i]));\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.prevTap = null; // the most recent tap event on this interaction\n interaction.tapTime = 0; // time of the most recent tap event\n interaction.holdTimers = []; // [{ duration, timeout }]\n});\n\ndefaults.pointerEvents = pointerEvents.defaults;\nmodule.exports = pointerEvents;\n","const pointerEvents = require('./base');\nconst Interaction = require('../Interaction');\n\npointerEvents.signals.on('new', onNew);\npointerEvents.signals.on('fired', onFired);\n\nfor (const signal of ['move', 'up', 'cancel', 'endall']) {\n Interaction.signals.on(signal, endHoldRepeat);\n}\n\nfunction onNew ({ pointerEvent }) {\n if (pointerEvent.type !== 'hold') { return; }\n\n pointerEvent.count = (pointerEvent.count || 0) + 1;\n}\n\nfunction onFired ({ interaction, pointerEvent, eventTarget, targets }) {\n if (pointerEvent.type !== 'hold' || !targets.length) { return; }\n\n // get the repeat interval from the first eventable\n const interval = targets[0].eventable.options.holdRepeatInterval;\n\n // don't repeat if the interval is 0 or less\n if (interval <= 0) { return; }\n\n // set a timeout to fire the holdrepeat event\n interaction.holdIntervalHandle = setTimeout(function () {\n pointerEvents.fire({\n interaction,\n eventTarget,\n type: 'hold',\n pointer: pointerEvent,\n event: pointerEvent,\n });\n }, interval);\n}\n\nfunction endHoldRepeat ({ interaction }) {\n // set the interaction's holdStopTime property\n // to stop further holdRepeat events\n if (interaction.holdIntervalHandle) {\n clearInterval(interaction.holdIntervalHandle);\n interaction.holdIntervalHandle = null;\n }\n}\n\n// don't repeat by default\npointerEvents.defaults.holdRepeatInterval = 0;\npointerEvents.types.push('holdrepeat');\n\nmodule.exports = {\n onNew,\n onFired,\n endHoldRepeat,\n};\n","const pointerEvents = require('./base');\nconst Interactable = require('../Interactable');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\nconst scope = require('../scope');\nconst extend = require('../utils/extend');\nconst { merge } = require('../utils/arr');\n\npointerEvents.signals.on('collect-targets', function ({ targets, element, type, eventTarget }) {\n function collectSelectors (interactable, selector, context) {\n const els = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && is.element(element)\n && domUtils.matchesSelector(element, selector, els)\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n const interactable = scope.interactables.get(element);\n\n if (interactable) {\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n scope.interactables.forEachSelector(collectSelectors, element);\n});\n\nInteractable.signals.on('new', function ({ interactable }) {\n interactable.events.getRect = function (element) {\n return interactable.getRect(element);\n };\n});\n\nInteractable.signals.on('set', function ({ interactable, options }) {\n extend(interactable.events.options, pointerEvents.defaults);\n extend(interactable.events.options, options);\n});\n\nmerge(Interactable.eventTypes, pointerEvents.types);\n\nInteractable.prototype.pointerEvents = function (options) {\n extend(this.events.options, options);\n\n return this;\n};\n\nconst __backCompatOption = Interactable.prototype._backCompatOption;\n\nInteractable.prototype._backCompatOption = function (optionName, newValue) {\n const ret = __backCompatOption.call(this, optionName, newValue);\n\n if (ret === this) {\n this.events.options[optionName] = newValue;\n }\n\n return ret;\n};\n\nInteractable.settingsMethods.push('pointerEvents');\n","const utils = require('./utils');\nconst events = require('./utils/events');\nconst signals = require('./utils/Signals').new();\n\nconst scope = {\n signals,\n events,\n utils,\n\n // main document\n document: require('./utils/domObjects').document,\n // all documents being listened to\n documents: [],\n\n addDocument: function (doc, win) {\n // do nothing if document is already known\n if (utils.contains(scope.documents, doc)) { return false; }\n\n win = win || scope.getWindow(doc);\n\n scope.documents.push(doc);\n events.documents.push(doc);\n\n // don't add an unload event for the main document\n // so that the page may be cached in browser history\n if (doc !== scope.document) {\n events.add(win, 'unload', scope.onWindowUnload);\n }\n\n signals.fire('add-document', { doc, win });\n },\n\n removeDocument: function (doc, win) {\n const index = utils.indexOf(scope.documents, doc);\n\n win = win || scope.getWindow(doc);\n\n events.remove(win, 'unload', scope.onWindowUnload);\n\n scope.documents.splice(index, 1);\n events.documents.splice(index, 1);\n\n signals.fire('remove-document', { win, doc });\n },\n\n onWindowUnload: function () {\n scope.removeDocument(this.document, this);\n },\n};\n\nmodule.exports = scope;\n","const { indexOf } = require('./arr');\n\nclass Signals {\n constructor () {\n this.listeners = {\n // signalName: [listeners],\n };\n }\n\n on (name, listener) {\n if (!this.listeners[name]) {\n this.listeners[name] = [listener];\n return;\n }\n\n this.listeners[name].push(listener);\n }\n\n off (name, listener) {\n if (!this.listeners[name]) { return; }\n\n const index = indexOf(this.listeners[name], listener);\n\n if (index !== -1) {\n this.listeners[name].splice(index, 1);\n }\n }\n\n fire (name, arg) {\n const targetListeners = this.listeners[name];\n\n if (!targetListeners) { return; }\n\n for (let i = 0; i < targetListeners.length; i++) {\n if (targetListeners[i](arg, name) === false) {\n return;\n }\n }\n }\n}\n\nSignals.new = function () {\n return new Signals();\n};\n\nmodule.exports = Signals;\n","function indexOf (array, target) {\n for (let i = 0, len = array.length; i < len; i++) {\n if (array[i] === target) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction contains (array, target) {\n return indexOf(array, target) !== -1;\n}\n\nfunction merge (target, source) {\n for (let i = 0; i < source.length; i++) {\n target.push(source[i]);\n }\n\n return target;\n}\n\nfunction filter (array, test) {\n const result = [];\n\n for (let i = 0; i < array.length; i++) {\n if (test(array[i])) {\n result.push(array[i]);\n }\n }\n\n return result;\n}\n\nmodule.exports = {\n indexOf,\n contains,\n merge,\n filter,\n};\n","const { window } = require('./window');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst Element = domObjects.Element;\nconst navigator = window.navigator;\n\nconst browser = {\n // Does the browser support touch input?\n supportsTouch: !!(('ontouchstart' in window) || is.function(window.DocumentTouch)\n && domObjects.document instanceof window.DocumentTouch),\n\n // Does the browser support PointerEvents\n supportsPointerEvent: !!domObjects.PointerEvent,\n\n isIE8: ('attachEvent' in window) && !('addEventListener' in window),\n\n // Opera Mobile must be handled differently\n isOperaMobile: (navigator.appName === 'Opera'\n && browser.supportsTouch\n && navigator.userAgent.match('Presto')),\n\n // scrolling doesn't change the result of getClientRects on iOS 7\n isIOS7: (/iP(hone|od|ad)/.test(navigator.platform)\n && /OS 7[^\\d]/.test(navigator.appVersion)),\n\n isIe9OrOlder: /MSIE (8|9)/.test(navigator.userAgent),\n\n // prefix matchesSelector\n prefixedMatchesSelector: 'matches' in Element.prototype\n ? 'matches': 'webkitMatchesSelector' in Element.prototype\n ? 'webkitMatchesSelector': 'mozMatchesSelector' in Element.prototype\n ? 'mozMatchesSelector': 'oMatchesSelector' in Element.prototype\n ? 'oMatchesSelector': 'msMatchesSelector',\n\n useMatchesSelectorPolyfill: false,\n\n pEventTypes: (domObjects.PointerEvent\n ? (domObjects.PointerEvent === window.MSPointerEvent\n ? {\n up: 'MSPointerUp',\n down: 'MSPointerDown',\n over: 'mouseover',\n out: 'mouseout',\n move: 'MSPointerMove',\n cancel: 'MSPointerCancel',\n }\n : {\n up: 'pointerup',\n down: 'pointerdown',\n over: 'pointerover',\n out: 'pointerout',\n move: 'pointermove',\n cancel: 'pointercancel',\n })\n : null),\n\n // because Webkit and Opera still use 'mousewheel' event type\n wheelEvent: 'onmousewheel' in domObjects.document? 'mousewheel': 'wheel',\n\n};\n\nbrowser.useMatchesSelectorPolyfill = !is.function(Element.prototype[browser.prefixedMatchesSelector]);\n\nmodule.exports = browser;\n","const domObjects = {};\nconst win = require('./window').window;\n\nfunction blank () {}\n\ndomObjects.document = win.document;\ndomObjects.DocumentFragment = win.DocumentFragment || blank;\ndomObjects.SVGElement = win.SVGElement || blank;\ndomObjects.SVGSVGElement = win.SVGSVGElement || blank;\ndomObjects.SVGElementInstance = win.SVGElementInstance || blank;\ndomObjects.Element = win.Element || blank;\ndomObjects.HTMLElement = win.HTMLElement || domObjects.Element;\n\ndomObjects.Event = win.Event;\ndomObjects.Touch = win.Touch || blank;\ndomObjects.PointerEvent = (win.PointerEvent || win.MSPointerEvent);\n\nmodule.exports = domObjects;\n","const win = require('./window');\nconst browser = require('./browser');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst domUtils = {\n nodeContains: function (parent, child) {\n while (child) {\n if (child === parent) {\n return true;\n }\n\n child = child.parentNode;\n }\n\n return false;\n },\n\n closest: function (element, selector) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) { return element; }\n\n element = domUtils.parentNode(element);\n }\n\n return null;\n },\n\n parentNode: function (node) {\n let parent = node.parentNode;\n\n if (is.docFrag(parent)) {\n // skip past #shado-root fragments\n while ((parent = parent.host) && is.docFrag(parent)) {\n continue;\n }\n\n return parent;\n }\n\n return parent;\n },\n\n // taken from http://tanalin.com/en/blog/2012/12/matches-selector-ie8/ and modified\n matchesSelectorPolyfill: browser.useMatchesSelectorPolyfill\n ? function (element, selector, elems) {\n elems = elems || element.parentNode.querySelectorAll(selector);\n\n for (let i = 0, len = elems.length; i < len; i++) {\n if (elems[i] === element) {\n return true;\n }\n }\n\n return false;\n }\n : null,\n\n matchesSelector: function (element, selector, nodeList) {\n if (browser.useMatchesSelectorPolyfill) {\n return domUtils.matchesSelectorPolyfill(element, selector, nodeList);\n }\n\n // remove /deep/ from selectors if shadowDOM polyfill is used\n if (win.window !== win.realWindow) {\n selector = selector.replace(/\\/deep\\//g, ' ');\n }\n\n return element[browser.prefixedMatchesSelector](selector);\n },\n\n // Test for the element that's \"above\" all other qualifiers\n indexOfDeepestElement: function (elements) {\n let deepestZoneParents = [];\n let dropzoneParents = [];\n let dropzone;\n let deepestZone = elements[0];\n let index = deepestZone? 0: -1;\n let parent;\n let child;\n let i;\n let n;\n\n for (i = 1; i < elements.length; i++) {\n dropzone = elements[i];\n\n // an element might belong to multiple selector dropzones\n if (!dropzone || dropzone === deepestZone) {\n continue;\n }\n\n if (!deepestZone) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n // check if the deepest or current are document.documentElement or document.rootElement\n // - if the current dropzone is, do nothing and continue\n if (dropzone.parentNode === dropzone.ownerDocument) {\n continue;\n }\n // - if deepest is, update with the current dropzone and continue to next\n else if (deepestZone.parentNode === dropzone.ownerDocument) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n if (!deepestZoneParents.length) {\n parent = deepestZone;\n while (parent.parentNode && parent.parentNode !== parent.ownerDocument) {\n deepestZoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n }\n\n // if this element is an svg element and the current deepest is\n // an HTMLElement\n if (deepestZone instanceof domObjects.HTMLElement\n && dropzone instanceof domObjects.SVGElement\n && !(dropzone instanceof domObjects.SVGSVGElement)) {\n\n if (dropzone === deepestZone.parentNode) {\n continue;\n }\n\n parent = dropzone.ownerSVGElement;\n }\n else {\n parent = dropzone;\n }\n\n dropzoneParents = [];\n\n while (parent.parentNode !== parent.ownerDocument) {\n dropzoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n\n n = 0;\n\n // get (position of last common ancestor) + 1\n while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) {\n n++;\n }\n\n const parents = [\n dropzoneParents[n - 1],\n dropzoneParents[n],\n deepestZoneParents[n],\n ];\n\n child = parents[0].lastChild;\n\n while (child) {\n if (child === parents[1]) {\n deepestZone = dropzone;\n index = i;\n deepestZoneParents = [];\n\n break;\n }\n else if (child === parents[2]) {\n break;\n }\n\n child = child.previousSibling;\n }\n }\n\n return index;\n },\n\n matchesUpTo: function (element, selector, limit) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) {\n return true;\n }\n\n element = domUtils.parentNode(element);\n\n if (element === limit) {\n return domUtils.matchesSelector(element, selector);\n }\n }\n\n return false;\n },\n\n getActualElement: function (element) {\n return (element instanceof domObjects.SVGElementInstance\n ? element.correspondingUseElement\n : element);\n },\n\n getScrollXY: function (relevantWindow) {\n relevantWindow = relevantWindow || win.window;\n return {\n x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft,\n y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop,\n };\n },\n\n getElementClientRect: function (element) {\n const clientRect = (element instanceof domObjects.SVGElement\n ? element.getBoundingClientRect()\n : element.getClientRects()[0]);\n\n return clientRect && {\n left : clientRect.left,\n right : clientRect.right,\n top : clientRect.top,\n bottom: clientRect.bottom,\n width : clientRect.width || clientRect.right - clientRect.left,\n height: clientRect.height || clientRect.bottom - clientRect.top,\n };\n },\n\n getElementRect: function (element) {\n const clientRect = domUtils.getElementClientRect(element);\n\n if (!browser.isIOS7 && clientRect) {\n const scroll = domUtils.getScrollXY(win.getWindow(element));\n\n clientRect.left += scroll.x;\n clientRect.right += scroll.x;\n clientRect.top += scroll.y;\n clientRect.bottom += scroll.y;\n }\n\n return clientRect;\n },\n\n getPath: function (element) {\n const path = [];\n\n while (element) {\n path.push(element);\n element = domUtils.parentNode(element);\n }\n\n return path;\n },\n\n trySelector: value => {\n if (!is.string(value)) { return false; }\n\n // an exception will be raised if it is invalid\n domObjects.document.querySelector(value);\n return true;\n },\n};\n\nmodule.exports = domUtils;\n","const is = require('./is');\nconst domUtils = require('./domUtils');\nconst pExtend = require('./pointerExtend');\n\nconst { window, getWindow } = require('./window');\nconst { indexOf, contains } = require('./arr');\n\nconst useAttachEvent = ('attachEvent' in window) && !('addEventListener' in window);\nconst addEvent = useAttachEvent? 'attachEvent': 'addEventListener';\nconst removeEvent = useAttachEvent? 'detachEvent': 'removeEventListener';\nconst on = useAttachEvent? 'on': '';\n\nconst elements = [];\nconst targets = [];\nconst attachedListeners = [];\n\n// {\n// type: {\n// selectors: ['selector', ...],\n// contexts : [document, ...],\n// listeners: [[listener, capture, passive], ...]\n// }\n// }\nconst delegatedEvents = {};\n\nconst documents = [];\n\nconst supportsOptions = !useAttachEvent && (() => {\n let supported = false;\n\n window.document.createElement('div').addEventListener('test', null, {\n get capture () { supported = true; },\n });\n\n return supported;\n})();\n\nfunction add (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n let elementIndex = indexOf(elements, element);\n let target = targets[elementIndex];\n\n if (!target) {\n target = {\n events: {},\n typeCount: 0,\n };\n\n elementIndex = elements.push(element) - 1;\n targets.push(target);\n\n attachedListeners.push(useAttachEvent\n ? {\n supplied: [],\n wrapped : [],\n useCount: [],\n }\n : null);\n }\n\n if (!target.events[type]) {\n target.events[type] = [];\n target.typeCount++;\n }\n\n if (!contains(target.events[type], listener)) {\n let ret;\n\n if (useAttachEvent) {\n const { supplied, wrapped, useCount } = attachedListeners[elementIndex];\n const listenerIndex = indexOf(supplied, listener);\n\n const wrappedListener = wrapped[listenerIndex] || function (event) {\n if (!event.immediatePropagationStopped) {\n event.target = event.srcElement;\n event.currentTarget = element;\n\n event.preventDefault = event.preventDefault || preventDef;\n event.stopPropagation = event.stopPropagation || stopProp;\n event.stopImmediatePropagation = event.stopImmediatePropagation || stopImmProp;\n\n if (/mouse|click/.test(event.type)) {\n event.pageX = event.clientX + getWindow(element).document.documentElement.scrollLeft;\n event.pageY = event.clientY + getWindow(element).document.documentElement.scrollTop;\n }\n\n listener(event);\n }\n };\n\n ret = element[addEvent](on + type, wrappedListener, !!options.capture);\n\n if (listenerIndex === -1) {\n supplied.push(listener);\n wrapped.push(wrappedListener);\n useCount.push(1);\n }\n else {\n useCount[listenerIndex]++;\n }\n }\n else {\n ret = element[addEvent](type, listener, supportsOptions? options : !!options.capture);\n }\n target.events[type].push(listener);\n\n return ret;\n }\n}\n\nfunction remove (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const elementIndex = indexOf(elements, element);\n const target = targets[elementIndex];\n\n if (!target || !target.events) {\n return;\n }\n\n let wrappedListener = listener;\n let listeners;\n let listenerIndex;\n\n if (useAttachEvent) {\n listeners = attachedListeners[elementIndex];\n listenerIndex = indexOf(listeners.supplied, listener);\n wrappedListener = listeners.wrapped[listenerIndex];\n }\n\n if (type === 'all') {\n for (type in target.events) {\n if (target.events.hasOwnProperty(type)) {\n remove(element, type, 'all');\n }\n }\n return;\n }\n\n if (target.events[type]) {\n const len = target.events[type].length;\n\n if (listener === 'all') {\n for (let i = 0; i < len; i++) {\n remove(element, type, target.events[type][i], options);\n }\n return;\n }\n else {\n for (let i = 0; i < len; i++) {\n if (target.events[type][i] === listener) {\n element[removeEvent](on + type, wrappedListener, supportsOptions? options : !!options.capture);\n target.events[type].splice(i, 1);\n\n if (useAttachEvent && listeners) {\n listeners.useCount[listenerIndex]--;\n if (listeners.useCount[listenerIndex] === 0) {\n listeners.supplied.splice(listenerIndex, 1);\n listeners.wrapped.splice(listenerIndex, 1);\n listeners.useCount.splice(listenerIndex, 1);\n }\n }\n\n break;\n }\n }\n }\n\n if (target.events[type] && target.events[type].length === 0) {\n target.events[type] = null;\n target.typeCount--;\n }\n }\n\n if (!target.typeCount) {\n targets.splice(elementIndex, 1);\n elements.splice(elementIndex, 1);\n attachedListeners.splice(elementIndex, 1);\n }\n}\n\nfunction addDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n if (!delegatedEvents[type]) {\n delegatedEvents[type] = {\n selectors: [],\n contexts : [],\n listeners: [],\n };\n\n // add delegate listener functions\n for (let i = 0; i < documents.length; i++) {\n add(documents[i], type, delegateListener);\n add(documents[i], type, delegateUseCapture, true);\n }\n }\n\n const delegated = delegatedEvents[type];\n let index;\n\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n break;\n }\n }\n\n if (index === -1) {\n index = delegated.selectors.length;\n\n delegated.selectors.push(selector);\n delegated.contexts .push(context);\n delegated.listeners.push([]);\n }\n\n // keep listener and capture and passive flags\n delegated.listeners[index].push([listener, !!options.capture, options.passive]);\n}\n\nfunction removeDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const delegated = delegatedEvents[type];\n let matchFound = false;\n let index;\n\n if (!delegated) { return; }\n\n // count from last index of delegated to 0\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n // look for matching selector and context Node\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n\n const listeners = delegated.listeners[index];\n\n // each item of the listeners array is an array: [function, capture, passive]\n for (let i = listeners.length - 1; i >= 0; i--) {\n const [fn, capture, passive] = listeners[i];\n\n // check if the listener functions and capture and passive flags match\n if (fn === listener && capture === !!options.capture && passive === options.passive) {\n // remove the listener from the array of listeners\n listeners.splice(i, 1);\n\n // if all listeners for this interactable have been removed\n // remove the interactable from the delegated arrays\n if (!listeners.length) {\n delegated.selectors.splice(index, 1);\n delegated.contexts .splice(index, 1);\n delegated.listeners.splice(index, 1);\n\n // remove delegate function from context\n remove(context, type, delegateListener);\n remove(context, type, delegateUseCapture, true);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegatedEvents[type] = null;\n }\n }\n\n // only remove one listener\n matchFound = true;\n break;\n }\n }\n\n if (matchFound) { break; }\n }\n }\n}\n\n// bound to the interactable context when a DOM event\n// listener is added to a selector interactable\nfunction delegateListener (event, optionalArg) {\n const options = getOptions(optionalArg);\n const fakeEvent = {};\n const delegated = delegatedEvents[event.type];\n const eventTarget = (domUtils.getActualElement(event.path\n ? event.path[0]\n : event.target));\n let element = eventTarget;\n\n // duplicate the event so that currentTarget can be changed\n pExtend(fakeEvent, event);\n\n fakeEvent.originalEvent = event;\n fakeEvent.preventDefault = preventOriginalDefault;\n\n // climb up document tree looking for selector matches\n while (is.element(element)) {\n for (let i = 0; i < delegated.selectors.length; i++) {\n const selector = delegated.selectors[i];\n const context = delegated.contexts[i];\n\n if (domUtils.matchesSelector(element, selector)\n && domUtils.nodeContains(context, eventTarget)\n && domUtils.nodeContains(context, element)) {\n\n const listeners = delegated.listeners[i];\n\n fakeEvent.currentTarget = element;\n\n for (let j = 0; j < listeners.length; j++) {\n const [fn, capture, passive] = listeners[j];\n\n if (capture === !!options.capture && passive === options.passive) {\n fn(fakeEvent);\n }\n }\n }\n }\n\n element = domUtils.parentNode(element);\n }\n}\n\nfunction delegateUseCapture (event) {\n return delegateListener.call(this, event, true);\n}\n\nfunction preventDef () {\n this.returnValue = false;\n}\n\nfunction preventOriginalDefault () {\n this.originalEvent.preventDefault();\n}\n\nfunction stopProp () {\n this.cancelBubble = true;\n}\n\nfunction stopImmProp () {\n this.cancelBubble = true;\n this.immediatePropagationStopped = true;\n}\n\nfunction getOptions (param) {\n return is.object(param)? param : { capture: param };\n}\n\nmodule.exports = {\n add,\n remove,\n\n addDelegate,\n removeDelegate,\n\n delegateListener,\n delegateUseCapture,\n delegatedEvents,\n documents,\n\n useAttachEvent,\n supportsOptions,\n\n _elements: elements,\n _targets: targets,\n _attachedListeners: attachedListeners,\n};\n","module.exports = function extend (dest, source) {\n for (const prop in source) {\n dest[prop] = source[prop];\n }\n return dest;\n};\n","const {\n resolveRectLike,\n rectToXY,\n} = require('./rect');\n\nmodule.exports = function (target, element, action) {\n const actionOptions = target.options[action];\n const actionOrigin = actionOptions && actionOptions.origin;\n const origin = actionOrigin || target.options.origin;\n\n const originRect = resolveRectLike(origin, target, element, [target && element]);\n\n return rectToXY(originRect) || { x: 0, y: 0 };\n};\n","module.exports = (x, y) => Math.sqrt(x * x + y * y);\n","const extend = require('./extend');\nconst win = require('./window');\n\nconst utils = {\n warnOnce: function (method, message) {\n let warned = false;\n\n return function () {\n if (!warned) {\n win.window.console.warn(message);\n warned = true;\n }\n\n return method.apply(this, arguments);\n };\n },\n\n // http://stackoverflow.com/a/5634528/2280888\n _getQBezierValue: function (t, p1, p2, p3) {\n const iT = 1 - t;\n return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3;\n },\n\n getQuadraticCurvePoint: function (startX, startY, cpX, cpY, endX, endY, position) {\n return {\n x: utils._getQBezierValue(position, startX, cpX, endX),\n y: utils._getQBezierValue(position, startY, cpY, endY),\n };\n },\n\n // http://gizma.com/easing/\n easeOutQuad: function (t, b, c, d) {\n t /= d;\n return -c * t*(t-2) + b;\n },\n\n copyAction: function (dest, src) {\n dest.name = src.name;\n dest.axis = src.axis;\n dest.edges = src.edges;\n\n return dest;\n },\n\n is : require('./is'),\n extend : extend,\n hypot : require('./hypot'),\n getOriginXY: require('./getOriginXY'),\n};\n\nextend(utils, require('./arr'));\nextend(utils, require('./domUtils'));\nextend(utils, require('./pointerUtils'));\nextend(utils, require('./rect'));\n\nmodule.exports = utils;\n","const scope = require('../scope');\nconst utils = require('./index');\nconst browser = require('./browser');\n\nconst finder = {\n methodOrder: [ 'simulationResume', 'mouse', 'hasPointer', 'idle' ],\n\n search: function (pointer, eventType, eventTarget) {\n const mouseEvent = (/mouse/i.test(pointer.pointerType || eventType)\n // MSPointerEvent.MSPOINTER_TYPE_MOUSE\n || pointer.pointerType === 4);\n const pointerId = utils.getPointerId(pointer);\n const details = { pointer, pointerId, mouseEvent, eventType, eventTarget };\n\n for (const method of finder.methodOrder) {\n const interaction = finder[method](details);\n\n if (interaction) {\n return interaction;\n }\n }\n },\n\n // try to resume simulation with a new pointer\n simulationResume: function ({ mouseEvent, eventType, eventTarget }) {\n if (!/down|start/i.test(eventType)) {\n return null;\n }\n\n for (const interaction of scope.interactions) {\n let element = eventTarget;\n\n if (interaction.simulation && interaction.simulation.allowResume\n && (interaction.mouse === mouseEvent)) {\n while (element) {\n // if the element is the interaction element\n if (element === interaction.element) {\n return interaction;\n }\n element = utils.parentNode(element);\n }\n }\n }\n\n return null;\n },\n\n // if it's a mouse interaction\n mouse: function ({ pointerId, mouseEvent, eventType }) {\n if (!mouseEvent && (browser.supportsTouch || browser.supportsPointerEvent)) {\n return null;\n }\n\n let firstNonActive;\n\n for (const interaction of scope.interactions) {\n if (interaction.mouse) {\n // if it's a down event, skip interactions with running simulations\n if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; }\n\n // if the interaction is active, return it immediately\n if (interaction.interacting()) {\n return interaction;\n }\n // otherwise save it and look for another active interaction\n else if (!firstNonActive) {\n firstNonActive = interaction;\n }\n }\n }\n\n // if no active mouse interaction was found use the first inactive mouse\n // interaction\n if (firstNonActive) {\n return firstNonActive;\n }\n\n // Find any interaction specifically for mouse.\n // ignore the interaction if the eventType is a mousedown, and a simulation\n // is active\n for (const interaction of scope.interactions) {\n if (interaction.mouse && !(/down/.test(eventType) && interaction.simulation)) {\n return interaction;\n }\n }\n\n return null;\n },\n\n // get interaction that has this pointer\n hasPointer: function ({ pointerId }) {\n for (const interaction of scope.interactions) {\n if (utils.contains(interaction.pointerIds, pointerId)) {\n return interaction;\n }\n }\n },\n\n // get first idle interaction\n idle: function ({ mouseEvent }) {\n for (const interaction of scope.interactions) {\n // if there's already a pointer held down\n if (interaction.pointerIds.length === 1) {\n const target = interaction.target;\n // don't add this pointer if there is a target interactable and it\n // isn't gesturable\n if (target && !target.options.gesture.enabled) {\n continue;\n }\n }\n // maximum of 2 pointers per interaction\n else if (interaction.pointerIds.length >= 2) {\n continue;\n }\n\n if (!interaction.interacting() && (mouseEvent === interaction.mouse)) {\n return interaction;\n }\n }\n\n return null;\n },\n};\n\nmodule.exports = finder;\n","const win = require('./window');\nconst isWindow = require('./isWindow');\n\nconst is = {\n array : () => {},\n\n window : thing => thing === win.window || isWindow(thing),\n\n docFrag : thing => is.object(thing) && thing.nodeType === 11,\n\n object : thing => !!thing && (typeof thing === 'object'),\n\n function: thing => typeof thing === 'function',\n\n number : thing => typeof thing === 'number' ,\n\n bool : thing => typeof thing === 'boolean' ,\n\n string : thing => typeof thing === 'string' ,\n\n element: thing => {\n if (!thing || (typeof thing !== 'object')) { return false; }\n\n const _window = win.getWindow(thing) || win.window;\n\n return (/object|function/.test(typeof _window.Element)\n ? thing instanceof _window.Element //DOM2\n : thing.nodeType === 1 && typeof thing.nodeName === 'string');\n },\n};\n\nis.array = thing => (is.object(thing)\n && (typeof thing.length !== 'undefined')\n && is.function(thing.splice));\n\nmodule.exports = is;\n","module.exports = (thing) => !!(thing && thing.Window) && (thing instanceof thing.Window);\n","function pointerExtend (dest, source) {\n for (const prop in source) {\n const prefixedPropREs = module.exports.prefixedPropREs;\n let deprecated = false;\n\n // skip deprecated prefixed properties\n for (const vendor in prefixedPropREs) {\n if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) {\n deprecated = true;\n break;\n }\n }\n\n if (!deprecated && typeof source[prop] !== 'function') {\n dest[prop] = source[prop];\n }\n }\n return dest;\n}\n\npointerExtend.prefixedPropREs = {\n webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/,\n};\n\nmodule.exports = pointerExtend;\n","const hypot = require('./hypot');\nconst browser = require('./browser');\nconst dom = require('./domObjects');\nconst domUtils = require('./domUtils');\nconst is = require('./is');\nconst pointerExtend = require('./pointerExtend');\n\nconst pointerUtils = {\n copyCoords: function (dest, src) {\n dest.page = dest.page || {};\n dest.page.x = src.page.x;\n dest.page.y = src.page.y;\n\n dest.client = dest.client || {};\n dest.client.x = src.client.x;\n dest.client.y = src.client.y;\n\n dest.timeStamp = src.timeStamp;\n },\n\n setCoordDeltas: function (targetObj, prev, cur) {\n targetObj.page.x = cur.page.x - prev.page.x;\n targetObj.page.y = cur.page.y - prev.page.y;\n targetObj.client.x = cur.client.x - prev.client.x;\n targetObj.client.y = cur.client.y - prev.client.y;\n targetObj.timeStamp = cur.timeStamp - prev.timeStamp;\n\n // set pointer velocity\n const dt = Math.max(targetObj.timeStamp / 1000, 0.001);\n\n targetObj.page.speed = hypot(targetObj.page.x, targetObj.page.y) / dt;\n targetObj.page.vx = targetObj.page.x / dt;\n targetObj.page.vy = targetObj.page.y / dt;\n\n targetObj.client.speed = hypot(targetObj.client.x, targetObj.page.y) / dt;\n targetObj.client.vx = targetObj.client.x / dt;\n targetObj.client.vy = targetObj.client.y / dt;\n },\n\n isNativePointer: function (pointer) {\n return (pointer instanceof dom.Event || pointer instanceof dom.Touch);\n },\n\n // Get specified X/Y coords for mouse or event.touches[0]\n getXY: function (type, pointer, xy) {\n xy = xy || {};\n type = type || 'page';\n\n xy.x = pointer[type + 'X'];\n xy.y = pointer[type + 'Y'];\n\n return xy;\n },\n\n getPageXY: function (pointer, page) {\n page = page || {};\n\n // Opera Mobile handles the viewport and scrolling oddly\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n pointerUtils.getXY('screen', pointer, page);\n\n page.x += window.scrollX;\n page.y += window.scrollY;\n }\n else {\n pointerUtils.getXY('page', pointer, page);\n }\n\n return page;\n },\n\n getClientXY: function (pointer, client) {\n client = client || {};\n\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n // Opera Mobile handles the viewport and scrolling oddly\n pointerUtils.getXY('screen', pointer, client);\n }\n else {\n pointerUtils.getXY('client', pointer, client);\n }\n\n return client;\n },\n\n getPointerId: function (pointer) {\n return is.number(pointer.pointerId)? pointer.pointerId : pointer.identifier;\n },\n\n setCoords: function (targetObj, pointers, timeStamp) {\n const pointer = (pointers.length > 1\n ? pointerUtils.pointerAverage(pointers)\n : pointers[0]);\n\n const tmpXY = {};\n\n pointerUtils.getPageXY(pointer, tmpXY);\n targetObj.page.x = tmpXY.x;\n targetObj.page.y = tmpXY.y;\n\n pointerUtils.getClientXY(pointer, tmpXY);\n targetObj.client.x = tmpXY.x;\n targetObj.client.y = tmpXY.y;\n\n targetObj.timeStamp = is.number(timeStamp) ? timeStamp :new Date().getTime();\n },\n\n pointerExtend: pointerExtend,\n\n getTouchPair: function (event) {\n const touches = [];\n\n // array of touches is supplied\n if (is.array(event)) {\n touches[0] = event[0];\n touches[1] = event[1];\n }\n // an event\n else {\n if (event.type === 'touchend') {\n if (event.touches.length === 1) {\n touches[0] = event.touches[0];\n touches[1] = event.changedTouches[0];\n }\n else if (event.touches.length === 0) {\n touches[0] = event.changedTouches[0];\n touches[1] = event.changedTouches[1];\n }\n }\n else {\n touches[0] = event.touches[0];\n touches[1] = event.touches[1];\n }\n }\n\n return touches;\n },\n\n pointerAverage: function (pointers) {\n const average = {\n pageX : 0,\n pageY : 0,\n clientX: 0,\n clientY: 0,\n screenX: 0,\n screenY: 0,\n };\n\n for (const pointer of pointers) {\n for (const prop in average) {\n average[prop] += pointer[prop];\n }\n }\n for (const prop in average) {\n average[prop] /= pointers.length;\n }\n\n return average;\n },\n\n touchBBox: function (event) {\n if (!event.length && !(event.touches && event.touches.length > 1)) {\n return;\n }\n\n const touches = pointerUtils.getTouchPair(event);\n const minX = Math.min(touches[0].pageX, touches[1].pageX);\n const minY = Math.min(touches[0].pageY, touches[1].pageY);\n const maxX = Math.max(touches[0].pageX, touches[1].pageX);\n const maxY = Math.max(touches[0].pageY, touches[1].pageY);\n\n return {\n x: minX,\n y: minY,\n left: minX,\n top: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n },\n\n touchDistance: function (event, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n\n\n const dx = touches[0][sourceX] - touches[1][sourceX];\n const dy = touches[0][sourceY] - touches[1][sourceY];\n\n return hypot(dx, dy);\n },\n\n touchAngle: function (event, prevAngle, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n const dx = touches[1][sourceX] - touches[0][sourceX];\n const dy = touches[1][sourceY] - touches[0][sourceY];\n const angle = 180 * Math.atan2(dy , dx) / Math.PI;\n\n return angle;\n },\n\n getPointerType: function (pointer, interaction) {\n // if the PointerEvent API isn't available, then the pointer must be ither\n // a MouseEvent or TouchEvent\n if (interaction.mouse) { return 'mouse'; }\n if (!browser.supportsPointerEvent) { return 'touch'; }\n\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : [undefined, undefined,'touch', 'pen', 'mouse'][pointer.pointerType];\n },\n\n // [ event.target, event.currentTarget ]\n getEventTargets: function (event) {\n return [\n domUtils.getActualElement(event.path ? event.path[0] : event.target),\n domUtils.getActualElement(event.currentTarget),\n ];\n },\n};\n\nmodule.exports = pointerUtils;\n","const { window } = require('./window');\n\nconst vendors = ['ms', 'moz', 'webkit', 'o'];\nlet lastTime = 0;\nlet request;\nlet cancel;\n\nfor (let x = 0; x < vendors.length && !window.requestAnimationFrame; x++) {\n request = window[vendors[x] + 'RequestAnimationFrame'];\n cancel = window[vendors[x] +'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n}\n\nif (!request) {\n request = function (callback) {\n const currTime = new Date().getTime();\n const timeToCall = Math.max(0, 16 - (currTime - lastTime));\n const id = setTimeout(function () { callback(currTime + timeToCall); },\n timeToCall);\n\n lastTime = currTime + timeToCall;\n return id;\n };\n}\n\nif (!cancel) {\n cancel = function (id) {\n clearTimeout(id);\n };\n}\n\nmodule.exports = {\n request,\n cancel,\n};\n","const extend = require('./extend');\nconst is = require('./is');\nconst {\n closest,\n parentNode,\n getElementRect,\n} = require('./domUtils');\n\nconst rectUtils = {\n getStringOptionResult: function (value, interactable, element) {\n if (!is.string(value)) {\n return null;\n }\n\n if (value === 'parent') {\n value = parentNode(element);\n }\n else if (value === 'self') {\n value = interactable.getRect(element);\n }\n else {\n value = closest(element, value);\n }\n\n return value;\n },\n\n resolveRectLike: function (value, interactable, element, functionArgs) {\n value = rectUtils.getStringOptionResult(value, interactable, element) || value;\n\n if (is.function(value)) {\n value = value.apply(null, functionArgs);\n }\n\n if (is.element(value)) {\n value = getElementRect(value);\n }\n\n return value;\n },\n\n rectToXY: function (rect) {\n return rect && {\n x: 'x' in rect ? rect.x : rect.left,\n y: 'y' in rect ? rect.y : rect.top,\n };\n },\n\n xywhToTlbr: function (rect) {\n if (rect && !('left' in rect && 'top' in rect)) {\n rect = extend({}, rect);\n\n rect.left = rect.x || 0;\n rect.top = rect.y || 0;\n rect.right = rect.right || (rect.left + rect.width);\n rect.bottom = rect.bottom || (rect.top + rect.height);\n }\n\n return rect;\n },\n\n tlbrToXywh: function (rect) {\n if (rect && !('x' in rect && 'y' in rect)) {\n rect = extend({}, rect);\n\n rect.x = rect.left || 0;\n rect.top = rect.top || 0;\n rect.width = rect.width || (rect.right - rect.x);\n rect.height = rect.height || (rect.bottom - rect.y);\n }\n\n return rect;\n },\n};\n\nmodule.exports = rectUtils;\n","const win = module.exports;\nconst isWindow = require('./isWindow');\n\nfunction init (window) {\n // get wrapped window if using Shadow DOM polyfill\n\n win.realWindow = window;\n\n // create a TextNode\n const el = window.document.createTextNode('');\n\n // check if it's wrapped by a polyfill\n if (el.ownerDocument !== window.document\n && typeof window.wrap === 'function'\n && window.wrap(el) === el) {\n // use wrapped window\n window = window.wrap(window);\n }\n\n win.window = window;\n}\n\nif (typeof window === 'undefined') {\n win.window = undefined;\n win.realWindow = undefined;\n}\nelse {\n init(window);\n}\n\nwin.getWindow = function getWindow (node) {\n if (isWindow(node)) {\n return node;\n }\n\n const rootNode = (node.ownerDocument || node);\n\n return rootNode.defaultView || rootNode.parentWindow || win.window;\n};\n\nwin.init = init;\n"]} \ No newline at end of file +{"version":3,"sources":["src/header.js","node_modules/browser-pack/_prelude.js","index.js","src/Eventable.js","src/InteractEvent.js","src/Interactable.js","src/Interaction.js","src/actions/base.js","src/actions/drag.js","src/actions/drop.js","src/actions/gesture.js","src/actions/resize.js","src/autoScroll.js","src/autoStart/InteractableMethods.js","src/autoStart/base.js","src/autoStart/delay.js","src/autoStart/drag.js","src/autoStart/gesture.js","src/autoStart/resize.js","src/defaultOptions.js","src/index.js","src/inertia.js","src/interact.js","src/interactablePreventDefault.js","src/legacyBrowsers.js","src/modifiers/index.js","src/modifiers/restrict.js","src/modifiers/restrictEdges.js","src/modifiers/restrictSize.js","src/modifiers/snap.js","src/modifiers/snapSize.js","src/pointerEvents/PointerEvent.js","src/pointerEvents/base.js","src/pointerEvents/holdRepeat.js","src/pointerEvents/interactableTargets.js","src/scope.js","src/utils/Signals.js","src/utils/arr.js","src/utils/browser.js","src/utils/domObjects.js","src/utils/domUtils.js","src/utils/events.js","src/utils/extend.js","src/utils/getOriginXY.js","src/utils/hypot.js","src/utils/index.js","src/utils/interactionFinder.js","src/utils/is.js","src/utils/isWindow.js","src/utils/pointerExtend.js","src/utils/pointerUtils.js","src/utils/raf.js","src/utils/rect.js","src/utils/window.js"],"names":[],"mappings":"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","file":"interact.js","sourceRoot":"","sourcesContent":["/**\n * interact.js v1.3.0-alpha.4+sha.7970416-dirty\n *\n * Copyright (c) 2012-2017 Taye Adeyemi \n * Open source under the MIT License.\n * https://raw.github.com/taye/interact.js/master/LICENSE\n */\n","(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o 150) {\n return null;\n }\n\n let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI;\n const overlap = 22.5;\n\n if (angle < 0) {\n angle += 360;\n }\n\n const left = 135 - overlap <= angle && angle < 225 + overlap;\n const up = 225 - overlap <= angle && angle < 315 + overlap;\n\n const right = !left && (315 - overlap <= angle || angle < 45 + overlap);\n const down = !up && 45 - overlap <= angle && angle < 135 + overlap;\n\n return {\n up,\n down,\n left,\n right,\n angle,\n speed: interaction.prevEvent.speed,\n velocity: {\n x: interaction.prevEvent.velocityX,\n y: interaction.prevEvent.velocityY,\n },\n };\n }\n\n preventDefault () {}\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n}\n\nsignals.on('set-delta', function ({ iEvent, interaction, starting, deltaSource }) {\n const prevEvent = starting? iEvent : interaction.prevEvent;\n\n if (deltaSource === 'client') {\n iEvent.dx = iEvent.clientX - prevEvent.clientX;\n iEvent.dy = iEvent.clientY - prevEvent.clientY;\n }\n else {\n iEvent.dx = iEvent.pageX - prevEvent.pageX;\n iEvent.dy = iEvent.pageY - prevEvent.pageY;\n }\n});\n\nInteractEvent.signals = signals;\n\nmodule.exports = InteractEvent;\n","const is = require('./utils/is');\nconst events = require('./utils/events');\nconst extend = require('./utils/extend');\nconst actions = require('./actions/base');\nconst scope = require('./scope');\nconst Eventable = require('./Eventable');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nconst {\n getElementRect,\n nodeContains,\n trySelector,\n} = require('./utils/domUtils');\nconst { getWindow } = require('./utils/window');\nconst { indexOf, contains } = require('./utils/arr');\nconst { wheelEvent } = require('./utils/browser');\n\n// all set interactables\nscope.interactables = [];\n\n/*\\\n * Interactable\n [ property ]\n **\n * Object type returned by @interact\n\\*/\nclass Interactable {\n constructor (target, options) {\n options = options || {};\n\n this.target = target;\n this.events = new Eventable();\n this._context = options.context || scope.document;\n this._win = getWindow(trySelector(target)? this._context : target);\n this._doc = this._win.document;\n\n signals.fire('new', {\n target,\n options,\n interactable: this,\n win: this._win,\n });\n\n scope.addDocument( this._doc, this._win );\n\n scope.interactables.push(this);\n\n this.set(options);\n }\n\n setOnEvents (action, phases) {\n const onAction = 'on' + action;\n\n if (is.function(phases.onstart) ) { this.events[onAction + 'start' ] = phases.onstart ; }\n if (is.function(phases.onmove) ) { this.events[onAction + 'move' ] = phases.onmove ; }\n if (is.function(phases.onend) ) { this.events[onAction + 'end' ] = phases.onend ; }\n if (is.function(phases.oninertiastart)) { this.events[onAction + 'inertiastart' ] = phases.oninertiastart ; }\n\n return this;\n }\n\n setPerAction (action, options) {\n // for all the default per-action options\n for (const option in options) {\n // if this option exists for this action\n if (option in defaults[action]) {\n // if the option in the options arg is an object value\n if (is.object(options[option])) {\n // duplicate the object\n this.options[action][option] = extend(this.options[action][option] || {}, options[option]);\n\n if (is.object(defaults.perAction[option]) && 'enabled' in defaults.perAction[option]) {\n this.options[action][option].enabled = options[option].enabled === false? false : true;\n }\n }\n else if (is.bool(options[option]) && is.object(defaults.perAction[option])) {\n this.options[action][option].enabled = options[option];\n }\n else if (options[option] !== undefined) {\n // or if it's not undefined, do a plain assignment\n this.options[action][option] = options[option];\n }\n }\n }\n }\n\n /*\\\n * Interactable.getRect\n [ method ]\n *\n * The default function to get an Interactables bounding rect. Can be\n * overridden using @Interactable.rectChecker.\n *\n - element (Element) #optional The element to measure.\n = (object) The object's bounding rectangle.\n o {\n o top : 0,\n o left : 0,\n o bottom: 0,\n o right : 0,\n o width : 0,\n o height: 0\n o }\n \\*/\n getRect (element) {\n element = element || this.target;\n\n if (is.string(this.target) && !(is.element(element))) {\n element = this._context.querySelector(this.target);\n }\n\n return getElementRect(element);\n }\n\n /*\\\n * Interactable.rectChecker\n [ method ]\n *\n * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n - checker (function) #optional A function which returns this Interactable's bounding rectangle. See @Interactable.getRect\n = (function | object) The checker function or this Interactable\n \\*/\n rectChecker (checker) {\n if (is.function(checker)) {\n this.getRect = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.getRect;\n\n return this;\n }\n\n return this.getRect;\n }\n\n _backCompatOption (optionName, newValue) {\n if (trySelector(newValue) || is.object(newValue)) {\n this.options[optionName] = newValue;\n\n for (const action of actions.names) {\n this.options[action][optionName] = newValue;\n }\n\n return this;\n }\n\n return this.options[optionName];\n }\n\n /*\\\n * Interactable.origin\n [ method ]\n *\n * Gets or sets the origin of the Interactable's element. The x and y\n * of the origin will be subtracted from action event coordinates.\n *\n - origin (object | string) #optional An object eg. { x: 0, y: 0 } or string 'parent', 'self' or any CSS selector\n * OR\n - origin (Element) #optional An HTML or SVG Element whose rect will be used\n **\n = (object) The current origin or this Interactable\n \\*/\n origin (newValue) {\n return this._backCompatOption('origin', newValue);\n }\n\n /*\\\n * Interactable.deltaSource\n [ method ]\n *\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n - newValue (string) #optional Use 'client' if you will be scrolling while interacting; Use 'page' if you want autoScroll to work\n = (string | object) The current deltaSource or this Interactable\n \\*/\n deltaSource (newValue) {\n if (newValue === 'page' || newValue === 'client') {\n this.options.deltaSource = newValue;\n\n return this;\n }\n\n return this.options.deltaSource;\n }\n\n /*\\\n * Interactable.context\n [ method ]\n *\n * Gets the selector context Node of the Interactable. The default is `window.document`.\n *\n = (Node) The context Node of this Interactable\n **\n \\*/\n context () {\n return this._context;\n }\n\n inContext (element) {\n return (this._context === element.ownerDocument\n || nodeContains(this._context, element));\n }\n\n /*\\\n * Interactable.fire\n [ method ]\n *\n * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n - iEvent (InteractEvent) The InteractEvent object to be fired on this Interactable\n = (Interactable) this Interactable\n \\*/\n fire (iEvent) {\n this.events.fire(iEvent);\n\n return this;\n }\n\n _onOffMultiple (method, eventType, listener, options) {\n if (is.string(eventType) && eventType.search(' ') !== -1) {\n eventType = eventType.trim().split(/ +/);\n }\n\n if (is.array(eventType)) {\n for (let i = 0; i < eventType.length; i++) {\n this[method](eventType[i], listener, options);\n }\n\n return true;\n }\n\n if (is.object(eventType)) {\n for (const prop in eventType) {\n this[method](prop, eventType[prop], listener);\n }\n\n return true;\n }\n }\n\n /*\\\n * Interactable.on\n [ method ]\n *\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n - eventType (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) This Interactable\n \\*/\n on (eventType, listener, options) {\n if (this._onOffMultiple('on', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.on(eventType, listener);\n }\n // delegated event for selector\n else if (is.string(this.target)) {\n events.addDelegate(this.target, this._context, eventType, listener, options);\n }\n else {\n events.add(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.off\n [ method ]\n *\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n - eventType (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) This Interactable\n \\*/\n off (eventType, listener, options) {\n if (this._onOffMultiple('off', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n // if it is an action event type\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.off(eventType, listener);\n }\n // delegated event\n else if (is.string(this.target)) {\n events.removeDelegate(this.target, this._context, eventType, listener, options);\n }\n // remove listener from this Interatable's element\n else {\n events.remove(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.set\n [ method ]\n *\n * Reset the options of this Interactable\n - options (object) The new settings to apply\n = (object) This Interactable\n \\*/\n set (options) {\n if (!is.object(options)) {\n options = {};\n }\n\n this.options = extend({}, defaults.base);\n\n const perActions = extend({}, defaults.perAction);\n\n for (const actionName in actions.methodDict) {\n const methodName = actions.methodDict[actionName];\n\n this.options[actionName] = extend({}, defaults[actionName]);\n\n this.setPerAction(actionName, perActions);\n\n this[methodName](options[actionName]);\n }\n\n for (const setting of Interactable.settingsMethods) {\n this.options[setting] = defaults.base[setting];\n\n if (setting in options) {\n this[setting](options[setting]);\n }\n }\n\n signals.fire('set', {\n options,\n interactable: this,\n });\n\n return this;\n }\n\n /*\\\n * Interactable.unset\n [ method ]\n *\n * Remove this interactable from the list of interactables and remove\n * it's action capabilities and event listeners\n *\n = (object) @interact\n \\*/\n unset () {\n events.remove(this.target, 'all');\n\n if (is.string(this.target)) {\n // remove delegated events\n for (const type in events.delegatedEvents) {\n const delegated = events.delegatedEvents[type];\n\n if (delegated.selectors[0] === this.target\n && delegated.contexts[0] === this._context) {\n\n delegated.selectors.splice(0, 1);\n delegated.contexts .splice(0, 1);\n delegated.listeners.splice(0, 1);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegated[type] = null;\n }\n }\n\n events.remove(this._context, type, events.delegateListener);\n events.remove(this._context, type, events.delegateUseCapture, true);\n }\n }\n else {\n events.remove(this, 'all');\n }\n\n signals.fire('unset', { interactable: this });\n\n scope.interactables.splice(indexOf(scope.interactables, this), 1);\n\n // Stop related interactions when an Interactable is unset\n for (const interaction of scope.interactions || []) {\n if (interaction.target === this && interaction.interacting()) {\n interaction.stop();\n }\n }\n\n return scope.interact;\n }\n}\n\nscope.interactables.indexOfElement = function indexOfElement (target, context) {\n context = context || scope.document;\n\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n if (interactable.target === target && interactable._context === context) {\n return i;\n }\n }\n return -1;\n};\n\nscope.interactables.get = function interactableGet (element, options, dontCheckInContext) {\n const ret = this[this.indexOfElement(element, options && options.context)];\n\n return ret && (is.string(element) || dontCheckInContext || ret.inContext(element))? ret : null;\n};\n\nscope.interactables.forEachSelector = function (callback, element) {\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n // skip non CSS selector targets and out of context elements\n if (!is.string(interactable.target)\n || (element && !interactable.inContext(element))) {\n continue;\n }\n\n const ret = callback(interactable, interactable.target, interactable._context, i, this);\n\n if (ret !== undefined) {\n return ret;\n }\n }\n};\n\n// all interact.js eventTypes\nInteractable.eventTypes = scope.eventTypes = [];\n\nInteractable.signals = signals;\n\nInteractable.settingsMethods = [ 'deltaSource', 'origin', 'preventDefault', 'rectChecker' ];\n\nmodule.exports = Interactable;\n","const scope = require('./scope');\nconst utils = require('./utils');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst domObjects = require('./utils/domObjects');\nconst finder = require('./utils/interactionFinder');\nconst signals = require('./utils/Signals').new();\n\nconst listeners = {};\nconst methodNames = [\n 'pointerDown', 'pointerMove', 'pointerUp',\n 'updatePointer', 'removePointer',\n];\n\n// for ignoring browser's simulated mouse events\nlet prevTouchTime = 0;\n\n// all active and idle interactions\nscope.interactions = [];\n\nclass Interaction {\n constructor ({ pointerType }) {\n this.target = null; // current interactable being interacted with\n this.element = null; // the target element of the interactable\n\n this.prepared = { // action that's ready to be fired on next move event\n name : null,\n axis : null,\n edges: null,\n };\n\n // keep track of added pointers\n this.pointers = [];\n this.pointerIds = [];\n this.downTargets = [];\n this.downTimes = [];\n\n // Previous native pointer move event coordinates\n this.prevCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n // current native pointer move event coordinates\n this.curCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Starting InteractEvent pointer coordinates\n this.startCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Change in coordinates and time of the pointer\n this.pointerDelta = {\n page : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n client : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n timeStamp: 0,\n };\n\n this.downEvent = null; // pointerdown/mousedown/touchstart event\n this.downPointer = {};\n\n this._eventTarget = null;\n this._curEventTarget = null;\n\n this.prevEvent = null; // previous action event\n\n this.pointerIsDown = false;\n this.pointerWasMoved = false;\n this._interacting = false;\n\n this.pointerType = pointerType;\n\n signals.fire('new', this);\n\n scope.interactions.push(this);\n }\n\n pointerDown (pointer, event, eventTarget) {\n const pointerIndex = this.updatePointer(pointer, event, true);\n\n signals.fire('down', {\n pointer,\n event,\n eventTarget,\n pointerIndex,\n interaction: this,\n });\n }\n\n /*\\\n * Interaction.start\n [ method ]\n *\n * Start an action with the given Interactable and Element as tartgets. The\n * action must be enabled for the target Interactable and an appropriate number\n * of pointers must be held down - 1 for drag/resize, 2 for gesture.\n *\n * Use it with `interactable.able({ manualStart: false })` to always\n * [start actions manually](https://github.com/taye/interact.js/issues/114)\n *\n - action (object) The action to be performed - drag, resize, etc.\n - target (Interactable) The Interactable to target\n - element (Element) The DOM Element to target\n = (object) interact\n **\n | interact(target)\n | .draggable({\n | // disable the default drag start by down->move\n | manualStart: true\n | })\n | // start dragging after the user holds the pointer down\n | .on('hold', function (event) {\n | var interaction = event.interaction;\n |\n | if (!interaction.interacting()) {\n | interaction.start({ name: 'drag' },\n | event.interactable,\n | event.currentTarget);\n | }\n | });\n \\*/\n start (action, target, element) {\n if (this.interacting()\n || !this.pointerIsDown\n || this.pointerIds.length < (action.name === 'gesture'? 2 : 1)) {\n return;\n }\n\n // if this interaction had been removed after stopping\n // add it back\n if (utils.indexOf(scope.interactions, this) === -1) {\n scope.interactions.push(this);\n }\n\n utils.copyAction(this.prepared, action);\n this.target = target;\n this.element = element;\n\n signals.fire('action-start', {\n interaction: this,\n event: this.downEvent,\n });\n }\n\n pointerMove (pointer, event, eventTarget) {\n if (!this.simulation) {\n this.updatePointer(pointer);\n utils.setCoords(this.curCoords, this.pointers);\n }\n\n const duplicateMove = (this.curCoords.page.x === this.prevCoords.page.x\n && this.curCoords.page.y === this.prevCoords.page.y\n && this.curCoords.client.x === this.prevCoords.client.x\n && this.curCoords.client.y === this.prevCoords.client.y);\n\n let dx;\n let dy;\n\n // register movement greater than pointerMoveTolerance\n if (this.pointerIsDown && !this.pointerWasMoved) {\n dx = this.curCoords.client.x - this.startCoords.client.x;\n dy = this.curCoords.client.y - this.startCoords.client.y;\n\n this.pointerWasMoved = utils.hypot(dx, dy) > Interaction.pointerMoveTolerance;\n }\n\n const signalArg = {\n pointer,\n pointerIndex: this.getPointerIndex(pointer),\n event,\n eventTarget,\n dx,\n dy,\n duplicate: duplicateMove,\n interaction: this,\n interactingBeforeMove: this.interacting(),\n };\n\n if (!duplicateMove) {\n // set pointer coordinate, time changes and speeds\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n }\n\n signals.fire('move', signalArg);\n\n if (!duplicateMove) {\n // if interacting, fire an 'action-move' signal etc\n if (this.interacting()) {\n this.doMove(signalArg);\n }\n\n if (this.pointerWasMoved) {\n utils.copyCoords(this.prevCoords, this.curCoords);\n }\n }\n }\n\n /*\\\n * Interaction.doMove\n [ method ]\n *\n * Force a move of the current action at the same coordinates. Useful if\n * snap/restrict has been changed and you want a movement with the new\n * settings.\n *\n **\n | interact(target)\n | .draggable(true)\n | .on('dragmove', function (event) {\n | if (someCondition) {\n | // change the snap settings\n | event.interactable.draggable({ snap: { targets: [] }});\n | // fire another move event with re-calculated snap\n | event.interaction.doMove();\n | }\n | });\n \\*/\n doMove (signalArg) {\n signalArg = utils.extend({\n pointer: this.pointers[0],\n event: this.prevEvent,\n eventTarget: this._eventTarget,\n interaction: this,\n }, signalArg || {});\n\n signals.fire('before-action-move', signalArg);\n\n if (!this._dontFireMove) {\n signals.fire('action-move', signalArg);\n }\n\n this._dontFireMove = false;\n }\n\n // End interact move events and stop auto-scroll unless simulation is running\n pointerUp (pointer, event, eventTarget, curEventTarget) {\n const pointerIndex = this.getPointerIndex(pointer);\n\n signals.fire(/cancel$/i.test(event.type)? 'cancel' : 'up', {\n pointer,\n pointerIndex,\n event,\n eventTarget,\n curEventTarget,\n interaction: this,\n });\n\n if (!this.simulation) {\n this.end(event);\n }\n\n this.pointerIsDown = false;\n this.removePointer(pointer, event);\n }\n\n /*\\\n * Interaction.end\n [ method ]\n *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n - event (PointerEvent) #optional\n **\n | interact(target)\n | .draggable(true)\n | .on('move', function (event) {\n | if (event.pageX > 1000) {\n | // end the current action\n | event.interaction.end();\n | // stop all further listeners from being called\n | event.stopImmediatePropagation();\n | }\n | });\n \\*/\n end (event) {\n event = event || this.prevEvent;\n\n if (this.interacting()) {\n signals.fire('action-end', {\n event,\n interaction: this,\n });\n }\n\n this.stop();\n }\n\n currentAction () {\n return this._interacting? this.prepared.name: null;\n }\n\n interacting () {\n return this._interacting;\n }\n\n stop () {\n signals.fire('stop', { interaction: this });\n\n if (this._interacting) {\n signals.fire('stop-active', { interaction: this });\n signals.fire('stop-' + this.prepared.name, { interaction: this });\n }\n\n this.target = this.element = null;\n\n this._interacting = false;\n this.prepared.name = this.prevEvent = null;\n }\n\n getPointerIndex (pointer) {\n // mouse and pen interactions may have only one pointer\n if (this.pointerType === 'mouse' || this.pointerType === 'pen') {\n return 0;\n }\n\n return utils.indexOf(this.pointerIds, utils.getPointerId(pointer));\n }\n\n updatePointer (pointer, event, down = event && /(down|start)$/i.test(event.type)) {\n const id = utils.getPointerId(pointer);\n let index = this.getPointerIndex(pointer);\n\n if (index === -1) {\n index = this.pointerIds.length;\n this.pointerIds[index] = id;\n }\n\n if (down) {\n signals.fire('update-pointer-down', {\n pointer,\n event,\n down,\n pointerId: id,\n pointerIndex: index,\n interaction: this,\n });\n }\n\n this.pointers[index] = pointer;\n\n return index;\n }\n\n removePointer (pointer, event) {\n const index = this.getPointerIndex(pointer);\n\n if (index === -1) { return; }\n\n signals.fire('remove-pointer', {\n pointer,\n event,\n pointerIndex: index,\n interaction: this,\n });\n\n this.pointers .splice(index, 1);\n this.pointerIds .splice(index, 1);\n this.downTargets.splice(index, 1);\n this.downTimes .splice(index, 1);\n }\n\n _updateEventTargets (target, currentTarget) {\n this._eventTarget = target;\n this._curEventTarget = currentTarget;\n }\n}\n\nfor (let i = 0, len = methodNames.length; i < len; i++) {\n const method = methodNames[i];\n\n listeners[method] = doOnInteractions(method);\n}\n\nfunction doOnInteractions (method) {\n return (function (event) {\n const pointerType = utils.getPointerType(event);\n const [eventTarget, curEventTarget] = utils.getEventTargets(event);\n const matches = []; // [ [pointer, interaction], ...]\n\n if (browser.supportsTouch && /touch/.test(event.type)) {\n prevTouchTime = new Date().getTime();\n\n for (let i = 0; i < event.changedTouches.length; i++) {\n const pointer = event.changedTouches[i];\n const interaction = finder.search(pointer, event.type, eventTarget);\n\n matches.push([pointer, interaction || new Interaction({ pointerType })]);\n }\n }\n else {\n let invalidPointer = false;\n\n if (!browser.supportsPointerEvent && /mouse/.test(event.type)) {\n // ignore mouse events while touch interactions are active\n for (let i = 0; i < scope.interactions.length && !invalidPointer; i++) {\n invalidPointer = scope.interactions[i].pointerType !== 'mouse' && scope.interactions[i].pointerIsDown;\n }\n\n // try to ignore mouse events that are simulated by the browser\n // after a touch event\n invalidPointer = invalidPointer\n || (new Date().getTime() - prevTouchTime < 500)\n // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated\n || event.timeStamp === 0;\n }\n\n if (!invalidPointer) {\n let interaction = finder.search(event, event.type, eventTarget);\n\n if (!interaction) {\n interaction = new Interaction({ pointerType });\n }\n\n matches.push([event, interaction]);\n }\n }\n\n for (const [pointer, interaction] of matches) {\n interaction._updateEventTargets(eventTarget, curEventTarget);\n interaction[method](pointer, event, eventTarget, curEventTarget);\n }\n });\n}\n\nfunction endAll (event) {\n for (let i = 0; i < scope.interactions.length; i++) {\n const interaction = scope.interactions[i];\n\n interaction.end(event);\n signals.fire('endall', { event, interaction });\n }\n}\n\nconst docEvents = { /* 'eventType': listenerFunc */ };\nconst pEventTypes = browser.pEventTypes;\n\nif (domObjects.PointerEvent) {\n docEvents[pEventTypes.down ] = listeners.pointerDown;\n docEvents[pEventTypes.move ] = listeners.pointerMove;\n docEvents[pEventTypes.up ] = listeners.pointerUp;\n docEvents[pEventTypes.cancel] = listeners.pointerUp;\n}\nelse {\n docEvents.mousedown = listeners.pointerDown;\n docEvents.mousemove = listeners.pointerMove;\n docEvents.mouseup = listeners.pointerUp;\n\n docEvents.touchstart = listeners.pointerDown;\n docEvents.touchmove = listeners.pointerMove;\n docEvents.touchend = listeners.pointerUp;\n docEvents.touchcancel = listeners.pointerUp;\n}\n\ndocEvents.blur = endAll;\n\nfunction onDocSignal ({ doc }, signalName) {\n const eventMethod = signalName.indexOf('add') === 0\n ? events.add : events.remove;\n\n // delegate event listener\n for (const eventType in scope.delegatedEvents) {\n eventMethod(doc, eventType, events.delegateListener);\n eventMethod(doc, eventType, events.delegateUseCapture, true);\n }\n\n for (const eventType in docEvents) {\n eventMethod(doc, eventType, docEvents[eventType]);\n }\n}\n\nsignals.on('update-pointer-down', ({ interaction, pointer, pointerId, pointerIndex, event, eventTarget, down }) => {\n interaction.pointerIds[pointerIndex] = pointerId;\n interaction.pointers[pointerIndex] = pointer;\n\n if (down) {\n interaction.pointerIsDown = true;\n }\n\n if (!interaction.interacting()) {\n utils.setCoords(interaction.startCoords, interaction.pointers);\n\n utils.copyCoords(interaction.curCoords , interaction.startCoords);\n utils.copyCoords(interaction.prevCoords, interaction.startCoords);\n\n interaction.downEvent = event;\n interaction.downTimes[pointerIndex] = interaction.curCoords.timeStamp;\n interaction.downTargets[pointerIndex] = eventTarget || event && utils.getEventTargets(event)[0];\n interaction.pointerWasMoved = false;\n\n utils.pointerExtend(interaction.downPointer, pointer);\n }\n});\n\nscope.signals.on('add-document' , onDocSignal);\nscope.signals.on('remove-document', onDocSignal);\n\nInteraction.pointerMoveTolerance = 1;\nInteraction.doOnInteractions = doOnInteractions;\nInteraction.endAll = endAll;\nInteraction.signals = signals;\nInteraction.docEvents = docEvents;\n\nscope.endAllInteractions = endAll;\n\nmodule.exports = Interaction;\n","const Interaction = require('../Interaction');\nconst InteractEvent = require('../InteractEvent');\n\nconst actions = {\n firePrepared,\n names: [],\n methodDict: {},\n};\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n interaction._interacting = true;\n firePrepared(interaction, event, 'start');\n});\n\nInteraction.signals.on('action-move', function ({ interaction, event, preEnd }) {\n firePrepared(interaction, event, 'move', preEnd);\n\n // if the action was ended in a listener\n if (!interaction.interacting()) { return false; }\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n firePrepared(interaction, event, 'end');\n});\n\nfunction firePrepared (interaction, event, phase, preEnd) {\n const actionName = interaction.prepared.name;\n\n const newEvent = new InteractEvent(interaction, event, actionName, phase, interaction.element, null, preEnd);\n\n interaction.target.fire(newEvent);\n interaction.prevEvent = newEvent;\n}\n\nmodule.exports = actions;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drag = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n startAxis : 'xy',\n lockAxis : 'xy',\n },\n\n checker: function (pointer, event, interactable) {\n const dragOptions = interactable.options.drag;\n\n return dragOptions.enabled\n ? { name: 'drag', axis: (dragOptions.lockAxis === 'start'\n ? dragOptions.startAxis\n : dragOptions.lockAxis)}\n : null;\n },\n\n getCursor: function () {\n return 'move';\n },\n};\n\nInteraction.signals.on('before-action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n interaction.curCoords.page.y = interaction.startCoords.page.y;\n interaction.curCoords.client.y = interaction.startCoords.client.y;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vx);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vx);\n interaction.pointerDelta.client.vy = 0;\n interaction.pointerDelta.page.vy = 0;\n }\n else if (axis === 'y') {\n interaction.curCoords.page.x = interaction.startCoords.page.x;\n interaction.curCoords.client.x = interaction.startCoords.client.x;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vy);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vy);\n interaction.pointerDelta.client.vx = 0;\n interaction.pointerDelta.page.vx = 0;\n }\n});\n\n// dragmove\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'dragmove') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n iEvent.pageY = interaction.startCoords.page.y;\n iEvent.clientY = interaction.startCoords.client.y;\n iEvent.dy = 0;\n }\n else if (axis === 'y') {\n iEvent.pageX = interaction.startCoords.page.x;\n iEvent.clientX = interaction.startCoords.client.x;\n iEvent.dx = 0;\n }\n});\n\n/*\\\n * Interactable.draggable\n [ method ]\n *\n * Gets or sets whether drag actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of drag events\n | var isDraggable = interact('ul li').draggable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on drag events (object makes the Interactable draggable)\n = (object) This Interactable\n | interact(element).draggable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // the axis in which the first movement must be\n | // for the drag sequence to start\n | // 'xy' by default - any direction\n | startAxis: 'x' || 'y' || 'xy',\n |\n | // 'xy' by default - don't restrict to one axis (move in any direction)\n | // 'x' or 'y' to restrict movement to either axis\n | // 'start' to restrict movement to the axis the drag started in\n | lockAxis: 'x' || 'y' || 'xy' || 'start',\n |\n | // max number of drags that can happen concurrently\n | // with elements of this Interactable. Infinity by default\n | max: Infinity,\n |\n | // max number of drags that can target the same element+Interactable\n | // 1 by default\n | maxPerElement: 2\n | });\n\\*/\nInteractable.prototype.draggable = function (options) {\n if (utils.is.object(options)) {\n this.options.drag.enabled = options.enabled === false? false: true;\n this.setPerAction('drag', options);\n this.setOnEvents('drag', options);\n\n if (/^(xy|x|y|start)$/.test(options.lockAxis)) {\n this.options.drag.lockAxis = options.lockAxis;\n }\n if (/^(xy|x|y)$/.test(options.startAxis)) {\n this.options.drag.startAxis = options.startAxis;\n }\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drag.enabled = options;\n\n if (!options) {\n this.ondragstart = this.ondragstart = this.ondragend = null;\n }\n\n return this;\n }\n\n return this.options.drag;\n};\n\nactions.drag = drag;\nactions.names.push('drag');\nutils.merge(Interactable.eventTypes, [\n 'dragstart',\n 'dragmove',\n 'draginertiastart',\n 'draginertiaresume',\n 'dragend',\n]);\nactions.methodDict.drag = 'draggable';\n\ndefaultOptions.drag = drag.defaults;\n\nmodule.exports = drag;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst scope = require('../scope');\nconst interact = require('../interact');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drop = {\n defaults: {\n enabled: false,\n accept : null,\n overlap: 'pointer',\n },\n};\n\nlet dynamicDrop = false;\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // reset active dropzones\n interaction.activeDrops.dropzones = [];\n interaction.activeDrops.elements = [];\n interaction.activeDrops.rects = [];\n\n interaction.dropEvents = null;\n\n if (!interaction.dynamicDrop) {\n setActiveDrops(interaction, interaction.element);\n }\n\n const dragEvent = interaction.prevEvent;\n const dropEvents = getDropEvents(interaction, event, dragEvent);\n\n if (dropEvents.activate) {\n fireActiveDrops(interaction, dropEvents.activate);\n }\n});\n\nInteractEvent.signals.on('new', function ({ interaction, iEvent, event }) {\n if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { return; }\n\n const draggableElement = interaction.element;\n const dragEvent = iEvent;\n const dropResult = getDrop(dragEvent, event, draggableElement);\n\n interaction.dropTarget = dropResult.dropzone;\n interaction.dropElement = dropResult.element;\n\n interaction.dropEvents = getDropEvents(interaction, event, dragEvent);\n});\n\nInteraction.signals.on('action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n fireDropEvents(interaction, interaction.dropEvents);\n});\n\nInteraction.signals.on('action-end', function ({ interaction }) {\n if (interaction.prepared.name === 'drag') {\n fireDropEvents(interaction, interaction.dropEvents);\n }\n});\n\nInteraction.signals.on('stop-drag', function ({ interaction }) {\n interaction.activeDrops.dropzones =\n interaction.activeDrops.elements =\n interaction.activeDrops.rects =\n interaction.dropEvents = null;\n});\n\nfunction collectDrops (interaction, element) {\n const drops = [];\n const elements = [];\n\n element = element || interaction.element;\n\n // collect all dropzones and their elements which qualify for a drop\n for (const current of scope.interactables) {\n if (!current.options.drop.enabled) { continue; }\n\n const accept = current.options.drop.accept;\n\n // test the draggable element against the dropzone's accept setting\n if ((utils.is.element(accept) && accept !== element)\n || (utils.is.string(accept)\n && !utils.matchesSelector(element, accept))) {\n\n continue;\n }\n\n // query for new elements if necessary\n const dropElements = utils.is.string(current.target)\n ? current._context.querySelectorAll(current.target)\n : [current.target];\n\n for (let i = 0; i < dropElements.length; i++) {\n const currentElement = dropElements[i];\n\n if (currentElement !== element) {\n drops.push(current);\n elements.push(currentElement);\n }\n }\n }\n\n return {\n elements,\n dropzones: drops,\n };\n}\n\nfunction fireActiveDrops (interaction, event) {\n let prevElement;\n\n // loop through all active dropzones and trigger event\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n const current = interaction.activeDrops.dropzones[i];\n const currentElement = interaction.activeDrops.elements [i];\n\n // prevent trigger of duplicate events on same element\n if (currentElement !== prevElement) {\n // set current element as event target\n event.target = currentElement;\n current.fire(event);\n }\n prevElement = currentElement;\n }\n}\n\n// Collect a new set of possible drops and save them in activeDrops.\n// setActiveDrops should always be called when a drag has just started or a\n// drag event happens while dynamicDrop is true\nfunction setActiveDrops (interaction, dragElement) {\n // get dropzones and their elements that could receive the draggable\n const possibleDrops = collectDrops(interaction, dragElement, true);\n\n interaction.activeDrops.dropzones = possibleDrops.dropzones;\n interaction.activeDrops.elements = possibleDrops.elements;\n interaction.activeDrops.rects = [];\n\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n interaction.activeDrops.rects[i] =\n interaction.activeDrops.dropzones[i].getRect(interaction.activeDrops.elements[i]);\n }\n}\n\nfunction getDrop (dragEvent, event, dragElement) {\n const interaction = dragEvent.interaction;\n const validDrops = [];\n\n if (dynamicDrop) {\n setActiveDrops(interaction, dragElement);\n }\n\n // collect all dropzones and their elements which qualify for a drop\n for (let j = 0; j < interaction.activeDrops.dropzones.length; j++) {\n const current = interaction.activeDrops.dropzones[j];\n const currentElement = interaction.activeDrops.elements [j];\n const rect = interaction.activeDrops.rects [j];\n\n validDrops.push(current.dropCheck(dragEvent, event, interaction.target, dragElement, currentElement, rect)\n ? currentElement\n : null);\n }\n\n // get the most appropriate dropzone based on DOM depth and order\n const dropIndex = utils.indexOfDeepestElement(validDrops);\n\n return {\n dropzone: interaction.activeDrops.dropzones[dropIndex] || null,\n element : interaction.activeDrops.elements [dropIndex] || null,\n };\n}\n\nfunction getDropEvents (interaction, pointerEvent, dragEvent) {\n const dropEvents = {\n enter : null,\n leave : null,\n activate : null,\n deactivate: null,\n move : null,\n drop : null,\n };\n\n const tmpl = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n };\n\n if (interaction.dropElement !== interaction.prevDropElement) {\n // if there was a prevDropTarget, create a dragleave event\n if (interaction.prevDropTarget) {\n dropEvents.leave = utils.extend({ type: 'dragleave' }, tmpl);\n\n dragEvent.dragLeave = dropEvents.leave.target = interaction.prevDropElement;\n dragEvent.prevDropzone = dropEvents.leave.dropzone = interaction.prevDropTarget;\n }\n // if the dropTarget is not null, create a dragenter event\n if (interaction.dropTarget) {\n dropEvents.enter = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n type : 'dragenter',\n };\n\n dragEvent.dragEnter = interaction.dropElement;\n dragEvent.dropzone = interaction.dropTarget;\n }\n }\n\n if (dragEvent.type === 'dragend' && interaction.dropTarget) {\n dropEvents.drop = utils.extend({ type: 'drop' }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n dragEvent.relatedTarget = interaction.dropElement;\n }\n if (dragEvent.type === 'dragstart') {\n dropEvents.activate = utils.extend({ type: 'dropactivate' }, tmpl);\n\n dropEvents.activate.target = null;\n dropEvents.activate.dropzone = null;\n }\n if (dragEvent.type === 'dragend') {\n dropEvents.deactivate = utils.extend({ type: 'dropdeactivate' }, tmpl);\n\n dropEvents.deactivate.target = null;\n dropEvents.deactivate.dropzone = null;\n }\n if (dragEvent.type === 'dragmove' && interaction.dropTarget) {\n dropEvents.move = utils.extend({\n dragmove : dragEvent,\n type : 'dropmove',\n }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n }\n\n return dropEvents;\n}\n\nfunction fireDropEvents (interaction, dropEvents) {\n if (dropEvents.leave) { interaction.prevDropTarget.fire(dropEvents.leave); }\n if (dropEvents.move ) { interaction.dropTarget.fire(dropEvents.move ); }\n if (dropEvents.enter) { interaction.dropTarget.fire(dropEvents.enter); }\n if (dropEvents.drop ) { interaction.dropTarget.fire(dropEvents.drop ); }\n if (dropEvents.deactivate) {\n fireActiveDrops(interaction, dropEvents.deactivate);\n }\n\n interaction.prevDropTarget = interaction.dropTarget;\n interaction.prevDropElement = interaction.dropElement;\n}\n\n/*\\\n * Interactable.dropzone\n [ method ]\n *\n * Returns or sets whether elements can be dropped onto this\n * Interactable to trigger drop events\n *\n * Dropzones can receive the following events:\n * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends\n * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone\n * - `dragmove` when a draggable that has entered the dropzone is moved\n * - `drop` when a draggable is dropped into this dropzone\n *\n * Use the `accept` option to allow only elements that match the given CSS\n * selector or element. The value can be:\n *\n * - **an Element** - only that element can be dropped into this dropzone.\n * - **a string**, - the element being dragged must match it as a CSS selector.\n * - **`null`** - accept options is cleared - it accepts any element.\n *\n * Use the `overlap` option to set how drops are checked for. The allowed\n * values are:\n *\n * - `'pointer'`, the pointer must be over the dropzone (default)\n * - `'center'`, the draggable element's center must be over the dropzone\n * - a number from 0-1 which is the `(intersection area) / (draggable area)`.\n * e.g. `0.5` for drop to happen when half of the area of the draggable is\n * over the dropzone\n *\n * Use the `checker` option to specify a function to check if a dragged\n * element is over this Interactable.\n *\n | interact(target)\n | .dropChecker(function(dragEvent, // related dragmove or dragend event\n | event, // TouchEvent/PointerEvent/MouseEvent\n | dropped, // bool result of the default checker\n | dropzone, // dropzone Interactable\n | dropElement, // dropzone elemnt\n | draggable, // draggable Interactable\n | draggableElement) {// draggable element\n |\n | return dropped && event.target.hasAttribute('allow-drop');\n | }\n *\n *\n - options (boolean | object | null) #optional The new value to be set.\n | interact('.drop').dropzone({\n | accept: '.can-drop' || document.getElementById('single-drop'),\n | overlap: 'pointer' || 'center' || zeroToOne\n | }\n = (boolean | object) The current setting or this Interactable\n\\*/\nInteractable.prototype.dropzone = function (options) {\n if (utils.is.object(options)) {\n this.options.drop.enabled = options.enabled === false? false: true;\n\n if (utils.is.function(options.ondrop) ) { this.events.ondrop = options.ondrop ; }\n if (utils.is.function(options.ondropactivate) ) { this.events.ondropactivate = options.ondropactivate ; }\n if (utils.is.function(options.ondropdeactivate)) { this.events.ondropdeactivate = options.ondropdeactivate; }\n if (utils.is.function(options.ondragenter) ) { this.events.ondragenter = options.ondragenter ; }\n if (utils.is.function(options.ondragleave) ) { this.events.ondragleave = options.ondragleave ; }\n if (utils.is.function(options.ondropmove) ) { this.events.ondropmove = options.ondropmove ; }\n\n if (/^(pointer|center)$/.test(options.overlap)) {\n this.options.drop.overlap = options.overlap;\n }\n else if (utils.is.number(options.overlap)) {\n this.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0);\n }\n if ('accept' in options) {\n this.options.drop.accept = options.accept;\n }\n if ('checker' in options) {\n this.options.drop.checker = options.checker;\n }\n\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drop.enabled = options;\n\n if (!options) {\n this.ondragenter = this.ondragleave = this.ondrop\n = this.ondropactivate = this.ondropdeactivate = null;\n }\n\n return this;\n }\n\n return this.options.drop;\n};\n\nInteractable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) {\n let dropped = false;\n\n // if the dropzone has no rect (eg. display: none)\n // call the custom dropChecker or just return false\n if (!(rect = rect || this.getRect(dropElement))) {\n return (this.options.drop.checker\n ? this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement)\n : false);\n }\n\n const dropOverlap = this.options.drop.overlap;\n\n if (dropOverlap === 'pointer') {\n const origin = utils.getOriginXY(draggable, draggableElement, 'drag');\n const page = utils.getPageXY(dragEvent);\n\n page.x += origin.x;\n page.y += origin.y;\n\n const horizontal = (page.x > rect.left) && (page.x < rect.right);\n const vertical = (page.y > rect.top ) && (page.y < rect.bottom);\n\n dropped = horizontal && vertical;\n }\n\n const dragRect = draggable.getRect(draggableElement);\n\n if (dragRect && dropOverlap === 'center') {\n const cx = dragRect.left + dragRect.width / 2;\n const cy = dragRect.top + dragRect.height / 2;\n\n dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom;\n }\n\n if (dragRect && utils.is.number(dropOverlap)) {\n const overlapArea = (Math.max(0, Math.min(rect.right , dragRect.right ) - Math.max(rect.left, dragRect.left))\n * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top , dragRect.top )));\n\n const overlapRatio = overlapArea / (dragRect.width * dragRect.height);\n\n dropped = overlapRatio >= dropOverlap;\n }\n\n if (this.options.drop.checker) {\n dropped = this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement);\n }\n\n return dropped;\n};\n\nInteractable.signals.on('unset', function ({ interactable }) {\n interactable.dropzone(false);\n});\n\nInteractable.settingsMethods.push('dropChecker');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.dropTarget = null; // the dropzone a drag target might be dropped into\n interaction.dropElement = null; // the element at the time of checking\n interaction.prevDropTarget = null; // the dropzone that was recently dragged away from\n interaction.prevDropElement = null; // the element at the time of checking\n interaction.dropEvents = null; // the dropEvents related to the current drag event\n\n interaction.activeDrops = {\n dropzones: [], // the dropzones that are mentioned below\n elements : [], // elements of dropzones that accept the target draggable\n rects : [], // the rects of the elements mentioned above\n };\n\n});\n\nInteraction.signals.on('stop', function ({ interaction }) {\n interaction.dropTarget = interaction.dropElement =\n interaction.prevDropTarget = interaction.prevDropElement = null;\n});\n\n/*\\\n * interact.dynamicDrop\n [ method ]\n *\n * Returns or sets whether the dimensions of dropzone elements are\n * calculated on every dragmove or only on dragstart for the default\n * dropChecker\n *\n - newValue (boolean) #optional True to check on each move. False to check only before start\n = (boolean | interact) The current setting or interact\n\\*/\ninteract.dynamicDrop = function (newValue) {\n if (utils.is.bool(newValue)) {\n //if (dragging && dynamicDrop !== newValue && !newValue) {\n //calcRects(dropzones);\n //}\n\n dynamicDrop = newValue;\n\n return interact;\n }\n return dynamicDrop;\n};\n\nutils.merge(Interactable.eventTypes, [\n 'dragenter',\n 'dragleave',\n 'dropactivate',\n 'dropdeactivate',\n 'dropmove',\n 'drop',\n]);\nactions.methodDict.drop = 'dropzone';\n\ndefaultOptions.drop = drop.defaults;\n\nmodule.exports = drop;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst gesture = {\n defaults: {\n enabled : false,\n origin : null,\n restrict: null,\n },\n\n checker: function (pointer, event, interactable, element, interaction) {\n if (interaction.pointerIds.length >= 2) {\n return { name: 'gesture' };\n }\n\n return null;\n },\n\n getCursor: function () {\n return '';\n },\n};\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturestart') { return; }\n iEvent.ds = 0;\n\n interaction.gesture.startDistance = interaction.gesture.prevDistance = iEvent.distance;\n interaction.gesture.startAngle = interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.scale = 1;\n});\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturemove') { return; }\n\n iEvent.ds = iEvent.scale - interaction.gesture.scale;\n\n interaction.target.fire(iEvent);\n\n interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.prevDistance = iEvent.distance;\n\n if (iEvent.scale !== Infinity\n && iEvent.scale !== null\n && iEvent.scale !== undefined\n && !isNaN(iEvent.scale)) {\n\n interaction.gesture.scale = iEvent.scale;\n }\n});\n\n/*\\\n * Interactable.gesturable\n [ method ]\n *\n * Gets or sets whether multitouch gestures can be performed on the\n * Interactable's element\n *\n = (boolean) Indicates if this can be the target of gesture events\n | var isGestureable = interact(element).gesturable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on gesture events (makes the Interactable gesturable)\n = (object) this Interactable\n | interact(element).gesturable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // limit multiple gestures.\n | // See the explanation in @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n\\*/\nInteractable.prototype.gesturable = function (options) {\n if (utils.is.object(options)) {\n this.options.gesture.enabled = options.enabled === false? false: true;\n this.setPerAction('gesture', options);\n this.setOnEvents('gesture', options);\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.gesture.enabled = options;\n\n if (!options) {\n this.ongesturestart = this.ongesturestart = this.ongestureend = null;\n }\n\n return this;\n }\n\n return this.options.gesture;\n};\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action, event, starting, ending, deltaSource }) {\n if (action !== 'gesture') { return; }\n\n const pointers = interaction.pointers;\n\n iEvent.touches = [pointers[0], pointers[1]];\n\n if (starting) {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = 1;\n iEvent.ds = 0;\n iEvent.angle = utils.touchAngle(pointers, undefined, deltaSource);\n iEvent.da = 0;\n }\n else if (ending || event instanceof InteractEvent) {\n iEvent.distance = interaction.prevEvent.distance;\n iEvent.box = interaction.prevEvent.box;\n iEvent.scale = interaction.prevEvent.scale;\n iEvent.ds = iEvent.scale - 1;\n iEvent.angle = interaction.prevEvent.angle;\n iEvent.da = iEvent.angle - interaction.gesture.startAngle;\n }\n else {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = iEvent.distance / interaction.gesture.startDistance;\n iEvent.angle = utils.touchAngle(pointers, interaction.gesture.prevAngle, deltaSource);\n\n iEvent.ds = iEvent.scale - interaction.gesture.prevScale;\n iEvent.da = iEvent.angle - interaction.gesture.prevAngle;\n }\n});\n\nInteraction.signals.on('new', function (interaction) {\n interaction.gesture = {\n start: { x: 0, y: 0 },\n\n startDistance: 0, // distance between two touches of touchStart\n prevDistance : 0,\n distance : 0,\n\n scale: 1, // gesture.distance / gesture.startDistance\n\n startAngle: 0, // angle of line joining two touches\n prevAngle : 0, // angle of the previous gesture event\n };\n});\n\nactions.gesture = gesture;\nactions.names.push('gesture');\nutils.merge(Interactable.eventTypes, [\n 'gesturestart',\n 'gesturemove',\n 'gestureend',\n]);\nactions.methodDict.gesture = 'gesturable';\n\ndefaultOptions.gesture = gesture.defaults;\n\nmodule.exports = gesture;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\n// Less Precision with touch input\nconst defaultMargin = browser.supportsTouch || browser.supportsPointerEvent? 20: 10;\n\nconst resize = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n square: false,\n preserveAspectRatio: false,\n axis: 'xy',\n\n // use default margin\n margin: NaN,\n\n // object with props left, right, top, bottom which are\n // true/false values to resize when the pointer is over that edge,\n // CSS selectors to match the handles for each direction\n // or the Elements for each handle\n edges: null,\n\n // a value of 'none' will limit the resize rect to a minimum of 0x0\n // 'negate' will alow the rect to have negative width/height\n // 'reposition' will keep the width/height positive by swapping\n // the top and bottom edges and/or swapping the left and right edges\n invert: 'none',\n },\n\n checker: function (pointer, event, interactable, element, interaction, rect) {\n if (!rect) { return null; }\n\n const page = utils.extend({}, interaction.curCoords.page);\n const options = interactable.options;\n\n if (options.resize.enabled) {\n const resizeOptions = options.resize;\n const resizeEdges = { left: false, right: false, top: false, bottom: false };\n\n // if using resize.edges\n if (utils.is.object(resizeOptions.edges)) {\n for (const edge in resizeEdges) {\n resizeEdges[edge] = checkResizeEdge(edge,\n resizeOptions.edges[edge],\n page,\n interaction._eventTarget,\n element,\n rect,\n resizeOptions.margin || defaultMargin);\n }\n\n resizeEdges.left = resizeEdges.left && !resizeEdges.right;\n resizeEdges.top = resizeEdges.top && !resizeEdges.bottom;\n\n if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) {\n return {\n name: 'resize',\n edges: resizeEdges,\n };\n }\n }\n else {\n const right = options.resize.axis !== 'y' && page.x > (rect.right - defaultMargin);\n const bottom = options.resize.axis !== 'x' && page.y > (rect.bottom - defaultMargin);\n\n if (right || bottom) {\n return {\n name: 'resize',\n axes: (right? 'x' : '') + (bottom? 'y' : ''),\n };\n }\n }\n }\n\n return null;\n },\n\n cursors: (browser.isIe9OrOlder ? {\n x : 'e-resize',\n y : 's-resize',\n xy: 'se-resize',\n\n top : 'n-resize',\n left : 'w-resize',\n bottom : 's-resize',\n right : 'e-resize',\n topleft : 'se-resize',\n bottomright: 'se-resize',\n topright : 'ne-resize',\n bottomleft : 'ne-resize',\n } : {\n x : 'ew-resize',\n y : 'ns-resize',\n xy: 'nwse-resize',\n\n top : 'ns-resize',\n left : 'ew-resize',\n bottom : 'ns-resize',\n right : 'ew-resize',\n topleft : 'nwse-resize',\n bottomright: 'nwse-resize',\n topright : 'nesw-resize',\n bottomleft : 'nesw-resize',\n }),\n\n getCursor: function (action) {\n if (action.axis) {\n return resize.cursors[action.name + action.axis];\n }\n else if (action.edges) {\n let cursorKey = '';\n const edgeNames = ['top', 'bottom', 'left', 'right'];\n\n for (let i = 0; i < 4; i++) {\n if (action.edges[edgeNames[i]]) {\n cursorKey += edgeNames[i];\n }\n }\n\n return resize.cursors[cursorKey];\n }\n },\n};\n\n// resizestart\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'resizestart' || !interaction.prepared.edges) {\n return;\n }\n\n const startRect = interaction.target.getRect(interaction.element);\n const resizeOptions = interaction.target.options.resize;\n\n /*\n * When using the `resizable.square` or `resizable.preserveAspectRatio` options, resizing from one edge\n * will affect another. E.g. with `resizable.square`, resizing to make the right edge larger will make\n * the bottom edge larger by the same amount. We call these 'linked' edges. Any linked edges will depend\n * on the active edges and the edge being interacted with.\n */\n if (resizeOptions.square || resizeOptions.preserveAspectRatio) {\n const linkedEdges = utils.extend({}, interaction.prepared.edges);\n\n linkedEdges.top = linkedEdges.top || (linkedEdges.left && !linkedEdges.bottom);\n linkedEdges.left = linkedEdges.left || (linkedEdges.top && !linkedEdges.right );\n linkedEdges.bottom = linkedEdges.bottom || (linkedEdges.right && !linkedEdges.top );\n linkedEdges.right = linkedEdges.right || (linkedEdges.bottom && !linkedEdges.left );\n\n interaction.prepared._linkedEdges = linkedEdges;\n }\n else {\n interaction.prepared._linkedEdges = null;\n }\n\n // if using `resizable.preserveAspectRatio` option, record aspect ratio at the start of the resize\n if (resizeOptions.preserveAspectRatio) {\n interaction.resizeStartAspectRatio = startRect.width / startRect.height;\n }\n\n interaction.resizeRects = {\n start : startRect,\n current : utils.extend({}, startRect),\n inverted : utils.extend({}, startRect),\n previous : utils.extend({}, startRect),\n delta : {\n left: 0, right : 0, width : 0,\n top : 0, bottom: 0, height: 0,\n },\n };\n\n iEvent.rect = interaction.resizeRects.inverted;\n iEvent.deltaRect = interaction.resizeRects.delta;\n});\n\n// resizemove\nInteractEvent.signals.on('new', function ({ iEvent, phase, interaction }) {\n if (phase !== 'move' || !interaction.prepared.edges) { return; }\n\n const resizeOptions = interaction.target.options.resize;\n const invert = resizeOptions.invert;\n const invertible = invert === 'reposition' || invert === 'negate';\n\n let edges = interaction.prepared.edges;\n\n const start = interaction.resizeRects.start;\n const current = interaction.resizeRects.current;\n const inverted = interaction.resizeRects.inverted;\n const delta = interaction.resizeRects.delta;\n const previous = utils.extend(interaction.resizeRects.previous, inverted);\n const originalEdges = edges;\n\n let dx = iEvent.dx;\n let dy = iEvent.dy;\n\n if (resizeOptions.preserveAspectRatio || resizeOptions.square) {\n // `resize.preserveAspectRatio` takes precedence over `resize.square`\n const startAspectRatio = resizeOptions.preserveAspectRatio\n ? interaction.resizeStartAspectRatio\n : 1;\n\n edges = interaction.prepared._linkedEdges;\n\n if ((originalEdges.left && originalEdges.bottom)\n || (originalEdges.right && originalEdges.top)) {\n dy = -dx / startAspectRatio;\n }\n else if (originalEdges.left || originalEdges.right ) { dy = dx / startAspectRatio; }\n else if (originalEdges.top || originalEdges.bottom) { dx = dy * startAspectRatio; }\n }\n\n // update the 'current' rect without modifications\n if (edges.top ) { current.top += dy; }\n if (edges.bottom) { current.bottom += dy; }\n if (edges.left ) { current.left += dx; }\n if (edges.right ) { current.right += dx; }\n\n if (invertible) {\n // if invertible, copy the current rect\n utils.extend(inverted, current);\n\n if (invert === 'reposition') {\n // swap edge values if necessary to keep width/height positive\n let swap;\n\n if (inverted.top > inverted.bottom) {\n swap = inverted.top;\n\n inverted.top = inverted.bottom;\n inverted.bottom = swap;\n }\n if (inverted.left > inverted.right) {\n swap = inverted.left;\n\n inverted.left = inverted.right;\n inverted.right = swap;\n }\n }\n }\n else {\n // if not invertible, restrict to minimum of 0x0 rect\n inverted.top = Math.min(current.top, start.bottom);\n inverted.bottom = Math.max(current.bottom, start.top);\n inverted.left = Math.min(current.left, start.right);\n inverted.right = Math.max(current.right, start.left);\n }\n\n inverted.width = inverted.right - inverted.left;\n inverted.height = inverted.bottom - inverted.top ;\n\n for (const edge in inverted) {\n delta[edge] = inverted[edge] - previous[edge];\n }\n\n iEvent.edges = interaction.prepared.edges;\n iEvent.rect = inverted;\n iEvent.deltaRect = delta;\n});\n\n/*\\\n * Interactable.resizable\n [ method ]\n *\n * Gets or sets whether resize actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of resize elements\n | var isResizeable = interact('input[type=text]').resizable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on resize events (object makes the Interactable resizable)\n = (object) This Interactable\n | interact(element).resizable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | edges: {\n | top : true, // Use pointer coords to check for resize.\n | left : false, // Disable resizing from left edge.\n | bottom: '.resize-s',// Resize if pointer target matches selector\n | right : handleEl // Resize if pointer target is the given Element\n | },\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height are adjusted at a 1:1 ratio.\n | square: false,\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height maintain the aspect ratio they had when resizing started.\n | preserveAspectRatio: false,\n |\n | // a value of 'none' will limit the resize rect to a minimum of 0x0\n | // 'negate' will allow the rect to have negative width/height\n | // 'reposition' will keep the width/height positive by swapping\n | // the top and bottom edges and/or swapping the left and right edges\n | invert: 'none' || 'negate' || 'reposition'\n |\n | // limit multiple resizes.\n | // See the explanation in the @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n \\*/\nInteractable.prototype.resizable = function (options) {\n if (utils.is.object(options)) {\n this.options.resize.enabled = options.enabled === false? false: true;\n this.setPerAction('resize', options);\n this.setOnEvents('resize', options);\n\n if (/^x$|^y$|^xy$/.test(options.axis)) {\n this.options.resize.axis = options.axis;\n }\n else if (options.axis === null) {\n this.options.resize.axis = defaultOptions.resize.axis;\n }\n\n if (utils.is.bool(options.preserveAspectRatio)) {\n this.options.resize.preserveAspectRatio = options.preserveAspectRatio;\n }\n else if (utils.is.bool(options.square)) {\n this.options.resize.square = options.square;\n }\n\n return this;\n }\n if (utils.is.bool(options)) {\n this.options.resize.enabled = options;\n\n if (!options) {\n this.onresizestart = this.onresizestart = this.onresizeend = null;\n }\n\n return this;\n }\n return this.options.resize;\n};\n\nfunction checkResizeEdge (name, value, page, element, interactableElement, rect, margin) {\n // false, '', undefined, null\n if (!value) { return false; }\n\n // true value, use pointer coords and element rect\n if (value === true) {\n // if dimensions are negative, \"switch\" edges\n const width = utils.is.number(rect.width )? rect.width : rect.right - rect.left;\n const height = utils.is.number(rect.height)? rect.height : rect.bottom - rect.top ;\n\n if (width < 0) {\n if (name === 'left' ) { name = 'right'; }\n else if (name === 'right') { name = 'left' ; }\n }\n if (height < 0) {\n if (name === 'top' ) { name = 'bottom'; }\n else if (name === 'bottom') { name = 'top' ; }\n }\n\n if (name === 'left' ) { return page.x < ((width >= 0? rect.left: rect.right ) + margin); }\n if (name === 'top' ) { return page.y < ((height >= 0? rect.top : rect.bottom) + margin); }\n\n if (name === 'right' ) { return page.x > ((width >= 0? rect.right : rect.left) - margin); }\n if (name === 'bottom') { return page.y > ((height >= 0? rect.bottom: rect.top ) - margin); }\n }\n\n // the remaining checks require an element\n if (!utils.is.element(element)) { return false; }\n\n return utils.is.element(value)\n // the value is an element to use as a resize handle\n ? value === element\n // otherwise check if element matches value as selector\n : utils.matchesUpTo(element, value, interactableElement);\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.resizeAxes = 'xy';\n});\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action }) {\n if (action !== 'resize' || !interaction.resizeAxes) { return; }\n\n const options = interaction.target.options;\n\n if (options.resize.square) {\n if (interaction.resizeAxes === 'y') {\n iEvent.dx = iEvent.dy;\n }\n else {\n iEvent.dy = iEvent.dx;\n }\n iEvent.axes = 'xy';\n }\n else {\n iEvent.axes = interaction.resizeAxes;\n\n if (interaction.resizeAxes === 'x') {\n iEvent.dy = 0;\n }\n else if (interaction.resizeAxes === 'y') {\n iEvent.dx = 0;\n }\n }\n});\n\nactions.resize = resize;\nactions.names.push('resize');\nutils.merge(Interactable.eventTypes, [\n 'resizestart',\n 'resizemove',\n 'resizeinertiastart',\n 'resizeinertiaresume',\n 'resizeend',\n]);\nactions.methodDict.resize = 'resizable';\n\ndefaultOptions.resize = resize.defaults;\n\nmodule.exports = resize;\n","const raf = require('./utils/raf');\nconst getWindow = require('./utils/window').getWindow;\nconst is = require('./utils/is');\nconst domUtils = require('./utils/domUtils');\nconst Interaction = require('./Interaction');\nconst defaultOptions = require('./defaultOptions');\n\nconst autoScroll = {\n defaults: {\n enabled : false,\n container: null, // the item that is scrolled (Window or HTMLElement)\n margin : 60,\n speed : 300, // the scroll speed in pixels per second\n },\n\n interaction: null,\n i: null, // the handle returned by window.setInterval\n x: 0, y: 0, // Direction each pulse is to scroll in\n\n isScrolling: false,\n prevTime: 0,\n\n start: function (interaction) {\n autoScroll.isScrolling = true;\n raf.cancel(autoScroll.i);\n\n autoScroll.interaction = interaction;\n autoScroll.prevTime = new Date().getTime();\n autoScroll.i = raf.request(autoScroll.scroll);\n },\n\n stop: function () {\n autoScroll.isScrolling = false;\n raf.cancel(autoScroll.i);\n },\n\n // scroll the window by the values in scroll.x/y\n scroll: function () {\n const options = autoScroll.interaction.target.options[autoScroll.interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(autoScroll.interaction.element);\n const now = new Date().getTime();\n // change in time in seconds\n const dt = (now - autoScroll.prevTime) / 1000;\n // displacement\n const s = options.speed * dt;\n\n if (s >= 1) {\n if (is.window(container)) {\n container.scrollBy(autoScroll.x * s, autoScroll.y * s);\n }\n else if (container) {\n container.scrollLeft += autoScroll.x * s;\n container.scrollTop += autoScroll.y * s;\n }\n\n autoScroll.prevTime = now;\n }\n\n if (autoScroll.isScrolling) {\n raf.cancel(autoScroll.i);\n autoScroll.i = raf.request(autoScroll.scroll);\n }\n },\n check: function (interactable, actionName) {\n const options = interactable.options;\n\n return options[actionName].autoScroll && options[actionName].autoScroll.enabled;\n },\n onInteractionMove: function ({ interaction, pointer }) {\n if (!(interaction.interacting()\n && autoScroll.check(interaction.target, interaction.prepared.name))) {\n return;\n }\n\n if (interaction.simulation) {\n autoScroll.x = autoScroll.y = 0;\n return;\n }\n\n let top;\n let right;\n let bottom;\n let left;\n\n const options = interaction.target.options[interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(interaction.element);\n\n if (is.window(container)) {\n left = pointer.clientX < autoScroll.margin;\n top = pointer.clientY < autoScroll.margin;\n right = pointer.clientX > container.innerWidth - autoScroll.margin;\n bottom = pointer.clientY > container.innerHeight - autoScroll.margin;\n }\n else {\n const rect = domUtils.getElementClientRect(container);\n\n left = pointer.clientX < rect.left + autoScroll.margin;\n top = pointer.clientY < rect.top + autoScroll.margin;\n right = pointer.clientX > rect.right - autoScroll.margin;\n bottom = pointer.clientY > rect.bottom - autoScroll.margin;\n }\n\n autoScroll.x = (right ? 1: left? -1: 0);\n autoScroll.y = (bottom? 1: top? -1: 0);\n\n if (!autoScroll.isScrolling) {\n // set the autoScroll properties to those of the target\n autoScroll.margin = options.margin;\n autoScroll.speed = options.speed;\n\n autoScroll.start(interaction);\n }\n },\n};\n\nInteraction.signals.on('stop-active', function () {\n autoScroll.stop();\n});\n\nInteraction.signals.on('action-move', autoScroll.onInteractionMove);\n\ndefaultOptions.perAction.autoScroll = autoScroll.defaults;\n\nmodule.exports = autoScroll;\n","const Interactable = require('../Interactable');\nconst actions = require('../actions/base');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.ignoreFrom\n [ method ]\n *\n * If the target of the `mousedown`, `pointerdown` or `touchstart`\n * event or any of it's parents match the given CSS selector or\n * Element, no drag/resize/gesture is started.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to not ignore any elements\n = (string | Element | object) The current ignoreFrom value or this Interactable\n **\n | interact(element, { ignoreFrom: document.getElementById('no-action') });\n | // or\n | interact(element).ignoreFrom('input, textarea, a');\n\\*/\nInteractable.prototype.ignoreFrom = function (newValue) {\n return this._backCompatOption('ignoreFrom', newValue);\n};\n\n/*\\\n * Interactable.allowFrom\n [ method ]\n *\n * A drag/resize/gesture is started only If the target of the\n * `mousedown`, `pointerdown` or `touchstart` event or any of it's\n * parents match the given CSS selector or Element.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to allow from any element\n = (string | Element | object) The current allowFrom value or this Interactable\n **\n | interact(element, { allowFrom: document.getElementById('drag-handle') });\n | // or\n | interact(element).allowFrom('.handle');\n\\*/\nInteractable.prototype.allowFrom = function (newValue) {\n return this._backCompatOption('allowFrom', newValue);\n};\n\nInteractable.prototype.testIgnore = function (ignoreFrom, interactableElement, element) {\n if (!ignoreFrom || !is.element(element)) { return false; }\n\n if (is.string(ignoreFrom)) {\n return domUtils.matchesUpTo(element, ignoreFrom, interactableElement);\n }\n else if (is.element(ignoreFrom)) {\n return domUtils.nodeContains(ignoreFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testAllow = function (allowFrom, interactableElement, element) {\n if (!allowFrom) { return true; }\n\n if (!is.element(element)) { return false; }\n\n if (is.string(allowFrom)) {\n return domUtils.matchesUpTo(element, allowFrom, interactableElement);\n }\n else if (is.element(allowFrom)) {\n return domUtils.nodeContains(allowFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testIgnoreAllow = function (options, interactableElement, eventTarget) {\n return (!this.testIgnore(options.ignoreFrom, interactableElement, eventTarget)\n && this.testAllow(options.allowFrom, interactableElement, eventTarget));\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (event.buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\n","const interact = require('../interact');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst actions = require('../actions/base');\nconst defaultOptions = require('../defaultOptions');\nconst browser = require('../utils/browser');\nconst scope = require('../scope');\nconst utils = require('../utils');\nconst signals = require('../utils/Signals').new();\n\nrequire('./InteractableMethods');\n\nconst autoStart = {\n signals,\n withinInteractionLimit,\n // Allow this many interactions to happen simultaneously\n maxInteractions: Infinity,\n defaults: {\n perAction: {\n manualStart: false,\n max: Infinity,\n maxPerElement: 1,\n allowFrom: null,\n ignoreFrom: null,\n },\n },\n setActionDefaults: function (action) {\n utils.extend(action.defaults, autoStart.defaults.perAction);\n },\n};\n\n// set cursor style on mousedown\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget }) {\n if (interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\n// set cursor style on mousemove\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget }) {\n if (!interaction.mouse\n || interaction.pointerIsDown\n || interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\nInteraction.signals.on('move', function (arg) {\n const { interaction, event } = arg;\n\n if (!interaction.pointerIsDown\n || interaction.interacting()\n || !interaction.pointerWasMoved\n || !interaction.prepared.name) {\n return;\n }\n\n signals.fire('before-start', arg);\n\n const target = interaction.target;\n\n if (interaction.prepared.name && target) {\n // check manualStart and interaction limit\n if (target.options[interaction.prepared.name].manualStart\n || !withinInteractionLimit(target, interaction.element, interaction.prepared)) {\n interaction.stop(event);\n }\n else {\n interaction.start(interaction.prepared, target, interaction.element);\n }\n }\n});\n\n// Check if the current target supports the action.\n// If so, return the validated action. Otherwise, return null\nfunction validateAction (action, interactable, element, eventTarget) {\n if (utils.is.object(action)\n && interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget)\n && interactable.options[action.name].enabled\n && withinInteractionLimit(interactable, element, action)) {\n return action;\n }\n\n return null;\n}\n\nfunction validateSelector (interaction, pointer, event, matches, matchElements, eventTarget) {\n for (let i = 0, len = matches.length; i < len; i++) {\n const match = matches[i];\n const matchElement = matchElements[i];\n const action = validateAction(match.getAction(pointer, event, interaction, matchElement),\n match,\n matchElement,\n eventTarget);\n\n if (action) {\n return {\n action,\n target: match,\n element: matchElement,\n };\n }\n }\n\n return {};\n}\n\nfunction getActionInfo (interaction, pointer, event, eventTarget) {\n let matches = [];\n let matchElements = [];\n\n let element = eventTarget;\n let action = null;\n\n function pushMatches (interactable, selector, context) {\n const elements = (browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined);\n\n if (utils.matchesSelector(element, selector, elements)) {\n\n matches.push(interactable);\n matchElements.push(element);\n }\n }\n\n while (utils.is.element(element)) {\n matches = [];\n matchElements = [];\n\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && (action = validateAction(elementInteractable.getAction(pointer, event, interaction, element, eventTarget),\n elementInteractable,\n element,\n eventTarget))\n && !elementInteractable.options[action.name].manualStart) {\n return {\n element,\n action,\n target: elementInteractable,\n };\n }\n else {\n scope.interactables.forEachSelector(pushMatches, element);\n\n const actionInfo = validateSelector(interaction, pointer, event, matches, matchElements, eventTarget);\n\n if (actionInfo.action\n && !actionInfo.target.options[actionInfo.action.name].manualStart) {\n return actionInfo;\n }\n }\n\n element = utils.parentNode(element);\n }\n\n return {};\n}\n\nfunction prepare (interaction, { action, target, element }) {\n action = action || {};\n\n if (interaction.target && interaction.target.options.styleCursor) {\n interaction.target._doc.documentElement.style.cursor = '';\n }\n\n interaction.target = target;\n interaction.element = element;\n utils.copyAction(interaction.prepared, action);\n\n if (target && target.options.styleCursor) {\n const cursor = action? actions[action.name].getCursor(action) : '';\n interaction.target._doc.documentElement.style.cursor = cursor;\n }\n\n signals.fire('prepared', { interaction: interaction });\n}\n\nInteraction.signals.on('stop', function ({ interaction }) {\n const target = interaction.target;\n\n if (target && target.options.styleCursor) {\n target._doc.documentElement.style.cursor = '';\n }\n});\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (utils.is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (utils.is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n const buttons = event.buttons || ({\n 0: 1,\n 1: 4,\n 3: 8,\n 4: 16,\n })[event.button];\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\nfunction withinInteractionLimit (interactable, element, action) {\n const options = interactable.options;\n const maxActions = options[action.name].max;\n const maxPerElement = options[action.name].maxPerElement;\n let activeInteractions = 0;\n let targetCount = 0;\n let targetElementCount = 0;\n\n // no actions if any of these values == 0\n if (!(maxActions && maxPerElement && autoStart.maxInteractions)) { return; }\n\n for (let i = 0, len = scope.interactions.length; i < len; i++) {\n const interaction = scope.interactions[i];\n const otherAction = interaction.prepared.name;\n\n if (!interaction.interacting()) { continue; }\n\n activeInteractions++;\n\n if (activeInteractions >= autoStart.maxInteractions) {\n return false;\n }\n\n if (interaction.target !== interactable) { continue; }\n\n targetCount += (otherAction === action.name)|0;\n\n if (targetCount >= maxActions) {\n return false;\n }\n\n if (interaction.element === element) {\n targetElementCount++;\n\n if (otherAction !== action.name || targetElementCount >= maxPerElement) {\n return false;\n }\n }\n }\n\n return autoStart.maxInteractions > 0;\n}\n\n/*\\\n * interact.maxInteractions\n [ method ]\n **\n * Returns or sets the maximum number of concurrent interactions allowed.\n * By default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables\n * and elements, you need to enable it in the draggable, resizable and\n * gesturable `'max'` and `'maxPerElement'` options.\n **\n - newValue (number) #optional Any number. newValue <= 0 means no interactions.\n\\*/\ninteract.maxInteractions = function (newValue) {\n if (utils.is.number(newValue)) {\n autoStart.maxInteractions = newValue;\n\n return this;\n }\n\n return autoStart.maxInteractions;\n};\n\nInteractable.settingsMethods.push('styleCursor');\nInteractable.settingsMethods.push('actionChecker');\nInteractable.settingsMethods.push('ignoreFrom');\nInteractable.settingsMethods.push('allowFrom');\n\ndefaultOptions.base.actionChecker = null;\ndefaultOptions.base.styleCursor = true;\n\nutils.extend(defaultOptions.perAction, autoStart.defaults.perAction);\n\nmodule.exports = autoStart;\n","const autoStart = require('./base');\nconst Interaction = require('../Interaction');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.delayTimer = null;\n});\n\nautoStart.signals.on('prepared', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.delayTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.target, interaction.element);\n }, delay);\n }\n});\n\nInteraction.signals.on('move', function ({ interaction, duplicate }) {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.delayTimer);\n }\n});\n\n// prevent regular down->move autoStart\nautoStart.signals.on('before-start', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.prepared.name = null;\n }\n});\n","const autoStart = require('./base');\nconst scope = require('../scope');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\n\nconst { matchesSelector, parentNode } = require('../utils/domUtils');\n\nautoStart.setActionDefaults(require('../actions/drag'));\n\nautoStart.signals.on('before-start', function ({ interaction, eventTarget, dx, dy }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // check if a drag is in the correct axis\n const absX = Math.abs(dx);\n const absY = Math.abs(dy);\n const options = interaction.target.options.drag;\n const startAxis = options.startAxis;\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy');\n\n interaction.prepared.axis = options.lockAxis === 'start'\n ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n : options.lockAxis;\n\n // if the movement isn't in the startAxis of the interactable\n if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) {\n // cancel the prepared action\n interaction.prepared.name = null;\n\n // then try to get a drag from another ineractable\n\n if (!interaction.prepared.name) {\n\n let element = eventTarget;\n\n const getDraggable = function (interactable, selector, context) {\n const elements = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n if (interactable === interaction.target) { return; }\n\n if (!options.manualStart\n && !interactable.testIgnoreAllow(options, element, eventTarget)\n && matchesSelector(element, selector, elements)) {\n\n const action = interactable.getAction(interaction.downPointer,\n interaction.downEvent,\n interaction,\n element);\n\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, interactable)\n && autoStart.validateAction(action, interactable, element, eventTarget)) {\n\n return interactable;\n }\n }\n };\n\n let action = null;\n\n // check all interactables\n while (is.element(element)) {\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && elementInteractable !== interaction.target\n && !elementInteractable.options.drag.manualStart) {\n\n action = elementInteractable.getAction(interaction.downPointer, interaction.downEvent, interaction, element);\n }\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, elementInteractable)) {\n\n interaction.prepared.name = 'drag';\n interaction.target = elementInteractable;\n interaction.element = element;\n break;\n }\n\n const selectorInteractable = scope.interactables.forEachSelector(getDraggable, element);\n\n if (selectorInteractable) {\n interaction.prepared.name = 'drag';\n interaction.target = selectorInteractable;\n interaction.element = element;\n break;\n }\n\n element = parentNode(element);\n }\n }\n }\n});\n\nfunction checkStartAxis (startAxis, interactable) {\n if (!interactable) { return false; }\n\n const thisAxis = interactable.options.drag.startAxis;\n\n return (startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis);\n}\n","require('./base').setActionDefaults(require('../actions/gesture'));\n","require('./base').setActionDefaults(require('../actions/resize'));\n","module.exports = {\n base: {\n accept : null,\n preventDefault: 'auto',\n deltaSource : 'page',\n },\n\n perAction: {\n origin: { x: 0, y: 0 },\n\n // only allow left button by default\n // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n mouseButtons: 1,\n\n inertia: {\n enabled : false,\n resistance : 10, // the lambda in exponential decay\n minSpeed : 100, // target speed must be above this for inertia to start\n endSpeed : 10, // the speed at which inertia is slow enough to stop\n allowResume : true, // allow resuming an action in inertia phase\n smoothEndDuration: 300, // animate to snap/restrict endOnly if there's no inertia\n },\n },\n};\n","/* browser entry point */\n\n// Legacy browser support\nrequire('./legacyBrowsers');\n\n// inertia\nrequire('./inertia');\n\n// modifiers\nrequire('./modifiers/snap');\nrequire('./modifiers/restrict');\n\n// pointerEvents\nrequire('./pointerEvents/base');\nrequire('./pointerEvents/holdRepeat');\nrequire('./pointerEvents/interactableTargets');\n\n// delay\nrequire('./autoStart/delay');\n\n// actions\nrequire('./actions/gesture');\nrequire('./actions/resize');\nrequire('./actions/drag');\nrequire('./actions/drop');\n\n// load these modifiers after resize is loaded\nrequire('./modifiers/snapSize');\nrequire('./modifiers/restrictEdges');\nrequire('./modifiers/restrictSize');\n\n// autoStart actions\nrequire('./autoStart/gesture');\nrequire('./autoStart/resize');\nrequire('./autoStart/drag');\n\n// Interactable preventDefault setting\nrequire('./interactablePreventDefault.js');\n\n// autoScroll\nrequire('./autoScroll');\n\n// export interact\nmodule.exports = require('./interact');\n","const InteractEvent = require('./InteractEvent');\nconst Interaction = require('./Interaction');\nconst modifiers = require('./modifiers');\nconst utils = require('./utils');\nconst animationFrame = require('./utils/raf');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.inertiaStatus = {\n active : false,\n smoothEnd : false,\n allowResume: false,\n\n startEvent: null,\n upCoords : {},\n\n xe: 0, ye: 0,\n sx: 0, sy: 0,\n\n t0: 0,\n vx0: 0, vys: 0,\n duration: 0,\n\n lambda_v0: 0,\n one_ve_v0: 0,\n i : null,\n };\n\n interaction.boundInertiaFrame = () => inertiaFrame .apply(interaction);\n interaction.boundSmoothEndFrame = () => smoothEndFrame.apply(interaction);\n});\n\nInteraction.signals.on('down', function ({ interaction, event, pointer, eventTarget }) {\n const status = interaction.inertiaStatus;\n\n // Check if the down event hits the current inertia target\n if (status.active) {\n let element = eventTarget;\n\n // climb up the DOM tree from the event target\n while (utils.is.element(element)) {\n\n // if interaction element is the current inertia target element\n if (element === interaction.element) {\n // stop inertia\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n\n // update pointers to the down event's coordinates\n interaction.updatePointer(pointer);\n utils.setCoords(interaction.curCoords, interaction.pointers);\n\n // fire appropriate signals\n const signalArg = { interaction };\n Interaction.signals.fire('before-action-move', signalArg);\n Interaction.signals.fire('action-resume' , signalArg);\n\n // fire a reume event\n const resumeEvent = new InteractEvent(interaction,\n event,\n interaction.prepared.name,\n 'inertiaresume',\n interaction.element);\n\n interaction.target.fire(resumeEvent);\n interaction.prevEvent = resumeEvent;\n modifiers.resetStatuses(interaction.modifierStatuses);\n\n utils.copyCoords(interaction.prevCoords, interaction.curCoords);\n break;\n }\n\n element = utils.parentNode(element);\n }\n }\n});\n\nInteraction.signals.on('up', function ({ interaction, event }) {\n const status = interaction.inertiaStatus;\n\n if (!interaction.interacting() || status.active) { return; }\n\n const target = interaction.target;\n const options = target && target.options;\n const inertiaOptions = options && interaction.prepared.name && options[interaction.prepared.name].inertia;\n\n const now = new Date().getTime();\n const statuses = {};\n const page = utils.extend({}, interaction.curCoords.page);\n const pointerSpeed = interaction.pointerDelta.client.speed;\n\n let smoothEnd = false;\n let modifierResult;\n\n // check if inertia should be started\n const inertiaPossible = (inertiaOptions && inertiaOptions.enabled\n && interaction.prepared.name !== 'gesture'\n && event !== status.startEvent);\n\n const inertia = (inertiaPossible\n && (now - interaction.curCoords.timeStamp) < 50\n && pointerSpeed > inertiaOptions.minSpeed\n && pointerSpeed > inertiaOptions.endSpeed);\n\n const modifierArg = {\n interaction,\n pageCoords: page,\n statuses,\n preEnd: true,\n requireEndOnly: true,\n };\n\n // smoothEnd\n if (inertiaPossible && !inertia) {\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n if (modifierResult.shouldMove && modifierResult.locked) {\n smoothEnd = true;\n }\n }\n\n if (!(inertia || smoothEnd)) { return; }\n\n utils.copyCoords(status.upCoords, interaction.curCoords);\n\n interaction.pointers[0] = status.startEvent =\n new InteractEvent(interaction, event, interaction.prepared.name, 'inertiastart', interaction.element);\n\n status.t0 = now;\n\n status.active = true;\n status.allowResume = inertiaOptions.allowResume;\n interaction.simulation = status;\n\n target.fire(status.startEvent);\n\n if (inertia) {\n status.vx0 = interaction.pointerDelta.client.vx;\n status.vy0 = interaction.pointerDelta.client.vy;\n status.v0 = pointerSpeed;\n\n calcInertia(interaction, status);\n\n utils.extend(page, interaction.curCoords.page);\n\n page.x += status.xe;\n page.y += status.ye;\n\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n status.modifiedXe += modifierResult.dx;\n status.modifiedYe += modifierResult.dy;\n\n status.i = animationFrame.request(interaction.boundInertiaFrame);\n }\n else {\n status.smoothEnd = true;\n status.xe = modifierResult.dx;\n status.ye = modifierResult.dy;\n\n status.sx = status.sy = 0;\n\n status.i = animationFrame.request(interaction.boundSmoothEndFrame);\n }\n});\n\nInteraction.signals.on('stop-active', function ({ interaction }) {\n const status = interaction.inertiaStatus;\n\n if (status.active) {\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n }\n});\n\nfunction calcInertia (interaction, status) {\n const inertiaOptions = interaction.target.options[interaction.prepared.name].inertia;\n const lambda = inertiaOptions.resistance;\n const inertiaDur = -Math.log(inertiaOptions.endSpeed / status.v0) / lambda;\n\n status.x0 = interaction.prevEvent.pageX;\n status.y0 = interaction.prevEvent.pageY;\n status.t0 = status.startEvent.timeStamp / 1000;\n status.sx = status.sy = 0;\n\n status.modifiedXe = status.xe = (status.vx0 - inertiaDur) / lambda;\n status.modifiedYe = status.ye = (status.vy0 - inertiaDur) / lambda;\n status.te = inertiaDur;\n\n status.lambda_v0 = lambda / status.v0;\n status.one_ve_v0 = 1 - inertiaOptions.endSpeed / status.v0;\n}\n\nfunction inertiaFrame () {\n updateInertiaCoords(this);\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n\n const status = this.inertiaStatus;\n const options = this.target.options[this.prepared.name].inertia;\n const lambda = options.resistance;\n const t = new Date().getTime() / 1000 - status.t0;\n\n if (t < status.te) {\n\n const progress = 1 - (Math.exp(-lambda * t) - status.lambda_v0) / status.one_ve_v0;\n\n if (status.modifiedXe === status.xe && status.modifiedYe === status.ye) {\n status.sx = status.xe * progress;\n status.sy = status.ye * progress;\n }\n else {\n const quadPoint = utils.getQuadraticCurvePoint(0, 0,\n status.xe,\n status.ye,\n status.modifiedXe,\n status.modifiedYe,\n progress);\n\n status.sx = quadPoint.x;\n status.sy = quadPoint.y;\n }\n\n this.doMove();\n\n status.i = animationFrame.request(this.boundInertiaFrame);\n }\n else {\n status.sx = status.modifiedXe;\n status.sy = status.modifiedYe;\n\n this.doMove();\n this.end(status.startEvent);\n status.active = false;\n this.simulation = null;\n }\n\n utils.copyCoords(this.prevCoords, this.curCoords);\n}\n\nfunction smoothEndFrame () {\n updateInertiaCoords(this);\n\n const status = this.inertiaStatus;\n const t = new Date().getTime() - status.t0;\n const duration = this.target.options[this.prepared.name].inertia.smoothEndDuration;\n\n if (t < duration) {\n status.sx = utils.easeOutQuad(t, 0, status.xe, duration);\n status.sy = utils.easeOutQuad(t, 0, status.ye, duration);\n\n this.pointerMove(status.startEvent, status.startEvent);\n\n status.i = animationFrame.request(this.boundSmoothEndFrame);\n }\n else {\n status.sx = status.xe;\n status.sy = status.ye;\n\n this.pointerMove(status.startEvent, status.startEvent);\n this.end(status.startEvent);\n\n status.smoothEnd =\n status.active = false;\n this.simulation = null;\n }\n}\n\nfunction updateInertiaCoords (interaction) {\n const status = interaction.inertiaStatus;\n\n // return if inertia isn't running\n if (!status.active) { return; }\n\n const pageUp = status.upCoords.page;\n const clientUp = status.upCoords.client;\n\n utils.setCoords(interaction.curCoords, [ {\n pageX : pageUp.x + status.sx,\n pageY : pageUp.y + status.sy,\n clientX: clientUp.x + status.sx,\n clientY: clientUp.y + status.sy,\n } ]);\n}\n","const browser = require('./utils/browser');\nconst events = require('./utils/events');\nconst utils = require('./utils');\nconst scope = require('./scope');\nconst Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\n\nconst globalEvents = {};\n\n/*\\\n * interact\n [ method ]\n *\n * The methods of this variable can be used to set elements as\n * interactables and also to change various default settings.\n *\n * Calling it as a function and passing an element or a valid CSS selector\n * string returns an Interactable object which has various methods to\n * configure it.\n *\n - element (Element | string) The HTML or SVG Element to interact with or CSS selector\n = (object) An @Interactable\n *\n > Usage\n | interact('#draggable').draggable(true);\n |\n | var rectables = interact('rect');\n | rectables\n | .gesturable(true)\n | .on('gesturemove', function (event) {\n | // ...\n | });\n\\*/\nfunction interact (element, options) {\n let interactable = scope.interactables.get(element, options);\n\n if (!interactable) {\n interactable = new Interactable(element, options);\n interactable.events.global = globalEvents;\n }\n\n return interactable;\n}\n\n/*\\\n * interact.isSet\n [ method ]\n *\n * Check if an element has been set\n - element (Element) The Element being searched for\n = (boolean) Indicates if the element or CSS selector was previously passed to interact\n\\*/\ninteract.isSet = function (element, options) {\n return scope.interactables.indexOfElement(element, options && options.context) !== -1;\n};\n\n/*\\\n * interact.on\n [ method ]\n *\n * Adds a global listener for an InteractEvent or adds a DOM event to\n * `document`\n *\n - type (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) interact\n\\*/\ninteract.on = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.on(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.on(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n // if it is an InteractEvent type, add listener to globalEvents\n if (utils.contains(Interactable.eventTypes, type)) {\n // if this type of event was never bound\n if (!globalEvents[type]) {\n globalEvents[type] = [listener];\n }\n else {\n globalEvents[type].push(listener);\n }\n }\n // If non InteractEvent type, addEventListener to document\n else {\n events.add(scope.document, type, listener, { options });\n }\n\n return interact;\n};\n\n/*\\\n * interact.off\n [ method ]\n *\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n - type (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) interact\n \\*/\ninteract.off = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.off(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.off(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n if (!utils.contains(Interactable.eventTypes, type)) {\n events.remove(scope.document, type, listener, options);\n }\n else {\n let index;\n\n if (type in globalEvents\n && (index = utils.indexOf(globalEvents[type], listener)) !== -1) {\n globalEvents[type].splice(index, 1);\n }\n }\n\n return interact;\n};\n\n/*\\\n * interact.debug\n [ method ]\n *\n * Returns an object which exposes internal data\n = (object) An object with properties that outline the current state and expose internal functions and variables\n\\*/\ninteract.debug = function () {\n return scope;\n};\n\n// expose the functions used to calculate multi-touch properties\ninteract.getPointerAverage = utils.pointerAverage;\ninteract.getTouchBBox = utils.touchBBox;\ninteract.getTouchDistance = utils.touchDistance;\ninteract.getTouchAngle = utils.touchAngle;\n\ninteract.getElementRect = utils.getElementRect;\ninteract.getElementClientRect = utils.getElementClientRect;\ninteract.matchesSelector = utils.matchesSelector;\ninteract.closest = utils.closest;\n\n/*\\\n * interact.supportsTouch\n [ method ]\n *\n = (boolean) Whether or not the browser supports touch input\n\\*/\ninteract.supportsTouch = function () {\n return browser.supportsTouch;\n};\n\n/*\\\n * interact.supportsPointerEvent\n [ method ]\n *\n = (boolean) Whether or not the browser supports PointerEvents\n\\*/\ninteract.supportsPointerEvent = function () {\n return browser.supportsPointerEvent;\n};\n\n/*\\\n * interact.stop\n [ method ]\n *\n * Cancels all interactions (end events are not fired)\n *\n - event (Event) An event on which to call preventDefault()\n = (object) interact\n\\*/\ninteract.stop = function (event) {\n for (let i = scope.interactions.length - 1; i >= 0; i--) {\n scope.interactions[i].stop(event);\n }\n\n return interact;\n};\n\n/*\\\n * interact.pointerMoveTolerance\n [ method ]\n * Returns or sets the distance the pointer must be moved before an action\n * sequence occurs. This also affects tolerance for tap events.\n *\n - newValue (number) #optional The movement from the start position must be greater than this value\n = (number | Interactable) The current setting or interact\n\\*/\ninteract.pointerMoveTolerance = function (newValue) {\n if (utils.is.number(newValue)) {\n Interaction.pointerMoveTolerance = newValue;\n\n return this;\n }\n\n return Interaction.pointerMoveTolerance;\n};\n\ninteract.addDocument = scope.addDocument;\ninteract.removeDocument = scope.removeDocument;\n\nscope.interact = interact;\n\nmodule.exports = interact;\n","const Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\nconst scope = require('./scope');\nconst is = require('./utils/is');\nconst events = require('./utils/events');\n\nconst { nodeContains, matchesSelector } = require('./utils/domUtils');\n\n/*\\\n * Interactable.preventDefault\n [ method ]\n *\n * Returns or sets whether to prevent the browser's default behaviour\n * in response to pointer events. Can be set to:\n * - `'always'` to always prevent\n * - `'never'` to never prevent\n * - `'auto'` to let interact.js try to determine what would be best\n *\n - newValue (string) #optional `true`, `false` or `'auto'`\n = (string | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.preventDefault = function (newValue) {\n if (/^(always|never|auto)$/.test(newValue)) {\n this.options.preventDefault = newValue;\n return this;\n }\n\n if (is.bool(newValue)) {\n this.options.preventDefault = newValue? 'always' : 'never';\n return this;\n }\n\n return this.options.preventDefault;\n};\n\nInteractable.prototype.checkAndPreventDefault = function (event) {\n const setting = this.options.preventDefault;\n\n if (setting === 'never') { return; }\n\n if (setting === 'always') {\n event.preventDefault();\n return;\n }\n\n // setting === 'auto'\n\n // don't preventDefault if the browser supports passiveEvents\n // CSS touch-action and user-selecct should be used instead\n if (events.supportsOptions) {\n return;\n }\n\n // don't preventDefault of pointerdown events\n if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) {\n return;\n }\n\n // don't preventDefault on editable elements\n if (is.element(event.target)\n && matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) {\n return;\n }\n\n event.preventDefault();\n};\n\nfunction onInteractionEvent ({ interaction, event }) {\n if (interaction.target) {\n interaction.target.checkAndPreventDefault(event);\n }\n}\n\nfor (const eventSignal of ['down', 'move', 'up', 'cancel']) {\n Interaction.signals.on(eventSignal, onInteractionEvent);\n}\n\n// prevent native HTML5 drag on interact.js target elements\nInteraction.docEvents.dragstart = function preventNativeDrag (event) {\n for (const interaction of scope.interactions) {\n\n if (interaction.element\n && (interaction.element === event.target\n || nodeContains(interaction.element, event.target))) {\n\n interaction.target.checkAndPreventDefault(event);\n return;\n }\n }\n};\n","const scope = require('./scope');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst iFinder = require('./utils/interactionFinder');\nconst pointerEvents = require('./pointerEvents/base');\n\nconst { window } = require('./utils/window');\n\nconst toString = Object.prototype.toString;\n\nif (!window.Array.isArray) {\n window.Array.isArray = function (obj) {\n return toString.call(obj) === '[object Array]';\n };\n}\n\nif (!String.prototype.trim) {\n String.prototype.trim = function () {\n return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n };\n}\n\n// http://www.quirksmode.org/dom/events/click.html\n// >Events leading to dblclick\n//\n// IE8 doesn't fire down event before dblclick.\n// This workaround tries to fire a tap and doubletap after dblclick\nfunction onIE8Dblclick (event) {\n const eventTarget = event.target;\n const interaction = iFinder.search(event, event.type, eventTarget);\n\n if (!interaction) { return; }\n\n if (interaction.prevTap\n && event.clientX === interaction.prevTap.clientX\n && event.clientY === interaction.prevTap.clientY\n && eventTarget === interaction.prevTap.target) {\n\n interaction.downTargets[0] = eventTarget;\n interaction.downTimes [0] = new Date().getTime();\n\n pointerEvents.fire({\n interaction,\n event,\n eventTarget,\n pointer: event,\n type: 'tap',\n });\n }\n}\n\nif (browser.isIE8) {\n const selectFix = function (event) {\n for (const interaction of scope.interactions) {\n if (interaction.interacting()) {\n interaction.target.checkAndPreventDefault(event);\n }\n }\n };\n\n const onDocIE8 = function onDocIE8 ({ doc, win }, signalName) {\n const eventMethod = signalName.indexOf('listen') === 0\n ? events.add : events.remove;\n\n // For IE's lack of Event#preventDefault\n eventMethod(doc, 'selectstart', selectFix);\n\n if (pointerEvents) {\n eventMethod(doc, 'dblclick', onIE8Dblclick);\n }\n };\n\n scope.signals.on('add-document' , onDocIE8);\n scope.signals.on('remove-document', onDocIE8);\n}\n\nmodule.exports = null;\n","const InteractEvent = require('../InteractEvent');\nconst Interaction = require('../Interaction');\nconst extend = require('../utils/extend');\n\nconst modifiers = {\n names: [],\n\n setOffsets: function (arg) {\n const { interaction, pageCoords: page } = arg;\n const { target, element, startOffset } = interaction;\n const rect = target.getRect(element);\n\n if (rect) {\n startOffset.left = page.x - rect.left;\n startOffset.top = page.y - rect.top;\n\n startOffset.right = rect.right - page.x;\n startOffset.bottom = rect.bottom - page.y;\n\n if (!('width' in rect)) { rect.width = rect.right - rect.left; }\n if (!('height' in rect)) { rect.height = rect.bottom - rect.top ; }\n }\n else {\n startOffset.left = startOffset.top = startOffset.right = startOffset.bottom = 0;\n }\n\n arg.rect = rect;\n arg.interactable = target;\n arg.element = element;\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n\n arg.options = target.options[interaction.prepared.name][modifierName];\n\n if (!arg.options) {\n continue;\n }\n\n interaction.modifierOffsets[modifierName] = modifiers[modifierName].setOffset(arg);\n }\n },\n\n setAll: function (arg) {\n const { interaction, statuses, preEnd, requireEndOnly } = arg;\n const coords = extend({}, arg.pageCoords);\n const result = {\n dx: 0,\n dy: 0,\n changed: false,\n locked: false,\n shouldMove: true,\n };\n\n for (const modifierName of modifiers.names) {\n const modifier = modifiers[modifierName];\n const options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!shouldDo(options, preEnd, requireEndOnly)) { continue; }\n\n arg.status = arg.status = statuses[modifierName];\n arg.options = options;\n arg.offset = arg.interaction.modifierOffsets[modifierName];\n\n modifier.set(arg);\n\n if (arg.status.locked) {\n coords.x += arg.status.dx;\n coords.y += arg.status.dy;\n\n result.dx += arg.status.dx;\n result.dy += arg.status.dy;\n\n result.locked = true;\n }\n }\n\n // a move should be fired if:\n // - there are no modifiers enabled,\n // - no modifiers are \"locked\" i.e. have changed the pointer's coordinates, or\n // - the locked coords have changed since the last pointer move\n result.shouldMove = !arg.status || !result.locked || arg.status.changed;\n\n return result;\n },\n\n resetStatuses: function (statuses) {\n for (const modifierName of modifiers.names) {\n const status = statuses[modifierName] || {};\n\n status.dx = status.dy = 0;\n status.modifiedX = status.modifiedY = NaN;\n status.locked = false;\n status.changed = true;\n\n statuses[modifierName] = status;\n }\n\n return statuses;\n },\n\n start: function ({ interaction }, signalName) {\n const arg = {\n interaction,\n pageCoords: (signalName === 'action-resume' ?\n interaction.curCoords : interaction.startCoords).page,\n startOffset: interaction.startOffset,\n statuses: interaction.modifierStatuses,\n preEnd: false,\n requireEndOnly: false,\n };\n\n modifiers.setOffsets(arg);\n modifiers.resetStatuses(arg.statuses);\n\n arg.pageCoords = extend({}, interaction.startCoords.page);\n interaction.modifierResult = modifiers.setAll(arg);\n },\n};\n\nInteraction.signals.on('new', function (interaction) {\n interaction.startOffset = { left: 0, right: 0, top: 0, bottom: 0 };\n interaction.modifierOffsets = {};\n interaction.modifierStatuses = modifiers.resetStatuses({});\n interaction.modifierResult = null;\n});\n\nInteraction.signals.on('action-start' , modifiers.start);\nInteraction.signals.on('action-resume', modifiers.start);\n\nInteraction.signals.on('before-action-move', function ({ interaction, preEnd, interactingBeforeMove }) {\n const modifierResult = modifiers.setAll({\n interaction,\n preEnd,\n pageCoords: interaction.curCoords.page,\n statuses: interaction.modifierStatuses,\n requireEndOnly: false,\n });\n\n // don't fire an action move if a modifier would keep the event in the same\n // cordinates as before\n if (!modifierResult.shouldMove && interactingBeforeMove) {\n interaction._dontFireMove = true;\n }\n\n interaction.modifierResult = modifierResult;\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n for (let i = 0; i < modifiers.names.length; i++) {\n const options = interaction.target.options[interaction.prepared.name][modifiers.names[i]];\n\n // if the endOnly option is true for any modifier\n if (shouldDo(options, true, true)) {\n // fire a move event at the modified coordinates\n interaction.doMove({ event, preEnd: true });\n break;\n }\n }\n});\n\nInteractEvent.signals.on('set-xy', function (arg) {\n const { iEvent, interaction } = arg;\n const modifierArg = extend({}, arg);\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n modifierArg.options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!modifierArg.options) {\n continue;\n }\n\n const modifier = modifiers[modifierName];\n\n modifierArg.status = interaction.modifierStatuses[modifierName];\n\n iEvent[modifierName] = modifier.modifyCoords(modifierArg);\n }\n});\n\nfunction shouldDo (options, preEnd, requireEndOnly) {\n return (options && options.enabled\n && (preEnd || !options.endOnly)\n && (!requireEndOnly || options.endOnly));\n}\n\nmodule.exports = modifiers;\n","const modifiers = require('./index');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst restrict = {\n defaults: {\n enabled : false,\n endOnly : false,\n restriction: null,\n elementRect: null,\n },\n\n setOffset: function ({ rect, startOffset, options }) {\n const elementRect = options && options.elementRect;\n const offset = {};\n\n if (rect && elementRect) {\n offset.left = startOffset.left - (rect.width * elementRect.left);\n offset.top = startOffset.top - (rect.height * elementRect.top);\n\n offset.right = startOffset.right - (rect.width * (1 - elementRect.right));\n offset.bottom = startOffset.bottom - (rect.height * (1 - elementRect.bottom));\n }\n else {\n offset.left = offset.top = offset.right = offset.bottom = 0;\n }\n\n return offset;\n },\n\n set: function ({ pageCoords, interaction, status, options }) {\n if (!options) { return status; }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n\n const restriction = getRestrictionRect(options.restriction, interaction, page);\n\n if (!restriction) { return status; }\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n const rect = restriction;\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n const offset = interaction.modifierOffsets.restrict;\n\n // object is assumed to have\n // x, y, width, height or\n // left, top, right, bottom\n if ('x' in restriction && 'y' in restriction) {\n modifiedX = Math.max(Math.min(rect.x + rect.width - offset.right , page.x), rect.x + offset.left);\n modifiedY = Math.max(Math.min(rect.y + rect.height - offset.bottom, page.y), rect.y + offset.top );\n }\n else {\n modifiedX = Math.max(Math.min(rect.right - offset.right , page.x), rect.left + offset.left);\n modifiedY = Math.max(Math.min(rect.bottom - offset.bottom, page.y), rect.top + offset.top );\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const elementRect = options && options.elementRect;\n\n if (options && options.enabled\n && !(phase === 'start' && elementRect && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n getRestrictionRect,\n};\n\nfunction getRestrictionRect (value, interaction, page) {\n if (utils.is.function(value)) {\n return utils.resolveRectLike(value, interaction.target, interaction.element, [page.x, page.y, interaction]);\n } else {\n return utils.resolveRectLike(value, interaction.target, interaction.element);\n }\n}\n\nmodifiers.restrict = restrict;\nmodifiers.names.push('restrict');\n\ndefaultOptions.perAction.restrict = restrict.defaults;\n\nmodule.exports = restrict;\n","// This module adds the options.resize.restrictEdges setting which sets min and\n// max for the top, left, bottom and right edges of the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictEdges: {\n// inner: { top: 200, left: 200, right: 400, bottom: 400 },\n// outer: { top: 0, left: 0, right: 600, bottom: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst { getRestrictionRect } = require('./restrict');\n\nconst noInner = { top: +Infinity, left: +Infinity, bottom: -Infinity, right: -Infinity };\nconst noOuter = { top: -Infinity, left: -Infinity, bottom: +Infinity, right: +Infinity };\n\nconst restrictEdges = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n offset: null,\n },\n\n setOffset: function ({ interaction, startOffset, options }) {\n if (!options) {\n return utils.extend({}, startOffset);\n }\n\n const offset = getRestrictionRect(options.offset, interaction, interaction.startCoords.page);\n\n if (offset) {\n return {\n top: startOffset.top + offset.y,\n left: startOffset.left + offset.x,\n bottom: startOffset.bottom + offset.y,\n right: startOffset.right + offset.x,\n };\n }\n\n return startOffset;\n },\n\n set: function ({ pageCoords, interaction, status, offset, options }) {\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n const inner = rectUtils.xywhToTlbr(getRestrictionRect(options.inner, interaction, page)) || noInner;\n const outer = rectUtils.xywhToTlbr(getRestrictionRect(options.outer, interaction, page)) || noOuter;\n\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n if (edges.top) {\n modifiedY = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top);\n }\n else if (edges.bottom) {\n modifiedY = Math.max(Math.min(outer.bottom - offset.bottom, page.y), inner.bottom - offset.bottom);\n }\n if (edges.left) {\n modifiedX = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left);\n }\n else if (edges.right) {\n modifiedX = Math.max(Math.min(outer.right - offset.right, page.x), inner.right - offset.right);\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n if (options && options.enabled\n && !(phase === 'start' && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n noInner,\n noOuter,\n getRestrictionRect,\n};\n\nmodifiers.restrictEdges = restrictEdges;\nmodifiers.names.push('restrictEdges');\n\ndefaultOptions.perAction.restrictEdges = restrictEdges.defaults;\nresize.defaults.restrictEdges = restrictEdges.defaults;\n\nmodule.exports = restrictEdges;\n","// This module adds the options.resize.restrictSize setting which sets min and\n// max width and height for the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictSize: {\n// min: { width: -600, height: -600 },\n// max: { width: 600, height: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst restrictEdges = require('./restrictEdges');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst noMin = { width: -Infinity, height: -Infinity };\nconst noMax = { width: +Infinity, height: +Infinity };\n\nconst restrictSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n },\n\n setOffset: function ({ interaction }) {\n return interaction.startOffset;\n },\n\n set: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const rect = rectUtils.xywhToTlbr(interaction.resizeRects.inverted);\n\n const minSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.min, interaction)) || noMin;\n const maxSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.max, interaction)) || noMax;\n\n arg.options = {\n enabled: options.enabled,\n endOnly: options.endOnly,\n inner: utils.extend({}, restrictEdges.noInner),\n outer: utils.extend({}, restrictEdges.noOuter),\n };\n\n if (edges.top) {\n arg.options.inner.top = rect.bottom - minSize.height;\n arg.options.outer.top = rect.bottom - maxSize.height;\n }\n else if (edges.bottom) {\n arg.options.inner.bottom = rect.top + minSize.height;\n arg.options.outer.bottom = rect.top + maxSize.height;\n }\n if (edges.left) {\n arg.options.inner.left = rect.right - minSize.width;\n arg.options.outer.left = rect.right - maxSize.width;\n }\n else if (edges.right) {\n arg.options.inner.right = rect.left + minSize.width;\n arg.options.outer.right = rect.left + maxSize.width;\n }\n\n restrictEdges.set(arg);\n },\n\n modifyCoords: restrictEdges.modifyCoords,\n};\n\nmodifiers.restrictSize = restrictSize;\nmodifiers.names.push('restrictSize');\n\ndefaultOptions.perAction.restrictSize = restrictSize.defaults;\nresize.defaults.restrictSize = restrictSize.defaults;\n\nmodule.exports = restrictSize;\n","const modifiers = require('./index');\nconst interact = require('../interact');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst snap = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n\n relativePoints: null,\n },\n\n setOffset: function ({ interaction, interactable, element, rect, startOffset, options }) {\n const offsets = [];\n const optionsOrigin = utils.rectToXY(utils.resolveRectLike(options.origin));\n const origin = optionsOrigin || utils.getOriginXY(interactable, element, interaction.prepared.name);\n options = options || interactable.options[interaction.prepared.name].snap || {};\n\n let snapOffset;\n\n if (options.offset === 'startCoords') {\n snapOffset = {\n x: interaction.startCoords.page.x - origin.x,\n y: interaction.startCoords.page.y - origin.y,\n };\n }\n else {\n const offsetRect = utils.resolveRectLike(options.offset, interactable, element, [interaction]);\n\n snapOffset = utils.rectToXY(offsetRect) || { x: 0, y: 0 };\n }\n\n if (rect && options.relativePoints && options.relativePoints.length) {\n for (const { x: relativeX, y: relativeY } of options.relativePoints) {\n offsets.push({\n x: startOffset.left - (rect.width * relativeX) + snapOffset.x,\n y: startOffset.top - (rect.height * relativeY) + snapOffset.y,\n });\n }\n }\n else {\n offsets.push(snapOffset);\n }\n\n return offsets;\n },\n\n set: function ({ interaction, pageCoords, status, options, offset: offsets }) {\n const targets = [];\n let target;\n let page;\n let i;\n\n if (status.useStatusXY) {\n page = { x: status.x, y: status.y };\n }\n else {\n const origin = utils.getOriginXY(interaction.target, interaction.element, interaction.prepared.name);\n\n page = utils.extend({}, pageCoords);\n\n page.x -= origin.x;\n page.y -= origin.y;\n }\n\n status.realX = page.x;\n status.realY = page.y;\n\n let len = options.targets? options.targets.length : 0;\n\n for (const { x: offsetX, y: offsetY } of offsets) {\n const relativeX = page.x - offsetX;\n const relativeY = page.y - offsetY;\n\n for (const snapTarget of options.targets) {\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n targets.push({\n x: utils.is.number(target.x) ? (target.x + offsetX) : relativeX,\n y: utils.is.number(target.y) ? (target.y + offsetY) : relativeY,\n\n range: utils.is.number(target.range)? target.range: options.range,\n });\n }\n }\n\n const closest = {\n target: null,\n inRange: false,\n distance: 0,\n range: 0,\n dx: 0,\n dy: 0,\n };\n\n for (i = 0, len = targets.length; i < len; i++) {\n target = targets[i];\n\n const range = target.range;\n const dx = target.x - page.x;\n const dy = target.y - page.y;\n const distance = utils.hypot(dx, dy);\n let inRange = distance <= range;\n\n // Infinite targets count as being out of range\n // compared to non infinite ones that are in range\n if (range === Infinity && closest.inRange && closest.range !== Infinity) {\n inRange = false;\n }\n\n if (!closest.target || (inRange\n // is the closest target in range?\n ? (closest.inRange && range !== Infinity\n // the pointer is relatively deeper in this target\n ? distance / range < closest.distance / closest.range\n // this target has Infinite range and the closest doesn't\n : (range === Infinity && closest.range !== Infinity)\n // OR this target is closer that the previous closest\n || distance < closest.distance)\n // The other is not in range and the pointer is closer to this target\n : (!closest.inRange && distance < closest.distance))) {\n\n closest.target = target;\n closest.distance = distance;\n closest.range = range;\n closest.inRange = inRange;\n closest.dx = dx;\n closest.dy = dy;\n\n status.range = range;\n }\n }\n\n let snapChanged;\n\n if (closest.target) {\n snapChanged = (status.modifiedX !== closest.target.x || status.modifiedY !== closest.target.y);\n\n status.modifiedX = closest.target.x;\n status.modifiedY = closest.target.y;\n }\n else {\n snapChanged = true;\n\n status.modifiedX = NaN;\n status.modifiedY = NaN;\n }\n\n status.dx = closest.dx;\n status.dy = closest.dy;\n\n status.changed = (snapChanged || (closest.inRange && !status.locked));\n status.locked = closest.inRange;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const relativePoints = options && options.relativePoints;\n\n if (options && options.enabled\n && !(phase === 'start' && relativePoints && relativePoints.length)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n }\n\n return {\n range : status.range,\n locked : status.locked,\n x : status.modifiedX,\n y : status.modifiedY,\n realX : status.realX,\n realY : status.realY,\n dx : status.dx,\n dy : status.dy,\n };\n }\n },\n};\n\ninteract.createSnapGrid = function (grid) {\n return function (x, y) {\n const limits = grid.limits || {\n left : -Infinity,\n right : Infinity,\n top : -Infinity,\n bottom: Infinity,\n };\n let offsetX = 0;\n let offsetY = 0;\n\n if (utils.is.object(grid.offset)) {\n offsetX = grid.offset.x;\n offsetY = grid.offset.y;\n }\n\n const gridx = Math.round((x - offsetX) / grid.x);\n const gridy = Math.round((y - offsetY) / grid.y);\n\n const newX = Math.max(limits.left, Math.min(limits.right , gridx * grid.x + offsetX));\n const newY = Math.max(limits.top , Math.min(limits.bottom, gridy * grid.y + offsetY));\n\n return {\n x: newX,\n y: newY,\n range: grid.range,\n };\n };\n};\n\nmodifiers.snap = snap;\nmodifiers.names.push('snap');\n\ndefaultOptions.perAction.snap = snap.defaults;\n\nmodule.exports = snap;\n","// This module allows snapping of the size of targets during resize\n// interactions.\n\nconst modifiers = require('./index');\nconst snap = require('./snap');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\nconst utils = require('../utils/');\n\nconst snapSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n },\n\n setOffset: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.edges;\n\n if (!edges) { return; }\n\n arg.options = {\n relativePoints: [{\n x: edges.left? 0 : 1,\n y: edges.top ? 0 : 1,\n }],\n origin: { x: 0, y: 0 },\n offset: 'self',\n range: options.range,\n };\n\n const offsets = snap.setOffset(arg);\n arg.options = options;\n\n return offsets;\n },\n\n set: function (arg) {\n const { interaction, options, offset, pageCoords } = arg;\n const page = utils.extend({}, pageCoords);\n const relativeX = page.x - offset[0].x;\n const relativeY = page.y - offset[0].y;\n\n arg.options = utils.extend({}, options);\n arg.options.targets = [];\n\n for (const snapTarget of options.targets) {\n let target;\n\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n if ('width' in target && 'height' in target) {\n target.x = target.width;\n target.y = target.height;\n }\n\n arg.options.targets.push(target);\n }\n\n snap.set(arg);\n },\n\n modifyCoords: function (arg) {\n const { options } = arg;\n\n arg.options = utils.extend({}, options);\n arg.options.enabled = options.enabled;\n arg.options.relativePoints = [null];\n\n snap.modifyCoords(arg);\n },\n};\n\nmodifiers.snapSize = snapSize;\nmodifiers.names.push('snapSize');\n\ndefaultOptions.perAction.snapSize = snapSize.defaults;\nresize.defaults.snapSize = snapSize.defaults;\n\nmodule.exports = snapSize;\n","const pointerUtils = require('../utils/pointerUtils');\n\nmodule.exports = class PointerEvent {\n constructor (type, pointer, event, eventTarget, interaction) {\n pointerUtils.pointerExtend(this, event);\n\n if (event !== pointer) {\n pointerUtils.pointerExtend(this, pointer);\n }\n\n this.interaction = interaction;\n\n this.timeStamp = new Date().getTime();\n this.originalEvent = event;\n this.type = type;\n this.pointerId = pointerUtils.getPointerId(pointer);\n this.pointerType = pointerUtils.getPointerType(pointer);\n this.target = eventTarget;\n this.currentTarget = null;\n\n if (type === 'tap') {\n const pointerIndex = interaction.getPointerIndex(pointer);\n this.dt = this.timeStamp - interaction.downTimes[pointerIndex];\n\n const interval = this.timeStamp - interaction.tapTime;\n\n this.double = !!(interaction.prevTap\n && interaction.prevTap.type !== 'doubletap'\n && interaction.prevTap.target === this.target\n && interval < 500);\n }\n else if (type === 'doubletap') {\n this.dt = pointer.timeStamp - interaction.tapTime;\n }\n }\n\n subtractOrigin ({ x: originX, y: originY }) {\n this.pageX -= originX;\n this.pageY -= originY;\n this.clientX -= originX;\n this.clientY -= originY;\n\n return this;\n }\n\n addOrigin ({ x: originX, y: originY }) {\n this.pageX += originX;\n this.pageY += originY;\n this.clientX += originX;\n this.clientY += originY;\n\n return this;\n }\n\n preventDefault () {\n this.originalEvent.preventDefault();\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n};\n","const PointerEvent = require('./PointerEvent');\nconst Interaction = require('../Interaction');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst defaults = require('../defaultOptions');\nconst signals = require('../utils/Signals').new();\nconst { filter } = require('../utils/arr');\n\nconst simpleSignals = [ 'down', 'up', 'cancel' ];\nconst simpleEvents = [ 'down', 'up', 'cancel' ];\n\nconst pointerEvents = {\n PointerEvent,\n fire,\n collectEventTargets,\n signals,\n defaults: {\n holdDuration: 600,\n ignoreFrom : null,\n allowFrom : null,\n origin : { x: 0, y: 0 },\n },\n types: [\n 'down',\n 'move',\n 'up',\n 'cancel',\n 'tap',\n 'doubletap',\n 'hold',\n ],\n};\n\nfunction fire (arg) {\n const {\n interaction, pointer, event, eventTarget,\n type = arg.pointerEvent.type,\n targets = collectEventTargets(arg),\n pointerEvent = new PointerEvent(type, pointer, event, eventTarget, interaction),\n } = arg;\n\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n targets,\n type,\n pointerEvent,\n };\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n\n for (const prop in target.props || {}) {\n pointerEvent[prop] = target.props[prop];\n }\n\n const origin = utils.getOriginXY(target.eventable, target.element);\n\n pointerEvent.subtractOrigin(origin);\n pointerEvent.eventable = target.eventable;\n pointerEvent.currentTarget = target.element;\n\n target.eventable.fire(pointerEvent);\n\n pointerEvent.addOrigin(origin);\n\n if (pointerEvent.immediatePropagationStopped\n || (pointerEvent.propagationStopped\n && (i + 1) < targets.length && targets[i + 1].element !== pointerEvent.currentTarget)) {\n break;\n }\n }\n\n signals.fire('fired', signalArg);\n\n if (type === 'tap') {\n // if pointerEvent should make a double tap, create and fire a doubletap\n // PointerEvent and use that as the prevTap\n const prevTap = pointerEvent.double\n ? fire({\n interaction, pointer, event, eventTarget,\n type: 'doubletap',\n })\n : pointerEvent;\n\n interaction.prevTap = prevTap;\n interaction.tapTime = prevTap.timeStamp;\n }\n\n return pointerEvent;\n}\n\nfunction collectEventTargets ({ interaction, pointer, event, eventTarget, type }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n // do not fire a tap event if the pointer was moved before being lifted\n if (type === 'tap' && (interaction.pointerWasMoved\n // or if the pointerup target is different to the pointerdown target\n || !(interaction.downTargets[pointerIndex] && interaction.downTargets[pointerIndex] === eventTarget))) {\n return [];\n }\n\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n path,\n targets: [],\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (type === 'hold') {\n signalArg.targets = filter(signalArg.targets, target =>\n target.eventable.options.holdDuration === interaction.holdTimers[pointerIndex].duration);\n }\n\n return signalArg.targets;\n}\n\nInteraction.signals.on('update-pointer-down', function ({ interaction, pointerIndex }) {\n interaction.holdTimers[pointerIndex] = { duration: Infinity, timeout: null };\n});\n\nInteraction.signals.on('remove-pointer', function ({ interaction, pointerIndex }) {\n interaction.holdTimers.splice(pointerIndex, 1);\n});\n\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget, duplicateMove }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n if (!duplicateMove && (!interaction.pointerIsDown || interaction.pointerWasMoved)) {\n if (interaction.pointerIsDown) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n\n fire({\n interaction, pointer, event, eventTarget,\n type: 'move',\n });\n }\n});\n\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget, pointerIndex }) {\n // copy event to be used in timeout for IE8\n const eventCopy = browser.isIE8? utils.extend({}, event) : event;\n\n const timer = interaction.holdTimers[pointerIndex];\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'hold',\n targets: [],\n path,\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (!signalArg.targets.length) { return; }\n\n let minDuration = Infinity;\n\n for (let i = 0; i < signalArg.targets.length; i++) {\n const target = signalArg.targets[i];\n const holdDuration = target.eventable.options.holdDuration;\n\n if (holdDuration < minDuration) {\n minDuration = holdDuration;\n }\n }\n\n timer.duration = minDuration;\n timer.timeout = setTimeout(function () {\n fire({\n interaction,\n eventTarget,\n pointer: browser.isIE8? eventCopy : pointer,\n event: eventCopy,\n type: 'hold',\n });\n }, minDuration);\n});\n\nInteraction.signals.on('up', ({ interaction, pointer, event, eventTarget }) => {\n if (!interaction.pointerWasMoved) {\n fire({ interaction, eventTarget, pointer, event, type: 'tap' });\n }\n});\n\n['up', 'cancel'].forEach(function (signalName) {\n Interaction.signals.on(signalName, function ({ interaction, pointerIndex }) {\n if (interaction.holdTimers[pointerIndex]) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n });\n});\n\nfunction createSignalListener (type) {\n return function ({ interaction, pointer, event, eventTarget }) {\n fire({ interaction, eventTarget, pointer, event, type });\n };\n}\n\nfor (let i = 0; i < simpleSignals.length; i++) {\n Interaction.signals.on(simpleSignals[i], createSignalListener(simpleEvents[i]));\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.prevTap = null; // the most recent tap event on this interaction\n interaction.tapTime = 0; // time of the most recent tap event\n interaction.holdTimers = []; // [{ duration, timeout }]\n});\n\ndefaults.pointerEvents = pointerEvents.defaults;\nmodule.exports = pointerEvents;\n","const pointerEvents = require('./base');\nconst Interaction = require('../Interaction');\n\npointerEvents.signals.on('new', onNew);\npointerEvents.signals.on('fired', onFired);\n\nfor (const signal of ['move', 'up', 'cancel', 'endall']) {\n Interaction.signals.on(signal, endHoldRepeat);\n}\n\nfunction onNew ({ pointerEvent }) {\n if (pointerEvent.type !== 'hold') { return; }\n\n pointerEvent.count = (pointerEvent.count || 0) + 1;\n}\n\nfunction onFired ({ interaction, pointerEvent, eventTarget, targets }) {\n if (pointerEvent.type !== 'hold' || !targets.length) { return; }\n\n // get the repeat interval from the first eventable\n const interval = targets[0].eventable.options.holdRepeatInterval;\n\n // don't repeat if the interval is 0 or less\n if (interval <= 0) { return; }\n\n // set a timeout to fire the holdrepeat event\n interaction.holdIntervalHandle = setTimeout(function () {\n pointerEvents.fire({\n interaction,\n eventTarget,\n type: 'hold',\n pointer: pointerEvent,\n event: pointerEvent,\n });\n }, interval);\n}\n\nfunction endHoldRepeat ({ interaction }) {\n // set the interaction's holdStopTime property\n // to stop further holdRepeat events\n if (interaction.holdIntervalHandle) {\n clearInterval(interaction.holdIntervalHandle);\n interaction.holdIntervalHandle = null;\n }\n}\n\n// don't repeat by default\npointerEvents.defaults.holdRepeatInterval = 0;\npointerEvents.types.push('holdrepeat');\n\nmodule.exports = {\n onNew,\n onFired,\n endHoldRepeat,\n};\n","const pointerEvents = require('./base');\nconst Interactable = require('../Interactable');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\nconst scope = require('../scope');\nconst extend = require('../utils/extend');\nconst { merge } = require('../utils/arr');\n\npointerEvents.signals.on('collect-targets', function ({ targets, element, type, eventTarget }) {\n function collectSelectors (interactable, selector, context) {\n const els = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && is.element(element)\n && domUtils.matchesSelector(element, selector, els)\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n const interactable = scope.interactables.get(element);\n\n if (interactable) {\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n scope.interactables.forEachSelector(collectSelectors, element);\n});\n\nInteractable.signals.on('new', function ({ interactable }) {\n interactable.events.getRect = function (element) {\n return interactable.getRect(element);\n };\n});\n\nInteractable.signals.on('set', function ({ interactable, options }) {\n extend(interactable.events.options, pointerEvents.defaults);\n extend(interactable.events.options, options);\n});\n\nmerge(Interactable.eventTypes, pointerEvents.types);\n\nInteractable.prototype.pointerEvents = function (options) {\n extend(this.events.options, options);\n\n return this;\n};\n\nconst __backCompatOption = Interactable.prototype._backCompatOption;\n\nInteractable.prototype._backCompatOption = function (optionName, newValue) {\n const ret = __backCompatOption.call(this, optionName, newValue);\n\n if (ret === this) {\n this.events.options[optionName] = newValue;\n }\n\n return ret;\n};\n\nInteractable.settingsMethods.push('pointerEvents');\n","const utils = require('./utils');\nconst events = require('./utils/events');\nconst signals = require('./utils/Signals').new();\n\nconst scope = {\n signals,\n events,\n utils,\n\n // main document\n document: require('./utils/domObjects').document,\n // all documents being listened to\n documents: [],\n\n addDocument: function (doc, win) {\n // do nothing if document is already known\n if (utils.contains(scope.documents, doc)) { return false; }\n\n win = win || scope.getWindow(doc);\n\n scope.documents.push(doc);\n events.documents.push(doc);\n\n // don't add an unload event for the main document\n // so that the page may be cached in browser history\n if (doc !== scope.document) {\n events.add(win, 'unload', scope.onWindowUnload);\n }\n\n signals.fire('add-document', { doc, win });\n },\n\n removeDocument: function (doc, win) {\n const index = utils.indexOf(scope.documents, doc);\n\n win = win || scope.getWindow(doc);\n\n events.remove(win, 'unload', scope.onWindowUnload);\n\n scope.documents.splice(index, 1);\n events.documents.splice(index, 1);\n\n signals.fire('remove-document', { win, doc });\n },\n\n onWindowUnload: function () {\n scope.removeDocument(this.document, this);\n },\n};\n\nmodule.exports = scope;\n","const { indexOf } = require('./arr');\n\nclass Signals {\n constructor () {\n this.listeners = {\n // signalName: [listeners],\n };\n }\n\n on (name, listener) {\n if (!this.listeners[name]) {\n this.listeners[name] = [listener];\n return;\n }\n\n this.listeners[name].push(listener);\n }\n\n off (name, listener) {\n if (!this.listeners[name]) { return; }\n\n const index = indexOf(this.listeners[name], listener);\n\n if (index !== -1) {\n this.listeners[name].splice(index, 1);\n }\n }\n\n fire (name, arg) {\n const targetListeners = this.listeners[name];\n\n if (!targetListeners) { return; }\n\n for (let i = 0; i < targetListeners.length; i++) {\n if (targetListeners[i](arg, name) === false) {\n return;\n }\n }\n }\n}\n\nSignals.new = function () {\n return new Signals();\n};\n\nmodule.exports = Signals;\n","function indexOf (array, target) {\n for (let i = 0, len = array.length; i < len; i++) {\n if (array[i] === target) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction contains (array, target) {\n return indexOf(array, target) !== -1;\n}\n\nfunction merge (target, source) {\n for (let i = 0; i < source.length; i++) {\n target.push(source[i]);\n }\n\n return target;\n}\n\nfunction filter (array, test) {\n const result = [];\n\n for (let i = 0; i < array.length; i++) {\n if (test(array[i])) {\n result.push(array[i]);\n }\n }\n\n return result;\n}\n\nmodule.exports = {\n indexOf,\n contains,\n merge,\n filter,\n};\n","const { window } = require('./window');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst Element = domObjects.Element;\nconst navigator = window.navigator;\n\nconst browser = {\n // Does the browser support touch input?\n supportsTouch: !!(('ontouchstart' in window) || is.function(window.DocumentTouch)\n && domObjects.document instanceof window.DocumentTouch),\n\n // Does the browser support PointerEvents\n supportsPointerEvent: !!domObjects.PointerEvent,\n\n isIE8: ('attachEvent' in window) && !('addEventListener' in window),\n\n // Opera Mobile must be handled differently\n isOperaMobile: (navigator.appName === 'Opera'\n && browser.supportsTouch\n && navigator.userAgent.match('Presto')),\n\n // scrolling doesn't change the result of getClientRects on iOS 7\n isIOS7: (/iP(hone|od|ad)/.test(navigator.platform)\n && /OS 7[^\\d]/.test(navigator.appVersion)),\n\n isIe9OrOlder: /MSIE (8|9)/.test(navigator.userAgent),\n\n // prefix matchesSelector\n prefixedMatchesSelector: 'matches' in Element.prototype\n ? 'matches': 'webkitMatchesSelector' in Element.prototype\n ? 'webkitMatchesSelector': 'mozMatchesSelector' in Element.prototype\n ? 'mozMatchesSelector': 'oMatchesSelector' in Element.prototype\n ? 'oMatchesSelector': 'msMatchesSelector',\n\n useMatchesSelectorPolyfill: false,\n\n pEventTypes: (domObjects.PointerEvent\n ? (domObjects.PointerEvent === window.MSPointerEvent\n ? {\n up: 'MSPointerUp',\n down: 'MSPointerDown',\n over: 'mouseover',\n out: 'mouseout',\n move: 'MSPointerMove',\n cancel: 'MSPointerCancel',\n }\n : {\n up: 'pointerup',\n down: 'pointerdown',\n over: 'pointerover',\n out: 'pointerout',\n move: 'pointermove',\n cancel: 'pointercancel',\n })\n : null),\n\n // because Webkit and Opera still use 'mousewheel' event type\n wheelEvent: 'onmousewheel' in domObjects.document? 'mousewheel': 'wheel',\n\n};\n\nbrowser.useMatchesSelectorPolyfill = !is.function(Element.prototype[browser.prefixedMatchesSelector]);\n\nmodule.exports = browser;\n","const domObjects = {};\nconst win = require('./window').window;\n\nfunction blank () {}\n\ndomObjects.document = win.document;\ndomObjects.DocumentFragment = win.DocumentFragment || blank;\ndomObjects.SVGElement = win.SVGElement || blank;\ndomObjects.SVGSVGElement = win.SVGSVGElement || blank;\ndomObjects.SVGElementInstance = win.SVGElementInstance || blank;\ndomObjects.Element = win.Element || blank;\ndomObjects.HTMLElement = win.HTMLElement || domObjects.Element;\n\ndomObjects.Event = win.Event;\ndomObjects.Touch = win.Touch || blank;\ndomObjects.PointerEvent = (win.PointerEvent || win.MSPointerEvent);\n\nmodule.exports = domObjects;\n","const win = require('./window');\nconst browser = require('./browser');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst domUtils = {\n nodeContains: function (parent, child) {\n while (child) {\n if (child === parent) {\n return true;\n }\n\n child = child.parentNode;\n }\n\n return false;\n },\n\n closest: function (element, selector) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) { return element; }\n\n element = domUtils.parentNode(element);\n }\n\n return null;\n },\n\n parentNode: function (node) {\n let parent = node.parentNode;\n\n if (is.docFrag(parent)) {\n // skip past #shado-root fragments\n while ((parent = parent.host) && is.docFrag(parent)) {\n continue;\n }\n\n return parent;\n }\n\n return parent;\n },\n\n // taken from http://tanalin.com/en/blog/2012/12/matches-selector-ie8/ and modified\n matchesSelectorPolyfill: browser.useMatchesSelectorPolyfill\n ? function (element, selector, elems) {\n elems = elems || element.parentNode.querySelectorAll(selector);\n\n for (let i = 0, len = elems.length; i < len; i++) {\n if (elems[i] === element) {\n return true;\n }\n }\n\n return false;\n }\n : null,\n\n matchesSelector: function (element, selector, nodeList) {\n if (browser.useMatchesSelectorPolyfill) {\n return domUtils.matchesSelectorPolyfill(element, selector, nodeList);\n }\n\n // remove /deep/ from selectors if shadowDOM polyfill is used\n if (win.window !== win.realWindow) {\n selector = selector.replace(/\\/deep\\//g, ' ');\n }\n\n return element[browser.prefixedMatchesSelector](selector);\n },\n\n // Test for the element that's \"above\" all other qualifiers\n indexOfDeepestElement: function (elements) {\n let deepestZoneParents = [];\n let dropzoneParents = [];\n let dropzone;\n let deepestZone = elements[0];\n let index = deepestZone? 0: -1;\n let parent;\n let child;\n let i;\n let n;\n\n for (i = 1; i < elements.length; i++) {\n dropzone = elements[i];\n\n // an element might belong to multiple selector dropzones\n if (!dropzone || dropzone === deepestZone) {\n continue;\n }\n\n if (!deepestZone) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n // check if the deepest or current are document.documentElement or document.rootElement\n // - if the current dropzone is, do nothing and continue\n if (dropzone.parentNode === dropzone.ownerDocument) {\n continue;\n }\n // - if deepest is, update with the current dropzone and continue to next\n else if (deepestZone.parentNode === dropzone.ownerDocument) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n if (!deepestZoneParents.length) {\n parent = deepestZone;\n while (parent.parentNode && parent.parentNode !== parent.ownerDocument) {\n deepestZoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n }\n\n // if this element is an svg element and the current deepest is\n // an HTMLElement\n if (deepestZone instanceof domObjects.HTMLElement\n && dropzone instanceof domObjects.SVGElement\n && !(dropzone instanceof domObjects.SVGSVGElement)) {\n\n if (dropzone === deepestZone.parentNode) {\n continue;\n }\n\n parent = dropzone.ownerSVGElement;\n }\n else {\n parent = dropzone;\n }\n\n dropzoneParents = [];\n\n while (parent.parentNode !== parent.ownerDocument) {\n dropzoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n\n n = 0;\n\n // get (position of last common ancestor) + 1\n while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) {\n n++;\n }\n\n const parents = [\n dropzoneParents[n - 1],\n dropzoneParents[n],\n deepestZoneParents[n],\n ];\n\n child = parents[0].lastChild;\n\n while (child) {\n if (child === parents[1]) {\n deepestZone = dropzone;\n index = i;\n deepestZoneParents = [];\n\n break;\n }\n else if (child === parents[2]) {\n break;\n }\n\n child = child.previousSibling;\n }\n }\n\n return index;\n },\n\n matchesUpTo: function (element, selector, limit) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) {\n return true;\n }\n\n element = domUtils.parentNode(element);\n\n if (element === limit) {\n return domUtils.matchesSelector(element, selector);\n }\n }\n\n return false;\n },\n\n getActualElement: function (element) {\n return (element instanceof domObjects.SVGElementInstance\n ? element.correspondingUseElement\n : element);\n },\n\n getScrollXY: function (relevantWindow) {\n relevantWindow = relevantWindow || win.window;\n return {\n x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft,\n y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop,\n };\n },\n\n getElementClientRect: function (element) {\n const clientRect = (element instanceof domObjects.SVGElement\n ? element.getBoundingClientRect()\n : element.getClientRects()[0]);\n\n return clientRect && {\n left : clientRect.left,\n right : clientRect.right,\n top : clientRect.top,\n bottom: clientRect.bottom,\n width : clientRect.width || clientRect.right - clientRect.left,\n height: clientRect.height || clientRect.bottom - clientRect.top,\n };\n },\n\n getElementRect: function (element) {\n const clientRect = domUtils.getElementClientRect(element);\n\n if (!browser.isIOS7 && clientRect) {\n const scroll = domUtils.getScrollXY(win.getWindow(element));\n\n clientRect.left += scroll.x;\n clientRect.right += scroll.x;\n clientRect.top += scroll.y;\n clientRect.bottom += scroll.y;\n }\n\n return clientRect;\n },\n\n getPath: function (element) {\n const path = [];\n\n while (element) {\n path.push(element);\n element = domUtils.parentNode(element);\n }\n\n return path;\n },\n\n trySelector: value => {\n if (!is.string(value)) { return false; }\n\n // an exception will be raised if it is invalid\n domObjects.document.querySelector(value);\n return true;\n },\n};\n\nmodule.exports = domUtils;\n","const is = require('./is');\nconst domUtils = require('./domUtils');\nconst pExtend = require('./pointerExtend');\n\nconst { window, getWindow } = require('./window');\nconst { indexOf, contains } = require('./arr');\n\nconst useAttachEvent = ('attachEvent' in window) && !('addEventListener' in window);\nconst addEvent = useAttachEvent? 'attachEvent': 'addEventListener';\nconst removeEvent = useAttachEvent? 'detachEvent': 'removeEventListener';\nconst on = useAttachEvent? 'on': '';\n\nconst elements = [];\nconst targets = [];\nconst attachedListeners = [];\n\n// {\n// type: {\n// selectors: ['selector', ...],\n// contexts : [document, ...],\n// listeners: [[listener, capture, passive], ...]\n// }\n// }\nconst delegatedEvents = {};\n\nconst documents = [];\n\nconst supportsOptions = !useAttachEvent && (() => {\n let supported = false;\n\n window.document.createElement('div').addEventListener('test', null, {\n get capture () { supported = true; },\n });\n\n return supported;\n})();\n\nfunction add (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n let elementIndex = indexOf(elements, element);\n let target = targets[elementIndex];\n\n if (!target) {\n target = {\n events: {},\n typeCount: 0,\n };\n\n elementIndex = elements.push(element) - 1;\n targets.push(target);\n\n attachedListeners.push(useAttachEvent\n ? {\n supplied: [],\n wrapped : [],\n useCount: [],\n }\n : null);\n }\n\n if (!target.events[type]) {\n target.events[type] = [];\n target.typeCount++;\n }\n\n if (!contains(target.events[type], listener)) {\n let ret;\n\n if (useAttachEvent) {\n const { supplied, wrapped, useCount } = attachedListeners[elementIndex];\n const listenerIndex = indexOf(supplied, listener);\n\n const wrappedListener = wrapped[listenerIndex] || function (event) {\n if (!event.immediatePropagationStopped) {\n event.target = event.srcElement;\n event.currentTarget = element;\n\n event.preventDefault = event.preventDefault || preventDef;\n event.stopPropagation = event.stopPropagation || stopProp;\n event.stopImmediatePropagation = event.stopImmediatePropagation || stopImmProp;\n\n if (/mouse|click/.test(event.type)) {\n event.pageX = event.clientX + getWindow(element).document.documentElement.scrollLeft;\n event.pageY = event.clientY + getWindow(element).document.documentElement.scrollTop;\n }\n\n listener(event);\n }\n };\n\n ret = element[addEvent](on + type, wrappedListener, !!options.capture);\n\n if (listenerIndex === -1) {\n supplied.push(listener);\n wrapped.push(wrappedListener);\n useCount.push(1);\n }\n else {\n useCount[listenerIndex]++;\n }\n }\n else {\n ret = element[addEvent](type, listener, supportsOptions? options : !!options.capture);\n }\n target.events[type].push(listener);\n\n return ret;\n }\n}\n\nfunction remove (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const elementIndex = indexOf(elements, element);\n const target = targets[elementIndex];\n\n if (!target || !target.events) {\n return;\n }\n\n let wrappedListener = listener;\n let listeners;\n let listenerIndex;\n\n if (useAttachEvent) {\n listeners = attachedListeners[elementIndex];\n listenerIndex = indexOf(listeners.supplied, listener);\n wrappedListener = listeners.wrapped[listenerIndex];\n }\n\n if (type === 'all') {\n for (type in target.events) {\n if (target.events.hasOwnProperty(type)) {\n remove(element, type, 'all');\n }\n }\n return;\n }\n\n if (target.events[type]) {\n const len = target.events[type].length;\n\n if (listener === 'all') {\n for (let i = 0; i < len; i++) {\n remove(element, type, target.events[type][i], options);\n }\n return;\n }\n else {\n for (let i = 0; i < len; i++) {\n if (target.events[type][i] === listener) {\n element[removeEvent](on + type, wrappedListener, supportsOptions? options : !!options.capture);\n target.events[type].splice(i, 1);\n\n if (useAttachEvent && listeners) {\n listeners.useCount[listenerIndex]--;\n if (listeners.useCount[listenerIndex] === 0) {\n listeners.supplied.splice(listenerIndex, 1);\n listeners.wrapped.splice(listenerIndex, 1);\n listeners.useCount.splice(listenerIndex, 1);\n }\n }\n\n break;\n }\n }\n }\n\n if (target.events[type] && target.events[type].length === 0) {\n target.events[type] = null;\n target.typeCount--;\n }\n }\n\n if (!target.typeCount) {\n targets.splice(elementIndex, 1);\n elements.splice(elementIndex, 1);\n attachedListeners.splice(elementIndex, 1);\n }\n}\n\nfunction addDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n if (!delegatedEvents[type]) {\n delegatedEvents[type] = {\n selectors: [],\n contexts : [],\n listeners: [],\n };\n\n // add delegate listener functions\n for (let i = 0; i < documents.length; i++) {\n add(documents[i], type, delegateListener);\n add(documents[i], type, delegateUseCapture, true);\n }\n }\n\n const delegated = delegatedEvents[type];\n let index;\n\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n break;\n }\n }\n\n if (index === -1) {\n index = delegated.selectors.length;\n\n delegated.selectors.push(selector);\n delegated.contexts .push(context);\n delegated.listeners.push([]);\n }\n\n // keep listener and capture and passive flags\n delegated.listeners[index].push([listener, !!options.capture, options.passive]);\n}\n\nfunction removeDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const delegated = delegatedEvents[type];\n let matchFound = false;\n let index;\n\n if (!delegated) { return; }\n\n // count from last index of delegated to 0\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n // look for matching selector and context Node\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n\n const listeners = delegated.listeners[index];\n\n // each item of the listeners array is an array: [function, capture, passive]\n for (let i = listeners.length - 1; i >= 0; i--) {\n const [fn, capture, passive] = listeners[i];\n\n // check if the listener functions and capture and passive flags match\n if (fn === listener && capture === !!options.capture && passive === options.passive) {\n // remove the listener from the array of listeners\n listeners.splice(i, 1);\n\n // if all listeners for this interactable have been removed\n // remove the interactable from the delegated arrays\n if (!listeners.length) {\n delegated.selectors.splice(index, 1);\n delegated.contexts .splice(index, 1);\n delegated.listeners.splice(index, 1);\n\n // remove delegate function from context\n remove(context, type, delegateListener);\n remove(context, type, delegateUseCapture, true);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegatedEvents[type] = null;\n }\n }\n\n // only remove one listener\n matchFound = true;\n break;\n }\n }\n\n if (matchFound) { break; }\n }\n }\n}\n\n// bound to the interactable context when a DOM event\n// listener is added to a selector interactable\nfunction delegateListener (event, optionalArg) {\n const options = getOptions(optionalArg);\n const fakeEvent = {};\n const delegated = delegatedEvents[event.type];\n const eventTarget = (domUtils.getActualElement(event.path\n ? event.path[0]\n : event.target));\n let element = eventTarget;\n\n // duplicate the event so that currentTarget can be changed\n pExtend(fakeEvent, event);\n\n fakeEvent.originalEvent = event;\n fakeEvent.preventDefault = preventOriginalDefault;\n\n // climb up document tree looking for selector matches\n while (is.element(element)) {\n for (let i = 0; i < delegated.selectors.length; i++) {\n const selector = delegated.selectors[i];\n const context = delegated.contexts[i];\n\n if (domUtils.matchesSelector(element, selector)\n && domUtils.nodeContains(context, eventTarget)\n && domUtils.nodeContains(context, element)) {\n\n const listeners = delegated.listeners[i];\n\n fakeEvent.currentTarget = element;\n\n for (let j = 0; j < listeners.length; j++) {\n const [fn, capture, passive] = listeners[j];\n\n if (capture === !!options.capture && passive === options.passive) {\n fn(fakeEvent);\n }\n }\n }\n }\n\n element = domUtils.parentNode(element);\n }\n}\n\nfunction delegateUseCapture (event) {\n return delegateListener.call(this, event, true);\n}\n\nfunction preventDef () {\n this.returnValue = false;\n}\n\nfunction preventOriginalDefault () {\n this.originalEvent.preventDefault();\n}\n\nfunction stopProp () {\n this.cancelBubble = true;\n}\n\nfunction stopImmProp () {\n this.cancelBubble = true;\n this.immediatePropagationStopped = true;\n}\n\nfunction getOptions (param) {\n return is.object(param)? param : { capture: param };\n}\n\nmodule.exports = {\n add,\n remove,\n\n addDelegate,\n removeDelegate,\n\n delegateListener,\n delegateUseCapture,\n delegatedEvents,\n documents,\n\n useAttachEvent,\n supportsOptions,\n\n _elements: elements,\n _targets: targets,\n _attachedListeners: attachedListeners,\n};\n","module.exports = function extend (dest, source) {\n for (const prop in source) {\n dest[prop] = source[prop];\n }\n return dest;\n};\n","const {\n resolveRectLike,\n rectToXY,\n} = require('./rect');\n\nmodule.exports = function (target, element, action) {\n const actionOptions = target.options[action];\n const actionOrigin = actionOptions && actionOptions.origin;\n const origin = actionOrigin || target.options.origin;\n\n const originRect = resolveRectLike(origin, target, element, [target && element]);\n\n return rectToXY(originRect) || { x: 0, y: 0 };\n};\n","module.exports = (x, y) => Math.sqrt(x * x + y * y);\n","const extend = require('./extend');\nconst win = require('./window');\n\nconst utils = {\n warnOnce: function (method, message) {\n let warned = false;\n\n return function () {\n if (!warned) {\n win.window.console.warn(message);\n warned = true;\n }\n\n return method.apply(this, arguments);\n };\n },\n\n // http://stackoverflow.com/a/5634528/2280888\n _getQBezierValue: function (t, p1, p2, p3) {\n const iT = 1 - t;\n return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3;\n },\n\n getQuadraticCurvePoint: function (startX, startY, cpX, cpY, endX, endY, position) {\n return {\n x: utils._getQBezierValue(position, startX, cpX, endX),\n y: utils._getQBezierValue(position, startY, cpY, endY),\n };\n },\n\n // http://gizma.com/easing/\n easeOutQuad: function (t, b, c, d) {\n t /= d;\n return -c * t*(t-2) + b;\n },\n\n copyAction: function (dest, src) {\n dest.name = src.name;\n dest.axis = src.axis;\n dest.edges = src.edges;\n\n return dest;\n },\n\n is : require('./is'),\n extend : extend,\n hypot : require('./hypot'),\n getOriginXY: require('./getOriginXY'),\n};\n\nextend(utils, require('./arr'));\nextend(utils, require('./domUtils'));\nextend(utils, require('./pointerUtils'));\nextend(utils, require('./rect'));\n\nmodule.exports = utils;\n","const scope = require('../scope');\nconst utils = require('./index');\n\nconst finder = {\n methodOrder: [ 'simulationResume', 'mouseOrPen', 'hasPointer', 'idle' ],\n\n search: function (pointer, eventType, eventTarget) {\n const pointerType = utils.getPointerType(pointer);\n const pointerId = utils.getPointerId(pointer);\n const details = { pointer, pointerId, pointerType, eventType, eventTarget };\n\n for (const method of finder.methodOrder) {\n const interaction = finder[method](details);\n\n if (interaction) {\n return interaction;\n }\n }\n },\n\n // try to resume simulation with a new pointer\n simulationResume: function ({ pointerType, eventType, eventTarget }) {\n if (!/down|start/i.test(eventType)) {\n return null;\n }\n\n for (const interaction of scope.interactions) {\n let element = eventTarget;\n\n if (interaction.simulation && interaction.simulation.allowResume\n && (interaction.pointerType === pointerType)) {\n while (element) {\n // if the element is the interaction element\n if (element === interaction.element) {\n return interaction;\n }\n element = utils.parentNode(element);\n }\n }\n }\n\n return null;\n },\n\n // if it's a mouse or pen interaction\n mouseOrPen: function ({ pointerId, pointerType, eventType }) {\n if (pointerType !== 'mouse' && pointerType !== 'pen') {\n return null;\n }\n\n let firstNonActive;\n\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType) {\n // if it's a down event, skip interactions with running simulations\n if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; }\n\n // if the interaction is active, return it immediately\n if (interaction.interacting()) {\n return interaction;\n }\n // otherwise save it and look for another active interaction\n else if (!firstNonActive) {\n firstNonActive = interaction;\n }\n }\n }\n\n // if no active mouse interaction was found use the first inactive mouse\n // interaction\n if (firstNonActive) {\n return firstNonActive;\n }\n\n // find any mouse or pen interaction.\n // ignore the interaction if the eventType is a *down, and a simulation\n // is active\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType && !(/down/i.test(eventType) && interaction.simulation)) {\n return interaction;\n }\n }\n\n return null;\n },\n\n // get interaction that has this pointer\n hasPointer: function ({ pointerId }) {\n for (const interaction of scope.interactions) {\n if (utils.contains(interaction.pointerIds, pointerId)) {\n return interaction;\n }\n }\n },\n\n // get first idle interaction with a matching pointerType\n idle: function ({ pointerType }) {\n for (const interaction of scope.interactions) {\n // if there's already a pointer held down\n if (interaction.pointerIds.length === 1) {\n const target = interaction.target;\n // don't add this pointer if there is a target interactable and it\n // isn't gesturable\n if (target && !target.options.gesture.enabled) {\n continue;\n }\n }\n // maximum of 2 pointers per interaction\n else if (interaction.pointerIds.length >= 2) {\n continue;\n }\n\n if (!interaction.interacting() && (pointerType === interaction.pointerType)) {\n return interaction;\n }\n }\n\n return null;\n },\n};\n\nmodule.exports = finder;\n","const win = require('./window');\nconst isWindow = require('./isWindow');\n\nconst is = {\n array : () => {},\n\n window : thing => thing === win.window || isWindow(thing),\n\n docFrag : thing => is.object(thing) && thing.nodeType === 11,\n\n object : thing => !!thing && (typeof thing === 'object'),\n\n function: thing => typeof thing === 'function',\n\n number : thing => typeof thing === 'number' ,\n\n bool : thing => typeof thing === 'boolean' ,\n\n string : thing => typeof thing === 'string' ,\n\n element: thing => {\n if (!thing || (typeof thing !== 'object')) { return false; }\n\n const _window = win.getWindow(thing) || win.window;\n\n return (/object|function/.test(typeof _window.Element)\n ? thing instanceof _window.Element //DOM2\n : thing.nodeType === 1 && typeof thing.nodeName === 'string');\n },\n};\n\nis.array = thing => (is.object(thing)\n && (typeof thing.length !== 'undefined')\n && is.function(thing.splice));\n\nmodule.exports = is;\n","module.exports = (thing) => !!(thing && thing.Window) && (thing instanceof thing.Window);\n","function pointerExtend (dest, source) {\n for (const prop in source) {\n const prefixedPropREs = module.exports.prefixedPropREs;\n let deprecated = false;\n\n // skip deprecated prefixed properties\n for (const vendor in prefixedPropREs) {\n if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) {\n deprecated = true;\n break;\n }\n }\n\n if (!deprecated && typeof source[prop] !== 'function') {\n dest[prop] = source[prop];\n }\n }\n return dest;\n}\n\npointerExtend.prefixedPropREs = {\n webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/,\n};\n\nmodule.exports = pointerExtend;\n","const hypot = require('./hypot');\nconst browser = require('./browser');\nconst dom = require('./domObjects');\nconst domUtils = require('./domUtils');\nconst domObjects = require('./domObjects');\nconst is = require('./is');\nconst pointerExtend = require('./pointerExtend');\n\nconst pointerUtils = {\n copyCoords: function (dest, src) {\n dest.page = dest.page || {};\n dest.page.x = src.page.x;\n dest.page.y = src.page.y;\n\n dest.client = dest.client || {};\n dest.client.x = src.client.x;\n dest.client.y = src.client.y;\n\n dest.timeStamp = src.timeStamp;\n },\n\n setCoordDeltas: function (targetObj, prev, cur) {\n targetObj.page.x = cur.page.x - prev.page.x;\n targetObj.page.y = cur.page.y - prev.page.y;\n targetObj.client.x = cur.client.x - prev.client.x;\n targetObj.client.y = cur.client.y - prev.client.y;\n targetObj.timeStamp = cur.timeStamp - prev.timeStamp;\n\n // set pointer velocity\n const dt = Math.max(targetObj.timeStamp / 1000, 0.001);\n\n targetObj.page.speed = hypot(targetObj.page.x, targetObj.page.y) / dt;\n targetObj.page.vx = targetObj.page.x / dt;\n targetObj.page.vy = targetObj.page.y / dt;\n\n targetObj.client.speed = hypot(targetObj.client.x, targetObj.page.y) / dt;\n targetObj.client.vx = targetObj.client.x / dt;\n targetObj.client.vy = targetObj.client.y / dt;\n },\n\n isNativePointer: function (pointer) {\n return (pointer instanceof dom.Event || pointer instanceof dom.Touch);\n },\n\n // Get specified X/Y coords for mouse or event.touches[0]\n getXY: function (type, pointer, xy) {\n xy = xy || {};\n type = type || 'page';\n\n xy.x = pointer[type + 'X'];\n xy.y = pointer[type + 'Y'];\n\n return xy;\n },\n\n getPageXY: function (pointer, page) {\n page = page || {};\n\n // Opera Mobile handles the viewport and scrolling oddly\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n pointerUtils.getXY('screen', pointer, page);\n\n page.x += window.scrollX;\n page.y += window.scrollY;\n }\n else {\n pointerUtils.getXY('page', pointer, page);\n }\n\n return page;\n },\n\n getClientXY: function (pointer, client) {\n client = client || {};\n\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n // Opera Mobile handles the viewport and scrolling oddly\n pointerUtils.getXY('screen', pointer, client);\n }\n else {\n pointerUtils.getXY('client', pointer, client);\n }\n\n return client;\n },\n\n getPointerId: function (pointer) {\n return is.number(pointer.pointerId)? pointer.pointerId : pointer.identifier;\n },\n\n setCoords: function (targetObj, pointers, timeStamp) {\n const pointer = (pointers.length > 1\n ? pointerUtils.pointerAverage(pointers)\n : pointers[0]);\n\n const tmpXY = {};\n\n pointerUtils.getPageXY(pointer, tmpXY);\n targetObj.page.x = tmpXY.x;\n targetObj.page.y = tmpXY.y;\n\n pointerUtils.getClientXY(pointer, tmpXY);\n targetObj.client.x = tmpXY.x;\n targetObj.client.y = tmpXY.y;\n\n targetObj.timeStamp = is.number(timeStamp) ? timeStamp :new Date().getTime();\n },\n\n pointerExtend: pointerExtend,\n\n getTouchPair: function (event) {\n const touches = [];\n\n // array of touches is supplied\n if (is.array(event)) {\n touches[0] = event[0];\n touches[1] = event[1];\n }\n // an event\n else {\n if (event.type === 'touchend') {\n if (event.touches.length === 1) {\n touches[0] = event.touches[0];\n touches[1] = event.changedTouches[0];\n }\n else if (event.touches.length === 0) {\n touches[0] = event.changedTouches[0];\n touches[1] = event.changedTouches[1];\n }\n }\n else {\n touches[0] = event.touches[0];\n touches[1] = event.touches[1];\n }\n }\n\n return touches;\n },\n\n pointerAverage: function (pointers) {\n const average = {\n pageX : 0,\n pageY : 0,\n clientX: 0,\n clientY: 0,\n screenX: 0,\n screenY: 0,\n };\n\n for (const pointer of pointers) {\n for (const prop in average) {\n average[prop] += pointer[prop];\n }\n }\n for (const prop in average) {\n average[prop] /= pointers.length;\n }\n\n return average;\n },\n\n touchBBox: function (event) {\n if (!event.length && !(event.touches && event.touches.length > 1)) {\n return;\n }\n\n const touches = pointerUtils.getTouchPair(event);\n const minX = Math.min(touches[0].pageX, touches[1].pageX);\n const minY = Math.min(touches[0].pageY, touches[1].pageY);\n const maxX = Math.max(touches[0].pageX, touches[1].pageX);\n const maxY = Math.max(touches[0].pageY, touches[1].pageY);\n\n return {\n x: minX,\n y: minY,\n left: minX,\n top: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n },\n\n touchDistance: function (event, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n\n\n const dx = touches[0][sourceX] - touches[1][sourceX];\n const dy = touches[0][sourceY] - touches[1][sourceY];\n\n return hypot(dx, dy);\n },\n\n touchAngle: function (event, prevAngle, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n const dx = touches[1][sourceX] - touches[0][sourceX];\n const dy = touches[1][sourceY] - touches[0][sourceY];\n const angle = 180 * Math.atan2(dy , dx) / Math.PI;\n\n return angle;\n },\n\n getPointerType: function (pointer) {\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : is.number(pointer.pointerType)\n ? [undefined, undefined,'touch', 'pen', 'mouse'][pointer.pointerType]\n // if the PointerEvent API isn't available, then the \"pointer\" must\n // be either a MouseEvent, TouchEvent, or Touch object\n : /touch/.test(pointer.type) || pointer instanceof domObjects.Touch\n ? 'touch'\n : 'mouse';\n },\n\n // [ event.target, event.currentTarget ]\n getEventTargets: function (event) {\n return [\n domUtils.getActualElement(event.path ? event.path[0] : event.target),\n domUtils.getActualElement(event.currentTarget),\n ];\n },\n};\n\nmodule.exports = pointerUtils;\n","const { window } = require('./window');\n\nconst vendors = ['ms', 'moz', 'webkit', 'o'];\nlet lastTime = 0;\nlet request;\nlet cancel;\n\nfor (let x = 0; x < vendors.length && !window.requestAnimationFrame; x++) {\n request = window[vendors[x] + 'RequestAnimationFrame'];\n cancel = window[vendors[x] +'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n}\n\nif (!request) {\n request = function (callback) {\n const currTime = new Date().getTime();\n const timeToCall = Math.max(0, 16 - (currTime - lastTime));\n const id = setTimeout(function () { callback(currTime + timeToCall); },\n timeToCall);\n\n lastTime = currTime + timeToCall;\n return id;\n };\n}\n\nif (!cancel) {\n cancel = function (id) {\n clearTimeout(id);\n };\n}\n\nmodule.exports = {\n request,\n cancel,\n};\n","const extend = require('./extend');\nconst is = require('./is');\nconst {\n closest,\n parentNode,\n getElementRect,\n} = require('./domUtils');\n\nconst rectUtils = {\n getStringOptionResult: function (value, interactable, element) {\n if (!is.string(value)) {\n return null;\n }\n\n if (value === 'parent') {\n value = parentNode(element);\n }\n else if (value === 'self') {\n value = interactable.getRect(element);\n }\n else {\n value = closest(element, value);\n }\n\n return value;\n },\n\n resolveRectLike: function (value, interactable, element, functionArgs) {\n value = rectUtils.getStringOptionResult(value, interactable, element) || value;\n\n if (is.function(value)) {\n value = value.apply(null, functionArgs);\n }\n\n if (is.element(value)) {\n value = getElementRect(value);\n }\n\n return value;\n },\n\n rectToXY: function (rect) {\n return rect && {\n x: 'x' in rect ? rect.x : rect.left,\n y: 'y' in rect ? rect.y : rect.top,\n };\n },\n\n xywhToTlbr: function (rect) {\n if (rect && !('left' in rect && 'top' in rect)) {\n rect = extend({}, rect);\n\n rect.left = rect.x || 0;\n rect.top = rect.y || 0;\n rect.right = rect.right || (rect.left + rect.width);\n rect.bottom = rect.bottom || (rect.top + rect.height);\n }\n\n return rect;\n },\n\n tlbrToXywh: function (rect) {\n if (rect && !('x' in rect && 'y' in rect)) {\n rect = extend({}, rect);\n\n rect.x = rect.left || 0;\n rect.top = rect.top || 0;\n rect.width = rect.width || (rect.right - rect.x);\n rect.height = rect.height || (rect.bottom - rect.y);\n }\n\n return rect;\n },\n};\n\nmodule.exports = rectUtils;\n","const win = module.exports;\nconst isWindow = require('./isWindow');\n\nfunction init (window) {\n // get wrapped window if using Shadow DOM polyfill\n\n win.realWindow = window;\n\n // create a TextNode\n const el = window.document.createTextNode('');\n\n // check if it's wrapped by a polyfill\n if (el.ownerDocument !== window.document\n && typeof window.wrap === 'function'\n && window.wrap(el) === el) {\n // use wrapped window\n window = window.wrap(window);\n }\n\n win.window = window;\n}\n\nif (typeof window === 'undefined') {\n win.window = undefined;\n win.realWindow = undefined;\n}\nelse {\n init(window);\n}\n\nwin.getWindow = function getWindow (node) {\n if (isWindow(node)) {\n return node;\n }\n\n const rootNode = (node.ownerDocument || node);\n\n return rootNode.defaultView || rootNode.parentWindow || win.window;\n};\n\nwin.init = init;\n"]} \ No newline at end of file diff --git a/dist/interact.min.js b/dist/interact.min.js index c0bb2476c..2d1f0fb62 100644 --- a/dist/interact.min.js +++ b/dist/interact.min.js @@ -1,6 +1,6 @@ -/* interact.js v1.3.0-alpha.3+sha.9595c40 | https://raw.github.com/taye/interact.js/master/LICENSE */ -!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var t;t="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,t.interact=e()}}(function(){return function e(t,n,r){function i(s,a){if(!n[s]){if(!t[s]){var l="function"==typeof require&&require;if(!a&&l)return l(s,!0);if(o)return o(s,!0);var c=new Error("Cannot find module '"+s+"'");throw c.code="MODULE_NOT_FOUND",c}var p=n[s]={exports:{}};t[s][0].call(p.exports,function(e){var n=t[s][1][e];return i(n||e)},p,p.exports,e,t,n,r)}return n[s].exports}for(var o="function"==typeof require&&require,s=0;s6&&void 0!==arguments[6]&&arguments[6];r(this,e);var f=t.target,v=(f&&f.options||s).deltaSource,g=o(f,p,l),h="start"===c,m="end"===c,y=h?t.startCoords:t.curCoords,x=t.prevEvent;p=p||t.element;var b=i({},y.page),w=i({},y.client);b.x-=g.x,b.y-=g.y,w.x-=g.x,w.y-=g.y,this.ctrlKey=n.ctrlKey,this.altKey=n.altKey,this.shiftKey=n.shiftKey,this.metaKey=n.metaKey,this.button=n.button,this.buttons=n.buttons,this.target=p,this.currentTarget=p,this.relatedTarget=u||null,this.preEnd=d,this.type=l+(c||""),this.interaction=t,this.interactable=f,this.t0=h?t.downTimes[t.downTimes.length-1]:x.t0;var E={interaction:t,event:n,action:l,phase:c,element:p,related:u,page:b,client:w,coords:y,starting:h,ending:m,deltaSource:v,iEvent:this};a.fire("set-xy",E),m?(this.pageX=x.pageX,this.pageY=x.pageY,this.clientX=x.clientX,this.clientY=x.clientY):(this.pageX=b.x,this.pageY=b.y,this.clientX=w.x,this.clientY=w.y),this.x0=t.startCoords.page.x-g.x,this.y0=t.startCoords.page.y-g.y,this.clientX0=t.startCoords.client.x-g.x,this.clientY0=t.startCoords.client.y-g.y,a.fire("set-delta",E),this.timeStamp=y.timeStamp,this.dt=t.pointerDelta.timeStamp,this.duration=this.timeStamp-this.t0,this.speed=t.pointerDelta[v].speed,this.velocityX=t.pointerDelta[v].vx,this.velocityY=t.pointerDelta[v].vy,this.swipe=m||"inertiastart"===c?this.getSwipe():null,a.fire("new",E)}return e.prototype.getSwipe=function(){var e=this.interaction;if(e.prevEvent.speed<600||this.timeStamp-e.prevEvent.timeStamp>150)return null;var t=180*Math.atan2(e.prevEvent.velocityY,e.prevEvent.velocityX)/Math.PI;t<0&&(t+=360);var n=112.5<=t&&t<247.5,r=202.5<=t&&t<337.5,i=!n&&(292.5<=t||t<67.5);return{up:r,down:!r&&22.5<=t&&t<157.5,left:n,right:i,angle:t,speed:e.prevEvent.speed,velocity:{x:e.prevEvent.velocityX,y:e.prevEvent.velocityY}}},e.prototype.preventDefault=function(){},e.prototype.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},e.prototype.stopPropagation=function(){this.propagationStopped=!0},e}();a.on("set-delta",function(e){var t=e.iEvent,n=e.interaction,r=e.starting,i=e.deltaSource,o=r?t:n.prevEvent;"client"===i?(t.dx=t.clientX-o.clientX,t.dy=t.clientY-o.clientY):(t.dx=t.pageX-o.pageX,t.dy=t.pageY-o.pageY)}),l.signals=a,t.exports=l},{"./defaultOptions":18,"./utils/Signals":35,"./utils/extend":41,"./utils/getOriginXY":42}],4:[function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=e("./utils/is"),o=e("./utils/events"),s=e("./utils/extend"),a=e("./actions/base"),l=e("./scope"),c=e("./Eventable"),p=e("./defaultOptions"),u=e("./utils/Signals").new(),d=e("./utils/domUtils"),f=d.getElementRect,v=d.nodeContains,g=d.trySelector,h=e("./utils/window"),m=h.getWindow,y=e("./utils/arr"),x=y.indexOf,b=y.contains,w=e("./utils/browser"),E=w.wheelEvent;l.interactables=[];var S=function(){function e(t,n){r(this,e),n=n||{},this.target=t,this.events=new c,this._context=n.context||l.document,this._win=m(g(t)?this._context:t),this._doc=this._win.document,u.fire("new",{target:t,options:n,interactable:this,win:this._win}),l.addDocument(this._doc,this._win),l.interactables.push(this),this.set(n)}return e.prototype.setOnEvents=function(e,t){var n="on"+e;return i.function(t.onstart)&&(this.events[n+"start"]=t.onstart),i.function(t.onmove)&&(this.events[n+"move"]=t.onmove),i.function(t.onend)&&(this.events[n+"end"]=t.onend),i.function(t.oninertiastart)&&(this.events[n+"inertiastart"]=t.oninertiastart),this},e.prototype.setPerAction=function(e,t){for(var n in t)n in p[e]&&(i.object(t[n])?(this.options[e][n]=s(this.options[e][n]||{},t[n]),i.object(p.perAction[n])&&"enabled"in p.perAction[n]&&(this.options[e][n].enabled=!1!==t[n].enabled)):i.bool(t[n])&&i.object(p.perAction[n])?this.options[e][n].enabled=t[n]:void 0!==t[n]&&(this.options[e][n]=t[n]))},e.prototype.getRect=function(e){return e=e||this.target,i.string(this.target)&&!i.element(e)&&(e=this._context.querySelector(this.target)),f(e)},e.prototype.rectChecker=function(e){return i.function(e)?(this.getRect=e,this):null===e?(delete this.options.getRect,this):this.getRect},e.prototype._backCompatOption=function(e,t){if(g(t)||i.object(t)){this.options[e]=t;for(var n=a.names,r=Array.isArray(n),o=0,n=r?n:n[Symbol.iterator]();;){var s;if(r){if(o>=n.length)break;s=n[o++]}else{if(o=n.next(),o.done)break;s=o.value}var l=s;this.options[l][e]=t}return this}return this.options[e]},e.prototype.origin=function(e){return this._backCompatOption("origin",e)},e.prototype.deltaSource=function(e){return"page"===e||"client"===e?(this.options.deltaSource=e,this):this.options.deltaSource},e.prototype.context=function(){return this._context},e.prototype.inContext=function(e){return this._context===e.ownerDocument||v(this._context,e)},e.prototype.fire=function(e){return this.events.fire(e),this},e.prototype._onOffMultiple=function(e,t,n,r){if(i.string(t)&&-1!==t.search(" ")&&(t=t.trim().split(/ +/)),i.array(t)){for(var o=0;o=l.length)break;f=l[d++]}else{if(d=l.next(),d.done)break;f=d.value}var v=f;this.options[v]=p.base[v],v in t&&this[v](t[v])}return u.fire("set",{options:t,interactable:this}),this},e.prototype.unset=function(){if(o.remove(this.target,"all"),i.string(this.target))for(var e in o.delegatedEvents){var t=o.delegatedEvents[e];t.selectors[0]===this.target&&t.contexts[0]===this._context&&(t.selectors.splice(0,1),t.contexts.splice(0,1),t.listeners.splice(0,1),t.selectors.length||(t[e]=null)),o.remove(this._context,e,o.delegateListener),o.remove(this._context,e,o.delegateUseCapture,!0)}else o.remove(this,"all");u.fire("unset",{interactable:this}),l.interactables.splice(x(l.interactables,this),1);for(var n=l.interactions||[],r=Array.isArray(n),s=0,n=r?n:n[Symbol.iterator]();;){var a;if(r){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var c=a;c.target===this&&c.interacting()&&c.stop()}return l.interact},e}();l.interactables.indexOfElement=function(e,t){t=t||l.document;for(var n=0;n=y.length)break;w=y[b++]}else{if(b=y.next(),b.done)break;w=b.value}var E=w,S=E[0],T=E[1];T._updateEventTargets(r,i),T[e](S,t,r,i)}}}function o(e){for(var t=0;te.pointerMoveTolerance);var a={pointer:t,pointerIndex:this.getPointerIndex(t),event:n,eventTarget:r,dx:o,dy:s,duplicate:i,interaction:this,interactingBeforeMove:this.interacting()};i||l.setCoordDeltas(this.pointerDelta,this.prevCoords,this.curCoords),d.fire("move",a),i||(this.interacting()&&this.doMove(a),this.pointerWasMoved&&l.copyCoords(this.prevCoords,this.curCoords))},e.prototype.doMove=function(e){e=l.extend({pointer:this.pointers[0],event:this.prevEvent,eventTarget:this._eventTarget,interaction:this},e||{}),d.fire("before-action-move",e),this._dontFireMove||d.fire("action-move",e),this._dontFireMove=!1},e.prototype.pointerUp=function(e,t,n,r){var i=this.getPointerIndex(e);d.fire(/cancel$/i.test(t.type)?"cancel":"up",{pointer:e,pointerIndex:i,event:t,eventTarget:n,curEventTarget:r,interaction:this}),this.simulation||this.end(t),this.pointerIsDown=!1,this.removePointer(e,t)},e.prototype.end=function(e){e=e||this.prevEvent,this.interacting()&&d.fire("action-end",{event:e,interaction:this}),this.stop()},e.prototype.currentAction=function(){return this._interacting?this.prepared.name:null},e.prototype.interacting=function(){return this._interacting},e.prototype.stop=function(){d.fire("stop",{interaction:this}),this._interacting&&(d.fire("stop-active",{interaction:this}),d.fire("stop-"+this.prepared.name,{interaction:this})),this.target=this.element=null,this._interacting=!1,this.prepared.name=this.prevEvent=null},e.prototype.getPointerIndex=function(e){return l.indexOf(this.pointerIds,l.getPointerId(e))},e.prototype.updatePointer=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:t&&/(down|start)$/i.test(t.type),r=l.getPointerId(e),i=this.getPointerIndex(e);return-1===i&&(i=this.pointerIds.length,this.pointerIds[i]=r),n&&d.fire("update-pointer-down",{pointer:e,event:t,down:n,pointerId:r,pointerIndex:i,interaction:this}),this.pointers[i]=e,i},e.prototype.removePointer=function(e,t){var n=l.getPointerId(e),r=this.mouse?0:l.indexOf(this.pointerIds,n);-1!==r&&(d.fire("remove-pointer",{pointer:e,event:t,pointerIndex:r,interaction:this}),this.pointers.splice(r,1),this.pointerIds.splice(r,1),this.downTargets.splice(r,1),this.downTimes.splice(r,1))},e.prototype._updateEventTargets=function(e,t){this._eventTarget=e,this._curEventTarget=t},e}(),m=0,y=v.length;m=i.length)break;a=i[s++]}else{if(s=i.next(),s.done)break;a=s.value}var l=a;if(l.options.drop.enabled){var c=l.options.drop.accept;if(!(p.is.element(c)&&c!==t||p.is.string(c)&&!p.matchesSelector(t,c)))for(var d=p.is.string(l.target)?l._context.querySelectorAll(l.target):[l.target],f=0;fo.left&&c.xo.top&&c.y=o.left&&v<=o.right&&g>=o.top&&g<=o.bottom}if(f&&p.is.number(a)){s=Math.max(0,Math.min(o.right,f.right)-Math.max(o.left,f.left))*Math.max(0,Math.min(o.bottom,f.bottom)-Math.max(o.top,f.top))/(f.width*f.height)>=a}return this.options.drop.checker&&(s=this.options.drop.checker(e,t,s,this,i,n,r)),s},v.signals.on("unset",function(e){e.interactable.dropzone(!1)}),v.settingsMethods.push("dropChecker"),g.signals.on("new",function(e){e.dropTarget=null,e.dropElement=null,e.prevDropTarget=null,e.prevDropElement=null,e.dropEvents=null,e.activeDrops={dropzones:[],elements:[],rects:[]}}),g.signals.on("stop",function(e){var t=e.interaction;t.dropTarget=t.dropElement=t.prevDropTarget=t.prevDropElement=null}),d.dynamicDrop=function(e){return p.is.bool(e)?(y=e,d):y},p.merge(v.eventTypes,["dragenter","dragleave","dropactivate","dropdeactivate","dropmove","drop"]),c.methodDict.drop="dropzone",h.drop=m.defaults,t.exports=m},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../interact":21,"../scope":34,"../utils":44,"./base":6}],9:[function(e,t,n){"use strict";var r=e("./base"),i=e("../utils"),o=e("../InteractEvent"),s=e("../Interactable"),a=e("../Interaction"),l=e("../defaultOptions"),c={defaults:{enabled:!1,origin:null,restrict:null},checker:function(e,t,n,r,i){return i.pointerIds.length>=2?{name:"gesture"}:null},getCursor:function(){return""}};o.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;"gesturestart"===t.type&&(t.ds=0,n.gesture.startDistance=n.gesture.prevDistance=t.distance,n.gesture.startAngle=n.gesture.prevAngle=t.angle,n.gesture.scale=1)}),o.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;"gesturemove"===t.type&&(t.ds=t.scale-n.gesture.scale,n.target.fire(t),n.gesture.prevAngle=t.angle,n.gesture.prevDistance=t.distance,t.scale===1/0||null===t.scale||void 0===t.scale||isNaN(t.scale)||(n.gesture.scale=t.scale))}),s.prototype.gesturable=function(e){return i.is.object(e)?(this.options.gesture.enabled=!1!==e.enabled,this.setPerAction("gesture",e),this.setOnEvents("gesture",e),this):i.is.bool(e)?(this.options.gesture.enabled=e,e||(this.ongesturestart=this.ongesturestart=this.ongestureend=null),this):this.options.gesture},o.signals.on("set-delta",function(e){var t=e.interaction,n=e.iEvent,r=e.action,s=e.event,a=e.starting,l=e.ending,c=e.deltaSource;if("gesture"===r){var p=t.pointers;n.touches=[p[0],p[1]],a?(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=1,n.ds=0,n.angle=i.touchAngle(p,void 0,c),n.da=0):l||s instanceof o?(n.distance=t.prevEvent.distance,n.box=t.prevEvent.box,n.scale=t.prevEvent.scale,n.ds=n.scale-1,n.angle=t.prevEvent.angle,n.da=n.angle-t.gesture.startAngle):(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=n.distance/t.gesture.startDistance,n.angle=i.touchAngle(p,t.gesture.prevAngle,c),n.ds=n.scale-t.gesture.prevScale,n.da=n.angle-t.gesture.prevAngle)}}),a.signals.on("new",function(e){e.gesture={start:{x:0,y:0},startDistance:0,prevDistance:0,distance:0,scale:1,startAngle:0,prevAngle:0}}),r.gesture=c,r.names.push("gesture"),i.merge(s.eventTypes,["gesturestart","gesturemove","gestureend"]),r.methodDict.gesture="gesturable",l.gesture=c.defaults,t.exports=c},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"./base":6}],10:[function(e,t,n){"use strict";function r(e,t,n,r,i,s,a){if(!t)return!1;if(!0===t){var l=o.is.number(s.width)?s.width:s.right-s.left,c=o.is.number(s.height)?s.height:s.bottom-s.top;if(l<0&&("left"===e?e="right":"right"===e&&(e="left")),c<0&&("top"===e?e="bottom":"bottom"===e&&(e="top")),"left"===e)return n.x<(l>=0?s.left:s.right)+a;if("top"===e)return n.y<(c>=0?s.top:s.bottom)+a;if("right"===e)return n.x>(l>=0?s.right:s.left)-a;if("bottom"===e)return n.y>(c>=0?s.bottom:s.top)-a}return!!o.is.element(r)&&(o.is.element(t)?t===r:o.matchesUpTo(r,t,i))}var i=e("./base"),o=e("../utils"),s=e("../utils/browser"),a=e("../InteractEvent"),l=e("../Interactable"),c=e("../Interaction"),p=e("../defaultOptions"),u=s.supportsTouch||s.supportsPointerEvent?20:10,d={defaults:{enabled:!1,mouseButtons:null,origin:null,snap:null,restrict:null,inertia:null,autoScroll:null,square:!1,preserveAspectRatio:!1,axis:"xy",margin:NaN,edges:null,invert:"none"},checker:function(e,t,n,i,s,a){if(!a)return null;var l=o.extend({},s.curCoords.page),c=n.options;if(c.resize.enabled){var p=c.resize,d={left:!1,right:!1,top:!1,bottom:!1};if(o.is.object(p.edges)){for(var f in d)d[f]=r(f,p.edges[f],l,s._eventTarget,i,a,p.margin||u);if(d.left=d.left&&!d.right,d.top=d.top&&!d.bottom,d.left||d.right||d.top||d.bottom)return{name:"resize",edges:d}}else{var v="y"!==c.resize.axis&&l.x>a.right-u,g="x"!==c.resize.axis&&l.y>a.bottom-u;if(v||g)return{name:"resize",axes:(v?"x":"")+(g?"y":"")}}}return null},cursors:s.isIe9OrOlder?{x:"e-resize",y:"s-resize",xy:"se-resize",top:"n-resize",left:"w-resize",bottom:"s-resize",right:"e-resize",topleft:"se-resize",bottomright:"se-resize",topright:"ne-resize",bottomleft:"ne-resize"}:{x:"ew-resize",y:"ns-resize",xy:"nwse-resize",top:"ns-resize",left:"ew-resize",bottom:"ns-resize",right:"ew-resize",topleft:"nwse-resize",bottomright:"nwse-resize",topright:"nesw-resize",bottomleft:"nesw-resize"},getCursor:function(e){if(e.axis)return d.cursors[e.name+e.axis];if(e.edges){for(var t="",n=["top","bottom","left","right"],r=0;r<4;r++)e.edges[n[r]]&&(t+=n[r]);return d.cursors[t]}}};a.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;if("resizestart"===t.type&&n.prepared.edges){var r=n.target.getRect(n.element),i=n.target.options.resize;if(i.square||i.preserveAspectRatio){var s=o.extend({},n.prepared.edges);s.top=s.top||s.left&&!s.bottom,s.left=s.left||s.top&&!s.right,s.bottom=s.bottom||s.right&&!s.top,s.right=s.right||s.bottom&&!s.left,n.prepared._linkedEdges=s}else n.prepared._linkedEdges=null;i.preserveAspectRatio&&(n.resizeStartAspectRatio=r.width/r.height),n.resizeRects={start:r,current:o.extend({},r),inverted:o.extend({},r),previous:o.extend({},r),delta:{left:0,right:0,width:0,top:0,bottom:0,height:0}},t.rect=n.resizeRects.inverted,t.deltaRect=n.resizeRects.delta}}),a.signals.on("new",function(e){var t=e.iEvent,n=e.phase,r=e.interaction;if("move"===n&&r.prepared.edges){var i=r.target.options.resize,s=i.invert,a="reposition"===s||"negate"===s,l=r.prepared.edges,c=r.resizeRects.start,p=r.resizeRects.current,u=r.resizeRects.inverted,d=r.resizeRects.delta,f=o.extend(r.resizeRects.previous,u),v=l,g=t.dx,h=t.dy;if(i.preserveAspectRatio||i.square){var m=i.preserveAspectRatio?r.resizeStartAspectRatio:1;l=r.prepared._linkedEdges,v.left&&v.bottom||v.right&&v.top?h=-g/m:v.left||v.right?h=g/m:(v.top||v.bottom)&&(g=h*m)}if(l.top&&(p.top+=h),l.bottom&&(p.bottom+=h),l.left&&(p.left+=g),l.right&&(p.right+=g),a){if(o.extend(u,p),"reposition"===s){var y=void 0;u.top>u.bottom&&(y=u.top,u.top=u.bottom,u.bottom=y),u.left>u.right&&(y=u.left,u.left=u.right,u.right=y)}}else u.top=Math.min(p.top,c.bottom),u.bottom=Math.max(p.bottom,c.top),u.left=Math.min(p.left,c.right),u.right=Math.max(p.right,c.left);u.width=u.right-u.left,u.height=u.bottom-u.top;for(var x in u)d[x]=u[x]-f[x];t.edges=r.prepared.edges,t.rect=u,t.deltaRect=d}}),l.prototype.resizable=function(e){return o.is.object(e)?(this.options.resize.enabled=!1!==e.enabled,this.setPerAction("resize",e),this.setOnEvents("resize",e),/^x$|^y$|^xy$/.test(e.axis)?this.options.resize.axis=e.axis:null===e.axis&&(this.options.resize.axis=p.resize.axis),o.is.bool(e.preserveAspectRatio)?this.options.resize.preserveAspectRatio=e.preserveAspectRatio:o.is.bool(e.square)&&(this.options.resize.square=e.square),this):o.is.bool(e)?(this.options.resize.enabled=e,e||(this.onresizestart=this.onresizestart=this.onresizeend=null),this):this.options.resize},c.signals.on("new",function(e){ -e.resizeAxes="xy"}),a.signals.on("set-delta",function(e){var t=e.interaction,n=e.iEvent;"resize"===e.action&&t.resizeAxes&&(t.target.options.resize.square?("y"===t.resizeAxes?n.dx=n.dy:n.dy=n.dx,n.axes="xy"):(n.axes=t.resizeAxes,"x"===t.resizeAxes?n.dy=0:"y"===t.resizeAxes&&(n.dx=0)))}),i.resize=d,i.names.push("resize"),o.merge(l.eventTypes,["resizestart","resizemove","resizeinertiastart","resizeinertiaresume","resizeend"]),i.methodDict.resize="resizable",p.resize=d.defaults,t.exports=d},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"../utils/browser":37,"./base":6}],11:[function(e,t,n){"use strict";var r=e("./utils/raf"),i=e("./utils/window").getWindow,o=e("./utils/is"),s=e("./utils/domUtils"),a=e("./Interaction"),l=e("./defaultOptions"),c={defaults:{enabled:!1,container:null,margin:60,speed:300},interaction:null,i:null,x:0,y:0,isScrolling:!1,prevTime:0,start:function(e){c.isScrolling=!0,r.cancel(c.i),c.interaction=e,c.prevTime=(new Date).getTime(),c.i=r.request(c.scroll)},stop:function(){c.isScrolling=!1,r.cancel(c.i)},scroll:function(){var e=c.interaction.target.options[c.interaction.prepared.name].autoScroll,t=e.container||i(c.interaction.element),n=(new Date).getTime(),s=(n-c.prevTime)/1e3,a=e.speed*s;a>=1&&(o.window(t)?t.scrollBy(c.x*a,c.y*a):t&&(t.scrollLeft+=c.x*a,t.scrollTop+=c.y*a),c.prevTime=n),c.isScrolling&&(r.cancel(c.i),c.i=r.request(c.scroll))},check:function(e,t){var n=e.options;return n[t].autoScroll&&n[t].autoScroll.enabled},onInteractionMove:function(e){var t=e.interaction,n=e.pointer;if(t.interacting()&&c.check(t.target,t.prepared.name)){if(t.simulation)return void(c.x=c.y=0);var r=void 0,a=void 0,l=void 0,p=void 0,u=t.target.options[t.prepared.name].autoScroll,d=u.container||i(t.element);if(o.window(d))p=n.clientXd.innerWidth-c.margin,l=n.clientY>d.innerHeight-c.margin;else{var f=s.getElementClientRect(d);p=n.clientXf.right-c.margin,l=n.clientY>f.bottom-c.margin}c.x=a?1:p?-1:0,c.y=l?1:r?-1:0,c.isScrolling||(c.margin=u.margin,c.speed=u.speed,c.start(t))}}};a.signals.on("stop-active",function(){c.stop()}),a.signals.on("action-move",c.onInteractionMove),l.perAction.autoScroll=c.defaults,t.exports=c},{"./Interaction":5,"./defaultOptions":18,"./utils/domUtils":39,"./utils/is":46,"./utils/raf":50,"./utils/window":52}],12:[function(e,t,n){"use strict";var r=e("../Interactable"),i=e("../actions/base"),o=e("../utils/is"),s=e("../utils/domUtils");r.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},r.prototype.ignoreFrom=function(e){return this._backCompatOption("ignoreFrom",e)},r.prototype.allowFrom=function(e){return this._backCompatOption("allowFrom",e)},r.prototype.testIgnore=function(e,t,n){return!(!e||!o.element(n))&&(o.string(e)?s.matchesUpTo(n,e,t):!!o.element(e)&&s.nodeContains(e,n))},r.prototype.testAllow=function(e,t,n){return!e||!!o.element(n)&&(o.string(e)?s.matchesUpTo(n,e,t):!!o.element(e)&&s.nodeContains(e,n))},r.prototype.testIgnoreAllow=function(e,t,n){return!this.testIgnore(e.ignoreFrom,t,n)&&this.testAllow(e.allowFrom,t,n)},r.prototype.actionChecker=function(e){return o.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},r.prototype.styleCursor=function(e){return o.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},r.prototype.defaultActionChecker=function(e,t,n,r){for(var o=this.getRect(r),s=null,a=i.names,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var u=p;if((!n.pointerIsDown||!n.mouse||0!=(t.buttons&this.options[u].mouseButtons))&&(s=i[u].checker(e,t,this,r,n,o)))return s}}},{"../Interactable":4,"../actions/base":6,"../utils/domUtils":39,"../utils/is":46}],13:[function(e,t,n){"use strict";function r(e,t,n,r){return g.is.object(e)&&t.testIgnoreAllow(t.options[e.name],n,r)&&t.options[e.name].enabled&&a(t,n,e)?e:null}function i(e,t,n,i,o,s){for(var a=0,l=i.length;a=m.maxInteractions)return!1;if(u.target===e){if((a+=d===n.name|0)>=i)return!1;if(u.element===t&&(l++,d!==n.name||l>=o))return!1}}}return m.maxInteractions>0}}var l=e("../interact"),c=e("../Interactable"),p=e("../Interaction"),u=e("../actions/base"),d=e("../defaultOptions"),f=e("../utils/browser"),v=e("../scope"),g=e("../utils"),h=e("../utils/Signals").new();e("./InteractableMethods");var m={signals:h,withinInteractionLimit:a,maxInteractions:1/0,defaults:{perAction:{manualStart:!1,max:1/0,maxPerElement:1,allowFrom:null,ignoreFrom:null}},setActionDefaults:function(e){g.extend(e.defaults,m.defaults.perAction)}};p.signals.on("down",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;if(!t.interacting()){s(t,o(t,n,r,i))}}),p.signals.on("move",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;if(t.mouse&&!t.pointerIsDown&&!t.interacting()){s(t,o(t,n,r,i))}}),p.signals.on("move",function(e){var t=e.interaction,n=e.event;if(t.pointerIsDown&&!t.interacting()&&t.pointerWasMoved&&t.prepared.name){h.fire("before-start",e);var r=t.target;t.prepared.name&&r&&(r.options[t.prepared.name].manualStart||!a(r,t.element,t.prepared)?t.stop(n):t.start(t.prepared,r,t.element))}}),p.signals.on("stop",function(e){var t=e.interaction,n=t.target;n&&n.options.styleCursor&&(n._doc.documentElement.style.cursor="")}),c.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},c.prototype.actionChecker=function(e){return g.is.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},c.prototype.styleCursor=function(e){return g.is.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},c.prototype.defaultActionChecker=function(e,t,n,r){for(var i=this.getRect(r),o=t.buttons||{0:1,1:4,3:8,4:16}[t.button],s=null,a=u.names,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var d=p;if((!n.pointerIsDown||!n.mouse||0!=(o&this.options[d].mouseButtons))&&(s=u[d].checker(e,t,this,r,n,i)))return s}},l.maxInteractions=function(e){return g.is.number(e)?(m.maxInteractions=e,this):m.maxInteractions},c.settingsMethods.push("styleCursor"),c.settingsMethods.push("actionChecker"),c.settingsMethods.push("ignoreFrom"),c.settingsMethods.push("allowFrom"),d.base.actionChecker=null,d.base.styleCursor=!0,g.extend(d.perAction,m.defaults.perAction),t.exports=m},{"../Interactable":4,"../Interaction":5,"../actions/base":6,"../defaultOptions":18,"../interact":21,"../scope":34,"../utils":44,"../utils/Signals":35,"../utils/browser":37,"./InteractableMethods":12}],14:[function(e,t,n){"use strict";var r=e("./base"),i=e("../Interaction");i.signals.on("new",function(e){e.delayTimer=null}),r.signals.on("prepared",function(e){var t=e.interaction,n=t.prepared.name;if(n){var r=t.target.options[n].delay;r>0&&(t.delayTimer=setTimeout(function(){t.start(t.prepared,t.target,t.element)},r))}}),i.signals.on("move",function(e){var t=e.interaction,n=e.duplicate;t.pointerWasMoved&&!n&&clearTimeout(t.delayTimer)}),r.signals.on("before-start",function(e){var t=e.interaction,n=t.prepared.name;if(n){t.target.options[n].delay>0&&(t.prepared.name=null)}})},{"../Interaction":5,"./base":13}],15:[function(e,t,n){"use strict";function r(e,t){if(!t)return!1;var n=t.options.drag.startAxis;return"xy"===e||"xy"===n||n===e}var i=e("./base"),o=e("../scope"),s=e("../utils/browser"),a=e("../utils/is"),l=e("../utils/domUtils"),c=l.matchesSelector,p=l.parentNode;i.setActionDefaults(e("../actions/drag")),i.signals.on("before-start",function(e){var t=e.interaction,n=e.eventTarget,l=e.dx,u=e.dy;if("drag"===t.prepared.name){var d=Math.abs(l),f=Math.abs(u),v=t.target.options.drag,g=v.startAxis,h=d>f?"x":dl.minSpeed&&g>l.endSpeed,b={interaction:t,pageCoords:v,statuses:f,preEnd:!0,requireEndOnly:!0};y&&!x&&(c.resetStatuses(f),m=c.setAll(b),m.shouldMove&&m.locked&&(h=!0)),(x||h)&&(p.copyCoords(i.upCoords,t.curCoords),t.pointers[0]=i.startEvent=new a(t,n,t.prepared.name,"inertiastart",t.element),i.t0=d,i.active=!0,i.allowResume=l.allowResume,t.simulation=i,o.fire(i.startEvent),x?(i.vx0=t.pointerDelta.client.vx,i.vy0=t.pointerDelta.client.vy,i.v0=g,r(t,i),p.extend(v,t.curCoords.page),v.x+=i.xe,v.y+=i.ye,c.resetStatuses(f),m=c.setAll(b),i.modifiedXe+=m.dx,i.modifiedYe+=m.dy,i.i=u.request(t.boundInertiaFrame)):(i.smoothEnd=!0,i.xe=m.dx,i.ye=m.dy,i.sx=i.sy=0,i.i=u.request(t.boundSmoothEndFrame)))}}),l.signals.on("stop-active",function(e){var t=e.interaction,n=t.inertiaStatus;n.active&&(u.cancel(n.i),n.active=!1,t.simulation=null)})},{"./InteractEvent":3,"./Interaction":5,"./modifiers":24,"./utils":44,"./utils/raf":50}],21:[function(e,t,n){"use strict";function r(e,t){var n=a.interactables.get(e,t);return n||(n=new l(e,t),n.events.global=p),n}var i=e("./utils/browser"),o=e("./utils/events"),s=e("./utils"),a=e("./scope"),l=e("./Interactable"),c=e("./Interaction"),p={};r.isSet=function(e,t){return-1!==a.interactables.indexOfElement(e,t&&t.context)},r.on=function(e,t,n){if(s.is.string(e)&&-1!==e.search(" ")&&(e=e.trim().split(/ +/)),s.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.on(f,t,n)}return r}if(s.is.object(e)){for(var v in e)r.on(v,e[v],t);return r}return s.contains(l.eventTypes,e)?p[e]?p[e].push(t):p[e]=[t]:o.add(a.document,e,t,{options:n}),r},r.off=function(e,t,n){if(s.is.string(e)&&-1!==e.search(" ")&&(e=e.trim().split(/ +/)),s.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.off(f,t,n)}return r}if(s.is.object(e)){for(var v in e)r.off(v,e[v],t);return r}if(s.contains(l.eventTypes,e)){var g=void 0;e in p&&-1!==(g=s.indexOf(p[e],t))&&p[e].splice(g,1)}else o.remove(a.document,e,t,n);return r},r.debug=function(){return a},r.getPointerAverage=s.pointerAverage,r.getTouchBBox=s.touchBBox,r.getTouchDistance=s.touchDistance,r.getTouchAngle=s.touchAngle,r.getElementRect=s.getElementRect,r.getElementClientRect=s.getElementClientRect,r.matchesSelector=s.matchesSelector,r.closest=s.closest,r.supportsTouch=function(){return i.supportsTouch},r.supportsPointerEvent=function(){return i.supportsPointerEvent},r.stop=function(e){for(var t=a.interactions.length-1;t>=0;t--)a.interactions[t].stop(e);return r},r.pointerMoveTolerance=function(e){return s.is.number(e)?(c.pointerMoveTolerance=e,this):c.pointerMoveTolerance},r.addDocument=a.addDocument,r.removeDocument=a.removeDocument,a.interact=r,t.exports=r},{"./Interactable":4,"./Interaction":5,"./scope":34,"./utils":44,"./utils/browser":37,"./utils/events":40}],22:[function(e,t,n){"use strict";function r(e){var t=e.interaction,n=e.event;t.target&&t.target.checkAndPreventDefault(n)}var i=e("./Interactable"),o=e("./Interaction"),s=e("./scope"),a=e("./utils/is"),l=e("./utils/events"),c=e("./utils/domUtils"),p=c.nodeContains,u=c.matchesSelector;i.prototype.preventDefault=function(e){return/^(always|never|auto)$/.test(e)?(this.options.preventDefault=e,this):a.bool(e)?(this.options.preventDefault=e?"always":"never",this):this.options.preventDefault},i.prototype.checkAndPreventDefault=function(e){var t=this.options.preventDefault;if("never"!==t)return"always"===t?void e.preventDefault():void(l.supportsOptions||/^(mouse|pointer|touch)*(down|start)/i.test(e.type)||a.element(e.target)&&u(e.target,"input,select,textarea,[contenteditable=true],[contenteditable=true] *")||e.preventDefault())};for(var d=["down","move","up","cancel"],f=0;f=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i;if(o.element&&(o.element===e.target||p(o.element,e.target)))return void o.target.checkAndPreventDefault(e)}}},{"./Interactable":4,"./Interaction":5,"./scope":34,"./utils/domUtils":39,"./utils/events":40,"./utils/is":46}],23:[function(e,t,n){"use strict";function r(e){var t=e.target,n=a.search(e,e.type,t);n&&n.prevTap&&e.clientX===n.prevTap.clientX&&e.clientY===n.prevTap.clientY&&t===n.prevTap.target&&(n.downTargets[0]=t,n.downTimes[0]=(new Date).getTime(),l.fire({interaction:n,event:e,eventTarget:t,pointer:e,type:"tap"}))}var i=e("./scope"),o=e("./utils/events"),s=e("./utils/browser"),a=e("./utils/interactionFinder"),l=e("./pointerEvents/base"),c=e("./utils/window"),p=c.window,u=Object.prototype.toString;if(p.Array.isArray||(p.Array.isArray=function(e){return"[object Array]"===u.call(e)}),String.prototype.trim||(String.prototype.trim=function(){return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")}),s.isIE8){var d=function(e){for(var t=i.interactions,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var o;if(n){if(r>=t.length)break;o=t[r++]}else{if(r=t.next(),r.done)break;o=r.value}var s=o;s.interacting()&&s.target.checkAndPreventDefault(e)}},f=function(e,t){var n=e.doc,i=(e.win,0===t.indexOf("listen")?o.add:o.remove);i(n,"selectstart",d),l&&i(n,"dblclick",r)};i.signals.on("add-document",f),i.signals.on("remove-document",f)}t.exports=null},{"./pointerEvents/base":31,"./scope":34,"./utils/browser":37,"./utils/events":40,"./utils/interactionFinder":45,"./utils/window":52}],24:[function(e,t,n){"use strict";function r(e,t,n){return e&&e.enabled&&(t||!e.endOnly)&&(!n||e.endOnly)}var i=e("../InteractEvent"),o=e("../Interaction"),s=e("../utils/extend"),a={names:[],setOffsets:function(e){var t=e.interaction,n=e.pageCoords,r=t.target,i=t.element,o=t.startOffset,s=r.getRect(i);s?(o.left=n.x-s.left,o.top=n.y-s.top,o.right=s.right-n.x,o.bottom=s.bottom-n.y,"width"in s||(s.width=s.right-s.left),"height"in s||(s.height=s.bottom-s.top)):o.left=o.top=o.right=o.bottom=0,e.rect=s,e.interactable=r,e.element=i;for(var l=0;l=p.length)break;f=p[d++]}else{if(d=p.next(),d.done)break;f=d.value}var v=f,g=a[v],h=t.target.options[t.prepared.name][v];r(h,i,o)&&(e.status=e.status=n[v],e.options=h,e.offset=e.interaction.modifierOffsets[v],g.set(e),e.status.locked&&(l.x+=e.status.dx,l.y+=e.status.dy,c.dx+=e.status.dx,c.dy+=e.status.dy,c.locked=!0))}return c.shouldMove=!e.status||!c.locked||e.status.changed,c},resetStatuses:function(e){for(var t=a.names,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var i;if(n){if(r>=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i,s=e[o]||{};s.dx=s.dy=0,s.modifiedX=s.modifiedY=NaN,s.locked=!1,s.changed=!0,e[o]=s}return e},start:function(e,t){var n=e.interaction,r={interaction:n,pageCoords:("action-resume"===t?n.curCoords:n.startCoords).page,startOffset:n.startOffset,statuses:n.modifierStatuses,preEnd:!1,requireEndOnly:!1};a.setOffsets(r),a.resetStatuses(r.statuses),r.pageCoords=s({},n.startCoords.page),n.modifierResult=a.setAll(r)}};o.signals.on("new",function(e){e.startOffset={left:0,right:0,top:0,bottom:0},e.modifierOffsets={},e.modifierStatuses=a.resetStatuses({}),e.modifierResult=null}),o.signals.on("action-start",a.start),o.signals.on("action-resume",a.start),o.signals.on("before-action-move",function(e){var t=e.interaction,n=e.preEnd,r=e.interactingBeforeMove,i=a.setAll({interaction:t,preEnd:n,pageCoords:t.curCoords.page,statuses:t.modifierStatuses,requireEndOnly:!1});!i.shouldMove&&r&&(t._dontFireMove=!0),t.modifierResult=i}),o.signals.on("action-end",function(e){for(var t=e.interaction,n=e.event,i=0;i=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}var m=h,y=m.x,x=m.y;l.push({x:s.left-i.width*y+u.x,y:s.top-i.height*x+u.y})}else l.push(u);return l},set:function(e){var t=e.interaction,n=e.pageCoords,r=e.status,i=e.options,s=e.offset,a=[],l=void 0,c=void 0,p=void 0;if(r.useStatusXY)c={x:r.x,y:r.y};else{var u=o.getOriginXY(t.target,t.element,t.prepared.name);c=o.extend({},n),c.x-=u.x,c.y-=u.y}r.realX=c.x,r.realY=c.y;for(var d=i.targets?i.targets.length:0,f=s,v=Array.isArray(f),g=0,f=v?f:f[Symbol.iterator]();;){var h;if(v){if(g>=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}for(var m=h,y=m.x,x=m.y,b=c.x-y,w=c.y-x,E=i.targets,S=Array.isArray(E),T=0,E=S?E:E[Symbol.iterator]();;){var C;if(S){if(T>=E.length)break;C=E[T++]}else{if(T=E.next(),T.done)break;C=T.value}var A=C;l=o.is.function(A)?A(b,w,t):A,l&&a.push({x:o.is.number(l.x)?l.x+y:b,y:o.is.number(l.y)?l.y+x:w,range:o.is.number(l.range)?l.range:i.range})}}var D={target:null,inRange:!1,distance:0,range:0,dx:0,dy:0};for(p=0,d=a.length;p=p.length)break;f=p[d++]}else{if(d=p.next(),d.done)break;f=d.value}var v=f,g=void 0;g=a.is.function(v)?v(l,c,t):v,g&&("width"in g&&"height"in g&&(g.x=g.width,g.y=g.height),e.options.targets.push(g))}i.set(e)},modifyCoords:function(e){var t=e.options;e.options=a.extend({},t), -e.options.enabled=t.enabled,e.options.relativePoints=[null],i.modifyCoords(e)}};r.snapSize=l,r.names.push("snapSize"),o.perAction.snapSize=l.defaults,s.defaults.snapSize=l.defaults,t.exports=l},{"../actions/resize":10,"../defaultOptions":18,"../utils/":44,"./index":24,"./snap":28}],30:[function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=e("../utils/pointerUtils");t.exports=function(){function e(t,n,o,s,a){if(r(this,e),i.pointerExtend(this,o),o!==n&&i.pointerExtend(this,n),this.interaction=a,this.timeStamp=(new Date).getTime(),this.originalEvent=o,this.type=t,this.pointerId=i.getPointerId(n),this.pointerType=i.getPointerType(n,a),this.target=s,this.currentTarget=null,"tap"===t){var l=a.getPointerIndex(n);this.dt=this.timeStamp-a.downTimes[l];var c=this.timeStamp-a.tapTime;this.double=!!(a.prevTap&&"doubletap"!==a.prevTap.type&&a.prevTap.target===this.target&&c<500)}else"doubletap"===t&&(this.dt=n.timeStamp-a.tapTime)}return e.prototype.subtractOrigin=function(e){var t=e.x,n=e.y;return this.pageX-=t,this.pageY-=n,this.clientX-=t,this.clientY-=n,this},e.prototype.addOrigin=function(e){var t=e.x,n=e.y;return this.pageX+=t,this.pageY+=n,this.clientX+=t,this.clientY+=n,this},e.prototype.preventDefault=function(){this.originalEvent.preventDefault()},e.prototype.stopPropagation=function(){this.propagationStopped=!0},e.prototype.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},e}()},{"../utils/pointerUtils":49}],31:[function(e,t,n){"use strict";function r(e){for(var t=e.interaction,n=e.pointer,s=e.event,l=e.eventTarget,c=e.type,u=void 0===c?e.pointerEvent.type:c,d=e.targets,f=void 0===d?i(e):d,v=e.pointerEvent,g=void 0===v?new o(u,n,s,l,t):v,h={interaction:t,pointer:n,event:s,eventTarget:l,targets:f,type:u,pointerEvent:g},m=0;m=u.length)break;g=u[v++]}else{if(v=u.next(),v.done)break;g=v.value}var h=g;c.element=h,p.fire("collect-targets",c)}return"hold"===o&&(c.targets=d(c.targets,function(e){return e.eventable.options.holdDuration===t.holdTimers[s].duration})),c.targets}var o=e("./PointerEvent"),s=e("../Interaction"),a=e("../utils"),l=e("../utils/browser"),c=e("../defaultOptions"),p=e("../utils/Signals").new(),u=e("../utils/arr"),d=u.filter,f=["down","up","cancel"],v=["down","up","cancel"],g={PointerEvent:o,fire:r,collectEventTargets:i,signals:p,defaults:{holdDuration:600,ignoreFrom:null,allowFrom:null,origin:{x:0,y:0}},types:["down","move","up","cancel","tap","doubletap","hold"]};s.signals.on("update-pointer-down",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers[n]={duration:1/0,timeout:null}}),s.signals.on("remove-pointer",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers.splice(n,1)}),s.signals.on("move",function(e){var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,s=e.duplicateMove,a=t.getPointerIndex(n);s||t.pointerIsDown&&!t.pointerWasMoved||(t.pointerIsDown&&clearTimeout(t.holdTimers[a].timeout),r({interaction:t,pointer:n,event:i,eventTarget:o,type:"move"}))}),s.signals.on("down",function(e){for(var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,s=e.pointerIndex,c=l.isIE8?a.extend({},i):i,u=t.holdTimers[s],d=a.getPath(o),f={interaction:t,pointer:n,event:i,eventTarget:o,type:"hold",targets:[],path:d,element:null},v=d,g=Array.isArray(v),h=0,v=g?v:v[Symbol.iterator]();;){var m;if(g){if(h>=v.length)break;m=v[h++]}else{if(h=v.next(),h.done)break;m=h.value}var y=m;f.element=y,p.fire("collect-targets",f)}if(f.targets.length){for(var x=1/0,b=0;b=0&&(p.selectors[u]!==e||p.contexts[u]!==t);u--);-1===u&&(u=p.selectors.length,p.selectors.push(e),p.contexts.push(t),p.listeners.push([])),p.listeners[u].push([i,!!s.capture,s.passive])}function s(e,t,n,r,o){var s=f(o),c=O[n],p=!1,u=void 0;if(c)for(u=c.selectors.length-1;u>=0;u--)if(c.selectors[u]===e&&c.contexts[u]===t){for(var d=c.listeners[u],v=d.length-1;v>=0;v--){var g=d[v],h=g[0],m=g[1],y=g[2];if(h===r&&m===!!s.capture&&y===s.passive){d.splice(v,1),d.length||(c.selectors.splice(u,1),c.contexts.splice(u,1),c.listeners.splice(u,1),i(t,n,a),i(t,n,l,!0),c.selectors.length||(O[n]=null)),p=!0;break}}if(p)break}}function a(e,t){var n=f(t),r={},i=O[e.type],o=g.getActualElement(e.path?e.path[0]:e.target),s=o;for(h(r,e),r.originalEvent=e,r.preventDefault=p;v.element(s);){for(var a=0;a=l.length)break;u=l[p++]}else{if(p=l.next(),p.done)break;u=p.value}var d=u,f=s[d](a);if(f)return f}},simulationResume:function(e){var t=e.mouseEvent,n=e.eventType,o=e.eventTarget;if(!/down|start/i.test(n))return null;for(var s=r.interactions,a=Array.isArray(s),l=0,s=a?s:s[Symbol.iterator]();;){var c;if(a){if(l>=s.length)break;c=s[l++]}else{if(l=s.next(),l.done)break;c=l.value}var p=c,u=o;if(p.simulation&&p.simulation.allowResume&&p.mouse===t)for(;u;){if(u===p.element)return p;u=i.parentNode(u)}}return null},mouse:function(e){var t=e.pointerId,n=e.mouseEvent,s=e.eventType;if(!n&&(o.supportsTouch||o.supportsPointerEvent))return null;for(var a=void 0,l=r.interactions,c=Array.isArray(l),p=0,l=c?l:l[Symbol.iterator]();;){var u;if(c){if(p>=l.length)break;u=l[p++]}else{if(p=l.next(),p.done)break;u=p.value}var d=u;if(d.mouse){if(d.simulation&&!i.contains(d.pointerIds,t))continue;if(d.interacting())return d;a||(a=d)}}if(a)return a;for(var f=r.interactions,v=Array.isArray(f),g=0,f=v?f:f[Symbol.iterator]();;){var h;if(v){if(g>=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}var m=h;if(m.mouse&&(!/down/.test(s)||!m.simulation))return m}return null},hasPointer:function(e){for(var t=e.pointerId,n=r.interactions,o=Array.isArray(n),s=0,n=o?n:n[Symbol.iterator]();;){var a;if(o){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var l=a;if(i.contains(l.pointerIds,t))return l}},idle:function(e){for(var t=e.mouseEvent,n=r.interactions,i=Array.isArray(n),o=0,n=i?n:n[Symbol.iterator]();;){var s;if(i){if(o>=n.length)break;s=n[o++]}else{if(o=n.next(),o.done)break;s=o.value}var a=s;if(1===a.pointerIds.length){var l=a.target;if(l&&!l.options.gesture.enabled)continue}else if(a.pointerIds.length>=2)continue;if(!a.interacting()&&t===a.mouse)return a}return null}};t.exports=s},{"../scope":34,"./browser":37,"./index":44}],46:[function(e,t,n){"use strict";var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},i=e("./window"),o=e("./isWindow"),s={array:function(){},window:function(e){return e===i.window||o(e)},docFrag:function(e){return s.object(e)&&11===e.nodeType},object:function(e){return!!e&&"object"===(void 0===e?"undefined":r(e))},function:function(e){return"function"==typeof e},number:function(e){return"number"==typeof e},bool:function(e){return"boolean"==typeof e},string:function(e){return"string"==typeof e},element:function(e){if(!e||"object"!==(void 0===e?"undefined":r(e)))return!1;var t=i.getWindow(e)||i.window;return/object|function/.test(r(t.Element))?e instanceof t.Element:1===e.nodeType&&"string"==typeof e.nodeName}};s.array=function(e){return s.object(e)&&void 0!==e.length&&s.function(e.splice)},t.exports=s},{"./isWindow":47,"./window":52}],47:[function(e,t,n){"use strict";t.exports=function(e){return!(!e||!e.Window)&&e instanceof e.Window}},{}],48:[function(e,t,n){"use strict";function r(e,n){for(var r in n){var i=t.exports.prefixedPropREs,o=!1;for(var s in i)if(0===r.indexOf(s)&&i[s].test(r)){o=!0;break}o||"function"==typeof n[r]||(e[r]=n[r])}return e}r.prefixedPropREs={webkit:/(Movement[XY]|Radius[XY]|RotationAngle|Force)$/},t.exports=r},{}],49:[function(e,t,n){"use strict";var r=e("./hypot"),i=e("./browser"),o=e("./domObjects"),s=e("./domUtils"),a=e("./is"),l=e("./pointerExtend"),c={copyCoords:function(e,t){e.page=e.page||{},e.page.x=t.page.x,e.page.y=t.page.y,e.client=e.client||{},e.client.x=t.client.x,e.client.y=t.client.y,e.timeStamp=t.timeStamp},setCoordDeltas:function(e,t,n){e.page.x=n.page.x-t.page.x,e.page.y=n.page.y-t.page.y,e.client.x=n.client.x-t.client.x,e.client.y=n.client.y-t.client.y,e.timeStamp=n.timeStamp-t.timeStamp;var i=Math.max(e.timeStamp/1e3,.001);e.page.speed=r(e.page.x,e.page.y)/i,e.page.vx=e.page.x/i,e.page.vy=e.page.y/i,e.client.speed=r(e.client.x,e.page.y)/i,e.client.vx=e.client.x/i,e.client.vy=e.client.y/i},isNativePointer:function(e){return e instanceof o.Event||e instanceof o.Touch},getXY:function(e,t,n){return n=n||{},e=e||"page",n.x=t[e+"X"],n.y=t[e+"Y"],n},getPageXY:function(e,t){return t=t||{},i.isOperaMobile&&c.isNativePointer(e)?(c.getXY("screen",e,t),t.x+=window.scrollX,t.y+=window.scrollY):c.getXY("page",e,t),t},getClientXY:function(e,t){return t=t||{},i.isOperaMobile&&c.isNativePointer(e)?c.getXY("screen",e,t):c.getXY("client",e,t),t},getPointerId:function(e){return a.number(e.pointerId)?e.pointerId:e.identifier},setCoords:function(e,t,n){var r=t.length>1?c.pointerAverage(t):t[0],i={};c.getPageXY(r,i),e.page.x=i.x,e.page.y=i.y,c.getClientXY(r,i),e.client.x=i.x,e.client.y=i.y,e.timeStamp=a.number(n)?n:(new Date).getTime()},pointerExtend:l,getTouchPair:function(e){var t=[];return a.array(e)?(t[0]=e[0],t[1]=e[1]):"touchend"===e.type?1===e.touches.length?(t[0]=e.touches[0],t[1]=e.changedTouches[0]):0===e.touches.length&&(t[0]=e.changedTouches[0],t[1]=e.changedTouches[1]):(t[0]=e.touches[0],t[1]=e.touches[1]),t},pointerAverage:function(e){for(var t={pageX:0,pageY:0,clientX:0,clientY:0,screenX:0,screenY:0},n=e,r=Array.isArray(n),i=0,n=r?n:n[Symbol.iterator]();;){var o;if(r){if(i>=n.length)break;o=n[i++]}else{if(i=n.next(),i.done)break;o=i.value}var s=o;for(var a in t)t[a]+=s[a]}for(var l in t)t[l]/=e.length;return t},touchBBox:function(e){if(e.length||e.touches&&e.touches.length>1){var t=c.getTouchPair(e),n=Math.min(t[0].pageX,t[1].pageX),r=Math.min(t[0].pageY,t[1].pageY);return{x:n,y:r,left:n,top:r,width:Math.max(t[0].pageX,t[1].pageX)-n,height:Math.max(t[0].pageY,t[1].pageY)-r}}},touchDistance:function(e,t){var n=t+"X",i=t+"Y",o=c.getTouchPair(e),s=o[0][n]-o[1][n],a=o[0][i]-o[1][i];return r(s,a)},touchAngle:function(e,t,n){var r=n+"X",i=n+"Y",o=c.getTouchPair(e),s=o[1][r]-o[0][r],a=o[1][i]-o[0][i];return 180*Math.atan2(a,s)/Math.PI},getPointerType:function(e,t){return t.mouse?"mouse":i.supportsPointerEvent?a.string(e.pointerType)?e.pointerType:[void 0,void 0,"touch","pen","mouse"][e.pointerType]:"touch"},getEventTargets:function(e){return[s.getActualElement(e.path?e.path[0]:e.target),s.getActualElement(e.currentTarget)]}};t.exports=c},{"./browser":37,"./domObjects":38,"./domUtils":39,"./hypot":43,"./is":46,"./pointerExtend":48}],50:[function(e,t,n){"use strict";for(var r=e("./window"),i=r.window,o=["ms","moz","webkit","o"],s=0,a=void 0,l=void 0,c=0;c6&&void 0!==arguments[6]&&arguments[6];r(this,e);var f=t.target,v=(f&&f.options||s).deltaSource,g=o(f,p,l),h="start"===c,m="end"===c,y=h?t.startCoords:t.curCoords,x=t.prevEvent;p=p||t.element;var b=i({},y.page),w=i({},y.client);b.x-=g.x,b.y-=g.y,w.x-=g.x,w.y-=g.y,this.ctrlKey=n.ctrlKey,this.altKey=n.altKey,this.shiftKey=n.shiftKey,this.metaKey=n.metaKey,this.button=n.button,this.buttons=n.buttons,this.target=p,this.currentTarget=p,this.relatedTarget=u||null,this.preEnd=d,this.type=l+(c||""),this.interaction=t,this.interactable=f,this.t0=h?t.downTimes[t.downTimes.length-1]:x.t0;var E={interaction:t,event:n,action:l,phase:c,element:p,related:u,page:b,client:w,coords:y,starting:h,ending:m,deltaSource:v,iEvent:this};a.fire("set-xy",E),m?(this.pageX=x.pageX,this.pageY=x.pageY,this.clientX=x.clientX,this.clientY=x.clientY):(this.pageX=b.x,this.pageY=b.y,this.clientX=w.x,this.clientY=w.y),this.x0=t.startCoords.page.x-g.x,this.y0=t.startCoords.page.y-g.y,this.clientX0=t.startCoords.client.x-g.x,this.clientY0=t.startCoords.client.y-g.y,a.fire("set-delta",E),this.timeStamp=y.timeStamp,this.dt=t.pointerDelta.timeStamp,this.duration=this.timeStamp-this.t0,this.speed=t.pointerDelta[v].speed,this.velocityX=t.pointerDelta[v].vx,this.velocityY=t.pointerDelta[v].vy,this.swipe=m||"inertiastart"===c?this.getSwipe():null,a.fire("new",E)}return e.prototype.getSwipe=function(){var e=this.interaction;if(e.prevEvent.speed<600||this.timeStamp-e.prevEvent.timeStamp>150)return null;var t=180*Math.atan2(e.prevEvent.velocityY,e.prevEvent.velocityX)/Math.PI;t<0&&(t+=360);var n=112.5<=t&&t<247.5,r=202.5<=t&&t<337.5,i=!n&&(292.5<=t||t<67.5);return{up:r,down:!r&&22.5<=t&&t<157.5,left:n,right:i,angle:t,speed:e.prevEvent.speed,velocity:{x:e.prevEvent.velocityX,y:e.prevEvent.velocityY}}},e.prototype.preventDefault=function(){},e.prototype.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},e.prototype.stopPropagation=function(){this.propagationStopped=!0},e}();a.on("set-delta",function(e){var t=e.iEvent,n=e.interaction,r=e.starting,i=e.deltaSource,o=r?t:n.prevEvent;"client"===i?(t.dx=t.clientX-o.clientX,t.dy=t.clientY-o.clientY):(t.dx=t.pageX-o.pageX,t.dy=t.pageY-o.pageY)}),l.signals=a,t.exports=l},{"./defaultOptions":18,"./utils/Signals":35,"./utils/extend":41,"./utils/getOriginXY":42}],4:[function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=e("./utils/is"),o=e("./utils/events"),s=e("./utils/extend"),a=e("./actions/base"),l=e("./scope"),c=e("./Eventable"),p=e("./defaultOptions"),u=e("./utils/Signals").new(),d=e("./utils/domUtils"),f=d.getElementRect,v=d.nodeContains,g=d.trySelector,h=e("./utils/window"),m=h.getWindow,y=e("./utils/arr"),x=y.indexOf,b=y.contains,w=e("./utils/browser"),E=w.wheelEvent;l.interactables=[];var S=function(){function e(t,n){r(this,e),n=n||{},this.target=t,this.events=new c,this._context=n.context||l.document,this._win=m(g(t)?this._context:t),this._doc=this._win.document,u.fire("new",{target:t,options:n,interactable:this,win:this._win}),l.addDocument(this._doc,this._win),l.interactables.push(this),this.set(n)}return e.prototype.setOnEvents=function(e,t){var n="on"+e;return i.function(t.onstart)&&(this.events[n+"start"]=t.onstart),i.function(t.onmove)&&(this.events[n+"move"]=t.onmove),i.function(t.onend)&&(this.events[n+"end"]=t.onend),i.function(t.oninertiastart)&&(this.events[n+"inertiastart"]=t.oninertiastart),this},e.prototype.setPerAction=function(e,t){for(var n in t)n in p[e]&&(i.object(t[n])?(this.options[e][n]=s(this.options[e][n]||{},t[n]),i.object(p.perAction[n])&&"enabled"in p.perAction[n]&&(this.options[e][n].enabled=!1!==t[n].enabled)):i.bool(t[n])&&i.object(p.perAction[n])?this.options[e][n].enabled=t[n]:void 0!==t[n]&&(this.options[e][n]=t[n]))},e.prototype.getRect=function(e){return e=e||this.target,i.string(this.target)&&!i.element(e)&&(e=this._context.querySelector(this.target)),f(e)},e.prototype.rectChecker=function(e){return i.function(e)?(this.getRect=e,this):null===e?(delete this.options.getRect,this):this.getRect},e.prototype._backCompatOption=function(e,t){if(g(t)||i.object(t)){this.options[e]=t;for(var n=a.names,r=Array.isArray(n),o=0,n=r?n:n[Symbol.iterator]();;){var s;if(r){if(o>=n.length)break;s=n[o++]}else{if(o=n.next(),o.done)break;s=o.value}var l=s;this.options[l][e]=t}return this}return this.options[e]},e.prototype.origin=function(e){return this._backCompatOption("origin",e)},e.prototype.deltaSource=function(e){return"page"===e||"client"===e?(this.options.deltaSource=e,this):this.options.deltaSource},e.prototype.context=function(){return this._context},e.prototype.inContext=function(e){return this._context===e.ownerDocument||v(this._context,e)},e.prototype.fire=function(e){return this.events.fire(e),this},e.prototype._onOffMultiple=function(e,t,n,r){if(i.string(t)&&-1!==t.search(" ")&&(t=t.trim().split(/ +/)),i.array(t)){for(var o=0;o=l.length)break;f=l[d++]}else{if(d=l.next(),d.done)break;f=d.value}var v=f;this.options[v]=p.base[v],v in t&&this[v](t[v])}return u.fire("set",{options:t,interactable:this}),this},e.prototype.unset=function(){if(o.remove(this.target,"all"),i.string(this.target))for(var e in o.delegatedEvents){var t=o.delegatedEvents[e];t.selectors[0]===this.target&&t.contexts[0]===this._context&&(t.selectors.splice(0,1),t.contexts.splice(0,1),t.listeners.splice(0,1),t.selectors.length||(t[e]=null)),o.remove(this._context,e,o.delegateListener),o.remove(this._context,e,o.delegateUseCapture,!0)}else o.remove(this,"all");u.fire("unset",{interactable:this}),l.interactables.splice(x(l.interactables,this),1);for(var n=l.interactions||[],r=Array.isArray(n),s=0,n=r?n:n[Symbol.iterator]();;){var a;if(r){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var c=a;c.target===this&&c.interacting()&&c.stop()}return l.interact},e}();l.interactables.indexOfElement=function(e,t){t=t||l.document;for(var n=0;n=x.length)break;E=x[w++]}else{if(w=x.next(),w.done)break;E=w.value}var S=E,T=S[0],C=S[1];C._updateEventTargets(i,o),C[e](T,t,i,o)}}}function o(e){for(var t=0;te.pointerMoveTolerance);var a={pointer:t,pointerIndex:this.getPointerIndex(t),event:n,eventTarget:r,dx:o,dy:s,duplicate:i,interaction:this,interactingBeforeMove:this.interacting()};i||l.setCoordDeltas(this.pointerDelta,this.prevCoords,this.curCoords),f.fire("move",a),i||(this.interacting()&&this.doMove(a),this.pointerWasMoved&&l.copyCoords(this.prevCoords,this.curCoords))},e.prototype.doMove=function(e){e=l.extend({pointer:this.pointers[0],event:this.prevEvent,eventTarget:this._eventTarget,interaction:this},e||{}),f.fire("before-action-move",e),this._dontFireMove||f.fire("action-move",e),this._dontFireMove=!1},e.prototype.pointerUp=function(e,t,n,r){var i=this.getPointerIndex(e);f.fire(/cancel$/i.test(t.type)?"cancel":"up",{pointer:e,pointerIndex:i,event:t,eventTarget:n,curEventTarget:r,interaction:this}),this.simulation||this.end(t),this.pointerIsDown=!1,this.removePointer(e,t)},e.prototype.end=function(e){e=e||this.prevEvent,this.interacting()&&f.fire("action-end",{event:e,interaction:this}),this.stop()},e.prototype.currentAction=function(){return this._interacting?this.prepared.name:null},e.prototype.interacting=function(){return this._interacting},e.prototype.stop=function(){f.fire("stop",{interaction:this}),this._interacting&&(f.fire("stop-active",{interaction:this}),f.fire("stop-"+this.prepared.name,{interaction:this})),this.target=this.element=null,this._interacting=!1,this.prepared.name=this.prevEvent=null},e.prototype.getPointerIndex=function(e){return"mouse"===this.pointerType||"pen"===this.pointerType?0:l.indexOf(this.pointerIds,l.getPointerId(e))},e.prototype.updatePointer=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:t&&/(down|start)$/i.test(t.type),r=l.getPointerId(e),i=this.getPointerIndex(e);return-1===i&&(i=this.pointerIds.length,this.pointerIds[i]=r),n&&f.fire("update-pointer-down",{pointer:e,event:t,down:n,pointerId:r,pointerIndex:i,interaction:this}),this.pointers[i]=e,i},e.prototype.removePointer=function(e,t){var n=this.getPointerIndex(e);-1!==n&&(f.fire("remove-pointer",{pointer:e,event:t,pointerIndex:n,interaction:this}),this.pointers.splice(n,1),this.pointerIds.splice(n,1),this.downTargets.splice(n,1),this.downTimes.splice(n,1))},e.prototype._updateEventTargets=function(e,t){this._eventTarget=e,this._curEventTarget=t},e}(),y=0,x=g.length;y=i.length)break;a=i[s++]}else{if(s=i.next(),s.done)break;a=s.value}var l=a;if(l.options.drop.enabled){var c=l.options.drop.accept;if(!(p.is.element(c)&&c!==t||p.is.string(c)&&!p.matchesSelector(t,c)))for(var d=p.is.string(l.target)?l._context.querySelectorAll(l.target):[l.target],f=0;fo.left&&c.xo.top&&c.y=o.left&&v<=o.right&&g>=o.top&&g<=o.bottom}if(f&&p.is.number(a)){s=Math.max(0,Math.min(o.right,f.right)-Math.max(o.left,f.left))*Math.max(0,Math.min(o.bottom,f.bottom)-Math.max(o.top,f.top))/(f.width*f.height)>=a}return this.options.drop.checker&&(s=this.options.drop.checker(e,t,s,this,i,n,r)),s},v.signals.on("unset",function(e){e.interactable.dropzone(!1)}),v.settingsMethods.push("dropChecker"),g.signals.on("new",function(e){e.dropTarget=null,e.dropElement=null,e.prevDropTarget=null,e.prevDropElement=null,e.dropEvents=null,e.activeDrops={dropzones:[],elements:[],rects:[]}}),g.signals.on("stop",function(e){var t=e.interaction;t.dropTarget=t.dropElement=t.prevDropTarget=t.prevDropElement=null}),d.dynamicDrop=function(e){return p.is.bool(e)?(y=e,d):y},p.merge(v.eventTypes,["dragenter","dragleave","dropactivate","dropdeactivate","dropmove","drop"]),c.methodDict.drop="dropzone",h.drop=m.defaults,t.exports=m},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../interact":21,"../scope":34,"../utils":44,"./base":6}],9:[function(e,t,n){"use strict";var r=e("./base"),i=e("../utils"),o=e("../InteractEvent"),s=e("../Interactable"),a=e("../Interaction"),l=e("../defaultOptions"),c={defaults:{enabled:!1,origin:null,restrict:null},checker:function(e,t,n,r,i){return i.pointerIds.length>=2?{name:"gesture"}:null},getCursor:function(){return""}};o.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;"gesturestart"===t.type&&(t.ds=0,n.gesture.startDistance=n.gesture.prevDistance=t.distance,n.gesture.startAngle=n.gesture.prevAngle=t.angle,n.gesture.scale=1)}),o.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;"gesturemove"===t.type&&(t.ds=t.scale-n.gesture.scale,n.target.fire(t),n.gesture.prevAngle=t.angle,n.gesture.prevDistance=t.distance,t.scale===1/0||null===t.scale||void 0===t.scale||isNaN(t.scale)||(n.gesture.scale=t.scale))}),s.prototype.gesturable=function(e){return i.is.object(e)?(this.options.gesture.enabled=!1!==e.enabled,this.setPerAction("gesture",e),this.setOnEvents("gesture",e),this):i.is.bool(e)?(this.options.gesture.enabled=e,e||(this.ongesturestart=this.ongesturestart=this.ongestureend=null),this):this.options.gesture},o.signals.on("set-delta",function(e){var t=e.interaction,n=e.iEvent,r=e.action,s=e.event,a=e.starting,l=e.ending,c=e.deltaSource;if("gesture"===r){var p=t.pointers;n.touches=[p[0],p[1]],a?(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=1,n.ds=0,n.angle=i.touchAngle(p,void 0,c),n.da=0):l||s instanceof o?(n.distance=t.prevEvent.distance,n.box=t.prevEvent.box,n.scale=t.prevEvent.scale,n.ds=n.scale-1,n.angle=t.prevEvent.angle,n.da=n.angle-t.gesture.startAngle):(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=n.distance/t.gesture.startDistance,n.angle=i.touchAngle(p,t.gesture.prevAngle,c),n.ds=n.scale-t.gesture.prevScale,n.da=n.angle-t.gesture.prevAngle)}}),a.signals.on("new",function(e){e.gesture={start:{x:0,y:0},startDistance:0,prevDistance:0,distance:0,scale:1,startAngle:0,prevAngle:0}}),r.gesture=c,r.names.push("gesture"),i.merge(s.eventTypes,["gesturestart","gesturemove","gestureend"]),r.methodDict.gesture="gesturable",l.gesture=c.defaults,t.exports=c},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"./base":6}],10:[function(e,t,n){"use strict";function r(e,t,n,r,i,s,a){if(!t)return!1;if(!0===t){var l=o.is.number(s.width)?s.width:s.right-s.left,c=o.is.number(s.height)?s.height:s.bottom-s.top;if(l<0&&("left"===e?e="right":"right"===e&&(e="left")),c<0&&("top"===e?e="bottom":"bottom"===e&&(e="top")),"left"===e)return n.x<(l>=0?s.left:s.right)+a;if("top"===e)return n.y<(c>=0?s.top:s.bottom)+a;if("right"===e)return n.x>(l>=0?s.right:s.left)-a;if("bottom"===e)return n.y>(c>=0?s.bottom:s.top)-a}return!!o.is.element(r)&&(o.is.element(t)?t===r:o.matchesUpTo(r,t,i))}var i=e("./base"),o=e("../utils"),s=e("../utils/browser"),a=e("../InteractEvent"),l=e("../Interactable"),c=e("../Interaction"),p=e("../defaultOptions"),u=s.supportsTouch||s.supportsPointerEvent?20:10,d={defaults:{enabled:!1,mouseButtons:null,origin:null,snap:null,restrict:null,inertia:null,autoScroll:null,square:!1,preserveAspectRatio:!1,axis:"xy",margin:NaN,edges:null,invert:"none"},checker:function(e,t,n,i,s,a){if(!a)return null;var l=o.extend({},s.curCoords.page),c=n.options;if(c.resize.enabled){var p=c.resize,d={left:!1,right:!1,top:!1,bottom:!1};if(o.is.object(p.edges)){for(var f in d)d[f]=r(f,p.edges[f],l,s._eventTarget,i,a,p.margin||u);if(d.left=d.left&&!d.right,d.top=d.top&&!d.bottom,d.left||d.right||d.top||d.bottom)return{name:"resize",edges:d}}else{var v="y"!==c.resize.axis&&l.x>a.right-u,g="x"!==c.resize.axis&&l.y>a.bottom-u;if(v||g)return{name:"resize",axes:(v?"x":"")+(g?"y":"")}}}return null},cursors:s.isIe9OrOlder?{x:"e-resize",y:"s-resize",xy:"se-resize",top:"n-resize",left:"w-resize",bottom:"s-resize",right:"e-resize",topleft:"se-resize",bottomright:"se-resize",topright:"ne-resize",bottomleft:"ne-resize"}:{x:"ew-resize",y:"ns-resize",xy:"nwse-resize",top:"ns-resize",left:"ew-resize",bottom:"ns-resize",right:"ew-resize",topleft:"nwse-resize",bottomright:"nwse-resize",topright:"nesw-resize",bottomleft:"nesw-resize"},getCursor:function(e){if(e.axis)return d.cursors[e.name+e.axis];if(e.edges){for(var t="",n=["top","bottom","left","right"],r=0;r<4;r++)e.edges[n[r]]&&(t+=n[r]);return d.cursors[t]}}};a.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;if("resizestart"===t.type&&n.prepared.edges){var r=n.target.getRect(n.element),i=n.target.options.resize;if(i.square||i.preserveAspectRatio){var s=o.extend({},n.prepared.edges);s.top=s.top||s.left&&!s.bottom,s.left=s.left||s.top&&!s.right,s.bottom=s.bottom||s.right&&!s.top,s.right=s.right||s.bottom&&!s.left,n.prepared._linkedEdges=s}else n.prepared._linkedEdges=null;i.preserveAspectRatio&&(n.resizeStartAspectRatio=r.width/r.height),n.resizeRects={start:r,current:o.extend({},r),inverted:o.extend({},r),previous:o.extend({},r),delta:{left:0,right:0,width:0,top:0,bottom:0,height:0}},t.rect=n.resizeRects.inverted,t.deltaRect=n.resizeRects.delta}}),a.signals.on("new",function(e){var t=e.iEvent,n=e.phase,r=e.interaction;if("move"===n&&r.prepared.edges){var i=r.target.options.resize,s=i.invert,a="reposition"===s||"negate"===s,l=r.prepared.edges,c=r.resizeRects.start,p=r.resizeRects.current,u=r.resizeRects.inverted,d=r.resizeRects.delta,f=o.extend(r.resizeRects.previous,u),v=l,g=t.dx,h=t.dy;if(i.preserveAspectRatio||i.square){var m=i.preserveAspectRatio?r.resizeStartAspectRatio:1;l=r.prepared._linkedEdges,v.left&&v.bottom||v.right&&v.top?h=-g/m:v.left||v.right?h=g/m:(v.top||v.bottom)&&(g=h*m)}if(l.top&&(p.top+=h),l.bottom&&(p.bottom+=h),l.left&&(p.left+=g),l.right&&(p.right+=g),a){if(o.extend(u,p),"reposition"===s){var y=void 0;u.top>u.bottom&&(y=u.top,u.top=u.bottom,u.bottom=y),u.left>u.right&&(y=u.left,u.left=u.right,u.right=y)}}else u.top=Math.min(p.top,c.bottom),u.bottom=Math.max(p.bottom,c.top),u.left=Math.min(p.left,c.right),u.right=Math.max(p.right,c.left);u.width=u.right-u.left,u.height=u.bottom-u.top;for(var x in u)d[x]=u[x]-f[x];t.edges=r.prepared.edges,t.rect=u,t.deltaRect=d}}),l.prototype.resizable=function(e){return o.is.object(e)?(this.options.resize.enabled=!1!==e.enabled,this.setPerAction("resize",e),this.setOnEvents("resize",e),/^x$|^y$|^xy$/.test(e.axis)?this.options.resize.axis=e.axis:null===e.axis&&(this.options.resize.axis=p.resize.axis),o.is.bool(e.preserveAspectRatio)?this.options.resize.preserveAspectRatio=e.preserveAspectRatio:o.is.bool(e.square)&&(this.options.resize.square=e.square),this):o.is.bool(e)?(this.options.resize.enabled=e, +e||(this.onresizestart=this.onresizestart=this.onresizeend=null),this):this.options.resize},c.signals.on("new",function(e){e.resizeAxes="xy"}),a.signals.on("set-delta",function(e){var t=e.interaction,n=e.iEvent;"resize"===e.action&&t.resizeAxes&&(t.target.options.resize.square?("y"===t.resizeAxes?n.dx=n.dy:n.dy=n.dx,n.axes="xy"):(n.axes=t.resizeAxes,"x"===t.resizeAxes?n.dy=0:"y"===t.resizeAxes&&(n.dx=0)))}),i.resize=d,i.names.push("resize"),o.merge(l.eventTypes,["resizestart","resizemove","resizeinertiastart","resizeinertiaresume","resizeend"]),i.methodDict.resize="resizable",p.resize=d.defaults,t.exports=d},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"../utils/browser":37,"./base":6}],11:[function(e,t,n){"use strict";var r=e("./utils/raf"),i=e("./utils/window").getWindow,o=e("./utils/is"),s=e("./utils/domUtils"),a=e("./Interaction"),l=e("./defaultOptions"),c={defaults:{enabled:!1,container:null,margin:60,speed:300},interaction:null,i:null,x:0,y:0,isScrolling:!1,prevTime:0,start:function(e){c.isScrolling=!0,r.cancel(c.i),c.interaction=e,c.prevTime=(new Date).getTime(),c.i=r.request(c.scroll)},stop:function(){c.isScrolling=!1,r.cancel(c.i)},scroll:function(){var e=c.interaction.target.options[c.interaction.prepared.name].autoScroll,t=e.container||i(c.interaction.element),n=(new Date).getTime(),s=(n-c.prevTime)/1e3,a=e.speed*s;a>=1&&(o.window(t)?t.scrollBy(c.x*a,c.y*a):t&&(t.scrollLeft+=c.x*a,t.scrollTop+=c.y*a),c.prevTime=n),c.isScrolling&&(r.cancel(c.i),c.i=r.request(c.scroll))},check:function(e,t){var n=e.options;return n[t].autoScroll&&n[t].autoScroll.enabled},onInteractionMove:function(e){var t=e.interaction,n=e.pointer;if(t.interacting()&&c.check(t.target,t.prepared.name)){if(t.simulation)return void(c.x=c.y=0);var r=void 0,a=void 0,l=void 0,p=void 0,u=t.target.options[t.prepared.name].autoScroll,d=u.container||i(t.element);if(o.window(d))p=n.clientXd.innerWidth-c.margin,l=n.clientY>d.innerHeight-c.margin;else{var f=s.getElementClientRect(d);p=n.clientXf.right-c.margin,l=n.clientY>f.bottom-c.margin}c.x=a?1:p?-1:0,c.y=l?1:r?-1:0,c.isScrolling||(c.margin=u.margin,c.speed=u.speed,c.start(t))}}};a.signals.on("stop-active",function(){c.stop()}),a.signals.on("action-move",c.onInteractionMove),l.perAction.autoScroll=c.defaults,t.exports=c},{"./Interaction":5,"./defaultOptions":18,"./utils/domUtils":39,"./utils/is":46,"./utils/raf":50,"./utils/window":52}],12:[function(e,t,n){"use strict";var r=e("../Interactable"),i=e("../actions/base"),o=e("../utils/is"),s=e("../utils/domUtils");r.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},r.prototype.ignoreFrom=function(e){return this._backCompatOption("ignoreFrom",e)},r.prototype.allowFrom=function(e){return this._backCompatOption("allowFrom",e)},r.prototype.testIgnore=function(e,t,n){return!(!e||!o.element(n))&&(o.string(e)?s.matchesUpTo(n,e,t):!!o.element(e)&&s.nodeContains(e,n))},r.prototype.testAllow=function(e,t,n){return!e||!!o.element(n)&&(o.string(e)?s.matchesUpTo(n,e,t):!!o.element(e)&&s.nodeContains(e,n))},r.prototype.testIgnoreAllow=function(e,t,n){return!this.testIgnore(e.ignoreFrom,t,n)&&this.testAllow(e.allowFrom,t,n)},r.prototype.actionChecker=function(e){return o.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},r.prototype.styleCursor=function(e){return o.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},r.prototype.defaultActionChecker=function(e,t,n,r){for(var o=this.getRect(r),s=null,a=i.names,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var u=p;if((!n.pointerIsDown||!n.mouse||0!=(t.buttons&this.options[u].mouseButtons))&&(s=i[u].checker(e,t,this,r,n,o)))return s}}},{"../Interactable":4,"../actions/base":6,"../utils/domUtils":39,"../utils/is":46}],13:[function(e,t,n){"use strict";function r(e,t,n,r){return g.is.object(e)&&t.testIgnoreAllow(t.options[e.name],n,r)&&t.options[e.name].enabled&&a(t,n,e)?e:null}function i(e,t,n,i,o,s){for(var a=0,l=i.length;a=m.maxInteractions)return!1;if(u.target===e){if((a+=d===n.name|0)>=i)return!1;if(u.element===t&&(l++,d!==n.name||l>=o))return!1}}}return m.maxInteractions>0}}var l=e("../interact"),c=e("../Interactable"),p=e("../Interaction"),u=e("../actions/base"),d=e("../defaultOptions"),f=e("../utils/browser"),v=e("../scope"),g=e("../utils"),h=e("../utils/Signals").new();e("./InteractableMethods");var m={signals:h,withinInteractionLimit:a,maxInteractions:1/0,defaults:{perAction:{manualStart:!1,max:1/0,maxPerElement:1,allowFrom:null,ignoreFrom:null}},setActionDefaults:function(e){g.extend(e.defaults,m.defaults.perAction)}};p.signals.on("down",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;if(!t.interacting()){s(t,o(t,n,r,i))}}),p.signals.on("move",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;if(t.mouse&&!t.pointerIsDown&&!t.interacting()){s(t,o(t,n,r,i))}}),p.signals.on("move",function(e){var t=e.interaction,n=e.event;if(t.pointerIsDown&&!t.interacting()&&t.pointerWasMoved&&t.prepared.name){h.fire("before-start",e);var r=t.target;t.prepared.name&&r&&(r.options[t.prepared.name].manualStart||!a(r,t.element,t.prepared)?t.stop(n):t.start(t.prepared,r,t.element))}}),p.signals.on("stop",function(e){var t=e.interaction,n=t.target;n&&n.options.styleCursor&&(n._doc.documentElement.style.cursor="")}),c.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},c.prototype.actionChecker=function(e){return g.is.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},c.prototype.styleCursor=function(e){return g.is.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},c.prototype.defaultActionChecker=function(e,t,n,r){for(var i=this.getRect(r),o=t.buttons||{0:1,1:4,3:8,4:16}[t.button],s=null,a=u.names,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var d=p;if((!n.pointerIsDown||!n.mouse||0!=(o&this.options[d].mouseButtons))&&(s=u[d].checker(e,t,this,r,n,i)))return s}},l.maxInteractions=function(e){return g.is.number(e)?(m.maxInteractions=e,this):m.maxInteractions},c.settingsMethods.push("styleCursor"),c.settingsMethods.push("actionChecker"),c.settingsMethods.push("ignoreFrom"),c.settingsMethods.push("allowFrom"),d.base.actionChecker=null,d.base.styleCursor=!0,g.extend(d.perAction,m.defaults.perAction),t.exports=m},{"../Interactable":4,"../Interaction":5,"../actions/base":6,"../defaultOptions":18,"../interact":21,"../scope":34,"../utils":44,"../utils/Signals":35,"../utils/browser":37,"./InteractableMethods":12}],14:[function(e,t,n){"use strict";var r=e("./base"),i=e("../Interaction");i.signals.on("new",function(e){e.delayTimer=null}),r.signals.on("prepared",function(e){var t=e.interaction,n=t.prepared.name;if(n){var r=t.target.options[n].delay;r>0&&(t.delayTimer=setTimeout(function(){t.start(t.prepared,t.target,t.element)},r))}}),i.signals.on("move",function(e){var t=e.interaction,n=e.duplicate;t.pointerWasMoved&&!n&&clearTimeout(t.delayTimer)}),r.signals.on("before-start",function(e){var t=e.interaction,n=t.prepared.name;if(n){t.target.options[n].delay>0&&(t.prepared.name=null)}})},{"../Interaction":5,"./base":13}],15:[function(e,t,n){"use strict";function r(e,t){if(!t)return!1;var n=t.options.drag.startAxis;return"xy"===e||"xy"===n||n===e}var i=e("./base"),o=e("../scope"),s=e("../utils/browser"),a=e("../utils/is"),l=e("../utils/domUtils"),c=l.matchesSelector,p=l.parentNode;i.setActionDefaults(e("../actions/drag")),i.signals.on("before-start",function(e){var t=e.interaction,n=e.eventTarget,l=e.dx,u=e.dy;if("drag"===t.prepared.name){var d=Math.abs(l),f=Math.abs(u),v=t.target.options.drag,g=v.startAxis,h=d>f?"x":dl.minSpeed&&g>l.endSpeed,b={interaction:t,pageCoords:v,statuses:f,preEnd:!0,requireEndOnly:!0};y&&!x&&(c.resetStatuses(f),m=c.setAll(b),m.shouldMove&&m.locked&&(h=!0)),(x||h)&&(p.copyCoords(i.upCoords,t.curCoords),t.pointers[0]=i.startEvent=new a(t,n,t.prepared.name,"inertiastart",t.element),i.t0=d,i.active=!0,i.allowResume=l.allowResume,t.simulation=i,o.fire(i.startEvent),x?(i.vx0=t.pointerDelta.client.vx,i.vy0=t.pointerDelta.client.vy,i.v0=g,r(t,i),p.extend(v,t.curCoords.page),v.x+=i.xe,v.y+=i.ye,c.resetStatuses(f),m=c.setAll(b),i.modifiedXe+=m.dx,i.modifiedYe+=m.dy,i.i=u.request(t.boundInertiaFrame)):(i.smoothEnd=!0,i.xe=m.dx,i.ye=m.dy,i.sx=i.sy=0,i.i=u.request(t.boundSmoothEndFrame)))}}),l.signals.on("stop-active",function(e){var t=e.interaction,n=t.inertiaStatus;n.active&&(u.cancel(n.i),n.active=!1,t.simulation=null)})},{"./InteractEvent":3,"./Interaction":5,"./modifiers":24,"./utils":44,"./utils/raf":50}],21:[function(e,t,n){"use strict";function r(e,t){var n=a.interactables.get(e,t);return n||(n=new l(e,t),n.events.global=p),n}var i=e("./utils/browser"),o=e("./utils/events"),s=e("./utils"),a=e("./scope"),l=e("./Interactable"),c=e("./Interaction"),p={};r.isSet=function(e,t){return-1!==a.interactables.indexOfElement(e,t&&t.context)},r.on=function(e,t,n){if(s.is.string(e)&&-1!==e.search(" ")&&(e=e.trim().split(/ +/)),s.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.on(f,t,n)}return r}if(s.is.object(e)){for(var v in e)r.on(v,e[v],t);return r}return s.contains(l.eventTypes,e)?p[e]?p[e].push(t):p[e]=[t]:o.add(a.document,e,t,{options:n}),r},r.off=function(e,t,n){if(s.is.string(e)&&-1!==e.search(" ")&&(e=e.trim().split(/ +/)),s.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.off(f,t,n)}return r}if(s.is.object(e)){for(var v in e)r.off(v,e[v],t);return r}if(s.contains(l.eventTypes,e)){var g=void 0;e in p&&-1!==(g=s.indexOf(p[e],t))&&p[e].splice(g,1)}else o.remove(a.document,e,t,n);return r},r.debug=function(){return a},r.getPointerAverage=s.pointerAverage,r.getTouchBBox=s.touchBBox,r.getTouchDistance=s.touchDistance,r.getTouchAngle=s.touchAngle,r.getElementRect=s.getElementRect,r.getElementClientRect=s.getElementClientRect,r.matchesSelector=s.matchesSelector,r.closest=s.closest,r.supportsTouch=function(){return i.supportsTouch},r.supportsPointerEvent=function(){return i.supportsPointerEvent},r.stop=function(e){for(var t=a.interactions.length-1;t>=0;t--)a.interactions[t].stop(e);return r},r.pointerMoveTolerance=function(e){return s.is.number(e)?(c.pointerMoveTolerance=e,this):c.pointerMoveTolerance},r.addDocument=a.addDocument,r.removeDocument=a.removeDocument,a.interact=r,t.exports=r},{"./Interactable":4,"./Interaction":5,"./scope":34,"./utils":44,"./utils/browser":37,"./utils/events":40}],22:[function(e,t,n){"use strict";function r(e){var t=e.interaction,n=e.event;t.target&&t.target.checkAndPreventDefault(n)}var i=e("./Interactable"),o=e("./Interaction"),s=e("./scope"),a=e("./utils/is"),l=e("./utils/events"),c=e("./utils/domUtils"),p=c.nodeContains,u=c.matchesSelector;i.prototype.preventDefault=function(e){return/^(always|never|auto)$/.test(e)?(this.options.preventDefault=e,this):a.bool(e)?(this.options.preventDefault=e?"always":"never",this):this.options.preventDefault},i.prototype.checkAndPreventDefault=function(e){var t=this.options.preventDefault;if("never"!==t)return"always"===t?void e.preventDefault():void(l.supportsOptions||/^(mouse|pointer|touch)*(down|start)/i.test(e.type)||a.element(e.target)&&u(e.target,"input,select,textarea,[contenteditable=true],[contenteditable=true] *")||e.preventDefault())};for(var d=["down","move","up","cancel"],f=0;f=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i;if(o.element&&(o.element===e.target||p(o.element,e.target)))return void o.target.checkAndPreventDefault(e)}}},{"./Interactable":4,"./Interaction":5,"./scope":34,"./utils/domUtils":39,"./utils/events":40,"./utils/is":46}],23:[function(e,t,n){"use strict";function r(e){var t=e.target,n=a.search(e,e.type,t);n&&n.prevTap&&e.clientX===n.prevTap.clientX&&e.clientY===n.prevTap.clientY&&t===n.prevTap.target&&(n.downTargets[0]=t,n.downTimes[0]=(new Date).getTime(),l.fire({interaction:n,event:e,eventTarget:t,pointer:e,type:"tap"}))}var i=e("./scope"),o=e("./utils/events"),s=e("./utils/browser"),a=e("./utils/interactionFinder"),l=e("./pointerEvents/base"),c=e("./utils/window"),p=c.window,u=Object.prototype.toString;if(p.Array.isArray||(p.Array.isArray=function(e){return"[object Array]"===u.call(e)}),String.prototype.trim||(String.prototype.trim=function(){return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")}),s.isIE8){var d=function(e){for(var t=i.interactions,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var o;if(n){if(r>=t.length)break;o=t[r++]}else{if(r=t.next(),r.done)break;o=r.value}var s=o;s.interacting()&&s.target.checkAndPreventDefault(e)}},f=function(e,t){var n=e.doc,i=(e.win,0===t.indexOf("listen")?o.add:o.remove);i(n,"selectstart",d),l&&i(n,"dblclick",r)};i.signals.on("add-document",f),i.signals.on("remove-document",f)}t.exports=null},{"./pointerEvents/base":31,"./scope":34,"./utils/browser":37,"./utils/events":40,"./utils/interactionFinder":45,"./utils/window":52}],24:[function(e,t,n){"use strict";function r(e,t,n){return e&&e.enabled&&(t||!e.endOnly)&&(!n||e.endOnly)}var i=e("../InteractEvent"),o=e("../Interaction"),s=e("../utils/extend"),a={names:[],setOffsets:function(e){var t=e.interaction,n=e.pageCoords,r=t.target,i=t.element,o=t.startOffset,s=r.getRect(i);s?(o.left=n.x-s.left,o.top=n.y-s.top,o.right=s.right-n.x,o.bottom=s.bottom-n.y,"width"in s||(s.width=s.right-s.left),"height"in s||(s.height=s.bottom-s.top)):o.left=o.top=o.right=o.bottom=0,e.rect=s,e.interactable=r,e.element=i;for(var l=0;l=p.length)break;f=p[d++]}else{if(d=p.next(),d.done)break;f=d.value}var v=f,g=a[v],h=t.target.options[t.prepared.name][v];r(h,i,o)&&(e.status=e.status=n[v],e.options=h,e.offset=e.interaction.modifierOffsets[v],g.set(e),e.status.locked&&(l.x+=e.status.dx,l.y+=e.status.dy,c.dx+=e.status.dx,c.dy+=e.status.dy,c.locked=!0))}return c.shouldMove=!e.status||!c.locked||e.status.changed,c},resetStatuses:function(e){for(var t=a.names,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var i;if(n){if(r>=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i,s=e[o]||{};s.dx=s.dy=0,s.modifiedX=s.modifiedY=NaN,s.locked=!1,s.changed=!0,e[o]=s}return e},start:function(e,t){var n=e.interaction,r={interaction:n,pageCoords:("action-resume"===t?n.curCoords:n.startCoords).page,startOffset:n.startOffset,statuses:n.modifierStatuses,preEnd:!1,requireEndOnly:!1};a.setOffsets(r),a.resetStatuses(r.statuses),r.pageCoords=s({},n.startCoords.page),n.modifierResult=a.setAll(r)}};o.signals.on("new",function(e){e.startOffset={left:0,right:0,top:0,bottom:0},e.modifierOffsets={},e.modifierStatuses=a.resetStatuses({}),e.modifierResult=null}),o.signals.on("action-start",a.start),o.signals.on("action-resume",a.start),o.signals.on("before-action-move",function(e){var t=e.interaction,n=e.preEnd,r=e.interactingBeforeMove,i=a.setAll({interaction:t,preEnd:n,pageCoords:t.curCoords.page,statuses:t.modifierStatuses,requireEndOnly:!1});!i.shouldMove&&r&&(t._dontFireMove=!0),t.modifierResult=i}),o.signals.on("action-end",function(e){for(var t=e.interaction,n=e.event,i=0;i=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}var m=h,y=m.x,x=m.y;l.push({x:s.left-i.width*y+u.x,y:s.top-i.height*x+u.y})}else l.push(u);return l},set:function(e){var t=e.interaction,n=e.pageCoords,r=e.status,i=e.options,s=e.offset,a=[],l=void 0,c=void 0,p=void 0;if(r.useStatusXY)c={x:r.x,y:r.y};else{var u=o.getOriginXY(t.target,t.element,t.prepared.name);c=o.extend({},n),c.x-=u.x,c.y-=u.y}r.realX=c.x,r.realY=c.y;for(var d=i.targets?i.targets.length:0,f=s,v=Array.isArray(f),g=0,f=v?f:f[Symbol.iterator]();;){var h;if(v){if(g>=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}for(var m=h,y=m.x,x=m.y,b=c.x-y,w=c.y-x,E=i.targets,S=Array.isArray(E),T=0,E=S?E:E[Symbol.iterator]();;){var C;if(S){if(T>=E.length)break;C=E[T++]}else{if(T=E.next(),T.done)break;C=T.value}var A=C;l=o.is.function(A)?A(b,w,t):A,l&&a.push({x:o.is.number(l.x)?l.x+y:b,y:o.is.number(l.y)?l.y+x:w,range:o.is.number(l.range)?l.range:i.range})}}var D={target:null,inRange:!1,distance:0,range:0,dx:0,dy:0};for(p=0,d=a.length;p=p.length)break;f=p[d++]}else{if(d=p.next(),d.done)break;f=d.value}var v=f,g=void 0;g=a.is.function(v)?v(l,c,t):v,g&&("width"in g&&"height"in g&&(g.x=g.width, +g.y=g.height),e.options.targets.push(g))}i.set(e)},modifyCoords:function(e){var t=e.options;e.options=a.extend({},t),e.options.enabled=t.enabled,e.options.relativePoints=[null],i.modifyCoords(e)}};r.snapSize=l,r.names.push("snapSize"),o.perAction.snapSize=l.defaults,s.defaults.snapSize=l.defaults,t.exports=l},{"../actions/resize":10,"../defaultOptions":18,"../utils/":44,"./index":24,"./snap":28}],30:[function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=e("../utils/pointerUtils");t.exports=function(){function e(t,n,o,s,a){if(r(this,e),i.pointerExtend(this,o),o!==n&&i.pointerExtend(this,n),this.interaction=a,this.timeStamp=(new Date).getTime(),this.originalEvent=o,this.type=t,this.pointerId=i.getPointerId(n),this.pointerType=i.getPointerType(n),this.target=s,this.currentTarget=null,"tap"===t){var l=a.getPointerIndex(n);this.dt=this.timeStamp-a.downTimes[l];var c=this.timeStamp-a.tapTime;this.double=!!(a.prevTap&&"doubletap"!==a.prevTap.type&&a.prevTap.target===this.target&&c<500)}else"doubletap"===t&&(this.dt=n.timeStamp-a.tapTime)}return e.prototype.subtractOrigin=function(e){var t=e.x,n=e.y;return this.pageX-=t,this.pageY-=n,this.clientX-=t,this.clientY-=n,this},e.prototype.addOrigin=function(e){var t=e.x,n=e.y;return this.pageX+=t,this.pageY+=n,this.clientX+=t,this.clientY+=n,this},e.prototype.preventDefault=function(){this.originalEvent.preventDefault()},e.prototype.stopPropagation=function(){this.propagationStopped=!0},e.prototype.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},e}()},{"../utils/pointerUtils":49}],31:[function(e,t,n){"use strict";function r(e){for(var t=e.interaction,n=e.pointer,s=e.event,l=e.eventTarget,c=e.type,u=void 0===c?e.pointerEvent.type:c,d=e.targets,f=void 0===d?i(e):d,v=e.pointerEvent,g=void 0===v?new o(u,n,s,l,t):v,h={interaction:t,pointer:n,event:s,eventTarget:l,targets:f,type:u,pointerEvent:g},m=0;m=u.length)break;g=u[v++]}else{if(v=u.next(),v.done)break;g=v.value}var h=g;c.element=h,p.fire("collect-targets",c)}return"hold"===o&&(c.targets=d(c.targets,function(e){return e.eventable.options.holdDuration===t.holdTimers[s].duration})),c.targets}var o=e("./PointerEvent"),s=e("../Interaction"),a=e("../utils"),l=e("../utils/browser"),c=e("../defaultOptions"),p=e("../utils/Signals").new(),u=e("../utils/arr"),d=u.filter,f=["down","up","cancel"],v=["down","up","cancel"],g={PointerEvent:o,fire:r,collectEventTargets:i,signals:p,defaults:{holdDuration:600,ignoreFrom:null,allowFrom:null,origin:{x:0,y:0}},types:["down","move","up","cancel","tap","doubletap","hold"]};s.signals.on("update-pointer-down",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers[n]={duration:1/0,timeout:null}}),s.signals.on("remove-pointer",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers.splice(n,1)}),s.signals.on("move",function(e){var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,s=e.duplicateMove,a=t.getPointerIndex(n);s||t.pointerIsDown&&!t.pointerWasMoved||(t.pointerIsDown&&clearTimeout(t.holdTimers[a].timeout),r({interaction:t,pointer:n,event:i,eventTarget:o,type:"move"}))}),s.signals.on("down",function(e){for(var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,s=e.pointerIndex,c=l.isIE8?a.extend({},i):i,u=t.holdTimers[s],d=a.getPath(o),f={interaction:t,pointer:n,event:i,eventTarget:o,type:"hold",targets:[],path:d,element:null},v=d,g=Array.isArray(v),h=0,v=g?v:v[Symbol.iterator]();;){var m;if(g){if(h>=v.length)break;m=v[h++]}else{if(h=v.next(),h.done)break;m=h.value}var y=m;f.element=y,p.fire("collect-targets",f)}if(f.targets.length){for(var x=1/0,b=0;b=0&&(p.selectors[u]!==e||p.contexts[u]!==t);u--);-1===u&&(u=p.selectors.length,p.selectors.push(e),p.contexts.push(t),p.listeners.push([])),p.listeners[u].push([i,!!s.capture,s.passive])}function s(e,t,n,r,o){var s=f(o),c=O[n],p=!1,u=void 0;if(c)for(u=c.selectors.length-1;u>=0;u--)if(c.selectors[u]===e&&c.contexts[u]===t){for(var d=c.listeners[u],v=d.length-1;v>=0;v--){var g=d[v],h=g[0],m=g[1],y=g[2];if(h===r&&m===!!s.capture&&y===s.passive){d.splice(v,1),d.length||(c.selectors.splice(u,1),c.contexts.splice(u,1),c.listeners.splice(u,1),i(t,n,a),i(t,n,l,!0),c.selectors.length||(O[n]=null)),p=!0;break}}if(p)break}}function a(e,t){var n=f(t),r={},i=O[e.type],o=g.getActualElement(e.path?e.path[0]:e.target),s=o;for(h(r,e),r.originalEvent=e,r.preventDefault=p;v.element(s);){for(var a=0;a=l.length)break;u=l[p++]}else{if(p=l.next(),p.done)break;u=p.value}var d=u,f=o[d](a);if(f)return f}},simulationResume:function(e){var t=e.pointerType,n=e.eventType,o=e.eventTarget;if(!/down|start/i.test(n))return null;for(var s=r.interactions,a=Array.isArray(s),l=0,s=a?s:s[Symbol.iterator]();;){var c;if(a){if(l>=s.length)break;c=s[l++]}else{if(l=s.next(),l.done)break;c=l.value}var p=c,u=o;if(p.simulation&&p.simulation.allowResume&&p.pointerType===t)for(;u;){if(u===p.element)return p;u=i.parentNode(u)}}return null},mouseOrPen:function(e){var t=e.pointerId,n=e.pointerType,o=e.eventType;if("mouse"!==n&&"pen"!==n)return null;for(var s=void 0,a=r.interactions,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var u=p;if(u.pointerType===n){if(u.simulation&&!i.contains(u.pointerIds,t))continue;if(u.interacting())return u;s||(s=u)}}if(s)return s;for(var d=r.interactions,f=Array.isArray(d),v=0,d=f?d:d[Symbol.iterator]();;){var g;if(f){if(v>=d.length)break;g=d[v++]}else{if(v=d.next(),v.done)break;g=v.value}var h=g;if(!(h.pointerType!==n||/down/i.test(o)&&h.simulation))return h}return null},hasPointer:function(e){for(var t=e.pointerId,n=r.interactions,o=Array.isArray(n),s=0,n=o?n:n[Symbol.iterator]();;){var a;if(o){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var l=a;if(i.contains(l.pointerIds,t))return l}},idle:function(e){for(var t=e.pointerType,n=r.interactions,i=Array.isArray(n),o=0,n=i?n:n[Symbol.iterator]();;){var s;if(i){if(o>=n.length)break;s=n[o++]}else{if(o=n.next(),o.done)break;s=o.value}var a=s;if(1===a.pointerIds.length){var l=a.target;if(l&&!l.options.gesture.enabled)continue}else if(a.pointerIds.length>=2)continue;if(!a.interacting()&&t===a.pointerType)return a}return null}};t.exports=o},{"../scope":34,"./index":44}],46:[function(e,t,n){"use strict";var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},i=e("./window"),o=e("./isWindow"),s={array:function(){},window:function(e){return e===i.window||o(e)},docFrag:function(e){return s.object(e)&&11===e.nodeType},object:function(e){return!!e&&"object"===(void 0===e?"undefined":r(e))},function:function(e){return"function"==typeof e},number:function(e){return"number"==typeof e},bool:function(e){return"boolean"==typeof e},string:function(e){return"string"==typeof e},element:function(e){if(!e||"object"!==(void 0===e?"undefined":r(e)))return!1;var t=i.getWindow(e)||i.window;return/object|function/.test(r(t.Element))?e instanceof t.Element:1===e.nodeType&&"string"==typeof e.nodeName}};s.array=function(e){return s.object(e)&&void 0!==e.length&&s.function(e.splice)},t.exports=s},{"./isWindow":47,"./window":52}],47:[function(e,t,n){"use strict";t.exports=function(e){return!(!e||!e.Window)&&e instanceof e.Window}},{}],48:[function(e,t,n){"use strict";function r(e,n){for(var r in n){var i=t.exports.prefixedPropREs,o=!1;for(var s in i)if(0===r.indexOf(s)&&i[s].test(r)){o=!0;break}o||"function"==typeof n[r]||(e[r]=n[r])}return e}r.prefixedPropREs={webkit:/(Movement[XY]|Radius[XY]|RotationAngle|Force)$/},t.exports=r},{}],49:[function(e,t,n){"use strict";var r=e("./hypot"),i=e("./browser"),o=e("./domObjects"),s=e("./domUtils"),a=e("./domObjects"),l=e("./is"),c=e("./pointerExtend"),p={copyCoords:function(e,t){e.page=e.page||{},e.page.x=t.page.x,e.page.y=t.page.y,e.client=e.client||{},e.client.x=t.client.x,e.client.y=t.client.y,e.timeStamp=t.timeStamp},setCoordDeltas:function(e,t,n){e.page.x=n.page.x-t.page.x,e.page.y=n.page.y-t.page.y,e.client.x=n.client.x-t.client.x,e.client.y=n.client.y-t.client.y,e.timeStamp=n.timeStamp-t.timeStamp;var i=Math.max(e.timeStamp/1e3,.001);e.page.speed=r(e.page.x,e.page.y)/i,e.page.vx=e.page.x/i,e.page.vy=e.page.y/i,e.client.speed=r(e.client.x,e.page.y)/i,e.client.vx=e.client.x/i,e.client.vy=e.client.y/i},isNativePointer:function(e){return e instanceof o.Event||e instanceof o.Touch},getXY:function(e,t,n){return n=n||{},e=e||"page",n.x=t[e+"X"],n.y=t[e+"Y"],n},getPageXY:function(e,t){return t=t||{},i.isOperaMobile&&p.isNativePointer(e)?(p.getXY("screen",e,t),t.x+=window.scrollX,t.y+=window.scrollY):p.getXY("page",e,t),t},getClientXY:function(e,t){return t=t||{},i.isOperaMobile&&p.isNativePointer(e)?p.getXY("screen",e,t):p.getXY("client",e,t),t},getPointerId:function(e){return l.number(e.pointerId)?e.pointerId:e.identifier},setCoords:function(e,t,n){var r=t.length>1?p.pointerAverage(t):t[0],i={};p.getPageXY(r,i),e.page.x=i.x,e.page.y=i.y,p.getClientXY(r,i),e.client.x=i.x,e.client.y=i.y,e.timeStamp=l.number(n)?n:(new Date).getTime()},pointerExtend:c,getTouchPair:function(e){var t=[];return l.array(e)?(t[0]=e[0],t[1]=e[1]):"touchend"===e.type?1===e.touches.length?(t[0]=e.touches[0],t[1]=e.changedTouches[0]):0===e.touches.length&&(t[0]=e.changedTouches[0],t[1]=e.changedTouches[1]):(t[0]=e.touches[0],t[1]=e.touches[1]),t},pointerAverage:function(e){for(var t={pageX:0,pageY:0,clientX:0,clientY:0,screenX:0,screenY:0},n=e,r=Array.isArray(n),i=0,n=r?n:n[Symbol.iterator]();;){var o;if(r){if(i>=n.length)break;o=n[i++]}else{if(i=n.next(),i.done)break;o=i.value}var s=o;for(var a in t)t[a]+=s[a]}for(var l in t)t[l]/=e.length;return t},touchBBox:function(e){if(e.length||e.touches&&e.touches.length>1){var t=p.getTouchPair(e),n=Math.min(t[0].pageX,t[1].pageX),r=Math.min(t[0].pageY,t[1].pageY);return{x:n,y:r,left:n,top:r,width:Math.max(t[0].pageX,t[1].pageX)-n,height:Math.max(t[0].pageY,t[1].pageY)-r}}},touchDistance:function(e,t){var n=t+"X",i=t+"Y",o=p.getTouchPair(e),s=o[0][n]-o[1][n],a=o[0][i]-o[1][i];return r(s,a)},touchAngle:function(e,t,n){var r=n+"X",i=n+"Y",o=p.getTouchPair(e),s=o[1][r]-o[0][r],a=o[1][i]-o[0][i];return 180*Math.atan2(a,s)/Math.PI},getPointerType:function(e){return l.string(e.pointerType)?e.pointerType:l.number(e.pointerType)?[void 0,void 0,"touch","pen","mouse"][e.pointerType]:/touch/.test(e.type)||e instanceof a.Touch?"touch":"mouse"},getEventTargets:function(e){return[s.getActualElement(e.path?e.path[0]:e.target),s.getActualElement(e.currentTarget)]}};t.exports=p},{"./browser":37,"./domObjects":38,"./domUtils":39,"./hypot":43,"./is":46,"./pointerExtend":48}],50:[function(e,t,n){"use strict";for(var r=e("./window"),i=r.window,o=["ms","moz","webkit","o"],s=0,a=void 0,l=void 0,c=0;c\n * Open source under the MIT License.\n * https://raw.github.com/taye/interact.js/master/LICENSE\n */\n","/*\n * In a (windowless) server environment this file exports a factory function\n * that takes the window to use.\n *\n * var interact = require('interact.js')(windowObject);\n *\n * See https://github.com/taye/interact.js/issues/187\n */\nif (typeof window === 'undefined') {\n module.exports = function (window) {\n require('./src/utils/window').init(window);\n\n return require('./src/index');\n };\n}\nelse {\n module.exports = require('./src/index');\n}\n","const { indexOf } = require('./utils/arr');\nconst extend = require('./utils/extend.js');\n\nfunction fireUntilImmediateStopped (event, listeners) {\n for (let i = 0, len = listeners.length; i < len && !event.immediatePropagationStopped; i++) {\n listeners[i](event);\n }\n}\n\nclass Eventable {\n\n constructor (options) {\n this.options = extend({}, options || {});\n }\n\n fire (event) {\n let listeners;\n const onEvent = 'on' + event.type;\n const global = this.global;\n\n // Interactable#on() listeners\n if ((listeners = this[event.type])) {\n fireUntilImmediateStopped(event, listeners);\n }\n\n // interactable.onevent listener\n if (this[onEvent]) {\n this[onEvent](event);\n }\n\n // interact.on() listeners\n if (!event.propagationStopped && global && (listeners = global[event.type])) {\n fireUntilImmediateStopped(event, listeners);\n }\n }\n\n on (eventType, listener) {\n // if this type of event was never bound\n if (this[eventType]) {\n this[eventType].push(listener);\n }\n else {\n this[eventType] = [listener];\n }\n }\n\n off (eventType, listener) {\n // if it is an action event type\n const eventList = this[eventType];\n const index = eventList? indexOf(eventList, listener) : -1;\n\n if (index !== -1) {\n eventList.splice(index, 1);\n }\n\n if (eventList && eventList.length === 0 || !listener) {\n this[eventType] = listener;\n }\n }\n}\n\nmodule.exports = Eventable;\n","const extend = require('./utils/extend');\nconst getOriginXY = require('./utils/getOriginXY');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nclass InteractEvent {\n constructor (interaction, event, action, phase, element, related, preEnd = false) {\n const target = interaction.target;\n const deltaSource = (target && target.options || defaults).deltaSource;\n const origin = getOriginXY(target, element, action);\n const starting = phase === 'start';\n const ending = phase === 'end';\n const coords = starting? interaction.startCoords : interaction.curCoords;\n const prevEvent = interaction.prevEvent;\n\n element = element || interaction.element;\n\n const page = extend({}, coords.page);\n const client = extend({}, coords.client);\n\n page.x -= origin.x;\n page.y -= origin.y;\n\n client.x -= origin.x;\n client.y -= origin.y;\n\n this.ctrlKey = event.ctrlKey;\n this.altKey = event.altKey;\n this.shiftKey = event.shiftKey;\n this.metaKey = event.metaKey;\n this.button = event.button;\n this.buttons = event.buttons;\n this.target = element;\n this.currentTarget = element;\n this.relatedTarget = related || null;\n this.preEnd = preEnd;\n this.type = action + (phase || '');\n this.interaction = interaction;\n this.interactable = target;\n\n this.t0 = starting ? interaction.downTimes[interaction.downTimes.length - 1]\n : prevEvent.t0;\n\n const signalArg = {\n interaction,\n event,\n action,\n phase,\n element,\n related,\n page,\n client,\n coords,\n starting,\n ending,\n deltaSource,\n iEvent: this,\n };\n\n signals.fire('set-xy', signalArg);\n\n if (ending) {\n // use previous coords when ending\n this.pageX = prevEvent.pageX;\n this.pageY = prevEvent.pageY;\n this.clientX = prevEvent.clientX;\n this.clientY = prevEvent.clientY;\n }\n else {\n this.pageX = page.x;\n this.pageY = page.y;\n this.clientX = client.x;\n this.clientY = client.y;\n }\n\n this.x0 = interaction.startCoords.page.x - origin.x;\n this.y0 = interaction.startCoords.page.y - origin.y;\n this.clientX0 = interaction.startCoords.client.x - origin.x;\n this.clientY0 = interaction.startCoords.client.y - origin.y;\n\n signals.fire('set-delta', signalArg);\n\n this.timeStamp = coords.timeStamp;\n this.dt = interaction.pointerDelta.timeStamp;\n this.duration = this.timeStamp - this.t0;\n\n // speed and velocity in pixels per second\n this.speed = interaction.pointerDelta[deltaSource].speed;\n this.velocityX = interaction.pointerDelta[deltaSource].vx;\n this.velocityY = interaction.pointerDelta[deltaSource].vy;\n\n this.swipe = (ending || phase === 'inertiastart')? this.getSwipe() : null;\n\n signals.fire('new', signalArg);\n }\n\n getSwipe () {\n const interaction = this.interaction;\n\n if (interaction.prevEvent.speed < 600\n || this.timeStamp - interaction.prevEvent.timeStamp > 150) {\n return null;\n }\n\n let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI;\n const overlap = 22.5;\n\n if (angle < 0) {\n angle += 360;\n }\n\n const left = 135 - overlap <= angle && angle < 225 + overlap;\n const up = 225 - overlap <= angle && angle < 315 + overlap;\n\n const right = !left && (315 - overlap <= angle || angle < 45 + overlap);\n const down = !up && 45 - overlap <= angle && angle < 135 + overlap;\n\n return {\n up,\n down,\n left,\n right,\n angle,\n speed: interaction.prevEvent.speed,\n velocity: {\n x: interaction.prevEvent.velocityX,\n y: interaction.prevEvent.velocityY,\n },\n };\n }\n\n preventDefault () {}\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n}\n\nsignals.on('set-delta', function ({ iEvent, interaction, starting, deltaSource }) {\n const prevEvent = starting? iEvent : interaction.prevEvent;\n\n if (deltaSource === 'client') {\n iEvent.dx = iEvent.clientX - prevEvent.clientX;\n iEvent.dy = iEvent.clientY - prevEvent.clientY;\n }\n else {\n iEvent.dx = iEvent.pageX - prevEvent.pageX;\n iEvent.dy = iEvent.pageY - prevEvent.pageY;\n }\n});\n\nInteractEvent.signals = signals;\n\nmodule.exports = InteractEvent;\n","const is = require('./utils/is');\nconst events = require('./utils/events');\nconst extend = require('./utils/extend');\nconst actions = require('./actions/base');\nconst scope = require('./scope');\nconst Eventable = require('./Eventable');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nconst {\n getElementRect,\n nodeContains,\n trySelector,\n} = require('./utils/domUtils');\nconst { getWindow } = require('./utils/window');\nconst { indexOf, contains } = require('./utils/arr');\nconst { wheelEvent } = require('./utils/browser');\n\n// all set interactables\nscope.interactables = [];\n\n/*\\\n * Interactable\n [ property ]\n **\n * Object type returned by @interact\n\\*/\nclass Interactable {\n constructor (target, options) {\n options = options || {};\n\n this.target = target;\n this.events = new Eventable();\n this._context = options.context || scope.document;\n this._win = getWindow(trySelector(target)? this._context : target);\n this._doc = this._win.document;\n\n signals.fire('new', {\n target,\n options,\n interactable: this,\n win: this._win,\n });\n\n scope.addDocument( this._doc, this._win );\n\n scope.interactables.push(this);\n\n this.set(options);\n }\n\n setOnEvents (action, phases) {\n const onAction = 'on' + action;\n\n if (is.function(phases.onstart) ) { this.events[onAction + 'start' ] = phases.onstart ; }\n if (is.function(phases.onmove) ) { this.events[onAction + 'move' ] = phases.onmove ; }\n if (is.function(phases.onend) ) { this.events[onAction + 'end' ] = phases.onend ; }\n if (is.function(phases.oninertiastart)) { this.events[onAction + 'inertiastart' ] = phases.oninertiastart ; }\n\n return this;\n }\n\n setPerAction (action, options) {\n // for all the default per-action options\n for (const option in options) {\n // if this option exists for this action\n if (option in defaults[action]) {\n // if the option in the options arg is an object value\n if (is.object(options[option])) {\n // duplicate the object\n this.options[action][option] = extend(this.options[action][option] || {}, options[option]);\n\n if (is.object(defaults.perAction[option]) && 'enabled' in defaults.perAction[option]) {\n this.options[action][option].enabled = options[option].enabled === false? false : true;\n }\n }\n else if (is.bool(options[option]) && is.object(defaults.perAction[option])) {\n this.options[action][option].enabled = options[option];\n }\n else if (options[option] !== undefined) {\n // or if it's not undefined, do a plain assignment\n this.options[action][option] = options[option];\n }\n }\n }\n }\n\n /*\\\n * Interactable.getRect\n [ method ]\n *\n * The default function to get an Interactables bounding rect. Can be\n * overridden using @Interactable.rectChecker.\n *\n - element (Element) #optional The element to measure.\n = (object) The object's bounding rectangle.\n o {\n o top : 0,\n o left : 0,\n o bottom: 0,\n o right : 0,\n o width : 0,\n o height: 0\n o }\n \\*/\n getRect (element) {\n element = element || this.target;\n\n if (is.string(this.target) && !(is.element(element))) {\n element = this._context.querySelector(this.target);\n }\n\n return getElementRect(element);\n }\n\n /*\\\n * Interactable.rectChecker\n [ method ]\n *\n * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n - checker (function) #optional A function which returns this Interactable's bounding rectangle. See @Interactable.getRect\n = (function | object) The checker function or this Interactable\n \\*/\n rectChecker (checker) {\n if (is.function(checker)) {\n this.getRect = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.getRect;\n\n return this;\n }\n\n return this.getRect;\n }\n\n _backCompatOption (optionName, newValue) {\n if (trySelector(newValue) || is.object(newValue)) {\n this.options[optionName] = newValue;\n\n for (const action of actions.names) {\n this.options[action][optionName] = newValue;\n }\n\n return this;\n }\n\n return this.options[optionName];\n }\n\n /*\\\n * Interactable.origin\n [ method ]\n *\n * Gets or sets the origin of the Interactable's element. The x and y\n * of the origin will be subtracted from action event coordinates.\n *\n - origin (object | string) #optional An object eg. { x: 0, y: 0 } or string 'parent', 'self' or any CSS selector\n * OR\n - origin (Element) #optional An HTML or SVG Element whose rect will be used\n **\n = (object) The current origin or this Interactable\n \\*/\n origin (newValue) {\n return this._backCompatOption('origin', newValue);\n }\n\n /*\\\n * Interactable.deltaSource\n [ method ]\n *\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n - newValue (string) #optional Use 'client' if you will be scrolling while interacting; Use 'page' if you want autoScroll to work\n = (string | object) The current deltaSource or this Interactable\n \\*/\n deltaSource (newValue) {\n if (newValue === 'page' || newValue === 'client') {\n this.options.deltaSource = newValue;\n\n return this;\n }\n\n return this.options.deltaSource;\n }\n\n /*\\\n * Interactable.context\n [ method ]\n *\n * Gets the selector context Node of the Interactable. The default is `window.document`.\n *\n = (Node) The context Node of this Interactable\n **\n \\*/\n context () {\n return this._context;\n }\n\n inContext (element) {\n return (this._context === element.ownerDocument\n || nodeContains(this._context, element));\n }\n\n /*\\\n * Interactable.fire\n [ method ]\n *\n * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n - iEvent (InteractEvent) The InteractEvent object to be fired on this Interactable\n = (Interactable) this Interactable\n \\*/\n fire (iEvent) {\n this.events.fire(iEvent);\n\n return this;\n }\n\n _onOffMultiple (method, eventType, listener, options) {\n if (is.string(eventType) && eventType.search(' ') !== -1) {\n eventType = eventType.trim().split(/ +/);\n }\n\n if (is.array(eventType)) {\n for (let i = 0; i < eventType.length; i++) {\n this[method](eventType[i], listener, options);\n }\n\n return true;\n }\n\n if (is.object(eventType)) {\n for (const prop in eventType) {\n this[method](prop, eventType[prop], listener);\n }\n\n return true;\n }\n }\n\n /*\\\n * Interactable.on\n [ method ]\n *\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n - eventType (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) This Interactable\n \\*/\n on (eventType, listener, options) {\n if (this._onOffMultiple('on', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.on(eventType, listener);\n }\n // delegated event for selector\n else if (is.string(this.target)) {\n events.addDelegate(this.target, this._context, eventType, listener, options);\n }\n else {\n events.add(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.off\n [ method ]\n *\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n - eventType (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) This Interactable\n \\*/\n off (eventType, listener, options) {\n if (this._onOffMultiple('off', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n // if it is an action event type\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.off(eventType, listener);\n }\n // delegated event\n else if (is.string(this.target)) {\n events.removeDelegate(this.target, this._context, eventType, listener, options);\n }\n // remove listener from this Interatable's element\n else {\n events.remove(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.set\n [ method ]\n *\n * Reset the options of this Interactable\n - options (object) The new settings to apply\n = (object) This Interactable\n \\*/\n set (options) {\n if (!is.object(options)) {\n options = {};\n }\n\n this.options = extend({}, defaults.base);\n\n const perActions = extend({}, defaults.perAction);\n\n for (const actionName in actions.methodDict) {\n const methodName = actions.methodDict[actionName];\n\n this.options[actionName] = extend({}, defaults[actionName]);\n\n this.setPerAction(actionName, perActions);\n\n this[methodName](options[actionName]);\n }\n\n for (const setting of Interactable.settingsMethods) {\n this.options[setting] = defaults.base[setting];\n\n if (setting in options) {\n this[setting](options[setting]);\n }\n }\n\n signals.fire('set', {\n options,\n interactable: this,\n });\n\n return this;\n }\n\n /*\\\n * Interactable.unset\n [ method ]\n *\n * Remove this interactable from the list of interactables and remove\n * it's action capabilities and event listeners\n *\n = (object) @interact\n \\*/\n unset () {\n events.remove(this.target, 'all');\n\n if (is.string(this.target)) {\n // remove delegated events\n for (const type in events.delegatedEvents) {\n const delegated = events.delegatedEvents[type];\n\n if (delegated.selectors[0] === this.target\n && delegated.contexts[0] === this._context) {\n\n delegated.selectors.splice(0, 1);\n delegated.contexts .splice(0, 1);\n delegated.listeners.splice(0, 1);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegated[type] = null;\n }\n }\n\n events.remove(this._context, type, events.delegateListener);\n events.remove(this._context, type, events.delegateUseCapture, true);\n }\n }\n else {\n events.remove(this, 'all');\n }\n\n signals.fire('unset', { interactable: this });\n\n scope.interactables.splice(indexOf(scope.interactables, this), 1);\n\n // Stop related interactions when an Interactable is unset\n for (const interaction of scope.interactions || []) {\n if (interaction.target === this && interaction.interacting()) {\n interaction.stop();\n }\n }\n\n return scope.interact;\n }\n}\n\nscope.interactables.indexOfElement = function indexOfElement (target, context) {\n context = context || scope.document;\n\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n if (interactable.target === target && interactable._context === context) {\n return i;\n }\n }\n return -1;\n};\n\nscope.interactables.get = function interactableGet (element, options, dontCheckInContext) {\n const ret = this[this.indexOfElement(element, options && options.context)];\n\n return ret && (is.string(element) || dontCheckInContext || ret.inContext(element))? ret : null;\n};\n\nscope.interactables.forEachSelector = function (callback, element) {\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n // skip non CSS selector targets and out of context elements\n if (!is.string(interactable.target)\n || (element && !interactable.inContext(element))) {\n continue;\n }\n\n const ret = callback(interactable, interactable.target, interactable._context, i, this);\n\n if (ret !== undefined) {\n return ret;\n }\n }\n};\n\n// all interact.js eventTypes\nInteractable.eventTypes = scope.eventTypes = [];\n\nInteractable.signals = signals;\n\nInteractable.settingsMethods = [ 'deltaSource', 'origin', 'preventDefault', 'rectChecker' ];\n\nmodule.exports = Interactable;\n","const scope = require('./scope');\nconst utils = require('./utils');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst finder = require('./utils/interactionFinder');\nconst signals = require('./utils/Signals').new();\n\nconst listeners = {};\nconst methodNames = [\n 'pointerDown', 'pointerMove', 'pointerUp',\n 'updatePointer', 'removePointer',\n];\n\n// for ignoring browser's simulated mouse events\nlet prevTouchTime = 0;\n\n// all active and idle interactions\nscope.interactions = [];\n\nclass Interaction {\n constructor () {\n this.target = null; // current interactable being interacted with\n this.element = null; // the target element of the interactable\n\n this.prepared = { // action that's ready to be fired on next move event\n name : null,\n axis : null,\n edges: null,\n };\n\n // keep track of added pointers\n this.pointers = [];\n this.pointerIds = [];\n this.downTargets = [];\n this.downTimes = [];\n\n // Previous native pointer move event coordinates\n this.prevCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n // current native pointer move event coordinates\n this.curCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Starting InteractEvent pointer coordinates\n this.startCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Change in coordinates and time of the pointer\n this.pointerDelta = {\n page : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n client : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n timeStamp: 0,\n };\n\n this.downEvent = null; // pointerdown/mousedown/touchstart event\n this.downPointer = {};\n\n this._eventTarget = null;\n this._curEventTarget = null;\n\n this.prevEvent = null; // previous action event\n\n this.pointerIsDown = false;\n this.pointerWasMoved = false;\n this._interacting = false;\n\n this.mouse = false;\n\n signals.fire('new', this);\n\n scope.interactions.push(this);\n }\n\n pointerDown (pointer, event, eventTarget) {\n const pointerIndex = this.updatePointer(pointer, event, true);\n\n signals.fire('down', {\n pointer,\n event,\n eventTarget,\n pointerIndex,\n interaction: this,\n });\n }\n\n /*\\\n * Interaction.start\n [ method ]\n *\n * Start an action with the given Interactable and Element as tartgets. The\n * action must be enabled for the target Interactable and an appropriate number\n * of pointers must be held down - 1 for drag/resize, 2 for gesture.\n *\n * Use it with `interactable.able({ manualStart: false })` to always\n * [start actions manually](https://github.com/taye/interact.js/issues/114)\n *\n - action (object) The action to be performed - drag, resize, etc.\n - target (Interactable) The Interactable to target\n - element (Element) The DOM Element to target\n = (object) interact\n **\n | interact(target)\n | .draggable({\n | // disable the default drag start by down->move\n | manualStart: true\n | })\n | // start dragging after the user holds the pointer down\n | .on('hold', function (event) {\n | var interaction = event.interaction;\n |\n | if (!interaction.interacting()) {\n | interaction.start({ name: 'drag' },\n | event.interactable,\n | event.currentTarget);\n | }\n | });\n \\*/\n start (action, target, element) {\n if (this.interacting()\n || !this.pointerIsDown\n || this.pointerIds.length < (action.name === 'gesture'? 2 : 1)) {\n return;\n }\n\n // if this interaction had been removed after stopping\n // add it back\n if (utils.indexOf(scope.interactions, this) === -1) {\n scope.interactions.push(this);\n }\n\n utils.copyAction(this.prepared, action);\n this.target = target;\n this.element = element;\n\n signals.fire('action-start', {\n interaction: this,\n event: this.downEvent,\n });\n }\n\n pointerMove (pointer, event, eventTarget) {\n if (!this.simulation) {\n this.updatePointer(pointer);\n utils.setCoords(this.curCoords, this.pointers);\n }\n\n const duplicateMove = (this.curCoords.page.x === this.prevCoords.page.x\n && this.curCoords.page.y === this.prevCoords.page.y\n && this.curCoords.client.x === this.prevCoords.client.x\n && this.curCoords.client.y === this.prevCoords.client.y);\n\n let dx;\n let dy;\n\n // register movement greater than pointerMoveTolerance\n if (this.pointerIsDown && !this.pointerWasMoved) {\n dx = this.curCoords.client.x - this.startCoords.client.x;\n dy = this.curCoords.client.y - this.startCoords.client.y;\n\n this.pointerWasMoved = utils.hypot(dx, dy) > Interaction.pointerMoveTolerance;\n }\n\n const signalArg = {\n pointer,\n pointerIndex: this.getPointerIndex(pointer),\n event,\n eventTarget,\n dx,\n dy,\n duplicate: duplicateMove,\n interaction: this,\n interactingBeforeMove: this.interacting(),\n };\n\n if (!duplicateMove) {\n // set pointer coordinate, time changes and speeds\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n }\n\n signals.fire('move', signalArg);\n\n if (!duplicateMove) {\n // if interacting, fire an 'action-move' signal etc\n if (this.interacting()) {\n this.doMove(signalArg);\n }\n\n if (this.pointerWasMoved) {\n utils.copyCoords(this.prevCoords, this.curCoords);\n }\n }\n }\n\n /*\\\n * Interaction.doMove\n [ method ]\n *\n * Force a move of the current action at the same coordinates. Useful if\n * snap/restrict has been changed and you want a movement with the new\n * settings.\n *\n **\n | interact(target)\n | .draggable(true)\n | .on('dragmove', function (event) {\n | if (someCondition) {\n | // change the snap settings\n | event.interactable.draggable({ snap: { targets: [] }});\n | // fire another move event with re-calculated snap\n | event.interaction.doMove();\n | }\n | });\n \\*/\n doMove (signalArg) {\n signalArg = utils.extend({\n pointer: this.pointers[0],\n event: this.prevEvent,\n eventTarget: this._eventTarget,\n interaction: this,\n }, signalArg || {});\n\n signals.fire('before-action-move', signalArg);\n\n if (!this._dontFireMove) {\n signals.fire('action-move', signalArg);\n }\n\n this._dontFireMove = false;\n }\n\n // End interact move events and stop auto-scroll unless simulation is running\n pointerUp (pointer, event, eventTarget, curEventTarget) {\n const pointerIndex = this.getPointerIndex(pointer);\n\n signals.fire(/cancel$/i.test(event.type)? 'cancel' : 'up', {\n pointer,\n pointerIndex,\n event,\n eventTarget,\n curEventTarget,\n interaction: this,\n });\n\n if (!this.simulation) {\n this.end(event);\n }\n\n this.pointerIsDown = false;\n this.removePointer(pointer, event);\n }\n\n /*\\\n * Interaction.end\n [ method ]\n *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n - event (PointerEvent) #optional\n **\n | interact(target)\n | .draggable(true)\n | .on('move', function (event) {\n | if (event.pageX > 1000) {\n | // end the current action\n | event.interaction.end();\n | // stop all further listeners from being called\n | event.stopImmediatePropagation();\n | }\n | });\n \\*/\n end (event) {\n event = event || this.prevEvent;\n\n if (this.interacting()) {\n signals.fire('action-end', {\n event,\n interaction: this,\n });\n }\n\n this.stop();\n }\n\n currentAction () {\n return this._interacting? this.prepared.name: null;\n }\n\n interacting () {\n return this._interacting;\n }\n\n stop () {\n signals.fire('stop', { interaction: this });\n\n if (this._interacting) {\n signals.fire('stop-active', { interaction: this });\n signals.fire('stop-' + this.prepared.name, { interaction: this });\n }\n\n this.target = this.element = null;\n\n this._interacting = false;\n this.prepared.name = this.prevEvent = null;\n }\n\n getPointerIndex (pointer) {\n return utils.indexOf(this.pointerIds, utils.getPointerId(pointer));\n }\n\n updatePointer (pointer, event, down = event && /(down|start)$/i.test(event.type)) {\n const id = utils.getPointerId(pointer);\n let index = this.getPointerIndex(pointer);\n\n if (index === -1) {\n index = this.pointerIds.length;\n this.pointerIds[index] = id;\n }\n\n if (down) {\n signals.fire('update-pointer-down', {\n pointer,\n event,\n down,\n pointerId: id,\n pointerIndex: index,\n interaction: this,\n });\n }\n\n this.pointers[index] = pointer;\n\n return index;\n }\n\n removePointer (pointer, event) {\n const id = utils.getPointerId(pointer);\n const index = this.mouse? 0 : utils.indexOf(this.pointerIds, id);\n\n if (index === -1) { return; }\n\n signals.fire('remove-pointer', {\n pointer,\n event,\n pointerIndex: index,\n interaction: this,\n });\n\n this.pointers .splice(index, 1);\n this.pointerIds .splice(index, 1);\n this.downTargets.splice(index, 1);\n this.downTimes .splice(index, 1);\n }\n\n _updateEventTargets (target, currentTarget) {\n this._eventTarget = target;\n this._curEventTarget = currentTarget;\n }\n}\n\nfor (let i = 0, len = methodNames.length; i < len; i++) {\n const method = methodNames[i];\n\n listeners[method] = doOnInteractions(method);\n}\n\nfunction doOnInteractions (method) {\n return (function (event) {\n const [eventTarget, curEventTarget] = utils.getEventTargets(event);\n const matches = []; // [ [pointer, interaction], ...]\n\n if (browser.supportsTouch && /touch/.test(event.type)) {\n prevTouchTime = new Date().getTime();\n\n for (let i = 0; i < event.changedTouches.length; i++) {\n const pointer = event.changedTouches[i];\n const interaction = finder.search(pointer, event.type, eventTarget);\n\n matches.push([pointer, interaction || new Interaction()]);\n }\n }\n else {\n let invalidPointer = false;\n\n if (!browser.supportsPointerEvent && /mouse/.test(event.type)) {\n // ignore mouse events while touch interactions are active\n for (let i = 0; i < scope.interactions.length && !invalidPointer; i++) {\n invalidPointer = !scope.interactions[i].mouse && scope.interactions[i].pointerIsDown;\n }\n\n // try to ignore mouse events that are simulated by the browser\n // after a touch event\n invalidPointer = invalidPointer\n || (new Date().getTime() - prevTouchTime < 500)\n // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated\n || event.timeStamp === 0;\n }\n\n if (!invalidPointer) {\n let interaction = finder.search(event, event.type, eventTarget);\n\n if (!interaction) {\n\n interaction = new Interaction();\n interaction.mouse = (/mouse/i.test(event.pointerType || event.type)\n // MSPointerEvent.MSPOINTER_TYPE_MOUSE\n || event.pointerType === 4\n || !event.pointerType);\n }\n\n matches.push([event, interaction]);\n }\n }\n\n for (const [pointer, interaction] of matches) {\n interaction._updateEventTargets(eventTarget, curEventTarget);\n interaction[method](pointer, event, eventTarget, curEventTarget);\n }\n });\n}\n\nfunction endAll (event) {\n for (let i = 0; i < scope.interactions.length; i++) {\n const interaction = scope.interactions[i];\n\n interaction.end(event);\n signals.fire('endall', { event, interaction });\n }\n}\n\nconst docEvents = { /* 'eventType': listenerFunc */ };\nconst pEventTypes = browser.pEventTypes;\n\nif (scope.PointerEvent) {\n docEvents[pEventTypes.down ] = listeners.pointerDown;\n docEvents[pEventTypes.move ] = listeners.pointerMove;\n docEvents[pEventTypes.up ] = listeners.pointerUp;\n docEvents[pEventTypes.cancel] = listeners.pointerUp;\n}\nelse {\n docEvents.mousedown = listeners.pointerDown;\n docEvents.mousemove = listeners.pointerMove;\n docEvents.mouseup = listeners.pointerUp;\n\n docEvents.touchstart = listeners.pointerDown;\n docEvents.touchmove = listeners.pointerMove;\n docEvents.touchend = listeners.pointerUp;\n docEvents.touchcancel = listeners.pointerUp;\n}\n\ndocEvents.blur = endAll;\n\nfunction onDocSignal ({ doc }, signalName) {\n const eventMethod = signalName.indexOf('add') === 0\n ? events.add : events.remove;\n\n // delegate event listener\n for (const eventType in scope.delegatedEvents) {\n eventMethod(doc, eventType, events.delegateListener);\n eventMethod(doc, eventType, events.delegateUseCapture, true);\n }\n\n for (const eventType in docEvents) {\n eventMethod(doc, eventType, docEvents[eventType]);\n }\n}\n\nsignals.on('update-pointer-down', ({ interaction, pointer, pointerId, pointerIndex, event, eventTarget, down }) => {\n interaction.pointerIds[pointerIndex] = pointerId;\n interaction.pointers[pointerIndex] = pointer;\n\n if (down) {\n interaction.pointerIsDown = true;\n }\n\n if (!interaction.interacting()) {\n utils.setCoords(interaction.startCoords, interaction.pointers);\n\n utils.copyCoords(interaction.curCoords , interaction.startCoords);\n utils.copyCoords(interaction.prevCoords, interaction.startCoords);\n\n interaction.downEvent = event;\n interaction.downTimes[pointerIndex] = interaction.curCoords.timeStamp;\n interaction.downTargets[pointerIndex] = eventTarget || event && utils.getEventTargets(event)[0];\n interaction.pointerWasMoved = false;\n\n utils.pointerExtend(interaction.downPointer, pointer);\n }\n});\n\nscope.signals.on('add-document' , onDocSignal);\nscope.signals.on('remove-document', onDocSignal);\n\nInteraction.pointerMoveTolerance = 1;\nInteraction.doOnInteractions = doOnInteractions;\nInteraction.endAll = endAll;\nInteraction.signals = signals;\nInteraction.docEvents = docEvents;\n\nscope.endAllInteractions = endAll;\n\nmodule.exports = Interaction;\n","const Interaction = require('../Interaction');\nconst InteractEvent = require('../InteractEvent');\n\nconst actions = {\n firePrepared,\n names: [],\n methodDict: {},\n};\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n interaction._interacting = true;\n firePrepared(interaction, event, 'start');\n});\n\nInteraction.signals.on('action-move', function ({ interaction, event, preEnd }) {\n firePrepared(interaction, event, 'move', preEnd);\n\n // if the action was ended in a listener\n if (!interaction.interacting()) { return false; }\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n firePrepared(interaction, event, 'end');\n});\n\nfunction firePrepared (interaction, event, phase, preEnd) {\n const actionName = interaction.prepared.name;\n\n const newEvent = new InteractEvent(interaction, event, actionName, phase, interaction.element, null, preEnd);\n\n interaction.target.fire(newEvent);\n interaction.prevEvent = newEvent;\n}\n\nmodule.exports = actions;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drag = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n startAxis : 'xy',\n lockAxis : 'xy',\n },\n\n checker: function (pointer, event, interactable) {\n const dragOptions = interactable.options.drag;\n\n return dragOptions.enabled\n ? { name: 'drag', axis: (dragOptions.lockAxis === 'start'\n ? dragOptions.startAxis\n : dragOptions.lockAxis)}\n : null;\n },\n\n getCursor: function () {\n return 'move';\n },\n};\n\nInteraction.signals.on('before-action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n interaction.curCoords.page.y = interaction.startCoords.page.y;\n interaction.curCoords.client.y = interaction.startCoords.client.y;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vx);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vx);\n interaction.pointerDelta.client.vy = 0;\n interaction.pointerDelta.page.vy = 0;\n }\n else if (axis === 'y') {\n interaction.curCoords.page.x = interaction.startCoords.page.x;\n interaction.curCoords.client.x = interaction.startCoords.client.x;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vy);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vy);\n interaction.pointerDelta.client.vx = 0;\n interaction.pointerDelta.page.vx = 0;\n }\n});\n\n// dragmove\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'dragmove') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n iEvent.pageY = interaction.startCoords.page.y;\n iEvent.clientY = interaction.startCoords.client.y;\n iEvent.dy = 0;\n }\n else if (axis === 'y') {\n iEvent.pageX = interaction.startCoords.page.x;\n iEvent.clientX = interaction.startCoords.client.x;\n iEvent.dx = 0;\n }\n});\n\n/*\\\n * Interactable.draggable\n [ method ]\n *\n * Gets or sets whether drag actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of drag events\n | var isDraggable = interact('ul li').draggable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on drag events (object makes the Interactable draggable)\n = (object) This Interactable\n | interact(element).draggable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // the axis in which the first movement must be\n | // for the drag sequence to start\n | // 'xy' by default - any direction\n | startAxis: 'x' || 'y' || 'xy',\n |\n | // 'xy' by default - don't restrict to one axis (move in any direction)\n | // 'x' or 'y' to restrict movement to either axis\n | // 'start' to restrict movement to the axis the drag started in\n | lockAxis: 'x' || 'y' || 'xy' || 'start',\n |\n | // max number of drags that can happen concurrently\n | // with elements of this Interactable. Infinity by default\n | max: Infinity,\n |\n | // max number of drags that can target the same element+Interactable\n | // 1 by default\n | maxPerElement: 2\n | });\n\\*/\nInteractable.prototype.draggable = function (options) {\n if (utils.is.object(options)) {\n this.options.drag.enabled = options.enabled === false? false: true;\n this.setPerAction('drag', options);\n this.setOnEvents('drag', options);\n\n if (/^(xy|x|y|start)$/.test(options.lockAxis)) {\n this.options.drag.lockAxis = options.lockAxis;\n }\n if (/^(xy|x|y)$/.test(options.startAxis)) {\n this.options.drag.startAxis = options.startAxis;\n }\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drag.enabled = options;\n\n if (!options) {\n this.ondragstart = this.ondragstart = this.ondragend = null;\n }\n\n return this;\n }\n\n return this.options.drag;\n};\n\nactions.drag = drag;\nactions.names.push('drag');\nutils.merge(Interactable.eventTypes, [\n 'dragstart',\n 'dragmove',\n 'draginertiastart',\n 'draginertiaresume',\n 'dragend',\n]);\nactions.methodDict.drag = 'draggable';\n\ndefaultOptions.drag = drag.defaults;\n\nmodule.exports = drag;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst scope = require('../scope');\nconst interact = require('../interact');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drop = {\n defaults: {\n enabled: false,\n accept : null,\n overlap: 'pointer',\n },\n};\n\nlet dynamicDrop = false;\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // reset active dropzones\n interaction.activeDrops.dropzones = [];\n interaction.activeDrops.elements = [];\n interaction.activeDrops.rects = [];\n\n interaction.dropEvents = null;\n\n if (!interaction.dynamicDrop) {\n setActiveDrops(interaction, interaction.element);\n }\n\n const dragEvent = interaction.prevEvent;\n const dropEvents = getDropEvents(interaction, event, dragEvent);\n\n if (dropEvents.activate) {\n fireActiveDrops(interaction, dropEvents.activate);\n }\n});\n\nInteractEvent.signals.on('new', function ({ interaction, iEvent, event }) {\n if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { return; }\n\n const draggableElement = interaction.element;\n const dragEvent = iEvent;\n const dropResult = getDrop(dragEvent, event, draggableElement);\n\n interaction.dropTarget = dropResult.dropzone;\n interaction.dropElement = dropResult.element;\n\n interaction.dropEvents = getDropEvents(interaction, event, dragEvent);\n});\n\nInteraction.signals.on('action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n fireDropEvents(interaction, interaction.dropEvents);\n});\n\nInteraction.signals.on('action-end', function ({ interaction }) {\n if (interaction.prepared.name === 'drag') {\n fireDropEvents(interaction, interaction.dropEvents);\n }\n});\n\nInteraction.signals.on('stop-drag', function ({ interaction }) {\n interaction.activeDrops.dropzones =\n interaction.activeDrops.elements =\n interaction.activeDrops.rects =\n interaction.dropEvents = null;\n});\n\nfunction collectDrops (interaction, element) {\n const drops = [];\n const elements = [];\n\n element = element || interaction.element;\n\n // collect all dropzones and their elements which qualify for a drop\n for (const current of scope.interactables) {\n if (!current.options.drop.enabled) { continue; }\n\n const accept = current.options.drop.accept;\n\n // test the draggable element against the dropzone's accept setting\n if ((utils.is.element(accept) && accept !== element)\n || (utils.is.string(accept)\n && !utils.matchesSelector(element, accept))) {\n\n continue;\n }\n\n // query for new elements if necessary\n const dropElements = utils.is.string(current.target)\n ? current._context.querySelectorAll(current.target)\n : [current.target];\n\n for (let i = 0; i < dropElements.length; i++) {\n const currentElement = dropElements[i];\n\n if (currentElement !== element) {\n drops.push(current);\n elements.push(currentElement);\n }\n }\n }\n\n return {\n elements,\n dropzones: drops,\n };\n}\n\nfunction fireActiveDrops (interaction, event) {\n let prevElement;\n\n // loop through all active dropzones and trigger event\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n const current = interaction.activeDrops.dropzones[i];\n const currentElement = interaction.activeDrops.elements [i];\n\n // prevent trigger of duplicate events on same element\n if (currentElement !== prevElement) {\n // set current element as event target\n event.target = currentElement;\n current.fire(event);\n }\n prevElement = currentElement;\n }\n}\n\n// Collect a new set of possible drops and save them in activeDrops.\n// setActiveDrops should always be called when a drag has just started or a\n// drag event happens while dynamicDrop is true\nfunction setActiveDrops (interaction, dragElement) {\n // get dropzones and their elements that could receive the draggable\n const possibleDrops = collectDrops(interaction, dragElement, true);\n\n interaction.activeDrops.dropzones = possibleDrops.dropzones;\n interaction.activeDrops.elements = possibleDrops.elements;\n interaction.activeDrops.rects = [];\n\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n interaction.activeDrops.rects[i] =\n interaction.activeDrops.dropzones[i].getRect(interaction.activeDrops.elements[i]);\n }\n}\n\nfunction getDrop (dragEvent, event, dragElement) {\n const interaction = dragEvent.interaction;\n const validDrops = [];\n\n if (dynamicDrop) {\n setActiveDrops(interaction, dragElement);\n }\n\n // collect all dropzones and their elements which qualify for a drop\n for (let j = 0; j < interaction.activeDrops.dropzones.length; j++) {\n const current = interaction.activeDrops.dropzones[j];\n const currentElement = interaction.activeDrops.elements [j];\n const rect = interaction.activeDrops.rects [j];\n\n validDrops.push(current.dropCheck(dragEvent, event, interaction.target, dragElement, currentElement, rect)\n ? currentElement\n : null);\n }\n\n // get the most appropriate dropzone based on DOM depth and order\n const dropIndex = utils.indexOfDeepestElement(validDrops);\n\n return {\n dropzone: interaction.activeDrops.dropzones[dropIndex] || null,\n element : interaction.activeDrops.elements [dropIndex] || null,\n };\n}\n\nfunction getDropEvents (interaction, pointerEvent, dragEvent) {\n const dropEvents = {\n enter : null,\n leave : null,\n activate : null,\n deactivate: null,\n move : null,\n drop : null,\n };\n\n const tmpl = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n };\n\n if (interaction.dropElement !== interaction.prevDropElement) {\n // if there was a prevDropTarget, create a dragleave event\n if (interaction.prevDropTarget) {\n dropEvents.leave = utils.extend({ type: 'dragleave' }, tmpl);\n\n dragEvent.dragLeave = dropEvents.leave.target = interaction.prevDropElement;\n dragEvent.prevDropzone = dropEvents.leave.dropzone = interaction.prevDropTarget;\n }\n // if the dropTarget is not null, create a dragenter event\n if (interaction.dropTarget) {\n dropEvents.enter = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n type : 'dragenter',\n };\n\n dragEvent.dragEnter = interaction.dropElement;\n dragEvent.dropzone = interaction.dropTarget;\n }\n }\n\n if (dragEvent.type === 'dragend' && interaction.dropTarget) {\n dropEvents.drop = utils.extend({ type: 'drop' }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n dragEvent.relatedTarget = interaction.dropElement;\n }\n if (dragEvent.type === 'dragstart') {\n dropEvents.activate = utils.extend({ type: 'dropactivate' }, tmpl);\n\n dropEvents.activate.target = null;\n dropEvents.activate.dropzone = null;\n }\n if (dragEvent.type === 'dragend') {\n dropEvents.deactivate = utils.extend({ type: 'dropdeactivate' }, tmpl);\n\n dropEvents.deactivate.target = null;\n dropEvents.deactivate.dropzone = null;\n }\n if (dragEvent.type === 'dragmove' && interaction.dropTarget) {\n dropEvents.move = utils.extend({\n dragmove : dragEvent,\n type : 'dropmove',\n }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n }\n\n return dropEvents;\n}\n\nfunction fireDropEvents (interaction, dropEvents) {\n if (dropEvents.leave) { interaction.prevDropTarget.fire(dropEvents.leave); }\n if (dropEvents.move ) { interaction.dropTarget.fire(dropEvents.move ); }\n if (dropEvents.enter) { interaction.dropTarget.fire(dropEvents.enter); }\n if (dropEvents.drop ) { interaction.dropTarget.fire(dropEvents.drop ); }\n if (dropEvents.deactivate) {\n fireActiveDrops(interaction, dropEvents.deactivate);\n }\n\n interaction.prevDropTarget = interaction.dropTarget;\n interaction.prevDropElement = interaction.dropElement;\n}\n\n/*\\\n * Interactable.dropzone\n [ method ]\n *\n * Returns or sets whether elements can be dropped onto this\n * Interactable to trigger drop events\n *\n * Dropzones can receive the following events:\n * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends\n * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone\n * - `dragmove` when a draggable that has entered the dropzone is moved\n * - `drop` when a draggable is dropped into this dropzone\n *\n * Use the `accept` option to allow only elements that match the given CSS\n * selector or element. The value can be:\n *\n * - **an Element** - only that element can be dropped into this dropzone.\n * - **a string**, - the element being dragged must match it as a CSS selector.\n * - **`null`** - accept options is cleared - it accepts any element.\n *\n * Use the `overlap` option to set how drops are checked for. The allowed\n * values are:\n *\n * - `'pointer'`, the pointer must be over the dropzone (default)\n * - `'center'`, the draggable element's center must be over the dropzone\n * - a number from 0-1 which is the `(intersection area) / (draggable area)`.\n * e.g. `0.5` for drop to happen when half of the area of the draggable is\n * over the dropzone\n *\n * Use the `checker` option to specify a function to check if a dragged\n * element is over this Interactable.\n *\n | interact(target)\n | .dropChecker(function(dragEvent, // related dragmove or dragend event\n | event, // TouchEvent/PointerEvent/MouseEvent\n | dropped, // bool result of the default checker\n | dropzone, // dropzone Interactable\n | dropElement, // dropzone elemnt\n | draggable, // draggable Interactable\n | draggableElement) {// draggable element\n |\n | return dropped && event.target.hasAttribute('allow-drop');\n | }\n *\n *\n - options (boolean | object | null) #optional The new value to be set.\n | interact('.drop').dropzone({\n | accept: '.can-drop' || document.getElementById('single-drop'),\n | overlap: 'pointer' || 'center' || zeroToOne\n | }\n = (boolean | object) The current setting or this Interactable\n\\*/\nInteractable.prototype.dropzone = function (options) {\n if (utils.is.object(options)) {\n this.options.drop.enabled = options.enabled === false? false: true;\n\n if (utils.is.function(options.ondrop) ) { this.events.ondrop = options.ondrop ; }\n if (utils.is.function(options.ondropactivate) ) { this.events.ondropactivate = options.ondropactivate ; }\n if (utils.is.function(options.ondropdeactivate)) { this.events.ondropdeactivate = options.ondropdeactivate; }\n if (utils.is.function(options.ondragenter) ) { this.events.ondragenter = options.ondragenter ; }\n if (utils.is.function(options.ondragleave) ) { this.events.ondragleave = options.ondragleave ; }\n if (utils.is.function(options.ondropmove) ) { this.events.ondropmove = options.ondropmove ; }\n\n if (/^(pointer|center)$/.test(options.overlap)) {\n this.options.drop.overlap = options.overlap;\n }\n else if (utils.is.number(options.overlap)) {\n this.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0);\n }\n if ('accept' in options) {\n this.options.drop.accept = options.accept;\n }\n if ('checker' in options) {\n this.options.drop.checker = options.checker;\n }\n\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drop.enabled = options;\n\n if (!options) {\n this.ondragenter = this.ondragleave = this.ondrop\n = this.ondropactivate = this.ondropdeactivate = null;\n }\n\n return this;\n }\n\n return this.options.drop;\n};\n\nInteractable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) {\n let dropped = false;\n\n // if the dropzone has no rect (eg. display: none)\n // call the custom dropChecker or just return false\n if (!(rect = rect || this.getRect(dropElement))) {\n return (this.options.drop.checker\n ? this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement)\n : false);\n }\n\n const dropOverlap = this.options.drop.overlap;\n\n if (dropOverlap === 'pointer') {\n const origin = utils.getOriginXY(draggable, draggableElement, 'drag');\n const page = utils.getPageXY(dragEvent);\n\n page.x += origin.x;\n page.y += origin.y;\n\n const horizontal = (page.x > rect.left) && (page.x < rect.right);\n const vertical = (page.y > rect.top ) && (page.y < rect.bottom);\n\n dropped = horizontal && vertical;\n }\n\n const dragRect = draggable.getRect(draggableElement);\n\n if (dragRect && dropOverlap === 'center') {\n const cx = dragRect.left + dragRect.width / 2;\n const cy = dragRect.top + dragRect.height / 2;\n\n dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom;\n }\n\n if (dragRect && utils.is.number(dropOverlap)) {\n const overlapArea = (Math.max(0, Math.min(rect.right , dragRect.right ) - Math.max(rect.left, dragRect.left))\n * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top , dragRect.top )));\n\n const overlapRatio = overlapArea / (dragRect.width * dragRect.height);\n\n dropped = overlapRatio >= dropOverlap;\n }\n\n if (this.options.drop.checker) {\n dropped = this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement);\n }\n\n return dropped;\n};\n\nInteractable.signals.on('unset', function ({ interactable }) {\n interactable.dropzone(false);\n});\n\nInteractable.settingsMethods.push('dropChecker');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.dropTarget = null; // the dropzone a drag target might be dropped into\n interaction.dropElement = null; // the element at the time of checking\n interaction.prevDropTarget = null; // the dropzone that was recently dragged away from\n interaction.prevDropElement = null; // the element at the time of checking\n interaction.dropEvents = null; // the dropEvents related to the current drag event\n\n interaction.activeDrops = {\n dropzones: [], // the dropzones that are mentioned below\n elements : [], // elements of dropzones that accept the target draggable\n rects : [], // the rects of the elements mentioned above\n };\n\n});\n\nInteraction.signals.on('stop', function ({ interaction }) {\n interaction.dropTarget = interaction.dropElement =\n interaction.prevDropTarget = interaction.prevDropElement = null;\n});\n\n/*\\\n * interact.dynamicDrop\n [ method ]\n *\n * Returns or sets whether the dimensions of dropzone elements are\n * calculated on every dragmove or only on dragstart for the default\n * dropChecker\n *\n - newValue (boolean) #optional True to check on each move. False to check only before start\n = (boolean | interact) The current setting or interact\n\\*/\ninteract.dynamicDrop = function (newValue) {\n if (utils.is.bool(newValue)) {\n //if (dragging && dynamicDrop !== newValue && !newValue) {\n //calcRects(dropzones);\n //}\n\n dynamicDrop = newValue;\n\n return interact;\n }\n return dynamicDrop;\n};\n\nutils.merge(Interactable.eventTypes, [\n 'dragenter',\n 'dragleave',\n 'dropactivate',\n 'dropdeactivate',\n 'dropmove',\n 'drop',\n]);\nactions.methodDict.drop = 'dropzone';\n\ndefaultOptions.drop = drop.defaults;\n\nmodule.exports = drop;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst gesture = {\n defaults: {\n enabled : false,\n origin : null,\n restrict: null,\n },\n\n checker: function (pointer, event, interactable, element, interaction) {\n if (interaction.pointerIds.length >= 2) {\n return { name: 'gesture' };\n }\n\n return null;\n },\n\n getCursor: function () {\n return '';\n },\n};\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturestart') { return; }\n iEvent.ds = 0;\n\n interaction.gesture.startDistance = interaction.gesture.prevDistance = iEvent.distance;\n interaction.gesture.startAngle = interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.scale = 1;\n});\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturemove') { return; }\n\n iEvent.ds = iEvent.scale - interaction.gesture.scale;\n\n interaction.target.fire(iEvent);\n\n interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.prevDistance = iEvent.distance;\n\n if (iEvent.scale !== Infinity\n && iEvent.scale !== null\n && iEvent.scale !== undefined\n && !isNaN(iEvent.scale)) {\n\n interaction.gesture.scale = iEvent.scale;\n }\n});\n\n/*\\\n * Interactable.gesturable\n [ method ]\n *\n * Gets or sets whether multitouch gestures can be performed on the\n * Interactable's element\n *\n = (boolean) Indicates if this can be the target of gesture events\n | var isGestureable = interact(element).gesturable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on gesture events (makes the Interactable gesturable)\n = (object) this Interactable\n | interact(element).gesturable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // limit multiple gestures.\n | // See the explanation in @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n\\*/\nInteractable.prototype.gesturable = function (options) {\n if (utils.is.object(options)) {\n this.options.gesture.enabled = options.enabled === false? false: true;\n this.setPerAction('gesture', options);\n this.setOnEvents('gesture', options);\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.gesture.enabled = options;\n\n if (!options) {\n this.ongesturestart = this.ongesturestart = this.ongestureend = null;\n }\n\n return this;\n }\n\n return this.options.gesture;\n};\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action, event, starting, ending, deltaSource }) {\n if (action !== 'gesture') { return; }\n\n const pointers = interaction.pointers;\n\n iEvent.touches = [pointers[0], pointers[1]];\n\n if (starting) {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = 1;\n iEvent.ds = 0;\n iEvent.angle = utils.touchAngle(pointers, undefined, deltaSource);\n iEvent.da = 0;\n }\n else if (ending || event instanceof InteractEvent) {\n iEvent.distance = interaction.prevEvent.distance;\n iEvent.box = interaction.prevEvent.box;\n iEvent.scale = interaction.prevEvent.scale;\n iEvent.ds = iEvent.scale - 1;\n iEvent.angle = interaction.prevEvent.angle;\n iEvent.da = iEvent.angle - interaction.gesture.startAngle;\n }\n else {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = iEvent.distance / interaction.gesture.startDistance;\n iEvent.angle = utils.touchAngle(pointers, interaction.gesture.prevAngle, deltaSource);\n\n iEvent.ds = iEvent.scale - interaction.gesture.prevScale;\n iEvent.da = iEvent.angle - interaction.gesture.prevAngle;\n }\n});\n\nInteraction.signals.on('new', function (interaction) {\n interaction.gesture = {\n start: { x: 0, y: 0 },\n\n startDistance: 0, // distance between two touches of touchStart\n prevDistance : 0,\n distance : 0,\n\n scale: 1, // gesture.distance / gesture.startDistance\n\n startAngle: 0, // angle of line joining two touches\n prevAngle : 0, // angle of the previous gesture event\n };\n});\n\nactions.gesture = gesture;\nactions.names.push('gesture');\nutils.merge(Interactable.eventTypes, [\n 'gesturestart',\n 'gesturemove',\n 'gestureend',\n]);\nactions.methodDict.gesture = 'gesturable';\n\ndefaultOptions.gesture = gesture.defaults;\n\nmodule.exports = gesture;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\n// Less Precision with touch input\nconst defaultMargin = browser.supportsTouch || browser.supportsPointerEvent? 20: 10;\n\nconst resize = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n square: false,\n preserveAspectRatio: false,\n axis: 'xy',\n\n // use default margin\n margin: NaN,\n\n // object with props left, right, top, bottom which are\n // true/false values to resize when the pointer is over that edge,\n // CSS selectors to match the handles for each direction\n // or the Elements for each handle\n edges: null,\n\n // a value of 'none' will limit the resize rect to a minimum of 0x0\n // 'negate' will alow the rect to have negative width/height\n // 'reposition' will keep the width/height positive by swapping\n // the top and bottom edges and/or swapping the left and right edges\n invert: 'none',\n },\n\n checker: function (pointer, event, interactable, element, interaction, rect) {\n if (!rect) { return null; }\n\n const page = utils.extend({}, interaction.curCoords.page);\n const options = interactable.options;\n\n if (options.resize.enabled) {\n const resizeOptions = options.resize;\n const resizeEdges = { left: false, right: false, top: false, bottom: false };\n\n // if using resize.edges\n if (utils.is.object(resizeOptions.edges)) {\n for (const edge in resizeEdges) {\n resizeEdges[edge] = checkResizeEdge(edge,\n resizeOptions.edges[edge],\n page,\n interaction._eventTarget,\n element,\n rect,\n resizeOptions.margin || defaultMargin);\n }\n\n resizeEdges.left = resizeEdges.left && !resizeEdges.right;\n resizeEdges.top = resizeEdges.top && !resizeEdges.bottom;\n\n if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) {\n return {\n name: 'resize',\n edges: resizeEdges,\n };\n }\n }\n else {\n const right = options.resize.axis !== 'y' && page.x > (rect.right - defaultMargin);\n const bottom = options.resize.axis !== 'x' && page.y > (rect.bottom - defaultMargin);\n\n if (right || bottom) {\n return {\n name: 'resize',\n axes: (right? 'x' : '') + (bottom? 'y' : ''),\n };\n }\n }\n }\n\n return null;\n },\n\n cursors: (browser.isIe9OrOlder ? {\n x : 'e-resize',\n y : 's-resize',\n xy: 'se-resize',\n\n top : 'n-resize',\n left : 'w-resize',\n bottom : 's-resize',\n right : 'e-resize',\n topleft : 'se-resize',\n bottomright: 'se-resize',\n topright : 'ne-resize',\n bottomleft : 'ne-resize',\n } : {\n x : 'ew-resize',\n y : 'ns-resize',\n xy: 'nwse-resize',\n\n top : 'ns-resize',\n left : 'ew-resize',\n bottom : 'ns-resize',\n right : 'ew-resize',\n topleft : 'nwse-resize',\n bottomright: 'nwse-resize',\n topright : 'nesw-resize',\n bottomleft : 'nesw-resize',\n }),\n\n getCursor: function (action) {\n if (action.axis) {\n return resize.cursors[action.name + action.axis];\n }\n else if (action.edges) {\n let cursorKey = '';\n const edgeNames = ['top', 'bottom', 'left', 'right'];\n\n for (let i = 0; i < 4; i++) {\n if (action.edges[edgeNames[i]]) {\n cursorKey += edgeNames[i];\n }\n }\n\n return resize.cursors[cursorKey];\n }\n },\n};\n\n// resizestart\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'resizestart' || !interaction.prepared.edges) {\n return;\n }\n\n const startRect = interaction.target.getRect(interaction.element);\n const resizeOptions = interaction.target.options.resize;\n\n /*\n * When using the `resizable.square` or `resizable.preserveAspectRatio` options, resizing from one edge\n * will affect another. E.g. with `resizable.square`, resizing to make the right edge larger will make\n * the bottom edge larger by the same amount. We call these 'linked' edges. Any linked edges will depend\n * on the active edges and the edge being interacted with.\n */\n if (resizeOptions.square || resizeOptions.preserveAspectRatio) {\n const linkedEdges = utils.extend({}, interaction.prepared.edges);\n\n linkedEdges.top = linkedEdges.top || (linkedEdges.left && !linkedEdges.bottom);\n linkedEdges.left = linkedEdges.left || (linkedEdges.top && !linkedEdges.right );\n linkedEdges.bottom = linkedEdges.bottom || (linkedEdges.right && !linkedEdges.top );\n linkedEdges.right = linkedEdges.right || (linkedEdges.bottom && !linkedEdges.left );\n\n interaction.prepared._linkedEdges = linkedEdges;\n }\n else {\n interaction.prepared._linkedEdges = null;\n }\n\n // if using `resizable.preserveAspectRatio` option, record aspect ratio at the start of the resize\n if (resizeOptions.preserveAspectRatio) {\n interaction.resizeStartAspectRatio = startRect.width / startRect.height;\n }\n\n interaction.resizeRects = {\n start : startRect,\n current : utils.extend({}, startRect),\n inverted : utils.extend({}, startRect),\n previous : utils.extend({}, startRect),\n delta : {\n left: 0, right : 0, width : 0,\n top : 0, bottom: 0, height: 0,\n },\n };\n\n iEvent.rect = interaction.resizeRects.inverted;\n iEvent.deltaRect = interaction.resizeRects.delta;\n});\n\n// resizemove\nInteractEvent.signals.on('new', function ({ iEvent, phase, interaction }) {\n if (phase !== 'move' || !interaction.prepared.edges) { return; }\n\n const resizeOptions = interaction.target.options.resize;\n const invert = resizeOptions.invert;\n const invertible = invert === 'reposition' || invert === 'negate';\n\n let edges = interaction.prepared.edges;\n\n const start = interaction.resizeRects.start;\n const current = interaction.resizeRects.current;\n const inverted = interaction.resizeRects.inverted;\n const delta = interaction.resizeRects.delta;\n const previous = utils.extend(interaction.resizeRects.previous, inverted);\n const originalEdges = edges;\n\n let dx = iEvent.dx;\n let dy = iEvent.dy;\n\n if (resizeOptions.preserveAspectRatio || resizeOptions.square) {\n // `resize.preserveAspectRatio` takes precedence over `resize.square`\n const startAspectRatio = resizeOptions.preserveAspectRatio\n ? interaction.resizeStartAspectRatio\n : 1;\n\n edges = interaction.prepared._linkedEdges;\n\n if ((originalEdges.left && originalEdges.bottom)\n || (originalEdges.right && originalEdges.top)) {\n dy = -dx / startAspectRatio;\n }\n else if (originalEdges.left || originalEdges.right ) { dy = dx / startAspectRatio; }\n else if (originalEdges.top || originalEdges.bottom) { dx = dy * startAspectRatio; }\n }\n\n // update the 'current' rect without modifications\n if (edges.top ) { current.top += dy; }\n if (edges.bottom) { current.bottom += dy; }\n if (edges.left ) { current.left += dx; }\n if (edges.right ) { current.right += dx; }\n\n if (invertible) {\n // if invertible, copy the current rect\n utils.extend(inverted, current);\n\n if (invert === 'reposition') {\n // swap edge values if necessary to keep width/height positive\n let swap;\n\n if (inverted.top > inverted.bottom) {\n swap = inverted.top;\n\n inverted.top = inverted.bottom;\n inverted.bottom = swap;\n }\n if (inverted.left > inverted.right) {\n swap = inverted.left;\n\n inverted.left = inverted.right;\n inverted.right = swap;\n }\n }\n }\n else {\n // if not invertible, restrict to minimum of 0x0 rect\n inverted.top = Math.min(current.top, start.bottom);\n inverted.bottom = Math.max(current.bottom, start.top);\n inverted.left = Math.min(current.left, start.right);\n inverted.right = Math.max(current.right, start.left);\n }\n\n inverted.width = inverted.right - inverted.left;\n inverted.height = inverted.bottom - inverted.top ;\n\n for (const edge in inverted) {\n delta[edge] = inverted[edge] - previous[edge];\n }\n\n iEvent.edges = interaction.prepared.edges;\n iEvent.rect = inverted;\n iEvent.deltaRect = delta;\n});\n\n/*\\\n * Interactable.resizable\n [ method ]\n *\n * Gets or sets whether resize actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of resize elements\n | var isResizeable = interact('input[type=text]').resizable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on resize events (object makes the Interactable resizable)\n = (object) This Interactable\n | interact(element).resizable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | edges: {\n | top : true, // Use pointer coords to check for resize.\n | left : false, // Disable resizing from left edge.\n | bottom: '.resize-s',// Resize if pointer target matches selector\n | right : handleEl // Resize if pointer target is the given Element\n | },\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height are adjusted at a 1:1 ratio.\n | square: false,\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height maintain the aspect ratio they had when resizing started.\n | preserveAspectRatio: false,\n |\n | // a value of 'none' will limit the resize rect to a minimum of 0x0\n | // 'negate' will allow the rect to have negative width/height\n | // 'reposition' will keep the width/height positive by swapping\n | // the top and bottom edges and/or swapping the left and right edges\n | invert: 'none' || 'negate' || 'reposition'\n |\n | // limit multiple resizes.\n | // See the explanation in the @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n \\*/\nInteractable.prototype.resizable = function (options) {\n if (utils.is.object(options)) {\n this.options.resize.enabled = options.enabled === false? false: true;\n this.setPerAction('resize', options);\n this.setOnEvents('resize', options);\n\n if (/^x$|^y$|^xy$/.test(options.axis)) {\n this.options.resize.axis = options.axis;\n }\n else if (options.axis === null) {\n this.options.resize.axis = defaultOptions.resize.axis;\n }\n\n if (utils.is.bool(options.preserveAspectRatio)) {\n this.options.resize.preserveAspectRatio = options.preserveAspectRatio;\n }\n else if (utils.is.bool(options.square)) {\n this.options.resize.square = options.square;\n }\n\n return this;\n }\n if (utils.is.bool(options)) {\n this.options.resize.enabled = options;\n\n if (!options) {\n this.onresizestart = this.onresizestart = this.onresizeend = null;\n }\n\n return this;\n }\n return this.options.resize;\n};\n\nfunction checkResizeEdge (name, value, page, element, interactableElement, rect, margin) {\n // false, '', undefined, null\n if (!value) { return false; }\n\n // true value, use pointer coords and element rect\n if (value === true) {\n // if dimensions are negative, \"switch\" edges\n const width = utils.is.number(rect.width )? rect.width : rect.right - rect.left;\n const height = utils.is.number(rect.height)? rect.height : rect.bottom - rect.top ;\n\n if (width < 0) {\n if (name === 'left' ) { name = 'right'; }\n else if (name === 'right') { name = 'left' ; }\n }\n if (height < 0) {\n if (name === 'top' ) { name = 'bottom'; }\n else if (name === 'bottom') { name = 'top' ; }\n }\n\n if (name === 'left' ) { return page.x < ((width >= 0? rect.left: rect.right ) + margin); }\n if (name === 'top' ) { return page.y < ((height >= 0? rect.top : rect.bottom) + margin); }\n\n if (name === 'right' ) { return page.x > ((width >= 0? rect.right : rect.left) - margin); }\n if (name === 'bottom') { return page.y > ((height >= 0? rect.bottom: rect.top ) - margin); }\n }\n\n // the remaining checks require an element\n if (!utils.is.element(element)) { return false; }\n\n return utils.is.element(value)\n // the value is an element to use as a resize handle\n ? value === element\n // otherwise check if element matches value as selector\n : utils.matchesUpTo(element, value, interactableElement);\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.resizeAxes = 'xy';\n});\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action }) {\n if (action !== 'resize' || !interaction.resizeAxes) { return; }\n\n const options = interaction.target.options;\n\n if (options.resize.square) {\n if (interaction.resizeAxes === 'y') {\n iEvent.dx = iEvent.dy;\n }\n else {\n iEvent.dy = iEvent.dx;\n }\n iEvent.axes = 'xy';\n }\n else {\n iEvent.axes = interaction.resizeAxes;\n\n if (interaction.resizeAxes === 'x') {\n iEvent.dy = 0;\n }\n else if (interaction.resizeAxes === 'y') {\n iEvent.dx = 0;\n }\n }\n});\n\nactions.resize = resize;\nactions.names.push('resize');\nutils.merge(Interactable.eventTypes, [\n 'resizestart',\n 'resizemove',\n 'resizeinertiastart',\n 'resizeinertiaresume',\n 'resizeend',\n]);\nactions.methodDict.resize = 'resizable';\n\ndefaultOptions.resize = resize.defaults;\n\nmodule.exports = resize;\n","const raf = require('./utils/raf');\nconst getWindow = require('./utils/window').getWindow;\nconst is = require('./utils/is');\nconst domUtils = require('./utils/domUtils');\nconst Interaction = require('./Interaction');\nconst defaultOptions = require('./defaultOptions');\n\nconst autoScroll = {\n defaults: {\n enabled : false,\n container: null, // the item that is scrolled (Window or HTMLElement)\n margin : 60,\n speed : 300, // the scroll speed in pixels per second\n },\n\n interaction: null,\n i: null, // the handle returned by window.setInterval\n x: 0, y: 0, // Direction each pulse is to scroll in\n\n isScrolling: false,\n prevTime: 0,\n\n start: function (interaction) {\n autoScroll.isScrolling = true;\n raf.cancel(autoScroll.i);\n\n autoScroll.interaction = interaction;\n autoScroll.prevTime = new Date().getTime();\n autoScroll.i = raf.request(autoScroll.scroll);\n },\n\n stop: function () {\n autoScroll.isScrolling = false;\n raf.cancel(autoScroll.i);\n },\n\n // scroll the window by the values in scroll.x/y\n scroll: function () {\n const options = autoScroll.interaction.target.options[autoScroll.interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(autoScroll.interaction.element);\n const now = new Date().getTime();\n // change in time in seconds\n const dt = (now - autoScroll.prevTime) / 1000;\n // displacement\n const s = options.speed * dt;\n\n if (s >= 1) {\n if (is.window(container)) {\n container.scrollBy(autoScroll.x * s, autoScroll.y * s);\n }\n else if (container) {\n container.scrollLeft += autoScroll.x * s;\n container.scrollTop += autoScroll.y * s;\n }\n\n autoScroll.prevTime = now;\n }\n\n if (autoScroll.isScrolling) {\n raf.cancel(autoScroll.i);\n autoScroll.i = raf.request(autoScroll.scroll);\n }\n },\n check: function (interactable, actionName) {\n const options = interactable.options;\n\n return options[actionName].autoScroll && options[actionName].autoScroll.enabled;\n },\n onInteractionMove: function ({ interaction, pointer }) {\n if (!(interaction.interacting()\n && autoScroll.check(interaction.target, interaction.prepared.name))) {\n return;\n }\n\n if (interaction.simulation) {\n autoScroll.x = autoScroll.y = 0;\n return;\n }\n\n let top;\n let right;\n let bottom;\n let left;\n\n const options = interaction.target.options[interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(interaction.element);\n\n if (is.window(container)) {\n left = pointer.clientX < autoScroll.margin;\n top = pointer.clientY < autoScroll.margin;\n right = pointer.clientX > container.innerWidth - autoScroll.margin;\n bottom = pointer.clientY > container.innerHeight - autoScroll.margin;\n }\n else {\n const rect = domUtils.getElementClientRect(container);\n\n left = pointer.clientX < rect.left + autoScroll.margin;\n top = pointer.clientY < rect.top + autoScroll.margin;\n right = pointer.clientX > rect.right - autoScroll.margin;\n bottom = pointer.clientY > rect.bottom - autoScroll.margin;\n }\n\n autoScroll.x = (right ? 1: left? -1: 0);\n autoScroll.y = (bottom? 1: top? -1: 0);\n\n if (!autoScroll.isScrolling) {\n // set the autoScroll properties to those of the target\n autoScroll.margin = options.margin;\n autoScroll.speed = options.speed;\n\n autoScroll.start(interaction);\n }\n },\n};\n\nInteraction.signals.on('stop-active', function () {\n autoScroll.stop();\n});\n\nInteraction.signals.on('action-move', autoScroll.onInteractionMove);\n\ndefaultOptions.perAction.autoScroll = autoScroll.defaults;\n\nmodule.exports = autoScroll;\n","const Interactable = require('../Interactable');\nconst actions = require('../actions/base');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.ignoreFrom\n [ method ]\n *\n * If the target of the `mousedown`, `pointerdown` or `touchstart`\n * event or any of it's parents match the given CSS selector or\n * Element, no drag/resize/gesture is started.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to not ignore any elements\n = (string | Element | object) The current ignoreFrom value or this Interactable\n **\n | interact(element, { ignoreFrom: document.getElementById('no-action') });\n | // or\n | interact(element).ignoreFrom('input, textarea, a');\n\\*/\nInteractable.prototype.ignoreFrom = function (newValue) {\n return this._backCompatOption('ignoreFrom', newValue);\n};\n\n/*\\\n * Interactable.allowFrom\n [ method ]\n *\n * A drag/resize/gesture is started only If the target of the\n * `mousedown`, `pointerdown` or `touchstart` event or any of it's\n * parents match the given CSS selector or Element.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to allow from any element\n = (string | Element | object) The current allowFrom value or this Interactable\n **\n | interact(element, { allowFrom: document.getElementById('drag-handle') });\n | // or\n | interact(element).allowFrom('.handle');\n\\*/\nInteractable.prototype.allowFrom = function (newValue) {\n return this._backCompatOption('allowFrom', newValue);\n};\n\nInteractable.prototype.testIgnore = function (ignoreFrom, interactableElement, element) {\n if (!ignoreFrom || !is.element(element)) { return false; }\n\n if (is.string(ignoreFrom)) {\n return domUtils.matchesUpTo(element, ignoreFrom, interactableElement);\n }\n else if (is.element(ignoreFrom)) {\n return domUtils.nodeContains(ignoreFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testAllow = function (allowFrom, interactableElement, element) {\n if (!allowFrom) { return true; }\n\n if (!is.element(element)) { return false; }\n\n if (is.string(allowFrom)) {\n return domUtils.matchesUpTo(element, allowFrom, interactableElement);\n }\n else if (is.element(allowFrom)) {\n return domUtils.nodeContains(allowFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testIgnoreAllow = function (options, interactableElement, eventTarget) {\n return (!this.testIgnore(options.ignoreFrom, interactableElement, eventTarget)\n && this.testAllow(options.allowFrom, interactableElement, eventTarget));\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (event.buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\n","const interact = require('../interact');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst actions = require('../actions/base');\nconst defaultOptions = require('../defaultOptions');\nconst browser = require('../utils/browser');\nconst scope = require('../scope');\nconst utils = require('../utils');\nconst signals = require('../utils/Signals').new();\n\nrequire('./InteractableMethods');\n\nconst autoStart = {\n signals,\n withinInteractionLimit,\n // Allow this many interactions to happen simultaneously\n maxInteractions: Infinity,\n defaults: {\n perAction: {\n manualStart: false,\n max: Infinity,\n maxPerElement: 1,\n allowFrom: null,\n ignoreFrom: null,\n },\n },\n setActionDefaults: function (action) {\n utils.extend(action.defaults, autoStart.defaults.perAction);\n },\n};\n\n// set cursor style on mousedown\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget }) {\n if (interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\n// set cursor style on mousemove\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget }) {\n if (!interaction.mouse\n || interaction.pointerIsDown\n || interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\nInteraction.signals.on('move', function (arg) {\n const { interaction, event } = arg;\n\n if (!interaction.pointerIsDown\n || interaction.interacting()\n || !interaction.pointerWasMoved\n || !interaction.prepared.name) {\n return;\n }\n\n signals.fire('before-start', arg);\n\n const target = interaction.target;\n\n if (interaction.prepared.name && target) {\n // check manualStart and interaction limit\n if (target.options[interaction.prepared.name].manualStart\n || !withinInteractionLimit(target, interaction.element, interaction.prepared)) {\n interaction.stop(event);\n }\n else {\n interaction.start(interaction.prepared, target, interaction.element);\n }\n }\n});\n\n// Check if the current target supports the action.\n// If so, return the validated action. Otherwise, return null\nfunction validateAction (action, interactable, element, eventTarget) {\n if (utils.is.object(action)\n && interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget)\n && interactable.options[action.name].enabled\n && withinInteractionLimit(interactable, element, action)) {\n return action;\n }\n\n return null;\n}\n\nfunction validateSelector (interaction, pointer, event, matches, matchElements, eventTarget) {\n for (let i = 0, len = matches.length; i < len; i++) {\n const match = matches[i];\n const matchElement = matchElements[i];\n const action = validateAction(match.getAction(pointer, event, interaction, matchElement),\n match,\n matchElement,\n eventTarget);\n\n if (action) {\n return {\n action,\n target: match,\n element: matchElement,\n };\n }\n }\n\n return {};\n}\n\nfunction getActionInfo (interaction, pointer, event, eventTarget) {\n let matches = [];\n let matchElements = [];\n\n let element = eventTarget;\n let action = null;\n\n function pushMatches (interactable, selector, context) {\n const elements = (browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined);\n\n if (utils.matchesSelector(element, selector, elements)) {\n\n matches.push(interactable);\n matchElements.push(element);\n }\n }\n\n while (utils.is.element(element)) {\n matches = [];\n matchElements = [];\n\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && (action = validateAction(elementInteractable.getAction(pointer, event, interaction, element, eventTarget),\n elementInteractable,\n element,\n eventTarget))\n && !elementInteractable.options[action.name].manualStart) {\n return {\n element,\n action,\n target: elementInteractable,\n };\n }\n else {\n scope.interactables.forEachSelector(pushMatches, element);\n\n const actionInfo = validateSelector(interaction, pointer, event, matches, matchElements, eventTarget);\n\n if (actionInfo.action\n && !actionInfo.target.options[actionInfo.action.name].manualStart) {\n return actionInfo;\n }\n }\n\n element = utils.parentNode(element);\n }\n\n return {};\n}\n\nfunction prepare (interaction, { action, target, element }) {\n action = action || {};\n\n if (interaction.target && interaction.target.options.styleCursor) {\n interaction.target._doc.documentElement.style.cursor = '';\n }\n\n interaction.target = target;\n interaction.element = element;\n utils.copyAction(interaction.prepared, action);\n\n if (target && target.options.styleCursor) {\n const cursor = action? actions[action.name].getCursor(action) : '';\n interaction.target._doc.documentElement.style.cursor = cursor;\n }\n\n signals.fire('prepared', { interaction: interaction });\n}\n\nInteraction.signals.on('stop', function ({ interaction }) {\n const target = interaction.target;\n\n if (target && target.options.styleCursor) {\n target._doc.documentElement.style.cursor = '';\n }\n});\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (utils.is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (utils.is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n const buttons = event.buttons || ({\n 0: 1,\n 1: 4,\n 3: 8,\n 4: 16,\n })[event.button];\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\nfunction withinInteractionLimit (interactable, element, action) {\n const options = interactable.options;\n const maxActions = options[action.name].max;\n const maxPerElement = options[action.name].maxPerElement;\n let activeInteractions = 0;\n let targetCount = 0;\n let targetElementCount = 0;\n\n // no actions if any of these values == 0\n if (!(maxActions && maxPerElement && autoStart.maxInteractions)) { return; }\n\n for (let i = 0, len = scope.interactions.length; i < len; i++) {\n const interaction = scope.interactions[i];\n const otherAction = interaction.prepared.name;\n\n if (!interaction.interacting()) { continue; }\n\n activeInteractions++;\n\n if (activeInteractions >= autoStart.maxInteractions) {\n return false;\n }\n\n if (interaction.target !== interactable) { continue; }\n\n targetCount += (otherAction === action.name)|0;\n\n if (targetCount >= maxActions) {\n return false;\n }\n\n if (interaction.element === element) {\n targetElementCount++;\n\n if (otherAction !== action.name || targetElementCount >= maxPerElement) {\n return false;\n }\n }\n }\n\n return autoStart.maxInteractions > 0;\n}\n\n/*\\\n * interact.maxInteractions\n [ method ]\n **\n * Returns or sets the maximum number of concurrent interactions allowed.\n * By default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables\n * and elements, you need to enable it in the draggable, resizable and\n * gesturable `'max'` and `'maxPerElement'` options.\n **\n - newValue (number) #optional Any number. newValue <= 0 means no interactions.\n\\*/\ninteract.maxInteractions = function (newValue) {\n if (utils.is.number(newValue)) {\n autoStart.maxInteractions = newValue;\n\n return this;\n }\n\n return autoStart.maxInteractions;\n};\n\nInteractable.settingsMethods.push('styleCursor');\nInteractable.settingsMethods.push('actionChecker');\nInteractable.settingsMethods.push('ignoreFrom');\nInteractable.settingsMethods.push('allowFrom');\n\ndefaultOptions.base.actionChecker = null;\ndefaultOptions.base.styleCursor = true;\n\nutils.extend(defaultOptions.perAction, autoStart.defaults.perAction);\n\nmodule.exports = autoStart;\n","const autoStart = require('./base');\nconst Interaction = require('../Interaction');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.delayTimer = null;\n});\n\nautoStart.signals.on('prepared', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.delayTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.target, interaction.element);\n }, delay);\n }\n});\n\nInteraction.signals.on('move', function ({ interaction, duplicate }) {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.delayTimer);\n }\n});\n\n// prevent regular down->move autoStart\nautoStart.signals.on('before-start', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.prepared.name = null;\n }\n});\n","const autoStart = require('./base');\nconst scope = require('../scope');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\n\nconst { matchesSelector, parentNode } = require('../utils/domUtils');\n\nautoStart.setActionDefaults(require('../actions/drag'));\n\nautoStart.signals.on('before-start', function ({ interaction, eventTarget, dx, dy }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // check if a drag is in the correct axis\n const absX = Math.abs(dx);\n const absY = Math.abs(dy);\n const options = interaction.target.options.drag;\n const startAxis = options.startAxis;\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy');\n\n interaction.prepared.axis = options.lockAxis === 'start'\n ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n : options.lockAxis;\n\n // if the movement isn't in the startAxis of the interactable\n if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) {\n // cancel the prepared action\n interaction.prepared.name = null;\n\n // then try to get a drag from another ineractable\n\n if (!interaction.prepared.name) {\n\n let element = eventTarget;\n\n const getDraggable = function (interactable, selector, context) {\n const elements = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n if (interactable === interaction.target) { return; }\n\n if (!options.manualStart\n && !interactable.testIgnoreAllow(options, element, eventTarget)\n && matchesSelector(element, selector, elements)) {\n\n const action = interactable.getAction(interaction.downPointer,\n interaction.downEvent,\n interaction,\n element);\n\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, interactable)\n && autoStart.validateAction(action, interactable, element, eventTarget)) {\n\n return interactable;\n }\n }\n };\n\n let action = null;\n\n // check all interactables\n while (is.element(element)) {\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && elementInteractable !== interaction.target\n && !elementInteractable.options.drag.manualStart) {\n\n action = elementInteractable.getAction(interaction.downPointer, interaction.downEvent, interaction, element);\n }\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, elementInteractable)) {\n\n interaction.prepared.name = 'drag';\n interaction.target = elementInteractable;\n interaction.element = element;\n break;\n }\n\n const selectorInteractable = scope.interactables.forEachSelector(getDraggable, element);\n\n if (selectorInteractable) {\n interaction.prepared.name = 'drag';\n interaction.target = selectorInteractable;\n interaction.element = element;\n break;\n }\n\n element = parentNode(element);\n }\n }\n }\n});\n\nfunction checkStartAxis (startAxis, interactable) {\n if (!interactable) { return false; }\n\n const thisAxis = interactable.options.drag.startAxis;\n\n return (startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis);\n}\n","require('./base').setActionDefaults(require('../actions/gesture'));\n","require('./base').setActionDefaults(require('../actions/resize'));\n","module.exports = {\n base: {\n accept : null,\n preventDefault: 'auto',\n deltaSource : 'page',\n },\n\n perAction: {\n origin: { x: 0, y: 0 },\n\n // only allow left button by default\n // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n mouseButtons: 1,\n\n inertia: {\n enabled : false,\n resistance : 10, // the lambda in exponential decay\n minSpeed : 100, // target speed must be above this for inertia to start\n endSpeed : 10, // the speed at which inertia is slow enough to stop\n allowResume : true, // allow resuming an action in inertia phase\n smoothEndDuration: 300, // animate to snap/restrict endOnly if there's no inertia\n },\n },\n};\n","/* browser entry point */\n\n// Legacy browser support\nrequire('./legacyBrowsers');\n\n// inertia\nrequire('./inertia');\n\n// modifiers\nrequire('./modifiers/snap');\nrequire('./modifiers/restrict');\n\n// pointerEvents\nrequire('./pointerEvents/base');\nrequire('./pointerEvents/holdRepeat');\nrequire('./pointerEvents/interactableTargets');\n\n// delay\nrequire('./autoStart/delay');\n\n// actions\nrequire('./actions/gesture');\nrequire('./actions/resize');\nrequire('./actions/drag');\nrequire('./actions/drop');\n\n// load these modifiers after resize is loaded\nrequire('./modifiers/snapSize');\nrequire('./modifiers/restrictEdges');\nrequire('./modifiers/restrictSize');\n\n// autoStart actions\nrequire('./autoStart/gesture');\nrequire('./autoStart/resize');\nrequire('./autoStart/drag');\n\n// Interactable preventDefault setting\nrequire('./interactablePreventDefault.js');\n\n// autoScroll\nrequire('./autoScroll');\n\n// export interact\nmodule.exports = require('./interact');\n","const InteractEvent = require('./InteractEvent');\nconst Interaction = require('./Interaction');\nconst modifiers = require('./modifiers');\nconst utils = require('./utils');\nconst animationFrame = require('./utils/raf');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.inertiaStatus = {\n active : false,\n smoothEnd : false,\n allowResume: false,\n\n startEvent: null,\n upCoords : {},\n\n xe: 0, ye: 0,\n sx: 0, sy: 0,\n\n t0: 0,\n vx0: 0, vys: 0,\n duration: 0,\n\n lambda_v0: 0,\n one_ve_v0: 0,\n i : null,\n };\n\n interaction.boundInertiaFrame = () => inertiaFrame .apply(interaction);\n interaction.boundSmoothEndFrame = () => smoothEndFrame.apply(interaction);\n});\n\nInteraction.signals.on('down', function ({ interaction, event, pointer, eventTarget }) {\n const status = interaction.inertiaStatus;\n\n // Check if the down event hits the current inertia target\n if (status.active) {\n let element = eventTarget;\n\n // climb up the DOM tree from the event target\n while (utils.is.element(element)) {\n\n // if interaction element is the current inertia target element\n if (element === interaction.element) {\n // stop inertia\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n\n // update pointers to the down event's coordinates\n interaction.updatePointer(pointer);\n utils.setCoords(interaction.curCoords, interaction.pointers);\n\n // fire appropriate signals\n const signalArg = { interaction };\n Interaction.signals.fire('before-action-move', signalArg);\n Interaction.signals.fire('action-resume' , signalArg);\n\n // fire a reume event\n const resumeEvent = new InteractEvent(interaction,\n event,\n interaction.prepared.name,\n 'inertiaresume',\n interaction.element);\n\n interaction.target.fire(resumeEvent);\n interaction.prevEvent = resumeEvent;\n modifiers.resetStatuses(interaction.modifierStatuses);\n\n utils.copyCoords(interaction.prevCoords, interaction.curCoords);\n break;\n }\n\n element = utils.parentNode(element);\n }\n }\n});\n\nInteraction.signals.on('up', function ({ interaction, event }) {\n const status = interaction.inertiaStatus;\n\n if (!interaction.interacting() || status.active) { return; }\n\n const target = interaction.target;\n const options = target && target.options;\n const inertiaOptions = options && interaction.prepared.name && options[interaction.prepared.name].inertia;\n\n const now = new Date().getTime();\n const statuses = {};\n const page = utils.extend({}, interaction.curCoords.page);\n const pointerSpeed = interaction.pointerDelta.client.speed;\n\n let smoothEnd = false;\n let modifierResult;\n\n // check if inertia should be started\n const inertiaPossible = (inertiaOptions && inertiaOptions.enabled\n && interaction.prepared.name !== 'gesture'\n && event !== status.startEvent);\n\n const inertia = (inertiaPossible\n && (now - interaction.curCoords.timeStamp) < 50\n && pointerSpeed > inertiaOptions.minSpeed\n && pointerSpeed > inertiaOptions.endSpeed);\n\n const modifierArg = {\n interaction,\n pageCoords: page,\n statuses,\n preEnd: true,\n requireEndOnly: true,\n };\n\n // smoothEnd\n if (inertiaPossible && !inertia) {\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n if (modifierResult.shouldMove && modifierResult.locked) {\n smoothEnd = true;\n }\n }\n\n if (!(inertia || smoothEnd)) { return; }\n\n utils.copyCoords(status.upCoords, interaction.curCoords);\n\n interaction.pointers[0] = status.startEvent =\n new InteractEvent(interaction, event, interaction.prepared.name, 'inertiastart', interaction.element);\n\n status.t0 = now;\n\n status.active = true;\n status.allowResume = inertiaOptions.allowResume;\n interaction.simulation = status;\n\n target.fire(status.startEvent);\n\n if (inertia) {\n status.vx0 = interaction.pointerDelta.client.vx;\n status.vy0 = interaction.pointerDelta.client.vy;\n status.v0 = pointerSpeed;\n\n calcInertia(interaction, status);\n\n utils.extend(page, interaction.curCoords.page);\n\n page.x += status.xe;\n page.y += status.ye;\n\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n status.modifiedXe += modifierResult.dx;\n status.modifiedYe += modifierResult.dy;\n\n status.i = animationFrame.request(interaction.boundInertiaFrame);\n }\n else {\n status.smoothEnd = true;\n status.xe = modifierResult.dx;\n status.ye = modifierResult.dy;\n\n status.sx = status.sy = 0;\n\n status.i = animationFrame.request(interaction.boundSmoothEndFrame);\n }\n});\n\nInteraction.signals.on('stop-active', function ({ interaction }) {\n const status = interaction.inertiaStatus;\n\n if (status.active) {\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n }\n});\n\nfunction calcInertia (interaction, status) {\n const inertiaOptions = interaction.target.options[interaction.prepared.name].inertia;\n const lambda = inertiaOptions.resistance;\n const inertiaDur = -Math.log(inertiaOptions.endSpeed / status.v0) / lambda;\n\n status.x0 = interaction.prevEvent.pageX;\n status.y0 = interaction.prevEvent.pageY;\n status.t0 = status.startEvent.timeStamp / 1000;\n status.sx = status.sy = 0;\n\n status.modifiedXe = status.xe = (status.vx0 - inertiaDur) / lambda;\n status.modifiedYe = status.ye = (status.vy0 - inertiaDur) / lambda;\n status.te = inertiaDur;\n\n status.lambda_v0 = lambda / status.v0;\n status.one_ve_v0 = 1 - inertiaOptions.endSpeed / status.v0;\n}\n\nfunction inertiaFrame () {\n updateInertiaCoords(this);\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n\n const status = this.inertiaStatus;\n const options = this.target.options[this.prepared.name].inertia;\n const lambda = options.resistance;\n const t = new Date().getTime() / 1000 - status.t0;\n\n if (t < status.te) {\n\n const progress = 1 - (Math.exp(-lambda * t) - status.lambda_v0) / status.one_ve_v0;\n\n if (status.modifiedXe === status.xe && status.modifiedYe === status.ye) {\n status.sx = status.xe * progress;\n status.sy = status.ye * progress;\n }\n else {\n const quadPoint = utils.getQuadraticCurvePoint(0, 0,\n status.xe,\n status.ye,\n status.modifiedXe,\n status.modifiedYe,\n progress);\n\n status.sx = quadPoint.x;\n status.sy = quadPoint.y;\n }\n\n this.doMove();\n\n status.i = animationFrame.request(this.boundInertiaFrame);\n }\n else {\n status.sx = status.modifiedXe;\n status.sy = status.modifiedYe;\n\n this.doMove();\n this.end(status.startEvent);\n status.active = false;\n this.simulation = null;\n }\n\n utils.copyCoords(this.prevCoords, this.curCoords);\n}\n\nfunction smoothEndFrame () {\n updateInertiaCoords(this);\n\n const status = this.inertiaStatus;\n const t = new Date().getTime() - status.t0;\n const duration = this.target.options[this.prepared.name].inertia.smoothEndDuration;\n\n if (t < duration) {\n status.sx = utils.easeOutQuad(t, 0, status.xe, duration);\n status.sy = utils.easeOutQuad(t, 0, status.ye, duration);\n\n this.pointerMove(status.startEvent, status.startEvent);\n\n status.i = animationFrame.request(this.boundSmoothEndFrame);\n }\n else {\n status.sx = status.xe;\n status.sy = status.ye;\n\n this.pointerMove(status.startEvent, status.startEvent);\n this.end(status.startEvent);\n\n status.smoothEnd =\n status.active = false;\n this.simulation = null;\n }\n}\n\nfunction updateInertiaCoords (interaction) {\n const status = interaction.inertiaStatus;\n\n // return if inertia isn't running\n if (!status.active) { return; }\n\n const pageUp = status.upCoords.page;\n const clientUp = status.upCoords.client;\n\n utils.setCoords(interaction.curCoords, [ {\n pageX : pageUp.x + status.sx,\n pageY : pageUp.y + status.sy,\n clientX: clientUp.x + status.sx,\n clientY: clientUp.y + status.sy,\n } ]);\n}\n","const browser = require('./utils/browser');\nconst events = require('./utils/events');\nconst utils = require('./utils');\nconst scope = require('./scope');\nconst Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\n\nconst globalEvents = {};\n\n/*\\\n * interact\n [ method ]\n *\n * The methods of this variable can be used to set elements as\n * interactables and also to change various default settings.\n *\n * Calling it as a function and passing an element or a valid CSS selector\n * string returns an Interactable object which has various methods to\n * configure it.\n *\n - element (Element | string) The HTML or SVG Element to interact with or CSS selector\n = (object) An @Interactable\n *\n > Usage\n | interact('#draggable').draggable(true);\n |\n | var rectables = interact('rect');\n | rectables\n | .gesturable(true)\n | .on('gesturemove', function (event) {\n | // ...\n | });\n\\*/\nfunction interact (element, options) {\n let interactable = scope.interactables.get(element, options);\n\n if (!interactable) {\n interactable = new Interactable(element, options);\n interactable.events.global = globalEvents;\n }\n\n return interactable;\n}\n\n/*\\\n * interact.isSet\n [ method ]\n *\n * Check if an element has been set\n - element (Element) The Element being searched for\n = (boolean) Indicates if the element or CSS selector was previously passed to interact\n\\*/\ninteract.isSet = function (element, options) {\n return scope.interactables.indexOfElement(element, options && options.context) !== -1;\n};\n\n/*\\\n * interact.on\n [ method ]\n *\n * Adds a global listener for an InteractEvent or adds a DOM event to\n * `document`\n *\n - type (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) interact\n\\*/\ninteract.on = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.on(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.on(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n // if it is an InteractEvent type, add listener to globalEvents\n if (utils.contains(Interactable.eventTypes, type)) {\n // if this type of event was never bound\n if (!globalEvents[type]) {\n globalEvents[type] = [listener];\n }\n else {\n globalEvents[type].push(listener);\n }\n }\n // If non InteractEvent type, addEventListener to document\n else {\n events.add(scope.document, type, listener, { options });\n }\n\n return interact;\n};\n\n/*\\\n * interact.off\n [ method ]\n *\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n - type (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) interact\n \\*/\ninteract.off = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.off(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.off(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n if (!utils.contains(Interactable.eventTypes, type)) {\n events.remove(scope.document, type, listener, options);\n }\n else {\n let index;\n\n if (type in globalEvents\n && (index = utils.indexOf(globalEvents[type], listener)) !== -1) {\n globalEvents[type].splice(index, 1);\n }\n }\n\n return interact;\n};\n\n/*\\\n * interact.debug\n [ method ]\n *\n * Returns an object which exposes internal data\n = (object) An object with properties that outline the current state and expose internal functions and variables\n\\*/\ninteract.debug = function () {\n return scope;\n};\n\n// expose the functions used to calculate multi-touch properties\ninteract.getPointerAverage = utils.pointerAverage;\ninteract.getTouchBBox = utils.touchBBox;\ninteract.getTouchDistance = utils.touchDistance;\ninteract.getTouchAngle = utils.touchAngle;\n\ninteract.getElementRect = utils.getElementRect;\ninteract.getElementClientRect = utils.getElementClientRect;\ninteract.matchesSelector = utils.matchesSelector;\ninteract.closest = utils.closest;\n\n/*\\\n * interact.supportsTouch\n [ method ]\n *\n = (boolean) Whether or not the browser supports touch input\n\\*/\ninteract.supportsTouch = function () {\n return browser.supportsTouch;\n};\n\n/*\\\n * interact.supportsPointerEvent\n [ method ]\n *\n = (boolean) Whether or not the browser supports PointerEvents\n\\*/\ninteract.supportsPointerEvent = function () {\n return browser.supportsPointerEvent;\n};\n\n/*\\\n * interact.stop\n [ method ]\n *\n * Cancels all interactions (end events are not fired)\n *\n - event (Event) An event on which to call preventDefault()\n = (object) interact\n\\*/\ninteract.stop = function (event) {\n for (let i = scope.interactions.length - 1; i >= 0; i--) {\n scope.interactions[i].stop(event);\n }\n\n return interact;\n};\n\n/*\\\n * interact.pointerMoveTolerance\n [ method ]\n * Returns or sets the distance the pointer must be moved before an action\n * sequence occurs. This also affects tolerance for tap events.\n *\n - newValue (number) #optional The movement from the start position must be greater than this value\n = (number | Interactable) The current setting or interact\n\\*/\ninteract.pointerMoveTolerance = function (newValue) {\n if (utils.is.number(newValue)) {\n Interaction.pointerMoveTolerance = newValue;\n\n return this;\n }\n\n return Interaction.pointerMoveTolerance;\n};\n\ninteract.addDocument = scope.addDocument;\ninteract.removeDocument = scope.removeDocument;\n\nscope.interact = interact;\n\nmodule.exports = interact;\n","const Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\nconst scope = require('./scope');\nconst is = require('./utils/is');\nconst events = require('./utils/events');\n\nconst { nodeContains, matchesSelector } = require('./utils/domUtils');\n\n/*\\\n * Interactable.preventDefault\n [ method ]\n *\n * Returns or sets whether to prevent the browser's default behaviour\n * in response to pointer events. Can be set to:\n * - `'always'` to always prevent\n * - `'never'` to never prevent\n * - `'auto'` to let interact.js try to determine what would be best\n *\n - newValue (string) #optional `true`, `false` or `'auto'`\n = (string | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.preventDefault = function (newValue) {\n if (/^(always|never|auto)$/.test(newValue)) {\n this.options.preventDefault = newValue;\n return this;\n }\n\n if (is.bool(newValue)) {\n this.options.preventDefault = newValue? 'always' : 'never';\n return this;\n }\n\n return this.options.preventDefault;\n};\n\nInteractable.prototype.checkAndPreventDefault = function (event) {\n const setting = this.options.preventDefault;\n\n if (setting === 'never') { return; }\n\n if (setting === 'always') {\n event.preventDefault();\n return;\n }\n\n // setting === 'auto'\n\n // don't preventDefault if the browser supports passiveEvents\n // CSS touch-action and user-selecct should be used instead\n if (events.supportsOptions) {\n return;\n }\n\n // don't preventDefault of pointerdown events\n if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) {\n return;\n }\n\n // don't preventDefault on editable elements\n if (is.element(event.target)\n && matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) {\n return;\n }\n\n event.preventDefault();\n};\n\nfunction onInteractionEvent ({ interaction, event }) {\n if (interaction.target) {\n interaction.target.checkAndPreventDefault(event);\n }\n}\n\nfor (const eventSignal of ['down', 'move', 'up', 'cancel']) {\n Interaction.signals.on(eventSignal, onInteractionEvent);\n}\n\n// prevent native HTML5 drag on interact.js target elements\nInteraction.docEvents.dragstart = function preventNativeDrag (event) {\n for (const interaction of scope.interactions) {\n\n if (interaction.element\n && (interaction.element === event.target\n || nodeContains(interaction.element, event.target))) {\n\n interaction.target.checkAndPreventDefault(event);\n return;\n }\n }\n};\n","const scope = require('./scope');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst iFinder = require('./utils/interactionFinder');\nconst pointerEvents = require('./pointerEvents/base');\n\nconst { window } = require('./utils/window');\n\nconst toString = Object.prototype.toString;\n\nif (!window.Array.isArray) {\n window.Array.isArray = function (obj) {\n return toString.call(obj) === '[object Array]';\n };\n}\n\nif (!String.prototype.trim) {\n String.prototype.trim = function () {\n return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n };\n}\n\n// http://www.quirksmode.org/dom/events/click.html\n// >Events leading to dblclick\n//\n// IE8 doesn't fire down event before dblclick.\n// This workaround tries to fire a tap and doubletap after dblclick\nfunction onIE8Dblclick (event) {\n const eventTarget = event.target;\n const interaction = iFinder.search(event, event.type, eventTarget);\n\n if (!interaction) { return; }\n\n if (interaction.prevTap\n && event.clientX === interaction.prevTap.clientX\n && event.clientY === interaction.prevTap.clientY\n && eventTarget === interaction.prevTap.target) {\n\n interaction.downTargets[0] = eventTarget;\n interaction.downTimes [0] = new Date().getTime();\n\n pointerEvents.fire({\n interaction,\n event,\n eventTarget,\n pointer: event,\n type: 'tap',\n });\n }\n}\n\nif (browser.isIE8) {\n const selectFix = function (event) {\n for (const interaction of scope.interactions) {\n if (interaction.interacting()) {\n interaction.target.checkAndPreventDefault(event);\n }\n }\n };\n\n const onDocIE8 = function onDocIE8 ({ doc, win }, signalName) {\n const eventMethod = signalName.indexOf('listen') === 0\n ? events.add : events.remove;\n\n // For IE's lack of Event#preventDefault\n eventMethod(doc, 'selectstart', selectFix);\n\n if (pointerEvents) {\n eventMethod(doc, 'dblclick', onIE8Dblclick);\n }\n };\n\n scope.signals.on('add-document' , onDocIE8);\n scope.signals.on('remove-document', onDocIE8);\n}\n\nmodule.exports = null;\n","const InteractEvent = require('../InteractEvent');\nconst Interaction = require('../Interaction');\nconst extend = require('../utils/extend');\n\nconst modifiers = {\n names: [],\n\n setOffsets: function (arg) {\n const { interaction, pageCoords: page } = arg;\n const { target, element, startOffset } = interaction;\n const rect = target.getRect(element);\n\n if (rect) {\n startOffset.left = page.x - rect.left;\n startOffset.top = page.y - rect.top;\n\n startOffset.right = rect.right - page.x;\n startOffset.bottom = rect.bottom - page.y;\n\n if (!('width' in rect)) { rect.width = rect.right - rect.left; }\n if (!('height' in rect)) { rect.height = rect.bottom - rect.top ; }\n }\n else {\n startOffset.left = startOffset.top = startOffset.right = startOffset.bottom = 0;\n }\n\n arg.rect = rect;\n arg.interactable = target;\n arg.element = element;\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n\n arg.options = target.options[interaction.prepared.name][modifierName];\n\n if (!arg.options) {\n continue;\n }\n\n interaction.modifierOffsets[modifierName] = modifiers[modifierName].setOffset(arg);\n }\n },\n\n setAll: function (arg) {\n const { interaction, statuses, preEnd, requireEndOnly } = arg;\n const coords = extend({}, arg.pageCoords);\n const result = {\n dx: 0,\n dy: 0,\n changed: false,\n locked: false,\n shouldMove: true,\n };\n\n for (const modifierName of modifiers.names) {\n const modifier = modifiers[modifierName];\n const options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!shouldDo(options, preEnd, requireEndOnly)) { continue; }\n\n arg.status = arg.status = statuses[modifierName];\n arg.options = options;\n arg.offset = arg.interaction.modifierOffsets[modifierName];\n\n modifier.set(arg);\n\n if (arg.status.locked) {\n coords.x += arg.status.dx;\n coords.y += arg.status.dy;\n\n result.dx += arg.status.dx;\n result.dy += arg.status.dy;\n\n result.locked = true;\n }\n }\n\n // a move should be fired if:\n // - there are no modifiers enabled,\n // - no modifiers are \"locked\" i.e. have changed the pointer's coordinates, or\n // - the locked coords have changed since the last pointer move\n result.shouldMove = !arg.status || !result.locked || arg.status.changed;\n\n return result;\n },\n\n resetStatuses: function (statuses) {\n for (const modifierName of modifiers.names) {\n const status = statuses[modifierName] || {};\n\n status.dx = status.dy = 0;\n status.modifiedX = status.modifiedY = NaN;\n status.locked = false;\n status.changed = true;\n\n statuses[modifierName] = status;\n }\n\n return statuses;\n },\n\n start: function ({ interaction }, signalName) {\n const arg = {\n interaction,\n pageCoords: (signalName === 'action-resume' ?\n interaction.curCoords : interaction.startCoords).page,\n startOffset: interaction.startOffset,\n statuses: interaction.modifierStatuses,\n preEnd: false,\n requireEndOnly: false,\n };\n\n modifiers.setOffsets(arg);\n modifiers.resetStatuses(arg.statuses);\n\n arg.pageCoords = extend({}, interaction.startCoords.page);\n interaction.modifierResult = modifiers.setAll(arg);\n },\n};\n\nInteraction.signals.on('new', function (interaction) {\n interaction.startOffset = { left: 0, right: 0, top: 0, bottom: 0 };\n interaction.modifierOffsets = {};\n interaction.modifierStatuses = modifiers.resetStatuses({});\n interaction.modifierResult = null;\n});\n\nInteraction.signals.on('action-start' , modifiers.start);\nInteraction.signals.on('action-resume', modifiers.start);\n\nInteraction.signals.on('before-action-move', function ({ interaction, preEnd, interactingBeforeMove }) {\n const modifierResult = modifiers.setAll({\n interaction,\n preEnd,\n pageCoords: interaction.curCoords.page,\n statuses: interaction.modifierStatuses,\n requireEndOnly: false,\n });\n\n // don't fire an action move if a modifier would keep the event in the same\n // cordinates as before\n if (!modifierResult.shouldMove && interactingBeforeMove) {\n interaction._dontFireMove = true;\n }\n\n interaction.modifierResult = modifierResult;\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n for (let i = 0; i < modifiers.names.length; i++) {\n const options = interaction.target.options[interaction.prepared.name][modifiers.names[i]];\n\n // if the endOnly option is true for any modifier\n if (shouldDo(options, true, true)) {\n // fire a move event at the modified coordinates\n interaction.doMove({ event, preEnd: true });\n break;\n }\n }\n});\n\nInteractEvent.signals.on('set-xy', function (arg) {\n const { iEvent, interaction } = arg;\n const modifierArg = extend({}, arg);\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n modifierArg.options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!modifierArg.options) {\n continue;\n }\n\n const modifier = modifiers[modifierName];\n\n modifierArg.status = interaction.modifierStatuses[modifierName];\n\n iEvent[modifierName] = modifier.modifyCoords(modifierArg);\n }\n});\n\nfunction shouldDo (options, preEnd, requireEndOnly) {\n return (options && options.enabled\n && (preEnd || !options.endOnly)\n && (!requireEndOnly || options.endOnly));\n}\n\nmodule.exports = modifiers;\n","const modifiers = require('./index');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst restrict = {\n defaults: {\n enabled : false,\n endOnly : false,\n restriction: null,\n elementRect: null,\n },\n\n setOffset: function ({ rect, startOffset, options }) {\n const elementRect = options && options.elementRect;\n const offset = {};\n\n if (rect && elementRect) {\n offset.left = startOffset.left - (rect.width * elementRect.left);\n offset.top = startOffset.top - (rect.height * elementRect.top);\n\n offset.right = startOffset.right - (rect.width * (1 - elementRect.right));\n offset.bottom = startOffset.bottom - (rect.height * (1 - elementRect.bottom));\n }\n else {\n offset.left = offset.top = offset.right = offset.bottom = 0;\n }\n\n return offset;\n },\n\n set: function ({ pageCoords, interaction, status, options }) {\n if (!options) { return status; }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n\n const restriction = getRestrictionRect(options.restriction, interaction, page);\n\n if (!restriction) { return status; }\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n const rect = restriction;\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n const offset = interaction.modifierOffsets.restrict;\n\n // object is assumed to have\n // x, y, width, height or\n // left, top, right, bottom\n if ('x' in restriction && 'y' in restriction) {\n modifiedX = Math.max(Math.min(rect.x + rect.width - offset.right , page.x), rect.x + offset.left);\n modifiedY = Math.max(Math.min(rect.y + rect.height - offset.bottom, page.y), rect.y + offset.top );\n }\n else {\n modifiedX = Math.max(Math.min(rect.right - offset.right , page.x), rect.left + offset.left);\n modifiedY = Math.max(Math.min(rect.bottom - offset.bottom, page.y), rect.top + offset.top );\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const elementRect = options && options.elementRect;\n\n if (options && options.enabled\n && !(phase === 'start' && elementRect && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n getRestrictionRect,\n};\n\nfunction getRestrictionRect (value, interaction, page) {\n if (utils.is.function(value)) {\n return utils.resolveRectLike(value, interaction.target, interaction.element, [page.x, page.y, interaction]);\n } else {\n return utils.resolveRectLike(value, interaction.target, interaction.element);\n }\n}\n\nmodifiers.restrict = restrict;\nmodifiers.names.push('restrict');\n\ndefaultOptions.perAction.restrict = restrict.defaults;\n\nmodule.exports = restrict;\n","// This module adds the options.resize.restrictEdges setting which sets min and\n// max for the top, left, bottom and right edges of the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictEdges: {\n// inner: { top: 200, left: 200, right: 400, bottom: 400 },\n// outer: { top: 0, left: 0, right: 600, bottom: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst { getRestrictionRect } = require('./restrict');\n\nconst noInner = { top: +Infinity, left: +Infinity, bottom: -Infinity, right: -Infinity };\nconst noOuter = { top: -Infinity, left: -Infinity, bottom: +Infinity, right: +Infinity };\n\nconst restrictEdges = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n offset: null,\n },\n\n setOffset: function ({ interaction, startOffset, options }) {\n if (!options) {\n return utils.extend({}, startOffset);\n }\n\n const offset = getRestrictionRect(options.offset, interaction, interaction.startCoords.page);\n\n if (offset) {\n return {\n top: startOffset.top + offset.y,\n left: startOffset.left + offset.x,\n bottom: startOffset.bottom + offset.y,\n right: startOffset.right + offset.x,\n };\n }\n\n return startOffset;\n },\n\n set: function ({ pageCoords, interaction, status, offset, options }) {\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n const inner = rectUtils.xywhToTlbr(getRestrictionRect(options.inner, interaction, page)) || noInner;\n const outer = rectUtils.xywhToTlbr(getRestrictionRect(options.outer, interaction, page)) || noOuter;\n\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n if (edges.top) {\n modifiedY = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top);\n }\n else if (edges.bottom) {\n modifiedY = Math.max(Math.min(outer.bottom - offset.bottom, page.y), inner.bottom - offset.bottom);\n }\n if (edges.left) {\n modifiedX = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left);\n }\n else if (edges.right) {\n modifiedX = Math.max(Math.min(outer.right - offset.right, page.x), inner.right - offset.right);\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n if (options && options.enabled\n && !(phase === 'start' && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n noInner,\n noOuter,\n getRestrictionRect,\n};\n\nmodifiers.restrictEdges = restrictEdges;\nmodifiers.names.push('restrictEdges');\n\ndefaultOptions.perAction.restrictEdges = restrictEdges.defaults;\nresize.defaults.restrictEdges = restrictEdges.defaults;\n\nmodule.exports = restrictEdges;\n","// This module adds the options.resize.restrictSize setting which sets min and\n// max width and height for the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictSize: {\n// min: { width: -600, height: -600 },\n// max: { width: 600, height: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst restrictEdges = require('./restrictEdges');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst noMin = { width: -Infinity, height: -Infinity };\nconst noMax = { width: +Infinity, height: +Infinity };\n\nconst restrictSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n },\n\n setOffset: function ({ interaction }) {\n return interaction.startOffset;\n },\n\n set: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const rect = rectUtils.xywhToTlbr(interaction.resizeRects.inverted);\n\n const minSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.min, interaction)) || noMin;\n const maxSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.max, interaction)) || noMax;\n\n arg.options = {\n enabled: options.enabled,\n endOnly: options.endOnly,\n inner: utils.extend({}, restrictEdges.noInner),\n outer: utils.extend({}, restrictEdges.noOuter),\n };\n\n if (edges.top) {\n arg.options.inner.top = rect.bottom - minSize.height;\n arg.options.outer.top = rect.bottom - maxSize.height;\n }\n else if (edges.bottom) {\n arg.options.inner.bottom = rect.top + minSize.height;\n arg.options.outer.bottom = rect.top + maxSize.height;\n }\n if (edges.left) {\n arg.options.inner.left = rect.right - minSize.width;\n arg.options.outer.left = rect.right - maxSize.width;\n }\n else if (edges.right) {\n arg.options.inner.right = rect.left + minSize.width;\n arg.options.outer.right = rect.left + maxSize.width;\n }\n\n restrictEdges.set(arg);\n },\n\n modifyCoords: restrictEdges.modifyCoords,\n};\n\nmodifiers.restrictSize = restrictSize;\nmodifiers.names.push('restrictSize');\n\ndefaultOptions.perAction.restrictSize = restrictSize.defaults;\nresize.defaults.restrictSize = restrictSize.defaults;\n\nmodule.exports = restrictSize;\n","const modifiers = require('./index');\nconst interact = require('../interact');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst snap = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n\n relativePoints: null,\n },\n\n setOffset: function ({ interaction, interactable, element, rect, startOffset, options }) {\n const offsets = [];\n const optionsOrigin = utils.rectToXY(utils.resolveRectLike(options.origin));\n const origin = optionsOrigin || utils.getOriginXY(interactable, element, interaction.prepared.name);\n options = options || interactable.options[interaction.prepared.name].snap || {};\n\n let snapOffset;\n\n if (options.offset === 'startCoords') {\n snapOffset = {\n x: interaction.startCoords.page.x - origin.x,\n y: interaction.startCoords.page.y - origin.y,\n };\n }\n else {\n const offsetRect = utils.resolveRectLike(options.offset, interactable, element, [interaction]);\n\n snapOffset = utils.rectToXY(offsetRect) || { x: 0, y: 0 };\n }\n\n if (rect && options.relativePoints && options.relativePoints.length) {\n for (const { x: relativeX, y: relativeY } of options.relativePoints) {\n offsets.push({\n x: startOffset.left - (rect.width * relativeX) + snapOffset.x,\n y: startOffset.top - (rect.height * relativeY) + snapOffset.y,\n });\n }\n }\n else {\n offsets.push(snapOffset);\n }\n\n return offsets;\n },\n\n set: function ({ interaction, pageCoords, status, options, offset: offsets }) {\n const targets = [];\n let target;\n let page;\n let i;\n\n if (status.useStatusXY) {\n page = { x: status.x, y: status.y };\n }\n else {\n const origin = utils.getOriginXY(interaction.target, interaction.element, interaction.prepared.name);\n\n page = utils.extend({}, pageCoords);\n\n page.x -= origin.x;\n page.y -= origin.y;\n }\n\n status.realX = page.x;\n status.realY = page.y;\n\n let len = options.targets? options.targets.length : 0;\n\n for (const { x: offsetX, y: offsetY } of offsets) {\n const relativeX = page.x - offsetX;\n const relativeY = page.y - offsetY;\n\n for (const snapTarget of options.targets) {\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n targets.push({\n x: utils.is.number(target.x) ? (target.x + offsetX) : relativeX,\n y: utils.is.number(target.y) ? (target.y + offsetY) : relativeY,\n\n range: utils.is.number(target.range)? target.range: options.range,\n });\n }\n }\n\n const closest = {\n target: null,\n inRange: false,\n distance: 0,\n range: 0,\n dx: 0,\n dy: 0,\n };\n\n for (i = 0, len = targets.length; i < len; i++) {\n target = targets[i];\n\n const range = target.range;\n const dx = target.x - page.x;\n const dy = target.y - page.y;\n const distance = utils.hypot(dx, dy);\n let inRange = distance <= range;\n\n // Infinite targets count as being out of range\n // compared to non infinite ones that are in range\n if (range === Infinity && closest.inRange && closest.range !== Infinity) {\n inRange = false;\n }\n\n if (!closest.target || (inRange\n // is the closest target in range?\n ? (closest.inRange && range !== Infinity\n // the pointer is relatively deeper in this target\n ? distance / range < closest.distance / closest.range\n // this target has Infinite range and the closest doesn't\n : (range === Infinity && closest.range !== Infinity)\n // OR this target is closer that the previous closest\n || distance < closest.distance)\n // The other is not in range and the pointer is closer to this target\n : (!closest.inRange && distance < closest.distance))) {\n\n closest.target = target;\n closest.distance = distance;\n closest.range = range;\n closest.inRange = inRange;\n closest.dx = dx;\n closest.dy = dy;\n\n status.range = range;\n }\n }\n\n let snapChanged;\n\n if (closest.target) {\n snapChanged = (status.modifiedX !== closest.target.x || status.modifiedY !== closest.target.y);\n\n status.modifiedX = closest.target.x;\n status.modifiedY = closest.target.y;\n }\n else {\n snapChanged = true;\n\n status.modifiedX = NaN;\n status.modifiedY = NaN;\n }\n\n status.dx = closest.dx;\n status.dy = closest.dy;\n\n status.changed = (snapChanged || (closest.inRange && !status.locked));\n status.locked = closest.inRange;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const relativePoints = options && options.relativePoints;\n\n if (options && options.enabled\n && !(phase === 'start' && relativePoints && relativePoints.length)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n }\n\n return {\n range : status.range,\n locked : status.locked,\n x : status.modifiedX,\n y : status.modifiedY,\n realX : status.realX,\n realY : status.realY,\n dx : status.dx,\n dy : status.dy,\n };\n }\n },\n};\n\ninteract.createSnapGrid = function (grid) {\n return function (x, y) {\n const limits = grid.limits || {\n left : -Infinity,\n right : Infinity,\n top : -Infinity,\n bottom: Infinity,\n };\n let offsetX = 0;\n let offsetY = 0;\n\n if (utils.is.object(grid.offset)) {\n offsetX = grid.offset.x;\n offsetY = grid.offset.y;\n }\n\n const gridx = Math.round((x - offsetX) / grid.x);\n const gridy = Math.round((y - offsetY) / grid.y);\n\n const newX = Math.max(limits.left, Math.min(limits.right , gridx * grid.x + offsetX));\n const newY = Math.max(limits.top , Math.min(limits.bottom, gridy * grid.y + offsetY));\n\n return {\n x: newX,\n y: newY,\n range: grid.range,\n };\n };\n};\n\nmodifiers.snap = snap;\nmodifiers.names.push('snap');\n\ndefaultOptions.perAction.snap = snap.defaults;\n\nmodule.exports = snap;\n","// This module allows snapping of the size of targets during resize\n// interactions.\n\nconst modifiers = require('./index');\nconst snap = require('./snap');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\nconst utils = require('../utils/');\n\nconst snapSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n },\n\n setOffset: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.edges;\n\n if (!edges) { return; }\n\n arg.options = {\n relativePoints: [{\n x: edges.left? 0 : 1,\n y: edges.top ? 0 : 1,\n }],\n origin: { x: 0, y: 0 },\n offset: 'self',\n range: options.range,\n };\n\n const offsets = snap.setOffset(arg);\n arg.options = options;\n\n return offsets;\n },\n\n set: function (arg) {\n const { interaction, options, offset, pageCoords } = arg;\n const page = utils.extend({}, pageCoords);\n const relativeX = page.x - offset[0].x;\n const relativeY = page.y - offset[0].y;\n\n arg.options = utils.extend({}, options);\n arg.options.targets = [];\n\n for (const snapTarget of options.targets) {\n let target;\n\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n if ('width' in target && 'height' in target) {\n target.x = target.width;\n target.y = target.height;\n }\n\n arg.options.targets.push(target);\n }\n\n snap.set(arg);\n },\n\n modifyCoords: function (arg) {\n const { options } = arg;\n\n arg.options = utils.extend({}, options);\n arg.options.enabled = options.enabled;\n arg.options.relativePoints = [null];\n\n snap.modifyCoords(arg);\n },\n};\n\nmodifiers.snapSize = snapSize;\nmodifiers.names.push('snapSize');\n\ndefaultOptions.perAction.snapSize = snapSize.defaults;\nresize.defaults.snapSize = snapSize.defaults;\n\nmodule.exports = snapSize;\n","const pointerUtils = require('../utils/pointerUtils');\n\nmodule.exports = class PointerEvent {\n constructor (type, pointer, event, eventTarget, interaction) {\n pointerUtils.pointerExtend(this, event);\n\n if (event !== pointer) {\n pointerUtils.pointerExtend(this, pointer);\n }\n\n this.interaction = interaction;\n\n this.timeStamp = new Date().getTime();\n this.originalEvent = event;\n this.type = type;\n this.pointerId = pointerUtils.getPointerId(pointer);\n this.pointerType = pointerUtils.getPointerType(pointer, interaction);\n this.target = eventTarget;\n this.currentTarget = null;\n\n if (type === 'tap') {\n const pointerIndex = interaction.getPointerIndex(pointer);\n this.dt = this.timeStamp - interaction.downTimes[pointerIndex];\n\n const interval = this.timeStamp - interaction.tapTime;\n\n this.double = !!(interaction.prevTap\n && interaction.prevTap.type !== 'doubletap'\n && interaction.prevTap.target === this.target\n && interval < 500);\n }\n else if (type === 'doubletap') {\n this.dt = pointer.timeStamp - interaction.tapTime;\n }\n }\n\n subtractOrigin ({ x: originX, y: originY }) {\n this.pageX -= originX;\n this.pageY -= originY;\n this.clientX -= originX;\n this.clientY -= originY;\n\n return this;\n }\n\n addOrigin ({ x: originX, y: originY }) {\n this.pageX += originX;\n this.pageY += originY;\n this.clientX += originX;\n this.clientY += originY;\n\n return this;\n }\n\n preventDefault () {\n this.originalEvent.preventDefault();\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n};\n","const PointerEvent = require('./PointerEvent');\nconst Interaction = require('../Interaction');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst defaults = require('../defaultOptions');\nconst signals = require('../utils/Signals').new();\nconst { filter } = require('../utils/arr');\n\nconst simpleSignals = [ 'down', 'up', 'cancel' ];\nconst simpleEvents = [ 'down', 'up', 'cancel' ];\n\nconst pointerEvents = {\n PointerEvent,\n fire,\n collectEventTargets,\n signals,\n defaults: {\n holdDuration: 600,\n ignoreFrom : null,\n allowFrom : null,\n origin : { x: 0, y: 0 },\n },\n types: [\n 'down',\n 'move',\n 'up',\n 'cancel',\n 'tap',\n 'doubletap',\n 'hold',\n ],\n};\n\nfunction fire (arg) {\n const {\n interaction, pointer, event, eventTarget,\n type = arg.pointerEvent.type,\n targets = collectEventTargets(arg),\n pointerEvent = new PointerEvent(type, pointer, event, eventTarget, interaction),\n } = arg;\n\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n targets,\n type,\n pointerEvent,\n };\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n\n for (const prop in target.props || {}) {\n pointerEvent[prop] = target.props[prop];\n }\n\n const origin = utils.getOriginXY(target.eventable, target.element);\n\n pointerEvent.subtractOrigin(origin);\n pointerEvent.eventable = target.eventable;\n pointerEvent.currentTarget = target.element;\n\n target.eventable.fire(pointerEvent);\n\n pointerEvent.addOrigin(origin);\n\n if (pointerEvent.immediatePropagationStopped\n || (pointerEvent.propagationStopped\n && (i + 1) < targets.length && targets[i + 1].element !== pointerEvent.currentTarget)) {\n break;\n }\n }\n\n signals.fire('fired', signalArg);\n\n if (type === 'tap') {\n // if pointerEvent should make a double tap, create and fire a doubletap\n // PointerEvent and use that as the prevTap\n const prevTap = pointerEvent.double\n ? fire({\n interaction, pointer, event, eventTarget,\n type: 'doubletap',\n })\n : pointerEvent;\n\n interaction.prevTap = prevTap;\n interaction.tapTime = prevTap.timeStamp;\n }\n\n return pointerEvent;\n}\n\nfunction collectEventTargets ({ interaction, pointer, event, eventTarget, type }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n // do not fire a tap event if the pointer was moved before being lifted\n if (type === 'tap' && (interaction.pointerWasMoved\n // or if the pointerup target is different to the pointerdown target\n || !(interaction.downTargets[pointerIndex] && interaction.downTargets[pointerIndex] === eventTarget))) {\n return [];\n }\n\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n path,\n targets: [],\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (type === 'hold') {\n signalArg.targets = filter(signalArg.targets, target =>\n target.eventable.options.holdDuration === interaction.holdTimers[pointerIndex].duration);\n }\n\n return signalArg.targets;\n}\n\nInteraction.signals.on('update-pointer-down', function ({ interaction, pointerIndex }) {\n interaction.holdTimers[pointerIndex] = { duration: Infinity, timeout: null };\n});\n\nInteraction.signals.on('remove-pointer', function ({ interaction, pointerIndex }) {\n interaction.holdTimers.splice(pointerIndex, 1);\n});\n\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget, duplicateMove }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n if (!duplicateMove && (!interaction.pointerIsDown || interaction.pointerWasMoved)) {\n if (interaction.pointerIsDown) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n\n fire({\n interaction, pointer, event, eventTarget,\n type: 'move',\n });\n }\n});\n\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget, pointerIndex }) {\n // copy event to be used in timeout for IE8\n const eventCopy = browser.isIE8? utils.extend({}, event) : event;\n\n const timer = interaction.holdTimers[pointerIndex];\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'hold',\n targets: [],\n path,\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (!signalArg.targets.length) { return; }\n\n let minDuration = Infinity;\n\n for (let i = 0; i < signalArg.targets.length; i++) {\n const target = signalArg.targets[i];\n const holdDuration = target.eventable.options.holdDuration;\n\n if (holdDuration < minDuration) {\n minDuration = holdDuration;\n }\n }\n\n timer.duration = minDuration;\n timer.timeout = setTimeout(function () {\n fire({\n interaction, eventCopy, eventTarget,\n pointer: browser.isIE8? eventCopy : pointer,\n type: 'hold',\n });\n }, minDuration);\n});\n\nInteraction.signals.on('up', ({ interaction, pointer, event, eventTarget }) => {\n if (!interaction.pointerWasMoved) {\n fire({ interaction, eventTarget, pointer, event, type: 'tap' });\n }\n});\n\n['up', 'cancel'].forEach(function (signalName) {\n Interaction.signals.on(signalName, function ({ interaction, pointerIndex }) {\n if (interaction.holdTimers[pointerIndex]) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n });\n});\n\nfunction createSignalListener (type) {\n return function ({ interaction, pointer, event, eventTarget }) {\n fire({ interaction, eventTarget, pointer, event, type });\n };\n}\n\nfor (let i = 0; i < simpleSignals.length; i++) {\n Interaction.signals.on(simpleSignals[i], createSignalListener(simpleEvents[i]));\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.prevTap = null; // the most recent tap event on this interaction\n interaction.tapTime = 0; // time of the most recent tap event\n interaction.holdTimers = []; // [{ duration, timeout }]\n});\n\ndefaults.pointerEvents = pointerEvents.defaults;\nmodule.exports = pointerEvents;\n","const pointerEvents = require('./base');\nconst Interaction = require('../Interaction');\n\npointerEvents.signals.on('new', onNew);\npointerEvents.signals.on('fired', onFired);\n\nfor (const signal of ['move', 'up', 'cancel', 'endall']) {\n Interaction.signals.on(signal, endHoldRepeat);\n}\n\nfunction onNew ({ pointerEvent }) {\n if (pointerEvent.type !== 'hold') { return; }\n\n pointerEvent.count = (pointerEvent.count || 0) + 1;\n}\n\nfunction onFired ({ interaction, pointerEvent, eventTarget, targets }) {\n if (pointerEvent.type !== 'hold' || !targets.length) { return; }\n\n // get the repeat interval from the first eventable\n const interval = targets[0].eventable.options.holdRepeatInterval;\n\n // don't repeat if the interval is 0 or less\n if (interval <= 0) { return; }\n\n // set a timeout to fire the holdrepeat event\n interaction.holdIntervalHandle = setTimeout(function () {\n pointerEvents.fire({\n interaction,\n eventTarget,\n type: 'hold',\n pointer: pointerEvent,\n event: pointerEvent,\n });\n }, interval);\n}\n\nfunction endHoldRepeat ({ interaction }) {\n // set the interaction's holdStopTime property\n // to stop further holdRepeat events\n if (interaction.holdIntervalHandle) {\n clearInterval(interaction.holdIntervalHandle);\n interaction.holdIntervalHandle = null;\n }\n}\n\n// don't repeat by default\npointerEvents.defaults.holdRepeatInterval = 0;\npointerEvents.types.push('holdrepeat');\n\nmodule.exports = {\n onNew,\n onFired,\n endHoldRepeat,\n};\n","const pointerEvents = require('./base');\nconst Interactable = require('../Interactable');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\nconst scope = require('../scope');\nconst extend = require('../utils/extend');\nconst { merge } = require('../utils/arr');\n\npointerEvents.signals.on('collect-targets', function ({ targets, element, type, eventTarget }) {\n function collectSelectors (interactable, selector, context) {\n const els = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && is.element(element)\n && domUtils.matchesSelector(element, selector, els)\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n const interactable = scope.interactables.get(element);\n\n if (interactable) {\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n scope.interactables.forEachSelector(collectSelectors, element);\n});\n\nInteractable.signals.on('new', function ({ interactable }) {\n interactable.events.getRect = function (element) {\n return interactable.getRect(element);\n };\n});\n\nInteractable.signals.on('set', function ({ interactable, options }) {\n extend(interactable.events.options, pointerEvents.defaults);\n extend(interactable.events.options, options);\n});\n\nmerge(Interactable.eventTypes, pointerEvents.types);\n\nInteractable.prototype.pointerEvents = function (options) {\n extend(this.events.options, options);\n\n return this;\n};\n\nconst __backCompatOption = Interactable.prototype._backCompatOption;\n\nInteractable.prototype._backCompatOption = function (optionName, newValue) {\n const ret = __backCompatOption.call(this, optionName, newValue);\n\n if (ret === this) {\n this.events.options[optionName] = newValue;\n }\n\n return ret;\n};\n\nInteractable.settingsMethods.push('pointerEvents');\n","const utils = require('./utils');\nconst events = require('./utils/events');\nconst signals = require('./utils/Signals').new();\n\nconst scope = {\n signals,\n events,\n utils,\n\n // main document\n document: require('./utils/domObjects').document,\n // all documents being listened to\n documents: [],\n\n addDocument: function (doc, win) {\n // do nothing if document is already known\n if (utils.contains(scope.documents, doc)) { return false; }\n\n win = win || scope.getWindow(doc);\n\n scope.documents.push(doc);\n events.documents.push(doc);\n\n // don't add an unload event for the main document\n // so that the page may be cached in browser history\n if (doc !== scope.document) {\n events.add(win, 'unload', scope.onWindowUnload);\n }\n\n signals.fire('add-document', { doc, win });\n },\n\n removeDocument: function (doc, win) {\n const index = utils.indexOf(scope.documents, doc);\n\n win = win || scope.getWindow(doc);\n\n events.remove(win, 'unload', scope.onWindowUnload);\n\n scope.documents.splice(index, 1);\n events.documents.splice(index, 1);\n\n signals.fire('remove-document', { win, doc });\n },\n\n onWindowUnload: function () {\n scope.removeDocument(this.document, this);\n },\n};\n\nmodule.exports = scope;\n","const { indexOf } = require('./arr');\n\nclass Signals {\n constructor () {\n this.listeners = {\n // signalName: [listeners],\n };\n }\n\n on (name, listener) {\n if (!this.listeners[name]) {\n this.listeners[name] = [listener];\n return;\n }\n\n this.listeners[name].push(listener);\n }\n\n off (name, listener) {\n if (!this.listeners[name]) { return; }\n\n const index = indexOf(this.listeners[name], listener);\n\n if (index !== -1) {\n this.listeners[name].splice(index, 1);\n }\n }\n\n fire (name, arg) {\n const targetListeners = this.listeners[name];\n\n if (!targetListeners) { return; }\n\n for (let i = 0; i < targetListeners.length; i++) {\n if (targetListeners[i](arg, name) === false) {\n return;\n }\n }\n }\n}\n\nSignals.new = function () {\n return new Signals();\n};\n\nmodule.exports = Signals;\n","function indexOf (array, target) {\n for (let i = 0, len = array.length; i < len; i++) {\n if (array[i] === target) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction contains (array, target) {\n return indexOf(array, target) !== -1;\n}\n\nfunction merge (target, source) {\n for (let i = 0; i < source.length; i++) {\n target.push(source[i]);\n }\n\n return target;\n}\n\nfunction filter (array, test) {\n const result = [];\n\n for (let i = 0; i < array.length; i++) {\n if (test(array[i])) {\n result.push(array[i]);\n }\n }\n\n return result;\n}\n\nmodule.exports = {\n indexOf,\n contains,\n merge,\n filter,\n};\n","const { window } = require('./window');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst Element = domObjects.Element;\nconst navigator = window.navigator;\n\nconst browser = {\n // Does the browser support touch input?\n supportsTouch: !!(('ontouchstart' in window) || is.function(window.DocumentTouch)\n && domObjects.document instanceof window.DocumentTouch),\n\n // Does the browser support PointerEvents\n supportsPointerEvent: !!domObjects.PointerEvent,\n\n isIE8: ('attachEvent' in window) && !('addEventListener' in window),\n\n // Opera Mobile must be handled differently\n isOperaMobile: (navigator.appName === 'Opera'\n && browser.supportsTouch\n && navigator.userAgent.match('Presto')),\n\n // scrolling doesn't change the result of getClientRects on iOS 7\n isIOS7: (/iP(hone|od|ad)/.test(navigator.platform)\n && /OS 7[^\\d]/.test(navigator.appVersion)),\n\n isIe9OrOlder: /MSIE (8|9)/.test(navigator.userAgent),\n\n // prefix matchesSelector\n prefixedMatchesSelector: 'matches' in Element.prototype\n ? 'matches': 'webkitMatchesSelector' in Element.prototype\n ? 'webkitMatchesSelector': 'mozMatchesSelector' in Element.prototype\n ? 'mozMatchesSelector': 'oMatchesSelector' in Element.prototype\n ? 'oMatchesSelector': 'msMatchesSelector',\n\n useMatchesSelectorPolyfill: false,\n\n pEventTypes: (domObjects.PointerEvent\n ? (domObjects.PointerEvent === window.MSPointerEvent\n ? {\n up: 'MSPointerUp',\n down: 'MSPointerDown',\n over: 'mouseover',\n out: 'mouseout',\n move: 'MSPointerMove',\n cancel: 'MSPointerCancel',\n }\n : {\n up: 'pointerup',\n down: 'pointerdown',\n over: 'pointerover',\n out: 'pointerout',\n move: 'pointermove',\n cancel: 'pointercancel',\n })\n : null),\n\n // because Webkit and Opera still use 'mousewheel' event type\n wheelEvent: 'onmousewheel' in domObjects.document? 'mousewheel': 'wheel',\n\n};\n\nbrowser.useMatchesSelectorPolyfill = !is.function(Element.prototype[browser.prefixedMatchesSelector]);\n\nmodule.exports = browser;\n","const domObjects = {};\nconst win = require('./window').window;\n\nfunction blank () {}\n\ndomObjects.document = win.document;\ndomObjects.DocumentFragment = win.DocumentFragment || blank;\ndomObjects.SVGElement = win.SVGElement || blank;\ndomObjects.SVGSVGElement = win.SVGSVGElement || blank;\ndomObjects.SVGElementInstance = win.SVGElementInstance || blank;\ndomObjects.Element = win.Element || blank;\ndomObjects.HTMLElement = win.HTMLElement || domObjects.Element;\n\ndomObjects.Event = win.Event;\ndomObjects.Touch = win.Touch || blank;\ndomObjects.PointerEvent = (win.PointerEvent || win.MSPointerEvent);\n\nmodule.exports = domObjects;\n","const win = require('./window');\nconst browser = require('./browser');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst domUtils = {\n nodeContains: function (parent, child) {\n while (child) {\n if (child === parent) {\n return true;\n }\n\n child = child.parentNode;\n }\n\n return false;\n },\n\n closest: function (element, selector) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) { return element; }\n\n element = domUtils.parentNode(element);\n }\n\n return null;\n },\n\n parentNode: function (node) {\n let parent = node.parentNode;\n\n if (is.docFrag(parent)) {\n // skip past #shado-root fragments\n while ((parent = parent.host) && is.docFrag(parent)) {\n continue;\n }\n\n return parent;\n }\n\n return parent;\n },\n\n // taken from http://tanalin.com/en/blog/2012/12/matches-selector-ie8/ and modified\n matchesSelectorPolyfill: browser.useMatchesSelectorPolyfill\n ? function (element, selector, elems) {\n elems = elems || element.parentNode.querySelectorAll(selector);\n\n for (let i = 0, len = elems.length; i < len; i++) {\n if (elems[i] === element) {\n return true;\n }\n }\n\n return false;\n }\n : null,\n\n matchesSelector: function (element, selector, nodeList) {\n if (browser.useMatchesSelectorPolyfill) {\n return domUtils.matchesSelectorPolyfill(element, selector, nodeList);\n }\n\n // remove /deep/ from selectors if shadowDOM polyfill is used\n if (win.window !== win.realWindow) {\n selector = selector.replace(/\\/deep\\//g, ' ');\n }\n\n return element[browser.prefixedMatchesSelector](selector);\n },\n\n // Test for the element that's \"above\" all other qualifiers\n indexOfDeepestElement: function (elements) {\n let deepestZoneParents = [];\n let dropzoneParents = [];\n let dropzone;\n let deepestZone = elements[0];\n let index = deepestZone? 0: -1;\n let parent;\n let child;\n let i;\n let n;\n\n for (i = 1; i < elements.length; i++) {\n dropzone = elements[i];\n\n // an element might belong to multiple selector dropzones\n if (!dropzone || dropzone === deepestZone) {\n continue;\n }\n\n if (!deepestZone) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n // check if the deepest or current are document.documentElement or document.rootElement\n // - if the current dropzone is, do nothing and continue\n if (dropzone.parentNode === dropzone.ownerDocument) {\n continue;\n }\n // - if deepest is, update with the current dropzone and continue to next\n else if (deepestZone.parentNode === dropzone.ownerDocument) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n if (!deepestZoneParents.length) {\n parent = deepestZone;\n while (parent.parentNode && parent.parentNode !== parent.ownerDocument) {\n deepestZoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n }\n\n // if this element is an svg element and the current deepest is\n // an HTMLElement\n if (deepestZone instanceof domObjects.HTMLElement\n && dropzone instanceof domObjects.SVGElement\n && !(dropzone instanceof domObjects.SVGSVGElement)) {\n\n if (dropzone === deepestZone.parentNode) {\n continue;\n }\n\n parent = dropzone.ownerSVGElement;\n }\n else {\n parent = dropzone;\n }\n\n dropzoneParents = [];\n\n while (parent.parentNode !== parent.ownerDocument) {\n dropzoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n\n n = 0;\n\n // get (position of last common ancestor) + 1\n while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) {\n n++;\n }\n\n const parents = [\n dropzoneParents[n - 1],\n dropzoneParents[n],\n deepestZoneParents[n],\n ];\n\n child = parents[0].lastChild;\n\n while (child) {\n if (child === parents[1]) {\n deepestZone = dropzone;\n index = i;\n deepestZoneParents = [];\n\n break;\n }\n else if (child === parents[2]) {\n break;\n }\n\n child = child.previousSibling;\n }\n }\n\n return index;\n },\n\n matchesUpTo: function (element, selector, limit) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) {\n return true;\n }\n\n element = domUtils.parentNode(element);\n\n if (element === limit) {\n return domUtils.matchesSelector(element, selector);\n }\n }\n\n return false;\n },\n\n getActualElement: function (element) {\n return (element instanceof domObjects.SVGElementInstance\n ? element.correspondingUseElement\n : element);\n },\n\n getScrollXY: function (relevantWindow) {\n relevantWindow = relevantWindow || win.window;\n return {\n x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft,\n y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop,\n };\n },\n\n getElementClientRect: function (element) {\n const clientRect = (element instanceof domObjects.SVGElement\n ? element.getBoundingClientRect()\n : element.getClientRects()[0]);\n\n return clientRect && {\n left : clientRect.left,\n right : clientRect.right,\n top : clientRect.top,\n bottom: clientRect.bottom,\n width : clientRect.width || clientRect.right - clientRect.left,\n height: clientRect.height || clientRect.bottom - clientRect.top,\n };\n },\n\n getElementRect: function (element) {\n const clientRect = domUtils.getElementClientRect(element);\n\n if (!browser.isIOS7 && clientRect) {\n const scroll = domUtils.getScrollXY(win.getWindow(element));\n\n clientRect.left += scroll.x;\n clientRect.right += scroll.x;\n clientRect.top += scroll.y;\n clientRect.bottom += scroll.y;\n }\n\n return clientRect;\n },\n\n getPath: function (element) {\n const path = [];\n\n while (element) {\n path.push(element);\n element = domUtils.parentNode(element);\n }\n\n return path;\n },\n\n trySelector: value => {\n if (!is.string(value)) { return false; }\n\n // an exception will be raised if it is invalid\n domObjects.document.querySelector(value);\n return true;\n },\n};\n\nmodule.exports = domUtils;\n","const is = require('./is');\nconst domUtils = require('./domUtils');\nconst pExtend = require('./pointerExtend');\n\nconst { window, getWindow } = require('./window');\nconst { indexOf, contains } = require('./arr');\n\nconst useAttachEvent = ('attachEvent' in window) && !('addEventListener' in window);\nconst addEvent = useAttachEvent? 'attachEvent': 'addEventListener';\nconst removeEvent = useAttachEvent? 'detachEvent': 'removeEventListener';\nconst on = useAttachEvent? 'on': '';\n\nconst elements = [];\nconst targets = [];\nconst attachedListeners = [];\n\n// {\n// type: {\n// selectors: ['selector', ...],\n// contexts : [document, ...],\n// listeners: [[listener, capture, passive], ...]\n// }\n// }\nconst delegatedEvents = {};\n\nconst documents = [];\n\nconst supportsOptions = !useAttachEvent && (() => {\n let supported = false;\n\n window.document.createElement('div').addEventListener('test', null, {\n get capture () { supported = true; },\n });\n\n return supported;\n})();\n\nfunction add (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n let elementIndex = indexOf(elements, element);\n let target = targets[elementIndex];\n\n if (!target) {\n target = {\n events: {},\n typeCount: 0,\n };\n\n elementIndex = elements.push(element) - 1;\n targets.push(target);\n\n attachedListeners.push(useAttachEvent\n ? {\n supplied: [],\n wrapped : [],\n useCount: [],\n }\n : null);\n }\n\n if (!target.events[type]) {\n target.events[type] = [];\n target.typeCount++;\n }\n\n if (!contains(target.events[type], listener)) {\n let ret;\n\n if (useAttachEvent) {\n const { supplied, wrapped, useCount } = attachedListeners[elementIndex];\n const listenerIndex = indexOf(supplied, listener);\n\n const wrappedListener = wrapped[listenerIndex] || function (event) {\n if (!event.immediatePropagationStopped) {\n event.target = event.srcElement;\n event.currentTarget = element;\n\n event.preventDefault = event.preventDefault || preventDef;\n event.stopPropagation = event.stopPropagation || stopProp;\n event.stopImmediatePropagation = event.stopImmediatePropagation || stopImmProp;\n\n if (/mouse|click/.test(event.type)) {\n event.pageX = event.clientX + getWindow(element).document.documentElement.scrollLeft;\n event.pageY = event.clientY + getWindow(element).document.documentElement.scrollTop;\n }\n\n listener(event);\n }\n };\n\n ret = element[addEvent](on + type, wrappedListener, !!options.capture);\n\n if (listenerIndex === -1) {\n supplied.push(listener);\n wrapped.push(wrappedListener);\n useCount.push(1);\n }\n else {\n useCount[listenerIndex]++;\n }\n }\n else {\n ret = element[addEvent](type, listener, supportsOptions? options : !!options.capture);\n }\n target.events[type].push(listener);\n\n return ret;\n }\n}\n\nfunction remove (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const elementIndex = indexOf(elements, element);\n const target = targets[elementIndex];\n\n if (!target || !target.events) {\n return;\n }\n\n let wrappedListener = listener;\n let listeners;\n let listenerIndex;\n\n if (useAttachEvent) {\n listeners = attachedListeners[elementIndex];\n listenerIndex = indexOf(listeners.supplied, listener);\n wrappedListener = listeners.wrapped[listenerIndex];\n }\n\n if (type === 'all') {\n for (type in target.events) {\n if (target.events.hasOwnProperty(type)) {\n remove(element, type, 'all');\n }\n }\n return;\n }\n\n if (target.events[type]) {\n const len = target.events[type].length;\n\n if (listener === 'all') {\n for (let i = 0; i < len; i++) {\n remove(element, type, target.events[type][i], options);\n }\n return;\n }\n else {\n for (let i = 0; i < len; i++) {\n if (target.events[type][i] === listener) {\n element[removeEvent](on + type, wrappedListener, supportsOptions? options : !!options.capture);\n target.events[type].splice(i, 1);\n\n if (useAttachEvent && listeners) {\n listeners.useCount[listenerIndex]--;\n if (listeners.useCount[listenerIndex] === 0) {\n listeners.supplied.splice(listenerIndex, 1);\n listeners.wrapped.splice(listenerIndex, 1);\n listeners.useCount.splice(listenerIndex, 1);\n }\n }\n\n break;\n }\n }\n }\n\n if (target.events[type] && target.events[type].length === 0) {\n target.events[type] = null;\n target.typeCount--;\n }\n }\n\n if (!target.typeCount) {\n targets.splice(elementIndex, 1);\n elements.splice(elementIndex, 1);\n attachedListeners.splice(elementIndex, 1);\n }\n}\n\nfunction addDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n if (!delegatedEvents[type]) {\n delegatedEvents[type] = {\n selectors: [],\n contexts : [],\n listeners: [],\n };\n\n // add delegate listener functions\n for (let i = 0; i < documents.length; i++) {\n add(documents[i], type, delegateListener);\n add(documents[i], type, delegateUseCapture, true);\n }\n }\n\n const delegated = delegatedEvents[type];\n let index;\n\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n break;\n }\n }\n\n if (index === -1) {\n index = delegated.selectors.length;\n\n delegated.selectors.push(selector);\n delegated.contexts .push(context);\n delegated.listeners.push([]);\n }\n\n // keep listener and capture and passive flags\n delegated.listeners[index].push([listener, !!options.capture, options.passive]);\n}\n\nfunction removeDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const delegated = delegatedEvents[type];\n let matchFound = false;\n let index;\n\n if (!delegated) { return; }\n\n // count from last index of delegated to 0\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n // look for matching selector and context Node\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n\n const listeners = delegated.listeners[index];\n\n // each item of the listeners array is an array: [function, capture, passive]\n for (let i = listeners.length - 1; i >= 0; i--) {\n const [fn, capture, passive] = listeners[i];\n\n // check if the listener functions and capture and passive flags match\n if (fn === listener && capture === !!options.capture && passive === options.passive) {\n // remove the listener from the array of listeners\n listeners.splice(i, 1);\n\n // if all listeners for this interactable have been removed\n // remove the interactable from the delegated arrays\n if (!listeners.length) {\n delegated.selectors.splice(index, 1);\n delegated.contexts .splice(index, 1);\n delegated.listeners.splice(index, 1);\n\n // remove delegate function from context\n remove(context, type, delegateListener);\n remove(context, type, delegateUseCapture, true);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegatedEvents[type] = null;\n }\n }\n\n // only remove one listener\n matchFound = true;\n break;\n }\n }\n\n if (matchFound) { break; }\n }\n }\n}\n\n// bound to the interactable context when a DOM event\n// listener is added to a selector interactable\nfunction delegateListener (event, optionalArg) {\n const options = getOptions(optionalArg);\n const fakeEvent = {};\n const delegated = delegatedEvents[event.type];\n const eventTarget = (domUtils.getActualElement(event.path\n ? event.path[0]\n : event.target));\n let element = eventTarget;\n\n // duplicate the event so that currentTarget can be changed\n pExtend(fakeEvent, event);\n\n fakeEvent.originalEvent = event;\n fakeEvent.preventDefault = preventOriginalDefault;\n\n // climb up document tree looking for selector matches\n while (is.element(element)) {\n for (let i = 0; i < delegated.selectors.length; i++) {\n const selector = delegated.selectors[i];\n const context = delegated.contexts[i];\n\n if (domUtils.matchesSelector(element, selector)\n && domUtils.nodeContains(context, eventTarget)\n && domUtils.nodeContains(context, element)) {\n\n const listeners = delegated.listeners[i];\n\n fakeEvent.currentTarget = element;\n\n for (let j = 0; j < listeners.length; j++) {\n const [fn, capture, passive] = listeners[j];\n\n if (capture === !!options.capture && passive === options.passive) {\n fn(fakeEvent);\n }\n }\n }\n }\n\n element = domUtils.parentNode(element);\n }\n}\n\nfunction delegateUseCapture (event) {\n return delegateListener.call(this, event, true);\n}\n\nfunction preventDef () {\n this.returnValue = false;\n}\n\nfunction preventOriginalDefault () {\n this.originalEvent.preventDefault();\n}\n\nfunction stopProp () {\n this.cancelBubble = true;\n}\n\nfunction stopImmProp () {\n this.cancelBubble = true;\n this.immediatePropagationStopped = true;\n}\n\nfunction getOptions (param) {\n return is.object(param)? param : { capture: param };\n}\n\nmodule.exports = {\n add,\n remove,\n\n addDelegate,\n removeDelegate,\n\n delegateListener,\n delegateUseCapture,\n delegatedEvents,\n documents,\n\n useAttachEvent,\n supportsOptions,\n\n _elements: elements,\n _targets: targets,\n _attachedListeners: attachedListeners,\n};\n","module.exports = function extend (dest, source) {\n for (const prop in source) {\n dest[prop] = source[prop];\n }\n return dest;\n};\n","const {\n resolveRectLike,\n rectToXY,\n} = require('./rect');\n\nmodule.exports = function (target, element, action) {\n const actionOptions = target.options[action];\n const actionOrigin = actionOptions && actionOptions.origin;\n const origin = actionOrigin || target.options.origin;\n\n const originRect = resolveRectLike(origin, target, element, [target && element]);\n\n return rectToXY(originRect) || { x: 0, y: 0 };\n};\n","module.exports = (x, y) => Math.sqrt(x * x + y * y);\n","const extend = require('./extend');\nconst win = require('./window');\n\nconst utils = {\n warnOnce: function (method, message) {\n let warned = false;\n\n return function () {\n if (!warned) {\n win.window.console.warn(message);\n warned = true;\n }\n\n return method.apply(this, arguments);\n };\n },\n\n // http://stackoverflow.com/a/5634528/2280888\n _getQBezierValue: function (t, p1, p2, p3) {\n const iT = 1 - t;\n return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3;\n },\n\n getQuadraticCurvePoint: function (startX, startY, cpX, cpY, endX, endY, position) {\n return {\n x: utils._getQBezierValue(position, startX, cpX, endX),\n y: utils._getQBezierValue(position, startY, cpY, endY),\n };\n },\n\n // http://gizma.com/easing/\n easeOutQuad: function (t, b, c, d) {\n t /= d;\n return -c * t*(t-2) + b;\n },\n\n copyAction: function (dest, src) {\n dest.name = src.name;\n dest.axis = src.axis;\n dest.edges = src.edges;\n\n return dest;\n },\n\n is : require('./is'),\n extend : extend,\n hypot : require('./hypot'),\n getOriginXY: require('./getOriginXY'),\n};\n\nextend(utils, require('./arr'));\nextend(utils, require('./domUtils'));\nextend(utils, require('./pointerUtils'));\nextend(utils, require('./rect'));\n\nmodule.exports = utils;\n","const scope = require('../scope');\nconst utils = require('./index');\nconst browser = require('./browser');\n\nconst finder = {\n methodOrder: [ 'simulationResume', 'mouse', 'hasPointer', 'idle' ],\n\n search: function (pointer, eventType, eventTarget) {\n const mouseEvent = (/mouse/i.test(pointer.pointerType || eventType)\n // MSPointerEvent.MSPOINTER_TYPE_MOUSE\n || pointer.pointerType === 4);\n const pointerId = utils.getPointerId(pointer);\n const details = { pointer, pointerId, mouseEvent, eventType, eventTarget };\n\n for (const method of finder.methodOrder) {\n const interaction = finder[method](details);\n\n if (interaction) {\n return interaction;\n }\n }\n },\n\n // try to resume simulation with a new pointer\n simulationResume: function ({ mouseEvent, eventType, eventTarget }) {\n if (!/down|start/i.test(eventType)) {\n return null;\n }\n\n for (const interaction of scope.interactions) {\n let element = eventTarget;\n\n if (interaction.simulation && interaction.simulation.allowResume\n && (interaction.mouse === mouseEvent)) {\n while (element) {\n // if the element is the interaction element\n if (element === interaction.element) {\n return interaction;\n }\n element = utils.parentNode(element);\n }\n }\n }\n\n return null;\n },\n\n // if it's a mouse interaction\n mouse: function ({ pointerId, mouseEvent, eventType }) {\n if (!mouseEvent && (browser.supportsTouch || browser.supportsPointerEvent)) {\n return null;\n }\n\n let firstNonActive;\n\n for (const interaction of scope.interactions) {\n if (interaction.mouse) {\n // if it's a down event, skip interactions with running simulations\n if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; }\n\n // if the interaction is active, return it immediately\n if (interaction.interacting()) {\n return interaction;\n }\n // otherwise save it and look for another active interaction\n else if (!firstNonActive) {\n firstNonActive = interaction;\n }\n }\n }\n\n // if no active mouse interaction was found use the first inactive mouse\n // interaction\n if (firstNonActive) {\n return firstNonActive;\n }\n\n // Find any interaction specifically for mouse.\n // ignore the interaction if the eventType is a mousedown, and a simulation\n // is active\n for (const interaction of scope.interactions) {\n if (interaction.mouse && !(/down/.test(eventType) && interaction.simulation)) {\n return interaction;\n }\n }\n\n return null;\n },\n\n // get interaction that has this pointer\n hasPointer: function ({ pointerId }) {\n for (const interaction of scope.interactions) {\n if (utils.contains(interaction.pointerIds, pointerId)) {\n return interaction;\n }\n }\n },\n\n // get first idle interaction\n idle: function ({ mouseEvent }) {\n for (const interaction of scope.interactions) {\n // if there's already a pointer held down\n if (interaction.pointerIds.length === 1) {\n const target = interaction.target;\n // don't add this pointer if there is a target interactable and it\n // isn't gesturable\n if (target && !target.options.gesture.enabled) {\n continue;\n }\n }\n // maximum of 2 pointers per interaction\n else if (interaction.pointerIds.length >= 2) {\n continue;\n }\n\n if (!interaction.interacting() && (mouseEvent === interaction.mouse)) {\n return interaction;\n }\n }\n\n return null;\n },\n};\n\nmodule.exports = finder;\n","const win = require('./window');\nconst isWindow = require('./isWindow');\n\nconst is = {\n array : () => {},\n\n window : thing => thing === win.window || isWindow(thing),\n\n docFrag : thing => is.object(thing) && thing.nodeType === 11,\n\n object : thing => !!thing && (typeof thing === 'object'),\n\n function: thing => typeof thing === 'function',\n\n number : thing => typeof thing === 'number' ,\n\n bool : thing => typeof thing === 'boolean' ,\n\n string : thing => typeof thing === 'string' ,\n\n element: thing => {\n if (!thing || (typeof thing !== 'object')) { return false; }\n\n const _window = win.getWindow(thing) || win.window;\n\n return (/object|function/.test(typeof _window.Element)\n ? thing instanceof _window.Element //DOM2\n : thing.nodeType === 1 && typeof thing.nodeName === 'string');\n },\n};\n\nis.array = thing => (is.object(thing)\n && (typeof thing.length !== 'undefined')\n && is.function(thing.splice));\n\nmodule.exports = is;\n","module.exports = (thing) => !!(thing && thing.Window) && (thing instanceof thing.Window);\n","function pointerExtend (dest, source) {\n for (const prop in source) {\n const prefixedPropREs = module.exports.prefixedPropREs;\n let deprecated = false;\n\n // skip deprecated prefixed properties\n for (const vendor in prefixedPropREs) {\n if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) {\n deprecated = true;\n break;\n }\n }\n\n if (!deprecated && typeof source[prop] !== 'function') {\n dest[prop] = source[prop];\n }\n }\n return dest;\n}\n\npointerExtend.prefixedPropREs = {\n webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/,\n};\n\nmodule.exports = pointerExtend;\n","const hypot = require('./hypot');\nconst browser = require('./browser');\nconst dom = require('./domObjects');\nconst domUtils = require('./domUtils');\nconst is = require('./is');\nconst pointerExtend = require('./pointerExtend');\n\nconst pointerUtils = {\n copyCoords: function (dest, src) {\n dest.page = dest.page || {};\n dest.page.x = src.page.x;\n dest.page.y = src.page.y;\n\n dest.client = dest.client || {};\n dest.client.x = src.client.x;\n dest.client.y = src.client.y;\n\n dest.timeStamp = src.timeStamp;\n },\n\n setCoordDeltas: function (targetObj, prev, cur) {\n targetObj.page.x = cur.page.x - prev.page.x;\n targetObj.page.y = cur.page.y - prev.page.y;\n targetObj.client.x = cur.client.x - prev.client.x;\n targetObj.client.y = cur.client.y - prev.client.y;\n targetObj.timeStamp = cur.timeStamp - prev.timeStamp;\n\n // set pointer velocity\n const dt = Math.max(targetObj.timeStamp / 1000, 0.001);\n\n targetObj.page.speed = hypot(targetObj.page.x, targetObj.page.y) / dt;\n targetObj.page.vx = targetObj.page.x / dt;\n targetObj.page.vy = targetObj.page.y / dt;\n\n targetObj.client.speed = hypot(targetObj.client.x, targetObj.page.y) / dt;\n targetObj.client.vx = targetObj.client.x / dt;\n targetObj.client.vy = targetObj.client.y / dt;\n },\n\n isNativePointer: function (pointer) {\n return (pointer instanceof dom.Event || pointer instanceof dom.Touch);\n },\n\n // Get specified X/Y coords for mouse or event.touches[0]\n getXY: function (type, pointer, xy) {\n xy = xy || {};\n type = type || 'page';\n\n xy.x = pointer[type + 'X'];\n xy.y = pointer[type + 'Y'];\n\n return xy;\n },\n\n getPageXY: function (pointer, page) {\n page = page || {};\n\n // Opera Mobile handles the viewport and scrolling oddly\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n pointerUtils.getXY('screen', pointer, page);\n\n page.x += window.scrollX;\n page.y += window.scrollY;\n }\n else {\n pointerUtils.getXY('page', pointer, page);\n }\n\n return page;\n },\n\n getClientXY: function (pointer, client) {\n client = client || {};\n\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n // Opera Mobile handles the viewport and scrolling oddly\n pointerUtils.getXY('screen', pointer, client);\n }\n else {\n pointerUtils.getXY('client', pointer, client);\n }\n\n return client;\n },\n\n getPointerId: function (pointer) {\n return is.number(pointer.pointerId)? pointer.pointerId : pointer.identifier;\n },\n\n setCoords: function (targetObj, pointers, timeStamp) {\n const pointer = (pointers.length > 1\n ? pointerUtils.pointerAverage(pointers)\n : pointers[0]);\n\n const tmpXY = {};\n\n pointerUtils.getPageXY(pointer, tmpXY);\n targetObj.page.x = tmpXY.x;\n targetObj.page.y = tmpXY.y;\n\n pointerUtils.getClientXY(pointer, tmpXY);\n targetObj.client.x = tmpXY.x;\n targetObj.client.y = tmpXY.y;\n\n targetObj.timeStamp = is.number(timeStamp) ? timeStamp :new Date().getTime();\n },\n\n pointerExtend: pointerExtend,\n\n getTouchPair: function (event) {\n const touches = [];\n\n // array of touches is supplied\n if (is.array(event)) {\n touches[0] = event[0];\n touches[1] = event[1];\n }\n // an event\n else {\n if (event.type === 'touchend') {\n if (event.touches.length === 1) {\n touches[0] = event.touches[0];\n touches[1] = event.changedTouches[0];\n }\n else if (event.touches.length === 0) {\n touches[0] = event.changedTouches[0];\n touches[1] = event.changedTouches[1];\n }\n }\n else {\n touches[0] = event.touches[0];\n touches[1] = event.touches[1];\n }\n }\n\n return touches;\n },\n\n pointerAverage: function (pointers) {\n const average = {\n pageX : 0,\n pageY : 0,\n clientX: 0,\n clientY: 0,\n screenX: 0,\n screenY: 0,\n };\n\n for (const pointer of pointers) {\n for (const prop in average) {\n average[prop] += pointer[prop];\n }\n }\n for (const prop in average) {\n average[prop] /= pointers.length;\n }\n\n return average;\n },\n\n touchBBox: function (event) {\n if (!event.length && !(event.touches && event.touches.length > 1)) {\n return;\n }\n\n const touches = pointerUtils.getTouchPair(event);\n const minX = Math.min(touches[0].pageX, touches[1].pageX);\n const minY = Math.min(touches[0].pageY, touches[1].pageY);\n const maxX = Math.max(touches[0].pageX, touches[1].pageX);\n const maxY = Math.max(touches[0].pageY, touches[1].pageY);\n\n return {\n x: minX,\n y: minY,\n left: minX,\n top: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n },\n\n touchDistance: function (event, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n\n\n const dx = touches[0][sourceX] - touches[1][sourceX];\n const dy = touches[0][sourceY] - touches[1][sourceY];\n\n return hypot(dx, dy);\n },\n\n touchAngle: function (event, prevAngle, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n const dx = touches[1][sourceX] - touches[0][sourceX];\n const dy = touches[1][sourceY] - touches[0][sourceY];\n const angle = 180 * Math.atan2(dy , dx) / Math.PI;\n\n return angle;\n },\n\n getPointerType: function (pointer, interaction) {\n // if the PointerEvent API isn't available, then the pointer must be ither\n // a MouseEvent or TouchEvent\n if (interaction.mouse) { return 'mouse'; }\n if (!browser.supportsPointerEvent) { return 'touch'; }\n\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : [undefined, undefined,'touch', 'pen', 'mouse'][pointer.pointerType];\n },\n\n // [ event.target, event.currentTarget ]\n getEventTargets: function (event) {\n return [\n domUtils.getActualElement(event.path ? event.path[0] : event.target),\n domUtils.getActualElement(event.currentTarget),\n ];\n },\n};\n\nmodule.exports = pointerUtils;\n","const { window } = require('./window');\n\nconst vendors = ['ms', 'moz', 'webkit', 'o'];\nlet lastTime = 0;\nlet request;\nlet cancel;\n\nfor (let x = 0; x < vendors.length && !window.requestAnimationFrame; x++) {\n request = window[vendors[x] + 'RequestAnimationFrame'];\n cancel = window[vendors[x] +'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n}\n\nif (!request) {\n request = function (callback) {\n const currTime = new Date().getTime();\n const timeToCall = Math.max(0, 16 - (currTime - lastTime));\n const id = setTimeout(function () { callback(currTime + timeToCall); },\n timeToCall);\n\n lastTime = currTime + timeToCall;\n return id;\n };\n}\n\nif (!cancel) {\n cancel = function (id) {\n clearTimeout(id);\n };\n}\n\nmodule.exports = {\n request,\n cancel,\n};\n","const extend = require('./extend');\nconst is = require('./is');\nconst {\n closest,\n parentNode,\n getElementRect,\n} = require('./domUtils');\n\nconst rectUtils = {\n getStringOptionResult: function (value, interactable, element) {\n if (!is.string(value)) {\n return null;\n }\n\n if (value === 'parent') {\n value = parentNode(element);\n }\n else if (value === 'self') {\n value = interactable.getRect(element);\n }\n else {\n value = closest(element, value);\n }\n\n return value;\n },\n\n resolveRectLike: function (value, interactable, element, functionArgs) {\n value = rectUtils.getStringOptionResult(value, interactable, element) || value;\n\n if (is.function(value)) {\n value = value.apply(null, functionArgs);\n }\n\n if (is.element(value)) {\n value = getElementRect(value);\n }\n\n return value;\n },\n\n rectToXY: function (rect) {\n return rect && {\n x: 'x' in rect ? rect.x : rect.left,\n y: 'y' in rect ? rect.y : rect.top,\n };\n },\n\n xywhToTlbr: function (rect) {\n if (rect && !('left' in rect && 'top' in rect)) {\n rect = extend({}, rect);\n\n rect.left = rect.x || 0;\n rect.top = rect.y || 0;\n rect.right = rect.right || (rect.left + rect.width);\n rect.bottom = rect.bottom || (rect.top + rect.height);\n }\n\n return rect;\n },\n\n tlbrToXywh: function (rect) {\n if (rect && !('x' in rect && 'y' in rect)) {\n rect = extend({}, rect);\n\n rect.x = rect.left || 0;\n rect.top = rect.top || 0;\n rect.width = rect.width || (rect.right - rect.x);\n rect.height = rect.height || (rect.bottom - rect.y);\n }\n\n return rect;\n },\n};\n\nmodule.exports = rectUtils;\n","const win = module.exports;\nconst isWindow = require('./isWindow');\n\nfunction init (window) {\n // get wrapped window if using Shadow DOM polyfill\n\n win.realWindow = window;\n\n // create a TextNode\n const el = window.document.createTextNode('');\n\n // check if it's wrapped by a polyfill\n if (el.ownerDocument !== window.document\n && typeof window.wrap === 'function'\n && window.wrap(el) === el) {\n // use wrapped window\n window = window.wrap(window);\n }\n\n win.window = window;\n}\n\nif (typeof window === 'undefined') {\n win.window = undefined;\n win.realWindow = undefined;\n}\nelse {\n init(window);\n}\n\nwin.getWindow = function getWindow (node) {\n if (isWindow(node)) {\n return node;\n }\n\n const rootNode = (node.ownerDocument || node);\n\n return rootNode.defaultView || rootNode.parentWindow || win.window;\n};\n\nwin.init = init;\n"]} \ No newline at end of file +{"version":3,"sources":["src/minHeader.js","src/header.js","index.js","src/Eventable.js","src/InteractEvent.js","src/Interactable.js","src/Interaction.js","src/actions/base.js","src/actions/drag.js","src/actions/drop.js","src/actions/gesture.js","src/actions/resize.js","src/autoScroll.js","src/autoStart/InteractableMethods.js","src/autoStart/base.js","src/autoStart/delay.js","src/autoStart/drag.js","src/autoStart/gesture.js","src/autoStart/resize.js","src/defaultOptions.js","src/index.js","src/inertia.js","src/interact.js","src/interactablePreventDefault.js","src/legacyBrowsers.js","src/modifiers/index.js","src/modifiers/restrict.js","src/modifiers/restrictEdges.js","src/modifiers/restrictSize.js","src/modifiers/snap.js","src/modifiers/snapSize.js","src/pointerEvents/PointerEvent.js","src/pointerEvents/base.js","src/pointerEvents/holdRepeat.js","src/pointerEvents/interactableTargets.js","src/scope.js","src/utils/Signals.js","src/utils/arr.js","src/utils/browser.js","src/utils/domObjects.js","src/utils/domUtils.js","src/utils/events.js","src/utils/extend.js","src/utils/getOriginXY.js","src/utils/hypot.js","src/utils/index.js","src/utils/interactionFinder.js","src/utils/is.js","src/utils/isWindow.js","src/utils/pointerExtend.js","src/utils/pointerUtils.js","src/utils/raf.js","src/utils/rect.js","src/utils/window.js"],"names":[],"mappings":"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","file":"interact.min.js","sourceRoot":"","sourcesContent":["/* interact.js v1.3.0-alpha.4+sha.7970416-dirty | https://raw.github.com/taye/interact.js/master/LICENSE */\n","/**\n * interact.js v1.3.0-alpha.4+sha.7970416-dirty\n *\n * Copyright (c) 2012-2017 Taye Adeyemi \n * Open source under the MIT License.\n * https://raw.github.com/taye/interact.js/master/LICENSE\n */\n","/*\n * In a (windowless) server environment this file exports a factory function\n * that takes the window to use.\n *\n * var interact = require('interact.js')(windowObject);\n *\n * See https://github.com/taye/interact.js/issues/187\n */\nif (typeof window === 'undefined') {\n module.exports = function (window) {\n require('./src/utils/window').init(window);\n\n return require('./src/index');\n };\n}\nelse {\n module.exports = require('./src/index');\n}\n","const { indexOf } = require('./utils/arr');\nconst extend = require('./utils/extend.js');\n\nfunction fireUntilImmediateStopped (event, listeners) {\n for (let i = 0, len = listeners.length; i < len && !event.immediatePropagationStopped; i++) {\n listeners[i](event);\n }\n}\n\nclass Eventable {\n\n constructor (options) {\n this.options = extend({}, options || {});\n }\n\n fire (event) {\n let listeners;\n const onEvent = 'on' + event.type;\n const global = this.global;\n\n // Interactable#on() listeners\n if ((listeners = this[event.type])) {\n fireUntilImmediateStopped(event, listeners);\n }\n\n // interactable.onevent listener\n if (this[onEvent]) {\n this[onEvent](event);\n }\n\n // interact.on() listeners\n if (!event.propagationStopped && global && (listeners = global[event.type])) {\n fireUntilImmediateStopped(event, listeners);\n }\n }\n\n on (eventType, listener) {\n // if this type of event was never bound\n if (this[eventType]) {\n this[eventType].push(listener);\n }\n else {\n this[eventType] = [listener];\n }\n }\n\n off (eventType, listener) {\n // if it is an action event type\n const eventList = this[eventType];\n const index = eventList? indexOf(eventList, listener) : -1;\n\n if (index !== -1) {\n eventList.splice(index, 1);\n }\n\n if (eventList && eventList.length === 0 || !listener) {\n this[eventType] = listener;\n }\n }\n}\n\nmodule.exports = Eventable;\n","const extend = require('./utils/extend');\nconst getOriginXY = require('./utils/getOriginXY');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nclass InteractEvent {\n constructor (interaction, event, action, phase, element, related, preEnd = false) {\n const target = interaction.target;\n const deltaSource = (target && target.options || defaults).deltaSource;\n const origin = getOriginXY(target, element, action);\n const starting = phase === 'start';\n const ending = phase === 'end';\n const coords = starting? interaction.startCoords : interaction.curCoords;\n const prevEvent = interaction.prevEvent;\n\n element = element || interaction.element;\n\n const page = extend({}, coords.page);\n const client = extend({}, coords.client);\n\n page.x -= origin.x;\n page.y -= origin.y;\n\n client.x -= origin.x;\n client.y -= origin.y;\n\n this.ctrlKey = event.ctrlKey;\n this.altKey = event.altKey;\n this.shiftKey = event.shiftKey;\n this.metaKey = event.metaKey;\n this.button = event.button;\n this.buttons = event.buttons;\n this.target = element;\n this.currentTarget = element;\n this.relatedTarget = related || null;\n this.preEnd = preEnd;\n this.type = action + (phase || '');\n this.interaction = interaction;\n this.interactable = target;\n\n this.t0 = starting ? interaction.downTimes[interaction.downTimes.length - 1]\n : prevEvent.t0;\n\n const signalArg = {\n interaction,\n event,\n action,\n phase,\n element,\n related,\n page,\n client,\n coords,\n starting,\n ending,\n deltaSource,\n iEvent: this,\n };\n\n signals.fire('set-xy', signalArg);\n\n if (ending) {\n // use previous coords when ending\n this.pageX = prevEvent.pageX;\n this.pageY = prevEvent.pageY;\n this.clientX = prevEvent.clientX;\n this.clientY = prevEvent.clientY;\n }\n else {\n this.pageX = page.x;\n this.pageY = page.y;\n this.clientX = client.x;\n this.clientY = client.y;\n }\n\n this.x0 = interaction.startCoords.page.x - origin.x;\n this.y0 = interaction.startCoords.page.y - origin.y;\n this.clientX0 = interaction.startCoords.client.x - origin.x;\n this.clientY0 = interaction.startCoords.client.y - origin.y;\n\n signals.fire('set-delta', signalArg);\n\n this.timeStamp = coords.timeStamp;\n this.dt = interaction.pointerDelta.timeStamp;\n this.duration = this.timeStamp - this.t0;\n\n // speed and velocity in pixels per second\n this.speed = interaction.pointerDelta[deltaSource].speed;\n this.velocityX = interaction.pointerDelta[deltaSource].vx;\n this.velocityY = interaction.pointerDelta[deltaSource].vy;\n\n this.swipe = (ending || phase === 'inertiastart')? this.getSwipe() : null;\n\n signals.fire('new', signalArg);\n }\n\n getSwipe () {\n const interaction = this.interaction;\n\n if (interaction.prevEvent.speed < 600\n || this.timeStamp - interaction.prevEvent.timeStamp > 150) {\n return null;\n }\n\n let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI;\n const overlap = 22.5;\n\n if (angle < 0) {\n angle += 360;\n }\n\n const left = 135 - overlap <= angle && angle < 225 + overlap;\n const up = 225 - overlap <= angle && angle < 315 + overlap;\n\n const right = !left && (315 - overlap <= angle || angle < 45 + overlap);\n const down = !up && 45 - overlap <= angle && angle < 135 + overlap;\n\n return {\n up,\n down,\n left,\n right,\n angle,\n speed: interaction.prevEvent.speed,\n velocity: {\n x: interaction.prevEvent.velocityX,\n y: interaction.prevEvent.velocityY,\n },\n };\n }\n\n preventDefault () {}\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n}\n\nsignals.on('set-delta', function ({ iEvent, interaction, starting, deltaSource }) {\n const prevEvent = starting? iEvent : interaction.prevEvent;\n\n if (deltaSource === 'client') {\n iEvent.dx = iEvent.clientX - prevEvent.clientX;\n iEvent.dy = iEvent.clientY - prevEvent.clientY;\n }\n else {\n iEvent.dx = iEvent.pageX - prevEvent.pageX;\n iEvent.dy = iEvent.pageY - prevEvent.pageY;\n }\n});\n\nInteractEvent.signals = signals;\n\nmodule.exports = InteractEvent;\n","const is = require('./utils/is');\nconst events = require('./utils/events');\nconst extend = require('./utils/extend');\nconst actions = require('./actions/base');\nconst scope = require('./scope');\nconst Eventable = require('./Eventable');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nconst {\n getElementRect,\n nodeContains,\n trySelector,\n} = require('./utils/domUtils');\nconst { getWindow } = require('./utils/window');\nconst { indexOf, contains } = require('./utils/arr');\nconst { wheelEvent } = require('./utils/browser');\n\n// all set interactables\nscope.interactables = [];\n\n/*\\\n * Interactable\n [ property ]\n **\n * Object type returned by @interact\n\\*/\nclass Interactable {\n constructor (target, options) {\n options = options || {};\n\n this.target = target;\n this.events = new Eventable();\n this._context = options.context || scope.document;\n this._win = getWindow(trySelector(target)? this._context : target);\n this._doc = this._win.document;\n\n signals.fire('new', {\n target,\n options,\n interactable: this,\n win: this._win,\n });\n\n scope.addDocument( this._doc, this._win );\n\n scope.interactables.push(this);\n\n this.set(options);\n }\n\n setOnEvents (action, phases) {\n const onAction = 'on' + action;\n\n if (is.function(phases.onstart) ) { this.events[onAction + 'start' ] = phases.onstart ; }\n if (is.function(phases.onmove) ) { this.events[onAction + 'move' ] = phases.onmove ; }\n if (is.function(phases.onend) ) { this.events[onAction + 'end' ] = phases.onend ; }\n if (is.function(phases.oninertiastart)) { this.events[onAction + 'inertiastart' ] = phases.oninertiastart ; }\n\n return this;\n }\n\n setPerAction (action, options) {\n // for all the default per-action options\n for (const option in options) {\n // if this option exists for this action\n if (option in defaults[action]) {\n // if the option in the options arg is an object value\n if (is.object(options[option])) {\n // duplicate the object\n this.options[action][option] = extend(this.options[action][option] || {}, options[option]);\n\n if (is.object(defaults.perAction[option]) && 'enabled' in defaults.perAction[option]) {\n this.options[action][option].enabled = options[option].enabled === false? false : true;\n }\n }\n else if (is.bool(options[option]) && is.object(defaults.perAction[option])) {\n this.options[action][option].enabled = options[option];\n }\n else if (options[option] !== undefined) {\n // or if it's not undefined, do a plain assignment\n this.options[action][option] = options[option];\n }\n }\n }\n }\n\n /*\\\n * Interactable.getRect\n [ method ]\n *\n * The default function to get an Interactables bounding rect. Can be\n * overridden using @Interactable.rectChecker.\n *\n - element (Element) #optional The element to measure.\n = (object) The object's bounding rectangle.\n o {\n o top : 0,\n o left : 0,\n o bottom: 0,\n o right : 0,\n o width : 0,\n o height: 0\n o }\n \\*/\n getRect (element) {\n element = element || this.target;\n\n if (is.string(this.target) && !(is.element(element))) {\n element = this._context.querySelector(this.target);\n }\n\n return getElementRect(element);\n }\n\n /*\\\n * Interactable.rectChecker\n [ method ]\n *\n * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n - checker (function) #optional A function which returns this Interactable's bounding rectangle. See @Interactable.getRect\n = (function | object) The checker function or this Interactable\n \\*/\n rectChecker (checker) {\n if (is.function(checker)) {\n this.getRect = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.getRect;\n\n return this;\n }\n\n return this.getRect;\n }\n\n _backCompatOption (optionName, newValue) {\n if (trySelector(newValue) || is.object(newValue)) {\n this.options[optionName] = newValue;\n\n for (const action of actions.names) {\n this.options[action][optionName] = newValue;\n }\n\n return this;\n }\n\n return this.options[optionName];\n }\n\n /*\\\n * Interactable.origin\n [ method ]\n *\n * Gets or sets the origin of the Interactable's element. The x and y\n * of the origin will be subtracted from action event coordinates.\n *\n - origin (object | string) #optional An object eg. { x: 0, y: 0 } or string 'parent', 'self' or any CSS selector\n * OR\n - origin (Element) #optional An HTML or SVG Element whose rect will be used\n **\n = (object) The current origin or this Interactable\n \\*/\n origin (newValue) {\n return this._backCompatOption('origin', newValue);\n }\n\n /*\\\n * Interactable.deltaSource\n [ method ]\n *\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n - newValue (string) #optional Use 'client' if you will be scrolling while interacting; Use 'page' if you want autoScroll to work\n = (string | object) The current deltaSource or this Interactable\n \\*/\n deltaSource (newValue) {\n if (newValue === 'page' || newValue === 'client') {\n this.options.deltaSource = newValue;\n\n return this;\n }\n\n return this.options.deltaSource;\n }\n\n /*\\\n * Interactable.context\n [ method ]\n *\n * Gets the selector context Node of the Interactable. The default is `window.document`.\n *\n = (Node) The context Node of this Interactable\n **\n \\*/\n context () {\n return this._context;\n }\n\n inContext (element) {\n return (this._context === element.ownerDocument\n || nodeContains(this._context, element));\n }\n\n /*\\\n * Interactable.fire\n [ method ]\n *\n * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n - iEvent (InteractEvent) The InteractEvent object to be fired on this Interactable\n = (Interactable) this Interactable\n \\*/\n fire (iEvent) {\n this.events.fire(iEvent);\n\n return this;\n }\n\n _onOffMultiple (method, eventType, listener, options) {\n if (is.string(eventType) && eventType.search(' ') !== -1) {\n eventType = eventType.trim().split(/ +/);\n }\n\n if (is.array(eventType)) {\n for (let i = 0; i < eventType.length; i++) {\n this[method](eventType[i], listener, options);\n }\n\n return true;\n }\n\n if (is.object(eventType)) {\n for (const prop in eventType) {\n this[method](prop, eventType[prop], listener);\n }\n\n return true;\n }\n }\n\n /*\\\n * Interactable.on\n [ method ]\n *\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n - eventType (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) This Interactable\n \\*/\n on (eventType, listener, options) {\n if (this._onOffMultiple('on', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.on(eventType, listener);\n }\n // delegated event for selector\n else if (is.string(this.target)) {\n events.addDelegate(this.target, this._context, eventType, listener, options);\n }\n else {\n events.add(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.off\n [ method ]\n *\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n - eventType (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) This Interactable\n \\*/\n off (eventType, listener, options) {\n if (this._onOffMultiple('off', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n // if it is an action event type\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.off(eventType, listener);\n }\n // delegated event\n else if (is.string(this.target)) {\n events.removeDelegate(this.target, this._context, eventType, listener, options);\n }\n // remove listener from this Interatable's element\n else {\n events.remove(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.set\n [ method ]\n *\n * Reset the options of this Interactable\n - options (object) The new settings to apply\n = (object) This Interactable\n \\*/\n set (options) {\n if (!is.object(options)) {\n options = {};\n }\n\n this.options = extend({}, defaults.base);\n\n const perActions = extend({}, defaults.perAction);\n\n for (const actionName in actions.methodDict) {\n const methodName = actions.methodDict[actionName];\n\n this.options[actionName] = extend({}, defaults[actionName]);\n\n this.setPerAction(actionName, perActions);\n\n this[methodName](options[actionName]);\n }\n\n for (const setting of Interactable.settingsMethods) {\n this.options[setting] = defaults.base[setting];\n\n if (setting in options) {\n this[setting](options[setting]);\n }\n }\n\n signals.fire('set', {\n options,\n interactable: this,\n });\n\n return this;\n }\n\n /*\\\n * Interactable.unset\n [ method ]\n *\n * Remove this interactable from the list of interactables and remove\n * it's action capabilities and event listeners\n *\n = (object) @interact\n \\*/\n unset () {\n events.remove(this.target, 'all');\n\n if (is.string(this.target)) {\n // remove delegated events\n for (const type in events.delegatedEvents) {\n const delegated = events.delegatedEvents[type];\n\n if (delegated.selectors[0] === this.target\n && delegated.contexts[0] === this._context) {\n\n delegated.selectors.splice(0, 1);\n delegated.contexts .splice(0, 1);\n delegated.listeners.splice(0, 1);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegated[type] = null;\n }\n }\n\n events.remove(this._context, type, events.delegateListener);\n events.remove(this._context, type, events.delegateUseCapture, true);\n }\n }\n else {\n events.remove(this, 'all');\n }\n\n signals.fire('unset', { interactable: this });\n\n scope.interactables.splice(indexOf(scope.interactables, this), 1);\n\n // Stop related interactions when an Interactable is unset\n for (const interaction of scope.interactions || []) {\n if (interaction.target === this && interaction.interacting()) {\n interaction.stop();\n }\n }\n\n return scope.interact;\n }\n}\n\nscope.interactables.indexOfElement = function indexOfElement (target, context) {\n context = context || scope.document;\n\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n if (interactable.target === target && interactable._context === context) {\n return i;\n }\n }\n return -1;\n};\n\nscope.interactables.get = function interactableGet (element, options, dontCheckInContext) {\n const ret = this[this.indexOfElement(element, options && options.context)];\n\n return ret && (is.string(element) || dontCheckInContext || ret.inContext(element))? ret : null;\n};\n\nscope.interactables.forEachSelector = function (callback, element) {\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n // skip non CSS selector targets and out of context elements\n if (!is.string(interactable.target)\n || (element && !interactable.inContext(element))) {\n continue;\n }\n\n const ret = callback(interactable, interactable.target, interactable._context, i, this);\n\n if (ret !== undefined) {\n return ret;\n }\n }\n};\n\n// all interact.js eventTypes\nInteractable.eventTypes = scope.eventTypes = [];\n\nInteractable.signals = signals;\n\nInteractable.settingsMethods = [ 'deltaSource', 'origin', 'preventDefault', 'rectChecker' ];\n\nmodule.exports = Interactable;\n","const scope = require('./scope');\nconst utils = require('./utils');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst domObjects = require('./utils/domObjects');\nconst finder = require('./utils/interactionFinder');\nconst signals = require('./utils/Signals').new();\n\nconst listeners = {};\nconst methodNames = [\n 'pointerDown', 'pointerMove', 'pointerUp',\n 'updatePointer', 'removePointer',\n];\n\n// for ignoring browser's simulated mouse events\nlet prevTouchTime = 0;\n\n// all active and idle interactions\nscope.interactions = [];\n\nclass Interaction {\n constructor ({ pointerType }) {\n this.target = null; // current interactable being interacted with\n this.element = null; // the target element of the interactable\n\n this.prepared = { // action that's ready to be fired on next move event\n name : null,\n axis : null,\n edges: null,\n };\n\n // keep track of added pointers\n this.pointers = [];\n this.pointerIds = [];\n this.downTargets = [];\n this.downTimes = [];\n\n // Previous native pointer move event coordinates\n this.prevCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n // current native pointer move event coordinates\n this.curCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Starting InteractEvent pointer coordinates\n this.startCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Change in coordinates and time of the pointer\n this.pointerDelta = {\n page : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n client : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n timeStamp: 0,\n };\n\n this.downEvent = null; // pointerdown/mousedown/touchstart event\n this.downPointer = {};\n\n this._eventTarget = null;\n this._curEventTarget = null;\n\n this.prevEvent = null; // previous action event\n\n this.pointerIsDown = false;\n this.pointerWasMoved = false;\n this._interacting = false;\n\n this.pointerType = pointerType;\n\n signals.fire('new', this);\n\n scope.interactions.push(this);\n }\n\n pointerDown (pointer, event, eventTarget) {\n const pointerIndex = this.updatePointer(pointer, event, true);\n\n signals.fire('down', {\n pointer,\n event,\n eventTarget,\n pointerIndex,\n interaction: this,\n });\n }\n\n /*\\\n * Interaction.start\n [ method ]\n *\n * Start an action with the given Interactable and Element as tartgets. The\n * action must be enabled for the target Interactable and an appropriate number\n * of pointers must be held down - 1 for drag/resize, 2 for gesture.\n *\n * Use it with `interactable.able({ manualStart: false })` to always\n * [start actions manually](https://github.com/taye/interact.js/issues/114)\n *\n - action (object) The action to be performed - drag, resize, etc.\n - target (Interactable) The Interactable to target\n - element (Element) The DOM Element to target\n = (object) interact\n **\n | interact(target)\n | .draggable({\n | // disable the default drag start by down->move\n | manualStart: true\n | })\n | // start dragging after the user holds the pointer down\n | .on('hold', function (event) {\n | var interaction = event.interaction;\n |\n | if (!interaction.interacting()) {\n | interaction.start({ name: 'drag' },\n | event.interactable,\n | event.currentTarget);\n | }\n | });\n \\*/\n start (action, target, element) {\n if (this.interacting()\n || !this.pointerIsDown\n || this.pointerIds.length < (action.name === 'gesture'? 2 : 1)) {\n return;\n }\n\n // if this interaction had been removed after stopping\n // add it back\n if (utils.indexOf(scope.interactions, this) === -1) {\n scope.interactions.push(this);\n }\n\n utils.copyAction(this.prepared, action);\n this.target = target;\n this.element = element;\n\n signals.fire('action-start', {\n interaction: this,\n event: this.downEvent,\n });\n }\n\n pointerMove (pointer, event, eventTarget) {\n if (!this.simulation) {\n this.updatePointer(pointer);\n utils.setCoords(this.curCoords, this.pointers);\n }\n\n const duplicateMove = (this.curCoords.page.x === this.prevCoords.page.x\n && this.curCoords.page.y === this.prevCoords.page.y\n && this.curCoords.client.x === this.prevCoords.client.x\n && this.curCoords.client.y === this.prevCoords.client.y);\n\n let dx;\n let dy;\n\n // register movement greater than pointerMoveTolerance\n if (this.pointerIsDown && !this.pointerWasMoved) {\n dx = this.curCoords.client.x - this.startCoords.client.x;\n dy = this.curCoords.client.y - this.startCoords.client.y;\n\n this.pointerWasMoved = utils.hypot(dx, dy) > Interaction.pointerMoveTolerance;\n }\n\n const signalArg = {\n pointer,\n pointerIndex: this.getPointerIndex(pointer),\n event,\n eventTarget,\n dx,\n dy,\n duplicate: duplicateMove,\n interaction: this,\n interactingBeforeMove: this.interacting(),\n };\n\n if (!duplicateMove) {\n // set pointer coordinate, time changes and speeds\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n }\n\n signals.fire('move', signalArg);\n\n if (!duplicateMove) {\n // if interacting, fire an 'action-move' signal etc\n if (this.interacting()) {\n this.doMove(signalArg);\n }\n\n if (this.pointerWasMoved) {\n utils.copyCoords(this.prevCoords, this.curCoords);\n }\n }\n }\n\n /*\\\n * Interaction.doMove\n [ method ]\n *\n * Force a move of the current action at the same coordinates. Useful if\n * snap/restrict has been changed and you want a movement with the new\n * settings.\n *\n **\n | interact(target)\n | .draggable(true)\n | .on('dragmove', function (event) {\n | if (someCondition) {\n | // change the snap settings\n | event.interactable.draggable({ snap: { targets: [] }});\n | // fire another move event with re-calculated snap\n | event.interaction.doMove();\n | }\n | });\n \\*/\n doMove (signalArg) {\n signalArg = utils.extend({\n pointer: this.pointers[0],\n event: this.prevEvent,\n eventTarget: this._eventTarget,\n interaction: this,\n }, signalArg || {});\n\n signals.fire('before-action-move', signalArg);\n\n if (!this._dontFireMove) {\n signals.fire('action-move', signalArg);\n }\n\n this._dontFireMove = false;\n }\n\n // End interact move events and stop auto-scroll unless simulation is running\n pointerUp (pointer, event, eventTarget, curEventTarget) {\n const pointerIndex = this.getPointerIndex(pointer);\n\n signals.fire(/cancel$/i.test(event.type)? 'cancel' : 'up', {\n pointer,\n pointerIndex,\n event,\n eventTarget,\n curEventTarget,\n interaction: this,\n });\n\n if (!this.simulation) {\n this.end(event);\n }\n\n this.pointerIsDown = false;\n this.removePointer(pointer, event);\n }\n\n /*\\\n * Interaction.end\n [ method ]\n *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n - event (PointerEvent) #optional\n **\n | interact(target)\n | .draggable(true)\n | .on('move', function (event) {\n | if (event.pageX > 1000) {\n | // end the current action\n | event.interaction.end();\n | // stop all further listeners from being called\n | event.stopImmediatePropagation();\n | }\n | });\n \\*/\n end (event) {\n event = event || this.prevEvent;\n\n if (this.interacting()) {\n signals.fire('action-end', {\n event,\n interaction: this,\n });\n }\n\n this.stop();\n }\n\n currentAction () {\n return this._interacting? this.prepared.name: null;\n }\n\n interacting () {\n return this._interacting;\n }\n\n stop () {\n signals.fire('stop', { interaction: this });\n\n if (this._interacting) {\n signals.fire('stop-active', { interaction: this });\n signals.fire('stop-' + this.prepared.name, { interaction: this });\n }\n\n this.target = this.element = null;\n\n this._interacting = false;\n this.prepared.name = this.prevEvent = null;\n }\n\n getPointerIndex (pointer) {\n // mouse and pen interactions may have only one pointer\n if (this.pointerType === 'mouse' || this.pointerType === 'pen') {\n return 0;\n }\n\n return utils.indexOf(this.pointerIds, utils.getPointerId(pointer));\n }\n\n updatePointer (pointer, event, down = event && /(down|start)$/i.test(event.type)) {\n const id = utils.getPointerId(pointer);\n let index = this.getPointerIndex(pointer);\n\n if (index === -1) {\n index = this.pointerIds.length;\n this.pointerIds[index] = id;\n }\n\n if (down) {\n signals.fire('update-pointer-down', {\n pointer,\n event,\n down,\n pointerId: id,\n pointerIndex: index,\n interaction: this,\n });\n }\n\n this.pointers[index] = pointer;\n\n return index;\n }\n\n removePointer (pointer, event) {\n const index = this.getPointerIndex(pointer);\n\n if (index === -1) { return; }\n\n signals.fire('remove-pointer', {\n pointer,\n event,\n pointerIndex: index,\n interaction: this,\n });\n\n this.pointers .splice(index, 1);\n this.pointerIds .splice(index, 1);\n this.downTargets.splice(index, 1);\n this.downTimes .splice(index, 1);\n }\n\n _updateEventTargets (target, currentTarget) {\n this._eventTarget = target;\n this._curEventTarget = currentTarget;\n }\n}\n\nfor (let i = 0, len = methodNames.length; i < len; i++) {\n const method = methodNames[i];\n\n listeners[method] = doOnInteractions(method);\n}\n\nfunction doOnInteractions (method) {\n return (function (event) {\n const pointerType = utils.getPointerType(event);\n const [eventTarget, curEventTarget] = utils.getEventTargets(event);\n const matches = []; // [ [pointer, interaction], ...]\n\n if (browser.supportsTouch && /touch/.test(event.type)) {\n prevTouchTime = new Date().getTime();\n\n for (let i = 0; i < event.changedTouches.length; i++) {\n const pointer = event.changedTouches[i];\n const interaction = finder.search(pointer, event.type, eventTarget);\n\n matches.push([pointer, interaction || new Interaction({ pointerType })]);\n }\n }\n else {\n let invalidPointer = false;\n\n if (!browser.supportsPointerEvent && /mouse/.test(event.type)) {\n // ignore mouse events while touch interactions are active\n for (let i = 0; i < scope.interactions.length && !invalidPointer; i++) {\n invalidPointer = scope.interactions[i].pointerType !== 'mouse' && scope.interactions[i].pointerIsDown;\n }\n\n // try to ignore mouse events that are simulated by the browser\n // after a touch event\n invalidPointer = invalidPointer\n || (new Date().getTime() - prevTouchTime < 500)\n // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated\n || event.timeStamp === 0;\n }\n\n if (!invalidPointer) {\n let interaction = finder.search(event, event.type, eventTarget);\n\n if (!interaction) {\n interaction = new Interaction({ pointerType });\n }\n\n matches.push([event, interaction]);\n }\n }\n\n for (const [pointer, interaction] of matches) {\n interaction._updateEventTargets(eventTarget, curEventTarget);\n interaction[method](pointer, event, eventTarget, curEventTarget);\n }\n });\n}\n\nfunction endAll (event) {\n for (let i = 0; i < scope.interactions.length; i++) {\n const interaction = scope.interactions[i];\n\n interaction.end(event);\n signals.fire('endall', { event, interaction });\n }\n}\n\nconst docEvents = { /* 'eventType': listenerFunc */ };\nconst pEventTypes = browser.pEventTypes;\n\nif (domObjects.PointerEvent) {\n docEvents[pEventTypes.down ] = listeners.pointerDown;\n docEvents[pEventTypes.move ] = listeners.pointerMove;\n docEvents[pEventTypes.up ] = listeners.pointerUp;\n docEvents[pEventTypes.cancel] = listeners.pointerUp;\n}\nelse {\n docEvents.mousedown = listeners.pointerDown;\n docEvents.mousemove = listeners.pointerMove;\n docEvents.mouseup = listeners.pointerUp;\n\n docEvents.touchstart = listeners.pointerDown;\n docEvents.touchmove = listeners.pointerMove;\n docEvents.touchend = listeners.pointerUp;\n docEvents.touchcancel = listeners.pointerUp;\n}\n\ndocEvents.blur = endAll;\n\nfunction onDocSignal ({ doc }, signalName) {\n const eventMethod = signalName.indexOf('add') === 0\n ? events.add : events.remove;\n\n // delegate event listener\n for (const eventType in scope.delegatedEvents) {\n eventMethod(doc, eventType, events.delegateListener);\n eventMethod(doc, eventType, events.delegateUseCapture, true);\n }\n\n for (const eventType in docEvents) {\n eventMethod(doc, eventType, docEvents[eventType]);\n }\n}\n\nsignals.on('update-pointer-down', ({ interaction, pointer, pointerId, pointerIndex, event, eventTarget, down }) => {\n interaction.pointerIds[pointerIndex] = pointerId;\n interaction.pointers[pointerIndex] = pointer;\n\n if (down) {\n interaction.pointerIsDown = true;\n }\n\n if (!interaction.interacting()) {\n utils.setCoords(interaction.startCoords, interaction.pointers);\n\n utils.copyCoords(interaction.curCoords , interaction.startCoords);\n utils.copyCoords(interaction.prevCoords, interaction.startCoords);\n\n interaction.downEvent = event;\n interaction.downTimes[pointerIndex] = interaction.curCoords.timeStamp;\n interaction.downTargets[pointerIndex] = eventTarget || event && utils.getEventTargets(event)[0];\n interaction.pointerWasMoved = false;\n\n utils.pointerExtend(interaction.downPointer, pointer);\n }\n});\n\nscope.signals.on('add-document' , onDocSignal);\nscope.signals.on('remove-document', onDocSignal);\n\nInteraction.pointerMoveTolerance = 1;\nInteraction.doOnInteractions = doOnInteractions;\nInteraction.endAll = endAll;\nInteraction.signals = signals;\nInteraction.docEvents = docEvents;\n\nscope.endAllInteractions = endAll;\n\nmodule.exports = Interaction;\n","const Interaction = require('../Interaction');\nconst InteractEvent = require('../InteractEvent');\n\nconst actions = {\n firePrepared,\n names: [],\n methodDict: {},\n};\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n interaction._interacting = true;\n firePrepared(interaction, event, 'start');\n});\n\nInteraction.signals.on('action-move', function ({ interaction, event, preEnd }) {\n firePrepared(interaction, event, 'move', preEnd);\n\n // if the action was ended in a listener\n if (!interaction.interacting()) { return false; }\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n firePrepared(interaction, event, 'end');\n});\n\nfunction firePrepared (interaction, event, phase, preEnd) {\n const actionName = interaction.prepared.name;\n\n const newEvent = new InteractEvent(interaction, event, actionName, phase, interaction.element, null, preEnd);\n\n interaction.target.fire(newEvent);\n interaction.prevEvent = newEvent;\n}\n\nmodule.exports = actions;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drag = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n startAxis : 'xy',\n lockAxis : 'xy',\n },\n\n checker: function (pointer, event, interactable) {\n const dragOptions = interactable.options.drag;\n\n return dragOptions.enabled\n ? { name: 'drag', axis: (dragOptions.lockAxis === 'start'\n ? dragOptions.startAxis\n : dragOptions.lockAxis)}\n : null;\n },\n\n getCursor: function () {\n return 'move';\n },\n};\n\nInteraction.signals.on('before-action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n interaction.curCoords.page.y = interaction.startCoords.page.y;\n interaction.curCoords.client.y = interaction.startCoords.client.y;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vx);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vx);\n interaction.pointerDelta.client.vy = 0;\n interaction.pointerDelta.page.vy = 0;\n }\n else if (axis === 'y') {\n interaction.curCoords.page.x = interaction.startCoords.page.x;\n interaction.curCoords.client.x = interaction.startCoords.client.x;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vy);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vy);\n interaction.pointerDelta.client.vx = 0;\n interaction.pointerDelta.page.vx = 0;\n }\n});\n\n// dragmove\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'dragmove') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n iEvent.pageY = interaction.startCoords.page.y;\n iEvent.clientY = interaction.startCoords.client.y;\n iEvent.dy = 0;\n }\n else if (axis === 'y') {\n iEvent.pageX = interaction.startCoords.page.x;\n iEvent.clientX = interaction.startCoords.client.x;\n iEvent.dx = 0;\n }\n});\n\n/*\\\n * Interactable.draggable\n [ method ]\n *\n * Gets or sets whether drag actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of drag events\n | var isDraggable = interact('ul li').draggable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on drag events (object makes the Interactable draggable)\n = (object) This Interactable\n | interact(element).draggable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // the axis in which the first movement must be\n | // for the drag sequence to start\n | // 'xy' by default - any direction\n | startAxis: 'x' || 'y' || 'xy',\n |\n | // 'xy' by default - don't restrict to one axis (move in any direction)\n | // 'x' or 'y' to restrict movement to either axis\n | // 'start' to restrict movement to the axis the drag started in\n | lockAxis: 'x' || 'y' || 'xy' || 'start',\n |\n | // max number of drags that can happen concurrently\n | // with elements of this Interactable. Infinity by default\n | max: Infinity,\n |\n | // max number of drags that can target the same element+Interactable\n | // 1 by default\n | maxPerElement: 2\n | });\n\\*/\nInteractable.prototype.draggable = function (options) {\n if (utils.is.object(options)) {\n this.options.drag.enabled = options.enabled === false? false: true;\n this.setPerAction('drag', options);\n this.setOnEvents('drag', options);\n\n if (/^(xy|x|y|start)$/.test(options.lockAxis)) {\n this.options.drag.lockAxis = options.lockAxis;\n }\n if (/^(xy|x|y)$/.test(options.startAxis)) {\n this.options.drag.startAxis = options.startAxis;\n }\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drag.enabled = options;\n\n if (!options) {\n this.ondragstart = this.ondragstart = this.ondragend = null;\n }\n\n return this;\n }\n\n return this.options.drag;\n};\n\nactions.drag = drag;\nactions.names.push('drag');\nutils.merge(Interactable.eventTypes, [\n 'dragstart',\n 'dragmove',\n 'draginertiastart',\n 'draginertiaresume',\n 'dragend',\n]);\nactions.methodDict.drag = 'draggable';\n\ndefaultOptions.drag = drag.defaults;\n\nmodule.exports = drag;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst scope = require('../scope');\nconst interact = require('../interact');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drop = {\n defaults: {\n enabled: false,\n accept : null,\n overlap: 'pointer',\n },\n};\n\nlet dynamicDrop = false;\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // reset active dropzones\n interaction.activeDrops.dropzones = [];\n interaction.activeDrops.elements = [];\n interaction.activeDrops.rects = [];\n\n interaction.dropEvents = null;\n\n if (!interaction.dynamicDrop) {\n setActiveDrops(interaction, interaction.element);\n }\n\n const dragEvent = interaction.prevEvent;\n const dropEvents = getDropEvents(interaction, event, dragEvent);\n\n if (dropEvents.activate) {\n fireActiveDrops(interaction, dropEvents.activate);\n }\n});\n\nInteractEvent.signals.on('new', function ({ interaction, iEvent, event }) {\n if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { return; }\n\n const draggableElement = interaction.element;\n const dragEvent = iEvent;\n const dropResult = getDrop(dragEvent, event, draggableElement);\n\n interaction.dropTarget = dropResult.dropzone;\n interaction.dropElement = dropResult.element;\n\n interaction.dropEvents = getDropEvents(interaction, event, dragEvent);\n});\n\nInteraction.signals.on('action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n fireDropEvents(interaction, interaction.dropEvents);\n});\n\nInteraction.signals.on('action-end', function ({ interaction }) {\n if (interaction.prepared.name === 'drag') {\n fireDropEvents(interaction, interaction.dropEvents);\n }\n});\n\nInteraction.signals.on('stop-drag', function ({ interaction }) {\n interaction.activeDrops.dropzones =\n interaction.activeDrops.elements =\n interaction.activeDrops.rects =\n interaction.dropEvents = null;\n});\n\nfunction collectDrops (interaction, element) {\n const drops = [];\n const elements = [];\n\n element = element || interaction.element;\n\n // collect all dropzones and their elements which qualify for a drop\n for (const current of scope.interactables) {\n if (!current.options.drop.enabled) { continue; }\n\n const accept = current.options.drop.accept;\n\n // test the draggable element against the dropzone's accept setting\n if ((utils.is.element(accept) && accept !== element)\n || (utils.is.string(accept)\n && !utils.matchesSelector(element, accept))) {\n\n continue;\n }\n\n // query for new elements if necessary\n const dropElements = utils.is.string(current.target)\n ? current._context.querySelectorAll(current.target)\n : [current.target];\n\n for (let i = 0; i < dropElements.length; i++) {\n const currentElement = dropElements[i];\n\n if (currentElement !== element) {\n drops.push(current);\n elements.push(currentElement);\n }\n }\n }\n\n return {\n elements,\n dropzones: drops,\n };\n}\n\nfunction fireActiveDrops (interaction, event) {\n let prevElement;\n\n // loop through all active dropzones and trigger event\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n const current = interaction.activeDrops.dropzones[i];\n const currentElement = interaction.activeDrops.elements [i];\n\n // prevent trigger of duplicate events on same element\n if (currentElement !== prevElement) {\n // set current element as event target\n event.target = currentElement;\n current.fire(event);\n }\n prevElement = currentElement;\n }\n}\n\n// Collect a new set of possible drops and save them in activeDrops.\n// setActiveDrops should always be called when a drag has just started or a\n// drag event happens while dynamicDrop is true\nfunction setActiveDrops (interaction, dragElement) {\n // get dropzones and their elements that could receive the draggable\n const possibleDrops = collectDrops(interaction, dragElement, true);\n\n interaction.activeDrops.dropzones = possibleDrops.dropzones;\n interaction.activeDrops.elements = possibleDrops.elements;\n interaction.activeDrops.rects = [];\n\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n interaction.activeDrops.rects[i] =\n interaction.activeDrops.dropzones[i].getRect(interaction.activeDrops.elements[i]);\n }\n}\n\nfunction getDrop (dragEvent, event, dragElement) {\n const interaction = dragEvent.interaction;\n const validDrops = [];\n\n if (dynamicDrop) {\n setActiveDrops(interaction, dragElement);\n }\n\n // collect all dropzones and their elements which qualify for a drop\n for (let j = 0; j < interaction.activeDrops.dropzones.length; j++) {\n const current = interaction.activeDrops.dropzones[j];\n const currentElement = interaction.activeDrops.elements [j];\n const rect = interaction.activeDrops.rects [j];\n\n validDrops.push(current.dropCheck(dragEvent, event, interaction.target, dragElement, currentElement, rect)\n ? currentElement\n : null);\n }\n\n // get the most appropriate dropzone based on DOM depth and order\n const dropIndex = utils.indexOfDeepestElement(validDrops);\n\n return {\n dropzone: interaction.activeDrops.dropzones[dropIndex] || null,\n element : interaction.activeDrops.elements [dropIndex] || null,\n };\n}\n\nfunction getDropEvents (interaction, pointerEvent, dragEvent) {\n const dropEvents = {\n enter : null,\n leave : null,\n activate : null,\n deactivate: null,\n move : null,\n drop : null,\n };\n\n const tmpl = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n };\n\n if (interaction.dropElement !== interaction.prevDropElement) {\n // if there was a prevDropTarget, create a dragleave event\n if (interaction.prevDropTarget) {\n dropEvents.leave = utils.extend({ type: 'dragleave' }, tmpl);\n\n dragEvent.dragLeave = dropEvents.leave.target = interaction.prevDropElement;\n dragEvent.prevDropzone = dropEvents.leave.dropzone = interaction.prevDropTarget;\n }\n // if the dropTarget is not null, create a dragenter event\n if (interaction.dropTarget) {\n dropEvents.enter = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n type : 'dragenter',\n };\n\n dragEvent.dragEnter = interaction.dropElement;\n dragEvent.dropzone = interaction.dropTarget;\n }\n }\n\n if (dragEvent.type === 'dragend' && interaction.dropTarget) {\n dropEvents.drop = utils.extend({ type: 'drop' }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n dragEvent.relatedTarget = interaction.dropElement;\n }\n if (dragEvent.type === 'dragstart') {\n dropEvents.activate = utils.extend({ type: 'dropactivate' }, tmpl);\n\n dropEvents.activate.target = null;\n dropEvents.activate.dropzone = null;\n }\n if (dragEvent.type === 'dragend') {\n dropEvents.deactivate = utils.extend({ type: 'dropdeactivate' }, tmpl);\n\n dropEvents.deactivate.target = null;\n dropEvents.deactivate.dropzone = null;\n }\n if (dragEvent.type === 'dragmove' && interaction.dropTarget) {\n dropEvents.move = utils.extend({\n dragmove : dragEvent,\n type : 'dropmove',\n }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n }\n\n return dropEvents;\n}\n\nfunction fireDropEvents (interaction, dropEvents) {\n if (dropEvents.leave) { interaction.prevDropTarget.fire(dropEvents.leave); }\n if (dropEvents.move ) { interaction.dropTarget.fire(dropEvents.move ); }\n if (dropEvents.enter) { interaction.dropTarget.fire(dropEvents.enter); }\n if (dropEvents.drop ) { interaction.dropTarget.fire(dropEvents.drop ); }\n if (dropEvents.deactivate) {\n fireActiveDrops(interaction, dropEvents.deactivate);\n }\n\n interaction.prevDropTarget = interaction.dropTarget;\n interaction.prevDropElement = interaction.dropElement;\n}\n\n/*\\\n * Interactable.dropzone\n [ method ]\n *\n * Returns or sets whether elements can be dropped onto this\n * Interactable to trigger drop events\n *\n * Dropzones can receive the following events:\n * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends\n * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone\n * - `dragmove` when a draggable that has entered the dropzone is moved\n * - `drop` when a draggable is dropped into this dropzone\n *\n * Use the `accept` option to allow only elements that match the given CSS\n * selector or element. The value can be:\n *\n * - **an Element** - only that element can be dropped into this dropzone.\n * - **a string**, - the element being dragged must match it as a CSS selector.\n * - **`null`** - accept options is cleared - it accepts any element.\n *\n * Use the `overlap` option to set how drops are checked for. The allowed\n * values are:\n *\n * - `'pointer'`, the pointer must be over the dropzone (default)\n * - `'center'`, the draggable element's center must be over the dropzone\n * - a number from 0-1 which is the `(intersection area) / (draggable area)`.\n * e.g. `0.5` for drop to happen when half of the area of the draggable is\n * over the dropzone\n *\n * Use the `checker` option to specify a function to check if a dragged\n * element is over this Interactable.\n *\n | interact(target)\n | .dropChecker(function(dragEvent, // related dragmove or dragend event\n | event, // TouchEvent/PointerEvent/MouseEvent\n | dropped, // bool result of the default checker\n | dropzone, // dropzone Interactable\n | dropElement, // dropzone elemnt\n | draggable, // draggable Interactable\n | draggableElement) {// draggable element\n |\n | return dropped && event.target.hasAttribute('allow-drop');\n | }\n *\n *\n - options (boolean | object | null) #optional The new value to be set.\n | interact('.drop').dropzone({\n | accept: '.can-drop' || document.getElementById('single-drop'),\n | overlap: 'pointer' || 'center' || zeroToOne\n | }\n = (boolean | object) The current setting or this Interactable\n\\*/\nInteractable.prototype.dropzone = function (options) {\n if (utils.is.object(options)) {\n this.options.drop.enabled = options.enabled === false? false: true;\n\n if (utils.is.function(options.ondrop) ) { this.events.ondrop = options.ondrop ; }\n if (utils.is.function(options.ondropactivate) ) { this.events.ondropactivate = options.ondropactivate ; }\n if (utils.is.function(options.ondropdeactivate)) { this.events.ondropdeactivate = options.ondropdeactivate; }\n if (utils.is.function(options.ondragenter) ) { this.events.ondragenter = options.ondragenter ; }\n if (utils.is.function(options.ondragleave) ) { this.events.ondragleave = options.ondragleave ; }\n if (utils.is.function(options.ondropmove) ) { this.events.ondropmove = options.ondropmove ; }\n\n if (/^(pointer|center)$/.test(options.overlap)) {\n this.options.drop.overlap = options.overlap;\n }\n else if (utils.is.number(options.overlap)) {\n this.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0);\n }\n if ('accept' in options) {\n this.options.drop.accept = options.accept;\n }\n if ('checker' in options) {\n this.options.drop.checker = options.checker;\n }\n\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drop.enabled = options;\n\n if (!options) {\n this.ondragenter = this.ondragleave = this.ondrop\n = this.ondropactivate = this.ondropdeactivate = null;\n }\n\n return this;\n }\n\n return this.options.drop;\n};\n\nInteractable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) {\n let dropped = false;\n\n // if the dropzone has no rect (eg. display: none)\n // call the custom dropChecker or just return false\n if (!(rect = rect || this.getRect(dropElement))) {\n return (this.options.drop.checker\n ? this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement)\n : false);\n }\n\n const dropOverlap = this.options.drop.overlap;\n\n if (dropOverlap === 'pointer') {\n const origin = utils.getOriginXY(draggable, draggableElement, 'drag');\n const page = utils.getPageXY(dragEvent);\n\n page.x += origin.x;\n page.y += origin.y;\n\n const horizontal = (page.x > rect.left) && (page.x < rect.right);\n const vertical = (page.y > rect.top ) && (page.y < rect.bottom);\n\n dropped = horizontal && vertical;\n }\n\n const dragRect = draggable.getRect(draggableElement);\n\n if (dragRect && dropOverlap === 'center') {\n const cx = dragRect.left + dragRect.width / 2;\n const cy = dragRect.top + dragRect.height / 2;\n\n dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom;\n }\n\n if (dragRect && utils.is.number(dropOverlap)) {\n const overlapArea = (Math.max(0, Math.min(rect.right , dragRect.right ) - Math.max(rect.left, dragRect.left))\n * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top , dragRect.top )));\n\n const overlapRatio = overlapArea / (dragRect.width * dragRect.height);\n\n dropped = overlapRatio >= dropOverlap;\n }\n\n if (this.options.drop.checker) {\n dropped = this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement);\n }\n\n return dropped;\n};\n\nInteractable.signals.on('unset', function ({ interactable }) {\n interactable.dropzone(false);\n});\n\nInteractable.settingsMethods.push('dropChecker');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.dropTarget = null; // the dropzone a drag target might be dropped into\n interaction.dropElement = null; // the element at the time of checking\n interaction.prevDropTarget = null; // the dropzone that was recently dragged away from\n interaction.prevDropElement = null; // the element at the time of checking\n interaction.dropEvents = null; // the dropEvents related to the current drag event\n\n interaction.activeDrops = {\n dropzones: [], // the dropzones that are mentioned below\n elements : [], // elements of dropzones that accept the target draggable\n rects : [], // the rects of the elements mentioned above\n };\n\n});\n\nInteraction.signals.on('stop', function ({ interaction }) {\n interaction.dropTarget = interaction.dropElement =\n interaction.prevDropTarget = interaction.prevDropElement = null;\n});\n\n/*\\\n * interact.dynamicDrop\n [ method ]\n *\n * Returns or sets whether the dimensions of dropzone elements are\n * calculated on every dragmove or only on dragstart for the default\n * dropChecker\n *\n - newValue (boolean) #optional True to check on each move. False to check only before start\n = (boolean | interact) The current setting or interact\n\\*/\ninteract.dynamicDrop = function (newValue) {\n if (utils.is.bool(newValue)) {\n //if (dragging && dynamicDrop !== newValue && !newValue) {\n //calcRects(dropzones);\n //}\n\n dynamicDrop = newValue;\n\n return interact;\n }\n return dynamicDrop;\n};\n\nutils.merge(Interactable.eventTypes, [\n 'dragenter',\n 'dragleave',\n 'dropactivate',\n 'dropdeactivate',\n 'dropmove',\n 'drop',\n]);\nactions.methodDict.drop = 'dropzone';\n\ndefaultOptions.drop = drop.defaults;\n\nmodule.exports = drop;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst gesture = {\n defaults: {\n enabled : false,\n origin : null,\n restrict: null,\n },\n\n checker: function (pointer, event, interactable, element, interaction) {\n if (interaction.pointerIds.length >= 2) {\n return { name: 'gesture' };\n }\n\n return null;\n },\n\n getCursor: function () {\n return '';\n },\n};\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturestart') { return; }\n iEvent.ds = 0;\n\n interaction.gesture.startDistance = interaction.gesture.prevDistance = iEvent.distance;\n interaction.gesture.startAngle = interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.scale = 1;\n});\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturemove') { return; }\n\n iEvent.ds = iEvent.scale - interaction.gesture.scale;\n\n interaction.target.fire(iEvent);\n\n interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.prevDistance = iEvent.distance;\n\n if (iEvent.scale !== Infinity\n && iEvent.scale !== null\n && iEvent.scale !== undefined\n && !isNaN(iEvent.scale)) {\n\n interaction.gesture.scale = iEvent.scale;\n }\n});\n\n/*\\\n * Interactable.gesturable\n [ method ]\n *\n * Gets or sets whether multitouch gestures can be performed on the\n * Interactable's element\n *\n = (boolean) Indicates if this can be the target of gesture events\n | var isGestureable = interact(element).gesturable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on gesture events (makes the Interactable gesturable)\n = (object) this Interactable\n | interact(element).gesturable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // limit multiple gestures.\n | // See the explanation in @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n\\*/\nInteractable.prototype.gesturable = function (options) {\n if (utils.is.object(options)) {\n this.options.gesture.enabled = options.enabled === false? false: true;\n this.setPerAction('gesture', options);\n this.setOnEvents('gesture', options);\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.gesture.enabled = options;\n\n if (!options) {\n this.ongesturestart = this.ongesturestart = this.ongestureend = null;\n }\n\n return this;\n }\n\n return this.options.gesture;\n};\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action, event, starting, ending, deltaSource }) {\n if (action !== 'gesture') { return; }\n\n const pointers = interaction.pointers;\n\n iEvent.touches = [pointers[0], pointers[1]];\n\n if (starting) {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = 1;\n iEvent.ds = 0;\n iEvent.angle = utils.touchAngle(pointers, undefined, deltaSource);\n iEvent.da = 0;\n }\n else if (ending || event instanceof InteractEvent) {\n iEvent.distance = interaction.prevEvent.distance;\n iEvent.box = interaction.prevEvent.box;\n iEvent.scale = interaction.prevEvent.scale;\n iEvent.ds = iEvent.scale - 1;\n iEvent.angle = interaction.prevEvent.angle;\n iEvent.da = iEvent.angle - interaction.gesture.startAngle;\n }\n else {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = iEvent.distance / interaction.gesture.startDistance;\n iEvent.angle = utils.touchAngle(pointers, interaction.gesture.prevAngle, deltaSource);\n\n iEvent.ds = iEvent.scale - interaction.gesture.prevScale;\n iEvent.da = iEvent.angle - interaction.gesture.prevAngle;\n }\n});\n\nInteraction.signals.on('new', function (interaction) {\n interaction.gesture = {\n start: { x: 0, y: 0 },\n\n startDistance: 0, // distance between two touches of touchStart\n prevDistance : 0,\n distance : 0,\n\n scale: 1, // gesture.distance / gesture.startDistance\n\n startAngle: 0, // angle of line joining two touches\n prevAngle : 0, // angle of the previous gesture event\n };\n});\n\nactions.gesture = gesture;\nactions.names.push('gesture');\nutils.merge(Interactable.eventTypes, [\n 'gesturestart',\n 'gesturemove',\n 'gestureend',\n]);\nactions.methodDict.gesture = 'gesturable';\n\ndefaultOptions.gesture = gesture.defaults;\n\nmodule.exports = gesture;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\n// Less Precision with touch input\nconst defaultMargin = browser.supportsTouch || browser.supportsPointerEvent? 20: 10;\n\nconst resize = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n square: false,\n preserveAspectRatio: false,\n axis: 'xy',\n\n // use default margin\n margin: NaN,\n\n // object with props left, right, top, bottom which are\n // true/false values to resize when the pointer is over that edge,\n // CSS selectors to match the handles for each direction\n // or the Elements for each handle\n edges: null,\n\n // a value of 'none' will limit the resize rect to a minimum of 0x0\n // 'negate' will alow the rect to have negative width/height\n // 'reposition' will keep the width/height positive by swapping\n // the top and bottom edges and/or swapping the left and right edges\n invert: 'none',\n },\n\n checker: function (pointer, event, interactable, element, interaction, rect) {\n if (!rect) { return null; }\n\n const page = utils.extend({}, interaction.curCoords.page);\n const options = interactable.options;\n\n if (options.resize.enabled) {\n const resizeOptions = options.resize;\n const resizeEdges = { left: false, right: false, top: false, bottom: false };\n\n // if using resize.edges\n if (utils.is.object(resizeOptions.edges)) {\n for (const edge in resizeEdges) {\n resizeEdges[edge] = checkResizeEdge(edge,\n resizeOptions.edges[edge],\n page,\n interaction._eventTarget,\n element,\n rect,\n resizeOptions.margin || defaultMargin);\n }\n\n resizeEdges.left = resizeEdges.left && !resizeEdges.right;\n resizeEdges.top = resizeEdges.top && !resizeEdges.bottom;\n\n if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) {\n return {\n name: 'resize',\n edges: resizeEdges,\n };\n }\n }\n else {\n const right = options.resize.axis !== 'y' && page.x > (rect.right - defaultMargin);\n const bottom = options.resize.axis !== 'x' && page.y > (rect.bottom - defaultMargin);\n\n if (right || bottom) {\n return {\n name: 'resize',\n axes: (right? 'x' : '') + (bottom? 'y' : ''),\n };\n }\n }\n }\n\n return null;\n },\n\n cursors: (browser.isIe9OrOlder ? {\n x : 'e-resize',\n y : 's-resize',\n xy: 'se-resize',\n\n top : 'n-resize',\n left : 'w-resize',\n bottom : 's-resize',\n right : 'e-resize',\n topleft : 'se-resize',\n bottomright: 'se-resize',\n topright : 'ne-resize',\n bottomleft : 'ne-resize',\n } : {\n x : 'ew-resize',\n y : 'ns-resize',\n xy: 'nwse-resize',\n\n top : 'ns-resize',\n left : 'ew-resize',\n bottom : 'ns-resize',\n right : 'ew-resize',\n topleft : 'nwse-resize',\n bottomright: 'nwse-resize',\n topright : 'nesw-resize',\n bottomleft : 'nesw-resize',\n }),\n\n getCursor: function (action) {\n if (action.axis) {\n return resize.cursors[action.name + action.axis];\n }\n else if (action.edges) {\n let cursorKey = '';\n const edgeNames = ['top', 'bottom', 'left', 'right'];\n\n for (let i = 0; i < 4; i++) {\n if (action.edges[edgeNames[i]]) {\n cursorKey += edgeNames[i];\n }\n }\n\n return resize.cursors[cursorKey];\n }\n },\n};\n\n// resizestart\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'resizestart' || !interaction.prepared.edges) {\n return;\n }\n\n const startRect = interaction.target.getRect(interaction.element);\n const resizeOptions = interaction.target.options.resize;\n\n /*\n * When using the `resizable.square` or `resizable.preserveAspectRatio` options, resizing from one edge\n * will affect another. E.g. with `resizable.square`, resizing to make the right edge larger will make\n * the bottom edge larger by the same amount. We call these 'linked' edges. Any linked edges will depend\n * on the active edges and the edge being interacted with.\n */\n if (resizeOptions.square || resizeOptions.preserveAspectRatio) {\n const linkedEdges = utils.extend({}, interaction.prepared.edges);\n\n linkedEdges.top = linkedEdges.top || (linkedEdges.left && !linkedEdges.bottom);\n linkedEdges.left = linkedEdges.left || (linkedEdges.top && !linkedEdges.right );\n linkedEdges.bottom = linkedEdges.bottom || (linkedEdges.right && !linkedEdges.top );\n linkedEdges.right = linkedEdges.right || (linkedEdges.bottom && !linkedEdges.left );\n\n interaction.prepared._linkedEdges = linkedEdges;\n }\n else {\n interaction.prepared._linkedEdges = null;\n }\n\n // if using `resizable.preserveAspectRatio` option, record aspect ratio at the start of the resize\n if (resizeOptions.preserveAspectRatio) {\n interaction.resizeStartAspectRatio = startRect.width / startRect.height;\n }\n\n interaction.resizeRects = {\n start : startRect,\n current : utils.extend({}, startRect),\n inverted : utils.extend({}, startRect),\n previous : utils.extend({}, startRect),\n delta : {\n left: 0, right : 0, width : 0,\n top : 0, bottom: 0, height: 0,\n },\n };\n\n iEvent.rect = interaction.resizeRects.inverted;\n iEvent.deltaRect = interaction.resizeRects.delta;\n});\n\n// resizemove\nInteractEvent.signals.on('new', function ({ iEvent, phase, interaction }) {\n if (phase !== 'move' || !interaction.prepared.edges) { return; }\n\n const resizeOptions = interaction.target.options.resize;\n const invert = resizeOptions.invert;\n const invertible = invert === 'reposition' || invert === 'negate';\n\n let edges = interaction.prepared.edges;\n\n const start = interaction.resizeRects.start;\n const current = interaction.resizeRects.current;\n const inverted = interaction.resizeRects.inverted;\n const delta = interaction.resizeRects.delta;\n const previous = utils.extend(interaction.resizeRects.previous, inverted);\n const originalEdges = edges;\n\n let dx = iEvent.dx;\n let dy = iEvent.dy;\n\n if (resizeOptions.preserveAspectRatio || resizeOptions.square) {\n // `resize.preserveAspectRatio` takes precedence over `resize.square`\n const startAspectRatio = resizeOptions.preserveAspectRatio\n ? interaction.resizeStartAspectRatio\n : 1;\n\n edges = interaction.prepared._linkedEdges;\n\n if ((originalEdges.left && originalEdges.bottom)\n || (originalEdges.right && originalEdges.top)) {\n dy = -dx / startAspectRatio;\n }\n else if (originalEdges.left || originalEdges.right ) { dy = dx / startAspectRatio; }\n else if (originalEdges.top || originalEdges.bottom) { dx = dy * startAspectRatio; }\n }\n\n // update the 'current' rect without modifications\n if (edges.top ) { current.top += dy; }\n if (edges.bottom) { current.bottom += dy; }\n if (edges.left ) { current.left += dx; }\n if (edges.right ) { current.right += dx; }\n\n if (invertible) {\n // if invertible, copy the current rect\n utils.extend(inverted, current);\n\n if (invert === 'reposition') {\n // swap edge values if necessary to keep width/height positive\n let swap;\n\n if (inverted.top > inverted.bottom) {\n swap = inverted.top;\n\n inverted.top = inverted.bottom;\n inverted.bottom = swap;\n }\n if (inverted.left > inverted.right) {\n swap = inverted.left;\n\n inverted.left = inverted.right;\n inverted.right = swap;\n }\n }\n }\n else {\n // if not invertible, restrict to minimum of 0x0 rect\n inverted.top = Math.min(current.top, start.bottom);\n inverted.bottom = Math.max(current.bottom, start.top);\n inverted.left = Math.min(current.left, start.right);\n inverted.right = Math.max(current.right, start.left);\n }\n\n inverted.width = inverted.right - inverted.left;\n inverted.height = inverted.bottom - inverted.top ;\n\n for (const edge in inverted) {\n delta[edge] = inverted[edge] - previous[edge];\n }\n\n iEvent.edges = interaction.prepared.edges;\n iEvent.rect = inverted;\n iEvent.deltaRect = delta;\n});\n\n/*\\\n * Interactable.resizable\n [ method ]\n *\n * Gets or sets whether resize actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of resize elements\n | var isResizeable = interact('input[type=text]').resizable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on resize events (object makes the Interactable resizable)\n = (object) This Interactable\n | interact(element).resizable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | edges: {\n | top : true, // Use pointer coords to check for resize.\n | left : false, // Disable resizing from left edge.\n | bottom: '.resize-s',// Resize if pointer target matches selector\n | right : handleEl // Resize if pointer target is the given Element\n | },\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height are adjusted at a 1:1 ratio.\n | square: false,\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height maintain the aspect ratio they had when resizing started.\n | preserveAspectRatio: false,\n |\n | // a value of 'none' will limit the resize rect to a minimum of 0x0\n | // 'negate' will allow the rect to have negative width/height\n | // 'reposition' will keep the width/height positive by swapping\n | // the top and bottom edges and/or swapping the left and right edges\n | invert: 'none' || 'negate' || 'reposition'\n |\n | // limit multiple resizes.\n | // See the explanation in the @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n \\*/\nInteractable.prototype.resizable = function (options) {\n if (utils.is.object(options)) {\n this.options.resize.enabled = options.enabled === false? false: true;\n this.setPerAction('resize', options);\n this.setOnEvents('resize', options);\n\n if (/^x$|^y$|^xy$/.test(options.axis)) {\n this.options.resize.axis = options.axis;\n }\n else if (options.axis === null) {\n this.options.resize.axis = defaultOptions.resize.axis;\n }\n\n if (utils.is.bool(options.preserveAspectRatio)) {\n this.options.resize.preserveAspectRatio = options.preserveAspectRatio;\n }\n else if (utils.is.bool(options.square)) {\n this.options.resize.square = options.square;\n }\n\n return this;\n }\n if (utils.is.bool(options)) {\n this.options.resize.enabled = options;\n\n if (!options) {\n this.onresizestart = this.onresizestart = this.onresizeend = null;\n }\n\n return this;\n }\n return this.options.resize;\n};\n\nfunction checkResizeEdge (name, value, page, element, interactableElement, rect, margin) {\n // false, '', undefined, null\n if (!value) { return false; }\n\n // true value, use pointer coords and element rect\n if (value === true) {\n // if dimensions are negative, \"switch\" edges\n const width = utils.is.number(rect.width )? rect.width : rect.right - rect.left;\n const height = utils.is.number(rect.height)? rect.height : rect.bottom - rect.top ;\n\n if (width < 0) {\n if (name === 'left' ) { name = 'right'; }\n else if (name === 'right') { name = 'left' ; }\n }\n if (height < 0) {\n if (name === 'top' ) { name = 'bottom'; }\n else if (name === 'bottom') { name = 'top' ; }\n }\n\n if (name === 'left' ) { return page.x < ((width >= 0? rect.left: rect.right ) + margin); }\n if (name === 'top' ) { return page.y < ((height >= 0? rect.top : rect.bottom) + margin); }\n\n if (name === 'right' ) { return page.x > ((width >= 0? rect.right : rect.left) - margin); }\n if (name === 'bottom') { return page.y > ((height >= 0? rect.bottom: rect.top ) - margin); }\n }\n\n // the remaining checks require an element\n if (!utils.is.element(element)) { return false; }\n\n return utils.is.element(value)\n // the value is an element to use as a resize handle\n ? value === element\n // otherwise check if element matches value as selector\n : utils.matchesUpTo(element, value, interactableElement);\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.resizeAxes = 'xy';\n});\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action }) {\n if (action !== 'resize' || !interaction.resizeAxes) { return; }\n\n const options = interaction.target.options;\n\n if (options.resize.square) {\n if (interaction.resizeAxes === 'y') {\n iEvent.dx = iEvent.dy;\n }\n else {\n iEvent.dy = iEvent.dx;\n }\n iEvent.axes = 'xy';\n }\n else {\n iEvent.axes = interaction.resizeAxes;\n\n if (interaction.resizeAxes === 'x') {\n iEvent.dy = 0;\n }\n else if (interaction.resizeAxes === 'y') {\n iEvent.dx = 0;\n }\n }\n});\n\nactions.resize = resize;\nactions.names.push('resize');\nutils.merge(Interactable.eventTypes, [\n 'resizestart',\n 'resizemove',\n 'resizeinertiastart',\n 'resizeinertiaresume',\n 'resizeend',\n]);\nactions.methodDict.resize = 'resizable';\n\ndefaultOptions.resize = resize.defaults;\n\nmodule.exports = resize;\n","const raf = require('./utils/raf');\nconst getWindow = require('./utils/window').getWindow;\nconst is = require('./utils/is');\nconst domUtils = require('./utils/domUtils');\nconst Interaction = require('./Interaction');\nconst defaultOptions = require('./defaultOptions');\n\nconst autoScroll = {\n defaults: {\n enabled : false,\n container: null, // the item that is scrolled (Window or HTMLElement)\n margin : 60,\n speed : 300, // the scroll speed in pixels per second\n },\n\n interaction: null,\n i: null, // the handle returned by window.setInterval\n x: 0, y: 0, // Direction each pulse is to scroll in\n\n isScrolling: false,\n prevTime: 0,\n\n start: function (interaction) {\n autoScroll.isScrolling = true;\n raf.cancel(autoScroll.i);\n\n autoScroll.interaction = interaction;\n autoScroll.prevTime = new Date().getTime();\n autoScroll.i = raf.request(autoScroll.scroll);\n },\n\n stop: function () {\n autoScroll.isScrolling = false;\n raf.cancel(autoScroll.i);\n },\n\n // scroll the window by the values in scroll.x/y\n scroll: function () {\n const options = autoScroll.interaction.target.options[autoScroll.interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(autoScroll.interaction.element);\n const now = new Date().getTime();\n // change in time in seconds\n const dt = (now - autoScroll.prevTime) / 1000;\n // displacement\n const s = options.speed * dt;\n\n if (s >= 1) {\n if (is.window(container)) {\n container.scrollBy(autoScroll.x * s, autoScroll.y * s);\n }\n else if (container) {\n container.scrollLeft += autoScroll.x * s;\n container.scrollTop += autoScroll.y * s;\n }\n\n autoScroll.prevTime = now;\n }\n\n if (autoScroll.isScrolling) {\n raf.cancel(autoScroll.i);\n autoScroll.i = raf.request(autoScroll.scroll);\n }\n },\n check: function (interactable, actionName) {\n const options = interactable.options;\n\n return options[actionName].autoScroll && options[actionName].autoScroll.enabled;\n },\n onInteractionMove: function ({ interaction, pointer }) {\n if (!(interaction.interacting()\n && autoScroll.check(interaction.target, interaction.prepared.name))) {\n return;\n }\n\n if (interaction.simulation) {\n autoScroll.x = autoScroll.y = 0;\n return;\n }\n\n let top;\n let right;\n let bottom;\n let left;\n\n const options = interaction.target.options[interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(interaction.element);\n\n if (is.window(container)) {\n left = pointer.clientX < autoScroll.margin;\n top = pointer.clientY < autoScroll.margin;\n right = pointer.clientX > container.innerWidth - autoScroll.margin;\n bottom = pointer.clientY > container.innerHeight - autoScroll.margin;\n }\n else {\n const rect = domUtils.getElementClientRect(container);\n\n left = pointer.clientX < rect.left + autoScroll.margin;\n top = pointer.clientY < rect.top + autoScroll.margin;\n right = pointer.clientX > rect.right - autoScroll.margin;\n bottom = pointer.clientY > rect.bottom - autoScroll.margin;\n }\n\n autoScroll.x = (right ? 1: left? -1: 0);\n autoScroll.y = (bottom? 1: top? -1: 0);\n\n if (!autoScroll.isScrolling) {\n // set the autoScroll properties to those of the target\n autoScroll.margin = options.margin;\n autoScroll.speed = options.speed;\n\n autoScroll.start(interaction);\n }\n },\n};\n\nInteraction.signals.on('stop-active', function () {\n autoScroll.stop();\n});\n\nInteraction.signals.on('action-move', autoScroll.onInteractionMove);\n\ndefaultOptions.perAction.autoScroll = autoScroll.defaults;\n\nmodule.exports = autoScroll;\n","const Interactable = require('../Interactable');\nconst actions = require('../actions/base');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.ignoreFrom\n [ method ]\n *\n * If the target of the `mousedown`, `pointerdown` or `touchstart`\n * event or any of it's parents match the given CSS selector or\n * Element, no drag/resize/gesture is started.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to not ignore any elements\n = (string | Element | object) The current ignoreFrom value or this Interactable\n **\n | interact(element, { ignoreFrom: document.getElementById('no-action') });\n | // or\n | interact(element).ignoreFrom('input, textarea, a');\n\\*/\nInteractable.prototype.ignoreFrom = function (newValue) {\n return this._backCompatOption('ignoreFrom', newValue);\n};\n\n/*\\\n * Interactable.allowFrom\n [ method ]\n *\n * A drag/resize/gesture is started only If the target of the\n * `mousedown`, `pointerdown` or `touchstart` event or any of it's\n * parents match the given CSS selector or Element.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to allow from any element\n = (string | Element | object) The current allowFrom value or this Interactable\n **\n | interact(element, { allowFrom: document.getElementById('drag-handle') });\n | // or\n | interact(element).allowFrom('.handle');\n\\*/\nInteractable.prototype.allowFrom = function (newValue) {\n return this._backCompatOption('allowFrom', newValue);\n};\n\nInteractable.prototype.testIgnore = function (ignoreFrom, interactableElement, element) {\n if (!ignoreFrom || !is.element(element)) { return false; }\n\n if (is.string(ignoreFrom)) {\n return domUtils.matchesUpTo(element, ignoreFrom, interactableElement);\n }\n else if (is.element(ignoreFrom)) {\n return domUtils.nodeContains(ignoreFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testAllow = function (allowFrom, interactableElement, element) {\n if (!allowFrom) { return true; }\n\n if (!is.element(element)) { return false; }\n\n if (is.string(allowFrom)) {\n return domUtils.matchesUpTo(element, allowFrom, interactableElement);\n }\n else if (is.element(allowFrom)) {\n return domUtils.nodeContains(allowFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testIgnoreAllow = function (options, interactableElement, eventTarget) {\n return (!this.testIgnore(options.ignoreFrom, interactableElement, eventTarget)\n && this.testAllow(options.allowFrom, interactableElement, eventTarget));\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (event.buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\n","const interact = require('../interact');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst actions = require('../actions/base');\nconst defaultOptions = require('../defaultOptions');\nconst browser = require('../utils/browser');\nconst scope = require('../scope');\nconst utils = require('../utils');\nconst signals = require('../utils/Signals').new();\n\nrequire('./InteractableMethods');\n\nconst autoStart = {\n signals,\n withinInteractionLimit,\n // Allow this many interactions to happen simultaneously\n maxInteractions: Infinity,\n defaults: {\n perAction: {\n manualStart: false,\n max: Infinity,\n maxPerElement: 1,\n allowFrom: null,\n ignoreFrom: null,\n },\n },\n setActionDefaults: function (action) {\n utils.extend(action.defaults, autoStart.defaults.perAction);\n },\n};\n\n// set cursor style on mousedown\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget }) {\n if (interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\n// set cursor style on mousemove\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget }) {\n if (!interaction.mouse\n || interaction.pointerIsDown\n || interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\nInteraction.signals.on('move', function (arg) {\n const { interaction, event } = arg;\n\n if (!interaction.pointerIsDown\n || interaction.interacting()\n || !interaction.pointerWasMoved\n || !interaction.prepared.name) {\n return;\n }\n\n signals.fire('before-start', arg);\n\n const target = interaction.target;\n\n if (interaction.prepared.name && target) {\n // check manualStart and interaction limit\n if (target.options[interaction.prepared.name].manualStart\n || !withinInteractionLimit(target, interaction.element, interaction.prepared)) {\n interaction.stop(event);\n }\n else {\n interaction.start(interaction.prepared, target, interaction.element);\n }\n }\n});\n\n// Check if the current target supports the action.\n// If so, return the validated action. Otherwise, return null\nfunction validateAction (action, interactable, element, eventTarget) {\n if (utils.is.object(action)\n && interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget)\n && interactable.options[action.name].enabled\n && withinInteractionLimit(interactable, element, action)) {\n return action;\n }\n\n return null;\n}\n\nfunction validateSelector (interaction, pointer, event, matches, matchElements, eventTarget) {\n for (let i = 0, len = matches.length; i < len; i++) {\n const match = matches[i];\n const matchElement = matchElements[i];\n const action = validateAction(match.getAction(pointer, event, interaction, matchElement),\n match,\n matchElement,\n eventTarget);\n\n if (action) {\n return {\n action,\n target: match,\n element: matchElement,\n };\n }\n }\n\n return {};\n}\n\nfunction getActionInfo (interaction, pointer, event, eventTarget) {\n let matches = [];\n let matchElements = [];\n\n let element = eventTarget;\n let action = null;\n\n function pushMatches (interactable, selector, context) {\n const elements = (browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined);\n\n if (utils.matchesSelector(element, selector, elements)) {\n\n matches.push(interactable);\n matchElements.push(element);\n }\n }\n\n while (utils.is.element(element)) {\n matches = [];\n matchElements = [];\n\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && (action = validateAction(elementInteractable.getAction(pointer, event, interaction, element, eventTarget),\n elementInteractable,\n element,\n eventTarget))\n && !elementInteractable.options[action.name].manualStart) {\n return {\n element,\n action,\n target: elementInteractable,\n };\n }\n else {\n scope.interactables.forEachSelector(pushMatches, element);\n\n const actionInfo = validateSelector(interaction, pointer, event, matches, matchElements, eventTarget);\n\n if (actionInfo.action\n && !actionInfo.target.options[actionInfo.action.name].manualStart) {\n return actionInfo;\n }\n }\n\n element = utils.parentNode(element);\n }\n\n return {};\n}\n\nfunction prepare (interaction, { action, target, element }) {\n action = action || {};\n\n if (interaction.target && interaction.target.options.styleCursor) {\n interaction.target._doc.documentElement.style.cursor = '';\n }\n\n interaction.target = target;\n interaction.element = element;\n utils.copyAction(interaction.prepared, action);\n\n if (target && target.options.styleCursor) {\n const cursor = action? actions[action.name].getCursor(action) : '';\n interaction.target._doc.documentElement.style.cursor = cursor;\n }\n\n signals.fire('prepared', { interaction: interaction });\n}\n\nInteraction.signals.on('stop', function ({ interaction }) {\n const target = interaction.target;\n\n if (target && target.options.styleCursor) {\n target._doc.documentElement.style.cursor = '';\n }\n});\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (utils.is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (utils.is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n const buttons = event.buttons || ({\n 0: 1,\n 1: 4,\n 3: 8,\n 4: 16,\n })[event.button];\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\nfunction withinInteractionLimit (interactable, element, action) {\n const options = interactable.options;\n const maxActions = options[action.name].max;\n const maxPerElement = options[action.name].maxPerElement;\n let activeInteractions = 0;\n let targetCount = 0;\n let targetElementCount = 0;\n\n // no actions if any of these values == 0\n if (!(maxActions && maxPerElement && autoStart.maxInteractions)) { return; }\n\n for (let i = 0, len = scope.interactions.length; i < len; i++) {\n const interaction = scope.interactions[i];\n const otherAction = interaction.prepared.name;\n\n if (!interaction.interacting()) { continue; }\n\n activeInteractions++;\n\n if (activeInteractions >= autoStart.maxInteractions) {\n return false;\n }\n\n if (interaction.target !== interactable) { continue; }\n\n targetCount += (otherAction === action.name)|0;\n\n if (targetCount >= maxActions) {\n return false;\n }\n\n if (interaction.element === element) {\n targetElementCount++;\n\n if (otherAction !== action.name || targetElementCount >= maxPerElement) {\n return false;\n }\n }\n }\n\n return autoStart.maxInteractions > 0;\n}\n\n/*\\\n * interact.maxInteractions\n [ method ]\n **\n * Returns or sets the maximum number of concurrent interactions allowed.\n * By default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables\n * and elements, you need to enable it in the draggable, resizable and\n * gesturable `'max'` and `'maxPerElement'` options.\n **\n - newValue (number) #optional Any number. newValue <= 0 means no interactions.\n\\*/\ninteract.maxInteractions = function (newValue) {\n if (utils.is.number(newValue)) {\n autoStart.maxInteractions = newValue;\n\n return this;\n }\n\n return autoStart.maxInteractions;\n};\n\nInteractable.settingsMethods.push('styleCursor');\nInteractable.settingsMethods.push('actionChecker');\nInteractable.settingsMethods.push('ignoreFrom');\nInteractable.settingsMethods.push('allowFrom');\n\ndefaultOptions.base.actionChecker = null;\ndefaultOptions.base.styleCursor = true;\n\nutils.extend(defaultOptions.perAction, autoStart.defaults.perAction);\n\nmodule.exports = autoStart;\n","const autoStart = require('./base');\nconst Interaction = require('../Interaction');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.delayTimer = null;\n});\n\nautoStart.signals.on('prepared', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.delayTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.target, interaction.element);\n }, delay);\n }\n});\n\nInteraction.signals.on('move', function ({ interaction, duplicate }) {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.delayTimer);\n }\n});\n\n// prevent regular down->move autoStart\nautoStart.signals.on('before-start', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.prepared.name = null;\n }\n});\n","const autoStart = require('./base');\nconst scope = require('../scope');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\n\nconst { matchesSelector, parentNode } = require('../utils/domUtils');\n\nautoStart.setActionDefaults(require('../actions/drag'));\n\nautoStart.signals.on('before-start', function ({ interaction, eventTarget, dx, dy }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // check if a drag is in the correct axis\n const absX = Math.abs(dx);\n const absY = Math.abs(dy);\n const options = interaction.target.options.drag;\n const startAxis = options.startAxis;\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy');\n\n interaction.prepared.axis = options.lockAxis === 'start'\n ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n : options.lockAxis;\n\n // if the movement isn't in the startAxis of the interactable\n if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) {\n // cancel the prepared action\n interaction.prepared.name = null;\n\n // then try to get a drag from another ineractable\n\n if (!interaction.prepared.name) {\n\n let element = eventTarget;\n\n const getDraggable = function (interactable, selector, context) {\n const elements = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n if (interactable === interaction.target) { return; }\n\n if (!options.manualStart\n && !interactable.testIgnoreAllow(options, element, eventTarget)\n && matchesSelector(element, selector, elements)) {\n\n const action = interactable.getAction(interaction.downPointer,\n interaction.downEvent,\n interaction,\n element);\n\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, interactable)\n && autoStart.validateAction(action, interactable, element, eventTarget)) {\n\n return interactable;\n }\n }\n };\n\n let action = null;\n\n // check all interactables\n while (is.element(element)) {\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && elementInteractable !== interaction.target\n && !elementInteractable.options.drag.manualStart) {\n\n action = elementInteractable.getAction(interaction.downPointer, interaction.downEvent, interaction, element);\n }\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, elementInteractable)) {\n\n interaction.prepared.name = 'drag';\n interaction.target = elementInteractable;\n interaction.element = element;\n break;\n }\n\n const selectorInteractable = scope.interactables.forEachSelector(getDraggable, element);\n\n if (selectorInteractable) {\n interaction.prepared.name = 'drag';\n interaction.target = selectorInteractable;\n interaction.element = element;\n break;\n }\n\n element = parentNode(element);\n }\n }\n }\n});\n\nfunction checkStartAxis (startAxis, interactable) {\n if (!interactable) { return false; }\n\n const thisAxis = interactable.options.drag.startAxis;\n\n return (startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis);\n}\n","require('./base').setActionDefaults(require('../actions/gesture'));\n","require('./base').setActionDefaults(require('../actions/resize'));\n","module.exports = {\n base: {\n accept : null,\n preventDefault: 'auto',\n deltaSource : 'page',\n },\n\n perAction: {\n origin: { x: 0, y: 0 },\n\n // only allow left button by default\n // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n mouseButtons: 1,\n\n inertia: {\n enabled : false,\n resistance : 10, // the lambda in exponential decay\n minSpeed : 100, // target speed must be above this for inertia to start\n endSpeed : 10, // the speed at which inertia is slow enough to stop\n allowResume : true, // allow resuming an action in inertia phase\n smoothEndDuration: 300, // animate to snap/restrict endOnly if there's no inertia\n },\n },\n};\n","/* browser entry point */\n\n// Legacy browser support\nrequire('./legacyBrowsers');\n\n// inertia\nrequire('./inertia');\n\n// modifiers\nrequire('./modifiers/snap');\nrequire('./modifiers/restrict');\n\n// pointerEvents\nrequire('./pointerEvents/base');\nrequire('./pointerEvents/holdRepeat');\nrequire('./pointerEvents/interactableTargets');\n\n// delay\nrequire('./autoStart/delay');\n\n// actions\nrequire('./actions/gesture');\nrequire('./actions/resize');\nrequire('./actions/drag');\nrequire('./actions/drop');\n\n// load these modifiers after resize is loaded\nrequire('./modifiers/snapSize');\nrequire('./modifiers/restrictEdges');\nrequire('./modifiers/restrictSize');\n\n// autoStart actions\nrequire('./autoStart/gesture');\nrequire('./autoStart/resize');\nrequire('./autoStart/drag');\n\n// Interactable preventDefault setting\nrequire('./interactablePreventDefault.js');\n\n// autoScroll\nrequire('./autoScroll');\n\n// export interact\nmodule.exports = require('./interact');\n","const InteractEvent = require('./InteractEvent');\nconst Interaction = require('./Interaction');\nconst modifiers = require('./modifiers');\nconst utils = require('./utils');\nconst animationFrame = require('./utils/raf');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.inertiaStatus = {\n active : false,\n smoothEnd : false,\n allowResume: false,\n\n startEvent: null,\n upCoords : {},\n\n xe: 0, ye: 0,\n sx: 0, sy: 0,\n\n t0: 0,\n vx0: 0, vys: 0,\n duration: 0,\n\n lambda_v0: 0,\n one_ve_v0: 0,\n i : null,\n };\n\n interaction.boundInertiaFrame = () => inertiaFrame .apply(interaction);\n interaction.boundSmoothEndFrame = () => smoothEndFrame.apply(interaction);\n});\n\nInteraction.signals.on('down', function ({ interaction, event, pointer, eventTarget }) {\n const status = interaction.inertiaStatus;\n\n // Check if the down event hits the current inertia target\n if (status.active) {\n let element = eventTarget;\n\n // climb up the DOM tree from the event target\n while (utils.is.element(element)) {\n\n // if interaction element is the current inertia target element\n if (element === interaction.element) {\n // stop inertia\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n\n // update pointers to the down event's coordinates\n interaction.updatePointer(pointer);\n utils.setCoords(interaction.curCoords, interaction.pointers);\n\n // fire appropriate signals\n const signalArg = { interaction };\n Interaction.signals.fire('before-action-move', signalArg);\n Interaction.signals.fire('action-resume' , signalArg);\n\n // fire a reume event\n const resumeEvent = new InteractEvent(interaction,\n event,\n interaction.prepared.name,\n 'inertiaresume',\n interaction.element);\n\n interaction.target.fire(resumeEvent);\n interaction.prevEvent = resumeEvent;\n modifiers.resetStatuses(interaction.modifierStatuses);\n\n utils.copyCoords(interaction.prevCoords, interaction.curCoords);\n break;\n }\n\n element = utils.parentNode(element);\n }\n }\n});\n\nInteraction.signals.on('up', function ({ interaction, event }) {\n const status = interaction.inertiaStatus;\n\n if (!interaction.interacting() || status.active) { return; }\n\n const target = interaction.target;\n const options = target && target.options;\n const inertiaOptions = options && interaction.prepared.name && options[interaction.prepared.name].inertia;\n\n const now = new Date().getTime();\n const statuses = {};\n const page = utils.extend({}, interaction.curCoords.page);\n const pointerSpeed = interaction.pointerDelta.client.speed;\n\n let smoothEnd = false;\n let modifierResult;\n\n // check if inertia should be started\n const inertiaPossible = (inertiaOptions && inertiaOptions.enabled\n && interaction.prepared.name !== 'gesture'\n && event !== status.startEvent);\n\n const inertia = (inertiaPossible\n && (now - interaction.curCoords.timeStamp) < 50\n && pointerSpeed > inertiaOptions.minSpeed\n && pointerSpeed > inertiaOptions.endSpeed);\n\n const modifierArg = {\n interaction,\n pageCoords: page,\n statuses,\n preEnd: true,\n requireEndOnly: true,\n };\n\n // smoothEnd\n if (inertiaPossible && !inertia) {\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n if (modifierResult.shouldMove && modifierResult.locked) {\n smoothEnd = true;\n }\n }\n\n if (!(inertia || smoothEnd)) { return; }\n\n utils.copyCoords(status.upCoords, interaction.curCoords);\n\n interaction.pointers[0] = status.startEvent =\n new InteractEvent(interaction, event, interaction.prepared.name, 'inertiastart', interaction.element);\n\n status.t0 = now;\n\n status.active = true;\n status.allowResume = inertiaOptions.allowResume;\n interaction.simulation = status;\n\n target.fire(status.startEvent);\n\n if (inertia) {\n status.vx0 = interaction.pointerDelta.client.vx;\n status.vy0 = interaction.pointerDelta.client.vy;\n status.v0 = pointerSpeed;\n\n calcInertia(interaction, status);\n\n utils.extend(page, interaction.curCoords.page);\n\n page.x += status.xe;\n page.y += status.ye;\n\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n status.modifiedXe += modifierResult.dx;\n status.modifiedYe += modifierResult.dy;\n\n status.i = animationFrame.request(interaction.boundInertiaFrame);\n }\n else {\n status.smoothEnd = true;\n status.xe = modifierResult.dx;\n status.ye = modifierResult.dy;\n\n status.sx = status.sy = 0;\n\n status.i = animationFrame.request(interaction.boundSmoothEndFrame);\n }\n});\n\nInteraction.signals.on('stop-active', function ({ interaction }) {\n const status = interaction.inertiaStatus;\n\n if (status.active) {\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n }\n});\n\nfunction calcInertia (interaction, status) {\n const inertiaOptions = interaction.target.options[interaction.prepared.name].inertia;\n const lambda = inertiaOptions.resistance;\n const inertiaDur = -Math.log(inertiaOptions.endSpeed / status.v0) / lambda;\n\n status.x0 = interaction.prevEvent.pageX;\n status.y0 = interaction.prevEvent.pageY;\n status.t0 = status.startEvent.timeStamp / 1000;\n status.sx = status.sy = 0;\n\n status.modifiedXe = status.xe = (status.vx0 - inertiaDur) / lambda;\n status.modifiedYe = status.ye = (status.vy0 - inertiaDur) / lambda;\n status.te = inertiaDur;\n\n status.lambda_v0 = lambda / status.v0;\n status.one_ve_v0 = 1 - inertiaOptions.endSpeed / status.v0;\n}\n\nfunction inertiaFrame () {\n updateInertiaCoords(this);\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n\n const status = this.inertiaStatus;\n const options = this.target.options[this.prepared.name].inertia;\n const lambda = options.resistance;\n const t = new Date().getTime() / 1000 - status.t0;\n\n if (t < status.te) {\n\n const progress = 1 - (Math.exp(-lambda * t) - status.lambda_v0) / status.one_ve_v0;\n\n if (status.modifiedXe === status.xe && status.modifiedYe === status.ye) {\n status.sx = status.xe * progress;\n status.sy = status.ye * progress;\n }\n else {\n const quadPoint = utils.getQuadraticCurvePoint(0, 0,\n status.xe,\n status.ye,\n status.modifiedXe,\n status.modifiedYe,\n progress);\n\n status.sx = quadPoint.x;\n status.sy = quadPoint.y;\n }\n\n this.doMove();\n\n status.i = animationFrame.request(this.boundInertiaFrame);\n }\n else {\n status.sx = status.modifiedXe;\n status.sy = status.modifiedYe;\n\n this.doMove();\n this.end(status.startEvent);\n status.active = false;\n this.simulation = null;\n }\n\n utils.copyCoords(this.prevCoords, this.curCoords);\n}\n\nfunction smoothEndFrame () {\n updateInertiaCoords(this);\n\n const status = this.inertiaStatus;\n const t = new Date().getTime() - status.t0;\n const duration = this.target.options[this.prepared.name].inertia.smoothEndDuration;\n\n if (t < duration) {\n status.sx = utils.easeOutQuad(t, 0, status.xe, duration);\n status.sy = utils.easeOutQuad(t, 0, status.ye, duration);\n\n this.pointerMove(status.startEvent, status.startEvent);\n\n status.i = animationFrame.request(this.boundSmoothEndFrame);\n }\n else {\n status.sx = status.xe;\n status.sy = status.ye;\n\n this.pointerMove(status.startEvent, status.startEvent);\n this.end(status.startEvent);\n\n status.smoothEnd =\n status.active = false;\n this.simulation = null;\n }\n}\n\nfunction updateInertiaCoords (interaction) {\n const status = interaction.inertiaStatus;\n\n // return if inertia isn't running\n if (!status.active) { return; }\n\n const pageUp = status.upCoords.page;\n const clientUp = status.upCoords.client;\n\n utils.setCoords(interaction.curCoords, [ {\n pageX : pageUp.x + status.sx,\n pageY : pageUp.y + status.sy,\n clientX: clientUp.x + status.sx,\n clientY: clientUp.y + status.sy,\n } ]);\n}\n","const browser = require('./utils/browser');\nconst events = require('./utils/events');\nconst utils = require('./utils');\nconst scope = require('./scope');\nconst Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\n\nconst globalEvents = {};\n\n/*\\\n * interact\n [ method ]\n *\n * The methods of this variable can be used to set elements as\n * interactables and also to change various default settings.\n *\n * Calling it as a function and passing an element or a valid CSS selector\n * string returns an Interactable object which has various methods to\n * configure it.\n *\n - element (Element | string) The HTML or SVG Element to interact with or CSS selector\n = (object) An @Interactable\n *\n > Usage\n | interact('#draggable').draggable(true);\n |\n | var rectables = interact('rect');\n | rectables\n | .gesturable(true)\n | .on('gesturemove', function (event) {\n | // ...\n | });\n\\*/\nfunction interact (element, options) {\n let interactable = scope.interactables.get(element, options);\n\n if (!interactable) {\n interactable = new Interactable(element, options);\n interactable.events.global = globalEvents;\n }\n\n return interactable;\n}\n\n/*\\\n * interact.isSet\n [ method ]\n *\n * Check if an element has been set\n - element (Element) The Element being searched for\n = (boolean) Indicates if the element or CSS selector was previously passed to interact\n\\*/\ninteract.isSet = function (element, options) {\n return scope.interactables.indexOfElement(element, options && options.context) !== -1;\n};\n\n/*\\\n * interact.on\n [ method ]\n *\n * Adds a global listener for an InteractEvent or adds a DOM event to\n * `document`\n *\n - type (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) interact\n\\*/\ninteract.on = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.on(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.on(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n // if it is an InteractEvent type, add listener to globalEvents\n if (utils.contains(Interactable.eventTypes, type)) {\n // if this type of event was never bound\n if (!globalEvents[type]) {\n globalEvents[type] = [listener];\n }\n else {\n globalEvents[type].push(listener);\n }\n }\n // If non InteractEvent type, addEventListener to document\n else {\n events.add(scope.document, type, listener, { options });\n }\n\n return interact;\n};\n\n/*\\\n * interact.off\n [ method ]\n *\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n - type (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) interact\n \\*/\ninteract.off = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.off(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.off(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n if (!utils.contains(Interactable.eventTypes, type)) {\n events.remove(scope.document, type, listener, options);\n }\n else {\n let index;\n\n if (type in globalEvents\n && (index = utils.indexOf(globalEvents[type], listener)) !== -1) {\n globalEvents[type].splice(index, 1);\n }\n }\n\n return interact;\n};\n\n/*\\\n * interact.debug\n [ method ]\n *\n * Returns an object which exposes internal data\n = (object) An object with properties that outline the current state and expose internal functions and variables\n\\*/\ninteract.debug = function () {\n return scope;\n};\n\n// expose the functions used to calculate multi-touch properties\ninteract.getPointerAverage = utils.pointerAverage;\ninteract.getTouchBBox = utils.touchBBox;\ninteract.getTouchDistance = utils.touchDistance;\ninteract.getTouchAngle = utils.touchAngle;\n\ninteract.getElementRect = utils.getElementRect;\ninteract.getElementClientRect = utils.getElementClientRect;\ninteract.matchesSelector = utils.matchesSelector;\ninteract.closest = utils.closest;\n\n/*\\\n * interact.supportsTouch\n [ method ]\n *\n = (boolean) Whether or not the browser supports touch input\n\\*/\ninteract.supportsTouch = function () {\n return browser.supportsTouch;\n};\n\n/*\\\n * interact.supportsPointerEvent\n [ method ]\n *\n = (boolean) Whether or not the browser supports PointerEvents\n\\*/\ninteract.supportsPointerEvent = function () {\n return browser.supportsPointerEvent;\n};\n\n/*\\\n * interact.stop\n [ method ]\n *\n * Cancels all interactions (end events are not fired)\n *\n - event (Event) An event on which to call preventDefault()\n = (object) interact\n\\*/\ninteract.stop = function (event) {\n for (let i = scope.interactions.length - 1; i >= 0; i--) {\n scope.interactions[i].stop(event);\n }\n\n return interact;\n};\n\n/*\\\n * interact.pointerMoveTolerance\n [ method ]\n * Returns or sets the distance the pointer must be moved before an action\n * sequence occurs. This also affects tolerance for tap events.\n *\n - newValue (number) #optional The movement from the start position must be greater than this value\n = (number | Interactable) The current setting or interact\n\\*/\ninteract.pointerMoveTolerance = function (newValue) {\n if (utils.is.number(newValue)) {\n Interaction.pointerMoveTolerance = newValue;\n\n return this;\n }\n\n return Interaction.pointerMoveTolerance;\n};\n\ninteract.addDocument = scope.addDocument;\ninteract.removeDocument = scope.removeDocument;\n\nscope.interact = interact;\n\nmodule.exports = interact;\n","const Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\nconst scope = require('./scope');\nconst is = require('./utils/is');\nconst events = require('./utils/events');\n\nconst { nodeContains, matchesSelector } = require('./utils/domUtils');\n\n/*\\\n * Interactable.preventDefault\n [ method ]\n *\n * Returns or sets whether to prevent the browser's default behaviour\n * in response to pointer events. Can be set to:\n * - `'always'` to always prevent\n * - `'never'` to never prevent\n * - `'auto'` to let interact.js try to determine what would be best\n *\n - newValue (string) #optional `true`, `false` or `'auto'`\n = (string | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.preventDefault = function (newValue) {\n if (/^(always|never|auto)$/.test(newValue)) {\n this.options.preventDefault = newValue;\n return this;\n }\n\n if (is.bool(newValue)) {\n this.options.preventDefault = newValue? 'always' : 'never';\n return this;\n }\n\n return this.options.preventDefault;\n};\n\nInteractable.prototype.checkAndPreventDefault = function (event) {\n const setting = this.options.preventDefault;\n\n if (setting === 'never') { return; }\n\n if (setting === 'always') {\n event.preventDefault();\n return;\n }\n\n // setting === 'auto'\n\n // don't preventDefault if the browser supports passiveEvents\n // CSS touch-action and user-selecct should be used instead\n if (events.supportsOptions) {\n return;\n }\n\n // don't preventDefault of pointerdown events\n if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) {\n return;\n }\n\n // don't preventDefault on editable elements\n if (is.element(event.target)\n && matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) {\n return;\n }\n\n event.preventDefault();\n};\n\nfunction onInteractionEvent ({ interaction, event }) {\n if (interaction.target) {\n interaction.target.checkAndPreventDefault(event);\n }\n}\n\nfor (const eventSignal of ['down', 'move', 'up', 'cancel']) {\n Interaction.signals.on(eventSignal, onInteractionEvent);\n}\n\n// prevent native HTML5 drag on interact.js target elements\nInteraction.docEvents.dragstart = function preventNativeDrag (event) {\n for (const interaction of scope.interactions) {\n\n if (interaction.element\n && (interaction.element === event.target\n || nodeContains(interaction.element, event.target))) {\n\n interaction.target.checkAndPreventDefault(event);\n return;\n }\n }\n};\n","const scope = require('./scope');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst iFinder = require('./utils/interactionFinder');\nconst pointerEvents = require('./pointerEvents/base');\n\nconst { window } = require('./utils/window');\n\nconst toString = Object.prototype.toString;\n\nif (!window.Array.isArray) {\n window.Array.isArray = function (obj) {\n return toString.call(obj) === '[object Array]';\n };\n}\n\nif (!String.prototype.trim) {\n String.prototype.trim = function () {\n return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n };\n}\n\n// http://www.quirksmode.org/dom/events/click.html\n// >Events leading to dblclick\n//\n// IE8 doesn't fire down event before dblclick.\n// This workaround tries to fire a tap and doubletap after dblclick\nfunction onIE8Dblclick (event) {\n const eventTarget = event.target;\n const interaction = iFinder.search(event, event.type, eventTarget);\n\n if (!interaction) { return; }\n\n if (interaction.prevTap\n && event.clientX === interaction.prevTap.clientX\n && event.clientY === interaction.prevTap.clientY\n && eventTarget === interaction.prevTap.target) {\n\n interaction.downTargets[0] = eventTarget;\n interaction.downTimes [0] = new Date().getTime();\n\n pointerEvents.fire({\n interaction,\n event,\n eventTarget,\n pointer: event,\n type: 'tap',\n });\n }\n}\n\nif (browser.isIE8) {\n const selectFix = function (event) {\n for (const interaction of scope.interactions) {\n if (interaction.interacting()) {\n interaction.target.checkAndPreventDefault(event);\n }\n }\n };\n\n const onDocIE8 = function onDocIE8 ({ doc, win }, signalName) {\n const eventMethod = signalName.indexOf('listen') === 0\n ? events.add : events.remove;\n\n // For IE's lack of Event#preventDefault\n eventMethod(doc, 'selectstart', selectFix);\n\n if (pointerEvents) {\n eventMethod(doc, 'dblclick', onIE8Dblclick);\n }\n };\n\n scope.signals.on('add-document' , onDocIE8);\n scope.signals.on('remove-document', onDocIE8);\n}\n\nmodule.exports = null;\n","const InteractEvent = require('../InteractEvent');\nconst Interaction = require('../Interaction');\nconst extend = require('../utils/extend');\n\nconst modifiers = {\n names: [],\n\n setOffsets: function (arg) {\n const { interaction, pageCoords: page } = arg;\n const { target, element, startOffset } = interaction;\n const rect = target.getRect(element);\n\n if (rect) {\n startOffset.left = page.x - rect.left;\n startOffset.top = page.y - rect.top;\n\n startOffset.right = rect.right - page.x;\n startOffset.bottom = rect.bottom - page.y;\n\n if (!('width' in rect)) { rect.width = rect.right - rect.left; }\n if (!('height' in rect)) { rect.height = rect.bottom - rect.top ; }\n }\n else {\n startOffset.left = startOffset.top = startOffset.right = startOffset.bottom = 0;\n }\n\n arg.rect = rect;\n arg.interactable = target;\n arg.element = element;\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n\n arg.options = target.options[interaction.prepared.name][modifierName];\n\n if (!arg.options) {\n continue;\n }\n\n interaction.modifierOffsets[modifierName] = modifiers[modifierName].setOffset(arg);\n }\n },\n\n setAll: function (arg) {\n const { interaction, statuses, preEnd, requireEndOnly } = arg;\n const coords = extend({}, arg.pageCoords);\n const result = {\n dx: 0,\n dy: 0,\n changed: false,\n locked: false,\n shouldMove: true,\n };\n\n for (const modifierName of modifiers.names) {\n const modifier = modifiers[modifierName];\n const options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!shouldDo(options, preEnd, requireEndOnly)) { continue; }\n\n arg.status = arg.status = statuses[modifierName];\n arg.options = options;\n arg.offset = arg.interaction.modifierOffsets[modifierName];\n\n modifier.set(arg);\n\n if (arg.status.locked) {\n coords.x += arg.status.dx;\n coords.y += arg.status.dy;\n\n result.dx += arg.status.dx;\n result.dy += arg.status.dy;\n\n result.locked = true;\n }\n }\n\n // a move should be fired if:\n // - there are no modifiers enabled,\n // - no modifiers are \"locked\" i.e. have changed the pointer's coordinates, or\n // - the locked coords have changed since the last pointer move\n result.shouldMove = !arg.status || !result.locked || arg.status.changed;\n\n return result;\n },\n\n resetStatuses: function (statuses) {\n for (const modifierName of modifiers.names) {\n const status = statuses[modifierName] || {};\n\n status.dx = status.dy = 0;\n status.modifiedX = status.modifiedY = NaN;\n status.locked = false;\n status.changed = true;\n\n statuses[modifierName] = status;\n }\n\n return statuses;\n },\n\n start: function ({ interaction }, signalName) {\n const arg = {\n interaction,\n pageCoords: (signalName === 'action-resume' ?\n interaction.curCoords : interaction.startCoords).page,\n startOffset: interaction.startOffset,\n statuses: interaction.modifierStatuses,\n preEnd: false,\n requireEndOnly: false,\n };\n\n modifiers.setOffsets(arg);\n modifiers.resetStatuses(arg.statuses);\n\n arg.pageCoords = extend({}, interaction.startCoords.page);\n interaction.modifierResult = modifiers.setAll(arg);\n },\n};\n\nInteraction.signals.on('new', function (interaction) {\n interaction.startOffset = { left: 0, right: 0, top: 0, bottom: 0 };\n interaction.modifierOffsets = {};\n interaction.modifierStatuses = modifiers.resetStatuses({});\n interaction.modifierResult = null;\n});\n\nInteraction.signals.on('action-start' , modifiers.start);\nInteraction.signals.on('action-resume', modifiers.start);\n\nInteraction.signals.on('before-action-move', function ({ interaction, preEnd, interactingBeforeMove }) {\n const modifierResult = modifiers.setAll({\n interaction,\n preEnd,\n pageCoords: interaction.curCoords.page,\n statuses: interaction.modifierStatuses,\n requireEndOnly: false,\n });\n\n // don't fire an action move if a modifier would keep the event in the same\n // cordinates as before\n if (!modifierResult.shouldMove && interactingBeforeMove) {\n interaction._dontFireMove = true;\n }\n\n interaction.modifierResult = modifierResult;\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n for (let i = 0; i < modifiers.names.length; i++) {\n const options = interaction.target.options[interaction.prepared.name][modifiers.names[i]];\n\n // if the endOnly option is true for any modifier\n if (shouldDo(options, true, true)) {\n // fire a move event at the modified coordinates\n interaction.doMove({ event, preEnd: true });\n break;\n }\n }\n});\n\nInteractEvent.signals.on('set-xy', function (arg) {\n const { iEvent, interaction } = arg;\n const modifierArg = extend({}, arg);\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n modifierArg.options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!modifierArg.options) {\n continue;\n }\n\n const modifier = modifiers[modifierName];\n\n modifierArg.status = interaction.modifierStatuses[modifierName];\n\n iEvent[modifierName] = modifier.modifyCoords(modifierArg);\n }\n});\n\nfunction shouldDo (options, preEnd, requireEndOnly) {\n return (options && options.enabled\n && (preEnd || !options.endOnly)\n && (!requireEndOnly || options.endOnly));\n}\n\nmodule.exports = modifiers;\n","const modifiers = require('./index');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst restrict = {\n defaults: {\n enabled : false,\n endOnly : false,\n restriction: null,\n elementRect: null,\n },\n\n setOffset: function ({ rect, startOffset, options }) {\n const elementRect = options && options.elementRect;\n const offset = {};\n\n if (rect && elementRect) {\n offset.left = startOffset.left - (rect.width * elementRect.left);\n offset.top = startOffset.top - (rect.height * elementRect.top);\n\n offset.right = startOffset.right - (rect.width * (1 - elementRect.right));\n offset.bottom = startOffset.bottom - (rect.height * (1 - elementRect.bottom));\n }\n else {\n offset.left = offset.top = offset.right = offset.bottom = 0;\n }\n\n return offset;\n },\n\n set: function ({ pageCoords, interaction, status, options }) {\n if (!options) { return status; }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n\n const restriction = getRestrictionRect(options.restriction, interaction, page);\n\n if (!restriction) { return status; }\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n const rect = restriction;\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n const offset = interaction.modifierOffsets.restrict;\n\n // object is assumed to have\n // x, y, width, height or\n // left, top, right, bottom\n if ('x' in restriction && 'y' in restriction) {\n modifiedX = Math.max(Math.min(rect.x + rect.width - offset.right , page.x), rect.x + offset.left);\n modifiedY = Math.max(Math.min(rect.y + rect.height - offset.bottom, page.y), rect.y + offset.top );\n }\n else {\n modifiedX = Math.max(Math.min(rect.right - offset.right , page.x), rect.left + offset.left);\n modifiedY = Math.max(Math.min(rect.bottom - offset.bottom, page.y), rect.top + offset.top );\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const elementRect = options && options.elementRect;\n\n if (options && options.enabled\n && !(phase === 'start' && elementRect && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n getRestrictionRect,\n};\n\nfunction getRestrictionRect (value, interaction, page) {\n if (utils.is.function(value)) {\n return utils.resolveRectLike(value, interaction.target, interaction.element, [page.x, page.y, interaction]);\n } else {\n return utils.resolveRectLike(value, interaction.target, interaction.element);\n }\n}\n\nmodifiers.restrict = restrict;\nmodifiers.names.push('restrict');\n\ndefaultOptions.perAction.restrict = restrict.defaults;\n\nmodule.exports = restrict;\n","// This module adds the options.resize.restrictEdges setting which sets min and\n// max for the top, left, bottom and right edges of the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictEdges: {\n// inner: { top: 200, left: 200, right: 400, bottom: 400 },\n// outer: { top: 0, left: 0, right: 600, bottom: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst { getRestrictionRect } = require('./restrict');\n\nconst noInner = { top: +Infinity, left: +Infinity, bottom: -Infinity, right: -Infinity };\nconst noOuter = { top: -Infinity, left: -Infinity, bottom: +Infinity, right: +Infinity };\n\nconst restrictEdges = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n offset: null,\n },\n\n setOffset: function ({ interaction, startOffset, options }) {\n if (!options) {\n return utils.extend({}, startOffset);\n }\n\n const offset = getRestrictionRect(options.offset, interaction, interaction.startCoords.page);\n\n if (offset) {\n return {\n top: startOffset.top + offset.y,\n left: startOffset.left + offset.x,\n bottom: startOffset.bottom + offset.y,\n right: startOffset.right + offset.x,\n };\n }\n\n return startOffset;\n },\n\n set: function ({ pageCoords, interaction, status, offset, options }) {\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n const inner = rectUtils.xywhToTlbr(getRestrictionRect(options.inner, interaction, page)) || noInner;\n const outer = rectUtils.xywhToTlbr(getRestrictionRect(options.outer, interaction, page)) || noOuter;\n\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n if (edges.top) {\n modifiedY = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top);\n }\n else if (edges.bottom) {\n modifiedY = Math.max(Math.min(outer.bottom - offset.bottom, page.y), inner.bottom - offset.bottom);\n }\n if (edges.left) {\n modifiedX = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left);\n }\n else if (edges.right) {\n modifiedX = Math.max(Math.min(outer.right - offset.right, page.x), inner.right - offset.right);\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n if (options && options.enabled\n && !(phase === 'start' && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n noInner,\n noOuter,\n getRestrictionRect,\n};\n\nmodifiers.restrictEdges = restrictEdges;\nmodifiers.names.push('restrictEdges');\n\ndefaultOptions.perAction.restrictEdges = restrictEdges.defaults;\nresize.defaults.restrictEdges = restrictEdges.defaults;\n\nmodule.exports = restrictEdges;\n","// This module adds the options.resize.restrictSize setting which sets min and\n// max width and height for the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictSize: {\n// min: { width: -600, height: -600 },\n// max: { width: 600, height: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst restrictEdges = require('./restrictEdges');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst noMin = { width: -Infinity, height: -Infinity };\nconst noMax = { width: +Infinity, height: +Infinity };\n\nconst restrictSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n },\n\n setOffset: function ({ interaction }) {\n return interaction.startOffset;\n },\n\n set: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const rect = rectUtils.xywhToTlbr(interaction.resizeRects.inverted);\n\n const minSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.min, interaction)) || noMin;\n const maxSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.max, interaction)) || noMax;\n\n arg.options = {\n enabled: options.enabled,\n endOnly: options.endOnly,\n inner: utils.extend({}, restrictEdges.noInner),\n outer: utils.extend({}, restrictEdges.noOuter),\n };\n\n if (edges.top) {\n arg.options.inner.top = rect.bottom - minSize.height;\n arg.options.outer.top = rect.bottom - maxSize.height;\n }\n else if (edges.bottom) {\n arg.options.inner.bottom = rect.top + minSize.height;\n arg.options.outer.bottom = rect.top + maxSize.height;\n }\n if (edges.left) {\n arg.options.inner.left = rect.right - minSize.width;\n arg.options.outer.left = rect.right - maxSize.width;\n }\n else if (edges.right) {\n arg.options.inner.right = rect.left + minSize.width;\n arg.options.outer.right = rect.left + maxSize.width;\n }\n\n restrictEdges.set(arg);\n },\n\n modifyCoords: restrictEdges.modifyCoords,\n};\n\nmodifiers.restrictSize = restrictSize;\nmodifiers.names.push('restrictSize');\n\ndefaultOptions.perAction.restrictSize = restrictSize.defaults;\nresize.defaults.restrictSize = restrictSize.defaults;\n\nmodule.exports = restrictSize;\n","const modifiers = require('./index');\nconst interact = require('../interact');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst snap = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n\n relativePoints: null,\n },\n\n setOffset: function ({ interaction, interactable, element, rect, startOffset, options }) {\n const offsets = [];\n const optionsOrigin = utils.rectToXY(utils.resolveRectLike(options.origin));\n const origin = optionsOrigin || utils.getOriginXY(interactable, element, interaction.prepared.name);\n options = options || interactable.options[interaction.prepared.name].snap || {};\n\n let snapOffset;\n\n if (options.offset === 'startCoords') {\n snapOffset = {\n x: interaction.startCoords.page.x - origin.x,\n y: interaction.startCoords.page.y - origin.y,\n };\n }\n else {\n const offsetRect = utils.resolveRectLike(options.offset, interactable, element, [interaction]);\n\n snapOffset = utils.rectToXY(offsetRect) || { x: 0, y: 0 };\n }\n\n if (rect && options.relativePoints && options.relativePoints.length) {\n for (const { x: relativeX, y: relativeY } of options.relativePoints) {\n offsets.push({\n x: startOffset.left - (rect.width * relativeX) + snapOffset.x,\n y: startOffset.top - (rect.height * relativeY) + snapOffset.y,\n });\n }\n }\n else {\n offsets.push(snapOffset);\n }\n\n return offsets;\n },\n\n set: function ({ interaction, pageCoords, status, options, offset: offsets }) {\n const targets = [];\n let target;\n let page;\n let i;\n\n if (status.useStatusXY) {\n page = { x: status.x, y: status.y };\n }\n else {\n const origin = utils.getOriginXY(interaction.target, interaction.element, interaction.prepared.name);\n\n page = utils.extend({}, pageCoords);\n\n page.x -= origin.x;\n page.y -= origin.y;\n }\n\n status.realX = page.x;\n status.realY = page.y;\n\n let len = options.targets? options.targets.length : 0;\n\n for (const { x: offsetX, y: offsetY } of offsets) {\n const relativeX = page.x - offsetX;\n const relativeY = page.y - offsetY;\n\n for (const snapTarget of options.targets) {\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n targets.push({\n x: utils.is.number(target.x) ? (target.x + offsetX) : relativeX,\n y: utils.is.number(target.y) ? (target.y + offsetY) : relativeY,\n\n range: utils.is.number(target.range)? target.range: options.range,\n });\n }\n }\n\n const closest = {\n target: null,\n inRange: false,\n distance: 0,\n range: 0,\n dx: 0,\n dy: 0,\n };\n\n for (i = 0, len = targets.length; i < len; i++) {\n target = targets[i];\n\n const range = target.range;\n const dx = target.x - page.x;\n const dy = target.y - page.y;\n const distance = utils.hypot(dx, dy);\n let inRange = distance <= range;\n\n // Infinite targets count as being out of range\n // compared to non infinite ones that are in range\n if (range === Infinity && closest.inRange && closest.range !== Infinity) {\n inRange = false;\n }\n\n if (!closest.target || (inRange\n // is the closest target in range?\n ? (closest.inRange && range !== Infinity\n // the pointer is relatively deeper in this target\n ? distance / range < closest.distance / closest.range\n // this target has Infinite range and the closest doesn't\n : (range === Infinity && closest.range !== Infinity)\n // OR this target is closer that the previous closest\n || distance < closest.distance)\n // The other is not in range and the pointer is closer to this target\n : (!closest.inRange && distance < closest.distance))) {\n\n closest.target = target;\n closest.distance = distance;\n closest.range = range;\n closest.inRange = inRange;\n closest.dx = dx;\n closest.dy = dy;\n\n status.range = range;\n }\n }\n\n let snapChanged;\n\n if (closest.target) {\n snapChanged = (status.modifiedX !== closest.target.x || status.modifiedY !== closest.target.y);\n\n status.modifiedX = closest.target.x;\n status.modifiedY = closest.target.y;\n }\n else {\n snapChanged = true;\n\n status.modifiedX = NaN;\n status.modifiedY = NaN;\n }\n\n status.dx = closest.dx;\n status.dy = closest.dy;\n\n status.changed = (snapChanged || (closest.inRange && !status.locked));\n status.locked = closest.inRange;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const relativePoints = options && options.relativePoints;\n\n if (options && options.enabled\n && !(phase === 'start' && relativePoints && relativePoints.length)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n }\n\n return {\n range : status.range,\n locked : status.locked,\n x : status.modifiedX,\n y : status.modifiedY,\n realX : status.realX,\n realY : status.realY,\n dx : status.dx,\n dy : status.dy,\n };\n }\n },\n};\n\ninteract.createSnapGrid = function (grid) {\n return function (x, y) {\n const limits = grid.limits || {\n left : -Infinity,\n right : Infinity,\n top : -Infinity,\n bottom: Infinity,\n };\n let offsetX = 0;\n let offsetY = 0;\n\n if (utils.is.object(grid.offset)) {\n offsetX = grid.offset.x;\n offsetY = grid.offset.y;\n }\n\n const gridx = Math.round((x - offsetX) / grid.x);\n const gridy = Math.round((y - offsetY) / grid.y);\n\n const newX = Math.max(limits.left, Math.min(limits.right , gridx * grid.x + offsetX));\n const newY = Math.max(limits.top , Math.min(limits.bottom, gridy * grid.y + offsetY));\n\n return {\n x: newX,\n y: newY,\n range: grid.range,\n };\n };\n};\n\nmodifiers.snap = snap;\nmodifiers.names.push('snap');\n\ndefaultOptions.perAction.snap = snap.defaults;\n\nmodule.exports = snap;\n","// This module allows snapping of the size of targets during resize\n// interactions.\n\nconst modifiers = require('./index');\nconst snap = require('./snap');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\nconst utils = require('../utils/');\n\nconst snapSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n },\n\n setOffset: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.edges;\n\n if (!edges) { return; }\n\n arg.options = {\n relativePoints: [{\n x: edges.left? 0 : 1,\n y: edges.top ? 0 : 1,\n }],\n origin: { x: 0, y: 0 },\n offset: 'self',\n range: options.range,\n };\n\n const offsets = snap.setOffset(arg);\n arg.options = options;\n\n return offsets;\n },\n\n set: function (arg) {\n const { interaction, options, offset, pageCoords } = arg;\n const page = utils.extend({}, pageCoords);\n const relativeX = page.x - offset[0].x;\n const relativeY = page.y - offset[0].y;\n\n arg.options = utils.extend({}, options);\n arg.options.targets = [];\n\n for (const snapTarget of options.targets) {\n let target;\n\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n if ('width' in target && 'height' in target) {\n target.x = target.width;\n target.y = target.height;\n }\n\n arg.options.targets.push(target);\n }\n\n snap.set(arg);\n },\n\n modifyCoords: function (arg) {\n const { options } = arg;\n\n arg.options = utils.extend({}, options);\n arg.options.enabled = options.enabled;\n arg.options.relativePoints = [null];\n\n snap.modifyCoords(arg);\n },\n};\n\nmodifiers.snapSize = snapSize;\nmodifiers.names.push('snapSize');\n\ndefaultOptions.perAction.snapSize = snapSize.defaults;\nresize.defaults.snapSize = snapSize.defaults;\n\nmodule.exports = snapSize;\n","const pointerUtils = require('../utils/pointerUtils');\n\nmodule.exports = class PointerEvent {\n constructor (type, pointer, event, eventTarget, interaction) {\n pointerUtils.pointerExtend(this, event);\n\n if (event !== pointer) {\n pointerUtils.pointerExtend(this, pointer);\n }\n\n this.interaction = interaction;\n\n this.timeStamp = new Date().getTime();\n this.originalEvent = event;\n this.type = type;\n this.pointerId = pointerUtils.getPointerId(pointer);\n this.pointerType = pointerUtils.getPointerType(pointer);\n this.target = eventTarget;\n this.currentTarget = null;\n\n if (type === 'tap') {\n const pointerIndex = interaction.getPointerIndex(pointer);\n this.dt = this.timeStamp - interaction.downTimes[pointerIndex];\n\n const interval = this.timeStamp - interaction.tapTime;\n\n this.double = !!(interaction.prevTap\n && interaction.prevTap.type !== 'doubletap'\n && interaction.prevTap.target === this.target\n && interval < 500);\n }\n else if (type === 'doubletap') {\n this.dt = pointer.timeStamp - interaction.tapTime;\n }\n }\n\n subtractOrigin ({ x: originX, y: originY }) {\n this.pageX -= originX;\n this.pageY -= originY;\n this.clientX -= originX;\n this.clientY -= originY;\n\n return this;\n }\n\n addOrigin ({ x: originX, y: originY }) {\n this.pageX += originX;\n this.pageY += originY;\n this.clientX += originX;\n this.clientY += originY;\n\n return this;\n }\n\n preventDefault () {\n this.originalEvent.preventDefault();\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n};\n","const PointerEvent = require('./PointerEvent');\nconst Interaction = require('../Interaction');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst defaults = require('../defaultOptions');\nconst signals = require('../utils/Signals').new();\nconst { filter } = require('../utils/arr');\n\nconst simpleSignals = [ 'down', 'up', 'cancel' ];\nconst simpleEvents = [ 'down', 'up', 'cancel' ];\n\nconst pointerEvents = {\n PointerEvent,\n fire,\n collectEventTargets,\n signals,\n defaults: {\n holdDuration: 600,\n ignoreFrom : null,\n allowFrom : null,\n origin : { x: 0, y: 0 },\n },\n types: [\n 'down',\n 'move',\n 'up',\n 'cancel',\n 'tap',\n 'doubletap',\n 'hold',\n ],\n};\n\nfunction fire (arg) {\n const {\n interaction, pointer, event, eventTarget,\n type = arg.pointerEvent.type,\n targets = collectEventTargets(arg),\n pointerEvent = new PointerEvent(type, pointer, event, eventTarget, interaction),\n } = arg;\n\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n targets,\n type,\n pointerEvent,\n };\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n\n for (const prop in target.props || {}) {\n pointerEvent[prop] = target.props[prop];\n }\n\n const origin = utils.getOriginXY(target.eventable, target.element);\n\n pointerEvent.subtractOrigin(origin);\n pointerEvent.eventable = target.eventable;\n pointerEvent.currentTarget = target.element;\n\n target.eventable.fire(pointerEvent);\n\n pointerEvent.addOrigin(origin);\n\n if (pointerEvent.immediatePropagationStopped\n || (pointerEvent.propagationStopped\n && (i + 1) < targets.length && targets[i + 1].element !== pointerEvent.currentTarget)) {\n break;\n }\n }\n\n signals.fire('fired', signalArg);\n\n if (type === 'tap') {\n // if pointerEvent should make a double tap, create and fire a doubletap\n // PointerEvent and use that as the prevTap\n const prevTap = pointerEvent.double\n ? fire({\n interaction, pointer, event, eventTarget,\n type: 'doubletap',\n })\n : pointerEvent;\n\n interaction.prevTap = prevTap;\n interaction.tapTime = prevTap.timeStamp;\n }\n\n return pointerEvent;\n}\n\nfunction collectEventTargets ({ interaction, pointer, event, eventTarget, type }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n // do not fire a tap event if the pointer was moved before being lifted\n if (type === 'tap' && (interaction.pointerWasMoved\n // or if the pointerup target is different to the pointerdown target\n || !(interaction.downTargets[pointerIndex] && interaction.downTargets[pointerIndex] === eventTarget))) {\n return [];\n }\n\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n path,\n targets: [],\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (type === 'hold') {\n signalArg.targets = filter(signalArg.targets, target =>\n target.eventable.options.holdDuration === interaction.holdTimers[pointerIndex].duration);\n }\n\n return signalArg.targets;\n}\n\nInteraction.signals.on('update-pointer-down', function ({ interaction, pointerIndex }) {\n interaction.holdTimers[pointerIndex] = { duration: Infinity, timeout: null };\n});\n\nInteraction.signals.on('remove-pointer', function ({ interaction, pointerIndex }) {\n interaction.holdTimers.splice(pointerIndex, 1);\n});\n\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget, duplicateMove }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n if (!duplicateMove && (!interaction.pointerIsDown || interaction.pointerWasMoved)) {\n if (interaction.pointerIsDown) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n\n fire({\n interaction, pointer, event, eventTarget,\n type: 'move',\n });\n }\n});\n\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget, pointerIndex }) {\n // copy event to be used in timeout for IE8\n const eventCopy = browser.isIE8? utils.extend({}, event) : event;\n\n const timer = interaction.holdTimers[pointerIndex];\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'hold',\n targets: [],\n path,\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (!signalArg.targets.length) { return; }\n\n let minDuration = Infinity;\n\n for (let i = 0; i < signalArg.targets.length; i++) {\n const target = signalArg.targets[i];\n const holdDuration = target.eventable.options.holdDuration;\n\n if (holdDuration < minDuration) {\n minDuration = holdDuration;\n }\n }\n\n timer.duration = minDuration;\n timer.timeout = setTimeout(function () {\n fire({\n interaction,\n eventTarget,\n pointer: browser.isIE8? eventCopy : pointer,\n event: eventCopy,\n type: 'hold',\n });\n }, minDuration);\n});\n\nInteraction.signals.on('up', ({ interaction, pointer, event, eventTarget }) => {\n if (!interaction.pointerWasMoved) {\n fire({ interaction, eventTarget, pointer, event, type: 'tap' });\n }\n});\n\n['up', 'cancel'].forEach(function (signalName) {\n Interaction.signals.on(signalName, function ({ interaction, pointerIndex }) {\n if (interaction.holdTimers[pointerIndex]) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n });\n});\n\nfunction createSignalListener (type) {\n return function ({ interaction, pointer, event, eventTarget }) {\n fire({ interaction, eventTarget, pointer, event, type });\n };\n}\n\nfor (let i = 0; i < simpleSignals.length; i++) {\n Interaction.signals.on(simpleSignals[i], createSignalListener(simpleEvents[i]));\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.prevTap = null; // the most recent tap event on this interaction\n interaction.tapTime = 0; // time of the most recent tap event\n interaction.holdTimers = []; // [{ duration, timeout }]\n});\n\ndefaults.pointerEvents = pointerEvents.defaults;\nmodule.exports = pointerEvents;\n","const pointerEvents = require('./base');\nconst Interaction = require('../Interaction');\n\npointerEvents.signals.on('new', onNew);\npointerEvents.signals.on('fired', onFired);\n\nfor (const signal of ['move', 'up', 'cancel', 'endall']) {\n Interaction.signals.on(signal, endHoldRepeat);\n}\n\nfunction onNew ({ pointerEvent }) {\n if (pointerEvent.type !== 'hold') { return; }\n\n pointerEvent.count = (pointerEvent.count || 0) + 1;\n}\n\nfunction onFired ({ interaction, pointerEvent, eventTarget, targets }) {\n if (pointerEvent.type !== 'hold' || !targets.length) { return; }\n\n // get the repeat interval from the first eventable\n const interval = targets[0].eventable.options.holdRepeatInterval;\n\n // don't repeat if the interval is 0 or less\n if (interval <= 0) { return; }\n\n // set a timeout to fire the holdrepeat event\n interaction.holdIntervalHandle = setTimeout(function () {\n pointerEvents.fire({\n interaction,\n eventTarget,\n type: 'hold',\n pointer: pointerEvent,\n event: pointerEvent,\n });\n }, interval);\n}\n\nfunction endHoldRepeat ({ interaction }) {\n // set the interaction's holdStopTime property\n // to stop further holdRepeat events\n if (interaction.holdIntervalHandle) {\n clearInterval(interaction.holdIntervalHandle);\n interaction.holdIntervalHandle = null;\n }\n}\n\n// don't repeat by default\npointerEvents.defaults.holdRepeatInterval = 0;\npointerEvents.types.push('holdrepeat');\n\nmodule.exports = {\n onNew,\n onFired,\n endHoldRepeat,\n};\n","const pointerEvents = require('./base');\nconst Interactable = require('../Interactable');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\nconst scope = require('../scope');\nconst extend = require('../utils/extend');\nconst { merge } = require('../utils/arr');\n\npointerEvents.signals.on('collect-targets', function ({ targets, element, type, eventTarget }) {\n function collectSelectors (interactable, selector, context) {\n const els = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && is.element(element)\n && domUtils.matchesSelector(element, selector, els)\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n const interactable = scope.interactables.get(element);\n\n if (interactable) {\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n scope.interactables.forEachSelector(collectSelectors, element);\n});\n\nInteractable.signals.on('new', function ({ interactable }) {\n interactable.events.getRect = function (element) {\n return interactable.getRect(element);\n };\n});\n\nInteractable.signals.on('set', function ({ interactable, options }) {\n extend(interactable.events.options, pointerEvents.defaults);\n extend(interactable.events.options, options);\n});\n\nmerge(Interactable.eventTypes, pointerEvents.types);\n\nInteractable.prototype.pointerEvents = function (options) {\n extend(this.events.options, options);\n\n return this;\n};\n\nconst __backCompatOption = Interactable.prototype._backCompatOption;\n\nInteractable.prototype._backCompatOption = function (optionName, newValue) {\n const ret = __backCompatOption.call(this, optionName, newValue);\n\n if (ret === this) {\n this.events.options[optionName] = newValue;\n }\n\n return ret;\n};\n\nInteractable.settingsMethods.push('pointerEvents');\n","const utils = require('./utils');\nconst events = require('./utils/events');\nconst signals = require('./utils/Signals').new();\n\nconst scope = {\n signals,\n events,\n utils,\n\n // main document\n document: require('./utils/domObjects').document,\n // all documents being listened to\n documents: [],\n\n addDocument: function (doc, win) {\n // do nothing if document is already known\n if (utils.contains(scope.documents, doc)) { return false; }\n\n win = win || scope.getWindow(doc);\n\n scope.documents.push(doc);\n events.documents.push(doc);\n\n // don't add an unload event for the main document\n // so that the page may be cached in browser history\n if (doc !== scope.document) {\n events.add(win, 'unload', scope.onWindowUnload);\n }\n\n signals.fire('add-document', { doc, win });\n },\n\n removeDocument: function (doc, win) {\n const index = utils.indexOf(scope.documents, doc);\n\n win = win || scope.getWindow(doc);\n\n events.remove(win, 'unload', scope.onWindowUnload);\n\n scope.documents.splice(index, 1);\n events.documents.splice(index, 1);\n\n signals.fire('remove-document', { win, doc });\n },\n\n onWindowUnload: function () {\n scope.removeDocument(this.document, this);\n },\n};\n\nmodule.exports = scope;\n","const { indexOf } = require('./arr');\n\nclass Signals {\n constructor () {\n this.listeners = {\n // signalName: [listeners],\n };\n }\n\n on (name, listener) {\n if (!this.listeners[name]) {\n this.listeners[name] = [listener];\n return;\n }\n\n this.listeners[name].push(listener);\n }\n\n off (name, listener) {\n if (!this.listeners[name]) { return; }\n\n const index = indexOf(this.listeners[name], listener);\n\n if (index !== -1) {\n this.listeners[name].splice(index, 1);\n }\n }\n\n fire (name, arg) {\n const targetListeners = this.listeners[name];\n\n if (!targetListeners) { return; }\n\n for (let i = 0; i < targetListeners.length; i++) {\n if (targetListeners[i](arg, name) === false) {\n return;\n }\n }\n }\n}\n\nSignals.new = function () {\n return new Signals();\n};\n\nmodule.exports = Signals;\n","function indexOf (array, target) {\n for (let i = 0, len = array.length; i < len; i++) {\n if (array[i] === target) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction contains (array, target) {\n return indexOf(array, target) !== -1;\n}\n\nfunction merge (target, source) {\n for (let i = 0; i < source.length; i++) {\n target.push(source[i]);\n }\n\n return target;\n}\n\nfunction filter (array, test) {\n const result = [];\n\n for (let i = 0; i < array.length; i++) {\n if (test(array[i])) {\n result.push(array[i]);\n }\n }\n\n return result;\n}\n\nmodule.exports = {\n indexOf,\n contains,\n merge,\n filter,\n};\n","const { window } = require('./window');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst Element = domObjects.Element;\nconst navigator = window.navigator;\n\nconst browser = {\n // Does the browser support touch input?\n supportsTouch: !!(('ontouchstart' in window) || is.function(window.DocumentTouch)\n && domObjects.document instanceof window.DocumentTouch),\n\n // Does the browser support PointerEvents\n supportsPointerEvent: !!domObjects.PointerEvent,\n\n isIE8: ('attachEvent' in window) && !('addEventListener' in window),\n\n // Opera Mobile must be handled differently\n isOperaMobile: (navigator.appName === 'Opera'\n && browser.supportsTouch\n && navigator.userAgent.match('Presto')),\n\n // scrolling doesn't change the result of getClientRects on iOS 7\n isIOS7: (/iP(hone|od|ad)/.test(navigator.platform)\n && /OS 7[^\\d]/.test(navigator.appVersion)),\n\n isIe9OrOlder: /MSIE (8|9)/.test(navigator.userAgent),\n\n // prefix matchesSelector\n prefixedMatchesSelector: 'matches' in Element.prototype\n ? 'matches': 'webkitMatchesSelector' in Element.prototype\n ? 'webkitMatchesSelector': 'mozMatchesSelector' in Element.prototype\n ? 'mozMatchesSelector': 'oMatchesSelector' in Element.prototype\n ? 'oMatchesSelector': 'msMatchesSelector',\n\n useMatchesSelectorPolyfill: false,\n\n pEventTypes: (domObjects.PointerEvent\n ? (domObjects.PointerEvent === window.MSPointerEvent\n ? {\n up: 'MSPointerUp',\n down: 'MSPointerDown',\n over: 'mouseover',\n out: 'mouseout',\n move: 'MSPointerMove',\n cancel: 'MSPointerCancel',\n }\n : {\n up: 'pointerup',\n down: 'pointerdown',\n over: 'pointerover',\n out: 'pointerout',\n move: 'pointermove',\n cancel: 'pointercancel',\n })\n : null),\n\n // because Webkit and Opera still use 'mousewheel' event type\n wheelEvent: 'onmousewheel' in domObjects.document? 'mousewheel': 'wheel',\n\n};\n\nbrowser.useMatchesSelectorPolyfill = !is.function(Element.prototype[browser.prefixedMatchesSelector]);\n\nmodule.exports = browser;\n","const domObjects = {};\nconst win = require('./window').window;\n\nfunction blank () {}\n\ndomObjects.document = win.document;\ndomObjects.DocumentFragment = win.DocumentFragment || blank;\ndomObjects.SVGElement = win.SVGElement || blank;\ndomObjects.SVGSVGElement = win.SVGSVGElement || blank;\ndomObjects.SVGElementInstance = win.SVGElementInstance || blank;\ndomObjects.Element = win.Element || blank;\ndomObjects.HTMLElement = win.HTMLElement || domObjects.Element;\n\ndomObjects.Event = win.Event;\ndomObjects.Touch = win.Touch || blank;\ndomObjects.PointerEvent = (win.PointerEvent || win.MSPointerEvent);\n\nmodule.exports = domObjects;\n","const win = require('./window');\nconst browser = require('./browser');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst domUtils = {\n nodeContains: function (parent, child) {\n while (child) {\n if (child === parent) {\n return true;\n }\n\n child = child.parentNode;\n }\n\n return false;\n },\n\n closest: function (element, selector) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) { return element; }\n\n element = domUtils.parentNode(element);\n }\n\n return null;\n },\n\n parentNode: function (node) {\n let parent = node.parentNode;\n\n if (is.docFrag(parent)) {\n // skip past #shado-root fragments\n while ((parent = parent.host) && is.docFrag(parent)) {\n continue;\n }\n\n return parent;\n }\n\n return parent;\n },\n\n // taken from http://tanalin.com/en/blog/2012/12/matches-selector-ie8/ and modified\n matchesSelectorPolyfill: browser.useMatchesSelectorPolyfill\n ? function (element, selector, elems) {\n elems = elems || element.parentNode.querySelectorAll(selector);\n\n for (let i = 0, len = elems.length; i < len; i++) {\n if (elems[i] === element) {\n return true;\n }\n }\n\n return false;\n }\n : null,\n\n matchesSelector: function (element, selector, nodeList) {\n if (browser.useMatchesSelectorPolyfill) {\n return domUtils.matchesSelectorPolyfill(element, selector, nodeList);\n }\n\n // remove /deep/ from selectors if shadowDOM polyfill is used\n if (win.window !== win.realWindow) {\n selector = selector.replace(/\\/deep\\//g, ' ');\n }\n\n return element[browser.prefixedMatchesSelector](selector);\n },\n\n // Test for the element that's \"above\" all other qualifiers\n indexOfDeepestElement: function (elements) {\n let deepestZoneParents = [];\n let dropzoneParents = [];\n let dropzone;\n let deepestZone = elements[0];\n let index = deepestZone? 0: -1;\n let parent;\n let child;\n let i;\n let n;\n\n for (i = 1; i < elements.length; i++) {\n dropzone = elements[i];\n\n // an element might belong to multiple selector dropzones\n if (!dropzone || dropzone === deepestZone) {\n continue;\n }\n\n if (!deepestZone) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n // check if the deepest or current are document.documentElement or document.rootElement\n // - if the current dropzone is, do nothing and continue\n if (dropzone.parentNode === dropzone.ownerDocument) {\n continue;\n }\n // - if deepest is, update with the current dropzone and continue to next\n else if (deepestZone.parentNode === dropzone.ownerDocument) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n if (!deepestZoneParents.length) {\n parent = deepestZone;\n while (parent.parentNode && parent.parentNode !== parent.ownerDocument) {\n deepestZoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n }\n\n // if this element is an svg element and the current deepest is\n // an HTMLElement\n if (deepestZone instanceof domObjects.HTMLElement\n && dropzone instanceof domObjects.SVGElement\n && !(dropzone instanceof domObjects.SVGSVGElement)) {\n\n if (dropzone === deepestZone.parentNode) {\n continue;\n }\n\n parent = dropzone.ownerSVGElement;\n }\n else {\n parent = dropzone;\n }\n\n dropzoneParents = [];\n\n while (parent.parentNode !== parent.ownerDocument) {\n dropzoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n\n n = 0;\n\n // get (position of last common ancestor) + 1\n while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) {\n n++;\n }\n\n const parents = [\n dropzoneParents[n - 1],\n dropzoneParents[n],\n deepestZoneParents[n],\n ];\n\n child = parents[0].lastChild;\n\n while (child) {\n if (child === parents[1]) {\n deepestZone = dropzone;\n index = i;\n deepestZoneParents = [];\n\n break;\n }\n else if (child === parents[2]) {\n break;\n }\n\n child = child.previousSibling;\n }\n }\n\n return index;\n },\n\n matchesUpTo: function (element, selector, limit) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) {\n return true;\n }\n\n element = domUtils.parentNode(element);\n\n if (element === limit) {\n return domUtils.matchesSelector(element, selector);\n }\n }\n\n return false;\n },\n\n getActualElement: function (element) {\n return (element instanceof domObjects.SVGElementInstance\n ? element.correspondingUseElement\n : element);\n },\n\n getScrollXY: function (relevantWindow) {\n relevantWindow = relevantWindow || win.window;\n return {\n x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft,\n y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop,\n };\n },\n\n getElementClientRect: function (element) {\n const clientRect = (element instanceof domObjects.SVGElement\n ? element.getBoundingClientRect()\n : element.getClientRects()[0]);\n\n return clientRect && {\n left : clientRect.left,\n right : clientRect.right,\n top : clientRect.top,\n bottom: clientRect.bottom,\n width : clientRect.width || clientRect.right - clientRect.left,\n height: clientRect.height || clientRect.bottom - clientRect.top,\n };\n },\n\n getElementRect: function (element) {\n const clientRect = domUtils.getElementClientRect(element);\n\n if (!browser.isIOS7 && clientRect) {\n const scroll = domUtils.getScrollXY(win.getWindow(element));\n\n clientRect.left += scroll.x;\n clientRect.right += scroll.x;\n clientRect.top += scroll.y;\n clientRect.bottom += scroll.y;\n }\n\n return clientRect;\n },\n\n getPath: function (element) {\n const path = [];\n\n while (element) {\n path.push(element);\n element = domUtils.parentNode(element);\n }\n\n return path;\n },\n\n trySelector: value => {\n if (!is.string(value)) { return false; }\n\n // an exception will be raised if it is invalid\n domObjects.document.querySelector(value);\n return true;\n },\n};\n\nmodule.exports = domUtils;\n","const is = require('./is');\nconst domUtils = require('./domUtils');\nconst pExtend = require('./pointerExtend');\n\nconst { window, getWindow } = require('./window');\nconst { indexOf, contains } = require('./arr');\n\nconst useAttachEvent = ('attachEvent' in window) && !('addEventListener' in window);\nconst addEvent = useAttachEvent? 'attachEvent': 'addEventListener';\nconst removeEvent = useAttachEvent? 'detachEvent': 'removeEventListener';\nconst on = useAttachEvent? 'on': '';\n\nconst elements = [];\nconst targets = [];\nconst attachedListeners = [];\n\n// {\n// type: {\n// selectors: ['selector', ...],\n// contexts : [document, ...],\n// listeners: [[listener, capture, passive], ...]\n// }\n// }\nconst delegatedEvents = {};\n\nconst documents = [];\n\nconst supportsOptions = !useAttachEvent && (() => {\n let supported = false;\n\n window.document.createElement('div').addEventListener('test', null, {\n get capture () { supported = true; },\n });\n\n return supported;\n})();\n\nfunction add (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n let elementIndex = indexOf(elements, element);\n let target = targets[elementIndex];\n\n if (!target) {\n target = {\n events: {},\n typeCount: 0,\n };\n\n elementIndex = elements.push(element) - 1;\n targets.push(target);\n\n attachedListeners.push(useAttachEvent\n ? {\n supplied: [],\n wrapped : [],\n useCount: [],\n }\n : null);\n }\n\n if (!target.events[type]) {\n target.events[type] = [];\n target.typeCount++;\n }\n\n if (!contains(target.events[type], listener)) {\n let ret;\n\n if (useAttachEvent) {\n const { supplied, wrapped, useCount } = attachedListeners[elementIndex];\n const listenerIndex = indexOf(supplied, listener);\n\n const wrappedListener = wrapped[listenerIndex] || function (event) {\n if (!event.immediatePropagationStopped) {\n event.target = event.srcElement;\n event.currentTarget = element;\n\n event.preventDefault = event.preventDefault || preventDef;\n event.stopPropagation = event.stopPropagation || stopProp;\n event.stopImmediatePropagation = event.stopImmediatePropagation || stopImmProp;\n\n if (/mouse|click/.test(event.type)) {\n event.pageX = event.clientX + getWindow(element).document.documentElement.scrollLeft;\n event.pageY = event.clientY + getWindow(element).document.documentElement.scrollTop;\n }\n\n listener(event);\n }\n };\n\n ret = element[addEvent](on + type, wrappedListener, !!options.capture);\n\n if (listenerIndex === -1) {\n supplied.push(listener);\n wrapped.push(wrappedListener);\n useCount.push(1);\n }\n else {\n useCount[listenerIndex]++;\n }\n }\n else {\n ret = element[addEvent](type, listener, supportsOptions? options : !!options.capture);\n }\n target.events[type].push(listener);\n\n return ret;\n }\n}\n\nfunction remove (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const elementIndex = indexOf(elements, element);\n const target = targets[elementIndex];\n\n if (!target || !target.events) {\n return;\n }\n\n let wrappedListener = listener;\n let listeners;\n let listenerIndex;\n\n if (useAttachEvent) {\n listeners = attachedListeners[elementIndex];\n listenerIndex = indexOf(listeners.supplied, listener);\n wrappedListener = listeners.wrapped[listenerIndex];\n }\n\n if (type === 'all') {\n for (type in target.events) {\n if (target.events.hasOwnProperty(type)) {\n remove(element, type, 'all');\n }\n }\n return;\n }\n\n if (target.events[type]) {\n const len = target.events[type].length;\n\n if (listener === 'all') {\n for (let i = 0; i < len; i++) {\n remove(element, type, target.events[type][i], options);\n }\n return;\n }\n else {\n for (let i = 0; i < len; i++) {\n if (target.events[type][i] === listener) {\n element[removeEvent](on + type, wrappedListener, supportsOptions? options : !!options.capture);\n target.events[type].splice(i, 1);\n\n if (useAttachEvent && listeners) {\n listeners.useCount[listenerIndex]--;\n if (listeners.useCount[listenerIndex] === 0) {\n listeners.supplied.splice(listenerIndex, 1);\n listeners.wrapped.splice(listenerIndex, 1);\n listeners.useCount.splice(listenerIndex, 1);\n }\n }\n\n break;\n }\n }\n }\n\n if (target.events[type] && target.events[type].length === 0) {\n target.events[type] = null;\n target.typeCount--;\n }\n }\n\n if (!target.typeCount) {\n targets.splice(elementIndex, 1);\n elements.splice(elementIndex, 1);\n attachedListeners.splice(elementIndex, 1);\n }\n}\n\nfunction addDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n if (!delegatedEvents[type]) {\n delegatedEvents[type] = {\n selectors: [],\n contexts : [],\n listeners: [],\n };\n\n // add delegate listener functions\n for (let i = 0; i < documents.length; i++) {\n add(documents[i], type, delegateListener);\n add(documents[i], type, delegateUseCapture, true);\n }\n }\n\n const delegated = delegatedEvents[type];\n let index;\n\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n break;\n }\n }\n\n if (index === -1) {\n index = delegated.selectors.length;\n\n delegated.selectors.push(selector);\n delegated.contexts .push(context);\n delegated.listeners.push([]);\n }\n\n // keep listener and capture and passive flags\n delegated.listeners[index].push([listener, !!options.capture, options.passive]);\n}\n\nfunction removeDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const delegated = delegatedEvents[type];\n let matchFound = false;\n let index;\n\n if (!delegated) { return; }\n\n // count from last index of delegated to 0\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n // look for matching selector and context Node\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n\n const listeners = delegated.listeners[index];\n\n // each item of the listeners array is an array: [function, capture, passive]\n for (let i = listeners.length - 1; i >= 0; i--) {\n const [fn, capture, passive] = listeners[i];\n\n // check if the listener functions and capture and passive flags match\n if (fn === listener && capture === !!options.capture && passive === options.passive) {\n // remove the listener from the array of listeners\n listeners.splice(i, 1);\n\n // if all listeners for this interactable have been removed\n // remove the interactable from the delegated arrays\n if (!listeners.length) {\n delegated.selectors.splice(index, 1);\n delegated.contexts .splice(index, 1);\n delegated.listeners.splice(index, 1);\n\n // remove delegate function from context\n remove(context, type, delegateListener);\n remove(context, type, delegateUseCapture, true);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegatedEvents[type] = null;\n }\n }\n\n // only remove one listener\n matchFound = true;\n break;\n }\n }\n\n if (matchFound) { break; }\n }\n }\n}\n\n// bound to the interactable context when a DOM event\n// listener is added to a selector interactable\nfunction delegateListener (event, optionalArg) {\n const options = getOptions(optionalArg);\n const fakeEvent = {};\n const delegated = delegatedEvents[event.type];\n const eventTarget = (domUtils.getActualElement(event.path\n ? event.path[0]\n : event.target));\n let element = eventTarget;\n\n // duplicate the event so that currentTarget can be changed\n pExtend(fakeEvent, event);\n\n fakeEvent.originalEvent = event;\n fakeEvent.preventDefault = preventOriginalDefault;\n\n // climb up document tree looking for selector matches\n while (is.element(element)) {\n for (let i = 0; i < delegated.selectors.length; i++) {\n const selector = delegated.selectors[i];\n const context = delegated.contexts[i];\n\n if (domUtils.matchesSelector(element, selector)\n && domUtils.nodeContains(context, eventTarget)\n && domUtils.nodeContains(context, element)) {\n\n const listeners = delegated.listeners[i];\n\n fakeEvent.currentTarget = element;\n\n for (let j = 0; j < listeners.length; j++) {\n const [fn, capture, passive] = listeners[j];\n\n if (capture === !!options.capture && passive === options.passive) {\n fn(fakeEvent);\n }\n }\n }\n }\n\n element = domUtils.parentNode(element);\n }\n}\n\nfunction delegateUseCapture (event) {\n return delegateListener.call(this, event, true);\n}\n\nfunction preventDef () {\n this.returnValue = false;\n}\n\nfunction preventOriginalDefault () {\n this.originalEvent.preventDefault();\n}\n\nfunction stopProp () {\n this.cancelBubble = true;\n}\n\nfunction stopImmProp () {\n this.cancelBubble = true;\n this.immediatePropagationStopped = true;\n}\n\nfunction getOptions (param) {\n return is.object(param)? param : { capture: param };\n}\n\nmodule.exports = {\n add,\n remove,\n\n addDelegate,\n removeDelegate,\n\n delegateListener,\n delegateUseCapture,\n delegatedEvents,\n documents,\n\n useAttachEvent,\n supportsOptions,\n\n _elements: elements,\n _targets: targets,\n _attachedListeners: attachedListeners,\n};\n","module.exports = function extend (dest, source) {\n for (const prop in source) {\n dest[prop] = source[prop];\n }\n return dest;\n};\n","const {\n resolveRectLike,\n rectToXY,\n} = require('./rect');\n\nmodule.exports = function (target, element, action) {\n const actionOptions = target.options[action];\n const actionOrigin = actionOptions && actionOptions.origin;\n const origin = actionOrigin || target.options.origin;\n\n const originRect = resolveRectLike(origin, target, element, [target && element]);\n\n return rectToXY(originRect) || { x: 0, y: 0 };\n};\n","module.exports = (x, y) => Math.sqrt(x * x + y * y);\n","const extend = require('./extend');\nconst win = require('./window');\n\nconst utils = {\n warnOnce: function (method, message) {\n let warned = false;\n\n return function () {\n if (!warned) {\n win.window.console.warn(message);\n warned = true;\n }\n\n return method.apply(this, arguments);\n };\n },\n\n // http://stackoverflow.com/a/5634528/2280888\n _getQBezierValue: function (t, p1, p2, p3) {\n const iT = 1 - t;\n return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3;\n },\n\n getQuadraticCurvePoint: function (startX, startY, cpX, cpY, endX, endY, position) {\n return {\n x: utils._getQBezierValue(position, startX, cpX, endX),\n y: utils._getQBezierValue(position, startY, cpY, endY),\n };\n },\n\n // http://gizma.com/easing/\n easeOutQuad: function (t, b, c, d) {\n t /= d;\n return -c * t*(t-2) + b;\n },\n\n copyAction: function (dest, src) {\n dest.name = src.name;\n dest.axis = src.axis;\n dest.edges = src.edges;\n\n return dest;\n },\n\n is : require('./is'),\n extend : extend,\n hypot : require('./hypot'),\n getOriginXY: require('./getOriginXY'),\n};\n\nextend(utils, require('./arr'));\nextend(utils, require('./domUtils'));\nextend(utils, require('./pointerUtils'));\nextend(utils, require('./rect'));\n\nmodule.exports = utils;\n","const scope = require('../scope');\nconst utils = require('./index');\n\nconst finder = {\n methodOrder: [ 'simulationResume', 'mouseOrPen', 'hasPointer', 'idle' ],\n\n search: function (pointer, eventType, eventTarget) {\n const pointerType = utils.getPointerType(pointer);\n const pointerId = utils.getPointerId(pointer);\n const details = { pointer, pointerId, pointerType, eventType, eventTarget };\n\n for (const method of finder.methodOrder) {\n const interaction = finder[method](details);\n\n if (interaction) {\n return interaction;\n }\n }\n },\n\n // try to resume simulation with a new pointer\n simulationResume: function ({ pointerType, eventType, eventTarget }) {\n if (!/down|start/i.test(eventType)) {\n return null;\n }\n\n for (const interaction of scope.interactions) {\n let element = eventTarget;\n\n if (interaction.simulation && interaction.simulation.allowResume\n && (interaction.pointerType === pointerType)) {\n while (element) {\n // if the element is the interaction element\n if (element === interaction.element) {\n return interaction;\n }\n element = utils.parentNode(element);\n }\n }\n }\n\n return null;\n },\n\n // if it's a mouse or pen interaction\n mouseOrPen: function ({ pointerId, pointerType, eventType }) {\n if (pointerType !== 'mouse' && pointerType !== 'pen') {\n return null;\n }\n\n let firstNonActive;\n\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType) {\n // if it's a down event, skip interactions with running simulations\n if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; }\n\n // if the interaction is active, return it immediately\n if (interaction.interacting()) {\n return interaction;\n }\n // otherwise save it and look for another active interaction\n else if (!firstNonActive) {\n firstNonActive = interaction;\n }\n }\n }\n\n // if no active mouse interaction was found use the first inactive mouse\n // interaction\n if (firstNonActive) {\n return firstNonActive;\n }\n\n // find any mouse or pen interaction.\n // ignore the interaction if the eventType is a *down, and a simulation\n // is active\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType && !(/down/i.test(eventType) && interaction.simulation)) {\n return interaction;\n }\n }\n\n return null;\n },\n\n // get interaction that has this pointer\n hasPointer: function ({ pointerId }) {\n for (const interaction of scope.interactions) {\n if (utils.contains(interaction.pointerIds, pointerId)) {\n return interaction;\n }\n }\n },\n\n // get first idle interaction with a matching pointerType\n idle: function ({ pointerType }) {\n for (const interaction of scope.interactions) {\n // if there's already a pointer held down\n if (interaction.pointerIds.length === 1) {\n const target = interaction.target;\n // don't add this pointer if there is a target interactable and it\n // isn't gesturable\n if (target && !target.options.gesture.enabled) {\n continue;\n }\n }\n // maximum of 2 pointers per interaction\n else if (interaction.pointerIds.length >= 2) {\n continue;\n }\n\n if (!interaction.interacting() && (pointerType === interaction.pointerType)) {\n return interaction;\n }\n }\n\n return null;\n },\n};\n\nmodule.exports = finder;\n","const win = require('./window');\nconst isWindow = require('./isWindow');\n\nconst is = {\n array : () => {},\n\n window : thing => thing === win.window || isWindow(thing),\n\n docFrag : thing => is.object(thing) && thing.nodeType === 11,\n\n object : thing => !!thing && (typeof thing === 'object'),\n\n function: thing => typeof thing === 'function',\n\n number : thing => typeof thing === 'number' ,\n\n bool : thing => typeof thing === 'boolean' ,\n\n string : thing => typeof thing === 'string' ,\n\n element: thing => {\n if (!thing || (typeof thing !== 'object')) { return false; }\n\n const _window = win.getWindow(thing) || win.window;\n\n return (/object|function/.test(typeof _window.Element)\n ? thing instanceof _window.Element //DOM2\n : thing.nodeType === 1 && typeof thing.nodeName === 'string');\n },\n};\n\nis.array = thing => (is.object(thing)\n && (typeof thing.length !== 'undefined')\n && is.function(thing.splice));\n\nmodule.exports = is;\n","module.exports = (thing) => !!(thing && thing.Window) && (thing instanceof thing.Window);\n","function pointerExtend (dest, source) {\n for (const prop in source) {\n const prefixedPropREs = module.exports.prefixedPropREs;\n let deprecated = false;\n\n // skip deprecated prefixed properties\n for (const vendor in prefixedPropREs) {\n if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) {\n deprecated = true;\n break;\n }\n }\n\n if (!deprecated && typeof source[prop] !== 'function') {\n dest[prop] = source[prop];\n }\n }\n return dest;\n}\n\npointerExtend.prefixedPropREs = {\n webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/,\n};\n\nmodule.exports = pointerExtend;\n","const hypot = require('./hypot');\nconst browser = require('./browser');\nconst dom = require('./domObjects');\nconst domUtils = require('./domUtils');\nconst domObjects = require('./domObjects');\nconst is = require('./is');\nconst pointerExtend = require('./pointerExtend');\n\nconst pointerUtils = {\n copyCoords: function (dest, src) {\n dest.page = dest.page || {};\n dest.page.x = src.page.x;\n dest.page.y = src.page.y;\n\n dest.client = dest.client || {};\n dest.client.x = src.client.x;\n dest.client.y = src.client.y;\n\n dest.timeStamp = src.timeStamp;\n },\n\n setCoordDeltas: function (targetObj, prev, cur) {\n targetObj.page.x = cur.page.x - prev.page.x;\n targetObj.page.y = cur.page.y - prev.page.y;\n targetObj.client.x = cur.client.x - prev.client.x;\n targetObj.client.y = cur.client.y - prev.client.y;\n targetObj.timeStamp = cur.timeStamp - prev.timeStamp;\n\n // set pointer velocity\n const dt = Math.max(targetObj.timeStamp / 1000, 0.001);\n\n targetObj.page.speed = hypot(targetObj.page.x, targetObj.page.y) / dt;\n targetObj.page.vx = targetObj.page.x / dt;\n targetObj.page.vy = targetObj.page.y / dt;\n\n targetObj.client.speed = hypot(targetObj.client.x, targetObj.page.y) / dt;\n targetObj.client.vx = targetObj.client.x / dt;\n targetObj.client.vy = targetObj.client.y / dt;\n },\n\n isNativePointer: function (pointer) {\n return (pointer instanceof dom.Event || pointer instanceof dom.Touch);\n },\n\n // Get specified X/Y coords for mouse or event.touches[0]\n getXY: function (type, pointer, xy) {\n xy = xy || {};\n type = type || 'page';\n\n xy.x = pointer[type + 'X'];\n xy.y = pointer[type + 'Y'];\n\n return xy;\n },\n\n getPageXY: function (pointer, page) {\n page = page || {};\n\n // Opera Mobile handles the viewport and scrolling oddly\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n pointerUtils.getXY('screen', pointer, page);\n\n page.x += window.scrollX;\n page.y += window.scrollY;\n }\n else {\n pointerUtils.getXY('page', pointer, page);\n }\n\n return page;\n },\n\n getClientXY: function (pointer, client) {\n client = client || {};\n\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n // Opera Mobile handles the viewport and scrolling oddly\n pointerUtils.getXY('screen', pointer, client);\n }\n else {\n pointerUtils.getXY('client', pointer, client);\n }\n\n return client;\n },\n\n getPointerId: function (pointer) {\n return is.number(pointer.pointerId)? pointer.pointerId : pointer.identifier;\n },\n\n setCoords: function (targetObj, pointers, timeStamp) {\n const pointer = (pointers.length > 1\n ? pointerUtils.pointerAverage(pointers)\n : pointers[0]);\n\n const tmpXY = {};\n\n pointerUtils.getPageXY(pointer, tmpXY);\n targetObj.page.x = tmpXY.x;\n targetObj.page.y = tmpXY.y;\n\n pointerUtils.getClientXY(pointer, tmpXY);\n targetObj.client.x = tmpXY.x;\n targetObj.client.y = tmpXY.y;\n\n targetObj.timeStamp = is.number(timeStamp) ? timeStamp :new Date().getTime();\n },\n\n pointerExtend: pointerExtend,\n\n getTouchPair: function (event) {\n const touches = [];\n\n // array of touches is supplied\n if (is.array(event)) {\n touches[0] = event[0];\n touches[1] = event[1];\n }\n // an event\n else {\n if (event.type === 'touchend') {\n if (event.touches.length === 1) {\n touches[0] = event.touches[0];\n touches[1] = event.changedTouches[0];\n }\n else if (event.touches.length === 0) {\n touches[0] = event.changedTouches[0];\n touches[1] = event.changedTouches[1];\n }\n }\n else {\n touches[0] = event.touches[0];\n touches[1] = event.touches[1];\n }\n }\n\n return touches;\n },\n\n pointerAverage: function (pointers) {\n const average = {\n pageX : 0,\n pageY : 0,\n clientX: 0,\n clientY: 0,\n screenX: 0,\n screenY: 0,\n };\n\n for (const pointer of pointers) {\n for (const prop in average) {\n average[prop] += pointer[prop];\n }\n }\n for (const prop in average) {\n average[prop] /= pointers.length;\n }\n\n return average;\n },\n\n touchBBox: function (event) {\n if (!event.length && !(event.touches && event.touches.length > 1)) {\n return;\n }\n\n const touches = pointerUtils.getTouchPair(event);\n const minX = Math.min(touches[0].pageX, touches[1].pageX);\n const minY = Math.min(touches[0].pageY, touches[1].pageY);\n const maxX = Math.max(touches[0].pageX, touches[1].pageX);\n const maxY = Math.max(touches[0].pageY, touches[1].pageY);\n\n return {\n x: minX,\n y: minY,\n left: minX,\n top: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n },\n\n touchDistance: function (event, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n\n\n const dx = touches[0][sourceX] - touches[1][sourceX];\n const dy = touches[0][sourceY] - touches[1][sourceY];\n\n return hypot(dx, dy);\n },\n\n touchAngle: function (event, prevAngle, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n const dx = touches[1][sourceX] - touches[0][sourceX];\n const dy = touches[1][sourceY] - touches[0][sourceY];\n const angle = 180 * Math.atan2(dy , dx) / Math.PI;\n\n return angle;\n },\n\n getPointerType: function (pointer) {\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : is.number(pointer.pointerType)\n ? [undefined, undefined,'touch', 'pen', 'mouse'][pointer.pointerType]\n // if the PointerEvent API isn't available, then the \"pointer\" must\n // be either a MouseEvent, TouchEvent, or Touch object\n : /touch/.test(pointer.type) || pointer instanceof domObjects.Touch\n ? 'touch'\n : 'mouse';\n },\n\n // [ event.target, event.currentTarget ]\n getEventTargets: function (event) {\n return [\n domUtils.getActualElement(event.path ? event.path[0] : event.target),\n domUtils.getActualElement(event.currentTarget),\n ];\n },\n};\n\nmodule.exports = pointerUtils;\n","const { window } = require('./window');\n\nconst vendors = ['ms', 'moz', 'webkit', 'o'];\nlet lastTime = 0;\nlet request;\nlet cancel;\n\nfor (let x = 0; x < vendors.length && !window.requestAnimationFrame; x++) {\n request = window[vendors[x] + 'RequestAnimationFrame'];\n cancel = window[vendors[x] +'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n}\n\nif (!request) {\n request = function (callback) {\n const currTime = new Date().getTime();\n const timeToCall = Math.max(0, 16 - (currTime - lastTime));\n const id = setTimeout(function () { callback(currTime + timeToCall); },\n timeToCall);\n\n lastTime = currTime + timeToCall;\n return id;\n };\n}\n\nif (!cancel) {\n cancel = function (id) {\n clearTimeout(id);\n };\n}\n\nmodule.exports = {\n request,\n cancel,\n};\n","const extend = require('./extend');\nconst is = require('./is');\nconst {\n closest,\n parentNode,\n getElementRect,\n} = require('./domUtils');\n\nconst rectUtils = {\n getStringOptionResult: function (value, interactable, element) {\n if (!is.string(value)) {\n return null;\n }\n\n if (value === 'parent') {\n value = parentNode(element);\n }\n else if (value === 'self') {\n value = interactable.getRect(element);\n }\n else {\n value = closest(element, value);\n }\n\n return value;\n },\n\n resolveRectLike: function (value, interactable, element, functionArgs) {\n value = rectUtils.getStringOptionResult(value, interactable, element) || value;\n\n if (is.function(value)) {\n value = value.apply(null, functionArgs);\n }\n\n if (is.element(value)) {\n value = getElementRect(value);\n }\n\n return value;\n },\n\n rectToXY: function (rect) {\n return rect && {\n x: 'x' in rect ? rect.x : rect.left,\n y: 'y' in rect ? rect.y : rect.top,\n };\n },\n\n xywhToTlbr: function (rect) {\n if (rect && !('left' in rect && 'top' in rect)) {\n rect = extend({}, rect);\n\n rect.left = rect.x || 0;\n rect.top = rect.y || 0;\n rect.right = rect.right || (rect.left + rect.width);\n rect.bottom = rect.bottom || (rect.top + rect.height);\n }\n\n return rect;\n },\n\n tlbrToXywh: function (rect) {\n if (rect && !('x' in rect && 'y' in rect)) {\n rect = extend({}, rect);\n\n rect.x = rect.left || 0;\n rect.top = rect.top || 0;\n rect.width = rect.width || (rect.right - rect.x);\n rect.height = rect.height || (rect.bottom - rect.y);\n }\n\n return rect;\n },\n};\n\nmodule.exports = rectUtils;\n","const win = module.exports;\nconst isWindow = require('./isWindow');\n\nfunction init (window) {\n // get wrapped window if using Shadow DOM polyfill\n\n win.realWindow = window;\n\n // create a TextNode\n const el = window.document.createTextNode('');\n\n // check if it's wrapped by a polyfill\n if (el.ownerDocument !== window.document\n && typeof window.wrap === 'function'\n && window.wrap(el) === el) {\n // use wrapped window\n window = window.wrap(window);\n }\n\n win.window = window;\n}\n\nif (typeof window === 'undefined') {\n win.window = undefined;\n win.realWindow = undefined;\n}\nelse {\n init(window);\n}\n\nwin.getWindow = function getWindow (node) {\n if (isWindow(node)) {\n return node;\n }\n\n const rootNode = (node.ownerDocument || node);\n\n return rootNode.defaultView || rootNode.parentWindow || win.window;\n};\n\nwin.init = init;\n"]} \ No newline at end of file diff --git a/package.json b/package.json index 76f3e9969..f39704e99 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "interactjs", - "version": "1.3.0-alpha.3+sha.9595c40", + "version": "1.3.0-alpha.4+sha.7970416", "repository": { "type": "git", "url": "https://github.com/taye/interact.js.git"
- interact.off(type, listener, [options])⚓➭ + interact.off(type, listener, [options])⚓➭ @@ -2014,7 +2014,7 @@ Parameters - interact.debug()⚓➭ + interact.debug()⚓➭ @@ -2056,7 +2056,7 @@ interact.debug() - interact.supportsTouch()⚓➭ + interact.supportsTouch()⚓➭ @@ -2097,7 +2097,7 @@ interact.supportsTouch() - interact.supportsPointerEvent()⚓➭ + interact.supportsPointerEvent()⚓➭ @@ -2138,7 +2138,7 @@ interact.supportsPointerEvent() - interact.stop(event)⚓➭ + interact.stop(event)⚓➭ @@ -2198,7 +2198,7 @@ Parameters - interact.pointerMoveTolerance([newValue])⚓➭ + interact.pointerMoveTolerance([newValue])⚓➭ @@ -2261,7 +2261,7 @@ Parameters - Interaction.start(action, target, element)⚓➭ + Interaction.start(action, target, element)⚓➭ @@ -2356,7 +2356,7 @@ Parameters - Interaction.doMove()⚓➭ + Interaction.doMove()⚓➭ @@ -2403,7 +2403,7 @@ Interaction.doMove() - Interaction.end([event])⚓➭ + Interaction.end([event])⚓➭ diff --git a/dist/interact.js b/dist/interact.js index e8ae35c3b..c78a3c751 100644 --- a/dist/interact.js +++ b/dist/interact.js @@ -1,5 +1,5 @@ /** - * interact.js v1.3.0-alpha.3+sha.9595c40 + * interact.js v1.3.0-alpha.4+sha.7970416-dirty * * Copyright (c) 2012-2017 Taye Adeyemi * Open source under the MIT License. @@ -816,6 +816,7 @@ var scope = require('./scope'); var utils = require('./utils'); var events = require('./utils/events'); var browser = require('./utils/browser'); +var domObjects = require('./utils/domObjects'); var finder = require('./utils/interactionFinder'); var signals = require('./utils/Signals').new(); @@ -829,7 +830,9 @@ var prevTouchTime = 0; scope.interactions = []; var Interaction = function () { - function Interaction() { + function Interaction(_ref) { + var pointerType = _ref.pointerType; + _classCallCheck(this, Interaction); this.target = null; // current interactable being interacted with @@ -886,7 +889,7 @@ var Interaction = function () { this.pointerWasMoved = false; this._interacting = false; - this.mouse = false; + this.pointerType = pointerType; signals.fire('new', this); @@ -1130,6 +1133,11 @@ var Interaction = function () { }; Interaction.prototype.getPointerIndex = function getPointerIndex(pointer) { + // mouse and pen interactions may have only one pointer + if (this.pointerType === 'mouse' || this.pointerType === 'pen') { + return 0; + } + return utils.indexOf(this.pointerIds, utils.getPointerId(pointer)); }; @@ -1161,8 +1169,7 @@ var Interaction = function () { }; Interaction.prototype.removePointer = function removePointer(pointer, event) { - var id = utils.getPointerId(pointer); - var index = this.mouse ? 0 : utils.indexOf(this.pointerIds, id); + var index = this.getPointerIndex(pointer); if (index === -1) { return; @@ -1197,6 +1204,8 @@ for (var i = 0, len = methodNames.length; i < len; i++) { function doOnInteractions(method) { return function (event) { + var pointerType = utils.getPointerType(event); + var _utils$getEventTarget = utils.getEventTargets(event), eventTarget = _utils$getEventTarget[0], curEventTarget = _utils$getEventTarget[1]; @@ -1210,7 +1219,7 @@ function doOnInteractions(method) { var pointer = event.changedTouches[_i]; var interaction = finder.search(pointer, event.type, eventTarget); - matches.push([pointer, interaction || new Interaction()]); + matches.push([pointer, interaction || new Interaction({ pointerType: pointerType })]); } } else { var invalidPointer = false; @@ -1218,7 +1227,7 @@ function doOnInteractions(method) { if (!browser.supportsPointerEvent && /mouse/.test(event.type)) { // ignore mouse events while touch interactions are active for (var _i2 = 0; _i2 < scope.interactions.length && !invalidPointer; _i2++) { - invalidPointer = !scope.interactions[_i2].mouse && scope.interactions[_i2].pointerIsDown; + invalidPointer = scope.interactions[_i2].pointerType !== 'mouse' && scope.interactions[_i2].pointerIsDown; } // try to ignore mouse events that are simulated by the browser @@ -1232,11 +1241,7 @@ function doOnInteractions(method) { var _interaction = finder.search(event, event.type, eventTarget); if (!_interaction) { - - _interaction = new Interaction(); - _interaction.mouse = /mouse/i.test(event.pointerType || event.type) - // MSPointerEvent.MSPOINTER_TYPE_MOUSE - || event.pointerType === 4 || !event.pointerType; + _interaction = new Interaction({ pointerType: pointerType }); } matches.push([event, _interaction]); @@ -1244,20 +1249,20 @@ function doOnInteractions(method) { } for (var _iterator = matches, _isArray = Array.isArray(_iterator), _i3 = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { - var _ref; + var _ref2; if (_isArray) { if (_i3 >= _iterator.length) break; - _ref = _iterator[_i3++]; + _ref2 = _iterator[_i3++]; } else { _i3 = _iterator.next(); if (_i3.done) break; - _ref = _i3.value; + _ref2 = _i3.value; } - var _ref2 = _ref, - _pointer = _ref2[0], - _interaction2 = _ref2[1]; + var _ref3 = _ref2, + _pointer = _ref3[0], + _interaction2 = _ref3[1]; _interaction2._updateEventTargets(eventTarget, curEventTarget); _interaction2[method](_pointer, event, eventTarget, curEventTarget); @@ -1277,7 +1282,7 @@ function endAll(event) { var docEvents = {/* 'eventType': listenerFunc */}; var pEventTypes = browser.pEventTypes; -if (scope.PointerEvent) { +if (domObjects.PointerEvent) { docEvents[pEventTypes.down] = listeners.pointerDown; docEvents[pEventTypes.move] = listeners.pointerMove; docEvents[pEventTypes.up] = listeners.pointerUp; @@ -1295,8 +1300,8 @@ if (scope.PointerEvent) { docEvents.blur = endAll; -function onDocSignal(_ref3, signalName) { - var doc = _ref3.doc; +function onDocSignal(_ref4, signalName) { + var doc = _ref4.doc; var eventMethod = signalName.indexOf('add') === 0 ? events.add : events.remove; @@ -1311,14 +1316,14 @@ function onDocSignal(_ref3, signalName) { } } -signals.on('update-pointer-down', function (_ref4) { - var interaction = _ref4.interaction, - pointer = _ref4.pointer, - pointerId = _ref4.pointerId, - pointerIndex = _ref4.pointerIndex, - event = _ref4.event, - eventTarget = _ref4.eventTarget, - down = _ref4.down; +signals.on('update-pointer-down', function (_ref5) { + var interaction = _ref5.interaction, + pointer = _ref5.pointer, + pointerId = _ref5.pointerId, + pointerIndex = _ref5.pointerIndex, + event = _ref5.event, + eventTarget = _ref5.eventTarget, + down = _ref5.down; interaction.pointerIds[pointerIndex] = pointerId; interaction.pointers[pointerIndex] = pointer; @@ -1355,7 +1360,7 @@ scope.endAllInteractions = endAll; module.exports = Interaction; -},{"./scope":34,"./utils":44,"./utils/Signals":35,"./utils/browser":37,"./utils/events":40,"./utils/interactionFinder":45}],6:[function(require,module,exports){ +},{"./scope":34,"./utils":44,"./utils/Signals":35,"./utils/browser":37,"./utils/domObjects":38,"./utils/events":40,"./utils/interactionFinder":45}],6:[function(require,module,exports){ 'use strict'; var Interaction = require('../Interaction'); @@ -5460,7 +5465,7 @@ module.exports = function () { this.originalEvent = event; this.type = type; this.pointerId = pointerUtils.getPointerId(pointer); - this.pointerType = pointerUtils.getPointerType(pointer, interaction); + this.pointerType = pointerUtils.getPointerType(pointer); this.target = eventTarget; this.currentTarget = null; @@ -5758,8 +5763,10 @@ Interaction.signals.on('down', function (_ref6) { timer.duration = minDuration; timer.timeout = setTimeout(function () { fire({ - interaction: interaction, eventCopy: eventCopy, eventTarget: eventTarget, + interaction: interaction, + eventTarget: eventTarget, pointer: browser.isIE8 ? eventCopy : pointer, + event: eventCopy, type: 'hold' }); }, minDuration); @@ -6946,17 +6953,14 @@ module.exports = utils; var scope = require('../scope'); var utils = require('./index'); -var browser = require('./browser'); var finder = { - methodOrder: ['simulationResume', 'mouse', 'hasPointer', 'idle'], + methodOrder: ['simulationResume', 'mouseOrPen', 'hasPointer', 'idle'], search: function search(pointer, eventType, eventTarget) { - var mouseEvent = /mouse/i.test(pointer.pointerType || eventType) - // MSPointerEvent.MSPOINTER_TYPE_MOUSE - || pointer.pointerType === 4; + var pointerType = utils.getPointerType(pointer); var pointerId = utils.getPointerId(pointer); - var details = { pointer: pointer, pointerId: pointerId, mouseEvent: mouseEvent, eventType: eventType, eventTarget: eventTarget }; + var details = { pointer: pointer, pointerId: pointerId, pointerType: pointerType, eventType: eventType, eventTarget: eventTarget }; for (var _iterator = finder.methodOrder, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { var _ref; @@ -6982,7 +6986,7 @@ var finder = { // try to resume simulation with a new pointer simulationResume: function simulationResume(_ref2) { - var mouseEvent = _ref2.mouseEvent, + var pointerType = _ref2.pointerType, eventType = _ref2.eventType, eventTarget = _ref2.eventTarget; @@ -7006,7 +7010,7 @@ var finder = { var element = eventTarget; - if (interaction.simulation && interaction.simulation.allowResume && interaction.mouse === mouseEvent) { + if (interaction.simulation && interaction.simulation.allowResume && interaction.pointerType === pointerType) { while (element) { // if the element is the interaction element if (element === interaction.element) { @@ -7020,13 +7024,13 @@ var finder = { return null; }, - // if it's a mouse interaction - mouse: function mouse(_ref4) { + // if it's a mouse or pen interaction + mouseOrPen: function mouseOrPen(_ref4) { var pointerId = _ref4.pointerId, - mouseEvent = _ref4.mouseEvent, + pointerType = _ref4.pointerType, eventType = _ref4.eventType; - if (!mouseEvent && (browser.supportsTouch || browser.supportsPointerEvent)) { + if (pointerType !== 'mouse' && pointerType !== 'pen') { return null; } @@ -7046,7 +7050,7 @@ var finder = { var interaction = _ref5; - if (interaction.mouse) { + if (interaction.pointerType === pointerType) { // if it's a down event, skip interactions with running simulations if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; @@ -7069,8 +7073,8 @@ var finder = { return firstNonActive; } - // Find any interaction specifically for mouse. - // ignore the interaction if the eventType is a mousedown, and a simulation + // find any mouse or pen interaction. + // ignore the interaction if the eventType is a *down, and a simulation // is active for (var _iterator4 = scope.interactions, _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) { var _ref6; @@ -7086,7 +7090,7 @@ var finder = { var _interaction = _ref6; - if (_interaction.mouse && !(/down/.test(eventType) && _interaction.simulation)) { + if (_interaction.pointerType === pointerType && !(/down/i.test(eventType) && _interaction.simulation)) { return _interaction; } } @@ -7118,9 +7122,9 @@ var finder = { } }, - // get first idle interaction + // get first idle interaction with a matching pointerType idle: function idle(_ref9) { - var mouseEvent = _ref9.mouseEvent; + var pointerType = _ref9.pointerType; for (var _iterator6 = scope.interactions, _isArray6 = Array.isArray(_iterator6), _i6 = 0, _iterator6 = _isArray6 ? _iterator6 : _iterator6[Symbol.iterator]();;) { var _ref10; @@ -7150,7 +7154,7 @@ var finder = { continue; } - if (!interaction.interacting() && mouseEvent === interaction.mouse) { + if (!interaction.interacting() && pointerType === interaction.pointerType) { return interaction; } } @@ -7161,7 +7165,7 @@ var finder = { module.exports = finder; -},{"../scope":34,"./browser":37,"./index":44}],46:[function(require,module,exports){ +},{"../scope":34,"./index":44}],46:[function(require,module,exports){ 'use strict'; var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; @@ -7262,6 +7266,7 @@ var hypot = require('./hypot'); var browser = require('./browser'); var dom = require('./domObjects'); var domUtils = require('./domUtils'); +var domObjects = require('./domObjects'); var is = require('./is'); var pointerExtend = require('./pointerExtend'); @@ -7468,17 +7473,11 @@ var pointerUtils = { return angle; }, - getPointerType: function getPointerType(pointer, interaction) { - // if the PointerEvent API isn't available, then the pointer must be ither - // a MouseEvent or TouchEvent - if (interaction.mouse) { - return 'mouse'; - } - if (!browser.supportsPointerEvent) { - return 'touch'; - } - - return is.string(pointer.pointerType) ? pointer.pointerType : [undefined, undefined, 'touch', 'pen', 'mouse'][pointer.pointerType]; + getPointerType: function getPointerType(pointer) { + return is.string(pointer.pointerType) ? pointer.pointerType : is.number(pointer.pointerType) ? [undefined, undefined, 'touch', 'pen', 'mouse'][pointer.pointerType] + // if the PointerEvent API isn't available, then the "pointer" must + // be either a MouseEvent, TouchEvent, or Touch object + : /touch/.test(pointer.type) || pointer instanceof domObjects.Touch ? 'touch' : 'mouse'; }, // [ event.target, event.currentTarget ] diff --git a/dist/interact.js.map b/dist/interact.js.map index 60832b766..4f3a62ba8 100644 --- a/dist/interact.js.map +++ b/dist/interact.js.map @@ -1 +1 @@ -{"version":3,"sources":["src/header.js","node_modules/browser-pack/_prelude.js","index.js","src/Eventable.js","src/InteractEvent.js","src/Interactable.js","src/Interaction.js","src/actions/base.js","src/actions/drag.js","src/actions/drop.js","src/actions/gesture.js","src/actions/resize.js","src/autoScroll.js","src/autoStart/InteractableMethods.js","src/autoStart/base.js","src/autoStart/delay.js","src/autoStart/drag.js","src/autoStart/gesture.js","src/autoStart/resize.js","src/defaultOptions.js","src/index.js","src/inertia.js","src/interact.js","src/interactablePreventDefault.js","src/legacyBrowsers.js","src/modifiers/index.js","src/modifiers/restrict.js","src/modifiers/restrictEdges.js","src/modifiers/restrictSize.js","src/modifiers/snap.js","src/modifiers/snapSize.js","src/pointerEvents/PointerEvent.js","src/pointerEvents/base.js","src/pointerEvents/holdRepeat.js","src/pointerEvents/interactableTargets.js","src/scope.js","src/utils/Signals.js","src/utils/arr.js","src/utils/browser.js","src/utils/domObjects.js","src/utils/domUtils.js","src/utils/events.js","src/utils/extend.js","src/utils/getOriginXY.js","src/utils/hypot.js","src/utils/index.js","src/utils/interactionFinder.js","src/utils/is.js","src/utils/isWindow.js","src/utils/pointerExtend.js","src/utils/pointerUtils.js","src/utils/raf.js","src/utils/rect.js","src/utils/window.js"],"names":[],"mappings":"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","file":"interact.js","sourceRoot":"","sourcesContent":["/**\n * interact.js v1.3.0-alpha.3+sha.9595c40\n *\n * Copyright (c) 2012-2017 Taye Adeyemi \n * Open source under the MIT License.\n * https://raw.github.com/taye/interact.js/master/LICENSE\n */\n","(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o 150) {\n return null;\n }\n\n let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI;\n const overlap = 22.5;\n\n if (angle < 0) {\n angle += 360;\n }\n\n const left = 135 - overlap <= angle && angle < 225 + overlap;\n const up = 225 - overlap <= angle && angle < 315 + overlap;\n\n const right = !left && (315 - overlap <= angle || angle < 45 + overlap);\n const down = !up && 45 - overlap <= angle && angle < 135 + overlap;\n\n return {\n up,\n down,\n left,\n right,\n angle,\n speed: interaction.prevEvent.speed,\n velocity: {\n x: interaction.prevEvent.velocityX,\n y: interaction.prevEvent.velocityY,\n },\n };\n }\n\n preventDefault () {}\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n}\n\nsignals.on('set-delta', function ({ iEvent, interaction, starting, deltaSource }) {\n const prevEvent = starting? iEvent : interaction.prevEvent;\n\n if (deltaSource === 'client') {\n iEvent.dx = iEvent.clientX - prevEvent.clientX;\n iEvent.dy = iEvent.clientY - prevEvent.clientY;\n }\n else {\n iEvent.dx = iEvent.pageX - prevEvent.pageX;\n iEvent.dy = iEvent.pageY - prevEvent.pageY;\n }\n});\n\nInteractEvent.signals = signals;\n\nmodule.exports = InteractEvent;\n","const is = require('./utils/is');\nconst events = require('./utils/events');\nconst extend = require('./utils/extend');\nconst actions = require('./actions/base');\nconst scope = require('./scope');\nconst Eventable = require('./Eventable');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nconst {\n getElementRect,\n nodeContains,\n trySelector,\n} = require('./utils/domUtils');\nconst { getWindow } = require('./utils/window');\nconst { indexOf, contains } = require('./utils/arr');\nconst { wheelEvent } = require('./utils/browser');\n\n// all set interactables\nscope.interactables = [];\n\n/*\\\n * Interactable\n [ property ]\n **\n * Object type returned by @interact\n\\*/\nclass Interactable {\n constructor (target, options) {\n options = options || {};\n\n this.target = target;\n this.events = new Eventable();\n this._context = options.context || scope.document;\n this._win = getWindow(trySelector(target)? this._context : target);\n this._doc = this._win.document;\n\n signals.fire('new', {\n target,\n options,\n interactable: this,\n win: this._win,\n });\n\n scope.addDocument( this._doc, this._win );\n\n scope.interactables.push(this);\n\n this.set(options);\n }\n\n setOnEvents (action, phases) {\n const onAction = 'on' + action;\n\n if (is.function(phases.onstart) ) { this.events[onAction + 'start' ] = phases.onstart ; }\n if (is.function(phases.onmove) ) { this.events[onAction + 'move' ] = phases.onmove ; }\n if (is.function(phases.onend) ) { this.events[onAction + 'end' ] = phases.onend ; }\n if (is.function(phases.oninertiastart)) { this.events[onAction + 'inertiastart' ] = phases.oninertiastart ; }\n\n return this;\n }\n\n setPerAction (action, options) {\n // for all the default per-action options\n for (const option in options) {\n // if this option exists for this action\n if (option in defaults[action]) {\n // if the option in the options arg is an object value\n if (is.object(options[option])) {\n // duplicate the object\n this.options[action][option] = extend(this.options[action][option] || {}, options[option]);\n\n if (is.object(defaults.perAction[option]) && 'enabled' in defaults.perAction[option]) {\n this.options[action][option].enabled = options[option].enabled === false? false : true;\n }\n }\n else if (is.bool(options[option]) && is.object(defaults.perAction[option])) {\n this.options[action][option].enabled = options[option];\n }\n else if (options[option] !== undefined) {\n // or if it's not undefined, do a plain assignment\n this.options[action][option] = options[option];\n }\n }\n }\n }\n\n /*\\\n * Interactable.getRect\n [ method ]\n *\n * The default function to get an Interactables bounding rect. Can be\n * overridden using @Interactable.rectChecker.\n *\n - element (Element) #optional The element to measure.\n = (object) The object's bounding rectangle.\n o {\n o top : 0,\n o left : 0,\n o bottom: 0,\n o right : 0,\n o width : 0,\n o height: 0\n o }\n \\*/\n getRect (element) {\n element = element || this.target;\n\n if (is.string(this.target) && !(is.element(element))) {\n element = this._context.querySelector(this.target);\n }\n\n return getElementRect(element);\n }\n\n /*\\\n * Interactable.rectChecker\n [ method ]\n *\n * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n - checker (function) #optional A function which returns this Interactable's bounding rectangle. See @Interactable.getRect\n = (function | object) The checker function or this Interactable\n \\*/\n rectChecker (checker) {\n if (is.function(checker)) {\n this.getRect = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.getRect;\n\n return this;\n }\n\n return this.getRect;\n }\n\n _backCompatOption (optionName, newValue) {\n if (trySelector(newValue) || is.object(newValue)) {\n this.options[optionName] = newValue;\n\n for (const action of actions.names) {\n this.options[action][optionName] = newValue;\n }\n\n return this;\n }\n\n return this.options[optionName];\n }\n\n /*\\\n * Interactable.origin\n [ method ]\n *\n * Gets or sets the origin of the Interactable's element. The x and y\n * of the origin will be subtracted from action event coordinates.\n *\n - origin (object | string) #optional An object eg. { x: 0, y: 0 } or string 'parent', 'self' or any CSS selector\n * OR\n - origin (Element) #optional An HTML or SVG Element whose rect will be used\n **\n = (object) The current origin or this Interactable\n \\*/\n origin (newValue) {\n return this._backCompatOption('origin', newValue);\n }\n\n /*\\\n * Interactable.deltaSource\n [ method ]\n *\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n - newValue (string) #optional Use 'client' if you will be scrolling while interacting; Use 'page' if you want autoScroll to work\n = (string | object) The current deltaSource or this Interactable\n \\*/\n deltaSource (newValue) {\n if (newValue === 'page' || newValue === 'client') {\n this.options.deltaSource = newValue;\n\n return this;\n }\n\n return this.options.deltaSource;\n }\n\n /*\\\n * Interactable.context\n [ method ]\n *\n * Gets the selector context Node of the Interactable. The default is `window.document`.\n *\n = (Node) The context Node of this Interactable\n **\n \\*/\n context () {\n return this._context;\n }\n\n inContext (element) {\n return (this._context === element.ownerDocument\n || nodeContains(this._context, element));\n }\n\n /*\\\n * Interactable.fire\n [ method ]\n *\n * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n - iEvent (InteractEvent) The InteractEvent object to be fired on this Interactable\n = (Interactable) this Interactable\n \\*/\n fire (iEvent) {\n this.events.fire(iEvent);\n\n return this;\n }\n\n _onOffMultiple (method, eventType, listener, options) {\n if (is.string(eventType) && eventType.search(' ') !== -1) {\n eventType = eventType.trim().split(/ +/);\n }\n\n if (is.array(eventType)) {\n for (let i = 0; i < eventType.length; i++) {\n this[method](eventType[i], listener, options);\n }\n\n return true;\n }\n\n if (is.object(eventType)) {\n for (const prop in eventType) {\n this[method](prop, eventType[prop], listener);\n }\n\n return true;\n }\n }\n\n /*\\\n * Interactable.on\n [ method ]\n *\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n - eventType (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) This Interactable\n \\*/\n on (eventType, listener, options) {\n if (this._onOffMultiple('on', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.on(eventType, listener);\n }\n // delegated event for selector\n else if (is.string(this.target)) {\n events.addDelegate(this.target, this._context, eventType, listener, options);\n }\n else {\n events.add(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.off\n [ method ]\n *\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n - eventType (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) This Interactable\n \\*/\n off (eventType, listener, options) {\n if (this._onOffMultiple('off', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n // if it is an action event type\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.off(eventType, listener);\n }\n // delegated event\n else if (is.string(this.target)) {\n events.removeDelegate(this.target, this._context, eventType, listener, options);\n }\n // remove listener from this Interatable's element\n else {\n events.remove(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.set\n [ method ]\n *\n * Reset the options of this Interactable\n - options (object) The new settings to apply\n = (object) This Interactable\n \\*/\n set (options) {\n if (!is.object(options)) {\n options = {};\n }\n\n this.options = extend({}, defaults.base);\n\n const perActions = extend({}, defaults.perAction);\n\n for (const actionName in actions.methodDict) {\n const methodName = actions.methodDict[actionName];\n\n this.options[actionName] = extend({}, defaults[actionName]);\n\n this.setPerAction(actionName, perActions);\n\n this[methodName](options[actionName]);\n }\n\n for (const setting of Interactable.settingsMethods) {\n this.options[setting] = defaults.base[setting];\n\n if (setting in options) {\n this[setting](options[setting]);\n }\n }\n\n signals.fire('set', {\n options,\n interactable: this,\n });\n\n return this;\n }\n\n /*\\\n * Interactable.unset\n [ method ]\n *\n * Remove this interactable from the list of interactables and remove\n * it's action capabilities and event listeners\n *\n = (object) @interact\n \\*/\n unset () {\n events.remove(this.target, 'all');\n\n if (is.string(this.target)) {\n // remove delegated events\n for (const type in events.delegatedEvents) {\n const delegated = events.delegatedEvents[type];\n\n if (delegated.selectors[0] === this.target\n && delegated.contexts[0] === this._context) {\n\n delegated.selectors.splice(0, 1);\n delegated.contexts .splice(0, 1);\n delegated.listeners.splice(0, 1);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegated[type] = null;\n }\n }\n\n events.remove(this._context, type, events.delegateListener);\n events.remove(this._context, type, events.delegateUseCapture, true);\n }\n }\n else {\n events.remove(this, 'all');\n }\n\n signals.fire('unset', { interactable: this });\n\n scope.interactables.splice(indexOf(scope.interactables, this), 1);\n\n // Stop related interactions when an Interactable is unset\n for (const interaction of scope.interactions || []) {\n if (interaction.target === this && interaction.interacting()) {\n interaction.stop();\n }\n }\n\n return scope.interact;\n }\n}\n\nscope.interactables.indexOfElement = function indexOfElement (target, context) {\n context = context || scope.document;\n\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n if (interactable.target === target && interactable._context === context) {\n return i;\n }\n }\n return -1;\n};\n\nscope.interactables.get = function interactableGet (element, options, dontCheckInContext) {\n const ret = this[this.indexOfElement(element, options && options.context)];\n\n return ret && (is.string(element) || dontCheckInContext || ret.inContext(element))? ret : null;\n};\n\nscope.interactables.forEachSelector = function (callback, element) {\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n // skip non CSS selector targets and out of context elements\n if (!is.string(interactable.target)\n || (element && !interactable.inContext(element))) {\n continue;\n }\n\n const ret = callback(interactable, interactable.target, interactable._context, i, this);\n\n if (ret !== undefined) {\n return ret;\n }\n }\n};\n\n// all interact.js eventTypes\nInteractable.eventTypes = scope.eventTypes = [];\n\nInteractable.signals = signals;\n\nInteractable.settingsMethods = [ 'deltaSource', 'origin', 'preventDefault', 'rectChecker' ];\n\nmodule.exports = Interactable;\n","const scope = require('./scope');\nconst utils = require('./utils');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst finder = require('./utils/interactionFinder');\nconst signals = require('./utils/Signals').new();\n\nconst listeners = {};\nconst methodNames = [\n 'pointerDown', 'pointerMove', 'pointerUp',\n 'updatePointer', 'removePointer',\n];\n\n// for ignoring browser's simulated mouse events\nlet prevTouchTime = 0;\n\n// all active and idle interactions\nscope.interactions = [];\n\nclass Interaction {\n constructor () {\n this.target = null; // current interactable being interacted with\n this.element = null; // the target element of the interactable\n\n this.prepared = { // action that's ready to be fired on next move event\n name : null,\n axis : null,\n edges: null,\n };\n\n // keep track of added pointers\n this.pointers = [];\n this.pointerIds = [];\n this.downTargets = [];\n this.downTimes = [];\n\n // Previous native pointer move event coordinates\n this.prevCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n // current native pointer move event coordinates\n this.curCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Starting InteractEvent pointer coordinates\n this.startCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Change in coordinates and time of the pointer\n this.pointerDelta = {\n page : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n client : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n timeStamp: 0,\n };\n\n this.downEvent = null; // pointerdown/mousedown/touchstart event\n this.downPointer = {};\n\n this._eventTarget = null;\n this._curEventTarget = null;\n\n this.prevEvent = null; // previous action event\n\n this.pointerIsDown = false;\n this.pointerWasMoved = false;\n this._interacting = false;\n\n this.mouse = false;\n\n signals.fire('new', this);\n\n scope.interactions.push(this);\n }\n\n pointerDown (pointer, event, eventTarget) {\n const pointerIndex = this.updatePointer(pointer, event, true);\n\n signals.fire('down', {\n pointer,\n event,\n eventTarget,\n pointerIndex,\n interaction: this,\n });\n }\n\n /*\\\n * Interaction.start\n [ method ]\n *\n * Start an action with the given Interactable and Element as tartgets. The\n * action must be enabled for the target Interactable and an appropriate number\n * of pointers must be held down - 1 for drag/resize, 2 for gesture.\n *\n * Use it with `interactable.able({ manualStart: false })` to always\n * [start actions manually](https://github.com/taye/interact.js/issues/114)\n *\n - action (object) The action to be performed - drag, resize, etc.\n - target (Interactable) The Interactable to target\n - element (Element) The DOM Element to target\n = (object) interact\n **\n | interact(target)\n | .draggable({\n | // disable the default drag start by down->move\n | manualStart: true\n | })\n | // start dragging after the user holds the pointer down\n | .on('hold', function (event) {\n | var interaction = event.interaction;\n |\n | if (!interaction.interacting()) {\n | interaction.start({ name: 'drag' },\n | event.interactable,\n | event.currentTarget);\n | }\n | });\n \\*/\n start (action, target, element) {\n if (this.interacting()\n || !this.pointerIsDown\n || this.pointerIds.length < (action.name === 'gesture'? 2 : 1)) {\n return;\n }\n\n // if this interaction had been removed after stopping\n // add it back\n if (utils.indexOf(scope.interactions, this) === -1) {\n scope.interactions.push(this);\n }\n\n utils.copyAction(this.prepared, action);\n this.target = target;\n this.element = element;\n\n signals.fire('action-start', {\n interaction: this,\n event: this.downEvent,\n });\n }\n\n pointerMove (pointer, event, eventTarget) {\n if (!this.simulation) {\n this.updatePointer(pointer);\n utils.setCoords(this.curCoords, this.pointers);\n }\n\n const duplicateMove = (this.curCoords.page.x === this.prevCoords.page.x\n && this.curCoords.page.y === this.prevCoords.page.y\n && this.curCoords.client.x === this.prevCoords.client.x\n && this.curCoords.client.y === this.prevCoords.client.y);\n\n let dx;\n let dy;\n\n // register movement greater than pointerMoveTolerance\n if (this.pointerIsDown && !this.pointerWasMoved) {\n dx = this.curCoords.client.x - this.startCoords.client.x;\n dy = this.curCoords.client.y - this.startCoords.client.y;\n\n this.pointerWasMoved = utils.hypot(dx, dy) > Interaction.pointerMoveTolerance;\n }\n\n const signalArg = {\n pointer,\n pointerIndex: this.getPointerIndex(pointer),\n event,\n eventTarget,\n dx,\n dy,\n duplicate: duplicateMove,\n interaction: this,\n interactingBeforeMove: this.interacting(),\n };\n\n if (!duplicateMove) {\n // set pointer coordinate, time changes and speeds\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n }\n\n signals.fire('move', signalArg);\n\n if (!duplicateMove) {\n // if interacting, fire an 'action-move' signal etc\n if (this.interacting()) {\n this.doMove(signalArg);\n }\n\n if (this.pointerWasMoved) {\n utils.copyCoords(this.prevCoords, this.curCoords);\n }\n }\n }\n\n /*\\\n * Interaction.doMove\n [ method ]\n *\n * Force a move of the current action at the same coordinates. Useful if\n * snap/restrict has been changed and you want a movement with the new\n * settings.\n *\n **\n | interact(target)\n | .draggable(true)\n | .on('dragmove', function (event) {\n | if (someCondition) {\n | // change the snap settings\n | event.interactable.draggable({ snap: { targets: [] }});\n | // fire another move event with re-calculated snap\n | event.interaction.doMove();\n | }\n | });\n \\*/\n doMove (signalArg) {\n signalArg = utils.extend({\n pointer: this.pointers[0],\n event: this.prevEvent,\n eventTarget: this._eventTarget,\n interaction: this,\n }, signalArg || {});\n\n signals.fire('before-action-move', signalArg);\n\n if (!this._dontFireMove) {\n signals.fire('action-move', signalArg);\n }\n\n this._dontFireMove = false;\n }\n\n // End interact move events and stop auto-scroll unless simulation is running\n pointerUp (pointer, event, eventTarget, curEventTarget) {\n const pointerIndex = this.getPointerIndex(pointer);\n\n signals.fire(/cancel$/i.test(event.type)? 'cancel' : 'up', {\n pointer,\n pointerIndex,\n event,\n eventTarget,\n curEventTarget,\n interaction: this,\n });\n\n if (!this.simulation) {\n this.end(event);\n }\n\n this.pointerIsDown = false;\n this.removePointer(pointer, event);\n }\n\n /*\\\n * Interaction.end\n [ method ]\n *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n - event (PointerEvent) #optional\n **\n | interact(target)\n | .draggable(true)\n | .on('move', function (event) {\n | if (event.pageX > 1000) {\n | // end the current action\n | event.interaction.end();\n | // stop all further listeners from being called\n | event.stopImmediatePropagation();\n | }\n | });\n \\*/\n end (event) {\n event = event || this.prevEvent;\n\n if (this.interacting()) {\n signals.fire('action-end', {\n event,\n interaction: this,\n });\n }\n\n this.stop();\n }\n\n currentAction () {\n return this._interacting? this.prepared.name: null;\n }\n\n interacting () {\n return this._interacting;\n }\n\n stop () {\n signals.fire('stop', { interaction: this });\n\n if (this._interacting) {\n signals.fire('stop-active', { interaction: this });\n signals.fire('stop-' + this.prepared.name, { interaction: this });\n }\n\n this.target = this.element = null;\n\n this._interacting = false;\n this.prepared.name = this.prevEvent = null;\n }\n\n getPointerIndex (pointer) {\n return utils.indexOf(this.pointerIds, utils.getPointerId(pointer));\n }\n\n updatePointer (pointer, event, down = event && /(down|start)$/i.test(event.type)) {\n const id = utils.getPointerId(pointer);\n let index = this.getPointerIndex(pointer);\n\n if (index === -1) {\n index = this.pointerIds.length;\n this.pointerIds[index] = id;\n }\n\n if (down) {\n signals.fire('update-pointer-down', {\n pointer,\n event,\n down,\n pointerId: id,\n pointerIndex: index,\n interaction: this,\n });\n }\n\n this.pointers[index] = pointer;\n\n return index;\n }\n\n removePointer (pointer, event) {\n const id = utils.getPointerId(pointer);\n const index = this.mouse? 0 : utils.indexOf(this.pointerIds, id);\n\n if (index === -1) { return; }\n\n signals.fire('remove-pointer', {\n pointer,\n event,\n pointerIndex: index,\n interaction: this,\n });\n\n this.pointers .splice(index, 1);\n this.pointerIds .splice(index, 1);\n this.downTargets.splice(index, 1);\n this.downTimes .splice(index, 1);\n }\n\n _updateEventTargets (target, currentTarget) {\n this._eventTarget = target;\n this._curEventTarget = currentTarget;\n }\n}\n\nfor (let i = 0, len = methodNames.length; i < len; i++) {\n const method = methodNames[i];\n\n listeners[method] = doOnInteractions(method);\n}\n\nfunction doOnInteractions (method) {\n return (function (event) {\n const [eventTarget, curEventTarget] = utils.getEventTargets(event);\n const matches = []; // [ [pointer, interaction], ...]\n\n if (browser.supportsTouch && /touch/.test(event.type)) {\n prevTouchTime = new Date().getTime();\n\n for (let i = 0; i < event.changedTouches.length; i++) {\n const pointer = event.changedTouches[i];\n const interaction = finder.search(pointer, event.type, eventTarget);\n\n matches.push([pointer, interaction || new Interaction()]);\n }\n }\n else {\n let invalidPointer = false;\n\n if (!browser.supportsPointerEvent && /mouse/.test(event.type)) {\n // ignore mouse events while touch interactions are active\n for (let i = 0; i < scope.interactions.length && !invalidPointer; i++) {\n invalidPointer = !scope.interactions[i].mouse && scope.interactions[i].pointerIsDown;\n }\n\n // try to ignore mouse events that are simulated by the browser\n // after a touch event\n invalidPointer = invalidPointer\n || (new Date().getTime() - prevTouchTime < 500)\n // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated\n || event.timeStamp === 0;\n }\n\n if (!invalidPointer) {\n let interaction = finder.search(event, event.type, eventTarget);\n\n if (!interaction) {\n\n interaction = new Interaction();\n interaction.mouse = (/mouse/i.test(event.pointerType || event.type)\n // MSPointerEvent.MSPOINTER_TYPE_MOUSE\n || event.pointerType === 4\n || !event.pointerType);\n }\n\n matches.push([event, interaction]);\n }\n }\n\n for (const [pointer, interaction] of matches) {\n interaction._updateEventTargets(eventTarget, curEventTarget);\n interaction[method](pointer, event, eventTarget, curEventTarget);\n }\n });\n}\n\nfunction endAll (event) {\n for (let i = 0; i < scope.interactions.length; i++) {\n const interaction = scope.interactions[i];\n\n interaction.end(event);\n signals.fire('endall', { event, interaction });\n }\n}\n\nconst docEvents = { /* 'eventType': listenerFunc */ };\nconst pEventTypes = browser.pEventTypes;\n\nif (scope.PointerEvent) {\n docEvents[pEventTypes.down ] = listeners.pointerDown;\n docEvents[pEventTypes.move ] = listeners.pointerMove;\n docEvents[pEventTypes.up ] = listeners.pointerUp;\n docEvents[pEventTypes.cancel] = listeners.pointerUp;\n}\nelse {\n docEvents.mousedown = listeners.pointerDown;\n docEvents.mousemove = listeners.pointerMove;\n docEvents.mouseup = listeners.pointerUp;\n\n docEvents.touchstart = listeners.pointerDown;\n docEvents.touchmove = listeners.pointerMove;\n docEvents.touchend = listeners.pointerUp;\n docEvents.touchcancel = listeners.pointerUp;\n}\n\ndocEvents.blur = endAll;\n\nfunction onDocSignal ({ doc }, signalName) {\n const eventMethod = signalName.indexOf('add') === 0\n ? events.add : events.remove;\n\n // delegate event listener\n for (const eventType in scope.delegatedEvents) {\n eventMethod(doc, eventType, events.delegateListener);\n eventMethod(doc, eventType, events.delegateUseCapture, true);\n }\n\n for (const eventType in docEvents) {\n eventMethod(doc, eventType, docEvents[eventType]);\n }\n}\n\nsignals.on('update-pointer-down', ({ interaction, pointer, pointerId, pointerIndex, event, eventTarget, down }) => {\n interaction.pointerIds[pointerIndex] = pointerId;\n interaction.pointers[pointerIndex] = pointer;\n\n if (down) {\n interaction.pointerIsDown = true;\n }\n\n if (!interaction.interacting()) {\n utils.setCoords(interaction.startCoords, interaction.pointers);\n\n utils.copyCoords(interaction.curCoords , interaction.startCoords);\n utils.copyCoords(interaction.prevCoords, interaction.startCoords);\n\n interaction.downEvent = event;\n interaction.downTimes[pointerIndex] = interaction.curCoords.timeStamp;\n interaction.downTargets[pointerIndex] = eventTarget || event && utils.getEventTargets(event)[0];\n interaction.pointerWasMoved = false;\n\n utils.pointerExtend(interaction.downPointer, pointer);\n }\n});\n\nscope.signals.on('add-document' , onDocSignal);\nscope.signals.on('remove-document', onDocSignal);\n\nInteraction.pointerMoveTolerance = 1;\nInteraction.doOnInteractions = doOnInteractions;\nInteraction.endAll = endAll;\nInteraction.signals = signals;\nInteraction.docEvents = docEvents;\n\nscope.endAllInteractions = endAll;\n\nmodule.exports = Interaction;\n","const Interaction = require('../Interaction');\nconst InteractEvent = require('../InteractEvent');\n\nconst actions = {\n firePrepared,\n names: [],\n methodDict: {},\n};\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n interaction._interacting = true;\n firePrepared(interaction, event, 'start');\n});\n\nInteraction.signals.on('action-move', function ({ interaction, event, preEnd }) {\n firePrepared(interaction, event, 'move', preEnd);\n\n // if the action was ended in a listener\n if (!interaction.interacting()) { return false; }\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n firePrepared(interaction, event, 'end');\n});\n\nfunction firePrepared (interaction, event, phase, preEnd) {\n const actionName = interaction.prepared.name;\n\n const newEvent = new InteractEvent(interaction, event, actionName, phase, interaction.element, null, preEnd);\n\n interaction.target.fire(newEvent);\n interaction.prevEvent = newEvent;\n}\n\nmodule.exports = actions;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drag = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n startAxis : 'xy',\n lockAxis : 'xy',\n },\n\n checker: function (pointer, event, interactable) {\n const dragOptions = interactable.options.drag;\n\n return dragOptions.enabled\n ? { name: 'drag', axis: (dragOptions.lockAxis === 'start'\n ? dragOptions.startAxis\n : dragOptions.lockAxis)}\n : null;\n },\n\n getCursor: function () {\n return 'move';\n },\n};\n\nInteraction.signals.on('before-action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n interaction.curCoords.page.y = interaction.startCoords.page.y;\n interaction.curCoords.client.y = interaction.startCoords.client.y;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vx);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vx);\n interaction.pointerDelta.client.vy = 0;\n interaction.pointerDelta.page.vy = 0;\n }\n else if (axis === 'y') {\n interaction.curCoords.page.x = interaction.startCoords.page.x;\n interaction.curCoords.client.x = interaction.startCoords.client.x;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vy);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vy);\n interaction.pointerDelta.client.vx = 0;\n interaction.pointerDelta.page.vx = 0;\n }\n});\n\n// dragmove\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'dragmove') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n iEvent.pageY = interaction.startCoords.page.y;\n iEvent.clientY = interaction.startCoords.client.y;\n iEvent.dy = 0;\n }\n else if (axis === 'y') {\n iEvent.pageX = interaction.startCoords.page.x;\n iEvent.clientX = interaction.startCoords.client.x;\n iEvent.dx = 0;\n }\n});\n\n/*\\\n * Interactable.draggable\n [ method ]\n *\n * Gets or sets whether drag actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of drag events\n | var isDraggable = interact('ul li').draggable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on drag events (object makes the Interactable draggable)\n = (object) This Interactable\n | interact(element).draggable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // the axis in which the first movement must be\n | // for the drag sequence to start\n | // 'xy' by default - any direction\n | startAxis: 'x' || 'y' || 'xy',\n |\n | // 'xy' by default - don't restrict to one axis (move in any direction)\n | // 'x' or 'y' to restrict movement to either axis\n | // 'start' to restrict movement to the axis the drag started in\n | lockAxis: 'x' || 'y' || 'xy' || 'start',\n |\n | // max number of drags that can happen concurrently\n | // with elements of this Interactable. Infinity by default\n | max: Infinity,\n |\n | // max number of drags that can target the same element+Interactable\n | // 1 by default\n | maxPerElement: 2\n | });\n\\*/\nInteractable.prototype.draggable = function (options) {\n if (utils.is.object(options)) {\n this.options.drag.enabled = options.enabled === false? false: true;\n this.setPerAction('drag', options);\n this.setOnEvents('drag', options);\n\n if (/^(xy|x|y|start)$/.test(options.lockAxis)) {\n this.options.drag.lockAxis = options.lockAxis;\n }\n if (/^(xy|x|y)$/.test(options.startAxis)) {\n this.options.drag.startAxis = options.startAxis;\n }\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drag.enabled = options;\n\n if (!options) {\n this.ondragstart = this.ondragstart = this.ondragend = null;\n }\n\n return this;\n }\n\n return this.options.drag;\n};\n\nactions.drag = drag;\nactions.names.push('drag');\nutils.merge(Interactable.eventTypes, [\n 'dragstart',\n 'dragmove',\n 'draginertiastart',\n 'draginertiaresume',\n 'dragend',\n]);\nactions.methodDict.drag = 'draggable';\n\ndefaultOptions.drag = drag.defaults;\n\nmodule.exports = drag;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst scope = require('../scope');\nconst interact = require('../interact');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drop = {\n defaults: {\n enabled: false,\n accept : null,\n overlap: 'pointer',\n },\n};\n\nlet dynamicDrop = false;\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // reset active dropzones\n interaction.activeDrops.dropzones = [];\n interaction.activeDrops.elements = [];\n interaction.activeDrops.rects = [];\n\n interaction.dropEvents = null;\n\n if (!interaction.dynamicDrop) {\n setActiveDrops(interaction, interaction.element);\n }\n\n const dragEvent = interaction.prevEvent;\n const dropEvents = getDropEvents(interaction, event, dragEvent);\n\n if (dropEvents.activate) {\n fireActiveDrops(interaction, dropEvents.activate);\n }\n});\n\nInteractEvent.signals.on('new', function ({ interaction, iEvent, event }) {\n if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { return; }\n\n const draggableElement = interaction.element;\n const dragEvent = iEvent;\n const dropResult = getDrop(dragEvent, event, draggableElement);\n\n interaction.dropTarget = dropResult.dropzone;\n interaction.dropElement = dropResult.element;\n\n interaction.dropEvents = getDropEvents(interaction, event, dragEvent);\n});\n\nInteraction.signals.on('action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n fireDropEvents(interaction, interaction.dropEvents);\n});\n\nInteraction.signals.on('action-end', function ({ interaction }) {\n if (interaction.prepared.name === 'drag') {\n fireDropEvents(interaction, interaction.dropEvents);\n }\n});\n\nInteraction.signals.on('stop-drag', function ({ interaction }) {\n interaction.activeDrops.dropzones =\n interaction.activeDrops.elements =\n interaction.activeDrops.rects =\n interaction.dropEvents = null;\n});\n\nfunction collectDrops (interaction, element) {\n const drops = [];\n const elements = [];\n\n element = element || interaction.element;\n\n // collect all dropzones and their elements which qualify for a drop\n for (const current of scope.interactables) {\n if (!current.options.drop.enabled) { continue; }\n\n const accept = current.options.drop.accept;\n\n // test the draggable element against the dropzone's accept setting\n if ((utils.is.element(accept) && accept !== element)\n || (utils.is.string(accept)\n && !utils.matchesSelector(element, accept))) {\n\n continue;\n }\n\n // query for new elements if necessary\n const dropElements = utils.is.string(current.target)\n ? current._context.querySelectorAll(current.target)\n : [current.target];\n\n for (let i = 0; i < dropElements.length; i++) {\n const currentElement = dropElements[i];\n\n if (currentElement !== element) {\n drops.push(current);\n elements.push(currentElement);\n }\n }\n }\n\n return {\n elements,\n dropzones: drops,\n };\n}\n\nfunction fireActiveDrops (interaction, event) {\n let prevElement;\n\n // loop through all active dropzones and trigger event\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n const current = interaction.activeDrops.dropzones[i];\n const currentElement = interaction.activeDrops.elements [i];\n\n // prevent trigger of duplicate events on same element\n if (currentElement !== prevElement) {\n // set current element as event target\n event.target = currentElement;\n current.fire(event);\n }\n prevElement = currentElement;\n }\n}\n\n// Collect a new set of possible drops and save them in activeDrops.\n// setActiveDrops should always be called when a drag has just started or a\n// drag event happens while dynamicDrop is true\nfunction setActiveDrops (interaction, dragElement) {\n // get dropzones and their elements that could receive the draggable\n const possibleDrops = collectDrops(interaction, dragElement, true);\n\n interaction.activeDrops.dropzones = possibleDrops.dropzones;\n interaction.activeDrops.elements = possibleDrops.elements;\n interaction.activeDrops.rects = [];\n\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n interaction.activeDrops.rects[i] =\n interaction.activeDrops.dropzones[i].getRect(interaction.activeDrops.elements[i]);\n }\n}\n\nfunction getDrop (dragEvent, event, dragElement) {\n const interaction = dragEvent.interaction;\n const validDrops = [];\n\n if (dynamicDrop) {\n setActiveDrops(interaction, dragElement);\n }\n\n // collect all dropzones and their elements which qualify for a drop\n for (let j = 0; j < interaction.activeDrops.dropzones.length; j++) {\n const current = interaction.activeDrops.dropzones[j];\n const currentElement = interaction.activeDrops.elements [j];\n const rect = interaction.activeDrops.rects [j];\n\n validDrops.push(current.dropCheck(dragEvent, event, interaction.target, dragElement, currentElement, rect)\n ? currentElement\n : null);\n }\n\n // get the most appropriate dropzone based on DOM depth and order\n const dropIndex = utils.indexOfDeepestElement(validDrops);\n\n return {\n dropzone: interaction.activeDrops.dropzones[dropIndex] || null,\n element : interaction.activeDrops.elements [dropIndex] || null,\n };\n}\n\nfunction getDropEvents (interaction, pointerEvent, dragEvent) {\n const dropEvents = {\n enter : null,\n leave : null,\n activate : null,\n deactivate: null,\n move : null,\n drop : null,\n };\n\n const tmpl = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n };\n\n if (interaction.dropElement !== interaction.prevDropElement) {\n // if there was a prevDropTarget, create a dragleave event\n if (interaction.prevDropTarget) {\n dropEvents.leave = utils.extend({ type: 'dragleave' }, tmpl);\n\n dragEvent.dragLeave = dropEvents.leave.target = interaction.prevDropElement;\n dragEvent.prevDropzone = dropEvents.leave.dropzone = interaction.prevDropTarget;\n }\n // if the dropTarget is not null, create a dragenter event\n if (interaction.dropTarget) {\n dropEvents.enter = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n type : 'dragenter',\n };\n\n dragEvent.dragEnter = interaction.dropElement;\n dragEvent.dropzone = interaction.dropTarget;\n }\n }\n\n if (dragEvent.type === 'dragend' && interaction.dropTarget) {\n dropEvents.drop = utils.extend({ type: 'drop' }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n dragEvent.relatedTarget = interaction.dropElement;\n }\n if (dragEvent.type === 'dragstart') {\n dropEvents.activate = utils.extend({ type: 'dropactivate' }, tmpl);\n\n dropEvents.activate.target = null;\n dropEvents.activate.dropzone = null;\n }\n if (dragEvent.type === 'dragend') {\n dropEvents.deactivate = utils.extend({ type: 'dropdeactivate' }, tmpl);\n\n dropEvents.deactivate.target = null;\n dropEvents.deactivate.dropzone = null;\n }\n if (dragEvent.type === 'dragmove' && interaction.dropTarget) {\n dropEvents.move = utils.extend({\n dragmove : dragEvent,\n type : 'dropmove',\n }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n }\n\n return dropEvents;\n}\n\nfunction fireDropEvents (interaction, dropEvents) {\n if (dropEvents.leave) { interaction.prevDropTarget.fire(dropEvents.leave); }\n if (dropEvents.move ) { interaction.dropTarget.fire(dropEvents.move ); }\n if (dropEvents.enter) { interaction.dropTarget.fire(dropEvents.enter); }\n if (dropEvents.drop ) { interaction.dropTarget.fire(dropEvents.drop ); }\n if (dropEvents.deactivate) {\n fireActiveDrops(interaction, dropEvents.deactivate);\n }\n\n interaction.prevDropTarget = interaction.dropTarget;\n interaction.prevDropElement = interaction.dropElement;\n}\n\n/*\\\n * Interactable.dropzone\n [ method ]\n *\n * Returns or sets whether elements can be dropped onto this\n * Interactable to trigger drop events\n *\n * Dropzones can receive the following events:\n * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends\n * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone\n * - `dragmove` when a draggable that has entered the dropzone is moved\n * - `drop` when a draggable is dropped into this dropzone\n *\n * Use the `accept` option to allow only elements that match the given CSS\n * selector or element. The value can be:\n *\n * - **an Element** - only that element can be dropped into this dropzone.\n * - **a string**, - the element being dragged must match it as a CSS selector.\n * - **`null`** - accept options is cleared - it accepts any element.\n *\n * Use the `overlap` option to set how drops are checked for. The allowed\n * values are:\n *\n * - `'pointer'`, the pointer must be over the dropzone (default)\n * - `'center'`, the draggable element's center must be over the dropzone\n * - a number from 0-1 which is the `(intersection area) / (draggable area)`.\n * e.g. `0.5` for drop to happen when half of the area of the draggable is\n * over the dropzone\n *\n * Use the `checker` option to specify a function to check if a dragged\n * element is over this Interactable.\n *\n | interact(target)\n | .dropChecker(function(dragEvent, // related dragmove or dragend event\n | event, // TouchEvent/PointerEvent/MouseEvent\n | dropped, // bool result of the default checker\n | dropzone, // dropzone Interactable\n | dropElement, // dropzone elemnt\n | draggable, // draggable Interactable\n | draggableElement) {// draggable element\n |\n | return dropped && event.target.hasAttribute('allow-drop');\n | }\n *\n *\n - options (boolean | object | null) #optional The new value to be set.\n | interact('.drop').dropzone({\n | accept: '.can-drop' || document.getElementById('single-drop'),\n | overlap: 'pointer' || 'center' || zeroToOne\n | }\n = (boolean | object) The current setting or this Interactable\n\\*/\nInteractable.prototype.dropzone = function (options) {\n if (utils.is.object(options)) {\n this.options.drop.enabled = options.enabled === false? false: true;\n\n if (utils.is.function(options.ondrop) ) { this.events.ondrop = options.ondrop ; }\n if (utils.is.function(options.ondropactivate) ) { this.events.ondropactivate = options.ondropactivate ; }\n if (utils.is.function(options.ondropdeactivate)) { this.events.ondropdeactivate = options.ondropdeactivate; }\n if (utils.is.function(options.ondragenter) ) { this.events.ondragenter = options.ondragenter ; }\n if (utils.is.function(options.ondragleave) ) { this.events.ondragleave = options.ondragleave ; }\n if (utils.is.function(options.ondropmove) ) { this.events.ondropmove = options.ondropmove ; }\n\n if (/^(pointer|center)$/.test(options.overlap)) {\n this.options.drop.overlap = options.overlap;\n }\n else if (utils.is.number(options.overlap)) {\n this.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0);\n }\n if ('accept' in options) {\n this.options.drop.accept = options.accept;\n }\n if ('checker' in options) {\n this.options.drop.checker = options.checker;\n }\n\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drop.enabled = options;\n\n if (!options) {\n this.ondragenter = this.ondragleave = this.ondrop\n = this.ondropactivate = this.ondropdeactivate = null;\n }\n\n return this;\n }\n\n return this.options.drop;\n};\n\nInteractable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) {\n let dropped = false;\n\n // if the dropzone has no rect (eg. display: none)\n // call the custom dropChecker or just return false\n if (!(rect = rect || this.getRect(dropElement))) {\n return (this.options.drop.checker\n ? this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement)\n : false);\n }\n\n const dropOverlap = this.options.drop.overlap;\n\n if (dropOverlap === 'pointer') {\n const origin = utils.getOriginXY(draggable, draggableElement, 'drag');\n const page = utils.getPageXY(dragEvent);\n\n page.x += origin.x;\n page.y += origin.y;\n\n const horizontal = (page.x > rect.left) && (page.x < rect.right);\n const vertical = (page.y > rect.top ) && (page.y < rect.bottom);\n\n dropped = horizontal && vertical;\n }\n\n const dragRect = draggable.getRect(draggableElement);\n\n if (dragRect && dropOverlap === 'center') {\n const cx = dragRect.left + dragRect.width / 2;\n const cy = dragRect.top + dragRect.height / 2;\n\n dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom;\n }\n\n if (dragRect && utils.is.number(dropOverlap)) {\n const overlapArea = (Math.max(0, Math.min(rect.right , dragRect.right ) - Math.max(rect.left, dragRect.left))\n * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top , dragRect.top )));\n\n const overlapRatio = overlapArea / (dragRect.width * dragRect.height);\n\n dropped = overlapRatio >= dropOverlap;\n }\n\n if (this.options.drop.checker) {\n dropped = this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement);\n }\n\n return dropped;\n};\n\nInteractable.signals.on('unset', function ({ interactable }) {\n interactable.dropzone(false);\n});\n\nInteractable.settingsMethods.push('dropChecker');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.dropTarget = null; // the dropzone a drag target might be dropped into\n interaction.dropElement = null; // the element at the time of checking\n interaction.prevDropTarget = null; // the dropzone that was recently dragged away from\n interaction.prevDropElement = null; // the element at the time of checking\n interaction.dropEvents = null; // the dropEvents related to the current drag event\n\n interaction.activeDrops = {\n dropzones: [], // the dropzones that are mentioned below\n elements : [], // elements of dropzones that accept the target draggable\n rects : [], // the rects of the elements mentioned above\n };\n\n});\n\nInteraction.signals.on('stop', function ({ interaction }) {\n interaction.dropTarget = interaction.dropElement =\n interaction.prevDropTarget = interaction.prevDropElement = null;\n});\n\n/*\\\n * interact.dynamicDrop\n [ method ]\n *\n * Returns or sets whether the dimensions of dropzone elements are\n * calculated on every dragmove or only on dragstart for the default\n * dropChecker\n *\n - newValue (boolean) #optional True to check on each move. False to check only before start\n = (boolean | interact) The current setting or interact\n\\*/\ninteract.dynamicDrop = function (newValue) {\n if (utils.is.bool(newValue)) {\n //if (dragging && dynamicDrop !== newValue && !newValue) {\n //calcRects(dropzones);\n //}\n\n dynamicDrop = newValue;\n\n return interact;\n }\n return dynamicDrop;\n};\n\nutils.merge(Interactable.eventTypes, [\n 'dragenter',\n 'dragleave',\n 'dropactivate',\n 'dropdeactivate',\n 'dropmove',\n 'drop',\n]);\nactions.methodDict.drop = 'dropzone';\n\ndefaultOptions.drop = drop.defaults;\n\nmodule.exports = drop;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst gesture = {\n defaults: {\n enabled : false,\n origin : null,\n restrict: null,\n },\n\n checker: function (pointer, event, interactable, element, interaction) {\n if (interaction.pointerIds.length >= 2) {\n return { name: 'gesture' };\n }\n\n return null;\n },\n\n getCursor: function () {\n return '';\n },\n};\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturestart') { return; }\n iEvent.ds = 0;\n\n interaction.gesture.startDistance = interaction.gesture.prevDistance = iEvent.distance;\n interaction.gesture.startAngle = interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.scale = 1;\n});\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturemove') { return; }\n\n iEvent.ds = iEvent.scale - interaction.gesture.scale;\n\n interaction.target.fire(iEvent);\n\n interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.prevDistance = iEvent.distance;\n\n if (iEvent.scale !== Infinity\n && iEvent.scale !== null\n && iEvent.scale !== undefined\n && !isNaN(iEvent.scale)) {\n\n interaction.gesture.scale = iEvent.scale;\n }\n});\n\n/*\\\n * Interactable.gesturable\n [ method ]\n *\n * Gets or sets whether multitouch gestures can be performed on the\n * Interactable's element\n *\n = (boolean) Indicates if this can be the target of gesture events\n | var isGestureable = interact(element).gesturable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on gesture events (makes the Interactable gesturable)\n = (object) this Interactable\n | interact(element).gesturable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // limit multiple gestures.\n | // See the explanation in @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n\\*/\nInteractable.prototype.gesturable = function (options) {\n if (utils.is.object(options)) {\n this.options.gesture.enabled = options.enabled === false? false: true;\n this.setPerAction('gesture', options);\n this.setOnEvents('gesture', options);\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.gesture.enabled = options;\n\n if (!options) {\n this.ongesturestart = this.ongesturestart = this.ongestureend = null;\n }\n\n return this;\n }\n\n return this.options.gesture;\n};\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action, event, starting, ending, deltaSource }) {\n if (action !== 'gesture') { return; }\n\n const pointers = interaction.pointers;\n\n iEvent.touches = [pointers[0], pointers[1]];\n\n if (starting) {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = 1;\n iEvent.ds = 0;\n iEvent.angle = utils.touchAngle(pointers, undefined, deltaSource);\n iEvent.da = 0;\n }\n else if (ending || event instanceof InteractEvent) {\n iEvent.distance = interaction.prevEvent.distance;\n iEvent.box = interaction.prevEvent.box;\n iEvent.scale = interaction.prevEvent.scale;\n iEvent.ds = iEvent.scale - 1;\n iEvent.angle = interaction.prevEvent.angle;\n iEvent.da = iEvent.angle - interaction.gesture.startAngle;\n }\n else {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = iEvent.distance / interaction.gesture.startDistance;\n iEvent.angle = utils.touchAngle(pointers, interaction.gesture.prevAngle, deltaSource);\n\n iEvent.ds = iEvent.scale - interaction.gesture.prevScale;\n iEvent.da = iEvent.angle - interaction.gesture.prevAngle;\n }\n});\n\nInteraction.signals.on('new', function (interaction) {\n interaction.gesture = {\n start: { x: 0, y: 0 },\n\n startDistance: 0, // distance between two touches of touchStart\n prevDistance : 0,\n distance : 0,\n\n scale: 1, // gesture.distance / gesture.startDistance\n\n startAngle: 0, // angle of line joining two touches\n prevAngle : 0, // angle of the previous gesture event\n };\n});\n\nactions.gesture = gesture;\nactions.names.push('gesture');\nutils.merge(Interactable.eventTypes, [\n 'gesturestart',\n 'gesturemove',\n 'gestureend',\n]);\nactions.methodDict.gesture = 'gesturable';\n\ndefaultOptions.gesture = gesture.defaults;\n\nmodule.exports = gesture;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\n// Less Precision with touch input\nconst defaultMargin = browser.supportsTouch || browser.supportsPointerEvent? 20: 10;\n\nconst resize = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n square: false,\n preserveAspectRatio: false,\n axis: 'xy',\n\n // use default margin\n margin: NaN,\n\n // object with props left, right, top, bottom which are\n // true/false values to resize when the pointer is over that edge,\n // CSS selectors to match the handles for each direction\n // or the Elements for each handle\n edges: null,\n\n // a value of 'none' will limit the resize rect to a minimum of 0x0\n // 'negate' will alow the rect to have negative width/height\n // 'reposition' will keep the width/height positive by swapping\n // the top and bottom edges and/or swapping the left and right edges\n invert: 'none',\n },\n\n checker: function (pointer, event, interactable, element, interaction, rect) {\n if (!rect) { return null; }\n\n const page = utils.extend({}, interaction.curCoords.page);\n const options = interactable.options;\n\n if (options.resize.enabled) {\n const resizeOptions = options.resize;\n const resizeEdges = { left: false, right: false, top: false, bottom: false };\n\n // if using resize.edges\n if (utils.is.object(resizeOptions.edges)) {\n for (const edge in resizeEdges) {\n resizeEdges[edge] = checkResizeEdge(edge,\n resizeOptions.edges[edge],\n page,\n interaction._eventTarget,\n element,\n rect,\n resizeOptions.margin || defaultMargin);\n }\n\n resizeEdges.left = resizeEdges.left && !resizeEdges.right;\n resizeEdges.top = resizeEdges.top && !resizeEdges.bottom;\n\n if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) {\n return {\n name: 'resize',\n edges: resizeEdges,\n };\n }\n }\n else {\n const right = options.resize.axis !== 'y' && page.x > (rect.right - defaultMargin);\n const bottom = options.resize.axis !== 'x' && page.y > (rect.bottom - defaultMargin);\n\n if (right || bottom) {\n return {\n name: 'resize',\n axes: (right? 'x' : '') + (bottom? 'y' : ''),\n };\n }\n }\n }\n\n return null;\n },\n\n cursors: (browser.isIe9OrOlder ? {\n x : 'e-resize',\n y : 's-resize',\n xy: 'se-resize',\n\n top : 'n-resize',\n left : 'w-resize',\n bottom : 's-resize',\n right : 'e-resize',\n topleft : 'se-resize',\n bottomright: 'se-resize',\n topright : 'ne-resize',\n bottomleft : 'ne-resize',\n } : {\n x : 'ew-resize',\n y : 'ns-resize',\n xy: 'nwse-resize',\n\n top : 'ns-resize',\n left : 'ew-resize',\n bottom : 'ns-resize',\n right : 'ew-resize',\n topleft : 'nwse-resize',\n bottomright: 'nwse-resize',\n topright : 'nesw-resize',\n bottomleft : 'nesw-resize',\n }),\n\n getCursor: function (action) {\n if (action.axis) {\n return resize.cursors[action.name + action.axis];\n }\n else if (action.edges) {\n let cursorKey = '';\n const edgeNames = ['top', 'bottom', 'left', 'right'];\n\n for (let i = 0; i < 4; i++) {\n if (action.edges[edgeNames[i]]) {\n cursorKey += edgeNames[i];\n }\n }\n\n return resize.cursors[cursorKey];\n }\n },\n};\n\n// resizestart\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'resizestart' || !interaction.prepared.edges) {\n return;\n }\n\n const startRect = interaction.target.getRect(interaction.element);\n const resizeOptions = interaction.target.options.resize;\n\n /*\n * When using the `resizable.square` or `resizable.preserveAspectRatio` options, resizing from one edge\n * will affect another. E.g. with `resizable.square`, resizing to make the right edge larger will make\n * the bottom edge larger by the same amount. We call these 'linked' edges. Any linked edges will depend\n * on the active edges and the edge being interacted with.\n */\n if (resizeOptions.square || resizeOptions.preserveAspectRatio) {\n const linkedEdges = utils.extend({}, interaction.prepared.edges);\n\n linkedEdges.top = linkedEdges.top || (linkedEdges.left && !linkedEdges.bottom);\n linkedEdges.left = linkedEdges.left || (linkedEdges.top && !linkedEdges.right );\n linkedEdges.bottom = linkedEdges.bottom || (linkedEdges.right && !linkedEdges.top );\n linkedEdges.right = linkedEdges.right || (linkedEdges.bottom && !linkedEdges.left );\n\n interaction.prepared._linkedEdges = linkedEdges;\n }\n else {\n interaction.prepared._linkedEdges = null;\n }\n\n // if using `resizable.preserveAspectRatio` option, record aspect ratio at the start of the resize\n if (resizeOptions.preserveAspectRatio) {\n interaction.resizeStartAspectRatio = startRect.width / startRect.height;\n }\n\n interaction.resizeRects = {\n start : startRect,\n current : utils.extend({}, startRect),\n inverted : utils.extend({}, startRect),\n previous : utils.extend({}, startRect),\n delta : {\n left: 0, right : 0, width : 0,\n top : 0, bottom: 0, height: 0,\n },\n };\n\n iEvent.rect = interaction.resizeRects.inverted;\n iEvent.deltaRect = interaction.resizeRects.delta;\n});\n\n// resizemove\nInteractEvent.signals.on('new', function ({ iEvent, phase, interaction }) {\n if (phase !== 'move' || !interaction.prepared.edges) { return; }\n\n const resizeOptions = interaction.target.options.resize;\n const invert = resizeOptions.invert;\n const invertible = invert === 'reposition' || invert === 'negate';\n\n let edges = interaction.prepared.edges;\n\n const start = interaction.resizeRects.start;\n const current = interaction.resizeRects.current;\n const inverted = interaction.resizeRects.inverted;\n const delta = interaction.resizeRects.delta;\n const previous = utils.extend(interaction.resizeRects.previous, inverted);\n const originalEdges = edges;\n\n let dx = iEvent.dx;\n let dy = iEvent.dy;\n\n if (resizeOptions.preserveAspectRatio || resizeOptions.square) {\n // `resize.preserveAspectRatio` takes precedence over `resize.square`\n const startAspectRatio = resizeOptions.preserveAspectRatio\n ? interaction.resizeStartAspectRatio\n : 1;\n\n edges = interaction.prepared._linkedEdges;\n\n if ((originalEdges.left && originalEdges.bottom)\n || (originalEdges.right && originalEdges.top)) {\n dy = -dx / startAspectRatio;\n }\n else if (originalEdges.left || originalEdges.right ) { dy = dx / startAspectRatio; }\n else if (originalEdges.top || originalEdges.bottom) { dx = dy * startAspectRatio; }\n }\n\n // update the 'current' rect without modifications\n if (edges.top ) { current.top += dy; }\n if (edges.bottom) { current.bottom += dy; }\n if (edges.left ) { current.left += dx; }\n if (edges.right ) { current.right += dx; }\n\n if (invertible) {\n // if invertible, copy the current rect\n utils.extend(inverted, current);\n\n if (invert === 'reposition') {\n // swap edge values if necessary to keep width/height positive\n let swap;\n\n if (inverted.top > inverted.bottom) {\n swap = inverted.top;\n\n inverted.top = inverted.bottom;\n inverted.bottom = swap;\n }\n if (inverted.left > inverted.right) {\n swap = inverted.left;\n\n inverted.left = inverted.right;\n inverted.right = swap;\n }\n }\n }\n else {\n // if not invertible, restrict to minimum of 0x0 rect\n inverted.top = Math.min(current.top, start.bottom);\n inverted.bottom = Math.max(current.bottom, start.top);\n inverted.left = Math.min(current.left, start.right);\n inverted.right = Math.max(current.right, start.left);\n }\n\n inverted.width = inverted.right - inverted.left;\n inverted.height = inverted.bottom - inverted.top ;\n\n for (const edge in inverted) {\n delta[edge] = inverted[edge] - previous[edge];\n }\n\n iEvent.edges = interaction.prepared.edges;\n iEvent.rect = inverted;\n iEvent.deltaRect = delta;\n});\n\n/*\\\n * Interactable.resizable\n [ method ]\n *\n * Gets or sets whether resize actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of resize elements\n | var isResizeable = interact('input[type=text]').resizable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on resize events (object makes the Interactable resizable)\n = (object) This Interactable\n | interact(element).resizable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | edges: {\n | top : true, // Use pointer coords to check for resize.\n | left : false, // Disable resizing from left edge.\n | bottom: '.resize-s',// Resize if pointer target matches selector\n | right : handleEl // Resize if pointer target is the given Element\n | },\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height are adjusted at a 1:1 ratio.\n | square: false,\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height maintain the aspect ratio they had when resizing started.\n | preserveAspectRatio: false,\n |\n | // a value of 'none' will limit the resize rect to a minimum of 0x0\n | // 'negate' will allow the rect to have negative width/height\n | // 'reposition' will keep the width/height positive by swapping\n | // the top and bottom edges and/or swapping the left and right edges\n | invert: 'none' || 'negate' || 'reposition'\n |\n | // limit multiple resizes.\n | // See the explanation in the @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n \\*/\nInteractable.prototype.resizable = function (options) {\n if (utils.is.object(options)) {\n this.options.resize.enabled = options.enabled === false? false: true;\n this.setPerAction('resize', options);\n this.setOnEvents('resize', options);\n\n if (/^x$|^y$|^xy$/.test(options.axis)) {\n this.options.resize.axis = options.axis;\n }\n else if (options.axis === null) {\n this.options.resize.axis = defaultOptions.resize.axis;\n }\n\n if (utils.is.bool(options.preserveAspectRatio)) {\n this.options.resize.preserveAspectRatio = options.preserveAspectRatio;\n }\n else if (utils.is.bool(options.square)) {\n this.options.resize.square = options.square;\n }\n\n return this;\n }\n if (utils.is.bool(options)) {\n this.options.resize.enabled = options;\n\n if (!options) {\n this.onresizestart = this.onresizestart = this.onresizeend = null;\n }\n\n return this;\n }\n return this.options.resize;\n};\n\nfunction checkResizeEdge (name, value, page, element, interactableElement, rect, margin) {\n // false, '', undefined, null\n if (!value) { return false; }\n\n // true value, use pointer coords and element rect\n if (value === true) {\n // if dimensions are negative, \"switch\" edges\n const width = utils.is.number(rect.width )? rect.width : rect.right - rect.left;\n const height = utils.is.number(rect.height)? rect.height : rect.bottom - rect.top ;\n\n if (width < 0) {\n if (name === 'left' ) { name = 'right'; }\n else if (name === 'right') { name = 'left' ; }\n }\n if (height < 0) {\n if (name === 'top' ) { name = 'bottom'; }\n else if (name === 'bottom') { name = 'top' ; }\n }\n\n if (name === 'left' ) { return page.x < ((width >= 0? rect.left: rect.right ) + margin); }\n if (name === 'top' ) { return page.y < ((height >= 0? rect.top : rect.bottom) + margin); }\n\n if (name === 'right' ) { return page.x > ((width >= 0? rect.right : rect.left) - margin); }\n if (name === 'bottom') { return page.y > ((height >= 0? rect.bottom: rect.top ) - margin); }\n }\n\n // the remaining checks require an element\n if (!utils.is.element(element)) { return false; }\n\n return utils.is.element(value)\n // the value is an element to use as a resize handle\n ? value === element\n // otherwise check if element matches value as selector\n : utils.matchesUpTo(element, value, interactableElement);\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.resizeAxes = 'xy';\n});\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action }) {\n if (action !== 'resize' || !interaction.resizeAxes) { return; }\n\n const options = interaction.target.options;\n\n if (options.resize.square) {\n if (interaction.resizeAxes === 'y') {\n iEvent.dx = iEvent.dy;\n }\n else {\n iEvent.dy = iEvent.dx;\n }\n iEvent.axes = 'xy';\n }\n else {\n iEvent.axes = interaction.resizeAxes;\n\n if (interaction.resizeAxes === 'x') {\n iEvent.dy = 0;\n }\n else if (interaction.resizeAxes === 'y') {\n iEvent.dx = 0;\n }\n }\n});\n\nactions.resize = resize;\nactions.names.push('resize');\nutils.merge(Interactable.eventTypes, [\n 'resizestart',\n 'resizemove',\n 'resizeinertiastart',\n 'resizeinertiaresume',\n 'resizeend',\n]);\nactions.methodDict.resize = 'resizable';\n\ndefaultOptions.resize = resize.defaults;\n\nmodule.exports = resize;\n","const raf = require('./utils/raf');\nconst getWindow = require('./utils/window').getWindow;\nconst is = require('./utils/is');\nconst domUtils = require('./utils/domUtils');\nconst Interaction = require('./Interaction');\nconst defaultOptions = require('./defaultOptions');\n\nconst autoScroll = {\n defaults: {\n enabled : false,\n container: null, // the item that is scrolled (Window or HTMLElement)\n margin : 60,\n speed : 300, // the scroll speed in pixels per second\n },\n\n interaction: null,\n i: null, // the handle returned by window.setInterval\n x: 0, y: 0, // Direction each pulse is to scroll in\n\n isScrolling: false,\n prevTime: 0,\n\n start: function (interaction) {\n autoScroll.isScrolling = true;\n raf.cancel(autoScroll.i);\n\n autoScroll.interaction = interaction;\n autoScroll.prevTime = new Date().getTime();\n autoScroll.i = raf.request(autoScroll.scroll);\n },\n\n stop: function () {\n autoScroll.isScrolling = false;\n raf.cancel(autoScroll.i);\n },\n\n // scroll the window by the values in scroll.x/y\n scroll: function () {\n const options = autoScroll.interaction.target.options[autoScroll.interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(autoScroll.interaction.element);\n const now = new Date().getTime();\n // change in time in seconds\n const dt = (now - autoScroll.prevTime) / 1000;\n // displacement\n const s = options.speed * dt;\n\n if (s >= 1) {\n if (is.window(container)) {\n container.scrollBy(autoScroll.x * s, autoScroll.y * s);\n }\n else if (container) {\n container.scrollLeft += autoScroll.x * s;\n container.scrollTop += autoScroll.y * s;\n }\n\n autoScroll.prevTime = now;\n }\n\n if (autoScroll.isScrolling) {\n raf.cancel(autoScroll.i);\n autoScroll.i = raf.request(autoScroll.scroll);\n }\n },\n check: function (interactable, actionName) {\n const options = interactable.options;\n\n return options[actionName].autoScroll && options[actionName].autoScroll.enabled;\n },\n onInteractionMove: function ({ interaction, pointer }) {\n if (!(interaction.interacting()\n && autoScroll.check(interaction.target, interaction.prepared.name))) {\n return;\n }\n\n if (interaction.simulation) {\n autoScroll.x = autoScroll.y = 0;\n return;\n }\n\n let top;\n let right;\n let bottom;\n let left;\n\n const options = interaction.target.options[interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(interaction.element);\n\n if (is.window(container)) {\n left = pointer.clientX < autoScroll.margin;\n top = pointer.clientY < autoScroll.margin;\n right = pointer.clientX > container.innerWidth - autoScroll.margin;\n bottom = pointer.clientY > container.innerHeight - autoScroll.margin;\n }\n else {\n const rect = domUtils.getElementClientRect(container);\n\n left = pointer.clientX < rect.left + autoScroll.margin;\n top = pointer.clientY < rect.top + autoScroll.margin;\n right = pointer.clientX > rect.right - autoScroll.margin;\n bottom = pointer.clientY > rect.bottom - autoScroll.margin;\n }\n\n autoScroll.x = (right ? 1: left? -1: 0);\n autoScroll.y = (bottom? 1: top? -1: 0);\n\n if (!autoScroll.isScrolling) {\n // set the autoScroll properties to those of the target\n autoScroll.margin = options.margin;\n autoScroll.speed = options.speed;\n\n autoScroll.start(interaction);\n }\n },\n};\n\nInteraction.signals.on('stop-active', function () {\n autoScroll.stop();\n});\n\nInteraction.signals.on('action-move', autoScroll.onInteractionMove);\n\ndefaultOptions.perAction.autoScroll = autoScroll.defaults;\n\nmodule.exports = autoScroll;\n","const Interactable = require('../Interactable');\nconst actions = require('../actions/base');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.ignoreFrom\n [ method ]\n *\n * If the target of the `mousedown`, `pointerdown` or `touchstart`\n * event or any of it's parents match the given CSS selector or\n * Element, no drag/resize/gesture is started.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to not ignore any elements\n = (string | Element | object) The current ignoreFrom value or this Interactable\n **\n | interact(element, { ignoreFrom: document.getElementById('no-action') });\n | // or\n | interact(element).ignoreFrom('input, textarea, a');\n\\*/\nInteractable.prototype.ignoreFrom = function (newValue) {\n return this._backCompatOption('ignoreFrom', newValue);\n};\n\n/*\\\n * Interactable.allowFrom\n [ method ]\n *\n * A drag/resize/gesture is started only If the target of the\n * `mousedown`, `pointerdown` or `touchstart` event or any of it's\n * parents match the given CSS selector or Element.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to allow from any element\n = (string | Element | object) The current allowFrom value or this Interactable\n **\n | interact(element, { allowFrom: document.getElementById('drag-handle') });\n | // or\n | interact(element).allowFrom('.handle');\n\\*/\nInteractable.prototype.allowFrom = function (newValue) {\n return this._backCompatOption('allowFrom', newValue);\n};\n\nInteractable.prototype.testIgnore = function (ignoreFrom, interactableElement, element) {\n if (!ignoreFrom || !is.element(element)) { return false; }\n\n if (is.string(ignoreFrom)) {\n return domUtils.matchesUpTo(element, ignoreFrom, interactableElement);\n }\n else if (is.element(ignoreFrom)) {\n return domUtils.nodeContains(ignoreFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testAllow = function (allowFrom, interactableElement, element) {\n if (!allowFrom) { return true; }\n\n if (!is.element(element)) { return false; }\n\n if (is.string(allowFrom)) {\n return domUtils.matchesUpTo(element, allowFrom, interactableElement);\n }\n else if (is.element(allowFrom)) {\n return domUtils.nodeContains(allowFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testIgnoreAllow = function (options, interactableElement, eventTarget) {\n return (!this.testIgnore(options.ignoreFrom, interactableElement, eventTarget)\n && this.testAllow(options.allowFrom, interactableElement, eventTarget));\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (event.buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\n","const interact = require('../interact');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst actions = require('../actions/base');\nconst defaultOptions = require('../defaultOptions');\nconst browser = require('../utils/browser');\nconst scope = require('../scope');\nconst utils = require('../utils');\nconst signals = require('../utils/Signals').new();\n\nrequire('./InteractableMethods');\n\nconst autoStart = {\n signals,\n withinInteractionLimit,\n // Allow this many interactions to happen simultaneously\n maxInteractions: Infinity,\n defaults: {\n perAction: {\n manualStart: false,\n max: Infinity,\n maxPerElement: 1,\n allowFrom: null,\n ignoreFrom: null,\n },\n },\n setActionDefaults: function (action) {\n utils.extend(action.defaults, autoStart.defaults.perAction);\n },\n};\n\n// set cursor style on mousedown\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget }) {\n if (interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\n// set cursor style on mousemove\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget }) {\n if (!interaction.mouse\n || interaction.pointerIsDown\n || interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\nInteraction.signals.on('move', function (arg) {\n const { interaction, event } = arg;\n\n if (!interaction.pointerIsDown\n || interaction.interacting()\n || !interaction.pointerWasMoved\n || !interaction.prepared.name) {\n return;\n }\n\n signals.fire('before-start', arg);\n\n const target = interaction.target;\n\n if (interaction.prepared.name && target) {\n // check manualStart and interaction limit\n if (target.options[interaction.prepared.name].manualStart\n || !withinInteractionLimit(target, interaction.element, interaction.prepared)) {\n interaction.stop(event);\n }\n else {\n interaction.start(interaction.prepared, target, interaction.element);\n }\n }\n});\n\n// Check if the current target supports the action.\n// If so, return the validated action. Otherwise, return null\nfunction validateAction (action, interactable, element, eventTarget) {\n if (utils.is.object(action)\n && interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget)\n && interactable.options[action.name].enabled\n && withinInteractionLimit(interactable, element, action)) {\n return action;\n }\n\n return null;\n}\n\nfunction validateSelector (interaction, pointer, event, matches, matchElements, eventTarget) {\n for (let i = 0, len = matches.length; i < len; i++) {\n const match = matches[i];\n const matchElement = matchElements[i];\n const action = validateAction(match.getAction(pointer, event, interaction, matchElement),\n match,\n matchElement,\n eventTarget);\n\n if (action) {\n return {\n action,\n target: match,\n element: matchElement,\n };\n }\n }\n\n return {};\n}\n\nfunction getActionInfo (interaction, pointer, event, eventTarget) {\n let matches = [];\n let matchElements = [];\n\n let element = eventTarget;\n let action = null;\n\n function pushMatches (interactable, selector, context) {\n const elements = (browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined);\n\n if (utils.matchesSelector(element, selector, elements)) {\n\n matches.push(interactable);\n matchElements.push(element);\n }\n }\n\n while (utils.is.element(element)) {\n matches = [];\n matchElements = [];\n\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && (action = validateAction(elementInteractable.getAction(pointer, event, interaction, element, eventTarget),\n elementInteractable,\n element,\n eventTarget))\n && !elementInteractable.options[action.name].manualStart) {\n return {\n element,\n action,\n target: elementInteractable,\n };\n }\n else {\n scope.interactables.forEachSelector(pushMatches, element);\n\n const actionInfo = validateSelector(interaction, pointer, event, matches, matchElements, eventTarget);\n\n if (actionInfo.action\n && !actionInfo.target.options[actionInfo.action.name].manualStart) {\n return actionInfo;\n }\n }\n\n element = utils.parentNode(element);\n }\n\n return {};\n}\n\nfunction prepare (interaction, { action, target, element }) {\n action = action || {};\n\n if (interaction.target && interaction.target.options.styleCursor) {\n interaction.target._doc.documentElement.style.cursor = '';\n }\n\n interaction.target = target;\n interaction.element = element;\n utils.copyAction(interaction.prepared, action);\n\n if (target && target.options.styleCursor) {\n const cursor = action? actions[action.name].getCursor(action) : '';\n interaction.target._doc.documentElement.style.cursor = cursor;\n }\n\n signals.fire('prepared', { interaction: interaction });\n}\n\nInteraction.signals.on('stop', function ({ interaction }) {\n const target = interaction.target;\n\n if (target && target.options.styleCursor) {\n target._doc.documentElement.style.cursor = '';\n }\n});\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (utils.is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (utils.is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n const buttons = event.buttons || ({\n 0: 1,\n 1: 4,\n 3: 8,\n 4: 16,\n })[event.button];\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\nfunction withinInteractionLimit (interactable, element, action) {\n const options = interactable.options;\n const maxActions = options[action.name].max;\n const maxPerElement = options[action.name].maxPerElement;\n let activeInteractions = 0;\n let targetCount = 0;\n let targetElementCount = 0;\n\n // no actions if any of these values == 0\n if (!(maxActions && maxPerElement && autoStart.maxInteractions)) { return; }\n\n for (let i = 0, len = scope.interactions.length; i < len; i++) {\n const interaction = scope.interactions[i];\n const otherAction = interaction.prepared.name;\n\n if (!interaction.interacting()) { continue; }\n\n activeInteractions++;\n\n if (activeInteractions >= autoStart.maxInteractions) {\n return false;\n }\n\n if (interaction.target !== interactable) { continue; }\n\n targetCount += (otherAction === action.name)|0;\n\n if (targetCount >= maxActions) {\n return false;\n }\n\n if (interaction.element === element) {\n targetElementCount++;\n\n if (otherAction !== action.name || targetElementCount >= maxPerElement) {\n return false;\n }\n }\n }\n\n return autoStart.maxInteractions > 0;\n}\n\n/*\\\n * interact.maxInteractions\n [ method ]\n **\n * Returns or sets the maximum number of concurrent interactions allowed.\n * By default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables\n * and elements, you need to enable it in the draggable, resizable and\n * gesturable `'max'` and `'maxPerElement'` options.\n **\n - newValue (number) #optional Any number. newValue <= 0 means no interactions.\n\\*/\ninteract.maxInteractions = function (newValue) {\n if (utils.is.number(newValue)) {\n autoStart.maxInteractions = newValue;\n\n return this;\n }\n\n return autoStart.maxInteractions;\n};\n\nInteractable.settingsMethods.push('styleCursor');\nInteractable.settingsMethods.push('actionChecker');\nInteractable.settingsMethods.push('ignoreFrom');\nInteractable.settingsMethods.push('allowFrom');\n\ndefaultOptions.base.actionChecker = null;\ndefaultOptions.base.styleCursor = true;\n\nutils.extend(defaultOptions.perAction, autoStart.defaults.perAction);\n\nmodule.exports = autoStart;\n","const autoStart = require('./base');\nconst Interaction = require('../Interaction');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.delayTimer = null;\n});\n\nautoStart.signals.on('prepared', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.delayTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.target, interaction.element);\n }, delay);\n }\n});\n\nInteraction.signals.on('move', function ({ interaction, duplicate }) {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.delayTimer);\n }\n});\n\n// prevent regular down->move autoStart\nautoStart.signals.on('before-start', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.prepared.name = null;\n }\n});\n","const autoStart = require('./base');\nconst scope = require('../scope');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\n\nconst { matchesSelector, parentNode } = require('../utils/domUtils');\n\nautoStart.setActionDefaults(require('../actions/drag'));\n\nautoStart.signals.on('before-start', function ({ interaction, eventTarget, dx, dy }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // check if a drag is in the correct axis\n const absX = Math.abs(dx);\n const absY = Math.abs(dy);\n const options = interaction.target.options.drag;\n const startAxis = options.startAxis;\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy');\n\n interaction.prepared.axis = options.lockAxis === 'start'\n ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n : options.lockAxis;\n\n // if the movement isn't in the startAxis of the interactable\n if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) {\n // cancel the prepared action\n interaction.prepared.name = null;\n\n // then try to get a drag from another ineractable\n\n if (!interaction.prepared.name) {\n\n let element = eventTarget;\n\n const getDraggable = function (interactable, selector, context) {\n const elements = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n if (interactable === interaction.target) { return; }\n\n if (!options.manualStart\n && !interactable.testIgnoreAllow(options, element, eventTarget)\n && matchesSelector(element, selector, elements)) {\n\n const action = interactable.getAction(interaction.downPointer,\n interaction.downEvent,\n interaction,\n element);\n\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, interactable)\n && autoStart.validateAction(action, interactable, element, eventTarget)) {\n\n return interactable;\n }\n }\n };\n\n let action = null;\n\n // check all interactables\n while (is.element(element)) {\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && elementInteractable !== interaction.target\n && !elementInteractable.options.drag.manualStart) {\n\n action = elementInteractable.getAction(interaction.downPointer, interaction.downEvent, interaction, element);\n }\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, elementInteractable)) {\n\n interaction.prepared.name = 'drag';\n interaction.target = elementInteractable;\n interaction.element = element;\n break;\n }\n\n const selectorInteractable = scope.interactables.forEachSelector(getDraggable, element);\n\n if (selectorInteractable) {\n interaction.prepared.name = 'drag';\n interaction.target = selectorInteractable;\n interaction.element = element;\n break;\n }\n\n element = parentNode(element);\n }\n }\n }\n});\n\nfunction checkStartAxis (startAxis, interactable) {\n if (!interactable) { return false; }\n\n const thisAxis = interactable.options.drag.startAxis;\n\n return (startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis);\n}\n","require('./base').setActionDefaults(require('../actions/gesture'));\n","require('./base').setActionDefaults(require('../actions/resize'));\n","module.exports = {\n base: {\n accept : null,\n preventDefault: 'auto',\n deltaSource : 'page',\n },\n\n perAction: {\n origin: { x: 0, y: 0 },\n\n // only allow left button by default\n // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n mouseButtons: 1,\n\n inertia: {\n enabled : false,\n resistance : 10, // the lambda in exponential decay\n minSpeed : 100, // target speed must be above this for inertia to start\n endSpeed : 10, // the speed at which inertia is slow enough to stop\n allowResume : true, // allow resuming an action in inertia phase\n smoothEndDuration: 300, // animate to snap/restrict endOnly if there's no inertia\n },\n },\n};\n","/* browser entry point */\n\n// Legacy browser support\nrequire('./legacyBrowsers');\n\n// inertia\nrequire('./inertia');\n\n// modifiers\nrequire('./modifiers/snap');\nrequire('./modifiers/restrict');\n\n// pointerEvents\nrequire('./pointerEvents/base');\nrequire('./pointerEvents/holdRepeat');\nrequire('./pointerEvents/interactableTargets');\n\n// delay\nrequire('./autoStart/delay');\n\n// actions\nrequire('./actions/gesture');\nrequire('./actions/resize');\nrequire('./actions/drag');\nrequire('./actions/drop');\n\n// load these modifiers after resize is loaded\nrequire('./modifiers/snapSize');\nrequire('./modifiers/restrictEdges');\nrequire('./modifiers/restrictSize');\n\n// autoStart actions\nrequire('./autoStart/gesture');\nrequire('./autoStart/resize');\nrequire('./autoStart/drag');\n\n// Interactable preventDefault setting\nrequire('./interactablePreventDefault.js');\n\n// autoScroll\nrequire('./autoScroll');\n\n// export interact\nmodule.exports = require('./interact');\n","const InteractEvent = require('./InteractEvent');\nconst Interaction = require('./Interaction');\nconst modifiers = require('./modifiers');\nconst utils = require('./utils');\nconst animationFrame = require('./utils/raf');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.inertiaStatus = {\n active : false,\n smoothEnd : false,\n allowResume: false,\n\n startEvent: null,\n upCoords : {},\n\n xe: 0, ye: 0,\n sx: 0, sy: 0,\n\n t0: 0,\n vx0: 0, vys: 0,\n duration: 0,\n\n lambda_v0: 0,\n one_ve_v0: 0,\n i : null,\n };\n\n interaction.boundInertiaFrame = () => inertiaFrame .apply(interaction);\n interaction.boundSmoothEndFrame = () => smoothEndFrame.apply(interaction);\n});\n\nInteraction.signals.on('down', function ({ interaction, event, pointer, eventTarget }) {\n const status = interaction.inertiaStatus;\n\n // Check if the down event hits the current inertia target\n if (status.active) {\n let element = eventTarget;\n\n // climb up the DOM tree from the event target\n while (utils.is.element(element)) {\n\n // if interaction element is the current inertia target element\n if (element === interaction.element) {\n // stop inertia\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n\n // update pointers to the down event's coordinates\n interaction.updatePointer(pointer);\n utils.setCoords(interaction.curCoords, interaction.pointers);\n\n // fire appropriate signals\n const signalArg = { interaction };\n Interaction.signals.fire('before-action-move', signalArg);\n Interaction.signals.fire('action-resume' , signalArg);\n\n // fire a reume event\n const resumeEvent = new InteractEvent(interaction,\n event,\n interaction.prepared.name,\n 'inertiaresume',\n interaction.element);\n\n interaction.target.fire(resumeEvent);\n interaction.prevEvent = resumeEvent;\n modifiers.resetStatuses(interaction.modifierStatuses);\n\n utils.copyCoords(interaction.prevCoords, interaction.curCoords);\n break;\n }\n\n element = utils.parentNode(element);\n }\n }\n});\n\nInteraction.signals.on('up', function ({ interaction, event }) {\n const status = interaction.inertiaStatus;\n\n if (!interaction.interacting() || status.active) { return; }\n\n const target = interaction.target;\n const options = target && target.options;\n const inertiaOptions = options && interaction.prepared.name && options[interaction.prepared.name].inertia;\n\n const now = new Date().getTime();\n const statuses = {};\n const page = utils.extend({}, interaction.curCoords.page);\n const pointerSpeed = interaction.pointerDelta.client.speed;\n\n let smoothEnd = false;\n let modifierResult;\n\n // check if inertia should be started\n const inertiaPossible = (inertiaOptions && inertiaOptions.enabled\n && interaction.prepared.name !== 'gesture'\n && event !== status.startEvent);\n\n const inertia = (inertiaPossible\n && (now - interaction.curCoords.timeStamp) < 50\n && pointerSpeed > inertiaOptions.minSpeed\n && pointerSpeed > inertiaOptions.endSpeed);\n\n const modifierArg = {\n interaction,\n pageCoords: page,\n statuses,\n preEnd: true,\n requireEndOnly: true,\n };\n\n // smoothEnd\n if (inertiaPossible && !inertia) {\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n if (modifierResult.shouldMove && modifierResult.locked) {\n smoothEnd = true;\n }\n }\n\n if (!(inertia || smoothEnd)) { return; }\n\n utils.copyCoords(status.upCoords, interaction.curCoords);\n\n interaction.pointers[0] = status.startEvent =\n new InteractEvent(interaction, event, interaction.prepared.name, 'inertiastart', interaction.element);\n\n status.t0 = now;\n\n status.active = true;\n status.allowResume = inertiaOptions.allowResume;\n interaction.simulation = status;\n\n target.fire(status.startEvent);\n\n if (inertia) {\n status.vx0 = interaction.pointerDelta.client.vx;\n status.vy0 = interaction.pointerDelta.client.vy;\n status.v0 = pointerSpeed;\n\n calcInertia(interaction, status);\n\n utils.extend(page, interaction.curCoords.page);\n\n page.x += status.xe;\n page.y += status.ye;\n\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n status.modifiedXe += modifierResult.dx;\n status.modifiedYe += modifierResult.dy;\n\n status.i = animationFrame.request(interaction.boundInertiaFrame);\n }\n else {\n status.smoothEnd = true;\n status.xe = modifierResult.dx;\n status.ye = modifierResult.dy;\n\n status.sx = status.sy = 0;\n\n status.i = animationFrame.request(interaction.boundSmoothEndFrame);\n }\n});\n\nInteraction.signals.on('stop-active', function ({ interaction }) {\n const status = interaction.inertiaStatus;\n\n if (status.active) {\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n }\n});\n\nfunction calcInertia (interaction, status) {\n const inertiaOptions = interaction.target.options[interaction.prepared.name].inertia;\n const lambda = inertiaOptions.resistance;\n const inertiaDur = -Math.log(inertiaOptions.endSpeed / status.v0) / lambda;\n\n status.x0 = interaction.prevEvent.pageX;\n status.y0 = interaction.prevEvent.pageY;\n status.t0 = status.startEvent.timeStamp / 1000;\n status.sx = status.sy = 0;\n\n status.modifiedXe = status.xe = (status.vx0 - inertiaDur) / lambda;\n status.modifiedYe = status.ye = (status.vy0 - inertiaDur) / lambda;\n status.te = inertiaDur;\n\n status.lambda_v0 = lambda / status.v0;\n status.one_ve_v0 = 1 - inertiaOptions.endSpeed / status.v0;\n}\n\nfunction inertiaFrame () {\n updateInertiaCoords(this);\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n\n const status = this.inertiaStatus;\n const options = this.target.options[this.prepared.name].inertia;\n const lambda = options.resistance;\n const t = new Date().getTime() / 1000 - status.t0;\n\n if (t < status.te) {\n\n const progress = 1 - (Math.exp(-lambda * t) - status.lambda_v0) / status.one_ve_v0;\n\n if (status.modifiedXe === status.xe && status.modifiedYe === status.ye) {\n status.sx = status.xe * progress;\n status.sy = status.ye * progress;\n }\n else {\n const quadPoint = utils.getQuadraticCurvePoint(0, 0,\n status.xe,\n status.ye,\n status.modifiedXe,\n status.modifiedYe,\n progress);\n\n status.sx = quadPoint.x;\n status.sy = quadPoint.y;\n }\n\n this.doMove();\n\n status.i = animationFrame.request(this.boundInertiaFrame);\n }\n else {\n status.sx = status.modifiedXe;\n status.sy = status.modifiedYe;\n\n this.doMove();\n this.end(status.startEvent);\n status.active = false;\n this.simulation = null;\n }\n\n utils.copyCoords(this.prevCoords, this.curCoords);\n}\n\nfunction smoothEndFrame () {\n updateInertiaCoords(this);\n\n const status = this.inertiaStatus;\n const t = new Date().getTime() - status.t0;\n const duration = this.target.options[this.prepared.name].inertia.smoothEndDuration;\n\n if (t < duration) {\n status.sx = utils.easeOutQuad(t, 0, status.xe, duration);\n status.sy = utils.easeOutQuad(t, 0, status.ye, duration);\n\n this.pointerMove(status.startEvent, status.startEvent);\n\n status.i = animationFrame.request(this.boundSmoothEndFrame);\n }\n else {\n status.sx = status.xe;\n status.sy = status.ye;\n\n this.pointerMove(status.startEvent, status.startEvent);\n this.end(status.startEvent);\n\n status.smoothEnd =\n status.active = false;\n this.simulation = null;\n }\n}\n\nfunction updateInertiaCoords (interaction) {\n const status = interaction.inertiaStatus;\n\n // return if inertia isn't running\n if (!status.active) { return; }\n\n const pageUp = status.upCoords.page;\n const clientUp = status.upCoords.client;\n\n utils.setCoords(interaction.curCoords, [ {\n pageX : pageUp.x + status.sx,\n pageY : pageUp.y + status.sy,\n clientX: clientUp.x + status.sx,\n clientY: clientUp.y + status.sy,\n } ]);\n}\n","const browser = require('./utils/browser');\nconst events = require('./utils/events');\nconst utils = require('./utils');\nconst scope = require('./scope');\nconst Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\n\nconst globalEvents = {};\n\n/*\\\n * interact\n [ method ]\n *\n * The methods of this variable can be used to set elements as\n * interactables and also to change various default settings.\n *\n * Calling it as a function and passing an element or a valid CSS selector\n * string returns an Interactable object which has various methods to\n * configure it.\n *\n - element (Element | string) The HTML or SVG Element to interact with or CSS selector\n = (object) An @Interactable\n *\n > Usage\n | interact('#draggable').draggable(true);\n |\n | var rectables = interact('rect');\n | rectables\n | .gesturable(true)\n | .on('gesturemove', function (event) {\n | // ...\n | });\n\\*/\nfunction interact (element, options) {\n let interactable = scope.interactables.get(element, options);\n\n if (!interactable) {\n interactable = new Interactable(element, options);\n interactable.events.global = globalEvents;\n }\n\n return interactable;\n}\n\n/*\\\n * interact.isSet\n [ method ]\n *\n * Check if an element has been set\n - element (Element) The Element being searched for\n = (boolean) Indicates if the element or CSS selector was previously passed to interact\n\\*/\ninteract.isSet = function (element, options) {\n return scope.interactables.indexOfElement(element, options && options.context) !== -1;\n};\n\n/*\\\n * interact.on\n [ method ]\n *\n * Adds a global listener for an InteractEvent or adds a DOM event to\n * `document`\n *\n - type (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) interact\n\\*/\ninteract.on = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.on(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.on(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n // if it is an InteractEvent type, add listener to globalEvents\n if (utils.contains(Interactable.eventTypes, type)) {\n // if this type of event was never bound\n if (!globalEvents[type]) {\n globalEvents[type] = [listener];\n }\n else {\n globalEvents[type].push(listener);\n }\n }\n // If non InteractEvent type, addEventListener to document\n else {\n events.add(scope.document, type, listener, { options });\n }\n\n return interact;\n};\n\n/*\\\n * interact.off\n [ method ]\n *\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n - type (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) interact\n \\*/\ninteract.off = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.off(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.off(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n if (!utils.contains(Interactable.eventTypes, type)) {\n events.remove(scope.document, type, listener, options);\n }\n else {\n let index;\n\n if (type in globalEvents\n && (index = utils.indexOf(globalEvents[type], listener)) !== -1) {\n globalEvents[type].splice(index, 1);\n }\n }\n\n return interact;\n};\n\n/*\\\n * interact.debug\n [ method ]\n *\n * Returns an object which exposes internal data\n = (object) An object with properties that outline the current state and expose internal functions and variables\n\\*/\ninteract.debug = function () {\n return scope;\n};\n\n// expose the functions used to calculate multi-touch properties\ninteract.getPointerAverage = utils.pointerAverage;\ninteract.getTouchBBox = utils.touchBBox;\ninteract.getTouchDistance = utils.touchDistance;\ninteract.getTouchAngle = utils.touchAngle;\n\ninteract.getElementRect = utils.getElementRect;\ninteract.getElementClientRect = utils.getElementClientRect;\ninteract.matchesSelector = utils.matchesSelector;\ninteract.closest = utils.closest;\n\n/*\\\n * interact.supportsTouch\n [ method ]\n *\n = (boolean) Whether or not the browser supports touch input\n\\*/\ninteract.supportsTouch = function () {\n return browser.supportsTouch;\n};\n\n/*\\\n * interact.supportsPointerEvent\n [ method ]\n *\n = (boolean) Whether or not the browser supports PointerEvents\n\\*/\ninteract.supportsPointerEvent = function () {\n return browser.supportsPointerEvent;\n};\n\n/*\\\n * interact.stop\n [ method ]\n *\n * Cancels all interactions (end events are not fired)\n *\n - event (Event) An event on which to call preventDefault()\n = (object) interact\n\\*/\ninteract.stop = function (event) {\n for (let i = scope.interactions.length - 1; i >= 0; i--) {\n scope.interactions[i].stop(event);\n }\n\n return interact;\n};\n\n/*\\\n * interact.pointerMoveTolerance\n [ method ]\n * Returns or sets the distance the pointer must be moved before an action\n * sequence occurs. This also affects tolerance for tap events.\n *\n - newValue (number) #optional The movement from the start position must be greater than this value\n = (number | Interactable) The current setting or interact\n\\*/\ninteract.pointerMoveTolerance = function (newValue) {\n if (utils.is.number(newValue)) {\n Interaction.pointerMoveTolerance = newValue;\n\n return this;\n }\n\n return Interaction.pointerMoveTolerance;\n};\n\ninteract.addDocument = scope.addDocument;\ninteract.removeDocument = scope.removeDocument;\n\nscope.interact = interact;\n\nmodule.exports = interact;\n","const Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\nconst scope = require('./scope');\nconst is = require('./utils/is');\nconst events = require('./utils/events');\n\nconst { nodeContains, matchesSelector } = require('./utils/domUtils');\n\n/*\\\n * Interactable.preventDefault\n [ method ]\n *\n * Returns or sets whether to prevent the browser's default behaviour\n * in response to pointer events. Can be set to:\n * - `'always'` to always prevent\n * - `'never'` to never prevent\n * - `'auto'` to let interact.js try to determine what would be best\n *\n - newValue (string) #optional `true`, `false` or `'auto'`\n = (string | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.preventDefault = function (newValue) {\n if (/^(always|never|auto)$/.test(newValue)) {\n this.options.preventDefault = newValue;\n return this;\n }\n\n if (is.bool(newValue)) {\n this.options.preventDefault = newValue? 'always' : 'never';\n return this;\n }\n\n return this.options.preventDefault;\n};\n\nInteractable.prototype.checkAndPreventDefault = function (event) {\n const setting = this.options.preventDefault;\n\n if (setting === 'never') { return; }\n\n if (setting === 'always') {\n event.preventDefault();\n return;\n }\n\n // setting === 'auto'\n\n // don't preventDefault if the browser supports passiveEvents\n // CSS touch-action and user-selecct should be used instead\n if (events.supportsOptions) {\n return;\n }\n\n // don't preventDefault of pointerdown events\n if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) {\n return;\n }\n\n // don't preventDefault on editable elements\n if (is.element(event.target)\n && matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) {\n return;\n }\n\n event.preventDefault();\n};\n\nfunction onInteractionEvent ({ interaction, event }) {\n if (interaction.target) {\n interaction.target.checkAndPreventDefault(event);\n }\n}\n\nfor (const eventSignal of ['down', 'move', 'up', 'cancel']) {\n Interaction.signals.on(eventSignal, onInteractionEvent);\n}\n\n// prevent native HTML5 drag on interact.js target elements\nInteraction.docEvents.dragstart = function preventNativeDrag (event) {\n for (const interaction of scope.interactions) {\n\n if (interaction.element\n && (interaction.element === event.target\n || nodeContains(interaction.element, event.target))) {\n\n interaction.target.checkAndPreventDefault(event);\n return;\n }\n }\n};\n","const scope = require('./scope');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst iFinder = require('./utils/interactionFinder');\nconst pointerEvents = require('./pointerEvents/base');\n\nconst { window } = require('./utils/window');\n\nconst toString = Object.prototype.toString;\n\nif (!window.Array.isArray) {\n window.Array.isArray = function (obj) {\n return toString.call(obj) === '[object Array]';\n };\n}\n\nif (!String.prototype.trim) {\n String.prototype.trim = function () {\n return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n };\n}\n\n// http://www.quirksmode.org/dom/events/click.html\n// >Events leading to dblclick\n//\n// IE8 doesn't fire down event before dblclick.\n// This workaround tries to fire a tap and doubletap after dblclick\nfunction onIE8Dblclick (event) {\n const eventTarget = event.target;\n const interaction = iFinder.search(event, event.type, eventTarget);\n\n if (!interaction) { return; }\n\n if (interaction.prevTap\n && event.clientX === interaction.prevTap.clientX\n && event.clientY === interaction.prevTap.clientY\n && eventTarget === interaction.prevTap.target) {\n\n interaction.downTargets[0] = eventTarget;\n interaction.downTimes [0] = new Date().getTime();\n\n pointerEvents.fire({\n interaction,\n event,\n eventTarget,\n pointer: event,\n type: 'tap',\n });\n }\n}\n\nif (browser.isIE8) {\n const selectFix = function (event) {\n for (const interaction of scope.interactions) {\n if (interaction.interacting()) {\n interaction.target.checkAndPreventDefault(event);\n }\n }\n };\n\n const onDocIE8 = function onDocIE8 ({ doc, win }, signalName) {\n const eventMethod = signalName.indexOf('listen') === 0\n ? events.add : events.remove;\n\n // For IE's lack of Event#preventDefault\n eventMethod(doc, 'selectstart', selectFix);\n\n if (pointerEvents) {\n eventMethod(doc, 'dblclick', onIE8Dblclick);\n }\n };\n\n scope.signals.on('add-document' , onDocIE8);\n scope.signals.on('remove-document', onDocIE8);\n}\n\nmodule.exports = null;\n","const InteractEvent = require('../InteractEvent');\nconst Interaction = require('../Interaction');\nconst extend = require('../utils/extend');\n\nconst modifiers = {\n names: [],\n\n setOffsets: function (arg) {\n const { interaction, pageCoords: page } = arg;\n const { target, element, startOffset } = interaction;\n const rect = target.getRect(element);\n\n if (rect) {\n startOffset.left = page.x - rect.left;\n startOffset.top = page.y - rect.top;\n\n startOffset.right = rect.right - page.x;\n startOffset.bottom = rect.bottom - page.y;\n\n if (!('width' in rect)) { rect.width = rect.right - rect.left; }\n if (!('height' in rect)) { rect.height = rect.bottom - rect.top ; }\n }\n else {\n startOffset.left = startOffset.top = startOffset.right = startOffset.bottom = 0;\n }\n\n arg.rect = rect;\n arg.interactable = target;\n arg.element = element;\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n\n arg.options = target.options[interaction.prepared.name][modifierName];\n\n if (!arg.options) {\n continue;\n }\n\n interaction.modifierOffsets[modifierName] = modifiers[modifierName].setOffset(arg);\n }\n },\n\n setAll: function (arg) {\n const { interaction, statuses, preEnd, requireEndOnly } = arg;\n const coords = extend({}, arg.pageCoords);\n const result = {\n dx: 0,\n dy: 0,\n changed: false,\n locked: false,\n shouldMove: true,\n };\n\n for (const modifierName of modifiers.names) {\n const modifier = modifiers[modifierName];\n const options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!shouldDo(options, preEnd, requireEndOnly)) { continue; }\n\n arg.status = arg.status = statuses[modifierName];\n arg.options = options;\n arg.offset = arg.interaction.modifierOffsets[modifierName];\n\n modifier.set(arg);\n\n if (arg.status.locked) {\n coords.x += arg.status.dx;\n coords.y += arg.status.dy;\n\n result.dx += arg.status.dx;\n result.dy += arg.status.dy;\n\n result.locked = true;\n }\n }\n\n // a move should be fired if:\n // - there are no modifiers enabled,\n // - no modifiers are \"locked\" i.e. have changed the pointer's coordinates, or\n // - the locked coords have changed since the last pointer move\n result.shouldMove = !arg.status || !result.locked || arg.status.changed;\n\n return result;\n },\n\n resetStatuses: function (statuses) {\n for (const modifierName of modifiers.names) {\n const status = statuses[modifierName] || {};\n\n status.dx = status.dy = 0;\n status.modifiedX = status.modifiedY = NaN;\n status.locked = false;\n status.changed = true;\n\n statuses[modifierName] = status;\n }\n\n return statuses;\n },\n\n start: function ({ interaction }, signalName) {\n const arg = {\n interaction,\n pageCoords: (signalName === 'action-resume' ?\n interaction.curCoords : interaction.startCoords).page,\n startOffset: interaction.startOffset,\n statuses: interaction.modifierStatuses,\n preEnd: false,\n requireEndOnly: false,\n };\n\n modifiers.setOffsets(arg);\n modifiers.resetStatuses(arg.statuses);\n\n arg.pageCoords = extend({}, interaction.startCoords.page);\n interaction.modifierResult = modifiers.setAll(arg);\n },\n};\n\nInteraction.signals.on('new', function (interaction) {\n interaction.startOffset = { left: 0, right: 0, top: 0, bottom: 0 };\n interaction.modifierOffsets = {};\n interaction.modifierStatuses = modifiers.resetStatuses({});\n interaction.modifierResult = null;\n});\n\nInteraction.signals.on('action-start' , modifiers.start);\nInteraction.signals.on('action-resume', modifiers.start);\n\nInteraction.signals.on('before-action-move', function ({ interaction, preEnd, interactingBeforeMove }) {\n const modifierResult = modifiers.setAll({\n interaction,\n preEnd,\n pageCoords: interaction.curCoords.page,\n statuses: interaction.modifierStatuses,\n requireEndOnly: false,\n });\n\n // don't fire an action move if a modifier would keep the event in the same\n // cordinates as before\n if (!modifierResult.shouldMove && interactingBeforeMove) {\n interaction._dontFireMove = true;\n }\n\n interaction.modifierResult = modifierResult;\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n for (let i = 0; i < modifiers.names.length; i++) {\n const options = interaction.target.options[interaction.prepared.name][modifiers.names[i]];\n\n // if the endOnly option is true for any modifier\n if (shouldDo(options, true, true)) {\n // fire a move event at the modified coordinates\n interaction.doMove({ event, preEnd: true });\n break;\n }\n }\n});\n\nInteractEvent.signals.on('set-xy', function (arg) {\n const { iEvent, interaction } = arg;\n const modifierArg = extend({}, arg);\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n modifierArg.options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!modifierArg.options) {\n continue;\n }\n\n const modifier = modifiers[modifierName];\n\n modifierArg.status = interaction.modifierStatuses[modifierName];\n\n iEvent[modifierName] = modifier.modifyCoords(modifierArg);\n }\n});\n\nfunction shouldDo (options, preEnd, requireEndOnly) {\n return (options && options.enabled\n && (preEnd || !options.endOnly)\n && (!requireEndOnly || options.endOnly));\n}\n\nmodule.exports = modifiers;\n","const modifiers = require('./index');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst restrict = {\n defaults: {\n enabled : false,\n endOnly : false,\n restriction: null,\n elementRect: null,\n },\n\n setOffset: function ({ rect, startOffset, options }) {\n const elementRect = options && options.elementRect;\n const offset = {};\n\n if (rect && elementRect) {\n offset.left = startOffset.left - (rect.width * elementRect.left);\n offset.top = startOffset.top - (rect.height * elementRect.top);\n\n offset.right = startOffset.right - (rect.width * (1 - elementRect.right));\n offset.bottom = startOffset.bottom - (rect.height * (1 - elementRect.bottom));\n }\n else {\n offset.left = offset.top = offset.right = offset.bottom = 0;\n }\n\n return offset;\n },\n\n set: function ({ pageCoords, interaction, status, options }) {\n if (!options) { return status; }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n\n const restriction = getRestrictionRect(options.restriction, interaction, page);\n\n if (!restriction) { return status; }\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n const rect = restriction;\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n const offset = interaction.modifierOffsets.restrict;\n\n // object is assumed to have\n // x, y, width, height or\n // left, top, right, bottom\n if ('x' in restriction && 'y' in restriction) {\n modifiedX = Math.max(Math.min(rect.x + rect.width - offset.right , page.x), rect.x + offset.left);\n modifiedY = Math.max(Math.min(rect.y + rect.height - offset.bottom, page.y), rect.y + offset.top );\n }\n else {\n modifiedX = Math.max(Math.min(rect.right - offset.right , page.x), rect.left + offset.left);\n modifiedY = Math.max(Math.min(rect.bottom - offset.bottom, page.y), rect.top + offset.top );\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const elementRect = options && options.elementRect;\n\n if (options && options.enabled\n && !(phase === 'start' && elementRect && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n getRestrictionRect,\n};\n\nfunction getRestrictionRect (value, interaction, page) {\n if (utils.is.function(value)) {\n return utils.resolveRectLike(value, interaction.target, interaction.element, [page.x, page.y, interaction]);\n } else {\n return utils.resolveRectLike(value, interaction.target, interaction.element);\n }\n}\n\nmodifiers.restrict = restrict;\nmodifiers.names.push('restrict');\n\ndefaultOptions.perAction.restrict = restrict.defaults;\n\nmodule.exports = restrict;\n","// This module adds the options.resize.restrictEdges setting which sets min and\n// max for the top, left, bottom and right edges of the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictEdges: {\n// inner: { top: 200, left: 200, right: 400, bottom: 400 },\n// outer: { top: 0, left: 0, right: 600, bottom: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst { getRestrictionRect } = require('./restrict');\n\nconst noInner = { top: +Infinity, left: +Infinity, bottom: -Infinity, right: -Infinity };\nconst noOuter = { top: -Infinity, left: -Infinity, bottom: +Infinity, right: +Infinity };\n\nconst restrictEdges = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n offset: null,\n },\n\n setOffset: function ({ interaction, startOffset, options }) {\n if (!options) {\n return utils.extend({}, startOffset);\n }\n\n const offset = getRestrictionRect(options.offset, interaction, interaction.startCoords.page);\n\n if (offset) {\n return {\n top: startOffset.top + offset.y,\n left: startOffset.left + offset.x,\n bottom: startOffset.bottom + offset.y,\n right: startOffset.right + offset.x,\n };\n }\n\n return startOffset;\n },\n\n set: function ({ pageCoords, interaction, status, offset, options }) {\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n const inner = rectUtils.xywhToTlbr(getRestrictionRect(options.inner, interaction, page)) || noInner;\n const outer = rectUtils.xywhToTlbr(getRestrictionRect(options.outer, interaction, page)) || noOuter;\n\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n if (edges.top) {\n modifiedY = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top);\n }\n else if (edges.bottom) {\n modifiedY = Math.max(Math.min(outer.bottom - offset.bottom, page.y), inner.bottom - offset.bottom);\n }\n if (edges.left) {\n modifiedX = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left);\n }\n else if (edges.right) {\n modifiedX = Math.max(Math.min(outer.right - offset.right, page.x), inner.right - offset.right);\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n if (options && options.enabled\n && !(phase === 'start' && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n noInner,\n noOuter,\n getRestrictionRect,\n};\n\nmodifiers.restrictEdges = restrictEdges;\nmodifiers.names.push('restrictEdges');\n\ndefaultOptions.perAction.restrictEdges = restrictEdges.defaults;\nresize.defaults.restrictEdges = restrictEdges.defaults;\n\nmodule.exports = restrictEdges;\n","// This module adds the options.resize.restrictSize setting which sets min and\n// max width and height for the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictSize: {\n// min: { width: -600, height: -600 },\n// max: { width: 600, height: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst restrictEdges = require('./restrictEdges');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst noMin = { width: -Infinity, height: -Infinity };\nconst noMax = { width: +Infinity, height: +Infinity };\n\nconst restrictSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n },\n\n setOffset: function ({ interaction }) {\n return interaction.startOffset;\n },\n\n set: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const rect = rectUtils.xywhToTlbr(interaction.resizeRects.inverted);\n\n const minSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.min, interaction)) || noMin;\n const maxSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.max, interaction)) || noMax;\n\n arg.options = {\n enabled: options.enabled,\n endOnly: options.endOnly,\n inner: utils.extend({}, restrictEdges.noInner),\n outer: utils.extend({}, restrictEdges.noOuter),\n };\n\n if (edges.top) {\n arg.options.inner.top = rect.bottom - minSize.height;\n arg.options.outer.top = rect.bottom - maxSize.height;\n }\n else if (edges.bottom) {\n arg.options.inner.bottom = rect.top + minSize.height;\n arg.options.outer.bottom = rect.top + maxSize.height;\n }\n if (edges.left) {\n arg.options.inner.left = rect.right - minSize.width;\n arg.options.outer.left = rect.right - maxSize.width;\n }\n else if (edges.right) {\n arg.options.inner.right = rect.left + minSize.width;\n arg.options.outer.right = rect.left + maxSize.width;\n }\n\n restrictEdges.set(arg);\n },\n\n modifyCoords: restrictEdges.modifyCoords,\n};\n\nmodifiers.restrictSize = restrictSize;\nmodifiers.names.push('restrictSize');\n\ndefaultOptions.perAction.restrictSize = restrictSize.defaults;\nresize.defaults.restrictSize = restrictSize.defaults;\n\nmodule.exports = restrictSize;\n","const modifiers = require('./index');\nconst interact = require('../interact');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst snap = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n\n relativePoints: null,\n },\n\n setOffset: function ({ interaction, interactable, element, rect, startOffset, options }) {\n const offsets = [];\n const optionsOrigin = utils.rectToXY(utils.resolveRectLike(options.origin));\n const origin = optionsOrigin || utils.getOriginXY(interactable, element, interaction.prepared.name);\n options = options || interactable.options[interaction.prepared.name].snap || {};\n\n let snapOffset;\n\n if (options.offset === 'startCoords') {\n snapOffset = {\n x: interaction.startCoords.page.x - origin.x,\n y: interaction.startCoords.page.y - origin.y,\n };\n }\n else {\n const offsetRect = utils.resolveRectLike(options.offset, interactable, element, [interaction]);\n\n snapOffset = utils.rectToXY(offsetRect) || { x: 0, y: 0 };\n }\n\n if (rect && options.relativePoints && options.relativePoints.length) {\n for (const { x: relativeX, y: relativeY } of options.relativePoints) {\n offsets.push({\n x: startOffset.left - (rect.width * relativeX) + snapOffset.x,\n y: startOffset.top - (rect.height * relativeY) + snapOffset.y,\n });\n }\n }\n else {\n offsets.push(snapOffset);\n }\n\n return offsets;\n },\n\n set: function ({ interaction, pageCoords, status, options, offset: offsets }) {\n const targets = [];\n let target;\n let page;\n let i;\n\n if (status.useStatusXY) {\n page = { x: status.x, y: status.y };\n }\n else {\n const origin = utils.getOriginXY(interaction.target, interaction.element, interaction.prepared.name);\n\n page = utils.extend({}, pageCoords);\n\n page.x -= origin.x;\n page.y -= origin.y;\n }\n\n status.realX = page.x;\n status.realY = page.y;\n\n let len = options.targets? options.targets.length : 0;\n\n for (const { x: offsetX, y: offsetY } of offsets) {\n const relativeX = page.x - offsetX;\n const relativeY = page.y - offsetY;\n\n for (const snapTarget of options.targets) {\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n targets.push({\n x: utils.is.number(target.x) ? (target.x + offsetX) : relativeX,\n y: utils.is.number(target.y) ? (target.y + offsetY) : relativeY,\n\n range: utils.is.number(target.range)? target.range: options.range,\n });\n }\n }\n\n const closest = {\n target: null,\n inRange: false,\n distance: 0,\n range: 0,\n dx: 0,\n dy: 0,\n };\n\n for (i = 0, len = targets.length; i < len; i++) {\n target = targets[i];\n\n const range = target.range;\n const dx = target.x - page.x;\n const dy = target.y - page.y;\n const distance = utils.hypot(dx, dy);\n let inRange = distance <= range;\n\n // Infinite targets count as being out of range\n // compared to non infinite ones that are in range\n if (range === Infinity && closest.inRange && closest.range !== Infinity) {\n inRange = false;\n }\n\n if (!closest.target || (inRange\n // is the closest target in range?\n ? (closest.inRange && range !== Infinity\n // the pointer is relatively deeper in this target\n ? distance / range < closest.distance / closest.range\n // this target has Infinite range and the closest doesn't\n : (range === Infinity && closest.range !== Infinity)\n // OR this target is closer that the previous closest\n || distance < closest.distance)\n // The other is not in range and the pointer is closer to this target\n : (!closest.inRange && distance < closest.distance))) {\n\n closest.target = target;\n closest.distance = distance;\n closest.range = range;\n closest.inRange = inRange;\n closest.dx = dx;\n closest.dy = dy;\n\n status.range = range;\n }\n }\n\n let snapChanged;\n\n if (closest.target) {\n snapChanged = (status.modifiedX !== closest.target.x || status.modifiedY !== closest.target.y);\n\n status.modifiedX = closest.target.x;\n status.modifiedY = closest.target.y;\n }\n else {\n snapChanged = true;\n\n status.modifiedX = NaN;\n status.modifiedY = NaN;\n }\n\n status.dx = closest.dx;\n status.dy = closest.dy;\n\n status.changed = (snapChanged || (closest.inRange && !status.locked));\n status.locked = closest.inRange;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const relativePoints = options && options.relativePoints;\n\n if (options && options.enabled\n && !(phase === 'start' && relativePoints && relativePoints.length)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n }\n\n return {\n range : status.range,\n locked : status.locked,\n x : status.modifiedX,\n y : status.modifiedY,\n realX : status.realX,\n realY : status.realY,\n dx : status.dx,\n dy : status.dy,\n };\n }\n },\n};\n\ninteract.createSnapGrid = function (grid) {\n return function (x, y) {\n const limits = grid.limits || {\n left : -Infinity,\n right : Infinity,\n top : -Infinity,\n bottom: Infinity,\n };\n let offsetX = 0;\n let offsetY = 0;\n\n if (utils.is.object(grid.offset)) {\n offsetX = grid.offset.x;\n offsetY = grid.offset.y;\n }\n\n const gridx = Math.round((x - offsetX) / grid.x);\n const gridy = Math.round((y - offsetY) / grid.y);\n\n const newX = Math.max(limits.left, Math.min(limits.right , gridx * grid.x + offsetX));\n const newY = Math.max(limits.top , Math.min(limits.bottom, gridy * grid.y + offsetY));\n\n return {\n x: newX,\n y: newY,\n range: grid.range,\n };\n };\n};\n\nmodifiers.snap = snap;\nmodifiers.names.push('snap');\n\ndefaultOptions.perAction.snap = snap.defaults;\n\nmodule.exports = snap;\n","// This module allows snapping of the size of targets during resize\n// interactions.\n\nconst modifiers = require('./index');\nconst snap = require('./snap');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\nconst utils = require('../utils/');\n\nconst snapSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n },\n\n setOffset: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.edges;\n\n if (!edges) { return; }\n\n arg.options = {\n relativePoints: [{\n x: edges.left? 0 : 1,\n y: edges.top ? 0 : 1,\n }],\n origin: { x: 0, y: 0 },\n offset: 'self',\n range: options.range,\n };\n\n const offsets = snap.setOffset(arg);\n arg.options = options;\n\n return offsets;\n },\n\n set: function (arg) {\n const { interaction, options, offset, pageCoords } = arg;\n const page = utils.extend({}, pageCoords);\n const relativeX = page.x - offset[0].x;\n const relativeY = page.y - offset[0].y;\n\n arg.options = utils.extend({}, options);\n arg.options.targets = [];\n\n for (const snapTarget of options.targets) {\n let target;\n\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n if ('width' in target && 'height' in target) {\n target.x = target.width;\n target.y = target.height;\n }\n\n arg.options.targets.push(target);\n }\n\n snap.set(arg);\n },\n\n modifyCoords: function (arg) {\n const { options } = arg;\n\n arg.options = utils.extend({}, options);\n arg.options.enabled = options.enabled;\n arg.options.relativePoints = [null];\n\n snap.modifyCoords(arg);\n },\n};\n\nmodifiers.snapSize = snapSize;\nmodifiers.names.push('snapSize');\n\ndefaultOptions.perAction.snapSize = snapSize.defaults;\nresize.defaults.snapSize = snapSize.defaults;\n\nmodule.exports = snapSize;\n","const pointerUtils = require('../utils/pointerUtils');\n\nmodule.exports = class PointerEvent {\n constructor (type, pointer, event, eventTarget, interaction) {\n pointerUtils.pointerExtend(this, event);\n\n if (event !== pointer) {\n pointerUtils.pointerExtend(this, pointer);\n }\n\n this.interaction = interaction;\n\n this.timeStamp = new Date().getTime();\n this.originalEvent = event;\n this.type = type;\n this.pointerId = pointerUtils.getPointerId(pointer);\n this.pointerType = pointerUtils.getPointerType(pointer, interaction);\n this.target = eventTarget;\n this.currentTarget = null;\n\n if (type === 'tap') {\n const pointerIndex = interaction.getPointerIndex(pointer);\n this.dt = this.timeStamp - interaction.downTimes[pointerIndex];\n\n const interval = this.timeStamp - interaction.tapTime;\n\n this.double = !!(interaction.prevTap\n && interaction.prevTap.type !== 'doubletap'\n && interaction.prevTap.target === this.target\n && interval < 500);\n }\n else if (type === 'doubletap') {\n this.dt = pointer.timeStamp - interaction.tapTime;\n }\n }\n\n subtractOrigin ({ x: originX, y: originY }) {\n this.pageX -= originX;\n this.pageY -= originY;\n this.clientX -= originX;\n this.clientY -= originY;\n\n return this;\n }\n\n addOrigin ({ x: originX, y: originY }) {\n this.pageX += originX;\n this.pageY += originY;\n this.clientX += originX;\n this.clientY += originY;\n\n return this;\n }\n\n preventDefault () {\n this.originalEvent.preventDefault();\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n};\n","const PointerEvent = require('./PointerEvent');\nconst Interaction = require('../Interaction');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst defaults = require('../defaultOptions');\nconst signals = require('../utils/Signals').new();\nconst { filter } = require('../utils/arr');\n\nconst simpleSignals = [ 'down', 'up', 'cancel' ];\nconst simpleEvents = [ 'down', 'up', 'cancel' ];\n\nconst pointerEvents = {\n PointerEvent,\n fire,\n collectEventTargets,\n signals,\n defaults: {\n holdDuration: 600,\n ignoreFrom : null,\n allowFrom : null,\n origin : { x: 0, y: 0 },\n },\n types: [\n 'down',\n 'move',\n 'up',\n 'cancel',\n 'tap',\n 'doubletap',\n 'hold',\n ],\n};\n\nfunction fire (arg) {\n const {\n interaction, pointer, event, eventTarget,\n type = arg.pointerEvent.type,\n targets = collectEventTargets(arg),\n pointerEvent = new PointerEvent(type, pointer, event, eventTarget, interaction),\n } = arg;\n\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n targets,\n type,\n pointerEvent,\n };\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n\n for (const prop in target.props || {}) {\n pointerEvent[prop] = target.props[prop];\n }\n\n const origin = utils.getOriginXY(target.eventable, target.element);\n\n pointerEvent.subtractOrigin(origin);\n pointerEvent.eventable = target.eventable;\n pointerEvent.currentTarget = target.element;\n\n target.eventable.fire(pointerEvent);\n\n pointerEvent.addOrigin(origin);\n\n if (pointerEvent.immediatePropagationStopped\n || (pointerEvent.propagationStopped\n && (i + 1) < targets.length && targets[i + 1].element !== pointerEvent.currentTarget)) {\n break;\n }\n }\n\n signals.fire('fired', signalArg);\n\n if (type === 'tap') {\n // if pointerEvent should make a double tap, create and fire a doubletap\n // PointerEvent and use that as the prevTap\n const prevTap = pointerEvent.double\n ? fire({\n interaction, pointer, event, eventTarget,\n type: 'doubletap',\n })\n : pointerEvent;\n\n interaction.prevTap = prevTap;\n interaction.tapTime = prevTap.timeStamp;\n }\n\n return pointerEvent;\n}\n\nfunction collectEventTargets ({ interaction, pointer, event, eventTarget, type }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n // do not fire a tap event if the pointer was moved before being lifted\n if (type === 'tap' && (interaction.pointerWasMoved\n // or if the pointerup target is different to the pointerdown target\n || !(interaction.downTargets[pointerIndex] && interaction.downTargets[pointerIndex] === eventTarget))) {\n return [];\n }\n\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n path,\n targets: [],\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (type === 'hold') {\n signalArg.targets = filter(signalArg.targets, target =>\n target.eventable.options.holdDuration === interaction.holdTimers[pointerIndex].duration);\n }\n\n return signalArg.targets;\n}\n\nInteraction.signals.on('update-pointer-down', function ({ interaction, pointerIndex }) {\n interaction.holdTimers[pointerIndex] = { duration: Infinity, timeout: null };\n});\n\nInteraction.signals.on('remove-pointer', function ({ interaction, pointerIndex }) {\n interaction.holdTimers.splice(pointerIndex, 1);\n});\n\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget, duplicateMove }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n if (!duplicateMove && (!interaction.pointerIsDown || interaction.pointerWasMoved)) {\n if (interaction.pointerIsDown) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n\n fire({\n interaction, pointer, event, eventTarget,\n type: 'move',\n });\n }\n});\n\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget, pointerIndex }) {\n // copy event to be used in timeout for IE8\n const eventCopy = browser.isIE8? utils.extend({}, event) : event;\n\n const timer = interaction.holdTimers[pointerIndex];\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'hold',\n targets: [],\n path,\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (!signalArg.targets.length) { return; }\n\n let minDuration = Infinity;\n\n for (let i = 0; i < signalArg.targets.length; i++) {\n const target = signalArg.targets[i];\n const holdDuration = target.eventable.options.holdDuration;\n\n if (holdDuration < minDuration) {\n minDuration = holdDuration;\n }\n }\n\n timer.duration = minDuration;\n timer.timeout = setTimeout(function () {\n fire({\n interaction, eventCopy, eventTarget,\n pointer: browser.isIE8? eventCopy : pointer,\n type: 'hold',\n });\n }, minDuration);\n});\n\nInteraction.signals.on('up', ({ interaction, pointer, event, eventTarget }) => {\n if (!interaction.pointerWasMoved) {\n fire({ interaction, eventTarget, pointer, event, type: 'tap' });\n }\n});\n\n['up', 'cancel'].forEach(function (signalName) {\n Interaction.signals.on(signalName, function ({ interaction, pointerIndex }) {\n if (interaction.holdTimers[pointerIndex]) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n });\n});\n\nfunction createSignalListener (type) {\n return function ({ interaction, pointer, event, eventTarget }) {\n fire({ interaction, eventTarget, pointer, event, type });\n };\n}\n\nfor (let i = 0; i < simpleSignals.length; i++) {\n Interaction.signals.on(simpleSignals[i], createSignalListener(simpleEvents[i]));\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.prevTap = null; // the most recent tap event on this interaction\n interaction.tapTime = 0; // time of the most recent tap event\n interaction.holdTimers = []; // [{ duration, timeout }]\n});\n\ndefaults.pointerEvents = pointerEvents.defaults;\nmodule.exports = pointerEvents;\n","const pointerEvents = require('./base');\nconst Interaction = require('../Interaction');\n\npointerEvents.signals.on('new', onNew);\npointerEvents.signals.on('fired', onFired);\n\nfor (const signal of ['move', 'up', 'cancel', 'endall']) {\n Interaction.signals.on(signal, endHoldRepeat);\n}\n\nfunction onNew ({ pointerEvent }) {\n if (pointerEvent.type !== 'hold') { return; }\n\n pointerEvent.count = (pointerEvent.count || 0) + 1;\n}\n\nfunction onFired ({ interaction, pointerEvent, eventTarget, targets }) {\n if (pointerEvent.type !== 'hold' || !targets.length) { return; }\n\n // get the repeat interval from the first eventable\n const interval = targets[0].eventable.options.holdRepeatInterval;\n\n // don't repeat if the interval is 0 or less\n if (interval <= 0) { return; }\n\n // set a timeout to fire the holdrepeat event\n interaction.holdIntervalHandle = setTimeout(function () {\n pointerEvents.fire({\n interaction,\n eventTarget,\n type: 'hold',\n pointer: pointerEvent,\n event: pointerEvent,\n });\n }, interval);\n}\n\nfunction endHoldRepeat ({ interaction }) {\n // set the interaction's holdStopTime property\n // to stop further holdRepeat events\n if (interaction.holdIntervalHandle) {\n clearInterval(interaction.holdIntervalHandle);\n interaction.holdIntervalHandle = null;\n }\n}\n\n// don't repeat by default\npointerEvents.defaults.holdRepeatInterval = 0;\npointerEvents.types.push('holdrepeat');\n\nmodule.exports = {\n onNew,\n onFired,\n endHoldRepeat,\n};\n","const pointerEvents = require('./base');\nconst Interactable = require('../Interactable');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\nconst scope = require('../scope');\nconst extend = require('../utils/extend');\nconst { merge } = require('../utils/arr');\n\npointerEvents.signals.on('collect-targets', function ({ targets, element, type, eventTarget }) {\n function collectSelectors (interactable, selector, context) {\n const els = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && is.element(element)\n && domUtils.matchesSelector(element, selector, els)\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n const interactable = scope.interactables.get(element);\n\n if (interactable) {\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n scope.interactables.forEachSelector(collectSelectors, element);\n});\n\nInteractable.signals.on('new', function ({ interactable }) {\n interactable.events.getRect = function (element) {\n return interactable.getRect(element);\n };\n});\n\nInteractable.signals.on('set', function ({ interactable, options }) {\n extend(interactable.events.options, pointerEvents.defaults);\n extend(interactable.events.options, options);\n});\n\nmerge(Interactable.eventTypes, pointerEvents.types);\n\nInteractable.prototype.pointerEvents = function (options) {\n extend(this.events.options, options);\n\n return this;\n};\n\nconst __backCompatOption = Interactable.prototype._backCompatOption;\n\nInteractable.prototype._backCompatOption = function (optionName, newValue) {\n const ret = __backCompatOption.call(this, optionName, newValue);\n\n if (ret === this) {\n this.events.options[optionName] = newValue;\n }\n\n return ret;\n};\n\nInteractable.settingsMethods.push('pointerEvents');\n","const utils = require('./utils');\nconst events = require('./utils/events');\nconst signals = require('./utils/Signals').new();\n\nconst scope = {\n signals,\n events,\n utils,\n\n // main document\n document: require('./utils/domObjects').document,\n // all documents being listened to\n documents: [],\n\n addDocument: function (doc, win) {\n // do nothing if document is already known\n if (utils.contains(scope.documents, doc)) { return false; }\n\n win = win || scope.getWindow(doc);\n\n scope.documents.push(doc);\n events.documents.push(doc);\n\n // don't add an unload event for the main document\n // so that the page may be cached in browser history\n if (doc !== scope.document) {\n events.add(win, 'unload', scope.onWindowUnload);\n }\n\n signals.fire('add-document', { doc, win });\n },\n\n removeDocument: function (doc, win) {\n const index = utils.indexOf(scope.documents, doc);\n\n win = win || scope.getWindow(doc);\n\n events.remove(win, 'unload', scope.onWindowUnload);\n\n scope.documents.splice(index, 1);\n events.documents.splice(index, 1);\n\n signals.fire('remove-document', { win, doc });\n },\n\n onWindowUnload: function () {\n scope.removeDocument(this.document, this);\n },\n};\n\nmodule.exports = scope;\n","const { indexOf } = require('./arr');\n\nclass Signals {\n constructor () {\n this.listeners = {\n // signalName: [listeners],\n };\n }\n\n on (name, listener) {\n if (!this.listeners[name]) {\n this.listeners[name] = [listener];\n return;\n }\n\n this.listeners[name].push(listener);\n }\n\n off (name, listener) {\n if (!this.listeners[name]) { return; }\n\n const index = indexOf(this.listeners[name], listener);\n\n if (index !== -1) {\n this.listeners[name].splice(index, 1);\n }\n }\n\n fire (name, arg) {\n const targetListeners = this.listeners[name];\n\n if (!targetListeners) { return; }\n\n for (let i = 0; i < targetListeners.length; i++) {\n if (targetListeners[i](arg, name) === false) {\n return;\n }\n }\n }\n}\n\nSignals.new = function () {\n return new Signals();\n};\n\nmodule.exports = Signals;\n","function indexOf (array, target) {\n for (let i = 0, len = array.length; i < len; i++) {\n if (array[i] === target) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction contains (array, target) {\n return indexOf(array, target) !== -1;\n}\n\nfunction merge (target, source) {\n for (let i = 0; i < source.length; i++) {\n target.push(source[i]);\n }\n\n return target;\n}\n\nfunction filter (array, test) {\n const result = [];\n\n for (let i = 0; i < array.length; i++) {\n if (test(array[i])) {\n result.push(array[i]);\n }\n }\n\n return result;\n}\n\nmodule.exports = {\n indexOf,\n contains,\n merge,\n filter,\n};\n","const { window } = require('./window');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst Element = domObjects.Element;\nconst navigator = window.navigator;\n\nconst browser = {\n // Does the browser support touch input?\n supportsTouch: !!(('ontouchstart' in window) || is.function(window.DocumentTouch)\n && domObjects.document instanceof window.DocumentTouch),\n\n // Does the browser support PointerEvents\n supportsPointerEvent: !!domObjects.PointerEvent,\n\n isIE8: ('attachEvent' in window) && !('addEventListener' in window),\n\n // Opera Mobile must be handled differently\n isOperaMobile: (navigator.appName === 'Opera'\n && browser.supportsTouch\n && navigator.userAgent.match('Presto')),\n\n // scrolling doesn't change the result of getClientRects on iOS 7\n isIOS7: (/iP(hone|od|ad)/.test(navigator.platform)\n && /OS 7[^\\d]/.test(navigator.appVersion)),\n\n isIe9OrOlder: /MSIE (8|9)/.test(navigator.userAgent),\n\n // prefix matchesSelector\n prefixedMatchesSelector: 'matches' in Element.prototype\n ? 'matches': 'webkitMatchesSelector' in Element.prototype\n ? 'webkitMatchesSelector': 'mozMatchesSelector' in Element.prototype\n ? 'mozMatchesSelector': 'oMatchesSelector' in Element.prototype\n ? 'oMatchesSelector': 'msMatchesSelector',\n\n useMatchesSelectorPolyfill: false,\n\n pEventTypes: (domObjects.PointerEvent\n ? (domObjects.PointerEvent === window.MSPointerEvent\n ? {\n up: 'MSPointerUp',\n down: 'MSPointerDown',\n over: 'mouseover',\n out: 'mouseout',\n move: 'MSPointerMove',\n cancel: 'MSPointerCancel',\n }\n : {\n up: 'pointerup',\n down: 'pointerdown',\n over: 'pointerover',\n out: 'pointerout',\n move: 'pointermove',\n cancel: 'pointercancel',\n })\n : null),\n\n // because Webkit and Opera still use 'mousewheel' event type\n wheelEvent: 'onmousewheel' in domObjects.document? 'mousewheel': 'wheel',\n\n};\n\nbrowser.useMatchesSelectorPolyfill = !is.function(Element.prototype[browser.prefixedMatchesSelector]);\n\nmodule.exports = browser;\n","const domObjects = {};\nconst win = require('./window').window;\n\nfunction blank () {}\n\ndomObjects.document = win.document;\ndomObjects.DocumentFragment = win.DocumentFragment || blank;\ndomObjects.SVGElement = win.SVGElement || blank;\ndomObjects.SVGSVGElement = win.SVGSVGElement || blank;\ndomObjects.SVGElementInstance = win.SVGElementInstance || blank;\ndomObjects.Element = win.Element || blank;\ndomObjects.HTMLElement = win.HTMLElement || domObjects.Element;\n\ndomObjects.Event = win.Event;\ndomObjects.Touch = win.Touch || blank;\ndomObjects.PointerEvent = (win.PointerEvent || win.MSPointerEvent);\n\nmodule.exports = domObjects;\n","const win = require('./window');\nconst browser = require('./browser');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst domUtils = {\n nodeContains: function (parent, child) {\n while (child) {\n if (child === parent) {\n return true;\n }\n\n child = child.parentNode;\n }\n\n return false;\n },\n\n closest: function (element, selector) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) { return element; }\n\n element = domUtils.parentNode(element);\n }\n\n return null;\n },\n\n parentNode: function (node) {\n let parent = node.parentNode;\n\n if (is.docFrag(parent)) {\n // skip past #shado-root fragments\n while ((parent = parent.host) && is.docFrag(parent)) {\n continue;\n }\n\n return parent;\n }\n\n return parent;\n },\n\n // taken from http://tanalin.com/en/blog/2012/12/matches-selector-ie8/ and modified\n matchesSelectorPolyfill: browser.useMatchesSelectorPolyfill\n ? function (element, selector, elems) {\n elems = elems || element.parentNode.querySelectorAll(selector);\n\n for (let i = 0, len = elems.length; i < len; i++) {\n if (elems[i] === element) {\n return true;\n }\n }\n\n return false;\n }\n : null,\n\n matchesSelector: function (element, selector, nodeList) {\n if (browser.useMatchesSelectorPolyfill) {\n return domUtils.matchesSelectorPolyfill(element, selector, nodeList);\n }\n\n // remove /deep/ from selectors if shadowDOM polyfill is used\n if (win.window !== win.realWindow) {\n selector = selector.replace(/\\/deep\\//g, ' ');\n }\n\n return element[browser.prefixedMatchesSelector](selector);\n },\n\n // Test for the element that's \"above\" all other qualifiers\n indexOfDeepestElement: function (elements) {\n let deepestZoneParents = [];\n let dropzoneParents = [];\n let dropzone;\n let deepestZone = elements[0];\n let index = deepestZone? 0: -1;\n let parent;\n let child;\n let i;\n let n;\n\n for (i = 1; i < elements.length; i++) {\n dropzone = elements[i];\n\n // an element might belong to multiple selector dropzones\n if (!dropzone || dropzone === deepestZone) {\n continue;\n }\n\n if (!deepestZone) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n // check if the deepest or current are document.documentElement or document.rootElement\n // - if the current dropzone is, do nothing and continue\n if (dropzone.parentNode === dropzone.ownerDocument) {\n continue;\n }\n // - if deepest is, update with the current dropzone and continue to next\n else if (deepestZone.parentNode === dropzone.ownerDocument) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n if (!deepestZoneParents.length) {\n parent = deepestZone;\n while (parent.parentNode && parent.parentNode !== parent.ownerDocument) {\n deepestZoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n }\n\n // if this element is an svg element and the current deepest is\n // an HTMLElement\n if (deepestZone instanceof domObjects.HTMLElement\n && dropzone instanceof domObjects.SVGElement\n && !(dropzone instanceof domObjects.SVGSVGElement)) {\n\n if (dropzone === deepestZone.parentNode) {\n continue;\n }\n\n parent = dropzone.ownerSVGElement;\n }\n else {\n parent = dropzone;\n }\n\n dropzoneParents = [];\n\n while (parent.parentNode !== parent.ownerDocument) {\n dropzoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n\n n = 0;\n\n // get (position of last common ancestor) + 1\n while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) {\n n++;\n }\n\n const parents = [\n dropzoneParents[n - 1],\n dropzoneParents[n],\n deepestZoneParents[n],\n ];\n\n child = parents[0].lastChild;\n\n while (child) {\n if (child === parents[1]) {\n deepestZone = dropzone;\n index = i;\n deepestZoneParents = [];\n\n break;\n }\n else if (child === parents[2]) {\n break;\n }\n\n child = child.previousSibling;\n }\n }\n\n return index;\n },\n\n matchesUpTo: function (element, selector, limit) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) {\n return true;\n }\n\n element = domUtils.parentNode(element);\n\n if (element === limit) {\n return domUtils.matchesSelector(element, selector);\n }\n }\n\n return false;\n },\n\n getActualElement: function (element) {\n return (element instanceof domObjects.SVGElementInstance\n ? element.correspondingUseElement\n : element);\n },\n\n getScrollXY: function (relevantWindow) {\n relevantWindow = relevantWindow || win.window;\n return {\n x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft,\n y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop,\n };\n },\n\n getElementClientRect: function (element) {\n const clientRect = (element instanceof domObjects.SVGElement\n ? element.getBoundingClientRect()\n : element.getClientRects()[0]);\n\n return clientRect && {\n left : clientRect.left,\n right : clientRect.right,\n top : clientRect.top,\n bottom: clientRect.bottom,\n width : clientRect.width || clientRect.right - clientRect.left,\n height: clientRect.height || clientRect.bottom - clientRect.top,\n };\n },\n\n getElementRect: function (element) {\n const clientRect = domUtils.getElementClientRect(element);\n\n if (!browser.isIOS7 && clientRect) {\n const scroll = domUtils.getScrollXY(win.getWindow(element));\n\n clientRect.left += scroll.x;\n clientRect.right += scroll.x;\n clientRect.top += scroll.y;\n clientRect.bottom += scroll.y;\n }\n\n return clientRect;\n },\n\n getPath: function (element) {\n const path = [];\n\n while (element) {\n path.push(element);\n element = domUtils.parentNode(element);\n }\n\n return path;\n },\n\n trySelector: value => {\n if (!is.string(value)) { return false; }\n\n // an exception will be raised if it is invalid\n domObjects.document.querySelector(value);\n return true;\n },\n};\n\nmodule.exports = domUtils;\n","const is = require('./is');\nconst domUtils = require('./domUtils');\nconst pExtend = require('./pointerExtend');\n\nconst { window, getWindow } = require('./window');\nconst { indexOf, contains } = require('./arr');\n\nconst useAttachEvent = ('attachEvent' in window) && !('addEventListener' in window);\nconst addEvent = useAttachEvent? 'attachEvent': 'addEventListener';\nconst removeEvent = useAttachEvent? 'detachEvent': 'removeEventListener';\nconst on = useAttachEvent? 'on': '';\n\nconst elements = [];\nconst targets = [];\nconst attachedListeners = [];\n\n// {\n// type: {\n// selectors: ['selector', ...],\n// contexts : [document, ...],\n// listeners: [[listener, capture, passive], ...]\n// }\n// }\nconst delegatedEvents = {};\n\nconst documents = [];\n\nconst supportsOptions = !useAttachEvent && (() => {\n let supported = false;\n\n window.document.createElement('div').addEventListener('test', null, {\n get capture () { supported = true; },\n });\n\n return supported;\n})();\n\nfunction add (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n let elementIndex = indexOf(elements, element);\n let target = targets[elementIndex];\n\n if (!target) {\n target = {\n events: {},\n typeCount: 0,\n };\n\n elementIndex = elements.push(element) - 1;\n targets.push(target);\n\n attachedListeners.push(useAttachEvent\n ? {\n supplied: [],\n wrapped : [],\n useCount: [],\n }\n : null);\n }\n\n if (!target.events[type]) {\n target.events[type] = [];\n target.typeCount++;\n }\n\n if (!contains(target.events[type], listener)) {\n let ret;\n\n if (useAttachEvent) {\n const { supplied, wrapped, useCount } = attachedListeners[elementIndex];\n const listenerIndex = indexOf(supplied, listener);\n\n const wrappedListener = wrapped[listenerIndex] || function (event) {\n if (!event.immediatePropagationStopped) {\n event.target = event.srcElement;\n event.currentTarget = element;\n\n event.preventDefault = event.preventDefault || preventDef;\n event.stopPropagation = event.stopPropagation || stopProp;\n event.stopImmediatePropagation = event.stopImmediatePropagation || stopImmProp;\n\n if (/mouse|click/.test(event.type)) {\n event.pageX = event.clientX + getWindow(element).document.documentElement.scrollLeft;\n event.pageY = event.clientY + getWindow(element).document.documentElement.scrollTop;\n }\n\n listener(event);\n }\n };\n\n ret = element[addEvent](on + type, wrappedListener, !!options.capture);\n\n if (listenerIndex === -1) {\n supplied.push(listener);\n wrapped.push(wrappedListener);\n useCount.push(1);\n }\n else {\n useCount[listenerIndex]++;\n }\n }\n else {\n ret = element[addEvent](type, listener, supportsOptions? options : !!options.capture);\n }\n target.events[type].push(listener);\n\n return ret;\n }\n}\n\nfunction remove (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const elementIndex = indexOf(elements, element);\n const target = targets[elementIndex];\n\n if (!target || !target.events) {\n return;\n }\n\n let wrappedListener = listener;\n let listeners;\n let listenerIndex;\n\n if (useAttachEvent) {\n listeners = attachedListeners[elementIndex];\n listenerIndex = indexOf(listeners.supplied, listener);\n wrappedListener = listeners.wrapped[listenerIndex];\n }\n\n if (type === 'all') {\n for (type in target.events) {\n if (target.events.hasOwnProperty(type)) {\n remove(element, type, 'all');\n }\n }\n return;\n }\n\n if (target.events[type]) {\n const len = target.events[type].length;\n\n if (listener === 'all') {\n for (let i = 0; i < len; i++) {\n remove(element, type, target.events[type][i], options);\n }\n return;\n }\n else {\n for (let i = 0; i < len; i++) {\n if (target.events[type][i] === listener) {\n element[removeEvent](on + type, wrappedListener, supportsOptions? options : !!options.capture);\n target.events[type].splice(i, 1);\n\n if (useAttachEvent && listeners) {\n listeners.useCount[listenerIndex]--;\n if (listeners.useCount[listenerIndex] === 0) {\n listeners.supplied.splice(listenerIndex, 1);\n listeners.wrapped.splice(listenerIndex, 1);\n listeners.useCount.splice(listenerIndex, 1);\n }\n }\n\n break;\n }\n }\n }\n\n if (target.events[type] && target.events[type].length === 0) {\n target.events[type] = null;\n target.typeCount--;\n }\n }\n\n if (!target.typeCount) {\n targets.splice(elementIndex, 1);\n elements.splice(elementIndex, 1);\n attachedListeners.splice(elementIndex, 1);\n }\n}\n\nfunction addDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n if (!delegatedEvents[type]) {\n delegatedEvents[type] = {\n selectors: [],\n contexts : [],\n listeners: [],\n };\n\n // add delegate listener functions\n for (let i = 0; i < documents.length; i++) {\n add(documents[i], type, delegateListener);\n add(documents[i], type, delegateUseCapture, true);\n }\n }\n\n const delegated = delegatedEvents[type];\n let index;\n\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n break;\n }\n }\n\n if (index === -1) {\n index = delegated.selectors.length;\n\n delegated.selectors.push(selector);\n delegated.contexts .push(context);\n delegated.listeners.push([]);\n }\n\n // keep listener and capture and passive flags\n delegated.listeners[index].push([listener, !!options.capture, options.passive]);\n}\n\nfunction removeDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const delegated = delegatedEvents[type];\n let matchFound = false;\n let index;\n\n if (!delegated) { return; }\n\n // count from last index of delegated to 0\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n // look for matching selector and context Node\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n\n const listeners = delegated.listeners[index];\n\n // each item of the listeners array is an array: [function, capture, passive]\n for (let i = listeners.length - 1; i >= 0; i--) {\n const [fn, capture, passive] = listeners[i];\n\n // check if the listener functions and capture and passive flags match\n if (fn === listener && capture === !!options.capture && passive === options.passive) {\n // remove the listener from the array of listeners\n listeners.splice(i, 1);\n\n // if all listeners for this interactable have been removed\n // remove the interactable from the delegated arrays\n if (!listeners.length) {\n delegated.selectors.splice(index, 1);\n delegated.contexts .splice(index, 1);\n delegated.listeners.splice(index, 1);\n\n // remove delegate function from context\n remove(context, type, delegateListener);\n remove(context, type, delegateUseCapture, true);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegatedEvents[type] = null;\n }\n }\n\n // only remove one listener\n matchFound = true;\n break;\n }\n }\n\n if (matchFound) { break; }\n }\n }\n}\n\n// bound to the interactable context when a DOM event\n// listener is added to a selector interactable\nfunction delegateListener (event, optionalArg) {\n const options = getOptions(optionalArg);\n const fakeEvent = {};\n const delegated = delegatedEvents[event.type];\n const eventTarget = (domUtils.getActualElement(event.path\n ? event.path[0]\n : event.target));\n let element = eventTarget;\n\n // duplicate the event so that currentTarget can be changed\n pExtend(fakeEvent, event);\n\n fakeEvent.originalEvent = event;\n fakeEvent.preventDefault = preventOriginalDefault;\n\n // climb up document tree looking for selector matches\n while (is.element(element)) {\n for (let i = 0; i < delegated.selectors.length; i++) {\n const selector = delegated.selectors[i];\n const context = delegated.contexts[i];\n\n if (domUtils.matchesSelector(element, selector)\n && domUtils.nodeContains(context, eventTarget)\n && domUtils.nodeContains(context, element)) {\n\n const listeners = delegated.listeners[i];\n\n fakeEvent.currentTarget = element;\n\n for (let j = 0; j < listeners.length; j++) {\n const [fn, capture, passive] = listeners[j];\n\n if (capture === !!options.capture && passive === options.passive) {\n fn(fakeEvent);\n }\n }\n }\n }\n\n element = domUtils.parentNode(element);\n }\n}\n\nfunction delegateUseCapture (event) {\n return delegateListener.call(this, event, true);\n}\n\nfunction preventDef () {\n this.returnValue = false;\n}\n\nfunction preventOriginalDefault () {\n this.originalEvent.preventDefault();\n}\n\nfunction stopProp () {\n this.cancelBubble = true;\n}\n\nfunction stopImmProp () {\n this.cancelBubble = true;\n this.immediatePropagationStopped = true;\n}\n\nfunction getOptions (param) {\n return is.object(param)? param : { capture: param };\n}\n\nmodule.exports = {\n add,\n remove,\n\n addDelegate,\n removeDelegate,\n\n delegateListener,\n delegateUseCapture,\n delegatedEvents,\n documents,\n\n useAttachEvent,\n supportsOptions,\n\n _elements: elements,\n _targets: targets,\n _attachedListeners: attachedListeners,\n};\n","module.exports = function extend (dest, source) {\n for (const prop in source) {\n dest[prop] = source[prop];\n }\n return dest;\n};\n","const {\n resolveRectLike,\n rectToXY,\n} = require('./rect');\n\nmodule.exports = function (target, element, action) {\n const actionOptions = target.options[action];\n const actionOrigin = actionOptions && actionOptions.origin;\n const origin = actionOrigin || target.options.origin;\n\n const originRect = resolveRectLike(origin, target, element, [target && element]);\n\n return rectToXY(originRect) || { x: 0, y: 0 };\n};\n","module.exports = (x, y) => Math.sqrt(x * x + y * y);\n","const extend = require('./extend');\nconst win = require('./window');\n\nconst utils = {\n warnOnce: function (method, message) {\n let warned = false;\n\n return function () {\n if (!warned) {\n win.window.console.warn(message);\n warned = true;\n }\n\n return method.apply(this, arguments);\n };\n },\n\n // http://stackoverflow.com/a/5634528/2280888\n _getQBezierValue: function (t, p1, p2, p3) {\n const iT = 1 - t;\n return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3;\n },\n\n getQuadraticCurvePoint: function (startX, startY, cpX, cpY, endX, endY, position) {\n return {\n x: utils._getQBezierValue(position, startX, cpX, endX),\n y: utils._getQBezierValue(position, startY, cpY, endY),\n };\n },\n\n // http://gizma.com/easing/\n easeOutQuad: function (t, b, c, d) {\n t /= d;\n return -c * t*(t-2) + b;\n },\n\n copyAction: function (dest, src) {\n dest.name = src.name;\n dest.axis = src.axis;\n dest.edges = src.edges;\n\n return dest;\n },\n\n is : require('./is'),\n extend : extend,\n hypot : require('./hypot'),\n getOriginXY: require('./getOriginXY'),\n};\n\nextend(utils, require('./arr'));\nextend(utils, require('./domUtils'));\nextend(utils, require('./pointerUtils'));\nextend(utils, require('./rect'));\n\nmodule.exports = utils;\n","const scope = require('../scope');\nconst utils = require('./index');\nconst browser = require('./browser');\n\nconst finder = {\n methodOrder: [ 'simulationResume', 'mouse', 'hasPointer', 'idle' ],\n\n search: function (pointer, eventType, eventTarget) {\n const mouseEvent = (/mouse/i.test(pointer.pointerType || eventType)\n // MSPointerEvent.MSPOINTER_TYPE_MOUSE\n || pointer.pointerType === 4);\n const pointerId = utils.getPointerId(pointer);\n const details = { pointer, pointerId, mouseEvent, eventType, eventTarget };\n\n for (const method of finder.methodOrder) {\n const interaction = finder[method](details);\n\n if (interaction) {\n return interaction;\n }\n }\n },\n\n // try to resume simulation with a new pointer\n simulationResume: function ({ mouseEvent, eventType, eventTarget }) {\n if (!/down|start/i.test(eventType)) {\n return null;\n }\n\n for (const interaction of scope.interactions) {\n let element = eventTarget;\n\n if (interaction.simulation && interaction.simulation.allowResume\n && (interaction.mouse === mouseEvent)) {\n while (element) {\n // if the element is the interaction element\n if (element === interaction.element) {\n return interaction;\n }\n element = utils.parentNode(element);\n }\n }\n }\n\n return null;\n },\n\n // if it's a mouse interaction\n mouse: function ({ pointerId, mouseEvent, eventType }) {\n if (!mouseEvent && (browser.supportsTouch || browser.supportsPointerEvent)) {\n return null;\n }\n\n let firstNonActive;\n\n for (const interaction of scope.interactions) {\n if (interaction.mouse) {\n // if it's a down event, skip interactions with running simulations\n if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; }\n\n // if the interaction is active, return it immediately\n if (interaction.interacting()) {\n return interaction;\n }\n // otherwise save it and look for another active interaction\n else if (!firstNonActive) {\n firstNonActive = interaction;\n }\n }\n }\n\n // if no active mouse interaction was found use the first inactive mouse\n // interaction\n if (firstNonActive) {\n return firstNonActive;\n }\n\n // Find any interaction specifically for mouse.\n // ignore the interaction if the eventType is a mousedown, and a simulation\n // is active\n for (const interaction of scope.interactions) {\n if (interaction.mouse && !(/down/.test(eventType) && interaction.simulation)) {\n return interaction;\n }\n }\n\n return null;\n },\n\n // get interaction that has this pointer\n hasPointer: function ({ pointerId }) {\n for (const interaction of scope.interactions) {\n if (utils.contains(interaction.pointerIds, pointerId)) {\n return interaction;\n }\n }\n },\n\n // get first idle interaction\n idle: function ({ mouseEvent }) {\n for (const interaction of scope.interactions) {\n // if there's already a pointer held down\n if (interaction.pointerIds.length === 1) {\n const target = interaction.target;\n // don't add this pointer if there is a target interactable and it\n // isn't gesturable\n if (target && !target.options.gesture.enabled) {\n continue;\n }\n }\n // maximum of 2 pointers per interaction\n else if (interaction.pointerIds.length >= 2) {\n continue;\n }\n\n if (!interaction.interacting() && (mouseEvent === interaction.mouse)) {\n return interaction;\n }\n }\n\n return null;\n },\n};\n\nmodule.exports = finder;\n","const win = require('./window');\nconst isWindow = require('./isWindow');\n\nconst is = {\n array : () => {},\n\n window : thing => thing === win.window || isWindow(thing),\n\n docFrag : thing => is.object(thing) && thing.nodeType === 11,\n\n object : thing => !!thing && (typeof thing === 'object'),\n\n function: thing => typeof thing === 'function',\n\n number : thing => typeof thing === 'number' ,\n\n bool : thing => typeof thing === 'boolean' ,\n\n string : thing => typeof thing === 'string' ,\n\n element: thing => {\n if (!thing || (typeof thing !== 'object')) { return false; }\n\n const _window = win.getWindow(thing) || win.window;\n\n return (/object|function/.test(typeof _window.Element)\n ? thing instanceof _window.Element //DOM2\n : thing.nodeType === 1 && typeof thing.nodeName === 'string');\n },\n};\n\nis.array = thing => (is.object(thing)\n && (typeof thing.length !== 'undefined')\n && is.function(thing.splice));\n\nmodule.exports = is;\n","module.exports = (thing) => !!(thing && thing.Window) && (thing instanceof thing.Window);\n","function pointerExtend (dest, source) {\n for (const prop in source) {\n const prefixedPropREs = module.exports.prefixedPropREs;\n let deprecated = false;\n\n // skip deprecated prefixed properties\n for (const vendor in prefixedPropREs) {\n if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) {\n deprecated = true;\n break;\n }\n }\n\n if (!deprecated && typeof source[prop] !== 'function') {\n dest[prop] = source[prop];\n }\n }\n return dest;\n}\n\npointerExtend.prefixedPropREs = {\n webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/,\n};\n\nmodule.exports = pointerExtend;\n","const hypot = require('./hypot');\nconst browser = require('./browser');\nconst dom = require('./domObjects');\nconst domUtils = require('./domUtils');\nconst is = require('./is');\nconst pointerExtend = require('./pointerExtend');\n\nconst pointerUtils = {\n copyCoords: function (dest, src) {\n dest.page = dest.page || {};\n dest.page.x = src.page.x;\n dest.page.y = src.page.y;\n\n dest.client = dest.client || {};\n dest.client.x = src.client.x;\n dest.client.y = src.client.y;\n\n dest.timeStamp = src.timeStamp;\n },\n\n setCoordDeltas: function (targetObj, prev, cur) {\n targetObj.page.x = cur.page.x - prev.page.x;\n targetObj.page.y = cur.page.y - prev.page.y;\n targetObj.client.x = cur.client.x - prev.client.x;\n targetObj.client.y = cur.client.y - prev.client.y;\n targetObj.timeStamp = cur.timeStamp - prev.timeStamp;\n\n // set pointer velocity\n const dt = Math.max(targetObj.timeStamp / 1000, 0.001);\n\n targetObj.page.speed = hypot(targetObj.page.x, targetObj.page.y) / dt;\n targetObj.page.vx = targetObj.page.x / dt;\n targetObj.page.vy = targetObj.page.y / dt;\n\n targetObj.client.speed = hypot(targetObj.client.x, targetObj.page.y) / dt;\n targetObj.client.vx = targetObj.client.x / dt;\n targetObj.client.vy = targetObj.client.y / dt;\n },\n\n isNativePointer: function (pointer) {\n return (pointer instanceof dom.Event || pointer instanceof dom.Touch);\n },\n\n // Get specified X/Y coords for mouse or event.touches[0]\n getXY: function (type, pointer, xy) {\n xy = xy || {};\n type = type || 'page';\n\n xy.x = pointer[type + 'X'];\n xy.y = pointer[type + 'Y'];\n\n return xy;\n },\n\n getPageXY: function (pointer, page) {\n page = page || {};\n\n // Opera Mobile handles the viewport and scrolling oddly\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n pointerUtils.getXY('screen', pointer, page);\n\n page.x += window.scrollX;\n page.y += window.scrollY;\n }\n else {\n pointerUtils.getXY('page', pointer, page);\n }\n\n return page;\n },\n\n getClientXY: function (pointer, client) {\n client = client || {};\n\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n // Opera Mobile handles the viewport and scrolling oddly\n pointerUtils.getXY('screen', pointer, client);\n }\n else {\n pointerUtils.getXY('client', pointer, client);\n }\n\n return client;\n },\n\n getPointerId: function (pointer) {\n return is.number(pointer.pointerId)? pointer.pointerId : pointer.identifier;\n },\n\n setCoords: function (targetObj, pointers, timeStamp) {\n const pointer = (pointers.length > 1\n ? pointerUtils.pointerAverage(pointers)\n : pointers[0]);\n\n const tmpXY = {};\n\n pointerUtils.getPageXY(pointer, tmpXY);\n targetObj.page.x = tmpXY.x;\n targetObj.page.y = tmpXY.y;\n\n pointerUtils.getClientXY(pointer, tmpXY);\n targetObj.client.x = tmpXY.x;\n targetObj.client.y = tmpXY.y;\n\n targetObj.timeStamp = is.number(timeStamp) ? timeStamp :new Date().getTime();\n },\n\n pointerExtend: pointerExtend,\n\n getTouchPair: function (event) {\n const touches = [];\n\n // array of touches is supplied\n if (is.array(event)) {\n touches[0] = event[0];\n touches[1] = event[1];\n }\n // an event\n else {\n if (event.type === 'touchend') {\n if (event.touches.length === 1) {\n touches[0] = event.touches[0];\n touches[1] = event.changedTouches[0];\n }\n else if (event.touches.length === 0) {\n touches[0] = event.changedTouches[0];\n touches[1] = event.changedTouches[1];\n }\n }\n else {\n touches[0] = event.touches[0];\n touches[1] = event.touches[1];\n }\n }\n\n return touches;\n },\n\n pointerAverage: function (pointers) {\n const average = {\n pageX : 0,\n pageY : 0,\n clientX: 0,\n clientY: 0,\n screenX: 0,\n screenY: 0,\n };\n\n for (const pointer of pointers) {\n for (const prop in average) {\n average[prop] += pointer[prop];\n }\n }\n for (const prop in average) {\n average[prop] /= pointers.length;\n }\n\n return average;\n },\n\n touchBBox: function (event) {\n if (!event.length && !(event.touches && event.touches.length > 1)) {\n return;\n }\n\n const touches = pointerUtils.getTouchPair(event);\n const minX = Math.min(touches[0].pageX, touches[1].pageX);\n const minY = Math.min(touches[0].pageY, touches[1].pageY);\n const maxX = Math.max(touches[0].pageX, touches[1].pageX);\n const maxY = Math.max(touches[0].pageY, touches[1].pageY);\n\n return {\n x: minX,\n y: minY,\n left: minX,\n top: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n },\n\n touchDistance: function (event, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n\n\n const dx = touches[0][sourceX] - touches[1][sourceX];\n const dy = touches[0][sourceY] - touches[1][sourceY];\n\n return hypot(dx, dy);\n },\n\n touchAngle: function (event, prevAngle, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n const dx = touches[1][sourceX] - touches[0][sourceX];\n const dy = touches[1][sourceY] - touches[0][sourceY];\n const angle = 180 * Math.atan2(dy , dx) / Math.PI;\n\n return angle;\n },\n\n getPointerType: function (pointer, interaction) {\n // if the PointerEvent API isn't available, then the pointer must be ither\n // a MouseEvent or TouchEvent\n if (interaction.mouse) { return 'mouse'; }\n if (!browser.supportsPointerEvent) { return 'touch'; }\n\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : [undefined, undefined,'touch', 'pen', 'mouse'][pointer.pointerType];\n },\n\n // [ event.target, event.currentTarget ]\n getEventTargets: function (event) {\n return [\n domUtils.getActualElement(event.path ? event.path[0] : event.target),\n domUtils.getActualElement(event.currentTarget),\n ];\n },\n};\n\nmodule.exports = pointerUtils;\n","const { window } = require('./window');\n\nconst vendors = ['ms', 'moz', 'webkit', 'o'];\nlet lastTime = 0;\nlet request;\nlet cancel;\n\nfor (let x = 0; x < vendors.length && !window.requestAnimationFrame; x++) {\n request = window[vendors[x] + 'RequestAnimationFrame'];\n cancel = window[vendors[x] +'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n}\n\nif (!request) {\n request = function (callback) {\n const currTime = new Date().getTime();\n const timeToCall = Math.max(0, 16 - (currTime - lastTime));\n const id = setTimeout(function () { callback(currTime + timeToCall); },\n timeToCall);\n\n lastTime = currTime + timeToCall;\n return id;\n };\n}\n\nif (!cancel) {\n cancel = function (id) {\n clearTimeout(id);\n };\n}\n\nmodule.exports = {\n request,\n cancel,\n};\n","const extend = require('./extend');\nconst is = require('./is');\nconst {\n closest,\n parentNode,\n getElementRect,\n} = require('./domUtils');\n\nconst rectUtils = {\n getStringOptionResult: function (value, interactable, element) {\n if (!is.string(value)) {\n return null;\n }\n\n if (value === 'parent') {\n value = parentNode(element);\n }\n else if (value === 'self') {\n value = interactable.getRect(element);\n }\n else {\n value = closest(element, value);\n }\n\n return value;\n },\n\n resolveRectLike: function (value, interactable, element, functionArgs) {\n value = rectUtils.getStringOptionResult(value, interactable, element) || value;\n\n if (is.function(value)) {\n value = value.apply(null, functionArgs);\n }\n\n if (is.element(value)) {\n value = getElementRect(value);\n }\n\n return value;\n },\n\n rectToXY: function (rect) {\n return rect && {\n x: 'x' in rect ? rect.x : rect.left,\n y: 'y' in rect ? rect.y : rect.top,\n };\n },\n\n xywhToTlbr: function (rect) {\n if (rect && !('left' in rect && 'top' in rect)) {\n rect = extend({}, rect);\n\n rect.left = rect.x || 0;\n rect.top = rect.y || 0;\n rect.right = rect.right || (rect.left + rect.width);\n rect.bottom = rect.bottom || (rect.top + rect.height);\n }\n\n return rect;\n },\n\n tlbrToXywh: function (rect) {\n if (rect && !('x' in rect && 'y' in rect)) {\n rect = extend({}, rect);\n\n rect.x = rect.left || 0;\n rect.top = rect.top || 0;\n rect.width = rect.width || (rect.right - rect.x);\n rect.height = rect.height || (rect.bottom - rect.y);\n }\n\n return rect;\n },\n};\n\nmodule.exports = rectUtils;\n","const win = module.exports;\nconst isWindow = require('./isWindow');\n\nfunction init (window) {\n // get wrapped window if using Shadow DOM polyfill\n\n win.realWindow = window;\n\n // create a TextNode\n const el = window.document.createTextNode('');\n\n // check if it's wrapped by a polyfill\n if (el.ownerDocument !== window.document\n && typeof window.wrap === 'function'\n && window.wrap(el) === el) {\n // use wrapped window\n window = window.wrap(window);\n }\n\n win.window = window;\n}\n\nif (typeof window === 'undefined') {\n win.window = undefined;\n win.realWindow = undefined;\n}\nelse {\n init(window);\n}\n\nwin.getWindow = function getWindow (node) {\n if (isWindow(node)) {\n return node;\n }\n\n const rootNode = (node.ownerDocument || node);\n\n return rootNode.defaultView || rootNode.parentWindow || win.window;\n};\n\nwin.init = init;\n"]} \ No newline at end of file +{"version":3,"sources":["src/header.js","node_modules/browser-pack/_prelude.js","index.js","src/Eventable.js","src/InteractEvent.js","src/Interactable.js","src/Interaction.js","src/actions/base.js","src/actions/drag.js","src/actions/drop.js","src/actions/gesture.js","src/actions/resize.js","src/autoScroll.js","src/autoStart/InteractableMethods.js","src/autoStart/base.js","src/autoStart/delay.js","src/autoStart/drag.js","src/autoStart/gesture.js","src/autoStart/resize.js","src/defaultOptions.js","src/index.js","src/inertia.js","src/interact.js","src/interactablePreventDefault.js","src/legacyBrowsers.js","src/modifiers/index.js","src/modifiers/restrict.js","src/modifiers/restrictEdges.js","src/modifiers/restrictSize.js","src/modifiers/snap.js","src/modifiers/snapSize.js","src/pointerEvents/PointerEvent.js","src/pointerEvents/base.js","src/pointerEvents/holdRepeat.js","src/pointerEvents/interactableTargets.js","src/scope.js","src/utils/Signals.js","src/utils/arr.js","src/utils/browser.js","src/utils/domObjects.js","src/utils/domUtils.js","src/utils/events.js","src/utils/extend.js","src/utils/getOriginXY.js","src/utils/hypot.js","src/utils/index.js","src/utils/interactionFinder.js","src/utils/is.js","src/utils/isWindow.js","src/utils/pointerExtend.js","src/utils/pointerUtils.js","src/utils/raf.js","src/utils/rect.js","src/utils/window.js"],"names":[],"mappings":"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","file":"interact.js","sourceRoot":"","sourcesContent":["/**\n * interact.js v1.3.0-alpha.4+sha.7970416-dirty\n *\n * Copyright (c) 2012-2017 Taye Adeyemi \n * Open source under the MIT License.\n * https://raw.github.com/taye/interact.js/master/LICENSE\n */\n","(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o 150) {\n return null;\n }\n\n let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI;\n const overlap = 22.5;\n\n if (angle < 0) {\n angle += 360;\n }\n\n const left = 135 - overlap <= angle && angle < 225 + overlap;\n const up = 225 - overlap <= angle && angle < 315 + overlap;\n\n const right = !left && (315 - overlap <= angle || angle < 45 + overlap);\n const down = !up && 45 - overlap <= angle && angle < 135 + overlap;\n\n return {\n up,\n down,\n left,\n right,\n angle,\n speed: interaction.prevEvent.speed,\n velocity: {\n x: interaction.prevEvent.velocityX,\n y: interaction.prevEvent.velocityY,\n },\n };\n }\n\n preventDefault () {}\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n}\n\nsignals.on('set-delta', function ({ iEvent, interaction, starting, deltaSource }) {\n const prevEvent = starting? iEvent : interaction.prevEvent;\n\n if (deltaSource === 'client') {\n iEvent.dx = iEvent.clientX - prevEvent.clientX;\n iEvent.dy = iEvent.clientY - prevEvent.clientY;\n }\n else {\n iEvent.dx = iEvent.pageX - prevEvent.pageX;\n iEvent.dy = iEvent.pageY - prevEvent.pageY;\n }\n});\n\nInteractEvent.signals = signals;\n\nmodule.exports = InteractEvent;\n","const is = require('./utils/is');\nconst events = require('./utils/events');\nconst extend = require('./utils/extend');\nconst actions = require('./actions/base');\nconst scope = require('./scope');\nconst Eventable = require('./Eventable');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nconst {\n getElementRect,\n nodeContains,\n trySelector,\n} = require('./utils/domUtils');\nconst { getWindow } = require('./utils/window');\nconst { indexOf, contains } = require('./utils/arr');\nconst { wheelEvent } = require('./utils/browser');\n\n// all set interactables\nscope.interactables = [];\n\n/*\\\n * Interactable\n [ property ]\n **\n * Object type returned by @interact\n\\*/\nclass Interactable {\n constructor (target, options) {\n options = options || {};\n\n this.target = target;\n this.events = new Eventable();\n this._context = options.context || scope.document;\n this._win = getWindow(trySelector(target)? this._context : target);\n this._doc = this._win.document;\n\n signals.fire('new', {\n target,\n options,\n interactable: this,\n win: this._win,\n });\n\n scope.addDocument( this._doc, this._win );\n\n scope.interactables.push(this);\n\n this.set(options);\n }\n\n setOnEvents (action, phases) {\n const onAction = 'on' + action;\n\n if (is.function(phases.onstart) ) { this.events[onAction + 'start' ] = phases.onstart ; }\n if (is.function(phases.onmove) ) { this.events[onAction + 'move' ] = phases.onmove ; }\n if (is.function(phases.onend) ) { this.events[onAction + 'end' ] = phases.onend ; }\n if (is.function(phases.oninertiastart)) { this.events[onAction + 'inertiastart' ] = phases.oninertiastart ; }\n\n return this;\n }\n\n setPerAction (action, options) {\n // for all the default per-action options\n for (const option in options) {\n // if this option exists for this action\n if (option in defaults[action]) {\n // if the option in the options arg is an object value\n if (is.object(options[option])) {\n // duplicate the object\n this.options[action][option] = extend(this.options[action][option] || {}, options[option]);\n\n if (is.object(defaults.perAction[option]) && 'enabled' in defaults.perAction[option]) {\n this.options[action][option].enabled = options[option].enabled === false? false : true;\n }\n }\n else if (is.bool(options[option]) && is.object(defaults.perAction[option])) {\n this.options[action][option].enabled = options[option];\n }\n else if (options[option] !== undefined) {\n // or if it's not undefined, do a plain assignment\n this.options[action][option] = options[option];\n }\n }\n }\n }\n\n /*\\\n * Interactable.getRect\n [ method ]\n *\n * The default function to get an Interactables bounding rect. Can be\n * overridden using @Interactable.rectChecker.\n *\n - element (Element) #optional The element to measure.\n = (object) The object's bounding rectangle.\n o {\n o top : 0,\n o left : 0,\n o bottom: 0,\n o right : 0,\n o width : 0,\n o height: 0\n o }\n \\*/\n getRect (element) {\n element = element || this.target;\n\n if (is.string(this.target) && !(is.element(element))) {\n element = this._context.querySelector(this.target);\n }\n\n return getElementRect(element);\n }\n\n /*\\\n * Interactable.rectChecker\n [ method ]\n *\n * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n - checker (function) #optional A function which returns this Interactable's bounding rectangle. See @Interactable.getRect\n = (function | object) The checker function or this Interactable\n \\*/\n rectChecker (checker) {\n if (is.function(checker)) {\n this.getRect = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.getRect;\n\n return this;\n }\n\n return this.getRect;\n }\n\n _backCompatOption (optionName, newValue) {\n if (trySelector(newValue) || is.object(newValue)) {\n this.options[optionName] = newValue;\n\n for (const action of actions.names) {\n this.options[action][optionName] = newValue;\n }\n\n return this;\n }\n\n return this.options[optionName];\n }\n\n /*\\\n * Interactable.origin\n [ method ]\n *\n * Gets or sets the origin of the Interactable's element. The x and y\n * of the origin will be subtracted from action event coordinates.\n *\n - origin (object | string) #optional An object eg. { x: 0, y: 0 } or string 'parent', 'self' or any CSS selector\n * OR\n - origin (Element) #optional An HTML or SVG Element whose rect will be used\n **\n = (object) The current origin or this Interactable\n \\*/\n origin (newValue) {\n return this._backCompatOption('origin', newValue);\n }\n\n /*\\\n * Interactable.deltaSource\n [ method ]\n *\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n - newValue (string) #optional Use 'client' if you will be scrolling while interacting; Use 'page' if you want autoScroll to work\n = (string | object) The current deltaSource or this Interactable\n \\*/\n deltaSource (newValue) {\n if (newValue === 'page' || newValue === 'client') {\n this.options.deltaSource = newValue;\n\n return this;\n }\n\n return this.options.deltaSource;\n }\n\n /*\\\n * Interactable.context\n [ method ]\n *\n * Gets the selector context Node of the Interactable. The default is `window.document`.\n *\n = (Node) The context Node of this Interactable\n **\n \\*/\n context () {\n return this._context;\n }\n\n inContext (element) {\n return (this._context === element.ownerDocument\n || nodeContains(this._context, element));\n }\n\n /*\\\n * Interactable.fire\n [ method ]\n *\n * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n - iEvent (InteractEvent) The InteractEvent object to be fired on this Interactable\n = (Interactable) this Interactable\n \\*/\n fire (iEvent) {\n this.events.fire(iEvent);\n\n return this;\n }\n\n _onOffMultiple (method, eventType, listener, options) {\n if (is.string(eventType) && eventType.search(' ') !== -1) {\n eventType = eventType.trim().split(/ +/);\n }\n\n if (is.array(eventType)) {\n for (let i = 0; i < eventType.length; i++) {\n this[method](eventType[i], listener, options);\n }\n\n return true;\n }\n\n if (is.object(eventType)) {\n for (const prop in eventType) {\n this[method](prop, eventType[prop], listener);\n }\n\n return true;\n }\n }\n\n /*\\\n * Interactable.on\n [ method ]\n *\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n - eventType (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) This Interactable\n \\*/\n on (eventType, listener, options) {\n if (this._onOffMultiple('on', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.on(eventType, listener);\n }\n // delegated event for selector\n else if (is.string(this.target)) {\n events.addDelegate(this.target, this._context, eventType, listener, options);\n }\n else {\n events.add(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.off\n [ method ]\n *\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n - eventType (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) This Interactable\n \\*/\n off (eventType, listener, options) {\n if (this._onOffMultiple('off', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n // if it is an action event type\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.off(eventType, listener);\n }\n // delegated event\n else if (is.string(this.target)) {\n events.removeDelegate(this.target, this._context, eventType, listener, options);\n }\n // remove listener from this Interatable's element\n else {\n events.remove(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.set\n [ method ]\n *\n * Reset the options of this Interactable\n - options (object) The new settings to apply\n = (object) This Interactable\n \\*/\n set (options) {\n if (!is.object(options)) {\n options = {};\n }\n\n this.options = extend({}, defaults.base);\n\n const perActions = extend({}, defaults.perAction);\n\n for (const actionName in actions.methodDict) {\n const methodName = actions.methodDict[actionName];\n\n this.options[actionName] = extend({}, defaults[actionName]);\n\n this.setPerAction(actionName, perActions);\n\n this[methodName](options[actionName]);\n }\n\n for (const setting of Interactable.settingsMethods) {\n this.options[setting] = defaults.base[setting];\n\n if (setting in options) {\n this[setting](options[setting]);\n }\n }\n\n signals.fire('set', {\n options,\n interactable: this,\n });\n\n return this;\n }\n\n /*\\\n * Interactable.unset\n [ method ]\n *\n * Remove this interactable from the list of interactables and remove\n * it's action capabilities and event listeners\n *\n = (object) @interact\n \\*/\n unset () {\n events.remove(this.target, 'all');\n\n if (is.string(this.target)) {\n // remove delegated events\n for (const type in events.delegatedEvents) {\n const delegated = events.delegatedEvents[type];\n\n if (delegated.selectors[0] === this.target\n && delegated.contexts[0] === this._context) {\n\n delegated.selectors.splice(0, 1);\n delegated.contexts .splice(0, 1);\n delegated.listeners.splice(0, 1);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegated[type] = null;\n }\n }\n\n events.remove(this._context, type, events.delegateListener);\n events.remove(this._context, type, events.delegateUseCapture, true);\n }\n }\n else {\n events.remove(this, 'all');\n }\n\n signals.fire('unset', { interactable: this });\n\n scope.interactables.splice(indexOf(scope.interactables, this), 1);\n\n // Stop related interactions when an Interactable is unset\n for (const interaction of scope.interactions || []) {\n if (interaction.target === this && interaction.interacting()) {\n interaction.stop();\n }\n }\n\n return scope.interact;\n }\n}\n\nscope.interactables.indexOfElement = function indexOfElement (target, context) {\n context = context || scope.document;\n\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n if (interactable.target === target && interactable._context === context) {\n return i;\n }\n }\n return -1;\n};\n\nscope.interactables.get = function interactableGet (element, options, dontCheckInContext) {\n const ret = this[this.indexOfElement(element, options && options.context)];\n\n return ret && (is.string(element) || dontCheckInContext || ret.inContext(element))? ret : null;\n};\n\nscope.interactables.forEachSelector = function (callback, element) {\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n // skip non CSS selector targets and out of context elements\n if (!is.string(interactable.target)\n || (element && !interactable.inContext(element))) {\n continue;\n }\n\n const ret = callback(interactable, interactable.target, interactable._context, i, this);\n\n if (ret !== undefined) {\n return ret;\n }\n }\n};\n\n// all interact.js eventTypes\nInteractable.eventTypes = scope.eventTypes = [];\n\nInteractable.signals = signals;\n\nInteractable.settingsMethods = [ 'deltaSource', 'origin', 'preventDefault', 'rectChecker' ];\n\nmodule.exports = Interactable;\n","const scope = require('./scope');\nconst utils = require('./utils');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst domObjects = require('./utils/domObjects');\nconst finder = require('./utils/interactionFinder');\nconst signals = require('./utils/Signals').new();\n\nconst listeners = {};\nconst methodNames = [\n 'pointerDown', 'pointerMove', 'pointerUp',\n 'updatePointer', 'removePointer',\n];\n\n// for ignoring browser's simulated mouse events\nlet prevTouchTime = 0;\n\n// all active and idle interactions\nscope.interactions = [];\n\nclass Interaction {\n constructor ({ pointerType }) {\n this.target = null; // current interactable being interacted with\n this.element = null; // the target element of the interactable\n\n this.prepared = { // action that's ready to be fired on next move event\n name : null,\n axis : null,\n edges: null,\n };\n\n // keep track of added pointers\n this.pointers = [];\n this.pointerIds = [];\n this.downTargets = [];\n this.downTimes = [];\n\n // Previous native pointer move event coordinates\n this.prevCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n // current native pointer move event coordinates\n this.curCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Starting InteractEvent pointer coordinates\n this.startCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Change in coordinates and time of the pointer\n this.pointerDelta = {\n page : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n client : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n timeStamp: 0,\n };\n\n this.downEvent = null; // pointerdown/mousedown/touchstart event\n this.downPointer = {};\n\n this._eventTarget = null;\n this._curEventTarget = null;\n\n this.prevEvent = null; // previous action event\n\n this.pointerIsDown = false;\n this.pointerWasMoved = false;\n this._interacting = false;\n\n this.pointerType = pointerType;\n\n signals.fire('new', this);\n\n scope.interactions.push(this);\n }\n\n pointerDown (pointer, event, eventTarget) {\n const pointerIndex = this.updatePointer(pointer, event, true);\n\n signals.fire('down', {\n pointer,\n event,\n eventTarget,\n pointerIndex,\n interaction: this,\n });\n }\n\n /*\\\n * Interaction.start\n [ method ]\n *\n * Start an action with the given Interactable and Element as tartgets. The\n * action must be enabled for the target Interactable and an appropriate number\n * of pointers must be held down - 1 for drag/resize, 2 for gesture.\n *\n * Use it with `interactable.able({ manualStart: false })` to always\n * [start actions manually](https://github.com/taye/interact.js/issues/114)\n *\n - action (object) The action to be performed - drag, resize, etc.\n - target (Interactable) The Interactable to target\n - element (Element) The DOM Element to target\n = (object) interact\n **\n | interact(target)\n | .draggable({\n | // disable the default drag start by down->move\n | manualStart: true\n | })\n | // start dragging after the user holds the pointer down\n | .on('hold', function (event) {\n | var interaction = event.interaction;\n |\n | if (!interaction.interacting()) {\n | interaction.start({ name: 'drag' },\n | event.interactable,\n | event.currentTarget);\n | }\n | });\n \\*/\n start (action, target, element) {\n if (this.interacting()\n || !this.pointerIsDown\n || this.pointerIds.length < (action.name === 'gesture'? 2 : 1)) {\n return;\n }\n\n // if this interaction had been removed after stopping\n // add it back\n if (utils.indexOf(scope.interactions, this) === -1) {\n scope.interactions.push(this);\n }\n\n utils.copyAction(this.prepared, action);\n this.target = target;\n this.element = element;\n\n signals.fire('action-start', {\n interaction: this,\n event: this.downEvent,\n });\n }\n\n pointerMove (pointer, event, eventTarget) {\n if (!this.simulation) {\n this.updatePointer(pointer);\n utils.setCoords(this.curCoords, this.pointers);\n }\n\n const duplicateMove = (this.curCoords.page.x === this.prevCoords.page.x\n && this.curCoords.page.y === this.prevCoords.page.y\n && this.curCoords.client.x === this.prevCoords.client.x\n && this.curCoords.client.y === this.prevCoords.client.y);\n\n let dx;\n let dy;\n\n // register movement greater than pointerMoveTolerance\n if (this.pointerIsDown && !this.pointerWasMoved) {\n dx = this.curCoords.client.x - this.startCoords.client.x;\n dy = this.curCoords.client.y - this.startCoords.client.y;\n\n this.pointerWasMoved = utils.hypot(dx, dy) > Interaction.pointerMoveTolerance;\n }\n\n const signalArg = {\n pointer,\n pointerIndex: this.getPointerIndex(pointer),\n event,\n eventTarget,\n dx,\n dy,\n duplicate: duplicateMove,\n interaction: this,\n interactingBeforeMove: this.interacting(),\n };\n\n if (!duplicateMove) {\n // set pointer coordinate, time changes and speeds\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n }\n\n signals.fire('move', signalArg);\n\n if (!duplicateMove) {\n // if interacting, fire an 'action-move' signal etc\n if (this.interacting()) {\n this.doMove(signalArg);\n }\n\n if (this.pointerWasMoved) {\n utils.copyCoords(this.prevCoords, this.curCoords);\n }\n }\n }\n\n /*\\\n * Interaction.doMove\n [ method ]\n *\n * Force a move of the current action at the same coordinates. Useful if\n * snap/restrict has been changed and you want a movement with the new\n * settings.\n *\n **\n | interact(target)\n | .draggable(true)\n | .on('dragmove', function (event) {\n | if (someCondition) {\n | // change the snap settings\n | event.interactable.draggable({ snap: { targets: [] }});\n | // fire another move event with re-calculated snap\n | event.interaction.doMove();\n | }\n | });\n \\*/\n doMove (signalArg) {\n signalArg = utils.extend({\n pointer: this.pointers[0],\n event: this.prevEvent,\n eventTarget: this._eventTarget,\n interaction: this,\n }, signalArg || {});\n\n signals.fire('before-action-move', signalArg);\n\n if (!this._dontFireMove) {\n signals.fire('action-move', signalArg);\n }\n\n this._dontFireMove = false;\n }\n\n // End interact move events and stop auto-scroll unless simulation is running\n pointerUp (pointer, event, eventTarget, curEventTarget) {\n const pointerIndex = this.getPointerIndex(pointer);\n\n signals.fire(/cancel$/i.test(event.type)? 'cancel' : 'up', {\n pointer,\n pointerIndex,\n event,\n eventTarget,\n curEventTarget,\n interaction: this,\n });\n\n if (!this.simulation) {\n this.end(event);\n }\n\n this.pointerIsDown = false;\n this.removePointer(pointer, event);\n }\n\n /*\\\n * Interaction.end\n [ method ]\n *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n - event (PointerEvent) #optional\n **\n | interact(target)\n | .draggable(true)\n | .on('move', function (event) {\n | if (event.pageX > 1000) {\n | // end the current action\n | event.interaction.end();\n | // stop all further listeners from being called\n | event.stopImmediatePropagation();\n | }\n | });\n \\*/\n end (event) {\n event = event || this.prevEvent;\n\n if (this.interacting()) {\n signals.fire('action-end', {\n event,\n interaction: this,\n });\n }\n\n this.stop();\n }\n\n currentAction () {\n return this._interacting? this.prepared.name: null;\n }\n\n interacting () {\n return this._interacting;\n }\n\n stop () {\n signals.fire('stop', { interaction: this });\n\n if (this._interacting) {\n signals.fire('stop-active', { interaction: this });\n signals.fire('stop-' + this.prepared.name, { interaction: this });\n }\n\n this.target = this.element = null;\n\n this._interacting = false;\n this.prepared.name = this.prevEvent = null;\n }\n\n getPointerIndex (pointer) {\n // mouse and pen interactions may have only one pointer\n if (this.pointerType === 'mouse' || this.pointerType === 'pen') {\n return 0;\n }\n\n return utils.indexOf(this.pointerIds, utils.getPointerId(pointer));\n }\n\n updatePointer (pointer, event, down = event && /(down|start)$/i.test(event.type)) {\n const id = utils.getPointerId(pointer);\n let index = this.getPointerIndex(pointer);\n\n if (index === -1) {\n index = this.pointerIds.length;\n this.pointerIds[index] = id;\n }\n\n if (down) {\n signals.fire('update-pointer-down', {\n pointer,\n event,\n down,\n pointerId: id,\n pointerIndex: index,\n interaction: this,\n });\n }\n\n this.pointers[index] = pointer;\n\n return index;\n }\n\n removePointer (pointer, event) {\n const index = this.getPointerIndex(pointer);\n\n if (index === -1) { return; }\n\n signals.fire('remove-pointer', {\n pointer,\n event,\n pointerIndex: index,\n interaction: this,\n });\n\n this.pointers .splice(index, 1);\n this.pointerIds .splice(index, 1);\n this.downTargets.splice(index, 1);\n this.downTimes .splice(index, 1);\n }\n\n _updateEventTargets (target, currentTarget) {\n this._eventTarget = target;\n this._curEventTarget = currentTarget;\n }\n}\n\nfor (let i = 0, len = methodNames.length; i < len; i++) {\n const method = methodNames[i];\n\n listeners[method] = doOnInteractions(method);\n}\n\nfunction doOnInteractions (method) {\n return (function (event) {\n const pointerType = utils.getPointerType(event);\n const [eventTarget, curEventTarget] = utils.getEventTargets(event);\n const matches = []; // [ [pointer, interaction], ...]\n\n if (browser.supportsTouch && /touch/.test(event.type)) {\n prevTouchTime = new Date().getTime();\n\n for (let i = 0; i < event.changedTouches.length; i++) {\n const pointer = event.changedTouches[i];\n const interaction = finder.search(pointer, event.type, eventTarget);\n\n matches.push([pointer, interaction || new Interaction({ pointerType })]);\n }\n }\n else {\n let invalidPointer = false;\n\n if (!browser.supportsPointerEvent && /mouse/.test(event.type)) {\n // ignore mouse events while touch interactions are active\n for (let i = 0; i < scope.interactions.length && !invalidPointer; i++) {\n invalidPointer = scope.interactions[i].pointerType !== 'mouse' && scope.interactions[i].pointerIsDown;\n }\n\n // try to ignore mouse events that are simulated by the browser\n // after a touch event\n invalidPointer = invalidPointer\n || (new Date().getTime() - prevTouchTime < 500)\n // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated\n || event.timeStamp === 0;\n }\n\n if (!invalidPointer) {\n let interaction = finder.search(event, event.type, eventTarget);\n\n if (!interaction) {\n interaction = new Interaction({ pointerType });\n }\n\n matches.push([event, interaction]);\n }\n }\n\n for (const [pointer, interaction] of matches) {\n interaction._updateEventTargets(eventTarget, curEventTarget);\n interaction[method](pointer, event, eventTarget, curEventTarget);\n }\n });\n}\n\nfunction endAll (event) {\n for (let i = 0; i < scope.interactions.length; i++) {\n const interaction = scope.interactions[i];\n\n interaction.end(event);\n signals.fire('endall', { event, interaction });\n }\n}\n\nconst docEvents = { /* 'eventType': listenerFunc */ };\nconst pEventTypes = browser.pEventTypes;\n\nif (domObjects.PointerEvent) {\n docEvents[pEventTypes.down ] = listeners.pointerDown;\n docEvents[pEventTypes.move ] = listeners.pointerMove;\n docEvents[pEventTypes.up ] = listeners.pointerUp;\n docEvents[pEventTypes.cancel] = listeners.pointerUp;\n}\nelse {\n docEvents.mousedown = listeners.pointerDown;\n docEvents.mousemove = listeners.pointerMove;\n docEvents.mouseup = listeners.pointerUp;\n\n docEvents.touchstart = listeners.pointerDown;\n docEvents.touchmove = listeners.pointerMove;\n docEvents.touchend = listeners.pointerUp;\n docEvents.touchcancel = listeners.pointerUp;\n}\n\ndocEvents.blur = endAll;\n\nfunction onDocSignal ({ doc }, signalName) {\n const eventMethod = signalName.indexOf('add') === 0\n ? events.add : events.remove;\n\n // delegate event listener\n for (const eventType in scope.delegatedEvents) {\n eventMethod(doc, eventType, events.delegateListener);\n eventMethod(doc, eventType, events.delegateUseCapture, true);\n }\n\n for (const eventType in docEvents) {\n eventMethod(doc, eventType, docEvents[eventType]);\n }\n}\n\nsignals.on('update-pointer-down', ({ interaction, pointer, pointerId, pointerIndex, event, eventTarget, down }) => {\n interaction.pointerIds[pointerIndex] = pointerId;\n interaction.pointers[pointerIndex] = pointer;\n\n if (down) {\n interaction.pointerIsDown = true;\n }\n\n if (!interaction.interacting()) {\n utils.setCoords(interaction.startCoords, interaction.pointers);\n\n utils.copyCoords(interaction.curCoords , interaction.startCoords);\n utils.copyCoords(interaction.prevCoords, interaction.startCoords);\n\n interaction.downEvent = event;\n interaction.downTimes[pointerIndex] = interaction.curCoords.timeStamp;\n interaction.downTargets[pointerIndex] = eventTarget || event && utils.getEventTargets(event)[0];\n interaction.pointerWasMoved = false;\n\n utils.pointerExtend(interaction.downPointer, pointer);\n }\n});\n\nscope.signals.on('add-document' , onDocSignal);\nscope.signals.on('remove-document', onDocSignal);\n\nInteraction.pointerMoveTolerance = 1;\nInteraction.doOnInteractions = doOnInteractions;\nInteraction.endAll = endAll;\nInteraction.signals = signals;\nInteraction.docEvents = docEvents;\n\nscope.endAllInteractions = endAll;\n\nmodule.exports = Interaction;\n","const Interaction = require('../Interaction');\nconst InteractEvent = require('../InteractEvent');\n\nconst actions = {\n firePrepared,\n names: [],\n methodDict: {},\n};\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n interaction._interacting = true;\n firePrepared(interaction, event, 'start');\n});\n\nInteraction.signals.on('action-move', function ({ interaction, event, preEnd }) {\n firePrepared(interaction, event, 'move', preEnd);\n\n // if the action was ended in a listener\n if (!interaction.interacting()) { return false; }\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n firePrepared(interaction, event, 'end');\n});\n\nfunction firePrepared (interaction, event, phase, preEnd) {\n const actionName = interaction.prepared.name;\n\n const newEvent = new InteractEvent(interaction, event, actionName, phase, interaction.element, null, preEnd);\n\n interaction.target.fire(newEvent);\n interaction.prevEvent = newEvent;\n}\n\nmodule.exports = actions;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drag = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n startAxis : 'xy',\n lockAxis : 'xy',\n },\n\n checker: function (pointer, event, interactable) {\n const dragOptions = interactable.options.drag;\n\n return dragOptions.enabled\n ? { name: 'drag', axis: (dragOptions.lockAxis === 'start'\n ? dragOptions.startAxis\n : dragOptions.lockAxis)}\n : null;\n },\n\n getCursor: function () {\n return 'move';\n },\n};\n\nInteraction.signals.on('before-action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n interaction.curCoords.page.y = interaction.startCoords.page.y;\n interaction.curCoords.client.y = interaction.startCoords.client.y;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vx);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vx);\n interaction.pointerDelta.client.vy = 0;\n interaction.pointerDelta.page.vy = 0;\n }\n else if (axis === 'y') {\n interaction.curCoords.page.x = interaction.startCoords.page.x;\n interaction.curCoords.client.x = interaction.startCoords.client.x;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vy);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vy);\n interaction.pointerDelta.client.vx = 0;\n interaction.pointerDelta.page.vx = 0;\n }\n});\n\n// dragmove\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'dragmove') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n iEvent.pageY = interaction.startCoords.page.y;\n iEvent.clientY = interaction.startCoords.client.y;\n iEvent.dy = 0;\n }\n else if (axis === 'y') {\n iEvent.pageX = interaction.startCoords.page.x;\n iEvent.clientX = interaction.startCoords.client.x;\n iEvent.dx = 0;\n }\n});\n\n/*\\\n * Interactable.draggable\n [ method ]\n *\n * Gets or sets whether drag actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of drag events\n | var isDraggable = interact('ul li').draggable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on drag events (object makes the Interactable draggable)\n = (object) This Interactable\n | interact(element).draggable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // the axis in which the first movement must be\n | // for the drag sequence to start\n | // 'xy' by default - any direction\n | startAxis: 'x' || 'y' || 'xy',\n |\n | // 'xy' by default - don't restrict to one axis (move in any direction)\n | // 'x' or 'y' to restrict movement to either axis\n | // 'start' to restrict movement to the axis the drag started in\n | lockAxis: 'x' || 'y' || 'xy' || 'start',\n |\n | // max number of drags that can happen concurrently\n | // with elements of this Interactable. Infinity by default\n | max: Infinity,\n |\n | // max number of drags that can target the same element+Interactable\n | // 1 by default\n | maxPerElement: 2\n | });\n\\*/\nInteractable.prototype.draggable = function (options) {\n if (utils.is.object(options)) {\n this.options.drag.enabled = options.enabled === false? false: true;\n this.setPerAction('drag', options);\n this.setOnEvents('drag', options);\n\n if (/^(xy|x|y|start)$/.test(options.lockAxis)) {\n this.options.drag.lockAxis = options.lockAxis;\n }\n if (/^(xy|x|y)$/.test(options.startAxis)) {\n this.options.drag.startAxis = options.startAxis;\n }\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drag.enabled = options;\n\n if (!options) {\n this.ondragstart = this.ondragstart = this.ondragend = null;\n }\n\n return this;\n }\n\n return this.options.drag;\n};\n\nactions.drag = drag;\nactions.names.push('drag');\nutils.merge(Interactable.eventTypes, [\n 'dragstart',\n 'dragmove',\n 'draginertiastart',\n 'draginertiaresume',\n 'dragend',\n]);\nactions.methodDict.drag = 'draggable';\n\ndefaultOptions.drag = drag.defaults;\n\nmodule.exports = drag;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst scope = require('../scope');\nconst interact = require('../interact');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drop = {\n defaults: {\n enabled: false,\n accept : null,\n overlap: 'pointer',\n },\n};\n\nlet dynamicDrop = false;\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // reset active dropzones\n interaction.activeDrops.dropzones = [];\n interaction.activeDrops.elements = [];\n interaction.activeDrops.rects = [];\n\n interaction.dropEvents = null;\n\n if (!interaction.dynamicDrop) {\n setActiveDrops(interaction, interaction.element);\n }\n\n const dragEvent = interaction.prevEvent;\n const dropEvents = getDropEvents(interaction, event, dragEvent);\n\n if (dropEvents.activate) {\n fireActiveDrops(interaction, dropEvents.activate);\n }\n});\n\nInteractEvent.signals.on('new', function ({ interaction, iEvent, event }) {\n if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { return; }\n\n const draggableElement = interaction.element;\n const dragEvent = iEvent;\n const dropResult = getDrop(dragEvent, event, draggableElement);\n\n interaction.dropTarget = dropResult.dropzone;\n interaction.dropElement = dropResult.element;\n\n interaction.dropEvents = getDropEvents(interaction, event, dragEvent);\n});\n\nInteraction.signals.on('action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n fireDropEvents(interaction, interaction.dropEvents);\n});\n\nInteraction.signals.on('action-end', function ({ interaction }) {\n if (interaction.prepared.name === 'drag') {\n fireDropEvents(interaction, interaction.dropEvents);\n }\n});\n\nInteraction.signals.on('stop-drag', function ({ interaction }) {\n interaction.activeDrops.dropzones =\n interaction.activeDrops.elements =\n interaction.activeDrops.rects =\n interaction.dropEvents = null;\n});\n\nfunction collectDrops (interaction, element) {\n const drops = [];\n const elements = [];\n\n element = element || interaction.element;\n\n // collect all dropzones and their elements which qualify for a drop\n for (const current of scope.interactables) {\n if (!current.options.drop.enabled) { continue; }\n\n const accept = current.options.drop.accept;\n\n // test the draggable element against the dropzone's accept setting\n if ((utils.is.element(accept) && accept !== element)\n || (utils.is.string(accept)\n && !utils.matchesSelector(element, accept))) {\n\n continue;\n }\n\n // query for new elements if necessary\n const dropElements = utils.is.string(current.target)\n ? current._context.querySelectorAll(current.target)\n : [current.target];\n\n for (let i = 0; i < dropElements.length; i++) {\n const currentElement = dropElements[i];\n\n if (currentElement !== element) {\n drops.push(current);\n elements.push(currentElement);\n }\n }\n }\n\n return {\n elements,\n dropzones: drops,\n };\n}\n\nfunction fireActiveDrops (interaction, event) {\n let prevElement;\n\n // loop through all active dropzones and trigger event\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n const current = interaction.activeDrops.dropzones[i];\n const currentElement = interaction.activeDrops.elements [i];\n\n // prevent trigger of duplicate events on same element\n if (currentElement !== prevElement) {\n // set current element as event target\n event.target = currentElement;\n current.fire(event);\n }\n prevElement = currentElement;\n }\n}\n\n// Collect a new set of possible drops and save them in activeDrops.\n// setActiveDrops should always be called when a drag has just started or a\n// drag event happens while dynamicDrop is true\nfunction setActiveDrops (interaction, dragElement) {\n // get dropzones and their elements that could receive the draggable\n const possibleDrops = collectDrops(interaction, dragElement, true);\n\n interaction.activeDrops.dropzones = possibleDrops.dropzones;\n interaction.activeDrops.elements = possibleDrops.elements;\n interaction.activeDrops.rects = [];\n\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n interaction.activeDrops.rects[i] =\n interaction.activeDrops.dropzones[i].getRect(interaction.activeDrops.elements[i]);\n }\n}\n\nfunction getDrop (dragEvent, event, dragElement) {\n const interaction = dragEvent.interaction;\n const validDrops = [];\n\n if (dynamicDrop) {\n setActiveDrops(interaction, dragElement);\n }\n\n // collect all dropzones and their elements which qualify for a drop\n for (let j = 0; j < interaction.activeDrops.dropzones.length; j++) {\n const current = interaction.activeDrops.dropzones[j];\n const currentElement = interaction.activeDrops.elements [j];\n const rect = interaction.activeDrops.rects [j];\n\n validDrops.push(current.dropCheck(dragEvent, event, interaction.target, dragElement, currentElement, rect)\n ? currentElement\n : null);\n }\n\n // get the most appropriate dropzone based on DOM depth and order\n const dropIndex = utils.indexOfDeepestElement(validDrops);\n\n return {\n dropzone: interaction.activeDrops.dropzones[dropIndex] || null,\n element : interaction.activeDrops.elements [dropIndex] || null,\n };\n}\n\nfunction getDropEvents (interaction, pointerEvent, dragEvent) {\n const dropEvents = {\n enter : null,\n leave : null,\n activate : null,\n deactivate: null,\n move : null,\n drop : null,\n };\n\n const tmpl = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n };\n\n if (interaction.dropElement !== interaction.prevDropElement) {\n // if there was a prevDropTarget, create a dragleave event\n if (interaction.prevDropTarget) {\n dropEvents.leave = utils.extend({ type: 'dragleave' }, tmpl);\n\n dragEvent.dragLeave = dropEvents.leave.target = interaction.prevDropElement;\n dragEvent.prevDropzone = dropEvents.leave.dropzone = interaction.prevDropTarget;\n }\n // if the dropTarget is not null, create a dragenter event\n if (interaction.dropTarget) {\n dropEvents.enter = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n type : 'dragenter',\n };\n\n dragEvent.dragEnter = interaction.dropElement;\n dragEvent.dropzone = interaction.dropTarget;\n }\n }\n\n if (dragEvent.type === 'dragend' && interaction.dropTarget) {\n dropEvents.drop = utils.extend({ type: 'drop' }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n dragEvent.relatedTarget = interaction.dropElement;\n }\n if (dragEvent.type === 'dragstart') {\n dropEvents.activate = utils.extend({ type: 'dropactivate' }, tmpl);\n\n dropEvents.activate.target = null;\n dropEvents.activate.dropzone = null;\n }\n if (dragEvent.type === 'dragend') {\n dropEvents.deactivate = utils.extend({ type: 'dropdeactivate' }, tmpl);\n\n dropEvents.deactivate.target = null;\n dropEvents.deactivate.dropzone = null;\n }\n if (dragEvent.type === 'dragmove' && interaction.dropTarget) {\n dropEvents.move = utils.extend({\n dragmove : dragEvent,\n type : 'dropmove',\n }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n }\n\n return dropEvents;\n}\n\nfunction fireDropEvents (interaction, dropEvents) {\n if (dropEvents.leave) { interaction.prevDropTarget.fire(dropEvents.leave); }\n if (dropEvents.move ) { interaction.dropTarget.fire(dropEvents.move ); }\n if (dropEvents.enter) { interaction.dropTarget.fire(dropEvents.enter); }\n if (dropEvents.drop ) { interaction.dropTarget.fire(dropEvents.drop ); }\n if (dropEvents.deactivate) {\n fireActiveDrops(interaction, dropEvents.deactivate);\n }\n\n interaction.prevDropTarget = interaction.dropTarget;\n interaction.prevDropElement = interaction.dropElement;\n}\n\n/*\\\n * Interactable.dropzone\n [ method ]\n *\n * Returns or sets whether elements can be dropped onto this\n * Interactable to trigger drop events\n *\n * Dropzones can receive the following events:\n * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends\n * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone\n * - `dragmove` when a draggable that has entered the dropzone is moved\n * - `drop` when a draggable is dropped into this dropzone\n *\n * Use the `accept` option to allow only elements that match the given CSS\n * selector or element. The value can be:\n *\n * - **an Element** - only that element can be dropped into this dropzone.\n * - **a string**, - the element being dragged must match it as a CSS selector.\n * - **`null`** - accept options is cleared - it accepts any element.\n *\n * Use the `overlap` option to set how drops are checked for. The allowed\n * values are:\n *\n * - `'pointer'`, the pointer must be over the dropzone (default)\n * - `'center'`, the draggable element's center must be over the dropzone\n * - a number from 0-1 which is the `(intersection area) / (draggable area)`.\n * e.g. `0.5` for drop to happen when half of the area of the draggable is\n * over the dropzone\n *\n * Use the `checker` option to specify a function to check if a dragged\n * element is over this Interactable.\n *\n | interact(target)\n | .dropChecker(function(dragEvent, // related dragmove or dragend event\n | event, // TouchEvent/PointerEvent/MouseEvent\n | dropped, // bool result of the default checker\n | dropzone, // dropzone Interactable\n | dropElement, // dropzone elemnt\n | draggable, // draggable Interactable\n | draggableElement) {// draggable element\n |\n | return dropped && event.target.hasAttribute('allow-drop');\n | }\n *\n *\n - options (boolean | object | null) #optional The new value to be set.\n | interact('.drop').dropzone({\n | accept: '.can-drop' || document.getElementById('single-drop'),\n | overlap: 'pointer' || 'center' || zeroToOne\n | }\n = (boolean | object) The current setting or this Interactable\n\\*/\nInteractable.prototype.dropzone = function (options) {\n if (utils.is.object(options)) {\n this.options.drop.enabled = options.enabled === false? false: true;\n\n if (utils.is.function(options.ondrop) ) { this.events.ondrop = options.ondrop ; }\n if (utils.is.function(options.ondropactivate) ) { this.events.ondropactivate = options.ondropactivate ; }\n if (utils.is.function(options.ondropdeactivate)) { this.events.ondropdeactivate = options.ondropdeactivate; }\n if (utils.is.function(options.ondragenter) ) { this.events.ondragenter = options.ondragenter ; }\n if (utils.is.function(options.ondragleave) ) { this.events.ondragleave = options.ondragleave ; }\n if (utils.is.function(options.ondropmove) ) { this.events.ondropmove = options.ondropmove ; }\n\n if (/^(pointer|center)$/.test(options.overlap)) {\n this.options.drop.overlap = options.overlap;\n }\n else if (utils.is.number(options.overlap)) {\n this.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0);\n }\n if ('accept' in options) {\n this.options.drop.accept = options.accept;\n }\n if ('checker' in options) {\n this.options.drop.checker = options.checker;\n }\n\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drop.enabled = options;\n\n if (!options) {\n this.ondragenter = this.ondragleave = this.ondrop\n = this.ondropactivate = this.ondropdeactivate = null;\n }\n\n return this;\n }\n\n return this.options.drop;\n};\n\nInteractable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) {\n let dropped = false;\n\n // if the dropzone has no rect (eg. display: none)\n // call the custom dropChecker or just return false\n if (!(rect = rect || this.getRect(dropElement))) {\n return (this.options.drop.checker\n ? this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement)\n : false);\n }\n\n const dropOverlap = this.options.drop.overlap;\n\n if (dropOverlap === 'pointer') {\n const origin = utils.getOriginXY(draggable, draggableElement, 'drag');\n const page = utils.getPageXY(dragEvent);\n\n page.x += origin.x;\n page.y += origin.y;\n\n const horizontal = (page.x > rect.left) && (page.x < rect.right);\n const vertical = (page.y > rect.top ) && (page.y < rect.bottom);\n\n dropped = horizontal && vertical;\n }\n\n const dragRect = draggable.getRect(draggableElement);\n\n if (dragRect && dropOverlap === 'center') {\n const cx = dragRect.left + dragRect.width / 2;\n const cy = dragRect.top + dragRect.height / 2;\n\n dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom;\n }\n\n if (dragRect && utils.is.number(dropOverlap)) {\n const overlapArea = (Math.max(0, Math.min(rect.right , dragRect.right ) - Math.max(rect.left, dragRect.left))\n * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top , dragRect.top )));\n\n const overlapRatio = overlapArea / (dragRect.width * dragRect.height);\n\n dropped = overlapRatio >= dropOverlap;\n }\n\n if (this.options.drop.checker) {\n dropped = this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement);\n }\n\n return dropped;\n};\n\nInteractable.signals.on('unset', function ({ interactable }) {\n interactable.dropzone(false);\n});\n\nInteractable.settingsMethods.push('dropChecker');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.dropTarget = null; // the dropzone a drag target might be dropped into\n interaction.dropElement = null; // the element at the time of checking\n interaction.prevDropTarget = null; // the dropzone that was recently dragged away from\n interaction.prevDropElement = null; // the element at the time of checking\n interaction.dropEvents = null; // the dropEvents related to the current drag event\n\n interaction.activeDrops = {\n dropzones: [], // the dropzones that are mentioned below\n elements : [], // elements of dropzones that accept the target draggable\n rects : [], // the rects of the elements mentioned above\n };\n\n});\n\nInteraction.signals.on('stop', function ({ interaction }) {\n interaction.dropTarget = interaction.dropElement =\n interaction.prevDropTarget = interaction.prevDropElement = null;\n});\n\n/*\\\n * interact.dynamicDrop\n [ method ]\n *\n * Returns or sets whether the dimensions of dropzone elements are\n * calculated on every dragmove or only on dragstart for the default\n * dropChecker\n *\n - newValue (boolean) #optional True to check on each move. False to check only before start\n = (boolean | interact) The current setting or interact\n\\*/\ninteract.dynamicDrop = function (newValue) {\n if (utils.is.bool(newValue)) {\n //if (dragging && dynamicDrop !== newValue && !newValue) {\n //calcRects(dropzones);\n //}\n\n dynamicDrop = newValue;\n\n return interact;\n }\n return dynamicDrop;\n};\n\nutils.merge(Interactable.eventTypes, [\n 'dragenter',\n 'dragleave',\n 'dropactivate',\n 'dropdeactivate',\n 'dropmove',\n 'drop',\n]);\nactions.methodDict.drop = 'dropzone';\n\ndefaultOptions.drop = drop.defaults;\n\nmodule.exports = drop;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst gesture = {\n defaults: {\n enabled : false,\n origin : null,\n restrict: null,\n },\n\n checker: function (pointer, event, interactable, element, interaction) {\n if (interaction.pointerIds.length >= 2) {\n return { name: 'gesture' };\n }\n\n return null;\n },\n\n getCursor: function () {\n return '';\n },\n};\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturestart') { return; }\n iEvent.ds = 0;\n\n interaction.gesture.startDistance = interaction.gesture.prevDistance = iEvent.distance;\n interaction.gesture.startAngle = interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.scale = 1;\n});\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturemove') { return; }\n\n iEvent.ds = iEvent.scale - interaction.gesture.scale;\n\n interaction.target.fire(iEvent);\n\n interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.prevDistance = iEvent.distance;\n\n if (iEvent.scale !== Infinity\n && iEvent.scale !== null\n && iEvent.scale !== undefined\n && !isNaN(iEvent.scale)) {\n\n interaction.gesture.scale = iEvent.scale;\n }\n});\n\n/*\\\n * Interactable.gesturable\n [ method ]\n *\n * Gets or sets whether multitouch gestures can be performed on the\n * Interactable's element\n *\n = (boolean) Indicates if this can be the target of gesture events\n | var isGestureable = interact(element).gesturable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on gesture events (makes the Interactable gesturable)\n = (object) this Interactable\n | interact(element).gesturable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // limit multiple gestures.\n | // See the explanation in @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n\\*/\nInteractable.prototype.gesturable = function (options) {\n if (utils.is.object(options)) {\n this.options.gesture.enabled = options.enabled === false? false: true;\n this.setPerAction('gesture', options);\n this.setOnEvents('gesture', options);\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.gesture.enabled = options;\n\n if (!options) {\n this.ongesturestart = this.ongesturestart = this.ongestureend = null;\n }\n\n return this;\n }\n\n return this.options.gesture;\n};\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action, event, starting, ending, deltaSource }) {\n if (action !== 'gesture') { return; }\n\n const pointers = interaction.pointers;\n\n iEvent.touches = [pointers[0], pointers[1]];\n\n if (starting) {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = 1;\n iEvent.ds = 0;\n iEvent.angle = utils.touchAngle(pointers, undefined, deltaSource);\n iEvent.da = 0;\n }\n else if (ending || event instanceof InteractEvent) {\n iEvent.distance = interaction.prevEvent.distance;\n iEvent.box = interaction.prevEvent.box;\n iEvent.scale = interaction.prevEvent.scale;\n iEvent.ds = iEvent.scale - 1;\n iEvent.angle = interaction.prevEvent.angle;\n iEvent.da = iEvent.angle - interaction.gesture.startAngle;\n }\n else {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = iEvent.distance / interaction.gesture.startDistance;\n iEvent.angle = utils.touchAngle(pointers, interaction.gesture.prevAngle, deltaSource);\n\n iEvent.ds = iEvent.scale - interaction.gesture.prevScale;\n iEvent.da = iEvent.angle - interaction.gesture.prevAngle;\n }\n});\n\nInteraction.signals.on('new', function (interaction) {\n interaction.gesture = {\n start: { x: 0, y: 0 },\n\n startDistance: 0, // distance between two touches of touchStart\n prevDistance : 0,\n distance : 0,\n\n scale: 1, // gesture.distance / gesture.startDistance\n\n startAngle: 0, // angle of line joining two touches\n prevAngle : 0, // angle of the previous gesture event\n };\n});\n\nactions.gesture = gesture;\nactions.names.push('gesture');\nutils.merge(Interactable.eventTypes, [\n 'gesturestart',\n 'gesturemove',\n 'gestureend',\n]);\nactions.methodDict.gesture = 'gesturable';\n\ndefaultOptions.gesture = gesture.defaults;\n\nmodule.exports = gesture;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\n// Less Precision with touch input\nconst defaultMargin = browser.supportsTouch || browser.supportsPointerEvent? 20: 10;\n\nconst resize = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n square: false,\n preserveAspectRatio: false,\n axis: 'xy',\n\n // use default margin\n margin: NaN,\n\n // object with props left, right, top, bottom which are\n // true/false values to resize when the pointer is over that edge,\n // CSS selectors to match the handles for each direction\n // or the Elements for each handle\n edges: null,\n\n // a value of 'none' will limit the resize rect to a minimum of 0x0\n // 'negate' will alow the rect to have negative width/height\n // 'reposition' will keep the width/height positive by swapping\n // the top and bottom edges and/or swapping the left and right edges\n invert: 'none',\n },\n\n checker: function (pointer, event, interactable, element, interaction, rect) {\n if (!rect) { return null; }\n\n const page = utils.extend({}, interaction.curCoords.page);\n const options = interactable.options;\n\n if (options.resize.enabled) {\n const resizeOptions = options.resize;\n const resizeEdges = { left: false, right: false, top: false, bottom: false };\n\n // if using resize.edges\n if (utils.is.object(resizeOptions.edges)) {\n for (const edge in resizeEdges) {\n resizeEdges[edge] = checkResizeEdge(edge,\n resizeOptions.edges[edge],\n page,\n interaction._eventTarget,\n element,\n rect,\n resizeOptions.margin || defaultMargin);\n }\n\n resizeEdges.left = resizeEdges.left && !resizeEdges.right;\n resizeEdges.top = resizeEdges.top && !resizeEdges.bottom;\n\n if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) {\n return {\n name: 'resize',\n edges: resizeEdges,\n };\n }\n }\n else {\n const right = options.resize.axis !== 'y' && page.x > (rect.right - defaultMargin);\n const bottom = options.resize.axis !== 'x' && page.y > (rect.bottom - defaultMargin);\n\n if (right || bottom) {\n return {\n name: 'resize',\n axes: (right? 'x' : '') + (bottom? 'y' : ''),\n };\n }\n }\n }\n\n return null;\n },\n\n cursors: (browser.isIe9OrOlder ? {\n x : 'e-resize',\n y : 's-resize',\n xy: 'se-resize',\n\n top : 'n-resize',\n left : 'w-resize',\n bottom : 's-resize',\n right : 'e-resize',\n topleft : 'se-resize',\n bottomright: 'se-resize',\n topright : 'ne-resize',\n bottomleft : 'ne-resize',\n } : {\n x : 'ew-resize',\n y : 'ns-resize',\n xy: 'nwse-resize',\n\n top : 'ns-resize',\n left : 'ew-resize',\n bottom : 'ns-resize',\n right : 'ew-resize',\n topleft : 'nwse-resize',\n bottomright: 'nwse-resize',\n topright : 'nesw-resize',\n bottomleft : 'nesw-resize',\n }),\n\n getCursor: function (action) {\n if (action.axis) {\n return resize.cursors[action.name + action.axis];\n }\n else if (action.edges) {\n let cursorKey = '';\n const edgeNames = ['top', 'bottom', 'left', 'right'];\n\n for (let i = 0; i < 4; i++) {\n if (action.edges[edgeNames[i]]) {\n cursorKey += edgeNames[i];\n }\n }\n\n return resize.cursors[cursorKey];\n }\n },\n};\n\n// resizestart\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'resizestart' || !interaction.prepared.edges) {\n return;\n }\n\n const startRect = interaction.target.getRect(interaction.element);\n const resizeOptions = interaction.target.options.resize;\n\n /*\n * When using the `resizable.square` or `resizable.preserveAspectRatio` options, resizing from one edge\n * will affect another. E.g. with `resizable.square`, resizing to make the right edge larger will make\n * the bottom edge larger by the same amount. We call these 'linked' edges. Any linked edges will depend\n * on the active edges and the edge being interacted with.\n */\n if (resizeOptions.square || resizeOptions.preserveAspectRatio) {\n const linkedEdges = utils.extend({}, interaction.prepared.edges);\n\n linkedEdges.top = linkedEdges.top || (linkedEdges.left && !linkedEdges.bottom);\n linkedEdges.left = linkedEdges.left || (linkedEdges.top && !linkedEdges.right );\n linkedEdges.bottom = linkedEdges.bottom || (linkedEdges.right && !linkedEdges.top );\n linkedEdges.right = linkedEdges.right || (linkedEdges.bottom && !linkedEdges.left );\n\n interaction.prepared._linkedEdges = linkedEdges;\n }\n else {\n interaction.prepared._linkedEdges = null;\n }\n\n // if using `resizable.preserveAspectRatio` option, record aspect ratio at the start of the resize\n if (resizeOptions.preserveAspectRatio) {\n interaction.resizeStartAspectRatio = startRect.width / startRect.height;\n }\n\n interaction.resizeRects = {\n start : startRect,\n current : utils.extend({}, startRect),\n inverted : utils.extend({}, startRect),\n previous : utils.extend({}, startRect),\n delta : {\n left: 0, right : 0, width : 0,\n top : 0, bottom: 0, height: 0,\n },\n };\n\n iEvent.rect = interaction.resizeRects.inverted;\n iEvent.deltaRect = interaction.resizeRects.delta;\n});\n\n// resizemove\nInteractEvent.signals.on('new', function ({ iEvent, phase, interaction }) {\n if (phase !== 'move' || !interaction.prepared.edges) { return; }\n\n const resizeOptions = interaction.target.options.resize;\n const invert = resizeOptions.invert;\n const invertible = invert === 'reposition' || invert === 'negate';\n\n let edges = interaction.prepared.edges;\n\n const start = interaction.resizeRects.start;\n const current = interaction.resizeRects.current;\n const inverted = interaction.resizeRects.inverted;\n const delta = interaction.resizeRects.delta;\n const previous = utils.extend(interaction.resizeRects.previous, inverted);\n const originalEdges = edges;\n\n let dx = iEvent.dx;\n let dy = iEvent.dy;\n\n if (resizeOptions.preserveAspectRatio || resizeOptions.square) {\n // `resize.preserveAspectRatio` takes precedence over `resize.square`\n const startAspectRatio = resizeOptions.preserveAspectRatio\n ? interaction.resizeStartAspectRatio\n : 1;\n\n edges = interaction.prepared._linkedEdges;\n\n if ((originalEdges.left && originalEdges.bottom)\n || (originalEdges.right && originalEdges.top)) {\n dy = -dx / startAspectRatio;\n }\n else if (originalEdges.left || originalEdges.right ) { dy = dx / startAspectRatio; }\n else if (originalEdges.top || originalEdges.bottom) { dx = dy * startAspectRatio; }\n }\n\n // update the 'current' rect without modifications\n if (edges.top ) { current.top += dy; }\n if (edges.bottom) { current.bottom += dy; }\n if (edges.left ) { current.left += dx; }\n if (edges.right ) { current.right += dx; }\n\n if (invertible) {\n // if invertible, copy the current rect\n utils.extend(inverted, current);\n\n if (invert === 'reposition') {\n // swap edge values if necessary to keep width/height positive\n let swap;\n\n if (inverted.top > inverted.bottom) {\n swap = inverted.top;\n\n inverted.top = inverted.bottom;\n inverted.bottom = swap;\n }\n if (inverted.left > inverted.right) {\n swap = inverted.left;\n\n inverted.left = inverted.right;\n inverted.right = swap;\n }\n }\n }\n else {\n // if not invertible, restrict to minimum of 0x0 rect\n inverted.top = Math.min(current.top, start.bottom);\n inverted.bottom = Math.max(current.bottom, start.top);\n inverted.left = Math.min(current.left, start.right);\n inverted.right = Math.max(current.right, start.left);\n }\n\n inverted.width = inverted.right - inverted.left;\n inverted.height = inverted.bottom - inverted.top ;\n\n for (const edge in inverted) {\n delta[edge] = inverted[edge] - previous[edge];\n }\n\n iEvent.edges = interaction.prepared.edges;\n iEvent.rect = inverted;\n iEvent.deltaRect = delta;\n});\n\n/*\\\n * Interactable.resizable\n [ method ]\n *\n * Gets or sets whether resize actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of resize elements\n | var isResizeable = interact('input[type=text]').resizable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on resize events (object makes the Interactable resizable)\n = (object) This Interactable\n | interact(element).resizable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | edges: {\n | top : true, // Use pointer coords to check for resize.\n | left : false, // Disable resizing from left edge.\n | bottom: '.resize-s',// Resize if pointer target matches selector\n | right : handleEl // Resize if pointer target is the given Element\n | },\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height are adjusted at a 1:1 ratio.\n | square: false,\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height maintain the aspect ratio they had when resizing started.\n | preserveAspectRatio: false,\n |\n | // a value of 'none' will limit the resize rect to a minimum of 0x0\n | // 'negate' will allow the rect to have negative width/height\n | // 'reposition' will keep the width/height positive by swapping\n | // the top and bottom edges and/or swapping the left and right edges\n | invert: 'none' || 'negate' || 'reposition'\n |\n | // limit multiple resizes.\n | // See the explanation in the @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n \\*/\nInteractable.prototype.resizable = function (options) {\n if (utils.is.object(options)) {\n this.options.resize.enabled = options.enabled === false? false: true;\n this.setPerAction('resize', options);\n this.setOnEvents('resize', options);\n\n if (/^x$|^y$|^xy$/.test(options.axis)) {\n this.options.resize.axis = options.axis;\n }\n else if (options.axis === null) {\n this.options.resize.axis = defaultOptions.resize.axis;\n }\n\n if (utils.is.bool(options.preserveAspectRatio)) {\n this.options.resize.preserveAspectRatio = options.preserveAspectRatio;\n }\n else if (utils.is.bool(options.square)) {\n this.options.resize.square = options.square;\n }\n\n return this;\n }\n if (utils.is.bool(options)) {\n this.options.resize.enabled = options;\n\n if (!options) {\n this.onresizestart = this.onresizestart = this.onresizeend = null;\n }\n\n return this;\n }\n return this.options.resize;\n};\n\nfunction checkResizeEdge (name, value, page, element, interactableElement, rect, margin) {\n // false, '', undefined, null\n if (!value) { return false; }\n\n // true value, use pointer coords and element rect\n if (value === true) {\n // if dimensions are negative, \"switch\" edges\n const width = utils.is.number(rect.width )? rect.width : rect.right - rect.left;\n const height = utils.is.number(rect.height)? rect.height : rect.bottom - rect.top ;\n\n if (width < 0) {\n if (name === 'left' ) { name = 'right'; }\n else if (name === 'right') { name = 'left' ; }\n }\n if (height < 0) {\n if (name === 'top' ) { name = 'bottom'; }\n else if (name === 'bottom') { name = 'top' ; }\n }\n\n if (name === 'left' ) { return page.x < ((width >= 0? rect.left: rect.right ) + margin); }\n if (name === 'top' ) { return page.y < ((height >= 0? rect.top : rect.bottom) + margin); }\n\n if (name === 'right' ) { return page.x > ((width >= 0? rect.right : rect.left) - margin); }\n if (name === 'bottom') { return page.y > ((height >= 0? rect.bottom: rect.top ) - margin); }\n }\n\n // the remaining checks require an element\n if (!utils.is.element(element)) { return false; }\n\n return utils.is.element(value)\n // the value is an element to use as a resize handle\n ? value === element\n // otherwise check if element matches value as selector\n : utils.matchesUpTo(element, value, interactableElement);\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.resizeAxes = 'xy';\n});\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action }) {\n if (action !== 'resize' || !interaction.resizeAxes) { return; }\n\n const options = interaction.target.options;\n\n if (options.resize.square) {\n if (interaction.resizeAxes === 'y') {\n iEvent.dx = iEvent.dy;\n }\n else {\n iEvent.dy = iEvent.dx;\n }\n iEvent.axes = 'xy';\n }\n else {\n iEvent.axes = interaction.resizeAxes;\n\n if (interaction.resizeAxes === 'x') {\n iEvent.dy = 0;\n }\n else if (interaction.resizeAxes === 'y') {\n iEvent.dx = 0;\n }\n }\n});\n\nactions.resize = resize;\nactions.names.push('resize');\nutils.merge(Interactable.eventTypes, [\n 'resizestart',\n 'resizemove',\n 'resizeinertiastart',\n 'resizeinertiaresume',\n 'resizeend',\n]);\nactions.methodDict.resize = 'resizable';\n\ndefaultOptions.resize = resize.defaults;\n\nmodule.exports = resize;\n","const raf = require('./utils/raf');\nconst getWindow = require('./utils/window').getWindow;\nconst is = require('./utils/is');\nconst domUtils = require('./utils/domUtils');\nconst Interaction = require('./Interaction');\nconst defaultOptions = require('./defaultOptions');\n\nconst autoScroll = {\n defaults: {\n enabled : false,\n container: null, // the item that is scrolled (Window or HTMLElement)\n margin : 60,\n speed : 300, // the scroll speed in pixels per second\n },\n\n interaction: null,\n i: null, // the handle returned by window.setInterval\n x: 0, y: 0, // Direction each pulse is to scroll in\n\n isScrolling: false,\n prevTime: 0,\n\n start: function (interaction) {\n autoScroll.isScrolling = true;\n raf.cancel(autoScroll.i);\n\n autoScroll.interaction = interaction;\n autoScroll.prevTime = new Date().getTime();\n autoScroll.i = raf.request(autoScroll.scroll);\n },\n\n stop: function () {\n autoScroll.isScrolling = false;\n raf.cancel(autoScroll.i);\n },\n\n // scroll the window by the values in scroll.x/y\n scroll: function () {\n const options = autoScroll.interaction.target.options[autoScroll.interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(autoScroll.interaction.element);\n const now = new Date().getTime();\n // change in time in seconds\n const dt = (now - autoScroll.prevTime) / 1000;\n // displacement\n const s = options.speed * dt;\n\n if (s >= 1) {\n if (is.window(container)) {\n container.scrollBy(autoScroll.x * s, autoScroll.y * s);\n }\n else if (container) {\n container.scrollLeft += autoScroll.x * s;\n container.scrollTop += autoScroll.y * s;\n }\n\n autoScroll.prevTime = now;\n }\n\n if (autoScroll.isScrolling) {\n raf.cancel(autoScroll.i);\n autoScroll.i = raf.request(autoScroll.scroll);\n }\n },\n check: function (interactable, actionName) {\n const options = interactable.options;\n\n return options[actionName].autoScroll && options[actionName].autoScroll.enabled;\n },\n onInteractionMove: function ({ interaction, pointer }) {\n if (!(interaction.interacting()\n && autoScroll.check(interaction.target, interaction.prepared.name))) {\n return;\n }\n\n if (interaction.simulation) {\n autoScroll.x = autoScroll.y = 0;\n return;\n }\n\n let top;\n let right;\n let bottom;\n let left;\n\n const options = interaction.target.options[interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(interaction.element);\n\n if (is.window(container)) {\n left = pointer.clientX < autoScroll.margin;\n top = pointer.clientY < autoScroll.margin;\n right = pointer.clientX > container.innerWidth - autoScroll.margin;\n bottom = pointer.clientY > container.innerHeight - autoScroll.margin;\n }\n else {\n const rect = domUtils.getElementClientRect(container);\n\n left = pointer.clientX < rect.left + autoScroll.margin;\n top = pointer.clientY < rect.top + autoScroll.margin;\n right = pointer.clientX > rect.right - autoScroll.margin;\n bottom = pointer.clientY > rect.bottom - autoScroll.margin;\n }\n\n autoScroll.x = (right ? 1: left? -1: 0);\n autoScroll.y = (bottom? 1: top? -1: 0);\n\n if (!autoScroll.isScrolling) {\n // set the autoScroll properties to those of the target\n autoScroll.margin = options.margin;\n autoScroll.speed = options.speed;\n\n autoScroll.start(interaction);\n }\n },\n};\n\nInteraction.signals.on('stop-active', function () {\n autoScroll.stop();\n});\n\nInteraction.signals.on('action-move', autoScroll.onInteractionMove);\n\ndefaultOptions.perAction.autoScroll = autoScroll.defaults;\n\nmodule.exports = autoScroll;\n","const Interactable = require('../Interactable');\nconst actions = require('../actions/base');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.ignoreFrom\n [ method ]\n *\n * If the target of the `mousedown`, `pointerdown` or `touchstart`\n * event or any of it's parents match the given CSS selector or\n * Element, no drag/resize/gesture is started.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to not ignore any elements\n = (string | Element | object) The current ignoreFrom value or this Interactable\n **\n | interact(element, { ignoreFrom: document.getElementById('no-action') });\n | // or\n | interact(element).ignoreFrom('input, textarea, a');\n\\*/\nInteractable.prototype.ignoreFrom = function (newValue) {\n return this._backCompatOption('ignoreFrom', newValue);\n};\n\n/*\\\n * Interactable.allowFrom\n [ method ]\n *\n * A drag/resize/gesture is started only If the target of the\n * `mousedown`, `pointerdown` or `touchstart` event or any of it's\n * parents match the given CSS selector or Element.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to allow from any element\n = (string | Element | object) The current allowFrom value or this Interactable\n **\n | interact(element, { allowFrom: document.getElementById('drag-handle') });\n | // or\n | interact(element).allowFrom('.handle');\n\\*/\nInteractable.prototype.allowFrom = function (newValue) {\n return this._backCompatOption('allowFrom', newValue);\n};\n\nInteractable.prototype.testIgnore = function (ignoreFrom, interactableElement, element) {\n if (!ignoreFrom || !is.element(element)) { return false; }\n\n if (is.string(ignoreFrom)) {\n return domUtils.matchesUpTo(element, ignoreFrom, interactableElement);\n }\n else if (is.element(ignoreFrom)) {\n return domUtils.nodeContains(ignoreFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testAllow = function (allowFrom, interactableElement, element) {\n if (!allowFrom) { return true; }\n\n if (!is.element(element)) { return false; }\n\n if (is.string(allowFrom)) {\n return domUtils.matchesUpTo(element, allowFrom, interactableElement);\n }\n else if (is.element(allowFrom)) {\n return domUtils.nodeContains(allowFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testIgnoreAllow = function (options, interactableElement, eventTarget) {\n return (!this.testIgnore(options.ignoreFrom, interactableElement, eventTarget)\n && this.testAllow(options.allowFrom, interactableElement, eventTarget));\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (event.buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\n","const interact = require('../interact');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst actions = require('../actions/base');\nconst defaultOptions = require('../defaultOptions');\nconst browser = require('../utils/browser');\nconst scope = require('../scope');\nconst utils = require('../utils');\nconst signals = require('../utils/Signals').new();\n\nrequire('./InteractableMethods');\n\nconst autoStart = {\n signals,\n withinInteractionLimit,\n // Allow this many interactions to happen simultaneously\n maxInteractions: Infinity,\n defaults: {\n perAction: {\n manualStart: false,\n max: Infinity,\n maxPerElement: 1,\n allowFrom: null,\n ignoreFrom: null,\n },\n },\n setActionDefaults: function (action) {\n utils.extend(action.defaults, autoStart.defaults.perAction);\n },\n};\n\n// set cursor style on mousedown\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget }) {\n if (interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\n// set cursor style on mousemove\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget }) {\n if (!interaction.mouse\n || interaction.pointerIsDown\n || interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\nInteraction.signals.on('move', function (arg) {\n const { interaction, event } = arg;\n\n if (!interaction.pointerIsDown\n || interaction.interacting()\n || !interaction.pointerWasMoved\n || !interaction.prepared.name) {\n return;\n }\n\n signals.fire('before-start', arg);\n\n const target = interaction.target;\n\n if (interaction.prepared.name && target) {\n // check manualStart and interaction limit\n if (target.options[interaction.prepared.name].manualStart\n || !withinInteractionLimit(target, interaction.element, interaction.prepared)) {\n interaction.stop(event);\n }\n else {\n interaction.start(interaction.prepared, target, interaction.element);\n }\n }\n});\n\n// Check if the current target supports the action.\n// If so, return the validated action. Otherwise, return null\nfunction validateAction (action, interactable, element, eventTarget) {\n if (utils.is.object(action)\n && interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget)\n && interactable.options[action.name].enabled\n && withinInteractionLimit(interactable, element, action)) {\n return action;\n }\n\n return null;\n}\n\nfunction validateSelector (interaction, pointer, event, matches, matchElements, eventTarget) {\n for (let i = 0, len = matches.length; i < len; i++) {\n const match = matches[i];\n const matchElement = matchElements[i];\n const action = validateAction(match.getAction(pointer, event, interaction, matchElement),\n match,\n matchElement,\n eventTarget);\n\n if (action) {\n return {\n action,\n target: match,\n element: matchElement,\n };\n }\n }\n\n return {};\n}\n\nfunction getActionInfo (interaction, pointer, event, eventTarget) {\n let matches = [];\n let matchElements = [];\n\n let element = eventTarget;\n let action = null;\n\n function pushMatches (interactable, selector, context) {\n const elements = (browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined);\n\n if (utils.matchesSelector(element, selector, elements)) {\n\n matches.push(interactable);\n matchElements.push(element);\n }\n }\n\n while (utils.is.element(element)) {\n matches = [];\n matchElements = [];\n\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && (action = validateAction(elementInteractable.getAction(pointer, event, interaction, element, eventTarget),\n elementInteractable,\n element,\n eventTarget))\n && !elementInteractable.options[action.name].manualStart) {\n return {\n element,\n action,\n target: elementInteractable,\n };\n }\n else {\n scope.interactables.forEachSelector(pushMatches, element);\n\n const actionInfo = validateSelector(interaction, pointer, event, matches, matchElements, eventTarget);\n\n if (actionInfo.action\n && !actionInfo.target.options[actionInfo.action.name].manualStart) {\n return actionInfo;\n }\n }\n\n element = utils.parentNode(element);\n }\n\n return {};\n}\n\nfunction prepare (interaction, { action, target, element }) {\n action = action || {};\n\n if (interaction.target && interaction.target.options.styleCursor) {\n interaction.target._doc.documentElement.style.cursor = '';\n }\n\n interaction.target = target;\n interaction.element = element;\n utils.copyAction(interaction.prepared, action);\n\n if (target && target.options.styleCursor) {\n const cursor = action? actions[action.name].getCursor(action) : '';\n interaction.target._doc.documentElement.style.cursor = cursor;\n }\n\n signals.fire('prepared', { interaction: interaction });\n}\n\nInteraction.signals.on('stop', function ({ interaction }) {\n const target = interaction.target;\n\n if (target && target.options.styleCursor) {\n target._doc.documentElement.style.cursor = '';\n }\n});\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (utils.is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (utils.is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n const buttons = event.buttons || ({\n 0: 1,\n 1: 4,\n 3: 8,\n 4: 16,\n })[event.button];\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\nfunction withinInteractionLimit (interactable, element, action) {\n const options = interactable.options;\n const maxActions = options[action.name].max;\n const maxPerElement = options[action.name].maxPerElement;\n let activeInteractions = 0;\n let targetCount = 0;\n let targetElementCount = 0;\n\n // no actions if any of these values == 0\n if (!(maxActions && maxPerElement && autoStart.maxInteractions)) { return; }\n\n for (let i = 0, len = scope.interactions.length; i < len; i++) {\n const interaction = scope.interactions[i];\n const otherAction = interaction.prepared.name;\n\n if (!interaction.interacting()) { continue; }\n\n activeInteractions++;\n\n if (activeInteractions >= autoStart.maxInteractions) {\n return false;\n }\n\n if (interaction.target !== interactable) { continue; }\n\n targetCount += (otherAction === action.name)|0;\n\n if (targetCount >= maxActions) {\n return false;\n }\n\n if (interaction.element === element) {\n targetElementCount++;\n\n if (otherAction !== action.name || targetElementCount >= maxPerElement) {\n return false;\n }\n }\n }\n\n return autoStart.maxInteractions > 0;\n}\n\n/*\\\n * interact.maxInteractions\n [ method ]\n **\n * Returns or sets the maximum number of concurrent interactions allowed.\n * By default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables\n * and elements, you need to enable it in the draggable, resizable and\n * gesturable `'max'` and `'maxPerElement'` options.\n **\n - newValue (number) #optional Any number. newValue <= 0 means no interactions.\n\\*/\ninteract.maxInteractions = function (newValue) {\n if (utils.is.number(newValue)) {\n autoStart.maxInteractions = newValue;\n\n return this;\n }\n\n return autoStart.maxInteractions;\n};\n\nInteractable.settingsMethods.push('styleCursor');\nInteractable.settingsMethods.push('actionChecker');\nInteractable.settingsMethods.push('ignoreFrom');\nInteractable.settingsMethods.push('allowFrom');\n\ndefaultOptions.base.actionChecker = null;\ndefaultOptions.base.styleCursor = true;\n\nutils.extend(defaultOptions.perAction, autoStart.defaults.perAction);\n\nmodule.exports = autoStart;\n","const autoStart = require('./base');\nconst Interaction = require('../Interaction');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.delayTimer = null;\n});\n\nautoStart.signals.on('prepared', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.delayTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.target, interaction.element);\n }, delay);\n }\n});\n\nInteraction.signals.on('move', function ({ interaction, duplicate }) {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.delayTimer);\n }\n});\n\n// prevent regular down->move autoStart\nautoStart.signals.on('before-start', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.prepared.name = null;\n }\n});\n","const autoStart = require('./base');\nconst scope = require('../scope');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\n\nconst { matchesSelector, parentNode } = require('../utils/domUtils');\n\nautoStart.setActionDefaults(require('../actions/drag'));\n\nautoStart.signals.on('before-start', function ({ interaction, eventTarget, dx, dy }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // check if a drag is in the correct axis\n const absX = Math.abs(dx);\n const absY = Math.abs(dy);\n const options = interaction.target.options.drag;\n const startAxis = options.startAxis;\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy');\n\n interaction.prepared.axis = options.lockAxis === 'start'\n ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n : options.lockAxis;\n\n // if the movement isn't in the startAxis of the interactable\n if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) {\n // cancel the prepared action\n interaction.prepared.name = null;\n\n // then try to get a drag from another ineractable\n\n if (!interaction.prepared.name) {\n\n let element = eventTarget;\n\n const getDraggable = function (interactable, selector, context) {\n const elements = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n if (interactable === interaction.target) { return; }\n\n if (!options.manualStart\n && !interactable.testIgnoreAllow(options, element, eventTarget)\n && matchesSelector(element, selector, elements)) {\n\n const action = interactable.getAction(interaction.downPointer,\n interaction.downEvent,\n interaction,\n element);\n\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, interactable)\n && autoStart.validateAction(action, interactable, element, eventTarget)) {\n\n return interactable;\n }\n }\n };\n\n let action = null;\n\n // check all interactables\n while (is.element(element)) {\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && elementInteractable !== interaction.target\n && !elementInteractable.options.drag.manualStart) {\n\n action = elementInteractable.getAction(interaction.downPointer, interaction.downEvent, interaction, element);\n }\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, elementInteractable)) {\n\n interaction.prepared.name = 'drag';\n interaction.target = elementInteractable;\n interaction.element = element;\n break;\n }\n\n const selectorInteractable = scope.interactables.forEachSelector(getDraggable, element);\n\n if (selectorInteractable) {\n interaction.prepared.name = 'drag';\n interaction.target = selectorInteractable;\n interaction.element = element;\n break;\n }\n\n element = parentNode(element);\n }\n }\n }\n});\n\nfunction checkStartAxis (startAxis, interactable) {\n if (!interactable) { return false; }\n\n const thisAxis = interactable.options.drag.startAxis;\n\n return (startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis);\n}\n","require('./base').setActionDefaults(require('../actions/gesture'));\n","require('./base').setActionDefaults(require('../actions/resize'));\n","module.exports = {\n base: {\n accept : null,\n preventDefault: 'auto',\n deltaSource : 'page',\n },\n\n perAction: {\n origin: { x: 0, y: 0 },\n\n // only allow left button by default\n // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n mouseButtons: 1,\n\n inertia: {\n enabled : false,\n resistance : 10, // the lambda in exponential decay\n minSpeed : 100, // target speed must be above this for inertia to start\n endSpeed : 10, // the speed at which inertia is slow enough to stop\n allowResume : true, // allow resuming an action in inertia phase\n smoothEndDuration: 300, // animate to snap/restrict endOnly if there's no inertia\n },\n },\n};\n","/* browser entry point */\n\n// Legacy browser support\nrequire('./legacyBrowsers');\n\n// inertia\nrequire('./inertia');\n\n// modifiers\nrequire('./modifiers/snap');\nrequire('./modifiers/restrict');\n\n// pointerEvents\nrequire('./pointerEvents/base');\nrequire('./pointerEvents/holdRepeat');\nrequire('./pointerEvents/interactableTargets');\n\n// delay\nrequire('./autoStart/delay');\n\n// actions\nrequire('./actions/gesture');\nrequire('./actions/resize');\nrequire('./actions/drag');\nrequire('./actions/drop');\n\n// load these modifiers after resize is loaded\nrequire('./modifiers/snapSize');\nrequire('./modifiers/restrictEdges');\nrequire('./modifiers/restrictSize');\n\n// autoStart actions\nrequire('./autoStart/gesture');\nrequire('./autoStart/resize');\nrequire('./autoStart/drag');\n\n// Interactable preventDefault setting\nrequire('./interactablePreventDefault.js');\n\n// autoScroll\nrequire('./autoScroll');\n\n// export interact\nmodule.exports = require('./interact');\n","const InteractEvent = require('./InteractEvent');\nconst Interaction = require('./Interaction');\nconst modifiers = require('./modifiers');\nconst utils = require('./utils');\nconst animationFrame = require('./utils/raf');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.inertiaStatus = {\n active : false,\n smoothEnd : false,\n allowResume: false,\n\n startEvent: null,\n upCoords : {},\n\n xe: 0, ye: 0,\n sx: 0, sy: 0,\n\n t0: 0,\n vx0: 0, vys: 0,\n duration: 0,\n\n lambda_v0: 0,\n one_ve_v0: 0,\n i : null,\n };\n\n interaction.boundInertiaFrame = () => inertiaFrame .apply(interaction);\n interaction.boundSmoothEndFrame = () => smoothEndFrame.apply(interaction);\n});\n\nInteraction.signals.on('down', function ({ interaction, event, pointer, eventTarget }) {\n const status = interaction.inertiaStatus;\n\n // Check if the down event hits the current inertia target\n if (status.active) {\n let element = eventTarget;\n\n // climb up the DOM tree from the event target\n while (utils.is.element(element)) {\n\n // if interaction element is the current inertia target element\n if (element === interaction.element) {\n // stop inertia\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n\n // update pointers to the down event's coordinates\n interaction.updatePointer(pointer);\n utils.setCoords(interaction.curCoords, interaction.pointers);\n\n // fire appropriate signals\n const signalArg = { interaction };\n Interaction.signals.fire('before-action-move', signalArg);\n Interaction.signals.fire('action-resume' , signalArg);\n\n // fire a reume event\n const resumeEvent = new InteractEvent(interaction,\n event,\n interaction.prepared.name,\n 'inertiaresume',\n interaction.element);\n\n interaction.target.fire(resumeEvent);\n interaction.prevEvent = resumeEvent;\n modifiers.resetStatuses(interaction.modifierStatuses);\n\n utils.copyCoords(interaction.prevCoords, interaction.curCoords);\n break;\n }\n\n element = utils.parentNode(element);\n }\n }\n});\n\nInteraction.signals.on('up', function ({ interaction, event }) {\n const status = interaction.inertiaStatus;\n\n if (!interaction.interacting() || status.active) { return; }\n\n const target = interaction.target;\n const options = target && target.options;\n const inertiaOptions = options && interaction.prepared.name && options[interaction.prepared.name].inertia;\n\n const now = new Date().getTime();\n const statuses = {};\n const page = utils.extend({}, interaction.curCoords.page);\n const pointerSpeed = interaction.pointerDelta.client.speed;\n\n let smoothEnd = false;\n let modifierResult;\n\n // check if inertia should be started\n const inertiaPossible = (inertiaOptions && inertiaOptions.enabled\n && interaction.prepared.name !== 'gesture'\n && event !== status.startEvent);\n\n const inertia = (inertiaPossible\n && (now - interaction.curCoords.timeStamp) < 50\n && pointerSpeed > inertiaOptions.minSpeed\n && pointerSpeed > inertiaOptions.endSpeed);\n\n const modifierArg = {\n interaction,\n pageCoords: page,\n statuses,\n preEnd: true,\n requireEndOnly: true,\n };\n\n // smoothEnd\n if (inertiaPossible && !inertia) {\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n if (modifierResult.shouldMove && modifierResult.locked) {\n smoothEnd = true;\n }\n }\n\n if (!(inertia || smoothEnd)) { return; }\n\n utils.copyCoords(status.upCoords, interaction.curCoords);\n\n interaction.pointers[0] = status.startEvent =\n new InteractEvent(interaction, event, interaction.prepared.name, 'inertiastart', interaction.element);\n\n status.t0 = now;\n\n status.active = true;\n status.allowResume = inertiaOptions.allowResume;\n interaction.simulation = status;\n\n target.fire(status.startEvent);\n\n if (inertia) {\n status.vx0 = interaction.pointerDelta.client.vx;\n status.vy0 = interaction.pointerDelta.client.vy;\n status.v0 = pointerSpeed;\n\n calcInertia(interaction, status);\n\n utils.extend(page, interaction.curCoords.page);\n\n page.x += status.xe;\n page.y += status.ye;\n\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n status.modifiedXe += modifierResult.dx;\n status.modifiedYe += modifierResult.dy;\n\n status.i = animationFrame.request(interaction.boundInertiaFrame);\n }\n else {\n status.smoothEnd = true;\n status.xe = modifierResult.dx;\n status.ye = modifierResult.dy;\n\n status.sx = status.sy = 0;\n\n status.i = animationFrame.request(interaction.boundSmoothEndFrame);\n }\n});\n\nInteraction.signals.on('stop-active', function ({ interaction }) {\n const status = interaction.inertiaStatus;\n\n if (status.active) {\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n }\n});\n\nfunction calcInertia (interaction, status) {\n const inertiaOptions = interaction.target.options[interaction.prepared.name].inertia;\n const lambda = inertiaOptions.resistance;\n const inertiaDur = -Math.log(inertiaOptions.endSpeed / status.v0) / lambda;\n\n status.x0 = interaction.prevEvent.pageX;\n status.y0 = interaction.prevEvent.pageY;\n status.t0 = status.startEvent.timeStamp / 1000;\n status.sx = status.sy = 0;\n\n status.modifiedXe = status.xe = (status.vx0 - inertiaDur) / lambda;\n status.modifiedYe = status.ye = (status.vy0 - inertiaDur) / lambda;\n status.te = inertiaDur;\n\n status.lambda_v0 = lambda / status.v0;\n status.one_ve_v0 = 1 - inertiaOptions.endSpeed / status.v0;\n}\n\nfunction inertiaFrame () {\n updateInertiaCoords(this);\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n\n const status = this.inertiaStatus;\n const options = this.target.options[this.prepared.name].inertia;\n const lambda = options.resistance;\n const t = new Date().getTime() / 1000 - status.t0;\n\n if (t < status.te) {\n\n const progress = 1 - (Math.exp(-lambda * t) - status.lambda_v0) / status.one_ve_v0;\n\n if (status.modifiedXe === status.xe && status.modifiedYe === status.ye) {\n status.sx = status.xe * progress;\n status.sy = status.ye * progress;\n }\n else {\n const quadPoint = utils.getQuadraticCurvePoint(0, 0,\n status.xe,\n status.ye,\n status.modifiedXe,\n status.modifiedYe,\n progress);\n\n status.sx = quadPoint.x;\n status.sy = quadPoint.y;\n }\n\n this.doMove();\n\n status.i = animationFrame.request(this.boundInertiaFrame);\n }\n else {\n status.sx = status.modifiedXe;\n status.sy = status.modifiedYe;\n\n this.doMove();\n this.end(status.startEvent);\n status.active = false;\n this.simulation = null;\n }\n\n utils.copyCoords(this.prevCoords, this.curCoords);\n}\n\nfunction smoothEndFrame () {\n updateInertiaCoords(this);\n\n const status = this.inertiaStatus;\n const t = new Date().getTime() - status.t0;\n const duration = this.target.options[this.prepared.name].inertia.smoothEndDuration;\n\n if (t < duration) {\n status.sx = utils.easeOutQuad(t, 0, status.xe, duration);\n status.sy = utils.easeOutQuad(t, 0, status.ye, duration);\n\n this.pointerMove(status.startEvent, status.startEvent);\n\n status.i = animationFrame.request(this.boundSmoothEndFrame);\n }\n else {\n status.sx = status.xe;\n status.sy = status.ye;\n\n this.pointerMove(status.startEvent, status.startEvent);\n this.end(status.startEvent);\n\n status.smoothEnd =\n status.active = false;\n this.simulation = null;\n }\n}\n\nfunction updateInertiaCoords (interaction) {\n const status = interaction.inertiaStatus;\n\n // return if inertia isn't running\n if (!status.active) { return; }\n\n const pageUp = status.upCoords.page;\n const clientUp = status.upCoords.client;\n\n utils.setCoords(interaction.curCoords, [ {\n pageX : pageUp.x + status.sx,\n pageY : pageUp.y + status.sy,\n clientX: clientUp.x + status.sx,\n clientY: clientUp.y + status.sy,\n } ]);\n}\n","const browser = require('./utils/browser');\nconst events = require('./utils/events');\nconst utils = require('./utils');\nconst scope = require('./scope');\nconst Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\n\nconst globalEvents = {};\n\n/*\\\n * interact\n [ method ]\n *\n * The methods of this variable can be used to set elements as\n * interactables and also to change various default settings.\n *\n * Calling it as a function and passing an element or a valid CSS selector\n * string returns an Interactable object which has various methods to\n * configure it.\n *\n - element (Element | string) The HTML or SVG Element to interact with or CSS selector\n = (object) An @Interactable\n *\n > Usage\n | interact('#draggable').draggable(true);\n |\n | var rectables = interact('rect');\n | rectables\n | .gesturable(true)\n | .on('gesturemove', function (event) {\n | // ...\n | });\n\\*/\nfunction interact (element, options) {\n let interactable = scope.interactables.get(element, options);\n\n if (!interactable) {\n interactable = new Interactable(element, options);\n interactable.events.global = globalEvents;\n }\n\n return interactable;\n}\n\n/*\\\n * interact.isSet\n [ method ]\n *\n * Check if an element has been set\n - element (Element) The Element being searched for\n = (boolean) Indicates if the element or CSS selector was previously passed to interact\n\\*/\ninteract.isSet = function (element, options) {\n return scope.interactables.indexOfElement(element, options && options.context) !== -1;\n};\n\n/*\\\n * interact.on\n [ method ]\n *\n * Adds a global listener for an InteractEvent or adds a DOM event to\n * `document`\n *\n - type (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) interact\n\\*/\ninteract.on = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.on(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.on(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n // if it is an InteractEvent type, add listener to globalEvents\n if (utils.contains(Interactable.eventTypes, type)) {\n // if this type of event was never bound\n if (!globalEvents[type]) {\n globalEvents[type] = [listener];\n }\n else {\n globalEvents[type].push(listener);\n }\n }\n // If non InteractEvent type, addEventListener to document\n else {\n events.add(scope.document, type, listener, { options });\n }\n\n return interact;\n};\n\n/*\\\n * interact.off\n [ method ]\n *\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n - type (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) interact\n \\*/\ninteract.off = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.off(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.off(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n if (!utils.contains(Interactable.eventTypes, type)) {\n events.remove(scope.document, type, listener, options);\n }\n else {\n let index;\n\n if (type in globalEvents\n && (index = utils.indexOf(globalEvents[type], listener)) !== -1) {\n globalEvents[type].splice(index, 1);\n }\n }\n\n return interact;\n};\n\n/*\\\n * interact.debug\n [ method ]\n *\n * Returns an object which exposes internal data\n = (object) An object with properties that outline the current state and expose internal functions and variables\n\\*/\ninteract.debug = function () {\n return scope;\n};\n\n// expose the functions used to calculate multi-touch properties\ninteract.getPointerAverage = utils.pointerAverage;\ninteract.getTouchBBox = utils.touchBBox;\ninteract.getTouchDistance = utils.touchDistance;\ninteract.getTouchAngle = utils.touchAngle;\n\ninteract.getElementRect = utils.getElementRect;\ninteract.getElementClientRect = utils.getElementClientRect;\ninteract.matchesSelector = utils.matchesSelector;\ninteract.closest = utils.closest;\n\n/*\\\n * interact.supportsTouch\n [ method ]\n *\n = (boolean) Whether or not the browser supports touch input\n\\*/\ninteract.supportsTouch = function () {\n return browser.supportsTouch;\n};\n\n/*\\\n * interact.supportsPointerEvent\n [ method ]\n *\n = (boolean) Whether or not the browser supports PointerEvents\n\\*/\ninteract.supportsPointerEvent = function () {\n return browser.supportsPointerEvent;\n};\n\n/*\\\n * interact.stop\n [ method ]\n *\n * Cancels all interactions (end events are not fired)\n *\n - event (Event) An event on which to call preventDefault()\n = (object) interact\n\\*/\ninteract.stop = function (event) {\n for (let i = scope.interactions.length - 1; i >= 0; i--) {\n scope.interactions[i].stop(event);\n }\n\n return interact;\n};\n\n/*\\\n * interact.pointerMoveTolerance\n [ method ]\n * Returns or sets the distance the pointer must be moved before an action\n * sequence occurs. This also affects tolerance for tap events.\n *\n - newValue (number) #optional The movement from the start position must be greater than this value\n = (number | Interactable) The current setting or interact\n\\*/\ninteract.pointerMoveTolerance = function (newValue) {\n if (utils.is.number(newValue)) {\n Interaction.pointerMoveTolerance = newValue;\n\n return this;\n }\n\n return Interaction.pointerMoveTolerance;\n};\n\ninteract.addDocument = scope.addDocument;\ninteract.removeDocument = scope.removeDocument;\n\nscope.interact = interact;\n\nmodule.exports = interact;\n","const Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\nconst scope = require('./scope');\nconst is = require('./utils/is');\nconst events = require('./utils/events');\n\nconst { nodeContains, matchesSelector } = require('./utils/domUtils');\n\n/*\\\n * Interactable.preventDefault\n [ method ]\n *\n * Returns or sets whether to prevent the browser's default behaviour\n * in response to pointer events. Can be set to:\n * - `'always'` to always prevent\n * - `'never'` to never prevent\n * - `'auto'` to let interact.js try to determine what would be best\n *\n - newValue (string) #optional `true`, `false` or `'auto'`\n = (string | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.preventDefault = function (newValue) {\n if (/^(always|never|auto)$/.test(newValue)) {\n this.options.preventDefault = newValue;\n return this;\n }\n\n if (is.bool(newValue)) {\n this.options.preventDefault = newValue? 'always' : 'never';\n return this;\n }\n\n return this.options.preventDefault;\n};\n\nInteractable.prototype.checkAndPreventDefault = function (event) {\n const setting = this.options.preventDefault;\n\n if (setting === 'never') { return; }\n\n if (setting === 'always') {\n event.preventDefault();\n return;\n }\n\n // setting === 'auto'\n\n // don't preventDefault if the browser supports passiveEvents\n // CSS touch-action and user-selecct should be used instead\n if (events.supportsOptions) {\n return;\n }\n\n // don't preventDefault of pointerdown events\n if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) {\n return;\n }\n\n // don't preventDefault on editable elements\n if (is.element(event.target)\n && matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) {\n return;\n }\n\n event.preventDefault();\n};\n\nfunction onInteractionEvent ({ interaction, event }) {\n if (interaction.target) {\n interaction.target.checkAndPreventDefault(event);\n }\n}\n\nfor (const eventSignal of ['down', 'move', 'up', 'cancel']) {\n Interaction.signals.on(eventSignal, onInteractionEvent);\n}\n\n// prevent native HTML5 drag on interact.js target elements\nInteraction.docEvents.dragstart = function preventNativeDrag (event) {\n for (const interaction of scope.interactions) {\n\n if (interaction.element\n && (interaction.element === event.target\n || nodeContains(interaction.element, event.target))) {\n\n interaction.target.checkAndPreventDefault(event);\n return;\n }\n }\n};\n","const scope = require('./scope');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst iFinder = require('./utils/interactionFinder');\nconst pointerEvents = require('./pointerEvents/base');\n\nconst { window } = require('./utils/window');\n\nconst toString = Object.prototype.toString;\n\nif (!window.Array.isArray) {\n window.Array.isArray = function (obj) {\n return toString.call(obj) === '[object Array]';\n };\n}\n\nif (!String.prototype.trim) {\n String.prototype.trim = function () {\n return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n };\n}\n\n// http://www.quirksmode.org/dom/events/click.html\n// >Events leading to dblclick\n//\n// IE8 doesn't fire down event before dblclick.\n// This workaround tries to fire a tap and doubletap after dblclick\nfunction onIE8Dblclick (event) {\n const eventTarget = event.target;\n const interaction = iFinder.search(event, event.type, eventTarget);\n\n if (!interaction) { return; }\n\n if (interaction.prevTap\n && event.clientX === interaction.prevTap.clientX\n && event.clientY === interaction.prevTap.clientY\n && eventTarget === interaction.prevTap.target) {\n\n interaction.downTargets[0] = eventTarget;\n interaction.downTimes [0] = new Date().getTime();\n\n pointerEvents.fire({\n interaction,\n event,\n eventTarget,\n pointer: event,\n type: 'tap',\n });\n }\n}\n\nif (browser.isIE8) {\n const selectFix = function (event) {\n for (const interaction of scope.interactions) {\n if (interaction.interacting()) {\n interaction.target.checkAndPreventDefault(event);\n }\n }\n };\n\n const onDocIE8 = function onDocIE8 ({ doc, win }, signalName) {\n const eventMethod = signalName.indexOf('listen') === 0\n ? events.add : events.remove;\n\n // For IE's lack of Event#preventDefault\n eventMethod(doc, 'selectstart', selectFix);\n\n if (pointerEvents) {\n eventMethod(doc, 'dblclick', onIE8Dblclick);\n }\n };\n\n scope.signals.on('add-document' , onDocIE8);\n scope.signals.on('remove-document', onDocIE8);\n}\n\nmodule.exports = null;\n","const InteractEvent = require('../InteractEvent');\nconst Interaction = require('../Interaction');\nconst extend = require('../utils/extend');\n\nconst modifiers = {\n names: [],\n\n setOffsets: function (arg) {\n const { interaction, pageCoords: page } = arg;\n const { target, element, startOffset } = interaction;\n const rect = target.getRect(element);\n\n if (rect) {\n startOffset.left = page.x - rect.left;\n startOffset.top = page.y - rect.top;\n\n startOffset.right = rect.right - page.x;\n startOffset.bottom = rect.bottom - page.y;\n\n if (!('width' in rect)) { rect.width = rect.right - rect.left; }\n if (!('height' in rect)) { rect.height = rect.bottom - rect.top ; }\n }\n else {\n startOffset.left = startOffset.top = startOffset.right = startOffset.bottom = 0;\n }\n\n arg.rect = rect;\n arg.interactable = target;\n arg.element = element;\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n\n arg.options = target.options[interaction.prepared.name][modifierName];\n\n if (!arg.options) {\n continue;\n }\n\n interaction.modifierOffsets[modifierName] = modifiers[modifierName].setOffset(arg);\n }\n },\n\n setAll: function (arg) {\n const { interaction, statuses, preEnd, requireEndOnly } = arg;\n const coords = extend({}, arg.pageCoords);\n const result = {\n dx: 0,\n dy: 0,\n changed: false,\n locked: false,\n shouldMove: true,\n };\n\n for (const modifierName of modifiers.names) {\n const modifier = modifiers[modifierName];\n const options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!shouldDo(options, preEnd, requireEndOnly)) { continue; }\n\n arg.status = arg.status = statuses[modifierName];\n arg.options = options;\n arg.offset = arg.interaction.modifierOffsets[modifierName];\n\n modifier.set(arg);\n\n if (arg.status.locked) {\n coords.x += arg.status.dx;\n coords.y += arg.status.dy;\n\n result.dx += arg.status.dx;\n result.dy += arg.status.dy;\n\n result.locked = true;\n }\n }\n\n // a move should be fired if:\n // - there are no modifiers enabled,\n // - no modifiers are \"locked\" i.e. have changed the pointer's coordinates, or\n // - the locked coords have changed since the last pointer move\n result.shouldMove = !arg.status || !result.locked || arg.status.changed;\n\n return result;\n },\n\n resetStatuses: function (statuses) {\n for (const modifierName of modifiers.names) {\n const status = statuses[modifierName] || {};\n\n status.dx = status.dy = 0;\n status.modifiedX = status.modifiedY = NaN;\n status.locked = false;\n status.changed = true;\n\n statuses[modifierName] = status;\n }\n\n return statuses;\n },\n\n start: function ({ interaction }, signalName) {\n const arg = {\n interaction,\n pageCoords: (signalName === 'action-resume' ?\n interaction.curCoords : interaction.startCoords).page,\n startOffset: interaction.startOffset,\n statuses: interaction.modifierStatuses,\n preEnd: false,\n requireEndOnly: false,\n };\n\n modifiers.setOffsets(arg);\n modifiers.resetStatuses(arg.statuses);\n\n arg.pageCoords = extend({}, interaction.startCoords.page);\n interaction.modifierResult = modifiers.setAll(arg);\n },\n};\n\nInteraction.signals.on('new', function (interaction) {\n interaction.startOffset = { left: 0, right: 0, top: 0, bottom: 0 };\n interaction.modifierOffsets = {};\n interaction.modifierStatuses = modifiers.resetStatuses({});\n interaction.modifierResult = null;\n});\n\nInteraction.signals.on('action-start' , modifiers.start);\nInteraction.signals.on('action-resume', modifiers.start);\n\nInteraction.signals.on('before-action-move', function ({ interaction, preEnd, interactingBeforeMove }) {\n const modifierResult = modifiers.setAll({\n interaction,\n preEnd,\n pageCoords: interaction.curCoords.page,\n statuses: interaction.modifierStatuses,\n requireEndOnly: false,\n });\n\n // don't fire an action move if a modifier would keep the event in the same\n // cordinates as before\n if (!modifierResult.shouldMove && interactingBeforeMove) {\n interaction._dontFireMove = true;\n }\n\n interaction.modifierResult = modifierResult;\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n for (let i = 0; i < modifiers.names.length; i++) {\n const options = interaction.target.options[interaction.prepared.name][modifiers.names[i]];\n\n // if the endOnly option is true for any modifier\n if (shouldDo(options, true, true)) {\n // fire a move event at the modified coordinates\n interaction.doMove({ event, preEnd: true });\n break;\n }\n }\n});\n\nInteractEvent.signals.on('set-xy', function (arg) {\n const { iEvent, interaction } = arg;\n const modifierArg = extend({}, arg);\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n modifierArg.options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!modifierArg.options) {\n continue;\n }\n\n const modifier = modifiers[modifierName];\n\n modifierArg.status = interaction.modifierStatuses[modifierName];\n\n iEvent[modifierName] = modifier.modifyCoords(modifierArg);\n }\n});\n\nfunction shouldDo (options, preEnd, requireEndOnly) {\n return (options && options.enabled\n && (preEnd || !options.endOnly)\n && (!requireEndOnly || options.endOnly));\n}\n\nmodule.exports = modifiers;\n","const modifiers = require('./index');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst restrict = {\n defaults: {\n enabled : false,\n endOnly : false,\n restriction: null,\n elementRect: null,\n },\n\n setOffset: function ({ rect, startOffset, options }) {\n const elementRect = options && options.elementRect;\n const offset = {};\n\n if (rect && elementRect) {\n offset.left = startOffset.left - (rect.width * elementRect.left);\n offset.top = startOffset.top - (rect.height * elementRect.top);\n\n offset.right = startOffset.right - (rect.width * (1 - elementRect.right));\n offset.bottom = startOffset.bottom - (rect.height * (1 - elementRect.bottom));\n }\n else {\n offset.left = offset.top = offset.right = offset.bottom = 0;\n }\n\n return offset;\n },\n\n set: function ({ pageCoords, interaction, status, options }) {\n if (!options) { return status; }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n\n const restriction = getRestrictionRect(options.restriction, interaction, page);\n\n if (!restriction) { return status; }\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n const rect = restriction;\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n const offset = interaction.modifierOffsets.restrict;\n\n // object is assumed to have\n // x, y, width, height or\n // left, top, right, bottom\n if ('x' in restriction && 'y' in restriction) {\n modifiedX = Math.max(Math.min(rect.x + rect.width - offset.right , page.x), rect.x + offset.left);\n modifiedY = Math.max(Math.min(rect.y + rect.height - offset.bottom, page.y), rect.y + offset.top );\n }\n else {\n modifiedX = Math.max(Math.min(rect.right - offset.right , page.x), rect.left + offset.left);\n modifiedY = Math.max(Math.min(rect.bottom - offset.bottom, page.y), rect.top + offset.top );\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const elementRect = options && options.elementRect;\n\n if (options && options.enabled\n && !(phase === 'start' && elementRect && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n getRestrictionRect,\n};\n\nfunction getRestrictionRect (value, interaction, page) {\n if (utils.is.function(value)) {\n return utils.resolveRectLike(value, interaction.target, interaction.element, [page.x, page.y, interaction]);\n } else {\n return utils.resolveRectLike(value, interaction.target, interaction.element);\n }\n}\n\nmodifiers.restrict = restrict;\nmodifiers.names.push('restrict');\n\ndefaultOptions.perAction.restrict = restrict.defaults;\n\nmodule.exports = restrict;\n","// This module adds the options.resize.restrictEdges setting which sets min and\n// max for the top, left, bottom and right edges of the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictEdges: {\n// inner: { top: 200, left: 200, right: 400, bottom: 400 },\n// outer: { top: 0, left: 0, right: 600, bottom: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst { getRestrictionRect } = require('./restrict');\n\nconst noInner = { top: +Infinity, left: +Infinity, bottom: -Infinity, right: -Infinity };\nconst noOuter = { top: -Infinity, left: -Infinity, bottom: +Infinity, right: +Infinity };\n\nconst restrictEdges = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n offset: null,\n },\n\n setOffset: function ({ interaction, startOffset, options }) {\n if (!options) {\n return utils.extend({}, startOffset);\n }\n\n const offset = getRestrictionRect(options.offset, interaction, interaction.startCoords.page);\n\n if (offset) {\n return {\n top: startOffset.top + offset.y,\n left: startOffset.left + offset.x,\n bottom: startOffset.bottom + offset.y,\n right: startOffset.right + offset.x,\n };\n }\n\n return startOffset;\n },\n\n set: function ({ pageCoords, interaction, status, offset, options }) {\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n const inner = rectUtils.xywhToTlbr(getRestrictionRect(options.inner, interaction, page)) || noInner;\n const outer = rectUtils.xywhToTlbr(getRestrictionRect(options.outer, interaction, page)) || noOuter;\n\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n if (edges.top) {\n modifiedY = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top);\n }\n else if (edges.bottom) {\n modifiedY = Math.max(Math.min(outer.bottom - offset.bottom, page.y), inner.bottom - offset.bottom);\n }\n if (edges.left) {\n modifiedX = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left);\n }\n else if (edges.right) {\n modifiedX = Math.max(Math.min(outer.right - offset.right, page.x), inner.right - offset.right);\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n if (options && options.enabled\n && !(phase === 'start' && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n noInner,\n noOuter,\n getRestrictionRect,\n};\n\nmodifiers.restrictEdges = restrictEdges;\nmodifiers.names.push('restrictEdges');\n\ndefaultOptions.perAction.restrictEdges = restrictEdges.defaults;\nresize.defaults.restrictEdges = restrictEdges.defaults;\n\nmodule.exports = restrictEdges;\n","// This module adds the options.resize.restrictSize setting which sets min and\n// max width and height for the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictSize: {\n// min: { width: -600, height: -600 },\n// max: { width: 600, height: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst restrictEdges = require('./restrictEdges');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst noMin = { width: -Infinity, height: -Infinity };\nconst noMax = { width: +Infinity, height: +Infinity };\n\nconst restrictSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n },\n\n setOffset: function ({ interaction }) {\n return interaction.startOffset;\n },\n\n set: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const rect = rectUtils.xywhToTlbr(interaction.resizeRects.inverted);\n\n const minSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.min, interaction)) || noMin;\n const maxSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.max, interaction)) || noMax;\n\n arg.options = {\n enabled: options.enabled,\n endOnly: options.endOnly,\n inner: utils.extend({}, restrictEdges.noInner),\n outer: utils.extend({}, restrictEdges.noOuter),\n };\n\n if (edges.top) {\n arg.options.inner.top = rect.bottom - minSize.height;\n arg.options.outer.top = rect.bottom - maxSize.height;\n }\n else if (edges.bottom) {\n arg.options.inner.bottom = rect.top + minSize.height;\n arg.options.outer.bottom = rect.top + maxSize.height;\n }\n if (edges.left) {\n arg.options.inner.left = rect.right - minSize.width;\n arg.options.outer.left = rect.right - maxSize.width;\n }\n else if (edges.right) {\n arg.options.inner.right = rect.left + minSize.width;\n arg.options.outer.right = rect.left + maxSize.width;\n }\n\n restrictEdges.set(arg);\n },\n\n modifyCoords: restrictEdges.modifyCoords,\n};\n\nmodifiers.restrictSize = restrictSize;\nmodifiers.names.push('restrictSize');\n\ndefaultOptions.perAction.restrictSize = restrictSize.defaults;\nresize.defaults.restrictSize = restrictSize.defaults;\n\nmodule.exports = restrictSize;\n","const modifiers = require('./index');\nconst interact = require('../interact');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst snap = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n\n relativePoints: null,\n },\n\n setOffset: function ({ interaction, interactable, element, rect, startOffset, options }) {\n const offsets = [];\n const optionsOrigin = utils.rectToXY(utils.resolveRectLike(options.origin));\n const origin = optionsOrigin || utils.getOriginXY(interactable, element, interaction.prepared.name);\n options = options || interactable.options[interaction.prepared.name].snap || {};\n\n let snapOffset;\n\n if (options.offset === 'startCoords') {\n snapOffset = {\n x: interaction.startCoords.page.x - origin.x,\n y: interaction.startCoords.page.y - origin.y,\n };\n }\n else {\n const offsetRect = utils.resolveRectLike(options.offset, interactable, element, [interaction]);\n\n snapOffset = utils.rectToXY(offsetRect) || { x: 0, y: 0 };\n }\n\n if (rect && options.relativePoints && options.relativePoints.length) {\n for (const { x: relativeX, y: relativeY } of options.relativePoints) {\n offsets.push({\n x: startOffset.left - (rect.width * relativeX) + snapOffset.x,\n y: startOffset.top - (rect.height * relativeY) + snapOffset.y,\n });\n }\n }\n else {\n offsets.push(snapOffset);\n }\n\n return offsets;\n },\n\n set: function ({ interaction, pageCoords, status, options, offset: offsets }) {\n const targets = [];\n let target;\n let page;\n let i;\n\n if (status.useStatusXY) {\n page = { x: status.x, y: status.y };\n }\n else {\n const origin = utils.getOriginXY(interaction.target, interaction.element, interaction.prepared.name);\n\n page = utils.extend({}, pageCoords);\n\n page.x -= origin.x;\n page.y -= origin.y;\n }\n\n status.realX = page.x;\n status.realY = page.y;\n\n let len = options.targets? options.targets.length : 0;\n\n for (const { x: offsetX, y: offsetY } of offsets) {\n const relativeX = page.x - offsetX;\n const relativeY = page.y - offsetY;\n\n for (const snapTarget of options.targets) {\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n targets.push({\n x: utils.is.number(target.x) ? (target.x + offsetX) : relativeX,\n y: utils.is.number(target.y) ? (target.y + offsetY) : relativeY,\n\n range: utils.is.number(target.range)? target.range: options.range,\n });\n }\n }\n\n const closest = {\n target: null,\n inRange: false,\n distance: 0,\n range: 0,\n dx: 0,\n dy: 0,\n };\n\n for (i = 0, len = targets.length; i < len; i++) {\n target = targets[i];\n\n const range = target.range;\n const dx = target.x - page.x;\n const dy = target.y - page.y;\n const distance = utils.hypot(dx, dy);\n let inRange = distance <= range;\n\n // Infinite targets count as being out of range\n // compared to non infinite ones that are in range\n if (range === Infinity && closest.inRange && closest.range !== Infinity) {\n inRange = false;\n }\n\n if (!closest.target || (inRange\n // is the closest target in range?\n ? (closest.inRange && range !== Infinity\n // the pointer is relatively deeper in this target\n ? distance / range < closest.distance / closest.range\n // this target has Infinite range and the closest doesn't\n : (range === Infinity && closest.range !== Infinity)\n // OR this target is closer that the previous closest\n || distance < closest.distance)\n // The other is not in range and the pointer is closer to this target\n : (!closest.inRange && distance < closest.distance))) {\n\n closest.target = target;\n closest.distance = distance;\n closest.range = range;\n closest.inRange = inRange;\n closest.dx = dx;\n closest.dy = dy;\n\n status.range = range;\n }\n }\n\n let snapChanged;\n\n if (closest.target) {\n snapChanged = (status.modifiedX !== closest.target.x || status.modifiedY !== closest.target.y);\n\n status.modifiedX = closest.target.x;\n status.modifiedY = closest.target.y;\n }\n else {\n snapChanged = true;\n\n status.modifiedX = NaN;\n status.modifiedY = NaN;\n }\n\n status.dx = closest.dx;\n status.dy = closest.dy;\n\n status.changed = (snapChanged || (closest.inRange && !status.locked));\n status.locked = closest.inRange;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const relativePoints = options && options.relativePoints;\n\n if (options && options.enabled\n && !(phase === 'start' && relativePoints && relativePoints.length)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n }\n\n return {\n range : status.range,\n locked : status.locked,\n x : status.modifiedX,\n y : status.modifiedY,\n realX : status.realX,\n realY : status.realY,\n dx : status.dx,\n dy : status.dy,\n };\n }\n },\n};\n\ninteract.createSnapGrid = function (grid) {\n return function (x, y) {\n const limits = grid.limits || {\n left : -Infinity,\n right : Infinity,\n top : -Infinity,\n bottom: Infinity,\n };\n let offsetX = 0;\n let offsetY = 0;\n\n if (utils.is.object(grid.offset)) {\n offsetX = grid.offset.x;\n offsetY = grid.offset.y;\n }\n\n const gridx = Math.round((x - offsetX) / grid.x);\n const gridy = Math.round((y - offsetY) / grid.y);\n\n const newX = Math.max(limits.left, Math.min(limits.right , gridx * grid.x + offsetX));\n const newY = Math.max(limits.top , Math.min(limits.bottom, gridy * grid.y + offsetY));\n\n return {\n x: newX,\n y: newY,\n range: grid.range,\n };\n };\n};\n\nmodifiers.snap = snap;\nmodifiers.names.push('snap');\n\ndefaultOptions.perAction.snap = snap.defaults;\n\nmodule.exports = snap;\n","// This module allows snapping of the size of targets during resize\n// interactions.\n\nconst modifiers = require('./index');\nconst snap = require('./snap');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\nconst utils = require('../utils/');\n\nconst snapSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n },\n\n setOffset: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.edges;\n\n if (!edges) { return; }\n\n arg.options = {\n relativePoints: [{\n x: edges.left? 0 : 1,\n y: edges.top ? 0 : 1,\n }],\n origin: { x: 0, y: 0 },\n offset: 'self',\n range: options.range,\n };\n\n const offsets = snap.setOffset(arg);\n arg.options = options;\n\n return offsets;\n },\n\n set: function (arg) {\n const { interaction, options, offset, pageCoords } = arg;\n const page = utils.extend({}, pageCoords);\n const relativeX = page.x - offset[0].x;\n const relativeY = page.y - offset[0].y;\n\n arg.options = utils.extend({}, options);\n arg.options.targets = [];\n\n for (const snapTarget of options.targets) {\n let target;\n\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n if ('width' in target && 'height' in target) {\n target.x = target.width;\n target.y = target.height;\n }\n\n arg.options.targets.push(target);\n }\n\n snap.set(arg);\n },\n\n modifyCoords: function (arg) {\n const { options } = arg;\n\n arg.options = utils.extend({}, options);\n arg.options.enabled = options.enabled;\n arg.options.relativePoints = [null];\n\n snap.modifyCoords(arg);\n },\n};\n\nmodifiers.snapSize = snapSize;\nmodifiers.names.push('snapSize');\n\ndefaultOptions.perAction.snapSize = snapSize.defaults;\nresize.defaults.snapSize = snapSize.defaults;\n\nmodule.exports = snapSize;\n","const pointerUtils = require('../utils/pointerUtils');\n\nmodule.exports = class PointerEvent {\n constructor (type, pointer, event, eventTarget, interaction) {\n pointerUtils.pointerExtend(this, event);\n\n if (event !== pointer) {\n pointerUtils.pointerExtend(this, pointer);\n }\n\n this.interaction = interaction;\n\n this.timeStamp = new Date().getTime();\n this.originalEvent = event;\n this.type = type;\n this.pointerId = pointerUtils.getPointerId(pointer);\n this.pointerType = pointerUtils.getPointerType(pointer);\n this.target = eventTarget;\n this.currentTarget = null;\n\n if (type === 'tap') {\n const pointerIndex = interaction.getPointerIndex(pointer);\n this.dt = this.timeStamp - interaction.downTimes[pointerIndex];\n\n const interval = this.timeStamp - interaction.tapTime;\n\n this.double = !!(interaction.prevTap\n && interaction.prevTap.type !== 'doubletap'\n && interaction.prevTap.target === this.target\n && interval < 500);\n }\n else if (type === 'doubletap') {\n this.dt = pointer.timeStamp - interaction.tapTime;\n }\n }\n\n subtractOrigin ({ x: originX, y: originY }) {\n this.pageX -= originX;\n this.pageY -= originY;\n this.clientX -= originX;\n this.clientY -= originY;\n\n return this;\n }\n\n addOrigin ({ x: originX, y: originY }) {\n this.pageX += originX;\n this.pageY += originY;\n this.clientX += originX;\n this.clientY += originY;\n\n return this;\n }\n\n preventDefault () {\n this.originalEvent.preventDefault();\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n};\n","const PointerEvent = require('./PointerEvent');\nconst Interaction = require('../Interaction');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst defaults = require('../defaultOptions');\nconst signals = require('../utils/Signals').new();\nconst { filter } = require('../utils/arr');\n\nconst simpleSignals = [ 'down', 'up', 'cancel' ];\nconst simpleEvents = [ 'down', 'up', 'cancel' ];\n\nconst pointerEvents = {\n PointerEvent,\n fire,\n collectEventTargets,\n signals,\n defaults: {\n holdDuration: 600,\n ignoreFrom : null,\n allowFrom : null,\n origin : { x: 0, y: 0 },\n },\n types: [\n 'down',\n 'move',\n 'up',\n 'cancel',\n 'tap',\n 'doubletap',\n 'hold',\n ],\n};\n\nfunction fire (arg) {\n const {\n interaction, pointer, event, eventTarget,\n type = arg.pointerEvent.type,\n targets = collectEventTargets(arg),\n pointerEvent = new PointerEvent(type, pointer, event, eventTarget, interaction),\n } = arg;\n\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n targets,\n type,\n pointerEvent,\n };\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n\n for (const prop in target.props || {}) {\n pointerEvent[prop] = target.props[prop];\n }\n\n const origin = utils.getOriginXY(target.eventable, target.element);\n\n pointerEvent.subtractOrigin(origin);\n pointerEvent.eventable = target.eventable;\n pointerEvent.currentTarget = target.element;\n\n target.eventable.fire(pointerEvent);\n\n pointerEvent.addOrigin(origin);\n\n if (pointerEvent.immediatePropagationStopped\n || (pointerEvent.propagationStopped\n && (i + 1) < targets.length && targets[i + 1].element !== pointerEvent.currentTarget)) {\n break;\n }\n }\n\n signals.fire('fired', signalArg);\n\n if (type === 'tap') {\n // if pointerEvent should make a double tap, create and fire a doubletap\n // PointerEvent and use that as the prevTap\n const prevTap = pointerEvent.double\n ? fire({\n interaction, pointer, event, eventTarget,\n type: 'doubletap',\n })\n : pointerEvent;\n\n interaction.prevTap = prevTap;\n interaction.tapTime = prevTap.timeStamp;\n }\n\n return pointerEvent;\n}\n\nfunction collectEventTargets ({ interaction, pointer, event, eventTarget, type }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n // do not fire a tap event if the pointer was moved before being lifted\n if (type === 'tap' && (interaction.pointerWasMoved\n // or if the pointerup target is different to the pointerdown target\n || !(interaction.downTargets[pointerIndex] && interaction.downTargets[pointerIndex] === eventTarget))) {\n return [];\n }\n\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n path,\n targets: [],\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (type === 'hold') {\n signalArg.targets = filter(signalArg.targets, target =>\n target.eventable.options.holdDuration === interaction.holdTimers[pointerIndex].duration);\n }\n\n return signalArg.targets;\n}\n\nInteraction.signals.on('update-pointer-down', function ({ interaction, pointerIndex }) {\n interaction.holdTimers[pointerIndex] = { duration: Infinity, timeout: null };\n});\n\nInteraction.signals.on('remove-pointer', function ({ interaction, pointerIndex }) {\n interaction.holdTimers.splice(pointerIndex, 1);\n});\n\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget, duplicateMove }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n if (!duplicateMove && (!interaction.pointerIsDown || interaction.pointerWasMoved)) {\n if (interaction.pointerIsDown) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n\n fire({\n interaction, pointer, event, eventTarget,\n type: 'move',\n });\n }\n});\n\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget, pointerIndex }) {\n // copy event to be used in timeout for IE8\n const eventCopy = browser.isIE8? utils.extend({}, event) : event;\n\n const timer = interaction.holdTimers[pointerIndex];\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'hold',\n targets: [],\n path,\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (!signalArg.targets.length) { return; }\n\n let minDuration = Infinity;\n\n for (let i = 0; i < signalArg.targets.length; i++) {\n const target = signalArg.targets[i];\n const holdDuration = target.eventable.options.holdDuration;\n\n if (holdDuration < minDuration) {\n minDuration = holdDuration;\n }\n }\n\n timer.duration = minDuration;\n timer.timeout = setTimeout(function () {\n fire({\n interaction,\n eventTarget,\n pointer: browser.isIE8? eventCopy : pointer,\n event: eventCopy,\n type: 'hold',\n });\n }, minDuration);\n});\n\nInteraction.signals.on('up', ({ interaction, pointer, event, eventTarget }) => {\n if (!interaction.pointerWasMoved) {\n fire({ interaction, eventTarget, pointer, event, type: 'tap' });\n }\n});\n\n['up', 'cancel'].forEach(function (signalName) {\n Interaction.signals.on(signalName, function ({ interaction, pointerIndex }) {\n if (interaction.holdTimers[pointerIndex]) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n });\n});\n\nfunction createSignalListener (type) {\n return function ({ interaction, pointer, event, eventTarget }) {\n fire({ interaction, eventTarget, pointer, event, type });\n };\n}\n\nfor (let i = 0; i < simpleSignals.length; i++) {\n Interaction.signals.on(simpleSignals[i], createSignalListener(simpleEvents[i]));\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.prevTap = null; // the most recent tap event on this interaction\n interaction.tapTime = 0; // time of the most recent tap event\n interaction.holdTimers = []; // [{ duration, timeout }]\n});\n\ndefaults.pointerEvents = pointerEvents.defaults;\nmodule.exports = pointerEvents;\n","const pointerEvents = require('./base');\nconst Interaction = require('../Interaction');\n\npointerEvents.signals.on('new', onNew);\npointerEvents.signals.on('fired', onFired);\n\nfor (const signal of ['move', 'up', 'cancel', 'endall']) {\n Interaction.signals.on(signal, endHoldRepeat);\n}\n\nfunction onNew ({ pointerEvent }) {\n if (pointerEvent.type !== 'hold') { return; }\n\n pointerEvent.count = (pointerEvent.count || 0) + 1;\n}\n\nfunction onFired ({ interaction, pointerEvent, eventTarget, targets }) {\n if (pointerEvent.type !== 'hold' || !targets.length) { return; }\n\n // get the repeat interval from the first eventable\n const interval = targets[0].eventable.options.holdRepeatInterval;\n\n // don't repeat if the interval is 0 or less\n if (interval <= 0) { return; }\n\n // set a timeout to fire the holdrepeat event\n interaction.holdIntervalHandle = setTimeout(function () {\n pointerEvents.fire({\n interaction,\n eventTarget,\n type: 'hold',\n pointer: pointerEvent,\n event: pointerEvent,\n });\n }, interval);\n}\n\nfunction endHoldRepeat ({ interaction }) {\n // set the interaction's holdStopTime property\n // to stop further holdRepeat events\n if (interaction.holdIntervalHandle) {\n clearInterval(interaction.holdIntervalHandle);\n interaction.holdIntervalHandle = null;\n }\n}\n\n// don't repeat by default\npointerEvents.defaults.holdRepeatInterval = 0;\npointerEvents.types.push('holdrepeat');\n\nmodule.exports = {\n onNew,\n onFired,\n endHoldRepeat,\n};\n","const pointerEvents = require('./base');\nconst Interactable = require('../Interactable');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\nconst scope = require('../scope');\nconst extend = require('../utils/extend');\nconst { merge } = require('../utils/arr');\n\npointerEvents.signals.on('collect-targets', function ({ targets, element, type, eventTarget }) {\n function collectSelectors (interactable, selector, context) {\n const els = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && is.element(element)\n && domUtils.matchesSelector(element, selector, els)\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n const interactable = scope.interactables.get(element);\n\n if (interactable) {\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n scope.interactables.forEachSelector(collectSelectors, element);\n});\n\nInteractable.signals.on('new', function ({ interactable }) {\n interactable.events.getRect = function (element) {\n return interactable.getRect(element);\n };\n});\n\nInteractable.signals.on('set', function ({ interactable, options }) {\n extend(interactable.events.options, pointerEvents.defaults);\n extend(interactable.events.options, options);\n});\n\nmerge(Interactable.eventTypes, pointerEvents.types);\n\nInteractable.prototype.pointerEvents = function (options) {\n extend(this.events.options, options);\n\n return this;\n};\n\nconst __backCompatOption = Interactable.prototype._backCompatOption;\n\nInteractable.prototype._backCompatOption = function (optionName, newValue) {\n const ret = __backCompatOption.call(this, optionName, newValue);\n\n if (ret === this) {\n this.events.options[optionName] = newValue;\n }\n\n return ret;\n};\n\nInteractable.settingsMethods.push('pointerEvents');\n","const utils = require('./utils');\nconst events = require('./utils/events');\nconst signals = require('./utils/Signals').new();\n\nconst scope = {\n signals,\n events,\n utils,\n\n // main document\n document: require('./utils/domObjects').document,\n // all documents being listened to\n documents: [],\n\n addDocument: function (doc, win) {\n // do nothing if document is already known\n if (utils.contains(scope.documents, doc)) { return false; }\n\n win = win || scope.getWindow(doc);\n\n scope.documents.push(doc);\n events.documents.push(doc);\n\n // don't add an unload event for the main document\n // so that the page may be cached in browser history\n if (doc !== scope.document) {\n events.add(win, 'unload', scope.onWindowUnload);\n }\n\n signals.fire('add-document', { doc, win });\n },\n\n removeDocument: function (doc, win) {\n const index = utils.indexOf(scope.documents, doc);\n\n win = win || scope.getWindow(doc);\n\n events.remove(win, 'unload', scope.onWindowUnload);\n\n scope.documents.splice(index, 1);\n events.documents.splice(index, 1);\n\n signals.fire('remove-document', { win, doc });\n },\n\n onWindowUnload: function () {\n scope.removeDocument(this.document, this);\n },\n};\n\nmodule.exports = scope;\n","const { indexOf } = require('./arr');\n\nclass Signals {\n constructor () {\n this.listeners = {\n // signalName: [listeners],\n };\n }\n\n on (name, listener) {\n if (!this.listeners[name]) {\n this.listeners[name] = [listener];\n return;\n }\n\n this.listeners[name].push(listener);\n }\n\n off (name, listener) {\n if (!this.listeners[name]) { return; }\n\n const index = indexOf(this.listeners[name], listener);\n\n if (index !== -1) {\n this.listeners[name].splice(index, 1);\n }\n }\n\n fire (name, arg) {\n const targetListeners = this.listeners[name];\n\n if (!targetListeners) { return; }\n\n for (let i = 0; i < targetListeners.length; i++) {\n if (targetListeners[i](arg, name) === false) {\n return;\n }\n }\n }\n}\n\nSignals.new = function () {\n return new Signals();\n};\n\nmodule.exports = Signals;\n","function indexOf (array, target) {\n for (let i = 0, len = array.length; i < len; i++) {\n if (array[i] === target) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction contains (array, target) {\n return indexOf(array, target) !== -1;\n}\n\nfunction merge (target, source) {\n for (let i = 0; i < source.length; i++) {\n target.push(source[i]);\n }\n\n return target;\n}\n\nfunction filter (array, test) {\n const result = [];\n\n for (let i = 0; i < array.length; i++) {\n if (test(array[i])) {\n result.push(array[i]);\n }\n }\n\n return result;\n}\n\nmodule.exports = {\n indexOf,\n contains,\n merge,\n filter,\n};\n","const { window } = require('./window');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst Element = domObjects.Element;\nconst navigator = window.navigator;\n\nconst browser = {\n // Does the browser support touch input?\n supportsTouch: !!(('ontouchstart' in window) || is.function(window.DocumentTouch)\n && domObjects.document instanceof window.DocumentTouch),\n\n // Does the browser support PointerEvents\n supportsPointerEvent: !!domObjects.PointerEvent,\n\n isIE8: ('attachEvent' in window) && !('addEventListener' in window),\n\n // Opera Mobile must be handled differently\n isOperaMobile: (navigator.appName === 'Opera'\n && browser.supportsTouch\n && navigator.userAgent.match('Presto')),\n\n // scrolling doesn't change the result of getClientRects on iOS 7\n isIOS7: (/iP(hone|od|ad)/.test(navigator.platform)\n && /OS 7[^\\d]/.test(navigator.appVersion)),\n\n isIe9OrOlder: /MSIE (8|9)/.test(navigator.userAgent),\n\n // prefix matchesSelector\n prefixedMatchesSelector: 'matches' in Element.prototype\n ? 'matches': 'webkitMatchesSelector' in Element.prototype\n ? 'webkitMatchesSelector': 'mozMatchesSelector' in Element.prototype\n ? 'mozMatchesSelector': 'oMatchesSelector' in Element.prototype\n ? 'oMatchesSelector': 'msMatchesSelector',\n\n useMatchesSelectorPolyfill: false,\n\n pEventTypes: (domObjects.PointerEvent\n ? (domObjects.PointerEvent === window.MSPointerEvent\n ? {\n up: 'MSPointerUp',\n down: 'MSPointerDown',\n over: 'mouseover',\n out: 'mouseout',\n move: 'MSPointerMove',\n cancel: 'MSPointerCancel',\n }\n : {\n up: 'pointerup',\n down: 'pointerdown',\n over: 'pointerover',\n out: 'pointerout',\n move: 'pointermove',\n cancel: 'pointercancel',\n })\n : null),\n\n // because Webkit and Opera still use 'mousewheel' event type\n wheelEvent: 'onmousewheel' in domObjects.document? 'mousewheel': 'wheel',\n\n};\n\nbrowser.useMatchesSelectorPolyfill = !is.function(Element.prototype[browser.prefixedMatchesSelector]);\n\nmodule.exports = browser;\n","const domObjects = {};\nconst win = require('./window').window;\n\nfunction blank () {}\n\ndomObjects.document = win.document;\ndomObjects.DocumentFragment = win.DocumentFragment || blank;\ndomObjects.SVGElement = win.SVGElement || blank;\ndomObjects.SVGSVGElement = win.SVGSVGElement || blank;\ndomObjects.SVGElementInstance = win.SVGElementInstance || blank;\ndomObjects.Element = win.Element || blank;\ndomObjects.HTMLElement = win.HTMLElement || domObjects.Element;\n\ndomObjects.Event = win.Event;\ndomObjects.Touch = win.Touch || blank;\ndomObjects.PointerEvent = (win.PointerEvent || win.MSPointerEvent);\n\nmodule.exports = domObjects;\n","const win = require('./window');\nconst browser = require('./browser');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst domUtils = {\n nodeContains: function (parent, child) {\n while (child) {\n if (child === parent) {\n return true;\n }\n\n child = child.parentNode;\n }\n\n return false;\n },\n\n closest: function (element, selector) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) { return element; }\n\n element = domUtils.parentNode(element);\n }\n\n return null;\n },\n\n parentNode: function (node) {\n let parent = node.parentNode;\n\n if (is.docFrag(parent)) {\n // skip past #shado-root fragments\n while ((parent = parent.host) && is.docFrag(parent)) {\n continue;\n }\n\n return parent;\n }\n\n return parent;\n },\n\n // taken from http://tanalin.com/en/blog/2012/12/matches-selector-ie8/ and modified\n matchesSelectorPolyfill: browser.useMatchesSelectorPolyfill\n ? function (element, selector, elems) {\n elems = elems || element.parentNode.querySelectorAll(selector);\n\n for (let i = 0, len = elems.length; i < len; i++) {\n if (elems[i] === element) {\n return true;\n }\n }\n\n return false;\n }\n : null,\n\n matchesSelector: function (element, selector, nodeList) {\n if (browser.useMatchesSelectorPolyfill) {\n return domUtils.matchesSelectorPolyfill(element, selector, nodeList);\n }\n\n // remove /deep/ from selectors if shadowDOM polyfill is used\n if (win.window !== win.realWindow) {\n selector = selector.replace(/\\/deep\\//g, ' ');\n }\n\n return element[browser.prefixedMatchesSelector](selector);\n },\n\n // Test for the element that's \"above\" all other qualifiers\n indexOfDeepestElement: function (elements) {\n let deepestZoneParents = [];\n let dropzoneParents = [];\n let dropzone;\n let deepestZone = elements[0];\n let index = deepestZone? 0: -1;\n let parent;\n let child;\n let i;\n let n;\n\n for (i = 1; i < elements.length; i++) {\n dropzone = elements[i];\n\n // an element might belong to multiple selector dropzones\n if (!dropzone || dropzone === deepestZone) {\n continue;\n }\n\n if (!deepestZone) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n // check if the deepest or current are document.documentElement or document.rootElement\n // - if the current dropzone is, do nothing and continue\n if (dropzone.parentNode === dropzone.ownerDocument) {\n continue;\n }\n // - if deepest is, update with the current dropzone and continue to next\n else if (deepestZone.parentNode === dropzone.ownerDocument) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n if (!deepestZoneParents.length) {\n parent = deepestZone;\n while (parent.parentNode && parent.parentNode !== parent.ownerDocument) {\n deepestZoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n }\n\n // if this element is an svg element and the current deepest is\n // an HTMLElement\n if (deepestZone instanceof domObjects.HTMLElement\n && dropzone instanceof domObjects.SVGElement\n && !(dropzone instanceof domObjects.SVGSVGElement)) {\n\n if (dropzone === deepestZone.parentNode) {\n continue;\n }\n\n parent = dropzone.ownerSVGElement;\n }\n else {\n parent = dropzone;\n }\n\n dropzoneParents = [];\n\n while (parent.parentNode !== parent.ownerDocument) {\n dropzoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n\n n = 0;\n\n // get (position of last common ancestor) + 1\n while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) {\n n++;\n }\n\n const parents = [\n dropzoneParents[n - 1],\n dropzoneParents[n],\n deepestZoneParents[n],\n ];\n\n child = parents[0].lastChild;\n\n while (child) {\n if (child === parents[1]) {\n deepestZone = dropzone;\n index = i;\n deepestZoneParents = [];\n\n break;\n }\n else if (child === parents[2]) {\n break;\n }\n\n child = child.previousSibling;\n }\n }\n\n return index;\n },\n\n matchesUpTo: function (element, selector, limit) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) {\n return true;\n }\n\n element = domUtils.parentNode(element);\n\n if (element === limit) {\n return domUtils.matchesSelector(element, selector);\n }\n }\n\n return false;\n },\n\n getActualElement: function (element) {\n return (element instanceof domObjects.SVGElementInstance\n ? element.correspondingUseElement\n : element);\n },\n\n getScrollXY: function (relevantWindow) {\n relevantWindow = relevantWindow || win.window;\n return {\n x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft,\n y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop,\n };\n },\n\n getElementClientRect: function (element) {\n const clientRect = (element instanceof domObjects.SVGElement\n ? element.getBoundingClientRect()\n : element.getClientRects()[0]);\n\n return clientRect && {\n left : clientRect.left,\n right : clientRect.right,\n top : clientRect.top,\n bottom: clientRect.bottom,\n width : clientRect.width || clientRect.right - clientRect.left,\n height: clientRect.height || clientRect.bottom - clientRect.top,\n };\n },\n\n getElementRect: function (element) {\n const clientRect = domUtils.getElementClientRect(element);\n\n if (!browser.isIOS7 && clientRect) {\n const scroll = domUtils.getScrollXY(win.getWindow(element));\n\n clientRect.left += scroll.x;\n clientRect.right += scroll.x;\n clientRect.top += scroll.y;\n clientRect.bottom += scroll.y;\n }\n\n return clientRect;\n },\n\n getPath: function (element) {\n const path = [];\n\n while (element) {\n path.push(element);\n element = domUtils.parentNode(element);\n }\n\n return path;\n },\n\n trySelector: value => {\n if (!is.string(value)) { return false; }\n\n // an exception will be raised if it is invalid\n domObjects.document.querySelector(value);\n return true;\n },\n};\n\nmodule.exports = domUtils;\n","const is = require('./is');\nconst domUtils = require('./domUtils');\nconst pExtend = require('./pointerExtend');\n\nconst { window, getWindow } = require('./window');\nconst { indexOf, contains } = require('./arr');\n\nconst useAttachEvent = ('attachEvent' in window) && !('addEventListener' in window);\nconst addEvent = useAttachEvent? 'attachEvent': 'addEventListener';\nconst removeEvent = useAttachEvent? 'detachEvent': 'removeEventListener';\nconst on = useAttachEvent? 'on': '';\n\nconst elements = [];\nconst targets = [];\nconst attachedListeners = [];\n\n// {\n// type: {\n// selectors: ['selector', ...],\n// contexts : [document, ...],\n// listeners: [[listener, capture, passive], ...]\n// }\n// }\nconst delegatedEvents = {};\n\nconst documents = [];\n\nconst supportsOptions = !useAttachEvent && (() => {\n let supported = false;\n\n window.document.createElement('div').addEventListener('test', null, {\n get capture () { supported = true; },\n });\n\n return supported;\n})();\n\nfunction add (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n let elementIndex = indexOf(elements, element);\n let target = targets[elementIndex];\n\n if (!target) {\n target = {\n events: {},\n typeCount: 0,\n };\n\n elementIndex = elements.push(element) - 1;\n targets.push(target);\n\n attachedListeners.push(useAttachEvent\n ? {\n supplied: [],\n wrapped : [],\n useCount: [],\n }\n : null);\n }\n\n if (!target.events[type]) {\n target.events[type] = [];\n target.typeCount++;\n }\n\n if (!contains(target.events[type], listener)) {\n let ret;\n\n if (useAttachEvent) {\n const { supplied, wrapped, useCount } = attachedListeners[elementIndex];\n const listenerIndex = indexOf(supplied, listener);\n\n const wrappedListener = wrapped[listenerIndex] || function (event) {\n if (!event.immediatePropagationStopped) {\n event.target = event.srcElement;\n event.currentTarget = element;\n\n event.preventDefault = event.preventDefault || preventDef;\n event.stopPropagation = event.stopPropagation || stopProp;\n event.stopImmediatePropagation = event.stopImmediatePropagation || stopImmProp;\n\n if (/mouse|click/.test(event.type)) {\n event.pageX = event.clientX + getWindow(element).document.documentElement.scrollLeft;\n event.pageY = event.clientY + getWindow(element).document.documentElement.scrollTop;\n }\n\n listener(event);\n }\n };\n\n ret = element[addEvent](on + type, wrappedListener, !!options.capture);\n\n if (listenerIndex === -1) {\n supplied.push(listener);\n wrapped.push(wrappedListener);\n useCount.push(1);\n }\n else {\n useCount[listenerIndex]++;\n }\n }\n else {\n ret = element[addEvent](type, listener, supportsOptions? options : !!options.capture);\n }\n target.events[type].push(listener);\n\n return ret;\n }\n}\n\nfunction remove (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const elementIndex = indexOf(elements, element);\n const target = targets[elementIndex];\n\n if (!target || !target.events) {\n return;\n }\n\n let wrappedListener = listener;\n let listeners;\n let listenerIndex;\n\n if (useAttachEvent) {\n listeners = attachedListeners[elementIndex];\n listenerIndex = indexOf(listeners.supplied, listener);\n wrappedListener = listeners.wrapped[listenerIndex];\n }\n\n if (type === 'all') {\n for (type in target.events) {\n if (target.events.hasOwnProperty(type)) {\n remove(element, type, 'all');\n }\n }\n return;\n }\n\n if (target.events[type]) {\n const len = target.events[type].length;\n\n if (listener === 'all') {\n for (let i = 0; i < len; i++) {\n remove(element, type, target.events[type][i], options);\n }\n return;\n }\n else {\n for (let i = 0; i < len; i++) {\n if (target.events[type][i] === listener) {\n element[removeEvent](on + type, wrappedListener, supportsOptions? options : !!options.capture);\n target.events[type].splice(i, 1);\n\n if (useAttachEvent && listeners) {\n listeners.useCount[listenerIndex]--;\n if (listeners.useCount[listenerIndex] === 0) {\n listeners.supplied.splice(listenerIndex, 1);\n listeners.wrapped.splice(listenerIndex, 1);\n listeners.useCount.splice(listenerIndex, 1);\n }\n }\n\n break;\n }\n }\n }\n\n if (target.events[type] && target.events[type].length === 0) {\n target.events[type] = null;\n target.typeCount--;\n }\n }\n\n if (!target.typeCount) {\n targets.splice(elementIndex, 1);\n elements.splice(elementIndex, 1);\n attachedListeners.splice(elementIndex, 1);\n }\n}\n\nfunction addDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n if (!delegatedEvents[type]) {\n delegatedEvents[type] = {\n selectors: [],\n contexts : [],\n listeners: [],\n };\n\n // add delegate listener functions\n for (let i = 0; i < documents.length; i++) {\n add(documents[i], type, delegateListener);\n add(documents[i], type, delegateUseCapture, true);\n }\n }\n\n const delegated = delegatedEvents[type];\n let index;\n\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n break;\n }\n }\n\n if (index === -1) {\n index = delegated.selectors.length;\n\n delegated.selectors.push(selector);\n delegated.contexts .push(context);\n delegated.listeners.push([]);\n }\n\n // keep listener and capture and passive flags\n delegated.listeners[index].push([listener, !!options.capture, options.passive]);\n}\n\nfunction removeDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const delegated = delegatedEvents[type];\n let matchFound = false;\n let index;\n\n if (!delegated) { return; }\n\n // count from last index of delegated to 0\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n // look for matching selector and context Node\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n\n const listeners = delegated.listeners[index];\n\n // each item of the listeners array is an array: [function, capture, passive]\n for (let i = listeners.length - 1; i >= 0; i--) {\n const [fn, capture, passive] = listeners[i];\n\n // check if the listener functions and capture and passive flags match\n if (fn === listener && capture === !!options.capture && passive === options.passive) {\n // remove the listener from the array of listeners\n listeners.splice(i, 1);\n\n // if all listeners for this interactable have been removed\n // remove the interactable from the delegated arrays\n if (!listeners.length) {\n delegated.selectors.splice(index, 1);\n delegated.contexts .splice(index, 1);\n delegated.listeners.splice(index, 1);\n\n // remove delegate function from context\n remove(context, type, delegateListener);\n remove(context, type, delegateUseCapture, true);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegatedEvents[type] = null;\n }\n }\n\n // only remove one listener\n matchFound = true;\n break;\n }\n }\n\n if (matchFound) { break; }\n }\n }\n}\n\n// bound to the interactable context when a DOM event\n// listener is added to a selector interactable\nfunction delegateListener (event, optionalArg) {\n const options = getOptions(optionalArg);\n const fakeEvent = {};\n const delegated = delegatedEvents[event.type];\n const eventTarget = (domUtils.getActualElement(event.path\n ? event.path[0]\n : event.target));\n let element = eventTarget;\n\n // duplicate the event so that currentTarget can be changed\n pExtend(fakeEvent, event);\n\n fakeEvent.originalEvent = event;\n fakeEvent.preventDefault = preventOriginalDefault;\n\n // climb up document tree looking for selector matches\n while (is.element(element)) {\n for (let i = 0; i < delegated.selectors.length; i++) {\n const selector = delegated.selectors[i];\n const context = delegated.contexts[i];\n\n if (domUtils.matchesSelector(element, selector)\n && domUtils.nodeContains(context, eventTarget)\n && domUtils.nodeContains(context, element)) {\n\n const listeners = delegated.listeners[i];\n\n fakeEvent.currentTarget = element;\n\n for (let j = 0; j < listeners.length; j++) {\n const [fn, capture, passive] = listeners[j];\n\n if (capture === !!options.capture && passive === options.passive) {\n fn(fakeEvent);\n }\n }\n }\n }\n\n element = domUtils.parentNode(element);\n }\n}\n\nfunction delegateUseCapture (event) {\n return delegateListener.call(this, event, true);\n}\n\nfunction preventDef () {\n this.returnValue = false;\n}\n\nfunction preventOriginalDefault () {\n this.originalEvent.preventDefault();\n}\n\nfunction stopProp () {\n this.cancelBubble = true;\n}\n\nfunction stopImmProp () {\n this.cancelBubble = true;\n this.immediatePropagationStopped = true;\n}\n\nfunction getOptions (param) {\n return is.object(param)? param : { capture: param };\n}\n\nmodule.exports = {\n add,\n remove,\n\n addDelegate,\n removeDelegate,\n\n delegateListener,\n delegateUseCapture,\n delegatedEvents,\n documents,\n\n useAttachEvent,\n supportsOptions,\n\n _elements: elements,\n _targets: targets,\n _attachedListeners: attachedListeners,\n};\n","module.exports = function extend (dest, source) {\n for (const prop in source) {\n dest[prop] = source[prop];\n }\n return dest;\n};\n","const {\n resolveRectLike,\n rectToXY,\n} = require('./rect');\n\nmodule.exports = function (target, element, action) {\n const actionOptions = target.options[action];\n const actionOrigin = actionOptions && actionOptions.origin;\n const origin = actionOrigin || target.options.origin;\n\n const originRect = resolveRectLike(origin, target, element, [target && element]);\n\n return rectToXY(originRect) || { x: 0, y: 0 };\n};\n","module.exports = (x, y) => Math.sqrt(x * x + y * y);\n","const extend = require('./extend');\nconst win = require('./window');\n\nconst utils = {\n warnOnce: function (method, message) {\n let warned = false;\n\n return function () {\n if (!warned) {\n win.window.console.warn(message);\n warned = true;\n }\n\n return method.apply(this, arguments);\n };\n },\n\n // http://stackoverflow.com/a/5634528/2280888\n _getQBezierValue: function (t, p1, p2, p3) {\n const iT = 1 - t;\n return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3;\n },\n\n getQuadraticCurvePoint: function (startX, startY, cpX, cpY, endX, endY, position) {\n return {\n x: utils._getQBezierValue(position, startX, cpX, endX),\n y: utils._getQBezierValue(position, startY, cpY, endY),\n };\n },\n\n // http://gizma.com/easing/\n easeOutQuad: function (t, b, c, d) {\n t /= d;\n return -c * t*(t-2) + b;\n },\n\n copyAction: function (dest, src) {\n dest.name = src.name;\n dest.axis = src.axis;\n dest.edges = src.edges;\n\n return dest;\n },\n\n is : require('./is'),\n extend : extend,\n hypot : require('./hypot'),\n getOriginXY: require('./getOriginXY'),\n};\n\nextend(utils, require('./arr'));\nextend(utils, require('./domUtils'));\nextend(utils, require('./pointerUtils'));\nextend(utils, require('./rect'));\n\nmodule.exports = utils;\n","const scope = require('../scope');\nconst utils = require('./index');\n\nconst finder = {\n methodOrder: [ 'simulationResume', 'mouseOrPen', 'hasPointer', 'idle' ],\n\n search: function (pointer, eventType, eventTarget) {\n const pointerType = utils.getPointerType(pointer);\n const pointerId = utils.getPointerId(pointer);\n const details = { pointer, pointerId, pointerType, eventType, eventTarget };\n\n for (const method of finder.methodOrder) {\n const interaction = finder[method](details);\n\n if (interaction) {\n return interaction;\n }\n }\n },\n\n // try to resume simulation with a new pointer\n simulationResume: function ({ pointerType, eventType, eventTarget }) {\n if (!/down|start/i.test(eventType)) {\n return null;\n }\n\n for (const interaction of scope.interactions) {\n let element = eventTarget;\n\n if (interaction.simulation && interaction.simulation.allowResume\n && (interaction.pointerType === pointerType)) {\n while (element) {\n // if the element is the interaction element\n if (element === interaction.element) {\n return interaction;\n }\n element = utils.parentNode(element);\n }\n }\n }\n\n return null;\n },\n\n // if it's a mouse or pen interaction\n mouseOrPen: function ({ pointerId, pointerType, eventType }) {\n if (pointerType !== 'mouse' && pointerType !== 'pen') {\n return null;\n }\n\n let firstNonActive;\n\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType) {\n // if it's a down event, skip interactions with running simulations\n if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; }\n\n // if the interaction is active, return it immediately\n if (interaction.interacting()) {\n return interaction;\n }\n // otherwise save it and look for another active interaction\n else if (!firstNonActive) {\n firstNonActive = interaction;\n }\n }\n }\n\n // if no active mouse interaction was found use the first inactive mouse\n // interaction\n if (firstNonActive) {\n return firstNonActive;\n }\n\n // find any mouse or pen interaction.\n // ignore the interaction if the eventType is a *down, and a simulation\n // is active\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType && !(/down/i.test(eventType) && interaction.simulation)) {\n return interaction;\n }\n }\n\n return null;\n },\n\n // get interaction that has this pointer\n hasPointer: function ({ pointerId }) {\n for (const interaction of scope.interactions) {\n if (utils.contains(interaction.pointerIds, pointerId)) {\n return interaction;\n }\n }\n },\n\n // get first idle interaction with a matching pointerType\n idle: function ({ pointerType }) {\n for (const interaction of scope.interactions) {\n // if there's already a pointer held down\n if (interaction.pointerIds.length === 1) {\n const target = interaction.target;\n // don't add this pointer if there is a target interactable and it\n // isn't gesturable\n if (target && !target.options.gesture.enabled) {\n continue;\n }\n }\n // maximum of 2 pointers per interaction\n else if (interaction.pointerIds.length >= 2) {\n continue;\n }\n\n if (!interaction.interacting() && (pointerType === interaction.pointerType)) {\n return interaction;\n }\n }\n\n return null;\n },\n};\n\nmodule.exports = finder;\n","const win = require('./window');\nconst isWindow = require('./isWindow');\n\nconst is = {\n array : () => {},\n\n window : thing => thing === win.window || isWindow(thing),\n\n docFrag : thing => is.object(thing) && thing.nodeType === 11,\n\n object : thing => !!thing && (typeof thing === 'object'),\n\n function: thing => typeof thing === 'function',\n\n number : thing => typeof thing === 'number' ,\n\n bool : thing => typeof thing === 'boolean' ,\n\n string : thing => typeof thing === 'string' ,\n\n element: thing => {\n if (!thing || (typeof thing !== 'object')) { return false; }\n\n const _window = win.getWindow(thing) || win.window;\n\n return (/object|function/.test(typeof _window.Element)\n ? thing instanceof _window.Element //DOM2\n : thing.nodeType === 1 && typeof thing.nodeName === 'string');\n },\n};\n\nis.array = thing => (is.object(thing)\n && (typeof thing.length !== 'undefined')\n && is.function(thing.splice));\n\nmodule.exports = is;\n","module.exports = (thing) => !!(thing && thing.Window) && (thing instanceof thing.Window);\n","function pointerExtend (dest, source) {\n for (const prop in source) {\n const prefixedPropREs = module.exports.prefixedPropREs;\n let deprecated = false;\n\n // skip deprecated prefixed properties\n for (const vendor in prefixedPropREs) {\n if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) {\n deprecated = true;\n break;\n }\n }\n\n if (!deprecated && typeof source[prop] !== 'function') {\n dest[prop] = source[prop];\n }\n }\n return dest;\n}\n\npointerExtend.prefixedPropREs = {\n webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/,\n};\n\nmodule.exports = pointerExtend;\n","const hypot = require('./hypot');\nconst browser = require('./browser');\nconst dom = require('./domObjects');\nconst domUtils = require('./domUtils');\nconst domObjects = require('./domObjects');\nconst is = require('./is');\nconst pointerExtend = require('./pointerExtend');\n\nconst pointerUtils = {\n copyCoords: function (dest, src) {\n dest.page = dest.page || {};\n dest.page.x = src.page.x;\n dest.page.y = src.page.y;\n\n dest.client = dest.client || {};\n dest.client.x = src.client.x;\n dest.client.y = src.client.y;\n\n dest.timeStamp = src.timeStamp;\n },\n\n setCoordDeltas: function (targetObj, prev, cur) {\n targetObj.page.x = cur.page.x - prev.page.x;\n targetObj.page.y = cur.page.y - prev.page.y;\n targetObj.client.x = cur.client.x - prev.client.x;\n targetObj.client.y = cur.client.y - prev.client.y;\n targetObj.timeStamp = cur.timeStamp - prev.timeStamp;\n\n // set pointer velocity\n const dt = Math.max(targetObj.timeStamp / 1000, 0.001);\n\n targetObj.page.speed = hypot(targetObj.page.x, targetObj.page.y) / dt;\n targetObj.page.vx = targetObj.page.x / dt;\n targetObj.page.vy = targetObj.page.y / dt;\n\n targetObj.client.speed = hypot(targetObj.client.x, targetObj.page.y) / dt;\n targetObj.client.vx = targetObj.client.x / dt;\n targetObj.client.vy = targetObj.client.y / dt;\n },\n\n isNativePointer: function (pointer) {\n return (pointer instanceof dom.Event || pointer instanceof dom.Touch);\n },\n\n // Get specified X/Y coords for mouse or event.touches[0]\n getXY: function (type, pointer, xy) {\n xy = xy || {};\n type = type || 'page';\n\n xy.x = pointer[type + 'X'];\n xy.y = pointer[type + 'Y'];\n\n return xy;\n },\n\n getPageXY: function (pointer, page) {\n page = page || {};\n\n // Opera Mobile handles the viewport and scrolling oddly\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n pointerUtils.getXY('screen', pointer, page);\n\n page.x += window.scrollX;\n page.y += window.scrollY;\n }\n else {\n pointerUtils.getXY('page', pointer, page);\n }\n\n return page;\n },\n\n getClientXY: function (pointer, client) {\n client = client || {};\n\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n // Opera Mobile handles the viewport and scrolling oddly\n pointerUtils.getXY('screen', pointer, client);\n }\n else {\n pointerUtils.getXY('client', pointer, client);\n }\n\n return client;\n },\n\n getPointerId: function (pointer) {\n return is.number(pointer.pointerId)? pointer.pointerId : pointer.identifier;\n },\n\n setCoords: function (targetObj, pointers, timeStamp) {\n const pointer = (pointers.length > 1\n ? pointerUtils.pointerAverage(pointers)\n : pointers[0]);\n\n const tmpXY = {};\n\n pointerUtils.getPageXY(pointer, tmpXY);\n targetObj.page.x = tmpXY.x;\n targetObj.page.y = tmpXY.y;\n\n pointerUtils.getClientXY(pointer, tmpXY);\n targetObj.client.x = tmpXY.x;\n targetObj.client.y = tmpXY.y;\n\n targetObj.timeStamp = is.number(timeStamp) ? timeStamp :new Date().getTime();\n },\n\n pointerExtend: pointerExtend,\n\n getTouchPair: function (event) {\n const touches = [];\n\n // array of touches is supplied\n if (is.array(event)) {\n touches[0] = event[0];\n touches[1] = event[1];\n }\n // an event\n else {\n if (event.type === 'touchend') {\n if (event.touches.length === 1) {\n touches[0] = event.touches[0];\n touches[1] = event.changedTouches[0];\n }\n else if (event.touches.length === 0) {\n touches[0] = event.changedTouches[0];\n touches[1] = event.changedTouches[1];\n }\n }\n else {\n touches[0] = event.touches[0];\n touches[1] = event.touches[1];\n }\n }\n\n return touches;\n },\n\n pointerAverage: function (pointers) {\n const average = {\n pageX : 0,\n pageY : 0,\n clientX: 0,\n clientY: 0,\n screenX: 0,\n screenY: 0,\n };\n\n for (const pointer of pointers) {\n for (const prop in average) {\n average[prop] += pointer[prop];\n }\n }\n for (const prop in average) {\n average[prop] /= pointers.length;\n }\n\n return average;\n },\n\n touchBBox: function (event) {\n if (!event.length && !(event.touches && event.touches.length > 1)) {\n return;\n }\n\n const touches = pointerUtils.getTouchPair(event);\n const minX = Math.min(touches[0].pageX, touches[1].pageX);\n const minY = Math.min(touches[0].pageY, touches[1].pageY);\n const maxX = Math.max(touches[0].pageX, touches[1].pageX);\n const maxY = Math.max(touches[0].pageY, touches[1].pageY);\n\n return {\n x: minX,\n y: minY,\n left: minX,\n top: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n },\n\n touchDistance: function (event, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n\n\n const dx = touches[0][sourceX] - touches[1][sourceX];\n const dy = touches[0][sourceY] - touches[1][sourceY];\n\n return hypot(dx, dy);\n },\n\n touchAngle: function (event, prevAngle, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n const dx = touches[1][sourceX] - touches[0][sourceX];\n const dy = touches[1][sourceY] - touches[0][sourceY];\n const angle = 180 * Math.atan2(dy , dx) / Math.PI;\n\n return angle;\n },\n\n getPointerType: function (pointer) {\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : is.number(pointer.pointerType)\n ? [undefined, undefined,'touch', 'pen', 'mouse'][pointer.pointerType]\n // if the PointerEvent API isn't available, then the \"pointer\" must\n // be either a MouseEvent, TouchEvent, or Touch object\n : /touch/.test(pointer.type) || pointer instanceof domObjects.Touch\n ? 'touch'\n : 'mouse';\n },\n\n // [ event.target, event.currentTarget ]\n getEventTargets: function (event) {\n return [\n domUtils.getActualElement(event.path ? event.path[0] : event.target),\n domUtils.getActualElement(event.currentTarget),\n ];\n },\n};\n\nmodule.exports = pointerUtils;\n","const { window } = require('./window');\n\nconst vendors = ['ms', 'moz', 'webkit', 'o'];\nlet lastTime = 0;\nlet request;\nlet cancel;\n\nfor (let x = 0; x < vendors.length && !window.requestAnimationFrame; x++) {\n request = window[vendors[x] + 'RequestAnimationFrame'];\n cancel = window[vendors[x] +'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n}\n\nif (!request) {\n request = function (callback) {\n const currTime = new Date().getTime();\n const timeToCall = Math.max(0, 16 - (currTime - lastTime));\n const id = setTimeout(function () { callback(currTime + timeToCall); },\n timeToCall);\n\n lastTime = currTime + timeToCall;\n return id;\n };\n}\n\nif (!cancel) {\n cancel = function (id) {\n clearTimeout(id);\n };\n}\n\nmodule.exports = {\n request,\n cancel,\n};\n","const extend = require('./extend');\nconst is = require('./is');\nconst {\n closest,\n parentNode,\n getElementRect,\n} = require('./domUtils');\n\nconst rectUtils = {\n getStringOptionResult: function (value, interactable, element) {\n if (!is.string(value)) {\n return null;\n }\n\n if (value === 'parent') {\n value = parentNode(element);\n }\n else if (value === 'self') {\n value = interactable.getRect(element);\n }\n else {\n value = closest(element, value);\n }\n\n return value;\n },\n\n resolveRectLike: function (value, interactable, element, functionArgs) {\n value = rectUtils.getStringOptionResult(value, interactable, element) || value;\n\n if (is.function(value)) {\n value = value.apply(null, functionArgs);\n }\n\n if (is.element(value)) {\n value = getElementRect(value);\n }\n\n return value;\n },\n\n rectToXY: function (rect) {\n return rect && {\n x: 'x' in rect ? rect.x : rect.left,\n y: 'y' in rect ? rect.y : rect.top,\n };\n },\n\n xywhToTlbr: function (rect) {\n if (rect && !('left' in rect && 'top' in rect)) {\n rect = extend({}, rect);\n\n rect.left = rect.x || 0;\n rect.top = rect.y || 0;\n rect.right = rect.right || (rect.left + rect.width);\n rect.bottom = rect.bottom || (rect.top + rect.height);\n }\n\n return rect;\n },\n\n tlbrToXywh: function (rect) {\n if (rect && !('x' in rect && 'y' in rect)) {\n rect = extend({}, rect);\n\n rect.x = rect.left || 0;\n rect.top = rect.top || 0;\n rect.width = rect.width || (rect.right - rect.x);\n rect.height = rect.height || (rect.bottom - rect.y);\n }\n\n return rect;\n },\n};\n\nmodule.exports = rectUtils;\n","const win = module.exports;\nconst isWindow = require('./isWindow');\n\nfunction init (window) {\n // get wrapped window if using Shadow DOM polyfill\n\n win.realWindow = window;\n\n // create a TextNode\n const el = window.document.createTextNode('');\n\n // check if it's wrapped by a polyfill\n if (el.ownerDocument !== window.document\n && typeof window.wrap === 'function'\n && window.wrap(el) === el) {\n // use wrapped window\n window = window.wrap(window);\n }\n\n win.window = window;\n}\n\nif (typeof window === 'undefined') {\n win.window = undefined;\n win.realWindow = undefined;\n}\nelse {\n init(window);\n}\n\nwin.getWindow = function getWindow (node) {\n if (isWindow(node)) {\n return node;\n }\n\n const rootNode = (node.ownerDocument || node);\n\n return rootNode.defaultView || rootNode.parentWindow || win.window;\n};\n\nwin.init = init;\n"]} \ No newline at end of file diff --git a/dist/interact.min.js b/dist/interact.min.js index c0bb2476c..2d1f0fb62 100644 --- a/dist/interact.min.js +++ b/dist/interact.min.js @@ -1,6 +1,6 @@ -/* interact.js v1.3.0-alpha.3+sha.9595c40 | https://raw.github.com/taye/interact.js/master/LICENSE */ -!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var t;t="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,t.interact=e()}}(function(){return function e(t,n,r){function i(s,a){if(!n[s]){if(!t[s]){var l="function"==typeof require&&require;if(!a&&l)return l(s,!0);if(o)return o(s,!0);var c=new Error("Cannot find module '"+s+"'");throw c.code="MODULE_NOT_FOUND",c}var p=n[s]={exports:{}};t[s][0].call(p.exports,function(e){var n=t[s][1][e];return i(n||e)},p,p.exports,e,t,n,r)}return n[s].exports}for(var o="function"==typeof require&&require,s=0;s6&&void 0!==arguments[6]&&arguments[6];r(this,e);var f=t.target,v=(f&&f.options||s).deltaSource,g=o(f,p,l),h="start"===c,m="end"===c,y=h?t.startCoords:t.curCoords,x=t.prevEvent;p=p||t.element;var b=i({},y.page),w=i({},y.client);b.x-=g.x,b.y-=g.y,w.x-=g.x,w.y-=g.y,this.ctrlKey=n.ctrlKey,this.altKey=n.altKey,this.shiftKey=n.shiftKey,this.metaKey=n.metaKey,this.button=n.button,this.buttons=n.buttons,this.target=p,this.currentTarget=p,this.relatedTarget=u||null,this.preEnd=d,this.type=l+(c||""),this.interaction=t,this.interactable=f,this.t0=h?t.downTimes[t.downTimes.length-1]:x.t0;var E={interaction:t,event:n,action:l,phase:c,element:p,related:u,page:b,client:w,coords:y,starting:h,ending:m,deltaSource:v,iEvent:this};a.fire("set-xy",E),m?(this.pageX=x.pageX,this.pageY=x.pageY,this.clientX=x.clientX,this.clientY=x.clientY):(this.pageX=b.x,this.pageY=b.y,this.clientX=w.x,this.clientY=w.y),this.x0=t.startCoords.page.x-g.x,this.y0=t.startCoords.page.y-g.y,this.clientX0=t.startCoords.client.x-g.x,this.clientY0=t.startCoords.client.y-g.y,a.fire("set-delta",E),this.timeStamp=y.timeStamp,this.dt=t.pointerDelta.timeStamp,this.duration=this.timeStamp-this.t0,this.speed=t.pointerDelta[v].speed,this.velocityX=t.pointerDelta[v].vx,this.velocityY=t.pointerDelta[v].vy,this.swipe=m||"inertiastart"===c?this.getSwipe():null,a.fire("new",E)}return e.prototype.getSwipe=function(){var e=this.interaction;if(e.prevEvent.speed<600||this.timeStamp-e.prevEvent.timeStamp>150)return null;var t=180*Math.atan2(e.prevEvent.velocityY,e.prevEvent.velocityX)/Math.PI;t<0&&(t+=360);var n=112.5<=t&&t<247.5,r=202.5<=t&&t<337.5,i=!n&&(292.5<=t||t<67.5);return{up:r,down:!r&&22.5<=t&&t<157.5,left:n,right:i,angle:t,speed:e.prevEvent.speed,velocity:{x:e.prevEvent.velocityX,y:e.prevEvent.velocityY}}},e.prototype.preventDefault=function(){},e.prototype.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},e.prototype.stopPropagation=function(){this.propagationStopped=!0},e}();a.on("set-delta",function(e){var t=e.iEvent,n=e.interaction,r=e.starting,i=e.deltaSource,o=r?t:n.prevEvent;"client"===i?(t.dx=t.clientX-o.clientX,t.dy=t.clientY-o.clientY):(t.dx=t.pageX-o.pageX,t.dy=t.pageY-o.pageY)}),l.signals=a,t.exports=l},{"./defaultOptions":18,"./utils/Signals":35,"./utils/extend":41,"./utils/getOriginXY":42}],4:[function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=e("./utils/is"),o=e("./utils/events"),s=e("./utils/extend"),a=e("./actions/base"),l=e("./scope"),c=e("./Eventable"),p=e("./defaultOptions"),u=e("./utils/Signals").new(),d=e("./utils/domUtils"),f=d.getElementRect,v=d.nodeContains,g=d.trySelector,h=e("./utils/window"),m=h.getWindow,y=e("./utils/arr"),x=y.indexOf,b=y.contains,w=e("./utils/browser"),E=w.wheelEvent;l.interactables=[];var S=function(){function e(t,n){r(this,e),n=n||{},this.target=t,this.events=new c,this._context=n.context||l.document,this._win=m(g(t)?this._context:t),this._doc=this._win.document,u.fire("new",{target:t,options:n,interactable:this,win:this._win}),l.addDocument(this._doc,this._win),l.interactables.push(this),this.set(n)}return e.prototype.setOnEvents=function(e,t){var n="on"+e;return i.function(t.onstart)&&(this.events[n+"start"]=t.onstart),i.function(t.onmove)&&(this.events[n+"move"]=t.onmove),i.function(t.onend)&&(this.events[n+"end"]=t.onend),i.function(t.oninertiastart)&&(this.events[n+"inertiastart"]=t.oninertiastart),this},e.prototype.setPerAction=function(e,t){for(var n in t)n in p[e]&&(i.object(t[n])?(this.options[e][n]=s(this.options[e][n]||{},t[n]),i.object(p.perAction[n])&&"enabled"in p.perAction[n]&&(this.options[e][n].enabled=!1!==t[n].enabled)):i.bool(t[n])&&i.object(p.perAction[n])?this.options[e][n].enabled=t[n]:void 0!==t[n]&&(this.options[e][n]=t[n]))},e.prototype.getRect=function(e){return e=e||this.target,i.string(this.target)&&!i.element(e)&&(e=this._context.querySelector(this.target)),f(e)},e.prototype.rectChecker=function(e){return i.function(e)?(this.getRect=e,this):null===e?(delete this.options.getRect,this):this.getRect},e.prototype._backCompatOption=function(e,t){if(g(t)||i.object(t)){this.options[e]=t;for(var n=a.names,r=Array.isArray(n),o=0,n=r?n:n[Symbol.iterator]();;){var s;if(r){if(o>=n.length)break;s=n[o++]}else{if(o=n.next(),o.done)break;s=o.value}var l=s;this.options[l][e]=t}return this}return this.options[e]},e.prototype.origin=function(e){return this._backCompatOption("origin",e)},e.prototype.deltaSource=function(e){return"page"===e||"client"===e?(this.options.deltaSource=e,this):this.options.deltaSource},e.prototype.context=function(){return this._context},e.prototype.inContext=function(e){return this._context===e.ownerDocument||v(this._context,e)},e.prototype.fire=function(e){return this.events.fire(e),this},e.prototype._onOffMultiple=function(e,t,n,r){if(i.string(t)&&-1!==t.search(" ")&&(t=t.trim().split(/ +/)),i.array(t)){for(var o=0;o=l.length)break;f=l[d++]}else{if(d=l.next(),d.done)break;f=d.value}var v=f;this.options[v]=p.base[v],v in t&&this[v](t[v])}return u.fire("set",{options:t,interactable:this}),this},e.prototype.unset=function(){if(o.remove(this.target,"all"),i.string(this.target))for(var e in o.delegatedEvents){var t=o.delegatedEvents[e];t.selectors[0]===this.target&&t.contexts[0]===this._context&&(t.selectors.splice(0,1),t.contexts.splice(0,1),t.listeners.splice(0,1),t.selectors.length||(t[e]=null)),o.remove(this._context,e,o.delegateListener),o.remove(this._context,e,o.delegateUseCapture,!0)}else o.remove(this,"all");u.fire("unset",{interactable:this}),l.interactables.splice(x(l.interactables,this),1);for(var n=l.interactions||[],r=Array.isArray(n),s=0,n=r?n:n[Symbol.iterator]();;){var a;if(r){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var c=a;c.target===this&&c.interacting()&&c.stop()}return l.interact},e}();l.interactables.indexOfElement=function(e,t){t=t||l.document;for(var n=0;n=y.length)break;w=y[b++]}else{if(b=y.next(),b.done)break;w=b.value}var E=w,S=E[0],T=E[1];T._updateEventTargets(r,i),T[e](S,t,r,i)}}}function o(e){for(var t=0;te.pointerMoveTolerance);var a={pointer:t,pointerIndex:this.getPointerIndex(t),event:n,eventTarget:r,dx:o,dy:s,duplicate:i,interaction:this,interactingBeforeMove:this.interacting()};i||l.setCoordDeltas(this.pointerDelta,this.prevCoords,this.curCoords),d.fire("move",a),i||(this.interacting()&&this.doMove(a),this.pointerWasMoved&&l.copyCoords(this.prevCoords,this.curCoords))},e.prototype.doMove=function(e){e=l.extend({pointer:this.pointers[0],event:this.prevEvent,eventTarget:this._eventTarget,interaction:this},e||{}),d.fire("before-action-move",e),this._dontFireMove||d.fire("action-move",e),this._dontFireMove=!1},e.prototype.pointerUp=function(e,t,n,r){var i=this.getPointerIndex(e);d.fire(/cancel$/i.test(t.type)?"cancel":"up",{pointer:e,pointerIndex:i,event:t,eventTarget:n,curEventTarget:r,interaction:this}),this.simulation||this.end(t),this.pointerIsDown=!1,this.removePointer(e,t)},e.prototype.end=function(e){e=e||this.prevEvent,this.interacting()&&d.fire("action-end",{event:e,interaction:this}),this.stop()},e.prototype.currentAction=function(){return this._interacting?this.prepared.name:null},e.prototype.interacting=function(){return this._interacting},e.prototype.stop=function(){d.fire("stop",{interaction:this}),this._interacting&&(d.fire("stop-active",{interaction:this}),d.fire("stop-"+this.prepared.name,{interaction:this})),this.target=this.element=null,this._interacting=!1,this.prepared.name=this.prevEvent=null},e.prototype.getPointerIndex=function(e){return l.indexOf(this.pointerIds,l.getPointerId(e))},e.prototype.updatePointer=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:t&&/(down|start)$/i.test(t.type),r=l.getPointerId(e),i=this.getPointerIndex(e);return-1===i&&(i=this.pointerIds.length,this.pointerIds[i]=r),n&&d.fire("update-pointer-down",{pointer:e,event:t,down:n,pointerId:r,pointerIndex:i,interaction:this}),this.pointers[i]=e,i},e.prototype.removePointer=function(e,t){var n=l.getPointerId(e),r=this.mouse?0:l.indexOf(this.pointerIds,n);-1!==r&&(d.fire("remove-pointer",{pointer:e,event:t,pointerIndex:r,interaction:this}),this.pointers.splice(r,1),this.pointerIds.splice(r,1),this.downTargets.splice(r,1),this.downTimes.splice(r,1))},e.prototype._updateEventTargets=function(e,t){this._eventTarget=e,this._curEventTarget=t},e}(),m=0,y=v.length;m=i.length)break;a=i[s++]}else{if(s=i.next(),s.done)break;a=s.value}var l=a;if(l.options.drop.enabled){var c=l.options.drop.accept;if(!(p.is.element(c)&&c!==t||p.is.string(c)&&!p.matchesSelector(t,c)))for(var d=p.is.string(l.target)?l._context.querySelectorAll(l.target):[l.target],f=0;fo.left&&c.xo.top&&c.y=o.left&&v<=o.right&&g>=o.top&&g<=o.bottom}if(f&&p.is.number(a)){s=Math.max(0,Math.min(o.right,f.right)-Math.max(o.left,f.left))*Math.max(0,Math.min(o.bottom,f.bottom)-Math.max(o.top,f.top))/(f.width*f.height)>=a}return this.options.drop.checker&&(s=this.options.drop.checker(e,t,s,this,i,n,r)),s},v.signals.on("unset",function(e){e.interactable.dropzone(!1)}),v.settingsMethods.push("dropChecker"),g.signals.on("new",function(e){e.dropTarget=null,e.dropElement=null,e.prevDropTarget=null,e.prevDropElement=null,e.dropEvents=null,e.activeDrops={dropzones:[],elements:[],rects:[]}}),g.signals.on("stop",function(e){var t=e.interaction;t.dropTarget=t.dropElement=t.prevDropTarget=t.prevDropElement=null}),d.dynamicDrop=function(e){return p.is.bool(e)?(y=e,d):y},p.merge(v.eventTypes,["dragenter","dragleave","dropactivate","dropdeactivate","dropmove","drop"]),c.methodDict.drop="dropzone",h.drop=m.defaults,t.exports=m},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../interact":21,"../scope":34,"../utils":44,"./base":6}],9:[function(e,t,n){"use strict";var r=e("./base"),i=e("../utils"),o=e("../InteractEvent"),s=e("../Interactable"),a=e("../Interaction"),l=e("../defaultOptions"),c={defaults:{enabled:!1,origin:null,restrict:null},checker:function(e,t,n,r,i){return i.pointerIds.length>=2?{name:"gesture"}:null},getCursor:function(){return""}};o.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;"gesturestart"===t.type&&(t.ds=0,n.gesture.startDistance=n.gesture.prevDistance=t.distance,n.gesture.startAngle=n.gesture.prevAngle=t.angle,n.gesture.scale=1)}),o.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;"gesturemove"===t.type&&(t.ds=t.scale-n.gesture.scale,n.target.fire(t),n.gesture.prevAngle=t.angle,n.gesture.prevDistance=t.distance,t.scale===1/0||null===t.scale||void 0===t.scale||isNaN(t.scale)||(n.gesture.scale=t.scale))}),s.prototype.gesturable=function(e){return i.is.object(e)?(this.options.gesture.enabled=!1!==e.enabled,this.setPerAction("gesture",e),this.setOnEvents("gesture",e),this):i.is.bool(e)?(this.options.gesture.enabled=e,e||(this.ongesturestart=this.ongesturestart=this.ongestureend=null),this):this.options.gesture},o.signals.on("set-delta",function(e){var t=e.interaction,n=e.iEvent,r=e.action,s=e.event,a=e.starting,l=e.ending,c=e.deltaSource;if("gesture"===r){var p=t.pointers;n.touches=[p[0],p[1]],a?(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=1,n.ds=0,n.angle=i.touchAngle(p,void 0,c),n.da=0):l||s instanceof o?(n.distance=t.prevEvent.distance,n.box=t.prevEvent.box,n.scale=t.prevEvent.scale,n.ds=n.scale-1,n.angle=t.prevEvent.angle,n.da=n.angle-t.gesture.startAngle):(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=n.distance/t.gesture.startDistance,n.angle=i.touchAngle(p,t.gesture.prevAngle,c),n.ds=n.scale-t.gesture.prevScale,n.da=n.angle-t.gesture.prevAngle)}}),a.signals.on("new",function(e){e.gesture={start:{x:0,y:0},startDistance:0,prevDistance:0,distance:0,scale:1,startAngle:0,prevAngle:0}}),r.gesture=c,r.names.push("gesture"),i.merge(s.eventTypes,["gesturestart","gesturemove","gestureend"]),r.methodDict.gesture="gesturable",l.gesture=c.defaults,t.exports=c},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"./base":6}],10:[function(e,t,n){"use strict";function r(e,t,n,r,i,s,a){if(!t)return!1;if(!0===t){var l=o.is.number(s.width)?s.width:s.right-s.left,c=o.is.number(s.height)?s.height:s.bottom-s.top;if(l<0&&("left"===e?e="right":"right"===e&&(e="left")),c<0&&("top"===e?e="bottom":"bottom"===e&&(e="top")),"left"===e)return n.x<(l>=0?s.left:s.right)+a;if("top"===e)return n.y<(c>=0?s.top:s.bottom)+a;if("right"===e)return n.x>(l>=0?s.right:s.left)-a;if("bottom"===e)return n.y>(c>=0?s.bottom:s.top)-a}return!!o.is.element(r)&&(o.is.element(t)?t===r:o.matchesUpTo(r,t,i))}var i=e("./base"),o=e("../utils"),s=e("../utils/browser"),a=e("../InteractEvent"),l=e("../Interactable"),c=e("../Interaction"),p=e("../defaultOptions"),u=s.supportsTouch||s.supportsPointerEvent?20:10,d={defaults:{enabled:!1,mouseButtons:null,origin:null,snap:null,restrict:null,inertia:null,autoScroll:null,square:!1,preserveAspectRatio:!1,axis:"xy",margin:NaN,edges:null,invert:"none"},checker:function(e,t,n,i,s,a){if(!a)return null;var l=o.extend({},s.curCoords.page),c=n.options;if(c.resize.enabled){var p=c.resize,d={left:!1,right:!1,top:!1,bottom:!1};if(o.is.object(p.edges)){for(var f in d)d[f]=r(f,p.edges[f],l,s._eventTarget,i,a,p.margin||u);if(d.left=d.left&&!d.right,d.top=d.top&&!d.bottom,d.left||d.right||d.top||d.bottom)return{name:"resize",edges:d}}else{var v="y"!==c.resize.axis&&l.x>a.right-u,g="x"!==c.resize.axis&&l.y>a.bottom-u;if(v||g)return{name:"resize",axes:(v?"x":"")+(g?"y":"")}}}return null},cursors:s.isIe9OrOlder?{x:"e-resize",y:"s-resize",xy:"se-resize",top:"n-resize",left:"w-resize",bottom:"s-resize",right:"e-resize",topleft:"se-resize",bottomright:"se-resize",topright:"ne-resize",bottomleft:"ne-resize"}:{x:"ew-resize",y:"ns-resize",xy:"nwse-resize",top:"ns-resize",left:"ew-resize",bottom:"ns-resize",right:"ew-resize",topleft:"nwse-resize",bottomright:"nwse-resize",topright:"nesw-resize",bottomleft:"nesw-resize"},getCursor:function(e){if(e.axis)return d.cursors[e.name+e.axis];if(e.edges){for(var t="",n=["top","bottom","left","right"],r=0;r<4;r++)e.edges[n[r]]&&(t+=n[r]);return d.cursors[t]}}};a.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;if("resizestart"===t.type&&n.prepared.edges){var r=n.target.getRect(n.element),i=n.target.options.resize;if(i.square||i.preserveAspectRatio){var s=o.extend({},n.prepared.edges);s.top=s.top||s.left&&!s.bottom,s.left=s.left||s.top&&!s.right,s.bottom=s.bottom||s.right&&!s.top,s.right=s.right||s.bottom&&!s.left,n.prepared._linkedEdges=s}else n.prepared._linkedEdges=null;i.preserveAspectRatio&&(n.resizeStartAspectRatio=r.width/r.height),n.resizeRects={start:r,current:o.extend({},r),inverted:o.extend({},r),previous:o.extend({},r),delta:{left:0,right:0,width:0,top:0,bottom:0,height:0}},t.rect=n.resizeRects.inverted,t.deltaRect=n.resizeRects.delta}}),a.signals.on("new",function(e){var t=e.iEvent,n=e.phase,r=e.interaction;if("move"===n&&r.prepared.edges){var i=r.target.options.resize,s=i.invert,a="reposition"===s||"negate"===s,l=r.prepared.edges,c=r.resizeRects.start,p=r.resizeRects.current,u=r.resizeRects.inverted,d=r.resizeRects.delta,f=o.extend(r.resizeRects.previous,u),v=l,g=t.dx,h=t.dy;if(i.preserveAspectRatio||i.square){var m=i.preserveAspectRatio?r.resizeStartAspectRatio:1;l=r.prepared._linkedEdges,v.left&&v.bottom||v.right&&v.top?h=-g/m:v.left||v.right?h=g/m:(v.top||v.bottom)&&(g=h*m)}if(l.top&&(p.top+=h),l.bottom&&(p.bottom+=h),l.left&&(p.left+=g),l.right&&(p.right+=g),a){if(o.extend(u,p),"reposition"===s){var y=void 0;u.top>u.bottom&&(y=u.top,u.top=u.bottom,u.bottom=y),u.left>u.right&&(y=u.left,u.left=u.right,u.right=y)}}else u.top=Math.min(p.top,c.bottom),u.bottom=Math.max(p.bottom,c.top),u.left=Math.min(p.left,c.right),u.right=Math.max(p.right,c.left);u.width=u.right-u.left,u.height=u.bottom-u.top;for(var x in u)d[x]=u[x]-f[x];t.edges=r.prepared.edges,t.rect=u,t.deltaRect=d}}),l.prototype.resizable=function(e){return o.is.object(e)?(this.options.resize.enabled=!1!==e.enabled,this.setPerAction("resize",e),this.setOnEvents("resize",e),/^x$|^y$|^xy$/.test(e.axis)?this.options.resize.axis=e.axis:null===e.axis&&(this.options.resize.axis=p.resize.axis),o.is.bool(e.preserveAspectRatio)?this.options.resize.preserveAspectRatio=e.preserveAspectRatio:o.is.bool(e.square)&&(this.options.resize.square=e.square),this):o.is.bool(e)?(this.options.resize.enabled=e,e||(this.onresizestart=this.onresizestart=this.onresizeend=null),this):this.options.resize},c.signals.on("new",function(e){ -e.resizeAxes="xy"}),a.signals.on("set-delta",function(e){var t=e.interaction,n=e.iEvent;"resize"===e.action&&t.resizeAxes&&(t.target.options.resize.square?("y"===t.resizeAxes?n.dx=n.dy:n.dy=n.dx,n.axes="xy"):(n.axes=t.resizeAxes,"x"===t.resizeAxes?n.dy=0:"y"===t.resizeAxes&&(n.dx=0)))}),i.resize=d,i.names.push("resize"),o.merge(l.eventTypes,["resizestart","resizemove","resizeinertiastart","resizeinertiaresume","resizeend"]),i.methodDict.resize="resizable",p.resize=d.defaults,t.exports=d},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"../utils/browser":37,"./base":6}],11:[function(e,t,n){"use strict";var r=e("./utils/raf"),i=e("./utils/window").getWindow,o=e("./utils/is"),s=e("./utils/domUtils"),a=e("./Interaction"),l=e("./defaultOptions"),c={defaults:{enabled:!1,container:null,margin:60,speed:300},interaction:null,i:null,x:0,y:0,isScrolling:!1,prevTime:0,start:function(e){c.isScrolling=!0,r.cancel(c.i),c.interaction=e,c.prevTime=(new Date).getTime(),c.i=r.request(c.scroll)},stop:function(){c.isScrolling=!1,r.cancel(c.i)},scroll:function(){var e=c.interaction.target.options[c.interaction.prepared.name].autoScroll,t=e.container||i(c.interaction.element),n=(new Date).getTime(),s=(n-c.prevTime)/1e3,a=e.speed*s;a>=1&&(o.window(t)?t.scrollBy(c.x*a,c.y*a):t&&(t.scrollLeft+=c.x*a,t.scrollTop+=c.y*a),c.prevTime=n),c.isScrolling&&(r.cancel(c.i),c.i=r.request(c.scroll))},check:function(e,t){var n=e.options;return n[t].autoScroll&&n[t].autoScroll.enabled},onInteractionMove:function(e){var t=e.interaction,n=e.pointer;if(t.interacting()&&c.check(t.target,t.prepared.name)){if(t.simulation)return void(c.x=c.y=0);var r=void 0,a=void 0,l=void 0,p=void 0,u=t.target.options[t.prepared.name].autoScroll,d=u.container||i(t.element);if(o.window(d))p=n.clientXd.innerWidth-c.margin,l=n.clientY>d.innerHeight-c.margin;else{var f=s.getElementClientRect(d);p=n.clientXf.right-c.margin,l=n.clientY>f.bottom-c.margin}c.x=a?1:p?-1:0,c.y=l?1:r?-1:0,c.isScrolling||(c.margin=u.margin,c.speed=u.speed,c.start(t))}}};a.signals.on("stop-active",function(){c.stop()}),a.signals.on("action-move",c.onInteractionMove),l.perAction.autoScroll=c.defaults,t.exports=c},{"./Interaction":5,"./defaultOptions":18,"./utils/domUtils":39,"./utils/is":46,"./utils/raf":50,"./utils/window":52}],12:[function(e,t,n){"use strict";var r=e("../Interactable"),i=e("../actions/base"),o=e("../utils/is"),s=e("../utils/domUtils");r.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},r.prototype.ignoreFrom=function(e){return this._backCompatOption("ignoreFrom",e)},r.prototype.allowFrom=function(e){return this._backCompatOption("allowFrom",e)},r.prototype.testIgnore=function(e,t,n){return!(!e||!o.element(n))&&(o.string(e)?s.matchesUpTo(n,e,t):!!o.element(e)&&s.nodeContains(e,n))},r.prototype.testAllow=function(e,t,n){return!e||!!o.element(n)&&(o.string(e)?s.matchesUpTo(n,e,t):!!o.element(e)&&s.nodeContains(e,n))},r.prototype.testIgnoreAllow=function(e,t,n){return!this.testIgnore(e.ignoreFrom,t,n)&&this.testAllow(e.allowFrom,t,n)},r.prototype.actionChecker=function(e){return o.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},r.prototype.styleCursor=function(e){return o.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},r.prototype.defaultActionChecker=function(e,t,n,r){for(var o=this.getRect(r),s=null,a=i.names,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var u=p;if((!n.pointerIsDown||!n.mouse||0!=(t.buttons&this.options[u].mouseButtons))&&(s=i[u].checker(e,t,this,r,n,o)))return s}}},{"../Interactable":4,"../actions/base":6,"../utils/domUtils":39,"../utils/is":46}],13:[function(e,t,n){"use strict";function r(e,t,n,r){return g.is.object(e)&&t.testIgnoreAllow(t.options[e.name],n,r)&&t.options[e.name].enabled&&a(t,n,e)?e:null}function i(e,t,n,i,o,s){for(var a=0,l=i.length;a=m.maxInteractions)return!1;if(u.target===e){if((a+=d===n.name|0)>=i)return!1;if(u.element===t&&(l++,d!==n.name||l>=o))return!1}}}return m.maxInteractions>0}}var l=e("../interact"),c=e("../Interactable"),p=e("../Interaction"),u=e("../actions/base"),d=e("../defaultOptions"),f=e("../utils/browser"),v=e("../scope"),g=e("../utils"),h=e("../utils/Signals").new();e("./InteractableMethods");var m={signals:h,withinInteractionLimit:a,maxInteractions:1/0,defaults:{perAction:{manualStart:!1,max:1/0,maxPerElement:1,allowFrom:null,ignoreFrom:null}},setActionDefaults:function(e){g.extend(e.defaults,m.defaults.perAction)}};p.signals.on("down",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;if(!t.interacting()){s(t,o(t,n,r,i))}}),p.signals.on("move",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;if(t.mouse&&!t.pointerIsDown&&!t.interacting()){s(t,o(t,n,r,i))}}),p.signals.on("move",function(e){var t=e.interaction,n=e.event;if(t.pointerIsDown&&!t.interacting()&&t.pointerWasMoved&&t.prepared.name){h.fire("before-start",e);var r=t.target;t.prepared.name&&r&&(r.options[t.prepared.name].manualStart||!a(r,t.element,t.prepared)?t.stop(n):t.start(t.prepared,r,t.element))}}),p.signals.on("stop",function(e){var t=e.interaction,n=t.target;n&&n.options.styleCursor&&(n._doc.documentElement.style.cursor="")}),c.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},c.prototype.actionChecker=function(e){return g.is.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},c.prototype.styleCursor=function(e){return g.is.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},c.prototype.defaultActionChecker=function(e,t,n,r){for(var i=this.getRect(r),o=t.buttons||{0:1,1:4,3:8,4:16}[t.button],s=null,a=u.names,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var d=p;if((!n.pointerIsDown||!n.mouse||0!=(o&this.options[d].mouseButtons))&&(s=u[d].checker(e,t,this,r,n,i)))return s}},l.maxInteractions=function(e){return g.is.number(e)?(m.maxInteractions=e,this):m.maxInteractions},c.settingsMethods.push("styleCursor"),c.settingsMethods.push("actionChecker"),c.settingsMethods.push("ignoreFrom"),c.settingsMethods.push("allowFrom"),d.base.actionChecker=null,d.base.styleCursor=!0,g.extend(d.perAction,m.defaults.perAction),t.exports=m},{"../Interactable":4,"../Interaction":5,"../actions/base":6,"../defaultOptions":18,"../interact":21,"../scope":34,"../utils":44,"../utils/Signals":35,"../utils/browser":37,"./InteractableMethods":12}],14:[function(e,t,n){"use strict";var r=e("./base"),i=e("../Interaction");i.signals.on("new",function(e){e.delayTimer=null}),r.signals.on("prepared",function(e){var t=e.interaction,n=t.prepared.name;if(n){var r=t.target.options[n].delay;r>0&&(t.delayTimer=setTimeout(function(){t.start(t.prepared,t.target,t.element)},r))}}),i.signals.on("move",function(e){var t=e.interaction,n=e.duplicate;t.pointerWasMoved&&!n&&clearTimeout(t.delayTimer)}),r.signals.on("before-start",function(e){var t=e.interaction,n=t.prepared.name;if(n){t.target.options[n].delay>0&&(t.prepared.name=null)}})},{"../Interaction":5,"./base":13}],15:[function(e,t,n){"use strict";function r(e,t){if(!t)return!1;var n=t.options.drag.startAxis;return"xy"===e||"xy"===n||n===e}var i=e("./base"),o=e("../scope"),s=e("../utils/browser"),a=e("../utils/is"),l=e("../utils/domUtils"),c=l.matchesSelector,p=l.parentNode;i.setActionDefaults(e("../actions/drag")),i.signals.on("before-start",function(e){var t=e.interaction,n=e.eventTarget,l=e.dx,u=e.dy;if("drag"===t.prepared.name){var d=Math.abs(l),f=Math.abs(u),v=t.target.options.drag,g=v.startAxis,h=d>f?"x":dl.minSpeed&&g>l.endSpeed,b={interaction:t,pageCoords:v,statuses:f,preEnd:!0,requireEndOnly:!0};y&&!x&&(c.resetStatuses(f),m=c.setAll(b),m.shouldMove&&m.locked&&(h=!0)),(x||h)&&(p.copyCoords(i.upCoords,t.curCoords),t.pointers[0]=i.startEvent=new a(t,n,t.prepared.name,"inertiastart",t.element),i.t0=d,i.active=!0,i.allowResume=l.allowResume,t.simulation=i,o.fire(i.startEvent),x?(i.vx0=t.pointerDelta.client.vx,i.vy0=t.pointerDelta.client.vy,i.v0=g,r(t,i),p.extend(v,t.curCoords.page),v.x+=i.xe,v.y+=i.ye,c.resetStatuses(f),m=c.setAll(b),i.modifiedXe+=m.dx,i.modifiedYe+=m.dy,i.i=u.request(t.boundInertiaFrame)):(i.smoothEnd=!0,i.xe=m.dx,i.ye=m.dy,i.sx=i.sy=0,i.i=u.request(t.boundSmoothEndFrame)))}}),l.signals.on("stop-active",function(e){var t=e.interaction,n=t.inertiaStatus;n.active&&(u.cancel(n.i),n.active=!1,t.simulation=null)})},{"./InteractEvent":3,"./Interaction":5,"./modifiers":24,"./utils":44,"./utils/raf":50}],21:[function(e,t,n){"use strict";function r(e,t){var n=a.interactables.get(e,t);return n||(n=new l(e,t),n.events.global=p),n}var i=e("./utils/browser"),o=e("./utils/events"),s=e("./utils"),a=e("./scope"),l=e("./Interactable"),c=e("./Interaction"),p={};r.isSet=function(e,t){return-1!==a.interactables.indexOfElement(e,t&&t.context)},r.on=function(e,t,n){if(s.is.string(e)&&-1!==e.search(" ")&&(e=e.trim().split(/ +/)),s.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.on(f,t,n)}return r}if(s.is.object(e)){for(var v in e)r.on(v,e[v],t);return r}return s.contains(l.eventTypes,e)?p[e]?p[e].push(t):p[e]=[t]:o.add(a.document,e,t,{options:n}),r},r.off=function(e,t,n){if(s.is.string(e)&&-1!==e.search(" ")&&(e=e.trim().split(/ +/)),s.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.off(f,t,n)}return r}if(s.is.object(e)){for(var v in e)r.off(v,e[v],t);return r}if(s.contains(l.eventTypes,e)){var g=void 0;e in p&&-1!==(g=s.indexOf(p[e],t))&&p[e].splice(g,1)}else o.remove(a.document,e,t,n);return r},r.debug=function(){return a},r.getPointerAverage=s.pointerAverage,r.getTouchBBox=s.touchBBox,r.getTouchDistance=s.touchDistance,r.getTouchAngle=s.touchAngle,r.getElementRect=s.getElementRect,r.getElementClientRect=s.getElementClientRect,r.matchesSelector=s.matchesSelector,r.closest=s.closest,r.supportsTouch=function(){return i.supportsTouch},r.supportsPointerEvent=function(){return i.supportsPointerEvent},r.stop=function(e){for(var t=a.interactions.length-1;t>=0;t--)a.interactions[t].stop(e);return r},r.pointerMoveTolerance=function(e){return s.is.number(e)?(c.pointerMoveTolerance=e,this):c.pointerMoveTolerance},r.addDocument=a.addDocument,r.removeDocument=a.removeDocument,a.interact=r,t.exports=r},{"./Interactable":4,"./Interaction":5,"./scope":34,"./utils":44,"./utils/browser":37,"./utils/events":40}],22:[function(e,t,n){"use strict";function r(e){var t=e.interaction,n=e.event;t.target&&t.target.checkAndPreventDefault(n)}var i=e("./Interactable"),o=e("./Interaction"),s=e("./scope"),a=e("./utils/is"),l=e("./utils/events"),c=e("./utils/domUtils"),p=c.nodeContains,u=c.matchesSelector;i.prototype.preventDefault=function(e){return/^(always|never|auto)$/.test(e)?(this.options.preventDefault=e,this):a.bool(e)?(this.options.preventDefault=e?"always":"never",this):this.options.preventDefault},i.prototype.checkAndPreventDefault=function(e){var t=this.options.preventDefault;if("never"!==t)return"always"===t?void e.preventDefault():void(l.supportsOptions||/^(mouse|pointer|touch)*(down|start)/i.test(e.type)||a.element(e.target)&&u(e.target,"input,select,textarea,[contenteditable=true],[contenteditable=true] *")||e.preventDefault())};for(var d=["down","move","up","cancel"],f=0;f=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i;if(o.element&&(o.element===e.target||p(o.element,e.target)))return void o.target.checkAndPreventDefault(e)}}},{"./Interactable":4,"./Interaction":5,"./scope":34,"./utils/domUtils":39,"./utils/events":40,"./utils/is":46}],23:[function(e,t,n){"use strict";function r(e){var t=e.target,n=a.search(e,e.type,t);n&&n.prevTap&&e.clientX===n.prevTap.clientX&&e.clientY===n.prevTap.clientY&&t===n.prevTap.target&&(n.downTargets[0]=t,n.downTimes[0]=(new Date).getTime(),l.fire({interaction:n,event:e,eventTarget:t,pointer:e,type:"tap"}))}var i=e("./scope"),o=e("./utils/events"),s=e("./utils/browser"),a=e("./utils/interactionFinder"),l=e("./pointerEvents/base"),c=e("./utils/window"),p=c.window,u=Object.prototype.toString;if(p.Array.isArray||(p.Array.isArray=function(e){return"[object Array]"===u.call(e)}),String.prototype.trim||(String.prototype.trim=function(){return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")}),s.isIE8){var d=function(e){for(var t=i.interactions,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var o;if(n){if(r>=t.length)break;o=t[r++]}else{if(r=t.next(),r.done)break;o=r.value}var s=o;s.interacting()&&s.target.checkAndPreventDefault(e)}},f=function(e,t){var n=e.doc,i=(e.win,0===t.indexOf("listen")?o.add:o.remove);i(n,"selectstart",d),l&&i(n,"dblclick",r)};i.signals.on("add-document",f),i.signals.on("remove-document",f)}t.exports=null},{"./pointerEvents/base":31,"./scope":34,"./utils/browser":37,"./utils/events":40,"./utils/interactionFinder":45,"./utils/window":52}],24:[function(e,t,n){"use strict";function r(e,t,n){return e&&e.enabled&&(t||!e.endOnly)&&(!n||e.endOnly)}var i=e("../InteractEvent"),o=e("../Interaction"),s=e("../utils/extend"),a={names:[],setOffsets:function(e){var t=e.interaction,n=e.pageCoords,r=t.target,i=t.element,o=t.startOffset,s=r.getRect(i);s?(o.left=n.x-s.left,o.top=n.y-s.top,o.right=s.right-n.x,o.bottom=s.bottom-n.y,"width"in s||(s.width=s.right-s.left),"height"in s||(s.height=s.bottom-s.top)):o.left=o.top=o.right=o.bottom=0,e.rect=s,e.interactable=r,e.element=i;for(var l=0;l=p.length)break;f=p[d++]}else{if(d=p.next(),d.done)break;f=d.value}var v=f,g=a[v],h=t.target.options[t.prepared.name][v];r(h,i,o)&&(e.status=e.status=n[v],e.options=h,e.offset=e.interaction.modifierOffsets[v],g.set(e),e.status.locked&&(l.x+=e.status.dx,l.y+=e.status.dy,c.dx+=e.status.dx,c.dy+=e.status.dy,c.locked=!0))}return c.shouldMove=!e.status||!c.locked||e.status.changed,c},resetStatuses:function(e){for(var t=a.names,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var i;if(n){if(r>=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i,s=e[o]||{};s.dx=s.dy=0,s.modifiedX=s.modifiedY=NaN,s.locked=!1,s.changed=!0,e[o]=s}return e},start:function(e,t){var n=e.interaction,r={interaction:n,pageCoords:("action-resume"===t?n.curCoords:n.startCoords).page,startOffset:n.startOffset,statuses:n.modifierStatuses,preEnd:!1,requireEndOnly:!1};a.setOffsets(r),a.resetStatuses(r.statuses),r.pageCoords=s({},n.startCoords.page),n.modifierResult=a.setAll(r)}};o.signals.on("new",function(e){e.startOffset={left:0,right:0,top:0,bottom:0},e.modifierOffsets={},e.modifierStatuses=a.resetStatuses({}),e.modifierResult=null}),o.signals.on("action-start",a.start),o.signals.on("action-resume",a.start),o.signals.on("before-action-move",function(e){var t=e.interaction,n=e.preEnd,r=e.interactingBeforeMove,i=a.setAll({interaction:t,preEnd:n,pageCoords:t.curCoords.page,statuses:t.modifierStatuses,requireEndOnly:!1});!i.shouldMove&&r&&(t._dontFireMove=!0),t.modifierResult=i}),o.signals.on("action-end",function(e){for(var t=e.interaction,n=e.event,i=0;i=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}var m=h,y=m.x,x=m.y;l.push({x:s.left-i.width*y+u.x,y:s.top-i.height*x+u.y})}else l.push(u);return l},set:function(e){var t=e.interaction,n=e.pageCoords,r=e.status,i=e.options,s=e.offset,a=[],l=void 0,c=void 0,p=void 0;if(r.useStatusXY)c={x:r.x,y:r.y};else{var u=o.getOriginXY(t.target,t.element,t.prepared.name);c=o.extend({},n),c.x-=u.x,c.y-=u.y}r.realX=c.x,r.realY=c.y;for(var d=i.targets?i.targets.length:0,f=s,v=Array.isArray(f),g=0,f=v?f:f[Symbol.iterator]();;){var h;if(v){if(g>=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}for(var m=h,y=m.x,x=m.y,b=c.x-y,w=c.y-x,E=i.targets,S=Array.isArray(E),T=0,E=S?E:E[Symbol.iterator]();;){var C;if(S){if(T>=E.length)break;C=E[T++]}else{if(T=E.next(),T.done)break;C=T.value}var A=C;l=o.is.function(A)?A(b,w,t):A,l&&a.push({x:o.is.number(l.x)?l.x+y:b,y:o.is.number(l.y)?l.y+x:w,range:o.is.number(l.range)?l.range:i.range})}}var D={target:null,inRange:!1,distance:0,range:0,dx:0,dy:0};for(p=0,d=a.length;p=p.length)break;f=p[d++]}else{if(d=p.next(),d.done)break;f=d.value}var v=f,g=void 0;g=a.is.function(v)?v(l,c,t):v,g&&("width"in g&&"height"in g&&(g.x=g.width,g.y=g.height),e.options.targets.push(g))}i.set(e)},modifyCoords:function(e){var t=e.options;e.options=a.extend({},t), -e.options.enabled=t.enabled,e.options.relativePoints=[null],i.modifyCoords(e)}};r.snapSize=l,r.names.push("snapSize"),o.perAction.snapSize=l.defaults,s.defaults.snapSize=l.defaults,t.exports=l},{"../actions/resize":10,"../defaultOptions":18,"../utils/":44,"./index":24,"./snap":28}],30:[function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=e("../utils/pointerUtils");t.exports=function(){function e(t,n,o,s,a){if(r(this,e),i.pointerExtend(this,o),o!==n&&i.pointerExtend(this,n),this.interaction=a,this.timeStamp=(new Date).getTime(),this.originalEvent=o,this.type=t,this.pointerId=i.getPointerId(n),this.pointerType=i.getPointerType(n,a),this.target=s,this.currentTarget=null,"tap"===t){var l=a.getPointerIndex(n);this.dt=this.timeStamp-a.downTimes[l];var c=this.timeStamp-a.tapTime;this.double=!!(a.prevTap&&"doubletap"!==a.prevTap.type&&a.prevTap.target===this.target&&c<500)}else"doubletap"===t&&(this.dt=n.timeStamp-a.tapTime)}return e.prototype.subtractOrigin=function(e){var t=e.x,n=e.y;return this.pageX-=t,this.pageY-=n,this.clientX-=t,this.clientY-=n,this},e.prototype.addOrigin=function(e){var t=e.x,n=e.y;return this.pageX+=t,this.pageY+=n,this.clientX+=t,this.clientY+=n,this},e.prototype.preventDefault=function(){this.originalEvent.preventDefault()},e.prototype.stopPropagation=function(){this.propagationStopped=!0},e.prototype.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},e}()},{"../utils/pointerUtils":49}],31:[function(e,t,n){"use strict";function r(e){for(var t=e.interaction,n=e.pointer,s=e.event,l=e.eventTarget,c=e.type,u=void 0===c?e.pointerEvent.type:c,d=e.targets,f=void 0===d?i(e):d,v=e.pointerEvent,g=void 0===v?new o(u,n,s,l,t):v,h={interaction:t,pointer:n,event:s,eventTarget:l,targets:f,type:u,pointerEvent:g},m=0;m=u.length)break;g=u[v++]}else{if(v=u.next(),v.done)break;g=v.value}var h=g;c.element=h,p.fire("collect-targets",c)}return"hold"===o&&(c.targets=d(c.targets,function(e){return e.eventable.options.holdDuration===t.holdTimers[s].duration})),c.targets}var o=e("./PointerEvent"),s=e("../Interaction"),a=e("../utils"),l=e("../utils/browser"),c=e("../defaultOptions"),p=e("../utils/Signals").new(),u=e("../utils/arr"),d=u.filter,f=["down","up","cancel"],v=["down","up","cancel"],g={PointerEvent:o,fire:r,collectEventTargets:i,signals:p,defaults:{holdDuration:600,ignoreFrom:null,allowFrom:null,origin:{x:0,y:0}},types:["down","move","up","cancel","tap","doubletap","hold"]};s.signals.on("update-pointer-down",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers[n]={duration:1/0,timeout:null}}),s.signals.on("remove-pointer",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers.splice(n,1)}),s.signals.on("move",function(e){var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,s=e.duplicateMove,a=t.getPointerIndex(n);s||t.pointerIsDown&&!t.pointerWasMoved||(t.pointerIsDown&&clearTimeout(t.holdTimers[a].timeout),r({interaction:t,pointer:n,event:i,eventTarget:o,type:"move"}))}),s.signals.on("down",function(e){for(var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,s=e.pointerIndex,c=l.isIE8?a.extend({},i):i,u=t.holdTimers[s],d=a.getPath(o),f={interaction:t,pointer:n,event:i,eventTarget:o,type:"hold",targets:[],path:d,element:null},v=d,g=Array.isArray(v),h=0,v=g?v:v[Symbol.iterator]();;){var m;if(g){if(h>=v.length)break;m=v[h++]}else{if(h=v.next(),h.done)break;m=h.value}var y=m;f.element=y,p.fire("collect-targets",f)}if(f.targets.length){for(var x=1/0,b=0;b=0&&(p.selectors[u]!==e||p.contexts[u]!==t);u--);-1===u&&(u=p.selectors.length,p.selectors.push(e),p.contexts.push(t),p.listeners.push([])),p.listeners[u].push([i,!!s.capture,s.passive])}function s(e,t,n,r,o){var s=f(o),c=O[n],p=!1,u=void 0;if(c)for(u=c.selectors.length-1;u>=0;u--)if(c.selectors[u]===e&&c.contexts[u]===t){for(var d=c.listeners[u],v=d.length-1;v>=0;v--){var g=d[v],h=g[0],m=g[1],y=g[2];if(h===r&&m===!!s.capture&&y===s.passive){d.splice(v,1),d.length||(c.selectors.splice(u,1),c.contexts.splice(u,1),c.listeners.splice(u,1),i(t,n,a),i(t,n,l,!0),c.selectors.length||(O[n]=null)),p=!0;break}}if(p)break}}function a(e,t){var n=f(t),r={},i=O[e.type],o=g.getActualElement(e.path?e.path[0]:e.target),s=o;for(h(r,e),r.originalEvent=e,r.preventDefault=p;v.element(s);){for(var a=0;a=l.length)break;u=l[p++]}else{if(p=l.next(),p.done)break;u=p.value}var d=u,f=s[d](a);if(f)return f}},simulationResume:function(e){var t=e.mouseEvent,n=e.eventType,o=e.eventTarget;if(!/down|start/i.test(n))return null;for(var s=r.interactions,a=Array.isArray(s),l=0,s=a?s:s[Symbol.iterator]();;){var c;if(a){if(l>=s.length)break;c=s[l++]}else{if(l=s.next(),l.done)break;c=l.value}var p=c,u=o;if(p.simulation&&p.simulation.allowResume&&p.mouse===t)for(;u;){if(u===p.element)return p;u=i.parentNode(u)}}return null},mouse:function(e){var t=e.pointerId,n=e.mouseEvent,s=e.eventType;if(!n&&(o.supportsTouch||o.supportsPointerEvent))return null;for(var a=void 0,l=r.interactions,c=Array.isArray(l),p=0,l=c?l:l[Symbol.iterator]();;){var u;if(c){if(p>=l.length)break;u=l[p++]}else{if(p=l.next(),p.done)break;u=p.value}var d=u;if(d.mouse){if(d.simulation&&!i.contains(d.pointerIds,t))continue;if(d.interacting())return d;a||(a=d)}}if(a)return a;for(var f=r.interactions,v=Array.isArray(f),g=0,f=v?f:f[Symbol.iterator]();;){var h;if(v){if(g>=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}var m=h;if(m.mouse&&(!/down/.test(s)||!m.simulation))return m}return null},hasPointer:function(e){for(var t=e.pointerId,n=r.interactions,o=Array.isArray(n),s=0,n=o?n:n[Symbol.iterator]();;){var a;if(o){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var l=a;if(i.contains(l.pointerIds,t))return l}},idle:function(e){for(var t=e.mouseEvent,n=r.interactions,i=Array.isArray(n),o=0,n=i?n:n[Symbol.iterator]();;){var s;if(i){if(o>=n.length)break;s=n[o++]}else{if(o=n.next(),o.done)break;s=o.value}var a=s;if(1===a.pointerIds.length){var l=a.target;if(l&&!l.options.gesture.enabled)continue}else if(a.pointerIds.length>=2)continue;if(!a.interacting()&&t===a.mouse)return a}return null}};t.exports=s},{"../scope":34,"./browser":37,"./index":44}],46:[function(e,t,n){"use strict";var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},i=e("./window"),o=e("./isWindow"),s={array:function(){},window:function(e){return e===i.window||o(e)},docFrag:function(e){return s.object(e)&&11===e.nodeType},object:function(e){return!!e&&"object"===(void 0===e?"undefined":r(e))},function:function(e){return"function"==typeof e},number:function(e){return"number"==typeof e},bool:function(e){return"boolean"==typeof e},string:function(e){return"string"==typeof e},element:function(e){if(!e||"object"!==(void 0===e?"undefined":r(e)))return!1;var t=i.getWindow(e)||i.window;return/object|function/.test(r(t.Element))?e instanceof t.Element:1===e.nodeType&&"string"==typeof e.nodeName}};s.array=function(e){return s.object(e)&&void 0!==e.length&&s.function(e.splice)},t.exports=s},{"./isWindow":47,"./window":52}],47:[function(e,t,n){"use strict";t.exports=function(e){return!(!e||!e.Window)&&e instanceof e.Window}},{}],48:[function(e,t,n){"use strict";function r(e,n){for(var r in n){var i=t.exports.prefixedPropREs,o=!1;for(var s in i)if(0===r.indexOf(s)&&i[s].test(r)){o=!0;break}o||"function"==typeof n[r]||(e[r]=n[r])}return e}r.prefixedPropREs={webkit:/(Movement[XY]|Radius[XY]|RotationAngle|Force)$/},t.exports=r},{}],49:[function(e,t,n){"use strict";var r=e("./hypot"),i=e("./browser"),o=e("./domObjects"),s=e("./domUtils"),a=e("./is"),l=e("./pointerExtend"),c={copyCoords:function(e,t){e.page=e.page||{},e.page.x=t.page.x,e.page.y=t.page.y,e.client=e.client||{},e.client.x=t.client.x,e.client.y=t.client.y,e.timeStamp=t.timeStamp},setCoordDeltas:function(e,t,n){e.page.x=n.page.x-t.page.x,e.page.y=n.page.y-t.page.y,e.client.x=n.client.x-t.client.x,e.client.y=n.client.y-t.client.y,e.timeStamp=n.timeStamp-t.timeStamp;var i=Math.max(e.timeStamp/1e3,.001);e.page.speed=r(e.page.x,e.page.y)/i,e.page.vx=e.page.x/i,e.page.vy=e.page.y/i,e.client.speed=r(e.client.x,e.page.y)/i,e.client.vx=e.client.x/i,e.client.vy=e.client.y/i},isNativePointer:function(e){return e instanceof o.Event||e instanceof o.Touch},getXY:function(e,t,n){return n=n||{},e=e||"page",n.x=t[e+"X"],n.y=t[e+"Y"],n},getPageXY:function(e,t){return t=t||{},i.isOperaMobile&&c.isNativePointer(e)?(c.getXY("screen",e,t),t.x+=window.scrollX,t.y+=window.scrollY):c.getXY("page",e,t),t},getClientXY:function(e,t){return t=t||{},i.isOperaMobile&&c.isNativePointer(e)?c.getXY("screen",e,t):c.getXY("client",e,t),t},getPointerId:function(e){return a.number(e.pointerId)?e.pointerId:e.identifier},setCoords:function(e,t,n){var r=t.length>1?c.pointerAverage(t):t[0],i={};c.getPageXY(r,i),e.page.x=i.x,e.page.y=i.y,c.getClientXY(r,i),e.client.x=i.x,e.client.y=i.y,e.timeStamp=a.number(n)?n:(new Date).getTime()},pointerExtend:l,getTouchPair:function(e){var t=[];return a.array(e)?(t[0]=e[0],t[1]=e[1]):"touchend"===e.type?1===e.touches.length?(t[0]=e.touches[0],t[1]=e.changedTouches[0]):0===e.touches.length&&(t[0]=e.changedTouches[0],t[1]=e.changedTouches[1]):(t[0]=e.touches[0],t[1]=e.touches[1]),t},pointerAverage:function(e){for(var t={pageX:0,pageY:0,clientX:0,clientY:0,screenX:0,screenY:0},n=e,r=Array.isArray(n),i=0,n=r?n:n[Symbol.iterator]();;){var o;if(r){if(i>=n.length)break;o=n[i++]}else{if(i=n.next(),i.done)break;o=i.value}var s=o;for(var a in t)t[a]+=s[a]}for(var l in t)t[l]/=e.length;return t},touchBBox:function(e){if(e.length||e.touches&&e.touches.length>1){var t=c.getTouchPair(e),n=Math.min(t[0].pageX,t[1].pageX),r=Math.min(t[0].pageY,t[1].pageY);return{x:n,y:r,left:n,top:r,width:Math.max(t[0].pageX,t[1].pageX)-n,height:Math.max(t[0].pageY,t[1].pageY)-r}}},touchDistance:function(e,t){var n=t+"X",i=t+"Y",o=c.getTouchPair(e),s=o[0][n]-o[1][n],a=o[0][i]-o[1][i];return r(s,a)},touchAngle:function(e,t,n){var r=n+"X",i=n+"Y",o=c.getTouchPair(e),s=o[1][r]-o[0][r],a=o[1][i]-o[0][i];return 180*Math.atan2(a,s)/Math.PI},getPointerType:function(e,t){return t.mouse?"mouse":i.supportsPointerEvent?a.string(e.pointerType)?e.pointerType:[void 0,void 0,"touch","pen","mouse"][e.pointerType]:"touch"},getEventTargets:function(e){return[s.getActualElement(e.path?e.path[0]:e.target),s.getActualElement(e.currentTarget)]}};t.exports=c},{"./browser":37,"./domObjects":38,"./domUtils":39,"./hypot":43,"./is":46,"./pointerExtend":48}],50:[function(e,t,n){"use strict";for(var r=e("./window"),i=r.window,o=["ms","moz","webkit","o"],s=0,a=void 0,l=void 0,c=0;c6&&void 0!==arguments[6]&&arguments[6];r(this,e);var f=t.target,v=(f&&f.options||s).deltaSource,g=o(f,p,l),h="start"===c,m="end"===c,y=h?t.startCoords:t.curCoords,x=t.prevEvent;p=p||t.element;var b=i({},y.page),w=i({},y.client);b.x-=g.x,b.y-=g.y,w.x-=g.x,w.y-=g.y,this.ctrlKey=n.ctrlKey,this.altKey=n.altKey,this.shiftKey=n.shiftKey,this.metaKey=n.metaKey,this.button=n.button,this.buttons=n.buttons,this.target=p,this.currentTarget=p,this.relatedTarget=u||null,this.preEnd=d,this.type=l+(c||""),this.interaction=t,this.interactable=f,this.t0=h?t.downTimes[t.downTimes.length-1]:x.t0;var E={interaction:t,event:n,action:l,phase:c,element:p,related:u,page:b,client:w,coords:y,starting:h,ending:m,deltaSource:v,iEvent:this};a.fire("set-xy",E),m?(this.pageX=x.pageX,this.pageY=x.pageY,this.clientX=x.clientX,this.clientY=x.clientY):(this.pageX=b.x,this.pageY=b.y,this.clientX=w.x,this.clientY=w.y),this.x0=t.startCoords.page.x-g.x,this.y0=t.startCoords.page.y-g.y,this.clientX0=t.startCoords.client.x-g.x,this.clientY0=t.startCoords.client.y-g.y,a.fire("set-delta",E),this.timeStamp=y.timeStamp,this.dt=t.pointerDelta.timeStamp,this.duration=this.timeStamp-this.t0,this.speed=t.pointerDelta[v].speed,this.velocityX=t.pointerDelta[v].vx,this.velocityY=t.pointerDelta[v].vy,this.swipe=m||"inertiastart"===c?this.getSwipe():null,a.fire("new",E)}return e.prototype.getSwipe=function(){var e=this.interaction;if(e.prevEvent.speed<600||this.timeStamp-e.prevEvent.timeStamp>150)return null;var t=180*Math.atan2(e.prevEvent.velocityY,e.prevEvent.velocityX)/Math.PI;t<0&&(t+=360);var n=112.5<=t&&t<247.5,r=202.5<=t&&t<337.5,i=!n&&(292.5<=t||t<67.5);return{up:r,down:!r&&22.5<=t&&t<157.5,left:n,right:i,angle:t,speed:e.prevEvent.speed,velocity:{x:e.prevEvent.velocityX,y:e.prevEvent.velocityY}}},e.prototype.preventDefault=function(){},e.prototype.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},e.prototype.stopPropagation=function(){this.propagationStopped=!0},e}();a.on("set-delta",function(e){var t=e.iEvent,n=e.interaction,r=e.starting,i=e.deltaSource,o=r?t:n.prevEvent;"client"===i?(t.dx=t.clientX-o.clientX,t.dy=t.clientY-o.clientY):(t.dx=t.pageX-o.pageX,t.dy=t.pageY-o.pageY)}),l.signals=a,t.exports=l},{"./defaultOptions":18,"./utils/Signals":35,"./utils/extend":41,"./utils/getOriginXY":42}],4:[function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=e("./utils/is"),o=e("./utils/events"),s=e("./utils/extend"),a=e("./actions/base"),l=e("./scope"),c=e("./Eventable"),p=e("./defaultOptions"),u=e("./utils/Signals").new(),d=e("./utils/domUtils"),f=d.getElementRect,v=d.nodeContains,g=d.trySelector,h=e("./utils/window"),m=h.getWindow,y=e("./utils/arr"),x=y.indexOf,b=y.contains,w=e("./utils/browser"),E=w.wheelEvent;l.interactables=[];var S=function(){function e(t,n){r(this,e),n=n||{},this.target=t,this.events=new c,this._context=n.context||l.document,this._win=m(g(t)?this._context:t),this._doc=this._win.document,u.fire("new",{target:t,options:n,interactable:this,win:this._win}),l.addDocument(this._doc,this._win),l.interactables.push(this),this.set(n)}return e.prototype.setOnEvents=function(e,t){var n="on"+e;return i.function(t.onstart)&&(this.events[n+"start"]=t.onstart),i.function(t.onmove)&&(this.events[n+"move"]=t.onmove),i.function(t.onend)&&(this.events[n+"end"]=t.onend),i.function(t.oninertiastart)&&(this.events[n+"inertiastart"]=t.oninertiastart),this},e.prototype.setPerAction=function(e,t){for(var n in t)n in p[e]&&(i.object(t[n])?(this.options[e][n]=s(this.options[e][n]||{},t[n]),i.object(p.perAction[n])&&"enabled"in p.perAction[n]&&(this.options[e][n].enabled=!1!==t[n].enabled)):i.bool(t[n])&&i.object(p.perAction[n])?this.options[e][n].enabled=t[n]:void 0!==t[n]&&(this.options[e][n]=t[n]))},e.prototype.getRect=function(e){return e=e||this.target,i.string(this.target)&&!i.element(e)&&(e=this._context.querySelector(this.target)),f(e)},e.prototype.rectChecker=function(e){return i.function(e)?(this.getRect=e,this):null===e?(delete this.options.getRect,this):this.getRect},e.prototype._backCompatOption=function(e,t){if(g(t)||i.object(t)){this.options[e]=t;for(var n=a.names,r=Array.isArray(n),o=0,n=r?n:n[Symbol.iterator]();;){var s;if(r){if(o>=n.length)break;s=n[o++]}else{if(o=n.next(),o.done)break;s=o.value}var l=s;this.options[l][e]=t}return this}return this.options[e]},e.prototype.origin=function(e){return this._backCompatOption("origin",e)},e.prototype.deltaSource=function(e){return"page"===e||"client"===e?(this.options.deltaSource=e,this):this.options.deltaSource},e.prototype.context=function(){return this._context},e.prototype.inContext=function(e){return this._context===e.ownerDocument||v(this._context,e)},e.prototype.fire=function(e){return this.events.fire(e),this},e.prototype._onOffMultiple=function(e,t,n,r){if(i.string(t)&&-1!==t.search(" ")&&(t=t.trim().split(/ +/)),i.array(t)){for(var o=0;o=l.length)break;f=l[d++]}else{if(d=l.next(),d.done)break;f=d.value}var v=f;this.options[v]=p.base[v],v in t&&this[v](t[v])}return u.fire("set",{options:t,interactable:this}),this},e.prototype.unset=function(){if(o.remove(this.target,"all"),i.string(this.target))for(var e in o.delegatedEvents){var t=o.delegatedEvents[e];t.selectors[0]===this.target&&t.contexts[0]===this._context&&(t.selectors.splice(0,1),t.contexts.splice(0,1),t.listeners.splice(0,1),t.selectors.length||(t[e]=null)),o.remove(this._context,e,o.delegateListener),o.remove(this._context,e,o.delegateUseCapture,!0)}else o.remove(this,"all");u.fire("unset",{interactable:this}),l.interactables.splice(x(l.interactables,this),1);for(var n=l.interactions||[],r=Array.isArray(n),s=0,n=r?n:n[Symbol.iterator]();;){var a;if(r){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var c=a;c.target===this&&c.interacting()&&c.stop()}return l.interact},e}();l.interactables.indexOfElement=function(e,t){t=t||l.document;for(var n=0;n=x.length)break;E=x[w++]}else{if(w=x.next(),w.done)break;E=w.value}var S=E,T=S[0],C=S[1];C._updateEventTargets(i,o),C[e](T,t,i,o)}}}function o(e){for(var t=0;te.pointerMoveTolerance);var a={pointer:t,pointerIndex:this.getPointerIndex(t),event:n,eventTarget:r,dx:o,dy:s,duplicate:i,interaction:this,interactingBeforeMove:this.interacting()};i||l.setCoordDeltas(this.pointerDelta,this.prevCoords,this.curCoords),f.fire("move",a),i||(this.interacting()&&this.doMove(a),this.pointerWasMoved&&l.copyCoords(this.prevCoords,this.curCoords))},e.prototype.doMove=function(e){e=l.extend({pointer:this.pointers[0],event:this.prevEvent,eventTarget:this._eventTarget,interaction:this},e||{}),f.fire("before-action-move",e),this._dontFireMove||f.fire("action-move",e),this._dontFireMove=!1},e.prototype.pointerUp=function(e,t,n,r){var i=this.getPointerIndex(e);f.fire(/cancel$/i.test(t.type)?"cancel":"up",{pointer:e,pointerIndex:i,event:t,eventTarget:n,curEventTarget:r,interaction:this}),this.simulation||this.end(t),this.pointerIsDown=!1,this.removePointer(e,t)},e.prototype.end=function(e){e=e||this.prevEvent,this.interacting()&&f.fire("action-end",{event:e,interaction:this}),this.stop()},e.prototype.currentAction=function(){return this._interacting?this.prepared.name:null},e.prototype.interacting=function(){return this._interacting},e.prototype.stop=function(){f.fire("stop",{interaction:this}),this._interacting&&(f.fire("stop-active",{interaction:this}),f.fire("stop-"+this.prepared.name,{interaction:this})),this.target=this.element=null,this._interacting=!1,this.prepared.name=this.prevEvent=null},e.prototype.getPointerIndex=function(e){return"mouse"===this.pointerType||"pen"===this.pointerType?0:l.indexOf(this.pointerIds,l.getPointerId(e))},e.prototype.updatePointer=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:t&&/(down|start)$/i.test(t.type),r=l.getPointerId(e),i=this.getPointerIndex(e);return-1===i&&(i=this.pointerIds.length,this.pointerIds[i]=r),n&&f.fire("update-pointer-down",{pointer:e,event:t,down:n,pointerId:r,pointerIndex:i,interaction:this}),this.pointers[i]=e,i},e.prototype.removePointer=function(e,t){var n=this.getPointerIndex(e);-1!==n&&(f.fire("remove-pointer",{pointer:e,event:t,pointerIndex:n,interaction:this}),this.pointers.splice(n,1),this.pointerIds.splice(n,1),this.downTargets.splice(n,1),this.downTimes.splice(n,1))},e.prototype._updateEventTargets=function(e,t){this._eventTarget=e,this._curEventTarget=t},e}(),y=0,x=g.length;y=i.length)break;a=i[s++]}else{if(s=i.next(),s.done)break;a=s.value}var l=a;if(l.options.drop.enabled){var c=l.options.drop.accept;if(!(p.is.element(c)&&c!==t||p.is.string(c)&&!p.matchesSelector(t,c)))for(var d=p.is.string(l.target)?l._context.querySelectorAll(l.target):[l.target],f=0;fo.left&&c.xo.top&&c.y=o.left&&v<=o.right&&g>=o.top&&g<=o.bottom}if(f&&p.is.number(a)){s=Math.max(0,Math.min(o.right,f.right)-Math.max(o.left,f.left))*Math.max(0,Math.min(o.bottom,f.bottom)-Math.max(o.top,f.top))/(f.width*f.height)>=a}return this.options.drop.checker&&(s=this.options.drop.checker(e,t,s,this,i,n,r)),s},v.signals.on("unset",function(e){e.interactable.dropzone(!1)}),v.settingsMethods.push("dropChecker"),g.signals.on("new",function(e){e.dropTarget=null,e.dropElement=null,e.prevDropTarget=null,e.prevDropElement=null,e.dropEvents=null,e.activeDrops={dropzones:[],elements:[],rects:[]}}),g.signals.on("stop",function(e){var t=e.interaction;t.dropTarget=t.dropElement=t.prevDropTarget=t.prevDropElement=null}),d.dynamicDrop=function(e){return p.is.bool(e)?(y=e,d):y},p.merge(v.eventTypes,["dragenter","dragleave","dropactivate","dropdeactivate","dropmove","drop"]),c.methodDict.drop="dropzone",h.drop=m.defaults,t.exports=m},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../interact":21,"../scope":34,"../utils":44,"./base":6}],9:[function(e,t,n){"use strict";var r=e("./base"),i=e("../utils"),o=e("../InteractEvent"),s=e("../Interactable"),a=e("../Interaction"),l=e("../defaultOptions"),c={defaults:{enabled:!1,origin:null,restrict:null},checker:function(e,t,n,r,i){return i.pointerIds.length>=2?{name:"gesture"}:null},getCursor:function(){return""}};o.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;"gesturestart"===t.type&&(t.ds=0,n.gesture.startDistance=n.gesture.prevDistance=t.distance,n.gesture.startAngle=n.gesture.prevAngle=t.angle,n.gesture.scale=1)}),o.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;"gesturemove"===t.type&&(t.ds=t.scale-n.gesture.scale,n.target.fire(t),n.gesture.prevAngle=t.angle,n.gesture.prevDistance=t.distance,t.scale===1/0||null===t.scale||void 0===t.scale||isNaN(t.scale)||(n.gesture.scale=t.scale))}),s.prototype.gesturable=function(e){return i.is.object(e)?(this.options.gesture.enabled=!1!==e.enabled,this.setPerAction("gesture",e),this.setOnEvents("gesture",e),this):i.is.bool(e)?(this.options.gesture.enabled=e,e||(this.ongesturestart=this.ongesturestart=this.ongestureend=null),this):this.options.gesture},o.signals.on("set-delta",function(e){var t=e.interaction,n=e.iEvent,r=e.action,s=e.event,a=e.starting,l=e.ending,c=e.deltaSource;if("gesture"===r){var p=t.pointers;n.touches=[p[0],p[1]],a?(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=1,n.ds=0,n.angle=i.touchAngle(p,void 0,c),n.da=0):l||s instanceof o?(n.distance=t.prevEvent.distance,n.box=t.prevEvent.box,n.scale=t.prevEvent.scale,n.ds=n.scale-1,n.angle=t.prevEvent.angle,n.da=n.angle-t.gesture.startAngle):(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=n.distance/t.gesture.startDistance,n.angle=i.touchAngle(p,t.gesture.prevAngle,c),n.ds=n.scale-t.gesture.prevScale,n.da=n.angle-t.gesture.prevAngle)}}),a.signals.on("new",function(e){e.gesture={start:{x:0,y:0},startDistance:0,prevDistance:0,distance:0,scale:1,startAngle:0,prevAngle:0}}),r.gesture=c,r.names.push("gesture"),i.merge(s.eventTypes,["gesturestart","gesturemove","gestureend"]),r.methodDict.gesture="gesturable",l.gesture=c.defaults,t.exports=c},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"./base":6}],10:[function(e,t,n){"use strict";function r(e,t,n,r,i,s,a){if(!t)return!1;if(!0===t){var l=o.is.number(s.width)?s.width:s.right-s.left,c=o.is.number(s.height)?s.height:s.bottom-s.top;if(l<0&&("left"===e?e="right":"right"===e&&(e="left")),c<0&&("top"===e?e="bottom":"bottom"===e&&(e="top")),"left"===e)return n.x<(l>=0?s.left:s.right)+a;if("top"===e)return n.y<(c>=0?s.top:s.bottom)+a;if("right"===e)return n.x>(l>=0?s.right:s.left)-a;if("bottom"===e)return n.y>(c>=0?s.bottom:s.top)-a}return!!o.is.element(r)&&(o.is.element(t)?t===r:o.matchesUpTo(r,t,i))}var i=e("./base"),o=e("../utils"),s=e("../utils/browser"),a=e("../InteractEvent"),l=e("../Interactable"),c=e("../Interaction"),p=e("../defaultOptions"),u=s.supportsTouch||s.supportsPointerEvent?20:10,d={defaults:{enabled:!1,mouseButtons:null,origin:null,snap:null,restrict:null,inertia:null,autoScroll:null,square:!1,preserveAspectRatio:!1,axis:"xy",margin:NaN,edges:null,invert:"none"},checker:function(e,t,n,i,s,a){if(!a)return null;var l=o.extend({},s.curCoords.page),c=n.options;if(c.resize.enabled){var p=c.resize,d={left:!1,right:!1,top:!1,bottom:!1};if(o.is.object(p.edges)){for(var f in d)d[f]=r(f,p.edges[f],l,s._eventTarget,i,a,p.margin||u);if(d.left=d.left&&!d.right,d.top=d.top&&!d.bottom,d.left||d.right||d.top||d.bottom)return{name:"resize",edges:d}}else{var v="y"!==c.resize.axis&&l.x>a.right-u,g="x"!==c.resize.axis&&l.y>a.bottom-u;if(v||g)return{name:"resize",axes:(v?"x":"")+(g?"y":"")}}}return null},cursors:s.isIe9OrOlder?{x:"e-resize",y:"s-resize",xy:"se-resize",top:"n-resize",left:"w-resize",bottom:"s-resize",right:"e-resize",topleft:"se-resize",bottomright:"se-resize",topright:"ne-resize",bottomleft:"ne-resize"}:{x:"ew-resize",y:"ns-resize",xy:"nwse-resize",top:"ns-resize",left:"ew-resize",bottom:"ns-resize",right:"ew-resize",topleft:"nwse-resize",bottomright:"nwse-resize",topright:"nesw-resize",bottomleft:"nesw-resize"},getCursor:function(e){if(e.axis)return d.cursors[e.name+e.axis];if(e.edges){for(var t="",n=["top","bottom","left","right"],r=0;r<4;r++)e.edges[n[r]]&&(t+=n[r]);return d.cursors[t]}}};a.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;if("resizestart"===t.type&&n.prepared.edges){var r=n.target.getRect(n.element),i=n.target.options.resize;if(i.square||i.preserveAspectRatio){var s=o.extend({},n.prepared.edges);s.top=s.top||s.left&&!s.bottom,s.left=s.left||s.top&&!s.right,s.bottom=s.bottom||s.right&&!s.top,s.right=s.right||s.bottom&&!s.left,n.prepared._linkedEdges=s}else n.prepared._linkedEdges=null;i.preserveAspectRatio&&(n.resizeStartAspectRatio=r.width/r.height),n.resizeRects={start:r,current:o.extend({},r),inverted:o.extend({},r),previous:o.extend({},r),delta:{left:0,right:0,width:0,top:0,bottom:0,height:0}},t.rect=n.resizeRects.inverted,t.deltaRect=n.resizeRects.delta}}),a.signals.on("new",function(e){var t=e.iEvent,n=e.phase,r=e.interaction;if("move"===n&&r.prepared.edges){var i=r.target.options.resize,s=i.invert,a="reposition"===s||"negate"===s,l=r.prepared.edges,c=r.resizeRects.start,p=r.resizeRects.current,u=r.resizeRects.inverted,d=r.resizeRects.delta,f=o.extend(r.resizeRects.previous,u),v=l,g=t.dx,h=t.dy;if(i.preserveAspectRatio||i.square){var m=i.preserveAspectRatio?r.resizeStartAspectRatio:1;l=r.prepared._linkedEdges,v.left&&v.bottom||v.right&&v.top?h=-g/m:v.left||v.right?h=g/m:(v.top||v.bottom)&&(g=h*m)}if(l.top&&(p.top+=h),l.bottom&&(p.bottom+=h),l.left&&(p.left+=g),l.right&&(p.right+=g),a){if(o.extend(u,p),"reposition"===s){var y=void 0;u.top>u.bottom&&(y=u.top,u.top=u.bottom,u.bottom=y),u.left>u.right&&(y=u.left,u.left=u.right,u.right=y)}}else u.top=Math.min(p.top,c.bottom),u.bottom=Math.max(p.bottom,c.top),u.left=Math.min(p.left,c.right),u.right=Math.max(p.right,c.left);u.width=u.right-u.left,u.height=u.bottom-u.top;for(var x in u)d[x]=u[x]-f[x];t.edges=r.prepared.edges,t.rect=u,t.deltaRect=d}}),l.prototype.resizable=function(e){return o.is.object(e)?(this.options.resize.enabled=!1!==e.enabled,this.setPerAction("resize",e),this.setOnEvents("resize",e),/^x$|^y$|^xy$/.test(e.axis)?this.options.resize.axis=e.axis:null===e.axis&&(this.options.resize.axis=p.resize.axis),o.is.bool(e.preserveAspectRatio)?this.options.resize.preserveAspectRatio=e.preserveAspectRatio:o.is.bool(e.square)&&(this.options.resize.square=e.square),this):o.is.bool(e)?(this.options.resize.enabled=e, +e||(this.onresizestart=this.onresizestart=this.onresizeend=null),this):this.options.resize},c.signals.on("new",function(e){e.resizeAxes="xy"}),a.signals.on("set-delta",function(e){var t=e.interaction,n=e.iEvent;"resize"===e.action&&t.resizeAxes&&(t.target.options.resize.square?("y"===t.resizeAxes?n.dx=n.dy:n.dy=n.dx,n.axes="xy"):(n.axes=t.resizeAxes,"x"===t.resizeAxes?n.dy=0:"y"===t.resizeAxes&&(n.dx=0)))}),i.resize=d,i.names.push("resize"),o.merge(l.eventTypes,["resizestart","resizemove","resizeinertiastart","resizeinertiaresume","resizeend"]),i.methodDict.resize="resizable",p.resize=d.defaults,t.exports=d},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"../utils/browser":37,"./base":6}],11:[function(e,t,n){"use strict";var r=e("./utils/raf"),i=e("./utils/window").getWindow,o=e("./utils/is"),s=e("./utils/domUtils"),a=e("./Interaction"),l=e("./defaultOptions"),c={defaults:{enabled:!1,container:null,margin:60,speed:300},interaction:null,i:null,x:0,y:0,isScrolling:!1,prevTime:0,start:function(e){c.isScrolling=!0,r.cancel(c.i),c.interaction=e,c.prevTime=(new Date).getTime(),c.i=r.request(c.scroll)},stop:function(){c.isScrolling=!1,r.cancel(c.i)},scroll:function(){var e=c.interaction.target.options[c.interaction.prepared.name].autoScroll,t=e.container||i(c.interaction.element),n=(new Date).getTime(),s=(n-c.prevTime)/1e3,a=e.speed*s;a>=1&&(o.window(t)?t.scrollBy(c.x*a,c.y*a):t&&(t.scrollLeft+=c.x*a,t.scrollTop+=c.y*a),c.prevTime=n),c.isScrolling&&(r.cancel(c.i),c.i=r.request(c.scroll))},check:function(e,t){var n=e.options;return n[t].autoScroll&&n[t].autoScroll.enabled},onInteractionMove:function(e){var t=e.interaction,n=e.pointer;if(t.interacting()&&c.check(t.target,t.prepared.name)){if(t.simulation)return void(c.x=c.y=0);var r=void 0,a=void 0,l=void 0,p=void 0,u=t.target.options[t.prepared.name].autoScroll,d=u.container||i(t.element);if(o.window(d))p=n.clientXd.innerWidth-c.margin,l=n.clientY>d.innerHeight-c.margin;else{var f=s.getElementClientRect(d);p=n.clientXf.right-c.margin,l=n.clientY>f.bottom-c.margin}c.x=a?1:p?-1:0,c.y=l?1:r?-1:0,c.isScrolling||(c.margin=u.margin,c.speed=u.speed,c.start(t))}}};a.signals.on("stop-active",function(){c.stop()}),a.signals.on("action-move",c.onInteractionMove),l.perAction.autoScroll=c.defaults,t.exports=c},{"./Interaction":5,"./defaultOptions":18,"./utils/domUtils":39,"./utils/is":46,"./utils/raf":50,"./utils/window":52}],12:[function(e,t,n){"use strict";var r=e("../Interactable"),i=e("../actions/base"),o=e("../utils/is"),s=e("../utils/domUtils");r.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},r.prototype.ignoreFrom=function(e){return this._backCompatOption("ignoreFrom",e)},r.prototype.allowFrom=function(e){return this._backCompatOption("allowFrom",e)},r.prototype.testIgnore=function(e,t,n){return!(!e||!o.element(n))&&(o.string(e)?s.matchesUpTo(n,e,t):!!o.element(e)&&s.nodeContains(e,n))},r.prototype.testAllow=function(e,t,n){return!e||!!o.element(n)&&(o.string(e)?s.matchesUpTo(n,e,t):!!o.element(e)&&s.nodeContains(e,n))},r.prototype.testIgnoreAllow=function(e,t,n){return!this.testIgnore(e.ignoreFrom,t,n)&&this.testAllow(e.allowFrom,t,n)},r.prototype.actionChecker=function(e){return o.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},r.prototype.styleCursor=function(e){return o.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},r.prototype.defaultActionChecker=function(e,t,n,r){for(var o=this.getRect(r),s=null,a=i.names,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var u=p;if((!n.pointerIsDown||!n.mouse||0!=(t.buttons&this.options[u].mouseButtons))&&(s=i[u].checker(e,t,this,r,n,o)))return s}}},{"../Interactable":4,"../actions/base":6,"../utils/domUtils":39,"../utils/is":46}],13:[function(e,t,n){"use strict";function r(e,t,n,r){return g.is.object(e)&&t.testIgnoreAllow(t.options[e.name],n,r)&&t.options[e.name].enabled&&a(t,n,e)?e:null}function i(e,t,n,i,o,s){for(var a=0,l=i.length;a=m.maxInteractions)return!1;if(u.target===e){if((a+=d===n.name|0)>=i)return!1;if(u.element===t&&(l++,d!==n.name||l>=o))return!1}}}return m.maxInteractions>0}}var l=e("../interact"),c=e("../Interactable"),p=e("../Interaction"),u=e("../actions/base"),d=e("../defaultOptions"),f=e("../utils/browser"),v=e("../scope"),g=e("../utils"),h=e("../utils/Signals").new();e("./InteractableMethods");var m={signals:h,withinInteractionLimit:a,maxInteractions:1/0,defaults:{perAction:{manualStart:!1,max:1/0,maxPerElement:1,allowFrom:null,ignoreFrom:null}},setActionDefaults:function(e){g.extend(e.defaults,m.defaults.perAction)}};p.signals.on("down",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;if(!t.interacting()){s(t,o(t,n,r,i))}}),p.signals.on("move",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;if(t.mouse&&!t.pointerIsDown&&!t.interacting()){s(t,o(t,n,r,i))}}),p.signals.on("move",function(e){var t=e.interaction,n=e.event;if(t.pointerIsDown&&!t.interacting()&&t.pointerWasMoved&&t.prepared.name){h.fire("before-start",e);var r=t.target;t.prepared.name&&r&&(r.options[t.prepared.name].manualStart||!a(r,t.element,t.prepared)?t.stop(n):t.start(t.prepared,r,t.element))}}),p.signals.on("stop",function(e){var t=e.interaction,n=t.target;n&&n.options.styleCursor&&(n._doc.documentElement.style.cursor="")}),c.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},c.prototype.actionChecker=function(e){return g.is.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},c.prototype.styleCursor=function(e){return g.is.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},c.prototype.defaultActionChecker=function(e,t,n,r){for(var i=this.getRect(r),o=t.buttons||{0:1,1:4,3:8,4:16}[t.button],s=null,a=u.names,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var d=p;if((!n.pointerIsDown||!n.mouse||0!=(o&this.options[d].mouseButtons))&&(s=u[d].checker(e,t,this,r,n,i)))return s}},l.maxInteractions=function(e){return g.is.number(e)?(m.maxInteractions=e,this):m.maxInteractions},c.settingsMethods.push("styleCursor"),c.settingsMethods.push("actionChecker"),c.settingsMethods.push("ignoreFrom"),c.settingsMethods.push("allowFrom"),d.base.actionChecker=null,d.base.styleCursor=!0,g.extend(d.perAction,m.defaults.perAction),t.exports=m},{"../Interactable":4,"../Interaction":5,"../actions/base":6,"../defaultOptions":18,"../interact":21,"../scope":34,"../utils":44,"../utils/Signals":35,"../utils/browser":37,"./InteractableMethods":12}],14:[function(e,t,n){"use strict";var r=e("./base"),i=e("../Interaction");i.signals.on("new",function(e){e.delayTimer=null}),r.signals.on("prepared",function(e){var t=e.interaction,n=t.prepared.name;if(n){var r=t.target.options[n].delay;r>0&&(t.delayTimer=setTimeout(function(){t.start(t.prepared,t.target,t.element)},r))}}),i.signals.on("move",function(e){var t=e.interaction,n=e.duplicate;t.pointerWasMoved&&!n&&clearTimeout(t.delayTimer)}),r.signals.on("before-start",function(e){var t=e.interaction,n=t.prepared.name;if(n){t.target.options[n].delay>0&&(t.prepared.name=null)}})},{"../Interaction":5,"./base":13}],15:[function(e,t,n){"use strict";function r(e,t){if(!t)return!1;var n=t.options.drag.startAxis;return"xy"===e||"xy"===n||n===e}var i=e("./base"),o=e("../scope"),s=e("../utils/browser"),a=e("../utils/is"),l=e("../utils/domUtils"),c=l.matchesSelector,p=l.parentNode;i.setActionDefaults(e("../actions/drag")),i.signals.on("before-start",function(e){var t=e.interaction,n=e.eventTarget,l=e.dx,u=e.dy;if("drag"===t.prepared.name){var d=Math.abs(l),f=Math.abs(u),v=t.target.options.drag,g=v.startAxis,h=d>f?"x":dl.minSpeed&&g>l.endSpeed,b={interaction:t,pageCoords:v,statuses:f,preEnd:!0,requireEndOnly:!0};y&&!x&&(c.resetStatuses(f),m=c.setAll(b),m.shouldMove&&m.locked&&(h=!0)),(x||h)&&(p.copyCoords(i.upCoords,t.curCoords),t.pointers[0]=i.startEvent=new a(t,n,t.prepared.name,"inertiastart",t.element),i.t0=d,i.active=!0,i.allowResume=l.allowResume,t.simulation=i,o.fire(i.startEvent),x?(i.vx0=t.pointerDelta.client.vx,i.vy0=t.pointerDelta.client.vy,i.v0=g,r(t,i),p.extend(v,t.curCoords.page),v.x+=i.xe,v.y+=i.ye,c.resetStatuses(f),m=c.setAll(b),i.modifiedXe+=m.dx,i.modifiedYe+=m.dy,i.i=u.request(t.boundInertiaFrame)):(i.smoothEnd=!0,i.xe=m.dx,i.ye=m.dy,i.sx=i.sy=0,i.i=u.request(t.boundSmoothEndFrame)))}}),l.signals.on("stop-active",function(e){var t=e.interaction,n=t.inertiaStatus;n.active&&(u.cancel(n.i),n.active=!1,t.simulation=null)})},{"./InteractEvent":3,"./Interaction":5,"./modifiers":24,"./utils":44,"./utils/raf":50}],21:[function(e,t,n){"use strict";function r(e,t){var n=a.interactables.get(e,t);return n||(n=new l(e,t),n.events.global=p),n}var i=e("./utils/browser"),o=e("./utils/events"),s=e("./utils"),a=e("./scope"),l=e("./Interactable"),c=e("./Interaction"),p={};r.isSet=function(e,t){return-1!==a.interactables.indexOfElement(e,t&&t.context)},r.on=function(e,t,n){if(s.is.string(e)&&-1!==e.search(" ")&&(e=e.trim().split(/ +/)),s.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.on(f,t,n)}return r}if(s.is.object(e)){for(var v in e)r.on(v,e[v],t);return r}return s.contains(l.eventTypes,e)?p[e]?p[e].push(t):p[e]=[t]:o.add(a.document,e,t,{options:n}),r},r.off=function(e,t,n){if(s.is.string(e)&&-1!==e.search(" ")&&(e=e.trim().split(/ +/)),s.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.off(f,t,n)}return r}if(s.is.object(e)){for(var v in e)r.off(v,e[v],t);return r}if(s.contains(l.eventTypes,e)){var g=void 0;e in p&&-1!==(g=s.indexOf(p[e],t))&&p[e].splice(g,1)}else o.remove(a.document,e,t,n);return r},r.debug=function(){return a},r.getPointerAverage=s.pointerAverage,r.getTouchBBox=s.touchBBox,r.getTouchDistance=s.touchDistance,r.getTouchAngle=s.touchAngle,r.getElementRect=s.getElementRect,r.getElementClientRect=s.getElementClientRect,r.matchesSelector=s.matchesSelector,r.closest=s.closest,r.supportsTouch=function(){return i.supportsTouch},r.supportsPointerEvent=function(){return i.supportsPointerEvent},r.stop=function(e){for(var t=a.interactions.length-1;t>=0;t--)a.interactions[t].stop(e);return r},r.pointerMoveTolerance=function(e){return s.is.number(e)?(c.pointerMoveTolerance=e,this):c.pointerMoveTolerance},r.addDocument=a.addDocument,r.removeDocument=a.removeDocument,a.interact=r,t.exports=r},{"./Interactable":4,"./Interaction":5,"./scope":34,"./utils":44,"./utils/browser":37,"./utils/events":40}],22:[function(e,t,n){"use strict";function r(e){var t=e.interaction,n=e.event;t.target&&t.target.checkAndPreventDefault(n)}var i=e("./Interactable"),o=e("./Interaction"),s=e("./scope"),a=e("./utils/is"),l=e("./utils/events"),c=e("./utils/domUtils"),p=c.nodeContains,u=c.matchesSelector;i.prototype.preventDefault=function(e){return/^(always|never|auto)$/.test(e)?(this.options.preventDefault=e,this):a.bool(e)?(this.options.preventDefault=e?"always":"never",this):this.options.preventDefault},i.prototype.checkAndPreventDefault=function(e){var t=this.options.preventDefault;if("never"!==t)return"always"===t?void e.preventDefault():void(l.supportsOptions||/^(mouse|pointer|touch)*(down|start)/i.test(e.type)||a.element(e.target)&&u(e.target,"input,select,textarea,[contenteditable=true],[contenteditable=true] *")||e.preventDefault())};for(var d=["down","move","up","cancel"],f=0;f=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i;if(o.element&&(o.element===e.target||p(o.element,e.target)))return void o.target.checkAndPreventDefault(e)}}},{"./Interactable":4,"./Interaction":5,"./scope":34,"./utils/domUtils":39,"./utils/events":40,"./utils/is":46}],23:[function(e,t,n){"use strict";function r(e){var t=e.target,n=a.search(e,e.type,t);n&&n.prevTap&&e.clientX===n.prevTap.clientX&&e.clientY===n.prevTap.clientY&&t===n.prevTap.target&&(n.downTargets[0]=t,n.downTimes[0]=(new Date).getTime(),l.fire({interaction:n,event:e,eventTarget:t,pointer:e,type:"tap"}))}var i=e("./scope"),o=e("./utils/events"),s=e("./utils/browser"),a=e("./utils/interactionFinder"),l=e("./pointerEvents/base"),c=e("./utils/window"),p=c.window,u=Object.prototype.toString;if(p.Array.isArray||(p.Array.isArray=function(e){return"[object Array]"===u.call(e)}),String.prototype.trim||(String.prototype.trim=function(){return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")}),s.isIE8){var d=function(e){for(var t=i.interactions,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var o;if(n){if(r>=t.length)break;o=t[r++]}else{if(r=t.next(),r.done)break;o=r.value}var s=o;s.interacting()&&s.target.checkAndPreventDefault(e)}},f=function(e,t){var n=e.doc,i=(e.win,0===t.indexOf("listen")?o.add:o.remove);i(n,"selectstart",d),l&&i(n,"dblclick",r)};i.signals.on("add-document",f),i.signals.on("remove-document",f)}t.exports=null},{"./pointerEvents/base":31,"./scope":34,"./utils/browser":37,"./utils/events":40,"./utils/interactionFinder":45,"./utils/window":52}],24:[function(e,t,n){"use strict";function r(e,t,n){return e&&e.enabled&&(t||!e.endOnly)&&(!n||e.endOnly)}var i=e("../InteractEvent"),o=e("../Interaction"),s=e("../utils/extend"),a={names:[],setOffsets:function(e){var t=e.interaction,n=e.pageCoords,r=t.target,i=t.element,o=t.startOffset,s=r.getRect(i);s?(o.left=n.x-s.left,o.top=n.y-s.top,o.right=s.right-n.x,o.bottom=s.bottom-n.y,"width"in s||(s.width=s.right-s.left),"height"in s||(s.height=s.bottom-s.top)):o.left=o.top=o.right=o.bottom=0,e.rect=s,e.interactable=r,e.element=i;for(var l=0;l=p.length)break;f=p[d++]}else{if(d=p.next(),d.done)break;f=d.value}var v=f,g=a[v],h=t.target.options[t.prepared.name][v];r(h,i,o)&&(e.status=e.status=n[v],e.options=h,e.offset=e.interaction.modifierOffsets[v],g.set(e),e.status.locked&&(l.x+=e.status.dx,l.y+=e.status.dy,c.dx+=e.status.dx,c.dy+=e.status.dy,c.locked=!0))}return c.shouldMove=!e.status||!c.locked||e.status.changed,c},resetStatuses:function(e){for(var t=a.names,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var i;if(n){if(r>=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i,s=e[o]||{};s.dx=s.dy=0,s.modifiedX=s.modifiedY=NaN,s.locked=!1,s.changed=!0,e[o]=s}return e},start:function(e,t){var n=e.interaction,r={interaction:n,pageCoords:("action-resume"===t?n.curCoords:n.startCoords).page,startOffset:n.startOffset,statuses:n.modifierStatuses,preEnd:!1,requireEndOnly:!1};a.setOffsets(r),a.resetStatuses(r.statuses),r.pageCoords=s({},n.startCoords.page),n.modifierResult=a.setAll(r)}};o.signals.on("new",function(e){e.startOffset={left:0,right:0,top:0,bottom:0},e.modifierOffsets={},e.modifierStatuses=a.resetStatuses({}),e.modifierResult=null}),o.signals.on("action-start",a.start),o.signals.on("action-resume",a.start),o.signals.on("before-action-move",function(e){var t=e.interaction,n=e.preEnd,r=e.interactingBeforeMove,i=a.setAll({interaction:t,preEnd:n,pageCoords:t.curCoords.page,statuses:t.modifierStatuses,requireEndOnly:!1});!i.shouldMove&&r&&(t._dontFireMove=!0),t.modifierResult=i}),o.signals.on("action-end",function(e){for(var t=e.interaction,n=e.event,i=0;i=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}var m=h,y=m.x,x=m.y;l.push({x:s.left-i.width*y+u.x,y:s.top-i.height*x+u.y})}else l.push(u);return l},set:function(e){var t=e.interaction,n=e.pageCoords,r=e.status,i=e.options,s=e.offset,a=[],l=void 0,c=void 0,p=void 0;if(r.useStatusXY)c={x:r.x,y:r.y};else{var u=o.getOriginXY(t.target,t.element,t.prepared.name);c=o.extend({},n),c.x-=u.x,c.y-=u.y}r.realX=c.x,r.realY=c.y;for(var d=i.targets?i.targets.length:0,f=s,v=Array.isArray(f),g=0,f=v?f:f[Symbol.iterator]();;){var h;if(v){if(g>=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}for(var m=h,y=m.x,x=m.y,b=c.x-y,w=c.y-x,E=i.targets,S=Array.isArray(E),T=0,E=S?E:E[Symbol.iterator]();;){var C;if(S){if(T>=E.length)break;C=E[T++]}else{if(T=E.next(),T.done)break;C=T.value}var A=C;l=o.is.function(A)?A(b,w,t):A,l&&a.push({x:o.is.number(l.x)?l.x+y:b,y:o.is.number(l.y)?l.y+x:w,range:o.is.number(l.range)?l.range:i.range})}}var D={target:null,inRange:!1,distance:0,range:0,dx:0,dy:0};for(p=0,d=a.length;p=p.length)break;f=p[d++]}else{if(d=p.next(),d.done)break;f=d.value}var v=f,g=void 0;g=a.is.function(v)?v(l,c,t):v,g&&("width"in g&&"height"in g&&(g.x=g.width, +g.y=g.height),e.options.targets.push(g))}i.set(e)},modifyCoords:function(e){var t=e.options;e.options=a.extend({},t),e.options.enabled=t.enabled,e.options.relativePoints=[null],i.modifyCoords(e)}};r.snapSize=l,r.names.push("snapSize"),o.perAction.snapSize=l.defaults,s.defaults.snapSize=l.defaults,t.exports=l},{"../actions/resize":10,"../defaultOptions":18,"../utils/":44,"./index":24,"./snap":28}],30:[function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=e("../utils/pointerUtils");t.exports=function(){function e(t,n,o,s,a){if(r(this,e),i.pointerExtend(this,o),o!==n&&i.pointerExtend(this,n),this.interaction=a,this.timeStamp=(new Date).getTime(),this.originalEvent=o,this.type=t,this.pointerId=i.getPointerId(n),this.pointerType=i.getPointerType(n),this.target=s,this.currentTarget=null,"tap"===t){var l=a.getPointerIndex(n);this.dt=this.timeStamp-a.downTimes[l];var c=this.timeStamp-a.tapTime;this.double=!!(a.prevTap&&"doubletap"!==a.prevTap.type&&a.prevTap.target===this.target&&c<500)}else"doubletap"===t&&(this.dt=n.timeStamp-a.tapTime)}return e.prototype.subtractOrigin=function(e){var t=e.x,n=e.y;return this.pageX-=t,this.pageY-=n,this.clientX-=t,this.clientY-=n,this},e.prototype.addOrigin=function(e){var t=e.x,n=e.y;return this.pageX+=t,this.pageY+=n,this.clientX+=t,this.clientY+=n,this},e.prototype.preventDefault=function(){this.originalEvent.preventDefault()},e.prototype.stopPropagation=function(){this.propagationStopped=!0},e.prototype.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},e}()},{"../utils/pointerUtils":49}],31:[function(e,t,n){"use strict";function r(e){for(var t=e.interaction,n=e.pointer,s=e.event,l=e.eventTarget,c=e.type,u=void 0===c?e.pointerEvent.type:c,d=e.targets,f=void 0===d?i(e):d,v=e.pointerEvent,g=void 0===v?new o(u,n,s,l,t):v,h={interaction:t,pointer:n,event:s,eventTarget:l,targets:f,type:u,pointerEvent:g},m=0;m=u.length)break;g=u[v++]}else{if(v=u.next(),v.done)break;g=v.value}var h=g;c.element=h,p.fire("collect-targets",c)}return"hold"===o&&(c.targets=d(c.targets,function(e){return e.eventable.options.holdDuration===t.holdTimers[s].duration})),c.targets}var o=e("./PointerEvent"),s=e("../Interaction"),a=e("../utils"),l=e("../utils/browser"),c=e("../defaultOptions"),p=e("../utils/Signals").new(),u=e("../utils/arr"),d=u.filter,f=["down","up","cancel"],v=["down","up","cancel"],g={PointerEvent:o,fire:r,collectEventTargets:i,signals:p,defaults:{holdDuration:600,ignoreFrom:null,allowFrom:null,origin:{x:0,y:0}},types:["down","move","up","cancel","tap","doubletap","hold"]};s.signals.on("update-pointer-down",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers[n]={duration:1/0,timeout:null}}),s.signals.on("remove-pointer",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers.splice(n,1)}),s.signals.on("move",function(e){var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,s=e.duplicateMove,a=t.getPointerIndex(n);s||t.pointerIsDown&&!t.pointerWasMoved||(t.pointerIsDown&&clearTimeout(t.holdTimers[a].timeout),r({interaction:t,pointer:n,event:i,eventTarget:o,type:"move"}))}),s.signals.on("down",function(e){for(var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,s=e.pointerIndex,c=l.isIE8?a.extend({},i):i,u=t.holdTimers[s],d=a.getPath(o),f={interaction:t,pointer:n,event:i,eventTarget:o,type:"hold",targets:[],path:d,element:null},v=d,g=Array.isArray(v),h=0,v=g?v:v[Symbol.iterator]();;){var m;if(g){if(h>=v.length)break;m=v[h++]}else{if(h=v.next(),h.done)break;m=h.value}var y=m;f.element=y,p.fire("collect-targets",f)}if(f.targets.length){for(var x=1/0,b=0;b=0&&(p.selectors[u]!==e||p.contexts[u]!==t);u--);-1===u&&(u=p.selectors.length,p.selectors.push(e),p.contexts.push(t),p.listeners.push([])),p.listeners[u].push([i,!!s.capture,s.passive])}function s(e,t,n,r,o){var s=f(o),c=O[n],p=!1,u=void 0;if(c)for(u=c.selectors.length-1;u>=0;u--)if(c.selectors[u]===e&&c.contexts[u]===t){for(var d=c.listeners[u],v=d.length-1;v>=0;v--){var g=d[v],h=g[0],m=g[1],y=g[2];if(h===r&&m===!!s.capture&&y===s.passive){d.splice(v,1),d.length||(c.selectors.splice(u,1),c.contexts.splice(u,1),c.listeners.splice(u,1),i(t,n,a),i(t,n,l,!0),c.selectors.length||(O[n]=null)),p=!0;break}}if(p)break}}function a(e,t){var n=f(t),r={},i=O[e.type],o=g.getActualElement(e.path?e.path[0]:e.target),s=o;for(h(r,e),r.originalEvent=e,r.preventDefault=p;v.element(s);){for(var a=0;a=l.length)break;u=l[p++]}else{if(p=l.next(),p.done)break;u=p.value}var d=u,f=o[d](a);if(f)return f}},simulationResume:function(e){var t=e.pointerType,n=e.eventType,o=e.eventTarget;if(!/down|start/i.test(n))return null;for(var s=r.interactions,a=Array.isArray(s),l=0,s=a?s:s[Symbol.iterator]();;){var c;if(a){if(l>=s.length)break;c=s[l++]}else{if(l=s.next(),l.done)break;c=l.value}var p=c,u=o;if(p.simulation&&p.simulation.allowResume&&p.pointerType===t)for(;u;){if(u===p.element)return p;u=i.parentNode(u)}}return null},mouseOrPen:function(e){var t=e.pointerId,n=e.pointerType,o=e.eventType;if("mouse"!==n&&"pen"!==n)return null;for(var s=void 0,a=r.interactions,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var u=p;if(u.pointerType===n){if(u.simulation&&!i.contains(u.pointerIds,t))continue;if(u.interacting())return u;s||(s=u)}}if(s)return s;for(var d=r.interactions,f=Array.isArray(d),v=0,d=f?d:d[Symbol.iterator]();;){var g;if(f){if(v>=d.length)break;g=d[v++]}else{if(v=d.next(),v.done)break;g=v.value}var h=g;if(!(h.pointerType!==n||/down/i.test(o)&&h.simulation))return h}return null},hasPointer:function(e){for(var t=e.pointerId,n=r.interactions,o=Array.isArray(n),s=0,n=o?n:n[Symbol.iterator]();;){var a;if(o){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var l=a;if(i.contains(l.pointerIds,t))return l}},idle:function(e){for(var t=e.pointerType,n=r.interactions,i=Array.isArray(n),o=0,n=i?n:n[Symbol.iterator]();;){var s;if(i){if(o>=n.length)break;s=n[o++]}else{if(o=n.next(),o.done)break;s=o.value}var a=s;if(1===a.pointerIds.length){var l=a.target;if(l&&!l.options.gesture.enabled)continue}else if(a.pointerIds.length>=2)continue;if(!a.interacting()&&t===a.pointerType)return a}return null}};t.exports=o},{"../scope":34,"./index":44}],46:[function(e,t,n){"use strict";var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},i=e("./window"),o=e("./isWindow"),s={array:function(){},window:function(e){return e===i.window||o(e)},docFrag:function(e){return s.object(e)&&11===e.nodeType},object:function(e){return!!e&&"object"===(void 0===e?"undefined":r(e))},function:function(e){return"function"==typeof e},number:function(e){return"number"==typeof e},bool:function(e){return"boolean"==typeof e},string:function(e){return"string"==typeof e},element:function(e){if(!e||"object"!==(void 0===e?"undefined":r(e)))return!1;var t=i.getWindow(e)||i.window;return/object|function/.test(r(t.Element))?e instanceof t.Element:1===e.nodeType&&"string"==typeof e.nodeName}};s.array=function(e){return s.object(e)&&void 0!==e.length&&s.function(e.splice)},t.exports=s},{"./isWindow":47,"./window":52}],47:[function(e,t,n){"use strict";t.exports=function(e){return!(!e||!e.Window)&&e instanceof e.Window}},{}],48:[function(e,t,n){"use strict";function r(e,n){for(var r in n){var i=t.exports.prefixedPropREs,o=!1;for(var s in i)if(0===r.indexOf(s)&&i[s].test(r)){o=!0;break}o||"function"==typeof n[r]||(e[r]=n[r])}return e}r.prefixedPropREs={webkit:/(Movement[XY]|Radius[XY]|RotationAngle|Force)$/},t.exports=r},{}],49:[function(e,t,n){"use strict";var r=e("./hypot"),i=e("./browser"),o=e("./domObjects"),s=e("./domUtils"),a=e("./domObjects"),l=e("./is"),c=e("./pointerExtend"),p={copyCoords:function(e,t){e.page=e.page||{},e.page.x=t.page.x,e.page.y=t.page.y,e.client=e.client||{},e.client.x=t.client.x,e.client.y=t.client.y,e.timeStamp=t.timeStamp},setCoordDeltas:function(e,t,n){e.page.x=n.page.x-t.page.x,e.page.y=n.page.y-t.page.y,e.client.x=n.client.x-t.client.x,e.client.y=n.client.y-t.client.y,e.timeStamp=n.timeStamp-t.timeStamp;var i=Math.max(e.timeStamp/1e3,.001);e.page.speed=r(e.page.x,e.page.y)/i,e.page.vx=e.page.x/i,e.page.vy=e.page.y/i,e.client.speed=r(e.client.x,e.page.y)/i,e.client.vx=e.client.x/i,e.client.vy=e.client.y/i},isNativePointer:function(e){return e instanceof o.Event||e instanceof o.Touch},getXY:function(e,t,n){return n=n||{},e=e||"page",n.x=t[e+"X"],n.y=t[e+"Y"],n},getPageXY:function(e,t){return t=t||{},i.isOperaMobile&&p.isNativePointer(e)?(p.getXY("screen",e,t),t.x+=window.scrollX,t.y+=window.scrollY):p.getXY("page",e,t),t},getClientXY:function(e,t){return t=t||{},i.isOperaMobile&&p.isNativePointer(e)?p.getXY("screen",e,t):p.getXY("client",e,t),t},getPointerId:function(e){return l.number(e.pointerId)?e.pointerId:e.identifier},setCoords:function(e,t,n){var r=t.length>1?p.pointerAverage(t):t[0],i={};p.getPageXY(r,i),e.page.x=i.x,e.page.y=i.y,p.getClientXY(r,i),e.client.x=i.x,e.client.y=i.y,e.timeStamp=l.number(n)?n:(new Date).getTime()},pointerExtend:c,getTouchPair:function(e){var t=[];return l.array(e)?(t[0]=e[0],t[1]=e[1]):"touchend"===e.type?1===e.touches.length?(t[0]=e.touches[0],t[1]=e.changedTouches[0]):0===e.touches.length&&(t[0]=e.changedTouches[0],t[1]=e.changedTouches[1]):(t[0]=e.touches[0],t[1]=e.touches[1]),t},pointerAverage:function(e){for(var t={pageX:0,pageY:0,clientX:0,clientY:0,screenX:0,screenY:0},n=e,r=Array.isArray(n),i=0,n=r?n:n[Symbol.iterator]();;){var o;if(r){if(i>=n.length)break;o=n[i++]}else{if(i=n.next(),i.done)break;o=i.value}var s=o;for(var a in t)t[a]+=s[a]}for(var l in t)t[l]/=e.length;return t},touchBBox:function(e){if(e.length||e.touches&&e.touches.length>1){var t=p.getTouchPair(e),n=Math.min(t[0].pageX,t[1].pageX),r=Math.min(t[0].pageY,t[1].pageY);return{x:n,y:r,left:n,top:r,width:Math.max(t[0].pageX,t[1].pageX)-n,height:Math.max(t[0].pageY,t[1].pageY)-r}}},touchDistance:function(e,t){var n=t+"X",i=t+"Y",o=p.getTouchPair(e),s=o[0][n]-o[1][n],a=o[0][i]-o[1][i];return r(s,a)},touchAngle:function(e,t,n){var r=n+"X",i=n+"Y",o=p.getTouchPair(e),s=o[1][r]-o[0][r],a=o[1][i]-o[0][i];return 180*Math.atan2(a,s)/Math.PI},getPointerType:function(e){return l.string(e.pointerType)?e.pointerType:l.number(e.pointerType)?[void 0,void 0,"touch","pen","mouse"][e.pointerType]:/touch/.test(e.type)||e instanceof a.Touch?"touch":"mouse"},getEventTargets:function(e){return[s.getActualElement(e.path?e.path[0]:e.target),s.getActualElement(e.currentTarget)]}};t.exports=p},{"./browser":37,"./domObjects":38,"./domUtils":39,"./hypot":43,"./is":46,"./pointerExtend":48}],50:[function(e,t,n){"use strict";for(var r=e("./window"),i=r.window,o=["ms","moz","webkit","o"],s=0,a=void 0,l=void 0,c=0;c\n * Open source under the MIT License.\n * https://raw.github.com/taye/interact.js/master/LICENSE\n */\n","/*\n * In a (windowless) server environment this file exports a factory function\n * that takes the window to use.\n *\n * var interact = require('interact.js')(windowObject);\n *\n * See https://github.com/taye/interact.js/issues/187\n */\nif (typeof window === 'undefined') {\n module.exports = function (window) {\n require('./src/utils/window').init(window);\n\n return require('./src/index');\n };\n}\nelse {\n module.exports = require('./src/index');\n}\n","const { indexOf } = require('./utils/arr');\nconst extend = require('./utils/extend.js');\n\nfunction fireUntilImmediateStopped (event, listeners) {\n for (let i = 0, len = listeners.length; i < len && !event.immediatePropagationStopped; i++) {\n listeners[i](event);\n }\n}\n\nclass Eventable {\n\n constructor (options) {\n this.options = extend({}, options || {});\n }\n\n fire (event) {\n let listeners;\n const onEvent = 'on' + event.type;\n const global = this.global;\n\n // Interactable#on() listeners\n if ((listeners = this[event.type])) {\n fireUntilImmediateStopped(event, listeners);\n }\n\n // interactable.onevent listener\n if (this[onEvent]) {\n this[onEvent](event);\n }\n\n // interact.on() listeners\n if (!event.propagationStopped && global && (listeners = global[event.type])) {\n fireUntilImmediateStopped(event, listeners);\n }\n }\n\n on (eventType, listener) {\n // if this type of event was never bound\n if (this[eventType]) {\n this[eventType].push(listener);\n }\n else {\n this[eventType] = [listener];\n }\n }\n\n off (eventType, listener) {\n // if it is an action event type\n const eventList = this[eventType];\n const index = eventList? indexOf(eventList, listener) : -1;\n\n if (index !== -1) {\n eventList.splice(index, 1);\n }\n\n if (eventList && eventList.length === 0 || !listener) {\n this[eventType] = listener;\n }\n }\n}\n\nmodule.exports = Eventable;\n","const extend = require('./utils/extend');\nconst getOriginXY = require('./utils/getOriginXY');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nclass InteractEvent {\n constructor (interaction, event, action, phase, element, related, preEnd = false) {\n const target = interaction.target;\n const deltaSource = (target && target.options || defaults).deltaSource;\n const origin = getOriginXY(target, element, action);\n const starting = phase === 'start';\n const ending = phase === 'end';\n const coords = starting? interaction.startCoords : interaction.curCoords;\n const prevEvent = interaction.prevEvent;\n\n element = element || interaction.element;\n\n const page = extend({}, coords.page);\n const client = extend({}, coords.client);\n\n page.x -= origin.x;\n page.y -= origin.y;\n\n client.x -= origin.x;\n client.y -= origin.y;\n\n this.ctrlKey = event.ctrlKey;\n this.altKey = event.altKey;\n this.shiftKey = event.shiftKey;\n this.metaKey = event.metaKey;\n this.button = event.button;\n this.buttons = event.buttons;\n this.target = element;\n this.currentTarget = element;\n this.relatedTarget = related || null;\n this.preEnd = preEnd;\n this.type = action + (phase || '');\n this.interaction = interaction;\n this.interactable = target;\n\n this.t0 = starting ? interaction.downTimes[interaction.downTimes.length - 1]\n : prevEvent.t0;\n\n const signalArg = {\n interaction,\n event,\n action,\n phase,\n element,\n related,\n page,\n client,\n coords,\n starting,\n ending,\n deltaSource,\n iEvent: this,\n };\n\n signals.fire('set-xy', signalArg);\n\n if (ending) {\n // use previous coords when ending\n this.pageX = prevEvent.pageX;\n this.pageY = prevEvent.pageY;\n this.clientX = prevEvent.clientX;\n this.clientY = prevEvent.clientY;\n }\n else {\n this.pageX = page.x;\n this.pageY = page.y;\n this.clientX = client.x;\n this.clientY = client.y;\n }\n\n this.x0 = interaction.startCoords.page.x - origin.x;\n this.y0 = interaction.startCoords.page.y - origin.y;\n this.clientX0 = interaction.startCoords.client.x - origin.x;\n this.clientY0 = interaction.startCoords.client.y - origin.y;\n\n signals.fire('set-delta', signalArg);\n\n this.timeStamp = coords.timeStamp;\n this.dt = interaction.pointerDelta.timeStamp;\n this.duration = this.timeStamp - this.t0;\n\n // speed and velocity in pixels per second\n this.speed = interaction.pointerDelta[deltaSource].speed;\n this.velocityX = interaction.pointerDelta[deltaSource].vx;\n this.velocityY = interaction.pointerDelta[deltaSource].vy;\n\n this.swipe = (ending || phase === 'inertiastart')? this.getSwipe() : null;\n\n signals.fire('new', signalArg);\n }\n\n getSwipe () {\n const interaction = this.interaction;\n\n if (interaction.prevEvent.speed < 600\n || this.timeStamp - interaction.prevEvent.timeStamp > 150) {\n return null;\n }\n\n let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI;\n const overlap = 22.5;\n\n if (angle < 0) {\n angle += 360;\n }\n\n const left = 135 - overlap <= angle && angle < 225 + overlap;\n const up = 225 - overlap <= angle && angle < 315 + overlap;\n\n const right = !left && (315 - overlap <= angle || angle < 45 + overlap);\n const down = !up && 45 - overlap <= angle && angle < 135 + overlap;\n\n return {\n up,\n down,\n left,\n right,\n angle,\n speed: interaction.prevEvent.speed,\n velocity: {\n x: interaction.prevEvent.velocityX,\n y: interaction.prevEvent.velocityY,\n },\n };\n }\n\n preventDefault () {}\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n}\n\nsignals.on('set-delta', function ({ iEvent, interaction, starting, deltaSource }) {\n const prevEvent = starting? iEvent : interaction.prevEvent;\n\n if (deltaSource === 'client') {\n iEvent.dx = iEvent.clientX - prevEvent.clientX;\n iEvent.dy = iEvent.clientY - prevEvent.clientY;\n }\n else {\n iEvent.dx = iEvent.pageX - prevEvent.pageX;\n iEvent.dy = iEvent.pageY - prevEvent.pageY;\n }\n});\n\nInteractEvent.signals = signals;\n\nmodule.exports = InteractEvent;\n","const is = require('./utils/is');\nconst events = require('./utils/events');\nconst extend = require('./utils/extend');\nconst actions = require('./actions/base');\nconst scope = require('./scope');\nconst Eventable = require('./Eventable');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nconst {\n getElementRect,\n nodeContains,\n trySelector,\n} = require('./utils/domUtils');\nconst { getWindow } = require('./utils/window');\nconst { indexOf, contains } = require('./utils/arr');\nconst { wheelEvent } = require('./utils/browser');\n\n// all set interactables\nscope.interactables = [];\n\n/*\\\n * Interactable\n [ property ]\n **\n * Object type returned by @interact\n\\*/\nclass Interactable {\n constructor (target, options) {\n options = options || {};\n\n this.target = target;\n this.events = new Eventable();\n this._context = options.context || scope.document;\n this._win = getWindow(trySelector(target)? this._context : target);\n this._doc = this._win.document;\n\n signals.fire('new', {\n target,\n options,\n interactable: this,\n win: this._win,\n });\n\n scope.addDocument( this._doc, this._win );\n\n scope.interactables.push(this);\n\n this.set(options);\n }\n\n setOnEvents (action, phases) {\n const onAction = 'on' + action;\n\n if (is.function(phases.onstart) ) { this.events[onAction + 'start' ] = phases.onstart ; }\n if (is.function(phases.onmove) ) { this.events[onAction + 'move' ] = phases.onmove ; }\n if (is.function(phases.onend) ) { this.events[onAction + 'end' ] = phases.onend ; }\n if (is.function(phases.oninertiastart)) { this.events[onAction + 'inertiastart' ] = phases.oninertiastart ; }\n\n return this;\n }\n\n setPerAction (action, options) {\n // for all the default per-action options\n for (const option in options) {\n // if this option exists for this action\n if (option in defaults[action]) {\n // if the option in the options arg is an object value\n if (is.object(options[option])) {\n // duplicate the object\n this.options[action][option] = extend(this.options[action][option] || {}, options[option]);\n\n if (is.object(defaults.perAction[option]) && 'enabled' in defaults.perAction[option]) {\n this.options[action][option].enabled = options[option].enabled === false? false : true;\n }\n }\n else if (is.bool(options[option]) && is.object(defaults.perAction[option])) {\n this.options[action][option].enabled = options[option];\n }\n else if (options[option] !== undefined) {\n // or if it's not undefined, do a plain assignment\n this.options[action][option] = options[option];\n }\n }\n }\n }\n\n /*\\\n * Interactable.getRect\n [ method ]\n *\n * The default function to get an Interactables bounding rect. Can be\n * overridden using @Interactable.rectChecker.\n *\n - element (Element) #optional The element to measure.\n = (object) The object's bounding rectangle.\n o {\n o top : 0,\n o left : 0,\n o bottom: 0,\n o right : 0,\n o width : 0,\n o height: 0\n o }\n \\*/\n getRect (element) {\n element = element || this.target;\n\n if (is.string(this.target) && !(is.element(element))) {\n element = this._context.querySelector(this.target);\n }\n\n return getElementRect(element);\n }\n\n /*\\\n * Interactable.rectChecker\n [ method ]\n *\n * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n - checker (function) #optional A function which returns this Interactable's bounding rectangle. See @Interactable.getRect\n = (function | object) The checker function or this Interactable\n \\*/\n rectChecker (checker) {\n if (is.function(checker)) {\n this.getRect = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.getRect;\n\n return this;\n }\n\n return this.getRect;\n }\n\n _backCompatOption (optionName, newValue) {\n if (trySelector(newValue) || is.object(newValue)) {\n this.options[optionName] = newValue;\n\n for (const action of actions.names) {\n this.options[action][optionName] = newValue;\n }\n\n return this;\n }\n\n return this.options[optionName];\n }\n\n /*\\\n * Interactable.origin\n [ method ]\n *\n * Gets or sets the origin of the Interactable's element. The x and y\n * of the origin will be subtracted from action event coordinates.\n *\n - origin (object | string) #optional An object eg. { x: 0, y: 0 } or string 'parent', 'self' or any CSS selector\n * OR\n - origin (Element) #optional An HTML or SVG Element whose rect will be used\n **\n = (object) The current origin or this Interactable\n \\*/\n origin (newValue) {\n return this._backCompatOption('origin', newValue);\n }\n\n /*\\\n * Interactable.deltaSource\n [ method ]\n *\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n - newValue (string) #optional Use 'client' if you will be scrolling while interacting; Use 'page' if you want autoScroll to work\n = (string | object) The current deltaSource or this Interactable\n \\*/\n deltaSource (newValue) {\n if (newValue === 'page' || newValue === 'client') {\n this.options.deltaSource = newValue;\n\n return this;\n }\n\n return this.options.deltaSource;\n }\n\n /*\\\n * Interactable.context\n [ method ]\n *\n * Gets the selector context Node of the Interactable. The default is `window.document`.\n *\n = (Node) The context Node of this Interactable\n **\n \\*/\n context () {\n return this._context;\n }\n\n inContext (element) {\n return (this._context === element.ownerDocument\n || nodeContains(this._context, element));\n }\n\n /*\\\n * Interactable.fire\n [ method ]\n *\n * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n - iEvent (InteractEvent) The InteractEvent object to be fired on this Interactable\n = (Interactable) this Interactable\n \\*/\n fire (iEvent) {\n this.events.fire(iEvent);\n\n return this;\n }\n\n _onOffMultiple (method, eventType, listener, options) {\n if (is.string(eventType) && eventType.search(' ') !== -1) {\n eventType = eventType.trim().split(/ +/);\n }\n\n if (is.array(eventType)) {\n for (let i = 0; i < eventType.length; i++) {\n this[method](eventType[i], listener, options);\n }\n\n return true;\n }\n\n if (is.object(eventType)) {\n for (const prop in eventType) {\n this[method](prop, eventType[prop], listener);\n }\n\n return true;\n }\n }\n\n /*\\\n * Interactable.on\n [ method ]\n *\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n - eventType (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) This Interactable\n \\*/\n on (eventType, listener, options) {\n if (this._onOffMultiple('on', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.on(eventType, listener);\n }\n // delegated event for selector\n else if (is.string(this.target)) {\n events.addDelegate(this.target, this._context, eventType, listener, options);\n }\n else {\n events.add(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.off\n [ method ]\n *\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n - eventType (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) This Interactable\n \\*/\n off (eventType, listener, options) {\n if (this._onOffMultiple('off', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n // if it is an action event type\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.off(eventType, listener);\n }\n // delegated event\n else if (is.string(this.target)) {\n events.removeDelegate(this.target, this._context, eventType, listener, options);\n }\n // remove listener from this Interatable's element\n else {\n events.remove(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.set\n [ method ]\n *\n * Reset the options of this Interactable\n - options (object) The new settings to apply\n = (object) This Interactable\n \\*/\n set (options) {\n if (!is.object(options)) {\n options = {};\n }\n\n this.options = extend({}, defaults.base);\n\n const perActions = extend({}, defaults.perAction);\n\n for (const actionName in actions.methodDict) {\n const methodName = actions.methodDict[actionName];\n\n this.options[actionName] = extend({}, defaults[actionName]);\n\n this.setPerAction(actionName, perActions);\n\n this[methodName](options[actionName]);\n }\n\n for (const setting of Interactable.settingsMethods) {\n this.options[setting] = defaults.base[setting];\n\n if (setting in options) {\n this[setting](options[setting]);\n }\n }\n\n signals.fire('set', {\n options,\n interactable: this,\n });\n\n return this;\n }\n\n /*\\\n * Interactable.unset\n [ method ]\n *\n * Remove this interactable from the list of interactables and remove\n * it's action capabilities and event listeners\n *\n = (object) @interact\n \\*/\n unset () {\n events.remove(this.target, 'all');\n\n if (is.string(this.target)) {\n // remove delegated events\n for (const type in events.delegatedEvents) {\n const delegated = events.delegatedEvents[type];\n\n if (delegated.selectors[0] === this.target\n && delegated.contexts[0] === this._context) {\n\n delegated.selectors.splice(0, 1);\n delegated.contexts .splice(0, 1);\n delegated.listeners.splice(0, 1);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegated[type] = null;\n }\n }\n\n events.remove(this._context, type, events.delegateListener);\n events.remove(this._context, type, events.delegateUseCapture, true);\n }\n }\n else {\n events.remove(this, 'all');\n }\n\n signals.fire('unset', { interactable: this });\n\n scope.interactables.splice(indexOf(scope.interactables, this), 1);\n\n // Stop related interactions when an Interactable is unset\n for (const interaction of scope.interactions || []) {\n if (interaction.target === this && interaction.interacting()) {\n interaction.stop();\n }\n }\n\n return scope.interact;\n }\n}\n\nscope.interactables.indexOfElement = function indexOfElement (target, context) {\n context = context || scope.document;\n\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n if (interactable.target === target && interactable._context === context) {\n return i;\n }\n }\n return -1;\n};\n\nscope.interactables.get = function interactableGet (element, options, dontCheckInContext) {\n const ret = this[this.indexOfElement(element, options && options.context)];\n\n return ret && (is.string(element) || dontCheckInContext || ret.inContext(element))? ret : null;\n};\n\nscope.interactables.forEachSelector = function (callback, element) {\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n // skip non CSS selector targets and out of context elements\n if (!is.string(interactable.target)\n || (element && !interactable.inContext(element))) {\n continue;\n }\n\n const ret = callback(interactable, interactable.target, interactable._context, i, this);\n\n if (ret !== undefined) {\n return ret;\n }\n }\n};\n\n// all interact.js eventTypes\nInteractable.eventTypes = scope.eventTypes = [];\n\nInteractable.signals = signals;\n\nInteractable.settingsMethods = [ 'deltaSource', 'origin', 'preventDefault', 'rectChecker' ];\n\nmodule.exports = Interactable;\n","const scope = require('./scope');\nconst utils = require('./utils');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst finder = require('./utils/interactionFinder');\nconst signals = require('./utils/Signals').new();\n\nconst listeners = {};\nconst methodNames = [\n 'pointerDown', 'pointerMove', 'pointerUp',\n 'updatePointer', 'removePointer',\n];\n\n// for ignoring browser's simulated mouse events\nlet prevTouchTime = 0;\n\n// all active and idle interactions\nscope.interactions = [];\n\nclass Interaction {\n constructor () {\n this.target = null; // current interactable being interacted with\n this.element = null; // the target element of the interactable\n\n this.prepared = { // action that's ready to be fired on next move event\n name : null,\n axis : null,\n edges: null,\n };\n\n // keep track of added pointers\n this.pointers = [];\n this.pointerIds = [];\n this.downTargets = [];\n this.downTimes = [];\n\n // Previous native pointer move event coordinates\n this.prevCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n // current native pointer move event coordinates\n this.curCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Starting InteractEvent pointer coordinates\n this.startCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Change in coordinates and time of the pointer\n this.pointerDelta = {\n page : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n client : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n timeStamp: 0,\n };\n\n this.downEvent = null; // pointerdown/mousedown/touchstart event\n this.downPointer = {};\n\n this._eventTarget = null;\n this._curEventTarget = null;\n\n this.prevEvent = null; // previous action event\n\n this.pointerIsDown = false;\n this.pointerWasMoved = false;\n this._interacting = false;\n\n this.mouse = false;\n\n signals.fire('new', this);\n\n scope.interactions.push(this);\n }\n\n pointerDown (pointer, event, eventTarget) {\n const pointerIndex = this.updatePointer(pointer, event, true);\n\n signals.fire('down', {\n pointer,\n event,\n eventTarget,\n pointerIndex,\n interaction: this,\n });\n }\n\n /*\\\n * Interaction.start\n [ method ]\n *\n * Start an action with the given Interactable and Element as tartgets. The\n * action must be enabled for the target Interactable and an appropriate number\n * of pointers must be held down - 1 for drag/resize, 2 for gesture.\n *\n * Use it with `interactable.able({ manualStart: false })` to always\n * [start actions manually](https://github.com/taye/interact.js/issues/114)\n *\n - action (object) The action to be performed - drag, resize, etc.\n - target (Interactable) The Interactable to target\n - element (Element) The DOM Element to target\n = (object) interact\n **\n | interact(target)\n | .draggable({\n | // disable the default drag start by down->move\n | manualStart: true\n | })\n | // start dragging after the user holds the pointer down\n | .on('hold', function (event) {\n | var interaction = event.interaction;\n |\n | if (!interaction.interacting()) {\n | interaction.start({ name: 'drag' },\n | event.interactable,\n | event.currentTarget);\n | }\n | });\n \\*/\n start (action, target, element) {\n if (this.interacting()\n || !this.pointerIsDown\n || this.pointerIds.length < (action.name === 'gesture'? 2 : 1)) {\n return;\n }\n\n // if this interaction had been removed after stopping\n // add it back\n if (utils.indexOf(scope.interactions, this) === -1) {\n scope.interactions.push(this);\n }\n\n utils.copyAction(this.prepared, action);\n this.target = target;\n this.element = element;\n\n signals.fire('action-start', {\n interaction: this,\n event: this.downEvent,\n });\n }\n\n pointerMove (pointer, event, eventTarget) {\n if (!this.simulation) {\n this.updatePointer(pointer);\n utils.setCoords(this.curCoords, this.pointers);\n }\n\n const duplicateMove = (this.curCoords.page.x === this.prevCoords.page.x\n && this.curCoords.page.y === this.prevCoords.page.y\n && this.curCoords.client.x === this.prevCoords.client.x\n && this.curCoords.client.y === this.prevCoords.client.y);\n\n let dx;\n let dy;\n\n // register movement greater than pointerMoveTolerance\n if (this.pointerIsDown && !this.pointerWasMoved) {\n dx = this.curCoords.client.x - this.startCoords.client.x;\n dy = this.curCoords.client.y - this.startCoords.client.y;\n\n this.pointerWasMoved = utils.hypot(dx, dy) > Interaction.pointerMoveTolerance;\n }\n\n const signalArg = {\n pointer,\n pointerIndex: this.getPointerIndex(pointer),\n event,\n eventTarget,\n dx,\n dy,\n duplicate: duplicateMove,\n interaction: this,\n interactingBeforeMove: this.interacting(),\n };\n\n if (!duplicateMove) {\n // set pointer coordinate, time changes and speeds\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n }\n\n signals.fire('move', signalArg);\n\n if (!duplicateMove) {\n // if interacting, fire an 'action-move' signal etc\n if (this.interacting()) {\n this.doMove(signalArg);\n }\n\n if (this.pointerWasMoved) {\n utils.copyCoords(this.prevCoords, this.curCoords);\n }\n }\n }\n\n /*\\\n * Interaction.doMove\n [ method ]\n *\n * Force a move of the current action at the same coordinates. Useful if\n * snap/restrict has been changed and you want a movement with the new\n * settings.\n *\n **\n | interact(target)\n | .draggable(true)\n | .on('dragmove', function (event) {\n | if (someCondition) {\n | // change the snap settings\n | event.interactable.draggable({ snap: { targets: [] }});\n | // fire another move event with re-calculated snap\n | event.interaction.doMove();\n | }\n | });\n \\*/\n doMove (signalArg) {\n signalArg = utils.extend({\n pointer: this.pointers[0],\n event: this.prevEvent,\n eventTarget: this._eventTarget,\n interaction: this,\n }, signalArg || {});\n\n signals.fire('before-action-move', signalArg);\n\n if (!this._dontFireMove) {\n signals.fire('action-move', signalArg);\n }\n\n this._dontFireMove = false;\n }\n\n // End interact move events and stop auto-scroll unless simulation is running\n pointerUp (pointer, event, eventTarget, curEventTarget) {\n const pointerIndex = this.getPointerIndex(pointer);\n\n signals.fire(/cancel$/i.test(event.type)? 'cancel' : 'up', {\n pointer,\n pointerIndex,\n event,\n eventTarget,\n curEventTarget,\n interaction: this,\n });\n\n if (!this.simulation) {\n this.end(event);\n }\n\n this.pointerIsDown = false;\n this.removePointer(pointer, event);\n }\n\n /*\\\n * Interaction.end\n [ method ]\n *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n - event (PointerEvent) #optional\n **\n | interact(target)\n | .draggable(true)\n | .on('move', function (event) {\n | if (event.pageX > 1000) {\n | // end the current action\n | event.interaction.end();\n | // stop all further listeners from being called\n | event.stopImmediatePropagation();\n | }\n | });\n \\*/\n end (event) {\n event = event || this.prevEvent;\n\n if (this.interacting()) {\n signals.fire('action-end', {\n event,\n interaction: this,\n });\n }\n\n this.stop();\n }\n\n currentAction () {\n return this._interacting? this.prepared.name: null;\n }\n\n interacting () {\n return this._interacting;\n }\n\n stop () {\n signals.fire('stop', { interaction: this });\n\n if (this._interacting) {\n signals.fire('stop-active', { interaction: this });\n signals.fire('stop-' + this.prepared.name, { interaction: this });\n }\n\n this.target = this.element = null;\n\n this._interacting = false;\n this.prepared.name = this.prevEvent = null;\n }\n\n getPointerIndex (pointer) {\n return utils.indexOf(this.pointerIds, utils.getPointerId(pointer));\n }\n\n updatePointer (pointer, event, down = event && /(down|start)$/i.test(event.type)) {\n const id = utils.getPointerId(pointer);\n let index = this.getPointerIndex(pointer);\n\n if (index === -1) {\n index = this.pointerIds.length;\n this.pointerIds[index] = id;\n }\n\n if (down) {\n signals.fire('update-pointer-down', {\n pointer,\n event,\n down,\n pointerId: id,\n pointerIndex: index,\n interaction: this,\n });\n }\n\n this.pointers[index] = pointer;\n\n return index;\n }\n\n removePointer (pointer, event) {\n const id = utils.getPointerId(pointer);\n const index = this.mouse? 0 : utils.indexOf(this.pointerIds, id);\n\n if (index === -1) { return; }\n\n signals.fire('remove-pointer', {\n pointer,\n event,\n pointerIndex: index,\n interaction: this,\n });\n\n this.pointers .splice(index, 1);\n this.pointerIds .splice(index, 1);\n this.downTargets.splice(index, 1);\n this.downTimes .splice(index, 1);\n }\n\n _updateEventTargets (target, currentTarget) {\n this._eventTarget = target;\n this._curEventTarget = currentTarget;\n }\n}\n\nfor (let i = 0, len = methodNames.length; i < len; i++) {\n const method = methodNames[i];\n\n listeners[method] = doOnInteractions(method);\n}\n\nfunction doOnInteractions (method) {\n return (function (event) {\n const [eventTarget, curEventTarget] = utils.getEventTargets(event);\n const matches = []; // [ [pointer, interaction], ...]\n\n if (browser.supportsTouch && /touch/.test(event.type)) {\n prevTouchTime = new Date().getTime();\n\n for (let i = 0; i < event.changedTouches.length; i++) {\n const pointer = event.changedTouches[i];\n const interaction = finder.search(pointer, event.type, eventTarget);\n\n matches.push([pointer, interaction || new Interaction()]);\n }\n }\n else {\n let invalidPointer = false;\n\n if (!browser.supportsPointerEvent && /mouse/.test(event.type)) {\n // ignore mouse events while touch interactions are active\n for (let i = 0; i < scope.interactions.length && !invalidPointer; i++) {\n invalidPointer = !scope.interactions[i].mouse && scope.interactions[i].pointerIsDown;\n }\n\n // try to ignore mouse events that are simulated by the browser\n // after a touch event\n invalidPointer = invalidPointer\n || (new Date().getTime() - prevTouchTime < 500)\n // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated\n || event.timeStamp === 0;\n }\n\n if (!invalidPointer) {\n let interaction = finder.search(event, event.type, eventTarget);\n\n if (!interaction) {\n\n interaction = new Interaction();\n interaction.mouse = (/mouse/i.test(event.pointerType || event.type)\n // MSPointerEvent.MSPOINTER_TYPE_MOUSE\n || event.pointerType === 4\n || !event.pointerType);\n }\n\n matches.push([event, interaction]);\n }\n }\n\n for (const [pointer, interaction] of matches) {\n interaction._updateEventTargets(eventTarget, curEventTarget);\n interaction[method](pointer, event, eventTarget, curEventTarget);\n }\n });\n}\n\nfunction endAll (event) {\n for (let i = 0; i < scope.interactions.length; i++) {\n const interaction = scope.interactions[i];\n\n interaction.end(event);\n signals.fire('endall', { event, interaction });\n }\n}\n\nconst docEvents = { /* 'eventType': listenerFunc */ };\nconst pEventTypes = browser.pEventTypes;\n\nif (scope.PointerEvent) {\n docEvents[pEventTypes.down ] = listeners.pointerDown;\n docEvents[pEventTypes.move ] = listeners.pointerMove;\n docEvents[pEventTypes.up ] = listeners.pointerUp;\n docEvents[pEventTypes.cancel] = listeners.pointerUp;\n}\nelse {\n docEvents.mousedown = listeners.pointerDown;\n docEvents.mousemove = listeners.pointerMove;\n docEvents.mouseup = listeners.pointerUp;\n\n docEvents.touchstart = listeners.pointerDown;\n docEvents.touchmove = listeners.pointerMove;\n docEvents.touchend = listeners.pointerUp;\n docEvents.touchcancel = listeners.pointerUp;\n}\n\ndocEvents.blur = endAll;\n\nfunction onDocSignal ({ doc }, signalName) {\n const eventMethod = signalName.indexOf('add') === 0\n ? events.add : events.remove;\n\n // delegate event listener\n for (const eventType in scope.delegatedEvents) {\n eventMethod(doc, eventType, events.delegateListener);\n eventMethod(doc, eventType, events.delegateUseCapture, true);\n }\n\n for (const eventType in docEvents) {\n eventMethod(doc, eventType, docEvents[eventType]);\n }\n}\n\nsignals.on('update-pointer-down', ({ interaction, pointer, pointerId, pointerIndex, event, eventTarget, down }) => {\n interaction.pointerIds[pointerIndex] = pointerId;\n interaction.pointers[pointerIndex] = pointer;\n\n if (down) {\n interaction.pointerIsDown = true;\n }\n\n if (!interaction.interacting()) {\n utils.setCoords(interaction.startCoords, interaction.pointers);\n\n utils.copyCoords(interaction.curCoords , interaction.startCoords);\n utils.copyCoords(interaction.prevCoords, interaction.startCoords);\n\n interaction.downEvent = event;\n interaction.downTimes[pointerIndex] = interaction.curCoords.timeStamp;\n interaction.downTargets[pointerIndex] = eventTarget || event && utils.getEventTargets(event)[0];\n interaction.pointerWasMoved = false;\n\n utils.pointerExtend(interaction.downPointer, pointer);\n }\n});\n\nscope.signals.on('add-document' , onDocSignal);\nscope.signals.on('remove-document', onDocSignal);\n\nInteraction.pointerMoveTolerance = 1;\nInteraction.doOnInteractions = doOnInteractions;\nInteraction.endAll = endAll;\nInteraction.signals = signals;\nInteraction.docEvents = docEvents;\n\nscope.endAllInteractions = endAll;\n\nmodule.exports = Interaction;\n","const Interaction = require('../Interaction');\nconst InteractEvent = require('../InteractEvent');\n\nconst actions = {\n firePrepared,\n names: [],\n methodDict: {},\n};\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n interaction._interacting = true;\n firePrepared(interaction, event, 'start');\n});\n\nInteraction.signals.on('action-move', function ({ interaction, event, preEnd }) {\n firePrepared(interaction, event, 'move', preEnd);\n\n // if the action was ended in a listener\n if (!interaction.interacting()) { return false; }\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n firePrepared(interaction, event, 'end');\n});\n\nfunction firePrepared (interaction, event, phase, preEnd) {\n const actionName = interaction.prepared.name;\n\n const newEvent = new InteractEvent(interaction, event, actionName, phase, interaction.element, null, preEnd);\n\n interaction.target.fire(newEvent);\n interaction.prevEvent = newEvent;\n}\n\nmodule.exports = actions;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drag = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n startAxis : 'xy',\n lockAxis : 'xy',\n },\n\n checker: function (pointer, event, interactable) {\n const dragOptions = interactable.options.drag;\n\n return dragOptions.enabled\n ? { name: 'drag', axis: (dragOptions.lockAxis === 'start'\n ? dragOptions.startAxis\n : dragOptions.lockAxis)}\n : null;\n },\n\n getCursor: function () {\n return 'move';\n },\n};\n\nInteraction.signals.on('before-action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n interaction.curCoords.page.y = interaction.startCoords.page.y;\n interaction.curCoords.client.y = interaction.startCoords.client.y;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vx);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vx);\n interaction.pointerDelta.client.vy = 0;\n interaction.pointerDelta.page.vy = 0;\n }\n else if (axis === 'y') {\n interaction.curCoords.page.x = interaction.startCoords.page.x;\n interaction.curCoords.client.x = interaction.startCoords.client.x;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vy);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vy);\n interaction.pointerDelta.client.vx = 0;\n interaction.pointerDelta.page.vx = 0;\n }\n});\n\n// dragmove\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'dragmove') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n iEvent.pageY = interaction.startCoords.page.y;\n iEvent.clientY = interaction.startCoords.client.y;\n iEvent.dy = 0;\n }\n else if (axis === 'y') {\n iEvent.pageX = interaction.startCoords.page.x;\n iEvent.clientX = interaction.startCoords.client.x;\n iEvent.dx = 0;\n }\n});\n\n/*\\\n * Interactable.draggable\n [ method ]\n *\n * Gets or sets whether drag actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of drag events\n | var isDraggable = interact('ul li').draggable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on drag events (object makes the Interactable draggable)\n = (object) This Interactable\n | interact(element).draggable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // the axis in which the first movement must be\n | // for the drag sequence to start\n | // 'xy' by default - any direction\n | startAxis: 'x' || 'y' || 'xy',\n |\n | // 'xy' by default - don't restrict to one axis (move in any direction)\n | // 'x' or 'y' to restrict movement to either axis\n | // 'start' to restrict movement to the axis the drag started in\n | lockAxis: 'x' || 'y' || 'xy' || 'start',\n |\n | // max number of drags that can happen concurrently\n | // with elements of this Interactable. Infinity by default\n | max: Infinity,\n |\n | // max number of drags that can target the same element+Interactable\n | // 1 by default\n | maxPerElement: 2\n | });\n\\*/\nInteractable.prototype.draggable = function (options) {\n if (utils.is.object(options)) {\n this.options.drag.enabled = options.enabled === false? false: true;\n this.setPerAction('drag', options);\n this.setOnEvents('drag', options);\n\n if (/^(xy|x|y|start)$/.test(options.lockAxis)) {\n this.options.drag.lockAxis = options.lockAxis;\n }\n if (/^(xy|x|y)$/.test(options.startAxis)) {\n this.options.drag.startAxis = options.startAxis;\n }\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drag.enabled = options;\n\n if (!options) {\n this.ondragstart = this.ondragstart = this.ondragend = null;\n }\n\n return this;\n }\n\n return this.options.drag;\n};\n\nactions.drag = drag;\nactions.names.push('drag');\nutils.merge(Interactable.eventTypes, [\n 'dragstart',\n 'dragmove',\n 'draginertiastart',\n 'draginertiaresume',\n 'dragend',\n]);\nactions.methodDict.drag = 'draggable';\n\ndefaultOptions.drag = drag.defaults;\n\nmodule.exports = drag;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst scope = require('../scope');\nconst interact = require('../interact');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drop = {\n defaults: {\n enabled: false,\n accept : null,\n overlap: 'pointer',\n },\n};\n\nlet dynamicDrop = false;\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // reset active dropzones\n interaction.activeDrops.dropzones = [];\n interaction.activeDrops.elements = [];\n interaction.activeDrops.rects = [];\n\n interaction.dropEvents = null;\n\n if (!interaction.dynamicDrop) {\n setActiveDrops(interaction, interaction.element);\n }\n\n const dragEvent = interaction.prevEvent;\n const dropEvents = getDropEvents(interaction, event, dragEvent);\n\n if (dropEvents.activate) {\n fireActiveDrops(interaction, dropEvents.activate);\n }\n});\n\nInteractEvent.signals.on('new', function ({ interaction, iEvent, event }) {\n if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { return; }\n\n const draggableElement = interaction.element;\n const dragEvent = iEvent;\n const dropResult = getDrop(dragEvent, event, draggableElement);\n\n interaction.dropTarget = dropResult.dropzone;\n interaction.dropElement = dropResult.element;\n\n interaction.dropEvents = getDropEvents(interaction, event, dragEvent);\n});\n\nInteraction.signals.on('action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n fireDropEvents(interaction, interaction.dropEvents);\n});\n\nInteraction.signals.on('action-end', function ({ interaction }) {\n if (interaction.prepared.name === 'drag') {\n fireDropEvents(interaction, interaction.dropEvents);\n }\n});\n\nInteraction.signals.on('stop-drag', function ({ interaction }) {\n interaction.activeDrops.dropzones =\n interaction.activeDrops.elements =\n interaction.activeDrops.rects =\n interaction.dropEvents = null;\n});\n\nfunction collectDrops (interaction, element) {\n const drops = [];\n const elements = [];\n\n element = element || interaction.element;\n\n // collect all dropzones and their elements which qualify for a drop\n for (const current of scope.interactables) {\n if (!current.options.drop.enabled) { continue; }\n\n const accept = current.options.drop.accept;\n\n // test the draggable element against the dropzone's accept setting\n if ((utils.is.element(accept) && accept !== element)\n || (utils.is.string(accept)\n && !utils.matchesSelector(element, accept))) {\n\n continue;\n }\n\n // query for new elements if necessary\n const dropElements = utils.is.string(current.target)\n ? current._context.querySelectorAll(current.target)\n : [current.target];\n\n for (let i = 0; i < dropElements.length; i++) {\n const currentElement = dropElements[i];\n\n if (currentElement !== element) {\n drops.push(current);\n elements.push(currentElement);\n }\n }\n }\n\n return {\n elements,\n dropzones: drops,\n };\n}\n\nfunction fireActiveDrops (interaction, event) {\n let prevElement;\n\n // loop through all active dropzones and trigger event\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n const current = interaction.activeDrops.dropzones[i];\n const currentElement = interaction.activeDrops.elements [i];\n\n // prevent trigger of duplicate events on same element\n if (currentElement !== prevElement) {\n // set current element as event target\n event.target = currentElement;\n current.fire(event);\n }\n prevElement = currentElement;\n }\n}\n\n// Collect a new set of possible drops and save them in activeDrops.\n// setActiveDrops should always be called when a drag has just started or a\n// drag event happens while dynamicDrop is true\nfunction setActiveDrops (interaction, dragElement) {\n // get dropzones and their elements that could receive the draggable\n const possibleDrops = collectDrops(interaction, dragElement, true);\n\n interaction.activeDrops.dropzones = possibleDrops.dropzones;\n interaction.activeDrops.elements = possibleDrops.elements;\n interaction.activeDrops.rects = [];\n\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n interaction.activeDrops.rects[i] =\n interaction.activeDrops.dropzones[i].getRect(interaction.activeDrops.elements[i]);\n }\n}\n\nfunction getDrop (dragEvent, event, dragElement) {\n const interaction = dragEvent.interaction;\n const validDrops = [];\n\n if (dynamicDrop) {\n setActiveDrops(interaction, dragElement);\n }\n\n // collect all dropzones and their elements which qualify for a drop\n for (let j = 0; j < interaction.activeDrops.dropzones.length; j++) {\n const current = interaction.activeDrops.dropzones[j];\n const currentElement = interaction.activeDrops.elements [j];\n const rect = interaction.activeDrops.rects [j];\n\n validDrops.push(current.dropCheck(dragEvent, event, interaction.target, dragElement, currentElement, rect)\n ? currentElement\n : null);\n }\n\n // get the most appropriate dropzone based on DOM depth and order\n const dropIndex = utils.indexOfDeepestElement(validDrops);\n\n return {\n dropzone: interaction.activeDrops.dropzones[dropIndex] || null,\n element : interaction.activeDrops.elements [dropIndex] || null,\n };\n}\n\nfunction getDropEvents (interaction, pointerEvent, dragEvent) {\n const dropEvents = {\n enter : null,\n leave : null,\n activate : null,\n deactivate: null,\n move : null,\n drop : null,\n };\n\n const tmpl = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n };\n\n if (interaction.dropElement !== interaction.prevDropElement) {\n // if there was a prevDropTarget, create a dragleave event\n if (interaction.prevDropTarget) {\n dropEvents.leave = utils.extend({ type: 'dragleave' }, tmpl);\n\n dragEvent.dragLeave = dropEvents.leave.target = interaction.prevDropElement;\n dragEvent.prevDropzone = dropEvents.leave.dropzone = interaction.prevDropTarget;\n }\n // if the dropTarget is not null, create a dragenter event\n if (interaction.dropTarget) {\n dropEvents.enter = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n type : 'dragenter',\n };\n\n dragEvent.dragEnter = interaction.dropElement;\n dragEvent.dropzone = interaction.dropTarget;\n }\n }\n\n if (dragEvent.type === 'dragend' && interaction.dropTarget) {\n dropEvents.drop = utils.extend({ type: 'drop' }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n dragEvent.relatedTarget = interaction.dropElement;\n }\n if (dragEvent.type === 'dragstart') {\n dropEvents.activate = utils.extend({ type: 'dropactivate' }, tmpl);\n\n dropEvents.activate.target = null;\n dropEvents.activate.dropzone = null;\n }\n if (dragEvent.type === 'dragend') {\n dropEvents.deactivate = utils.extend({ type: 'dropdeactivate' }, tmpl);\n\n dropEvents.deactivate.target = null;\n dropEvents.deactivate.dropzone = null;\n }\n if (dragEvent.type === 'dragmove' && interaction.dropTarget) {\n dropEvents.move = utils.extend({\n dragmove : dragEvent,\n type : 'dropmove',\n }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n }\n\n return dropEvents;\n}\n\nfunction fireDropEvents (interaction, dropEvents) {\n if (dropEvents.leave) { interaction.prevDropTarget.fire(dropEvents.leave); }\n if (dropEvents.move ) { interaction.dropTarget.fire(dropEvents.move ); }\n if (dropEvents.enter) { interaction.dropTarget.fire(dropEvents.enter); }\n if (dropEvents.drop ) { interaction.dropTarget.fire(dropEvents.drop ); }\n if (dropEvents.deactivate) {\n fireActiveDrops(interaction, dropEvents.deactivate);\n }\n\n interaction.prevDropTarget = interaction.dropTarget;\n interaction.prevDropElement = interaction.dropElement;\n}\n\n/*\\\n * Interactable.dropzone\n [ method ]\n *\n * Returns or sets whether elements can be dropped onto this\n * Interactable to trigger drop events\n *\n * Dropzones can receive the following events:\n * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends\n * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone\n * - `dragmove` when a draggable that has entered the dropzone is moved\n * - `drop` when a draggable is dropped into this dropzone\n *\n * Use the `accept` option to allow only elements that match the given CSS\n * selector or element. The value can be:\n *\n * - **an Element** - only that element can be dropped into this dropzone.\n * - **a string**, - the element being dragged must match it as a CSS selector.\n * - **`null`** - accept options is cleared - it accepts any element.\n *\n * Use the `overlap` option to set how drops are checked for. The allowed\n * values are:\n *\n * - `'pointer'`, the pointer must be over the dropzone (default)\n * - `'center'`, the draggable element's center must be over the dropzone\n * - a number from 0-1 which is the `(intersection area) / (draggable area)`.\n * e.g. `0.5` for drop to happen when half of the area of the draggable is\n * over the dropzone\n *\n * Use the `checker` option to specify a function to check if a dragged\n * element is over this Interactable.\n *\n | interact(target)\n | .dropChecker(function(dragEvent, // related dragmove or dragend event\n | event, // TouchEvent/PointerEvent/MouseEvent\n | dropped, // bool result of the default checker\n | dropzone, // dropzone Interactable\n | dropElement, // dropzone elemnt\n | draggable, // draggable Interactable\n | draggableElement) {// draggable element\n |\n | return dropped && event.target.hasAttribute('allow-drop');\n | }\n *\n *\n - options (boolean | object | null) #optional The new value to be set.\n | interact('.drop').dropzone({\n | accept: '.can-drop' || document.getElementById('single-drop'),\n | overlap: 'pointer' || 'center' || zeroToOne\n | }\n = (boolean | object) The current setting or this Interactable\n\\*/\nInteractable.prototype.dropzone = function (options) {\n if (utils.is.object(options)) {\n this.options.drop.enabled = options.enabled === false? false: true;\n\n if (utils.is.function(options.ondrop) ) { this.events.ondrop = options.ondrop ; }\n if (utils.is.function(options.ondropactivate) ) { this.events.ondropactivate = options.ondropactivate ; }\n if (utils.is.function(options.ondropdeactivate)) { this.events.ondropdeactivate = options.ondropdeactivate; }\n if (utils.is.function(options.ondragenter) ) { this.events.ondragenter = options.ondragenter ; }\n if (utils.is.function(options.ondragleave) ) { this.events.ondragleave = options.ondragleave ; }\n if (utils.is.function(options.ondropmove) ) { this.events.ondropmove = options.ondropmove ; }\n\n if (/^(pointer|center)$/.test(options.overlap)) {\n this.options.drop.overlap = options.overlap;\n }\n else if (utils.is.number(options.overlap)) {\n this.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0);\n }\n if ('accept' in options) {\n this.options.drop.accept = options.accept;\n }\n if ('checker' in options) {\n this.options.drop.checker = options.checker;\n }\n\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drop.enabled = options;\n\n if (!options) {\n this.ondragenter = this.ondragleave = this.ondrop\n = this.ondropactivate = this.ondropdeactivate = null;\n }\n\n return this;\n }\n\n return this.options.drop;\n};\n\nInteractable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) {\n let dropped = false;\n\n // if the dropzone has no rect (eg. display: none)\n // call the custom dropChecker or just return false\n if (!(rect = rect || this.getRect(dropElement))) {\n return (this.options.drop.checker\n ? this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement)\n : false);\n }\n\n const dropOverlap = this.options.drop.overlap;\n\n if (dropOverlap === 'pointer') {\n const origin = utils.getOriginXY(draggable, draggableElement, 'drag');\n const page = utils.getPageXY(dragEvent);\n\n page.x += origin.x;\n page.y += origin.y;\n\n const horizontal = (page.x > rect.left) && (page.x < rect.right);\n const vertical = (page.y > rect.top ) && (page.y < rect.bottom);\n\n dropped = horizontal && vertical;\n }\n\n const dragRect = draggable.getRect(draggableElement);\n\n if (dragRect && dropOverlap === 'center') {\n const cx = dragRect.left + dragRect.width / 2;\n const cy = dragRect.top + dragRect.height / 2;\n\n dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom;\n }\n\n if (dragRect && utils.is.number(dropOverlap)) {\n const overlapArea = (Math.max(0, Math.min(rect.right , dragRect.right ) - Math.max(rect.left, dragRect.left))\n * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top , dragRect.top )));\n\n const overlapRatio = overlapArea / (dragRect.width * dragRect.height);\n\n dropped = overlapRatio >= dropOverlap;\n }\n\n if (this.options.drop.checker) {\n dropped = this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement);\n }\n\n return dropped;\n};\n\nInteractable.signals.on('unset', function ({ interactable }) {\n interactable.dropzone(false);\n});\n\nInteractable.settingsMethods.push('dropChecker');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.dropTarget = null; // the dropzone a drag target might be dropped into\n interaction.dropElement = null; // the element at the time of checking\n interaction.prevDropTarget = null; // the dropzone that was recently dragged away from\n interaction.prevDropElement = null; // the element at the time of checking\n interaction.dropEvents = null; // the dropEvents related to the current drag event\n\n interaction.activeDrops = {\n dropzones: [], // the dropzones that are mentioned below\n elements : [], // elements of dropzones that accept the target draggable\n rects : [], // the rects of the elements mentioned above\n };\n\n});\n\nInteraction.signals.on('stop', function ({ interaction }) {\n interaction.dropTarget = interaction.dropElement =\n interaction.prevDropTarget = interaction.prevDropElement = null;\n});\n\n/*\\\n * interact.dynamicDrop\n [ method ]\n *\n * Returns or sets whether the dimensions of dropzone elements are\n * calculated on every dragmove or only on dragstart for the default\n * dropChecker\n *\n - newValue (boolean) #optional True to check on each move. False to check only before start\n = (boolean | interact) The current setting or interact\n\\*/\ninteract.dynamicDrop = function (newValue) {\n if (utils.is.bool(newValue)) {\n //if (dragging && dynamicDrop !== newValue && !newValue) {\n //calcRects(dropzones);\n //}\n\n dynamicDrop = newValue;\n\n return interact;\n }\n return dynamicDrop;\n};\n\nutils.merge(Interactable.eventTypes, [\n 'dragenter',\n 'dragleave',\n 'dropactivate',\n 'dropdeactivate',\n 'dropmove',\n 'drop',\n]);\nactions.methodDict.drop = 'dropzone';\n\ndefaultOptions.drop = drop.defaults;\n\nmodule.exports = drop;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst gesture = {\n defaults: {\n enabled : false,\n origin : null,\n restrict: null,\n },\n\n checker: function (pointer, event, interactable, element, interaction) {\n if (interaction.pointerIds.length >= 2) {\n return { name: 'gesture' };\n }\n\n return null;\n },\n\n getCursor: function () {\n return '';\n },\n};\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturestart') { return; }\n iEvent.ds = 0;\n\n interaction.gesture.startDistance = interaction.gesture.prevDistance = iEvent.distance;\n interaction.gesture.startAngle = interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.scale = 1;\n});\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturemove') { return; }\n\n iEvent.ds = iEvent.scale - interaction.gesture.scale;\n\n interaction.target.fire(iEvent);\n\n interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.prevDistance = iEvent.distance;\n\n if (iEvent.scale !== Infinity\n && iEvent.scale !== null\n && iEvent.scale !== undefined\n && !isNaN(iEvent.scale)) {\n\n interaction.gesture.scale = iEvent.scale;\n }\n});\n\n/*\\\n * Interactable.gesturable\n [ method ]\n *\n * Gets or sets whether multitouch gestures can be performed on the\n * Interactable's element\n *\n = (boolean) Indicates if this can be the target of gesture events\n | var isGestureable = interact(element).gesturable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on gesture events (makes the Interactable gesturable)\n = (object) this Interactable\n | interact(element).gesturable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // limit multiple gestures.\n | // See the explanation in @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n\\*/\nInteractable.prototype.gesturable = function (options) {\n if (utils.is.object(options)) {\n this.options.gesture.enabled = options.enabled === false? false: true;\n this.setPerAction('gesture', options);\n this.setOnEvents('gesture', options);\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.gesture.enabled = options;\n\n if (!options) {\n this.ongesturestart = this.ongesturestart = this.ongestureend = null;\n }\n\n return this;\n }\n\n return this.options.gesture;\n};\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action, event, starting, ending, deltaSource }) {\n if (action !== 'gesture') { return; }\n\n const pointers = interaction.pointers;\n\n iEvent.touches = [pointers[0], pointers[1]];\n\n if (starting) {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = 1;\n iEvent.ds = 0;\n iEvent.angle = utils.touchAngle(pointers, undefined, deltaSource);\n iEvent.da = 0;\n }\n else if (ending || event instanceof InteractEvent) {\n iEvent.distance = interaction.prevEvent.distance;\n iEvent.box = interaction.prevEvent.box;\n iEvent.scale = interaction.prevEvent.scale;\n iEvent.ds = iEvent.scale - 1;\n iEvent.angle = interaction.prevEvent.angle;\n iEvent.da = iEvent.angle - interaction.gesture.startAngle;\n }\n else {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = iEvent.distance / interaction.gesture.startDistance;\n iEvent.angle = utils.touchAngle(pointers, interaction.gesture.prevAngle, deltaSource);\n\n iEvent.ds = iEvent.scale - interaction.gesture.prevScale;\n iEvent.da = iEvent.angle - interaction.gesture.prevAngle;\n }\n});\n\nInteraction.signals.on('new', function (interaction) {\n interaction.gesture = {\n start: { x: 0, y: 0 },\n\n startDistance: 0, // distance between two touches of touchStart\n prevDistance : 0,\n distance : 0,\n\n scale: 1, // gesture.distance / gesture.startDistance\n\n startAngle: 0, // angle of line joining two touches\n prevAngle : 0, // angle of the previous gesture event\n };\n});\n\nactions.gesture = gesture;\nactions.names.push('gesture');\nutils.merge(Interactable.eventTypes, [\n 'gesturestart',\n 'gesturemove',\n 'gestureend',\n]);\nactions.methodDict.gesture = 'gesturable';\n\ndefaultOptions.gesture = gesture.defaults;\n\nmodule.exports = gesture;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\n// Less Precision with touch input\nconst defaultMargin = browser.supportsTouch || browser.supportsPointerEvent? 20: 10;\n\nconst resize = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n square: false,\n preserveAspectRatio: false,\n axis: 'xy',\n\n // use default margin\n margin: NaN,\n\n // object with props left, right, top, bottom which are\n // true/false values to resize when the pointer is over that edge,\n // CSS selectors to match the handles for each direction\n // or the Elements for each handle\n edges: null,\n\n // a value of 'none' will limit the resize rect to a minimum of 0x0\n // 'negate' will alow the rect to have negative width/height\n // 'reposition' will keep the width/height positive by swapping\n // the top and bottom edges and/or swapping the left and right edges\n invert: 'none',\n },\n\n checker: function (pointer, event, interactable, element, interaction, rect) {\n if (!rect) { return null; }\n\n const page = utils.extend({}, interaction.curCoords.page);\n const options = interactable.options;\n\n if (options.resize.enabled) {\n const resizeOptions = options.resize;\n const resizeEdges = { left: false, right: false, top: false, bottom: false };\n\n // if using resize.edges\n if (utils.is.object(resizeOptions.edges)) {\n for (const edge in resizeEdges) {\n resizeEdges[edge] = checkResizeEdge(edge,\n resizeOptions.edges[edge],\n page,\n interaction._eventTarget,\n element,\n rect,\n resizeOptions.margin || defaultMargin);\n }\n\n resizeEdges.left = resizeEdges.left && !resizeEdges.right;\n resizeEdges.top = resizeEdges.top && !resizeEdges.bottom;\n\n if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) {\n return {\n name: 'resize',\n edges: resizeEdges,\n };\n }\n }\n else {\n const right = options.resize.axis !== 'y' && page.x > (rect.right - defaultMargin);\n const bottom = options.resize.axis !== 'x' && page.y > (rect.bottom - defaultMargin);\n\n if (right || bottom) {\n return {\n name: 'resize',\n axes: (right? 'x' : '') + (bottom? 'y' : ''),\n };\n }\n }\n }\n\n return null;\n },\n\n cursors: (browser.isIe9OrOlder ? {\n x : 'e-resize',\n y : 's-resize',\n xy: 'se-resize',\n\n top : 'n-resize',\n left : 'w-resize',\n bottom : 's-resize',\n right : 'e-resize',\n topleft : 'se-resize',\n bottomright: 'se-resize',\n topright : 'ne-resize',\n bottomleft : 'ne-resize',\n } : {\n x : 'ew-resize',\n y : 'ns-resize',\n xy: 'nwse-resize',\n\n top : 'ns-resize',\n left : 'ew-resize',\n bottom : 'ns-resize',\n right : 'ew-resize',\n topleft : 'nwse-resize',\n bottomright: 'nwse-resize',\n topright : 'nesw-resize',\n bottomleft : 'nesw-resize',\n }),\n\n getCursor: function (action) {\n if (action.axis) {\n return resize.cursors[action.name + action.axis];\n }\n else if (action.edges) {\n let cursorKey = '';\n const edgeNames = ['top', 'bottom', 'left', 'right'];\n\n for (let i = 0; i < 4; i++) {\n if (action.edges[edgeNames[i]]) {\n cursorKey += edgeNames[i];\n }\n }\n\n return resize.cursors[cursorKey];\n }\n },\n};\n\n// resizestart\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'resizestart' || !interaction.prepared.edges) {\n return;\n }\n\n const startRect = interaction.target.getRect(interaction.element);\n const resizeOptions = interaction.target.options.resize;\n\n /*\n * When using the `resizable.square` or `resizable.preserveAspectRatio` options, resizing from one edge\n * will affect another. E.g. with `resizable.square`, resizing to make the right edge larger will make\n * the bottom edge larger by the same amount. We call these 'linked' edges. Any linked edges will depend\n * on the active edges and the edge being interacted with.\n */\n if (resizeOptions.square || resizeOptions.preserveAspectRatio) {\n const linkedEdges = utils.extend({}, interaction.prepared.edges);\n\n linkedEdges.top = linkedEdges.top || (linkedEdges.left && !linkedEdges.bottom);\n linkedEdges.left = linkedEdges.left || (linkedEdges.top && !linkedEdges.right );\n linkedEdges.bottom = linkedEdges.bottom || (linkedEdges.right && !linkedEdges.top );\n linkedEdges.right = linkedEdges.right || (linkedEdges.bottom && !linkedEdges.left );\n\n interaction.prepared._linkedEdges = linkedEdges;\n }\n else {\n interaction.prepared._linkedEdges = null;\n }\n\n // if using `resizable.preserveAspectRatio` option, record aspect ratio at the start of the resize\n if (resizeOptions.preserveAspectRatio) {\n interaction.resizeStartAspectRatio = startRect.width / startRect.height;\n }\n\n interaction.resizeRects = {\n start : startRect,\n current : utils.extend({}, startRect),\n inverted : utils.extend({}, startRect),\n previous : utils.extend({}, startRect),\n delta : {\n left: 0, right : 0, width : 0,\n top : 0, bottom: 0, height: 0,\n },\n };\n\n iEvent.rect = interaction.resizeRects.inverted;\n iEvent.deltaRect = interaction.resizeRects.delta;\n});\n\n// resizemove\nInteractEvent.signals.on('new', function ({ iEvent, phase, interaction }) {\n if (phase !== 'move' || !interaction.prepared.edges) { return; }\n\n const resizeOptions = interaction.target.options.resize;\n const invert = resizeOptions.invert;\n const invertible = invert === 'reposition' || invert === 'negate';\n\n let edges = interaction.prepared.edges;\n\n const start = interaction.resizeRects.start;\n const current = interaction.resizeRects.current;\n const inverted = interaction.resizeRects.inverted;\n const delta = interaction.resizeRects.delta;\n const previous = utils.extend(interaction.resizeRects.previous, inverted);\n const originalEdges = edges;\n\n let dx = iEvent.dx;\n let dy = iEvent.dy;\n\n if (resizeOptions.preserveAspectRatio || resizeOptions.square) {\n // `resize.preserveAspectRatio` takes precedence over `resize.square`\n const startAspectRatio = resizeOptions.preserveAspectRatio\n ? interaction.resizeStartAspectRatio\n : 1;\n\n edges = interaction.prepared._linkedEdges;\n\n if ((originalEdges.left && originalEdges.bottom)\n || (originalEdges.right && originalEdges.top)) {\n dy = -dx / startAspectRatio;\n }\n else if (originalEdges.left || originalEdges.right ) { dy = dx / startAspectRatio; }\n else if (originalEdges.top || originalEdges.bottom) { dx = dy * startAspectRatio; }\n }\n\n // update the 'current' rect without modifications\n if (edges.top ) { current.top += dy; }\n if (edges.bottom) { current.bottom += dy; }\n if (edges.left ) { current.left += dx; }\n if (edges.right ) { current.right += dx; }\n\n if (invertible) {\n // if invertible, copy the current rect\n utils.extend(inverted, current);\n\n if (invert === 'reposition') {\n // swap edge values if necessary to keep width/height positive\n let swap;\n\n if (inverted.top > inverted.bottom) {\n swap = inverted.top;\n\n inverted.top = inverted.bottom;\n inverted.bottom = swap;\n }\n if (inverted.left > inverted.right) {\n swap = inverted.left;\n\n inverted.left = inverted.right;\n inverted.right = swap;\n }\n }\n }\n else {\n // if not invertible, restrict to minimum of 0x0 rect\n inverted.top = Math.min(current.top, start.bottom);\n inverted.bottom = Math.max(current.bottom, start.top);\n inverted.left = Math.min(current.left, start.right);\n inverted.right = Math.max(current.right, start.left);\n }\n\n inverted.width = inverted.right - inverted.left;\n inverted.height = inverted.bottom - inverted.top ;\n\n for (const edge in inverted) {\n delta[edge] = inverted[edge] - previous[edge];\n }\n\n iEvent.edges = interaction.prepared.edges;\n iEvent.rect = inverted;\n iEvent.deltaRect = delta;\n});\n\n/*\\\n * Interactable.resizable\n [ method ]\n *\n * Gets or sets whether resize actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of resize elements\n | var isResizeable = interact('input[type=text]').resizable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on resize events (object makes the Interactable resizable)\n = (object) This Interactable\n | interact(element).resizable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | edges: {\n | top : true, // Use pointer coords to check for resize.\n | left : false, // Disable resizing from left edge.\n | bottom: '.resize-s',// Resize if pointer target matches selector\n | right : handleEl // Resize if pointer target is the given Element\n | },\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height are adjusted at a 1:1 ratio.\n | square: false,\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height maintain the aspect ratio they had when resizing started.\n | preserveAspectRatio: false,\n |\n | // a value of 'none' will limit the resize rect to a minimum of 0x0\n | // 'negate' will allow the rect to have negative width/height\n | // 'reposition' will keep the width/height positive by swapping\n | // the top and bottom edges and/or swapping the left and right edges\n | invert: 'none' || 'negate' || 'reposition'\n |\n | // limit multiple resizes.\n | // See the explanation in the @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n \\*/\nInteractable.prototype.resizable = function (options) {\n if (utils.is.object(options)) {\n this.options.resize.enabled = options.enabled === false? false: true;\n this.setPerAction('resize', options);\n this.setOnEvents('resize', options);\n\n if (/^x$|^y$|^xy$/.test(options.axis)) {\n this.options.resize.axis = options.axis;\n }\n else if (options.axis === null) {\n this.options.resize.axis = defaultOptions.resize.axis;\n }\n\n if (utils.is.bool(options.preserveAspectRatio)) {\n this.options.resize.preserveAspectRatio = options.preserveAspectRatio;\n }\n else if (utils.is.bool(options.square)) {\n this.options.resize.square = options.square;\n }\n\n return this;\n }\n if (utils.is.bool(options)) {\n this.options.resize.enabled = options;\n\n if (!options) {\n this.onresizestart = this.onresizestart = this.onresizeend = null;\n }\n\n return this;\n }\n return this.options.resize;\n};\n\nfunction checkResizeEdge (name, value, page, element, interactableElement, rect, margin) {\n // false, '', undefined, null\n if (!value) { return false; }\n\n // true value, use pointer coords and element rect\n if (value === true) {\n // if dimensions are negative, \"switch\" edges\n const width = utils.is.number(rect.width )? rect.width : rect.right - rect.left;\n const height = utils.is.number(rect.height)? rect.height : rect.bottom - rect.top ;\n\n if (width < 0) {\n if (name === 'left' ) { name = 'right'; }\n else if (name === 'right') { name = 'left' ; }\n }\n if (height < 0) {\n if (name === 'top' ) { name = 'bottom'; }\n else if (name === 'bottom') { name = 'top' ; }\n }\n\n if (name === 'left' ) { return page.x < ((width >= 0? rect.left: rect.right ) + margin); }\n if (name === 'top' ) { return page.y < ((height >= 0? rect.top : rect.bottom) + margin); }\n\n if (name === 'right' ) { return page.x > ((width >= 0? rect.right : rect.left) - margin); }\n if (name === 'bottom') { return page.y > ((height >= 0? rect.bottom: rect.top ) - margin); }\n }\n\n // the remaining checks require an element\n if (!utils.is.element(element)) { return false; }\n\n return utils.is.element(value)\n // the value is an element to use as a resize handle\n ? value === element\n // otherwise check if element matches value as selector\n : utils.matchesUpTo(element, value, interactableElement);\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.resizeAxes = 'xy';\n});\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action }) {\n if (action !== 'resize' || !interaction.resizeAxes) { return; }\n\n const options = interaction.target.options;\n\n if (options.resize.square) {\n if (interaction.resizeAxes === 'y') {\n iEvent.dx = iEvent.dy;\n }\n else {\n iEvent.dy = iEvent.dx;\n }\n iEvent.axes = 'xy';\n }\n else {\n iEvent.axes = interaction.resizeAxes;\n\n if (interaction.resizeAxes === 'x') {\n iEvent.dy = 0;\n }\n else if (interaction.resizeAxes === 'y') {\n iEvent.dx = 0;\n }\n }\n});\n\nactions.resize = resize;\nactions.names.push('resize');\nutils.merge(Interactable.eventTypes, [\n 'resizestart',\n 'resizemove',\n 'resizeinertiastart',\n 'resizeinertiaresume',\n 'resizeend',\n]);\nactions.methodDict.resize = 'resizable';\n\ndefaultOptions.resize = resize.defaults;\n\nmodule.exports = resize;\n","const raf = require('./utils/raf');\nconst getWindow = require('./utils/window').getWindow;\nconst is = require('./utils/is');\nconst domUtils = require('./utils/domUtils');\nconst Interaction = require('./Interaction');\nconst defaultOptions = require('./defaultOptions');\n\nconst autoScroll = {\n defaults: {\n enabled : false,\n container: null, // the item that is scrolled (Window or HTMLElement)\n margin : 60,\n speed : 300, // the scroll speed in pixels per second\n },\n\n interaction: null,\n i: null, // the handle returned by window.setInterval\n x: 0, y: 0, // Direction each pulse is to scroll in\n\n isScrolling: false,\n prevTime: 0,\n\n start: function (interaction) {\n autoScroll.isScrolling = true;\n raf.cancel(autoScroll.i);\n\n autoScroll.interaction = interaction;\n autoScroll.prevTime = new Date().getTime();\n autoScroll.i = raf.request(autoScroll.scroll);\n },\n\n stop: function () {\n autoScroll.isScrolling = false;\n raf.cancel(autoScroll.i);\n },\n\n // scroll the window by the values in scroll.x/y\n scroll: function () {\n const options = autoScroll.interaction.target.options[autoScroll.interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(autoScroll.interaction.element);\n const now = new Date().getTime();\n // change in time in seconds\n const dt = (now - autoScroll.prevTime) / 1000;\n // displacement\n const s = options.speed * dt;\n\n if (s >= 1) {\n if (is.window(container)) {\n container.scrollBy(autoScroll.x * s, autoScroll.y * s);\n }\n else if (container) {\n container.scrollLeft += autoScroll.x * s;\n container.scrollTop += autoScroll.y * s;\n }\n\n autoScroll.prevTime = now;\n }\n\n if (autoScroll.isScrolling) {\n raf.cancel(autoScroll.i);\n autoScroll.i = raf.request(autoScroll.scroll);\n }\n },\n check: function (interactable, actionName) {\n const options = interactable.options;\n\n return options[actionName].autoScroll && options[actionName].autoScroll.enabled;\n },\n onInteractionMove: function ({ interaction, pointer }) {\n if (!(interaction.interacting()\n && autoScroll.check(interaction.target, interaction.prepared.name))) {\n return;\n }\n\n if (interaction.simulation) {\n autoScroll.x = autoScroll.y = 0;\n return;\n }\n\n let top;\n let right;\n let bottom;\n let left;\n\n const options = interaction.target.options[interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(interaction.element);\n\n if (is.window(container)) {\n left = pointer.clientX < autoScroll.margin;\n top = pointer.clientY < autoScroll.margin;\n right = pointer.clientX > container.innerWidth - autoScroll.margin;\n bottom = pointer.clientY > container.innerHeight - autoScroll.margin;\n }\n else {\n const rect = domUtils.getElementClientRect(container);\n\n left = pointer.clientX < rect.left + autoScroll.margin;\n top = pointer.clientY < rect.top + autoScroll.margin;\n right = pointer.clientX > rect.right - autoScroll.margin;\n bottom = pointer.clientY > rect.bottom - autoScroll.margin;\n }\n\n autoScroll.x = (right ? 1: left? -1: 0);\n autoScroll.y = (bottom? 1: top? -1: 0);\n\n if (!autoScroll.isScrolling) {\n // set the autoScroll properties to those of the target\n autoScroll.margin = options.margin;\n autoScroll.speed = options.speed;\n\n autoScroll.start(interaction);\n }\n },\n};\n\nInteraction.signals.on('stop-active', function () {\n autoScroll.stop();\n});\n\nInteraction.signals.on('action-move', autoScroll.onInteractionMove);\n\ndefaultOptions.perAction.autoScroll = autoScroll.defaults;\n\nmodule.exports = autoScroll;\n","const Interactable = require('../Interactable');\nconst actions = require('../actions/base');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.ignoreFrom\n [ method ]\n *\n * If the target of the `mousedown`, `pointerdown` or `touchstart`\n * event or any of it's parents match the given CSS selector or\n * Element, no drag/resize/gesture is started.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to not ignore any elements\n = (string | Element | object) The current ignoreFrom value or this Interactable\n **\n | interact(element, { ignoreFrom: document.getElementById('no-action') });\n | // or\n | interact(element).ignoreFrom('input, textarea, a');\n\\*/\nInteractable.prototype.ignoreFrom = function (newValue) {\n return this._backCompatOption('ignoreFrom', newValue);\n};\n\n/*\\\n * Interactable.allowFrom\n [ method ]\n *\n * A drag/resize/gesture is started only If the target of the\n * `mousedown`, `pointerdown` or `touchstart` event or any of it's\n * parents match the given CSS selector or Element.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to allow from any element\n = (string | Element | object) The current allowFrom value or this Interactable\n **\n | interact(element, { allowFrom: document.getElementById('drag-handle') });\n | // or\n | interact(element).allowFrom('.handle');\n\\*/\nInteractable.prototype.allowFrom = function (newValue) {\n return this._backCompatOption('allowFrom', newValue);\n};\n\nInteractable.prototype.testIgnore = function (ignoreFrom, interactableElement, element) {\n if (!ignoreFrom || !is.element(element)) { return false; }\n\n if (is.string(ignoreFrom)) {\n return domUtils.matchesUpTo(element, ignoreFrom, interactableElement);\n }\n else if (is.element(ignoreFrom)) {\n return domUtils.nodeContains(ignoreFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testAllow = function (allowFrom, interactableElement, element) {\n if (!allowFrom) { return true; }\n\n if (!is.element(element)) { return false; }\n\n if (is.string(allowFrom)) {\n return domUtils.matchesUpTo(element, allowFrom, interactableElement);\n }\n else if (is.element(allowFrom)) {\n return domUtils.nodeContains(allowFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testIgnoreAllow = function (options, interactableElement, eventTarget) {\n return (!this.testIgnore(options.ignoreFrom, interactableElement, eventTarget)\n && this.testAllow(options.allowFrom, interactableElement, eventTarget));\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (event.buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\n","const interact = require('../interact');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst actions = require('../actions/base');\nconst defaultOptions = require('../defaultOptions');\nconst browser = require('../utils/browser');\nconst scope = require('../scope');\nconst utils = require('../utils');\nconst signals = require('../utils/Signals').new();\n\nrequire('./InteractableMethods');\n\nconst autoStart = {\n signals,\n withinInteractionLimit,\n // Allow this many interactions to happen simultaneously\n maxInteractions: Infinity,\n defaults: {\n perAction: {\n manualStart: false,\n max: Infinity,\n maxPerElement: 1,\n allowFrom: null,\n ignoreFrom: null,\n },\n },\n setActionDefaults: function (action) {\n utils.extend(action.defaults, autoStart.defaults.perAction);\n },\n};\n\n// set cursor style on mousedown\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget }) {\n if (interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\n// set cursor style on mousemove\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget }) {\n if (!interaction.mouse\n || interaction.pointerIsDown\n || interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\nInteraction.signals.on('move', function (arg) {\n const { interaction, event } = arg;\n\n if (!interaction.pointerIsDown\n || interaction.interacting()\n || !interaction.pointerWasMoved\n || !interaction.prepared.name) {\n return;\n }\n\n signals.fire('before-start', arg);\n\n const target = interaction.target;\n\n if (interaction.prepared.name && target) {\n // check manualStart and interaction limit\n if (target.options[interaction.prepared.name].manualStart\n || !withinInteractionLimit(target, interaction.element, interaction.prepared)) {\n interaction.stop(event);\n }\n else {\n interaction.start(interaction.prepared, target, interaction.element);\n }\n }\n});\n\n// Check if the current target supports the action.\n// If so, return the validated action. Otherwise, return null\nfunction validateAction (action, interactable, element, eventTarget) {\n if (utils.is.object(action)\n && interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget)\n && interactable.options[action.name].enabled\n && withinInteractionLimit(interactable, element, action)) {\n return action;\n }\n\n return null;\n}\n\nfunction validateSelector (interaction, pointer, event, matches, matchElements, eventTarget) {\n for (let i = 0, len = matches.length; i < len; i++) {\n const match = matches[i];\n const matchElement = matchElements[i];\n const action = validateAction(match.getAction(pointer, event, interaction, matchElement),\n match,\n matchElement,\n eventTarget);\n\n if (action) {\n return {\n action,\n target: match,\n element: matchElement,\n };\n }\n }\n\n return {};\n}\n\nfunction getActionInfo (interaction, pointer, event, eventTarget) {\n let matches = [];\n let matchElements = [];\n\n let element = eventTarget;\n let action = null;\n\n function pushMatches (interactable, selector, context) {\n const elements = (browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined);\n\n if (utils.matchesSelector(element, selector, elements)) {\n\n matches.push(interactable);\n matchElements.push(element);\n }\n }\n\n while (utils.is.element(element)) {\n matches = [];\n matchElements = [];\n\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && (action = validateAction(elementInteractable.getAction(pointer, event, interaction, element, eventTarget),\n elementInteractable,\n element,\n eventTarget))\n && !elementInteractable.options[action.name].manualStart) {\n return {\n element,\n action,\n target: elementInteractable,\n };\n }\n else {\n scope.interactables.forEachSelector(pushMatches, element);\n\n const actionInfo = validateSelector(interaction, pointer, event, matches, matchElements, eventTarget);\n\n if (actionInfo.action\n && !actionInfo.target.options[actionInfo.action.name].manualStart) {\n return actionInfo;\n }\n }\n\n element = utils.parentNode(element);\n }\n\n return {};\n}\n\nfunction prepare (interaction, { action, target, element }) {\n action = action || {};\n\n if (interaction.target && interaction.target.options.styleCursor) {\n interaction.target._doc.documentElement.style.cursor = '';\n }\n\n interaction.target = target;\n interaction.element = element;\n utils.copyAction(interaction.prepared, action);\n\n if (target && target.options.styleCursor) {\n const cursor = action? actions[action.name].getCursor(action) : '';\n interaction.target._doc.documentElement.style.cursor = cursor;\n }\n\n signals.fire('prepared', { interaction: interaction });\n}\n\nInteraction.signals.on('stop', function ({ interaction }) {\n const target = interaction.target;\n\n if (target && target.options.styleCursor) {\n target._doc.documentElement.style.cursor = '';\n }\n});\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (utils.is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (utils.is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n const buttons = event.buttons || ({\n 0: 1,\n 1: 4,\n 3: 8,\n 4: 16,\n })[event.button];\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\nfunction withinInteractionLimit (interactable, element, action) {\n const options = interactable.options;\n const maxActions = options[action.name].max;\n const maxPerElement = options[action.name].maxPerElement;\n let activeInteractions = 0;\n let targetCount = 0;\n let targetElementCount = 0;\n\n // no actions if any of these values == 0\n if (!(maxActions && maxPerElement && autoStart.maxInteractions)) { return; }\n\n for (let i = 0, len = scope.interactions.length; i < len; i++) {\n const interaction = scope.interactions[i];\n const otherAction = interaction.prepared.name;\n\n if (!interaction.interacting()) { continue; }\n\n activeInteractions++;\n\n if (activeInteractions >= autoStart.maxInteractions) {\n return false;\n }\n\n if (interaction.target !== interactable) { continue; }\n\n targetCount += (otherAction === action.name)|0;\n\n if (targetCount >= maxActions) {\n return false;\n }\n\n if (interaction.element === element) {\n targetElementCount++;\n\n if (otherAction !== action.name || targetElementCount >= maxPerElement) {\n return false;\n }\n }\n }\n\n return autoStart.maxInteractions > 0;\n}\n\n/*\\\n * interact.maxInteractions\n [ method ]\n **\n * Returns or sets the maximum number of concurrent interactions allowed.\n * By default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables\n * and elements, you need to enable it in the draggable, resizable and\n * gesturable `'max'` and `'maxPerElement'` options.\n **\n - newValue (number) #optional Any number. newValue <= 0 means no interactions.\n\\*/\ninteract.maxInteractions = function (newValue) {\n if (utils.is.number(newValue)) {\n autoStart.maxInteractions = newValue;\n\n return this;\n }\n\n return autoStart.maxInteractions;\n};\n\nInteractable.settingsMethods.push('styleCursor');\nInteractable.settingsMethods.push('actionChecker');\nInteractable.settingsMethods.push('ignoreFrom');\nInteractable.settingsMethods.push('allowFrom');\n\ndefaultOptions.base.actionChecker = null;\ndefaultOptions.base.styleCursor = true;\n\nutils.extend(defaultOptions.perAction, autoStart.defaults.perAction);\n\nmodule.exports = autoStart;\n","const autoStart = require('./base');\nconst Interaction = require('../Interaction');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.delayTimer = null;\n});\n\nautoStart.signals.on('prepared', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.delayTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.target, interaction.element);\n }, delay);\n }\n});\n\nInteraction.signals.on('move', function ({ interaction, duplicate }) {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.delayTimer);\n }\n});\n\n// prevent regular down->move autoStart\nautoStart.signals.on('before-start', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.prepared.name = null;\n }\n});\n","const autoStart = require('./base');\nconst scope = require('../scope');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\n\nconst { matchesSelector, parentNode } = require('../utils/domUtils');\n\nautoStart.setActionDefaults(require('../actions/drag'));\n\nautoStart.signals.on('before-start', function ({ interaction, eventTarget, dx, dy }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // check if a drag is in the correct axis\n const absX = Math.abs(dx);\n const absY = Math.abs(dy);\n const options = interaction.target.options.drag;\n const startAxis = options.startAxis;\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy');\n\n interaction.prepared.axis = options.lockAxis === 'start'\n ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n : options.lockAxis;\n\n // if the movement isn't in the startAxis of the interactable\n if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) {\n // cancel the prepared action\n interaction.prepared.name = null;\n\n // then try to get a drag from another ineractable\n\n if (!interaction.prepared.name) {\n\n let element = eventTarget;\n\n const getDraggable = function (interactable, selector, context) {\n const elements = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n if (interactable === interaction.target) { return; }\n\n if (!options.manualStart\n && !interactable.testIgnoreAllow(options, element, eventTarget)\n && matchesSelector(element, selector, elements)) {\n\n const action = interactable.getAction(interaction.downPointer,\n interaction.downEvent,\n interaction,\n element);\n\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, interactable)\n && autoStart.validateAction(action, interactable, element, eventTarget)) {\n\n return interactable;\n }\n }\n };\n\n let action = null;\n\n // check all interactables\n while (is.element(element)) {\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && elementInteractable !== interaction.target\n && !elementInteractable.options.drag.manualStart) {\n\n action = elementInteractable.getAction(interaction.downPointer, interaction.downEvent, interaction, element);\n }\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, elementInteractable)) {\n\n interaction.prepared.name = 'drag';\n interaction.target = elementInteractable;\n interaction.element = element;\n break;\n }\n\n const selectorInteractable = scope.interactables.forEachSelector(getDraggable, element);\n\n if (selectorInteractable) {\n interaction.prepared.name = 'drag';\n interaction.target = selectorInteractable;\n interaction.element = element;\n break;\n }\n\n element = parentNode(element);\n }\n }\n }\n});\n\nfunction checkStartAxis (startAxis, interactable) {\n if (!interactable) { return false; }\n\n const thisAxis = interactable.options.drag.startAxis;\n\n return (startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis);\n}\n","require('./base').setActionDefaults(require('../actions/gesture'));\n","require('./base').setActionDefaults(require('../actions/resize'));\n","module.exports = {\n base: {\n accept : null,\n preventDefault: 'auto',\n deltaSource : 'page',\n },\n\n perAction: {\n origin: { x: 0, y: 0 },\n\n // only allow left button by default\n // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n mouseButtons: 1,\n\n inertia: {\n enabled : false,\n resistance : 10, // the lambda in exponential decay\n minSpeed : 100, // target speed must be above this for inertia to start\n endSpeed : 10, // the speed at which inertia is slow enough to stop\n allowResume : true, // allow resuming an action in inertia phase\n smoothEndDuration: 300, // animate to snap/restrict endOnly if there's no inertia\n },\n },\n};\n","/* browser entry point */\n\n// Legacy browser support\nrequire('./legacyBrowsers');\n\n// inertia\nrequire('./inertia');\n\n// modifiers\nrequire('./modifiers/snap');\nrequire('./modifiers/restrict');\n\n// pointerEvents\nrequire('./pointerEvents/base');\nrequire('./pointerEvents/holdRepeat');\nrequire('./pointerEvents/interactableTargets');\n\n// delay\nrequire('./autoStart/delay');\n\n// actions\nrequire('./actions/gesture');\nrequire('./actions/resize');\nrequire('./actions/drag');\nrequire('./actions/drop');\n\n// load these modifiers after resize is loaded\nrequire('./modifiers/snapSize');\nrequire('./modifiers/restrictEdges');\nrequire('./modifiers/restrictSize');\n\n// autoStart actions\nrequire('./autoStart/gesture');\nrequire('./autoStart/resize');\nrequire('./autoStart/drag');\n\n// Interactable preventDefault setting\nrequire('./interactablePreventDefault.js');\n\n// autoScroll\nrequire('./autoScroll');\n\n// export interact\nmodule.exports = require('./interact');\n","const InteractEvent = require('./InteractEvent');\nconst Interaction = require('./Interaction');\nconst modifiers = require('./modifiers');\nconst utils = require('./utils');\nconst animationFrame = require('./utils/raf');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.inertiaStatus = {\n active : false,\n smoothEnd : false,\n allowResume: false,\n\n startEvent: null,\n upCoords : {},\n\n xe: 0, ye: 0,\n sx: 0, sy: 0,\n\n t0: 0,\n vx0: 0, vys: 0,\n duration: 0,\n\n lambda_v0: 0,\n one_ve_v0: 0,\n i : null,\n };\n\n interaction.boundInertiaFrame = () => inertiaFrame .apply(interaction);\n interaction.boundSmoothEndFrame = () => smoothEndFrame.apply(interaction);\n});\n\nInteraction.signals.on('down', function ({ interaction, event, pointer, eventTarget }) {\n const status = interaction.inertiaStatus;\n\n // Check if the down event hits the current inertia target\n if (status.active) {\n let element = eventTarget;\n\n // climb up the DOM tree from the event target\n while (utils.is.element(element)) {\n\n // if interaction element is the current inertia target element\n if (element === interaction.element) {\n // stop inertia\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n\n // update pointers to the down event's coordinates\n interaction.updatePointer(pointer);\n utils.setCoords(interaction.curCoords, interaction.pointers);\n\n // fire appropriate signals\n const signalArg = { interaction };\n Interaction.signals.fire('before-action-move', signalArg);\n Interaction.signals.fire('action-resume' , signalArg);\n\n // fire a reume event\n const resumeEvent = new InteractEvent(interaction,\n event,\n interaction.prepared.name,\n 'inertiaresume',\n interaction.element);\n\n interaction.target.fire(resumeEvent);\n interaction.prevEvent = resumeEvent;\n modifiers.resetStatuses(interaction.modifierStatuses);\n\n utils.copyCoords(interaction.prevCoords, interaction.curCoords);\n break;\n }\n\n element = utils.parentNode(element);\n }\n }\n});\n\nInteraction.signals.on('up', function ({ interaction, event }) {\n const status = interaction.inertiaStatus;\n\n if (!interaction.interacting() || status.active) { return; }\n\n const target = interaction.target;\n const options = target && target.options;\n const inertiaOptions = options && interaction.prepared.name && options[interaction.prepared.name].inertia;\n\n const now = new Date().getTime();\n const statuses = {};\n const page = utils.extend({}, interaction.curCoords.page);\n const pointerSpeed = interaction.pointerDelta.client.speed;\n\n let smoothEnd = false;\n let modifierResult;\n\n // check if inertia should be started\n const inertiaPossible = (inertiaOptions && inertiaOptions.enabled\n && interaction.prepared.name !== 'gesture'\n && event !== status.startEvent);\n\n const inertia = (inertiaPossible\n && (now - interaction.curCoords.timeStamp) < 50\n && pointerSpeed > inertiaOptions.minSpeed\n && pointerSpeed > inertiaOptions.endSpeed);\n\n const modifierArg = {\n interaction,\n pageCoords: page,\n statuses,\n preEnd: true,\n requireEndOnly: true,\n };\n\n // smoothEnd\n if (inertiaPossible && !inertia) {\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n if (modifierResult.shouldMove && modifierResult.locked) {\n smoothEnd = true;\n }\n }\n\n if (!(inertia || smoothEnd)) { return; }\n\n utils.copyCoords(status.upCoords, interaction.curCoords);\n\n interaction.pointers[0] = status.startEvent =\n new InteractEvent(interaction, event, interaction.prepared.name, 'inertiastart', interaction.element);\n\n status.t0 = now;\n\n status.active = true;\n status.allowResume = inertiaOptions.allowResume;\n interaction.simulation = status;\n\n target.fire(status.startEvent);\n\n if (inertia) {\n status.vx0 = interaction.pointerDelta.client.vx;\n status.vy0 = interaction.pointerDelta.client.vy;\n status.v0 = pointerSpeed;\n\n calcInertia(interaction, status);\n\n utils.extend(page, interaction.curCoords.page);\n\n page.x += status.xe;\n page.y += status.ye;\n\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n status.modifiedXe += modifierResult.dx;\n status.modifiedYe += modifierResult.dy;\n\n status.i = animationFrame.request(interaction.boundInertiaFrame);\n }\n else {\n status.smoothEnd = true;\n status.xe = modifierResult.dx;\n status.ye = modifierResult.dy;\n\n status.sx = status.sy = 0;\n\n status.i = animationFrame.request(interaction.boundSmoothEndFrame);\n }\n});\n\nInteraction.signals.on('stop-active', function ({ interaction }) {\n const status = interaction.inertiaStatus;\n\n if (status.active) {\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n }\n});\n\nfunction calcInertia (interaction, status) {\n const inertiaOptions = interaction.target.options[interaction.prepared.name].inertia;\n const lambda = inertiaOptions.resistance;\n const inertiaDur = -Math.log(inertiaOptions.endSpeed / status.v0) / lambda;\n\n status.x0 = interaction.prevEvent.pageX;\n status.y0 = interaction.prevEvent.pageY;\n status.t0 = status.startEvent.timeStamp / 1000;\n status.sx = status.sy = 0;\n\n status.modifiedXe = status.xe = (status.vx0 - inertiaDur) / lambda;\n status.modifiedYe = status.ye = (status.vy0 - inertiaDur) / lambda;\n status.te = inertiaDur;\n\n status.lambda_v0 = lambda / status.v0;\n status.one_ve_v0 = 1 - inertiaOptions.endSpeed / status.v0;\n}\n\nfunction inertiaFrame () {\n updateInertiaCoords(this);\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n\n const status = this.inertiaStatus;\n const options = this.target.options[this.prepared.name].inertia;\n const lambda = options.resistance;\n const t = new Date().getTime() / 1000 - status.t0;\n\n if (t < status.te) {\n\n const progress = 1 - (Math.exp(-lambda * t) - status.lambda_v0) / status.one_ve_v0;\n\n if (status.modifiedXe === status.xe && status.modifiedYe === status.ye) {\n status.sx = status.xe * progress;\n status.sy = status.ye * progress;\n }\n else {\n const quadPoint = utils.getQuadraticCurvePoint(0, 0,\n status.xe,\n status.ye,\n status.modifiedXe,\n status.modifiedYe,\n progress);\n\n status.sx = quadPoint.x;\n status.sy = quadPoint.y;\n }\n\n this.doMove();\n\n status.i = animationFrame.request(this.boundInertiaFrame);\n }\n else {\n status.sx = status.modifiedXe;\n status.sy = status.modifiedYe;\n\n this.doMove();\n this.end(status.startEvent);\n status.active = false;\n this.simulation = null;\n }\n\n utils.copyCoords(this.prevCoords, this.curCoords);\n}\n\nfunction smoothEndFrame () {\n updateInertiaCoords(this);\n\n const status = this.inertiaStatus;\n const t = new Date().getTime() - status.t0;\n const duration = this.target.options[this.prepared.name].inertia.smoothEndDuration;\n\n if (t < duration) {\n status.sx = utils.easeOutQuad(t, 0, status.xe, duration);\n status.sy = utils.easeOutQuad(t, 0, status.ye, duration);\n\n this.pointerMove(status.startEvent, status.startEvent);\n\n status.i = animationFrame.request(this.boundSmoothEndFrame);\n }\n else {\n status.sx = status.xe;\n status.sy = status.ye;\n\n this.pointerMove(status.startEvent, status.startEvent);\n this.end(status.startEvent);\n\n status.smoothEnd =\n status.active = false;\n this.simulation = null;\n }\n}\n\nfunction updateInertiaCoords (interaction) {\n const status = interaction.inertiaStatus;\n\n // return if inertia isn't running\n if (!status.active) { return; }\n\n const pageUp = status.upCoords.page;\n const clientUp = status.upCoords.client;\n\n utils.setCoords(interaction.curCoords, [ {\n pageX : pageUp.x + status.sx,\n pageY : pageUp.y + status.sy,\n clientX: clientUp.x + status.sx,\n clientY: clientUp.y + status.sy,\n } ]);\n}\n","const browser = require('./utils/browser');\nconst events = require('./utils/events');\nconst utils = require('./utils');\nconst scope = require('./scope');\nconst Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\n\nconst globalEvents = {};\n\n/*\\\n * interact\n [ method ]\n *\n * The methods of this variable can be used to set elements as\n * interactables and also to change various default settings.\n *\n * Calling it as a function and passing an element or a valid CSS selector\n * string returns an Interactable object which has various methods to\n * configure it.\n *\n - element (Element | string) The HTML or SVG Element to interact with or CSS selector\n = (object) An @Interactable\n *\n > Usage\n | interact('#draggable').draggable(true);\n |\n | var rectables = interact('rect');\n | rectables\n | .gesturable(true)\n | .on('gesturemove', function (event) {\n | // ...\n | });\n\\*/\nfunction interact (element, options) {\n let interactable = scope.interactables.get(element, options);\n\n if (!interactable) {\n interactable = new Interactable(element, options);\n interactable.events.global = globalEvents;\n }\n\n return interactable;\n}\n\n/*\\\n * interact.isSet\n [ method ]\n *\n * Check if an element has been set\n - element (Element) The Element being searched for\n = (boolean) Indicates if the element or CSS selector was previously passed to interact\n\\*/\ninteract.isSet = function (element, options) {\n return scope.interactables.indexOfElement(element, options && options.context) !== -1;\n};\n\n/*\\\n * interact.on\n [ method ]\n *\n * Adds a global listener for an InteractEvent or adds a DOM event to\n * `document`\n *\n - type (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) interact\n\\*/\ninteract.on = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.on(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.on(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n // if it is an InteractEvent type, add listener to globalEvents\n if (utils.contains(Interactable.eventTypes, type)) {\n // if this type of event was never bound\n if (!globalEvents[type]) {\n globalEvents[type] = [listener];\n }\n else {\n globalEvents[type].push(listener);\n }\n }\n // If non InteractEvent type, addEventListener to document\n else {\n events.add(scope.document, type, listener, { options });\n }\n\n return interact;\n};\n\n/*\\\n * interact.off\n [ method ]\n *\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n - type (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) interact\n \\*/\ninteract.off = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.off(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.off(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n if (!utils.contains(Interactable.eventTypes, type)) {\n events.remove(scope.document, type, listener, options);\n }\n else {\n let index;\n\n if (type in globalEvents\n && (index = utils.indexOf(globalEvents[type], listener)) !== -1) {\n globalEvents[type].splice(index, 1);\n }\n }\n\n return interact;\n};\n\n/*\\\n * interact.debug\n [ method ]\n *\n * Returns an object which exposes internal data\n = (object) An object with properties that outline the current state and expose internal functions and variables\n\\*/\ninteract.debug = function () {\n return scope;\n};\n\n// expose the functions used to calculate multi-touch properties\ninteract.getPointerAverage = utils.pointerAverage;\ninteract.getTouchBBox = utils.touchBBox;\ninteract.getTouchDistance = utils.touchDistance;\ninteract.getTouchAngle = utils.touchAngle;\n\ninteract.getElementRect = utils.getElementRect;\ninteract.getElementClientRect = utils.getElementClientRect;\ninteract.matchesSelector = utils.matchesSelector;\ninteract.closest = utils.closest;\n\n/*\\\n * interact.supportsTouch\n [ method ]\n *\n = (boolean) Whether or not the browser supports touch input\n\\*/\ninteract.supportsTouch = function () {\n return browser.supportsTouch;\n};\n\n/*\\\n * interact.supportsPointerEvent\n [ method ]\n *\n = (boolean) Whether or not the browser supports PointerEvents\n\\*/\ninteract.supportsPointerEvent = function () {\n return browser.supportsPointerEvent;\n};\n\n/*\\\n * interact.stop\n [ method ]\n *\n * Cancels all interactions (end events are not fired)\n *\n - event (Event) An event on which to call preventDefault()\n = (object) interact\n\\*/\ninteract.stop = function (event) {\n for (let i = scope.interactions.length - 1; i >= 0; i--) {\n scope.interactions[i].stop(event);\n }\n\n return interact;\n};\n\n/*\\\n * interact.pointerMoveTolerance\n [ method ]\n * Returns or sets the distance the pointer must be moved before an action\n * sequence occurs. This also affects tolerance for tap events.\n *\n - newValue (number) #optional The movement from the start position must be greater than this value\n = (number | Interactable) The current setting or interact\n\\*/\ninteract.pointerMoveTolerance = function (newValue) {\n if (utils.is.number(newValue)) {\n Interaction.pointerMoveTolerance = newValue;\n\n return this;\n }\n\n return Interaction.pointerMoveTolerance;\n};\n\ninteract.addDocument = scope.addDocument;\ninteract.removeDocument = scope.removeDocument;\n\nscope.interact = interact;\n\nmodule.exports = interact;\n","const Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\nconst scope = require('./scope');\nconst is = require('./utils/is');\nconst events = require('./utils/events');\n\nconst { nodeContains, matchesSelector } = require('./utils/domUtils');\n\n/*\\\n * Interactable.preventDefault\n [ method ]\n *\n * Returns or sets whether to prevent the browser's default behaviour\n * in response to pointer events. Can be set to:\n * - `'always'` to always prevent\n * - `'never'` to never prevent\n * - `'auto'` to let interact.js try to determine what would be best\n *\n - newValue (string) #optional `true`, `false` or `'auto'`\n = (string | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.preventDefault = function (newValue) {\n if (/^(always|never|auto)$/.test(newValue)) {\n this.options.preventDefault = newValue;\n return this;\n }\n\n if (is.bool(newValue)) {\n this.options.preventDefault = newValue? 'always' : 'never';\n return this;\n }\n\n return this.options.preventDefault;\n};\n\nInteractable.prototype.checkAndPreventDefault = function (event) {\n const setting = this.options.preventDefault;\n\n if (setting === 'never') { return; }\n\n if (setting === 'always') {\n event.preventDefault();\n return;\n }\n\n // setting === 'auto'\n\n // don't preventDefault if the browser supports passiveEvents\n // CSS touch-action and user-selecct should be used instead\n if (events.supportsOptions) {\n return;\n }\n\n // don't preventDefault of pointerdown events\n if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) {\n return;\n }\n\n // don't preventDefault on editable elements\n if (is.element(event.target)\n && matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) {\n return;\n }\n\n event.preventDefault();\n};\n\nfunction onInteractionEvent ({ interaction, event }) {\n if (interaction.target) {\n interaction.target.checkAndPreventDefault(event);\n }\n}\n\nfor (const eventSignal of ['down', 'move', 'up', 'cancel']) {\n Interaction.signals.on(eventSignal, onInteractionEvent);\n}\n\n// prevent native HTML5 drag on interact.js target elements\nInteraction.docEvents.dragstart = function preventNativeDrag (event) {\n for (const interaction of scope.interactions) {\n\n if (interaction.element\n && (interaction.element === event.target\n || nodeContains(interaction.element, event.target))) {\n\n interaction.target.checkAndPreventDefault(event);\n return;\n }\n }\n};\n","const scope = require('./scope');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst iFinder = require('./utils/interactionFinder');\nconst pointerEvents = require('./pointerEvents/base');\n\nconst { window } = require('./utils/window');\n\nconst toString = Object.prototype.toString;\n\nif (!window.Array.isArray) {\n window.Array.isArray = function (obj) {\n return toString.call(obj) === '[object Array]';\n };\n}\n\nif (!String.prototype.trim) {\n String.prototype.trim = function () {\n return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n };\n}\n\n// http://www.quirksmode.org/dom/events/click.html\n// >Events leading to dblclick\n//\n// IE8 doesn't fire down event before dblclick.\n// This workaround tries to fire a tap and doubletap after dblclick\nfunction onIE8Dblclick (event) {\n const eventTarget = event.target;\n const interaction = iFinder.search(event, event.type, eventTarget);\n\n if (!interaction) { return; }\n\n if (interaction.prevTap\n && event.clientX === interaction.prevTap.clientX\n && event.clientY === interaction.prevTap.clientY\n && eventTarget === interaction.prevTap.target) {\n\n interaction.downTargets[0] = eventTarget;\n interaction.downTimes [0] = new Date().getTime();\n\n pointerEvents.fire({\n interaction,\n event,\n eventTarget,\n pointer: event,\n type: 'tap',\n });\n }\n}\n\nif (browser.isIE8) {\n const selectFix = function (event) {\n for (const interaction of scope.interactions) {\n if (interaction.interacting()) {\n interaction.target.checkAndPreventDefault(event);\n }\n }\n };\n\n const onDocIE8 = function onDocIE8 ({ doc, win }, signalName) {\n const eventMethod = signalName.indexOf('listen') === 0\n ? events.add : events.remove;\n\n // For IE's lack of Event#preventDefault\n eventMethod(doc, 'selectstart', selectFix);\n\n if (pointerEvents) {\n eventMethod(doc, 'dblclick', onIE8Dblclick);\n }\n };\n\n scope.signals.on('add-document' , onDocIE8);\n scope.signals.on('remove-document', onDocIE8);\n}\n\nmodule.exports = null;\n","const InteractEvent = require('../InteractEvent');\nconst Interaction = require('../Interaction');\nconst extend = require('../utils/extend');\n\nconst modifiers = {\n names: [],\n\n setOffsets: function (arg) {\n const { interaction, pageCoords: page } = arg;\n const { target, element, startOffset } = interaction;\n const rect = target.getRect(element);\n\n if (rect) {\n startOffset.left = page.x - rect.left;\n startOffset.top = page.y - rect.top;\n\n startOffset.right = rect.right - page.x;\n startOffset.bottom = rect.bottom - page.y;\n\n if (!('width' in rect)) { rect.width = rect.right - rect.left; }\n if (!('height' in rect)) { rect.height = rect.bottom - rect.top ; }\n }\n else {\n startOffset.left = startOffset.top = startOffset.right = startOffset.bottom = 0;\n }\n\n arg.rect = rect;\n arg.interactable = target;\n arg.element = element;\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n\n arg.options = target.options[interaction.prepared.name][modifierName];\n\n if (!arg.options) {\n continue;\n }\n\n interaction.modifierOffsets[modifierName] = modifiers[modifierName].setOffset(arg);\n }\n },\n\n setAll: function (arg) {\n const { interaction, statuses, preEnd, requireEndOnly } = arg;\n const coords = extend({}, arg.pageCoords);\n const result = {\n dx: 0,\n dy: 0,\n changed: false,\n locked: false,\n shouldMove: true,\n };\n\n for (const modifierName of modifiers.names) {\n const modifier = modifiers[modifierName];\n const options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!shouldDo(options, preEnd, requireEndOnly)) { continue; }\n\n arg.status = arg.status = statuses[modifierName];\n arg.options = options;\n arg.offset = arg.interaction.modifierOffsets[modifierName];\n\n modifier.set(arg);\n\n if (arg.status.locked) {\n coords.x += arg.status.dx;\n coords.y += arg.status.dy;\n\n result.dx += arg.status.dx;\n result.dy += arg.status.dy;\n\n result.locked = true;\n }\n }\n\n // a move should be fired if:\n // - there are no modifiers enabled,\n // - no modifiers are \"locked\" i.e. have changed the pointer's coordinates, or\n // - the locked coords have changed since the last pointer move\n result.shouldMove = !arg.status || !result.locked || arg.status.changed;\n\n return result;\n },\n\n resetStatuses: function (statuses) {\n for (const modifierName of modifiers.names) {\n const status = statuses[modifierName] || {};\n\n status.dx = status.dy = 0;\n status.modifiedX = status.modifiedY = NaN;\n status.locked = false;\n status.changed = true;\n\n statuses[modifierName] = status;\n }\n\n return statuses;\n },\n\n start: function ({ interaction }, signalName) {\n const arg = {\n interaction,\n pageCoords: (signalName === 'action-resume' ?\n interaction.curCoords : interaction.startCoords).page,\n startOffset: interaction.startOffset,\n statuses: interaction.modifierStatuses,\n preEnd: false,\n requireEndOnly: false,\n };\n\n modifiers.setOffsets(arg);\n modifiers.resetStatuses(arg.statuses);\n\n arg.pageCoords = extend({}, interaction.startCoords.page);\n interaction.modifierResult = modifiers.setAll(arg);\n },\n};\n\nInteraction.signals.on('new', function (interaction) {\n interaction.startOffset = { left: 0, right: 0, top: 0, bottom: 0 };\n interaction.modifierOffsets = {};\n interaction.modifierStatuses = modifiers.resetStatuses({});\n interaction.modifierResult = null;\n});\n\nInteraction.signals.on('action-start' , modifiers.start);\nInteraction.signals.on('action-resume', modifiers.start);\n\nInteraction.signals.on('before-action-move', function ({ interaction, preEnd, interactingBeforeMove }) {\n const modifierResult = modifiers.setAll({\n interaction,\n preEnd,\n pageCoords: interaction.curCoords.page,\n statuses: interaction.modifierStatuses,\n requireEndOnly: false,\n });\n\n // don't fire an action move if a modifier would keep the event in the same\n // cordinates as before\n if (!modifierResult.shouldMove && interactingBeforeMove) {\n interaction._dontFireMove = true;\n }\n\n interaction.modifierResult = modifierResult;\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n for (let i = 0; i < modifiers.names.length; i++) {\n const options = interaction.target.options[interaction.prepared.name][modifiers.names[i]];\n\n // if the endOnly option is true for any modifier\n if (shouldDo(options, true, true)) {\n // fire a move event at the modified coordinates\n interaction.doMove({ event, preEnd: true });\n break;\n }\n }\n});\n\nInteractEvent.signals.on('set-xy', function (arg) {\n const { iEvent, interaction } = arg;\n const modifierArg = extend({}, arg);\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n modifierArg.options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!modifierArg.options) {\n continue;\n }\n\n const modifier = modifiers[modifierName];\n\n modifierArg.status = interaction.modifierStatuses[modifierName];\n\n iEvent[modifierName] = modifier.modifyCoords(modifierArg);\n }\n});\n\nfunction shouldDo (options, preEnd, requireEndOnly) {\n return (options && options.enabled\n && (preEnd || !options.endOnly)\n && (!requireEndOnly || options.endOnly));\n}\n\nmodule.exports = modifiers;\n","const modifiers = require('./index');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst restrict = {\n defaults: {\n enabled : false,\n endOnly : false,\n restriction: null,\n elementRect: null,\n },\n\n setOffset: function ({ rect, startOffset, options }) {\n const elementRect = options && options.elementRect;\n const offset = {};\n\n if (rect && elementRect) {\n offset.left = startOffset.left - (rect.width * elementRect.left);\n offset.top = startOffset.top - (rect.height * elementRect.top);\n\n offset.right = startOffset.right - (rect.width * (1 - elementRect.right));\n offset.bottom = startOffset.bottom - (rect.height * (1 - elementRect.bottom));\n }\n else {\n offset.left = offset.top = offset.right = offset.bottom = 0;\n }\n\n return offset;\n },\n\n set: function ({ pageCoords, interaction, status, options }) {\n if (!options) { return status; }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n\n const restriction = getRestrictionRect(options.restriction, interaction, page);\n\n if (!restriction) { return status; }\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n const rect = restriction;\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n const offset = interaction.modifierOffsets.restrict;\n\n // object is assumed to have\n // x, y, width, height or\n // left, top, right, bottom\n if ('x' in restriction && 'y' in restriction) {\n modifiedX = Math.max(Math.min(rect.x + rect.width - offset.right , page.x), rect.x + offset.left);\n modifiedY = Math.max(Math.min(rect.y + rect.height - offset.bottom, page.y), rect.y + offset.top );\n }\n else {\n modifiedX = Math.max(Math.min(rect.right - offset.right , page.x), rect.left + offset.left);\n modifiedY = Math.max(Math.min(rect.bottom - offset.bottom, page.y), rect.top + offset.top );\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const elementRect = options && options.elementRect;\n\n if (options && options.enabled\n && !(phase === 'start' && elementRect && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n getRestrictionRect,\n};\n\nfunction getRestrictionRect (value, interaction, page) {\n if (utils.is.function(value)) {\n return utils.resolveRectLike(value, interaction.target, interaction.element, [page.x, page.y, interaction]);\n } else {\n return utils.resolveRectLike(value, interaction.target, interaction.element);\n }\n}\n\nmodifiers.restrict = restrict;\nmodifiers.names.push('restrict');\n\ndefaultOptions.perAction.restrict = restrict.defaults;\n\nmodule.exports = restrict;\n","// This module adds the options.resize.restrictEdges setting which sets min and\n// max for the top, left, bottom and right edges of the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictEdges: {\n// inner: { top: 200, left: 200, right: 400, bottom: 400 },\n// outer: { top: 0, left: 0, right: 600, bottom: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst { getRestrictionRect } = require('./restrict');\n\nconst noInner = { top: +Infinity, left: +Infinity, bottom: -Infinity, right: -Infinity };\nconst noOuter = { top: -Infinity, left: -Infinity, bottom: +Infinity, right: +Infinity };\n\nconst restrictEdges = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n offset: null,\n },\n\n setOffset: function ({ interaction, startOffset, options }) {\n if (!options) {\n return utils.extend({}, startOffset);\n }\n\n const offset = getRestrictionRect(options.offset, interaction, interaction.startCoords.page);\n\n if (offset) {\n return {\n top: startOffset.top + offset.y,\n left: startOffset.left + offset.x,\n bottom: startOffset.bottom + offset.y,\n right: startOffset.right + offset.x,\n };\n }\n\n return startOffset;\n },\n\n set: function ({ pageCoords, interaction, status, offset, options }) {\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n const inner = rectUtils.xywhToTlbr(getRestrictionRect(options.inner, interaction, page)) || noInner;\n const outer = rectUtils.xywhToTlbr(getRestrictionRect(options.outer, interaction, page)) || noOuter;\n\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n if (edges.top) {\n modifiedY = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top);\n }\n else if (edges.bottom) {\n modifiedY = Math.max(Math.min(outer.bottom - offset.bottom, page.y), inner.bottom - offset.bottom);\n }\n if (edges.left) {\n modifiedX = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left);\n }\n else if (edges.right) {\n modifiedX = Math.max(Math.min(outer.right - offset.right, page.x), inner.right - offset.right);\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n if (options && options.enabled\n && !(phase === 'start' && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n noInner,\n noOuter,\n getRestrictionRect,\n};\n\nmodifiers.restrictEdges = restrictEdges;\nmodifiers.names.push('restrictEdges');\n\ndefaultOptions.perAction.restrictEdges = restrictEdges.defaults;\nresize.defaults.restrictEdges = restrictEdges.defaults;\n\nmodule.exports = restrictEdges;\n","// This module adds the options.resize.restrictSize setting which sets min and\n// max width and height for the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictSize: {\n// min: { width: -600, height: -600 },\n// max: { width: 600, height: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst restrictEdges = require('./restrictEdges');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst noMin = { width: -Infinity, height: -Infinity };\nconst noMax = { width: +Infinity, height: +Infinity };\n\nconst restrictSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n },\n\n setOffset: function ({ interaction }) {\n return interaction.startOffset;\n },\n\n set: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const rect = rectUtils.xywhToTlbr(interaction.resizeRects.inverted);\n\n const minSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.min, interaction)) || noMin;\n const maxSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.max, interaction)) || noMax;\n\n arg.options = {\n enabled: options.enabled,\n endOnly: options.endOnly,\n inner: utils.extend({}, restrictEdges.noInner),\n outer: utils.extend({}, restrictEdges.noOuter),\n };\n\n if (edges.top) {\n arg.options.inner.top = rect.bottom - minSize.height;\n arg.options.outer.top = rect.bottom - maxSize.height;\n }\n else if (edges.bottom) {\n arg.options.inner.bottom = rect.top + minSize.height;\n arg.options.outer.bottom = rect.top + maxSize.height;\n }\n if (edges.left) {\n arg.options.inner.left = rect.right - minSize.width;\n arg.options.outer.left = rect.right - maxSize.width;\n }\n else if (edges.right) {\n arg.options.inner.right = rect.left + minSize.width;\n arg.options.outer.right = rect.left + maxSize.width;\n }\n\n restrictEdges.set(arg);\n },\n\n modifyCoords: restrictEdges.modifyCoords,\n};\n\nmodifiers.restrictSize = restrictSize;\nmodifiers.names.push('restrictSize');\n\ndefaultOptions.perAction.restrictSize = restrictSize.defaults;\nresize.defaults.restrictSize = restrictSize.defaults;\n\nmodule.exports = restrictSize;\n","const modifiers = require('./index');\nconst interact = require('../interact');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst snap = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n\n relativePoints: null,\n },\n\n setOffset: function ({ interaction, interactable, element, rect, startOffset, options }) {\n const offsets = [];\n const optionsOrigin = utils.rectToXY(utils.resolveRectLike(options.origin));\n const origin = optionsOrigin || utils.getOriginXY(interactable, element, interaction.prepared.name);\n options = options || interactable.options[interaction.prepared.name].snap || {};\n\n let snapOffset;\n\n if (options.offset === 'startCoords') {\n snapOffset = {\n x: interaction.startCoords.page.x - origin.x,\n y: interaction.startCoords.page.y - origin.y,\n };\n }\n else {\n const offsetRect = utils.resolveRectLike(options.offset, interactable, element, [interaction]);\n\n snapOffset = utils.rectToXY(offsetRect) || { x: 0, y: 0 };\n }\n\n if (rect && options.relativePoints && options.relativePoints.length) {\n for (const { x: relativeX, y: relativeY } of options.relativePoints) {\n offsets.push({\n x: startOffset.left - (rect.width * relativeX) + snapOffset.x,\n y: startOffset.top - (rect.height * relativeY) + snapOffset.y,\n });\n }\n }\n else {\n offsets.push(snapOffset);\n }\n\n return offsets;\n },\n\n set: function ({ interaction, pageCoords, status, options, offset: offsets }) {\n const targets = [];\n let target;\n let page;\n let i;\n\n if (status.useStatusXY) {\n page = { x: status.x, y: status.y };\n }\n else {\n const origin = utils.getOriginXY(interaction.target, interaction.element, interaction.prepared.name);\n\n page = utils.extend({}, pageCoords);\n\n page.x -= origin.x;\n page.y -= origin.y;\n }\n\n status.realX = page.x;\n status.realY = page.y;\n\n let len = options.targets? options.targets.length : 0;\n\n for (const { x: offsetX, y: offsetY } of offsets) {\n const relativeX = page.x - offsetX;\n const relativeY = page.y - offsetY;\n\n for (const snapTarget of options.targets) {\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n targets.push({\n x: utils.is.number(target.x) ? (target.x + offsetX) : relativeX,\n y: utils.is.number(target.y) ? (target.y + offsetY) : relativeY,\n\n range: utils.is.number(target.range)? target.range: options.range,\n });\n }\n }\n\n const closest = {\n target: null,\n inRange: false,\n distance: 0,\n range: 0,\n dx: 0,\n dy: 0,\n };\n\n for (i = 0, len = targets.length; i < len; i++) {\n target = targets[i];\n\n const range = target.range;\n const dx = target.x - page.x;\n const dy = target.y - page.y;\n const distance = utils.hypot(dx, dy);\n let inRange = distance <= range;\n\n // Infinite targets count as being out of range\n // compared to non infinite ones that are in range\n if (range === Infinity && closest.inRange && closest.range !== Infinity) {\n inRange = false;\n }\n\n if (!closest.target || (inRange\n // is the closest target in range?\n ? (closest.inRange && range !== Infinity\n // the pointer is relatively deeper in this target\n ? distance / range < closest.distance / closest.range\n // this target has Infinite range and the closest doesn't\n : (range === Infinity && closest.range !== Infinity)\n // OR this target is closer that the previous closest\n || distance < closest.distance)\n // The other is not in range and the pointer is closer to this target\n : (!closest.inRange && distance < closest.distance))) {\n\n closest.target = target;\n closest.distance = distance;\n closest.range = range;\n closest.inRange = inRange;\n closest.dx = dx;\n closest.dy = dy;\n\n status.range = range;\n }\n }\n\n let snapChanged;\n\n if (closest.target) {\n snapChanged = (status.modifiedX !== closest.target.x || status.modifiedY !== closest.target.y);\n\n status.modifiedX = closest.target.x;\n status.modifiedY = closest.target.y;\n }\n else {\n snapChanged = true;\n\n status.modifiedX = NaN;\n status.modifiedY = NaN;\n }\n\n status.dx = closest.dx;\n status.dy = closest.dy;\n\n status.changed = (snapChanged || (closest.inRange && !status.locked));\n status.locked = closest.inRange;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const relativePoints = options && options.relativePoints;\n\n if (options && options.enabled\n && !(phase === 'start' && relativePoints && relativePoints.length)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n }\n\n return {\n range : status.range,\n locked : status.locked,\n x : status.modifiedX,\n y : status.modifiedY,\n realX : status.realX,\n realY : status.realY,\n dx : status.dx,\n dy : status.dy,\n };\n }\n },\n};\n\ninteract.createSnapGrid = function (grid) {\n return function (x, y) {\n const limits = grid.limits || {\n left : -Infinity,\n right : Infinity,\n top : -Infinity,\n bottom: Infinity,\n };\n let offsetX = 0;\n let offsetY = 0;\n\n if (utils.is.object(grid.offset)) {\n offsetX = grid.offset.x;\n offsetY = grid.offset.y;\n }\n\n const gridx = Math.round((x - offsetX) / grid.x);\n const gridy = Math.round((y - offsetY) / grid.y);\n\n const newX = Math.max(limits.left, Math.min(limits.right , gridx * grid.x + offsetX));\n const newY = Math.max(limits.top , Math.min(limits.bottom, gridy * grid.y + offsetY));\n\n return {\n x: newX,\n y: newY,\n range: grid.range,\n };\n };\n};\n\nmodifiers.snap = snap;\nmodifiers.names.push('snap');\n\ndefaultOptions.perAction.snap = snap.defaults;\n\nmodule.exports = snap;\n","// This module allows snapping of the size of targets during resize\n// interactions.\n\nconst modifiers = require('./index');\nconst snap = require('./snap');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\nconst utils = require('../utils/');\n\nconst snapSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n },\n\n setOffset: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.edges;\n\n if (!edges) { return; }\n\n arg.options = {\n relativePoints: [{\n x: edges.left? 0 : 1,\n y: edges.top ? 0 : 1,\n }],\n origin: { x: 0, y: 0 },\n offset: 'self',\n range: options.range,\n };\n\n const offsets = snap.setOffset(arg);\n arg.options = options;\n\n return offsets;\n },\n\n set: function (arg) {\n const { interaction, options, offset, pageCoords } = arg;\n const page = utils.extend({}, pageCoords);\n const relativeX = page.x - offset[0].x;\n const relativeY = page.y - offset[0].y;\n\n arg.options = utils.extend({}, options);\n arg.options.targets = [];\n\n for (const snapTarget of options.targets) {\n let target;\n\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n if ('width' in target && 'height' in target) {\n target.x = target.width;\n target.y = target.height;\n }\n\n arg.options.targets.push(target);\n }\n\n snap.set(arg);\n },\n\n modifyCoords: function (arg) {\n const { options } = arg;\n\n arg.options = utils.extend({}, options);\n arg.options.enabled = options.enabled;\n arg.options.relativePoints = [null];\n\n snap.modifyCoords(arg);\n },\n};\n\nmodifiers.snapSize = snapSize;\nmodifiers.names.push('snapSize');\n\ndefaultOptions.perAction.snapSize = snapSize.defaults;\nresize.defaults.snapSize = snapSize.defaults;\n\nmodule.exports = snapSize;\n","const pointerUtils = require('../utils/pointerUtils');\n\nmodule.exports = class PointerEvent {\n constructor (type, pointer, event, eventTarget, interaction) {\n pointerUtils.pointerExtend(this, event);\n\n if (event !== pointer) {\n pointerUtils.pointerExtend(this, pointer);\n }\n\n this.interaction = interaction;\n\n this.timeStamp = new Date().getTime();\n this.originalEvent = event;\n this.type = type;\n this.pointerId = pointerUtils.getPointerId(pointer);\n this.pointerType = pointerUtils.getPointerType(pointer, interaction);\n this.target = eventTarget;\n this.currentTarget = null;\n\n if (type === 'tap') {\n const pointerIndex = interaction.getPointerIndex(pointer);\n this.dt = this.timeStamp - interaction.downTimes[pointerIndex];\n\n const interval = this.timeStamp - interaction.tapTime;\n\n this.double = !!(interaction.prevTap\n && interaction.prevTap.type !== 'doubletap'\n && interaction.prevTap.target === this.target\n && interval < 500);\n }\n else if (type === 'doubletap') {\n this.dt = pointer.timeStamp - interaction.tapTime;\n }\n }\n\n subtractOrigin ({ x: originX, y: originY }) {\n this.pageX -= originX;\n this.pageY -= originY;\n this.clientX -= originX;\n this.clientY -= originY;\n\n return this;\n }\n\n addOrigin ({ x: originX, y: originY }) {\n this.pageX += originX;\n this.pageY += originY;\n this.clientX += originX;\n this.clientY += originY;\n\n return this;\n }\n\n preventDefault () {\n this.originalEvent.preventDefault();\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n};\n","const PointerEvent = require('./PointerEvent');\nconst Interaction = require('../Interaction');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst defaults = require('../defaultOptions');\nconst signals = require('../utils/Signals').new();\nconst { filter } = require('../utils/arr');\n\nconst simpleSignals = [ 'down', 'up', 'cancel' ];\nconst simpleEvents = [ 'down', 'up', 'cancel' ];\n\nconst pointerEvents = {\n PointerEvent,\n fire,\n collectEventTargets,\n signals,\n defaults: {\n holdDuration: 600,\n ignoreFrom : null,\n allowFrom : null,\n origin : { x: 0, y: 0 },\n },\n types: [\n 'down',\n 'move',\n 'up',\n 'cancel',\n 'tap',\n 'doubletap',\n 'hold',\n ],\n};\n\nfunction fire (arg) {\n const {\n interaction, pointer, event, eventTarget,\n type = arg.pointerEvent.type,\n targets = collectEventTargets(arg),\n pointerEvent = new PointerEvent(type, pointer, event, eventTarget, interaction),\n } = arg;\n\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n targets,\n type,\n pointerEvent,\n };\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n\n for (const prop in target.props || {}) {\n pointerEvent[prop] = target.props[prop];\n }\n\n const origin = utils.getOriginXY(target.eventable, target.element);\n\n pointerEvent.subtractOrigin(origin);\n pointerEvent.eventable = target.eventable;\n pointerEvent.currentTarget = target.element;\n\n target.eventable.fire(pointerEvent);\n\n pointerEvent.addOrigin(origin);\n\n if (pointerEvent.immediatePropagationStopped\n || (pointerEvent.propagationStopped\n && (i + 1) < targets.length && targets[i + 1].element !== pointerEvent.currentTarget)) {\n break;\n }\n }\n\n signals.fire('fired', signalArg);\n\n if (type === 'tap') {\n // if pointerEvent should make a double tap, create and fire a doubletap\n // PointerEvent and use that as the prevTap\n const prevTap = pointerEvent.double\n ? fire({\n interaction, pointer, event, eventTarget,\n type: 'doubletap',\n })\n : pointerEvent;\n\n interaction.prevTap = prevTap;\n interaction.tapTime = prevTap.timeStamp;\n }\n\n return pointerEvent;\n}\n\nfunction collectEventTargets ({ interaction, pointer, event, eventTarget, type }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n // do not fire a tap event if the pointer was moved before being lifted\n if (type === 'tap' && (interaction.pointerWasMoved\n // or if the pointerup target is different to the pointerdown target\n || !(interaction.downTargets[pointerIndex] && interaction.downTargets[pointerIndex] === eventTarget))) {\n return [];\n }\n\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n path,\n targets: [],\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (type === 'hold') {\n signalArg.targets = filter(signalArg.targets, target =>\n target.eventable.options.holdDuration === interaction.holdTimers[pointerIndex].duration);\n }\n\n return signalArg.targets;\n}\n\nInteraction.signals.on('update-pointer-down', function ({ interaction, pointerIndex }) {\n interaction.holdTimers[pointerIndex] = { duration: Infinity, timeout: null };\n});\n\nInteraction.signals.on('remove-pointer', function ({ interaction, pointerIndex }) {\n interaction.holdTimers.splice(pointerIndex, 1);\n});\n\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget, duplicateMove }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n if (!duplicateMove && (!interaction.pointerIsDown || interaction.pointerWasMoved)) {\n if (interaction.pointerIsDown) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n\n fire({\n interaction, pointer, event, eventTarget,\n type: 'move',\n });\n }\n});\n\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget, pointerIndex }) {\n // copy event to be used in timeout for IE8\n const eventCopy = browser.isIE8? utils.extend({}, event) : event;\n\n const timer = interaction.holdTimers[pointerIndex];\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'hold',\n targets: [],\n path,\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (!signalArg.targets.length) { return; }\n\n let minDuration = Infinity;\n\n for (let i = 0; i < signalArg.targets.length; i++) {\n const target = signalArg.targets[i];\n const holdDuration = target.eventable.options.holdDuration;\n\n if (holdDuration < minDuration) {\n minDuration = holdDuration;\n }\n }\n\n timer.duration = minDuration;\n timer.timeout = setTimeout(function () {\n fire({\n interaction, eventCopy, eventTarget,\n pointer: browser.isIE8? eventCopy : pointer,\n type: 'hold',\n });\n }, minDuration);\n});\n\nInteraction.signals.on('up', ({ interaction, pointer, event, eventTarget }) => {\n if (!interaction.pointerWasMoved) {\n fire({ interaction, eventTarget, pointer, event, type: 'tap' });\n }\n});\n\n['up', 'cancel'].forEach(function (signalName) {\n Interaction.signals.on(signalName, function ({ interaction, pointerIndex }) {\n if (interaction.holdTimers[pointerIndex]) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n });\n});\n\nfunction createSignalListener (type) {\n return function ({ interaction, pointer, event, eventTarget }) {\n fire({ interaction, eventTarget, pointer, event, type });\n };\n}\n\nfor (let i = 0; i < simpleSignals.length; i++) {\n Interaction.signals.on(simpleSignals[i], createSignalListener(simpleEvents[i]));\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.prevTap = null; // the most recent tap event on this interaction\n interaction.tapTime = 0; // time of the most recent tap event\n interaction.holdTimers = []; // [{ duration, timeout }]\n});\n\ndefaults.pointerEvents = pointerEvents.defaults;\nmodule.exports = pointerEvents;\n","const pointerEvents = require('./base');\nconst Interaction = require('../Interaction');\n\npointerEvents.signals.on('new', onNew);\npointerEvents.signals.on('fired', onFired);\n\nfor (const signal of ['move', 'up', 'cancel', 'endall']) {\n Interaction.signals.on(signal, endHoldRepeat);\n}\n\nfunction onNew ({ pointerEvent }) {\n if (pointerEvent.type !== 'hold') { return; }\n\n pointerEvent.count = (pointerEvent.count || 0) + 1;\n}\n\nfunction onFired ({ interaction, pointerEvent, eventTarget, targets }) {\n if (pointerEvent.type !== 'hold' || !targets.length) { return; }\n\n // get the repeat interval from the first eventable\n const interval = targets[0].eventable.options.holdRepeatInterval;\n\n // don't repeat if the interval is 0 or less\n if (interval <= 0) { return; }\n\n // set a timeout to fire the holdrepeat event\n interaction.holdIntervalHandle = setTimeout(function () {\n pointerEvents.fire({\n interaction,\n eventTarget,\n type: 'hold',\n pointer: pointerEvent,\n event: pointerEvent,\n });\n }, interval);\n}\n\nfunction endHoldRepeat ({ interaction }) {\n // set the interaction's holdStopTime property\n // to stop further holdRepeat events\n if (interaction.holdIntervalHandle) {\n clearInterval(interaction.holdIntervalHandle);\n interaction.holdIntervalHandle = null;\n }\n}\n\n// don't repeat by default\npointerEvents.defaults.holdRepeatInterval = 0;\npointerEvents.types.push('holdrepeat');\n\nmodule.exports = {\n onNew,\n onFired,\n endHoldRepeat,\n};\n","const pointerEvents = require('./base');\nconst Interactable = require('../Interactable');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\nconst scope = require('../scope');\nconst extend = require('../utils/extend');\nconst { merge } = require('../utils/arr');\n\npointerEvents.signals.on('collect-targets', function ({ targets, element, type, eventTarget }) {\n function collectSelectors (interactable, selector, context) {\n const els = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && is.element(element)\n && domUtils.matchesSelector(element, selector, els)\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n const interactable = scope.interactables.get(element);\n\n if (interactable) {\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n scope.interactables.forEachSelector(collectSelectors, element);\n});\n\nInteractable.signals.on('new', function ({ interactable }) {\n interactable.events.getRect = function (element) {\n return interactable.getRect(element);\n };\n});\n\nInteractable.signals.on('set', function ({ interactable, options }) {\n extend(interactable.events.options, pointerEvents.defaults);\n extend(interactable.events.options, options);\n});\n\nmerge(Interactable.eventTypes, pointerEvents.types);\n\nInteractable.prototype.pointerEvents = function (options) {\n extend(this.events.options, options);\n\n return this;\n};\n\nconst __backCompatOption = Interactable.prototype._backCompatOption;\n\nInteractable.prototype._backCompatOption = function (optionName, newValue) {\n const ret = __backCompatOption.call(this, optionName, newValue);\n\n if (ret === this) {\n this.events.options[optionName] = newValue;\n }\n\n return ret;\n};\n\nInteractable.settingsMethods.push('pointerEvents');\n","const utils = require('./utils');\nconst events = require('./utils/events');\nconst signals = require('./utils/Signals').new();\n\nconst scope = {\n signals,\n events,\n utils,\n\n // main document\n document: require('./utils/domObjects').document,\n // all documents being listened to\n documents: [],\n\n addDocument: function (doc, win) {\n // do nothing if document is already known\n if (utils.contains(scope.documents, doc)) { return false; }\n\n win = win || scope.getWindow(doc);\n\n scope.documents.push(doc);\n events.documents.push(doc);\n\n // don't add an unload event for the main document\n // so that the page may be cached in browser history\n if (doc !== scope.document) {\n events.add(win, 'unload', scope.onWindowUnload);\n }\n\n signals.fire('add-document', { doc, win });\n },\n\n removeDocument: function (doc, win) {\n const index = utils.indexOf(scope.documents, doc);\n\n win = win || scope.getWindow(doc);\n\n events.remove(win, 'unload', scope.onWindowUnload);\n\n scope.documents.splice(index, 1);\n events.documents.splice(index, 1);\n\n signals.fire('remove-document', { win, doc });\n },\n\n onWindowUnload: function () {\n scope.removeDocument(this.document, this);\n },\n};\n\nmodule.exports = scope;\n","const { indexOf } = require('./arr');\n\nclass Signals {\n constructor () {\n this.listeners = {\n // signalName: [listeners],\n };\n }\n\n on (name, listener) {\n if (!this.listeners[name]) {\n this.listeners[name] = [listener];\n return;\n }\n\n this.listeners[name].push(listener);\n }\n\n off (name, listener) {\n if (!this.listeners[name]) { return; }\n\n const index = indexOf(this.listeners[name], listener);\n\n if (index !== -1) {\n this.listeners[name].splice(index, 1);\n }\n }\n\n fire (name, arg) {\n const targetListeners = this.listeners[name];\n\n if (!targetListeners) { return; }\n\n for (let i = 0; i < targetListeners.length; i++) {\n if (targetListeners[i](arg, name) === false) {\n return;\n }\n }\n }\n}\n\nSignals.new = function () {\n return new Signals();\n};\n\nmodule.exports = Signals;\n","function indexOf (array, target) {\n for (let i = 0, len = array.length; i < len; i++) {\n if (array[i] === target) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction contains (array, target) {\n return indexOf(array, target) !== -1;\n}\n\nfunction merge (target, source) {\n for (let i = 0; i < source.length; i++) {\n target.push(source[i]);\n }\n\n return target;\n}\n\nfunction filter (array, test) {\n const result = [];\n\n for (let i = 0; i < array.length; i++) {\n if (test(array[i])) {\n result.push(array[i]);\n }\n }\n\n return result;\n}\n\nmodule.exports = {\n indexOf,\n contains,\n merge,\n filter,\n};\n","const { window } = require('./window');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst Element = domObjects.Element;\nconst navigator = window.navigator;\n\nconst browser = {\n // Does the browser support touch input?\n supportsTouch: !!(('ontouchstart' in window) || is.function(window.DocumentTouch)\n && domObjects.document instanceof window.DocumentTouch),\n\n // Does the browser support PointerEvents\n supportsPointerEvent: !!domObjects.PointerEvent,\n\n isIE8: ('attachEvent' in window) && !('addEventListener' in window),\n\n // Opera Mobile must be handled differently\n isOperaMobile: (navigator.appName === 'Opera'\n && browser.supportsTouch\n && navigator.userAgent.match('Presto')),\n\n // scrolling doesn't change the result of getClientRects on iOS 7\n isIOS7: (/iP(hone|od|ad)/.test(navigator.platform)\n && /OS 7[^\\d]/.test(navigator.appVersion)),\n\n isIe9OrOlder: /MSIE (8|9)/.test(navigator.userAgent),\n\n // prefix matchesSelector\n prefixedMatchesSelector: 'matches' in Element.prototype\n ? 'matches': 'webkitMatchesSelector' in Element.prototype\n ? 'webkitMatchesSelector': 'mozMatchesSelector' in Element.prototype\n ? 'mozMatchesSelector': 'oMatchesSelector' in Element.prototype\n ? 'oMatchesSelector': 'msMatchesSelector',\n\n useMatchesSelectorPolyfill: false,\n\n pEventTypes: (domObjects.PointerEvent\n ? (domObjects.PointerEvent === window.MSPointerEvent\n ? {\n up: 'MSPointerUp',\n down: 'MSPointerDown',\n over: 'mouseover',\n out: 'mouseout',\n move: 'MSPointerMove',\n cancel: 'MSPointerCancel',\n }\n : {\n up: 'pointerup',\n down: 'pointerdown',\n over: 'pointerover',\n out: 'pointerout',\n move: 'pointermove',\n cancel: 'pointercancel',\n })\n : null),\n\n // because Webkit and Opera still use 'mousewheel' event type\n wheelEvent: 'onmousewheel' in domObjects.document? 'mousewheel': 'wheel',\n\n};\n\nbrowser.useMatchesSelectorPolyfill = !is.function(Element.prototype[browser.prefixedMatchesSelector]);\n\nmodule.exports = browser;\n","const domObjects = {};\nconst win = require('./window').window;\n\nfunction blank () {}\n\ndomObjects.document = win.document;\ndomObjects.DocumentFragment = win.DocumentFragment || blank;\ndomObjects.SVGElement = win.SVGElement || blank;\ndomObjects.SVGSVGElement = win.SVGSVGElement || blank;\ndomObjects.SVGElementInstance = win.SVGElementInstance || blank;\ndomObjects.Element = win.Element || blank;\ndomObjects.HTMLElement = win.HTMLElement || domObjects.Element;\n\ndomObjects.Event = win.Event;\ndomObjects.Touch = win.Touch || blank;\ndomObjects.PointerEvent = (win.PointerEvent || win.MSPointerEvent);\n\nmodule.exports = domObjects;\n","const win = require('./window');\nconst browser = require('./browser');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst domUtils = {\n nodeContains: function (parent, child) {\n while (child) {\n if (child === parent) {\n return true;\n }\n\n child = child.parentNode;\n }\n\n return false;\n },\n\n closest: function (element, selector) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) { return element; }\n\n element = domUtils.parentNode(element);\n }\n\n return null;\n },\n\n parentNode: function (node) {\n let parent = node.parentNode;\n\n if (is.docFrag(parent)) {\n // skip past #shado-root fragments\n while ((parent = parent.host) && is.docFrag(parent)) {\n continue;\n }\n\n return parent;\n }\n\n return parent;\n },\n\n // taken from http://tanalin.com/en/blog/2012/12/matches-selector-ie8/ and modified\n matchesSelectorPolyfill: browser.useMatchesSelectorPolyfill\n ? function (element, selector, elems) {\n elems = elems || element.parentNode.querySelectorAll(selector);\n\n for (let i = 0, len = elems.length; i < len; i++) {\n if (elems[i] === element) {\n return true;\n }\n }\n\n return false;\n }\n : null,\n\n matchesSelector: function (element, selector, nodeList) {\n if (browser.useMatchesSelectorPolyfill) {\n return domUtils.matchesSelectorPolyfill(element, selector, nodeList);\n }\n\n // remove /deep/ from selectors if shadowDOM polyfill is used\n if (win.window !== win.realWindow) {\n selector = selector.replace(/\\/deep\\//g, ' ');\n }\n\n return element[browser.prefixedMatchesSelector](selector);\n },\n\n // Test for the element that's \"above\" all other qualifiers\n indexOfDeepestElement: function (elements) {\n let deepestZoneParents = [];\n let dropzoneParents = [];\n let dropzone;\n let deepestZone = elements[0];\n let index = deepestZone? 0: -1;\n let parent;\n let child;\n let i;\n let n;\n\n for (i = 1; i < elements.length; i++) {\n dropzone = elements[i];\n\n // an element might belong to multiple selector dropzones\n if (!dropzone || dropzone === deepestZone) {\n continue;\n }\n\n if (!deepestZone) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n // check if the deepest or current are document.documentElement or document.rootElement\n // - if the current dropzone is, do nothing and continue\n if (dropzone.parentNode === dropzone.ownerDocument) {\n continue;\n }\n // - if deepest is, update with the current dropzone and continue to next\n else if (deepestZone.parentNode === dropzone.ownerDocument) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n if (!deepestZoneParents.length) {\n parent = deepestZone;\n while (parent.parentNode && parent.parentNode !== parent.ownerDocument) {\n deepestZoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n }\n\n // if this element is an svg element and the current deepest is\n // an HTMLElement\n if (deepestZone instanceof domObjects.HTMLElement\n && dropzone instanceof domObjects.SVGElement\n && !(dropzone instanceof domObjects.SVGSVGElement)) {\n\n if (dropzone === deepestZone.parentNode) {\n continue;\n }\n\n parent = dropzone.ownerSVGElement;\n }\n else {\n parent = dropzone;\n }\n\n dropzoneParents = [];\n\n while (parent.parentNode !== parent.ownerDocument) {\n dropzoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n\n n = 0;\n\n // get (position of last common ancestor) + 1\n while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) {\n n++;\n }\n\n const parents = [\n dropzoneParents[n - 1],\n dropzoneParents[n],\n deepestZoneParents[n],\n ];\n\n child = parents[0].lastChild;\n\n while (child) {\n if (child === parents[1]) {\n deepestZone = dropzone;\n index = i;\n deepestZoneParents = [];\n\n break;\n }\n else if (child === parents[2]) {\n break;\n }\n\n child = child.previousSibling;\n }\n }\n\n return index;\n },\n\n matchesUpTo: function (element, selector, limit) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) {\n return true;\n }\n\n element = domUtils.parentNode(element);\n\n if (element === limit) {\n return domUtils.matchesSelector(element, selector);\n }\n }\n\n return false;\n },\n\n getActualElement: function (element) {\n return (element instanceof domObjects.SVGElementInstance\n ? element.correspondingUseElement\n : element);\n },\n\n getScrollXY: function (relevantWindow) {\n relevantWindow = relevantWindow || win.window;\n return {\n x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft,\n y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop,\n };\n },\n\n getElementClientRect: function (element) {\n const clientRect = (element instanceof domObjects.SVGElement\n ? element.getBoundingClientRect()\n : element.getClientRects()[0]);\n\n return clientRect && {\n left : clientRect.left,\n right : clientRect.right,\n top : clientRect.top,\n bottom: clientRect.bottom,\n width : clientRect.width || clientRect.right - clientRect.left,\n height: clientRect.height || clientRect.bottom - clientRect.top,\n };\n },\n\n getElementRect: function (element) {\n const clientRect = domUtils.getElementClientRect(element);\n\n if (!browser.isIOS7 && clientRect) {\n const scroll = domUtils.getScrollXY(win.getWindow(element));\n\n clientRect.left += scroll.x;\n clientRect.right += scroll.x;\n clientRect.top += scroll.y;\n clientRect.bottom += scroll.y;\n }\n\n return clientRect;\n },\n\n getPath: function (element) {\n const path = [];\n\n while (element) {\n path.push(element);\n element = domUtils.parentNode(element);\n }\n\n return path;\n },\n\n trySelector: value => {\n if (!is.string(value)) { return false; }\n\n // an exception will be raised if it is invalid\n domObjects.document.querySelector(value);\n return true;\n },\n};\n\nmodule.exports = domUtils;\n","const is = require('./is');\nconst domUtils = require('./domUtils');\nconst pExtend = require('./pointerExtend');\n\nconst { window, getWindow } = require('./window');\nconst { indexOf, contains } = require('./arr');\n\nconst useAttachEvent = ('attachEvent' in window) && !('addEventListener' in window);\nconst addEvent = useAttachEvent? 'attachEvent': 'addEventListener';\nconst removeEvent = useAttachEvent? 'detachEvent': 'removeEventListener';\nconst on = useAttachEvent? 'on': '';\n\nconst elements = [];\nconst targets = [];\nconst attachedListeners = [];\n\n// {\n// type: {\n// selectors: ['selector', ...],\n// contexts : [document, ...],\n// listeners: [[listener, capture, passive], ...]\n// }\n// }\nconst delegatedEvents = {};\n\nconst documents = [];\n\nconst supportsOptions = !useAttachEvent && (() => {\n let supported = false;\n\n window.document.createElement('div').addEventListener('test', null, {\n get capture () { supported = true; },\n });\n\n return supported;\n})();\n\nfunction add (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n let elementIndex = indexOf(elements, element);\n let target = targets[elementIndex];\n\n if (!target) {\n target = {\n events: {},\n typeCount: 0,\n };\n\n elementIndex = elements.push(element) - 1;\n targets.push(target);\n\n attachedListeners.push(useAttachEvent\n ? {\n supplied: [],\n wrapped : [],\n useCount: [],\n }\n : null);\n }\n\n if (!target.events[type]) {\n target.events[type] = [];\n target.typeCount++;\n }\n\n if (!contains(target.events[type], listener)) {\n let ret;\n\n if (useAttachEvent) {\n const { supplied, wrapped, useCount } = attachedListeners[elementIndex];\n const listenerIndex = indexOf(supplied, listener);\n\n const wrappedListener = wrapped[listenerIndex] || function (event) {\n if (!event.immediatePropagationStopped) {\n event.target = event.srcElement;\n event.currentTarget = element;\n\n event.preventDefault = event.preventDefault || preventDef;\n event.stopPropagation = event.stopPropagation || stopProp;\n event.stopImmediatePropagation = event.stopImmediatePropagation || stopImmProp;\n\n if (/mouse|click/.test(event.type)) {\n event.pageX = event.clientX + getWindow(element).document.documentElement.scrollLeft;\n event.pageY = event.clientY + getWindow(element).document.documentElement.scrollTop;\n }\n\n listener(event);\n }\n };\n\n ret = element[addEvent](on + type, wrappedListener, !!options.capture);\n\n if (listenerIndex === -1) {\n supplied.push(listener);\n wrapped.push(wrappedListener);\n useCount.push(1);\n }\n else {\n useCount[listenerIndex]++;\n }\n }\n else {\n ret = element[addEvent](type, listener, supportsOptions? options : !!options.capture);\n }\n target.events[type].push(listener);\n\n return ret;\n }\n}\n\nfunction remove (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const elementIndex = indexOf(elements, element);\n const target = targets[elementIndex];\n\n if (!target || !target.events) {\n return;\n }\n\n let wrappedListener = listener;\n let listeners;\n let listenerIndex;\n\n if (useAttachEvent) {\n listeners = attachedListeners[elementIndex];\n listenerIndex = indexOf(listeners.supplied, listener);\n wrappedListener = listeners.wrapped[listenerIndex];\n }\n\n if (type === 'all') {\n for (type in target.events) {\n if (target.events.hasOwnProperty(type)) {\n remove(element, type, 'all');\n }\n }\n return;\n }\n\n if (target.events[type]) {\n const len = target.events[type].length;\n\n if (listener === 'all') {\n for (let i = 0; i < len; i++) {\n remove(element, type, target.events[type][i], options);\n }\n return;\n }\n else {\n for (let i = 0; i < len; i++) {\n if (target.events[type][i] === listener) {\n element[removeEvent](on + type, wrappedListener, supportsOptions? options : !!options.capture);\n target.events[type].splice(i, 1);\n\n if (useAttachEvent && listeners) {\n listeners.useCount[listenerIndex]--;\n if (listeners.useCount[listenerIndex] === 0) {\n listeners.supplied.splice(listenerIndex, 1);\n listeners.wrapped.splice(listenerIndex, 1);\n listeners.useCount.splice(listenerIndex, 1);\n }\n }\n\n break;\n }\n }\n }\n\n if (target.events[type] && target.events[type].length === 0) {\n target.events[type] = null;\n target.typeCount--;\n }\n }\n\n if (!target.typeCount) {\n targets.splice(elementIndex, 1);\n elements.splice(elementIndex, 1);\n attachedListeners.splice(elementIndex, 1);\n }\n}\n\nfunction addDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n if (!delegatedEvents[type]) {\n delegatedEvents[type] = {\n selectors: [],\n contexts : [],\n listeners: [],\n };\n\n // add delegate listener functions\n for (let i = 0; i < documents.length; i++) {\n add(documents[i], type, delegateListener);\n add(documents[i], type, delegateUseCapture, true);\n }\n }\n\n const delegated = delegatedEvents[type];\n let index;\n\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n break;\n }\n }\n\n if (index === -1) {\n index = delegated.selectors.length;\n\n delegated.selectors.push(selector);\n delegated.contexts .push(context);\n delegated.listeners.push([]);\n }\n\n // keep listener and capture and passive flags\n delegated.listeners[index].push([listener, !!options.capture, options.passive]);\n}\n\nfunction removeDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const delegated = delegatedEvents[type];\n let matchFound = false;\n let index;\n\n if (!delegated) { return; }\n\n // count from last index of delegated to 0\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n // look for matching selector and context Node\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n\n const listeners = delegated.listeners[index];\n\n // each item of the listeners array is an array: [function, capture, passive]\n for (let i = listeners.length - 1; i >= 0; i--) {\n const [fn, capture, passive] = listeners[i];\n\n // check if the listener functions and capture and passive flags match\n if (fn === listener && capture === !!options.capture && passive === options.passive) {\n // remove the listener from the array of listeners\n listeners.splice(i, 1);\n\n // if all listeners for this interactable have been removed\n // remove the interactable from the delegated arrays\n if (!listeners.length) {\n delegated.selectors.splice(index, 1);\n delegated.contexts .splice(index, 1);\n delegated.listeners.splice(index, 1);\n\n // remove delegate function from context\n remove(context, type, delegateListener);\n remove(context, type, delegateUseCapture, true);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegatedEvents[type] = null;\n }\n }\n\n // only remove one listener\n matchFound = true;\n break;\n }\n }\n\n if (matchFound) { break; }\n }\n }\n}\n\n// bound to the interactable context when a DOM event\n// listener is added to a selector interactable\nfunction delegateListener (event, optionalArg) {\n const options = getOptions(optionalArg);\n const fakeEvent = {};\n const delegated = delegatedEvents[event.type];\n const eventTarget = (domUtils.getActualElement(event.path\n ? event.path[0]\n : event.target));\n let element = eventTarget;\n\n // duplicate the event so that currentTarget can be changed\n pExtend(fakeEvent, event);\n\n fakeEvent.originalEvent = event;\n fakeEvent.preventDefault = preventOriginalDefault;\n\n // climb up document tree looking for selector matches\n while (is.element(element)) {\n for (let i = 0; i < delegated.selectors.length; i++) {\n const selector = delegated.selectors[i];\n const context = delegated.contexts[i];\n\n if (domUtils.matchesSelector(element, selector)\n && domUtils.nodeContains(context, eventTarget)\n && domUtils.nodeContains(context, element)) {\n\n const listeners = delegated.listeners[i];\n\n fakeEvent.currentTarget = element;\n\n for (let j = 0; j < listeners.length; j++) {\n const [fn, capture, passive] = listeners[j];\n\n if (capture === !!options.capture && passive === options.passive) {\n fn(fakeEvent);\n }\n }\n }\n }\n\n element = domUtils.parentNode(element);\n }\n}\n\nfunction delegateUseCapture (event) {\n return delegateListener.call(this, event, true);\n}\n\nfunction preventDef () {\n this.returnValue = false;\n}\n\nfunction preventOriginalDefault () {\n this.originalEvent.preventDefault();\n}\n\nfunction stopProp () {\n this.cancelBubble = true;\n}\n\nfunction stopImmProp () {\n this.cancelBubble = true;\n this.immediatePropagationStopped = true;\n}\n\nfunction getOptions (param) {\n return is.object(param)? param : { capture: param };\n}\n\nmodule.exports = {\n add,\n remove,\n\n addDelegate,\n removeDelegate,\n\n delegateListener,\n delegateUseCapture,\n delegatedEvents,\n documents,\n\n useAttachEvent,\n supportsOptions,\n\n _elements: elements,\n _targets: targets,\n _attachedListeners: attachedListeners,\n};\n","module.exports = function extend (dest, source) {\n for (const prop in source) {\n dest[prop] = source[prop];\n }\n return dest;\n};\n","const {\n resolveRectLike,\n rectToXY,\n} = require('./rect');\n\nmodule.exports = function (target, element, action) {\n const actionOptions = target.options[action];\n const actionOrigin = actionOptions && actionOptions.origin;\n const origin = actionOrigin || target.options.origin;\n\n const originRect = resolveRectLike(origin, target, element, [target && element]);\n\n return rectToXY(originRect) || { x: 0, y: 0 };\n};\n","module.exports = (x, y) => Math.sqrt(x * x + y * y);\n","const extend = require('./extend');\nconst win = require('./window');\n\nconst utils = {\n warnOnce: function (method, message) {\n let warned = false;\n\n return function () {\n if (!warned) {\n win.window.console.warn(message);\n warned = true;\n }\n\n return method.apply(this, arguments);\n };\n },\n\n // http://stackoverflow.com/a/5634528/2280888\n _getQBezierValue: function (t, p1, p2, p3) {\n const iT = 1 - t;\n return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3;\n },\n\n getQuadraticCurvePoint: function (startX, startY, cpX, cpY, endX, endY, position) {\n return {\n x: utils._getQBezierValue(position, startX, cpX, endX),\n y: utils._getQBezierValue(position, startY, cpY, endY),\n };\n },\n\n // http://gizma.com/easing/\n easeOutQuad: function (t, b, c, d) {\n t /= d;\n return -c * t*(t-2) + b;\n },\n\n copyAction: function (dest, src) {\n dest.name = src.name;\n dest.axis = src.axis;\n dest.edges = src.edges;\n\n return dest;\n },\n\n is : require('./is'),\n extend : extend,\n hypot : require('./hypot'),\n getOriginXY: require('./getOriginXY'),\n};\n\nextend(utils, require('./arr'));\nextend(utils, require('./domUtils'));\nextend(utils, require('./pointerUtils'));\nextend(utils, require('./rect'));\n\nmodule.exports = utils;\n","const scope = require('../scope');\nconst utils = require('./index');\nconst browser = require('./browser');\n\nconst finder = {\n methodOrder: [ 'simulationResume', 'mouse', 'hasPointer', 'idle' ],\n\n search: function (pointer, eventType, eventTarget) {\n const mouseEvent = (/mouse/i.test(pointer.pointerType || eventType)\n // MSPointerEvent.MSPOINTER_TYPE_MOUSE\n || pointer.pointerType === 4);\n const pointerId = utils.getPointerId(pointer);\n const details = { pointer, pointerId, mouseEvent, eventType, eventTarget };\n\n for (const method of finder.methodOrder) {\n const interaction = finder[method](details);\n\n if (interaction) {\n return interaction;\n }\n }\n },\n\n // try to resume simulation with a new pointer\n simulationResume: function ({ mouseEvent, eventType, eventTarget }) {\n if (!/down|start/i.test(eventType)) {\n return null;\n }\n\n for (const interaction of scope.interactions) {\n let element = eventTarget;\n\n if (interaction.simulation && interaction.simulation.allowResume\n && (interaction.mouse === mouseEvent)) {\n while (element) {\n // if the element is the interaction element\n if (element === interaction.element) {\n return interaction;\n }\n element = utils.parentNode(element);\n }\n }\n }\n\n return null;\n },\n\n // if it's a mouse interaction\n mouse: function ({ pointerId, mouseEvent, eventType }) {\n if (!mouseEvent && (browser.supportsTouch || browser.supportsPointerEvent)) {\n return null;\n }\n\n let firstNonActive;\n\n for (const interaction of scope.interactions) {\n if (interaction.mouse) {\n // if it's a down event, skip interactions with running simulations\n if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; }\n\n // if the interaction is active, return it immediately\n if (interaction.interacting()) {\n return interaction;\n }\n // otherwise save it and look for another active interaction\n else if (!firstNonActive) {\n firstNonActive = interaction;\n }\n }\n }\n\n // if no active mouse interaction was found use the first inactive mouse\n // interaction\n if (firstNonActive) {\n return firstNonActive;\n }\n\n // Find any interaction specifically for mouse.\n // ignore the interaction if the eventType is a mousedown, and a simulation\n // is active\n for (const interaction of scope.interactions) {\n if (interaction.mouse && !(/down/.test(eventType) && interaction.simulation)) {\n return interaction;\n }\n }\n\n return null;\n },\n\n // get interaction that has this pointer\n hasPointer: function ({ pointerId }) {\n for (const interaction of scope.interactions) {\n if (utils.contains(interaction.pointerIds, pointerId)) {\n return interaction;\n }\n }\n },\n\n // get first idle interaction\n idle: function ({ mouseEvent }) {\n for (const interaction of scope.interactions) {\n // if there's already a pointer held down\n if (interaction.pointerIds.length === 1) {\n const target = interaction.target;\n // don't add this pointer if there is a target interactable and it\n // isn't gesturable\n if (target && !target.options.gesture.enabled) {\n continue;\n }\n }\n // maximum of 2 pointers per interaction\n else if (interaction.pointerIds.length >= 2) {\n continue;\n }\n\n if (!interaction.interacting() && (mouseEvent === interaction.mouse)) {\n return interaction;\n }\n }\n\n return null;\n },\n};\n\nmodule.exports = finder;\n","const win = require('./window');\nconst isWindow = require('./isWindow');\n\nconst is = {\n array : () => {},\n\n window : thing => thing === win.window || isWindow(thing),\n\n docFrag : thing => is.object(thing) && thing.nodeType === 11,\n\n object : thing => !!thing && (typeof thing === 'object'),\n\n function: thing => typeof thing === 'function',\n\n number : thing => typeof thing === 'number' ,\n\n bool : thing => typeof thing === 'boolean' ,\n\n string : thing => typeof thing === 'string' ,\n\n element: thing => {\n if (!thing || (typeof thing !== 'object')) { return false; }\n\n const _window = win.getWindow(thing) || win.window;\n\n return (/object|function/.test(typeof _window.Element)\n ? thing instanceof _window.Element //DOM2\n : thing.nodeType === 1 && typeof thing.nodeName === 'string');\n },\n};\n\nis.array = thing => (is.object(thing)\n && (typeof thing.length !== 'undefined')\n && is.function(thing.splice));\n\nmodule.exports = is;\n","module.exports = (thing) => !!(thing && thing.Window) && (thing instanceof thing.Window);\n","function pointerExtend (dest, source) {\n for (const prop in source) {\n const prefixedPropREs = module.exports.prefixedPropREs;\n let deprecated = false;\n\n // skip deprecated prefixed properties\n for (const vendor in prefixedPropREs) {\n if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) {\n deprecated = true;\n break;\n }\n }\n\n if (!deprecated && typeof source[prop] !== 'function') {\n dest[prop] = source[prop];\n }\n }\n return dest;\n}\n\npointerExtend.prefixedPropREs = {\n webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/,\n};\n\nmodule.exports = pointerExtend;\n","const hypot = require('./hypot');\nconst browser = require('./browser');\nconst dom = require('./domObjects');\nconst domUtils = require('./domUtils');\nconst is = require('./is');\nconst pointerExtend = require('./pointerExtend');\n\nconst pointerUtils = {\n copyCoords: function (dest, src) {\n dest.page = dest.page || {};\n dest.page.x = src.page.x;\n dest.page.y = src.page.y;\n\n dest.client = dest.client || {};\n dest.client.x = src.client.x;\n dest.client.y = src.client.y;\n\n dest.timeStamp = src.timeStamp;\n },\n\n setCoordDeltas: function (targetObj, prev, cur) {\n targetObj.page.x = cur.page.x - prev.page.x;\n targetObj.page.y = cur.page.y - prev.page.y;\n targetObj.client.x = cur.client.x - prev.client.x;\n targetObj.client.y = cur.client.y - prev.client.y;\n targetObj.timeStamp = cur.timeStamp - prev.timeStamp;\n\n // set pointer velocity\n const dt = Math.max(targetObj.timeStamp / 1000, 0.001);\n\n targetObj.page.speed = hypot(targetObj.page.x, targetObj.page.y) / dt;\n targetObj.page.vx = targetObj.page.x / dt;\n targetObj.page.vy = targetObj.page.y / dt;\n\n targetObj.client.speed = hypot(targetObj.client.x, targetObj.page.y) / dt;\n targetObj.client.vx = targetObj.client.x / dt;\n targetObj.client.vy = targetObj.client.y / dt;\n },\n\n isNativePointer: function (pointer) {\n return (pointer instanceof dom.Event || pointer instanceof dom.Touch);\n },\n\n // Get specified X/Y coords for mouse or event.touches[0]\n getXY: function (type, pointer, xy) {\n xy = xy || {};\n type = type || 'page';\n\n xy.x = pointer[type + 'X'];\n xy.y = pointer[type + 'Y'];\n\n return xy;\n },\n\n getPageXY: function (pointer, page) {\n page = page || {};\n\n // Opera Mobile handles the viewport and scrolling oddly\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n pointerUtils.getXY('screen', pointer, page);\n\n page.x += window.scrollX;\n page.y += window.scrollY;\n }\n else {\n pointerUtils.getXY('page', pointer, page);\n }\n\n return page;\n },\n\n getClientXY: function (pointer, client) {\n client = client || {};\n\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n // Opera Mobile handles the viewport and scrolling oddly\n pointerUtils.getXY('screen', pointer, client);\n }\n else {\n pointerUtils.getXY('client', pointer, client);\n }\n\n return client;\n },\n\n getPointerId: function (pointer) {\n return is.number(pointer.pointerId)? pointer.pointerId : pointer.identifier;\n },\n\n setCoords: function (targetObj, pointers, timeStamp) {\n const pointer = (pointers.length > 1\n ? pointerUtils.pointerAverage(pointers)\n : pointers[0]);\n\n const tmpXY = {};\n\n pointerUtils.getPageXY(pointer, tmpXY);\n targetObj.page.x = tmpXY.x;\n targetObj.page.y = tmpXY.y;\n\n pointerUtils.getClientXY(pointer, tmpXY);\n targetObj.client.x = tmpXY.x;\n targetObj.client.y = tmpXY.y;\n\n targetObj.timeStamp = is.number(timeStamp) ? timeStamp :new Date().getTime();\n },\n\n pointerExtend: pointerExtend,\n\n getTouchPair: function (event) {\n const touches = [];\n\n // array of touches is supplied\n if (is.array(event)) {\n touches[0] = event[0];\n touches[1] = event[1];\n }\n // an event\n else {\n if (event.type === 'touchend') {\n if (event.touches.length === 1) {\n touches[0] = event.touches[0];\n touches[1] = event.changedTouches[0];\n }\n else if (event.touches.length === 0) {\n touches[0] = event.changedTouches[0];\n touches[1] = event.changedTouches[1];\n }\n }\n else {\n touches[0] = event.touches[0];\n touches[1] = event.touches[1];\n }\n }\n\n return touches;\n },\n\n pointerAverage: function (pointers) {\n const average = {\n pageX : 0,\n pageY : 0,\n clientX: 0,\n clientY: 0,\n screenX: 0,\n screenY: 0,\n };\n\n for (const pointer of pointers) {\n for (const prop in average) {\n average[prop] += pointer[prop];\n }\n }\n for (const prop in average) {\n average[prop] /= pointers.length;\n }\n\n return average;\n },\n\n touchBBox: function (event) {\n if (!event.length && !(event.touches && event.touches.length > 1)) {\n return;\n }\n\n const touches = pointerUtils.getTouchPair(event);\n const minX = Math.min(touches[0].pageX, touches[1].pageX);\n const minY = Math.min(touches[0].pageY, touches[1].pageY);\n const maxX = Math.max(touches[0].pageX, touches[1].pageX);\n const maxY = Math.max(touches[0].pageY, touches[1].pageY);\n\n return {\n x: minX,\n y: minY,\n left: minX,\n top: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n },\n\n touchDistance: function (event, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n\n\n const dx = touches[0][sourceX] - touches[1][sourceX];\n const dy = touches[0][sourceY] - touches[1][sourceY];\n\n return hypot(dx, dy);\n },\n\n touchAngle: function (event, prevAngle, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n const dx = touches[1][sourceX] - touches[0][sourceX];\n const dy = touches[1][sourceY] - touches[0][sourceY];\n const angle = 180 * Math.atan2(dy , dx) / Math.PI;\n\n return angle;\n },\n\n getPointerType: function (pointer, interaction) {\n // if the PointerEvent API isn't available, then the pointer must be ither\n // a MouseEvent or TouchEvent\n if (interaction.mouse) { return 'mouse'; }\n if (!browser.supportsPointerEvent) { return 'touch'; }\n\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : [undefined, undefined,'touch', 'pen', 'mouse'][pointer.pointerType];\n },\n\n // [ event.target, event.currentTarget ]\n getEventTargets: function (event) {\n return [\n domUtils.getActualElement(event.path ? event.path[0] : event.target),\n domUtils.getActualElement(event.currentTarget),\n ];\n },\n};\n\nmodule.exports = pointerUtils;\n","const { window } = require('./window');\n\nconst vendors = ['ms', 'moz', 'webkit', 'o'];\nlet lastTime = 0;\nlet request;\nlet cancel;\n\nfor (let x = 0; x < vendors.length && !window.requestAnimationFrame; x++) {\n request = window[vendors[x] + 'RequestAnimationFrame'];\n cancel = window[vendors[x] +'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n}\n\nif (!request) {\n request = function (callback) {\n const currTime = new Date().getTime();\n const timeToCall = Math.max(0, 16 - (currTime - lastTime));\n const id = setTimeout(function () { callback(currTime + timeToCall); },\n timeToCall);\n\n lastTime = currTime + timeToCall;\n return id;\n };\n}\n\nif (!cancel) {\n cancel = function (id) {\n clearTimeout(id);\n };\n}\n\nmodule.exports = {\n request,\n cancel,\n};\n","const extend = require('./extend');\nconst is = require('./is');\nconst {\n closest,\n parentNode,\n getElementRect,\n} = require('./domUtils');\n\nconst rectUtils = {\n getStringOptionResult: function (value, interactable, element) {\n if (!is.string(value)) {\n return null;\n }\n\n if (value === 'parent') {\n value = parentNode(element);\n }\n else if (value === 'self') {\n value = interactable.getRect(element);\n }\n else {\n value = closest(element, value);\n }\n\n return value;\n },\n\n resolveRectLike: function (value, interactable, element, functionArgs) {\n value = rectUtils.getStringOptionResult(value, interactable, element) || value;\n\n if (is.function(value)) {\n value = value.apply(null, functionArgs);\n }\n\n if (is.element(value)) {\n value = getElementRect(value);\n }\n\n return value;\n },\n\n rectToXY: function (rect) {\n return rect && {\n x: 'x' in rect ? rect.x : rect.left,\n y: 'y' in rect ? rect.y : rect.top,\n };\n },\n\n xywhToTlbr: function (rect) {\n if (rect && !('left' in rect && 'top' in rect)) {\n rect = extend({}, rect);\n\n rect.left = rect.x || 0;\n rect.top = rect.y || 0;\n rect.right = rect.right || (rect.left + rect.width);\n rect.bottom = rect.bottom || (rect.top + rect.height);\n }\n\n return rect;\n },\n\n tlbrToXywh: function (rect) {\n if (rect && !('x' in rect && 'y' in rect)) {\n rect = extend({}, rect);\n\n rect.x = rect.left || 0;\n rect.top = rect.top || 0;\n rect.width = rect.width || (rect.right - rect.x);\n rect.height = rect.height || (rect.bottom - rect.y);\n }\n\n return rect;\n },\n};\n\nmodule.exports = rectUtils;\n","const win = module.exports;\nconst isWindow = require('./isWindow');\n\nfunction init (window) {\n // get wrapped window if using Shadow DOM polyfill\n\n win.realWindow = window;\n\n // create a TextNode\n const el = window.document.createTextNode('');\n\n // check if it's wrapped by a polyfill\n if (el.ownerDocument !== window.document\n && typeof window.wrap === 'function'\n && window.wrap(el) === el) {\n // use wrapped window\n window = window.wrap(window);\n }\n\n win.window = window;\n}\n\nif (typeof window === 'undefined') {\n win.window = undefined;\n win.realWindow = undefined;\n}\nelse {\n init(window);\n}\n\nwin.getWindow = function getWindow (node) {\n if (isWindow(node)) {\n return node;\n }\n\n const rootNode = (node.ownerDocument || node);\n\n return rootNode.defaultView || rootNode.parentWindow || win.window;\n};\n\nwin.init = init;\n"]} \ No newline at end of file +{"version":3,"sources":["src/minHeader.js","src/header.js","index.js","src/Eventable.js","src/InteractEvent.js","src/Interactable.js","src/Interaction.js","src/actions/base.js","src/actions/drag.js","src/actions/drop.js","src/actions/gesture.js","src/actions/resize.js","src/autoScroll.js","src/autoStart/InteractableMethods.js","src/autoStart/base.js","src/autoStart/delay.js","src/autoStart/drag.js","src/autoStart/gesture.js","src/autoStart/resize.js","src/defaultOptions.js","src/index.js","src/inertia.js","src/interact.js","src/interactablePreventDefault.js","src/legacyBrowsers.js","src/modifiers/index.js","src/modifiers/restrict.js","src/modifiers/restrictEdges.js","src/modifiers/restrictSize.js","src/modifiers/snap.js","src/modifiers/snapSize.js","src/pointerEvents/PointerEvent.js","src/pointerEvents/base.js","src/pointerEvents/holdRepeat.js","src/pointerEvents/interactableTargets.js","src/scope.js","src/utils/Signals.js","src/utils/arr.js","src/utils/browser.js","src/utils/domObjects.js","src/utils/domUtils.js","src/utils/events.js","src/utils/extend.js","src/utils/getOriginXY.js","src/utils/hypot.js","src/utils/index.js","src/utils/interactionFinder.js","src/utils/is.js","src/utils/isWindow.js","src/utils/pointerExtend.js","src/utils/pointerUtils.js","src/utils/raf.js","src/utils/rect.js","src/utils/window.js"],"names":[],"mappings":";AAAA,CCMA,SAAA,GAAA,GAAA,gBAAA,UAAA,mBAAA,QAAA,OAAA,QAAA,QAAA,IAAA,kBAAA,SAAA,OAAA,IAAA,UAAA,OAAA,CAAA,GAAA,EAAA,GAAA,mBAAA,QAAA,OAAA,mBAAA,QAAA,OAAA,mBAAA,MAAA,KAAA,KAAA,EAAA,SAAA,MAAA,WAAA,MAAA,SAAA,GAAA,EAAA,EAAA,GAAA,QAAA,GAAA,EAAA,GAAA,IAAA,EAAA,GAAA,CAAA,IAAA,EAAA,GAAA,CAAA,GAAA,GAAA,kBAAA,UAAA,OAAA,KAAA,GAAA,EAAA,MAAA,GAAA,GAAA,EAAA,IAAA,EAAA,MAAA,GAAA,GAAA,EAAA,IAAA,GAAA,GAAA,OAAA,uBAAA,EAAA,IAAA,MAAA,GAAA,KAAA,mBAAA,EAAA,GAAA,GAAA,EAAA,IAAA,WAAA,GAAA,GAAA,GAAA,KAAA,EAAA,QAAA,SAAA,GAAA,GAAA,GAAA,EAAA,GAAA,GAAA,EAAA,OAAA,GAAA,GAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,GAAA,MAAA,GAAA,GAAA,QAAA,IAAA,GAAA,GAAA,kBAAA,UAAA,QAAA,EAAA,EAAA,EAAA,EAAA,OAAA,IAAA,EAAA,EAAA,GAAA,OAAA,KAAA,GAAA,SAAA,EAAA,EAAA,GACA,YCCsB,oBAAX,QACT,EAAO,QAAU,SAAU,GAGzB,MAFA,GAAQ,sBAAsB,KAAK,GAE5B,EAAQ,gBAIjB,EAAO,QAAU,EAAQ,0LCb3B,QAAS,GAA2B,EAAO,GACzC,IAAK,GAAI,GAAI,EAAG,EAAM,EAAU,OAAQ,EAAI,IAAQ,EAAM,4BAA6B,IACrF,EAAU,GAAG,SALG,EAAQ,eAApB,IAAA,QACF,EAAS,EAAQ,qBAQjB,aAEJ,QAAA,GAAa,GAAS,EAAA,KAAA,GACpB,KAAK,QAAU,KAAW,0BAG5B,cAAM,GACJ,GAAI,OAAA,GACE,EAAU,KAAO,EAAM,KACvB,EAAS,KAAK,QAGf,EAAY,KAAK,EAAM,QAC1B,EAA0B,EAAO,GAI/B,KAAK,IACP,KAAK,GAAS,IAIX,EAAM,oBAAsB,IAAW,EAAY,EAAO,EAAM,QACnE,EAA0B,EAAO,gBAIrC,YAAI,EAAW,GAET,KAAK,GACP,KAAK,GAAW,KAAK,GAGrB,KAAK,IAAc,gBAIvB,aAAK,EAAW,GAEd,GAAM,GAAY,KAAK,GACjB,EAAY,EAAW,EAAQ,EAAW,IAAa,GAE9C,IAAX,GACF,EAAU,OAAO,EAAO,IAGtB,GAAkC,IAArB,EAAU,SAAiB,KAC1C,KAAK,GAAa,QAKxB,GAAO,QAAU,4KC7DjB,GAAM,GAAc,EAAQ,kBACtB,EAAc,EAAQ,uBACtB,EAAc,EAAQ,oBACtB,EAAc,EAAQ,mBAAmB,MAEzC,aACJ,QAAA,GAAa,EAAa,EAAO,EAAQ,EAAO,EAAS,GAAyB,GAAhB,GAAgB,UAAA,OAAA,OAAA,KAAA,UAAA,IAAA,UAAA,EAAA,GAAA,KAAA,EAChF,IAAM,GAAc,EAAY,OAC1B,GAAe,GAAU,EAAO,SAAW,GAAU,YACrD,EAAc,EAAY,EAAQ,EAAS,GAC3C,EAAwB,UAAV,EACd,EAAwB,QAAV,EACd,EAAc,EAAU,EAAY,YAAc,EAAY,UAC9D,EAAc,EAAY,SAEhC,GAAU,GAAW,EAAY,OAEjC,IAAM,GAAS,KAAW,EAAO,MAC3B,EAAS,KAAW,EAAO,OAEjC,GAAK,GAAK,EAAO,EACjB,EAAK,GAAK,EAAO,EAEjB,EAAO,GAAK,EAAO,EACnB,EAAO,GAAK,EAAO,EAEnB,KAAK,QAAgB,EAAM,QAC3B,KAAK,OAAgB,EAAM,OAC3B,KAAK,SAAgB,EAAM,SAC3B,KAAK,QAAgB,EAAM,QAC3B,KAAK,OAAgB,EAAM,OAC3B,KAAK,QAAgB,EAAM,QAC3B,KAAK,OAAgB,EACrB,KAAK,cAAgB,EACrB,KAAK,cAAgB,GAAW,KAChC,KAAK,OAAgB,EACrB,KAAK,KAAgB,GAAU,GAAS,IACxC,KAAK,YAAgB,EACrB,KAAK,aAAgB,EAErB,KAAK,GAAK,EAAW,EAAY,UAAU,EAAY,UAAU,OAAS,GACrD,EAAU,EAE/B,IAAM,IACJ,YAAA,EACA,MAAA,EACA,OAAA,EACA,MAAA,EACA,QAAA,EACA,QAAA,EACA,KAAA,EACA,OAAA,EACA,OAAA,EACA,SAAA,EACA,OAAA,EACA,YAAA,EACA,OAAQ,KAGV,GAAQ,KAAK,SAAU,GAEnB,GAEF,KAAK,MAAQ,EAAU,MACvB,KAAK,MAAQ,EAAU,MACvB,KAAK,QAAU,EAAU,QACzB,KAAK,QAAU,EAAU,UAGzB,KAAK,MAAY,EAAK,EACtB,KAAK,MAAY,EAAK,EACtB,KAAK,QAAY,EAAO,EACxB,KAAK,QAAY,EAAO,GAG1B,KAAK,GAAY,EAAY,YAAY,KAAK,EAAI,EAAO,EACzD,KAAK,GAAY,EAAY,YAAY,KAAK,EAAI,EAAO,EACzD,KAAK,SAAY,EAAY,YAAY,OAAO,EAAI,EAAO,EAC3D,KAAK,SAAY,EAAY,YAAY,OAAO,EAAI,EAAO,EAE3D,EAAQ,KAAK,YAAa,GAE1B,KAAK,UAAY,EAAO,UACxB,KAAK,GAAY,EAAY,aAAa,UAC1C,KAAK,SAAY,KAAK,UAAY,KAAK,GAGvC,KAAK,MAAQ,EAAY,aAAa,GAAa,MACnD,KAAK,UAAY,EAAY,aAAa,GAAa,GACvD,KAAK,UAAY,EAAY,aAAa,GAAa,GAEvD,KAAK,MAAS,GAAoB,iBAAV,EAA2B,KAAK,WAAa,KAErE,EAAQ,KAAK,MAAO,sBAGtB,oBACE,GAAM,GAAc,KAAK,WAEzB,IAAI,EAAY,UAAU,MAAQ,KAC3B,KAAK,UAAY,EAAY,UAAU,UAAY,IACxD,MAAO,KAGT,IAAI,GAAQ,IAAM,KAAK,MAAM,EAAY,UAAU,UAAW,EAAY,UAAU,WAAa,KAAK,EAGlG,GAAQ,IACV,GAAS,IAGX,IAAM,GAAO,OAAiB,GAAS,EAAQ,MACzC,EAAO,OAAiB,GAAS,EAAQ,MAEzC,GAAS,IAAS,OAAiB,GAAS,EAAS,KAG3D,QACE,GAAA,EACA,MAJa,GAAU,MAAgB,GAAS,EAAQ,MAKxD,KAAA,EACA,MAAA,EACA,MAAA,EACA,MAAO,EAAY,UAAU,MAC7B,UACE,EAAG,EAAY,UAAU,UACzB,EAAG,EAAY,UAAU,yBAK/B,wCAEA,oCACE,KAAK,4BAA8B,KAAK,oBAAqB,eAG/D,2BACE,KAAK,oBAAqB,OAI9B,GAAQ,GAAG,YAAa,SAAA,GAA0D,GAA9C,GAA8C,EAA9C,OAAQ,EAAsC,EAAtC,YAAa,EAAyB,EAAzB,SAAU,EAAe,EAAf,YAC3D,EAAY,EAAU,EAAS,EAAY,SAE7B,YAAhB,GACF,EAAO,GAAK,EAAO,QAAU,EAAU,QACvC,EAAO,GAAK,EAAO,QAAU,EAAU,UAGvC,EAAO,GAAK,EAAO,MAAQ,EAAU,MACrC,EAAO,GAAK,EAAO,MAAQ,EAAU,SAIzC,EAAc,QAAU,EAExB,EAAO,QAAU,4NC7JjB,GAAM,GAAY,EAAQ,cACpB,EAAY,EAAQ,kBACpB,EAAY,EAAQ,kBACpB,EAAY,EAAQ,kBACpB,EAAY,EAAQ,WACpB,EAAY,EAAQ,eACpB,EAAY,EAAQ,oBACpB,EAAY,EAAQ,mBAAmB,QAMf,EAAQ,oBAHpC,IAAA,eACA,IAAA,aACA,IAAA,cAE4B,EAAQ,kBAA9B,IAAA,YACsB,EAAQ,eAA9B,IAAA,QAAS,IAAA,WACa,EAAQ,mBAA9B,IAAA,UAGR,GAAM,oBAQA,cACJ,QAAA,GAAa,EAAQ,GAAS,EAAA,KAAA,GAC5B,EAAU,MAEV,KAAK,OAAW,EAChB,KAAK,OAAW,GAAI,GACpB,KAAK,SAAW,EAAQ,SAAW,EAAM,SACzC,KAAK,KAAW,EAAU,EAAY,GAAS,KAAK,SAAW,GAC/D,KAAK,KAAW,KAAK,KAAK,SAE1B,EAAQ,KAAK,OACX,OAAA,EACA,QAAA,EACA,aAAc,KACd,IAAK,KAAK,OAGZ,EAAM,YAAa,KAAK,KAAM,KAAK,MAEnC,EAAM,cAAc,KAAK,MAEzB,KAAK,IAAI,sBAGX,qBAAa,EAAQ,GACnB,GAAM,GAAW,KAAO,CAOxB,OALI,GAAG,SAAS,EAAO,WAAmB,KAAK,OAAO,EAAW,SAAmB,EAAO,SACvF,EAAG,SAAS,EAAO,UAAmB,KAAK,OAAO,EAAW,QAAmB,EAAO,QACvF,EAAG,SAAS,EAAO,SAAmB,KAAK,OAAO,EAAW,OAAmB,EAAO,OACvF,EAAG,SAAS,EAAO,kBAAmB,KAAK,OAAO,EAAW,gBAAmB,EAAO,gBAEpF,kBAGT,sBAAc,EAAQ,GAEpB,IAAK,GAAM,KAAU,GAEf,IAAU,GAAS,KAEjB,EAAG,OAAO,EAAQ,KAEpB,KAAK,QAAQ,GAAQ,GAAU,EAAO,KAAK,QAAQ,GAAQ,OAAe,EAAQ,IAE9E,EAAG,OAAO,EAAS,UAAU,KAAY,WAAa,GAAS,UAAU,KAC3E,KAAK,QAAQ,GAAQ,GAAQ,SAAsC,IAA5B,EAAQ,GAAQ,UAGlD,EAAG,KAAK,EAAQ,KAAY,EAAG,OAAO,EAAS,UAAU,IAChE,KAAK,QAAQ,GAAQ,GAAQ,QAAU,EAAQ,OAEpB,KAApB,EAAQ,KAEf,KAAK,QAAQ,GAAQ,GAAU,EAAQ,kBAwB/C,iBAAS,GAOP,MANA,GAAU,GAAW,KAAK,OAEtB,EAAG,OAAO,KAAK,UAAa,EAAG,QAAQ,KACzC,EAAU,KAAK,SAAS,cAAc,KAAK,SAGtC,EAAe,gBAaxB,qBAAa,GACX,MAAI,GAAG,SAAS,IACd,KAAK,QAAU,EAER,MAGO,OAAZ,SACK,MAAK,QAAQ,QAEb,MAGF,KAAK,qBAGd,2BAAmB,EAAY,GAC7B,GAAI,EAAY,IAAa,EAAG,OAAO,GAAW,CAChD,KAAK,QAAQ,GAAc,CAE3B,KAAA,GAAA,GAAqB,EAAQ,MAA7B,EAAA,MAAA,QAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,OAAA,cAAoC,CAAA,GAAA,EAAA,IAAA,EAAA,CAAA,GAAA,GAAA,EAAA,OAAA,KAAA,GAAA,EAAA,SAAA,CAAA,GAAA,EAAA,EAAA,OAAA,EAAA,KAAA,KAAA,GAAA,EAAA,MAAA,GAAzB,GAAyB,CAClC,MAAK,QAAQ,GAAQ,GAAc,EAGrC,MAAO,MAGT,MAAO,MAAK,QAAQ,gBAgBtB,gBAAQ,GACN,MAAO,MAAK,kBAAkB,SAAU,gBAa1C,qBAAa,GACX,MAAiB,SAAb,GAAoC,WAAb,GACzB,KAAK,QAAQ,YAAc,EAEpB,MAGF,KAAK,QAAQ,yBAYtB,mBACE,MAAO,MAAK,sBAGd,mBAAW,GACT,MAAQ,MAAK,WAAa,EAAQ,eACvB,EAAa,KAAK,SAAU,gBAazC,cAAM,GAGJ,MAFA,MAAK,OAAO,KAAK,GAEV,kBAGT,wBAAgB,EAAQ,EAAW,EAAU,GAK3C,GAJI,EAAG,OAAO,KAAyC,IAA3B,EAAU,OAAO,OAC3C,EAAY,EAAU,OAAO,MAAM,OAGjC,EAAG,MAAM,GAAY,CACvB,IAAK,GAAI,GAAI,EAAG,EAAI,EAAU,OAAQ,IACpC,KAAK,GAAQ,EAAU,GAAI,EAAU,EAGvC,QAAO,EAGT,GAAI,EAAG,OAAO,GAAY,CACxB,IAAK,GAAM,KAAQ,GACjB,KAAK,GAAQ,EAAM,EAAU,GAAO,EAGtC,QAAO,gBAeX,YAAI,EAAW,EAAU,GACvB,MAAI,MAAK,eAAe,KAAM,EAAW,EAAU,GAC1C,MAGS,UAAd,IAAyB,EAAY,GAErC,EAAS,EAAa,WAAY,GACpC,KAAK,OAAO,GAAG,EAAW,GAGnB,EAAG,OAAO,KAAK,QACtB,EAAO,YAAY,KAAK,OAAQ,KAAK,SAAU,EAAW,EAAU,GAGpE,EAAO,IAAI,KAAK,OAAQ,EAAW,EAAU,GAGxC,mBAcT,aAAK,EAAW,EAAU,GACxB,MAAI,MAAK,eAAe,MAAO,EAAW,EAAU,GAC3C,MAGS,UAAd,IAAyB,EAAY,GAGrC,EAAS,EAAa,WAAY,GACpC,KAAK,OAAO,IAAI,EAAW,GAGpB,EAAG,OAAO,KAAK,QACtB,EAAO,eAAe,KAAK,OAAQ,KAAK,SAAU,EAAW,EAAU,GAIvE,EAAO,OAAO,KAAK,OAAQ,EAAW,EAAU,GAG3C,mBAWT,aAAK,GACE,EAAG,OAAO,KACb,MAGF,KAAK,QAAU,KAAW,EAAS,KAEnC,IAAM,GAAa,KAAW,EAAS,UAEvC,KAAK,GAAM,KAAc,GAAQ,WAAY,CAC3C,GAAM,GAAa,EAAQ,WAAW,EAEtC,MAAK,QAAQ,GAAc,KAAW,EAAS,IAE/C,KAAK,aAAa,EAAY,GAE9B,KAAK,GAAY,EAAQ,IAG3B,IAAA,GAAA,GAAsB,EAAa,gBAAnC,EAAA,MAAA,QAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,OAAA,cAAoD,CAAA,GAAA,EAAA,IAAA,EAAA,CAAA,GAAA,GAAA,EAAA,OAAA,KAAA,GAAA,EAAA,SAAA,CAAA,GAAA,EAAA,EAAA,OAAA,EAAA,KAAA,KAAA,GAAA,EAAA,MAAA,GAAzC,GAAyC,CAClD,MAAK,QAAQ,GAAW,EAAS,KAAK,GAElC,IAAW,IACb,KAAK,GAAS,EAAQ,IAS1B,MALA,GAAQ,KAAK,OACX,QAAA,EACA,aAAc,OAGT,kBAYT,iBAGE,GAFA,EAAO,OAAO,KAAK,OAAQ,OAEvB,EAAG,OAAO,KAAK,QAEjB,IAAK,GAAM,KAAQ,GAAO,gBAAiB,CACzC,GAAM,GAAY,EAAO,gBAAgB,EAErC,GAAU,UAAU,KAAO,KAAK,QAC7B,EAAU,SAAS,KAAO,KAAK,WAEpC,EAAU,UAAU,OAAO,EAAG,GAC9B,EAAU,SAAU,OAAO,EAAG,GAC9B,EAAU,UAAU,OAAO,EAAG,GAGzB,EAAU,UAAU,SACvB,EAAU,GAAQ,OAItB,EAAO,OAAO,KAAK,SAAU,EAAM,EAAO,kBAC1C,EAAO,OAAO,KAAK,SAAU,EAAM,EAAO,oBAAoB,OAIhE,GAAO,OAAO,KAAM,MAGtB,GAAQ,KAAK,SAAW,aAAc,OAEtC,EAAM,cAAc,OAAO,EAAQ,EAAM,cAAe,MAAO,EAG/D,KAAA,GAAA,GAA0B,EAAM,iBAAhC,EAAA,MAAA,QAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,OAAA,cAAoD,CAAA,GAAA,EAAA,IAAA,EAAA,CAAA,GAAA,GAAA,EAAA,OAAA,KAAA,GAAA,EAAA,SAAA,CAAA,GAAA,EAAA,EAAA,OAAA,EAAA,KAAA,KAAA,GAAA,EAAA,MAAA,GAAzC,GAAyC,CAC9C,GAAY,SAAW,MAAQ,EAAY,eAC7C,EAAY,OAIhB,MAAO,GAAM,cAIjB,GAAM,cAAc,eAAiB,SAAyB,EAAQ,GACpE,EAAU,GAAW,EAAM,QAE3B,KAAK,GAAI,GAAI,EAAG,EAAI,KAAK,OAAQ,IAAK,CACpC,GAAM,GAAe,KAAK,EAE1B,IAAI,EAAa,SAAW,GAAU,EAAa,WAAa,EAC9D,MAAO,GAGX,OAAQ,GAGV,EAAM,cAAc,IAAM,SAA0B,EAAS,EAAS,GACpE,GAAM,GAAM,KAAK,KAAK,eAAe,EAAS,GAAW,EAAQ,SAEjE,OAAO,KAAQ,EAAG,OAAO,IAAY,GAAsB,EAAI,UAAU,IAAW,EAAM,MAG5F,EAAM,cAAc,gBAAkB,SAAU,EAAU,GACxD,IAAK,GAAI,GAAI,EAAG,EAAI,KAAK,OAAQ,IAAK,CACpC,GAAM,GAAe,KAAK,EAG1B,IAAK,EAAG,OAAO,EAAa,WACpB,GAAY,EAAa,UAAU,IAD3C,CAKA,GAAM,GAAM,EAAS,EAAc,EAAa,OAAQ,EAAa,SAAU,EAAG,KAElF,QAAY,KAAR,EACF,MAAO,MAMb,EAAa,WAAa,EAAM,cAEhC,EAAa,QAAU,EAEvB,EAAa,iBAAoB,cAAe,SAAU,iBAAkB,eAE5E,EAAO,QAAU,uWC1EjB,QAAS,GAAkB,GACzB,MAAQ,UAAU,GAChB,GAAM,GAAc,EAAM,eAAe,GADlB,EAEe,EAAM,gBAAgB,GAArD,EAFgB,EAAA,GAEH,EAFG,EAAA,GAGjB,IAEN,IAAI,EAAQ,eAAiB,QAAQ,KAAK,EAAM,MAAO,CACrD,GAAgB,GAAI,OAAO,SAE3B,KAAK,GAAI,GAAI,EAAG,EAAI,EAAM,eAAe,OAAQ,IAAK,CACpD,GAAM,GAAU,EAAM,eAAe,GAC/B,EAAc,EAAO,OAAO,EAAS,EAAM,KAAM,EAEvD,GAAQ,MAAM,EAAS,GAAe,GAAI,IAAc,YAAA,WAGvD,CACH,GAAI,IAAiB,CAErB,KAAK,EAAQ,sBAAwB,QAAQ,KAAK,EAAM,MAAO,CAE7D,IAAK,GAAI,GAAI,EAAG,EAAI,EAAM,aAAa,SAAW,EAAgB,IAChE,EAAuD,UAAtC,EAAM,aAAa,GAAG,aAA2B,EAAM,aAAa,GAAG,aAK1F,GAAiB,IACX,GAAI,OAAO,UAAY,EAAgB,KAEpB,IAApB,EAAM,UAGb,IAAK,EAAgB,CACnB,GAAI,GAAc,EAAO,OAAO,EAAO,EAAM,KAAM,EAE9C,KACH,EAAc,GAAI,IAAc,YAAA,KAGlC,EAAQ,MAAM,EAAO,KAIzB,IAAA,GAAA,GAAqC,EAArC,EAAA,MAAA,QAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,OAAA,cAA8C,CAAA,GAAA,EAAA,IAAA,EAAA,CAAA,GAAA,GAAA,EAAA,OAAA,KAAA,GAAA,EAAA,SAAA,CAAA,GAAA,EAAA,EAAA,OAAA,EAAA,KAAA,KAAA,GAAA,EAAA,MAAA,GAAA,GAAA,EAAlC,EAAkC,EAAA,GAAzB,EAAyB,EAAA,EAC5C,GAAY,oBAAoB,EAAa,GAC7C,EAAY,GAAQ,EAAS,EAAO,EAAa,KAKvD,QAAS,GAAQ,GACf,IAAK,GAAI,GAAI,EAAG,EAAI,EAAM,aAAa,OAAQ,IAAK,CAClD,GAAM,GAAc,EAAM,aAAa,EAEvC,GAAY,IAAI,GAChB,EAAQ,KAAK,UAAY,MAAA,EAAO,YAAA,KA0BpC,QAAS,GAAT,EAA+B,GAAY,GAAnB,GAAmB,EAAnB,IAChB,EAA4C,IAA9B,EAAW,QAAQ,OACnC,EAAO,IAAM,EAAO,MAGxB,KAAK,GAAM,KAAa,GAAM,gBAC5B,EAAY,EAAK,EAAW,EAAO,kBACnC,EAAY,EAAK,EAAW,EAAO,oBAAoB,EAGzD,KAAK,GAAM,KAAa,GACtB,EAAY,EAAK,EAAW,EAAU,IAzd1C,GAAM,GAAa,EAAQ,WACrB,EAAa,EAAQ,WACrB,EAAa,EAAQ,kBACrB,EAAa,EAAQ,mBACrB,EAAa,EAAQ,sBACrB,EAAa,EAAQ,6BACrB,EAAa,EAAQ,mBAAmB,MAExC,KACA,GACJ,cAAe,cAAe,YAC9B,gBAAiB,iBAIf,EAAgB,CAGpB,GAAM,eAoWN,KAAK,GAlWC,cACJ,QAAA,GAAA,GAA8B,GAAf,GAAe,EAAf,WAAe,GAAA,KAAA,GAC5B,KAAK,OAAgB,KACrB,KAAK,QAAgB,KAErB,KAAK,UACH,KAAO,KACP,KAAO,KACP,MAAO,MAIT,KAAK,YACL,KAAK,cACL,KAAK,eACL,KAAK,aAGL,KAAK,YACH,MAAa,EAAG,EAAG,EAAG,GACtB,QAAa,EAAG,EAAG,EAAG,GACtB,UAAW,GAGb,KAAK,WACH,MAAa,EAAG,EAAG,EAAG,GACtB,QAAa,EAAG,EAAG,EAAG,GACtB,UAAW,GAIb,KAAK,aACH,MAAa,EAAG,EAAG,EAAG,GACtB,QAAa,EAAG,EAAG,EAAG,GACtB,UAAW,GAIb,KAAK,cACH,MAAa,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,GAAI,EAAG,MAAO,GAC9C,QAAa,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,GAAI,EAAG,MAAO,GAC9C,UAAW,GAGb,KAAK,UAAc,KACnB,KAAK,eAEL,KAAK,aAAkB,KACvB,KAAK,gBAAkB,KAEvB,KAAK,UAAY,KAEjB,KAAK,eAAkB,EACvB,KAAK,iBAAkB,EACvB,KAAK,cAAkB,EAEvB,KAAK,YAAc,EAEnB,EAAQ,KAAK,MAAO,MAEpB,EAAM,aAAa,KAAK,yBAG1B,qBAAa,EAAS,EAAO,GAC3B,GAAM,GAAe,KAAK,cAAc,EAAS,GAAO,EAExD,GAAQ,KAAK,QACX,QAAA,EACA,MAAA,EACA,YAAA,EACA,aAAA,EACA,YAAa,oBAoCjB,eAAO,EAAQ,EAAQ,GACjB,KAAK,gBACD,KAAK,eACN,KAAK,WAAW,QAA0B,YAAhB,EAAO,KAAoB,EAAI,MAMf,IAA7C,EAAM,QAAQ,EAAM,aAAc,OACpC,EAAM,aAAa,KAAK,MAG1B,EAAM,WAAW,KAAK,SAAU,GAChC,KAAK,OAAiB,EACtB,KAAK,QAAiB,EAEtB,EAAQ,KAAK,gBACX,YAAa,KACb,MAAO,KAAK,0BAIhB,qBAAa,EAAS,EAAO,GACtB,KAAK,aACR,KAAK,cAAc,GACnB,EAAM,UAAU,KAAK,UAAW,KAAK,UAGvC,IAAM,GAAiB,KAAK,UAAU,KAAK,IAAM,KAAK,WAAW,KAAK,GAC5C,KAAK,UAAU,KAAK,IAAM,KAAK,WAAW,KAAK,GAC/C,KAAK,UAAU,OAAO,IAAM,KAAK,WAAW,OAAO,GACnD,KAAK,UAAU,OAAO,IAAM,KAAK,WAAW,OAAO,EAEzE,MAAA,GACA,MAAA,EAGA,MAAK,gBAAkB,KAAK,kBAC9B,EAAK,KAAK,UAAU,OAAO,EAAI,KAAK,YAAY,OAAO,EACvD,EAAK,KAAK,UAAU,OAAO,EAAI,KAAK,YAAY,OAAO,EAEvD,KAAK,gBAAkB,EAAM,MAAM,EAAI,GAAM,EAAY,qBAG3D,IAAM,IACJ,QAAA,EACA,aAAc,KAAK,gBAAgB,GACnC,MAAA,EACA,YAAA,EACA,GAAA,EACA,GAAA,EACA,UAAW,EACX,YAAa,KACb,sBAAuB,KAAK,cAGzB,IAEH,EAAM,eAAe,KAAK,aAAc,KAAK,WAAY,KAAK,WAGhE,EAAQ,KAAK,OAAQ,GAEhB,IAEC,KAAK,eACP,KAAK,OAAO,GAGV,KAAK,iBACP,EAAM,WAAW,KAAK,WAAY,KAAK,yBAyB7C,gBAAQ,GACN,EAAY,EAAM,QAChB,QAAS,KAAK,SAAS,GACvB,MAAO,KAAK,UACZ,YAAa,KAAK,aAClB,YAAa,MACZ,OAEH,EAAQ,KAAK,qBAAsB,GAE9B,KAAK,eACR,EAAQ,KAAK,cAAe,GAG9B,KAAK,eAAgB,eAIvB,mBAAW,EAAS,EAAO,EAAa,GACtC,GAAM,GAAe,KAAK,gBAAgB,EAE1C,GAAQ,KAAK,WAAW,KAAK,EAAM,MAAO,SAAW,MACnD,QAAA,EACA,aAAA,EACA,MAAA,EACA,YAAA,EACA,eAAA,EACA,YAAa,OAGV,KAAK,YACR,KAAK,IAAI,GAGX,KAAK,eAAgB,EACrB,KAAK,cAAc,EAAS,gBAuB9B,aAAK,GACH,EAAQ,GAAS,KAAK,UAElB,KAAK,eACP,EAAQ,KAAK,cACX,MAAA,EACA,YAAa,OAIjB,KAAK,oBAGP,yBACE,MAAO,MAAK,aAAc,KAAK,SAAS,KAAM,kBAGhD,uBACE,MAAO,MAAK,0BAGd,gBACE,EAAQ,KAAK,QAAU,YAAa,OAEhC,KAAK,eACP,EAAQ,KAAK,eAAiB,YAAa,OAC3C,EAAQ,KAAK,QAAU,KAAK,SAAS,MAAQ,YAAa,QAG5D,KAAK,OAAS,KAAK,QAAU,KAE7B,KAAK,cAAe,EACpB,KAAK,SAAS,KAAO,KAAK,UAAY,kBAGxC,yBAAiB,GAEf,MAAyB,UAArB,KAAK,aAAgD,QAArB,KAAK,YAChC,EAGF,EAAM,QAAQ,KAAK,WAAY,EAAM,aAAa,iBAG3D,uBAAe,EAAS,GAA0D,GAAnD,GAAmD,UAAA,OAAA,OAAA,KAAA,UAAA,GAAA,UAAA,GAA5C,GAAS,iBAAiB,KAAK,EAAM,MACnE,EAAK,EAAM,aAAa,GAC1B,EAAQ,KAAK,gBAAgB,EAoBjC,QAlBe,IAAX,IACF,EAAQ,KAAK,WAAW,OACxB,KAAK,WAAW,GAAS,GAGvB,GACF,EAAQ,KAAK,uBACX,QAAA,EACA,MAAA,EACA,KAAA,EACA,UAAW,EACX,aAAc,EACd,YAAa,OAIjB,KAAK,SAAS,GAAS,EAEhB,eAGT,uBAAe,EAAS,GACtB,GAAM,GAAQ,KAAK,gBAAgB,IAEpB,IAAX,IAEJ,EAAQ,KAAK,kBACX,QAAA,EACA,MAAA,EACA,aAAc,EACd,YAAa,OAGf,KAAK,SAAY,OAAO,EAAO,GAC/B,KAAK,WAAY,OAAO,EAAO,GAC/B,KAAK,YAAY,OAAO,EAAO,GAC/B,KAAK,UAAY,OAAO,EAAO,iBAGjC,6BAAqB,EAAQ,GAC3B,KAAK,aAAkB,EACvB,KAAK,gBAAkB,QAIlB,EAAI,EAAG,EAAM,EAAY,OAAQ,EAAI,EAAK,IAAK,CACtD,GAAM,GAAS,EAAY,EAE3B,GAAU,GAAU,EAAiB,GA+DvC,GAAM,MACA,EAAc,EAAQ,WAExB,GAAW,cACb,EAAU,EAAY,MAAU,EAAU,YAC1C,EAAU,EAAY,MAAU,EAAU,YAC1C,EAAU,EAAY,IAAU,EAAU,UAC1C,EAAU,EAAY,QAAU,EAAU,YAG1C,EAAU,UAAc,EAAU,YAClC,EAAU,UAAc,EAAU,YAClC,EAAU,QAAc,EAAU,UAElC,EAAU,WAAc,EAAU,YAClC,EAAU,UAAc,EAAU,YAClC,EAAU,SAAc,EAAU,UAClC,EAAU,YAAc,EAAU,WAGpC,EAAU,KAAO,EAiBjB,EAAQ,GAAG,sBAAuB,SAAA,GAAiF,GAA9E,GAA8E,EAA9E,YAAa,EAAiE,EAAjE,QAAS,EAAwD,EAAxD,UAAW,EAA6C,EAA7C,aAAc,EAA+B,EAA/B,MAAO,EAAwB,EAAxB,YAAa,EAAW,EAAX,IACtG,GAAY,WAAW,GAAgB,EACvC,EAAY,SAAS,GAAgB,EAEjC,IACF,EAAY,eAAgB,GAGzB,EAAY,gBACf,EAAM,UAAU,EAAY,YAAa,EAAY,UAErD,EAAM,WAAW,EAAY,UAAY,EAAY,aACrD,EAAM,WAAW,EAAY,WAAY,EAAY,aAErD,EAAY,UAA4B,EACxC,EAAY,UAAU,GAAkB,EAAY,UAAU,UAC9D,EAAY,YAAY,GAAgB,GAAe,GAAS,EAAM,gBAAgB,GAAO,GAC7F,EAAY,iBAA4B,EAExC,EAAM,cAAc,EAAY,YAAa,MAIjD,EAAM,QAAQ,GAAG,eAAmB,GACpC,EAAM,QAAQ,GAAG,kBAAmB,GAEpC,EAAY,qBAAuB,EACnC,EAAY,iBAAmB,EAC/B,EAAY,OAAS,EACrB,EAAY,QAAU,EACtB,EAAY,UAAY,EAExB,EAAM,mBAAqB,EAE3B,EAAO,QAAU,oLCtejB,SAAS,GAAc,EAAa,EAAO,EAAO,GAChD,GAAM,GAAa,EAAY,SAAS,KAElC,EAAW,GAAI,GAAc,EAAa,EAAO,EAAY,EAAO,EAAY,QAAS,KAAM,EAErG,GAAY,OAAO,KAAK,GACxB,EAAY,UAAY,EA/B1B,GAAM,GAAgB,EAAQ,kBACxB,EAAgB,EAAQ,oBAExB,GACJ,aAAA,EACA,SACA,cAGF,GAAY,QAAQ,GAAG,eAAgB,SAAA,GAAkC,GAAtB,GAAsB,EAAtB,YAAa,EAAS,EAAT,KAC9D,GAAY,cAAe,EAC3B,EAAa,EAAa,EAAO,WAGnC,EAAY,QAAQ,GAAG,cAAe,SAAA,GAA0C,GAA9B,GAA8B,EAA9B,WAIhD,IAHA,EAAa,EADiE,EAAjB,MAC5B,OAD6C,EAAV,SAI/D,EAAY,cAAiB,OAAO,IAG3C,EAAY,QAAQ,GAAG,aAAc,SAAA,GACnC,EADqE,EAAtB,YAAsB,EAAT,MAC3B,SAYnC,EAAO,QAAU,6EClCjB,IAAM,GAAiB,EAAQ,UACzB,EAAiB,EAAQ,YACzB,EAAiB,EAAQ,oBACzB,EAAiB,EAAQ,mBACzB,EAAiB,EAAQ,kBACzB,EAAiB,EAAQ,qBAEzB,GACJ,UACE,SAAc,EACd,aAAc,KAEd,OAAY,KACZ,KAAY,KACZ,SAAY,KACZ,QAAY,KACZ,WAAY,KAEZ,UAAY,KACZ,SAAY,MAGd,QAAS,SAAU,EAAS,EAAO,GACjC,GAAM,GAAc,EAAa,QAAQ,IAEzC,OAAO,GAAY,SACb,KAAM,OAAQ,KAAgC,UAAzB,EAAY,SACV,EAAY,UACZ,EAAY,UACrC,MAGN,UAAW,WACT,MAAO,QAIX,GAAY,QAAQ,GAAG,qBAAsB,SAAA,GAA2B,GAAf,GAAe,EAAf,WACvD,IAAkC,SAA9B,EAAY,SAAS,KAAzB,CAEA,GAAM,GAAO,EAAY,SAAS,IAErB,OAAT,GACF,EAAY,UAAU,KAAK,EAAM,EAAY,YAAY,KAAK,EAC9D,EAAY,UAAU,OAAO,EAAI,EAAY,YAAY,OAAO,EAEhE,EAAY,aAAa,KAAK,MAAU,KAAK,IAAI,EAAY,aAAa,KAAK,IAC/E,EAAY,aAAa,OAAO,MAAQ,KAAK,IAAI,EAAY,aAAa,OAAO,IACjF,EAAY,aAAa,OAAO,GAAK,EACrC,EAAY,aAAa,KAAK,GAAO,GAErB,MAAT,IACP,EAAY,UAAU,KAAK,EAAM,EAAY,YAAY,KAAK,EAC9D,EAAY,UAAU,OAAO,EAAI,EAAY,YAAY,OAAO,EAEhE,EAAY,aAAa,KAAK,MAAU,KAAK,IAAI,EAAY,aAAa,KAAK,IAC/E,EAAY,aAAa,OAAO,MAAQ,KAAK,IAAI,EAAY,aAAa,OAAO,IACjF,EAAY,aAAa,OAAO,GAAK,EACrC,EAAY,aAAa,KAAK,GAAO,MAKzC,EAAc,QAAQ,GAAG,MAAO,SAAA,GAAmC,GAAvB,GAAuB,EAAvB,OAAQ,EAAe,EAAf,WAClD,IAAoB,aAAhB,EAAO,KAAX,CAEA,GAAM,GAAO,EAAY,SAAS,IAErB,OAAT,GACF,EAAO,MAAU,EAAY,YAAY,KAAK,EAC9C,EAAO,QAAU,EAAY,YAAY,OAAO,EAChD,EAAO,GAAK,GAEI,MAAT,IACP,EAAO,MAAU,EAAY,YAAY,KAAK,EAC9C,EAAO,QAAU,EAAY,YAAY,OAAO,EAChD,EAAO,GAAK,MAwChB,EAAa,UAAU,UAAY,SAAU,GAC3C,MAAI,GAAM,GAAG,OAAO,IAClB,KAAK,QAAQ,KAAK,SAA8B,IAApB,EAAQ,QACpC,KAAK,aAAa,OAAQ,GAC1B,KAAK,YAAY,OAAQ,GAErB,mBAAmB,KAAK,EAAQ,YAClC,KAAK,QAAQ,KAAK,SAAW,EAAQ,UAEnC,aAAa,KAAK,EAAQ,aAC5B,KAAK,QAAQ,KAAK,UAAY,EAAQ,WAGjC,MAGL,EAAM,GAAG,KAAK,IAChB,KAAK,QAAQ,KAAK,QAAU,EAEvB,IACH,KAAK,YAAc,KAAK,YAAc,KAAK,UAAY,MAGlD,MAGF,KAAK,QAAQ,MAGtB,EAAQ,KAAO,EACf,EAAQ,MAAM,KAAK,QACnB,EAAM,MAAM,EAAa,YACvB,YACA,WACA,mBACA,oBACA,YAEF,EAAQ,WAAW,KAAO,YAE1B,EAAe,KAAO,EAAK,SAE3B,EAAO,QAAU,iJCrFjB,SAAS,GAAc,EAAa,GAClC,GAAM,MACA,IAEN,GAAU,GAAW,EAAY,OAGjC,KAAA,GAAA,GAAsB,EAAM,cAA5B,EAAA,MAAA,QAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,OAAA,cAA2C,CAAA,GAAA,EAAA,IAAA,EAAA,CAAA,GAAA,GAAA,EAAA,OAAA,KAAA,GAAA,EAAA,SAAA,CAAA,GAAA,EAAA,EAAA,OAAA,EAAA,KAAA,KAAA,GAAA,EAAA,MAAA,GAAhC,GAAgC,CACzC,IAAK,EAAQ,QAAQ,KAAK,QAA1B,CAEA,GAAM,GAAS,EAAQ,QAAQ,KAAK,MAGpC,MAAK,EAAM,GAAG,QAAQ,IAAW,IAAW,GACpC,EAAM,GAAG,OAAO,KAChB,EAAM,gBAAgB,EAAS,IAUvC,IAAK,GAJC,GAAe,EAAM,GAAG,OAAO,EAAQ,QACzC,EAAQ,SAAS,iBAAiB,EAAQ,SACzC,EAAQ,QAEJ,EAAI,EAAG,EAAI,EAAa,OAAQ,IAAK,CAC5C,GAAM,GAAiB,EAAa,EAEhC,KAAmB,IACrB,EAAM,KAAK,GACX,EAAS,KAAK,MAKpB,OACE,SAAA,EACA,UAAW,GAIf,QAAS,GAAiB,EAAa,GAIrC,IAAK,GAHD,OAAA,GAGK,EAAI,EAAG,EAAI,EAAY,YAAY,UAAU,OAAQ,IAAK,CACjE,GAAM,GAAU,EAAY,YAAY,UAAU,GAC5C,EAAiB,EAAY,YAAY,SAAU,EAGrD,KAAmB,IAErB,EAAM,OAAS,EACf,EAAQ,KAAK,IAEf,EAAc,GAOlB,QAAS,GAAgB,EAAa,GAEpC,GAAM,GAAgB,EAAa,EAAa,GAAa,EAE7D,GAAY,YAAY,UAAY,EAAc,UAClD,EAAY,YAAY,SAAY,EAAc,SAClD,EAAY,YAAY,QAExB,KAAK,GAAI,GAAI,EAAG,EAAI,EAAY,YAAY,UAAU,OAAQ,IAC5D,EAAY,YAAY,MAAM,GAC5B,EAAY,YAAY,UAAU,GAAG,QAAQ,EAAY,YAAY,SAAS,IAIpF,QAAS,GAAS,EAAW,EAAO,GAClC,GAAM,GAAc,EAAU,YACxB,IAEF,IACF,EAAe,EAAa,EAI9B,KAAK,GAAI,GAAI,EAAG,EAAI,EAAY,YAAY,UAAU,OAAQ,IAAK,CACjE,GAAM,GAAiB,EAAY,YAAY,UAAU,GACnD,EAAiB,EAAY,YAAY,SAAU,GACnD,EAAiB,EAAY,YAAY,MAAU,EAEzD,GAAW,KAAK,EAAQ,UAAU,EAAW,EAAO,EAAY,OAAQ,EAAa,EAAgB,GACjG,EACA,MAIN,GAAM,GAAY,EAAM,sBAAsB,EAE9C,QACE,SAAU,EAAY,YAAY,UAAU,IAAc,KAC1D,QAAU,EAAY,YAAY,SAAU,IAAc,MAI9D,QAAS,GAAe,EAAa,EAAc,GACjD,GAAM,IACJ,MAAY,KACZ,MAAY,KACZ,SAAY,KACZ,WAAY,KACZ,KAAY,KACZ,KAAY,MAGR,GACJ,UAAA,EACA,YAAA,EACA,OAAe,EAAY,YAC3B,SAAe,EAAY,WAC3B,cAAe,EAAU,OACzB,UAAe,EAAU,aACzB,UAAe,EAAU,UAwD3B,OArDI,GAAY,cAAgB,EAAY,kBAEtC,EAAY,iBACd,EAAW,MAAQ,EAAM,QAAS,KAAM,aAAe,GAEvD,EAAU,UAAe,EAAW,MAAM,OAAW,EAAY,gBACjE,EAAU,aAAe,EAAW,MAAM,SAAW,EAAY,gBAG/D,EAAY,aACd,EAAW,OACT,UAAA,EACA,YAAA,EACA,OAAe,EAAY,YAC3B,SAAe,EAAY,WAC3B,cAAe,EAAU,OACzB,UAAe,EAAU,aACzB,UAAe,EAAU,UACzB,KAAe,aAGjB,EAAU,UAAY,EAAY,YAClC,EAAU,SAAW,EAAY,aAId,YAAnB,EAAU,MAAsB,EAAY,aAC9C,EAAW,KAAO,EAAM,QAAS,KAAM,QAAU,GAEjD,EAAU,SAAW,EAAY,WACjC,EAAU,cAAgB,EAAY,aAEjB,cAAnB,EAAU,OACZ,EAAW,SAAW,EAAM,QAAS,KAAM,gBAAkB,GAE7D,EAAW,SAAS,OAAW,KAC/B,EAAW,SAAS,SAAW,MAEV,YAAnB,EAAU,OACZ,EAAW,WAAa,EAAM,QAAS,KAAM,kBAAoB,GAEjE,EAAW,WAAW,OAAW,KACjC,EAAW,WAAW,SAAW,MAEZ,aAAnB,EAAU,MAAuB,EAAY,aAC/C,EAAW,KAAO,EAAM,QACtB,SAAe,EACf,KAAe,YACd,GAEH,EAAU,SAAW,EAAY,YAG5B,EAGT,QAAS,GAAgB,EAAa,GAChC,EAAW,OAAS,EAAY,eAAe,KAAK,EAAW,OAC/D,EAAW,MAAa,EAAY,WAAW,KAAK,EAAW,MAC/D,EAAW,OAAa,EAAY,WAAW,KAAK,EAAW,OAC/D,EAAW,MAAa,EAAY,WAAW,KAAK,EAAW,MAC/D,EAAW,YACb,EAAgB,EAAa,EAAW,YAG1C,EAAY,eAAkB,EAAY,WAC1C,EAAY,gBAAkB,EAAY,YAvQ5C,GAAM,GAAiB,EAAQ,UACzB,EAAiB,EAAQ,YACzB,EAAiB,EAAQ,YACzB,EAAiB,EAAQ,eACzB,EAAiB,EAAQ,oBACzB,EAAiB,EAAQ,mBACzB,EAAiB,EAAQ,kBACzB,EAAiB,EAAQ,qBAEzB,GACJ,UACE,SAAS,EACT,OAAS,KACT,QAAS,YAIT,GAAc,CAElB,GAAY,QAAQ,GAAG,eAAgB,SAAA,GAAkC,GAAtB,GAAsB,EAAtB,YAAa,EAAS,EAAT,KAC9D,IAAkC,SAA9B,EAAY,SAAS,KAAzB,CAGA,EAAY,YAAY,aACxB,EAAY,YAAY,YACxB,EAAY,YAAY,SAExB,EAAY,WAAa,KAEpB,EAAY,aACf,EAAe,EAAa,EAAY,QAG1C,IAAM,GAAY,EAAY,UACxB,EAAa,EAAc,EAAa,EAAO,EAEjD,GAAW,UACb,EAAgB,EAAa,EAAW,aAI5C,EAAc,QAAQ,GAAG,MAAO,SAAA,GAA0C,GAA9B,GAA8B,EAA9B,YAAa,EAAiB,EAAjB,OAAQ,EAAS,EAAT,KAC/D,IAAoB,aAAhB,EAAO,MAAuC,YAAhB,EAAO,KAAzC,CAEA,GAAM,GAAmB,EAAY,QAC/B,EAAY,EACZ,EAAa,EAAQ,EAAW,EAAO,EAE7C,GAAY,WAAc,EAAW,SACrC,EAAY,YAAc,EAAW,QAErC,EAAY,WAAa,EAAc,EAAa,EAAO,MAG7D,EAAY,QAAQ,GAAG,cAAe,SAAA,GAA2B,GAAf,GAAe,EAAf,WACd,UAA9B,EAAY,SAAS,MAEzB,EAAe,EAAa,EAAY,cAG1C,EAAY,QAAQ,GAAG,aAAc,SAAA,GAA2B,GAAf,GAAe,EAAf,WACb,UAA9B,EAAY,SAAS,MACvB,EAAe,EAAa,EAAY,cAI5C,EAAY,QAAQ,GAAG,YAAa,SAAA,GAA2B,GAAf,GAAe,EAAf,WAC9C,GAAY,YAAY,UACtB,EAAY,YAAY,SACxB,EAAY,YAAY,MACxB,EAAY,WAAa,OAwP7B,EAAa,UAAU,SAAW,SAAU,GAC1C,MAAI,GAAM,GAAG,OAAO,IAClB,KAAK,QAAQ,KAAK,SAA8B,IAApB,EAAQ,QAEhC,EAAM,GAAG,SAAS,EAAQ,UAAqB,KAAK,OAAO,OAAmB,EAAQ,QACtF,EAAM,GAAG,SAAS,EAAQ,kBAAqB,KAAK,OAAO,eAAmB,EAAQ,gBACtF,EAAM,GAAG,SAAS,EAAQ,oBAAqB,KAAK,OAAO,iBAAmB,EAAQ,kBACtF,EAAM,GAAG,SAAS,EAAQ,eAAqB,KAAK,OAAO,YAAmB,EAAQ,aACtF,EAAM,GAAG,SAAS,EAAQ,eAAqB,KAAK,OAAO,YAAmB,EAAQ,aACtF,EAAM,GAAG,SAAS,EAAQ,cAAqB,KAAK,OAAO,WAAmB,EAAQ,YAEtF,qBAAqB,KAAK,EAAQ,SACpC,KAAK,QAAQ,KAAK,QAAU,EAAQ,QAE7B,EAAM,GAAG,OAAO,EAAQ,WAC/B,KAAK,QAAQ,KAAK,QAAU,KAAK,IAAI,KAAK,IAAI,EAAG,EAAQ,SAAU,IAEjE,UAAY,KACd,KAAK,QAAQ,KAAK,OAAS,EAAQ,QAEjC,WAAa,KACf,KAAK,QAAQ,KAAK,QAAU,EAAQ,SAI/B,MAGL,EAAM,GAAG,KAAK,IAChB,KAAK,QAAQ,KAAK,QAAU,EAEvB,IACH,KAAK,YAAc,KAAK,YAAc,KAAK,OACvC,KAAK,eAAiB,KAAK,iBAAmB,MAG7C,MAGF,KAAK,QAAQ,MAGtB,EAAa,UAAU,UAAY,SAAU,EAAW,EAAO,EAAW,EAAkB,EAAa,GACvG,GAAI,IAAU,CAId,MAAM,EAAO,GAAQ,KAAK,QAAQ,IAChC,QAAQ,KAAK,QAAQ,KAAK,SACtB,KAAK,QAAQ,KAAK,QAAQ,EAAW,EAAO,EAAS,KAAM,EAAa,EAAW,EAIzF,IAAM,GAAc,KAAK,QAAQ,KAAK,OAEtC,IAAoB,YAAhB,EAA2B,CAC7B,GAAM,GAAS,EAAM,YAAY,EAAW,EAAkB,QACxD,EAAO,EAAM,UAAU,EAE7B,GAAK,GAAK,EAAO,EACjB,EAAK,GAAK,EAAO,CAEjB,IAAM,GAAc,EAAK,EAAI,EAAK,MAAU,EAAK,EAAI,EAAK,MACpD,EAAc,EAAK,EAAI,EAAK,KAAU,EAAK,EAAI,EAAK,MAE1D,GAAU,GAAc,EAG1B,GAAM,GAAW,EAAU,QAAQ,EAEnC,IAAI,GAA4B,WAAhB,EAA0B,CACxC,GAAM,GAAK,EAAS,KAAO,EAAS,MAAS,EACvC,EAAK,EAAS,IAAO,EAAS,OAAS,CAE7C,GAAU,GAAM,EAAK,MAAQ,GAAM,EAAK,OAAS,GAAM,EAAK,KAAO,GAAM,EAAK,OAGhF,GAAI,GAAY,EAAM,GAAG,OAAO,GAAc,CAM5C,EALsB,KAAK,IAAI,EAAG,KAAK,IAAI,EAAK,MAAQ,EAAS,OAAU,KAAK,IAAI,EAAK,KAAM,EAAS,OAChF,KAAK,IAAI,EAAG,KAAK,IAAI,EAAK,OAAQ,EAAS,QAAU,KAAK,IAAI,EAAK,IAAM,EAAS,OAEtE,EAAS,MAAQ,EAAS,SAEpC,EAO5B,MAJI,MAAK,QAAQ,KAAK,UACpB,EAAU,KAAK,QAAQ,KAAK,QAAQ,EAAW,EAAO,EAAS,KAAM,EAAa,EAAW,IAGxF,GAGT,EAAa,QAAQ,GAAG,QAAS,SAAA,GAA4B,EAAhB,aAC9B,UAAS,KAGxB,EAAa,gBAAgB,KAAK,eAElC,EAAY,QAAQ,GAAG,MAAO,SAAU,GACtC,EAAY,WAAkB,KAC9B,EAAY,YAAkB,KAC9B,EAAY,eAAkB,KAC9B,EAAY,gBAAkB,KAC9B,EAAY,WAAkB,KAE9B,EAAY,aACV,aACA,YACA,YAKJ,EAAY,QAAQ,GAAG,OAAQ,SAAA,GAA2B,GAAf,GAAe,EAAf,WACzC,GAAY,WAAa,EAAY,YACnC,EAAY,eAAiB,EAAY,gBAAkB,OAc/D,EAAS,YAAc,SAAU,GAC/B,MAAI,GAAM,GAAG,KAAK,IAKhB,EAAc,EAEP,GAEF,GAGT,EAAM,MAAM,EAAa,YACvB,YACA,YACA,eACA,iBACA,WACA,SAEF,EAAQ,WAAW,KAAO,WAE1B,EAAe,KAAO,EAAK,SAE3B,EAAO,QAAU,gLCzdjB,IAAM,GAAiB,EAAQ,UACzB,EAAiB,EAAQ,YACzB,EAAiB,EAAQ,oBACzB,EAAiB,EAAQ,mBACzB,EAAiB,EAAQ,kBACzB,EAAiB,EAAQ,qBAEzB,GACJ,UACE,SAAU,EACV,OAAU,KACV,SAAU,MAGZ,QAAS,SAAU,EAAS,EAAO,EAAc,EAAS,GACxD,MAAI,GAAY,WAAW,QAAU,GAC1B,KAAM,WAGV,MAGT,UAAW,WACT,MAAO,IAIX,GAAc,QAAQ,GAAG,MAAO,SAAA,GAAmC,GAAvB,GAAuB,EAAvB,OAAQ,EAAe,EAAf,WAC9B,kBAAhB,EAAO,OACX,EAAO,GAAK,EAEZ,EAAY,QAAQ,cAAgB,EAAY,QAAQ,aAAe,EAAO,SAC9E,EAAY,QAAQ,WAAa,EAAY,QAAQ,UAAY,EAAO,MACxE,EAAY,QAAQ,MAAQ,KAG9B,EAAc,QAAQ,GAAG,MAAO,SAAA,GAAmC,GAAvB,GAAuB,EAAvB,OAAQ,EAAe,EAAf,WAC9B,iBAAhB,EAAO,OAEX,EAAO,GAAK,EAAO,MAAQ,EAAY,QAAQ,MAE/C,EAAY,OAAO,KAAK,GAExB,EAAY,QAAQ,UAAY,EAAO,MACvC,EAAY,QAAQ,aAAe,EAAO,SAEtC,EAAO,QAAU,EAAA,GACG,OAAjB,EAAO,WACU,KAAjB,EAAO,OACN,MAAM,EAAO,SAEnB,EAAY,QAAQ,MAAQ,EAAO,UA2BvC,EAAa,UAAU,WAAa,SAAU,GAC5C,MAAI,GAAM,GAAG,OAAO,IAClB,KAAK,QAAQ,QAAQ,SAA8B,IAApB,EAAQ,QACvC,KAAK,aAAa,UAAW,GAC7B,KAAK,YAAY,UAAW,GAErB,MAGL,EAAM,GAAG,KAAK,IAChB,KAAK,QAAQ,QAAQ,QAAU,EAE1B,IACH,KAAK,eAAiB,KAAK,eAAiB,KAAK,aAAe,MAG3D,MAGF,KAAK,QAAQ,SAGtB,EAAc,QAAQ,GAAG,YAAa,SAAA,GAAiF,GAArE,GAAqE,EAArE,YAAa,EAAwD,EAAxD,OAAQ,EAAgD,EAAhD,OAAQ,EAAwC,EAAxC,MAAO,EAAiC,EAAjC,SAAU,EAAuB,EAAvB,OAAQ,EAAe,EAAf,WACtG,IAAe,YAAX,EAAJ,CAEA,GAAM,GAAW,EAAY,QAE7B,GAAO,SAAW,EAAS,GAAI,EAAS,IAEpC,GACF,EAAO,SAAW,EAAM,cAAc,EAAU,GAChD,EAAO,IAAW,EAAM,UAAU,GAClC,EAAO,MAAW,EAClB,EAAO,GAAW,EAClB,EAAO,MAAW,EAAM,WAAW,MAAU,GAAW,GACxD,EAAO,GAAW,GAEX,GAAU,YAAiB,IAClC,EAAO,SAAW,EAAY,UAAU,SACxC,EAAO,IAAW,EAAY,UAAU,IACxC,EAAO,MAAW,EAAY,UAAU,MACxC,EAAO,GAAW,EAAO,MAAQ,EACjC,EAAO,MAAW,EAAY,UAAU,MACxC,EAAO,GAAW,EAAO,MAAQ,EAAY,QAAQ,aAGrD,EAAO,SAAW,EAAM,cAAc,EAAU,GAChD,EAAO,IAAW,EAAM,UAAU,GAClC,EAAO,MAAW,EAAO,SAAW,EAAY,QAAQ,cACxD,EAAO,MAAW,EAAM,WAAW,EAAU,EAAY,QAAQ,UAAW,GAE5E,EAAO,GAAK,EAAO,MAAQ,EAAY,QAAQ,UAC/C,EAAO,GAAK,EAAO,MAAQ,EAAY,QAAQ,cAInD,EAAY,QAAQ,GAAG,MAAO,SAAU,GACtC,EAAY,SACV,OAAS,EAAG,EAAG,EAAG,GAElB,cAAe,EACf,aAAe,EACf,SAAe,EAEf,MAAO,EAEP,WAAY,EACZ,UAAY,KAIhB,EAAQ,QAAU,EAClB,EAAQ,MAAM,KAAK,WACnB,EAAM,MAAM,EAAa,YACvB,eACA,cACA,eAEF,EAAQ,WAAW,QAAU,aAE7B,EAAe,QAAU,EAAQ,SAEjC,EAAO,QAAU,kJC4LjB,SAAS,GAAiB,EAAM,EAAO,EAAM,EAAS,EAAqB,EAAM,GAE/E,IAAK,EAAS,OAAO,CAGrB,KAAc,IAAV,EAAgB,CAElB,GAAM,GAAS,EAAM,GAAG,OAAO,EAAK,OAAS,EAAK,MAAS,EAAK,MAAS,EAAK,KACxE,EAAS,EAAM,GAAG,OAAO,EAAK,QAAS,EAAK,OAAS,EAAK,OAAS,EAAK,GAW9E,IATI,EAAQ,IACQ,SAAT,EAAoB,EAAO,QAClB,UAAT,IAAoB,EAAO,SAElC,EAAS,IACO,QAAT,EAAqB,EAAO,SACnB,WAAT,IAAqB,EAAO,QAG1B,SAAT,EAAqB,MAAO,GAAK,GAAM,GAAU,EAAG,EAAK,KAAM,EAAK,OAAU,CAClF,IAAa,QAAT,EAAqB,MAAO,GAAK,GAAM,GAAU,EAAG,EAAK,IAAM,EAAK,QAAU,CAElF,IAAa,UAAT,EAAqB,MAAO,GAAK,GAAM,GAAU,EAAG,EAAK,MAAQ,EAAK,MAAQ,CAClF,IAAa,WAAT,EAAqB,MAAO,GAAK,GAAM,GAAU,EAAG,EAAK,OAAQ,EAAK,KAAQ,EAIpF,QAAK,EAAM,GAAG,QAAQ,KAEf,EAAM,GAAG,QAAQ,GAEpB,IAAU,EAEV,EAAM,YAAY,EAAS,EAAO,IA7XxC,GAAM,GAAiB,EAAQ,UACzB,EAAiB,EAAQ,YACzB,EAAiB,EAAQ,oBACzB,EAAiB,EAAQ,oBACzB,EAAiB,EAAQ,mBACzB,EAAiB,EAAQ,kBACzB,EAAiB,EAAQ,qBAGzB,EAAgB,EAAQ,eAAiB,EAAQ,qBAAsB,GAAI,GAE3E,GACJ,UACE,SAAc,EACd,aAAc,KAEd,OAAY,KACZ,KAAY,KACZ,SAAY,KACZ,QAAY,KACZ,WAAY,KAEZ,QAAQ,EACR,qBAAqB,EACrB,KAAM,KAGN,OAAQ,IAMR,MAAO,KAMP,OAAQ,QAGV,QAAS,SAAU,EAAS,EAAO,EAAc,EAAS,EAAa,GACrE,IAAK,EAAQ,MAAO,KAEpB,IAAM,GAAO,EAAM,UAAW,EAAY,UAAU,MAC9C,EAAU,EAAa,OAE7B,IAAI,EAAQ,OAAO,QAAS,CAC1B,GAAM,GAAgB,EAAQ,OACxB,GAAgB,MAAM,EAAO,OAAO,EAAO,KAAK,EAAO,QAAQ,EAGrE,IAAI,EAAM,GAAG,OAAO,EAAc,OAAQ,CACxC,IAAK,GAAM,KAAQ,GACjB,EAAY,GAAQ,EAAgB,EACA,EAAc,MAAM,GACpB,EACA,EAAY,aACZ,EACA,EACA,EAAc,QAAU,EAM9D,IAHA,EAAY,KAAO,EAAY,OAAS,EAAY,MACpD,EAAY,IAAO,EAAY,MAAS,EAAY,OAEhD,EAAY,MAAQ,EAAY,OAAS,EAAY,KAAO,EAAY,OAC1E,OACE,KAAM,SACN,MAAO,OAIR,CACH,GAAM,GAAiC,MAAxB,EAAQ,OAAO,MAAgB,EAAK,EAAK,EAAK,MAAS,EAChE,EAAiC,MAAxB,EAAQ,OAAO,MAAgB,EAAK,EAAK,EAAK,OAAS,CAEtE,IAAI,GAAS,EACX,OACE,KAAM,SACN,MAAO,EAAO,IAAM,KAAO,EAAQ,IAAM,MAMjD,MAAO,OAGT,QAAU,EAAQ,cAChB,EAAI,WACJ,EAAI,WACJ,GAAI,YAEJ,IAAa,WACb,KAAa,WACb,OAAa,WACb,MAAa,WACb,QAAa,YACb,YAAa,YACb,SAAa,YACb,WAAa,cAEb,EAAI,YACJ,EAAI,YACJ,GAAI,cAEJ,IAAa,YACb,KAAa,YACb,OAAa,YACb,MAAa,YACb,QAAa,cACb,YAAa,cACb,SAAa,cACb,WAAa,eAGf,UAAW,SAAU,GACnB,GAAI,EAAO,KACT,MAAO,GAAO,QAAQ,EAAO,KAAO,EAAO,KAExC,IAAI,EAAO,MAAO,CAIrB,IAAK,GAHD,GAAY,GACV,GAAa,MAAO,SAAU,OAAQ,SAEnC,EAAI,EAAG,EAAI,EAAG,IACjB,EAAO,MAAM,EAAU,MACzB,GAAa,EAAU,GAI3B,OAAO,GAAO,QAAQ,KAM5B,GAAc,QAAQ,GAAG,MAAO,SAAA,GAAmC,GAAvB,GAAuB,EAAvB,OAAQ,EAAe,EAAf,WAClD,IAAoB,gBAAhB,EAAO,MAA2B,EAAY,SAAS,MAA3D,CAIA,GAAM,GAAY,EAAY,OAAO,QAAQ,EAAY,SACnD,EAAgB,EAAY,OAAO,QAAQ,MAQjD,IAAI,EAAc,QAAU,EAAc,oBAAqB,CAC7D,GAAM,GAAc,EAAM,UAAW,EAAY,SAAS,MAE1D,GAAY,IAAS,EAAY,KAAW,EAAY,OAAW,EAAY,OAC/E,EAAY,KAAS,EAAY,MAAW,EAAY,MAAW,EAAY,MAC/E,EAAY,OAAS,EAAY,QAAW,EAAY,QAAW,EAAY,IAC/E,EAAY,MAAS,EAAY,OAAW,EAAY,SAAW,EAAY,KAE/E,EAAY,SAAS,aAAe,MAGpC,GAAY,SAAS,aAAe,IAIlC,GAAc,sBAChB,EAAY,uBAAyB,EAAU,MAAQ,EAAU,QAGnE,EAAY,aACV,MAAY,EACZ,QAAY,EAAM,UAAW,GAC7B,SAAY,EAAM,UAAW,GAC7B,SAAY,EAAM,UAAW,GAC7B,OACE,KAAM,EAAG,MAAQ,EAAG,MAAQ,EAC5B,IAAM,EAAG,OAAQ,EAAG,OAAQ,IAIhC,EAAO,KAAO,EAAY,YAAY,SACtC,EAAO,UAAY,EAAY,YAAY,SAI7C,EAAc,QAAQ,GAAG,MAAO,SAAA,GAA0C,GAA9B,GAA8B,EAA9B,OAAQ,EAAsB,EAAtB,MAAO,EAAe,EAAf,WACzD,IAAc,SAAV,GAAqB,EAAY,SAAS,MAA9C,CAEA,GAAM,GAAgB,EAAY,OAAO,QAAQ,OAC3C,EAAS,EAAc,OACvB,EAAwB,eAAX,GAAsC,WAAX,EAE1C,EAAQ,EAAY,SAAS,MAE3B,EAAa,EAAY,YAAY,MACrC,EAAa,EAAY,YAAY,QACrC,EAAa,EAAY,YAAY,SACrC,EAAa,EAAY,YAAY,MACrC,EAAa,EAAM,OAAO,EAAY,YAAY,SAAU,GAC5D,EAAgB,EAElB,EAAK,EAAO,GACZ,EAAK,EAAO,EAEhB,IAAI,EAAc,qBAAuB,EAAc,OAAQ,CAE7D,GAAM,GAAmB,EAAc,oBACnC,EAAY,uBACZ,CAEJ,GAAQ,EAAY,SAAS,aAExB,EAAc,MAAQ,EAAc,QACjC,EAAc,OAAS,EAAc,IAC3C,GAAM,EAAK,EAEJ,EAAc,MAAQ,EAAc,MAAU,EAAK,EAAK,GACxD,EAAc,KAAQ,EAAc,UAAU,EAAK,EAAK,GASnE,GALI,EAAM,MAAU,EAAQ,KAAU,GAClC,EAAM,SAAU,EAAQ,QAAU,GAClC,EAAM,OAAU,EAAQ,MAAU,GAClC,EAAM,QAAU,EAAQ,OAAU,GAElC,GAIF,GAFA,EAAM,OAAO,EAAU,GAER,eAAX,EAAyB,CAE3B,GAAI,OAAA,EAEA,GAAS,IAAM,EAAS,SAC1B,EAAO,EAAS,IAEhB,EAAS,IAAM,EAAS,OACxB,EAAS,OAAS,GAEhB,EAAS,KAAO,EAAS,QAC3B,EAAO,EAAS,KAEhB,EAAS,KAAO,EAAS,MACzB,EAAS,MAAQ,QAMrB,GAAS,IAAS,KAAK,IAAI,EAAQ,IAAK,EAAM,QAC9C,EAAS,OAAS,KAAK,IAAI,EAAQ,OAAQ,EAAM,KACjD,EAAS,KAAS,KAAK,IAAI,EAAQ,KAAM,EAAM,OAC/C,EAAS,MAAS,KAAK,IAAI,EAAQ,MAAO,EAAM,KAGlD,GAAS,MAAS,EAAS,MAAS,EAAS,KAC7C,EAAS,OAAS,EAAS,OAAS,EAAS,GAE7C,KAAK,GAAM,KAAQ,GACjB,EAAM,GAAQ,EAAS,GAAQ,EAAS,EAG1C,GAAO,MAAQ,EAAY,SAAS,MACpC,EAAO,KAAO,EACd,EAAO,UAAY,KA+CrB,EAAa,UAAU,UAAY,SAAU,GAC3C,MAAI,GAAM,GAAG,OAAO,IAClB,KAAK,QAAQ,OAAO,SAA8B,IAApB,EAAQ,QACtC,KAAK,aAAa,SAAU,GAC5B,KAAK,YAAY,SAAU,GAEvB,eAAe,KAAK,EAAQ,MAC9B,KAAK,QAAQ,OAAO,KAAO,EAAQ,KAEX,OAAjB,EAAQ,OACf,KAAK,QAAQ,OAAO,KAAO,EAAe,OAAO,MAG/C,EAAM,GAAG,KAAK,EAAQ,qBACxB,KAAK,QAAQ,OAAO,oBAAsB,EAAQ,oBAE3C,EAAM,GAAG,KAAK,EAAQ,UAC7B,KAAK,QAAQ,OAAO,OAAS,EAAQ,QAGhC,MAEL,EAAM,GAAG,KAAK,IAChB,KAAK,QAAQ,OAAO,QAAU,EAEzB,IACH,KAAK,cAAgB,KAAK,cAAgB,KAAK,YAAc;AXnVnE,iEWsVW,MAEF,KAAK,QAAQ,QAuCtB,EAAY,QAAQ,GAAG,MAAO,SAAU,GACtC,EAAY,WAAa,OAG3B,EAAc,QAAQ,GAAG,YAAa,SAAA,GAA2C,GAA/B,GAA+B,EAA/B,YAAa,EAAkB,EAAlB,MAC9C,YADgE,EAAV,QACzC,EAAY,aAExB,EAAY,OAAO,QAEvB,OAAO,QACc,MAA3B,EAAY,WACd,EAAO,GAAK,EAAO,GAGnB,EAAO,GAAK,EAAO,GAErB,EAAO,KAAO,OAGd,EAAO,KAAO,EAAY,WAEK,MAA3B,EAAY,WACd,EAAO,GAAK,EAEsB,MAA3B,EAAY,aACnB,EAAO,GAAK,OAKlB,EAAQ,OAAS,EACjB,EAAQ,MAAM,KAAK,UACnB,EAAM,MAAM,EAAa,YACvB,cACA,aACA,qBACA,sBACA,cAEF,EAAQ,WAAW,OAAS,YAE5B,EAAe,OAAS,EAAO,SAE/B,EAAO,QAAU,wKC3ajB,IAAM,GAAiB,EAAQ,eACzB,EAAiB,EAAQ,kBAAkB,UAC3C,EAAiB,EAAQ,cACzB,EAAiB,EAAQ,oBACzB,EAAiB,EAAQ,iBACzB,EAAiB,EAAQ,oBAEzB,GACJ,UACE,SAAW,EACX,UAAW,KACX,OAAW,GACX,MAAW,KAGb,YAAa,KACb,EAAG,KACH,EAAG,EAAG,EAAG,EAET,aAAa,EACb,SAAU,EAEV,MAAO,SAAU,GACf,EAAW,aAAc,EACzB,EAAI,OAAO,EAAW,GAEtB,EAAW,YAAc,EACzB,EAAW,UAAW,GAAI,OAAO,UACjC,EAAW,EAAI,EAAI,QAAQ,EAAW,SAGxC,KAAM,WACJ,EAAW,aAAc,EACzB,EAAI,OAAO,EAAW,IAIxB,OAAQ,WACN,GAAM,GAAU,EAAW,YAAY,OAAO,QAAQ,EAAW,YAAY,SAAS,MAAM,WACtF,EAAY,EAAQ,WAAa,EAAU,EAAW,YAAY,SAClE,GAAM,GAAI,OAAO,UAEjB,GAAM,EAAM,EAAW,UAAY,IAEnC,EAAI,EAAQ,MAAQ,CAEtB,IAAK,IACH,EAAG,OAAO,GACZ,EAAU,SAAS,EAAW,EAAI,EAAG,EAAW,EAAI,GAE7C,IACP,EAAU,YAAc,EAAW,EAAI,EACvC,EAAU,WAAc,EAAW,EAAI,GAGzC,EAAW,SAAW,GAGpB,EAAW,cACb,EAAI,OAAO,EAAW,GACtB,EAAW,EAAI,EAAI,QAAQ,EAAW,UAG1C,MAAO,SAAU,EAAc,GAC7B,GAAM,GAAU,EAAa,OAE7B,OAAO,GAAQ,GAAY,YAAc,EAAQ,GAAY,WAAW,SAE1E,kBAAmB,SAAA,GAAoC,GAAxB,GAAwB,EAAxB,YAAa,EAAW,EAAX,OAC1C,IAAM,EAAY,eACT,EAAW,MAAM,EAAY,OAAQ,EAAY,SAAS,MADnE,CAKA,GAAI,EAAY,WAEd,YADA,EAAW,EAAI,EAAW,EAAI,EAIhC,IAAI,OAAA,GACA,MAAA,GACA,MAAA,GACA,MAAA,GAEE,EAAU,EAAY,OAAO,QAAQ,EAAY,SAAS,MAAM,WAChE,EAAY,EAAQ,WAAa,EAAU,EAAY,QAE7D,IAAI,EAAG,OAAO,GACZ,EAAS,EAAQ,QAAU,EAAW,OACtC,EAAS,EAAQ,QAAU,EAAW,OACtC,EAAS,EAAQ,QAAU,EAAU,WAAc,EAAW,OAC9D,EAAS,EAAQ,QAAU,EAAU,YAAc,EAAW,WAE3D,CACH,GAAM,GAAO,EAAS,qBAAqB,EAE3C,GAAS,EAAQ,QAAU,EAAK,KAAS,EAAW,OACpD,EAAS,EAAQ,QAAU,EAAK,IAAS,EAAW,OACpD,EAAS,EAAQ,QAAU,EAAK,MAAS,EAAW,OACpD,EAAS,EAAQ,QAAU,EAAK,OAAS,EAAW,OAGtD,EAAW,EAAK,EAAQ,EAAG,GAAO,EAAG,EACrC,EAAW,EAAK,EAAQ,EAAI,GAAM,EAAG,EAEhC,EAAW,cAEd,EAAW,OAAS,EAAQ,OAC5B,EAAW,MAAS,EAAQ,MAE5B,EAAW,MAAM,MAKvB,GAAY,QAAQ,GAAG,cAAe,WACpC,EAAW,SAGb,EAAY,QAAQ,GAAG,cAAe,EAAW,mBAEjD,EAAe,UAAU,WAAa,EAAW,SAEjD,EAAO,QAAU,yJC3HjB,IAAM,GAAe,EAAQ,mBACvB,EAAe,EAAQ,mBACvB,EAAe,EAAQ,eACvB,EAAe,EAAQ,oBAE7B,GAAa,UAAU,UAAY,SAAU,EAAS,EAAO,EAAa,GACxE,GAAM,GAAS,KAAK,qBAAqB,EAAS,EAAO,EAAa,EAEtE,OAAI,MAAK,QAAQ,cACR,KAAK,QAAQ,cAAc,EAAS,EAAO,EAAQ,KAAM,EAAS,GAGpE,GAkBT,EAAa,UAAU,WAAa,SAAU,GAC5C,MAAO,MAAK,kBAAkB,aAAc,IAkB9C,EAAa,UAAU,UAAY,SAAU,GAC3C,MAAO,MAAK,kBAAkB,YAAa,IAG7C,EAAa,UAAU,WAAa,SAAU,EAAY,EAAqB,GAC7E,SAAK,IAAe,EAAG,QAAQ,MAE3B,EAAG,OAAO,GACL,EAAS,YAAY,EAAS,EAAY,KAE1C,EAAG,QAAQ,IACX,EAAS,aAAa,EAAY,KAM7C,EAAa,UAAU,UAAY,SAAU,EAAW,EAAqB,GAC3E,OAAK,KAEA,EAAG,QAAQ,KAEZ,EAAG,OAAO,GACL,EAAS,YAAY,EAAS,EAAW,KAEzC,EAAG,QAAQ,IACX,EAAS,aAAa,EAAW,KAM5C,EAAa,UAAU,gBAAkB,SAAU,EAAS,EAAqB,GAC/E,OAAS,KAAK,WAAW,EAAQ,WAAY,EAAqB,IAC7D,KAAK,UAAU,EAAQ,UAAW,EAAqB,IA+B9D,EAAa,UAAU,cAAgB,SAAU,GAC/C,MAAI,GAAG,SAAS,IACd,KAAK,QAAQ,cAAgB,EAEtB,MAGO,OAAZ,SACK,MAAK,QAAQ,cAEb,MAGF,KAAK,QAAQ,eAatB,EAAa,UAAU,YAAc,SAAU,GAC7C,MAAI,GAAG,KAAK,IACV,KAAK,QAAQ,YAAc,EAEpB,MAGQ,OAAb,SACK,MAAK,QAAQ,YAEb,MAGF,KAAK,QAAQ,aAGtB,EAAa,UAAU,qBAAuB,SAAU,EAAS,EAAO,EAAa,GAInF,IAAA,GAHM,GAAO,KAAK,QAAQ,GACtB,EAAS,KAEb,EAAyB,EAAQ,MAAjC,EAAA,MAAA,QAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,OAAA,cAAwC,CAAA,GAAA,EAAA,IAAA,EAAA,CAAA,GAAA,GAAA,EAAA,OAAA,KAAA,GAAA,EAAA,SAAA,CAAA,GAAA,EAAA,EAAA,OAAA,EAAA,KAAA,KAAA,GAAA,EAAA,MAAA,GAA7B,GAA6B,CAEtC,MAAI,EAAY,gBACT,EAAY,OACgD,IAA3D,EAAM,QAAU,KAAK,QAAQ,GAAY,iBAIjD,EAAS,EAAQ,GAAY,QAAQ,EAAS,EAAO,KAAM,EAAS,EAAa,IAG/E,MAAO,yHC9Fb,SAAS,GAAgB,EAAQ,EAAc,EAAS,GACtD,MAAI,GAAM,GAAG,OAAO,IACb,EAAa,gBAAgB,EAAa,QAAQ,EAAO,MAAO,EAAS,IACzE,EAAa,QAAQ,EAAO,MAAM,SAClC,EAAuB,EAAc,EAAS,GAC5C,EAGF,KAGT,QAAS,GAAkB,EAAa,EAAS,EAAO,EAAS,EAAe,GAC9E,IAAK,GAAI,GAAI,EAAG,EAAM,EAAQ,OAAQ,EAAI,EAAK,IAAK,CAClD,GAAM,GAAQ,EAAQ,GAChB,EAAe,EAAc,GAC7B,EAAS,EAAe,EAAM,UAAU,EAAS,EAAO,EAAa,GAC7C,EACA,EACA,EAE9B,IAAI,EACF,OACE,OAAA,EACA,OAAQ,EACR,QAAS,GAKf,SAGF,QAAS,GAAe,EAAa,EAAS,EAAO,GAOnD,QAAS,GAAa,EAAc,EAAU,GAC5C,GAAM,GAAY,EAAQ,2BACtB,EAAQ,iBAAiB,OACzB,EAEA,GAAM,gBAAgB,EAAS,EAAU,KAE3C,EAAQ,KAAK,GACb,EAAc,KAAK,IAIvB,IAlBA,GAAI,MACA,KAEA,EAAU,EACV,EAAS,KAcN,EAAM,GAAG,QAAQ,IAAU,CAChC,KACA,IAEA,IAAM,GAAsB,EAAM,cAAc,IAAI,EAEpD,IAAI,IACI,EAAS,EAAe,EAAoB,UAAU,EAAS,EAAO,EAAa,EAAS,GACpE,EACA,EACA,MACxB,EAAoB,QAAQ,EAAO,MAAM,YAC/C,OACE,QAAA,EACA,OAAA,EACA,OAAQ,EAIV,GAAM,cAAc,gBAAgB,EAAa,EAEjD,IAAM,GAAa,EAAiB,EAAa,EAAS,EAAO,EAAS,EAAe,EAEzF,IAAI,EAAW,SACP,EAAW,OAAO,QAAQ,EAAW,OAAO,MAAM,YACxD,MAAO,EAIX,GAAU,EAAM,WAAW,GAG7B,SAGF,QAAS,GAAS,EAAlB,GAA4D,GAA3B,GAA2B,EAA3B,OAAQ,EAAmB,EAAnB,OAAQ,EAAW,EAAX,OAW/C,IAVA,EAAS,MAEL,EAAY,QAAU,EAAY,OAAO,QAAQ,cACnD,EAAY,OAAO,KAAK,gBAAgB,MAAM,OAAS,IAGzD,EAAY,OAAS,EACrB,EAAY,QAAU,EACtB,EAAM,WAAW,EAAY,SAAU,GAEnC,GAAU,EAAO,QAAQ,YAAa,CACxC,GAAM,GAAS,EAAQ,EAAQ,EAAO,MAAM,UAAU,GAAU,EAChE,GAAY,OAAO,KAAK,gBAAgB,MAAM,OAAS,EAGzD,EAAQ,KAAK,YAAc,YAAa,IAqH1C,QAAS,GAAwB,EAAc,EAAS,GACtD,GAAM,GAAU,EAAa,QACvB,EAAa,EAAQ,EAAO,MAAM,IAClC,EAAgB,EAAQ,EAAO,MAAM,cACvC,EAAqB,EACrB,EAAc,EACd,EAAqB,CAGzB,IAAM,GAAc,GAAiB,EAAU,gBAA/C,CAEA,IAAK,GAAI,GAAI,EAAG,EAAM,EAAM,aAAa,OAAQ,EAAI,EAAK,IAAK,CAC7D,GAAM,GAAc,EAAM,aAAa,GACjC,EAAc,EAAY,SAAS,IAEzC,IAAK,EAAY,cAAjB,CAIA,KAFA,GAE0B,EAAU,gBAClC,OAAO,CAGT,IAAI,EAAY,SAAW,EAA3B,CAIA,IAFA,GAAgB,IAAgB,EAAO,KAAM,IAE1B,EACjB,OAAO,CAGT,IAAI,EAAY,UAAY,IAC1B,IAEI,IAAgB,EAAO,MAAQ,GAAsB,GACvD,OAAO,IAKb,MAAO,GAAU,gBAAkB,GAhVrC,GAAM,GAAiB,EAAQ,eACzB,EAAiB,EAAQ,mBACzB,EAAiB,EAAQ,kBACzB,EAAiB,EAAQ,mBACzB,EAAiB,EAAQ,qBACzB,EAAiB,EAAQ,oBACzB,EAAiB,EAAQ,YACzB,EAAiB,EAAQ,YACzB,EAAiB,EAAQ,oBAAoB,KAEnD,GAAQ,wBAER,IAAM,IACJ,QAAA,EACA,uBAAA,EAEA,gBAAiB,EAAA,EACjB,UACE,WACE,aAAa,EACb,IAAK,EAAA,EACL,cAAe,EACf,UAAY,KACZ,WAAY,OAGhB,kBAAmB,SAAU,GAC3B,EAAM,OAAO,EAAO,SAAU,EAAU,SAAS,YAKrD,GAAY,QAAQ,GAAG,OAAQ,SAAA,GAAwD,GAA5C,GAA4C,EAA5C,YAAa,EAA+B,EAA/B,QAAS,EAAsB,EAAtB,MAAO,EAAe,EAAf,WACtE,KAAI,EAAY,cAAhB,CAGA,EAAQ,EADW,EAAc,EAAa,EAAS,EAAO,OAKhE,EAAY,QAAQ,GAAG,OAAQ,SAAA,GAAwD,GAA5C,GAA4C,EAA5C,YAAa,EAA+B,EAA/B,QAAS,EAAsB,EAAtB,MAAO,EAAe,EAAf,WACtE,IAAK,EAAY,QACV,EAAY,gBACZ,EAAY,cAFnB,CAKA,EAAQ,EADW,EAAc,EAAa,EAAS,EAAO,OAIhE,EAAY,QAAQ,GAAG,OAAQ,SAAU,GAAK,GACpC,GAAuB,EAAvB,YAAa,EAAU,EAAV,KAErB,IAAK,EAAY,gBACV,EAAY,eACX,EAAY,iBACZ,EAAY,SAAS,KAH7B,CAOA,EAAQ,KAAK,eAAgB,EAE7B,IAAM,GAAS,EAAY,MAEvB,GAAY,SAAS,MAAQ,IAE3B,EAAO,QAAQ,EAAY,SAAS,MAAM,cACtC,EAAuB,EAAQ,EAAY,QAAS,EAAY,UACtE,EAAY,KAAK,GAGjB,EAAY,MAAM,EAAY,SAAU,EAAQ,EAAY,aAgHlE,EAAY,QAAQ,GAAG,OAAQ,SAAA,GAA2B,GAAf,GAAe,EAAf,YACnC,EAAS,EAAY,MAEvB,IAAU,EAAO,QAAQ,cAC3B,EAAO,KAAK,gBAAgB,MAAM,OAAS,MAI/C,EAAa,UAAU,UAAY,SAAU,EAAS,EAAO,EAAa,GACxE,GAAM,GAAS,KAAK,qBAAqB,EAAS,EAAO,EAAa,EAEtE,OAAI,MAAK,QAAQ,cACR,KAAK,QAAQ,cAAc,EAAS,EAAO,EAAQ,KAAM,EAAS,GAGpE,GA+BT,EAAa,UAAU,cAAgB,SAAU,GAC/C,MAAI,GAAM,GAAG,SAAS,IACpB,KAAK,QAAQ,cAAgB,EAEtB,MAGO,OAAZ,SACK,MAAK,QAAQ,cAEb,MAGF,KAAK,QAAQ,eAatB,EAAa,UAAU,YAAc,SAAU,GAC7C,MAAI,GAAM,GAAG,KAAK,IAChB,KAAK,QAAQ,YAAc,EAEpB,MAGQ,OAAb,SACK,MAAK,QAAQ,YAEb,MAGF,KAAK,QAAQ,aAGtB,EAAa,UAAU,qBAAuB,SAAU,EAAS,EAAO,EAAa,GAUnF,IAAA,GATM,GAAO,KAAK,QAAQ,GACpB,EAAU,EAAM,UACpB,EAAG,EACH,EAAG,EACH,EAAG,EACH,EAAG,IACF,EAAM,QACL,EAAS,KAEb,EAAyB,EAAQ,MAAjC,EAAA,MAAA,QAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,OAAA,cAAwC,CAAA,GAAA,EAAA,IAAA,EAAA,CAAA,GAAA,GAAA,EAAA,OAAA,KAAA,GAAA,EAAA,SAAA,CAAA,GAAA,EAAA,EAAA,OAAA,EAAA,KAAA,KAAA,GAAA,EAAA,MAAA,GAA7B,GAA6B,CAEtC,MAAI,EAAY,gBACT,EAAY,OAC0C,IAArD,EAAU,KAAK,QAAQ,GAAY,iBAI3C,EAAS,EAAQ,GAAY,QAAQ,EAAS,EAAO,KAAM,EAAS,EAAa,IAG/E,MAAO,KA4Db,EAAS,gBAAkB,SAAU,GACnC,MAAI,GAAM,GAAG,OAAO,IAClB,EAAU,gBAAkB,EAErB,MAGF,EAAU,iBAGnB,EAAa,gBAAgB,KAAK,eAClC,EAAa,gBAAgB,KAAK,iBAClC,EAAa,gBAAgB,KAAK,cAClC,EAAa,gBAAgB,KAAK,aAElC,EAAe,KAAK,cAAgB,KACpC,EAAe,KAAK,aAAc,EAElC,EAAM,OAAO,EAAe,UAAW,EAAU,SAAS,WAE1D,EAAO,QAAU,4OCnXjB,IAAM,GAAc,EAAQ,UACtB,EAAc,EAAQ,iBAE5B,GAAY,QAAQ,GAAG,MAAO,SAAU,GACtC,EAAY,WAAa,OAG3B,EAAU,QAAQ,GAAG,WAAY,SAAA,GAA2B,GAAf,GAAe,EAAf,YACrC,EAAa,EAAY,SAAS,IAExC,IAAK,EAAL,CAEA,GAAM,GAAQ,EAAY,OAAO,QAAQ,GAAY,KAEjD,GAAQ,IACV,EAAY,WAAa,WAAW,WAClC,EAAY,MAAM,EAAY,SAAU,EAAY,OAAQ,EAAY,UACvE,OAIP,EAAY,QAAQ,GAAG,OAAQ,SAAA,GAAsC,GAA1B,GAA0B,EAA1B,YAAa,EAAa,EAAb,SAClD,GAAY,kBAAoB,GAClC,aAAa,EAAY,cAK7B,EAAU,QAAQ,GAAG,eAAgB,SAAA,GAA2B,GAAf,GAAe,EAAf,YACzC,EAAa,EAAY,SAAS,IAExC,IAAK,EAAL,CAEc,EAAY,OAAO,QAAQ,GAAY,MAEzC,IACV,EAAY,SAAS,KAAO,4EC6DhC,SAAS,GAAgB,EAAW,GAClC,IAAK,EAAgB,OAAO,CAE5B,IAAM,GAAW,EAAa,QAAQ,KAAK,SAE3C,OAAsB,OAAd,GAAmC,OAAb,GAAqB,IAAa,EAtGlE,GAAM,GAAY,EAAQ,UACpB,EAAY,EAAQ,YACpB,EAAY,EAAQ,oBACpB,EAAY,EAAQ,iBAEc,EAAQ,qBAAxC,IAAA,gBAAiB,IAAA,UAEzB,GAAU,kBAAkB,EAAQ,oBAEpC,EAAU,QAAQ,GAAG,eAAiB,SAAA,GAAgD,GAApC,GAAoC,EAApC,YAAa,EAAuB,EAAvB,YAAa,EAAU,EAAV,GAAI,EAAM,EAAN,EAC9E,IAAkC,SAA9B,EAAY,SAAS,KAAzB,CAGA,GAAM,GAAO,KAAK,IAAI,GAChB,EAAO,KAAK,IAAI,GAChB,EAAU,EAAY,OAAO,QAAQ,KACrC,EAAY,EAAQ,UACpB,EAAe,EAAO,EAAO,IAAM,EAAO,EAAO,IAAM,IAO7D,IALA,EAAY,SAAS,KAA4B,UAArB,EAAQ,SAChC,EAAY,GACZ,EAAQ,SAGQ,OAAhB,GAAsC,OAAd,GAAsB,IAAc,IAE9D,EAAY,SAAS,KAAO,MAIvB,EAAY,SAAS,MAiCxB,IA/BA,GAAI,GAAU,EAER,EAAe,SAAU,EAAc,EAAU,GACrD,GAAM,GAAW,EAAQ,2BACnB,EAAQ,iBAAiB,OACzB,EAEN,IAAI,IAAiB,EAAY,SAE5B,EAAQ,cACL,EAAa,gBAAgB,EAAS,EAAS,IAChD,EAAgB,EAAS,EAAU,GAAW,CAEnD,GAAM,GAAS,EAAa,UAAU,EAAY,YACZ,EAAY,UACZ,EACA,EAEtC,IAAI,GACmB,SAAhB,EAAO,MACP,EAAe,EAAa,IAC5B,EAAU,eAAe,EAAQ,EAAc,EAAS,GAE7D,MAAO,KAKT,EAAS,KAGN,EAAG,QAAQ,IAAU,CAC1B,GAAM,GAAsB,EAAM,cAAc,IAAI,EAQpD,IANI,GACG,IAAwB,EAAY,SACnC,EAAoB,QAAQ,KAAK,cAEvC,EAAS,EAAoB,UAAU,EAAY,YAAa,EAAY,UAAW,EAAa,IAElG,GACmB,SAAhB,EAAO,MACP,EAAe,EAAa,GAAsB,CAEvD,EAAY,SAAS,KAAO,OAC5B,EAAY,OAAS,EACrB,EAAY,QAAU,CACtB,OAGF,GAAM,GAAuB,EAAM,cAAc,gBAAgB,EAAc,EAE/E,IAAI,EAAsB,CACxB,EAAY,SAAS,KAAO,OAC5B,EAAY,OAAS,EACrB,EAAY,QAAU,CACtB,OAGF,EAAU,EAAW,uJC3F7B,GAAQ,UAAU,kBAAkB,EAAQ,8FCA5C,GAAQ,UAAU,kBAAkB,EAAQ,6FCA5C,GAAO,SACL,MACE,OAAgB,KAChB,eAAgB,OAChB,YAAgB,QAGlB,WACE,QAAU,EAAG,EAAG,EAAG,GAInB,aAAc,EAEd,SACE,SAAmB,EACnB,WAAmB,GACnB,SAAmB,IACnB,SAAmB,GACnB,aAAmB,EACnB,kBAAmB,4CCjBzB,GAAQ,oBAGR,EAAQ,aAGR,EAAQ,oBACR,EAAQ,wBAGR,EAAQ,wBACR,EAAQ,8BACR,EAAQ,uCAGR,EAAQ,qBAGR,EAAQ,qBACR,EAAQ,oBACR,EAAQ,kBACR,EAAQ,kBAGR,EAAQ,wBACR,EAAQ,6BACR,EAAQ,4BAGR,EAAQ,uBACR,EAAQ,sBACR,EAAQ,oBAGR,EAAQ,mCAGR,EAAQ,gBAGR,EAAO,QAAU,EAAQ,wjBCyIzB,SAAS,GAAa,EAAa,GACjC,GAAM,GAAiB,EAAY,OAAO,QAAQ,EAAY,SAAS,MAAM,QACvE,EAAS,EAAe,WACxB,GAAc,KAAK,IAAI,EAAe,SAAW,EAAO,IAAM,CAEpE,GAAO,GAAK,EAAY,UAAU,MAClC,EAAO,GAAK,EAAY,UAAU,MAClC,EAAO,GAAK,EAAO,WAAW,UAAY,IAC1C,EAAO,GAAK,EAAO,GAAK,EAExB,EAAO,WAAa,EAAO,IAAM,EAAO,IAAM,GAAc,EAC5D,EAAO,WAAa,EAAO,IAAM,EAAO,IAAM,GAAc,EAC5D,EAAO,GAAK,EAEZ,EAAO,UAAY,EAAS,EAAO,GACnC,EAAO,UAAY,EAAI,EAAe,SAAW,EAAO,GAG1D,QAAS,KACP,EAAoB,MACpB,EAAM,eAAe,KAAK,aAAc,KAAK,WAAY,KAAK,UAE9D,IAAM,GAAS,KAAK,cACd,EAAU,KAAK,OAAO,QAAQ,KAAK,SAAS,MAAM,QAClD,EAAS,EAAQ,WACjB,GAAI,GAAI,OAAO,UAAY,IAAO,EAAO,EAE/C,IAAI,EAAI,EAAO,GAAI,CAEjB,GAAM,GAAY,GAAK,KAAK,KAAK,EAAS,GAAK,EAAO,WAAa,EAAO,SAE1E,IAAI,EAAO,aAAe,EAAO,IAAM,EAAO,aAAe,EAAO,GAClE,EAAO,GAAK,EAAO,GAAK,EACxB,EAAO,GAAK,EAAO,GAAK,MAErB,CACH,GAAM,GAAY,EAAM,uBAAuB,EAAG,EACH,EAAO,GACP,EAAO,GACP,EAAO,WACP,EAAO,WACP,EAE/C,GAAO,GAAK,EAAU,EACtB,EAAO,GAAK,EAAU,EAGxB,KAAK,SAEL,EAAO,EAAI,EAAe,QAAQ,KAAK,uBAGvC,GAAO,GAAK,EAAO,WACnB,EAAO,GAAK,EAAO,WAEnB,KAAK,SACL,KAAK,IAAI,EAAO,YAChB,EAAO,QAAS,EAChB,KAAK,WAAa,IAGpB,GAAM,WAAW,KAAK,WAAY,KAAK,WAGzC,QAAS,KACP,EAAoB,KAEpB,IAAM,GAAS,KAAK,cACd,GAAI,GAAI,OAAO,UAAY,EAAO,GAClC,EAAW,KAAK,OAAO,QAAQ,KAAK,SAAS,MAAM,QAAQ,iBAE7D,GAAI,GACN,EAAO,GAAK,EAAM,YAAY,EAAG,EAAG,EAAO,GAAI,GAC/C,EAAO,GAAK,EAAM,YAAY,EAAG,EAAG,EAAO,GAAI,GAE/C,KAAK,YAAY,EAAO,WAAY,EAAO,YAE3C,EAAO,EAAI,EAAe,QAAQ,KAAK,uBAGvC,EAAO,GAAK,EAAO,GACnB,EAAO,GAAK,EAAO,GAEnB,KAAK,YAAY,EAAO,WAAY,EAAO,YAC3C,KAAK,IAAI,EAAO,YAEhB,EAAO,UACL,EAAO,QAAS,EAClB,KAAK,WAAa,MAItB,QAAS,GAAqB,GAC5B,GAAM,GAAS,EAAY,aAG3B,IAAK,EAAO,OAAZ,CAEA,GAAM,GAAW,EAAO,SAAS,KAC3B,EAAW,EAAO,SAAS,MAEjC,GAAM,UAAU,EAAY,YAC1B,MAAS,EAAO,EAAM,EAAO,GAC7B,MAAS,EAAO,EAAM,EAAO,GAC7B,QAAS,EAAS,EAAI,EAAO,GAC7B,QAAS,EAAS,EAAI,EAAO,OA7RjC,GAAM,GAAiB,EAAQ,mBACzB,EAAiB,EAAQ,iBACzB,EAAiB,EAAQ,eACzB,EAAiB,EAAQ,WACzB,EAAiB,EAAQ,cAE/B,GAAY,QAAQ,GAAG,MAAO,SAAU,GACtC,EAAY,eACV,QAAa,EACb,WAAa,EACb,aAAa,EAEb,WAAY,KACZ,YAEA,GAAI,EAAG,GAAI,EACX,GAAI,EAAG,GAAI,EAEX,GAAI,EACJ,IAAK,EAAG,IAAK,EACb,SAAU,EAEV,UAAW,EACX,UAAW,EACX,EAAK,MAGP,EAAY,kBAAsB,WAAA,MAAM,GAAe,MAAM,IAC7D,EAAY,oBAAsB,WAAA,MAAM,GAAe,MAAM,MAG/D,EAAY,QAAQ,GAAG,OAAQ,SAAA,GAAwD,GAA5C,GAA4C,EAA5C,YAAa,EAA+B,EAA/B,MAAO,EAAwB,EAAxB,QAAS,EAAe,EAAf,YAChE,EAAS,EAAY,aAG3B,IAAI,EAAO,OAIT,IAHA,GAAI,GAAU,EAGP,EAAM,GAAG,QAAQ,IAAU,CAGhC,GAAI,IAAY,EAAY,QAAS,CAEnC,EAAe,OAAO,EAAO,GAC7B,EAAO,QAAS,EAChB,EAAY,WAAa,KAGzB,EAAY,cAAc,GAC1B,EAAM,UAAU,EAAY,UAAW,EAAY,SAGnD,IAAM,IAAc,YAAA,EACpB,GAAY,QAAQ,KAAK,qBAAsB,GAC/C,EAAY,QAAQ,KAAK,gBAAsB,EAG/C,IAAM,GAAc,GAAI,GAAc,EACA,EACA,EAAY,SAAS,KACrB,gBACA,EAAY,QAElD,GAAY,OAAO,KAAK,GACxB,EAAY,UAAY,EACxB,EAAU,cAAc,EAAY,kBAEpC,EAAM,WAAW,EAAY,WAAY,EAAY,UACrD,OAGF,EAAU,EAAM,WAAW,MAKjC,EAAY,QAAQ,GAAG,KAAM,SAAA,GAAkC,GAAtB,GAAsB,EAAtB,YAAa,EAAS,EAAT,MAC9C,EAAS,EAAY,aAE3B,IAAK,EAAY,gBAAiB,EAAO,OAAzC,CAEA,GAAM,GAAS,EAAY,OACrB,EAAU,GAAU,EAAO,QAC3B,EAAiB,GAAW,EAAY,SAAS,MAAQ,EAAQ,EAAY,SAAS,MAAM,QAE5F,GAAM,GAAI,OAAO,UACjB,KACA,EAAO,EAAM,UAAW,EAAY,UAAU,MAC9C,EAAe,EAAY,aAAa,OAAO,MAEjD,GAAY,EACZ,MAAA,GAGE,EAAmB,GAAkB,EAAe,SACN,YAA9B,EAAY,SAAS,MACrB,IAAU,EAAO,WAEjC,EAAW,GACX,EAAM,EAAY,UAAU,UAAa,IAC1C,EAAe,EAAe,UAC9B,EAAe,EAAe,SAE7B,GACJ,YAAA,EACA,WAAY,EACZ,SAAA,EACA,QAAQ,EACR,gBAAgB,EAId,KAAoB,IACtB,EAAU,cAAc,GAExB,EAAiB,EAAU,OAAO,GAE9B,EAAe,YAAc,EAAe,SAC9C,GAAY,KAIV,GAAW,KAEjB,EAAM,WAAW,EAAO,SAAU,EAAY,WAE9C,EAAY,SAAS,GAAK,EAAO,WAC/B,GAAI,GAAc,EAAa,EAAO,EAAY,SAAS,KAAM,eAAgB,EAAY,SAE/F,EAAO,GAAK,EAEZ,EAAO,QAAS,EAChB,EAAO,YAAc,EAAe,YACpC,EAAY,WAAa,EAEzB,EAAO,KAAK,EAAO,YAEf,GACF,EAAO,IAAM,EAAY,aAAa,OAAO,GAC7C,EAAO,IAAM,EAAY,aAAa,OAAO,GAC7C,EAAO,GAAK,EAEZ,EAAY,EAAa,GAEzB,EAAM,OAAO,EAAM,EAAY,UAAU,MAEzC,EAAK,GAAK,EAAO,GACjB,EAAK,GAAK,EAAO,GAEjB,EAAU,cAAc,GAExB,EAAiB,EAAU,OAAO,GAElC,EAAO,YAAc,EAAe,GACpC,EAAO,YAAc,EAAe,GAEpC,EAAO,EAAI,EAAe,QAAQ,EAAY,qBAG9C,EAAO,WAAY,EACnB,EAAO,GAAK,EAAe,GAC3B,EAAO,GAAK,EAAe,GAE3B,EAAO,GAAK,EAAO,GAAK,EAExB,EAAO,EAAI,EAAe,QAAQ,EAAY,0BAIlD,EAAY,QAAQ,GAAG,cAAe,SAAA,GAA2B,GAAf,GAAe,EAAf,YAC1C,EAAS,EAAY,aAEvB,GAAO,SACT,EAAe,OAAO,EAAO,GAC7B,EAAO,QAAS,EAChB,EAAY,WAAa,iIC/I7B,SAAS,GAAU,EAAS,GAC1B,GAAI,GAAe,EAAM,cAAc,IAAI,EAAS,EAOpD,OALK,KACH,EAAe,GAAI,GAAa,EAAS,GACzC,EAAa,OAAO,OAAS,GAGxB,EAzCT,GAAM,GAAe,EAAQ,mBACvB,EAAe,EAAQ,kBACvB,EAAe,EAAQ,WACvB,EAAe,EAAQ,WACvB,EAAe,EAAQ,kBACvB,EAAe,EAAQ,iBAEvB,IA6CN,GAAS,MAAQ,SAAU,EAAS,GAClC,OAAoF,IAA7E,EAAM,cAAc,eAAe,EAAS,GAAW,EAAQ,UAexE,EAAS,GAAK,SAAU,EAAM,EAAU,GAKtC,GAJI,EAAM,GAAG,OAAO,KAA+B,IAAtB,EAAK,OAAO,OACvC,EAAO,EAAK,OAAO,MAAM,OAGvB,EAAM,GAAG,MAAM,GAAO,CACxB,IAAA,GAAA,GAAwB,EAAxB,EAAA,MAAA,QAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,OAAA,cAA8B,CAAA,GAAA,EAAA,IAAA,EAAA,CAAA,GAAA,GAAA,EAAA,OAAA,KAAA,GAAA,EAAA,SAAA,CAAA,GAAA,EAAA,EAAA,OAAA,EAAA,KAAA,KAAA,GAAA,EAAA,MAAA,GAAnB,GAAmB,CAC5B,GAAS,GAAG,EAAW,EAAU,GAGnC,MAAO,GAGT,GAAI,EAAM,GAAG,OAAO,GAAO,CACzB,IAAK,GAAM,KAAQ,GACjB,EAAS,GAAG,EAAM,EAAK,GAAO,EAGhC,OAAO,GAkBT,MAdI,GAAM,SAAS,EAAa,WAAY,GAErC,EAAa,GAIhB,EAAa,GAAM,KAAK,GAHxB,EAAa,IAAS,GAQxB,EAAO,IAAI,EAAM,SAAU,EAAM,GAAY,QAAA,IAGxC,GAcT,EAAS,IAAM,SAAU,EAAM,EAAU,GAKvC,GAJI,EAAM,GAAG,OAAO,KAA+B,IAAtB,EAAK,OAAO,OACvC,EAAO,EAAK,OAAO,MAAM,OAGvB,EAAM,GAAG,MAAM,GAAO,CACxB,IAAA,GAAA,GAAwB,EAAxB,EAAA,MAAA,QAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,OAAA,cAA8B,CAAA,GAAA,EAAA,IAAA,EAAA,CAAA,GAAA,GAAA,EAAA,OAAA,KAAA,GAAA,EAAA,SAAA,CAAA,GAAA,EAAA,EAAA,OAAA,EAAA,KAAA,KAAA,GAAA,EAAA,MAAA,GAAnB,GAAmB,CAC5B,GAAS,IAAI,EAAW,EAAU,GAGpC,MAAO,GAGT,GAAI,EAAM,GAAG,OAAO,GAAO,CACzB,IAAK,GAAM,KAAQ,GACjB,EAAS,IAAI,EAAM,EAAK,GAAO,EAGjC,OAAO,GAGT,GAAK,EAAM,SAAS,EAAa,WAAY,GAGxC,CACH,GAAI,OAAA,EAEA,KAAQ,KACsD,KAA1D,EAAQ,EAAM,QAAQ,EAAa,GAAO,KAChD,EAAa,GAAM,OAAO,EAAO,OAPnC,GAAO,OAAO,EAAM,SAAU,EAAM,EAAU,EAWhD,OAAO,IAUT,EAAS,MAAQ,WACf,MAAO,IAIT,EAAS,kBAAqB,EAAM,eACpC,EAAS,aAAqB,EAAM,UACpC,EAAS,iBAAqB,EAAM,cACpC,EAAS,cAAqB,EAAM,WAEpC,EAAS,eAAuB,EAAM,eACtC,EAAS,qBAAuB,EAAM,qBACtC,EAAS,gBAAuB,EAAM,gBACtC,EAAS,QAAuB,EAAM,QAQtC,EAAS,cAAgB,WACvB,MAAO,GAAQ,eASjB,EAAS,qBAAuB,WAC9B,MAAO,GAAQ,sBAYjB,EAAS,KAAO,SAAU,GACxB,IAAK,GAAI,GAAI,EAAM,aAAa,OAAS,EAAG,GAAK,EAAG,IAClD,EAAM,aAAa,GAAG,KAAK,EAG7B,OAAO,IAYT,EAAS,qBAAuB,SAAU,GACxC,MAAI,GAAM,GAAG,OAAO,IAClB,EAAY,qBAAuB,EAE5B,MAGF,EAAY,sBAGrB,EAAS,YAAiB,EAAM,YAChC,EAAS,eAAiB,EAAM,eAEhC,EAAM,SAAW,EAEjB,EAAO,QAAU,8IC1KjB,SAAS,GAAT,GAAqD,GAAtB,GAAsB,EAAtB,YAAa,EAAS,EAAT,KACtC,GAAY,QACd,EAAY,OAAO,uBAAuB,GArE9C,GAAM,GAAe,EAAQ,kBACvB,EAAe,EAAQ,iBACvB,EAAe,EAAQ,WACvB,EAAe,EAAQ,cACvB,EAAe,EAAQ,oBAEa,EAAQ,oBAA1C,IAAA,aAAc,IAAA,eAetB,GAAa,UAAU,eAAiB,SAAU,GAChD,MAAI,wBAAwB,KAAK,IAC/B,KAAK,QAAQ,eAAiB,EACvB,MAGL,EAAG,KAAK,IACV,KAAK,QAAQ,eAAiB,EAAU,SAAW,QAC5C,MAGF,KAAK,QAAQ,gBAGtB,EAAa,UAAU,uBAAyB,SAAU,GACxD,GAAM,GAAU,KAAK,QAAQ,cAE7B,IAAgB,UAAZ,EAEJ,MAAgB,WAAZ,MACF,GAAM,sBAQJ,EAAO,iBAKP,uCAAuC,KAAK,EAAM,OAKlD,EAAG,QAAQ,EAAM,SACd,EAAgB,EAAM,OAAQ,0EAIrC,EAAM,kBASR,KAAA,OAA2B,OAAQ,OAAQ,KAAM,UAAjD,EAAA,EAAA,EAAA,EAAA,OAAA,IAA4D,CAAvD,GAAM,GAAA,EAAA,EACT,GAAY,QAAQ,GAAG,EAAa,GAItC,EAAY,UAAU,UAAY,SAA4B,GAC5D,IAAA,GAAA,GAA0B,EAAM,aAAhC,EAAA,MAAA,QAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,OAAA,cAA8C,CAAA,GAAA,EAAA,IAAA,EAAA,CAAA,GAAA,GAAA,EAAA,OAAA,KAAA,GAAA,EAAA,SAAA,CAAA,GAAA,EAAA,EAAA,OAAA,EAAA,KAAA,KAAA,GAAA,EAAA,MAAA,GAAnC,GAAmC,CAE5C,IAAI,EAAY,UACR,EAAY,UAAY,EAAM,QAC3B,EAAa,EAAY,QAAS,EAAM,SAGjD,WADA,GAAY,OAAO,uBAAuB,qJC1DhD,SAAS,GAAe,GACtB,GAAM,GAAc,EAAM,OACpB,EAAc,EAAQ,OAAO,EAAO,EAAM,KAAM,EAEjD,IAED,EAAY,SACT,EAAM,UAAY,EAAY,QAAQ,SACtC,EAAM,UAAY,EAAY,QAAQ,SACtC,IAAkB,EAAY,QAAQ,SAE3C,EAAY,YAAY,GAAK,EAC7B,EAAY,UAAY,IAAK,GAAI,OAAO,UAExC,EAAc,MACZ,YAAA,EACA,MAAA,EACA,YAAA,EACA,QAAS,EACT,KAAM,SA9CZ,GAAM,GAAgB,EAAQ,WACxB,EAAgB,EAAQ,kBACxB,EAAgB,EAAQ,mBACxB,EAAgB,EAAQ,6BACxB,EAAgB,EAAQ,0BAEX,EAAQ,kBAAnB,IAAA,OAEF,EAAW,OAAO,UAAU,QA2ClC,IAzCK,EAAO,MAAM,UAChB,EAAO,MAAM,QAAU,SAAU,GAC/B,MAA8B,mBAAvB,EAAS,KAAK,KAIpB,OAAO,UAAU,OACpB,OAAO,UAAU,KAAO,WACtB,MAAO,MAAK,QAAQ,qCAAsC,MAiC1D,EAAQ,MAAO,CACjB,GAAM,GAAY,SAAU,GAC1B,IAAA,GAAA,GAA0B,EAAM,aAAhC,EAAA,MAAA,QAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,OAAA,cAA8C,CAAA,GAAA,EAAA,IAAA,EAAA,CAAA,GAAA,GAAA,EAAA,OAAA,KAAA,GAAA,EAAA,SAAA,CAAA,GAAA,EAAA,EAAA,OAAA,EAAA,KAAA,KAAA,GAAA,EAAA,MAAA,GAAnC,GAAmC,CACxC,GAAY,eACd,EAAY,OAAO,uBAAuB,KAK1C,EAAW,SAAA,EAAiC,GAAY,GAAxB,GAAwB,EAAxB,IAC9B,GADsD,EAAnB,IACY,IAAjC,EAAW,QAAQ,UACnC,EAAO,IAAM,EAAO,OAGxB,GAAY,EAAK,cAAe,GAE5B,GACF,EAAY,EAAK,WAAY,GAIjC,GAAM,QAAQ,GAAG,eAAmB,GACpC,EAAM,QAAQ,GAAG,kBAAmB,GAGtC,EAAO,QAAU,4KCyGjB,SAAS,GAAU,EAAS,EAAQ,GAClC,MAAQ,IAAW,EAAQ,UACf,IAAW,EAAQ,YAClB,GAAkB,EAAQ,SAxLzC,GAAM,GAAgB,EAAQ,oBACxB,EAAgB,EAAQ,kBACxB,EAAgB,EAAQ,mBAExB,GACJ,SAEA,WAAY,SAAU,GAAK,GACjB,GAAkC,EAAlC,YAAyB,EAAS,EAArB,WACb,EAAiC,EAAjC,OAAQ,EAAyB,EAAzB,QAAS,EAAgB,EAAhB,YACnB,EAAO,EAAO,QAAQ,EAExB,IACF,EAAY,KAAO,EAAK,EAAI,EAAK,KACjC,EAAY,IAAO,EAAK,EAAI,EAAK,IAEjC,EAAY,MAAS,EAAK,MAAS,EAAK,EACxC,EAAY,OAAS,EAAK,OAAS,EAAK,EAElC,SAAY,KAAS,EAAK,MAAS,EAAK,MAAS,EAAK,MACtD,UAAY,KAAS,EAAK,OAAS,EAAK,OAAS,EAAK,MAG5D,EAAY,KAAO,EAAY,IAAM,EAAY,MAAQ,EAAY,OAAS,EAGhF,EAAI,KAAO,EACX,EAAI,aAAe,EACnB,EAAI,QAAU,CAEd,KAAK,GAAI,GAAI,EAAG,EAAI,EAAU,MAAM,OAAQ,IAAK,CAC/C,GAAM,GAAe,EAAU,MAAM,EAErC,GAAI,QAAU,EAAO,QAAQ,EAAY,SAAS,MAAM,GAEnD,EAAI,UAIT,EAAY,gBAAgB,GAAgB,EAAU,GAAc,UAAU,MAIlF,OAAQ,SAAU,GAWhB,IAAA,GAVQ,GAAkD,EAAlD,YAAa,EAAqC,EAArC,SAAU,EAA2B,EAA3B,OAAQ,EAAmB,EAAnB,eACjC,EAAS,KAAW,EAAI,YACxB,GACJ,GAAI,EACJ,GAAI,EACJ,SAAS,EACT,QAAQ,EACR,YAAY,GAGd,EAA2B,EAAU,MAArC,EAAA,MAAA,QAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,OAAA,cAA4C,CAAA,GAAA,EAAA,IAAA,EAAA,CAAA,GAAA,GAAA,EAAA,OAAA,KAAA,GAAA,EAAA,SAAA,CAAA,GAAA,EAAA,EAAA,OAAA,EAAA,KAAA,KAAA,GAAA,EAAA,MAAA,GAAjC,GAAiC,EACpC,EAAW,EAAU,GACrB,EAAU,EAAY,OAAO,QAAQ,EAAY,SAAS,MAAM,EAEjE,GAAS,EAAS,EAAQ,KAE/B,EAAI,OAAS,EAAI,OAAS,EAAS,GACnC,EAAI,QAAU,EACd,EAAI,OAAS,EAAI,YAAY,gBAAgB,GAE7C,EAAS,IAAI,GAET,EAAI,OAAO,SACb,EAAO,GAAK,EAAI,OAAO,GACvB,EAAO,GAAK,EAAI,OAAO,GAEvB,EAAO,IAAM,EAAI,OAAO,GACxB,EAAO,IAAM,EAAI,OAAO,GAExB,EAAO,QAAS,IAUpB,MAFA,GAAO,YAAc,EAAI,SAAW,EAAO,QAAU,EAAI,OAAO,QAEzD,GAGT,cAAe,SAAU,GACvB,IAAA,GAAA,GAA2B,EAAU,MAArC,EAAA,MAAA,QAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,OAAA,cAA4C,CAAA,GAAA,EAAA,IAAA,EAAA,CAAA,GAAA,GAAA,EAAA,OAAA,KAAA,GAAA,EAAA,SAAA,CAAA,GAAA,EAAA,EAAA,OAAA,EAAA,KAAA,KAAA,GAAA,EAAA,MAAA,GAAjC,GAAiC,EACpC,EAAS,EAAS,MAExB,GAAO,GAAK,EAAO,GAAK,EACxB,EAAO,UAAY,EAAO,UAAY,IACtC,EAAO,QAAS,EAChB,EAAO,SAAU,EAEjB,EAAS,GAAgB,EAG3B,MAAO,IAGT,MAAO,SAAA,EAA2B,GAAY,GAA3B,GAA2B,EAA3B,YACX,GACJ,YAAA,EACA,YAA4B,kBAAf,EACA,EAAY,UAAY,EAAY,aAAa,KAC9D,YAAa,EAAY,YACzB,SAAU,EAAY,iBACtB,QAAQ,EACR,gBAAgB,EAGlB,GAAU,WAAW,GACrB,EAAU,cAAc,EAAI,UAE5B,EAAI,WAAa,KAAW,EAAY,YAAY,MACpD,EAAY,eAAiB,EAAU,OAAO,IAIlD,GAAY,QAAQ,GAAG,MAAO,SAAU,GACtC,EAAY,aAAqB,KAAM,EAAG,MAAO,EAAG,IAAK,EAAG,OAAQ,GACpE,EAAY,mBACZ,EAAY,iBAAmB,EAAU,kBACzC,EAAY,eAAmB,OAGjC,EAAY,QAAQ,GAAG,eAAiB,EAAU,OAClD,EAAY,QAAQ,GAAG,gBAAiB,EAAU,OAElD,EAAY,QAAQ,GAAG,qBAAsB,SAAA,GAA0D,GAA9C,GAA8C,EAA9C,YAAa,EAAiC,EAAjC,OAAQ,EAAyB,EAAzB,sBACtE,EAAiB,EAAU,QAC/B,YAAA,EACA,OAAA,EACA,WAAY,EAAY,UAAU,KAClC,SAAU,EAAY,iBACtB,gBAAgB,KAKb,EAAe,YAAc,IAChC,EAAY,eAAgB,GAG9B,EAAY,eAAiB,IAG/B,EAAY,QAAQ,GAAG,aAAc,SAAA,GACnC,IAAK,GAD0C,GAAsB,EAAtB,YAAa,EAAS,EAAT,MACnD,EAAI,EAAG,EAAI,EAAU,MAAM,OAAQ,IAAK,CAI/C,GAAI,EAHY,EAAY,OAAO,QAAQ,EAAY,SAAS,MAAM,EAAU,MAAM,KAGhE,GAAM,GAAO,CAEjC,EAAY,QAAS,MAAA,EAAO,QAAQ,GACpC,WAKN,EAAc,QAAQ,GAAG,SAAU,SAAU,GAI3C,IAAK,GAHG,GAAwB,EAAxB,OAAQ,EAAgB,EAAhB,YACV,EAAc,KAAW,GAEtB,EAAI,EAAG,EAAI,EAAU,MAAM,OAAQ,IAAK,CAC/C,GAAM,GAAe,EAAU,MAAM,EAGrC,IAFA,EAAY,QAAU,EAAY,OAAO,QAAQ,EAAY,SAAS,MAAM,GAEvE,EAAY,QAAjB,CAIA,GAAM,GAAW,EAAU,EAE3B,GAAY,OAAS,EAAY,iBAAiB,GAElD,EAAO,GAAgB,EAAS,aAAa,OAUjD,EAAO,QAAU,mGC3FjB,SAAS,GAAoB,EAAO,EAAa,GAC/C,MAAI,GAAM,GAAG,SAAS,GACb,EAAM,gBAAgB,EAAO,EAAY,OAAQ,EAAY,SAAU,EAAK,EAAG,EAAK,EAAG,IAEvF,EAAM,gBAAgB,EAAO,EAAY,OAAQ,EAAY,SApGxE,GAAM,GAAiB,EAAQ,WACzB,EAAiB,EAAQ,YACzB,EAAiB,EAAQ,qBAEzB,GACJ,UACE,SAAa,EACb,SAAa,EACb,YAAa,KACb,YAAa,MAGf,UAAW,SAAA,GAA0C,GAA9B,GAA8B,EAA9B,KAAM,EAAwB,EAAxB,YAAa,EAAW,EAAX,QAClC,EAAc,GAAW,EAAQ,YACjC,IAaN,OAXI,IAAQ,GACV,EAAO,KAAO,EAAY,KAAQ,EAAK,MAAS,EAAY,KAC5D,EAAO,IAAO,EAAY,IAAQ,EAAK,OAAS,EAAY,IAE5D,EAAO,MAAS,EAAY,MAAU,EAAK,OAAU,EAAI,EAAY,OACrE,EAAO,OAAS,EAAY,OAAU,EAAK,QAAU,EAAI,EAAY,SAGrE,EAAO,KAAO,EAAO,IAAM,EAAO,MAAQ,EAAO,OAAS,EAGrD,GAGT,IAAK,SAAA,GAAwD,GAA5C,GAA4C,EAA5C,WAAY,EAAgC,EAAhC,YAAa,EAAmB,EAAnB,OAAQ,EAAW,EAAX,OAChD,KAAK,EAAW,MAAO,EAEvB,IAAM,GAAO,EAAO,aACd,EAAG,EAAO,EAAG,EAAG,EAAO,GACzB,EAAM,UAAW,GAEf,EAAc,EAAmB,EAAQ,YAAa,EAAa,EAEzE,KAAK,EAAe,MAAO,EAE3B,GAAO,GAAK,EACZ,EAAO,GAAK,EACZ,EAAO,QAAS,CAEhB,IAAM,GAAO,EACT,EAAY,EAAK,EACjB,EAAY,EAAK,EAEf,EAAS,EAAY,gBAAgB,QAKvC,MAAO,IAAe,KAAO,IAC/B,EAAY,KAAK,IAAI,KAAK,IAAI,EAAK,EAAI,EAAK,MAAS,EAAO,MAAQ,EAAK,GAAI,EAAK,EAAI,EAAO,MAC7F,EAAY,KAAK,IAAI,KAAK,IAAI,EAAK,EAAI,EAAK,OAAS,EAAO,OAAQ,EAAK,GAAI,EAAK,EAAI,EAAO,OAG7F,EAAY,KAAK,IAAI,KAAK,IAAI,EAAK,MAAS,EAAO,MAAQ,EAAK,GAAI,EAAK,KAAO,EAAO,MACvF,EAAY,KAAK,IAAI,KAAK,IAAI,EAAK,OAAS,EAAO,OAAQ,EAAK,GAAI,EAAK,IAAO,EAAO,MAGzF,EAAO,GAAK,EAAY,EAAK,EAC7B,EAAO,GAAK,EAAY,EAAK,EAE7B,EAAO,QAAU,EAAO,YAAc,GAAa,EAAO,YAAc,EACxE,EAAO,UAAY,EAAO,KAAM,EAAO,IAEvC,EAAO,UAAY,EACnB,EAAO,UAAY,GAGrB,aAAc,SAAA,GAAoD,GAAxC,GAAwC,EAAxC,KAAM,EAAkC,EAAlC,OAAQ,EAA0B,EAA1B,OAAQ,EAAkB,EAAlB,MAAO,EAAW,EAAX,QAC/C,EAAc,GAAW,EAAQ,WAEvC,IAAI,GAAW,EAAQ,UACJ,UAAV,IAAqB,IAAe,EAAO,SAE9C,EAAO,OAMT,MALA,GAAK,GAAK,EAAO,GACjB,EAAK,GAAK,EAAO,GACjB,EAAO,GAAK,EAAO,GACnB,EAAO,GAAK,EAAO,IAGjB,GAAI,EAAO,GACX,GAAI,EAAO,KAMnB,mBAAA,EAWF,GAAU,SAAW,EACrB,EAAU,MAAM,KAAK,YAErB,EAAe,UAAU,SAAW,EAAS,SAE7C,EAAO,QAAU,wFClGjB,IAAM,GAAiB,EAAQ,WACzB,EAAiB,EAAQ,YACzB,EAAiB,EAAQ,iBACzB,EAAiB,EAAQ,qBACzB,EAAiB,EAAQ,uBAEA,EAAQ,cAA/B,IAAA,mBAEF,GAAY,IAAM,EAAA,EAAU,KAAO,EAAA,EAAU,QAAS,EAAA,EAAU,OAAQ,EAAA,GACxE,GAAY,KAAM,EAAA,EAAU,MAAO,EAAA,EAAU,OAAS,EAAA,EAAU,MAAQ,EAAA,GAExE,GACJ,UACE,SAAS,EACT,SAAS,EACT,IAAK,KACL,IAAK,KACL,OAAQ,MAGV,UAAW,SAAA,GAAiD,GAArC,GAAqC,EAArC,YAAa,EAAwB,EAAxB,YAAa,EAAW,EAAX,OAC/C,KAAK,EACH,MAAO,GAAM,UAAW,EAG1B,IAAM,GAAS,EAAmB,EAAQ,OAAQ,EAAa,EAAY,YAAY,KAEvF,OAAI,IAEA,IAAQ,EAAY,IAAS,EAAO,EACpC,KAAQ,EAAY,KAAS,EAAO,EACpC,OAAQ,EAAY,OAAS,EAAO,EACpC,MAAQ,EAAY,MAAS,EAAO,GAIjC,GAGT,IAAK,SAAA,GAAgE,GAApD,GAAoD,EAApD,WAAY,EAAwC,EAAxC,YAAa,EAA2B,EAA3B,OAAQ,EAAmB,EAAnB,OAAQ,EAAW,EAAX,QAClD,EAAQ,EAAY,SAAS,aAAe,EAAY,SAAS,KAEvE,IAAK,EAAY,eAAkB,EAAnC,CAIA,GAAM,GAAO,EAAO,aACd,EAAG,EAAO,EAAG,EAAG,EAAO,GACzB,EAAM,UAAW,GACf,EAAQ,EAAU,WAAW,EAAmB,EAAQ,MAAO,EAAa,KAAU,EACtF,EAAQ,EAAU,WAAW,EAAmB,EAAQ,MAAO,EAAa,KAAU,EAExF,EAAY,EAAK,EACjB,EAAY,EAAK,CAErB,GAAO,GAAK,EACZ,EAAO,GAAK,EACZ,EAAO,QAAS,EAEZ,EAAM,IACR,EAAY,KAAK,IAAI,KAAK,IAAI,EAAM,IAAS,EAAO,IAAQ,EAAK,GAAI,EAAM,IAAS,EAAO,KAEpF,EAAM,SACb,EAAY,KAAK,IAAI,KAAK,IAAI,EAAM,OAAS,EAAO,OAAQ,EAAK,GAAI,EAAM,OAAS,EAAO,SAEzF,EAAM,KACR,EAAY,KAAK,IAAI,KAAK,IAAI,EAAM,KAAS,EAAO,KAAQ,EAAK,GAAI,EAAM,KAAS,EAAO,MAEpF,EAAM,QACb,EAAY,KAAK,IAAI,KAAK,IAAI,EAAM,MAAS,EAAO,MAAQ,EAAK,GAAI,EAAM,MAAS,EAAO,QAG7F,EAAO,GAAK,EAAY,EAAK,EAC7B,EAAO,GAAK,EAAY,EAAK,EAE7B,EAAO,QAAU,EAAO,YAAc,GAAa,EAAO,YAAc,EACxE,EAAO,UAAY,EAAO,KAAM,EAAO,IAEvC,EAAO,UAAY,EACnB,EAAO,UAAY,IAGrB,aAAc,SAAA,GAAoD,GAAxC,GAAwC,EAAxC,KAAM,EAAkC,EAAlC,OAAQ,EAA0B,EAA1B,OAAQ,EAAkB,EAAlB,MAAO,EAAW,EAAX,OACrD,IAAI,GAAW,EAAQ,UACJ,UAAV,IAAqB,EAAO,SAE/B,EAAO,OAMT,MALA,GAAK,GAAK,EAAO,GACjB,EAAK,GAAK,EAAO,GACjB,EAAO,GAAK,EAAO,GACnB,EAAO,GAAK,EAAO,IAGjB,GAAI,EAAO,GACX,GAAI,EAAO,KAMnB,QAAA,EACA,QAAA,EACA,mBAAA,EAGF,GAAU,cAAgB,EAC1B,EAAU,MAAM,KAAK,iBAErB,EAAe,UAAU,cAAgB,EAAc,SACvD,EAAO,SAAS,cAAyB,EAAc,SAEvD,EAAO,QAAU,kJC/GjB,IAAM,GAAiB,EAAQ,WACzB,EAAiB,EAAQ,mBACzB,EAAiB,EAAQ,YACzB,EAAiB,EAAQ,iBACzB,EAAiB,EAAQ,qBACzB,EAAiB,EAAQ,qBAEzB,GAAU,OAAQ,EAAA,EAAU,QAAS,EAAA,GACrC,GAAU,MAAQ,EAAA,EAAU,OAAS,EAAA,GAErC,GACJ,UACE,SAAS,EACT,SAAS,EACT,IAAK,KACL,IAAK,MAGP,UAAW,SAAA,GACT,MADoC,GAAf,YACF,aAGrB,IAAK,SAAU,GAAK,GACV,GAAyB,EAAzB,YAAa,EAAY,EAAZ,QACf,EAAQ,EAAY,SAAS,aAAe,EAAY,SAAS,KAEvE,IAAK,EAAY,eAAkB,EAAnC,CAIA,GAAM,GAAO,EAAU,WAAW,EAAY,YAAY,UAEpD,EAAU,EAAU,WAAW,EAAc,mBAAmB,EAAQ,IAAK,KAAiB,EAC9F,EAAU,EAAU,WAAW,EAAc,mBAAmB,EAAQ,IAAK,KAAiB,CAEpG,GAAI,SACF,QAAS,EAAQ,QACjB,QAAS,EAAQ,QACjB,MAAO,EAAM,UAAW,EAAc,SACtC,MAAO,EAAM,UAAW,EAAc,UAGpC,EAAM,KACR,EAAI,QAAQ,MAAM,IAAM,EAAK,OAAS,EAAQ,OAC9C,EAAI,QAAQ,MAAM,IAAM,EAAK,OAAS,EAAQ,QAEvC,EAAM,SACb,EAAI,QAAQ,MAAM,OAAS,EAAK,IAAM,EAAQ,OAC9C,EAAI,QAAQ,MAAM,OAAS,EAAK,IAAM,EAAQ,QAE5C,EAAM,MACR,EAAI,QAAQ,MAAM,KAAO,EAAK,MAAQ,EAAQ,MAC9C,EAAI,QAAQ,MAAM,KAAO,EAAK,MAAQ,EAAQ,OAEvC,EAAM,QACb,EAAI,QAAQ,MAAM,MAAQ,EAAK,KAAO,EAAQ,MAC9C,EAAI,QAAQ,MAAM,MAAQ,EAAK,KAAO,EAAQ,OAGhD,EAAc,IAAI,KAGpB,aAAc,EAAc,aAG9B,GAAU,aAAe,EACzB,EAAU,MAAM,KAAK,gBAErB,EAAe,UAAU,aAAe,EAAa,SACrD,EAAO,SAAS,aAAwB,EAAa,SAErD,EAAO,QAAU,uJClFjB,IAAM,GAAiB,EAAQ,WACzB,EAAiB,EAAQ,eACzB,EAAiB,EAAQ,YACzB,EAAiB,EAAQ,qBAEzB,GACJ,UACE,SAAS,EACT,SAAS,EACT,MAAS,EAAA,EACT,QAAS,KACT,QAAS,KAET,eAAgB,MAGlB,UAAW,SAAA,GAA8E,GAAlE,GAAkE,EAAlE,YAAa,EAAqD,EAArD,aAAc,EAAuC,EAAvC,QAAS,EAA8B,EAA9B,KAAM,EAAwB,EAAxB,YAAa,EAAW,EAAX,QACtE,KACA,EAAgB,EAAM,SAAS,EAAM,gBAAgB,EAAQ,SAC7D,EAAS,GAAiB,EAAM,YAAY,EAAc,EAAS,EAAY,SAAS,KAC9F,GAAU,GAAW,EAAa,QAAQ,EAAY,SAAS,MAAM,QAErE,IAAI,OAAA,EAEJ,IAAuB,gBAAnB,EAAQ,OACV,GACE,EAAG,EAAY,YAAY,KAAK,EAAI,EAAO,EAC3C,EAAG,EAAY,YAAY,KAAK,EAAI,EAAO,OAGzC,CACJ,GAAM,GAAa,EAAM,gBAAgB,EAAQ,OAAQ,EAAc,GAAU,GAEjF,GAAa,EAAM,SAAS,KAAiB,EAAG,EAAG,EAAG,GAGxD,GAAI,GAAQ,EAAQ,gBAAkB,EAAQ,eAAe,OAC3D,IAAA,GAAA,GAA6C,EAAQ,eAArD,EAAA,MAAA,QAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,OAAA,cAAqE,CAAA,GAAA,EAAA,IAAA,EAAA,CAAA,GAAA,GAAA,EAAA,OAAA,KAAA,GAAA,EAAA,SAAA,CAAA,GAAA,EAAA,EAAA,OAAA,EAAA,KAAA,KAAA,GAAA,EAAA,MAAA,GAAA,GAAA,EAArD,EAAqD,EAAxD,EAAiB,EAAuC,EAA1C,CACzB,GAAQ,MACN,EAAG,EAAY,KAAQ,EAAK,MAAS,EAAa,EAAW,EAC7D,EAAG,EAAY,IAAQ,EAAK,OAAS,EAAa,EAAW,QAKjE,GAAQ,KAAK,EAGf,OAAO,IAGT,IAAK,SAAA,GAAyE,GAA7D,GAA6D,EAA7D,YAAa,EAAgD,EAAhD,WAAY,EAAoC,EAApC,OAAQ,EAA4B,EAA5B,QAAiB,EAAW,EAAnB,OACnD,KACF,MAAA,GACA,MAAA,GACA,MAAA,EAEJ,IAAI,EAAO,YACT,GAAS,EAAG,EAAO,EAAG,EAAG,EAAO,OAE7B,CACH,GAAM,GAAS,EAAM,YAAY,EAAY,OAAQ,EAAY,QAAS,EAAY,SAAS,KAE/F,GAAO,EAAM,UAAW,GAExB,EAAK,GAAK,EAAO,EACjB,EAAK,GAAK,EAAO,EAGnB,EAAO,MAAQ,EAAK,EACpB,EAAO,MAAQ,EAAK,CAIpB,KAAA,GAFI,GAAM,EAAQ,QAAS,EAAQ,QAAQ,OAAS,EAEpD,EAAyC,EAAzC,EAAA,MAAA,QAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,OAAA,cAAkD,CAAA,GAAA,EAAA,IAAA,EAAA,CAAA,GAAA,GAAA,EAAA,OAAA,KAAA,GAAA,EAAA,SAAA,CAAA,GAAA,EAAA,EAAA,OAAA,EAAA,KAAA,KAAA,GAAA,EAAA,MAIhD,IAAA,GAJgD,GAAA,EAAlC,EAAkC,EAArC,EAAe,EAAsB,EAAzB,EACjB,EAAY,EAAK,EAAI,EACrB,EAAY,EAAK,EAAI,EAE3B,EAAyB,EAAQ,QAAjC,EAAA,MAAA,QAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,OAAA,cAA0C,CAAA,GAAA,EAAA,IAAA,EAAA,CAAA,GAAA,GAAA,EAAA,OAAA,KAAA,GAAA,EAAA,SAAA,CAAA,GAAA,EAAA,EAAA,OAAA,EAAA,KAAA,KAAA,GAAA,EAAA,MAAA,GAA/B,GAA+B,CAEtC,GADE,EAAM,GAAG,SAAS,GACX,EAAW,EAAW,EAAW,GAGjC,EAGN,GAEL,EAAQ,MACN,EAAG,EAAM,GAAG,OAAO,EAAO,GAAM,EAAO,EAAI,EAAW,EACtD,EAAG,EAAM,GAAG,OAAO,EAAO,GAAM,EAAO,EAAI,EAAW,EAEtD,MAAO,EAAM,GAAG,OAAO,EAAO,OAAQ,EAAO,MAAO,EAAQ,SAKlE,GAAM,IACJ,OAAQ,KACR,SAAS,EACT,SAAU,EACV,MAAO,EACP,GAAI,EACJ,GAAI,EAGN,KAAK,EAAI,EAAG,EAAM,EAAQ,OAAQ,EAAI,EAAK,IAAK,CAC9C,EAAS,EAAQ,EAEjB,IAAM,GAAQ,EAAO,MACf,EAAK,EAAO,EAAI,EAAK,EACrB,EAAK,EAAO,EAAI,EAAK,EACrB,EAAW,EAAM,MAAM,EAAI,GAC7B,EAAU,GAAY,CAItB,KAAU,EAAA,GAAY,EAAQ,SAAW,EAAQ,QAAU,EAAA,IAC7D,GAAU,GAGP,EAAQ,UAAW,EAEjB,EAAQ,SAAW,IAAU,EAAA,EAE9B,EAAW,EAAQ,EAAQ,SAAW,EAAQ,MAE7C,IAAU,EAAA,GAAY,EAAQ,QAAU,EAAA,GAE1C,EAAW,EAAQ,UAEhB,EAAQ,SAAW,EAAW,EAAQ,YAE5C,EAAQ,OAAS,EACjB,EAAQ,SAAW,EACnB,EAAQ,MAAQ,EAChB,EAAQ,QAAU,EAClB,EAAQ,GAAK,EACb,EAAQ,GAAK,EAEb,EAAO,MAAQ,GAInB,GAAI,OAAA,EAEA,GAAQ,QACV,EAAe,EAAO,YAAc,EAAQ,OAAO,GAAK,EAAO,YAAc,EAAQ,OAAO,EAE5F,EAAO,UAAY,EAAQ,OAAO,EAClC,EAAO,UAAY,EAAQ,OAAO,IAGlC,GAAc,EAEd,EAAO,UAAY,IACnB,EAAO,UAAY,KAGrB,EAAO,GAAK,EAAQ,GACpB,EAAO,GAAK,EAAQ,GAEpB,EAAO,QAAW,GAAgB,EAAQ,UAAY,EAAO,OAC7D,EAAO,OAAS,EAAQ,SAG1B,aAAc,SAAA,GAAoD,GAAxC,GAAwC,EAAxC,KAAM,EAAkC,EAAlC,OAAQ,EAA0B,EAA1B,OAAQ,EAAkB,EAAlB,MAAO,EAAW,EAAX,QAC/C,EAAiB,GAAW,EAAQ,cAE1C,IAAI,GAAW,EAAQ,UACJ,UAAV,IAAqB,IAAkB,EAAe,QAS7D,MAPI,GAAO,SACT,EAAK,GAAK,EAAO,GACjB,EAAK,GAAK,EAAO,GACjB,EAAO,GAAK,EAAO,GACnB,EAAO,GAAK,EAAO,KAInB,MAAS,EAAO,MAChB,OAAS,EAAO,OAChB,EAAS,EAAO,UAChB,EAAS,EAAO,UAChB,MAAS,EAAO,MAChB,MAAS,EAAO,MAChB,GAAS,EAAO,GAChB,GAAS,EAAO,KAMxB,GAAS,eAAiB,SAAU,GAClC,MAAO,UAAU,EAAG,GAClB,GAAM,GAAS,EAAK,SAClB,MAAS,EAAA,EACT,MAAS,EAAA,EACT,KAAS,EAAA,EACT,OAAS,EAAA,GAEP,EAAU,EACV,EAAU,CAEV,GAAM,GAAG,OAAO,EAAK,UACvB,EAAU,EAAK,OAAO,EACtB,EAAU,EAAK,OAAO,EAGxB,IAAM,GAAQ,KAAK,OAAO,EAAI,GAAW,EAAK,GACxC,EAAQ,KAAK,OAAO,EAAI,GAAW,EAAK,EAK9C,QACE,EAJW,KAAK,IAAI,EAAO,KAAM,KAAK,IAAI,EAAO,MAAQ,EAAQ,EAAK,EAAI,IAK1E,EAJW,KAAK,IAAI,EAAO,IAAM,KAAK,IAAI,EAAO,OAAQ,EAAQ,EAAK,EAAI,IAK1E,MAAO,EAAK,SAKlB,EAAU,KAAO,EACjB,EAAU,MAAM,KAAK,QAErB,EAAe,UAAU,KAAO,EAAK,SAErC,EAAO,QAAU,yGCjOjB,IAAM,GAAiB,EAAQ,WACzB,EAAiB,EAAQ,UACzB,EAAiB,EAAQ,qBACzB,EAAiB,EAAQ,qBACzB,EAAiB,EAAQ,aAEzB,GACJ,UACE,SAAS,EACT,SAAS,EACT,MAAS,EAAA,EACT,QAAS,KACT,QAAS,MAGX,UAAW,SAAU,GAAK,GAChB,GAAyB,EAAzB,YAAa,EAAY,EAAZ,QACf,EAAQ,EAAY,SAAS,KAEnC,IAAK,EAAL,CAEA,EAAI,SACF,iBACE,EAAG,EAAM,KAAM,EAAI,EACnB,EAAG,EAAM,IAAM,EAAI,IAErB,QAAU,EAAG,EAAG,EAAG,GACnB,OAAQ,OACR,MAAO,EAAQ,MAGjB,IAAM,GAAU,EAAK,UAAU,EAG/B,OAFA,GAAI,QAAU,EAEP,IAGT,IAAK,SAAU,GAAK,GACV,GAA6C,EAA7C,YAAa,EAAgC,EAAhC,QAAS,EAAuB,EAAvB,OAAQ,EAAe,EAAf,WAChC,EAAO,EAAM,UAAW,GACxB,EAAY,EAAK,EAAI,EAAO,GAAG,EAC/B,EAAY,EAAK,EAAI,EAAO,GAAG,CAErC,GAAI,QAAU,EAAM,UAAW,GAC/B,EAAI,QAAQ,UAEZ,KAAA,GAAA,GAAyB,EAAQ,QAAjC,EAAA,MAAA,QAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,OAAA,cAA0C,CAAA,GAAA,EAAA,IAAA,EAAA,CAAA,GAAA,GAAA,EAAA,OAAA,KAAA,GAAA,EAAA,SAAA,CAAA,GAAA,EAAA,EAAA,OAAA,EAAA,KAAA,KAAA,GAAA,EAAA,MAAA,GAA/B,GAA+B,EACpC,MAAA,EAGF,GADE,EAAM,GAAG,SAAS,GACX,EAAW,EAAW,EAAW,GAGjC,EAGN,IAED,SAAW,IAAU,UAAY,KACnC,EAAO,EAAI,EAAO,MAClB,EAAO,EAAI,EAAO;cAGpB,EAAI,QAAQ,QAAQ,KAAK,IAG3B,EAAK,IAAI,IAGX,aAAc,SAAU,GAAK,GACnB,GAAY,EAAZ,OAER,GAAI,QAAU,EAAM,UAAW,GAC/B,EAAI,QAAQ,QAAU,EAAQ,QAC9B,EAAI,QAAQ,gBAAkB,MAE9B,EAAK,aAAa,IAItB,GAAU,SAAW,EACrB,EAAU,MAAM,KAAK,YAErB,EAAe,UAAU,SAAW,EAAS,SAC7C,EAAO,SAAS,SAAoB,EAAS,SAE7C,EAAO,QAAU,2NCzFjB,GAAM,GAAe,EAAQ,wBAE7B,GAAO,QAAP,WACE,QAAA,GAAa,EAAM,EAAS,EAAO,EAAa,GAiB9C,GAjB2D,EAAA,KAAA,GAC3D,EAAa,cAAc,KAAM,GAE7B,IAAU,GACZ,EAAa,cAAc,KAAM,GAGnC,KAAK,YAAc,EAEnB,KAAK,WAAgB,GAAI,OAAO,UAChC,KAAK,cAAgB,EACrB,KAAK,KAAgB,EACrB,KAAK,UAAgB,EAAa,aAAa,GAC/C,KAAK,YAAgB,EAAa,eAAe,GACjD,KAAK,OAAgB,EACrB,KAAK,cAAgB,KAER,QAAT,EAAgB,CAClB,GAAM,GAAe,EAAY,gBAAgB,EACjD,MAAK,GAAK,KAAK,UAAY,EAAY,UAAU,EAEjD,IAAM,GAAW,KAAK,UAAY,EAAY,OAE9C,MAAK,UAAY,EAAY,SACK,cAA7B,EAAY,QAAQ,MACpB,EAAY,QAAQ,SAAW,KAAK,QACpC,EAAW,SAEA,cAAT,IACP,KAAK,GAAK,EAAQ,UAAY,EAAY,SA9BhD,MAAA,GAAA,UAkCE,eAlCF,SAAA,GAkC8C,GAAvB,GAAuB,EAA1B,EAAe,EAAW,EAAd,CAM5B,OALA,MAAK,OAAW,EAChB,KAAK,OAAW,EAChB,KAAK,SAAW,EAChB,KAAK,SAAW,EAET,MAxCX,EAAA,UA2CE,UA3CF,SAAA,GA2CyC,GAAvB,GAAuB,EAA1B,EAAe,EAAW,EAAd,CAMvB,OALA,MAAK,OAAW,EAChB,KAAK,OAAW,EAChB,KAAK,SAAW,EAChB,KAAK,SAAW,EAET,MAjDX,EAAA,UAoDE,eApDF,WAqDI,KAAK,cAAc,kBArDvB,EAAA,UAwDE,gBAxDF,WAyDI,KAAK,oBAAqB,GAzD9B,EAAA,UA4DE,yBA5DF,WA6DI,KAAK,4BAA8B,KAAK,oBAAqB,GA7DjE,oEC+BA,SAAS,GAAM,GAkBb,IAAK,GAhBH,GAIE,EAJF,YAAa,EAIX,EAJW,QAAS,EAIpB,EAJoB,MAAO,EAI3B,EAJ2B,YAFb,EAMd,EAHF,KAAA,MAHgB,KAAA,EAGT,EAAI,aAAa,KAHR,EAAA,EAMd,EAFF,QAAA,MAJgB,KAAA,EAIN,EAAoB,GAJd,EAAA,EAMd,EADF,aAAA,MALgB,KAAA,EAKD,GAAI,GAAa,EAAM,EAAS,EAAO,EAAa,GALnD,EAQZ,GACJ,YAAA,EACA,QAAA,EACA,MAAA,EACA,YAAA,EACA,QAAA,EACA,KAAA,EACA,aAAA,GAGO,EAAI,EAAG,EAAI,EAAQ,OAAQ,IAAK,CACvC,GAAM,GAAS,EAAQ,EAEvB,KAAK,GAAM,KAAQ,GAAO,UACxB,EAAa,GAAQ,EAAO,MAAM,EAGpC,IAAM,GAAS,EAAM,YAAY,EAAO,UAAW,EAAO,QAU1D,IARA,EAAa,eAAe,GAC5B,EAAa,UAAY,EAAO,UAChC,EAAa,cAAgB,EAAO,QAEpC,EAAO,UAAU,KAAK,GAEtB,EAAa,UAAU,GAEnB,EAAa,6BACT,EAAa,oBACT,EAAI,EAAK,EAAQ,QAAU,EAAQ,EAAI,GAAG,UAAY,EAAa,cAC7E,MAMJ,GAFA,EAAQ,KAAK,QAAS,GAET,QAAT,EAAgB,CAGlB,GAAM,GAAU,EAAa,OACzB,GACA,YAAA,EAAa,QAAA,EAAS,MAAA,EAAO,YAAA,EAC7B,KAAM,cAEN,CAEJ,GAAY,QAAU,EACtB,EAAY,QAAU,EAAQ,UAGhC,MAAO,GAGT,QAAS,GAAT,GAAkF,GAAlD,GAAkD,EAAlD,YAAa,EAAqC,EAArC,QAAS,EAA4B,EAA5B,MAAO,EAAqB,EAArB,YAAa,EAAQ,EAAR,KAClE,EAAe,EAAY,gBAAgB,EAGjD,IAAa,QAAT,IAAmB,EAAY,kBAE1B,EAAY,YAAY,IAAiB,EAAY,YAAY,KAAkB,GAC1F,QAeF,KAAA,GAZM,GAAO,EAAM,QAAQ,GACrB,GACJ,YAAA,EACA,QAAA,EACA,MAAA,EACA,YAAA,EACA,KAAA,EACA,KAAA,EACA,WACA,QAAS,MAGX,EAAsB,EAAtB,EAAA,MAAA,QAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,OAAA,cAA4B,CAAA,GAAA,EAAA,IAAA,EAAA,CAAA,GAAA,GAAA,EAAA,OAAA,KAAA,GAAA,EAAA,SAAA,CAAA,GAAA,EAAA,EAAA,OAAA,EAAA,KAAA,KAAA,GAAA,EAAA,MAAA,GAAjB,GAAiB,CAC1B,GAAU,QAAU,EAEpB,EAAQ,KAAK,kBAAmB,GAQlC,MALa,SAAT,IACF,EAAU,QAAU,EAAO,EAAU,QAAS,SAAA,GAAA,MAC5C,GAAO,UAAU,QAAQ,eAAiB,EAAY,WAAW,GAAc,YAG5E,EAAU,QA/HnB,GAAM,GAAe,EAAQ,kBACvB,EAAe,EAAQ,kBACvB,EAAe,EAAQ,YACvB,EAAe,EAAQ,oBACvB,EAAe,EAAQ,qBACvB,EAAe,EAAQ,oBAAoB,QAC5B,EAAQ,gBAArB,IAAA,OAEF,GAAkB,OAAQ,KAAM,UAChC,GAAkB,OAAQ,KAAM,UAEhC,GACJ,aAAA,EACA,KAAA,EACA,oBAAA,EACA,QAAA,EACA,UACE,aAAc,IACd,WAAc,KACd,UAAc,KACd,QAAgB,EAAG,EAAG,EAAG,IAE3B,OACE,OACA,OACA,KACA,SACA,MACA,YACA,QAqGJ,GAAY,QAAQ,GAAG,sBAAuB,SAAA,GAAyC,GAA7B,GAA6B,EAA7B,YAAa,EAAgB,EAAhB,YACrE,GAAY,WAAW,IAAkB,SAAU,EAAA,EAAU,QAAS,QAGxE,EAAY,QAAQ,GAAG,iBAAkB,SAAA,GAAyC,GAA7B,GAA6B,EAA7B,YAAa,EAAgB,EAAhB,YAChE,GAAY,WAAW,OAAO,EAAc,KAG9C,EAAY,QAAQ,GAAG,OAAQ,SAAA,GAAuE,GAA3D,GAA2D,EAA3D,YAAa,EAA8C,EAA9C,QAAS,EAAqC,EAArC,MAAO,EAA8B,EAA9B,YAAa,EAAiB,EAAjB,cAC7E,EAAe,EAAY,gBAAgB,EAE5C,IAAmB,EAAY,gBAAiB,EAAY,kBAC3D,EAAY,eACd,aAAa,EAAY,WAAW,GAAc,SAGpD,GACE,YAAA,EAAa,QAAA,EAAS,MAAA,EAAO,YAAA,EAC7B,KAAM,YAKZ,EAAY,QAAQ,GAAG,OAAQ,SAAA,GAiB7B,IAAA,GAjByC,GAA0D,EAA1D,YAAa,EAA6C,EAA7C,QAAS,EAAoC,EAApC,MAAO,EAA6B,EAA7B,YAAa,EAAgB,EAAhB,aAE7E,EAAY,EAAQ,MAAO,EAAM,UAAW,GAAS,EAErD,EAAQ,EAAY,WAAW,GAC/B,EAAO,EAAM,QAAQ,GACrB,GACJ,YAAA,EACA,QAAA,EACA,MAAA,EACA,YAAA,EACA,KAAM,OACN,WACA,KAAA,EACA,QAAS,MAGX,EAAsB,EAAtB,EAAA,MAAA,QAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,OAAA,cAA4B,CAAA,GAAA,EAAA,IAAA,EAAA,CAAA,GAAA,GAAA,EAAA,OAAA,KAAA,GAAA,EAAA,SAAA,CAAA,GAAA,EAAA,EAAA,OAAA,EAAA,KAAA,KAAA,GAAA,EAAA,MAAA,GAAjB,GAAiB,CAC1B,GAAU,QAAU,EAEpB,EAAQ,KAAK,kBAAmB,GAGlC,GAAK,EAAU,QAAQ,OAAvB,CAIA,IAAK,GAFD,GAAc,EAAA,EAET,EAAI,EAAG,EAAI,EAAU,QAAQ,OAAQ,IAAK,CACjD,GAAM,GAAS,EAAU,QAAQ,GAC3B,EAAe,EAAO,UAAU,QAAQ,YAE1C,GAAe,IACjB,EAAc,GAIlB,EAAM,SAAW,EACjB,EAAM,QAAU,WAAW,WACzB,GACE,YAAA,EACA,YAAA,EACA,QAAS,EAAQ,MAAO,EAAY,EACpC,MAAO,EACP,KAAM,UAEP,MAGL,EAAY,QAAQ,GAAG,KAAM,SAAA,GAAkD,GAA/C,GAA+C,EAA/C,YAAa,EAAkC,EAAlC,QAAS,EAAyB,EAAzB,MAAO,EAAkB,EAAlB,WACtD,GAAY,iBACf,GAAO,YAAA,EAAa,YAAA,EAAa,QAAA,EAAS,MAAA,EAAO,KAAM,WAI1D,KAAM,UAAU,QAAQ,SAAU,GACjC,EAAY,QAAQ,GAAG,EAAY,SAAA,GAAyC,GAA7B,GAA6B,EAA7B,YAAa,EAAgB,EAAhB,YACtD,GAAY,WAAW,IACzB,aAAa,EAAY,WAAW,GAAc,YAWxD,KAAK,GAAI,GAAI,EAAG,EAAI,EAAc,OAAQ,IACxC,EAAY,QAAQ,GAAG,EAAc,GAPvC,SAA+B,GAC7B,MAAO,UAAA,GAAwD,GAA5C,GAA4C,EAA5C,YAAa,EAA+B,EAA/B,QAAS,EAAsB,EAAtB,KACvC,IAAO,YAAA,EAAa,YADyC,EAAf,YACb,QAAA,EAAS,MAAA,EAAO,KAAA,MAKW,EAAa,IAG7E,GAAY,QAAQ,GAAG,MAAO,SAAU,GACtC,EAAY,QAAa,KACzB,EAAY,QAAa,EACzB,EAAY,gBAGd,EAAS,cAAgB,EAAc,SACvC,EAAO,QAAU,gLC9NjB,SAAS,GAAT,GAAkC,GAAhB,GAAgB,EAAhB,YACU,UAAtB,EAAa,OAEjB,EAAa,OAAS,EAAa,OAAS,GAAK,GAGnD,QAAS,GAAT,GAAuE,GAAnD,GAAmD,EAAnD,YAAa,EAAsC,EAAtC,aAAc,EAAwB,EAAxB,YAAa,EAAW,EAAX,OAC1D,IAA0B,SAAtB,EAAa,MAAoB,EAAQ,OAA7C,CAGA,GAAM,GAAW,EAAQ,GAAG,UAAU,QAAQ,kBAG1C,IAAY,IAGhB,EAAY,mBAAqB,WAAW,WAC1C,EAAc,MACZ,YAAA,EACA,YAAA,EACA,KAAM,OACN,QAAS,EACT,MAAO,KAER,KAGL,QAAS,GAAT,GAAyC,GAAf,GAAe,EAAf,WAGpB,GAAY,qBACd,cAAc,EAAY,oBAC1B,EAAY,mBAAqB,MA1CrC,GAAM,GAAgB,EAAQ,UACxB,EAAgB,EAAQ,iBAE9B,GAAc,QAAQ,GAAG,MAAO,GAChC,EAAc,QAAQ,GAAG,QAAS,EAElC,KAAA,OAAsB,OAAQ,KAAM,SAAU,UAA9C,EAAA,EAAA,EAAA,EAAA,OAAA,IAAyD,CAApD,GAAM,GAAA,EAAA,EACT,GAAY,QAAQ,GAAG,EAAQ,GAwCjC,EAAc,SAAS,mBAAqB,EAC5C,EAAc,MAAM,KAAK,cAEzB,EAAO,SACL,MAAA,EACA,QAAA,EACA,cAAA,sECrDF,IAAM,GAAgB,EAAQ,UACxB,EAAgB,EAAQ,mBACxB,EAAgB,EAAQ,oBACxB,EAAgB,EAAQ,eACxB,EAAgB,EAAQ,qBACxB,EAAgB,EAAQ,YACxB,EAAgB,EAAQ,qBACR,EAAQ,gBAAtB,IAAA,KAER,GAAc,QAAQ,GAAG,kBAAmB,SAAA,GAC1C,QAAS,GAAkB,EAAc,EAAU,GACjD,GAAM,GAAM,EAAQ,2BACd,EAAQ,iBAAiB,OACzB,GAEA,EAAY,EAAa,OACzB,EAAU,EAAU,OAEtB,GAAU,IACP,EAAG,QAAQ,IACX,EAAS,gBAAgB,EAAS,EAAU,IAC5C,EAAa,gBAAgB,EAAS,EAAS,IAEpD,EAAQ,MACN,QAAA,EACA,UAAA,EACA,OAAS,aAAA,KAjB8E,GAAvC,GAAuC,EAAvC,QAAS,EAA8B,EAA9B,QAAS,EAAqB,EAArB,KAAM,EAAe,EAAf,YAsBxE,EAAe,EAAM,cAAc,IAAI,EAE7C,IAAI,EAAc,CAChB,GAAM,GAAY,EAAa,OACzB,EAAU,EAAU,OAEtB,GAAU,IACP,EAAa,gBAAgB,EAAS,EAAS,IACpD,EAAQ,MACN,QAAA,EACA,UAAA,EACA,OAAS,aAAA,KAKf,EAAM,cAAc,gBAAgB,EAAkB,KAGxD,EAAa,QAAQ,GAAG,MAAO,SAAA,GAA4B,GAAhB,GAAgB,EAAhB,YACzC,GAAa,OAAO,QAAU,SAAU,GACtC,MAAO,GAAa,QAAQ,MAIhC,EAAa,QAAQ,GAAG,MAAO,SAAA,GAAqC,GAAzB,GAAyB,EAAzB,aAAc,EAAW,EAAX,OACvD,GAAO,EAAa,OAAO,QAAS,EAAc,UAClD,EAAO,EAAa,OAAO,QAAS,KAGtC,EAAM,EAAa,WAAY,EAAc,OAE7C,EAAa,UAAU,cAAgB,SAAU,GAG/C,MAFA,GAAO,KAAK,OAAO,QAAS,GAErB,KAGT,IAAM,GAAqB,EAAa,UAAU,iBAElD,GAAa,UAAU,kBAAoB,SAAU,EAAY,GAC/D,GAAM,GAAM,EAAmB,KAAK,KAAM,EAAY,EAMtD,OAJI,KAAQ,OACV,KAAK,OAAO,QAAQ,GAAc,GAG7B,GAGT,EAAa,gBAAgB,KAAK,wMCjFlC,IAAM,GAAU,EAAQ,WAClB,EAAU,EAAQ,kBAClB,EAAU,EAAQ,mBAAmB,MAErC,GACJ,QAAA,EACA,OAAA,EACA,MAAA,EAGA,SAAU,EAAQ,sBAAsB,SAExC,aAEA,YAAa,SAAU,EAAK,GAE1B,GAAI,EAAM,SAAS,EAAM,UAAW,GAAQ,OAAO,CAEnD,GAAM,GAAO,EAAM,UAAU,GAE7B,EAAM,UAAU,KAAK,GACrB,EAAO,UAAU,KAAK,GAIlB,IAAQ,EAAM,UAChB,EAAO,IAAI,EAAK,SAAU,EAAM,gBAGlC,EAAQ,KAAK,gBAAkB,IAAA,EAAK,IAAA,KAGtC,eAAgB,SAAU,EAAK,GAC7B,GAAM,GAAQ,EAAM,QAAQ,EAAM,UAAW,EAE7C,GAAM,GAAO,EAAM,UAAU,GAE7B,EAAO,OAAO,EAAK,SAAU,EAAM,gBAEnC,EAAM,UAAU,OAAO,EAAO,GAC9B,EAAO,UAAU,OAAO,EAAO,GAE/B,EAAQ,KAAK,mBAAqB,IAAA,EAAK,IAAA,KAGzC,eAAgB,WACd,EAAM,eAAe,KAAK,SAAU,OAIxC,GAAO,QAAU,yNClDG,EAAQ,SAApB,IAAA,QAEF,aACJ,QAAA,KAAe,EAAA,KAAA,GACb,KAAK,gCAKP,YAAI,EAAM,GACR,IAAK,KAAK,UAAU,GAElB,YADA,KAAK,UAAU,IAAS,GAI1B,MAAK,UAAU,GAAM,KAAK,gBAG5B,aAAK,EAAM,GACT,GAAK,KAAK,UAAU,GAApB,CAEA,GAAM,GAAQ,EAAQ,KAAK,UAAU,GAAO,IAE7B,IAAX,GACF,KAAK,UAAU,GAAM,OAAO,EAAO,iBAIvC,cAAM,EAAM,GACV,GAAM,GAAkB,KAAK,UAAU,EAEvC,IAAK,EAEL,IAAK,GAAI,GAAI,EAAG,EAAI,EAAgB,OAAQ,IAC1C,IAAsC,IAAlC,EAAgB,GAAG,EAAK,GAC1B,YAMR,GAAQ,IAAM,WACZ,MAAO,IAAI,IAGb,EAAO,QAAU,iDC7CjB,SAAS,GAAS,EAAO,GACvB,IAAK,GAAI,GAAI,EAAG,EAAM,EAAM,OAAQ,EAAI,EAAK,IAC3C,GAAI,EAAM,KAAO,EACf,MAAO,EAIX,QAAQ,EAGV,QAAS,GAAU,EAAO,GACxB,OAAmC,IAA5B,EAAQ,EAAO,GAGxB,QAAS,GAAO,EAAQ,GACtB,IAAK,GAAI,GAAI,EAAG,EAAI,EAAO,OAAQ,IACjC,EAAO,KAAK,EAAO,GAGrB,OAAO,GAGT,QAAS,GAAQ,EAAO,GAGtB,IAAK,GAFC,MAEG,EAAI,EAAG,EAAI,EAAM,OAAQ,IAC5B,EAAK,EAAM,KACb,EAAO,KAAK,EAAM,GAItB,OAAO,GAGT,EAAO,SACL,QAAA,EACA,SAAA,EACA,MAAA,EACA,OAAA,+CCtCiB,EAAQ,YAAnB,IAAA,OACF,EAAS,EAAQ,QACjB,EAAa,EAAQ,gBAErB,EAAU,EAAW,QACrB,EAAa,EAAO,UAEpB,GAEJ,iBAAmB,gBAAkB,IAAW,EAAG,SAAS,EAAO,gBAC7C,EAAW,mBAAoB,GAAO,eAG5D,uBAAwB,EAAW,aAEnC,MAAQ,eAAiB,MAAa,oBAAsB,IAG5D,cAAsC,UAAtB,EAAU,SACnB,EAAQ,eACR,EAAU,UAAU,MAAM,UAGjC,OAAS,iBAAiB,KAAK,EAAU,WAC7B,YAAY,KAAK,EAAU,YAEvC,aAAc,aAAa,KAAK,EAAU,WAG1C,wBAAyB,WAAa,GAAQ,UAC1C,UAAW,yBAA2B,GAAQ,UAC9C,wBAAyB,sBAAwB,GAAQ,UACzD,qBAAsB,oBAAsB,GAAQ,UACpD,mBAAoB,oBAExB,4BAA4B,EAE5B,YAAc,EAAW,aACpB,EAAW,eAAiB,EAAO,gBAElC,GAAQ,cACR,KAAQ,gBACR,KAAQ,YACR,IAAQ,WACR,KAAQ,gBACR,OAAQ,oBAGR,GAAQ,YACR,KAAQ,cACR,KAAQ,cACR,IAAQ,aACR,KAAQ,cACR,OAAQ,iBAEV,KAGJ,WAAY,gBAAkB,GAAW,SAAU,aAAc,QAInE,GAAQ,4BAA8B,EAAG,SAAS,EAAQ,UAAU,EAAQ,0BAE5E,EAAO,QAAU,gFC7DjB,SAAS,MAHT,GAAM,MACA,EAAM,EAAQ,YAAY,MAIhC,GAAW,SAAqB,EAAI,SACpC,EAAW,iBAAqB,EAAI,kBAAsB,EAC1D,EAAW,WAAqB,EAAI,YAAsB,EAC1D,EAAW,cAAqB,EAAI,eAAsB,EAC1D,EAAW,mBAAqB,EAAI,oBAAsB,EAC1D,EAAW,QAAqB,EAAI,SAAsB,EAC1D,EAAW,YAAqB,EAAI,aAAsB,EAAW,QAErE,EAAW,MAAe,EAAI,MAC9B,EAAW,MAAe,EAAI,OAAS,EACvC,EAAW,aAAgB,EAAI,cAAgB,EAAI,eAEnD,EAAO,QAAU,oDCjBjB,IAAM,GAAa,EAAQ,YACrB,EAAa,EAAQ,aACrB,EAAa,EAAQ,QACrB,EAAa,EAAQ,gBAErB,GACJ,aAAc,SAAU,EAAQ,GAC9B,KAAO,GAAO,CACZ,GAAI,IAAU,EACZ,OAAO,CAGT,GAAQ,EAAM,WAGhB,OAAO,GAGT,QAAS,SAAU,EAAS,GAC1B,KAAO,EAAG,QAAQ,IAAU,CAC1B,GAAI,EAAS,gBAAgB,EAAS,GAAa,MAAO,EAE1D,GAAU,EAAS,WAAW,GAGhC,MAAO,OAGT,WAAY,SAAU,GACpB,GAAI,GAAS,EAAK,UAElB,IAAI,EAAG,QAAQ,GAAS,CAEtB,MAAQ,EAAS,EAAO,OAAS,EAAG,QAAQ,KAI5C,MAAO,GAGT,MAAO,IAIT,wBAAyB,EAAQ,2BAC7B,SAAU,EAAS,EAAU,GAC7B,EAAQ,GAAS,EAAQ,WAAW,iBAAiB,EAErD,KAAK,GAAI,GAAI,EAAG,EAAM,EAAM,OAAQ,EAAI,EAAK,IAC3C,GAAI,EAAM,KAAO,EACf,OAAO,CAIX,QAAO,GAEP,KAEJ,gBAAiB,SAAU,EAAS,EAAU,GAC5C,MAAI,GAAQ,2BACH,EAAS,wBAAwB,EAAS,EAAU,IAIzD,EAAI,SAAW,EAAI,aACrB,EAAW,EAAS,QAAQ,YAAa,MAGpC,EAAQ,EAAQ,yBAAyB,KAIlD,sBAAuB,SAAU,GAC/B,GAAI,MACA,KACA,MAAA,GACA,EAAc,EAAS,GACvB,EAAQ,EAAa,GAAI,EACzB,MAAA,GACA,MAAA,GACA,MAAA,GACA,MAAA,EAEJ,KAAK,EAAI,EAAG,EAAI,EAAS,OAAQ,IAI/B,IAHA,EAAW,EAAS,KAGH,IAAa,EAI9B,GAAK,GAQL,GAAI,EAAS,aAAe,EAAS,cAIhC,GAAI,EAAY,aAAe,EAAS,cAAxC,CAML,IAAK,EAAmB,OAEtB,IADA,EAAS,EACF,EAAO,YAAc,EAAO,aAAe,EAAO,eACvD,EAAmB,QAAQ,GAC3B,EAAS,EAAO,UAMpB,IAAI,YAAuB,GAAW,aAC/B,YAAoB,GAAW,cAC7B,YAAoB,GAAW,eAAgB,CAEtD,GAAI,IAAa,EAAY,WAC3B,QAGF,GAAS,EAAS,oBAGlB,GAAS,CAKX,KAFA,KAEO,EAAO,aAAe,EAAO,eAClC,EAAgB,QAAQ,GACxB,EAAS,EAAO,UAMlB,KAHA,EAAI,EAGG,EAAgB,IAAM,EAAgB,KAAO,EAAmB,IACrE,GAGF,IAAM,IACJ,EAAgB,EAAI,GACpB,EAAgB,GAChB,EAAmB,GAKrB,KAFA,EAAQ,EAAQ,GAAG,UAEZ,GAAO,CACZ,GAAI,IAAU,EAAQ,GAAI,CACxB,EAAc,EACd,EAAQ,EACR,IAEA,OAEG,GAAI,IAAU,EAAQ,GACzB,KAGF,GAAQ,EAAM,qBA/Dd,GAAc,EACd,EAAQ,MAbR,GAAc,EACd,EAAQ,CA8EZ,OAAO,IAGT,YAAa,SAAU,EAAS,EAAU,GACxC,KAAO,EAAG,QAAQ,IAAU,CAC1B,GAAI,EAAS,gBAAgB,EAAS,GACpC,OAAO,CAKT,KAFA,EAAU,EAAS,WAAW,MAEd,EACd,MAAO,GAAS,gBAAgB,EAAS,GAI7C,OAAO,GAGT,iBAAkB,SAAU,GAC1B,MAAQ,aAAmB,GAAW,mBAClC,EAAQ,wBACR,GAGN,YAAa,SAAU,GAErB,MADA,GAAiB,GAAkB,EAAI,QAErC,EAAG,EAAe,SAAW,EAAe,SAAS,gBAAgB,WACrE,EAAG,EAAe,SAAW,EAAe,SAAS,gBAAgB,YAIzE,qBAAsB,SAAU,GAC9B,GAAM,GAAc,YAAmB,GAAW,WAC9C,EAAQ,wBACR,EAAQ,iBAAiB,EAE7B,OAAO,KACL,KAAQ,EAAW,KACnB,MAAQ,EAAW,MACnB,IAAQ,EAAW,IACnB,OAAQ,EAAW,OACnB,MAAQ,EAAW,OAAU,EAAW,MAAS,EAAW,KAC5D,OAAQ,EAAW,QAAU,EAAW,OAAS,EAAW,MAIhE,eAAgB,SAAU,GACxB,GAAM,GAAa,EAAS,qBAAqB,EAEjD,KAAK,EAAQ,QAAU,EAAY,CACjC,GAAM,GAAS,EAAS,YAAY,EAAI,UAAU,GAElD,GAAW,MAAU,EAAO,EAC5B,EAAW,OAAU,EAAO,EAC5B,EAAW,KAAU,EAAO,EAC5B,EAAW,QAAU,EAAO,EAG9B,MAAO,IAGT,QAAS,SAAU,GAGjB,IAFA,GAAM,MAEC,GACL,EAAK,KAAK,GACV,EAAU,EAAS,WAAW,EAGhC,OAAO,IAGT,YAAa,SAAA,GACX,QAAK,EAAG,OAAO,KAGf,EAAW,SAAS,cAAc,IAC3B,IAIX,GAAO,QAAU,+FCzNjB,SAAS,GAAK,EAAS,EAAM,EAAU,GACrC,GAAM,GAAU,EAAW,GACvB,EAAe,EAAQ,EAAU,GACjC,EAAS,EAAQ,EAyBrB,IAvBK,IACH,GACE,UACA,UAAW,GAGb,EAAe,EAAS,KAAK,GAAW,EACxC,EAAQ,KAAK,GAEb,EAAkB,KAAK,GAEnB,YACA,WACA,aAEA,OAGD,EAAO,OAAO,KACjB,EAAO,OAAO,MACd,EAAO,cAGJ,EAAS,EAAO,OAAO,GAAO,GAAW,CAC5C,GAAI,OAAA,EAEJ,IAAI,EAAgB,CAAA,GAAA,GACsB,EAAkB,GAAlD,EADU,EACV,SAAU,EADA,EACA,QAAS,EADT,EACS,SACrB,EAAgB,EAAQ,EAAU,GAElC,EAAkB,EAAQ,IAAkB,SAAU,GACrD,EAAM,8BACT,EAAM,OAAS,EAAM,WACrB,EAAM,cAAgB,EAEtB,EAAM,eAA2B,EAAM,gBAA4B,EACnE,EAAM,gBAA2B,EAAM,iBAA4B,EACnE,EAAM,yBAA2B,EAAM,0BAA4B,EAE/D,cAAc,KAAK,EAAM,QAC3B,EAAM,MAAQ,EAAM,QAAU,EAAU,GAAS,SAAS,gBAAgB,WAC1E,EAAM,MAAQ,EAAM,QAAU,EAAU,GAAS,SAAS,gBAAgB,WAG5E,EAAS,IAIb,GAAM,EAAQ,GAAU,EAAK,EAAM,IAAmB,EAAQ,UAEvC,IAAnB,GACF,EAAS,KAAK,GACd,EAAQ,KAAK,GACb,EAAS,KAAK,IAGd,EAAS,SAIX,GAAM,EAAQ,GAAU,EAAM,EAAU,EAAiB,IAAY,EAAQ,QAI/E,OAFA,GAAO,OAAO,GAAM,KAAK,GAElB,GAIX,QAAS,GAAQ,EAAS,EAAM,EAAU,GACxC,GAAM,GAAU,EAAW,GACrB,EAAe,EAAQ,EAAU,GACjC,EAAS,EAAQ,EAEvB,IAAK,GAAW,EAAO,OAAvB,CAIA,GAAI,GAAkB,EAClB,MAAA,GACA,MAAA,EAQJ,IANI,IACF,EAAY,EAAkB,GAC9B,EAAgB,EAAQ,EAAU,SAAU,GAC5C,EAAkB,EAAU,QAAQ,IAGzB,QAAT,EAAJ,CASA,GAAI,EAAO,OAAO,GAAO,CACvB,GAAM,GAAM,EAAO,OAAO,GAAM,MAEhC,IAAiB,QAAb,EAAoB,CACtB,IAAK,GAAI,GAAI,EAAG,EAAI,EAAK,IACvB,EAAO,EAAS,EAAM,EAAO,OAAO,GAAM,GAAI,EAEhD,QAGA,IAAK,GAAI,GAAI,EAAG,EAAI,EAAK,IACvB,GAAI,EAAO,OAAO,GAAM,KAAO,EAAU,CACvC,EAAQ,GAAa,EAAK,EAAM,EAAiB,EAAiB,IAAY,EAAQ,SACtF,EAAO,OAAO,GAAM,OAAO,EAAG,GAE1B,GAAkB,GAEsB,MAD1C,EAAU,SAAS,KAEjB,EAAU,SAAS,OAAO,EAAe,GACzC,EAAU,QAAQ,OAAO,EAAe,GACxC,EAAU,SAAS,OAAO,EAAe,GAI7C,OAKF,EAAO,OAAO,IAAwC,IAA/B,EAAO,OAAO,GAAM,SAC7C,EAAO,OAAO,GAAQ,KACtB,EAAO,aAIN,EAAO,YACV,EAAQ,OAAO,EAAc,GAC7B,EAAS,OAAO,EAAc,GAC9B,EAAkB,OAAO,EAAc,QA9CvC,KAAK,IAAQ,GAAO,OACd,EAAO,OAAO,eAAe,IAC/B,EAAO,EAAS,EAAM,QAgD9B,QAAS,GAAa,EAAU,EAAS,EAAM,EAAU,GACvD,GAAM,GAAU,EAAW,EAC3B,KAAK,EAAgB,GAAO,CAC1B,EAAgB,IACd,aACA,YACA,aAIF,KAAK,GAAI,GAAI,EAAG,EAAI,EAAU,OAAQ,IACpC,EAAI,EAAU,GAAI,EAAM,GACxB,EAAI,EAAU,GAAI,EAAM,GAAoB,GAIhD,GAAM,GAAY,EAAgB,GAC9B,MAAA,EAEJ,KAAK,EAAQ,EAAU,UAAU,OAAS,EAAG,GAAS,IAChD,EAAU,UAAU,KAAW,GAC5B,EAAU,SAAS,KAAW,GAFkB,MAO1C,IAAX,IACF,EAAQ,EAAU,UAAU,OAE5B,EAAU,UAAU,KAAK,GACzB,EAAU,SAAU,KAAK,GACzB,EAAU,UAAU,UAItB,EAAU,UAAU,GAAO,MAAM,IAAY,EAAQ,QAAS,EAAQ,UAGxE,QAAS,GAAgB,EAAU,EAAS,EAAM,EAAU,GAC1D,GAAM,GAAU,EAAW,GACrB,EAAY,EAAgB,GAC9B,GAAa,EACb,MAAA,EAEJ,IAAK,EAGL,IAAK,EAAQ,EAAU,UAAU,OAAS,EAAG,GAAS,EAAG,IAEvD,GAAI,EAAU,UAAU,KAAW,GAC5B,EAAU,SAAS,KAAW,EAAS,CAK5C,IAAK,GAHC,GAAY,EAAU,UAAU,GAG7B,EAAI,EAAU,OAAS,EAAG,GAAK,EAAG,IAAK,CAAA,GAAA,GACf,EAAU,GAAlC,EADuC,EAAA,GACnC,EADmC,EAAA,GAC1B,EAD0B,EAAA,EAI9C,IAAI,IAAO,GAAY,MAAc,EAAQ,SAAW,IAAY,EAAQ,QAAS,CAEnF,EAAU,OAAO,EAAG,GAIf,EAAU,SACb,EAAU,UAAU,OAAO,EAAO,GAClC,EAAU,SAAU,OAAO,EAAO,GAClC,EAAU,UAAU,OAAO,EAAO,GAGlC,EAAO,EAAS,EAAM,GACtB,EAAO,EAAS,EAAM,GAAoB,GAGrC,EAAU,UAAU,SACvB,EAAgB,GAAQ,OAK5B,GAAa,CACb,QAIJ,GAAI,EAAc,OAOxB,QAAS,GAAkB,EAAO,GAChC,GAAM,GAAU,EAAW,GACrB,KACA,EAAY,EAAgB,EAAM,MAClC,EAAe,EAAS,iBAAiB,EAAM,KACjD,EAAM,KAAK,GACX,EAAM,QACN,EAAU,CASd,KANA,EAAQ,EAAW,GAEnB,EAAU,cAAgB,EAC1B,EAAU,eAAiB,EAGpB,EAAG,QAAQ,IAAU,CAC1B,IAAK,GAAI,GAAI,EAAG,EAAI,EAAU,UAAU,OAAQ,IAAK,CACnD,GAAM,GAAW,EAAU,UAAU,GAC/B,EAAU,EAAU,SAAS,EAEnC,IAAI,EAAS,gBAAgB,EAAS,IAC/B,EAAS,aAAa,EAAS,IAC/B,EAAS,aAAa,EAAS,GAAU,CAE9C,GAAM,GAAY,EAAU,UAAU,EAEtC,GAAU,cAAgB,CAE1B,KAAK,GAAI,GAAI,EAAG,EAAI,EAAU,OAAQ,IAAK,CAAA,GAAA,GACV,EAAU,GAAlC,EADkC,EAAA,GAC9B,EAD8B,EAAA,GACrB,EADqB,EAAA,EAGrC,OAAc,EAAQ,SAAW,IAAY,EAAQ,SACvD,EAAG,KAMX,EAAU,EAAS,WAAW,IAIlC,QAAS,GAAoB,GAC3B,MAAO,GAAiB,KAAK,KAAM,GAAO,GAG5C,QAAS,KACP,KAAK,aAAc,EAGrB,QAAS,KACP,KAAK,cAAc,iBAGrB,QAAS,KACP,KAAK,cAAe,EAGtB,QAAS,KACP,KAAK,cAAe,EACpB,KAAK,6BAA8B,EAGrC,QAAS,GAAY,GACnB,MAAO,GAAG,OAAO,GAAQ,GAAU,QAAS,GAlV9C,GAAM,GAAO,EAAQ,QACf,EAAW,EAAQ,cACnB,EAAW,EAAQ,qBAEM,EAAQ,YAA/B,IAAA,OAAQ,IAAA,YACc,EAAQ,SAA9B,IAAA,QAAS,IAAA,SAEX,EAAkB,eAAiB,MAAa,oBAAsB,IACtE,EAAiB,EAAiB,cAAe,mBACjD,EAAiB,EAAiB,cAAe,sBACjD,EAAiB,EAAgB,KAAM,GAEvC,KACA,KACA,KASA,KAEA,KAEA,GAAmB,GAAmB,WAC1C,GAAI,IAAY,CAMhB,OAJA,GAAO,SAAS,cAAc,OAAO,iBAAiB,OAAQ,MAC5D,cAAiB,GAAY,KAGxB,IAmTT,GAAO,SACL,IAAA,EACA,OAAA,EAEA,YAAA,EACA,eAAA,EAEA,iBAAA,EACA,mBAAA,EACA,gBAAA,EACA,UAAA,EAEA,eAAA,EACA,gBAAA,EAEA,UAAW,EACX,SAAU,EACV,mBAAoB,+GCtWtB,GAAO,QAAU,SAAiB,EAAM,GACtC,IAAK,GAAM,KAAQ,GACjB,EAAK,GAAQ,EAAO,EAEtB,OAAO,gDCDL,EAAQ,UAFV,IAAA,gBACA,IAAA,QAGF,GAAO,QAAU,SAAU,EAAQ,EAAS,GAC1C,GAAM,GAAgB,EAAO,QAAQ,GAC/B,EAAe,GAAiB,EAAc,OAC9C,EAAS,GAAgB,EAAO,QAAQ,OAExC,EAAa,EAAgB,EAAQ,EAAQ,GAAU,GAAU,GAEvE,OAAO,GAAS,KAAiB,EAAG,EAAG,EAAG,oDCZ5C,GAAO,QAAU,SAAC,EAAG,GAAJ,MAAW,MAAK,KAAK,EAAI,EAAI,EAAI,yCCAlD,IAAM,GAAS,EAAQ,YACjB,EAAS,EAAQ,YAEjB,GACJ,SAAU,SAAU,EAAQ,GAC1B,GAAI,IAAS,CAEb,OAAO,YAML,MALK,KACH,EAAI,OAAO,QAAQ,KAAK,GACxB,GAAS,GAGJ,EAAO,MAAM,KAAM,aAK9B,iBAAkB,SAAU,EAAG,EAAI,EAAI,GACrC,GAAM,GAAK,EAAI,CACf,OAAO,GAAK,EAAK,EAAK,EAAI,EAAK,EAAI,EAAK,EAAI,EAAI,GAGlD,uBAAwB,SAAU,EAAQ,EAAQ,EAAK,EAAK,EAAM,EAAM,GACtE,OACE,EAAI,EAAM,iBAAiB,EAAU,EAAQ,EAAK,GAClD,EAAI,EAAM,iBAAiB,EAAU,EAAQ,EAAK,KAKtD,YAAa,SAAU,EAAG,EAAG,EAAG,GAE9B,MADA,IAAK,GACG,EAAI,GAAG,EAAE,GAAK,GAGxB,WAAY,SAAU,EAAM,GAK1B,MAJA,GAAK,KAAQ,EAAI,KACjB,EAAK,KAAQ,EAAI,KACjB,EAAK,MAAQ,EAAI,MAEV,GAGT,GAAa,EAAQ,QACrB,OAAa,EACb,MAAa,EAAQ,WACrB,YAAa,EAAQ,iBAGvB,GAAO,EAAO,EAAQ,UACtB,EAAO,EAAO,EAAQ,eACtB,EAAO,EAAO,EAAQ,mBACtB,EAAO,EAAO,EAAQ,WAEtB,EAAO,QAAU,uKCvDjB,IAAM,GAAU,EAAQ,YAClB,EAAU,EAAQ,WAElB,GACJ,aAAe,mBAAoB,aAAc,aAAc,QAE/D,OAAQ,SAAU,EAAS,EAAW,GAKpC,IAAA,GAJM,GAAc,EAAM,eAAe,GACnC,EAAY,EAAM,aAAa,GAC/B,GAAY,QAAA,EAAS,UAAA,EAAW,YAAA,EAAa,UAAA,EAAW,YAAA,GAE9D,EAAqB,EAAO,YAA5B,EAAA,MAAA,QAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,OAAA,cAAyC,CAAA,GAAA,EAAA,IAAA,EAAA,CAAA,GAAA,GAAA,EAAA,OAAA,KAAA,GAAA,EAAA,SAAA,CAAA,GAAA,EAAA,EAAA,OAAA,EAAA,KAAA,KAAA,GAAA,EAAA,MAAA,GAA9B,GAA8B,EACjC,EAAc,EAAO,GAAQ,EAEnC,IAAI,EACF,MAAO,KAMb,iBAAkB,SAAA,GAAmD,GAAvC,GAAuC,EAAvC,YAAa,EAA0B,EAA1B,UAAW,EAAe,EAAf,WACpD,KAAK,cAAc,KAAK,GACtB,MAAO,KAGT,KAAA,GAAA,GAA0B,EAAM,aAAhC,EAAA,MAAA,QAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,OAAA,cAA8C,CAAA,GAAA,EAAA,IAAA,EAAA,CAAA,GAAA,GAAA,EAAA,OAAA,KAAA,GAAA,EAAA,SAAA,CAAA,GAAA,EAAA,EAAA,OAAA,EAAA,KAAA,KAAA,GAAA,EAAA,MAAA,GAAnC,GAAmC,EACxC,EAAU,CAEd,IAAI,EAAY,YAAc,EAAY,WAAW,aAC7C,EAAY,cAAgB,EAClC,KAAO,GAAS,CAEd,GAAI,IAAY,EAAY,QAC1B,MAAO,EAET,GAAU,EAAM,WAAW,IAKjC,MAAO,OAIT,WAAY,SAAA,GAAiD,GAArC,GAAqC,EAArC,UAAW,EAA0B,EAA1B,YAAa,EAAa,EAAb,SAC9C,IAAoB,UAAhB,GAA2C,QAAhB,EAC7B,MAAO,KAKT,KAAA,GAFI,OAAA,GAEJ,EAA0B,EAAM,aAAhC,EAAA,MAAA,QAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,OAAA,cAA8C,CAAA,GAAA,EAAA,IAAA,EAAA,CAAA,GAAA,GAAA,EAAA,OAAA,KAAA,GAAA,EAAA,SAAA,CAAA,GAAA,EAAA,EAAA,OAAA,EAAA,KAAA,KAAA,GAAA,EAAA,MAAA,GAAnC,GAAmC,CAC5C,IAAI,EAAY,cAAgB,EAAa,CAE3C,GAAI,EAAY,aAAe,EAAM,SAAS,EAAY,WAAY,GAAc,QAGpF,IAAI,EAAY,cACd,MAAO,EAGC,KACR,EAAiB,IAOvB,GAAI,EACF,MAAO,EAMT,KAAA,GAAA,GAA0B,EAAM,aAAhC,EAAA,MAAA,QAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,OAAA,cAA8C,CAAA,GAAA,EAAA,IAAA,EAAA,CAAA,GAAA,GAAA,EAAA,OAAA,KAAA,GAAA,EAAA,SAAA,CAAA,GAAA,EAAA,EAAA,OAAA,EAAA,KAAA,KAAA,GAAA,EAAA,MAAA,GAAnC,GAAmC,CAC5C,MAAI,EAAY,cAAgB,GAAiB,QAAQ,KAAK,IAAc,EAAY,YACtF,MAAO,GAIX,MAAO,OAIT,WAAY,SAAA,GACV,IAAA,GADsB,GAAa,EAAb,UACtB,EAA0B,EAAM,aAAhC,EAAA,MAAA,QAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,OAAA,cAA8C,CAAA,GAAA,EAAA,IAAA,EAAA,CAAA,GAAA,GAAA,EAAA,OAAA,KAAA,GAAA,EAAA,SAAA,CAAA,GAAA,EAAA,EAAA,OAAA,EAAA,KAAA,KAAA,GAAA,EAAA,MAAA,GAAnC,GAAmC,CAC5C,IAAI,EAAM,SAAS,EAAY,WAAY,GACzC,MAAO,KAMb,KAAM,SAAA,GACJ,IAAA,GADgB,GAAe,EAAf,YAChB,EAA0B,EAAM,aAAhC,EAAA,MAAA,QAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,OAAA,cAA8C,CAAA,GAAA,EAAA,IAAA,EAAA,CAAA,GAAA,GAAA,EAAA,OAAA,KAAA,GAAA,EAAA,SAAA,CAAA,GAAA,EAAA,EAAA,OAAA,EAAA,KAAA,KAAA,GAAA,EAAA,MAAA,GAAnC,GAAmC,CAE5C,IAAsC,IAAlC,EAAY,WAAW,OAAc,CACvC,GAAM,GAAS,EAAY,MAG3B,IAAI,IAAW,EAAO,QAAQ,QAAQ,QACpC,aAIC,IAAI,EAAY,WAAW,QAAU,EACxC,QAGF,KAAK,EAAY,eAAkB,IAAgB,EAAY,YAC7D,MAAO,GAIX,MAAO,OAIX,GAAO,QAAU,kRCzHX,EAAa,EAAQ,YACrB,EAAa,EAAQ,cAErB,GACJ,MAAU,aAEV,OAAU,SAAA,GAAA,MAAS,KAAU,EAAI,QAAU,EAAS,IAEpD,QAAU,SAAA,GAAA,MAAS,GAAG,OAAO,IAA6B,KAAnB,EAAM,UAE7C,OAAU,SAAA,GAAA,QAAW,GAA2B,gBAAjB,KAAO,EAAP,YAAA,EAAO,KAEtC,SAAU,SAAA,GAAA,MAA0B,kBAAV,IAE1B,OAAU,SAAA,GAAA,MAA0B,gBAAV,IAE1B,KAAU,SAAA,GAAA,MAA0B,iBAAV,IAE1B,OAAU,SAAA,GAAA,MAA0B,gBAAV,IAE1B,QAAS,SAAA,GACP,IAAK,GAA2B,gBAAjB,KAAO,EAAP,YAAA,EAAO,IAAuB,OAAO,CAEpD,IAAM,GAAU,EAAI,UAAU,IAAU,EAAI,MAE5C,OAAQ,kBAAkB,KAAlB,EAA8B,EAAQ,UAC1C,YAAiB,GAAQ,QACN,IAAnB,EAAM,UAA4C,gBAAnB,GAAM,UAI7C,GAAG,MAAQ,SAAA,GAAA,MAAU,GAAG,OAAO,QACD,KAAjB,EAAM,QACd,EAAG,SAAS,EAAM,SAEvB,EAAO,QAAU,oECnCjB,GAAO,QAAU,SAAC,GAAD,SAAc,IAAS,EAAM,SAAY,YAAiB,GAAM,6CCAjF,SAAS,GAAe,EAAM,GAC5B,IAAK,GAAM,KAAQ,GAAQ,CACzB,GAAM,GAAkB,EAAO,QAAQ,gBACnC,GAAa,CAGjB,KAAK,GAAM,KAAU,GACnB,GAA6B,IAAzB,EAAK,QAAQ,IAAiB,EAAgB,GAAQ,KAAK,GAAO,CACpE,GAAa,CACb,OAIC,GAAsC,kBAAjB,GAAO,KAC/B,EAAK,GAAQ,EAAO,IAGxB,MAAO,GAGT,EAAc,iBACZ,OAAQ,kDAGV,EAAO,QAAU,uCCxBjB,IAAM,GAAgB,EAAQ,WACxB,EAAgB,EAAQ,aACxB,EAAgB,EAAQ,gBACxB,EAAgB,EAAQ,cACxB,EAAgB,EAAQ,gBACxB,EAAgB,EAAQ,QACxB,EAAgB,EAAQ,mBAExB,GACJ,WAAY,SAAU,EAAM,GAC1B,EAAK,KAAO,EAAK,SACjB,EAAK,KAAK,EAAI,EAAI,KAAK,EACvB,EAAK,KAAK,EAAI,EAAI,KAAK,EAEvB,EAAK,OAAS,EAAK,WACnB,EAAK,OAAO,EAAI,EAAI,OAAO,EAC3B,EAAK,OAAO,EAAI,EAAI,OAAO,EAE3B,EAAK,UAAY,EAAI,WAGvB,eAAgB,SAAU,EAAW,EAAM,GACzC,EAAU,KAAK,EAAO,EAAI,KAAK,EAAO,EAAK,KAAK,EAChD,EAAU,KAAK,EAAO,EAAI,KAAK,EAAO,EAAK,KAAK,EAChD,EAAU,OAAO,EAAK,EAAI,OAAO,EAAK,EAAK,OAAO,EAClD,EAAU,OAAO,EAAK,EAAI,OAAO,EAAK,EAAK,OAAO,EAClD,EAAU,UAAY,EAAI,UAAY,EAAK,SAG3C,IAAM,GAAK,KAAK,IAAI,EAAU,UAAY,IAAM,KAEhD,GAAU,KAAK,MAAU,EAAM,EAAU,KAAK,EAAG,EAAU,KAAK,GAAK,EACrE,EAAU,KAAK,GAAU,EAAU,KAAK,EAAI,EAC5C,EAAU,KAAK,GAAU,EAAU,KAAK,EAAI,EAE5C,EAAU,OAAO,MAAQ,EAAM,EAAU,OAAO,EAAG,EAAU,KAAK,GAAK,EACvE,EAAU,OAAO,GAAQ,EAAU,OAAO,EAAI,EAC9C,EAAU,OAAO,GAAQ,EAAU,OAAO,EAAI,GAGhD,gBAAiB,SAAW,GAC1B,MAAQ,aAAmB,GAAI,OAAS,YAAmB,GAAI,OAIjE,MAAO,SAAU,EAAM,EAAS,GAO9B,MANA,GAAK,MACL,EAAO,GAAQ,OAEf,EAAG,EAAI,EAAQ,EAAO,KACtB,EAAG,EAAI,EAAQ,EAAO,KAEf,GAGT,UAAW,SAAU,EAAS,GAc5B,MAbA,GAAO,MAGH,EAAQ,eAAiB,EAAa,gBAAgB,IACxD,EAAa,MAAM,SAAU,EAAS,GAEtC,EAAK,GAAK,OAAO,QACjB,EAAK,GAAK,OAAO,SAGjB,EAAa,MAAM,OAAQ,EAAS,GAG/B,GAGT,YAAa,SAAU,EAAS,GAW9B,MAVA,GAAS,MAEL,EAAQ,eAAiB,EAAa,gBAAgB,GAExD,EAAa,MAAM,SAAU,EAAS,GAGtC,EAAa,MAAM,SAAU,EAAS,GAGjC,GAGT,aAAc,SAAU,GACtB,MAAO,GAAG,OAAO,EAAQ,WAAY,EAAQ,UAAY,EAAQ,YAGnE,UAAW,SAAU,EAAW,EAAU,GACxC,GAAM,GAAW,EAAS,OAAS,EAChB,EAAa,eAAe,GAC5B,EAAS,GAEtB,IAEN,GAAa,UAAU,EAAS,GAChC,EAAU,KAAK,EAAI,EAAM,EACzB,EAAU,KAAK,EAAI,EAAM,EAEzB,EAAa,YAAY,EAAS,GAClC,EAAU,OAAO,EAAI,EAAM,EAC3B,EAAU,OAAO,EAAI,EAAM,EAE3B,EAAU,UAAY,EAAG,OAAO,GAAa,GAAW,GAAI,OAAO,WAGrE,cAAe,EAEf,aAAc,SAAU,GACtB,GAAM,KAyBN,OAtBI,GAAG,MAAM,IACX,EAAQ,GAAK,EAAM,GACnB,EAAQ,GAAK,EAAM,IAIA,aAAf,EAAM,KACqB,IAAzB,EAAM,QAAQ,QAChB,EAAQ,GAAK,EAAM,QAAQ,GAC3B,EAAQ,GAAK,EAAM,eAAe,IAEF,IAAzB,EAAM,QAAQ,SACrB,EAAQ,GAAK,EAAM,eAAe,GAClC,EAAQ,GAAK,EAAM,eAAe,KAIpC,EAAQ,GAAK,EAAM,QAAQ,GAC3B,EAAQ,GAAK,EAAM,QAAQ,IAIxB,GAGT,eAAgB,SAAU,GAUxB,IAAA,GATM,IACJ,MAAS,EACT,MAAS,EACT,QAAS,EACT,QAAS,EACT,QAAS,EACT,QAAS,GAGX,EAAsB,EAAtB,EAAA,MAAA,QAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,OAAA,cAAgC,CAAA,GAAA,EAAA,IAAA,EAAA,CAAA,GAAA,GAAA,EAAA,OAAA,KAAA,GAAA,EAAA,SAAA,CAAA,GAAA,EAAA,EAAA,OAAA,EAAA,KAAA,KAAA,GAAA,EAAA,MAAA,GAArB,GAAqB,CAC9B,KAAK,GAAM,KAAQ,GACjB,EAAQ,IAAS,EAAQ,GAG7B,IAAK,GAAM,KAAQ,GACjB,EAAQ,IAAS,EAAS,MAG5B,OAAO,IAGT,UAAW,SAAU,GACnB,GAAK,EAAM,QAAY,EAAM,SAAW,EAAM,QAAQ,OAAS,EAA/D,CAIA,GAAM,GAAU,EAAa,aAAa,GACpC,EAAO,KAAK,IAAI,EAAQ,GAAG,MAAO,EAAQ,GAAG,OAC7C,EAAO,KAAK,IAAI,EAAQ,GAAG,MAAO,EAAQ,GAAG,MAInD,QACE,EAAG,EACH,EAAG,EACH,KAAM,EACN,IAAK,EACL,MARW,KAAK,IAAI,EAAQ,GAAG,MAAO,EAAQ,GAAG,OAQnC,EACd,OARW,KAAK,IAAI,EAAQ,GAAG,MAAO,EAAQ,GAAG,OAQlC,KAInB,cAAe,SAAU,EAAO,GAC9B,GAAM,GAAU,EAAc,IACxB,EAAU,EAAc,IACxB,EAAU,EAAa,aAAa,GAGpC,EAAK,EAAQ,GAAG,GAAW,EAAQ,GAAG,GACtC,EAAK,EAAQ,GAAG,GAAW,EAAQ,GAAG,EAE5C,OAAO,GAAM,EAAI,IAGnB,WAAY,SAAU,EAAO,EAAW,GACtC,GAAM,GAAU,EAAc,IACxB,EAAU,EAAc,IACxB,EAAU,EAAa,aAAa,GACpC,EAAK,EAAQ,GAAG,GAAW,EAAQ,GAAG,GACtC,EAAK,EAAQ,GAAG,GAAW,EAAQ,GAAG,EAG5C,OAFc,KAAM,KAAK,MAAM,EAAK,GAAM,KAAK,IAKjD,eAAgB,SAAU,GACxB,MAAO,GAAG,OAAO,EAAQ,aACrB,EAAQ,YACR,EAAG,OAAO,EAAQ,kBACf,OAAW,GAAU,QAAS,MAAO,SAAS,EAAQ,aAGrD,QAAQ,KAAK,EAAQ,OAAS,YAAmB,GAAW,MAC1D,QACA,SAIZ,gBAAiB,SAAU,GACzB,OACE,EAAS,iBAAiB,EAAM,KAAO,EAAM,KAAK,GAAK,EAAM,QAC7D,EAAS,iBAAiB,EAAM,iBAKtC,GAAO,QAAU,mIC3NjB,KAAK,MAPc,EAAQ,YAAnB,IAAA,OAEF,GAAW,KAAM,MAAO,SAAU,KACpC,EAAW,EACX,MAAA,GACA,MAAA,GAEK,EAAI,EAAG,EAAI,EAAQ,SAAW,EAAO,sBAAuB,IACnE,EAAU,EAAO,EAAQ,GAAK,yBAC9B,EAAS,EAAO,EAAQ,GAAI,yBAA2B,EAAO,EAAQ,GAAK,8BAGxE,KACH,EAAU,SAAU,GAClB,GAAM,IAAW,GAAI,OAAO,UACtB,EAAa,KAAK,IAAI,EAAG,IAAM,EAAW,IAC1C,EAAK,WAAW,WAAc,EAAS,EAAW,IAClC,EAGtB,OADA,GAAW,EAAW,EACf,IAIN,IACH,EAAS,SAAU,GACjB,aAAa,KAIjB,EAAO,SACL,QAAA,EACA,OAAA,qDChCF,IAAM,GAAS,EAAQ,YACjB,EAAK,EAAQ,UAKf,EAAQ,cAHV,IAAA,QACA,IAAA,WACA,IAAA,eAGI,GACJ,sBAAuB,SAAU,EAAO,EAAc,GACpD,MAAK,GAAG,OAAO,GAKb,EADY,WAAV,EACM,EAAW,GAEF,SAAV,EACC,EAAa,QAAQ,GAGrB,EAAQ,EAAS,GAVlB,MAgBX,gBAAiB,SAAU,EAAO,EAAc,EAAS,GAWvD,MAVA,GAAQ,EAAU,sBAAsB,EAAO,EAAc,IAAY,EAErE,EAAG,SAAS,KACd,EAAQ,EAAM,MAAM,KAAM,IAGxB,EAAG,QAAQ,KACb,EAAQ,EAAe,IAGlB,GAGT,SAAU,SAAU,GAClB,MAAQ,KACN,EAAG,KAAO,GAAO,EAAK,EAAI,EAAK,KAC/B,EAAG,KAAO,GAAO,EAAK,EAAI,EAAK,MAInC,WAAY,SAAU,GAUpB,OATI,GAAU,QAAU,IAAQ,OAAS,KACvC,EAAO,KAAW,GAElB,EAAK,KAAS,EAAK,GAAK,EACxB,EAAK,IAAS,EAAK,GAAK,EACxB,EAAK,MAAS,EAAK,OAAY,EAAK,KAAO,EAAK,MAChD,EAAK,OAAS,EAAK,QAAY,EAAK,IAAM,EAAK,QAG1C,GAGT,WAAY,SAAU,GAUpB,OATI,GAAU,KAAO,IAAQ,KAAO,KAClC,EAAO,KAAW,GAElB,EAAK,EAAS,EAAK,MAAQ,EAC3B,EAAK,IAAS,EAAK,KAAQ,EAC3B,EAAK,MAAS,EAAK,OAAW,EAAK,MAAS,EAAK,EACjD,EAAK,OAAS,EAAK,QAAW,EAAK,OAAS,EAAK,GAG5C,GAIX,GAAO,QAAU,8ECxEjB,SAAS,GAAM,GAGb,EAAI,WAAa,CAGjB,IAAM,GAAK,EAAO,SAAS,eAAe,GAGtC,GAAG,gBAAkB,EAAO,UACF,kBAAhB,GAAO,MAChB,EAAO,KAAK,KAAQ,IAEvB,EAAS,EAAO,KAAK,IAGvB,EAAI,OAAS,EAnBf,GAAM,GAAM,EAAO,QACb,EAAW,EAAQ,aAqBH,oBAAX,SACT,EAAI,WAAa,GACjB,EAAI,eAAa,IAGjB,EAAK,QAGP,EAAI,UAAY,SAAoB,GAClC,GAAI,EAAS,GACX,MAAO,EAGT,IAAM,GAAY,EAAK,eAAiB,CAExC,OAAO,GAAS,aAAe,EAAS,cAAgB,EAAI,QAG9D,EAAI,KAAO","file":"interact.min.js","sourceRoot":"","sourcesContent":["/* interact.js v1.3.0-alpha.4+sha.7970416-dirty | https://raw.github.com/taye/interact.js/master/LICENSE */\n","/**\n * interact.js v1.3.0-alpha.4+sha.7970416-dirty\n *\n * Copyright (c) 2012-2017 Taye Adeyemi \n * Open source under the MIT License.\n * https://raw.github.com/taye/interact.js/master/LICENSE\n */\n","/*\n * In a (windowless) server environment this file exports a factory function\n * that takes the window to use.\n *\n * var interact = require('interact.js')(windowObject);\n *\n * See https://github.com/taye/interact.js/issues/187\n */\nif (typeof window === 'undefined') {\n module.exports = function (window) {\n require('./src/utils/window').init(window);\n\n return require('./src/index');\n };\n}\nelse {\n module.exports = require('./src/index');\n}\n","const { indexOf } = require('./utils/arr');\nconst extend = require('./utils/extend.js');\n\nfunction fireUntilImmediateStopped (event, listeners) {\n for (let i = 0, len = listeners.length; i < len && !event.immediatePropagationStopped; i++) {\n listeners[i](event);\n }\n}\n\nclass Eventable {\n\n constructor (options) {\n this.options = extend({}, options || {});\n }\n\n fire (event) {\n let listeners;\n const onEvent = 'on' + event.type;\n const global = this.global;\n\n // Interactable#on() listeners\n if ((listeners = this[event.type])) {\n fireUntilImmediateStopped(event, listeners);\n }\n\n // interactable.onevent listener\n if (this[onEvent]) {\n this[onEvent](event);\n }\n\n // interact.on() listeners\n if (!event.propagationStopped && global && (listeners = global[event.type])) {\n fireUntilImmediateStopped(event, listeners);\n }\n }\n\n on (eventType, listener) {\n // if this type of event was never bound\n if (this[eventType]) {\n this[eventType].push(listener);\n }\n else {\n this[eventType] = [listener];\n }\n }\n\n off (eventType, listener) {\n // if it is an action event type\n const eventList = this[eventType];\n const index = eventList? indexOf(eventList, listener) : -1;\n\n if (index !== -1) {\n eventList.splice(index, 1);\n }\n\n if (eventList && eventList.length === 0 || !listener) {\n this[eventType] = listener;\n }\n }\n}\n\nmodule.exports = Eventable;\n","const extend = require('./utils/extend');\nconst getOriginXY = require('./utils/getOriginXY');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nclass InteractEvent {\n constructor (interaction, event, action, phase, element, related, preEnd = false) {\n const target = interaction.target;\n const deltaSource = (target && target.options || defaults).deltaSource;\n const origin = getOriginXY(target, element, action);\n const starting = phase === 'start';\n const ending = phase === 'end';\n const coords = starting? interaction.startCoords : interaction.curCoords;\n const prevEvent = interaction.prevEvent;\n\n element = element || interaction.element;\n\n const page = extend({}, coords.page);\n const client = extend({}, coords.client);\n\n page.x -= origin.x;\n page.y -= origin.y;\n\n client.x -= origin.x;\n client.y -= origin.y;\n\n this.ctrlKey = event.ctrlKey;\n this.altKey = event.altKey;\n this.shiftKey = event.shiftKey;\n this.metaKey = event.metaKey;\n this.button = event.button;\n this.buttons = event.buttons;\n this.target = element;\n this.currentTarget = element;\n this.relatedTarget = related || null;\n this.preEnd = preEnd;\n this.type = action + (phase || '');\n this.interaction = interaction;\n this.interactable = target;\n\n this.t0 = starting ? interaction.downTimes[interaction.downTimes.length - 1]\n : prevEvent.t0;\n\n const signalArg = {\n interaction,\n event,\n action,\n phase,\n element,\n related,\n page,\n client,\n coords,\n starting,\n ending,\n deltaSource,\n iEvent: this,\n };\n\n signals.fire('set-xy', signalArg);\n\n if (ending) {\n // use previous coords when ending\n this.pageX = prevEvent.pageX;\n this.pageY = prevEvent.pageY;\n this.clientX = prevEvent.clientX;\n this.clientY = prevEvent.clientY;\n }\n else {\n this.pageX = page.x;\n this.pageY = page.y;\n this.clientX = client.x;\n this.clientY = client.y;\n }\n\n this.x0 = interaction.startCoords.page.x - origin.x;\n this.y0 = interaction.startCoords.page.y - origin.y;\n this.clientX0 = interaction.startCoords.client.x - origin.x;\n this.clientY0 = interaction.startCoords.client.y - origin.y;\n\n signals.fire('set-delta', signalArg);\n\n this.timeStamp = coords.timeStamp;\n this.dt = interaction.pointerDelta.timeStamp;\n this.duration = this.timeStamp - this.t0;\n\n // speed and velocity in pixels per second\n this.speed = interaction.pointerDelta[deltaSource].speed;\n this.velocityX = interaction.pointerDelta[deltaSource].vx;\n this.velocityY = interaction.pointerDelta[deltaSource].vy;\n\n this.swipe = (ending || phase === 'inertiastart')? this.getSwipe() : null;\n\n signals.fire('new', signalArg);\n }\n\n getSwipe () {\n const interaction = this.interaction;\n\n if (interaction.prevEvent.speed < 600\n || this.timeStamp - interaction.prevEvent.timeStamp > 150) {\n return null;\n }\n\n let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI;\n const overlap = 22.5;\n\n if (angle < 0) {\n angle += 360;\n }\n\n const left = 135 - overlap <= angle && angle < 225 + overlap;\n const up = 225 - overlap <= angle && angle < 315 + overlap;\n\n const right = !left && (315 - overlap <= angle || angle < 45 + overlap);\n const down = !up && 45 - overlap <= angle && angle < 135 + overlap;\n\n return {\n up,\n down,\n left,\n right,\n angle,\n speed: interaction.prevEvent.speed,\n velocity: {\n x: interaction.prevEvent.velocityX,\n y: interaction.prevEvent.velocityY,\n },\n };\n }\n\n preventDefault () {}\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n}\n\nsignals.on('set-delta', function ({ iEvent, interaction, starting, deltaSource }) {\n const prevEvent = starting? iEvent : interaction.prevEvent;\n\n if (deltaSource === 'client') {\n iEvent.dx = iEvent.clientX - prevEvent.clientX;\n iEvent.dy = iEvent.clientY - prevEvent.clientY;\n }\n else {\n iEvent.dx = iEvent.pageX - prevEvent.pageX;\n iEvent.dy = iEvent.pageY - prevEvent.pageY;\n }\n});\n\nInteractEvent.signals = signals;\n\nmodule.exports = InteractEvent;\n","const is = require('./utils/is');\nconst events = require('./utils/events');\nconst extend = require('./utils/extend');\nconst actions = require('./actions/base');\nconst scope = require('./scope');\nconst Eventable = require('./Eventable');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nconst {\n getElementRect,\n nodeContains,\n trySelector,\n} = require('./utils/domUtils');\nconst { getWindow } = require('./utils/window');\nconst { indexOf, contains } = require('./utils/arr');\nconst { wheelEvent } = require('./utils/browser');\n\n// all set interactables\nscope.interactables = [];\n\n/*\\\n * Interactable\n [ property ]\n **\n * Object type returned by @interact\n\\*/\nclass Interactable {\n constructor (target, options) {\n options = options || {};\n\n this.target = target;\n this.events = new Eventable();\n this._context = options.context || scope.document;\n this._win = getWindow(trySelector(target)? this._context : target);\n this._doc = this._win.document;\n\n signals.fire('new', {\n target,\n options,\n interactable: this,\n win: this._win,\n });\n\n scope.addDocument( this._doc, this._win );\n\n scope.interactables.push(this);\n\n this.set(options);\n }\n\n setOnEvents (action, phases) {\n const onAction = 'on' + action;\n\n if (is.function(phases.onstart) ) { this.events[onAction + 'start' ] = phases.onstart ; }\n if (is.function(phases.onmove) ) { this.events[onAction + 'move' ] = phases.onmove ; }\n if (is.function(phases.onend) ) { this.events[onAction + 'end' ] = phases.onend ; }\n if (is.function(phases.oninertiastart)) { this.events[onAction + 'inertiastart' ] = phases.oninertiastart ; }\n\n return this;\n }\n\n setPerAction (action, options) {\n // for all the default per-action options\n for (const option in options) {\n // if this option exists for this action\n if (option in defaults[action]) {\n // if the option in the options arg is an object value\n if (is.object(options[option])) {\n // duplicate the object\n this.options[action][option] = extend(this.options[action][option] || {}, options[option]);\n\n if (is.object(defaults.perAction[option]) && 'enabled' in defaults.perAction[option]) {\n this.options[action][option].enabled = options[option].enabled === false? false : true;\n }\n }\n else if (is.bool(options[option]) && is.object(defaults.perAction[option])) {\n this.options[action][option].enabled = options[option];\n }\n else if (options[option] !== undefined) {\n // or if it's not undefined, do a plain assignment\n this.options[action][option] = options[option];\n }\n }\n }\n }\n\n /*\\\n * Interactable.getRect\n [ method ]\n *\n * The default function to get an Interactables bounding rect. Can be\n * overridden using @Interactable.rectChecker.\n *\n - element (Element) #optional The element to measure.\n = (object) The object's bounding rectangle.\n o {\n o top : 0,\n o left : 0,\n o bottom: 0,\n o right : 0,\n o width : 0,\n o height: 0\n o }\n \\*/\n getRect (element) {\n element = element || this.target;\n\n if (is.string(this.target) && !(is.element(element))) {\n element = this._context.querySelector(this.target);\n }\n\n return getElementRect(element);\n }\n\n /*\\\n * Interactable.rectChecker\n [ method ]\n *\n * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n - checker (function) #optional A function which returns this Interactable's bounding rectangle. See @Interactable.getRect\n = (function | object) The checker function or this Interactable\n \\*/\n rectChecker (checker) {\n if (is.function(checker)) {\n this.getRect = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.getRect;\n\n return this;\n }\n\n return this.getRect;\n }\n\n _backCompatOption (optionName, newValue) {\n if (trySelector(newValue) || is.object(newValue)) {\n this.options[optionName] = newValue;\n\n for (const action of actions.names) {\n this.options[action][optionName] = newValue;\n }\n\n return this;\n }\n\n return this.options[optionName];\n }\n\n /*\\\n * Interactable.origin\n [ method ]\n *\n * Gets or sets the origin of the Interactable's element. The x and y\n * of the origin will be subtracted from action event coordinates.\n *\n - origin (object | string) #optional An object eg. { x: 0, y: 0 } or string 'parent', 'self' or any CSS selector\n * OR\n - origin (Element) #optional An HTML or SVG Element whose rect will be used\n **\n = (object) The current origin or this Interactable\n \\*/\n origin (newValue) {\n return this._backCompatOption('origin', newValue);\n }\n\n /*\\\n * Interactable.deltaSource\n [ method ]\n *\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n - newValue (string) #optional Use 'client' if you will be scrolling while interacting; Use 'page' if you want autoScroll to work\n = (string | object) The current deltaSource or this Interactable\n \\*/\n deltaSource (newValue) {\n if (newValue === 'page' || newValue === 'client') {\n this.options.deltaSource = newValue;\n\n return this;\n }\n\n return this.options.deltaSource;\n }\n\n /*\\\n * Interactable.context\n [ method ]\n *\n * Gets the selector context Node of the Interactable. The default is `window.document`.\n *\n = (Node) The context Node of this Interactable\n **\n \\*/\n context () {\n return this._context;\n }\n\n inContext (element) {\n return (this._context === element.ownerDocument\n || nodeContains(this._context, element));\n }\n\n /*\\\n * Interactable.fire\n [ method ]\n *\n * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n - iEvent (InteractEvent) The InteractEvent object to be fired on this Interactable\n = (Interactable) this Interactable\n \\*/\n fire (iEvent) {\n this.events.fire(iEvent);\n\n return this;\n }\n\n _onOffMultiple (method, eventType, listener, options) {\n if (is.string(eventType) && eventType.search(' ') !== -1) {\n eventType = eventType.trim().split(/ +/);\n }\n\n if (is.array(eventType)) {\n for (let i = 0; i < eventType.length; i++) {\n this[method](eventType[i], listener, options);\n }\n\n return true;\n }\n\n if (is.object(eventType)) {\n for (const prop in eventType) {\n this[method](prop, eventType[prop], listener);\n }\n\n return true;\n }\n }\n\n /*\\\n * Interactable.on\n [ method ]\n *\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n - eventType (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) This Interactable\n \\*/\n on (eventType, listener, options) {\n if (this._onOffMultiple('on', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.on(eventType, listener);\n }\n // delegated event for selector\n else if (is.string(this.target)) {\n events.addDelegate(this.target, this._context, eventType, listener, options);\n }\n else {\n events.add(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.off\n [ method ]\n *\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n - eventType (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) This Interactable\n \\*/\n off (eventType, listener, options) {\n if (this._onOffMultiple('off', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n // if it is an action event type\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.off(eventType, listener);\n }\n // delegated event\n else if (is.string(this.target)) {\n events.removeDelegate(this.target, this._context, eventType, listener, options);\n }\n // remove listener from this Interatable's element\n else {\n events.remove(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.set\n [ method ]\n *\n * Reset the options of this Interactable\n - options (object) The new settings to apply\n = (object) This Interactable\n \\*/\n set (options) {\n if (!is.object(options)) {\n options = {};\n }\n\n this.options = extend({}, defaults.base);\n\n const perActions = extend({}, defaults.perAction);\n\n for (const actionName in actions.methodDict) {\n const methodName = actions.methodDict[actionName];\n\n this.options[actionName] = extend({}, defaults[actionName]);\n\n this.setPerAction(actionName, perActions);\n\n this[methodName](options[actionName]);\n }\n\n for (const setting of Interactable.settingsMethods) {\n this.options[setting] = defaults.base[setting];\n\n if (setting in options) {\n this[setting](options[setting]);\n }\n }\n\n signals.fire('set', {\n options,\n interactable: this,\n });\n\n return this;\n }\n\n /*\\\n * Interactable.unset\n [ method ]\n *\n * Remove this interactable from the list of interactables and remove\n * it's action capabilities and event listeners\n *\n = (object) @interact\n \\*/\n unset () {\n events.remove(this.target, 'all');\n\n if (is.string(this.target)) {\n // remove delegated events\n for (const type in events.delegatedEvents) {\n const delegated = events.delegatedEvents[type];\n\n if (delegated.selectors[0] === this.target\n && delegated.contexts[0] === this._context) {\n\n delegated.selectors.splice(0, 1);\n delegated.contexts .splice(0, 1);\n delegated.listeners.splice(0, 1);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegated[type] = null;\n }\n }\n\n events.remove(this._context, type, events.delegateListener);\n events.remove(this._context, type, events.delegateUseCapture, true);\n }\n }\n else {\n events.remove(this, 'all');\n }\n\n signals.fire('unset', { interactable: this });\n\n scope.interactables.splice(indexOf(scope.interactables, this), 1);\n\n // Stop related interactions when an Interactable is unset\n for (const interaction of scope.interactions || []) {\n if (interaction.target === this && interaction.interacting()) {\n interaction.stop();\n }\n }\n\n return scope.interact;\n }\n}\n\nscope.interactables.indexOfElement = function indexOfElement (target, context) {\n context = context || scope.document;\n\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n if (interactable.target === target && interactable._context === context) {\n return i;\n }\n }\n return -1;\n};\n\nscope.interactables.get = function interactableGet (element, options, dontCheckInContext) {\n const ret = this[this.indexOfElement(element, options && options.context)];\n\n return ret && (is.string(element) || dontCheckInContext || ret.inContext(element))? ret : null;\n};\n\nscope.interactables.forEachSelector = function (callback, element) {\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n // skip non CSS selector targets and out of context elements\n if (!is.string(interactable.target)\n || (element && !interactable.inContext(element))) {\n continue;\n }\n\n const ret = callback(interactable, interactable.target, interactable._context, i, this);\n\n if (ret !== undefined) {\n return ret;\n }\n }\n};\n\n// all interact.js eventTypes\nInteractable.eventTypes = scope.eventTypes = [];\n\nInteractable.signals = signals;\n\nInteractable.settingsMethods = [ 'deltaSource', 'origin', 'preventDefault', 'rectChecker' ];\n\nmodule.exports = Interactable;\n","const scope = require('./scope');\nconst utils = require('./utils');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst domObjects = require('./utils/domObjects');\nconst finder = require('./utils/interactionFinder');\nconst signals = require('./utils/Signals').new();\n\nconst listeners = {};\nconst methodNames = [\n 'pointerDown', 'pointerMove', 'pointerUp',\n 'updatePointer', 'removePointer',\n];\n\n// for ignoring browser's simulated mouse events\nlet prevTouchTime = 0;\n\n// all active and idle interactions\nscope.interactions = [];\n\nclass Interaction {\n constructor ({ pointerType }) {\n this.target = null; // current interactable being interacted with\n this.element = null; // the target element of the interactable\n\n this.prepared = { // action that's ready to be fired on next move event\n name : null,\n axis : null,\n edges: null,\n };\n\n // keep track of added pointers\n this.pointers = [];\n this.pointerIds = [];\n this.downTargets = [];\n this.downTimes = [];\n\n // Previous native pointer move event coordinates\n this.prevCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n // current native pointer move event coordinates\n this.curCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Starting InteractEvent pointer coordinates\n this.startCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Change in coordinates and time of the pointer\n this.pointerDelta = {\n page : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n client : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n timeStamp: 0,\n };\n\n this.downEvent = null; // pointerdown/mousedown/touchstart event\n this.downPointer = {};\n\n this._eventTarget = null;\n this._curEventTarget = null;\n\n this.prevEvent = null; // previous action event\n\n this.pointerIsDown = false;\n this.pointerWasMoved = false;\n this._interacting = false;\n\n this.pointerType = pointerType;\n\n signals.fire('new', this);\n\n scope.interactions.push(this);\n }\n\n pointerDown (pointer, event, eventTarget) {\n const pointerIndex = this.updatePointer(pointer, event, true);\n\n signals.fire('down', {\n pointer,\n event,\n eventTarget,\n pointerIndex,\n interaction: this,\n });\n }\n\n /*\\\n * Interaction.start\n [ method ]\n *\n * Start an action with the given Interactable and Element as tartgets. The\n * action must be enabled for the target Interactable and an appropriate number\n * of pointers must be held down - 1 for drag/resize, 2 for gesture.\n *\n * Use it with `interactable.able({ manualStart: false })` to always\n * [start actions manually](https://github.com/taye/interact.js/issues/114)\n *\n - action (object) The action to be performed - drag, resize, etc.\n - target (Interactable) The Interactable to target\n - element (Element) The DOM Element to target\n = (object) interact\n **\n | interact(target)\n | .draggable({\n | // disable the default drag start by down->move\n | manualStart: true\n | })\n | // start dragging after the user holds the pointer down\n | .on('hold', function (event) {\n | var interaction = event.interaction;\n |\n | if (!interaction.interacting()) {\n | interaction.start({ name: 'drag' },\n | event.interactable,\n | event.currentTarget);\n | }\n | });\n \\*/\n start (action, target, element) {\n if (this.interacting()\n || !this.pointerIsDown\n || this.pointerIds.length < (action.name === 'gesture'? 2 : 1)) {\n return;\n }\n\n // if this interaction had been removed after stopping\n // add it back\n if (utils.indexOf(scope.interactions, this) === -1) {\n scope.interactions.push(this);\n }\n\n utils.copyAction(this.prepared, action);\n this.target = target;\n this.element = element;\n\n signals.fire('action-start', {\n interaction: this,\n event: this.downEvent,\n });\n }\n\n pointerMove (pointer, event, eventTarget) {\n if (!this.simulation) {\n this.updatePointer(pointer);\n utils.setCoords(this.curCoords, this.pointers);\n }\n\n const duplicateMove = (this.curCoords.page.x === this.prevCoords.page.x\n && this.curCoords.page.y === this.prevCoords.page.y\n && this.curCoords.client.x === this.prevCoords.client.x\n && this.curCoords.client.y === this.prevCoords.client.y);\n\n let dx;\n let dy;\n\n // register movement greater than pointerMoveTolerance\n if (this.pointerIsDown && !this.pointerWasMoved) {\n dx = this.curCoords.client.x - this.startCoords.client.x;\n dy = this.curCoords.client.y - this.startCoords.client.y;\n\n this.pointerWasMoved = utils.hypot(dx, dy) > Interaction.pointerMoveTolerance;\n }\n\n const signalArg = {\n pointer,\n pointerIndex: this.getPointerIndex(pointer),\n event,\n eventTarget,\n dx,\n dy,\n duplicate: duplicateMove,\n interaction: this,\n interactingBeforeMove: this.interacting(),\n };\n\n if (!duplicateMove) {\n // set pointer coordinate, time changes and speeds\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n }\n\n signals.fire('move', signalArg);\n\n if (!duplicateMove) {\n // if interacting, fire an 'action-move' signal etc\n if (this.interacting()) {\n this.doMove(signalArg);\n }\n\n if (this.pointerWasMoved) {\n utils.copyCoords(this.prevCoords, this.curCoords);\n }\n }\n }\n\n /*\\\n * Interaction.doMove\n [ method ]\n *\n * Force a move of the current action at the same coordinates. Useful if\n * snap/restrict has been changed and you want a movement with the new\n * settings.\n *\n **\n | interact(target)\n | .draggable(true)\n | .on('dragmove', function (event) {\n | if (someCondition) {\n | // change the snap settings\n | event.interactable.draggable({ snap: { targets: [] }});\n | // fire another move event with re-calculated snap\n | event.interaction.doMove();\n | }\n | });\n \\*/\n doMove (signalArg) {\n signalArg = utils.extend({\n pointer: this.pointers[0],\n event: this.prevEvent,\n eventTarget: this._eventTarget,\n interaction: this,\n }, signalArg || {});\n\n signals.fire('before-action-move', signalArg);\n\n if (!this._dontFireMove) {\n signals.fire('action-move', signalArg);\n }\n\n this._dontFireMove = false;\n }\n\n // End interact move events and stop auto-scroll unless simulation is running\n pointerUp (pointer, event, eventTarget, curEventTarget) {\n const pointerIndex = this.getPointerIndex(pointer);\n\n signals.fire(/cancel$/i.test(event.type)? 'cancel' : 'up', {\n pointer,\n pointerIndex,\n event,\n eventTarget,\n curEventTarget,\n interaction: this,\n });\n\n if (!this.simulation) {\n this.end(event);\n }\n\n this.pointerIsDown = false;\n this.removePointer(pointer, event);\n }\n\n /*\\\n * Interaction.end\n [ method ]\n *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n - event (PointerEvent) #optional\n **\n | interact(target)\n | .draggable(true)\n | .on('move', function (event) {\n | if (event.pageX > 1000) {\n | // end the current action\n | event.interaction.end();\n | // stop all further listeners from being called\n | event.stopImmediatePropagation();\n | }\n | });\n \\*/\n end (event) {\n event = event || this.prevEvent;\n\n if (this.interacting()) {\n signals.fire('action-end', {\n event,\n interaction: this,\n });\n }\n\n this.stop();\n }\n\n currentAction () {\n return this._interacting? this.prepared.name: null;\n }\n\n interacting () {\n return this._interacting;\n }\n\n stop () {\n signals.fire('stop', { interaction: this });\n\n if (this._interacting) {\n signals.fire('stop-active', { interaction: this });\n signals.fire('stop-' + this.prepared.name, { interaction: this });\n }\n\n this.target = this.element = null;\n\n this._interacting = false;\n this.prepared.name = this.prevEvent = null;\n }\n\n getPointerIndex (pointer) {\n // mouse and pen interactions may have only one pointer\n if (this.pointerType === 'mouse' || this.pointerType === 'pen') {\n return 0;\n }\n\n return utils.indexOf(this.pointerIds, utils.getPointerId(pointer));\n }\n\n updatePointer (pointer, event, down = event && /(down|start)$/i.test(event.type)) {\n const id = utils.getPointerId(pointer);\n let index = this.getPointerIndex(pointer);\n\n if (index === -1) {\n index = this.pointerIds.length;\n this.pointerIds[index] = id;\n }\n\n if (down) {\n signals.fire('update-pointer-down', {\n pointer,\n event,\n down,\n pointerId: id,\n pointerIndex: index,\n interaction: this,\n });\n }\n\n this.pointers[index] = pointer;\n\n return index;\n }\n\n removePointer (pointer, event) {\n const index = this.getPointerIndex(pointer);\n\n if (index === -1) { return; }\n\n signals.fire('remove-pointer', {\n pointer,\n event,\n pointerIndex: index,\n interaction: this,\n });\n\n this.pointers .splice(index, 1);\n this.pointerIds .splice(index, 1);\n this.downTargets.splice(index, 1);\n this.downTimes .splice(index, 1);\n }\n\n _updateEventTargets (target, currentTarget) {\n this._eventTarget = target;\n this._curEventTarget = currentTarget;\n }\n}\n\nfor (let i = 0, len = methodNames.length; i < len; i++) {\n const method = methodNames[i];\n\n listeners[method] = doOnInteractions(method);\n}\n\nfunction doOnInteractions (method) {\n return (function (event) {\n const pointerType = utils.getPointerType(event);\n const [eventTarget, curEventTarget] = utils.getEventTargets(event);\n const matches = []; // [ [pointer, interaction], ...]\n\n if (browser.supportsTouch && /touch/.test(event.type)) {\n prevTouchTime = new Date().getTime();\n\n for (let i = 0; i < event.changedTouches.length; i++) {\n const pointer = event.changedTouches[i];\n const interaction = finder.search(pointer, event.type, eventTarget);\n\n matches.push([pointer, interaction || new Interaction({ pointerType })]);\n }\n }\n else {\n let invalidPointer = false;\n\n if (!browser.supportsPointerEvent && /mouse/.test(event.type)) {\n // ignore mouse events while touch interactions are active\n for (let i = 0; i < scope.interactions.length && !invalidPointer; i++) {\n invalidPointer = scope.interactions[i].pointerType !== 'mouse' && scope.interactions[i].pointerIsDown;\n }\n\n // try to ignore mouse events that are simulated by the browser\n // after a touch event\n invalidPointer = invalidPointer\n || (new Date().getTime() - prevTouchTime < 500)\n // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated\n || event.timeStamp === 0;\n }\n\n if (!invalidPointer) {\n let interaction = finder.search(event, event.type, eventTarget);\n\n if (!interaction) {\n interaction = new Interaction({ pointerType });\n }\n\n matches.push([event, interaction]);\n }\n }\n\n for (const [pointer, interaction] of matches) {\n interaction._updateEventTargets(eventTarget, curEventTarget);\n interaction[method](pointer, event, eventTarget, curEventTarget);\n }\n });\n}\n\nfunction endAll (event) {\n for (let i = 0; i < scope.interactions.length; i++) {\n const interaction = scope.interactions[i];\n\n interaction.end(event);\n signals.fire('endall', { event, interaction });\n }\n}\n\nconst docEvents = { /* 'eventType': listenerFunc */ };\nconst pEventTypes = browser.pEventTypes;\n\nif (domObjects.PointerEvent) {\n docEvents[pEventTypes.down ] = listeners.pointerDown;\n docEvents[pEventTypes.move ] = listeners.pointerMove;\n docEvents[pEventTypes.up ] = listeners.pointerUp;\n docEvents[pEventTypes.cancel] = listeners.pointerUp;\n}\nelse {\n docEvents.mousedown = listeners.pointerDown;\n docEvents.mousemove = listeners.pointerMove;\n docEvents.mouseup = listeners.pointerUp;\n\n docEvents.touchstart = listeners.pointerDown;\n docEvents.touchmove = listeners.pointerMove;\n docEvents.touchend = listeners.pointerUp;\n docEvents.touchcancel = listeners.pointerUp;\n}\n\ndocEvents.blur = endAll;\n\nfunction onDocSignal ({ doc }, signalName) {\n const eventMethod = signalName.indexOf('add') === 0\n ? events.add : events.remove;\n\n // delegate event listener\n for (const eventType in scope.delegatedEvents) {\n eventMethod(doc, eventType, events.delegateListener);\n eventMethod(doc, eventType, events.delegateUseCapture, true);\n }\n\n for (const eventType in docEvents) {\n eventMethod(doc, eventType, docEvents[eventType]);\n }\n}\n\nsignals.on('update-pointer-down', ({ interaction, pointer, pointerId, pointerIndex, event, eventTarget, down }) => {\n interaction.pointerIds[pointerIndex] = pointerId;\n interaction.pointers[pointerIndex] = pointer;\n\n if (down) {\n interaction.pointerIsDown = true;\n }\n\n if (!interaction.interacting()) {\n utils.setCoords(interaction.startCoords, interaction.pointers);\n\n utils.copyCoords(interaction.curCoords , interaction.startCoords);\n utils.copyCoords(interaction.prevCoords, interaction.startCoords);\n\n interaction.downEvent = event;\n interaction.downTimes[pointerIndex] = interaction.curCoords.timeStamp;\n interaction.downTargets[pointerIndex] = eventTarget || event && utils.getEventTargets(event)[0];\n interaction.pointerWasMoved = false;\n\n utils.pointerExtend(interaction.downPointer, pointer);\n }\n});\n\nscope.signals.on('add-document' , onDocSignal);\nscope.signals.on('remove-document', onDocSignal);\n\nInteraction.pointerMoveTolerance = 1;\nInteraction.doOnInteractions = doOnInteractions;\nInteraction.endAll = endAll;\nInteraction.signals = signals;\nInteraction.docEvents = docEvents;\n\nscope.endAllInteractions = endAll;\n\nmodule.exports = Interaction;\n","const Interaction = require('../Interaction');\nconst InteractEvent = require('../InteractEvent');\n\nconst actions = {\n firePrepared,\n names: [],\n methodDict: {},\n};\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n interaction._interacting = true;\n firePrepared(interaction, event, 'start');\n});\n\nInteraction.signals.on('action-move', function ({ interaction, event, preEnd }) {\n firePrepared(interaction, event, 'move', preEnd);\n\n // if the action was ended in a listener\n if (!interaction.interacting()) { return false; }\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n firePrepared(interaction, event, 'end');\n});\n\nfunction firePrepared (interaction, event, phase, preEnd) {\n const actionName = interaction.prepared.name;\n\n const newEvent = new InteractEvent(interaction, event, actionName, phase, interaction.element, null, preEnd);\n\n interaction.target.fire(newEvent);\n interaction.prevEvent = newEvent;\n}\n\nmodule.exports = actions;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drag = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n startAxis : 'xy',\n lockAxis : 'xy',\n },\n\n checker: function (pointer, event, interactable) {\n const dragOptions = interactable.options.drag;\n\n return dragOptions.enabled\n ? { name: 'drag', axis: (dragOptions.lockAxis === 'start'\n ? dragOptions.startAxis\n : dragOptions.lockAxis)}\n : null;\n },\n\n getCursor: function () {\n return 'move';\n },\n};\n\nInteraction.signals.on('before-action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n interaction.curCoords.page.y = interaction.startCoords.page.y;\n interaction.curCoords.client.y = interaction.startCoords.client.y;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vx);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vx);\n interaction.pointerDelta.client.vy = 0;\n interaction.pointerDelta.page.vy = 0;\n }\n else if (axis === 'y') {\n interaction.curCoords.page.x = interaction.startCoords.page.x;\n interaction.curCoords.client.x = interaction.startCoords.client.x;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vy);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vy);\n interaction.pointerDelta.client.vx = 0;\n interaction.pointerDelta.page.vx = 0;\n }\n});\n\n// dragmove\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'dragmove') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n iEvent.pageY = interaction.startCoords.page.y;\n iEvent.clientY = interaction.startCoords.client.y;\n iEvent.dy = 0;\n }\n else if (axis === 'y') {\n iEvent.pageX = interaction.startCoords.page.x;\n iEvent.clientX = interaction.startCoords.client.x;\n iEvent.dx = 0;\n }\n});\n\n/*\\\n * Interactable.draggable\n [ method ]\n *\n * Gets or sets whether drag actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of drag events\n | var isDraggable = interact('ul li').draggable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on drag events (object makes the Interactable draggable)\n = (object) This Interactable\n | interact(element).draggable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // the axis in which the first movement must be\n | // for the drag sequence to start\n | // 'xy' by default - any direction\n | startAxis: 'x' || 'y' || 'xy',\n |\n | // 'xy' by default - don't restrict to one axis (move in any direction)\n | // 'x' or 'y' to restrict movement to either axis\n | // 'start' to restrict movement to the axis the drag started in\n | lockAxis: 'x' || 'y' || 'xy' || 'start',\n |\n | // max number of drags that can happen concurrently\n | // with elements of this Interactable. Infinity by default\n | max: Infinity,\n |\n | // max number of drags that can target the same element+Interactable\n | // 1 by default\n | maxPerElement: 2\n | });\n\\*/\nInteractable.prototype.draggable = function (options) {\n if (utils.is.object(options)) {\n this.options.drag.enabled = options.enabled === false? false: true;\n this.setPerAction('drag', options);\n this.setOnEvents('drag', options);\n\n if (/^(xy|x|y|start)$/.test(options.lockAxis)) {\n this.options.drag.lockAxis = options.lockAxis;\n }\n if (/^(xy|x|y)$/.test(options.startAxis)) {\n this.options.drag.startAxis = options.startAxis;\n }\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drag.enabled = options;\n\n if (!options) {\n this.ondragstart = this.ondragstart = this.ondragend = null;\n }\n\n return this;\n }\n\n return this.options.drag;\n};\n\nactions.drag = drag;\nactions.names.push('drag');\nutils.merge(Interactable.eventTypes, [\n 'dragstart',\n 'dragmove',\n 'draginertiastart',\n 'draginertiaresume',\n 'dragend',\n]);\nactions.methodDict.drag = 'draggable';\n\ndefaultOptions.drag = drag.defaults;\n\nmodule.exports = drag;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst scope = require('../scope');\nconst interact = require('../interact');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drop = {\n defaults: {\n enabled: false,\n accept : null,\n overlap: 'pointer',\n },\n};\n\nlet dynamicDrop = false;\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // reset active dropzones\n interaction.activeDrops.dropzones = [];\n interaction.activeDrops.elements = [];\n interaction.activeDrops.rects = [];\n\n interaction.dropEvents = null;\n\n if (!interaction.dynamicDrop) {\n setActiveDrops(interaction, interaction.element);\n }\n\n const dragEvent = interaction.prevEvent;\n const dropEvents = getDropEvents(interaction, event, dragEvent);\n\n if (dropEvents.activate) {\n fireActiveDrops(interaction, dropEvents.activate);\n }\n});\n\nInteractEvent.signals.on('new', function ({ interaction, iEvent, event }) {\n if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { return; }\n\n const draggableElement = interaction.element;\n const dragEvent = iEvent;\n const dropResult = getDrop(dragEvent, event, draggableElement);\n\n interaction.dropTarget = dropResult.dropzone;\n interaction.dropElement = dropResult.element;\n\n interaction.dropEvents = getDropEvents(interaction, event, dragEvent);\n});\n\nInteraction.signals.on('action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n fireDropEvents(interaction, interaction.dropEvents);\n});\n\nInteraction.signals.on('action-end', function ({ interaction }) {\n if (interaction.prepared.name === 'drag') {\n fireDropEvents(interaction, interaction.dropEvents);\n }\n});\n\nInteraction.signals.on('stop-drag', function ({ interaction }) {\n interaction.activeDrops.dropzones =\n interaction.activeDrops.elements =\n interaction.activeDrops.rects =\n interaction.dropEvents = null;\n});\n\nfunction collectDrops (interaction, element) {\n const drops = [];\n const elements = [];\n\n element = element || interaction.element;\n\n // collect all dropzones and their elements which qualify for a drop\n for (const current of scope.interactables) {\n if (!current.options.drop.enabled) { continue; }\n\n const accept = current.options.drop.accept;\n\n // test the draggable element against the dropzone's accept setting\n if ((utils.is.element(accept) && accept !== element)\n || (utils.is.string(accept)\n && !utils.matchesSelector(element, accept))) {\n\n continue;\n }\n\n // query for new elements if necessary\n const dropElements = utils.is.string(current.target)\n ? current._context.querySelectorAll(current.target)\n : [current.target];\n\n for (let i = 0; i < dropElements.length; i++) {\n const currentElement = dropElements[i];\n\n if (currentElement !== element) {\n drops.push(current);\n elements.push(currentElement);\n }\n }\n }\n\n return {\n elements,\n dropzones: drops,\n };\n}\n\nfunction fireActiveDrops (interaction, event) {\n let prevElement;\n\n // loop through all active dropzones and trigger event\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n const current = interaction.activeDrops.dropzones[i];\n const currentElement = interaction.activeDrops.elements [i];\n\n // prevent trigger of duplicate events on same element\n if (currentElement !== prevElement) {\n // set current element as event target\n event.target = currentElement;\n current.fire(event);\n }\n prevElement = currentElement;\n }\n}\n\n// Collect a new set of possible drops and save them in activeDrops.\n// setActiveDrops should always be called when a drag has just started or a\n// drag event happens while dynamicDrop is true\nfunction setActiveDrops (interaction, dragElement) {\n // get dropzones and their elements that could receive the draggable\n const possibleDrops = collectDrops(interaction, dragElement, true);\n\n interaction.activeDrops.dropzones = possibleDrops.dropzones;\n interaction.activeDrops.elements = possibleDrops.elements;\n interaction.activeDrops.rects = [];\n\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n interaction.activeDrops.rects[i] =\n interaction.activeDrops.dropzones[i].getRect(interaction.activeDrops.elements[i]);\n }\n}\n\nfunction getDrop (dragEvent, event, dragElement) {\n const interaction = dragEvent.interaction;\n const validDrops = [];\n\n if (dynamicDrop) {\n setActiveDrops(interaction, dragElement);\n }\n\n // collect all dropzones and their elements which qualify for a drop\n for (let j = 0; j < interaction.activeDrops.dropzones.length; j++) {\n const current = interaction.activeDrops.dropzones[j];\n const currentElement = interaction.activeDrops.elements [j];\n const rect = interaction.activeDrops.rects [j];\n\n validDrops.push(current.dropCheck(dragEvent, event, interaction.target, dragElement, currentElement, rect)\n ? currentElement\n : null);\n }\n\n // get the most appropriate dropzone based on DOM depth and order\n const dropIndex = utils.indexOfDeepestElement(validDrops);\n\n return {\n dropzone: interaction.activeDrops.dropzones[dropIndex] || null,\n element : interaction.activeDrops.elements [dropIndex] || null,\n };\n}\n\nfunction getDropEvents (interaction, pointerEvent, dragEvent) {\n const dropEvents = {\n enter : null,\n leave : null,\n activate : null,\n deactivate: null,\n move : null,\n drop : null,\n };\n\n const tmpl = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n };\n\n if (interaction.dropElement !== interaction.prevDropElement) {\n // if there was a prevDropTarget, create a dragleave event\n if (interaction.prevDropTarget) {\n dropEvents.leave = utils.extend({ type: 'dragleave' }, tmpl);\n\n dragEvent.dragLeave = dropEvents.leave.target = interaction.prevDropElement;\n dragEvent.prevDropzone = dropEvents.leave.dropzone = interaction.prevDropTarget;\n }\n // if the dropTarget is not null, create a dragenter event\n if (interaction.dropTarget) {\n dropEvents.enter = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n type : 'dragenter',\n };\n\n dragEvent.dragEnter = interaction.dropElement;\n dragEvent.dropzone = interaction.dropTarget;\n }\n }\n\n if (dragEvent.type === 'dragend' && interaction.dropTarget) {\n dropEvents.drop = utils.extend({ type: 'drop' }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n dragEvent.relatedTarget = interaction.dropElement;\n }\n if (dragEvent.type === 'dragstart') {\n dropEvents.activate = utils.extend({ type: 'dropactivate' }, tmpl);\n\n dropEvents.activate.target = null;\n dropEvents.activate.dropzone = null;\n }\n if (dragEvent.type === 'dragend') {\n dropEvents.deactivate = utils.extend({ type: 'dropdeactivate' }, tmpl);\n\n dropEvents.deactivate.target = null;\n dropEvents.deactivate.dropzone = null;\n }\n if (dragEvent.type === 'dragmove' && interaction.dropTarget) {\n dropEvents.move = utils.extend({\n dragmove : dragEvent,\n type : 'dropmove',\n }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n }\n\n return dropEvents;\n}\n\nfunction fireDropEvents (interaction, dropEvents) {\n if (dropEvents.leave) { interaction.prevDropTarget.fire(dropEvents.leave); }\n if (dropEvents.move ) { interaction.dropTarget.fire(dropEvents.move ); }\n if (dropEvents.enter) { interaction.dropTarget.fire(dropEvents.enter); }\n if (dropEvents.drop ) { interaction.dropTarget.fire(dropEvents.drop ); }\n if (dropEvents.deactivate) {\n fireActiveDrops(interaction, dropEvents.deactivate);\n }\n\n interaction.prevDropTarget = interaction.dropTarget;\n interaction.prevDropElement = interaction.dropElement;\n}\n\n/*\\\n * Interactable.dropzone\n [ method ]\n *\n * Returns or sets whether elements can be dropped onto this\n * Interactable to trigger drop events\n *\n * Dropzones can receive the following events:\n * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends\n * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone\n * - `dragmove` when a draggable that has entered the dropzone is moved\n * - `drop` when a draggable is dropped into this dropzone\n *\n * Use the `accept` option to allow only elements that match the given CSS\n * selector or element. The value can be:\n *\n * - **an Element** - only that element can be dropped into this dropzone.\n * - **a string**, - the element being dragged must match it as a CSS selector.\n * - **`null`** - accept options is cleared - it accepts any element.\n *\n * Use the `overlap` option to set how drops are checked for. The allowed\n * values are:\n *\n * - `'pointer'`, the pointer must be over the dropzone (default)\n * - `'center'`, the draggable element's center must be over the dropzone\n * - a number from 0-1 which is the `(intersection area) / (draggable area)`.\n * e.g. `0.5` for drop to happen when half of the area of the draggable is\n * over the dropzone\n *\n * Use the `checker` option to specify a function to check if a dragged\n * element is over this Interactable.\n *\n | interact(target)\n | .dropChecker(function(dragEvent, // related dragmove or dragend event\n | event, // TouchEvent/PointerEvent/MouseEvent\n | dropped, // bool result of the default checker\n | dropzone, // dropzone Interactable\n | dropElement, // dropzone elemnt\n | draggable, // draggable Interactable\n | draggableElement) {// draggable element\n |\n | return dropped && event.target.hasAttribute('allow-drop');\n | }\n *\n *\n - options (boolean | object | null) #optional The new value to be set.\n | interact('.drop').dropzone({\n | accept: '.can-drop' || document.getElementById('single-drop'),\n | overlap: 'pointer' || 'center' || zeroToOne\n | }\n = (boolean | object) The current setting or this Interactable\n\\*/\nInteractable.prototype.dropzone = function (options) {\n if (utils.is.object(options)) {\n this.options.drop.enabled = options.enabled === false? false: true;\n\n if (utils.is.function(options.ondrop) ) { this.events.ondrop = options.ondrop ; }\n if (utils.is.function(options.ondropactivate) ) { this.events.ondropactivate = options.ondropactivate ; }\n if (utils.is.function(options.ondropdeactivate)) { this.events.ondropdeactivate = options.ondropdeactivate; }\n if (utils.is.function(options.ondragenter) ) { this.events.ondragenter = options.ondragenter ; }\n if (utils.is.function(options.ondragleave) ) { this.events.ondragleave = options.ondragleave ; }\n if (utils.is.function(options.ondropmove) ) { this.events.ondropmove = options.ondropmove ; }\n\n if (/^(pointer|center)$/.test(options.overlap)) {\n this.options.drop.overlap = options.overlap;\n }\n else if (utils.is.number(options.overlap)) {\n this.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0);\n }\n if ('accept' in options) {\n this.options.drop.accept = options.accept;\n }\n if ('checker' in options) {\n this.options.drop.checker = options.checker;\n }\n\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drop.enabled = options;\n\n if (!options) {\n this.ondragenter = this.ondragleave = this.ondrop\n = this.ondropactivate = this.ondropdeactivate = null;\n }\n\n return this;\n }\n\n return this.options.drop;\n};\n\nInteractable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) {\n let dropped = false;\n\n // if the dropzone has no rect (eg. display: none)\n // call the custom dropChecker or just return false\n if (!(rect = rect || this.getRect(dropElement))) {\n return (this.options.drop.checker\n ? this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement)\n : false);\n }\n\n const dropOverlap = this.options.drop.overlap;\n\n if (dropOverlap === 'pointer') {\n const origin = utils.getOriginXY(draggable, draggableElement, 'drag');\n const page = utils.getPageXY(dragEvent);\n\n page.x += origin.x;\n page.y += origin.y;\n\n const horizontal = (page.x > rect.left) && (page.x < rect.right);\n const vertical = (page.y > rect.top ) && (page.y < rect.bottom);\n\n dropped = horizontal && vertical;\n }\n\n const dragRect = draggable.getRect(draggableElement);\n\n if (dragRect && dropOverlap === 'center') {\n const cx = dragRect.left + dragRect.width / 2;\n const cy = dragRect.top + dragRect.height / 2;\n\n dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom;\n }\n\n if (dragRect && utils.is.number(dropOverlap)) {\n const overlapArea = (Math.max(0, Math.min(rect.right , dragRect.right ) - Math.max(rect.left, dragRect.left))\n * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top , dragRect.top )));\n\n const overlapRatio = overlapArea / (dragRect.width * dragRect.height);\n\n dropped = overlapRatio >= dropOverlap;\n }\n\n if (this.options.drop.checker) {\n dropped = this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement);\n }\n\n return dropped;\n};\n\nInteractable.signals.on('unset', function ({ interactable }) {\n interactable.dropzone(false);\n});\n\nInteractable.settingsMethods.push('dropChecker');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.dropTarget = null; // the dropzone a drag target might be dropped into\n interaction.dropElement = null; // the element at the time of checking\n interaction.prevDropTarget = null; // the dropzone that was recently dragged away from\n interaction.prevDropElement = null; // the element at the time of checking\n interaction.dropEvents = null; // the dropEvents related to the current drag event\n\n interaction.activeDrops = {\n dropzones: [], // the dropzones that are mentioned below\n elements : [], // elements of dropzones that accept the target draggable\n rects : [], // the rects of the elements mentioned above\n };\n\n});\n\nInteraction.signals.on('stop', function ({ interaction }) {\n interaction.dropTarget = interaction.dropElement =\n interaction.prevDropTarget = interaction.prevDropElement = null;\n});\n\n/*\\\n * interact.dynamicDrop\n [ method ]\n *\n * Returns or sets whether the dimensions of dropzone elements are\n * calculated on every dragmove or only on dragstart for the default\n * dropChecker\n *\n - newValue (boolean) #optional True to check on each move. False to check only before start\n = (boolean | interact) The current setting or interact\n\\*/\ninteract.dynamicDrop = function (newValue) {\n if (utils.is.bool(newValue)) {\n //if (dragging && dynamicDrop !== newValue && !newValue) {\n //calcRects(dropzones);\n //}\n\n dynamicDrop = newValue;\n\n return interact;\n }\n return dynamicDrop;\n};\n\nutils.merge(Interactable.eventTypes, [\n 'dragenter',\n 'dragleave',\n 'dropactivate',\n 'dropdeactivate',\n 'dropmove',\n 'drop',\n]);\nactions.methodDict.drop = 'dropzone';\n\ndefaultOptions.drop = drop.defaults;\n\nmodule.exports = drop;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst gesture = {\n defaults: {\n enabled : false,\n origin : null,\n restrict: null,\n },\n\n checker: function (pointer, event, interactable, element, interaction) {\n if (interaction.pointerIds.length >= 2) {\n return { name: 'gesture' };\n }\n\n return null;\n },\n\n getCursor: function () {\n return '';\n },\n};\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturestart') { return; }\n iEvent.ds = 0;\n\n interaction.gesture.startDistance = interaction.gesture.prevDistance = iEvent.distance;\n interaction.gesture.startAngle = interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.scale = 1;\n});\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturemove') { return; }\n\n iEvent.ds = iEvent.scale - interaction.gesture.scale;\n\n interaction.target.fire(iEvent);\n\n interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.prevDistance = iEvent.distance;\n\n if (iEvent.scale !== Infinity\n && iEvent.scale !== null\n && iEvent.scale !== undefined\n && !isNaN(iEvent.scale)) {\n\n interaction.gesture.scale = iEvent.scale;\n }\n});\n\n/*\\\n * Interactable.gesturable\n [ method ]\n *\n * Gets or sets whether multitouch gestures can be performed on the\n * Interactable's element\n *\n = (boolean) Indicates if this can be the target of gesture events\n | var isGestureable = interact(element).gesturable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on gesture events (makes the Interactable gesturable)\n = (object) this Interactable\n | interact(element).gesturable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // limit multiple gestures.\n | // See the explanation in @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n\\*/\nInteractable.prototype.gesturable = function (options) {\n if (utils.is.object(options)) {\n this.options.gesture.enabled = options.enabled === false? false: true;\n this.setPerAction('gesture', options);\n this.setOnEvents('gesture', options);\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.gesture.enabled = options;\n\n if (!options) {\n this.ongesturestart = this.ongesturestart = this.ongestureend = null;\n }\n\n return this;\n }\n\n return this.options.gesture;\n};\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action, event, starting, ending, deltaSource }) {\n if (action !== 'gesture') { return; }\n\n const pointers = interaction.pointers;\n\n iEvent.touches = [pointers[0], pointers[1]];\n\n if (starting) {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = 1;\n iEvent.ds = 0;\n iEvent.angle = utils.touchAngle(pointers, undefined, deltaSource);\n iEvent.da = 0;\n }\n else if (ending || event instanceof InteractEvent) {\n iEvent.distance = interaction.prevEvent.distance;\n iEvent.box = interaction.prevEvent.box;\n iEvent.scale = interaction.prevEvent.scale;\n iEvent.ds = iEvent.scale - 1;\n iEvent.angle = interaction.prevEvent.angle;\n iEvent.da = iEvent.angle - interaction.gesture.startAngle;\n }\n else {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = iEvent.distance / interaction.gesture.startDistance;\n iEvent.angle = utils.touchAngle(pointers, interaction.gesture.prevAngle, deltaSource);\n\n iEvent.ds = iEvent.scale - interaction.gesture.prevScale;\n iEvent.da = iEvent.angle - interaction.gesture.prevAngle;\n }\n});\n\nInteraction.signals.on('new', function (interaction) {\n interaction.gesture = {\n start: { x: 0, y: 0 },\n\n startDistance: 0, // distance between two touches of touchStart\n prevDistance : 0,\n distance : 0,\n\n scale: 1, // gesture.distance / gesture.startDistance\n\n startAngle: 0, // angle of line joining two touches\n prevAngle : 0, // angle of the previous gesture event\n };\n});\n\nactions.gesture = gesture;\nactions.names.push('gesture');\nutils.merge(Interactable.eventTypes, [\n 'gesturestart',\n 'gesturemove',\n 'gestureend',\n]);\nactions.methodDict.gesture = 'gesturable';\n\ndefaultOptions.gesture = gesture.defaults;\n\nmodule.exports = gesture;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\n// Less Precision with touch input\nconst defaultMargin = browser.supportsTouch || browser.supportsPointerEvent? 20: 10;\n\nconst resize = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n square: false,\n preserveAspectRatio: false,\n axis: 'xy',\n\n // use default margin\n margin: NaN,\n\n // object with props left, right, top, bottom which are\n // true/false values to resize when the pointer is over that edge,\n // CSS selectors to match the handles for each direction\n // or the Elements for each handle\n edges: null,\n\n // a value of 'none' will limit the resize rect to a minimum of 0x0\n // 'negate' will alow the rect to have negative width/height\n // 'reposition' will keep the width/height positive by swapping\n // the top and bottom edges and/or swapping the left and right edges\n invert: 'none',\n },\n\n checker: function (pointer, event, interactable, element, interaction, rect) {\n if (!rect) { return null; }\n\n const page = utils.extend({}, interaction.curCoords.page);\n const options = interactable.options;\n\n if (options.resize.enabled) {\n const resizeOptions = options.resize;\n const resizeEdges = { left: false, right: false, top: false, bottom: false };\n\n // if using resize.edges\n if (utils.is.object(resizeOptions.edges)) {\n for (const edge in resizeEdges) {\n resizeEdges[edge] = checkResizeEdge(edge,\n resizeOptions.edges[edge],\n page,\n interaction._eventTarget,\n element,\n rect,\n resizeOptions.margin || defaultMargin);\n }\n\n resizeEdges.left = resizeEdges.left && !resizeEdges.right;\n resizeEdges.top = resizeEdges.top && !resizeEdges.bottom;\n\n if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) {\n return {\n name: 'resize',\n edges: resizeEdges,\n };\n }\n }\n else {\n const right = options.resize.axis !== 'y' && page.x > (rect.right - defaultMargin);\n const bottom = options.resize.axis !== 'x' && page.y > (rect.bottom - defaultMargin);\n\n if (right || bottom) {\n return {\n name: 'resize',\n axes: (right? 'x' : '') + (bottom? 'y' : ''),\n };\n }\n }\n }\n\n return null;\n },\n\n cursors: (browser.isIe9OrOlder ? {\n x : 'e-resize',\n y : 's-resize',\n xy: 'se-resize',\n\n top : 'n-resize',\n left : 'w-resize',\n bottom : 's-resize',\n right : 'e-resize',\n topleft : 'se-resize',\n bottomright: 'se-resize',\n topright : 'ne-resize',\n bottomleft : 'ne-resize',\n } : {\n x : 'ew-resize',\n y : 'ns-resize',\n xy: 'nwse-resize',\n\n top : 'ns-resize',\n left : 'ew-resize',\n bottom : 'ns-resize',\n right : 'ew-resize',\n topleft : 'nwse-resize',\n bottomright: 'nwse-resize',\n topright : 'nesw-resize',\n bottomleft : 'nesw-resize',\n }),\n\n getCursor: function (action) {\n if (action.axis) {\n return resize.cursors[action.name + action.axis];\n }\n else if (action.edges) {\n let cursorKey = '';\n const edgeNames = ['top', 'bottom', 'left', 'right'];\n\n for (let i = 0; i < 4; i++) {\n if (action.edges[edgeNames[i]]) {\n cursorKey += edgeNames[i];\n }\n }\n\n return resize.cursors[cursorKey];\n }\n },\n};\n\n// resizestart\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'resizestart' || !interaction.prepared.edges) {\n return;\n }\n\n const startRect = interaction.target.getRect(interaction.element);\n const resizeOptions = interaction.target.options.resize;\n\n /*\n * When using the `resizable.square` or `resizable.preserveAspectRatio` options, resizing from one edge\n * will affect another. E.g. with `resizable.square`, resizing to make the right edge larger will make\n * the bottom edge larger by the same amount. We call these 'linked' edges. Any linked edges will depend\n * on the active edges and the edge being interacted with.\n */\n if (resizeOptions.square || resizeOptions.preserveAspectRatio) {\n const linkedEdges = utils.extend({}, interaction.prepared.edges);\n\n linkedEdges.top = linkedEdges.top || (linkedEdges.left && !linkedEdges.bottom);\n linkedEdges.left = linkedEdges.left || (linkedEdges.top && !linkedEdges.right );\n linkedEdges.bottom = linkedEdges.bottom || (linkedEdges.right && !linkedEdges.top );\n linkedEdges.right = linkedEdges.right || (linkedEdges.bottom && !linkedEdges.left );\n\n interaction.prepared._linkedEdges = linkedEdges;\n }\n else {\n interaction.prepared._linkedEdges = null;\n }\n\n // if using `resizable.preserveAspectRatio` option, record aspect ratio at the start of the resize\n if (resizeOptions.preserveAspectRatio) {\n interaction.resizeStartAspectRatio = startRect.width / startRect.height;\n }\n\n interaction.resizeRects = {\n start : startRect,\n current : utils.extend({}, startRect),\n inverted : utils.extend({}, startRect),\n previous : utils.extend({}, startRect),\n delta : {\n left: 0, right : 0, width : 0,\n top : 0, bottom: 0, height: 0,\n },\n };\n\n iEvent.rect = interaction.resizeRects.inverted;\n iEvent.deltaRect = interaction.resizeRects.delta;\n});\n\n// resizemove\nInteractEvent.signals.on('new', function ({ iEvent, phase, interaction }) {\n if (phase !== 'move' || !interaction.prepared.edges) { return; }\n\n const resizeOptions = interaction.target.options.resize;\n const invert = resizeOptions.invert;\n const invertible = invert === 'reposition' || invert === 'negate';\n\n let edges = interaction.prepared.edges;\n\n const start = interaction.resizeRects.start;\n const current = interaction.resizeRects.current;\n const inverted = interaction.resizeRects.inverted;\n const delta = interaction.resizeRects.delta;\n const previous = utils.extend(interaction.resizeRects.previous, inverted);\n const originalEdges = edges;\n\n let dx = iEvent.dx;\n let dy = iEvent.dy;\n\n if (resizeOptions.preserveAspectRatio || resizeOptions.square) {\n // `resize.preserveAspectRatio` takes precedence over `resize.square`\n const startAspectRatio = resizeOptions.preserveAspectRatio\n ? interaction.resizeStartAspectRatio\n : 1;\n\n edges = interaction.prepared._linkedEdges;\n\n if ((originalEdges.left && originalEdges.bottom)\n || (originalEdges.right && originalEdges.top)) {\n dy = -dx / startAspectRatio;\n }\n else if (originalEdges.left || originalEdges.right ) { dy = dx / startAspectRatio; }\n else if (originalEdges.top || originalEdges.bottom) { dx = dy * startAspectRatio; }\n }\n\n // update the 'current' rect without modifications\n if (edges.top ) { current.top += dy; }\n if (edges.bottom) { current.bottom += dy; }\n if (edges.left ) { current.left += dx; }\n if (edges.right ) { current.right += dx; }\n\n if (invertible) {\n // if invertible, copy the current rect\n utils.extend(inverted, current);\n\n if (invert === 'reposition') {\n // swap edge values if necessary to keep width/height positive\n let swap;\n\n if (inverted.top > inverted.bottom) {\n swap = inverted.top;\n\n inverted.top = inverted.bottom;\n inverted.bottom = swap;\n }\n if (inverted.left > inverted.right) {\n swap = inverted.left;\n\n inverted.left = inverted.right;\n inverted.right = swap;\n }\n }\n }\n else {\n // if not invertible, restrict to minimum of 0x0 rect\n inverted.top = Math.min(current.top, start.bottom);\n inverted.bottom = Math.max(current.bottom, start.top);\n inverted.left = Math.min(current.left, start.right);\n inverted.right = Math.max(current.right, start.left);\n }\n\n inverted.width = inverted.right - inverted.left;\n inverted.height = inverted.bottom - inverted.top ;\n\n for (const edge in inverted) {\n delta[edge] = inverted[edge] - previous[edge];\n }\n\n iEvent.edges = interaction.prepared.edges;\n iEvent.rect = inverted;\n iEvent.deltaRect = delta;\n});\n\n/*\\\n * Interactable.resizable\n [ method ]\n *\n * Gets or sets whether resize actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of resize elements\n | var isResizeable = interact('input[type=text]').resizable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on resize events (object makes the Interactable resizable)\n = (object) This Interactable\n | interact(element).resizable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | edges: {\n | top : true, // Use pointer coords to check for resize.\n | left : false, // Disable resizing from left edge.\n | bottom: '.resize-s',// Resize if pointer target matches selector\n | right : handleEl // Resize if pointer target is the given Element\n | },\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height are adjusted at a 1:1 ratio.\n | square: false,\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height maintain the aspect ratio they had when resizing started.\n | preserveAspectRatio: false,\n |\n | // a value of 'none' will limit the resize rect to a minimum of 0x0\n | // 'negate' will allow the rect to have negative width/height\n | // 'reposition' will keep the width/height positive by swapping\n | // the top and bottom edges and/or swapping the left and right edges\n | invert: 'none' || 'negate' || 'reposition'\n |\n | // limit multiple resizes.\n | // See the explanation in the @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n \\*/\nInteractable.prototype.resizable = function (options) {\n if (utils.is.object(options)) {\n this.options.resize.enabled = options.enabled === false? false: true;\n this.setPerAction('resize', options);\n this.setOnEvents('resize', options);\n\n if (/^x$|^y$|^xy$/.test(options.axis)) {\n this.options.resize.axis = options.axis;\n }\n else if (options.axis === null) {\n this.options.resize.axis = defaultOptions.resize.axis;\n }\n\n if (utils.is.bool(options.preserveAspectRatio)) {\n this.options.resize.preserveAspectRatio = options.preserveAspectRatio;\n }\n else if (utils.is.bool(options.square)) {\n this.options.resize.square = options.square;\n }\n\n return this;\n }\n if (utils.is.bool(options)) {\n this.options.resize.enabled = options;\n\n if (!options) {\n this.onresizestart = this.onresizestart = this.onresizeend = null;\n }\n\n return this;\n }\n return this.options.resize;\n};\n\nfunction checkResizeEdge (name, value, page, element, interactableElement, rect, margin) {\n // false, '', undefined, null\n if (!value) { return false; }\n\n // true value, use pointer coords and element rect\n if (value === true) {\n // if dimensions are negative, \"switch\" edges\n const width = utils.is.number(rect.width )? rect.width : rect.right - rect.left;\n const height = utils.is.number(rect.height)? rect.height : rect.bottom - rect.top ;\n\n if (width < 0) {\n if (name === 'left' ) { name = 'right'; }\n else if (name === 'right') { name = 'left' ; }\n }\n if (height < 0) {\n if (name === 'top' ) { name = 'bottom'; }\n else if (name === 'bottom') { name = 'top' ; }\n }\n\n if (name === 'left' ) { return page.x < ((width >= 0? rect.left: rect.right ) + margin); }\n if (name === 'top' ) { return page.y < ((height >= 0? rect.top : rect.bottom) + margin); }\n\n if (name === 'right' ) { return page.x > ((width >= 0? rect.right : rect.left) - margin); }\n if (name === 'bottom') { return page.y > ((height >= 0? rect.bottom: rect.top ) - margin); }\n }\n\n // the remaining checks require an element\n if (!utils.is.element(element)) { return false; }\n\n return utils.is.element(value)\n // the value is an element to use as a resize handle\n ? value === element\n // otherwise check if element matches value as selector\n : utils.matchesUpTo(element, value, interactableElement);\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.resizeAxes = 'xy';\n});\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action }) {\n if (action !== 'resize' || !interaction.resizeAxes) { return; }\n\n const options = interaction.target.options;\n\n if (options.resize.square) {\n if (interaction.resizeAxes === 'y') {\n iEvent.dx = iEvent.dy;\n }\n else {\n iEvent.dy = iEvent.dx;\n }\n iEvent.axes = 'xy';\n }\n else {\n iEvent.axes = interaction.resizeAxes;\n\n if (interaction.resizeAxes === 'x') {\n iEvent.dy = 0;\n }\n else if (interaction.resizeAxes === 'y') {\n iEvent.dx = 0;\n }\n }\n});\n\nactions.resize = resize;\nactions.names.push('resize');\nutils.merge(Interactable.eventTypes, [\n 'resizestart',\n 'resizemove',\n 'resizeinertiastart',\n 'resizeinertiaresume',\n 'resizeend',\n]);\nactions.methodDict.resize = 'resizable';\n\ndefaultOptions.resize = resize.defaults;\n\nmodule.exports = resize;\n","const raf = require('./utils/raf');\nconst getWindow = require('./utils/window').getWindow;\nconst is = require('./utils/is');\nconst domUtils = require('./utils/domUtils');\nconst Interaction = require('./Interaction');\nconst defaultOptions = require('./defaultOptions');\n\nconst autoScroll = {\n defaults: {\n enabled : false,\n container: null, // the item that is scrolled (Window or HTMLElement)\n margin : 60,\n speed : 300, // the scroll speed in pixels per second\n },\n\n interaction: null,\n i: null, // the handle returned by window.setInterval\n x: 0, y: 0, // Direction each pulse is to scroll in\n\n isScrolling: false,\n prevTime: 0,\n\n start: function (interaction) {\n autoScroll.isScrolling = true;\n raf.cancel(autoScroll.i);\n\n autoScroll.interaction = interaction;\n autoScroll.prevTime = new Date().getTime();\n autoScroll.i = raf.request(autoScroll.scroll);\n },\n\n stop: function () {\n autoScroll.isScrolling = false;\n raf.cancel(autoScroll.i);\n },\n\n // scroll the window by the values in scroll.x/y\n scroll: function () {\n const options = autoScroll.interaction.target.options[autoScroll.interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(autoScroll.interaction.element);\n const now = new Date().getTime();\n // change in time in seconds\n const dt = (now - autoScroll.prevTime) / 1000;\n // displacement\n const s = options.speed * dt;\n\n if (s >= 1) {\n if (is.window(container)) {\n container.scrollBy(autoScroll.x * s, autoScroll.y * s);\n }\n else if (container) {\n container.scrollLeft += autoScroll.x * s;\n container.scrollTop += autoScroll.y * s;\n }\n\n autoScroll.prevTime = now;\n }\n\n if (autoScroll.isScrolling) {\n raf.cancel(autoScroll.i);\n autoScroll.i = raf.request(autoScroll.scroll);\n }\n },\n check: function (interactable, actionName) {\n const options = interactable.options;\n\n return options[actionName].autoScroll && options[actionName].autoScroll.enabled;\n },\n onInteractionMove: function ({ interaction, pointer }) {\n if (!(interaction.interacting()\n && autoScroll.check(interaction.target, interaction.prepared.name))) {\n return;\n }\n\n if (interaction.simulation) {\n autoScroll.x = autoScroll.y = 0;\n return;\n }\n\n let top;\n let right;\n let bottom;\n let left;\n\n const options = interaction.target.options[interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(interaction.element);\n\n if (is.window(container)) {\n left = pointer.clientX < autoScroll.margin;\n top = pointer.clientY < autoScroll.margin;\n right = pointer.clientX > container.innerWidth - autoScroll.margin;\n bottom = pointer.clientY > container.innerHeight - autoScroll.margin;\n }\n else {\n const rect = domUtils.getElementClientRect(container);\n\n left = pointer.clientX < rect.left + autoScroll.margin;\n top = pointer.clientY < rect.top + autoScroll.margin;\n right = pointer.clientX > rect.right - autoScroll.margin;\n bottom = pointer.clientY > rect.bottom - autoScroll.margin;\n }\n\n autoScroll.x = (right ? 1: left? -1: 0);\n autoScroll.y = (bottom? 1: top? -1: 0);\n\n if (!autoScroll.isScrolling) {\n // set the autoScroll properties to those of the target\n autoScroll.margin = options.margin;\n autoScroll.speed = options.speed;\n\n autoScroll.start(interaction);\n }\n },\n};\n\nInteraction.signals.on('stop-active', function () {\n autoScroll.stop();\n});\n\nInteraction.signals.on('action-move', autoScroll.onInteractionMove);\n\ndefaultOptions.perAction.autoScroll = autoScroll.defaults;\n\nmodule.exports = autoScroll;\n","const Interactable = require('../Interactable');\nconst actions = require('../actions/base');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.ignoreFrom\n [ method ]\n *\n * If the target of the `mousedown`, `pointerdown` or `touchstart`\n * event or any of it's parents match the given CSS selector or\n * Element, no drag/resize/gesture is started.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to not ignore any elements\n = (string | Element | object) The current ignoreFrom value or this Interactable\n **\n | interact(element, { ignoreFrom: document.getElementById('no-action') });\n | // or\n | interact(element).ignoreFrom('input, textarea, a');\n\\*/\nInteractable.prototype.ignoreFrom = function (newValue) {\n return this._backCompatOption('ignoreFrom', newValue);\n};\n\n/*\\\n * Interactable.allowFrom\n [ method ]\n *\n * A drag/resize/gesture is started only If the target of the\n * `mousedown`, `pointerdown` or `touchstart` event or any of it's\n * parents match the given CSS selector or Element.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to allow from any element\n = (string | Element | object) The current allowFrom value or this Interactable\n **\n | interact(element, { allowFrom: document.getElementById('drag-handle') });\n | // or\n | interact(element).allowFrom('.handle');\n\\*/\nInteractable.prototype.allowFrom = function (newValue) {\n return this._backCompatOption('allowFrom', newValue);\n};\n\nInteractable.prototype.testIgnore = function (ignoreFrom, interactableElement, element) {\n if (!ignoreFrom || !is.element(element)) { return false; }\n\n if (is.string(ignoreFrom)) {\n return domUtils.matchesUpTo(element, ignoreFrom, interactableElement);\n }\n else if (is.element(ignoreFrom)) {\n return domUtils.nodeContains(ignoreFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testAllow = function (allowFrom, interactableElement, element) {\n if (!allowFrom) { return true; }\n\n if (!is.element(element)) { return false; }\n\n if (is.string(allowFrom)) {\n return domUtils.matchesUpTo(element, allowFrom, interactableElement);\n }\n else if (is.element(allowFrom)) {\n return domUtils.nodeContains(allowFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testIgnoreAllow = function (options, interactableElement, eventTarget) {\n return (!this.testIgnore(options.ignoreFrom, interactableElement, eventTarget)\n && this.testAllow(options.allowFrom, interactableElement, eventTarget));\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (event.buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\n","const interact = require('../interact');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst actions = require('../actions/base');\nconst defaultOptions = require('../defaultOptions');\nconst browser = require('../utils/browser');\nconst scope = require('../scope');\nconst utils = require('../utils');\nconst signals = require('../utils/Signals').new();\n\nrequire('./InteractableMethods');\n\nconst autoStart = {\n signals,\n withinInteractionLimit,\n // Allow this many interactions to happen simultaneously\n maxInteractions: Infinity,\n defaults: {\n perAction: {\n manualStart: false,\n max: Infinity,\n maxPerElement: 1,\n allowFrom: null,\n ignoreFrom: null,\n },\n },\n setActionDefaults: function (action) {\n utils.extend(action.defaults, autoStart.defaults.perAction);\n },\n};\n\n// set cursor style on mousedown\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget }) {\n if (interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\n// set cursor style on mousemove\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget }) {\n if (!interaction.mouse\n || interaction.pointerIsDown\n || interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\nInteraction.signals.on('move', function (arg) {\n const { interaction, event } = arg;\n\n if (!interaction.pointerIsDown\n || interaction.interacting()\n || !interaction.pointerWasMoved\n || !interaction.prepared.name) {\n return;\n }\n\n signals.fire('before-start', arg);\n\n const target = interaction.target;\n\n if (interaction.prepared.name && target) {\n // check manualStart and interaction limit\n if (target.options[interaction.prepared.name].manualStart\n || !withinInteractionLimit(target, interaction.element, interaction.prepared)) {\n interaction.stop(event);\n }\n else {\n interaction.start(interaction.prepared, target, interaction.element);\n }\n }\n});\n\n// Check if the current target supports the action.\n// If so, return the validated action. Otherwise, return null\nfunction validateAction (action, interactable, element, eventTarget) {\n if (utils.is.object(action)\n && interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget)\n && interactable.options[action.name].enabled\n && withinInteractionLimit(interactable, element, action)) {\n return action;\n }\n\n return null;\n}\n\nfunction validateSelector (interaction, pointer, event, matches, matchElements, eventTarget) {\n for (let i = 0, len = matches.length; i < len; i++) {\n const match = matches[i];\n const matchElement = matchElements[i];\n const action = validateAction(match.getAction(pointer, event, interaction, matchElement),\n match,\n matchElement,\n eventTarget);\n\n if (action) {\n return {\n action,\n target: match,\n element: matchElement,\n };\n }\n }\n\n return {};\n}\n\nfunction getActionInfo (interaction, pointer, event, eventTarget) {\n let matches = [];\n let matchElements = [];\n\n let element = eventTarget;\n let action = null;\n\n function pushMatches (interactable, selector, context) {\n const elements = (browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined);\n\n if (utils.matchesSelector(element, selector, elements)) {\n\n matches.push(interactable);\n matchElements.push(element);\n }\n }\n\n while (utils.is.element(element)) {\n matches = [];\n matchElements = [];\n\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && (action = validateAction(elementInteractable.getAction(pointer, event, interaction, element, eventTarget),\n elementInteractable,\n element,\n eventTarget))\n && !elementInteractable.options[action.name].manualStart) {\n return {\n element,\n action,\n target: elementInteractable,\n };\n }\n else {\n scope.interactables.forEachSelector(pushMatches, element);\n\n const actionInfo = validateSelector(interaction, pointer, event, matches, matchElements, eventTarget);\n\n if (actionInfo.action\n && !actionInfo.target.options[actionInfo.action.name].manualStart) {\n return actionInfo;\n }\n }\n\n element = utils.parentNode(element);\n }\n\n return {};\n}\n\nfunction prepare (interaction, { action, target, element }) {\n action = action || {};\n\n if (interaction.target && interaction.target.options.styleCursor) {\n interaction.target._doc.documentElement.style.cursor = '';\n }\n\n interaction.target = target;\n interaction.element = element;\n utils.copyAction(interaction.prepared, action);\n\n if (target && target.options.styleCursor) {\n const cursor = action? actions[action.name].getCursor(action) : '';\n interaction.target._doc.documentElement.style.cursor = cursor;\n }\n\n signals.fire('prepared', { interaction: interaction });\n}\n\nInteraction.signals.on('stop', function ({ interaction }) {\n const target = interaction.target;\n\n if (target && target.options.styleCursor) {\n target._doc.documentElement.style.cursor = '';\n }\n});\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (utils.is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (utils.is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n const buttons = event.buttons || ({\n 0: 1,\n 1: 4,\n 3: 8,\n 4: 16,\n })[event.button];\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\nfunction withinInteractionLimit (interactable, element, action) {\n const options = interactable.options;\n const maxActions = options[action.name].max;\n const maxPerElement = options[action.name].maxPerElement;\n let activeInteractions = 0;\n let targetCount = 0;\n let targetElementCount = 0;\n\n // no actions if any of these values == 0\n if (!(maxActions && maxPerElement && autoStart.maxInteractions)) { return; }\n\n for (let i = 0, len = scope.interactions.length; i < len; i++) {\n const interaction = scope.interactions[i];\n const otherAction = interaction.prepared.name;\n\n if (!interaction.interacting()) { continue; }\n\n activeInteractions++;\n\n if (activeInteractions >= autoStart.maxInteractions) {\n return false;\n }\n\n if (interaction.target !== interactable) { continue; }\n\n targetCount += (otherAction === action.name)|0;\n\n if (targetCount >= maxActions) {\n return false;\n }\n\n if (interaction.element === element) {\n targetElementCount++;\n\n if (otherAction !== action.name || targetElementCount >= maxPerElement) {\n return false;\n }\n }\n }\n\n return autoStart.maxInteractions > 0;\n}\n\n/*\\\n * interact.maxInteractions\n [ method ]\n **\n * Returns or sets the maximum number of concurrent interactions allowed.\n * By default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables\n * and elements, you need to enable it in the draggable, resizable and\n * gesturable `'max'` and `'maxPerElement'` options.\n **\n - newValue (number) #optional Any number. newValue <= 0 means no interactions.\n\\*/\ninteract.maxInteractions = function (newValue) {\n if (utils.is.number(newValue)) {\n autoStart.maxInteractions = newValue;\n\n return this;\n }\n\n return autoStart.maxInteractions;\n};\n\nInteractable.settingsMethods.push('styleCursor');\nInteractable.settingsMethods.push('actionChecker');\nInteractable.settingsMethods.push('ignoreFrom');\nInteractable.settingsMethods.push('allowFrom');\n\ndefaultOptions.base.actionChecker = null;\ndefaultOptions.base.styleCursor = true;\n\nutils.extend(defaultOptions.perAction, autoStart.defaults.perAction);\n\nmodule.exports = autoStart;\n","const autoStart = require('./base');\nconst Interaction = require('../Interaction');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.delayTimer = null;\n});\n\nautoStart.signals.on('prepared', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.delayTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.target, interaction.element);\n }, delay);\n }\n});\n\nInteraction.signals.on('move', function ({ interaction, duplicate }) {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.delayTimer);\n }\n});\n\n// prevent regular down->move autoStart\nautoStart.signals.on('before-start', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.prepared.name = null;\n }\n});\n","const autoStart = require('./base');\nconst scope = require('../scope');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\n\nconst { matchesSelector, parentNode } = require('../utils/domUtils');\n\nautoStart.setActionDefaults(require('../actions/drag'));\n\nautoStart.signals.on('before-start', function ({ interaction, eventTarget, dx, dy }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // check if a drag is in the correct axis\n const absX = Math.abs(dx);\n const absY = Math.abs(dy);\n const options = interaction.target.options.drag;\n const startAxis = options.startAxis;\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy');\n\n interaction.prepared.axis = options.lockAxis === 'start'\n ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n : options.lockAxis;\n\n // if the movement isn't in the startAxis of the interactable\n if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) {\n // cancel the prepared action\n interaction.prepared.name = null;\n\n // then try to get a drag from another ineractable\n\n if (!interaction.prepared.name) {\n\n let element = eventTarget;\n\n const getDraggable = function (interactable, selector, context) {\n const elements = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n if (interactable === interaction.target) { return; }\n\n if (!options.manualStart\n && !interactable.testIgnoreAllow(options, element, eventTarget)\n && matchesSelector(element, selector, elements)) {\n\n const action = interactable.getAction(interaction.downPointer,\n interaction.downEvent,\n interaction,\n element);\n\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, interactable)\n && autoStart.validateAction(action, interactable, element, eventTarget)) {\n\n return interactable;\n }\n }\n };\n\n let action = null;\n\n // check all interactables\n while (is.element(element)) {\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && elementInteractable !== interaction.target\n && !elementInteractable.options.drag.manualStart) {\n\n action = elementInteractable.getAction(interaction.downPointer, interaction.downEvent, interaction, element);\n }\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, elementInteractable)) {\n\n interaction.prepared.name = 'drag';\n interaction.target = elementInteractable;\n interaction.element = element;\n break;\n }\n\n const selectorInteractable = scope.interactables.forEachSelector(getDraggable, element);\n\n if (selectorInteractable) {\n interaction.prepared.name = 'drag';\n interaction.target = selectorInteractable;\n interaction.element = element;\n break;\n }\n\n element = parentNode(element);\n }\n }\n }\n});\n\nfunction checkStartAxis (startAxis, interactable) {\n if (!interactable) { return false; }\n\n const thisAxis = interactable.options.drag.startAxis;\n\n return (startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis);\n}\n","require('./base').setActionDefaults(require('../actions/gesture'));\n","require('./base').setActionDefaults(require('../actions/resize'));\n","module.exports = {\n base: {\n accept : null,\n preventDefault: 'auto',\n deltaSource : 'page',\n },\n\n perAction: {\n origin: { x: 0, y: 0 },\n\n // only allow left button by default\n // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n mouseButtons: 1,\n\n inertia: {\n enabled : false,\n resistance : 10, // the lambda in exponential decay\n minSpeed : 100, // target speed must be above this for inertia to start\n endSpeed : 10, // the speed at which inertia is slow enough to stop\n allowResume : true, // allow resuming an action in inertia phase\n smoothEndDuration: 300, // animate to snap/restrict endOnly if there's no inertia\n },\n },\n};\n","/* browser entry point */\n\n// Legacy browser support\nrequire('./legacyBrowsers');\n\n// inertia\nrequire('./inertia');\n\n// modifiers\nrequire('./modifiers/snap');\nrequire('./modifiers/restrict');\n\n// pointerEvents\nrequire('./pointerEvents/base');\nrequire('./pointerEvents/holdRepeat');\nrequire('./pointerEvents/interactableTargets');\n\n// delay\nrequire('./autoStart/delay');\n\n// actions\nrequire('./actions/gesture');\nrequire('./actions/resize');\nrequire('./actions/drag');\nrequire('./actions/drop');\n\n// load these modifiers after resize is loaded\nrequire('./modifiers/snapSize');\nrequire('./modifiers/restrictEdges');\nrequire('./modifiers/restrictSize');\n\n// autoStart actions\nrequire('./autoStart/gesture');\nrequire('./autoStart/resize');\nrequire('./autoStart/drag');\n\n// Interactable preventDefault setting\nrequire('./interactablePreventDefault.js');\n\n// autoScroll\nrequire('./autoScroll');\n\n// export interact\nmodule.exports = require('./interact');\n","const InteractEvent = require('./InteractEvent');\nconst Interaction = require('./Interaction');\nconst modifiers = require('./modifiers');\nconst utils = require('./utils');\nconst animationFrame = require('./utils/raf');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.inertiaStatus = {\n active : false,\n smoothEnd : false,\n allowResume: false,\n\n startEvent: null,\n upCoords : {},\n\n xe: 0, ye: 0,\n sx: 0, sy: 0,\n\n t0: 0,\n vx0: 0, vys: 0,\n duration: 0,\n\n lambda_v0: 0,\n one_ve_v0: 0,\n i : null,\n };\n\n interaction.boundInertiaFrame = () => inertiaFrame .apply(interaction);\n interaction.boundSmoothEndFrame = () => smoothEndFrame.apply(interaction);\n});\n\nInteraction.signals.on('down', function ({ interaction, event, pointer, eventTarget }) {\n const status = interaction.inertiaStatus;\n\n // Check if the down event hits the current inertia target\n if (status.active) {\n let element = eventTarget;\n\n // climb up the DOM tree from the event target\n while (utils.is.element(element)) {\n\n // if interaction element is the current inertia target element\n if (element === interaction.element) {\n // stop inertia\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n\n // update pointers to the down event's coordinates\n interaction.updatePointer(pointer);\n utils.setCoords(interaction.curCoords, interaction.pointers);\n\n // fire appropriate signals\n const signalArg = { interaction };\n Interaction.signals.fire('before-action-move', signalArg);\n Interaction.signals.fire('action-resume' , signalArg);\n\n // fire a reume event\n const resumeEvent = new InteractEvent(interaction,\n event,\n interaction.prepared.name,\n 'inertiaresume',\n interaction.element);\n\n interaction.target.fire(resumeEvent);\n interaction.prevEvent = resumeEvent;\n modifiers.resetStatuses(interaction.modifierStatuses);\n\n utils.copyCoords(interaction.prevCoords, interaction.curCoords);\n break;\n }\n\n element = utils.parentNode(element);\n }\n }\n});\n\nInteraction.signals.on('up', function ({ interaction, event }) {\n const status = interaction.inertiaStatus;\n\n if (!interaction.interacting() || status.active) { return; }\n\n const target = interaction.target;\n const options = target && target.options;\n const inertiaOptions = options && interaction.prepared.name && options[interaction.prepared.name].inertia;\n\n const now = new Date().getTime();\n const statuses = {};\n const page = utils.extend({}, interaction.curCoords.page);\n const pointerSpeed = interaction.pointerDelta.client.speed;\n\n let smoothEnd = false;\n let modifierResult;\n\n // check if inertia should be started\n const inertiaPossible = (inertiaOptions && inertiaOptions.enabled\n && interaction.prepared.name !== 'gesture'\n && event !== status.startEvent);\n\n const inertia = (inertiaPossible\n && (now - interaction.curCoords.timeStamp) < 50\n && pointerSpeed > inertiaOptions.minSpeed\n && pointerSpeed > inertiaOptions.endSpeed);\n\n const modifierArg = {\n interaction,\n pageCoords: page,\n statuses,\n preEnd: true,\n requireEndOnly: true,\n };\n\n // smoothEnd\n if (inertiaPossible && !inertia) {\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n if (modifierResult.shouldMove && modifierResult.locked) {\n smoothEnd = true;\n }\n }\n\n if (!(inertia || smoothEnd)) { return; }\n\n utils.copyCoords(status.upCoords, interaction.curCoords);\n\n interaction.pointers[0] = status.startEvent =\n new InteractEvent(interaction, event, interaction.prepared.name, 'inertiastart', interaction.element);\n\n status.t0 = now;\n\n status.active = true;\n status.allowResume = inertiaOptions.allowResume;\n interaction.simulation = status;\n\n target.fire(status.startEvent);\n\n if (inertia) {\n status.vx0 = interaction.pointerDelta.client.vx;\n status.vy0 = interaction.pointerDelta.client.vy;\n status.v0 = pointerSpeed;\n\n calcInertia(interaction, status);\n\n utils.extend(page, interaction.curCoords.page);\n\n page.x += status.xe;\n page.y += status.ye;\n\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n status.modifiedXe += modifierResult.dx;\n status.modifiedYe += modifierResult.dy;\n\n status.i = animationFrame.request(interaction.boundInertiaFrame);\n }\n else {\n status.smoothEnd = true;\n status.xe = modifierResult.dx;\n status.ye = modifierResult.dy;\n\n status.sx = status.sy = 0;\n\n status.i = animationFrame.request(interaction.boundSmoothEndFrame);\n }\n});\n\nInteraction.signals.on('stop-active', function ({ interaction }) {\n const status = interaction.inertiaStatus;\n\n if (status.active) {\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n }\n});\n\nfunction calcInertia (interaction, status) {\n const inertiaOptions = interaction.target.options[interaction.prepared.name].inertia;\n const lambda = inertiaOptions.resistance;\n const inertiaDur = -Math.log(inertiaOptions.endSpeed / status.v0) / lambda;\n\n status.x0 = interaction.prevEvent.pageX;\n status.y0 = interaction.prevEvent.pageY;\n status.t0 = status.startEvent.timeStamp / 1000;\n status.sx = status.sy = 0;\n\n status.modifiedXe = status.xe = (status.vx0 - inertiaDur) / lambda;\n status.modifiedYe = status.ye = (status.vy0 - inertiaDur) / lambda;\n status.te = inertiaDur;\n\n status.lambda_v0 = lambda / status.v0;\n status.one_ve_v0 = 1 - inertiaOptions.endSpeed / status.v0;\n}\n\nfunction inertiaFrame () {\n updateInertiaCoords(this);\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n\n const status = this.inertiaStatus;\n const options = this.target.options[this.prepared.name].inertia;\n const lambda = options.resistance;\n const t = new Date().getTime() / 1000 - status.t0;\n\n if (t < status.te) {\n\n const progress = 1 - (Math.exp(-lambda * t) - status.lambda_v0) / status.one_ve_v0;\n\n if (status.modifiedXe === status.xe && status.modifiedYe === status.ye) {\n status.sx = status.xe * progress;\n status.sy = status.ye * progress;\n }\n else {\n const quadPoint = utils.getQuadraticCurvePoint(0, 0,\n status.xe,\n status.ye,\n status.modifiedXe,\n status.modifiedYe,\n progress);\n\n status.sx = quadPoint.x;\n status.sy = quadPoint.y;\n }\n\n this.doMove();\n\n status.i = animationFrame.request(this.boundInertiaFrame);\n }\n else {\n status.sx = status.modifiedXe;\n status.sy = status.modifiedYe;\n\n this.doMove();\n this.end(status.startEvent);\n status.active = false;\n this.simulation = null;\n }\n\n utils.copyCoords(this.prevCoords, this.curCoords);\n}\n\nfunction smoothEndFrame () {\n updateInertiaCoords(this);\n\n const status = this.inertiaStatus;\n const t = new Date().getTime() - status.t0;\n const duration = this.target.options[this.prepared.name].inertia.smoothEndDuration;\n\n if (t < duration) {\n status.sx = utils.easeOutQuad(t, 0, status.xe, duration);\n status.sy = utils.easeOutQuad(t, 0, status.ye, duration);\n\n this.pointerMove(status.startEvent, status.startEvent);\n\n status.i = animationFrame.request(this.boundSmoothEndFrame);\n }\n else {\n status.sx = status.xe;\n status.sy = status.ye;\n\n this.pointerMove(status.startEvent, status.startEvent);\n this.end(status.startEvent);\n\n status.smoothEnd =\n status.active = false;\n this.simulation = null;\n }\n}\n\nfunction updateInertiaCoords (interaction) {\n const status = interaction.inertiaStatus;\n\n // return if inertia isn't running\n if (!status.active) { return; }\n\n const pageUp = status.upCoords.page;\n const clientUp = status.upCoords.client;\n\n utils.setCoords(interaction.curCoords, [ {\n pageX : pageUp.x + status.sx,\n pageY : pageUp.y + status.sy,\n clientX: clientUp.x + status.sx,\n clientY: clientUp.y + status.sy,\n } ]);\n}\n","const browser = require('./utils/browser');\nconst events = require('./utils/events');\nconst utils = require('./utils');\nconst scope = require('./scope');\nconst Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\n\nconst globalEvents = {};\n\n/*\\\n * interact\n [ method ]\n *\n * The methods of this variable can be used to set elements as\n * interactables and also to change various default settings.\n *\n * Calling it as a function and passing an element or a valid CSS selector\n * string returns an Interactable object which has various methods to\n * configure it.\n *\n - element (Element | string) The HTML or SVG Element to interact with or CSS selector\n = (object) An @Interactable\n *\n > Usage\n | interact('#draggable').draggable(true);\n |\n | var rectables = interact('rect');\n | rectables\n | .gesturable(true)\n | .on('gesturemove', function (event) {\n | // ...\n | });\n\\*/\nfunction interact (element, options) {\n let interactable = scope.interactables.get(element, options);\n\n if (!interactable) {\n interactable = new Interactable(element, options);\n interactable.events.global = globalEvents;\n }\n\n return interactable;\n}\n\n/*\\\n * interact.isSet\n [ method ]\n *\n * Check if an element has been set\n - element (Element) The Element being searched for\n = (boolean) Indicates if the element or CSS selector was previously passed to interact\n\\*/\ninteract.isSet = function (element, options) {\n return scope.interactables.indexOfElement(element, options && options.context) !== -1;\n};\n\n/*\\\n * interact.on\n [ method ]\n *\n * Adds a global listener for an InteractEvent or adds a DOM event to\n * `document`\n *\n - type (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) interact\n\\*/\ninteract.on = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.on(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.on(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n // if it is an InteractEvent type, add listener to globalEvents\n if (utils.contains(Interactable.eventTypes, type)) {\n // if this type of event was never bound\n if (!globalEvents[type]) {\n globalEvents[type] = [listener];\n }\n else {\n globalEvents[type].push(listener);\n }\n }\n // If non InteractEvent type, addEventListener to document\n else {\n events.add(scope.document, type, listener, { options });\n }\n\n return interact;\n};\n\n/*\\\n * interact.off\n [ method ]\n *\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n - type (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) interact\n \\*/\ninteract.off = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.off(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.off(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n if (!utils.contains(Interactable.eventTypes, type)) {\n events.remove(scope.document, type, listener, options);\n }\n else {\n let index;\n\n if (type in globalEvents\n && (index = utils.indexOf(globalEvents[type], listener)) !== -1) {\n globalEvents[type].splice(index, 1);\n }\n }\n\n return interact;\n};\n\n/*\\\n * interact.debug\n [ method ]\n *\n * Returns an object which exposes internal data\n = (object) An object with properties that outline the current state and expose internal functions and variables\n\\*/\ninteract.debug = function () {\n return scope;\n};\n\n// expose the functions used to calculate multi-touch properties\ninteract.getPointerAverage = utils.pointerAverage;\ninteract.getTouchBBox = utils.touchBBox;\ninteract.getTouchDistance = utils.touchDistance;\ninteract.getTouchAngle = utils.touchAngle;\n\ninteract.getElementRect = utils.getElementRect;\ninteract.getElementClientRect = utils.getElementClientRect;\ninteract.matchesSelector = utils.matchesSelector;\ninteract.closest = utils.closest;\n\n/*\\\n * interact.supportsTouch\n [ method ]\n *\n = (boolean) Whether or not the browser supports touch input\n\\*/\ninteract.supportsTouch = function () {\n return browser.supportsTouch;\n};\n\n/*\\\n * interact.supportsPointerEvent\n [ method ]\n *\n = (boolean) Whether or not the browser supports PointerEvents\n\\*/\ninteract.supportsPointerEvent = function () {\n return browser.supportsPointerEvent;\n};\n\n/*\\\n * interact.stop\n [ method ]\n *\n * Cancels all interactions (end events are not fired)\n *\n - event (Event) An event on which to call preventDefault()\n = (object) interact\n\\*/\ninteract.stop = function (event) {\n for (let i = scope.interactions.length - 1; i >= 0; i--) {\n scope.interactions[i].stop(event);\n }\n\n return interact;\n};\n\n/*\\\n * interact.pointerMoveTolerance\n [ method ]\n * Returns or sets the distance the pointer must be moved before an action\n * sequence occurs. This also affects tolerance for tap events.\n *\n - newValue (number) #optional The movement from the start position must be greater than this value\n = (number | Interactable) The current setting or interact\n\\*/\ninteract.pointerMoveTolerance = function (newValue) {\n if (utils.is.number(newValue)) {\n Interaction.pointerMoveTolerance = newValue;\n\n return this;\n }\n\n return Interaction.pointerMoveTolerance;\n};\n\ninteract.addDocument = scope.addDocument;\ninteract.removeDocument = scope.removeDocument;\n\nscope.interact = interact;\n\nmodule.exports = interact;\n","const Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\nconst scope = require('./scope');\nconst is = require('./utils/is');\nconst events = require('./utils/events');\n\nconst { nodeContains, matchesSelector } = require('./utils/domUtils');\n\n/*\\\n * Interactable.preventDefault\n [ method ]\n *\n * Returns or sets whether to prevent the browser's default behaviour\n * in response to pointer events. Can be set to:\n * - `'always'` to always prevent\n * - `'never'` to never prevent\n * - `'auto'` to let interact.js try to determine what would be best\n *\n - newValue (string) #optional `true`, `false` or `'auto'`\n = (string | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.preventDefault = function (newValue) {\n if (/^(always|never|auto)$/.test(newValue)) {\n this.options.preventDefault = newValue;\n return this;\n }\n\n if (is.bool(newValue)) {\n this.options.preventDefault = newValue? 'always' : 'never';\n return this;\n }\n\n return this.options.preventDefault;\n};\n\nInteractable.prototype.checkAndPreventDefault = function (event) {\n const setting = this.options.preventDefault;\n\n if (setting === 'never') { return; }\n\n if (setting === 'always') {\n event.preventDefault();\n return;\n }\n\n // setting === 'auto'\n\n // don't preventDefault if the browser supports passiveEvents\n // CSS touch-action and user-selecct should be used instead\n if (events.supportsOptions) {\n return;\n }\n\n // don't preventDefault of pointerdown events\n if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) {\n return;\n }\n\n // don't preventDefault on editable elements\n if (is.element(event.target)\n && matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) {\n return;\n }\n\n event.preventDefault();\n};\n\nfunction onInteractionEvent ({ interaction, event }) {\n if (interaction.target) {\n interaction.target.checkAndPreventDefault(event);\n }\n}\n\nfor (const eventSignal of ['down', 'move', 'up', 'cancel']) {\n Interaction.signals.on(eventSignal, onInteractionEvent);\n}\n\n// prevent native HTML5 drag on interact.js target elements\nInteraction.docEvents.dragstart = function preventNativeDrag (event) {\n for (const interaction of scope.interactions) {\n\n if (interaction.element\n && (interaction.element === event.target\n || nodeContains(interaction.element, event.target))) {\n\n interaction.target.checkAndPreventDefault(event);\n return;\n }\n }\n};\n","const scope = require('./scope');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst iFinder = require('./utils/interactionFinder');\nconst pointerEvents = require('./pointerEvents/base');\n\nconst { window } = require('./utils/window');\n\nconst toString = Object.prototype.toString;\n\nif (!window.Array.isArray) {\n window.Array.isArray = function (obj) {\n return toString.call(obj) === '[object Array]';\n };\n}\n\nif (!String.prototype.trim) {\n String.prototype.trim = function () {\n return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n };\n}\n\n// http://www.quirksmode.org/dom/events/click.html\n// >Events leading to dblclick\n//\n// IE8 doesn't fire down event before dblclick.\n// This workaround tries to fire a tap and doubletap after dblclick\nfunction onIE8Dblclick (event) {\n const eventTarget = event.target;\n const interaction = iFinder.search(event, event.type, eventTarget);\n\n if (!interaction) { return; }\n\n if (interaction.prevTap\n && event.clientX === interaction.prevTap.clientX\n && event.clientY === interaction.prevTap.clientY\n && eventTarget === interaction.prevTap.target) {\n\n interaction.downTargets[0] = eventTarget;\n interaction.downTimes [0] = new Date().getTime();\n\n pointerEvents.fire({\n interaction,\n event,\n eventTarget,\n pointer: event,\n type: 'tap',\n });\n }\n}\n\nif (browser.isIE8) {\n const selectFix = function (event) {\n for (const interaction of scope.interactions) {\n if (interaction.interacting()) {\n interaction.target.checkAndPreventDefault(event);\n }\n }\n };\n\n const onDocIE8 = function onDocIE8 ({ doc, win }, signalName) {\n const eventMethod = signalName.indexOf('listen') === 0\n ? events.add : events.remove;\n\n // For IE's lack of Event#preventDefault\n eventMethod(doc, 'selectstart', selectFix);\n\n if (pointerEvents) {\n eventMethod(doc, 'dblclick', onIE8Dblclick);\n }\n };\n\n scope.signals.on('add-document' , onDocIE8);\n scope.signals.on('remove-document', onDocIE8);\n}\n\nmodule.exports = null;\n","const InteractEvent = require('../InteractEvent');\nconst Interaction = require('../Interaction');\nconst extend = require('../utils/extend');\n\nconst modifiers = {\n names: [],\n\n setOffsets: function (arg) {\n const { interaction, pageCoords: page } = arg;\n const { target, element, startOffset } = interaction;\n const rect = target.getRect(element);\n\n if (rect) {\n startOffset.left = page.x - rect.left;\n startOffset.top = page.y - rect.top;\n\n startOffset.right = rect.right - page.x;\n startOffset.bottom = rect.bottom - page.y;\n\n if (!('width' in rect)) { rect.width = rect.right - rect.left; }\n if (!('height' in rect)) { rect.height = rect.bottom - rect.top ; }\n }\n else {\n startOffset.left = startOffset.top = startOffset.right = startOffset.bottom = 0;\n }\n\n arg.rect = rect;\n arg.interactable = target;\n arg.element = element;\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n\n arg.options = target.options[interaction.prepared.name][modifierName];\n\n if (!arg.options) {\n continue;\n }\n\n interaction.modifierOffsets[modifierName] = modifiers[modifierName].setOffset(arg);\n }\n },\n\n setAll: function (arg) {\n const { interaction, statuses, preEnd, requireEndOnly } = arg;\n const coords = extend({}, arg.pageCoords);\n const result = {\n dx: 0,\n dy: 0,\n changed: false,\n locked: false,\n shouldMove: true,\n };\n\n for (const modifierName of modifiers.names) {\n const modifier = modifiers[modifierName];\n const options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!shouldDo(options, preEnd, requireEndOnly)) { continue; }\n\n arg.status = arg.status = statuses[modifierName];\n arg.options = options;\n arg.offset = arg.interaction.modifierOffsets[modifierName];\n\n modifier.set(arg);\n\n if (arg.status.locked) {\n coords.x += arg.status.dx;\n coords.y += arg.status.dy;\n\n result.dx += arg.status.dx;\n result.dy += arg.status.dy;\n\n result.locked = true;\n }\n }\n\n // a move should be fired if:\n // - there are no modifiers enabled,\n // - no modifiers are \"locked\" i.e. have changed the pointer's coordinates, or\n // - the locked coords have changed since the last pointer move\n result.shouldMove = !arg.status || !result.locked || arg.status.changed;\n\n return result;\n },\n\n resetStatuses: function (statuses) {\n for (const modifierName of modifiers.names) {\n const status = statuses[modifierName] || {};\n\n status.dx = status.dy = 0;\n status.modifiedX = status.modifiedY = NaN;\n status.locked = false;\n status.changed = true;\n\n statuses[modifierName] = status;\n }\n\n return statuses;\n },\n\n start: function ({ interaction }, signalName) {\n const arg = {\n interaction,\n pageCoords: (signalName === 'action-resume' ?\n interaction.curCoords : interaction.startCoords).page,\n startOffset: interaction.startOffset,\n statuses: interaction.modifierStatuses,\n preEnd: false,\n requireEndOnly: false,\n };\n\n modifiers.setOffsets(arg);\n modifiers.resetStatuses(arg.statuses);\n\n arg.pageCoords = extend({}, interaction.startCoords.page);\n interaction.modifierResult = modifiers.setAll(arg);\n },\n};\n\nInteraction.signals.on('new', function (interaction) {\n interaction.startOffset = { left: 0, right: 0, top: 0, bottom: 0 };\n interaction.modifierOffsets = {};\n interaction.modifierStatuses = modifiers.resetStatuses({});\n interaction.modifierResult = null;\n});\n\nInteraction.signals.on('action-start' , modifiers.start);\nInteraction.signals.on('action-resume', modifiers.start);\n\nInteraction.signals.on('before-action-move', function ({ interaction, preEnd, interactingBeforeMove }) {\n const modifierResult = modifiers.setAll({\n interaction,\n preEnd,\n pageCoords: interaction.curCoords.page,\n statuses: interaction.modifierStatuses,\n requireEndOnly: false,\n });\n\n // don't fire an action move if a modifier would keep the event in the same\n // cordinates as before\n if (!modifierResult.shouldMove && interactingBeforeMove) {\n interaction._dontFireMove = true;\n }\n\n interaction.modifierResult = modifierResult;\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n for (let i = 0; i < modifiers.names.length; i++) {\n const options = interaction.target.options[interaction.prepared.name][modifiers.names[i]];\n\n // if the endOnly option is true for any modifier\n if (shouldDo(options, true, true)) {\n // fire a move event at the modified coordinates\n interaction.doMove({ event, preEnd: true });\n break;\n }\n }\n});\n\nInteractEvent.signals.on('set-xy', function (arg) {\n const { iEvent, interaction } = arg;\n const modifierArg = extend({}, arg);\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n modifierArg.options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!modifierArg.options) {\n continue;\n }\n\n const modifier = modifiers[modifierName];\n\n modifierArg.status = interaction.modifierStatuses[modifierName];\n\n iEvent[modifierName] = modifier.modifyCoords(modifierArg);\n }\n});\n\nfunction shouldDo (options, preEnd, requireEndOnly) {\n return (options && options.enabled\n && (preEnd || !options.endOnly)\n && (!requireEndOnly || options.endOnly));\n}\n\nmodule.exports = modifiers;\n","const modifiers = require('./index');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst restrict = {\n defaults: {\n enabled : false,\n endOnly : false,\n restriction: null,\n elementRect: null,\n },\n\n setOffset: function ({ rect, startOffset, options }) {\n const elementRect = options && options.elementRect;\n const offset = {};\n\n if (rect && elementRect) {\n offset.left = startOffset.left - (rect.width * elementRect.left);\n offset.top = startOffset.top - (rect.height * elementRect.top);\n\n offset.right = startOffset.right - (rect.width * (1 - elementRect.right));\n offset.bottom = startOffset.bottom - (rect.height * (1 - elementRect.bottom));\n }\n else {\n offset.left = offset.top = offset.right = offset.bottom = 0;\n }\n\n return offset;\n },\n\n set: function ({ pageCoords, interaction, status, options }) {\n if (!options) { return status; }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n\n const restriction = getRestrictionRect(options.restriction, interaction, page);\n\n if (!restriction) { return status; }\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n const rect = restriction;\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n const offset = interaction.modifierOffsets.restrict;\n\n // object is assumed to have\n // x, y, width, height or\n // left, top, right, bottom\n if ('x' in restriction && 'y' in restriction) {\n modifiedX = Math.max(Math.min(rect.x + rect.width - offset.right , page.x), rect.x + offset.left);\n modifiedY = Math.max(Math.min(rect.y + rect.height - offset.bottom, page.y), rect.y + offset.top );\n }\n else {\n modifiedX = Math.max(Math.min(rect.right - offset.right , page.x), rect.left + offset.left);\n modifiedY = Math.max(Math.min(rect.bottom - offset.bottom, page.y), rect.top + offset.top );\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const elementRect = options && options.elementRect;\n\n if (options && options.enabled\n && !(phase === 'start' && elementRect && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n getRestrictionRect,\n};\n\nfunction getRestrictionRect (value, interaction, page) {\n if (utils.is.function(value)) {\n return utils.resolveRectLike(value, interaction.target, interaction.element, [page.x, page.y, interaction]);\n } else {\n return utils.resolveRectLike(value, interaction.target, interaction.element);\n }\n}\n\nmodifiers.restrict = restrict;\nmodifiers.names.push('restrict');\n\ndefaultOptions.perAction.restrict = restrict.defaults;\n\nmodule.exports = restrict;\n","// This module adds the options.resize.restrictEdges setting which sets min and\n// max for the top, left, bottom and right edges of the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictEdges: {\n// inner: { top: 200, left: 200, right: 400, bottom: 400 },\n// outer: { top: 0, left: 0, right: 600, bottom: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst { getRestrictionRect } = require('./restrict');\n\nconst noInner = { top: +Infinity, left: +Infinity, bottom: -Infinity, right: -Infinity };\nconst noOuter = { top: -Infinity, left: -Infinity, bottom: +Infinity, right: +Infinity };\n\nconst restrictEdges = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n offset: null,\n },\n\n setOffset: function ({ interaction, startOffset, options }) {\n if (!options) {\n return utils.extend({}, startOffset);\n }\n\n const offset = getRestrictionRect(options.offset, interaction, interaction.startCoords.page);\n\n if (offset) {\n return {\n top: startOffset.top + offset.y,\n left: startOffset.left + offset.x,\n bottom: startOffset.bottom + offset.y,\n right: startOffset.right + offset.x,\n };\n }\n\n return startOffset;\n },\n\n set: function ({ pageCoords, interaction, status, offset, options }) {\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n const inner = rectUtils.xywhToTlbr(getRestrictionRect(options.inner, interaction, page)) || noInner;\n const outer = rectUtils.xywhToTlbr(getRestrictionRect(options.outer, interaction, page)) || noOuter;\n\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n if (edges.top) {\n modifiedY = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top);\n }\n else if (edges.bottom) {\n modifiedY = Math.max(Math.min(outer.bottom - offset.bottom, page.y), inner.bottom - offset.bottom);\n }\n if (edges.left) {\n modifiedX = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left);\n }\n else if (edges.right) {\n modifiedX = Math.max(Math.min(outer.right - offset.right, page.x), inner.right - offset.right);\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n if (options && options.enabled\n && !(phase === 'start' && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n noInner,\n noOuter,\n getRestrictionRect,\n};\n\nmodifiers.restrictEdges = restrictEdges;\nmodifiers.names.push('restrictEdges');\n\ndefaultOptions.perAction.restrictEdges = restrictEdges.defaults;\nresize.defaults.restrictEdges = restrictEdges.defaults;\n\nmodule.exports = restrictEdges;\n","// This module adds the options.resize.restrictSize setting which sets min and\n// max width and height for the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictSize: {\n// min: { width: -600, height: -600 },\n// max: { width: 600, height: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst restrictEdges = require('./restrictEdges');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst noMin = { width: -Infinity, height: -Infinity };\nconst noMax = { width: +Infinity, height: +Infinity };\n\nconst restrictSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n },\n\n setOffset: function ({ interaction }) {\n return interaction.startOffset;\n },\n\n set: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const rect = rectUtils.xywhToTlbr(interaction.resizeRects.inverted);\n\n const minSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.min, interaction)) || noMin;\n const maxSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.max, interaction)) || noMax;\n\n arg.options = {\n enabled: options.enabled,\n endOnly: options.endOnly,\n inner: utils.extend({}, restrictEdges.noInner),\n outer: utils.extend({}, restrictEdges.noOuter),\n };\n\n if (edges.top) {\n arg.options.inner.top = rect.bottom - minSize.height;\n arg.options.outer.top = rect.bottom - maxSize.height;\n }\n else if (edges.bottom) {\n arg.options.inner.bottom = rect.top + minSize.height;\n arg.options.outer.bottom = rect.top + maxSize.height;\n }\n if (edges.left) {\n arg.options.inner.left = rect.right - minSize.width;\n arg.options.outer.left = rect.right - maxSize.width;\n }\n else if (edges.right) {\n arg.options.inner.right = rect.left + minSize.width;\n arg.options.outer.right = rect.left + maxSize.width;\n }\n\n restrictEdges.set(arg);\n },\n\n modifyCoords: restrictEdges.modifyCoords,\n};\n\nmodifiers.restrictSize = restrictSize;\nmodifiers.names.push('restrictSize');\n\ndefaultOptions.perAction.restrictSize = restrictSize.defaults;\nresize.defaults.restrictSize = restrictSize.defaults;\n\nmodule.exports = restrictSize;\n","const modifiers = require('./index');\nconst interact = require('../interact');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst snap = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n\n relativePoints: null,\n },\n\n setOffset: function ({ interaction, interactable, element, rect, startOffset, options }) {\n const offsets = [];\n const optionsOrigin = utils.rectToXY(utils.resolveRectLike(options.origin));\n const origin = optionsOrigin || utils.getOriginXY(interactable, element, interaction.prepared.name);\n options = options || interactable.options[interaction.prepared.name].snap || {};\n\n let snapOffset;\n\n if (options.offset === 'startCoords') {\n snapOffset = {\n x: interaction.startCoords.page.x - origin.x,\n y: interaction.startCoords.page.y - origin.y,\n };\n }\n else {\n const offsetRect = utils.resolveRectLike(options.offset, interactable, element, [interaction]);\n\n snapOffset = utils.rectToXY(offsetRect) || { x: 0, y: 0 };\n }\n\n if (rect && options.relativePoints && options.relativePoints.length) {\n for (const { x: relativeX, y: relativeY } of options.relativePoints) {\n offsets.push({\n x: startOffset.left - (rect.width * relativeX) + snapOffset.x,\n y: startOffset.top - (rect.height * relativeY) + snapOffset.y,\n });\n }\n }\n else {\n offsets.push(snapOffset);\n }\n\n return offsets;\n },\n\n set: function ({ interaction, pageCoords, status, options, offset: offsets }) {\n const targets = [];\n let target;\n let page;\n let i;\n\n if (status.useStatusXY) {\n page = { x: status.x, y: status.y };\n }\n else {\n const origin = utils.getOriginXY(interaction.target, interaction.element, interaction.prepared.name);\n\n page = utils.extend({}, pageCoords);\n\n page.x -= origin.x;\n page.y -= origin.y;\n }\n\n status.realX = page.x;\n status.realY = page.y;\n\n let len = options.targets? options.targets.length : 0;\n\n for (const { x: offsetX, y: offsetY } of offsets) {\n const relativeX = page.x - offsetX;\n const relativeY = page.y - offsetY;\n\n for (const snapTarget of options.targets) {\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n targets.push({\n x: utils.is.number(target.x) ? (target.x + offsetX) : relativeX,\n y: utils.is.number(target.y) ? (target.y + offsetY) : relativeY,\n\n range: utils.is.number(target.range)? target.range: options.range,\n });\n }\n }\n\n const closest = {\n target: null,\n inRange: false,\n distance: 0,\n range: 0,\n dx: 0,\n dy: 0,\n };\n\n for (i = 0, len = targets.length; i < len; i++) {\n target = targets[i];\n\n const range = target.range;\n const dx = target.x - page.x;\n const dy = target.y - page.y;\n const distance = utils.hypot(dx, dy);\n let inRange = distance <= range;\n\n // Infinite targets count as being out of range\n // compared to non infinite ones that are in range\n if (range === Infinity && closest.inRange && closest.range !== Infinity) {\n inRange = false;\n }\n\n if (!closest.target || (inRange\n // is the closest target in range?\n ? (closest.inRange && range !== Infinity\n // the pointer is relatively deeper in this target\n ? distance / range < closest.distance / closest.range\n // this target has Infinite range and the closest doesn't\n : (range === Infinity && closest.range !== Infinity)\n // OR this target is closer that the previous closest\n || distance < closest.distance)\n // The other is not in range and the pointer is closer to this target\n : (!closest.inRange && distance < closest.distance))) {\n\n closest.target = target;\n closest.distance = distance;\n closest.range = range;\n closest.inRange = inRange;\n closest.dx = dx;\n closest.dy = dy;\n\n status.range = range;\n }\n }\n\n let snapChanged;\n\n if (closest.target) {\n snapChanged = (status.modifiedX !== closest.target.x || status.modifiedY !== closest.target.y);\n\n status.modifiedX = closest.target.x;\n status.modifiedY = closest.target.y;\n }\n else {\n snapChanged = true;\n\n status.modifiedX = NaN;\n status.modifiedY = NaN;\n }\n\n status.dx = closest.dx;\n status.dy = closest.dy;\n\n status.changed = (snapChanged || (closest.inRange && !status.locked));\n status.locked = closest.inRange;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const relativePoints = options && options.relativePoints;\n\n if (options && options.enabled\n && !(phase === 'start' && relativePoints && relativePoints.length)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n }\n\n return {\n range : status.range,\n locked : status.locked,\n x : status.modifiedX,\n y : status.modifiedY,\n realX : status.realX,\n realY : status.realY,\n dx : status.dx,\n dy : status.dy,\n };\n }\n },\n};\n\ninteract.createSnapGrid = function (grid) {\n return function (x, y) {\n const limits = grid.limits || {\n left : -Infinity,\n right : Infinity,\n top : -Infinity,\n bottom: Infinity,\n };\n let offsetX = 0;\n let offsetY = 0;\n\n if (utils.is.object(grid.offset)) {\n offsetX = grid.offset.x;\n offsetY = grid.offset.y;\n }\n\n const gridx = Math.round((x - offsetX) / grid.x);\n const gridy = Math.round((y - offsetY) / grid.y);\n\n const newX = Math.max(limits.left, Math.min(limits.right , gridx * grid.x + offsetX));\n const newY = Math.max(limits.top , Math.min(limits.bottom, gridy * grid.y + offsetY));\n\n return {\n x: newX,\n y: newY,\n range: grid.range,\n };\n };\n};\n\nmodifiers.snap = snap;\nmodifiers.names.push('snap');\n\ndefaultOptions.perAction.snap = snap.defaults;\n\nmodule.exports = snap;\n","// This module allows snapping of the size of targets during resize\n// interactions.\n\nconst modifiers = require('./index');\nconst snap = require('./snap');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\nconst utils = require('../utils/');\n\nconst snapSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n },\n\n setOffset: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.edges;\n\n if (!edges) { return; }\n\n arg.options = {\n relativePoints: [{\n x: edges.left? 0 : 1,\n y: edges.top ? 0 : 1,\n }],\n origin: { x: 0, y: 0 },\n offset: 'self',\n range: options.range,\n };\n\n const offsets = snap.setOffset(arg);\n arg.options = options;\n\n return offsets;\n },\n\n set: function (arg) {\n const { interaction, options, offset, pageCoords } = arg;\n const page = utils.extend({}, pageCoords);\n const relativeX = page.x - offset[0].x;\n const relativeY = page.y - offset[0].y;\n\n arg.options = utils.extend({}, options);\n arg.options.targets = [];\n\n for (const snapTarget of options.targets) {\n let target;\n\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n if ('width' in target && 'height' in target) {\n target.x = target.width;\n target.y = target.height;\n }\n\n arg.options.targets.push(target);\n }\n\n snap.set(arg);\n },\n\n modifyCoords: function (arg) {\n const { options } = arg;\n\n arg.options = utils.extend({}, options);\n arg.options.enabled = options.enabled;\n arg.options.relativePoints = [null];\n\n snap.modifyCoords(arg);\n },\n};\n\nmodifiers.snapSize = snapSize;\nmodifiers.names.push('snapSize');\n\ndefaultOptions.perAction.snapSize = snapSize.defaults;\nresize.defaults.snapSize = snapSize.defaults;\n\nmodule.exports = snapSize;\n","const pointerUtils = require('../utils/pointerUtils');\n\nmodule.exports = class PointerEvent {\n constructor (type, pointer, event, eventTarget, interaction) {\n pointerUtils.pointerExtend(this, event);\n\n if (event !== pointer) {\n pointerUtils.pointerExtend(this, pointer);\n }\n\n this.interaction = interaction;\n\n this.timeStamp = new Date().getTime();\n this.originalEvent = event;\n this.type = type;\n this.pointerId = pointerUtils.getPointerId(pointer);\n this.pointerType = pointerUtils.getPointerType(pointer);\n this.target = eventTarget;\n this.currentTarget = null;\n\n if (type === 'tap') {\n const pointerIndex = interaction.getPointerIndex(pointer);\n this.dt = this.timeStamp - interaction.downTimes[pointerIndex];\n\n const interval = this.timeStamp - interaction.tapTime;\n\n this.double = !!(interaction.prevTap\n && interaction.prevTap.type !== 'doubletap'\n && interaction.prevTap.target === this.target\n && interval < 500);\n }\n else if (type === 'doubletap') {\n this.dt = pointer.timeStamp - interaction.tapTime;\n }\n }\n\n subtractOrigin ({ x: originX, y: originY }) {\n this.pageX -= originX;\n this.pageY -= originY;\n this.clientX -= originX;\n this.clientY -= originY;\n\n return this;\n }\n\n addOrigin ({ x: originX, y: originY }) {\n this.pageX += originX;\n this.pageY += originY;\n this.clientX += originX;\n this.clientY += originY;\n\n return this;\n }\n\n preventDefault () {\n this.originalEvent.preventDefault();\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n};\n","const PointerEvent = require('./PointerEvent');\nconst Interaction = require('../Interaction');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst defaults = require('../defaultOptions');\nconst signals = require('../utils/Signals').new();\nconst { filter } = require('../utils/arr');\n\nconst simpleSignals = [ 'down', 'up', 'cancel' ];\nconst simpleEvents = [ 'down', 'up', 'cancel' ];\n\nconst pointerEvents = {\n PointerEvent,\n fire,\n collectEventTargets,\n signals,\n defaults: {\n holdDuration: 600,\n ignoreFrom : null,\n allowFrom : null,\n origin : { x: 0, y: 0 },\n },\n types: [\n 'down',\n 'move',\n 'up',\n 'cancel',\n 'tap',\n 'doubletap',\n 'hold',\n ],\n};\n\nfunction fire (arg) {\n const {\n interaction, pointer, event, eventTarget,\n type = arg.pointerEvent.type,\n targets = collectEventTargets(arg),\n pointerEvent = new PointerEvent(type, pointer, event, eventTarget, interaction),\n } = arg;\n\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n targets,\n type,\n pointerEvent,\n };\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n\n for (const prop in target.props || {}) {\n pointerEvent[prop] = target.props[prop];\n }\n\n const origin = utils.getOriginXY(target.eventable, target.element);\n\n pointerEvent.subtractOrigin(origin);\n pointerEvent.eventable = target.eventable;\n pointerEvent.currentTarget = target.element;\n\n target.eventable.fire(pointerEvent);\n\n pointerEvent.addOrigin(origin);\n\n if (pointerEvent.immediatePropagationStopped\n || (pointerEvent.propagationStopped\n && (i + 1) < targets.length && targets[i + 1].element !== pointerEvent.currentTarget)) {\n break;\n }\n }\n\n signals.fire('fired', signalArg);\n\n if (type === 'tap') {\n // if pointerEvent should make a double tap, create and fire a doubletap\n // PointerEvent and use that as the prevTap\n const prevTap = pointerEvent.double\n ? fire({\n interaction, pointer, event, eventTarget,\n type: 'doubletap',\n })\n : pointerEvent;\n\n interaction.prevTap = prevTap;\n interaction.tapTime = prevTap.timeStamp;\n }\n\n return pointerEvent;\n}\n\nfunction collectEventTargets ({ interaction, pointer, event, eventTarget, type }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n // do not fire a tap event if the pointer was moved before being lifted\n if (type === 'tap' && (interaction.pointerWasMoved\n // or if the pointerup target is different to the pointerdown target\n || !(interaction.downTargets[pointerIndex] && interaction.downTargets[pointerIndex] === eventTarget))) {\n return [];\n }\n\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n path,\n targets: [],\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (type === 'hold') {\n signalArg.targets = filter(signalArg.targets, target =>\n target.eventable.options.holdDuration === interaction.holdTimers[pointerIndex].duration);\n }\n\n return signalArg.targets;\n}\n\nInteraction.signals.on('update-pointer-down', function ({ interaction, pointerIndex }) {\n interaction.holdTimers[pointerIndex] = { duration: Infinity, timeout: null };\n});\n\nInteraction.signals.on('remove-pointer', function ({ interaction, pointerIndex }) {\n interaction.holdTimers.splice(pointerIndex, 1);\n});\n\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget, duplicateMove }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n if (!duplicateMove && (!interaction.pointerIsDown || interaction.pointerWasMoved)) {\n if (interaction.pointerIsDown) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n\n fire({\n interaction, pointer, event, eventTarget,\n type: 'move',\n });\n }\n});\n\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget, pointerIndex }) {\n // copy event to be used in timeout for IE8\n const eventCopy = browser.isIE8? utils.extend({}, event) : event;\n\n const timer = interaction.holdTimers[pointerIndex];\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'hold',\n targets: [],\n path,\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (!signalArg.targets.length) { return; }\n\n let minDuration = Infinity;\n\n for (let i = 0; i < signalArg.targets.length; i++) {\n const target = signalArg.targets[i];\n const holdDuration = target.eventable.options.holdDuration;\n\n if (holdDuration < minDuration) {\n minDuration = holdDuration;\n }\n }\n\n timer.duration = minDuration;\n timer.timeout = setTimeout(function () {\n fire({\n interaction,\n eventTarget,\n pointer: browser.isIE8? eventCopy : pointer,\n event: eventCopy,\n type: 'hold',\n });\n }, minDuration);\n});\n\nInteraction.signals.on('up', ({ interaction, pointer, event, eventTarget }) => {\n if (!interaction.pointerWasMoved) {\n fire({ interaction, eventTarget, pointer, event, type: 'tap' });\n }\n});\n\n['up', 'cancel'].forEach(function (signalName) {\n Interaction.signals.on(signalName, function ({ interaction, pointerIndex }) {\n if (interaction.holdTimers[pointerIndex]) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n });\n});\n\nfunction createSignalListener (type) {\n return function ({ interaction, pointer, event, eventTarget }) {\n fire({ interaction, eventTarget, pointer, event, type });\n };\n}\n\nfor (let i = 0; i < simpleSignals.length; i++) {\n Interaction.signals.on(simpleSignals[i], createSignalListener(simpleEvents[i]));\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.prevTap = null; // the most recent tap event on this interaction\n interaction.tapTime = 0; // time of the most recent tap event\n interaction.holdTimers = []; // [{ duration, timeout }]\n});\n\ndefaults.pointerEvents = pointerEvents.defaults;\nmodule.exports = pointerEvents;\n","const pointerEvents = require('./base');\nconst Interaction = require('../Interaction');\n\npointerEvents.signals.on('new', onNew);\npointerEvents.signals.on('fired', onFired);\n\nfor (const signal of ['move', 'up', 'cancel', 'endall']) {\n Interaction.signals.on(signal, endHoldRepeat);\n}\n\nfunction onNew ({ pointerEvent }) {\n if (pointerEvent.type !== 'hold') { return; }\n\n pointerEvent.count = (pointerEvent.count || 0) + 1;\n}\n\nfunction onFired ({ interaction, pointerEvent, eventTarget, targets }) {\n if (pointerEvent.type !== 'hold' || !targets.length) { return; }\n\n // get the repeat interval from the first eventable\n const interval = targets[0].eventable.options.holdRepeatInterval;\n\n // don't repeat if the interval is 0 or less\n if (interval <= 0) { return; }\n\n // set a timeout to fire the holdrepeat event\n interaction.holdIntervalHandle = setTimeout(function () {\n pointerEvents.fire({\n interaction,\n eventTarget,\n type: 'hold',\n pointer: pointerEvent,\n event: pointerEvent,\n });\n }, interval);\n}\n\nfunction endHoldRepeat ({ interaction }) {\n // set the interaction's holdStopTime property\n // to stop further holdRepeat events\n if (interaction.holdIntervalHandle) {\n clearInterval(interaction.holdIntervalHandle);\n interaction.holdIntervalHandle = null;\n }\n}\n\n// don't repeat by default\npointerEvents.defaults.holdRepeatInterval = 0;\npointerEvents.types.push('holdrepeat');\n\nmodule.exports = {\n onNew,\n onFired,\n endHoldRepeat,\n};\n","const pointerEvents = require('./base');\nconst Interactable = require('../Interactable');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\nconst scope = require('../scope');\nconst extend = require('../utils/extend');\nconst { merge } = require('../utils/arr');\n\npointerEvents.signals.on('collect-targets', function ({ targets, element, type, eventTarget }) {\n function collectSelectors (interactable, selector, context) {\n const els = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && is.element(element)\n && domUtils.matchesSelector(element, selector, els)\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n const interactable = scope.interactables.get(element);\n\n if (interactable) {\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n scope.interactables.forEachSelector(collectSelectors, element);\n});\n\nInteractable.signals.on('new', function ({ interactable }) {\n interactable.events.getRect = function (element) {\n return interactable.getRect(element);\n };\n});\n\nInteractable.signals.on('set', function ({ interactable, options }) {\n extend(interactable.events.options, pointerEvents.defaults);\n extend(interactable.events.options, options);\n});\n\nmerge(Interactable.eventTypes, pointerEvents.types);\n\nInteractable.prototype.pointerEvents = function (options) {\n extend(this.events.options, options);\n\n return this;\n};\n\nconst __backCompatOption = Interactable.prototype._backCompatOption;\n\nInteractable.prototype._backCompatOption = function (optionName, newValue) {\n const ret = __backCompatOption.call(this, optionName, newValue);\n\n if (ret === this) {\n this.events.options[optionName] = newValue;\n }\n\n return ret;\n};\n\nInteractable.settingsMethods.push('pointerEvents');\n","const utils = require('./utils');\nconst events = require('./utils/events');\nconst signals = require('./utils/Signals').new();\n\nconst scope = {\n signals,\n events,\n utils,\n\n // main document\n document: require('./utils/domObjects').document,\n // all documents being listened to\n documents: [],\n\n addDocument: function (doc, win) {\n // do nothing if document is already known\n if (utils.contains(scope.documents, doc)) { return false; }\n\n win = win || scope.getWindow(doc);\n\n scope.documents.push(doc);\n events.documents.push(doc);\n\n // don't add an unload event for the main document\n // so that the page may be cached in browser history\n if (doc !== scope.document) {\n events.add(win, 'unload', scope.onWindowUnload);\n }\n\n signals.fire('add-document', { doc, win });\n },\n\n removeDocument: function (doc, win) {\n const index = utils.indexOf(scope.documents, doc);\n\n win = win || scope.getWindow(doc);\n\n events.remove(win, 'unload', scope.onWindowUnload);\n\n scope.documents.splice(index, 1);\n events.documents.splice(index, 1);\n\n signals.fire('remove-document', { win, doc });\n },\n\n onWindowUnload: function () {\n scope.removeDocument(this.document, this);\n },\n};\n\nmodule.exports = scope;\n","const { indexOf } = require('./arr');\n\nclass Signals {\n constructor () {\n this.listeners = {\n // signalName: [listeners],\n };\n }\n\n on (name, listener) {\n if (!this.listeners[name]) {\n this.listeners[name] = [listener];\n return;\n }\n\n this.listeners[name].push(listener);\n }\n\n off (name, listener) {\n if (!this.listeners[name]) { return; }\n\n const index = indexOf(this.listeners[name], listener);\n\n if (index !== -1) {\n this.listeners[name].splice(index, 1);\n }\n }\n\n fire (name, arg) {\n const targetListeners = this.listeners[name];\n\n if (!targetListeners) { return; }\n\n for (let i = 0; i < targetListeners.length; i++) {\n if (targetListeners[i](arg, name) === false) {\n return;\n }\n }\n }\n}\n\nSignals.new = function () {\n return new Signals();\n};\n\nmodule.exports = Signals;\n","function indexOf (array, target) {\n for (let i = 0, len = array.length; i < len; i++) {\n if (array[i] === target) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction contains (array, target) {\n return indexOf(array, target) !== -1;\n}\n\nfunction merge (target, source) {\n for (let i = 0; i < source.length; i++) {\n target.push(source[i]);\n }\n\n return target;\n}\n\nfunction filter (array, test) {\n const result = [];\n\n for (let i = 0; i < array.length; i++) {\n if (test(array[i])) {\n result.push(array[i]);\n }\n }\n\n return result;\n}\n\nmodule.exports = {\n indexOf,\n contains,\n merge,\n filter,\n};\n","const { window } = require('./window');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst Element = domObjects.Element;\nconst navigator = window.navigator;\n\nconst browser = {\n // Does the browser support touch input?\n supportsTouch: !!(('ontouchstart' in window) || is.function(window.DocumentTouch)\n && domObjects.document instanceof window.DocumentTouch),\n\n // Does the browser support PointerEvents\n supportsPointerEvent: !!domObjects.PointerEvent,\n\n isIE8: ('attachEvent' in window) && !('addEventListener' in window),\n\n // Opera Mobile must be handled differently\n isOperaMobile: (navigator.appName === 'Opera'\n && browser.supportsTouch\n && navigator.userAgent.match('Presto')),\n\n // scrolling doesn't change the result of getClientRects on iOS 7\n isIOS7: (/iP(hone|od|ad)/.test(navigator.platform)\n && /OS 7[^\\d]/.test(navigator.appVersion)),\n\n isIe9OrOlder: /MSIE (8|9)/.test(navigator.userAgent),\n\n // prefix matchesSelector\n prefixedMatchesSelector: 'matches' in Element.prototype\n ? 'matches': 'webkitMatchesSelector' in Element.prototype\n ? 'webkitMatchesSelector': 'mozMatchesSelector' in Element.prototype\n ? 'mozMatchesSelector': 'oMatchesSelector' in Element.prototype\n ? 'oMatchesSelector': 'msMatchesSelector',\n\n useMatchesSelectorPolyfill: false,\n\n pEventTypes: (domObjects.PointerEvent\n ? (domObjects.PointerEvent === window.MSPointerEvent\n ? {\n up: 'MSPointerUp',\n down: 'MSPointerDown',\n over: 'mouseover',\n out: 'mouseout',\n move: 'MSPointerMove',\n cancel: 'MSPointerCancel',\n }\n : {\n up: 'pointerup',\n down: 'pointerdown',\n over: 'pointerover',\n out: 'pointerout',\n move: 'pointermove',\n cancel: 'pointercancel',\n })\n : null),\n\n // because Webkit and Opera still use 'mousewheel' event type\n wheelEvent: 'onmousewheel' in domObjects.document? 'mousewheel': 'wheel',\n\n};\n\nbrowser.useMatchesSelectorPolyfill = !is.function(Element.prototype[browser.prefixedMatchesSelector]);\n\nmodule.exports = browser;\n","const domObjects = {};\nconst win = require('./window').window;\n\nfunction blank () {}\n\ndomObjects.document = win.document;\ndomObjects.DocumentFragment = win.DocumentFragment || blank;\ndomObjects.SVGElement = win.SVGElement || blank;\ndomObjects.SVGSVGElement = win.SVGSVGElement || blank;\ndomObjects.SVGElementInstance = win.SVGElementInstance || blank;\ndomObjects.Element = win.Element || blank;\ndomObjects.HTMLElement = win.HTMLElement || domObjects.Element;\n\ndomObjects.Event = win.Event;\ndomObjects.Touch = win.Touch || blank;\ndomObjects.PointerEvent = (win.PointerEvent || win.MSPointerEvent);\n\nmodule.exports = domObjects;\n","const win = require('./window');\nconst browser = require('./browser');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst domUtils = {\n nodeContains: function (parent, child) {\n while (child) {\n if (child === parent) {\n return true;\n }\n\n child = child.parentNode;\n }\n\n return false;\n },\n\n closest: function (element, selector) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) { return element; }\n\n element = domUtils.parentNode(element);\n }\n\n return null;\n },\n\n parentNode: function (node) {\n let parent = node.parentNode;\n\n if (is.docFrag(parent)) {\n // skip past #shado-root fragments\n while ((parent = parent.host) && is.docFrag(parent)) {\n continue;\n }\n\n return parent;\n }\n\n return parent;\n },\n\n // taken from http://tanalin.com/en/blog/2012/12/matches-selector-ie8/ and modified\n matchesSelectorPolyfill: browser.useMatchesSelectorPolyfill\n ? function (element, selector, elems) {\n elems = elems || element.parentNode.querySelectorAll(selector);\n\n for (let i = 0, len = elems.length; i < len; i++) {\n if (elems[i] === element) {\n return true;\n }\n }\n\n return false;\n }\n : null,\n\n matchesSelector: function (element, selector, nodeList) {\n if (browser.useMatchesSelectorPolyfill) {\n return domUtils.matchesSelectorPolyfill(element, selector, nodeList);\n }\n\n // remove /deep/ from selectors if shadowDOM polyfill is used\n if (win.window !== win.realWindow) {\n selector = selector.replace(/\\/deep\\//g, ' ');\n }\n\n return element[browser.prefixedMatchesSelector](selector);\n },\n\n // Test for the element that's \"above\" all other qualifiers\n indexOfDeepestElement: function (elements) {\n let deepestZoneParents = [];\n let dropzoneParents = [];\n let dropzone;\n let deepestZone = elements[0];\n let index = deepestZone? 0: -1;\n let parent;\n let child;\n let i;\n let n;\n\n for (i = 1; i < elements.length; i++) {\n dropzone = elements[i];\n\n // an element might belong to multiple selector dropzones\n if (!dropzone || dropzone === deepestZone) {\n continue;\n }\n\n if (!deepestZone) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n // check if the deepest or current are document.documentElement or document.rootElement\n // - if the current dropzone is, do nothing and continue\n if (dropzone.parentNode === dropzone.ownerDocument) {\n continue;\n }\n // - if deepest is, update with the current dropzone and continue to next\n else if (deepestZone.parentNode === dropzone.ownerDocument) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n if (!deepestZoneParents.length) {\n parent = deepestZone;\n while (parent.parentNode && parent.parentNode !== parent.ownerDocument) {\n deepestZoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n }\n\n // if this element is an svg element and the current deepest is\n // an HTMLElement\n if (deepestZone instanceof domObjects.HTMLElement\n && dropzone instanceof domObjects.SVGElement\n && !(dropzone instanceof domObjects.SVGSVGElement)) {\n\n if (dropzone === deepestZone.parentNode) {\n continue;\n }\n\n parent = dropzone.ownerSVGElement;\n }\n else {\n parent = dropzone;\n }\n\n dropzoneParents = [];\n\n while (parent.parentNode !== parent.ownerDocument) {\n dropzoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n\n n = 0;\n\n // get (position of last common ancestor) + 1\n while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) {\n n++;\n }\n\n const parents = [\n dropzoneParents[n - 1],\n dropzoneParents[n],\n deepestZoneParents[n],\n ];\n\n child = parents[0].lastChild;\n\n while (child) {\n if (child === parents[1]) {\n deepestZone = dropzone;\n index = i;\n deepestZoneParents = [];\n\n break;\n }\n else if (child === parents[2]) {\n break;\n }\n\n child = child.previousSibling;\n }\n }\n\n return index;\n },\n\n matchesUpTo: function (element, selector, limit) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) {\n return true;\n }\n\n element = domUtils.parentNode(element);\n\n if (element === limit) {\n return domUtils.matchesSelector(element, selector);\n }\n }\n\n return false;\n },\n\n getActualElement: function (element) {\n return (element instanceof domObjects.SVGElementInstance\n ? element.correspondingUseElement\n : element);\n },\n\n getScrollXY: function (relevantWindow) {\n relevantWindow = relevantWindow || win.window;\n return {\n x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft,\n y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop,\n };\n },\n\n getElementClientRect: function (element) {\n const clientRect = (element instanceof domObjects.SVGElement\n ? element.getBoundingClientRect()\n : element.getClientRects()[0]);\n\n return clientRect && {\n left : clientRect.left,\n right : clientRect.right,\n top : clientRect.top,\n bottom: clientRect.bottom,\n width : clientRect.width || clientRect.right - clientRect.left,\n height: clientRect.height || clientRect.bottom - clientRect.top,\n };\n },\n\n getElementRect: function (element) {\n const clientRect = domUtils.getElementClientRect(element);\n\n if (!browser.isIOS7 && clientRect) {\n const scroll = domUtils.getScrollXY(win.getWindow(element));\n\n clientRect.left += scroll.x;\n clientRect.right += scroll.x;\n clientRect.top += scroll.y;\n clientRect.bottom += scroll.y;\n }\n\n return clientRect;\n },\n\n getPath: function (element) {\n const path = [];\n\n while (element) {\n path.push(element);\n element = domUtils.parentNode(element);\n }\n\n return path;\n },\n\n trySelector: value => {\n if (!is.string(value)) { return false; }\n\n // an exception will be raised if it is invalid\n domObjects.document.querySelector(value);\n return true;\n },\n};\n\nmodule.exports = domUtils;\n","const is = require('./is');\nconst domUtils = require('./domUtils');\nconst pExtend = require('./pointerExtend');\n\nconst { window, getWindow } = require('./window');\nconst { indexOf, contains } = require('./arr');\n\nconst useAttachEvent = ('attachEvent' in window) && !('addEventListener' in window);\nconst addEvent = useAttachEvent? 'attachEvent': 'addEventListener';\nconst removeEvent = useAttachEvent? 'detachEvent': 'removeEventListener';\nconst on = useAttachEvent? 'on': '';\n\nconst elements = [];\nconst targets = [];\nconst attachedListeners = [];\n\n// {\n// type: {\n// selectors: ['selector', ...],\n// contexts : [document, ...],\n// listeners: [[listener, capture, passive], ...]\n// }\n// }\nconst delegatedEvents = {};\n\nconst documents = [];\n\nconst supportsOptions = !useAttachEvent && (() => {\n let supported = false;\n\n window.document.createElement('div').addEventListener('test', null, {\n get capture () { supported = true; },\n });\n\n return supported;\n})();\n\nfunction add (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n let elementIndex = indexOf(elements, element);\n let target = targets[elementIndex];\n\n if (!target) {\n target = {\n events: {},\n typeCount: 0,\n };\n\n elementIndex = elements.push(element) - 1;\n targets.push(target);\n\n attachedListeners.push(useAttachEvent\n ? {\n supplied: [],\n wrapped : [],\n useCount: [],\n }\n : null);\n }\n\n if (!target.events[type]) {\n target.events[type] = [];\n target.typeCount++;\n }\n\n if (!contains(target.events[type], listener)) {\n let ret;\n\n if (useAttachEvent) {\n const { supplied, wrapped, useCount } = attachedListeners[elementIndex];\n const listenerIndex = indexOf(supplied, listener);\n\n const wrappedListener = wrapped[listenerIndex] || function (event) {\n if (!event.immediatePropagationStopped) {\n event.target = event.srcElement;\n event.currentTarget = element;\n\n event.preventDefault = event.preventDefault || preventDef;\n event.stopPropagation = event.stopPropagation || stopProp;\n event.stopImmediatePropagation = event.stopImmediatePropagation || stopImmProp;\n\n if (/mouse|click/.test(event.type)) {\n event.pageX = event.clientX + getWindow(element).document.documentElement.scrollLeft;\n event.pageY = event.clientY + getWindow(element).document.documentElement.scrollTop;\n }\n\n listener(event);\n }\n };\n\n ret = element[addEvent](on + type, wrappedListener, !!options.capture);\n\n if (listenerIndex === -1) {\n supplied.push(listener);\n wrapped.push(wrappedListener);\n useCount.push(1);\n }\n else {\n useCount[listenerIndex]++;\n }\n }\n else {\n ret = element[addEvent](type, listener, supportsOptions? options : !!options.capture);\n }\n target.events[type].push(listener);\n\n return ret;\n }\n}\n\nfunction remove (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const elementIndex = indexOf(elements, element);\n const target = targets[elementIndex];\n\n if (!target || !target.events) {\n return;\n }\n\n let wrappedListener = listener;\n let listeners;\n let listenerIndex;\n\n if (useAttachEvent) {\n listeners = attachedListeners[elementIndex];\n listenerIndex = indexOf(listeners.supplied, listener);\n wrappedListener = listeners.wrapped[listenerIndex];\n }\n\n if (type === 'all') {\n for (type in target.events) {\n if (target.events.hasOwnProperty(type)) {\n remove(element, type, 'all');\n }\n }\n return;\n }\n\n if (target.events[type]) {\n const len = target.events[type].length;\n\n if (listener === 'all') {\n for (let i = 0; i < len; i++) {\n remove(element, type, target.events[type][i], options);\n }\n return;\n }\n else {\n for (let i = 0; i < len; i++) {\n if (target.events[type][i] === listener) {\n element[removeEvent](on + type, wrappedListener, supportsOptions? options : !!options.capture);\n target.events[type].splice(i, 1);\n\n if (useAttachEvent && listeners) {\n listeners.useCount[listenerIndex]--;\n if (listeners.useCount[listenerIndex] === 0) {\n listeners.supplied.splice(listenerIndex, 1);\n listeners.wrapped.splice(listenerIndex, 1);\n listeners.useCount.splice(listenerIndex, 1);\n }\n }\n\n break;\n }\n }\n }\n\n if (target.events[type] && target.events[type].length === 0) {\n target.events[type] = null;\n target.typeCount--;\n }\n }\n\n if (!target.typeCount) {\n targets.splice(elementIndex, 1);\n elements.splice(elementIndex, 1);\n attachedListeners.splice(elementIndex, 1);\n }\n}\n\nfunction addDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n if (!delegatedEvents[type]) {\n delegatedEvents[type] = {\n selectors: [],\n contexts : [],\n listeners: [],\n };\n\n // add delegate listener functions\n for (let i = 0; i < documents.length; i++) {\n add(documents[i], type, delegateListener);\n add(documents[i], type, delegateUseCapture, true);\n }\n }\n\n const delegated = delegatedEvents[type];\n let index;\n\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n break;\n }\n }\n\n if (index === -1) {\n index = delegated.selectors.length;\n\n delegated.selectors.push(selector);\n delegated.contexts .push(context);\n delegated.listeners.push([]);\n }\n\n // keep listener and capture and passive flags\n delegated.listeners[index].push([listener, !!options.capture, options.passive]);\n}\n\nfunction removeDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const delegated = delegatedEvents[type];\n let matchFound = false;\n let index;\n\n if (!delegated) { return; }\n\n // count from last index of delegated to 0\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n // look for matching selector and context Node\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n\n const listeners = delegated.listeners[index];\n\n // each item of the listeners array is an array: [function, capture, passive]\n for (let i = listeners.length - 1; i >= 0; i--) {\n const [fn, capture, passive] = listeners[i];\n\n // check if the listener functions and capture and passive flags match\n if (fn === listener && capture === !!options.capture && passive === options.passive) {\n // remove the listener from the array of listeners\n listeners.splice(i, 1);\n\n // if all listeners for this interactable have been removed\n // remove the interactable from the delegated arrays\n if (!listeners.length) {\n delegated.selectors.splice(index, 1);\n delegated.contexts .splice(index, 1);\n delegated.listeners.splice(index, 1);\n\n // remove delegate function from context\n remove(context, type, delegateListener);\n remove(context, type, delegateUseCapture, true);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegatedEvents[type] = null;\n }\n }\n\n // only remove one listener\n matchFound = true;\n break;\n }\n }\n\n if (matchFound) { break; }\n }\n }\n}\n\n// bound to the interactable context when a DOM event\n// listener is added to a selector interactable\nfunction delegateListener (event, optionalArg) {\n const options = getOptions(optionalArg);\n const fakeEvent = {};\n const delegated = delegatedEvents[event.type];\n const eventTarget = (domUtils.getActualElement(event.path\n ? event.path[0]\n : event.target));\n let element = eventTarget;\n\n // duplicate the event so that currentTarget can be changed\n pExtend(fakeEvent, event);\n\n fakeEvent.originalEvent = event;\n fakeEvent.preventDefault = preventOriginalDefault;\n\n // climb up document tree looking for selector matches\n while (is.element(element)) {\n for (let i = 0; i < delegated.selectors.length; i++) {\n const selector = delegated.selectors[i];\n const context = delegated.contexts[i];\n\n if (domUtils.matchesSelector(element, selector)\n && domUtils.nodeContains(context, eventTarget)\n && domUtils.nodeContains(context, element)) {\n\n const listeners = delegated.listeners[i];\n\n fakeEvent.currentTarget = element;\n\n for (let j = 0; j < listeners.length; j++) {\n const [fn, capture, passive] = listeners[j];\n\n if (capture === !!options.capture && passive === options.passive) {\n fn(fakeEvent);\n }\n }\n }\n }\n\n element = domUtils.parentNode(element);\n }\n}\n\nfunction delegateUseCapture (event) {\n return delegateListener.call(this, event, true);\n}\n\nfunction preventDef () {\n this.returnValue = false;\n}\n\nfunction preventOriginalDefault () {\n this.originalEvent.preventDefault();\n}\n\nfunction stopProp () {\n this.cancelBubble = true;\n}\n\nfunction stopImmProp () {\n this.cancelBubble = true;\n this.immediatePropagationStopped = true;\n}\n\nfunction getOptions (param) {\n return is.object(param)? param : { capture: param };\n}\n\nmodule.exports = {\n add,\n remove,\n\n addDelegate,\n removeDelegate,\n\n delegateListener,\n delegateUseCapture,\n delegatedEvents,\n documents,\n\n useAttachEvent,\n supportsOptions,\n\n _elements: elements,\n _targets: targets,\n _attachedListeners: attachedListeners,\n};\n","module.exports = function extend (dest, source) {\n for (const prop in source) {\n dest[prop] = source[prop];\n }\n return dest;\n};\n","const {\n resolveRectLike,\n rectToXY,\n} = require('./rect');\n\nmodule.exports = function (target, element, action) {\n const actionOptions = target.options[action];\n const actionOrigin = actionOptions && actionOptions.origin;\n const origin = actionOrigin || target.options.origin;\n\n const originRect = resolveRectLike(origin, target, element, [target && element]);\n\n return rectToXY(originRect) || { x: 0, y: 0 };\n};\n","module.exports = (x, y) => Math.sqrt(x * x + y * y);\n","const extend = require('./extend');\nconst win = require('./window');\n\nconst utils = {\n warnOnce: function (method, message) {\n let warned = false;\n\n return function () {\n if (!warned) {\n win.window.console.warn(message);\n warned = true;\n }\n\n return method.apply(this, arguments);\n };\n },\n\n // http://stackoverflow.com/a/5634528/2280888\n _getQBezierValue: function (t, p1, p2, p3) {\n const iT = 1 - t;\n return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3;\n },\n\n getQuadraticCurvePoint: function (startX, startY, cpX, cpY, endX, endY, position) {\n return {\n x: utils._getQBezierValue(position, startX, cpX, endX),\n y: utils._getQBezierValue(position, startY, cpY, endY),\n };\n },\n\n // http://gizma.com/easing/\n easeOutQuad: function (t, b, c, d) {\n t /= d;\n return -c * t*(t-2) + b;\n },\n\n copyAction: function (dest, src) {\n dest.name = src.name;\n dest.axis = src.axis;\n dest.edges = src.edges;\n\n return dest;\n },\n\n is : require('./is'),\n extend : extend,\n hypot : require('./hypot'),\n getOriginXY: require('./getOriginXY'),\n};\n\nextend(utils, require('./arr'));\nextend(utils, require('./domUtils'));\nextend(utils, require('./pointerUtils'));\nextend(utils, require('./rect'));\n\nmodule.exports = utils;\n","const scope = require('../scope');\nconst utils = require('./index');\n\nconst finder = {\n methodOrder: [ 'simulationResume', 'mouseOrPen', 'hasPointer', 'idle' ],\n\n search: function (pointer, eventType, eventTarget) {\n const pointerType = utils.getPointerType(pointer);\n const pointerId = utils.getPointerId(pointer);\n const details = { pointer, pointerId, pointerType, eventType, eventTarget };\n\n for (const method of finder.methodOrder) {\n const interaction = finder[method](details);\n\n if (interaction) {\n return interaction;\n }\n }\n },\n\n // try to resume simulation with a new pointer\n simulationResume: function ({ pointerType, eventType, eventTarget }) {\n if (!/down|start/i.test(eventType)) {\n return null;\n }\n\n for (const interaction of scope.interactions) {\n let element = eventTarget;\n\n if (interaction.simulation && interaction.simulation.allowResume\n && (interaction.pointerType === pointerType)) {\n while (element) {\n // if the element is the interaction element\n if (element === interaction.element) {\n return interaction;\n }\n element = utils.parentNode(element);\n }\n }\n }\n\n return null;\n },\n\n // if it's a mouse or pen interaction\n mouseOrPen: function ({ pointerId, pointerType, eventType }) {\n if (pointerType !== 'mouse' && pointerType !== 'pen') {\n return null;\n }\n\n let firstNonActive;\n\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType) {\n // if it's a down event, skip interactions with running simulations\n if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; }\n\n // if the interaction is active, return it immediately\n if (interaction.interacting()) {\n return interaction;\n }\n // otherwise save it and look for another active interaction\n else if (!firstNonActive) {\n firstNonActive = interaction;\n }\n }\n }\n\n // if no active mouse interaction was found use the first inactive mouse\n // interaction\n if (firstNonActive) {\n return firstNonActive;\n }\n\n // find any mouse or pen interaction.\n // ignore the interaction if the eventType is a *down, and a simulation\n // is active\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType && !(/down/i.test(eventType) && interaction.simulation)) {\n return interaction;\n }\n }\n\n return null;\n },\n\n // get interaction that has this pointer\n hasPointer: function ({ pointerId }) {\n for (const interaction of scope.interactions) {\n if (utils.contains(interaction.pointerIds, pointerId)) {\n return interaction;\n }\n }\n },\n\n // get first idle interaction with a matching pointerType\n idle: function ({ pointerType }) {\n for (const interaction of scope.interactions) {\n // if there's already a pointer held down\n if (interaction.pointerIds.length === 1) {\n const target = interaction.target;\n // don't add this pointer if there is a target interactable and it\n // isn't gesturable\n if (target && !target.options.gesture.enabled) {\n continue;\n }\n }\n // maximum of 2 pointers per interaction\n else if (interaction.pointerIds.length >= 2) {\n continue;\n }\n\n if (!interaction.interacting() && (pointerType === interaction.pointerType)) {\n return interaction;\n }\n }\n\n return null;\n },\n};\n\nmodule.exports = finder;\n","const win = require('./window');\nconst isWindow = require('./isWindow');\n\nconst is = {\n array : () => {},\n\n window : thing => thing === win.window || isWindow(thing),\n\n docFrag : thing => is.object(thing) && thing.nodeType === 11,\n\n object : thing => !!thing && (typeof thing === 'object'),\n\n function: thing => typeof thing === 'function',\n\n number : thing => typeof thing === 'number' ,\n\n bool : thing => typeof thing === 'boolean' ,\n\n string : thing => typeof thing === 'string' ,\n\n element: thing => {\n if (!thing || (typeof thing !== 'object')) { return false; }\n\n const _window = win.getWindow(thing) || win.window;\n\n return (/object|function/.test(typeof _window.Element)\n ? thing instanceof _window.Element //DOM2\n : thing.nodeType === 1 && typeof thing.nodeName === 'string');\n },\n};\n\nis.array = thing => (is.object(thing)\n && (typeof thing.length !== 'undefined')\n && is.function(thing.splice));\n\nmodule.exports = is;\n","module.exports = (thing) => !!(thing && thing.Window) && (thing instanceof thing.Window);\n","function pointerExtend (dest, source) {\n for (const prop in source) {\n const prefixedPropREs = module.exports.prefixedPropREs;\n let deprecated = false;\n\n // skip deprecated prefixed properties\n for (const vendor in prefixedPropREs) {\n if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) {\n deprecated = true;\n break;\n }\n }\n\n if (!deprecated && typeof source[prop] !== 'function') {\n dest[prop] = source[prop];\n }\n }\n return dest;\n}\n\npointerExtend.prefixedPropREs = {\n webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/,\n};\n\nmodule.exports = pointerExtend;\n","const hypot = require('./hypot');\nconst browser = require('./browser');\nconst dom = require('./domObjects');\nconst domUtils = require('./domUtils');\nconst domObjects = require('./domObjects');\nconst is = require('./is');\nconst pointerExtend = require('./pointerExtend');\n\nconst pointerUtils = {\n copyCoords: function (dest, src) {\n dest.page = dest.page || {};\n dest.page.x = src.page.x;\n dest.page.y = src.page.y;\n\n dest.client = dest.client || {};\n dest.client.x = src.client.x;\n dest.client.y = src.client.y;\n\n dest.timeStamp = src.timeStamp;\n },\n\n setCoordDeltas: function (targetObj, prev, cur) {\n targetObj.page.x = cur.page.x - prev.page.x;\n targetObj.page.y = cur.page.y - prev.page.y;\n targetObj.client.x = cur.client.x - prev.client.x;\n targetObj.client.y = cur.client.y - prev.client.y;\n targetObj.timeStamp = cur.timeStamp - prev.timeStamp;\n\n // set pointer velocity\n const dt = Math.max(targetObj.timeStamp / 1000, 0.001);\n\n targetObj.page.speed = hypot(targetObj.page.x, targetObj.page.y) / dt;\n targetObj.page.vx = targetObj.page.x / dt;\n targetObj.page.vy = targetObj.page.y / dt;\n\n targetObj.client.speed = hypot(targetObj.client.x, targetObj.page.y) / dt;\n targetObj.client.vx = targetObj.client.x / dt;\n targetObj.client.vy = targetObj.client.y / dt;\n },\n\n isNativePointer: function (pointer) {\n return (pointer instanceof dom.Event || pointer instanceof dom.Touch);\n },\n\n // Get specified X/Y coords for mouse or event.touches[0]\n getXY: function (type, pointer, xy) {\n xy = xy || {};\n type = type || 'page';\n\n xy.x = pointer[type + 'X'];\n xy.y = pointer[type + 'Y'];\n\n return xy;\n },\n\n getPageXY: function (pointer, page) {\n page = page || {};\n\n // Opera Mobile handles the viewport and scrolling oddly\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n pointerUtils.getXY('screen', pointer, page);\n\n page.x += window.scrollX;\n page.y += window.scrollY;\n }\n else {\n pointerUtils.getXY('page', pointer, page);\n }\n\n return page;\n },\n\n getClientXY: function (pointer, client) {\n client = client || {};\n\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n // Opera Mobile handles the viewport and scrolling oddly\n pointerUtils.getXY('screen', pointer, client);\n }\n else {\n pointerUtils.getXY('client', pointer, client);\n }\n\n return client;\n },\n\n getPointerId: function (pointer) {\n return is.number(pointer.pointerId)? pointer.pointerId : pointer.identifier;\n },\n\n setCoords: function (targetObj, pointers, timeStamp) {\n const pointer = (pointers.length > 1\n ? pointerUtils.pointerAverage(pointers)\n : pointers[0]);\n\n const tmpXY = {};\n\n pointerUtils.getPageXY(pointer, tmpXY);\n targetObj.page.x = tmpXY.x;\n targetObj.page.y = tmpXY.y;\n\n pointerUtils.getClientXY(pointer, tmpXY);\n targetObj.client.x = tmpXY.x;\n targetObj.client.y = tmpXY.y;\n\n targetObj.timeStamp = is.number(timeStamp) ? timeStamp :new Date().getTime();\n },\n\n pointerExtend: pointerExtend,\n\n getTouchPair: function (event) {\n const touches = [];\n\n // array of touches is supplied\n if (is.array(event)) {\n touches[0] = event[0];\n touches[1] = event[1];\n }\n // an event\n else {\n if (event.type === 'touchend') {\n if (event.touches.length === 1) {\n touches[0] = event.touches[0];\n touches[1] = event.changedTouches[0];\n }\n else if (event.touches.length === 0) {\n touches[0] = event.changedTouches[0];\n touches[1] = event.changedTouches[1];\n }\n }\n else {\n touches[0] = event.touches[0];\n touches[1] = event.touches[1];\n }\n }\n\n return touches;\n },\n\n pointerAverage: function (pointers) {\n const average = {\n pageX : 0,\n pageY : 0,\n clientX: 0,\n clientY: 0,\n screenX: 0,\n screenY: 0,\n };\n\n for (const pointer of pointers) {\n for (const prop in average) {\n average[prop] += pointer[prop];\n }\n }\n for (const prop in average) {\n average[prop] /= pointers.length;\n }\n\n return average;\n },\n\n touchBBox: function (event) {\n if (!event.length && !(event.touches && event.touches.length > 1)) {\n return;\n }\n\n const touches = pointerUtils.getTouchPair(event);\n const minX = Math.min(touches[0].pageX, touches[1].pageX);\n const minY = Math.min(touches[0].pageY, touches[1].pageY);\n const maxX = Math.max(touches[0].pageX, touches[1].pageX);\n const maxY = Math.max(touches[0].pageY, touches[1].pageY);\n\n return {\n x: minX,\n y: minY,\n left: minX,\n top: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n },\n\n touchDistance: function (event, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n\n\n const dx = touches[0][sourceX] - touches[1][sourceX];\n const dy = touches[0][sourceY] - touches[1][sourceY];\n\n return hypot(dx, dy);\n },\n\n touchAngle: function (event, prevAngle, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n const dx = touches[1][sourceX] - touches[0][sourceX];\n const dy = touches[1][sourceY] - touches[0][sourceY];\n const angle = 180 * Math.atan2(dy , dx) / Math.PI;\n\n return angle;\n },\n\n getPointerType: function (pointer) {\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : is.number(pointer.pointerType)\n ? [undefined, undefined,'touch', 'pen', 'mouse'][pointer.pointerType]\n // if the PointerEvent API isn't available, then the \"pointer\" must\n // be either a MouseEvent, TouchEvent, or Touch object\n : /touch/.test(pointer.type) || pointer instanceof domObjects.Touch\n ? 'touch'\n : 'mouse';\n },\n\n // [ event.target, event.currentTarget ]\n getEventTargets: function (event) {\n return [\n domUtils.getActualElement(event.path ? event.path[0] : event.target),\n domUtils.getActualElement(event.currentTarget),\n ];\n },\n};\n\nmodule.exports = pointerUtils;\n","const { window } = require('./window');\n\nconst vendors = ['ms', 'moz', 'webkit', 'o'];\nlet lastTime = 0;\nlet request;\nlet cancel;\n\nfor (let x = 0; x < vendors.length && !window.requestAnimationFrame; x++) {\n request = window[vendors[x] + 'RequestAnimationFrame'];\n cancel = window[vendors[x] +'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n}\n\nif (!request) {\n request = function (callback) {\n const currTime = new Date().getTime();\n const timeToCall = Math.max(0, 16 - (currTime - lastTime));\n const id = setTimeout(function () { callback(currTime + timeToCall); },\n timeToCall);\n\n lastTime = currTime + timeToCall;\n return id;\n };\n}\n\nif (!cancel) {\n cancel = function (id) {\n clearTimeout(id);\n };\n}\n\nmodule.exports = {\n request,\n cancel,\n};\n","const extend = require('./extend');\nconst is = require('./is');\nconst {\n closest,\n parentNode,\n getElementRect,\n} = require('./domUtils');\n\nconst rectUtils = {\n getStringOptionResult: function (value, interactable, element) {\n if (!is.string(value)) {\n return null;\n }\n\n if (value === 'parent') {\n value = parentNode(element);\n }\n else if (value === 'self') {\n value = interactable.getRect(element);\n }\n else {\n value = closest(element, value);\n }\n\n return value;\n },\n\n resolveRectLike: function (value, interactable, element, functionArgs) {\n value = rectUtils.getStringOptionResult(value, interactable, element) || value;\n\n if (is.function(value)) {\n value = value.apply(null, functionArgs);\n }\n\n if (is.element(value)) {\n value = getElementRect(value);\n }\n\n return value;\n },\n\n rectToXY: function (rect) {\n return rect && {\n x: 'x' in rect ? rect.x : rect.left,\n y: 'y' in rect ? rect.y : rect.top,\n };\n },\n\n xywhToTlbr: function (rect) {\n if (rect && !('left' in rect && 'top' in rect)) {\n rect = extend({}, rect);\n\n rect.left = rect.x || 0;\n rect.top = rect.y || 0;\n rect.right = rect.right || (rect.left + rect.width);\n rect.bottom = rect.bottom || (rect.top + rect.height);\n }\n\n return rect;\n },\n\n tlbrToXywh: function (rect) {\n if (rect && !('x' in rect && 'y' in rect)) {\n rect = extend({}, rect);\n\n rect.x = rect.left || 0;\n rect.top = rect.top || 0;\n rect.width = rect.width || (rect.right - rect.x);\n rect.height = rect.height || (rect.bottom - rect.y);\n }\n\n return rect;\n },\n};\n\nmodule.exports = rectUtils;\n","const win = module.exports;\nconst isWindow = require('./isWindow');\n\nfunction init (window) {\n // get wrapped window if using Shadow DOM polyfill\n\n win.realWindow = window;\n\n // create a TextNode\n const el = window.document.createTextNode('');\n\n // check if it's wrapped by a polyfill\n if (el.ownerDocument !== window.document\n && typeof window.wrap === 'function'\n && window.wrap(el) === el) {\n // use wrapped window\n window = window.wrap(window);\n }\n\n win.window = window;\n}\n\nif (typeof window === 'undefined') {\n win.window = undefined;\n win.realWindow = undefined;\n}\nelse {\n init(window);\n}\n\nwin.getWindow = function getWindow (node) {\n if (isWindow(node)) {\n return node;\n }\n\n const rootNode = (node.ownerDocument || node);\n\n return rootNode.defaultView || rootNode.parentWindow || win.window;\n};\n\nwin.init = init;\n"]} \ No newline at end of file diff --git a/package.json b/package.json index 76f3e9969..f39704e99 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "interactjs", - "version": "1.3.0-alpha.3+sha.9595c40", + "version": "1.3.0-alpha.4+sha.7970416", "repository": { "type": "git", "url": "https://github.com/taye/interact.js.git"
- interact.debug()⚓➭ + interact.debug()⚓➭ @@ -2056,7 +2056,7 @@ interact.debug() - interact.supportsTouch()⚓➭ + interact.supportsTouch()⚓➭ @@ -2097,7 +2097,7 @@ interact.supportsTouch() - interact.supportsPointerEvent()⚓➭ + interact.supportsPointerEvent()⚓➭ @@ -2138,7 +2138,7 @@ interact.supportsPointerEvent() - interact.stop(event)⚓➭ + interact.stop(event)⚓➭ @@ -2198,7 +2198,7 @@ Parameters - interact.pointerMoveTolerance([newValue])⚓➭ + interact.pointerMoveTolerance([newValue])⚓➭ @@ -2261,7 +2261,7 @@ Parameters - Interaction.start(action, target, element)⚓➭ + Interaction.start(action, target, element)⚓➭ @@ -2356,7 +2356,7 @@ Parameters - Interaction.doMove()⚓➭ + Interaction.doMove()⚓➭ @@ -2403,7 +2403,7 @@ Interaction.doMove() - Interaction.end([event])⚓➭ + Interaction.end([event])⚓➭ diff --git a/dist/interact.js b/dist/interact.js index e8ae35c3b..c78a3c751 100644 --- a/dist/interact.js +++ b/dist/interact.js @@ -1,5 +1,5 @@ /** - * interact.js v1.3.0-alpha.3+sha.9595c40 + * interact.js v1.3.0-alpha.4+sha.7970416-dirty * * Copyright (c) 2012-2017 Taye Adeyemi * Open source under the MIT License. @@ -816,6 +816,7 @@ var scope = require('./scope'); var utils = require('./utils'); var events = require('./utils/events'); var browser = require('./utils/browser'); +var domObjects = require('./utils/domObjects'); var finder = require('./utils/interactionFinder'); var signals = require('./utils/Signals').new(); @@ -829,7 +830,9 @@ var prevTouchTime = 0; scope.interactions = []; var Interaction = function () { - function Interaction() { + function Interaction(_ref) { + var pointerType = _ref.pointerType; + _classCallCheck(this, Interaction); this.target = null; // current interactable being interacted with @@ -886,7 +889,7 @@ var Interaction = function () { this.pointerWasMoved = false; this._interacting = false; - this.mouse = false; + this.pointerType = pointerType; signals.fire('new', this); @@ -1130,6 +1133,11 @@ var Interaction = function () { }; Interaction.prototype.getPointerIndex = function getPointerIndex(pointer) { + // mouse and pen interactions may have only one pointer + if (this.pointerType === 'mouse' || this.pointerType === 'pen') { + return 0; + } + return utils.indexOf(this.pointerIds, utils.getPointerId(pointer)); }; @@ -1161,8 +1169,7 @@ var Interaction = function () { }; Interaction.prototype.removePointer = function removePointer(pointer, event) { - var id = utils.getPointerId(pointer); - var index = this.mouse ? 0 : utils.indexOf(this.pointerIds, id); + var index = this.getPointerIndex(pointer); if (index === -1) { return; @@ -1197,6 +1204,8 @@ for (var i = 0, len = methodNames.length; i < len; i++) { function doOnInteractions(method) { return function (event) { + var pointerType = utils.getPointerType(event); + var _utils$getEventTarget = utils.getEventTargets(event), eventTarget = _utils$getEventTarget[0], curEventTarget = _utils$getEventTarget[1]; @@ -1210,7 +1219,7 @@ function doOnInteractions(method) { var pointer = event.changedTouches[_i]; var interaction = finder.search(pointer, event.type, eventTarget); - matches.push([pointer, interaction || new Interaction()]); + matches.push([pointer, interaction || new Interaction({ pointerType: pointerType })]); } } else { var invalidPointer = false; @@ -1218,7 +1227,7 @@ function doOnInteractions(method) { if (!browser.supportsPointerEvent && /mouse/.test(event.type)) { // ignore mouse events while touch interactions are active for (var _i2 = 0; _i2 < scope.interactions.length && !invalidPointer; _i2++) { - invalidPointer = !scope.interactions[_i2].mouse && scope.interactions[_i2].pointerIsDown; + invalidPointer = scope.interactions[_i2].pointerType !== 'mouse' && scope.interactions[_i2].pointerIsDown; } // try to ignore mouse events that are simulated by the browser @@ -1232,11 +1241,7 @@ function doOnInteractions(method) { var _interaction = finder.search(event, event.type, eventTarget); if (!_interaction) { - - _interaction = new Interaction(); - _interaction.mouse = /mouse/i.test(event.pointerType || event.type) - // MSPointerEvent.MSPOINTER_TYPE_MOUSE - || event.pointerType === 4 || !event.pointerType; + _interaction = new Interaction({ pointerType: pointerType }); } matches.push([event, _interaction]); @@ -1244,20 +1249,20 @@ function doOnInteractions(method) { } for (var _iterator = matches, _isArray = Array.isArray(_iterator), _i3 = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { - var _ref; + var _ref2; if (_isArray) { if (_i3 >= _iterator.length) break; - _ref = _iterator[_i3++]; + _ref2 = _iterator[_i3++]; } else { _i3 = _iterator.next(); if (_i3.done) break; - _ref = _i3.value; + _ref2 = _i3.value; } - var _ref2 = _ref, - _pointer = _ref2[0], - _interaction2 = _ref2[1]; + var _ref3 = _ref2, + _pointer = _ref3[0], + _interaction2 = _ref3[1]; _interaction2._updateEventTargets(eventTarget, curEventTarget); _interaction2[method](_pointer, event, eventTarget, curEventTarget); @@ -1277,7 +1282,7 @@ function endAll(event) { var docEvents = {/* 'eventType': listenerFunc */}; var pEventTypes = browser.pEventTypes; -if (scope.PointerEvent) { +if (domObjects.PointerEvent) { docEvents[pEventTypes.down] = listeners.pointerDown; docEvents[pEventTypes.move] = listeners.pointerMove; docEvents[pEventTypes.up] = listeners.pointerUp; @@ -1295,8 +1300,8 @@ if (scope.PointerEvent) { docEvents.blur = endAll; -function onDocSignal(_ref3, signalName) { - var doc = _ref3.doc; +function onDocSignal(_ref4, signalName) { + var doc = _ref4.doc; var eventMethod = signalName.indexOf('add') === 0 ? events.add : events.remove; @@ -1311,14 +1316,14 @@ function onDocSignal(_ref3, signalName) { } } -signals.on('update-pointer-down', function (_ref4) { - var interaction = _ref4.interaction, - pointer = _ref4.pointer, - pointerId = _ref4.pointerId, - pointerIndex = _ref4.pointerIndex, - event = _ref4.event, - eventTarget = _ref4.eventTarget, - down = _ref4.down; +signals.on('update-pointer-down', function (_ref5) { + var interaction = _ref5.interaction, + pointer = _ref5.pointer, + pointerId = _ref5.pointerId, + pointerIndex = _ref5.pointerIndex, + event = _ref5.event, + eventTarget = _ref5.eventTarget, + down = _ref5.down; interaction.pointerIds[pointerIndex] = pointerId; interaction.pointers[pointerIndex] = pointer; @@ -1355,7 +1360,7 @@ scope.endAllInteractions = endAll; module.exports = Interaction; -},{"./scope":34,"./utils":44,"./utils/Signals":35,"./utils/browser":37,"./utils/events":40,"./utils/interactionFinder":45}],6:[function(require,module,exports){ +},{"./scope":34,"./utils":44,"./utils/Signals":35,"./utils/browser":37,"./utils/domObjects":38,"./utils/events":40,"./utils/interactionFinder":45}],6:[function(require,module,exports){ 'use strict'; var Interaction = require('../Interaction'); @@ -5460,7 +5465,7 @@ module.exports = function () { this.originalEvent = event; this.type = type; this.pointerId = pointerUtils.getPointerId(pointer); - this.pointerType = pointerUtils.getPointerType(pointer, interaction); + this.pointerType = pointerUtils.getPointerType(pointer); this.target = eventTarget; this.currentTarget = null; @@ -5758,8 +5763,10 @@ Interaction.signals.on('down', function (_ref6) { timer.duration = minDuration; timer.timeout = setTimeout(function () { fire({ - interaction: interaction, eventCopy: eventCopy, eventTarget: eventTarget, + interaction: interaction, + eventTarget: eventTarget, pointer: browser.isIE8 ? eventCopy : pointer, + event: eventCopy, type: 'hold' }); }, minDuration); @@ -6946,17 +6953,14 @@ module.exports = utils; var scope = require('../scope'); var utils = require('./index'); -var browser = require('./browser'); var finder = { - methodOrder: ['simulationResume', 'mouse', 'hasPointer', 'idle'], + methodOrder: ['simulationResume', 'mouseOrPen', 'hasPointer', 'idle'], search: function search(pointer, eventType, eventTarget) { - var mouseEvent = /mouse/i.test(pointer.pointerType || eventType) - // MSPointerEvent.MSPOINTER_TYPE_MOUSE - || pointer.pointerType === 4; + var pointerType = utils.getPointerType(pointer); var pointerId = utils.getPointerId(pointer); - var details = { pointer: pointer, pointerId: pointerId, mouseEvent: mouseEvent, eventType: eventType, eventTarget: eventTarget }; + var details = { pointer: pointer, pointerId: pointerId, pointerType: pointerType, eventType: eventType, eventTarget: eventTarget }; for (var _iterator = finder.methodOrder, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { var _ref; @@ -6982,7 +6986,7 @@ var finder = { // try to resume simulation with a new pointer simulationResume: function simulationResume(_ref2) { - var mouseEvent = _ref2.mouseEvent, + var pointerType = _ref2.pointerType, eventType = _ref2.eventType, eventTarget = _ref2.eventTarget; @@ -7006,7 +7010,7 @@ var finder = { var element = eventTarget; - if (interaction.simulation && interaction.simulation.allowResume && interaction.mouse === mouseEvent) { + if (interaction.simulation && interaction.simulation.allowResume && interaction.pointerType === pointerType) { while (element) { // if the element is the interaction element if (element === interaction.element) { @@ -7020,13 +7024,13 @@ var finder = { return null; }, - // if it's a mouse interaction - mouse: function mouse(_ref4) { + // if it's a mouse or pen interaction + mouseOrPen: function mouseOrPen(_ref4) { var pointerId = _ref4.pointerId, - mouseEvent = _ref4.mouseEvent, + pointerType = _ref4.pointerType, eventType = _ref4.eventType; - if (!mouseEvent && (browser.supportsTouch || browser.supportsPointerEvent)) { + if (pointerType !== 'mouse' && pointerType !== 'pen') { return null; } @@ -7046,7 +7050,7 @@ var finder = { var interaction = _ref5; - if (interaction.mouse) { + if (interaction.pointerType === pointerType) { // if it's a down event, skip interactions with running simulations if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; @@ -7069,8 +7073,8 @@ var finder = { return firstNonActive; } - // Find any interaction specifically for mouse. - // ignore the interaction if the eventType is a mousedown, and a simulation + // find any mouse or pen interaction. + // ignore the interaction if the eventType is a *down, and a simulation // is active for (var _iterator4 = scope.interactions, _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) { var _ref6; @@ -7086,7 +7090,7 @@ var finder = { var _interaction = _ref6; - if (_interaction.mouse && !(/down/.test(eventType) && _interaction.simulation)) { + if (_interaction.pointerType === pointerType && !(/down/i.test(eventType) && _interaction.simulation)) { return _interaction; } } @@ -7118,9 +7122,9 @@ var finder = { } }, - // get first idle interaction + // get first idle interaction with a matching pointerType idle: function idle(_ref9) { - var mouseEvent = _ref9.mouseEvent; + var pointerType = _ref9.pointerType; for (var _iterator6 = scope.interactions, _isArray6 = Array.isArray(_iterator6), _i6 = 0, _iterator6 = _isArray6 ? _iterator6 : _iterator6[Symbol.iterator]();;) { var _ref10; @@ -7150,7 +7154,7 @@ var finder = { continue; } - if (!interaction.interacting() && mouseEvent === interaction.mouse) { + if (!interaction.interacting() && pointerType === interaction.pointerType) { return interaction; } } @@ -7161,7 +7165,7 @@ var finder = { module.exports = finder; -},{"../scope":34,"./browser":37,"./index":44}],46:[function(require,module,exports){ +},{"../scope":34,"./index":44}],46:[function(require,module,exports){ 'use strict'; var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; @@ -7262,6 +7266,7 @@ var hypot = require('./hypot'); var browser = require('./browser'); var dom = require('./domObjects'); var domUtils = require('./domUtils'); +var domObjects = require('./domObjects'); var is = require('./is'); var pointerExtend = require('./pointerExtend'); @@ -7468,17 +7473,11 @@ var pointerUtils = { return angle; }, - getPointerType: function getPointerType(pointer, interaction) { - // if the PointerEvent API isn't available, then the pointer must be ither - // a MouseEvent or TouchEvent - if (interaction.mouse) { - return 'mouse'; - } - if (!browser.supportsPointerEvent) { - return 'touch'; - } - - return is.string(pointer.pointerType) ? pointer.pointerType : [undefined, undefined, 'touch', 'pen', 'mouse'][pointer.pointerType]; + getPointerType: function getPointerType(pointer) { + return is.string(pointer.pointerType) ? pointer.pointerType : is.number(pointer.pointerType) ? [undefined, undefined, 'touch', 'pen', 'mouse'][pointer.pointerType] + // if the PointerEvent API isn't available, then the "pointer" must + // be either a MouseEvent, TouchEvent, or Touch object + : /touch/.test(pointer.type) || pointer instanceof domObjects.Touch ? 'touch' : 'mouse'; }, // [ event.target, event.currentTarget ] diff --git a/dist/interact.js.map b/dist/interact.js.map index 60832b766..4f3a62ba8 100644 --- a/dist/interact.js.map +++ b/dist/interact.js.map @@ -1 +1 @@ -{"version":3,"sources":["src/header.js","node_modules/browser-pack/_prelude.js","index.js","src/Eventable.js","src/InteractEvent.js","src/Interactable.js","src/Interaction.js","src/actions/base.js","src/actions/drag.js","src/actions/drop.js","src/actions/gesture.js","src/actions/resize.js","src/autoScroll.js","src/autoStart/InteractableMethods.js","src/autoStart/base.js","src/autoStart/delay.js","src/autoStart/drag.js","src/autoStart/gesture.js","src/autoStart/resize.js","src/defaultOptions.js","src/index.js","src/inertia.js","src/interact.js","src/interactablePreventDefault.js","src/legacyBrowsers.js","src/modifiers/index.js","src/modifiers/restrict.js","src/modifiers/restrictEdges.js","src/modifiers/restrictSize.js","src/modifiers/snap.js","src/modifiers/snapSize.js","src/pointerEvents/PointerEvent.js","src/pointerEvents/base.js","src/pointerEvents/holdRepeat.js","src/pointerEvents/interactableTargets.js","src/scope.js","src/utils/Signals.js","src/utils/arr.js","src/utils/browser.js","src/utils/domObjects.js","src/utils/domUtils.js","src/utils/events.js","src/utils/extend.js","src/utils/getOriginXY.js","src/utils/hypot.js","src/utils/index.js","src/utils/interactionFinder.js","src/utils/is.js","src/utils/isWindow.js","src/utils/pointerExtend.js","src/utils/pointerUtils.js","src/utils/raf.js","src/utils/rect.js","src/utils/window.js"],"names":[],"mappings":"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","file":"interact.js","sourceRoot":"","sourcesContent":["/**\n * interact.js v1.3.0-alpha.3+sha.9595c40\n *\n * Copyright (c) 2012-2017 Taye Adeyemi \n * Open source under the MIT License.\n * https://raw.github.com/taye/interact.js/master/LICENSE\n */\n","(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o 150) {\n return null;\n }\n\n let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI;\n const overlap = 22.5;\n\n if (angle < 0) {\n angle += 360;\n }\n\n const left = 135 - overlap <= angle && angle < 225 + overlap;\n const up = 225 - overlap <= angle && angle < 315 + overlap;\n\n const right = !left && (315 - overlap <= angle || angle < 45 + overlap);\n const down = !up && 45 - overlap <= angle && angle < 135 + overlap;\n\n return {\n up,\n down,\n left,\n right,\n angle,\n speed: interaction.prevEvent.speed,\n velocity: {\n x: interaction.prevEvent.velocityX,\n y: interaction.prevEvent.velocityY,\n },\n };\n }\n\n preventDefault () {}\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n}\n\nsignals.on('set-delta', function ({ iEvent, interaction, starting, deltaSource }) {\n const prevEvent = starting? iEvent : interaction.prevEvent;\n\n if (deltaSource === 'client') {\n iEvent.dx = iEvent.clientX - prevEvent.clientX;\n iEvent.dy = iEvent.clientY - prevEvent.clientY;\n }\n else {\n iEvent.dx = iEvent.pageX - prevEvent.pageX;\n iEvent.dy = iEvent.pageY - prevEvent.pageY;\n }\n});\n\nInteractEvent.signals = signals;\n\nmodule.exports = InteractEvent;\n","const is = require('./utils/is');\nconst events = require('./utils/events');\nconst extend = require('./utils/extend');\nconst actions = require('./actions/base');\nconst scope = require('./scope');\nconst Eventable = require('./Eventable');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nconst {\n getElementRect,\n nodeContains,\n trySelector,\n} = require('./utils/domUtils');\nconst { getWindow } = require('./utils/window');\nconst { indexOf, contains } = require('./utils/arr');\nconst { wheelEvent } = require('./utils/browser');\n\n// all set interactables\nscope.interactables = [];\n\n/*\\\n * Interactable\n [ property ]\n **\n * Object type returned by @interact\n\\*/\nclass Interactable {\n constructor (target, options) {\n options = options || {};\n\n this.target = target;\n this.events = new Eventable();\n this._context = options.context || scope.document;\n this._win = getWindow(trySelector(target)? this._context : target);\n this._doc = this._win.document;\n\n signals.fire('new', {\n target,\n options,\n interactable: this,\n win: this._win,\n });\n\n scope.addDocument( this._doc, this._win );\n\n scope.interactables.push(this);\n\n this.set(options);\n }\n\n setOnEvents (action, phases) {\n const onAction = 'on' + action;\n\n if (is.function(phases.onstart) ) { this.events[onAction + 'start' ] = phases.onstart ; }\n if (is.function(phases.onmove) ) { this.events[onAction + 'move' ] = phases.onmove ; }\n if (is.function(phases.onend) ) { this.events[onAction + 'end' ] = phases.onend ; }\n if (is.function(phases.oninertiastart)) { this.events[onAction + 'inertiastart' ] = phases.oninertiastart ; }\n\n return this;\n }\n\n setPerAction (action, options) {\n // for all the default per-action options\n for (const option in options) {\n // if this option exists for this action\n if (option in defaults[action]) {\n // if the option in the options arg is an object value\n if (is.object(options[option])) {\n // duplicate the object\n this.options[action][option] = extend(this.options[action][option] || {}, options[option]);\n\n if (is.object(defaults.perAction[option]) && 'enabled' in defaults.perAction[option]) {\n this.options[action][option].enabled = options[option].enabled === false? false : true;\n }\n }\n else if (is.bool(options[option]) && is.object(defaults.perAction[option])) {\n this.options[action][option].enabled = options[option];\n }\n else if (options[option] !== undefined) {\n // or if it's not undefined, do a plain assignment\n this.options[action][option] = options[option];\n }\n }\n }\n }\n\n /*\\\n * Interactable.getRect\n [ method ]\n *\n * The default function to get an Interactables bounding rect. Can be\n * overridden using @Interactable.rectChecker.\n *\n - element (Element) #optional The element to measure.\n = (object) The object's bounding rectangle.\n o {\n o top : 0,\n o left : 0,\n o bottom: 0,\n o right : 0,\n o width : 0,\n o height: 0\n o }\n \\*/\n getRect (element) {\n element = element || this.target;\n\n if (is.string(this.target) && !(is.element(element))) {\n element = this._context.querySelector(this.target);\n }\n\n return getElementRect(element);\n }\n\n /*\\\n * Interactable.rectChecker\n [ method ]\n *\n * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n - checker (function) #optional A function which returns this Interactable's bounding rectangle. See @Interactable.getRect\n = (function | object) The checker function or this Interactable\n \\*/\n rectChecker (checker) {\n if (is.function(checker)) {\n this.getRect = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.getRect;\n\n return this;\n }\n\n return this.getRect;\n }\n\n _backCompatOption (optionName, newValue) {\n if (trySelector(newValue) || is.object(newValue)) {\n this.options[optionName] = newValue;\n\n for (const action of actions.names) {\n this.options[action][optionName] = newValue;\n }\n\n return this;\n }\n\n return this.options[optionName];\n }\n\n /*\\\n * Interactable.origin\n [ method ]\n *\n * Gets or sets the origin of the Interactable's element. The x and y\n * of the origin will be subtracted from action event coordinates.\n *\n - origin (object | string) #optional An object eg. { x: 0, y: 0 } or string 'parent', 'self' or any CSS selector\n * OR\n - origin (Element) #optional An HTML or SVG Element whose rect will be used\n **\n = (object) The current origin or this Interactable\n \\*/\n origin (newValue) {\n return this._backCompatOption('origin', newValue);\n }\n\n /*\\\n * Interactable.deltaSource\n [ method ]\n *\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n - newValue (string) #optional Use 'client' if you will be scrolling while interacting; Use 'page' if you want autoScroll to work\n = (string | object) The current deltaSource or this Interactable\n \\*/\n deltaSource (newValue) {\n if (newValue === 'page' || newValue === 'client') {\n this.options.deltaSource = newValue;\n\n return this;\n }\n\n return this.options.deltaSource;\n }\n\n /*\\\n * Interactable.context\n [ method ]\n *\n * Gets the selector context Node of the Interactable. The default is `window.document`.\n *\n = (Node) The context Node of this Interactable\n **\n \\*/\n context () {\n return this._context;\n }\n\n inContext (element) {\n return (this._context === element.ownerDocument\n || nodeContains(this._context, element));\n }\n\n /*\\\n * Interactable.fire\n [ method ]\n *\n * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n - iEvent (InteractEvent) The InteractEvent object to be fired on this Interactable\n = (Interactable) this Interactable\n \\*/\n fire (iEvent) {\n this.events.fire(iEvent);\n\n return this;\n }\n\n _onOffMultiple (method, eventType, listener, options) {\n if (is.string(eventType) && eventType.search(' ') !== -1) {\n eventType = eventType.trim().split(/ +/);\n }\n\n if (is.array(eventType)) {\n for (let i = 0; i < eventType.length; i++) {\n this[method](eventType[i], listener, options);\n }\n\n return true;\n }\n\n if (is.object(eventType)) {\n for (const prop in eventType) {\n this[method](prop, eventType[prop], listener);\n }\n\n return true;\n }\n }\n\n /*\\\n * Interactable.on\n [ method ]\n *\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n - eventType (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) This Interactable\n \\*/\n on (eventType, listener, options) {\n if (this._onOffMultiple('on', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.on(eventType, listener);\n }\n // delegated event for selector\n else if (is.string(this.target)) {\n events.addDelegate(this.target, this._context, eventType, listener, options);\n }\n else {\n events.add(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.off\n [ method ]\n *\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n - eventType (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) This Interactable\n \\*/\n off (eventType, listener, options) {\n if (this._onOffMultiple('off', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n // if it is an action event type\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.off(eventType, listener);\n }\n // delegated event\n else if (is.string(this.target)) {\n events.removeDelegate(this.target, this._context, eventType, listener, options);\n }\n // remove listener from this Interatable's element\n else {\n events.remove(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.set\n [ method ]\n *\n * Reset the options of this Interactable\n - options (object) The new settings to apply\n = (object) This Interactable\n \\*/\n set (options) {\n if (!is.object(options)) {\n options = {};\n }\n\n this.options = extend({}, defaults.base);\n\n const perActions = extend({}, defaults.perAction);\n\n for (const actionName in actions.methodDict) {\n const methodName = actions.methodDict[actionName];\n\n this.options[actionName] = extend({}, defaults[actionName]);\n\n this.setPerAction(actionName, perActions);\n\n this[methodName](options[actionName]);\n }\n\n for (const setting of Interactable.settingsMethods) {\n this.options[setting] = defaults.base[setting];\n\n if (setting in options) {\n this[setting](options[setting]);\n }\n }\n\n signals.fire('set', {\n options,\n interactable: this,\n });\n\n return this;\n }\n\n /*\\\n * Interactable.unset\n [ method ]\n *\n * Remove this interactable from the list of interactables and remove\n * it's action capabilities and event listeners\n *\n = (object) @interact\n \\*/\n unset () {\n events.remove(this.target, 'all');\n\n if (is.string(this.target)) {\n // remove delegated events\n for (const type in events.delegatedEvents) {\n const delegated = events.delegatedEvents[type];\n\n if (delegated.selectors[0] === this.target\n && delegated.contexts[0] === this._context) {\n\n delegated.selectors.splice(0, 1);\n delegated.contexts .splice(0, 1);\n delegated.listeners.splice(0, 1);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegated[type] = null;\n }\n }\n\n events.remove(this._context, type, events.delegateListener);\n events.remove(this._context, type, events.delegateUseCapture, true);\n }\n }\n else {\n events.remove(this, 'all');\n }\n\n signals.fire('unset', { interactable: this });\n\n scope.interactables.splice(indexOf(scope.interactables, this), 1);\n\n // Stop related interactions when an Interactable is unset\n for (const interaction of scope.interactions || []) {\n if (interaction.target === this && interaction.interacting()) {\n interaction.stop();\n }\n }\n\n return scope.interact;\n }\n}\n\nscope.interactables.indexOfElement = function indexOfElement (target, context) {\n context = context || scope.document;\n\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n if (interactable.target === target && interactable._context === context) {\n return i;\n }\n }\n return -1;\n};\n\nscope.interactables.get = function interactableGet (element, options, dontCheckInContext) {\n const ret = this[this.indexOfElement(element, options && options.context)];\n\n return ret && (is.string(element) || dontCheckInContext || ret.inContext(element))? ret : null;\n};\n\nscope.interactables.forEachSelector = function (callback, element) {\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n // skip non CSS selector targets and out of context elements\n if (!is.string(interactable.target)\n || (element && !interactable.inContext(element))) {\n continue;\n }\n\n const ret = callback(interactable, interactable.target, interactable._context, i, this);\n\n if (ret !== undefined) {\n return ret;\n }\n }\n};\n\n// all interact.js eventTypes\nInteractable.eventTypes = scope.eventTypes = [];\n\nInteractable.signals = signals;\n\nInteractable.settingsMethods = [ 'deltaSource', 'origin', 'preventDefault', 'rectChecker' ];\n\nmodule.exports = Interactable;\n","const scope = require('./scope');\nconst utils = require('./utils');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst finder = require('./utils/interactionFinder');\nconst signals = require('./utils/Signals').new();\n\nconst listeners = {};\nconst methodNames = [\n 'pointerDown', 'pointerMove', 'pointerUp',\n 'updatePointer', 'removePointer',\n];\n\n// for ignoring browser's simulated mouse events\nlet prevTouchTime = 0;\n\n// all active and idle interactions\nscope.interactions = [];\n\nclass Interaction {\n constructor () {\n this.target = null; // current interactable being interacted with\n this.element = null; // the target element of the interactable\n\n this.prepared = { // action that's ready to be fired on next move event\n name : null,\n axis : null,\n edges: null,\n };\n\n // keep track of added pointers\n this.pointers = [];\n this.pointerIds = [];\n this.downTargets = [];\n this.downTimes = [];\n\n // Previous native pointer move event coordinates\n this.prevCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n // current native pointer move event coordinates\n this.curCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Starting InteractEvent pointer coordinates\n this.startCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Change in coordinates and time of the pointer\n this.pointerDelta = {\n page : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n client : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n timeStamp: 0,\n };\n\n this.downEvent = null; // pointerdown/mousedown/touchstart event\n this.downPointer = {};\n\n this._eventTarget = null;\n this._curEventTarget = null;\n\n this.prevEvent = null; // previous action event\n\n this.pointerIsDown = false;\n this.pointerWasMoved = false;\n this._interacting = false;\n\n this.mouse = false;\n\n signals.fire('new', this);\n\n scope.interactions.push(this);\n }\n\n pointerDown (pointer, event, eventTarget) {\n const pointerIndex = this.updatePointer(pointer, event, true);\n\n signals.fire('down', {\n pointer,\n event,\n eventTarget,\n pointerIndex,\n interaction: this,\n });\n }\n\n /*\\\n * Interaction.start\n [ method ]\n *\n * Start an action with the given Interactable and Element as tartgets. The\n * action must be enabled for the target Interactable and an appropriate number\n * of pointers must be held down - 1 for drag/resize, 2 for gesture.\n *\n * Use it with `interactable.able({ manualStart: false })` to always\n * [start actions manually](https://github.com/taye/interact.js/issues/114)\n *\n - action (object) The action to be performed - drag, resize, etc.\n - target (Interactable) The Interactable to target\n - element (Element) The DOM Element to target\n = (object) interact\n **\n | interact(target)\n | .draggable({\n | // disable the default drag start by down->move\n | manualStart: true\n | })\n | // start dragging after the user holds the pointer down\n | .on('hold', function (event) {\n | var interaction = event.interaction;\n |\n | if (!interaction.interacting()) {\n | interaction.start({ name: 'drag' },\n | event.interactable,\n | event.currentTarget);\n | }\n | });\n \\*/\n start (action, target, element) {\n if (this.interacting()\n || !this.pointerIsDown\n || this.pointerIds.length < (action.name === 'gesture'? 2 : 1)) {\n return;\n }\n\n // if this interaction had been removed after stopping\n // add it back\n if (utils.indexOf(scope.interactions, this) === -1) {\n scope.interactions.push(this);\n }\n\n utils.copyAction(this.prepared, action);\n this.target = target;\n this.element = element;\n\n signals.fire('action-start', {\n interaction: this,\n event: this.downEvent,\n });\n }\n\n pointerMove (pointer, event, eventTarget) {\n if (!this.simulation) {\n this.updatePointer(pointer);\n utils.setCoords(this.curCoords, this.pointers);\n }\n\n const duplicateMove = (this.curCoords.page.x === this.prevCoords.page.x\n && this.curCoords.page.y === this.prevCoords.page.y\n && this.curCoords.client.x === this.prevCoords.client.x\n && this.curCoords.client.y === this.prevCoords.client.y);\n\n let dx;\n let dy;\n\n // register movement greater than pointerMoveTolerance\n if (this.pointerIsDown && !this.pointerWasMoved) {\n dx = this.curCoords.client.x - this.startCoords.client.x;\n dy = this.curCoords.client.y - this.startCoords.client.y;\n\n this.pointerWasMoved = utils.hypot(dx, dy) > Interaction.pointerMoveTolerance;\n }\n\n const signalArg = {\n pointer,\n pointerIndex: this.getPointerIndex(pointer),\n event,\n eventTarget,\n dx,\n dy,\n duplicate: duplicateMove,\n interaction: this,\n interactingBeforeMove: this.interacting(),\n };\n\n if (!duplicateMove) {\n // set pointer coordinate, time changes and speeds\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n }\n\n signals.fire('move', signalArg);\n\n if (!duplicateMove) {\n // if interacting, fire an 'action-move' signal etc\n if (this.interacting()) {\n this.doMove(signalArg);\n }\n\n if (this.pointerWasMoved) {\n utils.copyCoords(this.prevCoords, this.curCoords);\n }\n }\n }\n\n /*\\\n * Interaction.doMove\n [ method ]\n *\n * Force a move of the current action at the same coordinates. Useful if\n * snap/restrict has been changed and you want a movement with the new\n * settings.\n *\n **\n | interact(target)\n | .draggable(true)\n | .on('dragmove', function (event) {\n | if (someCondition) {\n | // change the snap settings\n | event.interactable.draggable({ snap: { targets: [] }});\n | // fire another move event with re-calculated snap\n | event.interaction.doMove();\n | }\n | });\n \\*/\n doMove (signalArg) {\n signalArg = utils.extend({\n pointer: this.pointers[0],\n event: this.prevEvent,\n eventTarget: this._eventTarget,\n interaction: this,\n }, signalArg || {});\n\n signals.fire('before-action-move', signalArg);\n\n if (!this._dontFireMove) {\n signals.fire('action-move', signalArg);\n }\n\n this._dontFireMove = false;\n }\n\n // End interact move events and stop auto-scroll unless simulation is running\n pointerUp (pointer, event, eventTarget, curEventTarget) {\n const pointerIndex = this.getPointerIndex(pointer);\n\n signals.fire(/cancel$/i.test(event.type)? 'cancel' : 'up', {\n pointer,\n pointerIndex,\n event,\n eventTarget,\n curEventTarget,\n interaction: this,\n });\n\n if (!this.simulation) {\n this.end(event);\n }\n\n this.pointerIsDown = false;\n this.removePointer(pointer, event);\n }\n\n /*\\\n * Interaction.end\n [ method ]\n *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n - event (PointerEvent) #optional\n **\n | interact(target)\n | .draggable(true)\n | .on('move', function (event) {\n | if (event.pageX > 1000) {\n | // end the current action\n | event.interaction.end();\n | // stop all further listeners from being called\n | event.stopImmediatePropagation();\n | }\n | });\n \\*/\n end (event) {\n event = event || this.prevEvent;\n\n if (this.interacting()) {\n signals.fire('action-end', {\n event,\n interaction: this,\n });\n }\n\n this.stop();\n }\n\n currentAction () {\n return this._interacting? this.prepared.name: null;\n }\n\n interacting () {\n return this._interacting;\n }\n\n stop () {\n signals.fire('stop', { interaction: this });\n\n if (this._interacting) {\n signals.fire('stop-active', { interaction: this });\n signals.fire('stop-' + this.prepared.name, { interaction: this });\n }\n\n this.target = this.element = null;\n\n this._interacting = false;\n this.prepared.name = this.prevEvent = null;\n }\n\n getPointerIndex (pointer) {\n return utils.indexOf(this.pointerIds, utils.getPointerId(pointer));\n }\n\n updatePointer (pointer, event, down = event && /(down|start)$/i.test(event.type)) {\n const id = utils.getPointerId(pointer);\n let index = this.getPointerIndex(pointer);\n\n if (index === -1) {\n index = this.pointerIds.length;\n this.pointerIds[index] = id;\n }\n\n if (down) {\n signals.fire('update-pointer-down', {\n pointer,\n event,\n down,\n pointerId: id,\n pointerIndex: index,\n interaction: this,\n });\n }\n\n this.pointers[index] = pointer;\n\n return index;\n }\n\n removePointer (pointer, event) {\n const id = utils.getPointerId(pointer);\n const index = this.mouse? 0 : utils.indexOf(this.pointerIds, id);\n\n if (index === -1) { return; }\n\n signals.fire('remove-pointer', {\n pointer,\n event,\n pointerIndex: index,\n interaction: this,\n });\n\n this.pointers .splice(index, 1);\n this.pointerIds .splice(index, 1);\n this.downTargets.splice(index, 1);\n this.downTimes .splice(index, 1);\n }\n\n _updateEventTargets (target, currentTarget) {\n this._eventTarget = target;\n this._curEventTarget = currentTarget;\n }\n}\n\nfor (let i = 0, len = methodNames.length; i < len; i++) {\n const method = methodNames[i];\n\n listeners[method] = doOnInteractions(method);\n}\n\nfunction doOnInteractions (method) {\n return (function (event) {\n const [eventTarget, curEventTarget] = utils.getEventTargets(event);\n const matches = []; // [ [pointer, interaction], ...]\n\n if (browser.supportsTouch && /touch/.test(event.type)) {\n prevTouchTime = new Date().getTime();\n\n for (let i = 0; i < event.changedTouches.length; i++) {\n const pointer = event.changedTouches[i];\n const interaction = finder.search(pointer, event.type, eventTarget);\n\n matches.push([pointer, interaction || new Interaction()]);\n }\n }\n else {\n let invalidPointer = false;\n\n if (!browser.supportsPointerEvent && /mouse/.test(event.type)) {\n // ignore mouse events while touch interactions are active\n for (let i = 0; i < scope.interactions.length && !invalidPointer; i++) {\n invalidPointer = !scope.interactions[i].mouse && scope.interactions[i].pointerIsDown;\n }\n\n // try to ignore mouse events that are simulated by the browser\n // after a touch event\n invalidPointer = invalidPointer\n || (new Date().getTime() - prevTouchTime < 500)\n // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated\n || event.timeStamp === 0;\n }\n\n if (!invalidPointer) {\n let interaction = finder.search(event, event.type, eventTarget);\n\n if (!interaction) {\n\n interaction = new Interaction();\n interaction.mouse = (/mouse/i.test(event.pointerType || event.type)\n // MSPointerEvent.MSPOINTER_TYPE_MOUSE\n || event.pointerType === 4\n || !event.pointerType);\n }\n\n matches.push([event, interaction]);\n }\n }\n\n for (const [pointer, interaction] of matches) {\n interaction._updateEventTargets(eventTarget, curEventTarget);\n interaction[method](pointer, event, eventTarget, curEventTarget);\n }\n });\n}\n\nfunction endAll (event) {\n for (let i = 0; i < scope.interactions.length; i++) {\n const interaction = scope.interactions[i];\n\n interaction.end(event);\n signals.fire('endall', { event, interaction });\n }\n}\n\nconst docEvents = { /* 'eventType': listenerFunc */ };\nconst pEventTypes = browser.pEventTypes;\n\nif (scope.PointerEvent) {\n docEvents[pEventTypes.down ] = listeners.pointerDown;\n docEvents[pEventTypes.move ] = listeners.pointerMove;\n docEvents[pEventTypes.up ] = listeners.pointerUp;\n docEvents[pEventTypes.cancel] = listeners.pointerUp;\n}\nelse {\n docEvents.mousedown = listeners.pointerDown;\n docEvents.mousemove = listeners.pointerMove;\n docEvents.mouseup = listeners.pointerUp;\n\n docEvents.touchstart = listeners.pointerDown;\n docEvents.touchmove = listeners.pointerMove;\n docEvents.touchend = listeners.pointerUp;\n docEvents.touchcancel = listeners.pointerUp;\n}\n\ndocEvents.blur = endAll;\n\nfunction onDocSignal ({ doc }, signalName) {\n const eventMethod = signalName.indexOf('add') === 0\n ? events.add : events.remove;\n\n // delegate event listener\n for (const eventType in scope.delegatedEvents) {\n eventMethod(doc, eventType, events.delegateListener);\n eventMethod(doc, eventType, events.delegateUseCapture, true);\n }\n\n for (const eventType in docEvents) {\n eventMethod(doc, eventType, docEvents[eventType]);\n }\n}\n\nsignals.on('update-pointer-down', ({ interaction, pointer, pointerId, pointerIndex, event, eventTarget, down }) => {\n interaction.pointerIds[pointerIndex] = pointerId;\n interaction.pointers[pointerIndex] = pointer;\n\n if (down) {\n interaction.pointerIsDown = true;\n }\n\n if (!interaction.interacting()) {\n utils.setCoords(interaction.startCoords, interaction.pointers);\n\n utils.copyCoords(interaction.curCoords , interaction.startCoords);\n utils.copyCoords(interaction.prevCoords, interaction.startCoords);\n\n interaction.downEvent = event;\n interaction.downTimes[pointerIndex] = interaction.curCoords.timeStamp;\n interaction.downTargets[pointerIndex] = eventTarget || event && utils.getEventTargets(event)[0];\n interaction.pointerWasMoved = false;\n\n utils.pointerExtend(interaction.downPointer, pointer);\n }\n});\n\nscope.signals.on('add-document' , onDocSignal);\nscope.signals.on('remove-document', onDocSignal);\n\nInteraction.pointerMoveTolerance = 1;\nInteraction.doOnInteractions = doOnInteractions;\nInteraction.endAll = endAll;\nInteraction.signals = signals;\nInteraction.docEvents = docEvents;\n\nscope.endAllInteractions = endAll;\n\nmodule.exports = Interaction;\n","const Interaction = require('../Interaction');\nconst InteractEvent = require('../InteractEvent');\n\nconst actions = {\n firePrepared,\n names: [],\n methodDict: {},\n};\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n interaction._interacting = true;\n firePrepared(interaction, event, 'start');\n});\n\nInteraction.signals.on('action-move', function ({ interaction, event, preEnd }) {\n firePrepared(interaction, event, 'move', preEnd);\n\n // if the action was ended in a listener\n if (!interaction.interacting()) { return false; }\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n firePrepared(interaction, event, 'end');\n});\n\nfunction firePrepared (interaction, event, phase, preEnd) {\n const actionName = interaction.prepared.name;\n\n const newEvent = new InteractEvent(interaction, event, actionName, phase, interaction.element, null, preEnd);\n\n interaction.target.fire(newEvent);\n interaction.prevEvent = newEvent;\n}\n\nmodule.exports = actions;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drag = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n startAxis : 'xy',\n lockAxis : 'xy',\n },\n\n checker: function (pointer, event, interactable) {\n const dragOptions = interactable.options.drag;\n\n return dragOptions.enabled\n ? { name: 'drag', axis: (dragOptions.lockAxis === 'start'\n ? dragOptions.startAxis\n : dragOptions.lockAxis)}\n : null;\n },\n\n getCursor: function () {\n return 'move';\n },\n};\n\nInteraction.signals.on('before-action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n interaction.curCoords.page.y = interaction.startCoords.page.y;\n interaction.curCoords.client.y = interaction.startCoords.client.y;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vx);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vx);\n interaction.pointerDelta.client.vy = 0;\n interaction.pointerDelta.page.vy = 0;\n }\n else if (axis === 'y') {\n interaction.curCoords.page.x = interaction.startCoords.page.x;\n interaction.curCoords.client.x = interaction.startCoords.client.x;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vy);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vy);\n interaction.pointerDelta.client.vx = 0;\n interaction.pointerDelta.page.vx = 0;\n }\n});\n\n// dragmove\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'dragmove') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n iEvent.pageY = interaction.startCoords.page.y;\n iEvent.clientY = interaction.startCoords.client.y;\n iEvent.dy = 0;\n }\n else if (axis === 'y') {\n iEvent.pageX = interaction.startCoords.page.x;\n iEvent.clientX = interaction.startCoords.client.x;\n iEvent.dx = 0;\n }\n});\n\n/*\\\n * Interactable.draggable\n [ method ]\n *\n * Gets or sets whether drag actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of drag events\n | var isDraggable = interact('ul li').draggable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on drag events (object makes the Interactable draggable)\n = (object) This Interactable\n | interact(element).draggable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // the axis in which the first movement must be\n | // for the drag sequence to start\n | // 'xy' by default - any direction\n | startAxis: 'x' || 'y' || 'xy',\n |\n | // 'xy' by default - don't restrict to one axis (move in any direction)\n | // 'x' or 'y' to restrict movement to either axis\n | // 'start' to restrict movement to the axis the drag started in\n | lockAxis: 'x' || 'y' || 'xy' || 'start',\n |\n | // max number of drags that can happen concurrently\n | // with elements of this Interactable. Infinity by default\n | max: Infinity,\n |\n | // max number of drags that can target the same element+Interactable\n | // 1 by default\n | maxPerElement: 2\n | });\n\\*/\nInteractable.prototype.draggable = function (options) {\n if (utils.is.object(options)) {\n this.options.drag.enabled = options.enabled === false? false: true;\n this.setPerAction('drag', options);\n this.setOnEvents('drag', options);\n\n if (/^(xy|x|y|start)$/.test(options.lockAxis)) {\n this.options.drag.lockAxis = options.lockAxis;\n }\n if (/^(xy|x|y)$/.test(options.startAxis)) {\n this.options.drag.startAxis = options.startAxis;\n }\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drag.enabled = options;\n\n if (!options) {\n this.ondragstart = this.ondragstart = this.ondragend = null;\n }\n\n return this;\n }\n\n return this.options.drag;\n};\n\nactions.drag = drag;\nactions.names.push('drag');\nutils.merge(Interactable.eventTypes, [\n 'dragstart',\n 'dragmove',\n 'draginertiastart',\n 'draginertiaresume',\n 'dragend',\n]);\nactions.methodDict.drag = 'draggable';\n\ndefaultOptions.drag = drag.defaults;\n\nmodule.exports = drag;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst scope = require('../scope');\nconst interact = require('../interact');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drop = {\n defaults: {\n enabled: false,\n accept : null,\n overlap: 'pointer',\n },\n};\n\nlet dynamicDrop = false;\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // reset active dropzones\n interaction.activeDrops.dropzones = [];\n interaction.activeDrops.elements = [];\n interaction.activeDrops.rects = [];\n\n interaction.dropEvents = null;\n\n if (!interaction.dynamicDrop) {\n setActiveDrops(interaction, interaction.element);\n }\n\n const dragEvent = interaction.prevEvent;\n const dropEvents = getDropEvents(interaction, event, dragEvent);\n\n if (dropEvents.activate) {\n fireActiveDrops(interaction, dropEvents.activate);\n }\n});\n\nInteractEvent.signals.on('new', function ({ interaction, iEvent, event }) {\n if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { return; }\n\n const draggableElement = interaction.element;\n const dragEvent = iEvent;\n const dropResult = getDrop(dragEvent, event, draggableElement);\n\n interaction.dropTarget = dropResult.dropzone;\n interaction.dropElement = dropResult.element;\n\n interaction.dropEvents = getDropEvents(interaction, event, dragEvent);\n});\n\nInteraction.signals.on('action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n fireDropEvents(interaction, interaction.dropEvents);\n});\n\nInteraction.signals.on('action-end', function ({ interaction }) {\n if (interaction.prepared.name === 'drag') {\n fireDropEvents(interaction, interaction.dropEvents);\n }\n});\n\nInteraction.signals.on('stop-drag', function ({ interaction }) {\n interaction.activeDrops.dropzones =\n interaction.activeDrops.elements =\n interaction.activeDrops.rects =\n interaction.dropEvents = null;\n});\n\nfunction collectDrops (interaction, element) {\n const drops = [];\n const elements = [];\n\n element = element || interaction.element;\n\n // collect all dropzones and their elements which qualify for a drop\n for (const current of scope.interactables) {\n if (!current.options.drop.enabled) { continue; }\n\n const accept = current.options.drop.accept;\n\n // test the draggable element against the dropzone's accept setting\n if ((utils.is.element(accept) && accept !== element)\n || (utils.is.string(accept)\n && !utils.matchesSelector(element, accept))) {\n\n continue;\n }\n\n // query for new elements if necessary\n const dropElements = utils.is.string(current.target)\n ? current._context.querySelectorAll(current.target)\n : [current.target];\n\n for (let i = 0; i < dropElements.length; i++) {\n const currentElement = dropElements[i];\n\n if (currentElement !== element) {\n drops.push(current);\n elements.push(currentElement);\n }\n }\n }\n\n return {\n elements,\n dropzones: drops,\n };\n}\n\nfunction fireActiveDrops (interaction, event) {\n let prevElement;\n\n // loop through all active dropzones and trigger event\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n const current = interaction.activeDrops.dropzones[i];\n const currentElement = interaction.activeDrops.elements [i];\n\n // prevent trigger of duplicate events on same element\n if (currentElement !== prevElement) {\n // set current element as event target\n event.target = currentElement;\n current.fire(event);\n }\n prevElement = currentElement;\n }\n}\n\n// Collect a new set of possible drops and save them in activeDrops.\n// setActiveDrops should always be called when a drag has just started or a\n// drag event happens while dynamicDrop is true\nfunction setActiveDrops (interaction, dragElement) {\n // get dropzones and their elements that could receive the draggable\n const possibleDrops = collectDrops(interaction, dragElement, true);\n\n interaction.activeDrops.dropzones = possibleDrops.dropzones;\n interaction.activeDrops.elements = possibleDrops.elements;\n interaction.activeDrops.rects = [];\n\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n interaction.activeDrops.rects[i] =\n interaction.activeDrops.dropzones[i].getRect(interaction.activeDrops.elements[i]);\n }\n}\n\nfunction getDrop (dragEvent, event, dragElement) {\n const interaction = dragEvent.interaction;\n const validDrops = [];\n\n if (dynamicDrop) {\n setActiveDrops(interaction, dragElement);\n }\n\n // collect all dropzones and their elements which qualify for a drop\n for (let j = 0; j < interaction.activeDrops.dropzones.length; j++) {\n const current = interaction.activeDrops.dropzones[j];\n const currentElement = interaction.activeDrops.elements [j];\n const rect = interaction.activeDrops.rects [j];\n\n validDrops.push(current.dropCheck(dragEvent, event, interaction.target, dragElement, currentElement, rect)\n ? currentElement\n : null);\n }\n\n // get the most appropriate dropzone based on DOM depth and order\n const dropIndex = utils.indexOfDeepestElement(validDrops);\n\n return {\n dropzone: interaction.activeDrops.dropzones[dropIndex] || null,\n element : interaction.activeDrops.elements [dropIndex] || null,\n };\n}\n\nfunction getDropEvents (interaction, pointerEvent, dragEvent) {\n const dropEvents = {\n enter : null,\n leave : null,\n activate : null,\n deactivate: null,\n move : null,\n drop : null,\n };\n\n const tmpl = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n };\n\n if (interaction.dropElement !== interaction.prevDropElement) {\n // if there was a prevDropTarget, create a dragleave event\n if (interaction.prevDropTarget) {\n dropEvents.leave = utils.extend({ type: 'dragleave' }, tmpl);\n\n dragEvent.dragLeave = dropEvents.leave.target = interaction.prevDropElement;\n dragEvent.prevDropzone = dropEvents.leave.dropzone = interaction.prevDropTarget;\n }\n // if the dropTarget is not null, create a dragenter event\n if (interaction.dropTarget) {\n dropEvents.enter = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n type : 'dragenter',\n };\n\n dragEvent.dragEnter = interaction.dropElement;\n dragEvent.dropzone = interaction.dropTarget;\n }\n }\n\n if (dragEvent.type === 'dragend' && interaction.dropTarget) {\n dropEvents.drop = utils.extend({ type: 'drop' }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n dragEvent.relatedTarget = interaction.dropElement;\n }\n if (dragEvent.type === 'dragstart') {\n dropEvents.activate = utils.extend({ type: 'dropactivate' }, tmpl);\n\n dropEvents.activate.target = null;\n dropEvents.activate.dropzone = null;\n }\n if (dragEvent.type === 'dragend') {\n dropEvents.deactivate = utils.extend({ type: 'dropdeactivate' }, tmpl);\n\n dropEvents.deactivate.target = null;\n dropEvents.deactivate.dropzone = null;\n }\n if (dragEvent.type === 'dragmove' && interaction.dropTarget) {\n dropEvents.move = utils.extend({\n dragmove : dragEvent,\n type : 'dropmove',\n }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n }\n\n return dropEvents;\n}\n\nfunction fireDropEvents (interaction, dropEvents) {\n if (dropEvents.leave) { interaction.prevDropTarget.fire(dropEvents.leave); }\n if (dropEvents.move ) { interaction.dropTarget.fire(dropEvents.move ); }\n if (dropEvents.enter) { interaction.dropTarget.fire(dropEvents.enter); }\n if (dropEvents.drop ) { interaction.dropTarget.fire(dropEvents.drop ); }\n if (dropEvents.deactivate) {\n fireActiveDrops(interaction, dropEvents.deactivate);\n }\n\n interaction.prevDropTarget = interaction.dropTarget;\n interaction.prevDropElement = interaction.dropElement;\n}\n\n/*\\\n * Interactable.dropzone\n [ method ]\n *\n * Returns or sets whether elements can be dropped onto this\n * Interactable to trigger drop events\n *\n * Dropzones can receive the following events:\n * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends\n * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone\n * - `dragmove` when a draggable that has entered the dropzone is moved\n * - `drop` when a draggable is dropped into this dropzone\n *\n * Use the `accept` option to allow only elements that match the given CSS\n * selector or element. The value can be:\n *\n * - **an Element** - only that element can be dropped into this dropzone.\n * - **a string**, - the element being dragged must match it as a CSS selector.\n * - **`null`** - accept options is cleared - it accepts any element.\n *\n * Use the `overlap` option to set how drops are checked for. The allowed\n * values are:\n *\n * - `'pointer'`, the pointer must be over the dropzone (default)\n * - `'center'`, the draggable element's center must be over the dropzone\n * - a number from 0-1 which is the `(intersection area) / (draggable area)`.\n * e.g. `0.5` for drop to happen when half of the area of the draggable is\n * over the dropzone\n *\n * Use the `checker` option to specify a function to check if a dragged\n * element is over this Interactable.\n *\n | interact(target)\n | .dropChecker(function(dragEvent, // related dragmove or dragend event\n | event, // TouchEvent/PointerEvent/MouseEvent\n | dropped, // bool result of the default checker\n | dropzone, // dropzone Interactable\n | dropElement, // dropzone elemnt\n | draggable, // draggable Interactable\n | draggableElement) {// draggable element\n |\n | return dropped && event.target.hasAttribute('allow-drop');\n | }\n *\n *\n - options (boolean | object | null) #optional The new value to be set.\n | interact('.drop').dropzone({\n | accept: '.can-drop' || document.getElementById('single-drop'),\n | overlap: 'pointer' || 'center' || zeroToOne\n | }\n = (boolean | object) The current setting or this Interactable\n\\*/\nInteractable.prototype.dropzone = function (options) {\n if (utils.is.object(options)) {\n this.options.drop.enabled = options.enabled === false? false: true;\n\n if (utils.is.function(options.ondrop) ) { this.events.ondrop = options.ondrop ; }\n if (utils.is.function(options.ondropactivate) ) { this.events.ondropactivate = options.ondropactivate ; }\n if (utils.is.function(options.ondropdeactivate)) { this.events.ondropdeactivate = options.ondropdeactivate; }\n if (utils.is.function(options.ondragenter) ) { this.events.ondragenter = options.ondragenter ; }\n if (utils.is.function(options.ondragleave) ) { this.events.ondragleave = options.ondragleave ; }\n if (utils.is.function(options.ondropmove) ) { this.events.ondropmove = options.ondropmove ; }\n\n if (/^(pointer|center)$/.test(options.overlap)) {\n this.options.drop.overlap = options.overlap;\n }\n else if (utils.is.number(options.overlap)) {\n this.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0);\n }\n if ('accept' in options) {\n this.options.drop.accept = options.accept;\n }\n if ('checker' in options) {\n this.options.drop.checker = options.checker;\n }\n\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drop.enabled = options;\n\n if (!options) {\n this.ondragenter = this.ondragleave = this.ondrop\n = this.ondropactivate = this.ondropdeactivate = null;\n }\n\n return this;\n }\n\n return this.options.drop;\n};\n\nInteractable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) {\n let dropped = false;\n\n // if the dropzone has no rect (eg. display: none)\n // call the custom dropChecker or just return false\n if (!(rect = rect || this.getRect(dropElement))) {\n return (this.options.drop.checker\n ? this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement)\n : false);\n }\n\n const dropOverlap = this.options.drop.overlap;\n\n if (dropOverlap === 'pointer') {\n const origin = utils.getOriginXY(draggable, draggableElement, 'drag');\n const page = utils.getPageXY(dragEvent);\n\n page.x += origin.x;\n page.y += origin.y;\n\n const horizontal = (page.x > rect.left) && (page.x < rect.right);\n const vertical = (page.y > rect.top ) && (page.y < rect.bottom);\n\n dropped = horizontal && vertical;\n }\n\n const dragRect = draggable.getRect(draggableElement);\n\n if (dragRect && dropOverlap === 'center') {\n const cx = dragRect.left + dragRect.width / 2;\n const cy = dragRect.top + dragRect.height / 2;\n\n dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom;\n }\n\n if (dragRect && utils.is.number(dropOverlap)) {\n const overlapArea = (Math.max(0, Math.min(rect.right , dragRect.right ) - Math.max(rect.left, dragRect.left))\n * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top , dragRect.top )));\n\n const overlapRatio = overlapArea / (dragRect.width * dragRect.height);\n\n dropped = overlapRatio >= dropOverlap;\n }\n\n if (this.options.drop.checker) {\n dropped = this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement);\n }\n\n return dropped;\n};\n\nInteractable.signals.on('unset', function ({ interactable }) {\n interactable.dropzone(false);\n});\n\nInteractable.settingsMethods.push('dropChecker');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.dropTarget = null; // the dropzone a drag target might be dropped into\n interaction.dropElement = null; // the element at the time of checking\n interaction.prevDropTarget = null; // the dropzone that was recently dragged away from\n interaction.prevDropElement = null; // the element at the time of checking\n interaction.dropEvents = null; // the dropEvents related to the current drag event\n\n interaction.activeDrops = {\n dropzones: [], // the dropzones that are mentioned below\n elements : [], // elements of dropzones that accept the target draggable\n rects : [], // the rects of the elements mentioned above\n };\n\n});\n\nInteraction.signals.on('stop', function ({ interaction }) {\n interaction.dropTarget = interaction.dropElement =\n interaction.prevDropTarget = interaction.prevDropElement = null;\n});\n\n/*\\\n * interact.dynamicDrop\n [ method ]\n *\n * Returns or sets whether the dimensions of dropzone elements are\n * calculated on every dragmove or only on dragstart for the default\n * dropChecker\n *\n - newValue (boolean) #optional True to check on each move. False to check only before start\n = (boolean | interact) The current setting or interact\n\\*/\ninteract.dynamicDrop = function (newValue) {\n if (utils.is.bool(newValue)) {\n //if (dragging && dynamicDrop !== newValue && !newValue) {\n //calcRects(dropzones);\n //}\n\n dynamicDrop = newValue;\n\n return interact;\n }\n return dynamicDrop;\n};\n\nutils.merge(Interactable.eventTypes, [\n 'dragenter',\n 'dragleave',\n 'dropactivate',\n 'dropdeactivate',\n 'dropmove',\n 'drop',\n]);\nactions.methodDict.drop = 'dropzone';\n\ndefaultOptions.drop = drop.defaults;\n\nmodule.exports = drop;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst gesture = {\n defaults: {\n enabled : false,\n origin : null,\n restrict: null,\n },\n\n checker: function (pointer, event, interactable, element, interaction) {\n if (interaction.pointerIds.length >= 2) {\n return { name: 'gesture' };\n }\n\n return null;\n },\n\n getCursor: function () {\n return '';\n },\n};\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturestart') { return; }\n iEvent.ds = 0;\n\n interaction.gesture.startDistance = interaction.gesture.prevDistance = iEvent.distance;\n interaction.gesture.startAngle = interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.scale = 1;\n});\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturemove') { return; }\n\n iEvent.ds = iEvent.scale - interaction.gesture.scale;\n\n interaction.target.fire(iEvent);\n\n interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.prevDistance = iEvent.distance;\n\n if (iEvent.scale !== Infinity\n && iEvent.scale !== null\n && iEvent.scale !== undefined\n && !isNaN(iEvent.scale)) {\n\n interaction.gesture.scale = iEvent.scale;\n }\n});\n\n/*\\\n * Interactable.gesturable\n [ method ]\n *\n * Gets or sets whether multitouch gestures can be performed on the\n * Interactable's element\n *\n = (boolean) Indicates if this can be the target of gesture events\n | var isGestureable = interact(element).gesturable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on gesture events (makes the Interactable gesturable)\n = (object) this Interactable\n | interact(element).gesturable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // limit multiple gestures.\n | // See the explanation in @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n\\*/\nInteractable.prototype.gesturable = function (options) {\n if (utils.is.object(options)) {\n this.options.gesture.enabled = options.enabled === false? false: true;\n this.setPerAction('gesture', options);\n this.setOnEvents('gesture', options);\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.gesture.enabled = options;\n\n if (!options) {\n this.ongesturestart = this.ongesturestart = this.ongestureend = null;\n }\n\n return this;\n }\n\n return this.options.gesture;\n};\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action, event, starting, ending, deltaSource }) {\n if (action !== 'gesture') { return; }\n\n const pointers = interaction.pointers;\n\n iEvent.touches = [pointers[0], pointers[1]];\n\n if (starting) {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = 1;\n iEvent.ds = 0;\n iEvent.angle = utils.touchAngle(pointers, undefined, deltaSource);\n iEvent.da = 0;\n }\n else if (ending || event instanceof InteractEvent) {\n iEvent.distance = interaction.prevEvent.distance;\n iEvent.box = interaction.prevEvent.box;\n iEvent.scale = interaction.prevEvent.scale;\n iEvent.ds = iEvent.scale - 1;\n iEvent.angle = interaction.prevEvent.angle;\n iEvent.da = iEvent.angle - interaction.gesture.startAngle;\n }\n else {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = iEvent.distance / interaction.gesture.startDistance;\n iEvent.angle = utils.touchAngle(pointers, interaction.gesture.prevAngle, deltaSource);\n\n iEvent.ds = iEvent.scale - interaction.gesture.prevScale;\n iEvent.da = iEvent.angle - interaction.gesture.prevAngle;\n }\n});\n\nInteraction.signals.on('new', function (interaction) {\n interaction.gesture = {\n start: { x: 0, y: 0 },\n\n startDistance: 0, // distance between two touches of touchStart\n prevDistance : 0,\n distance : 0,\n\n scale: 1, // gesture.distance / gesture.startDistance\n\n startAngle: 0, // angle of line joining two touches\n prevAngle : 0, // angle of the previous gesture event\n };\n});\n\nactions.gesture = gesture;\nactions.names.push('gesture');\nutils.merge(Interactable.eventTypes, [\n 'gesturestart',\n 'gesturemove',\n 'gestureend',\n]);\nactions.methodDict.gesture = 'gesturable';\n\ndefaultOptions.gesture = gesture.defaults;\n\nmodule.exports = gesture;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\n// Less Precision with touch input\nconst defaultMargin = browser.supportsTouch || browser.supportsPointerEvent? 20: 10;\n\nconst resize = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n square: false,\n preserveAspectRatio: false,\n axis: 'xy',\n\n // use default margin\n margin: NaN,\n\n // object with props left, right, top, bottom which are\n // true/false values to resize when the pointer is over that edge,\n // CSS selectors to match the handles for each direction\n // or the Elements for each handle\n edges: null,\n\n // a value of 'none' will limit the resize rect to a minimum of 0x0\n // 'negate' will alow the rect to have negative width/height\n // 'reposition' will keep the width/height positive by swapping\n // the top and bottom edges and/or swapping the left and right edges\n invert: 'none',\n },\n\n checker: function (pointer, event, interactable, element, interaction, rect) {\n if (!rect) { return null; }\n\n const page = utils.extend({}, interaction.curCoords.page);\n const options = interactable.options;\n\n if (options.resize.enabled) {\n const resizeOptions = options.resize;\n const resizeEdges = { left: false, right: false, top: false, bottom: false };\n\n // if using resize.edges\n if (utils.is.object(resizeOptions.edges)) {\n for (const edge in resizeEdges) {\n resizeEdges[edge] = checkResizeEdge(edge,\n resizeOptions.edges[edge],\n page,\n interaction._eventTarget,\n element,\n rect,\n resizeOptions.margin || defaultMargin);\n }\n\n resizeEdges.left = resizeEdges.left && !resizeEdges.right;\n resizeEdges.top = resizeEdges.top && !resizeEdges.bottom;\n\n if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) {\n return {\n name: 'resize',\n edges: resizeEdges,\n };\n }\n }\n else {\n const right = options.resize.axis !== 'y' && page.x > (rect.right - defaultMargin);\n const bottom = options.resize.axis !== 'x' && page.y > (rect.bottom - defaultMargin);\n\n if (right || bottom) {\n return {\n name: 'resize',\n axes: (right? 'x' : '') + (bottom? 'y' : ''),\n };\n }\n }\n }\n\n return null;\n },\n\n cursors: (browser.isIe9OrOlder ? {\n x : 'e-resize',\n y : 's-resize',\n xy: 'se-resize',\n\n top : 'n-resize',\n left : 'w-resize',\n bottom : 's-resize',\n right : 'e-resize',\n topleft : 'se-resize',\n bottomright: 'se-resize',\n topright : 'ne-resize',\n bottomleft : 'ne-resize',\n } : {\n x : 'ew-resize',\n y : 'ns-resize',\n xy: 'nwse-resize',\n\n top : 'ns-resize',\n left : 'ew-resize',\n bottom : 'ns-resize',\n right : 'ew-resize',\n topleft : 'nwse-resize',\n bottomright: 'nwse-resize',\n topright : 'nesw-resize',\n bottomleft : 'nesw-resize',\n }),\n\n getCursor: function (action) {\n if (action.axis) {\n return resize.cursors[action.name + action.axis];\n }\n else if (action.edges) {\n let cursorKey = '';\n const edgeNames = ['top', 'bottom', 'left', 'right'];\n\n for (let i = 0; i < 4; i++) {\n if (action.edges[edgeNames[i]]) {\n cursorKey += edgeNames[i];\n }\n }\n\n return resize.cursors[cursorKey];\n }\n },\n};\n\n// resizestart\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'resizestart' || !interaction.prepared.edges) {\n return;\n }\n\n const startRect = interaction.target.getRect(interaction.element);\n const resizeOptions = interaction.target.options.resize;\n\n /*\n * When using the `resizable.square` or `resizable.preserveAspectRatio` options, resizing from one edge\n * will affect another. E.g. with `resizable.square`, resizing to make the right edge larger will make\n * the bottom edge larger by the same amount. We call these 'linked' edges. Any linked edges will depend\n * on the active edges and the edge being interacted with.\n */\n if (resizeOptions.square || resizeOptions.preserveAspectRatio) {\n const linkedEdges = utils.extend({}, interaction.prepared.edges);\n\n linkedEdges.top = linkedEdges.top || (linkedEdges.left && !linkedEdges.bottom);\n linkedEdges.left = linkedEdges.left || (linkedEdges.top && !linkedEdges.right );\n linkedEdges.bottom = linkedEdges.bottom || (linkedEdges.right && !linkedEdges.top );\n linkedEdges.right = linkedEdges.right || (linkedEdges.bottom && !linkedEdges.left );\n\n interaction.prepared._linkedEdges = linkedEdges;\n }\n else {\n interaction.prepared._linkedEdges = null;\n }\n\n // if using `resizable.preserveAspectRatio` option, record aspect ratio at the start of the resize\n if (resizeOptions.preserveAspectRatio) {\n interaction.resizeStartAspectRatio = startRect.width / startRect.height;\n }\n\n interaction.resizeRects = {\n start : startRect,\n current : utils.extend({}, startRect),\n inverted : utils.extend({}, startRect),\n previous : utils.extend({}, startRect),\n delta : {\n left: 0, right : 0, width : 0,\n top : 0, bottom: 0, height: 0,\n },\n };\n\n iEvent.rect = interaction.resizeRects.inverted;\n iEvent.deltaRect = interaction.resizeRects.delta;\n});\n\n// resizemove\nInteractEvent.signals.on('new', function ({ iEvent, phase, interaction }) {\n if (phase !== 'move' || !interaction.prepared.edges) { return; }\n\n const resizeOptions = interaction.target.options.resize;\n const invert = resizeOptions.invert;\n const invertible = invert === 'reposition' || invert === 'negate';\n\n let edges = interaction.prepared.edges;\n\n const start = interaction.resizeRects.start;\n const current = interaction.resizeRects.current;\n const inverted = interaction.resizeRects.inverted;\n const delta = interaction.resizeRects.delta;\n const previous = utils.extend(interaction.resizeRects.previous, inverted);\n const originalEdges = edges;\n\n let dx = iEvent.dx;\n let dy = iEvent.dy;\n\n if (resizeOptions.preserveAspectRatio || resizeOptions.square) {\n // `resize.preserveAspectRatio` takes precedence over `resize.square`\n const startAspectRatio = resizeOptions.preserveAspectRatio\n ? interaction.resizeStartAspectRatio\n : 1;\n\n edges = interaction.prepared._linkedEdges;\n\n if ((originalEdges.left && originalEdges.bottom)\n || (originalEdges.right && originalEdges.top)) {\n dy = -dx / startAspectRatio;\n }\n else if (originalEdges.left || originalEdges.right ) { dy = dx / startAspectRatio; }\n else if (originalEdges.top || originalEdges.bottom) { dx = dy * startAspectRatio; }\n }\n\n // update the 'current' rect without modifications\n if (edges.top ) { current.top += dy; }\n if (edges.bottom) { current.bottom += dy; }\n if (edges.left ) { current.left += dx; }\n if (edges.right ) { current.right += dx; }\n\n if (invertible) {\n // if invertible, copy the current rect\n utils.extend(inverted, current);\n\n if (invert === 'reposition') {\n // swap edge values if necessary to keep width/height positive\n let swap;\n\n if (inverted.top > inverted.bottom) {\n swap = inverted.top;\n\n inverted.top = inverted.bottom;\n inverted.bottom = swap;\n }\n if (inverted.left > inverted.right) {\n swap = inverted.left;\n\n inverted.left = inverted.right;\n inverted.right = swap;\n }\n }\n }\n else {\n // if not invertible, restrict to minimum of 0x0 rect\n inverted.top = Math.min(current.top, start.bottom);\n inverted.bottom = Math.max(current.bottom, start.top);\n inverted.left = Math.min(current.left, start.right);\n inverted.right = Math.max(current.right, start.left);\n }\n\n inverted.width = inverted.right - inverted.left;\n inverted.height = inverted.bottom - inverted.top ;\n\n for (const edge in inverted) {\n delta[edge] = inverted[edge] - previous[edge];\n }\n\n iEvent.edges = interaction.prepared.edges;\n iEvent.rect = inverted;\n iEvent.deltaRect = delta;\n});\n\n/*\\\n * Interactable.resizable\n [ method ]\n *\n * Gets or sets whether resize actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of resize elements\n | var isResizeable = interact('input[type=text]').resizable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on resize events (object makes the Interactable resizable)\n = (object) This Interactable\n | interact(element).resizable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | edges: {\n | top : true, // Use pointer coords to check for resize.\n | left : false, // Disable resizing from left edge.\n | bottom: '.resize-s',// Resize if pointer target matches selector\n | right : handleEl // Resize if pointer target is the given Element\n | },\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height are adjusted at a 1:1 ratio.\n | square: false,\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height maintain the aspect ratio they had when resizing started.\n | preserveAspectRatio: false,\n |\n | // a value of 'none' will limit the resize rect to a minimum of 0x0\n | // 'negate' will allow the rect to have negative width/height\n | // 'reposition' will keep the width/height positive by swapping\n | // the top and bottom edges and/or swapping the left and right edges\n | invert: 'none' || 'negate' || 'reposition'\n |\n | // limit multiple resizes.\n | // See the explanation in the @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n \\*/\nInteractable.prototype.resizable = function (options) {\n if (utils.is.object(options)) {\n this.options.resize.enabled = options.enabled === false? false: true;\n this.setPerAction('resize', options);\n this.setOnEvents('resize', options);\n\n if (/^x$|^y$|^xy$/.test(options.axis)) {\n this.options.resize.axis = options.axis;\n }\n else if (options.axis === null) {\n this.options.resize.axis = defaultOptions.resize.axis;\n }\n\n if (utils.is.bool(options.preserveAspectRatio)) {\n this.options.resize.preserveAspectRatio = options.preserveAspectRatio;\n }\n else if (utils.is.bool(options.square)) {\n this.options.resize.square = options.square;\n }\n\n return this;\n }\n if (utils.is.bool(options)) {\n this.options.resize.enabled = options;\n\n if (!options) {\n this.onresizestart = this.onresizestart = this.onresizeend = null;\n }\n\n return this;\n }\n return this.options.resize;\n};\n\nfunction checkResizeEdge (name, value, page, element, interactableElement, rect, margin) {\n // false, '', undefined, null\n if (!value) { return false; }\n\n // true value, use pointer coords and element rect\n if (value === true) {\n // if dimensions are negative, \"switch\" edges\n const width = utils.is.number(rect.width )? rect.width : rect.right - rect.left;\n const height = utils.is.number(rect.height)? rect.height : rect.bottom - rect.top ;\n\n if (width < 0) {\n if (name === 'left' ) { name = 'right'; }\n else if (name === 'right') { name = 'left' ; }\n }\n if (height < 0) {\n if (name === 'top' ) { name = 'bottom'; }\n else if (name === 'bottom') { name = 'top' ; }\n }\n\n if (name === 'left' ) { return page.x < ((width >= 0? rect.left: rect.right ) + margin); }\n if (name === 'top' ) { return page.y < ((height >= 0? rect.top : rect.bottom) + margin); }\n\n if (name === 'right' ) { return page.x > ((width >= 0? rect.right : rect.left) - margin); }\n if (name === 'bottom') { return page.y > ((height >= 0? rect.bottom: rect.top ) - margin); }\n }\n\n // the remaining checks require an element\n if (!utils.is.element(element)) { return false; }\n\n return utils.is.element(value)\n // the value is an element to use as a resize handle\n ? value === element\n // otherwise check if element matches value as selector\n : utils.matchesUpTo(element, value, interactableElement);\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.resizeAxes = 'xy';\n});\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action }) {\n if (action !== 'resize' || !interaction.resizeAxes) { return; }\n\n const options = interaction.target.options;\n\n if (options.resize.square) {\n if (interaction.resizeAxes === 'y') {\n iEvent.dx = iEvent.dy;\n }\n else {\n iEvent.dy = iEvent.dx;\n }\n iEvent.axes = 'xy';\n }\n else {\n iEvent.axes = interaction.resizeAxes;\n\n if (interaction.resizeAxes === 'x') {\n iEvent.dy = 0;\n }\n else if (interaction.resizeAxes === 'y') {\n iEvent.dx = 0;\n }\n }\n});\n\nactions.resize = resize;\nactions.names.push('resize');\nutils.merge(Interactable.eventTypes, [\n 'resizestart',\n 'resizemove',\n 'resizeinertiastart',\n 'resizeinertiaresume',\n 'resizeend',\n]);\nactions.methodDict.resize = 'resizable';\n\ndefaultOptions.resize = resize.defaults;\n\nmodule.exports = resize;\n","const raf = require('./utils/raf');\nconst getWindow = require('./utils/window').getWindow;\nconst is = require('./utils/is');\nconst domUtils = require('./utils/domUtils');\nconst Interaction = require('./Interaction');\nconst defaultOptions = require('./defaultOptions');\n\nconst autoScroll = {\n defaults: {\n enabled : false,\n container: null, // the item that is scrolled (Window or HTMLElement)\n margin : 60,\n speed : 300, // the scroll speed in pixels per second\n },\n\n interaction: null,\n i: null, // the handle returned by window.setInterval\n x: 0, y: 0, // Direction each pulse is to scroll in\n\n isScrolling: false,\n prevTime: 0,\n\n start: function (interaction) {\n autoScroll.isScrolling = true;\n raf.cancel(autoScroll.i);\n\n autoScroll.interaction = interaction;\n autoScroll.prevTime = new Date().getTime();\n autoScroll.i = raf.request(autoScroll.scroll);\n },\n\n stop: function () {\n autoScroll.isScrolling = false;\n raf.cancel(autoScroll.i);\n },\n\n // scroll the window by the values in scroll.x/y\n scroll: function () {\n const options = autoScroll.interaction.target.options[autoScroll.interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(autoScroll.interaction.element);\n const now = new Date().getTime();\n // change in time in seconds\n const dt = (now - autoScroll.prevTime) / 1000;\n // displacement\n const s = options.speed * dt;\n\n if (s >= 1) {\n if (is.window(container)) {\n container.scrollBy(autoScroll.x * s, autoScroll.y * s);\n }\n else if (container) {\n container.scrollLeft += autoScroll.x * s;\n container.scrollTop += autoScroll.y * s;\n }\n\n autoScroll.prevTime = now;\n }\n\n if (autoScroll.isScrolling) {\n raf.cancel(autoScroll.i);\n autoScroll.i = raf.request(autoScroll.scroll);\n }\n },\n check: function (interactable, actionName) {\n const options = interactable.options;\n\n return options[actionName].autoScroll && options[actionName].autoScroll.enabled;\n },\n onInteractionMove: function ({ interaction, pointer }) {\n if (!(interaction.interacting()\n && autoScroll.check(interaction.target, interaction.prepared.name))) {\n return;\n }\n\n if (interaction.simulation) {\n autoScroll.x = autoScroll.y = 0;\n return;\n }\n\n let top;\n let right;\n let bottom;\n let left;\n\n const options = interaction.target.options[interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(interaction.element);\n\n if (is.window(container)) {\n left = pointer.clientX < autoScroll.margin;\n top = pointer.clientY < autoScroll.margin;\n right = pointer.clientX > container.innerWidth - autoScroll.margin;\n bottom = pointer.clientY > container.innerHeight - autoScroll.margin;\n }\n else {\n const rect = domUtils.getElementClientRect(container);\n\n left = pointer.clientX < rect.left + autoScroll.margin;\n top = pointer.clientY < rect.top + autoScroll.margin;\n right = pointer.clientX > rect.right - autoScroll.margin;\n bottom = pointer.clientY > rect.bottom - autoScroll.margin;\n }\n\n autoScroll.x = (right ? 1: left? -1: 0);\n autoScroll.y = (bottom? 1: top? -1: 0);\n\n if (!autoScroll.isScrolling) {\n // set the autoScroll properties to those of the target\n autoScroll.margin = options.margin;\n autoScroll.speed = options.speed;\n\n autoScroll.start(interaction);\n }\n },\n};\n\nInteraction.signals.on('stop-active', function () {\n autoScroll.stop();\n});\n\nInteraction.signals.on('action-move', autoScroll.onInteractionMove);\n\ndefaultOptions.perAction.autoScroll = autoScroll.defaults;\n\nmodule.exports = autoScroll;\n","const Interactable = require('../Interactable');\nconst actions = require('../actions/base');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.ignoreFrom\n [ method ]\n *\n * If the target of the `mousedown`, `pointerdown` or `touchstart`\n * event or any of it's parents match the given CSS selector or\n * Element, no drag/resize/gesture is started.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to not ignore any elements\n = (string | Element | object) The current ignoreFrom value or this Interactable\n **\n | interact(element, { ignoreFrom: document.getElementById('no-action') });\n | // or\n | interact(element).ignoreFrom('input, textarea, a');\n\\*/\nInteractable.prototype.ignoreFrom = function (newValue) {\n return this._backCompatOption('ignoreFrom', newValue);\n};\n\n/*\\\n * Interactable.allowFrom\n [ method ]\n *\n * A drag/resize/gesture is started only If the target of the\n * `mousedown`, `pointerdown` or `touchstart` event or any of it's\n * parents match the given CSS selector or Element.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to allow from any element\n = (string | Element | object) The current allowFrom value or this Interactable\n **\n | interact(element, { allowFrom: document.getElementById('drag-handle') });\n | // or\n | interact(element).allowFrom('.handle');\n\\*/\nInteractable.prototype.allowFrom = function (newValue) {\n return this._backCompatOption('allowFrom', newValue);\n};\n\nInteractable.prototype.testIgnore = function (ignoreFrom, interactableElement, element) {\n if (!ignoreFrom || !is.element(element)) { return false; }\n\n if (is.string(ignoreFrom)) {\n return domUtils.matchesUpTo(element, ignoreFrom, interactableElement);\n }\n else if (is.element(ignoreFrom)) {\n return domUtils.nodeContains(ignoreFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testAllow = function (allowFrom, interactableElement, element) {\n if (!allowFrom) { return true; }\n\n if (!is.element(element)) { return false; }\n\n if (is.string(allowFrom)) {\n return domUtils.matchesUpTo(element, allowFrom, interactableElement);\n }\n else if (is.element(allowFrom)) {\n return domUtils.nodeContains(allowFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testIgnoreAllow = function (options, interactableElement, eventTarget) {\n return (!this.testIgnore(options.ignoreFrom, interactableElement, eventTarget)\n && this.testAllow(options.allowFrom, interactableElement, eventTarget));\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (event.buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\n","const interact = require('../interact');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst actions = require('../actions/base');\nconst defaultOptions = require('../defaultOptions');\nconst browser = require('../utils/browser');\nconst scope = require('../scope');\nconst utils = require('../utils');\nconst signals = require('../utils/Signals').new();\n\nrequire('./InteractableMethods');\n\nconst autoStart = {\n signals,\n withinInteractionLimit,\n // Allow this many interactions to happen simultaneously\n maxInteractions: Infinity,\n defaults: {\n perAction: {\n manualStart: false,\n max: Infinity,\n maxPerElement: 1,\n allowFrom: null,\n ignoreFrom: null,\n },\n },\n setActionDefaults: function (action) {\n utils.extend(action.defaults, autoStart.defaults.perAction);\n },\n};\n\n// set cursor style on mousedown\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget }) {\n if (interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\n// set cursor style on mousemove\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget }) {\n if (!interaction.mouse\n || interaction.pointerIsDown\n || interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\nInteraction.signals.on('move', function (arg) {\n const { interaction, event } = arg;\n\n if (!interaction.pointerIsDown\n || interaction.interacting()\n || !interaction.pointerWasMoved\n || !interaction.prepared.name) {\n return;\n }\n\n signals.fire('before-start', arg);\n\n const target = interaction.target;\n\n if (interaction.prepared.name && target) {\n // check manualStart and interaction limit\n if (target.options[interaction.prepared.name].manualStart\n || !withinInteractionLimit(target, interaction.element, interaction.prepared)) {\n interaction.stop(event);\n }\n else {\n interaction.start(interaction.prepared, target, interaction.element);\n }\n }\n});\n\n// Check if the current target supports the action.\n// If so, return the validated action. Otherwise, return null\nfunction validateAction (action, interactable, element, eventTarget) {\n if (utils.is.object(action)\n && interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget)\n && interactable.options[action.name].enabled\n && withinInteractionLimit(interactable, element, action)) {\n return action;\n }\n\n return null;\n}\n\nfunction validateSelector (interaction, pointer, event, matches, matchElements, eventTarget) {\n for (let i = 0, len = matches.length; i < len; i++) {\n const match = matches[i];\n const matchElement = matchElements[i];\n const action = validateAction(match.getAction(pointer, event, interaction, matchElement),\n match,\n matchElement,\n eventTarget);\n\n if (action) {\n return {\n action,\n target: match,\n element: matchElement,\n };\n }\n }\n\n return {};\n}\n\nfunction getActionInfo (interaction, pointer, event, eventTarget) {\n let matches = [];\n let matchElements = [];\n\n let element = eventTarget;\n let action = null;\n\n function pushMatches (interactable, selector, context) {\n const elements = (browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined);\n\n if (utils.matchesSelector(element, selector, elements)) {\n\n matches.push(interactable);\n matchElements.push(element);\n }\n }\n\n while (utils.is.element(element)) {\n matches = [];\n matchElements = [];\n\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && (action = validateAction(elementInteractable.getAction(pointer, event, interaction, element, eventTarget),\n elementInteractable,\n element,\n eventTarget))\n && !elementInteractable.options[action.name].manualStart) {\n return {\n element,\n action,\n target: elementInteractable,\n };\n }\n else {\n scope.interactables.forEachSelector(pushMatches, element);\n\n const actionInfo = validateSelector(interaction, pointer, event, matches, matchElements, eventTarget);\n\n if (actionInfo.action\n && !actionInfo.target.options[actionInfo.action.name].manualStart) {\n return actionInfo;\n }\n }\n\n element = utils.parentNode(element);\n }\n\n return {};\n}\n\nfunction prepare (interaction, { action, target, element }) {\n action = action || {};\n\n if (interaction.target && interaction.target.options.styleCursor) {\n interaction.target._doc.documentElement.style.cursor = '';\n }\n\n interaction.target = target;\n interaction.element = element;\n utils.copyAction(interaction.prepared, action);\n\n if (target && target.options.styleCursor) {\n const cursor = action? actions[action.name].getCursor(action) : '';\n interaction.target._doc.documentElement.style.cursor = cursor;\n }\n\n signals.fire('prepared', { interaction: interaction });\n}\n\nInteraction.signals.on('stop', function ({ interaction }) {\n const target = interaction.target;\n\n if (target && target.options.styleCursor) {\n target._doc.documentElement.style.cursor = '';\n }\n});\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (utils.is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (utils.is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n const buttons = event.buttons || ({\n 0: 1,\n 1: 4,\n 3: 8,\n 4: 16,\n })[event.button];\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\nfunction withinInteractionLimit (interactable, element, action) {\n const options = interactable.options;\n const maxActions = options[action.name].max;\n const maxPerElement = options[action.name].maxPerElement;\n let activeInteractions = 0;\n let targetCount = 0;\n let targetElementCount = 0;\n\n // no actions if any of these values == 0\n if (!(maxActions && maxPerElement && autoStart.maxInteractions)) { return; }\n\n for (let i = 0, len = scope.interactions.length; i < len; i++) {\n const interaction = scope.interactions[i];\n const otherAction = interaction.prepared.name;\n\n if (!interaction.interacting()) { continue; }\n\n activeInteractions++;\n\n if (activeInteractions >= autoStart.maxInteractions) {\n return false;\n }\n\n if (interaction.target !== interactable) { continue; }\n\n targetCount += (otherAction === action.name)|0;\n\n if (targetCount >= maxActions) {\n return false;\n }\n\n if (interaction.element === element) {\n targetElementCount++;\n\n if (otherAction !== action.name || targetElementCount >= maxPerElement) {\n return false;\n }\n }\n }\n\n return autoStart.maxInteractions > 0;\n}\n\n/*\\\n * interact.maxInteractions\n [ method ]\n **\n * Returns or sets the maximum number of concurrent interactions allowed.\n * By default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables\n * and elements, you need to enable it in the draggable, resizable and\n * gesturable `'max'` and `'maxPerElement'` options.\n **\n - newValue (number) #optional Any number. newValue <= 0 means no interactions.\n\\*/\ninteract.maxInteractions = function (newValue) {\n if (utils.is.number(newValue)) {\n autoStart.maxInteractions = newValue;\n\n return this;\n }\n\n return autoStart.maxInteractions;\n};\n\nInteractable.settingsMethods.push('styleCursor');\nInteractable.settingsMethods.push('actionChecker');\nInteractable.settingsMethods.push('ignoreFrom');\nInteractable.settingsMethods.push('allowFrom');\n\ndefaultOptions.base.actionChecker = null;\ndefaultOptions.base.styleCursor = true;\n\nutils.extend(defaultOptions.perAction, autoStart.defaults.perAction);\n\nmodule.exports = autoStart;\n","const autoStart = require('./base');\nconst Interaction = require('../Interaction');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.delayTimer = null;\n});\n\nautoStart.signals.on('prepared', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.delayTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.target, interaction.element);\n }, delay);\n }\n});\n\nInteraction.signals.on('move', function ({ interaction, duplicate }) {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.delayTimer);\n }\n});\n\n// prevent regular down->move autoStart\nautoStart.signals.on('before-start', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.prepared.name = null;\n }\n});\n","const autoStart = require('./base');\nconst scope = require('../scope');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\n\nconst { matchesSelector, parentNode } = require('../utils/domUtils');\n\nautoStart.setActionDefaults(require('../actions/drag'));\n\nautoStart.signals.on('before-start', function ({ interaction, eventTarget, dx, dy }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // check if a drag is in the correct axis\n const absX = Math.abs(dx);\n const absY = Math.abs(dy);\n const options = interaction.target.options.drag;\n const startAxis = options.startAxis;\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy');\n\n interaction.prepared.axis = options.lockAxis === 'start'\n ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n : options.lockAxis;\n\n // if the movement isn't in the startAxis of the interactable\n if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) {\n // cancel the prepared action\n interaction.prepared.name = null;\n\n // then try to get a drag from another ineractable\n\n if (!interaction.prepared.name) {\n\n let element = eventTarget;\n\n const getDraggable = function (interactable, selector, context) {\n const elements = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n if (interactable === interaction.target) { return; }\n\n if (!options.manualStart\n && !interactable.testIgnoreAllow(options, element, eventTarget)\n && matchesSelector(element, selector, elements)) {\n\n const action = interactable.getAction(interaction.downPointer,\n interaction.downEvent,\n interaction,\n element);\n\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, interactable)\n && autoStart.validateAction(action, interactable, element, eventTarget)) {\n\n return interactable;\n }\n }\n };\n\n let action = null;\n\n // check all interactables\n while (is.element(element)) {\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && elementInteractable !== interaction.target\n && !elementInteractable.options.drag.manualStart) {\n\n action = elementInteractable.getAction(interaction.downPointer, interaction.downEvent, interaction, element);\n }\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, elementInteractable)) {\n\n interaction.prepared.name = 'drag';\n interaction.target = elementInteractable;\n interaction.element = element;\n break;\n }\n\n const selectorInteractable = scope.interactables.forEachSelector(getDraggable, element);\n\n if (selectorInteractable) {\n interaction.prepared.name = 'drag';\n interaction.target = selectorInteractable;\n interaction.element = element;\n break;\n }\n\n element = parentNode(element);\n }\n }\n }\n});\n\nfunction checkStartAxis (startAxis, interactable) {\n if (!interactable) { return false; }\n\n const thisAxis = interactable.options.drag.startAxis;\n\n return (startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis);\n}\n","require('./base').setActionDefaults(require('../actions/gesture'));\n","require('./base').setActionDefaults(require('../actions/resize'));\n","module.exports = {\n base: {\n accept : null,\n preventDefault: 'auto',\n deltaSource : 'page',\n },\n\n perAction: {\n origin: { x: 0, y: 0 },\n\n // only allow left button by default\n // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n mouseButtons: 1,\n\n inertia: {\n enabled : false,\n resistance : 10, // the lambda in exponential decay\n minSpeed : 100, // target speed must be above this for inertia to start\n endSpeed : 10, // the speed at which inertia is slow enough to stop\n allowResume : true, // allow resuming an action in inertia phase\n smoothEndDuration: 300, // animate to snap/restrict endOnly if there's no inertia\n },\n },\n};\n","/* browser entry point */\n\n// Legacy browser support\nrequire('./legacyBrowsers');\n\n// inertia\nrequire('./inertia');\n\n// modifiers\nrequire('./modifiers/snap');\nrequire('./modifiers/restrict');\n\n// pointerEvents\nrequire('./pointerEvents/base');\nrequire('./pointerEvents/holdRepeat');\nrequire('./pointerEvents/interactableTargets');\n\n// delay\nrequire('./autoStart/delay');\n\n// actions\nrequire('./actions/gesture');\nrequire('./actions/resize');\nrequire('./actions/drag');\nrequire('./actions/drop');\n\n// load these modifiers after resize is loaded\nrequire('./modifiers/snapSize');\nrequire('./modifiers/restrictEdges');\nrequire('./modifiers/restrictSize');\n\n// autoStart actions\nrequire('./autoStart/gesture');\nrequire('./autoStart/resize');\nrequire('./autoStart/drag');\n\n// Interactable preventDefault setting\nrequire('./interactablePreventDefault.js');\n\n// autoScroll\nrequire('./autoScroll');\n\n// export interact\nmodule.exports = require('./interact');\n","const InteractEvent = require('./InteractEvent');\nconst Interaction = require('./Interaction');\nconst modifiers = require('./modifiers');\nconst utils = require('./utils');\nconst animationFrame = require('./utils/raf');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.inertiaStatus = {\n active : false,\n smoothEnd : false,\n allowResume: false,\n\n startEvent: null,\n upCoords : {},\n\n xe: 0, ye: 0,\n sx: 0, sy: 0,\n\n t0: 0,\n vx0: 0, vys: 0,\n duration: 0,\n\n lambda_v0: 0,\n one_ve_v0: 0,\n i : null,\n };\n\n interaction.boundInertiaFrame = () => inertiaFrame .apply(interaction);\n interaction.boundSmoothEndFrame = () => smoothEndFrame.apply(interaction);\n});\n\nInteraction.signals.on('down', function ({ interaction, event, pointer, eventTarget }) {\n const status = interaction.inertiaStatus;\n\n // Check if the down event hits the current inertia target\n if (status.active) {\n let element = eventTarget;\n\n // climb up the DOM tree from the event target\n while (utils.is.element(element)) {\n\n // if interaction element is the current inertia target element\n if (element === interaction.element) {\n // stop inertia\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n\n // update pointers to the down event's coordinates\n interaction.updatePointer(pointer);\n utils.setCoords(interaction.curCoords, interaction.pointers);\n\n // fire appropriate signals\n const signalArg = { interaction };\n Interaction.signals.fire('before-action-move', signalArg);\n Interaction.signals.fire('action-resume' , signalArg);\n\n // fire a reume event\n const resumeEvent = new InteractEvent(interaction,\n event,\n interaction.prepared.name,\n 'inertiaresume',\n interaction.element);\n\n interaction.target.fire(resumeEvent);\n interaction.prevEvent = resumeEvent;\n modifiers.resetStatuses(interaction.modifierStatuses);\n\n utils.copyCoords(interaction.prevCoords, interaction.curCoords);\n break;\n }\n\n element = utils.parentNode(element);\n }\n }\n});\n\nInteraction.signals.on('up', function ({ interaction, event }) {\n const status = interaction.inertiaStatus;\n\n if (!interaction.interacting() || status.active) { return; }\n\n const target = interaction.target;\n const options = target && target.options;\n const inertiaOptions = options && interaction.prepared.name && options[interaction.prepared.name].inertia;\n\n const now = new Date().getTime();\n const statuses = {};\n const page = utils.extend({}, interaction.curCoords.page);\n const pointerSpeed = interaction.pointerDelta.client.speed;\n\n let smoothEnd = false;\n let modifierResult;\n\n // check if inertia should be started\n const inertiaPossible = (inertiaOptions && inertiaOptions.enabled\n && interaction.prepared.name !== 'gesture'\n && event !== status.startEvent);\n\n const inertia = (inertiaPossible\n && (now - interaction.curCoords.timeStamp) < 50\n && pointerSpeed > inertiaOptions.minSpeed\n && pointerSpeed > inertiaOptions.endSpeed);\n\n const modifierArg = {\n interaction,\n pageCoords: page,\n statuses,\n preEnd: true,\n requireEndOnly: true,\n };\n\n // smoothEnd\n if (inertiaPossible && !inertia) {\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n if (modifierResult.shouldMove && modifierResult.locked) {\n smoothEnd = true;\n }\n }\n\n if (!(inertia || smoothEnd)) { return; }\n\n utils.copyCoords(status.upCoords, interaction.curCoords);\n\n interaction.pointers[0] = status.startEvent =\n new InteractEvent(interaction, event, interaction.prepared.name, 'inertiastart', interaction.element);\n\n status.t0 = now;\n\n status.active = true;\n status.allowResume = inertiaOptions.allowResume;\n interaction.simulation = status;\n\n target.fire(status.startEvent);\n\n if (inertia) {\n status.vx0 = interaction.pointerDelta.client.vx;\n status.vy0 = interaction.pointerDelta.client.vy;\n status.v0 = pointerSpeed;\n\n calcInertia(interaction, status);\n\n utils.extend(page, interaction.curCoords.page);\n\n page.x += status.xe;\n page.y += status.ye;\n\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n status.modifiedXe += modifierResult.dx;\n status.modifiedYe += modifierResult.dy;\n\n status.i = animationFrame.request(interaction.boundInertiaFrame);\n }\n else {\n status.smoothEnd = true;\n status.xe = modifierResult.dx;\n status.ye = modifierResult.dy;\n\n status.sx = status.sy = 0;\n\n status.i = animationFrame.request(interaction.boundSmoothEndFrame);\n }\n});\n\nInteraction.signals.on('stop-active', function ({ interaction }) {\n const status = interaction.inertiaStatus;\n\n if (status.active) {\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n }\n});\n\nfunction calcInertia (interaction, status) {\n const inertiaOptions = interaction.target.options[interaction.prepared.name].inertia;\n const lambda = inertiaOptions.resistance;\n const inertiaDur = -Math.log(inertiaOptions.endSpeed / status.v0) / lambda;\n\n status.x0 = interaction.prevEvent.pageX;\n status.y0 = interaction.prevEvent.pageY;\n status.t0 = status.startEvent.timeStamp / 1000;\n status.sx = status.sy = 0;\n\n status.modifiedXe = status.xe = (status.vx0 - inertiaDur) / lambda;\n status.modifiedYe = status.ye = (status.vy0 - inertiaDur) / lambda;\n status.te = inertiaDur;\n\n status.lambda_v0 = lambda / status.v0;\n status.one_ve_v0 = 1 - inertiaOptions.endSpeed / status.v0;\n}\n\nfunction inertiaFrame () {\n updateInertiaCoords(this);\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n\n const status = this.inertiaStatus;\n const options = this.target.options[this.prepared.name].inertia;\n const lambda = options.resistance;\n const t = new Date().getTime() / 1000 - status.t0;\n\n if (t < status.te) {\n\n const progress = 1 - (Math.exp(-lambda * t) - status.lambda_v0) / status.one_ve_v0;\n\n if (status.modifiedXe === status.xe && status.modifiedYe === status.ye) {\n status.sx = status.xe * progress;\n status.sy = status.ye * progress;\n }\n else {\n const quadPoint = utils.getQuadraticCurvePoint(0, 0,\n status.xe,\n status.ye,\n status.modifiedXe,\n status.modifiedYe,\n progress);\n\n status.sx = quadPoint.x;\n status.sy = quadPoint.y;\n }\n\n this.doMove();\n\n status.i = animationFrame.request(this.boundInertiaFrame);\n }\n else {\n status.sx = status.modifiedXe;\n status.sy = status.modifiedYe;\n\n this.doMove();\n this.end(status.startEvent);\n status.active = false;\n this.simulation = null;\n }\n\n utils.copyCoords(this.prevCoords, this.curCoords);\n}\n\nfunction smoothEndFrame () {\n updateInertiaCoords(this);\n\n const status = this.inertiaStatus;\n const t = new Date().getTime() - status.t0;\n const duration = this.target.options[this.prepared.name].inertia.smoothEndDuration;\n\n if (t < duration) {\n status.sx = utils.easeOutQuad(t, 0, status.xe, duration);\n status.sy = utils.easeOutQuad(t, 0, status.ye, duration);\n\n this.pointerMove(status.startEvent, status.startEvent);\n\n status.i = animationFrame.request(this.boundSmoothEndFrame);\n }\n else {\n status.sx = status.xe;\n status.sy = status.ye;\n\n this.pointerMove(status.startEvent, status.startEvent);\n this.end(status.startEvent);\n\n status.smoothEnd =\n status.active = false;\n this.simulation = null;\n }\n}\n\nfunction updateInertiaCoords (interaction) {\n const status = interaction.inertiaStatus;\n\n // return if inertia isn't running\n if (!status.active) { return; }\n\n const pageUp = status.upCoords.page;\n const clientUp = status.upCoords.client;\n\n utils.setCoords(interaction.curCoords, [ {\n pageX : pageUp.x + status.sx,\n pageY : pageUp.y + status.sy,\n clientX: clientUp.x + status.sx,\n clientY: clientUp.y + status.sy,\n } ]);\n}\n","const browser = require('./utils/browser');\nconst events = require('./utils/events');\nconst utils = require('./utils');\nconst scope = require('./scope');\nconst Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\n\nconst globalEvents = {};\n\n/*\\\n * interact\n [ method ]\n *\n * The methods of this variable can be used to set elements as\n * interactables and also to change various default settings.\n *\n * Calling it as a function and passing an element or a valid CSS selector\n * string returns an Interactable object which has various methods to\n * configure it.\n *\n - element (Element | string) The HTML or SVG Element to interact with or CSS selector\n = (object) An @Interactable\n *\n > Usage\n | interact('#draggable').draggable(true);\n |\n | var rectables = interact('rect');\n | rectables\n | .gesturable(true)\n | .on('gesturemove', function (event) {\n | // ...\n | });\n\\*/\nfunction interact (element, options) {\n let interactable = scope.interactables.get(element, options);\n\n if (!interactable) {\n interactable = new Interactable(element, options);\n interactable.events.global = globalEvents;\n }\n\n return interactable;\n}\n\n/*\\\n * interact.isSet\n [ method ]\n *\n * Check if an element has been set\n - element (Element) The Element being searched for\n = (boolean) Indicates if the element or CSS selector was previously passed to interact\n\\*/\ninteract.isSet = function (element, options) {\n return scope.interactables.indexOfElement(element, options && options.context) !== -1;\n};\n\n/*\\\n * interact.on\n [ method ]\n *\n * Adds a global listener for an InteractEvent or adds a DOM event to\n * `document`\n *\n - type (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) interact\n\\*/\ninteract.on = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.on(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.on(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n // if it is an InteractEvent type, add listener to globalEvents\n if (utils.contains(Interactable.eventTypes, type)) {\n // if this type of event was never bound\n if (!globalEvents[type]) {\n globalEvents[type] = [listener];\n }\n else {\n globalEvents[type].push(listener);\n }\n }\n // If non InteractEvent type, addEventListener to document\n else {\n events.add(scope.document, type, listener, { options });\n }\n\n return interact;\n};\n\n/*\\\n * interact.off\n [ method ]\n *\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n - type (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) interact\n \\*/\ninteract.off = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.off(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.off(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n if (!utils.contains(Interactable.eventTypes, type)) {\n events.remove(scope.document, type, listener, options);\n }\n else {\n let index;\n\n if (type in globalEvents\n && (index = utils.indexOf(globalEvents[type], listener)) !== -1) {\n globalEvents[type].splice(index, 1);\n }\n }\n\n return interact;\n};\n\n/*\\\n * interact.debug\n [ method ]\n *\n * Returns an object which exposes internal data\n = (object) An object with properties that outline the current state and expose internal functions and variables\n\\*/\ninteract.debug = function () {\n return scope;\n};\n\n// expose the functions used to calculate multi-touch properties\ninteract.getPointerAverage = utils.pointerAverage;\ninteract.getTouchBBox = utils.touchBBox;\ninteract.getTouchDistance = utils.touchDistance;\ninteract.getTouchAngle = utils.touchAngle;\n\ninteract.getElementRect = utils.getElementRect;\ninteract.getElementClientRect = utils.getElementClientRect;\ninteract.matchesSelector = utils.matchesSelector;\ninteract.closest = utils.closest;\n\n/*\\\n * interact.supportsTouch\n [ method ]\n *\n = (boolean) Whether or not the browser supports touch input\n\\*/\ninteract.supportsTouch = function () {\n return browser.supportsTouch;\n};\n\n/*\\\n * interact.supportsPointerEvent\n [ method ]\n *\n = (boolean) Whether or not the browser supports PointerEvents\n\\*/\ninteract.supportsPointerEvent = function () {\n return browser.supportsPointerEvent;\n};\n\n/*\\\n * interact.stop\n [ method ]\n *\n * Cancels all interactions (end events are not fired)\n *\n - event (Event) An event on which to call preventDefault()\n = (object) interact\n\\*/\ninteract.stop = function (event) {\n for (let i = scope.interactions.length - 1; i >= 0; i--) {\n scope.interactions[i].stop(event);\n }\n\n return interact;\n};\n\n/*\\\n * interact.pointerMoveTolerance\n [ method ]\n * Returns or sets the distance the pointer must be moved before an action\n * sequence occurs. This also affects tolerance for tap events.\n *\n - newValue (number) #optional The movement from the start position must be greater than this value\n = (number | Interactable) The current setting or interact\n\\*/\ninteract.pointerMoveTolerance = function (newValue) {\n if (utils.is.number(newValue)) {\n Interaction.pointerMoveTolerance = newValue;\n\n return this;\n }\n\n return Interaction.pointerMoveTolerance;\n};\n\ninteract.addDocument = scope.addDocument;\ninteract.removeDocument = scope.removeDocument;\n\nscope.interact = interact;\n\nmodule.exports = interact;\n","const Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\nconst scope = require('./scope');\nconst is = require('./utils/is');\nconst events = require('./utils/events');\n\nconst { nodeContains, matchesSelector } = require('./utils/domUtils');\n\n/*\\\n * Interactable.preventDefault\n [ method ]\n *\n * Returns or sets whether to prevent the browser's default behaviour\n * in response to pointer events. Can be set to:\n * - `'always'` to always prevent\n * - `'never'` to never prevent\n * - `'auto'` to let interact.js try to determine what would be best\n *\n - newValue (string) #optional `true`, `false` or `'auto'`\n = (string | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.preventDefault = function (newValue) {\n if (/^(always|never|auto)$/.test(newValue)) {\n this.options.preventDefault = newValue;\n return this;\n }\n\n if (is.bool(newValue)) {\n this.options.preventDefault = newValue? 'always' : 'never';\n return this;\n }\n\n return this.options.preventDefault;\n};\n\nInteractable.prototype.checkAndPreventDefault = function (event) {\n const setting = this.options.preventDefault;\n\n if (setting === 'never') { return; }\n\n if (setting === 'always') {\n event.preventDefault();\n return;\n }\n\n // setting === 'auto'\n\n // don't preventDefault if the browser supports passiveEvents\n // CSS touch-action and user-selecct should be used instead\n if (events.supportsOptions) {\n return;\n }\n\n // don't preventDefault of pointerdown events\n if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) {\n return;\n }\n\n // don't preventDefault on editable elements\n if (is.element(event.target)\n && matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) {\n return;\n }\n\n event.preventDefault();\n};\n\nfunction onInteractionEvent ({ interaction, event }) {\n if (interaction.target) {\n interaction.target.checkAndPreventDefault(event);\n }\n}\n\nfor (const eventSignal of ['down', 'move', 'up', 'cancel']) {\n Interaction.signals.on(eventSignal, onInteractionEvent);\n}\n\n// prevent native HTML5 drag on interact.js target elements\nInteraction.docEvents.dragstart = function preventNativeDrag (event) {\n for (const interaction of scope.interactions) {\n\n if (interaction.element\n && (interaction.element === event.target\n || nodeContains(interaction.element, event.target))) {\n\n interaction.target.checkAndPreventDefault(event);\n return;\n }\n }\n};\n","const scope = require('./scope');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst iFinder = require('./utils/interactionFinder');\nconst pointerEvents = require('./pointerEvents/base');\n\nconst { window } = require('./utils/window');\n\nconst toString = Object.prototype.toString;\n\nif (!window.Array.isArray) {\n window.Array.isArray = function (obj) {\n return toString.call(obj) === '[object Array]';\n };\n}\n\nif (!String.prototype.trim) {\n String.prototype.trim = function () {\n return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n };\n}\n\n// http://www.quirksmode.org/dom/events/click.html\n// >Events leading to dblclick\n//\n// IE8 doesn't fire down event before dblclick.\n// This workaround tries to fire a tap and doubletap after dblclick\nfunction onIE8Dblclick (event) {\n const eventTarget = event.target;\n const interaction = iFinder.search(event, event.type, eventTarget);\n\n if (!interaction) { return; }\n\n if (interaction.prevTap\n && event.clientX === interaction.prevTap.clientX\n && event.clientY === interaction.prevTap.clientY\n && eventTarget === interaction.prevTap.target) {\n\n interaction.downTargets[0] = eventTarget;\n interaction.downTimes [0] = new Date().getTime();\n\n pointerEvents.fire({\n interaction,\n event,\n eventTarget,\n pointer: event,\n type: 'tap',\n });\n }\n}\n\nif (browser.isIE8) {\n const selectFix = function (event) {\n for (const interaction of scope.interactions) {\n if (interaction.interacting()) {\n interaction.target.checkAndPreventDefault(event);\n }\n }\n };\n\n const onDocIE8 = function onDocIE8 ({ doc, win }, signalName) {\n const eventMethod = signalName.indexOf('listen') === 0\n ? events.add : events.remove;\n\n // For IE's lack of Event#preventDefault\n eventMethod(doc, 'selectstart', selectFix);\n\n if (pointerEvents) {\n eventMethod(doc, 'dblclick', onIE8Dblclick);\n }\n };\n\n scope.signals.on('add-document' , onDocIE8);\n scope.signals.on('remove-document', onDocIE8);\n}\n\nmodule.exports = null;\n","const InteractEvent = require('../InteractEvent');\nconst Interaction = require('../Interaction');\nconst extend = require('../utils/extend');\n\nconst modifiers = {\n names: [],\n\n setOffsets: function (arg) {\n const { interaction, pageCoords: page } = arg;\n const { target, element, startOffset } = interaction;\n const rect = target.getRect(element);\n\n if (rect) {\n startOffset.left = page.x - rect.left;\n startOffset.top = page.y - rect.top;\n\n startOffset.right = rect.right - page.x;\n startOffset.bottom = rect.bottom - page.y;\n\n if (!('width' in rect)) { rect.width = rect.right - rect.left; }\n if (!('height' in rect)) { rect.height = rect.bottom - rect.top ; }\n }\n else {\n startOffset.left = startOffset.top = startOffset.right = startOffset.bottom = 0;\n }\n\n arg.rect = rect;\n arg.interactable = target;\n arg.element = element;\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n\n arg.options = target.options[interaction.prepared.name][modifierName];\n\n if (!arg.options) {\n continue;\n }\n\n interaction.modifierOffsets[modifierName] = modifiers[modifierName].setOffset(arg);\n }\n },\n\n setAll: function (arg) {\n const { interaction, statuses, preEnd, requireEndOnly } = arg;\n const coords = extend({}, arg.pageCoords);\n const result = {\n dx: 0,\n dy: 0,\n changed: false,\n locked: false,\n shouldMove: true,\n };\n\n for (const modifierName of modifiers.names) {\n const modifier = modifiers[modifierName];\n const options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!shouldDo(options, preEnd, requireEndOnly)) { continue; }\n\n arg.status = arg.status = statuses[modifierName];\n arg.options = options;\n arg.offset = arg.interaction.modifierOffsets[modifierName];\n\n modifier.set(arg);\n\n if (arg.status.locked) {\n coords.x += arg.status.dx;\n coords.y += arg.status.dy;\n\n result.dx += arg.status.dx;\n result.dy += arg.status.dy;\n\n result.locked = true;\n }\n }\n\n // a move should be fired if:\n // - there are no modifiers enabled,\n // - no modifiers are \"locked\" i.e. have changed the pointer's coordinates, or\n // - the locked coords have changed since the last pointer move\n result.shouldMove = !arg.status || !result.locked || arg.status.changed;\n\n return result;\n },\n\n resetStatuses: function (statuses) {\n for (const modifierName of modifiers.names) {\n const status = statuses[modifierName] || {};\n\n status.dx = status.dy = 0;\n status.modifiedX = status.modifiedY = NaN;\n status.locked = false;\n status.changed = true;\n\n statuses[modifierName] = status;\n }\n\n return statuses;\n },\n\n start: function ({ interaction }, signalName) {\n const arg = {\n interaction,\n pageCoords: (signalName === 'action-resume' ?\n interaction.curCoords : interaction.startCoords).page,\n startOffset: interaction.startOffset,\n statuses: interaction.modifierStatuses,\n preEnd: false,\n requireEndOnly: false,\n };\n\n modifiers.setOffsets(arg);\n modifiers.resetStatuses(arg.statuses);\n\n arg.pageCoords = extend({}, interaction.startCoords.page);\n interaction.modifierResult = modifiers.setAll(arg);\n },\n};\n\nInteraction.signals.on('new', function (interaction) {\n interaction.startOffset = { left: 0, right: 0, top: 0, bottom: 0 };\n interaction.modifierOffsets = {};\n interaction.modifierStatuses = modifiers.resetStatuses({});\n interaction.modifierResult = null;\n});\n\nInteraction.signals.on('action-start' , modifiers.start);\nInteraction.signals.on('action-resume', modifiers.start);\n\nInteraction.signals.on('before-action-move', function ({ interaction, preEnd, interactingBeforeMove }) {\n const modifierResult = modifiers.setAll({\n interaction,\n preEnd,\n pageCoords: interaction.curCoords.page,\n statuses: interaction.modifierStatuses,\n requireEndOnly: false,\n });\n\n // don't fire an action move if a modifier would keep the event in the same\n // cordinates as before\n if (!modifierResult.shouldMove && interactingBeforeMove) {\n interaction._dontFireMove = true;\n }\n\n interaction.modifierResult = modifierResult;\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n for (let i = 0; i < modifiers.names.length; i++) {\n const options = interaction.target.options[interaction.prepared.name][modifiers.names[i]];\n\n // if the endOnly option is true for any modifier\n if (shouldDo(options, true, true)) {\n // fire a move event at the modified coordinates\n interaction.doMove({ event, preEnd: true });\n break;\n }\n }\n});\n\nInteractEvent.signals.on('set-xy', function (arg) {\n const { iEvent, interaction } = arg;\n const modifierArg = extend({}, arg);\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n modifierArg.options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!modifierArg.options) {\n continue;\n }\n\n const modifier = modifiers[modifierName];\n\n modifierArg.status = interaction.modifierStatuses[modifierName];\n\n iEvent[modifierName] = modifier.modifyCoords(modifierArg);\n }\n});\n\nfunction shouldDo (options, preEnd, requireEndOnly) {\n return (options && options.enabled\n && (preEnd || !options.endOnly)\n && (!requireEndOnly || options.endOnly));\n}\n\nmodule.exports = modifiers;\n","const modifiers = require('./index');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst restrict = {\n defaults: {\n enabled : false,\n endOnly : false,\n restriction: null,\n elementRect: null,\n },\n\n setOffset: function ({ rect, startOffset, options }) {\n const elementRect = options && options.elementRect;\n const offset = {};\n\n if (rect && elementRect) {\n offset.left = startOffset.left - (rect.width * elementRect.left);\n offset.top = startOffset.top - (rect.height * elementRect.top);\n\n offset.right = startOffset.right - (rect.width * (1 - elementRect.right));\n offset.bottom = startOffset.bottom - (rect.height * (1 - elementRect.bottom));\n }\n else {\n offset.left = offset.top = offset.right = offset.bottom = 0;\n }\n\n return offset;\n },\n\n set: function ({ pageCoords, interaction, status, options }) {\n if (!options) { return status; }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n\n const restriction = getRestrictionRect(options.restriction, interaction, page);\n\n if (!restriction) { return status; }\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n const rect = restriction;\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n const offset = interaction.modifierOffsets.restrict;\n\n // object is assumed to have\n // x, y, width, height or\n // left, top, right, bottom\n if ('x' in restriction && 'y' in restriction) {\n modifiedX = Math.max(Math.min(rect.x + rect.width - offset.right , page.x), rect.x + offset.left);\n modifiedY = Math.max(Math.min(rect.y + rect.height - offset.bottom, page.y), rect.y + offset.top );\n }\n else {\n modifiedX = Math.max(Math.min(rect.right - offset.right , page.x), rect.left + offset.left);\n modifiedY = Math.max(Math.min(rect.bottom - offset.bottom, page.y), rect.top + offset.top );\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const elementRect = options && options.elementRect;\n\n if (options && options.enabled\n && !(phase === 'start' && elementRect && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n getRestrictionRect,\n};\n\nfunction getRestrictionRect (value, interaction, page) {\n if (utils.is.function(value)) {\n return utils.resolveRectLike(value, interaction.target, interaction.element, [page.x, page.y, interaction]);\n } else {\n return utils.resolveRectLike(value, interaction.target, interaction.element);\n }\n}\n\nmodifiers.restrict = restrict;\nmodifiers.names.push('restrict');\n\ndefaultOptions.perAction.restrict = restrict.defaults;\n\nmodule.exports = restrict;\n","// This module adds the options.resize.restrictEdges setting which sets min and\n// max for the top, left, bottom and right edges of the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictEdges: {\n// inner: { top: 200, left: 200, right: 400, bottom: 400 },\n// outer: { top: 0, left: 0, right: 600, bottom: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst { getRestrictionRect } = require('./restrict');\n\nconst noInner = { top: +Infinity, left: +Infinity, bottom: -Infinity, right: -Infinity };\nconst noOuter = { top: -Infinity, left: -Infinity, bottom: +Infinity, right: +Infinity };\n\nconst restrictEdges = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n offset: null,\n },\n\n setOffset: function ({ interaction, startOffset, options }) {\n if (!options) {\n return utils.extend({}, startOffset);\n }\n\n const offset = getRestrictionRect(options.offset, interaction, interaction.startCoords.page);\n\n if (offset) {\n return {\n top: startOffset.top + offset.y,\n left: startOffset.left + offset.x,\n bottom: startOffset.bottom + offset.y,\n right: startOffset.right + offset.x,\n };\n }\n\n return startOffset;\n },\n\n set: function ({ pageCoords, interaction, status, offset, options }) {\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n const inner = rectUtils.xywhToTlbr(getRestrictionRect(options.inner, interaction, page)) || noInner;\n const outer = rectUtils.xywhToTlbr(getRestrictionRect(options.outer, interaction, page)) || noOuter;\n\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n if (edges.top) {\n modifiedY = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top);\n }\n else if (edges.bottom) {\n modifiedY = Math.max(Math.min(outer.bottom - offset.bottom, page.y), inner.bottom - offset.bottom);\n }\n if (edges.left) {\n modifiedX = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left);\n }\n else if (edges.right) {\n modifiedX = Math.max(Math.min(outer.right - offset.right, page.x), inner.right - offset.right);\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n if (options && options.enabled\n && !(phase === 'start' && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n noInner,\n noOuter,\n getRestrictionRect,\n};\n\nmodifiers.restrictEdges = restrictEdges;\nmodifiers.names.push('restrictEdges');\n\ndefaultOptions.perAction.restrictEdges = restrictEdges.defaults;\nresize.defaults.restrictEdges = restrictEdges.defaults;\n\nmodule.exports = restrictEdges;\n","// This module adds the options.resize.restrictSize setting which sets min and\n// max width and height for the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictSize: {\n// min: { width: -600, height: -600 },\n// max: { width: 600, height: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst restrictEdges = require('./restrictEdges');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst noMin = { width: -Infinity, height: -Infinity };\nconst noMax = { width: +Infinity, height: +Infinity };\n\nconst restrictSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n },\n\n setOffset: function ({ interaction }) {\n return interaction.startOffset;\n },\n\n set: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const rect = rectUtils.xywhToTlbr(interaction.resizeRects.inverted);\n\n const minSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.min, interaction)) || noMin;\n const maxSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.max, interaction)) || noMax;\n\n arg.options = {\n enabled: options.enabled,\n endOnly: options.endOnly,\n inner: utils.extend({}, restrictEdges.noInner),\n outer: utils.extend({}, restrictEdges.noOuter),\n };\n\n if (edges.top) {\n arg.options.inner.top = rect.bottom - minSize.height;\n arg.options.outer.top = rect.bottom - maxSize.height;\n }\n else if (edges.bottom) {\n arg.options.inner.bottom = rect.top + minSize.height;\n arg.options.outer.bottom = rect.top + maxSize.height;\n }\n if (edges.left) {\n arg.options.inner.left = rect.right - minSize.width;\n arg.options.outer.left = rect.right - maxSize.width;\n }\n else if (edges.right) {\n arg.options.inner.right = rect.left + minSize.width;\n arg.options.outer.right = rect.left + maxSize.width;\n }\n\n restrictEdges.set(arg);\n },\n\n modifyCoords: restrictEdges.modifyCoords,\n};\n\nmodifiers.restrictSize = restrictSize;\nmodifiers.names.push('restrictSize');\n\ndefaultOptions.perAction.restrictSize = restrictSize.defaults;\nresize.defaults.restrictSize = restrictSize.defaults;\n\nmodule.exports = restrictSize;\n","const modifiers = require('./index');\nconst interact = require('../interact');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst snap = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n\n relativePoints: null,\n },\n\n setOffset: function ({ interaction, interactable, element, rect, startOffset, options }) {\n const offsets = [];\n const optionsOrigin = utils.rectToXY(utils.resolveRectLike(options.origin));\n const origin = optionsOrigin || utils.getOriginXY(interactable, element, interaction.prepared.name);\n options = options || interactable.options[interaction.prepared.name].snap || {};\n\n let snapOffset;\n\n if (options.offset === 'startCoords') {\n snapOffset = {\n x: interaction.startCoords.page.x - origin.x,\n y: interaction.startCoords.page.y - origin.y,\n };\n }\n else {\n const offsetRect = utils.resolveRectLike(options.offset, interactable, element, [interaction]);\n\n snapOffset = utils.rectToXY(offsetRect) || { x: 0, y: 0 };\n }\n\n if (rect && options.relativePoints && options.relativePoints.length) {\n for (const { x: relativeX, y: relativeY } of options.relativePoints) {\n offsets.push({\n x: startOffset.left - (rect.width * relativeX) + snapOffset.x,\n y: startOffset.top - (rect.height * relativeY) + snapOffset.y,\n });\n }\n }\n else {\n offsets.push(snapOffset);\n }\n\n return offsets;\n },\n\n set: function ({ interaction, pageCoords, status, options, offset: offsets }) {\n const targets = [];\n let target;\n let page;\n let i;\n\n if (status.useStatusXY) {\n page = { x: status.x, y: status.y };\n }\n else {\n const origin = utils.getOriginXY(interaction.target, interaction.element, interaction.prepared.name);\n\n page = utils.extend({}, pageCoords);\n\n page.x -= origin.x;\n page.y -= origin.y;\n }\n\n status.realX = page.x;\n status.realY = page.y;\n\n let len = options.targets? options.targets.length : 0;\n\n for (const { x: offsetX, y: offsetY } of offsets) {\n const relativeX = page.x - offsetX;\n const relativeY = page.y - offsetY;\n\n for (const snapTarget of options.targets) {\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n targets.push({\n x: utils.is.number(target.x) ? (target.x + offsetX) : relativeX,\n y: utils.is.number(target.y) ? (target.y + offsetY) : relativeY,\n\n range: utils.is.number(target.range)? target.range: options.range,\n });\n }\n }\n\n const closest = {\n target: null,\n inRange: false,\n distance: 0,\n range: 0,\n dx: 0,\n dy: 0,\n };\n\n for (i = 0, len = targets.length; i < len; i++) {\n target = targets[i];\n\n const range = target.range;\n const dx = target.x - page.x;\n const dy = target.y - page.y;\n const distance = utils.hypot(dx, dy);\n let inRange = distance <= range;\n\n // Infinite targets count as being out of range\n // compared to non infinite ones that are in range\n if (range === Infinity && closest.inRange && closest.range !== Infinity) {\n inRange = false;\n }\n\n if (!closest.target || (inRange\n // is the closest target in range?\n ? (closest.inRange && range !== Infinity\n // the pointer is relatively deeper in this target\n ? distance / range < closest.distance / closest.range\n // this target has Infinite range and the closest doesn't\n : (range === Infinity && closest.range !== Infinity)\n // OR this target is closer that the previous closest\n || distance < closest.distance)\n // The other is not in range and the pointer is closer to this target\n : (!closest.inRange && distance < closest.distance))) {\n\n closest.target = target;\n closest.distance = distance;\n closest.range = range;\n closest.inRange = inRange;\n closest.dx = dx;\n closest.dy = dy;\n\n status.range = range;\n }\n }\n\n let snapChanged;\n\n if (closest.target) {\n snapChanged = (status.modifiedX !== closest.target.x || status.modifiedY !== closest.target.y);\n\n status.modifiedX = closest.target.x;\n status.modifiedY = closest.target.y;\n }\n else {\n snapChanged = true;\n\n status.modifiedX = NaN;\n status.modifiedY = NaN;\n }\n\n status.dx = closest.dx;\n status.dy = closest.dy;\n\n status.changed = (snapChanged || (closest.inRange && !status.locked));\n status.locked = closest.inRange;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const relativePoints = options && options.relativePoints;\n\n if (options && options.enabled\n && !(phase === 'start' && relativePoints && relativePoints.length)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n }\n\n return {\n range : status.range,\n locked : status.locked,\n x : status.modifiedX,\n y : status.modifiedY,\n realX : status.realX,\n realY : status.realY,\n dx : status.dx,\n dy : status.dy,\n };\n }\n },\n};\n\ninteract.createSnapGrid = function (grid) {\n return function (x, y) {\n const limits = grid.limits || {\n left : -Infinity,\n right : Infinity,\n top : -Infinity,\n bottom: Infinity,\n };\n let offsetX = 0;\n let offsetY = 0;\n\n if (utils.is.object(grid.offset)) {\n offsetX = grid.offset.x;\n offsetY = grid.offset.y;\n }\n\n const gridx = Math.round((x - offsetX) / grid.x);\n const gridy = Math.round((y - offsetY) / grid.y);\n\n const newX = Math.max(limits.left, Math.min(limits.right , gridx * grid.x + offsetX));\n const newY = Math.max(limits.top , Math.min(limits.bottom, gridy * grid.y + offsetY));\n\n return {\n x: newX,\n y: newY,\n range: grid.range,\n };\n };\n};\n\nmodifiers.snap = snap;\nmodifiers.names.push('snap');\n\ndefaultOptions.perAction.snap = snap.defaults;\n\nmodule.exports = snap;\n","// This module allows snapping of the size of targets during resize\n// interactions.\n\nconst modifiers = require('./index');\nconst snap = require('./snap');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\nconst utils = require('../utils/');\n\nconst snapSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n },\n\n setOffset: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.edges;\n\n if (!edges) { return; }\n\n arg.options = {\n relativePoints: [{\n x: edges.left? 0 : 1,\n y: edges.top ? 0 : 1,\n }],\n origin: { x: 0, y: 0 },\n offset: 'self',\n range: options.range,\n };\n\n const offsets = snap.setOffset(arg);\n arg.options = options;\n\n return offsets;\n },\n\n set: function (arg) {\n const { interaction, options, offset, pageCoords } = arg;\n const page = utils.extend({}, pageCoords);\n const relativeX = page.x - offset[0].x;\n const relativeY = page.y - offset[0].y;\n\n arg.options = utils.extend({}, options);\n arg.options.targets = [];\n\n for (const snapTarget of options.targets) {\n let target;\n\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n if ('width' in target && 'height' in target) {\n target.x = target.width;\n target.y = target.height;\n }\n\n arg.options.targets.push(target);\n }\n\n snap.set(arg);\n },\n\n modifyCoords: function (arg) {\n const { options } = arg;\n\n arg.options = utils.extend({}, options);\n arg.options.enabled = options.enabled;\n arg.options.relativePoints = [null];\n\n snap.modifyCoords(arg);\n },\n};\n\nmodifiers.snapSize = snapSize;\nmodifiers.names.push('snapSize');\n\ndefaultOptions.perAction.snapSize = snapSize.defaults;\nresize.defaults.snapSize = snapSize.defaults;\n\nmodule.exports = snapSize;\n","const pointerUtils = require('../utils/pointerUtils');\n\nmodule.exports = class PointerEvent {\n constructor (type, pointer, event, eventTarget, interaction) {\n pointerUtils.pointerExtend(this, event);\n\n if (event !== pointer) {\n pointerUtils.pointerExtend(this, pointer);\n }\n\n this.interaction = interaction;\n\n this.timeStamp = new Date().getTime();\n this.originalEvent = event;\n this.type = type;\n this.pointerId = pointerUtils.getPointerId(pointer);\n this.pointerType = pointerUtils.getPointerType(pointer, interaction);\n this.target = eventTarget;\n this.currentTarget = null;\n\n if (type === 'tap') {\n const pointerIndex = interaction.getPointerIndex(pointer);\n this.dt = this.timeStamp - interaction.downTimes[pointerIndex];\n\n const interval = this.timeStamp - interaction.tapTime;\n\n this.double = !!(interaction.prevTap\n && interaction.prevTap.type !== 'doubletap'\n && interaction.prevTap.target === this.target\n && interval < 500);\n }\n else if (type === 'doubletap') {\n this.dt = pointer.timeStamp - interaction.tapTime;\n }\n }\n\n subtractOrigin ({ x: originX, y: originY }) {\n this.pageX -= originX;\n this.pageY -= originY;\n this.clientX -= originX;\n this.clientY -= originY;\n\n return this;\n }\n\n addOrigin ({ x: originX, y: originY }) {\n this.pageX += originX;\n this.pageY += originY;\n this.clientX += originX;\n this.clientY += originY;\n\n return this;\n }\n\n preventDefault () {\n this.originalEvent.preventDefault();\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n};\n","const PointerEvent = require('./PointerEvent');\nconst Interaction = require('../Interaction');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst defaults = require('../defaultOptions');\nconst signals = require('../utils/Signals').new();\nconst { filter } = require('../utils/arr');\n\nconst simpleSignals = [ 'down', 'up', 'cancel' ];\nconst simpleEvents = [ 'down', 'up', 'cancel' ];\n\nconst pointerEvents = {\n PointerEvent,\n fire,\n collectEventTargets,\n signals,\n defaults: {\n holdDuration: 600,\n ignoreFrom : null,\n allowFrom : null,\n origin : { x: 0, y: 0 },\n },\n types: [\n 'down',\n 'move',\n 'up',\n 'cancel',\n 'tap',\n 'doubletap',\n 'hold',\n ],\n};\n\nfunction fire (arg) {\n const {\n interaction, pointer, event, eventTarget,\n type = arg.pointerEvent.type,\n targets = collectEventTargets(arg),\n pointerEvent = new PointerEvent(type, pointer, event, eventTarget, interaction),\n } = arg;\n\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n targets,\n type,\n pointerEvent,\n };\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n\n for (const prop in target.props || {}) {\n pointerEvent[prop] = target.props[prop];\n }\n\n const origin = utils.getOriginXY(target.eventable, target.element);\n\n pointerEvent.subtractOrigin(origin);\n pointerEvent.eventable = target.eventable;\n pointerEvent.currentTarget = target.element;\n\n target.eventable.fire(pointerEvent);\n\n pointerEvent.addOrigin(origin);\n\n if (pointerEvent.immediatePropagationStopped\n || (pointerEvent.propagationStopped\n && (i + 1) < targets.length && targets[i + 1].element !== pointerEvent.currentTarget)) {\n break;\n }\n }\n\n signals.fire('fired', signalArg);\n\n if (type === 'tap') {\n // if pointerEvent should make a double tap, create and fire a doubletap\n // PointerEvent and use that as the prevTap\n const prevTap = pointerEvent.double\n ? fire({\n interaction, pointer, event, eventTarget,\n type: 'doubletap',\n })\n : pointerEvent;\n\n interaction.prevTap = prevTap;\n interaction.tapTime = prevTap.timeStamp;\n }\n\n return pointerEvent;\n}\n\nfunction collectEventTargets ({ interaction, pointer, event, eventTarget, type }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n // do not fire a tap event if the pointer was moved before being lifted\n if (type === 'tap' && (interaction.pointerWasMoved\n // or if the pointerup target is different to the pointerdown target\n || !(interaction.downTargets[pointerIndex] && interaction.downTargets[pointerIndex] === eventTarget))) {\n return [];\n }\n\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n path,\n targets: [],\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (type === 'hold') {\n signalArg.targets = filter(signalArg.targets, target =>\n target.eventable.options.holdDuration === interaction.holdTimers[pointerIndex].duration);\n }\n\n return signalArg.targets;\n}\n\nInteraction.signals.on('update-pointer-down', function ({ interaction, pointerIndex }) {\n interaction.holdTimers[pointerIndex] = { duration: Infinity, timeout: null };\n});\n\nInteraction.signals.on('remove-pointer', function ({ interaction, pointerIndex }) {\n interaction.holdTimers.splice(pointerIndex, 1);\n});\n\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget, duplicateMove }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n if (!duplicateMove && (!interaction.pointerIsDown || interaction.pointerWasMoved)) {\n if (interaction.pointerIsDown) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n\n fire({\n interaction, pointer, event, eventTarget,\n type: 'move',\n });\n }\n});\n\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget, pointerIndex }) {\n // copy event to be used in timeout for IE8\n const eventCopy = browser.isIE8? utils.extend({}, event) : event;\n\n const timer = interaction.holdTimers[pointerIndex];\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'hold',\n targets: [],\n path,\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (!signalArg.targets.length) { return; }\n\n let minDuration = Infinity;\n\n for (let i = 0; i < signalArg.targets.length; i++) {\n const target = signalArg.targets[i];\n const holdDuration = target.eventable.options.holdDuration;\n\n if (holdDuration < minDuration) {\n minDuration = holdDuration;\n }\n }\n\n timer.duration = minDuration;\n timer.timeout = setTimeout(function () {\n fire({\n interaction, eventCopy, eventTarget,\n pointer: browser.isIE8? eventCopy : pointer,\n type: 'hold',\n });\n }, minDuration);\n});\n\nInteraction.signals.on('up', ({ interaction, pointer, event, eventTarget }) => {\n if (!interaction.pointerWasMoved) {\n fire({ interaction, eventTarget, pointer, event, type: 'tap' });\n }\n});\n\n['up', 'cancel'].forEach(function (signalName) {\n Interaction.signals.on(signalName, function ({ interaction, pointerIndex }) {\n if (interaction.holdTimers[pointerIndex]) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n });\n});\n\nfunction createSignalListener (type) {\n return function ({ interaction, pointer, event, eventTarget }) {\n fire({ interaction, eventTarget, pointer, event, type });\n };\n}\n\nfor (let i = 0; i < simpleSignals.length; i++) {\n Interaction.signals.on(simpleSignals[i], createSignalListener(simpleEvents[i]));\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.prevTap = null; // the most recent tap event on this interaction\n interaction.tapTime = 0; // time of the most recent tap event\n interaction.holdTimers = []; // [{ duration, timeout }]\n});\n\ndefaults.pointerEvents = pointerEvents.defaults;\nmodule.exports = pointerEvents;\n","const pointerEvents = require('./base');\nconst Interaction = require('../Interaction');\n\npointerEvents.signals.on('new', onNew);\npointerEvents.signals.on('fired', onFired);\n\nfor (const signal of ['move', 'up', 'cancel', 'endall']) {\n Interaction.signals.on(signal, endHoldRepeat);\n}\n\nfunction onNew ({ pointerEvent }) {\n if (pointerEvent.type !== 'hold') { return; }\n\n pointerEvent.count = (pointerEvent.count || 0) + 1;\n}\n\nfunction onFired ({ interaction, pointerEvent, eventTarget, targets }) {\n if (pointerEvent.type !== 'hold' || !targets.length) { return; }\n\n // get the repeat interval from the first eventable\n const interval = targets[0].eventable.options.holdRepeatInterval;\n\n // don't repeat if the interval is 0 or less\n if (interval <= 0) { return; }\n\n // set a timeout to fire the holdrepeat event\n interaction.holdIntervalHandle = setTimeout(function () {\n pointerEvents.fire({\n interaction,\n eventTarget,\n type: 'hold',\n pointer: pointerEvent,\n event: pointerEvent,\n });\n }, interval);\n}\n\nfunction endHoldRepeat ({ interaction }) {\n // set the interaction's holdStopTime property\n // to stop further holdRepeat events\n if (interaction.holdIntervalHandle) {\n clearInterval(interaction.holdIntervalHandle);\n interaction.holdIntervalHandle = null;\n }\n}\n\n// don't repeat by default\npointerEvents.defaults.holdRepeatInterval = 0;\npointerEvents.types.push('holdrepeat');\n\nmodule.exports = {\n onNew,\n onFired,\n endHoldRepeat,\n};\n","const pointerEvents = require('./base');\nconst Interactable = require('../Interactable');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\nconst scope = require('../scope');\nconst extend = require('../utils/extend');\nconst { merge } = require('../utils/arr');\n\npointerEvents.signals.on('collect-targets', function ({ targets, element, type, eventTarget }) {\n function collectSelectors (interactable, selector, context) {\n const els = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && is.element(element)\n && domUtils.matchesSelector(element, selector, els)\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n const interactable = scope.interactables.get(element);\n\n if (interactable) {\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n scope.interactables.forEachSelector(collectSelectors, element);\n});\n\nInteractable.signals.on('new', function ({ interactable }) {\n interactable.events.getRect = function (element) {\n return interactable.getRect(element);\n };\n});\n\nInteractable.signals.on('set', function ({ interactable, options }) {\n extend(interactable.events.options, pointerEvents.defaults);\n extend(interactable.events.options, options);\n});\n\nmerge(Interactable.eventTypes, pointerEvents.types);\n\nInteractable.prototype.pointerEvents = function (options) {\n extend(this.events.options, options);\n\n return this;\n};\n\nconst __backCompatOption = Interactable.prototype._backCompatOption;\n\nInteractable.prototype._backCompatOption = function (optionName, newValue) {\n const ret = __backCompatOption.call(this, optionName, newValue);\n\n if (ret === this) {\n this.events.options[optionName] = newValue;\n }\n\n return ret;\n};\n\nInteractable.settingsMethods.push('pointerEvents');\n","const utils = require('./utils');\nconst events = require('./utils/events');\nconst signals = require('./utils/Signals').new();\n\nconst scope = {\n signals,\n events,\n utils,\n\n // main document\n document: require('./utils/domObjects').document,\n // all documents being listened to\n documents: [],\n\n addDocument: function (doc, win) {\n // do nothing if document is already known\n if (utils.contains(scope.documents, doc)) { return false; }\n\n win = win || scope.getWindow(doc);\n\n scope.documents.push(doc);\n events.documents.push(doc);\n\n // don't add an unload event for the main document\n // so that the page may be cached in browser history\n if (doc !== scope.document) {\n events.add(win, 'unload', scope.onWindowUnload);\n }\n\n signals.fire('add-document', { doc, win });\n },\n\n removeDocument: function (doc, win) {\n const index = utils.indexOf(scope.documents, doc);\n\n win = win || scope.getWindow(doc);\n\n events.remove(win, 'unload', scope.onWindowUnload);\n\n scope.documents.splice(index, 1);\n events.documents.splice(index, 1);\n\n signals.fire('remove-document', { win, doc });\n },\n\n onWindowUnload: function () {\n scope.removeDocument(this.document, this);\n },\n};\n\nmodule.exports = scope;\n","const { indexOf } = require('./arr');\n\nclass Signals {\n constructor () {\n this.listeners = {\n // signalName: [listeners],\n };\n }\n\n on (name, listener) {\n if (!this.listeners[name]) {\n this.listeners[name] = [listener];\n return;\n }\n\n this.listeners[name].push(listener);\n }\n\n off (name, listener) {\n if (!this.listeners[name]) { return; }\n\n const index = indexOf(this.listeners[name], listener);\n\n if (index !== -1) {\n this.listeners[name].splice(index, 1);\n }\n }\n\n fire (name, arg) {\n const targetListeners = this.listeners[name];\n\n if (!targetListeners) { return; }\n\n for (let i = 0; i < targetListeners.length; i++) {\n if (targetListeners[i](arg, name) === false) {\n return;\n }\n }\n }\n}\n\nSignals.new = function () {\n return new Signals();\n};\n\nmodule.exports = Signals;\n","function indexOf (array, target) {\n for (let i = 0, len = array.length; i < len; i++) {\n if (array[i] === target) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction contains (array, target) {\n return indexOf(array, target) !== -1;\n}\n\nfunction merge (target, source) {\n for (let i = 0; i < source.length; i++) {\n target.push(source[i]);\n }\n\n return target;\n}\n\nfunction filter (array, test) {\n const result = [];\n\n for (let i = 0; i < array.length; i++) {\n if (test(array[i])) {\n result.push(array[i]);\n }\n }\n\n return result;\n}\n\nmodule.exports = {\n indexOf,\n contains,\n merge,\n filter,\n};\n","const { window } = require('./window');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst Element = domObjects.Element;\nconst navigator = window.navigator;\n\nconst browser = {\n // Does the browser support touch input?\n supportsTouch: !!(('ontouchstart' in window) || is.function(window.DocumentTouch)\n && domObjects.document instanceof window.DocumentTouch),\n\n // Does the browser support PointerEvents\n supportsPointerEvent: !!domObjects.PointerEvent,\n\n isIE8: ('attachEvent' in window) && !('addEventListener' in window),\n\n // Opera Mobile must be handled differently\n isOperaMobile: (navigator.appName === 'Opera'\n && browser.supportsTouch\n && navigator.userAgent.match('Presto')),\n\n // scrolling doesn't change the result of getClientRects on iOS 7\n isIOS7: (/iP(hone|od|ad)/.test(navigator.platform)\n && /OS 7[^\\d]/.test(navigator.appVersion)),\n\n isIe9OrOlder: /MSIE (8|9)/.test(navigator.userAgent),\n\n // prefix matchesSelector\n prefixedMatchesSelector: 'matches' in Element.prototype\n ? 'matches': 'webkitMatchesSelector' in Element.prototype\n ? 'webkitMatchesSelector': 'mozMatchesSelector' in Element.prototype\n ? 'mozMatchesSelector': 'oMatchesSelector' in Element.prototype\n ? 'oMatchesSelector': 'msMatchesSelector',\n\n useMatchesSelectorPolyfill: false,\n\n pEventTypes: (domObjects.PointerEvent\n ? (domObjects.PointerEvent === window.MSPointerEvent\n ? {\n up: 'MSPointerUp',\n down: 'MSPointerDown',\n over: 'mouseover',\n out: 'mouseout',\n move: 'MSPointerMove',\n cancel: 'MSPointerCancel',\n }\n : {\n up: 'pointerup',\n down: 'pointerdown',\n over: 'pointerover',\n out: 'pointerout',\n move: 'pointermove',\n cancel: 'pointercancel',\n })\n : null),\n\n // because Webkit and Opera still use 'mousewheel' event type\n wheelEvent: 'onmousewheel' in domObjects.document? 'mousewheel': 'wheel',\n\n};\n\nbrowser.useMatchesSelectorPolyfill = !is.function(Element.prototype[browser.prefixedMatchesSelector]);\n\nmodule.exports = browser;\n","const domObjects = {};\nconst win = require('./window').window;\n\nfunction blank () {}\n\ndomObjects.document = win.document;\ndomObjects.DocumentFragment = win.DocumentFragment || blank;\ndomObjects.SVGElement = win.SVGElement || blank;\ndomObjects.SVGSVGElement = win.SVGSVGElement || blank;\ndomObjects.SVGElementInstance = win.SVGElementInstance || blank;\ndomObjects.Element = win.Element || blank;\ndomObjects.HTMLElement = win.HTMLElement || domObjects.Element;\n\ndomObjects.Event = win.Event;\ndomObjects.Touch = win.Touch || blank;\ndomObjects.PointerEvent = (win.PointerEvent || win.MSPointerEvent);\n\nmodule.exports = domObjects;\n","const win = require('./window');\nconst browser = require('./browser');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst domUtils = {\n nodeContains: function (parent, child) {\n while (child) {\n if (child === parent) {\n return true;\n }\n\n child = child.parentNode;\n }\n\n return false;\n },\n\n closest: function (element, selector) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) { return element; }\n\n element = domUtils.parentNode(element);\n }\n\n return null;\n },\n\n parentNode: function (node) {\n let parent = node.parentNode;\n\n if (is.docFrag(parent)) {\n // skip past #shado-root fragments\n while ((parent = parent.host) && is.docFrag(parent)) {\n continue;\n }\n\n return parent;\n }\n\n return parent;\n },\n\n // taken from http://tanalin.com/en/blog/2012/12/matches-selector-ie8/ and modified\n matchesSelectorPolyfill: browser.useMatchesSelectorPolyfill\n ? function (element, selector, elems) {\n elems = elems || element.parentNode.querySelectorAll(selector);\n\n for (let i = 0, len = elems.length; i < len; i++) {\n if (elems[i] === element) {\n return true;\n }\n }\n\n return false;\n }\n : null,\n\n matchesSelector: function (element, selector, nodeList) {\n if (browser.useMatchesSelectorPolyfill) {\n return domUtils.matchesSelectorPolyfill(element, selector, nodeList);\n }\n\n // remove /deep/ from selectors if shadowDOM polyfill is used\n if (win.window !== win.realWindow) {\n selector = selector.replace(/\\/deep\\//g, ' ');\n }\n\n return element[browser.prefixedMatchesSelector](selector);\n },\n\n // Test for the element that's \"above\" all other qualifiers\n indexOfDeepestElement: function (elements) {\n let deepestZoneParents = [];\n let dropzoneParents = [];\n let dropzone;\n let deepestZone = elements[0];\n let index = deepestZone? 0: -1;\n let parent;\n let child;\n let i;\n let n;\n\n for (i = 1; i < elements.length; i++) {\n dropzone = elements[i];\n\n // an element might belong to multiple selector dropzones\n if (!dropzone || dropzone === deepestZone) {\n continue;\n }\n\n if (!deepestZone) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n // check if the deepest or current are document.documentElement or document.rootElement\n // - if the current dropzone is, do nothing and continue\n if (dropzone.parentNode === dropzone.ownerDocument) {\n continue;\n }\n // - if deepest is, update with the current dropzone and continue to next\n else if (deepestZone.parentNode === dropzone.ownerDocument) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n if (!deepestZoneParents.length) {\n parent = deepestZone;\n while (parent.parentNode && parent.parentNode !== parent.ownerDocument) {\n deepestZoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n }\n\n // if this element is an svg element and the current deepest is\n // an HTMLElement\n if (deepestZone instanceof domObjects.HTMLElement\n && dropzone instanceof domObjects.SVGElement\n && !(dropzone instanceof domObjects.SVGSVGElement)) {\n\n if (dropzone === deepestZone.parentNode) {\n continue;\n }\n\n parent = dropzone.ownerSVGElement;\n }\n else {\n parent = dropzone;\n }\n\n dropzoneParents = [];\n\n while (parent.parentNode !== parent.ownerDocument) {\n dropzoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n\n n = 0;\n\n // get (position of last common ancestor) + 1\n while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) {\n n++;\n }\n\n const parents = [\n dropzoneParents[n - 1],\n dropzoneParents[n],\n deepestZoneParents[n],\n ];\n\n child = parents[0].lastChild;\n\n while (child) {\n if (child === parents[1]) {\n deepestZone = dropzone;\n index = i;\n deepestZoneParents = [];\n\n break;\n }\n else if (child === parents[2]) {\n break;\n }\n\n child = child.previousSibling;\n }\n }\n\n return index;\n },\n\n matchesUpTo: function (element, selector, limit) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) {\n return true;\n }\n\n element = domUtils.parentNode(element);\n\n if (element === limit) {\n return domUtils.matchesSelector(element, selector);\n }\n }\n\n return false;\n },\n\n getActualElement: function (element) {\n return (element instanceof domObjects.SVGElementInstance\n ? element.correspondingUseElement\n : element);\n },\n\n getScrollXY: function (relevantWindow) {\n relevantWindow = relevantWindow || win.window;\n return {\n x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft,\n y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop,\n };\n },\n\n getElementClientRect: function (element) {\n const clientRect = (element instanceof domObjects.SVGElement\n ? element.getBoundingClientRect()\n : element.getClientRects()[0]);\n\n return clientRect && {\n left : clientRect.left,\n right : clientRect.right,\n top : clientRect.top,\n bottom: clientRect.bottom,\n width : clientRect.width || clientRect.right - clientRect.left,\n height: clientRect.height || clientRect.bottom - clientRect.top,\n };\n },\n\n getElementRect: function (element) {\n const clientRect = domUtils.getElementClientRect(element);\n\n if (!browser.isIOS7 && clientRect) {\n const scroll = domUtils.getScrollXY(win.getWindow(element));\n\n clientRect.left += scroll.x;\n clientRect.right += scroll.x;\n clientRect.top += scroll.y;\n clientRect.bottom += scroll.y;\n }\n\n return clientRect;\n },\n\n getPath: function (element) {\n const path = [];\n\n while (element) {\n path.push(element);\n element = domUtils.parentNode(element);\n }\n\n return path;\n },\n\n trySelector: value => {\n if (!is.string(value)) { return false; }\n\n // an exception will be raised if it is invalid\n domObjects.document.querySelector(value);\n return true;\n },\n};\n\nmodule.exports = domUtils;\n","const is = require('./is');\nconst domUtils = require('./domUtils');\nconst pExtend = require('./pointerExtend');\n\nconst { window, getWindow } = require('./window');\nconst { indexOf, contains } = require('./arr');\n\nconst useAttachEvent = ('attachEvent' in window) && !('addEventListener' in window);\nconst addEvent = useAttachEvent? 'attachEvent': 'addEventListener';\nconst removeEvent = useAttachEvent? 'detachEvent': 'removeEventListener';\nconst on = useAttachEvent? 'on': '';\n\nconst elements = [];\nconst targets = [];\nconst attachedListeners = [];\n\n// {\n// type: {\n// selectors: ['selector', ...],\n// contexts : [document, ...],\n// listeners: [[listener, capture, passive], ...]\n// }\n// }\nconst delegatedEvents = {};\n\nconst documents = [];\n\nconst supportsOptions = !useAttachEvent && (() => {\n let supported = false;\n\n window.document.createElement('div').addEventListener('test', null, {\n get capture () { supported = true; },\n });\n\n return supported;\n})();\n\nfunction add (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n let elementIndex = indexOf(elements, element);\n let target = targets[elementIndex];\n\n if (!target) {\n target = {\n events: {},\n typeCount: 0,\n };\n\n elementIndex = elements.push(element) - 1;\n targets.push(target);\n\n attachedListeners.push(useAttachEvent\n ? {\n supplied: [],\n wrapped : [],\n useCount: [],\n }\n : null);\n }\n\n if (!target.events[type]) {\n target.events[type] = [];\n target.typeCount++;\n }\n\n if (!contains(target.events[type], listener)) {\n let ret;\n\n if (useAttachEvent) {\n const { supplied, wrapped, useCount } = attachedListeners[elementIndex];\n const listenerIndex = indexOf(supplied, listener);\n\n const wrappedListener = wrapped[listenerIndex] || function (event) {\n if (!event.immediatePropagationStopped) {\n event.target = event.srcElement;\n event.currentTarget = element;\n\n event.preventDefault = event.preventDefault || preventDef;\n event.stopPropagation = event.stopPropagation || stopProp;\n event.stopImmediatePropagation = event.stopImmediatePropagation || stopImmProp;\n\n if (/mouse|click/.test(event.type)) {\n event.pageX = event.clientX + getWindow(element).document.documentElement.scrollLeft;\n event.pageY = event.clientY + getWindow(element).document.documentElement.scrollTop;\n }\n\n listener(event);\n }\n };\n\n ret = element[addEvent](on + type, wrappedListener, !!options.capture);\n\n if (listenerIndex === -1) {\n supplied.push(listener);\n wrapped.push(wrappedListener);\n useCount.push(1);\n }\n else {\n useCount[listenerIndex]++;\n }\n }\n else {\n ret = element[addEvent](type, listener, supportsOptions? options : !!options.capture);\n }\n target.events[type].push(listener);\n\n return ret;\n }\n}\n\nfunction remove (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const elementIndex = indexOf(elements, element);\n const target = targets[elementIndex];\n\n if (!target || !target.events) {\n return;\n }\n\n let wrappedListener = listener;\n let listeners;\n let listenerIndex;\n\n if (useAttachEvent) {\n listeners = attachedListeners[elementIndex];\n listenerIndex = indexOf(listeners.supplied, listener);\n wrappedListener = listeners.wrapped[listenerIndex];\n }\n\n if (type === 'all') {\n for (type in target.events) {\n if (target.events.hasOwnProperty(type)) {\n remove(element, type, 'all');\n }\n }\n return;\n }\n\n if (target.events[type]) {\n const len = target.events[type].length;\n\n if (listener === 'all') {\n for (let i = 0; i < len; i++) {\n remove(element, type, target.events[type][i], options);\n }\n return;\n }\n else {\n for (let i = 0; i < len; i++) {\n if (target.events[type][i] === listener) {\n element[removeEvent](on + type, wrappedListener, supportsOptions? options : !!options.capture);\n target.events[type].splice(i, 1);\n\n if (useAttachEvent && listeners) {\n listeners.useCount[listenerIndex]--;\n if (listeners.useCount[listenerIndex] === 0) {\n listeners.supplied.splice(listenerIndex, 1);\n listeners.wrapped.splice(listenerIndex, 1);\n listeners.useCount.splice(listenerIndex, 1);\n }\n }\n\n break;\n }\n }\n }\n\n if (target.events[type] && target.events[type].length === 0) {\n target.events[type] = null;\n target.typeCount--;\n }\n }\n\n if (!target.typeCount) {\n targets.splice(elementIndex, 1);\n elements.splice(elementIndex, 1);\n attachedListeners.splice(elementIndex, 1);\n }\n}\n\nfunction addDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n if (!delegatedEvents[type]) {\n delegatedEvents[type] = {\n selectors: [],\n contexts : [],\n listeners: [],\n };\n\n // add delegate listener functions\n for (let i = 0; i < documents.length; i++) {\n add(documents[i], type, delegateListener);\n add(documents[i], type, delegateUseCapture, true);\n }\n }\n\n const delegated = delegatedEvents[type];\n let index;\n\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n break;\n }\n }\n\n if (index === -1) {\n index = delegated.selectors.length;\n\n delegated.selectors.push(selector);\n delegated.contexts .push(context);\n delegated.listeners.push([]);\n }\n\n // keep listener and capture and passive flags\n delegated.listeners[index].push([listener, !!options.capture, options.passive]);\n}\n\nfunction removeDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const delegated = delegatedEvents[type];\n let matchFound = false;\n let index;\n\n if (!delegated) { return; }\n\n // count from last index of delegated to 0\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n // look for matching selector and context Node\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n\n const listeners = delegated.listeners[index];\n\n // each item of the listeners array is an array: [function, capture, passive]\n for (let i = listeners.length - 1; i >= 0; i--) {\n const [fn, capture, passive] = listeners[i];\n\n // check if the listener functions and capture and passive flags match\n if (fn === listener && capture === !!options.capture && passive === options.passive) {\n // remove the listener from the array of listeners\n listeners.splice(i, 1);\n\n // if all listeners for this interactable have been removed\n // remove the interactable from the delegated arrays\n if (!listeners.length) {\n delegated.selectors.splice(index, 1);\n delegated.contexts .splice(index, 1);\n delegated.listeners.splice(index, 1);\n\n // remove delegate function from context\n remove(context, type, delegateListener);\n remove(context, type, delegateUseCapture, true);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegatedEvents[type] = null;\n }\n }\n\n // only remove one listener\n matchFound = true;\n break;\n }\n }\n\n if (matchFound) { break; }\n }\n }\n}\n\n// bound to the interactable context when a DOM event\n// listener is added to a selector interactable\nfunction delegateListener (event, optionalArg) {\n const options = getOptions(optionalArg);\n const fakeEvent = {};\n const delegated = delegatedEvents[event.type];\n const eventTarget = (domUtils.getActualElement(event.path\n ? event.path[0]\n : event.target));\n let element = eventTarget;\n\n // duplicate the event so that currentTarget can be changed\n pExtend(fakeEvent, event);\n\n fakeEvent.originalEvent = event;\n fakeEvent.preventDefault = preventOriginalDefault;\n\n // climb up document tree looking for selector matches\n while (is.element(element)) {\n for (let i = 0; i < delegated.selectors.length; i++) {\n const selector = delegated.selectors[i];\n const context = delegated.contexts[i];\n\n if (domUtils.matchesSelector(element, selector)\n && domUtils.nodeContains(context, eventTarget)\n && domUtils.nodeContains(context, element)) {\n\n const listeners = delegated.listeners[i];\n\n fakeEvent.currentTarget = element;\n\n for (let j = 0; j < listeners.length; j++) {\n const [fn, capture, passive] = listeners[j];\n\n if (capture === !!options.capture && passive === options.passive) {\n fn(fakeEvent);\n }\n }\n }\n }\n\n element = domUtils.parentNode(element);\n }\n}\n\nfunction delegateUseCapture (event) {\n return delegateListener.call(this, event, true);\n}\n\nfunction preventDef () {\n this.returnValue = false;\n}\n\nfunction preventOriginalDefault () {\n this.originalEvent.preventDefault();\n}\n\nfunction stopProp () {\n this.cancelBubble = true;\n}\n\nfunction stopImmProp () {\n this.cancelBubble = true;\n this.immediatePropagationStopped = true;\n}\n\nfunction getOptions (param) {\n return is.object(param)? param : { capture: param };\n}\n\nmodule.exports = {\n add,\n remove,\n\n addDelegate,\n removeDelegate,\n\n delegateListener,\n delegateUseCapture,\n delegatedEvents,\n documents,\n\n useAttachEvent,\n supportsOptions,\n\n _elements: elements,\n _targets: targets,\n _attachedListeners: attachedListeners,\n};\n","module.exports = function extend (dest, source) {\n for (const prop in source) {\n dest[prop] = source[prop];\n }\n return dest;\n};\n","const {\n resolveRectLike,\n rectToXY,\n} = require('./rect');\n\nmodule.exports = function (target, element, action) {\n const actionOptions = target.options[action];\n const actionOrigin = actionOptions && actionOptions.origin;\n const origin = actionOrigin || target.options.origin;\n\n const originRect = resolveRectLike(origin, target, element, [target && element]);\n\n return rectToXY(originRect) || { x: 0, y: 0 };\n};\n","module.exports = (x, y) => Math.sqrt(x * x + y * y);\n","const extend = require('./extend');\nconst win = require('./window');\n\nconst utils = {\n warnOnce: function (method, message) {\n let warned = false;\n\n return function () {\n if (!warned) {\n win.window.console.warn(message);\n warned = true;\n }\n\n return method.apply(this, arguments);\n };\n },\n\n // http://stackoverflow.com/a/5634528/2280888\n _getQBezierValue: function (t, p1, p2, p3) {\n const iT = 1 - t;\n return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3;\n },\n\n getQuadraticCurvePoint: function (startX, startY, cpX, cpY, endX, endY, position) {\n return {\n x: utils._getQBezierValue(position, startX, cpX, endX),\n y: utils._getQBezierValue(position, startY, cpY, endY),\n };\n },\n\n // http://gizma.com/easing/\n easeOutQuad: function (t, b, c, d) {\n t /= d;\n return -c * t*(t-2) + b;\n },\n\n copyAction: function (dest, src) {\n dest.name = src.name;\n dest.axis = src.axis;\n dest.edges = src.edges;\n\n return dest;\n },\n\n is : require('./is'),\n extend : extend,\n hypot : require('./hypot'),\n getOriginXY: require('./getOriginXY'),\n};\n\nextend(utils, require('./arr'));\nextend(utils, require('./domUtils'));\nextend(utils, require('./pointerUtils'));\nextend(utils, require('./rect'));\n\nmodule.exports = utils;\n","const scope = require('../scope');\nconst utils = require('./index');\nconst browser = require('./browser');\n\nconst finder = {\n methodOrder: [ 'simulationResume', 'mouse', 'hasPointer', 'idle' ],\n\n search: function (pointer, eventType, eventTarget) {\n const mouseEvent = (/mouse/i.test(pointer.pointerType || eventType)\n // MSPointerEvent.MSPOINTER_TYPE_MOUSE\n || pointer.pointerType === 4);\n const pointerId = utils.getPointerId(pointer);\n const details = { pointer, pointerId, mouseEvent, eventType, eventTarget };\n\n for (const method of finder.methodOrder) {\n const interaction = finder[method](details);\n\n if (interaction) {\n return interaction;\n }\n }\n },\n\n // try to resume simulation with a new pointer\n simulationResume: function ({ mouseEvent, eventType, eventTarget }) {\n if (!/down|start/i.test(eventType)) {\n return null;\n }\n\n for (const interaction of scope.interactions) {\n let element = eventTarget;\n\n if (interaction.simulation && interaction.simulation.allowResume\n && (interaction.mouse === mouseEvent)) {\n while (element) {\n // if the element is the interaction element\n if (element === interaction.element) {\n return interaction;\n }\n element = utils.parentNode(element);\n }\n }\n }\n\n return null;\n },\n\n // if it's a mouse interaction\n mouse: function ({ pointerId, mouseEvent, eventType }) {\n if (!mouseEvent && (browser.supportsTouch || browser.supportsPointerEvent)) {\n return null;\n }\n\n let firstNonActive;\n\n for (const interaction of scope.interactions) {\n if (interaction.mouse) {\n // if it's a down event, skip interactions with running simulations\n if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; }\n\n // if the interaction is active, return it immediately\n if (interaction.interacting()) {\n return interaction;\n }\n // otherwise save it and look for another active interaction\n else if (!firstNonActive) {\n firstNonActive = interaction;\n }\n }\n }\n\n // if no active mouse interaction was found use the first inactive mouse\n // interaction\n if (firstNonActive) {\n return firstNonActive;\n }\n\n // Find any interaction specifically for mouse.\n // ignore the interaction if the eventType is a mousedown, and a simulation\n // is active\n for (const interaction of scope.interactions) {\n if (interaction.mouse && !(/down/.test(eventType) && interaction.simulation)) {\n return interaction;\n }\n }\n\n return null;\n },\n\n // get interaction that has this pointer\n hasPointer: function ({ pointerId }) {\n for (const interaction of scope.interactions) {\n if (utils.contains(interaction.pointerIds, pointerId)) {\n return interaction;\n }\n }\n },\n\n // get first idle interaction\n idle: function ({ mouseEvent }) {\n for (const interaction of scope.interactions) {\n // if there's already a pointer held down\n if (interaction.pointerIds.length === 1) {\n const target = interaction.target;\n // don't add this pointer if there is a target interactable and it\n // isn't gesturable\n if (target && !target.options.gesture.enabled) {\n continue;\n }\n }\n // maximum of 2 pointers per interaction\n else if (interaction.pointerIds.length >= 2) {\n continue;\n }\n\n if (!interaction.interacting() && (mouseEvent === interaction.mouse)) {\n return interaction;\n }\n }\n\n return null;\n },\n};\n\nmodule.exports = finder;\n","const win = require('./window');\nconst isWindow = require('./isWindow');\n\nconst is = {\n array : () => {},\n\n window : thing => thing === win.window || isWindow(thing),\n\n docFrag : thing => is.object(thing) && thing.nodeType === 11,\n\n object : thing => !!thing && (typeof thing === 'object'),\n\n function: thing => typeof thing === 'function',\n\n number : thing => typeof thing === 'number' ,\n\n bool : thing => typeof thing === 'boolean' ,\n\n string : thing => typeof thing === 'string' ,\n\n element: thing => {\n if (!thing || (typeof thing !== 'object')) { return false; }\n\n const _window = win.getWindow(thing) || win.window;\n\n return (/object|function/.test(typeof _window.Element)\n ? thing instanceof _window.Element //DOM2\n : thing.nodeType === 1 && typeof thing.nodeName === 'string');\n },\n};\n\nis.array = thing => (is.object(thing)\n && (typeof thing.length !== 'undefined')\n && is.function(thing.splice));\n\nmodule.exports = is;\n","module.exports = (thing) => !!(thing && thing.Window) && (thing instanceof thing.Window);\n","function pointerExtend (dest, source) {\n for (const prop in source) {\n const prefixedPropREs = module.exports.prefixedPropREs;\n let deprecated = false;\n\n // skip deprecated prefixed properties\n for (const vendor in prefixedPropREs) {\n if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) {\n deprecated = true;\n break;\n }\n }\n\n if (!deprecated && typeof source[prop] !== 'function') {\n dest[prop] = source[prop];\n }\n }\n return dest;\n}\n\npointerExtend.prefixedPropREs = {\n webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/,\n};\n\nmodule.exports = pointerExtend;\n","const hypot = require('./hypot');\nconst browser = require('./browser');\nconst dom = require('./domObjects');\nconst domUtils = require('./domUtils');\nconst is = require('./is');\nconst pointerExtend = require('./pointerExtend');\n\nconst pointerUtils = {\n copyCoords: function (dest, src) {\n dest.page = dest.page || {};\n dest.page.x = src.page.x;\n dest.page.y = src.page.y;\n\n dest.client = dest.client || {};\n dest.client.x = src.client.x;\n dest.client.y = src.client.y;\n\n dest.timeStamp = src.timeStamp;\n },\n\n setCoordDeltas: function (targetObj, prev, cur) {\n targetObj.page.x = cur.page.x - prev.page.x;\n targetObj.page.y = cur.page.y - prev.page.y;\n targetObj.client.x = cur.client.x - prev.client.x;\n targetObj.client.y = cur.client.y - prev.client.y;\n targetObj.timeStamp = cur.timeStamp - prev.timeStamp;\n\n // set pointer velocity\n const dt = Math.max(targetObj.timeStamp / 1000, 0.001);\n\n targetObj.page.speed = hypot(targetObj.page.x, targetObj.page.y) / dt;\n targetObj.page.vx = targetObj.page.x / dt;\n targetObj.page.vy = targetObj.page.y / dt;\n\n targetObj.client.speed = hypot(targetObj.client.x, targetObj.page.y) / dt;\n targetObj.client.vx = targetObj.client.x / dt;\n targetObj.client.vy = targetObj.client.y / dt;\n },\n\n isNativePointer: function (pointer) {\n return (pointer instanceof dom.Event || pointer instanceof dom.Touch);\n },\n\n // Get specified X/Y coords for mouse or event.touches[0]\n getXY: function (type, pointer, xy) {\n xy = xy || {};\n type = type || 'page';\n\n xy.x = pointer[type + 'X'];\n xy.y = pointer[type + 'Y'];\n\n return xy;\n },\n\n getPageXY: function (pointer, page) {\n page = page || {};\n\n // Opera Mobile handles the viewport and scrolling oddly\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n pointerUtils.getXY('screen', pointer, page);\n\n page.x += window.scrollX;\n page.y += window.scrollY;\n }\n else {\n pointerUtils.getXY('page', pointer, page);\n }\n\n return page;\n },\n\n getClientXY: function (pointer, client) {\n client = client || {};\n\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n // Opera Mobile handles the viewport and scrolling oddly\n pointerUtils.getXY('screen', pointer, client);\n }\n else {\n pointerUtils.getXY('client', pointer, client);\n }\n\n return client;\n },\n\n getPointerId: function (pointer) {\n return is.number(pointer.pointerId)? pointer.pointerId : pointer.identifier;\n },\n\n setCoords: function (targetObj, pointers, timeStamp) {\n const pointer = (pointers.length > 1\n ? pointerUtils.pointerAverage(pointers)\n : pointers[0]);\n\n const tmpXY = {};\n\n pointerUtils.getPageXY(pointer, tmpXY);\n targetObj.page.x = tmpXY.x;\n targetObj.page.y = tmpXY.y;\n\n pointerUtils.getClientXY(pointer, tmpXY);\n targetObj.client.x = tmpXY.x;\n targetObj.client.y = tmpXY.y;\n\n targetObj.timeStamp = is.number(timeStamp) ? timeStamp :new Date().getTime();\n },\n\n pointerExtend: pointerExtend,\n\n getTouchPair: function (event) {\n const touches = [];\n\n // array of touches is supplied\n if (is.array(event)) {\n touches[0] = event[0];\n touches[1] = event[1];\n }\n // an event\n else {\n if (event.type === 'touchend') {\n if (event.touches.length === 1) {\n touches[0] = event.touches[0];\n touches[1] = event.changedTouches[0];\n }\n else if (event.touches.length === 0) {\n touches[0] = event.changedTouches[0];\n touches[1] = event.changedTouches[1];\n }\n }\n else {\n touches[0] = event.touches[0];\n touches[1] = event.touches[1];\n }\n }\n\n return touches;\n },\n\n pointerAverage: function (pointers) {\n const average = {\n pageX : 0,\n pageY : 0,\n clientX: 0,\n clientY: 0,\n screenX: 0,\n screenY: 0,\n };\n\n for (const pointer of pointers) {\n for (const prop in average) {\n average[prop] += pointer[prop];\n }\n }\n for (const prop in average) {\n average[prop] /= pointers.length;\n }\n\n return average;\n },\n\n touchBBox: function (event) {\n if (!event.length && !(event.touches && event.touches.length > 1)) {\n return;\n }\n\n const touches = pointerUtils.getTouchPair(event);\n const minX = Math.min(touches[0].pageX, touches[1].pageX);\n const minY = Math.min(touches[0].pageY, touches[1].pageY);\n const maxX = Math.max(touches[0].pageX, touches[1].pageX);\n const maxY = Math.max(touches[0].pageY, touches[1].pageY);\n\n return {\n x: minX,\n y: minY,\n left: minX,\n top: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n },\n\n touchDistance: function (event, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n\n\n const dx = touches[0][sourceX] - touches[1][sourceX];\n const dy = touches[0][sourceY] - touches[1][sourceY];\n\n return hypot(dx, dy);\n },\n\n touchAngle: function (event, prevAngle, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n const dx = touches[1][sourceX] - touches[0][sourceX];\n const dy = touches[1][sourceY] - touches[0][sourceY];\n const angle = 180 * Math.atan2(dy , dx) / Math.PI;\n\n return angle;\n },\n\n getPointerType: function (pointer, interaction) {\n // if the PointerEvent API isn't available, then the pointer must be ither\n // a MouseEvent or TouchEvent\n if (interaction.mouse) { return 'mouse'; }\n if (!browser.supportsPointerEvent) { return 'touch'; }\n\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : [undefined, undefined,'touch', 'pen', 'mouse'][pointer.pointerType];\n },\n\n // [ event.target, event.currentTarget ]\n getEventTargets: function (event) {\n return [\n domUtils.getActualElement(event.path ? event.path[0] : event.target),\n domUtils.getActualElement(event.currentTarget),\n ];\n },\n};\n\nmodule.exports = pointerUtils;\n","const { window } = require('./window');\n\nconst vendors = ['ms', 'moz', 'webkit', 'o'];\nlet lastTime = 0;\nlet request;\nlet cancel;\n\nfor (let x = 0; x < vendors.length && !window.requestAnimationFrame; x++) {\n request = window[vendors[x] + 'RequestAnimationFrame'];\n cancel = window[vendors[x] +'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n}\n\nif (!request) {\n request = function (callback) {\n const currTime = new Date().getTime();\n const timeToCall = Math.max(0, 16 - (currTime - lastTime));\n const id = setTimeout(function () { callback(currTime + timeToCall); },\n timeToCall);\n\n lastTime = currTime + timeToCall;\n return id;\n };\n}\n\nif (!cancel) {\n cancel = function (id) {\n clearTimeout(id);\n };\n}\n\nmodule.exports = {\n request,\n cancel,\n};\n","const extend = require('./extend');\nconst is = require('./is');\nconst {\n closest,\n parentNode,\n getElementRect,\n} = require('./domUtils');\n\nconst rectUtils = {\n getStringOptionResult: function (value, interactable, element) {\n if (!is.string(value)) {\n return null;\n }\n\n if (value === 'parent') {\n value = parentNode(element);\n }\n else if (value === 'self') {\n value = interactable.getRect(element);\n }\n else {\n value = closest(element, value);\n }\n\n return value;\n },\n\n resolveRectLike: function (value, interactable, element, functionArgs) {\n value = rectUtils.getStringOptionResult(value, interactable, element) || value;\n\n if (is.function(value)) {\n value = value.apply(null, functionArgs);\n }\n\n if (is.element(value)) {\n value = getElementRect(value);\n }\n\n return value;\n },\n\n rectToXY: function (rect) {\n return rect && {\n x: 'x' in rect ? rect.x : rect.left,\n y: 'y' in rect ? rect.y : rect.top,\n };\n },\n\n xywhToTlbr: function (rect) {\n if (rect && !('left' in rect && 'top' in rect)) {\n rect = extend({}, rect);\n\n rect.left = rect.x || 0;\n rect.top = rect.y || 0;\n rect.right = rect.right || (rect.left + rect.width);\n rect.bottom = rect.bottom || (rect.top + rect.height);\n }\n\n return rect;\n },\n\n tlbrToXywh: function (rect) {\n if (rect && !('x' in rect && 'y' in rect)) {\n rect = extend({}, rect);\n\n rect.x = rect.left || 0;\n rect.top = rect.top || 0;\n rect.width = rect.width || (rect.right - rect.x);\n rect.height = rect.height || (rect.bottom - rect.y);\n }\n\n return rect;\n },\n};\n\nmodule.exports = rectUtils;\n","const win = module.exports;\nconst isWindow = require('./isWindow');\n\nfunction init (window) {\n // get wrapped window if using Shadow DOM polyfill\n\n win.realWindow = window;\n\n // create a TextNode\n const el = window.document.createTextNode('');\n\n // check if it's wrapped by a polyfill\n if (el.ownerDocument !== window.document\n && typeof window.wrap === 'function'\n && window.wrap(el) === el) {\n // use wrapped window\n window = window.wrap(window);\n }\n\n win.window = window;\n}\n\nif (typeof window === 'undefined') {\n win.window = undefined;\n win.realWindow = undefined;\n}\nelse {\n init(window);\n}\n\nwin.getWindow = function getWindow (node) {\n if (isWindow(node)) {\n return node;\n }\n\n const rootNode = (node.ownerDocument || node);\n\n return rootNode.defaultView || rootNode.parentWindow || win.window;\n};\n\nwin.init = init;\n"]} \ No newline at end of file +{"version":3,"sources":["src/header.js","node_modules/browser-pack/_prelude.js","index.js","src/Eventable.js","src/InteractEvent.js","src/Interactable.js","src/Interaction.js","src/actions/base.js","src/actions/drag.js","src/actions/drop.js","src/actions/gesture.js","src/actions/resize.js","src/autoScroll.js","src/autoStart/InteractableMethods.js","src/autoStart/base.js","src/autoStart/delay.js","src/autoStart/drag.js","src/autoStart/gesture.js","src/autoStart/resize.js","src/defaultOptions.js","src/index.js","src/inertia.js","src/interact.js","src/interactablePreventDefault.js","src/legacyBrowsers.js","src/modifiers/index.js","src/modifiers/restrict.js","src/modifiers/restrictEdges.js","src/modifiers/restrictSize.js","src/modifiers/snap.js","src/modifiers/snapSize.js","src/pointerEvents/PointerEvent.js","src/pointerEvents/base.js","src/pointerEvents/holdRepeat.js","src/pointerEvents/interactableTargets.js","src/scope.js","src/utils/Signals.js","src/utils/arr.js","src/utils/browser.js","src/utils/domObjects.js","src/utils/domUtils.js","src/utils/events.js","src/utils/extend.js","src/utils/getOriginXY.js","src/utils/hypot.js","src/utils/index.js","src/utils/interactionFinder.js","src/utils/is.js","src/utils/isWindow.js","src/utils/pointerExtend.js","src/utils/pointerUtils.js","src/utils/raf.js","src/utils/rect.js","src/utils/window.js"],"names":[],"mappings":"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","file":"interact.js","sourceRoot":"","sourcesContent":["/**\n * interact.js v1.3.0-alpha.4+sha.7970416-dirty\n *\n * Copyright (c) 2012-2017 Taye Adeyemi \n * Open source under the MIT License.\n * https://raw.github.com/taye/interact.js/master/LICENSE\n */\n","(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o 150) {\n return null;\n }\n\n let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI;\n const overlap = 22.5;\n\n if (angle < 0) {\n angle += 360;\n }\n\n const left = 135 - overlap <= angle && angle < 225 + overlap;\n const up = 225 - overlap <= angle && angle < 315 + overlap;\n\n const right = !left && (315 - overlap <= angle || angle < 45 + overlap);\n const down = !up && 45 - overlap <= angle && angle < 135 + overlap;\n\n return {\n up,\n down,\n left,\n right,\n angle,\n speed: interaction.prevEvent.speed,\n velocity: {\n x: interaction.prevEvent.velocityX,\n y: interaction.prevEvent.velocityY,\n },\n };\n }\n\n preventDefault () {}\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n}\n\nsignals.on('set-delta', function ({ iEvent, interaction, starting, deltaSource }) {\n const prevEvent = starting? iEvent : interaction.prevEvent;\n\n if (deltaSource === 'client') {\n iEvent.dx = iEvent.clientX - prevEvent.clientX;\n iEvent.dy = iEvent.clientY - prevEvent.clientY;\n }\n else {\n iEvent.dx = iEvent.pageX - prevEvent.pageX;\n iEvent.dy = iEvent.pageY - prevEvent.pageY;\n }\n});\n\nInteractEvent.signals = signals;\n\nmodule.exports = InteractEvent;\n","const is = require('./utils/is');\nconst events = require('./utils/events');\nconst extend = require('./utils/extend');\nconst actions = require('./actions/base');\nconst scope = require('./scope');\nconst Eventable = require('./Eventable');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nconst {\n getElementRect,\n nodeContains,\n trySelector,\n} = require('./utils/domUtils');\nconst { getWindow } = require('./utils/window');\nconst { indexOf, contains } = require('./utils/arr');\nconst { wheelEvent } = require('./utils/browser');\n\n// all set interactables\nscope.interactables = [];\n\n/*\\\n * Interactable\n [ property ]\n **\n * Object type returned by @interact\n\\*/\nclass Interactable {\n constructor (target, options) {\n options = options || {};\n\n this.target = target;\n this.events = new Eventable();\n this._context = options.context || scope.document;\n this._win = getWindow(trySelector(target)? this._context : target);\n this._doc = this._win.document;\n\n signals.fire('new', {\n target,\n options,\n interactable: this,\n win: this._win,\n });\n\n scope.addDocument( this._doc, this._win );\n\n scope.interactables.push(this);\n\n this.set(options);\n }\n\n setOnEvents (action, phases) {\n const onAction = 'on' + action;\n\n if (is.function(phases.onstart) ) { this.events[onAction + 'start' ] = phases.onstart ; }\n if (is.function(phases.onmove) ) { this.events[onAction + 'move' ] = phases.onmove ; }\n if (is.function(phases.onend) ) { this.events[onAction + 'end' ] = phases.onend ; }\n if (is.function(phases.oninertiastart)) { this.events[onAction + 'inertiastart' ] = phases.oninertiastart ; }\n\n return this;\n }\n\n setPerAction (action, options) {\n // for all the default per-action options\n for (const option in options) {\n // if this option exists for this action\n if (option in defaults[action]) {\n // if the option in the options arg is an object value\n if (is.object(options[option])) {\n // duplicate the object\n this.options[action][option] = extend(this.options[action][option] || {}, options[option]);\n\n if (is.object(defaults.perAction[option]) && 'enabled' in defaults.perAction[option]) {\n this.options[action][option].enabled = options[option].enabled === false? false : true;\n }\n }\n else if (is.bool(options[option]) && is.object(defaults.perAction[option])) {\n this.options[action][option].enabled = options[option];\n }\n else if (options[option] !== undefined) {\n // or if it's not undefined, do a plain assignment\n this.options[action][option] = options[option];\n }\n }\n }\n }\n\n /*\\\n * Interactable.getRect\n [ method ]\n *\n * The default function to get an Interactables bounding rect. Can be\n * overridden using @Interactable.rectChecker.\n *\n - element (Element) #optional The element to measure.\n = (object) The object's bounding rectangle.\n o {\n o top : 0,\n o left : 0,\n o bottom: 0,\n o right : 0,\n o width : 0,\n o height: 0\n o }\n \\*/\n getRect (element) {\n element = element || this.target;\n\n if (is.string(this.target) && !(is.element(element))) {\n element = this._context.querySelector(this.target);\n }\n\n return getElementRect(element);\n }\n\n /*\\\n * Interactable.rectChecker\n [ method ]\n *\n * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n - checker (function) #optional A function which returns this Interactable's bounding rectangle. See @Interactable.getRect\n = (function | object) The checker function or this Interactable\n \\*/\n rectChecker (checker) {\n if (is.function(checker)) {\n this.getRect = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.getRect;\n\n return this;\n }\n\n return this.getRect;\n }\n\n _backCompatOption (optionName, newValue) {\n if (trySelector(newValue) || is.object(newValue)) {\n this.options[optionName] = newValue;\n\n for (const action of actions.names) {\n this.options[action][optionName] = newValue;\n }\n\n return this;\n }\n\n return this.options[optionName];\n }\n\n /*\\\n * Interactable.origin\n [ method ]\n *\n * Gets or sets the origin of the Interactable's element. The x and y\n * of the origin will be subtracted from action event coordinates.\n *\n - origin (object | string) #optional An object eg. { x: 0, y: 0 } or string 'parent', 'self' or any CSS selector\n * OR\n - origin (Element) #optional An HTML or SVG Element whose rect will be used\n **\n = (object) The current origin or this Interactable\n \\*/\n origin (newValue) {\n return this._backCompatOption('origin', newValue);\n }\n\n /*\\\n * Interactable.deltaSource\n [ method ]\n *\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n - newValue (string) #optional Use 'client' if you will be scrolling while interacting; Use 'page' if you want autoScroll to work\n = (string | object) The current deltaSource or this Interactable\n \\*/\n deltaSource (newValue) {\n if (newValue === 'page' || newValue === 'client') {\n this.options.deltaSource = newValue;\n\n return this;\n }\n\n return this.options.deltaSource;\n }\n\n /*\\\n * Interactable.context\n [ method ]\n *\n * Gets the selector context Node of the Interactable. The default is `window.document`.\n *\n = (Node) The context Node of this Interactable\n **\n \\*/\n context () {\n return this._context;\n }\n\n inContext (element) {\n return (this._context === element.ownerDocument\n || nodeContains(this._context, element));\n }\n\n /*\\\n * Interactable.fire\n [ method ]\n *\n * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n - iEvent (InteractEvent) The InteractEvent object to be fired on this Interactable\n = (Interactable) this Interactable\n \\*/\n fire (iEvent) {\n this.events.fire(iEvent);\n\n return this;\n }\n\n _onOffMultiple (method, eventType, listener, options) {\n if (is.string(eventType) && eventType.search(' ') !== -1) {\n eventType = eventType.trim().split(/ +/);\n }\n\n if (is.array(eventType)) {\n for (let i = 0; i < eventType.length; i++) {\n this[method](eventType[i], listener, options);\n }\n\n return true;\n }\n\n if (is.object(eventType)) {\n for (const prop in eventType) {\n this[method](prop, eventType[prop], listener);\n }\n\n return true;\n }\n }\n\n /*\\\n * Interactable.on\n [ method ]\n *\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n - eventType (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) This Interactable\n \\*/\n on (eventType, listener, options) {\n if (this._onOffMultiple('on', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.on(eventType, listener);\n }\n // delegated event for selector\n else if (is.string(this.target)) {\n events.addDelegate(this.target, this._context, eventType, listener, options);\n }\n else {\n events.add(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.off\n [ method ]\n *\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n - eventType (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) This Interactable\n \\*/\n off (eventType, listener, options) {\n if (this._onOffMultiple('off', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n // if it is an action event type\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.off(eventType, listener);\n }\n // delegated event\n else if (is.string(this.target)) {\n events.removeDelegate(this.target, this._context, eventType, listener, options);\n }\n // remove listener from this Interatable's element\n else {\n events.remove(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.set\n [ method ]\n *\n * Reset the options of this Interactable\n - options (object) The new settings to apply\n = (object) This Interactable\n \\*/\n set (options) {\n if (!is.object(options)) {\n options = {};\n }\n\n this.options = extend({}, defaults.base);\n\n const perActions = extend({}, defaults.perAction);\n\n for (const actionName in actions.methodDict) {\n const methodName = actions.methodDict[actionName];\n\n this.options[actionName] = extend({}, defaults[actionName]);\n\n this.setPerAction(actionName, perActions);\n\n this[methodName](options[actionName]);\n }\n\n for (const setting of Interactable.settingsMethods) {\n this.options[setting] = defaults.base[setting];\n\n if (setting in options) {\n this[setting](options[setting]);\n }\n }\n\n signals.fire('set', {\n options,\n interactable: this,\n });\n\n return this;\n }\n\n /*\\\n * Interactable.unset\n [ method ]\n *\n * Remove this interactable from the list of interactables and remove\n * it's action capabilities and event listeners\n *\n = (object) @interact\n \\*/\n unset () {\n events.remove(this.target, 'all');\n\n if (is.string(this.target)) {\n // remove delegated events\n for (const type in events.delegatedEvents) {\n const delegated = events.delegatedEvents[type];\n\n if (delegated.selectors[0] === this.target\n && delegated.contexts[0] === this._context) {\n\n delegated.selectors.splice(0, 1);\n delegated.contexts .splice(0, 1);\n delegated.listeners.splice(0, 1);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegated[type] = null;\n }\n }\n\n events.remove(this._context, type, events.delegateListener);\n events.remove(this._context, type, events.delegateUseCapture, true);\n }\n }\n else {\n events.remove(this, 'all');\n }\n\n signals.fire('unset', { interactable: this });\n\n scope.interactables.splice(indexOf(scope.interactables, this), 1);\n\n // Stop related interactions when an Interactable is unset\n for (const interaction of scope.interactions || []) {\n if (interaction.target === this && interaction.interacting()) {\n interaction.stop();\n }\n }\n\n return scope.interact;\n }\n}\n\nscope.interactables.indexOfElement = function indexOfElement (target, context) {\n context = context || scope.document;\n\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n if (interactable.target === target && interactable._context === context) {\n return i;\n }\n }\n return -1;\n};\n\nscope.interactables.get = function interactableGet (element, options, dontCheckInContext) {\n const ret = this[this.indexOfElement(element, options && options.context)];\n\n return ret && (is.string(element) || dontCheckInContext || ret.inContext(element))? ret : null;\n};\n\nscope.interactables.forEachSelector = function (callback, element) {\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n // skip non CSS selector targets and out of context elements\n if (!is.string(interactable.target)\n || (element && !interactable.inContext(element))) {\n continue;\n }\n\n const ret = callback(interactable, interactable.target, interactable._context, i, this);\n\n if (ret !== undefined) {\n return ret;\n }\n }\n};\n\n// all interact.js eventTypes\nInteractable.eventTypes = scope.eventTypes = [];\n\nInteractable.signals = signals;\n\nInteractable.settingsMethods = [ 'deltaSource', 'origin', 'preventDefault', 'rectChecker' ];\n\nmodule.exports = Interactable;\n","const scope = require('./scope');\nconst utils = require('./utils');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst domObjects = require('./utils/domObjects');\nconst finder = require('./utils/interactionFinder');\nconst signals = require('./utils/Signals').new();\n\nconst listeners = {};\nconst methodNames = [\n 'pointerDown', 'pointerMove', 'pointerUp',\n 'updatePointer', 'removePointer',\n];\n\n// for ignoring browser's simulated mouse events\nlet prevTouchTime = 0;\n\n// all active and idle interactions\nscope.interactions = [];\n\nclass Interaction {\n constructor ({ pointerType }) {\n this.target = null; // current interactable being interacted with\n this.element = null; // the target element of the interactable\n\n this.prepared = { // action that's ready to be fired on next move event\n name : null,\n axis : null,\n edges: null,\n };\n\n // keep track of added pointers\n this.pointers = [];\n this.pointerIds = [];\n this.downTargets = [];\n this.downTimes = [];\n\n // Previous native pointer move event coordinates\n this.prevCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n // current native pointer move event coordinates\n this.curCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Starting InteractEvent pointer coordinates\n this.startCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Change in coordinates and time of the pointer\n this.pointerDelta = {\n page : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n client : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n timeStamp: 0,\n };\n\n this.downEvent = null; // pointerdown/mousedown/touchstart event\n this.downPointer = {};\n\n this._eventTarget = null;\n this._curEventTarget = null;\n\n this.prevEvent = null; // previous action event\n\n this.pointerIsDown = false;\n this.pointerWasMoved = false;\n this._interacting = false;\n\n this.pointerType = pointerType;\n\n signals.fire('new', this);\n\n scope.interactions.push(this);\n }\n\n pointerDown (pointer, event, eventTarget) {\n const pointerIndex = this.updatePointer(pointer, event, true);\n\n signals.fire('down', {\n pointer,\n event,\n eventTarget,\n pointerIndex,\n interaction: this,\n });\n }\n\n /*\\\n * Interaction.start\n [ method ]\n *\n * Start an action with the given Interactable and Element as tartgets. The\n * action must be enabled for the target Interactable and an appropriate number\n * of pointers must be held down - 1 for drag/resize, 2 for gesture.\n *\n * Use it with `interactable.able({ manualStart: false })` to always\n * [start actions manually](https://github.com/taye/interact.js/issues/114)\n *\n - action (object) The action to be performed - drag, resize, etc.\n - target (Interactable) The Interactable to target\n - element (Element) The DOM Element to target\n = (object) interact\n **\n | interact(target)\n | .draggable({\n | // disable the default drag start by down->move\n | manualStart: true\n | })\n | // start dragging after the user holds the pointer down\n | .on('hold', function (event) {\n | var interaction = event.interaction;\n |\n | if (!interaction.interacting()) {\n | interaction.start({ name: 'drag' },\n | event.interactable,\n | event.currentTarget);\n | }\n | });\n \\*/\n start (action, target, element) {\n if (this.interacting()\n || !this.pointerIsDown\n || this.pointerIds.length < (action.name === 'gesture'? 2 : 1)) {\n return;\n }\n\n // if this interaction had been removed after stopping\n // add it back\n if (utils.indexOf(scope.interactions, this) === -1) {\n scope.interactions.push(this);\n }\n\n utils.copyAction(this.prepared, action);\n this.target = target;\n this.element = element;\n\n signals.fire('action-start', {\n interaction: this,\n event: this.downEvent,\n });\n }\n\n pointerMove (pointer, event, eventTarget) {\n if (!this.simulation) {\n this.updatePointer(pointer);\n utils.setCoords(this.curCoords, this.pointers);\n }\n\n const duplicateMove = (this.curCoords.page.x === this.prevCoords.page.x\n && this.curCoords.page.y === this.prevCoords.page.y\n && this.curCoords.client.x === this.prevCoords.client.x\n && this.curCoords.client.y === this.prevCoords.client.y);\n\n let dx;\n let dy;\n\n // register movement greater than pointerMoveTolerance\n if (this.pointerIsDown && !this.pointerWasMoved) {\n dx = this.curCoords.client.x - this.startCoords.client.x;\n dy = this.curCoords.client.y - this.startCoords.client.y;\n\n this.pointerWasMoved = utils.hypot(dx, dy) > Interaction.pointerMoveTolerance;\n }\n\n const signalArg = {\n pointer,\n pointerIndex: this.getPointerIndex(pointer),\n event,\n eventTarget,\n dx,\n dy,\n duplicate: duplicateMove,\n interaction: this,\n interactingBeforeMove: this.interacting(),\n };\n\n if (!duplicateMove) {\n // set pointer coordinate, time changes and speeds\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n }\n\n signals.fire('move', signalArg);\n\n if (!duplicateMove) {\n // if interacting, fire an 'action-move' signal etc\n if (this.interacting()) {\n this.doMove(signalArg);\n }\n\n if (this.pointerWasMoved) {\n utils.copyCoords(this.prevCoords, this.curCoords);\n }\n }\n }\n\n /*\\\n * Interaction.doMove\n [ method ]\n *\n * Force a move of the current action at the same coordinates. Useful if\n * snap/restrict has been changed and you want a movement with the new\n * settings.\n *\n **\n | interact(target)\n | .draggable(true)\n | .on('dragmove', function (event) {\n | if (someCondition) {\n | // change the snap settings\n | event.interactable.draggable({ snap: { targets: [] }});\n | // fire another move event with re-calculated snap\n | event.interaction.doMove();\n | }\n | });\n \\*/\n doMove (signalArg) {\n signalArg = utils.extend({\n pointer: this.pointers[0],\n event: this.prevEvent,\n eventTarget: this._eventTarget,\n interaction: this,\n }, signalArg || {});\n\n signals.fire('before-action-move', signalArg);\n\n if (!this._dontFireMove) {\n signals.fire('action-move', signalArg);\n }\n\n this._dontFireMove = false;\n }\n\n // End interact move events and stop auto-scroll unless simulation is running\n pointerUp (pointer, event, eventTarget, curEventTarget) {\n const pointerIndex = this.getPointerIndex(pointer);\n\n signals.fire(/cancel$/i.test(event.type)? 'cancel' : 'up', {\n pointer,\n pointerIndex,\n event,\n eventTarget,\n curEventTarget,\n interaction: this,\n });\n\n if (!this.simulation) {\n this.end(event);\n }\n\n this.pointerIsDown = false;\n this.removePointer(pointer, event);\n }\n\n /*\\\n * Interaction.end\n [ method ]\n *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n - event (PointerEvent) #optional\n **\n | interact(target)\n | .draggable(true)\n | .on('move', function (event) {\n | if (event.pageX > 1000) {\n | // end the current action\n | event.interaction.end();\n | // stop all further listeners from being called\n | event.stopImmediatePropagation();\n | }\n | });\n \\*/\n end (event) {\n event = event || this.prevEvent;\n\n if (this.interacting()) {\n signals.fire('action-end', {\n event,\n interaction: this,\n });\n }\n\n this.stop();\n }\n\n currentAction () {\n return this._interacting? this.prepared.name: null;\n }\n\n interacting () {\n return this._interacting;\n }\n\n stop () {\n signals.fire('stop', { interaction: this });\n\n if (this._interacting) {\n signals.fire('stop-active', { interaction: this });\n signals.fire('stop-' + this.prepared.name, { interaction: this });\n }\n\n this.target = this.element = null;\n\n this._interacting = false;\n this.prepared.name = this.prevEvent = null;\n }\n\n getPointerIndex (pointer) {\n // mouse and pen interactions may have only one pointer\n if (this.pointerType === 'mouse' || this.pointerType === 'pen') {\n return 0;\n }\n\n return utils.indexOf(this.pointerIds, utils.getPointerId(pointer));\n }\n\n updatePointer (pointer, event, down = event && /(down|start)$/i.test(event.type)) {\n const id = utils.getPointerId(pointer);\n let index = this.getPointerIndex(pointer);\n\n if (index === -1) {\n index = this.pointerIds.length;\n this.pointerIds[index] = id;\n }\n\n if (down) {\n signals.fire('update-pointer-down', {\n pointer,\n event,\n down,\n pointerId: id,\n pointerIndex: index,\n interaction: this,\n });\n }\n\n this.pointers[index] = pointer;\n\n return index;\n }\n\n removePointer (pointer, event) {\n const index = this.getPointerIndex(pointer);\n\n if (index === -1) { return; }\n\n signals.fire('remove-pointer', {\n pointer,\n event,\n pointerIndex: index,\n interaction: this,\n });\n\n this.pointers .splice(index, 1);\n this.pointerIds .splice(index, 1);\n this.downTargets.splice(index, 1);\n this.downTimes .splice(index, 1);\n }\n\n _updateEventTargets (target, currentTarget) {\n this._eventTarget = target;\n this._curEventTarget = currentTarget;\n }\n}\n\nfor (let i = 0, len = methodNames.length; i < len; i++) {\n const method = methodNames[i];\n\n listeners[method] = doOnInteractions(method);\n}\n\nfunction doOnInteractions (method) {\n return (function (event) {\n const pointerType = utils.getPointerType(event);\n const [eventTarget, curEventTarget] = utils.getEventTargets(event);\n const matches = []; // [ [pointer, interaction], ...]\n\n if (browser.supportsTouch && /touch/.test(event.type)) {\n prevTouchTime = new Date().getTime();\n\n for (let i = 0; i < event.changedTouches.length; i++) {\n const pointer = event.changedTouches[i];\n const interaction = finder.search(pointer, event.type, eventTarget);\n\n matches.push([pointer, interaction || new Interaction({ pointerType })]);\n }\n }\n else {\n let invalidPointer = false;\n\n if (!browser.supportsPointerEvent && /mouse/.test(event.type)) {\n // ignore mouse events while touch interactions are active\n for (let i = 0; i < scope.interactions.length && !invalidPointer; i++) {\n invalidPointer = scope.interactions[i].pointerType !== 'mouse' && scope.interactions[i].pointerIsDown;\n }\n\n // try to ignore mouse events that are simulated by the browser\n // after a touch event\n invalidPointer = invalidPointer\n || (new Date().getTime() - prevTouchTime < 500)\n // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated\n || event.timeStamp === 0;\n }\n\n if (!invalidPointer) {\n let interaction = finder.search(event, event.type, eventTarget);\n\n if (!interaction) {\n interaction = new Interaction({ pointerType });\n }\n\n matches.push([event, interaction]);\n }\n }\n\n for (const [pointer, interaction] of matches) {\n interaction._updateEventTargets(eventTarget, curEventTarget);\n interaction[method](pointer, event, eventTarget, curEventTarget);\n }\n });\n}\n\nfunction endAll (event) {\n for (let i = 0; i < scope.interactions.length; i++) {\n const interaction = scope.interactions[i];\n\n interaction.end(event);\n signals.fire('endall', { event, interaction });\n }\n}\n\nconst docEvents = { /* 'eventType': listenerFunc */ };\nconst pEventTypes = browser.pEventTypes;\n\nif (domObjects.PointerEvent) {\n docEvents[pEventTypes.down ] = listeners.pointerDown;\n docEvents[pEventTypes.move ] = listeners.pointerMove;\n docEvents[pEventTypes.up ] = listeners.pointerUp;\n docEvents[pEventTypes.cancel] = listeners.pointerUp;\n}\nelse {\n docEvents.mousedown = listeners.pointerDown;\n docEvents.mousemove = listeners.pointerMove;\n docEvents.mouseup = listeners.pointerUp;\n\n docEvents.touchstart = listeners.pointerDown;\n docEvents.touchmove = listeners.pointerMove;\n docEvents.touchend = listeners.pointerUp;\n docEvents.touchcancel = listeners.pointerUp;\n}\n\ndocEvents.blur = endAll;\n\nfunction onDocSignal ({ doc }, signalName) {\n const eventMethod = signalName.indexOf('add') === 0\n ? events.add : events.remove;\n\n // delegate event listener\n for (const eventType in scope.delegatedEvents) {\n eventMethod(doc, eventType, events.delegateListener);\n eventMethod(doc, eventType, events.delegateUseCapture, true);\n }\n\n for (const eventType in docEvents) {\n eventMethod(doc, eventType, docEvents[eventType]);\n }\n}\n\nsignals.on('update-pointer-down', ({ interaction, pointer, pointerId, pointerIndex, event, eventTarget, down }) => {\n interaction.pointerIds[pointerIndex] = pointerId;\n interaction.pointers[pointerIndex] = pointer;\n\n if (down) {\n interaction.pointerIsDown = true;\n }\n\n if (!interaction.interacting()) {\n utils.setCoords(interaction.startCoords, interaction.pointers);\n\n utils.copyCoords(interaction.curCoords , interaction.startCoords);\n utils.copyCoords(interaction.prevCoords, interaction.startCoords);\n\n interaction.downEvent = event;\n interaction.downTimes[pointerIndex] = interaction.curCoords.timeStamp;\n interaction.downTargets[pointerIndex] = eventTarget || event && utils.getEventTargets(event)[0];\n interaction.pointerWasMoved = false;\n\n utils.pointerExtend(interaction.downPointer, pointer);\n }\n});\n\nscope.signals.on('add-document' , onDocSignal);\nscope.signals.on('remove-document', onDocSignal);\n\nInteraction.pointerMoveTolerance = 1;\nInteraction.doOnInteractions = doOnInteractions;\nInteraction.endAll = endAll;\nInteraction.signals = signals;\nInteraction.docEvents = docEvents;\n\nscope.endAllInteractions = endAll;\n\nmodule.exports = Interaction;\n","const Interaction = require('../Interaction');\nconst InteractEvent = require('../InteractEvent');\n\nconst actions = {\n firePrepared,\n names: [],\n methodDict: {},\n};\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n interaction._interacting = true;\n firePrepared(interaction, event, 'start');\n});\n\nInteraction.signals.on('action-move', function ({ interaction, event, preEnd }) {\n firePrepared(interaction, event, 'move', preEnd);\n\n // if the action was ended in a listener\n if (!interaction.interacting()) { return false; }\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n firePrepared(interaction, event, 'end');\n});\n\nfunction firePrepared (interaction, event, phase, preEnd) {\n const actionName = interaction.prepared.name;\n\n const newEvent = new InteractEvent(interaction, event, actionName, phase, interaction.element, null, preEnd);\n\n interaction.target.fire(newEvent);\n interaction.prevEvent = newEvent;\n}\n\nmodule.exports = actions;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drag = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n startAxis : 'xy',\n lockAxis : 'xy',\n },\n\n checker: function (pointer, event, interactable) {\n const dragOptions = interactable.options.drag;\n\n return dragOptions.enabled\n ? { name: 'drag', axis: (dragOptions.lockAxis === 'start'\n ? dragOptions.startAxis\n : dragOptions.lockAxis)}\n : null;\n },\n\n getCursor: function () {\n return 'move';\n },\n};\n\nInteraction.signals.on('before-action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n interaction.curCoords.page.y = interaction.startCoords.page.y;\n interaction.curCoords.client.y = interaction.startCoords.client.y;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vx);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vx);\n interaction.pointerDelta.client.vy = 0;\n interaction.pointerDelta.page.vy = 0;\n }\n else if (axis === 'y') {\n interaction.curCoords.page.x = interaction.startCoords.page.x;\n interaction.curCoords.client.x = interaction.startCoords.client.x;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vy);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vy);\n interaction.pointerDelta.client.vx = 0;\n interaction.pointerDelta.page.vx = 0;\n }\n});\n\n// dragmove\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'dragmove') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n iEvent.pageY = interaction.startCoords.page.y;\n iEvent.clientY = interaction.startCoords.client.y;\n iEvent.dy = 0;\n }\n else if (axis === 'y') {\n iEvent.pageX = interaction.startCoords.page.x;\n iEvent.clientX = interaction.startCoords.client.x;\n iEvent.dx = 0;\n }\n});\n\n/*\\\n * Interactable.draggable\n [ method ]\n *\n * Gets or sets whether drag actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of drag events\n | var isDraggable = interact('ul li').draggable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on drag events (object makes the Interactable draggable)\n = (object) This Interactable\n | interact(element).draggable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // the axis in which the first movement must be\n | // for the drag sequence to start\n | // 'xy' by default - any direction\n | startAxis: 'x' || 'y' || 'xy',\n |\n | // 'xy' by default - don't restrict to one axis (move in any direction)\n | // 'x' or 'y' to restrict movement to either axis\n | // 'start' to restrict movement to the axis the drag started in\n | lockAxis: 'x' || 'y' || 'xy' || 'start',\n |\n | // max number of drags that can happen concurrently\n | // with elements of this Interactable. Infinity by default\n | max: Infinity,\n |\n | // max number of drags that can target the same element+Interactable\n | // 1 by default\n | maxPerElement: 2\n | });\n\\*/\nInteractable.prototype.draggable = function (options) {\n if (utils.is.object(options)) {\n this.options.drag.enabled = options.enabled === false? false: true;\n this.setPerAction('drag', options);\n this.setOnEvents('drag', options);\n\n if (/^(xy|x|y|start)$/.test(options.lockAxis)) {\n this.options.drag.lockAxis = options.lockAxis;\n }\n if (/^(xy|x|y)$/.test(options.startAxis)) {\n this.options.drag.startAxis = options.startAxis;\n }\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drag.enabled = options;\n\n if (!options) {\n this.ondragstart = this.ondragstart = this.ondragend = null;\n }\n\n return this;\n }\n\n return this.options.drag;\n};\n\nactions.drag = drag;\nactions.names.push('drag');\nutils.merge(Interactable.eventTypes, [\n 'dragstart',\n 'dragmove',\n 'draginertiastart',\n 'draginertiaresume',\n 'dragend',\n]);\nactions.methodDict.drag = 'draggable';\n\ndefaultOptions.drag = drag.defaults;\n\nmodule.exports = drag;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst scope = require('../scope');\nconst interact = require('../interact');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drop = {\n defaults: {\n enabled: false,\n accept : null,\n overlap: 'pointer',\n },\n};\n\nlet dynamicDrop = false;\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // reset active dropzones\n interaction.activeDrops.dropzones = [];\n interaction.activeDrops.elements = [];\n interaction.activeDrops.rects = [];\n\n interaction.dropEvents = null;\n\n if (!interaction.dynamicDrop) {\n setActiveDrops(interaction, interaction.element);\n }\n\n const dragEvent = interaction.prevEvent;\n const dropEvents = getDropEvents(interaction, event, dragEvent);\n\n if (dropEvents.activate) {\n fireActiveDrops(interaction, dropEvents.activate);\n }\n});\n\nInteractEvent.signals.on('new', function ({ interaction, iEvent, event }) {\n if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { return; }\n\n const draggableElement = interaction.element;\n const dragEvent = iEvent;\n const dropResult = getDrop(dragEvent, event, draggableElement);\n\n interaction.dropTarget = dropResult.dropzone;\n interaction.dropElement = dropResult.element;\n\n interaction.dropEvents = getDropEvents(interaction, event, dragEvent);\n});\n\nInteraction.signals.on('action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n fireDropEvents(interaction, interaction.dropEvents);\n});\n\nInteraction.signals.on('action-end', function ({ interaction }) {\n if (interaction.prepared.name === 'drag') {\n fireDropEvents(interaction, interaction.dropEvents);\n }\n});\n\nInteraction.signals.on('stop-drag', function ({ interaction }) {\n interaction.activeDrops.dropzones =\n interaction.activeDrops.elements =\n interaction.activeDrops.rects =\n interaction.dropEvents = null;\n});\n\nfunction collectDrops (interaction, element) {\n const drops = [];\n const elements = [];\n\n element = element || interaction.element;\n\n // collect all dropzones and their elements which qualify for a drop\n for (const current of scope.interactables) {\n if (!current.options.drop.enabled) { continue; }\n\n const accept = current.options.drop.accept;\n\n // test the draggable element against the dropzone's accept setting\n if ((utils.is.element(accept) && accept !== element)\n || (utils.is.string(accept)\n && !utils.matchesSelector(element, accept))) {\n\n continue;\n }\n\n // query for new elements if necessary\n const dropElements = utils.is.string(current.target)\n ? current._context.querySelectorAll(current.target)\n : [current.target];\n\n for (let i = 0; i < dropElements.length; i++) {\n const currentElement = dropElements[i];\n\n if (currentElement !== element) {\n drops.push(current);\n elements.push(currentElement);\n }\n }\n }\n\n return {\n elements,\n dropzones: drops,\n };\n}\n\nfunction fireActiveDrops (interaction, event) {\n let prevElement;\n\n // loop through all active dropzones and trigger event\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n const current = interaction.activeDrops.dropzones[i];\n const currentElement = interaction.activeDrops.elements [i];\n\n // prevent trigger of duplicate events on same element\n if (currentElement !== prevElement) {\n // set current element as event target\n event.target = currentElement;\n current.fire(event);\n }\n prevElement = currentElement;\n }\n}\n\n// Collect a new set of possible drops and save them in activeDrops.\n// setActiveDrops should always be called when a drag has just started or a\n// drag event happens while dynamicDrop is true\nfunction setActiveDrops (interaction, dragElement) {\n // get dropzones and their elements that could receive the draggable\n const possibleDrops = collectDrops(interaction, dragElement, true);\n\n interaction.activeDrops.dropzones = possibleDrops.dropzones;\n interaction.activeDrops.elements = possibleDrops.elements;\n interaction.activeDrops.rects = [];\n\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n interaction.activeDrops.rects[i] =\n interaction.activeDrops.dropzones[i].getRect(interaction.activeDrops.elements[i]);\n }\n}\n\nfunction getDrop (dragEvent, event, dragElement) {\n const interaction = dragEvent.interaction;\n const validDrops = [];\n\n if (dynamicDrop) {\n setActiveDrops(interaction, dragElement);\n }\n\n // collect all dropzones and their elements which qualify for a drop\n for (let j = 0; j < interaction.activeDrops.dropzones.length; j++) {\n const current = interaction.activeDrops.dropzones[j];\n const currentElement = interaction.activeDrops.elements [j];\n const rect = interaction.activeDrops.rects [j];\n\n validDrops.push(current.dropCheck(dragEvent, event, interaction.target, dragElement, currentElement, rect)\n ? currentElement\n : null);\n }\n\n // get the most appropriate dropzone based on DOM depth and order\n const dropIndex = utils.indexOfDeepestElement(validDrops);\n\n return {\n dropzone: interaction.activeDrops.dropzones[dropIndex] || null,\n element : interaction.activeDrops.elements [dropIndex] || null,\n };\n}\n\nfunction getDropEvents (interaction, pointerEvent, dragEvent) {\n const dropEvents = {\n enter : null,\n leave : null,\n activate : null,\n deactivate: null,\n move : null,\n drop : null,\n };\n\n const tmpl = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n };\n\n if (interaction.dropElement !== interaction.prevDropElement) {\n // if there was a prevDropTarget, create a dragleave event\n if (interaction.prevDropTarget) {\n dropEvents.leave = utils.extend({ type: 'dragleave' }, tmpl);\n\n dragEvent.dragLeave = dropEvents.leave.target = interaction.prevDropElement;\n dragEvent.prevDropzone = dropEvents.leave.dropzone = interaction.prevDropTarget;\n }\n // if the dropTarget is not null, create a dragenter event\n if (interaction.dropTarget) {\n dropEvents.enter = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n type : 'dragenter',\n };\n\n dragEvent.dragEnter = interaction.dropElement;\n dragEvent.dropzone = interaction.dropTarget;\n }\n }\n\n if (dragEvent.type === 'dragend' && interaction.dropTarget) {\n dropEvents.drop = utils.extend({ type: 'drop' }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n dragEvent.relatedTarget = interaction.dropElement;\n }\n if (dragEvent.type === 'dragstart') {\n dropEvents.activate = utils.extend({ type: 'dropactivate' }, tmpl);\n\n dropEvents.activate.target = null;\n dropEvents.activate.dropzone = null;\n }\n if (dragEvent.type === 'dragend') {\n dropEvents.deactivate = utils.extend({ type: 'dropdeactivate' }, tmpl);\n\n dropEvents.deactivate.target = null;\n dropEvents.deactivate.dropzone = null;\n }\n if (dragEvent.type === 'dragmove' && interaction.dropTarget) {\n dropEvents.move = utils.extend({\n dragmove : dragEvent,\n type : 'dropmove',\n }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n }\n\n return dropEvents;\n}\n\nfunction fireDropEvents (interaction, dropEvents) {\n if (dropEvents.leave) { interaction.prevDropTarget.fire(dropEvents.leave); }\n if (dropEvents.move ) { interaction.dropTarget.fire(dropEvents.move ); }\n if (dropEvents.enter) { interaction.dropTarget.fire(dropEvents.enter); }\n if (dropEvents.drop ) { interaction.dropTarget.fire(dropEvents.drop ); }\n if (dropEvents.deactivate) {\n fireActiveDrops(interaction, dropEvents.deactivate);\n }\n\n interaction.prevDropTarget = interaction.dropTarget;\n interaction.prevDropElement = interaction.dropElement;\n}\n\n/*\\\n * Interactable.dropzone\n [ method ]\n *\n * Returns or sets whether elements can be dropped onto this\n * Interactable to trigger drop events\n *\n * Dropzones can receive the following events:\n * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends\n * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone\n * - `dragmove` when a draggable that has entered the dropzone is moved\n * - `drop` when a draggable is dropped into this dropzone\n *\n * Use the `accept` option to allow only elements that match the given CSS\n * selector or element. The value can be:\n *\n * - **an Element** - only that element can be dropped into this dropzone.\n * - **a string**, - the element being dragged must match it as a CSS selector.\n * - **`null`** - accept options is cleared - it accepts any element.\n *\n * Use the `overlap` option to set how drops are checked for. The allowed\n * values are:\n *\n * - `'pointer'`, the pointer must be over the dropzone (default)\n * - `'center'`, the draggable element's center must be over the dropzone\n * - a number from 0-1 which is the `(intersection area) / (draggable area)`.\n * e.g. `0.5` for drop to happen when half of the area of the draggable is\n * over the dropzone\n *\n * Use the `checker` option to specify a function to check if a dragged\n * element is over this Interactable.\n *\n | interact(target)\n | .dropChecker(function(dragEvent, // related dragmove or dragend event\n | event, // TouchEvent/PointerEvent/MouseEvent\n | dropped, // bool result of the default checker\n | dropzone, // dropzone Interactable\n | dropElement, // dropzone elemnt\n | draggable, // draggable Interactable\n | draggableElement) {// draggable element\n |\n | return dropped && event.target.hasAttribute('allow-drop');\n | }\n *\n *\n - options (boolean | object | null) #optional The new value to be set.\n | interact('.drop').dropzone({\n | accept: '.can-drop' || document.getElementById('single-drop'),\n | overlap: 'pointer' || 'center' || zeroToOne\n | }\n = (boolean | object) The current setting or this Interactable\n\\*/\nInteractable.prototype.dropzone = function (options) {\n if (utils.is.object(options)) {\n this.options.drop.enabled = options.enabled === false? false: true;\n\n if (utils.is.function(options.ondrop) ) { this.events.ondrop = options.ondrop ; }\n if (utils.is.function(options.ondropactivate) ) { this.events.ondropactivate = options.ondropactivate ; }\n if (utils.is.function(options.ondropdeactivate)) { this.events.ondropdeactivate = options.ondropdeactivate; }\n if (utils.is.function(options.ondragenter) ) { this.events.ondragenter = options.ondragenter ; }\n if (utils.is.function(options.ondragleave) ) { this.events.ondragleave = options.ondragleave ; }\n if (utils.is.function(options.ondropmove) ) { this.events.ondropmove = options.ondropmove ; }\n\n if (/^(pointer|center)$/.test(options.overlap)) {\n this.options.drop.overlap = options.overlap;\n }\n else if (utils.is.number(options.overlap)) {\n this.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0);\n }\n if ('accept' in options) {\n this.options.drop.accept = options.accept;\n }\n if ('checker' in options) {\n this.options.drop.checker = options.checker;\n }\n\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drop.enabled = options;\n\n if (!options) {\n this.ondragenter = this.ondragleave = this.ondrop\n = this.ondropactivate = this.ondropdeactivate = null;\n }\n\n return this;\n }\n\n return this.options.drop;\n};\n\nInteractable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) {\n let dropped = false;\n\n // if the dropzone has no rect (eg. display: none)\n // call the custom dropChecker or just return false\n if (!(rect = rect || this.getRect(dropElement))) {\n return (this.options.drop.checker\n ? this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement)\n : false);\n }\n\n const dropOverlap = this.options.drop.overlap;\n\n if (dropOverlap === 'pointer') {\n const origin = utils.getOriginXY(draggable, draggableElement, 'drag');\n const page = utils.getPageXY(dragEvent);\n\n page.x += origin.x;\n page.y += origin.y;\n\n const horizontal = (page.x > rect.left) && (page.x < rect.right);\n const vertical = (page.y > rect.top ) && (page.y < rect.bottom);\n\n dropped = horizontal && vertical;\n }\n\n const dragRect = draggable.getRect(draggableElement);\n\n if (dragRect && dropOverlap === 'center') {\n const cx = dragRect.left + dragRect.width / 2;\n const cy = dragRect.top + dragRect.height / 2;\n\n dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom;\n }\n\n if (dragRect && utils.is.number(dropOverlap)) {\n const overlapArea = (Math.max(0, Math.min(rect.right , dragRect.right ) - Math.max(rect.left, dragRect.left))\n * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top , dragRect.top )));\n\n const overlapRatio = overlapArea / (dragRect.width * dragRect.height);\n\n dropped = overlapRatio >= dropOverlap;\n }\n\n if (this.options.drop.checker) {\n dropped = this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement);\n }\n\n return dropped;\n};\n\nInteractable.signals.on('unset', function ({ interactable }) {\n interactable.dropzone(false);\n});\n\nInteractable.settingsMethods.push('dropChecker');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.dropTarget = null; // the dropzone a drag target might be dropped into\n interaction.dropElement = null; // the element at the time of checking\n interaction.prevDropTarget = null; // the dropzone that was recently dragged away from\n interaction.prevDropElement = null; // the element at the time of checking\n interaction.dropEvents = null; // the dropEvents related to the current drag event\n\n interaction.activeDrops = {\n dropzones: [], // the dropzones that are mentioned below\n elements : [], // elements of dropzones that accept the target draggable\n rects : [], // the rects of the elements mentioned above\n };\n\n});\n\nInteraction.signals.on('stop', function ({ interaction }) {\n interaction.dropTarget = interaction.dropElement =\n interaction.prevDropTarget = interaction.prevDropElement = null;\n});\n\n/*\\\n * interact.dynamicDrop\n [ method ]\n *\n * Returns or sets whether the dimensions of dropzone elements are\n * calculated on every dragmove or only on dragstart for the default\n * dropChecker\n *\n - newValue (boolean) #optional True to check on each move. False to check only before start\n = (boolean | interact) The current setting or interact\n\\*/\ninteract.dynamicDrop = function (newValue) {\n if (utils.is.bool(newValue)) {\n //if (dragging && dynamicDrop !== newValue && !newValue) {\n //calcRects(dropzones);\n //}\n\n dynamicDrop = newValue;\n\n return interact;\n }\n return dynamicDrop;\n};\n\nutils.merge(Interactable.eventTypes, [\n 'dragenter',\n 'dragleave',\n 'dropactivate',\n 'dropdeactivate',\n 'dropmove',\n 'drop',\n]);\nactions.methodDict.drop = 'dropzone';\n\ndefaultOptions.drop = drop.defaults;\n\nmodule.exports = drop;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst gesture = {\n defaults: {\n enabled : false,\n origin : null,\n restrict: null,\n },\n\n checker: function (pointer, event, interactable, element, interaction) {\n if (interaction.pointerIds.length >= 2) {\n return { name: 'gesture' };\n }\n\n return null;\n },\n\n getCursor: function () {\n return '';\n },\n};\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturestart') { return; }\n iEvent.ds = 0;\n\n interaction.gesture.startDistance = interaction.gesture.prevDistance = iEvent.distance;\n interaction.gesture.startAngle = interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.scale = 1;\n});\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturemove') { return; }\n\n iEvent.ds = iEvent.scale - interaction.gesture.scale;\n\n interaction.target.fire(iEvent);\n\n interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.prevDistance = iEvent.distance;\n\n if (iEvent.scale !== Infinity\n && iEvent.scale !== null\n && iEvent.scale !== undefined\n && !isNaN(iEvent.scale)) {\n\n interaction.gesture.scale = iEvent.scale;\n }\n});\n\n/*\\\n * Interactable.gesturable\n [ method ]\n *\n * Gets or sets whether multitouch gestures can be performed on the\n * Interactable's element\n *\n = (boolean) Indicates if this can be the target of gesture events\n | var isGestureable = interact(element).gesturable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on gesture events (makes the Interactable gesturable)\n = (object) this Interactable\n | interact(element).gesturable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // limit multiple gestures.\n | // See the explanation in @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n\\*/\nInteractable.prototype.gesturable = function (options) {\n if (utils.is.object(options)) {\n this.options.gesture.enabled = options.enabled === false? false: true;\n this.setPerAction('gesture', options);\n this.setOnEvents('gesture', options);\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.gesture.enabled = options;\n\n if (!options) {\n this.ongesturestart = this.ongesturestart = this.ongestureend = null;\n }\n\n return this;\n }\n\n return this.options.gesture;\n};\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action, event, starting, ending, deltaSource }) {\n if (action !== 'gesture') { return; }\n\n const pointers = interaction.pointers;\n\n iEvent.touches = [pointers[0], pointers[1]];\n\n if (starting) {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = 1;\n iEvent.ds = 0;\n iEvent.angle = utils.touchAngle(pointers, undefined, deltaSource);\n iEvent.da = 0;\n }\n else if (ending || event instanceof InteractEvent) {\n iEvent.distance = interaction.prevEvent.distance;\n iEvent.box = interaction.prevEvent.box;\n iEvent.scale = interaction.prevEvent.scale;\n iEvent.ds = iEvent.scale - 1;\n iEvent.angle = interaction.prevEvent.angle;\n iEvent.da = iEvent.angle - interaction.gesture.startAngle;\n }\n else {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = iEvent.distance / interaction.gesture.startDistance;\n iEvent.angle = utils.touchAngle(pointers, interaction.gesture.prevAngle, deltaSource);\n\n iEvent.ds = iEvent.scale - interaction.gesture.prevScale;\n iEvent.da = iEvent.angle - interaction.gesture.prevAngle;\n }\n});\n\nInteraction.signals.on('new', function (interaction) {\n interaction.gesture = {\n start: { x: 0, y: 0 },\n\n startDistance: 0, // distance between two touches of touchStart\n prevDistance : 0,\n distance : 0,\n\n scale: 1, // gesture.distance / gesture.startDistance\n\n startAngle: 0, // angle of line joining two touches\n prevAngle : 0, // angle of the previous gesture event\n };\n});\n\nactions.gesture = gesture;\nactions.names.push('gesture');\nutils.merge(Interactable.eventTypes, [\n 'gesturestart',\n 'gesturemove',\n 'gestureend',\n]);\nactions.methodDict.gesture = 'gesturable';\n\ndefaultOptions.gesture = gesture.defaults;\n\nmodule.exports = gesture;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\n// Less Precision with touch input\nconst defaultMargin = browser.supportsTouch || browser.supportsPointerEvent? 20: 10;\n\nconst resize = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n square: false,\n preserveAspectRatio: false,\n axis: 'xy',\n\n // use default margin\n margin: NaN,\n\n // object with props left, right, top, bottom which are\n // true/false values to resize when the pointer is over that edge,\n // CSS selectors to match the handles for each direction\n // or the Elements for each handle\n edges: null,\n\n // a value of 'none' will limit the resize rect to a minimum of 0x0\n // 'negate' will alow the rect to have negative width/height\n // 'reposition' will keep the width/height positive by swapping\n // the top and bottom edges and/or swapping the left and right edges\n invert: 'none',\n },\n\n checker: function (pointer, event, interactable, element, interaction, rect) {\n if (!rect) { return null; }\n\n const page = utils.extend({}, interaction.curCoords.page);\n const options = interactable.options;\n\n if (options.resize.enabled) {\n const resizeOptions = options.resize;\n const resizeEdges = { left: false, right: false, top: false, bottom: false };\n\n // if using resize.edges\n if (utils.is.object(resizeOptions.edges)) {\n for (const edge in resizeEdges) {\n resizeEdges[edge] = checkResizeEdge(edge,\n resizeOptions.edges[edge],\n page,\n interaction._eventTarget,\n element,\n rect,\n resizeOptions.margin || defaultMargin);\n }\n\n resizeEdges.left = resizeEdges.left && !resizeEdges.right;\n resizeEdges.top = resizeEdges.top && !resizeEdges.bottom;\n\n if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) {\n return {\n name: 'resize',\n edges: resizeEdges,\n };\n }\n }\n else {\n const right = options.resize.axis !== 'y' && page.x > (rect.right - defaultMargin);\n const bottom = options.resize.axis !== 'x' && page.y > (rect.bottom - defaultMargin);\n\n if (right || bottom) {\n return {\n name: 'resize',\n axes: (right? 'x' : '') + (bottom? 'y' : ''),\n };\n }\n }\n }\n\n return null;\n },\n\n cursors: (browser.isIe9OrOlder ? {\n x : 'e-resize',\n y : 's-resize',\n xy: 'se-resize',\n\n top : 'n-resize',\n left : 'w-resize',\n bottom : 's-resize',\n right : 'e-resize',\n topleft : 'se-resize',\n bottomright: 'se-resize',\n topright : 'ne-resize',\n bottomleft : 'ne-resize',\n } : {\n x : 'ew-resize',\n y : 'ns-resize',\n xy: 'nwse-resize',\n\n top : 'ns-resize',\n left : 'ew-resize',\n bottom : 'ns-resize',\n right : 'ew-resize',\n topleft : 'nwse-resize',\n bottomright: 'nwse-resize',\n topright : 'nesw-resize',\n bottomleft : 'nesw-resize',\n }),\n\n getCursor: function (action) {\n if (action.axis) {\n return resize.cursors[action.name + action.axis];\n }\n else if (action.edges) {\n let cursorKey = '';\n const edgeNames = ['top', 'bottom', 'left', 'right'];\n\n for (let i = 0; i < 4; i++) {\n if (action.edges[edgeNames[i]]) {\n cursorKey += edgeNames[i];\n }\n }\n\n return resize.cursors[cursorKey];\n }\n },\n};\n\n// resizestart\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'resizestart' || !interaction.prepared.edges) {\n return;\n }\n\n const startRect = interaction.target.getRect(interaction.element);\n const resizeOptions = interaction.target.options.resize;\n\n /*\n * When using the `resizable.square` or `resizable.preserveAspectRatio` options, resizing from one edge\n * will affect another. E.g. with `resizable.square`, resizing to make the right edge larger will make\n * the bottom edge larger by the same amount. We call these 'linked' edges. Any linked edges will depend\n * on the active edges and the edge being interacted with.\n */\n if (resizeOptions.square || resizeOptions.preserveAspectRatio) {\n const linkedEdges = utils.extend({}, interaction.prepared.edges);\n\n linkedEdges.top = linkedEdges.top || (linkedEdges.left && !linkedEdges.bottom);\n linkedEdges.left = linkedEdges.left || (linkedEdges.top && !linkedEdges.right );\n linkedEdges.bottom = linkedEdges.bottom || (linkedEdges.right && !linkedEdges.top );\n linkedEdges.right = linkedEdges.right || (linkedEdges.bottom && !linkedEdges.left );\n\n interaction.prepared._linkedEdges = linkedEdges;\n }\n else {\n interaction.prepared._linkedEdges = null;\n }\n\n // if using `resizable.preserveAspectRatio` option, record aspect ratio at the start of the resize\n if (resizeOptions.preserveAspectRatio) {\n interaction.resizeStartAspectRatio = startRect.width / startRect.height;\n }\n\n interaction.resizeRects = {\n start : startRect,\n current : utils.extend({}, startRect),\n inverted : utils.extend({}, startRect),\n previous : utils.extend({}, startRect),\n delta : {\n left: 0, right : 0, width : 0,\n top : 0, bottom: 0, height: 0,\n },\n };\n\n iEvent.rect = interaction.resizeRects.inverted;\n iEvent.deltaRect = interaction.resizeRects.delta;\n});\n\n// resizemove\nInteractEvent.signals.on('new', function ({ iEvent, phase, interaction }) {\n if (phase !== 'move' || !interaction.prepared.edges) { return; }\n\n const resizeOptions = interaction.target.options.resize;\n const invert = resizeOptions.invert;\n const invertible = invert === 'reposition' || invert === 'negate';\n\n let edges = interaction.prepared.edges;\n\n const start = interaction.resizeRects.start;\n const current = interaction.resizeRects.current;\n const inverted = interaction.resizeRects.inverted;\n const delta = interaction.resizeRects.delta;\n const previous = utils.extend(interaction.resizeRects.previous, inverted);\n const originalEdges = edges;\n\n let dx = iEvent.dx;\n let dy = iEvent.dy;\n\n if (resizeOptions.preserveAspectRatio || resizeOptions.square) {\n // `resize.preserveAspectRatio` takes precedence over `resize.square`\n const startAspectRatio = resizeOptions.preserveAspectRatio\n ? interaction.resizeStartAspectRatio\n : 1;\n\n edges = interaction.prepared._linkedEdges;\n\n if ((originalEdges.left && originalEdges.bottom)\n || (originalEdges.right && originalEdges.top)) {\n dy = -dx / startAspectRatio;\n }\n else if (originalEdges.left || originalEdges.right ) { dy = dx / startAspectRatio; }\n else if (originalEdges.top || originalEdges.bottom) { dx = dy * startAspectRatio; }\n }\n\n // update the 'current' rect without modifications\n if (edges.top ) { current.top += dy; }\n if (edges.bottom) { current.bottom += dy; }\n if (edges.left ) { current.left += dx; }\n if (edges.right ) { current.right += dx; }\n\n if (invertible) {\n // if invertible, copy the current rect\n utils.extend(inverted, current);\n\n if (invert === 'reposition') {\n // swap edge values if necessary to keep width/height positive\n let swap;\n\n if (inverted.top > inverted.bottom) {\n swap = inverted.top;\n\n inverted.top = inverted.bottom;\n inverted.bottom = swap;\n }\n if (inverted.left > inverted.right) {\n swap = inverted.left;\n\n inverted.left = inverted.right;\n inverted.right = swap;\n }\n }\n }\n else {\n // if not invertible, restrict to minimum of 0x0 rect\n inverted.top = Math.min(current.top, start.bottom);\n inverted.bottom = Math.max(current.bottom, start.top);\n inverted.left = Math.min(current.left, start.right);\n inverted.right = Math.max(current.right, start.left);\n }\n\n inverted.width = inverted.right - inverted.left;\n inverted.height = inverted.bottom - inverted.top ;\n\n for (const edge in inverted) {\n delta[edge] = inverted[edge] - previous[edge];\n }\n\n iEvent.edges = interaction.prepared.edges;\n iEvent.rect = inverted;\n iEvent.deltaRect = delta;\n});\n\n/*\\\n * Interactable.resizable\n [ method ]\n *\n * Gets or sets whether resize actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of resize elements\n | var isResizeable = interact('input[type=text]').resizable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on resize events (object makes the Interactable resizable)\n = (object) This Interactable\n | interact(element).resizable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | edges: {\n | top : true, // Use pointer coords to check for resize.\n | left : false, // Disable resizing from left edge.\n | bottom: '.resize-s',// Resize if pointer target matches selector\n | right : handleEl // Resize if pointer target is the given Element\n | },\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height are adjusted at a 1:1 ratio.\n | square: false,\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height maintain the aspect ratio they had when resizing started.\n | preserveAspectRatio: false,\n |\n | // a value of 'none' will limit the resize rect to a minimum of 0x0\n | // 'negate' will allow the rect to have negative width/height\n | // 'reposition' will keep the width/height positive by swapping\n | // the top and bottom edges and/or swapping the left and right edges\n | invert: 'none' || 'negate' || 'reposition'\n |\n | // limit multiple resizes.\n | // See the explanation in the @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n \\*/\nInteractable.prototype.resizable = function (options) {\n if (utils.is.object(options)) {\n this.options.resize.enabled = options.enabled === false? false: true;\n this.setPerAction('resize', options);\n this.setOnEvents('resize', options);\n\n if (/^x$|^y$|^xy$/.test(options.axis)) {\n this.options.resize.axis = options.axis;\n }\n else if (options.axis === null) {\n this.options.resize.axis = defaultOptions.resize.axis;\n }\n\n if (utils.is.bool(options.preserveAspectRatio)) {\n this.options.resize.preserveAspectRatio = options.preserveAspectRatio;\n }\n else if (utils.is.bool(options.square)) {\n this.options.resize.square = options.square;\n }\n\n return this;\n }\n if (utils.is.bool(options)) {\n this.options.resize.enabled = options;\n\n if (!options) {\n this.onresizestart = this.onresizestart = this.onresizeend = null;\n }\n\n return this;\n }\n return this.options.resize;\n};\n\nfunction checkResizeEdge (name, value, page, element, interactableElement, rect, margin) {\n // false, '', undefined, null\n if (!value) { return false; }\n\n // true value, use pointer coords and element rect\n if (value === true) {\n // if dimensions are negative, \"switch\" edges\n const width = utils.is.number(rect.width )? rect.width : rect.right - rect.left;\n const height = utils.is.number(rect.height)? rect.height : rect.bottom - rect.top ;\n\n if (width < 0) {\n if (name === 'left' ) { name = 'right'; }\n else if (name === 'right') { name = 'left' ; }\n }\n if (height < 0) {\n if (name === 'top' ) { name = 'bottom'; }\n else if (name === 'bottom') { name = 'top' ; }\n }\n\n if (name === 'left' ) { return page.x < ((width >= 0? rect.left: rect.right ) + margin); }\n if (name === 'top' ) { return page.y < ((height >= 0? rect.top : rect.bottom) + margin); }\n\n if (name === 'right' ) { return page.x > ((width >= 0? rect.right : rect.left) - margin); }\n if (name === 'bottom') { return page.y > ((height >= 0? rect.bottom: rect.top ) - margin); }\n }\n\n // the remaining checks require an element\n if (!utils.is.element(element)) { return false; }\n\n return utils.is.element(value)\n // the value is an element to use as a resize handle\n ? value === element\n // otherwise check if element matches value as selector\n : utils.matchesUpTo(element, value, interactableElement);\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.resizeAxes = 'xy';\n});\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action }) {\n if (action !== 'resize' || !interaction.resizeAxes) { return; }\n\n const options = interaction.target.options;\n\n if (options.resize.square) {\n if (interaction.resizeAxes === 'y') {\n iEvent.dx = iEvent.dy;\n }\n else {\n iEvent.dy = iEvent.dx;\n }\n iEvent.axes = 'xy';\n }\n else {\n iEvent.axes = interaction.resizeAxes;\n\n if (interaction.resizeAxes === 'x') {\n iEvent.dy = 0;\n }\n else if (interaction.resizeAxes === 'y') {\n iEvent.dx = 0;\n }\n }\n});\n\nactions.resize = resize;\nactions.names.push('resize');\nutils.merge(Interactable.eventTypes, [\n 'resizestart',\n 'resizemove',\n 'resizeinertiastart',\n 'resizeinertiaresume',\n 'resizeend',\n]);\nactions.methodDict.resize = 'resizable';\n\ndefaultOptions.resize = resize.defaults;\n\nmodule.exports = resize;\n","const raf = require('./utils/raf');\nconst getWindow = require('./utils/window').getWindow;\nconst is = require('./utils/is');\nconst domUtils = require('./utils/domUtils');\nconst Interaction = require('./Interaction');\nconst defaultOptions = require('./defaultOptions');\n\nconst autoScroll = {\n defaults: {\n enabled : false,\n container: null, // the item that is scrolled (Window or HTMLElement)\n margin : 60,\n speed : 300, // the scroll speed in pixels per second\n },\n\n interaction: null,\n i: null, // the handle returned by window.setInterval\n x: 0, y: 0, // Direction each pulse is to scroll in\n\n isScrolling: false,\n prevTime: 0,\n\n start: function (interaction) {\n autoScroll.isScrolling = true;\n raf.cancel(autoScroll.i);\n\n autoScroll.interaction = interaction;\n autoScroll.prevTime = new Date().getTime();\n autoScroll.i = raf.request(autoScroll.scroll);\n },\n\n stop: function () {\n autoScroll.isScrolling = false;\n raf.cancel(autoScroll.i);\n },\n\n // scroll the window by the values in scroll.x/y\n scroll: function () {\n const options = autoScroll.interaction.target.options[autoScroll.interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(autoScroll.interaction.element);\n const now = new Date().getTime();\n // change in time in seconds\n const dt = (now - autoScroll.prevTime) / 1000;\n // displacement\n const s = options.speed * dt;\n\n if (s >= 1) {\n if (is.window(container)) {\n container.scrollBy(autoScroll.x * s, autoScroll.y * s);\n }\n else if (container) {\n container.scrollLeft += autoScroll.x * s;\n container.scrollTop += autoScroll.y * s;\n }\n\n autoScroll.prevTime = now;\n }\n\n if (autoScroll.isScrolling) {\n raf.cancel(autoScroll.i);\n autoScroll.i = raf.request(autoScroll.scroll);\n }\n },\n check: function (interactable, actionName) {\n const options = interactable.options;\n\n return options[actionName].autoScroll && options[actionName].autoScroll.enabled;\n },\n onInteractionMove: function ({ interaction, pointer }) {\n if (!(interaction.interacting()\n && autoScroll.check(interaction.target, interaction.prepared.name))) {\n return;\n }\n\n if (interaction.simulation) {\n autoScroll.x = autoScroll.y = 0;\n return;\n }\n\n let top;\n let right;\n let bottom;\n let left;\n\n const options = interaction.target.options[interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(interaction.element);\n\n if (is.window(container)) {\n left = pointer.clientX < autoScroll.margin;\n top = pointer.clientY < autoScroll.margin;\n right = pointer.clientX > container.innerWidth - autoScroll.margin;\n bottom = pointer.clientY > container.innerHeight - autoScroll.margin;\n }\n else {\n const rect = domUtils.getElementClientRect(container);\n\n left = pointer.clientX < rect.left + autoScroll.margin;\n top = pointer.clientY < rect.top + autoScroll.margin;\n right = pointer.clientX > rect.right - autoScroll.margin;\n bottom = pointer.clientY > rect.bottom - autoScroll.margin;\n }\n\n autoScroll.x = (right ? 1: left? -1: 0);\n autoScroll.y = (bottom? 1: top? -1: 0);\n\n if (!autoScroll.isScrolling) {\n // set the autoScroll properties to those of the target\n autoScroll.margin = options.margin;\n autoScroll.speed = options.speed;\n\n autoScroll.start(interaction);\n }\n },\n};\n\nInteraction.signals.on('stop-active', function () {\n autoScroll.stop();\n});\n\nInteraction.signals.on('action-move', autoScroll.onInteractionMove);\n\ndefaultOptions.perAction.autoScroll = autoScroll.defaults;\n\nmodule.exports = autoScroll;\n","const Interactable = require('../Interactable');\nconst actions = require('../actions/base');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.ignoreFrom\n [ method ]\n *\n * If the target of the `mousedown`, `pointerdown` or `touchstart`\n * event or any of it's parents match the given CSS selector or\n * Element, no drag/resize/gesture is started.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to not ignore any elements\n = (string | Element | object) The current ignoreFrom value or this Interactable\n **\n | interact(element, { ignoreFrom: document.getElementById('no-action') });\n | // or\n | interact(element).ignoreFrom('input, textarea, a');\n\\*/\nInteractable.prototype.ignoreFrom = function (newValue) {\n return this._backCompatOption('ignoreFrom', newValue);\n};\n\n/*\\\n * Interactable.allowFrom\n [ method ]\n *\n * A drag/resize/gesture is started only If the target of the\n * `mousedown`, `pointerdown` or `touchstart` event or any of it's\n * parents match the given CSS selector or Element.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to allow from any element\n = (string | Element | object) The current allowFrom value or this Interactable\n **\n | interact(element, { allowFrom: document.getElementById('drag-handle') });\n | // or\n | interact(element).allowFrom('.handle');\n\\*/\nInteractable.prototype.allowFrom = function (newValue) {\n return this._backCompatOption('allowFrom', newValue);\n};\n\nInteractable.prototype.testIgnore = function (ignoreFrom, interactableElement, element) {\n if (!ignoreFrom || !is.element(element)) { return false; }\n\n if (is.string(ignoreFrom)) {\n return domUtils.matchesUpTo(element, ignoreFrom, interactableElement);\n }\n else if (is.element(ignoreFrom)) {\n return domUtils.nodeContains(ignoreFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testAllow = function (allowFrom, interactableElement, element) {\n if (!allowFrom) { return true; }\n\n if (!is.element(element)) { return false; }\n\n if (is.string(allowFrom)) {\n return domUtils.matchesUpTo(element, allowFrom, interactableElement);\n }\n else if (is.element(allowFrom)) {\n return domUtils.nodeContains(allowFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testIgnoreAllow = function (options, interactableElement, eventTarget) {\n return (!this.testIgnore(options.ignoreFrom, interactableElement, eventTarget)\n && this.testAllow(options.allowFrom, interactableElement, eventTarget));\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (event.buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\n","const interact = require('../interact');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst actions = require('../actions/base');\nconst defaultOptions = require('../defaultOptions');\nconst browser = require('../utils/browser');\nconst scope = require('../scope');\nconst utils = require('../utils');\nconst signals = require('../utils/Signals').new();\n\nrequire('./InteractableMethods');\n\nconst autoStart = {\n signals,\n withinInteractionLimit,\n // Allow this many interactions to happen simultaneously\n maxInteractions: Infinity,\n defaults: {\n perAction: {\n manualStart: false,\n max: Infinity,\n maxPerElement: 1,\n allowFrom: null,\n ignoreFrom: null,\n },\n },\n setActionDefaults: function (action) {\n utils.extend(action.defaults, autoStart.defaults.perAction);\n },\n};\n\n// set cursor style on mousedown\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget }) {\n if (interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\n// set cursor style on mousemove\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget }) {\n if (!interaction.mouse\n || interaction.pointerIsDown\n || interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\nInteraction.signals.on('move', function (arg) {\n const { interaction, event } = arg;\n\n if (!interaction.pointerIsDown\n || interaction.interacting()\n || !interaction.pointerWasMoved\n || !interaction.prepared.name) {\n return;\n }\n\n signals.fire('before-start', arg);\n\n const target = interaction.target;\n\n if (interaction.prepared.name && target) {\n // check manualStart and interaction limit\n if (target.options[interaction.prepared.name].manualStart\n || !withinInteractionLimit(target, interaction.element, interaction.prepared)) {\n interaction.stop(event);\n }\n else {\n interaction.start(interaction.prepared, target, interaction.element);\n }\n }\n});\n\n// Check if the current target supports the action.\n// If so, return the validated action. Otherwise, return null\nfunction validateAction (action, interactable, element, eventTarget) {\n if (utils.is.object(action)\n && interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget)\n && interactable.options[action.name].enabled\n && withinInteractionLimit(interactable, element, action)) {\n return action;\n }\n\n return null;\n}\n\nfunction validateSelector (interaction, pointer, event, matches, matchElements, eventTarget) {\n for (let i = 0, len = matches.length; i < len; i++) {\n const match = matches[i];\n const matchElement = matchElements[i];\n const action = validateAction(match.getAction(pointer, event, interaction, matchElement),\n match,\n matchElement,\n eventTarget);\n\n if (action) {\n return {\n action,\n target: match,\n element: matchElement,\n };\n }\n }\n\n return {};\n}\n\nfunction getActionInfo (interaction, pointer, event, eventTarget) {\n let matches = [];\n let matchElements = [];\n\n let element = eventTarget;\n let action = null;\n\n function pushMatches (interactable, selector, context) {\n const elements = (browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined);\n\n if (utils.matchesSelector(element, selector, elements)) {\n\n matches.push(interactable);\n matchElements.push(element);\n }\n }\n\n while (utils.is.element(element)) {\n matches = [];\n matchElements = [];\n\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && (action = validateAction(elementInteractable.getAction(pointer, event, interaction, element, eventTarget),\n elementInteractable,\n element,\n eventTarget))\n && !elementInteractable.options[action.name].manualStart) {\n return {\n element,\n action,\n target: elementInteractable,\n };\n }\n else {\n scope.interactables.forEachSelector(pushMatches, element);\n\n const actionInfo = validateSelector(interaction, pointer, event, matches, matchElements, eventTarget);\n\n if (actionInfo.action\n && !actionInfo.target.options[actionInfo.action.name].manualStart) {\n return actionInfo;\n }\n }\n\n element = utils.parentNode(element);\n }\n\n return {};\n}\n\nfunction prepare (interaction, { action, target, element }) {\n action = action || {};\n\n if (interaction.target && interaction.target.options.styleCursor) {\n interaction.target._doc.documentElement.style.cursor = '';\n }\n\n interaction.target = target;\n interaction.element = element;\n utils.copyAction(interaction.prepared, action);\n\n if (target && target.options.styleCursor) {\n const cursor = action? actions[action.name].getCursor(action) : '';\n interaction.target._doc.documentElement.style.cursor = cursor;\n }\n\n signals.fire('prepared', { interaction: interaction });\n}\n\nInteraction.signals.on('stop', function ({ interaction }) {\n const target = interaction.target;\n\n if (target && target.options.styleCursor) {\n target._doc.documentElement.style.cursor = '';\n }\n});\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (utils.is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (utils.is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n const buttons = event.buttons || ({\n 0: 1,\n 1: 4,\n 3: 8,\n 4: 16,\n })[event.button];\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\nfunction withinInteractionLimit (interactable, element, action) {\n const options = interactable.options;\n const maxActions = options[action.name].max;\n const maxPerElement = options[action.name].maxPerElement;\n let activeInteractions = 0;\n let targetCount = 0;\n let targetElementCount = 0;\n\n // no actions if any of these values == 0\n if (!(maxActions && maxPerElement && autoStart.maxInteractions)) { return; }\n\n for (let i = 0, len = scope.interactions.length; i < len; i++) {\n const interaction = scope.interactions[i];\n const otherAction = interaction.prepared.name;\n\n if (!interaction.interacting()) { continue; }\n\n activeInteractions++;\n\n if (activeInteractions >= autoStart.maxInteractions) {\n return false;\n }\n\n if (interaction.target !== interactable) { continue; }\n\n targetCount += (otherAction === action.name)|0;\n\n if (targetCount >= maxActions) {\n return false;\n }\n\n if (interaction.element === element) {\n targetElementCount++;\n\n if (otherAction !== action.name || targetElementCount >= maxPerElement) {\n return false;\n }\n }\n }\n\n return autoStart.maxInteractions > 0;\n}\n\n/*\\\n * interact.maxInteractions\n [ method ]\n **\n * Returns or sets the maximum number of concurrent interactions allowed.\n * By default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables\n * and elements, you need to enable it in the draggable, resizable and\n * gesturable `'max'` and `'maxPerElement'` options.\n **\n - newValue (number) #optional Any number. newValue <= 0 means no interactions.\n\\*/\ninteract.maxInteractions = function (newValue) {\n if (utils.is.number(newValue)) {\n autoStart.maxInteractions = newValue;\n\n return this;\n }\n\n return autoStart.maxInteractions;\n};\n\nInteractable.settingsMethods.push('styleCursor');\nInteractable.settingsMethods.push('actionChecker');\nInteractable.settingsMethods.push('ignoreFrom');\nInteractable.settingsMethods.push('allowFrom');\n\ndefaultOptions.base.actionChecker = null;\ndefaultOptions.base.styleCursor = true;\n\nutils.extend(defaultOptions.perAction, autoStart.defaults.perAction);\n\nmodule.exports = autoStart;\n","const autoStart = require('./base');\nconst Interaction = require('../Interaction');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.delayTimer = null;\n});\n\nautoStart.signals.on('prepared', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.delayTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.target, interaction.element);\n }, delay);\n }\n});\n\nInteraction.signals.on('move', function ({ interaction, duplicate }) {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.delayTimer);\n }\n});\n\n// prevent regular down->move autoStart\nautoStart.signals.on('before-start', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.prepared.name = null;\n }\n});\n","const autoStart = require('./base');\nconst scope = require('../scope');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\n\nconst { matchesSelector, parentNode } = require('../utils/domUtils');\n\nautoStart.setActionDefaults(require('../actions/drag'));\n\nautoStart.signals.on('before-start', function ({ interaction, eventTarget, dx, dy }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // check if a drag is in the correct axis\n const absX = Math.abs(dx);\n const absY = Math.abs(dy);\n const options = interaction.target.options.drag;\n const startAxis = options.startAxis;\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy');\n\n interaction.prepared.axis = options.lockAxis === 'start'\n ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n : options.lockAxis;\n\n // if the movement isn't in the startAxis of the interactable\n if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) {\n // cancel the prepared action\n interaction.prepared.name = null;\n\n // then try to get a drag from another ineractable\n\n if (!interaction.prepared.name) {\n\n let element = eventTarget;\n\n const getDraggable = function (interactable, selector, context) {\n const elements = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n if (interactable === interaction.target) { return; }\n\n if (!options.manualStart\n && !interactable.testIgnoreAllow(options, element, eventTarget)\n && matchesSelector(element, selector, elements)) {\n\n const action = interactable.getAction(interaction.downPointer,\n interaction.downEvent,\n interaction,\n element);\n\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, interactable)\n && autoStart.validateAction(action, interactable, element, eventTarget)) {\n\n return interactable;\n }\n }\n };\n\n let action = null;\n\n // check all interactables\n while (is.element(element)) {\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && elementInteractable !== interaction.target\n && !elementInteractable.options.drag.manualStart) {\n\n action = elementInteractable.getAction(interaction.downPointer, interaction.downEvent, interaction, element);\n }\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, elementInteractable)) {\n\n interaction.prepared.name = 'drag';\n interaction.target = elementInteractable;\n interaction.element = element;\n break;\n }\n\n const selectorInteractable = scope.interactables.forEachSelector(getDraggable, element);\n\n if (selectorInteractable) {\n interaction.prepared.name = 'drag';\n interaction.target = selectorInteractable;\n interaction.element = element;\n break;\n }\n\n element = parentNode(element);\n }\n }\n }\n});\n\nfunction checkStartAxis (startAxis, interactable) {\n if (!interactable) { return false; }\n\n const thisAxis = interactable.options.drag.startAxis;\n\n return (startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis);\n}\n","require('./base').setActionDefaults(require('../actions/gesture'));\n","require('./base').setActionDefaults(require('../actions/resize'));\n","module.exports = {\n base: {\n accept : null,\n preventDefault: 'auto',\n deltaSource : 'page',\n },\n\n perAction: {\n origin: { x: 0, y: 0 },\n\n // only allow left button by default\n // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n mouseButtons: 1,\n\n inertia: {\n enabled : false,\n resistance : 10, // the lambda in exponential decay\n minSpeed : 100, // target speed must be above this for inertia to start\n endSpeed : 10, // the speed at which inertia is slow enough to stop\n allowResume : true, // allow resuming an action in inertia phase\n smoothEndDuration: 300, // animate to snap/restrict endOnly if there's no inertia\n },\n },\n};\n","/* browser entry point */\n\n// Legacy browser support\nrequire('./legacyBrowsers');\n\n// inertia\nrequire('./inertia');\n\n// modifiers\nrequire('./modifiers/snap');\nrequire('./modifiers/restrict');\n\n// pointerEvents\nrequire('./pointerEvents/base');\nrequire('./pointerEvents/holdRepeat');\nrequire('./pointerEvents/interactableTargets');\n\n// delay\nrequire('./autoStart/delay');\n\n// actions\nrequire('./actions/gesture');\nrequire('./actions/resize');\nrequire('./actions/drag');\nrequire('./actions/drop');\n\n// load these modifiers after resize is loaded\nrequire('./modifiers/snapSize');\nrequire('./modifiers/restrictEdges');\nrequire('./modifiers/restrictSize');\n\n// autoStart actions\nrequire('./autoStart/gesture');\nrequire('./autoStart/resize');\nrequire('./autoStart/drag');\n\n// Interactable preventDefault setting\nrequire('./interactablePreventDefault.js');\n\n// autoScroll\nrequire('./autoScroll');\n\n// export interact\nmodule.exports = require('./interact');\n","const InteractEvent = require('./InteractEvent');\nconst Interaction = require('./Interaction');\nconst modifiers = require('./modifiers');\nconst utils = require('./utils');\nconst animationFrame = require('./utils/raf');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.inertiaStatus = {\n active : false,\n smoothEnd : false,\n allowResume: false,\n\n startEvent: null,\n upCoords : {},\n\n xe: 0, ye: 0,\n sx: 0, sy: 0,\n\n t0: 0,\n vx0: 0, vys: 0,\n duration: 0,\n\n lambda_v0: 0,\n one_ve_v0: 0,\n i : null,\n };\n\n interaction.boundInertiaFrame = () => inertiaFrame .apply(interaction);\n interaction.boundSmoothEndFrame = () => smoothEndFrame.apply(interaction);\n});\n\nInteraction.signals.on('down', function ({ interaction, event, pointer, eventTarget }) {\n const status = interaction.inertiaStatus;\n\n // Check if the down event hits the current inertia target\n if (status.active) {\n let element = eventTarget;\n\n // climb up the DOM tree from the event target\n while (utils.is.element(element)) {\n\n // if interaction element is the current inertia target element\n if (element === interaction.element) {\n // stop inertia\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n\n // update pointers to the down event's coordinates\n interaction.updatePointer(pointer);\n utils.setCoords(interaction.curCoords, interaction.pointers);\n\n // fire appropriate signals\n const signalArg = { interaction };\n Interaction.signals.fire('before-action-move', signalArg);\n Interaction.signals.fire('action-resume' , signalArg);\n\n // fire a reume event\n const resumeEvent = new InteractEvent(interaction,\n event,\n interaction.prepared.name,\n 'inertiaresume',\n interaction.element);\n\n interaction.target.fire(resumeEvent);\n interaction.prevEvent = resumeEvent;\n modifiers.resetStatuses(interaction.modifierStatuses);\n\n utils.copyCoords(interaction.prevCoords, interaction.curCoords);\n break;\n }\n\n element = utils.parentNode(element);\n }\n }\n});\n\nInteraction.signals.on('up', function ({ interaction, event }) {\n const status = interaction.inertiaStatus;\n\n if (!interaction.interacting() || status.active) { return; }\n\n const target = interaction.target;\n const options = target && target.options;\n const inertiaOptions = options && interaction.prepared.name && options[interaction.prepared.name].inertia;\n\n const now = new Date().getTime();\n const statuses = {};\n const page = utils.extend({}, interaction.curCoords.page);\n const pointerSpeed = interaction.pointerDelta.client.speed;\n\n let smoothEnd = false;\n let modifierResult;\n\n // check if inertia should be started\n const inertiaPossible = (inertiaOptions && inertiaOptions.enabled\n && interaction.prepared.name !== 'gesture'\n && event !== status.startEvent);\n\n const inertia = (inertiaPossible\n && (now - interaction.curCoords.timeStamp) < 50\n && pointerSpeed > inertiaOptions.minSpeed\n && pointerSpeed > inertiaOptions.endSpeed);\n\n const modifierArg = {\n interaction,\n pageCoords: page,\n statuses,\n preEnd: true,\n requireEndOnly: true,\n };\n\n // smoothEnd\n if (inertiaPossible && !inertia) {\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n if (modifierResult.shouldMove && modifierResult.locked) {\n smoothEnd = true;\n }\n }\n\n if (!(inertia || smoothEnd)) { return; }\n\n utils.copyCoords(status.upCoords, interaction.curCoords);\n\n interaction.pointers[0] = status.startEvent =\n new InteractEvent(interaction, event, interaction.prepared.name, 'inertiastart', interaction.element);\n\n status.t0 = now;\n\n status.active = true;\n status.allowResume = inertiaOptions.allowResume;\n interaction.simulation = status;\n\n target.fire(status.startEvent);\n\n if (inertia) {\n status.vx0 = interaction.pointerDelta.client.vx;\n status.vy0 = interaction.pointerDelta.client.vy;\n status.v0 = pointerSpeed;\n\n calcInertia(interaction, status);\n\n utils.extend(page, interaction.curCoords.page);\n\n page.x += status.xe;\n page.y += status.ye;\n\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n status.modifiedXe += modifierResult.dx;\n status.modifiedYe += modifierResult.dy;\n\n status.i = animationFrame.request(interaction.boundInertiaFrame);\n }\n else {\n status.smoothEnd = true;\n status.xe = modifierResult.dx;\n status.ye = modifierResult.dy;\n\n status.sx = status.sy = 0;\n\n status.i = animationFrame.request(interaction.boundSmoothEndFrame);\n }\n});\n\nInteraction.signals.on('stop-active', function ({ interaction }) {\n const status = interaction.inertiaStatus;\n\n if (status.active) {\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n }\n});\n\nfunction calcInertia (interaction, status) {\n const inertiaOptions = interaction.target.options[interaction.prepared.name].inertia;\n const lambda = inertiaOptions.resistance;\n const inertiaDur = -Math.log(inertiaOptions.endSpeed / status.v0) / lambda;\n\n status.x0 = interaction.prevEvent.pageX;\n status.y0 = interaction.prevEvent.pageY;\n status.t0 = status.startEvent.timeStamp / 1000;\n status.sx = status.sy = 0;\n\n status.modifiedXe = status.xe = (status.vx0 - inertiaDur) / lambda;\n status.modifiedYe = status.ye = (status.vy0 - inertiaDur) / lambda;\n status.te = inertiaDur;\n\n status.lambda_v0 = lambda / status.v0;\n status.one_ve_v0 = 1 - inertiaOptions.endSpeed / status.v0;\n}\n\nfunction inertiaFrame () {\n updateInertiaCoords(this);\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n\n const status = this.inertiaStatus;\n const options = this.target.options[this.prepared.name].inertia;\n const lambda = options.resistance;\n const t = new Date().getTime() / 1000 - status.t0;\n\n if (t < status.te) {\n\n const progress = 1 - (Math.exp(-lambda * t) - status.lambda_v0) / status.one_ve_v0;\n\n if (status.modifiedXe === status.xe && status.modifiedYe === status.ye) {\n status.sx = status.xe * progress;\n status.sy = status.ye * progress;\n }\n else {\n const quadPoint = utils.getQuadraticCurvePoint(0, 0,\n status.xe,\n status.ye,\n status.modifiedXe,\n status.modifiedYe,\n progress);\n\n status.sx = quadPoint.x;\n status.sy = quadPoint.y;\n }\n\n this.doMove();\n\n status.i = animationFrame.request(this.boundInertiaFrame);\n }\n else {\n status.sx = status.modifiedXe;\n status.sy = status.modifiedYe;\n\n this.doMove();\n this.end(status.startEvent);\n status.active = false;\n this.simulation = null;\n }\n\n utils.copyCoords(this.prevCoords, this.curCoords);\n}\n\nfunction smoothEndFrame () {\n updateInertiaCoords(this);\n\n const status = this.inertiaStatus;\n const t = new Date().getTime() - status.t0;\n const duration = this.target.options[this.prepared.name].inertia.smoothEndDuration;\n\n if (t < duration) {\n status.sx = utils.easeOutQuad(t, 0, status.xe, duration);\n status.sy = utils.easeOutQuad(t, 0, status.ye, duration);\n\n this.pointerMove(status.startEvent, status.startEvent);\n\n status.i = animationFrame.request(this.boundSmoothEndFrame);\n }\n else {\n status.sx = status.xe;\n status.sy = status.ye;\n\n this.pointerMove(status.startEvent, status.startEvent);\n this.end(status.startEvent);\n\n status.smoothEnd =\n status.active = false;\n this.simulation = null;\n }\n}\n\nfunction updateInertiaCoords (interaction) {\n const status = interaction.inertiaStatus;\n\n // return if inertia isn't running\n if (!status.active) { return; }\n\n const pageUp = status.upCoords.page;\n const clientUp = status.upCoords.client;\n\n utils.setCoords(interaction.curCoords, [ {\n pageX : pageUp.x + status.sx,\n pageY : pageUp.y + status.sy,\n clientX: clientUp.x + status.sx,\n clientY: clientUp.y + status.sy,\n } ]);\n}\n","const browser = require('./utils/browser');\nconst events = require('./utils/events');\nconst utils = require('./utils');\nconst scope = require('./scope');\nconst Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\n\nconst globalEvents = {};\n\n/*\\\n * interact\n [ method ]\n *\n * The methods of this variable can be used to set elements as\n * interactables and also to change various default settings.\n *\n * Calling it as a function and passing an element or a valid CSS selector\n * string returns an Interactable object which has various methods to\n * configure it.\n *\n - element (Element | string) The HTML or SVG Element to interact with or CSS selector\n = (object) An @Interactable\n *\n > Usage\n | interact('#draggable').draggable(true);\n |\n | var rectables = interact('rect');\n | rectables\n | .gesturable(true)\n | .on('gesturemove', function (event) {\n | // ...\n | });\n\\*/\nfunction interact (element, options) {\n let interactable = scope.interactables.get(element, options);\n\n if (!interactable) {\n interactable = new Interactable(element, options);\n interactable.events.global = globalEvents;\n }\n\n return interactable;\n}\n\n/*\\\n * interact.isSet\n [ method ]\n *\n * Check if an element has been set\n - element (Element) The Element being searched for\n = (boolean) Indicates if the element or CSS selector was previously passed to interact\n\\*/\ninteract.isSet = function (element, options) {\n return scope.interactables.indexOfElement(element, options && options.context) !== -1;\n};\n\n/*\\\n * interact.on\n [ method ]\n *\n * Adds a global listener for an InteractEvent or adds a DOM event to\n * `document`\n *\n - type (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) interact\n\\*/\ninteract.on = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.on(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.on(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n // if it is an InteractEvent type, add listener to globalEvents\n if (utils.contains(Interactable.eventTypes, type)) {\n // if this type of event was never bound\n if (!globalEvents[type]) {\n globalEvents[type] = [listener];\n }\n else {\n globalEvents[type].push(listener);\n }\n }\n // If non InteractEvent type, addEventListener to document\n else {\n events.add(scope.document, type, listener, { options });\n }\n\n return interact;\n};\n\n/*\\\n * interact.off\n [ method ]\n *\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n - type (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) interact\n \\*/\ninteract.off = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.off(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.off(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n if (!utils.contains(Interactable.eventTypes, type)) {\n events.remove(scope.document, type, listener, options);\n }\n else {\n let index;\n\n if (type in globalEvents\n && (index = utils.indexOf(globalEvents[type], listener)) !== -1) {\n globalEvents[type].splice(index, 1);\n }\n }\n\n return interact;\n};\n\n/*\\\n * interact.debug\n [ method ]\n *\n * Returns an object which exposes internal data\n = (object) An object with properties that outline the current state and expose internal functions and variables\n\\*/\ninteract.debug = function () {\n return scope;\n};\n\n// expose the functions used to calculate multi-touch properties\ninteract.getPointerAverage = utils.pointerAverage;\ninteract.getTouchBBox = utils.touchBBox;\ninteract.getTouchDistance = utils.touchDistance;\ninteract.getTouchAngle = utils.touchAngle;\n\ninteract.getElementRect = utils.getElementRect;\ninteract.getElementClientRect = utils.getElementClientRect;\ninteract.matchesSelector = utils.matchesSelector;\ninteract.closest = utils.closest;\n\n/*\\\n * interact.supportsTouch\n [ method ]\n *\n = (boolean) Whether or not the browser supports touch input\n\\*/\ninteract.supportsTouch = function () {\n return browser.supportsTouch;\n};\n\n/*\\\n * interact.supportsPointerEvent\n [ method ]\n *\n = (boolean) Whether or not the browser supports PointerEvents\n\\*/\ninteract.supportsPointerEvent = function () {\n return browser.supportsPointerEvent;\n};\n\n/*\\\n * interact.stop\n [ method ]\n *\n * Cancels all interactions (end events are not fired)\n *\n - event (Event) An event on which to call preventDefault()\n = (object) interact\n\\*/\ninteract.stop = function (event) {\n for (let i = scope.interactions.length - 1; i >= 0; i--) {\n scope.interactions[i].stop(event);\n }\n\n return interact;\n};\n\n/*\\\n * interact.pointerMoveTolerance\n [ method ]\n * Returns or sets the distance the pointer must be moved before an action\n * sequence occurs. This also affects tolerance for tap events.\n *\n - newValue (number) #optional The movement from the start position must be greater than this value\n = (number | Interactable) The current setting or interact\n\\*/\ninteract.pointerMoveTolerance = function (newValue) {\n if (utils.is.number(newValue)) {\n Interaction.pointerMoveTolerance = newValue;\n\n return this;\n }\n\n return Interaction.pointerMoveTolerance;\n};\n\ninteract.addDocument = scope.addDocument;\ninteract.removeDocument = scope.removeDocument;\n\nscope.interact = interact;\n\nmodule.exports = interact;\n","const Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\nconst scope = require('./scope');\nconst is = require('./utils/is');\nconst events = require('./utils/events');\n\nconst { nodeContains, matchesSelector } = require('./utils/domUtils');\n\n/*\\\n * Interactable.preventDefault\n [ method ]\n *\n * Returns or sets whether to prevent the browser's default behaviour\n * in response to pointer events. Can be set to:\n * - `'always'` to always prevent\n * - `'never'` to never prevent\n * - `'auto'` to let interact.js try to determine what would be best\n *\n - newValue (string) #optional `true`, `false` or `'auto'`\n = (string | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.preventDefault = function (newValue) {\n if (/^(always|never|auto)$/.test(newValue)) {\n this.options.preventDefault = newValue;\n return this;\n }\n\n if (is.bool(newValue)) {\n this.options.preventDefault = newValue? 'always' : 'never';\n return this;\n }\n\n return this.options.preventDefault;\n};\n\nInteractable.prototype.checkAndPreventDefault = function (event) {\n const setting = this.options.preventDefault;\n\n if (setting === 'never') { return; }\n\n if (setting === 'always') {\n event.preventDefault();\n return;\n }\n\n // setting === 'auto'\n\n // don't preventDefault if the browser supports passiveEvents\n // CSS touch-action and user-selecct should be used instead\n if (events.supportsOptions) {\n return;\n }\n\n // don't preventDefault of pointerdown events\n if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) {\n return;\n }\n\n // don't preventDefault on editable elements\n if (is.element(event.target)\n && matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) {\n return;\n }\n\n event.preventDefault();\n};\n\nfunction onInteractionEvent ({ interaction, event }) {\n if (interaction.target) {\n interaction.target.checkAndPreventDefault(event);\n }\n}\n\nfor (const eventSignal of ['down', 'move', 'up', 'cancel']) {\n Interaction.signals.on(eventSignal, onInteractionEvent);\n}\n\n// prevent native HTML5 drag on interact.js target elements\nInteraction.docEvents.dragstart = function preventNativeDrag (event) {\n for (const interaction of scope.interactions) {\n\n if (interaction.element\n && (interaction.element === event.target\n || nodeContains(interaction.element, event.target))) {\n\n interaction.target.checkAndPreventDefault(event);\n return;\n }\n }\n};\n","const scope = require('./scope');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst iFinder = require('./utils/interactionFinder');\nconst pointerEvents = require('./pointerEvents/base');\n\nconst { window } = require('./utils/window');\n\nconst toString = Object.prototype.toString;\n\nif (!window.Array.isArray) {\n window.Array.isArray = function (obj) {\n return toString.call(obj) === '[object Array]';\n };\n}\n\nif (!String.prototype.trim) {\n String.prototype.trim = function () {\n return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n };\n}\n\n// http://www.quirksmode.org/dom/events/click.html\n// >Events leading to dblclick\n//\n// IE8 doesn't fire down event before dblclick.\n// This workaround tries to fire a tap and doubletap after dblclick\nfunction onIE8Dblclick (event) {\n const eventTarget = event.target;\n const interaction = iFinder.search(event, event.type, eventTarget);\n\n if (!interaction) { return; }\n\n if (interaction.prevTap\n && event.clientX === interaction.prevTap.clientX\n && event.clientY === interaction.prevTap.clientY\n && eventTarget === interaction.prevTap.target) {\n\n interaction.downTargets[0] = eventTarget;\n interaction.downTimes [0] = new Date().getTime();\n\n pointerEvents.fire({\n interaction,\n event,\n eventTarget,\n pointer: event,\n type: 'tap',\n });\n }\n}\n\nif (browser.isIE8) {\n const selectFix = function (event) {\n for (const interaction of scope.interactions) {\n if (interaction.interacting()) {\n interaction.target.checkAndPreventDefault(event);\n }\n }\n };\n\n const onDocIE8 = function onDocIE8 ({ doc, win }, signalName) {\n const eventMethod = signalName.indexOf('listen') === 0\n ? events.add : events.remove;\n\n // For IE's lack of Event#preventDefault\n eventMethod(doc, 'selectstart', selectFix);\n\n if (pointerEvents) {\n eventMethod(doc, 'dblclick', onIE8Dblclick);\n }\n };\n\n scope.signals.on('add-document' , onDocIE8);\n scope.signals.on('remove-document', onDocIE8);\n}\n\nmodule.exports = null;\n","const InteractEvent = require('../InteractEvent');\nconst Interaction = require('../Interaction');\nconst extend = require('../utils/extend');\n\nconst modifiers = {\n names: [],\n\n setOffsets: function (arg) {\n const { interaction, pageCoords: page } = arg;\n const { target, element, startOffset } = interaction;\n const rect = target.getRect(element);\n\n if (rect) {\n startOffset.left = page.x - rect.left;\n startOffset.top = page.y - rect.top;\n\n startOffset.right = rect.right - page.x;\n startOffset.bottom = rect.bottom - page.y;\n\n if (!('width' in rect)) { rect.width = rect.right - rect.left; }\n if (!('height' in rect)) { rect.height = rect.bottom - rect.top ; }\n }\n else {\n startOffset.left = startOffset.top = startOffset.right = startOffset.bottom = 0;\n }\n\n arg.rect = rect;\n arg.interactable = target;\n arg.element = element;\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n\n arg.options = target.options[interaction.prepared.name][modifierName];\n\n if (!arg.options) {\n continue;\n }\n\n interaction.modifierOffsets[modifierName] = modifiers[modifierName].setOffset(arg);\n }\n },\n\n setAll: function (arg) {\n const { interaction, statuses, preEnd, requireEndOnly } = arg;\n const coords = extend({}, arg.pageCoords);\n const result = {\n dx: 0,\n dy: 0,\n changed: false,\n locked: false,\n shouldMove: true,\n };\n\n for (const modifierName of modifiers.names) {\n const modifier = modifiers[modifierName];\n const options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!shouldDo(options, preEnd, requireEndOnly)) { continue; }\n\n arg.status = arg.status = statuses[modifierName];\n arg.options = options;\n arg.offset = arg.interaction.modifierOffsets[modifierName];\n\n modifier.set(arg);\n\n if (arg.status.locked) {\n coords.x += arg.status.dx;\n coords.y += arg.status.dy;\n\n result.dx += arg.status.dx;\n result.dy += arg.status.dy;\n\n result.locked = true;\n }\n }\n\n // a move should be fired if:\n // - there are no modifiers enabled,\n // - no modifiers are \"locked\" i.e. have changed the pointer's coordinates, or\n // - the locked coords have changed since the last pointer move\n result.shouldMove = !arg.status || !result.locked || arg.status.changed;\n\n return result;\n },\n\n resetStatuses: function (statuses) {\n for (const modifierName of modifiers.names) {\n const status = statuses[modifierName] || {};\n\n status.dx = status.dy = 0;\n status.modifiedX = status.modifiedY = NaN;\n status.locked = false;\n status.changed = true;\n\n statuses[modifierName] = status;\n }\n\n return statuses;\n },\n\n start: function ({ interaction }, signalName) {\n const arg = {\n interaction,\n pageCoords: (signalName === 'action-resume' ?\n interaction.curCoords : interaction.startCoords).page,\n startOffset: interaction.startOffset,\n statuses: interaction.modifierStatuses,\n preEnd: false,\n requireEndOnly: false,\n };\n\n modifiers.setOffsets(arg);\n modifiers.resetStatuses(arg.statuses);\n\n arg.pageCoords = extend({}, interaction.startCoords.page);\n interaction.modifierResult = modifiers.setAll(arg);\n },\n};\n\nInteraction.signals.on('new', function (interaction) {\n interaction.startOffset = { left: 0, right: 0, top: 0, bottom: 0 };\n interaction.modifierOffsets = {};\n interaction.modifierStatuses = modifiers.resetStatuses({});\n interaction.modifierResult = null;\n});\n\nInteraction.signals.on('action-start' , modifiers.start);\nInteraction.signals.on('action-resume', modifiers.start);\n\nInteraction.signals.on('before-action-move', function ({ interaction, preEnd, interactingBeforeMove }) {\n const modifierResult = modifiers.setAll({\n interaction,\n preEnd,\n pageCoords: interaction.curCoords.page,\n statuses: interaction.modifierStatuses,\n requireEndOnly: false,\n });\n\n // don't fire an action move if a modifier would keep the event in the same\n // cordinates as before\n if (!modifierResult.shouldMove && interactingBeforeMove) {\n interaction._dontFireMove = true;\n }\n\n interaction.modifierResult = modifierResult;\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n for (let i = 0; i < modifiers.names.length; i++) {\n const options = interaction.target.options[interaction.prepared.name][modifiers.names[i]];\n\n // if the endOnly option is true for any modifier\n if (shouldDo(options, true, true)) {\n // fire a move event at the modified coordinates\n interaction.doMove({ event, preEnd: true });\n break;\n }\n }\n});\n\nInteractEvent.signals.on('set-xy', function (arg) {\n const { iEvent, interaction } = arg;\n const modifierArg = extend({}, arg);\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n modifierArg.options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!modifierArg.options) {\n continue;\n }\n\n const modifier = modifiers[modifierName];\n\n modifierArg.status = interaction.modifierStatuses[modifierName];\n\n iEvent[modifierName] = modifier.modifyCoords(modifierArg);\n }\n});\n\nfunction shouldDo (options, preEnd, requireEndOnly) {\n return (options && options.enabled\n && (preEnd || !options.endOnly)\n && (!requireEndOnly || options.endOnly));\n}\n\nmodule.exports = modifiers;\n","const modifiers = require('./index');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst restrict = {\n defaults: {\n enabled : false,\n endOnly : false,\n restriction: null,\n elementRect: null,\n },\n\n setOffset: function ({ rect, startOffset, options }) {\n const elementRect = options && options.elementRect;\n const offset = {};\n\n if (rect && elementRect) {\n offset.left = startOffset.left - (rect.width * elementRect.left);\n offset.top = startOffset.top - (rect.height * elementRect.top);\n\n offset.right = startOffset.right - (rect.width * (1 - elementRect.right));\n offset.bottom = startOffset.bottom - (rect.height * (1 - elementRect.bottom));\n }\n else {\n offset.left = offset.top = offset.right = offset.bottom = 0;\n }\n\n return offset;\n },\n\n set: function ({ pageCoords, interaction, status, options }) {\n if (!options) { return status; }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n\n const restriction = getRestrictionRect(options.restriction, interaction, page);\n\n if (!restriction) { return status; }\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n const rect = restriction;\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n const offset = interaction.modifierOffsets.restrict;\n\n // object is assumed to have\n // x, y, width, height or\n // left, top, right, bottom\n if ('x' in restriction && 'y' in restriction) {\n modifiedX = Math.max(Math.min(rect.x + rect.width - offset.right , page.x), rect.x + offset.left);\n modifiedY = Math.max(Math.min(rect.y + rect.height - offset.bottom, page.y), rect.y + offset.top );\n }\n else {\n modifiedX = Math.max(Math.min(rect.right - offset.right , page.x), rect.left + offset.left);\n modifiedY = Math.max(Math.min(rect.bottom - offset.bottom, page.y), rect.top + offset.top );\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const elementRect = options && options.elementRect;\n\n if (options && options.enabled\n && !(phase === 'start' && elementRect && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n getRestrictionRect,\n};\n\nfunction getRestrictionRect (value, interaction, page) {\n if (utils.is.function(value)) {\n return utils.resolveRectLike(value, interaction.target, interaction.element, [page.x, page.y, interaction]);\n } else {\n return utils.resolveRectLike(value, interaction.target, interaction.element);\n }\n}\n\nmodifiers.restrict = restrict;\nmodifiers.names.push('restrict');\n\ndefaultOptions.perAction.restrict = restrict.defaults;\n\nmodule.exports = restrict;\n","// This module adds the options.resize.restrictEdges setting which sets min and\n// max for the top, left, bottom and right edges of the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictEdges: {\n// inner: { top: 200, left: 200, right: 400, bottom: 400 },\n// outer: { top: 0, left: 0, right: 600, bottom: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst { getRestrictionRect } = require('./restrict');\n\nconst noInner = { top: +Infinity, left: +Infinity, bottom: -Infinity, right: -Infinity };\nconst noOuter = { top: -Infinity, left: -Infinity, bottom: +Infinity, right: +Infinity };\n\nconst restrictEdges = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n offset: null,\n },\n\n setOffset: function ({ interaction, startOffset, options }) {\n if (!options) {\n return utils.extend({}, startOffset);\n }\n\n const offset = getRestrictionRect(options.offset, interaction, interaction.startCoords.page);\n\n if (offset) {\n return {\n top: startOffset.top + offset.y,\n left: startOffset.left + offset.x,\n bottom: startOffset.bottom + offset.y,\n right: startOffset.right + offset.x,\n };\n }\n\n return startOffset;\n },\n\n set: function ({ pageCoords, interaction, status, offset, options }) {\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n const inner = rectUtils.xywhToTlbr(getRestrictionRect(options.inner, interaction, page)) || noInner;\n const outer = rectUtils.xywhToTlbr(getRestrictionRect(options.outer, interaction, page)) || noOuter;\n\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n if (edges.top) {\n modifiedY = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top);\n }\n else if (edges.bottom) {\n modifiedY = Math.max(Math.min(outer.bottom - offset.bottom, page.y), inner.bottom - offset.bottom);\n }\n if (edges.left) {\n modifiedX = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left);\n }\n else if (edges.right) {\n modifiedX = Math.max(Math.min(outer.right - offset.right, page.x), inner.right - offset.right);\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n if (options && options.enabled\n && !(phase === 'start' && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n noInner,\n noOuter,\n getRestrictionRect,\n};\n\nmodifiers.restrictEdges = restrictEdges;\nmodifiers.names.push('restrictEdges');\n\ndefaultOptions.perAction.restrictEdges = restrictEdges.defaults;\nresize.defaults.restrictEdges = restrictEdges.defaults;\n\nmodule.exports = restrictEdges;\n","// This module adds the options.resize.restrictSize setting which sets min and\n// max width and height for the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictSize: {\n// min: { width: -600, height: -600 },\n// max: { width: 600, height: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst restrictEdges = require('./restrictEdges');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst noMin = { width: -Infinity, height: -Infinity };\nconst noMax = { width: +Infinity, height: +Infinity };\n\nconst restrictSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n },\n\n setOffset: function ({ interaction }) {\n return interaction.startOffset;\n },\n\n set: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const rect = rectUtils.xywhToTlbr(interaction.resizeRects.inverted);\n\n const minSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.min, interaction)) || noMin;\n const maxSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.max, interaction)) || noMax;\n\n arg.options = {\n enabled: options.enabled,\n endOnly: options.endOnly,\n inner: utils.extend({}, restrictEdges.noInner),\n outer: utils.extend({}, restrictEdges.noOuter),\n };\n\n if (edges.top) {\n arg.options.inner.top = rect.bottom - minSize.height;\n arg.options.outer.top = rect.bottom - maxSize.height;\n }\n else if (edges.bottom) {\n arg.options.inner.bottom = rect.top + minSize.height;\n arg.options.outer.bottom = rect.top + maxSize.height;\n }\n if (edges.left) {\n arg.options.inner.left = rect.right - minSize.width;\n arg.options.outer.left = rect.right - maxSize.width;\n }\n else if (edges.right) {\n arg.options.inner.right = rect.left + minSize.width;\n arg.options.outer.right = rect.left + maxSize.width;\n }\n\n restrictEdges.set(arg);\n },\n\n modifyCoords: restrictEdges.modifyCoords,\n};\n\nmodifiers.restrictSize = restrictSize;\nmodifiers.names.push('restrictSize');\n\ndefaultOptions.perAction.restrictSize = restrictSize.defaults;\nresize.defaults.restrictSize = restrictSize.defaults;\n\nmodule.exports = restrictSize;\n","const modifiers = require('./index');\nconst interact = require('../interact');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst snap = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n\n relativePoints: null,\n },\n\n setOffset: function ({ interaction, interactable, element, rect, startOffset, options }) {\n const offsets = [];\n const optionsOrigin = utils.rectToXY(utils.resolveRectLike(options.origin));\n const origin = optionsOrigin || utils.getOriginXY(interactable, element, interaction.prepared.name);\n options = options || interactable.options[interaction.prepared.name].snap || {};\n\n let snapOffset;\n\n if (options.offset === 'startCoords') {\n snapOffset = {\n x: interaction.startCoords.page.x - origin.x,\n y: interaction.startCoords.page.y - origin.y,\n };\n }\n else {\n const offsetRect = utils.resolveRectLike(options.offset, interactable, element, [interaction]);\n\n snapOffset = utils.rectToXY(offsetRect) || { x: 0, y: 0 };\n }\n\n if (rect && options.relativePoints && options.relativePoints.length) {\n for (const { x: relativeX, y: relativeY } of options.relativePoints) {\n offsets.push({\n x: startOffset.left - (rect.width * relativeX) + snapOffset.x,\n y: startOffset.top - (rect.height * relativeY) + snapOffset.y,\n });\n }\n }\n else {\n offsets.push(snapOffset);\n }\n\n return offsets;\n },\n\n set: function ({ interaction, pageCoords, status, options, offset: offsets }) {\n const targets = [];\n let target;\n let page;\n let i;\n\n if (status.useStatusXY) {\n page = { x: status.x, y: status.y };\n }\n else {\n const origin = utils.getOriginXY(interaction.target, interaction.element, interaction.prepared.name);\n\n page = utils.extend({}, pageCoords);\n\n page.x -= origin.x;\n page.y -= origin.y;\n }\n\n status.realX = page.x;\n status.realY = page.y;\n\n let len = options.targets? options.targets.length : 0;\n\n for (const { x: offsetX, y: offsetY } of offsets) {\n const relativeX = page.x - offsetX;\n const relativeY = page.y - offsetY;\n\n for (const snapTarget of options.targets) {\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n targets.push({\n x: utils.is.number(target.x) ? (target.x + offsetX) : relativeX,\n y: utils.is.number(target.y) ? (target.y + offsetY) : relativeY,\n\n range: utils.is.number(target.range)? target.range: options.range,\n });\n }\n }\n\n const closest = {\n target: null,\n inRange: false,\n distance: 0,\n range: 0,\n dx: 0,\n dy: 0,\n };\n\n for (i = 0, len = targets.length; i < len; i++) {\n target = targets[i];\n\n const range = target.range;\n const dx = target.x - page.x;\n const dy = target.y - page.y;\n const distance = utils.hypot(dx, dy);\n let inRange = distance <= range;\n\n // Infinite targets count as being out of range\n // compared to non infinite ones that are in range\n if (range === Infinity && closest.inRange && closest.range !== Infinity) {\n inRange = false;\n }\n\n if (!closest.target || (inRange\n // is the closest target in range?\n ? (closest.inRange && range !== Infinity\n // the pointer is relatively deeper in this target\n ? distance / range < closest.distance / closest.range\n // this target has Infinite range and the closest doesn't\n : (range === Infinity && closest.range !== Infinity)\n // OR this target is closer that the previous closest\n || distance < closest.distance)\n // The other is not in range and the pointer is closer to this target\n : (!closest.inRange && distance < closest.distance))) {\n\n closest.target = target;\n closest.distance = distance;\n closest.range = range;\n closest.inRange = inRange;\n closest.dx = dx;\n closest.dy = dy;\n\n status.range = range;\n }\n }\n\n let snapChanged;\n\n if (closest.target) {\n snapChanged = (status.modifiedX !== closest.target.x || status.modifiedY !== closest.target.y);\n\n status.modifiedX = closest.target.x;\n status.modifiedY = closest.target.y;\n }\n else {\n snapChanged = true;\n\n status.modifiedX = NaN;\n status.modifiedY = NaN;\n }\n\n status.dx = closest.dx;\n status.dy = closest.dy;\n\n status.changed = (snapChanged || (closest.inRange && !status.locked));\n status.locked = closest.inRange;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const relativePoints = options && options.relativePoints;\n\n if (options && options.enabled\n && !(phase === 'start' && relativePoints && relativePoints.length)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n }\n\n return {\n range : status.range,\n locked : status.locked,\n x : status.modifiedX,\n y : status.modifiedY,\n realX : status.realX,\n realY : status.realY,\n dx : status.dx,\n dy : status.dy,\n };\n }\n },\n};\n\ninteract.createSnapGrid = function (grid) {\n return function (x, y) {\n const limits = grid.limits || {\n left : -Infinity,\n right : Infinity,\n top : -Infinity,\n bottom: Infinity,\n };\n let offsetX = 0;\n let offsetY = 0;\n\n if (utils.is.object(grid.offset)) {\n offsetX = grid.offset.x;\n offsetY = grid.offset.y;\n }\n\n const gridx = Math.round((x - offsetX) / grid.x);\n const gridy = Math.round((y - offsetY) / grid.y);\n\n const newX = Math.max(limits.left, Math.min(limits.right , gridx * grid.x + offsetX));\n const newY = Math.max(limits.top , Math.min(limits.bottom, gridy * grid.y + offsetY));\n\n return {\n x: newX,\n y: newY,\n range: grid.range,\n };\n };\n};\n\nmodifiers.snap = snap;\nmodifiers.names.push('snap');\n\ndefaultOptions.perAction.snap = snap.defaults;\n\nmodule.exports = snap;\n","// This module allows snapping of the size of targets during resize\n// interactions.\n\nconst modifiers = require('./index');\nconst snap = require('./snap');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\nconst utils = require('../utils/');\n\nconst snapSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n },\n\n setOffset: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.edges;\n\n if (!edges) { return; }\n\n arg.options = {\n relativePoints: [{\n x: edges.left? 0 : 1,\n y: edges.top ? 0 : 1,\n }],\n origin: { x: 0, y: 0 },\n offset: 'self',\n range: options.range,\n };\n\n const offsets = snap.setOffset(arg);\n arg.options = options;\n\n return offsets;\n },\n\n set: function (arg) {\n const { interaction, options, offset, pageCoords } = arg;\n const page = utils.extend({}, pageCoords);\n const relativeX = page.x - offset[0].x;\n const relativeY = page.y - offset[0].y;\n\n arg.options = utils.extend({}, options);\n arg.options.targets = [];\n\n for (const snapTarget of options.targets) {\n let target;\n\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n if ('width' in target && 'height' in target) {\n target.x = target.width;\n target.y = target.height;\n }\n\n arg.options.targets.push(target);\n }\n\n snap.set(arg);\n },\n\n modifyCoords: function (arg) {\n const { options } = arg;\n\n arg.options = utils.extend({}, options);\n arg.options.enabled = options.enabled;\n arg.options.relativePoints = [null];\n\n snap.modifyCoords(arg);\n },\n};\n\nmodifiers.snapSize = snapSize;\nmodifiers.names.push('snapSize');\n\ndefaultOptions.perAction.snapSize = snapSize.defaults;\nresize.defaults.snapSize = snapSize.defaults;\n\nmodule.exports = snapSize;\n","const pointerUtils = require('../utils/pointerUtils');\n\nmodule.exports = class PointerEvent {\n constructor (type, pointer, event, eventTarget, interaction) {\n pointerUtils.pointerExtend(this, event);\n\n if (event !== pointer) {\n pointerUtils.pointerExtend(this, pointer);\n }\n\n this.interaction = interaction;\n\n this.timeStamp = new Date().getTime();\n this.originalEvent = event;\n this.type = type;\n this.pointerId = pointerUtils.getPointerId(pointer);\n this.pointerType = pointerUtils.getPointerType(pointer);\n this.target = eventTarget;\n this.currentTarget = null;\n\n if (type === 'tap') {\n const pointerIndex = interaction.getPointerIndex(pointer);\n this.dt = this.timeStamp - interaction.downTimes[pointerIndex];\n\n const interval = this.timeStamp - interaction.tapTime;\n\n this.double = !!(interaction.prevTap\n && interaction.prevTap.type !== 'doubletap'\n && interaction.prevTap.target === this.target\n && interval < 500);\n }\n else if (type === 'doubletap') {\n this.dt = pointer.timeStamp - interaction.tapTime;\n }\n }\n\n subtractOrigin ({ x: originX, y: originY }) {\n this.pageX -= originX;\n this.pageY -= originY;\n this.clientX -= originX;\n this.clientY -= originY;\n\n return this;\n }\n\n addOrigin ({ x: originX, y: originY }) {\n this.pageX += originX;\n this.pageY += originY;\n this.clientX += originX;\n this.clientY += originY;\n\n return this;\n }\n\n preventDefault () {\n this.originalEvent.preventDefault();\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n};\n","const PointerEvent = require('./PointerEvent');\nconst Interaction = require('../Interaction');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst defaults = require('../defaultOptions');\nconst signals = require('../utils/Signals').new();\nconst { filter } = require('../utils/arr');\n\nconst simpleSignals = [ 'down', 'up', 'cancel' ];\nconst simpleEvents = [ 'down', 'up', 'cancel' ];\n\nconst pointerEvents = {\n PointerEvent,\n fire,\n collectEventTargets,\n signals,\n defaults: {\n holdDuration: 600,\n ignoreFrom : null,\n allowFrom : null,\n origin : { x: 0, y: 0 },\n },\n types: [\n 'down',\n 'move',\n 'up',\n 'cancel',\n 'tap',\n 'doubletap',\n 'hold',\n ],\n};\n\nfunction fire (arg) {\n const {\n interaction, pointer, event, eventTarget,\n type = arg.pointerEvent.type,\n targets = collectEventTargets(arg),\n pointerEvent = new PointerEvent(type, pointer, event, eventTarget, interaction),\n } = arg;\n\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n targets,\n type,\n pointerEvent,\n };\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n\n for (const prop in target.props || {}) {\n pointerEvent[prop] = target.props[prop];\n }\n\n const origin = utils.getOriginXY(target.eventable, target.element);\n\n pointerEvent.subtractOrigin(origin);\n pointerEvent.eventable = target.eventable;\n pointerEvent.currentTarget = target.element;\n\n target.eventable.fire(pointerEvent);\n\n pointerEvent.addOrigin(origin);\n\n if (pointerEvent.immediatePropagationStopped\n || (pointerEvent.propagationStopped\n && (i + 1) < targets.length && targets[i + 1].element !== pointerEvent.currentTarget)) {\n break;\n }\n }\n\n signals.fire('fired', signalArg);\n\n if (type === 'tap') {\n // if pointerEvent should make a double tap, create and fire a doubletap\n // PointerEvent and use that as the prevTap\n const prevTap = pointerEvent.double\n ? fire({\n interaction, pointer, event, eventTarget,\n type: 'doubletap',\n })\n : pointerEvent;\n\n interaction.prevTap = prevTap;\n interaction.tapTime = prevTap.timeStamp;\n }\n\n return pointerEvent;\n}\n\nfunction collectEventTargets ({ interaction, pointer, event, eventTarget, type }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n // do not fire a tap event if the pointer was moved before being lifted\n if (type === 'tap' && (interaction.pointerWasMoved\n // or if the pointerup target is different to the pointerdown target\n || !(interaction.downTargets[pointerIndex] && interaction.downTargets[pointerIndex] === eventTarget))) {\n return [];\n }\n\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n path,\n targets: [],\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (type === 'hold') {\n signalArg.targets = filter(signalArg.targets, target =>\n target.eventable.options.holdDuration === interaction.holdTimers[pointerIndex].duration);\n }\n\n return signalArg.targets;\n}\n\nInteraction.signals.on('update-pointer-down', function ({ interaction, pointerIndex }) {\n interaction.holdTimers[pointerIndex] = { duration: Infinity, timeout: null };\n});\n\nInteraction.signals.on('remove-pointer', function ({ interaction, pointerIndex }) {\n interaction.holdTimers.splice(pointerIndex, 1);\n});\n\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget, duplicateMove }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n if (!duplicateMove && (!interaction.pointerIsDown || interaction.pointerWasMoved)) {\n if (interaction.pointerIsDown) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n\n fire({\n interaction, pointer, event, eventTarget,\n type: 'move',\n });\n }\n});\n\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget, pointerIndex }) {\n // copy event to be used in timeout for IE8\n const eventCopy = browser.isIE8? utils.extend({}, event) : event;\n\n const timer = interaction.holdTimers[pointerIndex];\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'hold',\n targets: [],\n path,\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (!signalArg.targets.length) { return; }\n\n let minDuration = Infinity;\n\n for (let i = 0; i < signalArg.targets.length; i++) {\n const target = signalArg.targets[i];\n const holdDuration = target.eventable.options.holdDuration;\n\n if (holdDuration < minDuration) {\n minDuration = holdDuration;\n }\n }\n\n timer.duration = minDuration;\n timer.timeout = setTimeout(function () {\n fire({\n interaction,\n eventTarget,\n pointer: browser.isIE8? eventCopy : pointer,\n event: eventCopy,\n type: 'hold',\n });\n }, minDuration);\n});\n\nInteraction.signals.on('up', ({ interaction, pointer, event, eventTarget }) => {\n if (!interaction.pointerWasMoved) {\n fire({ interaction, eventTarget, pointer, event, type: 'tap' });\n }\n});\n\n['up', 'cancel'].forEach(function (signalName) {\n Interaction.signals.on(signalName, function ({ interaction, pointerIndex }) {\n if (interaction.holdTimers[pointerIndex]) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n });\n});\n\nfunction createSignalListener (type) {\n return function ({ interaction, pointer, event, eventTarget }) {\n fire({ interaction, eventTarget, pointer, event, type });\n };\n}\n\nfor (let i = 0; i < simpleSignals.length; i++) {\n Interaction.signals.on(simpleSignals[i], createSignalListener(simpleEvents[i]));\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.prevTap = null; // the most recent tap event on this interaction\n interaction.tapTime = 0; // time of the most recent tap event\n interaction.holdTimers = []; // [{ duration, timeout }]\n});\n\ndefaults.pointerEvents = pointerEvents.defaults;\nmodule.exports = pointerEvents;\n","const pointerEvents = require('./base');\nconst Interaction = require('../Interaction');\n\npointerEvents.signals.on('new', onNew);\npointerEvents.signals.on('fired', onFired);\n\nfor (const signal of ['move', 'up', 'cancel', 'endall']) {\n Interaction.signals.on(signal, endHoldRepeat);\n}\n\nfunction onNew ({ pointerEvent }) {\n if (pointerEvent.type !== 'hold') { return; }\n\n pointerEvent.count = (pointerEvent.count || 0) + 1;\n}\n\nfunction onFired ({ interaction, pointerEvent, eventTarget, targets }) {\n if (pointerEvent.type !== 'hold' || !targets.length) { return; }\n\n // get the repeat interval from the first eventable\n const interval = targets[0].eventable.options.holdRepeatInterval;\n\n // don't repeat if the interval is 0 or less\n if (interval <= 0) { return; }\n\n // set a timeout to fire the holdrepeat event\n interaction.holdIntervalHandle = setTimeout(function () {\n pointerEvents.fire({\n interaction,\n eventTarget,\n type: 'hold',\n pointer: pointerEvent,\n event: pointerEvent,\n });\n }, interval);\n}\n\nfunction endHoldRepeat ({ interaction }) {\n // set the interaction's holdStopTime property\n // to stop further holdRepeat events\n if (interaction.holdIntervalHandle) {\n clearInterval(interaction.holdIntervalHandle);\n interaction.holdIntervalHandle = null;\n }\n}\n\n// don't repeat by default\npointerEvents.defaults.holdRepeatInterval = 0;\npointerEvents.types.push('holdrepeat');\n\nmodule.exports = {\n onNew,\n onFired,\n endHoldRepeat,\n};\n","const pointerEvents = require('./base');\nconst Interactable = require('../Interactable');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\nconst scope = require('../scope');\nconst extend = require('../utils/extend');\nconst { merge } = require('../utils/arr');\n\npointerEvents.signals.on('collect-targets', function ({ targets, element, type, eventTarget }) {\n function collectSelectors (interactable, selector, context) {\n const els = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && is.element(element)\n && domUtils.matchesSelector(element, selector, els)\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n const interactable = scope.interactables.get(element);\n\n if (interactable) {\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n scope.interactables.forEachSelector(collectSelectors, element);\n});\n\nInteractable.signals.on('new', function ({ interactable }) {\n interactable.events.getRect = function (element) {\n return interactable.getRect(element);\n };\n});\n\nInteractable.signals.on('set', function ({ interactable, options }) {\n extend(interactable.events.options, pointerEvents.defaults);\n extend(interactable.events.options, options);\n});\n\nmerge(Interactable.eventTypes, pointerEvents.types);\n\nInteractable.prototype.pointerEvents = function (options) {\n extend(this.events.options, options);\n\n return this;\n};\n\nconst __backCompatOption = Interactable.prototype._backCompatOption;\n\nInteractable.prototype._backCompatOption = function (optionName, newValue) {\n const ret = __backCompatOption.call(this, optionName, newValue);\n\n if (ret === this) {\n this.events.options[optionName] = newValue;\n }\n\n return ret;\n};\n\nInteractable.settingsMethods.push('pointerEvents');\n","const utils = require('./utils');\nconst events = require('./utils/events');\nconst signals = require('./utils/Signals').new();\n\nconst scope = {\n signals,\n events,\n utils,\n\n // main document\n document: require('./utils/domObjects').document,\n // all documents being listened to\n documents: [],\n\n addDocument: function (doc, win) {\n // do nothing if document is already known\n if (utils.contains(scope.documents, doc)) { return false; }\n\n win = win || scope.getWindow(doc);\n\n scope.documents.push(doc);\n events.documents.push(doc);\n\n // don't add an unload event for the main document\n // so that the page may be cached in browser history\n if (doc !== scope.document) {\n events.add(win, 'unload', scope.onWindowUnload);\n }\n\n signals.fire('add-document', { doc, win });\n },\n\n removeDocument: function (doc, win) {\n const index = utils.indexOf(scope.documents, doc);\n\n win = win || scope.getWindow(doc);\n\n events.remove(win, 'unload', scope.onWindowUnload);\n\n scope.documents.splice(index, 1);\n events.documents.splice(index, 1);\n\n signals.fire('remove-document', { win, doc });\n },\n\n onWindowUnload: function () {\n scope.removeDocument(this.document, this);\n },\n};\n\nmodule.exports = scope;\n","const { indexOf } = require('./arr');\n\nclass Signals {\n constructor () {\n this.listeners = {\n // signalName: [listeners],\n };\n }\n\n on (name, listener) {\n if (!this.listeners[name]) {\n this.listeners[name] = [listener];\n return;\n }\n\n this.listeners[name].push(listener);\n }\n\n off (name, listener) {\n if (!this.listeners[name]) { return; }\n\n const index = indexOf(this.listeners[name], listener);\n\n if (index !== -1) {\n this.listeners[name].splice(index, 1);\n }\n }\n\n fire (name, arg) {\n const targetListeners = this.listeners[name];\n\n if (!targetListeners) { return; }\n\n for (let i = 0; i < targetListeners.length; i++) {\n if (targetListeners[i](arg, name) === false) {\n return;\n }\n }\n }\n}\n\nSignals.new = function () {\n return new Signals();\n};\n\nmodule.exports = Signals;\n","function indexOf (array, target) {\n for (let i = 0, len = array.length; i < len; i++) {\n if (array[i] === target) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction contains (array, target) {\n return indexOf(array, target) !== -1;\n}\n\nfunction merge (target, source) {\n for (let i = 0; i < source.length; i++) {\n target.push(source[i]);\n }\n\n return target;\n}\n\nfunction filter (array, test) {\n const result = [];\n\n for (let i = 0; i < array.length; i++) {\n if (test(array[i])) {\n result.push(array[i]);\n }\n }\n\n return result;\n}\n\nmodule.exports = {\n indexOf,\n contains,\n merge,\n filter,\n};\n","const { window } = require('./window');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst Element = domObjects.Element;\nconst navigator = window.navigator;\n\nconst browser = {\n // Does the browser support touch input?\n supportsTouch: !!(('ontouchstart' in window) || is.function(window.DocumentTouch)\n && domObjects.document instanceof window.DocumentTouch),\n\n // Does the browser support PointerEvents\n supportsPointerEvent: !!domObjects.PointerEvent,\n\n isIE8: ('attachEvent' in window) && !('addEventListener' in window),\n\n // Opera Mobile must be handled differently\n isOperaMobile: (navigator.appName === 'Opera'\n && browser.supportsTouch\n && navigator.userAgent.match('Presto')),\n\n // scrolling doesn't change the result of getClientRects on iOS 7\n isIOS7: (/iP(hone|od|ad)/.test(navigator.platform)\n && /OS 7[^\\d]/.test(navigator.appVersion)),\n\n isIe9OrOlder: /MSIE (8|9)/.test(navigator.userAgent),\n\n // prefix matchesSelector\n prefixedMatchesSelector: 'matches' in Element.prototype\n ? 'matches': 'webkitMatchesSelector' in Element.prototype\n ? 'webkitMatchesSelector': 'mozMatchesSelector' in Element.prototype\n ? 'mozMatchesSelector': 'oMatchesSelector' in Element.prototype\n ? 'oMatchesSelector': 'msMatchesSelector',\n\n useMatchesSelectorPolyfill: false,\n\n pEventTypes: (domObjects.PointerEvent\n ? (domObjects.PointerEvent === window.MSPointerEvent\n ? {\n up: 'MSPointerUp',\n down: 'MSPointerDown',\n over: 'mouseover',\n out: 'mouseout',\n move: 'MSPointerMove',\n cancel: 'MSPointerCancel',\n }\n : {\n up: 'pointerup',\n down: 'pointerdown',\n over: 'pointerover',\n out: 'pointerout',\n move: 'pointermove',\n cancel: 'pointercancel',\n })\n : null),\n\n // because Webkit and Opera still use 'mousewheel' event type\n wheelEvent: 'onmousewheel' in domObjects.document? 'mousewheel': 'wheel',\n\n};\n\nbrowser.useMatchesSelectorPolyfill = !is.function(Element.prototype[browser.prefixedMatchesSelector]);\n\nmodule.exports = browser;\n","const domObjects = {};\nconst win = require('./window').window;\n\nfunction blank () {}\n\ndomObjects.document = win.document;\ndomObjects.DocumentFragment = win.DocumentFragment || blank;\ndomObjects.SVGElement = win.SVGElement || blank;\ndomObjects.SVGSVGElement = win.SVGSVGElement || blank;\ndomObjects.SVGElementInstance = win.SVGElementInstance || blank;\ndomObjects.Element = win.Element || blank;\ndomObjects.HTMLElement = win.HTMLElement || domObjects.Element;\n\ndomObjects.Event = win.Event;\ndomObjects.Touch = win.Touch || blank;\ndomObjects.PointerEvent = (win.PointerEvent || win.MSPointerEvent);\n\nmodule.exports = domObjects;\n","const win = require('./window');\nconst browser = require('./browser');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst domUtils = {\n nodeContains: function (parent, child) {\n while (child) {\n if (child === parent) {\n return true;\n }\n\n child = child.parentNode;\n }\n\n return false;\n },\n\n closest: function (element, selector) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) { return element; }\n\n element = domUtils.parentNode(element);\n }\n\n return null;\n },\n\n parentNode: function (node) {\n let parent = node.parentNode;\n\n if (is.docFrag(parent)) {\n // skip past #shado-root fragments\n while ((parent = parent.host) && is.docFrag(parent)) {\n continue;\n }\n\n return parent;\n }\n\n return parent;\n },\n\n // taken from http://tanalin.com/en/blog/2012/12/matches-selector-ie8/ and modified\n matchesSelectorPolyfill: browser.useMatchesSelectorPolyfill\n ? function (element, selector, elems) {\n elems = elems || element.parentNode.querySelectorAll(selector);\n\n for (let i = 0, len = elems.length; i < len; i++) {\n if (elems[i] === element) {\n return true;\n }\n }\n\n return false;\n }\n : null,\n\n matchesSelector: function (element, selector, nodeList) {\n if (browser.useMatchesSelectorPolyfill) {\n return domUtils.matchesSelectorPolyfill(element, selector, nodeList);\n }\n\n // remove /deep/ from selectors if shadowDOM polyfill is used\n if (win.window !== win.realWindow) {\n selector = selector.replace(/\\/deep\\//g, ' ');\n }\n\n return element[browser.prefixedMatchesSelector](selector);\n },\n\n // Test for the element that's \"above\" all other qualifiers\n indexOfDeepestElement: function (elements) {\n let deepestZoneParents = [];\n let dropzoneParents = [];\n let dropzone;\n let deepestZone = elements[0];\n let index = deepestZone? 0: -1;\n let parent;\n let child;\n let i;\n let n;\n\n for (i = 1; i < elements.length; i++) {\n dropzone = elements[i];\n\n // an element might belong to multiple selector dropzones\n if (!dropzone || dropzone === deepestZone) {\n continue;\n }\n\n if (!deepestZone) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n // check if the deepest or current are document.documentElement or document.rootElement\n // - if the current dropzone is, do nothing and continue\n if (dropzone.parentNode === dropzone.ownerDocument) {\n continue;\n }\n // - if deepest is, update with the current dropzone and continue to next\n else if (deepestZone.parentNode === dropzone.ownerDocument) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n if (!deepestZoneParents.length) {\n parent = deepestZone;\n while (parent.parentNode && parent.parentNode !== parent.ownerDocument) {\n deepestZoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n }\n\n // if this element is an svg element and the current deepest is\n // an HTMLElement\n if (deepestZone instanceof domObjects.HTMLElement\n && dropzone instanceof domObjects.SVGElement\n && !(dropzone instanceof domObjects.SVGSVGElement)) {\n\n if (dropzone === deepestZone.parentNode) {\n continue;\n }\n\n parent = dropzone.ownerSVGElement;\n }\n else {\n parent = dropzone;\n }\n\n dropzoneParents = [];\n\n while (parent.parentNode !== parent.ownerDocument) {\n dropzoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n\n n = 0;\n\n // get (position of last common ancestor) + 1\n while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) {\n n++;\n }\n\n const parents = [\n dropzoneParents[n - 1],\n dropzoneParents[n],\n deepestZoneParents[n],\n ];\n\n child = parents[0].lastChild;\n\n while (child) {\n if (child === parents[1]) {\n deepestZone = dropzone;\n index = i;\n deepestZoneParents = [];\n\n break;\n }\n else if (child === parents[2]) {\n break;\n }\n\n child = child.previousSibling;\n }\n }\n\n return index;\n },\n\n matchesUpTo: function (element, selector, limit) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) {\n return true;\n }\n\n element = domUtils.parentNode(element);\n\n if (element === limit) {\n return domUtils.matchesSelector(element, selector);\n }\n }\n\n return false;\n },\n\n getActualElement: function (element) {\n return (element instanceof domObjects.SVGElementInstance\n ? element.correspondingUseElement\n : element);\n },\n\n getScrollXY: function (relevantWindow) {\n relevantWindow = relevantWindow || win.window;\n return {\n x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft,\n y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop,\n };\n },\n\n getElementClientRect: function (element) {\n const clientRect = (element instanceof domObjects.SVGElement\n ? element.getBoundingClientRect()\n : element.getClientRects()[0]);\n\n return clientRect && {\n left : clientRect.left,\n right : clientRect.right,\n top : clientRect.top,\n bottom: clientRect.bottom,\n width : clientRect.width || clientRect.right - clientRect.left,\n height: clientRect.height || clientRect.bottom - clientRect.top,\n };\n },\n\n getElementRect: function (element) {\n const clientRect = domUtils.getElementClientRect(element);\n\n if (!browser.isIOS7 && clientRect) {\n const scroll = domUtils.getScrollXY(win.getWindow(element));\n\n clientRect.left += scroll.x;\n clientRect.right += scroll.x;\n clientRect.top += scroll.y;\n clientRect.bottom += scroll.y;\n }\n\n return clientRect;\n },\n\n getPath: function (element) {\n const path = [];\n\n while (element) {\n path.push(element);\n element = domUtils.parentNode(element);\n }\n\n return path;\n },\n\n trySelector: value => {\n if (!is.string(value)) { return false; }\n\n // an exception will be raised if it is invalid\n domObjects.document.querySelector(value);\n return true;\n },\n};\n\nmodule.exports = domUtils;\n","const is = require('./is');\nconst domUtils = require('./domUtils');\nconst pExtend = require('./pointerExtend');\n\nconst { window, getWindow } = require('./window');\nconst { indexOf, contains } = require('./arr');\n\nconst useAttachEvent = ('attachEvent' in window) && !('addEventListener' in window);\nconst addEvent = useAttachEvent? 'attachEvent': 'addEventListener';\nconst removeEvent = useAttachEvent? 'detachEvent': 'removeEventListener';\nconst on = useAttachEvent? 'on': '';\n\nconst elements = [];\nconst targets = [];\nconst attachedListeners = [];\n\n// {\n// type: {\n// selectors: ['selector', ...],\n// contexts : [document, ...],\n// listeners: [[listener, capture, passive], ...]\n// }\n// }\nconst delegatedEvents = {};\n\nconst documents = [];\n\nconst supportsOptions = !useAttachEvent && (() => {\n let supported = false;\n\n window.document.createElement('div').addEventListener('test', null, {\n get capture () { supported = true; },\n });\n\n return supported;\n})();\n\nfunction add (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n let elementIndex = indexOf(elements, element);\n let target = targets[elementIndex];\n\n if (!target) {\n target = {\n events: {},\n typeCount: 0,\n };\n\n elementIndex = elements.push(element) - 1;\n targets.push(target);\n\n attachedListeners.push(useAttachEvent\n ? {\n supplied: [],\n wrapped : [],\n useCount: [],\n }\n : null);\n }\n\n if (!target.events[type]) {\n target.events[type] = [];\n target.typeCount++;\n }\n\n if (!contains(target.events[type], listener)) {\n let ret;\n\n if (useAttachEvent) {\n const { supplied, wrapped, useCount } = attachedListeners[elementIndex];\n const listenerIndex = indexOf(supplied, listener);\n\n const wrappedListener = wrapped[listenerIndex] || function (event) {\n if (!event.immediatePropagationStopped) {\n event.target = event.srcElement;\n event.currentTarget = element;\n\n event.preventDefault = event.preventDefault || preventDef;\n event.stopPropagation = event.stopPropagation || stopProp;\n event.stopImmediatePropagation = event.stopImmediatePropagation || stopImmProp;\n\n if (/mouse|click/.test(event.type)) {\n event.pageX = event.clientX + getWindow(element).document.documentElement.scrollLeft;\n event.pageY = event.clientY + getWindow(element).document.documentElement.scrollTop;\n }\n\n listener(event);\n }\n };\n\n ret = element[addEvent](on + type, wrappedListener, !!options.capture);\n\n if (listenerIndex === -1) {\n supplied.push(listener);\n wrapped.push(wrappedListener);\n useCount.push(1);\n }\n else {\n useCount[listenerIndex]++;\n }\n }\n else {\n ret = element[addEvent](type, listener, supportsOptions? options : !!options.capture);\n }\n target.events[type].push(listener);\n\n return ret;\n }\n}\n\nfunction remove (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const elementIndex = indexOf(elements, element);\n const target = targets[elementIndex];\n\n if (!target || !target.events) {\n return;\n }\n\n let wrappedListener = listener;\n let listeners;\n let listenerIndex;\n\n if (useAttachEvent) {\n listeners = attachedListeners[elementIndex];\n listenerIndex = indexOf(listeners.supplied, listener);\n wrappedListener = listeners.wrapped[listenerIndex];\n }\n\n if (type === 'all') {\n for (type in target.events) {\n if (target.events.hasOwnProperty(type)) {\n remove(element, type, 'all');\n }\n }\n return;\n }\n\n if (target.events[type]) {\n const len = target.events[type].length;\n\n if (listener === 'all') {\n for (let i = 0; i < len; i++) {\n remove(element, type, target.events[type][i], options);\n }\n return;\n }\n else {\n for (let i = 0; i < len; i++) {\n if (target.events[type][i] === listener) {\n element[removeEvent](on + type, wrappedListener, supportsOptions? options : !!options.capture);\n target.events[type].splice(i, 1);\n\n if (useAttachEvent && listeners) {\n listeners.useCount[listenerIndex]--;\n if (listeners.useCount[listenerIndex] === 0) {\n listeners.supplied.splice(listenerIndex, 1);\n listeners.wrapped.splice(listenerIndex, 1);\n listeners.useCount.splice(listenerIndex, 1);\n }\n }\n\n break;\n }\n }\n }\n\n if (target.events[type] && target.events[type].length === 0) {\n target.events[type] = null;\n target.typeCount--;\n }\n }\n\n if (!target.typeCount) {\n targets.splice(elementIndex, 1);\n elements.splice(elementIndex, 1);\n attachedListeners.splice(elementIndex, 1);\n }\n}\n\nfunction addDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n if (!delegatedEvents[type]) {\n delegatedEvents[type] = {\n selectors: [],\n contexts : [],\n listeners: [],\n };\n\n // add delegate listener functions\n for (let i = 0; i < documents.length; i++) {\n add(documents[i], type, delegateListener);\n add(documents[i], type, delegateUseCapture, true);\n }\n }\n\n const delegated = delegatedEvents[type];\n let index;\n\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n break;\n }\n }\n\n if (index === -1) {\n index = delegated.selectors.length;\n\n delegated.selectors.push(selector);\n delegated.contexts .push(context);\n delegated.listeners.push([]);\n }\n\n // keep listener and capture and passive flags\n delegated.listeners[index].push([listener, !!options.capture, options.passive]);\n}\n\nfunction removeDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const delegated = delegatedEvents[type];\n let matchFound = false;\n let index;\n\n if (!delegated) { return; }\n\n // count from last index of delegated to 0\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n // look for matching selector and context Node\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n\n const listeners = delegated.listeners[index];\n\n // each item of the listeners array is an array: [function, capture, passive]\n for (let i = listeners.length - 1; i >= 0; i--) {\n const [fn, capture, passive] = listeners[i];\n\n // check if the listener functions and capture and passive flags match\n if (fn === listener && capture === !!options.capture && passive === options.passive) {\n // remove the listener from the array of listeners\n listeners.splice(i, 1);\n\n // if all listeners for this interactable have been removed\n // remove the interactable from the delegated arrays\n if (!listeners.length) {\n delegated.selectors.splice(index, 1);\n delegated.contexts .splice(index, 1);\n delegated.listeners.splice(index, 1);\n\n // remove delegate function from context\n remove(context, type, delegateListener);\n remove(context, type, delegateUseCapture, true);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegatedEvents[type] = null;\n }\n }\n\n // only remove one listener\n matchFound = true;\n break;\n }\n }\n\n if (matchFound) { break; }\n }\n }\n}\n\n// bound to the interactable context when a DOM event\n// listener is added to a selector interactable\nfunction delegateListener (event, optionalArg) {\n const options = getOptions(optionalArg);\n const fakeEvent = {};\n const delegated = delegatedEvents[event.type];\n const eventTarget = (domUtils.getActualElement(event.path\n ? event.path[0]\n : event.target));\n let element = eventTarget;\n\n // duplicate the event so that currentTarget can be changed\n pExtend(fakeEvent, event);\n\n fakeEvent.originalEvent = event;\n fakeEvent.preventDefault = preventOriginalDefault;\n\n // climb up document tree looking for selector matches\n while (is.element(element)) {\n for (let i = 0; i < delegated.selectors.length; i++) {\n const selector = delegated.selectors[i];\n const context = delegated.contexts[i];\n\n if (domUtils.matchesSelector(element, selector)\n && domUtils.nodeContains(context, eventTarget)\n && domUtils.nodeContains(context, element)) {\n\n const listeners = delegated.listeners[i];\n\n fakeEvent.currentTarget = element;\n\n for (let j = 0; j < listeners.length; j++) {\n const [fn, capture, passive] = listeners[j];\n\n if (capture === !!options.capture && passive === options.passive) {\n fn(fakeEvent);\n }\n }\n }\n }\n\n element = domUtils.parentNode(element);\n }\n}\n\nfunction delegateUseCapture (event) {\n return delegateListener.call(this, event, true);\n}\n\nfunction preventDef () {\n this.returnValue = false;\n}\n\nfunction preventOriginalDefault () {\n this.originalEvent.preventDefault();\n}\n\nfunction stopProp () {\n this.cancelBubble = true;\n}\n\nfunction stopImmProp () {\n this.cancelBubble = true;\n this.immediatePropagationStopped = true;\n}\n\nfunction getOptions (param) {\n return is.object(param)? param : { capture: param };\n}\n\nmodule.exports = {\n add,\n remove,\n\n addDelegate,\n removeDelegate,\n\n delegateListener,\n delegateUseCapture,\n delegatedEvents,\n documents,\n\n useAttachEvent,\n supportsOptions,\n\n _elements: elements,\n _targets: targets,\n _attachedListeners: attachedListeners,\n};\n","module.exports = function extend (dest, source) {\n for (const prop in source) {\n dest[prop] = source[prop];\n }\n return dest;\n};\n","const {\n resolveRectLike,\n rectToXY,\n} = require('./rect');\n\nmodule.exports = function (target, element, action) {\n const actionOptions = target.options[action];\n const actionOrigin = actionOptions && actionOptions.origin;\n const origin = actionOrigin || target.options.origin;\n\n const originRect = resolveRectLike(origin, target, element, [target && element]);\n\n return rectToXY(originRect) || { x: 0, y: 0 };\n};\n","module.exports = (x, y) => Math.sqrt(x * x + y * y);\n","const extend = require('./extend');\nconst win = require('./window');\n\nconst utils = {\n warnOnce: function (method, message) {\n let warned = false;\n\n return function () {\n if (!warned) {\n win.window.console.warn(message);\n warned = true;\n }\n\n return method.apply(this, arguments);\n };\n },\n\n // http://stackoverflow.com/a/5634528/2280888\n _getQBezierValue: function (t, p1, p2, p3) {\n const iT = 1 - t;\n return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3;\n },\n\n getQuadraticCurvePoint: function (startX, startY, cpX, cpY, endX, endY, position) {\n return {\n x: utils._getQBezierValue(position, startX, cpX, endX),\n y: utils._getQBezierValue(position, startY, cpY, endY),\n };\n },\n\n // http://gizma.com/easing/\n easeOutQuad: function (t, b, c, d) {\n t /= d;\n return -c * t*(t-2) + b;\n },\n\n copyAction: function (dest, src) {\n dest.name = src.name;\n dest.axis = src.axis;\n dest.edges = src.edges;\n\n return dest;\n },\n\n is : require('./is'),\n extend : extend,\n hypot : require('./hypot'),\n getOriginXY: require('./getOriginXY'),\n};\n\nextend(utils, require('./arr'));\nextend(utils, require('./domUtils'));\nextend(utils, require('./pointerUtils'));\nextend(utils, require('./rect'));\n\nmodule.exports = utils;\n","const scope = require('../scope');\nconst utils = require('./index');\n\nconst finder = {\n methodOrder: [ 'simulationResume', 'mouseOrPen', 'hasPointer', 'idle' ],\n\n search: function (pointer, eventType, eventTarget) {\n const pointerType = utils.getPointerType(pointer);\n const pointerId = utils.getPointerId(pointer);\n const details = { pointer, pointerId, pointerType, eventType, eventTarget };\n\n for (const method of finder.methodOrder) {\n const interaction = finder[method](details);\n\n if (interaction) {\n return interaction;\n }\n }\n },\n\n // try to resume simulation with a new pointer\n simulationResume: function ({ pointerType, eventType, eventTarget }) {\n if (!/down|start/i.test(eventType)) {\n return null;\n }\n\n for (const interaction of scope.interactions) {\n let element = eventTarget;\n\n if (interaction.simulation && interaction.simulation.allowResume\n && (interaction.pointerType === pointerType)) {\n while (element) {\n // if the element is the interaction element\n if (element === interaction.element) {\n return interaction;\n }\n element = utils.parentNode(element);\n }\n }\n }\n\n return null;\n },\n\n // if it's a mouse or pen interaction\n mouseOrPen: function ({ pointerId, pointerType, eventType }) {\n if (pointerType !== 'mouse' && pointerType !== 'pen') {\n return null;\n }\n\n let firstNonActive;\n\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType) {\n // if it's a down event, skip interactions with running simulations\n if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; }\n\n // if the interaction is active, return it immediately\n if (interaction.interacting()) {\n return interaction;\n }\n // otherwise save it and look for another active interaction\n else if (!firstNonActive) {\n firstNonActive = interaction;\n }\n }\n }\n\n // if no active mouse interaction was found use the first inactive mouse\n // interaction\n if (firstNonActive) {\n return firstNonActive;\n }\n\n // find any mouse or pen interaction.\n // ignore the interaction if the eventType is a *down, and a simulation\n // is active\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType && !(/down/i.test(eventType) && interaction.simulation)) {\n return interaction;\n }\n }\n\n return null;\n },\n\n // get interaction that has this pointer\n hasPointer: function ({ pointerId }) {\n for (const interaction of scope.interactions) {\n if (utils.contains(interaction.pointerIds, pointerId)) {\n return interaction;\n }\n }\n },\n\n // get first idle interaction with a matching pointerType\n idle: function ({ pointerType }) {\n for (const interaction of scope.interactions) {\n // if there's already a pointer held down\n if (interaction.pointerIds.length === 1) {\n const target = interaction.target;\n // don't add this pointer if there is a target interactable and it\n // isn't gesturable\n if (target && !target.options.gesture.enabled) {\n continue;\n }\n }\n // maximum of 2 pointers per interaction\n else if (interaction.pointerIds.length >= 2) {\n continue;\n }\n\n if (!interaction.interacting() && (pointerType === interaction.pointerType)) {\n return interaction;\n }\n }\n\n return null;\n },\n};\n\nmodule.exports = finder;\n","const win = require('./window');\nconst isWindow = require('./isWindow');\n\nconst is = {\n array : () => {},\n\n window : thing => thing === win.window || isWindow(thing),\n\n docFrag : thing => is.object(thing) && thing.nodeType === 11,\n\n object : thing => !!thing && (typeof thing === 'object'),\n\n function: thing => typeof thing === 'function',\n\n number : thing => typeof thing === 'number' ,\n\n bool : thing => typeof thing === 'boolean' ,\n\n string : thing => typeof thing === 'string' ,\n\n element: thing => {\n if (!thing || (typeof thing !== 'object')) { return false; }\n\n const _window = win.getWindow(thing) || win.window;\n\n return (/object|function/.test(typeof _window.Element)\n ? thing instanceof _window.Element //DOM2\n : thing.nodeType === 1 && typeof thing.nodeName === 'string');\n },\n};\n\nis.array = thing => (is.object(thing)\n && (typeof thing.length !== 'undefined')\n && is.function(thing.splice));\n\nmodule.exports = is;\n","module.exports = (thing) => !!(thing && thing.Window) && (thing instanceof thing.Window);\n","function pointerExtend (dest, source) {\n for (const prop in source) {\n const prefixedPropREs = module.exports.prefixedPropREs;\n let deprecated = false;\n\n // skip deprecated prefixed properties\n for (const vendor in prefixedPropREs) {\n if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) {\n deprecated = true;\n break;\n }\n }\n\n if (!deprecated && typeof source[prop] !== 'function') {\n dest[prop] = source[prop];\n }\n }\n return dest;\n}\n\npointerExtend.prefixedPropREs = {\n webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/,\n};\n\nmodule.exports = pointerExtend;\n","const hypot = require('./hypot');\nconst browser = require('./browser');\nconst dom = require('./domObjects');\nconst domUtils = require('./domUtils');\nconst domObjects = require('./domObjects');\nconst is = require('./is');\nconst pointerExtend = require('./pointerExtend');\n\nconst pointerUtils = {\n copyCoords: function (dest, src) {\n dest.page = dest.page || {};\n dest.page.x = src.page.x;\n dest.page.y = src.page.y;\n\n dest.client = dest.client || {};\n dest.client.x = src.client.x;\n dest.client.y = src.client.y;\n\n dest.timeStamp = src.timeStamp;\n },\n\n setCoordDeltas: function (targetObj, prev, cur) {\n targetObj.page.x = cur.page.x - prev.page.x;\n targetObj.page.y = cur.page.y - prev.page.y;\n targetObj.client.x = cur.client.x - prev.client.x;\n targetObj.client.y = cur.client.y - prev.client.y;\n targetObj.timeStamp = cur.timeStamp - prev.timeStamp;\n\n // set pointer velocity\n const dt = Math.max(targetObj.timeStamp / 1000, 0.001);\n\n targetObj.page.speed = hypot(targetObj.page.x, targetObj.page.y) / dt;\n targetObj.page.vx = targetObj.page.x / dt;\n targetObj.page.vy = targetObj.page.y / dt;\n\n targetObj.client.speed = hypot(targetObj.client.x, targetObj.page.y) / dt;\n targetObj.client.vx = targetObj.client.x / dt;\n targetObj.client.vy = targetObj.client.y / dt;\n },\n\n isNativePointer: function (pointer) {\n return (pointer instanceof dom.Event || pointer instanceof dom.Touch);\n },\n\n // Get specified X/Y coords for mouse or event.touches[0]\n getXY: function (type, pointer, xy) {\n xy = xy || {};\n type = type || 'page';\n\n xy.x = pointer[type + 'X'];\n xy.y = pointer[type + 'Y'];\n\n return xy;\n },\n\n getPageXY: function (pointer, page) {\n page = page || {};\n\n // Opera Mobile handles the viewport and scrolling oddly\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n pointerUtils.getXY('screen', pointer, page);\n\n page.x += window.scrollX;\n page.y += window.scrollY;\n }\n else {\n pointerUtils.getXY('page', pointer, page);\n }\n\n return page;\n },\n\n getClientXY: function (pointer, client) {\n client = client || {};\n\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n // Opera Mobile handles the viewport and scrolling oddly\n pointerUtils.getXY('screen', pointer, client);\n }\n else {\n pointerUtils.getXY('client', pointer, client);\n }\n\n return client;\n },\n\n getPointerId: function (pointer) {\n return is.number(pointer.pointerId)? pointer.pointerId : pointer.identifier;\n },\n\n setCoords: function (targetObj, pointers, timeStamp) {\n const pointer = (pointers.length > 1\n ? pointerUtils.pointerAverage(pointers)\n : pointers[0]);\n\n const tmpXY = {};\n\n pointerUtils.getPageXY(pointer, tmpXY);\n targetObj.page.x = tmpXY.x;\n targetObj.page.y = tmpXY.y;\n\n pointerUtils.getClientXY(pointer, tmpXY);\n targetObj.client.x = tmpXY.x;\n targetObj.client.y = tmpXY.y;\n\n targetObj.timeStamp = is.number(timeStamp) ? timeStamp :new Date().getTime();\n },\n\n pointerExtend: pointerExtend,\n\n getTouchPair: function (event) {\n const touches = [];\n\n // array of touches is supplied\n if (is.array(event)) {\n touches[0] = event[0];\n touches[1] = event[1];\n }\n // an event\n else {\n if (event.type === 'touchend') {\n if (event.touches.length === 1) {\n touches[0] = event.touches[0];\n touches[1] = event.changedTouches[0];\n }\n else if (event.touches.length === 0) {\n touches[0] = event.changedTouches[0];\n touches[1] = event.changedTouches[1];\n }\n }\n else {\n touches[0] = event.touches[0];\n touches[1] = event.touches[1];\n }\n }\n\n return touches;\n },\n\n pointerAverage: function (pointers) {\n const average = {\n pageX : 0,\n pageY : 0,\n clientX: 0,\n clientY: 0,\n screenX: 0,\n screenY: 0,\n };\n\n for (const pointer of pointers) {\n for (const prop in average) {\n average[prop] += pointer[prop];\n }\n }\n for (const prop in average) {\n average[prop] /= pointers.length;\n }\n\n return average;\n },\n\n touchBBox: function (event) {\n if (!event.length && !(event.touches && event.touches.length > 1)) {\n return;\n }\n\n const touches = pointerUtils.getTouchPair(event);\n const minX = Math.min(touches[0].pageX, touches[1].pageX);\n const minY = Math.min(touches[0].pageY, touches[1].pageY);\n const maxX = Math.max(touches[0].pageX, touches[1].pageX);\n const maxY = Math.max(touches[0].pageY, touches[1].pageY);\n\n return {\n x: minX,\n y: minY,\n left: minX,\n top: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n },\n\n touchDistance: function (event, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n\n\n const dx = touches[0][sourceX] - touches[1][sourceX];\n const dy = touches[0][sourceY] - touches[1][sourceY];\n\n return hypot(dx, dy);\n },\n\n touchAngle: function (event, prevAngle, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n const dx = touches[1][sourceX] - touches[0][sourceX];\n const dy = touches[1][sourceY] - touches[0][sourceY];\n const angle = 180 * Math.atan2(dy , dx) / Math.PI;\n\n return angle;\n },\n\n getPointerType: function (pointer) {\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : is.number(pointer.pointerType)\n ? [undefined, undefined,'touch', 'pen', 'mouse'][pointer.pointerType]\n // if the PointerEvent API isn't available, then the \"pointer\" must\n // be either a MouseEvent, TouchEvent, or Touch object\n : /touch/.test(pointer.type) || pointer instanceof domObjects.Touch\n ? 'touch'\n : 'mouse';\n },\n\n // [ event.target, event.currentTarget ]\n getEventTargets: function (event) {\n return [\n domUtils.getActualElement(event.path ? event.path[0] : event.target),\n domUtils.getActualElement(event.currentTarget),\n ];\n },\n};\n\nmodule.exports = pointerUtils;\n","const { window } = require('./window');\n\nconst vendors = ['ms', 'moz', 'webkit', 'o'];\nlet lastTime = 0;\nlet request;\nlet cancel;\n\nfor (let x = 0; x < vendors.length && !window.requestAnimationFrame; x++) {\n request = window[vendors[x] + 'RequestAnimationFrame'];\n cancel = window[vendors[x] +'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n}\n\nif (!request) {\n request = function (callback) {\n const currTime = new Date().getTime();\n const timeToCall = Math.max(0, 16 - (currTime - lastTime));\n const id = setTimeout(function () { callback(currTime + timeToCall); },\n timeToCall);\n\n lastTime = currTime + timeToCall;\n return id;\n };\n}\n\nif (!cancel) {\n cancel = function (id) {\n clearTimeout(id);\n };\n}\n\nmodule.exports = {\n request,\n cancel,\n};\n","const extend = require('./extend');\nconst is = require('./is');\nconst {\n closest,\n parentNode,\n getElementRect,\n} = require('./domUtils');\n\nconst rectUtils = {\n getStringOptionResult: function (value, interactable, element) {\n if (!is.string(value)) {\n return null;\n }\n\n if (value === 'parent') {\n value = parentNode(element);\n }\n else if (value === 'self') {\n value = interactable.getRect(element);\n }\n else {\n value = closest(element, value);\n }\n\n return value;\n },\n\n resolveRectLike: function (value, interactable, element, functionArgs) {\n value = rectUtils.getStringOptionResult(value, interactable, element) || value;\n\n if (is.function(value)) {\n value = value.apply(null, functionArgs);\n }\n\n if (is.element(value)) {\n value = getElementRect(value);\n }\n\n return value;\n },\n\n rectToXY: function (rect) {\n return rect && {\n x: 'x' in rect ? rect.x : rect.left,\n y: 'y' in rect ? rect.y : rect.top,\n };\n },\n\n xywhToTlbr: function (rect) {\n if (rect && !('left' in rect && 'top' in rect)) {\n rect = extend({}, rect);\n\n rect.left = rect.x || 0;\n rect.top = rect.y || 0;\n rect.right = rect.right || (rect.left + rect.width);\n rect.bottom = rect.bottom || (rect.top + rect.height);\n }\n\n return rect;\n },\n\n tlbrToXywh: function (rect) {\n if (rect && !('x' in rect && 'y' in rect)) {\n rect = extend({}, rect);\n\n rect.x = rect.left || 0;\n rect.top = rect.top || 0;\n rect.width = rect.width || (rect.right - rect.x);\n rect.height = rect.height || (rect.bottom - rect.y);\n }\n\n return rect;\n },\n};\n\nmodule.exports = rectUtils;\n","const win = module.exports;\nconst isWindow = require('./isWindow');\n\nfunction init (window) {\n // get wrapped window if using Shadow DOM polyfill\n\n win.realWindow = window;\n\n // create a TextNode\n const el = window.document.createTextNode('');\n\n // check if it's wrapped by a polyfill\n if (el.ownerDocument !== window.document\n && typeof window.wrap === 'function'\n && window.wrap(el) === el) {\n // use wrapped window\n window = window.wrap(window);\n }\n\n win.window = window;\n}\n\nif (typeof window === 'undefined') {\n win.window = undefined;\n win.realWindow = undefined;\n}\nelse {\n init(window);\n}\n\nwin.getWindow = function getWindow (node) {\n if (isWindow(node)) {\n return node;\n }\n\n const rootNode = (node.ownerDocument || node);\n\n return rootNode.defaultView || rootNode.parentWindow || win.window;\n};\n\nwin.init = init;\n"]} \ No newline at end of file diff --git a/dist/interact.min.js b/dist/interact.min.js index c0bb2476c..2d1f0fb62 100644 --- a/dist/interact.min.js +++ b/dist/interact.min.js @@ -1,6 +1,6 @@ -/* interact.js v1.3.0-alpha.3+sha.9595c40 | https://raw.github.com/taye/interact.js/master/LICENSE */ -!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var t;t="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,t.interact=e()}}(function(){return function e(t,n,r){function i(s,a){if(!n[s]){if(!t[s]){var l="function"==typeof require&&require;if(!a&&l)return l(s,!0);if(o)return o(s,!0);var c=new Error("Cannot find module '"+s+"'");throw c.code="MODULE_NOT_FOUND",c}var p=n[s]={exports:{}};t[s][0].call(p.exports,function(e){var n=t[s][1][e];return i(n||e)},p,p.exports,e,t,n,r)}return n[s].exports}for(var o="function"==typeof require&&require,s=0;s6&&void 0!==arguments[6]&&arguments[6];r(this,e);var f=t.target,v=(f&&f.options||s).deltaSource,g=o(f,p,l),h="start"===c,m="end"===c,y=h?t.startCoords:t.curCoords,x=t.prevEvent;p=p||t.element;var b=i({},y.page),w=i({},y.client);b.x-=g.x,b.y-=g.y,w.x-=g.x,w.y-=g.y,this.ctrlKey=n.ctrlKey,this.altKey=n.altKey,this.shiftKey=n.shiftKey,this.metaKey=n.metaKey,this.button=n.button,this.buttons=n.buttons,this.target=p,this.currentTarget=p,this.relatedTarget=u||null,this.preEnd=d,this.type=l+(c||""),this.interaction=t,this.interactable=f,this.t0=h?t.downTimes[t.downTimes.length-1]:x.t0;var E={interaction:t,event:n,action:l,phase:c,element:p,related:u,page:b,client:w,coords:y,starting:h,ending:m,deltaSource:v,iEvent:this};a.fire("set-xy",E),m?(this.pageX=x.pageX,this.pageY=x.pageY,this.clientX=x.clientX,this.clientY=x.clientY):(this.pageX=b.x,this.pageY=b.y,this.clientX=w.x,this.clientY=w.y),this.x0=t.startCoords.page.x-g.x,this.y0=t.startCoords.page.y-g.y,this.clientX0=t.startCoords.client.x-g.x,this.clientY0=t.startCoords.client.y-g.y,a.fire("set-delta",E),this.timeStamp=y.timeStamp,this.dt=t.pointerDelta.timeStamp,this.duration=this.timeStamp-this.t0,this.speed=t.pointerDelta[v].speed,this.velocityX=t.pointerDelta[v].vx,this.velocityY=t.pointerDelta[v].vy,this.swipe=m||"inertiastart"===c?this.getSwipe():null,a.fire("new",E)}return e.prototype.getSwipe=function(){var e=this.interaction;if(e.prevEvent.speed<600||this.timeStamp-e.prevEvent.timeStamp>150)return null;var t=180*Math.atan2(e.prevEvent.velocityY,e.prevEvent.velocityX)/Math.PI;t<0&&(t+=360);var n=112.5<=t&&t<247.5,r=202.5<=t&&t<337.5,i=!n&&(292.5<=t||t<67.5);return{up:r,down:!r&&22.5<=t&&t<157.5,left:n,right:i,angle:t,speed:e.prevEvent.speed,velocity:{x:e.prevEvent.velocityX,y:e.prevEvent.velocityY}}},e.prototype.preventDefault=function(){},e.prototype.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},e.prototype.stopPropagation=function(){this.propagationStopped=!0},e}();a.on("set-delta",function(e){var t=e.iEvent,n=e.interaction,r=e.starting,i=e.deltaSource,o=r?t:n.prevEvent;"client"===i?(t.dx=t.clientX-o.clientX,t.dy=t.clientY-o.clientY):(t.dx=t.pageX-o.pageX,t.dy=t.pageY-o.pageY)}),l.signals=a,t.exports=l},{"./defaultOptions":18,"./utils/Signals":35,"./utils/extend":41,"./utils/getOriginXY":42}],4:[function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=e("./utils/is"),o=e("./utils/events"),s=e("./utils/extend"),a=e("./actions/base"),l=e("./scope"),c=e("./Eventable"),p=e("./defaultOptions"),u=e("./utils/Signals").new(),d=e("./utils/domUtils"),f=d.getElementRect,v=d.nodeContains,g=d.trySelector,h=e("./utils/window"),m=h.getWindow,y=e("./utils/arr"),x=y.indexOf,b=y.contains,w=e("./utils/browser"),E=w.wheelEvent;l.interactables=[];var S=function(){function e(t,n){r(this,e),n=n||{},this.target=t,this.events=new c,this._context=n.context||l.document,this._win=m(g(t)?this._context:t),this._doc=this._win.document,u.fire("new",{target:t,options:n,interactable:this,win:this._win}),l.addDocument(this._doc,this._win),l.interactables.push(this),this.set(n)}return e.prototype.setOnEvents=function(e,t){var n="on"+e;return i.function(t.onstart)&&(this.events[n+"start"]=t.onstart),i.function(t.onmove)&&(this.events[n+"move"]=t.onmove),i.function(t.onend)&&(this.events[n+"end"]=t.onend),i.function(t.oninertiastart)&&(this.events[n+"inertiastart"]=t.oninertiastart),this},e.prototype.setPerAction=function(e,t){for(var n in t)n in p[e]&&(i.object(t[n])?(this.options[e][n]=s(this.options[e][n]||{},t[n]),i.object(p.perAction[n])&&"enabled"in p.perAction[n]&&(this.options[e][n].enabled=!1!==t[n].enabled)):i.bool(t[n])&&i.object(p.perAction[n])?this.options[e][n].enabled=t[n]:void 0!==t[n]&&(this.options[e][n]=t[n]))},e.prototype.getRect=function(e){return e=e||this.target,i.string(this.target)&&!i.element(e)&&(e=this._context.querySelector(this.target)),f(e)},e.prototype.rectChecker=function(e){return i.function(e)?(this.getRect=e,this):null===e?(delete this.options.getRect,this):this.getRect},e.prototype._backCompatOption=function(e,t){if(g(t)||i.object(t)){this.options[e]=t;for(var n=a.names,r=Array.isArray(n),o=0,n=r?n:n[Symbol.iterator]();;){var s;if(r){if(o>=n.length)break;s=n[o++]}else{if(o=n.next(),o.done)break;s=o.value}var l=s;this.options[l][e]=t}return this}return this.options[e]},e.prototype.origin=function(e){return this._backCompatOption("origin",e)},e.prototype.deltaSource=function(e){return"page"===e||"client"===e?(this.options.deltaSource=e,this):this.options.deltaSource},e.prototype.context=function(){return this._context},e.prototype.inContext=function(e){return this._context===e.ownerDocument||v(this._context,e)},e.prototype.fire=function(e){return this.events.fire(e),this},e.prototype._onOffMultiple=function(e,t,n,r){if(i.string(t)&&-1!==t.search(" ")&&(t=t.trim().split(/ +/)),i.array(t)){for(var o=0;o=l.length)break;f=l[d++]}else{if(d=l.next(),d.done)break;f=d.value}var v=f;this.options[v]=p.base[v],v in t&&this[v](t[v])}return u.fire("set",{options:t,interactable:this}),this},e.prototype.unset=function(){if(o.remove(this.target,"all"),i.string(this.target))for(var e in o.delegatedEvents){var t=o.delegatedEvents[e];t.selectors[0]===this.target&&t.contexts[0]===this._context&&(t.selectors.splice(0,1),t.contexts.splice(0,1),t.listeners.splice(0,1),t.selectors.length||(t[e]=null)),o.remove(this._context,e,o.delegateListener),o.remove(this._context,e,o.delegateUseCapture,!0)}else o.remove(this,"all");u.fire("unset",{interactable:this}),l.interactables.splice(x(l.interactables,this),1);for(var n=l.interactions||[],r=Array.isArray(n),s=0,n=r?n:n[Symbol.iterator]();;){var a;if(r){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var c=a;c.target===this&&c.interacting()&&c.stop()}return l.interact},e}();l.interactables.indexOfElement=function(e,t){t=t||l.document;for(var n=0;n=y.length)break;w=y[b++]}else{if(b=y.next(),b.done)break;w=b.value}var E=w,S=E[0],T=E[1];T._updateEventTargets(r,i),T[e](S,t,r,i)}}}function o(e){for(var t=0;te.pointerMoveTolerance);var a={pointer:t,pointerIndex:this.getPointerIndex(t),event:n,eventTarget:r,dx:o,dy:s,duplicate:i,interaction:this,interactingBeforeMove:this.interacting()};i||l.setCoordDeltas(this.pointerDelta,this.prevCoords,this.curCoords),d.fire("move",a),i||(this.interacting()&&this.doMove(a),this.pointerWasMoved&&l.copyCoords(this.prevCoords,this.curCoords))},e.prototype.doMove=function(e){e=l.extend({pointer:this.pointers[0],event:this.prevEvent,eventTarget:this._eventTarget,interaction:this},e||{}),d.fire("before-action-move",e),this._dontFireMove||d.fire("action-move",e),this._dontFireMove=!1},e.prototype.pointerUp=function(e,t,n,r){var i=this.getPointerIndex(e);d.fire(/cancel$/i.test(t.type)?"cancel":"up",{pointer:e,pointerIndex:i,event:t,eventTarget:n,curEventTarget:r,interaction:this}),this.simulation||this.end(t),this.pointerIsDown=!1,this.removePointer(e,t)},e.prototype.end=function(e){e=e||this.prevEvent,this.interacting()&&d.fire("action-end",{event:e,interaction:this}),this.stop()},e.prototype.currentAction=function(){return this._interacting?this.prepared.name:null},e.prototype.interacting=function(){return this._interacting},e.prototype.stop=function(){d.fire("stop",{interaction:this}),this._interacting&&(d.fire("stop-active",{interaction:this}),d.fire("stop-"+this.prepared.name,{interaction:this})),this.target=this.element=null,this._interacting=!1,this.prepared.name=this.prevEvent=null},e.prototype.getPointerIndex=function(e){return l.indexOf(this.pointerIds,l.getPointerId(e))},e.prototype.updatePointer=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:t&&/(down|start)$/i.test(t.type),r=l.getPointerId(e),i=this.getPointerIndex(e);return-1===i&&(i=this.pointerIds.length,this.pointerIds[i]=r),n&&d.fire("update-pointer-down",{pointer:e,event:t,down:n,pointerId:r,pointerIndex:i,interaction:this}),this.pointers[i]=e,i},e.prototype.removePointer=function(e,t){var n=l.getPointerId(e),r=this.mouse?0:l.indexOf(this.pointerIds,n);-1!==r&&(d.fire("remove-pointer",{pointer:e,event:t,pointerIndex:r,interaction:this}),this.pointers.splice(r,1),this.pointerIds.splice(r,1),this.downTargets.splice(r,1),this.downTimes.splice(r,1))},e.prototype._updateEventTargets=function(e,t){this._eventTarget=e,this._curEventTarget=t},e}(),m=0,y=v.length;m=i.length)break;a=i[s++]}else{if(s=i.next(),s.done)break;a=s.value}var l=a;if(l.options.drop.enabled){var c=l.options.drop.accept;if(!(p.is.element(c)&&c!==t||p.is.string(c)&&!p.matchesSelector(t,c)))for(var d=p.is.string(l.target)?l._context.querySelectorAll(l.target):[l.target],f=0;fo.left&&c.xo.top&&c.y=o.left&&v<=o.right&&g>=o.top&&g<=o.bottom}if(f&&p.is.number(a)){s=Math.max(0,Math.min(o.right,f.right)-Math.max(o.left,f.left))*Math.max(0,Math.min(o.bottom,f.bottom)-Math.max(o.top,f.top))/(f.width*f.height)>=a}return this.options.drop.checker&&(s=this.options.drop.checker(e,t,s,this,i,n,r)),s},v.signals.on("unset",function(e){e.interactable.dropzone(!1)}),v.settingsMethods.push("dropChecker"),g.signals.on("new",function(e){e.dropTarget=null,e.dropElement=null,e.prevDropTarget=null,e.prevDropElement=null,e.dropEvents=null,e.activeDrops={dropzones:[],elements:[],rects:[]}}),g.signals.on("stop",function(e){var t=e.interaction;t.dropTarget=t.dropElement=t.prevDropTarget=t.prevDropElement=null}),d.dynamicDrop=function(e){return p.is.bool(e)?(y=e,d):y},p.merge(v.eventTypes,["dragenter","dragleave","dropactivate","dropdeactivate","dropmove","drop"]),c.methodDict.drop="dropzone",h.drop=m.defaults,t.exports=m},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../interact":21,"../scope":34,"../utils":44,"./base":6}],9:[function(e,t,n){"use strict";var r=e("./base"),i=e("../utils"),o=e("../InteractEvent"),s=e("../Interactable"),a=e("../Interaction"),l=e("../defaultOptions"),c={defaults:{enabled:!1,origin:null,restrict:null},checker:function(e,t,n,r,i){return i.pointerIds.length>=2?{name:"gesture"}:null},getCursor:function(){return""}};o.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;"gesturestart"===t.type&&(t.ds=0,n.gesture.startDistance=n.gesture.prevDistance=t.distance,n.gesture.startAngle=n.gesture.prevAngle=t.angle,n.gesture.scale=1)}),o.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;"gesturemove"===t.type&&(t.ds=t.scale-n.gesture.scale,n.target.fire(t),n.gesture.prevAngle=t.angle,n.gesture.prevDistance=t.distance,t.scale===1/0||null===t.scale||void 0===t.scale||isNaN(t.scale)||(n.gesture.scale=t.scale))}),s.prototype.gesturable=function(e){return i.is.object(e)?(this.options.gesture.enabled=!1!==e.enabled,this.setPerAction("gesture",e),this.setOnEvents("gesture",e),this):i.is.bool(e)?(this.options.gesture.enabled=e,e||(this.ongesturestart=this.ongesturestart=this.ongestureend=null),this):this.options.gesture},o.signals.on("set-delta",function(e){var t=e.interaction,n=e.iEvent,r=e.action,s=e.event,a=e.starting,l=e.ending,c=e.deltaSource;if("gesture"===r){var p=t.pointers;n.touches=[p[0],p[1]],a?(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=1,n.ds=0,n.angle=i.touchAngle(p,void 0,c),n.da=0):l||s instanceof o?(n.distance=t.prevEvent.distance,n.box=t.prevEvent.box,n.scale=t.prevEvent.scale,n.ds=n.scale-1,n.angle=t.prevEvent.angle,n.da=n.angle-t.gesture.startAngle):(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=n.distance/t.gesture.startDistance,n.angle=i.touchAngle(p,t.gesture.prevAngle,c),n.ds=n.scale-t.gesture.prevScale,n.da=n.angle-t.gesture.prevAngle)}}),a.signals.on("new",function(e){e.gesture={start:{x:0,y:0},startDistance:0,prevDistance:0,distance:0,scale:1,startAngle:0,prevAngle:0}}),r.gesture=c,r.names.push("gesture"),i.merge(s.eventTypes,["gesturestart","gesturemove","gestureend"]),r.methodDict.gesture="gesturable",l.gesture=c.defaults,t.exports=c},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"./base":6}],10:[function(e,t,n){"use strict";function r(e,t,n,r,i,s,a){if(!t)return!1;if(!0===t){var l=o.is.number(s.width)?s.width:s.right-s.left,c=o.is.number(s.height)?s.height:s.bottom-s.top;if(l<0&&("left"===e?e="right":"right"===e&&(e="left")),c<0&&("top"===e?e="bottom":"bottom"===e&&(e="top")),"left"===e)return n.x<(l>=0?s.left:s.right)+a;if("top"===e)return n.y<(c>=0?s.top:s.bottom)+a;if("right"===e)return n.x>(l>=0?s.right:s.left)-a;if("bottom"===e)return n.y>(c>=0?s.bottom:s.top)-a}return!!o.is.element(r)&&(o.is.element(t)?t===r:o.matchesUpTo(r,t,i))}var i=e("./base"),o=e("../utils"),s=e("../utils/browser"),a=e("../InteractEvent"),l=e("../Interactable"),c=e("../Interaction"),p=e("../defaultOptions"),u=s.supportsTouch||s.supportsPointerEvent?20:10,d={defaults:{enabled:!1,mouseButtons:null,origin:null,snap:null,restrict:null,inertia:null,autoScroll:null,square:!1,preserveAspectRatio:!1,axis:"xy",margin:NaN,edges:null,invert:"none"},checker:function(e,t,n,i,s,a){if(!a)return null;var l=o.extend({},s.curCoords.page),c=n.options;if(c.resize.enabled){var p=c.resize,d={left:!1,right:!1,top:!1,bottom:!1};if(o.is.object(p.edges)){for(var f in d)d[f]=r(f,p.edges[f],l,s._eventTarget,i,a,p.margin||u);if(d.left=d.left&&!d.right,d.top=d.top&&!d.bottom,d.left||d.right||d.top||d.bottom)return{name:"resize",edges:d}}else{var v="y"!==c.resize.axis&&l.x>a.right-u,g="x"!==c.resize.axis&&l.y>a.bottom-u;if(v||g)return{name:"resize",axes:(v?"x":"")+(g?"y":"")}}}return null},cursors:s.isIe9OrOlder?{x:"e-resize",y:"s-resize",xy:"se-resize",top:"n-resize",left:"w-resize",bottom:"s-resize",right:"e-resize",topleft:"se-resize",bottomright:"se-resize",topright:"ne-resize",bottomleft:"ne-resize"}:{x:"ew-resize",y:"ns-resize",xy:"nwse-resize",top:"ns-resize",left:"ew-resize",bottom:"ns-resize",right:"ew-resize",topleft:"nwse-resize",bottomright:"nwse-resize",topright:"nesw-resize",bottomleft:"nesw-resize"},getCursor:function(e){if(e.axis)return d.cursors[e.name+e.axis];if(e.edges){for(var t="",n=["top","bottom","left","right"],r=0;r<4;r++)e.edges[n[r]]&&(t+=n[r]);return d.cursors[t]}}};a.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;if("resizestart"===t.type&&n.prepared.edges){var r=n.target.getRect(n.element),i=n.target.options.resize;if(i.square||i.preserveAspectRatio){var s=o.extend({},n.prepared.edges);s.top=s.top||s.left&&!s.bottom,s.left=s.left||s.top&&!s.right,s.bottom=s.bottom||s.right&&!s.top,s.right=s.right||s.bottom&&!s.left,n.prepared._linkedEdges=s}else n.prepared._linkedEdges=null;i.preserveAspectRatio&&(n.resizeStartAspectRatio=r.width/r.height),n.resizeRects={start:r,current:o.extend({},r),inverted:o.extend({},r),previous:o.extend({},r),delta:{left:0,right:0,width:0,top:0,bottom:0,height:0}},t.rect=n.resizeRects.inverted,t.deltaRect=n.resizeRects.delta}}),a.signals.on("new",function(e){var t=e.iEvent,n=e.phase,r=e.interaction;if("move"===n&&r.prepared.edges){var i=r.target.options.resize,s=i.invert,a="reposition"===s||"negate"===s,l=r.prepared.edges,c=r.resizeRects.start,p=r.resizeRects.current,u=r.resizeRects.inverted,d=r.resizeRects.delta,f=o.extend(r.resizeRects.previous,u),v=l,g=t.dx,h=t.dy;if(i.preserveAspectRatio||i.square){var m=i.preserveAspectRatio?r.resizeStartAspectRatio:1;l=r.prepared._linkedEdges,v.left&&v.bottom||v.right&&v.top?h=-g/m:v.left||v.right?h=g/m:(v.top||v.bottom)&&(g=h*m)}if(l.top&&(p.top+=h),l.bottom&&(p.bottom+=h),l.left&&(p.left+=g),l.right&&(p.right+=g),a){if(o.extend(u,p),"reposition"===s){var y=void 0;u.top>u.bottom&&(y=u.top,u.top=u.bottom,u.bottom=y),u.left>u.right&&(y=u.left,u.left=u.right,u.right=y)}}else u.top=Math.min(p.top,c.bottom),u.bottom=Math.max(p.bottom,c.top),u.left=Math.min(p.left,c.right),u.right=Math.max(p.right,c.left);u.width=u.right-u.left,u.height=u.bottom-u.top;for(var x in u)d[x]=u[x]-f[x];t.edges=r.prepared.edges,t.rect=u,t.deltaRect=d}}),l.prototype.resizable=function(e){return o.is.object(e)?(this.options.resize.enabled=!1!==e.enabled,this.setPerAction("resize",e),this.setOnEvents("resize",e),/^x$|^y$|^xy$/.test(e.axis)?this.options.resize.axis=e.axis:null===e.axis&&(this.options.resize.axis=p.resize.axis),o.is.bool(e.preserveAspectRatio)?this.options.resize.preserveAspectRatio=e.preserveAspectRatio:o.is.bool(e.square)&&(this.options.resize.square=e.square),this):o.is.bool(e)?(this.options.resize.enabled=e,e||(this.onresizestart=this.onresizestart=this.onresizeend=null),this):this.options.resize},c.signals.on("new",function(e){ -e.resizeAxes="xy"}),a.signals.on("set-delta",function(e){var t=e.interaction,n=e.iEvent;"resize"===e.action&&t.resizeAxes&&(t.target.options.resize.square?("y"===t.resizeAxes?n.dx=n.dy:n.dy=n.dx,n.axes="xy"):(n.axes=t.resizeAxes,"x"===t.resizeAxes?n.dy=0:"y"===t.resizeAxes&&(n.dx=0)))}),i.resize=d,i.names.push("resize"),o.merge(l.eventTypes,["resizestart","resizemove","resizeinertiastart","resizeinertiaresume","resizeend"]),i.methodDict.resize="resizable",p.resize=d.defaults,t.exports=d},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"../utils/browser":37,"./base":6}],11:[function(e,t,n){"use strict";var r=e("./utils/raf"),i=e("./utils/window").getWindow,o=e("./utils/is"),s=e("./utils/domUtils"),a=e("./Interaction"),l=e("./defaultOptions"),c={defaults:{enabled:!1,container:null,margin:60,speed:300},interaction:null,i:null,x:0,y:0,isScrolling:!1,prevTime:0,start:function(e){c.isScrolling=!0,r.cancel(c.i),c.interaction=e,c.prevTime=(new Date).getTime(),c.i=r.request(c.scroll)},stop:function(){c.isScrolling=!1,r.cancel(c.i)},scroll:function(){var e=c.interaction.target.options[c.interaction.prepared.name].autoScroll,t=e.container||i(c.interaction.element),n=(new Date).getTime(),s=(n-c.prevTime)/1e3,a=e.speed*s;a>=1&&(o.window(t)?t.scrollBy(c.x*a,c.y*a):t&&(t.scrollLeft+=c.x*a,t.scrollTop+=c.y*a),c.prevTime=n),c.isScrolling&&(r.cancel(c.i),c.i=r.request(c.scroll))},check:function(e,t){var n=e.options;return n[t].autoScroll&&n[t].autoScroll.enabled},onInteractionMove:function(e){var t=e.interaction,n=e.pointer;if(t.interacting()&&c.check(t.target,t.prepared.name)){if(t.simulation)return void(c.x=c.y=0);var r=void 0,a=void 0,l=void 0,p=void 0,u=t.target.options[t.prepared.name].autoScroll,d=u.container||i(t.element);if(o.window(d))p=n.clientXd.innerWidth-c.margin,l=n.clientY>d.innerHeight-c.margin;else{var f=s.getElementClientRect(d);p=n.clientXf.right-c.margin,l=n.clientY>f.bottom-c.margin}c.x=a?1:p?-1:0,c.y=l?1:r?-1:0,c.isScrolling||(c.margin=u.margin,c.speed=u.speed,c.start(t))}}};a.signals.on("stop-active",function(){c.stop()}),a.signals.on("action-move",c.onInteractionMove),l.perAction.autoScroll=c.defaults,t.exports=c},{"./Interaction":5,"./defaultOptions":18,"./utils/domUtils":39,"./utils/is":46,"./utils/raf":50,"./utils/window":52}],12:[function(e,t,n){"use strict";var r=e("../Interactable"),i=e("../actions/base"),o=e("../utils/is"),s=e("../utils/domUtils");r.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},r.prototype.ignoreFrom=function(e){return this._backCompatOption("ignoreFrom",e)},r.prototype.allowFrom=function(e){return this._backCompatOption("allowFrom",e)},r.prototype.testIgnore=function(e,t,n){return!(!e||!o.element(n))&&(o.string(e)?s.matchesUpTo(n,e,t):!!o.element(e)&&s.nodeContains(e,n))},r.prototype.testAllow=function(e,t,n){return!e||!!o.element(n)&&(o.string(e)?s.matchesUpTo(n,e,t):!!o.element(e)&&s.nodeContains(e,n))},r.prototype.testIgnoreAllow=function(e,t,n){return!this.testIgnore(e.ignoreFrom,t,n)&&this.testAllow(e.allowFrom,t,n)},r.prototype.actionChecker=function(e){return o.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},r.prototype.styleCursor=function(e){return o.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},r.prototype.defaultActionChecker=function(e,t,n,r){for(var o=this.getRect(r),s=null,a=i.names,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var u=p;if((!n.pointerIsDown||!n.mouse||0!=(t.buttons&this.options[u].mouseButtons))&&(s=i[u].checker(e,t,this,r,n,o)))return s}}},{"../Interactable":4,"../actions/base":6,"../utils/domUtils":39,"../utils/is":46}],13:[function(e,t,n){"use strict";function r(e,t,n,r){return g.is.object(e)&&t.testIgnoreAllow(t.options[e.name],n,r)&&t.options[e.name].enabled&&a(t,n,e)?e:null}function i(e,t,n,i,o,s){for(var a=0,l=i.length;a=m.maxInteractions)return!1;if(u.target===e){if((a+=d===n.name|0)>=i)return!1;if(u.element===t&&(l++,d!==n.name||l>=o))return!1}}}return m.maxInteractions>0}}var l=e("../interact"),c=e("../Interactable"),p=e("../Interaction"),u=e("../actions/base"),d=e("../defaultOptions"),f=e("../utils/browser"),v=e("../scope"),g=e("../utils"),h=e("../utils/Signals").new();e("./InteractableMethods");var m={signals:h,withinInteractionLimit:a,maxInteractions:1/0,defaults:{perAction:{manualStart:!1,max:1/0,maxPerElement:1,allowFrom:null,ignoreFrom:null}},setActionDefaults:function(e){g.extend(e.defaults,m.defaults.perAction)}};p.signals.on("down",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;if(!t.interacting()){s(t,o(t,n,r,i))}}),p.signals.on("move",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;if(t.mouse&&!t.pointerIsDown&&!t.interacting()){s(t,o(t,n,r,i))}}),p.signals.on("move",function(e){var t=e.interaction,n=e.event;if(t.pointerIsDown&&!t.interacting()&&t.pointerWasMoved&&t.prepared.name){h.fire("before-start",e);var r=t.target;t.prepared.name&&r&&(r.options[t.prepared.name].manualStart||!a(r,t.element,t.prepared)?t.stop(n):t.start(t.prepared,r,t.element))}}),p.signals.on("stop",function(e){var t=e.interaction,n=t.target;n&&n.options.styleCursor&&(n._doc.documentElement.style.cursor="")}),c.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},c.prototype.actionChecker=function(e){return g.is.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},c.prototype.styleCursor=function(e){return g.is.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},c.prototype.defaultActionChecker=function(e,t,n,r){for(var i=this.getRect(r),o=t.buttons||{0:1,1:4,3:8,4:16}[t.button],s=null,a=u.names,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var d=p;if((!n.pointerIsDown||!n.mouse||0!=(o&this.options[d].mouseButtons))&&(s=u[d].checker(e,t,this,r,n,i)))return s}},l.maxInteractions=function(e){return g.is.number(e)?(m.maxInteractions=e,this):m.maxInteractions},c.settingsMethods.push("styleCursor"),c.settingsMethods.push("actionChecker"),c.settingsMethods.push("ignoreFrom"),c.settingsMethods.push("allowFrom"),d.base.actionChecker=null,d.base.styleCursor=!0,g.extend(d.perAction,m.defaults.perAction),t.exports=m},{"../Interactable":4,"../Interaction":5,"../actions/base":6,"../defaultOptions":18,"../interact":21,"../scope":34,"../utils":44,"../utils/Signals":35,"../utils/browser":37,"./InteractableMethods":12}],14:[function(e,t,n){"use strict";var r=e("./base"),i=e("../Interaction");i.signals.on("new",function(e){e.delayTimer=null}),r.signals.on("prepared",function(e){var t=e.interaction,n=t.prepared.name;if(n){var r=t.target.options[n].delay;r>0&&(t.delayTimer=setTimeout(function(){t.start(t.prepared,t.target,t.element)},r))}}),i.signals.on("move",function(e){var t=e.interaction,n=e.duplicate;t.pointerWasMoved&&!n&&clearTimeout(t.delayTimer)}),r.signals.on("before-start",function(e){var t=e.interaction,n=t.prepared.name;if(n){t.target.options[n].delay>0&&(t.prepared.name=null)}})},{"../Interaction":5,"./base":13}],15:[function(e,t,n){"use strict";function r(e,t){if(!t)return!1;var n=t.options.drag.startAxis;return"xy"===e||"xy"===n||n===e}var i=e("./base"),o=e("../scope"),s=e("../utils/browser"),a=e("../utils/is"),l=e("../utils/domUtils"),c=l.matchesSelector,p=l.parentNode;i.setActionDefaults(e("../actions/drag")),i.signals.on("before-start",function(e){var t=e.interaction,n=e.eventTarget,l=e.dx,u=e.dy;if("drag"===t.prepared.name){var d=Math.abs(l),f=Math.abs(u),v=t.target.options.drag,g=v.startAxis,h=d>f?"x":dl.minSpeed&&g>l.endSpeed,b={interaction:t,pageCoords:v,statuses:f,preEnd:!0,requireEndOnly:!0};y&&!x&&(c.resetStatuses(f),m=c.setAll(b),m.shouldMove&&m.locked&&(h=!0)),(x||h)&&(p.copyCoords(i.upCoords,t.curCoords),t.pointers[0]=i.startEvent=new a(t,n,t.prepared.name,"inertiastart",t.element),i.t0=d,i.active=!0,i.allowResume=l.allowResume,t.simulation=i,o.fire(i.startEvent),x?(i.vx0=t.pointerDelta.client.vx,i.vy0=t.pointerDelta.client.vy,i.v0=g,r(t,i),p.extend(v,t.curCoords.page),v.x+=i.xe,v.y+=i.ye,c.resetStatuses(f),m=c.setAll(b),i.modifiedXe+=m.dx,i.modifiedYe+=m.dy,i.i=u.request(t.boundInertiaFrame)):(i.smoothEnd=!0,i.xe=m.dx,i.ye=m.dy,i.sx=i.sy=0,i.i=u.request(t.boundSmoothEndFrame)))}}),l.signals.on("stop-active",function(e){var t=e.interaction,n=t.inertiaStatus;n.active&&(u.cancel(n.i),n.active=!1,t.simulation=null)})},{"./InteractEvent":3,"./Interaction":5,"./modifiers":24,"./utils":44,"./utils/raf":50}],21:[function(e,t,n){"use strict";function r(e,t){var n=a.interactables.get(e,t);return n||(n=new l(e,t),n.events.global=p),n}var i=e("./utils/browser"),o=e("./utils/events"),s=e("./utils"),a=e("./scope"),l=e("./Interactable"),c=e("./Interaction"),p={};r.isSet=function(e,t){return-1!==a.interactables.indexOfElement(e,t&&t.context)},r.on=function(e,t,n){if(s.is.string(e)&&-1!==e.search(" ")&&(e=e.trim().split(/ +/)),s.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.on(f,t,n)}return r}if(s.is.object(e)){for(var v in e)r.on(v,e[v],t);return r}return s.contains(l.eventTypes,e)?p[e]?p[e].push(t):p[e]=[t]:o.add(a.document,e,t,{options:n}),r},r.off=function(e,t,n){if(s.is.string(e)&&-1!==e.search(" ")&&(e=e.trim().split(/ +/)),s.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.off(f,t,n)}return r}if(s.is.object(e)){for(var v in e)r.off(v,e[v],t);return r}if(s.contains(l.eventTypes,e)){var g=void 0;e in p&&-1!==(g=s.indexOf(p[e],t))&&p[e].splice(g,1)}else o.remove(a.document,e,t,n);return r},r.debug=function(){return a},r.getPointerAverage=s.pointerAverage,r.getTouchBBox=s.touchBBox,r.getTouchDistance=s.touchDistance,r.getTouchAngle=s.touchAngle,r.getElementRect=s.getElementRect,r.getElementClientRect=s.getElementClientRect,r.matchesSelector=s.matchesSelector,r.closest=s.closest,r.supportsTouch=function(){return i.supportsTouch},r.supportsPointerEvent=function(){return i.supportsPointerEvent},r.stop=function(e){for(var t=a.interactions.length-1;t>=0;t--)a.interactions[t].stop(e);return r},r.pointerMoveTolerance=function(e){return s.is.number(e)?(c.pointerMoveTolerance=e,this):c.pointerMoveTolerance},r.addDocument=a.addDocument,r.removeDocument=a.removeDocument,a.interact=r,t.exports=r},{"./Interactable":4,"./Interaction":5,"./scope":34,"./utils":44,"./utils/browser":37,"./utils/events":40}],22:[function(e,t,n){"use strict";function r(e){var t=e.interaction,n=e.event;t.target&&t.target.checkAndPreventDefault(n)}var i=e("./Interactable"),o=e("./Interaction"),s=e("./scope"),a=e("./utils/is"),l=e("./utils/events"),c=e("./utils/domUtils"),p=c.nodeContains,u=c.matchesSelector;i.prototype.preventDefault=function(e){return/^(always|never|auto)$/.test(e)?(this.options.preventDefault=e,this):a.bool(e)?(this.options.preventDefault=e?"always":"never",this):this.options.preventDefault},i.prototype.checkAndPreventDefault=function(e){var t=this.options.preventDefault;if("never"!==t)return"always"===t?void e.preventDefault():void(l.supportsOptions||/^(mouse|pointer|touch)*(down|start)/i.test(e.type)||a.element(e.target)&&u(e.target,"input,select,textarea,[contenteditable=true],[contenteditable=true] *")||e.preventDefault())};for(var d=["down","move","up","cancel"],f=0;f=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i;if(o.element&&(o.element===e.target||p(o.element,e.target)))return void o.target.checkAndPreventDefault(e)}}},{"./Interactable":4,"./Interaction":5,"./scope":34,"./utils/domUtils":39,"./utils/events":40,"./utils/is":46}],23:[function(e,t,n){"use strict";function r(e){var t=e.target,n=a.search(e,e.type,t);n&&n.prevTap&&e.clientX===n.prevTap.clientX&&e.clientY===n.prevTap.clientY&&t===n.prevTap.target&&(n.downTargets[0]=t,n.downTimes[0]=(new Date).getTime(),l.fire({interaction:n,event:e,eventTarget:t,pointer:e,type:"tap"}))}var i=e("./scope"),o=e("./utils/events"),s=e("./utils/browser"),a=e("./utils/interactionFinder"),l=e("./pointerEvents/base"),c=e("./utils/window"),p=c.window,u=Object.prototype.toString;if(p.Array.isArray||(p.Array.isArray=function(e){return"[object Array]"===u.call(e)}),String.prototype.trim||(String.prototype.trim=function(){return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")}),s.isIE8){var d=function(e){for(var t=i.interactions,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var o;if(n){if(r>=t.length)break;o=t[r++]}else{if(r=t.next(),r.done)break;o=r.value}var s=o;s.interacting()&&s.target.checkAndPreventDefault(e)}},f=function(e,t){var n=e.doc,i=(e.win,0===t.indexOf("listen")?o.add:o.remove);i(n,"selectstart",d),l&&i(n,"dblclick",r)};i.signals.on("add-document",f),i.signals.on("remove-document",f)}t.exports=null},{"./pointerEvents/base":31,"./scope":34,"./utils/browser":37,"./utils/events":40,"./utils/interactionFinder":45,"./utils/window":52}],24:[function(e,t,n){"use strict";function r(e,t,n){return e&&e.enabled&&(t||!e.endOnly)&&(!n||e.endOnly)}var i=e("../InteractEvent"),o=e("../Interaction"),s=e("../utils/extend"),a={names:[],setOffsets:function(e){var t=e.interaction,n=e.pageCoords,r=t.target,i=t.element,o=t.startOffset,s=r.getRect(i);s?(o.left=n.x-s.left,o.top=n.y-s.top,o.right=s.right-n.x,o.bottom=s.bottom-n.y,"width"in s||(s.width=s.right-s.left),"height"in s||(s.height=s.bottom-s.top)):o.left=o.top=o.right=o.bottom=0,e.rect=s,e.interactable=r,e.element=i;for(var l=0;l=p.length)break;f=p[d++]}else{if(d=p.next(),d.done)break;f=d.value}var v=f,g=a[v],h=t.target.options[t.prepared.name][v];r(h,i,o)&&(e.status=e.status=n[v],e.options=h,e.offset=e.interaction.modifierOffsets[v],g.set(e),e.status.locked&&(l.x+=e.status.dx,l.y+=e.status.dy,c.dx+=e.status.dx,c.dy+=e.status.dy,c.locked=!0))}return c.shouldMove=!e.status||!c.locked||e.status.changed,c},resetStatuses:function(e){for(var t=a.names,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var i;if(n){if(r>=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i,s=e[o]||{};s.dx=s.dy=0,s.modifiedX=s.modifiedY=NaN,s.locked=!1,s.changed=!0,e[o]=s}return e},start:function(e,t){var n=e.interaction,r={interaction:n,pageCoords:("action-resume"===t?n.curCoords:n.startCoords).page,startOffset:n.startOffset,statuses:n.modifierStatuses,preEnd:!1,requireEndOnly:!1};a.setOffsets(r),a.resetStatuses(r.statuses),r.pageCoords=s({},n.startCoords.page),n.modifierResult=a.setAll(r)}};o.signals.on("new",function(e){e.startOffset={left:0,right:0,top:0,bottom:0},e.modifierOffsets={},e.modifierStatuses=a.resetStatuses({}),e.modifierResult=null}),o.signals.on("action-start",a.start),o.signals.on("action-resume",a.start),o.signals.on("before-action-move",function(e){var t=e.interaction,n=e.preEnd,r=e.interactingBeforeMove,i=a.setAll({interaction:t,preEnd:n,pageCoords:t.curCoords.page,statuses:t.modifierStatuses,requireEndOnly:!1});!i.shouldMove&&r&&(t._dontFireMove=!0),t.modifierResult=i}),o.signals.on("action-end",function(e){for(var t=e.interaction,n=e.event,i=0;i=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}var m=h,y=m.x,x=m.y;l.push({x:s.left-i.width*y+u.x,y:s.top-i.height*x+u.y})}else l.push(u);return l},set:function(e){var t=e.interaction,n=e.pageCoords,r=e.status,i=e.options,s=e.offset,a=[],l=void 0,c=void 0,p=void 0;if(r.useStatusXY)c={x:r.x,y:r.y};else{var u=o.getOriginXY(t.target,t.element,t.prepared.name);c=o.extend({},n),c.x-=u.x,c.y-=u.y}r.realX=c.x,r.realY=c.y;for(var d=i.targets?i.targets.length:0,f=s,v=Array.isArray(f),g=0,f=v?f:f[Symbol.iterator]();;){var h;if(v){if(g>=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}for(var m=h,y=m.x,x=m.y,b=c.x-y,w=c.y-x,E=i.targets,S=Array.isArray(E),T=0,E=S?E:E[Symbol.iterator]();;){var C;if(S){if(T>=E.length)break;C=E[T++]}else{if(T=E.next(),T.done)break;C=T.value}var A=C;l=o.is.function(A)?A(b,w,t):A,l&&a.push({x:o.is.number(l.x)?l.x+y:b,y:o.is.number(l.y)?l.y+x:w,range:o.is.number(l.range)?l.range:i.range})}}var D={target:null,inRange:!1,distance:0,range:0,dx:0,dy:0};for(p=0,d=a.length;p=p.length)break;f=p[d++]}else{if(d=p.next(),d.done)break;f=d.value}var v=f,g=void 0;g=a.is.function(v)?v(l,c,t):v,g&&("width"in g&&"height"in g&&(g.x=g.width,g.y=g.height),e.options.targets.push(g))}i.set(e)},modifyCoords:function(e){var t=e.options;e.options=a.extend({},t), -e.options.enabled=t.enabled,e.options.relativePoints=[null],i.modifyCoords(e)}};r.snapSize=l,r.names.push("snapSize"),o.perAction.snapSize=l.defaults,s.defaults.snapSize=l.defaults,t.exports=l},{"../actions/resize":10,"../defaultOptions":18,"../utils/":44,"./index":24,"./snap":28}],30:[function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=e("../utils/pointerUtils");t.exports=function(){function e(t,n,o,s,a){if(r(this,e),i.pointerExtend(this,o),o!==n&&i.pointerExtend(this,n),this.interaction=a,this.timeStamp=(new Date).getTime(),this.originalEvent=o,this.type=t,this.pointerId=i.getPointerId(n),this.pointerType=i.getPointerType(n,a),this.target=s,this.currentTarget=null,"tap"===t){var l=a.getPointerIndex(n);this.dt=this.timeStamp-a.downTimes[l];var c=this.timeStamp-a.tapTime;this.double=!!(a.prevTap&&"doubletap"!==a.prevTap.type&&a.prevTap.target===this.target&&c<500)}else"doubletap"===t&&(this.dt=n.timeStamp-a.tapTime)}return e.prototype.subtractOrigin=function(e){var t=e.x,n=e.y;return this.pageX-=t,this.pageY-=n,this.clientX-=t,this.clientY-=n,this},e.prototype.addOrigin=function(e){var t=e.x,n=e.y;return this.pageX+=t,this.pageY+=n,this.clientX+=t,this.clientY+=n,this},e.prototype.preventDefault=function(){this.originalEvent.preventDefault()},e.prototype.stopPropagation=function(){this.propagationStopped=!0},e.prototype.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},e}()},{"../utils/pointerUtils":49}],31:[function(e,t,n){"use strict";function r(e){for(var t=e.interaction,n=e.pointer,s=e.event,l=e.eventTarget,c=e.type,u=void 0===c?e.pointerEvent.type:c,d=e.targets,f=void 0===d?i(e):d,v=e.pointerEvent,g=void 0===v?new o(u,n,s,l,t):v,h={interaction:t,pointer:n,event:s,eventTarget:l,targets:f,type:u,pointerEvent:g},m=0;m=u.length)break;g=u[v++]}else{if(v=u.next(),v.done)break;g=v.value}var h=g;c.element=h,p.fire("collect-targets",c)}return"hold"===o&&(c.targets=d(c.targets,function(e){return e.eventable.options.holdDuration===t.holdTimers[s].duration})),c.targets}var o=e("./PointerEvent"),s=e("../Interaction"),a=e("../utils"),l=e("../utils/browser"),c=e("../defaultOptions"),p=e("../utils/Signals").new(),u=e("../utils/arr"),d=u.filter,f=["down","up","cancel"],v=["down","up","cancel"],g={PointerEvent:o,fire:r,collectEventTargets:i,signals:p,defaults:{holdDuration:600,ignoreFrom:null,allowFrom:null,origin:{x:0,y:0}},types:["down","move","up","cancel","tap","doubletap","hold"]};s.signals.on("update-pointer-down",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers[n]={duration:1/0,timeout:null}}),s.signals.on("remove-pointer",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers.splice(n,1)}),s.signals.on("move",function(e){var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,s=e.duplicateMove,a=t.getPointerIndex(n);s||t.pointerIsDown&&!t.pointerWasMoved||(t.pointerIsDown&&clearTimeout(t.holdTimers[a].timeout),r({interaction:t,pointer:n,event:i,eventTarget:o,type:"move"}))}),s.signals.on("down",function(e){for(var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,s=e.pointerIndex,c=l.isIE8?a.extend({},i):i,u=t.holdTimers[s],d=a.getPath(o),f={interaction:t,pointer:n,event:i,eventTarget:o,type:"hold",targets:[],path:d,element:null},v=d,g=Array.isArray(v),h=0,v=g?v:v[Symbol.iterator]();;){var m;if(g){if(h>=v.length)break;m=v[h++]}else{if(h=v.next(),h.done)break;m=h.value}var y=m;f.element=y,p.fire("collect-targets",f)}if(f.targets.length){for(var x=1/0,b=0;b=0&&(p.selectors[u]!==e||p.contexts[u]!==t);u--);-1===u&&(u=p.selectors.length,p.selectors.push(e),p.contexts.push(t),p.listeners.push([])),p.listeners[u].push([i,!!s.capture,s.passive])}function s(e,t,n,r,o){var s=f(o),c=O[n],p=!1,u=void 0;if(c)for(u=c.selectors.length-1;u>=0;u--)if(c.selectors[u]===e&&c.contexts[u]===t){for(var d=c.listeners[u],v=d.length-1;v>=0;v--){var g=d[v],h=g[0],m=g[1],y=g[2];if(h===r&&m===!!s.capture&&y===s.passive){d.splice(v,1),d.length||(c.selectors.splice(u,1),c.contexts.splice(u,1),c.listeners.splice(u,1),i(t,n,a),i(t,n,l,!0),c.selectors.length||(O[n]=null)),p=!0;break}}if(p)break}}function a(e,t){var n=f(t),r={},i=O[e.type],o=g.getActualElement(e.path?e.path[0]:e.target),s=o;for(h(r,e),r.originalEvent=e,r.preventDefault=p;v.element(s);){for(var a=0;a=l.length)break;u=l[p++]}else{if(p=l.next(),p.done)break;u=p.value}var d=u,f=s[d](a);if(f)return f}},simulationResume:function(e){var t=e.mouseEvent,n=e.eventType,o=e.eventTarget;if(!/down|start/i.test(n))return null;for(var s=r.interactions,a=Array.isArray(s),l=0,s=a?s:s[Symbol.iterator]();;){var c;if(a){if(l>=s.length)break;c=s[l++]}else{if(l=s.next(),l.done)break;c=l.value}var p=c,u=o;if(p.simulation&&p.simulation.allowResume&&p.mouse===t)for(;u;){if(u===p.element)return p;u=i.parentNode(u)}}return null},mouse:function(e){var t=e.pointerId,n=e.mouseEvent,s=e.eventType;if(!n&&(o.supportsTouch||o.supportsPointerEvent))return null;for(var a=void 0,l=r.interactions,c=Array.isArray(l),p=0,l=c?l:l[Symbol.iterator]();;){var u;if(c){if(p>=l.length)break;u=l[p++]}else{if(p=l.next(),p.done)break;u=p.value}var d=u;if(d.mouse){if(d.simulation&&!i.contains(d.pointerIds,t))continue;if(d.interacting())return d;a||(a=d)}}if(a)return a;for(var f=r.interactions,v=Array.isArray(f),g=0,f=v?f:f[Symbol.iterator]();;){var h;if(v){if(g>=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}var m=h;if(m.mouse&&(!/down/.test(s)||!m.simulation))return m}return null},hasPointer:function(e){for(var t=e.pointerId,n=r.interactions,o=Array.isArray(n),s=0,n=o?n:n[Symbol.iterator]();;){var a;if(o){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var l=a;if(i.contains(l.pointerIds,t))return l}},idle:function(e){for(var t=e.mouseEvent,n=r.interactions,i=Array.isArray(n),o=0,n=i?n:n[Symbol.iterator]();;){var s;if(i){if(o>=n.length)break;s=n[o++]}else{if(o=n.next(),o.done)break;s=o.value}var a=s;if(1===a.pointerIds.length){var l=a.target;if(l&&!l.options.gesture.enabled)continue}else if(a.pointerIds.length>=2)continue;if(!a.interacting()&&t===a.mouse)return a}return null}};t.exports=s},{"../scope":34,"./browser":37,"./index":44}],46:[function(e,t,n){"use strict";var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},i=e("./window"),o=e("./isWindow"),s={array:function(){},window:function(e){return e===i.window||o(e)},docFrag:function(e){return s.object(e)&&11===e.nodeType},object:function(e){return!!e&&"object"===(void 0===e?"undefined":r(e))},function:function(e){return"function"==typeof e},number:function(e){return"number"==typeof e},bool:function(e){return"boolean"==typeof e},string:function(e){return"string"==typeof e},element:function(e){if(!e||"object"!==(void 0===e?"undefined":r(e)))return!1;var t=i.getWindow(e)||i.window;return/object|function/.test(r(t.Element))?e instanceof t.Element:1===e.nodeType&&"string"==typeof e.nodeName}};s.array=function(e){return s.object(e)&&void 0!==e.length&&s.function(e.splice)},t.exports=s},{"./isWindow":47,"./window":52}],47:[function(e,t,n){"use strict";t.exports=function(e){return!(!e||!e.Window)&&e instanceof e.Window}},{}],48:[function(e,t,n){"use strict";function r(e,n){for(var r in n){var i=t.exports.prefixedPropREs,o=!1;for(var s in i)if(0===r.indexOf(s)&&i[s].test(r)){o=!0;break}o||"function"==typeof n[r]||(e[r]=n[r])}return e}r.prefixedPropREs={webkit:/(Movement[XY]|Radius[XY]|RotationAngle|Force)$/},t.exports=r},{}],49:[function(e,t,n){"use strict";var r=e("./hypot"),i=e("./browser"),o=e("./domObjects"),s=e("./domUtils"),a=e("./is"),l=e("./pointerExtend"),c={copyCoords:function(e,t){e.page=e.page||{},e.page.x=t.page.x,e.page.y=t.page.y,e.client=e.client||{},e.client.x=t.client.x,e.client.y=t.client.y,e.timeStamp=t.timeStamp},setCoordDeltas:function(e,t,n){e.page.x=n.page.x-t.page.x,e.page.y=n.page.y-t.page.y,e.client.x=n.client.x-t.client.x,e.client.y=n.client.y-t.client.y,e.timeStamp=n.timeStamp-t.timeStamp;var i=Math.max(e.timeStamp/1e3,.001);e.page.speed=r(e.page.x,e.page.y)/i,e.page.vx=e.page.x/i,e.page.vy=e.page.y/i,e.client.speed=r(e.client.x,e.page.y)/i,e.client.vx=e.client.x/i,e.client.vy=e.client.y/i},isNativePointer:function(e){return e instanceof o.Event||e instanceof o.Touch},getXY:function(e,t,n){return n=n||{},e=e||"page",n.x=t[e+"X"],n.y=t[e+"Y"],n},getPageXY:function(e,t){return t=t||{},i.isOperaMobile&&c.isNativePointer(e)?(c.getXY("screen",e,t),t.x+=window.scrollX,t.y+=window.scrollY):c.getXY("page",e,t),t},getClientXY:function(e,t){return t=t||{},i.isOperaMobile&&c.isNativePointer(e)?c.getXY("screen",e,t):c.getXY("client",e,t),t},getPointerId:function(e){return a.number(e.pointerId)?e.pointerId:e.identifier},setCoords:function(e,t,n){var r=t.length>1?c.pointerAverage(t):t[0],i={};c.getPageXY(r,i),e.page.x=i.x,e.page.y=i.y,c.getClientXY(r,i),e.client.x=i.x,e.client.y=i.y,e.timeStamp=a.number(n)?n:(new Date).getTime()},pointerExtend:l,getTouchPair:function(e){var t=[];return a.array(e)?(t[0]=e[0],t[1]=e[1]):"touchend"===e.type?1===e.touches.length?(t[0]=e.touches[0],t[1]=e.changedTouches[0]):0===e.touches.length&&(t[0]=e.changedTouches[0],t[1]=e.changedTouches[1]):(t[0]=e.touches[0],t[1]=e.touches[1]),t},pointerAverage:function(e){for(var t={pageX:0,pageY:0,clientX:0,clientY:0,screenX:0,screenY:0},n=e,r=Array.isArray(n),i=0,n=r?n:n[Symbol.iterator]();;){var o;if(r){if(i>=n.length)break;o=n[i++]}else{if(i=n.next(),i.done)break;o=i.value}var s=o;for(var a in t)t[a]+=s[a]}for(var l in t)t[l]/=e.length;return t},touchBBox:function(e){if(e.length||e.touches&&e.touches.length>1){var t=c.getTouchPair(e),n=Math.min(t[0].pageX,t[1].pageX),r=Math.min(t[0].pageY,t[1].pageY);return{x:n,y:r,left:n,top:r,width:Math.max(t[0].pageX,t[1].pageX)-n,height:Math.max(t[0].pageY,t[1].pageY)-r}}},touchDistance:function(e,t){var n=t+"X",i=t+"Y",o=c.getTouchPair(e),s=o[0][n]-o[1][n],a=o[0][i]-o[1][i];return r(s,a)},touchAngle:function(e,t,n){var r=n+"X",i=n+"Y",o=c.getTouchPair(e),s=o[1][r]-o[0][r],a=o[1][i]-o[0][i];return 180*Math.atan2(a,s)/Math.PI},getPointerType:function(e,t){return t.mouse?"mouse":i.supportsPointerEvent?a.string(e.pointerType)?e.pointerType:[void 0,void 0,"touch","pen","mouse"][e.pointerType]:"touch"},getEventTargets:function(e){return[s.getActualElement(e.path?e.path[0]:e.target),s.getActualElement(e.currentTarget)]}};t.exports=c},{"./browser":37,"./domObjects":38,"./domUtils":39,"./hypot":43,"./is":46,"./pointerExtend":48}],50:[function(e,t,n){"use strict";for(var r=e("./window"),i=r.window,o=["ms","moz","webkit","o"],s=0,a=void 0,l=void 0,c=0;c6&&void 0!==arguments[6]&&arguments[6];r(this,e);var f=t.target,v=(f&&f.options||s).deltaSource,g=o(f,p,l),h="start"===c,m="end"===c,y=h?t.startCoords:t.curCoords,x=t.prevEvent;p=p||t.element;var b=i({},y.page),w=i({},y.client);b.x-=g.x,b.y-=g.y,w.x-=g.x,w.y-=g.y,this.ctrlKey=n.ctrlKey,this.altKey=n.altKey,this.shiftKey=n.shiftKey,this.metaKey=n.metaKey,this.button=n.button,this.buttons=n.buttons,this.target=p,this.currentTarget=p,this.relatedTarget=u||null,this.preEnd=d,this.type=l+(c||""),this.interaction=t,this.interactable=f,this.t0=h?t.downTimes[t.downTimes.length-1]:x.t0;var E={interaction:t,event:n,action:l,phase:c,element:p,related:u,page:b,client:w,coords:y,starting:h,ending:m,deltaSource:v,iEvent:this};a.fire("set-xy",E),m?(this.pageX=x.pageX,this.pageY=x.pageY,this.clientX=x.clientX,this.clientY=x.clientY):(this.pageX=b.x,this.pageY=b.y,this.clientX=w.x,this.clientY=w.y),this.x0=t.startCoords.page.x-g.x,this.y0=t.startCoords.page.y-g.y,this.clientX0=t.startCoords.client.x-g.x,this.clientY0=t.startCoords.client.y-g.y,a.fire("set-delta",E),this.timeStamp=y.timeStamp,this.dt=t.pointerDelta.timeStamp,this.duration=this.timeStamp-this.t0,this.speed=t.pointerDelta[v].speed,this.velocityX=t.pointerDelta[v].vx,this.velocityY=t.pointerDelta[v].vy,this.swipe=m||"inertiastart"===c?this.getSwipe():null,a.fire("new",E)}return e.prototype.getSwipe=function(){var e=this.interaction;if(e.prevEvent.speed<600||this.timeStamp-e.prevEvent.timeStamp>150)return null;var t=180*Math.atan2(e.prevEvent.velocityY,e.prevEvent.velocityX)/Math.PI;t<0&&(t+=360);var n=112.5<=t&&t<247.5,r=202.5<=t&&t<337.5,i=!n&&(292.5<=t||t<67.5);return{up:r,down:!r&&22.5<=t&&t<157.5,left:n,right:i,angle:t,speed:e.prevEvent.speed,velocity:{x:e.prevEvent.velocityX,y:e.prevEvent.velocityY}}},e.prototype.preventDefault=function(){},e.prototype.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},e.prototype.stopPropagation=function(){this.propagationStopped=!0},e}();a.on("set-delta",function(e){var t=e.iEvent,n=e.interaction,r=e.starting,i=e.deltaSource,o=r?t:n.prevEvent;"client"===i?(t.dx=t.clientX-o.clientX,t.dy=t.clientY-o.clientY):(t.dx=t.pageX-o.pageX,t.dy=t.pageY-o.pageY)}),l.signals=a,t.exports=l},{"./defaultOptions":18,"./utils/Signals":35,"./utils/extend":41,"./utils/getOriginXY":42}],4:[function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=e("./utils/is"),o=e("./utils/events"),s=e("./utils/extend"),a=e("./actions/base"),l=e("./scope"),c=e("./Eventable"),p=e("./defaultOptions"),u=e("./utils/Signals").new(),d=e("./utils/domUtils"),f=d.getElementRect,v=d.nodeContains,g=d.trySelector,h=e("./utils/window"),m=h.getWindow,y=e("./utils/arr"),x=y.indexOf,b=y.contains,w=e("./utils/browser"),E=w.wheelEvent;l.interactables=[];var S=function(){function e(t,n){r(this,e),n=n||{},this.target=t,this.events=new c,this._context=n.context||l.document,this._win=m(g(t)?this._context:t),this._doc=this._win.document,u.fire("new",{target:t,options:n,interactable:this,win:this._win}),l.addDocument(this._doc,this._win),l.interactables.push(this),this.set(n)}return e.prototype.setOnEvents=function(e,t){var n="on"+e;return i.function(t.onstart)&&(this.events[n+"start"]=t.onstart),i.function(t.onmove)&&(this.events[n+"move"]=t.onmove),i.function(t.onend)&&(this.events[n+"end"]=t.onend),i.function(t.oninertiastart)&&(this.events[n+"inertiastart"]=t.oninertiastart),this},e.prototype.setPerAction=function(e,t){for(var n in t)n in p[e]&&(i.object(t[n])?(this.options[e][n]=s(this.options[e][n]||{},t[n]),i.object(p.perAction[n])&&"enabled"in p.perAction[n]&&(this.options[e][n].enabled=!1!==t[n].enabled)):i.bool(t[n])&&i.object(p.perAction[n])?this.options[e][n].enabled=t[n]:void 0!==t[n]&&(this.options[e][n]=t[n]))},e.prototype.getRect=function(e){return e=e||this.target,i.string(this.target)&&!i.element(e)&&(e=this._context.querySelector(this.target)),f(e)},e.prototype.rectChecker=function(e){return i.function(e)?(this.getRect=e,this):null===e?(delete this.options.getRect,this):this.getRect},e.prototype._backCompatOption=function(e,t){if(g(t)||i.object(t)){this.options[e]=t;for(var n=a.names,r=Array.isArray(n),o=0,n=r?n:n[Symbol.iterator]();;){var s;if(r){if(o>=n.length)break;s=n[o++]}else{if(o=n.next(),o.done)break;s=o.value}var l=s;this.options[l][e]=t}return this}return this.options[e]},e.prototype.origin=function(e){return this._backCompatOption("origin",e)},e.prototype.deltaSource=function(e){return"page"===e||"client"===e?(this.options.deltaSource=e,this):this.options.deltaSource},e.prototype.context=function(){return this._context},e.prototype.inContext=function(e){return this._context===e.ownerDocument||v(this._context,e)},e.prototype.fire=function(e){return this.events.fire(e),this},e.prototype._onOffMultiple=function(e,t,n,r){if(i.string(t)&&-1!==t.search(" ")&&(t=t.trim().split(/ +/)),i.array(t)){for(var o=0;o=l.length)break;f=l[d++]}else{if(d=l.next(),d.done)break;f=d.value}var v=f;this.options[v]=p.base[v],v in t&&this[v](t[v])}return u.fire("set",{options:t,interactable:this}),this},e.prototype.unset=function(){if(o.remove(this.target,"all"),i.string(this.target))for(var e in o.delegatedEvents){var t=o.delegatedEvents[e];t.selectors[0]===this.target&&t.contexts[0]===this._context&&(t.selectors.splice(0,1),t.contexts.splice(0,1),t.listeners.splice(0,1),t.selectors.length||(t[e]=null)),o.remove(this._context,e,o.delegateListener),o.remove(this._context,e,o.delegateUseCapture,!0)}else o.remove(this,"all");u.fire("unset",{interactable:this}),l.interactables.splice(x(l.interactables,this),1);for(var n=l.interactions||[],r=Array.isArray(n),s=0,n=r?n:n[Symbol.iterator]();;){var a;if(r){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var c=a;c.target===this&&c.interacting()&&c.stop()}return l.interact},e}();l.interactables.indexOfElement=function(e,t){t=t||l.document;for(var n=0;n=x.length)break;E=x[w++]}else{if(w=x.next(),w.done)break;E=w.value}var S=E,T=S[0],C=S[1];C._updateEventTargets(i,o),C[e](T,t,i,o)}}}function o(e){for(var t=0;te.pointerMoveTolerance);var a={pointer:t,pointerIndex:this.getPointerIndex(t),event:n,eventTarget:r,dx:o,dy:s,duplicate:i,interaction:this,interactingBeforeMove:this.interacting()};i||l.setCoordDeltas(this.pointerDelta,this.prevCoords,this.curCoords),f.fire("move",a),i||(this.interacting()&&this.doMove(a),this.pointerWasMoved&&l.copyCoords(this.prevCoords,this.curCoords))},e.prototype.doMove=function(e){e=l.extend({pointer:this.pointers[0],event:this.prevEvent,eventTarget:this._eventTarget,interaction:this},e||{}),f.fire("before-action-move",e),this._dontFireMove||f.fire("action-move",e),this._dontFireMove=!1},e.prototype.pointerUp=function(e,t,n,r){var i=this.getPointerIndex(e);f.fire(/cancel$/i.test(t.type)?"cancel":"up",{pointer:e,pointerIndex:i,event:t,eventTarget:n,curEventTarget:r,interaction:this}),this.simulation||this.end(t),this.pointerIsDown=!1,this.removePointer(e,t)},e.prototype.end=function(e){e=e||this.prevEvent,this.interacting()&&f.fire("action-end",{event:e,interaction:this}),this.stop()},e.prototype.currentAction=function(){return this._interacting?this.prepared.name:null},e.prototype.interacting=function(){return this._interacting},e.prototype.stop=function(){f.fire("stop",{interaction:this}),this._interacting&&(f.fire("stop-active",{interaction:this}),f.fire("stop-"+this.prepared.name,{interaction:this})),this.target=this.element=null,this._interacting=!1,this.prepared.name=this.prevEvent=null},e.prototype.getPointerIndex=function(e){return"mouse"===this.pointerType||"pen"===this.pointerType?0:l.indexOf(this.pointerIds,l.getPointerId(e))},e.prototype.updatePointer=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:t&&/(down|start)$/i.test(t.type),r=l.getPointerId(e),i=this.getPointerIndex(e);return-1===i&&(i=this.pointerIds.length,this.pointerIds[i]=r),n&&f.fire("update-pointer-down",{pointer:e,event:t,down:n,pointerId:r,pointerIndex:i,interaction:this}),this.pointers[i]=e,i},e.prototype.removePointer=function(e,t){var n=this.getPointerIndex(e);-1!==n&&(f.fire("remove-pointer",{pointer:e,event:t,pointerIndex:n,interaction:this}),this.pointers.splice(n,1),this.pointerIds.splice(n,1),this.downTargets.splice(n,1),this.downTimes.splice(n,1))},e.prototype._updateEventTargets=function(e,t){this._eventTarget=e,this._curEventTarget=t},e}(),y=0,x=g.length;y=i.length)break;a=i[s++]}else{if(s=i.next(),s.done)break;a=s.value}var l=a;if(l.options.drop.enabled){var c=l.options.drop.accept;if(!(p.is.element(c)&&c!==t||p.is.string(c)&&!p.matchesSelector(t,c)))for(var d=p.is.string(l.target)?l._context.querySelectorAll(l.target):[l.target],f=0;fo.left&&c.xo.top&&c.y=o.left&&v<=o.right&&g>=o.top&&g<=o.bottom}if(f&&p.is.number(a)){s=Math.max(0,Math.min(o.right,f.right)-Math.max(o.left,f.left))*Math.max(0,Math.min(o.bottom,f.bottom)-Math.max(o.top,f.top))/(f.width*f.height)>=a}return this.options.drop.checker&&(s=this.options.drop.checker(e,t,s,this,i,n,r)),s},v.signals.on("unset",function(e){e.interactable.dropzone(!1)}),v.settingsMethods.push("dropChecker"),g.signals.on("new",function(e){e.dropTarget=null,e.dropElement=null,e.prevDropTarget=null,e.prevDropElement=null,e.dropEvents=null,e.activeDrops={dropzones:[],elements:[],rects:[]}}),g.signals.on("stop",function(e){var t=e.interaction;t.dropTarget=t.dropElement=t.prevDropTarget=t.prevDropElement=null}),d.dynamicDrop=function(e){return p.is.bool(e)?(y=e,d):y},p.merge(v.eventTypes,["dragenter","dragleave","dropactivate","dropdeactivate","dropmove","drop"]),c.methodDict.drop="dropzone",h.drop=m.defaults,t.exports=m},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../interact":21,"../scope":34,"../utils":44,"./base":6}],9:[function(e,t,n){"use strict";var r=e("./base"),i=e("../utils"),o=e("../InteractEvent"),s=e("../Interactable"),a=e("../Interaction"),l=e("../defaultOptions"),c={defaults:{enabled:!1,origin:null,restrict:null},checker:function(e,t,n,r,i){return i.pointerIds.length>=2?{name:"gesture"}:null},getCursor:function(){return""}};o.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;"gesturestart"===t.type&&(t.ds=0,n.gesture.startDistance=n.gesture.prevDistance=t.distance,n.gesture.startAngle=n.gesture.prevAngle=t.angle,n.gesture.scale=1)}),o.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;"gesturemove"===t.type&&(t.ds=t.scale-n.gesture.scale,n.target.fire(t),n.gesture.prevAngle=t.angle,n.gesture.prevDistance=t.distance,t.scale===1/0||null===t.scale||void 0===t.scale||isNaN(t.scale)||(n.gesture.scale=t.scale))}),s.prototype.gesturable=function(e){return i.is.object(e)?(this.options.gesture.enabled=!1!==e.enabled,this.setPerAction("gesture",e),this.setOnEvents("gesture",e),this):i.is.bool(e)?(this.options.gesture.enabled=e,e||(this.ongesturestart=this.ongesturestart=this.ongestureend=null),this):this.options.gesture},o.signals.on("set-delta",function(e){var t=e.interaction,n=e.iEvent,r=e.action,s=e.event,a=e.starting,l=e.ending,c=e.deltaSource;if("gesture"===r){var p=t.pointers;n.touches=[p[0],p[1]],a?(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=1,n.ds=0,n.angle=i.touchAngle(p,void 0,c),n.da=0):l||s instanceof o?(n.distance=t.prevEvent.distance,n.box=t.prevEvent.box,n.scale=t.prevEvent.scale,n.ds=n.scale-1,n.angle=t.prevEvent.angle,n.da=n.angle-t.gesture.startAngle):(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=n.distance/t.gesture.startDistance,n.angle=i.touchAngle(p,t.gesture.prevAngle,c),n.ds=n.scale-t.gesture.prevScale,n.da=n.angle-t.gesture.prevAngle)}}),a.signals.on("new",function(e){e.gesture={start:{x:0,y:0},startDistance:0,prevDistance:0,distance:0,scale:1,startAngle:0,prevAngle:0}}),r.gesture=c,r.names.push("gesture"),i.merge(s.eventTypes,["gesturestart","gesturemove","gestureend"]),r.methodDict.gesture="gesturable",l.gesture=c.defaults,t.exports=c},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"./base":6}],10:[function(e,t,n){"use strict";function r(e,t,n,r,i,s,a){if(!t)return!1;if(!0===t){var l=o.is.number(s.width)?s.width:s.right-s.left,c=o.is.number(s.height)?s.height:s.bottom-s.top;if(l<0&&("left"===e?e="right":"right"===e&&(e="left")),c<0&&("top"===e?e="bottom":"bottom"===e&&(e="top")),"left"===e)return n.x<(l>=0?s.left:s.right)+a;if("top"===e)return n.y<(c>=0?s.top:s.bottom)+a;if("right"===e)return n.x>(l>=0?s.right:s.left)-a;if("bottom"===e)return n.y>(c>=0?s.bottom:s.top)-a}return!!o.is.element(r)&&(o.is.element(t)?t===r:o.matchesUpTo(r,t,i))}var i=e("./base"),o=e("../utils"),s=e("../utils/browser"),a=e("../InteractEvent"),l=e("../Interactable"),c=e("../Interaction"),p=e("../defaultOptions"),u=s.supportsTouch||s.supportsPointerEvent?20:10,d={defaults:{enabled:!1,mouseButtons:null,origin:null,snap:null,restrict:null,inertia:null,autoScroll:null,square:!1,preserveAspectRatio:!1,axis:"xy",margin:NaN,edges:null,invert:"none"},checker:function(e,t,n,i,s,a){if(!a)return null;var l=o.extend({},s.curCoords.page),c=n.options;if(c.resize.enabled){var p=c.resize,d={left:!1,right:!1,top:!1,bottom:!1};if(o.is.object(p.edges)){for(var f in d)d[f]=r(f,p.edges[f],l,s._eventTarget,i,a,p.margin||u);if(d.left=d.left&&!d.right,d.top=d.top&&!d.bottom,d.left||d.right||d.top||d.bottom)return{name:"resize",edges:d}}else{var v="y"!==c.resize.axis&&l.x>a.right-u,g="x"!==c.resize.axis&&l.y>a.bottom-u;if(v||g)return{name:"resize",axes:(v?"x":"")+(g?"y":"")}}}return null},cursors:s.isIe9OrOlder?{x:"e-resize",y:"s-resize",xy:"se-resize",top:"n-resize",left:"w-resize",bottom:"s-resize",right:"e-resize",topleft:"se-resize",bottomright:"se-resize",topright:"ne-resize",bottomleft:"ne-resize"}:{x:"ew-resize",y:"ns-resize",xy:"nwse-resize",top:"ns-resize",left:"ew-resize",bottom:"ns-resize",right:"ew-resize",topleft:"nwse-resize",bottomright:"nwse-resize",topright:"nesw-resize",bottomleft:"nesw-resize"},getCursor:function(e){if(e.axis)return d.cursors[e.name+e.axis];if(e.edges){for(var t="",n=["top","bottom","left","right"],r=0;r<4;r++)e.edges[n[r]]&&(t+=n[r]);return d.cursors[t]}}};a.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;if("resizestart"===t.type&&n.prepared.edges){var r=n.target.getRect(n.element),i=n.target.options.resize;if(i.square||i.preserveAspectRatio){var s=o.extend({},n.prepared.edges);s.top=s.top||s.left&&!s.bottom,s.left=s.left||s.top&&!s.right,s.bottom=s.bottom||s.right&&!s.top,s.right=s.right||s.bottom&&!s.left,n.prepared._linkedEdges=s}else n.prepared._linkedEdges=null;i.preserveAspectRatio&&(n.resizeStartAspectRatio=r.width/r.height),n.resizeRects={start:r,current:o.extend({},r),inverted:o.extend({},r),previous:o.extend({},r),delta:{left:0,right:0,width:0,top:0,bottom:0,height:0}},t.rect=n.resizeRects.inverted,t.deltaRect=n.resizeRects.delta}}),a.signals.on("new",function(e){var t=e.iEvent,n=e.phase,r=e.interaction;if("move"===n&&r.prepared.edges){var i=r.target.options.resize,s=i.invert,a="reposition"===s||"negate"===s,l=r.prepared.edges,c=r.resizeRects.start,p=r.resizeRects.current,u=r.resizeRects.inverted,d=r.resizeRects.delta,f=o.extend(r.resizeRects.previous,u),v=l,g=t.dx,h=t.dy;if(i.preserveAspectRatio||i.square){var m=i.preserveAspectRatio?r.resizeStartAspectRatio:1;l=r.prepared._linkedEdges,v.left&&v.bottom||v.right&&v.top?h=-g/m:v.left||v.right?h=g/m:(v.top||v.bottom)&&(g=h*m)}if(l.top&&(p.top+=h),l.bottom&&(p.bottom+=h),l.left&&(p.left+=g),l.right&&(p.right+=g),a){if(o.extend(u,p),"reposition"===s){var y=void 0;u.top>u.bottom&&(y=u.top,u.top=u.bottom,u.bottom=y),u.left>u.right&&(y=u.left,u.left=u.right,u.right=y)}}else u.top=Math.min(p.top,c.bottom),u.bottom=Math.max(p.bottom,c.top),u.left=Math.min(p.left,c.right),u.right=Math.max(p.right,c.left);u.width=u.right-u.left,u.height=u.bottom-u.top;for(var x in u)d[x]=u[x]-f[x];t.edges=r.prepared.edges,t.rect=u,t.deltaRect=d}}),l.prototype.resizable=function(e){return o.is.object(e)?(this.options.resize.enabled=!1!==e.enabled,this.setPerAction("resize",e),this.setOnEvents("resize",e),/^x$|^y$|^xy$/.test(e.axis)?this.options.resize.axis=e.axis:null===e.axis&&(this.options.resize.axis=p.resize.axis),o.is.bool(e.preserveAspectRatio)?this.options.resize.preserveAspectRatio=e.preserveAspectRatio:o.is.bool(e.square)&&(this.options.resize.square=e.square),this):o.is.bool(e)?(this.options.resize.enabled=e, +e||(this.onresizestart=this.onresizestart=this.onresizeend=null),this):this.options.resize},c.signals.on("new",function(e){e.resizeAxes="xy"}),a.signals.on("set-delta",function(e){var t=e.interaction,n=e.iEvent;"resize"===e.action&&t.resizeAxes&&(t.target.options.resize.square?("y"===t.resizeAxes?n.dx=n.dy:n.dy=n.dx,n.axes="xy"):(n.axes=t.resizeAxes,"x"===t.resizeAxes?n.dy=0:"y"===t.resizeAxes&&(n.dx=0)))}),i.resize=d,i.names.push("resize"),o.merge(l.eventTypes,["resizestart","resizemove","resizeinertiastart","resizeinertiaresume","resizeend"]),i.methodDict.resize="resizable",p.resize=d.defaults,t.exports=d},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"../utils/browser":37,"./base":6}],11:[function(e,t,n){"use strict";var r=e("./utils/raf"),i=e("./utils/window").getWindow,o=e("./utils/is"),s=e("./utils/domUtils"),a=e("./Interaction"),l=e("./defaultOptions"),c={defaults:{enabled:!1,container:null,margin:60,speed:300},interaction:null,i:null,x:0,y:0,isScrolling:!1,prevTime:0,start:function(e){c.isScrolling=!0,r.cancel(c.i),c.interaction=e,c.prevTime=(new Date).getTime(),c.i=r.request(c.scroll)},stop:function(){c.isScrolling=!1,r.cancel(c.i)},scroll:function(){var e=c.interaction.target.options[c.interaction.prepared.name].autoScroll,t=e.container||i(c.interaction.element),n=(new Date).getTime(),s=(n-c.prevTime)/1e3,a=e.speed*s;a>=1&&(o.window(t)?t.scrollBy(c.x*a,c.y*a):t&&(t.scrollLeft+=c.x*a,t.scrollTop+=c.y*a),c.prevTime=n),c.isScrolling&&(r.cancel(c.i),c.i=r.request(c.scroll))},check:function(e,t){var n=e.options;return n[t].autoScroll&&n[t].autoScroll.enabled},onInteractionMove:function(e){var t=e.interaction,n=e.pointer;if(t.interacting()&&c.check(t.target,t.prepared.name)){if(t.simulation)return void(c.x=c.y=0);var r=void 0,a=void 0,l=void 0,p=void 0,u=t.target.options[t.prepared.name].autoScroll,d=u.container||i(t.element);if(o.window(d))p=n.clientXd.innerWidth-c.margin,l=n.clientY>d.innerHeight-c.margin;else{var f=s.getElementClientRect(d);p=n.clientXf.right-c.margin,l=n.clientY>f.bottom-c.margin}c.x=a?1:p?-1:0,c.y=l?1:r?-1:0,c.isScrolling||(c.margin=u.margin,c.speed=u.speed,c.start(t))}}};a.signals.on("stop-active",function(){c.stop()}),a.signals.on("action-move",c.onInteractionMove),l.perAction.autoScroll=c.defaults,t.exports=c},{"./Interaction":5,"./defaultOptions":18,"./utils/domUtils":39,"./utils/is":46,"./utils/raf":50,"./utils/window":52}],12:[function(e,t,n){"use strict";var r=e("../Interactable"),i=e("../actions/base"),o=e("../utils/is"),s=e("../utils/domUtils");r.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},r.prototype.ignoreFrom=function(e){return this._backCompatOption("ignoreFrom",e)},r.prototype.allowFrom=function(e){return this._backCompatOption("allowFrom",e)},r.prototype.testIgnore=function(e,t,n){return!(!e||!o.element(n))&&(o.string(e)?s.matchesUpTo(n,e,t):!!o.element(e)&&s.nodeContains(e,n))},r.prototype.testAllow=function(e,t,n){return!e||!!o.element(n)&&(o.string(e)?s.matchesUpTo(n,e,t):!!o.element(e)&&s.nodeContains(e,n))},r.prototype.testIgnoreAllow=function(e,t,n){return!this.testIgnore(e.ignoreFrom,t,n)&&this.testAllow(e.allowFrom,t,n)},r.prototype.actionChecker=function(e){return o.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},r.prototype.styleCursor=function(e){return o.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},r.prototype.defaultActionChecker=function(e,t,n,r){for(var o=this.getRect(r),s=null,a=i.names,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var u=p;if((!n.pointerIsDown||!n.mouse||0!=(t.buttons&this.options[u].mouseButtons))&&(s=i[u].checker(e,t,this,r,n,o)))return s}}},{"../Interactable":4,"../actions/base":6,"../utils/domUtils":39,"../utils/is":46}],13:[function(e,t,n){"use strict";function r(e,t,n,r){return g.is.object(e)&&t.testIgnoreAllow(t.options[e.name],n,r)&&t.options[e.name].enabled&&a(t,n,e)?e:null}function i(e,t,n,i,o,s){for(var a=0,l=i.length;a=m.maxInteractions)return!1;if(u.target===e){if((a+=d===n.name|0)>=i)return!1;if(u.element===t&&(l++,d!==n.name||l>=o))return!1}}}return m.maxInteractions>0}}var l=e("../interact"),c=e("../Interactable"),p=e("../Interaction"),u=e("../actions/base"),d=e("../defaultOptions"),f=e("../utils/browser"),v=e("../scope"),g=e("../utils"),h=e("../utils/Signals").new();e("./InteractableMethods");var m={signals:h,withinInteractionLimit:a,maxInteractions:1/0,defaults:{perAction:{manualStart:!1,max:1/0,maxPerElement:1,allowFrom:null,ignoreFrom:null}},setActionDefaults:function(e){g.extend(e.defaults,m.defaults.perAction)}};p.signals.on("down",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;if(!t.interacting()){s(t,o(t,n,r,i))}}),p.signals.on("move",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;if(t.mouse&&!t.pointerIsDown&&!t.interacting()){s(t,o(t,n,r,i))}}),p.signals.on("move",function(e){var t=e.interaction,n=e.event;if(t.pointerIsDown&&!t.interacting()&&t.pointerWasMoved&&t.prepared.name){h.fire("before-start",e);var r=t.target;t.prepared.name&&r&&(r.options[t.prepared.name].manualStart||!a(r,t.element,t.prepared)?t.stop(n):t.start(t.prepared,r,t.element))}}),p.signals.on("stop",function(e){var t=e.interaction,n=t.target;n&&n.options.styleCursor&&(n._doc.documentElement.style.cursor="")}),c.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},c.prototype.actionChecker=function(e){return g.is.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},c.prototype.styleCursor=function(e){return g.is.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},c.prototype.defaultActionChecker=function(e,t,n,r){for(var i=this.getRect(r),o=t.buttons||{0:1,1:4,3:8,4:16}[t.button],s=null,a=u.names,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var d=p;if((!n.pointerIsDown||!n.mouse||0!=(o&this.options[d].mouseButtons))&&(s=u[d].checker(e,t,this,r,n,i)))return s}},l.maxInteractions=function(e){return g.is.number(e)?(m.maxInteractions=e,this):m.maxInteractions},c.settingsMethods.push("styleCursor"),c.settingsMethods.push("actionChecker"),c.settingsMethods.push("ignoreFrom"),c.settingsMethods.push("allowFrom"),d.base.actionChecker=null,d.base.styleCursor=!0,g.extend(d.perAction,m.defaults.perAction),t.exports=m},{"../Interactable":4,"../Interaction":5,"../actions/base":6,"../defaultOptions":18,"../interact":21,"../scope":34,"../utils":44,"../utils/Signals":35,"../utils/browser":37,"./InteractableMethods":12}],14:[function(e,t,n){"use strict";var r=e("./base"),i=e("../Interaction");i.signals.on("new",function(e){e.delayTimer=null}),r.signals.on("prepared",function(e){var t=e.interaction,n=t.prepared.name;if(n){var r=t.target.options[n].delay;r>0&&(t.delayTimer=setTimeout(function(){t.start(t.prepared,t.target,t.element)},r))}}),i.signals.on("move",function(e){var t=e.interaction,n=e.duplicate;t.pointerWasMoved&&!n&&clearTimeout(t.delayTimer)}),r.signals.on("before-start",function(e){var t=e.interaction,n=t.prepared.name;if(n){t.target.options[n].delay>0&&(t.prepared.name=null)}})},{"../Interaction":5,"./base":13}],15:[function(e,t,n){"use strict";function r(e,t){if(!t)return!1;var n=t.options.drag.startAxis;return"xy"===e||"xy"===n||n===e}var i=e("./base"),o=e("../scope"),s=e("../utils/browser"),a=e("../utils/is"),l=e("../utils/domUtils"),c=l.matchesSelector,p=l.parentNode;i.setActionDefaults(e("../actions/drag")),i.signals.on("before-start",function(e){var t=e.interaction,n=e.eventTarget,l=e.dx,u=e.dy;if("drag"===t.prepared.name){var d=Math.abs(l),f=Math.abs(u),v=t.target.options.drag,g=v.startAxis,h=d>f?"x":dl.minSpeed&&g>l.endSpeed,b={interaction:t,pageCoords:v,statuses:f,preEnd:!0,requireEndOnly:!0};y&&!x&&(c.resetStatuses(f),m=c.setAll(b),m.shouldMove&&m.locked&&(h=!0)),(x||h)&&(p.copyCoords(i.upCoords,t.curCoords),t.pointers[0]=i.startEvent=new a(t,n,t.prepared.name,"inertiastart",t.element),i.t0=d,i.active=!0,i.allowResume=l.allowResume,t.simulation=i,o.fire(i.startEvent),x?(i.vx0=t.pointerDelta.client.vx,i.vy0=t.pointerDelta.client.vy,i.v0=g,r(t,i),p.extend(v,t.curCoords.page),v.x+=i.xe,v.y+=i.ye,c.resetStatuses(f),m=c.setAll(b),i.modifiedXe+=m.dx,i.modifiedYe+=m.dy,i.i=u.request(t.boundInertiaFrame)):(i.smoothEnd=!0,i.xe=m.dx,i.ye=m.dy,i.sx=i.sy=0,i.i=u.request(t.boundSmoothEndFrame)))}}),l.signals.on("stop-active",function(e){var t=e.interaction,n=t.inertiaStatus;n.active&&(u.cancel(n.i),n.active=!1,t.simulation=null)})},{"./InteractEvent":3,"./Interaction":5,"./modifiers":24,"./utils":44,"./utils/raf":50}],21:[function(e,t,n){"use strict";function r(e,t){var n=a.interactables.get(e,t);return n||(n=new l(e,t),n.events.global=p),n}var i=e("./utils/browser"),o=e("./utils/events"),s=e("./utils"),a=e("./scope"),l=e("./Interactable"),c=e("./Interaction"),p={};r.isSet=function(e,t){return-1!==a.interactables.indexOfElement(e,t&&t.context)},r.on=function(e,t,n){if(s.is.string(e)&&-1!==e.search(" ")&&(e=e.trim().split(/ +/)),s.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.on(f,t,n)}return r}if(s.is.object(e)){for(var v in e)r.on(v,e[v],t);return r}return s.contains(l.eventTypes,e)?p[e]?p[e].push(t):p[e]=[t]:o.add(a.document,e,t,{options:n}),r},r.off=function(e,t,n){if(s.is.string(e)&&-1!==e.search(" ")&&(e=e.trim().split(/ +/)),s.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.off(f,t,n)}return r}if(s.is.object(e)){for(var v in e)r.off(v,e[v],t);return r}if(s.contains(l.eventTypes,e)){var g=void 0;e in p&&-1!==(g=s.indexOf(p[e],t))&&p[e].splice(g,1)}else o.remove(a.document,e,t,n);return r},r.debug=function(){return a},r.getPointerAverage=s.pointerAverage,r.getTouchBBox=s.touchBBox,r.getTouchDistance=s.touchDistance,r.getTouchAngle=s.touchAngle,r.getElementRect=s.getElementRect,r.getElementClientRect=s.getElementClientRect,r.matchesSelector=s.matchesSelector,r.closest=s.closest,r.supportsTouch=function(){return i.supportsTouch},r.supportsPointerEvent=function(){return i.supportsPointerEvent},r.stop=function(e){for(var t=a.interactions.length-1;t>=0;t--)a.interactions[t].stop(e);return r},r.pointerMoveTolerance=function(e){return s.is.number(e)?(c.pointerMoveTolerance=e,this):c.pointerMoveTolerance},r.addDocument=a.addDocument,r.removeDocument=a.removeDocument,a.interact=r,t.exports=r},{"./Interactable":4,"./Interaction":5,"./scope":34,"./utils":44,"./utils/browser":37,"./utils/events":40}],22:[function(e,t,n){"use strict";function r(e){var t=e.interaction,n=e.event;t.target&&t.target.checkAndPreventDefault(n)}var i=e("./Interactable"),o=e("./Interaction"),s=e("./scope"),a=e("./utils/is"),l=e("./utils/events"),c=e("./utils/domUtils"),p=c.nodeContains,u=c.matchesSelector;i.prototype.preventDefault=function(e){return/^(always|never|auto)$/.test(e)?(this.options.preventDefault=e,this):a.bool(e)?(this.options.preventDefault=e?"always":"never",this):this.options.preventDefault},i.prototype.checkAndPreventDefault=function(e){var t=this.options.preventDefault;if("never"!==t)return"always"===t?void e.preventDefault():void(l.supportsOptions||/^(mouse|pointer|touch)*(down|start)/i.test(e.type)||a.element(e.target)&&u(e.target,"input,select,textarea,[contenteditable=true],[contenteditable=true] *")||e.preventDefault())};for(var d=["down","move","up","cancel"],f=0;f=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i;if(o.element&&(o.element===e.target||p(o.element,e.target)))return void o.target.checkAndPreventDefault(e)}}},{"./Interactable":4,"./Interaction":5,"./scope":34,"./utils/domUtils":39,"./utils/events":40,"./utils/is":46}],23:[function(e,t,n){"use strict";function r(e){var t=e.target,n=a.search(e,e.type,t);n&&n.prevTap&&e.clientX===n.prevTap.clientX&&e.clientY===n.prevTap.clientY&&t===n.prevTap.target&&(n.downTargets[0]=t,n.downTimes[0]=(new Date).getTime(),l.fire({interaction:n,event:e,eventTarget:t,pointer:e,type:"tap"}))}var i=e("./scope"),o=e("./utils/events"),s=e("./utils/browser"),a=e("./utils/interactionFinder"),l=e("./pointerEvents/base"),c=e("./utils/window"),p=c.window,u=Object.prototype.toString;if(p.Array.isArray||(p.Array.isArray=function(e){return"[object Array]"===u.call(e)}),String.prototype.trim||(String.prototype.trim=function(){return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")}),s.isIE8){var d=function(e){for(var t=i.interactions,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var o;if(n){if(r>=t.length)break;o=t[r++]}else{if(r=t.next(),r.done)break;o=r.value}var s=o;s.interacting()&&s.target.checkAndPreventDefault(e)}},f=function(e,t){var n=e.doc,i=(e.win,0===t.indexOf("listen")?o.add:o.remove);i(n,"selectstart",d),l&&i(n,"dblclick",r)};i.signals.on("add-document",f),i.signals.on("remove-document",f)}t.exports=null},{"./pointerEvents/base":31,"./scope":34,"./utils/browser":37,"./utils/events":40,"./utils/interactionFinder":45,"./utils/window":52}],24:[function(e,t,n){"use strict";function r(e,t,n){return e&&e.enabled&&(t||!e.endOnly)&&(!n||e.endOnly)}var i=e("../InteractEvent"),o=e("../Interaction"),s=e("../utils/extend"),a={names:[],setOffsets:function(e){var t=e.interaction,n=e.pageCoords,r=t.target,i=t.element,o=t.startOffset,s=r.getRect(i);s?(o.left=n.x-s.left,o.top=n.y-s.top,o.right=s.right-n.x,o.bottom=s.bottom-n.y,"width"in s||(s.width=s.right-s.left),"height"in s||(s.height=s.bottom-s.top)):o.left=o.top=o.right=o.bottom=0,e.rect=s,e.interactable=r,e.element=i;for(var l=0;l=p.length)break;f=p[d++]}else{if(d=p.next(),d.done)break;f=d.value}var v=f,g=a[v],h=t.target.options[t.prepared.name][v];r(h,i,o)&&(e.status=e.status=n[v],e.options=h,e.offset=e.interaction.modifierOffsets[v],g.set(e),e.status.locked&&(l.x+=e.status.dx,l.y+=e.status.dy,c.dx+=e.status.dx,c.dy+=e.status.dy,c.locked=!0))}return c.shouldMove=!e.status||!c.locked||e.status.changed,c},resetStatuses:function(e){for(var t=a.names,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var i;if(n){if(r>=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i,s=e[o]||{};s.dx=s.dy=0,s.modifiedX=s.modifiedY=NaN,s.locked=!1,s.changed=!0,e[o]=s}return e},start:function(e,t){var n=e.interaction,r={interaction:n,pageCoords:("action-resume"===t?n.curCoords:n.startCoords).page,startOffset:n.startOffset,statuses:n.modifierStatuses,preEnd:!1,requireEndOnly:!1};a.setOffsets(r),a.resetStatuses(r.statuses),r.pageCoords=s({},n.startCoords.page),n.modifierResult=a.setAll(r)}};o.signals.on("new",function(e){e.startOffset={left:0,right:0,top:0,bottom:0},e.modifierOffsets={},e.modifierStatuses=a.resetStatuses({}),e.modifierResult=null}),o.signals.on("action-start",a.start),o.signals.on("action-resume",a.start),o.signals.on("before-action-move",function(e){var t=e.interaction,n=e.preEnd,r=e.interactingBeforeMove,i=a.setAll({interaction:t,preEnd:n,pageCoords:t.curCoords.page,statuses:t.modifierStatuses,requireEndOnly:!1});!i.shouldMove&&r&&(t._dontFireMove=!0),t.modifierResult=i}),o.signals.on("action-end",function(e){for(var t=e.interaction,n=e.event,i=0;i=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}var m=h,y=m.x,x=m.y;l.push({x:s.left-i.width*y+u.x,y:s.top-i.height*x+u.y})}else l.push(u);return l},set:function(e){var t=e.interaction,n=e.pageCoords,r=e.status,i=e.options,s=e.offset,a=[],l=void 0,c=void 0,p=void 0;if(r.useStatusXY)c={x:r.x,y:r.y};else{var u=o.getOriginXY(t.target,t.element,t.prepared.name);c=o.extend({},n),c.x-=u.x,c.y-=u.y}r.realX=c.x,r.realY=c.y;for(var d=i.targets?i.targets.length:0,f=s,v=Array.isArray(f),g=0,f=v?f:f[Symbol.iterator]();;){var h;if(v){if(g>=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}for(var m=h,y=m.x,x=m.y,b=c.x-y,w=c.y-x,E=i.targets,S=Array.isArray(E),T=0,E=S?E:E[Symbol.iterator]();;){var C;if(S){if(T>=E.length)break;C=E[T++]}else{if(T=E.next(),T.done)break;C=T.value}var A=C;l=o.is.function(A)?A(b,w,t):A,l&&a.push({x:o.is.number(l.x)?l.x+y:b,y:o.is.number(l.y)?l.y+x:w,range:o.is.number(l.range)?l.range:i.range})}}var D={target:null,inRange:!1,distance:0,range:0,dx:0,dy:0};for(p=0,d=a.length;p=p.length)break;f=p[d++]}else{if(d=p.next(),d.done)break;f=d.value}var v=f,g=void 0;g=a.is.function(v)?v(l,c,t):v,g&&("width"in g&&"height"in g&&(g.x=g.width, +g.y=g.height),e.options.targets.push(g))}i.set(e)},modifyCoords:function(e){var t=e.options;e.options=a.extend({},t),e.options.enabled=t.enabled,e.options.relativePoints=[null],i.modifyCoords(e)}};r.snapSize=l,r.names.push("snapSize"),o.perAction.snapSize=l.defaults,s.defaults.snapSize=l.defaults,t.exports=l},{"../actions/resize":10,"../defaultOptions":18,"../utils/":44,"./index":24,"./snap":28}],30:[function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=e("../utils/pointerUtils");t.exports=function(){function e(t,n,o,s,a){if(r(this,e),i.pointerExtend(this,o),o!==n&&i.pointerExtend(this,n),this.interaction=a,this.timeStamp=(new Date).getTime(),this.originalEvent=o,this.type=t,this.pointerId=i.getPointerId(n),this.pointerType=i.getPointerType(n),this.target=s,this.currentTarget=null,"tap"===t){var l=a.getPointerIndex(n);this.dt=this.timeStamp-a.downTimes[l];var c=this.timeStamp-a.tapTime;this.double=!!(a.prevTap&&"doubletap"!==a.prevTap.type&&a.prevTap.target===this.target&&c<500)}else"doubletap"===t&&(this.dt=n.timeStamp-a.tapTime)}return e.prototype.subtractOrigin=function(e){var t=e.x,n=e.y;return this.pageX-=t,this.pageY-=n,this.clientX-=t,this.clientY-=n,this},e.prototype.addOrigin=function(e){var t=e.x,n=e.y;return this.pageX+=t,this.pageY+=n,this.clientX+=t,this.clientY+=n,this},e.prototype.preventDefault=function(){this.originalEvent.preventDefault()},e.prototype.stopPropagation=function(){this.propagationStopped=!0},e.prototype.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},e}()},{"../utils/pointerUtils":49}],31:[function(e,t,n){"use strict";function r(e){for(var t=e.interaction,n=e.pointer,s=e.event,l=e.eventTarget,c=e.type,u=void 0===c?e.pointerEvent.type:c,d=e.targets,f=void 0===d?i(e):d,v=e.pointerEvent,g=void 0===v?new o(u,n,s,l,t):v,h={interaction:t,pointer:n,event:s,eventTarget:l,targets:f,type:u,pointerEvent:g},m=0;m=u.length)break;g=u[v++]}else{if(v=u.next(),v.done)break;g=v.value}var h=g;c.element=h,p.fire("collect-targets",c)}return"hold"===o&&(c.targets=d(c.targets,function(e){return e.eventable.options.holdDuration===t.holdTimers[s].duration})),c.targets}var o=e("./PointerEvent"),s=e("../Interaction"),a=e("../utils"),l=e("../utils/browser"),c=e("../defaultOptions"),p=e("../utils/Signals").new(),u=e("../utils/arr"),d=u.filter,f=["down","up","cancel"],v=["down","up","cancel"],g={PointerEvent:o,fire:r,collectEventTargets:i,signals:p,defaults:{holdDuration:600,ignoreFrom:null,allowFrom:null,origin:{x:0,y:0}},types:["down","move","up","cancel","tap","doubletap","hold"]};s.signals.on("update-pointer-down",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers[n]={duration:1/0,timeout:null}}),s.signals.on("remove-pointer",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers.splice(n,1)}),s.signals.on("move",function(e){var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,s=e.duplicateMove,a=t.getPointerIndex(n);s||t.pointerIsDown&&!t.pointerWasMoved||(t.pointerIsDown&&clearTimeout(t.holdTimers[a].timeout),r({interaction:t,pointer:n,event:i,eventTarget:o,type:"move"}))}),s.signals.on("down",function(e){for(var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,s=e.pointerIndex,c=l.isIE8?a.extend({},i):i,u=t.holdTimers[s],d=a.getPath(o),f={interaction:t,pointer:n,event:i,eventTarget:o,type:"hold",targets:[],path:d,element:null},v=d,g=Array.isArray(v),h=0,v=g?v:v[Symbol.iterator]();;){var m;if(g){if(h>=v.length)break;m=v[h++]}else{if(h=v.next(),h.done)break;m=h.value}var y=m;f.element=y,p.fire("collect-targets",f)}if(f.targets.length){for(var x=1/0,b=0;b=0&&(p.selectors[u]!==e||p.contexts[u]!==t);u--);-1===u&&(u=p.selectors.length,p.selectors.push(e),p.contexts.push(t),p.listeners.push([])),p.listeners[u].push([i,!!s.capture,s.passive])}function s(e,t,n,r,o){var s=f(o),c=O[n],p=!1,u=void 0;if(c)for(u=c.selectors.length-1;u>=0;u--)if(c.selectors[u]===e&&c.contexts[u]===t){for(var d=c.listeners[u],v=d.length-1;v>=0;v--){var g=d[v],h=g[0],m=g[1],y=g[2];if(h===r&&m===!!s.capture&&y===s.passive){d.splice(v,1),d.length||(c.selectors.splice(u,1),c.contexts.splice(u,1),c.listeners.splice(u,1),i(t,n,a),i(t,n,l,!0),c.selectors.length||(O[n]=null)),p=!0;break}}if(p)break}}function a(e,t){var n=f(t),r={},i=O[e.type],o=g.getActualElement(e.path?e.path[0]:e.target),s=o;for(h(r,e),r.originalEvent=e,r.preventDefault=p;v.element(s);){for(var a=0;a=l.length)break;u=l[p++]}else{if(p=l.next(),p.done)break;u=p.value}var d=u,f=o[d](a);if(f)return f}},simulationResume:function(e){var t=e.pointerType,n=e.eventType,o=e.eventTarget;if(!/down|start/i.test(n))return null;for(var s=r.interactions,a=Array.isArray(s),l=0,s=a?s:s[Symbol.iterator]();;){var c;if(a){if(l>=s.length)break;c=s[l++]}else{if(l=s.next(),l.done)break;c=l.value}var p=c,u=o;if(p.simulation&&p.simulation.allowResume&&p.pointerType===t)for(;u;){if(u===p.element)return p;u=i.parentNode(u)}}return null},mouseOrPen:function(e){var t=e.pointerId,n=e.pointerType,o=e.eventType;if("mouse"!==n&&"pen"!==n)return null;for(var s=void 0,a=r.interactions,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var u=p;if(u.pointerType===n){if(u.simulation&&!i.contains(u.pointerIds,t))continue;if(u.interacting())return u;s||(s=u)}}if(s)return s;for(var d=r.interactions,f=Array.isArray(d),v=0,d=f?d:d[Symbol.iterator]();;){var g;if(f){if(v>=d.length)break;g=d[v++]}else{if(v=d.next(),v.done)break;g=v.value}var h=g;if(!(h.pointerType!==n||/down/i.test(o)&&h.simulation))return h}return null},hasPointer:function(e){for(var t=e.pointerId,n=r.interactions,o=Array.isArray(n),s=0,n=o?n:n[Symbol.iterator]();;){var a;if(o){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var l=a;if(i.contains(l.pointerIds,t))return l}},idle:function(e){for(var t=e.pointerType,n=r.interactions,i=Array.isArray(n),o=0,n=i?n:n[Symbol.iterator]();;){var s;if(i){if(o>=n.length)break;s=n[o++]}else{if(o=n.next(),o.done)break;s=o.value}var a=s;if(1===a.pointerIds.length){var l=a.target;if(l&&!l.options.gesture.enabled)continue}else if(a.pointerIds.length>=2)continue;if(!a.interacting()&&t===a.pointerType)return a}return null}};t.exports=o},{"../scope":34,"./index":44}],46:[function(e,t,n){"use strict";var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},i=e("./window"),o=e("./isWindow"),s={array:function(){},window:function(e){return e===i.window||o(e)},docFrag:function(e){return s.object(e)&&11===e.nodeType},object:function(e){return!!e&&"object"===(void 0===e?"undefined":r(e))},function:function(e){return"function"==typeof e},number:function(e){return"number"==typeof e},bool:function(e){return"boolean"==typeof e},string:function(e){return"string"==typeof e},element:function(e){if(!e||"object"!==(void 0===e?"undefined":r(e)))return!1;var t=i.getWindow(e)||i.window;return/object|function/.test(r(t.Element))?e instanceof t.Element:1===e.nodeType&&"string"==typeof e.nodeName}};s.array=function(e){return s.object(e)&&void 0!==e.length&&s.function(e.splice)},t.exports=s},{"./isWindow":47,"./window":52}],47:[function(e,t,n){"use strict";t.exports=function(e){return!(!e||!e.Window)&&e instanceof e.Window}},{}],48:[function(e,t,n){"use strict";function r(e,n){for(var r in n){var i=t.exports.prefixedPropREs,o=!1;for(var s in i)if(0===r.indexOf(s)&&i[s].test(r)){o=!0;break}o||"function"==typeof n[r]||(e[r]=n[r])}return e}r.prefixedPropREs={webkit:/(Movement[XY]|Radius[XY]|RotationAngle|Force)$/},t.exports=r},{}],49:[function(e,t,n){"use strict";var r=e("./hypot"),i=e("./browser"),o=e("./domObjects"),s=e("./domUtils"),a=e("./domObjects"),l=e("./is"),c=e("./pointerExtend"),p={copyCoords:function(e,t){e.page=e.page||{},e.page.x=t.page.x,e.page.y=t.page.y,e.client=e.client||{},e.client.x=t.client.x,e.client.y=t.client.y,e.timeStamp=t.timeStamp},setCoordDeltas:function(e,t,n){e.page.x=n.page.x-t.page.x,e.page.y=n.page.y-t.page.y,e.client.x=n.client.x-t.client.x,e.client.y=n.client.y-t.client.y,e.timeStamp=n.timeStamp-t.timeStamp;var i=Math.max(e.timeStamp/1e3,.001);e.page.speed=r(e.page.x,e.page.y)/i,e.page.vx=e.page.x/i,e.page.vy=e.page.y/i,e.client.speed=r(e.client.x,e.page.y)/i,e.client.vx=e.client.x/i,e.client.vy=e.client.y/i},isNativePointer:function(e){return e instanceof o.Event||e instanceof o.Touch},getXY:function(e,t,n){return n=n||{},e=e||"page",n.x=t[e+"X"],n.y=t[e+"Y"],n},getPageXY:function(e,t){return t=t||{},i.isOperaMobile&&p.isNativePointer(e)?(p.getXY("screen",e,t),t.x+=window.scrollX,t.y+=window.scrollY):p.getXY("page",e,t),t},getClientXY:function(e,t){return t=t||{},i.isOperaMobile&&p.isNativePointer(e)?p.getXY("screen",e,t):p.getXY("client",e,t),t},getPointerId:function(e){return l.number(e.pointerId)?e.pointerId:e.identifier},setCoords:function(e,t,n){var r=t.length>1?p.pointerAverage(t):t[0],i={};p.getPageXY(r,i),e.page.x=i.x,e.page.y=i.y,p.getClientXY(r,i),e.client.x=i.x,e.client.y=i.y,e.timeStamp=l.number(n)?n:(new Date).getTime()},pointerExtend:c,getTouchPair:function(e){var t=[];return l.array(e)?(t[0]=e[0],t[1]=e[1]):"touchend"===e.type?1===e.touches.length?(t[0]=e.touches[0],t[1]=e.changedTouches[0]):0===e.touches.length&&(t[0]=e.changedTouches[0],t[1]=e.changedTouches[1]):(t[0]=e.touches[0],t[1]=e.touches[1]),t},pointerAverage:function(e){for(var t={pageX:0,pageY:0,clientX:0,clientY:0,screenX:0,screenY:0},n=e,r=Array.isArray(n),i=0,n=r?n:n[Symbol.iterator]();;){var o;if(r){if(i>=n.length)break;o=n[i++]}else{if(i=n.next(),i.done)break;o=i.value}var s=o;for(var a in t)t[a]+=s[a]}for(var l in t)t[l]/=e.length;return t},touchBBox:function(e){if(e.length||e.touches&&e.touches.length>1){var t=p.getTouchPair(e),n=Math.min(t[0].pageX,t[1].pageX),r=Math.min(t[0].pageY,t[1].pageY);return{x:n,y:r,left:n,top:r,width:Math.max(t[0].pageX,t[1].pageX)-n,height:Math.max(t[0].pageY,t[1].pageY)-r}}},touchDistance:function(e,t){var n=t+"X",i=t+"Y",o=p.getTouchPair(e),s=o[0][n]-o[1][n],a=o[0][i]-o[1][i];return r(s,a)},touchAngle:function(e,t,n){var r=n+"X",i=n+"Y",o=p.getTouchPair(e),s=o[1][r]-o[0][r],a=o[1][i]-o[0][i];return 180*Math.atan2(a,s)/Math.PI},getPointerType:function(e){return l.string(e.pointerType)?e.pointerType:l.number(e.pointerType)?[void 0,void 0,"touch","pen","mouse"][e.pointerType]:/touch/.test(e.type)||e instanceof a.Touch?"touch":"mouse"},getEventTargets:function(e){return[s.getActualElement(e.path?e.path[0]:e.target),s.getActualElement(e.currentTarget)]}};t.exports=p},{"./browser":37,"./domObjects":38,"./domUtils":39,"./hypot":43,"./is":46,"./pointerExtend":48}],50:[function(e,t,n){"use strict";for(var r=e("./window"),i=r.window,o=["ms","moz","webkit","o"],s=0,a=void 0,l=void 0,c=0;c\n * Open source under the MIT License.\n * https://raw.github.com/taye/interact.js/master/LICENSE\n */\n","/*\n * In a (windowless) server environment this file exports a factory function\n * that takes the window to use.\n *\n * var interact = require('interact.js')(windowObject);\n *\n * See https://github.com/taye/interact.js/issues/187\n */\nif (typeof window === 'undefined') {\n module.exports = function (window) {\n require('./src/utils/window').init(window);\n\n return require('./src/index');\n };\n}\nelse {\n module.exports = require('./src/index');\n}\n","const { indexOf } = require('./utils/arr');\nconst extend = require('./utils/extend.js');\n\nfunction fireUntilImmediateStopped (event, listeners) {\n for (let i = 0, len = listeners.length; i < len && !event.immediatePropagationStopped; i++) {\n listeners[i](event);\n }\n}\n\nclass Eventable {\n\n constructor (options) {\n this.options = extend({}, options || {});\n }\n\n fire (event) {\n let listeners;\n const onEvent = 'on' + event.type;\n const global = this.global;\n\n // Interactable#on() listeners\n if ((listeners = this[event.type])) {\n fireUntilImmediateStopped(event, listeners);\n }\n\n // interactable.onevent listener\n if (this[onEvent]) {\n this[onEvent](event);\n }\n\n // interact.on() listeners\n if (!event.propagationStopped && global && (listeners = global[event.type])) {\n fireUntilImmediateStopped(event, listeners);\n }\n }\n\n on (eventType, listener) {\n // if this type of event was never bound\n if (this[eventType]) {\n this[eventType].push(listener);\n }\n else {\n this[eventType] = [listener];\n }\n }\n\n off (eventType, listener) {\n // if it is an action event type\n const eventList = this[eventType];\n const index = eventList? indexOf(eventList, listener) : -1;\n\n if (index !== -1) {\n eventList.splice(index, 1);\n }\n\n if (eventList && eventList.length === 0 || !listener) {\n this[eventType] = listener;\n }\n }\n}\n\nmodule.exports = Eventable;\n","const extend = require('./utils/extend');\nconst getOriginXY = require('./utils/getOriginXY');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nclass InteractEvent {\n constructor (interaction, event, action, phase, element, related, preEnd = false) {\n const target = interaction.target;\n const deltaSource = (target && target.options || defaults).deltaSource;\n const origin = getOriginXY(target, element, action);\n const starting = phase === 'start';\n const ending = phase === 'end';\n const coords = starting? interaction.startCoords : interaction.curCoords;\n const prevEvent = interaction.prevEvent;\n\n element = element || interaction.element;\n\n const page = extend({}, coords.page);\n const client = extend({}, coords.client);\n\n page.x -= origin.x;\n page.y -= origin.y;\n\n client.x -= origin.x;\n client.y -= origin.y;\n\n this.ctrlKey = event.ctrlKey;\n this.altKey = event.altKey;\n this.shiftKey = event.shiftKey;\n this.metaKey = event.metaKey;\n this.button = event.button;\n this.buttons = event.buttons;\n this.target = element;\n this.currentTarget = element;\n this.relatedTarget = related || null;\n this.preEnd = preEnd;\n this.type = action + (phase || '');\n this.interaction = interaction;\n this.interactable = target;\n\n this.t0 = starting ? interaction.downTimes[interaction.downTimes.length - 1]\n : prevEvent.t0;\n\n const signalArg = {\n interaction,\n event,\n action,\n phase,\n element,\n related,\n page,\n client,\n coords,\n starting,\n ending,\n deltaSource,\n iEvent: this,\n };\n\n signals.fire('set-xy', signalArg);\n\n if (ending) {\n // use previous coords when ending\n this.pageX = prevEvent.pageX;\n this.pageY = prevEvent.pageY;\n this.clientX = prevEvent.clientX;\n this.clientY = prevEvent.clientY;\n }\n else {\n this.pageX = page.x;\n this.pageY = page.y;\n this.clientX = client.x;\n this.clientY = client.y;\n }\n\n this.x0 = interaction.startCoords.page.x - origin.x;\n this.y0 = interaction.startCoords.page.y - origin.y;\n this.clientX0 = interaction.startCoords.client.x - origin.x;\n this.clientY0 = interaction.startCoords.client.y - origin.y;\n\n signals.fire('set-delta', signalArg);\n\n this.timeStamp = coords.timeStamp;\n this.dt = interaction.pointerDelta.timeStamp;\n this.duration = this.timeStamp - this.t0;\n\n // speed and velocity in pixels per second\n this.speed = interaction.pointerDelta[deltaSource].speed;\n this.velocityX = interaction.pointerDelta[deltaSource].vx;\n this.velocityY = interaction.pointerDelta[deltaSource].vy;\n\n this.swipe = (ending || phase === 'inertiastart')? this.getSwipe() : null;\n\n signals.fire('new', signalArg);\n }\n\n getSwipe () {\n const interaction = this.interaction;\n\n if (interaction.prevEvent.speed < 600\n || this.timeStamp - interaction.prevEvent.timeStamp > 150) {\n return null;\n }\n\n let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI;\n const overlap = 22.5;\n\n if (angle < 0) {\n angle += 360;\n }\n\n const left = 135 - overlap <= angle && angle < 225 + overlap;\n const up = 225 - overlap <= angle && angle < 315 + overlap;\n\n const right = !left && (315 - overlap <= angle || angle < 45 + overlap);\n const down = !up && 45 - overlap <= angle && angle < 135 + overlap;\n\n return {\n up,\n down,\n left,\n right,\n angle,\n speed: interaction.prevEvent.speed,\n velocity: {\n x: interaction.prevEvent.velocityX,\n y: interaction.prevEvent.velocityY,\n },\n };\n }\n\n preventDefault () {}\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n}\n\nsignals.on('set-delta', function ({ iEvent, interaction, starting, deltaSource }) {\n const prevEvent = starting? iEvent : interaction.prevEvent;\n\n if (deltaSource === 'client') {\n iEvent.dx = iEvent.clientX - prevEvent.clientX;\n iEvent.dy = iEvent.clientY - prevEvent.clientY;\n }\n else {\n iEvent.dx = iEvent.pageX - prevEvent.pageX;\n iEvent.dy = iEvent.pageY - prevEvent.pageY;\n }\n});\n\nInteractEvent.signals = signals;\n\nmodule.exports = InteractEvent;\n","const is = require('./utils/is');\nconst events = require('./utils/events');\nconst extend = require('./utils/extend');\nconst actions = require('./actions/base');\nconst scope = require('./scope');\nconst Eventable = require('./Eventable');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nconst {\n getElementRect,\n nodeContains,\n trySelector,\n} = require('./utils/domUtils');\nconst { getWindow } = require('./utils/window');\nconst { indexOf, contains } = require('./utils/arr');\nconst { wheelEvent } = require('./utils/browser');\n\n// all set interactables\nscope.interactables = [];\n\n/*\\\n * Interactable\n [ property ]\n **\n * Object type returned by @interact\n\\*/\nclass Interactable {\n constructor (target, options) {\n options = options || {};\n\n this.target = target;\n this.events = new Eventable();\n this._context = options.context || scope.document;\n this._win = getWindow(trySelector(target)? this._context : target);\n this._doc = this._win.document;\n\n signals.fire('new', {\n target,\n options,\n interactable: this,\n win: this._win,\n });\n\n scope.addDocument( this._doc, this._win );\n\n scope.interactables.push(this);\n\n this.set(options);\n }\n\n setOnEvents (action, phases) {\n const onAction = 'on' + action;\n\n if (is.function(phases.onstart) ) { this.events[onAction + 'start' ] = phases.onstart ; }\n if (is.function(phases.onmove) ) { this.events[onAction + 'move' ] = phases.onmove ; }\n if (is.function(phases.onend) ) { this.events[onAction + 'end' ] = phases.onend ; }\n if (is.function(phases.oninertiastart)) { this.events[onAction + 'inertiastart' ] = phases.oninertiastart ; }\n\n return this;\n }\n\n setPerAction (action, options) {\n // for all the default per-action options\n for (const option in options) {\n // if this option exists for this action\n if (option in defaults[action]) {\n // if the option in the options arg is an object value\n if (is.object(options[option])) {\n // duplicate the object\n this.options[action][option] = extend(this.options[action][option] || {}, options[option]);\n\n if (is.object(defaults.perAction[option]) && 'enabled' in defaults.perAction[option]) {\n this.options[action][option].enabled = options[option].enabled === false? false : true;\n }\n }\n else if (is.bool(options[option]) && is.object(defaults.perAction[option])) {\n this.options[action][option].enabled = options[option];\n }\n else if (options[option] !== undefined) {\n // or if it's not undefined, do a plain assignment\n this.options[action][option] = options[option];\n }\n }\n }\n }\n\n /*\\\n * Interactable.getRect\n [ method ]\n *\n * The default function to get an Interactables bounding rect. Can be\n * overridden using @Interactable.rectChecker.\n *\n - element (Element) #optional The element to measure.\n = (object) The object's bounding rectangle.\n o {\n o top : 0,\n o left : 0,\n o bottom: 0,\n o right : 0,\n o width : 0,\n o height: 0\n o }\n \\*/\n getRect (element) {\n element = element || this.target;\n\n if (is.string(this.target) && !(is.element(element))) {\n element = this._context.querySelector(this.target);\n }\n\n return getElementRect(element);\n }\n\n /*\\\n * Interactable.rectChecker\n [ method ]\n *\n * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n - checker (function) #optional A function which returns this Interactable's bounding rectangle. See @Interactable.getRect\n = (function | object) The checker function or this Interactable\n \\*/\n rectChecker (checker) {\n if (is.function(checker)) {\n this.getRect = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.getRect;\n\n return this;\n }\n\n return this.getRect;\n }\n\n _backCompatOption (optionName, newValue) {\n if (trySelector(newValue) || is.object(newValue)) {\n this.options[optionName] = newValue;\n\n for (const action of actions.names) {\n this.options[action][optionName] = newValue;\n }\n\n return this;\n }\n\n return this.options[optionName];\n }\n\n /*\\\n * Interactable.origin\n [ method ]\n *\n * Gets or sets the origin of the Interactable's element. The x and y\n * of the origin will be subtracted from action event coordinates.\n *\n - origin (object | string) #optional An object eg. { x: 0, y: 0 } or string 'parent', 'self' or any CSS selector\n * OR\n - origin (Element) #optional An HTML or SVG Element whose rect will be used\n **\n = (object) The current origin or this Interactable\n \\*/\n origin (newValue) {\n return this._backCompatOption('origin', newValue);\n }\n\n /*\\\n * Interactable.deltaSource\n [ method ]\n *\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n - newValue (string) #optional Use 'client' if you will be scrolling while interacting; Use 'page' if you want autoScroll to work\n = (string | object) The current deltaSource or this Interactable\n \\*/\n deltaSource (newValue) {\n if (newValue === 'page' || newValue === 'client') {\n this.options.deltaSource = newValue;\n\n return this;\n }\n\n return this.options.deltaSource;\n }\n\n /*\\\n * Interactable.context\n [ method ]\n *\n * Gets the selector context Node of the Interactable. The default is `window.document`.\n *\n = (Node) The context Node of this Interactable\n **\n \\*/\n context () {\n return this._context;\n }\n\n inContext (element) {\n return (this._context === element.ownerDocument\n || nodeContains(this._context, element));\n }\n\n /*\\\n * Interactable.fire\n [ method ]\n *\n * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n - iEvent (InteractEvent) The InteractEvent object to be fired on this Interactable\n = (Interactable) this Interactable\n \\*/\n fire (iEvent) {\n this.events.fire(iEvent);\n\n return this;\n }\n\n _onOffMultiple (method, eventType, listener, options) {\n if (is.string(eventType) && eventType.search(' ') !== -1) {\n eventType = eventType.trim().split(/ +/);\n }\n\n if (is.array(eventType)) {\n for (let i = 0; i < eventType.length; i++) {\n this[method](eventType[i], listener, options);\n }\n\n return true;\n }\n\n if (is.object(eventType)) {\n for (const prop in eventType) {\n this[method](prop, eventType[prop], listener);\n }\n\n return true;\n }\n }\n\n /*\\\n * Interactable.on\n [ method ]\n *\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n - eventType (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) This Interactable\n \\*/\n on (eventType, listener, options) {\n if (this._onOffMultiple('on', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.on(eventType, listener);\n }\n // delegated event for selector\n else if (is.string(this.target)) {\n events.addDelegate(this.target, this._context, eventType, listener, options);\n }\n else {\n events.add(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.off\n [ method ]\n *\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n - eventType (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) This Interactable\n \\*/\n off (eventType, listener, options) {\n if (this._onOffMultiple('off', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n // if it is an action event type\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.off(eventType, listener);\n }\n // delegated event\n else if (is.string(this.target)) {\n events.removeDelegate(this.target, this._context, eventType, listener, options);\n }\n // remove listener from this Interatable's element\n else {\n events.remove(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.set\n [ method ]\n *\n * Reset the options of this Interactable\n - options (object) The new settings to apply\n = (object) This Interactable\n \\*/\n set (options) {\n if (!is.object(options)) {\n options = {};\n }\n\n this.options = extend({}, defaults.base);\n\n const perActions = extend({}, defaults.perAction);\n\n for (const actionName in actions.methodDict) {\n const methodName = actions.methodDict[actionName];\n\n this.options[actionName] = extend({}, defaults[actionName]);\n\n this.setPerAction(actionName, perActions);\n\n this[methodName](options[actionName]);\n }\n\n for (const setting of Interactable.settingsMethods) {\n this.options[setting] = defaults.base[setting];\n\n if (setting in options) {\n this[setting](options[setting]);\n }\n }\n\n signals.fire('set', {\n options,\n interactable: this,\n });\n\n return this;\n }\n\n /*\\\n * Interactable.unset\n [ method ]\n *\n * Remove this interactable from the list of interactables and remove\n * it's action capabilities and event listeners\n *\n = (object) @interact\n \\*/\n unset () {\n events.remove(this.target, 'all');\n\n if (is.string(this.target)) {\n // remove delegated events\n for (const type in events.delegatedEvents) {\n const delegated = events.delegatedEvents[type];\n\n if (delegated.selectors[0] === this.target\n && delegated.contexts[0] === this._context) {\n\n delegated.selectors.splice(0, 1);\n delegated.contexts .splice(0, 1);\n delegated.listeners.splice(0, 1);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegated[type] = null;\n }\n }\n\n events.remove(this._context, type, events.delegateListener);\n events.remove(this._context, type, events.delegateUseCapture, true);\n }\n }\n else {\n events.remove(this, 'all');\n }\n\n signals.fire('unset', { interactable: this });\n\n scope.interactables.splice(indexOf(scope.interactables, this), 1);\n\n // Stop related interactions when an Interactable is unset\n for (const interaction of scope.interactions || []) {\n if (interaction.target === this && interaction.interacting()) {\n interaction.stop();\n }\n }\n\n return scope.interact;\n }\n}\n\nscope.interactables.indexOfElement = function indexOfElement (target, context) {\n context = context || scope.document;\n\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n if (interactable.target === target && interactable._context === context) {\n return i;\n }\n }\n return -1;\n};\n\nscope.interactables.get = function interactableGet (element, options, dontCheckInContext) {\n const ret = this[this.indexOfElement(element, options && options.context)];\n\n return ret && (is.string(element) || dontCheckInContext || ret.inContext(element))? ret : null;\n};\n\nscope.interactables.forEachSelector = function (callback, element) {\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n // skip non CSS selector targets and out of context elements\n if (!is.string(interactable.target)\n || (element && !interactable.inContext(element))) {\n continue;\n }\n\n const ret = callback(interactable, interactable.target, interactable._context, i, this);\n\n if (ret !== undefined) {\n return ret;\n }\n }\n};\n\n// all interact.js eventTypes\nInteractable.eventTypes = scope.eventTypes = [];\n\nInteractable.signals = signals;\n\nInteractable.settingsMethods = [ 'deltaSource', 'origin', 'preventDefault', 'rectChecker' ];\n\nmodule.exports = Interactable;\n","const scope = require('./scope');\nconst utils = require('./utils');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst finder = require('./utils/interactionFinder');\nconst signals = require('./utils/Signals').new();\n\nconst listeners = {};\nconst methodNames = [\n 'pointerDown', 'pointerMove', 'pointerUp',\n 'updatePointer', 'removePointer',\n];\n\n// for ignoring browser's simulated mouse events\nlet prevTouchTime = 0;\n\n// all active and idle interactions\nscope.interactions = [];\n\nclass Interaction {\n constructor () {\n this.target = null; // current interactable being interacted with\n this.element = null; // the target element of the interactable\n\n this.prepared = { // action that's ready to be fired on next move event\n name : null,\n axis : null,\n edges: null,\n };\n\n // keep track of added pointers\n this.pointers = [];\n this.pointerIds = [];\n this.downTargets = [];\n this.downTimes = [];\n\n // Previous native pointer move event coordinates\n this.prevCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n // current native pointer move event coordinates\n this.curCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Starting InteractEvent pointer coordinates\n this.startCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Change in coordinates and time of the pointer\n this.pointerDelta = {\n page : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n client : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n timeStamp: 0,\n };\n\n this.downEvent = null; // pointerdown/mousedown/touchstart event\n this.downPointer = {};\n\n this._eventTarget = null;\n this._curEventTarget = null;\n\n this.prevEvent = null; // previous action event\n\n this.pointerIsDown = false;\n this.pointerWasMoved = false;\n this._interacting = false;\n\n this.mouse = false;\n\n signals.fire('new', this);\n\n scope.interactions.push(this);\n }\n\n pointerDown (pointer, event, eventTarget) {\n const pointerIndex = this.updatePointer(pointer, event, true);\n\n signals.fire('down', {\n pointer,\n event,\n eventTarget,\n pointerIndex,\n interaction: this,\n });\n }\n\n /*\\\n * Interaction.start\n [ method ]\n *\n * Start an action with the given Interactable and Element as tartgets. The\n * action must be enabled for the target Interactable and an appropriate number\n * of pointers must be held down - 1 for drag/resize, 2 for gesture.\n *\n * Use it with `interactable.able({ manualStart: false })` to always\n * [start actions manually](https://github.com/taye/interact.js/issues/114)\n *\n - action (object) The action to be performed - drag, resize, etc.\n - target (Interactable) The Interactable to target\n - element (Element) The DOM Element to target\n = (object) interact\n **\n | interact(target)\n | .draggable({\n | // disable the default drag start by down->move\n | manualStart: true\n | })\n | // start dragging after the user holds the pointer down\n | .on('hold', function (event) {\n | var interaction = event.interaction;\n |\n | if (!interaction.interacting()) {\n | interaction.start({ name: 'drag' },\n | event.interactable,\n | event.currentTarget);\n | }\n | });\n \\*/\n start (action, target, element) {\n if (this.interacting()\n || !this.pointerIsDown\n || this.pointerIds.length < (action.name === 'gesture'? 2 : 1)) {\n return;\n }\n\n // if this interaction had been removed after stopping\n // add it back\n if (utils.indexOf(scope.interactions, this) === -1) {\n scope.interactions.push(this);\n }\n\n utils.copyAction(this.prepared, action);\n this.target = target;\n this.element = element;\n\n signals.fire('action-start', {\n interaction: this,\n event: this.downEvent,\n });\n }\n\n pointerMove (pointer, event, eventTarget) {\n if (!this.simulation) {\n this.updatePointer(pointer);\n utils.setCoords(this.curCoords, this.pointers);\n }\n\n const duplicateMove = (this.curCoords.page.x === this.prevCoords.page.x\n && this.curCoords.page.y === this.prevCoords.page.y\n && this.curCoords.client.x === this.prevCoords.client.x\n && this.curCoords.client.y === this.prevCoords.client.y);\n\n let dx;\n let dy;\n\n // register movement greater than pointerMoveTolerance\n if (this.pointerIsDown && !this.pointerWasMoved) {\n dx = this.curCoords.client.x - this.startCoords.client.x;\n dy = this.curCoords.client.y - this.startCoords.client.y;\n\n this.pointerWasMoved = utils.hypot(dx, dy) > Interaction.pointerMoveTolerance;\n }\n\n const signalArg = {\n pointer,\n pointerIndex: this.getPointerIndex(pointer),\n event,\n eventTarget,\n dx,\n dy,\n duplicate: duplicateMove,\n interaction: this,\n interactingBeforeMove: this.interacting(),\n };\n\n if (!duplicateMove) {\n // set pointer coordinate, time changes and speeds\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n }\n\n signals.fire('move', signalArg);\n\n if (!duplicateMove) {\n // if interacting, fire an 'action-move' signal etc\n if (this.interacting()) {\n this.doMove(signalArg);\n }\n\n if (this.pointerWasMoved) {\n utils.copyCoords(this.prevCoords, this.curCoords);\n }\n }\n }\n\n /*\\\n * Interaction.doMove\n [ method ]\n *\n * Force a move of the current action at the same coordinates. Useful if\n * snap/restrict has been changed and you want a movement with the new\n * settings.\n *\n **\n | interact(target)\n | .draggable(true)\n | .on('dragmove', function (event) {\n | if (someCondition) {\n | // change the snap settings\n | event.interactable.draggable({ snap: { targets: [] }});\n | // fire another move event with re-calculated snap\n | event.interaction.doMove();\n | }\n | });\n \\*/\n doMove (signalArg) {\n signalArg = utils.extend({\n pointer: this.pointers[0],\n event: this.prevEvent,\n eventTarget: this._eventTarget,\n interaction: this,\n }, signalArg || {});\n\n signals.fire('before-action-move', signalArg);\n\n if (!this._dontFireMove) {\n signals.fire('action-move', signalArg);\n }\n\n this._dontFireMove = false;\n }\n\n // End interact move events and stop auto-scroll unless simulation is running\n pointerUp (pointer, event, eventTarget, curEventTarget) {\n const pointerIndex = this.getPointerIndex(pointer);\n\n signals.fire(/cancel$/i.test(event.type)? 'cancel' : 'up', {\n pointer,\n pointerIndex,\n event,\n eventTarget,\n curEventTarget,\n interaction: this,\n });\n\n if (!this.simulation) {\n this.end(event);\n }\n\n this.pointerIsDown = false;\n this.removePointer(pointer, event);\n }\n\n /*\\\n * Interaction.end\n [ method ]\n *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n - event (PointerEvent) #optional\n **\n | interact(target)\n | .draggable(true)\n | .on('move', function (event) {\n | if (event.pageX > 1000) {\n | // end the current action\n | event.interaction.end();\n | // stop all further listeners from being called\n | event.stopImmediatePropagation();\n | }\n | });\n \\*/\n end (event) {\n event = event || this.prevEvent;\n\n if (this.interacting()) {\n signals.fire('action-end', {\n event,\n interaction: this,\n });\n }\n\n this.stop();\n }\n\n currentAction () {\n return this._interacting? this.prepared.name: null;\n }\n\n interacting () {\n return this._interacting;\n }\n\n stop () {\n signals.fire('stop', { interaction: this });\n\n if (this._interacting) {\n signals.fire('stop-active', { interaction: this });\n signals.fire('stop-' + this.prepared.name, { interaction: this });\n }\n\n this.target = this.element = null;\n\n this._interacting = false;\n this.prepared.name = this.prevEvent = null;\n }\n\n getPointerIndex (pointer) {\n return utils.indexOf(this.pointerIds, utils.getPointerId(pointer));\n }\n\n updatePointer (pointer, event, down = event && /(down|start)$/i.test(event.type)) {\n const id = utils.getPointerId(pointer);\n let index = this.getPointerIndex(pointer);\n\n if (index === -1) {\n index = this.pointerIds.length;\n this.pointerIds[index] = id;\n }\n\n if (down) {\n signals.fire('update-pointer-down', {\n pointer,\n event,\n down,\n pointerId: id,\n pointerIndex: index,\n interaction: this,\n });\n }\n\n this.pointers[index] = pointer;\n\n return index;\n }\n\n removePointer (pointer, event) {\n const id = utils.getPointerId(pointer);\n const index = this.mouse? 0 : utils.indexOf(this.pointerIds, id);\n\n if (index === -1) { return; }\n\n signals.fire('remove-pointer', {\n pointer,\n event,\n pointerIndex: index,\n interaction: this,\n });\n\n this.pointers .splice(index, 1);\n this.pointerIds .splice(index, 1);\n this.downTargets.splice(index, 1);\n this.downTimes .splice(index, 1);\n }\n\n _updateEventTargets (target, currentTarget) {\n this._eventTarget = target;\n this._curEventTarget = currentTarget;\n }\n}\n\nfor (let i = 0, len = methodNames.length; i < len; i++) {\n const method = methodNames[i];\n\n listeners[method] = doOnInteractions(method);\n}\n\nfunction doOnInteractions (method) {\n return (function (event) {\n const [eventTarget, curEventTarget] = utils.getEventTargets(event);\n const matches = []; // [ [pointer, interaction], ...]\n\n if (browser.supportsTouch && /touch/.test(event.type)) {\n prevTouchTime = new Date().getTime();\n\n for (let i = 0; i < event.changedTouches.length; i++) {\n const pointer = event.changedTouches[i];\n const interaction = finder.search(pointer, event.type, eventTarget);\n\n matches.push([pointer, interaction || new Interaction()]);\n }\n }\n else {\n let invalidPointer = false;\n\n if (!browser.supportsPointerEvent && /mouse/.test(event.type)) {\n // ignore mouse events while touch interactions are active\n for (let i = 0; i < scope.interactions.length && !invalidPointer; i++) {\n invalidPointer = !scope.interactions[i].mouse && scope.interactions[i].pointerIsDown;\n }\n\n // try to ignore mouse events that are simulated by the browser\n // after a touch event\n invalidPointer = invalidPointer\n || (new Date().getTime() - prevTouchTime < 500)\n // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated\n || event.timeStamp === 0;\n }\n\n if (!invalidPointer) {\n let interaction = finder.search(event, event.type, eventTarget);\n\n if (!interaction) {\n\n interaction = new Interaction();\n interaction.mouse = (/mouse/i.test(event.pointerType || event.type)\n // MSPointerEvent.MSPOINTER_TYPE_MOUSE\n || event.pointerType === 4\n || !event.pointerType);\n }\n\n matches.push([event, interaction]);\n }\n }\n\n for (const [pointer, interaction] of matches) {\n interaction._updateEventTargets(eventTarget, curEventTarget);\n interaction[method](pointer, event, eventTarget, curEventTarget);\n }\n });\n}\n\nfunction endAll (event) {\n for (let i = 0; i < scope.interactions.length; i++) {\n const interaction = scope.interactions[i];\n\n interaction.end(event);\n signals.fire('endall', { event, interaction });\n }\n}\n\nconst docEvents = { /* 'eventType': listenerFunc */ };\nconst pEventTypes = browser.pEventTypes;\n\nif (scope.PointerEvent) {\n docEvents[pEventTypes.down ] = listeners.pointerDown;\n docEvents[pEventTypes.move ] = listeners.pointerMove;\n docEvents[pEventTypes.up ] = listeners.pointerUp;\n docEvents[pEventTypes.cancel] = listeners.pointerUp;\n}\nelse {\n docEvents.mousedown = listeners.pointerDown;\n docEvents.mousemove = listeners.pointerMove;\n docEvents.mouseup = listeners.pointerUp;\n\n docEvents.touchstart = listeners.pointerDown;\n docEvents.touchmove = listeners.pointerMove;\n docEvents.touchend = listeners.pointerUp;\n docEvents.touchcancel = listeners.pointerUp;\n}\n\ndocEvents.blur = endAll;\n\nfunction onDocSignal ({ doc }, signalName) {\n const eventMethod = signalName.indexOf('add') === 0\n ? events.add : events.remove;\n\n // delegate event listener\n for (const eventType in scope.delegatedEvents) {\n eventMethod(doc, eventType, events.delegateListener);\n eventMethod(doc, eventType, events.delegateUseCapture, true);\n }\n\n for (const eventType in docEvents) {\n eventMethod(doc, eventType, docEvents[eventType]);\n }\n}\n\nsignals.on('update-pointer-down', ({ interaction, pointer, pointerId, pointerIndex, event, eventTarget, down }) => {\n interaction.pointerIds[pointerIndex] = pointerId;\n interaction.pointers[pointerIndex] = pointer;\n\n if (down) {\n interaction.pointerIsDown = true;\n }\n\n if (!interaction.interacting()) {\n utils.setCoords(interaction.startCoords, interaction.pointers);\n\n utils.copyCoords(interaction.curCoords , interaction.startCoords);\n utils.copyCoords(interaction.prevCoords, interaction.startCoords);\n\n interaction.downEvent = event;\n interaction.downTimes[pointerIndex] = interaction.curCoords.timeStamp;\n interaction.downTargets[pointerIndex] = eventTarget || event && utils.getEventTargets(event)[0];\n interaction.pointerWasMoved = false;\n\n utils.pointerExtend(interaction.downPointer, pointer);\n }\n});\n\nscope.signals.on('add-document' , onDocSignal);\nscope.signals.on('remove-document', onDocSignal);\n\nInteraction.pointerMoveTolerance = 1;\nInteraction.doOnInteractions = doOnInteractions;\nInteraction.endAll = endAll;\nInteraction.signals = signals;\nInteraction.docEvents = docEvents;\n\nscope.endAllInteractions = endAll;\n\nmodule.exports = Interaction;\n","const Interaction = require('../Interaction');\nconst InteractEvent = require('../InteractEvent');\n\nconst actions = {\n firePrepared,\n names: [],\n methodDict: {},\n};\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n interaction._interacting = true;\n firePrepared(interaction, event, 'start');\n});\n\nInteraction.signals.on('action-move', function ({ interaction, event, preEnd }) {\n firePrepared(interaction, event, 'move', preEnd);\n\n // if the action was ended in a listener\n if (!interaction.interacting()) { return false; }\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n firePrepared(interaction, event, 'end');\n});\n\nfunction firePrepared (interaction, event, phase, preEnd) {\n const actionName = interaction.prepared.name;\n\n const newEvent = new InteractEvent(interaction, event, actionName, phase, interaction.element, null, preEnd);\n\n interaction.target.fire(newEvent);\n interaction.prevEvent = newEvent;\n}\n\nmodule.exports = actions;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drag = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n startAxis : 'xy',\n lockAxis : 'xy',\n },\n\n checker: function (pointer, event, interactable) {\n const dragOptions = interactable.options.drag;\n\n return dragOptions.enabled\n ? { name: 'drag', axis: (dragOptions.lockAxis === 'start'\n ? dragOptions.startAxis\n : dragOptions.lockAxis)}\n : null;\n },\n\n getCursor: function () {\n return 'move';\n },\n};\n\nInteraction.signals.on('before-action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n interaction.curCoords.page.y = interaction.startCoords.page.y;\n interaction.curCoords.client.y = interaction.startCoords.client.y;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vx);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vx);\n interaction.pointerDelta.client.vy = 0;\n interaction.pointerDelta.page.vy = 0;\n }\n else if (axis === 'y') {\n interaction.curCoords.page.x = interaction.startCoords.page.x;\n interaction.curCoords.client.x = interaction.startCoords.client.x;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vy);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vy);\n interaction.pointerDelta.client.vx = 0;\n interaction.pointerDelta.page.vx = 0;\n }\n});\n\n// dragmove\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'dragmove') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n iEvent.pageY = interaction.startCoords.page.y;\n iEvent.clientY = interaction.startCoords.client.y;\n iEvent.dy = 0;\n }\n else if (axis === 'y') {\n iEvent.pageX = interaction.startCoords.page.x;\n iEvent.clientX = interaction.startCoords.client.x;\n iEvent.dx = 0;\n }\n});\n\n/*\\\n * Interactable.draggable\n [ method ]\n *\n * Gets or sets whether drag actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of drag events\n | var isDraggable = interact('ul li').draggable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on drag events (object makes the Interactable draggable)\n = (object) This Interactable\n | interact(element).draggable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // the axis in which the first movement must be\n | // for the drag sequence to start\n | // 'xy' by default - any direction\n | startAxis: 'x' || 'y' || 'xy',\n |\n | // 'xy' by default - don't restrict to one axis (move in any direction)\n | // 'x' or 'y' to restrict movement to either axis\n | // 'start' to restrict movement to the axis the drag started in\n | lockAxis: 'x' || 'y' || 'xy' || 'start',\n |\n | // max number of drags that can happen concurrently\n | // with elements of this Interactable. Infinity by default\n | max: Infinity,\n |\n | // max number of drags that can target the same element+Interactable\n | // 1 by default\n | maxPerElement: 2\n | });\n\\*/\nInteractable.prototype.draggable = function (options) {\n if (utils.is.object(options)) {\n this.options.drag.enabled = options.enabled === false? false: true;\n this.setPerAction('drag', options);\n this.setOnEvents('drag', options);\n\n if (/^(xy|x|y|start)$/.test(options.lockAxis)) {\n this.options.drag.lockAxis = options.lockAxis;\n }\n if (/^(xy|x|y)$/.test(options.startAxis)) {\n this.options.drag.startAxis = options.startAxis;\n }\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drag.enabled = options;\n\n if (!options) {\n this.ondragstart = this.ondragstart = this.ondragend = null;\n }\n\n return this;\n }\n\n return this.options.drag;\n};\n\nactions.drag = drag;\nactions.names.push('drag');\nutils.merge(Interactable.eventTypes, [\n 'dragstart',\n 'dragmove',\n 'draginertiastart',\n 'draginertiaresume',\n 'dragend',\n]);\nactions.methodDict.drag = 'draggable';\n\ndefaultOptions.drag = drag.defaults;\n\nmodule.exports = drag;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst scope = require('../scope');\nconst interact = require('../interact');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drop = {\n defaults: {\n enabled: false,\n accept : null,\n overlap: 'pointer',\n },\n};\n\nlet dynamicDrop = false;\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // reset active dropzones\n interaction.activeDrops.dropzones = [];\n interaction.activeDrops.elements = [];\n interaction.activeDrops.rects = [];\n\n interaction.dropEvents = null;\n\n if (!interaction.dynamicDrop) {\n setActiveDrops(interaction, interaction.element);\n }\n\n const dragEvent = interaction.prevEvent;\n const dropEvents = getDropEvents(interaction, event, dragEvent);\n\n if (dropEvents.activate) {\n fireActiveDrops(interaction, dropEvents.activate);\n }\n});\n\nInteractEvent.signals.on('new', function ({ interaction, iEvent, event }) {\n if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { return; }\n\n const draggableElement = interaction.element;\n const dragEvent = iEvent;\n const dropResult = getDrop(dragEvent, event, draggableElement);\n\n interaction.dropTarget = dropResult.dropzone;\n interaction.dropElement = dropResult.element;\n\n interaction.dropEvents = getDropEvents(interaction, event, dragEvent);\n});\n\nInteraction.signals.on('action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n fireDropEvents(interaction, interaction.dropEvents);\n});\n\nInteraction.signals.on('action-end', function ({ interaction }) {\n if (interaction.prepared.name === 'drag') {\n fireDropEvents(interaction, interaction.dropEvents);\n }\n});\n\nInteraction.signals.on('stop-drag', function ({ interaction }) {\n interaction.activeDrops.dropzones =\n interaction.activeDrops.elements =\n interaction.activeDrops.rects =\n interaction.dropEvents = null;\n});\n\nfunction collectDrops (interaction, element) {\n const drops = [];\n const elements = [];\n\n element = element || interaction.element;\n\n // collect all dropzones and their elements which qualify for a drop\n for (const current of scope.interactables) {\n if (!current.options.drop.enabled) { continue; }\n\n const accept = current.options.drop.accept;\n\n // test the draggable element against the dropzone's accept setting\n if ((utils.is.element(accept) && accept !== element)\n || (utils.is.string(accept)\n && !utils.matchesSelector(element, accept))) {\n\n continue;\n }\n\n // query for new elements if necessary\n const dropElements = utils.is.string(current.target)\n ? current._context.querySelectorAll(current.target)\n : [current.target];\n\n for (let i = 0; i < dropElements.length; i++) {\n const currentElement = dropElements[i];\n\n if (currentElement !== element) {\n drops.push(current);\n elements.push(currentElement);\n }\n }\n }\n\n return {\n elements,\n dropzones: drops,\n };\n}\n\nfunction fireActiveDrops (interaction, event) {\n let prevElement;\n\n // loop through all active dropzones and trigger event\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n const current = interaction.activeDrops.dropzones[i];\n const currentElement = interaction.activeDrops.elements [i];\n\n // prevent trigger of duplicate events on same element\n if (currentElement !== prevElement) {\n // set current element as event target\n event.target = currentElement;\n current.fire(event);\n }\n prevElement = currentElement;\n }\n}\n\n// Collect a new set of possible drops and save them in activeDrops.\n// setActiveDrops should always be called when a drag has just started or a\n// drag event happens while dynamicDrop is true\nfunction setActiveDrops (interaction, dragElement) {\n // get dropzones and their elements that could receive the draggable\n const possibleDrops = collectDrops(interaction, dragElement, true);\n\n interaction.activeDrops.dropzones = possibleDrops.dropzones;\n interaction.activeDrops.elements = possibleDrops.elements;\n interaction.activeDrops.rects = [];\n\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n interaction.activeDrops.rects[i] =\n interaction.activeDrops.dropzones[i].getRect(interaction.activeDrops.elements[i]);\n }\n}\n\nfunction getDrop (dragEvent, event, dragElement) {\n const interaction = dragEvent.interaction;\n const validDrops = [];\n\n if (dynamicDrop) {\n setActiveDrops(interaction, dragElement);\n }\n\n // collect all dropzones and their elements which qualify for a drop\n for (let j = 0; j < interaction.activeDrops.dropzones.length; j++) {\n const current = interaction.activeDrops.dropzones[j];\n const currentElement = interaction.activeDrops.elements [j];\n const rect = interaction.activeDrops.rects [j];\n\n validDrops.push(current.dropCheck(dragEvent, event, interaction.target, dragElement, currentElement, rect)\n ? currentElement\n : null);\n }\n\n // get the most appropriate dropzone based on DOM depth and order\n const dropIndex = utils.indexOfDeepestElement(validDrops);\n\n return {\n dropzone: interaction.activeDrops.dropzones[dropIndex] || null,\n element : interaction.activeDrops.elements [dropIndex] || null,\n };\n}\n\nfunction getDropEvents (interaction, pointerEvent, dragEvent) {\n const dropEvents = {\n enter : null,\n leave : null,\n activate : null,\n deactivate: null,\n move : null,\n drop : null,\n };\n\n const tmpl = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n };\n\n if (interaction.dropElement !== interaction.prevDropElement) {\n // if there was a prevDropTarget, create a dragleave event\n if (interaction.prevDropTarget) {\n dropEvents.leave = utils.extend({ type: 'dragleave' }, tmpl);\n\n dragEvent.dragLeave = dropEvents.leave.target = interaction.prevDropElement;\n dragEvent.prevDropzone = dropEvents.leave.dropzone = interaction.prevDropTarget;\n }\n // if the dropTarget is not null, create a dragenter event\n if (interaction.dropTarget) {\n dropEvents.enter = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n type : 'dragenter',\n };\n\n dragEvent.dragEnter = interaction.dropElement;\n dragEvent.dropzone = interaction.dropTarget;\n }\n }\n\n if (dragEvent.type === 'dragend' && interaction.dropTarget) {\n dropEvents.drop = utils.extend({ type: 'drop' }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n dragEvent.relatedTarget = interaction.dropElement;\n }\n if (dragEvent.type === 'dragstart') {\n dropEvents.activate = utils.extend({ type: 'dropactivate' }, tmpl);\n\n dropEvents.activate.target = null;\n dropEvents.activate.dropzone = null;\n }\n if (dragEvent.type === 'dragend') {\n dropEvents.deactivate = utils.extend({ type: 'dropdeactivate' }, tmpl);\n\n dropEvents.deactivate.target = null;\n dropEvents.deactivate.dropzone = null;\n }\n if (dragEvent.type === 'dragmove' && interaction.dropTarget) {\n dropEvents.move = utils.extend({\n dragmove : dragEvent,\n type : 'dropmove',\n }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n }\n\n return dropEvents;\n}\n\nfunction fireDropEvents (interaction, dropEvents) {\n if (dropEvents.leave) { interaction.prevDropTarget.fire(dropEvents.leave); }\n if (dropEvents.move ) { interaction.dropTarget.fire(dropEvents.move ); }\n if (dropEvents.enter) { interaction.dropTarget.fire(dropEvents.enter); }\n if (dropEvents.drop ) { interaction.dropTarget.fire(dropEvents.drop ); }\n if (dropEvents.deactivate) {\n fireActiveDrops(interaction, dropEvents.deactivate);\n }\n\n interaction.prevDropTarget = interaction.dropTarget;\n interaction.prevDropElement = interaction.dropElement;\n}\n\n/*\\\n * Interactable.dropzone\n [ method ]\n *\n * Returns or sets whether elements can be dropped onto this\n * Interactable to trigger drop events\n *\n * Dropzones can receive the following events:\n * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends\n * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone\n * - `dragmove` when a draggable that has entered the dropzone is moved\n * - `drop` when a draggable is dropped into this dropzone\n *\n * Use the `accept` option to allow only elements that match the given CSS\n * selector or element. The value can be:\n *\n * - **an Element** - only that element can be dropped into this dropzone.\n * - **a string**, - the element being dragged must match it as a CSS selector.\n * - **`null`** - accept options is cleared - it accepts any element.\n *\n * Use the `overlap` option to set how drops are checked for. The allowed\n * values are:\n *\n * - `'pointer'`, the pointer must be over the dropzone (default)\n * - `'center'`, the draggable element's center must be over the dropzone\n * - a number from 0-1 which is the `(intersection area) / (draggable area)`.\n * e.g. `0.5` for drop to happen when half of the area of the draggable is\n * over the dropzone\n *\n * Use the `checker` option to specify a function to check if a dragged\n * element is over this Interactable.\n *\n | interact(target)\n | .dropChecker(function(dragEvent, // related dragmove or dragend event\n | event, // TouchEvent/PointerEvent/MouseEvent\n | dropped, // bool result of the default checker\n | dropzone, // dropzone Interactable\n | dropElement, // dropzone elemnt\n | draggable, // draggable Interactable\n | draggableElement) {// draggable element\n |\n | return dropped && event.target.hasAttribute('allow-drop');\n | }\n *\n *\n - options (boolean | object | null) #optional The new value to be set.\n | interact('.drop').dropzone({\n | accept: '.can-drop' || document.getElementById('single-drop'),\n | overlap: 'pointer' || 'center' || zeroToOne\n | }\n = (boolean | object) The current setting or this Interactable\n\\*/\nInteractable.prototype.dropzone = function (options) {\n if (utils.is.object(options)) {\n this.options.drop.enabled = options.enabled === false? false: true;\n\n if (utils.is.function(options.ondrop) ) { this.events.ondrop = options.ondrop ; }\n if (utils.is.function(options.ondropactivate) ) { this.events.ondropactivate = options.ondropactivate ; }\n if (utils.is.function(options.ondropdeactivate)) { this.events.ondropdeactivate = options.ondropdeactivate; }\n if (utils.is.function(options.ondragenter) ) { this.events.ondragenter = options.ondragenter ; }\n if (utils.is.function(options.ondragleave) ) { this.events.ondragleave = options.ondragleave ; }\n if (utils.is.function(options.ondropmove) ) { this.events.ondropmove = options.ondropmove ; }\n\n if (/^(pointer|center)$/.test(options.overlap)) {\n this.options.drop.overlap = options.overlap;\n }\n else if (utils.is.number(options.overlap)) {\n this.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0);\n }\n if ('accept' in options) {\n this.options.drop.accept = options.accept;\n }\n if ('checker' in options) {\n this.options.drop.checker = options.checker;\n }\n\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drop.enabled = options;\n\n if (!options) {\n this.ondragenter = this.ondragleave = this.ondrop\n = this.ondropactivate = this.ondropdeactivate = null;\n }\n\n return this;\n }\n\n return this.options.drop;\n};\n\nInteractable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) {\n let dropped = false;\n\n // if the dropzone has no rect (eg. display: none)\n // call the custom dropChecker or just return false\n if (!(rect = rect || this.getRect(dropElement))) {\n return (this.options.drop.checker\n ? this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement)\n : false);\n }\n\n const dropOverlap = this.options.drop.overlap;\n\n if (dropOverlap === 'pointer') {\n const origin = utils.getOriginXY(draggable, draggableElement, 'drag');\n const page = utils.getPageXY(dragEvent);\n\n page.x += origin.x;\n page.y += origin.y;\n\n const horizontal = (page.x > rect.left) && (page.x < rect.right);\n const vertical = (page.y > rect.top ) && (page.y < rect.bottom);\n\n dropped = horizontal && vertical;\n }\n\n const dragRect = draggable.getRect(draggableElement);\n\n if (dragRect && dropOverlap === 'center') {\n const cx = dragRect.left + dragRect.width / 2;\n const cy = dragRect.top + dragRect.height / 2;\n\n dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom;\n }\n\n if (dragRect && utils.is.number(dropOverlap)) {\n const overlapArea = (Math.max(0, Math.min(rect.right , dragRect.right ) - Math.max(rect.left, dragRect.left))\n * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top , dragRect.top )));\n\n const overlapRatio = overlapArea / (dragRect.width * dragRect.height);\n\n dropped = overlapRatio >= dropOverlap;\n }\n\n if (this.options.drop.checker) {\n dropped = this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement);\n }\n\n return dropped;\n};\n\nInteractable.signals.on('unset', function ({ interactable }) {\n interactable.dropzone(false);\n});\n\nInteractable.settingsMethods.push('dropChecker');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.dropTarget = null; // the dropzone a drag target might be dropped into\n interaction.dropElement = null; // the element at the time of checking\n interaction.prevDropTarget = null; // the dropzone that was recently dragged away from\n interaction.prevDropElement = null; // the element at the time of checking\n interaction.dropEvents = null; // the dropEvents related to the current drag event\n\n interaction.activeDrops = {\n dropzones: [], // the dropzones that are mentioned below\n elements : [], // elements of dropzones that accept the target draggable\n rects : [], // the rects of the elements mentioned above\n };\n\n});\n\nInteraction.signals.on('stop', function ({ interaction }) {\n interaction.dropTarget = interaction.dropElement =\n interaction.prevDropTarget = interaction.prevDropElement = null;\n});\n\n/*\\\n * interact.dynamicDrop\n [ method ]\n *\n * Returns or sets whether the dimensions of dropzone elements are\n * calculated on every dragmove or only on dragstart for the default\n * dropChecker\n *\n - newValue (boolean) #optional True to check on each move. False to check only before start\n = (boolean | interact) The current setting or interact\n\\*/\ninteract.dynamicDrop = function (newValue) {\n if (utils.is.bool(newValue)) {\n //if (dragging && dynamicDrop !== newValue && !newValue) {\n //calcRects(dropzones);\n //}\n\n dynamicDrop = newValue;\n\n return interact;\n }\n return dynamicDrop;\n};\n\nutils.merge(Interactable.eventTypes, [\n 'dragenter',\n 'dragleave',\n 'dropactivate',\n 'dropdeactivate',\n 'dropmove',\n 'drop',\n]);\nactions.methodDict.drop = 'dropzone';\n\ndefaultOptions.drop = drop.defaults;\n\nmodule.exports = drop;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst gesture = {\n defaults: {\n enabled : false,\n origin : null,\n restrict: null,\n },\n\n checker: function (pointer, event, interactable, element, interaction) {\n if (interaction.pointerIds.length >= 2) {\n return { name: 'gesture' };\n }\n\n return null;\n },\n\n getCursor: function () {\n return '';\n },\n};\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturestart') { return; }\n iEvent.ds = 0;\n\n interaction.gesture.startDistance = interaction.gesture.prevDistance = iEvent.distance;\n interaction.gesture.startAngle = interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.scale = 1;\n});\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturemove') { return; }\n\n iEvent.ds = iEvent.scale - interaction.gesture.scale;\n\n interaction.target.fire(iEvent);\n\n interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.prevDistance = iEvent.distance;\n\n if (iEvent.scale !== Infinity\n && iEvent.scale !== null\n && iEvent.scale !== undefined\n && !isNaN(iEvent.scale)) {\n\n interaction.gesture.scale = iEvent.scale;\n }\n});\n\n/*\\\n * Interactable.gesturable\n [ method ]\n *\n * Gets or sets whether multitouch gestures can be performed on the\n * Interactable's element\n *\n = (boolean) Indicates if this can be the target of gesture events\n | var isGestureable = interact(element).gesturable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on gesture events (makes the Interactable gesturable)\n = (object) this Interactable\n | interact(element).gesturable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // limit multiple gestures.\n | // See the explanation in @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n\\*/\nInteractable.prototype.gesturable = function (options) {\n if (utils.is.object(options)) {\n this.options.gesture.enabled = options.enabled === false? false: true;\n this.setPerAction('gesture', options);\n this.setOnEvents('gesture', options);\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.gesture.enabled = options;\n\n if (!options) {\n this.ongesturestart = this.ongesturestart = this.ongestureend = null;\n }\n\n return this;\n }\n\n return this.options.gesture;\n};\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action, event, starting, ending, deltaSource }) {\n if (action !== 'gesture') { return; }\n\n const pointers = interaction.pointers;\n\n iEvent.touches = [pointers[0], pointers[1]];\n\n if (starting) {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = 1;\n iEvent.ds = 0;\n iEvent.angle = utils.touchAngle(pointers, undefined, deltaSource);\n iEvent.da = 0;\n }\n else if (ending || event instanceof InteractEvent) {\n iEvent.distance = interaction.prevEvent.distance;\n iEvent.box = interaction.prevEvent.box;\n iEvent.scale = interaction.prevEvent.scale;\n iEvent.ds = iEvent.scale - 1;\n iEvent.angle = interaction.prevEvent.angle;\n iEvent.da = iEvent.angle - interaction.gesture.startAngle;\n }\n else {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = iEvent.distance / interaction.gesture.startDistance;\n iEvent.angle = utils.touchAngle(pointers, interaction.gesture.prevAngle, deltaSource);\n\n iEvent.ds = iEvent.scale - interaction.gesture.prevScale;\n iEvent.da = iEvent.angle - interaction.gesture.prevAngle;\n }\n});\n\nInteraction.signals.on('new', function (interaction) {\n interaction.gesture = {\n start: { x: 0, y: 0 },\n\n startDistance: 0, // distance between two touches of touchStart\n prevDistance : 0,\n distance : 0,\n\n scale: 1, // gesture.distance / gesture.startDistance\n\n startAngle: 0, // angle of line joining two touches\n prevAngle : 0, // angle of the previous gesture event\n };\n});\n\nactions.gesture = gesture;\nactions.names.push('gesture');\nutils.merge(Interactable.eventTypes, [\n 'gesturestart',\n 'gesturemove',\n 'gestureend',\n]);\nactions.methodDict.gesture = 'gesturable';\n\ndefaultOptions.gesture = gesture.defaults;\n\nmodule.exports = gesture;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\n// Less Precision with touch input\nconst defaultMargin = browser.supportsTouch || browser.supportsPointerEvent? 20: 10;\n\nconst resize = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n square: false,\n preserveAspectRatio: false,\n axis: 'xy',\n\n // use default margin\n margin: NaN,\n\n // object with props left, right, top, bottom which are\n // true/false values to resize when the pointer is over that edge,\n // CSS selectors to match the handles for each direction\n // or the Elements for each handle\n edges: null,\n\n // a value of 'none' will limit the resize rect to a minimum of 0x0\n // 'negate' will alow the rect to have negative width/height\n // 'reposition' will keep the width/height positive by swapping\n // the top and bottom edges and/or swapping the left and right edges\n invert: 'none',\n },\n\n checker: function (pointer, event, interactable, element, interaction, rect) {\n if (!rect) { return null; }\n\n const page = utils.extend({}, interaction.curCoords.page);\n const options = interactable.options;\n\n if (options.resize.enabled) {\n const resizeOptions = options.resize;\n const resizeEdges = { left: false, right: false, top: false, bottom: false };\n\n // if using resize.edges\n if (utils.is.object(resizeOptions.edges)) {\n for (const edge in resizeEdges) {\n resizeEdges[edge] = checkResizeEdge(edge,\n resizeOptions.edges[edge],\n page,\n interaction._eventTarget,\n element,\n rect,\n resizeOptions.margin || defaultMargin);\n }\n\n resizeEdges.left = resizeEdges.left && !resizeEdges.right;\n resizeEdges.top = resizeEdges.top && !resizeEdges.bottom;\n\n if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) {\n return {\n name: 'resize',\n edges: resizeEdges,\n };\n }\n }\n else {\n const right = options.resize.axis !== 'y' && page.x > (rect.right - defaultMargin);\n const bottom = options.resize.axis !== 'x' && page.y > (rect.bottom - defaultMargin);\n\n if (right || bottom) {\n return {\n name: 'resize',\n axes: (right? 'x' : '') + (bottom? 'y' : ''),\n };\n }\n }\n }\n\n return null;\n },\n\n cursors: (browser.isIe9OrOlder ? {\n x : 'e-resize',\n y : 's-resize',\n xy: 'se-resize',\n\n top : 'n-resize',\n left : 'w-resize',\n bottom : 's-resize',\n right : 'e-resize',\n topleft : 'se-resize',\n bottomright: 'se-resize',\n topright : 'ne-resize',\n bottomleft : 'ne-resize',\n } : {\n x : 'ew-resize',\n y : 'ns-resize',\n xy: 'nwse-resize',\n\n top : 'ns-resize',\n left : 'ew-resize',\n bottom : 'ns-resize',\n right : 'ew-resize',\n topleft : 'nwse-resize',\n bottomright: 'nwse-resize',\n topright : 'nesw-resize',\n bottomleft : 'nesw-resize',\n }),\n\n getCursor: function (action) {\n if (action.axis) {\n return resize.cursors[action.name + action.axis];\n }\n else if (action.edges) {\n let cursorKey = '';\n const edgeNames = ['top', 'bottom', 'left', 'right'];\n\n for (let i = 0; i < 4; i++) {\n if (action.edges[edgeNames[i]]) {\n cursorKey += edgeNames[i];\n }\n }\n\n return resize.cursors[cursorKey];\n }\n },\n};\n\n// resizestart\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'resizestart' || !interaction.prepared.edges) {\n return;\n }\n\n const startRect = interaction.target.getRect(interaction.element);\n const resizeOptions = interaction.target.options.resize;\n\n /*\n * When using the `resizable.square` or `resizable.preserveAspectRatio` options, resizing from one edge\n * will affect another. E.g. with `resizable.square`, resizing to make the right edge larger will make\n * the bottom edge larger by the same amount. We call these 'linked' edges. Any linked edges will depend\n * on the active edges and the edge being interacted with.\n */\n if (resizeOptions.square || resizeOptions.preserveAspectRatio) {\n const linkedEdges = utils.extend({}, interaction.prepared.edges);\n\n linkedEdges.top = linkedEdges.top || (linkedEdges.left && !linkedEdges.bottom);\n linkedEdges.left = linkedEdges.left || (linkedEdges.top && !linkedEdges.right );\n linkedEdges.bottom = linkedEdges.bottom || (linkedEdges.right && !linkedEdges.top );\n linkedEdges.right = linkedEdges.right || (linkedEdges.bottom && !linkedEdges.left );\n\n interaction.prepared._linkedEdges = linkedEdges;\n }\n else {\n interaction.prepared._linkedEdges = null;\n }\n\n // if using `resizable.preserveAspectRatio` option, record aspect ratio at the start of the resize\n if (resizeOptions.preserveAspectRatio) {\n interaction.resizeStartAspectRatio = startRect.width / startRect.height;\n }\n\n interaction.resizeRects = {\n start : startRect,\n current : utils.extend({}, startRect),\n inverted : utils.extend({}, startRect),\n previous : utils.extend({}, startRect),\n delta : {\n left: 0, right : 0, width : 0,\n top : 0, bottom: 0, height: 0,\n },\n };\n\n iEvent.rect = interaction.resizeRects.inverted;\n iEvent.deltaRect = interaction.resizeRects.delta;\n});\n\n// resizemove\nInteractEvent.signals.on('new', function ({ iEvent, phase, interaction }) {\n if (phase !== 'move' || !interaction.prepared.edges) { return; }\n\n const resizeOptions = interaction.target.options.resize;\n const invert = resizeOptions.invert;\n const invertible = invert === 'reposition' || invert === 'negate';\n\n let edges = interaction.prepared.edges;\n\n const start = interaction.resizeRects.start;\n const current = interaction.resizeRects.current;\n const inverted = interaction.resizeRects.inverted;\n const delta = interaction.resizeRects.delta;\n const previous = utils.extend(interaction.resizeRects.previous, inverted);\n const originalEdges = edges;\n\n let dx = iEvent.dx;\n let dy = iEvent.dy;\n\n if (resizeOptions.preserveAspectRatio || resizeOptions.square) {\n // `resize.preserveAspectRatio` takes precedence over `resize.square`\n const startAspectRatio = resizeOptions.preserveAspectRatio\n ? interaction.resizeStartAspectRatio\n : 1;\n\n edges = interaction.prepared._linkedEdges;\n\n if ((originalEdges.left && originalEdges.bottom)\n || (originalEdges.right && originalEdges.top)) {\n dy = -dx / startAspectRatio;\n }\n else if (originalEdges.left || originalEdges.right ) { dy = dx / startAspectRatio; }\n else if (originalEdges.top || originalEdges.bottom) { dx = dy * startAspectRatio; }\n }\n\n // update the 'current' rect without modifications\n if (edges.top ) { current.top += dy; }\n if (edges.bottom) { current.bottom += dy; }\n if (edges.left ) { current.left += dx; }\n if (edges.right ) { current.right += dx; }\n\n if (invertible) {\n // if invertible, copy the current rect\n utils.extend(inverted, current);\n\n if (invert === 'reposition') {\n // swap edge values if necessary to keep width/height positive\n let swap;\n\n if (inverted.top > inverted.bottom) {\n swap = inverted.top;\n\n inverted.top = inverted.bottom;\n inverted.bottom = swap;\n }\n if (inverted.left > inverted.right) {\n swap = inverted.left;\n\n inverted.left = inverted.right;\n inverted.right = swap;\n }\n }\n }\n else {\n // if not invertible, restrict to minimum of 0x0 rect\n inverted.top = Math.min(current.top, start.bottom);\n inverted.bottom = Math.max(current.bottom, start.top);\n inverted.left = Math.min(current.left, start.right);\n inverted.right = Math.max(current.right, start.left);\n }\n\n inverted.width = inverted.right - inverted.left;\n inverted.height = inverted.bottom - inverted.top ;\n\n for (const edge in inverted) {\n delta[edge] = inverted[edge] - previous[edge];\n }\n\n iEvent.edges = interaction.prepared.edges;\n iEvent.rect = inverted;\n iEvent.deltaRect = delta;\n});\n\n/*\\\n * Interactable.resizable\n [ method ]\n *\n * Gets or sets whether resize actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of resize elements\n | var isResizeable = interact('input[type=text]').resizable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on resize events (object makes the Interactable resizable)\n = (object) This Interactable\n | interact(element).resizable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | edges: {\n | top : true, // Use pointer coords to check for resize.\n | left : false, // Disable resizing from left edge.\n | bottom: '.resize-s',// Resize if pointer target matches selector\n | right : handleEl // Resize if pointer target is the given Element\n | },\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height are adjusted at a 1:1 ratio.\n | square: false,\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height maintain the aspect ratio they had when resizing started.\n | preserveAspectRatio: false,\n |\n | // a value of 'none' will limit the resize rect to a minimum of 0x0\n | // 'negate' will allow the rect to have negative width/height\n | // 'reposition' will keep the width/height positive by swapping\n | // the top and bottom edges and/or swapping the left and right edges\n | invert: 'none' || 'negate' || 'reposition'\n |\n | // limit multiple resizes.\n | // See the explanation in the @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n \\*/\nInteractable.prototype.resizable = function (options) {\n if (utils.is.object(options)) {\n this.options.resize.enabled = options.enabled === false? false: true;\n this.setPerAction('resize', options);\n this.setOnEvents('resize', options);\n\n if (/^x$|^y$|^xy$/.test(options.axis)) {\n this.options.resize.axis = options.axis;\n }\n else if (options.axis === null) {\n this.options.resize.axis = defaultOptions.resize.axis;\n }\n\n if (utils.is.bool(options.preserveAspectRatio)) {\n this.options.resize.preserveAspectRatio = options.preserveAspectRatio;\n }\n else if (utils.is.bool(options.square)) {\n this.options.resize.square = options.square;\n }\n\n return this;\n }\n if (utils.is.bool(options)) {\n this.options.resize.enabled = options;\n\n if (!options) {\n this.onresizestart = this.onresizestart = this.onresizeend = null;\n }\n\n return this;\n }\n return this.options.resize;\n};\n\nfunction checkResizeEdge (name, value, page, element, interactableElement, rect, margin) {\n // false, '', undefined, null\n if (!value) { return false; }\n\n // true value, use pointer coords and element rect\n if (value === true) {\n // if dimensions are negative, \"switch\" edges\n const width = utils.is.number(rect.width )? rect.width : rect.right - rect.left;\n const height = utils.is.number(rect.height)? rect.height : rect.bottom - rect.top ;\n\n if (width < 0) {\n if (name === 'left' ) { name = 'right'; }\n else if (name === 'right') { name = 'left' ; }\n }\n if (height < 0) {\n if (name === 'top' ) { name = 'bottom'; }\n else if (name === 'bottom') { name = 'top' ; }\n }\n\n if (name === 'left' ) { return page.x < ((width >= 0? rect.left: rect.right ) + margin); }\n if (name === 'top' ) { return page.y < ((height >= 0? rect.top : rect.bottom) + margin); }\n\n if (name === 'right' ) { return page.x > ((width >= 0? rect.right : rect.left) - margin); }\n if (name === 'bottom') { return page.y > ((height >= 0? rect.bottom: rect.top ) - margin); }\n }\n\n // the remaining checks require an element\n if (!utils.is.element(element)) { return false; }\n\n return utils.is.element(value)\n // the value is an element to use as a resize handle\n ? value === element\n // otherwise check if element matches value as selector\n : utils.matchesUpTo(element, value, interactableElement);\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.resizeAxes = 'xy';\n});\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action }) {\n if (action !== 'resize' || !interaction.resizeAxes) { return; }\n\n const options = interaction.target.options;\n\n if (options.resize.square) {\n if (interaction.resizeAxes === 'y') {\n iEvent.dx = iEvent.dy;\n }\n else {\n iEvent.dy = iEvent.dx;\n }\n iEvent.axes = 'xy';\n }\n else {\n iEvent.axes = interaction.resizeAxes;\n\n if (interaction.resizeAxes === 'x') {\n iEvent.dy = 0;\n }\n else if (interaction.resizeAxes === 'y') {\n iEvent.dx = 0;\n }\n }\n});\n\nactions.resize = resize;\nactions.names.push('resize');\nutils.merge(Interactable.eventTypes, [\n 'resizestart',\n 'resizemove',\n 'resizeinertiastart',\n 'resizeinertiaresume',\n 'resizeend',\n]);\nactions.methodDict.resize = 'resizable';\n\ndefaultOptions.resize = resize.defaults;\n\nmodule.exports = resize;\n","const raf = require('./utils/raf');\nconst getWindow = require('./utils/window').getWindow;\nconst is = require('./utils/is');\nconst domUtils = require('./utils/domUtils');\nconst Interaction = require('./Interaction');\nconst defaultOptions = require('./defaultOptions');\n\nconst autoScroll = {\n defaults: {\n enabled : false,\n container: null, // the item that is scrolled (Window or HTMLElement)\n margin : 60,\n speed : 300, // the scroll speed in pixels per second\n },\n\n interaction: null,\n i: null, // the handle returned by window.setInterval\n x: 0, y: 0, // Direction each pulse is to scroll in\n\n isScrolling: false,\n prevTime: 0,\n\n start: function (interaction) {\n autoScroll.isScrolling = true;\n raf.cancel(autoScroll.i);\n\n autoScroll.interaction = interaction;\n autoScroll.prevTime = new Date().getTime();\n autoScroll.i = raf.request(autoScroll.scroll);\n },\n\n stop: function () {\n autoScroll.isScrolling = false;\n raf.cancel(autoScroll.i);\n },\n\n // scroll the window by the values in scroll.x/y\n scroll: function () {\n const options = autoScroll.interaction.target.options[autoScroll.interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(autoScroll.interaction.element);\n const now = new Date().getTime();\n // change in time in seconds\n const dt = (now - autoScroll.prevTime) / 1000;\n // displacement\n const s = options.speed * dt;\n\n if (s >= 1) {\n if (is.window(container)) {\n container.scrollBy(autoScroll.x * s, autoScroll.y * s);\n }\n else if (container) {\n container.scrollLeft += autoScroll.x * s;\n container.scrollTop += autoScroll.y * s;\n }\n\n autoScroll.prevTime = now;\n }\n\n if (autoScroll.isScrolling) {\n raf.cancel(autoScroll.i);\n autoScroll.i = raf.request(autoScroll.scroll);\n }\n },\n check: function (interactable, actionName) {\n const options = interactable.options;\n\n return options[actionName].autoScroll && options[actionName].autoScroll.enabled;\n },\n onInteractionMove: function ({ interaction, pointer }) {\n if (!(interaction.interacting()\n && autoScroll.check(interaction.target, interaction.prepared.name))) {\n return;\n }\n\n if (interaction.simulation) {\n autoScroll.x = autoScroll.y = 0;\n return;\n }\n\n let top;\n let right;\n let bottom;\n let left;\n\n const options = interaction.target.options[interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(interaction.element);\n\n if (is.window(container)) {\n left = pointer.clientX < autoScroll.margin;\n top = pointer.clientY < autoScroll.margin;\n right = pointer.clientX > container.innerWidth - autoScroll.margin;\n bottom = pointer.clientY > container.innerHeight - autoScroll.margin;\n }\n else {\n const rect = domUtils.getElementClientRect(container);\n\n left = pointer.clientX < rect.left + autoScroll.margin;\n top = pointer.clientY < rect.top + autoScroll.margin;\n right = pointer.clientX > rect.right - autoScroll.margin;\n bottom = pointer.clientY > rect.bottom - autoScroll.margin;\n }\n\n autoScroll.x = (right ? 1: left? -1: 0);\n autoScroll.y = (bottom? 1: top? -1: 0);\n\n if (!autoScroll.isScrolling) {\n // set the autoScroll properties to those of the target\n autoScroll.margin = options.margin;\n autoScroll.speed = options.speed;\n\n autoScroll.start(interaction);\n }\n },\n};\n\nInteraction.signals.on('stop-active', function () {\n autoScroll.stop();\n});\n\nInteraction.signals.on('action-move', autoScroll.onInteractionMove);\n\ndefaultOptions.perAction.autoScroll = autoScroll.defaults;\n\nmodule.exports = autoScroll;\n","const Interactable = require('../Interactable');\nconst actions = require('../actions/base');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.ignoreFrom\n [ method ]\n *\n * If the target of the `mousedown`, `pointerdown` or `touchstart`\n * event or any of it's parents match the given CSS selector or\n * Element, no drag/resize/gesture is started.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to not ignore any elements\n = (string | Element | object) The current ignoreFrom value or this Interactable\n **\n | interact(element, { ignoreFrom: document.getElementById('no-action') });\n | // or\n | interact(element).ignoreFrom('input, textarea, a');\n\\*/\nInteractable.prototype.ignoreFrom = function (newValue) {\n return this._backCompatOption('ignoreFrom', newValue);\n};\n\n/*\\\n * Interactable.allowFrom\n [ method ]\n *\n * A drag/resize/gesture is started only If the target of the\n * `mousedown`, `pointerdown` or `touchstart` event or any of it's\n * parents match the given CSS selector or Element.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to allow from any element\n = (string | Element | object) The current allowFrom value or this Interactable\n **\n | interact(element, { allowFrom: document.getElementById('drag-handle') });\n | // or\n | interact(element).allowFrom('.handle');\n\\*/\nInteractable.prototype.allowFrom = function (newValue) {\n return this._backCompatOption('allowFrom', newValue);\n};\n\nInteractable.prototype.testIgnore = function (ignoreFrom, interactableElement, element) {\n if (!ignoreFrom || !is.element(element)) { return false; }\n\n if (is.string(ignoreFrom)) {\n return domUtils.matchesUpTo(element, ignoreFrom, interactableElement);\n }\n else if (is.element(ignoreFrom)) {\n return domUtils.nodeContains(ignoreFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testAllow = function (allowFrom, interactableElement, element) {\n if (!allowFrom) { return true; }\n\n if (!is.element(element)) { return false; }\n\n if (is.string(allowFrom)) {\n return domUtils.matchesUpTo(element, allowFrom, interactableElement);\n }\n else if (is.element(allowFrom)) {\n return domUtils.nodeContains(allowFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testIgnoreAllow = function (options, interactableElement, eventTarget) {\n return (!this.testIgnore(options.ignoreFrom, interactableElement, eventTarget)\n && this.testAllow(options.allowFrom, interactableElement, eventTarget));\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (event.buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\n","const interact = require('../interact');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst actions = require('../actions/base');\nconst defaultOptions = require('../defaultOptions');\nconst browser = require('../utils/browser');\nconst scope = require('../scope');\nconst utils = require('../utils');\nconst signals = require('../utils/Signals').new();\n\nrequire('./InteractableMethods');\n\nconst autoStart = {\n signals,\n withinInteractionLimit,\n // Allow this many interactions to happen simultaneously\n maxInteractions: Infinity,\n defaults: {\n perAction: {\n manualStart: false,\n max: Infinity,\n maxPerElement: 1,\n allowFrom: null,\n ignoreFrom: null,\n },\n },\n setActionDefaults: function (action) {\n utils.extend(action.defaults, autoStart.defaults.perAction);\n },\n};\n\n// set cursor style on mousedown\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget }) {\n if (interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\n// set cursor style on mousemove\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget }) {\n if (!interaction.mouse\n || interaction.pointerIsDown\n || interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\nInteraction.signals.on('move', function (arg) {\n const { interaction, event } = arg;\n\n if (!interaction.pointerIsDown\n || interaction.interacting()\n || !interaction.pointerWasMoved\n || !interaction.prepared.name) {\n return;\n }\n\n signals.fire('before-start', arg);\n\n const target = interaction.target;\n\n if (interaction.prepared.name && target) {\n // check manualStart and interaction limit\n if (target.options[interaction.prepared.name].manualStart\n || !withinInteractionLimit(target, interaction.element, interaction.prepared)) {\n interaction.stop(event);\n }\n else {\n interaction.start(interaction.prepared, target, interaction.element);\n }\n }\n});\n\n// Check if the current target supports the action.\n// If so, return the validated action. Otherwise, return null\nfunction validateAction (action, interactable, element, eventTarget) {\n if (utils.is.object(action)\n && interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget)\n && interactable.options[action.name].enabled\n && withinInteractionLimit(interactable, element, action)) {\n return action;\n }\n\n return null;\n}\n\nfunction validateSelector (interaction, pointer, event, matches, matchElements, eventTarget) {\n for (let i = 0, len = matches.length; i < len; i++) {\n const match = matches[i];\n const matchElement = matchElements[i];\n const action = validateAction(match.getAction(pointer, event, interaction, matchElement),\n match,\n matchElement,\n eventTarget);\n\n if (action) {\n return {\n action,\n target: match,\n element: matchElement,\n };\n }\n }\n\n return {};\n}\n\nfunction getActionInfo (interaction, pointer, event, eventTarget) {\n let matches = [];\n let matchElements = [];\n\n let element = eventTarget;\n let action = null;\n\n function pushMatches (interactable, selector, context) {\n const elements = (browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined);\n\n if (utils.matchesSelector(element, selector, elements)) {\n\n matches.push(interactable);\n matchElements.push(element);\n }\n }\n\n while (utils.is.element(element)) {\n matches = [];\n matchElements = [];\n\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && (action = validateAction(elementInteractable.getAction(pointer, event, interaction, element, eventTarget),\n elementInteractable,\n element,\n eventTarget))\n && !elementInteractable.options[action.name].manualStart) {\n return {\n element,\n action,\n target: elementInteractable,\n };\n }\n else {\n scope.interactables.forEachSelector(pushMatches, element);\n\n const actionInfo = validateSelector(interaction, pointer, event, matches, matchElements, eventTarget);\n\n if (actionInfo.action\n && !actionInfo.target.options[actionInfo.action.name].manualStart) {\n return actionInfo;\n }\n }\n\n element = utils.parentNode(element);\n }\n\n return {};\n}\n\nfunction prepare (interaction, { action, target, element }) {\n action = action || {};\n\n if (interaction.target && interaction.target.options.styleCursor) {\n interaction.target._doc.documentElement.style.cursor = '';\n }\n\n interaction.target = target;\n interaction.element = element;\n utils.copyAction(interaction.prepared, action);\n\n if (target && target.options.styleCursor) {\n const cursor = action? actions[action.name].getCursor(action) : '';\n interaction.target._doc.documentElement.style.cursor = cursor;\n }\n\n signals.fire('prepared', { interaction: interaction });\n}\n\nInteraction.signals.on('stop', function ({ interaction }) {\n const target = interaction.target;\n\n if (target && target.options.styleCursor) {\n target._doc.documentElement.style.cursor = '';\n }\n});\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (utils.is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (utils.is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n const buttons = event.buttons || ({\n 0: 1,\n 1: 4,\n 3: 8,\n 4: 16,\n })[event.button];\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\nfunction withinInteractionLimit (interactable, element, action) {\n const options = interactable.options;\n const maxActions = options[action.name].max;\n const maxPerElement = options[action.name].maxPerElement;\n let activeInteractions = 0;\n let targetCount = 0;\n let targetElementCount = 0;\n\n // no actions if any of these values == 0\n if (!(maxActions && maxPerElement && autoStart.maxInteractions)) { return; }\n\n for (let i = 0, len = scope.interactions.length; i < len; i++) {\n const interaction = scope.interactions[i];\n const otherAction = interaction.prepared.name;\n\n if (!interaction.interacting()) { continue; }\n\n activeInteractions++;\n\n if (activeInteractions >= autoStart.maxInteractions) {\n return false;\n }\n\n if (interaction.target !== interactable) { continue; }\n\n targetCount += (otherAction === action.name)|0;\n\n if (targetCount >= maxActions) {\n return false;\n }\n\n if (interaction.element === element) {\n targetElementCount++;\n\n if (otherAction !== action.name || targetElementCount >= maxPerElement) {\n return false;\n }\n }\n }\n\n return autoStart.maxInteractions > 0;\n}\n\n/*\\\n * interact.maxInteractions\n [ method ]\n **\n * Returns or sets the maximum number of concurrent interactions allowed.\n * By default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables\n * and elements, you need to enable it in the draggable, resizable and\n * gesturable `'max'` and `'maxPerElement'` options.\n **\n - newValue (number) #optional Any number. newValue <= 0 means no interactions.\n\\*/\ninteract.maxInteractions = function (newValue) {\n if (utils.is.number(newValue)) {\n autoStart.maxInteractions = newValue;\n\n return this;\n }\n\n return autoStart.maxInteractions;\n};\n\nInteractable.settingsMethods.push('styleCursor');\nInteractable.settingsMethods.push('actionChecker');\nInteractable.settingsMethods.push('ignoreFrom');\nInteractable.settingsMethods.push('allowFrom');\n\ndefaultOptions.base.actionChecker = null;\ndefaultOptions.base.styleCursor = true;\n\nutils.extend(defaultOptions.perAction, autoStart.defaults.perAction);\n\nmodule.exports = autoStart;\n","const autoStart = require('./base');\nconst Interaction = require('../Interaction');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.delayTimer = null;\n});\n\nautoStart.signals.on('prepared', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.delayTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.target, interaction.element);\n }, delay);\n }\n});\n\nInteraction.signals.on('move', function ({ interaction, duplicate }) {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.delayTimer);\n }\n});\n\n// prevent regular down->move autoStart\nautoStart.signals.on('before-start', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.prepared.name = null;\n }\n});\n","const autoStart = require('./base');\nconst scope = require('../scope');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\n\nconst { matchesSelector, parentNode } = require('../utils/domUtils');\n\nautoStart.setActionDefaults(require('../actions/drag'));\n\nautoStart.signals.on('before-start', function ({ interaction, eventTarget, dx, dy }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // check if a drag is in the correct axis\n const absX = Math.abs(dx);\n const absY = Math.abs(dy);\n const options = interaction.target.options.drag;\n const startAxis = options.startAxis;\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy');\n\n interaction.prepared.axis = options.lockAxis === 'start'\n ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n : options.lockAxis;\n\n // if the movement isn't in the startAxis of the interactable\n if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) {\n // cancel the prepared action\n interaction.prepared.name = null;\n\n // then try to get a drag from another ineractable\n\n if (!interaction.prepared.name) {\n\n let element = eventTarget;\n\n const getDraggable = function (interactable, selector, context) {\n const elements = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n if (interactable === interaction.target) { return; }\n\n if (!options.manualStart\n && !interactable.testIgnoreAllow(options, element, eventTarget)\n && matchesSelector(element, selector, elements)) {\n\n const action = interactable.getAction(interaction.downPointer,\n interaction.downEvent,\n interaction,\n element);\n\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, interactable)\n && autoStart.validateAction(action, interactable, element, eventTarget)) {\n\n return interactable;\n }\n }\n };\n\n let action = null;\n\n // check all interactables\n while (is.element(element)) {\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && elementInteractable !== interaction.target\n && !elementInteractable.options.drag.manualStart) {\n\n action = elementInteractable.getAction(interaction.downPointer, interaction.downEvent, interaction, element);\n }\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, elementInteractable)) {\n\n interaction.prepared.name = 'drag';\n interaction.target = elementInteractable;\n interaction.element = element;\n break;\n }\n\n const selectorInteractable = scope.interactables.forEachSelector(getDraggable, element);\n\n if (selectorInteractable) {\n interaction.prepared.name = 'drag';\n interaction.target = selectorInteractable;\n interaction.element = element;\n break;\n }\n\n element = parentNode(element);\n }\n }\n }\n});\n\nfunction checkStartAxis (startAxis, interactable) {\n if (!interactable) { return false; }\n\n const thisAxis = interactable.options.drag.startAxis;\n\n return (startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis);\n}\n","require('./base').setActionDefaults(require('../actions/gesture'));\n","require('./base').setActionDefaults(require('../actions/resize'));\n","module.exports = {\n base: {\n accept : null,\n preventDefault: 'auto',\n deltaSource : 'page',\n },\n\n perAction: {\n origin: { x: 0, y: 0 },\n\n // only allow left button by default\n // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n mouseButtons: 1,\n\n inertia: {\n enabled : false,\n resistance : 10, // the lambda in exponential decay\n minSpeed : 100, // target speed must be above this for inertia to start\n endSpeed : 10, // the speed at which inertia is slow enough to stop\n allowResume : true, // allow resuming an action in inertia phase\n smoothEndDuration: 300, // animate to snap/restrict endOnly if there's no inertia\n },\n },\n};\n","/* browser entry point */\n\n// Legacy browser support\nrequire('./legacyBrowsers');\n\n// inertia\nrequire('./inertia');\n\n// modifiers\nrequire('./modifiers/snap');\nrequire('./modifiers/restrict');\n\n// pointerEvents\nrequire('./pointerEvents/base');\nrequire('./pointerEvents/holdRepeat');\nrequire('./pointerEvents/interactableTargets');\n\n// delay\nrequire('./autoStart/delay');\n\n// actions\nrequire('./actions/gesture');\nrequire('./actions/resize');\nrequire('./actions/drag');\nrequire('./actions/drop');\n\n// load these modifiers after resize is loaded\nrequire('./modifiers/snapSize');\nrequire('./modifiers/restrictEdges');\nrequire('./modifiers/restrictSize');\n\n// autoStart actions\nrequire('./autoStart/gesture');\nrequire('./autoStart/resize');\nrequire('./autoStart/drag');\n\n// Interactable preventDefault setting\nrequire('./interactablePreventDefault.js');\n\n// autoScroll\nrequire('./autoScroll');\n\n// export interact\nmodule.exports = require('./interact');\n","const InteractEvent = require('./InteractEvent');\nconst Interaction = require('./Interaction');\nconst modifiers = require('./modifiers');\nconst utils = require('./utils');\nconst animationFrame = require('./utils/raf');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.inertiaStatus = {\n active : false,\n smoothEnd : false,\n allowResume: false,\n\n startEvent: null,\n upCoords : {},\n\n xe: 0, ye: 0,\n sx: 0, sy: 0,\n\n t0: 0,\n vx0: 0, vys: 0,\n duration: 0,\n\n lambda_v0: 0,\n one_ve_v0: 0,\n i : null,\n };\n\n interaction.boundInertiaFrame = () => inertiaFrame .apply(interaction);\n interaction.boundSmoothEndFrame = () => smoothEndFrame.apply(interaction);\n});\n\nInteraction.signals.on('down', function ({ interaction, event, pointer, eventTarget }) {\n const status = interaction.inertiaStatus;\n\n // Check if the down event hits the current inertia target\n if (status.active) {\n let element = eventTarget;\n\n // climb up the DOM tree from the event target\n while (utils.is.element(element)) {\n\n // if interaction element is the current inertia target element\n if (element === interaction.element) {\n // stop inertia\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n\n // update pointers to the down event's coordinates\n interaction.updatePointer(pointer);\n utils.setCoords(interaction.curCoords, interaction.pointers);\n\n // fire appropriate signals\n const signalArg = { interaction };\n Interaction.signals.fire('before-action-move', signalArg);\n Interaction.signals.fire('action-resume' , signalArg);\n\n // fire a reume event\n const resumeEvent = new InteractEvent(interaction,\n event,\n interaction.prepared.name,\n 'inertiaresume',\n interaction.element);\n\n interaction.target.fire(resumeEvent);\n interaction.prevEvent = resumeEvent;\n modifiers.resetStatuses(interaction.modifierStatuses);\n\n utils.copyCoords(interaction.prevCoords, interaction.curCoords);\n break;\n }\n\n element = utils.parentNode(element);\n }\n }\n});\n\nInteraction.signals.on('up', function ({ interaction, event }) {\n const status = interaction.inertiaStatus;\n\n if (!interaction.interacting() || status.active) { return; }\n\n const target = interaction.target;\n const options = target && target.options;\n const inertiaOptions = options && interaction.prepared.name && options[interaction.prepared.name].inertia;\n\n const now = new Date().getTime();\n const statuses = {};\n const page = utils.extend({}, interaction.curCoords.page);\n const pointerSpeed = interaction.pointerDelta.client.speed;\n\n let smoothEnd = false;\n let modifierResult;\n\n // check if inertia should be started\n const inertiaPossible = (inertiaOptions && inertiaOptions.enabled\n && interaction.prepared.name !== 'gesture'\n && event !== status.startEvent);\n\n const inertia = (inertiaPossible\n && (now - interaction.curCoords.timeStamp) < 50\n && pointerSpeed > inertiaOptions.minSpeed\n && pointerSpeed > inertiaOptions.endSpeed);\n\n const modifierArg = {\n interaction,\n pageCoords: page,\n statuses,\n preEnd: true,\n requireEndOnly: true,\n };\n\n // smoothEnd\n if (inertiaPossible && !inertia) {\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n if (modifierResult.shouldMove && modifierResult.locked) {\n smoothEnd = true;\n }\n }\n\n if (!(inertia || smoothEnd)) { return; }\n\n utils.copyCoords(status.upCoords, interaction.curCoords);\n\n interaction.pointers[0] = status.startEvent =\n new InteractEvent(interaction, event, interaction.prepared.name, 'inertiastart', interaction.element);\n\n status.t0 = now;\n\n status.active = true;\n status.allowResume = inertiaOptions.allowResume;\n interaction.simulation = status;\n\n target.fire(status.startEvent);\n\n if (inertia) {\n status.vx0 = interaction.pointerDelta.client.vx;\n status.vy0 = interaction.pointerDelta.client.vy;\n status.v0 = pointerSpeed;\n\n calcInertia(interaction, status);\n\n utils.extend(page, interaction.curCoords.page);\n\n page.x += status.xe;\n page.y += status.ye;\n\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n status.modifiedXe += modifierResult.dx;\n status.modifiedYe += modifierResult.dy;\n\n status.i = animationFrame.request(interaction.boundInertiaFrame);\n }\n else {\n status.smoothEnd = true;\n status.xe = modifierResult.dx;\n status.ye = modifierResult.dy;\n\n status.sx = status.sy = 0;\n\n status.i = animationFrame.request(interaction.boundSmoothEndFrame);\n }\n});\n\nInteraction.signals.on('stop-active', function ({ interaction }) {\n const status = interaction.inertiaStatus;\n\n if (status.active) {\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n }\n});\n\nfunction calcInertia (interaction, status) {\n const inertiaOptions = interaction.target.options[interaction.prepared.name].inertia;\n const lambda = inertiaOptions.resistance;\n const inertiaDur = -Math.log(inertiaOptions.endSpeed / status.v0) / lambda;\n\n status.x0 = interaction.prevEvent.pageX;\n status.y0 = interaction.prevEvent.pageY;\n status.t0 = status.startEvent.timeStamp / 1000;\n status.sx = status.sy = 0;\n\n status.modifiedXe = status.xe = (status.vx0 - inertiaDur) / lambda;\n status.modifiedYe = status.ye = (status.vy0 - inertiaDur) / lambda;\n status.te = inertiaDur;\n\n status.lambda_v0 = lambda / status.v0;\n status.one_ve_v0 = 1 - inertiaOptions.endSpeed / status.v0;\n}\n\nfunction inertiaFrame () {\n updateInertiaCoords(this);\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n\n const status = this.inertiaStatus;\n const options = this.target.options[this.prepared.name].inertia;\n const lambda = options.resistance;\n const t = new Date().getTime() / 1000 - status.t0;\n\n if (t < status.te) {\n\n const progress = 1 - (Math.exp(-lambda * t) - status.lambda_v0) / status.one_ve_v0;\n\n if (status.modifiedXe === status.xe && status.modifiedYe === status.ye) {\n status.sx = status.xe * progress;\n status.sy = status.ye * progress;\n }\n else {\n const quadPoint = utils.getQuadraticCurvePoint(0, 0,\n status.xe,\n status.ye,\n status.modifiedXe,\n status.modifiedYe,\n progress);\n\n status.sx = quadPoint.x;\n status.sy = quadPoint.y;\n }\n\n this.doMove();\n\n status.i = animationFrame.request(this.boundInertiaFrame);\n }\n else {\n status.sx = status.modifiedXe;\n status.sy = status.modifiedYe;\n\n this.doMove();\n this.end(status.startEvent);\n status.active = false;\n this.simulation = null;\n }\n\n utils.copyCoords(this.prevCoords, this.curCoords);\n}\n\nfunction smoothEndFrame () {\n updateInertiaCoords(this);\n\n const status = this.inertiaStatus;\n const t = new Date().getTime() - status.t0;\n const duration = this.target.options[this.prepared.name].inertia.smoothEndDuration;\n\n if (t < duration) {\n status.sx = utils.easeOutQuad(t, 0, status.xe, duration);\n status.sy = utils.easeOutQuad(t, 0, status.ye, duration);\n\n this.pointerMove(status.startEvent, status.startEvent);\n\n status.i = animationFrame.request(this.boundSmoothEndFrame);\n }\n else {\n status.sx = status.xe;\n status.sy = status.ye;\n\n this.pointerMove(status.startEvent, status.startEvent);\n this.end(status.startEvent);\n\n status.smoothEnd =\n status.active = false;\n this.simulation = null;\n }\n}\n\nfunction updateInertiaCoords (interaction) {\n const status = interaction.inertiaStatus;\n\n // return if inertia isn't running\n if (!status.active) { return; }\n\n const pageUp = status.upCoords.page;\n const clientUp = status.upCoords.client;\n\n utils.setCoords(interaction.curCoords, [ {\n pageX : pageUp.x + status.sx,\n pageY : pageUp.y + status.sy,\n clientX: clientUp.x + status.sx,\n clientY: clientUp.y + status.sy,\n } ]);\n}\n","const browser = require('./utils/browser');\nconst events = require('./utils/events');\nconst utils = require('./utils');\nconst scope = require('./scope');\nconst Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\n\nconst globalEvents = {};\n\n/*\\\n * interact\n [ method ]\n *\n * The methods of this variable can be used to set elements as\n * interactables and also to change various default settings.\n *\n * Calling it as a function and passing an element or a valid CSS selector\n * string returns an Interactable object which has various methods to\n * configure it.\n *\n - element (Element | string) The HTML or SVG Element to interact with or CSS selector\n = (object) An @Interactable\n *\n > Usage\n | interact('#draggable').draggable(true);\n |\n | var rectables = interact('rect');\n | rectables\n | .gesturable(true)\n | .on('gesturemove', function (event) {\n | // ...\n | });\n\\*/\nfunction interact (element, options) {\n let interactable = scope.interactables.get(element, options);\n\n if (!interactable) {\n interactable = new Interactable(element, options);\n interactable.events.global = globalEvents;\n }\n\n return interactable;\n}\n\n/*\\\n * interact.isSet\n [ method ]\n *\n * Check if an element has been set\n - element (Element) The Element being searched for\n = (boolean) Indicates if the element or CSS selector was previously passed to interact\n\\*/\ninteract.isSet = function (element, options) {\n return scope.interactables.indexOfElement(element, options && options.context) !== -1;\n};\n\n/*\\\n * interact.on\n [ method ]\n *\n * Adds a global listener for an InteractEvent or adds a DOM event to\n * `document`\n *\n - type (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) interact\n\\*/\ninteract.on = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.on(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.on(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n // if it is an InteractEvent type, add listener to globalEvents\n if (utils.contains(Interactable.eventTypes, type)) {\n // if this type of event was never bound\n if (!globalEvents[type]) {\n globalEvents[type] = [listener];\n }\n else {\n globalEvents[type].push(listener);\n }\n }\n // If non InteractEvent type, addEventListener to document\n else {\n events.add(scope.document, type, listener, { options });\n }\n\n return interact;\n};\n\n/*\\\n * interact.off\n [ method ]\n *\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n - type (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) interact\n \\*/\ninteract.off = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.off(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.off(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n if (!utils.contains(Interactable.eventTypes, type)) {\n events.remove(scope.document, type, listener, options);\n }\n else {\n let index;\n\n if (type in globalEvents\n && (index = utils.indexOf(globalEvents[type], listener)) !== -1) {\n globalEvents[type].splice(index, 1);\n }\n }\n\n return interact;\n};\n\n/*\\\n * interact.debug\n [ method ]\n *\n * Returns an object which exposes internal data\n = (object) An object with properties that outline the current state and expose internal functions and variables\n\\*/\ninteract.debug = function () {\n return scope;\n};\n\n// expose the functions used to calculate multi-touch properties\ninteract.getPointerAverage = utils.pointerAverage;\ninteract.getTouchBBox = utils.touchBBox;\ninteract.getTouchDistance = utils.touchDistance;\ninteract.getTouchAngle = utils.touchAngle;\n\ninteract.getElementRect = utils.getElementRect;\ninteract.getElementClientRect = utils.getElementClientRect;\ninteract.matchesSelector = utils.matchesSelector;\ninteract.closest = utils.closest;\n\n/*\\\n * interact.supportsTouch\n [ method ]\n *\n = (boolean) Whether or not the browser supports touch input\n\\*/\ninteract.supportsTouch = function () {\n return browser.supportsTouch;\n};\n\n/*\\\n * interact.supportsPointerEvent\n [ method ]\n *\n = (boolean) Whether or not the browser supports PointerEvents\n\\*/\ninteract.supportsPointerEvent = function () {\n return browser.supportsPointerEvent;\n};\n\n/*\\\n * interact.stop\n [ method ]\n *\n * Cancels all interactions (end events are not fired)\n *\n - event (Event) An event on which to call preventDefault()\n = (object) interact\n\\*/\ninteract.stop = function (event) {\n for (let i = scope.interactions.length - 1; i >= 0; i--) {\n scope.interactions[i].stop(event);\n }\n\n return interact;\n};\n\n/*\\\n * interact.pointerMoveTolerance\n [ method ]\n * Returns or sets the distance the pointer must be moved before an action\n * sequence occurs. This also affects tolerance for tap events.\n *\n - newValue (number) #optional The movement from the start position must be greater than this value\n = (number | Interactable) The current setting or interact\n\\*/\ninteract.pointerMoveTolerance = function (newValue) {\n if (utils.is.number(newValue)) {\n Interaction.pointerMoveTolerance = newValue;\n\n return this;\n }\n\n return Interaction.pointerMoveTolerance;\n};\n\ninteract.addDocument = scope.addDocument;\ninteract.removeDocument = scope.removeDocument;\n\nscope.interact = interact;\n\nmodule.exports = interact;\n","const Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\nconst scope = require('./scope');\nconst is = require('./utils/is');\nconst events = require('./utils/events');\n\nconst { nodeContains, matchesSelector } = require('./utils/domUtils');\n\n/*\\\n * Interactable.preventDefault\n [ method ]\n *\n * Returns or sets whether to prevent the browser's default behaviour\n * in response to pointer events. Can be set to:\n * - `'always'` to always prevent\n * - `'never'` to never prevent\n * - `'auto'` to let interact.js try to determine what would be best\n *\n - newValue (string) #optional `true`, `false` or `'auto'`\n = (string | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.preventDefault = function (newValue) {\n if (/^(always|never|auto)$/.test(newValue)) {\n this.options.preventDefault = newValue;\n return this;\n }\n\n if (is.bool(newValue)) {\n this.options.preventDefault = newValue? 'always' : 'never';\n return this;\n }\n\n return this.options.preventDefault;\n};\n\nInteractable.prototype.checkAndPreventDefault = function (event) {\n const setting = this.options.preventDefault;\n\n if (setting === 'never') { return; }\n\n if (setting === 'always') {\n event.preventDefault();\n return;\n }\n\n // setting === 'auto'\n\n // don't preventDefault if the browser supports passiveEvents\n // CSS touch-action and user-selecct should be used instead\n if (events.supportsOptions) {\n return;\n }\n\n // don't preventDefault of pointerdown events\n if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) {\n return;\n }\n\n // don't preventDefault on editable elements\n if (is.element(event.target)\n && matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) {\n return;\n }\n\n event.preventDefault();\n};\n\nfunction onInteractionEvent ({ interaction, event }) {\n if (interaction.target) {\n interaction.target.checkAndPreventDefault(event);\n }\n}\n\nfor (const eventSignal of ['down', 'move', 'up', 'cancel']) {\n Interaction.signals.on(eventSignal, onInteractionEvent);\n}\n\n// prevent native HTML5 drag on interact.js target elements\nInteraction.docEvents.dragstart = function preventNativeDrag (event) {\n for (const interaction of scope.interactions) {\n\n if (interaction.element\n && (interaction.element === event.target\n || nodeContains(interaction.element, event.target))) {\n\n interaction.target.checkAndPreventDefault(event);\n return;\n }\n }\n};\n","const scope = require('./scope');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst iFinder = require('./utils/interactionFinder');\nconst pointerEvents = require('./pointerEvents/base');\n\nconst { window } = require('./utils/window');\n\nconst toString = Object.prototype.toString;\n\nif (!window.Array.isArray) {\n window.Array.isArray = function (obj) {\n return toString.call(obj) === '[object Array]';\n };\n}\n\nif (!String.prototype.trim) {\n String.prototype.trim = function () {\n return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n };\n}\n\n// http://www.quirksmode.org/dom/events/click.html\n// >Events leading to dblclick\n//\n// IE8 doesn't fire down event before dblclick.\n// This workaround tries to fire a tap and doubletap after dblclick\nfunction onIE8Dblclick (event) {\n const eventTarget = event.target;\n const interaction = iFinder.search(event, event.type, eventTarget);\n\n if (!interaction) { return; }\n\n if (interaction.prevTap\n && event.clientX === interaction.prevTap.clientX\n && event.clientY === interaction.prevTap.clientY\n && eventTarget === interaction.prevTap.target) {\n\n interaction.downTargets[0] = eventTarget;\n interaction.downTimes [0] = new Date().getTime();\n\n pointerEvents.fire({\n interaction,\n event,\n eventTarget,\n pointer: event,\n type: 'tap',\n });\n }\n}\n\nif (browser.isIE8) {\n const selectFix = function (event) {\n for (const interaction of scope.interactions) {\n if (interaction.interacting()) {\n interaction.target.checkAndPreventDefault(event);\n }\n }\n };\n\n const onDocIE8 = function onDocIE8 ({ doc, win }, signalName) {\n const eventMethod = signalName.indexOf('listen') === 0\n ? events.add : events.remove;\n\n // For IE's lack of Event#preventDefault\n eventMethod(doc, 'selectstart', selectFix);\n\n if (pointerEvents) {\n eventMethod(doc, 'dblclick', onIE8Dblclick);\n }\n };\n\n scope.signals.on('add-document' , onDocIE8);\n scope.signals.on('remove-document', onDocIE8);\n}\n\nmodule.exports = null;\n","const InteractEvent = require('../InteractEvent');\nconst Interaction = require('../Interaction');\nconst extend = require('../utils/extend');\n\nconst modifiers = {\n names: [],\n\n setOffsets: function (arg) {\n const { interaction, pageCoords: page } = arg;\n const { target, element, startOffset } = interaction;\n const rect = target.getRect(element);\n\n if (rect) {\n startOffset.left = page.x - rect.left;\n startOffset.top = page.y - rect.top;\n\n startOffset.right = rect.right - page.x;\n startOffset.bottom = rect.bottom - page.y;\n\n if (!('width' in rect)) { rect.width = rect.right - rect.left; }\n if (!('height' in rect)) { rect.height = rect.bottom - rect.top ; }\n }\n else {\n startOffset.left = startOffset.top = startOffset.right = startOffset.bottom = 0;\n }\n\n arg.rect = rect;\n arg.interactable = target;\n arg.element = element;\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n\n arg.options = target.options[interaction.prepared.name][modifierName];\n\n if (!arg.options) {\n continue;\n }\n\n interaction.modifierOffsets[modifierName] = modifiers[modifierName].setOffset(arg);\n }\n },\n\n setAll: function (arg) {\n const { interaction, statuses, preEnd, requireEndOnly } = arg;\n const coords = extend({}, arg.pageCoords);\n const result = {\n dx: 0,\n dy: 0,\n changed: false,\n locked: false,\n shouldMove: true,\n };\n\n for (const modifierName of modifiers.names) {\n const modifier = modifiers[modifierName];\n const options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!shouldDo(options, preEnd, requireEndOnly)) { continue; }\n\n arg.status = arg.status = statuses[modifierName];\n arg.options = options;\n arg.offset = arg.interaction.modifierOffsets[modifierName];\n\n modifier.set(arg);\n\n if (arg.status.locked) {\n coords.x += arg.status.dx;\n coords.y += arg.status.dy;\n\n result.dx += arg.status.dx;\n result.dy += arg.status.dy;\n\n result.locked = true;\n }\n }\n\n // a move should be fired if:\n // - there are no modifiers enabled,\n // - no modifiers are \"locked\" i.e. have changed the pointer's coordinates, or\n // - the locked coords have changed since the last pointer move\n result.shouldMove = !arg.status || !result.locked || arg.status.changed;\n\n return result;\n },\n\n resetStatuses: function (statuses) {\n for (const modifierName of modifiers.names) {\n const status = statuses[modifierName] || {};\n\n status.dx = status.dy = 0;\n status.modifiedX = status.modifiedY = NaN;\n status.locked = false;\n status.changed = true;\n\n statuses[modifierName] = status;\n }\n\n return statuses;\n },\n\n start: function ({ interaction }, signalName) {\n const arg = {\n interaction,\n pageCoords: (signalName === 'action-resume' ?\n interaction.curCoords : interaction.startCoords).page,\n startOffset: interaction.startOffset,\n statuses: interaction.modifierStatuses,\n preEnd: false,\n requireEndOnly: false,\n };\n\n modifiers.setOffsets(arg);\n modifiers.resetStatuses(arg.statuses);\n\n arg.pageCoords = extend({}, interaction.startCoords.page);\n interaction.modifierResult = modifiers.setAll(arg);\n },\n};\n\nInteraction.signals.on('new', function (interaction) {\n interaction.startOffset = { left: 0, right: 0, top: 0, bottom: 0 };\n interaction.modifierOffsets = {};\n interaction.modifierStatuses = modifiers.resetStatuses({});\n interaction.modifierResult = null;\n});\n\nInteraction.signals.on('action-start' , modifiers.start);\nInteraction.signals.on('action-resume', modifiers.start);\n\nInteraction.signals.on('before-action-move', function ({ interaction, preEnd, interactingBeforeMove }) {\n const modifierResult = modifiers.setAll({\n interaction,\n preEnd,\n pageCoords: interaction.curCoords.page,\n statuses: interaction.modifierStatuses,\n requireEndOnly: false,\n });\n\n // don't fire an action move if a modifier would keep the event in the same\n // cordinates as before\n if (!modifierResult.shouldMove && interactingBeforeMove) {\n interaction._dontFireMove = true;\n }\n\n interaction.modifierResult = modifierResult;\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n for (let i = 0; i < modifiers.names.length; i++) {\n const options = interaction.target.options[interaction.prepared.name][modifiers.names[i]];\n\n // if the endOnly option is true for any modifier\n if (shouldDo(options, true, true)) {\n // fire a move event at the modified coordinates\n interaction.doMove({ event, preEnd: true });\n break;\n }\n }\n});\n\nInteractEvent.signals.on('set-xy', function (arg) {\n const { iEvent, interaction } = arg;\n const modifierArg = extend({}, arg);\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n modifierArg.options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!modifierArg.options) {\n continue;\n }\n\n const modifier = modifiers[modifierName];\n\n modifierArg.status = interaction.modifierStatuses[modifierName];\n\n iEvent[modifierName] = modifier.modifyCoords(modifierArg);\n }\n});\n\nfunction shouldDo (options, preEnd, requireEndOnly) {\n return (options && options.enabled\n && (preEnd || !options.endOnly)\n && (!requireEndOnly || options.endOnly));\n}\n\nmodule.exports = modifiers;\n","const modifiers = require('./index');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst restrict = {\n defaults: {\n enabled : false,\n endOnly : false,\n restriction: null,\n elementRect: null,\n },\n\n setOffset: function ({ rect, startOffset, options }) {\n const elementRect = options && options.elementRect;\n const offset = {};\n\n if (rect && elementRect) {\n offset.left = startOffset.left - (rect.width * elementRect.left);\n offset.top = startOffset.top - (rect.height * elementRect.top);\n\n offset.right = startOffset.right - (rect.width * (1 - elementRect.right));\n offset.bottom = startOffset.bottom - (rect.height * (1 - elementRect.bottom));\n }\n else {\n offset.left = offset.top = offset.right = offset.bottom = 0;\n }\n\n return offset;\n },\n\n set: function ({ pageCoords, interaction, status, options }) {\n if (!options) { return status; }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n\n const restriction = getRestrictionRect(options.restriction, interaction, page);\n\n if (!restriction) { return status; }\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n const rect = restriction;\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n const offset = interaction.modifierOffsets.restrict;\n\n // object is assumed to have\n // x, y, width, height or\n // left, top, right, bottom\n if ('x' in restriction && 'y' in restriction) {\n modifiedX = Math.max(Math.min(rect.x + rect.width - offset.right , page.x), rect.x + offset.left);\n modifiedY = Math.max(Math.min(rect.y + rect.height - offset.bottom, page.y), rect.y + offset.top );\n }\n else {\n modifiedX = Math.max(Math.min(rect.right - offset.right , page.x), rect.left + offset.left);\n modifiedY = Math.max(Math.min(rect.bottom - offset.bottom, page.y), rect.top + offset.top );\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const elementRect = options && options.elementRect;\n\n if (options && options.enabled\n && !(phase === 'start' && elementRect && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n getRestrictionRect,\n};\n\nfunction getRestrictionRect (value, interaction, page) {\n if (utils.is.function(value)) {\n return utils.resolveRectLike(value, interaction.target, interaction.element, [page.x, page.y, interaction]);\n } else {\n return utils.resolveRectLike(value, interaction.target, interaction.element);\n }\n}\n\nmodifiers.restrict = restrict;\nmodifiers.names.push('restrict');\n\ndefaultOptions.perAction.restrict = restrict.defaults;\n\nmodule.exports = restrict;\n","// This module adds the options.resize.restrictEdges setting which sets min and\n// max for the top, left, bottom and right edges of the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictEdges: {\n// inner: { top: 200, left: 200, right: 400, bottom: 400 },\n// outer: { top: 0, left: 0, right: 600, bottom: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst { getRestrictionRect } = require('./restrict');\n\nconst noInner = { top: +Infinity, left: +Infinity, bottom: -Infinity, right: -Infinity };\nconst noOuter = { top: -Infinity, left: -Infinity, bottom: +Infinity, right: +Infinity };\n\nconst restrictEdges = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n offset: null,\n },\n\n setOffset: function ({ interaction, startOffset, options }) {\n if (!options) {\n return utils.extend({}, startOffset);\n }\n\n const offset = getRestrictionRect(options.offset, interaction, interaction.startCoords.page);\n\n if (offset) {\n return {\n top: startOffset.top + offset.y,\n left: startOffset.left + offset.x,\n bottom: startOffset.bottom + offset.y,\n right: startOffset.right + offset.x,\n };\n }\n\n return startOffset;\n },\n\n set: function ({ pageCoords, interaction, status, offset, options }) {\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n const inner = rectUtils.xywhToTlbr(getRestrictionRect(options.inner, interaction, page)) || noInner;\n const outer = rectUtils.xywhToTlbr(getRestrictionRect(options.outer, interaction, page)) || noOuter;\n\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n if (edges.top) {\n modifiedY = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top);\n }\n else if (edges.bottom) {\n modifiedY = Math.max(Math.min(outer.bottom - offset.bottom, page.y), inner.bottom - offset.bottom);\n }\n if (edges.left) {\n modifiedX = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left);\n }\n else if (edges.right) {\n modifiedX = Math.max(Math.min(outer.right - offset.right, page.x), inner.right - offset.right);\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n if (options && options.enabled\n && !(phase === 'start' && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n noInner,\n noOuter,\n getRestrictionRect,\n};\n\nmodifiers.restrictEdges = restrictEdges;\nmodifiers.names.push('restrictEdges');\n\ndefaultOptions.perAction.restrictEdges = restrictEdges.defaults;\nresize.defaults.restrictEdges = restrictEdges.defaults;\n\nmodule.exports = restrictEdges;\n","// This module adds the options.resize.restrictSize setting which sets min and\n// max width and height for the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictSize: {\n// min: { width: -600, height: -600 },\n// max: { width: 600, height: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst restrictEdges = require('./restrictEdges');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst noMin = { width: -Infinity, height: -Infinity };\nconst noMax = { width: +Infinity, height: +Infinity };\n\nconst restrictSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n },\n\n setOffset: function ({ interaction }) {\n return interaction.startOffset;\n },\n\n set: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const rect = rectUtils.xywhToTlbr(interaction.resizeRects.inverted);\n\n const minSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.min, interaction)) || noMin;\n const maxSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.max, interaction)) || noMax;\n\n arg.options = {\n enabled: options.enabled,\n endOnly: options.endOnly,\n inner: utils.extend({}, restrictEdges.noInner),\n outer: utils.extend({}, restrictEdges.noOuter),\n };\n\n if (edges.top) {\n arg.options.inner.top = rect.bottom - minSize.height;\n arg.options.outer.top = rect.bottom - maxSize.height;\n }\n else if (edges.bottom) {\n arg.options.inner.bottom = rect.top + minSize.height;\n arg.options.outer.bottom = rect.top + maxSize.height;\n }\n if (edges.left) {\n arg.options.inner.left = rect.right - minSize.width;\n arg.options.outer.left = rect.right - maxSize.width;\n }\n else if (edges.right) {\n arg.options.inner.right = rect.left + minSize.width;\n arg.options.outer.right = rect.left + maxSize.width;\n }\n\n restrictEdges.set(arg);\n },\n\n modifyCoords: restrictEdges.modifyCoords,\n};\n\nmodifiers.restrictSize = restrictSize;\nmodifiers.names.push('restrictSize');\n\ndefaultOptions.perAction.restrictSize = restrictSize.defaults;\nresize.defaults.restrictSize = restrictSize.defaults;\n\nmodule.exports = restrictSize;\n","const modifiers = require('./index');\nconst interact = require('../interact');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst snap = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n\n relativePoints: null,\n },\n\n setOffset: function ({ interaction, interactable, element, rect, startOffset, options }) {\n const offsets = [];\n const optionsOrigin = utils.rectToXY(utils.resolveRectLike(options.origin));\n const origin = optionsOrigin || utils.getOriginXY(interactable, element, interaction.prepared.name);\n options = options || interactable.options[interaction.prepared.name].snap || {};\n\n let snapOffset;\n\n if (options.offset === 'startCoords') {\n snapOffset = {\n x: interaction.startCoords.page.x - origin.x,\n y: interaction.startCoords.page.y - origin.y,\n };\n }\n else {\n const offsetRect = utils.resolveRectLike(options.offset, interactable, element, [interaction]);\n\n snapOffset = utils.rectToXY(offsetRect) || { x: 0, y: 0 };\n }\n\n if (rect && options.relativePoints && options.relativePoints.length) {\n for (const { x: relativeX, y: relativeY } of options.relativePoints) {\n offsets.push({\n x: startOffset.left - (rect.width * relativeX) + snapOffset.x,\n y: startOffset.top - (rect.height * relativeY) + snapOffset.y,\n });\n }\n }\n else {\n offsets.push(snapOffset);\n }\n\n return offsets;\n },\n\n set: function ({ interaction, pageCoords, status, options, offset: offsets }) {\n const targets = [];\n let target;\n let page;\n let i;\n\n if (status.useStatusXY) {\n page = { x: status.x, y: status.y };\n }\n else {\n const origin = utils.getOriginXY(interaction.target, interaction.element, interaction.prepared.name);\n\n page = utils.extend({}, pageCoords);\n\n page.x -= origin.x;\n page.y -= origin.y;\n }\n\n status.realX = page.x;\n status.realY = page.y;\n\n let len = options.targets? options.targets.length : 0;\n\n for (const { x: offsetX, y: offsetY } of offsets) {\n const relativeX = page.x - offsetX;\n const relativeY = page.y - offsetY;\n\n for (const snapTarget of options.targets) {\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n targets.push({\n x: utils.is.number(target.x) ? (target.x + offsetX) : relativeX,\n y: utils.is.number(target.y) ? (target.y + offsetY) : relativeY,\n\n range: utils.is.number(target.range)? target.range: options.range,\n });\n }\n }\n\n const closest = {\n target: null,\n inRange: false,\n distance: 0,\n range: 0,\n dx: 0,\n dy: 0,\n };\n\n for (i = 0, len = targets.length; i < len; i++) {\n target = targets[i];\n\n const range = target.range;\n const dx = target.x - page.x;\n const dy = target.y - page.y;\n const distance = utils.hypot(dx, dy);\n let inRange = distance <= range;\n\n // Infinite targets count as being out of range\n // compared to non infinite ones that are in range\n if (range === Infinity && closest.inRange && closest.range !== Infinity) {\n inRange = false;\n }\n\n if (!closest.target || (inRange\n // is the closest target in range?\n ? (closest.inRange && range !== Infinity\n // the pointer is relatively deeper in this target\n ? distance / range < closest.distance / closest.range\n // this target has Infinite range and the closest doesn't\n : (range === Infinity && closest.range !== Infinity)\n // OR this target is closer that the previous closest\n || distance < closest.distance)\n // The other is not in range and the pointer is closer to this target\n : (!closest.inRange && distance < closest.distance))) {\n\n closest.target = target;\n closest.distance = distance;\n closest.range = range;\n closest.inRange = inRange;\n closest.dx = dx;\n closest.dy = dy;\n\n status.range = range;\n }\n }\n\n let snapChanged;\n\n if (closest.target) {\n snapChanged = (status.modifiedX !== closest.target.x || status.modifiedY !== closest.target.y);\n\n status.modifiedX = closest.target.x;\n status.modifiedY = closest.target.y;\n }\n else {\n snapChanged = true;\n\n status.modifiedX = NaN;\n status.modifiedY = NaN;\n }\n\n status.dx = closest.dx;\n status.dy = closest.dy;\n\n status.changed = (snapChanged || (closest.inRange && !status.locked));\n status.locked = closest.inRange;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const relativePoints = options && options.relativePoints;\n\n if (options && options.enabled\n && !(phase === 'start' && relativePoints && relativePoints.length)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n }\n\n return {\n range : status.range,\n locked : status.locked,\n x : status.modifiedX,\n y : status.modifiedY,\n realX : status.realX,\n realY : status.realY,\n dx : status.dx,\n dy : status.dy,\n };\n }\n },\n};\n\ninteract.createSnapGrid = function (grid) {\n return function (x, y) {\n const limits = grid.limits || {\n left : -Infinity,\n right : Infinity,\n top : -Infinity,\n bottom: Infinity,\n };\n let offsetX = 0;\n let offsetY = 0;\n\n if (utils.is.object(grid.offset)) {\n offsetX = grid.offset.x;\n offsetY = grid.offset.y;\n }\n\n const gridx = Math.round((x - offsetX) / grid.x);\n const gridy = Math.round((y - offsetY) / grid.y);\n\n const newX = Math.max(limits.left, Math.min(limits.right , gridx * grid.x + offsetX));\n const newY = Math.max(limits.top , Math.min(limits.bottom, gridy * grid.y + offsetY));\n\n return {\n x: newX,\n y: newY,\n range: grid.range,\n };\n };\n};\n\nmodifiers.snap = snap;\nmodifiers.names.push('snap');\n\ndefaultOptions.perAction.snap = snap.defaults;\n\nmodule.exports = snap;\n","// This module allows snapping of the size of targets during resize\n// interactions.\n\nconst modifiers = require('./index');\nconst snap = require('./snap');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\nconst utils = require('../utils/');\n\nconst snapSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n },\n\n setOffset: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.edges;\n\n if (!edges) { return; }\n\n arg.options = {\n relativePoints: [{\n x: edges.left? 0 : 1,\n y: edges.top ? 0 : 1,\n }],\n origin: { x: 0, y: 0 },\n offset: 'self',\n range: options.range,\n };\n\n const offsets = snap.setOffset(arg);\n arg.options = options;\n\n return offsets;\n },\n\n set: function (arg) {\n const { interaction, options, offset, pageCoords } = arg;\n const page = utils.extend({}, pageCoords);\n const relativeX = page.x - offset[0].x;\n const relativeY = page.y - offset[0].y;\n\n arg.options = utils.extend({}, options);\n arg.options.targets = [];\n\n for (const snapTarget of options.targets) {\n let target;\n\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n if ('width' in target && 'height' in target) {\n target.x = target.width;\n target.y = target.height;\n }\n\n arg.options.targets.push(target);\n }\n\n snap.set(arg);\n },\n\n modifyCoords: function (arg) {\n const { options } = arg;\n\n arg.options = utils.extend({}, options);\n arg.options.enabled = options.enabled;\n arg.options.relativePoints = [null];\n\n snap.modifyCoords(arg);\n },\n};\n\nmodifiers.snapSize = snapSize;\nmodifiers.names.push('snapSize');\n\ndefaultOptions.perAction.snapSize = snapSize.defaults;\nresize.defaults.snapSize = snapSize.defaults;\n\nmodule.exports = snapSize;\n","const pointerUtils = require('../utils/pointerUtils');\n\nmodule.exports = class PointerEvent {\n constructor (type, pointer, event, eventTarget, interaction) {\n pointerUtils.pointerExtend(this, event);\n\n if (event !== pointer) {\n pointerUtils.pointerExtend(this, pointer);\n }\n\n this.interaction = interaction;\n\n this.timeStamp = new Date().getTime();\n this.originalEvent = event;\n this.type = type;\n this.pointerId = pointerUtils.getPointerId(pointer);\n this.pointerType = pointerUtils.getPointerType(pointer, interaction);\n this.target = eventTarget;\n this.currentTarget = null;\n\n if (type === 'tap') {\n const pointerIndex = interaction.getPointerIndex(pointer);\n this.dt = this.timeStamp - interaction.downTimes[pointerIndex];\n\n const interval = this.timeStamp - interaction.tapTime;\n\n this.double = !!(interaction.prevTap\n && interaction.prevTap.type !== 'doubletap'\n && interaction.prevTap.target === this.target\n && interval < 500);\n }\n else if (type === 'doubletap') {\n this.dt = pointer.timeStamp - interaction.tapTime;\n }\n }\n\n subtractOrigin ({ x: originX, y: originY }) {\n this.pageX -= originX;\n this.pageY -= originY;\n this.clientX -= originX;\n this.clientY -= originY;\n\n return this;\n }\n\n addOrigin ({ x: originX, y: originY }) {\n this.pageX += originX;\n this.pageY += originY;\n this.clientX += originX;\n this.clientY += originY;\n\n return this;\n }\n\n preventDefault () {\n this.originalEvent.preventDefault();\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n};\n","const PointerEvent = require('./PointerEvent');\nconst Interaction = require('../Interaction');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst defaults = require('../defaultOptions');\nconst signals = require('../utils/Signals').new();\nconst { filter } = require('../utils/arr');\n\nconst simpleSignals = [ 'down', 'up', 'cancel' ];\nconst simpleEvents = [ 'down', 'up', 'cancel' ];\n\nconst pointerEvents = {\n PointerEvent,\n fire,\n collectEventTargets,\n signals,\n defaults: {\n holdDuration: 600,\n ignoreFrom : null,\n allowFrom : null,\n origin : { x: 0, y: 0 },\n },\n types: [\n 'down',\n 'move',\n 'up',\n 'cancel',\n 'tap',\n 'doubletap',\n 'hold',\n ],\n};\n\nfunction fire (arg) {\n const {\n interaction, pointer, event, eventTarget,\n type = arg.pointerEvent.type,\n targets = collectEventTargets(arg),\n pointerEvent = new PointerEvent(type, pointer, event, eventTarget, interaction),\n } = arg;\n\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n targets,\n type,\n pointerEvent,\n };\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n\n for (const prop in target.props || {}) {\n pointerEvent[prop] = target.props[prop];\n }\n\n const origin = utils.getOriginXY(target.eventable, target.element);\n\n pointerEvent.subtractOrigin(origin);\n pointerEvent.eventable = target.eventable;\n pointerEvent.currentTarget = target.element;\n\n target.eventable.fire(pointerEvent);\n\n pointerEvent.addOrigin(origin);\n\n if (pointerEvent.immediatePropagationStopped\n || (pointerEvent.propagationStopped\n && (i + 1) < targets.length && targets[i + 1].element !== pointerEvent.currentTarget)) {\n break;\n }\n }\n\n signals.fire('fired', signalArg);\n\n if (type === 'tap') {\n // if pointerEvent should make a double tap, create and fire a doubletap\n // PointerEvent and use that as the prevTap\n const prevTap = pointerEvent.double\n ? fire({\n interaction, pointer, event, eventTarget,\n type: 'doubletap',\n })\n : pointerEvent;\n\n interaction.prevTap = prevTap;\n interaction.tapTime = prevTap.timeStamp;\n }\n\n return pointerEvent;\n}\n\nfunction collectEventTargets ({ interaction, pointer, event, eventTarget, type }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n // do not fire a tap event if the pointer was moved before being lifted\n if (type === 'tap' && (interaction.pointerWasMoved\n // or if the pointerup target is different to the pointerdown target\n || !(interaction.downTargets[pointerIndex] && interaction.downTargets[pointerIndex] === eventTarget))) {\n return [];\n }\n\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n path,\n targets: [],\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (type === 'hold') {\n signalArg.targets = filter(signalArg.targets, target =>\n target.eventable.options.holdDuration === interaction.holdTimers[pointerIndex].duration);\n }\n\n return signalArg.targets;\n}\n\nInteraction.signals.on('update-pointer-down', function ({ interaction, pointerIndex }) {\n interaction.holdTimers[pointerIndex] = { duration: Infinity, timeout: null };\n});\n\nInteraction.signals.on('remove-pointer', function ({ interaction, pointerIndex }) {\n interaction.holdTimers.splice(pointerIndex, 1);\n});\n\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget, duplicateMove }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n if (!duplicateMove && (!interaction.pointerIsDown || interaction.pointerWasMoved)) {\n if (interaction.pointerIsDown) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n\n fire({\n interaction, pointer, event, eventTarget,\n type: 'move',\n });\n }\n});\n\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget, pointerIndex }) {\n // copy event to be used in timeout for IE8\n const eventCopy = browser.isIE8? utils.extend({}, event) : event;\n\n const timer = interaction.holdTimers[pointerIndex];\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'hold',\n targets: [],\n path,\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (!signalArg.targets.length) { return; }\n\n let minDuration = Infinity;\n\n for (let i = 0; i < signalArg.targets.length; i++) {\n const target = signalArg.targets[i];\n const holdDuration = target.eventable.options.holdDuration;\n\n if (holdDuration < minDuration) {\n minDuration = holdDuration;\n }\n }\n\n timer.duration = minDuration;\n timer.timeout = setTimeout(function () {\n fire({\n interaction, eventCopy, eventTarget,\n pointer: browser.isIE8? eventCopy : pointer,\n type: 'hold',\n });\n }, minDuration);\n});\n\nInteraction.signals.on('up', ({ interaction, pointer, event, eventTarget }) => {\n if (!interaction.pointerWasMoved) {\n fire({ interaction, eventTarget, pointer, event, type: 'tap' });\n }\n});\n\n['up', 'cancel'].forEach(function (signalName) {\n Interaction.signals.on(signalName, function ({ interaction, pointerIndex }) {\n if (interaction.holdTimers[pointerIndex]) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n });\n});\n\nfunction createSignalListener (type) {\n return function ({ interaction, pointer, event, eventTarget }) {\n fire({ interaction, eventTarget, pointer, event, type });\n };\n}\n\nfor (let i = 0; i < simpleSignals.length; i++) {\n Interaction.signals.on(simpleSignals[i], createSignalListener(simpleEvents[i]));\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.prevTap = null; // the most recent tap event on this interaction\n interaction.tapTime = 0; // time of the most recent tap event\n interaction.holdTimers = []; // [{ duration, timeout }]\n});\n\ndefaults.pointerEvents = pointerEvents.defaults;\nmodule.exports = pointerEvents;\n","const pointerEvents = require('./base');\nconst Interaction = require('../Interaction');\n\npointerEvents.signals.on('new', onNew);\npointerEvents.signals.on('fired', onFired);\n\nfor (const signal of ['move', 'up', 'cancel', 'endall']) {\n Interaction.signals.on(signal, endHoldRepeat);\n}\n\nfunction onNew ({ pointerEvent }) {\n if (pointerEvent.type !== 'hold') { return; }\n\n pointerEvent.count = (pointerEvent.count || 0) + 1;\n}\n\nfunction onFired ({ interaction, pointerEvent, eventTarget, targets }) {\n if (pointerEvent.type !== 'hold' || !targets.length) { return; }\n\n // get the repeat interval from the first eventable\n const interval = targets[0].eventable.options.holdRepeatInterval;\n\n // don't repeat if the interval is 0 or less\n if (interval <= 0) { return; }\n\n // set a timeout to fire the holdrepeat event\n interaction.holdIntervalHandle = setTimeout(function () {\n pointerEvents.fire({\n interaction,\n eventTarget,\n type: 'hold',\n pointer: pointerEvent,\n event: pointerEvent,\n });\n }, interval);\n}\n\nfunction endHoldRepeat ({ interaction }) {\n // set the interaction's holdStopTime property\n // to stop further holdRepeat events\n if (interaction.holdIntervalHandle) {\n clearInterval(interaction.holdIntervalHandle);\n interaction.holdIntervalHandle = null;\n }\n}\n\n// don't repeat by default\npointerEvents.defaults.holdRepeatInterval = 0;\npointerEvents.types.push('holdrepeat');\n\nmodule.exports = {\n onNew,\n onFired,\n endHoldRepeat,\n};\n","const pointerEvents = require('./base');\nconst Interactable = require('../Interactable');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\nconst scope = require('../scope');\nconst extend = require('../utils/extend');\nconst { merge } = require('../utils/arr');\n\npointerEvents.signals.on('collect-targets', function ({ targets, element, type, eventTarget }) {\n function collectSelectors (interactable, selector, context) {\n const els = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && is.element(element)\n && domUtils.matchesSelector(element, selector, els)\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n const interactable = scope.interactables.get(element);\n\n if (interactable) {\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n scope.interactables.forEachSelector(collectSelectors, element);\n});\n\nInteractable.signals.on('new', function ({ interactable }) {\n interactable.events.getRect = function (element) {\n return interactable.getRect(element);\n };\n});\n\nInteractable.signals.on('set', function ({ interactable, options }) {\n extend(interactable.events.options, pointerEvents.defaults);\n extend(interactable.events.options, options);\n});\n\nmerge(Interactable.eventTypes, pointerEvents.types);\n\nInteractable.prototype.pointerEvents = function (options) {\n extend(this.events.options, options);\n\n return this;\n};\n\nconst __backCompatOption = Interactable.prototype._backCompatOption;\n\nInteractable.prototype._backCompatOption = function (optionName, newValue) {\n const ret = __backCompatOption.call(this, optionName, newValue);\n\n if (ret === this) {\n this.events.options[optionName] = newValue;\n }\n\n return ret;\n};\n\nInteractable.settingsMethods.push('pointerEvents');\n","const utils = require('./utils');\nconst events = require('./utils/events');\nconst signals = require('./utils/Signals').new();\n\nconst scope = {\n signals,\n events,\n utils,\n\n // main document\n document: require('./utils/domObjects').document,\n // all documents being listened to\n documents: [],\n\n addDocument: function (doc, win) {\n // do nothing if document is already known\n if (utils.contains(scope.documents, doc)) { return false; }\n\n win = win || scope.getWindow(doc);\n\n scope.documents.push(doc);\n events.documents.push(doc);\n\n // don't add an unload event for the main document\n // so that the page may be cached in browser history\n if (doc !== scope.document) {\n events.add(win, 'unload', scope.onWindowUnload);\n }\n\n signals.fire('add-document', { doc, win });\n },\n\n removeDocument: function (doc, win) {\n const index = utils.indexOf(scope.documents, doc);\n\n win = win || scope.getWindow(doc);\n\n events.remove(win, 'unload', scope.onWindowUnload);\n\n scope.documents.splice(index, 1);\n events.documents.splice(index, 1);\n\n signals.fire('remove-document', { win, doc });\n },\n\n onWindowUnload: function () {\n scope.removeDocument(this.document, this);\n },\n};\n\nmodule.exports = scope;\n","const { indexOf } = require('./arr');\n\nclass Signals {\n constructor () {\n this.listeners = {\n // signalName: [listeners],\n };\n }\n\n on (name, listener) {\n if (!this.listeners[name]) {\n this.listeners[name] = [listener];\n return;\n }\n\n this.listeners[name].push(listener);\n }\n\n off (name, listener) {\n if (!this.listeners[name]) { return; }\n\n const index = indexOf(this.listeners[name], listener);\n\n if (index !== -1) {\n this.listeners[name].splice(index, 1);\n }\n }\n\n fire (name, arg) {\n const targetListeners = this.listeners[name];\n\n if (!targetListeners) { return; }\n\n for (let i = 0; i < targetListeners.length; i++) {\n if (targetListeners[i](arg, name) === false) {\n return;\n }\n }\n }\n}\n\nSignals.new = function () {\n return new Signals();\n};\n\nmodule.exports = Signals;\n","function indexOf (array, target) {\n for (let i = 0, len = array.length; i < len; i++) {\n if (array[i] === target) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction contains (array, target) {\n return indexOf(array, target) !== -1;\n}\n\nfunction merge (target, source) {\n for (let i = 0; i < source.length; i++) {\n target.push(source[i]);\n }\n\n return target;\n}\n\nfunction filter (array, test) {\n const result = [];\n\n for (let i = 0; i < array.length; i++) {\n if (test(array[i])) {\n result.push(array[i]);\n }\n }\n\n return result;\n}\n\nmodule.exports = {\n indexOf,\n contains,\n merge,\n filter,\n};\n","const { window } = require('./window');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst Element = domObjects.Element;\nconst navigator = window.navigator;\n\nconst browser = {\n // Does the browser support touch input?\n supportsTouch: !!(('ontouchstart' in window) || is.function(window.DocumentTouch)\n && domObjects.document instanceof window.DocumentTouch),\n\n // Does the browser support PointerEvents\n supportsPointerEvent: !!domObjects.PointerEvent,\n\n isIE8: ('attachEvent' in window) && !('addEventListener' in window),\n\n // Opera Mobile must be handled differently\n isOperaMobile: (navigator.appName === 'Opera'\n && browser.supportsTouch\n && navigator.userAgent.match('Presto')),\n\n // scrolling doesn't change the result of getClientRects on iOS 7\n isIOS7: (/iP(hone|od|ad)/.test(navigator.platform)\n && /OS 7[^\\d]/.test(navigator.appVersion)),\n\n isIe9OrOlder: /MSIE (8|9)/.test(navigator.userAgent),\n\n // prefix matchesSelector\n prefixedMatchesSelector: 'matches' in Element.prototype\n ? 'matches': 'webkitMatchesSelector' in Element.prototype\n ? 'webkitMatchesSelector': 'mozMatchesSelector' in Element.prototype\n ? 'mozMatchesSelector': 'oMatchesSelector' in Element.prototype\n ? 'oMatchesSelector': 'msMatchesSelector',\n\n useMatchesSelectorPolyfill: false,\n\n pEventTypes: (domObjects.PointerEvent\n ? (domObjects.PointerEvent === window.MSPointerEvent\n ? {\n up: 'MSPointerUp',\n down: 'MSPointerDown',\n over: 'mouseover',\n out: 'mouseout',\n move: 'MSPointerMove',\n cancel: 'MSPointerCancel',\n }\n : {\n up: 'pointerup',\n down: 'pointerdown',\n over: 'pointerover',\n out: 'pointerout',\n move: 'pointermove',\n cancel: 'pointercancel',\n })\n : null),\n\n // because Webkit and Opera still use 'mousewheel' event type\n wheelEvent: 'onmousewheel' in domObjects.document? 'mousewheel': 'wheel',\n\n};\n\nbrowser.useMatchesSelectorPolyfill = !is.function(Element.prototype[browser.prefixedMatchesSelector]);\n\nmodule.exports = browser;\n","const domObjects = {};\nconst win = require('./window').window;\n\nfunction blank () {}\n\ndomObjects.document = win.document;\ndomObjects.DocumentFragment = win.DocumentFragment || blank;\ndomObjects.SVGElement = win.SVGElement || blank;\ndomObjects.SVGSVGElement = win.SVGSVGElement || blank;\ndomObjects.SVGElementInstance = win.SVGElementInstance || blank;\ndomObjects.Element = win.Element || blank;\ndomObjects.HTMLElement = win.HTMLElement || domObjects.Element;\n\ndomObjects.Event = win.Event;\ndomObjects.Touch = win.Touch || blank;\ndomObjects.PointerEvent = (win.PointerEvent || win.MSPointerEvent);\n\nmodule.exports = domObjects;\n","const win = require('./window');\nconst browser = require('./browser');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst domUtils = {\n nodeContains: function (parent, child) {\n while (child) {\n if (child === parent) {\n return true;\n }\n\n child = child.parentNode;\n }\n\n return false;\n },\n\n closest: function (element, selector) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) { return element; }\n\n element = domUtils.parentNode(element);\n }\n\n return null;\n },\n\n parentNode: function (node) {\n let parent = node.parentNode;\n\n if (is.docFrag(parent)) {\n // skip past #shado-root fragments\n while ((parent = parent.host) && is.docFrag(parent)) {\n continue;\n }\n\n return parent;\n }\n\n return parent;\n },\n\n // taken from http://tanalin.com/en/blog/2012/12/matches-selector-ie8/ and modified\n matchesSelectorPolyfill: browser.useMatchesSelectorPolyfill\n ? function (element, selector, elems) {\n elems = elems || element.parentNode.querySelectorAll(selector);\n\n for (let i = 0, len = elems.length; i < len; i++) {\n if (elems[i] === element) {\n return true;\n }\n }\n\n return false;\n }\n : null,\n\n matchesSelector: function (element, selector, nodeList) {\n if (browser.useMatchesSelectorPolyfill) {\n return domUtils.matchesSelectorPolyfill(element, selector, nodeList);\n }\n\n // remove /deep/ from selectors if shadowDOM polyfill is used\n if (win.window !== win.realWindow) {\n selector = selector.replace(/\\/deep\\//g, ' ');\n }\n\n return element[browser.prefixedMatchesSelector](selector);\n },\n\n // Test for the element that's \"above\" all other qualifiers\n indexOfDeepestElement: function (elements) {\n let deepestZoneParents = [];\n let dropzoneParents = [];\n let dropzone;\n let deepestZone = elements[0];\n let index = deepestZone? 0: -1;\n let parent;\n let child;\n let i;\n let n;\n\n for (i = 1; i < elements.length; i++) {\n dropzone = elements[i];\n\n // an element might belong to multiple selector dropzones\n if (!dropzone || dropzone === deepestZone) {\n continue;\n }\n\n if (!deepestZone) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n // check if the deepest or current are document.documentElement or document.rootElement\n // - if the current dropzone is, do nothing and continue\n if (dropzone.parentNode === dropzone.ownerDocument) {\n continue;\n }\n // - if deepest is, update with the current dropzone and continue to next\n else if (deepestZone.parentNode === dropzone.ownerDocument) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n if (!deepestZoneParents.length) {\n parent = deepestZone;\n while (parent.parentNode && parent.parentNode !== parent.ownerDocument) {\n deepestZoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n }\n\n // if this element is an svg element and the current deepest is\n // an HTMLElement\n if (deepestZone instanceof domObjects.HTMLElement\n && dropzone instanceof domObjects.SVGElement\n && !(dropzone instanceof domObjects.SVGSVGElement)) {\n\n if (dropzone === deepestZone.parentNode) {\n continue;\n }\n\n parent = dropzone.ownerSVGElement;\n }\n else {\n parent = dropzone;\n }\n\n dropzoneParents = [];\n\n while (parent.parentNode !== parent.ownerDocument) {\n dropzoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n\n n = 0;\n\n // get (position of last common ancestor) + 1\n while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) {\n n++;\n }\n\n const parents = [\n dropzoneParents[n - 1],\n dropzoneParents[n],\n deepestZoneParents[n],\n ];\n\n child = parents[0].lastChild;\n\n while (child) {\n if (child === parents[1]) {\n deepestZone = dropzone;\n index = i;\n deepestZoneParents = [];\n\n break;\n }\n else if (child === parents[2]) {\n break;\n }\n\n child = child.previousSibling;\n }\n }\n\n return index;\n },\n\n matchesUpTo: function (element, selector, limit) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) {\n return true;\n }\n\n element = domUtils.parentNode(element);\n\n if (element === limit) {\n return domUtils.matchesSelector(element, selector);\n }\n }\n\n return false;\n },\n\n getActualElement: function (element) {\n return (element instanceof domObjects.SVGElementInstance\n ? element.correspondingUseElement\n : element);\n },\n\n getScrollXY: function (relevantWindow) {\n relevantWindow = relevantWindow || win.window;\n return {\n x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft,\n y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop,\n };\n },\n\n getElementClientRect: function (element) {\n const clientRect = (element instanceof domObjects.SVGElement\n ? element.getBoundingClientRect()\n : element.getClientRects()[0]);\n\n return clientRect && {\n left : clientRect.left,\n right : clientRect.right,\n top : clientRect.top,\n bottom: clientRect.bottom,\n width : clientRect.width || clientRect.right - clientRect.left,\n height: clientRect.height || clientRect.bottom - clientRect.top,\n };\n },\n\n getElementRect: function (element) {\n const clientRect = domUtils.getElementClientRect(element);\n\n if (!browser.isIOS7 && clientRect) {\n const scroll = domUtils.getScrollXY(win.getWindow(element));\n\n clientRect.left += scroll.x;\n clientRect.right += scroll.x;\n clientRect.top += scroll.y;\n clientRect.bottom += scroll.y;\n }\n\n return clientRect;\n },\n\n getPath: function (element) {\n const path = [];\n\n while (element) {\n path.push(element);\n element = domUtils.parentNode(element);\n }\n\n return path;\n },\n\n trySelector: value => {\n if (!is.string(value)) { return false; }\n\n // an exception will be raised if it is invalid\n domObjects.document.querySelector(value);\n return true;\n },\n};\n\nmodule.exports = domUtils;\n","const is = require('./is');\nconst domUtils = require('./domUtils');\nconst pExtend = require('./pointerExtend');\n\nconst { window, getWindow } = require('./window');\nconst { indexOf, contains } = require('./arr');\n\nconst useAttachEvent = ('attachEvent' in window) && !('addEventListener' in window);\nconst addEvent = useAttachEvent? 'attachEvent': 'addEventListener';\nconst removeEvent = useAttachEvent? 'detachEvent': 'removeEventListener';\nconst on = useAttachEvent? 'on': '';\n\nconst elements = [];\nconst targets = [];\nconst attachedListeners = [];\n\n// {\n// type: {\n// selectors: ['selector', ...],\n// contexts : [document, ...],\n// listeners: [[listener, capture, passive], ...]\n// }\n// }\nconst delegatedEvents = {};\n\nconst documents = [];\n\nconst supportsOptions = !useAttachEvent && (() => {\n let supported = false;\n\n window.document.createElement('div').addEventListener('test', null, {\n get capture () { supported = true; },\n });\n\n return supported;\n})();\n\nfunction add (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n let elementIndex = indexOf(elements, element);\n let target = targets[elementIndex];\n\n if (!target) {\n target = {\n events: {},\n typeCount: 0,\n };\n\n elementIndex = elements.push(element) - 1;\n targets.push(target);\n\n attachedListeners.push(useAttachEvent\n ? {\n supplied: [],\n wrapped : [],\n useCount: [],\n }\n : null);\n }\n\n if (!target.events[type]) {\n target.events[type] = [];\n target.typeCount++;\n }\n\n if (!contains(target.events[type], listener)) {\n let ret;\n\n if (useAttachEvent) {\n const { supplied, wrapped, useCount } = attachedListeners[elementIndex];\n const listenerIndex = indexOf(supplied, listener);\n\n const wrappedListener = wrapped[listenerIndex] || function (event) {\n if (!event.immediatePropagationStopped) {\n event.target = event.srcElement;\n event.currentTarget = element;\n\n event.preventDefault = event.preventDefault || preventDef;\n event.stopPropagation = event.stopPropagation || stopProp;\n event.stopImmediatePropagation = event.stopImmediatePropagation || stopImmProp;\n\n if (/mouse|click/.test(event.type)) {\n event.pageX = event.clientX + getWindow(element).document.documentElement.scrollLeft;\n event.pageY = event.clientY + getWindow(element).document.documentElement.scrollTop;\n }\n\n listener(event);\n }\n };\n\n ret = element[addEvent](on + type, wrappedListener, !!options.capture);\n\n if (listenerIndex === -1) {\n supplied.push(listener);\n wrapped.push(wrappedListener);\n useCount.push(1);\n }\n else {\n useCount[listenerIndex]++;\n }\n }\n else {\n ret = element[addEvent](type, listener, supportsOptions? options : !!options.capture);\n }\n target.events[type].push(listener);\n\n return ret;\n }\n}\n\nfunction remove (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const elementIndex = indexOf(elements, element);\n const target = targets[elementIndex];\n\n if (!target || !target.events) {\n return;\n }\n\n let wrappedListener = listener;\n let listeners;\n let listenerIndex;\n\n if (useAttachEvent) {\n listeners = attachedListeners[elementIndex];\n listenerIndex = indexOf(listeners.supplied, listener);\n wrappedListener = listeners.wrapped[listenerIndex];\n }\n\n if (type === 'all') {\n for (type in target.events) {\n if (target.events.hasOwnProperty(type)) {\n remove(element, type, 'all');\n }\n }\n return;\n }\n\n if (target.events[type]) {\n const len = target.events[type].length;\n\n if (listener === 'all') {\n for (let i = 0; i < len; i++) {\n remove(element, type, target.events[type][i], options);\n }\n return;\n }\n else {\n for (let i = 0; i < len; i++) {\n if (target.events[type][i] === listener) {\n element[removeEvent](on + type, wrappedListener, supportsOptions? options : !!options.capture);\n target.events[type].splice(i, 1);\n\n if (useAttachEvent && listeners) {\n listeners.useCount[listenerIndex]--;\n if (listeners.useCount[listenerIndex] === 0) {\n listeners.supplied.splice(listenerIndex, 1);\n listeners.wrapped.splice(listenerIndex, 1);\n listeners.useCount.splice(listenerIndex, 1);\n }\n }\n\n break;\n }\n }\n }\n\n if (target.events[type] && target.events[type].length === 0) {\n target.events[type] = null;\n target.typeCount--;\n }\n }\n\n if (!target.typeCount) {\n targets.splice(elementIndex, 1);\n elements.splice(elementIndex, 1);\n attachedListeners.splice(elementIndex, 1);\n }\n}\n\nfunction addDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n if (!delegatedEvents[type]) {\n delegatedEvents[type] = {\n selectors: [],\n contexts : [],\n listeners: [],\n };\n\n // add delegate listener functions\n for (let i = 0; i < documents.length; i++) {\n add(documents[i], type, delegateListener);\n add(documents[i], type, delegateUseCapture, true);\n }\n }\n\n const delegated = delegatedEvents[type];\n let index;\n\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n break;\n }\n }\n\n if (index === -1) {\n index = delegated.selectors.length;\n\n delegated.selectors.push(selector);\n delegated.contexts .push(context);\n delegated.listeners.push([]);\n }\n\n // keep listener and capture and passive flags\n delegated.listeners[index].push([listener, !!options.capture, options.passive]);\n}\n\nfunction removeDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const delegated = delegatedEvents[type];\n let matchFound = false;\n let index;\n\n if (!delegated) { return; }\n\n // count from last index of delegated to 0\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n // look for matching selector and context Node\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n\n const listeners = delegated.listeners[index];\n\n // each item of the listeners array is an array: [function, capture, passive]\n for (let i = listeners.length - 1; i >= 0; i--) {\n const [fn, capture, passive] = listeners[i];\n\n // check if the listener functions and capture and passive flags match\n if (fn === listener && capture === !!options.capture && passive === options.passive) {\n // remove the listener from the array of listeners\n listeners.splice(i, 1);\n\n // if all listeners for this interactable have been removed\n // remove the interactable from the delegated arrays\n if (!listeners.length) {\n delegated.selectors.splice(index, 1);\n delegated.contexts .splice(index, 1);\n delegated.listeners.splice(index, 1);\n\n // remove delegate function from context\n remove(context, type, delegateListener);\n remove(context, type, delegateUseCapture, true);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegatedEvents[type] = null;\n }\n }\n\n // only remove one listener\n matchFound = true;\n break;\n }\n }\n\n if (matchFound) { break; }\n }\n }\n}\n\n// bound to the interactable context when a DOM event\n// listener is added to a selector interactable\nfunction delegateListener (event, optionalArg) {\n const options = getOptions(optionalArg);\n const fakeEvent = {};\n const delegated = delegatedEvents[event.type];\n const eventTarget = (domUtils.getActualElement(event.path\n ? event.path[0]\n : event.target));\n let element = eventTarget;\n\n // duplicate the event so that currentTarget can be changed\n pExtend(fakeEvent, event);\n\n fakeEvent.originalEvent = event;\n fakeEvent.preventDefault = preventOriginalDefault;\n\n // climb up document tree looking for selector matches\n while (is.element(element)) {\n for (let i = 0; i < delegated.selectors.length; i++) {\n const selector = delegated.selectors[i];\n const context = delegated.contexts[i];\n\n if (domUtils.matchesSelector(element, selector)\n && domUtils.nodeContains(context, eventTarget)\n && domUtils.nodeContains(context, element)) {\n\n const listeners = delegated.listeners[i];\n\n fakeEvent.currentTarget = element;\n\n for (let j = 0; j < listeners.length; j++) {\n const [fn, capture, passive] = listeners[j];\n\n if (capture === !!options.capture && passive === options.passive) {\n fn(fakeEvent);\n }\n }\n }\n }\n\n element = domUtils.parentNode(element);\n }\n}\n\nfunction delegateUseCapture (event) {\n return delegateListener.call(this, event, true);\n}\n\nfunction preventDef () {\n this.returnValue = false;\n}\n\nfunction preventOriginalDefault () {\n this.originalEvent.preventDefault();\n}\n\nfunction stopProp () {\n this.cancelBubble = true;\n}\n\nfunction stopImmProp () {\n this.cancelBubble = true;\n this.immediatePropagationStopped = true;\n}\n\nfunction getOptions (param) {\n return is.object(param)? param : { capture: param };\n}\n\nmodule.exports = {\n add,\n remove,\n\n addDelegate,\n removeDelegate,\n\n delegateListener,\n delegateUseCapture,\n delegatedEvents,\n documents,\n\n useAttachEvent,\n supportsOptions,\n\n _elements: elements,\n _targets: targets,\n _attachedListeners: attachedListeners,\n};\n","module.exports = function extend (dest, source) {\n for (const prop in source) {\n dest[prop] = source[prop];\n }\n return dest;\n};\n","const {\n resolveRectLike,\n rectToXY,\n} = require('./rect');\n\nmodule.exports = function (target, element, action) {\n const actionOptions = target.options[action];\n const actionOrigin = actionOptions && actionOptions.origin;\n const origin = actionOrigin || target.options.origin;\n\n const originRect = resolveRectLike(origin, target, element, [target && element]);\n\n return rectToXY(originRect) || { x: 0, y: 0 };\n};\n","module.exports = (x, y) => Math.sqrt(x * x + y * y);\n","const extend = require('./extend');\nconst win = require('./window');\n\nconst utils = {\n warnOnce: function (method, message) {\n let warned = false;\n\n return function () {\n if (!warned) {\n win.window.console.warn(message);\n warned = true;\n }\n\n return method.apply(this, arguments);\n };\n },\n\n // http://stackoverflow.com/a/5634528/2280888\n _getQBezierValue: function (t, p1, p2, p3) {\n const iT = 1 - t;\n return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3;\n },\n\n getQuadraticCurvePoint: function (startX, startY, cpX, cpY, endX, endY, position) {\n return {\n x: utils._getQBezierValue(position, startX, cpX, endX),\n y: utils._getQBezierValue(position, startY, cpY, endY),\n };\n },\n\n // http://gizma.com/easing/\n easeOutQuad: function (t, b, c, d) {\n t /= d;\n return -c * t*(t-2) + b;\n },\n\n copyAction: function (dest, src) {\n dest.name = src.name;\n dest.axis = src.axis;\n dest.edges = src.edges;\n\n return dest;\n },\n\n is : require('./is'),\n extend : extend,\n hypot : require('./hypot'),\n getOriginXY: require('./getOriginXY'),\n};\n\nextend(utils, require('./arr'));\nextend(utils, require('./domUtils'));\nextend(utils, require('./pointerUtils'));\nextend(utils, require('./rect'));\n\nmodule.exports = utils;\n","const scope = require('../scope');\nconst utils = require('./index');\nconst browser = require('./browser');\n\nconst finder = {\n methodOrder: [ 'simulationResume', 'mouse', 'hasPointer', 'idle' ],\n\n search: function (pointer, eventType, eventTarget) {\n const mouseEvent = (/mouse/i.test(pointer.pointerType || eventType)\n // MSPointerEvent.MSPOINTER_TYPE_MOUSE\n || pointer.pointerType === 4);\n const pointerId = utils.getPointerId(pointer);\n const details = { pointer, pointerId, mouseEvent, eventType, eventTarget };\n\n for (const method of finder.methodOrder) {\n const interaction = finder[method](details);\n\n if (interaction) {\n return interaction;\n }\n }\n },\n\n // try to resume simulation with a new pointer\n simulationResume: function ({ mouseEvent, eventType, eventTarget }) {\n if (!/down|start/i.test(eventType)) {\n return null;\n }\n\n for (const interaction of scope.interactions) {\n let element = eventTarget;\n\n if (interaction.simulation && interaction.simulation.allowResume\n && (interaction.mouse === mouseEvent)) {\n while (element) {\n // if the element is the interaction element\n if (element === interaction.element) {\n return interaction;\n }\n element = utils.parentNode(element);\n }\n }\n }\n\n return null;\n },\n\n // if it's a mouse interaction\n mouse: function ({ pointerId, mouseEvent, eventType }) {\n if (!mouseEvent && (browser.supportsTouch || browser.supportsPointerEvent)) {\n return null;\n }\n\n let firstNonActive;\n\n for (const interaction of scope.interactions) {\n if (interaction.mouse) {\n // if it's a down event, skip interactions with running simulations\n if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; }\n\n // if the interaction is active, return it immediately\n if (interaction.interacting()) {\n return interaction;\n }\n // otherwise save it and look for another active interaction\n else if (!firstNonActive) {\n firstNonActive = interaction;\n }\n }\n }\n\n // if no active mouse interaction was found use the first inactive mouse\n // interaction\n if (firstNonActive) {\n return firstNonActive;\n }\n\n // Find any interaction specifically for mouse.\n // ignore the interaction if the eventType is a mousedown, and a simulation\n // is active\n for (const interaction of scope.interactions) {\n if (interaction.mouse && !(/down/.test(eventType) && interaction.simulation)) {\n return interaction;\n }\n }\n\n return null;\n },\n\n // get interaction that has this pointer\n hasPointer: function ({ pointerId }) {\n for (const interaction of scope.interactions) {\n if (utils.contains(interaction.pointerIds, pointerId)) {\n return interaction;\n }\n }\n },\n\n // get first idle interaction\n idle: function ({ mouseEvent }) {\n for (const interaction of scope.interactions) {\n // if there's already a pointer held down\n if (interaction.pointerIds.length === 1) {\n const target = interaction.target;\n // don't add this pointer if there is a target interactable and it\n // isn't gesturable\n if (target && !target.options.gesture.enabled) {\n continue;\n }\n }\n // maximum of 2 pointers per interaction\n else if (interaction.pointerIds.length >= 2) {\n continue;\n }\n\n if (!interaction.interacting() && (mouseEvent === interaction.mouse)) {\n return interaction;\n }\n }\n\n return null;\n },\n};\n\nmodule.exports = finder;\n","const win = require('./window');\nconst isWindow = require('./isWindow');\n\nconst is = {\n array : () => {},\n\n window : thing => thing === win.window || isWindow(thing),\n\n docFrag : thing => is.object(thing) && thing.nodeType === 11,\n\n object : thing => !!thing && (typeof thing === 'object'),\n\n function: thing => typeof thing === 'function',\n\n number : thing => typeof thing === 'number' ,\n\n bool : thing => typeof thing === 'boolean' ,\n\n string : thing => typeof thing === 'string' ,\n\n element: thing => {\n if (!thing || (typeof thing !== 'object')) { return false; }\n\n const _window = win.getWindow(thing) || win.window;\n\n return (/object|function/.test(typeof _window.Element)\n ? thing instanceof _window.Element //DOM2\n : thing.nodeType === 1 && typeof thing.nodeName === 'string');\n },\n};\n\nis.array = thing => (is.object(thing)\n && (typeof thing.length !== 'undefined')\n && is.function(thing.splice));\n\nmodule.exports = is;\n","module.exports = (thing) => !!(thing && thing.Window) && (thing instanceof thing.Window);\n","function pointerExtend (dest, source) {\n for (const prop in source) {\n const prefixedPropREs = module.exports.prefixedPropREs;\n let deprecated = false;\n\n // skip deprecated prefixed properties\n for (const vendor in prefixedPropREs) {\n if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) {\n deprecated = true;\n break;\n }\n }\n\n if (!deprecated && typeof source[prop] !== 'function') {\n dest[prop] = source[prop];\n }\n }\n return dest;\n}\n\npointerExtend.prefixedPropREs = {\n webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/,\n};\n\nmodule.exports = pointerExtend;\n","const hypot = require('./hypot');\nconst browser = require('./browser');\nconst dom = require('./domObjects');\nconst domUtils = require('./domUtils');\nconst is = require('./is');\nconst pointerExtend = require('./pointerExtend');\n\nconst pointerUtils = {\n copyCoords: function (dest, src) {\n dest.page = dest.page || {};\n dest.page.x = src.page.x;\n dest.page.y = src.page.y;\n\n dest.client = dest.client || {};\n dest.client.x = src.client.x;\n dest.client.y = src.client.y;\n\n dest.timeStamp = src.timeStamp;\n },\n\n setCoordDeltas: function (targetObj, prev, cur) {\n targetObj.page.x = cur.page.x - prev.page.x;\n targetObj.page.y = cur.page.y - prev.page.y;\n targetObj.client.x = cur.client.x - prev.client.x;\n targetObj.client.y = cur.client.y - prev.client.y;\n targetObj.timeStamp = cur.timeStamp - prev.timeStamp;\n\n // set pointer velocity\n const dt = Math.max(targetObj.timeStamp / 1000, 0.001);\n\n targetObj.page.speed = hypot(targetObj.page.x, targetObj.page.y) / dt;\n targetObj.page.vx = targetObj.page.x / dt;\n targetObj.page.vy = targetObj.page.y / dt;\n\n targetObj.client.speed = hypot(targetObj.client.x, targetObj.page.y) / dt;\n targetObj.client.vx = targetObj.client.x / dt;\n targetObj.client.vy = targetObj.client.y / dt;\n },\n\n isNativePointer: function (pointer) {\n return (pointer instanceof dom.Event || pointer instanceof dom.Touch);\n },\n\n // Get specified X/Y coords for mouse or event.touches[0]\n getXY: function (type, pointer, xy) {\n xy = xy || {};\n type = type || 'page';\n\n xy.x = pointer[type + 'X'];\n xy.y = pointer[type + 'Y'];\n\n return xy;\n },\n\n getPageXY: function (pointer, page) {\n page = page || {};\n\n // Opera Mobile handles the viewport and scrolling oddly\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n pointerUtils.getXY('screen', pointer, page);\n\n page.x += window.scrollX;\n page.y += window.scrollY;\n }\n else {\n pointerUtils.getXY('page', pointer, page);\n }\n\n return page;\n },\n\n getClientXY: function (pointer, client) {\n client = client || {};\n\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n // Opera Mobile handles the viewport and scrolling oddly\n pointerUtils.getXY('screen', pointer, client);\n }\n else {\n pointerUtils.getXY('client', pointer, client);\n }\n\n return client;\n },\n\n getPointerId: function (pointer) {\n return is.number(pointer.pointerId)? pointer.pointerId : pointer.identifier;\n },\n\n setCoords: function (targetObj, pointers, timeStamp) {\n const pointer = (pointers.length > 1\n ? pointerUtils.pointerAverage(pointers)\n : pointers[0]);\n\n const tmpXY = {};\n\n pointerUtils.getPageXY(pointer, tmpXY);\n targetObj.page.x = tmpXY.x;\n targetObj.page.y = tmpXY.y;\n\n pointerUtils.getClientXY(pointer, tmpXY);\n targetObj.client.x = tmpXY.x;\n targetObj.client.y = tmpXY.y;\n\n targetObj.timeStamp = is.number(timeStamp) ? timeStamp :new Date().getTime();\n },\n\n pointerExtend: pointerExtend,\n\n getTouchPair: function (event) {\n const touches = [];\n\n // array of touches is supplied\n if (is.array(event)) {\n touches[0] = event[0];\n touches[1] = event[1];\n }\n // an event\n else {\n if (event.type === 'touchend') {\n if (event.touches.length === 1) {\n touches[0] = event.touches[0];\n touches[1] = event.changedTouches[0];\n }\n else if (event.touches.length === 0) {\n touches[0] = event.changedTouches[0];\n touches[1] = event.changedTouches[1];\n }\n }\n else {\n touches[0] = event.touches[0];\n touches[1] = event.touches[1];\n }\n }\n\n return touches;\n },\n\n pointerAverage: function (pointers) {\n const average = {\n pageX : 0,\n pageY : 0,\n clientX: 0,\n clientY: 0,\n screenX: 0,\n screenY: 0,\n };\n\n for (const pointer of pointers) {\n for (const prop in average) {\n average[prop] += pointer[prop];\n }\n }\n for (const prop in average) {\n average[prop] /= pointers.length;\n }\n\n return average;\n },\n\n touchBBox: function (event) {\n if (!event.length && !(event.touches && event.touches.length > 1)) {\n return;\n }\n\n const touches = pointerUtils.getTouchPair(event);\n const minX = Math.min(touches[0].pageX, touches[1].pageX);\n const minY = Math.min(touches[0].pageY, touches[1].pageY);\n const maxX = Math.max(touches[0].pageX, touches[1].pageX);\n const maxY = Math.max(touches[0].pageY, touches[1].pageY);\n\n return {\n x: minX,\n y: minY,\n left: minX,\n top: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n },\n\n touchDistance: function (event, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n\n\n const dx = touches[0][sourceX] - touches[1][sourceX];\n const dy = touches[0][sourceY] - touches[1][sourceY];\n\n return hypot(dx, dy);\n },\n\n touchAngle: function (event, prevAngle, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n const dx = touches[1][sourceX] - touches[0][sourceX];\n const dy = touches[1][sourceY] - touches[0][sourceY];\n const angle = 180 * Math.atan2(dy , dx) / Math.PI;\n\n return angle;\n },\n\n getPointerType: function (pointer, interaction) {\n // if the PointerEvent API isn't available, then the pointer must be ither\n // a MouseEvent or TouchEvent\n if (interaction.mouse) { return 'mouse'; }\n if (!browser.supportsPointerEvent) { return 'touch'; }\n\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : [undefined, undefined,'touch', 'pen', 'mouse'][pointer.pointerType];\n },\n\n // [ event.target, event.currentTarget ]\n getEventTargets: function (event) {\n return [\n domUtils.getActualElement(event.path ? event.path[0] : event.target),\n domUtils.getActualElement(event.currentTarget),\n ];\n },\n};\n\nmodule.exports = pointerUtils;\n","const { window } = require('./window');\n\nconst vendors = ['ms', 'moz', 'webkit', 'o'];\nlet lastTime = 0;\nlet request;\nlet cancel;\n\nfor (let x = 0; x < vendors.length && !window.requestAnimationFrame; x++) {\n request = window[vendors[x] + 'RequestAnimationFrame'];\n cancel = window[vendors[x] +'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n}\n\nif (!request) {\n request = function (callback) {\n const currTime = new Date().getTime();\n const timeToCall = Math.max(0, 16 - (currTime - lastTime));\n const id = setTimeout(function () { callback(currTime + timeToCall); },\n timeToCall);\n\n lastTime = currTime + timeToCall;\n return id;\n };\n}\n\nif (!cancel) {\n cancel = function (id) {\n clearTimeout(id);\n };\n}\n\nmodule.exports = {\n request,\n cancel,\n};\n","const extend = require('./extend');\nconst is = require('./is');\nconst {\n closest,\n parentNode,\n getElementRect,\n} = require('./domUtils');\n\nconst rectUtils = {\n getStringOptionResult: function (value, interactable, element) {\n if (!is.string(value)) {\n return null;\n }\n\n if (value === 'parent') {\n value = parentNode(element);\n }\n else if (value === 'self') {\n value = interactable.getRect(element);\n }\n else {\n value = closest(element, value);\n }\n\n return value;\n },\n\n resolveRectLike: function (value, interactable, element, functionArgs) {\n value = rectUtils.getStringOptionResult(value, interactable, element) || value;\n\n if (is.function(value)) {\n value = value.apply(null, functionArgs);\n }\n\n if (is.element(value)) {\n value = getElementRect(value);\n }\n\n return value;\n },\n\n rectToXY: function (rect) {\n return rect && {\n x: 'x' in rect ? rect.x : rect.left,\n y: 'y' in rect ? rect.y : rect.top,\n };\n },\n\n xywhToTlbr: function (rect) {\n if (rect && !('left' in rect && 'top' in rect)) {\n rect = extend({}, rect);\n\n rect.left = rect.x || 0;\n rect.top = rect.y || 0;\n rect.right = rect.right || (rect.left + rect.width);\n rect.bottom = rect.bottom || (rect.top + rect.height);\n }\n\n return rect;\n },\n\n tlbrToXywh: function (rect) {\n if (rect && !('x' in rect && 'y' in rect)) {\n rect = extend({}, rect);\n\n rect.x = rect.left || 0;\n rect.top = rect.top || 0;\n rect.width = rect.width || (rect.right - rect.x);\n rect.height = rect.height || (rect.bottom - rect.y);\n }\n\n return rect;\n },\n};\n\nmodule.exports = rectUtils;\n","const win = module.exports;\nconst isWindow = require('./isWindow');\n\nfunction init (window) {\n // get wrapped window if using Shadow DOM polyfill\n\n win.realWindow = window;\n\n // create a TextNode\n const el = window.document.createTextNode('');\n\n // check if it's wrapped by a polyfill\n if (el.ownerDocument !== window.document\n && typeof window.wrap === 'function'\n && window.wrap(el) === el) {\n // use wrapped window\n window = window.wrap(window);\n }\n\n win.window = window;\n}\n\nif (typeof window === 'undefined') {\n win.window = undefined;\n win.realWindow = undefined;\n}\nelse {\n init(window);\n}\n\nwin.getWindow = function getWindow (node) {\n if (isWindow(node)) {\n return node;\n }\n\n const rootNode = (node.ownerDocument || node);\n\n return rootNode.defaultView || rootNode.parentWindow || win.window;\n};\n\nwin.init = init;\n"]} \ No newline at end of file +{"version":3,"sources":["src/minHeader.js","src/header.js","index.js","src/Eventable.js","src/InteractEvent.js","src/Interactable.js","src/Interaction.js","src/actions/base.js","src/actions/drag.js","src/actions/drop.js","src/actions/gesture.js","src/actions/resize.js","src/autoScroll.js","src/autoStart/InteractableMethods.js","src/autoStart/base.js","src/autoStart/delay.js","src/autoStart/drag.js","src/autoStart/gesture.js","src/autoStart/resize.js","src/defaultOptions.js","src/index.js","src/inertia.js","src/interact.js","src/interactablePreventDefault.js","src/legacyBrowsers.js","src/modifiers/index.js","src/modifiers/restrict.js","src/modifiers/restrictEdges.js","src/modifiers/restrictSize.js","src/modifiers/snap.js","src/modifiers/snapSize.js","src/pointerEvents/PointerEvent.js","src/pointerEvents/base.js","src/pointerEvents/holdRepeat.js","src/pointerEvents/interactableTargets.js","src/scope.js","src/utils/Signals.js","src/utils/arr.js","src/utils/browser.js","src/utils/domObjects.js","src/utils/domUtils.js","src/utils/events.js","src/utils/extend.js","src/utils/getOriginXY.js","src/utils/hypot.js","src/utils/index.js","src/utils/interactionFinder.js","src/utils/is.js","src/utils/isWindow.js","src/utils/pointerExtend.js","src/utils/pointerUtils.js","src/utils/raf.js","src/utils/rect.js","src/utils/window.js"],"names":[],"mappings":"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","file":"interact.min.js","sourceRoot":"","sourcesContent":["/* interact.js v1.3.0-alpha.4+sha.7970416-dirty | https://raw.github.com/taye/interact.js/master/LICENSE */\n","/**\n * interact.js v1.3.0-alpha.4+sha.7970416-dirty\n *\n * Copyright (c) 2012-2017 Taye Adeyemi \n * Open source under the MIT License.\n * https://raw.github.com/taye/interact.js/master/LICENSE\n */\n","/*\n * In a (windowless) server environment this file exports a factory function\n * that takes the window to use.\n *\n * var interact = require('interact.js')(windowObject);\n *\n * See https://github.com/taye/interact.js/issues/187\n */\nif (typeof window === 'undefined') {\n module.exports = function (window) {\n require('./src/utils/window').init(window);\n\n return require('./src/index');\n };\n}\nelse {\n module.exports = require('./src/index');\n}\n","const { indexOf } = require('./utils/arr');\nconst extend = require('./utils/extend.js');\n\nfunction fireUntilImmediateStopped (event, listeners) {\n for (let i = 0, len = listeners.length; i < len && !event.immediatePropagationStopped; i++) {\n listeners[i](event);\n }\n}\n\nclass Eventable {\n\n constructor (options) {\n this.options = extend({}, options || {});\n }\n\n fire (event) {\n let listeners;\n const onEvent = 'on' + event.type;\n const global = this.global;\n\n // Interactable#on() listeners\n if ((listeners = this[event.type])) {\n fireUntilImmediateStopped(event, listeners);\n }\n\n // interactable.onevent listener\n if (this[onEvent]) {\n this[onEvent](event);\n }\n\n // interact.on() listeners\n if (!event.propagationStopped && global && (listeners = global[event.type])) {\n fireUntilImmediateStopped(event, listeners);\n }\n }\n\n on (eventType, listener) {\n // if this type of event was never bound\n if (this[eventType]) {\n this[eventType].push(listener);\n }\n else {\n this[eventType] = [listener];\n }\n }\n\n off (eventType, listener) {\n // if it is an action event type\n const eventList = this[eventType];\n const index = eventList? indexOf(eventList, listener) : -1;\n\n if (index !== -1) {\n eventList.splice(index, 1);\n }\n\n if (eventList && eventList.length === 0 || !listener) {\n this[eventType] = listener;\n }\n }\n}\n\nmodule.exports = Eventable;\n","const extend = require('./utils/extend');\nconst getOriginXY = require('./utils/getOriginXY');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nclass InteractEvent {\n constructor (interaction, event, action, phase, element, related, preEnd = false) {\n const target = interaction.target;\n const deltaSource = (target && target.options || defaults).deltaSource;\n const origin = getOriginXY(target, element, action);\n const starting = phase === 'start';\n const ending = phase === 'end';\n const coords = starting? interaction.startCoords : interaction.curCoords;\n const prevEvent = interaction.prevEvent;\n\n element = element || interaction.element;\n\n const page = extend({}, coords.page);\n const client = extend({}, coords.client);\n\n page.x -= origin.x;\n page.y -= origin.y;\n\n client.x -= origin.x;\n client.y -= origin.y;\n\n this.ctrlKey = event.ctrlKey;\n this.altKey = event.altKey;\n this.shiftKey = event.shiftKey;\n this.metaKey = event.metaKey;\n this.button = event.button;\n this.buttons = event.buttons;\n this.target = element;\n this.currentTarget = element;\n this.relatedTarget = related || null;\n this.preEnd = preEnd;\n this.type = action + (phase || '');\n this.interaction = interaction;\n this.interactable = target;\n\n this.t0 = starting ? interaction.downTimes[interaction.downTimes.length - 1]\n : prevEvent.t0;\n\n const signalArg = {\n interaction,\n event,\n action,\n phase,\n element,\n related,\n page,\n client,\n coords,\n starting,\n ending,\n deltaSource,\n iEvent: this,\n };\n\n signals.fire('set-xy', signalArg);\n\n if (ending) {\n // use previous coords when ending\n this.pageX = prevEvent.pageX;\n this.pageY = prevEvent.pageY;\n this.clientX = prevEvent.clientX;\n this.clientY = prevEvent.clientY;\n }\n else {\n this.pageX = page.x;\n this.pageY = page.y;\n this.clientX = client.x;\n this.clientY = client.y;\n }\n\n this.x0 = interaction.startCoords.page.x - origin.x;\n this.y0 = interaction.startCoords.page.y - origin.y;\n this.clientX0 = interaction.startCoords.client.x - origin.x;\n this.clientY0 = interaction.startCoords.client.y - origin.y;\n\n signals.fire('set-delta', signalArg);\n\n this.timeStamp = coords.timeStamp;\n this.dt = interaction.pointerDelta.timeStamp;\n this.duration = this.timeStamp - this.t0;\n\n // speed and velocity in pixels per second\n this.speed = interaction.pointerDelta[deltaSource].speed;\n this.velocityX = interaction.pointerDelta[deltaSource].vx;\n this.velocityY = interaction.pointerDelta[deltaSource].vy;\n\n this.swipe = (ending || phase === 'inertiastart')? this.getSwipe() : null;\n\n signals.fire('new', signalArg);\n }\n\n getSwipe () {\n const interaction = this.interaction;\n\n if (interaction.prevEvent.speed < 600\n || this.timeStamp - interaction.prevEvent.timeStamp > 150) {\n return null;\n }\n\n let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI;\n const overlap = 22.5;\n\n if (angle < 0) {\n angle += 360;\n }\n\n const left = 135 - overlap <= angle && angle < 225 + overlap;\n const up = 225 - overlap <= angle && angle < 315 + overlap;\n\n const right = !left && (315 - overlap <= angle || angle < 45 + overlap);\n const down = !up && 45 - overlap <= angle && angle < 135 + overlap;\n\n return {\n up,\n down,\n left,\n right,\n angle,\n speed: interaction.prevEvent.speed,\n velocity: {\n x: interaction.prevEvent.velocityX,\n y: interaction.prevEvent.velocityY,\n },\n };\n }\n\n preventDefault () {}\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n}\n\nsignals.on('set-delta', function ({ iEvent, interaction, starting, deltaSource }) {\n const prevEvent = starting? iEvent : interaction.prevEvent;\n\n if (deltaSource === 'client') {\n iEvent.dx = iEvent.clientX - prevEvent.clientX;\n iEvent.dy = iEvent.clientY - prevEvent.clientY;\n }\n else {\n iEvent.dx = iEvent.pageX - prevEvent.pageX;\n iEvent.dy = iEvent.pageY - prevEvent.pageY;\n }\n});\n\nInteractEvent.signals = signals;\n\nmodule.exports = InteractEvent;\n","const is = require('./utils/is');\nconst events = require('./utils/events');\nconst extend = require('./utils/extend');\nconst actions = require('./actions/base');\nconst scope = require('./scope');\nconst Eventable = require('./Eventable');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nconst {\n getElementRect,\n nodeContains,\n trySelector,\n} = require('./utils/domUtils');\nconst { getWindow } = require('./utils/window');\nconst { indexOf, contains } = require('./utils/arr');\nconst { wheelEvent } = require('./utils/browser');\n\n// all set interactables\nscope.interactables = [];\n\n/*\\\n * Interactable\n [ property ]\n **\n * Object type returned by @interact\n\\*/\nclass Interactable {\n constructor (target, options) {\n options = options || {};\n\n this.target = target;\n this.events = new Eventable();\n this._context = options.context || scope.document;\n this._win = getWindow(trySelector(target)? this._context : target);\n this._doc = this._win.document;\n\n signals.fire('new', {\n target,\n options,\n interactable: this,\n win: this._win,\n });\n\n scope.addDocument( this._doc, this._win );\n\n scope.interactables.push(this);\n\n this.set(options);\n }\n\n setOnEvents (action, phases) {\n const onAction = 'on' + action;\n\n if (is.function(phases.onstart) ) { this.events[onAction + 'start' ] = phases.onstart ; }\n if (is.function(phases.onmove) ) { this.events[onAction + 'move' ] = phases.onmove ; }\n if (is.function(phases.onend) ) { this.events[onAction + 'end' ] = phases.onend ; }\n if (is.function(phases.oninertiastart)) { this.events[onAction + 'inertiastart' ] = phases.oninertiastart ; }\n\n return this;\n }\n\n setPerAction (action, options) {\n // for all the default per-action options\n for (const option in options) {\n // if this option exists for this action\n if (option in defaults[action]) {\n // if the option in the options arg is an object value\n if (is.object(options[option])) {\n // duplicate the object\n this.options[action][option] = extend(this.options[action][option] || {}, options[option]);\n\n if (is.object(defaults.perAction[option]) && 'enabled' in defaults.perAction[option]) {\n this.options[action][option].enabled = options[option].enabled === false? false : true;\n }\n }\n else if (is.bool(options[option]) && is.object(defaults.perAction[option])) {\n this.options[action][option].enabled = options[option];\n }\n else if (options[option] !== undefined) {\n // or if it's not undefined, do a plain assignment\n this.options[action][option] = options[option];\n }\n }\n }\n }\n\n /*\\\n * Interactable.getRect\n [ method ]\n *\n * The default function to get an Interactables bounding rect. Can be\n * overridden using @Interactable.rectChecker.\n *\n - element (Element) #optional The element to measure.\n = (object) The object's bounding rectangle.\n o {\n o top : 0,\n o left : 0,\n o bottom: 0,\n o right : 0,\n o width : 0,\n o height: 0\n o }\n \\*/\n getRect (element) {\n element = element || this.target;\n\n if (is.string(this.target) && !(is.element(element))) {\n element = this._context.querySelector(this.target);\n }\n\n return getElementRect(element);\n }\n\n /*\\\n * Interactable.rectChecker\n [ method ]\n *\n * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n - checker (function) #optional A function which returns this Interactable's bounding rectangle. See @Interactable.getRect\n = (function | object) The checker function or this Interactable\n \\*/\n rectChecker (checker) {\n if (is.function(checker)) {\n this.getRect = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.getRect;\n\n return this;\n }\n\n return this.getRect;\n }\n\n _backCompatOption (optionName, newValue) {\n if (trySelector(newValue) || is.object(newValue)) {\n this.options[optionName] = newValue;\n\n for (const action of actions.names) {\n this.options[action][optionName] = newValue;\n }\n\n return this;\n }\n\n return this.options[optionName];\n }\n\n /*\\\n * Interactable.origin\n [ method ]\n *\n * Gets or sets the origin of the Interactable's element. The x and y\n * of the origin will be subtracted from action event coordinates.\n *\n - origin (object | string) #optional An object eg. { x: 0, y: 0 } or string 'parent', 'self' or any CSS selector\n * OR\n - origin (Element) #optional An HTML or SVG Element whose rect will be used\n **\n = (object) The current origin or this Interactable\n \\*/\n origin (newValue) {\n return this._backCompatOption('origin', newValue);\n }\n\n /*\\\n * Interactable.deltaSource\n [ method ]\n *\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n - newValue (string) #optional Use 'client' if you will be scrolling while interacting; Use 'page' if you want autoScroll to work\n = (string | object) The current deltaSource or this Interactable\n \\*/\n deltaSource (newValue) {\n if (newValue === 'page' || newValue === 'client') {\n this.options.deltaSource = newValue;\n\n return this;\n }\n\n return this.options.deltaSource;\n }\n\n /*\\\n * Interactable.context\n [ method ]\n *\n * Gets the selector context Node of the Interactable. The default is `window.document`.\n *\n = (Node) The context Node of this Interactable\n **\n \\*/\n context () {\n return this._context;\n }\n\n inContext (element) {\n return (this._context === element.ownerDocument\n || nodeContains(this._context, element));\n }\n\n /*\\\n * Interactable.fire\n [ method ]\n *\n * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n - iEvent (InteractEvent) The InteractEvent object to be fired on this Interactable\n = (Interactable) this Interactable\n \\*/\n fire (iEvent) {\n this.events.fire(iEvent);\n\n return this;\n }\n\n _onOffMultiple (method, eventType, listener, options) {\n if (is.string(eventType) && eventType.search(' ') !== -1) {\n eventType = eventType.trim().split(/ +/);\n }\n\n if (is.array(eventType)) {\n for (let i = 0; i < eventType.length; i++) {\n this[method](eventType[i], listener, options);\n }\n\n return true;\n }\n\n if (is.object(eventType)) {\n for (const prop in eventType) {\n this[method](prop, eventType[prop], listener);\n }\n\n return true;\n }\n }\n\n /*\\\n * Interactable.on\n [ method ]\n *\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n - eventType (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) This Interactable\n \\*/\n on (eventType, listener, options) {\n if (this._onOffMultiple('on', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.on(eventType, listener);\n }\n // delegated event for selector\n else if (is.string(this.target)) {\n events.addDelegate(this.target, this._context, eventType, listener, options);\n }\n else {\n events.add(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.off\n [ method ]\n *\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n - eventType (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) This Interactable\n \\*/\n off (eventType, listener, options) {\n if (this._onOffMultiple('off', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n // if it is an action event type\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.off(eventType, listener);\n }\n // delegated event\n else if (is.string(this.target)) {\n events.removeDelegate(this.target, this._context, eventType, listener, options);\n }\n // remove listener from this Interatable's element\n else {\n events.remove(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.set\n [ method ]\n *\n * Reset the options of this Interactable\n - options (object) The new settings to apply\n = (object) This Interactable\n \\*/\n set (options) {\n if (!is.object(options)) {\n options = {};\n }\n\n this.options = extend({}, defaults.base);\n\n const perActions = extend({}, defaults.perAction);\n\n for (const actionName in actions.methodDict) {\n const methodName = actions.methodDict[actionName];\n\n this.options[actionName] = extend({}, defaults[actionName]);\n\n this.setPerAction(actionName, perActions);\n\n this[methodName](options[actionName]);\n }\n\n for (const setting of Interactable.settingsMethods) {\n this.options[setting] = defaults.base[setting];\n\n if (setting in options) {\n this[setting](options[setting]);\n }\n }\n\n signals.fire('set', {\n options,\n interactable: this,\n });\n\n return this;\n }\n\n /*\\\n * Interactable.unset\n [ method ]\n *\n * Remove this interactable from the list of interactables and remove\n * it's action capabilities and event listeners\n *\n = (object) @interact\n \\*/\n unset () {\n events.remove(this.target, 'all');\n\n if (is.string(this.target)) {\n // remove delegated events\n for (const type in events.delegatedEvents) {\n const delegated = events.delegatedEvents[type];\n\n if (delegated.selectors[0] === this.target\n && delegated.contexts[0] === this._context) {\n\n delegated.selectors.splice(0, 1);\n delegated.contexts .splice(0, 1);\n delegated.listeners.splice(0, 1);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegated[type] = null;\n }\n }\n\n events.remove(this._context, type, events.delegateListener);\n events.remove(this._context, type, events.delegateUseCapture, true);\n }\n }\n else {\n events.remove(this, 'all');\n }\n\n signals.fire('unset', { interactable: this });\n\n scope.interactables.splice(indexOf(scope.interactables, this), 1);\n\n // Stop related interactions when an Interactable is unset\n for (const interaction of scope.interactions || []) {\n if (interaction.target === this && interaction.interacting()) {\n interaction.stop();\n }\n }\n\n return scope.interact;\n }\n}\n\nscope.interactables.indexOfElement = function indexOfElement (target, context) {\n context = context || scope.document;\n\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n if (interactable.target === target && interactable._context === context) {\n return i;\n }\n }\n return -1;\n};\n\nscope.interactables.get = function interactableGet (element, options, dontCheckInContext) {\n const ret = this[this.indexOfElement(element, options && options.context)];\n\n return ret && (is.string(element) || dontCheckInContext || ret.inContext(element))? ret : null;\n};\n\nscope.interactables.forEachSelector = function (callback, element) {\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n // skip non CSS selector targets and out of context elements\n if (!is.string(interactable.target)\n || (element && !interactable.inContext(element))) {\n continue;\n }\n\n const ret = callback(interactable, interactable.target, interactable._context, i, this);\n\n if (ret !== undefined) {\n return ret;\n }\n }\n};\n\n// all interact.js eventTypes\nInteractable.eventTypes = scope.eventTypes = [];\n\nInteractable.signals = signals;\n\nInteractable.settingsMethods = [ 'deltaSource', 'origin', 'preventDefault', 'rectChecker' ];\n\nmodule.exports = Interactable;\n","const scope = require('./scope');\nconst utils = require('./utils');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst domObjects = require('./utils/domObjects');\nconst finder = require('./utils/interactionFinder');\nconst signals = require('./utils/Signals').new();\n\nconst listeners = {};\nconst methodNames = [\n 'pointerDown', 'pointerMove', 'pointerUp',\n 'updatePointer', 'removePointer',\n];\n\n// for ignoring browser's simulated mouse events\nlet prevTouchTime = 0;\n\n// all active and idle interactions\nscope.interactions = [];\n\nclass Interaction {\n constructor ({ pointerType }) {\n this.target = null; // current interactable being interacted with\n this.element = null; // the target element of the interactable\n\n this.prepared = { // action that's ready to be fired on next move event\n name : null,\n axis : null,\n edges: null,\n };\n\n // keep track of added pointers\n this.pointers = [];\n this.pointerIds = [];\n this.downTargets = [];\n this.downTimes = [];\n\n // Previous native pointer move event coordinates\n this.prevCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n // current native pointer move event coordinates\n this.curCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Starting InteractEvent pointer coordinates\n this.startCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Change in coordinates and time of the pointer\n this.pointerDelta = {\n page : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n client : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n timeStamp: 0,\n };\n\n this.downEvent = null; // pointerdown/mousedown/touchstart event\n this.downPointer = {};\n\n this._eventTarget = null;\n this._curEventTarget = null;\n\n this.prevEvent = null; // previous action event\n\n this.pointerIsDown = false;\n this.pointerWasMoved = false;\n this._interacting = false;\n\n this.pointerType = pointerType;\n\n signals.fire('new', this);\n\n scope.interactions.push(this);\n }\n\n pointerDown (pointer, event, eventTarget) {\n const pointerIndex = this.updatePointer(pointer, event, true);\n\n signals.fire('down', {\n pointer,\n event,\n eventTarget,\n pointerIndex,\n interaction: this,\n });\n }\n\n /*\\\n * Interaction.start\n [ method ]\n *\n * Start an action with the given Interactable and Element as tartgets. The\n * action must be enabled for the target Interactable and an appropriate number\n * of pointers must be held down - 1 for drag/resize, 2 for gesture.\n *\n * Use it with `interactable.able({ manualStart: false })` to always\n * [start actions manually](https://github.com/taye/interact.js/issues/114)\n *\n - action (object) The action to be performed - drag, resize, etc.\n - target (Interactable) The Interactable to target\n - element (Element) The DOM Element to target\n = (object) interact\n **\n | interact(target)\n | .draggable({\n | // disable the default drag start by down->move\n | manualStart: true\n | })\n | // start dragging after the user holds the pointer down\n | .on('hold', function (event) {\n | var interaction = event.interaction;\n |\n | if (!interaction.interacting()) {\n | interaction.start({ name: 'drag' },\n | event.interactable,\n | event.currentTarget);\n | }\n | });\n \\*/\n start (action, target, element) {\n if (this.interacting()\n || !this.pointerIsDown\n || this.pointerIds.length < (action.name === 'gesture'? 2 : 1)) {\n return;\n }\n\n // if this interaction had been removed after stopping\n // add it back\n if (utils.indexOf(scope.interactions, this) === -1) {\n scope.interactions.push(this);\n }\n\n utils.copyAction(this.prepared, action);\n this.target = target;\n this.element = element;\n\n signals.fire('action-start', {\n interaction: this,\n event: this.downEvent,\n });\n }\n\n pointerMove (pointer, event, eventTarget) {\n if (!this.simulation) {\n this.updatePointer(pointer);\n utils.setCoords(this.curCoords, this.pointers);\n }\n\n const duplicateMove = (this.curCoords.page.x === this.prevCoords.page.x\n && this.curCoords.page.y === this.prevCoords.page.y\n && this.curCoords.client.x === this.prevCoords.client.x\n && this.curCoords.client.y === this.prevCoords.client.y);\n\n let dx;\n let dy;\n\n // register movement greater than pointerMoveTolerance\n if (this.pointerIsDown && !this.pointerWasMoved) {\n dx = this.curCoords.client.x - this.startCoords.client.x;\n dy = this.curCoords.client.y - this.startCoords.client.y;\n\n this.pointerWasMoved = utils.hypot(dx, dy) > Interaction.pointerMoveTolerance;\n }\n\n const signalArg = {\n pointer,\n pointerIndex: this.getPointerIndex(pointer),\n event,\n eventTarget,\n dx,\n dy,\n duplicate: duplicateMove,\n interaction: this,\n interactingBeforeMove: this.interacting(),\n };\n\n if (!duplicateMove) {\n // set pointer coordinate, time changes and speeds\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n }\n\n signals.fire('move', signalArg);\n\n if (!duplicateMove) {\n // if interacting, fire an 'action-move' signal etc\n if (this.interacting()) {\n this.doMove(signalArg);\n }\n\n if (this.pointerWasMoved) {\n utils.copyCoords(this.prevCoords, this.curCoords);\n }\n }\n }\n\n /*\\\n * Interaction.doMove\n [ method ]\n *\n * Force a move of the current action at the same coordinates. Useful if\n * snap/restrict has been changed and you want a movement with the new\n * settings.\n *\n **\n | interact(target)\n | .draggable(true)\n | .on('dragmove', function (event) {\n | if (someCondition) {\n | // change the snap settings\n | event.interactable.draggable({ snap: { targets: [] }});\n | // fire another move event with re-calculated snap\n | event.interaction.doMove();\n | }\n | });\n \\*/\n doMove (signalArg) {\n signalArg = utils.extend({\n pointer: this.pointers[0],\n event: this.prevEvent,\n eventTarget: this._eventTarget,\n interaction: this,\n }, signalArg || {});\n\n signals.fire('before-action-move', signalArg);\n\n if (!this._dontFireMove) {\n signals.fire('action-move', signalArg);\n }\n\n this._dontFireMove = false;\n }\n\n // End interact move events and stop auto-scroll unless simulation is running\n pointerUp (pointer, event, eventTarget, curEventTarget) {\n const pointerIndex = this.getPointerIndex(pointer);\n\n signals.fire(/cancel$/i.test(event.type)? 'cancel' : 'up', {\n pointer,\n pointerIndex,\n event,\n eventTarget,\n curEventTarget,\n interaction: this,\n });\n\n if (!this.simulation) {\n this.end(event);\n }\n\n this.pointerIsDown = false;\n this.removePointer(pointer, event);\n }\n\n /*\\\n * Interaction.end\n [ method ]\n *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n - event (PointerEvent) #optional\n **\n | interact(target)\n | .draggable(true)\n | .on('move', function (event) {\n | if (event.pageX > 1000) {\n | // end the current action\n | event.interaction.end();\n | // stop all further listeners from being called\n | event.stopImmediatePropagation();\n | }\n | });\n \\*/\n end (event) {\n event = event || this.prevEvent;\n\n if (this.interacting()) {\n signals.fire('action-end', {\n event,\n interaction: this,\n });\n }\n\n this.stop();\n }\n\n currentAction () {\n return this._interacting? this.prepared.name: null;\n }\n\n interacting () {\n return this._interacting;\n }\n\n stop () {\n signals.fire('stop', { interaction: this });\n\n if (this._interacting) {\n signals.fire('stop-active', { interaction: this });\n signals.fire('stop-' + this.prepared.name, { interaction: this });\n }\n\n this.target = this.element = null;\n\n this._interacting = false;\n this.prepared.name = this.prevEvent = null;\n }\n\n getPointerIndex (pointer) {\n // mouse and pen interactions may have only one pointer\n if (this.pointerType === 'mouse' || this.pointerType === 'pen') {\n return 0;\n }\n\n return utils.indexOf(this.pointerIds, utils.getPointerId(pointer));\n }\n\n updatePointer (pointer, event, down = event && /(down|start)$/i.test(event.type)) {\n const id = utils.getPointerId(pointer);\n let index = this.getPointerIndex(pointer);\n\n if (index === -1) {\n index = this.pointerIds.length;\n this.pointerIds[index] = id;\n }\n\n if (down) {\n signals.fire('update-pointer-down', {\n pointer,\n event,\n down,\n pointerId: id,\n pointerIndex: index,\n interaction: this,\n });\n }\n\n this.pointers[index] = pointer;\n\n return index;\n }\n\n removePointer (pointer, event) {\n const index = this.getPointerIndex(pointer);\n\n if (index === -1) { return; }\n\n signals.fire('remove-pointer', {\n pointer,\n event,\n pointerIndex: index,\n interaction: this,\n });\n\n this.pointers .splice(index, 1);\n this.pointerIds .splice(index, 1);\n this.downTargets.splice(index, 1);\n this.downTimes .splice(index, 1);\n }\n\n _updateEventTargets (target, currentTarget) {\n this._eventTarget = target;\n this._curEventTarget = currentTarget;\n }\n}\n\nfor (let i = 0, len = methodNames.length; i < len; i++) {\n const method = methodNames[i];\n\n listeners[method] = doOnInteractions(method);\n}\n\nfunction doOnInteractions (method) {\n return (function (event) {\n const pointerType = utils.getPointerType(event);\n const [eventTarget, curEventTarget] = utils.getEventTargets(event);\n const matches = []; // [ [pointer, interaction], ...]\n\n if (browser.supportsTouch && /touch/.test(event.type)) {\n prevTouchTime = new Date().getTime();\n\n for (let i = 0; i < event.changedTouches.length; i++) {\n const pointer = event.changedTouches[i];\n const interaction = finder.search(pointer, event.type, eventTarget);\n\n matches.push([pointer, interaction || new Interaction({ pointerType })]);\n }\n }\n else {\n let invalidPointer = false;\n\n if (!browser.supportsPointerEvent && /mouse/.test(event.type)) {\n // ignore mouse events while touch interactions are active\n for (let i = 0; i < scope.interactions.length && !invalidPointer; i++) {\n invalidPointer = scope.interactions[i].pointerType !== 'mouse' && scope.interactions[i].pointerIsDown;\n }\n\n // try to ignore mouse events that are simulated by the browser\n // after a touch event\n invalidPointer = invalidPointer\n || (new Date().getTime() - prevTouchTime < 500)\n // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated\n || event.timeStamp === 0;\n }\n\n if (!invalidPointer) {\n let interaction = finder.search(event, event.type, eventTarget);\n\n if (!interaction) {\n interaction = new Interaction({ pointerType });\n }\n\n matches.push([event, interaction]);\n }\n }\n\n for (const [pointer, interaction] of matches) {\n interaction._updateEventTargets(eventTarget, curEventTarget);\n interaction[method](pointer, event, eventTarget, curEventTarget);\n }\n });\n}\n\nfunction endAll (event) {\n for (let i = 0; i < scope.interactions.length; i++) {\n const interaction = scope.interactions[i];\n\n interaction.end(event);\n signals.fire('endall', { event, interaction });\n }\n}\n\nconst docEvents = { /* 'eventType': listenerFunc */ };\nconst pEventTypes = browser.pEventTypes;\n\nif (domObjects.PointerEvent) {\n docEvents[pEventTypes.down ] = listeners.pointerDown;\n docEvents[pEventTypes.move ] = listeners.pointerMove;\n docEvents[pEventTypes.up ] = listeners.pointerUp;\n docEvents[pEventTypes.cancel] = listeners.pointerUp;\n}\nelse {\n docEvents.mousedown = listeners.pointerDown;\n docEvents.mousemove = listeners.pointerMove;\n docEvents.mouseup = listeners.pointerUp;\n\n docEvents.touchstart = listeners.pointerDown;\n docEvents.touchmove = listeners.pointerMove;\n docEvents.touchend = listeners.pointerUp;\n docEvents.touchcancel = listeners.pointerUp;\n}\n\ndocEvents.blur = endAll;\n\nfunction onDocSignal ({ doc }, signalName) {\n const eventMethod = signalName.indexOf('add') === 0\n ? events.add : events.remove;\n\n // delegate event listener\n for (const eventType in scope.delegatedEvents) {\n eventMethod(doc, eventType, events.delegateListener);\n eventMethod(doc, eventType, events.delegateUseCapture, true);\n }\n\n for (const eventType in docEvents) {\n eventMethod(doc, eventType, docEvents[eventType]);\n }\n}\n\nsignals.on('update-pointer-down', ({ interaction, pointer, pointerId, pointerIndex, event, eventTarget, down }) => {\n interaction.pointerIds[pointerIndex] = pointerId;\n interaction.pointers[pointerIndex] = pointer;\n\n if (down) {\n interaction.pointerIsDown = true;\n }\n\n if (!interaction.interacting()) {\n utils.setCoords(interaction.startCoords, interaction.pointers);\n\n utils.copyCoords(interaction.curCoords , interaction.startCoords);\n utils.copyCoords(interaction.prevCoords, interaction.startCoords);\n\n interaction.downEvent = event;\n interaction.downTimes[pointerIndex] = interaction.curCoords.timeStamp;\n interaction.downTargets[pointerIndex] = eventTarget || event && utils.getEventTargets(event)[0];\n interaction.pointerWasMoved = false;\n\n utils.pointerExtend(interaction.downPointer, pointer);\n }\n});\n\nscope.signals.on('add-document' , onDocSignal);\nscope.signals.on('remove-document', onDocSignal);\n\nInteraction.pointerMoveTolerance = 1;\nInteraction.doOnInteractions = doOnInteractions;\nInteraction.endAll = endAll;\nInteraction.signals = signals;\nInteraction.docEvents = docEvents;\n\nscope.endAllInteractions = endAll;\n\nmodule.exports = Interaction;\n","const Interaction = require('../Interaction');\nconst InteractEvent = require('../InteractEvent');\n\nconst actions = {\n firePrepared,\n names: [],\n methodDict: {},\n};\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n interaction._interacting = true;\n firePrepared(interaction, event, 'start');\n});\n\nInteraction.signals.on('action-move', function ({ interaction, event, preEnd }) {\n firePrepared(interaction, event, 'move', preEnd);\n\n // if the action was ended in a listener\n if (!interaction.interacting()) { return false; }\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n firePrepared(interaction, event, 'end');\n});\n\nfunction firePrepared (interaction, event, phase, preEnd) {\n const actionName = interaction.prepared.name;\n\n const newEvent = new InteractEvent(interaction, event, actionName, phase, interaction.element, null, preEnd);\n\n interaction.target.fire(newEvent);\n interaction.prevEvent = newEvent;\n}\n\nmodule.exports = actions;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drag = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n startAxis : 'xy',\n lockAxis : 'xy',\n },\n\n checker: function (pointer, event, interactable) {\n const dragOptions = interactable.options.drag;\n\n return dragOptions.enabled\n ? { name: 'drag', axis: (dragOptions.lockAxis === 'start'\n ? dragOptions.startAxis\n : dragOptions.lockAxis)}\n : null;\n },\n\n getCursor: function () {\n return 'move';\n },\n};\n\nInteraction.signals.on('before-action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n interaction.curCoords.page.y = interaction.startCoords.page.y;\n interaction.curCoords.client.y = interaction.startCoords.client.y;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vx);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vx);\n interaction.pointerDelta.client.vy = 0;\n interaction.pointerDelta.page.vy = 0;\n }\n else if (axis === 'y') {\n interaction.curCoords.page.x = interaction.startCoords.page.x;\n interaction.curCoords.client.x = interaction.startCoords.client.x;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vy);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vy);\n interaction.pointerDelta.client.vx = 0;\n interaction.pointerDelta.page.vx = 0;\n }\n});\n\n// dragmove\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'dragmove') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n iEvent.pageY = interaction.startCoords.page.y;\n iEvent.clientY = interaction.startCoords.client.y;\n iEvent.dy = 0;\n }\n else if (axis === 'y') {\n iEvent.pageX = interaction.startCoords.page.x;\n iEvent.clientX = interaction.startCoords.client.x;\n iEvent.dx = 0;\n }\n});\n\n/*\\\n * Interactable.draggable\n [ method ]\n *\n * Gets or sets whether drag actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of drag events\n | var isDraggable = interact('ul li').draggable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on drag events (object makes the Interactable draggable)\n = (object) This Interactable\n | interact(element).draggable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // the axis in which the first movement must be\n | // for the drag sequence to start\n | // 'xy' by default - any direction\n | startAxis: 'x' || 'y' || 'xy',\n |\n | // 'xy' by default - don't restrict to one axis (move in any direction)\n | // 'x' or 'y' to restrict movement to either axis\n | // 'start' to restrict movement to the axis the drag started in\n | lockAxis: 'x' || 'y' || 'xy' || 'start',\n |\n | // max number of drags that can happen concurrently\n | // with elements of this Interactable. Infinity by default\n | max: Infinity,\n |\n | // max number of drags that can target the same element+Interactable\n | // 1 by default\n | maxPerElement: 2\n | });\n\\*/\nInteractable.prototype.draggable = function (options) {\n if (utils.is.object(options)) {\n this.options.drag.enabled = options.enabled === false? false: true;\n this.setPerAction('drag', options);\n this.setOnEvents('drag', options);\n\n if (/^(xy|x|y|start)$/.test(options.lockAxis)) {\n this.options.drag.lockAxis = options.lockAxis;\n }\n if (/^(xy|x|y)$/.test(options.startAxis)) {\n this.options.drag.startAxis = options.startAxis;\n }\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drag.enabled = options;\n\n if (!options) {\n this.ondragstart = this.ondragstart = this.ondragend = null;\n }\n\n return this;\n }\n\n return this.options.drag;\n};\n\nactions.drag = drag;\nactions.names.push('drag');\nutils.merge(Interactable.eventTypes, [\n 'dragstart',\n 'dragmove',\n 'draginertiastart',\n 'draginertiaresume',\n 'dragend',\n]);\nactions.methodDict.drag = 'draggable';\n\ndefaultOptions.drag = drag.defaults;\n\nmodule.exports = drag;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst scope = require('../scope');\nconst interact = require('../interact');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drop = {\n defaults: {\n enabled: false,\n accept : null,\n overlap: 'pointer',\n },\n};\n\nlet dynamicDrop = false;\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // reset active dropzones\n interaction.activeDrops.dropzones = [];\n interaction.activeDrops.elements = [];\n interaction.activeDrops.rects = [];\n\n interaction.dropEvents = null;\n\n if (!interaction.dynamicDrop) {\n setActiveDrops(interaction, interaction.element);\n }\n\n const dragEvent = interaction.prevEvent;\n const dropEvents = getDropEvents(interaction, event, dragEvent);\n\n if (dropEvents.activate) {\n fireActiveDrops(interaction, dropEvents.activate);\n }\n});\n\nInteractEvent.signals.on('new', function ({ interaction, iEvent, event }) {\n if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { return; }\n\n const draggableElement = interaction.element;\n const dragEvent = iEvent;\n const dropResult = getDrop(dragEvent, event, draggableElement);\n\n interaction.dropTarget = dropResult.dropzone;\n interaction.dropElement = dropResult.element;\n\n interaction.dropEvents = getDropEvents(interaction, event, dragEvent);\n});\n\nInteraction.signals.on('action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n fireDropEvents(interaction, interaction.dropEvents);\n});\n\nInteraction.signals.on('action-end', function ({ interaction }) {\n if (interaction.prepared.name === 'drag') {\n fireDropEvents(interaction, interaction.dropEvents);\n }\n});\n\nInteraction.signals.on('stop-drag', function ({ interaction }) {\n interaction.activeDrops.dropzones =\n interaction.activeDrops.elements =\n interaction.activeDrops.rects =\n interaction.dropEvents = null;\n});\n\nfunction collectDrops (interaction, element) {\n const drops = [];\n const elements = [];\n\n element = element || interaction.element;\n\n // collect all dropzones and their elements which qualify for a drop\n for (const current of scope.interactables) {\n if (!current.options.drop.enabled) { continue; }\n\n const accept = current.options.drop.accept;\n\n // test the draggable element against the dropzone's accept setting\n if ((utils.is.element(accept) && accept !== element)\n || (utils.is.string(accept)\n && !utils.matchesSelector(element, accept))) {\n\n continue;\n }\n\n // query for new elements if necessary\n const dropElements = utils.is.string(current.target)\n ? current._context.querySelectorAll(current.target)\n : [current.target];\n\n for (let i = 0; i < dropElements.length; i++) {\n const currentElement = dropElements[i];\n\n if (currentElement !== element) {\n drops.push(current);\n elements.push(currentElement);\n }\n }\n }\n\n return {\n elements,\n dropzones: drops,\n };\n}\n\nfunction fireActiveDrops (interaction, event) {\n let prevElement;\n\n // loop through all active dropzones and trigger event\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n const current = interaction.activeDrops.dropzones[i];\n const currentElement = interaction.activeDrops.elements [i];\n\n // prevent trigger of duplicate events on same element\n if (currentElement !== prevElement) {\n // set current element as event target\n event.target = currentElement;\n current.fire(event);\n }\n prevElement = currentElement;\n }\n}\n\n// Collect a new set of possible drops and save them in activeDrops.\n// setActiveDrops should always be called when a drag has just started or a\n// drag event happens while dynamicDrop is true\nfunction setActiveDrops (interaction, dragElement) {\n // get dropzones and their elements that could receive the draggable\n const possibleDrops = collectDrops(interaction, dragElement, true);\n\n interaction.activeDrops.dropzones = possibleDrops.dropzones;\n interaction.activeDrops.elements = possibleDrops.elements;\n interaction.activeDrops.rects = [];\n\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n interaction.activeDrops.rects[i] =\n interaction.activeDrops.dropzones[i].getRect(interaction.activeDrops.elements[i]);\n }\n}\n\nfunction getDrop (dragEvent, event, dragElement) {\n const interaction = dragEvent.interaction;\n const validDrops = [];\n\n if (dynamicDrop) {\n setActiveDrops(interaction, dragElement);\n }\n\n // collect all dropzones and their elements which qualify for a drop\n for (let j = 0; j < interaction.activeDrops.dropzones.length; j++) {\n const current = interaction.activeDrops.dropzones[j];\n const currentElement = interaction.activeDrops.elements [j];\n const rect = interaction.activeDrops.rects [j];\n\n validDrops.push(current.dropCheck(dragEvent, event, interaction.target, dragElement, currentElement, rect)\n ? currentElement\n : null);\n }\n\n // get the most appropriate dropzone based on DOM depth and order\n const dropIndex = utils.indexOfDeepestElement(validDrops);\n\n return {\n dropzone: interaction.activeDrops.dropzones[dropIndex] || null,\n element : interaction.activeDrops.elements [dropIndex] || null,\n };\n}\n\nfunction getDropEvents (interaction, pointerEvent, dragEvent) {\n const dropEvents = {\n enter : null,\n leave : null,\n activate : null,\n deactivate: null,\n move : null,\n drop : null,\n };\n\n const tmpl = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n };\n\n if (interaction.dropElement !== interaction.prevDropElement) {\n // if there was a prevDropTarget, create a dragleave event\n if (interaction.prevDropTarget) {\n dropEvents.leave = utils.extend({ type: 'dragleave' }, tmpl);\n\n dragEvent.dragLeave = dropEvents.leave.target = interaction.prevDropElement;\n dragEvent.prevDropzone = dropEvents.leave.dropzone = interaction.prevDropTarget;\n }\n // if the dropTarget is not null, create a dragenter event\n if (interaction.dropTarget) {\n dropEvents.enter = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n type : 'dragenter',\n };\n\n dragEvent.dragEnter = interaction.dropElement;\n dragEvent.dropzone = interaction.dropTarget;\n }\n }\n\n if (dragEvent.type === 'dragend' && interaction.dropTarget) {\n dropEvents.drop = utils.extend({ type: 'drop' }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n dragEvent.relatedTarget = interaction.dropElement;\n }\n if (dragEvent.type === 'dragstart') {\n dropEvents.activate = utils.extend({ type: 'dropactivate' }, tmpl);\n\n dropEvents.activate.target = null;\n dropEvents.activate.dropzone = null;\n }\n if (dragEvent.type === 'dragend') {\n dropEvents.deactivate = utils.extend({ type: 'dropdeactivate' }, tmpl);\n\n dropEvents.deactivate.target = null;\n dropEvents.deactivate.dropzone = null;\n }\n if (dragEvent.type === 'dragmove' && interaction.dropTarget) {\n dropEvents.move = utils.extend({\n dragmove : dragEvent,\n type : 'dropmove',\n }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n }\n\n return dropEvents;\n}\n\nfunction fireDropEvents (interaction, dropEvents) {\n if (dropEvents.leave) { interaction.prevDropTarget.fire(dropEvents.leave); }\n if (dropEvents.move ) { interaction.dropTarget.fire(dropEvents.move ); }\n if (dropEvents.enter) { interaction.dropTarget.fire(dropEvents.enter); }\n if (dropEvents.drop ) { interaction.dropTarget.fire(dropEvents.drop ); }\n if (dropEvents.deactivate) {\n fireActiveDrops(interaction, dropEvents.deactivate);\n }\n\n interaction.prevDropTarget = interaction.dropTarget;\n interaction.prevDropElement = interaction.dropElement;\n}\n\n/*\\\n * Interactable.dropzone\n [ method ]\n *\n * Returns or sets whether elements can be dropped onto this\n * Interactable to trigger drop events\n *\n * Dropzones can receive the following events:\n * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends\n * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone\n * - `dragmove` when a draggable that has entered the dropzone is moved\n * - `drop` when a draggable is dropped into this dropzone\n *\n * Use the `accept` option to allow only elements that match the given CSS\n * selector or element. The value can be:\n *\n * - **an Element** - only that element can be dropped into this dropzone.\n * - **a string**, - the element being dragged must match it as a CSS selector.\n * - **`null`** - accept options is cleared - it accepts any element.\n *\n * Use the `overlap` option to set how drops are checked for. The allowed\n * values are:\n *\n * - `'pointer'`, the pointer must be over the dropzone (default)\n * - `'center'`, the draggable element's center must be over the dropzone\n * - a number from 0-1 which is the `(intersection area) / (draggable area)`.\n * e.g. `0.5` for drop to happen when half of the area of the draggable is\n * over the dropzone\n *\n * Use the `checker` option to specify a function to check if a dragged\n * element is over this Interactable.\n *\n | interact(target)\n | .dropChecker(function(dragEvent, // related dragmove or dragend event\n | event, // TouchEvent/PointerEvent/MouseEvent\n | dropped, // bool result of the default checker\n | dropzone, // dropzone Interactable\n | dropElement, // dropzone elemnt\n | draggable, // draggable Interactable\n | draggableElement) {// draggable element\n |\n | return dropped && event.target.hasAttribute('allow-drop');\n | }\n *\n *\n - options (boolean | object | null) #optional The new value to be set.\n | interact('.drop').dropzone({\n | accept: '.can-drop' || document.getElementById('single-drop'),\n | overlap: 'pointer' || 'center' || zeroToOne\n | }\n = (boolean | object) The current setting or this Interactable\n\\*/\nInteractable.prototype.dropzone = function (options) {\n if (utils.is.object(options)) {\n this.options.drop.enabled = options.enabled === false? false: true;\n\n if (utils.is.function(options.ondrop) ) { this.events.ondrop = options.ondrop ; }\n if (utils.is.function(options.ondropactivate) ) { this.events.ondropactivate = options.ondropactivate ; }\n if (utils.is.function(options.ondropdeactivate)) { this.events.ondropdeactivate = options.ondropdeactivate; }\n if (utils.is.function(options.ondragenter) ) { this.events.ondragenter = options.ondragenter ; }\n if (utils.is.function(options.ondragleave) ) { this.events.ondragleave = options.ondragleave ; }\n if (utils.is.function(options.ondropmove) ) { this.events.ondropmove = options.ondropmove ; }\n\n if (/^(pointer|center)$/.test(options.overlap)) {\n this.options.drop.overlap = options.overlap;\n }\n else if (utils.is.number(options.overlap)) {\n this.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0);\n }\n if ('accept' in options) {\n this.options.drop.accept = options.accept;\n }\n if ('checker' in options) {\n this.options.drop.checker = options.checker;\n }\n\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drop.enabled = options;\n\n if (!options) {\n this.ondragenter = this.ondragleave = this.ondrop\n = this.ondropactivate = this.ondropdeactivate = null;\n }\n\n return this;\n }\n\n return this.options.drop;\n};\n\nInteractable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) {\n let dropped = false;\n\n // if the dropzone has no rect (eg. display: none)\n // call the custom dropChecker or just return false\n if (!(rect = rect || this.getRect(dropElement))) {\n return (this.options.drop.checker\n ? this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement)\n : false);\n }\n\n const dropOverlap = this.options.drop.overlap;\n\n if (dropOverlap === 'pointer') {\n const origin = utils.getOriginXY(draggable, draggableElement, 'drag');\n const page = utils.getPageXY(dragEvent);\n\n page.x += origin.x;\n page.y += origin.y;\n\n const horizontal = (page.x > rect.left) && (page.x < rect.right);\n const vertical = (page.y > rect.top ) && (page.y < rect.bottom);\n\n dropped = horizontal && vertical;\n }\n\n const dragRect = draggable.getRect(draggableElement);\n\n if (dragRect && dropOverlap === 'center') {\n const cx = dragRect.left + dragRect.width / 2;\n const cy = dragRect.top + dragRect.height / 2;\n\n dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom;\n }\n\n if (dragRect && utils.is.number(dropOverlap)) {\n const overlapArea = (Math.max(0, Math.min(rect.right , dragRect.right ) - Math.max(rect.left, dragRect.left))\n * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top , dragRect.top )));\n\n const overlapRatio = overlapArea / (dragRect.width * dragRect.height);\n\n dropped = overlapRatio >= dropOverlap;\n }\n\n if (this.options.drop.checker) {\n dropped = this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement);\n }\n\n return dropped;\n};\n\nInteractable.signals.on('unset', function ({ interactable }) {\n interactable.dropzone(false);\n});\n\nInteractable.settingsMethods.push('dropChecker');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.dropTarget = null; // the dropzone a drag target might be dropped into\n interaction.dropElement = null; // the element at the time of checking\n interaction.prevDropTarget = null; // the dropzone that was recently dragged away from\n interaction.prevDropElement = null; // the element at the time of checking\n interaction.dropEvents = null; // the dropEvents related to the current drag event\n\n interaction.activeDrops = {\n dropzones: [], // the dropzones that are mentioned below\n elements : [], // elements of dropzones that accept the target draggable\n rects : [], // the rects of the elements mentioned above\n };\n\n});\n\nInteraction.signals.on('stop', function ({ interaction }) {\n interaction.dropTarget = interaction.dropElement =\n interaction.prevDropTarget = interaction.prevDropElement = null;\n});\n\n/*\\\n * interact.dynamicDrop\n [ method ]\n *\n * Returns or sets whether the dimensions of dropzone elements are\n * calculated on every dragmove or only on dragstart for the default\n * dropChecker\n *\n - newValue (boolean) #optional True to check on each move. False to check only before start\n = (boolean | interact) The current setting or interact\n\\*/\ninteract.dynamicDrop = function (newValue) {\n if (utils.is.bool(newValue)) {\n //if (dragging && dynamicDrop !== newValue && !newValue) {\n //calcRects(dropzones);\n //}\n\n dynamicDrop = newValue;\n\n return interact;\n }\n return dynamicDrop;\n};\n\nutils.merge(Interactable.eventTypes, [\n 'dragenter',\n 'dragleave',\n 'dropactivate',\n 'dropdeactivate',\n 'dropmove',\n 'drop',\n]);\nactions.methodDict.drop = 'dropzone';\n\ndefaultOptions.drop = drop.defaults;\n\nmodule.exports = drop;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst gesture = {\n defaults: {\n enabled : false,\n origin : null,\n restrict: null,\n },\n\n checker: function (pointer, event, interactable, element, interaction) {\n if (interaction.pointerIds.length >= 2) {\n return { name: 'gesture' };\n }\n\n return null;\n },\n\n getCursor: function () {\n return '';\n },\n};\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturestart') { return; }\n iEvent.ds = 0;\n\n interaction.gesture.startDistance = interaction.gesture.prevDistance = iEvent.distance;\n interaction.gesture.startAngle = interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.scale = 1;\n});\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturemove') { return; }\n\n iEvent.ds = iEvent.scale - interaction.gesture.scale;\n\n interaction.target.fire(iEvent);\n\n interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.prevDistance = iEvent.distance;\n\n if (iEvent.scale !== Infinity\n && iEvent.scale !== null\n && iEvent.scale !== undefined\n && !isNaN(iEvent.scale)) {\n\n interaction.gesture.scale = iEvent.scale;\n }\n});\n\n/*\\\n * Interactable.gesturable\n [ method ]\n *\n * Gets or sets whether multitouch gestures can be performed on the\n * Interactable's element\n *\n = (boolean) Indicates if this can be the target of gesture events\n | var isGestureable = interact(element).gesturable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on gesture events (makes the Interactable gesturable)\n = (object) this Interactable\n | interact(element).gesturable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // limit multiple gestures.\n | // See the explanation in @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n\\*/\nInteractable.prototype.gesturable = function (options) {\n if (utils.is.object(options)) {\n this.options.gesture.enabled = options.enabled === false? false: true;\n this.setPerAction('gesture', options);\n this.setOnEvents('gesture', options);\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.gesture.enabled = options;\n\n if (!options) {\n this.ongesturestart = this.ongesturestart = this.ongestureend = null;\n }\n\n return this;\n }\n\n return this.options.gesture;\n};\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action, event, starting, ending, deltaSource }) {\n if (action !== 'gesture') { return; }\n\n const pointers = interaction.pointers;\n\n iEvent.touches = [pointers[0], pointers[1]];\n\n if (starting) {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = 1;\n iEvent.ds = 0;\n iEvent.angle = utils.touchAngle(pointers, undefined, deltaSource);\n iEvent.da = 0;\n }\n else if (ending || event instanceof InteractEvent) {\n iEvent.distance = interaction.prevEvent.distance;\n iEvent.box = interaction.prevEvent.box;\n iEvent.scale = interaction.prevEvent.scale;\n iEvent.ds = iEvent.scale - 1;\n iEvent.angle = interaction.prevEvent.angle;\n iEvent.da = iEvent.angle - interaction.gesture.startAngle;\n }\n else {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = iEvent.distance / interaction.gesture.startDistance;\n iEvent.angle = utils.touchAngle(pointers, interaction.gesture.prevAngle, deltaSource);\n\n iEvent.ds = iEvent.scale - interaction.gesture.prevScale;\n iEvent.da = iEvent.angle - interaction.gesture.prevAngle;\n }\n});\n\nInteraction.signals.on('new', function (interaction) {\n interaction.gesture = {\n start: { x: 0, y: 0 },\n\n startDistance: 0, // distance between two touches of touchStart\n prevDistance : 0,\n distance : 0,\n\n scale: 1, // gesture.distance / gesture.startDistance\n\n startAngle: 0, // angle of line joining two touches\n prevAngle : 0, // angle of the previous gesture event\n };\n});\n\nactions.gesture = gesture;\nactions.names.push('gesture');\nutils.merge(Interactable.eventTypes, [\n 'gesturestart',\n 'gesturemove',\n 'gestureend',\n]);\nactions.methodDict.gesture = 'gesturable';\n\ndefaultOptions.gesture = gesture.defaults;\n\nmodule.exports = gesture;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\n// Less Precision with touch input\nconst defaultMargin = browser.supportsTouch || browser.supportsPointerEvent? 20: 10;\n\nconst resize = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n square: false,\n preserveAspectRatio: false,\n axis: 'xy',\n\n // use default margin\n margin: NaN,\n\n // object with props left, right, top, bottom which are\n // true/false values to resize when the pointer is over that edge,\n // CSS selectors to match the handles for each direction\n // or the Elements for each handle\n edges: null,\n\n // a value of 'none' will limit the resize rect to a minimum of 0x0\n // 'negate' will alow the rect to have negative width/height\n // 'reposition' will keep the width/height positive by swapping\n // the top and bottom edges and/or swapping the left and right edges\n invert: 'none',\n },\n\n checker: function (pointer, event, interactable, element, interaction, rect) {\n if (!rect) { return null; }\n\n const page = utils.extend({}, interaction.curCoords.page);\n const options = interactable.options;\n\n if (options.resize.enabled) {\n const resizeOptions = options.resize;\n const resizeEdges = { left: false, right: false, top: false, bottom: false };\n\n // if using resize.edges\n if (utils.is.object(resizeOptions.edges)) {\n for (const edge in resizeEdges) {\n resizeEdges[edge] = checkResizeEdge(edge,\n resizeOptions.edges[edge],\n page,\n interaction._eventTarget,\n element,\n rect,\n resizeOptions.margin || defaultMargin);\n }\n\n resizeEdges.left = resizeEdges.left && !resizeEdges.right;\n resizeEdges.top = resizeEdges.top && !resizeEdges.bottom;\n\n if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) {\n return {\n name: 'resize',\n edges: resizeEdges,\n };\n }\n }\n else {\n const right = options.resize.axis !== 'y' && page.x > (rect.right - defaultMargin);\n const bottom = options.resize.axis !== 'x' && page.y > (rect.bottom - defaultMargin);\n\n if (right || bottom) {\n return {\n name: 'resize',\n axes: (right? 'x' : '') + (bottom? 'y' : ''),\n };\n }\n }\n }\n\n return null;\n },\n\n cursors: (browser.isIe9OrOlder ? {\n x : 'e-resize',\n y : 's-resize',\n xy: 'se-resize',\n\n top : 'n-resize',\n left : 'w-resize',\n bottom : 's-resize',\n right : 'e-resize',\n topleft : 'se-resize',\n bottomright: 'se-resize',\n topright : 'ne-resize',\n bottomleft : 'ne-resize',\n } : {\n x : 'ew-resize',\n y : 'ns-resize',\n xy: 'nwse-resize',\n\n top : 'ns-resize',\n left : 'ew-resize',\n bottom : 'ns-resize',\n right : 'ew-resize',\n topleft : 'nwse-resize',\n bottomright: 'nwse-resize',\n topright : 'nesw-resize',\n bottomleft : 'nesw-resize',\n }),\n\n getCursor: function (action) {\n if (action.axis) {\n return resize.cursors[action.name + action.axis];\n }\n else if (action.edges) {\n let cursorKey = '';\n const edgeNames = ['top', 'bottom', 'left', 'right'];\n\n for (let i = 0; i < 4; i++) {\n if (action.edges[edgeNames[i]]) {\n cursorKey += edgeNames[i];\n }\n }\n\n return resize.cursors[cursorKey];\n }\n },\n};\n\n// resizestart\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'resizestart' || !interaction.prepared.edges) {\n return;\n }\n\n const startRect = interaction.target.getRect(interaction.element);\n const resizeOptions = interaction.target.options.resize;\n\n /*\n * When using the `resizable.square` or `resizable.preserveAspectRatio` options, resizing from one edge\n * will affect another. E.g. with `resizable.square`, resizing to make the right edge larger will make\n * the bottom edge larger by the same amount. We call these 'linked' edges. Any linked edges will depend\n * on the active edges and the edge being interacted with.\n */\n if (resizeOptions.square || resizeOptions.preserveAspectRatio) {\n const linkedEdges = utils.extend({}, interaction.prepared.edges);\n\n linkedEdges.top = linkedEdges.top || (linkedEdges.left && !linkedEdges.bottom);\n linkedEdges.left = linkedEdges.left || (linkedEdges.top && !linkedEdges.right );\n linkedEdges.bottom = linkedEdges.bottom || (linkedEdges.right && !linkedEdges.top );\n linkedEdges.right = linkedEdges.right || (linkedEdges.bottom && !linkedEdges.left );\n\n interaction.prepared._linkedEdges = linkedEdges;\n }\n else {\n interaction.prepared._linkedEdges = null;\n }\n\n // if using `resizable.preserveAspectRatio` option, record aspect ratio at the start of the resize\n if (resizeOptions.preserveAspectRatio) {\n interaction.resizeStartAspectRatio = startRect.width / startRect.height;\n }\n\n interaction.resizeRects = {\n start : startRect,\n current : utils.extend({}, startRect),\n inverted : utils.extend({}, startRect),\n previous : utils.extend({}, startRect),\n delta : {\n left: 0, right : 0, width : 0,\n top : 0, bottom: 0, height: 0,\n },\n };\n\n iEvent.rect = interaction.resizeRects.inverted;\n iEvent.deltaRect = interaction.resizeRects.delta;\n});\n\n// resizemove\nInteractEvent.signals.on('new', function ({ iEvent, phase, interaction }) {\n if (phase !== 'move' || !interaction.prepared.edges) { return; }\n\n const resizeOptions = interaction.target.options.resize;\n const invert = resizeOptions.invert;\n const invertible = invert === 'reposition' || invert === 'negate';\n\n let edges = interaction.prepared.edges;\n\n const start = interaction.resizeRects.start;\n const current = interaction.resizeRects.current;\n const inverted = interaction.resizeRects.inverted;\n const delta = interaction.resizeRects.delta;\n const previous = utils.extend(interaction.resizeRects.previous, inverted);\n const originalEdges = edges;\n\n let dx = iEvent.dx;\n let dy = iEvent.dy;\n\n if (resizeOptions.preserveAspectRatio || resizeOptions.square) {\n // `resize.preserveAspectRatio` takes precedence over `resize.square`\n const startAspectRatio = resizeOptions.preserveAspectRatio\n ? interaction.resizeStartAspectRatio\n : 1;\n\n edges = interaction.prepared._linkedEdges;\n\n if ((originalEdges.left && originalEdges.bottom)\n || (originalEdges.right && originalEdges.top)) {\n dy = -dx / startAspectRatio;\n }\n else if (originalEdges.left || originalEdges.right ) { dy = dx / startAspectRatio; }\n else if (originalEdges.top || originalEdges.bottom) { dx = dy * startAspectRatio; }\n }\n\n // update the 'current' rect without modifications\n if (edges.top ) { current.top += dy; }\n if (edges.bottom) { current.bottom += dy; }\n if (edges.left ) { current.left += dx; }\n if (edges.right ) { current.right += dx; }\n\n if (invertible) {\n // if invertible, copy the current rect\n utils.extend(inverted, current);\n\n if (invert === 'reposition') {\n // swap edge values if necessary to keep width/height positive\n let swap;\n\n if (inverted.top > inverted.bottom) {\n swap = inverted.top;\n\n inverted.top = inverted.bottom;\n inverted.bottom = swap;\n }\n if (inverted.left > inverted.right) {\n swap = inverted.left;\n\n inverted.left = inverted.right;\n inverted.right = swap;\n }\n }\n }\n else {\n // if not invertible, restrict to minimum of 0x0 rect\n inverted.top = Math.min(current.top, start.bottom);\n inverted.bottom = Math.max(current.bottom, start.top);\n inverted.left = Math.min(current.left, start.right);\n inverted.right = Math.max(current.right, start.left);\n }\n\n inverted.width = inverted.right - inverted.left;\n inverted.height = inverted.bottom - inverted.top ;\n\n for (const edge in inverted) {\n delta[edge] = inverted[edge] - previous[edge];\n }\n\n iEvent.edges = interaction.prepared.edges;\n iEvent.rect = inverted;\n iEvent.deltaRect = delta;\n});\n\n/*\\\n * Interactable.resizable\n [ method ]\n *\n * Gets or sets whether resize actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of resize elements\n | var isResizeable = interact('input[type=text]').resizable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on resize events (object makes the Interactable resizable)\n = (object) This Interactable\n | interact(element).resizable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | edges: {\n | top : true, // Use pointer coords to check for resize.\n | left : false, // Disable resizing from left edge.\n | bottom: '.resize-s',// Resize if pointer target matches selector\n | right : handleEl // Resize if pointer target is the given Element\n | },\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height are adjusted at a 1:1 ratio.\n | square: false,\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height maintain the aspect ratio they had when resizing started.\n | preserveAspectRatio: false,\n |\n | // a value of 'none' will limit the resize rect to a minimum of 0x0\n | // 'negate' will allow the rect to have negative width/height\n | // 'reposition' will keep the width/height positive by swapping\n | // the top and bottom edges and/or swapping the left and right edges\n | invert: 'none' || 'negate' || 'reposition'\n |\n | // limit multiple resizes.\n | // See the explanation in the @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n \\*/\nInteractable.prototype.resizable = function (options) {\n if (utils.is.object(options)) {\n this.options.resize.enabled = options.enabled === false? false: true;\n this.setPerAction('resize', options);\n this.setOnEvents('resize', options);\n\n if (/^x$|^y$|^xy$/.test(options.axis)) {\n this.options.resize.axis = options.axis;\n }\n else if (options.axis === null) {\n this.options.resize.axis = defaultOptions.resize.axis;\n }\n\n if (utils.is.bool(options.preserveAspectRatio)) {\n this.options.resize.preserveAspectRatio = options.preserveAspectRatio;\n }\n else if (utils.is.bool(options.square)) {\n this.options.resize.square = options.square;\n }\n\n return this;\n }\n if (utils.is.bool(options)) {\n this.options.resize.enabled = options;\n\n if (!options) {\n this.onresizestart = this.onresizestart = this.onresizeend = null;\n }\n\n return this;\n }\n return this.options.resize;\n};\n\nfunction checkResizeEdge (name, value, page, element, interactableElement, rect, margin) {\n // false, '', undefined, null\n if (!value) { return false; }\n\n // true value, use pointer coords and element rect\n if (value === true) {\n // if dimensions are negative, \"switch\" edges\n const width = utils.is.number(rect.width )? rect.width : rect.right - rect.left;\n const height = utils.is.number(rect.height)? rect.height : rect.bottom - rect.top ;\n\n if (width < 0) {\n if (name === 'left' ) { name = 'right'; }\n else if (name === 'right') { name = 'left' ; }\n }\n if (height < 0) {\n if (name === 'top' ) { name = 'bottom'; }\n else if (name === 'bottom') { name = 'top' ; }\n }\n\n if (name === 'left' ) { return page.x < ((width >= 0? rect.left: rect.right ) + margin); }\n if (name === 'top' ) { return page.y < ((height >= 0? rect.top : rect.bottom) + margin); }\n\n if (name === 'right' ) { return page.x > ((width >= 0? rect.right : rect.left) - margin); }\n if (name === 'bottom') { return page.y > ((height >= 0? rect.bottom: rect.top ) - margin); }\n }\n\n // the remaining checks require an element\n if (!utils.is.element(element)) { return false; }\n\n return utils.is.element(value)\n // the value is an element to use as a resize handle\n ? value === element\n // otherwise check if element matches value as selector\n : utils.matchesUpTo(element, value, interactableElement);\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.resizeAxes = 'xy';\n});\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action }) {\n if (action !== 'resize' || !interaction.resizeAxes) { return; }\n\n const options = interaction.target.options;\n\n if (options.resize.square) {\n if (interaction.resizeAxes === 'y') {\n iEvent.dx = iEvent.dy;\n }\n else {\n iEvent.dy = iEvent.dx;\n }\n iEvent.axes = 'xy';\n }\n else {\n iEvent.axes = interaction.resizeAxes;\n\n if (interaction.resizeAxes === 'x') {\n iEvent.dy = 0;\n }\n else if (interaction.resizeAxes === 'y') {\n iEvent.dx = 0;\n }\n }\n});\n\nactions.resize = resize;\nactions.names.push('resize');\nutils.merge(Interactable.eventTypes, [\n 'resizestart',\n 'resizemove',\n 'resizeinertiastart',\n 'resizeinertiaresume',\n 'resizeend',\n]);\nactions.methodDict.resize = 'resizable';\n\ndefaultOptions.resize = resize.defaults;\n\nmodule.exports = resize;\n","const raf = require('./utils/raf');\nconst getWindow = require('./utils/window').getWindow;\nconst is = require('./utils/is');\nconst domUtils = require('./utils/domUtils');\nconst Interaction = require('./Interaction');\nconst defaultOptions = require('./defaultOptions');\n\nconst autoScroll = {\n defaults: {\n enabled : false,\n container: null, // the item that is scrolled (Window or HTMLElement)\n margin : 60,\n speed : 300, // the scroll speed in pixels per second\n },\n\n interaction: null,\n i: null, // the handle returned by window.setInterval\n x: 0, y: 0, // Direction each pulse is to scroll in\n\n isScrolling: false,\n prevTime: 0,\n\n start: function (interaction) {\n autoScroll.isScrolling = true;\n raf.cancel(autoScroll.i);\n\n autoScroll.interaction = interaction;\n autoScroll.prevTime = new Date().getTime();\n autoScroll.i = raf.request(autoScroll.scroll);\n },\n\n stop: function () {\n autoScroll.isScrolling = false;\n raf.cancel(autoScroll.i);\n },\n\n // scroll the window by the values in scroll.x/y\n scroll: function () {\n const options = autoScroll.interaction.target.options[autoScroll.interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(autoScroll.interaction.element);\n const now = new Date().getTime();\n // change in time in seconds\n const dt = (now - autoScroll.prevTime) / 1000;\n // displacement\n const s = options.speed * dt;\n\n if (s >= 1) {\n if (is.window(container)) {\n container.scrollBy(autoScroll.x * s, autoScroll.y * s);\n }\n else if (container) {\n container.scrollLeft += autoScroll.x * s;\n container.scrollTop += autoScroll.y * s;\n }\n\n autoScroll.prevTime = now;\n }\n\n if (autoScroll.isScrolling) {\n raf.cancel(autoScroll.i);\n autoScroll.i = raf.request(autoScroll.scroll);\n }\n },\n check: function (interactable, actionName) {\n const options = interactable.options;\n\n return options[actionName].autoScroll && options[actionName].autoScroll.enabled;\n },\n onInteractionMove: function ({ interaction, pointer }) {\n if (!(interaction.interacting()\n && autoScroll.check(interaction.target, interaction.prepared.name))) {\n return;\n }\n\n if (interaction.simulation) {\n autoScroll.x = autoScroll.y = 0;\n return;\n }\n\n let top;\n let right;\n let bottom;\n let left;\n\n const options = interaction.target.options[interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(interaction.element);\n\n if (is.window(container)) {\n left = pointer.clientX < autoScroll.margin;\n top = pointer.clientY < autoScroll.margin;\n right = pointer.clientX > container.innerWidth - autoScroll.margin;\n bottom = pointer.clientY > container.innerHeight - autoScroll.margin;\n }\n else {\n const rect = domUtils.getElementClientRect(container);\n\n left = pointer.clientX < rect.left + autoScroll.margin;\n top = pointer.clientY < rect.top + autoScroll.margin;\n right = pointer.clientX > rect.right - autoScroll.margin;\n bottom = pointer.clientY > rect.bottom - autoScroll.margin;\n }\n\n autoScroll.x = (right ? 1: left? -1: 0);\n autoScroll.y = (bottom? 1: top? -1: 0);\n\n if (!autoScroll.isScrolling) {\n // set the autoScroll properties to those of the target\n autoScroll.margin = options.margin;\n autoScroll.speed = options.speed;\n\n autoScroll.start(interaction);\n }\n },\n};\n\nInteraction.signals.on('stop-active', function () {\n autoScroll.stop();\n});\n\nInteraction.signals.on('action-move', autoScroll.onInteractionMove);\n\ndefaultOptions.perAction.autoScroll = autoScroll.defaults;\n\nmodule.exports = autoScroll;\n","const Interactable = require('../Interactable');\nconst actions = require('../actions/base');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.ignoreFrom\n [ method ]\n *\n * If the target of the `mousedown`, `pointerdown` or `touchstart`\n * event or any of it's parents match the given CSS selector or\n * Element, no drag/resize/gesture is started.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to not ignore any elements\n = (string | Element | object) The current ignoreFrom value or this Interactable\n **\n | interact(element, { ignoreFrom: document.getElementById('no-action') });\n | // or\n | interact(element).ignoreFrom('input, textarea, a');\n\\*/\nInteractable.prototype.ignoreFrom = function (newValue) {\n return this._backCompatOption('ignoreFrom', newValue);\n};\n\n/*\\\n * Interactable.allowFrom\n [ method ]\n *\n * A drag/resize/gesture is started only If the target of the\n * `mousedown`, `pointerdown` or `touchstart` event or any of it's\n * parents match the given CSS selector or Element.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to allow from any element\n = (string | Element | object) The current allowFrom value or this Interactable\n **\n | interact(element, { allowFrom: document.getElementById('drag-handle') });\n | // or\n | interact(element).allowFrom('.handle');\n\\*/\nInteractable.prototype.allowFrom = function (newValue) {\n return this._backCompatOption('allowFrom', newValue);\n};\n\nInteractable.prototype.testIgnore = function (ignoreFrom, interactableElement, element) {\n if (!ignoreFrom || !is.element(element)) { return false; }\n\n if (is.string(ignoreFrom)) {\n return domUtils.matchesUpTo(element, ignoreFrom, interactableElement);\n }\n else if (is.element(ignoreFrom)) {\n return domUtils.nodeContains(ignoreFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testAllow = function (allowFrom, interactableElement, element) {\n if (!allowFrom) { return true; }\n\n if (!is.element(element)) { return false; }\n\n if (is.string(allowFrom)) {\n return domUtils.matchesUpTo(element, allowFrom, interactableElement);\n }\n else if (is.element(allowFrom)) {\n return domUtils.nodeContains(allowFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testIgnoreAllow = function (options, interactableElement, eventTarget) {\n return (!this.testIgnore(options.ignoreFrom, interactableElement, eventTarget)\n && this.testAllow(options.allowFrom, interactableElement, eventTarget));\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (event.buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\n","const interact = require('../interact');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst actions = require('../actions/base');\nconst defaultOptions = require('../defaultOptions');\nconst browser = require('../utils/browser');\nconst scope = require('../scope');\nconst utils = require('../utils');\nconst signals = require('../utils/Signals').new();\n\nrequire('./InteractableMethods');\n\nconst autoStart = {\n signals,\n withinInteractionLimit,\n // Allow this many interactions to happen simultaneously\n maxInteractions: Infinity,\n defaults: {\n perAction: {\n manualStart: false,\n max: Infinity,\n maxPerElement: 1,\n allowFrom: null,\n ignoreFrom: null,\n },\n },\n setActionDefaults: function (action) {\n utils.extend(action.defaults, autoStart.defaults.perAction);\n },\n};\n\n// set cursor style on mousedown\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget }) {\n if (interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\n// set cursor style on mousemove\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget }) {\n if (!interaction.mouse\n || interaction.pointerIsDown\n || interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\nInteraction.signals.on('move', function (arg) {\n const { interaction, event } = arg;\n\n if (!interaction.pointerIsDown\n || interaction.interacting()\n || !interaction.pointerWasMoved\n || !interaction.prepared.name) {\n return;\n }\n\n signals.fire('before-start', arg);\n\n const target = interaction.target;\n\n if (interaction.prepared.name && target) {\n // check manualStart and interaction limit\n if (target.options[interaction.prepared.name].manualStart\n || !withinInteractionLimit(target, interaction.element, interaction.prepared)) {\n interaction.stop(event);\n }\n else {\n interaction.start(interaction.prepared, target, interaction.element);\n }\n }\n});\n\n// Check if the current target supports the action.\n// If so, return the validated action. Otherwise, return null\nfunction validateAction (action, interactable, element, eventTarget) {\n if (utils.is.object(action)\n && interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget)\n && interactable.options[action.name].enabled\n && withinInteractionLimit(interactable, element, action)) {\n return action;\n }\n\n return null;\n}\n\nfunction validateSelector (interaction, pointer, event, matches, matchElements, eventTarget) {\n for (let i = 0, len = matches.length; i < len; i++) {\n const match = matches[i];\n const matchElement = matchElements[i];\n const action = validateAction(match.getAction(pointer, event, interaction, matchElement),\n match,\n matchElement,\n eventTarget);\n\n if (action) {\n return {\n action,\n target: match,\n element: matchElement,\n };\n }\n }\n\n return {};\n}\n\nfunction getActionInfo (interaction, pointer, event, eventTarget) {\n let matches = [];\n let matchElements = [];\n\n let element = eventTarget;\n let action = null;\n\n function pushMatches (interactable, selector, context) {\n const elements = (browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined);\n\n if (utils.matchesSelector(element, selector, elements)) {\n\n matches.push(interactable);\n matchElements.push(element);\n }\n }\n\n while (utils.is.element(element)) {\n matches = [];\n matchElements = [];\n\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && (action = validateAction(elementInteractable.getAction(pointer, event, interaction, element, eventTarget),\n elementInteractable,\n element,\n eventTarget))\n && !elementInteractable.options[action.name].manualStart) {\n return {\n element,\n action,\n target: elementInteractable,\n };\n }\n else {\n scope.interactables.forEachSelector(pushMatches, element);\n\n const actionInfo = validateSelector(interaction, pointer, event, matches, matchElements, eventTarget);\n\n if (actionInfo.action\n && !actionInfo.target.options[actionInfo.action.name].manualStart) {\n return actionInfo;\n }\n }\n\n element = utils.parentNode(element);\n }\n\n return {};\n}\n\nfunction prepare (interaction, { action, target, element }) {\n action = action || {};\n\n if (interaction.target && interaction.target.options.styleCursor) {\n interaction.target._doc.documentElement.style.cursor = '';\n }\n\n interaction.target = target;\n interaction.element = element;\n utils.copyAction(interaction.prepared, action);\n\n if (target && target.options.styleCursor) {\n const cursor = action? actions[action.name].getCursor(action) : '';\n interaction.target._doc.documentElement.style.cursor = cursor;\n }\n\n signals.fire('prepared', { interaction: interaction });\n}\n\nInteraction.signals.on('stop', function ({ interaction }) {\n const target = interaction.target;\n\n if (target && target.options.styleCursor) {\n target._doc.documentElement.style.cursor = '';\n }\n});\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (utils.is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (utils.is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n const buttons = event.buttons || ({\n 0: 1,\n 1: 4,\n 3: 8,\n 4: 16,\n })[event.button];\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\nfunction withinInteractionLimit (interactable, element, action) {\n const options = interactable.options;\n const maxActions = options[action.name].max;\n const maxPerElement = options[action.name].maxPerElement;\n let activeInteractions = 0;\n let targetCount = 0;\n let targetElementCount = 0;\n\n // no actions if any of these values == 0\n if (!(maxActions && maxPerElement && autoStart.maxInteractions)) { return; }\n\n for (let i = 0, len = scope.interactions.length; i < len; i++) {\n const interaction = scope.interactions[i];\n const otherAction = interaction.prepared.name;\n\n if (!interaction.interacting()) { continue; }\n\n activeInteractions++;\n\n if (activeInteractions >= autoStart.maxInteractions) {\n return false;\n }\n\n if (interaction.target !== interactable) { continue; }\n\n targetCount += (otherAction === action.name)|0;\n\n if (targetCount >= maxActions) {\n return false;\n }\n\n if (interaction.element === element) {\n targetElementCount++;\n\n if (otherAction !== action.name || targetElementCount >= maxPerElement) {\n return false;\n }\n }\n }\n\n return autoStart.maxInteractions > 0;\n}\n\n/*\\\n * interact.maxInteractions\n [ method ]\n **\n * Returns or sets the maximum number of concurrent interactions allowed.\n * By default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables\n * and elements, you need to enable it in the draggable, resizable and\n * gesturable `'max'` and `'maxPerElement'` options.\n **\n - newValue (number) #optional Any number. newValue <= 0 means no interactions.\n\\*/\ninteract.maxInteractions = function (newValue) {\n if (utils.is.number(newValue)) {\n autoStart.maxInteractions = newValue;\n\n return this;\n }\n\n return autoStart.maxInteractions;\n};\n\nInteractable.settingsMethods.push('styleCursor');\nInteractable.settingsMethods.push('actionChecker');\nInteractable.settingsMethods.push('ignoreFrom');\nInteractable.settingsMethods.push('allowFrom');\n\ndefaultOptions.base.actionChecker = null;\ndefaultOptions.base.styleCursor = true;\n\nutils.extend(defaultOptions.perAction, autoStart.defaults.perAction);\n\nmodule.exports = autoStart;\n","const autoStart = require('./base');\nconst Interaction = require('../Interaction');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.delayTimer = null;\n});\n\nautoStart.signals.on('prepared', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.delayTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.target, interaction.element);\n }, delay);\n }\n});\n\nInteraction.signals.on('move', function ({ interaction, duplicate }) {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.delayTimer);\n }\n});\n\n// prevent regular down->move autoStart\nautoStart.signals.on('before-start', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.prepared.name = null;\n }\n});\n","const autoStart = require('./base');\nconst scope = require('../scope');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\n\nconst { matchesSelector, parentNode } = require('../utils/domUtils');\n\nautoStart.setActionDefaults(require('../actions/drag'));\n\nautoStart.signals.on('before-start', function ({ interaction, eventTarget, dx, dy }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // check if a drag is in the correct axis\n const absX = Math.abs(dx);\n const absY = Math.abs(dy);\n const options = interaction.target.options.drag;\n const startAxis = options.startAxis;\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy');\n\n interaction.prepared.axis = options.lockAxis === 'start'\n ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n : options.lockAxis;\n\n // if the movement isn't in the startAxis of the interactable\n if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) {\n // cancel the prepared action\n interaction.prepared.name = null;\n\n // then try to get a drag from another ineractable\n\n if (!interaction.prepared.name) {\n\n let element = eventTarget;\n\n const getDraggable = function (interactable, selector, context) {\n const elements = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n if (interactable === interaction.target) { return; }\n\n if (!options.manualStart\n && !interactable.testIgnoreAllow(options, element, eventTarget)\n && matchesSelector(element, selector, elements)) {\n\n const action = interactable.getAction(interaction.downPointer,\n interaction.downEvent,\n interaction,\n element);\n\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, interactable)\n && autoStart.validateAction(action, interactable, element, eventTarget)) {\n\n return interactable;\n }\n }\n };\n\n let action = null;\n\n // check all interactables\n while (is.element(element)) {\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && elementInteractable !== interaction.target\n && !elementInteractable.options.drag.manualStart) {\n\n action = elementInteractable.getAction(interaction.downPointer, interaction.downEvent, interaction, element);\n }\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, elementInteractable)) {\n\n interaction.prepared.name = 'drag';\n interaction.target = elementInteractable;\n interaction.element = element;\n break;\n }\n\n const selectorInteractable = scope.interactables.forEachSelector(getDraggable, element);\n\n if (selectorInteractable) {\n interaction.prepared.name = 'drag';\n interaction.target = selectorInteractable;\n interaction.element = element;\n break;\n }\n\n element = parentNode(element);\n }\n }\n }\n});\n\nfunction checkStartAxis (startAxis, interactable) {\n if (!interactable) { return false; }\n\n const thisAxis = interactable.options.drag.startAxis;\n\n return (startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis);\n}\n","require('./base').setActionDefaults(require('../actions/gesture'));\n","require('./base').setActionDefaults(require('../actions/resize'));\n","module.exports = {\n base: {\n accept : null,\n preventDefault: 'auto',\n deltaSource : 'page',\n },\n\n perAction: {\n origin: { x: 0, y: 0 },\n\n // only allow left button by default\n // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n mouseButtons: 1,\n\n inertia: {\n enabled : false,\n resistance : 10, // the lambda in exponential decay\n minSpeed : 100, // target speed must be above this for inertia to start\n endSpeed : 10, // the speed at which inertia is slow enough to stop\n allowResume : true, // allow resuming an action in inertia phase\n smoothEndDuration: 300, // animate to snap/restrict endOnly if there's no inertia\n },\n },\n};\n","/* browser entry point */\n\n// Legacy browser support\nrequire('./legacyBrowsers');\n\n// inertia\nrequire('./inertia');\n\n// modifiers\nrequire('./modifiers/snap');\nrequire('./modifiers/restrict');\n\n// pointerEvents\nrequire('./pointerEvents/base');\nrequire('./pointerEvents/holdRepeat');\nrequire('./pointerEvents/interactableTargets');\n\n// delay\nrequire('./autoStart/delay');\n\n// actions\nrequire('./actions/gesture');\nrequire('./actions/resize');\nrequire('./actions/drag');\nrequire('./actions/drop');\n\n// load these modifiers after resize is loaded\nrequire('./modifiers/snapSize');\nrequire('./modifiers/restrictEdges');\nrequire('./modifiers/restrictSize');\n\n// autoStart actions\nrequire('./autoStart/gesture');\nrequire('./autoStart/resize');\nrequire('./autoStart/drag');\n\n// Interactable preventDefault setting\nrequire('./interactablePreventDefault.js');\n\n// autoScroll\nrequire('./autoScroll');\n\n// export interact\nmodule.exports = require('./interact');\n","const InteractEvent = require('./InteractEvent');\nconst Interaction = require('./Interaction');\nconst modifiers = require('./modifiers');\nconst utils = require('./utils');\nconst animationFrame = require('./utils/raf');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.inertiaStatus = {\n active : false,\n smoothEnd : false,\n allowResume: false,\n\n startEvent: null,\n upCoords : {},\n\n xe: 0, ye: 0,\n sx: 0, sy: 0,\n\n t0: 0,\n vx0: 0, vys: 0,\n duration: 0,\n\n lambda_v0: 0,\n one_ve_v0: 0,\n i : null,\n };\n\n interaction.boundInertiaFrame = () => inertiaFrame .apply(interaction);\n interaction.boundSmoothEndFrame = () => smoothEndFrame.apply(interaction);\n});\n\nInteraction.signals.on('down', function ({ interaction, event, pointer, eventTarget }) {\n const status = interaction.inertiaStatus;\n\n // Check if the down event hits the current inertia target\n if (status.active) {\n let element = eventTarget;\n\n // climb up the DOM tree from the event target\n while (utils.is.element(element)) {\n\n // if interaction element is the current inertia target element\n if (element === interaction.element) {\n // stop inertia\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n\n // update pointers to the down event's coordinates\n interaction.updatePointer(pointer);\n utils.setCoords(interaction.curCoords, interaction.pointers);\n\n // fire appropriate signals\n const signalArg = { interaction };\n Interaction.signals.fire('before-action-move', signalArg);\n Interaction.signals.fire('action-resume' , signalArg);\n\n // fire a reume event\n const resumeEvent = new InteractEvent(interaction,\n event,\n interaction.prepared.name,\n 'inertiaresume',\n interaction.element);\n\n interaction.target.fire(resumeEvent);\n interaction.prevEvent = resumeEvent;\n modifiers.resetStatuses(interaction.modifierStatuses);\n\n utils.copyCoords(interaction.prevCoords, interaction.curCoords);\n break;\n }\n\n element = utils.parentNode(element);\n }\n }\n});\n\nInteraction.signals.on('up', function ({ interaction, event }) {\n const status = interaction.inertiaStatus;\n\n if (!interaction.interacting() || status.active) { return; }\n\n const target = interaction.target;\n const options = target && target.options;\n const inertiaOptions = options && interaction.prepared.name && options[interaction.prepared.name].inertia;\n\n const now = new Date().getTime();\n const statuses = {};\n const page = utils.extend({}, interaction.curCoords.page);\n const pointerSpeed = interaction.pointerDelta.client.speed;\n\n let smoothEnd = false;\n let modifierResult;\n\n // check if inertia should be started\n const inertiaPossible = (inertiaOptions && inertiaOptions.enabled\n && interaction.prepared.name !== 'gesture'\n && event !== status.startEvent);\n\n const inertia = (inertiaPossible\n && (now - interaction.curCoords.timeStamp) < 50\n && pointerSpeed > inertiaOptions.minSpeed\n && pointerSpeed > inertiaOptions.endSpeed);\n\n const modifierArg = {\n interaction,\n pageCoords: page,\n statuses,\n preEnd: true,\n requireEndOnly: true,\n };\n\n // smoothEnd\n if (inertiaPossible && !inertia) {\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n if (modifierResult.shouldMove && modifierResult.locked) {\n smoothEnd = true;\n }\n }\n\n if (!(inertia || smoothEnd)) { return; }\n\n utils.copyCoords(status.upCoords, interaction.curCoords);\n\n interaction.pointers[0] = status.startEvent =\n new InteractEvent(interaction, event, interaction.prepared.name, 'inertiastart', interaction.element);\n\n status.t0 = now;\n\n status.active = true;\n status.allowResume = inertiaOptions.allowResume;\n interaction.simulation = status;\n\n target.fire(status.startEvent);\n\n if (inertia) {\n status.vx0 = interaction.pointerDelta.client.vx;\n status.vy0 = interaction.pointerDelta.client.vy;\n status.v0 = pointerSpeed;\n\n calcInertia(interaction, status);\n\n utils.extend(page, interaction.curCoords.page);\n\n page.x += status.xe;\n page.y += status.ye;\n\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n status.modifiedXe += modifierResult.dx;\n status.modifiedYe += modifierResult.dy;\n\n status.i = animationFrame.request(interaction.boundInertiaFrame);\n }\n else {\n status.smoothEnd = true;\n status.xe = modifierResult.dx;\n status.ye = modifierResult.dy;\n\n status.sx = status.sy = 0;\n\n status.i = animationFrame.request(interaction.boundSmoothEndFrame);\n }\n});\n\nInteraction.signals.on('stop-active', function ({ interaction }) {\n const status = interaction.inertiaStatus;\n\n if (status.active) {\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n }\n});\n\nfunction calcInertia (interaction, status) {\n const inertiaOptions = interaction.target.options[interaction.prepared.name].inertia;\n const lambda = inertiaOptions.resistance;\n const inertiaDur = -Math.log(inertiaOptions.endSpeed / status.v0) / lambda;\n\n status.x0 = interaction.prevEvent.pageX;\n status.y0 = interaction.prevEvent.pageY;\n status.t0 = status.startEvent.timeStamp / 1000;\n status.sx = status.sy = 0;\n\n status.modifiedXe = status.xe = (status.vx0 - inertiaDur) / lambda;\n status.modifiedYe = status.ye = (status.vy0 - inertiaDur) / lambda;\n status.te = inertiaDur;\n\n status.lambda_v0 = lambda / status.v0;\n status.one_ve_v0 = 1 - inertiaOptions.endSpeed / status.v0;\n}\n\nfunction inertiaFrame () {\n updateInertiaCoords(this);\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n\n const status = this.inertiaStatus;\n const options = this.target.options[this.prepared.name].inertia;\n const lambda = options.resistance;\n const t = new Date().getTime() / 1000 - status.t0;\n\n if (t < status.te) {\n\n const progress = 1 - (Math.exp(-lambda * t) - status.lambda_v0) / status.one_ve_v0;\n\n if (status.modifiedXe === status.xe && status.modifiedYe === status.ye) {\n status.sx = status.xe * progress;\n status.sy = status.ye * progress;\n }\n else {\n const quadPoint = utils.getQuadraticCurvePoint(0, 0,\n status.xe,\n status.ye,\n status.modifiedXe,\n status.modifiedYe,\n progress);\n\n status.sx = quadPoint.x;\n status.sy = quadPoint.y;\n }\n\n this.doMove();\n\n status.i = animationFrame.request(this.boundInertiaFrame);\n }\n else {\n status.sx = status.modifiedXe;\n status.sy = status.modifiedYe;\n\n this.doMove();\n this.end(status.startEvent);\n status.active = false;\n this.simulation = null;\n }\n\n utils.copyCoords(this.prevCoords, this.curCoords);\n}\n\nfunction smoothEndFrame () {\n updateInertiaCoords(this);\n\n const status = this.inertiaStatus;\n const t = new Date().getTime() - status.t0;\n const duration = this.target.options[this.prepared.name].inertia.smoothEndDuration;\n\n if (t < duration) {\n status.sx = utils.easeOutQuad(t, 0, status.xe, duration);\n status.sy = utils.easeOutQuad(t, 0, status.ye, duration);\n\n this.pointerMove(status.startEvent, status.startEvent);\n\n status.i = animationFrame.request(this.boundSmoothEndFrame);\n }\n else {\n status.sx = status.xe;\n status.sy = status.ye;\n\n this.pointerMove(status.startEvent, status.startEvent);\n this.end(status.startEvent);\n\n status.smoothEnd =\n status.active = false;\n this.simulation = null;\n }\n}\n\nfunction updateInertiaCoords (interaction) {\n const status = interaction.inertiaStatus;\n\n // return if inertia isn't running\n if (!status.active) { return; }\n\n const pageUp = status.upCoords.page;\n const clientUp = status.upCoords.client;\n\n utils.setCoords(interaction.curCoords, [ {\n pageX : pageUp.x + status.sx,\n pageY : pageUp.y + status.sy,\n clientX: clientUp.x + status.sx,\n clientY: clientUp.y + status.sy,\n } ]);\n}\n","const browser = require('./utils/browser');\nconst events = require('./utils/events');\nconst utils = require('./utils');\nconst scope = require('./scope');\nconst Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\n\nconst globalEvents = {};\n\n/*\\\n * interact\n [ method ]\n *\n * The methods of this variable can be used to set elements as\n * interactables and also to change various default settings.\n *\n * Calling it as a function and passing an element or a valid CSS selector\n * string returns an Interactable object which has various methods to\n * configure it.\n *\n - element (Element | string) The HTML or SVG Element to interact with or CSS selector\n = (object) An @Interactable\n *\n > Usage\n | interact('#draggable').draggable(true);\n |\n | var rectables = interact('rect');\n | rectables\n | .gesturable(true)\n | .on('gesturemove', function (event) {\n | // ...\n | });\n\\*/\nfunction interact (element, options) {\n let interactable = scope.interactables.get(element, options);\n\n if (!interactable) {\n interactable = new Interactable(element, options);\n interactable.events.global = globalEvents;\n }\n\n return interactable;\n}\n\n/*\\\n * interact.isSet\n [ method ]\n *\n * Check if an element has been set\n - element (Element) The Element being searched for\n = (boolean) Indicates if the element or CSS selector was previously passed to interact\n\\*/\ninteract.isSet = function (element, options) {\n return scope.interactables.indexOfElement(element, options && options.context) !== -1;\n};\n\n/*\\\n * interact.on\n [ method ]\n *\n * Adds a global listener for an InteractEvent or adds a DOM event to\n * `document`\n *\n - type (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) interact\n\\*/\ninteract.on = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.on(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.on(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n // if it is an InteractEvent type, add listener to globalEvents\n if (utils.contains(Interactable.eventTypes, type)) {\n // if this type of event was never bound\n if (!globalEvents[type]) {\n globalEvents[type] = [listener];\n }\n else {\n globalEvents[type].push(listener);\n }\n }\n // If non InteractEvent type, addEventListener to document\n else {\n events.add(scope.document, type, listener, { options });\n }\n\n return interact;\n};\n\n/*\\\n * interact.off\n [ method ]\n *\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n - type (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) interact\n \\*/\ninteract.off = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.off(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.off(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n if (!utils.contains(Interactable.eventTypes, type)) {\n events.remove(scope.document, type, listener, options);\n }\n else {\n let index;\n\n if (type in globalEvents\n && (index = utils.indexOf(globalEvents[type], listener)) !== -1) {\n globalEvents[type].splice(index, 1);\n }\n }\n\n return interact;\n};\n\n/*\\\n * interact.debug\n [ method ]\n *\n * Returns an object which exposes internal data\n = (object) An object with properties that outline the current state and expose internal functions and variables\n\\*/\ninteract.debug = function () {\n return scope;\n};\n\n// expose the functions used to calculate multi-touch properties\ninteract.getPointerAverage = utils.pointerAverage;\ninteract.getTouchBBox = utils.touchBBox;\ninteract.getTouchDistance = utils.touchDistance;\ninteract.getTouchAngle = utils.touchAngle;\n\ninteract.getElementRect = utils.getElementRect;\ninteract.getElementClientRect = utils.getElementClientRect;\ninteract.matchesSelector = utils.matchesSelector;\ninteract.closest = utils.closest;\n\n/*\\\n * interact.supportsTouch\n [ method ]\n *\n = (boolean) Whether or not the browser supports touch input\n\\*/\ninteract.supportsTouch = function () {\n return browser.supportsTouch;\n};\n\n/*\\\n * interact.supportsPointerEvent\n [ method ]\n *\n = (boolean) Whether or not the browser supports PointerEvents\n\\*/\ninteract.supportsPointerEvent = function () {\n return browser.supportsPointerEvent;\n};\n\n/*\\\n * interact.stop\n [ method ]\n *\n * Cancels all interactions (end events are not fired)\n *\n - event (Event) An event on which to call preventDefault()\n = (object) interact\n\\*/\ninteract.stop = function (event) {\n for (let i = scope.interactions.length - 1; i >= 0; i--) {\n scope.interactions[i].stop(event);\n }\n\n return interact;\n};\n\n/*\\\n * interact.pointerMoveTolerance\n [ method ]\n * Returns or sets the distance the pointer must be moved before an action\n * sequence occurs. This also affects tolerance for tap events.\n *\n - newValue (number) #optional The movement from the start position must be greater than this value\n = (number | Interactable) The current setting or interact\n\\*/\ninteract.pointerMoveTolerance = function (newValue) {\n if (utils.is.number(newValue)) {\n Interaction.pointerMoveTolerance = newValue;\n\n return this;\n }\n\n return Interaction.pointerMoveTolerance;\n};\n\ninteract.addDocument = scope.addDocument;\ninteract.removeDocument = scope.removeDocument;\n\nscope.interact = interact;\n\nmodule.exports = interact;\n","const Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\nconst scope = require('./scope');\nconst is = require('./utils/is');\nconst events = require('./utils/events');\n\nconst { nodeContains, matchesSelector } = require('./utils/domUtils');\n\n/*\\\n * Interactable.preventDefault\n [ method ]\n *\n * Returns or sets whether to prevent the browser's default behaviour\n * in response to pointer events. Can be set to:\n * - `'always'` to always prevent\n * - `'never'` to never prevent\n * - `'auto'` to let interact.js try to determine what would be best\n *\n - newValue (string) #optional `true`, `false` or `'auto'`\n = (string | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.preventDefault = function (newValue) {\n if (/^(always|never|auto)$/.test(newValue)) {\n this.options.preventDefault = newValue;\n return this;\n }\n\n if (is.bool(newValue)) {\n this.options.preventDefault = newValue? 'always' : 'never';\n return this;\n }\n\n return this.options.preventDefault;\n};\n\nInteractable.prototype.checkAndPreventDefault = function (event) {\n const setting = this.options.preventDefault;\n\n if (setting === 'never') { return; }\n\n if (setting === 'always') {\n event.preventDefault();\n return;\n }\n\n // setting === 'auto'\n\n // don't preventDefault if the browser supports passiveEvents\n // CSS touch-action and user-selecct should be used instead\n if (events.supportsOptions) {\n return;\n }\n\n // don't preventDefault of pointerdown events\n if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) {\n return;\n }\n\n // don't preventDefault on editable elements\n if (is.element(event.target)\n && matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) {\n return;\n }\n\n event.preventDefault();\n};\n\nfunction onInteractionEvent ({ interaction, event }) {\n if (interaction.target) {\n interaction.target.checkAndPreventDefault(event);\n }\n}\n\nfor (const eventSignal of ['down', 'move', 'up', 'cancel']) {\n Interaction.signals.on(eventSignal, onInteractionEvent);\n}\n\n// prevent native HTML5 drag on interact.js target elements\nInteraction.docEvents.dragstart = function preventNativeDrag (event) {\n for (const interaction of scope.interactions) {\n\n if (interaction.element\n && (interaction.element === event.target\n || nodeContains(interaction.element, event.target))) {\n\n interaction.target.checkAndPreventDefault(event);\n return;\n }\n }\n};\n","const scope = require('./scope');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst iFinder = require('./utils/interactionFinder');\nconst pointerEvents = require('./pointerEvents/base');\n\nconst { window } = require('./utils/window');\n\nconst toString = Object.prototype.toString;\n\nif (!window.Array.isArray) {\n window.Array.isArray = function (obj) {\n return toString.call(obj) === '[object Array]';\n };\n}\n\nif (!String.prototype.trim) {\n String.prototype.trim = function () {\n return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n };\n}\n\n// http://www.quirksmode.org/dom/events/click.html\n// >Events leading to dblclick\n//\n// IE8 doesn't fire down event before dblclick.\n// This workaround tries to fire a tap and doubletap after dblclick\nfunction onIE8Dblclick (event) {\n const eventTarget = event.target;\n const interaction = iFinder.search(event, event.type, eventTarget);\n\n if (!interaction) { return; }\n\n if (interaction.prevTap\n && event.clientX === interaction.prevTap.clientX\n && event.clientY === interaction.prevTap.clientY\n && eventTarget === interaction.prevTap.target) {\n\n interaction.downTargets[0] = eventTarget;\n interaction.downTimes [0] = new Date().getTime();\n\n pointerEvents.fire({\n interaction,\n event,\n eventTarget,\n pointer: event,\n type: 'tap',\n });\n }\n}\n\nif (browser.isIE8) {\n const selectFix = function (event) {\n for (const interaction of scope.interactions) {\n if (interaction.interacting()) {\n interaction.target.checkAndPreventDefault(event);\n }\n }\n };\n\n const onDocIE8 = function onDocIE8 ({ doc, win }, signalName) {\n const eventMethod = signalName.indexOf('listen') === 0\n ? events.add : events.remove;\n\n // For IE's lack of Event#preventDefault\n eventMethod(doc, 'selectstart', selectFix);\n\n if (pointerEvents) {\n eventMethod(doc, 'dblclick', onIE8Dblclick);\n }\n };\n\n scope.signals.on('add-document' , onDocIE8);\n scope.signals.on('remove-document', onDocIE8);\n}\n\nmodule.exports = null;\n","const InteractEvent = require('../InteractEvent');\nconst Interaction = require('../Interaction');\nconst extend = require('../utils/extend');\n\nconst modifiers = {\n names: [],\n\n setOffsets: function (arg) {\n const { interaction, pageCoords: page } = arg;\n const { target, element, startOffset } = interaction;\n const rect = target.getRect(element);\n\n if (rect) {\n startOffset.left = page.x - rect.left;\n startOffset.top = page.y - rect.top;\n\n startOffset.right = rect.right - page.x;\n startOffset.bottom = rect.bottom - page.y;\n\n if (!('width' in rect)) { rect.width = rect.right - rect.left; }\n if (!('height' in rect)) { rect.height = rect.bottom - rect.top ; }\n }\n else {\n startOffset.left = startOffset.top = startOffset.right = startOffset.bottom = 0;\n }\n\n arg.rect = rect;\n arg.interactable = target;\n arg.element = element;\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n\n arg.options = target.options[interaction.prepared.name][modifierName];\n\n if (!arg.options) {\n continue;\n }\n\n interaction.modifierOffsets[modifierName] = modifiers[modifierName].setOffset(arg);\n }\n },\n\n setAll: function (arg) {\n const { interaction, statuses, preEnd, requireEndOnly } = arg;\n const coords = extend({}, arg.pageCoords);\n const result = {\n dx: 0,\n dy: 0,\n changed: false,\n locked: false,\n shouldMove: true,\n };\n\n for (const modifierName of modifiers.names) {\n const modifier = modifiers[modifierName];\n const options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!shouldDo(options, preEnd, requireEndOnly)) { continue; }\n\n arg.status = arg.status = statuses[modifierName];\n arg.options = options;\n arg.offset = arg.interaction.modifierOffsets[modifierName];\n\n modifier.set(arg);\n\n if (arg.status.locked) {\n coords.x += arg.status.dx;\n coords.y += arg.status.dy;\n\n result.dx += arg.status.dx;\n result.dy += arg.status.dy;\n\n result.locked = true;\n }\n }\n\n // a move should be fired if:\n // - there are no modifiers enabled,\n // - no modifiers are \"locked\" i.e. have changed the pointer's coordinates, or\n // - the locked coords have changed since the last pointer move\n result.shouldMove = !arg.status || !result.locked || arg.status.changed;\n\n return result;\n },\n\n resetStatuses: function (statuses) {\n for (const modifierName of modifiers.names) {\n const status = statuses[modifierName] || {};\n\n status.dx = status.dy = 0;\n status.modifiedX = status.modifiedY = NaN;\n status.locked = false;\n status.changed = true;\n\n statuses[modifierName] = status;\n }\n\n return statuses;\n },\n\n start: function ({ interaction }, signalName) {\n const arg = {\n interaction,\n pageCoords: (signalName === 'action-resume' ?\n interaction.curCoords : interaction.startCoords).page,\n startOffset: interaction.startOffset,\n statuses: interaction.modifierStatuses,\n preEnd: false,\n requireEndOnly: false,\n };\n\n modifiers.setOffsets(arg);\n modifiers.resetStatuses(arg.statuses);\n\n arg.pageCoords = extend({}, interaction.startCoords.page);\n interaction.modifierResult = modifiers.setAll(arg);\n },\n};\n\nInteraction.signals.on('new', function (interaction) {\n interaction.startOffset = { left: 0, right: 0, top: 0, bottom: 0 };\n interaction.modifierOffsets = {};\n interaction.modifierStatuses = modifiers.resetStatuses({});\n interaction.modifierResult = null;\n});\n\nInteraction.signals.on('action-start' , modifiers.start);\nInteraction.signals.on('action-resume', modifiers.start);\n\nInteraction.signals.on('before-action-move', function ({ interaction, preEnd, interactingBeforeMove }) {\n const modifierResult = modifiers.setAll({\n interaction,\n preEnd,\n pageCoords: interaction.curCoords.page,\n statuses: interaction.modifierStatuses,\n requireEndOnly: false,\n });\n\n // don't fire an action move if a modifier would keep the event in the same\n // cordinates as before\n if (!modifierResult.shouldMove && interactingBeforeMove) {\n interaction._dontFireMove = true;\n }\n\n interaction.modifierResult = modifierResult;\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n for (let i = 0; i < modifiers.names.length; i++) {\n const options = interaction.target.options[interaction.prepared.name][modifiers.names[i]];\n\n // if the endOnly option is true for any modifier\n if (shouldDo(options, true, true)) {\n // fire a move event at the modified coordinates\n interaction.doMove({ event, preEnd: true });\n break;\n }\n }\n});\n\nInteractEvent.signals.on('set-xy', function (arg) {\n const { iEvent, interaction } = arg;\n const modifierArg = extend({}, arg);\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n modifierArg.options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!modifierArg.options) {\n continue;\n }\n\n const modifier = modifiers[modifierName];\n\n modifierArg.status = interaction.modifierStatuses[modifierName];\n\n iEvent[modifierName] = modifier.modifyCoords(modifierArg);\n }\n});\n\nfunction shouldDo (options, preEnd, requireEndOnly) {\n return (options && options.enabled\n && (preEnd || !options.endOnly)\n && (!requireEndOnly || options.endOnly));\n}\n\nmodule.exports = modifiers;\n","const modifiers = require('./index');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst restrict = {\n defaults: {\n enabled : false,\n endOnly : false,\n restriction: null,\n elementRect: null,\n },\n\n setOffset: function ({ rect, startOffset, options }) {\n const elementRect = options && options.elementRect;\n const offset = {};\n\n if (rect && elementRect) {\n offset.left = startOffset.left - (rect.width * elementRect.left);\n offset.top = startOffset.top - (rect.height * elementRect.top);\n\n offset.right = startOffset.right - (rect.width * (1 - elementRect.right));\n offset.bottom = startOffset.bottom - (rect.height * (1 - elementRect.bottom));\n }\n else {\n offset.left = offset.top = offset.right = offset.bottom = 0;\n }\n\n return offset;\n },\n\n set: function ({ pageCoords, interaction, status, options }) {\n if (!options) { return status; }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n\n const restriction = getRestrictionRect(options.restriction, interaction, page);\n\n if (!restriction) { return status; }\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n const rect = restriction;\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n const offset = interaction.modifierOffsets.restrict;\n\n // object is assumed to have\n // x, y, width, height or\n // left, top, right, bottom\n if ('x' in restriction && 'y' in restriction) {\n modifiedX = Math.max(Math.min(rect.x + rect.width - offset.right , page.x), rect.x + offset.left);\n modifiedY = Math.max(Math.min(rect.y + rect.height - offset.bottom, page.y), rect.y + offset.top );\n }\n else {\n modifiedX = Math.max(Math.min(rect.right - offset.right , page.x), rect.left + offset.left);\n modifiedY = Math.max(Math.min(rect.bottom - offset.bottom, page.y), rect.top + offset.top );\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const elementRect = options && options.elementRect;\n\n if (options && options.enabled\n && !(phase === 'start' && elementRect && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n getRestrictionRect,\n};\n\nfunction getRestrictionRect (value, interaction, page) {\n if (utils.is.function(value)) {\n return utils.resolveRectLike(value, interaction.target, interaction.element, [page.x, page.y, interaction]);\n } else {\n return utils.resolveRectLike(value, interaction.target, interaction.element);\n }\n}\n\nmodifiers.restrict = restrict;\nmodifiers.names.push('restrict');\n\ndefaultOptions.perAction.restrict = restrict.defaults;\n\nmodule.exports = restrict;\n","// This module adds the options.resize.restrictEdges setting which sets min and\n// max for the top, left, bottom and right edges of the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictEdges: {\n// inner: { top: 200, left: 200, right: 400, bottom: 400 },\n// outer: { top: 0, left: 0, right: 600, bottom: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst { getRestrictionRect } = require('./restrict');\n\nconst noInner = { top: +Infinity, left: +Infinity, bottom: -Infinity, right: -Infinity };\nconst noOuter = { top: -Infinity, left: -Infinity, bottom: +Infinity, right: +Infinity };\n\nconst restrictEdges = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n offset: null,\n },\n\n setOffset: function ({ interaction, startOffset, options }) {\n if (!options) {\n return utils.extend({}, startOffset);\n }\n\n const offset = getRestrictionRect(options.offset, interaction, interaction.startCoords.page);\n\n if (offset) {\n return {\n top: startOffset.top + offset.y,\n left: startOffset.left + offset.x,\n bottom: startOffset.bottom + offset.y,\n right: startOffset.right + offset.x,\n };\n }\n\n return startOffset;\n },\n\n set: function ({ pageCoords, interaction, status, offset, options }) {\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n const inner = rectUtils.xywhToTlbr(getRestrictionRect(options.inner, interaction, page)) || noInner;\n const outer = rectUtils.xywhToTlbr(getRestrictionRect(options.outer, interaction, page)) || noOuter;\n\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n if (edges.top) {\n modifiedY = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top);\n }\n else if (edges.bottom) {\n modifiedY = Math.max(Math.min(outer.bottom - offset.bottom, page.y), inner.bottom - offset.bottom);\n }\n if (edges.left) {\n modifiedX = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left);\n }\n else if (edges.right) {\n modifiedX = Math.max(Math.min(outer.right - offset.right, page.x), inner.right - offset.right);\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n if (options && options.enabled\n && !(phase === 'start' && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n noInner,\n noOuter,\n getRestrictionRect,\n};\n\nmodifiers.restrictEdges = restrictEdges;\nmodifiers.names.push('restrictEdges');\n\ndefaultOptions.perAction.restrictEdges = restrictEdges.defaults;\nresize.defaults.restrictEdges = restrictEdges.defaults;\n\nmodule.exports = restrictEdges;\n","// This module adds the options.resize.restrictSize setting which sets min and\n// max width and height for the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictSize: {\n// min: { width: -600, height: -600 },\n// max: { width: 600, height: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst restrictEdges = require('./restrictEdges');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst noMin = { width: -Infinity, height: -Infinity };\nconst noMax = { width: +Infinity, height: +Infinity };\n\nconst restrictSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n },\n\n setOffset: function ({ interaction }) {\n return interaction.startOffset;\n },\n\n set: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const rect = rectUtils.xywhToTlbr(interaction.resizeRects.inverted);\n\n const minSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.min, interaction)) || noMin;\n const maxSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.max, interaction)) || noMax;\n\n arg.options = {\n enabled: options.enabled,\n endOnly: options.endOnly,\n inner: utils.extend({}, restrictEdges.noInner),\n outer: utils.extend({}, restrictEdges.noOuter),\n };\n\n if (edges.top) {\n arg.options.inner.top = rect.bottom - minSize.height;\n arg.options.outer.top = rect.bottom - maxSize.height;\n }\n else if (edges.bottom) {\n arg.options.inner.bottom = rect.top + minSize.height;\n arg.options.outer.bottom = rect.top + maxSize.height;\n }\n if (edges.left) {\n arg.options.inner.left = rect.right - minSize.width;\n arg.options.outer.left = rect.right - maxSize.width;\n }\n else if (edges.right) {\n arg.options.inner.right = rect.left + minSize.width;\n arg.options.outer.right = rect.left + maxSize.width;\n }\n\n restrictEdges.set(arg);\n },\n\n modifyCoords: restrictEdges.modifyCoords,\n};\n\nmodifiers.restrictSize = restrictSize;\nmodifiers.names.push('restrictSize');\n\ndefaultOptions.perAction.restrictSize = restrictSize.defaults;\nresize.defaults.restrictSize = restrictSize.defaults;\n\nmodule.exports = restrictSize;\n","const modifiers = require('./index');\nconst interact = require('../interact');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst snap = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n\n relativePoints: null,\n },\n\n setOffset: function ({ interaction, interactable, element, rect, startOffset, options }) {\n const offsets = [];\n const optionsOrigin = utils.rectToXY(utils.resolveRectLike(options.origin));\n const origin = optionsOrigin || utils.getOriginXY(interactable, element, interaction.prepared.name);\n options = options || interactable.options[interaction.prepared.name].snap || {};\n\n let snapOffset;\n\n if (options.offset === 'startCoords') {\n snapOffset = {\n x: interaction.startCoords.page.x - origin.x,\n y: interaction.startCoords.page.y - origin.y,\n };\n }\n else {\n const offsetRect = utils.resolveRectLike(options.offset, interactable, element, [interaction]);\n\n snapOffset = utils.rectToXY(offsetRect) || { x: 0, y: 0 };\n }\n\n if (rect && options.relativePoints && options.relativePoints.length) {\n for (const { x: relativeX, y: relativeY } of options.relativePoints) {\n offsets.push({\n x: startOffset.left - (rect.width * relativeX) + snapOffset.x,\n y: startOffset.top - (rect.height * relativeY) + snapOffset.y,\n });\n }\n }\n else {\n offsets.push(snapOffset);\n }\n\n return offsets;\n },\n\n set: function ({ interaction, pageCoords, status, options, offset: offsets }) {\n const targets = [];\n let target;\n let page;\n let i;\n\n if (status.useStatusXY) {\n page = { x: status.x, y: status.y };\n }\n else {\n const origin = utils.getOriginXY(interaction.target, interaction.element, interaction.prepared.name);\n\n page = utils.extend({}, pageCoords);\n\n page.x -= origin.x;\n page.y -= origin.y;\n }\n\n status.realX = page.x;\n status.realY = page.y;\n\n let len = options.targets? options.targets.length : 0;\n\n for (const { x: offsetX, y: offsetY } of offsets) {\n const relativeX = page.x - offsetX;\n const relativeY = page.y - offsetY;\n\n for (const snapTarget of options.targets) {\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n targets.push({\n x: utils.is.number(target.x) ? (target.x + offsetX) : relativeX,\n y: utils.is.number(target.y) ? (target.y + offsetY) : relativeY,\n\n range: utils.is.number(target.range)? target.range: options.range,\n });\n }\n }\n\n const closest = {\n target: null,\n inRange: false,\n distance: 0,\n range: 0,\n dx: 0,\n dy: 0,\n };\n\n for (i = 0, len = targets.length; i < len; i++) {\n target = targets[i];\n\n const range = target.range;\n const dx = target.x - page.x;\n const dy = target.y - page.y;\n const distance = utils.hypot(dx, dy);\n let inRange = distance <= range;\n\n // Infinite targets count as being out of range\n // compared to non infinite ones that are in range\n if (range === Infinity && closest.inRange && closest.range !== Infinity) {\n inRange = false;\n }\n\n if (!closest.target || (inRange\n // is the closest target in range?\n ? (closest.inRange && range !== Infinity\n // the pointer is relatively deeper in this target\n ? distance / range < closest.distance / closest.range\n // this target has Infinite range and the closest doesn't\n : (range === Infinity && closest.range !== Infinity)\n // OR this target is closer that the previous closest\n || distance < closest.distance)\n // The other is not in range and the pointer is closer to this target\n : (!closest.inRange && distance < closest.distance))) {\n\n closest.target = target;\n closest.distance = distance;\n closest.range = range;\n closest.inRange = inRange;\n closest.dx = dx;\n closest.dy = dy;\n\n status.range = range;\n }\n }\n\n let snapChanged;\n\n if (closest.target) {\n snapChanged = (status.modifiedX !== closest.target.x || status.modifiedY !== closest.target.y);\n\n status.modifiedX = closest.target.x;\n status.modifiedY = closest.target.y;\n }\n else {\n snapChanged = true;\n\n status.modifiedX = NaN;\n status.modifiedY = NaN;\n }\n\n status.dx = closest.dx;\n status.dy = closest.dy;\n\n status.changed = (snapChanged || (closest.inRange && !status.locked));\n status.locked = closest.inRange;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const relativePoints = options && options.relativePoints;\n\n if (options && options.enabled\n && !(phase === 'start' && relativePoints && relativePoints.length)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n }\n\n return {\n range : status.range,\n locked : status.locked,\n x : status.modifiedX,\n y : status.modifiedY,\n realX : status.realX,\n realY : status.realY,\n dx : status.dx,\n dy : status.dy,\n };\n }\n },\n};\n\ninteract.createSnapGrid = function (grid) {\n return function (x, y) {\n const limits = grid.limits || {\n left : -Infinity,\n right : Infinity,\n top : -Infinity,\n bottom: Infinity,\n };\n let offsetX = 0;\n let offsetY = 0;\n\n if (utils.is.object(grid.offset)) {\n offsetX = grid.offset.x;\n offsetY = grid.offset.y;\n }\n\n const gridx = Math.round((x - offsetX) / grid.x);\n const gridy = Math.round((y - offsetY) / grid.y);\n\n const newX = Math.max(limits.left, Math.min(limits.right , gridx * grid.x + offsetX));\n const newY = Math.max(limits.top , Math.min(limits.bottom, gridy * grid.y + offsetY));\n\n return {\n x: newX,\n y: newY,\n range: grid.range,\n };\n };\n};\n\nmodifiers.snap = snap;\nmodifiers.names.push('snap');\n\ndefaultOptions.perAction.snap = snap.defaults;\n\nmodule.exports = snap;\n","// This module allows snapping of the size of targets during resize\n// interactions.\n\nconst modifiers = require('./index');\nconst snap = require('./snap');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\nconst utils = require('../utils/');\n\nconst snapSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n },\n\n setOffset: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.edges;\n\n if (!edges) { return; }\n\n arg.options = {\n relativePoints: [{\n x: edges.left? 0 : 1,\n y: edges.top ? 0 : 1,\n }],\n origin: { x: 0, y: 0 },\n offset: 'self',\n range: options.range,\n };\n\n const offsets = snap.setOffset(arg);\n arg.options = options;\n\n return offsets;\n },\n\n set: function (arg) {\n const { interaction, options, offset, pageCoords } = arg;\n const page = utils.extend({}, pageCoords);\n const relativeX = page.x - offset[0].x;\n const relativeY = page.y - offset[0].y;\n\n arg.options = utils.extend({}, options);\n arg.options.targets = [];\n\n for (const snapTarget of options.targets) {\n let target;\n\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n if ('width' in target && 'height' in target) {\n target.x = target.width;\n target.y = target.height;\n }\n\n arg.options.targets.push(target);\n }\n\n snap.set(arg);\n },\n\n modifyCoords: function (arg) {\n const { options } = arg;\n\n arg.options = utils.extend({}, options);\n arg.options.enabled = options.enabled;\n arg.options.relativePoints = [null];\n\n snap.modifyCoords(arg);\n },\n};\n\nmodifiers.snapSize = snapSize;\nmodifiers.names.push('snapSize');\n\ndefaultOptions.perAction.snapSize = snapSize.defaults;\nresize.defaults.snapSize = snapSize.defaults;\n\nmodule.exports = snapSize;\n","const pointerUtils = require('../utils/pointerUtils');\n\nmodule.exports = class PointerEvent {\n constructor (type, pointer, event, eventTarget, interaction) {\n pointerUtils.pointerExtend(this, event);\n\n if (event !== pointer) {\n pointerUtils.pointerExtend(this, pointer);\n }\n\n this.interaction = interaction;\n\n this.timeStamp = new Date().getTime();\n this.originalEvent = event;\n this.type = type;\n this.pointerId = pointerUtils.getPointerId(pointer);\n this.pointerType = pointerUtils.getPointerType(pointer);\n this.target = eventTarget;\n this.currentTarget = null;\n\n if (type === 'tap') {\n const pointerIndex = interaction.getPointerIndex(pointer);\n this.dt = this.timeStamp - interaction.downTimes[pointerIndex];\n\n const interval = this.timeStamp - interaction.tapTime;\n\n this.double = !!(interaction.prevTap\n && interaction.prevTap.type !== 'doubletap'\n && interaction.prevTap.target === this.target\n && interval < 500);\n }\n else if (type === 'doubletap') {\n this.dt = pointer.timeStamp - interaction.tapTime;\n }\n }\n\n subtractOrigin ({ x: originX, y: originY }) {\n this.pageX -= originX;\n this.pageY -= originY;\n this.clientX -= originX;\n this.clientY -= originY;\n\n return this;\n }\n\n addOrigin ({ x: originX, y: originY }) {\n this.pageX += originX;\n this.pageY += originY;\n this.clientX += originX;\n this.clientY += originY;\n\n return this;\n }\n\n preventDefault () {\n this.originalEvent.preventDefault();\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n};\n","const PointerEvent = require('./PointerEvent');\nconst Interaction = require('../Interaction');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst defaults = require('../defaultOptions');\nconst signals = require('../utils/Signals').new();\nconst { filter } = require('../utils/arr');\n\nconst simpleSignals = [ 'down', 'up', 'cancel' ];\nconst simpleEvents = [ 'down', 'up', 'cancel' ];\n\nconst pointerEvents = {\n PointerEvent,\n fire,\n collectEventTargets,\n signals,\n defaults: {\n holdDuration: 600,\n ignoreFrom : null,\n allowFrom : null,\n origin : { x: 0, y: 0 },\n },\n types: [\n 'down',\n 'move',\n 'up',\n 'cancel',\n 'tap',\n 'doubletap',\n 'hold',\n ],\n};\n\nfunction fire (arg) {\n const {\n interaction, pointer, event, eventTarget,\n type = arg.pointerEvent.type,\n targets = collectEventTargets(arg),\n pointerEvent = new PointerEvent(type, pointer, event, eventTarget, interaction),\n } = arg;\n\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n targets,\n type,\n pointerEvent,\n };\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n\n for (const prop in target.props || {}) {\n pointerEvent[prop] = target.props[prop];\n }\n\n const origin = utils.getOriginXY(target.eventable, target.element);\n\n pointerEvent.subtractOrigin(origin);\n pointerEvent.eventable = target.eventable;\n pointerEvent.currentTarget = target.element;\n\n target.eventable.fire(pointerEvent);\n\n pointerEvent.addOrigin(origin);\n\n if (pointerEvent.immediatePropagationStopped\n || (pointerEvent.propagationStopped\n && (i + 1) < targets.length && targets[i + 1].element !== pointerEvent.currentTarget)) {\n break;\n }\n }\n\n signals.fire('fired', signalArg);\n\n if (type === 'tap') {\n // if pointerEvent should make a double tap, create and fire a doubletap\n // PointerEvent and use that as the prevTap\n const prevTap = pointerEvent.double\n ? fire({\n interaction, pointer, event, eventTarget,\n type: 'doubletap',\n })\n : pointerEvent;\n\n interaction.prevTap = prevTap;\n interaction.tapTime = prevTap.timeStamp;\n }\n\n return pointerEvent;\n}\n\nfunction collectEventTargets ({ interaction, pointer, event, eventTarget, type }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n // do not fire a tap event if the pointer was moved before being lifted\n if (type === 'tap' && (interaction.pointerWasMoved\n // or if the pointerup target is different to the pointerdown target\n || !(interaction.downTargets[pointerIndex] && interaction.downTargets[pointerIndex] === eventTarget))) {\n return [];\n }\n\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n path,\n targets: [],\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (type === 'hold') {\n signalArg.targets = filter(signalArg.targets, target =>\n target.eventable.options.holdDuration === interaction.holdTimers[pointerIndex].duration);\n }\n\n return signalArg.targets;\n}\n\nInteraction.signals.on('update-pointer-down', function ({ interaction, pointerIndex }) {\n interaction.holdTimers[pointerIndex] = { duration: Infinity, timeout: null };\n});\n\nInteraction.signals.on('remove-pointer', function ({ interaction, pointerIndex }) {\n interaction.holdTimers.splice(pointerIndex, 1);\n});\n\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget, duplicateMove }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n if (!duplicateMove && (!interaction.pointerIsDown || interaction.pointerWasMoved)) {\n if (interaction.pointerIsDown) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n\n fire({\n interaction, pointer, event, eventTarget,\n type: 'move',\n });\n }\n});\n\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget, pointerIndex }) {\n // copy event to be used in timeout for IE8\n const eventCopy = browser.isIE8? utils.extend({}, event) : event;\n\n const timer = interaction.holdTimers[pointerIndex];\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'hold',\n targets: [],\n path,\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (!signalArg.targets.length) { return; }\n\n let minDuration = Infinity;\n\n for (let i = 0; i < signalArg.targets.length; i++) {\n const target = signalArg.targets[i];\n const holdDuration = target.eventable.options.holdDuration;\n\n if (holdDuration < minDuration) {\n minDuration = holdDuration;\n }\n }\n\n timer.duration = minDuration;\n timer.timeout = setTimeout(function () {\n fire({\n interaction,\n eventTarget,\n pointer: browser.isIE8? eventCopy : pointer,\n event: eventCopy,\n type: 'hold',\n });\n }, minDuration);\n});\n\nInteraction.signals.on('up', ({ interaction, pointer, event, eventTarget }) => {\n if (!interaction.pointerWasMoved) {\n fire({ interaction, eventTarget, pointer, event, type: 'tap' });\n }\n});\n\n['up', 'cancel'].forEach(function (signalName) {\n Interaction.signals.on(signalName, function ({ interaction, pointerIndex }) {\n if (interaction.holdTimers[pointerIndex]) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n });\n});\n\nfunction createSignalListener (type) {\n return function ({ interaction, pointer, event, eventTarget }) {\n fire({ interaction, eventTarget, pointer, event, type });\n };\n}\n\nfor (let i = 0; i < simpleSignals.length; i++) {\n Interaction.signals.on(simpleSignals[i], createSignalListener(simpleEvents[i]));\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.prevTap = null; // the most recent tap event on this interaction\n interaction.tapTime = 0; // time of the most recent tap event\n interaction.holdTimers = []; // [{ duration, timeout }]\n});\n\ndefaults.pointerEvents = pointerEvents.defaults;\nmodule.exports = pointerEvents;\n","const pointerEvents = require('./base');\nconst Interaction = require('../Interaction');\n\npointerEvents.signals.on('new', onNew);\npointerEvents.signals.on('fired', onFired);\n\nfor (const signal of ['move', 'up', 'cancel', 'endall']) {\n Interaction.signals.on(signal, endHoldRepeat);\n}\n\nfunction onNew ({ pointerEvent }) {\n if (pointerEvent.type !== 'hold') { return; }\n\n pointerEvent.count = (pointerEvent.count || 0) + 1;\n}\n\nfunction onFired ({ interaction, pointerEvent, eventTarget, targets }) {\n if (pointerEvent.type !== 'hold' || !targets.length) { return; }\n\n // get the repeat interval from the first eventable\n const interval = targets[0].eventable.options.holdRepeatInterval;\n\n // don't repeat if the interval is 0 or less\n if (interval <= 0) { return; }\n\n // set a timeout to fire the holdrepeat event\n interaction.holdIntervalHandle = setTimeout(function () {\n pointerEvents.fire({\n interaction,\n eventTarget,\n type: 'hold',\n pointer: pointerEvent,\n event: pointerEvent,\n });\n }, interval);\n}\n\nfunction endHoldRepeat ({ interaction }) {\n // set the interaction's holdStopTime property\n // to stop further holdRepeat events\n if (interaction.holdIntervalHandle) {\n clearInterval(interaction.holdIntervalHandle);\n interaction.holdIntervalHandle = null;\n }\n}\n\n// don't repeat by default\npointerEvents.defaults.holdRepeatInterval = 0;\npointerEvents.types.push('holdrepeat');\n\nmodule.exports = {\n onNew,\n onFired,\n endHoldRepeat,\n};\n","const pointerEvents = require('./base');\nconst Interactable = require('../Interactable');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\nconst scope = require('../scope');\nconst extend = require('../utils/extend');\nconst { merge } = require('../utils/arr');\n\npointerEvents.signals.on('collect-targets', function ({ targets, element, type, eventTarget }) {\n function collectSelectors (interactable, selector, context) {\n const els = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && is.element(element)\n && domUtils.matchesSelector(element, selector, els)\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n const interactable = scope.interactables.get(element);\n\n if (interactable) {\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n scope.interactables.forEachSelector(collectSelectors, element);\n});\n\nInteractable.signals.on('new', function ({ interactable }) {\n interactable.events.getRect = function (element) {\n return interactable.getRect(element);\n };\n});\n\nInteractable.signals.on('set', function ({ interactable, options }) {\n extend(interactable.events.options, pointerEvents.defaults);\n extend(interactable.events.options, options);\n});\n\nmerge(Interactable.eventTypes, pointerEvents.types);\n\nInteractable.prototype.pointerEvents = function (options) {\n extend(this.events.options, options);\n\n return this;\n};\n\nconst __backCompatOption = Interactable.prototype._backCompatOption;\n\nInteractable.prototype._backCompatOption = function (optionName, newValue) {\n const ret = __backCompatOption.call(this, optionName, newValue);\n\n if (ret === this) {\n this.events.options[optionName] = newValue;\n }\n\n return ret;\n};\n\nInteractable.settingsMethods.push('pointerEvents');\n","const utils = require('./utils');\nconst events = require('./utils/events');\nconst signals = require('./utils/Signals').new();\n\nconst scope = {\n signals,\n events,\n utils,\n\n // main document\n document: require('./utils/domObjects').document,\n // all documents being listened to\n documents: [],\n\n addDocument: function (doc, win) {\n // do nothing if document is already known\n if (utils.contains(scope.documents, doc)) { return false; }\n\n win = win || scope.getWindow(doc);\n\n scope.documents.push(doc);\n events.documents.push(doc);\n\n // don't add an unload event for the main document\n // so that the page may be cached in browser history\n if (doc !== scope.document) {\n events.add(win, 'unload', scope.onWindowUnload);\n }\n\n signals.fire('add-document', { doc, win });\n },\n\n removeDocument: function (doc, win) {\n const index = utils.indexOf(scope.documents, doc);\n\n win = win || scope.getWindow(doc);\n\n events.remove(win, 'unload', scope.onWindowUnload);\n\n scope.documents.splice(index, 1);\n events.documents.splice(index, 1);\n\n signals.fire('remove-document', { win, doc });\n },\n\n onWindowUnload: function () {\n scope.removeDocument(this.document, this);\n },\n};\n\nmodule.exports = scope;\n","const { indexOf } = require('./arr');\n\nclass Signals {\n constructor () {\n this.listeners = {\n // signalName: [listeners],\n };\n }\n\n on (name, listener) {\n if (!this.listeners[name]) {\n this.listeners[name] = [listener];\n return;\n }\n\n this.listeners[name].push(listener);\n }\n\n off (name, listener) {\n if (!this.listeners[name]) { return; }\n\n const index = indexOf(this.listeners[name], listener);\n\n if (index !== -1) {\n this.listeners[name].splice(index, 1);\n }\n }\n\n fire (name, arg) {\n const targetListeners = this.listeners[name];\n\n if (!targetListeners) { return; }\n\n for (let i = 0; i < targetListeners.length; i++) {\n if (targetListeners[i](arg, name) === false) {\n return;\n }\n }\n }\n}\n\nSignals.new = function () {\n return new Signals();\n};\n\nmodule.exports = Signals;\n","function indexOf (array, target) {\n for (let i = 0, len = array.length; i < len; i++) {\n if (array[i] === target) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction contains (array, target) {\n return indexOf(array, target) !== -1;\n}\n\nfunction merge (target, source) {\n for (let i = 0; i < source.length; i++) {\n target.push(source[i]);\n }\n\n return target;\n}\n\nfunction filter (array, test) {\n const result = [];\n\n for (let i = 0; i < array.length; i++) {\n if (test(array[i])) {\n result.push(array[i]);\n }\n }\n\n return result;\n}\n\nmodule.exports = {\n indexOf,\n contains,\n merge,\n filter,\n};\n","const { window } = require('./window');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst Element = domObjects.Element;\nconst navigator = window.navigator;\n\nconst browser = {\n // Does the browser support touch input?\n supportsTouch: !!(('ontouchstart' in window) || is.function(window.DocumentTouch)\n && domObjects.document instanceof window.DocumentTouch),\n\n // Does the browser support PointerEvents\n supportsPointerEvent: !!domObjects.PointerEvent,\n\n isIE8: ('attachEvent' in window) && !('addEventListener' in window),\n\n // Opera Mobile must be handled differently\n isOperaMobile: (navigator.appName === 'Opera'\n && browser.supportsTouch\n && navigator.userAgent.match('Presto')),\n\n // scrolling doesn't change the result of getClientRects on iOS 7\n isIOS7: (/iP(hone|od|ad)/.test(navigator.platform)\n && /OS 7[^\\d]/.test(navigator.appVersion)),\n\n isIe9OrOlder: /MSIE (8|9)/.test(navigator.userAgent),\n\n // prefix matchesSelector\n prefixedMatchesSelector: 'matches' in Element.prototype\n ? 'matches': 'webkitMatchesSelector' in Element.prototype\n ? 'webkitMatchesSelector': 'mozMatchesSelector' in Element.prototype\n ? 'mozMatchesSelector': 'oMatchesSelector' in Element.prototype\n ? 'oMatchesSelector': 'msMatchesSelector',\n\n useMatchesSelectorPolyfill: false,\n\n pEventTypes: (domObjects.PointerEvent\n ? (domObjects.PointerEvent === window.MSPointerEvent\n ? {\n up: 'MSPointerUp',\n down: 'MSPointerDown',\n over: 'mouseover',\n out: 'mouseout',\n move: 'MSPointerMove',\n cancel: 'MSPointerCancel',\n }\n : {\n up: 'pointerup',\n down: 'pointerdown',\n over: 'pointerover',\n out: 'pointerout',\n move: 'pointermove',\n cancel: 'pointercancel',\n })\n : null),\n\n // because Webkit and Opera still use 'mousewheel' event type\n wheelEvent: 'onmousewheel' in domObjects.document? 'mousewheel': 'wheel',\n\n};\n\nbrowser.useMatchesSelectorPolyfill = !is.function(Element.prototype[browser.prefixedMatchesSelector]);\n\nmodule.exports = browser;\n","const domObjects = {};\nconst win = require('./window').window;\n\nfunction blank () {}\n\ndomObjects.document = win.document;\ndomObjects.DocumentFragment = win.DocumentFragment || blank;\ndomObjects.SVGElement = win.SVGElement || blank;\ndomObjects.SVGSVGElement = win.SVGSVGElement || blank;\ndomObjects.SVGElementInstance = win.SVGElementInstance || blank;\ndomObjects.Element = win.Element || blank;\ndomObjects.HTMLElement = win.HTMLElement || domObjects.Element;\n\ndomObjects.Event = win.Event;\ndomObjects.Touch = win.Touch || blank;\ndomObjects.PointerEvent = (win.PointerEvent || win.MSPointerEvent);\n\nmodule.exports = domObjects;\n","const win = require('./window');\nconst browser = require('./browser');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst domUtils = {\n nodeContains: function (parent, child) {\n while (child) {\n if (child === parent) {\n return true;\n }\n\n child = child.parentNode;\n }\n\n return false;\n },\n\n closest: function (element, selector) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) { return element; }\n\n element = domUtils.parentNode(element);\n }\n\n return null;\n },\n\n parentNode: function (node) {\n let parent = node.parentNode;\n\n if (is.docFrag(parent)) {\n // skip past #shado-root fragments\n while ((parent = parent.host) && is.docFrag(parent)) {\n continue;\n }\n\n return parent;\n }\n\n return parent;\n },\n\n // taken from http://tanalin.com/en/blog/2012/12/matches-selector-ie8/ and modified\n matchesSelectorPolyfill: browser.useMatchesSelectorPolyfill\n ? function (element, selector, elems) {\n elems = elems || element.parentNode.querySelectorAll(selector);\n\n for (let i = 0, len = elems.length; i < len; i++) {\n if (elems[i] === element) {\n return true;\n }\n }\n\n return false;\n }\n : null,\n\n matchesSelector: function (element, selector, nodeList) {\n if (browser.useMatchesSelectorPolyfill) {\n return domUtils.matchesSelectorPolyfill(element, selector, nodeList);\n }\n\n // remove /deep/ from selectors if shadowDOM polyfill is used\n if (win.window !== win.realWindow) {\n selector = selector.replace(/\\/deep\\//g, ' ');\n }\n\n return element[browser.prefixedMatchesSelector](selector);\n },\n\n // Test for the element that's \"above\" all other qualifiers\n indexOfDeepestElement: function (elements) {\n let deepestZoneParents = [];\n let dropzoneParents = [];\n let dropzone;\n let deepestZone = elements[0];\n let index = deepestZone? 0: -1;\n let parent;\n let child;\n let i;\n let n;\n\n for (i = 1; i < elements.length; i++) {\n dropzone = elements[i];\n\n // an element might belong to multiple selector dropzones\n if (!dropzone || dropzone === deepestZone) {\n continue;\n }\n\n if (!deepestZone) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n // check if the deepest or current are document.documentElement or document.rootElement\n // - if the current dropzone is, do nothing and continue\n if (dropzone.parentNode === dropzone.ownerDocument) {\n continue;\n }\n // - if deepest is, update with the current dropzone and continue to next\n else if (deepestZone.parentNode === dropzone.ownerDocument) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n if (!deepestZoneParents.length) {\n parent = deepestZone;\n while (parent.parentNode && parent.parentNode !== parent.ownerDocument) {\n deepestZoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n }\n\n // if this element is an svg element and the current deepest is\n // an HTMLElement\n if (deepestZone instanceof domObjects.HTMLElement\n && dropzone instanceof domObjects.SVGElement\n && !(dropzone instanceof domObjects.SVGSVGElement)) {\n\n if (dropzone === deepestZone.parentNode) {\n continue;\n }\n\n parent = dropzone.ownerSVGElement;\n }\n else {\n parent = dropzone;\n }\n\n dropzoneParents = [];\n\n while (parent.parentNode !== parent.ownerDocument) {\n dropzoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n\n n = 0;\n\n // get (position of last common ancestor) + 1\n while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) {\n n++;\n }\n\n const parents = [\n dropzoneParents[n - 1],\n dropzoneParents[n],\n deepestZoneParents[n],\n ];\n\n child = parents[0].lastChild;\n\n while (child) {\n if (child === parents[1]) {\n deepestZone = dropzone;\n index = i;\n deepestZoneParents = [];\n\n break;\n }\n else if (child === parents[2]) {\n break;\n }\n\n child = child.previousSibling;\n }\n }\n\n return index;\n },\n\n matchesUpTo: function (element, selector, limit) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) {\n return true;\n }\n\n element = domUtils.parentNode(element);\n\n if (element === limit) {\n return domUtils.matchesSelector(element, selector);\n }\n }\n\n return false;\n },\n\n getActualElement: function (element) {\n return (element instanceof domObjects.SVGElementInstance\n ? element.correspondingUseElement\n : element);\n },\n\n getScrollXY: function (relevantWindow) {\n relevantWindow = relevantWindow || win.window;\n return {\n x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft,\n y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop,\n };\n },\n\n getElementClientRect: function (element) {\n const clientRect = (element instanceof domObjects.SVGElement\n ? element.getBoundingClientRect()\n : element.getClientRects()[0]);\n\n return clientRect && {\n left : clientRect.left,\n right : clientRect.right,\n top : clientRect.top,\n bottom: clientRect.bottom,\n width : clientRect.width || clientRect.right - clientRect.left,\n height: clientRect.height || clientRect.bottom - clientRect.top,\n };\n },\n\n getElementRect: function (element) {\n const clientRect = domUtils.getElementClientRect(element);\n\n if (!browser.isIOS7 && clientRect) {\n const scroll = domUtils.getScrollXY(win.getWindow(element));\n\n clientRect.left += scroll.x;\n clientRect.right += scroll.x;\n clientRect.top += scroll.y;\n clientRect.bottom += scroll.y;\n }\n\n return clientRect;\n },\n\n getPath: function (element) {\n const path = [];\n\n while (element) {\n path.push(element);\n element = domUtils.parentNode(element);\n }\n\n return path;\n },\n\n trySelector: value => {\n if (!is.string(value)) { return false; }\n\n // an exception will be raised if it is invalid\n domObjects.document.querySelector(value);\n return true;\n },\n};\n\nmodule.exports = domUtils;\n","const is = require('./is');\nconst domUtils = require('./domUtils');\nconst pExtend = require('./pointerExtend');\n\nconst { window, getWindow } = require('./window');\nconst { indexOf, contains } = require('./arr');\n\nconst useAttachEvent = ('attachEvent' in window) && !('addEventListener' in window);\nconst addEvent = useAttachEvent? 'attachEvent': 'addEventListener';\nconst removeEvent = useAttachEvent? 'detachEvent': 'removeEventListener';\nconst on = useAttachEvent? 'on': '';\n\nconst elements = [];\nconst targets = [];\nconst attachedListeners = [];\n\n// {\n// type: {\n// selectors: ['selector', ...],\n// contexts : [document, ...],\n// listeners: [[listener, capture, passive], ...]\n// }\n// }\nconst delegatedEvents = {};\n\nconst documents = [];\n\nconst supportsOptions = !useAttachEvent && (() => {\n let supported = false;\n\n window.document.createElement('div').addEventListener('test', null, {\n get capture () { supported = true; },\n });\n\n return supported;\n})();\n\nfunction add (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n let elementIndex = indexOf(elements, element);\n let target = targets[elementIndex];\n\n if (!target) {\n target = {\n events: {},\n typeCount: 0,\n };\n\n elementIndex = elements.push(element) - 1;\n targets.push(target);\n\n attachedListeners.push(useAttachEvent\n ? {\n supplied: [],\n wrapped : [],\n useCount: [],\n }\n : null);\n }\n\n if (!target.events[type]) {\n target.events[type] = [];\n target.typeCount++;\n }\n\n if (!contains(target.events[type], listener)) {\n let ret;\n\n if (useAttachEvent) {\n const { supplied, wrapped, useCount } = attachedListeners[elementIndex];\n const listenerIndex = indexOf(supplied, listener);\n\n const wrappedListener = wrapped[listenerIndex] || function (event) {\n if (!event.immediatePropagationStopped) {\n event.target = event.srcElement;\n event.currentTarget = element;\n\n event.preventDefault = event.preventDefault || preventDef;\n event.stopPropagation = event.stopPropagation || stopProp;\n event.stopImmediatePropagation = event.stopImmediatePropagation || stopImmProp;\n\n if (/mouse|click/.test(event.type)) {\n event.pageX = event.clientX + getWindow(element).document.documentElement.scrollLeft;\n event.pageY = event.clientY + getWindow(element).document.documentElement.scrollTop;\n }\n\n listener(event);\n }\n };\n\n ret = element[addEvent](on + type, wrappedListener, !!options.capture);\n\n if (listenerIndex === -1) {\n supplied.push(listener);\n wrapped.push(wrappedListener);\n useCount.push(1);\n }\n else {\n useCount[listenerIndex]++;\n }\n }\n else {\n ret = element[addEvent](type, listener, supportsOptions? options : !!options.capture);\n }\n target.events[type].push(listener);\n\n return ret;\n }\n}\n\nfunction remove (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const elementIndex = indexOf(elements, element);\n const target = targets[elementIndex];\n\n if (!target || !target.events) {\n return;\n }\n\n let wrappedListener = listener;\n let listeners;\n let listenerIndex;\n\n if (useAttachEvent) {\n listeners = attachedListeners[elementIndex];\n listenerIndex = indexOf(listeners.supplied, listener);\n wrappedListener = listeners.wrapped[listenerIndex];\n }\n\n if (type === 'all') {\n for (type in target.events) {\n if (target.events.hasOwnProperty(type)) {\n remove(element, type, 'all');\n }\n }\n return;\n }\n\n if (target.events[type]) {\n const len = target.events[type].length;\n\n if (listener === 'all') {\n for (let i = 0; i < len; i++) {\n remove(element, type, target.events[type][i], options);\n }\n return;\n }\n else {\n for (let i = 0; i < len; i++) {\n if (target.events[type][i] === listener) {\n element[removeEvent](on + type, wrappedListener, supportsOptions? options : !!options.capture);\n target.events[type].splice(i, 1);\n\n if (useAttachEvent && listeners) {\n listeners.useCount[listenerIndex]--;\n if (listeners.useCount[listenerIndex] === 0) {\n listeners.supplied.splice(listenerIndex, 1);\n listeners.wrapped.splice(listenerIndex, 1);\n listeners.useCount.splice(listenerIndex, 1);\n }\n }\n\n break;\n }\n }\n }\n\n if (target.events[type] && target.events[type].length === 0) {\n target.events[type] = null;\n target.typeCount--;\n }\n }\n\n if (!target.typeCount) {\n targets.splice(elementIndex, 1);\n elements.splice(elementIndex, 1);\n attachedListeners.splice(elementIndex, 1);\n }\n}\n\nfunction addDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n if (!delegatedEvents[type]) {\n delegatedEvents[type] = {\n selectors: [],\n contexts : [],\n listeners: [],\n };\n\n // add delegate listener functions\n for (let i = 0; i < documents.length; i++) {\n add(documents[i], type, delegateListener);\n add(documents[i], type, delegateUseCapture, true);\n }\n }\n\n const delegated = delegatedEvents[type];\n let index;\n\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n break;\n }\n }\n\n if (index === -1) {\n index = delegated.selectors.length;\n\n delegated.selectors.push(selector);\n delegated.contexts .push(context);\n delegated.listeners.push([]);\n }\n\n // keep listener and capture and passive flags\n delegated.listeners[index].push([listener, !!options.capture, options.passive]);\n}\n\nfunction removeDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const delegated = delegatedEvents[type];\n let matchFound = false;\n let index;\n\n if (!delegated) { return; }\n\n // count from last index of delegated to 0\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n // look for matching selector and context Node\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n\n const listeners = delegated.listeners[index];\n\n // each item of the listeners array is an array: [function, capture, passive]\n for (let i = listeners.length - 1; i >= 0; i--) {\n const [fn, capture, passive] = listeners[i];\n\n // check if the listener functions and capture and passive flags match\n if (fn === listener && capture === !!options.capture && passive === options.passive) {\n // remove the listener from the array of listeners\n listeners.splice(i, 1);\n\n // if all listeners for this interactable have been removed\n // remove the interactable from the delegated arrays\n if (!listeners.length) {\n delegated.selectors.splice(index, 1);\n delegated.contexts .splice(index, 1);\n delegated.listeners.splice(index, 1);\n\n // remove delegate function from context\n remove(context, type, delegateListener);\n remove(context, type, delegateUseCapture, true);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegatedEvents[type] = null;\n }\n }\n\n // only remove one listener\n matchFound = true;\n break;\n }\n }\n\n if (matchFound) { break; }\n }\n }\n}\n\n// bound to the interactable context when a DOM event\n// listener is added to a selector interactable\nfunction delegateListener (event, optionalArg) {\n const options = getOptions(optionalArg);\n const fakeEvent = {};\n const delegated = delegatedEvents[event.type];\n const eventTarget = (domUtils.getActualElement(event.path\n ? event.path[0]\n : event.target));\n let element = eventTarget;\n\n // duplicate the event so that currentTarget can be changed\n pExtend(fakeEvent, event);\n\n fakeEvent.originalEvent = event;\n fakeEvent.preventDefault = preventOriginalDefault;\n\n // climb up document tree looking for selector matches\n while (is.element(element)) {\n for (let i = 0; i < delegated.selectors.length; i++) {\n const selector = delegated.selectors[i];\n const context = delegated.contexts[i];\n\n if (domUtils.matchesSelector(element, selector)\n && domUtils.nodeContains(context, eventTarget)\n && domUtils.nodeContains(context, element)) {\n\n const listeners = delegated.listeners[i];\n\n fakeEvent.currentTarget = element;\n\n for (let j = 0; j < listeners.length; j++) {\n const [fn, capture, passive] = listeners[j];\n\n if (capture === !!options.capture && passive === options.passive) {\n fn(fakeEvent);\n }\n }\n }\n }\n\n element = domUtils.parentNode(element);\n }\n}\n\nfunction delegateUseCapture (event) {\n return delegateListener.call(this, event, true);\n}\n\nfunction preventDef () {\n this.returnValue = false;\n}\n\nfunction preventOriginalDefault () {\n this.originalEvent.preventDefault();\n}\n\nfunction stopProp () {\n this.cancelBubble = true;\n}\n\nfunction stopImmProp () {\n this.cancelBubble = true;\n this.immediatePropagationStopped = true;\n}\n\nfunction getOptions (param) {\n return is.object(param)? param : { capture: param };\n}\n\nmodule.exports = {\n add,\n remove,\n\n addDelegate,\n removeDelegate,\n\n delegateListener,\n delegateUseCapture,\n delegatedEvents,\n documents,\n\n useAttachEvent,\n supportsOptions,\n\n _elements: elements,\n _targets: targets,\n _attachedListeners: attachedListeners,\n};\n","module.exports = function extend (dest, source) {\n for (const prop in source) {\n dest[prop] = source[prop];\n }\n return dest;\n};\n","const {\n resolveRectLike,\n rectToXY,\n} = require('./rect');\n\nmodule.exports = function (target, element, action) {\n const actionOptions = target.options[action];\n const actionOrigin = actionOptions && actionOptions.origin;\n const origin = actionOrigin || target.options.origin;\n\n const originRect = resolveRectLike(origin, target, element, [target && element]);\n\n return rectToXY(originRect) || { x: 0, y: 0 };\n};\n","module.exports = (x, y) => Math.sqrt(x * x + y * y);\n","const extend = require('./extend');\nconst win = require('./window');\n\nconst utils = {\n warnOnce: function (method, message) {\n let warned = false;\n\n return function () {\n if (!warned) {\n win.window.console.warn(message);\n warned = true;\n }\n\n return method.apply(this, arguments);\n };\n },\n\n // http://stackoverflow.com/a/5634528/2280888\n _getQBezierValue: function (t, p1, p2, p3) {\n const iT = 1 - t;\n return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3;\n },\n\n getQuadraticCurvePoint: function (startX, startY, cpX, cpY, endX, endY, position) {\n return {\n x: utils._getQBezierValue(position, startX, cpX, endX),\n y: utils._getQBezierValue(position, startY, cpY, endY),\n };\n },\n\n // http://gizma.com/easing/\n easeOutQuad: function (t, b, c, d) {\n t /= d;\n return -c * t*(t-2) + b;\n },\n\n copyAction: function (dest, src) {\n dest.name = src.name;\n dest.axis = src.axis;\n dest.edges = src.edges;\n\n return dest;\n },\n\n is : require('./is'),\n extend : extend,\n hypot : require('./hypot'),\n getOriginXY: require('./getOriginXY'),\n};\n\nextend(utils, require('./arr'));\nextend(utils, require('./domUtils'));\nextend(utils, require('./pointerUtils'));\nextend(utils, require('./rect'));\n\nmodule.exports = utils;\n","const scope = require('../scope');\nconst utils = require('./index');\n\nconst finder = {\n methodOrder: [ 'simulationResume', 'mouseOrPen', 'hasPointer', 'idle' ],\n\n search: function (pointer, eventType, eventTarget) {\n const pointerType = utils.getPointerType(pointer);\n const pointerId = utils.getPointerId(pointer);\n const details = { pointer, pointerId, pointerType, eventType, eventTarget };\n\n for (const method of finder.methodOrder) {\n const interaction = finder[method](details);\n\n if (interaction) {\n return interaction;\n }\n }\n },\n\n // try to resume simulation with a new pointer\n simulationResume: function ({ pointerType, eventType, eventTarget }) {\n if (!/down|start/i.test(eventType)) {\n return null;\n }\n\n for (const interaction of scope.interactions) {\n let element = eventTarget;\n\n if (interaction.simulation && interaction.simulation.allowResume\n && (interaction.pointerType === pointerType)) {\n while (element) {\n // if the element is the interaction element\n if (element === interaction.element) {\n return interaction;\n }\n element = utils.parentNode(element);\n }\n }\n }\n\n return null;\n },\n\n // if it's a mouse or pen interaction\n mouseOrPen: function ({ pointerId, pointerType, eventType }) {\n if (pointerType !== 'mouse' && pointerType !== 'pen') {\n return null;\n }\n\n let firstNonActive;\n\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType) {\n // if it's a down event, skip interactions with running simulations\n if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; }\n\n // if the interaction is active, return it immediately\n if (interaction.interacting()) {\n return interaction;\n }\n // otherwise save it and look for another active interaction\n else if (!firstNonActive) {\n firstNonActive = interaction;\n }\n }\n }\n\n // if no active mouse interaction was found use the first inactive mouse\n // interaction\n if (firstNonActive) {\n return firstNonActive;\n }\n\n // find any mouse or pen interaction.\n // ignore the interaction if the eventType is a *down, and a simulation\n // is active\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType && !(/down/i.test(eventType) && interaction.simulation)) {\n return interaction;\n }\n }\n\n return null;\n },\n\n // get interaction that has this pointer\n hasPointer: function ({ pointerId }) {\n for (const interaction of scope.interactions) {\n if (utils.contains(interaction.pointerIds, pointerId)) {\n return interaction;\n }\n }\n },\n\n // get first idle interaction with a matching pointerType\n idle: function ({ pointerType }) {\n for (const interaction of scope.interactions) {\n // if there's already a pointer held down\n if (interaction.pointerIds.length === 1) {\n const target = interaction.target;\n // don't add this pointer if there is a target interactable and it\n // isn't gesturable\n if (target && !target.options.gesture.enabled) {\n continue;\n }\n }\n // maximum of 2 pointers per interaction\n else if (interaction.pointerIds.length >= 2) {\n continue;\n }\n\n if (!interaction.interacting() && (pointerType === interaction.pointerType)) {\n return interaction;\n }\n }\n\n return null;\n },\n};\n\nmodule.exports = finder;\n","const win = require('./window');\nconst isWindow = require('./isWindow');\n\nconst is = {\n array : () => {},\n\n window : thing => thing === win.window || isWindow(thing),\n\n docFrag : thing => is.object(thing) && thing.nodeType === 11,\n\n object : thing => !!thing && (typeof thing === 'object'),\n\n function: thing => typeof thing === 'function',\n\n number : thing => typeof thing === 'number' ,\n\n bool : thing => typeof thing === 'boolean' ,\n\n string : thing => typeof thing === 'string' ,\n\n element: thing => {\n if (!thing || (typeof thing !== 'object')) { return false; }\n\n const _window = win.getWindow(thing) || win.window;\n\n return (/object|function/.test(typeof _window.Element)\n ? thing instanceof _window.Element //DOM2\n : thing.nodeType === 1 && typeof thing.nodeName === 'string');\n },\n};\n\nis.array = thing => (is.object(thing)\n && (typeof thing.length !== 'undefined')\n && is.function(thing.splice));\n\nmodule.exports = is;\n","module.exports = (thing) => !!(thing && thing.Window) && (thing instanceof thing.Window);\n","function pointerExtend (dest, source) {\n for (const prop in source) {\n const prefixedPropREs = module.exports.prefixedPropREs;\n let deprecated = false;\n\n // skip deprecated prefixed properties\n for (const vendor in prefixedPropREs) {\n if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) {\n deprecated = true;\n break;\n }\n }\n\n if (!deprecated && typeof source[prop] !== 'function') {\n dest[prop] = source[prop];\n }\n }\n return dest;\n}\n\npointerExtend.prefixedPropREs = {\n webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/,\n};\n\nmodule.exports = pointerExtend;\n","const hypot = require('./hypot');\nconst browser = require('./browser');\nconst dom = require('./domObjects');\nconst domUtils = require('./domUtils');\nconst domObjects = require('./domObjects');\nconst is = require('./is');\nconst pointerExtend = require('./pointerExtend');\n\nconst pointerUtils = {\n copyCoords: function (dest, src) {\n dest.page = dest.page || {};\n dest.page.x = src.page.x;\n dest.page.y = src.page.y;\n\n dest.client = dest.client || {};\n dest.client.x = src.client.x;\n dest.client.y = src.client.y;\n\n dest.timeStamp = src.timeStamp;\n },\n\n setCoordDeltas: function (targetObj, prev, cur) {\n targetObj.page.x = cur.page.x - prev.page.x;\n targetObj.page.y = cur.page.y - prev.page.y;\n targetObj.client.x = cur.client.x - prev.client.x;\n targetObj.client.y = cur.client.y - prev.client.y;\n targetObj.timeStamp = cur.timeStamp - prev.timeStamp;\n\n // set pointer velocity\n const dt = Math.max(targetObj.timeStamp / 1000, 0.001);\n\n targetObj.page.speed = hypot(targetObj.page.x, targetObj.page.y) / dt;\n targetObj.page.vx = targetObj.page.x / dt;\n targetObj.page.vy = targetObj.page.y / dt;\n\n targetObj.client.speed = hypot(targetObj.client.x, targetObj.page.y) / dt;\n targetObj.client.vx = targetObj.client.x / dt;\n targetObj.client.vy = targetObj.client.y / dt;\n },\n\n isNativePointer: function (pointer) {\n return (pointer instanceof dom.Event || pointer instanceof dom.Touch);\n },\n\n // Get specified X/Y coords for mouse or event.touches[0]\n getXY: function (type, pointer, xy) {\n xy = xy || {};\n type = type || 'page';\n\n xy.x = pointer[type + 'X'];\n xy.y = pointer[type + 'Y'];\n\n return xy;\n },\n\n getPageXY: function (pointer, page) {\n page = page || {};\n\n // Opera Mobile handles the viewport and scrolling oddly\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n pointerUtils.getXY('screen', pointer, page);\n\n page.x += window.scrollX;\n page.y += window.scrollY;\n }\n else {\n pointerUtils.getXY('page', pointer, page);\n }\n\n return page;\n },\n\n getClientXY: function (pointer, client) {\n client = client || {};\n\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n // Opera Mobile handles the viewport and scrolling oddly\n pointerUtils.getXY('screen', pointer, client);\n }\n else {\n pointerUtils.getXY('client', pointer, client);\n }\n\n return client;\n },\n\n getPointerId: function (pointer) {\n return is.number(pointer.pointerId)? pointer.pointerId : pointer.identifier;\n },\n\n setCoords: function (targetObj, pointers, timeStamp) {\n const pointer = (pointers.length > 1\n ? pointerUtils.pointerAverage(pointers)\n : pointers[0]);\n\n const tmpXY = {};\n\n pointerUtils.getPageXY(pointer, tmpXY);\n targetObj.page.x = tmpXY.x;\n targetObj.page.y = tmpXY.y;\n\n pointerUtils.getClientXY(pointer, tmpXY);\n targetObj.client.x = tmpXY.x;\n targetObj.client.y = tmpXY.y;\n\n targetObj.timeStamp = is.number(timeStamp) ? timeStamp :new Date().getTime();\n },\n\n pointerExtend: pointerExtend,\n\n getTouchPair: function (event) {\n const touches = [];\n\n // array of touches is supplied\n if (is.array(event)) {\n touches[0] = event[0];\n touches[1] = event[1];\n }\n // an event\n else {\n if (event.type === 'touchend') {\n if (event.touches.length === 1) {\n touches[0] = event.touches[0];\n touches[1] = event.changedTouches[0];\n }\n else if (event.touches.length === 0) {\n touches[0] = event.changedTouches[0];\n touches[1] = event.changedTouches[1];\n }\n }\n else {\n touches[0] = event.touches[0];\n touches[1] = event.touches[1];\n }\n }\n\n return touches;\n },\n\n pointerAverage: function (pointers) {\n const average = {\n pageX : 0,\n pageY : 0,\n clientX: 0,\n clientY: 0,\n screenX: 0,\n screenY: 0,\n };\n\n for (const pointer of pointers) {\n for (const prop in average) {\n average[prop] += pointer[prop];\n }\n }\n for (const prop in average) {\n average[prop] /= pointers.length;\n }\n\n return average;\n },\n\n touchBBox: function (event) {\n if (!event.length && !(event.touches && event.touches.length > 1)) {\n return;\n }\n\n const touches = pointerUtils.getTouchPair(event);\n const minX = Math.min(touches[0].pageX, touches[1].pageX);\n const minY = Math.min(touches[0].pageY, touches[1].pageY);\n const maxX = Math.max(touches[0].pageX, touches[1].pageX);\n const maxY = Math.max(touches[0].pageY, touches[1].pageY);\n\n return {\n x: minX,\n y: minY,\n left: minX,\n top: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n },\n\n touchDistance: function (event, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n\n\n const dx = touches[0][sourceX] - touches[1][sourceX];\n const dy = touches[0][sourceY] - touches[1][sourceY];\n\n return hypot(dx, dy);\n },\n\n touchAngle: function (event, prevAngle, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n const dx = touches[1][sourceX] - touches[0][sourceX];\n const dy = touches[1][sourceY] - touches[0][sourceY];\n const angle = 180 * Math.atan2(dy , dx) / Math.PI;\n\n return angle;\n },\n\n getPointerType: function (pointer) {\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : is.number(pointer.pointerType)\n ? [undefined, undefined,'touch', 'pen', 'mouse'][pointer.pointerType]\n // if the PointerEvent API isn't available, then the \"pointer\" must\n // be either a MouseEvent, TouchEvent, or Touch object\n : /touch/.test(pointer.type) || pointer instanceof domObjects.Touch\n ? 'touch'\n : 'mouse';\n },\n\n // [ event.target, event.currentTarget ]\n getEventTargets: function (event) {\n return [\n domUtils.getActualElement(event.path ? event.path[0] : event.target),\n domUtils.getActualElement(event.currentTarget),\n ];\n },\n};\n\nmodule.exports = pointerUtils;\n","const { window } = require('./window');\n\nconst vendors = ['ms', 'moz', 'webkit', 'o'];\nlet lastTime = 0;\nlet request;\nlet cancel;\n\nfor (let x = 0; x < vendors.length && !window.requestAnimationFrame; x++) {\n request = window[vendors[x] + 'RequestAnimationFrame'];\n cancel = window[vendors[x] +'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n}\n\nif (!request) {\n request = function (callback) {\n const currTime = new Date().getTime();\n const timeToCall = Math.max(0, 16 - (currTime - lastTime));\n const id = setTimeout(function () { callback(currTime + timeToCall); },\n timeToCall);\n\n lastTime = currTime + timeToCall;\n return id;\n };\n}\n\nif (!cancel) {\n cancel = function (id) {\n clearTimeout(id);\n };\n}\n\nmodule.exports = {\n request,\n cancel,\n};\n","const extend = require('./extend');\nconst is = require('./is');\nconst {\n closest,\n parentNode,\n getElementRect,\n} = require('./domUtils');\n\nconst rectUtils = {\n getStringOptionResult: function (value, interactable, element) {\n if (!is.string(value)) {\n return null;\n }\n\n if (value === 'parent') {\n value = parentNode(element);\n }\n else if (value === 'self') {\n value = interactable.getRect(element);\n }\n else {\n value = closest(element, value);\n }\n\n return value;\n },\n\n resolveRectLike: function (value, interactable, element, functionArgs) {\n value = rectUtils.getStringOptionResult(value, interactable, element) || value;\n\n if (is.function(value)) {\n value = value.apply(null, functionArgs);\n }\n\n if (is.element(value)) {\n value = getElementRect(value);\n }\n\n return value;\n },\n\n rectToXY: function (rect) {\n return rect && {\n x: 'x' in rect ? rect.x : rect.left,\n y: 'y' in rect ? rect.y : rect.top,\n };\n },\n\n xywhToTlbr: function (rect) {\n if (rect && !('left' in rect && 'top' in rect)) {\n rect = extend({}, rect);\n\n rect.left = rect.x || 0;\n rect.top = rect.y || 0;\n rect.right = rect.right || (rect.left + rect.width);\n rect.bottom = rect.bottom || (rect.top + rect.height);\n }\n\n return rect;\n },\n\n tlbrToXywh: function (rect) {\n if (rect && !('x' in rect && 'y' in rect)) {\n rect = extend({}, rect);\n\n rect.x = rect.left || 0;\n rect.top = rect.top || 0;\n rect.width = rect.width || (rect.right - rect.x);\n rect.height = rect.height || (rect.bottom - rect.y);\n }\n\n return rect;\n },\n};\n\nmodule.exports = rectUtils;\n","const win = module.exports;\nconst isWindow = require('./isWindow');\n\nfunction init (window) {\n // get wrapped window if using Shadow DOM polyfill\n\n win.realWindow = window;\n\n // create a TextNode\n const el = window.document.createTextNode('');\n\n // check if it's wrapped by a polyfill\n if (el.ownerDocument !== window.document\n && typeof window.wrap === 'function'\n && window.wrap(el) === el) {\n // use wrapped window\n window = window.wrap(window);\n }\n\n win.window = window;\n}\n\nif (typeof window === 'undefined') {\n win.window = undefined;\n win.realWindow = undefined;\n}\nelse {\n init(window);\n}\n\nwin.getWindow = function getWindow (node) {\n if (isWindow(node)) {\n return node;\n }\n\n const rootNode = (node.ownerDocument || node);\n\n return rootNode.defaultView || rootNode.parentWindow || win.window;\n};\n\nwin.init = init;\n"]} \ No newline at end of file diff --git a/package.json b/package.json index 76f3e9969..f39704e99 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "interactjs", - "version": "1.3.0-alpha.3+sha.9595c40", + "version": "1.3.0-alpha.4+sha.7970416", "repository": { "type": "git", "url": "https://github.com/taye/interact.js.git"
- interact.pointerMoveTolerance([newValue])⚓➭ + interact.pointerMoveTolerance([newValue])⚓➭ @@ -2261,7 +2261,7 @@ Parameters - Interaction.start(action, target, element)⚓➭ + Interaction.start(action, target, element)⚓➭ @@ -2356,7 +2356,7 @@ Parameters - Interaction.doMove()⚓➭ + Interaction.doMove()⚓➭ @@ -2403,7 +2403,7 @@ Interaction.doMove() - Interaction.end([event])⚓➭ + Interaction.end([event])⚓➭ diff --git a/dist/interact.js b/dist/interact.js index e8ae35c3b..c78a3c751 100644 --- a/dist/interact.js +++ b/dist/interact.js @@ -1,5 +1,5 @@ /** - * interact.js v1.3.0-alpha.3+sha.9595c40 + * interact.js v1.3.0-alpha.4+sha.7970416-dirty * * Copyright (c) 2012-2017 Taye Adeyemi * Open source under the MIT License. @@ -816,6 +816,7 @@ var scope = require('./scope'); var utils = require('./utils'); var events = require('./utils/events'); var browser = require('./utils/browser'); +var domObjects = require('./utils/domObjects'); var finder = require('./utils/interactionFinder'); var signals = require('./utils/Signals').new(); @@ -829,7 +830,9 @@ var prevTouchTime = 0; scope.interactions = []; var Interaction = function () { - function Interaction() { + function Interaction(_ref) { + var pointerType = _ref.pointerType; + _classCallCheck(this, Interaction); this.target = null; // current interactable being interacted with @@ -886,7 +889,7 @@ var Interaction = function () { this.pointerWasMoved = false; this._interacting = false; - this.mouse = false; + this.pointerType = pointerType; signals.fire('new', this); @@ -1130,6 +1133,11 @@ var Interaction = function () { }; Interaction.prototype.getPointerIndex = function getPointerIndex(pointer) { + // mouse and pen interactions may have only one pointer + if (this.pointerType === 'mouse' || this.pointerType === 'pen') { + return 0; + } + return utils.indexOf(this.pointerIds, utils.getPointerId(pointer)); }; @@ -1161,8 +1169,7 @@ var Interaction = function () { }; Interaction.prototype.removePointer = function removePointer(pointer, event) { - var id = utils.getPointerId(pointer); - var index = this.mouse ? 0 : utils.indexOf(this.pointerIds, id); + var index = this.getPointerIndex(pointer); if (index === -1) { return; @@ -1197,6 +1204,8 @@ for (var i = 0, len = methodNames.length; i < len; i++) { function doOnInteractions(method) { return function (event) { + var pointerType = utils.getPointerType(event); + var _utils$getEventTarget = utils.getEventTargets(event), eventTarget = _utils$getEventTarget[0], curEventTarget = _utils$getEventTarget[1]; @@ -1210,7 +1219,7 @@ function doOnInteractions(method) { var pointer = event.changedTouches[_i]; var interaction = finder.search(pointer, event.type, eventTarget); - matches.push([pointer, interaction || new Interaction()]); + matches.push([pointer, interaction || new Interaction({ pointerType: pointerType })]); } } else { var invalidPointer = false; @@ -1218,7 +1227,7 @@ function doOnInteractions(method) { if (!browser.supportsPointerEvent && /mouse/.test(event.type)) { // ignore mouse events while touch interactions are active for (var _i2 = 0; _i2 < scope.interactions.length && !invalidPointer; _i2++) { - invalidPointer = !scope.interactions[_i2].mouse && scope.interactions[_i2].pointerIsDown; + invalidPointer = scope.interactions[_i2].pointerType !== 'mouse' && scope.interactions[_i2].pointerIsDown; } // try to ignore mouse events that are simulated by the browser @@ -1232,11 +1241,7 @@ function doOnInteractions(method) { var _interaction = finder.search(event, event.type, eventTarget); if (!_interaction) { - - _interaction = new Interaction(); - _interaction.mouse = /mouse/i.test(event.pointerType || event.type) - // MSPointerEvent.MSPOINTER_TYPE_MOUSE - || event.pointerType === 4 || !event.pointerType; + _interaction = new Interaction({ pointerType: pointerType }); } matches.push([event, _interaction]); @@ -1244,20 +1249,20 @@ function doOnInteractions(method) { } for (var _iterator = matches, _isArray = Array.isArray(_iterator), _i3 = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { - var _ref; + var _ref2; if (_isArray) { if (_i3 >= _iterator.length) break; - _ref = _iterator[_i3++]; + _ref2 = _iterator[_i3++]; } else { _i3 = _iterator.next(); if (_i3.done) break; - _ref = _i3.value; + _ref2 = _i3.value; } - var _ref2 = _ref, - _pointer = _ref2[0], - _interaction2 = _ref2[1]; + var _ref3 = _ref2, + _pointer = _ref3[0], + _interaction2 = _ref3[1]; _interaction2._updateEventTargets(eventTarget, curEventTarget); _interaction2[method](_pointer, event, eventTarget, curEventTarget); @@ -1277,7 +1282,7 @@ function endAll(event) { var docEvents = {/* 'eventType': listenerFunc */}; var pEventTypes = browser.pEventTypes; -if (scope.PointerEvent) { +if (domObjects.PointerEvent) { docEvents[pEventTypes.down] = listeners.pointerDown; docEvents[pEventTypes.move] = listeners.pointerMove; docEvents[pEventTypes.up] = listeners.pointerUp; @@ -1295,8 +1300,8 @@ if (scope.PointerEvent) { docEvents.blur = endAll; -function onDocSignal(_ref3, signalName) { - var doc = _ref3.doc; +function onDocSignal(_ref4, signalName) { + var doc = _ref4.doc; var eventMethod = signalName.indexOf('add') === 0 ? events.add : events.remove; @@ -1311,14 +1316,14 @@ function onDocSignal(_ref3, signalName) { } } -signals.on('update-pointer-down', function (_ref4) { - var interaction = _ref4.interaction, - pointer = _ref4.pointer, - pointerId = _ref4.pointerId, - pointerIndex = _ref4.pointerIndex, - event = _ref4.event, - eventTarget = _ref4.eventTarget, - down = _ref4.down; +signals.on('update-pointer-down', function (_ref5) { + var interaction = _ref5.interaction, + pointer = _ref5.pointer, + pointerId = _ref5.pointerId, + pointerIndex = _ref5.pointerIndex, + event = _ref5.event, + eventTarget = _ref5.eventTarget, + down = _ref5.down; interaction.pointerIds[pointerIndex] = pointerId; interaction.pointers[pointerIndex] = pointer; @@ -1355,7 +1360,7 @@ scope.endAllInteractions = endAll; module.exports = Interaction; -},{"./scope":34,"./utils":44,"./utils/Signals":35,"./utils/browser":37,"./utils/events":40,"./utils/interactionFinder":45}],6:[function(require,module,exports){ +},{"./scope":34,"./utils":44,"./utils/Signals":35,"./utils/browser":37,"./utils/domObjects":38,"./utils/events":40,"./utils/interactionFinder":45}],6:[function(require,module,exports){ 'use strict'; var Interaction = require('../Interaction'); @@ -5460,7 +5465,7 @@ module.exports = function () { this.originalEvent = event; this.type = type; this.pointerId = pointerUtils.getPointerId(pointer); - this.pointerType = pointerUtils.getPointerType(pointer, interaction); + this.pointerType = pointerUtils.getPointerType(pointer); this.target = eventTarget; this.currentTarget = null; @@ -5758,8 +5763,10 @@ Interaction.signals.on('down', function (_ref6) { timer.duration = minDuration; timer.timeout = setTimeout(function () { fire({ - interaction: interaction, eventCopy: eventCopy, eventTarget: eventTarget, + interaction: interaction, + eventTarget: eventTarget, pointer: browser.isIE8 ? eventCopy : pointer, + event: eventCopy, type: 'hold' }); }, minDuration); @@ -6946,17 +6953,14 @@ module.exports = utils; var scope = require('../scope'); var utils = require('./index'); -var browser = require('./browser'); var finder = { - methodOrder: ['simulationResume', 'mouse', 'hasPointer', 'idle'], + methodOrder: ['simulationResume', 'mouseOrPen', 'hasPointer', 'idle'], search: function search(pointer, eventType, eventTarget) { - var mouseEvent = /mouse/i.test(pointer.pointerType || eventType) - // MSPointerEvent.MSPOINTER_TYPE_MOUSE - || pointer.pointerType === 4; + var pointerType = utils.getPointerType(pointer); var pointerId = utils.getPointerId(pointer); - var details = { pointer: pointer, pointerId: pointerId, mouseEvent: mouseEvent, eventType: eventType, eventTarget: eventTarget }; + var details = { pointer: pointer, pointerId: pointerId, pointerType: pointerType, eventType: eventType, eventTarget: eventTarget }; for (var _iterator = finder.methodOrder, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { var _ref; @@ -6982,7 +6986,7 @@ var finder = { // try to resume simulation with a new pointer simulationResume: function simulationResume(_ref2) { - var mouseEvent = _ref2.mouseEvent, + var pointerType = _ref2.pointerType, eventType = _ref2.eventType, eventTarget = _ref2.eventTarget; @@ -7006,7 +7010,7 @@ var finder = { var element = eventTarget; - if (interaction.simulation && interaction.simulation.allowResume && interaction.mouse === mouseEvent) { + if (interaction.simulation && interaction.simulation.allowResume && interaction.pointerType === pointerType) { while (element) { // if the element is the interaction element if (element === interaction.element) { @@ -7020,13 +7024,13 @@ var finder = { return null; }, - // if it's a mouse interaction - mouse: function mouse(_ref4) { + // if it's a mouse or pen interaction + mouseOrPen: function mouseOrPen(_ref4) { var pointerId = _ref4.pointerId, - mouseEvent = _ref4.mouseEvent, + pointerType = _ref4.pointerType, eventType = _ref4.eventType; - if (!mouseEvent && (browser.supportsTouch || browser.supportsPointerEvent)) { + if (pointerType !== 'mouse' && pointerType !== 'pen') { return null; } @@ -7046,7 +7050,7 @@ var finder = { var interaction = _ref5; - if (interaction.mouse) { + if (interaction.pointerType === pointerType) { // if it's a down event, skip interactions with running simulations if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; @@ -7069,8 +7073,8 @@ var finder = { return firstNonActive; } - // Find any interaction specifically for mouse. - // ignore the interaction if the eventType is a mousedown, and a simulation + // find any mouse or pen interaction. + // ignore the interaction if the eventType is a *down, and a simulation // is active for (var _iterator4 = scope.interactions, _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) { var _ref6; @@ -7086,7 +7090,7 @@ var finder = { var _interaction = _ref6; - if (_interaction.mouse && !(/down/.test(eventType) && _interaction.simulation)) { + if (_interaction.pointerType === pointerType && !(/down/i.test(eventType) && _interaction.simulation)) { return _interaction; } } @@ -7118,9 +7122,9 @@ var finder = { } }, - // get first idle interaction + // get first idle interaction with a matching pointerType idle: function idle(_ref9) { - var mouseEvent = _ref9.mouseEvent; + var pointerType = _ref9.pointerType; for (var _iterator6 = scope.interactions, _isArray6 = Array.isArray(_iterator6), _i6 = 0, _iterator6 = _isArray6 ? _iterator6 : _iterator6[Symbol.iterator]();;) { var _ref10; @@ -7150,7 +7154,7 @@ var finder = { continue; } - if (!interaction.interacting() && mouseEvent === interaction.mouse) { + if (!interaction.interacting() && pointerType === interaction.pointerType) { return interaction; } } @@ -7161,7 +7165,7 @@ var finder = { module.exports = finder; -},{"../scope":34,"./browser":37,"./index":44}],46:[function(require,module,exports){ +},{"../scope":34,"./index":44}],46:[function(require,module,exports){ 'use strict'; var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; @@ -7262,6 +7266,7 @@ var hypot = require('./hypot'); var browser = require('./browser'); var dom = require('./domObjects'); var domUtils = require('./domUtils'); +var domObjects = require('./domObjects'); var is = require('./is'); var pointerExtend = require('./pointerExtend'); @@ -7468,17 +7473,11 @@ var pointerUtils = { return angle; }, - getPointerType: function getPointerType(pointer, interaction) { - // if the PointerEvent API isn't available, then the pointer must be ither - // a MouseEvent or TouchEvent - if (interaction.mouse) { - return 'mouse'; - } - if (!browser.supportsPointerEvent) { - return 'touch'; - } - - return is.string(pointer.pointerType) ? pointer.pointerType : [undefined, undefined, 'touch', 'pen', 'mouse'][pointer.pointerType]; + getPointerType: function getPointerType(pointer) { + return is.string(pointer.pointerType) ? pointer.pointerType : is.number(pointer.pointerType) ? [undefined, undefined, 'touch', 'pen', 'mouse'][pointer.pointerType] + // if the PointerEvent API isn't available, then the "pointer" must + // be either a MouseEvent, TouchEvent, or Touch object + : /touch/.test(pointer.type) || pointer instanceof domObjects.Touch ? 'touch' : 'mouse'; }, // [ event.target, event.currentTarget ] diff --git a/dist/interact.js.map b/dist/interact.js.map index 60832b766..4f3a62ba8 100644 --- a/dist/interact.js.map +++ b/dist/interact.js.map @@ -1 +1 @@ -{"version":3,"sources":["src/header.js","node_modules/browser-pack/_prelude.js","index.js","src/Eventable.js","src/InteractEvent.js","src/Interactable.js","src/Interaction.js","src/actions/base.js","src/actions/drag.js","src/actions/drop.js","src/actions/gesture.js","src/actions/resize.js","src/autoScroll.js","src/autoStart/InteractableMethods.js","src/autoStart/base.js","src/autoStart/delay.js","src/autoStart/drag.js","src/autoStart/gesture.js","src/autoStart/resize.js","src/defaultOptions.js","src/index.js","src/inertia.js","src/interact.js","src/interactablePreventDefault.js","src/legacyBrowsers.js","src/modifiers/index.js","src/modifiers/restrict.js","src/modifiers/restrictEdges.js","src/modifiers/restrictSize.js","src/modifiers/snap.js","src/modifiers/snapSize.js","src/pointerEvents/PointerEvent.js","src/pointerEvents/base.js","src/pointerEvents/holdRepeat.js","src/pointerEvents/interactableTargets.js","src/scope.js","src/utils/Signals.js","src/utils/arr.js","src/utils/browser.js","src/utils/domObjects.js","src/utils/domUtils.js","src/utils/events.js","src/utils/extend.js","src/utils/getOriginXY.js","src/utils/hypot.js","src/utils/index.js","src/utils/interactionFinder.js","src/utils/is.js","src/utils/isWindow.js","src/utils/pointerExtend.js","src/utils/pointerUtils.js","src/utils/raf.js","src/utils/rect.js","src/utils/window.js"],"names":[],"mappings":"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","file":"interact.js","sourceRoot":"","sourcesContent":["/**\n * interact.js v1.3.0-alpha.3+sha.9595c40\n *\n * Copyright (c) 2012-2017 Taye Adeyemi \n * Open source under the MIT License.\n * https://raw.github.com/taye/interact.js/master/LICENSE\n */\n","(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o 150) {\n return null;\n }\n\n let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI;\n const overlap = 22.5;\n\n if (angle < 0) {\n angle += 360;\n }\n\n const left = 135 - overlap <= angle && angle < 225 + overlap;\n const up = 225 - overlap <= angle && angle < 315 + overlap;\n\n const right = !left && (315 - overlap <= angle || angle < 45 + overlap);\n const down = !up && 45 - overlap <= angle && angle < 135 + overlap;\n\n return {\n up,\n down,\n left,\n right,\n angle,\n speed: interaction.prevEvent.speed,\n velocity: {\n x: interaction.prevEvent.velocityX,\n y: interaction.prevEvent.velocityY,\n },\n };\n }\n\n preventDefault () {}\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n}\n\nsignals.on('set-delta', function ({ iEvent, interaction, starting, deltaSource }) {\n const prevEvent = starting? iEvent : interaction.prevEvent;\n\n if (deltaSource === 'client') {\n iEvent.dx = iEvent.clientX - prevEvent.clientX;\n iEvent.dy = iEvent.clientY - prevEvent.clientY;\n }\n else {\n iEvent.dx = iEvent.pageX - prevEvent.pageX;\n iEvent.dy = iEvent.pageY - prevEvent.pageY;\n }\n});\n\nInteractEvent.signals = signals;\n\nmodule.exports = InteractEvent;\n","const is = require('./utils/is');\nconst events = require('./utils/events');\nconst extend = require('./utils/extend');\nconst actions = require('./actions/base');\nconst scope = require('./scope');\nconst Eventable = require('./Eventable');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nconst {\n getElementRect,\n nodeContains,\n trySelector,\n} = require('./utils/domUtils');\nconst { getWindow } = require('./utils/window');\nconst { indexOf, contains } = require('./utils/arr');\nconst { wheelEvent } = require('./utils/browser');\n\n// all set interactables\nscope.interactables = [];\n\n/*\\\n * Interactable\n [ property ]\n **\n * Object type returned by @interact\n\\*/\nclass Interactable {\n constructor (target, options) {\n options = options || {};\n\n this.target = target;\n this.events = new Eventable();\n this._context = options.context || scope.document;\n this._win = getWindow(trySelector(target)? this._context : target);\n this._doc = this._win.document;\n\n signals.fire('new', {\n target,\n options,\n interactable: this,\n win: this._win,\n });\n\n scope.addDocument( this._doc, this._win );\n\n scope.interactables.push(this);\n\n this.set(options);\n }\n\n setOnEvents (action, phases) {\n const onAction = 'on' + action;\n\n if (is.function(phases.onstart) ) { this.events[onAction + 'start' ] = phases.onstart ; }\n if (is.function(phases.onmove) ) { this.events[onAction + 'move' ] = phases.onmove ; }\n if (is.function(phases.onend) ) { this.events[onAction + 'end' ] = phases.onend ; }\n if (is.function(phases.oninertiastart)) { this.events[onAction + 'inertiastart' ] = phases.oninertiastart ; }\n\n return this;\n }\n\n setPerAction (action, options) {\n // for all the default per-action options\n for (const option in options) {\n // if this option exists for this action\n if (option in defaults[action]) {\n // if the option in the options arg is an object value\n if (is.object(options[option])) {\n // duplicate the object\n this.options[action][option] = extend(this.options[action][option] || {}, options[option]);\n\n if (is.object(defaults.perAction[option]) && 'enabled' in defaults.perAction[option]) {\n this.options[action][option].enabled = options[option].enabled === false? false : true;\n }\n }\n else if (is.bool(options[option]) && is.object(defaults.perAction[option])) {\n this.options[action][option].enabled = options[option];\n }\n else if (options[option] !== undefined) {\n // or if it's not undefined, do a plain assignment\n this.options[action][option] = options[option];\n }\n }\n }\n }\n\n /*\\\n * Interactable.getRect\n [ method ]\n *\n * The default function to get an Interactables bounding rect. Can be\n * overridden using @Interactable.rectChecker.\n *\n - element (Element) #optional The element to measure.\n = (object) The object's bounding rectangle.\n o {\n o top : 0,\n o left : 0,\n o bottom: 0,\n o right : 0,\n o width : 0,\n o height: 0\n o }\n \\*/\n getRect (element) {\n element = element || this.target;\n\n if (is.string(this.target) && !(is.element(element))) {\n element = this._context.querySelector(this.target);\n }\n\n return getElementRect(element);\n }\n\n /*\\\n * Interactable.rectChecker\n [ method ]\n *\n * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n - checker (function) #optional A function which returns this Interactable's bounding rectangle. See @Interactable.getRect\n = (function | object) The checker function or this Interactable\n \\*/\n rectChecker (checker) {\n if (is.function(checker)) {\n this.getRect = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.getRect;\n\n return this;\n }\n\n return this.getRect;\n }\n\n _backCompatOption (optionName, newValue) {\n if (trySelector(newValue) || is.object(newValue)) {\n this.options[optionName] = newValue;\n\n for (const action of actions.names) {\n this.options[action][optionName] = newValue;\n }\n\n return this;\n }\n\n return this.options[optionName];\n }\n\n /*\\\n * Interactable.origin\n [ method ]\n *\n * Gets or sets the origin of the Interactable's element. The x and y\n * of the origin will be subtracted from action event coordinates.\n *\n - origin (object | string) #optional An object eg. { x: 0, y: 0 } or string 'parent', 'self' or any CSS selector\n * OR\n - origin (Element) #optional An HTML or SVG Element whose rect will be used\n **\n = (object) The current origin or this Interactable\n \\*/\n origin (newValue) {\n return this._backCompatOption('origin', newValue);\n }\n\n /*\\\n * Interactable.deltaSource\n [ method ]\n *\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n - newValue (string) #optional Use 'client' if you will be scrolling while interacting; Use 'page' if you want autoScroll to work\n = (string | object) The current deltaSource or this Interactable\n \\*/\n deltaSource (newValue) {\n if (newValue === 'page' || newValue === 'client') {\n this.options.deltaSource = newValue;\n\n return this;\n }\n\n return this.options.deltaSource;\n }\n\n /*\\\n * Interactable.context\n [ method ]\n *\n * Gets the selector context Node of the Interactable. The default is `window.document`.\n *\n = (Node) The context Node of this Interactable\n **\n \\*/\n context () {\n return this._context;\n }\n\n inContext (element) {\n return (this._context === element.ownerDocument\n || nodeContains(this._context, element));\n }\n\n /*\\\n * Interactable.fire\n [ method ]\n *\n * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n - iEvent (InteractEvent) The InteractEvent object to be fired on this Interactable\n = (Interactable) this Interactable\n \\*/\n fire (iEvent) {\n this.events.fire(iEvent);\n\n return this;\n }\n\n _onOffMultiple (method, eventType, listener, options) {\n if (is.string(eventType) && eventType.search(' ') !== -1) {\n eventType = eventType.trim().split(/ +/);\n }\n\n if (is.array(eventType)) {\n for (let i = 0; i < eventType.length; i++) {\n this[method](eventType[i], listener, options);\n }\n\n return true;\n }\n\n if (is.object(eventType)) {\n for (const prop in eventType) {\n this[method](prop, eventType[prop], listener);\n }\n\n return true;\n }\n }\n\n /*\\\n * Interactable.on\n [ method ]\n *\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n - eventType (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) This Interactable\n \\*/\n on (eventType, listener, options) {\n if (this._onOffMultiple('on', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.on(eventType, listener);\n }\n // delegated event for selector\n else if (is.string(this.target)) {\n events.addDelegate(this.target, this._context, eventType, listener, options);\n }\n else {\n events.add(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.off\n [ method ]\n *\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n - eventType (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) This Interactable\n \\*/\n off (eventType, listener, options) {\n if (this._onOffMultiple('off', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n // if it is an action event type\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.off(eventType, listener);\n }\n // delegated event\n else if (is.string(this.target)) {\n events.removeDelegate(this.target, this._context, eventType, listener, options);\n }\n // remove listener from this Interatable's element\n else {\n events.remove(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.set\n [ method ]\n *\n * Reset the options of this Interactable\n - options (object) The new settings to apply\n = (object) This Interactable\n \\*/\n set (options) {\n if (!is.object(options)) {\n options = {};\n }\n\n this.options = extend({}, defaults.base);\n\n const perActions = extend({}, defaults.perAction);\n\n for (const actionName in actions.methodDict) {\n const methodName = actions.methodDict[actionName];\n\n this.options[actionName] = extend({}, defaults[actionName]);\n\n this.setPerAction(actionName, perActions);\n\n this[methodName](options[actionName]);\n }\n\n for (const setting of Interactable.settingsMethods) {\n this.options[setting] = defaults.base[setting];\n\n if (setting in options) {\n this[setting](options[setting]);\n }\n }\n\n signals.fire('set', {\n options,\n interactable: this,\n });\n\n return this;\n }\n\n /*\\\n * Interactable.unset\n [ method ]\n *\n * Remove this interactable from the list of interactables and remove\n * it's action capabilities and event listeners\n *\n = (object) @interact\n \\*/\n unset () {\n events.remove(this.target, 'all');\n\n if (is.string(this.target)) {\n // remove delegated events\n for (const type in events.delegatedEvents) {\n const delegated = events.delegatedEvents[type];\n\n if (delegated.selectors[0] === this.target\n && delegated.contexts[0] === this._context) {\n\n delegated.selectors.splice(0, 1);\n delegated.contexts .splice(0, 1);\n delegated.listeners.splice(0, 1);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegated[type] = null;\n }\n }\n\n events.remove(this._context, type, events.delegateListener);\n events.remove(this._context, type, events.delegateUseCapture, true);\n }\n }\n else {\n events.remove(this, 'all');\n }\n\n signals.fire('unset', { interactable: this });\n\n scope.interactables.splice(indexOf(scope.interactables, this), 1);\n\n // Stop related interactions when an Interactable is unset\n for (const interaction of scope.interactions || []) {\n if (interaction.target === this && interaction.interacting()) {\n interaction.stop();\n }\n }\n\n return scope.interact;\n }\n}\n\nscope.interactables.indexOfElement = function indexOfElement (target, context) {\n context = context || scope.document;\n\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n if (interactable.target === target && interactable._context === context) {\n return i;\n }\n }\n return -1;\n};\n\nscope.interactables.get = function interactableGet (element, options, dontCheckInContext) {\n const ret = this[this.indexOfElement(element, options && options.context)];\n\n return ret && (is.string(element) || dontCheckInContext || ret.inContext(element))? ret : null;\n};\n\nscope.interactables.forEachSelector = function (callback, element) {\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n // skip non CSS selector targets and out of context elements\n if (!is.string(interactable.target)\n || (element && !interactable.inContext(element))) {\n continue;\n }\n\n const ret = callback(interactable, interactable.target, interactable._context, i, this);\n\n if (ret !== undefined) {\n return ret;\n }\n }\n};\n\n// all interact.js eventTypes\nInteractable.eventTypes = scope.eventTypes = [];\n\nInteractable.signals = signals;\n\nInteractable.settingsMethods = [ 'deltaSource', 'origin', 'preventDefault', 'rectChecker' ];\n\nmodule.exports = Interactable;\n","const scope = require('./scope');\nconst utils = require('./utils');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst finder = require('./utils/interactionFinder');\nconst signals = require('./utils/Signals').new();\n\nconst listeners = {};\nconst methodNames = [\n 'pointerDown', 'pointerMove', 'pointerUp',\n 'updatePointer', 'removePointer',\n];\n\n// for ignoring browser's simulated mouse events\nlet prevTouchTime = 0;\n\n// all active and idle interactions\nscope.interactions = [];\n\nclass Interaction {\n constructor () {\n this.target = null; // current interactable being interacted with\n this.element = null; // the target element of the interactable\n\n this.prepared = { // action that's ready to be fired on next move event\n name : null,\n axis : null,\n edges: null,\n };\n\n // keep track of added pointers\n this.pointers = [];\n this.pointerIds = [];\n this.downTargets = [];\n this.downTimes = [];\n\n // Previous native pointer move event coordinates\n this.prevCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n // current native pointer move event coordinates\n this.curCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Starting InteractEvent pointer coordinates\n this.startCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Change in coordinates and time of the pointer\n this.pointerDelta = {\n page : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n client : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n timeStamp: 0,\n };\n\n this.downEvent = null; // pointerdown/mousedown/touchstart event\n this.downPointer = {};\n\n this._eventTarget = null;\n this._curEventTarget = null;\n\n this.prevEvent = null; // previous action event\n\n this.pointerIsDown = false;\n this.pointerWasMoved = false;\n this._interacting = false;\n\n this.mouse = false;\n\n signals.fire('new', this);\n\n scope.interactions.push(this);\n }\n\n pointerDown (pointer, event, eventTarget) {\n const pointerIndex = this.updatePointer(pointer, event, true);\n\n signals.fire('down', {\n pointer,\n event,\n eventTarget,\n pointerIndex,\n interaction: this,\n });\n }\n\n /*\\\n * Interaction.start\n [ method ]\n *\n * Start an action with the given Interactable and Element as tartgets. The\n * action must be enabled for the target Interactable and an appropriate number\n * of pointers must be held down - 1 for drag/resize, 2 for gesture.\n *\n * Use it with `interactable.able({ manualStart: false })` to always\n * [start actions manually](https://github.com/taye/interact.js/issues/114)\n *\n - action (object) The action to be performed - drag, resize, etc.\n - target (Interactable) The Interactable to target\n - element (Element) The DOM Element to target\n = (object) interact\n **\n | interact(target)\n | .draggable({\n | // disable the default drag start by down->move\n | manualStart: true\n | })\n | // start dragging after the user holds the pointer down\n | .on('hold', function (event) {\n | var interaction = event.interaction;\n |\n | if (!interaction.interacting()) {\n | interaction.start({ name: 'drag' },\n | event.interactable,\n | event.currentTarget);\n | }\n | });\n \\*/\n start (action, target, element) {\n if (this.interacting()\n || !this.pointerIsDown\n || this.pointerIds.length < (action.name === 'gesture'? 2 : 1)) {\n return;\n }\n\n // if this interaction had been removed after stopping\n // add it back\n if (utils.indexOf(scope.interactions, this) === -1) {\n scope.interactions.push(this);\n }\n\n utils.copyAction(this.prepared, action);\n this.target = target;\n this.element = element;\n\n signals.fire('action-start', {\n interaction: this,\n event: this.downEvent,\n });\n }\n\n pointerMove (pointer, event, eventTarget) {\n if (!this.simulation) {\n this.updatePointer(pointer);\n utils.setCoords(this.curCoords, this.pointers);\n }\n\n const duplicateMove = (this.curCoords.page.x === this.prevCoords.page.x\n && this.curCoords.page.y === this.prevCoords.page.y\n && this.curCoords.client.x === this.prevCoords.client.x\n && this.curCoords.client.y === this.prevCoords.client.y);\n\n let dx;\n let dy;\n\n // register movement greater than pointerMoveTolerance\n if (this.pointerIsDown && !this.pointerWasMoved) {\n dx = this.curCoords.client.x - this.startCoords.client.x;\n dy = this.curCoords.client.y - this.startCoords.client.y;\n\n this.pointerWasMoved = utils.hypot(dx, dy) > Interaction.pointerMoveTolerance;\n }\n\n const signalArg = {\n pointer,\n pointerIndex: this.getPointerIndex(pointer),\n event,\n eventTarget,\n dx,\n dy,\n duplicate: duplicateMove,\n interaction: this,\n interactingBeforeMove: this.interacting(),\n };\n\n if (!duplicateMove) {\n // set pointer coordinate, time changes and speeds\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n }\n\n signals.fire('move', signalArg);\n\n if (!duplicateMove) {\n // if interacting, fire an 'action-move' signal etc\n if (this.interacting()) {\n this.doMove(signalArg);\n }\n\n if (this.pointerWasMoved) {\n utils.copyCoords(this.prevCoords, this.curCoords);\n }\n }\n }\n\n /*\\\n * Interaction.doMove\n [ method ]\n *\n * Force a move of the current action at the same coordinates. Useful if\n * snap/restrict has been changed and you want a movement with the new\n * settings.\n *\n **\n | interact(target)\n | .draggable(true)\n | .on('dragmove', function (event) {\n | if (someCondition) {\n | // change the snap settings\n | event.interactable.draggable({ snap: { targets: [] }});\n | // fire another move event with re-calculated snap\n | event.interaction.doMove();\n | }\n | });\n \\*/\n doMove (signalArg) {\n signalArg = utils.extend({\n pointer: this.pointers[0],\n event: this.prevEvent,\n eventTarget: this._eventTarget,\n interaction: this,\n }, signalArg || {});\n\n signals.fire('before-action-move', signalArg);\n\n if (!this._dontFireMove) {\n signals.fire('action-move', signalArg);\n }\n\n this._dontFireMove = false;\n }\n\n // End interact move events and stop auto-scroll unless simulation is running\n pointerUp (pointer, event, eventTarget, curEventTarget) {\n const pointerIndex = this.getPointerIndex(pointer);\n\n signals.fire(/cancel$/i.test(event.type)? 'cancel' : 'up', {\n pointer,\n pointerIndex,\n event,\n eventTarget,\n curEventTarget,\n interaction: this,\n });\n\n if (!this.simulation) {\n this.end(event);\n }\n\n this.pointerIsDown = false;\n this.removePointer(pointer, event);\n }\n\n /*\\\n * Interaction.end\n [ method ]\n *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n - event (PointerEvent) #optional\n **\n | interact(target)\n | .draggable(true)\n | .on('move', function (event) {\n | if (event.pageX > 1000) {\n | // end the current action\n | event.interaction.end();\n | // stop all further listeners from being called\n | event.stopImmediatePropagation();\n | }\n | });\n \\*/\n end (event) {\n event = event || this.prevEvent;\n\n if (this.interacting()) {\n signals.fire('action-end', {\n event,\n interaction: this,\n });\n }\n\n this.stop();\n }\n\n currentAction () {\n return this._interacting? this.prepared.name: null;\n }\n\n interacting () {\n return this._interacting;\n }\n\n stop () {\n signals.fire('stop', { interaction: this });\n\n if (this._interacting) {\n signals.fire('stop-active', { interaction: this });\n signals.fire('stop-' + this.prepared.name, { interaction: this });\n }\n\n this.target = this.element = null;\n\n this._interacting = false;\n this.prepared.name = this.prevEvent = null;\n }\n\n getPointerIndex (pointer) {\n return utils.indexOf(this.pointerIds, utils.getPointerId(pointer));\n }\n\n updatePointer (pointer, event, down = event && /(down|start)$/i.test(event.type)) {\n const id = utils.getPointerId(pointer);\n let index = this.getPointerIndex(pointer);\n\n if (index === -1) {\n index = this.pointerIds.length;\n this.pointerIds[index] = id;\n }\n\n if (down) {\n signals.fire('update-pointer-down', {\n pointer,\n event,\n down,\n pointerId: id,\n pointerIndex: index,\n interaction: this,\n });\n }\n\n this.pointers[index] = pointer;\n\n return index;\n }\n\n removePointer (pointer, event) {\n const id = utils.getPointerId(pointer);\n const index = this.mouse? 0 : utils.indexOf(this.pointerIds, id);\n\n if (index === -1) { return; }\n\n signals.fire('remove-pointer', {\n pointer,\n event,\n pointerIndex: index,\n interaction: this,\n });\n\n this.pointers .splice(index, 1);\n this.pointerIds .splice(index, 1);\n this.downTargets.splice(index, 1);\n this.downTimes .splice(index, 1);\n }\n\n _updateEventTargets (target, currentTarget) {\n this._eventTarget = target;\n this._curEventTarget = currentTarget;\n }\n}\n\nfor (let i = 0, len = methodNames.length; i < len; i++) {\n const method = methodNames[i];\n\n listeners[method] = doOnInteractions(method);\n}\n\nfunction doOnInteractions (method) {\n return (function (event) {\n const [eventTarget, curEventTarget] = utils.getEventTargets(event);\n const matches = []; // [ [pointer, interaction], ...]\n\n if (browser.supportsTouch && /touch/.test(event.type)) {\n prevTouchTime = new Date().getTime();\n\n for (let i = 0; i < event.changedTouches.length; i++) {\n const pointer = event.changedTouches[i];\n const interaction = finder.search(pointer, event.type, eventTarget);\n\n matches.push([pointer, interaction || new Interaction()]);\n }\n }\n else {\n let invalidPointer = false;\n\n if (!browser.supportsPointerEvent && /mouse/.test(event.type)) {\n // ignore mouse events while touch interactions are active\n for (let i = 0; i < scope.interactions.length && !invalidPointer; i++) {\n invalidPointer = !scope.interactions[i].mouse && scope.interactions[i].pointerIsDown;\n }\n\n // try to ignore mouse events that are simulated by the browser\n // after a touch event\n invalidPointer = invalidPointer\n || (new Date().getTime() - prevTouchTime < 500)\n // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated\n || event.timeStamp === 0;\n }\n\n if (!invalidPointer) {\n let interaction = finder.search(event, event.type, eventTarget);\n\n if (!interaction) {\n\n interaction = new Interaction();\n interaction.mouse = (/mouse/i.test(event.pointerType || event.type)\n // MSPointerEvent.MSPOINTER_TYPE_MOUSE\n || event.pointerType === 4\n || !event.pointerType);\n }\n\n matches.push([event, interaction]);\n }\n }\n\n for (const [pointer, interaction] of matches) {\n interaction._updateEventTargets(eventTarget, curEventTarget);\n interaction[method](pointer, event, eventTarget, curEventTarget);\n }\n });\n}\n\nfunction endAll (event) {\n for (let i = 0; i < scope.interactions.length; i++) {\n const interaction = scope.interactions[i];\n\n interaction.end(event);\n signals.fire('endall', { event, interaction });\n }\n}\n\nconst docEvents = { /* 'eventType': listenerFunc */ };\nconst pEventTypes = browser.pEventTypes;\n\nif (scope.PointerEvent) {\n docEvents[pEventTypes.down ] = listeners.pointerDown;\n docEvents[pEventTypes.move ] = listeners.pointerMove;\n docEvents[pEventTypes.up ] = listeners.pointerUp;\n docEvents[pEventTypes.cancel] = listeners.pointerUp;\n}\nelse {\n docEvents.mousedown = listeners.pointerDown;\n docEvents.mousemove = listeners.pointerMove;\n docEvents.mouseup = listeners.pointerUp;\n\n docEvents.touchstart = listeners.pointerDown;\n docEvents.touchmove = listeners.pointerMove;\n docEvents.touchend = listeners.pointerUp;\n docEvents.touchcancel = listeners.pointerUp;\n}\n\ndocEvents.blur = endAll;\n\nfunction onDocSignal ({ doc }, signalName) {\n const eventMethod = signalName.indexOf('add') === 0\n ? events.add : events.remove;\n\n // delegate event listener\n for (const eventType in scope.delegatedEvents) {\n eventMethod(doc, eventType, events.delegateListener);\n eventMethod(doc, eventType, events.delegateUseCapture, true);\n }\n\n for (const eventType in docEvents) {\n eventMethod(doc, eventType, docEvents[eventType]);\n }\n}\n\nsignals.on('update-pointer-down', ({ interaction, pointer, pointerId, pointerIndex, event, eventTarget, down }) => {\n interaction.pointerIds[pointerIndex] = pointerId;\n interaction.pointers[pointerIndex] = pointer;\n\n if (down) {\n interaction.pointerIsDown = true;\n }\n\n if (!interaction.interacting()) {\n utils.setCoords(interaction.startCoords, interaction.pointers);\n\n utils.copyCoords(interaction.curCoords , interaction.startCoords);\n utils.copyCoords(interaction.prevCoords, interaction.startCoords);\n\n interaction.downEvent = event;\n interaction.downTimes[pointerIndex] = interaction.curCoords.timeStamp;\n interaction.downTargets[pointerIndex] = eventTarget || event && utils.getEventTargets(event)[0];\n interaction.pointerWasMoved = false;\n\n utils.pointerExtend(interaction.downPointer, pointer);\n }\n});\n\nscope.signals.on('add-document' , onDocSignal);\nscope.signals.on('remove-document', onDocSignal);\n\nInteraction.pointerMoveTolerance = 1;\nInteraction.doOnInteractions = doOnInteractions;\nInteraction.endAll = endAll;\nInteraction.signals = signals;\nInteraction.docEvents = docEvents;\n\nscope.endAllInteractions = endAll;\n\nmodule.exports = Interaction;\n","const Interaction = require('../Interaction');\nconst InteractEvent = require('../InteractEvent');\n\nconst actions = {\n firePrepared,\n names: [],\n methodDict: {},\n};\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n interaction._interacting = true;\n firePrepared(interaction, event, 'start');\n});\n\nInteraction.signals.on('action-move', function ({ interaction, event, preEnd }) {\n firePrepared(interaction, event, 'move', preEnd);\n\n // if the action was ended in a listener\n if (!interaction.interacting()) { return false; }\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n firePrepared(interaction, event, 'end');\n});\n\nfunction firePrepared (interaction, event, phase, preEnd) {\n const actionName = interaction.prepared.name;\n\n const newEvent = new InteractEvent(interaction, event, actionName, phase, interaction.element, null, preEnd);\n\n interaction.target.fire(newEvent);\n interaction.prevEvent = newEvent;\n}\n\nmodule.exports = actions;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drag = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n startAxis : 'xy',\n lockAxis : 'xy',\n },\n\n checker: function (pointer, event, interactable) {\n const dragOptions = interactable.options.drag;\n\n return dragOptions.enabled\n ? { name: 'drag', axis: (dragOptions.lockAxis === 'start'\n ? dragOptions.startAxis\n : dragOptions.lockAxis)}\n : null;\n },\n\n getCursor: function () {\n return 'move';\n },\n};\n\nInteraction.signals.on('before-action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n interaction.curCoords.page.y = interaction.startCoords.page.y;\n interaction.curCoords.client.y = interaction.startCoords.client.y;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vx);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vx);\n interaction.pointerDelta.client.vy = 0;\n interaction.pointerDelta.page.vy = 0;\n }\n else if (axis === 'y') {\n interaction.curCoords.page.x = interaction.startCoords.page.x;\n interaction.curCoords.client.x = interaction.startCoords.client.x;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vy);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vy);\n interaction.pointerDelta.client.vx = 0;\n interaction.pointerDelta.page.vx = 0;\n }\n});\n\n// dragmove\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'dragmove') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n iEvent.pageY = interaction.startCoords.page.y;\n iEvent.clientY = interaction.startCoords.client.y;\n iEvent.dy = 0;\n }\n else if (axis === 'y') {\n iEvent.pageX = interaction.startCoords.page.x;\n iEvent.clientX = interaction.startCoords.client.x;\n iEvent.dx = 0;\n }\n});\n\n/*\\\n * Interactable.draggable\n [ method ]\n *\n * Gets or sets whether drag actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of drag events\n | var isDraggable = interact('ul li').draggable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on drag events (object makes the Interactable draggable)\n = (object) This Interactable\n | interact(element).draggable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // the axis in which the first movement must be\n | // for the drag sequence to start\n | // 'xy' by default - any direction\n | startAxis: 'x' || 'y' || 'xy',\n |\n | // 'xy' by default - don't restrict to one axis (move in any direction)\n | // 'x' or 'y' to restrict movement to either axis\n | // 'start' to restrict movement to the axis the drag started in\n | lockAxis: 'x' || 'y' || 'xy' || 'start',\n |\n | // max number of drags that can happen concurrently\n | // with elements of this Interactable. Infinity by default\n | max: Infinity,\n |\n | // max number of drags that can target the same element+Interactable\n | // 1 by default\n | maxPerElement: 2\n | });\n\\*/\nInteractable.prototype.draggable = function (options) {\n if (utils.is.object(options)) {\n this.options.drag.enabled = options.enabled === false? false: true;\n this.setPerAction('drag', options);\n this.setOnEvents('drag', options);\n\n if (/^(xy|x|y|start)$/.test(options.lockAxis)) {\n this.options.drag.lockAxis = options.lockAxis;\n }\n if (/^(xy|x|y)$/.test(options.startAxis)) {\n this.options.drag.startAxis = options.startAxis;\n }\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drag.enabled = options;\n\n if (!options) {\n this.ondragstart = this.ondragstart = this.ondragend = null;\n }\n\n return this;\n }\n\n return this.options.drag;\n};\n\nactions.drag = drag;\nactions.names.push('drag');\nutils.merge(Interactable.eventTypes, [\n 'dragstart',\n 'dragmove',\n 'draginertiastart',\n 'draginertiaresume',\n 'dragend',\n]);\nactions.methodDict.drag = 'draggable';\n\ndefaultOptions.drag = drag.defaults;\n\nmodule.exports = drag;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst scope = require('../scope');\nconst interact = require('../interact');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drop = {\n defaults: {\n enabled: false,\n accept : null,\n overlap: 'pointer',\n },\n};\n\nlet dynamicDrop = false;\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // reset active dropzones\n interaction.activeDrops.dropzones = [];\n interaction.activeDrops.elements = [];\n interaction.activeDrops.rects = [];\n\n interaction.dropEvents = null;\n\n if (!interaction.dynamicDrop) {\n setActiveDrops(interaction, interaction.element);\n }\n\n const dragEvent = interaction.prevEvent;\n const dropEvents = getDropEvents(interaction, event, dragEvent);\n\n if (dropEvents.activate) {\n fireActiveDrops(interaction, dropEvents.activate);\n }\n});\n\nInteractEvent.signals.on('new', function ({ interaction, iEvent, event }) {\n if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { return; }\n\n const draggableElement = interaction.element;\n const dragEvent = iEvent;\n const dropResult = getDrop(dragEvent, event, draggableElement);\n\n interaction.dropTarget = dropResult.dropzone;\n interaction.dropElement = dropResult.element;\n\n interaction.dropEvents = getDropEvents(interaction, event, dragEvent);\n});\n\nInteraction.signals.on('action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n fireDropEvents(interaction, interaction.dropEvents);\n});\n\nInteraction.signals.on('action-end', function ({ interaction }) {\n if (interaction.prepared.name === 'drag') {\n fireDropEvents(interaction, interaction.dropEvents);\n }\n});\n\nInteraction.signals.on('stop-drag', function ({ interaction }) {\n interaction.activeDrops.dropzones =\n interaction.activeDrops.elements =\n interaction.activeDrops.rects =\n interaction.dropEvents = null;\n});\n\nfunction collectDrops (interaction, element) {\n const drops = [];\n const elements = [];\n\n element = element || interaction.element;\n\n // collect all dropzones and their elements which qualify for a drop\n for (const current of scope.interactables) {\n if (!current.options.drop.enabled) { continue; }\n\n const accept = current.options.drop.accept;\n\n // test the draggable element against the dropzone's accept setting\n if ((utils.is.element(accept) && accept !== element)\n || (utils.is.string(accept)\n && !utils.matchesSelector(element, accept))) {\n\n continue;\n }\n\n // query for new elements if necessary\n const dropElements = utils.is.string(current.target)\n ? current._context.querySelectorAll(current.target)\n : [current.target];\n\n for (let i = 0; i < dropElements.length; i++) {\n const currentElement = dropElements[i];\n\n if (currentElement !== element) {\n drops.push(current);\n elements.push(currentElement);\n }\n }\n }\n\n return {\n elements,\n dropzones: drops,\n };\n}\n\nfunction fireActiveDrops (interaction, event) {\n let prevElement;\n\n // loop through all active dropzones and trigger event\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n const current = interaction.activeDrops.dropzones[i];\n const currentElement = interaction.activeDrops.elements [i];\n\n // prevent trigger of duplicate events on same element\n if (currentElement !== prevElement) {\n // set current element as event target\n event.target = currentElement;\n current.fire(event);\n }\n prevElement = currentElement;\n }\n}\n\n// Collect a new set of possible drops and save them in activeDrops.\n// setActiveDrops should always be called when a drag has just started or a\n// drag event happens while dynamicDrop is true\nfunction setActiveDrops (interaction, dragElement) {\n // get dropzones and their elements that could receive the draggable\n const possibleDrops = collectDrops(interaction, dragElement, true);\n\n interaction.activeDrops.dropzones = possibleDrops.dropzones;\n interaction.activeDrops.elements = possibleDrops.elements;\n interaction.activeDrops.rects = [];\n\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n interaction.activeDrops.rects[i] =\n interaction.activeDrops.dropzones[i].getRect(interaction.activeDrops.elements[i]);\n }\n}\n\nfunction getDrop (dragEvent, event, dragElement) {\n const interaction = dragEvent.interaction;\n const validDrops = [];\n\n if (dynamicDrop) {\n setActiveDrops(interaction, dragElement);\n }\n\n // collect all dropzones and their elements which qualify for a drop\n for (let j = 0; j < interaction.activeDrops.dropzones.length; j++) {\n const current = interaction.activeDrops.dropzones[j];\n const currentElement = interaction.activeDrops.elements [j];\n const rect = interaction.activeDrops.rects [j];\n\n validDrops.push(current.dropCheck(dragEvent, event, interaction.target, dragElement, currentElement, rect)\n ? currentElement\n : null);\n }\n\n // get the most appropriate dropzone based on DOM depth and order\n const dropIndex = utils.indexOfDeepestElement(validDrops);\n\n return {\n dropzone: interaction.activeDrops.dropzones[dropIndex] || null,\n element : interaction.activeDrops.elements [dropIndex] || null,\n };\n}\n\nfunction getDropEvents (interaction, pointerEvent, dragEvent) {\n const dropEvents = {\n enter : null,\n leave : null,\n activate : null,\n deactivate: null,\n move : null,\n drop : null,\n };\n\n const tmpl = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n };\n\n if (interaction.dropElement !== interaction.prevDropElement) {\n // if there was a prevDropTarget, create a dragleave event\n if (interaction.prevDropTarget) {\n dropEvents.leave = utils.extend({ type: 'dragleave' }, tmpl);\n\n dragEvent.dragLeave = dropEvents.leave.target = interaction.prevDropElement;\n dragEvent.prevDropzone = dropEvents.leave.dropzone = interaction.prevDropTarget;\n }\n // if the dropTarget is not null, create a dragenter event\n if (interaction.dropTarget) {\n dropEvents.enter = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n type : 'dragenter',\n };\n\n dragEvent.dragEnter = interaction.dropElement;\n dragEvent.dropzone = interaction.dropTarget;\n }\n }\n\n if (dragEvent.type === 'dragend' && interaction.dropTarget) {\n dropEvents.drop = utils.extend({ type: 'drop' }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n dragEvent.relatedTarget = interaction.dropElement;\n }\n if (dragEvent.type === 'dragstart') {\n dropEvents.activate = utils.extend({ type: 'dropactivate' }, tmpl);\n\n dropEvents.activate.target = null;\n dropEvents.activate.dropzone = null;\n }\n if (dragEvent.type === 'dragend') {\n dropEvents.deactivate = utils.extend({ type: 'dropdeactivate' }, tmpl);\n\n dropEvents.deactivate.target = null;\n dropEvents.deactivate.dropzone = null;\n }\n if (dragEvent.type === 'dragmove' && interaction.dropTarget) {\n dropEvents.move = utils.extend({\n dragmove : dragEvent,\n type : 'dropmove',\n }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n }\n\n return dropEvents;\n}\n\nfunction fireDropEvents (interaction, dropEvents) {\n if (dropEvents.leave) { interaction.prevDropTarget.fire(dropEvents.leave); }\n if (dropEvents.move ) { interaction.dropTarget.fire(dropEvents.move ); }\n if (dropEvents.enter) { interaction.dropTarget.fire(dropEvents.enter); }\n if (dropEvents.drop ) { interaction.dropTarget.fire(dropEvents.drop ); }\n if (dropEvents.deactivate) {\n fireActiveDrops(interaction, dropEvents.deactivate);\n }\n\n interaction.prevDropTarget = interaction.dropTarget;\n interaction.prevDropElement = interaction.dropElement;\n}\n\n/*\\\n * Interactable.dropzone\n [ method ]\n *\n * Returns or sets whether elements can be dropped onto this\n * Interactable to trigger drop events\n *\n * Dropzones can receive the following events:\n * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends\n * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone\n * - `dragmove` when a draggable that has entered the dropzone is moved\n * - `drop` when a draggable is dropped into this dropzone\n *\n * Use the `accept` option to allow only elements that match the given CSS\n * selector or element. The value can be:\n *\n * - **an Element** - only that element can be dropped into this dropzone.\n * - **a string**, - the element being dragged must match it as a CSS selector.\n * - **`null`** - accept options is cleared - it accepts any element.\n *\n * Use the `overlap` option to set how drops are checked for. The allowed\n * values are:\n *\n * - `'pointer'`, the pointer must be over the dropzone (default)\n * - `'center'`, the draggable element's center must be over the dropzone\n * - a number from 0-1 which is the `(intersection area) / (draggable area)`.\n * e.g. `0.5` for drop to happen when half of the area of the draggable is\n * over the dropzone\n *\n * Use the `checker` option to specify a function to check if a dragged\n * element is over this Interactable.\n *\n | interact(target)\n | .dropChecker(function(dragEvent, // related dragmove or dragend event\n | event, // TouchEvent/PointerEvent/MouseEvent\n | dropped, // bool result of the default checker\n | dropzone, // dropzone Interactable\n | dropElement, // dropzone elemnt\n | draggable, // draggable Interactable\n | draggableElement) {// draggable element\n |\n | return dropped && event.target.hasAttribute('allow-drop');\n | }\n *\n *\n - options (boolean | object | null) #optional The new value to be set.\n | interact('.drop').dropzone({\n | accept: '.can-drop' || document.getElementById('single-drop'),\n | overlap: 'pointer' || 'center' || zeroToOne\n | }\n = (boolean | object) The current setting or this Interactable\n\\*/\nInteractable.prototype.dropzone = function (options) {\n if (utils.is.object(options)) {\n this.options.drop.enabled = options.enabled === false? false: true;\n\n if (utils.is.function(options.ondrop) ) { this.events.ondrop = options.ondrop ; }\n if (utils.is.function(options.ondropactivate) ) { this.events.ondropactivate = options.ondropactivate ; }\n if (utils.is.function(options.ondropdeactivate)) { this.events.ondropdeactivate = options.ondropdeactivate; }\n if (utils.is.function(options.ondragenter) ) { this.events.ondragenter = options.ondragenter ; }\n if (utils.is.function(options.ondragleave) ) { this.events.ondragleave = options.ondragleave ; }\n if (utils.is.function(options.ondropmove) ) { this.events.ondropmove = options.ondropmove ; }\n\n if (/^(pointer|center)$/.test(options.overlap)) {\n this.options.drop.overlap = options.overlap;\n }\n else if (utils.is.number(options.overlap)) {\n this.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0);\n }\n if ('accept' in options) {\n this.options.drop.accept = options.accept;\n }\n if ('checker' in options) {\n this.options.drop.checker = options.checker;\n }\n\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drop.enabled = options;\n\n if (!options) {\n this.ondragenter = this.ondragleave = this.ondrop\n = this.ondropactivate = this.ondropdeactivate = null;\n }\n\n return this;\n }\n\n return this.options.drop;\n};\n\nInteractable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) {\n let dropped = false;\n\n // if the dropzone has no rect (eg. display: none)\n // call the custom dropChecker or just return false\n if (!(rect = rect || this.getRect(dropElement))) {\n return (this.options.drop.checker\n ? this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement)\n : false);\n }\n\n const dropOverlap = this.options.drop.overlap;\n\n if (dropOverlap === 'pointer') {\n const origin = utils.getOriginXY(draggable, draggableElement, 'drag');\n const page = utils.getPageXY(dragEvent);\n\n page.x += origin.x;\n page.y += origin.y;\n\n const horizontal = (page.x > rect.left) && (page.x < rect.right);\n const vertical = (page.y > rect.top ) && (page.y < rect.bottom);\n\n dropped = horizontal && vertical;\n }\n\n const dragRect = draggable.getRect(draggableElement);\n\n if (dragRect && dropOverlap === 'center') {\n const cx = dragRect.left + dragRect.width / 2;\n const cy = dragRect.top + dragRect.height / 2;\n\n dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom;\n }\n\n if (dragRect && utils.is.number(dropOverlap)) {\n const overlapArea = (Math.max(0, Math.min(rect.right , dragRect.right ) - Math.max(rect.left, dragRect.left))\n * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top , dragRect.top )));\n\n const overlapRatio = overlapArea / (dragRect.width * dragRect.height);\n\n dropped = overlapRatio >= dropOverlap;\n }\n\n if (this.options.drop.checker) {\n dropped = this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement);\n }\n\n return dropped;\n};\n\nInteractable.signals.on('unset', function ({ interactable }) {\n interactable.dropzone(false);\n});\n\nInteractable.settingsMethods.push('dropChecker');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.dropTarget = null; // the dropzone a drag target might be dropped into\n interaction.dropElement = null; // the element at the time of checking\n interaction.prevDropTarget = null; // the dropzone that was recently dragged away from\n interaction.prevDropElement = null; // the element at the time of checking\n interaction.dropEvents = null; // the dropEvents related to the current drag event\n\n interaction.activeDrops = {\n dropzones: [], // the dropzones that are mentioned below\n elements : [], // elements of dropzones that accept the target draggable\n rects : [], // the rects of the elements mentioned above\n };\n\n});\n\nInteraction.signals.on('stop', function ({ interaction }) {\n interaction.dropTarget = interaction.dropElement =\n interaction.prevDropTarget = interaction.prevDropElement = null;\n});\n\n/*\\\n * interact.dynamicDrop\n [ method ]\n *\n * Returns or sets whether the dimensions of dropzone elements are\n * calculated on every dragmove or only on dragstart for the default\n * dropChecker\n *\n - newValue (boolean) #optional True to check on each move. False to check only before start\n = (boolean | interact) The current setting or interact\n\\*/\ninteract.dynamicDrop = function (newValue) {\n if (utils.is.bool(newValue)) {\n //if (dragging && dynamicDrop !== newValue && !newValue) {\n //calcRects(dropzones);\n //}\n\n dynamicDrop = newValue;\n\n return interact;\n }\n return dynamicDrop;\n};\n\nutils.merge(Interactable.eventTypes, [\n 'dragenter',\n 'dragleave',\n 'dropactivate',\n 'dropdeactivate',\n 'dropmove',\n 'drop',\n]);\nactions.methodDict.drop = 'dropzone';\n\ndefaultOptions.drop = drop.defaults;\n\nmodule.exports = drop;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst gesture = {\n defaults: {\n enabled : false,\n origin : null,\n restrict: null,\n },\n\n checker: function (pointer, event, interactable, element, interaction) {\n if (interaction.pointerIds.length >= 2) {\n return { name: 'gesture' };\n }\n\n return null;\n },\n\n getCursor: function () {\n return '';\n },\n};\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturestart') { return; }\n iEvent.ds = 0;\n\n interaction.gesture.startDistance = interaction.gesture.prevDistance = iEvent.distance;\n interaction.gesture.startAngle = interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.scale = 1;\n});\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturemove') { return; }\n\n iEvent.ds = iEvent.scale - interaction.gesture.scale;\n\n interaction.target.fire(iEvent);\n\n interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.prevDistance = iEvent.distance;\n\n if (iEvent.scale !== Infinity\n && iEvent.scale !== null\n && iEvent.scale !== undefined\n && !isNaN(iEvent.scale)) {\n\n interaction.gesture.scale = iEvent.scale;\n }\n});\n\n/*\\\n * Interactable.gesturable\n [ method ]\n *\n * Gets or sets whether multitouch gestures can be performed on the\n * Interactable's element\n *\n = (boolean) Indicates if this can be the target of gesture events\n | var isGestureable = interact(element).gesturable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on gesture events (makes the Interactable gesturable)\n = (object) this Interactable\n | interact(element).gesturable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // limit multiple gestures.\n | // See the explanation in @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n\\*/\nInteractable.prototype.gesturable = function (options) {\n if (utils.is.object(options)) {\n this.options.gesture.enabled = options.enabled === false? false: true;\n this.setPerAction('gesture', options);\n this.setOnEvents('gesture', options);\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.gesture.enabled = options;\n\n if (!options) {\n this.ongesturestart = this.ongesturestart = this.ongestureend = null;\n }\n\n return this;\n }\n\n return this.options.gesture;\n};\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action, event, starting, ending, deltaSource }) {\n if (action !== 'gesture') { return; }\n\n const pointers = interaction.pointers;\n\n iEvent.touches = [pointers[0], pointers[1]];\n\n if (starting) {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = 1;\n iEvent.ds = 0;\n iEvent.angle = utils.touchAngle(pointers, undefined, deltaSource);\n iEvent.da = 0;\n }\n else if (ending || event instanceof InteractEvent) {\n iEvent.distance = interaction.prevEvent.distance;\n iEvent.box = interaction.prevEvent.box;\n iEvent.scale = interaction.prevEvent.scale;\n iEvent.ds = iEvent.scale - 1;\n iEvent.angle = interaction.prevEvent.angle;\n iEvent.da = iEvent.angle - interaction.gesture.startAngle;\n }\n else {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = iEvent.distance / interaction.gesture.startDistance;\n iEvent.angle = utils.touchAngle(pointers, interaction.gesture.prevAngle, deltaSource);\n\n iEvent.ds = iEvent.scale - interaction.gesture.prevScale;\n iEvent.da = iEvent.angle - interaction.gesture.prevAngle;\n }\n});\n\nInteraction.signals.on('new', function (interaction) {\n interaction.gesture = {\n start: { x: 0, y: 0 },\n\n startDistance: 0, // distance between two touches of touchStart\n prevDistance : 0,\n distance : 0,\n\n scale: 1, // gesture.distance / gesture.startDistance\n\n startAngle: 0, // angle of line joining two touches\n prevAngle : 0, // angle of the previous gesture event\n };\n});\n\nactions.gesture = gesture;\nactions.names.push('gesture');\nutils.merge(Interactable.eventTypes, [\n 'gesturestart',\n 'gesturemove',\n 'gestureend',\n]);\nactions.methodDict.gesture = 'gesturable';\n\ndefaultOptions.gesture = gesture.defaults;\n\nmodule.exports = gesture;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\n// Less Precision with touch input\nconst defaultMargin = browser.supportsTouch || browser.supportsPointerEvent? 20: 10;\n\nconst resize = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n square: false,\n preserveAspectRatio: false,\n axis: 'xy',\n\n // use default margin\n margin: NaN,\n\n // object with props left, right, top, bottom which are\n // true/false values to resize when the pointer is over that edge,\n // CSS selectors to match the handles for each direction\n // or the Elements for each handle\n edges: null,\n\n // a value of 'none' will limit the resize rect to a minimum of 0x0\n // 'negate' will alow the rect to have negative width/height\n // 'reposition' will keep the width/height positive by swapping\n // the top and bottom edges and/or swapping the left and right edges\n invert: 'none',\n },\n\n checker: function (pointer, event, interactable, element, interaction, rect) {\n if (!rect) { return null; }\n\n const page = utils.extend({}, interaction.curCoords.page);\n const options = interactable.options;\n\n if (options.resize.enabled) {\n const resizeOptions = options.resize;\n const resizeEdges = { left: false, right: false, top: false, bottom: false };\n\n // if using resize.edges\n if (utils.is.object(resizeOptions.edges)) {\n for (const edge in resizeEdges) {\n resizeEdges[edge] = checkResizeEdge(edge,\n resizeOptions.edges[edge],\n page,\n interaction._eventTarget,\n element,\n rect,\n resizeOptions.margin || defaultMargin);\n }\n\n resizeEdges.left = resizeEdges.left && !resizeEdges.right;\n resizeEdges.top = resizeEdges.top && !resizeEdges.bottom;\n\n if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) {\n return {\n name: 'resize',\n edges: resizeEdges,\n };\n }\n }\n else {\n const right = options.resize.axis !== 'y' && page.x > (rect.right - defaultMargin);\n const bottom = options.resize.axis !== 'x' && page.y > (rect.bottom - defaultMargin);\n\n if (right || bottom) {\n return {\n name: 'resize',\n axes: (right? 'x' : '') + (bottom? 'y' : ''),\n };\n }\n }\n }\n\n return null;\n },\n\n cursors: (browser.isIe9OrOlder ? {\n x : 'e-resize',\n y : 's-resize',\n xy: 'se-resize',\n\n top : 'n-resize',\n left : 'w-resize',\n bottom : 's-resize',\n right : 'e-resize',\n topleft : 'se-resize',\n bottomright: 'se-resize',\n topright : 'ne-resize',\n bottomleft : 'ne-resize',\n } : {\n x : 'ew-resize',\n y : 'ns-resize',\n xy: 'nwse-resize',\n\n top : 'ns-resize',\n left : 'ew-resize',\n bottom : 'ns-resize',\n right : 'ew-resize',\n topleft : 'nwse-resize',\n bottomright: 'nwse-resize',\n topright : 'nesw-resize',\n bottomleft : 'nesw-resize',\n }),\n\n getCursor: function (action) {\n if (action.axis) {\n return resize.cursors[action.name + action.axis];\n }\n else if (action.edges) {\n let cursorKey = '';\n const edgeNames = ['top', 'bottom', 'left', 'right'];\n\n for (let i = 0; i < 4; i++) {\n if (action.edges[edgeNames[i]]) {\n cursorKey += edgeNames[i];\n }\n }\n\n return resize.cursors[cursorKey];\n }\n },\n};\n\n// resizestart\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'resizestart' || !interaction.prepared.edges) {\n return;\n }\n\n const startRect = interaction.target.getRect(interaction.element);\n const resizeOptions = interaction.target.options.resize;\n\n /*\n * When using the `resizable.square` or `resizable.preserveAspectRatio` options, resizing from one edge\n * will affect another. E.g. with `resizable.square`, resizing to make the right edge larger will make\n * the bottom edge larger by the same amount. We call these 'linked' edges. Any linked edges will depend\n * on the active edges and the edge being interacted with.\n */\n if (resizeOptions.square || resizeOptions.preserveAspectRatio) {\n const linkedEdges = utils.extend({}, interaction.prepared.edges);\n\n linkedEdges.top = linkedEdges.top || (linkedEdges.left && !linkedEdges.bottom);\n linkedEdges.left = linkedEdges.left || (linkedEdges.top && !linkedEdges.right );\n linkedEdges.bottom = linkedEdges.bottom || (linkedEdges.right && !linkedEdges.top );\n linkedEdges.right = linkedEdges.right || (linkedEdges.bottom && !linkedEdges.left );\n\n interaction.prepared._linkedEdges = linkedEdges;\n }\n else {\n interaction.prepared._linkedEdges = null;\n }\n\n // if using `resizable.preserveAspectRatio` option, record aspect ratio at the start of the resize\n if (resizeOptions.preserveAspectRatio) {\n interaction.resizeStartAspectRatio = startRect.width / startRect.height;\n }\n\n interaction.resizeRects = {\n start : startRect,\n current : utils.extend({}, startRect),\n inverted : utils.extend({}, startRect),\n previous : utils.extend({}, startRect),\n delta : {\n left: 0, right : 0, width : 0,\n top : 0, bottom: 0, height: 0,\n },\n };\n\n iEvent.rect = interaction.resizeRects.inverted;\n iEvent.deltaRect = interaction.resizeRects.delta;\n});\n\n// resizemove\nInteractEvent.signals.on('new', function ({ iEvent, phase, interaction }) {\n if (phase !== 'move' || !interaction.prepared.edges) { return; }\n\n const resizeOptions = interaction.target.options.resize;\n const invert = resizeOptions.invert;\n const invertible = invert === 'reposition' || invert === 'negate';\n\n let edges = interaction.prepared.edges;\n\n const start = interaction.resizeRects.start;\n const current = interaction.resizeRects.current;\n const inverted = interaction.resizeRects.inverted;\n const delta = interaction.resizeRects.delta;\n const previous = utils.extend(interaction.resizeRects.previous, inverted);\n const originalEdges = edges;\n\n let dx = iEvent.dx;\n let dy = iEvent.dy;\n\n if (resizeOptions.preserveAspectRatio || resizeOptions.square) {\n // `resize.preserveAspectRatio` takes precedence over `resize.square`\n const startAspectRatio = resizeOptions.preserveAspectRatio\n ? interaction.resizeStartAspectRatio\n : 1;\n\n edges = interaction.prepared._linkedEdges;\n\n if ((originalEdges.left && originalEdges.bottom)\n || (originalEdges.right && originalEdges.top)) {\n dy = -dx / startAspectRatio;\n }\n else if (originalEdges.left || originalEdges.right ) { dy = dx / startAspectRatio; }\n else if (originalEdges.top || originalEdges.bottom) { dx = dy * startAspectRatio; }\n }\n\n // update the 'current' rect without modifications\n if (edges.top ) { current.top += dy; }\n if (edges.bottom) { current.bottom += dy; }\n if (edges.left ) { current.left += dx; }\n if (edges.right ) { current.right += dx; }\n\n if (invertible) {\n // if invertible, copy the current rect\n utils.extend(inverted, current);\n\n if (invert === 'reposition') {\n // swap edge values if necessary to keep width/height positive\n let swap;\n\n if (inverted.top > inverted.bottom) {\n swap = inverted.top;\n\n inverted.top = inverted.bottom;\n inverted.bottom = swap;\n }\n if (inverted.left > inverted.right) {\n swap = inverted.left;\n\n inverted.left = inverted.right;\n inverted.right = swap;\n }\n }\n }\n else {\n // if not invertible, restrict to minimum of 0x0 rect\n inverted.top = Math.min(current.top, start.bottom);\n inverted.bottom = Math.max(current.bottom, start.top);\n inverted.left = Math.min(current.left, start.right);\n inverted.right = Math.max(current.right, start.left);\n }\n\n inverted.width = inverted.right - inverted.left;\n inverted.height = inverted.bottom - inverted.top ;\n\n for (const edge in inverted) {\n delta[edge] = inverted[edge] - previous[edge];\n }\n\n iEvent.edges = interaction.prepared.edges;\n iEvent.rect = inverted;\n iEvent.deltaRect = delta;\n});\n\n/*\\\n * Interactable.resizable\n [ method ]\n *\n * Gets or sets whether resize actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of resize elements\n | var isResizeable = interact('input[type=text]').resizable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on resize events (object makes the Interactable resizable)\n = (object) This Interactable\n | interact(element).resizable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | edges: {\n | top : true, // Use pointer coords to check for resize.\n | left : false, // Disable resizing from left edge.\n | bottom: '.resize-s',// Resize if pointer target matches selector\n | right : handleEl // Resize if pointer target is the given Element\n | },\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height are adjusted at a 1:1 ratio.\n | square: false,\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height maintain the aspect ratio they had when resizing started.\n | preserveAspectRatio: false,\n |\n | // a value of 'none' will limit the resize rect to a minimum of 0x0\n | // 'negate' will allow the rect to have negative width/height\n | // 'reposition' will keep the width/height positive by swapping\n | // the top and bottom edges and/or swapping the left and right edges\n | invert: 'none' || 'negate' || 'reposition'\n |\n | // limit multiple resizes.\n | // See the explanation in the @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n \\*/\nInteractable.prototype.resizable = function (options) {\n if (utils.is.object(options)) {\n this.options.resize.enabled = options.enabled === false? false: true;\n this.setPerAction('resize', options);\n this.setOnEvents('resize', options);\n\n if (/^x$|^y$|^xy$/.test(options.axis)) {\n this.options.resize.axis = options.axis;\n }\n else if (options.axis === null) {\n this.options.resize.axis = defaultOptions.resize.axis;\n }\n\n if (utils.is.bool(options.preserveAspectRatio)) {\n this.options.resize.preserveAspectRatio = options.preserveAspectRatio;\n }\n else if (utils.is.bool(options.square)) {\n this.options.resize.square = options.square;\n }\n\n return this;\n }\n if (utils.is.bool(options)) {\n this.options.resize.enabled = options;\n\n if (!options) {\n this.onresizestart = this.onresizestart = this.onresizeend = null;\n }\n\n return this;\n }\n return this.options.resize;\n};\n\nfunction checkResizeEdge (name, value, page, element, interactableElement, rect, margin) {\n // false, '', undefined, null\n if (!value) { return false; }\n\n // true value, use pointer coords and element rect\n if (value === true) {\n // if dimensions are negative, \"switch\" edges\n const width = utils.is.number(rect.width )? rect.width : rect.right - rect.left;\n const height = utils.is.number(rect.height)? rect.height : rect.bottom - rect.top ;\n\n if (width < 0) {\n if (name === 'left' ) { name = 'right'; }\n else if (name === 'right') { name = 'left' ; }\n }\n if (height < 0) {\n if (name === 'top' ) { name = 'bottom'; }\n else if (name === 'bottom') { name = 'top' ; }\n }\n\n if (name === 'left' ) { return page.x < ((width >= 0? rect.left: rect.right ) + margin); }\n if (name === 'top' ) { return page.y < ((height >= 0? rect.top : rect.bottom) + margin); }\n\n if (name === 'right' ) { return page.x > ((width >= 0? rect.right : rect.left) - margin); }\n if (name === 'bottom') { return page.y > ((height >= 0? rect.bottom: rect.top ) - margin); }\n }\n\n // the remaining checks require an element\n if (!utils.is.element(element)) { return false; }\n\n return utils.is.element(value)\n // the value is an element to use as a resize handle\n ? value === element\n // otherwise check if element matches value as selector\n : utils.matchesUpTo(element, value, interactableElement);\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.resizeAxes = 'xy';\n});\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action }) {\n if (action !== 'resize' || !interaction.resizeAxes) { return; }\n\n const options = interaction.target.options;\n\n if (options.resize.square) {\n if (interaction.resizeAxes === 'y') {\n iEvent.dx = iEvent.dy;\n }\n else {\n iEvent.dy = iEvent.dx;\n }\n iEvent.axes = 'xy';\n }\n else {\n iEvent.axes = interaction.resizeAxes;\n\n if (interaction.resizeAxes === 'x') {\n iEvent.dy = 0;\n }\n else if (interaction.resizeAxes === 'y') {\n iEvent.dx = 0;\n }\n }\n});\n\nactions.resize = resize;\nactions.names.push('resize');\nutils.merge(Interactable.eventTypes, [\n 'resizestart',\n 'resizemove',\n 'resizeinertiastart',\n 'resizeinertiaresume',\n 'resizeend',\n]);\nactions.methodDict.resize = 'resizable';\n\ndefaultOptions.resize = resize.defaults;\n\nmodule.exports = resize;\n","const raf = require('./utils/raf');\nconst getWindow = require('./utils/window').getWindow;\nconst is = require('./utils/is');\nconst domUtils = require('./utils/domUtils');\nconst Interaction = require('./Interaction');\nconst defaultOptions = require('./defaultOptions');\n\nconst autoScroll = {\n defaults: {\n enabled : false,\n container: null, // the item that is scrolled (Window or HTMLElement)\n margin : 60,\n speed : 300, // the scroll speed in pixels per second\n },\n\n interaction: null,\n i: null, // the handle returned by window.setInterval\n x: 0, y: 0, // Direction each pulse is to scroll in\n\n isScrolling: false,\n prevTime: 0,\n\n start: function (interaction) {\n autoScroll.isScrolling = true;\n raf.cancel(autoScroll.i);\n\n autoScroll.interaction = interaction;\n autoScroll.prevTime = new Date().getTime();\n autoScroll.i = raf.request(autoScroll.scroll);\n },\n\n stop: function () {\n autoScroll.isScrolling = false;\n raf.cancel(autoScroll.i);\n },\n\n // scroll the window by the values in scroll.x/y\n scroll: function () {\n const options = autoScroll.interaction.target.options[autoScroll.interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(autoScroll.interaction.element);\n const now = new Date().getTime();\n // change in time in seconds\n const dt = (now - autoScroll.prevTime) / 1000;\n // displacement\n const s = options.speed * dt;\n\n if (s >= 1) {\n if (is.window(container)) {\n container.scrollBy(autoScroll.x * s, autoScroll.y * s);\n }\n else if (container) {\n container.scrollLeft += autoScroll.x * s;\n container.scrollTop += autoScroll.y * s;\n }\n\n autoScroll.prevTime = now;\n }\n\n if (autoScroll.isScrolling) {\n raf.cancel(autoScroll.i);\n autoScroll.i = raf.request(autoScroll.scroll);\n }\n },\n check: function (interactable, actionName) {\n const options = interactable.options;\n\n return options[actionName].autoScroll && options[actionName].autoScroll.enabled;\n },\n onInteractionMove: function ({ interaction, pointer }) {\n if (!(interaction.interacting()\n && autoScroll.check(interaction.target, interaction.prepared.name))) {\n return;\n }\n\n if (interaction.simulation) {\n autoScroll.x = autoScroll.y = 0;\n return;\n }\n\n let top;\n let right;\n let bottom;\n let left;\n\n const options = interaction.target.options[interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(interaction.element);\n\n if (is.window(container)) {\n left = pointer.clientX < autoScroll.margin;\n top = pointer.clientY < autoScroll.margin;\n right = pointer.clientX > container.innerWidth - autoScroll.margin;\n bottom = pointer.clientY > container.innerHeight - autoScroll.margin;\n }\n else {\n const rect = domUtils.getElementClientRect(container);\n\n left = pointer.clientX < rect.left + autoScroll.margin;\n top = pointer.clientY < rect.top + autoScroll.margin;\n right = pointer.clientX > rect.right - autoScroll.margin;\n bottom = pointer.clientY > rect.bottom - autoScroll.margin;\n }\n\n autoScroll.x = (right ? 1: left? -1: 0);\n autoScroll.y = (bottom? 1: top? -1: 0);\n\n if (!autoScroll.isScrolling) {\n // set the autoScroll properties to those of the target\n autoScroll.margin = options.margin;\n autoScroll.speed = options.speed;\n\n autoScroll.start(interaction);\n }\n },\n};\n\nInteraction.signals.on('stop-active', function () {\n autoScroll.stop();\n});\n\nInteraction.signals.on('action-move', autoScroll.onInteractionMove);\n\ndefaultOptions.perAction.autoScroll = autoScroll.defaults;\n\nmodule.exports = autoScroll;\n","const Interactable = require('../Interactable');\nconst actions = require('../actions/base');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.ignoreFrom\n [ method ]\n *\n * If the target of the `mousedown`, `pointerdown` or `touchstart`\n * event or any of it's parents match the given CSS selector or\n * Element, no drag/resize/gesture is started.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to not ignore any elements\n = (string | Element | object) The current ignoreFrom value or this Interactable\n **\n | interact(element, { ignoreFrom: document.getElementById('no-action') });\n | // or\n | interact(element).ignoreFrom('input, textarea, a');\n\\*/\nInteractable.prototype.ignoreFrom = function (newValue) {\n return this._backCompatOption('ignoreFrom', newValue);\n};\n\n/*\\\n * Interactable.allowFrom\n [ method ]\n *\n * A drag/resize/gesture is started only If the target of the\n * `mousedown`, `pointerdown` or `touchstart` event or any of it's\n * parents match the given CSS selector or Element.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to allow from any element\n = (string | Element | object) The current allowFrom value or this Interactable\n **\n | interact(element, { allowFrom: document.getElementById('drag-handle') });\n | // or\n | interact(element).allowFrom('.handle');\n\\*/\nInteractable.prototype.allowFrom = function (newValue) {\n return this._backCompatOption('allowFrom', newValue);\n};\n\nInteractable.prototype.testIgnore = function (ignoreFrom, interactableElement, element) {\n if (!ignoreFrom || !is.element(element)) { return false; }\n\n if (is.string(ignoreFrom)) {\n return domUtils.matchesUpTo(element, ignoreFrom, interactableElement);\n }\n else if (is.element(ignoreFrom)) {\n return domUtils.nodeContains(ignoreFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testAllow = function (allowFrom, interactableElement, element) {\n if (!allowFrom) { return true; }\n\n if (!is.element(element)) { return false; }\n\n if (is.string(allowFrom)) {\n return domUtils.matchesUpTo(element, allowFrom, interactableElement);\n }\n else if (is.element(allowFrom)) {\n return domUtils.nodeContains(allowFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testIgnoreAllow = function (options, interactableElement, eventTarget) {\n return (!this.testIgnore(options.ignoreFrom, interactableElement, eventTarget)\n && this.testAllow(options.allowFrom, interactableElement, eventTarget));\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (event.buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\n","const interact = require('../interact');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst actions = require('../actions/base');\nconst defaultOptions = require('../defaultOptions');\nconst browser = require('../utils/browser');\nconst scope = require('../scope');\nconst utils = require('../utils');\nconst signals = require('../utils/Signals').new();\n\nrequire('./InteractableMethods');\n\nconst autoStart = {\n signals,\n withinInteractionLimit,\n // Allow this many interactions to happen simultaneously\n maxInteractions: Infinity,\n defaults: {\n perAction: {\n manualStart: false,\n max: Infinity,\n maxPerElement: 1,\n allowFrom: null,\n ignoreFrom: null,\n },\n },\n setActionDefaults: function (action) {\n utils.extend(action.defaults, autoStart.defaults.perAction);\n },\n};\n\n// set cursor style on mousedown\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget }) {\n if (interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\n// set cursor style on mousemove\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget }) {\n if (!interaction.mouse\n || interaction.pointerIsDown\n || interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\nInteraction.signals.on('move', function (arg) {\n const { interaction, event } = arg;\n\n if (!interaction.pointerIsDown\n || interaction.interacting()\n || !interaction.pointerWasMoved\n || !interaction.prepared.name) {\n return;\n }\n\n signals.fire('before-start', arg);\n\n const target = interaction.target;\n\n if (interaction.prepared.name && target) {\n // check manualStart and interaction limit\n if (target.options[interaction.prepared.name].manualStart\n || !withinInteractionLimit(target, interaction.element, interaction.prepared)) {\n interaction.stop(event);\n }\n else {\n interaction.start(interaction.prepared, target, interaction.element);\n }\n }\n});\n\n// Check if the current target supports the action.\n// If so, return the validated action. Otherwise, return null\nfunction validateAction (action, interactable, element, eventTarget) {\n if (utils.is.object(action)\n && interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget)\n && interactable.options[action.name].enabled\n && withinInteractionLimit(interactable, element, action)) {\n return action;\n }\n\n return null;\n}\n\nfunction validateSelector (interaction, pointer, event, matches, matchElements, eventTarget) {\n for (let i = 0, len = matches.length; i < len; i++) {\n const match = matches[i];\n const matchElement = matchElements[i];\n const action = validateAction(match.getAction(pointer, event, interaction, matchElement),\n match,\n matchElement,\n eventTarget);\n\n if (action) {\n return {\n action,\n target: match,\n element: matchElement,\n };\n }\n }\n\n return {};\n}\n\nfunction getActionInfo (interaction, pointer, event, eventTarget) {\n let matches = [];\n let matchElements = [];\n\n let element = eventTarget;\n let action = null;\n\n function pushMatches (interactable, selector, context) {\n const elements = (browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined);\n\n if (utils.matchesSelector(element, selector, elements)) {\n\n matches.push(interactable);\n matchElements.push(element);\n }\n }\n\n while (utils.is.element(element)) {\n matches = [];\n matchElements = [];\n\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && (action = validateAction(elementInteractable.getAction(pointer, event, interaction, element, eventTarget),\n elementInteractable,\n element,\n eventTarget))\n && !elementInteractable.options[action.name].manualStart) {\n return {\n element,\n action,\n target: elementInteractable,\n };\n }\n else {\n scope.interactables.forEachSelector(pushMatches, element);\n\n const actionInfo = validateSelector(interaction, pointer, event, matches, matchElements, eventTarget);\n\n if (actionInfo.action\n && !actionInfo.target.options[actionInfo.action.name].manualStart) {\n return actionInfo;\n }\n }\n\n element = utils.parentNode(element);\n }\n\n return {};\n}\n\nfunction prepare (interaction, { action, target, element }) {\n action = action || {};\n\n if (interaction.target && interaction.target.options.styleCursor) {\n interaction.target._doc.documentElement.style.cursor = '';\n }\n\n interaction.target = target;\n interaction.element = element;\n utils.copyAction(interaction.prepared, action);\n\n if (target && target.options.styleCursor) {\n const cursor = action? actions[action.name].getCursor(action) : '';\n interaction.target._doc.documentElement.style.cursor = cursor;\n }\n\n signals.fire('prepared', { interaction: interaction });\n}\n\nInteraction.signals.on('stop', function ({ interaction }) {\n const target = interaction.target;\n\n if (target && target.options.styleCursor) {\n target._doc.documentElement.style.cursor = '';\n }\n});\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (utils.is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (utils.is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n const buttons = event.buttons || ({\n 0: 1,\n 1: 4,\n 3: 8,\n 4: 16,\n })[event.button];\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\nfunction withinInteractionLimit (interactable, element, action) {\n const options = interactable.options;\n const maxActions = options[action.name].max;\n const maxPerElement = options[action.name].maxPerElement;\n let activeInteractions = 0;\n let targetCount = 0;\n let targetElementCount = 0;\n\n // no actions if any of these values == 0\n if (!(maxActions && maxPerElement && autoStart.maxInteractions)) { return; }\n\n for (let i = 0, len = scope.interactions.length; i < len; i++) {\n const interaction = scope.interactions[i];\n const otherAction = interaction.prepared.name;\n\n if (!interaction.interacting()) { continue; }\n\n activeInteractions++;\n\n if (activeInteractions >= autoStart.maxInteractions) {\n return false;\n }\n\n if (interaction.target !== interactable) { continue; }\n\n targetCount += (otherAction === action.name)|0;\n\n if (targetCount >= maxActions) {\n return false;\n }\n\n if (interaction.element === element) {\n targetElementCount++;\n\n if (otherAction !== action.name || targetElementCount >= maxPerElement) {\n return false;\n }\n }\n }\n\n return autoStart.maxInteractions > 0;\n}\n\n/*\\\n * interact.maxInteractions\n [ method ]\n **\n * Returns or sets the maximum number of concurrent interactions allowed.\n * By default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables\n * and elements, you need to enable it in the draggable, resizable and\n * gesturable `'max'` and `'maxPerElement'` options.\n **\n - newValue (number) #optional Any number. newValue <= 0 means no interactions.\n\\*/\ninteract.maxInteractions = function (newValue) {\n if (utils.is.number(newValue)) {\n autoStart.maxInteractions = newValue;\n\n return this;\n }\n\n return autoStart.maxInteractions;\n};\n\nInteractable.settingsMethods.push('styleCursor');\nInteractable.settingsMethods.push('actionChecker');\nInteractable.settingsMethods.push('ignoreFrom');\nInteractable.settingsMethods.push('allowFrom');\n\ndefaultOptions.base.actionChecker = null;\ndefaultOptions.base.styleCursor = true;\n\nutils.extend(defaultOptions.perAction, autoStart.defaults.perAction);\n\nmodule.exports = autoStart;\n","const autoStart = require('./base');\nconst Interaction = require('../Interaction');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.delayTimer = null;\n});\n\nautoStart.signals.on('prepared', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.delayTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.target, interaction.element);\n }, delay);\n }\n});\n\nInteraction.signals.on('move', function ({ interaction, duplicate }) {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.delayTimer);\n }\n});\n\n// prevent regular down->move autoStart\nautoStart.signals.on('before-start', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.prepared.name = null;\n }\n});\n","const autoStart = require('./base');\nconst scope = require('../scope');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\n\nconst { matchesSelector, parentNode } = require('../utils/domUtils');\n\nautoStart.setActionDefaults(require('../actions/drag'));\n\nautoStart.signals.on('before-start', function ({ interaction, eventTarget, dx, dy }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // check if a drag is in the correct axis\n const absX = Math.abs(dx);\n const absY = Math.abs(dy);\n const options = interaction.target.options.drag;\n const startAxis = options.startAxis;\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy');\n\n interaction.prepared.axis = options.lockAxis === 'start'\n ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n : options.lockAxis;\n\n // if the movement isn't in the startAxis of the interactable\n if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) {\n // cancel the prepared action\n interaction.prepared.name = null;\n\n // then try to get a drag from another ineractable\n\n if (!interaction.prepared.name) {\n\n let element = eventTarget;\n\n const getDraggable = function (interactable, selector, context) {\n const elements = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n if (interactable === interaction.target) { return; }\n\n if (!options.manualStart\n && !interactable.testIgnoreAllow(options, element, eventTarget)\n && matchesSelector(element, selector, elements)) {\n\n const action = interactable.getAction(interaction.downPointer,\n interaction.downEvent,\n interaction,\n element);\n\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, interactable)\n && autoStart.validateAction(action, interactable, element, eventTarget)) {\n\n return interactable;\n }\n }\n };\n\n let action = null;\n\n // check all interactables\n while (is.element(element)) {\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && elementInteractable !== interaction.target\n && !elementInteractable.options.drag.manualStart) {\n\n action = elementInteractable.getAction(interaction.downPointer, interaction.downEvent, interaction, element);\n }\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, elementInteractable)) {\n\n interaction.prepared.name = 'drag';\n interaction.target = elementInteractable;\n interaction.element = element;\n break;\n }\n\n const selectorInteractable = scope.interactables.forEachSelector(getDraggable, element);\n\n if (selectorInteractable) {\n interaction.prepared.name = 'drag';\n interaction.target = selectorInteractable;\n interaction.element = element;\n break;\n }\n\n element = parentNode(element);\n }\n }\n }\n});\n\nfunction checkStartAxis (startAxis, interactable) {\n if (!interactable) { return false; }\n\n const thisAxis = interactable.options.drag.startAxis;\n\n return (startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis);\n}\n","require('./base').setActionDefaults(require('../actions/gesture'));\n","require('./base').setActionDefaults(require('../actions/resize'));\n","module.exports = {\n base: {\n accept : null,\n preventDefault: 'auto',\n deltaSource : 'page',\n },\n\n perAction: {\n origin: { x: 0, y: 0 },\n\n // only allow left button by default\n // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n mouseButtons: 1,\n\n inertia: {\n enabled : false,\n resistance : 10, // the lambda in exponential decay\n minSpeed : 100, // target speed must be above this for inertia to start\n endSpeed : 10, // the speed at which inertia is slow enough to stop\n allowResume : true, // allow resuming an action in inertia phase\n smoothEndDuration: 300, // animate to snap/restrict endOnly if there's no inertia\n },\n },\n};\n","/* browser entry point */\n\n// Legacy browser support\nrequire('./legacyBrowsers');\n\n// inertia\nrequire('./inertia');\n\n// modifiers\nrequire('./modifiers/snap');\nrequire('./modifiers/restrict');\n\n// pointerEvents\nrequire('./pointerEvents/base');\nrequire('./pointerEvents/holdRepeat');\nrequire('./pointerEvents/interactableTargets');\n\n// delay\nrequire('./autoStart/delay');\n\n// actions\nrequire('./actions/gesture');\nrequire('./actions/resize');\nrequire('./actions/drag');\nrequire('./actions/drop');\n\n// load these modifiers after resize is loaded\nrequire('./modifiers/snapSize');\nrequire('./modifiers/restrictEdges');\nrequire('./modifiers/restrictSize');\n\n// autoStart actions\nrequire('./autoStart/gesture');\nrequire('./autoStart/resize');\nrequire('./autoStart/drag');\n\n// Interactable preventDefault setting\nrequire('./interactablePreventDefault.js');\n\n// autoScroll\nrequire('./autoScroll');\n\n// export interact\nmodule.exports = require('./interact');\n","const InteractEvent = require('./InteractEvent');\nconst Interaction = require('./Interaction');\nconst modifiers = require('./modifiers');\nconst utils = require('./utils');\nconst animationFrame = require('./utils/raf');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.inertiaStatus = {\n active : false,\n smoothEnd : false,\n allowResume: false,\n\n startEvent: null,\n upCoords : {},\n\n xe: 0, ye: 0,\n sx: 0, sy: 0,\n\n t0: 0,\n vx0: 0, vys: 0,\n duration: 0,\n\n lambda_v0: 0,\n one_ve_v0: 0,\n i : null,\n };\n\n interaction.boundInertiaFrame = () => inertiaFrame .apply(interaction);\n interaction.boundSmoothEndFrame = () => smoothEndFrame.apply(interaction);\n});\n\nInteraction.signals.on('down', function ({ interaction, event, pointer, eventTarget }) {\n const status = interaction.inertiaStatus;\n\n // Check if the down event hits the current inertia target\n if (status.active) {\n let element = eventTarget;\n\n // climb up the DOM tree from the event target\n while (utils.is.element(element)) {\n\n // if interaction element is the current inertia target element\n if (element === interaction.element) {\n // stop inertia\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n\n // update pointers to the down event's coordinates\n interaction.updatePointer(pointer);\n utils.setCoords(interaction.curCoords, interaction.pointers);\n\n // fire appropriate signals\n const signalArg = { interaction };\n Interaction.signals.fire('before-action-move', signalArg);\n Interaction.signals.fire('action-resume' , signalArg);\n\n // fire a reume event\n const resumeEvent = new InteractEvent(interaction,\n event,\n interaction.prepared.name,\n 'inertiaresume',\n interaction.element);\n\n interaction.target.fire(resumeEvent);\n interaction.prevEvent = resumeEvent;\n modifiers.resetStatuses(interaction.modifierStatuses);\n\n utils.copyCoords(interaction.prevCoords, interaction.curCoords);\n break;\n }\n\n element = utils.parentNode(element);\n }\n }\n});\n\nInteraction.signals.on('up', function ({ interaction, event }) {\n const status = interaction.inertiaStatus;\n\n if (!interaction.interacting() || status.active) { return; }\n\n const target = interaction.target;\n const options = target && target.options;\n const inertiaOptions = options && interaction.prepared.name && options[interaction.prepared.name].inertia;\n\n const now = new Date().getTime();\n const statuses = {};\n const page = utils.extend({}, interaction.curCoords.page);\n const pointerSpeed = interaction.pointerDelta.client.speed;\n\n let smoothEnd = false;\n let modifierResult;\n\n // check if inertia should be started\n const inertiaPossible = (inertiaOptions && inertiaOptions.enabled\n && interaction.prepared.name !== 'gesture'\n && event !== status.startEvent);\n\n const inertia = (inertiaPossible\n && (now - interaction.curCoords.timeStamp) < 50\n && pointerSpeed > inertiaOptions.minSpeed\n && pointerSpeed > inertiaOptions.endSpeed);\n\n const modifierArg = {\n interaction,\n pageCoords: page,\n statuses,\n preEnd: true,\n requireEndOnly: true,\n };\n\n // smoothEnd\n if (inertiaPossible && !inertia) {\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n if (modifierResult.shouldMove && modifierResult.locked) {\n smoothEnd = true;\n }\n }\n\n if (!(inertia || smoothEnd)) { return; }\n\n utils.copyCoords(status.upCoords, interaction.curCoords);\n\n interaction.pointers[0] = status.startEvent =\n new InteractEvent(interaction, event, interaction.prepared.name, 'inertiastart', interaction.element);\n\n status.t0 = now;\n\n status.active = true;\n status.allowResume = inertiaOptions.allowResume;\n interaction.simulation = status;\n\n target.fire(status.startEvent);\n\n if (inertia) {\n status.vx0 = interaction.pointerDelta.client.vx;\n status.vy0 = interaction.pointerDelta.client.vy;\n status.v0 = pointerSpeed;\n\n calcInertia(interaction, status);\n\n utils.extend(page, interaction.curCoords.page);\n\n page.x += status.xe;\n page.y += status.ye;\n\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n status.modifiedXe += modifierResult.dx;\n status.modifiedYe += modifierResult.dy;\n\n status.i = animationFrame.request(interaction.boundInertiaFrame);\n }\n else {\n status.smoothEnd = true;\n status.xe = modifierResult.dx;\n status.ye = modifierResult.dy;\n\n status.sx = status.sy = 0;\n\n status.i = animationFrame.request(interaction.boundSmoothEndFrame);\n }\n});\n\nInteraction.signals.on('stop-active', function ({ interaction }) {\n const status = interaction.inertiaStatus;\n\n if (status.active) {\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n }\n});\n\nfunction calcInertia (interaction, status) {\n const inertiaOptions = interaction.target.options[interaction.prepared.name].inertia;\n const lambda = inertiaOptions.resistance;\n const inertiaDur = -Math.log(inertiaOptions.endSpeed / status.v0) / lambda;\n\n status.x0 = interaction.prevEvent.pageX;\n status.y0 = interaction.prevEvent.pageY;\n status.t0 = status.startEvent.timeStamp / 1000;\n status.sx = status.sy = 0;\n\n status.modifiedXe = status.xe = (status.vx0 - inertiaDur) / lambda;\n status.modifiedYe = status.ye = (status.vy0 - inertiaDur) / lambda;\n status.te = inertiaDur;\n\n status.lambda_v0 = lambda / status.v0;\n status.one_ve_v0 = 1 - inertiaOptions.endSpeed / status.v0;\n}\n\nfunction inertiaFrame () {\n updateInertiaCoords(this);\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n\n const status = this.inertiaStatus;\n const options = this.target.options[this.prepared.name].inertia;\n const lambda = options.resistance;\n const t = new Date().getTime() / 1000 - status.t0;\n\n if (t < status.te) {\n\n const progress = 1 - (Math.exp(-lambda * t) - status.lambda_v0) / status.one_ve_v0;\n\n if (status.modifiedXe === status.xe && status.modifiedYe === status.ye) {\n status.sx = status.xe * progress;\n status.sy = status.ye * progress;\n }\n else {\n const quadPoint = utils.getQuadraticCurvePoint(0, 0,\n status.xe,\n status.ye,\n status.modifiedXe,\n status.modifiedYe,\n progress);\n\n status.sx = quadPoint.x;\n status.sy = quadPoint.y;\n }\n\n this.doMove();\n\n status.i = animationFrame.request(this.boundInertiaFrame);\n }\n else {\n status.sx = status.modifiedXe;\n status.sy = status.modifiedYe;\n\n this.doMove();\n this.end(status.startEvent);\n status.active = false;\n this.simulation = null;\n }\n\n utils.copyCoords(this.prevCoords, this.curCoords);\n}\n\nfunction smoothEndFrame () {\n updateInertiaCoords(this);\n\n const status = this.inertiaStatus;\n const t = new Date().getTime() - status.t0;\n const duration = this.target.options[this.prepared.name].inertia.smoothEndDuration;\n\n if (t < duration) {\n status.sx = utils.easeOutQuad(t, 0, status.xe, duration);\n status.sy = utils.easeOutQuad(t, 0, status.ye, duration);\n\n this.pointerMove(status.startEvent, status.startEvent);\n\n status.i = animationFrame.request(this.boundSmoothEndFrame);\n }\n else {\n status.sx = status.xe;\n status.sy = status.ye;\n\n this.pointerMove(status.startEvent, status.startEvent);\n this.end(status.startEvent);\n\n status.smoothEnd =\n status.active = false;\n this.simulation = null;\n }\n}\n\nfunction updateInertiaCoords (interaction) {\n const status = interaction.inertiaStatus;\n\n // return if inertia isn't running\n if (!status.active) { return; }\n\n const pageUp = status.upCoords.page;\n const clientUp = status.upCoords.client;\n\n utils.setCoords(interaction.curCoords, [ {\n pageX : pageUp.x + status.sx,\n pageY : pageUp.y + status.sy,\n clientX: clientUp.x + status.sx,\n clientY: clientUp.y + status.sy,\n } ]);\n}\n","const browser = require('./utils/browser');\nconst events = require('./utils/events');\nconst utils = require('./utils');\nconst scope = require('./scope');\nconst Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\n\nconst globalEvents = {};\n\n/*\\\n * interact\n [ method ]\n *\n * The methods of this variable can be used to set elements as\n * interactables and also to change various default settings.\n *\n * Calling it as a function and passing an element or a valid CSS selector\n * string returns an Interactable object which has various methods to\n * configure it.\n *\n - element (Element | string) The HTML or SVG Element to interact with or CSS selector\n = (object) An @Interactable\n *\n > Usage\n | interact('#draggable').draggable(true);\n |\n | var rectables = interact('rect');\n | rectables\n | .gesturable(true)\n | .on('gesturemove', function (event) {\n | // ...\n | });\n\\*/\nfunction interact (element, options) {\n let interactable = scope.interactables.get(element, options);\n\n if (!interactable) {\n interactable = new Interactable(element, options);\n interactable.events.global = globalEvents;\n }\n\n return interactable;\n}\n\n/*\\\n * interact.isSet\n [ method ]\n *\n * Check if an element has been set\n - element (Element) The Element being searched for\n = (boolean) Indicates if the element or CSS selector was previously passed to interact\n\\*/\ninteract.isSet = function (element, options) {\n return scope.interactables.indexOfElement(element, options && options.context) !== -1;\n};\n\n/*\\\n * interact.on\n [ method ]\n *\n * Adds a global listener for an InteractEvent or adds a DOM event to\n * `document`\n *\n - type (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) interact\n\\*/\ninteract.on = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.on(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.on(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n // if it is an InteractEvent type, add listener to globalEvents\n if (utils.contains(Interactable.eventTypes, type)) {\n // if this type of event was never bound\n if (!globalEvents[type]) {\n globalEvents[type] = [listener];\n }\n else {\n globalEvents[type].push(listener);\n }\n }\n // If non InteractEvent type, addEventListener to document\n else {\n events.add(scope.document, type, listener, { options });\n }\n\n return interact;\n};\n\n/*\\\n * interact.off\n [ method ]\n *\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n - type (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) interact\n \\*/\ninteract.off = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.off(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.off(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n if (!utils.contains(Interactable.eventTypes, type)) {\n events.remove(scope.document, type, listener, options);\n }\n else {\n let index;\n\n if (type in globalEvents\n && (index = utils.indexOf(globalEvents[type], listener)) !== -1) {\n globalEvents[type].splice(index, 1);\n }\n }\n\n return interact;\n};\n\n/*\\\n * interact.debug\n [ method ]\n *\n * Returns an object which exposes internal data\n = (object) An object with properties that outline the current state and expose internal functions and variables\n\\*/\ninteract.debug = function () {\n return scope;\n};\n\n// expose the functions used to calculate multi-touch properties\ninteract.getPointerAverage = utils.pointerAverage;\ninteract.getTouchBBox = utils.touchBBox;\ninteract.getTouchDistance = utils.touchDistance;\ninteract.getTouchAngle = utils.touchAngle;\n\ninteract.getElementRect = utils.getElementRect;\ninteract.getElementClientRect = utils.getElementClientRect;\ninteract.matchesSelector = utils.matchesSelector;\ninteract.closest = utils.closest;\n\n/*\\\n * interact.supportsTouch\n [ method ]\n *\n = (boolean) Whether or not the browser supports touch input\n\\*/\ninteract.supportsTouch = function () {\n return browser.supportsTouch;\n};\n\n/*\\\n * interact.supportsPointerEvent\n [ method ]\n *\n = (boolean) Whether or not the browser supports PointerEvents\n\\*/\ninteract.supportsPointerEvent = function () {\n return browser.supportsPointerEvent;\n};\n\n/*\\\n * interact.stop\n [ method ]\n *\n * Cancels all interactions (end events are not fired)\n *\n - event (Event) An event on which to call preventDefault()\n = (object) interact\n\\*/\ninteract.stop = function (event) {\n for (let i = scope.interactions.length - 1; i >= 0; i--) {\n scope.interactions[i].stop(event);\n }\n\n return interact;\n};\n\n/*\\\n * interact.pointerMoveTolerance\n [ method ]\n * Returns or sets the distance the pointer must be moved before an action\n * sequence occurs. This also affects tolerance for tap events.\n *\n - newValue (number) #optional The movement from the start position must be greater than this value\n = (number | Interactable) The current setting or interact\n\\*/\ninteract.pointerMoveTolerance = function (newValue) {\n if (utils.is.number(newValue)) {\n Interaction.pointerMoveTolerance = newValue;\n\n return this;\n }\n\n return Interaction.pointerMoveTolerance;\n};\n\ninteract.addDocument = scope.addDocument;\ninteract.removeDocument = scope.removeDocument;\n\nscope.interact = interact;\n\nmodule.exports = interact;\n","const Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\nconst scope = require('./scope');\nconst is = require('./utils/is');\nconst events = require('./utils/events');\n\nconst { nodeContains, matchesSelector } = require('./utils/domUtils');\n\n/*\\\n * Interactable.preventDefault\n [ method ]\n *\n * Returns or sets whether to prevent the browser's default behaviour\n * in response to pointer events. Can be set to:\n * - `'always'` to always prevent\n * - `'never'` to never prevent\n * - `'auto'` to let interact.js try to determine what would be best\n *\n - newValue (string) #optional `true`, `false` or `'auto'`\n = (string | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.preventDefault = function (newValue) {\n if (/^(always|never|auto)$/.test(newValue)) {\n this.options.preventDefault = newValue;\n return this;\n }\n\n if (is.bool(newValue)) {\n this.options.preventDefault = newValue? 'always' : 'never';\n return this;\n }\n\n return this.options.preventDefault;\n};\n\nInteractable.prototype.checkAndPreventDefault = function (event) {\n const setting = this.options.preventDefault;\n\n if (setting === 'never') { return; }\n\n if (setting === 'always') {\n event.preventDefault();\n return;\n }\n\n // setting === 'auto'\n\n // don't preventDefault if the browser supports passiveEvents\n // CSS touch-action and user-selecct should be used instead\n if (events.supportsOptions) {\n return;\n }\n\n // don't preventDefault of pointerdown events\n if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) {\n return;\n }\n\n // don't preventDefault on editable elements\n if (is.element(event.target)\n && matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) {\n return;\n }\n\n event.preventDefault();\n};\n\nfunction onInteractionEvent ({ interaction, event }) {\n if (interaction.target) {\n interaction.target.checkAndPreventDefault(event);\n }\n}\n\nfor (const eventSignal of ['down', 'move', 'up', 'cancel']) {\n Interaction.signals.on(eventSignal, onInteractionEvent);\n}\n\n// prevent native HTML5 drag on interact.js target elements\nInteraction.docEvents.dragstart = function preventNativeDrag (event) {\n for (const interaction of scope.interactions) {\n\n if (interaction.element\n && (interaction.element === event.target\n || nodeContains(interaction.element, event.target))) {\n\n interaction.target.checkAndPreventDefault(event);\n return;\n }\n }\n};\n","const scope = require('./scope');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst iFinder = require('./utils/interactionFinder');\nconst pointerEvents = require('./pointerEvents/base');\n\nconst { window } = require('./utils/window');\n\nconst toString = Object.prototype.toString;\n\nif (!window.Array.isArray) {\n window.Array.isArray = function (obj) {\n return toString.call(obj) === '[object Array]';\n };\n}\n\nif (!String.prototype.trim) {\n String.prototype.trim = function () {\n return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n };\n}\n\n// http://www.quirksmode.org/dom/events/click.html\n// >Events leading to dblclick\n//\n// IE8 doesn't fire down event before dblclick.\n// This workaround tries to fire a tap and doubletap after dblclick\nfunction onIE8Dblclick (event) {\n const eventTarget = event.target;\n const interaction = iFinder.search(event, event.type, eventTarget);\n\n if (!interaction) { return; }\n\n if (interaction.prevTap\n && event.clientX === interaction.prevTap.clientX\n && event.clientY === interaction.prevTap.clientY\n && eventTarget === interaction.prevTap.target) {\n\n interaction.downTargets[0] = eventTarget;\n interaction.downTimes [0] = new Date().getTime();\n\n pointerEvents.fire({\n interaction,\n event,\n eventTarget,\n pointer: event,\n type: 'tap',\n });\n }\n}\n\nif (browser.isIE8) {\n const selectFix = function (event) {\n for (const interaction of scope.interactions) {\n if (interaction.interacting()) {\n interaction.target.checkAndPreventDefault(event);\n }\n }\n };\n\n const onDocIE8 = function onDocIE8 ({ doc, win }, signalName) {\n const eventMethod = signalName.indexOf('listen') === 0\n ? events.add : events.remove;\n\n // For IE's lack of Event#preventDefault\n eventMethod(doc, 'selectstart', selectFix);\n\n if (pointerEvents) {\n eventMethod(doc, 'dblclick', onIE8Dblclick);\n }\n };\n\n scope.signals.on('add-document' , onDocIE8);\n scope.signals.on('remove-document', onDocIE8);\n}\n\nmodule.exports = null;\n","const InteractEvent = require('../InteractEvent');\nconst Interaction = require('../Interaction');\nconst extend = require('../utils/extend');\n\nconst modifiers = {\n names: [],\n\n setOffsets: function (arg) {\n const { interaction, pageCoords: page } = arg;\n const { target, element, startOffset } = interaction;\n const rect = target.getRect(element);\n\n if (rect) {\n startOffset.left = page.x - rect.left;\n startOffset.top = page.y - rect.top;\n\n startOffset.right = rect.right - page.x;\n startOffset.bottom = rect.bottom - page.y;\n\n if (!('width' in rect)) { rect.width = rect.right - rect.left; }\n if (!('height' in rect)) { rect.height = rect.bottom - rect.top ; }\n }\n else {\n startOffset.left = startOffset.top = startOffset.right = startOffset.bottom = 0;\n }\n\n arg.rect = rect;\n arg.interactable = target;\n arg.element = element;\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n\n arg.options = target.options[interaction.prepared.name][modifierName];\n\n if (!arg.options) {\n continue;\n }\n\n interaction.modifierOffsets[modifierName] = modifiers[modifierName].setOffset(arg);\n }\n },\n\n setAll: function (arg) {\n const { interaction, statuses, preEnd, requireEndOnly } = arg;\n const coords = extend({}, arg.pageCoords);\n const result = {\n dx: 0,\n dy: 0,\n changed: false,\n locked: false,\n shouldMove: true,\n };\n\n for (const modifierName of modifiers.names) {\n const modifier = modifiers[modifierName];\n const options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!shouldDo(options, preEnd, requireEndOnly)) { continue; }\n\n arg.status = arg.status = statuses[modifierName];\n arg.options = options;\n arg.offset = arg.interaction.modifierOffsets[modifierName];\n\n modifier.set(arg);\n\n if (arg.status.locked) {\n coords.x += arg.status.dx;\n coords.y += arg.status.dy;\n\n result.dx += arg.status.dx;\n result.dy += arg.status.dy;\n\n result.locked = true;\n }\n }\n\n // a move should be fired if:\n // - there are no modifiers enabled,\n // - no modifiers are \"locked\" i.e. have changed the pointer's coordinates, or\n // - the locked coords have changed since the last pointer move\n result.shouldMove = !arg.status || !result.locked || arg.status.changed;\n\n return result;\n },\n\n resetStatuses: function (statuses) {\n for (const modifierName of modifiers.names) {\n const status = statuses[modifierName] || {};\n\n status.dx = status.dy = 0;\n status.modifiedX = status.modifiedY = NaN;\n status.locked = false;\n status.changed = true;\n\n statuses[modifierName] = status;\n }\n\n return statuses;\n },\n\n start: function ({ interaction }, signalName) {\n const arg = {\n interaction,\n pageCoords: (signalName === 'action-resume' ?\n interaction.curCoords : interaction.startCoords).page,\n startOffset: interaction.startOffset,\n statuses: interaction.modifierStatuses,\n preEnd: false,\n requireEndOnly: false,\n };\n\n modifiers.setOffsets(arg);\n modifiers.resetStatuses(arg.statuses);\n\n arg.pageCoords = extend({}, interaction.startCoords.page);\n interaction.modifierResult = modifiers.setAll(arg);\n },\n};\n\nInteraction.signals.on('new', function (interaction) {\n interaction.startOffset = { left: 0, right: 0, top: 0, bottom: 0 };\n interaction.modifierOffsets = {};\n interaction.modifierStatuses = modifiers.resetStatuses({});\n interaction.modifierResult = null;\n});\n\nInteraction.signals.on('action-start' , modifiers.start);\nInteraction.signals.on('action-resume', modifiers.start);\n\nInteraction.signals.on('before-action-move', function ({ interaction, preEnd, interactingBeforeMove }) {\n const modifierResult = modifiers.setAll({\n interaction,\n preEnd,\n pageCoords: interaction.curCoords.page,\n statuses: interaction.modifierStatuses,\n requireEndOnly: false,\n });\n\n // don't fire an action move if a modifier would keep the event in the same\n // cordinates as before\n if (!modifierResult.shouldMove && interactingBeforeMove) {\n interaction._dontFireMove = true;\n }\n\n interaction.modifierResult = modifierResult;\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n for (let i = 0; i < modifiers.names.length; i++) {\n const options = interaction.target.options[interaction.prepared.name][modifiers.names[i]];\n\n // if the endOnly option is true for any modifier\n if (shouldDo(options, true, true)) {\n // fire a move event at the modified coordinates\n interaction.doMove({ event, preEnd: true });\n break;\n }\n }\n});\n\nInteractEvent.signals.on('set-xy', function (arg) {\n const { iEvent, interaction } = arg;\n const modifierArg = extend({}, arg);\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n modifierArg.options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!modifierArg.options) {\n continue;\n }\n\n const modifier = modifiers[modifierName];\n\n modifierArg.status = interaction.modifierStatuses[modifierName];\n\n iEvent[modifierName] = modifier.modifyCoords(modifierArg);\n }\n});\n\nfunction shouldDo (options, preEnd, requireEndOnly) {\n return (options && options.enabled\n && (preEnd || !options.endOnly)\n && (!requireEndOnly || options.endOnly));\n}\n\nmodule.exports = modifiers;\n","const modifiers = require('./index');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst restrict = {\n defaults: {\n enabled : false,\n endOnly : false,\n restriction: null,\n elementRect: null,\n },\n\n setOffset: function ({ rect, startOffset, options }) {\n const elementRect = options && options.elementRect;\n const offset = {};\n\n if (rect && elementRect) {\n offset.left = startOffset.left - (rect.width * elementRect.left);\n offset.top = startOffset.top - (rect.height * elementRect.top);\n\n offset.right = startOffset.right - (rect.width * (1 - elementRect.right));\n offset.bottom = startOffset.bottom - (rect.height * (1 - elementRect.bottom));\n }\n else {\n offset.left = offset.top = offset.right = offset.bottom = 0;\n }\n\n return offset;\n },\n\n set: function ({ pageCoords, interaction, status, options }) {\n if (!options) { return status; }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n\n const restriction = getRestrictionRect(options.restriction, interaction, page);\n\n if (!restriction) { return status; }\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n const rect = restriction;\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n const offset = interaction.modifierOffsets.restrict;\n\n // object is assumed to have\n // x, y, width, height or\n // left, top, right, bottom\n if ('x' in restriction && 'y' in restriction) {\n modifiedX = Math.max(Math.min(rect.x + rect.width - offset.right , page.x), rect.x + offset.left);\n modifiedY = Math.max(Math.min(rect.y + rect.height - offset.bottom, page.y), rect.y + offset.top );\n }\n else {\n modifiedX = Math.max(Math.min(rect.right - offset.right , page.x), rect.left + offset.left);\n modifiedY = Math.max(Math.min(rect.bottom - offset.bottom, page.y), rect.top + offset.top );\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const elementRect = options && options.elementRect;\n\n if (options && options.enabled\n && !(phase === 'start' && elementRect && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n getRestrictionRect,\n};\n\nfunction getRestrictionRect (value, interaction, page) {\n if (utils.is.function(value)) {\n return utils.resolveRectLike(value, interaction.target, interaction.element, [page.x, page.y, interaction]);\n } else {\n return utils.resolveRectLike(value, interaction.target, interaction.element);\n }\n}\n\nmodifiers.restrict = restrict;\nmodifiers.names.push('restrict');\n\ndefaultOptions.perAction.restrict = restrict.defaults;\n\nmodule.exports = restrict;\n","// This module adds the options.resize.restrictEdges setting which sets min and\n// max for the top, left, bottom and right edges of the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictEdges: {\n// inner: { top: 200, left: 200, right: 400, bottom: 400 },\n// outer: { top: 0, left: 0, right: 600, bottom: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst { getRestrictionRect } = require('./restrict');\n\nconst noInner = { top: +Infinity, left: +Infinity, bottom: -Infinity, right: -Infinity };\nconst noOuter = { top: -Infinity, left: -Infinity, bottom: +Infinity, right: +Infinity };\n\nconst restrictEdges = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n offset: null,\n },\n\n setOffset: function ({ interaction, startOffset, options }) {\n if (!options) {\n return utils.extend({}, startOffset);\n }\n\n const offset = getRestrictionRect(options.offset, interaction, interaction.startCoords.page);\n\n if (offset) {\n return {\n top: startOffset.top + offset.y,\n left: startOffset.left + offset.x,\n bottom: startOffset.bottom + offset.y,\n right: startOffset.right + offset.x,\n };\n }\n\n return startOffset;\n },\n\n set: function ({ pageCoords, interaction, status, offset, options }) {\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n const inner = rectUtils.xywhToTlbr(getRestrictionRect(options.inner, interaction, page)) || noInner;\n const outer = rectUtils.xywhToTlbr(getRestrictionRect(options.outer, interaction, page)) || noOuter;\n\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n if (edges.top) {\n modifiedY = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top);\n }\n else if (edges.bottom) {\n modifiedY = Math.max(Math.min(outer.bottom - offset.bottom, page.y), inner.bottom - offset.bottom);\n }\n if (edges.left) {\n modifiedX = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left);\n }\n else if (edges.right) {\n modifiedX = Math.max(Math.min(outer.right - offset.right, page.x), inner.right - offset.right);\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n if (options && options.enabled\n && !(phase === 'start' && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n noInner,\n noOuter,\n getRestrictionRect,\n};\n\nmodifiers.restrictEdges = restrictEdges;\nmodifiers.names.push('restrictEdges');\n\ndefaultOptions.perAction.restrictEdges = restrictEdges.defaults;\nresize.defaults.restrictEdges = restrictEdges.defaults;\n\nmodule.exports = restrictEdges;\n","// This module adds the options.resize.restrictSize setting which sets min and\n// max width and height for the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictSize: {\n// min: { width: -600, height: -600 },\n// max: { width: 600, height: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst restrictEdges = require('./restrictEdges');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst noMin = { width: -Infinity, height: -Infinity };\nconst noMax = { width: +Infinity, height: +Infinity };\n\nconst restrictSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n },\n\n setOffset: function ({ interaction }) {\n return interaction.startOffset;\n },\n\n set: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const rect = rectUtils.xywhToTlbr(interaction.resizeRects.inverted);\n\n const minSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.min, interaction)) || noMin;\n const maxSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.max, interaction)) || noMax;\n\n arg.options = {\n enabled: options.enabled,\n endOnly: options.endOnly,\n inner: utils.extend({}, restrictEdges.noInner),\n outer: utils.extend({}, restrictEdges.noOuter),\n };\n\n if (edges.top) {\n arg.options.inner.top = rect.bottom - minSize.height;\n arg.options.outer.top = rect.bottom - maxSize.height;\n }\n else if (edges.bottom) {\n arg.options.inner.bottom = rect.top + minSize.height;\n arg.options.outer.bottom = rect.top + maxSize.height;\n }\n if (edges.left) {\n arg.options.inner.left = rect.right - minSize.width;\n arg.options.outer.left = rect.right - maxSize.width;\n }\n else if (edges.right) {\n arg.options.inner.right = rect.left + minSize.width;\n arg.options.outer.right = rect.left + maxSize.width;\n }\n\n restrictEdges.set(arg);\n },\n\n modifyCoords: restrictEdges.modifyCoords,\n};\n\nmodifiers.restrictSize = restrictSize;\nmodifiers.names.push('restrictSize');\n\ndefaultOptions.perAction.restrictSize = restrictSize.defaults;\nresize.defaults.restrictSize = restrictSize.defaults;\n\nmodule.exports = restrictSize;\n","const modifiers = require('./index');\nconst interact = require('../interact');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst snap = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n\n relativePoints: null,\n },\n\n setOffset: function ({ interaction, interactable, element, rect, startOffset, options }) {\n const offsets = [];\n const optionsOrigin = utils.rectToXY(utils.resolveRectLike(options.origin));\n const origin = optionsOrigin || utils.getOriginXY(interactable, element, interaction.prepared.name);\n options = options || interactable.options[interaction.prepared.name].snap || {};\n\n let snapOffset;\n\n if (options.offset === 'startCoords') {\n snapOffset = {\n x: interaction.startCoords.page.x - origin.x,\n y: interaction.startCoords.page.y - origin.y,\n };\n }\n else {\n const offsetRect = utils.resolveRectLike(options.offset, interactable, element, [interaction]);\n\n snapOffset = utils.rectToXY(offsetRect) || { x: 0, y: 0 };\n }\n\n if (rect && options.relativePoints && options.relativePoints.length) {\n for (const { x: relativeX, y: relativeY } of options.relativePoints) {\n offsets.push({\n x: startOffset.left - (rect.width * relativeX) + snapOffset.x,\n y: startOffset.top - (rect.height * relativeY) + snapOffset.y,\n });\n }\n }\n else {\n offsets.push(snapOffset);\n }\n\n return offsets;\n },\n\n set: function ({ interaction, pageCoords, status, options, offset: offsets }) {\n const targets = [];\n let target;\n let page;\n let i;\n\n if (status.useStatusXY) {\n page = { x: status.x, y: status.y };\n }\n else {\n const origin = utils.getOriginXY(interaction.target, interaction.element, interaction.prepared.name);\n\n page = utils.extend({}, pageCoords);\n\n page.x -= origin.x;\n page.y -= origin.y;\n }\n\n status.realX = page.x;\n status.realY = page.y;\n\n let len = options.targets? options.targets.length : 0;\n\n for (const { x: offsetX, y: offsetY } of offsets) {\n const relativeX = page.x - offsetX;\n const relativeY = page.y - offsetY;\n\n for (const snapTarget of options.targets) {\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n targets.push({\n x: utils.is.number(target.x) ? (target.x + offsetX) : relativeX,\n y: utils.is.number(target.y) ? (target.y + offsetY) : relativeY,\n\n range: utils.is.number(target.range)? target.range: options.range,\n });\n }\n }\n\n const closest = {\n target: null,\n inRange: false,\n distance: 0,\n range: 0,\n dx: 0,\n dy: 0,\n };\n\n for (i = 0, len = targets.length; i < len; i++) {\n target = targets[i];\n\n const range = target.range;\n const dx = target.x - page.x;\n const dy = target.y - page.y;\n const distance = utils.hypot(dx, dy);\n let inRange = distance <= range;\n\n // Infinite targets count as being out of range\n // compared to non infinite ones that are in range\n if (range === Infinity && closest.inRange && closest.range !== Infinity) {\n inRange = false;\n }\n\n if (!closest.target || (inRange\n // is the closest target in range?\n ? (closest.inRange && range !== Infinity\n // the pointer is relatively deeper in this target\n ? distance / range < closest.distance / closest.range\n // this target has Infinite range and the closest doesn't\n : (range === Infinity && closest.range !== Infinity)\n // OR this target is closer that the previous closest\n || distance < closest.distance)\n // The other is not in range and the pointer is closer to this target\n : (!closest.inRange && distance < closest.distance))) {\n\n closest.target = target;\n closest.distance = distance;\n closest.range = range;\n closest.inRange = inRange;\n closest.dx = dx;\n closest.dy = dy;\n\n status.range = range;\n }\n }\n\n let snapChanged;\n\n if (closest.target) {\n snapChanged = (status.modifiedX !== closest.target.x || status.modifiedY !== closest.target.y);\n\n status.modifiedX = closest.target.x;\n status.modifiedY = closest.target.y;\n }\n else {\n snapChanged = true;\n\n status.modifiedX = NaN;\n status.modifiedY = NaN;\n }\n\n status.dx = closest.dx;\n status.dy = closest.dy;\n\n status.changed = (snapChanged || (closest.inRange && !status.locked));\n status.locked = closest.inRange;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const relativePoints = options && options.relativePoints;\n\n if (options && options.enabled\n && !(phase === 'start' && relativePoints && relativePoints.length)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n }\n\n return {\n range : status.range,\n locked : status.locked,\n x : status.modifiedX,\n y : status.modifiedY,\n realX : status.realX,\n realY : status.realY,\n dx : status.dx,\n dy : status.dy,\n };\n }\n },\n};\n\ninteract.createSnapGrid = function (grid) {\n return function (x, y) {\n const limits = grid.limits || {\n left : -Infinity,\n right : Infinity,\n top : -Infinity,\n bottom: Infinity,\n };\n let offsetX = 0;\n let offsetY = 0;\n\n if (utils.is.object(grid.offset)) {\n offsetX = grid.offset.x;\n offsetY = grid.offset.y;\n }\n\n const gridx = Math.round((x - offsetX) / grid.x);\n const gridy = Math.round((y - offsetY) / grid.y);\n\n const newX = Math.max(limits.left, Math.min(limits.right , gridx * grid.x + offsetX));\n const newY = Math.max(limits.top , Math.min(limits.bottom, gridy * grid.y + offsetY));\n\n return {\n x: newX,\n y: newY,\n range: grid.range,\n };\n };\n};\n\nmodifiers.snap = snap;\nmodifiers.names.push('snap');\n\ndefaultOptions.perAction.snap = snap.defaults;\n\nmodule.exports = snap;\n","// This module allows snapping of the size of targets during resize\n// interactions.\n\nconst modifiers = require('./index');\nconst snap = require('./snap');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\nconst utils = require('../utils/');\n\nconst snapSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n },\n\n setOffset: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.edges;\n\n if (!edges) { return; }\n\n arg.options = {\n relativePoints: [{\n x: edges.left? 0 : 1,\n y: edges.top ? 0 : 1,\n }],\n origin: { x: 0, y: 0 },\n offset: 'self',\n range: options.range,\n };\n\n const offsets = snap.setOffset(arg);\n arg.options = options;\n\n return offsets;\n },\n\n set: function (arg) {\n const { interaction, options, offset, pageCoords } = arg;\n const page = utils.extend({}, pageCoords);\n const relativeX = page.x - offset[0].x;\n const relativeY = page.y - offset[0].y;\n\n arg.options = utils.extend({}, options);\n arg.options.targets = [];\n\n for (const snapTarget of options.targets) {\n let target;\n\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n if ('width' in target && 'height' in target) {\n target.x = target.width;\n target.y = target.height;\n }\n\n arg.options.targets.push(target);\n }\n\n snap.set(arg);\n },\n\n modifyCoords: function (arg) {\n const { options } = arg;\n\n arg.options = utils.extend({}, options);\n arg.options.enabled = options.enabled;\n arg.options.relativePoints = [null];\n\n snap.modifyCoords(arg);\n },\n};\n\nmodifiers.snapSize = snapSize;\nmodifiers.names.push('snapSize');\n\ndefaultOptions.perAction.snapSize = snapSize.defaults;\nresize.defaults.snapSize = snapSize.defaults;\n\nmodule.exports = snapSize;\n","const pointerUtils = require('../utils/pointerUtils');\n\nmodule.exports = class PointerEvent {\n constructor (type, pointer, event, eventTarget, interaction) {\n pointerUtils.pointerExtend(this, event);\n\n if (event !== pointer) {\n pointerUtils.pointerExtend(this, pointer);\n }\n\n this.interaction = interaction;\n\n this.timeStamp = new Date().getTime();\n this.originalEvent = event;\n this.type = type;\n this.pointerId = pointerUtils.getPointerId(pointer);\n this.pointerType = pointerUtils.getPointerType(pointer, interaction);\n this.target = eventTarget;\n this.currentTarget = null;\n\n if (type === 'tap') {\n const pointerIndex = interaction.getPointerIndex(pointer);\n this.dt = this.timeStamp - interaction.downTimes[pointerIndex];\n\n const interval = this.timeStamp - interaction.tapTime;\n\n this.double = !!(interaction.prevTap\n && interaction.prevTap.type !== 'doubletap'\n && interaction.prevTap.target === this.target\n && interval < 500);\n }\n else if (type === 'doubletap') {\n this.dt = pointer.timeStamp - interaction.tapTime;\n }\n }\n\n subtractOrigin ({ x: originX, y: originY }) {\n this.pageX -= originX;\n this.pageY -= originY;\n this.clientX -= originX;\n this.clientY -= originY;\n\n return this;\n }\n\n addOrigin ({ x: originX, y: originY }) {\n this.pageX += originX;\n this.pageY += originY;\n this.clientX += originX;\n this.clientY += originY;\n\n return this;\n }\n\n preventDefault () {\n this.originalEvent.preventDefault();\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n};\n","const PointerEvent = require('./PointerEvent');\nconst Interaction = require('../Interaction');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst defaults = require('../defaultOptions');\nconst signals = require('../utils/Signals').new();\nconst { filter } = require('../utils/arr');\n\nconst simpleSignals = [ 'down', 'up', 'cancel' ];\nconst simpleEvents = [ 'down', 'up', 'cancel' ];\n\nconst pointerEvents = {\n PointerEvent,\n fire,\n collectEventTargets,\n signals,\n defaults: {\n holdDuration: 600,\n ignoreFrom : null,\n allowFrom : null,\n origin : { x: 0, y: 0 },\n },\n types: [\n 'down',\n 'move',\n 'up',\n 'cancel',\n 'tap',\n 'doubletap',\n 'hold',\n ],\n};\n\nfunction fire (arg) {\n const {\n interaction, pointer, event, eventTarget,\n type = arg.pointerEvent.type,\n targets = collectEventTargets(arg),\n pointerEvent = new PointerEvent(type, pointer, event, eventTarget, interaction),\n } = arg;\n\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n targets,\n type,\n pointerEvent,\n };\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n\n for (const prop in target.props || {}) {\n pointerEvent[prop] = target.props[prop];\n }\n\n const origin = utils.getOriginXY(target.eventable, target.element);\n\n pointerEvent.subtractOrigin(origin);\n pointerEvent.eventable = target.eventable;\n pointerEvent.currentTarget = target.element;\n\n target.eventable.fire(pointerEvent);\n\n pointerEvent.addOrigin(origin);\n\n if (pointerEvent.immediatePropagationStopped\n || (pointerEvent.propagationStopped\n && (i + 1) < targets.length && targets[i + 1].element !== pointerEvent.currentTarget)) {\n break;\n }\n }\n\n signals.fire('fired', signalArg);\n\n if (type === 'tap') {\n // if pointerEvent should make a double tap, create and fire a doubletap\n // PointerEvent and use that as the prevTap\n const prevTap = pointerEvent.double\n ? fire({\n interaction, pointer, event, eventTarget,\n type: 'doubletap',\n })\n : pointerEvent;\n\n interaction.prevTap = prevTap;\n interaction.tapTime = prevTap.timeStamp;\n }\n\n return pointerEvent;\n}\n\nfunction collectEventTargets ({ interaction, pointer, event, eventTarget, type }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n // do not fire a tap event if the pointer was moved before being lifted\n if (type === 'tap' && (interaction.pointerWasMoved\n // or if the pointerup target is different to the pointerdown target\n || !(interaction.downTargets[pointerIndex] && interaction.downTargets[pointerIndex] === eventTarget))) {\n return [];\n }\n\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n path,\n targets: [],\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (type === 'hold') {\n signalArg.targets = filter(signalArg.targets, target =>\n target.eventable.options.holdDuration === interaction.holdTimers[pointerIndex].duration);\n }\n\n return signalArg.targets;\n}\n\nInteraction.signals.on('update-pointer-down', function ({ interaction, pointerIndex }) {\n interaction.holdTimers[pointerIndex] = { duration: Infinity, timeout: null };\n});\n\nInteraction.signals.on('remove-pointer', function ({ interaction, pointerIndex }) {\n interaction.holdTimers.splice(pointerIndex, 1);\n});\n\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget, duplicateMove }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n if (!duplicateMove && (!interaction.pointerIsDown || interaction.pointerWasMoved)) {\n if (interaction.pointerIsDown) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n\n fire({\n interaction, pointer, event, eventTarget,\n type: 'move',\n });\n }\n});\n\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget, pointerIndex }) {\n // copy event to be used in timeout for IE8\n const eventCopy = browser.isIE8? utils.extend({}, event) : event;\n\n const timer = interaction.holdTimers[pointerIndex];\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'hold',\n targets: [],\n path,\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (!signalArg.targets.length) { return; }\n\n let minDuration = Infinity;\n\n for (let i = 0; i < signalArg.targets.length; i++) {\n const target = signalArg.targets[i];\n const holdDuration = target.eventable.options.holdDuration;\n\n if (holdDuration < minDuration) {\n minDuration = holdDuration;\n }\n }\n\n timer.duration = minDuration;\n timer.timeout = setTimeout(function () {\n fire({\n interaction, eventCopy, eventTarget,\n pointer: browser.isIE8? eventCopy : pointer,\n type: 'hold',\n });\n }, minDuration);\n});\n\nInteraction.signals.on('up', ({ interaction, pointer, event, eventTarget }) => {\n if (!interaction.pointerWasMoved) {\n fire({ interaction, eventTarget, pointer, event, type: 'tap' });\n }\n});\n\n['up', 'cancel'].forEach(function (signalName) {\n Interaction.signals.on(signalName, function ({ interaction, pointerIndex }) {\n if (interaction.holdTimers[pointerIndex]) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n });\n});\n\nfunction createSignalListener (type) {\n return function ({ interaction, pointer, event, eventTarget }) {\n fire({ interaction, eventTarget, pointer, event, type });\n };\n}\n\nfor (let i = 0; i < simpleSignals.length; i++) {\n Interaction.signals.on(simpleSignals[i], createSignalListener(simpleEvents[i]));\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.prevTap = null; // the most recent tap event on this interaction\n interaction.tapTime = 0; // time of the most recent tap event\n interaction.holdTimers = []; // [{ duration, timeout }]\n});\n\ndefaults.pointerEvents = pointerEvents.defaults;\nmodule.exports = pointerEvents;\n","const pointerEvents = require('./base');\nconst Interaction = require('../Interaction');\n\npointerEvents.signals.on('new', onNew);\npointerEvents.signals.on('fired', onFired);\n\nfor (const signal of ['move', 'up', 'cancel', 'endall']) {\n Interaction.signals.on(signal, endHoldRepeat);\n}\n\nfunction onNew ({ pointerEvent }) {\n if (pointerEvent.type !== 'hold') { return; }\n\n pointerEvent.count = (pointerEvent.count || 0) + 1;\n}\n\nfunction onFired ({ interaction, pointerEvent, eventTarget, targets }) {\n if (pointerEvent.type !== 'hold' || !targets.length) { return; }\n\n // get the repeat interval from the first eventable\n const interval = targets[0].eventable.options.holdRepeatInterval;\n\n // don't repeat if the interval is 0 or less\n if (interval <= 0) { return; }\n\n // set a timeout to fire the holdrepeat event\n interaction.holdIntervalHandle = setTimeout(function () {\n pointerEvents.fire({\n interaction,\n eventTarget,\n type: 'hold',\n pointer: pointerEvent,\n event: pointerEvent,\n });\n }, interval);\n}\n\nfunction endHoldRepeat ({ interaction }) {\n // set the interaction's holdStopTime property\n // to stop further holdRepeat events\n if (interaction.holdIntervalHandle) {\n clearInterval(interaction.holdIntervalHandle);\n interaction.holdIntervalHandle = null;\n }\n}\n\n// don't repeat by default\npointerEvents.defaults.holdRepeatInterval = 0;\npointerEvents.types.push('holdrepeat');\n\nmodule.exports = {\n onNew,\n onFired,\n endHoldRepeat,\n};\n","const pointerEvents = require('./base');\nconst Interactable = require('../Interactable');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\nconst scope = require('../scope');\nconst extend = require('../utils/extend');\nconst { merge } = require('../utils/arr');\n\npointerEvents.signals.on('collect-targets', function ({ targets, element, type, eventTarget }) {\n function collectSelectors (interactable, selector, context) {\n const els = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && is.element(element)\n && domUtils.matchesSelector(element, selector, els)\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n const interactable = scope.interactables.get(element);\n\n if (interactable) {\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n scope.interactables.forEachSelector(collectSelectors, element);\n});\n\nInteractable.signals.on('new', function ({ interactable }) {\n interactable.events.getRect = function (element) {\n return interactable.getRect(element);\n };\n});\n\nInteractable.signals.on('set', function ({ interactable, options }) {\n extend(interactable.events.options, pointerEvents.defaults);\n extend(interactable.events.options, options);\n});\n\nmerge(Interactable.eventTypes, pointerEvents.types);\n\nInteractable.prototype.pointerEvents = function (options) {\n extend(this.events.options, options);\n\n return this;\n};\n\nconst __backCompatOption = Interactable.prototype._backCompatOption;\n\nInteractable.prototype._backCompatOption = function (optionName, newValue) {\n const ret = __backCompatOption.call(this, optionName, newValue);\n\n if (ret === this) {\n this.events.options[optionName] = newValue;\n }\n\n return ret;\n};\n\nInteractable.settingsMethods.push('pointerEvents');\n","const utils = require('./utils');\nconst events = require('./utils/events');\nconst signals = require('./utils/Signals').new();\n\nconst scope = {\n signals,\n events,\n utils,\n\n // main document\n document: require('./utils/domObjects').document,\n // all documents being listened to\n documents: [],\n\n addDocument: function (doc, win) {\n // do nothing if document is already known\n if (utils.contains(scope.documents, doc)) { return false; }\n\n win = win || scope.getWindow(doc);\n\n scope.documents.push(doc);\n events.documents.push(doc);\n\n // don't add an unload event for the main document\n // so that the page may be cached in browser history\n if (doc !== scope.document) {\n events.add(win, 'unload', scope.onWindowUnload);\n }\n\n signals.fire('add-document', { doc, win });\n },\n\n removeDocument: function (doc, win) {\n const index = utils.indexOf(scope.documents, doc);\n\n win = win || scope.getWindow(doc);\n\n events.remove(win, 'unload', scope.onWindowUnload);\n\n scope.documents.splice(index, 1);\n events.documents.splice(index, 1);\n\n signals.fire('remove-document', { win, doc });\n },\n\n onWindowUnload: function () {\n scope.removeDocument(this.document, this);\n },\n};\n\nmodule.exports = scope;\n","const { indexOf } = require('./arr');\n\nclass Signals {\n constructor () {\n this.listeners = {\n // signalName: [listeners],\n };\n }\n\n on (name, listener) {\n if (!this.listeners[name]) {\n this.listeners[name] = [listener];\n return;\n }\n\n this.listeners[name].push(listener);\n }\n\n off (name, listener) {\n if (!this.listeners[name]) { return; }\n\n const index = indexOf(this.listeners[name], listener);\n\n if (index !== -1) {\n this.listeners[name].splice(index, 1);\n }\n }\n\n fire (name, arg) {\n const targetListeners = this.listeners[name];\n\n if (!targetListeners) { return; }\n\n for (let i = 0; i < targetListeners.length; i++) {\n if (targetListeners[i](arg, name) === false) {\n return;\n }\n }\n }\n}\n\nSignals.new = function () {\n return new Signals();\n};\n\nmodule.exports = Signals;\n","function indexOf (array, target) {\n for (let i = 0, len = array.length; i < len; i++) {\n if (array[i] === target) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction contains (array, target) {\n return indexOf(array, target) !== -1;\n}\n\nfunction merge (target, source) {\n for (let i = 0; i < source.length; i++) {\n target.push(source[i]);\n }\n\n return target;\n}\n\nfunction filter (array, test) {\n const result = [];\n\n for (let i = 0; i < array.length; i++) {\n if (test(array[i])) {\n result.push(array[i]);\n }\n }\n\n return result;\n}\n\nmodule.exports = {\n indexOf,\n contains,\n merge,\n filter,\n};\n","const { window } = require('./window');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst Element = domObjects.Element;\nconst navigator = window.navigator;\n\nconst browser = {\n // Does the browser support touch input?\n supportsTouch: !!(('ontouchstart' in window) || is.function(window.DocumentTouch)\n && domObjects.document instanceof window.DocumentTouch),\n\n // Does the browser support PointerEvents\n supportsPointerEvent: !!domObjects.PointerEvent,\n\n isIE8: ('attachEvent' in window) && !('addEventListener' in window),\n\n // Opera Mobile must be handled differently\n isOperaMobile: (navigator.appName === 'Opera'\n && browser.supportsTouch\n && navigator.userAgent.match('Presto')),\n\n // scrolling doesn't change the result of getClientRects on iOS 7\n isIOS7: (/iP(hone|od|ad)/.test(navigator.platform)\n && /OS 7[^\\d]/.test(navigator.appVersion)),\n\n isIe9OrOlder: /MSIE (8|9)/.test(navigator.userAgent),\n\n // prefix matchesSelector\n prefixedMatchesSelector: 'matches' in Element.prototype\n ? 'matches': 'webkitMatchesSelector' in Element.prototype\n ? 'webkitMatchesSelector': 'mozMatchesSelector' in Element.prototype\n ? 'mozMatchesSelector': 'oMatchesSelector' in Element.prototype\n ? 'oMatchesSelector': 'msMatchesSelector',\n\n useMatchesSelectorPolyfill: false,\n\n pEventTypes: (domObjects.PointerEvent\n ? (domObjects.PointerEvent === window.MSPointerEvent\n ? {\n up: 'MSPointerUp',\n down: 'MSPointerDown',\n over: 'mouseover',\n out: 'mouseout',\n move: 'MSPointerMove',\n cancel: 'MSPointerCancel',\n }\n : {\n up: 'pointerup',\n down: 'pointerdown',\n over: 'pointerover',\n out: 'pointerout',\n move: 'pointermove',\n cancel: 'pointercancel',\n })\n : null),\n\n // because Webkit and Opera still use 'mousewheel' event type\n wheelEvent: 'onmousewheel' in domObjects.document? 'mousewheel': 'wheel',\n\n};\n\nbrowser.useMatchesSelectorPolyfill = !is.function(Element.prototype[browser.prefixedMatchesSelector]);\n\nmodule.exports = browser;\n","const domObjects = {};\nconst win = require('./window').window;\n\nfunction blank () {}\n\ndomObjects.document = win.document;\ndomObjects.DocumentFragment = win.DocumentFragment || blank;\ndomObjects.SVGElement = win.SVGElement || blank;\ndomObjects.SVGSVGElement = win.SVGSVGElement || blank;\ndomObjects.SVGElementInstance = win.SVGElementInstance || blank;\ndomObjects.Element = win.Element || blank;\ndomObjects.HTMLElement = win.HTMLElement || domObjects.Element;\n\ndomObjects.Event = win.Event;\ndomObjects.Touch = win.Touch || blank;\ndomObjects.PointerEvent = (win.PointerEvent || win.MSPointerEvent);\n\nmodule.exports = domObjects;\n","const win = require('./window');\nconst browser = require('./browser');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst domUtils = {\n nodeContains: function (parent, child) {\n while (child) {\n if (child === parent) {\n return true;\n }\n\n child = child.parentNode;\n }\n\n return false;\n },\n\n closest: function (element, selector) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) { return element; }\n\n element = domUtils.parentNode(element);\n }\n\n return null;\n },\n\n parentNode: function (node) {\n let parent = node.parentNode;\n\n if (is.docFrag(parent)) {\n // skip past #shado-root fragments\n while ((parent = parent.host) && is.docFrag(parent)) {\n continue;\n }\n\n return parent;\n }\n\n return parent;\n },\n\n // taken from http://tanalin.com/en/blog/2012/12/matches-selector-ie8/ and modified\n matchesSelectorPolyfill: browser.useMatchesSelectorPolyfill\n ? function (element, selector, elems) {\n elems = elems || element.parentNode.querySelectorAll(selector);\n\n for (let i = 0, len = elems.length; i < len; i++) {\n if (elems[i] === element) {\n return true;\n }\n }\n\n return false;\n }\n : null,\n\n matchesSelector: function (element, selector, nodeList) {\n if (browser.useMatchesSelectorPolyfill) {\n return domUtils.matchesSelectorPolyfill(element, selector, nodeList);\n }\n\n // remove /deep/ from selectors if shadowDOM polyfill is used\n if (win.window !== win.realWindow) {\n selector = selector.replace(/\\/deep\\//g, ' ');\n }\n\n return element[browser.prefixedMatchesSelector](selector);\n },\n\n // Test for the element that's \"above\" all other qualifiers\n indexOfDeepestElement: function (elements) {\n let deepestZoneParents = [];\n let dropzoneParents = [];\n let dropzone;\n let deepestZone = elements[0];\n let index = deepestZone? 0: -1;\n let parent;\n let child;\n let i;\n let n;\n\n for (i = 1; i < elements.length; i++) {\n dropzone = elements[i];\n\n // an element might belong to multiple selector dropzones\n if (!dropzone || dropzone === deepestZone) {\n continue;\n }\n\n if (!deepestZone) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n // check if the deepest or current are document.documentElement or document.rootElement\n // - if the current dropzone is, do nothing and continue\n if (dropzone.parentNode === dropzone.ownerDocument) {\n continue;\n }\n // - if deepest is, update with the current dropzone and continue to next\n else if (deepestZone.parentNode === dropzone.ownerDocument) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n if (!deepestZoneParents.length) {\n parent = deepestZone;\n while (parent.parentNode && parent.parentNode !== parent.ownerDocument) {\n deepestZoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n }\n\n // if this element is an svg element and the current deepest is\n // an HTMLElement\n if (deepestZone instanceof domObjects.HTMLElement\n && dropzone instanceof domObjects.SVGElement\n && !(dropzone instanceof domObjects.SVGSVGElement)) {\n\n if (dropzone === deepestZone.parentNode) {\n continue;\n }\n\n parent = dropzone.ownerSVGElement;\n }\n else {\n parent = dropzone;\n }\n\n dropzoneParents = [];\n\n while (parent.parentNode !== parent.ownerDocument) {\n dropzoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n\n n = 0;\n\n // get (position of last common ancestor) + 1\n while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) {\n n++;\n }\n\n const parents = [\n dropzoneParents[n - 1],\n dropzoneParents[n],\n deepestZoneParents[n],\n ];\n\n child = parents[0].lastChild;\n\n while (child) {\n if (child === parents[1]) {\n deepestZone = dropzone;\n index = i;\n deepestZoneParents = [];\n\n break;\n }\n else if (child === parents[2]) {\n break;\n }\n\n child = child.previousSibling;\n }\n }\n\n return index;\n },\n\n matchesUpTo: function (element, selector, limit) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) {\n return true;\n }\n\n element = domUtils.parentNode(element);\n\n if (element === limit) {\n return domUtils.matchesSelector(element, selector);\n }\n }\n\n return false;\n },\n\n getActualElement: function (element) {\n return (element instanceof domObjects.SVGElementInstance\n ? element.correspondingUseElement\n : element);\n },\n\n getScrollXY: function (relevantWindow) {\n relevantWindow = relevantWindow || win.window;\n return {\n x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft,\n y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop,\n };\n },\n\n getElementClientRect: function (element) {\n const clientRect = (element instanceof domObjects.SVGElement\n ? element.getBoundingClientRect()\n : element.getClientRects()[0]);\n\n return clientRect && {\n left : clientRect.left,\n right : clientRect.right,\n top : clientRect.top,\n bottom: clientRect.bottom,\n width : clientRect.width || clientRect.right - clientRect.left,\n height: clientRect.height || clientRect.bottom - clientRect.top,\n };\n },\n\n getElementRect: function (element) {\n const clientRect = domUtils.getElementClientRect(element);\n\n if (!browser.isIOS7 && clientRect) {\n const scroll = domUtils.getScrollXY(win.getWindow(element));\n\n clientRect.left += scroll.x;\n clientRect.right += scroll.x;\n clientRect.top += scroll.y;\n clientRect.bottom += scroll.y;\n }\n\n return clientRect;\n },\n\n getPath: function (element) {\n const path = [];\n\n while (element) {\n path.push(element);\n element = domUtils.parentNode(element);\n }\n\n return path;\n },\n\n trySelector: value => {\n if (!is.string(value)) { return false; }\n\n // an exception will be raised if it is invalid\n domObjects.document.querySelector(value);\n return true;\n },\n};\n\nmodule.exports = domUtils;\n","const is = require('./is');\nconst domUtils = require('./domUtils');\nconst pExtend = require('./pointerExtend');\n\nconst { window, getWindow } = require('./window');\nconst { indexOf, contains } = require('./arr');\n\nconst useAttachEvent = ('attachEvent' in window) && !('addEventListener' in window);\nconst addEvent = useAttachEvent? 'attachEvent': 'addEventListener';\nconst removeEvent = useAttachEvent? 'detachEvent': 'removeEventListener';\nconst on = useAttachEvent? 'on': '';\n\nconst elements = [];\nconst targets = [];\nconst attachedListeners = [];\n\n// {\n// type: {\n// selectors: ['selector', ...],\n// contexts : [document, ...],\n// listeners: [[listener, capture, passive], ...]\n// }\n// }\nconst delegatedEvents = {};\n\nconst documents = [];\n\nconst supportsOptions = !useAttachEvent && (() => {\n let supported = false;\n\n window.document.createElement('div').addEventListener('test', null, {\n get capture () { supported = true; },\n });\n\n return supported;\n})();\n\nfunction add (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n let elementIndex = indexOf(elements, element);\n let target = targets[elementIndex];\n\n if (!target) {\n target = {\n events: {},\n typeCount: 0,\n };\n\n elementIndex = elements.push(element) - 1;\n targets.push(target);\n\n attachedListeners.push(useAttachEvent\n ? {\n supplied: [],\n wrapped : [],\n useCount: [],\n }\n : null);\n }\n\n if (!target.events[type]) {\n target.events[type] = [];\n target.typeCount++;\n }\n\n if (!contains(target.events[type], listener)) {\n let ret;\n\n if (useAttachEvent) {\n const { supplied, wrapped, useCount } = attachedListeners[elementIndex];\n const listenerIndex = indexOf(supplied, listener);\n\n const wrappedListener = wrapped[listenerIndex] || function (event) {\n if (!event.immediatePropagationStopped) {\n event.target = event.srcElement;\n event.currentTarget = element;\n\n event.preventDefault = event.preventDefault || preventDef;\n event.stopPropagation = event.stopPropagation || stopProp;\n event.stopImmediatePropagation = event.stopImmediatePropagation || stopImmProp;\n\n if (/mouse|click/.test(event.type)) {\n event.pageX = event.clientX + getWindow(element).document.documentElement.scrollLeft;\n event.pageY = event.clientY + getWindow(element).document.documentElement.scrollTop;\n }\n\n listener(event);\n }\n };\n\n ret = element[addEvent](on + type, wrappedListener, !!options.capture);\n\n if (listenerIndex === -1) {\n supplied.push(listener);\n wrapped.push(wrappedListener);\n useCount.push(1);\n }\n else {\n useCount[listenerIndex]++;\n }\n }\n else {\n ret = element[addEvent](type, listener, supportsOptions? options : !!options.capture);\n }\n target.events[type].push(listener);\n\n return ret;\n }\n}\n\nfunction remove (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const elementIndex = indexOf(elements, element);\n const target = targets[elementIndex];\n\n if (!target || !target.events) {\n return;\n }\n\n let wrappedListener = listener;\n let listeners;\n let listenerIndex;\n\n if (useAttachEvent) {\n listeners = attachedListeners[elementIndex];\n listenerIndex = indexOf(listeners.supplied, listener);\n wrappedListener = listeners.wrapped[listenerIndex];\n }\n\n if (type === 'all') {\n for (type in target.events) {\n if (target.events.hasOwnProperty(type)) {\n remove(element, type, 'all');\n }\n }\n return;\n }\n\n if (target.events[type]) {\n const len = target.events[type].length;\n\n if (listener === 'all') {\n for (let i = 0; i < len; i++) {\n remove(element, type, target.events[type][i], options);\n }\n return;\n }\n else {\n for (let i = 0; i < len; i++) {\n if (target.events[type][i] === listener) {\n element[removeEvent](on + type, wrappedListener, supportsOptions? options : !!options.capture);\n target.events[type].splice(i, 1);\n\n if (useAttachEvent && listeners) {\n listeners.useCount[listenerIndex]--;\n if (listeners.useCount[listenerIndex] === 0) {\n listeners.supplied.splice(listenerIndex, 1);\n listeners.wrapped.splice(listenerIndex, 1);\n listeners.useCount.splice(listenerIndex, 1);\n }\n }\n\n break;\n }\n }\n }\n\n if (target.events[type] && target.events[type].length === 0) {\n target.events[type] = null;\n target.typeCount--;\n }\n }\n\n if (!target.typeCount) {\n targets.splice(elementIndex, 1);\n elements.splice(elementIndex, 1);\n attachedListeners.splice(elementIndex, 1);\n }\n}\n\nfunction addDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n if (!delegatedEvents[type]) {\n delegatedEvents[type] = {\n selectors: [],\n contexts : [],\n listeners: [],\n };\n\n // add delegate listener functions\n for (let i = 0; i < documents.length; i++) {\n add(documents[i], type, delegateListener);\n add(documents[i], type, delegateUseCapture, true);\n }\n }\n\n const delegated = delegatedEvents[type];\n let index;\n\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n break;\n }\n }\n\n if (index === -1) {\n index = delegated.selectors.length;\n\n delegated.selectors.push(selector);\n delegated.contexts .push(context);\n delegated.listeners.push([]);\n }\n\n // keep listener and capture and passive flags\n delegated.listeners[index].push([listener, !!options.capture, options.passive]);\n}\n\nfunction removeDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const delegated = delegatedEvents[type];\n let matchFound = false;\n let index;\n\n if (!delegated) { return; }\n\n // count from last index of delegated to 0\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n // look for matching selector and context Node\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n\n const listeners = delegated.listeners[index];\n\n // each item of the listeners array is an array: [function, capture, passive]\n for (let i = listeners.length - 1; i >= 0; i--) {\n const [fn, capture, passive] = listeners[i];\n\n // check if the listener functions and capture and passive flags match\n if (fn === listener && capture === !!options.capture && passive === options.passive) {\n // remove the listener from the array of listeners\n listeners.splice(i, 1);\n\n // if all listeners for this interactable have been removed\n // remove the interactable from the delegated arrays\n if (!listeners.length) {\n delegated.selectors.splice(index, 1);\n delegated.contexts .splice(index, 1);\n delegated.listeners.splice(index, 1);\n\n // remove delegate function from context\n remove(context, type, delegateListener);\n remove(context, type, delegateUseCapture, true);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegatedEvents[type] = null;\n }\n }\n\n // only remove one listener\n matchFound = true;\n break;\n }\n }\n\n if (matchFound) { break; }\n }\n }\n}\n\n// bound to the interactable context when a DOM event\n// listener is added to a selector interactable\nfunction delegateListener (event, optionalArg) {\n const options = getOptions(optionalArg);\n const fakeEvent = {};\n const delegated = delegatedEvents[event.type];\n const eventTarget = (domUtils.getActualElement(event.path\n ? event.path[0]\n : event.target));\n let element = eventTarget;\n\n // duplicate the event so that currentTarget can be changed\n pExtend(fakeEvent, event);\n\n fakeEvent.originalEvent = event;\n fakeEvent.preventDefault = preventOriginalDefault;\n\n // climb up document tree looking for selector matches\n while (is.element(element)) {\n for (let i = 0; i < delegated.selectors.length; i++) {\n const selector = delegated.selectors[i];\n const context = delegated.contexts[i];\n\n if (domUtils.matchesSelector(element, selector)\n && domUtils.nodeContains(context, eventTarget)\n && domUtils.nodeContains(context, element)) {\n\n const listeners = delegated.listeners[i];\n\n fakeEvent.currentTarget = element;\n\n for (let j = 0; j < listeners.length; j++) {\n const [fn, capture, passive] = listeners[j];\n\n if (capture === !!options.capture && passive === options.passive) {\n fn(fakeEvent);\n }\n }\n }\n }\n\n element = domUtils.parentNode(element);\n }\n}\n\nfunction delegateUseCapture (event) {\n return delegateListener.call(this, event, true);\n}\n\nfunction preventDef () {\n this.returnValue = false;\n}\n\nfunction preventOriginalDefault () {\n this.originalEvent.preventDefault();\n}\n\nfunction stopProp () {\n this.cancelBubble = true;\n}\n\nfunction stopImmProp () {\n this.cancelBubble = true;\n this.immediatePropagationStopped = true;\n}\n\nfunction getOptions (param) {\n return is.object(param)? param : { capture: param };\n}\n\nmodule.exports = {\n add,\n remove,\n\n addDelegate,\n removeDelegate,\n\n delegateListener,\n delegateUseCapture,\n delegatedEvents,\n documents,\n\n useAttachEvent,\n supportsOptions,\n\n _elements: elements,\n _targets: targets,\n _attachedListeners: attachedListeners,\n};\n","module.exports = function extend (dest, source) {\n for (const prop in source) {\n dest[prop] = source[prop];\n }\n return dest;\n};\n","const {\n resolveRectLike,\n rectToXY,\n} = require('./rect');\n\nmodule.exports = function (target, element, action) {\n const actionOptions = target.options[action];\n const actionOrigin = actionOptions && actionOptions.origin;\n const origin = actionOrigin || target.options.origin;\n\n const originRect = resolveRectLike(origin, target, element, [target && element]);\n\n return rectToXY(originRect) || { x: 0, y: 0 };\n};\n","module.exports = (x, y) => Math.sqrt(x * x + y * y);\n","const extend = require('./extend');\nconst win = require('./window');\n\nconst utils = {\n warnOnce: function (method, message) {\n let warned = false;\n\n return function () {\n if (!warned) {\n win.window.console.warn(message);\n warned = true;\n }\n\n return method.apply(this, arguments);\n };\n },\n\n // http://stackoverflow.com/a/5634528/2280888\n _getQBezierValue: function (t, p1, p2, p3) {\n const iT = 1 - t;\n return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3;\n },\n\n getQuadraticCurvePoint: function (startX, startY, cpX, cpY, endX, endY, position) {\n return {\n x: utils._getQBezierValue(position, startX, cpX, endX),\n y: utils._getQBezierValue(position, startY, cpY, endY),\n };\n },\n\n // http://gizma.com/easing/\n easeOutQuad: function (t, b, c, d) {\n t /= d;\n return -c * t*(t-2) + b;\n },\n\n copyAction: function (dest, src) {\n dest.name = src.name;\n dest.axis = src.axis;\n dest.edges = src.edges;\n\n return dest;\n },\n\n is : require('./is'),\n extend : extend,\n hypot : require('./hypot'),\n getOriginXY: require('./getOriginXY'),\n};\n\nextend(utils, require('./arr'));\nextend(utils, require('./domUtils'));\nextend(utils, require('./pointerUtils'));\nextend(utils, require('./rect'));\n\nmodule.exports = utils;\n","const scope = require('../scope');\nconst utils = require('./index');\nconst browser = require('./browser');\n\nconst finder = {\n methodOrder: [ 'simulationResume', 'mouse', 'hasPointer', 'idle' ],\n\n search: function (pointer, eventType, eventTarget) {\n const mouseEvent = (/mouse/i.test(pointer.pointerType || eventType)\n // MSPointerEvent.MSPOINTER_TYPE_MOUSE\n || pointer.pointerType === 4);\n const pointerId = utils.getPointerId(pointer);\n const details = { pointer, pointerId, mouseEvent, eventType, eventTarget };\n\n for (const method of finder.methodOrder) {\n const interaction = finder[method](details);\n\n if (interaction) {\n return interaction;\n }\n }\n },\n\n // try to resume simulation with a new pointer\n simulationResume: function ({ mouseEvent, eventType, eventTarget }) {\n if (!/down|start/i.test(eventType)) {\n return null;\n }\n\n for (const interaction of scope.interactions) {\n let element = eventTarget;\n\n if (interaction.simulation && interaction.simulation.allowResume\n && (interaction.mouse === mouseEvent)) {\n while (element) {\n // if the element is the interaction element\n if (element === interaction.element) {\n return interaction;\n }\n element = utils.parentNode(element);\n }\n }\n }\n\n return null;\n },\n\n // if it's a mouse interaction\n mouse: function ({ pointerId, mouseEvent, eventType }) {\n if (!mouseEvent && (browser.supportsTouch || browser.supportsPointerEvent)) {\n return null;\n }\n\n let firstNonActive;\n\n for (const interaction of scope.interactions) {\n if (interaction.mouse) {\n // if it's a down event, skip interactions with running simulations\n if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; }\n\n // if the interaction is active, return it immediately\n if (interaction.interacting()) {\n return interaction;\n }\n // otherwise save it and look for another active interaction\n else if (!firstNonActive) {\n firstNonActive = interaction;\n }\n }\n }\n\n // if no active mouse interaction was found use the first inactive mouse\n // interaction\n if (firstNonActive) {\n return firstNonActive;\n }\n\n // Find any interaction specifically for mouse.\n // ignore the interaction if the eventType is a mousedown, and a simulation\n // is active\n for (const interaction of scope.interactions) {\n if (interaction.mouse && !(/down/.test(eventType) && interaction.simulation)) {\n return interaction;\n }\n }\n\n return null;\n },\n\n // get interaction that has this pointer\n hasPointer: function ({ pointerId }) {\n for (const interaction of scope.interactions) {\n if (utils.contains(interaction.pointerIds, pointerId)) {\n return interaction;\n }\n }\n },\n\n // get first idle interaction\n idle: function ({ mouseEvent }) {\n for (const interaction of scope.interactions) {\n // if there's already a pointer held down\n if (interaction.pointerIds.length === 1) {\n const target = interaction.target;\n // don't add this pointer if there is a target interactable and it\n // isn't gesturable\n if (target && !target.options.gesture.enabled) {\n continue;\n }\n }\n // maximum of 2 pointers per interaction\n else if (interaction.pointerIds.length >= 2) {\n continue;\n }\n\n if (!interaction.interacting() && (mouseEvent === interaction.mouse)) {\n return interaction;\n }\n }\n\n return null;\n },\n};\n\nmodule.exports = finder;\n","const win = require('./window');\nconst isWindow = require('./isWindow');\n\nconst is = {\n array : () => {},\n\n window : thing => thing === win.window || isWindow(thing),\n\n docFrag : thing => is.object(thing) && thing.nodeType === 11,\n\n object : thing => !!thing && (typeof thing === 'object'),\n\n function: thing => typeof thing === 'function',\n\n number : thing => typeof thing === 'number' ,\n\n bool : thing => typeof thing === 'boolean' ,\n\n string : thing => typeof thing === 'string' ,\n\n element: thing => {\n if (!thing || (typeof thing !== 'object')) { return false; }\n\n const _window = win.getWindow(thing) || win.window;\n\n return (/object|function/.test(typeof _window.Element)\n ? thing instanceof _window.Element //DOM2\n : thing.nodeType === 1 && typeof thing.nodeName === 'string');\n },\n};\n\nis.array = thing => (is.object(thing)\n && (typeof thing.length !== 'undefined')\n && is.function(thing.splice));\n\nmodule.exports = is;\n","module.exports = (thing) => !!(thing && thing.Window) && (thing instanceof thing.Window);\n","function pointerExtend (dest, source) {\n for (const prop in source) {\n const prefixedPropREs = module.exports.prefixedPropREs;\n let deprecated = false;\n\n // skip deprecated prefixed properties\n for (const vendor in prefixedPropREs) {\n if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) {\n deprecated = true;\n break;\n }\n }\n\n if (!deprecated && typeof source[prop] !== 'function') {\n dest[prop] = source[prop];\n }\n }\n return dest;\n}\n\npointerExtend.prefixedPropREs = {\n webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/,\n};\n\nmodule.exports = pointerExtend;\n","const hypot = require('./hypot');\nconst browser = require('./browser');\nconst dom = require('./domObjects');\nconst domUtils = require('./domUtils');\nconst is = require('./is');\nconst pointerExtend = require('./pointerExtend');\n\nconst pointerUtils = {\n copyCoords: function (dest, src) {\n dest.page = dest.page || {};\n dest.page.x = src.page.x;\n dest.page.y = src.page.y;\n\n dest.client = dest.client || {};\n dest.client.x = src.client.x;\n dest.client.y = src.client.y;\n\n dest.timeStamp = src.timeStamp;\n },\n\n setCoordDeltas: function (targetObj, prev, cur) {\n targetObj.page.x = cur.page.x - prev.page.x;\n targetObj.page.y = cur.page.y - prev.page.y;\n targetObj.client.x = cur.client.x - prev.client.x;\n targetObj.client.y = cur.client.y - prev.client.y;\n targetObj.timeStamp = cur.timeStamp - prev.timeStamp;\n\n // set pointer velocity\n const dt = Math.max(targetObj.timeStamp / 1000, 0.001);\n\n targetObj.page.speed = hypot(targetObj.page.x, targetObj.page.y) / dt;\n targetObj.page.vx = targetObj.page.x / dt;\n targetObj.page.vy = targetObj.page.y / dt;\n\n targetObj.client.speed = hypot(targetObj.client.x, targetObj.page.y) / dt;\n targetObj.client.vx = targetObj.client.x / dt;\n targetObj.client.vy = targetObj.client.y / dt;\n },\n\n isNativePointer: function (pointer) {\n return (pointer instanceof dom.Event || pointer instanceof dom.Touch);\n },\n\n // Get specified X/Y coords for mouse or event.touches[0]\n getXY: function (type, pointer, xy) {\n xy = xy || {};\n type = type || 'page';\n\n xy.x = pointer[type + 'X'];\n xy.y = pointer[type + 'Y'];\n\n return xy;\n },\n\n getPageXY: function (pointer, page) {\n page = page || {};\n\n // Opera Mobile handles the viewport and scrolling oddly\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n pointerUtils.getXY('screen', pointer, page);\n\n page.x += window.scrollX;\n page.y += window.scrollY;\n }\n else {\n pointerUtils.getXY('page', pointer, page);\n }\n\n return page;\n },\n\n getClientXY: function (pointer, client) {\n client = client || {};\n\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n // Opera Mobile handles the viewport and scrolling oddly\n pointerUtils.getXY('screen', pointer, client);\n }\n else {\n pointerUtils.getXY('client', pointer, client);\n }\n\n return client;\n },\n\n getPointerId: function (pointer) {\n return is.number(pointer.pointerId)? pointer.pointerId : pointer.identifier;\n },\n\n setCoords: function (targetObj, pointers, timeStamp) {\n const pointer = (pointers.length > 1\n ? pointerUtils.pointerAverage(pointers)\n : pointers[0]);\n\n const tmpXY = {};\n\n pointerUtils.getPageXY(pointer, tmpXY);\n targetObj.page.x = tmpXY.x;\n targetObj.page.y = tmpXY.y;\n\n pointerUtils.getClientXY(pointer, tmpXY);\n targetObj.client.x = tmpXY.x;\n targetObj.client.y = tmpXY.y;\n\n targetObj.timeStamp = is.number(timeStamp) ? timeStamp :new Date().getTime();\n },\n\n pointerExtend: pointerExtend,\n\n getTouchPair: function (event) {\n const touches = [];\n\n // array of touches is supplied\n if (is.array(event)) {\n touches[0] = event[0];\n touches[1] = event[1];\n }\n // an event\n else {\n if (event.type === 'touchend') {\n if (event.touches.length === 1) {\n touches[0] = event.touches[0];\n touches[1] = event.changedTouches[0];\n }\n else if (event.touches.length === 0) {\n touches[0] = event.changedTouches[0];\n touches[1] = event.changedTouches[1];\n }\n }\n else {\n touches[0] = event.touches[0];\n touches[1] = event.touches[1];\n }\n }\n\n return touches;\n },\n\n pointerAverage: function (pointers) {\n const average = {\n pageX : 0,\n pageY : 0,\n clientX: 0,\n clientY: 0,\n screenX: 0,\n screenY: 0,\n };\n\n for (const pointer of pointers) {\n for (const prop in average) {\n average[prop] += pointer[prop];\n }\n }\n for (const prop in average) {\n average[prop] /= pointers.length;\n }\n\n return average;\n },\n\n touchBBox: function (event) {\n if (!event.length && !(event.touches && event.touches.length > 1)) {\n return;\n }\n\n const touches = pointerUtils.getTouchPair(event);\n const minX = Math.min(touches[0].pageX, touches[1].pageX);\n const minY = Math.min(touches[0].pageY, touches[1].pageY);\n const maxX = Math.max(touches[0].pageX, touches[1].pageX);\n const maxY = Math.max(touches[0].pageY, touches[1].pageY);\n\n return {\n x: minX,\n y: minY,\n left: minX,\n top: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n },\n\n touchDistance: function (event, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n\n\n const dx = touches[0][sourceX] - touches[1][sourceX];\n const dy = touches[0][sourceY] - touches[1][sourceY];\n\n return hypot(dx, dy);\n },\n\n touchAngle: function (event, prevAngle, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n const dx = touches[1][sourceX] - touches[0][sourceX];\n const dy = touches[1][sourceY] - touches[0][sourceY];\n const angle = 180 * Math.atan2(dy , dx) / Math.PI;\n\n return angle;\n },\n\n getPointerType: function (pointer, interaction) {\n // if the PointerEvent API isn't available, then the pointer must be ither\n // a MouseEvent or TouchEvent\n if (interaction.mouse) { return 'mouse'; }\n if (!browser.supportsPointerEvent) { return 'touch'; }\n\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : [undefined, undefined,'touch', 'pen', 'mouse'][pointer.pointerType];\n },\n\n // [ event.target, event.currentTarget ]\n getEventTargets: function (event) {\n return [\n domUtils.getActualElement(event.path ? event.path[0] : event.target),\n domUtils.getActualElement(event.currentTarget),\n ];\n },\n};\n\nmodule.exports = pointerUtils;\n","const { window } = require('./window');\n\nconst vendors = ['ms', 'moz', 'webkit', 'o'];\nlet lastTime = 0;\nlet request;\nlet cancel;\n\nfor (let x = 0; x < vendors.length && !window.requestAnimationFrame; x++) {\n request = window[vendors[x] + 'RequestAnimationFrame'];\n cancel = window[vendors[x] +'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n}\n\nif (!request) {\n request = function (callback) {\n const currTime = new Date().getTime();\n const timeToCall = Math.max(0, 16 - (currTime - lastTime));\n const id = setTimeout(function () { callback(currTime + timeToCall); },\n timeToCall);\n\n lastTime = currTime + timeToCall;\n return id;\n };\n}\n\nif (!cancel) {\n cancel = function (id) {\n clearTimeout(id);\n };\n}\n\nmodule.exports = {\n request,\n cancel,\n};\n","const extend = require('./extend');\nconst is = require('./is');\nconst {\n closest,\n parentNode,\n getElementRect,\n} = require('./domUtils');\n\nconst rectUtils = {\n getStringOptionResult: function (value, interactable, element) {\n if (!is.string(value)) {\n return null;\n }\n\n if (value === 'parent') {\n value = parentNode(element);\n }\n else if (value === 'self') {\n value = interactable.getRect(element);\n }\n else {\n value = closest(element, value);\n }\n\n return value;\n },\n\n resolveRectLike: function (value, interactable, element, functionArgs) {\n value = rectUtils.getStringOptionResult(value, interactable, element) || value;\n\n if (is.function(value)) {\n value = value.apply(null, functionArgs);\n }\n\n if (is.element(value)) {\n value = getElementRect(value);\n }\n\n return value;\n },\n\n rectToXY: function (rect) {\n return rect && {\n x: 'x' in rect ? rect.x : rect.left,\n y: 'y' in rect ? rect.y : rect.top,\n };\n },\n\n xywhToTlbr: function (rect) {\n if (rect && !('left' in rect && 'top' in rect)) {\n rect = extend({}, rect);\n\n rect.left = rect.x || 0;\n rect.top = rect.y || 0;\n rect.right = rect.right || (rect.left + rect.width);\n rect.bottom = rect.bottom || (rect.top + rect.height);\n }\n\n return rect;\n },\n\n tlbrToXywh: function (rect) {\n if (rect && !('x' in rect && 'y' in rect)) {\n rect = extend({}, rect);\n\n rect.x = rect.left || 0;\n rect.top = rect.top || 0;\n rect.width = rect.width || (rect.right - rect.x);\n rect.height = rect.height || (rect.bottom - rect.y);\n }\n\n return rect;\n },\n};\n\nmodule.exports = rectUtils;\n","const win = module.exports;\nconst isWindow = require('./isWindow');\n\nfunction init (window) {\n // get wrapped window if using Shadow DOM polyfill\n\n win.realWindow = window;\n\n // create a TextNode\n const el = window.document.createTextNode('');\n\n // check if it's wrapped by a polyfill\n if (el.ownerDocument !== window.document\n && typeof window.wrap === 'function'\n && window.wrap(el) === el) {\n // use wrapped window\n window = window.wrap(window);\n }\n\n win.window = window;\n}\n\nif (typeof window === 'undefined') {\n win.window = undefined;\n win.realWindow = undefined;\n}\nelse {\n init(window);\n}\n\nwin.getWindow = function getWindow (node) {\n if (isWindow(node)) {\n return node;\n }\n\n const rootNode = (node.ownerDocument || node);\n\n return rootNode.defaultView || rootNode.parentWindow || win.window;\n};\n\nwin.init = init;\n"]} \ No newline at end of file +{"version":3,"sources":["src/header.js","node_modules/browser-pack/_prelude.js","index.js","src/Eventable.js","src/InteractEvent.js","src/Interactable.js","src/Interaction.js","src/actions/base.js","src/actions/drag.js","src/actions/drop.js","src/actions/gesture.js","src/actions/resize.js","src/autoScroll.js","src/autoStart/InteractableMethods.js","src/autoStart/base.js","src/autoStart/delay.js","src/autoStart/drag.js","src/autoStart/gesture.js","src/autoStart/resize.js","src/defaultOptions.js","src/index.js","src/inertia.js","src/interact.js","src/interactablePreventDefault.js","src/legacyBrowsers.js","src/modifiers/index.js","src/modifiers/restrict.js","src/modifiers/restrictEdges.js","src/modifiers/restrictSize.js","src/modifiers/snap.js","src/modifiers/snapSize.js","src/pointerEvents/PointerEvent.js","src/pointerEvents/base.js","src/pointerEvents/holdRepeat.js","src/pointerEvents/interactableTargets.js","src/scope.js","src/utils/Signals.js","src/utils/arr.js","src/utils/browser.js","src/utils/domObjects.js","src/utils/domUtils.js","src/utils/events.js","src/utils/extend.js","src/utils/getOriginXY.js","src/utils/hypot.js","src/utils/index.js","src/utils/interactionFinder.js","src/utils/is.js","src/utils/isWindow.js","src/utils/pointerExtend.js","src/utils/pointerUtils.js","src/utils/raf.js","src/utils/rect.js","src/utils/window.js"],"names":[],"mappings":"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","file":"interact.js","sourceRoot":"","sourcesContent":["/**\n * interact.js v1.3.0-alpha.4+sha.7970416-dirty\n *\n * Copyright (c) 2012-2017 Taye Adeyemi \n * Open source under the MIT License.\n * https://raw.github.com/taye/interact.js/master/LICENSE\n */\n","(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o 150) {\n return null;\n }\n\n let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI;\n const overlap = 22.5;\n\n if (angle < 0) {\n angle += 360;\n }\n\n const left = 135 - overlap <= angle && angle < 225 + overlap;\n const up = 225 - overlap <= angle && angle < 315 + overlap;\n\n const right = !left && (315 - overlap <= angle || angle < 45 + overlap);\n const down = !up && 45 - overlap <= angle && angle < 135 + overlap;\n\n return {\n up,\n down,\n left,\n right,\n angle,\n speed: interaction.prevEvent.speed,\n velocity: {\n x: interaction.prevEvent.velocityX,\n y: interaction.prevEvent.velocityY,\n },\n };\n }\n\n preventDefault () {}\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n}\n\nsignals.on('set-delta', function ({ iEvent, interaction, starting, deltaSource }) {\n const prevEvent = starting? iEvent : interaction.prevEvent;\n\n if (deltaSource === 'client') {\n iEvent.dx = iEvent.clientX - prevEvent.clientX;\n iEvent.dy = iEvent.clientY - prevEvent.clientY;\n }\n else {\n iEvent.dx = iEvent.pageX - prevEvent.pageX;\n iEvent.dy = iEvent.pageY - prevEvent.pageY;\n }\n});\n\nInteractEvent.signals = signals;\n\nmodule.exports = InteractEvent;\n","const is = require('./utils/is');\nconst events = require('./utils/events');\nconst extend = require('./utils/extend');\nconst actions = require('./actions/base');\nconst scope = require('./scope');\nconst Eventable = require('./Eventable');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nconst {\n getElementRect,\n nodeContains,\n trySelector,\n} = require('./utils/domUtils');\nconst { getWindow } = require('./utils/window');\nconst { indexOf, contains } = require('./utils/arr');\nconst { wheelEvent } = require('./utils/browser');\n\n// all set interactables\nscope.interactables = [];\n\n/*\\\n * Interactable\n [ property ]\n **\n * Object type returned by @interact\n\\*/\nclass Interactable {\n constructor (target, options) {\n options = options || {};\n\n this.target = target;\n this.events = new Eventable();\n this._context = options.context || scope.document;\n this._win = getWindow(trySelector(target)? this._context : target);\n this._doc = this._win.document;\n\n signals.fire('new', {\n target,\n options,\n interactable: this,\n win: this._win,\n });\n\n scope.addDocument( this._doc, this._win );\n\n scope.interactables.push(this);\n\n this.set(options);\n }\n\n setOnEvents (action, phases) {\n const onAction = 'on' + action;\n\n if (is.function(phases.onstart) ) { this.events[onAction + 'start' ] = phases.onstart ; }\n if (is.function(phases.onmove) ) { this.events[onAction + 'move' ] = phases.onmove ; }\n if (is.function(phases.onend) ) { this.events[onAction + 'end' ] = phases.onend ; }\n if (is.function(phases.oninertiastart)) { this.events[onAction + 'inertiastart' ] = phases.oninertiastart ; }\n\n return this;\n }\n\n setPerAction (action, options) {\n // for all the default per-action options\n for (const option in options) {\n // if this option exists for this action\n if (option in defaults[action]) {\n // if the option in the options arg is an object value\n if (is.object(options[option])) {\n // duplicate the object\n this.options[action][option] = extend(this.options[action][option] || {}, options[option]);\n\n if (is.object(defaults.perAction[option]) && 'enabled' in defaults.perAction[option]) {\n this.options[action][option].enabled = options[option].enabled === false? false : true;\n }\n }\n else if (is.bool(options[option]) && is.object(defaults.perAction[option])) {\n this.options[action][option].enabled = options[option];\n }\n else if (options[option] !== undefined) {\n // or if it's not undefined, do a plain assignment\n this.options[action][option] = options[option];\n }\n }\n }\n }\n\n /*\\\n * Interactable.getRect\n [ method ]\n *\n * The default function to get an Interactables bounding rect. Can be\n * overridden using @Interactable.rectChecker.\n *\n - element (Element) #optional The element to measure.\n = (object) The object's bounding rectangle.\n o {\n o top : 0,\n o left : 0,\n o bottom: 0,\n o right : 0,\n o width : 0,\n o height: 0\n o }\n \\*/\n getRect (element) {\n element = element || this.target;\n\n if (is.string(this.target) && !(is.element(element))) {\n element = this._context.querySelector(this.target);\n }\n\n return getElementRect(element);\n }\n\n /*\\\n * Interactable.rectChecker\n [ method ]\n *\n * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n - checker (function) #optional A function which returns this Interactable's bounding rectangle. See @Interactable.getRect\n = (function | object) The checker function or this Interactable\n \\*/\n rectChecker (checker) {\n if (is.function(checker)) {\n this.getRect = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.getRect;\n\n return this;\n }\n\n return this.getRect;\n }\n\n _backCompatOption (optionName, newValue) {\n if (trySelector(newValue) || is.object(newValue)) {\n this.options[optionName] = newValue;\n\n for (const action of actions.names) {\n this.options[action][optionName] = newValue;\n }\n\n return this;\n }\n\n return this.options[optionName];\n }\n\n /*\\\n * Interactable.origin\n [ method ]\n *\n * Gets or sets the origin of the Interactable's element. The x and y\n * of the origin will be subtracted from action event coordinates.\n *\n - origin (object | string) #optional An object eg. { x: 0, y: 0 } or string 'parent', 'self' or any CSS selector\n * OR\n - origin (Element) #optional An HTML or SVG Element whose rect will be used\n **\n = (object) The current origin or this Interactable\n \\*/\n origin (newValue) {\n return this._backCompatOption('origin', newValue);\n }\n\n /*\\\n * Interactable.deltaSource\n [ method ]\n *\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n - newValue (string) #optional Use 'client' if you will be scrolling while interacting; Use 'page' if you want autoScroll to work\n = (string | object) The current deltaSource or this Interactable\n \\*/\n deltaSource (newValue) {\n if (newValue === 'page' || newValue === 'client') {\n this.options.deltaSource = newValue;\n\n return this;\n }\n\n return this.options.deltaSource;\n }\n\n /*\\\n * Interactable.context\n [ method ]\n *\n * Gets the selector context Node of the Interactable. The default is `window.document`.\n *\n = (Node) The context Node of this Interactable\n **\n \\*/\n context () {\n return this._context;\n }\n\n inContext (element) {\n return (this._context === element.ownerDocument\n || nodeContains(this._context, element));\n }\n\n /*\\\n * Interactable.fire\n [ method ]\n *\n * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n - iEvent (InteractEvent) The InteractEvent object to be fired on this Interactable\n = (Interactable) this Interactable\n \\*/\n fire (iEvent) {\n this.events.fire(iEvent);\n\n return this;\n }\n\n _onOffMultiple (method, eventType, listener, options) {\n if (is.string(eventType) && eventType.search(' ') !== -1) {\n eventType = eventType.trim().split(/ +/);\n }\n\n if (is.array(eventType)) {\n for (let i = 0; i < eventType.length; i++) {\n this[method](eventType[i], listener, options);\n }\n\n return true;\n }\n\n if (is.object(eventType)) {\n for (const prop in eventType) {\n this[method](prop, eventType[prop], listener);\n }\n\n return true;\n }\n }\n\n /*\\\n * Interactable.on\n [ method ]\n *\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n - eventType (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) This Interactable\n \\*/\n on (eventType, listener, options) {\n if (this._onOffMultiple('on', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.on(eventType, listener);\n }\n // delegated event for selector\n else if (is.string(this.target)) {\n events.addDelegate(this.target, this._context, eventType, listener, options);\n }\n else {\n events.add(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.off\n [ method ]\n *\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n - eventType (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) This Interactable\n \\*/\n off (eventType, listener, options) {\n if (this._onOffMultiple('off', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n // if it is an action event type\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.off(eventType, listener);\n }\n // delegated event\n else if (is.string(this.target)) {\n events.removeDelegate(this.target, this._context, eventType, listener, options);\n }\n // remove listener from this Interatable's element\n else {\n events.remove(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.set\n [ method ]\n *\n * Reset the options of this Interactable\n - options (object) The new settings to apply\n = (object) This Interactable\n \\*/\n set (options) {\n if (!is.object(options)) {\n options = {};\n }\n\n this.options = extend({}, defaults.base);\n\n const perActions = extend({}, defaults.perAction);\n\n for (const actionName in actions.methodDict) {\n const methodName = actions.methodDict[actionName];\n\n this.options[actionName] = extend({}, defaults[actionName]);\n\n this.setPerAction(actionName, perActions);\n\n this[methodName](options[actionName]);\n }\n\n for (const setting of Interactable.settingsMethods) {\n this.options[setting] = defaults.base[setting];\n\n if (setting in options) {\n this[setting](options[setting]);\n }\n }\n\n signals.fire('set', {\n options,\n interactable: this,\n });\n\n return this;\n }\n\n /*\\\n * Interactable.unset\n [ method ]\n *\n * Remove this interactable from the list of interactables and remove\n * it's action capabilities and event listeners\n *\n = (object) @interact\n \\*/\n unset () {\n events.remove(this.target, 'all');\n\n if (is.string(this.target)) {\n // remove delegated events\n for (const type in events.delegatedEvents) {\n const delegated = events.delegatedEvents[type];\n\n if (delegated.selectors[0] === this.target\n && delegated.contexts[0] === this._context) {\n\n delegated.selectors.splice(0, 1);\n delegated.contexts .splice(0, 1);\n delegated.listeners.splice(0, 1);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegated[type] = null;\n }\n }\n\n events.remove(this._context, type, events.delegateListener);\n events.remove(this._context, type, events.delegateUseCapture, true);\n }\n }\n else {\n events.remove(this, 'all');\n }\n\n signals.fire('unset', { interactable: this });\n\n scope.interactables.splice(indexOf(scope.interactables, this), 1);\n\n // Stop related interactions when an Interactable is unset\n for (const interaction of scope.interactions || []) {\n if (interaction.target === this && interaction.interacting()) {\n interaction.stop();\n }\n }\n\n return scope.interact;\n }\n}\n\nscope.interactables.indexOfElement = function indexOfElement (target, context) {\n context = context || scope.document;\n\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n if (interactable.target === target && interactable._context === context) {\n return i;\n }\n }\n return -1;\n};\n\nscope.interactables.get = function interactableGet (element, options, dontCheckInContext) {\n const ret = this[this.indexOfElement(element, options && options.context)];\n\n return ret && (is.string(element) || dontCheckInContext || ret.inContext(element))? ret : null;\n};\n\nscope.interactables.forEachSelector = function (callback, element) {\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n // skip non CSS selector targets and out of context elements\n if (!is.string(interactable.target)\n || (element && !interactable.inContext(element))) {\n continue;\n }\n\n const ret = callback(interactable, interactable.target, interactable._context, i, this);\n\n if (ret !== undefined) {\n return ret;\n }\n }\n};\n\n// all interact.js eventTypes\nInteractable.eventTypes = scope.eventTypes = [];\n\nInteractable.signals = signals;\n\nInteractable.settingsMethods = [ 'deltaSource', 'origin', 'preventDefault', 'rectChecker' ];\n\nmodule.exports = Interactable;\n","const scope = require('./scope');\nconst utils = require('./utils');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst domObjects = require('./utils/domObjects');\nconst finder = require('./utils/interactionFinder');\nconst signals = require('./utils/Signals').new();\n\nconst listeners = {};\nconst methodNames = [\n 'pointerDown', 'pointerMove', 'pointerUp',\n 'updatePointer', 'removePointer',\n];\n\n// for ignoring browser's simulated mouse events\nlet prevTouchTime = 0;\n\n// all active and idle interactions\nscope.interactions = [];\n\nclass Interaction {\n constructor ({ pointerType }) {\n this.target = null; // current interactable being interacted with\n this.element = null; // the target element of the interactable\n\n this.prepared = { // action that's ready to be fired on next move event\n name : null,\n axis : null,\n edges: null,\n };\n\n // keep track of added pointers\n this.pointers = [];\n this.pointerIds = [];\n this.downTargets = [];\n this.downTimes = [];\n\n // Previous native pointer move event coordinates\n this.prevCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n // current native pointer move event coordinates\n this.curCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Starting InteractEvent pointer coordinates\n this.startCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Change in coordinates and time of the pointer\n this.pointerDelta = {\n page : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n client : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n timeStamp: 0,\n };\n\n this.downEvent = null; // pointerdown/mousedown/touchstart event\n this.downPointer = {};\n\n this._eventTarget = null;\n this._curEventTarget = null;\n\n this.prevEvent = null; // previous action event\n\n this.pointerIsDown = false;\n this.pointerWasMoved = false;\n this._interacting = false;\n\n this.pointerType = pointerType;\n\n signals.fire('new', this);\n\n scope.interactions.push(this);\n }\n\n pointerDown (pointer, event, eventTarget) {\n const pointerIndex = this.updatePointer(pointer, event, true);\n\n signals.fire('down', {\n pointer,\n event,\n eventTarget,\n pointerIndex,\n interaction: this,\n });\n }\n\n /*\\\n * Interaction.start\n [ method ]\n *\n * Start an action with the given Interactable and Element as tartgets. The\n * action must be enabled for the target Interactable and an appropriate number\n * of pointers must be held down - 1 for drag/resize, 2 for gesture.\n *\n * Use it with `interactable.able({ manualStart: false })` to always\n * [start actions manually](https://github.com/taye/interact.js/issues/114)\n *\n - action (object) The action to be performed - drag, resize, etc.\n - target (Interactable) The Interactable to target\n - element (Element) The DOM Element to target\n = (object) interact\n **\n | interact(target)\n | .draggable({\n | // disable the default drag start by down->move\n | manualStart: true\n | })\n | // start dragging after the user holds the pointer down\n | .on('hold', function (event) {\n | var interaction = event.interaction;\n |\n | if (!interaction.interacting()) {\n | interaction.start({ name: 'drag' },\n | event.interactable,\n | event.currentTarget);\n | }\n | });\n \\*/\n start (action, target, element) {\n if (this.interacting()\n || !this.pointerIsDown\n || this.pointerIds.length < (action.name === 'gesture'? 2 : 1)) {\n return;\n }\n\n // if this interaction had been removed after stopping\n // add it back\n if (utils.indexOf(scope.interactions, this) === -1) {\n scope.interactions.push(this);\n }\n\n utils.copyAction(this.prepared, action);\n this.target = target;\n this.element = element;\n\n signals.fire('action-start', {\n interaction: this,\n event: this.downEvent,\n });\n }\n\n pointerMove (pointer, event, eventTarget) {\n if (!this.simulation) {\n this.updatePointer(pointer);\n utils.setCoords(this.curCoords, this.pointers);\n }\n\n const duplicateMove = (this.curCoords.page.x === this.prevCoords.page.x\n && this.curCoords.page.y === this.prevCoords.page.y\n && this.curCoords.client.x === this.prevCoords.client.x\n && this.curCoords.client.y === this.prevCoords.client.y);\n\n let dx;\n let dy;\n\n // register movement greater than pointerMoveTolerance\n if (this.pointerIsDown && !this.pointerWasMoved) {\n dx = this.curCoords.client.x - this.startCoords.client.x;\n dy = this.curCoords.client.y - this.startCoords.client.y;\n\n this.pointerWasMoved = utils.hypot(dx, dy) > Interaction.pointerMoveTolerance;\n }\n\n const signalArg = {\n pointer,\n pointerIndex: this.getPointerIndex(pointer),\n event,\n eventTarget,\n dx,\n dy,\n duplicate: duplicateMove,\n interaction: this,\n interactingBeforeMove: this.interacting(),\n };\n\n if (!duplicateMove) {\n // set pointer coordinate, time changes and speeds\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n }\n\n signals.fire('move', signalArg);\n\n if (!duplicateMove) {\n // if interacting, fire an 'action-move' signal etc\n if (this.interacting()) {\n this.doMove(signalArg);\n }\n\n if (this.pointerWasMoved) {\n utils.copyCoords(this.prevCoords, this.curCoords);\n }\n }\n }\n\n /*\\\n * Interaction.doMove\n [ method ]\n *\n * Force a move of the current action at the same coordinates. Useful if\n * snap/restrict has been changed and you want a movement with the new\n * settings.\n *\n **\n | interact(target)\n | .draggable(true)\n | .on('dragmove', function (event) {\n | if (someCondition) {\n | // change the snap settings\n | event.interactable.draggable({ snap: { targets: [] }});\n | // fire another move event with re-calculated snap\n | event.interaction.doMove();\n | }\n | });\n \\*/\n doMove (signalArg) {\n signalArg = utils.extend({\n pointer: this.pointers[0],\n event: this.prevEvent,\n eventTarget: this._eventTarget,\n interaction: this,\n }, signalArg || {});\n\n signals.fire('before-action-move', signalArg);\n\n if (!this._dontFireMove) {\n signals.fire('action-move', signalArg);\n }\n\n this._dontFireMove = false;\n }\n\n // End interact move events and stop auto-scroll unless simulation is running\n pointerUp (pointer, event, eventTarget, curEventTarget) {\n const pointerIndex = this.getPointerIndex(pointer);\n\n signals.fire(/cancel$/i.test(event.type)? 'cancel' : 'up', {\n pointer,\n pointerIndex,\n event,\n eventTarget,\n curEventTarget,\n interaction: this,\n });\n\n if (!this.simulation) {\n this.end(event);\n }\n\n this.pointerIsDown = false;\n this.removePointer(pointer, event);\n }\n\n /*\\\n * Interaction.end\n [ method ]\n *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n - event (PointerEvent) #optional\n **\n | interact(target)\n | .draggable(true)\n | .on('move', function (event) {\n | if (event.pageX > 1000) {\n | // end the current action\n | event.interaction.end();\n | // stop all further listeners from being called\n | event.stopImmediatePropagation();\n | }\n | });\n \\*/\n end (event) {\n event = event || this.prevEvent;\n\n if (this.interacting()) {\n signals.fire('action-end', {\n event,\n interaction: this,\n });\n }\n\n this.stop();\n }\n\n currentAction () {\n return this._interacting? this.prepared.name: null;\n }\n\n interacting () {\n return this._interacting;\n }\n\n stop () {\n signals.fire('stop', { interaction: this });\n\n if (this._interacting) {\n signals.fire('stop-active', { interaction: this });\n signals.fire('stop-' + this.prepared.name, { interaction: this });\n }\n\n this.target = this.element = null;\n\n this._interacting = false;\n this.prepared.name = this.prevEvent = null;\n }\n\n getPointerIndex (pointer) {\n // mouse and pen interactions may have only one pointer\n if (this.pointerType === 'mouse' || this.pointerType === 'pen') {\n return 0;\n }\n\n return utils.indexOf(this.pointerIds, utils.getPointerId(pointer));\n }\n\n updatePointer (pointer, event, down = event && /(down|start)$/i.test(event.type)) {\n const id = utils.getPointerId(pointer);\n let index = this.getPointerIndex(pointer);\n\n if (index === -1) {\n index = this.pointerIds.length;\n this.pointerIds[index] = id;\n }\n\n if (down) {\n signals.fire('update-pointer-down', {\n pointer,\n event,\n down,\n pointerId: id,\n pointerIndex: index,\n interaction: this,\n });\n }\n\n this.pointers[index] = pointer;\n\n return index;\n }\n\n removePointer (pointer, event) {\n const index = this.getPointerIndex(pointer);\n\n if (index === -1) { return; }\n\n signals.fire('remove-pointer', {\n pointer,\n event,\n pointerIndex: index,\n interaction: this,\n });\n\n this.pointers .splice(index, 1);\n this.pointerIds .splice(index, 1);\n this.downTargets.splice(index, 1);\n this.downTimes .splice(index, 1);\n }\n\n _updateEventTargets (target, currentTarget) {\n this._eventTarget = target;\n this._curEventTarget = currentTarget;\n }\n}\n\nfor (let i = 0, len = methodNames.length; i < len; i++) {\n const method = methodNames[i];\n\n listeners[method] = doOnInteractions(method);\n}\n\nfunction doOnInteractions (method) {\n return (function (event) {\n const pointerType = utils.getPointerType(event);\n const [eventTarget, curEventTarget] = utils.getEventTargets(event);\n const matches = []; // [ [pointer, interaction], ...]\n\n if (browser.supportsTouch && /touch/.test(event.type)) {\n prevTouchTime = new Date().getTime();\n\n for (let i = 0; i < event.changedTouches.length; i++) {\n const pointer = event.changedTouches[i];\n const interaction = finder.search(pointer, event.type, eventTarget);\n\n matches.push([pointer, interaction || new Interaction({ pointerType })]);\n }\n }\n else {\n let invalidPointer = false;\n\n if (!browser.supportsPointerEvent && /mouse/.test(event.type)) {\n // ignore mouse events while touch interactions are active\n for (let i = 0; i < scope.interactions.length && !invalidPointer; i++) {\n invalidPointer = scope.interactions[i].pointerType !== 'mouse' && scope.interactions[i].pointerIsDown;\n }\n\n // try to ignore mouse events that are simulated by the browser\n // after a touch event\n invalidPointer = invalidPointer\n || (new Date().getTime() - prevTouchTime < 500)\n // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated\n || event.timeStamp === 0;\n }\n\n if (!invalidPointer) {\n let interaction = finder.search(event, event.type, eventTarget);\n\n if (!interaction) {\n interaction = new Interaction({ pointerType });\n }\n\n matches.push([event, interaction]);\n }\n }\n\n for (const [pointer, interaction] of matches) {\n interaction._updateEventTargets(eventTarget, curEventTarget);\n interaction[method](pointer, event, eventTarget, curEventTarget);\n }\n });\n}\n\nfunction endAll (event) {\n for (let i = 0; i < scope.interactions.length; i++) {\n const interaction = scope.interactions[i];\n\n interaction.end(event);\n signals.fire('endall', { event, interaction });\n }\n}\n\nconst docEvents = { /* 'eventType': listenerFunc */ };\nconst pEventTypes = browser.pEventTypes;\n\nif (domObjects.PointerEvent) {\n docEvents[pEventTypes.down ] = listeners.pointerDown;\n docEvents[pEventTypes.move ] = listeners.pointerMove;\n docEvents[pEventTypes.up ] = listeners.pointerUp;\n docEvents[pEventTypes.cancel] = listeners.pointerUp;\n}\nelse {\n docEvents.mousedown = listeners.pointerDown;\n docEvents.mousemove = listeners.pointerMove;\n docEvents.mouseup = listeners.pointerUp;\n\n docEvents.touchstart = listeners.pointerDown;\n docEvents.touchmove = listeners.pointerMove;\n docEvents.touchend = listeners.pointerUp;\n docEvents.touchcancel = listeners.pointerUp;\n}\n\ndocEvents.blur = endAll;\n\nfunction onDocSignal ({ doc }, signalName) {\n const eventMethod = signalName.indexOf('add') === 0\n ? events.add : events.remove;\n\n // delegate event listener\n for (const eventType in scope.delegatedEvents) {\n eventMethod(doc, eventType, events.delegateListener);\n eventMethod(doc, eventType, events.delegateUseCapture, true);\n }\n\n for (const eventType in docEvents) {\n eventMethod(doc, eventType, docEvents[eventType]);\n }\n}\n\nsignals.on('update-pointer-down', ({ interaction, pointer, pointerId, pointerIndex, event, eventTarget, down }) => {\n interaction.pointerIds[pointerIndex] = pointerId;\n interaction.pointers[pointerIndex] = pointer;\n\n if (down) {\n interaction.pointerIsDown = true;\n }\n\n if (!interaction.interacting()) {\n utils.setCoords(interaction.startCoords, interaction.pointers);\n\n utils.copyCoords(interaction.curCoords , interaction.startCoords);\n utils.copyCoords(interaction.prevCoords, interaction.startCoords);\n\n interaction.downEvent = event;\n interaction.downTimes[pointerIndex] = interaction.curCoords.timeStamp;\n interaction.downTargets[pointerIndex] = eventTarget || event && utils.getEventTargets(event)[0];\n interaction.pointerWasMoved = false;\n\n utils.pointerExtend(interaction.downPointer, pointer);\n }\n});\n\nscope.signals.on('add-document' , onDocSignal);\nscope.signals.on('remove-document', onDocSignal);\n\nInteraction.pointerMoveTolerance = 1;\nInteraction.doOnInteractions = doOnInteractions;\nInteraction.endAll = endAll;\nInteraction.signals = signals;\nInteraction.docEvents = docEvents;\n\nscope.endAllInteractions = endAll;\n\nmodule.exports = Interaction;\n","const Interaction = require('../Interaction');\nconst InteractEvent = require('../InteractEvent');\n\nconst actions = {\n firePrepared,\n names: [],\n methodDict: {},\n};\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n interaction._interacting = true;\n firePrepared(interaction, event, 'start');\n});\n\nInteraction.signals.on('action-move', function ({ interaction, event, preEnd }) {\n firePrepared(interaction, event, 'move', preEnd);\n\n // if the action was ended in a listener\n if (!interaction.interacting()) { return false; }\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n firePrepared(interaction, event, 'end');\n});\n\nfunction firePrepared (interaction, event, phase, preEnd) {\n const actionName = interaction.prepared.name;\n\n const newEvent = new InteractEvent(interaction, event, actionName, phase, interaction.element, null, preEnd);\n\n interaction.target.fire(newEvent);\n interaction.prevEvent = newEvent;\n}\n\nmodule.exports = actions;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drag = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n startAxis : 'xy',\n lockAxis : 'xy',\n },\n\n checker: function (pointer, event, interactable) {\n const dragOptions = interactable.options.drag;\n\n return dragOptions.enabled\n ? { name: 'drag', axis: (dragOptions.lockAxis === 'start'\n ? dragOptions.startAxis\n : dragOptions.lockAxis)}\n : null;\n },\n\n getCursor: function () {\n return 'move';\n },\n};\n\nInteraction.signals.on('before-action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n interaction.curCoords.page.y = interaction.startCoords.page.y;\n interaction.curCoords.client.y = interaction.startCoords.client.y;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vx);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vx);\n interaction.pointerDelta.client.vy = 0;\n interaction.pointerDelta.page.vy = 0;\n }\n else if (axis === 'y') {\n interaction.curCoords.page.x = interaction.startCoords.page.x;\n interaction.curCoords.client.x = interaction.startCoords.client.x;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vy);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vy);\n interaction.pointerDelta.client.vx = 0;\n interaction.pointerDelta.page.vx = 0;\n }\n});\n\n// dragmove\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'dragmove') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n iEvent.pageY = interaction.startCoords.page.y;\n iEvent.clientY = interaction.startCoords.client.y;\n iEvent.dy = 0;\n }\n else if (axis === 'y') {\n iEvent.pageX = interaction.startCoords.page.x;\n iEvent.clientX = interaction.startCoords.client.x;\n iEvent.dx = 0;\n }\n});\n\n/*\\\n * Interactable.draggable\n [ method ]\n *\n * Gets or sets whether drag actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of drag events\n | var isDraggable = interact('ul li').draggable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on drag events (object makes the Interactable draggable)\n = (object) This Interactable\n | interact(element).draggable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // the axis in which the first movement must be\n | // for the drag sequence to start\n | // 'xy' by default - any direction\n | startAxis: 'x' || 'y' || 'xy',\n |\n | // 'xy' by default - don't restrict to one axis (move in any direction)\n | // 'x' or 'y' to restrict movement to either axis\n | // 'start' to restrict movement to the axis the drag started in\n | lockAxis: 'x' || 'y' || 'xy' || 'start',\n |\n | // max number of drags that can happen concurrently\n | // with elements of this Interactable. Infinity by default\n | max: Infinity,\n |\n | // max number of drags that can target the same element+Interactable\n | // 1 by default\n | maxPerElement: 2\n | });\n\\*/\nInteractable.prototype.draggable = function (options) {\n if (utils.is.object(options)) {\n this.options.drag.enabled = options.enabled === false? false: true;\n this.setPerAction('drag', options);\n this.setOnEvents('drag', options);\n\n if (/^(xy|x|y|start)$/.test(options.lockAxis)) {\n this.options.drag.lockAxis = options.lockAxis;\n }\n if (/^(xy|x|y)$/.test(options.startAxis)) {\n this.options.drag.startAxis = options.startAxis;\n }\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drag.enabled = options;\n\n if (!options) {\n this.ondragstart = this.ondragstart = this.ondragend = null;\n }\n\n return this;\n }\n\n return this.options.drag;\n};\n\nactions.drag = drag;\nactions.names.push('drag');\nutils.merge(Interactable.eventTypes, [\n 'dragstart',\n 'dragmove',\n 'draginertiastart',\n 'draginertiaresume',\n 'dragend',\n]);\nactions.methodDict.drag = 'draggable';\n\ndefaultOptions.drag = drag.defaults;\n\nmodule.exports = drag;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst scope = require('../scope');\nconst interact = require('../interact');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drop = {\n defaults: {\n enabled: false,\n accept : null,\n overlap: 'pointer',\n },\n};\n\nlet dynamicDrop = false;\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // reset active dropzones\n interaction.activeDrops.dropzones = [];\n interaction.activeDrops.elements = [];\n interaction.activeDrops.rects = [];\n\n interaction.dropEvents = null;\n\n if (!interaction.dynamicDrop) {\n setActiveDrops(interaction, interaction.element);\n }\n\n const dragEvent = interaction.prevEvent;\n const dropEvents = getDropEvents(interaction, event, dragEvent);\n\n if (dropEvents.activate) {\n fireActiveDrops(interaction, dropEvents.activate);\n }\n});\n\nInteractEvent.signals.on('new', function ({ interaction, iEvent, event }) {\n if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { return; }\n\n const draggableElement = interaction.element;\n const dragEvent = iEvent;\n const dropResult = getDrop(dragEvent, event, draggableElement);\n\n interaction.dropTarget = dropResult.dropzone;\n interaction.dropElement = dropResult.element;\n\n interaction.dropEvents = getDropEvents(interaction, event, dragEvent);\n});\n\nInteraction.signals.on('action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n fireDropEvents(interaction, interaction.dropEvents);\n});\n\nInteraction.signals.on('action-end', function ({ interaction }) {\n if (interaction.prepared.name === 'drag') {\n fireDropEvents(interaction, interaction.dropEvents);\n }\n});\n\nInteraction.signals.on('stop-drag', function ({ interaction }) {\n interaction.activeDrops.dropzones =\n interaction.activeDrops.elements =\n interaction.activeDrops.rects =\n interaction.dropEvents = null;\n});\n\nfunction collectDrops (interaction, element) {\n const drops = [];\n const elements = [];\n\n element = element || interaction.element;\n\n // collect all dropzones and their elements which qualify for a drop\n for (const current of scope.interactables) {\n if (!current.options.drop.enabled) { continue; }\n\n const accept = current.options.drop.accept;\n\n // test the draggable element against the dropzone's accept setting\n if ((utils.is.element(accept) && accept !== element)\n || (utils.is.string(accept)\n && !utils.matchesSelector(element, accept))) {\n\n continue;\n }\n\n // query for new elements if necessary\n const dropElements = utils.is.string(current.target)\n ? current._context.querySelectorAll(current.target)\n : [current.target];\n\n for (let i = 0; i < dropElements.length; i++) {\n const currentElement = dropElements[i];\n\n if (currentElement !== element) {\n drops.push(current);\n elements.push(currentElement);\n }\n }\n }\n\n return {\n elements,\n dropzones: drops,\n };\n}\n\nfunction fireActiveDrops (interaction, event) {\n let prevElement;\n\n // loop through all active dropzones and trigger event\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n const current = interaction.activeDrops.dropzones[i];\n const currentElement = interaction.activeDrops.elements [i];\n\n // prevent trigger of duplicate events on same element\n if (currentElement !== prevElement) {\n // set current element as event target\n event.target = currentElement;\n current.fire(event);\n }\n prevElement = currentElement;\n }\n}\n\n// Collect a new set of possible drops and save them in activeDrops.\n// setActiveDrops should always be called when a drag has just started or a\n// drag event happens while dynamicDrop is true\nfunction setActiveDrops (interaction, dragElement) {\n // get dropzones and their elements that could receive the draggable\n const possibleDrops = collectDrops(interaction, dragElement, true);\n\n interaction.activeDrops.dropzones = possibleDrops.dropzones;\n interaction.activeDrops.elements = possibleDrops.elements;\n interaction.activeDrops.rects = [];\n\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n interaction.activeDrops.rects[i] =\n interaction.activeDrops.dropzones[i].getRect(interaction.activeDrops.elements[i]);\n }\n}\n\nfunction getDrop (dragEvent, event, dragElement) {\n const interaction = dragEvent.interaction;\n const validDrops = [];\n\n if (dynamicDrop) {\n setActiveDrops(interaction, dragElement);\n }\n\n // collect all dropzones and their elements which qualify for a drop\n for (let j = 0; j < interaction.activeDrops.dropzones.length; j++) {\n const current = interaction.activeDrops.dropzones[j];\n const currentElement = interaction.activeDrops.elements [j];\n const rect = interaction.activeDrops.rects [j];\n\n validDrops.push(current.dropCheck(dragEvent, event, interaction.target, dragElement, currentElement, rect)\n ? currentElement\n : null);\n }\n\n // get the most appropriate dropzone based on DOM depth and order\n const dropIndex = utils.indexOfDeepestElement(validDrops);\n\n return {\n dropzone: interaction.activeDrops.dropzones[dropIndex] || null,\n element : interaction.activeDrops.elements [dropIndex] || null,\n };\n}\n\nfunction getDropEvents (interaction, pointerEvent, dragEvent) {\n const dropEvents = {\n enter : null,\n leave : null,\n activate : null,\n deactivate: null,\n move : null,\n drop : null,\n };\n\n const tmpl = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n };\n\n if (interaction.dropElement !== interaction.prevDropElement) {\n // if there was a prevDropTarget, create a dragleave event\n if (interaction.prevDropTarget) {\n dropEvents.leave = utils.extend({ type: 'dragleave' }, tmpl);\n\n dragEvent.dragLeave = dropEvents.leave.target = interaction.prevDropElement;\n dragEvent.prevDropzone = dropEvents.leave.dropzone = interaction.prevDropTarget;\n }\n // if the dropTarget is not null, create a dragenter event\n if (interaction.dropTarget) {\n dropEvents.enter = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n type : 'dragenter',\n };\n\n dragEvent.dragEnter = interaction.dropElement;\n dragEvent.dropzone = interaction.dropTarget;\n }\n }\n\n if (dragEvent.type === 'dragend' && interaction.dropTarget) {\n dropEvents.drop = utils.extend({ type: 'drop' }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n dragEvent.relatedTarget = interaction.dropElement;\n }\n if (dragEvent.type === 'dragstart') {\n dropEvents.activate = utils.extend({ type: 'dropactivate' }, tmpl);\n\n dropEvents.activate.target = null;\n dropEvents.activate.dropzone = null;\n }\n if (dragEvent.type === 'dragend') {\n dropEvents.deactivate = utils.extend({ type: 'dropdeactivate' }, tmpl);\n\n dropEvents.deactivate.target = null;\n dropEvents.deactivate.dropzone = null;\n }\n if (dragEvent.type === 'dragmove' && interaction.dropTarget) {\n dropEvents.move = utils.extend({\n dragmove : dragEvent,\n type : 'dropmove',\n }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n }\n\n return dropEvents;\n}\n\nfunction fireDropEvents (interaction, dropEvents) {\n if (dropEvents.leave) { interaction.prevDropTarget.fire(dropEvents.leave); }\n if (dropEvents.move ) { interaction.dropTarget.fire(dropEvents.move ); }\n if (dropEvents.enter) { interaction.dropTarget.fire(dropEvents.enter); }\n if (dropEvents.drop ) { interaction.dropTarget.fire(dropEvents.drop ); }\n if (dropEvents.deactivate) {\n fireActiveDrops(interaction, dropEvents.deactivate);\n }\n\n interaction.prevDropTarget = interaction.dropTarget;\n interaction.prevDropElement = interaction.dropElement;\n}\n\n/*\\\n * Interactable.dropzone\n [ method ]\n *\n * Returns or sets whether elements can be dropped onto this\n * Interactable to trigger drop events\n *\n * Dropzones can receive the following events:\n * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends\n * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone\n * - `dragmove` when a draggable that has entered the dropzone is moved\n * - `drop` when a draggable is dropped into this dropzone\n *\n * Use the `accept` option to allow only elements that match the given CSS\n * selector or element. The value can be:\n *\n * - **an Element** - only that element can be dropped into this dropzone.\n * - **a string**, - the element being dragged must match it as a CSS selector.\n * - **`null`** - accept options is cleared - it accepts any element.\n *\n * Use the `overlap` option to set how drops are checked for. The allowed\n * values are:\n *\n * - `'pointer'`, the pointer must be over the dropzone (default)\n * - `'center'`, the draggable element's center must be over the dropzone\n * - a number from 0-1 which is the `(intersection area) / (draggable area)`.\n * e.g. `0.5` for drop to happen when half of the area of the draggable is\n * over the dropzone\n *\n * Use the `checker` option to specify a function to check if a dragged\n * element is over this Interactable.\n *\n | interact(target)\n | .dropChecker(function(dragEvent, // related dragmove or dragend event\n | event, // TouchEvent/PointerEvent/MouseEvent\n | dropped, // bool result of the default checker\n | dropzone, // dropzone Interactable\n | dropElement, // dropzone elemnt\n | draggable, // draggable Interactable\n | draggableElement) {// draggable element\n |\n | return dropped && event.target.hasAttribute('allow-drop');\n | }\n *\n *\n - options (boolean | object | null) #optional The new value to be set.\n | interact('.drop').dropzone({\n | accept: '.can-drop' || document.getElementById('single-drop'),\n | overlap: 'pointer' || 'center' || zeroToOne\n | }\n = (boolean | object) The current setting or this Interactable\n\\*/\nInteractable.prototype.dropzone = function (options) {\n if (utils.is.object(options)) {\n this.options.drop.enabled = options.enabled === false? false: true;\n\n if (utils.is.function(options.ondrop) ) { this.events.ondrop = options.ondrop ; }\n if (utils.is.function(options.ondropactivate) ) { this.events.ondropactivate = options.ondropactivate ; }\n if (utils.is.function(options.ondropdeactivate)) { this.events.ondropdeactivate = options.ondropdeactivate; }\n if (utils.is.function(options.ondragenter) ) { this.events.ondragenter = options.ondragenter ; }\n if (utils.is.function(options.ondragleave) ) { this.events.ondragleave = options.ondragleave ; }\n if (utils.is.function(options.ondropmove) ) { this.events.ondropmove = options.ondropmove ; }\n\n if (/^(pointer|center)$/.test(options.overlap)) {\n this.options.drop.overlap = options.overlap;\n }\n else if (utils.is.number(options.overlap)) {\n this.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0);\n }\n if ('accept' in options) {\n this.options.drop.accept = options.accept;\n }\n if ('checker' in options) {\n this.options.drop.checker = options.checker;\n }\n\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drop.enabled = options;\n\n if (!options) {\n this.ondragenter = this.ondragleave = this.ondrop\n = this.ondropactivate = this.ondropdeactivate = null;\n }\n\n return this;\n }\n\n return this.options.drop;\n};\n\nInteractable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) {\n let dropped = false;\n\n // if the dropzone has no rect (eg. display: none)\n // call the custom dropChecker or just return false\n if (!(rect = rect || this.getRect(dropElement))) {\n return (this.options.drop.checker\n ? this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement)\n : false);\n }\n\n const dropOverlap = this.options.drop.overlap;\n\n if (dropOverlap === 'pointer') {\n const origin = utils.getOriginXY(draggable, draggableElement, 'drag');\n const page = utils.getPageXY(dragEvent);\n\n page.x += origin.x;\n page.y += origin.y;\n\n const horizontal = (page.x > rect.left) && (page.x < rect.right);\n const vertical = (page.y > rect.top ) && (page.y < rect.bottom);\n\n dropped = horizontal && vertical;\n }\n\n const dragRect = draggable.getRect(draggableElement);\n\n if (dragRect && dropOverlap === 'center') {\n const cx = dragRect.left + dragRect.width / 2;\n const cy = dragRect.top + dragRect.height / 2;\n\n dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom;\n }\n\n if (dragRect && utils.is.number(dropOverlap)) {\n const overlapArea = (Math.max(0, Math.min(rect.right , dragRect.right ) - Math.max(rect.left, dragRect.left))\n * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top , dragRect.top )));\n\n const overlapRatio = overlapArea / (dragRect.width * dragRect.height);\n\n dropped = overlapRatio >= dropOverlap;\n }\n\n if (this.options.drop.checker) {\n dropped = this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement);\n }\n\n return dropped;\n};\n\nInteractable.signals.on('unset', function ({ interactable }) {\n interactable.dropzone(false);\n});\n\nInteractable.settingsMethods.push('dropChecker');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.dropTarget = null; // the dropzone a drag target might be dropped into\n interaction.dropElement = null; // the element at the time of checking\n interaction.prevDropTarget = null; // the dropzone that was recently dragged away from\n interaction.prevDropElement = null; // the element at the time of checking\n interaction.dropEvents = null; // the dropEvents related to the current drag event\n\n interaction.activeDrops = {\n dropzones: [], // the dropzones that are mentioned below\n elements : [], // elements of dropzones that accept the target draggable\n rects : [], // the rects of the elements mentioned above\n };\n\n});\n\nInteraction.signals.on('stop', function ({ interaction }) {\n interaction.dropTarget = interaction.dropElement =\n interaction.prevDropTarget = interaction.prevDropElement = null;\n});\n\n/*\\\n * interact.dynamicDrop\n [ method ]\n *\n * Returns or sets whether the dimensions of dropzone elements are\n * calculated on every dragmove or only on dragstart for the default\n * dropChecker\n *\n - newValue (boolean) #optional True to check on each move. False to check only before start\n = (boolean | interact) The current setting or interact\n\\*/\ninteract.dynamicDrop = function (newValue) {\n if (utils.is.bool(newValue)) {\n //if (dragging && dynamicDrop !== newValue && !newValue) {\n //calcRects(dropzones);\n //}\n\n dynamicDrop = newValue;\n\n return interact;\n }\n return dynamicDrop;\n};\n\nutils.merge(Interactable.eventTypes, [\n 'dragenter',\n 'dragleave',\n 'dropactivate',\n 'dropdeactivate',\n 'dropmove',\n 'drop',\n]);\nactions.methodDict.drop = 'dropzone';\n\ndefaultOptions.drop = drop.defaults;\n\nmodule.exports = drop;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst gesture = {\n defaults: {\n enabled : false,\n origin : null,\n restrict: null,\n },\n\n checker: function (pointer, event, interactable, element, interaction) {\n if (interaction.pointerIds.length >= 2) {\n return { name: 'gesture' };\n }\n\n return null;\n },\n\n getCursor: function () {\n return '';\n },\n};\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturestart') { return; }\n iEvent.ds = 0;\n\n interaction.gesture.startDistance = interaction.gesture.prevDistance = iEvent.distance;\n interaction.gesture.startAngle = interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.scale = 1;\n});\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturemove') { return; }\n\n iEvent.ds = iEvent.scale - interaction.gesture.scale;\n\n interaction.target.fire(iEvent);\n\n interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.prevDistance = iEvent.distance;\n\n if (iEvent.scale !== Infinity\n && iEvent.scale !== null\n && iEvent.scale !== undefined\n && !isNaN(iEvent.scale)) {\n\n interaction.gesture.scale = iEvent.scale;\n }\n});\n\n/*\\\n * Interactable.gesturable\n [ method ]\n *\n * Gets or sets whether multitouch gestures can be performed on the\n * Interactable's element\n *\n = (boolean) Indicates if this can be the target of gesture events\n | var isGestureable = interact(element).gesturable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on gesture events (makes the Interactable gesturable)\n = (object) this Interactable\n | interact(element).gesturable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // limit multiple gestures.\n | // See the explanation in @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n\\*/\nInteractable.prototype.gesturable = function (options) {\n if (utils.is.object(options)) {\n this.options.gesture.enabled = options.enabled === false? false: true;\n this.setPerAction('gesture', options);\n this.setOnEvents('gesture', options);\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.gesture.enabled = options;\n\n if (!options) {\n this.ongesturestart = this.ongesturestart = this.ongestureend = null;\n }\n\n return this;\n }\n\n return this.options.gesture;\n};\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action, event, starting, ending, deltaSource }) {\n if (action !== 'gesture') { return; }\n\n const pointers = interaction.pointers;\n\n iEvent.touches = [pointers[0], pointers[1]];\n\n if (starting) {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = 1;\n iEvent.ds = 0;\n iEvent.angle = utils.touchAngle(pointers, undefined, deltaSource);\n iEvent.da = 0;\n }\n else if (ending || event instanceof InteractEvent) {\n iEvent.distance = interaction.prevEvent.distance;\n iEvent.box = interaction.prevEvent.box;\n iEvent.scale = interaction.prevEvent.scale;\n iEvent.ds = iEvent.scale - 1;\n iEvent.angle = interaction.prevEvent.angle;\n iEvent.da = iEvent.angle - interaction.gesture.startAngle;\n }\n else {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = iEvent.distance / interaction.gesture.startDistance;\n iEvent.angle = utils.touchAngle(pointers, interaction.gesture.prevAngle, deltaSource);\n\n iEvent.ds = iEvent.scale - interaction.gesture.prevScale;\n iEvent.da = iEvent.angle - interaction.gesture.prevAngle;\n }\n});\n\nInteraction.signals.on('new', function (interaction) {\n interaction.gesture = {\n start: { x: 0, y: 0 },\n\n startDistance: 0, // distance between two touches of touchStart\n prevDistance : 0,\n distance : 0,\n\n scale: 1, // gesture.distance / gesture.startDistance\n\n startAngle: 0, // angle of line joining two touches\n prevAngle : 0, // angle of the previous gesture event\n };\n});\n\nactions.gesture = gesture;\nactions.names.push('gesture');\nutils.merge(Interactable.eventTypes, [\n 'gesturestart',\n 'gesturemove',\n 'gestureend',\n]);\nactions.methodDict.gesture = 'gesturable';\n\ndefaultOptions.gesture = gesture.defaults;\n\nmodule.exports = gesture;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\n// Less Precision with touch input\nconst defaultMargin = browser.supportsTouch || browser.supportsPointerEvent? 20: 10;\n\nconst resize = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n square: false,\n preserveAspectRatio: false,\n axis: 'xy',\n\n // use default margin\n margin: NaN,\n\n // object with props left, right, top, bottom which are\n // true/false values to resize when the pointer is over that edge,\n // CSS selectors to match the handles for each direction\n // or the Elements for each handle\n edges: null,\n\n // a value of 'none' will limit the resize rect to a minimum of 0x0\n // 'negate' will alow the rect to have negative width/height\n // 'reposition' will keep the width/height positive by swapping\n // the top and bottom edges and/or swapping the left and right edges\n invert: 'none',\n },\n\n checker: function (pointer, event, interactable, element, interaction, rect) {\n if (!rect) { return null; }\n\n const page = utils.extend({}, interaction.curCoords.page);\n const options = interactable.options;\n\n if (options.resize.enabled) {\n const resizeOptions = options.resize;\n const resizeEdges = { left: false, right: false, top: false, bottom: false };\n\n // if using resize.edges\n if (utils.is.object(resizeOptions.edges)) {\n for (const edge in resizeEdges) {\n resizeEdges[edge] = checkResizeEdge(edge,\n resizeOptions.edges[edge],\n page,\n interaction._eventTarget,\n element,\n rect,\n resizeOptions.margin || defaultMargin);\n }\n\n resizeEdges.left = resizeEdges.left && !resizeEdges.right;\n resizeEdges.top = resizeEdges.top && !resizeEdges.bottom;\n\n if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) {\n return {\n name: 'resize',\n edges: resizeEdges,\n };\n }\n }\n else {\n const right = options.resize.axis !== 'y' && page.x > (rect.right - defaultMargin);\n const bottom = options.resize.axis !== 'x' && page.y > (rect.bottom - defaultMargin);\n\n if (right || bottom) {\n return {\n name: 'resize',\n axes: (right? 'x' : '') + (bottom? 'y' : ''),\n };\n }\n }\n }\n\n return null;\n },\n\n cursors: (browser.isIe9OrOlder ? {\n x : 'e-resize',\n y : 's-resize',\n xy: 'se-resize',\n\n top : 'n-resize',\n left : 'w-resize',\n bottom : 's-resize',\n right : 'e-resize',\n topleft : 'se-resize',\n bottomright: 'se-resize',\n topright : 'ne-resize',\n bottomleft : 'ne-resize',\n } : {\n x : 'ew-resize',\n y : 'ns-resize',\n xy: 'nwse-resize',\n\n top : 'ns-resize',\n left : 'ew-resize',\n bottom : 'ns-resize',\n right : 'ew-resize',\n topleft : 'nwse-resize',\n bottomright: 'nwse-resize',\n topright : 'nesw-resize',\n bottomleft : 'nesw-resize',\n }),\n\n getCursor: function (action) {\n if (action.axis) {\n return resize.cursors[action.name + action.axis];\n }\n else if (action.edges) {\n let cursorKey = '';\n const edgeNames = ['top', 'bottom', 'left', 'right'];\n\n for (let i = 0; i < 4; i++) {\n if (action.edges[edgeNames[i]]) {\n cursorKey += edgeNames[i];\n }\n }\n\n return resize.cursors[cursorKey];\n }\n },\n};\n\n// resizestart\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'resizestart' || !interaction.prepared.edges) {\n return;\n }\n\n const startRect = interaction.target.getRect(interaction.element);\n const resizeOptions = interaction.target.options.resize;\n\n /*\n * When using the `resizable.square` or `resizable.preserveAspectRatio` options, resizing from one edge\n * will affect another. E.g. with `resizable.square`, resizing to make the right edge larger will make\n * the bottom edge larger by the same amount. We call these 'linked' edges. Any linked edges will depend\n * on the active edges and the edge being interacted with.\n */\n if (resizeOptions.square || resizeOptions.preserveAspectRatio) {\n const linkedEdges = utils.extend({}, interaction.prepared.edges);\n\n linkedEdges.top = linkedEdges.top || (linkedEdges.left && !linkedEdges.bottom);\n linkedEdges.left = linkedEdges.left || (linkedEdges.top && !linkedEdges.right );\n linkedEdges.bottom = linkedEdges.bottom || (linkedEdges.right && !linkedEdges.top );\n linkedEdges.right = linkedEdges.right || (linkedEdges.bottom && !linkedEdges.left );\n\n interaction.prepared._linkedEdges = linkedEdges;\n }\n else {\n interaction.prepared._linkedEdges = null;\n }\n\n // if using `resizable.preserveAspectRatio` option, record aspect ratio at the start of the resize\n if (resizeOptions.preserveAspectRatio) {\n interaction.resizeStartAspectRatio = startRect.width / startRect.height;\n }\n\n interaction.resizeRects = {\n start : startRect,\n current : utils.extend({}, startRect),\n inverted : utils.extend({}, startRect),\n previous : utils.extend({}, startRect),\n delta : {\n left: 0, right : 0, width : 0,\n top : 0, bottom: 0, height: 0,\n },\n };\n\n iEvent.rect = interaction.resizeRects.inverted;\n iEvent.deltaRect = interaction.resizeRects.delta;\n});\n\n// resizemove\nInteractEvent.signals.on('new', function ({ iEvent, phase, interaction }) {\n if (phase !== 'move' || !interaction.prepared.edges) { return; }\n\n const resizeOptions = interaction.target.options.resize;\n const invert = resizeOptions.invert;\n const invertible = invert === 'reposition' || invert === 'negate';\n\n let edges = interaction.prepared.edges;\n\n const start = interaction.resizeRects.start;\n const current = interaction.resizeRects.current;\n const inverted = interaction.resizeRects.inverted;\n const delta = interaction.resizeRects.delta;\n const previous = utils.extend(interaction.resizeRects.previous, inverted);\n const originalEdges = edges;\n\n let dx = iEvent.dx;\n let dy = iEvent.dy;\n\n if (resizeOptions.preserveAspectRatio || resizeOptions.square) {\n // `resize.preserveAspectRatio` takes precedence over `resize.square`\n const startAspectRatio = resizeOptions.preserveAspectRatio\n ? interaction.resizeStartAspectRatio\n : 1;\n\n edges = interaction.prepared._linkedEdges;\n\n if ((originalEdges.left && originalEdges.bottom)\n || (originalEdges.right && originalEdges.top)) {\n dy = -dx / startAspectRatio;\n }\n else if (originalEdges.left || originalEdges.right ) { dy = dx / startAspectRatio; }\n else if (originalEdges.top || originalEdges.bottom) { dx = dy * startAspectRatio; }\n }\n\n // update the 'current' rect without modifications\n if (edges.top ) { current.top += dy; }\n if (edges.bottom) { current.bottom += dy; }\n if (edges.left ) { current.left += dx; }\n if (edges.right ) { current.right += dx; }\n\n if (invertible) {\n // if invertible, copy the current rect\n utils.extend(inverted, current);\n\n if (invert === 'reposition') {\n // swap edge values if necessary to keep width/height positive\n let swap;\n\n if (inverted.top > inverted.bottom) {\n swap = inverted.top;\n\n inverted.top = inverted.bottom;\n inverted.bottom = swap;\n }\n if (inverted.left > inverted.right) {\n swap = inverted.left;\n\n inverted.left = inverted.right;\n inverted.right = swap;\n }\n }\n }\n else {\n // if not invertible, restrict to minimum of 0x0 rect\n inverted.top = Math.min(current.top, start.bottom);\n inverted.bottom = Math.max(current.bottom, start.top);\n inverted.left = Math.min(current.left, start.right);\n inverted.right = Math.max(current.right, start.left);\n }\n\n inverted.width = inverted.right - inverted.left;\n inverted.height = inverted.bottom - inverted.top ;\n\n for (const edge in inverted) {\n delta[edge] = inverted[edge] - previous[edge];\n }\n\n iEvent.edges = interaction.prepared.edges;\n iEvent.rect = inverted;\n iEvent.deltaRect = delta;\n});\n\n/*\\\n * Interactable.resizable\n [ method ]\n *\n * Gets or sets whether resize actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of resize elements\n | var isResizeable = interact('input[type=text]').resizable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on resize events (object makes the Interactable resizable)\n = (object) This Interactable\n | interact(element).resizable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | edges: {\n | top : true, // Use pointer coords to check for resize.\n | left : false, // Disable resizing from left edge.\n | bottom: '.resize-s',// Resize if pointer target matches selector\n | right : handleEl // Resize if pointer target is the given Element\n | },\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height are adjusted at a 1:1 ratio.\n | square: false,\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height maintain the aspect ratio they had when resizing started.\n | preserveAspectRatio: false,\n |\n | // a value of 'none' will limit the resize rect to a minimum of 0x0\n | // 'negate' will allow the rect to have negative width/height\n | // 'reposition' will keep the width/height positive by swapping\n | // the top and bottom edges and/or swapping the left and right edges\n | invert: 'none' || 'negate' || 'reposition'\n |\n | // limit multiple resizes.\n | // See the explanation in the @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n \\*/\nInteractable.prototype.resizable = function (options) {\n if (utils.is.object(options)) {\n this.options.resize.enabled = options.enabled === false? false: true;\n this.setPerAction('resize', options);\n this.setOnEvents('resize', options);\n\n if (/^x$|^y$|^xy$/.test(options.axis)) {\n this.options.resize.axis = options.axis;\n }\n else if (options.axis === null) {\n this.options.resize.axis = defaultOptions.resize.axis;\n }\n\n if (utils.is.bool(options.preserveAspectRatio)) {\n this.options.resize.preserveAspectRatio = options.preserveAspectRatio;\n }\n else if (utils.is.bool(options.square)) {\n this.options.resize.square = options.square;\n }\n\n return this;\n }\n if (utils.is.bool(options)) {\n this.options.resize.enabled = options;\n\n if (!options) {\n this.onresizestart = this.onresizestart = this.onresizeend = null;\n }\n\n return this;\n }\n return this.options.resize;\n};\n\nfunction checkResizeEdge (name, value, page, element, interactableElement, rect, margin) {\n // false, '', undefined, null\n if (!value) { return false; }\n\n // true value, use pointer coords and element rect\n if (value === true) {\n // if dimensions are negative, \"switch\" edges\n const width = utils.is.number(rect.width )? rect.width : rect.right - rect.left;\n const height = utils.is.number(rect.height)? rect.height : rect.bottom - rect.top ;\n\n if (width < 0) {\n if (name === 'left' ) { name = 'right'; }\n else if (name === 'right') { name = 'left' ; }\n }\n if (height < 0) {\n if (name === 'top' ) { name = 'bottom'; }\n else if (name === 'bottom') { name = 'top' ; }\n }\n\n if (name === 'left' ) { return page.x < ((width >= 0? rect.left: rect.right ) + margin); }\n if (name === 'top' ) { return page.y < ((height >= 0? rect.top : rect.bottom) + margin); }\n\n if (name === 'right' ) { return page.x > ((width >= 0? rect.right : rect.left) - margin); }\n if (name === 'bottom') { return page.y > ((height >= 0? rect.bottom: rect.top ) - margin); }\n }\n\n // the remaining checks require an element\n if (!utils.is.element(element)) { return false; }\n\n return utils.is.element(value)\n // the value is an element to use as a resize handle\n ? value === element\n // otherwise check if element matches value as selector\n : utils.matchesUpTo(element, value, interactableElement);\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.resizeAxes = 'xy';\n});\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action }) {\n if (action !== 'resize' || !interaction.resizeAxes) { return; }\n\n const options = interaction.target.options;\n\n if (options.resize.square) {\n if (interaction.resizeAxes === 'y') {\n iEvent.dx = iEvent.dy;\n }\n else {\n iEvent.dy = iEvent.dx;\n }\n iEvent.axes = 'xy';\n }\n else {\n iEvent.axes = interaction.resizeAxes;\n\n if (interaction.resizeAxes === 'x') {\n iEvent.dy = 0;\n }\n else if (interaction.resizeAxes === 'y') {\n iEvent.dx = 0;\n }\n }\n});\n\nactions.resize = resize;\nactions.names.push('resize');\nutils.merge(Interactable.eventTypes, [\n 'resizestart',\n 'resizemove',\n 'resizeinertiastart',\n 'resizeinertiaresume',\n 'resizeend',\n]);\nactions.methodDict.resize = 'resizable';\n\ndefaultOptions.resize = resize.defaults;\n\nmodule.exports = resize;\n","const raf = require('./utils/raf');\nconst getWindow = require('./utils/window').getWindow;\nconst is = require('./utils/is');\nconst domUtils = require('./utils/domUtils');\nconst Interaction = require('./Interaction');\nconst defaultOptions = require('./defaultOptions');\n\nconst autoScroll = {\n defaults: {\n enabled : false,\n container: null, // the item that is scrolled (Window or HTMLElement)\n margin : 60,\n speed : 300, // the scroll speed in pixels per second\n },\n\n interaction: null,\n i: null, // the handle returned by window.setInterval\n x: 0, y: 0, // Direction each pulse is to scroll in\n\n isScrolling: false,\n prevTime: 0,\n\n start: function (interaction) {\n autoScroll.isScrolling = true;\n raf.cancel(autoScroll.i);\n\n autoScroll.interaction = interaction;\n autoScroll.prevTime = new Date().getTime();\n autoScroll.i = raf.request(autoScroll.scroll);\n },\n\n stop: function () {\n autoScroll.isScrolling = false;\n raf.cancel(autoScroll.i);\n },\n\n // scroll the window by the values in scroll.x/y\n scroll: function () {\n const options = autoScroll.interaction.target.options[autoScroll.interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(autoScroll.interaction.element);\n const now = new Date().getTime();\n // change in time in seconds\n const dt = (now - autoScroll.prevTime) / 1000;\n // displacement\n const s = options.speed * dt;\n\n if (s >= 1) {\n if (is.window(container)) {\n container.scrollBy(autoScroll.x * s, autoScroll.y * s);\n }\n else if (container) {\n container.scrollLeft += autoScroll.x * s;\n container.scrollTop += autoScroll.y * s;\n }\n\n autoScroll.prevTime = now;\n }\n\n if (autoScroll.isScrolling) {\n raf.cancel(autoScroll.i);\n autoScroll.i = raf.request(autoScroll.scroll);\n }\n },\n check: function (interactable, actionName) {\n const options = interactable.options;\n\n return options[actionName].autoScroll && options[actionName].autoScroll.enabled;\n },\n onInteractionMove: function ({ interaction, pointer }) {\n if (!(interaction.interacting()\n && autoScroll.check(interaction.target, interaction.prepared.name))) {\n return;\n }\n\n if (interaction.simulation) {\n autoScroll.x = autoScroll.y = 0;\n return;\n }\n\n let top;\n let right;\n let bottom;\n let left;\n\n const options = interaction.target.options[interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(interaction.element);\n\n if (is.window(container)) {\n left = pointer.clientX < autoScroll.margin;\n top = pointer.clientY < autoScroll.margin;\n right = pointer.clientX > container.innerWidth - autoScroll.margin;\n bottom = pointer.clientY > container.innerHeight - autoScroll.margin;\n }\n else {\n const rect = domUtils.getElementClientRect(container);\n\n left = pointer.clientX < rect.left + autoScroll.margin;\n top = pointer.clientY < rect.top + autoScroll.margin;\n right = pointer.clientX > rect.right - autoScroll.margin;\n bottom = pointer.clientY > rect.bottom - autoScroll.margin;\n }\n\n autoScroll.x = (right ? 1: left? -1: 0);\n autoScroll.y = (bottom? 1: top? -1: 0);\n\n if (!autoScroll.isScrolling) {\n // set the autoScroll properties to those of the target\n autoScroll.margin = options.margin;\n autoScroll.speed = options.speed;\n\n autoScroll.start(interaction);\n }\n },\n};\n\nInteraction.signals.on('stop-active', function () {\n autoScroll.stop();\n});\n\nInteraction.signals.on('action-move', autoScroll.onInteractionMove);\n\ndefaultOptions.perAction.autoScroll = autoScroll.defaults;\n\nmodule.exports = autoScroll;\n","const Interactable = require('../Interactable');\nconst actions = require('../actions/base');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.ignoreFrom\n [ method ]\n *\n * If the target of the `mousedown`, `pointerdown` or `touchstart`\n * event or any of it's parents match the given CSS selector or\n * Element, no drag/resize/gesture is started.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to not ignore any elements\n = (string | Element | object) The current ignoreFrom value or this Interactable\n **\n | interact(element, { ignoreFrom: document.getElementById('no-action') });\n | // or\n | interact(element).ignoreFrom('input, textarea, a');\n\\*/\nInteractable.prototype.ignoreFrom = function (newValue) {\n return this._backCompatOption('ignoreFrom', newValue);\n};\n\n/*\\\n * Interactable.allowFrom\n [ method ]\n *\n * A drag/resize/gesture is started only If the target of the\n * `mousedown`, `pointerdown` or `touchstart` event or any of it's\n * parents match the given CSS selector or Element.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to allow from any element\n = (string | Element | object) The current allowFrom value or this Interactable\n **\n | interact(element, { allowFrom: document.getElementById('drag-handle') });\n | // or\n | interact(element).allowFrom('.handle');\n\\*/\nInteractable.prototype.allowFrom = function (newValue) {\n return this._backCompatOption('allowFrom', newValue);\n};\n\nInteractable.prototype.testIgnore = function (ignoreFrom, interactableElement, element) {\n if (!ignoreFrom || !is.element(element)) { return false; }\n\n if (is.string(ignoreFrom)) {\n return domUtils.matchesUpTo(element, ignoreFrom, interactableElement);\n }\n else if (is.element(ignoreFrom)) {\n return domUtils.nodeContains(ignoreFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testAllow = function (allowFrom, interactableElement, element) {\n if (!allowFrom) { return true; }\n\n if (!is.element(element)) { return false; }\n\n if (is.string(allowFrom)) {\n return domUtils.matchesUpTo(element, allowFrom, interactableElement);\n }\n else if (is.element(allowFrom)) {\n return domUtils.nodeContains(allowFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testIgnoreAllow = function (options, interactableElement, eventTarget) {\n return (!this.testIgnore(options.ignoreFrom, interactableElement, eventTarget)\n && this.testAllow(options.allowFrom, interactableElement, eventTarget));\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (event.buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\n","const interact = require('../interact');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst actions = require('../actions/base');\nconst defaultOptions = require('../defaultOptions');\nconst browser = require('../utils/browser');\nconst scope = require('../scope');\nconst utils = require('../utils');\nconst signals = require('../utils/Signals').new();\n\nrequire('./InteractableMethods');\n\nconst autoStart = {\n signals,\n withinInteractionLimit,\n // Allow this many interactions to happen simultaneously\n maxInteractions: Infinity,\n defaults: {\n perAction: {\n manualStart: false,\n max: Infinity,\n maxPerElement: 1,\n allowFrom: null,\n ignoreFrom: null,\n },\n },\n setActionDefaults: function (action) {\n utils.extend(action.defaults, autoStart.defaults.perAction);\n },\n};\n\n// set cursor style on mousedown\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget }) {\n if (interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\n// set cursor style on mousemove\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget }) {\n if (!interaction.mouse\n || interaction.pointerIsDown\n || interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\nInteraction.signals.on('move', function (arg) {\n const { interaction, event } = arg;\n\n if (!interaction.pointerIsDown\n || interaction.interacting()\n || !interaction.pointerWasMoved\n || !interaction.prepared.name) {\n return;\n }\n\n signals.fire('before-start', arg);\n\n const target = interaction.target;\n\n if (interaction.prepared.name && target) {\n // check manualStart and interaction limit\n if (target.options[interaction.prepared.name].manualStart\n || !withinInteractionLimit(target, interaction.element, interaction.prepared)) {\n interaction.stop(event);\n }\n else {\n interaction.start(interaction.prepared, target, interaction.element);\n }\n }\n});\n\n// Check if the current target supports the action.\n// If so, return the validated action. Otherwise, return null\nfunction validateAction (action, interactable, element, eventTarget) {\n if (utils.is.object(action)\n && interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget)\n && interactable.options[action.name].enabled\n && withinInteractionLimit(interactable, element, action)) {\n return action;\n }\n\n return null;\n}\n\nfunction validateSelector (interaction, pointer, event, matches, matchElements, eventTarget) {\n for (let i = 0, len = matches.length; i < len; i++) {\n const match = matches[i];\n const matchElement = matchElements[i];\n const action = validateAction(match.getAction(pointer, event, interaction, matchElement),\n match,\n matchElement,\n eventTarget);\n\n if (action) {\n return {\n action,\n target: match,\n element: matchElement,\n };\n }\n }\n\n return {};\n}\n\nfunction getActionInfo (interaction, pointer, event, eventTarget) {\n let matches = [];\n let matchElements = [];\n\n let element = eventTarget;\n let action = null;\n\n function pushMatches (interactable, selector, context) {\n const elements = (browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined);\n\n if (utils.matchesSelector(element, selector, elements)) {\n\n matches.push(interactable);\n matchElements.push(element);\n }\n }\n\n while (utils.is.element(element)) {\n matches = [];\n matchElements = [];\n\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && (action = validateAction(elementInteractable.getAction(pointer, event, interaction, element, eventTarget),\n elementInteractable,\n element,\n eventTarget))\n && !elementInteractable.options[action.name].manualStart) {\n return {\n element,\n action,\n target: elementInteractable,\n };\n }\n else {\n scope.interactables.forEachSelector(pushMatches, element);\n\n const actionInfo = validateSelector(interaction, pointer, event, matches, matchElements, eventTarget);\n\n if (actionInfo.action\n && !actionInfo.target.options[actionInfo.action.name].manualStart) {\n return actionInfo;\n }\n }\n\n element = utils.parentNode(element);\n }\n\n return {};\n}\n\nfunction prepare (interaction, { action, target, element }) {\n action = action || {};\n\n if (interaction.target && interaction.target.options.styleCursor) {\n interaction.target._doc.documentElement.style.cursor = '';\n }\n\n interaction.target = target;\n interaction.element = element;\n utils.copyAction(interaction.prepared, action);\n\n if (target && target.options.styleCursor) {\n const cursor = action? actions[action.name].getCursor(action) : '';\n interaction.target._doc.documentElement.style.cursor = cursor;\n }\n\n signals.fire('prepared', { interaction: interaction });\n}\n\nInteraction.signals.on('stop', function ({ interaction }) {\n const target = interaction.target;\n\n if (target && target.options.styleCursor) {\n target._doc.documentElement.style.cursor = '';\n }\n});\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (utils.is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (utils.is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n const buttons = event.buttons || ({\n 0: 1,\n 1: 4,\n 3: 8,\n 4: 16,\n })[event.button];\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\nfunction withinInteractionLimit (interactable, element, action) {\n const options = interactable.options;\n const maxActions = options[action.name].max;\n const maxPerElement = options[action.name].maxPerElement;\n let activeInteractions = 0;\n let targetCount = 0;\n let targetElementCount = 0;\n\n // no actions if any of these values == 0\n if (!(maxActions && maxPerElement && autoStart.maxInteractions)) { return; }\n\n for (let i = 0, len = scope.interactions.length; i < len; i++) {\n const interaction = scope.interactions[i];\n const otherAction = interaction.prepared.name;\n\n if (!interaction.interacting()) { continue; }\n\n activeInteractions++;\n\n if (activeInteractions >= autoStart.maxInteractions) {\n return false;\n }\n\n if (interaction.target !== interactable) { continue; }\n\n targetCount += (otherAction === action.name)|0;\n\n if (targetCount >= maxActions) {\n return false;\n }\n\n if (interaction.element === element) {\n targetElementCount++;\n\n if (otherAction !== action.name || targetElementCount >= maxPerElement) {\n return false;\n }\n }\n }\n\n return autoStart.maxInteractions > 0;\n}\n\n/*\\\n * interact.maxInteractions\n [ method ]\n **\n * Returns or sets the maximum number of concurrent interactions allowed.\n * By default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables\n * and elements, you need to enable it in the draggable, resizable and\n * gesturable `'max'` and `'maxPerElement'` options.\n **\n - newValue (number) #optional Any number. newValue <= 0 means no interactions.\n\\*/\ninteract.maxInteractions = function (newValue) {\n if (utils.is.number(newValue)) {\n autoStart.maxInteractions = newValue;\n\n return this;\n }\n\n return autoStart.maxInteractions;\n};\n\nInteractable.settingsMethods.push('styleCursor');\nInteractable.settingsMethods.push('actionChecker');\nInteractable.settingsMethods.push('ignoreFrom');\nInteractable.settingsMethods.push('allowFrom');\n\ndefaultOptions.base.actionChecker = null;\ndefaultOptions.base.styleCursor = true;\n\nutils.extend(defaultOptions.perAction, autoStart.defaults.perAction);\n\nmodule.exports = autoStart;\n","const autoStart = require('./base');\nconst Interaction = require('../Interaction');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.delayTimer = null;\n});\n\nautoStart.signals.on('prepared', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.delayTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.target, interaction.element);\n }, delay);\n }\n});\n\nInteraction.signals.on('move', function ({ interaction, duplicate }) {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.delayTimer);\n }\n});\n\n// prevent regular down->move autoStart\nautoStart.signals.on('before-start', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.prepared.name = null;\n }\n});\n","const autoStart = require('./base');\nconst scope = require('../scope');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\n\nconst { matchesSelector, parentNode } = require('../utils/domUtils');\n\nautoStart.setActionDefaults(require('../actions/drag'));\n\nautoStart.signals.on('before-start', function ({ interaction, eventTarget, dx, dy }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // check if a drag is in the correct axis\n const absX = Math.abs(dx);\n const absY = Math.abs(dy);\n const options = interaction.target.options.drag;\n const startAxis = options.startAxis;\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy');\n\n interaction.prepared.axis = options.lockAxis === 'start'\n ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n : options.lockAxis;\n\n // if the movement isn't in the startAxis of the interactable\n if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) {\n // cancel the prepared action\n interaction.prepared.name = null;\n\n // then try to get a drag from another ineractable\n\n if (!interaction.prepared.name) {\n\n let element = eventTarget;\n\n const getDraggable = function (interactable, selector, context) {\n const elements = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n if (interactable === interaction.target) { return; }\n\n if (!options.manualStart\n && !interactable.testIgnoreAllow(options, element, eventTarget)\n && matchesSelector(element, selector, elements)) {\n\n const action = interactable.getAction(interaction.downPointer,\n interaction.downEvent,\n interaction,\n element);\n\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, interactable)\n && autoStart.validateAction(action, interactable, element, eventTarget)) {\n\n return interactable;\n }\n }\n };\n\n let action = null;\n\n // check all interactables\n while (is.element(element)) {\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && elementInteractable !== interaction.target\n && !elementInteractable.options.drag.manualStart) {\n\n action = elementInteractable.getAction(interaction.downPointer, interaction.downEvent, interaction, element);\n }\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, elementInteractable)) {\n\n interaction.prepared.name = 'drag';\n interaction.target = elementInteractable;\n interaction.element = element;\n break;\n }\n\n const selectorInteractable = scope.interactables.forEachSelector(getDraggable, element);\n\n if (selectorInteractable) {\n interaction.prepared.name = 'drag';\n interaction.target = selectorInteractable;\n interaction.element = element;\n break;\n }\n\n element = parentNode(element);\n }\n }\n }\n});\n\nfunction checkStartAxis (startAxis, interactable) {\n if (!interactable) { return false; }\n\n const thisAxis = interactable.options.drag.startAxis;\n\n return (startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis);\n}\n","require('./base').setActionDefaults(require('../actions/gesture'));\n","require('./base').setActionDefaults(require('../actions/resize'));\n","module.exports = {\n base: {\n accept : null,\n preventDefault: 'auto',\n deltaSource : 'page',\n },\n\n perAction: {\n origin: { x: 0, y: 0 },\n\n // only allow left button by default\n // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n mouseButtons: 1,\n\n inertia: {\n enabled : false,\n resistance : 10, // the lambda in exponential decay\n minSpeed : 100, // target speed must be above this for inertia to start\n endSpeed : 10, // the speed at which inertia is slow enough to stop\n allowResume : true, // allow resuming an action in inertia phase\n smoothEndDuration: 300, // animate to snap/restrict endOnly if there's no inertia\n },\n },\n};\n","/* browser entry point */\n\n// Legacy browser support\nrequire('./legacyBrowsers');\n\n// inertia\nrequire('./inertia');\n\n// modifiers\nrequire('./modifiers/snap');\nrequire('./modifiers/restrict');\n\n// pointerEvents\nrequire('./pointerEvents/base');\nrequire('./pointerEvents/holdRepeat');\nrequire('./pointerEvents/interactableTargets');\n\n// delay\nrequire('./autoStart/delay');\n\n// actions\nrequire('./actions/gesture');\nrequire('./actions/resize');\nrequire('./actions/drag');\nrequire('./actions/drop');\n\n// load these modifiers after resize is loaded\nrequire('./modifiers/snapSize');\nrequire('./modifiers/restrictEdges');\nrequire('./modifiers/restrictSize');\n\n// autoStart actions\nrequire('./autoStart/gesture');\nrequire('./autoStart/resize');\nrequire('./autoStart/drag');\n\n// Interactable preventDefault setting\nrequire('./interactablePreventDefault.js');\n\n// autoScroll\nrequire('./autoScroll');\n\n// export interact\nmodule.exports = require('./interact');\n","const InteractEvent = require('./InteractEvent');\nconst Interaction = require('./Interaction');\nconst modifiers = require('./modifiers');\nconst utils = require('./utils');\nconst animationFrame = require('./utils/raf');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.inertiaStatus = {\n active : false,\n smoothEnd : false,\n allowResume: false,\n\n startEvent: null,\n upCoords : {},\n\n xe: 0, ye: 0,\n sx: 0, sy: 0,\n\n t0: 0,\n vx0: 0, vys: 0,\n duration: 0,\n\n lambda_v0: 0,\n one_ve_v0: 0,\n i : null,\n };\n\n interaction.boundInertiaFrame = () => inertiaFrame .apply(interaction);\n interaction.boundSmoothEndFrame = () => smoothEndFrame.apply(interaction);\n});\n\nInteraction.signals.on('down', function ({ interaction, event, pointer, eventTarget }) {\n const status = interaction.inertiaStatus;\n\n // Check if the down event hits the current inertia target\n if (status.active) {\n let element = eventTarget;\n\n // climb up the DOM tree from the event target\n while (utils.is.element(element)) {\n\n // if interaction element is the current inertia target element\n if (element === interaction.element) {\n // stop inertia\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n\n // update pointers to the down event's coordinates\n interaction.updatePointer(pointer);\n utils.setCoords(interaction.curCoords, interaction.pointers);\n\n // fire appropriate signals\n const signalArg = { interaction };\n Interaction.signals.fire('before-action-move', signalArg);\n Interaction.signals.fire('action-resume' , signalArg);\n\n // fire a reume event\n const resumeEvent = new InteractEvent(interaction,\n event,\n interaction.prepared.name,\n 'inertiaresume',\n interaction.element);\n\n interaction.target.fire(resumeEvent);\n interaction.prevEvent = resumeEvent;\n modifiers.resetStatuses(interaction.modifierStatuses);\n\n utils.copyCoords(interaction.prevCoords, interaction.curCoords);\n break;\n }\n\n element = utils.parentNode(element);\n }\n }\n});\n\nInteraction.signals.on('up', function ({ interaction, event }) {\n const status = interaction.inertiaStatus;\n\n if (!interaction.interacting() || status.active) { return; }\n\n const target = interaction.target;\n const options = target && target.options;\n const inertiaOptions = options && interaction.prepared.name && options[interaction.prepared.name].inertia;\n\n const now = new Date().getTime();\n const statuses = {};\n const page = utils.extend({}, interaction.curCoords.page);\n const pointerSpeed = interaction.pointerDelta.client.speed;\n\n let smoothEnd = false;\n let modifierResult;\n\n // check if inertia should be started\n const inertiaPossible = (inertiaOptions && inertiaOptions.enabled\n && interaction.prepared.name !== 'gesture'\n && event !== status.startEvent);\n\n const inertia = (inertiaPossible\n && (now - interaction.curCoords.timeStamp) < 50\n && pointerSpeed > inertiaOptions.minSpeed\n && pointerSpeed > inertiaOptions.endSpeed);\n\n const modifierArg = {\n interaction,\n pageCoords: page,\n statuses,\n preEnd: true,\n requireEndOnly: true,\n };\n\n // smoothEnd\n if (inertiaPossible && !inertia) {\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n if (modifierResult.shouldMove && modifierResult.locked) {\n smoothEnd = true;\n }\n }\n\n if (!(inertia || smoothEnd)) { return; }\n\n utils.copyCoords(status.upCoords, interaction.curCoords);\n\n interaction.pointers[0] = status.startEvent =\n new InteractEvent(interaction, event, interaction.prepared.name, 'inertiastart', interaction.element);\n\n status.t0 = now;\n\n status.active = true;\n status.allowResume = inertiaOptions.allowResume;\n interaction.simulation = status;\n\n target.fire(status.startEvent);\n\n if (inertia) {\n status.vx0 = interaction.pointerDelta.client.vx;\n status.vy0 = interaction.pointerDelta.client.vy;\n status.v0 = pointerSpeed;\n\n calcInertia(interaction, status);\n\n utils.extend(page, interaction.curCoords.page);\n\n page.x += status.xe;\n page.y += status.ye;\n\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n status.modifiedXe += modifierResult.dx;\n status.modifiedYe += modifierResult.dy;\n\n status.i = animationFrame.request(interaction.boundInertiaFrame);\n }\n else {\n status.smoothEnd = true;\n status.xe = modifierResult.dx;\n status.ye = modifierResult.dy;\n\n status.sx = status.sy = 0;\n\n status.i = animationFrame.request(interaction.boundSmoothEndFrame);\n }\n});\n\nInteraction.signals.on('stop-active', function ({ interaction }) {\n const status = interaction.inertiaStatus;\n\n if (status.active) {\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n }\n});\n\nfunction calcInertia (interaction, status) {\n const inertiaOptions = interaction.target.options[interaction.prepared.name].inertia;\n const lambda = inertiaOptions.resistance;\n const inertiaDur = -Math.log(inertiaOptions.endSpeed / status.v0) / lambda;\n\n status.x0 = interaction.prevEvent.pageX;\n status.y0 = interaction.prevEvent.pageY;\n status.t0 = status.startEvent.timeStamp / 1000;\n status.sx = status.sy = 0;\n\n status.modifiedXe = status.xe = (status.vx0 - inertiaDur) / lambda;\n status.modifiedYe = status.ye = (status.vy0 - inertiaDur) / lambda;\n status.te = inertiaDur;\n\n status.lambda_v0 = lambda / status.v0;\n status.one_ve_v0 = 1 - inertiaOptions.endSpeed / status.v0;\n}\n\nfunction inertiaFrame () {\n updateInertiaCoords(this);\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n\n const status = this.inertiaStatus;\n const options = this.target.options[this.prepared.name].inertia;\n const lambda = options.resistance;\n const t = new Date().getTime() / 1000 - status.t0;\n\n if (t < status.te) {\n\n const progress = 1 - (Math.exp(-lambda * t) - status.lambda_v0) / status.one_ve_v0;\n\n if (status.modifiedXe === status.xe && status.modifiedYe === status.ye) {\n status.sx = status.xe * progress;\n status.sy = status.ye * progress;\n }\n else {\n const quadPoint = utils.getQuadraticCurvePoint(0, 0,\n status.xe,\n status.ye,\n status.modifiedXe,\n status.modifiedYe,\n progress);\n\n status.sx = quadPoint.x;\n status.sy = quadPoint.y;\n }\n\n this.doMove();\n\n status.i = animationFrame.request(this.boundInertiaFrame);\n }\n else {\n status.sx = status.modifiedXe;\n status.sy = status.modifiedYe;\n\n this.doMove();\n this.end(status.startEvent);\n status.active = false;\n this.simulation = null;\n }\n\n utils.copyCoords(this.prevCoords, this.curCoords);\n}\n\nfunction smoothEndFrame () {\n updateInertiaCoords(this);\n\n const status = this.inertiaStatus;\n const t = new Date().getTime() - status.t0;\n const duration = this.target.options[this.prepared.name].inertia.smoothEndDuration;\n\n if (t < duration) {\n status.sx = utils.easeOutQuad(t, 0, status.xe, duration);\n status.sy = utils.easeOutQuad(t, 0, status.ye, duration);\n\n this.pointerMove(status.startEvent, status.startEvent);\n\n status.i = animationFrame.request(this.boundSmoothEndFrame);\n }\n else {\n status.sx = status.xe;\n status.sy = status.ye;\n\n this.pointerMove(status.startEvent, status.startEvent);\n this.end(status.startEvent);\n\n status.smoothEnd =\n status.active = false;\n this.simulation = null;\n }\n}\n\nfunction updateInertiaCoords (interaction) {\n const status = interaction.inertiaStatus;\n\n // return if inertia isn't running\n if (!status.active) { return; }\n\n const pageUp = status.upCoords.page;\n const clientUp = status.upCoords.client;\n\n utils.setCoords(interaction.curCoords, [ {\n pageX : pageUp.x + status.sx,\n pageY : pageUp.y + status.sy,\n clientX: clientUp.x + status.sx,\n clientY: clientUp.y + status.sy,\n } ]);\n}\n","const browser = require('./utils/browser');\nconst events = require('./utils/events');\nconst utils = require('./utils');\nconst scope = require('./scope');\nconst Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\n\nconst globalEvents = {};\n\n/*\\\n * interact\n [ method ]\n *\n * The methods of this variable can be used to set elements as\n * interactables and also to change various default settings.\n *\n * Calling it as a function and passing an element or a valid CSS selector\n * string returns an Interactable object which has various methods to\n * configure it.\n *\n - element (Element | string) The HTML or SVG Element to interact with or CSS selector\n = (object) An @Interactable\n *\n > Usage\n | interact('#draggable').draggable(true);\n |\n | var rectables = interact('rect');\n | rectables\n | .gesturable(true)\n | .on('gesturemove', function (event) {\n | // ...\n | });\n\\*/\nfunction interact (element, options) {\n let interactable = scope.interactables.get(element, options);\n\n if (!interactable) {\n interactable = new Interactable(element, options);\n interactable.events.global = globalEvents;\n }\n\n return interactable;\n}\n\n/*\\\n * interact.isSet\n [ method ]\n *\n * Check if an element has been set\n - element (Element) The Element being searched for\n = (boolean) Indicates if the element or CSS selector was previously passed to interact\n\\*/\ninteract.isSet = function (element, options) {\n return scope.interactables.indexOfElement(element, options && options.context) !== -1;\n};\n\n/*\\\n * interact.on\n [ method ]\n *\n * Adds a global listener for an InteractEvent or adds a DOM event to\n * `document`\n *\n - type (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) interact\n\\*/\ninteract.on = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.on(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.on(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n // if it is an InteractEvent type, add listener to globalEvents\n if (utils.contains(Interactable.eventTypes, type)) {\n // if this type of event was never bound\n if (!globalEvents[type]) {\n globalEvents[type] = [listener];\n }\n else {\n globalEvents[type].push(listener);\n }\n }\n // If non InteractEvent type, addEventListener to document\n else {\n events.add(scope.document, type, listener, { options });\n }\n\n return interact;\n};\n\n/*\\\n * interact.off\n [ method ]\n *\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n - type (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) interact\n \\*/\ninteract.off = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.off(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.off(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n if (!utils.contains(Interactable.eventTypes, type)) {\n events.remove(scope.document, type, listener, options);\n }\n else {\n let index;\n\n if (type in globalEvents\n && (index = utils.indexOf(globalEvents[type], listener)) !== -1) {\n globalEvents[type].splice(index, 1);\n }\n }\n\n return interact;\n};\n\n/*\\\n * interact.debug\n [ method ]\n *\n * Returns an object which exposes internal data\n = (object) An object with properties that outline the current state and expose internal functions and variables\n\\*/\ninteract.debug = function () {\n return scope;\n};\n\n// expose the functions used to calculate multi-touch properties\ninteract.getPointerAverage = utils.pointerAverage;\ninteract.getTouchBBox = utils.touchBBox;\ninteract.getTouchDistance = utils.touchDistance;\ninteract.getTouchAngle = utils.touchAngle;\n\ninteract.getElementRect = utils.getElementRect;\ninteract.getElementClientRect = utils.getElementClientRect;\ninteract.matchesSelector = utils.matchesSelector;\ninteract.closest = utils.closest;\n\n/*\\\n * interact.supportsTouch\n [ method ]\n *\n = (boolean) Whether or not the browser supports touch input\n\\*/\ninteract.supportsTouch = function () {\n return browser.supportsTouch;\n};\n\n/*\\\n * interact.supportsPointerEvent\n [ method ]\n *\n = (boolean) Whether or not the browser supports PointerEvents\n\\*/\ninteract.supportsPointerEvent = function () {\n return browser.supportsPointerEvent;\n};\n\n/*\\\n * interact.stop\n [ method ]\n *\n * Cancels all interactions (end events are not fired)\n *\n - event (Event) An event on which to call preventDefault()\n = (object) interact\n\\*/\ninteract.stop = function (event) {\n for (let i = scope.interactions.length - 1; i >= 0; i--) {\n scope.interactions[i].stop(event);\n }\n\n return interact;\n};\n\n/*\\\n * interact.pointerMoveTolerance\n [ method ]\n * Returns or sets the distance the pointer must be moved before an action\n * sequence occurs. This also affects tolerance for tap events.\n *\n - newValue (number) #optional The movement from the start position must be greater than this value\n = (number | Interactable) The current setting or interact\n\\*/\ninteract.pointerMoveTolerance = function (newValue) {\n if (utils.is.number(newValue)) {\n Interaction.pointerMoveTolerance = newValue;\n\n return this;\n }\n\n return Interaction.pointerMoveTolerance;\n};\n\ninteract.addDocument = scope.addDocument;\ninteract.removeDocument = scope.removeDocument;\n\nscope.interact = interact;\n\nmodule.exports = interact;\n","const Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\nconst scope = require('./scope');\nconst is = require('./utils/is');\nconst events = require('./utils/events');\n\nconst { nodeContains, matchesSelector } = require('./utils/domUtils');\n\n/*\\\n * Interactable.preventDefault\n [ method ]\n *\n * Returns or sets whether to prevent the browser's default behaviour\n * in response to pointer events. Can be set to:\n * - `'always'` to always prevent\n * - `'never'` to never prevent\n * - `'auto'` to let interact.js try to determine what would be best\n *\n - newValue (string) #optional `true`, `false` or `'auto'`\n = (string | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.preventDefault = function (newValue) {\n if (/^(always|never|auto)$/.test(newValue)) {\n this.options.preventDefault = newValue;\n return this;\n }\n\n if (is.bool(newValue)) {\n this.options.preventDefault = newValue? 'always' : 'never';\n return this;\n }\n\n return this.options.preventDefault;\n};\n\nInteractable.prototype.checkAndPreventDefault = function (event) {\n const setting = this.options.preventDefault;\n\n if (setting === 'never') { return; }\n\n if (setting === 'always') {\n event.preventDefault();\n return;\n }\n\n // setting === 'auto'\n\n // don't preventDefault if the browser supports passiveEvents\n // CSS touch-action and user-selecct should be used instead\n if (events.supportsOptions) {\n return;\n }\n\n // don't preventDefault of pointerdown events\n if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) {\n return;\n }\n\n // don't preventDefault on editable elements\n if (is.element(event.target)\n && matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) {\n return;\n }\n\n event.preventDefault();\n};\n\nfunction onInteractionEvent ({ interaction, event }) {\n if (interaction.target) {\n interaction.target.checkAndPreventDefault(event);\n }\n}\n\nfor (const eventSignal of ['down', 'move', 'up', 'cancel']) {\n Interaction.signals.on(eventSignal, onInteractionEvent);\n}\n\n// prevent native HTML5 drag on interact.js target elements\nInteraction.docEvents.dragstart = function preventNativeDrag (event) {\n for (const interaction of scope.interactions) {\n\n if (interaction.element\n && (interaction.element === event.target\n || nodeContains(interaction.element, event.target))) {\n\n interaction.target.checkAndPreventDefault(event);\n return;\n }\n }\n};\n","const scope = require('./scope');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst iFinder = require('./utils/interactionFinder');\nconst pointerEvents = require('./pointerEvents/base');\n\nconst { window } = require('./utils/window');\n\nconst toString = Object.prototype.toString;\n\nif (!window.Array.isArray) {\n window.Array.isArray = function (obj) {\n return toString.call(obj) === '[object Array]';\n };\n}\n\nif (!String.prototype.trim) {\n String.prototype.trim = function () {\n return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n };\n}\n\n// http://www.quirksmode.org/dom/events/click.html\n// >Events leading to dblclick\n//\n// IE8 doesn't fire down event before dblclick.\n// This workaround tries to fire a tap and doubletap after dblclick\nfunction onIE8Dblclick (event) {\n const eventTarget = event.target;\n const interaction = iFinder.search(event, event.type, eventTarget);\n\n if (!interaction) { return; }\n\n if (interaction.prevTap\n && event.clientX === interaction.prevTap.clientX\n && event.clientY === interaction.prevTap.clientY\n && eventTarget === interaction.prevTap.target) {\n\n interaction.downTargets[0] = eventTarget;\n interaction.downTimes [0] = new Date().getTime();\n\n pointerEvents.fire({\n interaction,\n event,\n eventTarget,\n pointer: event,\n type: 'tap',\n });\n }\n}\n\nif (browser.isIE8) {\n const selectFix = function (event) {\n for (const interaction of scope.interactions) {\n if (interaction.interacting()) {\n interaction.target.checkAndPreventDefault(event);\n }\n }\n };\n\n const onDocIE8 = function onDocIE8 ({ doc, win }, signalName) {\n const eventMethod = signalName.indexOf('listen') === 0\n ? events.add : events.remove;\n\n // For IE's lack of Event#preventDefault\n eventMethod(doc, 'selectstart', selectFix);\n\n if (pointerEvents) {\n eventMethod(doc, 'dblclick', onIE8Dblclick);\n }\n };\n\n scope.signals.on('add-document' , onDocIE8);\n scope.signals.on('remove-document', onDocIE8);\n}\n\nmodule.exports = null;\n","const InteractEvent = require('../InteractEvent');\nconst Interaction = require('../Interaction');\nconst extend = require('../utils/extend');\n\nconst modifiers = {\n names: [],\n\n setOffsets: function (arg) {\n const { interaction, pageCoords: page } = arg;\n const { target, element, startOffset } = interaction;\n const rect = target.getRect(element);\n\n if (rect) {\n startOffset.left = page.x - rect.left;\n startOffset.top = page.y - rect.top;\n\n startOffset.right = rect.right - page.x;\n startOffset.bottom = rect.bottom - page.y;\n\n if (!('width' in rect)) { rect.width = rect.right - rect.left; }\n if (!('height' in rect)) { rect.height = rect.bottom - rect.top ; }\n }\n else {\n startOffset.left = startOffset.top = startOffset.right = startOffset.bottom = 0;\n }\n\n arg.rect = rect;\n arg.interactable = target;\n arg.element = element;\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n\n arg.options = target.options[interaction.prepared.name][modifierName];\n\n if (!arg.options) {\n continue;\n }\n\n interaction.modifierOffsets[modifierName] = modifiers[modifierName].setOffset(arg);\n }\n },\n\n setAll: function (arg) {\n const { interaction, statuses, preEnd, requireEndOnly } = arg;\n const coords = extend({}, arg.pageCoords);\n const result = {\n dx: 0,\n dy: 0,\n changed: false,\n locked: false,\n shouldMove: true,\n };\n\n for (const modifierName of modifiers.names) {\n const modifier = modifiers[modifierName];\n const options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!shouldDo(options, preEnd, requireEndOnly)) { continue; }\n\n arg.status = arg.status = statuses[modifierName];\n arg.options = options;\n arg.offset = arg.interaction.modifierOffsets[modifierName];\n\n modifier.set(arg);\n\n if (arg.status.locked) {\n coords.x += arg.status.dx;\n coords.y += arg.status.dy;\n\n result.dx += arg.status.dx;\n result.dy += arg.status.dy;\n\n result.locked = true;\n }\n }\n\n // a move should be fired if:\n // - there are no modifiers enabled,\n // - no modifiers are \"locked\" i.e. have changed the pointer's coordinates, or\n // - the locked coords have changed since the last pointer move\n result.shouldMove = !arg.status || !result.locked || arg.status.changed;\n\n return result;\n },\n\n resetStatuses: function (statuses) {\n for (const modifierName of modifiers.names) {\n const status = statuses[modifierName] || {};\n\n status.dx = status.dy = 0;\n status.modifiedX = status.modifiedY = NaN;\n status.locked = false;\n status.changed = true;\n\n statuses[modifierName] = status;\n }\n\n return statuses;\n },\n\n start: function ({ interaction }, signalName) {\n const arg = {\n interaction,\n pageCoords: (signalName === 'action-resume' ?\n interaction.curCoords : interaction.startCoords).page,\n startOffset: interaction.startOffset,\n statuses: interaction.modifierStatuses,\n preEnd: false,\n requireEndOnly: false,\n };\n\n modifiers.setOffsets(arg);\n modifiers.resetStatuses(arg.statuses);\n\n arg.pageCoords = extend({}, interaction.startCoords.page);\n interaction.modifierResult = modifiers.setAll(arg);\n },\n};\n\nInteraction.signals.on('new', function (interaction) {\n interaction.startOffset = { left: 0, right: 0, top: 0, bottom: 0 };\n interaction.modifierOffsets = {};\n interaction.modifierStatuses = modifiers.resetStatuses({});\n interaction.modifierResult = null;\n});\n\nInteraction.signals.on('action-start' , modifiers.start);\nInteraction.signals.on('action-resume', modifiers.start);\n\nInteraction.signals.on('before-action-move', function ({ interaction, preEnd, interactingBeforeMove }) {\n const modifierResult = modifiers.setAll({\n interaction,\n preEnd,\n pageCoords: interaction.curCoords.page,\n statuses: interaction.modifierStatuses,\n requireEndOnly: false,\n });\n\n // don't fire an action move if a modifier would keep the event in the same\n // cordinates as before\n if (!modifierResult.shouldMove && interactingBeforeMove) {\n interaction._dontFireMove = true;\n }\n\n interaction.modifierResult = modifierResult;\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n for (let i = 0; i < modifiers.names.length; i++) {\n const options = interaction.target.options[interaction.prepared.name][modifiers.names[i]];\n\n // if the endOnly option is true for any modifier\n if (shouldDo(options, true, true)) {\n // fire a move event at the modified coordinates\n interaction.doMove({ event, preEnd: true });\n break;\n }\n }\n});\n\nInteractEvent.signals.on('set-xy', function (arg) {\n const { iEvent, interaction } = arg;\n const modifierArg = extend({}, arg);\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n modifierArg.options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!modifierArg.options) {\n continue;\n }\n\n const modifier = modifiers[modifierName];\n\n modifierArg.status = interaction.modifierStatuses[modifierName];\n\n iEvent[modifierName] = modifier.modifyCoords(modifierArg);\n }\n});\n\nfunction shouldDo (options, preEnd, requireEndOnly) {\n return (options && options.enabled\n && (preEnd || !options.endOnly)\n && (!requireEndOnly || options.endOnly));\n}\n\nmodule.exports = modifiers;\n","const modifiers = require('./index');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst restrict = {\n defaults: {\n enabled : false,\n endOnly : false,\n restriction: null,\n elementRect: null,\n },\n\n setOffset: function ({ rect, startOffset, options }) {\n const elementRect = options && options.elementRect;\n const offset = {};\n\n if (rect && elementRect) {\n offset.left = startOffset.left - (rect.width * elementRect.left);\n offset.top = startOffset.top - (rect.height * elementRect.top);\n\n offset.right = startOffset.right - (rect.width * (1 - elementRect.right));\n offset.bottom = startOffset.bottom - (rect.height * (1 - elementRect.bottom));\n }\n else {\n offset.left = offset.top = offset.right = offset.bottom = 0;\n }\n\n return offset;\n },\n\n set: function ({ pageCoords, interaction, status, options }) {\n if (!options) { return status; }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n\n const restriction = getRestrictionRect(options.restriction, interaction, page);\n\n if (!restriction) { return status; }\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n const rect = restriction;\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n const offset = interaction.modifierOffsets.restrict;\n\n // object is assumed to have\n // x, y, width, height or\n // left, top, right, bottom\n if ('x' in restriction && 'y' in restriction) {\n modifiedX = Math.max(Math.min(rect.x + rect.width - offset.right , page.x), rect.x + offset.left);\n modifiedY = Math.max(Math.min(rect.y + rect.height - offset.bottom, page.y), rect.y + offset.top );\n }\n else {\n modifiedX = Math.max(Math.min(rect.right - offset.right , page.x), rect.left + offset.left);\n modifiedY = Math.max(Math.min(rect.bottom - offset.bottom, page.y), rect.top + offset.top );\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const elementRect = options && options.elementRect;\n\n if (options && options.enabled\n && !(phase === 'start' && elementRect && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n getRestrictionRect,\n};\n\nfunction getRestrictionRect (value, interaction, page) {\n if (utils.is.function(value)) {\n return utils.resolveRectLike(value, interaction.target, interaction.element, [page.x, page.y, interaction]);\n } else {\n return utils.resolveRectLike(value, interaction.target, interaction.element);\n }\n}\n\nmodifiers.restrict = restrict;\nmodifiers.names.push('restrict');\n\ndefaultOptions.perAction.restrict = restrict.defaults;\n\nmodule.exports = restrict;\n","// This module adds the options.resize.restrictEdges setting which sets min and\n// max for the top, left, bottom and right edges of the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictEdges: {\n// inner: { top: 200, left: 200, right: 400, bottom: 400 },\n// outer: { top: 0, left: 0, right: 600, bottom: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst { getRestrictionRect } = require('./restrict');\n\nconst noInner = { top: +Infinity, left: +Infinity, bottom: -Infinity, right: -Infinity };\nconst noOuter = { top: -Infinity, left: -Infinity, bottom: +Infinity, right: +Infinity };\n\nconst restrictEdges = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n offset: null,\n },\n\n setOffset: function ({ interaction, startOffset, options }) {\n if (!options) {\n return utils.extend({}, startOffset);\n }\n\n const offset = getRestrictionRect(options.offset, interaction, interaction.startCoords.page);\n\n if (offset) {\n return {\n top: startOffset.top + offset.y,\n left: startOffset.left + offset.x,\n bottom: startOffset.bottom + offset.y,\n right: startOffset.right + offset.x,\n };\n }\n\n return startOffset;\n },\n\n set: function ({ pageCoords, interaction, status, offset, options }) {\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n const inner = rectUtils.xywhToTlbr(getRestrictionRect(options.inner, interaction, page)) || noInner;\n const outer = rectUtils.xywhToTlbr(getRestrictionRect(options.outer, interaction, page)) || noOuter;\n\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n if (edges.top) {\n modifiedY = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top);\n }\n else if (edges.bottom) {\n modifiedY = Math.max(Math.min(outer.bottom - offset.bottom, page.y), inner.bottom - offset.bottom);\n }\n if (edges.left) {\n modifiedX = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left);\n }\n else if (edges.right) {\n modifiedX = Math.max(Math.min(outer.right - offset.right, page.x), inner.right - offset.right);\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n if (options && options.enabled\n && !(phase === 'start' && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n noInner,\n noOuter,\n getRestrictionRect,\n};\n\nmodifiers.restrictEdges = restrictEdges;\nmodifiers.names.push('restrictEdges');\n\ndefaultOptions.perAction.restrictEdges = restrictEdges.defaults;\nresize.defaults.restrictEdges = restrictEdges.defaults;\n\nmodule.exports = restrictEdges;\n","// This module adds the options.resize.restrictSize setting which sets min and\n// max width and height for the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictSize: {\n// min: { width: -600, height: -600 },\n// max: { width: 600, height: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst restrictEdges = require('./restrictEdges');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst noMin = { width: -Infinity, height: -Infinity };\nconst noMax = { width: +Infinity, height: +Infinity };\n\nconst restrictSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n },\n\n setOffset: function ({ interaction }) {\n return interaction.startOffset;\n },\n\n set: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const rect = rectUtils.xywhToTlbr(interaction.resizeRects.inverted);\n\n const minSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.min, interaction)) || noMin;\n const maxSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.max, interaction)) || noMax;\n\n arg.options = {\n enabled: options.enabled,\n endOnly: options.endOnly,\n inner: utils.extend({}, restrictEdges.noInner),\n outer: utils.extend({}, restrictEdges.noOuter),\n };\n\n if (edges.top) {\n arg.options.inner.top = rect.bottom - minSize.height;\n arg.options.outer.top = rect.bottom - maxSize.height;\n }\n else if (edges.bottom) {\n arg.options.inner.bottom = rect.top + minSize.height;\n arg.options.outer.bottom = rect.top + maxSize.height;\n }\n if (edges.left) {\n arg.options.inner.left = rect.right - minSize.width;\n arg.options.outer.left = rect.right - maxSize.width;\n }\n else if (edges.right) {\n arg.options.inner.right = rect.left + minSize.width;\n arg.options.outer.right = rect.left + maxSize.width;\n }\n\n restrictEdges.set(arg);\n },\n\n modifyCoords: restrictEdges.modifyCoords,\n};\n\nmodifiers.restrictSize = restrictSize;\nmodifiers.names.push('restrictSize');\n\ndefaultOptions.perAction.restrictSize = restrictSize.defaults;\nresize.defaults.restrictSize = restrictSize.defaults;\n\nmodule.exports = restrictSize;\n","const modifiers = require('./index');\nconst interact = require('../interact');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst snap = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n\n relativePoints: null,\n },\n\n setOffset: function ({ interaction, interactable, element, rect, startOffset, options }) {\n const offsets = [];\n const optionsOrigin = utils.rectToXY(utils.resolveRectLike(options.origin));\n const origin = optionsOrigin || utils.getOriginXY(interactable, element, interaction.prepared.name);\n options = options || interactable.options[interaction.prepared.name].snap || {};\n\n let snapOffset;\n\n if (options.offset === 'startCoords') {\n snapOffset = {\n x: interaction.startCoords.page.x - origin.x,\n y: interaction.startCoords.page.y - origin.y,\n };\n }\n else {\n const offsetRect = utils.resolveRectLike(options.offset, interactable, element, [interaction]);\n\n snapOffset = utils.rectToXY(offsetRect) || { x: 0, y: 0 };\n }\n\n if (rect && options.relativePoints && options.relativePoints.length) {\n for (const { x: relativeX, y: relativeY } of options.relativePoints) {\n offsets.push({\n x: startOffset.left - (rect.width * relativeX) + snapOffset.x,\n y: startOffset.top - (rect.height * relativeY) + snapOffset.y,\n });\n }\n }\n else {\n offsets.push(snapOffset);\n }\n\n return offsets;\n },\n\n set: function ({ interaction, pageCoords, status, options, offset: offsets }) {\n const targets = [];\n let target;\n let page;\n let i;\n\n if (status.useStatusXY) {\n page = { x: status.x, y: status.y };\n }\n else {\n const origin = utils.getOriginXY(interaction.target, interaction.element, interaction.prepared.name);\n\n page = utils.extend({}, pageCoords);\n\n page.x -= origin.x;\n page.y -= origin.y;\n }\n\n status.realX = page.x;\n status.realY = page.y;\n\n let len = options.targets? options.targets.length : 0;\n\n for (const { x: offsetX, y: offsetY } of offsets) {\n const relativeX = page.x - offsetX;\n const relativeY = page.y - offsetY;\n\n for (const snapTarget of options.targets) {\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n targets.push({\n x: utils.is.number(target.x) ? (target.x + offsetX) : relativeX,\n y: utils.is.number(target.y) ? (target.y + offsetY) : relativeY,\n\n range: utils.is.number(target.range)? target.range: options.range,\n });\n }\n }\n\n const closest = {\n target: null,\n inRange: false,\n distance: 0,\n range: 0,\n dx: 0,\n dy: 0,\n };\n\n for (i = 0, len = targets.length; i < len; i++) {\n target = targets[i];\n\n const range = target.range;\n const dx = target.x - page.x;\n const dy = target.y - page.y;\n const distance = utils.hypot(dx, dy);\n let inRange = distance <= range;\n\n // Infinite targets count as being out of range\n // compared to non infinite ones that are in range\n if (range === Infinity && closest.inRange && closest.range !== Infinity) {\n inRange = false;\n }\n\n if (!closest.target || (inRange\n // is the closest target in range?\n ? (closest.inRange && range !== Infinity\n // the pointer is relatively deeper in this target\n ? distance / range < closest.distance / closest.range\n // this target has Infinite range and the closest doesn't\n : (range === Infinity && closest.range !== Infinity)\n // OR this target is closer that the previous closest\n || distance < closest.distance)\n // The other is not in range and the pointer is closer to this target\n : (!closest.inRange && distance < closest.distance))) {\n\n closest.target = target;\n closest.distance = distance;\n closest.range = range;\n closest.inRange = inRange;\n closest.dx = dx;\n closest.dy = dy;\n\n status.range = range;\n }\n }\n\n let snapChanged;\n\n if (closest.target) {\n snapChanged = (status.modifiedX !== closest.target.x || status.modifiedY !== closest.target.y);\n\n status.modifiedX = closest.target.x;\n status.modifiedY = closest.target.y;\n }\n else {\n snapChanged = true;\n\n status.modifiedX = NaN;\n status.modifiedY = NaN;\n }\n\n status.dx = closest.dx;\n status.dy = closest.dy;\n\n status.changed = (snapChanged || (closest.inRange && !status.locked));\n status.locked = closest.inRange;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const relativePoints = options && options.relativePoints;\n\n if (options && options.enabled\n && !(phase === 'start' && relativePoints && relativePoints.length)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n }\n\n return {\n range : status.range,\n locked : status.locked,\n x : status.modifiedX,\n y : status.modifiedY,\n realX : status.realX,\n realY : status.realY,\n dx : status.dx,\n dy : status.dy,\n };\n }\n },\n};\n\ninteract.createSnapGrid = function (grid) {\n return function (x, y) {\n const limits = grid.limits || {\n left : -Infinity,\n right : Infinity,\n top : -Infinity,\n bottom: Infinity,\n };\n let offsetX = 0;\n let offsetY = 0;\n\n if (utils.is.object(grid.offset)) {\n offsetX = grid.offset.x;\n offsetY = grid.offset.y;\n }\n\n const gridx = Math.round((x - offsetX) / grid.x);\n const gridy = Math.round((y - offsetY) / grid.y);\n\n const newX = Math.max(limits.left, Math.min(limits.right , gridx * grid.x + offsetX));\n const newY = Math.max(limits.top , Math.min(limits.bottom, gridy * grid.y + offsetY));\n\n return {\n x: newX,\n y: newY,\n range: grid.range,\n };\n };\n};\n\nmodifiers.snap = snap;\nmodifiers.names.push('snap');\n\ndefaultOptions.perAction.snap = snap.defaults;\n\nmodule.exports = snap;\n","// This module allows snapping of the size of targets during resize\n// interactions.\n\nconst modifiers = require('./index');\nconst snap = require('./snap');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\nconst utils = require('../utils/');\n\nconst snapSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n },\n\n setOffset: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.edges;\n\n if (!edges) { return; }\n\n arg.options = {\n relativePoints: [{\n x: edges.left? 0 : 1,\n y: edges.top ? 0 : 1,\n }],\n origin: { x: 0, y: 0 },\n offset: 'self',\n range: options.range,\n };\n\n const offsets = snap.setOffset(arg);\n arg.options = options;\n\n return offsets;\n },\n\n set: function (arg) {\n const { interaction, options, offset, pageCoords } = arg;\n const page = utils.extend({}, pageCoords);\n const relativeX = page.x - offset[0].x;\n const relativeY = page.y - offset[0].y;\n\n arg.options = utils.extend({}, options);\n arg.options.targets = [];\n\n for (const snapTarget of options.targets) {\n let target;\n\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n if ('width' in target && 'height' in target) {\n target.x = target.width;\n target.y = target.height;\n }\n\n arg.options.targets.push(target);\n }\n\n snap.set(arg);\n },\n\n modifyCoords: function (arg) {\n const { options } = arg;\n\n arg.options = utils.extend({}, options);\n arg.options.enabled = options.enabled;\n arg.options.relativePoints = [null];\n\n snap.modifyCoords(arg);\n },\n};\n\nmodifiers.snapSize = snapSize;\nmodifiers.names.push('snapSize');\n\ndefaultOptions.perAction.snapSize = snapSize.defaults;\nresize.defaults.snapSize = snapSize.defaults;\n\nmodule.exports = snapSize;\n","const pointerUtils = require('../utils/pointerUtils');\n\nmodule.exports = class PointerEvent {\n constructor (type, pointer, event, eventTarget, interaction) {\n pointerUtils.pointerExtend(this, event);\n\n if (event !== pointer) {\n pointerUtils.pointerExtend(this, pointer);\n }\n\n this.interaction = interaction;\n\n this.timeStamp = new Date().getTime();\n this.originalEvent = event;\n this.type = type;\n this.pointerId = pointerUtils.getPointerId(pointer);\n this.pointerType = pointerUtils.getPointerType(pointer);\n this.target = eventTarget;\n this.currentTarget = null;\n\n if (type === 'tap') {\n const pointerIndex = interaction.getPointerIndex(pointer);\n this.dt = this.timeStamp - interaction.downTimes[pointerIndex];\n\n const interval = this.timeStamp - interaction.tapTime;\n\n this.double = !!(interaction.prevTap\n && interaction.prevTap.type !== 'doubletap'\n && interaction.prevTap.target === this.target\n && interval < 500);\n }\n else if (type === 'doubletap') {\n this.dt = pointer.timeStamp - interaction.tapTime;\n }\n }\n\n subtractOrigin ({ x: originX, y: originY }) {\n this.pageX -= originX;\n this.pageY -= originY;\n this.clientX -= originX;\n this.clientY -= originY;\n\n return this;\n }\n\n addOrigin ({ x: originX, y: originY }) {\n this.pageX += originX;\n this.pageY += originY;\n this.clientX += originX;\n this.clientY += originY;\n\n return this;\n }\n\n preventDefault () {\n this.originalEvent.preventDefault();\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n};\n","const PointerEvent = require('./PointerEvent');\nconst Interaction = require('../Interaction');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst defaults = require('../defaultOptions');\nconst signals = require('../utils/Signals').new();\nconst { filter } = require('../utils/arr');\n\nconst simpleSignals = [ 'down', 'up', 'cancel' ];\nconst simpleEvents = [ 'down', 'up', 'cancel' ];\n\nconst pointerEvents = {\n PointerEvent,\n fire,\n collectEventTargets,\n signals,\n defaults: {\n holdDuration: 600,\n ignoreFrom : null,\n allowFrom : null,\n origin : { x: 0, y: 0 },\n },\n types: [\n 'down',\n 'move',\n 'up',\n 'cancel',\n 'tap',\n 'doubletap',\n 'hold',\n ],\n};\n\nfunction fire (arg) {\n const {\n interaction, pointer, event, eventTarget,\n type = arg.pointerEvent.type,\n targets = collectEventTargets(arg),\n pointerEvent = new PointerEvent(type, pointer, event, eventTarget, interaction),\n } = arg;\n\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n targets,\n type,\n pointerEvent,\n };\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n\n for (const prop in target.props || {}) {\n pointerEvent[prop] = target.props[prop];\n }\n\n const origin = utils.getOriginXY(target.eventable, target.element);\n\n pointerEvent.subtractOrigin(origin);\n pointerEvent.eventable = target.eventable;\n pointerEvent.currentTarget = target.element;\n\n target.eventable.fire(pointerEvent);\n\n pointerEvent.addOrigin(origin);\n\n if (pointerEvent.immediatePropagationStopped\n || (pointerEvent.propagationStopped\n && (i + 1) < targets.length && targets[i + 1].element !== pointerEvent.currentTarget)) {\n break;\n }\n }\n\n signals.fire('fired', signalArg);\n\n if (type === 'tap') {\n // if pointerEvent should make a double tap, create and fire a doubletap\n // PointerEvent and use that as the prevTap\n const prevTap = pointerEvent.double\n ? fire({\n interaction, pointer, event, eventTarget,\n type: 'doubletap',\n })\n : pointerEvent;\n\n interaction.prevTap = prevTap;\n interaction.tapTime = prevTap.timeStamp;\n }\n\n return pointerEvent;\n}\n\nfunction collectEventTargets ({ interaction, pointer, event, eventTarget, type }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n // do not fire a tap event if the pointer was moved before being lifted\n if (type === 'tap' && (interaction.pointerWasMoved\n // or if the pointerup target is different to the pointerdown target\n || !(interaction.downTargets[pointerIndex] && interaction.downTargets[pointerIndex] === eventTarget))) {\n return [];\n }\n\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n path,\n targets: [],\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (type === 'hold') {\n signalArg.targets = filter(signalArg.targets, target =>\n target.eventable.options.holdDuration === interaction.holdTimers[pointerIndex].duration);\n }\n\n return signalArg.targets;\n}\n\nInteraction.signals.on('update-pointer-down', function ({ interaction, pointerIndex }) {\n interaction.holdTimers[pointerIndex] = { duration: Infinity, timeout: null };\n});\n\nInteraction.signals.on('remove-pointer', function ({ interaction, pointerIndex }) {\n interaction.holdTimers.splice(pointerIndex, 1);\n});\n\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget, duplicateMove }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n if (!duplicateMove && (!interaction.pointerIsDown || interaction.pointerWasMoved)) {\n if (interaction.pointerIsDown) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n\n fire({\n interaction, pointer, event, eventTarget,\n type: 'move',\n });\n }\n});\n\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget, pointerIndex }) {\n // copy event to be used in timeout for IE8\n const eventCopy = browser.isIE8? utils.extend({}, event) : event;\n\n const timer = interaction.holdTimers[pointerIndex];\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'hold',\n targets: [],\n path,\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (!signalArg.targets.length) { return; }\n\n let minDuration = Infinity;\n\n for (let i = 0; i < signalArg.targets.length; i++) {\n const target = signalArg.targets[i];\n const holdDuration = target.eventable.options.holdDuration;\n\n if (holdDuration < minDuration) {\n minDuration = holdDuration;\n }\n }\n\n timer.duration = minDuration;\n timer.timeout = setTimeout(function () {\n fire({\n interaction,\n eventTarget,\n pointer: browser.isIE8? eventCopy : pointer,\n event: eventCopy,\n type: 'hold',\n });\n }, minDuration);\n});\n\nInteraction.signals.on('up', ({ interaction, pointer, event, eventTarget }) => {\n if (!interaction.pointerWasMoved) {\n fire({ interaction, eventTarget, pointer, event, type: 'tap' });\n }\n});\n\n['up', 'cancel'].forEach(function (signalName) {\n Interaction.signals.on(signalName, function ({ interaction, pointerIndex }) {\n if (interaction.holdTimers[pointerIndex]) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n });\n});\n\nfunction createSignalListener (type) {\n return function ({ interaction, pointer, event, eventTarget }) {\n fire({ interaction, eventTarget, pointer, event, type });\n };\n}\n\nfor (let i = 0; i < simpleSignals.length; i++) {\n Interaction.signals.on(simpleSignals[i], createSignalListener(simpleEvents[i]));\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.prevTap = null; // the most recent tap event on this interaction\n interaction.tapTime = 0; // time of the most recent tap event\n interaction.holdTimers = []; // [{ duration, timeout }]\n});\n\ndefaults.pointerEvents = pointerEvents.defaults;\nmodule.exports = pointerEvents;\n","const pointerEvents = require('./base');\nconst Interaction = require('../Interaction');\n\npointerEvents.signals.on('new', onNew);\npointerEvents.signals.on('fired', onFired);\n\nfor (const signal of ['move', 'up', 'cancel', 'endall']) {\n Interaction.signals.on(signal, endHoldRepeat);\n}\n\nfunction onNew ({ pointerEvent }) {\n if (pointerEvent.type !== 'hold') { return; }\n\n pointerEvent.count = (pointerEvent.count || 0) + 1;\n}\n\nfunction onFired ({ interaction, pointerEvent, eventTarget, targets }) {\n if (pointerEvent.type !== 'hold' || !targets.length) { return; }\n\n // get the repeat interval from the first eventable\n const interval = targets[0].eventable.options.holdRepeatInterval;\n\n // don't repeat if the interval is 0 or less\n if (interval <= 0) { return; }\n\n // set a timeout to fire the holdrepeat event\n interaction.holdIntervalHandle = setTimeout(function () {\n pointerEvents.fire({\n interaction,\n eventTarget,\n type: 'hold',\n pointer: pointerEvent,\n event: pointerEvent,\n });\n }, interval);\n}\n\nfunction endHoldRepeat ({ interaction }) {\n // set the interaction's holdStopTime property\n // to stop further holdRepeat events\n if (interaction.holdIntervalHandle) {\n clearInterval(interaction.holdIntervalHandle);\n interaction.holdIntervalHandle = null;\n }\n}\n\n// don't repeat by default\npointerEvents.defaults.holdRepeatInterval = 0;\npointerEvents.types.push('holdrepeat');\n\nmodule.exports = {\n onNew,\n onFired,\n endHoldRepeat,\n};\n","const pointerEvents = require('./base');\nconst Interactable = require('../Interactable');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\nconst scope = require('../scope');\nconst extend = require('../utils/extend');\nconst { merge } = require('../utils/arr');\n\npointerEvents.signals.on('collect-targets', function ({ targets, element, type, eventTarget }) {\n function collectSelectors (interactable, selector, context) {\n const els = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && is.element(element)\n && domUtils.matchesSelector(element, selector, els)\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n const interactable = scope.interactables.get(element);\n\n if (interactable) {\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n scope.interactables.forEachSelector(collectSelectors, element);\n});\n\nInteractable.signals.on('new', function ({ interactable }) {\n interactable.events.getRect = function (element) {\n return interactable.getRect(element);\n };\n});\n\nInteractable.signals.on('set', function ({ interactable, options }) {\n extend(interactable.events.options, pointerEvents.defaults);\n extend(interactable.events.options, options);\n});\n\nmerge(Interactable.eventTypes, pointerEvents.types);\n\nInteractable.prototype.pointerEvents = function (options) {\n extend(this.events.options, options);\n\n return this;\n};\n\nconst __backCompatOption = Interactable.prototype._backCompatOption;\n\nInteractable.prototype._backCompatOption = function (optionName, newValue) {\n const ret = __backCompatOption.call(this, optionName, newValue);\n\n if (ret === this) {\n this.events.options[optionName] = newValue;\n }\n\n return ret;\n};\n\nInteractable.settingsMethods.push('pointerEvents');\n","const utils = require('./utils');\nconst events = require('./utils/events');\nconst signals = require('./utils/Signals').new();\n\nconst scope = {\n signals,\n events,\n utils,\n\n // main document\n document: require('./utils/domObjects').document,\n // all documents being listened to\n documents: [],\n\n addDocument: function (doc, win) {\n // do nothing if document is already known\n if (utils.contains(scope.documents, doc)) { return false; }\n\n win = win || scope.getWindow(doc);\n\n scope.documents.push(doc);\n events.documents.push(doc);\n\n // don't add an unload event for the main document\n // so that the page may be cached in browser history\n if (doc !== scope.document) {\n events.add(win, 'unload', scope.onWindowUnload);\n }\n\n signals.fire('add-document', { doc, win });\n },\n\n removeDocument: function (doc, win) {\n const index = utils.indexOf(scope.documents, doc);\n\n win = win || scope.getWindow(doc);\n\n events.remove(win, 'unload', scope.onWindowUnload);\n\n scope.documents.splice(index, 1);\n events.documents.splice(index, 1);\n\n signals.fire('remove-document', { win, doc });\n },\n\n onWindowUnload: function () {\n scope.removeDocument(this.document, this);\n },\n};\n\nmodule.exports = scope;\n","const { indexOf } = require('./arr');\n\nclass Signals {\n constructor () {\n this.listeners = {\n // signalName: [listeners],\n };\n }\n\n on (name, listener) {\n if (!this.listeners[name]) {\n this.listeners[name] = [listener];\n return;\n }\n\n this.listeners[name].push(listener);\n }\n\n off (name, listener) {\n if (!this.listeners[name]) { return; }\n\n const index = indexOf(this.listeners[name], listener);\n\n if (index !== -1) {\n this.listeners[name].splice(index, 1);\n }\n }\n\n fire (name, arg) {\n const targetListeners = this.listeners[name];\n\n if (!targetListeners) { return; }\n\n for (let i = 0; i < targetListeners.length; i++) {\n if (targetListeners[i](arg, name) === false) {\n return;\n }\n }\n }\n}\n\nSignals.new = function () {\n return new Signals();\n};\n\nmodule.exports = Signals;\n","function indexOf (array, target) {\n for (let i = 0, len = array.length; i < len; i++) {\n if (array[i] === target) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction contains (array, target) {\n return indexOf(array, target) !== -1;\n}\n\nfunction merge (target, source) {\n for (let i = 0; i < source.length; i++) {\n target.push(source[i]);\n }\n\n return target;\n}\n\nfunction filter (array, test) {\n const result = [];\n\n for (let i = 0; i < array.length; i++) {\n if (test(array[i])) {\n result.push(array[i]);\n }\n }\n\n return result;\n}\n\nmodule.exports = {\n indexOf,\n contains,\n merge,\n filter,\n};\n","const { window } = require('./window');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst Element = domObjects.Element;\nconst navigator = window.navigator;\n\nconst browser = {\n // Does the browser support touch input?\n supportsTouch: !!(('ontouchstart' in window) || is.function(window.DocumentTouch)\n && domObjects.document instanceof window.DocumentTouch),\n\n // Does the browser support PointerEvents\n supportsPointerEvent: !!domObjects.PointerEvent,\n\n isIE8: ('attachEvent' in window) && !('addEventListener' in window),\n\n // Opera Mobile must be handled differently\n isOperaMobile: (navigator.appName === 'Opera'\n && browser.supportsTouch\n && navigator.userAgent.match('Presto')),\n\n // scrolling doesn't change the result of getClientRects on iOS 7\n isIOS7: (/iP(hone|od|ad)/.test(navigator.platform)\n && /OS 7[^\\d]/.test(navigator.appVersion)),\n\n isIe9OrOlder: /MSIE (8|9)/.test(navigator.userAgent),\n\n // prefix matchesSelector\n prefixedMatchesSelector: 'matches' in Element.prototype\n ? 'matches': 'webkitMatchesSelector' in Element.prototype\n ? 'webkitMatchesSelector': 'mozMatchesSelector' in Element.prototype\n ? 'mozMatchesSelector': 'oMatchesSelector' in Element.prototype\n ? 'oMatchesSelector': 'msMatchesSelector',\n\n useMatchesSelectorPolyfill: false,\n\n pEventTypes: (domObjects.PointerEvent\n ? (domObjects.PointerEvent === window.MSPointerEvent\n ? {\n up: 'MSPointerUp',\n down: 'MSPointerDown',\n over: 'mouseover',\n out: 'mouseout',\n move: 'MSPointerMove',\n cancel: 'MSPointerCancel',\n }\n : {\n up: 'pointerup',\n down: 'pointerdown',\n over: 'pointerover',\n out: 'pointerout',\n move: 'pointermove',\n cancel: 'pointercancel',\n })\n : null),\n\n // because Webkit and Opera still use 'mousewheel' event type\n wheelEvent: 'onmousewheel' in domObjects.document? 'mousewheel': 'wheel',\n\n};\n\nbrowser.useMatchesSelectorPolyfill = !is.function(Element.prototype[browser.prefixedMatchesSelector]);\n\nmodule.exports = browser;\n","const domObjects = {};\nconst win = require('./window').window;\n\nfunction blank () {}\n\ndomObjects.document = win.document;\ndomObjects.DocumentFragment = win.DocumentFragment || blank;\ndomObjects.SVGElement = win.SVGElement || blank;\ndomObjects.SVGSVGElement = win.SVGSVGElement || blank;\ndomObjects.SVGElementInstance = win.SVGElementInstance || blank;\ndomObjects.Element = win.Element || blank;\ndomObjects.HTMLElement = win.HTMLElement || domObjects.Element;\n\ndomObjects.Event = win.Event;\ndomObjects.Touch = win.Touch || blank;\ndomObjects.PointerEvent = (win.PointerEvent || win.MSPointerEvent);\n\nmodule.exports = domObjects;\n","const win = require('./window');\nconst browser = require('./browser');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst domUtils = {\n nodeContains: function (parent, child) {\n while (child) {\n if (child === parent) {\n return true;\n }\n\n child = child.parentNode;\n }\n\n return false;\n },\n\n closest: function (element, selector) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) { return element; }\n\n element = domUtils.parentNode(element);\n }\n\n return null;\n },\n\n parentNode: function (node) {\n let parent = node.parentNode;\n\n if (is.docFrag(parent)) {\n // skip past #shado-root fragments\n while ((parent = parent.host) && is.docFrag(parent)) {\n continue;\n }\n\n return parent;\n }\n\n return parent;\n },\n\n // taken from http://tanalin.com/en/blog/2012/12/matches-selector-ie8/ and modified\n matchesSelectorPolyfill: browser.useMatchesSelectorPolyfill\n ? function (element, selector, elems) {\n elems = elems || element.parentNode.querySelectorAll(selector);\n\n for (let i = 0, len = elems.length; i < len; i++) {\n if (elems[i] === element) {\n return true;\n }\n }\n\n return false;\n }\n : null,\n\n matchesSelector: function (element, selector, nodeList) {\n if (browser.useMatchesSelectorPolyfill) {\n return domUtils.matchesSelectorPolyfill(element, selector, nodeList);\n }\n\n // remove /deep/ from selectors if shadowDOM polyfill is used\n if (win.window !== win.realWindow) {\n selector = selector.replace(/\\/deep\\//g, ' ');\n }\n\n return element[browser.prefixedMatchesSelector](selector);\n },\n\n // Test for the element that's \"above\" all other qualifiers\n indexOfDeepestElement: function (elements) {\n let deepestZoneParents = [];\n let dropzoneParents = [];\n let dropzone;\n let deepestZone = elements[0];\n let index = deepestZone? 0: -1;\n let parent;\n let child;\n let i;\n let n;\n\n for (i = 1; i < elements.length; i++) {\n dropzone = elements[i];\n\n // an element might belong to multiple selector dropzones\n if (!dropzone || dropzone === deepestZone) {\n continue;\n }\n\n if (!deepestZone) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n // check if the deepest or current are document.documentElement or document.rootElement\n // - if the current dropzone is, do nothing and continue\n if (dropzone.parentNode === dropzone.ownerDocument) {\n continue;\n }\n // - if deepest is, update with the current dropzone and continue to next\n else if (deepestZone.parentNode === dropzone.ownerDocument) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n if (!deepestZoneParents.length) {\n parent = deepestZone;\n while (parent.parentNode && parent.parentNode !== parent.ownerDocument) {\n deepestZoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n }\n\n // if this element is an svg element and the current deepest is\n // an HTMLElement\n if (deepestZone instanceof domObjects.HTMLElement\n && dropzone instanceof domObjects.SVGElement\n && !(dropzone instanceof domObjects.SVGSVGElement)) {\n\n if (dropzone === deepestZone.parentNode) {\n continue;\n }\n\n parent = dropzone.ownerSVGElement;\n }\n else {\n parent = dropzone;\n }\n\n dropzoneParents = [];\n\n while (parent.parentNode !== parent.ownerDocument) {\n dropzoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n\n n = 0;\n\n // get (position of last common ancestor) + 1\n while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) {\n n++;\n }\n\n const parents = [\n dropzoneParents[n - 1],\n dropzoneParents[n],\n deepestZoneParents[n],\n ];\n\n child = parents[0].lastChild;\n\n while (child) {\n if (child === parents[1]) {\n deepestZone = dropzone;\n index = i;\n deepestZoneParents = [];\n\n break;\n }\n else if (child === parents[2]) {\n break;\n }\n\n child = child.previousSibling;\n }\n }\n\n return index;\n },\n\n matchesUpTo: function (element, selector, limit) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) {\n return true;\n }\n\n element = domUtils.parentNode(element);\n\n if (element === limit) {\n return domUtils.matchesSelector(element, selector);\n }\n }\n\n return false;\n },\n\n getActualElement: function (element) {\n return (element instanceof domObjects.SVGElementInstance\n ? element.correspondingUseElement\n : element);\n },\n\n getScrollXY: function (relevantWindow) {\n relevantWindow = relevantWindow || win.window;\n return {\n x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft,\n y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop,\n };\n },\n\n getElementClientRect: function (element) {\n const clientRect = (element instanceof domObjects.SVGElement\n ? element.getBoundingClientRect()\n : element.getClientRects()[0]);\n\n return clientRect && {\n left : clientRect.left,\n right : clientRect.right,\n top : clientRect.top,\n bottom: clientRect.bottom,\n width : clientRect.width || clientRect.right - clientRect.left,\n height: clientRect.height || clientRect.bottom - clientRect.top,\n };\n },\n\n getElementRect: function (element) {\n const clientRect = domUtils.getElementClientRect(element);\n\n if (!browser.isIOS7 && clientRect) {\n const scroll = domUtils.getScrollXY(win.getWindow(element));\n\n clientRect.left += scroll.x;\n clientRect.right += scroll.x;\n clientRect.top += scroll.y;\n clientRect.bottom += scroll.y;\n }\n\n return clientRect;\n },\n\n getPath: function (element) {\n const path = [];\n\n while (element) {\n path.push(element);\n element = domUtils.parentNode(element);\n }\n\n return path;\n },\n\n trySelector: value => {\n if (!is.string(value)) { return false; }\n\n // an exception will be raised if it is invalid\n domObjects.document.querySelector(value);\n return true;\n },\n};\n\nmodule.exports = domUtils;\n","const is = require('./is');\nconst domUtils = require('./domUtils');\nconst pExtend = require('./pointerExtend');\n\nconst { window, getWindow } = require('./window');\nconst { indexOf, contains } = require('./arr');\n\nconst useAttachEvent = ('attachEvent' in window) && !('addEventListener' in window);\nconst addEvent = useAttachEvent? 'attachEvent': 'addEventListener';\nconst removeEvent = useAttachEvent? 'detachEvent': 'removeEventListener';\nconst on = useAttachEvent? 'on': '';\n\nconst elements = [];\nconst targets = [];\nconst attachedListeners = [];\n\n// {\n// type: {\n// selectors: ['selector', ...],\n// contexts : [document, ...],\n// listeners: [[listener, capture, passive], ...]\n// }\n// }\nconst delegatedEvents = {};\n\nconst documents = [];\n\nconst supportsOptions = !useAttachEvent && (() => {\n let supported = false;\n\n window.document.createElement('div').addEventListener('test', null, {\n get capture () { supported = true; },\n });\n\n return supported;\n})();\n\nfunction add (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n let elementIndex = indexOf(elements, element);\n let target = targets[elementIndex];\n\n if (!target) {\n target = {\n events: {},\n typeCount: 0,\n };\n\n elementIndex = elements.push(element) - 1;\n targets.push(target);\n\n attachedListeners.push(useAttachEvent\n ? {\n supplied: [],\n wrapped : [],\n useCount: [],\n }\n : null);\n }\n\n if (!target.events[type]) {\n target.events[type] = [];\n target.typeCount++;\n }\n\n if (!contains(target.events[type], listener)) {\n let ret;\n\n if (useAttachEvent) {\n const { supplied, wrapped, useCount } = attachedListeners[elementIndex];\n const listenerIndex = indexOf(supplied, listener);\n\n const wrappedListener = wrapped[listenerIndex] || function (event) {\n if (!event.immediatePropagationStopped) {\n event.target = event.srcElement;\n event.currentTarget = element;\n\n event.preventDefault = event.preventDefault || preventDef;\n event.stopPropagation = event.stopPropagation || stopProp;\n event.stopImmediatePropagation = event.stopImmediatePropagation || stopImmProp;\n\n if (/mouse|click/.test(event.type)) {\n event.pageX = event.clientX + getWindow(element).document.documentElement.scrollLeft;\n event.pageY = event.clientY + getWindow(element).document.documentElement.scrollTop;\n }\n\n listener(event);\n }\n };\n\n ret = element[addEvent](on + type, wrappedListener, !!options.capture);\n\n if (listenerIndex === -1) {\n supplied.push(listener);\n wrapped.push(wrappedListener);\n useCount.push(1);\n }\n else {\n useCount[listenerIndex]++;\n }\n }\n else {\n ret = element[addEvent](type, listener, supportsOptions? options : !!options.capture);\n }\n target.events[type].push(listener);\n\n return ret;\n }\n}\n\nfunction remove (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const elementIndex = indexOf(elements, element);\n const target = targets[elementIndex];\n\n if (!target || !target.events) {\n return;\n }\n\n let wrappedListener = listener;\n let listeners;\n let listenerIndex;\n\n if (useAttachEvent) {\n listeners = attachedListeners[elementIndex];\n listenerIndex = indexOf(listeners.supplied, listener);\n wrappedListener = listeners.wrapped[listenerIndex];\n }\n\n if (type === 'all') {\n for (type in target.events) {\n if (target.events.hasOwnProperty(type)) {\n remove(element, type, 'all');\n }\n }\n return;\n }\n\n if (target.events[type]) {\n const len = target.events[type].length;\n\n if (listener === 'all') {\n for (let i = 0; i < len; i++) {\n remove(element, type, target.events[type][i], options);\n }\n return;\n }\n else {\n for (let i = 0; i < len; i++) {\n if (target.events[type][i] === listener) {\n element[removeEvent](on + type, wrappedListener, supportsOptions? options : !!options.capture);\n target.events[type].splice(i, 1);\n\n if (useAttachEvent && listeners) {\n listeners.useCount[listenerIndex]--;\n if (listeners.useCount[listenerIndex] === 0) {\n listeners.supplied.splice(listenerIndex, 1);\n listeners.wrapped.splice(listenerIndex, 1);\n listeners.useCount.splice(listenerIndex, 1);\n }\n }\n\n break;\n }\n }\n }\n\n if (target.events[type] && target.events[type].length === 0) {\n target.events[type] = null;\n target.typeCount--;\n }\n }\n\n if (!target.typeCount) {\n targets.splice(elementIndex, 1);\n elements.splice(elementIndex, 1);\n attachedListeners.splice(elementIndex, 1);\n }\n}\n\nfunction addDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n if (!delegatedEvents[type]) {\n delegatedEvents[type] = {\n selectors: [],\n contexts : [],\n listeners: [],\n };\n\n // add delegate listener functions\n for (let i = 0; i < documents.length; i++) {\n add(documents[i], type, delegateListener);\n add(documents[i], type, delegateUseCapture, true);\n }\n }\n\n const delegated = delegatedEvents[type];\n let index;\n\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n break;\n }\n }\n\n if (index === -1) {\n index = delegated.selectors.length;\n\n delegated.selectors.push(selector);\n delegated.contexts .push(context);\n delegated.listeners.push([]);\n }\n\n // keep listener and capture and passive flags\n delegated.listeners[index].push([listener, !!options.capture, options.passive]);\n}\n\nfunction removeDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const delegated = delegatedEvents[type];\n let matchFound = false;\n let index;\n\n if (!delegated) { return; }\n\n // count from last index of delegated to 0\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n // look for matching selector and context Node\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n\n const listeners = delegated.listeners[index];\n\n // each item of the listeners array is an array: [function, capture, passive]\n for (let i = listeners.length - 1; i >= 0; i--) {\n const [fn, capture, passive] = listeners[i];\n\n // check if the listener functions and capture and passive flags match\n if (fn === listener && capture === !!options.capture && passive === options.passive) {\n // remove the listener from the array of listeners\n listeners.splice(i, 1);\n\n // if all listeners for this interactable have been removed\n // remove the interactable from the delegated arrays\n if (!listeners.length) {\n delegated.selectors.splice(index, 1);\n delegated.contexts .splice(index, 1);\n delegated.listeners.splice(index, 1);\n\n // remove delegate function from context\n remove(context, type, delegateListener);\n remove(context, type, delegateUseCapture, true);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegatedEvents[type] = null;\n }\n }\n\n // only remove one listener\n matchFound = true;\n break;\n }\n }\n\n if (matchFound) { break; }\n }\n }\n}\n\n// bound to the interactable context when a DOM event\n// listener is added to a selector interactable\nfunction delegateListener (event, optionalArg) {\n const options = getOptions(optionalArg);\n const fakeEvent = {};\n const delegated = delegatedEvents[event.type];\n const eventTarget = (domUtils.getActualElement(event.path\n ? event.path[0]\n : event.target));\n let element = eventTarget;\n\n // duplicate the event so that currentTarget can be changed\n pExtend(fakeEvent, event);\n\n fakeEvent.originalEvent = event;\n fakeEvent.preventDefault = preventOriginalDefault;\n\n // climb up document tree looking for selector matches\n while (is.element(element)) {\n for (let i = 0; i < delegated.selectors.length; i++) {\n const selector = delegated.selectors[i];\n const context = delegated.contexts[i];\n\n if (domUtils.matchesSelector(element, selector)\n && domUtils.nodeContains(context, eventTarget)\n && domUtils.nodeContains(context, element)) {\n\n const listeners = delegated.listeners[i];\n\n fakeEvent.currentTarget = element;\n\n for (let j = 0; j < listeners.length; j++) {\n const [fn, capture, passive] = listeners[j];\n\n if (capture === !!options.capture && passive === options.passive) {\n fn(fakeEvent);\n }\n }\n }\n }\n\n element = domUtils.parentNode(element);\n }\n}\n\nfunction delegateUseCapture (event) {\n return delegateListener.call(this, event, true);\n}\n\nfunction preventDef () {\n this.returnValue = false;\n}\n\nfunction preventOriginalDefault () {\n this.originalEvent.preventDefault();\n}\n\nfunction stopProp () {\n this.cancelBubble = true;\n}\n\nfunction stopImmProp () {\n this.cancelBubble = true;\n this.immediatePropagationStopped = true;\n}\n\nfunction getOptions (param) {\n return is.object(param)? param : { capture: param };\n}\n\nmodule.exports = {\n add,\n remove,\n\n addDelegate,\n removeDelegate,\n\n delegateListener,\n delegateUseCapture,\n delegatedEvents,\n documents,\n\n useAttachEvent,\n supportsOptions,\n\n _elements: elements,\n _targets: targets,\n _attachedListeners: attachedListeners,\n};\n","module.exports = function extend (dest, source) {\n for (const prop in source) {\n dest[prop] = source[prop];\n }\n return dest;\n};\n","const {\n resolveRectLike,\n rectToXY,\n} = require('./rect');\n\nmodule.exports = function (target, element, action) {\n const actionOptions = target.options[action];\n const actionOrigin = actionOptions && actionOptions.origin;\n const origin = actionOrigin || target.options.origin;\n\n const originRect = resolveRectLike(origin, target, element, [target && element]);\n\n return rectToXY(originRect) || { x: 0, y: 0 };\n};\n","module.exports = (x, y) => Math.sqrt(x * x + y * y);\n","const extend = require('./extend');\nconst win = require('./window');\n\nconst utils = {\n warnOnce: function (method, message) {\n let warned = false;\n\n return function () {\n if (!warned) {\n win.window.console.warn(message);\n warned = true;\n }\n\n return method.apply(this, arguments);\n };\n },\n\n // http://stackoverflow.com/a/5634528/2280888\n _getQBezierValue: function (t, p1, p2, p3) {\n const iT = 1 - t;\n return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3;\n },\n\n getQuadraticCurvePoint: function (startX, startY, cpX, cpY, endX, endY, position) {\n return {\n x: utils._getQBezierValue(position, startX, cpX, endX),\n y: utils._getQBezierValue(position, startY, cpY, endY),\n };\n },\n\n // http://gizma.com/easing/\n easeOutQuad: function (t, b, c, d) {\n t /= d;\n return -c * t*(t-2) + b;\n },\n\n copyAction: function (dest, src) {\n dest.name = src.name;\n dest.axis = src.axis;\n dest.edges = src.edges;\n\n return dest;\n },\n\n is : require('./is'),\n extend : extend,\n hypot : require('./hypot'),\n getOriginXY: require('./getOriginXY'),\n};\n\nextend(utils, require('./arr'));\nextend(utils, require('./domUtils'));\nextend(utils, require('./pointerUtils'));\nextend(utils, require('./rect'));\n\nmodule.exports = utils;\n","const scope = require('../scope');\nconst utils = require('./index');\n\nconst finder = {\n methodOrder: [ 'simulationResume', 'mouseOrPen', 'hasPointer', 'idle' ],\n\n search: function (pointer, eventType, eventTarget) {\n const pointerType = utils.getPointerType(pointer);\n const pointerId = utils.getPointerId(pointer);\n const details = { pointer, pointerId, pointerType, eventType, eventTarget };\n\n for (const method of finder.methodOrder) {\n const interaction = finder[method](details);\n\n if (interaction) {\n return interaction;\n }\n }\n },\n\n // try to resume simulation with a new pointer\n simulationResume: function ({ pointerType, eventType, eventTarget }) {\n if (!/down|start/i.test(eventType)) {\n return null;\n }\n\n for (const interaction of scope.interactions) {\n let element = eventTarget;\n\n if (interaction.simulation && interaction.simulation.allowResume\n && (interaction.pointerType === pointerType)) {\n while (element) {\n // if the element is the interaction element\n if (element === interaction.element) {\n return interaction;\n }\n element = utils.parentNode(element);\n }\n }\n }\n\n return null;\n },\n\n // if it's a mouse or pen interaction\n mouseOrPen: function ({ pointerId, pointerType, eventType }) {\n if (pointerType !== 'mouse' && pointerType !== 'pen') {\n return null;\n }\n\n let firstNonActive;\n\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType) {\n // if it's a down event, skip interactions with running simulations\n if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; }\n\n // if the interaction is active, return it immediately\n if (interaction.interacting()) {\n return interaction;\n }\n // otherwise save it and look for another active interaction\n else if (!firstNonActive) {\n firstNonActive = interaction;\n }\n }\n }\n\n // if no active mouse interaction was found use the first inactive mouse\n // interaction\n if (firstNonActive) {\n return firstNonActive;\n }\n\n // find any mouse or pen interaction.\n // ignore the interaction if the eventType is a *down, and a simulation\n // is active\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType && !(/down/i.test(eventType) && interaction.simulation)) {\n return interaction;\n }\n }\n\n return null;\n },\n\n // get interaction that has this pointer\n hasPointer: function ({ pointerId }) {\n for (const interaction of scope.interactions) {\n if (utils.contains(interaction.pointerIds, pointerId)) {\n return interaction;\n }\n }\n },\n\n // get first idle interaction with a matching pointerType\n idle: function ({ pointerType }) {\n for (const interaction of scope.interactions) {\n // if there's already a pointer held down\n if (interaction.pointerIds.length === 1) {\n const target = interaction.target;\n // don't add this pointer if there is a target interactable and it\n // isn't gesturable\n if (target && !target.options.gesture.enabled) {\n continue;\n }\n }\n // maximum of 2 pointers per interaction\n else if (interaction.pointerIds.length >= 2) {\n continue;\n }\n\n if (!interaction.interacting() && (pointerType === interaction.pointerType)) {\n return interaction;\n }\n }\n\n return null;\n },\n};\n\nmodule.exports = finder;\n","const win = require('./window');\nconst isWindow = require('./isWindow');\n\nconst is = {\n array : () => {},\n\n window : thing => thing === win.window || isWindow(thing),\n\n docFrag : thing => is.object(thing) && thing.nodeType === 11,\n\n object : thing => !!thing && (typeof thing === 'object'),\n\n function: thing => typeof thing === 'function',\n\n number : thing => typeof thing === 'number' ,\n\n bool : thing => typeof thing === 'boolean' ,\n\n string : thing => typeof thing === 'string' ,\n\n element: thing => {\n if (!thing || (typeof thing !== 'object')) { return false; }\n\n const _window = win.getWindow(thing) || win.window;\n\n return (/object|function/.test(typeof _window.Element)\n ? thing instanceof _window.Element //DOM2\n : thing.nodeType === 1 && typeof thing.nodeName === 'string');\n },\n};\n\nis.array = thing => (is.object(thing)\n && (typeof thing.length !== 'undefined')\n && is.function(thing.splice));\n\nmodule.exports = is;\n","module.exports = (thing) => !!(thing && thing.Window) && (thing instanceof thing.Window);\n","function pointerExtend (dest, source) {\n for (const prop in source) {\n const prefixedPropREs = module.exports.prefixedPropREs;\n let deprecated = false;\n\n // skip deprecated prefixed properties\n for (const vendor in prefixedPropREs) {\n if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) {\n deprecated = true;\n break;\n }\n }\n\n if (!deprecated && typeof source[prop] !== 'function') {\n dest[prop] = source[prop];\n }\n }\n return dest;\n}\n\npointerExtend.prefixedPropREs = {\n webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/,\n};\n\nmodule.exports = pointerExtend;\n","const hypot = require('./hypot');\nconst browser = require('./browser');\nconst dom = require('./domObjects');\nconst domUtils = require('./domUtils');\nconst domObjects = require('./domObjects');\nconst is = require('./is');\nconst pointerExtend = require('./pointerExtend');\n\nconst pointerUtils = {\n copyCoords: function (dest, src) {\n dest.page = dest.page || {};\n dest.page.x = src.page.x;\n dest.page.y = src.page.y;\n\n dest.client = dest.client || {};\n dest.client.x = src.client.x;\n dest.client.y = src.client.y;\n\n dest.timeStamp = src.timeStamp;\n },\n\n setCoordDeltas: function (targetObj, prev, cur) {\n targetObj.page.x = cur.page.x - prev.page.x;\n targetObj.page.y = cur.page.y - prev.page.y;\n targetObj.client.x = cur.client.x - prev.client.x;\n targetObj.client.y = cur.client.y - prev.client.y;\n targetObj.timeStamp = cur.timeStamp - prev.timeStamp;\n\n // set pointer velocity\n const dt = Math.max(targetObj.timeStamp / 1000, 0.001);\n\n targetObj.page.speed = hypot(targetObj.page.x, targetObj.page.y) / dt;\n targetObj.page.vx = targetObj.page.x / dt;\n targetObj.page.vy = targetObj.page.y / dt;\n\n targetObj.client.speed = hypot(targetObj.client.x, targetObj.page.y) / dt;\n targetObj.client.vx = targetObj.client.x / dt;\n targetObj.client.vy = targetObj.client.y / dt;\n },\n\n isNativePointer: function (pointer) {\n return (pointer instanceof dom.Event || pointer instanceof dom.Touch);\n },\n\n // Get specified X/Y coords for mouse or event.touches[0]\n getXY: function (type, pointer, xy) {\n xy = xy || {};\n type = type || 'page';\n\n xy.x = pointer[type + 'X'];\n xy.y = pointer[type + 'Y'];\n\n return xy;\n },\n\n getPageXY: function (pointer, page) {\n page = page || {};\n\n // Opera Mobile handles the viewport and scrolling oddly\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n pointerUtils.getXY('screen', pointer, page);\n\n page.x += window.scrollX;\n page.y += window.scrollY;\n }\n else {\n pointerUtils.getXY('page', pointer, page);\n }\n\n return page;\n },\n\n getClientXY: function (pointer, client) {\n client = client || {};\n\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n // Opera Mobile handles the viewport and scrolling oddly\n pointerUtils.getXY('screen', pointer, client);\n }\n else {\n pointerUtils.getXY('client', pointer, client);\n }\n\n return client;\n },\n\n getPointerId: function (pointer) {\n return is.number(pointer.pointerId)? pointer.pointerId : pointer.identifier;\n },\n\n setCoords: function (targetObj, pointers, timeStamp) {\n const pointer = (pointers.length > 1\n ? pointerUtils.pointerAverage(pointers)\n : pointers[0]);\n\n const tmpXY = {};\n\n pointerUtils.getPageXY(pointer, tmpXY);\n targetObj.page.x = tmpXY.x;\n targetObj.page.y = tmpXY.y;\n\n pointerUtils.getClientXY(pointer, tmpXY);\n targetObj.client.x = tmpXY.x;\n targetObj.client.y = tmpXY.y;\n\n targetObj.timeStamp = is.number(timeStamp) ? timeStamp :new Date().getTime();\n },\n\n pointerExtend: pointerExtend,\n\n getTouchPair: function (event) {\n const touches = [];\n\n // array of touches is supplied\n if (is.array(event)) {\n touches[0] = event[0];\n touches[1] = event[1];\n }\n // an event\n else {\n if (event.type === 'touchend') {\n if (event.touches.length === 1) {\n touches[0] = event.touches[0];\n touches[1] = event.changedTouches[0];\n }\n else if (event.touches.length === 0) {\n touches[0] = event.changedTouches[0];\n touches[1] = event.changedTouches[1];\n }\n }\n else {\n touches[0] = event.touches[0];\n touches[1] = event.touches[1];\n }\n }\n\n return touches;\n },\n\n pointerAverage: function (pointers) {\n const average = {\n pageX : 0,\n pageY : 0,\n clientX: 0,\n clientY: 0,\n screenX: 0,\n screenY: 0,\n };\n\n for (const pointer of pointers) {\n for (const prop in average) {\n average[prop] += pointer[prop];\n }\n }\n for (const prop in average) {\n average[prop] /= pointers.length;\n }\n\n return average;\n },\n\n touchBBox: function (event) {\n if (!event.length && !(event.touches && event.touches.length > 1)) {\n return;\n }\n\n const touches = pointerUtils.getTouchPair(event);\n const minX = Math.min(touches[0].pageX, touches[1].pageX);\n const minY = Math.min(touches[0].pageY, touches[1].pageY);\n const maxX = Math.max(touches[0].pageX, touches[1].pageX);\n const maxY = Math.max(touches[0].pageY, touches[1].pageY);\n\n return {\n x: minX,\n y: minY,\n left: minX,\n top: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n },\n\n touchDistance: function (event, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n\n\n const dx = touches[0][sourceX] - touches[1][sourceX];\n const dy = touches[0][sourceY] - touches[1][sourceY];\n\n return hypot(dx, dy);\n },\n\n touchAngle: function (event, prevAngle, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n const dx = touches[1][sourceX] - touches[0][sourceX];\n const dy = touches[1][sourceY] - touches[0][sourceY];\n const angle = 180 * Math.atan2(dy , dx) / Math.PI;\n\n return angle;\n },\n\n getPointerType: function (pointer) {\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : is.number(pointer.pointerType)\n ? [undefined, undefined,'touch', 'pen', 'mouse'][pointer.pointerType]\n // if the PointerEvent API isn't available, then the \"pointer\" must\n // be either a MouseEvent, TouchEvent, or Touch object\n : /touch/.test(pointer.type) || pointer instanceof domObjects.Touch\n ? 'touch'\n : 'mouse';\n },\n\n // [ event.target, event.currentTarget ]\n getEventTargets: function (event) {\n return [\n domUtils.getActualElement(event.path ? event.path[0] : event.target),\n domUtils.getActualElement(event.currentTarget),\n ];\n },\n};\n\nmodule.exports = pointerUtils;\n","const { window } = require('./window');\n\nconst vendors = ['ms', 'moz', 'webkit', 'o'];\nlet lastTime = 0;\nlet request;\nlet cancel;\n\nfor (let x = 0; x < vendors.length && !window.requestAnimationFrame; x++) {\n request = window[vendors[x] + 'RequestAnimationFrame'];\n cancel = window[vendors[x] +'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n}\n\nif (!request) {\n request = function (callback) {\n const currTime = new Date().getTime();\n const timeToCall = Math.max(0, 16 - (currTime - lastTime));\n const id = setTimeout(function () { callback(currTime + timeToCall); },\n timeToCall);\n\n lastTime = currTime + timeToCall;\n return id;\n };\n}\n\nif (!cancel) {\n cancel = function (id) {\n clearTimeout(id);\n };\n}\n\nmodule.exports = {\n request,\n cancel,\n};\n","const extend = require('./extend');\nconst is = require('./is');\nconst {\n closest,\n parentNode,\n getElementRect,\n} = require('./domUtils');\n\nconst rectUtils = {\n getStringOptionResult: function (value, interactable, element) {\n if (!is.string(value)) {\n return null;\n }\n\n if (value === 'parent') {\n value = parentNode(element);\n }\n else if (value === 'self') {\n value = interactable.getRect(element);\n }\n else {\n value = closest(element, value);\n }\n\n return value;\n },\n\n resolveRectLike: function (value, interactable, element, functionArgs) {\n value = rectUtils.getStringOptionResult(value, interactable, element) || value;\n\n if (is.function(value)) {\n value = value.apply(null, functionArgs);\n }\n\n if (is.element(value)) {\n value = getElementRect(value);\n }\n\n return value;\n },\n\n rectToXY: function (rect) {\n return rect && {\n x: 'x' in rect ? rect.x : rect.left,\n y: 'y' in rect ? rect.y : rect.top,\n };\n },\n\n xywhToTlbr: function (rect) {\n if (rect && !('left' in rect && 'top' in rect)) {\n rect = extend({}, rect);\n\n rect.left = rect.x || 0;\n rect.top = rect.y || 0;\n rect.right = rect.right || (rect.left + rect.width);\n rect.bottom = rect.bottom || (rect.top + rect.height);\n }\n\n return rect;\n },\n\n tlbrToXywh: function (rect) {\n if (rect && !('x' in rect && 'y' in rect)) {\n rect = extend({}, rect);\n\n rect.x = rect.left || 0;\n rect.top = rect.top || 0;\n rect.width = rect.width || (rect.right - rect.x);\n rect.height = rect.height || (rect.bottom - rect.y);\n }\n\n return rect;\n },\n};\n\nmodule.exports = rectUtils;\n","const win = module.exports;\nconst isWindow = require('./isWindow');\n\nfunction init (window) {\n // get wrapped window if using Shadow DOM polyfill\n\n win.realWindow = window;\n\n // create a TextNode\n const el = window.document.createTextNode('');\n\n // check if it's wrapped by a polyfill\n if (el.ownerDocument !== window.document\n && typeof window.wrap === 'function'\n && window.wrap(el) === el) {\n // use wrapped window\n window = window.wrap(window);\n }\n\n win.window = window;\n}\n\nif (typeof window === 'undefined') {\n win.window = undefined;\n win.realWindow = undefined;\n}\nelse {\n init(window);\n}\n\nwin.getWindow = function getWindow (node) {\n if (isWindow(node)) {\n return node;\n }\n\n const rootNode = (node.ownerDocument || node);\n\n return rootNode.defaultView || rootNode.parentWindow || win.window;\n};\n\nwin.init = init;\n"]} \ No newline at end of file diff --git a/dist/interact.min.js b/dist/interact.min.js index c0bb2476c..2d1f0fb62 100644 --- a/dist/interact.min.js +++ b/dist/interact.min.js @@ -1,6 +1,6 @@ -/* interact.js v1.3.0-alpha.3+sha.9595c40 | https://raw.github.com/taye/interact.js/master/LICENSE */ -!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var t;t="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,t.interact=e()}}(function(){return function e(t,n,r){function i(s,a){if(!n[s]){if(!t[s]){var l="function"==typeof require&&require;if(!a&&l)return l(s,!0);if(o)return o(s,!0);var c=new Error("Cannot find module '"+s+"'");throw c.code="MODULE_NOT_FOUND",c}var p=n[s]={exports:{}};t[s][0].call(p.exports,function(e){var n=t[s][1][e];return i(n||e)},p,p.exports,e,t,n,r)}return n[s].exports}for(var o="function"==typeof require&&require,s=0;s6&&void 0!==arguments[6]&&arguments[6];r(this,e);var f=t.target,v=(f&&f.options||s).deltaSource,g=o(f,p,l),h="start"===c,m="end"===c,y=h?t.startCoords:t.curCoords,x=t.prevEvent;p=p||t.element;var b=i({},y.page),w=i({},y.client);b.x-=g.x,b.y-=g.y,w.x-=g.x,w.y-=g.y,this.ctrlKey=n.ctrlKey,this.altKey=n.altKey,this.shiftKey=n.shiftKey,this.metaKey=n.metaKey,this.button=n.button,this.buttons=n.buttons,this.target=p,this.currentTarget=p,this.relatedTarget=u||null,this.preEnd=d,this.type=l+(c||""),this.interaction=t,this.interactable=f,this.t0=h?t.downTimes[t.downTimes.length-1]:x.t0;var E={interaction:t,event:n,action:l,phase:c,element:p,related:u,page:b,client:w,coords:y,starting:h,ending:m,deltaSource:v,iEvent:this};a.fire("set-xy",E),m?(this.pageX=x.pageX,this.pageY=x.pageY,this.clientX=x.clientX,this.clientY=x.clientY):(this.pageX=b.x,this.pageY=b.y,this.clientX=w.x,this.clientY=w.y),this.x0=t.startCoords.page.x-g.x,this.y0=t.startCoords.page.y-g.y,this.clientX0=t.startCoords.client.x-g.x,this.clientY0=t.startCoords.client.y-g.y,a.fire("set-delta",E),this.timeStamp=y.timeStamp,this.dt=t.pointerDelta.timeStamp,this.duration=this.timeStamp-this.t0,this.speed=t.pointerDelta[v].speed,this.velocityX=t.pointerDelta[v].vx,this.velocityY=t.pointerDelta[v].vy,this.swipe=m||"inertiastart"===c?this.getSwipe():null,a.fire("new",E)}return e.prototype.getSwipe=function(){var e=this.interaction;if(e.prevEvent.speed<600||this.timeStamp-e.prevEvent.timeStamp>150)return null;var t=180*Math.atan2(e.prevEvent.velocityY,e.prevEvent.velocityX)/Math.PI;t<0&&(t+=360);var n=112.5<=t&&t<247.5,r=202.5<=t&&t<337.5,i=!n&&(292.5<=t||t<67.5);return{up:r,down:!r&&22.5<=t&&t<157.5,left:n,right:i,angle:t,speed:e.prevEvent.speed,velocity:{x:e.prevEvent.velocityX,y:e.prevEvent.velocityY}}},e.prototype.preventDefault=function(){},e.prototype.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},e.prototype.stopPropagation=function(){this.propagationStopped=!0},e}();a.on("set-delta",function(e){var t=e.iEvent,n=e.interaction,r=e.starting,i=e.deltaSource,o=r?t:n.prevEvent;"client"===i?(t.dx=t.clientX-o.clientX,t.dy=t.clientY-o.clientY):(t.dx=t.pageX-o.pageX,t.dy=t.pageY-o.pageY)}),l.signals=a,t.exports=l},{"./defaultOptions":18,"./utils/Signals":35,"./utils/extend":41,"./utils/getOriginXY":42}],4:[function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=e("./utils/is"),o=e("./utils/events"),s=e("./utils/extend"),a=e("./actions/base"),l=e("./scope"),c=e("./Eventable"),p=e("./defaultOptions"),u=e("./utils/Signals").new(),d=e("./utils/domUtils"),f=d.getElementRect,v=d.nodeContains,g=d.trySelector,h=e("./utils/window"),m=h.getWindow,y=e("./utils/arr"),x=y.indexOf,b=y.contains,w=e("./utils/browser"),E=w.wheelEvent;l.interactables=[];var S=function(){function e(t,n){r(this,e),n=n||{},this.target=t,this.events=new c,this._context=n.context||l.document,this._win=m(g(t)?this._context:t),this._doc=this._win.document,u.fire("new",{target:t,options:n,interactable:this,win:this._win}),l.addDocument(this._doc,this._win),l.interactables.push(this),this.set(n)}return e.prototype.setOnEvents=function(e,t){var n="on"+e;return i.function(t.onstart)&&(this.events[n+"start"]=t.onstart),i.function(t.onmove)&&(this.events[n+"move"]=t.onmove),i.function(t.onend)&&(this.events[n+"end"]=t.onend),i.function(t.oninertiastart)&&(this.events[n+"inertiastart"]=t.oninertiastart),this},e.prototype.setPerAction=function(e,t){for(var n in t)n in p[e]&&(i.object(t[n])?(this.options[e][n]=s(this.options[e][n]||{},t[n]),i.object(p.perAction[n])&&"enabled"in p.perAction[n]&&(this.options[e][n].enabled=!1!==t[n].enabled)):i.bool(t[n])&&i.object(p.perAction[n])?this.options[e][n].enabled=t[n]:void 0!==t[n]&&(this.options[e][n]=t[n]))},e.prototype.getRect=function(e){return e=e||this.target,i.string(this.target)&&!i.element(e)&&(e=this._context.querySelector(this.target)),f(e)},e.prototype.rectChecker=function(e){return i.function(e)?(this.getRect=e,this):null===e?(delete this.options.getRect,this):this.getRect},e.prototype._backCompatOption=function(e,t){if(g(t)||i.object(t)){this.options[e]=t;for(var n=a.names,r=Array.isArray(n),o=0,n=r?n:n[Symbol.iterator]();;){var s;if(r){if(o>=n.length)break;s=n[o++]}else{if(o=n.next(),o.done)break;s=o.value}var l=s;this.options[l][e]=t}return this}return this.options[e]},e.prototype.origin=function(e){return this._backCompatOption("origin",e)},e.prototype.deltaSource=function(e){return"page"===e||"client"===e?(this.options.deltaSource=e,this):this.options.deltaSource},e.prototype.context=function(){return this._context},e.prototype.inContext=function(e){return this._context===e.ownerDocument||v(this._context,e)},e.prototype.fire=function(e){return this.events.fire(e),this},e.prototype._onOffMultiple=function(e,t,n,r){if(i.string(t)&&-1!==t.search(" ")&&(t=t.trim().split(/ +/)),i.array(t)){for(var o=0;o=l.length)break;f=l[d++]}else{if(d=l.next(),d.done)break;f=d.value}var v=f;this.options[v]=p.base[v],v in t&&this[v](t[v])}return u.fire("set",{options:t,interactable:this}),this},e.prototype.unset=function(){if(o.remove(this.target,"all"),i.string(this.target))for(var e in o.delegatedEvents){var t=o.delegatedEvents[e];t.selectors[0]===this.target&&t.contexts[0]===this._context&&(t.selectors.splice(0,1),t.contexts.splice(0,1),t.listeners.splice(0,1),t.selectors.length||(t[e]=null)),o.remove(this._context,e,o.delegateListener),o.remove(this._context,e,o.delegateUseCapture,!0)}else o.remove(this,"all");u.fire("unset",{interactable:this}),l.interactables.splice(x(l.interactables,this),1);for(var n=l.interactions||[],r=Array.isArray(n),s=0,n=r?n:n[Symbol.iterator]();;){var a;if(r){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var c=a;c.target===this&&c.interacting()&&c.stop()}return l.interact},e}();l.interactables.indexOfElement=function(e,t){t=t||l.document;for(var n=0;n=y.length)break;w=y[b++]}else{if(b=y.next(),b.done)break;w=b.value}var E=w,S=E[0],T=E[1];T._updateEventTargets(r,i),T[e](S,t,r,i)}}}function o(e){for(var t=0;te.pointerMoveTolerance);var a={pointer:t,pointerIndex:this.getPointerIndex(t),event:n,eventTarget:r,dx:o,dy:s,duplicate:i,interaction:this,interactingBeforeMove:this.interacting()};i||l.setCoordDeltas(this.pointerDelta,this.prevCoords,this.curCoords),d.fire("move",a),i||(this.interacting()&&this.doMove(a),this.pointerWasMoved&&l.copyCoords(this.prevCoords,this.curCoords))},e.prototype.doMove=function(e){e=l.extend({pointer:this.pointers[0],event:this.prevEvent,eventTarget:this._eventTarget,interaction:this},e||{}),d.fire("before-action-move",e),this._dontFireMove||d.fire("action-move",e),this._dontFireMove=!1},e.prototype.pointerUp=function(e,t,n,r){var i=this.getPointerIndex(e);d.fire(/cancel$/i.test(t.type)?"cancel":"up",{pointer:e,pointerIndex:i,event:t,eventTarget:n,curEventTarget:r,interaction:this}),this.simulation||this.end(t),this.pointerIsDown=!1,this.removePointer(e,t)},e.prototype.end=function(e){e=e||this.prevEvent,this.interacting()&&d.fire("action-end",{event:e,interaction:this}),this.stop()},e.prototype.currentAction=function(){return this._interacting?this.prepared.name:null},e.prototype.interacting=function(){return this._interacting},e.prototype.stop=function(){d.fire("stop",{interaction:this}),this._interacting&&(d.fire("stop-active",{interaction:this}),d.fire("stop-"+this.prepared.name,{interaction:this})),this.target=this.element=null,this._interacting=!1,this.prepared.name=this.prevEvent=null},e.prototype.getPointerIndex=function(e){return l.indexOf(this.pointerIds,l.getPointerId(e))},e.prototype.updatePointer=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:t&&/(down|start)$/i.test(t.type),r=l.getPointerId(e),i=this.getPointerIndex(e);return-1===i&&(i=this.pointerIds.length,this.pointerIds[i]=r),n&&d.fire("update-pointer-down",{pointer:e,event:t,down:n,pointerId:r,pointerIndex:i,interaction:this}),this.pointers[i]=e,i},e.prototype.removePointer=function(e,t){var n=l.getPointerId(e),r=this.mouse?0:l.indexOf(this.pointerIds,n);-1!==r&&(d.fire("remove-pointer",{pointer:e,event:t,pointerIndex:r,interaction:this}),this.pointers.splice(r,1),this.pointerIds.splice(r,1),this.downTargets.splice(r,1),this.downTimes.splice(r,1))},e.prototype._updateEventTargets=function(e,t){this._eventTarget=e,this._curEventTarget=t},e}(),m=0,y=v.length;m=i.length)break;a=i[s++]}else{if(s=i.next(),s.done)break;a=s.value}var l=a;if(l.options.drop.enabled){var c=l.options.drop.accept;if(!(p.is.element(c)&&c!==t||p.is.string(c)&&!p.matchesSelector(t,c)))for(var d=p.is.string(l.target)?l._context.querySelectorAll(l.target):[l.target],f=0;fo.left&&c.xo.top&&c.y=o.left&&v<=o.right&&g>=o.top&&g<=o.bottom}if(f&&p.is.number(a)){s=Math.max(0,Math.min(o.right,f.right)-Math.max(o.left,f.left))*Math.max(0,Math.min(o.bottom,f.bottom)-Math.max(o.top,f.top))/(f.width*f.height)>=a}return this.options.drop.checker&&(s=this.options.drop.checker(e,t,s,this,i,n,r)),s},v.signals.on("unset",function(e){e.interactable.dropzone(!1)}),v.settingsMethods.push("dropChecker"),g.signals.on("new",function(e){e.dropTarget=null,e.dropElement=null,e.prevDropTarget=null,e.prevDropElement=null,e.dropEvents=null,e.activeDrops={dropzones:[],elements:[],rects:[]}}),g.signals.on("stop",function(e){var t=e.interaction;t.dropTarget=t.dropElement=t.prevDropTarget=t.prevDropElement=null}),d.dynamicDrop=function(e){return p.is.bool(e)?(y=e,d):y},p.merge(v.eventTypes,["dragenter","dragleave","dropactivate","dropdeactivate","dropmove","drop"]),c.methodDict.drop="dropzone",h.drop=m.defaults,t.exports=m},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../interact":21,"../scope":34,"../utils":44,"./base":6}],9:[function(e,t,n){"use strict";var r=e("./base"),i=e("../utils"),o=e("../InteractEvent"),s=e("../Interactable"),a=e("../Interaction"),l=e("../defaultOptions"),c={defaults:{enabled:!1,origin:null,restrict:null},checker:function(e,t,n,r,i){return i.pointerIds.length>=2?{name:"gesture"}:null},getCursor:function(){return""}};o.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;"gesturestart"===t.type&&(t.ds=0,n.gesture.startDistance=n.gesture.prevDistance=t.distance,n.gesture.startAngle=n.gesture.prevAngle=t.angle,n.gesture.scale=1)}),o.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;"gesturemove"===t.type&&(t.ds=t.scale-n.gesture.scale,n.target.fire(t),n.gesture.prevAngle=t.angle,n.gesture.prevDistance=t.distance,t.scale===1/0||null===t.scale||void 0===t.scale||isNaN(t.scale)||(n.gesture.scale=t.scale))}),s.prototype.gesturable=function(e){return i.is.object(e)?(this.options.gesture.enabled=!1!==e.enabled,this.setPerAction("gesture",e),this.setOnEvents("gesture",e),this):i.is.bool(e)?(this.options.gesture.enabled=e,e||(this.ongesturestart=this.ongesturestart=this.ongestureend=null),this):this.options.gesture},o.signals.on("set-delta",function(e){var t=e.interaction,n=e.iEvent,r=e.action,s=e.event,a=e.starting,l=e.ending,c=e.deltaSource;if("gesture"===r){var p=t.pointers;n.touches=[p[0],p[1]],a?(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=1,n.ds=0,n.angle=i.touchAngle(p,void 0,c),n.da=0):l||s instanceof o?(n.distance=t.prevEvent.distance,n.box=t.prevEvent.box,n.scale=t.prevEvent.scale,n.ds=n.scale-1,n.angle=t.prevEvent.angle,n.da=n.angle-t.gesture.startAngle):(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=n.distance/t.gesture.startDistance,n.angle=i.touchAngle(p,t.gesture.prevAngle,c),n.ds=n.scale-t.gesture.prevScale,n.da=n.angle-t.gesture.prevAngle)}}),a.signals.on("new",function(e){e.gesture={start:{x:0,y:0},startDistance:0,prevDistance:0,distance:0,scale:1,startAngle:0,prevAngle:0}}),r.gesture=c,r.names.push("gesture"),i.merge(s.eventTypes,["gesturestart","gesturemove","gestureend"]),r.methodDict.gesture="gesturable",l.gesture=c.defaults,t.exports=c},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"./base":6}],10:[function(e,t,n){"use strict";function r(e,t,n,r,i,s,a){if(!t)return!1;if(!0===t){var l=o.is.number(s.width)?s.width:s.right-s.left,c=o.is.number(s.height)?s.height:s.bottom-s.top;if(l<0&&("left"===e?e="right":"right"===e&&(e="left")),c<0&&("top"===e?e="bottom":"bottom"===e&&(e="top")),"left"===e)return n.x<(l>=0?s.left:s.right)+a;if("top"===e)return n.y<(c>=0?s.top:s.bottom)+a;if("right"===e)return n.x>(l>=0?s.right:s.left)-a;if("bottom"===e)return n.y>(c>=0?s.bottom:s.top)-a}return!!o.is.element(r)&&(o.is.element(t)?t===r:o.matchesUpTo(r,t,i))}var i=e("./base"),o=e("../utils"),s=e("../utils/browser"),a=e("../InteractEvent"),l=e("../Interactable"),c=e("../Interaction"),p=e("../defaultOptions"),u=s.supportsTouch||s.supportsPointerEvent?20:10,d={defaults:{enabled:!1,mouseButtons:null,origin:null,snap:null,restrict:null,inertia:null,autoScroll:null,square:!1,preserveAspectRatio:!1,axis:"xy",margin:NaN,edges:null,invert:"none"},checker:function(e,t,n,i,s,a){if(!a)return null;var l=o.extend({},s.curCoords.page),c=n.options;if(c.resize.enabled){var p=c.resize,d={left:!1,right:!1,top:!1,bottom:!1};if(o.is.object(p.edges)){for(var f in d)d[f]=r(f,p.edges[f],l,s._eventTarget,i,a,p.margin||u);if(d.left=d.left&&!d.right,d.top=d.top&&!d.bottom,d.left||d.right||d.top||d.bottom)return{name:"resize",edges:d}}else{var v="y"!==c.resize.axis&&l.x>a.right-u,g="x"!==c.resize.axis&&l.y>a.bottom-u;if(v||g)return{name:"resize",axes:(v?"x":"")+(g?"y":"")}}}return null},cursors:s.isIe9OrOlder?{x:"e-resize",y:"s-resize",xy:"se-resize",top:"n-resize",left:"w-resize",bottom:"s-resize",right:"e-resize",topleft:"se-resize",bottomright:"se-resize",topright:"ne-resize",bottomleft:"ne-resize"}:{x:"ew-resize",y:"ns-resize",xy:"nwse-resize",top:"ns-resize",left:"ew-resize",bottom:"ns-resize",right:"ew-resize",topleft:"nwse-resize",bottomright:"nwse-resize",topright:"nesw-resize",bottomleft:"nesw-resize"},getCursor:function(e){if(e.axis)return d.cursors[e.name+e.axis];if(e.edges){for(var t="",n=["top","bottom","left","right"],r=0;r<4;r++)e.edges[n[r]]&&(t+=n[r]);return d.cursors[t]}}};a.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;if("resizestart"===t.type&&n.prepared.edges){var r=n.target.getRect(n.element),i=n.target.options.resize;if(i.square||i.preserveAspectRatio){var s=o.extend({},n.prepared.edges);s.top=s.top||s.left&&!s.bottom,s.left=s.left||s.top&&!s.right,s.bottom=s.bottom||s.right&&!s.top,s.right=s.right||s.bottom&&!s.left,n.prepared._linkedEdges=s}else n.prepared._linkedEdges=null;i.preserveAspectRatio&&(n.resizeStartAspectRatio=r.width/r.height),n.resizeRects={start:r,current:o.extend({},r),inverted:o.extend({},r),previous:o.extend({},r),delta:{left:0,right:0,width:0,top:0,bottom:0,height:0}},t.rect=n.resizeRects.inverted,t.deltaRect=n.resizeRects.delta}}),a.signals.on("new",function(e){var t=e.iEvent,n=e.phase,r=e.interaction;if("move"===n&&r.prepared.edges){var i=r.target.options.resize,s=i.invert,a="reposition"===s||"negate"===s,l=r.prepared.edges,c=r.resizeRects.start,p=r.resizeRects.current,u=r.resizeRects.inverted,d=r.resizeRects.delta,f=o.extend(r.resizeRects.previous,u),v=l,g=t.dx,h=t.dy;if(i.preserveAspectRatio||i.square){var m=i.preserveAspectRatio?r.resizeStartAspectRatio:1;l=r.prepared._linkedEdges,v.left&&v.bottom||v.right&&v.top?h=-g/m:v.left||v.right?h=g/m:(v.top||v.bottom)&&(g=h*m)}if(l.top&&(p.top+=h),l.bottom&&(p.bottom+=h),l.left&&(p.left+=g),l.right&&(p.right+=g),a){if(o.extend(u,p),"reposition"===s){var y=void 0;u.top>u.bottom&&(y=u.top,u.top=u.bottom,u.bottom=y),u.left>u.right&&(y=u.left,u.left=u.right,u.right=y)}}else u.top=Math.min(p.top,c.bottom),u.bottom=Math.max(p.bottom,c.top),u.left=Math.min(p.left,c.right),u.right=Math.max(p.right,c.left);u.width=u.right-u.left,u.height=u.bottom-u.top;for(var x in u)d[x]=u[x]-f[x];t.edges=r.prepared.edges,t.rect=u,t.deltaRect=d}}),l.prototype.resizable=function(e){return o.is.object(e)?(this.options.resize.enabled=!1!==e.enabled,this.setPerAction("resize",e),this.setOnEvents("resize",e),/^x$|^y$|^xy$/.test(e.axis)?this.options.resize.axis=e.axis:null===e.axis&&(this.options.resize.axis=p.resize.axis),o.is.bool(e.preserveAspectRatio)?this.options.resize.preserveAspectRatio=e.preserveAspectRatio:o.is.bool(e.square)&&(this.options.resize.square=e.square),this):o.is.bool(e)?(this.options.resize.enabled=e,e||(this.onresizestart=this.onresizestart=this.onresizeend=null),this):this.options.resize},c.signals.on("new",function(e){ -e.resizeAxes="xy"}),a.signals.on("set-delta",function(e){var t=e.interaction,n=e.iEvent;"resize"===e.action&&t.resizeAxes&&(t.target.options.resize.square?("y"===t.resizeAxes?n.dx=n.dy:n.dy=n.dx,n.axes="xy"):(n.axes=t.resizeAxes,"x"===t.resizeAxes?n.dy=0:"y"===t.resizeAxes&&(n.dx=0)))}),i.resize=d,i.names.push("resize"),o.merge(l.eventTypes,["resizestart","resizemove","resizeinertiastart","resizeinertiaresume","resizeend"]),i.methodDict.resize="resizable",p.resize=d.defaults,t.exports=d},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"../utils/browser":37,"./base":6}],11:[function(e,t,n){"use strict";var r=e("./utils/raf"),i=e("./utils/window").getWindow,o=e("./utils/is"),s=e("./utils/domUtils"),a=e("./Interaction"),l=e("./defaultOptions"),c={defaults:{enabled:!1,container:null,margin:60,speed:300},interaction:null,i:null,x:0,y:0,isScrolling:!1,prevTime:0,start:function(e){c.isScrolling=!0,r.cancel(c.i),c.interaction=e,c.prevTime=(new Date).getTime(),c.i=r.request(c.scroll)},stop:function(){c.isScrolling=!1,r.cancel(c.i)},scroll:function(){var e=c.interaction.target.options[c.interaction.prepared.name].autoScroll,t=e.container||i(c.interaction.element),n=(new Date).getTime(),s=(n-c.prevTime)/1e3,a=e.speed*s;a>=1&&(o.window(t)?t.scrollBy(c.x*a,c.y*a):t&&(t.scrollLeft+=c.x*a,t.scrollTop+=c.y*a),c.prevTime=n),c.isScrolling&&(r.cancel(c.i),c.i=r.request(c.scroll))},check:function(e,t){var n=e.options;return n[t].autoScroll&&n[t].autoScroll.enabled},onInteractionMove:function(e){var t=e.interaction,n=e.pointer;if(t.interacting()&&c.check(t.target,t.prepared.name)){if(t.simulation)return void(c.x=c.y=0);var r=void 0,a=void 0,l=void 0,p=void 0,u=t.target.options[t.prepared.name].autoScroll,d=u.container||i(t.element);if(o.window(d))p=n.clientXd.innerWidth-c.margin,l=n.clientY>d.innerHeight-c.margin;else{var f=s.getElementClientRect(d);p=n.clientXf.right-c.margin,l=n.clientY>f.bottom-c.margin}c.x=a?1:p?-1:0,c.y=l?1:r?-1:0,c.isScrolling||(c.margin=u.margin,c.speed=u.speed,c.start(t))}}};a.signals.on("stop-active",function(){c.stop()}),a.signals.on("action-move",c.onInteractionMove),l.perAction.autoScroll=c.defaults,t.exports=c},{"./Interaction":5,"./defaultOptions":18,"./utils/domUtils":39,"./utils/is":46,"./utils/raf":50,"./utils/window":52}],12:[function(e,t,n){"use strict";var r=e("../Interactable"),i=e("../actions/base"),o=e("../utils/is"),s=e("../utils/domUtils");r.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},r.prototype.ignoreFrom=function(e){return this._backCompatOption("ignoreFrom",e)},r.prototype.allowFrom=function(e){return this._backCompatOption("allowFrom",e)},r.prototype.testIgnore=function(e,t,n){return!(!e||!o.element(n))&&(o.string(e)?s.matchesUpTo(n,e,t):!!o.element(e)&&s.nodeContains(e,n))},r.prototype.testAllow=function(e,t,n){return!e||!!o.element(n)&&(o.string(e)?s.matchesUpTo(n,e,t):!!o.element(e)&&s.nodeContains(e,n))},r.prototype.testIgnoreAllow=function(e,t,n){return!this.testIgnore(e.ignoreFrom,t,n)&&this.testAllow(e.allowFrom,t,n)},r.prototype.actionChecker=function(e){return o.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},r.prototype.styleCursor=function(e){return o.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},r.prototype.defaultActionChecker=function(e,t,n,r){for(var o=this.getRect(r),s=null,a=i.names,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var u=p;if((!n.pointerIsDown||!n.mouse||0!=(t.buttons&this.options[u].mouseButtons))&&(s=i[u].checker(e,t,this,r,n,o)))return s}}},{"../Interactable":4,"../actions/base":6,"../utils/domUtils":39,"../utils/is":46}],13:[function(e,t,n){"use strict";function r(e,t,n,r){return g.is.object(e)&&t.testIgnoreAllow(t.options[e.name],n,r)&&t.options[e.name].enabled&&a(t,n,e)?e:null}function i(e,t,n,i,o,s){for(var a=0,l=i.length;a=m.maxInteractions)return!1;if(u.target===e){if((a+=d===n.name|0)>=i)return!1;if(u.element===t&&(l++,d!==n.name||l>=o))return!1}}}return m.maxInteractions>0}}var l=e("../interact"),c=e("../Interactable"),p=e("../Interaction"),u=e("../actions/base"),d=e("../defaultOptions"),f=e("../utils/browser"),v=e("../scope"),g=e("../utils"),h=e("../utils/Signals").new();e("./InteractableMethods");var m={signals:h,withinInteractionLimit:a,maxInteractions:1/0,defaults:{perAction:{manualStart:!1,max:1/0,maxPerElement:1,allowFrom:null,ignoreFrom:null}},setActionDefaults:function(e){g.extend(e.defaults,m.defaults.perAction)}};p.signals.on("down",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;if(!t.interacting()){s(t,o(t,n,r,i))}}),p.signals.on("move",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;if(t.mouse&&!t.pointerIsDown&&!t.interacting()){s(t,o(t,n,r,i))}}),p.signals.on("move",function(e){var t=e.interaction,n=e.event;if(t.pointerIsDown&&!t.interacting()&&t.pointerWasMoved&&t.prepared.name){h.fire("before-start",e);var r=t.target;t.prepared.name&&r&&(r.options[t.prepared.name].manualStart||!a(r,t.element,t.prepared)?t.stop(n):t.start(t.prepared,r,t.element))}}),p.signals.on("stop",function(e){var t=e.interaction,n=t.target;n&&n.options.styleCursor&&(n._doc.documentElement.style.cursor="")}),c.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},c.prototype.actionChecker=function(e){return g.is.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},c.prototype.styleCursor=function(e){return g.is.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},c.prototype.defaultActionChecker=function(e,t,n,r){for(var i=this.getRect(r),o=t.buttons||{0:1,1:4,3:8,4:16}[t.button],s=null,a=u.names,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var d=p;if((!n.pointerIsDown||!n.mouse||0!=(o&this.options[d].mouseButtons))&&(s=u[d].checker(e,t,this,r,n,i)))return s}},l.maxInteractions=function(e){return g.is.number(e)?(m.maxInteractions=e,this):m.maxInteractions},c.settingsMethods.push("styleCursor"),c.settingsMethods.push("actionChecker"),c.settingsMethods.push("ignoreFrom"),c.settingsMethods.push("allowFrom"),d.base.actionChecker=null,d.base.styleCursor=!0,g.extend(d.perAction,m.defaults.perAction),t.exports=m},{"../Interactable":4,"../Interaction":5,"../actions/base":6,"../defaultOptions":18,"../interact":21,"../scope":34,"../utils":44,"../utils/Signals":35,"../utils/browser":37,"./InteractableMethods":12}],14:[function(e,t,n){"use strict";var r=e("./base"),i=e("../Interaction");i.signals.on("new",function(e){e.delayTimer=null}),r.signals.on("prepared",function(e){var t=e.interaction,n=t.prepared.name;if(n){var r=t.target.options[n].delay;r>0&&(t.delayTimer=setTimeout(function(){t.start(t.prepared,t.target,t.element)},r))}}),i.signals.on("move",function(e){var t=e.interaction,n=e.duplicate;t.pointerWasMoved&&!n&&clearTimeout(t.delayTimer)}),r.signals.on("before-start",function(e){var t=e.interaction,n=t.prepared.name;if(n){t.target.options[n].delay>0&&(t.prepared.name=null)}})},{"../Interaction":5,"./base":13}],15:[function(e,t,n){"use strict";function r(e,t){if(!t)return!1;var n=t.options.drag.startAxis;return"xy"===e||"xy"===n||n===e}var i=e("./base"),o=e("../scope"),s=e("../utils/browser"),a=e("../utils/is"),l=e("../utils/domUtils"),c=l.matchesSelector,p=l.parentNode;i.setActionDefaults(e("../actions/drag")),i.signals.on("before-start",function(e){var t=e.interaction,n=e.eventTarget,l=e.dx,u=e.dy;if("drag"===t.prepared.name){var d=Math.abs(l),f=Math.abs(u),v=t.target.options.drag,g=v.startAxis,h=d>f?"x":dl.minSpeed&&g>l.endSpeed,b={interaction:t,pageCoords:v,statuses:f,preEnd:!0,requireEndOnly:!0};y&&!x&&(c.resetStatuses(f),m=c.setAll(b),m.shouldMove&&m.locked&&(h=!0)),(x||h)&&(p.copyCoords(i.upCoords,t.curCoords),t.pointers[0]=i.startEvent=new a(t,n,t.prepared.name,"inertiastart",t.element),i.t0=d,i.active=!0,i.allowResume=l.allowResume,t.simulation=i,o.fire(i.startEvent),x?(i.vx0=t.pointerDelta.client.vx,i.vy0=t.pointerDelta.client.vy,i.v0=g,r(t,i),p.extend(v,t.curCoords.page),v.x+=i.xe,v.y+=i.ye,c.resetStatuses(f),m=c.setAll(b),i.modifiedXe+=m.dx,i.modifiedYe+=m.dy,i.i=u.request(t.boundInertiaFrame)):(i.smoothEnd=!0,i.xe=m.dx,i.ye=m.dy,i.sx=i.sy=0,i.i=u.request(t.boundSmoothEndFrame)))}}),l.signals.on("stop-active",function(e){var t=e.interaction,n=t.inertiaStatus;n.active&&(u.cancel(n.i),n.active=!1,t.simulation=null)})},{"./InteractEvent":3,"./Interaction":5,"./modifiers":24,"./utils":44,"./utils/raf":50}],21:[function(e,t,n){"use strict";function r(e,t){var n=a.interactables.get(e,t);return n||(n=new l(e,t),n.events.global=p),n}var i=e("./utils/browser"),o=e("./utils/events"),s=e("./utils"),a=e("./scope"),l=e("./Interactable"),c=e("./Interaction"),p={};r.isSet=function(e,t){return-1!==a.interactables.indexOfElement(e,t&&t.context)},r.on=function(e,t,n){if(s.is.string(e)&&-1!==e.search(" ")&&(e=e.trim().split(/ +/)),s.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.on(f,t,n)}return r}if(s.is.object(e)){for(var v in e)r.on(v,e[v],t);return r}return s.contains(l.eventTypes,e)?p[e]?p[e].push(t):p[e]=[t]:o.add(a.document,e,t,{options:n}),r},r.off=function(e,t,n){if(s.is.string(e)&&-1!==e.search(" ")&&(e=e.trim().split(/ +/)),s.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.off(f,t,n)}return r}if(s.is.object(e)){for(var v in e)r.off(v,e[v],t);return r}if(s.contains(l.eventTypes,e)){var g=void 0;e in p&&-1!==(g=s.indexOf(p[e],t))&&p[e].splice(g,1)}else o.remove(a.document,e,t,n);return r},r.debug=function(){return a},r.getPointerAverage=s.pointerAverage,r.getTouchBBox=s.touchBBox,r.getTouchDistance=s.touchDistance,r.getTouchAngle=s.touchAngle,r.getElementRect=s.getElementRect,r.getElementClientRect=s.getElementClientRect,r.matchesSelector=s.matchesSelector,r.closest=s.closest,r.supportsTouch=function(){return i.supportsTouch},r.supportsPointerEvent=function(){return i.supportsPointerEvent},r.stop=function(e){for(var t=a.interactions.length-1;t>=0;t--)a.interactions[t].stop(e);return r},r.pointerMoveTolerance=function(e){return s.is.number(e)?(c.pointerMoveTolerance=e,this):c.pointerMoveTolerance},r.addDocument=a.addDocument,r.removeDocument=a.removeDocument,a.interact=r,t.exports=r},{"./Interactable":4,"./Interaction":5,"./scope":34,"./utils":44,"./utils/browser":37,"./utils/events":40}],22:[function(e,t,n){"use strict";function r(e){var t=e.interaction,n=e.event;t.target&&t.target.checkAndPreventDefault(n)}var i=e("./Interactable"),o=e("./Interaction"),s=e("./scope"),a=e("./utils/is"),l=e("./utils/events"),c=e("./utils/domUtils"),p=c.nodeContains,u=c.matchesSelector;i.prototype.preventDefault=function(e){return/^(always|never|auto)$/.test(e)?(this.options.preventDefault=e,this):a.bool(e)?(this.options.preventDefault=e?"always":"never",this):this.options.preventDefault},i.prototype.checkAndPreventDefault=function(e){var t=this.options.preventDefault;if("never"!==t)return"always"===t?void e.preventDefault():void(l.supportsOptions||/^(mouse|pointer|touch)*(down|start)/i.test(e.type)||a.element(e.target)&&u(e.target,"input,select,textarea,[contenteditable=true],[contenteditable=true] *")||e.preventDefault())};for(var d=["down","move","up","cancel"],f=0;f=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i;if(o.element&&(o.element===e.target||p(o.element,e.target)))return void o.target.checkAndPreventDefault(e)}}},{"./Interactable":4,"./Interaction":5,"./scope":34,"./utils/domUtils":39,"./utils/events":40,"./utils/is":46}],23:[function(e,t,n){"use strict";function r(e){var t=e.target,n=a.search(e,e.type,t);n&&n.prevTap&&e.clientX===n.prevTap.clientX&&e.clientY===n.prevTap.clientY&&t===n.prevTap.target&&(n.downTargets[0]=t,n.downTimes[0]=(new Date).getTime(),l.fire({interaction:n,event:e,eventTarget:t,pointer:e,type:"tap"}))}var i=e("./scope"),o=e("./utils/events"),s=e("./utils/browser"),a=e("./utils/interactionFinder"),l=e("./pointerEvents/base"),c=e("./utils/window"),p=c.window,u=Object.prototype.toString;if(p.Array.isArray||(p.Array.isArray=function(e){return"[object Array]"===u.call(e)}),String.prototype.trim||(String.prototype.trim=function(){return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")}),s.isIE8){var d=function(e){for(var t=i.interactions,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var o;if(n){if(r>=t.length)break;o=t[r++]}else{if(r=t.next(),r.done)break;o=r.value}var s=o;s.interacting()&&s.target.checkAndPreventDefault(e)}},f=function(e,t){var n=e.doc,i=(e.win,0===t.indexOf("listen")?o.add:o.remove);i(n,"selectstart",d),l&&i(n,"dblclick",r)};i.signals.on("add-document",f),i.signals.on("remove-document",f)}t.exports=null},{"./pointerEvents/base":31,"./scope":34,"./utils/browser":37,"./utils/events":40,"./utils/interactionFinder":45,"./utils/window":52}],24:[function(e,t,n){"use strict";function r(e,t,n){return e&&e.enabled&&(t||!e.endOnly)&&(!n||e.endOnly)}var i=e("../InteractEvent"),o=e("../Interaction"),s=e("../utils/extend"),a={names:[],setOffsets:function(e){var t=e.interaction,n=e.pageCoords,r=t.target,i=t.element,o=t.startOffset,s=r.getRect(i);s?(o.left=n.x-s.left,o.top=n.y-s.top,o.right=s.right-n.x,o.bottom=s.bottom-n.y,"width"in s||(s.width=s.right-s.left),"height"in s||(s.height=s.bottom-s.top)):o.left=o.top=o.right=o.bottom=0,e.rect=s,e.interactable=r,e.element=i;for(var l=0;l=p.length)break;f=p[d++]}else{if(d=p.next(),d.done)break;f=d.value}var v=f,g=a[v],h=t.target.options[t.prepared.name][v];r(h,i,o)&&(e.status=e.status=n[v],e.options=h,e.offset=e.interaction.modifierOffsets[v],g.set(e),e.status.locked&&(l.x+=e.status.dx,l.y+=e.status.dy,c.dx+=e.status.dx,c.dy+=e.status.dy,c.locked=!0))}return c.shouldMove=!e.status||!c.locked||e.status.changed,c},resetStatuses:function(e){for(var t=a.names,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var i;if(n){if(r>=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i,s=e[o]||{};s.dx=s.dy=0,s.modifiedX=s.modifiedY=NaN,s.locked=!1,s.changed=!0,e[o]=s}return e},start:function(e,t){var n=e.interaction,r={interaction:n,pageCoords:("action-resume"===t?n.curCoords:n.startCoords).page,startOffset:n.startOffset,statuses:n.modifierStatuses,preEnd:!1,requireEndOnly:!1};a.setOffsets(r),a.resetStatuses(r.statuses),r.pageCoords=s({},n.startCoords.page),n.modifierResult=a.setAll(r)}};o.signals.on("new",function(e){e.startOffset={left:0,right:0,top:0,bottom:0},e.modifierOffsets={},e.modifierStatuses=a.resetStatuses({}),e.modifierResult=null}),o.signals.on("action-start",a.start),o.signals.on("action-resume",a.start),o.signals.on("before-action-move",function(e){var t=e.interaction,n=e.preEnd,r=e.interactingBeforeMove,i=a.setAll({interaction:t,preEnd:n,pageCoords:t.curCoords.page,statuses:t.modifierStatuses,requireEndOnly:!1});!i.shouldMove&&r&&(t._dontFireMove=!0),t.modifierResult=i}),o.signals.on("action-end",function(e){for(var t=e.interaction,n=e.event,i=0;i=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}var m=h,y=m.x,x=m.y;l.push({x:s.left-i.width*y+u.x,y:s.top-i.height*x+u.y})}else l.push(u);return l},set:function(e){var t=e.interaction,n=e.pageCoords,r=e.status,i=e.options,s=e.offset,a=[],l=void 0,c=void 0,p=void 0;if(r.useStatusXY)c={x:r.x,y:r.y};else{var u=o.getOriginXY(t.target,t.element,t.prepared.name);c=o.extend({},n),c.x-=u.x,c.y-=u.y}r.realX=c.x,r.realY=c.y;for(var d=i.targets?i.targets.length:0,f=s,v=Array.isArray(f),g=0,f=v?f:f[Symbol.iterator]();;){var h;if(v){if(g>=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}for(var m=h,y=m.x,x=m.y,b=c.x-y,w=c.y-x,E=i.targets,S=Array.isArray(E),T=0,E=S?E:E[Symbol.iterator]();;){var C;if(S){if(T>=E.length)break;C=E[T++]}else{if(T=E.next(),T.done)break;C=T.value}var A=C;l=o.is.function(A)?A(b,w,t):A,l&&a.push({x:o.is.number(l.x)?l.x+y:b,y:o.is.number(l.y)?l.y+x:w,range:o.is.number(l.range)?l.range:i.range})}}var D={target:null,inRange:!1,distance:0,range:0,dx:0,dy:0};for(p=0,d=a.length;p=p.length)break;f=p[d++]}else{if(d=p.next(),d.done)break;f=d.value}var v=f,g=void 0;g=a.is.function(v)?v(l,c,t):v,g&&("width"in g&&"height"in g&&(g.x=g.width,g.y=g.height),e.options.targets.push(g))}i.set(e)},modifyCoords:function(e){var t=e.options;e.options=a.extend({},t), -e.options.enabled=t.enabled,e.options.relativePoints=[null],i.modifyCoords(e)}};r.snapSize=l,r.names.push("snapSize"),o.perAction.snapSize=l.defaults,s.defaults.snapSize=l.defaults,t.exports=l},{"../actions/resize":10,"../defaultOptions":18,"../utils/":44,"./index":24,"./snap":28}],30:[function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=e("../utils/pointerUtils");t.exports=function(){function e(t,n,o,s,a){if(r(this,e),i.pointerExtend(this,o),o!==n&&i.pointerExtend(this,n),this.interaction=a,this.timeStamp=(new Date).getTime(),this.originalEvent=o,this.type=t,this.pointerId=i.getPointerId(n),this.pointerType=i.getPointerType(n,a),this.target=s,this.currentTarget=null,"tap"===t){var l=a.getPointerIndex(n);this.dt=this.timeStamp-a.downTimes[l];var c=this.timeStamp-a.tapTime;this.double=!!(a.prevTap&&"doubletap"!==a.prevTap.type&&a.prevTap.target===this.target&&c<500)}else"doubletap"===t&&(this.dt=n.timeStamp-a.tapTime)}return e.prototype.subtractOrigin=function(e){var t=e.x,n=e.y;return this.pageX-=t,this.pageY-=n,this.clientX-=t,this.clientY-=n,this},e.prototype.addOrigin=function(e){var t=e.x,n=e.y;return this.pageX+=t,this.pageY+=n,this.clientX+=t,this.clientY+=n,this},e.prototype.preventDefault=function(){this.originalEvent.preventDefault()},e.prototype.stopPropagation=function(){this.propagationStopped=!0},e.prototype.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},e}()},{"../utils/pointerUtils":49}],31:[function(e,t,n){"use strict";function r(e){for(var t=e.interaction,n=e.pointer,s=e.event,l=e.eventTarget,c=e.type,u=void 0===c?e.pointerEvent.type:c,d=e.targets,f=void 0===d?i(e):d,v=e.pointerEvent,g=void 0===v?new o(u,n,s,l,t):v,h={interaction:t,pointer:n,event:s,eventTarget:l,targets:f,type:u,pointerEvent:g},m=0;m=u.length)break;g=u[v++]}else{if(v=u.next(),v.done)break;g=v.value}var h=g;c.element=h,p.fire("collect-targets",c)}return"hold"===o&&(c.targets=d(c.targets,function(e){return e.eventable.options.holdDuration===t.holdTimers[s].duration})),c.targets}var o=e("./PointerEvent"),s=e("../Interaction"),a=e("../utils"),l=e("../utils/browser"),c=e("../defaultOptions"),p=e("../utils/Signals").new(),u=e("../utils/arr"),d=u.filter,f=["down","up","cancel"],v=["down","up","cancel"],g={PointerEvent:o,fire:r,collectEventTargets:i,signals:p,defaults:{holdDuration:600,ignoreFrom:null,allowFrom:null,origin:{x:0,y:0}},types:["down","move","up","cancel","tap","doubletap","hold"]};s.signals.on("update-pointer-down",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers[n]={duration:1/0,timeout:null}}),s.signals.on("remove-pointer",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers.splice(n,1)}),s.signals.on("move",function(e){var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,s=e.duplicateMove,a=t.getPointerIndex(n);s||t.pointerIsDown&&!t.pointerWasMoved||(t.pointerIsDown&&clearTimeout(t.holdTimers[a].timeout),r({interaction:t,pointer:n,event:i,eventTarget:o,type:"move"}))}),s.signals.on("down",function(e){for(var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,s=e.pointerIndex,c=l.isIE8?a.extend({},i):i,u=t.holdTimers[s],d=a.getPath(o),f={interaction:t,pointer:n,event:i,eventTarget:o,type:"hold",targets:[],path:d,element:null},v=d,g=Array.isArray(v),h=0,v=g?v:v[Symbol.iterator]();;){var m;if(g){if(h>=v.length)break;m=v[h++]}else{if(h=v.next(),h.done)break;m=h.value}var y=m;f.element=y,p.fire("collect-targets",f)}if(f.targets.length){for(var x=1/0,b=0;b=0&&(p.selectors[u]!==e||p.contexts[u]!==t);u--);-1===u&&(u=p.selectors.length,p.selectors.push(e),p.contexts.push(t),p.listeners.push([])),p.listeners[u].push([i,!!s.capture,s.passive])}function s(e,t,n,r,o){var s=f(o),c=O[n],p=!1,u=void 0;if(c)for(u=c.selectors.length-1;u>=0;u--)if(c.selectors[u]===e&&c.contexts[u]===t){for(var d=c.listeners[u],v=d.length-1;v>=0;v--){var g=d[v],h=g[0],m=g[1],y=g[2];if(h===r&&m===!!s.capture&&y===s.passive){d.splice(v,1),d.length||(c.selectors.splice(u,1),c.contexts.splice(u,1),c.listeners.splice(u,1),i(t,n,a),i(t,n,l,!0),c.selectors.length||(O[n]=null)),p=!0;break}}if(p)break}}function a(e,t){var n=f(t),r={},i=O[e.type],o=g.getActualElement(e.path?e.path[0]:e.target),s=o;for(h(r,e),r.originalEvent=e,r.preventDefault=p;v.element(s);){for(var a=0;a=l.length)break;u=l[p++]}else{if(p=l.next(),p.done)break;u=p.value}var d=u,f=s[d](a);if(f)return f}},simulationResume:function(e){var t=e.mouseEvent,n=e.eventType,o=e.eventTarget;if(!/down|start/i.test(n))return null;for(var s=r.interactions,a=Array.isArray(s),l=0,s=a?s:s[Symbol.iterator]();;){var c;if(a){if(l>=s.length)break;c=s[l++]}else{if(l=s.next(),l.done)break;c=l.value}var p=c,u=o;if(p.simulation&&p.simulation.allowResume&&p.mouse===t)for(;u;){if(u===p.element)return p;u=i.parentNode(u)}}return null},mouse:function(e){var t=e.pointerId,n=e.mouseEvent,s=e.eventType;if(!n&&(o.supportsTouch||o.supportsPointerEvent))return null;for(var a=void 0,l=r.interactions,c=Array.isArray(l),p=0,l=c?l:l[Symbol.iterator]();;){var u;if(c){if(p>=l.length)break;u=l[p++]}else{if(p=l.next(),p.done)break;u=p.value}var d=u;if(d.mouse){if(d.simulation&&!i.contains(d.pointerIds,t))continue;if(d.interacting())return d;a||(a=d)}}if(a)return a;for(var f=r.interactions,v=Array.isArray(f),g=0,f=v?f:f[Symbol.iterator]();;){var h;if(v){if(g>=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}var m=h;if(m.mouse&&(!/down/.test(s)||!m.simulation))return m}return null},hasPointer:function(e){for(var t=e.pointerId,n=r.interactions,o=Array.isArray(n),s=0,n=o?n:n[Symbol.iterator]();;){var a;if(o){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var l=a;if(i.contains(l.pointerIds,t))return l}},idle:function(e){for(var t=e.mouseEvent,n=r.interactions,i=Array.isArray(n),o=0,n=i?n:n[Symbol.iterator]();;){var s;if(i){if(o>=n.length)break;s=n[o++]}else{if(o=n.next(),o.done)break;s=o.value}var a=s;if(1===a.pointerIds.length){var l=a.target;if(l&&!l.options.gesture.enabled)continue}else if(a.pointerIds.length>=2)continue;if(!a.interacting()&&t===a.mouse)return a}return null}};t.exports=s},{"../scope":34,"./browser":37,"./index":44}],46:[function(e,t,n){"use strict";var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},i=e("./window"),o=e("./isWindow"),s={array:function(){},window:function(e){return e===i.window||o(e)},docFrag:function(e){return s.object(e)&&11===e.nodeType},object:function(e){return!!e&&"object"===(void 0===e?"undefined":r(e))},function:function(e){return"function"==typeof e},number:function(e){return"number"==typeof e},bool:function(e){return"boolean"==typeof e},string:function(e){return"string"==typeof e},element:function(e){if(!e||"object"!==(void 0===e?"undefined":r(e)))return!1;var t=i.getWindow(e)||i.window;return/object|function/.test(r(t.Element))?e instanceof t.Element:1===e.nodeType&&"string"==typeof e.nodeName}};s.array=function(e){return s.object(e)&&void 0!==e.length&&s.function(e.splice)},t.exports=s},{"./isWindow":47,"./window":52}],47:[function(e,t,n){"use strict";t.exports=function(e){return!(!e||!e.Window)&&e instanceof e.Window}},{}],48:[function(e,t,n){"use strict";function r(e,n){for(var r in n){var i=t.exports.prefixedPropREs,o=!1;for(var s in i)if(0===r.indexOf(s)&&i[s].test(r)){o=!0;break}o||"function"==typeof n[r]||(e[r]=n[r])}return e}r.prefixedPropREs={webkit:/(Movement[XY]|Radius[XY]|RotationAngle|Force)$/},t.exports=r},{}],49:[function(e,t,n){"use strict";var r=e("./hypot"),i=e("./browser"),o=e("./domObjects"),s=e("./domUtils"),a=e("./is"),l=e("./pointerExtend"),c={copyCoords:function(e,t){e.page=e.page||{},e.page.x=t.page.x,e.page.y=t.page.y,e.client=e.client||{},e.client.x=t.client.x,e.client.y=t.client.y,e.timeStamp=t.timeStamp},setCoordDeltas:function(e,t,n){e.page.x=n.page.x-t.page.x,e.page.y=n.page.y-t.page.y,e.client.x=n.client.x-t.client.x,e.client.y=n.client.y-t.client.y,e.timeStamp=n.timeStamp-t.timeStamp;var i=Math.max(e.timeStamp/1e3,.001);e.page.speed=r(e.page.x,e.page.y)/i,e.page.vx=e.page.x/i,e.page.vy=e.page.y/i,e.client.speed=r(e.client.x,e.page.y)/i,e.client.vx=e.client.x/i,e.client.vy=e.client.y/i},isNativePointer:function(e){return e instanceof o.Event||e instanceof o.Touch},getXY:function(e,t,n){return n=n||{},e=e||"page",n.x=t[e+"X"],n.y=t[e+"Y"],n},getPageXY:function(e,t){return t=t||{},i.isOperaMobile&&c.isNativePointer(e)?(c.getXY("screen",e,t),t.x+=window.scrollX,t.y+=window.scrollY):c.getXY("page",e,t),t},getClientXY:function(e,t){return t=t||{},i.isOperaMobile&&c.isNativePointer(e)?c.getXY("screen",e,t):c.getXY("client",e,t),t},getPointerId:function(e){return a.number(e.pointerId)?e.pointerId:e.identifier},setCoords:function(e,t,n){var r=t.length>1?c.pointerAverage(t):t[0],i={};c.getPageXY(r,i),e.page.x=i.x,e.page.y=i.y,c.getClientXY(r,i),e.client.x=i.x,e.client.y=i.y,e.timeStamp=a.number(n)?n:(new Date).getTime()},pointerExtend:l,getTouchPair:function(e){var t=[];return a.array(e)?(t[0]=e[0],t[1]=e[1]):"touchend"===e.type?1===e.touches.length?(t[0]=e.touches[0],t[1]=e.changedTouches[0]):0===e.touches.length&&(t[0]=e.changedTouches[0],t[1]=e.changedTouches[1]):(t[0]=e.touches[0],t[1]=e.touches[1]),t},pointerAverage:function(e){for(var t={pageX:0,pageY:0,clientX:0,clientY:0,screenX:0,screenY:0},n=e,r=Array.isArray(n),i=0,n=r?n:n[Symbol.iterator]();;){var o;if(r){if(i>=n.length)break;o=n[i++]}else{if(i=n.next(),i.done)break;o=i.value}var s=o;for(var a in t)t[a]+=s[a]}for(var l in t)t[l]/=e.length;return t},touchBBox:function(e){if(e.length||e.touches&&e.touches.length>1){var t=c.getTouchPair(e),n=Math.min(t[0].pageX,t[1].pageX),r=Math.min(t[0].pageY,t[1].pageY);return{x:n,y:r,left:n,top:r,width:Math.max(t[0].pageX,t[1].pageX)-n,height:Math.max(t[0].pageY,t[1].pageY)-r}}},touchDistance:function(e,t){var n=t+"X",i=t+"Y",o=c.getTouchPair(e),s=o[0][n]-o[1][n],a=o[0][i]-o[1][i];return r(s,a)},touchAngle:function(e,t,n){var r=n+"X",i=n+"Y",o=c.getTouchPair(e),s=o[1][r]-o[0][r],a=o[1][i]-o[0][i];return 180*Math.atan2(a,s)/Math.PI},getPointerType:function(e,t){return t.mouse?"mouse":i.supportsPointerEvent?a.string(e.pointerType)?e.pointerType:[void 0,void 0,"touch","pen","mouse"][e.pointerType]:"touch"},getEventTargets:function(e){return[s.getActualElement(e.path?e.path[0]:e.target),s.getActualElement(e.currentTarget)]}};t.exports=c},{"./browser":37,"./domObjects":38,"./domUtils":39,"./hypot":43,"./is":46,"./pointerExtend":48}],50:[function(e,t,n){"use strict";for(var r=e("./window"),i=r.window,o=["ms","moz","webkit","o"],s=0,a=void 0,l=void 0,c=0;c6&&void 0!==arguments[6]&&arguments[6];r(this,e);var f=t.target,v=(f&&f.options||s).deltaSource,g=o(f,p,l),h="start"===c,m="end"===c,y=h?t.startCoords:t.curCoords,x=t.prevEvent;p=p||t.element;var b=i({},y.page),w=i({},y.client);b.x-=g.x,b.y-=g.y,w.x-=g.x,w.y-=g.y,this.ctrlKey=n.ctrlKey,this.altKey=n.altKey,this.shiftKey=n.shiftKey,this.metaKey=n.metaKey,this.button=n.button,this.buttons=n.buttons,this.target=p,this.currentTarget=p,this.relatedTarget=u||null,this.preEnd=d,this.type=l+(c||""),this.interaction=t,this.interactable=f,this.t0=h?t.downTimes[t.downTimes.length-1]:x.t0;var E={interaction:t,event:n,action:l,phase:c,element:p,related:u,page:b,client:w,coords:y,starting:h,ending:m,deltaSource:v,iEvent:this};a.fire("set-xy",E),m?(this.pageX=x.pageX,this.pageY=x.pageY,this.clientX=x.clientX,this.clientY=x.clientY):(this.pageX=b.x,this.pageY=b.y,this.clientX=w.x,this.clientY=w.y),this.x0=t.startCoords.page.x-g.x,this.y0=t.startCoords.page.y-g.y,this.clientX0=t.startCoords.client.x-g.x,this.clientY0=t.startCoords.client.y-g.y,a.fire("set-delta",E),this.timeStamp=y.timeStamp,this.dt=t.pointerDelta.timeStamp,this.duration=this.timeStamp-this.t0,this.speed=t.pointerDelta[v].speed,this.velocityX=t.pointerDelta[v].vx,this.velocityY=t.pointerDelta[v].vy,this.swipe=m||"inertiastart"===c?this.getSwipe():null,a.fire("new",E)}return e.prototype.getSwipe=function(){var e=this.interaction;if(e.prevEvent.speed<600||this.timeStamp-e.prevEvent.timeStamp>150)return null;var t=180*Math.atan2(e.prevEvent.velocityY,e.prevEvent.velocityX)/Math.PI;t<0&&(t+=360);var n=112.5<=t&&t<247.5,r=202.5<=t&&t<337.5,i=!n&&(292.5<=t||t<67.5);return{up:r,down:!r&&22.5<=t&&t<157.5,left:n,right:i,angle:t,speed:e.prevEvent.speed,velocity:{x:e.prevEvent.velocityX,y:e.prevEvent.velocityY}}},e.prototype.preventDefault=function(){},e.prototype.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},e.prototype.stopPropagation=function(){this.propagationStopped=!0},e}();a.on("set-delta",function(e){var t=e.iEvent,n=e.interaction,r=e.starting,i=e.deltaSource,o=r?t:n.prevEvent;"client"===i?(t.dx=t.clientX-o.clientX,t.dy=t.clientY-o.clientY):(t.dx=t.pageX-o.pageX,t.dy=t.pageY-o.pageY)}),l.signals=a,t.exports=l},{"./defaultOptions":18,"./utils/Signals":35,"./utils/extend":41,"./utils/getOriginXY":42}],4:[function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=e("./utils/is"),o=e("./utils/events"),s=e("./utils/extend"),a=e("./actions/base"),l=e("./scope"),c=e("./Eventable"),p=e("./defaultOptions"),u=e("./utils/Signals").new(),d=e("./utils/domUtils"),f=d.getElementRect,v=d.nodeContains,g=d.trySelector,h=e("./utils/window"),m=h.getWindow,y=e("./utils/arr"),x=y.indexOf,b=y.contains,w=e("./utils/browser"),E=w.wheelEvent;l.interactables=[];var S=function(){function e(t,n){r(this,e),n=n||{},this.target=t,this.events=new c,this._context=n.context||l.document,this._win=m(g(t)?this._context:t),this._doc=this._win.document,u.fire("new",{target:t,options:n,interactable:this,win:this._win}),l.addDocument(this._doc,this._win),l.interactables.push(this),this.set(n)}return e.prototype.setOnEvents=function(e,t){var n="on"+e;return i.function(t.onstart)&&(this.events[n+"start"]=t.onstart),i.function(t.onmove)&&(this.events[n+"move"]=t.onmove),i.function(t.onend)&&(this.events[n+"end"]=t.onend),i.function(t.oninertiastart)&&(this.events[n+"inertiastart"]=t.oninertiastart),this},e.prototype.setPerAction=function(e,t){for(var n in t)n in p[e]&&(i.object(t[n])?(this.options[e][n]=s(this.options[e][n]||{},t[n]),i.object(p.perAction[n])&&"enabled"in p.perAction[n]&&(this.options[e][n].enabled=!1!==t[n].enabled)):i.bool(t[n])&&i.object(p.perAction[n])?this.options[e][n].enabled=t[n]:void 0!==t[n]&&(this.options[e][n]=t[n]))},e.prototype.getRect=function(e){return e=e||this.target,i.string(this.target)&&!i.element(e)&&(e=this._context.querySelector(this.target)),f(e)},e.prototype.rectChecker=function(e){return i.function(e)?(this.getRect=e,this):null===e?(delete this.options.getRect,this):this.getRect},e.prototype._backCompatOption=function(e,t){if(g(t)||i.object(t)){this.options[e]=t;for(var n=a.names,r=Array.isArray(n),o=0,n=r?n:n[Symbol.iterator]();;){var s;if(r){if(o>=n.length)break;s=n[o++]}else{if(o=n.next(),o.done)break;s=o.value}var l=s;this.options[l][e]=t}return this}return this.options[e]},e.prototype.origin=function(e){return this._backCompatOption("origin",e)},e.prototype.deltaSource=function(e){return"page"===e||"client"===e?(this.options.deltaSource=e,this):this.options.deltaSource},e.prototype.context=function(){return this._context},e.prototype.inContext=function(e){return this._context===e.ownerDocument||v(this._context,e)},e.prototype.fire=function(e){return this.events.fire(e),this},e.prototype._onOffMultiple=function(e,t,n,r){if(i.string(t)&&-1!==t.search(" ")&&(t=t.trim().split(/ +/)),i.array(t)){for(var o=0;o=l.length)break;f=l[d++]}else{if(d=l.next(),d.done)break;f=d.value}var v=f;this.options[v]=p.base[v],v in t&&this[v](t[v])}return u.fire("set",{options:t,interactable:this}),this},e.prototype.unset=function(){if(o.remove(this.target,"all"),i.string(this.target))for(var e in o.delegatedEvents){var t=o.delegatedEvents[e];t.selectors[0]===this.target&&t.contexts[0]===this._context&&(t.selectors.splice(0,1),t.contexts.splice(0,1),t.listeners.splice(0,1),t.selectors.length||(t[e]=null)),o.remove(this._context,e,o.delegateListener),o.remove(this._context,e,o.delegateUseCapture,!0)}else o.remove(this,"all");u.fire("unset",{interactable:this}),l.interactables.splice(x(l.interactables,this),1);for(var n=l.interactions||[],r=Array.isArray(n),s=0,n=r?n:n[Symbol.iterator]();;){var a;if(r){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var c=a;c.target===this&&c.interacting()&&c.stop()}return l.interact},e}();l.interactables.indexOfElement=function(e,t){t=t||l.document;for(var n=0;n=x.length)break;E=x[w++]}else{if(w=x.next(),w.done)break;E=w.value}var S=E,T=S[0],C=S[1];C._updateEventTargets(i,o),C[e](T,t,i,o)}}}function o(e){for(var t=0;te.pointerMoveTolerance);var a={pointer:t,pointerIndex:this.getPointerIndex(t),event:n,eventTarget:r,dx:o,dy:s,duplicate:i,interaction:this,interactingBeforeMove:this.interacting()};i||l.setCoordDeltas(this.pointerDelta,this.prevCoords,this.curCoords),f.fire("move",a),i||(this.interacting()&&this.doMove(a),this.pointerWasMoved&&l.copyCoords(this.prevCoords,this.curCoords))},e.prototype.doMove=function(e){e=l.extend({pointer:this.pointers[0],event:this.prevEvent,eventTarget:this._eventTarget,interaction:this},e||{}),f.fire("before-action-move",e),this._dontFireMove||f.fire("action-move",e),this._dontFireMove=!1},e.prototype.pointerUp=function(e,t,n,r){var i=this.getPointerIndex(e);f.fire(/cancel$/i.test(t.type)?"cancel":"up",{pointer:e,pointerIndex:i,event:t,eventTarget:n,curEventTarget:r,interaction:this}),this.simulation||this.end(t),this.pointerIsDown=!1,this.removePointer(e,t)},e.prototype.end=function(e){e=e||this.prevEvent,this.interacting()&&f.fire("action-end",{event:e,interaction:this}),this.stop()},e.prototype.currentAction=function(){return this._interacting?this.prepared.name:null},e.prototype.interacting=function(){return this._interacting},e.prototype.stop=function(){f.fire("stop",{interaction:this}),this._interacting&&(f.fire("stop-active",{interaction:this}),f.fire("stop-"+this.prepared.name,{interaction:this})),this.target=this.element=null,this._interacting=!1,this.prepared.name=this.prevEvent=null},e.prototype.getPointerIndex=function(e){return"mouse"===this.pointerType||"pen"===this.pointerType?0:l.indexOf(this.pointerIds,l.getPointerId(e))},e.prototype.updatePointer=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:t&&/(down|start)$/i.test(t.type),r=l.getPointerId(e),i=this.getPointerIndex(e);return-1===i&&(i=this.pointerIds.length,this.pointerIds[i]=r),n&&f.fire("update-pointer-down",{pointer:e,event:t,down:n,pointerId:r,pointerIndex:i,interaction:this}),this.pointers[i]=e,i},e.prototype.removePointer=function(e,t){var n=this.getPointerIndex(e);-1!==n&&(f.fire("remove-pointer",{pointer:e,event:t,pointerIndex:n,interaction:this}),this.pointers.splice(n,1),this.pointerIds.splice(n,1),this.downTargets.splice(n,1),this.downTimes.splice(n,1))},e.prototype._updateEventTargets=function(e,t){this._eventTarget=e,this._curEventTarget=t},e}(),y=0,x=g.length;y=i.length)break;a=i[s++]}else{if(s=i.next(),s.done)break;a=s.value}var l=a;if(l.options.drop.enabled){var c=l.options.drop.accept;if(!(p.is.element(c)&&c!==t||p.is.string(c)&&!p.matchesSelector(t,c)))for(var d=p.is.string(l.target)?l._context.querySelectorAll(l.target):[l.target],f=0;fo.left&&c.xo.top&&c.y=o.left&&v<=o.right&&g>=o.top&&g<=o.bottom}if(f&&p.is.number(a)){s=Math.max(0,Math.min(o.right,f.right)-Math.max(o.left,f.left))*Math.max(0,Math.min(o.bottom,f.bottom)-Math.max(o.top,f.top))/(f.width*f.height)>=a}return this.options.drop.checker&&(s=this.options.drop.checker(e,t,s,this,i,n,r)),s},v.signals.on("unset",function(e){e.interactable.dropzone(!1)}),v.settingsMethods.push("dropChecker"),g.signals.on("new",function(e){e.dropTarget=null,e.dropElement=null,e.prevDropTarget=null,e.prevDropElement=null,e.dropEvents=null,e.activeDrops={dropzones:[],elements:[],rects:[]}}),g.signals.on("stop",function(e){var t=e.interaction;t.dropTarget=t.dropElement=t.prevDropTarget=t.prevDropElement=null}),d.dynamicDrop=function(e){return p.is.bool(e)?(y=e,d):y},p.merge(v.eventTypes,["dragenter","dragleave","dropactivate","dropdeactivate","dropmove","drop"]),c.methodDict.drop="dropzone",h.drop=m.defaults,t.exports=m},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../interact":21,"../scope":34,"../utils":44,"./base":6}],9:[function(e,t,n){"use strict";var r=e("./base"),i=e("../utils"),o=e("../InteractEvent"),s=e("../Interactable"),a=e("../Interaction"),l=e("../defaultOptions"),c={defaults:{enabled:!1,origin:null,restrict:null},checker:function(e,t,n,r,i){return i.pointerIds.length>=2?{name:"gesture"}:null},getCursor:function(){return""}};o.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;"gesturestart"===t.type&&(t.ds=0,n.gesture.startDistance=n.gesture.prevDistance=t.distance,n.gesture.startAngle=n.gesture.prevAngle=t.angle,n.gesture.scale=1)}),o.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;"gesturemove"===t.type&&(t.ds=t.scale-n.gesture.scale,n.target.fire(t),n.gesture.prevAngle=t.angle,n.gesture.prevDistance=t.distance,t.scale===1/0||null===t.scale||void 0===t.scale||isNaN(t.scale)||(n.gesture.scale=t.scale))}),s.prototype.gesturable=function(e){return i.is.object(e)?(this.options.gesture.enabled=!1!==e.enabled,this.setPerAction("gesture",e),this.setOnEvents("gesture",e),this):i.is.bool(e)?(this.options.gesture.enabled=e,e||(this.ongesturestart=this.ongesturestart=this.ongestureend=null),this):this.options.gesture},o.signals.on("set-delta",function(e){var t=e.interaction,n=e.iEvent,r=e.action,s=e.event,a=e.starting,l=e.ending,c=e.deltaSource;if("gesture"===r){var p=t.pointers;n.touches=[p[0],p[1]],a?(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=1,n.ds=0,n.angle=i.touchAngle(p,void 0,c),n.da=0):l||s instanceof o?(n.distance=t.prevEvent.distance,n.box=t.prevEvent.box,n.scale=t.prevEvent.scale,n.ds=n.scale-1,n.angle=t.prevEvent.angle,n.da=n.angle-t.gesture.startAngle):(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=n.distance/t.gesture.startDistance,n.angle=i.touchAngle(p,t.gesture.prevAngle,c),n.ds=n.scale-t.gesture.prevScale,n.da=n.angle-t.gesture.prevAngle)}}),a.signals.on("new",function(e){e.gesture={start:{x:0,y:0},startDistance:0,prevDistance:0,distance:0,scale:1,startAngle:0,prevAngle:0}}),r.gesture=c,r.names.push("gesture"),i.merge(s.eventTypes,["gesturestart","gesturemove","gestureend"]),r.methodDict.gesture="gesturable",l.gesture=c.defaults,t.exports=c},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"./base":6}],10:[function(e,t,n){"use strict";function r(e,t,n,r,i,s,a){if(!t)return!1;if(!0===t){var l=o.is.number(s.width)?s.width:s.right-s.left,c=o.is.number(s.height)?s.height:s.bottom-s.top;if(l<0&&("left"===e?e="right":"right"===e&&(e="left")),c<0&&("top"===e?e="bottom":"bottom"===e&&(e="top")),"left"===e)return n.x<(l>=0?s.left:s.right)+a;if("top"===e)return n.y<(c>=0?s.top:s.bottom)+a;if("right"===e)return n.x>(l>=0?s.right:s.left)-a;if("bottom"===e)return n.y>(c>=0?s.bottom:s.top)-a}return!!o.is.element(r)&&(o.is.element(t)?t===r:o.matchesUpTo(r,t,i))}var i=e("./base"),o=e("../utils"),s=e("../utils/browser"),a=e("../InteractEvent"),l=e("../Interactable"),c=e("../Interaction"),p=e("../defaultOptions"),u=s.supportsTouch||s.supportsPointerEvent?20:10,d={defaults:{enabled:!1,mouseButtons:null,origin:null,snap:null,restrict:null,inertia:null,autoScroll:null,square:!1,preserveAspectRatio:!1,axis:"xy",margin:NaN,edges:null,invert:"none"},checker:function(e,t,n,i,s,a){if(!a)return null;var l=o.extend({},s.curCoords.page),c=n.options;if(c.resize.enabled){var p=c.resize,d={left:!1,right:!1,top:!1,bottom:!1};if(o.is.object(p.edges)){for(var f in d)d[f]=r(f,p.edges[f],l,s._eventTarget,i,a,p.margin||u);if(d.left=d.left&&!d.right,d.top=d.top&&!d.bottom,d.left||d.right||d.top||d.bottom)return{name:"resize",edges:d}}else{var v="y"!==c.resize.axis&&l.x>a.right-u,g="x"!==c.resize.axis&&l.y>a.bottom-u;if(v||g)return{name:"resize",axes:(v?"x":"")+(g?"y":"")}}}return null},cursors:s.isIe9OrOlder?{x:"e-resize",y:"s-resize",xy:"se-resize",top:"n-resize",left:"w-resize",bottom:"s-resize",right:"e-resize",topleft:"se-resize",bottomright:"se-resize",topright:"ne-resize",bottomleft:"ne-resize"}:{x:"ew-resize",y:"ns-resize",xy:"nwse-resize",top:"ns-resize",left:"ew-resize",bottom:"ns-resize",right:"ew-resize",topleft:"nwse-resize",bottomright:"nwse-resize",topright:"nesw-resize",bottomleft:"nesw-resize"},getCursor:function(e){if(e.axis)return d.cursors[e.name+e.axis];if(e.edges){for(var t="",n=["top","bottom","left","right"],r=0;r<4;r++)e.edges[n[r]]&&(t+=n[r]);return d.cursors[t]}}};a.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;if("resizestart"===t.type&&n.prepared.edges){var r=n.target.getRect(n.element),i=n.target.options.resize;if(i.square||i.preserveAspectRatio){var s=o.extend({},n.prepared.edges);s.top=s.top||s.left&&!s.bottom,s.left=s.left||s.top&&!s.right,s.bottom=s.bottom||s.right&&!s.top,s.right=s.right||s.bottom&&!s.left,n.prepared._linkedEdges=s}else n.prepared._linkedEdges=null;i.preserveAspectRatio&&(n.resizeStartAspectRatio=r.width/r.height),n.resizeRects={start:r,current:o.extend({},r),inverted:o.extend({},r),previous:o.extend({},r),delta:{left:0,right:0,width:0,top:0,bottom:0,height:0}},t.rect=n.resizeRects.inverted,t.deltaRect=n.resizeRects.delta}}),a.signals.on("new",function(e){var t=e.iEvent,n=e.phase,r=e.interaction;if("move"===n&&r.prepared.edges){var i=r.target.options.resize,s=i.invert,a="reposition"===s||"negate"===s,l=r.prepared.edges,c=r.resizeRects.start,p=r.resizeRects.current,u=r.resizeRects.inverted,d=r.resizeRects.delta,f=o.extend(r.resizeRects.previous,u),v=l,g=t.dx,h=t.dy;if(i.preserveAspectRatio||i.square){var m=i.preserveAspectRatio?r.resizeStartAspectRatio:1;l=r.prepared._linkedEdges,v.left&&v.bottom||v.right&&v.top?h=-g/m:v.left||v.right?h=g/m:(v.top||v.bottom)&&(g=h*m)}if(l.top&&(p.top+=h),l.bottom&&(p.bottom+=h),l.left&&(p.left+=g),l.right&&(p.right+=g),a){if(o.extend(u,p),"reposition"===s){var y=void 0;u.top>u.bottom&&(y=u.top,u.top=u.bottom,u.bottom=y),u.left>u.right&&(y=u.left,u.left=u.right,u.right=y)}}else u.top=Math.min(p.top,c.bottom),u.bottom=Math.max(p.bottom,c.top),u.left=Math.min(p.left,c.right),u.right=Math.max(p.right,c.left);u.width=u.right-u.left,u.height=u.bottom-u.top;for(var x in u)d[x]=u[x]-f[x];t.edges=r.prepared.edges,t.rect=u,t.deltaRect=d}}),l.prototype.resizable=function(e){return o.is.object(e)?(this.options.resize.enabled=!1!==e.enabled,this.setPerAction("resize",e),this.setOnEvents("resize",e),/^x$|^y$|^xy$/.test(e.axis)?this.options.resize.axis=e.axis:null===e.axis&&(this.options.resize.axis=p.resize.axis),o.is.bool(e.preserveAspectRatio)?this.options.resize.preserveAspectRatio=e.preserveAspectRatio:o.is.bool(e.square)&&(this.options.resize.square=e.square),this):o.is.bool(e)?(this.options.resize.enabled=e, +e||(this.onresizestart=this.onresizestart=this.onresizeend=null),this):this.options.resize},c.signals.on("new",function(e){e.resizeAxes="xy"}),a.signals.on("set-delta",function(e){var t=e.interaction,n=e.iEvent;"resize"===e.action&&t.resizeAxes&&(t.target.options.resize.square?("y"===t.resizeAxes?n.dx=n.dy:n.dy=n.dx,n.axes="xy"):(n.axes=t.resizeAxes,"x"===t.resizeAxes?n.dy=0:"y"===t.resizeAxes&&(n.dx=0)))}),i.resize=d,i.names.push("resize"),o.merge(l.eventTypes,["resizestart","resizemove","resizeinertiastart","resizeinertiaresume","resizeend"]),i.methodDict.resize="resizable",p.resize=d.defaults,t.exports=d},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"../utils/browser":37,"./base":6}],11:[function(e,t,n){"use strict";var r=e("./utils/raf"),i=e("./utils/window").getWindow,o=e("./utils/is"),s=e("./utils/domUtils"),a=e("./Interaction"),l=e("./defaultOptions"),c={defaults:{enabled:!1,container:null,margin:60,speed:300},interaction:null,i:null,x:0,y:0,isScrolling:!1,prevTime:0,start:function(e){c.isScrolling=!0,r.cancel(c.i),c.interaction=e,c.prevTime=(new Date).getTime(),c.i=r.request(c.scroll)},stop:function(){c.isScrolling=!1,r.cancel(c.i)},scroll:function(){var e=c.interaction.target.options[c.interaction.prepared.name].autoScroll,t=e.container||i(c.interaction.element),n=(new Date).getTime(),s=(n-c.prevTime)/1e3,a=e.speed*s;a>=1&&(o.window(t)?t.scrollBy(c.x*a,c.y*a):t&&(t.scrollLeft+=c.x*a,t.scrollTop+=c.y*a),c.prevTime=n),c.isScrolling&&(r.cancel(c.i),c.i=r.request(c.scroll))},check:function(e,t){var n=e.options;return n[t].autoScroll&&n[t].autoScroll.enabled},onInteractionMove:function(e){var t=e.interaction,n=e.pointer;if(t.interacting()&&c.check(t.target,t.prepared.name)){if(t.simulation)return void(c.x=c.y=0);var r=void 0,a=void 0,l=void 0,p=void 0,u=t.target.options[t.prepared.name].autoScroll,d=u.container||i(t.element);if(o.window(d))p=n.clientXd.innerWidth-c.margin,l=n.clientY>d.innerHeight-c.margin;else{var f=s.getElementClientRect(d);p=n.clientXf.right-c.margin,l=n.clientY>f.bottom-c.margin}c.x=a?1:p?-1:0,c.y=l?1:r?-1:0,c.isScrolling||(c.margin=u.margin,c.speed=u.speed,c.start(t))}}};a.signals.on("stop-active",function(){c.stop()}),a.signals.on("action-move",c.onInteractionMove),l.perAction.autoScroll=c.defaults,t.exports=c},{"./Interaction":5,"./defaultOptions":18,"./utils/domUtils":39,"./utils/is":46,"./utils/raf":50,"./utils/window":52}],12:[function(e,t,n){"use strict";var r=e("../Interactable"),i=e("../actions/base"),o=e("../utils/is"),s=e("../utils/domUtils");r.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},r.prototype.ignoreFrom=function(e){return this._backCompatOption("ignoreFrom",e)},r.prototype.allowFrom=function(e){return this._backCompatOption("allowFrom",e)},r.prototype.testIgnore=function(e,t,n){return!(!e||!o.element(n))&&(o.string(e)?s.matchesUpTo(n,e,t):!!o.element(e)&&s.nodeContains(e,n))},r.prototype.testAllow=function(e,t,n){return!e||!!o.element(n)&&(o.string(e)?s.matchesUpTo(n,e,t):!!o.element(e)&&s.nodeContains(e,n))},r.prototype.testIgnoreAllow=function(e,t,n){return!this.testIgnore(e.ignoreFrom,t,n)&&this.testAllow(e.allowFrom,t,n)},r.prototype.actionChecker=function(e){return o.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},r.prototype.styleCursor=function(e){return o.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},r.prototype.defaultActionChecker=function(e,t,n,r){for(var o=this.getRect(r),s=null,a=i.names,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var u=p;if((!n.pointerIsDown||!n.mouse||0!=(t.buttons&this.options[u].mouseButtons))&&(s=i[u].checker(e,t,this,r,n,o)))return s}}},{"../Interactable":4,"../actions/base":6,"../utils/domUtils":39,"../utils/is":46}],13:[function(e,t,n){"use strict";function r(e,t,n,r){return g.is.object(e)&&t.testIgnoreAllow(t.options[e.name],n,r)&&t.options[e.name].enabled&&a(t,n,e)?e:null}function i(e,t,n,i,o,s){for(var a=0,l=i.length;a=m.maxInteractions)return!1;if(u.target===e){if((a+=d===n.name|0)>=i)return!1;if(u.element===t&&(l++,d!==n.name||l>=o))return!1}}}return m.maxInteractions>0}}var l=e("../interact"),c=e("../Interactable"),p=e("../Interaction"),u=e("../actions/base"),d=e("../defaultOptions"),f=e("../utils/browser"),v=e("../scope"),g=e("../utils"),h=e("../utils/Signals").new();e("./InteractableMethods");var m={signals:h,withinInteractionLimit:a,maxInteractions:1/0,defaults:{perAction:{manualStart:!1,max:1/0,maxPerElement:1,allowFrom:null,ignoreFrom:null}},setActionDefaults:function(e){g.extend(e.defaults,m.defaults.perAction)}};p.signals.on("down",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;if(!t.interacting()){s(t,o(t,n,r,i))}}),p.signals.on("move",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;if(t.mouse&&!t.pointerIsDown&&!t.interacting()){s(t,o(t,n,r,i))}}),p.signals.on("move",function(e){var t=e.interaction,n=e.event;if(t.pointerIsDown&&!t.interacting()&&t.pointerWasMoved&&t.prepared.name){h.fire("before-start",e);var r=t.target;t.prepared.name&&r&&(r.options[t.prepared.name].manualStart||!a(r,t.element,t.prepared)?t.stop(n):t.start(t.prepared,r,t.element))}}),p.signals.on("stop",function(e){var t=e.interaction,n=t.target;n&&n.options.styleCursor&&(n._doc.documentElement.style.cursor="")}),c.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},c.prototype.actionChecker=function(e){return g.is.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},c.prototype.styleCursor=function(e){return g.is.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},c.prototype.defaultActionChecker=function(e,t,n,r){for(var i=this.getRect(r),o=t.buttons||{0:1,1:4,3:8,4:16}[t.button],s=null,a=u.names,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var d=p;if((!n.pointerIsDown||!n.mouse||0!=(o&this.options[d].mouseButtons))&&(s=u[d].checker(e,t,this,r,n,i)))return s}},l.maxInteractions=function(e){return g.is.number(e)?(m.maxInteractions=e,this):m.maxInteractions},c.settingsMethods.push("styleCursor"),c.settingsMethods.push("actionChecker"),c.settingsMethods.push("ignoreFrom"),c.settingsMethods.push("allowFrom"),d.base.actionChecker=null,d.base.styleCursor=!0,g.extend(d.perAction,m.defaults.perAction),t.exports=m},{"../Interactable":4,"../Interaction":5,"../actions/base":6,"../defaultOptions":18,"../interact":21,"../scope":34,"../utils":44,"../utils/Signals":35,"../utils/browser":37,"./InteractableMethods":12}],14:[function(e,t,n){"use strict";var r=e("./base"),i=e("../Interaction");i.signals.on("new",function(e){e.delayTimer=null}),r.signals.on("prepared",function(e){var t=e.interaction,n=t.prepared.name;if(n){var r=t.target.options[n].delay;r>0&&(t.delayTimer=setTimeout(function(){t.start(t.prepared,t.target,t.element)},r))}}),i.signals.on("move",function(e){var t=e.interaction,n=e.duplicate;t.pointerWasMoved&&!n&&clearTimeout(t.delayTimer)}),r.signals.on("before-start",function(e){var t=e.interaction,n=t.prepared.name;if(n){t.target.options[n].delay>0&&(t.prepared.name=null)}})},{"../Interaction":5,"./base":13}],15:[function(e,t,n){"use strict";function r(e,t){if(!t)return!1;var n=t.options.drag.startAxis;return"xy"===e||"xy"===n||n===e}var i=e("./base"),o=e("../scope"),s=e("../utils/browser"),a=e("../utils/is"),l=e("../utils/domUtils"),c=l.matchesSelector,p=l.parentNode;i.setActionDefaults(e("../actions/drag")),i.signals.on("before-start",function(e){var t=e.interaction,n=e.eventTarget,l=e.dx,u=e.dy;if("drag"===t.prepared.name){var d=Math.abs(l),f=Math.abs(u),v=t.target.options.drag,g=v.startAxis,h=d>f?"x":dl.minSpeed&&g>l.endSpeed,b={interaction:t,pageCoords:v,statuses:f,preEnd:!0,requireEndOnly:!0};y&&!x&&(c.resetStatuses(f),m=c.setAll(b),m.shouldMove&&m.locked&&(h=!0)),(x||h)&&(p.copyCoords(i.upCoords,t.curCoords),t.pointers[0]=i.startEvent=new a(t,n,t.prepared.name,"inertiastart",t.element),i.t0=d,i.active=!0,i.allowResume=l.allowResume,t.simulation=i,o.fire(i.startEvent),x?(i.vx0=t.pointerDelta.client.vx,i.vy0=t.pointerDelta.client.vy,i.v0=g,r(t,i),p.extend(v,t.curCoords.page),v.x+=i.xe,v.y+=i.ye,c.resetStatuses(f),m=c.setAll(b),i.modifiedXe+=m.dx,i.modifiedYe+=m.dy,i.i=u.request(t.boundInertiaFrame)):(i.smoothEnd=!0,i.xe=m.dx,i.ye=m.dy,i.sx=i.sy=0,i.i=u.request(t.boundSmoothEndFrame)))}}),l.signals.on("stop-active",function(e){var t=e.interaction,n=t.inertiaStatus;n.active&&(u.cancel(n.i),n.active=!1,t.simulation=null)})},{"./InteractEvent":3,"./Interaction":5,"./modifiers":24,"./utils":44,"./utils/raf":50}],21:[function(e,t,n){"use strict";function r(e,t){var n=a.interactables.get(e,t);return n||(n=new l(e,t),n.events.global=p),n}var i=e("./utils/browser"),o=e("./utils/events"),s=e("./utils"),a=e("./scope"),l=e("./Interactable"),c=e("./Interaction"),p={};r.isSet=function(e,t){return-1!==a.interactables.indexOfElement(e,t&&t.context)},r.on=function(e,t,n){if(s.is.string(e)&&-1!==e.search(" ")&&(e=e.trim().split(/ +/)),s.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.on(f,t,n)}return r}if(s.is.object(e)){for(var v in e)r.on(v,e[v],t);return r}return s.contains(l.eventTypes,e)?p[e]?p[e].push(t):p[e]=[t]:o.add(a.document,e,t,{options:n}),r},r.off=function(e,t,n){if(s.is.string(e)&&-1!==e.search(" ")&&(e=e.trim().split(/ +/)),s.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.off(f,t,n)}return r}if(s.is.object(e)){for(var v in e)r.off(v,e[v],t);return r}if(s.contains(l.eventTypes,e)){var g=void 0;e in p&&-1!==(g=s.indexOf(p[e],t))&&p[e].splice(g,1)}else o.remove(a.document,e,t,n);return r},r.debug=function(){return a},r.getPointerAverage=s.pointerAverage,r.getTouchBBox=s.touchBBox,r.getTouchDistance=s.touchDistance,r.getTouchAngle=s.touchAngle,r.getElementRect=s.getElementRect,r.getElementClientRect=s.getElementClientRect,r.matchesSelector=s.matchesSelector,r.closest=s.closest,r.supportsTouch=function(){return i.supportsTouch},r.supportsPointerEvent=function(){return i.supportsPointerEvent},r.stop=function(e){for(var t=a.interactions.length-1;t>=0;t--)a.interactions[t].stop(e);return r},r.pointerMoveTolerance=function(e){return s.is.number(e)?(c.pointerMoveTolerance=e,this):c.pointerMoveTolerance},r.addDocument=a.addDocument,r.removeDocument=a.removeDocument,a.interact=r,t.exports=r},{"./Interactable":4,"./Interaction":5,"./scope":34,"./utils":44,"./utils/browser":37,"./utils/events":40}],22:[function(e,t,n){"use strict";function r(e){var t=e.interaction,n=e.event;t.target&&t.target.checkAndPreventDefault(n)}var i=e("./Interactable"),o=e("./Interaction"),s=e("./scope"),a=e("./utils/is"),l=e("./utils/events"),c=e("./utils/domUtils"),p=c.nodeContains,u=c.matchesSelector;i.prototype.preventDefault=function(e){return/^(always|never|auto)$/.test(e)?(this.options.preventDefault=e,this):a.bool(e)?(this.options.preventDefault=e?"always":"never",this):this.options.preventDefault},i.prototype.checkAndPreventDefault=function(e){var t=this.options.preventDefault;if("never"!==t)return"always"===t?void e.preventDefault():void(l.supportsOptions||/^(mouse|pointer|touch)*(down|start)/i.test(e.type)||a.element(e.target)&&u(e.target,"input,select,textarea,[contenteditable=true],[contenteditable=true] *")||e.preventDefault())};for(var d=["down","move","up","cancel"],f=0;f=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i;if(o.element&&(o.element===e.target||p(o.element,e.target)))return void o.target.checkAndPreventDefault(e)}}},{"./Interactable":4,"./Interaction":5,"./scope":34,"./utils/domUtils":39,"./utils/events":40,"./utils/is":46}],23:[function(e,t,n){"use strict";function r(e){var t=e.target,n=a.search(e,e.type,t);n&&n.prevTap&&e.clientX===n.prevTap.clientX&&e.clientY===n.prevTap.clientY&&t===n.prevTap.target&&(n.downTargets[0]=t,n.downTimes[0]=(new Date).getTime(),l.fire({interaction:n,event:e,eventTarget:t,pointer:e,type:"tap"}))}var i=e("./scope"),o=e("./utils/events"),s=e("./utils/browser"),a=e("./utils/interactionFinder"),l=e("./pointerEvents/base"),c=e("./utils/window"),p=c.window,u=Object.prototype.toString;if(p.Array.isArray||(p.Array.isArray=function(e){return"[object Array]"===u.call(e)}),String.prototype.trim||(String.prototype.trim=function(){return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")}),s.isIE8){var d=function(e){for(var t=i.interactions,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var o;if(n){if(r>=t.length)break;o=t[r++]}else{if(r=t.next(),r.done)break;o=r.value}var s=o;s.interacting()&&s.target.checkAndPreventDefault(e)}},f=function(e,t){var n=e.doc,i=(e.win,0===t.indexOf("listen")?o.add:o.remove);i(n,"selectstart",d),l&&i(n,"dblclick",r)};i.signals.on("add-document",f),i.signals.on("remove-document",f)}t.exports=null},{"./pointerEvents/base":31,"./scope":34,"./utils/browser":37,"./utils/events":40,"./utils/interactionFinder":45,"./utils/window":52}],24:[function(e,t,n){"use strict";function r(e,t,n){return e&&e.enabled&&(t||!e.endOnly)&&(!n||e.endOnly)}var i=e("../InteractEvent"),o=e("../Interaction"),s=e("../utils/extend"),a={names:[],setOffsets:function(e){var t=e.interaction,n=e.pageCoords,r=t.target,i=t.element,o=t.startOffset,s=r.getRect(i);s?(o.left=n.x-s.left,o.top=n.y-s.top,o.right=s.right-n.x,o.bottom=s.bottom-n.y,"width"in s||(s.width=s.right-s.left),"height"in s||(s.height=s.bottom-s.top)):o.left=o.top=o.right=o.bottom=0,e.rect=s,e.interactable=r,e.element=i;for(var l=0;l=p.length)break;f=p[d++]}else{if(d=p.next(),d.done)break;f=d.value}var v=f,g=a[v],h=t.target.options[t.prepared.name][v];r(h,i,o)&&(e.status=e.status=n[v],e.options=h,e.offset=e.interaction.modifierOffsets[v],g.set(e),e.status.locked&&(l.x+=e.status.dx,l.y+=e.status.dy,c.dx+=e.status.dx,c.dy+=e.status.dy,c.locked=!0))}return c.shouldMove=!e.status||!c.locked||e.status.changed,c},resetStatuses:function(e){for(var t=a.names,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var i;if(n){if(r>=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i,s=e[o]||{};s.dx=s.dy=0,s.modifiedX=s.modifiedY=NaN,s.locked=!1,s.changed=!0,e[o]=s}return e},start:function(e,t){var n=e.interaction,r={interaction:n,pageCoords:("action-resume"===t?n.curCoords:n.startCoords).page,startOffset:n.startOffset,statuses:n.modifierStatuses,preEnd:!1,requireEndOnly:!1};a.setOffsets(r),a.resetStatuses(r.statuses),r.pageCoords=s({},n.startCoords.page),n.modifierResult=a.setAll(r)}};o.signals.on("new",function(e){e.startOffset={left:0,right:0,top:0,bottom:0},e.modifierOffsets={},e.modifierStatuses=a.resetStatuses({}),e.modifierResult=null}),o.signals.on("action-start",a.start),o.signals.on("action-resume",a.start),o.signals.on("before-action-move",function(e){var t=e.interaction,n=e.preEnd,r=e.interactingBeforeMove,i=a.setAll({interaction:t,preEnd:n,pageCoords:t.curCoords.page,statuses:t.modifierStatuses,requireEndOnly:!1});!i.shouldMove&&r&&(t._dontFireMove=!0),t.modifierResult=i}),o.signals.on("action-end",function(e){for(var t=e.interaction,n=e.event,i=0;i=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}var m=h,y=m.x,x=m.y;l.push({x:s.left-i.width*y+u.x,y:s.top-i.height*x+u.y})}else l.push(u);return l},set:function(e){var t=e.interaction,n=e.pageCoords,r=e.status,i=e.options,s=e.offset,a=[],l=void 0,c=void 0,p=void 0;if(r.useStatusXY)c={x:r.x,y:r.y};else{var u=o.getOriginXY(t.target,t.element,t.prepared.name);c=o.extend({},n),c.x-=u.x,c.y-=u.y}r.realX=c.x,r.realY=c.y;for(var d=i.targets?i.targets.length:0,f=s,v=Array.isArray(f),g=0,f=v?f:f[Symbol.iterator]();;){var h;if(v){if(g>=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}for(var m=h,y=m.x,x=m.y,b=c.x-y,w=c.y-x,E=i.targets,S=Array.isArray(E),T=0,E=S?E:E[Symbol.iterator]();;){var C;if(S){if(T>=E.length)break;C=E[T++]}else{if(T=E.next(),T.done)break;C=T.value}var A=C;l=o.is.function(A)?A(b,w,t):A,l&&a.push({x:o.is.number(l.x)?l.x+y:b,y:o.is.number(l.y)?l.y+x:w,range:o.is.number(l.range)?l.range:i.range})}}var D={target:null,inRange:!1,distance:0,range:0,dx:0,dy:0};for(p=0,d=a.length;p=p.length)break;f=p[d++]}else{if(d=p.next(),d.done)break;f=d.value}var v=f,g=void 0;g=a.is.function(v)?v(l,c,t):v,g&&("width"in g&&"height"in g&&(g.x=g.width, +g.y=g.height),e.options.targets.push(g))}i.set(e)},modifyCoords:function(e){var t=e.options;e.options=a.extend({},t),e.options.enabled=t.enabled,e.options.relativePoints=[null],i.modifyCoords(e)}};r.snapSize=l,r.names.push("snapSize"),o.perAction.snapSize=l.defaults,s.defaults.snapSize=l.defaults,t.exports=l},{"../actions/resize":10,"../defaultOptions":18,"../utils/":44,"./index":24,"./snap":28}],30:[function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=e("../utils/pointerUtils");t.exports=function(){function e(t,n,o,s,a){if(r(this,e),i.pointerExtend(this,o),o!==n&&i.pointerExtend(this,n),this.interaction=a,this.timeStamp=(new Date).getTime(),this.originalEvent=o,this.type=t,this.pointerId=i.getPointerId(n),this.pointerType=i.getPointerType(n),this.target=s,this.currentTarget=null,"tap"===t){var l=a.getPointerIndex(n);this.dt=this.timeStamp-a.downTimes[l];var c=this.timeStamp-a.tapTime;this.double=!!(a.prevTap&&"doubletap"!==a.prevTap.type&&a.prevTap.target===this.target&&c<500)}else"doubletap"===t&&(this.dt=n.timeStamp-a.tapTime)}return e.prototype.subtractOrigin=function(e){var t=e.x,n=e.y;return this.pageX-=t,this.pageY-=n,this.clientX-=t,this.clientY-=n,this},e.prototype.addOrigin=function(e){var t=e.x,n=e.y;return this.pageX+=t,this.pageY+=n,this.clientX+=t,this.clientY+=n,this},e.prototype.preventDefault=function(){this.originalEvent.preventDefault()},e.prototype.stopPropagation=function(){this.propagationStopped=!0},e.prototype.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},e}()},{"../utils/pointerUtils":49}],31:[function(e,t,n){"use strict";function r(e){for(var t=e.interaction,n=e.pointer,s=e.event,l=e.eventTarget,c=e.type,u=void 0===c?e.pointerEvent.type:c,d=e.targets,f=void 0===d?i(e):d,v=e.pointerEvent,g=void 0===v?new o(u,n,s,l,t):v,h={interaction:t,pointer:n,event:s,eventTarget:l,targets:f,type:u,pointerEvent:g},m=0;m=u.length)break;g=u[v++]}else{if(v=u.next(),v.done)break;g=v.value}var h=g;c.element=h,p.fire("collect-targets",c)}return"hold"===o&&(c.targets=d(c.targets,function(e){return e.eventable.options.holdDuration===t.holdTimers[s].duration})),c.targets}var o=e("./PointerEvent"),s=e("../Interaction"),a=e("../utils"),l=e("../utils/browser"),c=e("../defaultOptions"),p=e("../utils/Signals").new(),u=e("../utils/arr"),d=u.filter,f=["down","up","cancel"],v=["down","up","cancel"],g={PointerEvent:o,fire:r,collectEventTargets:i,signals:p,defaults:{holdDuration:600,ignoreFrom:null,allowFrom:null,origin:{x:0,y:0}},types:["down","move","up","cancel","tap","doubletap","hold"]};s.signals.on("update-pointer-down",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers[n]={duration:1/0,timeout:null}}),s.signals.on("remove-pointer",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers.splice(n,1)}),s.signals.on("move",function(e){var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,s=e.duplicateMove,a=t.getPointerIndex(n);s||t.pointerIsDown&&!t.pointerWasMoved||(t.pointerIsDown&&clearTimeout(t.holdTimers[a].timeout),r({interaction:t,pointer:n,event:i,eventTarget:o,type:"move"}))}),s.signals.on("down",function(e){for(var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,s=e.pointerIndex,c=l.isIE8?a.extend({},i):i,u=t.holdTimers[s],d=a.getPath(o),f={interaction:t,pointer:n,event:i,eventTarget:o,type:"hold",targets:[],path:d,element:null},v=d,g=Array.isArray(v),h=0,v=g?v:v[Symbol.iterator]();;){var m;if(g){if(h>=v.length)break;m=v[h++]}else{if(h=v.next(),h.done)break;m=h.value}var y=m;f.element=y,p.fire("collect-targets",f)}if(f.targets.length){for(var x=1/0,b=0;b=0&&(p.selectors[u]!==e||p.contexts[u]!==t);u--);-1===u&&(u=p.selectors.length,p.selectors.push(e),p.contexts.push(t),p.listeners.push([])),p.listeners[u].push([i,!!s.capture,s.passive])}function s(e,t,n,r,o){var s=f(o),c=O[n],p=!1,u=void 0;if(c)for(u=c.selectors.length-1;u>=0;u--)if(c.selectors[u]===e&&c.contexts[u]===t){for(var d=c.listeners[u],v=d.length-1;v>=0;v--){var g=d[v],h=g[0],m=g[1],y=g[2];if(h===r&&m===!!s.capture&&y===s.passive){d.splice(v,1),d.length||(c.selectors.splice(u,1),c.contexts.splice(u,1),c.listeners.splice(u,1),i(t,n,a),i(t,n,l,!0),c.selectors.length||(O[n]=null)),p=!0;break}}if(p)break}}function a(e,t){var n=f(t),r={},i=O[e.type],o=g.getActualElement(e.path?e.path[0]:e.target),s=o;for(h(r,e),r.originalEvent=e,r.preventDefault=p;v.element(s);){for(var a=0;a=l.length)break;u=l[p++]}else{if(p=l.next(),p.done)break;u=p.value}var d=u,f=o[d](a);if(f)return f}},simulationResume:function(e){var t=e.pointerType,n=e.eventType,o=e.eventTarget;if(!/down|start/i.test(n))return null;for(var s=r.interactions,a=Array.isArray(s),l=0,s=a?s:s[Symbol.iterator]();;){var c;if(a){if(l>=s.length)break;c=s[l++]}else{if(l=s.next(),l.done)break;c=l.value}var p=c,u=o;if(p.simulation&&p.simulation.allowResume&&p.pointerType===t)for(;u;){if(u===p.element)return p;u=i.parentNode(u)}}return null},mouseOrPen:function(e){var t=e.pointerId,n=e.pointerType,o=e.eventType;if("mouse"!==n&&"pen"!==n)return null;for(var s=void 0,a=r.interactions,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var u=p;if(u.pointerType===n){if(u.simulation&&!i.contains(u.pointerIds,t))continue;if(u.interacting())return u;s||(s=u)}}if(s)return s;for(var d=r.interactions,f=Array.isArray(d),v=0,d=f?d:d[Symbol.iterator]();;){var g;if(f){if(v>=d.length)break;g=d[v++]}else{if(v=d.next(),v.done)break;g=v.value}var h=g;if(!(h.pointerType!==n||/down/i.test(o)&&h.simulation))return h}return null},hasPointer:function(e){for(var t=e.pointerId,n=r.interactions,o=Array.isArray(n),s=0,n=o?n:n[Symbol.iterator]();;){var a;if(o){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var l=a;if(i.contains(l.pointerIds,t))return l}},idle:function(e){for(var t=e.pointerType,n=r.interactions,i=Array.isArray(n),o=0,n=i?n:n[Symbol.iterator]();;){var s;if(i){if(o>=n.length)break;s=n[o++]}else{if(o=n.next(),o.done)break;s=o.value}var a=s;if(1===a.pointerIds.length){var l=a.target;if(l&&!l.options.gesture.enabled)continue}else if(a.pointerIds.length>=2)continue;if(!a.interacting()&&t===a.pointerType)return a}return null}};t.exports=o},{"../scope":34,"./index":44}],46:[function(e,t,n){"use strict";var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},i=e("./window"),o=e("./isWindow"),s={array:function(){},window:function(e){return e===i.window||o(e)},docFrag:function(e){return s.object(e)&&11===e.nodeType},object:function(e){return!!e&&"object"===(void 0===e?"undefined":r(e))},function:function(e){return"function"==typeof e},number:function(e){return"number"==typeof e},bool:function(e){return"boolean"==typeof e},string:function(e){return"string"==typeof e},element:function(e){if(!e||"object"!==(void 0===e?"undefined":r(e)))return!1;var t=i.getWindow(e)||i.window;return/object|function/.test(r(t.Element))?e instanceof t.Element:1===e.nodeType&&"string"==typeof e.nodeName}};s.array=function(e){return s.object(e)&&void 0!==e.length&&s.function(e.splice)},t.exports=s},{"./isWindow":47,"./window":52}],47:[function(e,t,n){"use strict";t.exports=function(e){return!(!e||!e.Window)&&e instanceof e.Window}},{}],48:[function(e,t,n){"use strict";function r(e,n){for(var r in n){var i=t.exports.prefixedPropREs,o=!1;for(var s in i)if(0===r.indexOf(s)&&i[s].test(r)){o=!0;break}o||"function"==typeof n[r]||(e[r]=n[r])}return e}r.prefixedPropREs={webkit:/(Movement[XY]|Radius[XY]|RotationAngle|Force)$/},t.exports=r},{}],49:[function(e,t,n){"use strict";var r=e("./hypot"),i=e("./browser"),o=e("./domObjects"),s=e("./domUtils"),a=e("./domObjects"),l=e("./is"),c=e("./pointerExtend"),p={copyCoords:function(e,t){e.page=e.page||{},e.page.x=t.page.x,e.page.y=t.page.y,e.client=e.client||{},e.client.x=t.client.x,e.client.y=t.client.y,e.timeStamp=t.timeStamp},setCoordDeltas:function(e,t,n){e.page.x=n.page.x-t.page.x,e.page.y=n.page.y-t.page.y,e.client.x=n.client.x-t.client.x,e.client.y=n.client.y-t.client.y,e.timeStamp=n.timeStamp-t.timeStamp;var i=Math.max(e.timeStamp/1e3,.001);e.page.speed=r(e.page.x,e.page.y)/i,e.page.vx=e.page.x/i,e.page.vy=e.page.y/i,e.client.speed=r(e.client.x,e.page.y)/i,e.client.vx=e.client.x/i,e.client.vy=e.client.y/i},isNativePointer:function(e){return e instanceof o.Event||e instanceof o.Touch},getXY:function(e,t,n){return n=n||{},e=e||"page",n.x=t[e+"X"],n.y=t[e+"Y"],n},getPageXY:function(e,t){return t=t||{},i.isOperaMobile&&p.isNativePointer(e)?(p.getXY("screen",e,t),t.x+=window.scrollX,t.y+=window.scrollY):p.getXY("page",e,t),t},getClientXY:function(e,t){return t=t||{},i.isOperaMobile&&p.isNativePointer(e)?p.getXY("screen",e,t):p.getXY("client",e,t),t},getPointerId:function(e){return l.number(e.pointerId)?e.pointerId:e.identifier},setCoords:function(e,t,n){var r=t.length>1?p.pointerAverage(t):t[0],i={};p.getPageXY(r,i),e.page.x=i.x,e.page.y=i.y,p.getClientXY(r,i),e.client.x=i.x,e.client.y=i.y,e.timeStamp=l.number(n)?n:(new Date).getTime()},pointerExtend:c,getTouchPair:function(e){var t=[];return l.array(e)?(t[0]=e[0],t[1]=e[1]):"touchend"===e.type?1===e.touches.length?(t[0]=e.touches[0],t[1]=e.changedTouches[0]):0===e.touches.length&&(t[0]=e.changedTouches[0],t[1]=e.changedTouches[1]):(t[0]=e.touches[0],t[1]=e.touches[1]),t},pointerAverage:function(e){for(var t={pageX:0,pageY:0,clientX:0,clientY:0,screenX:0,screenY:0},n=e,r=Array.isArray(n),i=0,n=r?n:n[Symbol.iterator]();;){var o;if(r){if(i>=n.length)break;o=n[i++]}else{if(i=n.next(),i.done)break;o=i.value}var s=o;for(var a in t)t[a]+=s[a]}for(var l in t)t[l]/=e.length;return t},touchBBox:function(e){if(e.length||e.touches&&e.touches.length>1){var t=p.getTouchPair(e),n=Math.min(t[0].pageX,t[1].pageX),r=Math.min(t[0].pageY,t[1].pageY);return{x:n,y:r,left:n,top:r,width:Math.max(t[0].pageX,t[1].pageX)-n,height:Math.max(t[0].pageY,t[1].pageY)-r}}},touchDistance:function(e,t){var n=t+"X",i=t+"Y",o=p.getTouchPair(e),s=o[0][n]-o[1][n],a=o[0][i]-o[1][i];return r(s,a)},touchAngle:function(e,t,n){var r=n+"X",i=n+"Y",o=p.getTouchPair(e),s=o[1][r]-o[0][r],a=o[1][i]-o[0][i];return 180*Math.atan2(a,s)/Math.PI},getPointerType:function(e){return l.string(e.pointerType)?e.pointerType:l.number(e.pointerType)?[void 0,void 0,"touch","pen","mouse"][e.pointerType]:/touch/.test(e.type)||e instanceof a.Touch?"touch":"mouse"},getEventTargets:function(e){return[s.getActualElement(e.path?e.path[0]:e.target),s.getActualElement(e.currentTarget)]}};t.exports=p},{"./browser":37,"./domObjects":38,"./domUtils":39,"./hypot":43,"./is":46,"./pointerExtend":48}],50:[function(e,t,n){"use strict";for(var r=e("./window"),i=r.window,o=["ms","moz","webkit","o"],s=0,a=void 0,l=void 0,c=0;c\n * Open source under the MIT License.\n * https://raw.github.com/taye/interact.js/master/LICENSE\n */\n","/*\n * In a (windowless) server environment this file exports a factory function\n * that takes the window to use.\n *\n * var interact = require('interact.js')(windowObject);\n *\n * See https://github.com/taye/interact.js/issues/187\n */\nif (typeof window === 'undefined') {\n module.exports = function (window) {\n require('./src/utils/window').init(window);\n\n return require('./src/index');\n };\n}\nelse {\n module.exports = require('./src/index');\n}\n","const { indexOf } = require('./utils/arr');\nconst extend = require('./utils/extend.js');\n\nfunction fireUntilImmediateStopped (event, listeners) {\n for (let i = 0, len = listeners.length; i < len && !event.immediatePropagationStopped; i++) {\n listeners[i](event);\n }\n}\n\nclass Eventable {\n\n constructor (options) {\n this.options = extend({}, options || {});\n }\n\n fire (event) {\n let listeners;\n const onEvent = 'on' + event.type;\n const global = this.global;\n\n // Interactable#on() listeners\n if ((listeners = this[event.type])) {\n fireUntilImmediateStopped(event, listeners);\n }\n\n // interactable.onevent listener\n if (this[onEvent]) {\n this[onEvent](event);\n }\n\n // interact.on() listeners\n if (!event.propagationStopped && global && (listeners = global[event.type])) {\n fireUntilImmediateStopped(event, listeners);\n }\n }\n\n on (eventType, listener) {\n // if this type of event was never bound\n if (this[eventType]) {\n this[eventType].push(listener);\n }\n else {\n this[eventType] = [listener];\n }\n }\n\n off (eventType, listener) {\n // if it is an action event type\n const eventList = this[eventType];\n const index = eventList? indexOf(eventList, listener) : -1;\n\n if (index !== -1) {\n eventList.splice(index, 1);\n }\n\n if (eventList && eventList.length === 0 || !listener) {\n this[eventType] = listener;\n }\n }\n}\n\nmodule.exports = Eventable;\n","const extend = require('./utils/extend');\nconst getOriginXY = require('./utils/getOriginXY');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nclass InteractEvent {\n constructor (interaction, event, action, phase, element, related, preEnd = false) {\n const target = interaction.target;\n const deltaSource = (target && target.options || defaults).deltaSource;\n const origin = getOriginXY(target, element, action);\n const starting = phase === 'start';\n const ending = phase === 'end';\n const coords = starting? interaction.startCoords : interaction.curCoords;\n const prevEvent = interaction.prevEvent;\n\n element = element || interaction.element;\n\n const page = extend({}, coords.page);\n const client = extend({}, coords.client);\n\n page.x -= origin.x;\n page.y -= origin.y;\n\n client.x -= origin.x;\n client.y -= origin.y;\n\n this.ctrlKey = event.ctrlKey;\n this.altKey = event.altKey;\n this.shiftKey = event.shiftKey;\n this.metaKey = event.metaKey;\n this.button = event.button;\n this.buttons = event.buttons;\n this.target = element;\n this.currentTarget = element;\n this.relatedTarget = related || null;\n this.preEnd = preEnd;\n this.type = action + (phase || '');\n this.interaction = interaction;\n this.interactable = target;\n\n this.t0 = starting ? interaction.downTimes[interaction.downTimes.length - 1]\n : prevEvent.t0;\n\n const signalArg = {\n interaction,\n event,\n action,\n phase,\n element,\n related,\n page,\n client,\n coords,\n starting,\n ending,\n deltaSource,\n iEvent: this,\n };\n\n signals.fire('set-xy', signalArg);\n\n if (ending) {\n // use previous coords when ending\n this.pageX = prevEvent.pageX;\n this.pageY = prevEvent.pageY;\n this.clientX = prevEvent.clientX;\n this.clientY = prevEvent.clientY;\n }\n else {\n this.pageX = page.x;\n this.pageY = page.y;\n this.clientX = client.x;\n this.clientY = client.y;\n }\n\n this.x0 = interaction.startCoords.page.x - origin.x;\n this.y0 = interaction.startCoords.page.y - origin.y;\n this.clientX0 = interaction.startCoords.client.x - origin.x;\n this.clientY0 = interaction.startCoords.client.y - origin.y;\n\n signals.fire('set-delta', signalArg);\n\n this.timeStamp = coords.timeStamp;\n this.dt = interaction.pointerDelta.timeStamp;\n this.duration = this.timeStamp - this.t0;\n\n // speed and velocity in pixels per second\n this.speed = interaction.pointerDelta[deltaSource].speed;\n this.velocityX = interaction.pointerDelta[deltaSource].vx;\n this.velocityY = interaction.pointerDelta[deltaSource].vy;\n\n this.swipe = (ending || phase === 'inertiastart')? this.getSwipe() : null;\n\n signals.fire('new', signalArg);\n }\n\n getSwipe () {\n const interaction = this.interaction;\n\n if (interaction.prevEvent.speed < 600\n || this.timeStamp - interaction.prevEvent.timeStamp > 150) {\n return null;\n }\n\n let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI;\n const overlap = 22.5;\n\n if (angle < 0) {\n angle += 360;\n }\n\n const left = 135 - overlap <= angle && angle < 225 + overlap;\n const up = 225 - overlap <= angle && angle < 315 + overlap;\n\n const right = !left && (315 - overlap <= angle || angle < 45 + overlap);\n const down = !up && 45 - overlap <= angle && angle < 135 + overlap;\n\n return {\n up,\n down,\n left,\n right,\n angle,\n speed: interaction.prevEvent.speed,\n velocity: {\n x: interaction.prevEvent.velocityX,\n y: interaction.prevEvent.velocityY,\n },\n };\n }\n\n preventDefault () {}\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n}\n\nsignals.on('set-delta', function ({ iEvent, interaction, starting, deltaSource }) {\n const prevEvent = starting? iEvent : interaction.prevEvent;\n\n if (deltaSource === 'client') {\n iEvent.dx = iEvent.clientX - prevEvent.clientX;\n iEvent.dy = iEvent.clientY - prevEvent.clientY;\n }\n else {\n iEvent.dx = iEvent.pageX - prevEvent.pageX;\n iEvent.dy = iEvent.pageY - prevEvent.pageY;\n }\n});\n\nInteractEvent.signals = signals;\n\nmodule.exports = InteractEvent;\n","const is = require('./utils/is');\nconst events = require('./utils/events');\nconst extend = require('./utils/extend');\nconst actions = require('./actions/base');\nconst scope = require('./scope');\nconst Eventable = require('./Eventable');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nconst {\n getElementRect,\n nodeContains,\n trySelector,\n} = require('./utils/domUtils');\nconst { getWindow } = require('./utils/window');\nconst { indexOf, contains } = require('./utils/arr');\nconst { wheelEvent } = require('./utils/browser');\n\n// all set interactables\nscope.interactables = [];\n\n/*\\\n * Interactable\n [ property ]\n **\n * Object type returned by @interact\n\\*/\nclass Interactable {\n constructor (target, options) {\n options = options || {};\n\n this.target = target;\n this.events = new Eventable();\n this._context = options.context || scope.document;\n this._win = getWindow(trySelector(target)? this._context : target);\n this._doc = this._win.document;\n\n signals.fire('new', {\n target,\n options,\n interactable: this,\n win: this._win,\n });\n\n scope.addDocument( this._doc, this._win );\n\n scope.interactables.push(this);\n\n this.set(options);\n }\n\n setOnEvents (action, phases) {\n const onAction = 'on' + action;\n\n if (is.function(phases.onstart) ) { this.events[onAction + 'start' ] = phases.onstart ; }\n if (is.function(phases.onmove) ) { this.events[onAction + 'move' ] = phases.onmove ; }\n if (is.function(phases.onend) ) { this.events[onAction + 'end' ] = phases.onend ; }\n if (is.function(phases.oninertiastart)) { this.events[onAction + 'inertiastart' ] = phases.oninertiastart ; }\n\n return this;\n }\n\n setPerAction (action, options) {\n // for all the default per-action options\n for (const option in options) {\n // if this option exists for this action\n if (option in defaults[action]) {\n // if the option in the options arg is an object value\n if (is.object(options[option])) {\n // duplicate the object\n this.options[action][option] = extend(this.options[action][option] || {}, options[option]);\n\n if (is.object(defaults.perAction[option]) && 'enabled' in defaults.perAction[option]) {\n this.options[action][option].enabled = options[option].enabled === false? false : true;\n }\n }\n else if (is.bool(options[option]) && is.object(defaults.perAction[option])) {\n this.options[action][option].enabled = options[option];\n }\n else if (options[option] !== undefined) {\n // or if it's not undefined, do a plain assignment\n this.options[action][option] = options[option];\n }\n }\n }\n }\n\n /*\\\n * Interactable.getRect\n [ method ]\n *\n * The default function to get an Interactables bounding rect. Can be\n * overridden using @Interactable.rectChecker.\n *\n - element (Element) #optional The element to measure.\n = (object) The object's bounding rectangle.\n o {\n o top : 0,\n o left : 0,\n o bottom: 0,\n o right : 0,\n o width : 0,\n o height: 0\n o }\n \\*/\n getRect (element) {\n element = element || this.target;\n\n if (is.string(this.target) && !(is.element(element))) {\n element = this._context.querySelector(this.target);\n }\n\n return getElementRect(element);\n }\n\n /*\\\n * Interactable.rectChecker\n [ method ]\n *\n * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n - checker (function) #optional A function which returns this Interactable's bounding rectangle. See @Interactable.getRect\n = (function | object) The checker function or this Interactable\n \\*/\n rectChecker (checker) {\n if (is.function(checker)) {\n this.getRect = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.getRect;\n\n return this;\n }\n\n return this.getRect;\n }\n\n _backCompatOption (optionName, newValue) {\n if (trySelector(newValue) || is.object(newValue)) {\n this.options[optionName] = newValue;\n\n for (const action of actions.names) {\n this.options[action][optionName] = newValue;\n }\n\n return this;\n }\n\n return this.options[optionName];\n }\n\n /*\\\n * Interactable.origin\n [ method ]\n *\n * Gets or sets the origin of the Interactable's element. The x and y\n * of the origin will be subtracted from action event coordinates.\n *\n - origin (object | string) #optional An object eg. { x: 0, y: 0 } or string 'parent', 'self' or any CSS selector\n * OR\n - origin (Element) #optional An HTML or SVG Element whose rect will be used\n **\n = (object) The current origin or this Interactable\n \\*/\n origin (newValue) {\n return this._backCompatOption('origin', newValue);\n }\n\n /*\\\n * Interactable.deltaSource\n [ method ]\n *\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n - newValue (string) #optional Use 'client' if you will be scrolling while interacting; Use 'page' if you want autoScroll to work\n = (string | object) The current deltaSource or this Interactable\n \\*/\n deltaSource (newValue) {\n if (newValue === 'page' || newValue === 'client') {\n this.options.deltaSource = newValue;\n\n return this;\n }\n\n return this.options.deltaSource;\n }\n\n /*\\\n * Interactable.context\n [ method ]\n *\n * Gets the selector context Node of the Interactable. The default is `window.document`.\n *\n = (Node) The context Node of this Interactable\n **\n \\*/\n context () {\n return this._context;\n }\n\n inContext (element) {\n return (this._context === element.ownerDocument\n || nodeContains(this._context, element));\n }\n\n /*\\\n * Interactable.fire\n [ method ]\n *\n * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n - iEvent (InteractEvent) The InteractEvent object to be fired on this Interactable\n = (Interactable) this Interactable\n \\*/\n fire (iEvent) {\n this.events.fire(iEvent);\n\n return this;\n }\n\n _onOffMultiple (method, eventType, listener, options) {\n if (is.string(eventType) && eventType.search(' ') !== -1) {\n eventType = eventType.trim().split(/ +/);\n }\n\n if (is.array(eventType)) {\n for (let i = 0; i < eventType.length; i++) {\n this[method](eventType[i], listener, options);\n }\n\n return true;\n }\n\n if (is.object(eventType)) {\n for (const prop in eventType) {\n this[method](prop, eventType[prop], listener);\n }\n\n return true;\n }\n }\n\n /*\\\n * Interactable.on\n [ method ]\n *\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n - eventType (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) This Interactable\n \\*/\n on (eventType, listener, options) {\n if (this._onOffMultiple('on', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.on(eventType, listener);\n }\n // delegated event for selector\n else if (is.string(this.target)) {\n events.addDelegate(this.target, this._context, eventType, listener, options);\n }\n else {\n events.add(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.off\n [ method ]\n *\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n - eventType (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) This Interactable\n \\*/\n off (eventType, listener, options) {\n if (this._onOffMultiple('off', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n // if it is an action event type\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.off(eventType, listener);\n }\n // delegated event\n else if (is.string(this.target)) {\n events.removeDelegate(this.target, this._context, eventType, listener, options);\n }\n // remove listener from this Interatable's element\n else {\n events.remove(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.set\n [ method ]\n *\n * Reset the options of this Interactable\n - options (object) The new settings to apply\n = (object) This Interactable\n \\*/\n set (options) {\n if (!is.object(options)) {\n options = {};\n }\n\n this.options = extend({}, defaults.base);\n\n const perActions = extend({}, defaults.perAction);\n\n for (const actionName in actions.methodDict) {\n const methodName = actions.methodDict[actionName];\n\n this.options[actionName] = extend({}, defaults[actionName]);\n\n this.setPerAction(actionName, perActions);\n\n this[methodName](options[actionName]);\n }\n\n for (const setting of Interactable.settingsMethods) {\n this.options[setting] = defaults.base[setting];\n\n if (setting in options) {\n this[setting](options[setting]);\n }\n }\n\n signals.fire('set', {\n options,\n interactable: this,\n });\n\n return this;\n }\n\n /*\\\n * Interactable.unset\n [ method ]\n *\n * Remove this interactable from the list of interactables and remove\n * it's action capabilities and event listeners\n *\n = (object) @interact\n \\*/\n unset () {\n events.remove(this.target, 'all');\n\n if (is.string(this.target)) {\n // remove delegated events\n for (const type in events.delegatedEvents) {\n const delegated = events.delegatedEvents[type];\n\n if (delegated.selectors[0] === this.target\n && delegated.contexts[0] === this._context) {\n\n delegated.selectors.splice(0, 1);\n delegated.contexts .splice(0, 1);\n delegated.listeners.splice(0, 1);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegated[type] = null;\n }\n }\n\n events.remove(this._context, type, events.delegateListener);\n events.remove(this._context, type, events.delegateUseCapture, true);\n }\n }\n else {\n events.remove(this, 'all');\n }\n\n signals.fire('unset', { interactable: this });\n\n scope.interactables.splice(indexOf(scope.interactables, this), 1);\n\n // Stop related interactions when an Interactable is unset\n for (const interaction of scope.interactions || []) {\n if (interaction.target === this && interaction.interacting()) {\n interaction.stop();\n }\n }\n\n return scope.interact;\n }\n}\n\nscope.interactables.indexOfElement = function indexOfElement (target, context) {\n context = context || scope.document;\n\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n if (interactable.target === target && interactable._context === context) {\n return i;\n }\n }\n return -1;\n};\n\nscope.interactables.get = function interactableGet (element, options, dontCheckInContext) {\n const ret = this[this.indexOfElement(element, options && options.context)];\n\n return ret && (is.string(element) || dontCheckInContext || ret.inContext(element))? ret : null;\n};\n\nscope.interactables.forEachSelector = function (callback, element) {\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n // skip non CSS selector targets and out of context elements\n if (!is.string(interactable.target)\n || (element && !interactable.inContext(element))) {\n continue;\n }\n\n const ret = callback(interactable, interactable.target, interactable._context, i, this);\n\n if (ret !== undefined) {\n return ret;\n }\n }\n};\n\n// all interact.js eventTypes\nInteractable.eventTypes = scope.eventTypes = [];\n\nInteractable.signals = signals;\n\nInteractable.settingsMethods = [ 'deltaSource', 'origin', 'preventDefault', 'rectChecker' ];\n\nmodule.exports = Interactable;\n","const scope = require('./scope');\nconst utils = require('./utils');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst finder = require('./utils/interactionFinder');\nconst signals = require('./utils/Signals').new();\n\nconst listeners = {};\nconst methodNames = [\n 'pointerDown', 'pointerMove', 'pointerUp',\n 'updatePointer', 'removePointer',\n];\n\n// for ignoring browser's simulated mouse events\nlet prevTouchTime = 0;\n\n// all active and idle interactions\nscope.interactions = [];\n\nclass Interaction {\n constructor () {\n this.target = null; // current interactable being interacted with\n this.element = null; // the target element of the interactable\n\n this.prepared = { // action that's ready to be fired on next move event\n name : null,\n axis : null,\n edges: null,\n };\n\n // keep track of added pointers\n this.pointers = [];\n this.pointerIds = [];\n this.downTargets = [];\n this.downTimes = [];\n\n // Previous native pointer move event coordinates\n this.prevCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n // current native pointer move event coordinates\n this.curCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Starting InteractEvent pointer coordinates\n this.startCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Change in coordinates and time of the pointer\n this.pointerDelta = {\n page : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n client : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n timeStamp: 0,\n };\n\n this.downEvent = null; // pointerdown/mousedown/touchstart event\n this.downPointer = {};\n\n this._eventTarget = null;\n this._curEventTarget = null;\n\n this.prevEvent = null; // previous action event\n\n this.pointerIsDown = false;\n this.pointerWasMoved = false;\n this._interacting = false;\n\n this.mouse = false;\n\n signals.fire('new', this);\n\n scope.interactions.push(this);\n }\n\n pointerDown (pointer, event, eventTarget) {\n const pointerIndex = this.updatePointer(pointer, event, true);\n\n signals.fire('down', {\n pointer,\n event,\n eventTarget,\n pointerIndex,\n interaction: this,\n });\n }\n\n /*\\\n * Interaction.start\n [ method ]\n *\n * Start an action with the given Interactable and Element as tartgets. The\n * action must be enabled for the target Interactable and an appropriate number\n * of pointers must be held down - 1 for drag/resize, 2 for gesture.\n *\n * Use it with `interactable.able({ manualStart: false })` to always\n * [start actions manually](https://github.com/taye/interact.js/issues/114)\n *\n - action (object) The action to be performed - drag, resize, etc.\n - target (Interactable) The Interactable to target\n - element (Element) The DOM Element to target\n = (object) interact\n **\n | interact(target)\n | .draggable({\n | // disable the default drag start by down->move\n | manualStart: true\n | })\n | // start dragging after the user holds the pointer down\n | .on('hold', function (event) {\n | var interaction = event.interaction;\n |\n | if (!interaction.interacting()) {\n | interaction.start({ name: 'drag' },\n | event.interactable,\n | event.currentTarget);\n | }\n | });\n \\*/\n start (action, target, element) {\n if (this.interacting()\n || !this.pointerIsDown\n || this.pointerIds.length < (action.name === 'gesture'? 2 : 1)) {\n return;\n }\n\n // if this interaction had been removed after stopping\n // add it back\n if (utils.indexOf(scope.interactions, this) === -1) {\n scope.interactions.push(this);\n }\n\n utils.copyAction(this.prepared, action);\n this.target = target;\n this.element = element;\n\n signals.fire('action-start', {\n interaction: this,\n event: this.downEvent,\n });\n }\n\n pointerMove (pointer, event, eventTarget) {\n if (!this.simulation) {\n this.updatePointer(pointer);\n utils.setCoords(this.curCoords, this.pointers);\n }\n\n const duplicateMove = (this.curCoords.page.x === this.prevCoords.page.x\n && this.curCoords.page.y === this.prevCoords.page.y\n && this.curCoords.client.x === this.prevCoords.client.x\n && this.curCoords.client.y === this.prevCoords.client.y);\n\n let dx;\n let dy;\n\n // register movement greater than pointerMoveTolerance\n if (this.pointerIsDown && !this.pointerWasMoved) {\n dx = this.curCoords.client.x - this.startCoords.client.x;\n dy = this.curCoords.client.y - this.startCoords.client.y;\n\n this.pointerWasMoved = utils.hypot(dx, dy) > Interaction.pointerMoveTolerance;\n }\n\n const signalArg = {\n pointer,\n pointerIndex: this.getPointerIndex(pointer),\n event,\n eventTarget,\n dx,\n dy,\n duplicate: duplicateMove,\n interaction: this,\n interactingBeforeMove: this.interacting(),\n };\n\n if (!duplicateMove) {\n // set pointer coordinate, time changes and speeds\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n }\n\n signals.fire('move', signalArg);\n\n if (!duplicateMove) {\n // if interacting, fire an 'action-move' signal etc\n if (this.interacting()) {\n this.doMove(signalArg);\n }\n\n if (this.pointerWasMoved) {\n utils.copyCoords(this.prevCoords, this.curCoords);\n }\n }\n }\n\n /*\\\n * Interaction.doMove\n [ method ]\n *\n * Force a move of the current action at the same coordinates. Useful if\n * snap/restrict has been changed and you want a movement with the new\n * settings.\n *\n **\n | interact(target)\n | .draggable(true)\n | .on('dragmove', function (event) {\n | if (someCondition) {\n | // change the snap settings\n | event.interactable.draggable({ snap: { targets: [] }});\n | // fire another move event with re-calculated snap\n | event.interaction.doMove();\n | }\n | });\n \\*/\n doMove (signalArg) {\n signalArg = utils.extend({\n pointer: this.pointers[0],\n event: this.prevEvent,\n eventTarget: this._eventTarget,\n interaction: this,\n }, signalArg || {});\n\n signals.fire('before-action-move', signalArg);\n\n if (!this._dontFireMove) {\n signals.fire('action-move', signalArg);\n }\n\n this._dontFireMove = false;\n }\n\n // End interact move events and stop auto-scroll unless simulation is running\n pointerUp (pointer, event, eventTarget, curEventTarget) {\n const pointerIndex = this.getPointerIndex(pointer);\n\n signals.fire(/cancel$/i.test(event.type)? 'cancel' : 'up', {\n pointer,\n pointerIndex,\n event,\n eventTarget,\n curEventTarget,\n interaction: this,\n });\n\n if (!this.simulation) {\n this.end(event);\n }\n\n this.pointerIsDown = false;\n this.removePointer(pointer, event);\n }\n\n /*\\\n * Interaction.end\n [ method ]\n *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n - event (PointerEvent) #optional\n **\n | interact(target)\n | .draggable(true)\n | .on('move', function (event) {\n | if (event.pageX > 1000) {\n | // end the current action\n | event.interaction.end();\n | // stop all further listeners from being called\n | event.stopImmediatePropagation();\n | }\n | });\n \\*/\n end (event) {\n event = event || this.prevEvent;\n\n if (this.interacting()) {\n signals.fire('action-end', {\n event,\n interaction: this,\n });\n }\n\n this.stop();\n }\n\n currentAction () {\n return this._interacting? this.prepared.name: null;\n }\n\n interacting () {\n return this._interacting;\n }\n\n stop () {\n signals.fire('stop', { interaction: this });\n\n if (this._interacting) {\n signals.fire('stop-active', { interaction: this });\n signals.fire('stop-' + this.prepared.name, { interaction: this });\n }\n\n this.target = this.element = null;\n\n this._interacting = false;\n this.prepared.name = this.prevEvent = null;\n }\n\n getPointerIndex (pointer) {\n return utils.indexOf(this.pointerIds, utils.getPointerId(pointer));\n }\n\n updatePointer (pointer, event, down = event && /(down|start)$/i.test(event.type)) {\n const id = utils.getPointerId(pointer);\n let index = this.getPointerIndex(pointer);\n\n if (index === -1) {\n index = this.pointerIds.length;\n this.pointerIds[index] = id;\n }\n\n if (down) {\n signals.fire('update-pointer-down', {\n pointer,\n event,\n down,\n pointerId: id,\n pointerIndex: index,\n interaction: this,\n });\n }\n\n this.pointers[index] = pointer;\n\n return index;\n }\n\n removePointer (pointer, event) {\n const id = utils.getPointerId(pointer);\n const index = this.mouse? 0 : utils.indexOf(this.pointerIds, id);\n\n if (index === -1) { return; }\n\n signals.fire('remove-pointer', {\n pointer,\n event,\n pointerIndex: index,\n interaction: this,\n });\n\n this.pointers .splice(index, 1);\n this.pointerIds .splice(index, 1);\n this.downTargets.splice(index, 1);\n this.downTimes .splice(index, 1);\n }\n\n _updateEventTargets (target, currentTarget) {\n this._eventTarget = target;\n this._curEventTarget = currentTarget;\n }\n}\n\nfor (let i = 0, len = methodNames.length; i < len; i++) {\n const method = methodNames[i];\n\n listeners[method] = doOnInteractions(method);\n}\n\nfunction doOnInteractions (method) {\n return (function (event) {\n const [eventTarget, curEventTarget] = utils.getEventTargets(event);\n const matches = []; // [ [pointer, interaction], ...]\n\n if (browser.supportsTouch && /touch/.test(event.type)) {\n prevTouchTime = new Date().getTime();\n\n for (let i = 0; i < event.changedTouches.length; i++) {\n const pointer = event.changedTouches[i];\n const interaction = finder.search(pointer, event.type, eventTarget);\n\n matches.push([pointer, interaction || new Interaction()]);\n }\n }\n else {\n let invalidPointer = false;\n\n if (!browser.supportsPointerEvent && /mouse/.test(event.type)) {\n // ignore mouse events while touch interactions are active\n for (let i = 0; i < scope.interactions.length && !invalidPointer; i++) {\n invalidPointer = !scope.interactions[i].mouse && scope.interactions[i].pointerIsDown;\n }\n\n // try to ignore mouse events that are simulated by the browser\n // after a touch event\n invalidPointer = invalidPointer\n || (new Date().getTime() - prevTouchTime < 500)\n // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated\n || event.timeStamp === 0;\n }\n\n if (!invalidPointer) {\n let interaction = finder.search(event, event.type, eventTarget);\n\n if (!interaction) {\n\n interaction = new Interaction();\n interaction.mouse = (/mouse/i.test(event.pointerType || event.type)\n // MSPointerEvent.MSPOINTER_TYPE_MOUSE\n || event.pointerType === 4\n || !event.pointerType);\n }\n\n matches.push([event, interaction]);\n }\n }\n\n for (const [pointer, interaction] of matches) {\n interaction._updateEventTargets(eventTarget, curEventTarget);\n interaction[method](pointer, event, eventTarget, curEventTarget);\n }\n });\n}\n\nfunction endAll (event) {\n for (let i = 0; i < scope.interactions.length; i++) {\n const interaction = scope.interactions[i];\n\n interaction.end(event);\n signals.fire('endall', { event, interaction });\n }\n}\n\nconst docEvents = { /* 'eventType': listenerFunc */ };\nconst pEventTypes = browser.pEventTypes;\n\nif (scope.PointerEvent) {\n docEvents[pEventTypes.down ] = listeners.pointerDown;\n docEvents[pEventTypes.move ] = listeners.pointerMove;\n docEvents[pEventTypes.up ] = listeners.pointerUp;\n docEvents[pEventTypes.cancel] = listeners.pointerUp;\n}\nelse {\n docEvents.mousedown = listeners.pointerDown;\n docEvents.mousemove = listeners.pointerMove;\n docEvents.mouseup = listeners.pointerUp;\n\n docEvents.touchstart = listeners.pointerDown;\n docEvents.touchmove = listeners.pointerMove;\n docEvents.touchend = listeners.pointerUp;\n docEvents.touchcancel = listeners.pointerUp;\n}\n\ndocEvents.blur = endAll;\n\nfunction onDocSignal ({ doc }, signalName) {\n const eventMethod = signalName.indexOf('add') === 0\n ? events.add : events.remove;\n\n // delegate event listener\n for (const eventType in scope.delegatedEvents) {\n eventMethod(doc, eventType, events.delegateListener);\n eventMethod(doc, eventType, events.delegateUseCapture, true);\n }\n\n for (const eventType in docEvents) {\n eventMethod(doc, eventType, docEvents[eventType]);\n }\n}\n\nsignals.on('update-pointer-down', ({ interaction, pointer, pointerId, pointerIndex, event, eventTarget, down }) => {\n interaction.pointerIds[pointerIndex] = pointerId;\n interaction.pointers[pointerIndex] = pointer;\n\n if (down) {\n interaction.pointerIsDown = true;\n }\n\n if (!interaction.interacting()) {\n utils.setCoords(interaction.startCoords, interaction.pointers);\n\n utils.copyCoords(interaction.curCoords , interaction.startCoords);\n utils.copyCoords(interaction.prevCoords, interaction.startCoords);\n\n interaction.downEvent = event;\n interaction.downTimes[pointerIndex] = interaction.curCoords.timeStamp;\n interaction.downTargets[pointerIndex] = eventTarget || event && utils.getEventTargets(event)[0];\n interaction.pointerWasMoved = false;\n\n utils.pointerExtend(interaction.downPointer, pointer);\n }\n});\n\nscope.signals.on('add-document' , onDocSignal);\nscope.signals.on('remove-document', onDocSignal);\n\nInteraction.pointerMoveTolerance = 1;\nInteraction.doOnInteractions = doOnInteractions;\nInteraction.endAll = endAll;\nInteraction.signals = signals;\nInteraction.docEvents = docEvents;\n\nscope.endAllInteractions = endAll;\n\nmodule.exports = Interaction;\n","const Interaction = require('../Interaction');\nconst InteractEvent = require('../InteractEvent');\n\nconst actions = {\n firePrepared,\n names: [],\n methodDict: {},\n};\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n interaction._interacting = true;\n firePrepared(interaction, event, 'start');\n});\n\nInteraction.signals.on('action-move', function ({ interaction, event, preEnd }) {\n firePrepared(interaction, event, 'move', preEnd);\n\n // if the action was ended in a listener\n if (!interaction.interacting()) { return false; }\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n firePrepared(interaction, event, 'end');\n});\n\nfunction firePrepared (interaction, event, phase, preEnd) {\n const actionName = interaction.prepared.name;\n\n const newEvent = new InteractEvent(interaction, event, actionName, phase, interaction.element, null, preEnd);\n\n interaction.target.fire(newEvent);\n interaction.prevEvent = newEvent;\n}\n\nmodule.exports = actions;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drag = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n startAxis : 'xy',\n lockAxis : 'xy',\n },\n\n checker: function (pointer, event, interactable) {\n const dragOptions = interactable.options.drag;\n\n return dragOptions.enabled\n ? { name: 'drag', axis: (dragOptions.lockAxis === 'start'\n ? dragOptions.startAxis\n : dragOptions.lockAxis)}\n : null;\n },\n\n getCursor: function () {\n return 'move';\n },\n};\n\nInteraction.signals.on('before-action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n interaction.curCoords.page.y = interaction.startCoords.page.y;\n interaction.curCoords.client.y = interaction.startCoords.client.y;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vx);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vx);\n interaction.pointerDelta.client.vy = 0;\n interaction.pointerDelta.page.vy = 0;\n }\n else if (axis === 'y') {\n interaction.curCoords.page.x = interaction.startCoords.page.x;\n interaction.curCoords.client.x = interaction.startCoords.client.x;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vy);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vy);\n interaction.pointerDelta.client.vx = 0;\n interaction.pointerDelta.page.vx = 0;\n }\n});\n\n// dragmove\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'dragmove') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n iEvent.pageY = interaction.startCoords.page.y;\n iEvent.clientY = interaction.startCoords.client.y;\n iEvent.dy = 0;\n }\n else if (axis === 'y') {\n iEvent.pageX = interaction.startCoords.page.x;\n iEvent.clientX = interaction.startCoords.client.x;\n iEvent.dx = 0;\n }\n});\n\n/*\\\n * Interactable.draggable\n [ method ]\n *\n * Gets or sets whether drag actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of drag events\n | var isDraggable = interact('ul li').draggable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on drag events (object makes the Interactable draggable)\n = (object) This Interactable\n | interact(element).draggable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // the axis in which the first movement must be\n | // for the drag sequence to start\n | // 'xy' by default - any direction\n | startAxis: 'x' || 'y' || 'xy',\n |\n | // 'xy' by default - don't restrict to one axis (move in any direction)\n | // 'x' or 'y' to restrict movement to either axis\n | // 'start' to restrict movement to the axis the drag started in\n | lockAxis: 'x' || 'y' || 'xy' || 'start',\n |\n | // max number of drags that can happen concurrently\n | // with elements of this Interactable. Infinity by default\n | max: Infinity,\n |\n | // max number of drags that can target the same element+Interactable\n | // 1 by default\n | maxPerElement: 2\n | });\n\\*/\nInteractable.prototype.draggable = function (options) {\n if (utils.is.object(options)) {\n this.options.drag.enabled = options.enabled === false? false: true;\n this.setPerAction('drag', options);\n this.setOnEvents('drag', options);\n\n if (/^(xy|x|y|start)$/.test(options.lockAxis)) {\n this.options.drag.lockAxis = options.lockAxis;\n }\n if (/^(xy|x|y)$/.test(options.startAxis)) {\n this.options.drag.startAxis = options.startAxis;\n }\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drag.enabled = options;\n\n if (!options) {\n this.ondragstart = this.ondragstart = this.ondragend = null;\n }\n\n return this;\n }\n\n return this.options.drag;\n};\n\nactions.drag = drag;\nactions.names.push('drag');\nutils.merge(Interactable.eventTypes, [\n 'dragstart',\n 'dragmove',\n 'draginertiastart',\n 'draginertiaresume',\n 'dragend',\n]);\nactions.methodDict.drag = 'draggable';\n\ndefaultOptions.drag = drag.defaults;\n\nmodule.exports = drag;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst scope = require('../scope');\nconst interact = require('../interact');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drop = {\n defaults: {\n enabled: false,\n accept : null,\n overlap: 'pointer',\n },\n};\n\nlet dynamicDrop = false;\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // reset active dropzones\n interaction.activeDrops.dropzones = [];\n interaction.activeDrops.elements = [];\n interaction.activeDrops.rects = [];\n\n interaction.dropEvents = null;\n\n if (!interaction.dynamicDrop) {\n setActiveDrops(interaction, interaction.element);\n }\n\n const dragEvent = interaction.prevEvent;\n const dropEvents = getDropEvents(interaction, event, dragEvent);\n\n if (dropEvents.activate) {\n fireActiveDrops(interaction, dropEvents.activate);\n }\n});\n\nInteractEvent.signals.on('new', function ({ interaction, iEvent, event }) {\n if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { return; }\n\n const draggableElement = interaction.element;\n const dragEvent = iEvent;\n const dropResult = getDrop(dragEvent, event, draggableElement);\n\n interaction.dropTarget = dropResult.dropzone;\n interaction.dropElement = dropResult.element;\n\n interaction.dropEvents = getDropEvents(interaction, event, dragEvent);\n});\n\nInteraction.signals.on('action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n fireDropEvents(interaction, interaction.dropEvents);\n});\n\nInteraction.signals.on('action-end', function ({ interaction }) {\n if (interaction.prepared.name === 'drag') {\n fireDropEvents(interaction, interaction.dropEvents);\n }\n});\n\nInteraction.signals.on('stop-drag', function ({ interaction }) {\n interaction.activeDrops.dropzones =\n interaction.activeDrops.elements =\n interaction.activeDrops.rects =\n interaction.dropEvents = null;\n});\n\nfunction collectDrops (interaction, element) {\n const drops = [];\n const elements = [];\n\n element = element || interaction.element;\n\n // collect all dropzones and their elements which qualify for a drop\n for (const current of scope.interactables) {\n if (!current.options.drop.enabled) { continue; }\n\n const accept = current.options.drop.accept;\n\n // test the draggable element against the dropzone's accept setting\n if ((utils.is.element(accept) && accept !== element)\n || (utils.is.string(accept)\n && !utils.matchesSelector(element, accept))) {\n\n continue;\n }\n\n // query for new elements if necessary\n const dropElements = utils.is.string(current.target)\n ? current._context.querySelectorAll(current.target)\n : [current.target];\n\n for (let i = 0; i < dropElements.length; i++) {\n const currentElement = dropElements[i];\n\n if (currentElement !== element) {\n drops.push(current);\n elements.push(currentElement);\n }\n }\n }\n\n return {\n elements,\n dropzones: drops,\n };\n}\n\nfunction fireActiveDrops (interaction, event) {\n let prevElement;\n\n // loop through all active dropzones and trigger event\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n const current = interaction.activeDrops.dropzones[i];\n const currentElement = interaction.activeDrops.elements [i];\n\n // prevent trigger of duplicate events on same element\n if (currentElement !== prevElement) {\n // set current element as event target\n event.target = currentElement;\n current.fire(event);\n }\n prevElement = currentElement;\n }\n}\n\n// Collect a new set of possible drops and save them in activeDrops.\n// setActiveDrops should always be called when a drag has just started or a\n// drag event happens while dynamicDrop is true\nfunction setActiveDrops (interaction, dragElement) {\n // get dropzones and their elements that could receive the draggable\n const possibleDrops = collectDrops(interaction, dragElement, true);\n\n interaction.activeDrops.dropzones = possibleDrops.dropzones;\n interaction.activeDrops.elements = possibleDrops.elements;\n interaction.activeDrops.rects = [];\n\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n interaction.activeDrops.rects[i] =\n interaction.activeDrops.dropzones[i].getRect(interaction.activeDrops.elements[i]);\n }\n}\n\nfunction getDrop (dragEvent, event, dragElement) {\n const interaction = dragEvent.interaction;\n const validDrops = [];\n\n if (dynamicDrop) {\n setActiveDrops(interaction, dragElement);\n }\n\n // collect all dropzones and their elements which qualify for a drop\n for (let j = 0; j < interaction.activeDrops.dropzones.length; j++) {\n const current = interaction.activeDrops.dropzones[j];\n const currentElement = interaction.activeDrops.elements [j];\n const rect = interaction.activeDrops.rects [j];\n\n validDrops.push(current.dropCheck(dragEvent, event, interaction.target, dragElement, currentElement, rect)\n ? currentElement\n : null);\n }\n\n // get the most appropriate dropzone based on DOM depth and order\n const dropIndex = utils.indexOfDeepestElement(validDrops);\n\n return {\n dropzone: interaction.activeDrops.dropzones[dropIndex] || null,\n element : interaction.activeDrops.elements [dropIndex] || null,\n };\n}\n\nfunction getDropEvents (interaction, pointerEvent, dragEvent) {\n const dropEvents = {\n enter : null,\n leave : null,\n activate : null,\n deactivate: null,\n move : null,\n drop : null,\n };\n\n const tmpl = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n };\n\n if (interaction.dropElement !== interaction.prevDropElement) {\n // if there was a prevDropTarget, create a dragleave event\n if (interaction.prevDropTarget) {\n dropEvents.leave = utils.extend({ type: 'dragleave' }, tmpl);\n\n dragEvent.dragLeave = dropEvents.leave.target = interaction.prevDropElement;\n dragEvent.prevDropzone = dropEvents.leave.dropzone = interaction.prevDropTarget;\n }\n // if the dropTarget is not null, create a dragenter event\n if (interaction.dropTarget) {\n dropEvents.enter = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n type : 'dragenter',\n };\n\n dragEvent.dragEnter = interaction.dropElement;\n dragEvent.dropzone = interaction.dropTarget;\n }\n }\n\n if (dragEvent.type === 'dragend' && interaction.dropTarget) {\n dropEvents.drop = utils.extend({ type: 'drop' }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n dragEvent.relatedTarget = interaction.dropElement;\n }\n if (dragEvent.type === 'dragstart') {\n dropEvents.activate = utils.extend({ type: 'dropactivate' }, tmpl);\n\n dropEvents.activate.target = null;\n dropEvents.activate.dropzone = null;\n }\n if (dragEvent.type === 'dragend') {\n dropEvents.deactivate = utils.extend({ type: 'dropdeactivate' }, tmpl);\n\n dropEvents.deactivate.target = null;\n dropEvents.deactivate.dropzone = null;\n }\n if (dragEvent.type === 'dragmove' && interaction.dropTarget) {\n dropEvents.move = utils.extend({\n dragmove : dragEvent,\n type : 'dropmove',\n }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n }\n\n return dropEvents;\n}\n\nfunction fireDropEvents (interaction, dropEvents) {\n if (dropEvents.leave) { interaction.prevDropTarget.fire(dropEvents.leave); }\n if (dropEvents.move ) { interaction.dropTarget.fire(dropEvents.move ); }\n if (dropEvents.enter) { interaction.dropTarget.fire(dropEvents.enter); }\n if (dropEvents.drop ) { interaction.dropTarget.fire(dropEvents.drop ); }\n if (dropEvents.deactivate) {\n fireActiveDrops(interaction, dropEvents.deactivate);\n }\n\n interaction.prevDropTarget = interaction.dropTarget;\n interaction.prevDropElement = interaction.dropElement;\n}\n\n/*\\\n * Interactable.dropzone\n [ method ]\n *\n * Returns or sets whether elements can be dropped onto this\n * Interactable to trigger drop events\n *\n * Dropzones can receive the following events:\n * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends\n * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone\n * - `dragmove` when a draggable that has entered the dropzone is moved\n * - `drop` when a draggable is dropped into this dropzone\n *\n * Use the `accept` option to allow only elements that match the given CSS\n * selector or element. The value can be:\n *\n * - **an Element** - only that element can be dropped into this dropzone.\n * - **a string**, - the element being dragged must match it as a CSS selector.\n * - **`null`** - accept options is cleared - it accepts any element.\n *\n * Use the `overlap` option to set how drops are checked for. The allowed\n * values are:\n *\n * - `'pointer'`, the pointer must be over the dropzone (default)\n * - `'center'`, the draggable element's center must be over the dropzone\n * - a number from 0-1 which is the `(intersection area) / (draggable area)`.\n * e.g. `0.5` for drop to happen when half of the area of the draggable is\n * over the dropzone\n *\n * Use the `checker` option to specify a function to check if a dragged\n * element is over this Interactable.\n *\n | interact(target)\n | .dropChecker(function(dragEvent, // related dragmove or dragend event\n | event, // TouchEvent/PointerEvent/MouseEvent\n | dropped, // bool result of the default checker\n | dropzone, // dropzone Interactable\n | dropElement, // dropzone elemnt\n | draggable, // draggable Interactable\n | draggableElement) {// draggable element\n |\n | return dropped && event.target.hasAttribute('allow-drop');\n | }\n *\n *\n - options (boolean | object | null) #optional The new value to be set.\n | interact('.drop').dropzone({\n | accept: '.can-drop' || document.getElementById('single-drop'),\n | overlap: 'pointer' || 'center' || zeroToOne\n | }\n = (boolean | object) The current setting or this Interactable\n\\*/\nInteractable.prototype.dropzone = function (options) {\n if (utils.is.object(options)) {\n this.options.drop.enabled = options.enabled === false? false: true;\n\n if (utils.is.function(options.ondrop) ) { this.events.ondrop = options.ondrop ; }\n if (utils.is.function(options.ondropactivate) ) { this.events.ondropactivate = options.ondropactivate ; }\n if (utils.is.function(options.ondropdeactivate)) { this.events.ondropdeactivate = options.ondropdeactivate; }\n if (utils.is.function(options.ondragenter) ) { this.events.ondragenter = options.ondragenter ; }\n if (utils.is.function(options.ondragleave) ) { this.events.ondragleave = options.ondragleave ; }\n if (utils.is.function(options.ondropmove) ) { this.events.ondropmove = options.ondropmove ; }\n\n if (/^(pointer|center)$/.test(options.overlap)) {\n this.options.drop.overlap = options.overlap;\n }\n else if (utils.is.number(options.overlap)) {\n this.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0);\n }\n if ('accept' in options) {\n this.options.drop.accept = options.accept;\n }\n if ('checker' in options) {\n this.options.drop.checker = options.checker;\n }\n\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drop.enabled = options;\n\n if (!options) {\n this.ondragenter = this.ondragleave = this.ondrop\n = this.ondropactivate = this.ondropdeactivate = null;\n }\n\n return this;\n }\n\n return this.options.drop;\n};\n\nInteractable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) {\n let dropped = false;\n\n // if the dropzone has no rect (eg. display: none)\n // call the custom dropChecker or just return false\n if (!(rect = rect || this.getRect(dropElement))) {\n return (this.options.drop.checker\n ? this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement)\n : false);\n }\n\n const dropOverlap = this.options.drop.overlap;\n\n if (dropOverlap === 'pointer') {\n const origin = utils.getOriginXY(draggable, draggableElement, 'drag');\n const page = utils.getPageXY(dragEvent);\n\n page.x += origin.x;\n page.y += origin.y;\n\n const horizontal = (page.x > rect.left) && (page.x < rect.right);\n const vertical = (page.y > rect.top ) && (page.y < rect.bottom);\n\n dropped = horizontal && vertical;\n }\n\n const dragRect = draggable.getRect(draggableElement);\n\n if (dragRect && dropOverlap === 'center') {\n const cx = dragRect.left + dragRect.width / 2;\n const cy = dragRect.top + dragRect.height / 2;\n\n dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom;\n }\n\n if (dragRect && utils.is.number(dropOverlap)) {\n const overlapArea = (Math.max(0, Math.min(rect.right , dragRect.right ) - Math.max(rect.left, dragRect.left))\n * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top , dragRect.top )));\n\n const overlapRatio = overlapArea / (dragRect.width * dragRect.height);\n\n dropped = overlapRatio >= dropOverlap;\n }\n\n if (this.options.drop.checker) {\n dropped = this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement);\n }\n\n return dropped;\n};\n\nInteractable.signals.on('unset', function ({ interactable }) {\n interactable.dropzone(false);\n});\n\nInteractable.settingsMethods.push('dropChecker');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.dropTarget = null; // the dropzone a drag target might be dropped into\n interaction.dropElement = null; // the element at the time of checking\n interaction.prevDropTarget = null; // the dropzone that was recently dragged away from\n interaction.prevDropElement = null; // the element at the time of checking\n interaction.dropEvents = null; // the dropEvents related to the current drag event\n\n interaction.activeDrops = {\n dropzones: [], // the dropzones that are mentioned below\n elements : [], // elements of dropzones that accept the target draggable\n rects : [], // the rects of the elements mentioned above\n };\n\n});\n\nInteraction.signals.on('stop', function ({ interaction }) {\n interaction.dropTarget = interaction.dropElement =\n interaction.prevDropTarget = interaction.prevDropElement = null;\n});\n\n/*\\\n * interact.dynamicDrop\n [ method ]\n *\n * Returns or sets whether the dimensions of dropzone elements are\n * calculated on every dragmove or only on dragstart for the default\n * dropChecker\n *\n - newValue (boolean) #optional True to check on each move. False to check only before start\n = (boolean | interact) The current setting or interact\n\\*/\ninteract.dynamicDrop = function (newValue) {\n if (utils.is.bool(newValue)) {\n //if (dragging && dynamicDrop !== newValue && !newValue) {\n //calcRects(dropzones);\n //}\n\n dynamicDrop = newValue;\n\n return interact;\n }\n return dynamicDrop;\n};\n\nutils.merge(Interactable.eventTypes, [\n 'dragenter',\n 'dragleave',\n 'dropactivate',\n 'dropdeactivate',\n 'dropmove',\n 'drop',\n]);\nactions.methodDict.drop = 'dropzone';\n\ndefaultOptions.drop = drop.defaults;\n\nmodule.exports = drop;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst gesture = {\n defaults: {\n enabled : false,\n origin : null,\n restrict: null,\n },\n\n checker: function (pointer, event, interactable, element, interaction) {\n if (interaction.pointerIds.length >= 2) {\n return { name: 'gesture' };\n }\n\n return null;\n },\n\n getCursor: function () {\n return '';\n },\n};\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturestart') { return; }\n iEvent.ds = 0;\n\n interaction.gesture.startDistance = interaction.gesture.prevDistance = iEvent.distance;\n interaction.gesture.startAngle = interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.scale = 1;\n});\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturemove') { return; }\n\n iEvent.ds = iEvent.scale - interaction.gesture.scale;\n\n interaction.target.fire(iEvent);\n\n interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.prevDistance = iEvent.distance;\n\n if (iEvent.scale !== Infinity\n && iEvent.scale !== null\n && iEvent.scale !== undefined\n && !isNaN(iEvent.scale)) {\n\n interaction.gesture.scale = iEvent.scale;\n }\n});\n\n/*\\\n * Interactable.gesturable\n [ method ]\n *\n * Gets or sets whether multitouch gestures can be performed on the\n * Interactable's element\n *\n = (boolean) Indicates if this can be the target of gesture events\n | var isGestureable = interact(element).gesturable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on gesture events (makes the Interactable gesturable)\n = (object) this Interactable\n | interact(element).gesturable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // limit multiple gestures.\n | // See the explanation in @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n\\*/\nInteractable.prototype.gesturable = function (options) {\n if (utils.is.object(options)) {\n this.options.gesture.enabled = options.enabled === false? false: true;\n this.setPerAction('gesture', options);\n this.setOnEvents('gesture', options);\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.gesture.enabled = options;\n\n if (!options) {\n this.ongesturestart = this.ongesturestart = this.ongestureend = null;\n }\n\n return this;\n }\n\n return this.options.gesture;\n};\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action, event, starting, ending, deltaSource }) {\n if (action !== 'gesture') { return; }\n\n const pointers = interaction.pointers;\n\n iEvent.touches = [pointers[0], pointers[1]];\n\n if (starting) {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = 1;\n iEvent.ds = 0;\n iEvent.angle = utils.touchAngle(pointers, undefined, deltaSource);\n iEvent.da = 0;\n }\n else if (ending || event instanceof InteractEvent) {\n iEvent.distance = interaction.prevEvent.distance;\n iEvent.box = interaction.prevEvent.box;\n iEvent.scale = interaction.prevEvent.scale;\n iEvent.ds = iEvent.scale - 1;\n iEvent.angle = interaction.prevEvent.angle;\n iEvent.da = iEvent.angle - interaction.gesture.startAngle;\n }\n else {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = iEvent.distance / interaction.gesture.startDistance;\n iEvent.angle = utils.touchAngle(pointers, interaction.gesture.prevAngle, deltaSource);\n\n iEvent.ds = iEvent.scale - interaction.gesture.prevScale;\n iEvent.da = iEvent.angle - interaction.gesture.prevAngle;\n }\n});\n\nInteraction.signals.on('new', function (interaction) {\n interaction.gesture = {\n start: { x: 0, y: 0 },\n\n startDistance: 0, // distance between two touches of touchStart\n prevDistance : 0,\n distance : 0,\n\n scale: 1, // gesture.distance / gesture.startDistance\n\n startAngle: 0, // angle of line joining two touches\n prevAngle : 0, // angle of the previous gesture event\n };\n});\n\nactions.gesture = gesture;\nactions.names.push('gesture');\nutils.merge(Interactable.eventTypes, [\n 'gesturestart',\n 'gesturemove',\n 'gestureend',\n]);\nactions.methodDict.gesture = 'gesturable';\n\ndefaultOptions.gesture = gesture.defaults;\n\nmodule.exports = gesture;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\n// Less Precision with touch input\nconst defaultMargin = browser.supportsTouch || browser.supportsPointerEvent? 20: 10;\n\nconst resize = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n square: false,\n preserveAspectRatio: false,\n axis: 'xy',\n\n // use default margin\n margin: NaN,\n\n // object with props left, right, top, bottom which are\n // true/false values to resize when the pointer is over that edge,\n // CSS selectors to match the handles for each direction\n // or the Elements for each handle\n edges: null,\n\n // a value of 'none' will limit the resize rect to a minimum of 0x0\n // 'negate' will alow the rect to have negative width/height\n // 'reposition' will keep the width/height positive by swapping\n // the top and bottom edges and/or swapping the left and right edges\n invert: 'none',\n },\n\n checker: function (pointer, event, interactable, element, interaction, rect) {\n if (!rect) { return null; }\n\n const page = utils.extend({}, interaction.curCoords.page);\n const options = interactable.options;\n\n if (options.resize.enabled) {\n const resizeOptions = options.resize;\n const resizeEdges = { left: false, right: false, top: false, bottom: false };\n\n // if using resize.edges\n if (utils.is.object(resizeOptions.edges)) {\n for (const edge in resizeEdges) {\n resizeEdges[edge] = checkResizeEdge(edge,\n resizeOptions.edges[edge],\n page,\n interaction._eventTarget,\n element,\n rect,\n resizeOptions.margin || defaultMargin);\n }\n\n resizeEdges.left = resizeEdges.left && !resizeEdges.right;\n resizeEdges.top = resizeEdges.top && !resizeEdges.bottom;\n\n if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) {\n return {\n name: 'resize',\n edges: resizeEdges,\n };\n }\n }\n else {\n const right = options.resize.axis !== 'y' && page.x > (rect.right - defaultMargin);\n const bottom = options.resize.axis !== 'x' && page.y > (rect.bottom - defaultMargin);\n\n if (right || bottom) {\n return {\n name: 'resize',\n axes: (right? 'x' : '') + (bottom? 'y' : ''),\n };\n }\n }\n }\n\n return null;\n },\n\n cursors: (browser.isIe9OrOlder ? {\n x : 'e-resize',\n y : 's-resize',\n xy: 'se-resize',\n\n top : 'n-resize',\n left : 'w-resize',\n bottom : 's-resize',\n right : 'e-resize',\n topleft : 'se-resize',\n bottomright: 'se-resize',\n topright : 'ne-resize',\n bottomleft : 'ne-resize',\n } : {\n x : 'ew-resize',\n y : 'ns-resize',\n xy: 'nwse-resize',\n\n top : 'ns-resize',\n left : 'ew-resize',\n bottom : 'ns-resize',\n right : 'ew-resize',\n topleft : 'nwse-resize',\n bottomright: 'nwse-resize',\n topright : 'nesw-resize',\n bottomleft : 'nesw-resize',\n }),\n\n getCursor: function (action) {\n if (action.axis) {\n return resize.cursors[action.name + action.axis];\n }\n else if (action.edges) {\n let cursorKey = '';\n const edgeNames = ['top', 'bottom', 'left', 'right'];\n\n for (let i = 0; i < 4; i++) {\n if (action.edges[edgeNames[i]]) {\n cursorKey += edgeNames[i];\n }\n }\n\n return resize.cursors[cursorKey];\n }\n },\n};\n\n// resizestart\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'resizestart' || !interaction.prepared.edges) {\n return;\n }\n\n const startRect = interaction.target.getRect(interaction.element);\n const resizeOptions = interaction.target.options.resize;\n\n /*\n * When using the `resizable.square` or `resizable.preserveAspectRatio` options, resizing from one edge\n * will affect another. E.g. with `resizable.square`, resizing to make the right edge larger will make\n * the bottom edge larger by the same amount. We call these 'linked' edges. Any linked edges will depend\n * on the active edges and the edge being interacted with.\n */\n if (resizeOptions.square || resizeOptions.preserveAspectRatio) {\n const linkedEdges = utils.extend({}, interaction.prepared.edges);\n\n linkedEdges.top = linkedEdges.top || (linkedEdges.left && !linkedEdges.bottom);\n linkedEdges.left = linkedEdges.left || (linkedEdges.top && !linkedEdges.right );\n linkedEdges.bottom = linkedEdges.bottom || (linkedEdges.right && !linkedEdges.top );\n linkedEdges.right = linkedEdges.right || (linkedEdges.bottom && !linkedEdges.left );\n\n interaction.prepared._linkedEdges = linkedEdges;\n }\n else {\n interaction.prepared._linkedEdges = null;\n }\n\n // if using `resizable.preserveAspectRatio` option, record aspect ratio at the start of the resize\n if (resizeOptions.preserveAspectRatio) {\n interaction.resizeStartAspectRatio = startRect.width / startRect.height;\n }\n\n interaction.resizeRects = {\n start : startRect,\n current : utils.extend({}, startRect),\n inverted : utils.extend({}, startRect),\n previous : utils.extend({}, startRect),\n delta : {\n left: 0, right : 0, width : 0,\n top : 0, bottom: 0, height: 0,\n },\n };\n\n iEvent.rect = interaction.resizeRects.inverted;\n iEvent.deltaRect = interaction.resizeRects.delta;\n});\n\n// resizemove\nInteractEvent.signals.on('new', function ({ iEvent, phase, interaction }) {\n if (phase !== 'move' || !interaction.prepared.edges) { return; }\n\n const resizeOptions = interaction.target.options.resize;\n const invert = resizeOptions.invert;\n const invertible = invert === 'reposition' || invert === 'negate';\n\n let edges = interaction.prepared.edges;\n\n const start = interaction.resizeRects.start;\n const current = interaction.resizeRects.current;\n const inverted = interaction.resizeRects.inverted;\n const delta = interaction.resizeRects.delta;\n const previous = utils.extend(interaction.resizeRects.previous, inverted);\n const originalEdges = edges;\n\n let dx = iEvent.dx;\n let dy = iEvent.dy;\n\n if (resizeOptions.preserveAspectRatio || resizeOptions.square) {\n // `resize.preserveAspectRatio` takes precedence over `resize.square`\n const startAspectRatio = resizeOptions.preserveAspectRatio\n ? interaction.resizeStartAspectRatio\n : 1;\n\n edges = interaction.prepared._linkedEdges;\n\n if ((originalEdges.left && originalEdges.bottom)\n || (originalEdges.right && originalEdges.top)) {\n dy = -dx / startAspectRatio;\n }\n else if (originalEdges.left || originalEdges.right ) { dy = dx / startAspectRatio; }\n else if (originalEdges.top || originalEdges.bottom) { dx = dy * startAspectRatio; }\n }\n\n // update the 'current' rect without modifications\n if (edges.top ) { current.top += dy; }\n if (edges.bottom) { current.bottom += dy; }\n if (edges.left ) { current.left += dx; }\n if (edges.right ) { current.right += dx; }\n\n if (invertible) {\n // if invertible, copy the current rect\n utils.extend(inverted, current);\n\n if (invert === 'reposition') {\n // swap edge values if necessary to keep width/height positive\n let swap;\n\n if (inverted.top > inverted.bottom) {\n swap = inverted.top;\n\n inverted.top = inverted.bottom;\n inverted.bottom = swap;\n }\n if (inverted.left > inverted.right) {\n swap = inverted.left;\n\n inverted.left = inverted.right;\n inverted.right = swap;\n }\n }\n }\n else {\n // if not invertible, restrict to minimum of 0x0 rect\n inverted.top = Math.min(current.top, start.bottom);\n inverted.bottom = Math.max(current.bottom, start.top);\n inverted.left = Math.min(current.left, start.right);\n inverted.right = Math.max(current.right, start.left);\n }\n\n inverted.width = inverted.right - inverted.left;\n inverted.height = inverted.bottom - inverted.top ;\n\n for (const edge in inverted) {\n delta[edge] = inverted[edge] - previous[edge];\n }\n\n iEvent.edges = interaction.prepared.edges;\n iEvent.rect = inverted;\n iEvent.deltaRect = delta;\n});\n\n/*\\\n * Interactable.resizable\n [ method ]\n *\n * Gets or sets whether resize actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of resize elements\n | var isResizeable = interact('input[type=text]').resizable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on resize events (object makes the Interactable resizable)\n = (object) This Interactable\n | interact(element).resizable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | edges: {\n | top : true, // Use pointer coords to check for resize.\n | left : false, // Disable resizing from left edge.\n | bottom: '.resize-s',// Resize if pointer target matches selector\n | right : handleEl // Resize if pointer target is the given Element\n | },\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height are adjusted at a 1:1 ratio.\n | square: false,\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height maintain the aspect ratio they had when resizing started.\n | preserveAspectRatio: false,\n |\n | // a value of 'none' will limit the resize rect to a minimum of 0x0\n | // 'negate' will allow the rect to have negative width/height\n | // 'reposition' will keep the width/height positive by swapping\n | // the top and bottom edges and/or swapping the left and right edges\n | invert: 'none' || 'negate' || 'reposition'\n |\n | // limit multiple resizes.\n | // See the explanation in the @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n \\*/\nInteractable.prototype.resizable = function (options) {\n if (utils.is.object(options)) {\n this.options.resize.enabled = options.enabled === false? false: true;\n this.setPerAction('resize', options);\n this.setOnEvents('resize', options);\n\n if (/^x$|^y$|^xy$/.test(options.axis)) {\n this.options.resize.axis = options.axis;\n }\n else if (options.axis === null) {\n this.options.resize.axis = defaultOptions.resize.axis;\n }\n\n if (utils.is.bool(options.preserveAspectRatio)) {\n this.options.resize.preserveAspectRatio = options.preserveAspectRatio;\n }\n else if (utils.is.bool(options.square)) {\n this.options.resize.square = options.square;\n }\n\n return this;\n }\n if (utils.is.bool(options)) {\n this.options.resize.enabled = options;\n\n if (!options) {\n this.onresizestart = this.onresizestart = this.onresizeend = null;\n }\n\n return this;\n }\n return this.options.resize;\n};\n\nfunction checkResizeEdge (name, value, page, element, interactableElement, rect, margin) {\n // false, '', undefined, null\n if (!value) { return false; }\n\n // true value, use pointer coords and element rect\n if (value === true) {\n // if dimensions are negative, \"switch\" edges\n const width = utils.is.number(rect.width )? rect.width : rect.right - rect.left;\n const height = utils.is.number(rect.height)? rect.height : rect.bottom - rect.top ;\n\n if (width < 0) {\n if (name === 'left' ) { name = 'right'; }\n else if (name === 'right') { name = 'left' ; }\n }\n if (height < 0) {\n if (name === 'top' ) { name = 'bottom'; }\n else if (name === 'bottom') { name = 'top' ; }\n }\n\n if (name === 'left' ) { return page.x < ((width >= 0? rect.left: rect.right ) + margin); }\n if (name === 'top' ) { return page.y < ((height >= 0? rect.top : rect.bottom) + margin); }\n\n if (name === 'right' ) { return page.x > ((width >= 0? rect.right : rect.left) - margin); }\n if (name === 'bottom') { return page.y > ((height >= 0? rect.bottom: rect.top ) - margin); }\n }\n\n // the remaining checks require an element\n if (!utils.is.element(element)) { return false; }\n\n return utils.is.element(value)\n // the value is an element to use as a resize handle\n ? value === element\n // otherwise check if element matches value as selector\n : utils.matchesUpTo(element, value, interactableElement);\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.resizeAxes = 'xy';\n});\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action }) {\n if (action !== 'resize' || !interaction.resizeAxes) { return; }\n\n const options = interaction.target.options;\n\n if (options.resize.square) {\n if (interaction.resizeAxes === 'y') {\n iEvent.dx = iEvent.dy;\n }\n else {\n iEvent.dy = iEvent.dx;\n }\n iEvent.axes = 'xy';\n }\n else {\n iEvent.axes = interaction.resizeAxes;\n\n if (interaction.resizeAxes === 'x') {\n iEvent.dy = 0;\n }\n else if (interaction.resizeAxes === 'y') {\n iEvent.dx = 0;\n }\n }\n});\n\nactions.resize = resize;\nactions.names.push('resize');\nutils.merge(Interactable.eventTypes, [\n 'resizestart',\n 'resizemove',\n 'resizeinertiastart',\n 'resizeinertiaresume',\n 'resizeend',\n]);\nactions.methodDict.resize = 'resizable';\n\ndefaultOptions.resize = resize.defaults;\n\nmodule.exports = resize;\n","const raf = require('./utils/raf');\nconst getWindow = require('./utils/window').getWindow;\nconst is = require('./utils/is');\nconst domUtils = require('./utils/domUtils');\nconst Interaction = require('./Interaction');\nconst defaultOptions = require('./defaultOptions');\n\nconst autoScroll = {\n defaults: {\n enabled : false,\n container: null, // the item that is scrolled (Window or HTMLElement)\n margin : 60,\n speed : 300, // the scroll speed in pixels per second\n },\n\n interaction: null,\n i: null, // the handle returned by window.setInterval\n x: 0, y: 0, // Direction each pulse is to scroll in\n\n isScrolling: false,\n prevTime: 0,\n\n start: function (interaction) {\n autoScroll.isScrolling = true;\n raf.cancel(autoScroll.i);\n\n autoScroll.interaction = interaction;\n autoScroll.prevTime = new Date().getTime();\n autoScroll.i = raf.request(autoScroll.scroll);\n },\n\n stop: function () {\n autoScroll.isScrolling = false;\n raf.cancel(autoScroll.i);\n },\n\n // scroll the window by the values in scroll.x/y\n scroll: function () {\n const options = autoScroll.interaction.target.options[autoScroll.interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(autoScroll.interaction.element);\n const now = new Date().getTime();\n // change in time in seconds\n const dt = (now - autoScroll.prevTime) / 1000;\n // displacement\n const s = options.speed * dt;\n\n if (s >= 1) {\n if (is.window(container)) {\n container.scrollBy(autoScroll.x * s, autoScroll.y * s);\n }\n else if (container) {\n container.scrollLeft += autoScroll.x * s;\n container.scrollTop += autoScroll.y * s;\n }\n\n autoScroll.prevTime = now;\n }\n\n if (autoScroll.isScrolling) {\n raf.cancel(autoScroll.i);\n autoScroll.i = raf.request(autoScroll.scroll);\n }\n },\n check: function (interactable, actionName) {\n const options = interactable.options;\n\n return options[actionName].autoScroll && options[actionName].autoScroll.enabled;\n },\n onInteractionMove: function ({ interaction, pointer }) {\n if (!(interaction.interacting()\n && autoScroll.check(interaction.target, interaction.prepared.name))) {\n return;\n }\n\n if (interaction.simulation) {\n autoScroll.x = autoScroll.y = 0;\n return;\n }\n\n let top;\n let right;\n let bottom;\n let left;\n\n const options = interaction.target.options[interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(interaction.element);\n\n if (is.window(container)) {\n left = pointer.clientX < autoScroll.margin;\n top = pointer.clientY < autoScroll.margin;\n right = pointer.clientX > container.innerWidth - autoScroll.margin;\n bottom = pointer.clientY > container.innerHeight - autoScroll.margin;\n }\n else {\n const rect = domUtils.getElementClientRect(container);\n\n left = pointer.clientX < rect.left + autoScroll.margin;\n top = pointer.clientY < rect.top + autoScroll.margin;\n right = pointer.clientX > rect.right - autoScroll.margin;\n bottom = pointer.clientY > rect.bottom - autoScroll.margin;\n }\n\n autoScroll.x = (right ? 1: left? -1: 0);\n autoScroll.y = (bottom? 1: top? -1: 0);\n\n if (!autoScroll.isScrolling) {\n // set the autoScroll properties to those of the target\n autoScroll.margin = options.margin;\n autoScroll.speed = options.speed;\n\n autoScroll.start(interaction);\n }\n },\n};\n\nInteraction.signals.on('stop-active', function () {\n autoScroll.stop();\n});\n\nInteraction.signals.on('action-move', autoScroll.onInteractionMove);\n\ndefaultOptions.perAction.autoScroll = autoScroll.defaults;\n\nmodule.exports = autoScroll;\n","const Interactable = require('../Interactable');\nconst actions = require('../actions/base');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.ignoreFrom\n [ method ]\n *\n * If the target of the `mousedown`, `pointerdown` or `touchstart`\n * event or any of it's parents match the given CSS selector or\n * Element, no drag/resize/gesture is started.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to not ignore any elements\n = (string | Element | object) The current ignoreFrom value or this Interactable\n **\n | interact(element, { ignoreFrom: document.getElementById('no-action') });\n | // or\n | interact(element).ignoreFrom('input, textarea, a');\n\\*/\nInteractable.prototype.ignoreFrom = function (newValue) {\n return this._backCompatOption('ignoreFrom', newValue);\n};\n\n/*\\\n * Interactable.allowFrom\n [ method ]\n *\n * A drag/resize/gesture is started only If the target of the\n * `mousedown`, `pointerdown` or `touchstart` event or any of it's\n * parents match the given CSS selector or Element.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to allow from any element\n = (string | Element | object) The current allowFrom value or this Interactable\n **\n | interact(element, { allowFrom: document.getElementById('drag-handle') });\n | // or\n | interact(element).allowFrom('.handle');\n\\*/\nInteractable.prototype.allowFrom = function (newValue) {\n return this._backCompatOption('allowFrom', newValue);\n};\n\nInteractable.prototype.testIgnore = function (ignoreFrom, interactableElement, element) {\n if (!ignoreFrom || !is.element(element)) { return false; }\n\n if (is.string(ignoreFrom)) {\n return domUtils.matchesUpTo(element, ignoreFrom, interactableElement);\n }\n else if (is.element(ignoreFrom)) {\n return domUtils.nodeContains(ignoreFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testAllow = function (allowFrom, interactableElement, element) {\n if (!allowFrom) { return true; }\n\n if (!is.element(element)) { return false; }\n\n if (is.string(allowFrom)) {\n return domUtils.matchesUpTo(element, allowFrom, interactableElement);\n }\n else if (is.element(allowFrom)) {\n return domUtils.nodeContains(allowFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testIgnoreAllow = function (options, interactableElement, eventTarget) {\n return (!this.testIgnore(options.ignoreFrom, interactableElement, eventTarget)\n && this.testAllow(options.allowFrom, interactableElement, eventTarget));\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (event.buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\n","const interact = require('../interact');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst actions = require('../actions/base');\nconst defaultOptions = require('../defaultOptions');\nconst browser = require('../utils/browser');\nconst scope = require('../scope');\nconst utils = require('../utils');\nconst signals = require('../utils/Signals').new();\n\nrequire('./InteractableMethods');\n\nconst autoStart = {\n signals,\n withinInteractionLimit,\n // Allow this many interactions to happen simultaneously\n maxInteractions: Infinity,\n defaults: {\n perAction: {\n manualStart: false,\n max: Infinity,\n maxPerElement: 1,\n allowFrom: null,\n ignoreFrom: null,\n },\n },\n setActionDefaults: function (action) {\n utils.extend(action.defaults, autoStart.defaults.perAction);\n },\n};\n\n// set cursor style on mousedown\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget }) {\n if (interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\n// set cursor style on mousemove\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget }) {\n if (!interaction.mouse\n || interaction.pointerIsDown\n || interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\nInteraction.signals.on('move', function (arg) {\n const { interaction, event } = arg;\n\n if (!interaction.pointerIsDown\n || interaction.interacting()\n || !interaction.pointerWasMoved\n || !interaction.prepared.name) {\n return;\n }\n\n signals.fire('before-start', arg);\n\n const target = interaction.target;\n\n if (interaction.prepared.name && target) {\n // check manualStart and interaction limit\n if (target.options[interaction.prepared.name].manualStart\n || !withinInteractionLimit(target, interaction.element, interaction.prepared)) {\n interaction.stop(event);\n }\n else {\n interaction.start(interaction.prepared, target, interaction.element);\n }\n }\n});\n\n// Check if the current target supports the action.\n// If so, return the validated action. Otherwise, return null\nfunction validateAction (action, interactable, element, eventTarget) {\n if (utils.is.object(action)\n && interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget)\n && interactable.options[action.name].enabled\n && withinInteractionLimit(interactable, element, action)) {\n return action;\n }\n\n return null;\n}\n\nfunction validateSelector (interaction, pointer, event, matches, matchElements, eventTarget) {\n for (let i = 0, len = matches.length; i < len; i++) {\n const match = matches[i];\n const matchElement = matchElements[i];\n const action = validateAction(match.getAction(pointer, event, interaction, matchElement),\n match,\n matchElement,\n eventTarget);\n\n if (action) {\n return {\n action,\n target: match,\n element: matchElement,\n };\n }\n }\n\n return {};\n}\n\nfunction getActionInfo (interaction, pointer, event, eventTarget) {\n let matches = [];\n let matchElements = [];\n\n let element = eventTarget;\n let action = null;\n\n function pushMatches (interactable, selector, context) {\n const elements = (browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined);\n\n if (utils.matchesSelector(element, selector, elements)) {\n\n matches.push(interactable);\n matchElements.push(element);\n }\n }\n\n while (utils.is.element(element)) {\n matches = [];\n matchElements = [];\n\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && (action = validateAction(elementInteractable.getAction(pointer, event, interaction, element, eventTarget),\n elementInteractable,\n element,\n eventTarget))\n && !elementInteractable.options[action.name].manualStart) {\n return {\n element,\n action,\n target: elementInteractable,\n };\n }\n else {\n scope.interactables.forEachSelector(pushMatches, element);\n\n const actionInfo = validateSelector(interaction, pointer, event, matches, matchElements, eventTarget);\n\n if (actionInfo.action\n && !actionInfo.target.options[actionInfo.action.name].manualStart) {\n return actionInfo;\n }\n }\n\n element = utils.parentNode(element);\n }\n\n return {};\n}\n\nfunction prepare (interaction, { action, target, element }) {\n action = action || {};\n\n if (interaction.target && interaction.target.options.styleCursor) {\n interaction.target._doc.documentElement.style.cursor = '';\n }\n\n interaction.target = target;\n interaction.element = element;\n utils.copyAction(interaction.prepared, action);\n\n if (target && target.options.styleCursor) {\n const cursor = action? actions[action.name].getCursor(action) : '';\n interaction.target._doc.documentElement.style.cursor = cursor;\n }\n\n signals.fire('prepared', { interaction: interaction });\n}\n\nInteraction.signals.on('stop', function ({ interaction }) {\n const target = interaction.target;\n\n if (target && target.options.styleCursor) {\n target._doc.documentElement.style.cursor = '';\n }\n});\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (utils.is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (utils.is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n const buttons = event.buttons || ({\n 0: 1,\n 1: 4,\n 3: 8,\n 4: 16,\n })[event.button];\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\nfunction withinInteractionLimit (interactable, element, action) {\n const options = interactable.options;\n const maxActions = options[action.name].max;\n const maxPerElement = options[action.name].maxPerElement;\n let activeInteractions = 0;\n let targetCount = 0;\n let targetElementCount = 0;\n\n // no actions if any of these values == 0\n if (!(maxActions && maxPerElement && autoStart.maxInteractions)) { return; }\n\n for (let i = 0, len = scope.interactions.length; i < len; i++) {\n const interaction = scope.interactions[i];\n const otherAction = interaction.prepared.name;\n\n if (!interaction.interacting()) { continue; }\n\n activeInteractions++;\n\n if (activeInteractions >= autoStart.maxInteractions) {\n return false;\n }\n\n if (interaction.target !== interactable) { continue; }\n\n targetCount += (otherAction === action.name)|0;\n\n if (targetCount >= maxActions) {\n return false;\n }\n\n if (interaction.element === element) {\n targetElementCount++;\n\n if (otherAction !== action.name || targetElementCount >= maxPerElement) {\n return false;\n }\n }\n }\n\n return autoStart.maxInteractions > 0;\n}\n\n/*\\\n * interact.maxInteractions\n [ method ]\n **\n * Returns or sets the maximum number of concurrent interactions allowed.\n * By default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables\n * and elements, you need to enable it in the draggable, resizable and\n * gesturable `'max'` and `'maxPerElement'` options.\n **\n - newValue (number) #optional Any number. newValue <= 0 means no interactions.\n\\*/\ninteract.maxInteractions = function (newValue) {\n if (utils.is.number(newValue)) {\n autoStart.maxInteractions = newValue;\n\n return this;\n }\n\n return autoStart.maxInteractions;\n};\n\nInteractable.settingsMethods.push('styleCursor');\nInteractable.settingsMethods.push('actionChecker');\nInteractable.settingsMethods.push('ignoreFrom');\nInteractable.settingsMethods.push('allowFrom');\n\ndefaultOptions.base.actionChecker = null;\ndefaultOptions.base.styleCursor = true;\n\nutils.extend(defaultOptions.perAction, autoStart.defaults.perAction);\n\nmodule.exports = autoStart;\n","const autoStart = require('./base');\nconst Interaction = require('../Interaction');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.delayTimer = null;\n});\n\nautoStart.signals.on('prepared', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.delayTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.target, interaction.element);\n }, delay);\n }\n});\n\nInteraction.signals.on('move', function ({ interaction, duplicate }) {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.delayTimer);\n }\n});\n\n// prevent regular down->move autoStart\nautoStart.signals.on('before-start', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.prepared.name = null;\n }\n});\n","const autoStart = require('./base');\nconst scope = require('../scope');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\n\nconst { matchesSelector, parentNode } = require('../utils/domUtils');\n\nautoStart.setActionDefaults(require('../actions/drag'));\n\nautoStart.signals.on('before-start', function ({ interaction, eventTarget, dx, dy }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // check if a drag is in the correct axis\n const absX = Math.abs(dx);\n const absY = Math.abs(dy);\n const options = interaction.target.options.drag;\n const startAxis = options.startAxis;\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy');\n\n interaction.prepared.axis = options.lockAxis === 'start'\n ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n : options.lockAxis;\n\n // if the movement isn't in the startAxis of the interactable\n if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) {\n // cancel the prepared action\n interaction.prepared.name = null;\n\n // then try to get a drag from another ineractable\n\n if (!interaction.prepared.name) {\n\n let element = eventTarget;\n\n const getDraggable = function (interactable, selector, context) {\n const elements = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n if (interactable === interaction.target) { return; }\n\n if (!options.manualStart\n && !interactable.testIgnoreAllow(options, element, eventTarget)\n && matchesSelector(element, selector, elements)) {\n\n const action = interactable.getAction(interaction.downPointer,\n interaction.downEvent,\n interaction,\n element);\n\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, interactable)\n && autoStart.validateAction(action, interactable, element, eventTarget)) {\n\n return interactable;\n }\n }\n };\n\n let action = null;\n\n // check all interactables\n while (is.element(element)) {\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && elementInteractable !== interaction.target\n && !elementInteractable.options.drag.manualStart) {\n\n action = elementInteractable.getAction(interaction.downPointer, interaction.downEvent, interaction, element);\n }\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, elementInteractable)) {\n\n interaction.prepared.name = 'drag';\n interaction.target = elementInteractable;\n interaction.element = element;\n break;\n }\n\n const selectorInteractable = scope.interactables.forEachSelector(getDraggable, element);\n\n if (selectorInteractable) {\n interaction.prepared.name = 'drag';\n interaction.target = selectorInteractable;\n interaction.element = element;\n break;\n }\n\n element = parentNode(element);\n }\n }\n }\n});\n\nfunction checkStartAxis (startAxis, interactable) {\n if (!interactable) { return false; }\n\n const thisAxis = interactable.options.drag.startAxis;\n\n return (startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis);\n}\n","require('./base').setActionDefaults(require('../actions/gesture'));\n","require('./base').setActionDefaults(require('../actions/resize'));\n","module.exports = {\n base: {\n accept : null,\n preventDefault: 'auto',\n deltaSource : 'page',\n },\n\n perAction: {\n origin: { x: 0, y: 0 },\n\n // only allow left button by default\n // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n mouseButtons: 1,\n\n inertia: {\n enabled : false,\n resistance : 10, // the lambda in exponential decay\n minSpeed : 100, // target speed must be above this for inertia to start\n endSpeed : 10, // the speed at which inertia is slow enough to stop\n allowResume : true, // allow resuming an action in inertia phase\n smoothEndDuration: 300, // animate to snap/restrict endOnly if there's no inertia\n },\n },\n};\n","/* browser entry point */\n\n// Legacy browser support\nrequire('./legacyBrowsers');\n\n// inertia\nrequire('./inertia');\n\n// modifiers\nrequire('./modifiers/snap');\nrequire('./modifiers/restrict');\n\n// pointerEvents\nrequire('./pointerEvents/base');\nrequire('./pointerEvents/holdRepeat');\nrequire('./pointerEvents/interactableTargets');\n\n// delay\nrequire('./autoStart/delay');\n\n// actions\nrequire('./actions/gesture');\nrequire('./actions/resize');\nrequire('./actions/drag');\nrequire('./actions/drop');\n\n// load these modifiers after resize is loaded\nrequire('./modifiers/snapSize');\nrequire('./modifiers/restrictEdges');\nrequire('./modifiers/restrictSize');\n\n// autoStart actions\nrequire('./autoStart/gesture');\nrequire('./autoStart/resize');\nrequire('./autoStart/drag');\n\n// Interactable preventDefault setting\nrequire('./interactablePreventDefault.js');\n\n// autoScroll\nrequire('./autoScroll');\n\n// export interact\nmodule.exports = require('./interact');\n","const InteractEvent = require('./InteractEvent');\nconst Interaction = require('./Interaction');\nconst modifiers = require('./modifiers');\nconst utils = require('./utils');\nconst animationFrame = require('./utils/raf');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.inertiaStatus = {\n active : false,\n smoothEnd : false,\n allowResume: false,\n\n startEvent: null,\n upCoords : {},\n\n xe: 0, ye: 0,\n sx: 0, sy: 0,\n\n t0: 0,\n vx0: 0, vys: 0,\n duration: 0,\n\n lambda_v0: 0,\n one_ve_v0: 0,\n i : null,\n };\n\n interaction.boundInertiaFrame = () => inertiaFrame .apply(interaction);\n interaction.boundSmoothEndFrame = () => smoothEndFrame.apply(interaction);\n});\n\nInteraction.signals.on('down', function ({ interaction, event, pointer, eventTarget }) {\n const status = interaction.inertiaStatus;\n\n // Check if the down event hits the current inertia target\n if (status.active) {\n let element = eventTarget;\n\n // climb up the DOM tree from the event target\n while (utils.is.element(element)) {\n\n // if interaction element is the current inertia target element\n if (element === interaction.element) {\n // stop inertia\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n\n // update pointers to the down event's coordinates\n interaction.updatePointer(pointer);\n utils.setCoords(interaction.curCoords, interaction.pointers);\n\n // fire appropriate signals\n const signalArg = { interaction };\n Interaction.signals.fire('before-action-move', signalArg);\n Interaction.signals.fire('action-resume' , signalArg);\n\n // fire a reume event\n const resumeEvent = new InteractEvent(interaction,\n event,\n interaction.prepared.name,\n 'inertiaresume',\n interaction.element);\n\n interaction.target.fire(resumeEvent);\n interaction.prevEvent = resumeEvent;\n modifiers.resetStatuses(interaction.modifierStatuses);\n\n utils.copyCoords(interaction.prevCoords, interaction.curCoords);\n break;\n }\n\n element = utils.parentNode(element);\n }\n }\n});\n\nInteraction.signals.on('up', function ({ interaction, event }) {\n const status = interaction.inertiaStatus;\n\n if (!interaction.interacting() || status.active) { return; }\n\n const target = interaction.target;\n const options = target && target.options;\n const inertiaOptions = options && interaction.prepared.name && options[interaction.prepared.name].inertia;\n\n const now = new Date().getTime();\n const statuses = {};\n const page = utils.extend({}, interaction.curCoords.page);\n const pointerSpeed = interaction.pointerDelta.client.speed;\n\n let smoothEnd = false;\n let modifierResult;\n\n // check if inertia should be started\n const inertiaPossible = (inertiaOptions && inertiaOptions.enabled\n && interaction.prepared.name !== 'gesture'\n && event !== status.startEvent);\n\n const inertia = (inertiaPossible\n && (now - interaction.curCoords.timeStamp) < 50\n && pointerSpeed > inertiaOptions.minSpeed\n && pointerSpeed > inertiaOptions.endSpeed);\n\n const modifierArg = {\n interaction,\n pageCoords: page,\n statuses,\n preEnd: true,\n requireEndOnly: true,\n };\n\n // smoothEnd\n if (inertiaPossible && !inertia) {\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n if (modifierResult.shouldMove && modifierResult.locked) {\n smoothEnd = true;\n }\n }\n\n if (!(inertia || smoothEnd)) { return; }\n\n utils.copyCoords(status.upCoords, interaction.curCoords);\n\n interaction.pointers[0] = status.startEvent =\n new InteractEvent(interaction, event, interaction.prepared.name, 'inertiastart', interaction.element);\n\n status.t0 = now;\n\n status.active = true;\n status.allowResume = inertiaOptions.allowResume;\n interaction.simulation = status;\n\n target.fire(status.startEvent);\n\n if (inertia) {\n status.vx0 = interaction.pointerDelta.client.vx;\n status.vy0 = interaction.pointerDelta.client.vy;\n status.v0 = pointerSpeed;\n\n calcInertia(interaction, status);\n\n utils.extend(page, interaction.curCoords.page);\n\n page.x += status.xe;\n page.y += status.ye;\n\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n status.modifiedXe += modifierResult.dx;\n status.modifiedYe += modifierResult.dy;\n\n status.i = animationFrame.request(interaction.boundInertiaFrame);\n }\n else {\n status.smoothEnd = true;\n status.xe = modifierResult.dx;\n status.ye = modifierResult.dy;\n\n status.sx = status.sy = 0;\n\n status.i = animationFrame.request(interaction.boundSmoothEndFrame);\n }\n});\n\nInteraction.signals.on('stop-active', function ({ interaction }) {\n const status = interaction.inertiaStatus;\n\n if (status.active) {\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n }\n});\n\nfunction calcInertia (interaction, status) {\n const inertiaOptions = interaction.target.options[interaction.prepared.name].inertia;\n const lambda = inertiaOptions.resistance;\n const inertiaDur = -Math.log(inertiaOptions.endSpeed / status.v0) / lambda;\n\n status.x0 = interaction.prevEvent.pageX;\n status.y0 = interaction.prevEvent.pageY;\n status.t0 = status.startEvent.timeStamp / 1000;\n status.sx = status.sy = 0;\n\n status.modifiedXe = status.xe = (status.vx0 - inertiaDur) / lambda;\n status.modifiedYe = status.ye = (status.vy0 - inertiaDur) / lambda;\n status.te = inertiaDur;\n\n status.lambda_v0 = lambda / status.v0;\n status.one_ve_v0 = 1 - inertiaOptions.endSpeed / status.v0;\n}\n\nfunction inertiaFrame () {\n updateInertiaCoords(this);\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n\n const status = this.inertiaStatus;\n const options = this.target.options[this.prepared.name].inertia;\n const lambda = options.resistance;\n const t = new Date().getTime() / 1000 - status.t0;\n\n if (t < status.te) {\n\n const progress = 1 - (Math.exp(-lambda * t) - status.lambda_v0) / status.one_ve_v0;\n\n if (status.modifiedXe === status.xe && status.modifiedYe === status.ye) {\n status.sx = status.xe * progress;\n status.sy = status.ye * progress;\n }\n else {\n const quadPoint = utils.getQuadraticCurvePoint(0, 0,\n status.xe,\n status.ye,\n status.modifiedXe,\n status.modifiedYe,\n progress);\n\n status.sx = quadPoint.x;\n status.sy = quadPoint.y;\n }\n\n this.doMove();\n\n status.i = animationFrame.request(this.boundInertiaFrame);\n }\n else {\n status.sx = status.modifiedXe;\n status.sy = status.modifiedYe;\n\n this.doMove();\n this.end(status.startEvent);\n status.active = false;\n this.simulation = null;\n }\n\n utils.copyCoords(this.prevCoords, this.curCoords);\n}\n\nfunction smoothEndFrame () {\n updateInertiaCoords(this);\n\n const status = this.inertiaStatus;\n const t = new Date().getTime() - status.t0;\n const duration = this.target.options[this.prepared.name].inertia.smoothEndDuration;\n\n if (t < duration) {\n status.sx = utils.easeOutQuad(t, 0, status.xe, duration);\n status.sy = utils.easeOutQuad(t, 0, status.ye, duration);\n\n this.pointerMove(status.startEvent, status.startEvent);\n\n status.i = animationFrame.request(this.boundSmoothEndFrame);\n }\n else {\n status.sx = status.xe;\n status.sy = status.ye;\n\n this.pointerMove(status.startEvent, status.startEvent);\n this.end(status.startEvent);\n\n status.smoothEnd =\n status.active = false;\n this.simulation = null;\n }\n}\n\nfunction updateInertiaCoords (interaction) {\n const status = interaction.inertiaStatus;\n\n // return if inertia isn't running\n if (!status.active) { return; }\n\n const pageUp = status.upCoords.page;\n const clientUp = status.upCoords.client;\n\n utils.setCoords(interaction.curCoords, [ {\n pageX : pageUp.x + status.sx,\n pageY : pageUp.y + status.sy,\n clientX: clientUp.x + status.sx,\n clientY: clientUp.y + status.sy,\n } ]);\n}\n","const browser = require('./utils/browser');\nconst events = require('./utils/events');\nconst utils = require('./utils');\nconst scope = require('./scope');\nconst Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\n\nconst globalEvents = {};\n\n/*\\\n * interact\n [ method ]\n *\n * The methods of this variable can be used to set elements as\n * interactables and also to change various default settings.\n *\n * Calling it as a function and passing an element or a valid CSS selector\n * string returns an Interactable object which has various methods to\n * configure it.\n *\n - element (Element | string) The HTML or SVG Element to interact with or CSS selector\n = (object) An @Interactable\n *\n > Usage\n | interact('#draggable').draggable(true);\n |\n | var rectables = interact('rect');\n | rectables\n | .gesturable(true)\n | .on('gesturemove', function (event) {\n | // ...\n | });\n\\*/\nfunction interact (element, options) {\n let interactable = scope.interactables.get(element, options);\n\n if (!interactable) {\n interactable = new Interactable(element, options);\n interactable.events.global = globalEvents;\n }\n\n return interactable;\n}\n\n/*\\\n * interact.isSet\n [ method ]\n *\n * Check if an element has been set\n - element (Element) The Element being searched for\n = (boolean) Indicates if the element or CSS selector was previously passed to interact\n\\*/\ninteract.isSet = function (element, options) {\n return scope.interactables.indexOfElement(element, options && options.context) !== -1;\n};\n\n/*\\\n * interact.on\n [ method ]\n *\n * Adds a global listener for an InteractEvent or adds a DOM event to\n * `document`\n *\n - type (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) interact\n\\*/\ninteract.on = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.on(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.on(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n // if it is an InteractEvent type, add listener to globalEvents\n if (utils.contains(Interactable.eventTypes, type)) {\n // if this type of event was never bound\n if (!globalEvents[type]) {\n globalEvents[type] = [listener];\n }\n else {\n globalEvents[type].push(listener);\n }\n }\n // If non InteractEvent type, addEventListener to document\n else {\n events.add(scope.document, type, listener, { options });\n }\n\n return interact;\n};\n\n/*\\\n * interact.off\n [ method ]\n *\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n - type (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) interact\n \\*/\ninteract.off = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.off(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.off(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n if (!utils.contains(Interactable.eventTypes, type)) {\n events.remove(scope.document, type, listener, options);\n }\n else {\n let index;\n\n if (type in globalEvents\n && (index = utils.indexOf(globalEvents[type], listener)) !== -1) {\n globalEvents[type].splice(index, 1);\n }\n }\n\n return interact;\n};\n\n/*\\\n * interact.debug\n [ method ]\n *\n * Returns an object which exposes internal data\n = (object) An object with properties that outline the current state and expose internal functions and variables\n\\*/\ninteract.debug = function () {\n return scope;\n};\n\n// expose the functions used to calculate multi-touch properties\ninteract.getPointerAverage = utils.pointerAverage;\ninteract.getTouchBBox = utils.touchBBox;\ninteract.getTouchDistance = utils.touchDistance;\ninteract.getTouchAngle = utils.touchAngle;\n\ninteract.getElementRect = utils.getElementRect;\ninteract.getElementClientRect = utils.getElementClientRect;\ninteract.matchesSelector = utils.matchesSelector;\ninteract.closest = utils.closest;\n\n/*\\\n * interact.supportsTouch\n [ method ]\n *\n = (boolean) Whether or not the browser supports touch input\n\\*/\ninteract.supportsTouch = function () {\n return browser.supportsTouch;\n};\n\n/*\\\n * interact.supportsPointerEvent\n [ method ]\n *\n = (boolean) Whether or not the browser supports PointerEvents\n\\*/\ninteract.supportsPointerEvent = function () {\n return browser.supportsPointerEvent;\n};\n\n/*\\\n * interact.stop\n [ method ]\n *\n * Cancels all interactions (end events are not fired)\n *\n - event (Event) An event on which to call preventDefault()\n = (object) interact\n\\*/\ninteract.stop = function (event) {\n for (let i = scope.interactions.length - 1; i >= 0; i--) {\n scope.interactions[i].stop(event);\n }\n\n return interact;\n};\n\n/*\\\n * interact.pointerMoveTolerance\n [ method ]\n * Returns or sets the distance the pointer must be moved before an action\n * sequence occurs. This also affects tolerance for tap events.\n *\n - newValue (number) #optional The movement from the start position must be greater than this value\n = (number | Interactable) The current setting or interact\n\\*/\ninteract.pointerMoveTolerance = function (newValue) {\n if (utils.is.number(newValue)) {\n Interaction.pointerMoveTolerance = newValue;\n\n return this;\n }\n\n return Interaction.pointerMoveTolerance;\n};\n\ninteract.addDocument = scope.addDocument;\ninteract.removeDocument = scope.removeDocument;\n\nscope.interact = interact;\n\nmodule.exports = interact;\n","const Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\nconst scope = require('./scope');\nconst is = require('./utils/is');\nconst events = require('./utils/events');\n\nconst { nodeContains, matchesSelector } = require('./utils/domUtils');\n\n/*\\\n * Interactable.preventDefault\n [ method ]\n *\n * Returns or sets whether to prevent the browser's default behaviour\n * in response to pointer events. Can be set to:\n * - `'always'` to always prevent\n * - `'never'` to never prevent\n * - `'auto'` to let interact.js try to determine what would be best\n *\n - newValue (string) #optional `true`, `false` or `'auto'`\n = (string | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.preventDefault = function (newValue) {\n if (/^(always|never|auto)$/.test(newValue)) {\n this.options.preventDefault = newValue;\n return this;\n }\n\n if (is.bool(newValue)) {\n this.options.preventDefault = newValue? 'always' : 'never';\n return this;\n }\n\n return this.options.preventDefault;\n};\n\nInteractable.prototype.checkAndPreventDefault = function (event) {\n const setting = this.options.preventDefault;\n\n if (setting === 'never') { return; }\n\n if (setting === 'always') {\n event.preventDefault();\n return;\n }\n\n // setting === 'auto'\n\n // don't preventDefault if the browser supports passiveEvents\n // CSS touch-action and user-selecct should be used instead\n if (events.supportsOptions) {\n return;\n }\n\n // don't preventDefault of pointerdown events\n if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) {\n return;\n }\n\n // don't preventDefault on editable elements\n if (is.element(event.target)\n && matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) {\n return;\n }\n\n event.preventDefault();\n};\n\nfunction onInteractionEvent ({ interaction, event }) {\n if (interaction.target) {\n interaction.target.checkAndPreventDefault(event);\n }\n}\n\nfor (const eventSignal of ['down', 'move', 'up', 'cancel']) {\n Interaction.signals.on(eventSignal, onInteractionEvent);\n}\n\n// prevent native HTML5 drag on interact.js target elements\nInteraction.docEvents.dragstart = function preventNativeDrag (event) {\n for (const interaction of scope.interactions) {\n\n if (interaction.element\n && (interaction.element === event.target\n || nodeContains(interaction.element, event.target))) {\n\n interaction.target.checkAndPreventDefault(event);\n return;\n }\n }\n};\n","const scope = require('./scope');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst iFinder = require('./utils/interactionFinder');\nconst pointerEvents = require('./pointerEvents/base');\n\nconst { window } = require('./utils/window');\n\nconst toString = Object.prototype.toString;\n\nif (!window.Array.isArray) {\n window.Array.isArray = function (obj) {\n return toString.call(obj) === '[object Array]';\n };\n}\n\nif (!String.prototype.trim) {\n String.prototype.trim = function () {\n return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n };\n}\n\n// http://www.quirksmode.org/dom/events/click.html\n// >Events leading to dblclick\n//\n// IE8 doesn't fire down event before dblclick.\n// This workaround tries to fire a tap and doubletap after dblclick\nfunction onIE8Dblclick (event) {\n const eventTarget = event.target;\n const interaction = iFinder.search(event, event.type, eventTarget);\n\n if (!interaction) { return; }\n\n if (interaction.prevTap\n && event.clientX === interaction.prevTap.clientX\n && event.clientY === interaction.prevTap.clientY\n && eventTarget === interaction.prevTap.target) {\n\n interaction.downTargets[0] = eventTarget;\n interaction.downTimes [0] = new Date().getTime();\n\n pointerEvents.fire({\n interaction,\n event,\n eventTarget,\n pointer: event,\n type: 'tap',\n });\n }\n}\n\nif (browser.isIE8) {\n const selectFix = function (event) {\n for (const interaction of scope.interactions) {\n if (interaction.interacting()) {\n interaction.target.checkAndPreventDefault(event);\n }\n }\n };\n\n const onDocIE8 = function onDocIE8 ({ doc, win }, signalName) {\n const eventMethod = signalName.indexOf('listen') === 0\n ? events.add : events.remove;\n\n // For IE's lack of Event#preventDefault\n eventMethod(doc, 'selectstart', selectFix);\n\n if (pointerEvents) {\n eventMethod(doc, 'dblclick', onIE8Dblclick);\n }\n };\n\n scope.signals.on('add-document' , onDocIE8);\n scope.signals.on('remove-document', onDocIE8);\n}\n\nmodule.exports = null;\n","const InteractEvent = require('../InteractEvent');\nconst Interaction = require('../Interaction');\nconst extend = require('../utils/extend');\n\nconst modifiers = {\n names: [],\n\n setOffsets: function (arg) {\n const { interaction, pageCoords: page } = arg;\n const { target, element, startOffset } = interaction;\n const rect = target.getRect(element);\n\n if (rect) {\n startOffset.left = page.x - rect.left;\n startOffset.top = page.y - rect.top;\n\n startOffset.right = rect.right - page.x;\n startOffset.bottom = rect.bottom - page.y;\n\n if (!('width' in rect)) { rect.width = rect.right - rect.left; }\n if (!('height' in rect)) { rect.height = rect.bottom - rect.top ; }\n }\n else {\n startOffset.left = startOffset.top = startOffset.right = startOffset.bottom = 0;\n }\n\n arg.rect = rect;\n arg.interactable = target;\n arg.element = element;\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n\n arg.options = target.options[interaction.prepared.name][modifierName];\n\n if (!arg.options) {\n continue;\n }\n\n interaction.modifierOffsets[modifierName] = modifiers[modifierName].setOffset(arg);\n }\n },\n\n setAll: function (arg) {\n const { interaction, statuses, preEnd, requireEndOnly } = arg;\n const coords = extend({}, arg.pageCoords);\n const result = {\n dx: 0,\n dy: 0,\n changed: false,\n locked: false,\n shouldMove: true,\n };\n\n for (const modifierName of modifiers.names) {\n const modifier = modifiers[modifierName];\n const options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!shouldDo(options, preEnd, requireEndOnly)) { continue; }\n\n arg.status = arg.status = statuses[modifierName];\n arg.options = options;\n arg.offset = arg.interaction.modifierOffsets[modifierName];\n\n modifier.set(arg);\n\n if (arg.status.locked) {\n coords.x += arg.status.dx;\n coords.y += arg.status.dy;\n\n result.dx += arg.status.dx;\n result.dy += arg.status.dy;\n\n result.locked = true;\n }\n }\n\n // a move should be fired if:\n // - there are no modifiers enabled,\n // - no modifiers are \"locked\" i.e. have changed the pointer's coordinates, or\n // - the locked coords have changed since the last pointer move\n result.shouldMove = !arg.status || !result.locked || arg.status.changed;\n\n return result;\n },\n\n resetStatuses: function (statuses) {\n for (const modifierName of modifiers.names) {\n const status = statuses[modifierName] || {};\n\n status.dx = status.dy = 0;\n status.modifiedX = status.modifiedY = NaN;\n status.locked = false;\n status.changed = true;\n\n statuses[modifierName] = status;\n }\n\n return statuses;\n },\n\n start: function ({ interaction }, signalName) {\n const arg = {\n interaction,\n pageCoords: (signalName === 'action-resume' ?\n interaction.curCoords : interaction.startCoords).page,\n startOffset: interaction.startOffset,\n statuses: interaction.modifierStatuses,\n preEnd: false,\n requireEndOnly: false,\n };\n\n modifiers.setOffsets(arg);\n modifiers.resetStatuses(arg.statuses);\n\n arg.pageCoords = extend({}, interaction.startCoords.page);\n interaction.modifierResult = modifiers.setAll(arg);\n },\n};\n\nInteraction.signals.on('new', function (interaction) {\n interaction.startOffset = { left: 0, right: 0, top: 0, bottom: 0 };\n interaction.modifierOffsets = {};\n interaction.modifierStatuses = modifiers.resetStatuses({});\n interaction.modifierResult = null;\n});\n\nInteraction.signals.on('action-start' , modifiers.start);\nInteraction.signals.on('action-resume', modifiers.start);\n\nInteraction.signals.on('before-action-move', function ({ interaction, preEnd, interactingBeforeMove }) {\n const modifierResult = modifiers.setAll({\n interaction,\n preEnd,\n pageCoords: interaction.curCoords.page,\n statuses: interaction.modifierStatuses,\n requireEndOnly: false,\n });\n\n // don't fire an action move if a modifier would keep the event in the same\n // cordinates as before\n if (!modifierResult.shouldMove && interactingBeforeMove) {\n interaction._dontFireMove = true;\n }\n\n interaction.modifierResult = modifierResult;\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n for (let i = 0; i < modifiers.names.length; i++) {\n const options = interaction.target.options[interaction.prepared.name][modifiers.names[i]];\n\n // if the endOnly option is true for any modifier\n if (shouldDo(options, true, true)) {\n // fire a move event at the modified coordinates\n interaction.doMove({ event, preEnd: true });\n break;\n }\n }\n});\n\nInteractEvent.signals.on('set-xy', function (arg) {\n const { iEvent, interaction } = arg;\n const modifierArg = extend({}, arg);\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n modifierArg.options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!modifierArg.options) {\n continue;\n }\n\n const modifier = modifiers[modifierName];\n\n modifierArg.status = interaction.modifierStatuses[modifierName];\n\n iEvent[modifierName] = modifier.modifyCoords(modifierArg);\n }\n});\n\nfunction shouldDo (options, preEnd, requireEndOnly) {\n return (options && options.enabled\n && (preEnd || !options.endOnly)\n && (!requireEndOnly || options.endOnly));\n}\n\nmodule.exports = modifiers;\n","const modifiers = require('./index');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst restrict = {\n defaults: {\n enabled : false,\n endOnly : false,\n restriction: null,\n elementRect: null,\n },\n\n setOffset: function ({ rect, startOffset, options }) {\n const elementRect = options && options.elementRect;\n const offset = {};\n\n if (rect && elementRect) {\n offset.left = startOffset.left - (rect.width * elementRect.left);\n offset.top = startOffset.top - (rect.height * elementRect.top);\n\n offset.right = startOffset.right - (rect.width * (1 - elementRect.right));\n offset.bottom = startOffset.bottom - (rect.height * (1 - elementRect.bottom));\n }\n else {\n offset.left = offset.top = offset.right = offset.bottom = 0;\n }\n\n return offset;\n },\n\n set: function ({ pageCoords, interaction, status, options }) {\n if (!options) { return status; }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n\n const restriction = getRestrictionRect(options.restriction, interaction, page);\n\n if (!restriction) { return status; }\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n const rect = restriction;\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n const offset = interaction.modifierOffsets.restrict;\n\n // object is assumed to have\n // x, y, width, height or\n // left, top, right, bottom\n if ('x' in restriction && 'y' in restriction) {\n modifiedX = Math.max(Math.min(rect.x + rect.width - offset.right , page.x), rect.x + offset.left);\n modifiedY = Math.max(Math.min(rect.y + rect.height - offset.bottom, page.y), rect.y + offset.top );\n }\n else {\n modifiedX = Math.max(Math.min(rect.right - offset.right , page.x), rect.left + offset.left);\n modifiedY = Math.max(Math.min(rect.bottom - offset.bottom, page.y), rect.top + offset.top );\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const elementRect = options && options.elementRect;\n\n if (options && options.enabled\n && !(phase === 'start' && elementRect && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n getRestrictionRect,\n};\n\nfunction getRestrictionRect (value, interaction, page) {\n if (utils.is.function(value)) {\n return utils.resolveRectLike(value, interaction.target, interaction.element, [page.x, page.y, interaction]);\n } else {\n return utils.resolveRectLike(value, interaction.target, interaction.element);\n }\n}\n\nmodifiers.restrict = restrict;\nmodifiers.names.push('restrict');\n\ndefaultOptions.perAction.restrict = restrict.defaults;\n\nmodule.exports = restrict;\n","// This module adds the options.resize.restrictEdges setting which sets min and\n// max for the top, left, bottom and right edges of the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictEdges: {\n// inner: { top: 200, left: 200, right: 400, bottom: 400 },\n// outer: { top: 0, left: 0, right: 600, bottom: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst { getRestrictionRect } = require('./restrict');\n\nconst noInner = { top: +Infinity, left: +Infinity, bottom: -Infinity, right: -Infinity };\nconst noOuter = { top: -Infinity, left: -Infinity, bottom: +Infinity, right: +Infinity };\n\nconst restrictEdges = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n offset: null,\n },\n\n setOffset: function ({ interaction, startOffset, options }) {\n if (!options) {\n return utils.extend({}, startOffset);\n }\n\n const offset = getRestrictionRect(options.offset, interaction, interaction.startCoords.page);\n\n if (offset) {\n return {\n top: startOffset.top + offset.y,\n left: startOffset.left + offset.x,\n bottom: startOffset.bottom + offset.y,\n right: startOffset.right + offset.x,\n };\n }\n\n return startOffset;\n },\n\n set: function ({ pageCoords, interaction, status, offset, options }) {\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n const inner = rectUtils.xywhToTlbr(getRestrictionRect(options.inner, interaction, page)) || noInner;\n const outer = rectUtils.xywhToTlbr(getRestrictionRect(options.outer, interaction, page)) || noOuter;\n\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n if (edges.top) {\n modifiedY = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top);\n }\n else if (edges.bottom) {\n modifiedY = Math.max(Math.min(outer.bottom - offset.bottom, page.y), inner.bottom - offset.bottom);\n }\n if (edges.left) {\n modifiedX = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left);\n }\n else if (edges.right) {\n modifiedX = Math.max(Math.min(outer.right - offset.right, page.x), inner.right - offset.right);\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n if (options && options.enabled\n && !(phase === 'start' && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n noInner,\n noOuter,\n getRestrictionRect,\n};\n\nmodifiers.restrictEdges = restrictEdges;\nmodifiers.names.push('restrictEdges');\n\ndefaultOptions.perAction.restrictEdges = restrictEdges.defaults;\nresize.defaults.restrictEdges = restrictEdges.defaults;\n\nmodule.exports = restrictEdges;\n","// This module adds the options.resize.restrictSize setting which sets min and\n// max width and height for the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictSize: {\n// min: { width: -600, height: -600 },\n// max: { width: 600, height: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst restrictEdges = require('./restrictEdges');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst noMin = { width: -Infinity, height: -Infinity };\nconst noMax = { width: +Infinity, height: +Infinity };\n\nconst restrictSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n },\n\n setOffset: function ({ interaction }) {\n return interaction.startOffset;\n },\n\n set: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const rect = rectUtils.xywhToTlbr(interaction.resizeRects.inverted);\n\n const minSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.min, interaction)) || noMin;\n const maxSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.max, interaction)) || noMax;\n\n arg.options = {\n enabled: options.enabled,\n endOnly: options.endOnly,\n inner: utils.extend({}, restrictEdges.noInner),\n outer: utils.extend({}, restrictEdges.noOuter),\n };\n\n if (edges.top) {\n arg.options.inner.top = rect.bottom - minSize.height;\n arg.options.outer.top = rect.bottom - maxSize.height;\n }\n else if (edges.bottom) {\n arg.options.inner.bottom = rect.top + minSize.height;\n arg.options.outer.bottom = rect.top + maxSize.height;\n }\n if (edges.left) {\n arg.options.inner.left = rect.right - minSize.width;\n arg.options.outer.left = rect.right - maxSize.width;\n }\n else if (edges.right) {\n arg.options.inner.right = rect.left + minSize.width;\n arg.options.outer.right = rect.left + maxSize.width;\n }\n\n restrictEdges.set(arg);\n },\n\n modifyCoords: restrictEdges.modifyCoords,\n};\n\nmodifiers.restrictSize = restrictSize;\nmodifiers.names.push('restrictSize');\n\ndefaultOptions.perAction.restrictSize = restrictSize.defaults;\nresize.defaults.restrictSize = restrictSize.defaults;\n\nmodule.exports = restrictSize;\n","const modifiers = require('./index');\nconst interact = require('../interact');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst snap = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n\n relativePoints: null,\n },\n\n setOffset: function ({ interaction, interactable, element, rect, startOffset, options }) {\n const offsets = [];\n const optionsOrigin = utils.rectToXY(utils.resolveRectLike(options.origin));\n const origin = optionsOrigin || utils.getOriginXY(interactable, element, interaction.prepared.name);\n options = options || interactable.options[interaction.prepared.name].snap || {};\n\n let snapOffset;\n\n if (options.offset === 'startCoords') {\n snapOffset = {\n x: interaction.startCoords.page.x - origin.x,\n y: interaction.startCoords.page.y - origin.y,\n };\n }\n else {\n const offsetRect = utils.resolveRectLike(options.offset, interactable, element, [interaction]);\n\n snapOffset = utils.rectToXY(offsetRect) || { x: 0, y: 0 };\n }\n\n if (rect && options.relativePoints && options.relativePoints.length) {\n for (const { x: relativeX, y: relativeY } of options.relativePoints) {\n offsets.push({\n x: startOffset.left - (rect.width * relativeX) + snapOffset.x,\n y: startOffset.top - (rect.height * relativeY) + snapOffset.y,\n });\n }\n }\n else {\n offsets.push(snapOffset);\n }\n\n return offsets;\n },\n\n set: function ({ interaction, pageCoords, status, options, offset: offsets }) {\n const targets = [];\n let target;\n let page;\n let i;\n\n if (status.useStatusXY) {\n page = { x: status.x, y: status.y };\n }\n else {\n const origin = utils.getOriginXY(interaction.target, interaction.element, interaction.prepared.name);\n\n page = utils.extend({}, pageCoords);\n\n page.x -= origin.x;\n page.y -= origin.y;\n }\n\n status.realX = page.x;\n status.realY = page.y;\n\n let len = options.targets? options.targets.length : 0;\n\n for (const { x: offsetX, y: offsetY } of offsets) {\n const relativeX = page.x - offsetX;\n const relativeY = page.y - offsetY;\n\n for (const snapTarget of options.targets) {\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n targets.push({\n x: utils.is.number(target.x) ? (target.x + offsetX) : relativeX,\n y: utils.is.number(target.y) ? (target.y + offsetY) : relativeY,\n\n range: utils.is.number(target.range)? target.range: options.range,\n });\n }\n }\n\n const closest = {\n target: null,\n inRange: false,\n distance: 0,\n range: 0,\n dx: 0,\n dy: 0,\n };\n\n for (i = 0, len = targets.length; i < len; i++) {\n target = targets[i];\n\n const range = target.range;\n const dx = target.x - page.x;\n const dy = target.y - page.y;\n const distance = utils.hypot(dx, dy);\n let inRange = distance <= range;\n\n // Infinite targets count as being out of range\n // compared to non infinite ones that are in range\n if (range === Infinity && closest.inRange && closest.range !== Infinity) {\n inRange = false;\n }\n\n if (!closest.target || (inRange\n // is the closest target in range?\n ? (closest.inRange && range !== Infinity\n // the pointer is relatively deeper in this target\n ? distance / range < closest.distance / closest.range\n // this target has Infinite range and the closest doesn't\n : (range === Infinity && closest.range !== Infinity)\n // OR this target is closer that the previous closest\n || distance < closest.distance)\n // The other is not in range and the pointer is closer to this target\n : (!closest.inRange && distance < closest.distance))) {\n\n closest.target = target;\n closest.distance = distance;\n closest.range = range;\n closest.inRange = inRange;\n closest.dx = dx;\n closest.dy = dy;\n\n status.range = range;\n }\n }\n\n let snapChanged;\n\n if (closest.target) {\n snapChanged = (status.modifiedX !== closest.target.x || status.modifiedY !== closest.target.y);\n\n status.modifiedX = closest.target.x;\n status.modifiedY = closest.target.y;\n }\n else {\n snapChanged = true;\n\n status.modifiedX = NaN;\n status.modifiedY = NaN;\n }\n\n status.dx = closest.dx;\n status.dy = closest.dy;\n\n status.changed = (snapChanged || (closest.inRange && !status.locked));\n status.locked = closest.inRange;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const relativePoints = options && options.relativePoints;\n\n if (options && options.enabled\n && !(phase === 'start' && relativePoints && relativePoints.length)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n }\n\n return {\n range : status.range,\n locked : status.locked,\n x : status.modifiedX,\n y : status.modifiedY,\n realX : status.realX,\n realY : status.realY,\n dx : status.dx,\n dy : status.dy,\n };\n }\n },\n};\n\ninteract.createSnapGrid = function (grid) {\n return function (x, y) {\n const limits = grid.limits || {\n left : -Infinity,\n right : Infinity,\n top : -Infinity,\n bottom: Infinity,\n };\n let offsetX = 0;\n let offsetY = 0;\n\n if (utils.is.object(grid.offset)) {\n offsetX = grid.offset.x;\n offsetY = grid.offset.y;\n }\n\n const gridx = Math.round((x - offsetX) / grid.x);\n const gridy = Math.round((y - offsetY) / grid.y);\n\n const newX = Math.max(limits.left, Math.min(limits.right , gridx * grid.x + offsetX));\n const newY = Math.max(limits.top , Math.min(limits.bottom, gridy * grid.y + offsetY));\n\n return {\n x: newX,\n y: newY,\n range: grid.range,\n };\n };\n};\n\nmodifiers.snap = snap;\nmodifiers.names.push('snap');\n\ndefaultOptions.perAction.snap = snap.defaults;\n\nmodule.exports = snap;\n","// This module allows snapping of the size of targets during resize\n// interactions.\n\nconst modifiers = require('./index');\nconst snap = require('./snap');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\nconst utils = require('../utils/');\n\nconst snapSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n },\n\n setOffset: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.edges;\n\n if (!edges) { return; }\n\n arg.options = {\n relativePoints: [{\n x: edges.left? 0 : 1,\n y: edges.top ? 0 : 1,\n }],\n origin: { x: 0, y: 0 },\n offset: 'self',\n range: options.range,\n };\n\n const offsets = snap.setOffset(arg);\n arg.options = options;\n\n return offsets;\n },\n\n set: function (arg) {\n const { interaction, options, offset, pageCoords } = arg;\n const page = utils.extend({}, pageCoords);\n const relativeX = page.x - offset[0].x;\n const relativeY = page.y - offset[0].y;\n\n arg.options = utils.extend({}, options);\n arg.options.targets = [];\n\n for (const snapTarget of options.targets) {\n let target;\n\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n if ('width' in target && 'height' in target) {\n target.x = target.width;\n target.y = target.height;\n }\n\n arg.options.targets.push(target);\n }\n\n snap.set(arg);\n },\n\n modifyCoords: function (arg) {\n const { options } = arg;\n\n arg.options = utils.extend({}, options);\n arg.options.enabled = options.enabled;\n arg.options.relativePoints = [null];\n\n snap.modifyCoords(arg);\n },\n};\n\nmodifiers.snapSize = snapSize;\nmodifiers.names.push('snapSize');\n\ndefaultOptions.perAction.snapSize = snapSize.defaults;\nresize.defaults.snapSize = snapSize.defaults;\n\nmodule.exports = snapSize;\n","const pointerUtils = require('../utils/pointerUtils');\n\nmodule.exports = class PointerEvent {\n constructor (type, pointer, event, eventTarget, interaction) {\n pointerUtils.pointerExtend(this, event);\n\n if (event !== pointer) {\n pointerUtils.pointerExtend(this, pointer);\n }\n\n this.interaction = interaction;\n\n this.timeStamp = new Date().getTime();\n this.originalEvent = event;\n this.type = type;\n this.pointerId = pointerUtils.getPointerId(pointer);\n this.pointerType = pointerUtils.getPointerType(pointer, interaction);\n this.target = eventTarget;\n this.currentTarget = null;\n\n if (type === 'tap') {\n const pointerIndex = interaction.getPointerIndex(pointer);\n this.dt = this.timeStamp - interaction.downTimes[pointerIndex];\n\n const interval = this.timeStamp - interaction.tapTime;\n\n this.double = !!(interaction.prevTap\n && interaction.prevTap.type !== 'doubletap'\n && interaction.prevTap.target === this.target\n && interval < 500);\n }\n else if (type === 'doubletap') {\n this.dt = pointer.timeStamp - interaction.tapTime;\n }\n }\n\n subtractOrigin ({ x: originX, y: originY }) {\n this.pageX -= originX;\n this.pageY -= originY;\n this.clientX -= originX;\n this.clientY -= originY;\n\n return this;\n }\n\n addOrigin ({ x: originX, y: originY }) {\n this.pageX += originX;\n this.pageY += originY;\n this.clientX += originX;\n this.clientY += originY;\n\n return this;\n }\n\n preventDefault () {\n this.originalEvent.preventDefault();\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n};\n","const PointerEvent = require('./PointerEvent');\nconst Interaction = require('../Interaction');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst defaults = require('../defaultOptions');\nconst signals = require('../utils/Signals').new();\nconst { filter } = require('../utils/arr');\n\nconst simpleSignals = [ 'down', 'up', 'cancel' ];\nconst simpleEvents = [ 'down', 'up', 'cancel' ];\n\nconst pointerEvents = {\n PointerEvent,\n fire,\n collectEventTargets,\n signals,\n defaults: {\n holdDuration: 600,\n ignoreFrom : null,\n allowFrom : null,\n origin : { x: 0, y: 0 },\n },\n types: [\n 'down',\n 'move',\n 'up',\n 'cancel',\n 'tap',\n 'doubletap',\n 'hold',\n ],\n};\n\nfunction fire (arg) {\n const {\n interaction, pointer, event, eventTarget,\n type = arg.pointerEvent.type,\n targets = collectEventTargets(arg),\n pointerEvent = new PointerEvent(type, pointer, event, eventTarget, interaction),\n } = arg;\n\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n targets,\n type,\n pointerEvent,\n };\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n\n for (const prop in target.props || {}) {\n pointerEvent[prop] = target.props[prop];\n }\n\n const origin = utils.getOriginXY(target.eventable, target.element);\n\n pointerEvent.subtractOrigin(origin);\n pointerEvent.eventable = target.eventable;\n pointerEvent.currentTarget = target.element;\n\n target.eventable.fire(pointerEvent);\n\n pointerEvent.addOrigin(origin);\n\n if (pointerEvent.immediatePropagationStopped\n || (pointerEvent.propagationStopped\n && (i + 1) < targets.length && targets[i + 1].element !== pointerEvent.currentTarget)) {\n break;\n }\n }\n\n signals.fire('fired', signalArg);\n\n if (type === 'tap') {\n // if pointerEvent should make a double tap, create and fire a doubletap\n // PointerEvent and use that as the prevTap\n const prevTap = pointerEvent.double\n ? fire({\n interaction, pointer, event, eventTarget,\n type: 'doubletap',\n })\n : pointerEvent;\n\n interaction.prevTap = prevTap;\n interaction.tapTime = prevTap.timeStamp;\n }\n\n return pointerEvent;\n}\n\nfunction collectEventTargets ({ interaction, pointer, event, eventTarget, type }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n // do not fire a tap event if the pointer was moved before being lifted\n if (type === 'tap' && (interaction.pointerWasMoved\n // or if the pointerup target is different to the pointerdown target\n || !(interaction.downTargets[pointerIndex] && interaction.downTargets[pointerIndex] === eventTarget))) {\n return [];\n }\n\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n path,\n targets: [],\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (type === 'hold') {\n signalArg.targets = filter(signalArg.targets, target =>\n target.eventable.options.holdDuration === interaction.holdTimers[pointerIndex].duration);\n }\n\n return signalArg.targets;\n}\n\nInteraction.signals.on('update-pointer-down', function ({ interaction, pointerIndex }) {\n interaction.holdTimers[pointerIndex] = { duration: Infinity, timeout: null };\n});\n\nInteraction.signals.on('remove-pointer', function ({ interaction, pointerIndex }) {\n interaction.holdTimers.splice(pointerIndex, 1);\n});\n\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget, duplicateMove }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n if (!duplicateMove && (!interaction.pointerIsDown || interaction.pointerWasMoved)) {\n if (interaction.pointerIsDown) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n\n fire({\n interaction, pointer, event, eventTarget,\n type: 'move',\n });\n }\n});\n\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget, pointerIndex }) {\n // copy event to be used in timeout for IE8\n const eventCopy = browser.isIE8? utils.extend({}, event) : event;\n\n const timer = interaction.holdTimers[pointerIndex];\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'hold',\n targets: [],\n path,\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (!signalArg.targets.length) { return; }\n\n let minDuration = Infinity;\n\n for (let i = 0; i < signalArg.targets.length; i++) {\n const target = signalArg.targets[i];\n const holdDuration = target.eventable.options.holdDuration;\n\n if (holdDuration < minDuration) {\n minDuration = holdDuration;\n }\n }\n\n timer.duration = minDuration;\n timer.timeout = setTimeout(function () {\n fire({\n interaction, eventCopy, eventTarget,\n pointer: browser.isIE8? eventCopy : pointer,\n type: 'hold',\n });\n }, minDuration);\n});\n\nInteraction.signals.on('up', ({ interaction, pointer, event, eventTarget }) => {\n if (!interaction.pointerWasMoved) {\n fire({ interaction, eventTarget, pointer, event, type: 'tap' });\n }\n});\n\n['up', 'cancel'].forEach(function (signalName) {\n Interaction.signals.on(signalName, function ({ interaction, pointerIndex }) {\n if (interaction.holdTimers[pointerIndex]) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n });\n});\n\nfunction createSignalListener (type) {\n return function ({ interaction, pointer, event, eventTarget }) {\n fire({ interaction, eventTarget, pointer, event, type });\n };\n}\n\nfor (let i = 0; i < simpleSignals.length; i++) {\n Interaction.signals.on(simpleSignals[i], createSignalListener(simpleEvents[i]));\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.prevTap = null; // the most recent tap event on this interaction\n interaction.tapTime = 0; // time of the most recent tap event\n interaction.holdTimers = []; // [{ duration, timeout }]\n});\n\ndefaults.pointerEvents = pointerEvents.defaults;\nmodule.exports = pointerEvents;\n","const pointerEvents = require('./base');\nconst Interaction = require('../Interaction');\n\npointerEvents.signals.on('new', onNew);\npointerEvents.signals.on('fired', onFired);\n\nfor (const signal of ['move', 'up', 'cancel', 'endall']) {\n Interaction.signals.on(signal, endHoldRepeat);\n}\n\nfunction onNew ({ pointerEvent }) {\n if (pointerEvent.type !== 'hold') { return; }\n\n pointerEvent.count = (pointerEvent.count || 0) + 1;\n}\n\nfunction onFired ({ interaction, pointerEvent, eventTarget, targets }) {\n if (pointerEvent.type !== 'hold' || !targets.length) { return; }\n\n // get the repeat interval from the first eventable\n const interval = targets[0].eventable.options.holdRepeatInterval;\n\n // don't repeat if the interval is 0 or less\n if (interval <= 0) { return; }\n\n // set a timeout to fire the holdrepeat event\n interaction.holdIntervalHandle = setTimeout(function () {\n pointerEvents.fire({\n interaction,\n eventTarget,\n type: 'hold',\n pointer: pointerEvent,\n event: pointerEvent,\n });\n }, interval);\n}\n\nfunction endHoldRepeat ({ interaction }) {\n // set the interaction's holdStopTime property\n // to stop further holdRepeat events\n if (interaction.holdIntervalHandle) {\n clearInterval(interaction.holdIntervalHandle);\n interaction.holdIntervalHandle = null;\n }\n}\n\n// don't repeat by default\npointerEvents.defaults.holdRepeatInterval = 0;\npointerEvents.types.push('holdrepeat');\n\nmodule.exports = {\n onNew,\n onFired,\n endHoldRepeat,\n};\n","const pointerEvents = require('./base');\nconst Interactable = require('../Interactable');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\nconst scope = require('../scope');\nconst extend = require('../utils/extend');\nconst { merge } = require('../utils/arr');\n\npointerEvents.signals.on('collect-targets', function ({ targets, element, type, eventTarget }) {\n function collectSelectors (interactable, selector, context) {\n const els = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && is.element(element)\n && domUtils.matchesSelector(element, selector, els)\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n const interactable = scope.interactables.get(element);\n\n if (interactable) {\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n scope.interactables.forEachSelector(collectSelectors, element);\n});\n\nInteractable.signals.on('new', function ({ interactable }) {\n interactable.events.getRect = function (element) {\n return interactable.getRect(element);\n };\n});\n\nInteractable.signals.on('set', function ({ interactable, options }) {\n extend(interactable.events.options, pointerEvents.defaults);\n extend(interactable.events.options, options);\n});\n\nmerge(Interactable.eventTypes, pointerEvents.types);\n\nInteractable.prototype.pointerEvents = function (options) {\n extend(this.events.options, options);\n\n return this;\n};\n\nconst __backCompatOption = Interactable.prototype._backCompatOption;\n\nInteractable.prototype._backCompatOption = function (optionName, newValue) {\n const ret = __backCompatOption.call(this, optionName, newValue);\n\n if (ret === this) {\n this.events.options[optionName] = newValue;\n }\n\n return ret;\n};\n\nInteractable.settingsMethods.push('pointerEvents');\n","const utils = require('./utils');\nconst events = require('./utils/events');\nconst signals = require('./utils/Signals').new();\n\nconst scope = {\n signals,\n events,\n utils,\n\n // main document\n document: require('./utils/domObjects').document,\n // all documents being listened to\n documents: [],\n\n addDocument: function (doc, win) {\n // do nothing if document is already known\n if (utils.contains(scope.documents, doc)) { return false; }\n\n win = win || scope.getWindow(doc);\n\n scope.documents.push(doc);\n events.documents.push(doc);\n\n // don't add an unload event for the main document\n // so that the page may be cached in browser history\n if (doc !== scope.document) {\n events.add(win, 'unload', scope.onWindowUnload);\n }\n\n signals.fire('add-document', { doc, win });\n },\n\n removeDocument: function (doc, win) {\n const index = utils.indexOf(scope.documents, doc);\n\n win = win || scope.getWindow(doc);\n\n events.remove(win, 'unload', scope.onWindowUnload);\n\n scope.documents.splice(index, 1);\n events.documents.splice(index, 1);\n\n signals.fire('remove-document', { win, doc });\n },\n\n onWindowUnload: function () {\n scope.removeDocument(this.document, this);\n },\n};\n\nmodule.exports = scope;\n","const { indexOf } = require('./arr');\n\nclass Signals {\n constructor () {\n this.listeners = {\n // signalName: [listeners],\n };\n }\n\n on (name, listener) {\n if (!this.listeners[name]) {\n this.listeners[name] = [listener];\n return;\n }\n\n this.listeners[name].push(listener);\n }\n\n off (name, listener) {\n if (!this.listeners[name]) { return; }\n\n const index = indexOf(this.listeners[name], listener);\n\n if (index !== -1) {\n this.listeners[name].splice(index, 1);\n }\n }\n\n fire (name, arg) {\n const targetListeners = this.listeners[name];\n\n if (!targetListeners) { return; }\n\n for (let i = 0; i < targetListeners.length; i++) {\n if (targetListeners[i](arg, name) === false) {\n return;\n }\n }\n }\n}\n\nSignals.new = function () {\n return new Signals();\n};\n\nmodule.exports = Signals;\n","function indexOf (array, target) {\n for (let i = 0, len = array.length; i < len; i++) {\n if (array[i] === target) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction contains (array, target) {\n return indexOf(array, target) !== -1;\n}\n\nfunction merge (target, source) {\n for (let i = 0; i < source.length; i++) {\n target.push(source[i]);\n }\n\n return target;\n}\n\nfunction filter (array, test) {\n const result = [];\n\n for (let i = 0; i < array.length; i++) {\n if (test(array[i])) {\n result.push(array[i]);\n }\n }\n\n return result;\n}\n\nmodule.exports = {\n indexOf,\n contains,\n merge,\n filter,\n};\n","const { window } = require('./window');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst Element = domObjects.Element;\nconst navigator = window.navigator;\n\nconst browser = {\n // Does the browser support touch input?\n supportsTouch: !!(('ontouchstart' in window) || is.function(window.DocumentTouch)\n && domObjects.document instanceof window.DocumentTouch),\n\n // Does the browser support PointerEvents\n supportsPointerEvent: !!domObjects.PointerEvent,\n\n isIE8: ('attachEvent' in window) && !('addEventListener' in window),\n\n // Opera Mobile must be handled differently\n isOperaMobile: (navigator.appName === 'Opera'\n && browser.supportsTouch\n && navigator.userAgent.match('Presto')),\n\n // scrolling doesn't change the result of getClientRects on iOS 7\n isIOS7: (/iP(hone|od|ad)/.test(navigator.platform)\n && /OS 7[^\\d]/.test(navigator.appVersion)),\n\n isIe9OrOlder: /MSIE (8|9)/.test(navigator.userAgent),\n\n // prefix matchesSelector\n prefixedMatchesSelector: 'matches' in Element.prototype\n ? 'matches': 'webkitMatchesSelector' in Element.prototype\n ? 'webkitMatchesSelector': 'mozMatchesSelector' in Element.prototype\n ? 'mozMatchesSelector': 'oMatchesSelector' in Element.prototype\n ? 'oMatchesSelector': 'msMatchesSelector',\n\n useMatchesSelectorPolyfill: false,\n\n pEventTypes: (domObjects.PointerEvent\n ? (domObjects.PointerEvent === window.MSPointerEvent\n ? {\n up: 'MSPointerUp',\n down: 'MSPointerDown',\n over: 'mouseover',\n out: 'mouseout',\n move: 'MSPointerMove',\n cancel: 'MSPointerCancel',\n }\n : {\n up: 'pointerup',\n down: 'pointerdown',\n over: 'pointerover',\n out: 'pointerout',\n move: 'pointermove',\n cancel: 'pointercancel',\n })\n : null),\n\n // because Webkit and Opera still use 'mousewheel' event type\n wheelEvent: 'onmousewheel' in domObjects.document? 'mousewheel': 'wheel',\n\n};\n\nbrowser.useMatchesSelectorPolyfill = !is.function(Element.prototype[browser.prefixedMatchesSelector]);\n\nmodule.exports = browser;\n","const domObjects = {};\nconst win = require('./window').window;\n\nfunction blank () {}\n\ndomObjects.document = win.document;\ndomObjects.DocumentFragment = win.DocumentFragment || blank;\ndomObjects.SVGElement = win.SVGElement || blank;\ndomObjects.SVGSVGElement = win.SVGSVGElement || blank;\ndomObjects.SVGElementInstance = win.SVGElementInstance || blank;\ndomObjects.Element = win.Element || blank;\ndomObjects.HTMLElement = win.HTMLElement || domObjects.Element;\n\ndomObjects.Event = win.Event;\ndomObjects.Touch = win.Touch || blank;\ndomObjects.PointerEvent = (win.PointerEvent || win.MSPointerEvent);\n\nmodule.exports = domObjects;\n","const win = require('./window');\nconst browser = require('./browser');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst domUtils = {\n nodeContains: function (parent, child) {\n while (child) {\n if (child === parent) {\n return true;\n }\n\n child = child.parentNode;\n }\n\n return false;\n },\n\n closest: function (element, selector) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) { return element; }\n\n element = domUtils.parentNode(element);\n }\n\n return null;\n },\n\n parentNode: function (node) {\n let parent = node.parentNode;\n\n if (is.docFrag(parent)) {\n // skip past #shado-root fragments\n while ((parent = parent.host) && is.docFrag(parent)) {\n continue;\n }\n\n return parent;\n }\n\n return parent;\n },\n\n // taken from http://tanalin.com/en/blog/2012/12/matches-selector-ie8/ and modified\n matchesSelectorPolyfill: browser.useMatchesSelectorPolyfill\n ? function (element, selector, elems) {\n elems = elems || element.parentNode.querySelectorAll(selector);\n\n for (let i = 0, len = elems.length; i < len; i++) {\n if (elems[i] === element) {\n return true;\n }\n }\n\n return false;\n }\n : null,\n\n matchesSelector: function (element, selector, nodeList) {\n if (browser.useMatchesSelectorPolyfill) {\n return domUtils.matchesSelectorPolyfill(element, selector, nodeList);\n }\n\n // remove /deep/ from selectors if shadowDOM polyfill is used\n if (win.window !== win.realWindow) {\n selector = selector.replace(/\\/deep\\//g, ' ');\n }\n\n return element[browser.prefixedMatchesSelector](selector);\n },\n\n // Test for the element that's \"above\" all other qualifiers\n indexOfDeepestElement: function (elements) {\n let deepestZoneParents = [];\n let dropzoneParents = [];\n let dropzone;\n let deepestZone = elements[0];\n let index = deepestZone? 0: -1;\n let parent;\n let child;\n let i;\n let n;\n\n for (i = 1; i < elements.length; i++) {\n dropzone = elements[i];\n\n // an element might belong to multiple selector dropzones\n if (!dropzone || dropzone === deepestZone) {\n continue;\n }\n\n if (!deepestZone) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n // check if the deepest or current are document.documentElement or document.rootElement\n // - if the current dropzone is, do nothing and continue\n if (dropzone.parentNode === dropzone.ownerDocument) {\n continue;\n }\n // - if deepest is, update with the current dropzone and continue to next\n else if (deepestZone.parentNode === dropzone.ownerDocument) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n if (!deepestZoneParents.length) {\n parent = deepestZone;\n while (parent.parentNode && parent.parentNode !== parent.ownerDocument) {\n deepestZoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n }\n\n // if this element is an svg element and the current deepest is\n // an HTMLElement\n if (deepestZone instanceof domObjects.HTMLElement\n && dropzone instanceof domObjects.SVGElement\n && !(dropzone instanceof domObjects.SVGSVGElement)) {\n\n if (dropzone === deepestZone.parentNode) {\n continue;\n }\n\n parent = dropzone.ownerSVGElement;\n }\n else {\n parent = dropzone;\n }\n\n dropzoneParents = [];\n\n while (parent.parentNode !== parent.ownerDocument) {\n dropzoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n\n n = 0;\n\n // get (position of last common ancestor) + 1\n while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) {\n n++;\n }\n\n const parents = [\n dropzoneParents[n - 1],\n dropzoneParents[n],\n deepestZoneParents[n],\n ];\n\n child = parents[0].lastChild;\n\n while (child) {\n if (child === parents[1]) {\n deepestZone = dropzone;\n index = i;\n deepestZoneParents = [];\n\n break;\n }\n else if (child === parents[2]) {\n break;\n }\n\n child = child.previousSibling;\n }\n }\n\n return index;\n },\n\n matchesUpTo: function (element, selector, limit) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) {\n return true;\n }\n\n element = domUtils.parentNode(element);\n\n if (element === limit) {\n return domUtils.matchesSelector(element, selector);\n }\n }\n\n return false;\n },\n\n getActualElement: function (element) {\n return (element instanceof domObjects.SVGElementInstance\n ? element.correspondingUseElement\n : element);\n },\n\n getScrollXY: function (relevantWindow) {\n relevantWindow = relevantWindow || win.window;\n return {\n x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft,\n y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop,\n };\n },\n\n getElementClientRect: function (element) {\n const clientRect = (element instanceof domObjects.SVGElement\n ? element.getBoundingClientRect()\n : element.getClientRects()[0]);\n\n return clientRect && {\n left : clientRect.left,\n right : clientRect.right,\n top : clientRect.top,\n bottom: clientRect.bottom,\n width : clientRect.width || clientRect.right - clientRect.left,\n height: clientRect.height || clientRect.bottom - clientRect.top,\n };\n },\n\n getElementRect: function (element) {\n const clientRect = domUtils.getElementClientRect(element);\n\n if (!browser.isIOS7 && clientRect) {\n const scroll = domUtils.getScrollXY(win.getWindow(element));\n\n clientRect.left += scroll.x;\n clientRect.right += scroll.x;\n clientRect.top += scroll.y;\n clientRect.bottom += scroll.y;\n }\n\n return clientRect;\n },\n\n getPath: function (element) {\n const path = [];\n\n while (element) {\n path.push(element);\n element = domUtils.parentNode(element);\n }\n\n return path;\n },\n\n trySelector: value => {\n if (!is.string(value)) { return false; }\n\n // an exception will be raised if it is invalid\n domObjects.document.querySelector(value);\n return true;\n },\n};\n\nmodule.exports = domUtils;\n","const is = require('./is');\nconst domUtils = require('./domUtils');\nconst pExtend = require('./pointerExtend');\n\nconst { window, getWindow } = require('./window');\nconst { indexOf, contains } = require('./arr');\n\nconst useAttachEvent = ('attachEvent' in window) && !('addEventListener' in window);\nconst addEvent = useAttachEvent? 'attachEvent': 'addEventListener';\nconst removeEvent = useAttachEvent? 'detachEvent': 'removeEventListener';\nconst on = useAttachEvent? 'on': '';\n\nconst elements = [];\nconst targets = [];\nconst attachedListeners = [];\n\n// {\n// type: {\n// selectors: ['selector', ...],\n// contexts : [document, ...],\n// listeners: [[listener, capture, passive], ...]\n// }\n// }\nconst delegatedEvents = {};\n\nconst documents = [];\n\nconst supportsOptions = !useAttachEvent && (() => {\n let supported = false;\n\n window.document.createElement('div').addEventListener('test', null, {\n get capture () { supported = true; },\n });\n\n return supported;\n})();\n\nfunction add (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n let elementIndex = indexOf(elements, element);\n let target = targets[elementIndex];\n\n if (!target) {\n target = {\n events: {},\n typeCount: 0,\n };\n\n elementIndex = elements.push(element) - 1;\n targets.push(target);\n\n attachedListeners.push(useAttachEvent\n ? {\n supplied: [],\n wrapped : [],\n useCount: [],\n }\n : null);\n }\n\n if (!target.events[type]) {\n target.events[type] = [];\n target.typeCount++;\n }\n\n if (!contains(target.events[type], listener)) {\n let ret;\n\n if (useAttachEvent) {\n const { supplied, wrapped, useCount } = attachedListeners[elementIndex];\n const listenerIndex = indexOf(supplied, listener);\n\n const wrappedListener = wrapped[listenerIndex] || function (event) {\n if (!event.immediatePropagationStopped) {\n event.target = event.srcElement;\n event.currentTarget = element;\n\n event.preventDefault = event.preventDefault || preventDef;\n event.stopPropagation = event.stopPropagation || stopProp;\n event.stopImmediatePropagation = event.stopImmediatePropagation || stopImmProp;\n\n if (/mouse|click/.test(event.type)) {\n event.pageX = event.clientX + getWindow(element).document.documentElement.scrollLeft;\n event.pageY = event.clientY + getWindow(element).document.documentElement.scrollTop;\n }\n\n listener(event);\n }\n };\n\n ret = element[addEvent](on + type, wrappedListener, !!options.capture);\n\n if (listenerIndex === -1) {\n supplied.push(listener);\n wrapped.push(wrappedListener);\n useCount.push(1);\n }\n else {\n useCount[listenerIndex]++;\n }\n }\n else {\n ret = element[addEvent](type, listener, supportsOptions? options : !!options.capture);\n }\n target.events[type].push(listener);\n\n return ret;\n }\n}\n\nfunction remove (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const elementIndex = indexOf(elements, element);\n const target = targets[elementIndex];\n\n if (!target || !target.events) {\n return;\n }\n\n let wrappedListener = listener;\n let listeners;\n let listenerIndex;\n\n if (useAttachEvent) {\n listeners = attachedListeners[elementIndex];\n listenerIndex = indexOf(listeners.supplied, listener);\n wrappedListener = listeners.wrapped[listenerIndex];\n }\n\n if (type === 'all') {\n for (type in target.events) {\n if (target.events.hasOwnProperty(type)) {\n remove(element, type, 'all');\n }\n }\n return;\n }\n\n if (target.events[type]) {\n const len = target.events[type].length;\n\n if (listener === 'all') {\n for (let i = 0; i < len; i++) {\n remove(element, type, target.events[type][i], options);\n }\n return;\n }\n else {\n for (let i = 0; i < len; i++) {\n if (target.events[type][i] === listener) {\n element[removeEvent](on + type, wrappedListener, supportsOptions? options : !!options.capture);\n target.events[type].splice(i, 1);\n\n if (useAttachEvent && listeners) {\n listeners.useCount[listenerIndex]--;\n if (listeners.useCount[listenerIndex] === 0) {\n listeners.supplied.splice(listenerIndex, 1);\n listeners.wrapped.splice(listenerIndex, 1);\n listeners.useCount.splice(listenerIndex, 1);\n }\n }\n\n break;\n }\n }\n }\n\n if (target.events[type] && target.events[type].length === 0) {\n target.events[type] = null;\n target.typeCount--;\n }\n }\n\n if (!target.typeCount) {\n targets.splice(elementIndex, 1);\n elements.splice(elementIndex, 1);\n attachedListeners.splice(elementIndex, 1);\n }\n}\n\nfunction addDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n if (!delegatedEvents[type]) {\n delegatedEvents[type] = {\n selectors: [],\n contexts : [],\n listeners: [],\n };\n\n // add delegate listener functions\n for (let i = 0; i < documents.length; i++) {\n add(documents[i], type, delegateListener);\n add(documents[i], type, delegateUseCapture, true);\n }\n }\n\n const delegated = delegatedEvents[type];\n let index;\n\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n break;\n }\n }\n\n if (index === -1) {\n index = delegated.selectors.length;\n\n delegated.selectors.push(selector);\n delegated.contexts .push(context);\n delegated.listeners.push([]);\n }\n\n // keep listener and capture and passive flags\n delegated.listeners[index].push([listener, !!options.capture, options.passive]);\n}\n\nfunction removeDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const delegated = delegatedEvents[type];\n let matchFound = false;\n let index;\n\n if (!delegated) { return; }\n\n // count from last index of delegated to 0\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n // look for matching selector and context Node\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n\n const listeners = delegated.listeners[index];\n\n // each item of the listeners array is an array: [function, capture, passive]\n for (let i = listeners.length - 1; i >= 0; i--) {\n const [fn, capture, passive] = listeners[i];\n\n // check if the listener functions and capture and passive flags match\n if (fn === listener && capture === !!options.capture && passive === options.passive) {\n // remove the listener from the array of listeners\n listeners.splice(i, 1);\n\n // if all listeners for this interactable have been removed\n // remove the interactable from the delegated arrays\n if (!listeners.length) {\n delegated.selectors.splice(index, 1);\n delegated.contexts .splice(index, 1);\n delegated.listeners.splice(index, 1);\n\n // remove delegate function from context\n remove(context, type, delegateListener);\n remove(context, type, delegateUseCapture, true);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegatedEvents[type] = null;\n }\n }\n\n // only remove one listener\n matchFound = true;\n break;\n }\n }\n\n if (matchFound) { break; }\n }\n }\n}\n\n// bound to the interactable context when a DOM event\n// listener is added to a selector interactable\nfunction delegateListener (event, optionalArg) {\n const options = getOptions(optionalArg);\n const fakeEvent = {};\n const delegated = delegatedEvents[event.type];\n const eventTarget = (domUtils.getActualElement(event.path\n ? event.path[0]\n : event.target));\n let element = eventTarget;\n\n // duplicate the event so that currentTarget can be changed\n pExtend(fakeEvent, event);\n\n fakeEvent.originalEvent = event;\n fakeEvent.preventDefault = preventOriginalDefault;\n\n // climb up document tree looking for selector matches\n while (is.element(element)) {\n for (let i = 0; i < delegated.selectors.length; i++) {\n const selector = delegated.selectors[i];\n const context = delegated.contexts[i];\n\n if (domUtils.matchesSelector(element, selector)\n && domUtils.nodeContains(context, eventTarget)\n && domUtils.nodeContains(context, element)) {\n\n const listeners = delegated.listeners[i];\n\n fakeEvent.currentTarget = element;\n\n for (let j = 0; j < listeners.length; j++) {\n const [fn, capture, passive] = listeners[j];\n\n if (capture === !!options.capture && passive === options.passive) {\n fn(fakeEvent);\n }\n }\n }\n }\n\n element = domUtils.parentNode(element);\n }\n}\n\nfunction delegateUseCapture (event) {\n return delegateListener.call(this, event, true);\n}\n\nfunction preventDef () {\n this.returnValue = false;\n}\n\nfunction preventOriginalDefault () {\n this.originalEvent.preventDefault();\n}\n\nfunction stopProp () {\n this.cancelBubble = true;\n}\n\nfunction stopImmProp () {\n this.cancelBubble = true;\n this.immediatePropagationStopped = true;\n}\n\nfunction getOptions (param) {\n return is.object(param)? param : { capture: param };\n}\n\nmodule.exports = {\n add,\n remove,\n\n addDelegate,\n removeDelegate,\n\n delegateListener,\n delegateUseCapture,\n delegatedEvents,\n documents,\n\n useAttachEvent,\n supportsOptions,\n\n _elements: elements,\n _targets: targets,\n _attachedListeners: attachedListeners,\n};\n","module.exports = function extend (dest, source) {\n for (const prop in source) {\n dest[prop] = source[prop];\n }\n return dest;\n};\n","const {\n resolveRectLike,\n rectToXY,\n} = require('./rect');\n\nmodule.exports = function (target, element, action) {\n const actionOptions = target.options[action];\n const actionOrigin = actionOptions && actionOptions.origin;\n const origin = actionOrigin || target.options.origin;\n\n const originRect = resolveRectLike(origin, target, element, [target && element]);\n\n return rectToXY(originRect) || { x: 0, y: 0 };\n};\n","module.exports = (x, y) => Math.sqrt(x * x + y * y);\n","const extend = require('./extend');\nconst win = require('./window');\n\nconst utils = {\n warnOnce: function (method, message) {\n let warned = false;\n\n return function () {\n if (!warned) {\n win.window.console.warn(message);\n warned = true;\n }\n\n return method.apply(this, arguments);\n };\n },\n\n // http://stackoverflow.com/a/5634528/2280888\n _getQBezierValue: function (t, p1, p2, p3) {\n const iT = 1 - t;\n return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3;\n },\n\n getQuadraticCurvePoint: function (startX, startY, cpX, cpY, endX, endY, position) {\n return {\n x: utils._getQBezierValue(position, startX, cpX, endX),\n y: utils._getQBezierValue(position, startY, cpY, endY),\n };\n },\n\n // http://gizma.com/easing/\n easeOutQuad: function (t, b, c, d) {\n t /= d;\n return -c * t*(t-2) + b;\n },\n\n copyAction: function (dest, src) {\n dest.name = src.name;\n dest.axis = src.axis;\n dest.edges = src.edges;\n\n return dest;\n },\n\n is : require('./is'),\n extend : extend,\n hypot : require('./hypot'),\n getOriginXY: require('./getOriginXY'),\n};\n\nextend(utils, require('./arr'));\nextend(utils, require('./domUtils'));\nextend(utils, require('./pointerUtils'));\nextend(utils, require('./rect'));\n\nmodule.exports = utils;\n","const scope = require('../scope');\nconst utils = require('./index');\nconst browser = require('./browser');\n\nconst finder = {\n methodOrder: [ 'simulationResume', 'mouse', 'hasPointer', 'idle' ],\n\n search: function (pointer, eventType, eventTarget) {\n const mouseEvent = (/mouse/i.test(pointer.pointerType || eventType)\n // MSPointerEvent.MSPOINTER_TYPE_MOUSE\n || pointer.pointerType === 4);\n const pointerId = utils.getPointerId(pointer);\n const details = { pointer, pointerId, mouseEvent, eventType, eventTarget };\n\n for (const method of finder.methodOrder) {\n const interaction = finder[method](details);\n\n if (interaction) {\n return interaction;\n }\n }\n },\n\n // try to resume simulation with a new pointer\n simulationResume: function ({ mouseEvent, eventType, eventTarget }) {\n if (!/down|start/i.test(eventType)) {\n return null;\n }\n\n for (const interaction of scope.interactions) {\n let element = eventTarget;\n\n if (interaction.simulation && interaction.simulation.allowResume\n && (interaction.mouse === mouseEvent)) {\n while (element) {\n // if the element is the interaction element\n if (element === interaction.element) {\n return interaction;\n }\n element = utils.parentNode(element);\n }\n }\n }\n\n return null;\n },\n\n // if it's a mouse interaction\n mouse: function ({ pointerId, mouseEvent, eventType }) {\n if (!mouseEvent && (browser.supportsTouch || browser.supportsPointerEvent)) {\n return null;\n }\n\n let firstNonActive;\n\n for (const interaction of scope.interactions) {\n if (interaction.mouse) {\n // if it's a down event, skip interactions with running simulations\n if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; }\n\n // if the interaction is active, return it immediately\n if (interaction.interacting()) {\n return interaction;\n }\n // otherwise save it and look for another active interaction\n else if (!firstNonActive) {\n firstNonActive = interaction;\n }\n }\n }\n\n // if no active mouse interaction was found use the first inactive mouse\n // interaction\n if (firstNonActive) {\n return firstNonActive;\n }\n\n // Find any interaction specifically for mouse.\n // ignore the interaction if the eventType is a mousedown, and a simulation\n // is active\n for (const interaction of scope.interactions) {\n if (interaction.mouse && !(/down/.test(eventType) && interaction.simulation)) {\n return interaction;\n }\n }\n\n return null;\n },\n\n // get interaction that has this pointer\n hasPointer: function ({ pointerId }) {\n for (const interaction of scope.interactions) {\n if (utils.contains(interaction.pointerIds, pointerId)) {\n return interaction;\n }\n }\n },\n\n // get first idle interaction\n idle: function ({ mouseEvent }) {\n for (const interaction of scope.interactions) {\n // if there's already a pointer held down\n if (interaction.pointerIds.length === 1) {\n const target = interaction.target;\n // don't add this pointer if there is a target interactable and it\n // isn't gesturable\n if (target && !target.options.gesture.enabled) {\n continue;\n }\n }\n // maximum of 2 pointers per interaction\n else if (interaction.pointerIds.length >= 2) {\n continue;\n }\n\n if (!interaction.interacting() && (mouseEvent === interaction.mouse)) {\n return interaction;\n }\n }\n\n return null;\n },\n};\n\nmodule.exports = finder;\n","const win = require('./window');\nconst isWindow = require('./isWindow');\n\nconst is = {\n array : () => {},\n\n window : thing => thing === win.window || isWindow(thing),\n\n docFrag : thing => is.object(thing) && thing.nodeType === 11,\n\n object : thing => !!thing && (typeof thing === 'object'),\n\n function: thing => typeof thing === 'function',\n\n number : thing => typeof thing === 'number' ,\n\n bool : thing => typeof thing === 'boolean' ,\n\n string : thing => typeof thing === 'string' ,\n\n element: thing => {\n if (!thing || (typeof thing !== 'object')) { return false; }\n\n const _window = win.getWindow(thing) || win.window;\n\n return (/object|function/.test(typeof _window.Element)\n ? thing instanceof _window.Element //DOM2\n : thing.nodeType === 1 && typeof thing.nodeName === 'string');\n },\n};\n\nis.array = thing => (is.object(thing)\n && (typeof thing.length !== 'undefined')\n && is.function(thing.splice));\n\nmodule.exports = is;\n","module.exports = (thing) => !!(thing && thing.Window) && (thing instanceof thing.Window);\n","function pointerExtend (dest, source) {\n for (const prop in source) {\n const prefixedPropREs = module.exports.prefixedPropREs;\n let deprecated = false;\n\n // skip deprecated prefixed properties\n for (const vendor in prefixedPropREs) {\n if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) {\n deprecated = true;\n break;\n }\n }\n\n if (!deprecated && typeof source[prop] !== 'function') {\n dest[prop] = source[prop];\n }\n }\n return dest;\n}\n\npointerExtend.prefixedPropREs = {\n webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/,\n};\n\nmodule.exports = pointerExtend;\n","const hypot = require('./hypot');\nconst browser = require('./browser');\nconst dom = require('./domObjects');\nconst domUtils = require('./domUtils');\nconst is = require('./is');\nconst pointerExtend = require('./pointerExtend');\n\nconst pointerUtils = {\n copyCoords: function (dest, src) {\n dest.page = dest.page || {};\n dest.page.x = src.page.x;\n dest.page.y = src.page.y;\n\n dest.client = dest.client || {};\n dest.client.x = src.client.x;\n dest.client.y = src.client.y;\n\n dest.timeStamp = src.timeStamp;\n },\n\n setCoordDeltas: function (targetObj, prev, cur) {\n targetObj.page.x = cur.page.x - prev.page.x;\n targetObj.page.y = cur.page.y - prev.page.y;\n targetObj.client.x = cur.client.x - prev.client.x;\n targetObj.client.y = cur.client.y - prev.client.y;\n targetObj.timeStamp = cur.timeStamp - prev.timeStamp;\n\n // set pointer velocity\n const dt = Math.max(targetObj.timeStamp / 1000, 0.001);\n\n targetObj.page.speed = hypot(targetObj.page.x, targetObj.page.y) / dt;\n targetObj.page.vx = targetObj.page.x / dt;\n targetObj.page.vy = targetObj.page.y / dt;\n\n targetObj.client.speed = hypot(targetObj.client.x, targetObj.page.y) / dt;\n targetObj.client.vx = targetObj.client.x / dt;\n targetObj.client.vy = targetObj.client.y / dt;\n },\n\n isNativePointer: function (pointer) {\n return (pointer instanceof dom.Event || pointer instanceof dom.Touch);\n },\n\n // Get specified X/Y coords for mouse or event.touches[0]\n getXY: function (type, pointer, xy) {\n xy = xy || {};\n type = type || 'page';\n\n xy.x = pointer[type + 'X'];\n xy.y = pointer[type + 'Y'];\n\n return xy;\n },\n\n getPageXY: function (pointer, page) {\n page = page || {};\n\n // Opera Mobile handles the viewport and scrolling oddly\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n pointerUtils.getXY('screen', pointer, page);\n\n page.x += window.scrollX;\n page.y += window.scrollY;\n }\n else {\n pointerUtils.getXY('page', pointer, page);\n }\n\n return page;\n },\n\n getClientXY: function (pointer, client) {\n client = client || {};\n\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n // Opera Mobile handles the viewport and scrolling oddly\n pointerUtils.getXY('screen', pointer, client);\n }\n else {\n pointerUtils.getXY('client', pointer, client);\n }\n\n return client;\n },\n\n getPointerId: function (pointer) {\n return is.number(pointer.pointerId)? pointer.pointerId : pointer.identifier;\n },\n\n setCoords: function (targetObj, pointers, timeStamp) {\n const pointer = (pointers.length > 1\n ? pointerUtils.pointerAverage(pointers)\n : pointers[0]);\n\n const tmpXY = {};\n\n pointerUtils.getPageXY(pointer, tmpXY);\n targetObj.page.x = tmpXY.x;\n targetObj.page.y = tmpXY.y;\n\n pointerUtils.getClientXY(pointer, tmpXY);\n targetObj.client.x = tmpXY.x;\n targetObj.client.y = tmpXY.y;\n\n targetObj.timeStamp = is.number(timeStamp) ? timeStamp :new Date().getTime();\n },\n\n pointerExtend: pointerExtend,\n\n getTouchPair: function (event) {\n const touches = [];\n\n // array of touches is supplied\n if (is.array(event)) {\n touches[0] = event[0];\n touches[1] = event[1];\n }\n // an event\n else {\n if (event.type === 'touchend') {\n if (event.touches.length === 1) {\n touches[0] = event.touches[0];\n touches[1] = event.changedTouches[0];\n }\n else if (event.touches.length === 0) {\n touches[0] = event.changedTouches[0];\n touches[1] = event.changedTouches[1];\n }\n }\n else {\n touches[0] = event.touches[0];\n touches[1] = event.touches[1];\n }\n }\n\n return touches;\n },\n\n pointerAverage: function (pointers) {\n const average = {\n pageX : 0,\n pageY : 0,\n clientX: 0,\n clientY: 0,\n screenX: 0,\n screenY: 0,\n };\n\n for (const pointer of pointers) {\n for (const prop in average) {\n average[prop] += pointer[prop];\n }\n }\n for (const prop in average) {\n average[prop] /= pointers.length;\n }\n\n return average;\n },\n\n touchBBox: function (event) {\n if (!event.length && !(event.touches && event.touches.length > 1)) {\n return;\n }\n\n const touches = pointerUtils.getTouchPair(event);\n const minX = Math.min(touches[0].pageX, touches[1].pageX);\n const minY = Math.min(touches[0].pageY, touches[1].pageY);\n const maxX = Math.max(touches[0].pageX, touches[1].pageX);\n const maxY = Math.max(touches[0].pageY, touches[1].pageY);\n\n return {\n x: minX,\n y: minY,\n left: minX,\n top: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n },\n\n touchDistance: function (event, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n\n\n const dx = touches[0][sourceX] - touches[1][sourceX];\n const dy = touches[0][sourceY] - touches[1][sourceY];\n\n return hypot(dx, dy);\n },\n\n touchAngle: function (event, prevAngle, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n const dx = touches[1][sourceX] - touches[0][sourceX];\n const dy = touches[1][sourceY] - touches[0][sourceY];\n const angle = 180 * Math.atan2(dy , dx) / Math.PI;\n\n return angle;\n },\n\n getPointerType: function (pointer, interaction) {\n // if the PointerEvent API isn't available, then the pointer must be ither\n // a MouseEvent or TouchEvent\n if (interaction.mouse) { return 'mouse'; }\n if (!browser.supportsPointerEvent) { return 'touch'; }\n\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : [undefined, undefined,'touch', 'pen', 'mouse'][pointer.pointerType];\n },\n\n // [ event.target, event.currentTarget ]\n getEventTargets: function (event) {\n return [\n domUtils.getActualElement(event.path ? event.path[0] : event.target),\n domUtils.getActualElement(event.currentTarget),\n ];\n },\n};\n\nmodule.exports = pointerUtils;\n","const { window } = require('./window');\n\nconst vendors = ['ms', 'moz', 'webkit', 'o'];\nlet lastTime = 0;\nlet request;\nlet cancel;\n\nfor (let x = 0; x < vendors.length && !window.requestAnimationFrame; x++) {\n request = window[vendors[x] + 'RequestAnimationFrame'];\n cancel = window[vendors[x] +'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n}\n\nif (!request) {\n request = function (callback) {\n const currTime = new Date().getTime();\n const timeToCall = Math.max(0, 16 - (currTime - lastTime));\n const id = setTimeout(function () { callback(currTime + timeToCall); },\n timeToCall);\n\n lastTime = currTime + timeToCall;\n return id;\n };\n}\n\nif (!cancel) {\n cancel = function (id) {\n clearTimeout(id);\n };\n}\n\nmodule.exports = {\n request,\n cancel,\n};\n","const extend = require('./extend');\nconst is = require('./is');\nconst {\n closest,\n parentNode,\n getElementRect,\n} = require('./domUtils');\n\nconst rectUtils = {\n getStringOptionResult: function (value, interactable, element) {\n if (!is.string(value)) {\n return null;\n }\n\n if (value === 'parent') {\n value = parentNode(element);\n }\n else if (value === 'self') {\n value = interactable.getRect(element);\n }\n else {\n value = closest(element, value);\n }\n\n return value;\n },\n\n resolveRectLike: function (value, interactable, element, functionArgs) {\n value = rectUtils.getStringOptionResult(value, interactable, element) || value;\n\n if (is.function(value)) {\n value = value.apply(null, functionArgs);\n }\n\n if (is.element(value)) {\n value = getElementRect(value);\n }\n\n return value;\n },\n\n rectToXY: function (rect) {\n return rect && {\n x: 'x' in rect ? rect.x : rect.left,\n y: 'y' in rect ? rect.y : rect.top,\n };\n },\n\n xywhToTlbr: function (rect) {\n if (rect && !('left' in rect && 'top' in rect)) {\n rect = extend({}, rect);\n\n rect.left = rect.x || 0;\n rect.top = rect.y || 0;\n rect.right = rect.right || (rect.left + rect.width);\n rect.bottom = rect.bottom || (rect.top + rect.height);\n }\n\n return rect;\n },\n\n tlbrToXywh: function (rect) {\n if (rect && !('x' in rect && 'y' in rect)) {\n rect = extend({}, rect);\n\n rect.x = rect.left || 0;\n rect.top = rect.top || 0;\n rect.width = rect.width || (rect.right - rect.x);\n rect.height = rect.height || (rect.bottom - rect.y);\n }\n\n return rect;\n },\n};\n\nmodule.exports = rectUtils;\n","const win = module.exports;\nconst isWindow = require('./isWindow');\n\nfunction init (window) {\n // get wrapped window if using Shadow DOM polyfill\n\n win.realWindow = window;\n\n // create a TextNode\n const el = window.document.createTextNode('');\n\n // check if it's wrapped by a polyfill\n if (el.ownerDocument !== window.document\n && typeof window.wrap === 'function'\n && window.wrap(el) === el) {\n // use wrapped window\n window = window.wrap(window);\n }\n\n win.window = window;\n}\n\nif (typeof window === 'undefined') {\n win.window = undefined;\n win.realWindow = undefined;\n}\nelse {\n init(window);\n}\n\nwin.getWindow = function getWindow (node) {\n if (isWindow(node)) {\n return node;\n }\n\n const rootNode = (node.ownerDocument || node);\n\n return rootNode.defaultView || rootNode.parentWindow || win.window;\n};\n\nwin.init = init;\n"]} \ No newline at end of file +{"version":3,"sources":["src/minHeader.js","src/header.js","index.js","src/Eventable.js","src/InteractEvent.js","src/Interactable.js","src/Interaction.js","src/actions/base.js","src/actions/drag.js","src/actions/drop.js","src/actions/gesture.js","src/actions/resize.js","src/autoScroll.js","src/autoStart/InteractableMethods.js","src/autoStart/base.js","src/autoStart/delay.js","src/autoStart/drag.js","src/autoStart/gesture.js","src/autoStart/resize.js","src/defaultOptions.js","src/index.js","src/inertia.js","src/interact.js","src/interactablePreventDefault.js","src/legacyBrowsers.js","src/modifiers/index.js","src/modifiers/restrict.js","src/modifiers/restrictEdges.js","src/modifiers/restrictSize.js","src/modifiers/snap.js","src/modifiers/snapSize.js","src/pointerEvents/PointerEvent.js","src/pointerEvents/base.js","src/pointerEvents/holdRepeat.js","src/pointerEvents/interactableTargets.js","src/scope.js","src/utils/Signals.js","src/utils/arr.js","src/utils/browser.js","src/utils/domObjects.js","src/utils/domUtils.js","src/utils/events.js","src/utils/extend.js","src/utils/getOriginXY.js","src/utils/hypot.js","src/utils/index.js","src/utils/interactionFinder.js","src/utils/is.js","src/utils/isWindow.js","src/utils/pointerExtend.js","src/utils/pointerUtils.js","src/utils/raf.js","src/utils/rect.js","src/utils/window.js"],"names":[],"mappings":"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","file":"interact.min.js","sourceRoot":"","sourcesContent":["/* interact.js v1.3.0-alpha.4+sha.7970416-dirty | https://raw.github.com/taye/interact.js/master/LICENSE */\n","/**\n * interact.js v1.3.0-alpha.4+sha.7970416-dirty\n *\n * Copyright (c) 2012-2017 Taye Adeyemi \n * Open source under the MIT License.\n * https://raw.github.com/taye/interact.js/master/LICENSE\n */\n","/*\n * In a (windowless) server environment this file exports a factory function\n * that takes the window to use.\n *\n * var interact = require('interact.js')(windowObject);\n *\n * See https://github.com/taye/interact.js/issues/187\n */\nif (typeof window === 'undefined') {\n module.exports = function (window) {\n require('./src/utils/window').init(window);\n\n return require('./src/index');\n };\n}\nelse {\n module.exports = require('./src/index');\n}\n","const { indexOf } = require('./utils/arr');\nconst extend = require('./utils/extend.js');\n\nfunction fireUntilImmediateStopped (event, listeners) {\n for (let i = 0, len = listeners.length; i < len && !event.immediatePropagationStopped; i++) {\n listeners[i](event);\n }\n}\n\nclass Eventable {\n\n constructor (options) {\n this.options = extend({}, options || {});\n }\n\n fire (event) {\n let listeners;\n const onEvent = 'on' + event.type;\n const global = this.global;\n\n // Interactable#on() listeners\n if ((listeners = this[event.type])) {\n fireUntilImmediateStopped(event, listeners);\n }\n\n // interactable.onevent listener\n if (this[onEvent]) {\n this[onEvent](event);\n }\n\n // interact.on() listeners\n if (!event.propagationStopped && global && (listeners = global[event.type])) {\n fireUntilImmediateStopped(event, listeners);\n }\n }\n\n on (eventType, listener) {\n // if this type of event was never bound\n if (this[eventType]) {\n this[eventType].push(listener);\n }\n else {\n this[eventType] = [listener];\n }\n }\n\n off (eventType, listener) {\n // if it is an action event type\n const eventList = this[eventType];\n const index = eventList? indexOf(eventList, listener) : -1;\n\n if (index !== -1) {\n eventList.splice(index, 1);\n }\n\n if (eventList && eventList.length === 0 || !listener) {\n this[eventType] = listener;\n }\n }\n}\n\nmodule.exports = Eventable;\n","const extend = require('./utils/extend');\nconst getOriginXY = require('./utils/getOriginXY');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nclass InteractEvent {\n constructor (interaction, event, action, phase, element, related, preEnd = false) {\n const target = interaction.target;\n const deltaSource = (target && target.options || defaults).deltaSource;\n const origin = getOriginXY(target, element, action);\n const starting = phase === 'start';\n const ending = phase === 'end';\n const coords = starting? interaction.startCoords : interaction.curCoords;\n const prevEvent = interaction.prevEvent;\n\n element = element || interaction.element;\n\n const page = extend({}, coords.page);\n const client = extend({}, coords.client);\n\n page.x -= origin.x;\n page.y -= origin.y;\n\n client.x -= origin.x;\n client.y -= origin.y;\n\n this.ctrlKey = event.ctrlKey;\n this.altKey = event.altKey;\n this.shiftKey = event.shiftKey;\n this.metaKey = event.metaKey;\n this.button = event.button;\n this.buttons = event.buttons;\n this.target = element;\n this.currentTarget = element;\n this.relatedTarget = related || null;\n this.preEnd = preEnd;\n this.type = action + (phase || '');\n this.interaction = interaction;\n this.interactable = target;\n\n this.t0 = starting ? interaction.downTimes[interaction.downTimes.length - 1]\n : prevEvent.t0;\n\n const signalArg = {\n interaction,\n event,\n action,\n phase,\n element,\n related,\n page,\n client,\n coords,\n starting,\n ending,\n deltaSource,\n iEvent: this,\n };\n\n signals.fire('set-xy', signalArg);\n\n if (ending) {\n // use previous coords when ending\n this.pageX = prevEvent.pageX;\n this.pageY = prevEvent.pageY;\n this.clientX = prevEvent.clientX;\n this.clientY = prevEvent.clientY;\n }\n else {\n this.pageX = page.x;\n this.pageY = page.y;\n this.clientX = client.x;\n this.clientY = client.y;\n }\n\n this.x0 = interaction.startCoords.page.x - origin.x;\n this.y0 = interaction.startCoords.page.y - origin.y;\n this.clientX0 = interaction.startCoords.client.x - origin.x;\n this.clientY0 = interaction.startCoords.client.y - origin.y;\n\n signals.fire('set-delta', signalArg);\n\n this.timeStamp = coords.timeStamp;\n this.dt = interaction.pointerDelta.timeStamp;\n this.duration = this.timeStamp - this.t0;\n\n // speed and velocity in pixels per second\n this.speed = interaction.pointerDelta[deltaSource].speed;\n this.velocityX = interaction.pointerDelta[deltaSource].vx;\n this.velocityY = interaction.pointerDelta[deltaSource].vy;\n\n this.swipe = (ending || phase === 'inertiastart')? this.getSwipe() : null;\n\n signals.fire('new', signalArg);\n }\n\n getSwipe () {\n const interaction = this.interaction;\n\n if (interaction.prevEvent.speed < 600\n || this.timeStamp - interaction.prevEvent.timeStamp > 150) {\n return null;\n }\n\n let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI;\n const overlap = 22.5;\n\n if (angle < 0) {\n angle += 360;\n }\n\n const left = 135 - overlap <= angle && angle < 225 + overlap;\n const up = 225 - overlap <= angle && angle < 315 + overlap;\n\n const right = !left && (315 - overlap <= angle || angle < 45 + overlap);\n const down = !up && 45 - overlap <= angle && angle < 135 + overlap;\n\n return {\n up,\n down,\n left,\n right,\n angle,\n speed: interaction.prevEvent.speed,\n velocity: {\n x: interaction.prevEvent.velocityX,\n y: interaction.prevEvent.velocityY,\n },\n };\n }\n\n preventDefault () {}\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n}\n\nsignals.on('set-delta', function ({ iEvent, interaction, starting, deltaSource }) {\n const prevEvent = starting? iEvent : interaction.prevEvent;\n\n if (deltaSource === 'client') {\n iEvent.dx = iEvent.clientX - prevEvent.clientX;\n iEvent.dy = iEvent.clientY - prevEvent.clientY;\n }\n else {\n iEvent.dx = iEvent.pageX - prevEvent.pageX;\n iEvent.dy = iEvent.pageY - prevEvent.pageY;\n }\n});\n\nInteractEvent.signals = signals;\n\nmodule.exports = InteractEvent;\n","const is = require('./utils/is');\nconst events = require('./utils/events');\nconst extend = require('./utils/extend');\nconst actions = require('./actions/base');\nconst scope = require('./scope');\nconst Eventable = require('./Eventable');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nconst {\n getElementRect,\n nodeContains,\n trySelector,\n} = require('./utils/domUtils');\nconst { getWindow } = require('./utils/window');\nconst { indexOf, contains } = require('./utils/arr');\nconst { wheelEvent } = require('./utils/browser');\n\n// all set interactables\nscope.interactables = [];\n\n/*\\\n * Interactable\n [ property ]\n **\n * Object type returned by @interact\n\\*/\nclass Interactable {\n constructor (target, options) {\n options = options || {};\n\n this.target = target;\n this.events = new Eventable();\n this._context = options.context || scope.document;\n this._win = getWindow(trySelector(target)? this._context : target);\n this._doc = this._win.document;\n\n signals.fire('new', {\n target,\n options,\n interactable: this,\n win: this._win,\n });\n\n scope.addDocument( this._doc, this._win );\n\n scope.interactables.push(this);\n\n this.set(options);\n }\n\n setOnEvents (action, phases) {\n const onAction = 'on' + action;\n\n if (is.function(phases.onstart) ) { this.events[onAction + 'start' ] = phases.onstart ; }\n if (is.function(phases.onmove) ) { this.events[onAction + 'move' ] = phases.onmove ; }\n if (is.function(phases.onend) ) { this.events[onAction + 'end' ] = phases.onend ; }\n if (is.function(phases.oninertiastart)) { this.events[onAction + 'inertiastart' ] = phases.oninertiastart ; }\n\n return this;\n }\n\n setPerAction (action, options) {\n // for all the default per-action options\n for (const option in options) {\n // if this option exists for this action\n if (option in defaults[action]) {\n // if the option in the options arg is an object value\n if (is.object(options[option])) {\n // duplicate the object\n this.options[action][option] = extend(this.options[action][option] || {}, options[option]);\n\n if (is.object(defaults.perAction[option]) && 'enabled' in defaults.perAction[option]) {\n this.options[action][option].enabled = options[option].enabled === false? false : true;\n }\n }\n else if (is.bool(options[option]) && is.object(defaults.perAction[option])) {\n this.options[action][option].enabled = options[option];\n }\n else if (options[option] !== undefined) {\n // or if it's not undefined, do a plain assignment\n this.options[action][option] = options[option];\n }\n }\n }\n }\n\n /*\\\n * Interactable.getRect\n [ method ]\n *\n * The default function to get an Interactables bounding rect. Can be\n * overridden using @Interactable.rectChecker.\n *\n - element (Element) #optional The element to measure.\n = (object) The object's bounding rectangle.\n o {\n o top : 0,\n o left : 0,\n o bottom: 0,\n o right : 0,\n o width : 0,\n o height: 0\n o }\n \\*/\n getRect (element) {\n element = element || this.target;\n\n if (is.string(this.target) && !(is.element(element))) {\n element = this._context.querySelector(this.target);\n }\n\n return getElementRect(element);\n }\n\n /*\\\n * Interactable.rectChecker\n [ method ]\n *\n * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n - checker (function) #optional A function which returns this Interactable's bounding rectangle. See @Interactable.getRect\n = (function | object) The checker function or this Interactable\n \\*/\n rectChecker (checker) {\n if (is.function(checker)) {\n this.getRect = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.getRect;\n\n return this;\n }\n\n return this.getRect;\n }\n\n _backCompatOption (optionName, newValue) {\n if (trySelector(newValue) || is.object(newValue)) {\n this.options[optionName] = newValue;\n\n for (const action of actions.names) {\n this.options[action][optionName] = newValue;\n }\n\n return this;\n }\n\n return this.options[optionName];\n }\n\n /*\\\n * Interactable.origin\n [ method ]\n *\n * Gets or sets the origin of the Interactable's element. The x and y\n * of the origin will be subtracted from action event coordinates.\n *\n - origin (object | string) #optional An object eg. { x: 0, y: 0 } or string 'parent', 'self' or any CSS selector\n * OR\n - origin (Element) #optional An HTML or SVG Element whose rect will be used\n **\n = (object) The current origin or this Interactable\n \\*/\n origin (newValue) {\n return this._backCompatOption('origin', newValue);\n }\n\n /*\\\n * Interactable.deltaSource\n [ method ]\n *\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n - newValue (string) #optional Use 'client' if you will be scrolling while interacting; Use 'page' if you want autoScroll to work\n = (string | object) The current deltaSource or this Interactable\n \\*/\n deltaSource (newValue) {\n if (newValue === 'page' || newValue === 'client') {\n this.options.deltaSource = newValue;\n\n return this;\n }\n\n return this.options.deltaSource;\n }\n\n /*\\\n * Interactable.context\n [ method ]\n *\n * Gets the selector context Node of the Interactable. The default is `window.document`.\n *\n = (Node) The context Node of this Interactable\n **\n \\*/\n context () {\n return this._context;\n }\n\n inContext (element) {\n return (this._context === element.ownerDocument\n || nodeContains(this._context, element));\n }\n\n /*\\\n * Interactable.fire\n [ method ]\n *\n * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n - iEvent (InteractEvent) The InteractEvent object to be fired on this Interactable\n = (Interactable) this Interactable\n \\*/\n fire (iEvent) {\n this.events.fire(iEvent);\n\n return this;\n }\n\n _onOffMultiple (method, eventType, listener, options) {\n if (is.string(eventType) && eventType.search(' ') !== -1) {\n eventType = eventType.trim().split(/ +/);\n }\n\n if (is.array(eventType)) {\n for (let i = 0; i < eventType.length; i++) {\n this[method](eventType[i], listener, options);\n }\n\n return true;\n }\n\n if (is.object(eventType)) {\n for (const prop in eventType) {\n this[method](prop, eventType[prop], listener);\n }\n\n return true;\n }\n }\n\n /*\\\n * Interactable.on\n [ method ]\n *\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n - eventType (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) This Interactable\n \\*/\n on (eventType, listener, options) {\n if (this._onOffMultiple('on', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.on(eventType, listener);\n }\n // delegated event for selector\n else if (is.string(this.target)) {\n events.addDelegate(this.target, this._context, eventType, listener, options);\n }\n else {\n events.add(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.off\n [ method ]\n *\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n - eventType (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) This Interactable\n \\*/\n off (eventType, listener, options) {\n if (this._onOffMultiple('off', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n // if it is an action event type\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.off(eventType, listener);\n }\n // delegated event\n else if (is.string(this.target)) {\n events.removeDelegate(this.target, this._context, eventType, listener, options);\n }\n // remove listener from this Interatable's element\n else {\n events.remove(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.set\n [ method ]\n *\n * Reset the options of this Interactable\n - options (object) The new settings to apply\n = (object) This Interactable\n \\*/\n set (options) {\n if (!is.object(options)) {\n options = {};\n }\n\n this.options = extend({}, defaults.base);\n\n const perActions = extend({}, defaults.perAction);\n\n for (const actionName in actions.methodDict) {\n const methodName = actions.methodDict[actionName];\n\n this.options[actionName] = extend({}, defaults[actionName]);\n\n this.setPerAction(actionName, perActions);\n\n this[methodName](options[actionName]);\n }\n\n for (const setting of Interactable.settingsMethods) {\n this.options[setting] = defaults.base[setting];\n\n if (setting in options) {\n this[setting](options[setting]);\n }\n }\n\n signals.fire('set', {\n options,\n interactable: this,\n });\n\n return this;\n }\n\n /*\\\n * Interactable.unset\n [ method ]\n *\n * Remove this interactable from the list of interactables and remove\n * it's action capabilities and event listeners\n *\n = (object) @interact\n \\*/\n unset () {\n events.remove(this.target, 'all');\n\n if (is.string(this.target)) {\n // remove delegated events\n for (const type in events.delegatedEvents) {\n const delegated = events.delegatedEvents[type];\n\n if (delegated.selectors[0] === this.target\n && delegated.contexts[0] === this._context) {\n\n delegated.selectors.splice(0, 1);\n delegated.contexts .splice(0, 1);\n delegated.listeners.splice(0, 1);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegated[type] = null;\n }\n }\n\n events.remove(this._context, type, events.delegateListener);\n events.remove(this._context, type, events.delegateUseCapture, true);\n }\n }\n else {\n events.remove(this, 'all');\n }\n\n signals.fire('unset', { interactable: this });\n\n scope.interactables.splice(indexOf(scope.interactables, this), 1);\n\n // Stop related interactions when an Interactable is unset\n for (const interaction of scope.interactions || []) {\n if (interaction.target === this && interaction.interacting()) {\n interaction.stop();\n }\n }\n\n return scope.interact;\n }\n}\n\nscope.interactables.indexOfElement = function indexOfElement (target, context) {\n context = context || scope.document;\n\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n if (interactable.target === target && interactable._context === context) {\n return i;\n }\n }\n return -1;\n};\n\nscope.interactables.get = function interactableGet (element, options, dontCheckInContext) {\n const ret = this[this.indexOfElement(element, options && options.context)];\n\n return ret && (is.string(element) || dontCheckInContext || ret.inContext(element))? ret : null;\n};\n\nscope.interactables.forEachSelector = function (callback, element) {\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n // skip non CSS selector targets and out of context elements\n if (!is.string(interactable.target)\n || (element && !interactable.inContext(element))) {\n continue;\n }\n\n const ret = callback(interactable, interactable.target, interactable._context, i, this);\n\n if (ret !== undefined) {\n return ret;\n }\n }\n};\n\n// all interact.js eventTypes\nInteractable.eventTypes = scope.eventTypes = [];\n\nInteractable.signals = signals;\n\nInteractable.settingsMethods = [ 'deltaSource', 'origin', 'preventDefault', 'rectChecker' ];\n\nmodule.exports = Interactable;\n","const scope = require('./scope');\nconst utils = require('./utils');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst domObjects = require('./utils/domObjects');\nconst finder = require('./utils/interactionFinder');\nconst signals = require('./utils/Signals').new();\n\nconst listeners = {};\nconst methodNames = [\n 'pointerDown', 'pointerMove', 'pointerUp',\n 'updatePointer', 'removePointer',\n];\n\n// for ignoring browser's simulated mouse events\nlet prevTouchTime = 0;\n\n// all active and idle interactions\nscope.interactions = [];\n\nclass Interaction {\n constructor ({ pointerType }) {\n this.target = null; // current interactable being interacted with\n this.element = null; // the target element of the interactable\n\n this.prepared = { // action that's ready to be fired on next move event\n name : null,\n axis : null,\n edges: null,\n };\n\n // keep track of added pointers\n this.pointers = [];\n this.pointerIds = [];\n this.downTargets = [];\n this.downTimes = [];\n\n // Previous native pointer move event coordinates\n this.prevCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n // current native pointer move event coordinates\n this.curCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Starting InteractEvent pointer coordinates\n this.startCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Change in coordinates and time of the pointer\n this.pointerDelta = {\n page : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n client : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n timeStamp: 0,\n };\n\n this.downEvent = null; // pointerdown/mousedown/touchstart event\n this.downPointer = {};\n\n this._eventTarget = null;\n this._curEventTarget = null;\n\n this.prevEvent = null; // previous action event\n\n this.pointerIsDown = false;\n this.pointerWasMoved = false;\n this._interacting = false;\n\n this.pointerType = pointerType;\n\n signals.fire('new', this);\n\n scope.interactions.push(this);\n }\n\n pointerDown (pointer, event, eventTarget) {\n const pointerIndex = this.updatePointer(pointer, event, true);\n\n signals.fire('down', {\n pointer,\n event,\n eventTarget,\n pointerIndex,\n interaction: this,\n });\n }\n\n /*\\\n * Interaction.start\n [ method ]\n *\n * Start an action with the given Interactable and Element as tartgets. The\n * action must be enabled for the target Interactable and an appropriate number\n * of pointers must be held down - 1 for drag/resize, 2 for gesture.\n *\n * Use it with `interactable.able({ manualStart: false })` to always\n * [start actions manually](https://github.com/taye/interact.js/issues/114)\n *\n - action (object) The action to be performed - drag, resize, etc.\n - target (Interactable) The Interactable to target\n - element (Element) The DOM Element to target\n = (object) interact\n **\n | interact(target)\n | .draggable({\n | // disable the default drag start by down->move\n | manualStart: true\n | })\n | // start dragging after the user holds the pointer down\n | .on('hold', function (event) {\n | var interaction = event.interaction;\n |\n | if (!interaction.interacting()) {\n | interaction.start({ name: 'drag' },\n | event.interactable,\n | event.currentTarget);\n | }\n | });\n \\*/\n start (action, target, element) {\n if (this.interacting()\n || !this.pointerIsDown\n || this.pointerIds.length < (action.name === 'gesture'? 2 : 1)) {\n return;\n }\n\n // if this interaction had been removed after stopping\n // add it back\n if (utils.indexOf(scope.interactions, this) === -1) {\n scope.interactions.push(this);\n }\n\n utils.copyAction(this.prepared, action);\n this.target = target;\n this.element = element;\n\n signals.fire('action-start', {\n interaction: this,\n event: this.downEvent,\n });\n }\n\n pointerMove (pointer, event, eventTarget) {\n if (!this.simulation) {\n this.updatePointer(pointer);\n utils.setCoords(this.curCoords, this.pointers);\n }\n\n const duplicateMove = (this.curCoords.page.x === this.prevCoords.page.x\n && this.curCoords.page.y === this.prevCoords.page.y\n && this.curCoords.client.x === this.prevCoords.client.x\n && this.curCoords.client.y === this.prevCoords.client.y);\n\n let dx;\n let dy;\n\n // register movement greater than pointerMoveTolerance\n if (this.pointerIsDown && !this.pointerWasMoved) {\n dx = this.curCoords.client.x - this.startCoords.client.x;\n dy = this.curCoords.client.y - this.startCoords.client.y;\n\n this.pointerWasMoved = utils.hypot(dx, dy) > Interaction.pointerMoveTolerance;\n }\n\n const signalArg = {\n pointer,\n pointerIndex: this.getPointerIndex(pointer),\n event,\n eventTarget,\n dx,\n dy,\n duplicate: duplicateMove,\n interaction: this,\n interactingBeforeMove: this.interacting(),\n };\n\n if (!duplicateMove) {\n // set pointer coordinate, time changes and speeds\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n }\n\n signals.fire('move', signalArg);\n\n if (!duplicateMove) {\n // if interacting, fire an 'action-move' signal etc\n if (this.interacting()) {\n this.doMove(signalArg);\n }\n\n if (this.pointerWasMoved) {\n utils.copyCoords(this.prevCoords, this.curCoords);\n }\n }\n }\n\n /*\\\n * Interaction.doMove\n [ method ]\n *\n * Force a move of the current action at the same coordinates. Useful if\n * snap/restrict has been changed and you want a movement with the new\n * settings.\n *\n **\n | interact(target)\n | .draggable(true)\n | .on('dragmove', function (event) {\n | if (someCondition) {\n | // change the snap settings\n | event.interactable.draggable({ snap: { targets: [] }});\n | // fire another move event with re-calculated snap\n | event.interaction.doMove();\n | }\n | });\n \\*/\n doMove (signalArg) {\n signalArg = utils.extend({\n pointer: this.pointers[0],\n event: this.prevEvent,\n eventTarget: this._eventTarget,\n interaction: this,\n }, signalArg || {});\n\n signals.fire('before-action-move', signalArg);\n\n if (!this._dontFireMove) {\n signals.fire('action-move', signalArg);\n }\n\n this._dontFireMove = false;\n }\n\n // End interact move events and stop auto-scroll unless simulation is running\n pointerUp (pointer, event, eventTarget, curEventTarget) {\n const pointerIndex = this.getPointerIndex(pointer);\n\n signals.fire(/cancel$/i.test(event.type)? 'cancel' : 'up', {\n pointer,\n pointerIndex,\n event,\n eventTarget,\n curEventTarget,\n interaction: this,\n });\n\n if (!this.simulation) {\n this.end(event);\n }\n\n this.pointerIsDown = false;\n this.removePointer(pointer, event);\n }\n\n /*\\\n * Interaction.end\n [ method ]\n *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n - event (PointerEvent) #optional\n **\n | interact(target)\n | .draggable(true)\n | .on('move', function (event) {\n | if (event.pageX > 1000) {\n | // end the current action\n | event.interaction.end();\n | // stop all further listeners from being called\n | event.stopImmediatePropagation();\n | }\n | });\n \\*/\n end (event) {\n event = event || this.prevEvent;\n\n if (this.interacting()) {\n signals.fire('action-end', {\n event,\n interaction: this,\n });\n }\n\n this.stop();\n }\n\n currentAction () {\n return this._interacting? this.prepared.name: null;\n }\n\n interacting () {\n return this._interacting;\n }\n\n stop () {\n signals.fire('stop', { interaction: this });\n\n if (this._interacting) {\n signals.fire('stop-active', { interaction: this });\n signals.fire('stop-' + this.prepared.name, { interaction: this });\n }\n\n this.target = this.element = null;\n\n this._interacting = false;\n this.prepared.name = this.prevEvent = null;\n }\n\n getPointerIndex (pointer) {\n // mouse and pen interactions may have only one pointer\n if (this.pointerType === 'mouse' || this.pointerType === 'pen') {\n return 0;\n }\n\n return utils.indexOf(this.pointerIds, utils.getPointerId(pointer));\n }\n\n updatePointer (pointer, event, down = event && /(down|start)$/i.test(event.type)) {\n const id = utils.getPointerId(pointer);\n let index = this.getPointerIndex(pointer);\n\n if (index === -1) {\n index = this.pointerIds.length;\n this.pointerIds[index] = id;\n }\n\n if (down) {\n signals.fire('update-pointer-down', {\n pointer,\n event,\n down,\n pointerId: id,\n pointerIndex: index,\n interaction: this,\n });\n }\n\n this.pointers[index] = pointer;\n\n return index;\n }\n\n removePointer (pointer, event) {\n const index = this.getPointerIndex(pointer);\n\n if (index === -1) { return; }\n\n signals.fire('remove-pointer', {\n pointer,\n event,\n pointerIndex: index,\n interaction: this,\n });\n\n this.pointers .splice(index, 1);\n this.pointerIds .splice(index, 1);\n this.downTargets.splice(index, 1);\n this.downTimes .splice(index, 1);\n }\n\n _updateEventTargets (target, currentTarget) {\n this._eventTarget = target;\n this._curEventTarget = currentTarget;\n }\n}\n\nfor (let i = 0, len = methodNames.length; i < len; i++) {\n const method = methodNames[i];\n\n listeners[method] = doOnInteractions(method);\n}\n\nfunction doOnInteractions (method) {\n return (function (event) {\n const pointerType = utils.getPointerType(event);\n const [eventTarget, curEventTarget] = utils.getEventTargets(event);\n const matches = []; // [ [pointer, interaction], ...]\n\n if (browser.supportsTouch && /touch/.test(event.type)) {\n prevTouchTime = new Date().getTime();\n\n for (let i = 0; i < event.changedTouches.length; i++) {\n const pointer = event.changedTouches[i];\n const interaction = finder.search(pointer, event.type, eventTarget);\n\n matches.push([pointer, interaction || new Interaction({ pointerType })]);\n }\n }\n else {\n let invalidPointer = false;\n\n if (!browser.supportsPointerEvent && /mouse/.test(event.type)) {\n // ignore mouse events while touch interactions are active\n for (let i = 0; i < scope.interactions.length && !invalidPointer; i++) {\n invalidPointer = scope.interactions[i].pointerType !== 'mouse' && scope.interactions[i].pointerIsDown;\n }\n\n // try to ignore mouse events that are simulated by the browser\n // after a touch event\n invalidPointer = invalidPointer\n || (new Date().getTime() - prevTouchTime < 500)\n // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated\n || event.timeStamp === 0;\n }\n\n if (!invalidPointer) {\n let interaction = finder.search(event, event.type, eventTarget);\n\n if (!interaction) {\n interaction = new Interaction({ pointerType });\n }\n\n matches.push([event, interaction]);\n }\n }\n\n for (const [pointer, interaction] of matches) {\n interaction._updateEventTargets(eventTarget, curEventTarget);\n interaction[method](pointer, event, eventTarget, curEventTarget);\n }\n });\n}\n\nfunction endAll (event) {\n for (let i = 0; i < scope.interactions.length; i++) {\n const interaction = scope.interactions[i];\n\n interaction.end(event);\n signals.fire('endall', { event, interaction });\n }\n}\n\nconst docEvents = { /* 'eventType': listenerFunc */ };\nconst pEventTypes = browser.pEventTypes;\n\nif (domObjects.PointerEvent) {\n docEvents[pEventTypes.down ] = listeners.pointerDown;\n docEvents[pEventTypes.move ] = listeners.pointerMove;\n docEvents[pEventTypes.up ] = listeners.pointerUp;\n docEvents[pEventTypes.cancel] = listeners.pointerUp;\n}\nelse {\n docEvents.mousedown = listeners.pointerDown;\n docEvents.mousemove = listeners.pointerMove;\n docEvents.mouseup = listeners.pointerUp;\n\n docEvents.touchstart = listeners.pointerDown;\n docEvents.touchmove = listeners.pointerMove;\n docEvents.touchend = listeners.pointerUp;\n docEvents.touchcancel = listeners.pointerUp;\n}\n\ndocEvents.blur = endAll;\n\nfunction onDocSignal ({ doc }, signalName) {\n const eventMethod = signalName.indexOf('add') === 0\n ? events.add : events.remove;\n\n // delegate event listener\n for (const eventType in scope.delegatedEvents) {\n eventMethod(doc, eventType, events.delegateListener);\n eventMethod(doc, eventType, events.delegateUseCapture, true);\n }\n\n for (const eventType in docEvents) {\n eventMethod(doc, eventType, docEvents[eventType]);\n }\n}\n\nsignals.on('update-pointer-down', ({ interaction, pointer, pointerId, pointerIndex, event, eventTarget, down }) => {\n interaction.pointerIds[pointerIndex] = pointerId;\n interaction.pointers[pointerIndex] = pointer;\n\n if (down) {\n interaction.pointerIsDown = true;\n }\n\n if (!interaction.interacting()) {\n utils.setCoords(interaction.startCoords, interaction.pointers);\n\n utils.copyCoords(interaction.curCoords , interaction.startCoords);\n utils.copyCoords(interaction.prevCoords, interaction.startCoords);\n\n interaction.downEvent = event;\n interaction.downTimes[pointerIndex] = interaction.curCoords.timeStamp;\n interaction.downTargets[pointerIndex] = eventTarget || event && utils.getEventTargets(event)[0];\n interaction.pointerWasMoved = false;\n\n utils.pointerExtend(interaction.downPointer, pointer);\n }\n});\n\nscope.signals.on('add-document' , onDocSignal);\nscope.signals.on('remove-document', onDocSignal);\n\nInteraction.pointerMoveTolerance = 1;\nInteraction.doOnInteractions = doOnInteractions;\nInteraction.endAll = endAll;\nInteraction.signals = signals;\nInteraction.docEvents = docEvents;\n\nscope.endAllInteractions = endAll;\n\nmodule.exports = Interaction;\n","const Interaction = require('../Interaction');\nconst InteractEvent = require('../InteractEvent');\n\nconst actions = {\n firePrepared,\n names: [],\n methodDict: {},\n};\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n interaction._interacting = true;\n firePrepared(interaction, event, 'start');\n});\n\nInteraction.signals.on('action-move', function ({ interaction, event, preEnd }) {\n firePrepared(interaction, event, 'move', preEnd);\n\n // if the action was ended in a listener\n if (!interaction.interacting()) { return false; }\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n firePrepared(interaction, event, 'end');\n});\n\nfunction firePrepared (interaction, event, phase, preEnd) {\n const actionName = interaction.prepared.name;\n\n const newEvent = new InteractEvent(interaction, event, actionName, phase, interaction.element, null, preEnd);\n\n interaction.target.fire(newEvent);\n interaction.prevEvent = newEvent;\n}\n\nmodule.exports = actions;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drag = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n startAxis : 'xy',\n lockAxis : 'xy',\n },\n\n checker: function (pointer, event, interactable) {\n const dragOptions = interactable.options.drag;\n\n return dragOptions.enabled\n ? { name: 'drag', axis: (dragOptions.lockAxis === 'start'\n ? dragOptions.startAxis\n : dragOptions.lockAxis)}\n : null;\n },\n\n getCursor: function () {\n return 'move';\n },\n};\n\nInteraction.signals.on('before-action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n interaction.curCoords.page.y = interaction.startCoords.page.y;\n interaction.curCoords.client.y = interaction.startCoords.client.y;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vx);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vx);\n interaction.pointerDelta.client.vy = 0;\n interaction.pointerDelta.page.vy = 0;\n }\n else if (axis === 'y') {\n interaction.curCoords.page.x = interaction.startCoords.page.x;\n interaction.curCoords.client.x = interaction.startCoords.client.x;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vy);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vy);\n interaction.pointerDelta.client.vx = 0;\n interaction.pointerDelta.page.vx = 0;\n }\n});\n\n// dragmove\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'dragmove') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n iEvent.pageY = interaction.startCoords.page.y;\n iEvent.clientY = interaction.startCoords.client.y;\n iEvent.dy = 0;\n }\n else if (axis === 'y') {\n iEvent.pageX = interaction.startCoords.page.x;\n iEvent.clientX = interaction.startCoords.client.x;\n iEvent.dx = 0;\n }\n});\n\n/*\\\n * Interactable.draggable\n [ method ]\n *\n * Gets or sets whether drag actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of drag events\n | var isDraggable = interact('ul li').draggable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on drag events (object makes the Interactable draggable)\n = (object) This Interactable\n | interact(element).draggable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // the axis in which the first movement must be\n | // for the drag sequence to start\n | // 'xy' by default - any direction\n | startAxis: 'x' || 'y' || 'xy',\n |\n | // 'xy' by default - don't restrict to one axis (move in any direction)\n | // 'x' or 'y' to restrict movement to either axis\n | // 'start' to restrict movement to the axis the drag started in\n | lockAxis: 'x' || 'y' || 'xy' || 'start',\n |\n | // max number of drags that can happen concurrently\n | // with elements of this Interactable. Infinity by default\n | max: Infinity,\n |\n | // max number of drags that can target the same element+Interactable\n | // 1 by default\n | maxPerElement: 2\n | });\n\\*/\nInteractable.prototype.draggable = function (options) {\n if (utils.is.object(options)) {\n this.options.drag.enabled = options.enabled === false? false: true;\n this.setPerAction('drag', options);\n this.setOnEvents('drag', options);\n\n if (/^(xy|x|y|start)$/.test(options.lockAxis)) {\n this.options.drag.lockAxis = options.lockAxis;\n }\n if (/^(xy|x|y)$/.test(options.startAxis)) {\n this.options.drag.startAxis = options.startAxis;\n }\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drag.enabled = options;\n\n if (!options) {\n this.ondragstart = this.ondragstart = this.ondragend = null;\n }\n\n return this;\n }\n\n return this.options.drag;\n};\n\nactions.drag = drag;\nactions.names.push('drag');\nutils.merge(Interactable.eventTypes, [\n 'dragstart',\n 'dragmove',\n 'draginertiastart',\n 'draginertiaresume',\n 'dragend',\n]);\nactions.methodDict.drag = 'draggable';\n\ndefaultOptions.drag = drag.defaults;\n\nmodule.exports = drag;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst scope = require('../scope');\nconst interact = require('../interact');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drop = {\n defaults: {\n enabled: false,\n accept : null,\n overlap: 'pointer',\n },\n};\n\nlet dynamicDrop = false;\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // reset active dropzones\n interaction.activeDrops.dropzones = [];\n interaction.activeDrops.elements = [];\n interaction.activeDrops.rects = [];\n\n interaction.dropEvents = null;\n\n if (!interaction.dynamicDrop) {\n setActiveDrops(interaction, interaction.element);\n }\n\n const dragEvent = interaction.prevEvent;\n const dropEvents = getDropEvents(interaction, event, dragEvent);\n\n if (dropEvents.activate) {\n fireActiveDrops(interaction, dropEvents.activate);\n }\n});\n\nInteractEvent.signals.on('new', function ({ interaction, iEvent, event }) {\n if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { return; }\n\n const draggableElement = interaction.element;\n const dragEvent = iEvent;\n const dropResult = getDrop(dragEvent, event, draggableElement);\n\n interaction.dropTarget = dropResult.dropzone;\n interaction.dropElement = dropResult.element;\n\n interaction.dropEvents = getDropEvents(interaction, event, dragEvent);\n});\n\nInteraction.signals.on('action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n fireDropEvents(interaction, interaction.dropEvents);\n});\n\nInteraction.signals.on('action-end', function ({ interaction }) {\n if (interaction.prepared.name === 'drag') {\n fireDropEvents(interaction, interaction.dropEvents);\n }\n});\n\nInteraction.signals.on('stop-drag', function ({ interaction }) {\n interaction.activeDrops.dropzones =\n interaction.activeDrops.elements =\n interaction.activeDrops.rects =\n interaction.dropEvents = null;\n});\n\nfunction collectDrops (interaction, element) {\n const drops = [];\n const elements = [];\n\n element = element || interaction.element;\n\n // collect all dropzones and their elements which qualify for a drop\n for (const current of scope.interactables) {\n if (!current.options.drop.enabled) { continue; }\n\n const accept = current.options.drop.accept;\n\n // test the draggable element against the dropzone's accept setting\n if ((utils.is.element(accept) && accept !== element)\n || (utils.is.string(accept)\n && !utils.matchesSelector(element, accept))) {\n\n continue;\n }\n\n // query for new elements if necessary\n const dropElements = utils.is.string(current.target)\n ? current._context.querySelectorAll(current.target)\n : [current.target];\n\n for (let i = 0; i < dropElements.length; i++) {\n const currentElement = dropElements[i];\n\n if (currentElement !== element) {\n drops.push(current);\n elements.push(currentElement);\n }\n }\n }\n\n return {\n elements,\n dropzones: drops,\n };\n}\n\nfunction fireActiveDrops (interaction, event) {\n let prevElement;\n\n // loop through all active dropzones and trigger event\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n const current = interaction.activeDrops.dropzones[i];\n const currentElement = interaction.activeDrops.elements [i];\n\n // prevent trigger of duplicate events on same element\n if (currentElement !== prevElement) {\n // set current element as event target\n event.target = currentElement;\n current.fire(event);\n }\n prevElement = currentElement;\n }\n}\n\n// Collect a new set of possible drops and save them in activeDrops.\n// setActiveDrops should always be called when a drag has just started or a\n// drag event happens while dynamicDrop is true\nfunction setActiveDrops (interaction, dragElement) {\n // get dropzones and their elements that could receive the draggable\n const possibleDrops = collectDrops(interaction, dragElement, true);\n\n interaction.activeDrops.dropzones = possibleDrops.dropzones;\n interaction.activeDrops.elements = possibleDrops.elements;\n interaction.activeDrops.rects = [];\n\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n interaction.activeDrops.rects[i] =\n interaction.activeDrops.dropzones[i].getRect(interaction.activeDrops.elements[i]);\n }\n}\n\nfunction getDrop (dragEvent, event, dragElement) {\n const interaction = dragEvent.interaction;\n const validDrops = [];\n\n if (dynamicDrop) {\n setActiveDrops(interaction, dragElement);\n }\n\n // collect all dropzones and their elements which qualify for a drop\n for (let j = 0; j < interaction.activeDrops.dropzones.length; j++) {\n const current = interaction.activeDrops.dropzones[j];\n const currentElement = interaction.activeDrops.elements [j];\n const rect = interaction.activeDrops.rects [j];\n\n validDrops.push(current.dropCheck(dragEvent, event, interaction.target, dragElement, currentElement, rect)\n ? currentElement\n : null);\n }\n\n // get the most appropriate dropzone based on DOM depth and order\n const dropIndex = utils.indexOfDeepestElement(validDrops);\n\n return {\n dropzone: interaction.activeDrops.dropzones[dropIndex] || null,\n element : interaction.activeDrops.elements [dropIndex] || null,\n };\n}\n\nfunction getDropEvents (interaction, pointerEvent, dragEvent) {\n const dropEvents = {\n enter : null,\n leave : null,\n activate : null,\n deactivate: null,\n move : null,\n drop : null,\n };\n\n const tmpl = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n };\n\n if (interaction.dropElement !== interaction.prevDropElement) {\n // if there was a prevDropTarget, create a dragleave event\n if (interaction.prevDropTarget) {\n dropEvents.leave = utils.extend({ type: 'dragleave' }, tmpl);\n\n dragEvent.dragLeave = dropEvents.leave.target = interaction.prevDropElement;\n dragEvent.prevDropzone = dropEvents.leave.dropzone = interaction.prevDropTarget;\n }\n // if the dropTarget is not null, create a dragenter event\n if (interaction.dropTarget) {\n dropEvents.enter = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n type : 'dragenter',\n };\n\n dragEvent.dragEnter = interaction.dropElement;\n dragEvent.dropzone = interaction.dropTarget;\n }\n }\n\n if (dragEvent.type === 'dragend' && interaction.dropTarget) {\n dropEvents.drop = utils.extend({ type: 'drop' }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n dragEvent.relatedTarget = interaction.dropElement;\n }\n if (dragEvent.type === 'dragstart') {\n dropEvents.activate = utils.extend({ type: 'dropactivate' }, tmpl);\n\n dropEvents.activate.target = null;\n dropEvents.activate.dropzone = null;\n }\n if (dragEvent.type === 'dragend') {\n dropEvents.deactivate = utils.extend({ type: 'dropdeactivate' }, tmpl);\n\n dropEvents.deactivate.target = null;\n dropEvents.deactivate.dropzone = null;\n }\n if (dragEvent.type === 'dragmove' && interaction.dropTarget) {\n dropEvents.move = utils.extend({\n dragmove : dragEvent,\n type : 'dropmove',\n }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n }\n\n return dropEvents;\n}\n\nfunction fireDropEvents (interaction, dropEvents) {\n if (dropEvents.leave) { interaction.prevDropTarget.fire(dropEvents.leave); }\n if (dropEvents.move ) { interaction.dropTarget.fire(dropEvents.move ); }\n if (dropEvents.enter) { interaction.dropTarget.fire(dropEvents.enter); }\n if (dropEvents.drop ) { interaction.dropTarget.fire(dropEvents.drop ); }\n if (dropEvents.deactivate) {\n fireActiveDrops(interaction, dropEvents.deactivate);\n }\n\n interaction.prevDropTarget = interaction.dropTarget;\n interaction.prevDropElement = interaction.dropElement;\n}\n\n/*\\\n * Interactable.dropzone\n [ method ]\n *\n * Returns or sets whether elements can be dropped onto this\n * Interactable to trigger drop events\n *\n * Dropzones can receive the following events:\n * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends\n * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone\n * - `dragmove` when a draggable that has entered the dropzone is moved\n * - `drop` when a draggable is dropped into this dropzone\n *\n * Use the `accept` option to allow only elements that match the given CSS\n * selector or element. The value can be:\n *\n * - **an Element** - only that element can be dropped into this dropzone.\n * - **a string**, - the element being dragged must match it as a CSS selector.\n * - **`null`** - accept options is cleared - it accepts any element.\n *\n * Use the `overlap` option to set how drops are checked for. The allowed\n * values are:\n *\n * - `'pointer'`, the pointer must be over the dropzone (default)\n * - `'center'`, the draggable element's center must be over the dropzone\n * - a number from 0-1 which is the `(intersection area) / (draggable area)`.\n * e.g. `0.5` for drop to happen when half of the area of the draggable is\n * over the dropzone\n *\n * Use the `checker` option to specify a function to check if a dragged\n * element is over this Interactable.\n *\n | interact(target)\n | .dropChecker(function(dragEvent, // related dragmove or dragend event\n | event, // TouchEvent/PointerEvent/MouseEvent\n | dropped, // bool result of the default checker\n | dropzone, // dropzone Interactable\n | dropElement, // dropzone elemnt\n | draggable, // draggable Interactable\n | draggableElement) {// draggable element\n |\n | return dropped && event.target.hasAttribute('allow-drop');\n | }\n *\n *\n - options (boolean | object | null) #optional The new value to be set.\n | interact('.drop').dropzone({\n | accept: '.can-drop' || document.getElementById('single-drop'),\n | overlap: 'pointer' || 'center' || zeroToOne\n | }\n = (boolean | object) The current setting or this Interactable\n\\*/\nInteractable.prototype.dropzone = function (options) {\n if (utils.is.object(options)) {\n this.options.drop.enabled = options.enabled === false? false: true;\n\n if (utils.is.function(options.ondrop) ) { this.events.ondrop = options.ondrop ; }\n if (utils.is.function(options.ondropactivate) ) { this.events.ondropactivate = options.ondropactivate ; }\n if (utils.is.function(options.ondropdeactivate)) { this.events.ondropdeactivate = options.ondropdeactivate; }\n if (utils.is.function(options.ondragenter) ) { this.events.ondragenter = options.ondragenter ; }\n if (utils.is.function(options.ondragleave) ) { this.events.ondragleave = options.ondragleave ; }\n if (utils.is.function(options.ondropmove) ) { this.events.ondropmove = options.ondropmove ; }\n\n if (/^(pointer|center)$/.test(options.overlap)) {\n this.options.drop.overlap = options.overlap;\n }\n else if (utils.is.number(options.overlap)) {\n this.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0);\n }\n if ('accept' in options) {\n this.options.drop.accept = options.accept;\n }\n if ('checker' in options) {\n this.options.drop.checker = options.checker;\n }\n\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drop.enabled = options;\n\n if (!options) {\n this.ondragenter = this.ondragleave = this.ondrop\n = this.ondropactivate = this.ondropdeactivate = null;\n }\n\n return this;\n }\n\n return this.options.drop;\n};\n\nInteractable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) {\n let dropped = false;\n\n // if the dropzone has no rect (eg. display: none)\n // call the custom dropChecker or just return false\n if (!(rect = rect || this.getRect(dropElement))) {\n return (this.options.drop.checker\n ? this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement)\n : false);\n }\n\n const dropOverlap = this.options.drop.overlap;\n\n if (dropOverlap === 'pointer') {\n const origin = utils.getOriginXY(draggable, draggableElement, 'drag');\n const page = utils.getPageXY(dragEvent);\n\n page.x += origin.x;\n page.y += origin.y;\n\n const horizontal = (page.x > rect.left) && (page.x < rect.right);\n const vertical = (page.y > rect.top ) && (page.y < rect.bottom);\n\n dropped = horizontal && vertical;\n }\n\n const dragRect = draggable.getRect(draggableElement);\n\n if (dragRect && dropOverlap === 'center') {\n const cx = dragRect.left + dragRect.width / 2;\n const cy = dragRect.top + dragRect.height / 2;\n\n dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom;\n }\n\n if (dragRect && utils.is.number(dropOverlap)) {\n const overlapArea = (Math.max(0, Math.min(rect.right , dragRect.right ) - Math.max(rect.left, dragRect.left))\n * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top , dragRect.top )));\n\n const overlapRatio = overlapArea / (dragRect.width * dragRect.height);\n\n dropped = overlapRatio >= dropOverlap;\n }\n\n if (this.options.drop.checker) {\n dropped = this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement);\n }\n\n return dropped;\n};\n\nInteractable.signals.on('unset', function ({ interactable }) {\n interactable.dropzone(false);\n});\n\nInteractable.settingsMethods.push('dropChecker');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.dropTarget = null; // the dropzone a drag target might be dropped into\n interaction.dropElement = null; // the element at the time of checking\n interaction.prevDropTarget = null; // the dropzone that was recently dragged away from\n interaction.prevDropElement = null; // the element at the time of checking\n interaction.dropEvents = null; // the dropEvents related to the current drag event\n\n interaction.activeDrops = {\n dropzones: [], // the dropzones that are mentioned below\n elements : [], // elements of dropzones that accept the target draggable\n rects : [], // the rects of the elements mentioned above\n };\n\n});\n\nInteraction.signals.on('stop', function ({ interaction }) {\n interaction.dropTarget = interaction.dropElement =\n interaction.prevDropTarget = interaction.prevDropElement = null;\n});\n\n/*\\\n * interact.dynamicDrop\n [ method ]\n *\n * Returns or sets whether the dimensions of dropzone elements are\n * calculated on every dragmove or only on dragstart for the default\n * dropChecker\n *\n - newValue (boolean) #optional True to check on each move. False to check only before start\n = (boolean | interact) The current setting or interact\n\\*/\ninteract.dynamicDrop = function (newValue) {\n if (utils.is.bool(newValue)) {\n //if (dragging && dynamicDrop !== newValue && !newValue) {\n //calcRects(dropzones);\n //}\n\n dynamicDrop = newValue;\n\n return interact;\n }\n return dynamicDrop;\n};\n\nutils.merge(Interactable.eventTypes, [\n 'dragenter',\n 'dragleave',\n 'dropactivate',\n 'dropdeactivate',\n 'dropmove',\n 'drop',\n]);\nactions.methodDict.drop = 'dropzone';\n\ndefaultOptions.drop = drop.defaults;\n\nmodule.exports = drop;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst gesture = {\n defaults: {\n enabled : false,\n origin : null,\n restrict: null,\n },\n\n checker: function (pointer, event, interactable, element, interaction) {\n if (interaction.pointerIds.length >= 2) {\n return { name: 'gesture' };\n }\n\n return null;\n },\n\n getCursor: function () {\n return '';\n },\n};\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturestart') { return; }\n iEvent.ds = 0;\n\n interaction.gesture.startDistance = interaction.gesture.prevDistance = iEvent.distance;\n interaction.gesture.startAngle = interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.scale = 1;\n});\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturemove') { return; }\n\n iEvent.ds = iEvent.scale - interaction.gesture.scale;\n\n interaction.target.fire(iEvent);\n\n interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.prevDistance = iEvent.distance;\n\n if (iEvent.scale !== Infinity\n && iEvent.scale !== null\n && iEvent.scale !== undefined\n && !isNaN(iEvent.scale)) {\n\n interaction.gesture.scale = iEvent.scale;\n }\n});\n\n/*\\\n * Interactable.gesturable\n [ method ]\n *\n * Gets or sets whether multitouch gestures can be performed on the\n * Interactable's element\n *\n = (boolean) Indicates if this can be the target of gesture events\n | var isGestureable = interact(element).gesturable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on gesture events (makes the Interactable gesturable)\n = (object) this Interactable\n | interact(element).gesturable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // limit multiple gestures.\n | // See the explanation in @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n\\*/\nInteractable.prototype.gesturable = function (options) {\n if (utils.is.object(options)) {\n this.options.gesture.enabled = options.enabled === false? false: true;\n this.setPerAction('gesture', options);\n this.setOnEvents('gesture', options);\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.gesture.enabled = options;\n\n if (!options) {\n this.ongesturestart = this.ongesturestart = this.ongestureend = null;\n }\n\n return this;\n }\n\n return this.options.gesture;\n};\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action, event, starting, ending, deltaSource }) {\n if (action !== 'gesture') { return; }\n\n const pointers = interaction.pointers;\n\n iEvent.touches = [pointers[0], pointers[1]];\n\n if (starting) {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = 1;\n iEvent.ds = 0;\n iEvent.angle = utils.touchAngle(pointers, undefined, deltaSource);\n iEvent.da = 0;\n }\n else if (ending || event instanceof InteractEvent) {\n iEvent.distance = interaction.prevEvent.distance;\n iEvent.box = interaction.prevEvent.box;\n iEvent.scale = interaction.prevEvent.scale;\n iEvent.ds = iEvent.scale - 1;\n iEvent.angle = interaction.prevEvent.angle;\n iEvent.da = iEvent.angle - interaction.gesture.startAngle;\n }\n else {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = iEvent.distance / interaction.gesture.startDistance;\n iEvent.angle = utils.touchAngle(pointers, interaction.gesture.prevAngle, deltaSource);\n\n iEvent.ds = iEvent.scale - interaction.gesture.prevScale;\n iEvent.da = iEvent.angle - interaction.gesture.prevAngle;\n }\n});\n\nInteraction.signals.on('new', function (interaction) {\n interaction.gesture = {\n start: { x: 0, y: 0 },\n\n startDistance: 0, // distance between two touches of touchStart\n prevDistance : 0,\n distance : 0,\n\n scale: 1, // gesture.distance / gesture.startDistance\n\n startAngle: 0, // angle of line joining two touches\n prevAngle : 0, // angle of the previous gesture event\n };\n});\n\nactions.gesture = gesture;\nactions.names.push('gesture');\nutils.merge(Interactable.eventTypes, [\n 'gesturestart',\n 'gesturemove',\n 'gestureend',\n]);\nactions.methodDict.gesture = 'gesturable';\n\ndefaultOptions.gesture = gesture.defaults;\n\nmodule.exports = gesture;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\n// Less Precision with touch input\nconst defaultMargin = browser.supportsTouch || browser.supportsPointerEvent? 20: 10;\n\nconst resize = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n square: false,\n preserveAspectRatio: false,\n axis: 'xy',\n\n // use default margin\n margin: NaN,\n\n // object with props left, right, top, bottom which are\n // true/false values to resize when the pointer is over that edge,\n // CSS selectors to match the handles for each direction\n // or the Elements for each handle\n edges: null,\n\n // a value of 'none' will limit the resize rect to a minimum of 0x0\n // 'negate' will alow the rect to have negative width/height\n // 'reposition' will keep the width/height positive by swapping\n // the top and bottom edges and/or swapping the left and right edges\n invert: 'none',\n },\n\n checker: function (pointer, event, interactable, element, interaction, rect) {\n if (!rect) { return null; }\n\n const page = utils.extend({}, interaction.curCoords.page);\n const options = interactable.options;\n\n if (options.resize.enabled) {\n const resizeOptions = options.resize;\n const resizeEdges = { left: false, right: false, top: false, bottom: false };\n\n // if using resize.edges\n if (utils.is.object(resizeOptions.edges)) {\n for (const edge in resizeEdges) {\n resizeEdges[edge] = checkResizeEdge(edge,\n resizeOptions.edges[edge],\n page,\n interaction._eventTarget,\n element,\n rect,\n resizeOptions.margin || defaultMargin);\n }\n\n resizeEdges.left = resizeEdges.left && !resizeEdges.right;\n resizeEdges.top = resizeEdges.top && !resizeEdges.bottom;\n\n if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) {\n return {\n name: 'resize',\n edges: resizeEdges,\n };\n }\n }\n else {\n const right = options.resize.axis !== 'y' && page.x > (rect.right - defaultMargin);\n const bottom = options.resize.axis !== 'x' && page.y > (rect.bottom - defaultMargin);\n\n if (right || bottom) {\n return {\n name: 'resize',\n axes: (right? 'x' : '') + (bottom? 'y' : ''),\n };\n }\n }\n }\n\n return null;\n },\n\n cursors: (browser.isIe9OrOlder ? {\n x : 'e-resize',\n y : 's-resize',\n xy: 'se-resize',\n\n top : 'n-resize',\n left : 'w-resize',\n bottom : 's-resize',\n right : 'e-resize',\n topleft : 'se-resize',\n bottomright: 'se-resize',\n topright : 'ne-resize',\n bottomleft : 'ne-resize',\n } : {\n x : 'ew-resize',\n y : 'ns-resize',\n xy: 'nwse-resize',\n\n top : 'ns-resize',\n left : 'ew-resize',\n bottom : 'ns-resize',\n right : 'ew-resize',\n topleft : 'nwse-resize',\n bottomright: 'nwse-resize',\n topright : 'nesw-resize',\n bottomleft : 'nesw-resize',\n }),\n\n getCursor: function (action) {\n if (action.axis) {\n return resize.cursors[action.name + action.axis];\n }\n else if (action.edges) {\n let cursorKey = '';\n const edgeNames = ['top', 'bottom', 'left', 'right'];\n\n for (let i = 0; i < 4; i++) {\n if (action.edges[edgeNames[i]]) {\n cursorKey += edgeNames[i];\n }\n }\n\n return resize.cursors[cursorKey];\n }\n },\n};\n\n// resizestart\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'resizestart' || !interaction.prepared.edges) {\n return;\n }\n\n const startRect = interaction.target.getRect(interaction.element);\n const resizeOptions = interaction.target.options.resize;\n\n /*\n * When using the `resizable.square` or `resizable.preserveAspectRatio` options, resizing from one edge\n * will affect another. E.g. with `resizable.square`, resizing to make the right edge larger will make\n * the bottom edge larger by the same amount. We call these 'linked' edges. Any linked edges will depend\n * on the active edges and the edge being interacted with.\n */\n if (resizeOptions.square || resizeOptions.preserveAspectRatio) {\n const linkedEdges = utils.extend({}, interaction.prepared.edges);\n\n linkedEdges.top = linkedEdges.top || (linkedEdges.left && !linkedEdges.bottom);\n linkedEdges.left = linkedEdges.left || (linkedEdges.top && !linkedEdges.right );\n linkedEdges.bottom = linkedEdges.bottom || (linkedEdges.right && !linkedEdges.top );\n linkedEdges.right = linkedEdges.right || (linkedEdges.bottom && !linkedEdges.left );\n\n interaction.prepared._linkedEdges = linkedEdges;\n }\n else {\n interaction.prepared._linkedEdges = null;\n }\n\n // if using `resizable.preserveAspectRatio` option, record aspect ratio at the start of the resize\n if (resizeOptions.preserveAspectRatio) {\n interaction.resizeStartAspectRatio = startRect.width / startRect.height;\n }\n\n interaction.resizeRects = {\n start : startRect,\n current : utils.extend({}, startRect),\n inverted : utils.extend({}, startRect),\n previous : utils.extend({}, startRect),\n delta : {\n left: 0, right : 0, width : 0,\n top : 0, bottom: 0, height: 0,\n },\n };\n\n iEvent.rect = interaction.resizeRects.inverted;\n iEvent.deltaRect = interaction.resizeRects.delta;\n});\n\n// resizemove\nInteractEvent.signals.on('new', function ({ iEvent, phase, interaction }) {\n if (phase !== 'move' || !interaction.prepared.edges) { return; }\n\n const resizeOptions = interaction.target.options.resize;\n const invert = resizeOptions.invert;\n const invertible = invert === 'reposition' || invert === 'negate';\n\n let edges = interaction.prepared.edges;\n\n const start = interaction.resizeRects.start;\n const current = interaction.resizeRects.current;\n const inverted = interaction.resizeRects.inverted;\n const delta = interaction.resizeRects.delta;\n const previous = utils.extend(interaction.resizeRects.previous, inverted);\n const originalEdges = edges;\n\n let dx = iEvent.dx;\n let dy = iEvent.dy;\n\n if (resizeOptions.preserveAspectRatio || resizeOptions.square) {\n // `resize.preserveAspectRatio` takes precedence over `resize.square`\n const startAspectRatio = resizeOptions.preserveAspectRatio\n ? interaction.resizeStartAspectRatio\n : 1;\n\n edges = interaction.prepared._linkedEdges;\n\n if ((originalEdges.left && originalEdges.bottom)\n || (originalEdges.right && originalEdges.top)) {\n dy = -dx / startAspectRatio;\n }\n else if (originalEdges.left || originalEdges.right ) { dy = dx / startAspectRatio; }\n else if (originalEdges.top || originalEdges.bottom) { dx = dy * startAspectRatio; }\n }\n\n // update the 'current' rect without modifications\n if (edges.top ) { current.top += dy; }\n if (edges.bottom) { current.bottom += dy; }\n if (edges.left ) { current.left += dx; }\n if (edges.right ) { current.right += dx; }\n\n if (invertible) {\n // if invertible, copy the current rect\n utils.extend(inverted, current);\n\n if (invert === 'reposition') {\n // swap edge values if necessary to keep width/height positive\n let swap;\n\n if (inverted.top > inverted.bottom) {\n swap = inverted.top;\n\n inverted.top = inverted.bottom;\n inverted.bottom = swap;\n }\n if (inverted.left > inverted.right) {\n swap = inverted.left;\n\n inverted.left = inverted.right;\n inverted.right = swap;\n }\n }\n }\n else {\n // if not invertible, restrict to minimum of 0x0 rect\n inverted.top = Math.min(current.top, start.bottom);\n inverted.bottom = Math.max(current.bottom, start.top);\n inverted.left = Math.min(current.left, start.right);\n inverted.right = Math.max(current.right, start.left);\n }\n\n inverted.width = inverted.right - inverted.left;\n inverted.height = inverted.bottom - inverted.top ;\n\n for (const edge in inverted) {\n delta[edge] = inverted[edge] - previous[edge];\n }\n\n iEvent.edges = interaction.prepared.edges;\n iEvent.rect = inverted;\n iEvent.deltaRect = delta;\n});\n\n/*\\\n * Interactable.resizable\n [ method ]\n *\n * Gets or sets whether resize actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of resize elements\n | var isResizeable = interact('input[type=text]').resizable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on resize events (object makes the Interactable resizable)\n = (object) This Interactable\n | interact(element).resizable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | edges: {\n | top : true, // Use pointer coords to check for resize.\n | left : false, // Disable resizing from left edge.\n | bottom: '.resize-s',// Resize if pointer target matches selector\n | right : handleEl // Resize if pointer target is the given Element\n | },\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height are adjusted at a 1:1 ratio.\n | square: false,\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height maintain the aspect ratio they had when resizing started.\n | preserveAspectRatio: false,\n |\n | // a value of 'none' will limit the resize rect to a minimum of 0x0\n | // 'negate' will allow the rect to have negative width/height\n | // 'reposition' will keep the width/height positive by swapping\n | // the top and bottom edges and/or swapping the left and right edges\n | invert: 'none' || 'negate' || 'reposition'\n |\n | // limit multiple resizes.\n | // See the explanation in the @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n \\*/\nInteractable.prototype.resizable = function (options) {\n if (utils.is.object(options)) {\n this.options.resize.enabled = options.enabled === false? false: true;\n this.setPerAction('resize', options);\n this.setOnEvents('resize', options);\n\n if (/^x$|^y$|^xy$/.test(options.axis)) {\n this.options.resize.axis = options.axis;\n }\n else if (options.axis === null) {\n this.options.resize.axis = defaultOptions.resize.axis;\n }\n\n if (utils.is.bool(options.preserveAspectRatio)) {\n this.options.resize.preserveAspectRatio = options.preserveAspectRatio;\n }\n else if (utils.is.bool(options.square)) {\n this.options.resize.square = options.square;\n }\n\n return this;\n }\n if (utils.is.bool(options)) {\n this.options.resize.enabled = options;\n\n if (!options) {\n this.onresizestart = this.onresizestart = this.onresizeend = null;\n }\n\n return this;\n }\n return this.options.resize;\n};\n\nfunction checkResizeEdge (name, value, page, element, interactableElement, rect, margin) {\n // false, '', undefined, null\n if (!value) { return false; }\n\n // true value, use pointer coords and element rect\n if (value === true) {\n // if dimensions are negative, \"switch\" edges\n const width = utils.is.number(rect.width )? rect.width : rect.right - rect.left;\n const height = utils.is.number(rect.height)? rect.height : rect.bottom - rect.top ;\n\n if (width < 0) {\n if (name === 'left' ) { name = 'right'; }\n else if (name === 'right') { name = 'left' ; }\n }\n if (height < 0) {\n if (name === 'top' ) { name = 'bottom'; }\n else if (name === 'bottom') { name = 'top' ; }\n }\n\n if (name === 'left' ) { return page.x < ((width >= 0? rect.left: rect.right ) + margin); }\n if (name === 'top' ) { return page.y < ((height >= 0? rect.top : rect.bottom) + margin); }\n\n if (name === 'right' ) { return page.x > ((width >= 0? rect.right : rect.left) - margin); }\n if (name === 'bottom') { return page.y > ((height >= 0? rect.bottom: rect.top ) - margin); }\n }\n\n // the remaining checks require an element\n if (!utils.is.element(element)) { return false; }\n\n return utils.is.element(value)\n // the value is an element to use as a resize handle\n ? value === element\n // otherwise check if element matches value as selector\n : utils.matchesUpTo(element, value, interactableElement);\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.resizeAxes = 'xy';\n});\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action }) {\n if (action !== 'resize' || !interaction.resizeAxes) { return; }\n\n const options = interaction.target.options;\n\n if (options.resize.square) {\n if (interaction.resizeAxes === 'y') {\n iEvent.dx = iEvent.dy;\n }\n else {\n iEvent.dy = iEvent.dx;\n }\n iEvent.axes = 'xy';\n }\n else {\n iEvent.axes = interaction.resizeAxes;\n\n if (interaction.resizeAxes === 'x') {\n iEvent.dy = 0;\n }\n else if (interaction.resizeAxes === 'y') {\n iEvent.dx = 0;\n }\n }\n});\n\nactions.resize = resize;\nactions.names.push('resize');\nutils.merge(Interactable.eventTypes, [\n 'resizestart',\n 'resizemove',\n 'resizeinertiastart',\n 'resizeinertiaresume',\n 'resizeend',\n]);\nactions.methodDict.resize = 'resizable';\n\ndefaultOptions.resize = resize.defaults;\n\nmodule.exports = resize;\n","const raf = require('./utils/raf');\nconst getWindow = require('./utils/window').getWindow;\nconst is = require('./utils/is');\nconst domUtils = require('./utils/domUtils');\nconst Interaction = require('./Interaction');\nconst defaultOptions = require('./defaultOptions');\n\nconst autoScroll = {\n defaults: {\n enabled : false,\n container: null, // the item that is scrolled (Window or HTMLElement)\n margin : 60,\n speed : 300, // the scroll speed in pixels per second\n },\n\n interaction: null,\n i: null, // the handle returned by window.setInterval\n x: 0, y: 0, // Direction each pulse is to scroll in\n\n isScrolling: false,\n prevTime: 0,\n\n start: function (interaction) {\n autoScroll.isScrolling = true;\n raf.cancel(autoScroll.i);\n\n autoScroll.interaction = interaction;\n autoScroll.prevTime = new Date().getTime();\n autoScroll.i = raf.request(autoScroll.scroll);\n },\n\n stop: function () {\n autoScroll.isScrolling = false;\n raf.cancel(autoScroll.i);\n },\n\n // scroll the window by the values in scroll.x/y\n scroll: function () {\n const options = autoScroll.interaction.target.options[autoScroll.interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(autoScroll.interaction.element);\n const now = new Date().getTime();\n // change in time in seconds\n const dt = (now - autoScroll.prevTime) / 1000;\n // displacement\n const s = options.speed * dt;\n\n if (s >= 1) {\n if (is.window(container)) {\n container.scrollBy(autoScroll.x * s, autoScroll.y * s);\n }\n else if (container) {\n container.scrollLeft += autoScroll.x * s;\n container.scrollTop += autoScroll.y * s;\n }\n\n autoScroll.prevTime = now;\n }\n\n if (autoScroll.isScrolling) {\n raf.cancel(autoScroll.i);\n autoScroll.i = raf.request(autoScroll.scroll);\n }\n },\n check: function (interactable, actionName) {\n const options = interactable.options;\n\n return options[actionName].autoScroll && options[actionName].autoScroll.enabled;\n },\n onInteractionMove: function ({ interaction, pointer }) {\n if (!(interaction.interacting()\n && autoScroll.check(interaction.target, interaction.prepared.name))) {\n return;\n }\n\n if (interaction.simulation) {\n autoScroll.x = autoScroll.y = 0;\n return;\n }\n\n let top;\n let right;\n let bottom;\n let left;\n\n const options = interaction.target.options[interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(interaction.element);\n\n if (is.window(container)) {\n left = pointer.clientX < autoScroll.margin;\n top = pointer.clientY < autoScroll.margin;\n right = pointer.clientX > container.innerWidth - autoScroll.margin;\n bottom = pointer.clientY > container.innerHeight - autoScroll.margin;\n }\n else {\n const rect = domUtils.getElementClientRect(container);\n\n left = pointer.clientX < rect.left + autoScroll.margin;\n top = pointer.clientY < rect.top + autoScroll.margin;\n right = pointer.clientX > rect.right - autoScroll.margin;\n bottom = pointer.clientY > rect.bottom - autoScroll.margin;\n }\n\n autoScroll.x = (right ? 1: left? -1: 0);\n autoScroll.y = (bottom? 1: top? -1: 0);\n\n if (!autoScroll.isScrolling) {\n // set the autoScroll properties to those of the target\n autoScroll.margin = options.margin;\n autoScroll.speed = options.speed;\n\n autoScroll.start(interaction);\n }\n },\n};\n\nInteraction.signals.on('stop-active', function () {\n autoScroll.stop();\n});\n\nInteraction.signals.on('action-move', autoScroll.onInteractionMove);\n\ndefaultOptions.perAction.autoScroll = autoScroll.defaults;\n\nmodule.exports = autoScroll;\n","const Interactable = require('../Interactable');\nconst actions = require('../actions/base');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.ignoreFrom\n [ method ]\n *\n * If the target of the `mousedown`, `pointerdown` or `touchstart`\n * event or any of it's parents match the given CSS selector or\n * Element, no drag/resize/gesture is started.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to not ignore any elements\n = (string | Element | object) The current ignoreFrom value or this Interactable\n **\n | interact(element, { ignoreFrom: document.getElementById('no-action') });\n | // or\n | interact(element).ignoreFrom('input, textarea, a');\n\\*/\nInteractable.prototype.ignoreFrom = function (newValue) {\n return this._backCompatOption('ignoreFrom', newValue);\n};\n\n/*\\\n * Interactable.allowFrom\n [ method ]\n *\n * A drag/resize/gesture is started only If the target of the\n * `mousedown`, `pointerdown` or `touchstart` event or any of it's\n * parents match the given CSS selector or Element.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to allow from any element\n = (string | Element | object) The current allowFrom value or this Interactable\n **\n | interact(element, { allowFrom: document.getElementById('drag-handle') });\n | // or\n | interact(element).allowFrom('.handle');\n\\*/\nInteractable.prototype.allowFrom = function (newValue) {\n return this._backCompatOption('allowFrom', newValue);\n};\n\nInteractable.prototype.testIgnore = function (ignoreFrom, interactableElement, element) {\n if (!ignoreFrom || !is.element(element)) { return false; }\n\n if (is.string(ignoreFrom)) {\n return domUtils.matchesUpTo(element, ignoreFrom, interactableElement);\n }\n else if (is.element(ignoreFrom)) {\n return domUtils.nodeContains(ignoreFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testAllow = function (allowFrom, interactableElement, element) {\n if (!allowFrom) { return true; }\n\n if (!is.element(element)) { return false; }\n\n if (is.string(allowFrom)) {\n return domUtils.matchesUpTo(element, allowFrom, interactableElement);\n }\n else if (is.element(allowFrom)) {\n return domUtils.nodeContains(allowFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testIgnoreAllow = function (options, interactableElement, eventTarget) {\n return (!this.testIgnore(options.ignoreFrom, interactableElement, eventTarget)\n && this.testAllow(options.allowFrom, interactableElement, eventTarget));\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (event.buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\n","const interact = require('../interact');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst actions = require('../actions/base');\nconst defaultOptions = require('../defaultOptions');\nconst browser = require('../utils/browser');\nconst scope = require('../scope');\nconst utils = require('../utils');\nconst signals = require('../utils/Signals').new();\n\nrequire('./InteractableMethods');\n\nconst autoStart = {\n signals,\n withinInteractionLimit,\n // Allow this many interactions to happen simultaneously\n maxInteractions: Infinity,\n defaults: {\n perAction: {\n manualStart: false,\n max: Infinity,\n maxPerElement: 1,\n allowFrom: null,\n ignoreFrom: null,\n },\n },\n setActionDefaults: function (action) {\n utils.extend(action.defaults, autoStart.defaults.perAction);\n },\n};\n\n// set cursor style on mousedown\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget }) {\n if (interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\n// set cursor style on mousemove\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget }) {\n if (!interaction.mouse\n || interaction.pointerIsDown\n || interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\nInteraction.signals.on('move', function (arg) {\n const { interaction, event } = arg;\n\n if (!interaction.pointerIsDown\n || interaction.interacting()\n || !interaction.pointerWasMoved\n || !interaction.prepared.name) {\n return;\n }\n\n signals.fire('before-start', arg);\n\n const target = interaction.target;\n\n if (interaction.prepared.name && target) {\n // check manualStart and interaction limit\n if (target.options[interaction.prepared.name].manualStart\n || !withinInteractionLimit(target, interaction.element, interaction.prepared)) {\n interaction.stop(event);\n }\n else {\n interaction.start(interaction.prepared, target, interaction.element);\n }\n }\n});\n\n// Check if the current target supports the action.\n// If so, return the validated action. Otherwise, return null\nfunction validateAction (action, interactable, element, eventTarget) {\n if (utils.is.object(action)\n && interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget)\n && interactable.options[action.name].enabled\n && withinInteractionLimit(interactable, element, action)) {\n return action;\n }\n\n return null;\n}\n\nfunction validateSelector (interaction, pointer, event, matches, matchElements, eventTarget) {\n for (let i = 0, len = matches.length; i < len; i++) {\n const match = matches[i];\n const matchElement = matchElements[i];\n const action = validateAction(match.getAction(pointer, event, interaction, matchElement),\n match,\n matchElement,\n eventTarget);\n\n if (action) {\n return {\n action,\n target: match,\n element: matchElement,\n };\n }\n }\n\n return {};\n}\n\nfunction getActionInfo (interaction, pointer, event, eventTarget) {\n let matches = [];\n let matchElements = [];\n\n let element = eventTarget;\n let action = null;\n\n function pushMatches (interactable, selector, context) {\n const elements = (browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined);\n\n if (utils.matchesSelector(element, selector, elements)) {\n\n matches.push(interactable);\n matchElements.push(element);\n }\n }\n\n while (utils.is.element(element)) {\n matches = [];\n matchElements = [];\n\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && (action = validateAction(elementInteractable.getAction(pointer, event, interaction, element, eventTarget),\n elementInteractable,\n element,\n eventTarget))\n && !elementInteractable.options[action.name].manualStart) {\n return {\n element,\n action,\n target: elementInteractable,\n };\n }\n else {\n scope.interactables.forEachSelector(pushMatches, element);\n\n const actionInfo = validateSelector(interaction, pointer, event, matches, matchElements, eventTarget);\n\n if (actionInfo.action\n && !actionInfo.target.options[actionInfo.action.name].manualStart) {\n return actionInfo;\n }\n }\n\n element = utils.parentNode(element);\n }\n\n return {};\n}\n\nfunction prepare (interaction, { action, target, element }) {\n action = action || {};\n\n if (interaction.target && interaction.target.options.styleCursor) {\n interaction.target._doc.documentElement.style.cursor = '';\n }\n\n interaction.target = target;\n interaction.element = element;\n utils.copyAction(interaction.prepared, action);\n\n if (target && target.options.styleCursor) {\n const cursor = action? actions[action.name].getCursor(action) : '';\n interaction.target._doc.documentElement.style.cursor = cursor;\n }\n\n signals.fire('prepared', { interaction: interaction });\n}\n\nInteraction.signals.on('stop', function ({ interaction }) {\n const target = interaction.target;\n\n if (target && target.options.styleCursor) {\n target._doc.documentElement.style.cursor = '';\n }\n});\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (utils.is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (utils.is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n const buttons = event.buttons || ({\n 0: 1,\n 1: 4,\n 3: 8,\n 4: 16,\n })[event.button];\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\nfunction withinInteractionLimit (interactable, element, action) {\n const options = interactable.options;\n const maxActions = options[action.name].max;\n const maxPerElement = options[action.name].maxPerElement;\n let activeInteractions = 0;\n let targetCount = 0;\n let targetElementCount = 0;\n\n // no actions if any of these values == 0\n if (!(maxActions && maxPerElement && autoStart.maxInteractions)) { return; }\n\n for (let i = 0, len = scope.interactions.length; i < len; i++) {\n const interaction = scope.interactions[i];\n const otherAction = interaction.prepared.name;\n\n if (!interaction.interacting()) { continue; }\n\n activeInteractions++;\n\n if (activeInteractions >= autoStart.maxInteractions) {\n return false;\n }\n\n if (interaction.target !== interactable) { continue; }\n\n targetCount += (otherAction === action.name)|0;\n\n if (targetCount >= maxActions) {\n return false;\n }\n\n if (interaction.element === element) {\n targetElementCount++;\n\n if (otherAction !== action.name || targetElementCount >= maxPerElement) {\n return false;\n }\n }\n }\n\n return autoStart.maxInteractions > 0;\n}\n\n/*\\\n * interact.maxInteractions\n [ method ]\n **\n * Returns or sets the maximum number of concurrent interactions allowed.\n * By default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables\n * and elements, you need to enable it in the draggable, resizable and\n * gesturable `'max'` and `'maxPerElement'` options.\n **\n - newValue (number) #optional Any number. newValue <= 0 means no interactions.\n\\*/\ninteract.maxInteractions = function (newValue) {\n if (utils.is.number(newValue)) {\n autoStart.maxInteractions = newValue;\n\n return this;\n }\n\n return autoStart.maxInteractions;\n};\n\nInteractable.settingsMethods.push('styleCursor');\nInteractable.settingsMethods.push('actionChecker');\nInteractable.settingsMethods.push('ignoreFrom');\nInteractable.settingsMethods.push('allowFrom');\n\ndefaultOptions.base.actionChecker = null;\ndefaultOptions.base.styleCursor = true;\n\nutils.extend(defaultOptions.perAction, autoStart.defaults.perAction);\n\nmodule.exports = autoStart;\n","const autoStart = require('./base');\nconst Interaction = require('../Interaction');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.delayTimer = null;\n});\n\nautoStart.signals.on('prepared', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.delayTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.target, interaction.element);\n }, delay);\n }\n});\n\nInteraction.signals.on('move', function ({ interaction, duplicate }) {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.delayTimer);\n }\n});\n\n// prevent regular down->move autoStart\nautoStart.signals.on('before-start', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.prepared.name = null;\n }\n});\n","const autoStart = require('./base');\nconst scope = require('../scope');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\n\nconst { matchesSelector, parentNode } = require('../utils/domUtils');\n\nautoStart.setActionDefaults(require('../actions/drag'));\n\nautoStart.signals.on('before-start', function ({ interaction, eventTarget, dx, dy }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // check if a drag is in the correct axis\n const absX = Math.abs(dx);\n const absY = Math.abs(dy);\n const options = interaction.target.options.drag;\n const startAxis = options.startAxis;\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy');\n\n interaction.prepared.axis = options.lockAxis === 'start'\n ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n : options.lockAxis;\n\n // if the movement isn't in the startAxis of the interactable\n if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) {\n // cancel the prepared action\n interaction.prepared.name = null;\n\n // then try to get a drag from another ineractable\n\n if (!interaction.prepared.name) {\n\n let element = eventTarget;\n\n const getDraggable = function (interactable, selector, context) {\n const elements = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n if (interactable === interaction.target) { return; }\n\n if (!options.manualStart\n && !interactable.testIgnoreAllow(options, element, eventTarget)\n && matchesSelector(element, selector, elements)) {\n\n const action = interactable.getAction(interaction.downPointer,\n interaction.downEvent,\n interaction,\n element);\n\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, interactable)\n && autoStart.validateAction(action, interactable, element, eventTarget)) {\n\n return interactable;\n }\n }\n };\n\n let action = null;\n\n // check all interactables\n while (is.element(element)) {\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && elementInteractable !== interaction.target\n && !elementInteractable.options.drag.manualStart) {\n\n action = elementInteractable.getAction(interaction.downPointer, interaction.downEvent, interaction, element);\n }\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, elementInteractable)) {\n\n interaction.prepared.name = 'drag';\n interaction.target = elementInteractable;\n interaction.element = element;\n break;\n }\n\n const selectorInteractable = scope.interactables.forEachSelector(getDraggable, element);\n\n if (selectorInteractable) {\n interaction.prepared.name = 'drag';\n interaction.target = selectorInteractable;\n interaction.element = element;\n break;\n }\n\n element = parentNode(element);\n }\n }\n }\n});\n\nfunction checkStartAxis (startAxis, interactable) {\n if (!interactable) { return false; }\n\n const thisAxis = interactable.options.drag.startAxis;\n\n return (startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis);\n}\n","require('./base').setActionDefaults(require('../actions/gesture'));\n","require('./base').setActionDefaults(require('../actions/resize'));\n","module.exports = {\n base: {\n accept : null,\n preventDefault: 'auto',\n deltaSource : 'page',\n },\n\n perAction: {\n origin: { x: 0, y: 0 },\n\n // only allow left button by default\n // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n mouseButtons: 1,\n\n inertia: {\n enabled : false,\n resistance : 10, // the lambda in exponential decay\n minSpeed : 100, // target speed must be above this for inertia to start\n endSpeed : 10, // the speed at which inertia is slow enough to stop\n allowResume : true, // allow resuming an action in inertia phase\n smoothEndDuration: 300, // animate to snap/restrict endOnly if there's no inertia\n },\n },\n};\n","/* browser entry point */\n\n// Legacy browser support\nrequire('./legacyBrowsers');\n\n// inertia\nrequire('./inertia');\n\n// modifiers\nrequire('./modifiers/snap');\nrequire('./modifiers/restrict');\n\n// pointerEvents\nrequire('./pointerEvents/base');\nrequire('./pointerEvents/holdRepeat');\nrequire('./pointerEvents/interactableTargets');\n\n// delay\nrequire('./autoStart/delay');\n\n// actions\nrequire('./actions/gesture');\nrequire('./actions/resize');\nrequire('./actions/drag');\nrequire('./actions/drop');\n\n// load these modifiers after resize is loaded\nrequire('./modifiers/snapSize');\nrequire('./modifiers/restrictEdges');\nrequire('./modifiers/restrictSize');\n\n// autoStart actions\nrequire('./autoStart/gesture');\nrequire('./autoStart/resize');\nrequire('./autoStart/drag');\n\n// Interactable preventDefault setting\nrequire('./interactablePreventDefault.js');\n\n// autoScroll\nrequire('./autoScroll');\n\n// export interact\nmodule.exports = require('./interact');\n","const InteractEvent = require('./InteractEvent');\nconst Interaction = require('./Interaction');\nconst modifiers = require('./modifiers');\nconst utils = require('./utils');\nconst animationFrame = require('./utils/raf');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.inertiaStatus = {\n active : false,\n smoothEnd : false,\n allowResume: false,\n\n startEvent: null,\n upCoords : {},\n\n xe: 0, ye: 0,\n sx: 0, sy: 0,\n\n t0: 0,\n vx0: 0, vys: 0,\n duration: 0,\n\n lambda_v0: 0,\n one_ve_v0: 0,\n i : null,\n };\n\n interaction.boundInertiaFrame = () => inertiaFrame .apply(interaction);\n interaction.boundSmoothEndFrame = () => smoothEndFrame.apply(interaction);\n});\n\nInteraction.signals.on('down', function ({ interaction, event, pointer, eventTarget }) {\n const status = interaction.inertiaStatus;\n\n // Check if the down event hits the current inertia target\n if (status.active) {\n let element = eventTarget;\n\n // climb up the DOM tree from the event target\n while (utils.is.element(element)) {\n\n // if interaction element is the current inertia target element\n if (element === interaction.element) {\n // stop inertia\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n\n // update pointers to the down event's coordinates\n interaction.updatePointer(pointer);\n utils.setCoords(interaction.curCoords, interaction.pointers);\n\n // fire appropriate signals\n const signalArg = { interaction };\n Interaction.signals.fire('before-action-move', signalArg);\n Interaction.signals.fire('action-resume' , signalArg);\n\n // fire a reume event\n const resumeEvent = new InteractEvent(interaction,\n event,\n interaction.prepared.name,\n 'inertiaresume',\n interaction.element);\n\n interaction.target.fire(resumeEvent);\n interaction.prevEvent = resumeEvent;\n modifiers.resetStatuses(interaction.modifierStatuses);\n\n utils.copyCoords(interaction.prevCoords, interaction.curCoords);\n break;\n }\n\n element = utils.parentNode(element);\n }\n }\n});\n\nInteraction.signals.on('up', function ({ interaction, event }) {\n const status = interaction.inertiaStatus;\n\n if (!interaction.interacting() || status.active) { return; }\n\n const target = interaction.target;\n const options = target && target.options;\n const inertiaOptions = options && interaction.prepared.name && options[interaction.prepared.name].inertia;\n\n const now = new Date().getTime();\n const statuses = {};\n const page = utils.extend({}, interaction.curCoords.page);\n const pointerSpeed = interaction.pointerDelta.client.speed;\n\n let smoothEnd = false;\n let modifierResult;\n\n // check if inertia should be started\n const inertiaPossible = (inertiaOptions && inertiaOptions.enabled\n && interaction.prepared.name !== 'gesture'\n && event !== status.startEvent);\n\n const inertia = (inertiaPossible\n && (now - interaction.curCoords.timeStamp) < 50\n && pointerSpeed > inertiaOptions.minSpeed\n && pointerSpeed > inertiaOptions.endSpeed);\n\n const modifierArg = {\n interaction,\n pageCoords: page,\n statuses,\n preEnd: true,\n requireEndOnly: true,\n };\n\n // smoothEnd\n if (inertiaPossible && !inertia) {\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n if (modifierResult.shouldMove && modifierResult.locked) {\n smoothEnd = true;\n }\n }\n\n if (!(inertia || smoothEnd)) { return; }\n\n utils.copyCoords(status.upCoords, interaction.curCoords);\n\n interaction.pointers[0] = status.startEvent =\n new InteractEvent(interaction, event, interaction.prepared.name, 'inertiastart', interaction.element);\n\n status.t0 = now;\n\n status.active = true;\n status.allowResume = inertiaOptions.allowResume;\n interaction.simulation = status;\n\n target.fire(status.startEvent);\n\n if (inertia) {\n status.vx0 = interaction.pointerDelta.client.vx;\n status.vy0 = interaction.pointerDelta.client.vy;\n status.v0 = pointerSpeed;\n\n calcInertia(interaction, status);\n\n utils.extend(page, interaction.curCoords.page);\n\n page.x += status.xe;\n page.y += status.ye;\n\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n status.modifiedXe += modifierResult.dx;\n status.modifiedYe += modifierResult.dy;\n\n status.i = animationFrame.request(interaction.boundInertiaFrame);\n }\n else {\n status.smoothEnd = true;\n status.xe = modifierResult.dx;\n status.ye = modifierResult.dy;\n\n status.sx = status.sy = 0;\n\n status.i = animationFrame.request(interaction.boundSmoothEndFrame);\n }\n});\n\nInteraction.signals.on('stop-active', function ({ interaction }) {\n const status = interaction.inertiaStatus;\n\n if (status.active) {\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n }\n});\n\nfunction calcInertia (interaction, status) {\n const inertiaOptions = interaction.target.options[interaction.prepared.name].inertia;\n const lambda = inertiaOptions.resistance;\n const inertiaDur = -Math.log(inertiaOptions.endSpeed / status.v0) / lambda;\n\n status.x0 = interaction.prevEvent.pageX;\n status.y0 = interaction.prevEvent.pageY;\n status.t0 = status.startEvent.timeStamp / 1000;\n status.sx = status.sy = 0;\n\n status.modifiedXe = status.xe = (status.vx0 - inertiaDur) / lambda;\n status.modifiedYe = status.ye = (status.vy0 - inertiaDur) / lambda;\n status.te = inertiaDur;\n\n status.lambda_v0 = lambda / status.v0;\n status.one_ve_v0 = 1 - inertiaOptions.endSpeed / status.v0;\n}\n\nfunction inertiaFrame () {\n updateInertiaCoords(this);\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n\n const status = this.inertiaStatus;\n const options = this.target.options[this.prepared.name].inertia;\n const lambda = options.resistance;\n const t = new Date().getTime() / 1000 - status.t0;\n\n if (t < status.te) {\n\n const progress = 1 - (Math.exp(-lambda * t) - status.lambda_v0) / status.one_ve_v0;\n\n if (status.modifiedXe === status.xe && status.modifiedYe === status.ye) {\n status.sx = status.xe * progress;\n status.sy = status.ye * progress;\n }\n else {\n const quadPoint = utils.getQuadraticCurvePoint(0, 0,\n status.xe,\n status.ye,\n status.modifiedXe,\n status.modifiedYe,\n progress);\n\n status.sx = quadPoint.x;\n status.sy = quadPoint.y;\n }\n\n this.doMove();\n\n status.i = animationFrame.request(this.boundInertiaFrame);\n }\n else {\n status.sx = status.modifiedXe;\n status.sy = status.modifiedYe;\n\n this.doMove();\n this.end(status.startEvent);\n status.active = false;\n this.simulation = null;\n }\n\n utils.copyCoords(this.prevCoords, this.curCoords);\n}\n\nfunction smoothEndFrame () {\n updateInertiaCoords(this);\n\n const status = this.inertiaStatus;\n const t = new Date().getTime() - status.t0;\n const duration = this.target.options[this.prepared.name].inertia.smoothEndDuration;\n\n if (t < duration) {\n status.sx = utils.easeOutQuad(t, 0, status.xe, duration);\n status.sy = utils.easeOutQuad(t, 0, status.ye, duration);\n\n this.pointerMove(status.startEvent, status.startEvent);\n\n status.i = animationFrame.request(this.boundSmoothEndFrame);\n }\n else {\n status.sx = status.xe;\n status.sy = status.ye;\n\n this.pointerMove(status.startEvent, status.startEvent);\n this.end(status.startEvent);\n\n status.smoothEnd =\n status.active = false;\n this.simulation = null;\n }\n}\n\nfunction updateInertiaCoords (interaction) {\n const status = interaction.inertiaStatus;\n\n // return if inertia isn't running\n if (!status.active) { return; }\n\n const pageUp = status.upCoords.page;\n const clientUp = status.upCoords.client;\n\n utils.setCoords(interaction.curCoords, [ {\n pageX : pageUp.x + status.sx,\n pageY : pageUp.y + status.sy,\n clientX: clientUp.x + status.sx,\n clientY: clientUp.y + status.sy,\n } ]);\n}\n","const browser = require('./utils/browser');\nconst events = require('./utils/events');\nconst utils = require('./utils');\nconst scope = require('./scope');\nconst Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\n\nconst globalEvents = {};\n\n/*\\\n * interact\n [ method ]\n *\n * The methods of this variable can be used to set elements as\n * interactables and also to change various default settings.\n *\n * Calling it as a function and passing an element or a valid CSS selector\n * string returns an Interactable object which has various methods to\n * configure it.\n *\n - element (Element | string) The HTML or SVG Element to interact with or CSS selector\n = (object) An @Interactable\n *\n > Usage\n | interact('#draggable').draggable(true);\n |\n | var rectables = interact('rect');\n | rectables\n | .gesturable(true)\n | .on('gesturemove', function (event) {\n | // ...\n | });\n\\*/\nfunction interact (element, options) {\n let interactable = scope.interactables.get(element, options);\n\n if (!interactable) {\n interactable = new Interactable(element, options);\n interactable.events.global = globalEvents;\n }\n\n return interactable;\n}\n\n/*\\\n * interact.isSet\n [ method ]\n *\n * Check if an element has been set\n - element (Element) The Element being searched for\n = (boolean) Indicates if the element or CSS selector was previously passed to interact\n\\*/\ninteract.isSet = function (element, options) {\n return scope.interactables.indexOfElement(element, options && options.context) !== -1;\n};\n\n/*\\\n * interact.on\n [ method ]\n *\n * Adds a global listener for an InteractEvent or adds a DOM event to\n * `document`\n *\n - type (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) interact\n\\*/\ninteract.on = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.on(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.on(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n // if it is an InteractEvent type, add listener to globalEvents\n if (utils.contains(Interactable.eventTypes, type)) {\n // if this type of event was never bound\n if (!globalEvents[type]) {\n globalEvents[type] = [listener];\n }\n else {\n globalEvents[type].push(listener);\n }\n }\n // If non InteractEvent type, addEventListener to document\n else {\n events.add(scope.document, type, listener, { options });\n }\n\n return interact;\n};\n\n/*\\\n * interact.off\n [ method ]\n *\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n - type (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) interact\n \\*/\ninteract.off = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.off(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.off(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n if (!utils.contains(Interactable.eventTypes, type)) {\n events.remove(scope.document, type, listener, options);\n }\n else {\n let index;\n\n if (type in globalEvents\n && (index = utils.indexOf(globalEvents[type], listener)) !== -1) {\n globalEvents[type].splice(index, 1);\n }\n }\n\n return interact;\n};\n\n/*\\\n * interact.debug\n [ method ]\n *\n * Returns an object which exposes internal data\n = (object) An object with properties that outline the current state and expose internal functions and variables\n\\*/\ninteract.debug = function () {\n return scope;\n};\n\n// expose the functions used to calculate multi-touch properties\ninteract.getPointerAverage = utils.pointerAverage;\ninteract.getTouchBBox = utils.touchBBox;\ninteract.getTouchDistance = utils.touchDistance;\ninteract.getTouchAngle = utils.touchAngle;\n\ninteract.getElementRect = utils.getElementRect;\ninteract.getElementClientRect = utils.getElementClientRect;\ninteract.matchesSelector = utils.matchesSelector;\ninteract.closest = utils.closest;\n\n/*\\\n * interact.supportsTouch\n [ method ]\n *\n = (boolean) Whether or not the browser supports touch input\n\\*/\ninteract.supportsTouch = function () {\n return browser.supportsTouch;\n};\n\n/*\\\n * interact.supportsPointerEvent\n [ method ]\n *\n = (boolean) Whether or not the browser supports PointerEvents\n\\*/\ninteract.supportsPointerEvent = function () {\n return browser.supportsPointerEvent;\n};\n\n/*\\\n * interact.stop\n [ method ]\n *\n * Cancels all interactions (end events are not fired)\n *\n - event (Event) An event on which to call preventDefault()\n = (object) interact\n\\*/\ninteract.stop = function (event) {\n for (let i = scope.interactions.length - 1; i >= 0; i--) {\n scope.interactions[i].stop(event);\n }\n\n return interact;\n};\n\n/*\\\n * interact.pointerMoveTolerance\n [ method ]\n * Returns or sets the distance the pointer must be moved before an action\n * sequence occurs. This also affects tolerance for tap events.\n *\n - newValue (number) #optional The movement from the start position must be greater than this value\n = (number | Interactable) The current setting or interact\n\\*/\ninteract.pointerMoveTolerance = function (newValue) {\n if (utils.is.number(newValue)) {\n Interaction.pointerMoveTolerance = newValue;\n\n return this;\n }\n\n return Interaction.pointerMoveTolerance;\n};\n\ninteract.addDocument = scope.addDocument;\ninteract.removeDocument = scope.removeDocument;\n\nscope.interact = interact;\n\nmodule.exports = interact;\n","const Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\nconst scope = require('./scope');\nconst is = require('./utils/is');\nconst events = require('./utils/events');\n\nconst { nodeContains, matchesSelector } = require('./utils/domUtils');\n\n/*\\\n * Interactable.preventDefault\n [ method ]\n *\n * Returns or sets whether to prevent the browser's default behaviour\n * in response to pointer events. Can be set to:\n * - `'always'` to always prevent\n * - `'never'` to never prevent\n * - `'auto'` to let interact.js try to determine what would be best\n *\n - newValue (string) #optional `true`, `false` or `'auto'`\n = (string | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.preventDefault = function (newValue) {\n if (/^(always|never|auto)$/.test(newValue)) {\n this.options.preventDefault = newValue;\n return this;\n }\n\n if (is.bool(newValue)) {\n this.options.preventDefault = newValue? 'always' : 'never';\n return this;\n }\n\n return this.options.preventDefault;\n};\n\nInteractable.prototype.checkAndPreventDefault = function (event) {\n const setting = this.options.preventDefault;\n\n if (setting === 'never') { return; }\n\n if (setting === 'always') {\n event.preventDefault();\n return;\n }\n\n // setting === 'auto'\n\n // don't preventDefault if the browser supports passiveEvents\n // CSS touch-action and user-selecct should be used instead\n if (events.supportsOptions) {\n return;\n }\n\n // don't preventDefault of pointerdown events\n if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) {\n return;\n }\n\n // don't preventDefault on editable elements\n if (is.element(event.target)\n && matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) {\n return;\n }\n\n event.preventDefault();\n};\n\nfunction onInteractionEvent ({ interaction, event }) {\n if (interaction.target) {\n interaction.target.checkAndPreventDefault(event);\n }\n}\n\nfor (const eventSignal of ['down', 'move', 'up', 'cancel']) {\n Interaction.signals.on(eventSignal, onInteractionEvent);\n}\n\n// prevent native HTML5 drag on interact.js target elements\nInteraction.docEvents.dragstart = function preventNativeDrag (event) {\n for (const interaction of scope.interactions) {\n\n if (interaction.element\n && (interaction.element === event.target\n || nodeContains(interaction.element, event.target))) {\n\n interaction.target.checkAndPreventDefault(event);\n return;\n }\n }\n};\n","const scope = require('./scope');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst iFinder = require('./utils/interactionFinder');\nconst pointerEvents = require('./pointerEvents/base');\n\nconst { window } = require('./utils/window');\n\nconst toString = Object.prototype.toString;\n\nif (!window.Array.isArray) {\n window.Array.isArray = function (obj) {\n return toString.call(obj) === '[object Array]';\n };\n}\n\nif (!String.prototype.trim) {\n String.prototype.trim = function () {\n return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n };\n}\n\n// http://www.quirksmode.org/dom/events/click.html\n// >Events leading to dblclick\n//\n// IE8 doesn't fire down event before dblclick.\n// This workaround tries to fire a tap and doubletap after dblclick\nfunction onIE8Dblclick (event) {\n const eventTarget = event.target;\n const interaction = iFinder.search(event, event.type, eventTarget);\n\n if (!interaction) { return; }\n\n if (interaction.prevTap\n && event.clientX === interaction.prevTap.clientX\n && event.clientY === interaction.prevTap.clientY\n && eventTarget === interaction.prevTap.target) {\n\n interaction.downTargets[0] = eventTarget;\n interaction.downTimes [0] = new Date().getTime();\n\n pointerEvents.fire({\n interaction,\n event,\n eventTarget,\n pointer: event,\n type: 'tap',\n });\n }\n}\n\nif (browser.isIE8) {\n const selectFix = function (event) {\n for (const interaction of scope.interactions) {\n if (interaction.interacting()) {\n interaction.target.checkAndPreventDefault(event);\n }\n }\n };\n\n const onDocIE8 = function onDocIE8 ({ doc, win }, signalName) {\n const eventMethod = signalName.indexOf('listen') === 0\n ? events.add : events.remove;\n\n // For IE's lack of Event#preventDefault\n eventMethod(doc, 'selectstart', selectFix);\n\n if (pointerEvents) {\n eventMethod(doc, 'dblclick', onIE8Dblclick);\n }\n };\n\n scope.signals.on('add-document' , onDocIE8);\n scope.signals.on('remove-document', onDocIE8);\n}\n\nmodule.exports = null;\n","const InteractEvent = require('../InteractEvent');\nconst Interaction = require('../Interaction');\nconst extend = require('../utils/extend');\n\nconst modifiers = {\n names: [],\n\n setOffsets: function (arg) {\n const { interaction, pageCoords: page } = arg;\n const { target, element, startOffset } = interaction;\n const rect = target.getRect(element);\n\n if (rect) {\n startOffset.left = page.x - rect.left;\n startOffset.top = page.y - rect.top;\n\n startOffset.right = rect.right - page.x;\n startOffset.bottom = rect.bottom - page.y;\n\n if (!('width' in rect)) { rect.width = rect.right - rect.left; }\n if (!('height' in rect)) { rect.height = rect.bottom - rect.top ; }\n }\n else {\n startOffset.left = startOffset.top = startOffset.right = startOffset.bottom = 0;\n }\n\n arg.rect = rect;\n arg.interactable = target;\n arg.element = element;\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n\n arg.options = target.options[interaction.prepared.name][modifierName];\n\n if (!arg.options) {\n continue;\n }\n\n interaction.modifierOffsets[modifierName] = modifiers[modifierName].setOffset(arg);\n }\n },\n\n setAll: function (arg) {\n const { interaction, statuses, preEnd, requireEndOnly } = arg;\n const coords = extend({}, arg.pageCoords);\n const result = {\n dx: 0,\n dy: 0,\n changed: false,\n locked: false,\n shouldMove: true,\n };\n\n for (const modifierName of modifiers.names) {\n const modifier = modifiers[modifierName];\n const options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!shouldDo(options, preEnd, requireEndOnly)) { continue; }\n\n arg.status = arg.status = statuses[modifierName];\n arg.options = options;\n arg.offset = arg.interaction.modifierOffsets[modifierName];\n\n modifier.set(arg);\n\n if (arg.status.locked) {\n coords.x += arg.status.dx;\n coords.y += arg.status.dy;\n\n result.dx += arg.status.dx;\n result.dy += arg.status.dy;\n\n result.locked = true;\n }\n }\n\n // a move should be fired if:\n // - there are no modifiers enabled,\n // - no modifiers are \"locked\" i.e. have changed the pointer's coordinates, or\n // - the locked coords have changed since the last pointer move\n result.shouldMove = !arg.status || !result.locked || arg.status.changed;\n\n return result;\n },\n\n resetStatuses: function (statuses) {\n for (const modifierName of modifiers.names) {\n const status = statuses[modifierName] || {};\n\n status.dx = status.dy = 0;\n status.modifiedX = status.modifiedY = NaN;\n status.locked = false;\n status.changed = true;\n\n statuses[modifierName] = status;\n }\n\n return statuses;\n },\n\n start: function ({ interaction }, signalName) {\n const arg = {\n interaction,\n pageCoords: (signalName === 'action-resume' ?\n interaction.curCoords : interaction.startCoords).page,\n startOffset: interaction.startOffset,\n statuses: interaction.modifierStatuses,\n preEnd: false,\n requireEndOnly: false,\n };\n\n modifiers.setOffsets(arg);\n modifiers.resetStatuses(arg.statuses);\n\n arg.pageCoords = extend({}, interaction.startCoords.page);\n interaction.modifierResult = modifiers.setAll(arg);\n },\n};\n\nInteraction.signals.on('new', function (interaction) {\n interaction.startOffset = { left: 0, right: 0, top: 0, bottom: 0 };\n interaction.modifierOffsets = {};\n interaction.modifierStatuses = modifiers.resetStatuses({});\n interaction.modifierResult = null;\n});\n\nInteraction.signals.on('action-start' , modifiers.start);\nInteraction.signals.on('action-resume', modifiers.start);\n\nInteraction.signals.on('before-action-move', function ({ interaction, preEnd, interactingBeforeMove }) {\n const modifierResult = modifiers.setAll({\n interaction,\n preEnd,\n pageCoords: interaction.curCoords.page,\n statuses: interaction.modifierStatuses,\n requireEndOnly: false,\n });\n\n // don't fire an action move if a modifier would keep the event in the same\n // cordinates as before\n if (!modifierResult.shouldMove && interactingBeforeMove) {\n interaction._dontFireMove = true;\n }\n\n interaction.modifierResult = modifierResult;\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n for (let i = 0; i < modifiers.names.length; i++) {\n const options = interaction.target.options[interaction.prepared.name][modifiers.names[i]];\n\n // if the endOnly option is true for any modifier\n if (shouldDo(options, true, true)) {\n // fire a move event at the modified coordinates\n interaction.doMove({ event, preEnd: true });\n break;\n }\n }\n});\n\nInteractEvent.signals.on('set-xy', function (arg) {\n const { iEvent, interaction } = arg;\n const modifierArg = extend({}, arg);\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n modifierArg.options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!modifierArg.options) {\n continue;\n }\n\n const modifier = modifiers[modifierName];\n\n modifierArg.status = interaction.modifierStatuses[modifierName];\n\n iEvent[modifierName] = modifier.modifyCoords(modifierArg);\n }\n});\n\nfunction shouldDo (options, preEnd, requireEndOnly) {\n return (options && options.enabled\n && (preEnd || !options.endOnly)\n && (!requireEndOnly || options.endOnly));\n}\n\nmodule.exports = modifiers;\n","const modifiers = require('./index');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst restrict = {\n defaults: {\n enabled : false,\n endOnly : false,\n restriction: null,\n elementRect: null,\n },\n\n setOffset: function ({ rect, startOffset, options }) {\n const elementRect = options && options.elementRect;\n const offset = {};\n\n if (rect && elementRect) {\n offset.left = startOffset.left - (rect.width * elementRect.left);\n offset.top = startOffset.top - (rect.height * elementRect.top);\n\n offset.right = startOffset.right - (rect.width * (1 - elementRect.right));\n offset.bottom = startOffset.bottom - (rect.height * (1 - elementRect.bottom));\n }\n else {\n offset.left = offset.top = offset.right = offset.bottom = 0;\n }\n\n return offset;\n },\n\n set: function ({ pageCoords, interaction, status, options }) {\n if (!options) { return status; }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n\n const restriction = getRestrictionRect(options.restriction, interaction, page);\n\n if (!restriction) { return status; }\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n const rect = restriction;\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n const offset = interaction.modifierOffsets.restrict;\n\n // object is assumed to have\n // x, y, width, height or\n // left, top, right, bottom\n if ('x' in restriction && 'y' in restriction) {\n modifiedX = Math.max(Math.min(rect.x + rect.width - offset.right , page.x), rect.x + offset.left);\n modifiedY = Math.max(Math.min(rect.y + rect.height - offset.bottom, page.y), rect.y + offset.top );\n }\n else {\n modifiedX = Math.max(Math.min(rect.right - offset.right , page.x), rect.left + offset.left);\n modifiedY = Math.max(Math.min(rect.bottom - offset.bottom, page.y), rect.top + offset.top );\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const elementRect = options && options.elementRect;\n\n if (options && options.enabled\n && !(phase === 'start' && elementRect && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n getRestrictionRect,\n};\n\nfunction getRestrictionRect (value, interaction, page) {\n if (utils.is.function(value)) {\n return utils.resolveRectLike(value, interaction.target, interaction.element, [page.x, page.y, interaction]);\n } else {\n return utils.resolveRectLike(value, interaction.target, interaction.element);\n }\n}\n\nmodifiers.restrict = restrict;\nmodifiers.names.push('restrict');\n\ndefaultOptions.perAction.restrict = restrict.defaults;\n\nmodule.exports = restrict;\n","// This module adds the options.resize.restrictEdges setting which sets min and\n// max for the top, left, bottom and right edges of the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictEdges: {\n// inner: { top: 200, left: 200, right: 400, bottom: 400 },\n// outer: { top: 0, left: 0, right: 600, bottom: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst { getRestrictionRect } = require('./restrict');\n\nconst noInner = { top: +Infinity, left: +Infinity, bottom: -Infinity, right: -Infinity };\nconst noOuter = { top: -Infinity, left: -Infinity, bottom: +Infinity, right: +Infinity };\n\nconst restrictEdges = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n offset: null,\n },\n\n setOffset: function ({ interaction, startOffset, options }) {\n if (!options) {\n return utils.extend({}, startOffset);\n }\n\n const offset = getRestrictionRect(options.offset, interaction, interaction.startCoords.page);\n\n if (offset) {\n return {\n top: startOffset.top + offset.y,\n left: startOffset.left + offset.x,\n bottom: startOffset.bottom + offset.y,\n right: startOffset.right + offset.x,\n };\n }\n\n return startOffset;\n },\n\n set: function ({ pageCoords, interaction, status, offset, options }) {\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n const inner = rectUtils.xywhToTlbr(getRestrictionRect(options.inner, interaction, page)) || noInner;\n const outer = rectUtils.xywhToTlbr(getRestrictionRect(options.outer, interaction, page)) || noOuter;\n\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n if (edges.top) {\n modifiedY = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top);\n }\n else if (edges.bottom) {\n modifiedY = Math.max(Math.min(outer.bottom - offset.bottom, page.y), inner.bottom - offset.bottom);\n }\n if (edges.left) {\n modifiedX = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left);\n }\n else if (edges.right) {\n modifiedX = Math.max(Math.min(outer.right - offset.right, page.x), inner.right - offset.right);\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n if (options && options.enabled\n && !(phase === 'start' && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n noInner,\n noOuter,\n getRestrictionRect,\n};\n\nmodifiers.restrictEdges = restrictEdges;\nmodifiers.names.push('restrictEdges');\n\ndefaultOptions.perAction.restrictEdges = restrictEdges.defaults;\nresize.defaults.restrictEdges = restrictEdges.defaults;\n\nmodule.exports = restrictEdges;\n","// This module adds the options.resize.restrictSize setting which sets min and\n// max width and height for the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictSize: {\n// min: { width: -600, height: -600 },\n// max: { width: 600, height: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst restrictEdges = require('./restrictEdges');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst noMin = { width: -Infinity, height: -Infinity };\nconst noMax = { width: +Infinity, height: +Infinity };\n\nconst restrictSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n },\n\n setOffset: function ({ interaction }) {\n return interaction.startOffset;\n },\n\n set: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const rect = rectUtils.xywhToTlbr(interaction.resizeRects.inverted);\n\n const minSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.min, interaction)) || noMin;\n const maxSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.max, interaction)) || noMax;\n\n arg.options = {\n enabled: options.enabled,\n endOnly: options.endOnly,\n inner: utils.extend({}, restrictEdges.noInner),\n outer: utils.extend({}, restrictEdges.noOuter),\n };\n\n if (edges.top) {\n arg.options.inner.top = rect.bottom - minSize.height;\n arg.options.outer.top = rect.bottom - maxSize.height;\n }\n else if (edges.bottom) {\n arg.options.inner.bottom = rect.top + minSize.height;\n arg.options.outer.bottom = rect.top + maxSize.height;\n }\n if (edges.left) {\n arg.options.inner.left = rect.right - minSize.width;\n arg.options.outer.left = rect.right - maxSize.width;\n }\n else if (edges.right) {\n arg.options.inner.right = rect.left + minSize.width;\n arg.options.outer.right = rect.left + maxSize.width;\n }\n\n restrictEdges.set(arg);\n },\n\n modifyCoords: restrictEdges.modifyCoords,\n};\n\nmodifiers.restrictSize = restrictSize;\nmodifiers.names.push('restrictSize');\n\ndefaultOptions.perAction.restrictSize = restrictSize.defaults;\nresize.defaults.restrictSize = restrictSize.defaults;\n\nmodule.exports = restrictSize;\n","const modifiers = require('./index');\nconst interact = require('../interact');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst snap = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n\n relativePoints: null,\n },\n\n setOffset: function ({ interaction, interactable, element, rect, startOffset, options }) {\n const offsets = [];\n const optionsOrigin = utils.rectToXY(utils.resolveRectLike(options.origin));\n const origin = optionsOrigin || utils.getOriginXY(interactable, element, interaction.prepared.name);\n options = options || interactable.options[interaction.prepared.name].snap || {};\n\n let snapOffset;\n\n if (options.offset === 'startCoords') {\n snapOffset = {\n x: interaction.startCoords.page.x - origin.x,\n y: interaction.startCoords.page.y - origin.y,\n };\n }\n else {\n const offsetRect = utils.resolveRectLike(options.offset, interactable, element, [interaction]);\n\n snapOffset = utils.rectToXY(offsetRect) || { x: 0, y: 0 };\n }\n\n if (rect && options.relativePoints && options.relativePoints.length) {\n for (const { x: relativeX, y: relativeY } of options.relativePoints) {\n offsets.push({\n x: startOffset.left - (rect.width * relativeX) + snapOffset.x,\n y: startOffset.top - (rect.height * relativeY) + snapOffset.y,\n });\n }\n }\n else {\n offsets.push(snapOffset);\n }\n\n return offsets;\n },\n\n set: function ({ interaction, pageCoords, status, options, offset: offsets }) {\n const targets = [];\n let target;\n let page;\n let i;\n\n if (status.useStatusXY) {\n page = { x: status.x, y: status.y };\n }\n else {\n const origin = utils.getOriginXY(interaction.target, interaction.element, interaction.prepared.name);\n\n page = utils.extend({}, pageCoords);\n\n page.x -= origin.x;\n page.y -= origin.y;\n }\n\n status.realX = page.x;\n status.realY = page.y;\n\n let len = options.targets? options.targets.length : 0;\n\n for (const { x: offsetX, y: offsetY } of offsets) {\n const relativeX = page.x - offsetX;\n const relativeY = page.y - offsetY;\n\n for (const snapTarget of options.targets) {\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n targets.push({\n x: utils.is.number(target.x) ? (target.x + offsetX) : relativeX,\n y: utils.is.number(target.y) ? (target.y + offsetY) : relativeY,\n\n range: utils.is.number(target.range)? target.range: options.range,\n });\n }\n }\n\n const closest = {\n target: null,\n inRange: false,\n distance: 0,\n range: 0,\n dx: 0,\n dy: 0,\n };\n\n for (i = 0, len = targets.length; i < len; i++) {\n target = targets[i];\n\n const range = target.range;\n const dx = target.x - page.x;\n const dy = target.y - page.y;\n const distance = utils.hypot(dx, dy);\n let inRange = distance <= range;\n\n // Infinite targets count as being out of range\n // compared to non infinite ones that are in range\n if (range === Infinity && closest.inRange && closest.range !== Infinity) {\n inRange = false;\n }\n\n if (!closest.target || (inRange\n // is the closest target in range?\n ? (closest.inRange && range !== Infinity\n // the pointer is relatively deeper in this target\n ? distance / range < closest.distance / closest.range\n // this target has Infinite range and the closest doesn't\n : (range === Infinity && closest.range !== Infinity)\n // OR this target is closer that the previous closest\n || distance < closest.distance)\n // The other is not in range and the pointer is closer to this target\n : (!closest.inRange && distance < closest.distance))) {\n\n closest.target = target;\n closest.distance = distance;\n closest.range = range;\n closest.inRange = inRange;\n closest.dx = dx;\n closest.dy = dy;\n\n status.range = range;\n }\n }\n\n let snapChanged;\n\n if (closest.target) {\n snapChanged = (status.modifiedX !== closest.target.x || status.modifiedY !== closest.target.y);\n\n status.modifiedX = closest.target.x;\n status.modifiedY = closest.target.y;\n }\n else {\n snapChanged = true;\n\n status.modifiedX = NaN;\n status.modifiedY = NaN;\n }\n\n status.dx = closest.dx;\n status.dy = closest.dy;\n\n status.changed = (snapChanged || (closest.inRange && !status.locked));\n status.locked = closest.inRange;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const relativePoints = options && options.relativePoints;\n\n if (options && options.enabled\n && !(phase === 'start' && relativePoints && relativePoints.length)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n }\n\n return {\n range : status.range,\n locked : status.locked,\n x : status.modifiedX,\n y : status.modifiedY,\n realX : status.realX,\n realY : status.realY,\n dx : status.dx,\n dy : status.dy,\n };\n }\n },\n};\n\ninteract.createSnapGrid = function (grid) {\n return function (x, y) {\n const limits = grid.limits || {\n left : -Infinity,\n right : Infinity,\n top : -Infinity,\n bottom: Infinity,\n };\n let offsetX = 0;\n let offsetY = 0;\n\n if (utils.is.object(grid.offset)) {\n offsetX = grid.offset.x;\n offsetY = grid.offset.y;\n }\n\n const gridx = Math.round((x - offsetX) / grid.x);\n const gridy = Math.round((y - offsetY) / grid.y);\n\n const newX = Math.max(limits.left, Math.min(limits.right , gridx * grid.x + offsetX));\n const newY = Math.max(limits.top , Math.min(limits.bottom, gridy * grid.y + offsetY));\n\n return {\n x: newX,\n y: newY,\n range: grid.range,\n };\n };\n};\n\nmodifiers.snap = snap;\nmodifiers.names.push('snap');\n\ndefaultOptions.perAction.snap = snap.defaults;\n\nmodule.exports = snap;\n","// This module allows snapping of the size of targets during resize\n// interactions.\n\nconst modifiers = require('./index');\nconst snap = require('./snap');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\nconst utils = require('../utils/');\n\nconst snapSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n },\n\n setOffset: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.edges;\n\n if (!edges) { return; }\n\n arg.options = {\n relativePoints: [{\n x: edges.left? 0 : 1,\n y: edges.top ? 0 : 1,\n }],\n origin: { x: 0, y: 0 },\n offset: 'self',\n range: options.range,\n };\n\n const offsets = snap.setOffset(arg);\n arg.options = options;\n\n return offsets;\n },\n\n set: function (arg) {\n const { interaction, options, offset, pageCoords } = arg;\n const page = utils.extend({}, pageCoords);\n const relativeX = page.x - offset[0].x;\n const relativeY = page.y - offset[0].y;\n\n arg.options = utils.extend({}, options);\n arg.options.targets = [];\n\n for (const snapTarget of options.targets) {\n let target;\n\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n if ('width' in target && 'height' in target) {\n target.x = target.width;\n target.y = target.height;\n }\n\n arg.options.targets.push(target);\n }\n\n snap.set(arg);\n },\n\n modifyCoords: function (arg) {\n const { options } = arg;\n\n arg.options = utils.extend({}, options);\n arg.options.enabled = options.enabled;\n arg.options.relativePoints = [null];\n\n snap.modifyCoords(arg);\n },\n};\n\nmodifiers.snapSize = snapSize;\nmodifiers.names.push('snapSize');\n\ndefaultOptions.perAction.snapSize = snapSize.defaults;\nresize.defaults.snapSize = snapSize.defaults;\n\nmodule.exports = snapSize;\n","const pointerUtils = require('../utils/pointerUtils');\n\nmodule.exports = class PointerEvent {\n constructor (type, pointer, event, eventTarget, interaction) {\n pointerUtils.pointerExtend(this, event);\n\n if (event !== pointer) {\n pointerUtils.pointerExtend(this, pointer);\n }\n\n this.interaction = interaction;\n\n this.timeStamp = new Date().getTime();\n this.originalEvent = event;\n this.type = type;\n this.pointerId = pointerUtils.getPointerId(pointer);\n this.pointerType = pointerUtils.getPointerType(pointer);\n this.target = eventTarget;\n this.currentTarget = null;\n\n if (type === 'tap') {\n const pointerIndex = interaction.getPointerIndex(pointer);\n this.dt = this.timeStamp - interaction.downTimes[pointerIndex];\n\n const interval = this.timeStamp - interaction.tapTime;\n\n this.double = !!(interaction.prevTap\n && interaction.prevTap.type !== 'doubletap'\n && interaction.prevTap.target === this.target\n && interval < 500);\n }\n else if (type === 'doubletap') {\n this.dt = pointer.timeStamp - interaction.tapTime;\n }\n }\n\n subtractOrigin ({ x: originX, y: originY }) {\n this.pageX -= originX;\n this.pageY -= originY;\n this.clientX -= originX;\n this.clientY -= originY;\n\n return this;\n }\n\n addOrigin ({ x: originX, y: originY }) {\n this.pageX += originX;\n this.pageY += originY;\n this.clientX += originX;\n this.clientY += originY;\n\n return this;\n }\n\n preventDefault () {\n this.originalEvent.preventDefault();\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n};\n","const PointerEvent = require('./PointerEvent');\nconst Interaction = require('../Interaction');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst defaults = require('../defaultOptions');\nconst signals = require('../utils/Signals').new();\nconst { filter } = require('../utils/arr');\n\nconst simpleSignals = [ 'down', 'up', 'cancel' ];\nconst simpleEvents = [ 'down', 'up', 'cancel' ];\n\nconst pointerEvents = {\n PointerEvent,\n fire,\n collectEventTargets,\n signals,\n defaults: {\n holdDuration: 600,\n ignoreFrom : null,\n allowFrom : null,\n origin : { x: 0, y: 0 },\n },\n types: [\n 'down',\n 'move',\n 'up',\n 'cancel',\n 'tap',\n 'doubletap',\n 'hold',\n ],\n};\n\nfunction fire (arg) {\n const {\n interaction, pointer, event, eventTarget,\n type = arg.pointerEvent.type,\n targets = collectEventTargets(arg),\n pointerEvent = new PointerEvent(type, pointer, event, eventTarget, interaction),\n } = arg;\n\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n targets,\n type,\n pointerEvent,\n };\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n\n for (const prop in target.props || {}) {\n pointerEvent[prop] = target.props[prop];\n }\n\n const origin = utils.getOriginXY(target.eventable, target.element);\n\n pointerEvent.subtractOrigin(origin);\n pointerEvent.eventable = target.eventable;\n pointerEvent.currentTarget = target.element;\n\n target.eventable.fire(pointerEvent);\n\n pointerEvent.addOrigin(origin);\n\n if (pointerEvent.immediatePropagationStopped\n || (pointerEvent.propagationStopped\n && (i + 1) < targets.length && targets[i + 1].element !== pointerEvent.currentTarget)) {\n break;\n }\n }\n\n signals.fire('fired', signalArg);\n\n if (type === 'tap') {\n // if pointerEvent should make a double tap, create and fire a doubletap\n // PointerEvent and use that as the prevTap\n const prevTap = pointerEvent.double\n ? fire({\n interaction, pointer, event, eventTarget,\n type: 'doubletap',\n })\n : pointerEvent;\n\n interaction.prevTap = prevTap;\n interaction.tapTime = prevTap.timeStamp;\n }\n\n return pointerEvent;\n}\n\nfunction collectEventTargets ({ interaction, pointer, event, eventTarget, type }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n // do not fire a tap event if the pointer was moved before being lifted\n if (type === 'tap' && (interaction.pointerWasMoved\n // or if the pointerup target is different to the pointerdown target\n || !(interaction.downTargets[pointerIndex] && interaction.downTargets[pointerIndex] === eventTarget))) {\n return [];\n }\n\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n path,\n targets: [],\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (type === 'hold') {\n signalArg.targets = filter(signalArg.targets, target =>\n target.eventable.options.holdDuration === interaction.holdTimers[pointerIndex].duration);\n }\n\n return signalArg.targets;\n}\n\nInteraction.signals.on('update-pointer-down', function ({ interaction, pointerIndex }) {\n interaction.holdTimers[pointerIndex] = { duration: Infinity, timeout: null };\n});\n\nInteraction.signals.on('remove-pointer', function ({ interaction, pointerIndex }) {\n interaction.holdTimers.splice(pointerIndex, 1);\n});\n\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget, duplicateMove }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n if (!duplicateMove && (!interaction.pointerIsDown || interaction.pointerWasMoved)) {\n if (interaction.pointerIsDown) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n\n fire({\n interaction, pointer, event, eventTarget,\n type: 'move',\n });\n }\n});\n\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget, pointerIndex }) {\n // copy event to be used in timeout for IE8\n const eventCopy = browser.isIE8? utils.extend({}, event) : event;\n\n const timer = interaction.holdTimers[pointerIndex];\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'hold',\n targets: [],\n path,\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (!signalArg.targets.length) { return; }\n\n let minDuration = Infinity;\n\n for (let i = 0; i < signalArg.targets.length; i++) {\n const target = signalArg.targets[i];\n const holdDuration = target.eventable.options.holdDuration;\n\n if (holdDuration < minDuration) {\n minDuration = holdDuration;\n }\n }\n\n timer.duration = minDuration;\n timer.timeout = setTimeout(function () {\n fire({\n interaction,\n eventTarget,\n pointer: browser.isIE8? eventCopy : pointer,\n event: eventCopy,\n type: 'hold',\n });\n }, minDuration);\n});\n\nInteraction.signals.on('up', ({ interaction, pointer, event, eventTarget }) => {\n if (!interaction.pointerWasMoved) {\n fire({ interaction, eventTarget, pointer, event, type: 'tap' });\n }\n});\n\n['up', 'cancel'].forEach(function (signalName) {\n Interaction.signals.on(signalName, function ({ interaction, pointerIndex }) {\n if (interaction.holdTimers[pointerIndex]) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n });\n});\n\nfunction createSignalListener (type) {\n return function ({ interaction, pointer, event, eventTarget }) {\n fire({ interaction, eventTarget, pointer, event, type });\n };\n}\n\nfor (let i = 0; i < simpleSignals.length; i++) {\n Interaction.signals.on(simpleSignals[i], createSignalListener(simpleEvents[i]));\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.prevTap = null; // the most recent tap event on this interaction\n interaction.tapTime = 0; // time of the most recent tap event\n interaction.holdTimers = []; // [{ duration, timeout }]\n});\n\ndefaults.pointerEvents = pointerEvents.defaults;\nmodule.exports = pointerEvents;\n","const pointerEvents = require('./base');\nconst Interaction = require('../Interaction');\n\npointerEvents.signals.on('new', onNew);\npointerEvents.signals.on('fired', onFired);\n\nfor (const signal of ['move', 'up', 'cancel', 'endall']) {\n Interaction.signals.on(signal, endHoldRepeat);\n}\n\nfunction onNew ({ pointerEvent }) {\n if (pointerEvent.type !== 'hold') { return; }\n\n pointerEvent.count = (pointerEvent.count || 0) + 1;\n}\n\nfunction onFired ({ interaction, pointerEvent, eventTarget, targets }) {\n if (pointerEvent.type !== 'hold' || !targets.length) { return; }\n\n // get the repeat interval from the first eventable\n const interval = targets[0].eventable.options.holdRepeatInterval;\n\n // don't repeat if the interval is 0 or less\n if (interval <= 0) { return; }\n\n // set a timeout to fire the holdrepeat event\n interaction.holdIntervalHandle = setTimeout(function () {\n pointerEvents.fire({\n interaction,\n eventTarget,\n type: 'hold',\n pointer: pointerEvent,\n event: pointerEvent,\n });\n }, interval);\n}\n\nfunction endHoldRepeat ({ interaction }) {\n // set the interaction's holdStopTime property\n // to stop further holdRepeat events\n if (interaction.holdIntervalHandle) {\n clearInterval(interaction.holdIntervalHandle);\n interaction.holdIntervalHandle = null;\n }\n}\n\n// don't repeat by default\npointerEvents.defaults.holdRepeatInterval = 0;\npointerEvents.types.push('holdrepeat');\n\nmodule.exports = {\n onNew,\n onFired,\n endHoldRepeat,\n};\n","const pointerEvents = require('./base');\nconst Interactable = require('../Interactable');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\nconst scope = require('../scope');\nconst extend = require('../utils/extend');\nconst { merge } = require('../utils/arr');\n\npointerEvents.signals.on('collect-targets', function ({ targets, element, type, eventTarget }) {\n function collectSelectors (interactable, selector, context) {\n const els = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && is.element(element)\n && domUtils.matchesSelector(element, selector, els)\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n const interactable = scope.interactables.get(element);\n\n if (interactable) {\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n scope.interactables.forEachSelector(collectSelectors, element);\n});\n\nInteractable.signals.on('new', function ({ interactable }) {\n interactable.events.getRect = function (element) {\n return interactable.getRect(element);\n };\n});\n\nInteractable.signals.on('set', function ({ interactable, options }) {\n extend(interactable.events.options, pointerEvents.defaults);\n extend(interactable.events.options, options);\n});\n\nmerge(Interactable.eventTypes, pointerEvents.types);\n\nInteractable.prototype.pointerEvents = function (options) {\n extend(this.events.options, options);\n\n return this;\n};\n\nconst __backCompatOption = Interactable.prototype._backCompatOption;\n\nInteractable.prototype._backCompatOption = function (optionName, newValue) {\n const ret = __backCompatOption.call(this, optionName, newValue);\n\n if (ret === this) {\n this.events.options[optionName] = newValue;\n }\n\n return ret;\n};\n\nInteractable.settingsMethods.push('pointerEvents');\n","const utils = require('./utils');\nconst events = require('./utils/events');\nconst signals = require('./utils/Signals').new();\n\nconst scope = {\n signals,\n events,\n utils,\n\n // main document\n document: require('./utils/domObjects').document,\n // all documents being listened to\n documents: [],\n\n addDocument: function (doc, win) {\n // do nothing if document is already known\n if (utils.contains(scope.documents, doc)) { return false; }\n\n win = win || scope.getWindow(doc);\n\n scope.documents.push(doc);\n events.documents.push(doc);\n\n // don't add an unload event for the main document\n // so that the page may be cached in browser history\n if (doc !== scope.document) {\n events.add(win, 'unload', scope.onWindowUnload);\n }\n\n signals.fire('add-document', { doc, win });\n },\n\n removeDocument: function (doc, win) {\n const index = utils.indexOf(scope.documents, doc);\n\n win = win || scope.getWindow(doc);\n\n events.remove(win, 'unload', scope.onWindowUnload);\n\n scope.documents.splice(index, 1);\n events.documents.splice(index, 1);\n\n signals.fire('remove-document', { win, doc });\n },\n\n onWindowUnload: function () {\n scope.removeDocument(this.document, this);\n },\n};\n\nmodule.exports = scope;\n","const { indexOf } = require('./arr');\n\nclass Signals {\n constructor () {\n this.listeners = {\n // signalName: [listeners],\n };\n }\n\n on (name, listener) {\n if (!this.listeners[name]) {\n this.listeners[name] = [listener];\n return;\n }\n\n this.listeners[name].push(listener);\n }\n\n off (name, listener) {\n if (!this.listeners[name]) { return; }\n\n const index = indexOf(this.listeners[name], listener);\n\n if (index !== -1) {\n this.listeners[name].splice(index, 1);\n }\n }\n\n fire (name, arg) {\n const targetListeners = this.listeners[name];\n\n if (!targetListeners) { return; }\n\n for (let i = 0; i < targetListeners.length; i++) {\n if (targetListeners[i](arg, name) === false) {\n return;\n }\n }\n }\n}\n\nSignals.new = function () {\n return new Signals();\n};\n\nmodule.exports = Signals;\n","function indexOf (array, target) {\n for (let i = 0, len = array.length; i < len; i++) {\n if (array[i] === target) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction contains (array, target) {\n return indexOf(array, target) !== -1;\n}\n\nfunction merge (target, source) {\n for (let i = 0; i < source.length; i++) {\n target.push(source[i]);\n }\n\n return target;\n}\n\nfunction filter (array, test) {\n const result = [];\n\n for (let i = 0; i < array.length; i++) {\n if (test(array[i])) {\n result.push(array[i]);\n }\n }\n\n return result;\n}\n\nmodule.exports = {\n indexOf,\n contains,\n merge,\n filter,\n};\n","const { window } = require('./window');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst Element = domObjects.Element;\nconst navigator = window.navigator;\n\nconst browser = {\n // Does the browser support touch input?\n supportsTouch: !!(('ontouchstart' in window) || is.function(window.DocumentTouch)\n && domObjects.document instanceof window.DocumentTouch),\n\n // Does the browser support PointerEvents\n supportsPointerEvent: !!domObjects.PointerEvent,\n\n isIE8: ('attachEvent' in window) && !('addEventListener' in window),\n\n // Opera Mobile must be handled differently\n isOperaMobile: (navigator.appName === 'Opera'\n && browser.supportsTouch\n && navigator.userAgent.match('Presto')),\n\n // scrolling doesn't change the result of getClientRects on iOS 7\n isIOS7: (/iP(hone|od|ad)/.test(navigator.platform)\n && /OS 7[^\\d]/.test(navigator.appVersion)),\n\n isIe9OrOlder: /MSIE (8|9)/.test(navigator.userAgent),\n\n // prefix matchesSelector\n prefixedMatchesSelector: 'matches' in Element.prototype\n ? 'matches': 'webkitMatchesSelector' in Element.prototype\n ? 'webkitMatchesSelector': 'mozMatchesSelector' in Element.prototype\n ? 'mozMatchesSelector': 'oMatchesSelector' in Element.prototype\n ? 'oMatchesSelector': 'msMatchesSelector',\n\n useMatchesSelectorPolyfill: false,\n\n pEventTypes: (domObjects.PointerEvent\n ? (domObjects.PointerEvent === window.MSPointerEvent\n ? {\n up: 'MSPointerUp',\n down: 'MSPointerDown',\n over: 'mouseover',\n out: 'mouseout',\n move: 'MSPointerMove',\n cancel: 'MSPointerCancel',\n }\n : {\n up: 'pointerup',\n down: 'pointerdown',\n over: 'pointerover',\n out: 'pointerout',\n move: 'pointermove',\n cancel: 'pointercancel',\n })\n : null),\n\n // because Webkit and Opera still use 'mousewheel' event type\n wheelEvent: 'onmousewheel' in domObjects.document? 'mousewheel': 'wheel',\n\n};\n\nbrowser.useMatchesSelectorPolyfill = !is.function(Element.prototype[browser.prefixedMatchesSelector]);\n\nmodule.exports = browser;\n","const domObjects = {};\nconst win = require('./window').window;\n\nfunction blank () {}\n\ndomObjects.document = win.document;\ndomObjects.DocumentFragment = win.DocumentFragment || blank;\ndomObjects.SVGElement = win.SVGElement || blank;\ndomObjects.SVGSVGElement = win.SVGSVGElement || blank;\ndomObjects.SVGElementInstance = win.SVGElementInstance || blank;\ndomObjects.Element = win.Element || blank;\ndomObjects.HTMLElement = win.HTMLElement || domObjects.Element;\n\ndomObjects.Event = win.Event;\ndomObjects.Touch = win.Touch || blank;\ndomObjects.PointerEvent = (win.PointerEvent || win.MSPointerEvent);\n\nmodule.exports = domObjects;\n","const win = require('./window');\nconst browser = require('./browser');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst domUtils = {\n nodeContains: function (parent, child) {\n while (child) {\n if (child === parent) {\n return true;\n }\n\n child = child.parentNode;\n }\n\n return false;\n },\n\n closest: function (element, selector) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) { return element; }\n\n element = domUtils.parentNode(element);\n }\n\n return null;\n },\n\n parentNode: function (node) {\n let parent = node.parentNode;\n\n if (is.docFrag(parent)) {\n // skip past #shado-root fragments\n while ((parent = parent.host) && is.docFrag(parent)) {\n continue;\n }\n\n return parent;\n }\n\n return parent;\n },\n\n // taken from http://tanalin.com/en/blog/2012/12/matches-selector-ie8/ and modified\n matchesSelectorPolyfill: browser.useMatchesSelectorPolyfill\n ? function (element, selector, elems) {\n elems = elems || element.parentNode.querySelectorAll(selector);\n\n for (let i = 0, len = elems.length; i < len; i++) {\n if (elems[i] === element) {\n return true;\n }\n }\n\n return false;\n }\n : null,\n\n matchesSelector: function (element, selector, nodeList) {\n if (browser.useMatchesSelectorPolyfill) {\n return domUtils.matchesSelectorPolyfill(element, selector, nodeList);\n }\n\n // remove /deep/ from selectors if shadowDOM polyfill is used\n if (win.window !== win.realWindow) {\n selector = selector.replace(/\\/deep\\//g, ' ');\n }\n\n return element[browser.prefixedMatchesSelector](selector);\n },\n\n // Test for the element that's \"above\" all other qualifiers\n indexOfDeepestElement: function (elements) {\n let deepestZoneParents = [];\n let dropzoneParents = [];\n let dropzone;\n let deepestZone = elements[0];\n let index = deepestZone? 0: -1;\n let parent;\n let child;\n let i;\n let n;\n\n for (i = 1; i < elements.length; i++) {\n dropzone = elements[i];\n\n // an element might belong to multiple selector dropzones\n if (!dropzone || dropzone === deepestZone) {\n continue;\n }\n\n if (!deepestZone) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n // check if the deepest or current are document.documentElement or document.rootElement\n // - if the current dropzone is, do nothing and continue\n if (dropzone.parentNode === dropzone.ownerDocument) {\n continue;\n }\n // - if deepest is, update with the current dropzone and continue to next\n else if (deepestZone.parentNode === dropzone.ownerDocument) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n if (!deepestZoneParents.length) {\n parent = deepestZone;\n while (parent.parentNode && parent.parentNode !== parent.ownerDocument) {\n deepestZoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n }\n\n // if this element is an svg element and the current deepest is\n // an HTMLElement\n if (deepestZone instanceof domObjects.HTMLElement\n && dropzone instanceof domObjects.SVGElement\n && !(dropzone instanceof domObjects.SVGSVGElement)) {\n\n if (dropzone === deepestZone.parentNode) {\n continue;\n }\n\n parent = dropzone.ownerSVGElement;\n }\n else {\n parent = dropzone;\n }\n\n dropzoneParents = [];\n\n while (parent.parentNode !== parent.ownerDocument) {\n dropzoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n\n n = 0;\n\n // get (position of last common ancestor) + 1\n while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) {\n n++;\n }\n\n const parents = [\n dropzoneParents[n - 1],\n dropzoneParents[n],\n deepestZoneParents[n],\n ];\n\n child = parents[0].lastChild;\n\n while (child) {\n if (child === parents[1]) {\n deepestZone = dropzone;\n index = i;\n deepestZoneParents = [];\n\n break;\n }\n else if (child === parents[2]) {\n break;\n }\n\n child = child.previousSibling;\n }\n }\n\n return index;\n },\n\n matchesUpTo: function (element, selector, limit) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) {\n return true;\n }\n\n element = domUtils.parentNode(element);\n\n if (element === limit) {\n return domUtils.matchesSelector(element, selector);\n }\n }\n\n return false;\n },\n\n getActualElement: function (element) {\n return (element instanceof domObjects.SVGElementInstance\n ? element.correspondingUseElement\n : element);\n },\n\n getScrollXY: function (relevantWindow) {\n relevantWindow = relevantWindow || win.window;\n return {\n x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft,\n y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop,\n };\n },\n\n getElementClientRect: function (element) {\n const clientRect = (element instanceof domObjects.SVGElement\n ? element.getBoundingClientRect()\n : element.getClientRects()[0]);\n\n return clientRect && {\n left : clientRect.left,\n right : clientRect.right,\n top : clientRect.top,\n bottom: clientRect.bottom,\n width : clientRect.width || clientRect.right - clientRect.left,\n height: clientRect.height || clientRect.bottom - clientRect.top,\n };\n },\n\n getElementRect: function (element) {\n const clientRect = domUtils.getElementClientRect(element);\n\n if (!browser.isIOS7 && clientRect) {\n const scroll = domUtils.getScrollXY(win.getWindow(element));\n\n clientRect.left += scroll.x;\n clientRect.right += scroll.x;\n clientRect.top += scroll.y;\n clientRect.bottom += scroll.y;\n }\n\n return clientRect;\n },\n\n getPath: function (element) {\n const path = [];\n\n while (element) {\n path.push(element);\n element = domUtils.parentNode(element);\n }\n\n return path;\n },\n\n trySelector: value => {\n if (!is.string(value)) { return false; }\n\n // an exception will be raised if it is invalid\n domObjects.document.querySelector(value);\n return true;\n },\n};\n\nmodule.exports = domUtils;\n","const is = require('./is');\nconst domUtils = require('./domUtils');\nconst pExtend = require('./pointerExtend');\n\nconst { window, getWindow } = require('./window');\nconst { indexOf, contains } = require('./arr');\n\nconst useAttachEvent = ('attachEvent' in window) && !('addEventListener' in window);\nconst addEvent = useAttachEvent? 'attachEvent': 'addEventListener';\nconst removeEvent = useAttachEvent? 'detachEvent': 'removeEventListener';\nconst on = useAttachEvent? 'on': '';\n\nconst elements = [];\nconst targets = [];\nconst attachedListeners = [];\n\n// {\n// type: {\n// selectors: ['selector', ...],\n// contexts : [document, ...],\n// listeners: [[listener, capture, passive], ...]\n// }\n// }\nconst delegatedEvents = {};\n\nconst documents = [];\n\nconst supportsOptions = !useAttachEvent && (() => {\n let supported = false;\n\n window.document.createElement('div').addEventListener('test', null, {\n get capture () { supported = true; },\n });\n\n return supported;\n})();\n\nfunction add (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n let elementIndex = indexOf(elements, element);\n let target = targets[elementIndex];\n\n if (!target) {\n target = {\n events: {},\n typeCount: 0,\n };\n\n elementIndex = elements.push(element) - 1;\n targets.push(target);\n\n attachedListeners.push(useAttachEvent\n ? {\n supplied: [],\n wrapped : [],\n useCount: [],\n }\n : null);\n }\n\n if (!target.events[type]) {\n target.events[type] = [];\n target.typeCount++;\n }\n\n if (!contains(target.events[type], listener)) {\n let ret;\n\n if (useAttachEvent) {\n const { supplied, wrapped, useCount } = attachedListeners[elementIndex];\n const listenerIndex = indexOf(supplied, listener);\n\n const wrappedListener = wrapped[listenerIndex] || function (event) {\n if (!event.immediatePropagationStopped) {\n event.target = event.srcElement;\n event.currentTarget = element;\n\n event.preventDefault = event.preventDefault || preventDef;\n event.stopPropagation = event.stopPropagation || stopProp;\n event.stopImmediatePropagation = event.stopImmediatePropagation || stopImmProp;\n\n if (/mouse|click/.test(event.type)) {\n event.pageX = event.clientX + getWindow(element).document.documentElement.scrollLeft;\n event.pageY = event.clientY + getWindow(element).document.documentElement.scrollTop;\n }\n\n listener(event);\n }\n };\n\n ret = element[addEvent](on + type, wrappedListener, !!options.capture);\n\n if (listenerIndex === -1) {\n supplied.push(listener);\n wrapped.push(wrappedListener);\n useCount.push(1);\n }\n else {\n useCount[listenerIndex]++;\n }\n }\n else {\n ret = element[addEvent](type, listener, supportsOptions? options : !!options.capture);\n }\n target.events[type].push(listener);\n\n return ret;\n }\n}\n\nfunction remove (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const elementIndex = indexOf(elements, element);\n const target = targets[elementIndex];\n\n if (!target || !target.events) {\n return;\n }\n\n let wrappedListener = listener;\n let listeners;\n let listenerIndex;\n\n if (useAttachEvent) {\n listeners = attachedListeners[elementIndex];\n listenerIndex = indexOf(listeners.supplied, listener);\n wrappedListener = listeners.wrapped[listenerIndex];\n }\n\n if (type === 'all') {\n for (type in target.events) {\n if (target.events.hasOwnProperty(type)) {\n remove(element, type, 'all');\n }\n }\n return;\n }\n\n if (target.events[type]) {\n const len = target.events[type].length;\n\n if (listener === 'all') {\n for (let i = 0; i < len; i++) {\n remove(element, type, target.events[type][i], options);\n }\n return;\n }\n else {\n for (let i = 0; i < len; i++) {\n if (target.events[type][i] === listener) {\n element[removeEvent](on + type, wrappedListener, supportsOptions? options : !!options.capture);\n target.events[type].splice(i, 1);\n\n if (useAttachEvent && listeners) {\n listeners.useCount[listenerIndex]--;\n if (listeners.useCount[listenerIndex] === 0) {\n listeners.supplied.splice(listenerIndex, 1);\n listeners.wrapped.splice(listenerIndex, 1);\n listeners.useCount.splice(listenerIndex, 1);\n }\n }\n\n break;\n }\n }\n }\n\n if (target.events[type] && target.events[type].length === 0) {\n target.events[type] = null;\n target.typeCount--;\n }\n }\n\n if (!target.typeCount) {\n targets.splice(elementIndex, 1);\n elements.splice(elementIndex, 1);\n attachedListeners.splice(elementIndex, 1);\n }\n}\n\nfunction addDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n if (!delegatedEvents[type]) {\n delegatedEvents[type] = {\n selectors: [],\n contexts : [],\n listeners: [],\n };\n\n // add delegate listener functions\n for (let i = 0; i < documents.length; i++) {\n add(documents[i], type, delegateListener);\n add(documents[i], type, delegateUseCapture, true);\n }\n }\n\n const delegated = delegatedEvents[type];\n let index;\n\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n break;\n }\n }\n\n if (index === -1) {\n index = delegated.selectors.length;\n\n delegated.selectors.push(selector);\n delegated.contexts .push(context);\n delegated.listeners.push([]);\n }\n\n // keep listener and capture and passive flags\n delegated.listeners[index].push([listener, !!options.capture, options.passive]);\n}\n\nfunction removeDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const delegated = delegatedEvents[type];\n let matchFound = false;\n let index;\n\n if (!delegated) { return; }\n\n // count from last index of delegated to 0\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n // look for matching selector and context Node\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n\n const listeners = delegated.listeners[index];\n\n // each item of the listeners array is an array: [function, capture, passive]\n for (let i = listeners.length - 1; i >= 0; i--) {\n const [fn, capture, passive] = listeners[i];\n\n // check if the listener functions and capture and passive flags match\n if (fn === listener && capture === !!options.capture && passive === options.passive) {\n // remove the listener from the array of listeners\n listeners.splice(i, 1);\n\n // if all listeners for this interactable have been removed\n // remove the interactable from the delegated arrays\n if (!listeners.length) {\n delegated.selectors.splice(index, 1);\n delegated.contexts .splice(index, 1);\n delegated.listeners.splice(index, 1);\n\n // remove delegate function from context\n remove(context, type, delegateListener);\n remove(context, type, delegateUseCapture, true);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegatedEvents[type] = null;\n }\n }\n\n // only remove one listener\n matchFound = true;\n break;\n }\n }\n\n if (matchFound) { break; }\n }\n }\n}\n\n// bound to the interactable context when a DOM event\n// listener is added to a selector interactable\nfunction delegateListener (event, optionalArg) {\n const options = getOptions(optionalArg);\n const fakeEvent = {};\n const delegated = delegatedEvents[event.type];\n const eventTarget = (domUtils.getActualElement(event.path\n ? event.path[0]\n : event.target));\n let element = eventTarget;\n\n // duplicate the event so that currentTarget can be changed\n pExtend(fakeEvent, event);\n\n fakeEvent.originalEvent = event;\n fakeEvent.preventDefault = preventOriginalDefault;\n\n // climb up document tree looking for selector matches\n while (is.element(element)) {\n for (let i = 0; i < delegated.selectors.length; i++) {\n const selector = delegated.selectors[i];\n const context = delegated.contexts[i];\n\n if (domUtils.matchesSelector(element, selector)\n && domUtils.nodeContains(context, eventTarget)\n && domUtils.nodeContains(context, element)) {\n\n const listeners = delegated.listeners[i];\n\n fakeEvent.currentTarget = element;\n\n for (let j = 0; j < listeners.length; j++) {\n const [fn, capture, passive] = listeners[j];\n\n if (capture === !!options.capture && passive === options.passive) {\n fn(fakeEvent);\n }\n }\n }\n }\n\n element = domUtils.parentNode(element);\n }\n}\n\nfunction delegateUseCapture (event) {\n return delegateListener.call(this, event, true);\n}\n\nfunction preventDef () {\n this.returnValue = false;\n}\n\nfunction preventOriginalDefault () {\n this.originalEvent.preventDefault();\n}\n\nfunction stopProp () {\n this.cancelBubble = true;\n}\n\nfunction stopImmProp () {\n this.cancelBubble = true;\n this.immediatePropagationStopped = true;\n}\n\nfunction getOptions (param) {\n return is.object(param)? param : { capture: param };\n}\n\nmodule.exports = {\n add,\n remove,\n\n addDelegate,\n removeDelegate,\n\n delegateListener,\n delegateUseCapture,\n delegatedEvents,\n documents,\n\n useAttachEvent,\n supportsOptions,\n\n _elements: elements,\n _targets: targets,\n _attachedListeners: attachedListeners,\n};\n","module.exports = function extend (dest, source) {\n for (const prop in source) {\n dest[prop] = source[prop];\n }\n return dest;\n};\n","const {\n resolveRectLike,\n rectToXY,\n} = require('./rect');\n\nmodule.exports = function (target, element, action) {\n const actionOptions = target.options[action];\n const actionOrigin = actionOptions && actionOptions.origin;\n const origin = actionOrigin || target.options.origin;\n\n const originRect = resolveRectLike(origin, target, element, [target && element]);\n\n return rectToXY(originRect) || { x: 0, y: 0 };\n};\n","module.exports = (x, y) => Math.sqrt(x * x + y * y);\n","const extend = require('./extend');\nconst win = require('./window');\n\nconst utils = {\n warnOnce: function (method, message) {\n let warned = false;\n\n return function () {\n if (!warned) {\n win.window.console.warn(message);\n warned = true;\n }\n\n return method.apply(this, arguments);\n };\n },\n\n // http://stackoverflow.com/a/5634528/2280888\n _getQBezierValue: function (t, p1, p2, p3) {\n const iT = 1 - t;\n return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3;\n },\n\n getQuadraticCurvePoint: function (startX, startY, cpX, cpY, endX, endY, position) {\n return {\n x: utils._getQBezierValue(position, startX, cpX, endX),\n y: utils._getQBezierValue(position, startY, cpY, endY),\n };\n },\n\n // http://gizma.com/easing/\n easeOutQuad: function (t, b, c, d) {\n t /= d;\n return -c * t*(t-2) + b;\n },\n\n copyAction: function (dest, src) {\n dest.name = src.name;\n dest.axis = src.axis;\n dest.edges = src.edges;\n\n return dest;\n },\n\n is : require('./is'),\n extend : extend,\n hypot : require('./hypot'),\n getOriginXY: require('./getOriginXY'),\n};\n\nextend(utils, require('./arr'));\nextend(utils, require('./domUtils'));\nextend(utils, require('./pointerUtils'));\nextend(utils, require('./rect'));\n\nmodule.exports = utils;\n","const scope = require('../scope');\nconst utils = require('./index');\n\nconst finder = {\n methodOrder: [ 'simulationResume', 'mouseOrPen', 'hasPointer', 'idle' ],\n\n search: function (pointer, eventType, eventTarget) {\n const pointerType = utils.getPointerType(pointer);\n const pointerId = utils.getPointerId(pointer);\n const details = { pointer, pointerId, pointerType, eventType, eventTarget };\n\n for (const method of finder.methodOrder) {\n const interaction = finder[method](details);\n\n if (interaction) {\n return interaction;\n }\n }\n },\n\n // try to resume simulation with a new pointer\n simulationResume: function ({ pointerType, eventType, eventTarget }) {\n if (!/down|start/i.test(eventType)) {\n return null;\n }\n\n for (const interaction of scope.interactions) {\n let element = eventTarget;\n\n if (interaction.simulation && interaction.simulation.allowResume\n && (interaction.pointerType === pointerType)) {\n while (element) {\n // if the element is the interaction element\n if (element === interaction.element) {\n return interaction;\n }\n element = utils.parentNode(element);\n }\n }\n }\n\n return null;\n },\n\n // if it's a mouse or pen interaction\n mouseOrPen: function ({ pointerId, pointerType, eventType }) {\n if (pointerType !== 'mouse' && pointerType !== 'pen') {\n return null;\n }\n\n let firstNonActive;\n\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType) {\n // if it's a down event, skip interactions with running simulations\n if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; }\n\n // if the interaction is active, return it immediately\n if (interaction.interacting()) {\n return interaction;\n }\n // otherwise save it and look for another active interaction\n else if (!firstNonActive) {\n firstNonActive = interaction;\n }\n }\n }\n\n // if no active mouse interaction was found use the first inactive mouse\n // interaction\n if (firstNonActive) {\n return firstNonActive;\n }\n\n // find any mouse or pen interaction.\n // ignore the interaction if the eventType is a *down, and a simulation\n // is active\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType && !(/down/i.test(eventType) && interaction.simulation)) {\n return interaction;\n }\n }\n\n return null;\n },\n\n // get interaction that has this pointer\n hasPointer: function ({ pointerId }) {\n for (const interaction of scope.interactions) {\n if (utils.contains(interaction.pointerIds, pointerId)) {\n return interaction;\n }\n }\n },\n\n // get first idle interaction with a matching pointerType\n idle: function ({ pointerType }) {\n for (const interaction of scope.interactions) {\n // if there's already a pointer held down\n if (interaction.pointerIds.length === 1) {\n const target = interaction.target;\n // don't add this pointer if there is a target interactable and it\n // isn't gesturable\n if (target && !target.options.gesture.enabled) {\n continue;\n }\n }\n // maximum of 2 pointers per interaction\n else if (interaction.pointerIds.length >= 2) {\n continue;\n }\n\n if (!interaction.interacting() && (pointerType === interaction.pointerType)) {\n return interaction;\n }\n }\n\n return null;\n },\n};\n\nmodule.exports = finder;\n","const win = require('./window');\nconst isWindow = require('./isWindow');\n\nconst is = {\n array : () => {},\n\n window : thing => thing === win.window || isWindow(thing),\n\n docFrag : thing => is.object(thing) && thing.nodeType === 11,\n\n object : thing => !!thing && (typeof thing === 'object'),\n\n function: thing => typeof thing === 'function',\n\n number : thing => typeof thing === 'number' ,\n\n bool : thing => typeof thing === 'boolean' ,\n\n string : thing => typeof thing === 'string' ,\n\n element: thing => {\n if (!thing || (typeof thing !== 'object')) { return false; }\n\n const _window = win.getWindow(thing) || win.window;\n\n return (/object|function/.test(typeof _window.Element)\n ? thing instanceof _window.Element //DOM2\n : thing.nodeType === 1 && typeof thing.nodeName === 'string');\n },\n};\n\nis.array = thing => (is.object(thing)\n && (typeof thing.length !== 'undefined')\n && is.function(thing.splice));\n\nmodule.exports = is;\n","module.exports = (thing) => !!(thing && thing.Window) && (thing instanceof thing.Window);\n","function pointerExtend (dest, source) {\n for (const prop in source) {\n const prefixedPropREs = module.exports.prefixedPropREs;\n let deprecated = false;\n\n // skip deprecated prefixed properties\n for (const vendor in prefixedPropREs) {\n if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) {\n deprecated = true;\n break;\n }\n }\n\n if (!deprecated && typeof source[prop] !== 'function') {\n dest[prop] = source[prop];\n }\n }\n return dest;\n}\n\npointerExtend.prefixedPropREs = {\n webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/,\n};\n\nmodule.exports = pointerExtend;\n","const hypot = require('./hypot');\nconst browser = require('./browser');\nconst dom = require('./domObjects');\nconst domUtils = require('./domUtils');\nconst domObjects = require('./domObjects');\nconst is = require('./is');\nconst pointerExtend = require('./pointerExtend');\n\nconst pointerUtils = {\n copyCoords: function (dest, src) {\n dest.page = dest.page || {};\n dest.page.x = src.page.x;\n dest.page.y = src.page.y;\n\n dest.client = dest.client || {};\n dest.client.x = src.client.x;\n dest.client.y = src.client.y;\n\n dest.timeStamp = src.timeStamp;\n },\n\n setCoordDeltas: function (targetObj, prev, cur) {\n targetObj.page.x = cur.page.x - prev.page.x;\n targetObj.page.y = cur.page.y - prev.page.y;\n targetObj.client.x = cur.client.x - prev.client.x;\n targetObj.client.y = cur.client.y - prev.client.y;\n targetObj.timeStamp = cur.timeStamp - prev.timeStamp;\n\n // set pointer velocity\n const dt = Math.max(targetObj.timeStamp / 1000, 0.001);\n\n targetObj.page.speed = hypot(targetObj.page.x, targetObj.page.y) / dt;\n targetObj.page.vx = targetObj.page.x / dt;\n targetObj.page.vy = targetObj.page.y / dt;\n\n targetObj.client.speed = hypot(targetObj.client.x, targetObj.page.y) / dt;\n targetObj.client.vx = targetObj.client.x / dt;\n targetObj.client.vy = targetObj.client.y / dt;\n },\n\n isNativePointer: function (pointer) {\n return (pointer instanceof dom.Event || pointer instanceof dom.Touch);\n },\n\n // Get specified X/Y coords for mouse or event.touches[0]\n getXY: function (type, pointer, xy) {\n xy = xy || {};\n type = type || 'page';\n\n xy.x = pointer[type + 'X'];\n xy.y = pointer[type + 'Y'];\n\n return xy;\n },\n\n getPageXY: function (pointer, page) {\n page = page || {};\n\n // Opera Mobile handles the viewport and scrolling oddly\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n pointerUtils.getXY('screen', pointer, page);\n\n page.x += window.scrollX;\n page.y += window.scrollY;\n }\n else {\n pointerUtils.getXY('page', pointer, page);\n }\n\n return page;\n },\n\n getClientXY: function (pointer, client) {\n client = client || {};\n\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n // Opera Mobile handles the viewport and scrolling oddly\n pointerUtils.getXY('screen', pointer, client);\n }\n else {\n pointerUtils.getXY('client', pointer, client);\n }\n\n return client;\n },\n\n getPointerId: function (pointer) {\n return is.number(pointer.pointerId)? pointer.pointerId : pointer.identifier;\n },\n\n setCoords: function (targetObj, pointers, timeStamp) {\n const pointer = (pointers.length > 1\n ? pointerUtils.pointerAverage(pointers)\n : pointers[0]);\n\n const tmpXY = {};\n\n pointerUtils.getPageXY(pointer, tmpXY);\n targetObj.page.x = tmpXY.x;\n targetObj.page.y = tmpXY.y;\n\n pointerUtils.getClientXY(pointer, tmpXY);\n targetObj.client.x = tmpXY.x;\n targetObj.client.y = tmpXY.y;\n\n targetObj.timeStamp = is.number(timeStamp) ? timeStamp :new Date().getTime();\n },\n\n pointerExtend: pointerExtend,\n\n getTouchPair: function (event) {\n const touches = [];\n\n // array of touches is supplied\n if (is.array(event)) {\n touches[0] = event[0];\n touches[1] = event[1];\n }\n // an event\n else {\n if (event.type === 'touchend') {\n if (event.touches.length === 1) {\n touches[0] = event.touches[0];\n touches[1] = event.changedTouches[0];\n }\n else if (event.touches.length === 0) {\n touches[0] = event.changedTouches[0];\n touches[1] = event.changedTouches[1];\n }\n }\n else {\n touches[0] = event.touches[0];\n touches[1] = event.touches[1];\n }\n }\n\n return touches;\n },\n\n pointerAverage: function (pointers) {\n const average = {\n pageX : 0,\n pageY : 0,\n clientX: 0,\n clientY: 0,\n screenX: 0,\n screenY: 0,\n };\n\n for (const pointer of pointers) {\n for (const prop in average) {\n average[prop] += pointer[prop];\n }\n }\n for (const prop in average) {\n average[prop] /= pointers.length;\n }\n\n return average;\n },\n\n touchBBox: function (event) {\n if (!event.length && !(event.touches && event.touches.length > 1)) {\n return;\n }\n\n const touches = pointerUtils.getTouchPair(event);\n const minX = Math.min(touches[0].pageX, touches[1].pageX);\n const minY = Math.min(touches[0].pageY, touches[1].pageY);\n const maxX = Math.max(touches[0].pageX, touches[1].pageX);\n const maxY = Math.max(touches[0].pageY, touches[1].pageY);\n\n return {\n x: minX,\n y: minY,\n left: minX,\n top: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n },\n\n touchDistance: function (event, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n\n\n const dx = touches[0][sourceX] - touches[1][sourceX];\n const dy = touches[0][sourceY] - touches[1][sourceY];\n\n return hypot(dx, dy);\n },\n\n touchAngle: function (event, prevAngle, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n const dx = touches[1][sourceX] - touches[0][sourceX];\n const dy = touches[1][sourceY] - touches[0][sourceY];\n const angle = 180 * Math.atan2(dy , dx) / Math.PI;\n\n return angle;\n },\n\n getPointerType: function (pointer) {\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : is.number(pointer.pointerType)\n ? [undefined, undefined,'touch', 'pen', 'mouse'][pointer.pointerType]\n // if the PointerEvent API isn't available, then the \"pointer\" must\n // be either a MouseEvent, TouchEvent, or Touch object\n : /touch/.test(pointer.type) || pointer instanceof domObjects.Touch\n ? 'touch'\n : 'mouse';\n },\n\n // [ event.target, event.currentTarget ]\n getEventTargets: function (event) {\n return [\n domUtils.getActualElement(event.path ? event.path[0] : event.target),\n domUtils.getActualElement(event.currentTarget),\n ];\n },\n};\n\nmodule.exports = pointerUtils;\n","const { window } = require('./window');\n\nconst vendors = ['ms', 'moz', 'webkit', 'o'];\nlet lastTime = 0;\nlet request;\nlet cancel;\n\nfor (let x = 0; x < vendors.length && !window.requestAnimationFrame; x++) {\n request = window[vendors[x] + 'RequestAnimationFrame'];\n cancel = window[vendors[x] +'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n}\n\nif (!request) {\n request = function (callback) {\n const currTime = new Date().getTime();\n const timeToCall = Math.max(0, 16 - (currTime - lastTime));\n const id = setTimeout(function () { callback(currTime + timeToCall); },\n timeToCall);\n\n lastTime = currTime + timeToCall;\n return id;\n };\n}\n\nif (!cancel) {\n cancel = function (id) {\n clearTimeout(id);\n };\n}\n\nmodule.exports = {\n request,\n cancel,\n};\n","const extend = require('./extend');\nconst is = require('./is');\nconst {\n closest,\n parentNode,\n getElementRect,\n} = require('./domUtils');\n\nconst rectUtils = {\n getStringOptionResult: function (value, interactable, element) {\n if (!is.string(value)) {\n return null;\n }\n\n if (value === 'parent') {\n value = parentNode(element);\n }\n else if (value === 'self') {\n value = interactable.getRect(element);\n }\n else {\n value = closest(element, value);\n }\n\n return value;\n },\n\n resolveRectLike: function (value, interactable, element, functionArgs) {\n value = rectUtils.getStringOptionResult(value, interactable, element) || value;\n\n if (is.function(value)) {\n value = value.apply(null, functionArgs);\n }\n\n if (is.element(value)) {\n value = getElementRect(value);\n }\n\n return value;\n },\n\n rectToXY: function (rect) {\n return rect && {\n x: 'x' in rect ? rect.x : rect.left,\n y: 'y' in rect ? rect.y : rect.top,\n };\n },\n\n xywhToTlbr: function (rect) {\n if (rect && !('left' in rect && 'top' in rect)) {\n rect = extend({}, rect);\n\n rect.left = rect.x || 0;\n rect.top = rect.y || 0;\n rect.right = rect.right || (rect.left + rect.width);\n rect.bottom = rect.bottom || (rect.top + rect.height);\n }\n\n return rect;\n },\n\n tlbrToXywh: function (rect) {\n if (rect && !('x' in rect && 'y' in rect)) {\n rect = extend({}, rect);\n\n rect.x = rect.left || 0;\n rect.top = rect.top || 0;\n rect.width = rect.width || (rect.right - rect.x);\n rect.height = rect.height || (rect.bottom - rect.y);\n }\n\n return rect;\n },\n};\n\nmodule.exports = rectUtils;\n","const win = module.exports;\nconst isWindow = require('./isWindow');\n\nfunction init (window) {\n // get wrapped window if using Shadow DOM polyfill\n\n win.realWindow = window;\n\n // create a TextNode\n const el = window.document.createTextNode('');\n\n // check if it's wrapped by a polyfill\n if (el.ownerDocument !== window.document\n && typeof window.wrap === 'function'\n && window.wrap(el) === el) {\n // use wrapped window\n window = window.wrap(window);\n }\n\n win.window = window;\n}\n\nif (typeof window === 'undefined') {\n win.window = undefined;\n win.realWindow = undefined;\n}\nelse {\n init(window);\n}\n\nwin.getWindow = function getWindow (node) {\n if (isWindow(node)) {\n return node;\n }\n\n const rootNode = (node.ownerDocument || node);\n\n return rootNode.defaultView || rootNode.parentWindow || win.window;\n};\n\nwin.init = init;\n"]} \ No newline at end of file diff --git a/package.json b/package.json index 76f3e9969..f39704e99 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "interactjs", - "version": "1.3.0-alpha.3+sha.9595c40", + "version": "1.3.0-alpha.4+sha.7970416", "repository": { "type": "git", "url": "https://github.com/taye/interact.js.git"
- Interaction.start(action, target, element)⚓➭ + Interaction.start(action, target, element)⚓➭ @@ -2356,7 +2356,7 @@ Parameters - Interaction.doMove()⚓➭ + Interaction.doMove()⚓➭ @@ -2403,7 +2403,7 @@ Interaction.doMove() - Interaction.end([event])⚓➭ + Interaction.end([event])⚓➭ diff --git a/dist/interact.js b/dist/interact.js index e8ae35c3b..c78a3c751 100644 --- a/dist/interact.js +++ b/dist/interact.js @@ -1,5 +1,5 @@ /** - * interact.js v1.3.0-alpha.3+sha.9595c40 + * interact.js v1.3.0-alpha.4+sha.7970416-dirty * * Copyright (c) 2012-2017 Taye Adeyemi * Open source under the MIT License. @@ -816,6 +816,7 @@ var scope = require('./scope'); var utils = require('./utils'); var events = require('./utils/events'); var browser = require('./utils/browser'); +var domObjects = require('./utils/domObjects'); var finder = require('./utils/interactionFinder'); var signals = require('./utils/Signals').new(); @@ -829,7 +830,9 @@ var prevTouchTime = 0; scope.interactions = []; var Interaction = function () { - function Interaction() { + function Interaction(_ref) { + var pointerType = _ref.pointerType; + _classCallCheck(this, Interaction); this.target = null; // current interactable being interacted with @@ -886,7 +889,7 @@ var Interaction = function () { this.pointerWasMoved = false; this._interacting = false; - this.mouse = false; + this.pointerType = pointerType; signals.fire('new', this); @@ -1130,6 +1133,11 @@ var Interaction = function () { }; Interaction.prototype.getPointerIndex = function getPointerIndex(pointer) { + // mouse and pen interactions may have only one pointer + if (this.pointerType === 'mouse' || this.pointerType === 'pen') { + return 0; + } + return utils.indexOf(this.pointerIds, utils.getPointerId(pointer)); }; @@ -1161,8 +1169,7 @@ var Interaction = function () { }; Interaction.prototype.removePointer = function removePointer(pointer, event) { - var id = utils.getPointerId(pointer); - var index = this.mouse ? 0 : utils.indexOf(this.pointerIds, id); + var index = this.getPointerIndex(pointer); if (index === -1) { return; @@ -1197,6 +1204,8 @@ for (var i = 0, len = methodNames.length; i < len; i++) { function doOnInteractions(method) { return function (event) { + var pointerType = utils.getPointerType(event); + var _utils$getEventTarget = utils.getEventTargets(event), eventTarget = _utils$getEventTarget[0], curEventTarget = _utils$getEventTarget[1]; @@ -1210,7 +1219,7 @@ function doOnInteractions(method) { var pointer = event.changedTouches[_i]; var interaction = finder.search(pointer, event.type, eventTarget); - matches.push([pointer, interaction || new Interaction()]); + matches.push([pointer, interaction || new Interaction({ pointerType: pointerType })]); } } else { var invalidPointer = false; @@ -1218,7 +1227,7 @@ function doOnInteractions(method) { if (!browser.supportsPointerEvent && /mouse/.test(event.type)) { // ignore mouse events while touch interactions are active for (var _i2 = 0; _i2 < scope.interactions.length && !invalidPointer; _i2++) { - invalidPointer = !scope.interactions[_i2].mouse && scope.interactions[_i2].pointerIsDown; + invalidPointer = scope.interactions[_i2].pointerType !== 'mouse' && scope.interactions[_i2].pointerIsDown; } // try to ignore mouse events that are simulated by the browser @@ -1232,11 +1241,7 @@ function doOnInteractions(method) { var _interaction = finder.search(event, event.type, eventTarget); if (!_interaction) { - - _interaction = new Interaction(); - _interaction.mouse = /mouse/i.test(event.pointerType || event.type) - // MSPointerEvent.MSPOINTER_TYPE_MOUSE - || event.pointerType === 4 || !event.pointerType; + _interaction = new Interaction({ pointerType: pointerType }); } matches.push([event, _interaction]); @@ -1244,20 +1249,20 @@ function doOnInteractions(method) { } for (var _iterator = matches, _isArray = Array.isArray(_iterator), _i3 = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { - var _ref; + var _ref2; if (_isArray) { if (_i3 >= _iterator.length) break; - _ref = _iterator[_i3++]; + _ref2 = _iterator[_i3++]; } else { _i3 = _iterator.next(); if (_i3.done) break; - _ref = _i3.value; + _ref2 = _i3.value; } - var _ref2 = _ref, - _pointer = _ref2[0], - _interaction2 = _ref2[1]; + var _ref3 = _ref2, + _pointer = _ref3[0], + _interaction2 = _ref3[1]; _interaction2._updateEventTargets(eventTarget, curEventTarget); _interaction2[method](_pointer, event, eventTarget, curEventTarget); @@ -1277,7 +1282,7 @@ function endAll(event) { var docEvents = {/* 'eventType': listenerFunc */}; var pEventTypes = browser.pEventTypes; -if (scope.PointerEvent) { +if (domObjects.PointerEvent) { docEvents[pEventTypes.down] = listeners.pointerDown; docEvents[pEventTypes.move] = listeners.pointerMove; docEvents[pEventTypes.up] = listeners.pointerUp; @@ -1295,8 +1300,8 @@ if (scope.PointerEvent) { docEvents.blur = endAll; -function onDocSignal(_ref3, signalName) { - var doc = _ref3.doc; +function onDocSignal(_ref4, signalName) { + var doc = _ref4.doc; var eventMethod = signalName.indexOf('add') === 0 ? events.add : events.remove; @@ -1311,14 +1316,14 @@ function onDocSignal(_ref3, signalName) { } } -signals.on('update-pointer-down', function (_ref4) { - var interaction = _ref4.interaction, - pointer = _ref4.pointer, - pointerId = _ref4.pointerId, - pointerIndex = _ref4.pointerIndex, - event = _ref4.event, - eventTarget = _ref4.eventTarget, - down = _ref4.down; +signals.on('update-pointer-down', function (_ref5) { + var interaction = _ref5.interaction, + pointer = _ref5.pointer, + pointerId = _ref5.pointerId, + pointerIndex = _ref5.pointerIndex, + event = _ref5.event, + eventTarget = _ref5.eventTarget, + down = _ref5.down; interaction.pointerIds[pointerIndex] = pointerId; interaction.pointers[pointerIndex] = pointer; @@ -1355,7 +1360,7 @@ scope.endAllInteractions = endAll; module.exports = Interaction; -},{"./scope":34,"./utils":44,"./utils/Signals":35,"./utils/browser":37,"./utils/events":40,"./utils/interactionFinder":45}],6:[function(require,module,exports){ +},{"./scope":34,"./utils":44,"./utils/Signals":35,"./utils/browser":37,"./utils/domObjects":38,"./utils/events":40,"./utils/interactionFinder":45}],6:[function(require,module,exports){ 'use strict'; var Interaction = require('../Interaction'); @@ -5460,7 +5465,7 @@ module.exports = function () { this.originalEvent = event; this.type = type; this.pointerId = pointerUtils.getPointerId(pointer); - this.pointerType = pointerUtils.getPointerType(pointer, interaction); + this.pointerType = pointerUtils.getPointerType(pointer); this.target = eventTarget; this.currentTarget = null; @@ -5758,8 +5763,10 @@ Interaction.signals.on('down', function (_ref6) { timer.duration = minDuration; timer.timeout = setTimeout(function () { fire({ - interaction: interaction, eventCopy: eventCopy, eventTarget: eventTarget, + interaction: interaction, + eventTarget: eventTarget, pointer: browser.isIE8 ? eventCopy : pointer, + event: eventCopy, type: 'hold' }); }, minDuration); @@ -6946,17 +6953,14 @@ module.exports = utils; var scope = require('../scope'); var utils = require('./index'); -var browser = require('./browser'); var finder = { - methodOrder: ['simulationResume', 'mouse', 'hasPointer', 'idle'], + methodOrder: ['simulationResume', 'mouseOrPen', 'hasPointer', 'idle'], search: function search(pointer, eventType, eventTarget) { - var mouseEvent = /mouse/i.test(pointer.pointerType || eventType) - // MSPointerEvent.MSPOINTER_TYPE_MOUSE - || pointer.pointerType === 4; + var pointerType = utils.getPointerType(pointer); var pointerId = utils.getPointerId(pointer); - var details = { pointer: pointer, pointerId: pointerId, mouseEvent: mouseEvent, eventType: eventType, eventTarget: eventTarget }; + var details = { pointer: pointer, pointerId: pointerId, pointerType: pointerType, eventType: eventType, eventTarget: eventTarget }; for (var _iterator = finder.methodOrder, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { var _ref; @@ -6982,7 +6986,7 @@ var finder = { // try to resume simulation with a new pointer simulationResume: function simulationResume(_ref2) { - var mouseEvent = _ref2.mouseEvent, + var pointerType = _ref2.pointerType, eventType = _ref2.eventType, eventTarget = _ref2.eventTarget; @@ -7006,7 +7010,7 @@ var finder = { var element = eventTarget; - if (interaction.simulation && interaction.simulation.allowResume && interaction.mouse === mouseEvent) { + if (interaction.simulation && interaction.simulation.allowResume && interaction.pointerType === pointerType) { while (element) { // if the element is the interaction element if (element === interaction.element) { @@ -7020,13 +7024,13 @@ var finder = { return null; }, - // if it's a mouse interaction - mouse: function mouse(_ref4) { + // if it's a mouse or pen interaction + mouseOrPen: function mouseOrPen(_ref4) { var pointerId = _ref4.pointerId, - mouseEvent = _ref4.mouseEvent, + pointerType = _ref4.pointerType, eventType = _ref4.eventType; - if (!mouseEvent && (browser.supportsTouch || browser.supportsPointerEvent)) { + if (pointerType !== 'mouse' && pointerType !== 'pen') { return null; } @@ -7046,7 +7050,7 @@ var finder = { var interaction = _ref5; - if (interaction.mouse) { + if (interaction.pointerType === pointerType) { // if it's a down event, skip interactions with running simulations if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; @@ -7069,8 +7073,8 @@ var finder = { return firstNonActive; } - // Find any interaction specifically for mouse. - // ignore the interaction if the eventType is a mousedown, and a simulation + // find any mouse or pen interaction. + // ignore the interaction if the eventType is a *down, and a simulation // is active for (var _iterator4 = scope.interactions, _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) { var _ref6; @@ -7086,7 +7090,7 @@ var finder = { var _interaction = _ref6; - if (_interaction.mouse && !(/down/.test(eventType) && _interaction.simulation)) { + if (_interaction.pointerType === pointerType && !(/down/i.test(eventType) && _interaction.simulation)) { return _interaction; } } @@ -7118,9 +7122,9 @@ var finder = { } }, - // get first idle interaction + // get first idle interaction with a matching pointerType idle: function idle(_ref9) { - var mouseEvent = _ref9.mouseEvent; + var pointerType = _ref9.pointerType; for (var _iterator6 = scope.interactions, _isArray6 = Array.isArray(_iterator6), _i6 = 0, _iterator6 = _isArray6 ? _iterator6 : _iterator6[Symbol.iterator]();;) { var _ref10; @@ -7150,7 +7154,7 @@ var finder = { continue; } - if (!interaction.interacting() && mouseEvent === interaction.mouse) { + if (!interaction.interacting() && pointerType === interaction.pointerType) { return interaction; } } @@ -7161,7 +7165,7 @@ var finder = { module.exports = finder; -},{"../scope":34,"./browser":37,"./index":44}],46:[function(require,module,exports){ +},{"../scope":34,"./index":44}],46:[function(require,module,exports){ 'use strict'; var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; @@ -7262,6 +7266,7 @@ var hypot = require('./hypot'); var browser = require('./browser'); var dom = require('./domObjects'); var domUtils = require('./domUtils'); +var domObjects = require('./domObjects'); var is = require('./is'); var pointerExtend = require('./pointerExtend'); @@ -7468,17 +7473,11 @@ var pointerUtils = { return angle; }, - getPointerType: function getPointerType(pointer, interaction) { - // if the PointerEvent API isn't available, then the pointer must be ither - // a MouseEvent or TouchEvent - if (interaction.mouse) { - return 'mouse'; - } - if (!browser.supportsPointerEvent) { - return 'touch'; - } - - return is.string(pointer.pointerType) ? pointer.pointerType : [undefined, undefined, 'touch', 'pen', 'mouse'][pointer.pointerType]; + getPointerType: function getPointerType(pointer) { + return is.string(pointer.pointerType) ? pointer.pointerType : is.number(pointer.pointerType) ? [undefined, undefined, 'touch', 'pen', 'mouse'][pointer.pointerType] + // if the PointerEvent API isn't available, then the "pointer" must + // be either a MouseEvent, TouchEvent, or Touch object + : /touch/.test(pointer.type) || pointer instanceof domObjects.Touch ? 'touch' : 'mouse'; }, // [ event.target, event.currentTarget ] diff --git a/dist/interact.js.map b/dist/interact.js.map index 60832b766..4f3a62ba8 100644 --- a/dist/interact.js.map +++ b/dist/interact.js.map @@ -1 +1 @@ -{"version":3,"sources":["src/header.js","node_modules/browser-pack/_prelude.js","index.js","src/Eventable.js","src/InteractEvent.js","src/Interactable.js","src/Interaction.js","src/actions/base.js","src/actions/drag.js","src/actions/drop.js","src/actions/gesture.js","src/actions/resize.js","src/autoScroll.js","src/autoStart/InteractableMethods.js","src/autoStart/base.js","src/autoStart/delay.js","src/autoStart/drag.js","src/autoStart/gesture.js","src/autoStart/resize.js","src/defaultOptions.js","src/index.js","src/inertia.js","src/interact.js","src/interactablePreventDefault.js","src/legacyBrowsers.js","src/modifiers/index.js","src/modifiers/restrict.js","src/modifiers/restrictEdges.js","src/modifiers/restrictSize.js","src/modifiers/snap.js","src/modifiers/snapSize.js","src/pointerEvents/PointerEvent.js","src/pointerEvents/base.js","src/pointerEvents/holdRepeat.js","src/pointerEvents/interactableTargets.js","src/scope.js","src/utils/Signals.js","src/utils/arr.js","src/utils/browser.js","src/utils/domObjects.js","src/utils/domUtils.js","src/utils/events.js","src/utils/extend.js","src/utils/getOriginXY.js","src/utils/hypot.js","src/utils/index.js","src/utils/interactionFinder.js","src/utils/is.js","src/utils/isWindow.js","src/utils/pointerExtend.js","src/utils/pointerUtils.js","src/utils/raf.js","src/utils/rect.js","src/utils/window.js"],"names":[],"mappings":"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","file":"interact.js","sourceRoot":"","sourcesContent":["/**\n * interact.js v1.3.0-alpha.3+sha.9595c40\n *\n * Copyright (c) 2012-2017 Taye Adeyemi \n * Open source under the MIT License.\n * https://raw.github.com/taye/interact.js/master/LICENSE\n */\n","(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o 150) {\n return null;\n }\n\n let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI;\n const overlap = 22.5;\n\n if (angle < 0) {\n angle += 360;\n }\n\n const left = 135 - overlap <= angle && angle < 225 + overlap;\n const up = 225 - overlap <= angle && angle < 315 + overlap;\n\n const right = !left && (315 - overlap <= angle || angle < 45 + overlap);\n const down = !up && 45 - overlap <= angle && angle < 135 + overlap;\n\n return {\n up,\n down,\n left,\n right,\n angle,\n speed: interaction.prevEvent.speed,\n velocity: {\n x: interaction.prevEvent.velocityX,\n y: interaction.prevEvent.velocityY,\n },\n };\n }\n\n preventDefault () {}\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n}\n\nsignals.on('set-delta', function ({ iEvent, interaction, starting, deltaSource }) {\n const prevEvent = starting? iEvent : interaction.prevEvent;\n\n if (deltaSource === 'client') {\n iEvent.dx = iEvent.clientX - prevEvent.clientX;\n iEvent.dy = iEvent.clientY - prevEvent.clientY;\n }\n else {\n iEvent.dx = iEvent.pageX - prevEvent.pageX;\n iEvent.dy = iEvent.pageY - prevEvent.pageY;\n }\n});\n\nInteractEvent.signals = signals;\n\nmodule.exports = InteractEvent;\n","const is = require('./utils/is');\nconst events = require('./utils/events');\nconst extend = require('./utils/extend');\nconst actions = require('./actions/base');\nconst scope = require('./scope');\nconst Eventable = require('./Eventable');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nconst {\n getElementRect,\n nodeContains,\n trySelector,\n} = require('./utils/domUtils');\nconst { getWindow } = require('./utils/window');\nconst { indexOf, contains } = require('./utils/arr');\nconst { wheelEvent } = require('./utils/browser');\n\n// all set interactables\nscope.interactables = [];\n\n/*\\\n * Interactable\n [ property ]\n **\n * Object type returned by @interact\n\\*/\nclass Interactable {\n constructor (target, options) {\n options = options || {};\n\n this.target = target;\n this.events = new Eventable();\n this._context = options.context || scope.document;\n this._win = getWindow(trySelector(target)? this._context : target);\n this._doc = this._win.document;\n\n signals.fire('new', {\n target,\n options,\n interactable: this,\n win: this._win,\n });\n\n scope.addDocument( this._doc, this._win );\n\n scope.interactables.push(this);\n\n this.set(options);\n }\n\n setOnEvents (action, phases) {\n const onAction = 'on' + action;\n\n if (is.function(phases.onstart) ) { this.events[onAction + 'start' ] = phases.onstart ; }\n if (is.function(phases.onmove) ) { this.events[onAction + 'move' ] = phases.onmove ; }\n if (is.function(phases.onend) ) { this.events[onAction + 'end' ] = phases.onend ; }\n if (is.function(phases.oninertiastart)) { this.events[onAction + 'inertiastart' ] = phases.oninertiastart ; }\n\n return this;\n }\n\n setPerAction (action, options) {\n // for all the default per-action options\n for (const option in options) {\n // if this option exists for this action\n if (option in defaults[action]) {\n // if the option in the options arg is an object value\n if (is.object(options[option])) {\n // duplicate the object\n this.options[action][option] = extend(this.options[action][option] || {}, options[option]);\n\n if (is.object(defaults.perAction[option]) && 'enabled' in defaults.perAction[option]) {\n this.options[action][option].enabled = options[option].enabled === false? false : true;\n }\n }\n else if (is.bool(options[option]) && is.object(defaults.perAction[option])) {\n this.options[action][option].enabled = options[option];\n }\n else if (options[option] !== undefined) {\n // or if it's not undefined, do a plain assignment\n this.options[action][option] = options[option];\n }\n }\n }\n }\n\n /*\\\n * Interactable.getRect\n [ method ]\n *\n * The default function to get an Interactables bounding rect. Can be\n * overridden using @Interactable.rectChecker.\n *\n - element (Element) #optional The element to measure.\n = (object) The object's bounding rectangle.\n o {\n o top : 0,\n o left : 0,\n o bottom: 0,\n o right : 0,\n o width : 0,\n o height: 0\n o }\n \\*/\n getRect (element) {\n element = element || this.target;\n\n if (is.string(this.target) && !(is.element(element))) {\n element = this._context.querySelector(this.target);\n }\n\n return getElementRect(element);\n }\n\n /*\\\n * Interactable.rectChecker\n [ method ]\n *\n * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n - checker (function) #optional A function which returns this Interactable's bounding rectangle. See @Interactable.getRect\n = (function | object) The checker function or this Interactable\n \\*/\n rectChecker (checker) {\n if (is.function(checker)) {\n this.getRect = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.getRect;\n\n return this;\n }\n\n return this.getRect;\n }\n\n _backCompatOption (optionName, newValue) {\n if (trySelector(newValue) || is.object(newValue)) {\n this.options[optionName] = newValue;\n\n for (const action of actions.names) {\n this.options[action][optionName] = newValue;\n }\n\n return this;\n }\n\n return this.options[optionName];\n }\n\n /*\\\n * Interactable.origin\n [ method ]\n *\n * Gets or sets the origin of the Interactable's element. The x and y\n * of the origin will be subtracted from action event coordinates.\n *\n - origin (object | string) #optional An object eg. { x: 0, y: 0 } or string 'parent', 'self' or any CSS selector\n * OR\n - origin (Element) #optional An HTML or SVG Element whose rect will be used\n **\n = (object) The current origin or this Interactable\n \\*/\n origin (newValue) {\n return this._backCompatOption('origin', newValue);\n }\n\n /*\\\n * Interactable.deltaSource\n [ method ]\n *\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n - newValue (string) #optional Use 'client' if you will be scrolling while interacting; Use 'page' if you want autoScroll to work\n = (string | object) The current deltaSource or this Interactable\n \\*/\n deltaSource (newValue) {\n if (newValue === 'page' || newValue === 'client') {\n this.options.deltaSource = newValue;\n\n return this;\n }\n\n return this.options.deltaSource;\n }\n\n /*\\\n * Interactable.context\n [ method ]\n *\n * Gets the selector context Node of the Interactable. The default is `window.document`.\n *\n = (Node) The context Node of this Interactable\n **\n \\*/\n context () {\n return this._context;\n }\n\n inContext (element) {\n return (this._context === element.ownerDocument\n || nodeContains(this._context, element));\n }\n\n /*\\\n * Interactable.fire\n [ method ]\n *\n * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n - iEvent (InteractEvent) The InteractEvent object to be fired on this Interactable\n = (Interactable) this Interactable\n \\*/\n fire (iEvent) {\n this.events.fire(iEvent);\n\n return this;\n }\n\n _onOffMultiple (method, eventType, listener, options) {\n if (is.string(eventType) && eventType.search(' ') !== -1) {\n eventType = eventType.trim().split(/ +/);\n }\n\n if (is.array(eventType)) {\n for (let i = 0; i < eventType.length; i++) {\n this[method](eventType[i], listener, options);\n }\n\n return true;\n }\n\n if (is.object(eventType)) {\n for (const prop in eventType) {\n this[method](prop, eventType[prop], listener);\n }\n\n return true;\n }\n }\n\n /*\\\n * Interactable.on\n [ method ]\n *\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n - eventType (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) This Interactable\n \\*/\n on (eventType, listener, options) {\n if (this._onOffMultiple('on', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.on(eventType, listener);\n }\n // delegated event for selector\n else if (is.string(this.target)) {\n events.addDelegate(this.target, this._context, eventType, listener, options);\n }\n else {\n events.add(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.off\n [ method ]\n *\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n - eventType (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) This Interactable\n \\*/\n off (eventType, listener, options) {\n if (this._onOffMultiple('off', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n // if it is an action event type\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.off(eventType, listener);\n }\n // delegated event\n else if (is.string(this.target)) {\n events.removeDelegate(this.target, this._context, eventType, listener, options);\n }\n // remove listener from this Interatable's element\n else {\n events.remove(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.set\n [ method ]\n *\n * Reset the options of this Interactable\n - options (object) The new settings to apply\n = (object) This Interactable\n \\*/\n set (options) {\n if (!is.object(options)) {\n options = {};\n }\n\n this.options = extend({}, defaults.base);\n\n const perActions = extend({}, defaults.perAction);\n\n for (const actionName in actions.methodDict) {\n const methodName = actions.methodDict[actionName];\n\n this.options[actionName] = extend({}, defaults[actionName]);\n\n this.setPerAction(actionName, perActions);\n\n this[methodName](options[actionName]);\n }\n\n for (const setting of Interactable.settingsMethods) {\n this.options[setting] = defaults.base[setting];\n\n if (setting in options) {\n this[setting](options[setting]);\n }\n }\n\n signals.fire('set', {\n options,\n interactable: this,\n });\n\n return this;\n }\n\n /*\\\n * Interactable.unset\n [ method ]\n *\n * Remove this interactable from the list of interactables and remove\n * it's action capabilities and event listeners\n *\n = (object) @interact\n \\*/\n unset () {\n events.remove(this.target, 'all');\n\n if (is.string(this.target)) {\n // remove delegated events\n for (const type in events.delegatedEvents) {\n const delegated = events.delegatedEvents[type];\n\n if (delegated.selectors[0] === this.target\n && delegated.contexts[0] === this._context) {\n\n delegated.selectors.splice(0, 1);\n delegated.contexts .splice(0, 1);\n delegated.listeners.splice(0, 1);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegated[type] = null;\n }\n }\n\n events.remove(this._context, type, events.delegateListener);\n events.remove(this._context, type, events.delegateUseCapture, true);\n }\n }\n else {\n events.remove(this, 'all');\n }\n\n signals.fire('unset', { interactable: this });\n\n scope.interactables.splice(indexOf(scope.interactables, this), 1);\n\n // Stop related interactions when an Interactable is unset\n for (const interaction of scope.interactions || []) {\n if (interaction.target === this && interaction.interacting()) {\n interaction.stop();\n }\n }\n\n return scope.interact;\n }\n}\n\nscope.interactables.indexOfElement = function indexOfElement (target, context) {\n context = context || scope.document;\n\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n if (interactable.target === target && interactable._context === context) {\n return i;\n }\n }\n return -1;\n};\n\nscope.interactables.get = function interactableGet (element, options, dontCheckInContext) {\n const ret = this[this.indexOfElement(element, options && options.context)];\n\n return ret && (is.string(element) || dontCheckInContext || ret.inContext(element))? ret : null;\n};\n\nscope.interactables.forEachSelector = function (callback, element) {\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n // skip non CSS selector targets and out of context elements\n if (!is.string(interactable.target)\n || (element && !interactable.inContext(element))) {\n continue;\n }\n\n const ret = callback(interactable, interactable.target, interactable._context, i, this);\n\n if (ret !== undefined) {\n return ret;\n }\n }\n};\n\n// all interact.js eventTypes\nInteractable.eventTypes = scope.eventTypes = [];\n\nInteractable.signals = signals;\n\nInteractable.settingsMethods = [ 'deltaSource', 'origin', 'preventDefault', 'rectChecker' ];\n\nmodule.exports = Interactable;\n","const scope = require('./scope');\nconst utils = require('./utils');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst finder = require('./utils/interactionFinder');\nconst signals = require('./utils/Signals').new();\n\nconst listeners = {};\nconst methodNames = [\n 'pointerDown', 'pointerMove', 'pointerUp',\n 'updatePointer', 'removePointer',\n];\n\n// for ignoring browser's simulated mouse events\nlet prevTouchTime = 0;\n\n// all active and idle interactions\nscope.interactions = [];\n\nclass Interaction {\n constructor () {\n this.target = null; // current interactable being interacted with\n this.element = null; // the target element of the interactable\n\n this.prepared = { // action that's ready to be fired on next move event\n name : null,\n axis : null,\n edges: null,\n };\n\n // keep track of added pointers\n this.pointers = [];\n this.pointerIds = [];\n this.downTargets = [];\n this.downTimes = [];\n\n // Previous native pointer move event coordinates\n this.prevCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n // current native pointer move event coordinates\n this.curCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Starting InteractEvent pointer coordinates\n this.startCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Change in coordinates and time of the pointer\n this.pointerDelta = {\n page : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n client : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n timeStamp: 0,\n };\n\n this.downEvent = null; // pointerdown/mousedown/touchstart event\n this.downPointer = {};\n\n this._eventTarget = null;\n this._curEventTarget = null;\n\n this.prevEvent = null; // previous action event\n\n this.pointerIsDown = false;\n this.pointerWasMoved = false;\n this._interacting = false;\n\n this.mouse = false;\n\n signals.fire('new', this);\n\n scope.interactions.push(this);\n }\n\n pointerDown (pointer, event, eventTarget) {\n const pointerIndex = this.updatePointer(pointer, event, true);\n\n signals.fire('down', {\n pointer,\n event,\n eventTarget,\n pointerIndex,\n interaction: this,\n });\n }\n\n /*\\\n * Interaction.start\n [ method ]\n *\n * Start an action with the given Interactable and Element as tartgets. The\n * action must be enabled for the target Interactable and an appropriate number\n * of pointers must be held down - 1 for drag/resize, 2 for gesture.\n *\n * Use it with `interactable.able({ manualStart: false })` to always\n * [start actions manually](https://github.com/taye/interact.js/issues/114)\n *\n - action (object) The action to be performed - drag, resize, etc.\n - target (Interactable) The Interactable to target\n - element (Element) The DOM Element to target\n = (object) interact\n **\n | interact(target)\n | .draggable({\n | // disable the default drag start by down->move\n | manualStart: true\n | })\n | // start dragging after the user holds the pointer down\n | .on('hold', function (event) {\n | var interaction = event.interaction;\n |\n | if (!interaction.interacting()) {\n | interaction.start({ name: 'drag' },\n | event.interactable,\n | event.currentTarget);\n | }\n | });\n \\*/\n start (action, target, element) {\n if (this.interacting()\n || !this.pointerIsDown\n || this.pointerIds.length < (action.name === 'gesture'? 2 : 1)) {\n return;\n }\n\n // if this interaction had been removed after stopping\n // add it back\n if (utils.indexOf(scope.interactions, this) === -1) {\n scope.interactions.push(this);\n }\n\n utils.copyAction(this.prepared, action);\n this.target = target;\n this.element = element;\n\n signals.fire('action-start', {\n interaction: this,\n event: this.downEvent,\n });\n }\n\n pointerMove (pointer, event, eventTarget) {\n if (!this.simulation) {\n this.updatePointer(pointer);\n utils.setCoords(this.curCoords, this.pointers);\n }\n\n const duplicateMove = (this.curCoords.page.x === this.prevCoords.page.x\n && this.curCoords.page.y === this.prevCoords.page.y\n && this.curCoords.client.x === this.prevCoords.client.x\n && this.curCoords.client.y === this.prevCoords.client.y);\n\n let dx;\n let dy;\n\n // register movement greater than pointerMoveTolerance\n if (this.pointerIsDown && !this.pointerWasMoved) {\n dx = this.curCoords.client.x - this.startCoords.client.x;\n dy = this.curCoords.client.y - this.startCoords.client.y;\n\n this.pointerWasMoved = utils.hypot(dx, dy) > Interaction.pointerMoveTolerance;\n }\n\n const signalArg = {\n pointer,\n pointerIndex: this.getPointerIndex(pointer),\n event,\n eventTarget,\n dx,\n dy,\n duplicate: duplicateMove,\n interaction: this,\n interactingBeforeMove: this.interacting(),\n };\n\n if (!duplicateMove) {\n // set pointer coordinate, time changes and speeds\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n }\n\n signals.fire('move', signalArg);\n\n if (!duplicateMove) {\n // if interacting, fire an 'action-move' signal etc\n if (this.interacting()) {\n this.doMove(signalArg);\n }\n\n if (this.pointerWasMoved) {\n utils.copyCoords(this.prevCoords, this.curCoords);\n }\n }\n }\n\n /*\\\n * Interaction.doMove\n [ method ]\n *\n * Force a move of the current action at the same coordinates. Useful if\n * snap/restrict has been changed and you want a movement with the new\n * settings.\n *\n **\n | interact(target)\n | .draggable(true)\n | .on('dragmove', function (event) {\n | if (someCondition) {\n | // change the snap settings\n | event.interactable.draggable({ snap: { targets: [] }});\n | // fire another move event with re-calculated snap\n | event.interaction.doMove();\n | }\n | });\n \\*/\n doMove (signalArg) {\n signalArg = utils.extend({\n pointer: this.pointers[0],\n event: this.prevEvent,\n eventTarget: this._eventTarget,\n interaction: this,\n }, signalArg || {});\n\n signals.fire('before-action-move', signalArg);\n\n if (!this._dontFireMove) {\n signals.fire('action-move', signalArg);\n }\n\n this._dontFireMove = false;\n }\n\n // End interact move events and stop auto-scroll unless simulation is running\n pointerUp (pointer, event, eventTarget, curEventTarget) {\n const pointerIndex = this.getPointerIndex(pointer);\n\n signals.fire(/cancel$/i.test(event.type)? 'cancel' : 'up', {\n pointer,\n pointerIndex,\n event,\n eventTarget,\n curEventTarget,\n interaction: this,\n });\n\n if (!this.simulation) {\n this.end(event);\n }\n\n this.pointerIsDown = false;\n this.removePointer(pointer, event);\n }\n\n /*\\\n * Interaction.end\n [ method ]\n *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n - event (PointerEvent) #optional\n **\n | interact(target)\n | .draggable(true)\n | .on('move', function (event) {\n | if (event.pageX > 1000) {\n | // end the current action\n | event.interaction.end();\n | // stop all further listeners from being called\n | event.stopImmediatePropagation();\n | }\n | });\n \\*/\n end (event) {\n event = event || this.prevEvent;\n\n if (this.interacting()) {\n signals.fire('action-end', {\n event,\n interaction: this,\n });\n }\n\n this.stop();\n }\n\n currentAction () {\n return this._interacting? this.prepared.name: null;\n }\n\n interacting () {\n return this._interacting;\n }\n\n stop () {\n signals.fire('stop', { interaction: this });\n\n if (this._interacting) {\n signals.fire('stop-active', { interaction: this });\n signals.fire('stop-' + this.prepared.name, { interaction: this });\n }\n\n this.target = this.element = null;\n\n this._interacting = false;\n this.prepared.name = this.prevEvent = null;\n }\n\n getPointerIndex (pointer) {\n return utils.indexOf(this.pointerIds, utils.getPointerId(pointer));\n }\n\n updatePointer (pointer, event, down = event && /(down|start)$/i.test(event.type)) {\n const id = utils.getPointerId(pointer);\n let index = this.getPointerIndex(pointer);\n\n if (index === -1) {\n index = this.pointerIds.length;\n this.pointerIds[index] = id;\n }\n\n if (down) {\n signals.fire('update-pointer-down', {\n pointer,\n event,\n down,\n pointerId: id,\n pointerIndex: index,\n interaction: this,\n });\n }\n\n this.pointers[index] = pointer;\n\n return index;\n }\n\n removePointer (pointer, event) {\n const id = utils.getPointerId(pointer);\n const index = this.mouse? 0 : utils.indexOf(this.pointerIds, id);\n\n if (index === -1) { return; }\n\n signals.fire('remove-pointer', {\n pointer,\n event,\n pointerIndex: index,\n interaction: this,\n });\n\n this.pointers .splice(index, 1);\n this.pointerIds .splice(index, 1);\n this.downTargets.splice(index, 1);\n this.downTimes .splice(index, 1);\n }\n\n _updateEventTargets (target, currentTarget) {\n this._eventTarget = target;\n this._curEventTarget = currentTarget;\n }\n}\n\nfor (let i = 0, len = methodNames.length; i < len; i++) {\n const method = methodNames[i];\n\n listeners[method] = doOnInteractions(method);\n}\n\nfunction doOnInteractions (method) {\n return (function (event) {\n const [eventTarget, curEventTarget] = utils.getEventTargets(event);\n const matches = []; // [ [pointer, interaction], ...]\n\n if (browser.supportsTouch && /touch/.test(event.type)) {\n prevTouchTime = new Date().getTime();\n\n for (let i = 0; i < event.changedTouches.length; i++) {\n const pointer = event.changedTouches[i];\n const interaction = finder.search(pointer, event.type, eventTarget);\n\n matches.push([pointer, interaction || new Interaction()]);\n }\n }\n else {\n let invalidPointer = false;\n\n if (!browser.supportsPointerEvent && /mouse/.test(event.type)) {\n // ignore mouse events while touch interactions are active\n for (let i = 0; i < scope.interactions.length && !invalidPointer; i++) {\n invalidPointer = !scope.interactions[i].mouse && scope.interactions[i].pointerIsDown;\n }\n\n // try to ignore mouse events that are simulated by the browser\n // after a touch event\n invalidPointer = invalidPointer\n || (new Date().getTime() - prevTouchTime < 500)\n // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated\n || event.timeStamp === 0;\n }\n\n if (!invalidPointer) {\n let interaction = finder.search(event, event.type, eventTarget);\n\n if (!interaction) {\n\n interaction = new Interaction();\n interaction.mouse = (/mouse/i.test(event.pointerType || event.type)\n // MSPointerEvent.MSPOINTER_TYPE_MOUSE\n || event.pointerType === 4\n || !event.pointerType);\n }\n\n matches.push([event, interaction]);\n }\n }\n\n for (const [pointer, interaction] of matches) {\n interaction._updateEventTargets(eventTarget, curEventTarget);\n interaction[method](pointer, event, eventTarget, curEventTarget);\n }\n });\n}\n\nfunction endAll (event) {\n for (let i = 0; i < scope.interactions.length; i++) {\n const interaction = scope.interactions[i];\n\n interaction.end(event);\n signals.fire('endall', { event, interaction });\n }\n}\n\nconst docEvents = { /* 'eventType': listenerFunc */ };\nconst pEventTypes = browser.pEventTypes;\n\nif (scope.PointerEvent) {\n docEvents[pEventTypes.down ] = listeners.pointerDown;\n docEvents[pEventTypes.move ] = listeners.pointerMove;\n docEvents[pEventTypes.up ] = listeners.pointerUp;\n docEvents[pEventTypes.cancel] = listeners.pointerUp;\n}\nelse {\n docEvents.mousedown = listeners.pointerDown;\n docEvents.mousemove = listeners.pointerMove;\n docEvents.mouseup = listeners.pointerUp;\n\n docEvents.touchstart = listeners.pointerDown;\n docEvents.touchmove = listeners.pointerMove;\n docEvents.touchend = listeners.pointerUp;\n docEvents.touchcancel = listeners.pointerUp;\n}\n\ndocEvents.blur = endAll;\n\nfunction onDocSignal ({ doc }, signalName) {\n const eventMethod = signalName.indexOf('add') === 0\n ? events.add : events.remove;\n\n // delegate event listener\n for (const eventType in scope.delegatedEvents) {\n eventMethod(doc, eventType, events.delegateListener);\n eventMethod(doc, eventType, events.delegateUseCapture, true);\n }\n\n for (const eventType in docEvents) {\n eventMethod(doc, eventType, docEvents[eventType]);\n }\n}\n\nsignals.on('update-pointer-down', ({ interaction, pointer, pointerId, pointerIndex, event, eventTarget, down }) => {\n interaction.pointerIds[pointerIndex] = pointerId;\n interaction.pointers[pointerIndex] = pointer;\n\n if (down) {\n interaction.pointerIsDown = true;\n }\n\n if (!interaction.interacting()) {\n utils.setCoords(interaction.startCoords, interaction.pointers);\n\n utils.copyCoords(interaction.curCoords , interaction.startCoords);\n utils.copyCoords(interaction.prevCoords, interaction.startCoords);\n\n interaction.downEvent = event;\n interaction.downTimes[pointerIndex] = interaction.curCoords.timeStamp;\n interaction.downTargets[pointerIndex] = eventTarget || event && utils.getEventTargets(event)[0];\n interaction.pointerWasMoved = false;\n\n utils.pointerExtend(interaction.downPointer, pointer);\n }\n});\n\nscope.signals.on('add-document' , onDocSignal);\nscope.signals.on('remove-document', onDocSignal);\n\nInteraction.pointerMoveTolerance = 1;\nInteraction.doOnInteractions = doOnInteractions;\nInteraction.endAll = endAll;\nInteraction.signals = signals;\nInteraction.docEvents = docEvents;\n\nscope.endAllInteractions = endAll;\n\nmodule.exports = Interaction;\n","const Interaction = require('../Interaction');\nconst InteractEvent = require('../InteractEvent');\n\nconst actions = {\n firePrepared,\n names: [],\n methodDict: {},\n};\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n interaction._interacting = true;\n firePrepared(interaction, event, 'start');\n});\n\nInteraction.signals.on('action-move', function ({ interaction, event, preEnd }) {\n firePrepared(interaction, event, 'move', preEnd);\n\n // if the action was ended in a listener\n if (!interaction.interacting()) { return false; }\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n firePrepared(interaction, event, 'end');\n});\n\nfunction firePrepared (interaction, event, phase, preEnd) {\n const actionName = interaction.prepared.name;\n\n const newEvent = new InteractEvent(interaction, event, actionName, phase, interaction.element, null, preEnd);\n\n interaction.target.fire(newEvent);\n interaction.prevEvent = newEvent;\n}\n\nmodule.exports = actions;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drag = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n startAxis : 'xy',\n lockAxis : 'xy',\n },\n\n checker: function (pointer, event, interactable) {\n const dragOptions = interactable.options.drag;\n\n return dragOptions.enabled\n ? { name: 'drag', axis: (dragOptions.lockAxis === 'start'\n ? dragOptions.startAxis\n : dragOptions.lockAxis)}\n : null;\n },\n\n getCursor: function () {\n return 'move';\n },\n};\n\nInteraction.signals.on('before-action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n interaction.curCoords.page.y = interaction.startCoords.page.y;\n interaction.curCoords.client.y = interaction.startCoords.client.y;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vx);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vx);\n interaction.pointerDelta.client.vy = 0;\n interaction.pointerDelta.page.vy = 0;\n }\n else if (axis === 'y') {\n interaction.curCoords.page.x = interaction.startCoords.page.x;\n interaction.curCoords.client.x = interaction.startCoords.client.x;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vy);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vy);\n interaction.pointerDelta.client.vx = 0;\n interaction.pointerDelta.page.vx = 0;\n }\n});\n\n// dragmove\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'dragmove') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n iEvent.pageY = interaction.startCoords.page.y;\n iEvent.clientY = interaction.startCoords.client.y;\n iEvent.dy = 0;\n }\n else if (axis === 'y') {\n iEvent.pageX = interaction.startCoords.page.x;\n iEvent.clientX = interaction.startCoords.client.x;\n iEvent.dx = 0;\n }\n});\n\n/*\\\n * Interactable.draggable\n [ method ]\n *\n * Gets or sets whether drag actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of drag events\n | var isDraggable = interact('ul li').draggable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on drag events (object makes the Interactable draggable)\n = (object) This Interactable\n | interact(element).draggable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // the axis in which the first movement must be\n | // for the drag sequence to start\n | // 'xy' by default - any direction\n | startAxis: 'x' || 'y' || 'xy',\n |\n | // 'xy' by default - don't restrict to one axis (move in any direction)\n | // 'x' or 'y' to restrict movement to either axis\n | // 'start' to restrict movement to the axis the drag started in\n | lockAxis: 'x' || 'y' || 'xy' || 'start',\n |\n | // max number of drags that can happen concurrently\n | // with elements of this Interactable. Infinity by default\n | max: Infinity,\n |\n | // max number of drags that can target the same element+Interactable\n | // 1 by default\n | maxPerElement: 2\n | });\n\\*/\nInteractable.prototype.draggable = function (options) {\n if (utils.is.object(options)) {\n this.options.drag.enabled = options.enabled === false? false: true;\n this.setPerAction('drag', options);\n this.setOnEvents('drag', options);\n\n if (/^(xy|x|y|start)$/.test(options.lockAxis)) {\n this.options.drag.lockAxis = options.lockAxis;\n }\n if (/^(xy|x|y)$/.test(options.startAxis)) {\n this.options.drag.startAxis = options.startAxis;\n }\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drag.enabled = options;\n\n if (!options) {\n this.ondragstart = this.ondragstart = this.ondragend = null;\n }\n\n return this;\n }\n\n return this.options.drag;\n};\n\nactions.drag = drag;\nactions.names.push('drag');\nutils.merge(Interactable.eventTypes, [\n 'dragstart',\n 'dragmove',\n 'draginertiastart',\n 'draginertiaresume',\n 'dragend',\n]);\nactions.methodDict.drag = 'draggable';\n\ndefaultOptions.drag = drag.defaults;\n\nmodule.exports = drag;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst scope = require('../scope');\nconst interact = require('../interact');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drop = {\n defaults: {\n enabled: false,\n accept : null,\n overlap: 'pointer',\n },\n};\n\nlet dynamicDrop = false;\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // reset active dropzones\n interaction.activeDrops.dropzones = [];\n interaction.activeDrops.elements = [];\n interaction.activeDrops.rects = [];\n\n interaction.dropEvents = null;\n\n if (!interaction.dynamicDrop) {\n setActiveDrops(interaction, interaction.element);\n }\n\n const dragEvent = interaction.prevEvent;\n const dropEvents = getDropEvents(interaction, event, dragEvent);\n\n if (dropEvents.activate) {\n fireActiveDrops(interaction, dropEvents.activate);\n }\n});\n\nInteractEvent.signals.on('new', function ({ interaction, iEvent, event }) {\n if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { return; }\n\n const draggableElement = interaction.element;\n const dragEvent = iEvent;\n const dropResult = getDrop(dragEvent, event, draggableElement);\n\n interaction.dropTarget = dropResult.dropzone;\n interaction.dropElement = dropResult.element;\n\n interaction.dropEvents = getDropEvents(interaction, event, dragEvent);\n});\n\nInteraction.signals.on('action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n fireDropEvents(interaction, interaction.dropEvents);\n});\n\nInteraction.signals.on('action-end', function ({ interaction }) {\n if (interaction.prepared.name === 'drag') {\n fireDropEvents(interaction, interaction.dropEvents);\n }\n});\n\nInteraction.signals.on('stop-drag', function ({ interaction }) {\n interaction.activeDrops.dropzones =\n interaction.activeDrops.elements =\n interaction.activeDrops.rects =\n interaction.dropEvents = null;\n});\n\nfunction collectDrops (interaction, element) {\n const drops = [];\n const elements = [];\n\n element = element || interaction.element;\n\n // collect all dropzones and their elements which qualify for a drop\n for (const current of scope.interactables) {\n if (!current.options.drop.enabled) { continue; }\n\n const accept = current.options.drop.accept;\n\n // test the draggable element against the dropzone's accept setting\n if ((utils.is.element(accept) && accept !== element)\n || (utils.is.string(accept)\n && !utils.matchesSelector(element, accept))) {\n\n continue;\n }\n\n // query for new elements if necessary\n const dropElements = utils.is.string(current.target)\n ? current._context.querySelectorAll(current.target)\n : [current.target];\n\n for (let i = 0; i < dropElements.length; i++) {\n const currentElement = dropElements[i];\n\n if (currentElement !== element) {\n drops.push(current);\n elements.push(currentElement);\n }\n }\n }\n\n return {\n elements,\n dropzones: drops,\n };\n}\n\nfunction fireActiveDrops (interaction, event) {\n let prevElement;\n\n // loop through all active dropzones and trigger event\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n const current = interaction.activeDrops.dropzones[i];\n const currentElement = interaction.activeDrops.elements [i];\n\n // prevent trigger of duplicate events on same element\n if (currentElement !== prevElement) {\n // set current element as event target\n event.target = currentElement;\n current.fire(event);\n }\n prevElement = currentElement;\n }\n}\n\n// Collect a new set of possible drops and save them in activeDrops.\n// setActiveDrops should always be called when a drag has just started or a\n// drag event happens while dynamicDrop is true\nfunction setActiveDrops (interaction, dragElement) {\n // get dropzones and their elements that could receive the draggable\n const possibleDrops = collectDrops(interaction, dragElement, true);\n\n interaction.activeDrops.dropzones = possibleDrops.dropzones;\n interaction.activeDrops.elements = possibleDrops.elements;\n interaction.activeDrops.rects = [];\n\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n interaction.activeDrops.rects[i] =\n interaction.activeDrops.dropzones[i].getRect(interaction.activeDrops.elements[i]);\n }\n}\n\nfunction getDrop (dragEvent, event, dragElement) {\n const interaction = dragEvent.interaction;\n const validDrops = [];\n\n if (dynamicDrop) {\n setActiveDrops(interaction, dragElement);\n }\n\n // collect all dropzones and their elements which qualify for a drop\n for (let j = 0; j < interaction.activeDrops.dropzones.length; j++) {\n const current = interaction.activeDrops.dropzones[j];\n const currentElement = interaction.activeDrops.elements [j];\n const rect = interaction.activeDrops.rects [j];\n\n validDrops.push(current.dropCheck(dragEvent, event, interaction.target, dragElement, currentElement, rect)\n ? currentElement\n : null);\n }\n\n // get the most appropriate dropzone based on DOM depth and order\n const dropIndex = utils.indexOfDeepestElement(validDrops);\n\n return {\n dropzone: interaction.activeDrops.dropzones[dropIndex] || null,\n element : interaction.activeDrops.elements [dropIndex] || null,\n };\n}\n\nfunction getDropEvents (interaction, pointerEvent, dragEvent) {\n const dropEvents = {\n enter : null,\n leave : null,\n activate : null,\n deactivate: null,\n move : null,\n drop : null,\n };\n\n const tmpl = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n };\n\n if (interaction.dropElement !== interaction.prevDropElement) {\n // if there was a prevDropTarget, create a dragleave event\n if (interaction.prevDropTarget) {\n dropEvents.leave = utils.extend({ type: 'dragleave' }, tmpl);\n\n dragEvent.dragLeave = dropEvents.leave.target = interaction.prevDropElement;\n dragEvent.prevDropzone = dropEvents.leave.dropzone = interaction.prevDropTarget;\n }\n // if the dropTarget is not null, create a dragenter event\n if (interaction.dropTarget) {\n dropEvents.enter = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n type : 'dragenter',\n };\n\n dragEvent.dragEnter = interaction.dropElement;\n dragEvent.dropzone = interaction.dropTarget;\n }\n }\n\n if (dragEvent.type === 'dragend' && interaction.dropTarget) {\n dropEvents.drop = utils.extend({ type: 'drop' }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n dragEvent.relatedTarget = interaction.dropElement;\n }\n if (dragEvent.type === 'dragstart') {\n dropEvents.activate = utils.extend({ type: 'dropactivate' }, tmpl);\n\n dropEvents.activate.target = null;\n dropEvents.activate.dropzone = null;\n }\n if (dragEvent.type === 'dragend') {\n dropEvents.deactivate = utils.extend({ type: 'dropdeactivate' }, tmpl);\n\n dropEvents.deactivate.target = null;\n dropEvents.deactivate.dropzone = null;\n }\n if (dragEvent.type === 'dragmove' && interaction.dropTarget) {\n dropEvents.move = utils.extend({\n dragmove : dragEvent,\n type : 'dropmove',\n }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n }\n\n return dropEvents;\n}\n\nfunction fireDropEvents (interaction, dropEvents) {\n if (dropEvents.leave) { interaction.prevDropTarget.fire(dropEvents.leave); }\n if (dropEvents.move ) { interaction.dropTarget.fire(dropEvents.move ); }\n if (dropEvents.enter) { interaction.dropTarget.fire(dropEvents.enter); }\n if (dropEvents.drop ) { interaction.dropTarget.fire(dropEvents.drop ); }\n if (dropEvents.deactivate) {\n fireActiveDrops(interaction, dropEvents.deactivate);\n }\n\n interaction.prevDropTarget = interaction.dropTarget;\n interaction.prevDropElement = interaction.dropElement;\n}\n\n/*\\\n * Interactable.dropzone\n [ method ]\n *\n * Returns or sets whether elements can be dropped onto this\n * Interactable to trigger drop events\n *\n * Dropzones can receive the following events:\n * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends\n * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone\n * - `dragmove` when a draggable that has entered the dropzone is moved\n * - `drop` when a draggable is dropped into this dropzone\n *\n * Use the `accept` option to allow only elements that match the given CSS\n * selector or element. The value can be:\n *\n * - **an Element** - only that element can be dropped into this dropzone.\n * - **a string**, - the element being dragged must match it as a CSS selector.\n * - **`null`** - accept options is cleared - it accepts any element.\n *\n * Use the `overlap` option to set how drops are checked for. The allowed\n * values are:\n *\n * - `'pointer'`, the pointer must be over the dropzone (default)\n * - `'center'`, the draggable element's center must be over the dropzone\n * - a number from 0-1 which is the `(intersection area) / (draggable area)`.\n * e.g. `0.5` for drop to happen when half of the area of the draggable is\n * over the dropzone\n *\n * Use the `checker` option to specify a function to check if a dragged\n * element is over this Interactable.\n *\n | interact(target)\n | .dropChecker(function(dragEvent, // related dragmove or dragend event\n | event, // TouchEvent/PointerEvent/MouseEvent\n | dropped, // bool result of the default checker\n | dropzone, // dropzone Interactable\n | dropElement, // dropzone elemnt\n | draggable, // draggable Interactable\n | draggableElement) {// draggable element\n |\n | return dropped && event.target.hasAttribute('allow-drop');\n | }\n *\n *\n - options (boolean | object | null) #optional The new value to be set.\n | interact('.drop').dropzone({\n | accept: '.can-drop' || document.getElementById('single-drop'),\n | overlap: 'pointer' || 'center' || zeroToOne\n | }\n = (boolean | object) The current setting or this Interactable\n\\*/\nInteractable.prototype.dropzone = function (options) {\n if (utils.is.object(options)) {\n this.options.drop.enabled = options.enabled === false? false: true;\n\n if (utils.is.function(options.ondrop) ) { this.events.ondrop = options.ondrop ; }\n if (utils.is.function(options.ondropactivate) ) { this.events.ondropactivate = options.ondropactivate ; }\n if (utils.is.function(options.ondropdeactivate)) { this.events.ondropdeactivate = options.ondropdeactivate; }\n if (utils.is.function(options.ondragenter) ) { this.events.ondragenter = options.ondragenter ; }\n if (utils.is.function(options.ondragleave) ) { this.events.ondragleave = options.ondragleave ; }\n if (utils.is.function(options.ondropmove) ) { this.events.ondropmove = options.ondropmove ; }\n\n if (/^(pointer|center)$/.test(options.overlap)) {\n this.options.drop.overlap = options.overlap;\n }\n else if (utils.is.number(options.overlap)) {\n this.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0);\n }\n if ('accept' in options) {\n this.options.drop.accept = options.accept;\n }\n if ('checker' in options) {\n this.options.drop.checker = options.checker;\n }\n\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drop.enabled = options;\n\n if (!options) {\n this.ondragenter = this.ondragleave = this.ondrop\n = this.ondropactivate = this.ondropdeactivate = null;\n }\n\n return this;\n }\n\n return this.options.drop;\n};\n\nInteractable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) {\n let dropped = false;\n\n // if the dropzone has no rect (eg. display: none)\n // call the custom dropChecker or just return false\n if (!(rect = rect || this.getRect(dropElement))) {\n return (this.options.drop.checker\n ? this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement)\n : false);\n }\n\n const dropOverlap = this.options.drop.overlap;\n\n if (dropOverlap === 'pointer') {\n const origin = utils.getOriginXY(draggable, draggableElement, 'drag');\n const page = utils.getPageXY(dragEvent);\n\n page.x += origin.x;\n page.y += origin.y;\n\n const horizontal = (page.x > rect.left) && (page.x < rect.right);\n const vertical = (page.y > rect.top ) && (page.y < rect.bottom);\n\n dropped = horizontal && vertical;\n }\n\n const dragRect = draggable.getRect(draggableElement);\n\n if (dragRect && dropOverlap === 'center') {\n const cx = dragRect.left + dragRect.width / 2;\n const cy = dragRect.top + dragRect.height / 2;\n\n dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom;\n }\n\n if (dragRect && utils.is.number(dropOverlap)) {\n const overlapArea = (Math.max(0, Math.min(rect.right , dragRect.right ) - Math.max(rect.left, dragRect.left))\n * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top , dragRect.top )));\n\n const overlapRatio = overlapArea / (dragRect.width * dragRect.height);\n\n dropped = overlapRatio >= dropOverlap;\n }\n\n if (this.options.drop.checker) {\n dropped = this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement);\n }\n\n return dropped;\n};\n\nInteractable.signals.on('unset', function ({ interactable }) {\n interactable.dropzone(false);\n});\n\nInteractable.settingsMethods.push('dropChecker');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.dropTarget = null; // the dropzone a drag target might be dropped into\n interaction.dropElement = null; // the element at the time of checking\n interaction.prevDropTarget = null; // the dropzone that was recently dragged away from\n interaction.prevDropElement = null; // the element at the time of checking\n interaction.dropEvents = null; // the dropEvents related to the current drag event\n\n interaction.activeDrops = {\n dropzones: [], // the dropzones that are mentioned below\n elements : [], // elements of dropzones that accept the target draggable\n rects : [], // the rects of the elements mentioned above\n };\n\n});\n\nInteraction.signals.on('stop', function ({ interaction }) {\n interaction.dropTarget = interaction.dropElement =\n interaction.prevDropTarget = interaction.prevDropElement = null;\n});\n\n/*\\\n * interact.dynamicDrop\n [ method ]\n *\n * Returns or sets whether the dimensions of dropzone elements are\n * calculated on every dragmove or only on dragstart for the default\n * dropChecker\n *\n - newValue (boolean) #optional True to check on each move. False to check only before start\n = (boolean | interact) The current setting or interact\n\\*/\ninteract.dynamicDrop = function (newValue) {\n if (utils.is.bool(newValue)) {\n //if (dragging && dynamicDrop !== newValue && !newValue) {\n //calcRects(dropzones);\n //}\n\n dynamicDrop = newValue;\n\n return interact;\n }\n return dynamicDrop;\n};\n\nutils.merge(Interactable.eventTypes, [\n 'dragenter',\n 'dragleave',\n 'dropactivate',\n 'dropdeactivate',\n 'dropmove',\n 'drop',\n]);\nactions.methodDict.drop = 'dropzone';\n\ndefaultOptions.drop = drop.defaults;\n\nmodule.exports = drop;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst gesture = {\n defaults: {\n enabled : false,\n origin : null,\n restrict: null,\n },\n\n checker: function (pointer, event, interactable, element, interaction) {\n if (interaction.pointerIds.length >= 2) {\n return { name: 'gesture' };\n }\n\n return null;\n },\n\n getCursor: function () {\n return '';\n },\n};\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturestart') { return; }\n iEvent.ds = 0;\n\n interaction.gesture.startDistance = interaction.gesture.prevDistance = iEvent.distance;\n interaction.gesture.startAngle = interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.scale = 1;\n});\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturemove') { return; }\n\n iEvent.ds = iEvent.scale - interaction.gesture.scale;\n\n interaction.target.fire(iEvent);\n\n interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.prevDistance = iEvent.distance;\n\n if (iEvent.scale !== Infinity\n && iEvent.scale !== null\n && iEvent.scale !== undefined\n && !isNaN(iEvent.scale)) {\n\n interaction.gesture.scale = iEvent.scale;\n }\n});\n\n/*\\\n * Interactable.gesturable\n [ method ]\n *\n * Gets or sets whether multitouch gestures can be performed on the\n * Interactable's element\n *\n = (boolean) Indicates if this can be the target of gesture events\n | var isGestureable = interact(element).gesturable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on gesture events (makes the Interactable gesturable)\n = (object) this Interactable\n | interact(element).gesturable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // limit multiple gestures.\n | // See the explanation in @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n\\*/\nInteractable.prototype.gesturable = function (options) {\n if (utils.is.object(options)) {\n this.options.gesture.enabled = options.enabled === false? false: true;\n this.setPerAction('gesture', options);\n this.setOnEvents('gesture', options);\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.gesture.enabled = options;\n\n if (!options) {\n this.ongesturestart = this.ongesturestart = this.ongestureend = null;\n }\n\n return this;\n }\n\n return this.options.gesture;\n};\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action, event, starting, ending, deltaSource }) {\n if (action !== 'gesture') { return; }\n\n const pointers = interaction.pointers;\n\n iEvent.touches = [pointers[0], pointers[1]];\n\n if (starting) {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = 1;\n iEvent.ds = 0;\n iEvent.angle = utils.touchAngle(pointers, undefined, deltaSource);\n iEvent.da = 0;\n }\n else if (ending || event instanceof InteractEvent) {\n iEvent.distance = interaction.prevEvent.distance;\n iEvent.box = interaction.prevEvent.box;\n iEvent.scale = interaction.prevEvent.scale;\n iEvent.ds = iEvent.scale - 1;\n iEvent.angle = interaction.prevEvent.angle;\n iEvent.da = iEvent.angle - interaction.gesture.startAngle;\n }\n else {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = iEvent.distance / interaction.gesture.startDistance;\n iEvent.angle = utils.touchAngle(pointers, interaction.gesture.prevAngle, deltaSource);\n\n iEvent.ds = iEvent.scale - interaction.gesture.prevScale;\n iEvent.da = iEvent.angle - interaction.gesture.prevAngle;\n }\n});\n\nInteraction.signals.on('new', function (interaction) {\n interaction.gesture = {\n start: { x: 0, y: 0 },\n\n startDistance: 0, // distance between two touches of touchStart\n prevDistance : 0,\n distance : 0,\n\n scale: 1, // gesture.distance / gesture.startDistance\n\n startAngle: 0, // angle of line joining two touches\n prevAngle : 0, // angle of the previous gesture event\n };\n});\n\nactions.gesture = gesture;\nactions.names.push('gesture');\nutils.merge(Interactable.eventTypes, [\n 'gesturestart',\n 'gesturemove',\n 'gestureend',\n]);\nactions.methodDict.gesture = 'gesturable';\n\ndefaultOptions.gesture = gesture.defaults;\n\nmodule.exports = gesture;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\n// Less Precision with touch input\nconst defaultMargin = browser.supportsTouch || browser.supportsPointerEvent? 20: 10;\n\nconst resize = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n square: false,\n preserveAspectRatio: false,\n axis: 'xy',\n\n // use default margin\n margin: NaN,\n\n // object with props left, right, top, bottom which are\n // true/false values to resize when the pointer is over that edge,\n // CSS selectors to match the handles for each direction\n // or the Elements for each handle\n edges: null,\n\n // a value of 'none' will limit the resize rect to a minimum of 0x0\n // 'negate' will alow the rect to have negative width/height\n // 'reposition' will keep the width/height positive by swapping\n // the top and bottom edges and/or swapping the left and right edges\n invert: 'none',\n },\n\n checker: function (pointer, event, interactable, element, interaction, rect) {\n if (!rect) { return null; }\n\n const page = utils.extend({}, interaction.curCoords.page);\n const options = interactable.options;\n\n if (options.resize.enabled) {\n const resizeOptions = options.resize;\n const resizeEdges = { left: false, right: false, top: false, bottom: false };\n\n // if using resize.edges\n if (utils.is.object(resizeOptions.edges)) {\n for (const edge in resizeEdges) {\n resizeEdges[edge] = checkResizeEdge(edge,\n resizeOptions.edges[edge],\n page,\n interaction._eventTarget,\n element,\n rect,\n resizeOptions.margin || defaultMargin);\n }\n\n resizeEdges.left = resizeEdges.left && !resizeEdges.right;\n resizeEdges.top = resizeEdges.top && !resizeEdges.bottom;\n\n if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) {\n return {\n name: 'resize',\n edges: resizeEdges,\n };\n }\n }\n else {\n const right = options.resize.axis !== 'y' && page.x > (rect.right - defaultMargin);\n const bottom = options.resize.axis !== 'x' && page.y > (rect.bottom - defaultMargin);\n\n if (right || bottom) {\n return {\n name: 'resize',\n axes: (right? 'x' : '') + (bottom? 'y' : ''),\n };\n }\n }\n }\n\n return null;\n },\n\n cursors: (browser.isIe9OrOlder ? {\n x : 'e-resize',\n y : 's-resize',\n xy: 'se-resize',\n\n top : 'n-resize',\n left : 'w-resize',\n bottom : 's-resize',\n right : 'e-resize',\n topleft : 'se-resize',\n bottomright: 'se-resize',\n topright : 'ne-resize',\n bottomleft : 'ne-resize',\n } : {\n x : 'ew-resize',\n y : 'ns-resize',\n xy: 'nwse-resize',\n\n top : 'ns-resize',\n left : 'ew-resize',\n bottom : 'ns-resize',\n right : 'ew-resize',\n topleft : 'nwse-resize',\n bottomright: 'nwse-resize',\n topright : 'nesw-resize',\n bottomleft : 'nesw-resize',\n }),\n\n getCursor: function (action) {\n if (action.axis) {\n return resize.cursors[action.name + action.axis];\n }\n else if (action.edges) {\n let cursorKey = '';\n const edgeNames = ['top', 'bottom', 'left', 'right'];\n\n for (let i = 0; i < 4; i++) {\n if (action.edges[edgeNames[i]]) {\n cursorKey += edgeNames[i];\n }\n }\n\n return resize.cursors[cursorKey];\n }\n },\n};\n\n// resizestart\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'resizestart' || !interaction.prepared.edges) {\n return;\n }\n\n const startRect = interaction.target.getRect(interaction.element);\n const resizeOptions = interaction.target.options.resize;\n\n /*\n * When using the `resizable.square` or `resizable.preserveAspectRatio` options, resizing from one edge\n * will affect another. E.g. with `resizable.square`, resizing to make the right edge larger will make\n * the bottom edge larger by the same amount. We call these 'linked' edges. Any linked edges will depend\n * on the active edges and the edge being interacted with.\n */\n if (resizeOptions.square || resizeOptions.preserveAspectRatio) {\n const linkedEdges = utils.extend({}, interaction.prepared.edges);\n\n linkedEdges.top = linkedEdges.top || (linkedEdges.left && !linkedEdges.bottom);\n linkedEdges.left = linkedEdges.left || (linkedEdges.top && !linkedEdges.right );\n linkedEdges.bottom = linkedEdges.bottom || (linkedEdges.right && !linkedEdges.top );\n linkedEdges.right = linkedEdges.right || (linkedEdges.bottom && !linkedEdges.left );\n\n interaction.prepared._linkedEdges = linkedEdges;\n }\n else {\n interaction.prepared._linkedEdges = null;\n }\n\n // if using `resizable.preserveAspectRatio` option, record aspect ratio at the start of the resize\n if (resizeOptions.preserveAspectRatio) {\n interaction.resizeStartAspectRatio = startRect.width / startRect.height;\n }\n\n interaction.resizeRects = {\n start : startRect,\n current : utils.extend({}, startRect),\n inverted : utils.extend({}, startRect),\n previous : utils.extend({}, startRect),\n delta : {\n left: 0, right : 0, width : 0,\n top : 0, bottom: 0, height: 0,\n },\n };\n\n iEvent.rect = interaction.resizeRects.inverted;\n iEvent.deltaRect = interaction.resizeRects.delta;\n});\n\n// resizemove\nInteractEvent.signals.on('new', function ({ iEvent, phase, interaction }) {\n if (phase !== 'move' || !interaction.prepared.edges) { return; }\n\n const resizeOptions = interaction.target.options.resize;\n const invert = resizeOptions.invert;\n const invertible = invert === 'reposition' || invert === 'negate';\n\n let edges = interaction.prepared.edges;\n\n const start = interaction.resizeRects.start;\n const current = interaction.resizeRects.current;\n const inverted = interaction.resizeRects.inverted;\n const delta = interaction.resizeRects.delta;\n const previous = utils.extend(interaction.resizeRects.previous, inverted);\n const originalEdges = edges;\n\n let dx = iEvent.dx;\n let dy = iEvent.dy;\n\n if (resizeOptions.preserveAspectRatio || resizeOptions.square) {\n // `resize.preserveAspectRatio` takes precedence over `resize.square`\n const startAspectRatio = resizeOptions.preserveAspectRatio\n ? interaction.resizeStartAspectRatio\n : 1;\n\n edges = interaction.prepared._linkedEdges;\n\n if ((originalEdges.left && originalEdges.bottom)\n || (originalEdges.right && originalEdges.top)) {\n dy = -dx / startAspectRatio;\n }\n else if (originalEdges.left || originalEdges.right ) { dy = dx / startAspectRatio; }\n else if (originalEdges.top || originalEdges.bottom) { dx = dy * startAspectRatio; }\n }\n\n // update the 'current' rect without modifications\n if (edges.top ) { current.top += dy; }\n if (edges.bottom) { current.bottom += dy; }\n if (edges.left ) { current.left += dx; }\n if (edges.right ) { current.right += dx; }\n\n if (invertible) {\n // if invertible, copy the current rect\n utils.extend(inverted, current);\n\n if (invert === 'reposition') {\n // swap edge values if necessary to keep width/height positive\n let swap;\n\n if (inverted.top > inverted.bottom) {\n swap = inverted.top;\n\n inverted.top = inverted.bottom;\n inverted.bottom = swap;\n }\n if (inverted.left > inverted.right) {\n swap = inverted.left;\n\n inverted.left = inverted.right;\n inverted.right = swap;\n }\n }\n }\n else {\n // if not invertible, restrict to minimum of 0x0 rect\n inverted.top = Math.min(current.top, start.bottom);\n inverted.bottom = Math.max(current.bottom, start.top);\n inverted.left = Math.min(current.left, start.right);\n inverted.right = Math.max(current.right, start.left);\n }\n\n inverted.width = inverted.right - inverted.left;\n inverted.height = inverted.bottom - inverted.top ;\n\n for (const edge in inverted) {\n delta[edge] = inverted[edge] - previous[edge];\n }\n\n iEvent.edges = interaction.prepared.edges;\n iEvent.rect = inverted;\n iEvent.deltaRect = delta;\n});\n\n/*\\\n * Interactable.resizable\n [ method ]\n *\n * Gets or sets whether resize actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of resize elements\n | var isResizeable = interact('input[type=text]').resizable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on resize events (object makes the Interactable resizable)\n = (object) This Interactable\n | interact(element).resizable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | edges: {\n | top : true, // Use pointer coords to check for resize.\n | left : false, // Disable resizing from left edge.\n | bottom: '.resize-s',// Resize if pointer target matches selector\n | right : handleEl // Resize if pointer target is the given Element\n | },\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height are adjusted at a 1:1 ratio.\n | square: false,\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height maintain the aspect ratio they had when resizing started.\n | preserveAspectRatio: false,\n |\n | // a value of 'none' will limit the resize rect to a minimum of 0x0\n | // 'negate' will allow the rect to have negative width/height\n | // 'reposition' will keep the width/height positive by swapping\n | // the top and bottom edges and/or swapping the left and right edges\n | invert: 'none' || 'negate' || 'reposition'\n |\n | // limit multiple resizes.\n | // See the explanation in the @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n \\*/\nInteractable.prototype.resizable = function (options) {\n if (utils.is.object(options)) {\n this.options.resize.enabled = options.enabled === false? false: true;\n this.setPerAction('resize', options);\n this.setOnEvents('resize', options);\n\n if (/^x$|^y$|^xy$/.test(options.axis)) {\n this.options.resize.axis = options.axis;\n }\n else if (options.axis === null) {\n this.options.resize.axis = defaultOptions.resize.axis;\n }\n\n if (utils.is.bool(options.preserveAspectRatio)) {\n this.options.resize.preserveAspectRatio = options.preserveAspectRatio;\n }\n else if (utils.is.bool(options.square)) {\n this.options.resize.square = options.square;\n }\n\n return this;\n }\n if (utils.is.bool(options)) {\n this.options.resize.enabled = options;\n\n if (!options) {\n this.onresizestart = this.onresizestart = this.onresizeend = null;\n }\n\n return this;\n }\n return this.options.resize;\n};\n\nfunction checkResizeEdge (name, value, page, element, interactableElement, rect, margin) {\n // false, '', undefined, null\n if (!value) { return false; }\n\n // true value, use pointer coords and element rect\n if (value === true) {\n // if dimensions are negative, \"switch\" edges\n const width = utils.is.number(rect.width )? rect.width : rect.right - rect.left;\n const height = utils.is.number(rect.height)? rect.height : rect.bottom - rect.top ;\n\n if (width < 0) {\n if (name === 'left' ) { name = 'right'; }\n else if (name === 'right') { name = 'left' ; }\n }\n if (height < 0) {\n if (name === 'top' ) { name = 'bottom'; }\n else if (name === 'bottom') { name = 'top' ; }\n }\n\n if (name === 'left' ) { return page.x < ((width >= 0? rect.left: rect.right ) + margin); }\n if (name === 'top' ) { return page.y < ((height >= 0? rect.top : rect.bottom) + margin); }\n\n if (name === 'right' ) { return page.x > ((width >= 0? rect.right : rect.left) - margin); }\n if (name === 'bottom') { return page.y > ((height >= 0? rect.bottom: rect.top ) - margin); }\n }\n\n // the remaining checks require an element\n if (!utils.is.element(element)) { return false; }\n\n return utils.is.element(value)\n // the value is an element to use as a resize handle\n ? value === element\n // otherwise check if element matches value as selector\n : utils.matchesUpTo(element, value, interactableElement);\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.resizeAxes = 'xy';\n});\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action }) {\n if (action !== 'resize' || !interaction.resizeAxes) { return; }\n\n const options = interaction.target.options;\n\n if (options.resize.square) {\n if (interaction.resizeAxes === 'y') {\n iEvent.dx = iEvent.dy;\n }\n else {\n iEvent.dy = iEvent.dx;\n }\n iEvent.axes = 'xy';\n }\n else {\n iEvent.axes = interaction.resizeAxes;\n\n if (interaction.resizeAxes === 'x') {\n iEvent.dy = 0;\n }\n else if (interaction.resizeAxes === 'y') {\n iEvent.dx = 0;\n }\n }\n});\n\nactions.resize = resize;\nactions.names.push('resize');\nutils.merge(Interactable.eventTypes, [\n 'resizestart',\n 'resizemove',\n 'resizeinertiastart',\n 'resizeinertiaresume',\n 'resizeend',\n]);\nactions.methodDict.resize = 'resizable';\n\ndefaultOptions.resize = resize.defaults;\n\nmodule.exports = resize;\n","const raf = require('./utils/raf');\nconst getWindow = require('./utils/window').getWindow;\nconst is = require('./utils/is');\nconst domUtils = require('./utils/domUtils');\nconst Interaction = require('./Interaction');\nconst defaultOptions = require('./defaultOptions');\n\nconst autoScroll = {\n defaults: {\n enabled : false,\n container: null, // the item that is scrolled (Window or HTMLElement)\n margin : 60,\n speed : 300, // the scroll speed in pixels per second\n },\n\n interaction: null,\n i: null, // the handle returned by window.setInterval\n x: 0, y: 0, // Direction each pulse is to scroll in\n\n isScrolling: false,\n prevTime: 0,\n\n start: function (interaction) {\n autoScroll.isScrolling = true;\n raf.cancel(autoScroll.i);\n\n autoScroll.interaction = interaction;\n autoScroll.prevTime = new Date().getTime();\n autoScroll.i = raf.request(autoScroll.scroll);\n },\n\n stop: function () {\n autoScroll.isScrolling = false;\n raf.cancel(autoScroll.i);\n },\n\n // scroll the window by the values in scroll.x/y\n scroll: function () {\n const options = autoScroll.interaction.target.options[autoScroll.interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(autoScroll.interaction.element);\n const now = new Date().getTime();\n // change in time in seconds\n const dt = (now - autoScroll.prevTime) / 1000;\n // displacement\n const s = options.speed * dt;\n\n if (s >= 1) {\n if (is.window(container)) {\n container.scrollBy(autoScroll.x * s, autoScroll.y * s);\n }\n else if (container) {\n container.scrollLeft += autoScroll.x * s;\n container.scrollTop += autoScroll.y * s;\n }\n\n autoScroll.prevTime = now;\n }\n\n if (autoScroll.isScrolling) {\n raf.cancel(autoScroll.i);\n autoScroll.i = raf.request(autoScroll.scroll);\n }\n },\n check: function (interactable, actionName) {\n const options = interactable.options;\n\n return options[actionName].autoScroll && options[actionName].autoScroll.enabled;\n },\n onInteractionMove: function ({ interaction, pointer }) {\n if (!(interaction.interacting()\n && autoScroll.check(interaction.target, interaction.prepared.name))) {\n return;\n }\n\n if (interaction.simulation) {\n autoScroll.x = autoScroll.y = 0;\n return;\n }\n\n let top;\n let right;\n let bottom;\n let left;\n\n const options = interaction.target.options[interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(interaction.element);\n\n if (is.window(container)) {\n left = pointer.clientX < autoScroll.margin;\n top = pointer.clientY < autoScroll.margin;\n right = pointer.clientX > container.innerWidth - autoScroll.margin;\n bottom = pointer.clientY > container.innerHeight - autoScroll.margin;\n }\n else {\n const rect = domUtils.getElementClientRect(container);\n\n left = pointer.clientX < rect.left + autoScroll.margin;\n top = pointer.clientY < rect.top + autoScroll.margin;\n right = pointer.clientX > rect.right - autoScroll.margin;\n bottom = pointer.clientY > rect.bottom - autoScroll.margin;\n }\n\n autoScroll.x = (right ? 1: left? -1: 0);\n autoScroll.y = (bottom? 1: top? -1: 0);\n\n if (!autoScroll.isScrolling) {\n // set the autoScroll properties to those of the target\n autoScroll.margin = options.margin;\n autoScroll.speed = options.speed;\n\n autoScroll.start(interaction);\n }\n },\n};\n\nInteraction.signals.on('stop-active', function () {\n autoScroll.stop();\n});\n\nInteraction.signals.on('action-move', autoScroll.onInteractionMove);\n\ndefaultOptions.perAction.autoScroll = autoScroll.defaults;\n\nmodule.exports = autoScroll;\n","const Interactable = require('../Interactable');\nconst actions = require('../actions/base');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.ignoreFrom\n [ method ]\n *\n * If the target of the `mousedown`, `pointerdown` or `touchstart`\n * event or any of it's parents match the given CSS selector or\n * Element, no drag/resize/gesture is started.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to not ignore any elements\n = (string | Element | object) The current ignoreFrom value or this Interactable\n **\n | interact(element, { ignoreFrom: document.getElementById('no-action') });\n | // or\n | interact(element).ignoreFrom('input, textarea, a');\n\\*/\nInteractable.prototype.ignoreFrom = function (newValue) {\n return this._backCompatOption('ignoreFrom', newValue);\n};\n\n/*\\\n * Interactable.allowFrom\n [ method ]\n *\n * A drag/resize/gesture is started only If the target of the\n * `mousedown`, `pointerdown` or `touchstart` event or any of it's\n * parents match the given CSS selector or Element.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to allow from any element\n = (string | Element | object) The current allowFrom value or this Interactable\n **\n | interact(element, { allowFrom: document.getElementById('drag-handle') });\n | // or\n | interact(element).allowFrom('.handle');\n\\*/\nInteractable.prototype.allowFrom = function (newValue) {\n return this._backCompatOption('allowFrom', newValue);\n};\n\nInteractable.prototype.testIgnore = function (ignoreFrom, interactableElement, element) {\n if (!ignoreFrom || !is.element(element)) { return false; }\n\n if (is.string(ignoreFrom)) {\n return domUtils.matchesUpTo(element, ignoreFrom, interactableElement);\n }\n else if (is.element(ignoreFrom)) {\n return domUtils.nodeContains(ignoreFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testAllow = function (allowFrom, interactableElement, element) {\n if (!allowFrom) { return true; }\n\n if (!is.element(element)) { return false; }\n\n if (is.string(allowFrom)) {\n return domUtils.matchesUpTo(element, allowFrom, interactableElement);\n }\n else if (is.element(allowFrom)) {\n return domUtils.nodeContains(allowFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testIgnoreAllow = function (options, interactableElement, eventTarget) {\n return (!this.testIgnore(options.ignoreFrom, interactableElement, eventTarget)\n && this.testAllow(options.allowFrom, interactableElement, eventTarget));\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (event.buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\n","const interact = require('../interact');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst actions = require('../actions/base');\nconst defaultOptions = require('../defaultOptions');\nconst browser = require('../utils/browser');\nconst scope = require('../scope');\nconst utils = require('../utils');\nconst signals = require('../utils/Signals').new();\n\nrequire('./InteractableMethods');\n\nconst autoStart = {\n signals,\n withinInteractionLimit,\n // Allow this many interactions to happen simultaneously\n maxInteractions: Infinity,\n defaults: {\n perAction: {\n manualStart: false,\n max: Infinity,\n maxPerElement: 1,\n allowFrom: null,\n ignoreFrom: null,\n },\n },\n setActionDefaults: function (action) {\n utils.extend(action.defaults, autoStart.defaults.perAction);\n },\n};\n\n// set cursor style on mousedown\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget }) {\n if (interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\n// set cursor style on mousemove\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget }) {\n if (!interaction.mouse\n || interaction.pointerIsDown\n || interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\nInteraction.signals.on('move', function (arg) {\n const { interaction, event } = arg;\n\n if (!interaction.pointerIsDown\n || interaction.interacting()\n || !interaction.pointerWasMoved\n || !interaction.prepared.name) {\n return;\n }\n\n signals.fire('before-start', arg);\n\n const target = interaction.target;\n\n if (interaction.prepared.name && target) {\n // check manualStart and interaction limit\n if (target.options[interaction.prepared.name].manualStart\n || !withinInteractionLimit(target, interaction.element, interaction.prepared)) {\n interaction.stop(event);\n }\n else {\n interaction.start(interaction.prepared, target, interaction.element);\n }\n }\n});\n\n// Check if the current target supports the action.\n// If so, return the validated action. Otherwise, return null\nfunction validateAction (action, interactable, element, eventTarget) {\n if (utils.is.object(action)\n && interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget)\n && interactable.options[action.name].enabled\n && withinInteractionLimit(interactable, element, action)) {\n return action;\n }\n\n return null;\n}\n\nfunction validateSelector (interaction, pointer, event, matches, matchElements, eventTarget) {\n for (let i = 0, len = matches.length; i < len; i++) {\n const match = matches[i];\n const matchElement = matchElements[i];\n const action = validateAction(match.getAction(pointer, event, interaction, matchElement),\n match,\n matchElement,\n eventTarget);\n\n if (action) {\n return {\n action,\n target: match,\n element: matchElement,\n };\n }\n }\n\n return {};\n}\n\nfunction getActionInfo (interaction, pointer, event, eventTarget) {\n let matches = [];\n let matchElements = [];\n\n let element = eventTarget;\n let action = null;\n\n function pushMatches (interactable, selector, context) {\n const elements = (browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined);\n\n if (utils.matchesSelector(element, selector, elements)) {\n\n matches.push(interactable);\n matchElements.push(element);\n }\n }\n\n while (utils.is.element(element)) {\n matches = [];\n matchElements = [];\n\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && (action = validateAction(elementInteractable.getAction(pointer, event, interaction, element, eventTarget),\n elementInteractable,\n element,\n eventTarget))\n && !elementInteractable.options[action.name].manualStart) {\n return {\n element,\n action,\n target: elementInteractable,\n };\n }\n else {\n scope.interactables.forEachSelector(pushMatches, element);\n\n const actionInfo = validateSelector(interaction, pointer, event, matches, matchElements, eventTarget);\n\n if (actionInfo.action\n && !actionInfo.target.options[actionInfo.action.name].manualStart) {\n return actionInfo;\n }\n }\n\n element = utils.parentNode(element);\n }\n\n return {};\n}\n\nfunction prepare (interaction, { action, target, element }) {\n action = action || {};\n\n if (interaction.target && interaction.target.options.styleCursor) {\n interaction.target._doc.documentElement.style.cursor = '';\n }\n\n interaction.target = target;\n interaction.element = element;\n utils.copyAction(interaction.prepared, action);\n\n if (target && target.options.styleCursor) {\n const cursor = action? actions[action.name].getCursor(action) : '';\n interaction.target._doc.documentElement.style.cursor = cursor;\n }\n\n signals.fire('prepared', { interaction: interaction });\n}\n\nInteraction.signals.on('stop', function ({ interaction }) {\n const target = interaction.target;\n\n if (target && target.options.styleCursor) {\n target._doc.documentElement.style.cursor = '';\n }\n});\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (utils.is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (utils.is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n const buttons = event.buttons || ({\n 0: 1,\n 1: 4,\n 3: 8,\n 4: 16,\n })[event.button];\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\nfunction withinInteractionLimit (interactable, element, action) {\n const options = interactable.options;\n const maxActions = options[action.name].max;\n const maxPerElement = options[action.name].maxPerElement;\n let activeInteractions = 0;\n let targetCount = 0;\n let targetElementCount = 0;\n\n // no actions if any of these values == 0\n if (!(maxActions && maxPerElement && autoStart.maxInteractions)) { return; }\n\n for (let i = 0, len = scope.interactions.length; i < len; i++) {\n const interaction = scope.interactions[i];\n const otherAction = interaction.prepared.name;\n\n if (!interaction.interacting()) { continue; }\n\n activeInteractions++;\n\n if (activeInteractions >= autoStart.maxInteractions) {\n return false;\n }\n\n if (interaction.target !== interactable) { continue; }\n\n targetCount += (otherAction === action.name)|0;\n\n if (targetCount >= maxActions) {\n return false;\n }\n\n if (interaction.element === element) {\n targetElementCount++;\n\n if (otherAction !== action.name || targetElementCount >= maxPerElement) {\n return false;\n }\n }\n }\n\n return autoStart.maxInteractions > 0;\n}\n\n/*\\\n * interact.maxInteractions\n [ method ]\n **\n * Returns or sets the maximum number of concurrent interactions allowed.\n * By default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables\n * and elements, you need to enable it in the draggable, resizable and\n * gesturable `'max'` and `'maxPerElement'` options.\n **\n - newValue (number) #optional Any number. newValue <= 0 means no interactions.\n\\*/\ninteract.maxInteractions = function (newValue) {\n if (utils.is.number(newValue)) {\n autoStart.maxInteractions = newValue;\n\n return this;\n }\n\n return autoStart.maxInteractions;\n};\n\nInteractable.settingsMethods.push('styleCursor');\nInteractable.settingsMethods.push('actionChecker');\nInteractable.settingsMethods.push('ignoreFrom');\nInteractable.settingsMethods.push('allowFrom');\n\ndefaultOptions.base.actionChecker = null;\ndefaultOptions.base.styleCursor = true;\n\nutils.extend(defaultOptions.perAction, autoStart.defaults.perAction);\n\nmodule.exports = autoStart;\n","const autoStart = require('./base');\nconst Interaction = require('../Interaction');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.delayTimer = null;\n});\n\nautoStart.signals.on('prepared', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.delayTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.target, interaction.element);\n }, delay);\n }\n});\n\nInteraction.signals.on('move', function ({ interaction, duplicate }) {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.delayTimer);\n }\n});\n\n// prevent regular down->move autoStart\nautoStart.signals.on('before-start', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.prepared.name = null;\n }\n});\n","const autoStart = require('./base');\nconst scope = require('../scope');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\n\nconst { matchesSelector, parentNode } = require('../utils/domUtils');\n\nautoStart.setActionDefaults(require('../actions/drag'));\n\nautoStart.signals.on('before-start', function ({ interaction, eventTarget, dx, dy }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // check if a drag is in the correct axis\n const absX = Math.abs(dx);\n const absY = Math.abs(dy);\n const options = interaction.target.options.drag;\n const startAxis = options.startAxis;\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy');\n\n interaction.prepared.axis = options.lockAxis === 'start'\n ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n : options.lockAxis;\n\n // if the movement isn't in the startAxis of the interactable\n if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) {\n // cancel the prepared action\n interaction.prepared.name = null;\n\n // then try to get a drag from another ineractable\n\n if (!interaction.prepared.name) {\n\n let element = eventTarget;\n\n const getDraggable = function (interactable, selector, context) {\n const elements = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n if (interactable === interaction.target) { return; }\n\n if (!options.manualStart\n && !interactable.testIgnoreAllow(options, element, eventTarget)\n && matchesSelector(element, selector, elements)) {\n\n const action = interactable.getAction(interaction.downPointer,\n interaction.downEvent,\n interaction,\n element);\n\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, interactable)\n && autoStart.validateAction(action, interactable, element, eventTarget)) {\n\n return interactable;\n }\n }\n };\n\n let action = null;\n\n // check all interactables\n while (is.element(element)) {\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && elementInteractable !== interaction.target\n && !elementInteractable.options.drag.manualStart) {\n\n action = elementInteractable.getAction(interaction.downPointer, interaction.downEvent, interaction, element);\n }\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, elementInteractable)) {\n\n interaction.prepared.name = 'drag';\n interaction.target = elementInteractable;\n interaction.element = element;\n break;\n }\n\n const selectorInteractable = scope.interactables.forEachSelector(getDraggable, element);\n\n if (selectorInteractable) {\n interaction.prepared.name = 'drag';\n interaction.target = selectorInteractable;\n interaction.element = element;\n break;\n }\n\n element = parentNode(element);\n }\n }\n }\n});\n\nfunction checkStartAxis (startAxis, interactable) {\n if (!interactable) { return false; }\n\n const thisAxis = interactable.options.drag.startAxis;\n\n return (startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis);\n}\n","require('./base').setActionDefaults(require('../actions/gesture'));\n","require('./base').setActionDefaults(require('../actions/resize'));\n","module.exports = {\n base: {\n accept : null,\n preventDefault: 'auto',\n deltaSource : 'page',\n },\n\n perAction: {\n origin: { x: 0, y: 0 },\n\n // only allow left button by default\n // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n mouseButtons: 1,\n\n inertia: {\n enabled : false,\n resistance : 10, // the lambda in exponential decay\n minSpeed : 100, // target speed must be above this for inertia to start\n endSpeed : 10, // the speed at which inertia is slow enough to stop\n allowResume : true, // allow resuming an action in inertia phase\n smoothEndDuration: 300, // animate to snap/restrict endOnly if there's no inertia\n },\n },\n};\n","/* browser entry point */\n\n// Legacy browser support\nrequire('./legacyBrowsers');\n\n// inertia\nrequire('./inertia');\n\n// modifiers\nrequire('./modifiers/snap');\nrequire('./modifiers/restrict');\n\n// pointerEvents\nrequire('./pointerEvents/base');\nrequire('./pointerEvents/holdRepeat');\nrequire('./pointerEvents/interactableTargets');\n\n// delay\nrequire('./autoStart/delay');\n\n// actions\nrequire('./actions/gesture');\nrequire('./actions/resize');\nrequire('./actions/drag');\nrequire('./actions/drop');\n\n// load these modifiers after resize is loaded\nrequire('./modifiers/snapSize');\nrequire('./modifiers/restrictEdges');\nrequire('./modifiers/restrictSize');\n\n// autoStart actions\nrequire('./autoStart/gesture');\nrequire('./autoStart/resize');\nrequire('./autoStart/drag');\n\n// Interactable preventDefault setting\nrequire('./interactablePreventDefault.js');\n\n// autoScroll\nrequire('./autoScroll');\n\n// export interact\nmodule.exports = require('./interact');\n","const InteractEvent = require('./InteractEvent');\nconst Interaction = require('./Interaction');\nconst modifiers = require('./modifiers');\nconst utils = require('./utils');\nconst animationFrame = require('./utils/raf');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.inertiaStatus = {\n active : false,\n smoothEnd : false,\n allowResume: false,\n\n startEvent: null,\n upCoords : {},\n\n xe: 0, ye: 0,\n sx: 0, sy: 0,\n\n t0: 0,\n vx0: 0, vys: 0,\n duration: 0,\n\n lambda_v0: 0,\n one_ve_v0: 0,\n i : null,\n };\n\n interaction.boundInertiaFrame = () => inertiaFrame .apply(interaction);\n interaction.boundSmoothEndFrame = () => smoothEndFrame.apply(interaction);\n});\n\nInteraction.signals.on('down', function ({ interaction, event, pointer, eventTarget }) {\n const status = interaction.inertiaStatus;\n\n // Check if the down event hits the current inertia target\n if (status.active) {\n let element = eventTarget;\n\n // climb up the DOM tree from the event target\n while (utils.is.element(element)) {\n\n // if interaction element is the current inertia target element\n if (element === interaction.element) {\n // stop inertia\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n\n // update pointers to the down event's coordinates\n interaction.updatePointer(pointer);\n utils.setCoords(interaction.curCoords, interaction.pointers);\n\n // fire appropriate signals\n const signalArg = { interaction };\n Interaction.signals.fire('before-action-move', signalArg);\n Interaction.signals.fire('action-resume' , signalArg);\n\n // fire a reume event\n const resumeEvent = new InteractEvent(interaction,\n event,\n interaction.prepared.name,\n 'inertiaresume',\n interaction.element);\n\n interaction.target.fire(resumeEvent);\n interaction.prevEvent = resumeEvent;\n modifiers.resetStatuses(interaction.modifierStatuses);\n\n utils.copyCoords(interaction.prevCoords, interaction.curCoords);\n break;\n }\n\n element = utils.parentNode(element);\n }\n }\n});\n\nInteraction.signals.on('up', function ({ interaction, event }) {\n const status = interaction.inertiaStatus;\n\n if (!interaction.interacting() || status.active) { return; }\n\n const target = interaction.target;\n const options = target && target.options;\n const inertiaOptions = options && interaction.prepared.name && options[interaction.prepared.name].inertia;\n\n const now = new Date().getTime();\n const statuses = {};\n const page = utils.extend({}, interaction.curCoords.page);\n const pointerSpeed = interaction.pointerDelta.client.speed;\n\n let smoothEnd = false;\n let modifierResult;\n\n // check if inertia should be started\n const inertiaPossible = (inertiaOptions && inertiaOptions.enabled\n && interaction.prepared.name !== 'gesture'\n && event !== status.startEvent);\n\n const inertia = (inertiaPossible\n && (now - interaction.curCoords.timeStamp) < 50\n && pointerSpeed > inertiaOptions.minSpeed\n && pointerSpeed > inertiaOptions.endSpeed);\n\n const modifierArg = {\n interaction,\n pageCoords: page,\n statuses,\n preEnd: true,\n requireEndOnly: true,\n };\n\n // smoothEnd\n if (inertiaPossible && !inertia) {\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n if (modifierResult.shouldMove && modifierResult.locked) {\n smoothEnd = true;\n }\n }\n\n if (!(inertia || smoothEnd)) { return; }\n\n utils.copyCoords(status.upCoords, interaction.curCoords);\n\n interaction.pointers[0] = status.startEvent =\n new InteractEvent(interaction, event, interaction.prepared.name, 'inertiastart', interaction.element);\n\n status.t0 = now;\n\n status.active = true;\n status.allowResume = inertiaOptions.allowResume;\n interaction.simulation = status;\n\n target.fire(status.startEvent);\n\n if (inertia) {\n status.vx0 = interaction.pointerDelta.client.vx;\n status.vy0 = interaction.pointerDelta.client.vy;\n status.v0 = pointerSpeed;\n\n calcInertia(interaction, status);\n\n utils.extend(page, interaction.curCoords.page);\n\n page.x += status.xe;\n page.y += status.ye;\n\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n status.modifiedXe += modifierResult.dx;\n status.modifiedYe += modifierResult.dy;\n\n status.i = animationFrame.request(interaction.boundInertiaFrame);\n }\n else {\n status.smoothEnd = true;\n status.xe = modifierResult.dx;\n status.ye = modifierResult.dy;\n\n status.sx = status.sy = 0;\n\n status.i = animationFrame.request(interaction.boundSmoothEndFrame);\n }\n});\n\nInteraction.signals.on('stop-active', function ({ interaction }) {\n const status = interaction.inertiaStatus;\n\n if (status.active) {\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n }\n});\n\nfunction calcInertia (interaction, status) {\n const inertiaOptions = interaction.target.options[interaction.prepared.name].inertia;\n const lambda = inertiaOptions.resistance;\n const inertiaDur = -Math.log(inertiaOptions.endSpeed / status.v0) / lambda;\n\n status.x0 = interaction.prevEvent.pageX;\n status.y0 = interaction.prevEvent.pageY;\n status.t0 = status.startEvent.timeStamp / 1000;\n status.sx = status.sy = 0;\n\n status.modifiedXe = status.xe = (status.vx0 - inertiaDur) / lambda;\n status.modifiedYe = status.ye = (status.vy0 - inertiaDur) / lambda;\n status.te = inertiaDur;\n\n status.lambda_v0 = lambda / status.v0;\n status.one_ve_v0 = 1 - inertiaOptions.endSpeed / status.v0;\n}\n\nfunction inertiaFrame () {\n updateInertiaCoords(this);\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n\n const status = this.inertiaStatus;\n const options = this.target.options[this.prepared.name].inertia;\n const lambda = options.resistance;\n const t = new Date().getTime() / 1000 - status.t0;\n\n if (t < status.te) {\n\n const progress = 1 - (Math.exp(-lambda * t) - status.lambda_v0) / status.one_ve_v0;\n\n if (status.modifiedXe === status.xe && status.modifiedYe === status.ye) {\n status.sx = status.xe * progress;\n status.sy = status.ye * progress;\n }\n else {\n const quadPoint = utils.getQuadraticCurvePoint(0, 0,\n status.xe,\n status.ye,\n status.modifiedXe,\n status.modifiedYe,\n progress);\n\n status.sx = quadPoint.x;\n status.sy = quadPoint.y;\n }\n\n this.doMove();\n\n status.i = animationFrame.request(this.boundInertiaFrame);\n }\n else {\n status.sx = status.modifiedXe;\n status.sy = status.modifiedYe;\n\n this.doMove();\n this.end(status.startEvent);\n status.active = false;\n this.simulation = null;\n }\n\n utils.copyCoords(this.prevCoords, this.curCoords);\n}\n\nfunction smoothEndFrame () {\n updateInertiaCoords(this);\n\n const status = this.inertiaStatus;\n const t = new Date().getTime() - status.t0;\n const duration = this.target.options[this.prepared.name].inertia.smoothEndDuration;\n\n if (t < duration) {\n status.sx = utils.easeOutQuad(t, 0, status.xe, duration);\n status.sy = utils.easeOutQuad(t, 0, status.ye, duration);\n\n this.pointerMove(status.startEvent, status.startEvent);\n\n status.i = animationFrame.request(this.boundSmoothEndFrame);\n }\n else {\n status.sx = status.xe;\n status.sy = status.ye;\n\n this.pointerMove(status.startEvent, status.startEvent);\n this.end(status.startEvent);\n\n status.smoothEnd =\n status.active = false;\n this.simulation = null;\n }\n}\n\nfunction updateInertiaCoords (interaction) {\n const status = interaction.inertiaStatus;\n\n // return if inertia isn't running\n if (!status.active) { return; }\n\n const pageUp = status.upCoords.page;\n const clientUp = status.upCoords.client;\n\n utils.setCoords(interaction.curCoords, [ {\n pageX : pageUp.x + status.sx,\n pageY : pageUp.y + status.sy,\n clientX: clientUp.x + status.sx,\n clientY: clientUp.y + status.sy,\n } ]);\n}\n","const browser = require('./utils/browser');\nconst events = require('./utils/events');\nconst utils = require('./utils');\nconst scope = require('./scope');\nconst Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\n\nconst globalEvents = {};\n\n/*\\\n * interact\n [ method ]\n *\n * The methods of this variable can be used to set elements as\n * interactables and also to change various default settings.\n *\n * Calling it as a function and passing an element or a valid CSS selector\n * string returns an Interactable object which has various methods to\n * configure it.\n *\n - element (Element | string) The HTML or SVG Element to interact with or CSS selector\n = (object) An @Interactable\n *\n > Usage\n | interact('#draggable').draggable(true);\n |\n | var rectables = interact('rect');\n | rectables\n | .gesturable(true)\n | .on('gesturemove', function (event) {\n | // ...\n | });\n\\*/\nfunction interact (element, options) {\n let interactable = scope.interactables.get(element, options);\n\n if (!interactable) {\n interactable = new Interactable(element, options);\n interactable.events.global = globalEvents;\n }\n\n return interactable;\n}\n\n/*\\\n * interact.isSet\n [ method ]\n *\n * Check if an element has been set\n - element (Element) The Element being searched for\n = (boolean) Indicates if the element or CSS selector was previously passed to interact\n\\*/\ninteract.isSet = function (element, options) {\n return scope.interactables.indexOfElement(element, options && options.context) !== -1;\n};\n\n/*\\\n * interact.on\n [ method ]\n *\n * Adds a global listener for an InteractEvent or adds a DOM event to\n * `document`\n *\n - type (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) interact\n\\*/\ninteract.on = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.on(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.on(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n // if it is an InteractEvent type, add listener to globalEvents\n if (utils.contains(Interactable.eventTypes, type)) {\n // if this type of event was never bound\n if (!globalEvents[type]) {\n globalEvents[type] = [listener];\n }\n else {\n globalEvents[type].push(listener);\n }\n }\n // If non InteractEvent type, addEventListener to document\n else {\n events.add(scope.document, type, listener, { options });\n }\n\n return interact;\n};\n\n/*\\\n * interact.off\n [ method ]\n *\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n - type (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) interact\n \\*/\ninteract.off = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.off(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.off(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n if (!utils.contains(Interactable.eventTypes, type)) {\n events.remove(scope.document, type, listener, options);\n }\n else {\n let index;\n\n if (type in globalEvents\n && (index = utils.indexOf(globalEvents[type], listener)) !== -1) {\n globalEvents[type].splice(index, 1);\n }\n }\n\n return interact;\n};\n\n/*\\\n * interact.debug\n [ method ]\n *\n * Returns an object which exposes internal data\n = (object) An object with properties that outline the current state and expose internal functions and variables\n\\*/\ninteract.debug = function () {\n return scope;\n};\n\n// expose the functions used to calculate multi-touch properties\ninteract.getPointerAverage = utils.pointerAverage;\ninteract.getTouchBBox = utils.touchBBox;\ninteract.getTouchDistance = utils.touchDistance;\ninteract.getTouchAngle = utils.touchAngle;\n\ninteract.getElementRect = utils.getElementRect;\ninteract.getElementClientRect = utils.getElementClientRect;\ninteract.matchesSelector = utils.matchesSelector;\ninteract.closest = utils.closest;\n\n/*\\\n * interact.supportsTouch\n [ method ]\n *\n = (boolean) Whether or not the browser supports touch input\n\\*/\ninteract.supportsTouch = function () {\n return browser.supportsTouch;\n};\n\n/*\\\n * interact.supportsPointerEvent\n [ method ]\n *\n = (boolean) Whether or not the browser supports PointerEvents\n\\*/\ninteract.supportsPointerEvent = function () {\n return browser.supportsPointerEvent;\n};\n\n/*\\\n * interact.stop\n [ method ]\n *\n * Cancels all interactions (end events are not fired)\n *\n - event (Event) An event on which to call preventDefault()\n = (object) interact\n\\*/\ninteract.stop = function (event) {\n for (let i = scope.interactions.length - 1; i >= 0; i--) {\n scope.interactions[i].stop(event);\n }\n\n return interact;\n};\n\n/*\\\n * interact.pointerMoveTolerance\n [ method ]\n * Returns or sets the distance the pointer must be moved before an action\n * sequence occurs. This also affects tolerance for tap events.\n *\n - newValue (number) #optional The movement from the start position must be greater than this value\n = (number | Interactable) The current setting or interact\n\\*/\ninteract.pointerMoveTolerance = function (newValue) {\n if (utils.is.number(newValue)) {\n Interaction.pointerMoveTolerance = newValue;\n\n return this;\n }\n\n return Interaction.pointerMoveTolerance;\n};\n\ninteract.addDocument = scope.addDocument;\ninteract.removeDocument = scope.removeDocument;\n\nscope.interact = interact;\n\nmodule.exports = interact;\n","const Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\nconst scope = require('./scope');\nconst is = require('./utils/is');\nconst events = require('./utils/events');\n\nconst { nodeContains, matchesSelector } = require('./utils/domUtils');\n\n/*\\\n * Interactable.preventDefault\n [ method ]\n *\n * Returns or sets whether to prevent the browser's default behaviour\n * in response to pointer events. Can be set to:\n * - `'always'` to always prevent\n * - `'never'` to never prevent\n * - `'auto'` to let interact.js try to determine what would be best\n *\n - newValue (string) #optional `true`, `false` or `'auto'`\n = (string | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.preventDefault = function (newValue) {\n if (/^(always|never|auto)$/.test(newValue)) {\n this.options.preventDefault = newValue;\n return this;\n }\n\n if (is.bool(newValue)) {\n this.options.preventDefault = newValue? 'always' : 'never';\n return this;\n }\n\n return this.options.preventDefault;\n};\n\nInteractable.prototype.checkAndPreventDefault = function (event) {\n const setting = this.options.preventDefault;\n\n if (setting === 'never') { return; }\n\n if (setting === 'always') {\n event.preventDefault();\n return;\n }\n\n // setting === 'auto'\n\n // don't preventDefault if the browser supports passiveEvents\n // CSS touch-action and user-selecct should be used instead\n if (events.supportsOptions) {\n return;\n }\n\n // don't preventDefault of pointerdown events\n if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) {\n return;\n }\n\n // don't preventDefault on editable elements\n if (is.element(event.target)\n && matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) {\n return;\n }\n\n event.preventDefault();\n};\n\nfunction onInteractionEvent ({ interaction, event }) {\n if (interaction.target) {\n interaction.target.checkAndPreventDefault(event);\n }\n}\n\nfor (const eventSignal of ['down', 'move', 'up', 'cancel']) {\n Interaction.signals.on(eventSignal, onInteractionEvent);\n}\n\n// prevent native HTML5 drag on interact.js target elements\nInteraction.docEvents.dragstart = function preventNativeDrag (event) {\n for (const interaction of scope.interactions) {\n\n if (interaction.element\n && (interaction.element === event.target\n || nodeContains(interaction.element, event.target))) {\n\n interaction.target.checkAndPreventDefault(event);\n return;\n }\n }\n};\n","const scope = require('./scope');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst iFinder = require('./utils/interactionFinder');\nconst pointerEvents = require('./pointerEvents/base');\n\nconst { window } = require('./utils/window');\n\nconst toString = Object.prototype.toString;\n\nif (!window.Array.isArray) {\n window.Array.isArray = function (obj) {\n return toString.call(obj) === '[object Array]';\n };\n}\n\nif (!String.prototype.trim) {\n String.prototype.trim = function () {\n return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n };\n}\n\n// http://www.quirksmode.org/dom/events/click.html\n// >Events leading to dblclick\n//\n// IE8 doesn't fire down event before dblclick.\n// This workaround tries to fire a tap and doubletap after dblclick\nfunction onIE8Dblclick (event) {\n const eventTarget = event.target;\n const interaction = iFinder.search(event, event.type, eventTarget);\n\n if (!interaction) { return; }\n\n if (interaction.prevTap\n && event.clientX === interaction.prevTap.clientX\n && event.clientY === interaction.prevTap.clientY\n && eventTarget === interaction.prevTap.target) {\n\n interaction.downTargets[0] = eventTarget;\n interaction.downTimes [0] = new Date().getTime();\n\n pointerEvents.fire({\n interaction,\n event,\n eventTarget,\n pointer: event,\n type: 'tap',\n });\n }\n}\n\nif (browser.isIE8) {\n const selectFix = function (event) {\n for (const interaction of scope.interactions) {\n if (interaction.interacting()) {\n interaction.target.checkAndPreventDefault(event);\n }\n }\n };\n\n const onDocIE8 = function onDocIE8 ({ doc, win }, signalName) {\n const eventMethod = signalName.indexOf('listen') === 0\n ? events.add : events.remove;\n\n // For IE's lack of Event#preventDefault\n eventMethod(doc, 'selectstart', selectFix);\n\n if (pointerEvents) {\n eventMethod(doc, 'dblclick', onIE8Dblclick);\n }\n };\n\n scope.signals.on('add-document' , onDocIE8);\n scope.signals.on('remove-document', onDocIE8);\n}\n\nmodule.exports = null;\n","const InteractEvent = require('../InteractEvent');\nconst Interaction = require('../Interaction');\nconst extend = require('../utils/extend');\n\nconst modifiers = {\n names: [],\n\n setOffsets: function (arg) {\n const { interaction, pageCoords: page } = arg;\n const { target, element, startOffset } = interaction;\n const rect = target.getRect(element);\n\n if (rect) {\n startOffset.left = page.x - rect.left;\n startOffset.top = page.y - rect.top;\n\n startOffset.right = rect.right - page.x;\n startOffset.bottom = rect.bottom - page.y;\n\n if (!('width' in rect)) { rect.width = rect.right - rect.left; }\n if (!('height' in rect)) { rect.height = rect.bottom - rect.top ; }\n }\n else {\n startOffset.left = startOffset.top = startOffset.right = startOffset.bottom = 0;\n }\n\n arg.rect = rect;\n arg.interactable = target;\n arg.element = element;\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n\n arg.options = target.options[interaction.prepared.name][modifierName];\n\n if (!arg.options) {\n continue;\n }\n\n interaction.modifierOffsets[modifierName] = modifiers[modifierName].setOffset(arg);\n }\n },\n\n setAll: function (arg) {\n const { interaction, statuses, preEnd, requireEndOnly } = arg;\n const coords = extend({}, arg.pageCoords);\n const result = {\n dx: 0,\n dy: 0,\n changed: false,\n locked: false,\n shouldMove: true,\n };\n\n for (const modifierName of modifiers.names) {\n const modifier = modifiers[modifierName];\n const options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!shouldDo(options, preEnd, requireEndOnly)) { continue; }\n\n arg.status = arg.status = statuses[modifierName];\n arg.options = options;\n arg.offset = arg.interaction.modifierOffsets[modifierName];\n\n modifier.set(arg);\n\n if (arg.status.locked) {\n coords.x += arg.status.dx;\n coords.y += arg.status.dy;\n\n result.dx += arg.status.dx;\n result.dy += arg.status.dy;\n\n result.locked = true;\n }\n }\n\n // a move should be fired if:\n // - there are no modifiers enabled,\n // - no modifiers are \"locked\" i.e. have changed the pointer's coordinates, or\n // - the locked coords have changed since the last pointer move\n result.shouldMove = !arg.status || !result.locked || arg.status.changed;\n\n return result;\n },\n\n resetStatuses: function (statuses) {\n for (const modifierName of modifiers.names) {\n const status = statuses[modifierName] || {};\n\n status.dx = status.dy = 0;\n status.modifiedX = status.modifiedY = NaN;\n status.locked = false;\n status.changed = true;\n\n statuses[modifierName] = status;\n }\n\n return statuses;\n },\n\n start: function ({ interaction }, signalName) {\n const arg = {\n interaction,\n pageCoords: (signalName === 'action-resume' ?\n interaction.curCoords : interaction.startCoords).page,\n startOffset: interaction.startOffset,\n statuses: interaction.modifierStatuses,\n preEnd: false,\n requireEndOnly: false,\n };\n\n modifiers.setOffsets(arg);\n modifiers.resetStatuses(arg.statuses);\n\n arg.pageCoords = extend({}, interaction.startCoords.page);\n interaction.modifierResult = modifiers.setAll(arg);\n },\n};\n\nInteraction.signals.on('new', function (interaction) {\n interaction.startOffset = { left: 0, right: 0, top: 0, bottom: 0 };\n interaction.modifierOffsets = {};\n interaction.modifierStatuses = modifiers.resetStatuses({});\n interaction.modifierResult = null;\n});\n\nInteraction.signals.on('action-start' , modifiers.start);\nInteraction.signals.on('action-resume', modifiers.start);\n\nInteraction.signals.on('before-action-move', function ({ interaction, preEnd, interactingBeforeMove }) {\n const modifierResult = modifiers.setAll({\n interaction,\n preEnd,\n pageCoords: interaction.curCoords.page,\n statuses: interaction.modifierStatuses,\n requireEndOnly: false,\n });\n\n // don't fire an action move if a modifier would keep the event in the same\n // cordinates as before\n if (!modifierResult.shouldMove && interactingBeforeMove) {\n interaction._dontFireMove = true;\n }\n\n interaction.modifierResult = modifierResult;\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n for (let i = 0; i < modifiers.names.length; i++) {\n const options = interaction.target.options[interaction.prepared.name][modifiers.names[i]];\n\n // if the endOnly option is true for any modifier\n if (shouldDo(options, true, true)) {\n // fire a move event at the modified coordinates\n interaction.doMove({ event, preEnd: true });\n break;\n }\n }\n});\n\nInteractEvent.signals.on('set-xy', function (arg) {\n const { iEvent, interaction } = arg;\n const modifierArg = extend({}, arg);\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n modifierArg.options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!modifierArg.options) {\n continue;\n }\n\n const modifier = modifiers[modifierName];\n\n modifierArg.status = interaction.modifierStatuses[modifierName];\n\n iEvent[modifierName] = modifier.modifyCoords(modifierArg);\n }\n});\n\nfunction shouldDo (options, preEnd, requireEndOnly) {\n return (options && options.enabled\n && (preEnd || !options.endOnly)\n && (!requireEndOnly || options.endOnly));\n}\n\nmodule.exports = modifiers;\n","const modifiers = require('./index');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst restrict = {\n defaults: {\n enabled : false,\n endOnly : false,\n restriction: null,\n elementRect: null,\n },\n\n setOffset: function ({ rect, startOffset, options }) {\n const elementRect = options && options.elementRect;\n const offset = {};\n\n if (rect && elementRect) {\n offset.left = startOffset.left - (rect.width * elementRect.left);\n offset.top = startOffset.top - (rect.height * elementRect.top);\n\n offset.right = startOffset.right - (rect.width * (1 - elementRect.right));\n offset.bottom = startOffset.bottom - (rect.height * (1 - elementRect.bottom));\n }\n else {\n offset.left = offset.top = offset.right = offset.bottom = 0;\n }\n\n return offset;\n },\n\n set: function ({ pageCoords, interaction, status, options }) {\n if (!options) { return status; }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n\n const restriction = getRestrictionRect(options.restriction, interaction, page);\n\n if (!restriction) { return status; }\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n const rect = restriction;\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n const offset = interaction.modifierOffsets.restrict;\n\n // object is assumed to have\n // x, y, width, height or\n // left, top, right, bottom\n if ('x' in restriction && 'y' in restriction) {\n modifiedX = Math.max(Math.min(rect.x + rect.width - offset.right , page.x), rect.x + offset.left);\n modifiedY = Math.max(Math.min(rect.y + rect.height - offset.bottom, page.y), rect.y + offset.top );\n }\n else {\n modifiedX = Math.max(Math.min(rect.right - offset.right , page.x), rect.left + offset.left);\n modifiedY = Math.max(Math.min(rect.bottom - offset.bottom, page.y), rect.top + offset.top );\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const elementRect = options && options.elementRect;\n\n if (options && options.enabled\n && !(phase === 'start' && elementRect && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n getRestrictionRect,\n};\n\nfunction getRestrictionRect (value, interaction, page) {\n if (utils.is.function(value)) {\n return utils.resolveRectLike(value, interaction.target, interaction.element, [page.x, page.y, interaction]);\n } else {\n return utils.resolveRectLike(value, interaction.target, interaction.element);\n }\n}\n\nmodifiers.restrict = restrict;\nmodifiers.names.push('restrict');\n\ndefaultOptions.perAction.restrict = restrict.defaults;\n\nmodule.exports = restrict;\n","// This module adds the options.resize.restrictEdges setting which sets min and\n// max for the top, left, bottom and right edges of the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictEdges: {\n// inner: { top: 200, left: 200, right: 400, bottom: 400 },\n// outer: { top: 0, left: 0, right: 600, bottom: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst { getRestrictionRect } = require('./restrict');\n\nconst noInner = { top: +Infinity, left: +Infinity, bottom: -Infinity, right: -Infinity };\nconst noOuter = { top: -Infinity, left: -Infinity, bottom: +Infinity, right: +Infinity };\n\nconst restrictEdges = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n offset: null,\n },\n\n setOffset: function ({ interaction, startOffset, options }) {\n if (!options) {\n return utils.extend({}, startOffset);\n }\n\n const offset = getRestrictionRect(options.offset, interaction, interaction.startCoords.page);\n\n if (offset) {\n return {\n top: startOffset.top + offset.y,\n left: startOffset.left + offset.x,\n bottom: startOffset.bottom + offset.y,\n right: startOffset.right + offset.x,\n };\n }\n\n return startOffset;\n },\n\n set: function ({ pageCoords, interaction, status, offset, options }) {\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n const inner = rectUtils.xywhToTlbr(getRestrictionRect(options.inner, interaction, page)) || noInner;\n const outer = rectUtils.xywhToTlbr(getRestrictionRect(options.outer, interaction, page)) || noOuter;\n\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n if (edges.top) {\n modifiedY = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top);\n }\n else if (edges.bottom) {\n modifiedY = Math.max(Math.min(outer.bottom - offset.bottom, page.y), inner.bottom - offset.bottom);\n }\n if (edges.left) {\n modifiedX = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left);\n }\n else if (edges.right) {\n modifiedX = Math.max(Math.min(outer.right - offset.right, page.x), inner.right - offset.right);\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n if (options && options.enabled\n && !(phase === 'start' && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n noInner,\n noOuter,\n getRestrictionRect,\n};\n\nmodifiers.restrictEdges = restrictEdges;\nmodifiers.names.push('restrictEdges');\n\ndefaultOptions.perAction.restrictEdges = restrictEdges.defaults;\nresize.defaults.restrictEdges = restrictEdges.defaults;\n\nmodule.exports = restrictEdges;\n","// This module adds the options.resize.restrictSize setting which sets min and\n// max width and height for the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictSize: {\n// min: { width: -600, height: -600 },\n// max: { width: 600, height: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst restrictEdges = require('./restrictEdges');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst noMin = { width: -Infinity, height: -Infinity };\nconst noMax = { width: +Infinity, height: +Infinity };\n\nconst restrictSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n },\n\n setOffset: function ({ interaction }) {\n return interaction.startOffset;\n },\n\n set: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const rect = rectUtils.xywhToTlbr(interaction.resizeRects.inverted);\n\n const minSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.min, interaction)) || noMin;\n const maxSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.max, interaction)) || noMax;\n\n arg.options = {\n enabled: options.enabled,\n endOnly: options.endOnly,\n inner: utils.extend({}, restrictEdges.noInner),\n outer: utils.extend({}, restrictEdges.noOuter),\n };\n\n if (edges.top) {\n arg.options.inner.top = rect.bottom - minSize.height;\n arg.options.outer.top = rect.bottom - maxSize.height;\n }\n else if (edges.bottom) {\n arg.options.inner.bottom = rect.top + minSize.height;\n arg.options.outer.bottom = rect.top + maxSize.height;\n }\n if (edges.left) {\n arg.options.inner.left = rect.right - minSize.width;\n arg.options.outer.left = rect.right - maxSize.width;\n }\n else if (edges.right) {\n arg.options.inner.right = rect.left + minSize.width;\n arg.options.outer.right = rect.left + maxSize.width;\n }\n\n restrictEdges.set(arg);\n },\n\n modifyCoords: restrictEdges.modifyCoords,\n};\n\nmodifiers.restrictSize = restrictSize;\nmodifiers.names.push('restrictSize');\n\ndefaultOptions.perAction.restrictSize = restrictSize.defaults;\nresize.defaults.restrictSize = restrictSize.defaults;\n\nmodule.exports = restrictSize;\n","const modifiers = require('./index');\nconst interact = require('../interact');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst snap = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n\n relativePoints: null,\n },\n\n setOffset: function ({ interaction, interactable, element, rect, startOffset, options }) {\n const offsets = [];\n const optionsOrigin = utils.rectToXY(utils.resolveRectLike(options.origin));\n const origin = optionsOrigin || utils.getOriginXY(interactable, element, interaction.prepared.name);\n options = options || interactable.options[interaction.prepared.name].snap || {};\n\n let snapOffset;\n\n if (options.offset === 'startCoords') {\n snapOffset = {\n x: interaction.startCoords.page.x - origin.x,\n y: interaction.startCoords.page.y - origin.y,\n };\n }\n else {\n const offsetRect = utils.resolveRectLike(options.offset, interactable, element, [interaction]);\n\n snapOffset = utils.rectToXY(offsetRect) || { x: 0, y: 0 };\n }\n\n if (rect && options.relativePoints && options.relativePoints.length) {\n for (const { x: relativeX, y: relativeY } of options.relativePoints) {\n offsets.push({\n x: startOffset.left - (rect.width * relativeX) + snapOffset.x,\n y: startOffset.top - (rect.height * relativeY) + snapOffset.y,\n });\n }\n }\n else {\n offsets.push(snapOffset);\n }\n\n return offsets;\n },\n\n set: function ({ interaction, pageCoords, status, options, offset: offsets }) {\n const targets = [];\n let target;\n let page;\n let i;\n\n if (status.useStatusXY) {\n page = { x: status.x, y: status.y };\n }\n else {\n const origin = utils.getOriginXY(interaction.target, interaction.element, interaction.prepared.name);\n\n page = utils.extend({}, pageCoords);\n\n page.x -= origin.x;\n page.y -= origin.y;\n }\n\n status.realX = page.x;\n status.realY = page.y;\n\n let len = options.targets? options.targets.length : 0;\n\n for (const { x: offsetX, y: offsetY } of offsets) {\n const relativeX = page.x - offsetX;\n const relativeY = page.y - offsetY;\n\n for (const snapTarget of options.targets) {\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n targets.push({\n x: utils.is.number(target.x) ? (target.x + offsetX) : relativeX,\n y: utils.is.number(target.y) ? (target.y + offsetY) : relativeY,\n\n range: utils.is.number(target.range)? target.range: options.range,\n });\n }\n }\n\n const closest = {\n target: null,\n inRange: false,\n distance: 0,\n range: 0,\n dx: 0,\n dy: 0,\n };\n\n for (i = 0, len = targets.length; i < len; i++) {\n target = targets[i];\n\n const range = target.range;\n const dx = target.x - page.x;\n const dy = target.y - page.y;\n const distance = utils.hypot(dx, dy);\n let inRange = distance <= range;\n\n // Infinite targets count as being out of range\n // compared to non infinite ones that are in range\n if (range === Infinity && closest.inRange && closest.range !== Infinity) {\n inRange = false;\n }\n\n if (!closest.target || (inRange\n // is the closest target in range?\n ? (closest.inRange && range !== Infinity\n // the pointer is relatively deeper in this target\n ? distance / range < closest.distance / closest.range\n // this target has Infinite range and the closest doesn't\n : (range === Infinity && closest.range !== Infinity)\n // OR this target is closer that the previous closest\n || distance < closest.distance)\n // The other is not in range and the pointer is closer to this target\n : (!closest.inRange && distance < closest.distance))) {\n\n closest.target = target;\n closest.distance = distance;\n closest.range = range;\n closest.inRange = inRange;\n closest.dx = dx;\n closest.dy = dy;\n\n status.range = range;\n }\n }\n\n let snapChanged;\n\n if (closest.target) {\n snapChanged = (status.modifiedX !== closest.target.x || status.modifiedY !== closest.target.y);\n\n status.modifiedX = closest.target.x;\n status.modifiedY = closest.target.y;\n }\n else {\n snapChanged = true;\n\n status.modifiedX = NaN;\n status.modifiedY = NaN;\n }\n\n status.dx = closest.dx;\n status.dy = closest.dy;\n\n status.changed = (snapChanged || (closest.inRange && !status.locked));\n status.locked = closest.inRange;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const relativePoints = options && options.relativePoints;\n\n if (options && options.enabled\n && !(phase === 'start' && relativePoints && relativePoints.length)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n }\n\n return {\n range : status.range,\n locked : status.locked,\n x : status.modifiedX,\n y : status.modifiedY,\n realX : status.realX,\n realY : status.realY,\n dx : status.dx,\n dy : status.dy,\n };\n }\n },\n};\n\ninteract.createSnapGrid = function (grid) {\n return function (x, y) {\n const limits = grid.limits || {\n left : -Infinity,\n right : Infinity,\n top : -Infinity,\n bottom: Infinity,\n };\n let offsetX = 0;\n let offsetY = 0;\n\n if (utils.is.object(grid.offset)) {\n offsetX = grid.offset.x;\n offsetY = grid.offset.y;\n }\n\n const gridx = Math.round((x - offsetX) / grid.x);\n const gridy = Math.round((y - offsetY) / grid.y);\n\n const newX = Math.max(limits.left, Math.min(limits.right , gridx * grid.x + offsetX));\n const newY = Math.max(limits.top , Math.min(limits.bottom, gridy * grid.y + offsetY));\n\n return {\n x: newX,\n y: newY,\n range: grid.range,\n };\n };\n};\n\nmodifiers.snap = snap;\nmodifiers.names.push('snap');\n\ndefaultOptions.perAction.snap = snap.defaults;\n\nmodule.exports = snap;\n","// This module allows snapping of the size of targets during resize\n// interactions.\n\nconst modifiers = require('./index');\nconst snap = require('./snap');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\nconst utils = require('../utils/');\n\nconst snapSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n },\n\n setOffset: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.edges;\n\n if (!edges) { return; }\n\n arg.options = {\n relativePoints: [{\n x: edges.left? 0 : 1,\n y: edges.top ? 0 : 1,\n }],\n origin: { x: 0, y: 0 },\n offset: 'self',\n range: options.range,\n };\n\n const offsets = snap.setOffset(arg);\n arg.options = options;\n\n return offsets;\n },\n\n set: function (arg) {\n const { interaction, options, offset, pageCoords } = arg;\n const page = utils.extend({}, pageCoords);\n const relativeX = page.x - offset[0].x;\n const relativeY = page.y - offset[0].y;\n\n arg.options = utils.extend({}, options);\n arg.options.targets = [];\n\n for (const snapTarget of options.targets) {\n let target;\n\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n if ('width' in target && 'height' in target) {\n target.x = target.width;\n target.y = target.height;\n }\n\n arg.options.targets.push(target);\n }\n\n snap.set(arg);\n },\n\n modifyCoords: function (arg) {\n const { options } = arg;\n\n arg.options = utils.extend({}, options);\n arg.options.enabled = options.enabled;\n arg.options.relativePoints = [null];\n\n snap.modifyCoords(arg);\n },\n};\n\nmodifiers.snapSize = snapSize;\nmodifiers.names.push('snapSize');\n\ndefaultOptions.perAction.snapSize = snapSize.defaults;\nresize.defaults.snapSize = snapSize.defaults;\n\nmodule.exports = snapSize;\n","const pointerUtils = require('../utils/pointerUtils');\n\nmodule.exports = class PointerEvent {\n constructor (type, pointer, event, eventTarget, interaction) {\n pointerUtils.pointerExtend(this, event);\n\n if (event !== pointer) {\n pointerUtils.pointerExtend(this, pointer);\n }\n\n this.interaction = interaction;\n\n this.timeStamp = new Date().getTime();\n this.originalEvent = event;\n this.type = type;\n this.pointerId = pointerUtils.getPointerId(pointer);\n this.pointerType = pointerUtils.getPointerType(pointer, interaction);\n this.target = eventTarget;\n this.currentTarget = null;\n\n if (type === 'tap') {\n const pointerIndex = interaction.getPointerIndex(pointer);\n this.dt = this.timeStamp - interaction.downTimes[pointerIndex];\n\n const interval = this.timeStamp - interaction.tapTime;\n\n this.double = !!(interaction.prevTap\n && interaction.prevTap.type !== 'doubletap'\n && interaction.prevTap.target === this.target\n && interval < 500);\n }\n else if (type === 'doubletap') {\n this.dt = pointer.timeStamp - interaction.tapTime;\n }\n }\n\n subtractOrigin ({ x: originX, y: originY }) {\n this.pageX -= originX;\n this.pageY -= originY;\n this.clientX -= originX;\n this.clientY -= originY;\n\n return this;\n }\n\n addOrigin ({ x: originX, y: originY }) {\n this.pageX += originX;\n this.pageY += originY;\n this.clientX += originX;\n this.clientY += originY;\n\n return this;\n }\n\n preventDefault () {\n this.originalEvent.preventDefault();\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n};\n","const PointerEvent = require('./PointerEvent');\nconst Interaction = require('../Interaction');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst defaults = require('../defaultOptions');\nconst signals = require('../utils/Signals').new();\nconst { filter } = require('../utils/arr');\n\nconst simpleSignals = [ 'down', 'up', 'cancel' ];\nconst simpleEvents = [ 'down', 'up', 'cancel' ];\n\nconst pointerEvents = {\n PointerEvent,\n fire,\n collectEventTargets,\n signals,\n defaults: {\n holdDuration: 600,\n ignoreFrom : null,\n allowFrom : null,\n origin : { x: 0, y: 0 },\n },\n types: [\n 'down',\n 'move',\n 'up',\n 'cancel',\n 'tap',\n 'doubletap',\n 'hold',\n ],\n};\n\nfunction fire (arg) {\n const {\n interaction, pointer, event, eventTarget,\n type = arg.pointerEvent.type,\n targets = collectEventTargets(arg),\n pointerEvent = new PointerEvent(type, pointer, event, eventTarget, interaction),\n } = arg;\n\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n targets,\n type,\n pointerEvent,\n };\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n\n for (const prop in target.props || {}) {\n pointerEvent[prop] = target.props[prop];\n }\n\n const origin = utils.getOriginXY(target.eventable, target.element);\n\n pointerEvent.subtractOrigin(origin);\n pointerEvent.eventable = target.eventable;\n pointerEvent.currentTarget = target.element;\n\n target.eventable.fire(pointerEvent);\n\n pointerEvent.addOrigin(origin);\n\n if (pointerEvent.immediatePropagationStopped\n || (pointerEvent.propagationStopped\n && (i + 1) < targets.length && targets[i + 1].element !== pointerEvent.currentTarget)) {\n break;\n }\n }\n\n signals.fire('fired', signalArg);\n\n if (type === 'tap') {\n // if pointerEvent should make a double tap, create and fire a doubletap\n // PointerEvent and use that as the prevTap\n const prevTap = pointerEvent.double\n ? fire({\n interaction, pointer, event, eventTarget,\n type: 'doubletap',\n })\n : pointerEvent;\n\n interaction.prevTap = prevTap;\n interaction.tapTime = prevTap.timeStamp;\n }\n\n return pointerEvent;\n}\n\nfunction collectEventTargets ({ interaction, pointer, event, eventTarget, type }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n // do not fire a tap event if the pointer was moved before being lifted\n if (type === 'tap' && (interaction.pointerWasMoved\n // or if the pointerup target is different to the pointerdown target\n || !(interaction.downTargets[pointerIndex] && interaction.downTargets[pointerIndex] === eventTarget))) {\n return [];\n }\n\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n path,\n targets: [],\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (type === 'hold') {\n signalArg.targets = filter(signalArg.targets, target =>\n target.eventable.options.holdDuration === interaction.holdTimers[pointerIndex].duration);\n }\n\n return signalArg.targets;\n}\n\nInteraction.signals.on('update-pointer-down', function ({ interaction, pointerIndex }) {\n interaction.holdTimers[pointerIndex] = { duration: Infinity, timeout: null };\n});\n\nInteraction.signals.on('remove-pointer', function ({ interaction, pointerIndex }) {\n interaction.holdTimers.splice(pointerIndex, 1);\n});\n\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget, duplicateMove }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n if (!duplicateMove && (!interaction.pointerIsDown || interaction.pointerWasMoved)) {\n if (interaction.pointerIsDown) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n\n fire({\n interaction, pointer, event, eventTarget,\n type: 'move',\n });\n }\n});\n\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget, pointerIndex }) {\n // copy event to be used in timeout for IE8\n const eventCopy = browser.isIE8? utils.extend({}, event) : event;\n\n const timer = interaction.holdTimers[pointerIndex];\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'hold',\n targets: [],\n path,\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (!signalArg.targets.length) { return; }\n\n let minDuration = Infinity;\n\n for (let i = 0; i < signalArg.targets.length; i++) {\n const target = signalArg.targets[i];\n const holdDuration = target.eventable.options.holdDuration;\n\n if (holdDuration < minDuration) {\n minDuration = holdDuration;\n }\n }\n\n timer.duration = minDuration;\n timer.timeout = setTimeout(function () {\n fire({\n interaction, eventCopy, eventTarget,\n pointer: browser.isIE8? eventCopy : pointer,\n type: 'hold',\n });\n }, minDuration);\n});\n\nInteraction.signals.on('up', ({ interaction, pointer, event, eventTarget }) => {\n if (!interaction.pointerWasMoved) {\n fire({ interaction, eventTarget, pointer, event, type: 'tap' });\n }\n});\n\n['up', 'cancel'].forEach(function (signalName) {\n Interaction.signals.on(signalName, function ({ interaction, pointerIndex }) {\n if (interaction.holdTimers[pointerIndex]) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n });\n});\n\nfunction createSignalListener (type) {\n return function ({ interaction, pointer, event, eventTarget }) {\n fire({ interaction, eventTarget, pointer, event, type });\n };\n}\n\nfor (let i = 0; i < simpleSignals.length; i++) {\n Interaction.signals.on(simpleSignals[i], createSignalListener(simpleEvents[i]));\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.prevTap = null; // the most recent tap event on this interaction\n interaction.tapTime = 0; // time of the most recent tap event\n interaction.holdTimers = []; // [{ duration, timeout }]\n});\n\ndefaults.pointerEvents = pointerEvents.defaults;\nmodule.exports = pointerEvents;\n","const pointerEvents = require('./base');\nconst Interaction = require('../Interaction');\n\npointerEvents.signals.on('new', onNew);\npointerEvents.signals.on('fired', onFired);\n\nfor (const signal of ['move', 'up', 'cancel', 'endall']) {\n Interaction.signals.on(signal, endHoldRepeat);\n}\n\nfunction onNew ({ pointerEvent }) {\n if (pointerEvent.type !== 'hold') { return; }\n\n pointerEvent.count = (pointerEvent.count || 0) + 1;\n}\n\nfunction onFired ({ interaction, pointerEvent, eventTarget, targets }) {\n if (pointerEvent.type !== 'hold' || !targets.length) { return; }\n\n // get the repeat interval from the first eventable\n const interval = targets[0].eventable.options.holdRepeatInterval;\n\n // don't repeat if the interval is 0 or less\n if (interval <= 0) { return; }\n\n // set a timeout to fire the holdrepeat event\n interaction.holdIntervalHandle = setTimeout(function () {\n pointerEvents.fire({\n interaction,\n eventTarget,\n type: 'hold',\n pointer: pointerEvent,\n event: pointerEvent,\n });\n }, interval);\n}\n\nfunction endHoldRepeat ({ interaction }) {\n // set the interaction's holdStopTime property\n // to stop further holdRepeat events\n if (interaction.holdIntervalHandle) {\n clearInterval(interaction.holdIntervalHandle);\n interaction.holdIntervalHandle = null;\n }\n}\n\n// don't repeat by default\npointerEvents.defaults.holdRepeatInterval = 0;\npointerEvents.types.push('holdrepeat');\n\nmodule.exports = {\n onNew,\n onFired,\n endHoldRepeat,\n};\n","const pointerEvents = require('./base');\nconst Interactable = require('../Interactable');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\nconst scope = require('../scope');\nconst extend = require('../utils/extend');\nconst { merge } = require('../utils/arr');\n\npointerEvents.signals.on('collect-targets', function ({ targets, element, type, eventTarget }) {\n function collectSelectors (interactable, selector, context) {\n const els = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && is.element(element)\n && domUtils.matchesSelector(element, selector, els)\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n const interactable = scope.interactables.get(element);\n\n if (interactable) {\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n scope.interactables.forEachSelector(collectSelectors, element);\n});\n\nInteractable.signals.on('new', function ({ interactable }) {\n interactable.events.getRect = function (element) {\n return interactable.getRect(element);\n };\n});\n\nInteractable.signals.on('set', function ({ interactable, options }) {\n extend(interactable.events.options, pointerEvents.defaults);\n extend(interactable.events.options, options);\n});\n\nmerge(Interactable.eventTypes, pointerEvents.types);\n\nInteractable.prototype.pointerEvents = function (options) {\n extend(this.events.options, options);\n\n return this;\n};\n\nconst __backCompatOption = Interactable.prototype._backCompatOption;\n\nInteractable.prototype._backCompatOption = function (optionName, newValue) {\n const ret = __backCompatOption.call(this, optionName, newValue);\n\n if (ret === this) {\n this.events.options[optionName] = newValue;\n }\n\n return ret;\n};\n\nInteractable.settingsMethods.push('pointerEvents');\n","const utils = require('./utils');\nconst events = require('./utils/events');\nconst signals = require('./utils/Signals').new();\n\nconst scope = {\n signals,\n events,\n utils,\n\n // main document\n document: require('./utils/domObjects').document,\n // all documents being listened to\n documents: [],\n\n addDocument: function (doc, win) {\n // do nothing if document is already known\n if (utils.contains(scope.documents, doc)) { return false; }\n\n win = win || scope.getWindow(doc);\n\n scope.documents.push(doc);\n events.documents.push(doc);\n\n // don't add an unload event for the main document\n // so that the page may be cached in browser history\n if (doc !== scope.document) {\n events.add(win, 'unload', scope.onWindowUnload);\n }\n\n signals.fire('add-document', { doc, win });\n },\n\n removeDocument: function (doc, win) {\n const index = utils.indexOf(scope.documents, doc);\n\n win = win || scope.getWindow(doc);\n\n events.remove(win, 'unload', scope.onWindowUnload);\n\n scope.documents.splice(index, 1);\n events.documents.splice(index, 1);\n\n signals.fire('remove-document', { win, doc });\n },\n\n onWindowUnload: function () {\n scope.removeDocument(this.document, this);\n },\n};\n\nmodule.exports = scope;\n","const { indexOf } = require('./arr');\n\nclass Signals {\n constructor () {\n this.listeners = {\n // signalName: [listeners],\n };\n }\n\n on (name, listener) {\n if (!this.listeners[name]) {\n this.listeners[name] = [listener];\n return;\n }\n\n this.listeners[name].push(listener);\n }\n\n off (name, listener) {\n if (!this.listeners[name]) { return; }\n\n const index = indexOf(this.listeners[name], listener);\n\n if (index !== -1) {\n this.listeners[name].splice(index, 1);\n }\n }\n\n fire (name, arg) {\n const targetListeners = this.listeners[name];\n\n if (!targetListeners) { return; }\n\n for (let i = 0; i < targetListeners.length; i++) {\n if (targetListeners[i](arg, name) === false) {\n return;\n }\n }\n }\n}\n\nSignals.new = function () {\n return new Signals();\n};\n\nmodule.exports = Signals;\n","function indexOf (array, target) {\n for (let i = 0, len = array.length; i < len; i++) {\n if (array[i] === target) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction contains (array, target) {\n return indexOf(array, target) !== -1;\n}\n\nfunction merge (target, source) {\n for (let i = 0; i < source.length; i++) {\n target.push(source[i]);\n }\n\n return target;\n}\n\nfunction filter (array, test) {\n const result = [];\n\n for (let i = 0; i < array.length; i++) {\n if (test(array[i])) {\n result.push(array[i]);\n }\n }\n\n return result;\n}\n\nmodule.exports = {\n indexOf,\n contains,\n merge,\n filter,\n};\n","const { window } = require('./window');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst Element = domObjects.Element;\nconst navigator = window.navigator;\n\nconst browser = {\n // Does the browser support touch input?\n supportsTouch: !!(('ontouchstart' in window) || is.function(window.DocumentTouch)\n && domObjects.document instanceof window.DocumentTouch),\n\n // Does the browser support PointerEvents\n supportsPointerEvent: !!domObjects.PointerEvent,\n\n isIE8: ('attachEvent' in window) && !('addEventListener' in window),\n\n // Opera Mobile must be handled differently\n isOperaMobile: (navigator.appName === 'Opera'\n && browser.supportsTouch\n && navigator.userAgent.match('Presto')),\n\n // scrolling doesn't change the result of getClientRects on iOS 7\n isIOS7: (/iP(hone|od|ad)/.test(navigator.platform)\n && /OS 7[^\\d]/.test(navigator.appVersion)),\n\n isIe9OrOlder: /MSIE (8|9)/.test(navigator.userAgent),\n\n // prefix matchesSelector\n prefixedMatchesSelector: 'matches' in Element.prototype\n ? 'matches': 'webkitMatchesSelector' in Element.prototype\n ? 'webkitMatchesSelector': 'mozMatchesSelector' in Element.prototype\n ? 'mozMatchesSelector': 'oMatchesSelector' in Element.prototype\n ? 'oMatchesSelector': 'msMatchesSelector',\n\n useMatchesSelectorPolyfill: false,\n\n pEventTypes: (domObjects.PointerEvent\n ? (domObjects.PointerEvent === window.MSPointerEvent\n ? {\n up: 'MSPointerUp',\n down: 'MSPointerDown',\n over: 'mouseover',\n out: 'mouseout',\n move: 'MSPointerMove',\n cancel: 'MSPointerCancel',\n }\n : {\n up: 'pointerup',\n down: 'pointerdown',\n over: 'pointerover',\n out: 'pointerout',\n move: 'pointermove',\n cancel: 'pointercancel',\n })\n : null),\n\n // because Webkit and Opera still use 'mousewheel' event type\n wheelEvent: 'onmousewheel' in domObjects.document? 'mousewheel': 'wheel',\n\n};\n\nbrowser.useMatchesSelectorPolyfill = !is.function(Element.prototype[browser.prefixedMatchesSelector]);\n\nmodule.exports = browser;\n","const domObjects = {};\nconst win = require('./window').window;\n\nfunction blank () {}\n\ndomObjects.document = win.document;\ndomObjects.DocumentFragment = win.DocumentFragment || blank;\ndomObjects.SVGElement = win.SVGElement || blank;\ndomObjects.SVGSVGElement = win.SVGSVGElement || blank;\ndomObjects.SVGElementInstance = win.SVGElementInstance || blank;\ndomObjects.Element = win.Element || blank;\ndomObjects.HTMLElement = win.HTMLElement || domObjects.Element;\n\ndomObjects.Event = win.Event;\ndomObjects.Touch = win.Touch || blank;\ndomObjects.PointerEvent = (win.PointerEvent || win.MSPointerEvent);\n\nmodule.exports = domObjects;\n","const win = require('./window');\nconst browser = require('./browser');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst domUtils = {\n nodeContains: function (parent, child) {\n while (child) {\n if (child === parent) {\n return true;\n }\n\n child = child.parentNode;\n }\n\n return false;\n },\n\n closest: function (element, selector) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) { return element; }\n\n element = domUtils.parentNode(element);\n }\n\n return null;\n },\n\n parentNode: function (node) {\n let parent = node.parentNode;\n\n if (is.docFrag(parent)) {\n // skip past #shado-root fragments\n while ((parent = parent.host) && is.docFrag(parent)) {\n continue;\n }\n\n return parent;\n }\n\n return parent;\n },\n\n // taken from http://tanalin.com/en/blog/2012/12/matches-selector-ie8/ and modified\n matchesSelectorPolyfill: browser.useMatchesSelectorPolyfill\n ? function (element, selector, elems) {\n elems = elems || element.parentNode.querySelectorAll(selector);\n\n for (let i = 0, len = elems.length; i < len; i++) {\n if (elems[i] === element) {\n return true;\n }\n }\n\n return false;\n }\n : null,\n\n matchesSelector: function (element, selector, nodeList) {\n if (browser.useMatchesSelectorPolyfill) {\n return domUtils.matchesSelectorPolyfill(element, selector, nodeList);\n }\n\n // remove /deep/ from selectors if shadowDOM polyfill is used\n if (win.window !== win.realWindow) {\n selector = selector.replace(/\\/deep\\//g, ' ');\n }\n\n return element[browser.prefixedMatchesSelector](selector);\n },\n\n // Test for the element that's \"above\" all other qualifiers\n indexOfDeepestElement: function (elements) {\n let deepestZoneParents = [];\n let dropzoneParents = [];\n let dropzone;\n let deepestZone = elements[0];\n let index = deepestZone? 0: -1;\n let parent;\n let child;\n let i;\n let n;\n\n for (i = 1; i < elements.length; i++) {\n dropzone = elements[i];\n\n // an element might belong to multiple selector dropzones\n if (!dropzone || dropzone === deepestZone) {\n continue;\n }\n\n if (!deepestZone) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n // check if the deepest or current are document.documentElement or document.rootElement\n // - if the current dropzone is, do nothing and continue\n if (dropzone.parentNode === dropzone.ownerDocument) {\n continue;\n }\n // - if deepest is, update with the current dropzone and continue to next\n else if (deepestZone.parentNode === dropzone.ownerDocument) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n if (!deepestZoneParents.length) {\n parent = deepestZone;\n while (parent.parentNode && parent.parentNode !== parent.ownerDocument) {\n deepestZoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n }\n\n // if this element is an svg element and the current deepest is\n // an HTMLElement\n if (deepestZone instanceof domObjects.HTMLElement\n && dropzone instanceof domObjects.SVGElement\n && !(dropzone instanceof domObjects.SVGSVGElement)) {\n\n if (dropzone === deepestZone.parentNode) {\n continue;\n }\n\n parent = dropzone.ownerSVGElement;\n }\n else {\n parent = dropzone;\n }\n\n dropzoneParents = [];\n\n while (parent.parentNode !== parent.ownerDocument) {\n dropzoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n\n n = 0;\n\n // get (position of last common ancestor) + 1\n while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) {\n n++;\n }\n\n const parents = [\n dropzoneParents[n - 1],\n dropzoneParents[n],\n deepestZoneParents[n],\n ];\n\n child = parents[0].lastChild;\n\n while (child) {\n if (child === parents[1]) {\n deepestZone = dropzone;\n index = i;\n deepestZoneParents = [];\n\n break;\n }\n else if (child === parents[2]) {\n break;\n }\n\n child = child.previousSibling;\n }\n }\n\n return index;\n },\n\n matchesUpTo: function (element, selector, limit) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) {\n return true;\n }\n\n element = domUtils.parentNode(element);\n\n if (element === limit) {\n return domUtils.matchesSelector(element, selector);\n }\n }\n\n return false;\n },\n\n getActualElement: function (element) {\n return (element instanceof domObjects.SVGElementInstance\n ? element.correspondingUseElement\n : element);\n },\n\n getScrollXY: function (relevantWindow) {\n relevantWindow = relevantWindow || win.window;\n return {\n x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft,\n y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop,\n };\n },\n\n getElementClientRect: function (element) {\n const clientRect = (element instanceof domObjects.SVGElement\n ? element.getBoundingClientRect()\n : element.getClientRects()[0]);\n\n return clientRect && {\n left : clientRect.left,\n right : clientRect.right,\n top : clientRect.top,\n bottom: clientRect.bottom,\n width : clientRect.width || clientRect.right - clientRect.left,\n height: clientRect.height || clientRect.bottom - clientRect.top,\n };\n },\n\n getElementRect: function (element) {\n const clientRect = domUtils.getElementClientRect(element);\n\n if (!browser.isIOS7 && clientRect) {\n const scroll = domUtils.getScrollXY(win.getWindow(element));\n\n clientRect.left += scroll.x;\n clientRect.right += scroll.x;\n clientRect.top += scroll.y;\n clientRect.bottom += scroll.y;\n }\n\n return clientRect;\n },\n\n getPath: function (element) {\n const path = [];\n\n while (element) {\n path.push(element);\n element = domUtils.parentNode(element);\n }\n\n return path;\n },\n\n trySelector: value => {\n if (!is.string(value)) { return false; }\n\n // an exception will be raised if it is invalid\n domObjects.document.querySelector(value);\n return true;\n },\n};\n\nmodule.exports = domUtils;\n","const is = require('./is');\nconst domUtils = require('./domUtils');\nconst pExtend = require('./pointerExtend');\n\nconst { window, getWindow } = require('./window');\nconst { indexOf, contains } = require('./arr');\n\nconst useAttachEvent = ('attachEvent' in window) && !('addEventListener' in window);\nconst addEvent = useAttachEvent? 'attachEvent': 'addEventListener';\nconst removeEvent = useAttachEvent? 'detachEvent': 'removeEventListener';\nconst on = useAttachEvent? 'on': '';\n\nconst elements = [];\nconst targets = [];\nconst attachedListeners = [];\n\n// {\n// type: {\n// selectors: ['selector', ...],\n// contexts : [document, ...],\n// listeners: [[listener, capture, passive], ...]\n// }\n// }\nconst delegatedEvents = {};\n\nconst documents = [];\n\nconst supportsOptions = !useAttachEvent && (() => {\n let supported = false;\n\n window.document.createElement('div').addEventListener('test', null, {\n get capture () { supported = true; },\n });\n\n return supported;\n})();\n\nfunction add (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n let elementIndex = indexOf(elements, element);\n let target = targets[elementIndex];\n\n if (!target) {\n target = {\n events: {},\n typeCount: 0,\n };\n\n elementIndex = elements.push(element) - 1;\n targets.push(target);\n\n attachedListeners.push(useAttachEvent\n ? {\n supplied: [],\n wrapped : [],\n useCount: [],\n }\n : null);\n }\n\n if (!target.events[type]) {\n target.events[type] = [];\n target.typeCount++;\n }\n\n if (!contains(target.events[type], listener)) {\n let ret;\n\n if (useAttachEvent) {\n const { supplied, wrapped, useCount } = attachedListeners[elementIndex];\n const listenerIndex = indexOf(supplied, listener);\n\n const wrappedListener = wrapped[listenerIndex] || function (event) {\n if (!event.immediatePropagationStopped) {\n event.target = event.srcElement;\n event.currentTarget = element;\n\n event.preventDefault = event.preventDefault || preventDef;\n event.stopPropagation = event.stopPropagation || stopProp;\n event.stopImmediatePropagation = event.stopImmediatePropagation || stopImmProp;\n\n if (/mouse|click/.test(event.type)) {\n event.pageX = event.clientX + getWindow(element).document.documentElement.scrollLeft;\n event.pageY = event.clientY + getWindow(element).document.documentElement.scrollTop;\n }\n\n listener(event);\n }\n };\n\n ret = element[addEvent](on + type, wrappedListener, !!options.capture);\n\n if (listenerIndex === -1) {\n supplied.push(listener);\n wrapped.push(wrappedListener);\n useCount.push(1);\n }\n else {\n useCount[listenerIndex]++;\n }\n }\n else {\n ret = element[addEvent](type, listener, supportsOptions? options : !!options.capture);\n }\n target.events[type].push(listener);\n\n return ret;\n }\n}\n\nfunction remove (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const elementIndex = indexOf(elements, element);\n const target = targets[elementIndex];\n\n if (!target || !target.events) {\n return;\n }\n\n let wrappedListener = listener;\n let listeners;\n let listenerIndex;\n\n if (useAttachEvent) {\n listeners = attachedListeners[elementIndex];\n listenerIndex = indexOf(listeners.supplied, listener);\n wrappedListener = listeners.wrapped[listenerIndex];\n }\n\n if (type === 'all') {\n for (type in target.events) {\n if (target.events.hasOwnProperty(type)) {\n remove(element, type, 'all');\n }\n }\n return;\n }\n\n if (target.events[type]) {\n const len = target.events[type].length;\n\n if (listener === 'all') {\n for (let i = 0; i < len; i++) {\n remove(element, type, target.events[type][i], options);\n }\n return;\n }\n else {\n for (let i = 0; i < len; i++) {\n if (target.events[type][i] === listener) {\n element[removeEvent](on + type, wrappedListener, supportsOptions? options : !!options.capture);\n target.events[type].splice(i, 1);\n\n if (useAttachEvent && listeners) {\n listeners.useCount[listenerIndex]--;\n if (listeners.useCount[listenerIndex] === 0) {\n listeners.supplied.splice(listenerIndex, 1);\n listeners.wrapped.splice(listenerIndex, 1);\n listeners.useCount.splice(listenerIndex, 1);\n }\n }\n\n break;\n }\n }\n }\n\n if (target.events[type] && target.events[type].length === 0) {\n target.events[type] = null;\n target.typeCount--;\n }\n }\n\n if (!target.typeCount) {\n targets.splice(elementIndex, 1);\n elements.splice(elementIndex, 1);\n attachedListeners.splice(elementIndex, 1);\n }\n}\n\nfunction addDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n if (!delegatedEvents[type]) {\n delegatedEvents[type] = {\n selectors: [],\n contexts : [],\n listeners: [],\n };\n\n // add delegate listener functions\n for (let i = 0; i < documents.length; i++) {\n add(documents[i], type, delegateListener);\n add(documents[i], type, delegateUseCapture, true);\n }\n }\n\n const delegated = delegatedEvents[type];\n let index;\n\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n break;\n }\n }\n\n if (index === -1) {\n index = delegated.selectors.length;\n\n delegated.selectors.push(selector);\n delegated.contexts .push(context);\n delegated.listeners.push([]);\n }\n\n // keep listener and capture and passive flags\n delegated.listeners[index].push([listener, !!options.capture, options.passive]);\n}\n\nfunction removeDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const delegated = delegatedEvents[type];\n let matchFound = false;\n let index;\n\n if (!delegated) { return; }\n\n // count from last index of delegated to 0\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n // look for matching selector and context Node\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n\n const listeners = delegated.listeners[index];\n\n // each item of the listeners array is an array: [function, capture, passive]\n for (let i = listeners.length - 1; i >= 0; i--) {\n const [fn, capture, passive] = listeners[i];\n\n // check if the listener functions and capture and passive flags match\n if (fn === listener && capture === !!options.capture && passive === options.passive) {\n // remove the listener from the array of listeners\n listeners.splice(i, 1);\n\n // if all listeners for this interactable have been removed\n // remove the interactable from the delegated arrays\n if (!listeners.length) {\n delegated.selectors.splice(index, 1);\n delegated.contexts .splice(index, 1);\n delegated.listeners.splice(index, 1);\n\n // remove delegate function from context\n remove(context, type, delegateListener);\n remove(context, type, delegateUseCapture, true);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegatedEvents[type] = null;\n }\n }\n\n // only remove one listener\n matchFound = true;\n break;\n }\n }\n\n if (matchFound) { break; }\n }\n }\n}\n\n// bound to the interactable context when a DOM event\n// listener is added to a selector interactable\nfunction delegateListener (event, optionalArg) {\n const options = getOptions(optionalArg);\n const fakeEvent = {};\n const delegated = delegatedEvents[event.type];\n const eventTarget = (domUtils.getActualElement(event.path\n ? event.path[0]\n : event.target));\n let element = eventTarget;\n\n // duplicate the event so that currentTarget can be changed\n pExtend(fakeEvent, event);\n\n fakeEvent.originalEvent = event;\n fakeEvent.preventDefault = preventOriginalDefault;\n\n // climb up document tree looking for selector matches\n while (is.element(element)) {\n for (let i = 0; i < delegated.selectors.length; i++) {\n const selector = delegated.selectors[i];\n const context = delegated.contexts[i];\n\n if (domUtils.matchesSelector(element, selector)\n && domUtils.nodeContains(context, eventTarget)\n && domUtils.nodeContains(context, element)) {\n\n const listeners = delegated.listeners[i];\n\n fakeEvent.currentTarget = element;\n\n for (let j = 0; j < listeners.length; j++) {\n const [fn, capture, passive] = listeners[j];\n\n if (capture === !!options.capture && passive === options.passive) {\n fn(fakeEvent);\n }\n }\n }\n }\n\n element = domUtils.parentNode(element);\n }\n}\n\nfunction delegateUseCapture (event) {\n return delegateListener.call(this, event, true);\n}\n\nfunction preventDef () {\n this.returnValue = false;\n}\n\nfunction preventOriginalDefault () {\n this.originalEvent.preventDefault();\n}\n\nfunction stopProp () {\n this.cancelBubble = true;\n}\n\nfunction stopImmProp () {\n this.cancelBubble = true;\n this.immediatePropagationStopped = true;\n}\n\nfunction getOptions (param) {\n return is.object(param)? param : { capture: param };\n}\n\nmodule.exports = {\n add,\n remove,\n\n addDelegate,\n removeDelegate,\n\n delegateListener,\n delegateUseCapture,\n delegatedEvents,\n documents,\n\n useAttachEvent,\n supportsOptions,\n\n _elements: elements,\n _targets: targets,\n _attachedListeners: attachedListeners,\n};\n","module.exports = function extend (dest, source) {\n for (const prop in source) {\n dest[prop] = source[prop];\n }\n return dest;\n};\n","const {\n resolveRectLike,\n rectToXY,\n} = require('./rect');\n\nmodule.exports = function (target, element, action) {\n const actionOptions = target.options[action];\n const actionOrigin = actionOptions && actionOptions.origin;\n const origin = actionOrigin || target.options.origin;\n\n const originRect = resolveRectLike(origin, target, element, [target && element]);\n\n return rectToXY(originRect) || { x: 0, y: 0 };\n};\n","module.exports = (x, y) => Math.sqrt(x * x + y * y);\n","const extend = require('./extend');\nconst win = require('./window');\n\nconst utils = {\n warnOnce: function (method, message) {\n let warned = false;\n\n return function () {\n if (!warned) {\n win.window.console.warn(message);\n warned = true;\n }\n\n return method.apply(this, arguments);\n };\n },\n\n // http://stackoverflow.com/a/5634528/2280888\n _getQBezierValue: function (t, p1, p2, p3) {\n const iT = 1 - t;\n return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3;\n },\n\n getQuadraticCurvePoint: function (startX, startY, cpX, cpY, endX, endY, position) {\n return {\n x: utils._getQBezierValue(position, startX, cpX, endX),\n y: utils._getQBezierValue(position, startY, cpY, endY),\n };\n },\n\n // http://gizma.com/easing/\n easeOutQuad: function (t, b, c, d) {\n t /= d;\n return -c * t*(t-2) + b;\n },\n\n copyAction: function (dest, src) {\n dest.name = src.name;\n dest.axis = src.axis;\n dest.edges = src.edges;\n\n return dest;\n },\n\n is : require('./is'),\n extend : extend,\n hypot : require('./hypot'),\n getOriginXY: require('./getOriginXY'),\n};\n\nextend(utils, require('./arr'));\nextend(utils, require('./domUtils'));\nextend(utils, require('./pointerUtils'));\nextend(utils, require('./rect'));\n\nmodule.exports = utils;\n","const scope = require('../scope');\nconst utils = require('./index');\nconst browser = require('./browser');\n\nconst finder = {\n methodOrder: [ 'simulationResume', 'mouse', 'hasPointer', 'idle' ],\n\n search: function (pointer, eventType, eventTarget) {\n const mouseEvent = (/mouse/i.test(pointer.pointerType || eventType)\n // MSPointerEvent.MSPOINTER_TYPE_MOUSE\n || pointer.pointerType === 4);\n const pointerId = utils.getPointerId(pointer);\n const details = { pointer, pointerId, mouseEvent, eventType, eventTarget };\n\n for (const method of finder.methodOrder) {\n const interaction = finder[method](details);\n\n if (interaction) {\n return interaction;\n }\n }\n },\n\n // try to resume simulation with a new pointer\n simulationResume: function ({ mouseEvent, eventType, eventTarget }) {\n if (!/down|start/i.test(eventType)) {\n return null;\n }\n\n for (const interaction of scope.interactions) {\n let element = eventTarget;\n\n if (interaction.simulation && interaction.simulation.allowResume\n && (interaction.mouse === mouseEvent)) {\n while (element) {\n // if the element is the interaction element\n if (element === interaction.element) {\n return interaction;\n }\n element = utils.parentNode(element);\n }\n }\n }\n\n return null;\n },\n\n // if it's a mouse interaction\n mouse: function ({ pointerId, mouseEvent, eventType }) {\n if (!mouseEvent && (browser.supportsTouch || browser.supportsPointerEvent)) {\n return null;\n }\n\n let firstNonActive;\n\n for (const interaction of scope.interactions) {\n if (interaction.mouse) {\n // if it's a down event, skip interactions with running simulations\n if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; }\n\n // if the interaction is active, return it immediately\n if (interaction.interacting()) {\n return interaction;\n }\n // otherwise save it and look for another active interaction\n else if (!firstNonActive) {\n firstNonActive = interaction;\n }\n }\n }\n\n // if no active mouse interaction was found use the first inactive mouse\n // interaction\n if (firstNonActive) {\n return firstNonActive;\n }\n\n // Find any interaction specifically for mouse.\n // ignore the interaction if the eventType is a mousedown, and a simulation\n // is active\n for (const interaction of scope.interactions) {\n if (interaction.mouse && !(/down/.test(eventType) && interaction.simulation)) {\n return interaction;\n }\n }\n\n return null;\n },\n\n // get interaction that has this pointer\n hasPointer: function ({ pointerId }) {\n for (const interaction of scope.interactions) {\n if (utils.contains(interaction.pointerIds, pointerId)) {\n return interaction;\n }\n }\n },\n\n // get first idle interaction\n idle: function ({ mouseEvent }) {\n for (const interaction of scope.interactions) {\n // if there's already a pointer held down\n if (interaction.pointerIds.length === 1) {\n const target = interaction.target;\n // don't add this pointer if there is a target interactable and it\n // isn't gesturable\n if (target && !target.options.gesture.enabled) {\n continue;\n }\n }\n // maximum of 2 pointers per interaction\n else if (interaction.pointerIds.length >= 2) {\n continue;\n }\n\n if (!interaction.interacting() && (mouseEvent === interaction.mouse)) {\n return interaction;\n }\n }\n\n return null;\n },\n};\n\nmodule.exports = finder;\n","const win = require('./window');\nconst isWindow = require('./isWindow');\n\nconst is = {\n array : () => {},\n\n window : thing => thing === win.window || isWindow(thing),\n\n docFrag : thing => is.object(thing) && thing.nodeType === 11,\n\n object : thing => !!thing && (typeof thing === 'object'),\n\n function: thing => typeof thing === 'function',\n\n number : thing => typeof thing === 'number' ,\n\n bool : thing => typeof thing === 'boolean' ,\n\n string : thing => typeof thing === 'string' ,\n\n element: thing => {\n if (!thing || (typeof thing !== 'object')) { return false; }\n\n const _window = win.getWindow(thing) || win.window;\n\n return (/object|function/.test(typeof _window.Element)\n ? thing instanceof _window.Element //DOM2\n : thing.nodeType === 1 && typeof thing.nodeName === 'string');\n },\n};\n\nis.array = thing => (is.object(thing)\n && (typeof thing.length !== 'undefined')\n && is.function(thing.splice));\n\nmodule.exports = is;\n","module.exports = (thing) => !!(thing && thing.Window) && (thing instanceof thing.Window);\n","function pointerExtend (dest, source) {\n for (const prop in source) {\n const prefixedPropREs = module.exports.prefixedPropREs;\n let deprecated = false;\n\n // skip deprecated prefixed properties\n for (const vendor in prefixedPropREs) {\n if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) {\n deprecated = true;\n break;\n }\n }\n\n if (!deprecated && typeof source[prop] !== 'function') {\n dest[prop] = source[prop];\n }\n }\n return dest;\n}\n\npointerExtend.prefixedPropREs = {\n webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/,\n};\n\nmodule.exports = pointerExtend;\n","const hypot = require('./hypot');\nconst browser = require('./browser');\nconst dom = require('./domObjects');\nconst domUtils = require('./domUtils');\nconst is = require('./is');\nconst pointerExtend = require('./pointerExtend');\n\nconst pointerUtils = {\n copyCoords: function (dest, src) {\n dest.page = dest.page || {};\n dest.page.x = src.page.x;\n dest.page.y = src.page.y;\n\n dest.client = dest.client || {};\n dest.client.x = src.client.x;\n dest.client.y = src.client.y;\n\n dest.timeStamp = src.timeStamp;\n },\n\n setCoordDeltas: function (targetObj, prev, cur) {\n targetObj.page.x = cur.page.x - prev.page.x;\n targetObj.page.y = cur.page.y - prev.page.y;\n targetObj.client.x = cur.client.x - prev.client.x;\n targetObj.client.y = cur.client.y - prev.client.y;\n targetObj.timeStamp = cur.timeStamp - prev.timeStamp;\n\n // set pointer velocity\n const dt = Math.max(targetObj.timeStamp / 1000, 0.001);\n\n targetObj.page.speed = hypot(targetObj.page.x, targetObj.page.y) / dt;\n targetObj.page.vx = targetObj.page.x / dt;\n targetObj.page.vy = targetObj.page.y / dt;\n\n targetObj.client.speed = hypot(targetObj.client.x, targetObj.page.y) / dt;\n targetObj.client.vx = targetObj.client.x / dt;\n targetObj.client.vy = targetObj.client.y / dt;\n },\n\n isNativePointer: function (pointer) {\n return (pointer instanceof dom.Event || pointer instanceof dom.Touch);\n },\n\n // Get specified X/Y coords for mouse or event.touches[0]\n getXY: function (type, pointer, xy) {\n xy = xy || {};\n type = type || 'page';\n\n xy.x = pointer[type + 'X'];\n xy.y = pointer[type + 'Y'];\n\n return xy;\n },\n\n getPageXY: function (pointer, page) {\n page = page || {};\n\n // Opera Mobile handles the viewport and scrolling oddly\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n pointerUtils.getXY('screen', pointer, page);\n\n page.x += window.scrollX;\n page.y += window.scrollY;\n }\n else {\n pointerUtils.getXY('page', pointer, page);\n }\n\n return page;\n },\n\n getClientXY: function (pointer, client) {\n client = client || {};\n\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n // Opera Mobile handles the viewport and scrolling oddly\n pointerUtils.getXY('screen', pointer, client);\n }\n else {\n pointerUtils.getXY('client', pointer, client);\n }\n\n return client;\n },\n\n getPointerId: function (pointer) {\n return is.number(pointer.pointerId)? pointer.pointerId : pointer.identifier;\n },\n\n setCoords: function (targetObj, pointers, timeStamp) {\n const pointer = (pointers.length > 1\n ? pointerUtils.pointerAverage(pointers)\n : pointers[0]);\n\n const tmpXY = {};\n\n pointerUtils.getPageXY(pointer, tmpXY);\n targetObj.page.x = tmpXY.x;\n targetObj.page.y = tmpXY.y;\n\n pointerUtils.getClientXY(pointer, tmpXY);\n targetObj.client.x = tmpXY.x;\n targetObj.client.y = tmpXY.y;\n\n targetObj.timeStamp = is.number(timeStamp) ? timeStamp :new Date().getTime();\n },\n\n pointerExtend: pointerExtend,\n\n getTouchPair: function (event) {\n const touches = [];\n\n // array of touches is supplied\n if (is.array(event)) {\n touches[0] = event[0];\n touches[1] = event[1];\n }\n // an event\n else {\n if (event.type === 'touchend') {\n if (event.touches.length === 1) {\n touches[0] = event.touches[0];\n touches[1] = event.changedTouches[0];\n }\n else if (event.touches.length === 0) {\n touches[0] = event.changedTouches[0];\n touches[1] = event.changedTouches[1];\n }\n }\n else {\n touches[0] = event.touches[0];\n touches[1] = event.touches[1];\n }\n }\n\n return touches;\n },\n\n pointerAverage: function (pointers) {\n const average = {\n pageX : 0,\n pageY : 0,\n clientX: 0,\n clientY: 0,\n screenX: 0,\n screenY: 0,\n };\n\n for (const pointer of pointers) {\n for (const prop in average) {\n average[prop] += pointer[prop];\n }\n }\n for (const prop in average) {\n average[prop] /= pointers.length;\n }\n\n return average;\n },\n\n touchBBox: function (event) {\n if (!event.length && !(event.touches && event.touches.length > 1)) {\n return;\n }\n\n const touches = pointerUtils.getTouchPair(event);\n const minX = Math.min(touches[0].pageX, touches[1].pageX);\n const minY = Math.min(touches[0].pageY, touches[1].pageY);\n const maxX = Math.max(touches[0].pageX, touches[1].pageX);\n const maxY = Math.max(touches[0].pageY, touches[1].pageY);\n\n return {\n x: minX,\n y: minY,\n left: minX,\n top: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n },\n\n touchDistance: function (event, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n\n\n const dx = touches[0][sourceX] - touches[1][sourceX];\n const dy = touches[0][sourceY] - touches[1][sourceY];\n\n return hypot(dx, dy);\n },\n\n touchAngle: function (event, prevAngle, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n const dx = touches[1][sourceX] - touches[0][sourceX];\n const dy = touches[1][sourceY] - touches[0][sourceY];\n const angle = 180 * Math.atan2(dy , dx) / Math.PI;\n\n return angle;\n },\n\n getPointerType: function (pointer, interaction) {\n // if the PointerEvent API isn't available, then the pointer must be ither\n // a MouseEvent or TouchEvent\n if (interaction.mouse) { return 'mouse'; }\n if (!browser.supportsPointerEvent) { return 'touch'; }\n\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : [undefined, undefined,'touch', 'pen', 'mouse'][pointer.pointerType];\n },\n\n // [ event.target, event.currentTarget ]\n getEventTargets: function (event) {\n return [\n domUtils.getActualElement(event.path ? event.path[0] : event.target),\n domUtils.getActualElement(event.currentTarget),\n ];\n },\n};\n\nmodule.exports = pointerUtils;\n","const { window } = require('./window');\n\nconst vendors = ['ms', 'moz', 'webkit', 'o'];\nlet lastTime = 0;\nlet request;\nlet cancel;\n\nfor (let x = 0; x < vendors.length && !window.requestAnimationFrame; x++) {\n request = window[vendors[x] + 'RequestAnimationFrame'];\n cancel = window[vendors[x] +'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n}\n\nif (!request) {\n request = function (callback) {\n const currTime = new Date().getTime();\n const timeToCall = Math.max(0, 16 - (currTime - lastTime));\n const id = setTimeout(function () { callback(currTime + timeToCall); },\n timeToCall);\n\n lastTime = currTime + timeToCall;\n return id;\n };\n}\n\nif (!cancel) {\n cancel = function (id) {\n clearTimeout(id);\n };\n}\n\nmodule.exports = {\n request,\n cancel,\n};\n","const extend = require('./extend');\nconst is = require('./is');\nconst {\n closest,\n parentNode,\n getElementRect,\n} = require('./domUtils');\n\nconst rectUtils = {\n getStringOptionResult: function (value, interactable, element) {\n if (!is.string(value)) {\n return null;\n }\n\n if (value === 'parent') {\n value = parentNode(element);\n }\n else if (value === 'self') {\n value = interactable.getRect(element);\n }\n else {\n value = closest(element, value);\n }\n\n return value;\n },\n\n resolveRectLike: function (value, interactable, element, functionArgs) {\n value = rectUtils.getStringOptionResult(value, interactable, element) || value;\n\n if (is.function(value)) {\n value = value.apply(null, functionArgs);\n }\n\n if (is.element(value)) {\n value = getElementRect(value);\n }\n\n return value;\n },\n\n rectToXY: function (rect) {\n return rect && {\n x: 'x' in rect ? rect.x : rect.left,\n y: 'y' in rect ? rect.y : rect.top,\n };\n },\n\n xywhToTlbr: function (rect) {\n if (rect && !('left' in rect && 'top' in rect)) {\n rect = extend({}, rect);\n\n rect.left = rect.x || 0;\n rect.top = rect.y || 0;\n rect.right = rect.right || (rect.left + rect.width);\n rect.bottom = rect.bottom || (rect.top + rect.height);\n }\n\n return rect;\n },\n\n tlbrToXywh: function (rect) {\n if (rect && !('x' in rect && 'y' in rect)) {\n rect = extend({}, rect);\n\n rect.x = rect.left || 0;\n rect.top = rect.top || 0;\n rect.width = rect.width || (rect.right - rect.x);\n rect.height = rect.height || (rect.bottom - rect.y);\n }\n\n return rect;\n },\n};\n\nmodule.exports = rectUtils;\n","const win = module.exports;\nconst isWindow = require('./isWindow');\n\nfunction init (window) {\n // get wrapped window if using Shadow DOM polyfill\n\n win.realWindow = window;\n\n // create a TextNode\n const el = window.document.createTextNode('');\n\n // check if it's wrapped by a polyfill\n if (el.ownerDocument !== window.document\n && typeof window.wrap === 'function'\n && window.wrap(el) === el) {\n // use wrapped window\n window = window.wrap(window);\n }\n\n win.window = window;\n}\n\nif (typeof window === 'undefined') {\n win.window = undefined;\n win.realWindow = undefined;\n}\nelse {\n init(window);\n}\n\nwin.getWindow = function getWindow (node) {\n if (isWindow(node)) {\n return node;\n }\n\n const rootNode = (node.ownerDocument || node);\n\n return rootNode.defaultView || rootNode.parentWindow || win.window;\n};\n\nwin.init = init;\n"]} \ No newline at end of file +{"version":3,"sources":["src/header.js","node_modules/browser-pack/_prelude.js","index.js","src/Eventable.js","src/InteractEvent.js","src/Interactable.js","src/Interaction.js","src/actions/base.js","src/actions/drag.js","src/actions/drop.js","src/actions/gesture.js","src/actions/resize.js","src/autoScroll.js","src/autoStart/InteractableMethods.js","src/autoStart/base.js","src/autoStart/delay.js","src/autoStart/drag.js","src/autoStart/gesture.js","src/autoStart/resize.js","src/defaultOptions.js","src/index.js","src/inertia.js","src/interact.js","src/interactablePreventDefault.js","src/legacyBrowsers.js","src/modifiers/index.js","src/modifiers/restrict.js","src/modifiers/restrictEdges.js","src/modifiers/restrictSize.js","src/modifiers/snap.js","src/modifiers/snapSize.js","src/pointerEvents/PointerEvent.js","src/pointerEvents/base.js","src/pointerEvents/holdRepeat.js","src/pointerEvents/interactableTargets.js","src/scope.js","src/utils/Signals.js","src/utils/arr.js","src/utils/browser.js","src/utils/domObjects.js","src/utils/domUtils.js","src/utils/events.js","src/utils/extend.js","src/utils/getOriginXY.js","src/utils/hypot.js","src/utils/index.js","src/utils/interactionFinder.js","src/utils/is.js","src/utils/isWindow.js","src/utils/pointerExtend.js","src/utils/pointerUtils.js","src/utils/raf.js","src/utils/rect.js","src/utils/window.js"],"names":[],"mappings":"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","file":"interact.js","sourceRoot":"","sourcesContent":["/**\n * interact.js v1.3.0-alpha.4+sha.7970416-dirty\n *\n * Copyright (c) 2012-2017 Taye Adeyemi \n * Open source under the MIT License.\n * https://raw.github.com/taye/interact.js/master/LICENSE\n */\n","(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o 150) {\n return null;\n }\n\n let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI;\n const overlap = 22.5;\n\n if (angle < 0) {\n angle += 360;\n }\n\n const left = 135 - overlap <= angle && angle < 225 + overlap;\n const up = 225 - overlap <= angle && angle < 315 + overlap;\n\n const right = !left && (315 - overlap <= angle || angle < 45 + overlap);\n const down = !up && 45 - overlap <= angle && angle < 135 + overlap;\n\n return {\n up,\n down,\n left,\n right,\n angle,\n speed: interaction.prevEvent.speed,\n velocity: {\n x: interaction.prevEvent.velocityX,\n y: interaction.prevEvent.velocityY,\n },\n };\n }\n\n preventDefault () {}\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n}\n\nsignals.on('set-delta', function ({ iEvent, interaction, starting, deltaSource }) {\n const prevEvent = starting? iEvent : interaction.prevEvent;\n\n if (deltaSource === 'client') {\n iEvent.dx = iEvent.clientX - prevEvent.clientX;\n iEvent.dy = iEvent.clientY - prevEvent.clientY;\n }\n else {\n iEvent.dx = iEvent.pageX - prevEvent.pageX;\n iEvent.dy = iEvent.pageY - prevEvent.pageY;\n }\n});\n\nInteractEvent.signals = signals;\n\nmodule.exports = InteractEvent;\n","const is = require('./utils/is');\nconst events = require('./utils/events');\nconst extend = require('./utils/extend');\nconst actions = require('./actions/base');\nconst scope = require('./scope');\nconst Eventable = require('./Eventable');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nconst {\n getElementRect,\n nodeContains,\n trySelector,\n} = require('./utils/domUtils');\nconst { getWindow } = require('./utils/window');\nconst { indexOf, contains } = require('./utils/arr');\nconst { wheelEvent } = require('./utils/browser');\n\n// all set interactables\nscope.interactables = [];\n\n/*\\\n * Interactable\n [ property ]\n **\n * Object type returned by @interact\n\\*/\nclass Interactable {\n constructor (target, options) {\n options = options || {};\n\n this.target = target;\n this.events = new Eventable();\n this._context = options.context || scope.document;\n this._win = getWindow(trySelector(target)? this._context : target);\n this._doc = this._win.document;\n\n signals.fire('new', {\n target,\n options,\n interactable: this,\n win: this._win,\n });\n\n scope.addDocument( this._doc, this._win );\n\n scope.interactables.push(this);\n\n this.set(options);\n }\n\n setOnEvents (action, phases) {\n const onAction = 'on' + action;\n\n if (is.function(phases.onstart) ) { this.events[onAction + 'start' ] = phases.onstart ; }\n if (is.function(phases.onmove) ) { this.events[onAction + 'move' ] = phases.onmove ; }\n if (is.function(phases.onend) ) { this.events[onAction + 'end' ] = phases.onend ; }\n if (is.function(phases.oninertiastart)) { this.events[onAction + 'inertiastart' ] = phases.oninertiastart ; }\n\n return this;\n }\n\n setPerAction (action, options) {\n // for all the default per-action options\n for (const option in options) {\n // if this option exists for this action\n if (option in defaults[action]) {\n // if the option in the options arg is an object value\n if (is.object(options[option])) {\n // duplicate the object\n this.options[action][option] = extend(this.options[action][option] || {}, options[option]);\n\n if (is.object(defaults.perAction[option]) && 'enabled' in defaults.perAction[option]) {\n this.options[action][option].enabled = options[option].enabled === false? false : true;\n }\n }\n else if (is.bool(options[option]) && is.object(defaults.perAction[option])) {\n this.options[action][option].enabled = options[option];\n }\n else if (options[option] !== undefined) {\n // or if it's not undefined, do a plain assignment\n this.options[action][option] = options[option];\n }\n }\n }\n }\n\n /*\\\n * Interactable.getRect\n [ method ]\n *\n * The default function to get an Interactables bounding rect. Can be\n * overridden using @Interactable.rectChecker.\n *\n - element (Element) #optional The element to measure.\n = (object) The object's bounding rectangle.\n o {\n o top : 0,\n o left : 0,\n o bottom: 0,\n o right : 0,\n o width : 0,\n o height: 0\n o }\n \\*/\n getRect (element) {\n element = element || this.target;\n\n if (is.string(this.target) && !(is.element(element))) {\n element = this._context.querySelector(this.target);\n }\n\n return getElementRect(element);\n }\n\n /*\\\n * Interactable.rectChecker\n [ method ]\n *\n * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n - checker (function) #optional A function which returns this Interactable's bounding rectangle. See @Interactable.getRect\n = (function | object) The checker function or this Interactable\n \\*/\n rectChecker (checker) {\n if (is.function(checker)) {\n this.getRect = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.getRect;\n\n return this;\n }\n\n return this.getRect;\n }\n\n _backCompatOption (optionName, newValue) {\n if (trySelector(newValue) || is.object(newValue)) {\n this.options[optionName] = newValue;\n\n for (const action of actions.names) {\n this.options[action][optionName] = newValue;\n }\n\n return this;\n }\n\n return this.options[optionName];\n }\n\n /*\\\n * Interactable.origin\n [ method ]\n *\n * Gets or sets the origin of the Interactable's element. The x and y\n * of the origin will be subtracted from action event coordinates.\n *\n - origin (object | string) #optional An object eg. { x: 0, y: 0 } or string 'parent', 'self' or any CSS selector\n * OR\n - origin (Element) #optional An HTML or SVG Element whose rect will be used\n **\n = (object) The current origin or this Interactable\n \\*/\n origin (newValue) {\n return this._backCompatOption('origin', newValue);\n }\n\n /*\\\n * Interactable.deltaSource\n [ method ]\n *\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n - newValue (string) #optional Use 'client' if you will be scrolling while interacting; Use 'page' if you want autoScroll to work\n = (string | object) The current deltaSource or this Interactable\n \\*/\n deltaSource (newValue) {\n if (newValue === 'page' || newValue === 'client') {\n this.options.deltaSource = newValue;\n\n return this;\n }\n\n return this.options.deltaSource;\n }\n\n /*\\\n * Interactable.context\n [ method ]\n *\n * Gets the selector context Node of the Interactable. The default is `window.document`.\n *\n = (Node) The context Node of this Interactable\n **\n \\*/\n context () {\n return this._context;\n }\n\n inContext (element) {\n return (this._context === element.ownerDocument\n || nodeContains(this._context, element));\n }\n\n /*\\\n * Interactable.fire\n [ method ]\n *\n * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n - iEvent (InteractEvent) The InteractEvent object to be fired on this Interactable\n = (Interactable) this Interactable\n \\*/\n fire (iEvent) {\n this.events.fire(iEvent);\n\n return this;\n }\n\n _onOffMultiple (method, eventType, listener, options) {\n if (is.string(eventType) && eventType.search(' ') !== -1) {\n eventType = eventType.trim().split(/ +/);\n }\n\n if (is.array(eventType)) {\n for (let i = 0; i < eventType.length; i++) {\n this[method](eventType[i], listener, options);\n }\n\n return true;\n }\n\n if (is.object(eventType)) {\n for (const prop in eventType) {\n this[method](prop, eventType[prop], listener);\n }\n\n return true;\n }\n }\n\n /*\\\n * Interactable.on\n [ method ]\n *\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n - eventType (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) This Interactable\n \\*/\n on (eventType, listener, options) {\n if (this._onOffMultiple('on', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.on(eventType, listener);\n }\n // delegated event for selector\n else if (is.string(this.target)) {\n events.addDelegate(this.target, this._context, eventType, listener, options);\n }\n else {\n events.add(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.off\n [ method ]\n *\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n - eventType (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) This Interactable\n \\*/\n off (eventType, listener, options) {\n if (this._onOffMultiple('off', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n // if it is an action event type\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.off(eventType, listener);\n }\n // delegated event\n else if (is.string(this.target)) {\n events.removeDelegate(this.target, this._context, eventType, listener, options);\n }\n // remove listener from this Interatable's element\n else {\n events.remove(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.set\n [ method ]\n *\n * Reset the options of this Interactable\n - options (object) The new settings to apply\n = (object) This Interactable\n \\*/\n set (options) {\n if (!is.object(options)) {\n options = {};\n }\n\n this.options = extend({}, defaults.base);\n\n const perActions = extend({}, defaults.perAction);\n\n for (const actionName in actions.methodDict) {\n const methodName = actions.methodDict[actionName];\n\n this.options[actionName] = extend({}, defaults[actionName]);\n\n this.setPerAction(actionName, perActions);\n\n this[methodName](options[actionName]);\n }\n\n for (const setting of Interactable.settingsMethods) {\n this.options[setting] = defaults.base[setting];\n\n if (setting in options) {\n this[setting](options[setting]);\n }\n }\n\n signals.fire('set', {\n options,\n interactable: this,\n });\n\n return this;\n }\n\n /*\\\n * Interactable.unset\n [ method ]\n *\n * Remove this interactable from the list of interactables and remove\n * it's action capabilities and event listeners\n *\n = (object) @interact\n \\*/\n unset () {\n events.remove(this.target, 'all');\n\n if (is.string(this.target)) {\n // remove delegated events\n for (const type in events.delegatedEvents) {\n const delegated = events.delegatedEvents[type];\n\n if (delegated.selectors[0] === this.target\n && delegated.contexts[0] === this._context) {\n\n delegated.selectors.splice(0, 1);\n delegated.contexts .splice(0, 1);\n delegated.listeners.splice(0, 1);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegated[type] = null;\n }\n }\n\n events.remove(this._context, type, events.delegateListener);\n events.remove(this._context, type, events.delegateUseCapture, true);\n }\n }\n else {\n events.remove(this, 'all');\n }\n\n signals.fire('unset', { interactable: this });\n\n scope.interactables.splice(indexOf(scope.interactables, this), 1);\n\n // Stop related interactions when an Interactable is unset\n for (const interaction of scope.interactions || []) {\n if (interaction.target === this && interaction.interacting()) {\n interaction.stop();\n }\n }\n\n return scope.interact;\n }\n}\n\nscope.interactables.indexOfElement = function indexOfElement (target, context) {\n context = context || scope.document;\n\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n if (interactable.target === target && interactable._context === context) {\n return i;\n }\n }\n return -1;\n};\n\nscope.interactables.get = function interactableGet (element, options, dontCheckInContext) {\n const ret = this[this.indexOfElement(element, options && options.context)];\n\n return ret && (is.string(element) || dontCheckInContext || ret.inContext(element))? ret : null;\n};\n\nscope.interactables.forEachSelector = function (callback, element) {\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n // skip non CSS selector targets and out of context elements\n if (!is.string(interactable.target)\n || (element && !interactable.inContext(element))) {\n continue;\n }\n\n const ret = callback(interactable, interactable.target, interactable._context, i, this);\n\n if (ret !== undefined) {\n return ret;\n }\n }\n};\n\n// all interact.js eventTypes\nInteractable.eventTypes = scope.eventTypes = [];\n\nInteractable.signals = signals;\n\nInteractable.settingsMethods = [ 'deltaSource', 'origin', 'preventDefault', 'rectChecker' ];\n\nmodule.exports = Interactable;\n","const scope = require('./scope');\nconst utils = require('./utils');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst domObjects = require('./utils/domObjects');\nconst finder = require('./utils/interactionFinder');\nconst signals = require('./utils/Signals').new();\n\nconst listeners = {};\nconst methodNames = [\n 'pointerDown', 'pointerMove', 'pointerUp',\n 'updatePointer', 'removePointer',\n];\n\n// for ignoring browser's simulated mouse events\nlet prevTouchTime = 0;\n\n// all active and idle interactions\nscope.interactions = [];\n\nclass Interaction {\n constructor ({ pointerType }) {\n this.target = null; // current interactable being interacted with\n this.element = null; // the target element of the interactable\n\n this.prepared = { // action that's ready to be fired on next move event\n name : null,\n axis : null,\n edges: null,\n };\n\n // keep track of added pointers\n this.pointers = [];\n this.pointerIds = [];\n this.downTargets = [];\n this.downTimes = [];\n\n // Previous native pointer move event coordinates\n this.prevCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n // current native pointer move event coordinates\n this.curCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Starting InteractEvent pointer coordinates\n this.startCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Change in coordinates and time of the pointer\n this.pointerDelta = {\n page : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n client : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n timeStamp: 0,\n };\n\n this.downEvent = null; // pointerdown/mousedown/touchstart event\n this.downPointer = {};\n\n this._eventTarget = null;\n this._curEventTarget = null;\n\n this.prevEvent = null; // previous action event\n\n this.pointerIsDown = false;\n this.pointerWasMoved = false;\n this._interacting = false;\n\n this.pointerType = pointerType;\n\n signals.fire('new', this);\n\n scope.interactions.push(this);\n }\n\n pointerDown (pointer, event, eventTarget) {\n const pointerIndex = this.updatePointer(pointer, event, true);\n\n signals.fire('down', {\n pointer,\n event,\n eventTarget,\n pointerIndex,\n interaction: this,\n });\n }\n\n /*\\\n * Interaction.start\n [ method ]\n *\n * Start an action with the given Interactable and Element as tartgets. The\n * action must be enabled for the target Interactable and an appropriate number\n * of pointers must be held down - 1 for drag/resize, 2 for gesture.\n *\n * Use it with `interactable.able({ manualStart: false })` to always\n * [start actions manually](https://github.com/taye/interact.js/issues/114)\n *\n - action (object) The action to be performed - drag, resize, etc.\n - target (Interactable) The Interactable to target\n - element (Element) The DOM Element to target\n = (object) interact\n **\n | interact(target)\n | .draggable({\n | // disable the default drag start by down->move\n | manualStart: true\n | })\n | // start dragging after the user holds the pointer down\n | .on('hold', function (event) {\n | var interaction = event.interaction;\n |\n | if (!interaction.interacting()) {\n | interaction.start({ name: 'drag' },\n | event.interactable,\n | event.currentTarget);\n | }\n | });\n \\*/\n start (action, target, element) {\n if (this.interacting()\n || !this.pointerIsDown\n || this.pointerIds.length < (action.name === 'gesture'? 2 : 1)) {\n return;\n }\n\n // if this interaction had been removed after stopping\n // add it back\n if (utils.indexOf(scope.interactions, this) === -1) {\n scope.interactions.push(this);\n }\n\n utils.copyAction(this.prepared, action);\n this.target = target;\n this.element = element;\n\n signals.fire('action-start', {\n interaction: this,\n event: this.downEvent,\n });\n }\n\n pointerMove (pointer, event, eventTarget) {\n if (!this.simulation) {\n this.updatePointer(pointer);\n utils.setCoords(this.curCoords, this.pointers);\n }\n\n const duplicateMove = (this.curCoords.page.x === this.prevCoords.page.x\n && this.curCoords.page.y === this.prevCoords.page.y\n && this.curCoords.client.x === this.prevCoords.client.x\n && this.curCoords.client.y === this.prevCoords.client.y);\n\n let dx;\n let dy;\n\n // register movement greater than pointerMoveTolerance\n if (this.pointerIsDown && !this.pointerWasMoved) {\n dx = this.curCoords.client.x - this.startCoords.client.x;\n dy = this.curCoords.client.y - this.startCoords.client.y;\n\n this.pointerWasMoved = utils.hypot(dx, dy) > Interaction.pointerMoveTolerance;\n }\n\n const signalArg = {\n pointer,\n pointerIndex: this.getPointerIndex(pointer),\n event,\n eventTarget,\n dx,\n dy,\n duplicate: duplicateMove,\n interaction: this,\n interactingBeforeMove: this.interacting(),\n };\n\n if (!duplicateMove) {\n // set pointer coordinate, time changes and speeds\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n }\n\n signals.fire('move', signalArg);\n\n if (!duplicateMove) {\n // if interacting, fire an 'action-move' signal etc\n if (this.interacting()) {\n this.doMove(signalArg);\n }\n\n if (this.pointerWasMoved) {\n utils.copyCoords(this.prevCoords, this.curCoords);\n }\n }\n }\n\n /*\\\n * Interaction.doMove\n [ method ]\n *\n * Force a move of the current action at the same coordinates. Useful if\n * snap/restrict has been changed and you want a movement with the new\n * settings.\n *\n **\n | interact(target)\n | .draggable(true)\n | .on('dragmove', function (event) {\n | if (someCondition) {\n | // change the snap settings\n | event.interactable.draggable({ snap: { targets: [] }});\n | // fire another move event with re-calculated snap\n | event.interaction.doMove();\n | }\n | });\n \\*/\n doMove (signalArg) {\n signalArg = utils.extend({\n pointer: this.pointers[0],\n event: this.prevEvent,\n eventTarget: this._eventTarget,\n interaction: this,\n }, signalArg || {});\n\n signals.fire('before-action-move', signalArg);\n\n if (!this._dontFireMove) {\n signals.fire('action-move', signalArg);\n }\n\n this._dontFireMove = false;\n }\n\n // End interact move events and stop auto-scroll unless simulation is running\n pointerUp (pointer, event, eventTarget, curEventTarget) {\n const pointerIndex = this.getPointerIndex(pointer);\n\n signals.fire(/cancel$/i.test(event.type)? 'cancel' : 'up', {\n pointer,\n pointerIndex,\n event,\n eventTarget,\n curEventTarget,\n interaction: this,\n });\n\n if (!this.simulation) {\n this.end(event);\n }\n\n this.pointerIsDown = false;\n this.removePointer(pointer, event);\n }\n\n /*\\\n * Interaction.end\n [ method ]\n *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n - event (PointerEvent) #optional\n **\n | interact(target)\n | .draggable(true)\n | .on('move', function (event) {\n | if (event.pageX > 1000) {\n | // end the current action\n | event.interaction.end();\n | // stop all further listeners from being called\n | event.stopImmediatePropagation();\n | }\n | });\n \\*/\n end (event) {\n event = event || this.prevEvent;\n\n if (this.interacting()) {\n signals.fire('action-end', {\n event,\n interaction: this,\n });\n }\n\n this.stop();\n }\n\n currentAction () {\n return this._interacting? this.prepared.name: null;\n }\n\n interacting () {\n return this._interacting;\n }\n\n stop () {\n signals.fire('stop', { interaction: this });\n\n if (this._interacting) {\n signals.fire('stop-active', { interaction: this });\n signals.fire('stop-' + this.prepared.name, { interaction: this });\n }\n\n this.target = this.element = null;\n\n this._interacting = false;\n this.prepared.name = this.prevEvent = null;\n }\n\n getPointerIndex (pointer) {\n // mouse and pen interactions may have only one pointer\n if (this.pointerType === 'mouse' || this.pointerType === 'pen') {\n return 0;\n }\n\n return utils.indexOf(this.pointerIds, utils.getPointerId(pointer));\n }\n\n updatePointer (pointer, event, down = event && /(down|start)$/i.test(event.type)) {\n const id = utils.getPointerId(pointer);\n let index = this.getPointerIndex(pointer);\n\n if (index === -1) {\n index = this.pointerIds.length;\n this.pointerIds[index] = id;\n }\n\n if (down) {\n signals.fire('update-pointer-down', {\n pointer,\n event,\n down,\n pointerId: id,\n pointerIndex: index,\n interaction: this,\n });\n }\n\n this.pointers[index] = pointer;\n\n return index;\n }\n\n removePointer (pointer, event) {\n const index = this.getPointerIndex(pointer);\n\n if (index === -1) { return; }\n\n signals.fire('remove-pointer', {\n pointer,\n event,\n pointerIndex: index,\n interaction: this,\n });\n\n this.pointers .splice(index, 1);\n this.pointerIds .splice(index, 1);\n this.downTargets.splice(index, 1);\n this.downTimes .splice(index, 1);\n }\n\n _updateEventTargets (target, currentTarget) {\n this._eventTarget = target;\n this._curEventTarget = currentTarget;\n }\n}\n\nfor (let i = 0, len = methodNames.length; i < len; i++) {\n const method = methodNames[i];\n\n listeners[method] = doOnInteractions(method);\n}\n\nfunction doOnInteractions (method) {\n return (function (event) {\n const pointerType = utils.getPointerType(event);\n const [eventTarget, curEventTarget] = utils.getEventTargets(event);\n const matches = []; // [ [pointer, interaction], ...]\n\n if (browser.supportsTouch && /touch/.test(event.type)) {\n prevTouchTime = new Date().getTime();\n\n for (let i = 0; i < event.changedTouches.length; i++) {\n const pointer = event.changedTouches[i];\n const interaction = finder.search(pointer, event.type, eventTarget);\n\n matches.push([pointer, interaction || new Interaction({ pointerType })]);\n }\n }\n else {\n let invalidPointer = false;\n\n if (!browser.supportsPointerEvent && /mouse/.test(event.type)) {\n // ignore mouse events while touch interactions are active\n for (let i = 0; i < scope.interactions.length && !invalidPointer; i++) {\n invalidPointer = scope.interactions[i].pointerType !== 'mouse' && scope.interactions[i].pointerIsDown;\n }\n\n // try to ignore mouse events that are simulated by the browser\n // after a touch event\n invalidPointer = invalidPointer\n || (new Date().getTime() - prevTouchTime < 500)\n // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated\n || event.timeStamp === 0;\n }\n\n if (!invalidPointer) {\n let interaction = finder.search(event, event.type, eventTarget);\n\n if (!interaction) {\n interaction = new Interaction({ pointerType });\n }\n\n matches.push([event, interaction]);\n }\n }\n\n for (const [pointer, interaction] of matches) {\n interaction._updateEventTargets(eventTarget, curEventTarget);\n interaction[method](pointer, event, eventTarget, curEventTarget);\n }\n });\n}\n\nfunction endAll (event) {\n for (let i = 0; i < scope.interactions.length; i++) {\n const interaction = scope.interactions[i];\n\n interaction.end(event);\n signals.fire('endall', { event, interaction });\n }\n}\n\nconst docEvents = { /* 'eventType': listenerFunc */ };\nconst pEventTypes = browser.pEventTypes;\n\nif (domObjects.PointerEvent) {\n docEvents[pEventTypes.down ] = listeners.pointerDown;\n docEvents[pEventTypes.move ] = listeners.pointerMove;\n docEvents[pEventTypes.up ] = listeners.pointerUp;\n docEvents[pEventTypes.cancel] = listeners.pointerUp;\n}\nelse {\n docEvents.mousedown = listeners.pointerDown;\n docEvents.mousemove = listeners.pointerMove;\n docEvents.mouseup = listeners.pointerUp;\n\n docEvents.touchstart = listeners.pointerDown;\n docEvents.touchmove = listeners.pointerMove;\n docEvents.touchend = listeners.pointerUp;\n docEvents.touchcancel = listeners.pointerUp;\n}\n\ndocEvents.blur = endAll;\n\nfunction onDocSignal ({ doc }, signalName) {\n const eventMethod = signalName.indexOf('add') === 0\n ? events.add : events.remove;\n\n // delegate event listener\n for (const eventType in scope.delegatedEvents) {\n eventMethod(doc, eventType, events.delegateListener);\n eventMethod(doc, eventType, events.delegateUseCapture, true);\n }\n\n for (const eventType in docEvents) {\n eventMethod(doc, eventType, docEvents[eventType]);\n }\n}\n\nsignals.on('update-pointer-down', ({ interaction, pointer, pointerId, pointerIndex, event, eventTarget, down }) => {\n interaction.pointerIds[pointerIndex] = pointerId;\n interaction.pointers[pointerIndex] = pointer;\n\n if (down) {\n interaction.pointerIsDown = true;\n }\n\n if (!interaction.interacting()) {\n utils.setCoords(interaction.startCoords, interaction.pointers);\n\n utils.copyCoords(interaction.curCoords , interaction.startCoords);\n utils.copyCoords(interaction.prevCoords, interaction.startCoords);\n\n interaction.downEvent = event;\n interaction.downTimes[pointerIndex] = interaction.curCoords.timeStamp;\n interaction.downTargets[pointerIndex] = eventTarget || event && utils.getEventTargets(event)[0];\n interaction.pointerWasMoved = false;\n\n utils.pointerExtend(interaction.downPointer, pointer);\n }\n});\n\nscope.signals.on('add-document' , onDocSignal);\nscope.signals.on('remove-document', onDocSignal);\n\nInteraction.pointerMoveTolerance = 1;\nInteraction.doOnInteractions = doOnInteractions;\nInteraction.endAll = endAll;\nInteraction.signals = signals;\nInteraction.docEvents = docEvents;\n\nscope.endAllInteractions = endAll;\n\nmodule.exports = Interaction;\n","const Interaction = require('../Interaction');\nconst InteractEvent = require('../InteractEvent');\n\nconst actions = {\n firePrepared,\n names: [],\n methodDict: {},\n};\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n interaction._interacting = true;\n firePrepared(interaction, event, 'start');\n});\n\nInteraction.signals.on('action-move', function ({ interaction, event, preEnd }) {\n firePrepared(interaction, event, 'move', preEnd);\n\n // if the action was ended in a listener\n if (!interaction.interacting()) { return false; }\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n firePrepared(interaction, event, 'end');\n});\n\nfunction firePrepared (interaction, event, phase, preEnd) {\n const actionName = interaction.prepared.name;\n\n const newEvent = new InteractEvent(interaction, event, actionName, phase, interaction.element, null, preEnd);\n\n interaction.target.fire(newEvent);\n interaction.prevEvent = newEvent;\n}\n\nmodule.exports = actions;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drag = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n startAxis : 'xy',\n lockAxis : 'xy',\n },\n\n checker: function (pointer, event, interactable) {\n const dragOptions = interactable.options.drag;\n\n return dragOptions.enabled\n ? { name: 'drag', axis: (dragOptions.lockAxis === 'start'\n ? dragOptions.startAxis\n : dragOptions.lockAxis)}\n : null;\n },\n\n getCursor: function () {\n return 'move';\n },\n};\n\nInteraction.signals.on('before-action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n interaction.curCoords.page.y = interaction.startCoords.page.y;\n interaction.curCoords.client.y = interaction.startCoords.client.y;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vx);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vx);\n interaction.pointerDelta.client.vy = 0;\n interaction.pointerDelta.page.vy = 0;\n }\n else if (axis === 'y') {\n interaction.curCoords.page.x = interaction.startCoords.page.x;\n interaction.curCoords.client.x = interaction.startCoords.client.x;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vy);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vy);\n interaction.pointerDelta.client.vx = 0;\n interaction.pointerDelta.page.vx = 0;\n }\n});\n\n// dragmove\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'dragmove') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n iEvent.pageY = interaction.startCoords.page.y;\n iEvent.clientY = interaction.startCoords.client.y;\n iEvent.dy = 0;\n }\n else if (axis === 'y') {\n iEvent.pageX = interaction.startCoords.page.x;\n iEvent.clientX = interaction.startCoords.client.x;\n iEvent.dx = 0;\n }\n});\n\n/*\\\n * Interactable.draggable\n [ method ]\n *\n * Gets or sets whether drag actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of drag events\n | var isDraggable = interact('ul li').draggable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on drag events (object makes the Interactable draggable)\n = (object) This Interactable\n | interact(element).draggable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // the axis in which the first movement must be\n | // for the drag sequence to start\n | // 'xy' by default - any direction\n | startAxis: 'x' || 'y' || 'xy',\n |\n | // 'xy' by default - don't restrict to one axis (move in any direction)\n | // 'x' or 'y' to restrict movement to either axis\n | // 'start' to restrict movement to the axis the drag started in\n | lockAxis: 'x' || 'y' || 'xy' || 'start',\n |\n | // max number of drags that can happen concurrently\n | // with elements of this Interactable. Infinity by default\n | max: Infinity,\n |\n | // max number of drags that can target the same element+Interactable\n | // 1 by default\n | maxPerElement: 2\n | });\n\\*/\nInteractable.prototype.draggable = function (options) {\n if (utils.is.object(options)) {\n this.options.drag.enabled = options.enabled === false? false: true;\n this.setPerAction('drag', options);\n this.setOnEvents('drag', options);\n\n if (/^(xy|x|y|start)$/.test(options.lockAxis)) {\n this.options.drag.lockAxis = options.lockAxis;\n }\n if (/^(xy|x|y)$/.test(options.startAxis)) {\n this.options.drag.startAxis = options.startAxis;\n }\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drag.enabled = options;\n\n if (!options) {\n this.ondragstart = this.ondragstart = this.ondragend = null;\n }\n\n return this;\n }\n\n return this.options.drag;\n};\n\nactions.drag = drag;\nactions.names.push('drag');\nutils.merge(Interactable.eventTypes, [\n 'dragstart',\n 'dragmove',\n 'draginertiastart',\n 'draginertiaresume',\n 'dragend',\n]);\nactions.methodDict.drag = 'draggable';\n\ndefaultOptions.drag = drag.defaults;\n\nmodule.exports = drag;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst scope = require('../scope');\nconst interact = require('../interact');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drop = {\n defaults: {\n enabled: false,\n accept : null,\n overlap: 'pointer',\n },\n};\n\nlet dynamicDrop = false;\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // reset active dropzones\n interaction.activeDrops.dropzones = [];\n interaction.activeDrops.elements = [];\n interaction.activeDrops.rects = [];\n\n interaction.dropEvents = null;\n\n if (!interaction.dynamicDrop) {\n setActiveDrops(interaction, interaction.element);\n }\n\n const dragEvent = interaction.prevEvent;\n const dropEvents = getDropEvents(interaction, event, dragEvent);\n\n if (dropEvents.activate) {\n fireActiveDrops(interaction, dropEvents.activate);\n }\n});\n\nInteractEvent.signals.on('new', function ({ interaction, iEvent, event }) {\n if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { return; }\n\n const draggableElement = interaction.element;\n const dragEvent = iEvent;\n const dropResult = getDrop(dragEvent, event, draggableElement);\n\n interaction.dropTarget = dropResult.dropzone;\n interaction.dropElement = dropResult.element;\n\n interaction.dropEvents = getDropEvents(interaction, event, dragEvent);\n});\n\nInteraction.signals.on('action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n fireDropEvents(interaction, interaction.dropEvents);\n});\n\nInteraction.signals.on('action-end', function ({ interaction }) {\n if (interaction.prepared.name === 'drag') {\n fireDropEvents(interaction, interaction.dropEvents);\n }\n});\n\nInteraction.signals.on('stop-drag', function ({ interaction }) {\n interaction.activeDrops.dropzones =\n interaction.activeDrops.elements =\n interaction.activeDrops.rects =\n interaction.dropEvents = null;\n});\n\nfunction collectDrops (interaction, element) {\n const drops = [];\n const elements = [];\n\n element = element || interaction.element;\n\n // collect all dropzones and their elements which qualify for a drop\n for (const current of scope.interactables) {\n if (!current.options.drop.enabled) { continue; }\n\n const accept = current.options.drop.accept;\n\n // test the draggable element against the dropzone's accept setting\n if ((utils.is.element(accept) && accept !== element)\n || (utils.is.string(accept)\n && !utils.matchesSelector(element, accept))) {\n\n continue;\n }\n\n // query for new elements if necessary\n const dropElements = utils.is.string(current.target)\n ? current._context.querySelectorAll(current.target)\n : [current.target];\n\n for (let i = 0; i < dropElements.length; i++) {\n const currentElement = dropElements[i];\n\n if (currentElement !== element) {\n drops.push(current);\n elements.push(currentElement);\n }\n }\n }\n\n return {\n elements,\n dropzones: drops,\n };\n}\n\nfunction fireActiveDrops (interaction, event) {\n let prevElement;\n\n // loop through all active dropzones and trigger event\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n const current = interaction.activeDrops.dropzones[i];\n const currentElement = interaction.activeDrops.elements [i];\n\n // prevent trigger of duplicate events on same element\n if (currentElement !== prevElement) {\n // set current element as event target\n event.target = currentElement;\n current.fire(event);\n }\n prevElement = currentElement;\n }\n}\n\n// Collect a new set of possible drops and save them in activeDrops.\n// setActiveDrops should always be called when a drag has just started or a\n// drag event happens while dynamicDrop is true\nfunction setActiveDrops (interaction, dragElement) {\n // get dropzones and their elements that could receive the draggable\n const possibleDrops = collectDrops(interaction, dragElement, true);\n\n interaction.activeDrops.dropzones = possibleDrops.dropzones;\n interaction.activeDrops.elements = possibleDrops.elements;\n interaction.activeDrops.rects = [];\n\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n interaction.activeDrops.rects[i] =\n interaction.activeDrops.dropzones[i].getRect(interaction.activeDrops.elements[i]);\n }\n}\n\nfunction getDrop (dragEvent, event, dragElement) {\n const interaction = dragEvent.interaction;\n const validDrops = [];\n\n if (dynamicDrop) {\n setActiveDrops(interaction, dragElement);\n }\n\n // collect all dropzones and their elements which qualify for a drop\n for (let j = 0; j < interaction.activeDrops.dropzones.length; j++) {\n const current = interaction.activeDrops.dropzones[j];\n const currentElement = interaction.activeDrops.elements [j];\n const rect = interaction.activeDrops.rects [j];\n\n validDrops.push(current.dropCheck(dragEvent, event, interaction.target, dragElement, currentElement, rect)\n ? currentElement\n : null);\n }\n\n // get the most appropriate dropzone based on DOM depth and order\n const dropIndex = utils.indexOfDeepestElement(validDrops);\n\n return {\n dropzone: interaction.activeDrops.dropzones[dropIndex] || null,\n element : interaction.activeDrops.elements [dropIndex] || null,\n };\n}\n\nfunction getDropEvents (interaction, pointerEvent, dragEvent) {\n const dropEvents = {\n enter : null,\n leave : null,\n activate : null,\n deactivate: null,\n move : null,\n drop : null,\n };\n\n const tmpl = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n };\n\n if (interaction.dropElement !== interaction.prevDropElement) {\n // if there was a prevDropTarget, create a dragleave event\n if (interaction.prevDropTarget) {\n dropEvents.leave = utils.extend({ type: 'dragleave' }, tmpl);\n\n dragEvent.dragLeave = dropEvents.leave.target = interaction.prevDropElement;\n dragEvent.prevDropzone = dropEvents.leave.dropzone = interaction.prevDropTarget;\n }\n // if the dropTarget is not null, create a dragenter event\n if (interaction.dropTarget) {\n dropEvents.enter = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n type : 'dragenter',\n };\n\n dragEvent.dragEnter = interaction.dropElement;\n dragEvent.dropzone = interaction.dropTarget;\n }\n }\n\n if (dragEvent.type === 'dragend' && interaction.dropTarget) {\n dropEvents.drop = utils.extend({ type: 'drop' }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n dragEvent.relatedTarget = interaction.dropElement;\n }\n if (dragEvent.type === 'dragstart') {\n dropEvents.activate = utils.extend({ type: 'dropactivate' }, tmpl);\n\n dropEvents.activate.target = null;\n dropEvents.activate.dropzone = null;\n }\n if (dragEvent.type === 'dragend') {\n dropEvents.deactivate = utils.extend({ type: 'dropdeactivate' }, tmpl);\n\n dropEvents.deactivate.target = null;\n dropEvents.deactivate.dropzone = null;\n }\n if (dragEvent.type === 'dragmove' && interaction.dropTarget) {\n dropEvents.move = utils.extend({\n dragmove : dragEvent,\n type : 'dropmove',\n }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n }\n\n return dropEvents;\n}\n\nfunction fireDropEvents (interaction, dropEvents) {\n if (dropEvents.leave) { interaction.prevDropTarget.fire(dropEvents.leave); }\n if (dropEvents.move ) { interaction.dropTarget.fire(dropEvents.move ); }\n if (dropEvents.enter) { interaction.dropTarget.fire(dropEvents.enter); }\n if (dropEvents.drop ) { interaction.dropTarget.fire(dropEvents.drop ); }\n if (dropEvents.deactivate) {\n fireActiveDrops(interaction, dropEvents.deactivate);\n }\n\n interaction.prevDropTarget = interaction.dropTarget;\n interaction.prevDropElement = interaction.dropElement;\n}\n\n/*\\\n * Interactable.dropzone\n [ method ]\n *\n * Returns or sets whether elements can be dropped onto this\n * Interactable to trigger drop events\n *\n * Dropzones can receive the following events:\n * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends\n * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone\n * - `dragmove` when a draggable that has entered the dropzone is moved\n * - `drop` when a draggable is dropped into this dropzone\n *\n * Use the `accept` option to allow only elements that match the given CSS\n * selector or element. The value can be:\n *\n * - **an Element** - only that element can be dropped into this dropzone.\n * - **a string**, - the element being dragged must match it as a CSS selector.\n * - **`null`** - accept options is cleared - it accepts any element.\n *\n * Use the `overlap` option to set how drops are checked for. The allowed\n * values are:\n *\n * - `'pointer'`, the pointer must be over the dropzone (default)\n * - `'center'`, the draggable element's center must be over the dropzone\n * - a number from 0-1 which is the `(intersection area) / (draggable area)`.\n * e.g. `0.5` for drop to happen when half of the area of the draggable is\n * over the dropzone\n *\n * Use the `checker` option to specify a function to check if a dragged\n * element is over this Interactable.\n *\n | interact(target)\n | .dropChecker(function(dragEvent, // related dragmove or dragend event\n | event, // TouchEvent/PointerEvent/MouseEvent\n | dropped, // bool result of the default checker\n | dropzone, // dropzone Interactable\n | dropElement, // dropzone elemnt\n | draggable, // draggable Interactable\n | draggableElement) {// draggable element\n |\n | return dropped && event.target.hasAttribute('allow-drop');\n | }\n *\n *\n - options (boolean | object | null) #optional The new value to be set.\n | interact('.drop').dropzone({\n | accept: '.can-drop' || document.getElementById('single-drop'),\n | overlap: 'pointer' || 'center' || zeroToOne\n | }\n = (boolean | object) The current setting or this Interactable\n\\*/\nInteractable.prototype.dropzone = function (options) {\n if (utils.is.object(options)) {\n this.options.drop.enabled = options.enabled === false? false: true;\n\n if (utils.is.function(options.ondrop) ) { this.events.ondrop = options.ondrop ; }\n if (utils.is.function(options.ondropactivate) ) { this.events.ondropactivate = options.ondropactivate ; }\n if (utils.is.function(options.ondropdeactivate)) { this.events.ondropdeactivate = options.ondropdeactivate; }\n if (utils.is.function(options.ondragenter) ) { this.events.ondragenter = options.ondragenter ; }\n if (utils.is.function(options.ondragleave) ) { this.events.ondragleave = options.ondragleave ; }\n if (utils.is.function(options.ondropmove) ) { this.events.ondropmove = options.ondropmove ; }\n\n if (/^(pointer|center)$/.test(options.overlap)) {\n this.options.drop.overlap = options.overlap;\n }\n else if (utils.is.number(options.overlap)) {\n this.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0);\n }\n if ('accept' in options) {\n this.options.drop.accept = options.accept;\n }\n if ('checker' in options) {\n this.options.drop.checker = options.checker;\n }\n\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drop.enabled = options;\n\n if (!options) {\n this.ondragenter = this.ondragleave = this.ondrop\n = this.ondropactivate = this.ondropdeactivate = null;\n }\n\n return this;\n }\n\n return this.options.drop;\n};\n\nInteractable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) {\n let dropped = false;\n\n // if the dropzone has no rect (eg. display: none)\n // call the custom dropChecker or just return false\n if (!(rect = rect || this.getRect(dropElement))) {\n return (this.options.drop.checker\n ? this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement)\n : false);\n }\n\n const dropOverlap = this.options.drop.overlap;\n\n if (dropOverlap === 'pointer') {\n const origin = utils.getOriginXY(draggable, draggableElement, 'drag');\n const page = utils.getPageXY(dragEvent);\n\n page.x += origin.x;\n page.y += origin.y;\n\n const horizontal = (page.x > rect.left) && (page.x < rect.right);\n const vertical = (page.y > rect.top ) && (page.y < rect.bottom);\n\n dropped = horizontal && vertical;\n }\n\n const dragRect = draggable.getRect(draggableElement);\n\n if (dragRect && dropOverlap === 'center') {\n const cx = dragRect.left + dragRect.width / 2;\n const cy = dragRect.top + dragRect.height / 2;\n\n dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom;\n }\n\n if (dragRect && utils.is.number(dropOverlap)) {\n const overlapArea = (Math.max(0, Math.min(rect.right , dragRect.right ) - Math.max(rect.left, dragRect.left))\n * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top , dragRect.top )));\n\n const overlapRatio = overlapArea / (dragRect.width * dragRect.height);\n\n dropped = overlapRatio >= dropOverlap;\n }\n\n if (this.options.drop.checker) {\n dropped = this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement);\n }\n\n return dropped;\n};\n\nInteractable.signals.on('unset', function ({ interactable }) {\n interactable.dropzone(false);\n});\n\nInteractable.settingsMethods.push('dropChecker');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.dropTarget = null; // the dropzone a drag target might be dropped into\n interaction.dropElement = null; // the element at the time of checking\n interaction.prevDropTarget = null; // the dropzone that was recently dragged away from\n interaction.prevDropElement = null; // the element at the time of checking\n interaction.dropEvents = null; // the dropEvents related to the current drag event\n\n interaction.activeDrops = {\n dropzones: [], // the dropzones that are mentioned below\n elements : [], // elements of dropzones that accept the target draggable\n rects : [], // the rects of the elements mentioned above\n };\n\n});\n\nInteraction.signals.on('stop', function ({ interaction }) {\n interaction.dropTarget = interaction.dropElement =\n interaction.prevDropTarget = interaction.prevDropElement = null;\n});\n\n/*\\\n * interact.dynamicDrop\n [ method ]\n *\n * Returns or sets whether the dimensions of dropzone elements are\n * calculated on every dragmove or only on dragstart for the default\n * dropChecker\n *\n - newValue (boolean) #optional True to check on each move. False to check only before start\n = (boolean | interact) The current setting or interact\n\\*/\ninteract.dynamicDrop = function (newValue) {\n if (utils.is.bool(newValue)) {\n //if (dragging && dynamicDrop !== newValue && !newValue) {\n //calcRects(dropzones);\n //}\n\n dynamicDrop = newValue;\n\n return interact;\n }\n return dynamicDrop;\n};\n\nutils.merge(Interactable.eventTypes, [\n 'dragenter',\n 'dragleave',\n 'dropactivate',\n 'dropdeactivate',\n 'dropmove',\n 'drop',\n]);\nactions.methodDict.drop = 'dropzone';\n\ndefaultOptions.drop = drop.defaults;\n\nmodule.exports = drop;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst gesture = {\n defaults: {\n enabled : false,\n origin : null,\n restrict: null,\n },\n\n checker: function (pointer, event, interactable, element, interaction) {\n if (interaction.pointerIds.length >= 2) {\n return { name: 'gesture' };\n }\n\n return null;\n },\n\n getCursor: function () {\n return '';\n },\n};\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturestart') { return; }\n iEvent.ds = 0;\n\n interaction.gesture.startDistance = interaction.gesture.prevDistance = iEvent.distance;\n interaction.gesture.startAngle = interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.scale = 1;\n});\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturemove') { return; }\n\n iEvent.ds = iEvent.scale - interaction.gesture.scale;\n\n interaction.target.fire(iEvent);\n\n interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.prevDistance = iEvent.distance;\n\n if (iEvent.scale !== Infinity\n && iEvent.scale !== null\n && iEvent.scale !== undefined\n && !isNaN(iEvent.scale)) {\n\n interaction.gesture.scale = iEvent.scale;\n }\n});\n\n/*\\\n * Interactable.gesturable\n [ method ]\n *\n * Gets or sets whether multitouch gestures can be performed on the\n * Interactable's element\n *\n = (boolean) Indicates if this can be the target of gesture events\n | var isGestureable = interact(element).gesturable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on gesture events (makes the Interactable gesturable)\n = (object) this Interactable\n | interact(element).gesturable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // limit multiple gestures.\n | // See the explanation in @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n\\*/\nInteractable.prototype.gesturable = function (options) {\n if (utils.is.object(options)) {\n this.options.gesture.enabled = options.enabled === false? false: true;\n this.setPerAction('gesture', options);\n this.setOnEvents('gesture', options);\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.gesture.enabled = options;\n\n if (!options) {\n this.ongesturestart = this.ongesturestart = this.ongestureend = null;\n }\n\n return this;\n }\n\n return this.options.gesture;\n};\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action, event, starting, ending, deltaSource }) {\n if (action !== 'gesture') { return; }\n\n const pointers = interaction.pointers;\n\n iEvent.touches = [pointers[0], pointers[1]];\n\n if (starting) {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = 1;\n iEvent.ds = 0;\n iEvent.angle = utils.touchAngle(pointers, undefined, deltaSource);\n iEvent.da = 0;\n }\n else if (ending || event instanceof InteractEvent) {\n iEvent.distance = interaction.prevEvent.distance;\n iEvent.box = interaction.prevEvent.box;\n iEvent.scale = interaction.prevEvent.scale;\n iEvent.ds = iEvent.scale - 1;\n iEvent.angle = interaction.prevEvent.angle;\n iEvent.da = iEvent.angle - interaction.gesture.startAngle;\n }\n else {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = iEvent.distance / interaction.gesture.startDistance;\n iEvent.angle = utils.touchAngle(pointers, interaction.gesture.prevAngle, deltaSource);\n\n iEvent.ds = iEvent.scale - interaction.gesture.prevScale;\n iEvent.da = iEvent.angle - interaction.gesture.prevAngle;\n }\n});\n\nInteraction.signals.on('new', function (interaction) {\n interaction.gesture = {\n start: { x: 0, y: 0 },\n\n startDistance: 0, // distance between two touches of touchStart\n prevDistance : 0,\n distance : 0,\n\n scale: 1, // gesture.distance / gesture.startDistance\n\n startAngle: 0, // angle of line joining two touches\n prevAngle : 0, // angle of the previous gesture event\n };\n});\n\nactions.gesture = gesture;\nactions.names.push('gesture');\nutils.merge(Interactable.eventTypes, [\n 'gesturestart',\n 'gesturemove',\n 'gestureend',\n]);\nactions.methodDict.gesture = 'gesturable';\n\ndefaultOptions.gesture = gesture.defaults;\n\nmodule.exports = gesture;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\n// Less Precision with touch input\nconst defaultMargin = browser.supportsTouch || browser.supportsPointerEvent? 20: 10;\n\nconst resize = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n square: false,\n preserveAspectRatio: false,\n axis: 'xy',\n\n // use default margin\n margin: NaN,\n\n // object with props left, right, top, bottom which are\n // true/false values to resize when the pointer is over that edge,\n // CSS selectors to match the handles for each direction\n // or the Elements for each handle\n edges: null,\n\n // a value of 'none' will limit the resize rect to a minimum of 0x0\n // 'negate' will alow the rect to have negative width/height\n // 'reposition' will keep the width/height positive by swapping\n // the top and bottom edges and/or swapping the left and right edges\n invert: 'none',\n },\n\n checker: function (pointer, event, interactable, element, interaction, rect) {\n if (!rect) { return null; }\n\n const page = utils.extend({}, interaction.curCoords.page);\n const options = interactable.options;\n\n if (options.resize.enabled) {\n const resizeOptions = options.resize;\n const resizeEdges = { left: false, right: false, top: false, bottom: false };\n\n // if using resize.edges\n if (utils.is.object(resizeOptions.edges)) {\n for (const edge in resizeEdges) {\n resizeEdges[edge] = checkResizeEdge(edge,\n resizeOptions.edges[edge],\n page,\n interaction._eventTarget,\n element,\n rect,\n resizeOptions.margin || defaultMargin);\n }\n\n resizeEdges.left = resizeEdges.left && !resizeEdges.right;\n resizeEdges.top = resizeEdges.top && !resizeEdges.bottom;\n\n if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) {\n return {\n name: 'resize',\n edges: resizeEdges,\n };\n }\n }\n else {\n const right = options.resize.axis !== 'y' && page.x > (rect.right - defaultMargin);\n const bottom = options.resize.axis !== 'x' && page.y > (rect.bottom - defaultMargin);\n\n if (right || bottom) {\n return {\n name: 'resize',\n axes: (right? 'x' : '') + (bottom? 'y' : ''),\n };\n }\n }\n }\n\n return null;\n },\n\n cursors: (browser.isIe9OrOlder ? {\n x : 'e-resize',\n y : 's-resize',\n xy: 'se-resize',\n\n top : 'n-resize',\n left : 'w-resize',\n bottom : 's-resize',\n right : 'e-resize',\n topleft : 'se-resize',\n bottomright: 'se-resize',\n topright : 'ne-resize',\n bottomleft : 'ne-resize',\n } : {\n x : 'ew-resize',\n y : 'ns-resize',\n xy: 'nwse-resize',\n\n top : 'ns-resize',\n left : 'ew-resize',\n bottom : 'ns-resize',\n right : 'ew-resize',\n topleft : 'nwse-resize',\n bottomright: 'nwse-resize',\n topright : 'nesw-resize',\n bottomleft : 'nesw-resize',\n }),\n\n getCursor: function (action) {\n if (action.axis) {\n return resize.cursors[action.name + action.axis];\n }\n else if (action.edges) {\n let cursorKey = '';\n const edgeNames = ['top', 'bottom', 'left', 'right'];\n\n for (let i = 0; i < 4; i++) {\n if (action.edges[edgeNames[i]]) {\n cursorKey += edgeNames[i];\n }\n }\n\n return resize.cursors[cursorKey];\n }\n },\n};\n\n// resizestart\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'resizestart' || !interaction.prepared.edges) {\n return;\n }\n\n const startRect = interaction.target.getRect(interaction.element);\n const resizeOptions = interaction.target.options.resize;\n\n /*\n * When using the `resizable.square` or `resizable.preserveAspectRatio` options, resizing from one edge\n * will affect another. E.g. with `resizable.square`, resizing to make the right edge larger will make\n * the bottom edge larger by the same amount. We call these 'linked' edges. Any linked edges will depend\n * on the active edges and the edge being interacted with.\n */\n if (resizeOptions.square || resizeOptions.preserveAspectRatio) {\n const linkedEdges = utils.extend({}, interaction.prepared.edges);\n\n linkedEdges.top = linkedEdges.top || (linkedEdges.left && !linkedEdges.bottom);\n linkedEdges.left = linkedEdges.left || (linkedEdges.top && !linkedEdges.right );\n linkedEdges.bottom = linkedEdges.bottom || (linkedEdges.right && !linkedEdges.top );\n linkedEdges.right = linkedEdges.right || (linkedEdges.bottom && !linkedEdges.left );\n\n interaction.prepared._linkedEdges = linkedEdges;\n }\n else {\n interaction.prepared._linkedEdges = null;\n }\n\n // if using `resizable.preserveAspectRatio` option, record aspect ratio at the start of the resize\n if (resizeOptions.preserveAspectRatio) {\n interaction.resizeStartAspectRatio = startRect.width / startRect.height;\n }\n\n interaction.resizeRects = {\n start : startRect,\n current : utils.extend({}, startRect),\n inverted : utils.extend({}, startRect),\n previous : utils.extend({}, startRect),\n delta : {\n left: 0, right : 0, width : 0,\n top : 0, bottom: 0, height: 0,\n },\n };\n\n iEvent.rect = interaction.resizeRects.inverted;\n iEvent.deltaRect = interaction.resizeRects.delta;\n});\n\n// resizemove\nInteractEvent.signals.on('new', function ({ iEvent, phase, interaction }) {\n if (phase !== 'move' || !interaction.prepared.edges) { return; }\n\n const resizeOptions = interaction.target.options.resize;\n const invert = resizeOptions.invert;\n const invertible = invert === 'reposition' || invert === 'negate';\n\n let edges = interaction.prepared.edges;\n\n const start = interaction.resizeRects.start;\n const current = interaction.resizeRects.current;\n const inverted = interaction.resizeRects.inverted;\n const delta = interaction.resizeRects.delta;\n const previous = utils.extend(interaction.resizeRects.previous, inverted);\n const originalEdges = edges;\n\n let dx = iEvent.dx;\n let dy = iEvent.dy;\n\n if (resizeOptions.preserveAspectRatio || resizeOptions.square) {\n // `resize.preserveAspectRatio` takes precedence over `resize.square`\n const startAspectRatio = resizeOptions.preserveAspectRatio\n ? interaction.resizeStartAspectRatio\n : 1;\n\n edges = interaction.prepared._linkedEdges;\n\n if ((originalEdges.left && originalEdges.bottom)\n || (originalEdges.right && originalEdges.top)) {\n dy = -dx / startAspectRatio;\n }\n else if (originalEdges.left || originalEdges.right ) { dy = dx / startAspectRatio; }\n else if (originalEdges.top || originalEdges.bottom) { dx = dy * startAspectRatio; }\n }\n\n // update the 'current' rect without modifications\n if (edges.top ) { current.top += dy; }\n if (edges.bottom) { current.bottom += dy; }\n if (edges.left ) { current.left += dx; }\n if (edges.right ) { current.right += dx; }\n\n if (invertible) {\n // if invertible, copy the current rect\n utils.extend(inverted, current);\n\n if (invert === 'reposition') {\n // swap edge values if necessary to keep width/height positive\n let swap;\n\n if (inverted.top > inverted.bottom) {\n swap = inverted.top;\n\n inverted.top = inverted.bottom;\n inverted.bottom = swap;\n }\n if (inverted.left > inverted.right) {\n swap = inverted.left;\n\n inverted.left = inverted.right;\n inverted.right = swap;\n }\n }\n }\n else {\n // if not invertible, restrict to minimum of 0x0 rect\n inverted.top = Math.min(current.top, start.bottom);\n inverted.bottom = Math.max(current.bottom, start.top);\n inverted.left = Math.min(current.left, start.right);\n inverted.right = Math.max(current.right, start.left);\n }\n\n inverted.width = inverted.right - inverted.left;\n inverted.height = inverted.bottom - inverted.top ;\n\n for (const edge in inverted) {\n delta[edge] = inverted[edge] - previous[edge];\n }\n\n iEvent.edges = interaction.prepared.edges;\n iEvent.rect = inverted;\n iEvent.deltaRect = delta;\n});\n\n/*\\\n * Interactable.resizable\n [ method ]\n *\n * Gets or sets whether resize actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of resize elements\n | var isResizeable = interact('input[type=text]').resizable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on resize events (object makes the Interactable resizable)\n = (object) This Interactable\n | interact(element).resizable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | edges: {\n | top : true, // Use pointer coords to check for resize.\n | left : false, // Disable resizing from left edge.\n | bottom: '.resize-s',// Resize if pointer target matches selector\n | right : handleEl // Resize if pointer target is the given Element\n | },\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height are adjusted at a 1:1 ratio.\n | square: false,\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height maintain the aspect ratio they had when resizing started.\n | preserveAspectRatio: false,\n |\n | // a value of 'none' will limit the resize rect to a minimum of 0x0\n | // 'negate' will allow the rect to have negative width/height\n | // 'reposition' will keep the width/height positive by swapping\n | // the top and bottom edges and/or swapping the left and right edges\n | invert: 'none' || 'negate' || 'reposition'\n |\n | // limit multiple resizes.\n | // See the explanation in the @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n \\*/\nInteractable.prototype.resizable = function (options) {\n if (utils.is.object(options)) {\n this.options.resize.enabled = options.enabled === false? false: true;\n this.setPerAction('resize', options);\n this.setOnEvents('resize', options);\n\n if (/^x$|^y$|^xy$/.test(options.axis)) {\n this.options.resize.axis = options.axis;\n }\n else if (options.axis === null) {\n this.options.resize.axis = defaultOptions.resize.axis;\n }\n\n if (utils.is.bool(options.preserveAspectRatio)) {\n this.options.resize.preserveAspectRatio = options.preserveAspectRatio;\n }\n else if (utils.is.bool(options.square)) {\n this.options.resize.square = options.square;\n }\n\n return this;\n }\n if (utils.is.bool(options)) {\n this.options.resize.enabled = options;\n\n if (!options) {\n this.onresizestart = this.onresizestart = this.onresizeend = null;\n }\n\n return this;\n }\n return this.options.resize;\n};\n\nfunction checkResizeEdge (name, value, page, element, interactableElement, rect, margin) {\n // false, '', undefined, null\n if (!value) { return false; }\n\n // true value, use pointer coords and element rect\n if (value === true) {\n // if dimensions are negative, \"switch\" edges\n const width = utils.is.number(rect.width )? rect.width : rect.right - rect.left;\n const height = utils.is.number(rect.height)? rect.height : rect.bottom - rect.top ;\n\n if (width < 0) {\n if (name === 'left' ) { name = 'right'; }\n else if (name === 'right') { name = 'left' ; }\n }\n if (height < 0) {\n if (name === 'top' ) { name = 'bottom'; }\n else if (name === 'bottom') { name = 'top' ; }\n }\n\n if (name === 'left' ) { return page.x < ((width >= 0? rect.left: rect.right ) + margin); }\n if (name === 'top' ) { return page.y < ((height >= 0? rect.top : rect.bottom) + margin); }\n\n if (name === 'right' ) { return page.x > ((width >= 0? rect.right : rect.left) - margin); }\n if (name === 'bottom') { return page.y > ((height >= 0? rect.bottom: rect.top ) - margin); }\n }\n\n // the remaining checks require an element\n if (!utils.is.element(element)) { return false; }\n\n return utils.is.element(value)\n // the value is an element to use as a resize handle\n ? value === element\n // otherwise check if element matches value as selector\n : utils.matchesUpTo(element, value, interactableElement);\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.resizeAxes = 'xy';\n});\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action }) {\n if (action !== 'resize' || !interaction.resizeAxes) { return; }\n\n const options = interaction.target.options;\n\n if (options.resize.square) {\n if (interaction.resizeAxes === 'y') {\n iEvent.dx = iEvent.dy;\n }\n else {\n iEvent.dy = iEvent.dx;\n }\n iEvent.axes = 'xy';\n }\n else {\n iEvent.axes = interaction.resizeAxes;\n\n if (interaction.resizeAxes === 'x') {\n iEvent.dy = 0;\n }\n else if (interaction.resizeAxes === 'y') {\n iEvent.dx = 0;\n }\n }\n});\n\nactions.resize = resize;\nactions.names.push('resize');\nutils.merge(Interactable.eventTypes, [\n 'resizestart',\n 'resizemove',\n 'resizeinertiastart',\n 'resizeinertiaresume',\n 'resizeend',\n]);\nactions.methodDict.resize = 'resizable';\n\ndefaultOptions.resize = resize.defaults;\n\nmodule.exports = resize;\n","const raf = require('./utils/raf');\nconst getWindow = require('./utils/window').getWindow;\nconst is = require('./utils/is');\nconst domUtils = require('./utils/domUtils');\nconst Interaction = require('./Interaction');\nconst defaultOptions = require('./defaultOptions');\n\nconst autoScroll = {\n defaults: {\n enabled : false,\n container: null, // the item that is scrolled (Window or HTMLElement)\n margin : 60,\n speed : 300, // the scroll speed in pixels per second\n },\n\n interaction: null,\n i: null, // the handle returned by window.setInterval\n x: 0, y: 0, // Direction each pulse is to scroll in\n\n isScrolling: false,\n prevTime: 0,\n\n start: function (interaction) {\n autoScroll.isScrolling = true;\n raf.cancel(autoScroll.i);\n\n autoScroll.interaction = interaction;\n autoScroll.prevTime = new Date().getTime();\n autoScroll.i = raf.request(autoScroll.scroll);\n },\n\n stop: function () {\n autoScroll.isScrolling = false;\n raf.cancel(autoScroll.i);\n },\n\n // scroll the window by the values in scroll.x/y\n scroll: function () {\n const options = autoScroll.interaction.target.options[autoScroll.interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(autoScroll.interaction.element);\n const now = new Date().getTime();\n // change in time in seconds\n const dt = (now - autoScroll.prevTime) / 1000;\n // displacement\n const s = options.speed * dt;\n\n if (s >= 1) {\n if (is.window(container)) {\n container.scrollBy(autoScroll.x * s, autoScroll.y * s);\n }\n else if (container) {\n container.scrollLeft += autoScroll.x * s;\n container.scrollTop += autoScroll.y * s;\n }\n\n autoScroll.prevTime = now;\n }\n\n if (autoScroll.isScrolling) {\n raf.cancel(autoScroll.i);\n autoScroll.i = raf.request(autoScroll.scroll);\n }\n },\n check: function (interactable, actionName) {\n const options = interactable.options;\n\n return options[actionName].autoScroll && options[actionName].autoScroll.enabled;\n },\n onInteractionMove: function ({ interaction, pointer }) {\n if (!(interaction.interacting()\n && autoScroll.check(interaction.target, interaction.prepared.name))) {\n return;\n }\n\n if (interaction.simulation) {\n autoScroll.x = autoScroll.y = 0;\n return;\n }\n\n let top;\n let right;\n let bottom;\n let left;\n\n const options = interaction.target.options[interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(interaction.element);\n\n if (is.window(container)) {\n left = pointer.clientX < autoScroll.margin;\n top = pointer.clientY < autoScroll.margin;\n right = pointer.clientX > container.innerWidth - autoScroll.margin;\n bottom = pointer.clientY > container.innerHeight - autoScroll.margin;\n }\n else {\n const rect = domUtils.getElementClientRect(container);\n\n left = pointer.clientX < rect.left + autoScroll.margin;\n top = pointer.clientY < rect.top + autoScroll.margin;\n right = pointer.clientX > rect.right - autoScroll.margin;\n bottom = pointer.clientY > rect.bottom - autoScroll.margin;\n }\n\n autoScroll.x = (right ? 1: left? -1: 0);\n autoScroll.y = (bottom? 1: top? -1: 0);\n\n if (!autoScroll.isScrolling) {\n // set the autoScroll properties to those of the target\n autoScroll.margin = options.margin;\n autoScroll.speed = options.speed;\n\n autoScroll.start(interaction);\n }\n },\n};\n\nInteraction.signals.on('stop-active', function () {\n autoScroll.stop();\n});\n\nInteraction.signals.on('action-move', autoScroll.onInteractionMove);\n\ndefaultOptions.perAction.autoScroll = autoScroll.defaults;\n\nmodule.exports = autoScroll;\n","const Interactable = require('../Interactable');\nconst actions = require('../actions/base');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.ignoreFrom\n [ method ]\n *\n * If the target of the `mousedown`, `pointerdown` or `touchstart`\n * event or any of it's parents match the given CSS selector or\n * Element, no drag/resize/gesture is started.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to not ignore any elements\n = (string | Element | object) The current ignoreFrom value or this Interactable\n **\n | interact(element, { ignoreFrom: document.getElementById('no-action') });\n | // or\n | interact(element).ignoreFrom('input, textarea, a');\n\\*/\nInteractable.prototype.ignoreFrom = function (newValue) {\n return this._backCompatOption('ignoreFrom', newValue);\n};\n\n/*\\\n * Interactable.allowFrom\n [ method ]\n *\n * A drag/resize/gesture is started only If the target of the\n * `mousedown`, `pointerdown` or `touchstart` event or any of it's\n * parents match the given CSS selector or Element.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to allow from any element\n = (string | Element | object) The current allowFrom value or this Interactable\n **\n | interact(element, { allowFrom: document.getElementById('drag-handle') });\n | // or\n | interact(element).allowFrom('.handle');\n\\*/\nInteractable.prototype.allowFrom = function (newValue) {\n return this._backCompatOption('allowFrom', newValue);\n};\n\nInteractable.prototype.testIgnore = function (ignoreFrom, interactableElement, element) {\n if (!ignoreFrom || !is.element(element)) { return false; }\n\n if (is.string(ignoreFrom)) {\n return domUtils.matchesUpTo(element, ignoreFrom, interactableElement);\n }\n else if (is.element(ignoreFrom)) {\n return domUtils.nodeContains(ignoreFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testAllow = function (allowFrom, interactableElement, element) {\n if (!allowFrom) { return true; }\n\n if (!is.element(element)) { return false; }\n\n if (is.string(allowFrom)) {\n return domUtils.matchesUpTo(element, allowFrom, interactableElement);\n }\n else if (is.element(allowFrom)) {\n return domUtils.nodeContains(allowFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testIgnoreAllow = function (options, interactableElement, eventTarget) {\n return (!this.testIgnore(options.ignoreFrom, interactableElement, eventTarget)\n && this.testAllow(options.allowFrom, interactableElement, eventTarget));\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (event.buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\n","const interact = require('../interact');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst actions = require('../actions/base');\nconst defaultOptions = require('../defaultOptions');\nconst browser = require('../utils/browser');\nconst scope = require('../scope');\nconst utils = require('../utils');\nconst signals = require('../utils/Signals').new();\n\nrequire('./InteractableMethods');\n\nconst autoStart = {\n signals,\n withinInteractionLimit,\n // Allow this many interactions to happen simultaneously\n maxInteractions: Infinity,\n defaults: {\n perAction: {\n manualStart: false,\n max: Infinity,\n maxPerElement: 1,\n allowFrom: null,\n ignoreFrom: null,\n },\n },\n setActionDefaults: function (action) {\n utils.extend(action.defaults, autoStart.defaults.perAction);\n },\n};\n\n// set cursor style on mousedown\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget }) {\n if (interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\n// set cursor style on mousemove\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget }) {\n if (!interaction.mouse\n || interaction.pointerIsDown\n || interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\nInteraction.signals.on('move', function (arg) {\n const { interaction, event } = arg;\n\n if (!interaction.pointerIsDown\n || interaction.interacting()\n || !interaction.pointerWasMoved\n || !interaction.prepared.name) {\n return;\n }\n\n signals.fire('before-start', arg);\n\n const target = interaction.target;\n\n if (interaction.prepared.name && target) {\n // check manualStart and interaction limit\n if (target.options[interaction.prepared.name].manualStart\n || !withinInteractionLimit(target, interaction.element, interaction.prepared)) {\n interaction.stop(event);\n }\n else {\n interaction.start(interaction.prepared, target, interaction.element);\n }\n }\n});\n\n// Check if the current target supports the action.\n// If so, return the validated action. Otherwise, return null\nfunction validateAction (action, interactable, element, eventTarget) {\n if (utils.is.object(action)\n && interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget)\n && interactable.options[action.name].enabled\n && withinInteractionLimit(interactable, element, action)) {\n return action;\n }\n\n return null;\n}\n\nfunction validateSelector (interaction, pointer, event, matches, matchElements, eventTarget) {\n for (let i = 0, len = matches.length; i < len; i++) {\n const match = matches[i];\n const matchElement = matchElements[i];\n const action = validateAction(match.getAction(pointer, event, interaction, matchElement),\n match,\n matchElement,\n eventTarget);\n\n if (action) {\n return {\n action,\n target: match,\n element: matchElement,\n };\n }\n }\n\n return {};\n}\n\nfunction getActionInfo (interaction, pointer, event, eventTarget) {\n let matches = [];\n let matchElements = [];\n\n let element = eventTarget;\n let action = null;\n\n function pushMatches (interactable, selector, context) {\n const elements = (browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined);\n\n if (utils.matchesSelector(element, selector, elements)) {\n\n matches.push(interactable);\n matchElements.push(element);\n }\n }\n\n while (utils.is.element(element)) {\n matches = [];\n matchElements = [];\n\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && (action = validateAction(elementInteractable.getAction(pointer, event, interaction, element, eventTarget),\n elementInteractable,\n element,\n eventTarget))\n && !elementInteractable.options[action.name].manualStart) {\n return {\n element,\n action,\n target: elementInteractable,\n };\n }\n else {\n scope.interactables.forEachSelector(pushMatches, element);\n\n const actionInfo = validateSelector(interaction, pointer, event, matches, matchElements, eventTarget);\n\n if (actionInfo.action\n && !actionInfo.target.options[actionInfo.action.name].manualStart) {\n return actionInfo;\n }\n }\n\n element = utils.parentNode(element);\n }\n\n return {};\n}\n\nfunction prepare (interaction, { action, target, element }) {\n action = action || {};\n\n if (interaction.target && interaction.target.options.styleCursor) {\n interaction.target._doc.documentElement.style.cursor = '';\n }\n\n interaction.target = target;\n interaction.element = element;\n utils.copyAction(interaction.prepared, action);\n\n if (target && target.options.styleCursor) {\n const cursor = action? actions[action.name].getCursor(action) : '';\n interaction.target._doc.documentElement.style.cursor = cursor;\n }\n\n signals.fire('prepared', { interaction: interaction });\n}\n\nInteraction.signals.on('stop', function ({ interaction }) {\n const target = interaction.target;\n\n if (target && target.options.styleCursor) {\n target._doc.documentElement.style.cursor = '';\n }\n});\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (utils.is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (utils.is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n const buttons = event.buttons || ({\n 0: 1,\n 1: 4,\n 3: 8,\n 4: 16,\n })[event.button];\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\nfunction withinInteractionLimit (interactable, element, action) {\n const options = interactable.options;\n const maxActions = options[action.name].max;\n const maxPerElement = options[action.name].maxPerElement;\n let activeInteractions = 0;\n let targetCount = 0;\n let targetElementCount = 0;\n\n // no actions if any of these values == 0\n if (!(maxActions && maxPerElement && autoStart.maxInteractions)) { return; }\n\n for (let i = 0, len = scope.interactions.length; i < len; i++) {\n const interaction = scope.interactions[i];\n const otherAction = interaction.prepared.name;\n\n if (!interaction.interacting()) { continue; }\n\n activeInteractions++;\n\n if (activeInteractions >= autoStart.maxInteractions) {\n return false;\n }\n\n if (interaction.target !== interactable) { continue; }\n\n targetCount += (otherAction === action.name)|0;\n\n if (targetCount >= maxActions) {\n return false;\n }\n\n if (interaction.element === element) {\n targetElementCount++;\n\n if (otherAction !== action.name || targetElementCount >= maxPerElement) {\n return false;\n }\n }\n }\n\n return autoStart.maxInteractions > 0;\n}\n\n/*\\\n * interact.maxInteractions\n [ method ]\n **\n * Returns or sets the maximum number of concurrent interactions allowed.\n * By default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables\n * and elements, you need to enable it in the draggable, resizable and\n * gesturable `'max'` and `'maxPerElement'` options.\n **\n - newValue (number) #optional Any number. newValue <= 0 means no interactions.\n\\*/\ninteract.maxInteractions = function (newValue) {\n if (utils.is.number(newValue)) {\n autoStart.maxInteractions = newValue;\n\n return this;\n }\n\n return autoStart.maxInteractions;\n};\n\nInteractable.settingsMethods.push('styleCursor');\nInteractable.settingsMethods.push('actionChecker');\nInteractable.settingsMethods.push('ignoreFrom');\nInteractable.settingsMethods.push('allowFrom');\n\ndefaultOptions.base.actionChecker = null;\ndefaultOptions.base.styleCursor = true;\n\nutils.extend(defaultOptions.perAction, autoStart.defaults.perAction);\n\nmodule.exports = autoStart;\n","const autoStart = require('./base');\nconst Interaction = require('../Interaction');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.delayTimer = null;\n});\n\nautoStart.signals.on('prepared', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.delayTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.target, interaction.element);\n }, delay);\n }\n});\n\nInteraction.signals.on('move', function ({ interaction, duplicate }) {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.delayTimer);\n }\n});\n\n// prevent regular down->move autoStart\nautoStart.signals.on('before-start', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.prepared.name = null;\n }\n});\n","const autoStart = require('./base');\nconst scope = require('../scope');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\n\nconst { matchesSelector, parentNode } = require('../utils/domUtils');\n\nautoStart.setActionDefaults(require('../actions/drag'));\n\nautoStart.signals.on('before-start', function ({ interaction, eventTarget, dx, dy }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // check if a drag is in the correct axis\n const absX = Math.abs(dx);\n const absY = Math.abs(dy);\n const options = interaction.target.options.drag;\n const startAxis = options.startAxis;\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy');\n\n interaction.prepared.axis = options.lockAxis === 'start'\n ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n : options.lockAxis;\n\n // if the movement isn't in the startAxis of the interactable\n if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) {\n // cancel the prepared action\n interaction.prepared.name = null;\n\n // then try to get a drag from another ineractable\n\n if (!interaction.prepared.name) {\n\n let element = eventTarget;\n\n const getDraggable = function (interactable, selector, context) {\n const elements = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n if (interactable === interaction.target) { return; }\n\n if (!options.manualStart\n && !interactable.testIgnoreAllow(options, element, eventTarget)\n && matchesSelector(element, selector, elements)) {\n\n const action = interactable.getAction(interaction.downPointer,\n interaction.downEvent,\n interaction,\n element);\n\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, interactable)\n && autoStart.validateAction(action, interactable, element, eventTarget)) {\n\n return interactable;\n }\n }\n };\n\n let action = null;\n\n // check all interactables\n while (is.element(element)) {\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && elementInteractable !== interaction.target\n && !elementInteractable.options.drag.manualStart) {\n\n action = elementInteractable.getAction(interaction.downPointer, interaction.downEvent, interaction, element);\n }\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, elementInteractable)) {\n\n interaction.prepared.name = 'drag';\n interaction.target = elementInteractable;\n interaction.element = element;\n break;\n }\n\n const selectorInteractable = scope.interactables.forEachSelector(getDraggable, element);\n\n if (selectorInteractable) {\n interaction.prepared.name = 'drag';\n interaction.target = selectorInteractable;\n interaction.element = element;\n break;\n }\n\n element = parentNode(element);\n }\n }\n }\n});\n\nfunction checkStartAxis (startAxis, interactable) {\n if (!interactable) { return false; }\n\n const thisAxis = interactable.options.drag.startAxis;\n\n return (startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis);\n}\n","require('./base').setActionDefaults(require('../actions/gesture'));\n","require('./base').setActionDefaults(require('../actions/resize'));\n","module.exports = {\n base: {\n accept : null,\n preventDefault: 'auto',\n deltaSource : 'page',\n },\n\n perAction: {\n origin: { x: 0, y: 0 },\n\n // only allow left button by default\n // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n mouseButtons: 1,\n\n inertia: {\n enabled : false,\n resistance : 10, // the lambda in exponential decay\n minSpeed : 100, // target speed must be above this for inertia to start\n endSpeed : 10, // the speed at which inertia is slow enough to stop\n allowResume : true, // allow resuming an action in inertia phase\n smoothEndDuration: 300, // animate to snap/restrict endOnly if there's no inertia\n },\n },\n};\n","/* browser entry point */\n\n// Legacy browser support\nrequire('./legacyBrowsers');\n\n// inertia\nrequire('./inertia');\n\n// modifiers\nrequire('./modifiers/snap');\nrequire('./modifiers/restrict');\n\n// pointerEvents\nrequire('./pointerEvents/base');\nrequire('./pointerEvents/holdRepeat');\nrequire('./pointerEvents/interactableTargets');\n\n// delay\nrequire('./autoStart/delay');\n\n// actions\nrequire('./actions/gesture');\nrequire('./actions/resize');\nrequire('./actions/drag');\nrequire('./actions/drop');\n\n// load these modifiers after resize is loaded\nrequire('./modifiers/snapSize');\nrequire('./modifiers/restrictEdges');\nrequire('./modifiers/restrictSize');\n\n// autoStart actions\nrequire('./autoStart/gesture');\nrequire('./autoStart/resize');\nrequire('./autoStart/drag');\n\n// Interactable preventDefault setting\nrequire('./interactablePreventDefault.js');\n\n// autoScroll\nrequire('./autoScroll');\n\n// export interact\nmodule.exports = require('./interact');\n","const InteractEvent = require('./InteractEvent');\nconst Interaction = require('./Interaction');\nconst modifiers = require('./modifiers');\nconst utils = require('./utils');\nconst animationFrame = require('./utils/raf');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.inertiaStatus = {\n active : false,\n smoothEnd : false,\n allowResume: false,\n\n startEvent: null,\n upCoords : {},\n\n xe: 0, ye: 0,\n sx: 0, sy: 0,\n\n t0: 0,\n vx0: 0, vys: 0,\n duration: 0,\n\n lambda_v0: 0,\n one_ve_v0: 0,\n i : null,\n };\n\n interaction.boundInertiaFrame = () => inertiaFrame .apply(interaction);\n interaction.boundSmoothEndFrame = () => smoothEndFrame.apply(interaction);\n});\n\nInteraction.signals.on('down', function ({ interaction, event, pointer, eventTarget }) {\n const status = interaction.inertiaStatus;\n\n // Check if the down event hits the current inertia target\n if (status.active) {\n let element = eventTarget;\n\n // climb up the DOM tree from the event target\n while (utils.is.element(element)) {\n\n // if interaction element is the current inertia target element\n if (element === interaction.element) {\n // stop inertia\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n\n // update pointers to the down event's coordinates\n interaction.updatePointer(pointer);\n utils.setCoords(interaction.curCoords, interaction.pointers);\n\n // fire appropriate signals\n const signalArg = { interaction };\n Interaction.signals.fire('before-action-move', signalArg);\n Interaction.signals.fire('action-resume' , signalArg);\n\n // fire a reume event\n const resumeEvent = new InteractEvent(interaction,\n event,\n interaction.prepared.name,\n 'inertiaresume',\n interaction.element);\n\n interaction.target.fire(resumeEvent);\n interaction.prevEvent = resumeEvent;\n modifiers.resetStatuses(interaction.modifierStatuses);\n\n utils.copyCoords(interaction.prevCoords, interaction.curCoords);\n break;\n }\n\n element = utils.parentNode(element);\n }\n }\n});\n\nInteraction.signals.on('up', function ({ interaction, event }) {\n const status = interaction.inertiaStatus;\n\n if (!interaction.interacting() || status.active) { return; }\n\n const target = interaction.target;\n const options = target && target.options;\n const inertiaOptions = options && interaction.prepared.name && options[interaction.prepared.name].inertia;\n\n const now = new Date().getTime();\n const statuses = {};\n const page = utils.extend({}, interaction.curCoords.page);\n const pointerSpeed = interaction.pointerDelta.client.speed;\n\n let smoothEnd = false;\n let modifierResult;\n\n // check if inertia should be started\n const inertiaPossible = (inertiaOptions && inertiaOptions.enabled\n && interaction.prepared.name !== 'gesture'\n && event !== status.startEvent);\n\n const inertia = (inertiaPossible\n && (now - interaction.curCoords.timeStamp) < 50\n && pointerSpeed > inertiaOptions.minSpeed\n && pointerSpeed > inertiaOptions.endSpeed);\n\n const modifierArg = {\n interaction,\n pageCoords: page,\n statuses,\n preEnd: true,\n requireEndOnly: true,\n };\n\n // smoothEnd\n if (inertiaPossible && !inertia) {\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n if (modifierResult.shouldMove && modifierResult.locked) {\n smoothEnd = true;\n }\n }\n\n if (!(inertia || smoothEnd)) { return; }\n\n utils.copyCoords(status.upCoords, interaction.curCoords);\n\n interaction.pointers[0] = status.startEvent =\n new InteractEvent(interaction, event, interaction.prepared.name, 'inertiastart', interaction.element);\n\n status.t0 = now;\n\n status.active = true;\n status.allowResume = inertiaOptions.allowResume;\n interaction.simulation = status;\n\n target.fire(status.startEvent);\n\n if (inertia) {\n status.vx0 = interaction.pointerDelta.client.vx;\n status.vy0 = interaction.pointerDelta.client.vy;\n status.v0 = pointerSpeed;\n\n calcInertia(interaction, status);\n\n utils.extend(page, interaction.curCoords.page);\n\n page.x += status.xe;\n page.y += status.ye;\n\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n status.modifiedXe += modifierResult.dx;\n status.modifiedYe += modifierResult.dy;\n\n status.i = animationFrame.request(interaction.boundInertiaFrame);\n }\n else {\n status.smoothEnd = true;\n status.xe = modifierResult.dx;\n status.ye = modifierResult.dy;\n\n status.sx = status.sy = 0;\n\n status.i = animationFrame.request(interaction.boundSmoothEndFrame);\n }\n});\n\nInteraction.signals.on('stop-active', function ({ interaction }) {\n const status = interaction.inertiaStatus;\n\n if (status.active) {\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n }\n});\n\nfunction calcInertia (interaction, status) {\n const inertiaOptions = interaction.target.options[interaction.prepared.name].inertia;\n const lambda = inertiaOptions.resistance;\n const inertiaDur = -Math.log(inertiaOptions.endSpeed / status.v0) / lambda;\n\n status.x0 = interaction.prevEvent.pageX;\n status.y0 = interaction.prevEvent.pageY;\n status.t0 = status.startEvent.timeStamp / 1000;\n status.sx = status.sy = 0;\n\n status.modifiedXe = status.xe = (status.vx0 - inertiaDur) / lambda;\n status.modifiedYe = status.ye = (status.vy0 - inertiaDur) / lambda;\n status.te = inertiaDur;\n\n status.lambda_v0 = lambda / status.v0;\n status.one_ve_v0 = 1 - inertiaOptions.endSpeed / status.v0;\n}\n\nfunction inertiaFrame () {\n updateInertiaCoords(this);\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n\n const status = this.inertiaStatus;\n const options = this.target.options[this.prepared.name].inertia;\n const lambda = options.resistance;\n const t = new Date().getTime() / 1000 - status.t0;\n\n if (t < status.te) {\n\n const progress = 1 - (Math.exp(-lambda * t) - status.lambda_v0) / status.one_ve_v0;\n\n if (status.modifiedXe === status.xe && status.modifiedYe === status.ye) {\n status.sx = status.xe * progress;\n status.sy = status.ye * progress;\n }\n else {\n const quadPoint = utils.getQuadraticCurvePoint(0, 0,\n status.xe,\n status.ye,\n status.modifiedXe,\n status.modifiedYe,\n progress);\n\n status.sx = quadPoint.x;\n status.sy = quadPoint.y;\n }\n\n this.doMove();\n\n status.i = animationFrame.request(this.boundInertiaFrame);\n }\n else {\n status.sx = status.modifiedXe;\n status.sy = status.modifiedYe;\n\n this.doMove();\n this.end(status.startEvent);\n status.active = false;\n this.simulation = null;\n }\n\n utils.copyCoords(this.prevCoords, this.curCoords);\n}\n\nfunction smoothEndFrame () {\n updateInertiaCoords(this);\n\n const status = this.inertiaStatus;\n const t = new Date().getTime() - status.t0;\n const duration = this.target.options[this.prepared.name].inertia.smoothEndDuration;\n\n if (t < duration) {\n status.sx = utils.easeOutQuad(t, 0, status.xe, duration);\n status.sy = utils.easeOutQuad(t, 0, status.ye, duration);\n\n this.pointerMove(status.startEvent, status.startEvent);\n\n status.i = animationFrame.request(this.boundSmoothEndFrame);\n }\n else {\n status.sx = status.xe;\n status.sy = status.ye;\n\n this.pointerMove(status.startEvent, status.startEvent);\n this.end(status.startEvent);\n\n status.smoothEnd =\n status.active = false;\n this.simulation = null;\n }\n}\n\nfunction updateInertiaCoords (interaction) {\n const status = interaction.inertiaStatus;\n\n // return if inertia isn't running\n if (!status.active) { return; }\n\n const pageUp = status.upCoords.page;\n const clientUp = status.upCoords.client;\n\n utils.setCoords(interaction.curCoords, [ {\n pageX : pageUp.x + status.sx,\n pageY : pageUp.y + status.sy,\n clientX: clientUp.x + status.sx,\n clientY: clientUp.y + status.sy,\n } ]);\n}\n","const browser = require('./utils/browser');\nconst events = require('./utils/events');\nconst utils = require('./utils');\nconst scope = require('./scope');\nconst Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\n\nconst globalEvents = {};\n\n/*\\\n * interact\n [ method ]\n *\n * The methods of this variable can be used to set elements as\n * interactables and also to change various default settings.\n *\n * Calling it as a function and passing an element or a valid CSS selector\n * string returns an Interactable object which has various methods to\n * configure it.\n *\n - element (Element | string) The HTML or SVG Element to interact with or CSS selector\n = (object) An @Interactable\n *\n > Usage\n | interact('#draggable').draggable(true);\n |\n | var rectables = interact('rect');\n | rectables\n | .gesturable(true)\n | .on('gesturemove', function (event) {\n | // ...\n | });\n\\*/\nfunction interact (element, options) {\n let interactable = scope.interactables.get(element, options);\n\n if (!interactable) {\n interactable = new Interactable(element, options);\n interactable.events.global = globalEvents;\n }\n\n return interactable;\n}\n\n/*\\\n * interact.isSet\n [ method ]\n *\n * Check if an element has been set\n - element (Element) The Element being searched for\n = (boolean) Indicates if the element or CSS selector was previously passed to interact\n\\*/\ninteract.isSet = function (element, options) {\n return scope.interactables.indexOfElement(element, options && options.context) !== -1;\n};\n\n/*\\\n * interact.on\n [ method ]\n *\n * Adds a global listener for an InteractEvent or adds a DOM event to\n * `document`\n *\n - type (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) interact\n\\*/\ninteract.on = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.on(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.on(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n // if it is an InteractEvent type, add listener to globalEvents\n if (utils.contains(Interactable.eventTypes, type)) {\n // if this type of event was never bound\n if (!globalEvents[type]) {\n globalEvents[type] = [listener];\n }\n else {\n globalEvents[type].push(listener);\n }\n }\n // If non InteractEvent type, addEventListener to document\n else {\n events.add(scope.document, type, listener, { options });\n }\n\n return interact;\n};\n\n/*\\\n * interact.off\n [ method ]\n *\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n - type (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) interact\n \\*/\ninteract.off = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.off(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.off(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n if (!utils.contains(Interactable.eventTypes, type)) {\n events.remove(scope.document, type, listener, options);\n }\n else {\n let index;\n\n if (type in globalEvents\n && (index = utils.indexOf(globalEvents[type], listener)) !== -1) {\n globalEvents[type].splice(index, 1);\n }\n }\n\n return interact;\n};\n\n/*\\\n * interact.debug\n [ method ]\n *\n * Returns an object which exposes internal data\n = (object) An object with properties that outline the current state and expose internal functions and variables\n\\*/\ninteract.debug = function () {\n return scope;\n};\n\n// expose the functions used to calculate multi-touch properties\ninteract.getPointerAverage = utils.pointerAverage;\ninteract.getTouchBBox = utils.touchBBox;\ninteract.getTouchDistance = utils.touchDistance;\ninteract.getTouchAngle = utils.touchAngle;\n\ninteract.getElementRect = utils.getElementRect;\ninteract.getElementClientRect = utils.getElementClientRect;\ninteract.matchesSelector = utils.matchesSelector;\ninteract.closest = utils.closest;\n\n/*\\\n * interact.supportsTouch\n [ method ]\n *\n = (boolean) Whether or not the browser supports touch input\n\\*/\ninteract.supportsTouch = function () {\n return browser.supportsTouch;\n};\n\n/*\\\n * interact.supportsPointerEvent\n [ method ]\n *\n = (boolean) Whether or not the browser supports PointerEvents\n\\*/\ninteract.supportsPointerEvent = function () {\n return browser.supportsPointerEvent;\n};\n\n/*\\\n * interact.stop\n [ method ]\n *\n * Cancels all interactions (end events are not fired)\n *\n - event (Event) An event on which to call preventDefault()\n = (object) interact\n\\*/\ninteract.stop = function (event) {\n for (let i = scope.interactions.length - 1; i >= 0; i--) {\n scope.interactions[i].stop(event);\n }\n\n return interact;\n};\n\n/*\\\n * interact.pointerMoveTolerance\n [ method ]\n * Returns or sets the distance the pointer must be moved before an action\n * sequence occurs. This also affects tolerance for tap events.\n *\n - newValue (number) #optional The movement from the start position must be greater than this value\n = (number | Interactable) The current setting or interact\n\\*/\ninteract.pointerMoveTolerance = function (newValue) {\n if (utils.is.number(newValue)) {\n Interaction.pointerMoveTolerance = newValue;\n\n return this;\n }\n\n return Interaction.pointerMoveTolerance;\n};\n\ninteract.addDocument = scope.addDocument;\ninteract.removeDocument = scope.removeDocument;\n\nscope.interact = interact;\n\nmodule.exports = interact;\n","const Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\nconst scope = require('./scope');\nconst is = require('./utils/is');\nconst events = require('./utils/events');\n\nconst { nodeContains, matchesSelector } = require('./utils/domUtils');\n\n/*\\\n * Interactable.preventDefault\n [ method ]\n *\n * Returns or sets whether to prevent the browser's default behaviour\n * in response to pointer events. Can be set to:\n * - `'always'` to always prevent\n * - `'never'` to never prevent\n * - `'auto'` to let interact.js try to determine what would be best\n *\n - newValue (string) #optional `true`, `false` or `'auto'`\n = (string | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.preventDefault = function (newValue) {\n if (/^(always|never|auto)$/.test(newValue)) {\n this.options.preventDefault = newValue;\n return this;\n }\n\n if (is.bool(newValue)) {\n this.options.preventDefault = newValue? 'always' : 'never';\n return this;\n }\n\n return this.options.preventDefault;\n};\n\nInteractable.prototype.checkAndPreventDefault = function (event) {\n const setting = this.options.preventDefault;\n\n if (setting === 'never') { return; }\n\n if (setting === 'always') {\n event.preventDefault();\n return;\n }\n\n // setting === 'auto'\n\n // don't preventDefault if the browser supports passiveEvents\n // CSS touch-action and user-selecct should be used instead\n if (events.supportsOptions) {\n return;\n }\n\n // don't preventDefault of pointerdown events\n if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) {\n return;\n }\n\n // don't preventDefault on editable elements\n if (is.element(event.target)\n && matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) {\n return;\n }\n\n event.preventDefault();\n};\n\nfunction onInteractionEvent ({ interaction, event }) {\n if (interaction.target) {\n interaction.target.checkAndPreventDefault(event);\n }\n}\n\nfor (const eventSignal of ['down', 'move', 'up', 'cancel']) {\n Interaction.signals.on(eventSignal, onInteractionEvent);\n}\n\n// prevent native HTML5 drag on interact.js target elements\nInteraction.docEvents.dragstart = function preventNativeDrag (event) {\n for (const interaction of scope.interactions) {\n\n if (interaction.element\n && (interaction.element === event.target\n || nodeContains(interaction.element, event.target))) {\n\n interaction.target.checkAndPreventDefault(event);\n return;\n }\n }\n};\n","const scope = require('./scope');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst iFinder = require('./utils/interactionFinder');\nconst pointerEvents = require('./pointerEvents/base');\n\nconst { window } = require('./utils/window');\n\nconst toString = Object.prototype.toString;\n\nif (!window.Array.isArray) {\n window.Array.isArray = function (obj) {\n return toString.call(obj) === '[object Array]';\n };\n}\n\nif (!String.prototype.trim) {\n String.prototype.trim = function () {\n return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n };\n}\n\n// http://www.quirksmode.org/dom/events/click.html\n// >Events leading to dblclick\n//\n// IE8 doesn't fire down event before dblclick.\n// This workaround tries to fire a tap and doubletap after dblclick\nfunction onIE8Dblclick (event) {\n const eventTarget = event.target;\n const interaction = iFinder.search(event, event.type, eventTarget);\n\n if (!interaction) { return; }\n\n if (interaction.prevTap\n && event.clientX === interaction.prevTap.clientX\n && event.clientY === interaction.prevTap.clientY\n && eventTarget === interaction.prevTap.target) {\n\n interaction.downTargets[0] = eventTarget;\n interaction.downTimes [0] = new Date().getTime();\n\n pointerEvents.fire({\n interaction,\n event,\n eventTarget,\n pointer: event,\n type: 'tap',\n });\n }\n}\n\nif (browser.isIE8) {\n const selectFix = function (event) {\n for (const interaction of scope.interactions) {\n if (interaction.interacting()) {\n interaction.target.checkAndPreventDefault(event);\n }\n }\n };\n\n const onDocIE8 = function onDocIE8 ({ doc, win }, signalName) {\n const eventMethod = signalName.indexOf('listen') === 0\n ? events.add : events.remove;\n\n // For IE's lack of Event#preventDefault\n eventMethod(doc, 'selectstart', selectFix);\n\n if (pointerEvents) {\n eventMethod(doc, 'dblclick', onIE8Dblclick);\n }\n };\n\n scope.signals.on('add-document' , onDocIE8);\n scope.signals.on('remove-document', onDocIE8);\n}\n\nmodule.exports = null;\n","const InteractEvent = require('../InteractEvent');\nconst Interaction = require('../Interaction');\nconst extend = require('../utils/extend');\n\nconst modifiers = {\n names: [],\n\n setOffsets: function (arg) {\n const { interaction, pageCoords: page } = arg;\n const { target, element, startOffset } = interaction;\n const rect = target.getRect(element);\n\n if (rect) {\n startOffset.left = page.x - rect.left;\n startOffset.top = page.y - rect.top;\n\n startOffset.right = rect.right - page.x;\n startOffset.bottom = rect.bottom - page.y;\n\n if (!('width' in rect)) { rect.width = rect.right - rect.left; }\n if (!('height' in rect)) { rect.height = rect.bottom - rect.top ; }\n }\n else {\n startOffset.left = startOffset.top = startOffset.right = startOffset.bottom = 0;\n }\n\n arg.rect = rect;\n arg.interactable = target;\n arg.element = element;\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n\n arg.options = target.options[interaction.prepared.name][modifierName];\n\n if (!arg.options) {\n continue;\n }\n\n interaction.modifierOffsets[modifierName] = modifiers[modifierName].setOffset(arg);\n }\n },\n\n setAll: function (arg) {\n const { interaction, statuses, preEnd, requireEndOnly } = arg;\n const coords = extend({}, arg.pageCoords);\n const result = {\n dx: 0,\n dy: 0,\n changed: false,\n locked: false,\n shouldMove: true,\n };\n\n for (const modifierName of modifiers.names) {\n const modifier = modifiers[modifierName];\n const options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!shouldDo(options, preEnd, requireEndOnly)) { continue; }\n\n arg.status = arg.status = statuses[modifierName];\n arg.options = options;\n arg.offset = arg.interaction.modifierOffsets[modifierName];\n\n modifier.set(arg);\n\n if (arg.status.locked) {\n coords.x += arg.status.dx;\n coords.y += arg.status.dy;\n\n result.dx += arg.status.dx;\n result.dy += arg.status.dy;\n\n result.locked = true;\n }\n }\n\n // a move should be fired if:\n // - there are no modifiers enabled,\n // - no modifiers are \"locked\" i.e. have changed the pointer's coordinates, or\n // - the locked coords have changed since the last pointer move\n result.shouldMove = !arg.status || !result.locked || arg.status.changed;\n\n return result;\n },\n\n resetStatuses: function (statuses) {\n for (const modifierName of modifiers.names) {\n const status = statuses[modifierName] || {};\n\n status.dx = status.dy = 0;\n status.modifiedX = status.modifiedY = NaN;\n status.locked = false;\n status.changed = true;\n\n statuses[modifierName] = status;\n }\n\n return statuses;\n },\n\n start: function ({ interaction }, signalName) {\n const arg = {\n interaction,\n pageCoords: (signalName === 'action-resume' ?\n interaction.curCoords : interaction.startCoords).page,\n startOffset: interaction.startOffset,\n statuses: interaction.modifierStatuses,\n preEnd: false,\n requireEndOnly: false,\n };\n\n modifiers.setOffsets(arg);\n modifiers.resetStatuses(arg.statuses);\n\n arg.pageCoords = extend({}, interaction.startCoords.page);\n interaction.modifierResult = modifiers.setAll(arg);\n },\n};\n\nInteraction.signals.on('new', function (interaction) {\n interaction.startOffset = { left: 0, right: 0, top: 0, bottom: 0 };\n interaction.modifierOffsets = {};\n interaction.modifierStatuses = modifiers.resetStatuses({});\n interaction.modifierResult = null;\n});\n\nInteraction.signals.on('action-start' , modifiers.start);\nInteraction.signals.on('action-resume', modifiers.start);\n\nInteraction.signals.on('before-action-move', function ({ interaction, preEnd, interactingBeforeMove }) {\n const modifierResult = modifiers.setAll({\n interaction,\n preEnd,\n pageCoords: interaction.curCoords.page,\n statuses: interaction.modifierStatuses,\n requireEndOnly: false,\n });\n\n // don't fire an action move if a modifier would keep the event in the same\n // cordinates as before\n if (!modifierResult.shouldMove && interactingBeforeMove) {\n interaction._dontFireMove = true;\n }\n\n interaction.modifierResult = modifierResult;\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n for (let i = 0; i < modifiers.names.length; i++) {\n const options = interaction.target.options[interaction.prepared.name][modifiers.names[i]];\n\n // if the endOnly option is true for any modifier\n if (shouldDo(options, true, true)) {\n // fire a move event at the modified coordinates\n interaction.doMove({ event, preEnd: true });\n break;\n }\n }\n});\n\nInteractEvent.signals.on('set-xy', function (arg) {\n const { iEvent, interaction } = arg;\n const modifierArg = extend({}, arg);\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n modifierArg.options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!modifierArg.options) {\n continue;\n }\n\n const modifier = modifiers[modifierName];\n\n modifierArg.status = interaction.modifierStatuses[modifierName];\n\n iEvent[modifierName] = modifier.modifyCoords(modifierArg);\n }\n});\n\nfunction shouldDo (options, preEnd, requireEndOnly) {\n return (options && options.enabled\n && (preEnd || !options.endOnly)\n && (!requireEndOnly || options.endOnly));\n}\n\nmodule.exports = modifiers;\n","const modifiers = require('./index');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst restrict = {\n defaults: {\n enabled : false,\n endOnly : false,\n restriction: null,\n elementRect: null,\n },\n\n setOffset: function ({ rect, startOffset, options }) {\n const elementRect = options && options.elementRect;\n const offset = {};\n\n if (rect && elementRect) {\n offset.left = startOffset.left - (rect.width * elementRect.left);\n offset.top = startOffset.top - (rect.height * elementRect.top);\n\n offset.right = startOffset.right - (rect.width * (1 - elementRect.right));\n offset.bottom = startOffset.bottom - (rect.height * (1 - elementRect.bottom));\n }\n else {\n offset.left = offset.top = offset.right = offset.bottom = 0;\n }\n\n return offset;\n },\n\n set: function ({ pageCoords, interaction, status, options }) {\n if (!options) { return status; }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n\n const restriction = getRestrictionRect(options.restriction, interaction, page);\n\n if (!restriction) { return status; }\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n const rect = restriction;\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n const offset = interaction.modifierOffsets.restrict;\n\n // object is assumed to have\n // x, y, width, height or\n // left, top, right, bottom\n if ('x' in restriction && 'y' in restriction) {\n modifiedX = Math.max(Math.min(rect.x + rect.width - offset.right , page.x), rect.x + offset.left);\n modifiedY = Math.max(Math.min(rect.y + rect.height - offset.bottom, page.y), rect.y + offset.top );\n }\n else {\n modifiedX = Math.max(Math.min(rect.right - offset.right , page.x), rect.left + offset.left);\n modifiedY = Math.max(Math.min(rect.bottom - offset.bottom, page.y), rect.top + offset.top );\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const elementRect = options && options.elementRect;\n\n if (options && options.enabled\n && !(phase === 'start' && elementRect && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n getRestrictionRect,\n};\n\nfunction getRestrictionRect (value, interaction, page) {\n if (utils.is.function(value)) {\n return utils.resolveRectLike(value, interaction.target, interaction.element, [page.x, page.y, interaction]);\n } else {\n return utils.resolveRectLike(value, interaction.target, interaction.element);\n }\n}\n\nmodifiers.restrict = restrict;\nmodifiers.names.push('restrict');\n\ndefaultOptions.perAction.restrict = restrict.defaults;\n\nmodule.exports = restrict;\n","// This module adds the options.resize.restrictEdges setting which sets min and\n// max for the top, left, bottom and right edges of the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictEdges: {\n// inner: { top: 200, left: 200, right: 400, bottom: 400 },\n// outer: { top: 0, left: 0, right: 600, bottom: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst { getRestrictionRect } = require('./restrict');\n\nconst noInner = { top: +Infinity, left: +Infinity, bottom: -Infinity, right: -Infinity };\nconst noOuter = { top: -Infinity, left: -Infinity, bottom: +Infinity, right: +Infinity };\n\nconst restrictEdges = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n offset: null,\n },\n\n setOffset: function ({ interaction, startOffset, options }) {\n if (!options) {\n return utils.extend({}, startOffset);\n }\n\n const offset = getRestrictionRect(options.offset, interaction, interaction.startCoords.page);\n\n if (offset) {\n return {\n top: startOffset.top + offset.y,\n left: startOffset.left + offset.x,\n bottom: startOffset.bottom + offset.y,\n right: startOffset.right + offset.x,\n };\n }\n\n return startOffset;\n },\n\n set: function ({ pageCoords, interaction, status, offset, options }) {\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n const inner = rectUtils.xywhToTlbr(getRestrictionRect(options.inner, interaction, page)) || noInner;\n const outer = rectUtils.xywhToTlbr(getRestrictionRect(options.outer, interaction, page)) || noOuter;\n\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n if (edges.top) {\n modifiedY = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top);\n }\n else if (edges.bottom) {\n modifiedY = Math.max(Math.min(outer.bottom - offset.bottom, page.y), inner.bottom - offset.bottom);\n }\n if (edges.left) {\n modifiedX = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left);\n }\n else if (edges.right) {\n modifiedX = Math.max(Math.min(outer.right - offset.right, page.x), inner.right - offset.right);\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n if (options && options.enabled\n && !(phase === 'start' && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n noInner,\n noOuter,\n getRestrictionRect,\n};\n\nmodifiers.restrictEdges = restrictEdges;\nmodifiers.names.push('restrictEdges');\n\ndefaultOptions.perAction.restrictEdges = restrictEdges.defaults;\nresize.defaults.restrictEdges = restrictEdges.defaults;\n\nmodule.exports = restrictEdges;\n","// This module adds the options.resize.restrictSize setting which sets min and\n// max width and height for the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictSize: {\n// min: { width: -600, height: -600 },\n// max: { width: 600, height: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst restrictEdges = require('./restrictEdges');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst noMin = { width: -Infinity, height: -Infinity };\nconst noMax = { width: +Infinity, height: +Infinity };\n\nconst restrictSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n },\n\n setOffset: function ({ interaction }) {\n return interaction.startOffset;\n },\n\n set: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const rect = rectUtils.xywhToTlbr(interaction.resizeRects.inverted);\n\n const minSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.min, interaction)) || noMin;\n const maxSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.max, interaction)) || noMax;\n\n arg.options = {\n enabled: options.enabled,\n endOnly: options.endOnly,\n inner: utils.extend({}, restrictEdges.noInner),\n outer: utils.extend({}, restrictEdges.noOuter),\n };\n\n if (edges.top) {\n arg.options.inner.top = rect.bottom - minSize.height;\n arg.options.outer.top = rect.bottom - maxSize.height;\n }\n else if (edges.bottom) {\n arg.options.inner.bottom = rect.top + minSize.height;\n arg.options.outer.bottom = rect.top + maxSize.height;\n }\n if (edges.left) {\n arg.options.inner.left = rect.right - minSize.width;\n arg.options.outer.left = rect.right - maxSize.width;\n }\n else if (edges.right) {\n arg.options.inner.right = rect.left + minSize.width;\n arg.options.outer.right = rect.left + maxSize.width;\n }\n\n restrictEdges.set(arg);\n },\n\n modifyCoords: restrictEdges.modifyCoords,\n};\n\nmodifiers.restrictSize = restrictSize;\nmodifiers.names.push('restrictSize');\n\ndefaultOptions.perAction.restrictSize = restrictSize.defaults;\nresize.defaults.restrictSize = restrictSize.defaults;\n\nmodule.exports = restrictSize;\n","const modifiers = require('./index');\nconst interact = require('../interact');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst snap = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n\n relativePoints: null,\n },\n\n setOffset: function ({ interaction, interactable, element, rect, startOffset, options }) {\n const offsets = [];\n const optionsOrigin = utils.rectToXY(utils.resolveRectLike(options.origin));\n const origin = optionsOrigin || utils.getOriginXY(interactable, element, interaction.prepared.name);\n options = options || interactable.options[interaction.prepared.name].snap || {};\n\n let snapOffset;\n\n if (options.offset === 'startCoords') {\n snapOffset = {\n x: interaction.startCoords.page.x - origin.x,\n y: interaction.startCoords.page.y - origin.y,\n };\n }\n else {\n const offsetRect = utils.resolveRectLike(options.offset, interactable, element, [interaction]);\n\n snapOffset = utils.rectToXY(offsetRect) || { x: 0, y: 0 };\n }\n\n if (rect && options.relativePoints && options.relativePoints.length) {\n for (const { x: relativeX, y: relativeY } of options.relativePoints) {\n offsets.push({\n x: startOffset.left - (rect.width * relativeX) + snapOffset.x,\n y: startOffset.top - (rect.height * relativeY) + snapOffset.y,\n });\n }\n }\n else {\n offsets.push(snapOffset);\n }\n\n return offsets;\n },\n\n set: function ({ interaction, pageCoords, status, options, offset: offsets }) {\n const targets = [];\n let target;\n let page;\n let i;\n\n if (status.useStatusXY) {\n page = { x: status.x, y: status.y };\n }\n else {\n const origin = utils.getOriginXY(interaction.target, interaction.element, interaction.prepared.name);\n\n page = utils.extend({}, pageCoords);\n\n page.x -= origin.x;\n page.y -= origin.y;\n }\n\n status.realX = page.x;\n status.realY = page.y;\n\n let len = options.targets? options.targets.length : 0;\n\n for (const { x: offsetX, y: offsetY } of offsets) {\n const relativeX = page.x - offsetX;\n const relativeY = page.y - offsetY;\n\n for (const snapTarget of options.targets) {\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n targets.push({\n x: utils.is.number(target.x) ? (target.x + offsetX) : relativeX,\n y: utils.is.number(target.y) ? (target.y + offsetY) : relativeY,\n\n range: utils.is.number(target.range)? target.range: options.range,\n });\n }\n }\n\n const closest = {\n target: null,\n inRange: false,\n distance: 0,\n range: 0,\n dx: 0,\n dy: 0,\n };\n\n for (i = 0, len = targets.length; i < len; i++) {\n target = targets[i];\n\n const range = target.range;\n const dx = target.x - page.x;\n const dy = target.y - page.y;\n const distance = utils.hypot(dx, dy);\n let inRange = distance <= range;\n\n // Infinite targets count as being out of range\n // compared to non infinite ones that are in range\n if (range === Infinity && closest.inRange && closest.range !== Infinity) {\n inRange = false;\n }\n\n if (!closest.target || (inRange\n // is the closest target in range?\n ? (closest.inRange && range !== Infinity\n // the pointer is relatively deeper in this target\n ? distance / range < closest.distance / closest.range\n // this target has Infinite range and the closest doesn't\n : (range === Infinity && closest.range !== Infinity)\n // OR this target is closer that the previous closest\n || distance < closest.distance)\n // The other is not in range and the pointer is closer to this target\n : (!closest.inRange && distance < closest.distance))) {\n\n closest.target = target;\n closest.distance = distance;\n closest.range = range;\n closest.inRange = inRange;\n closest.dx = dx;\n closest.dy = dy;\n\n status.range = range;\n }\n }\n\n let snapChanged;\n\n if (closest.target) {\n snapChanged = (status.modifiedX !== closest.target.x || status.modifiedY !== closest.target.y);\n\n status.modifiedX = closest.target.x;\n status.modifiedY = closest.target.y;\n }\n else {\n snapChanged = true;\n\n status.modifiedX = NaN;\n status.modifiedY = NaN;\n }\n\n status.dx = closest.dx;\n status.dy = closest.dy;\n\n status.changed = (snapChanged || (closest.inRange && !status.locked));\n status.locked = closest.inRange;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const relativePoints = options && options.relativePoints;\n\n if (options && options.enabled\n && !(phase === 'start' && relativePoints && relativePoints.length)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n }\n\n return {\n range : status.range,\n locked : status.locked,\n x : status.modifiedX,\n y : status.modifiedY,\n realX : status.realX,\n realY : status.realY,\n dx : status.dx,\n dy : status.dy,\n };\n }\n },\n};\n\ninteract.createSnapGrid = function (grid) {\n return function (x, y) {\n const limits = grid.limits || {\n left : -Infinity,\n right : Infinity,\n top : -Infinity,\n bottom: Infinity,\n };\n let offsetX = 0;\n let offsetY = 0;\n\n if (utils.is.object(grid.offset)) {\n offsetX = grid.offset.x;\n offsetY = grid.offset.y;\n }\n\n const gridx = Math.round((x - offsetX) / grid.x);\n const gridy = Math.round((y - offsetY) / grid.y);\n\n const newX = Math.max(limits.left, Math.min(limits.right , gridx * grid.x + offsetX));\n const newY = Math.max(limits.top , Math.min(limits.bottom, gridy * grid.y + offsetY));\n\n return {\n x: newX,\n y: newY,\n range: grid.range,\n };\n };\n};\n\nmodifiers.snap = snap;\nmodifiers.names.push('snap');\n\ndefaultOptions.perAction.snap = snap.defaults;\n\nmodule.exports = snap;\n","// This module allows snapping of the size of targets during resize\n// interactions.\n\nconst modifiers = require('./index');\nconst snap = require('./snap');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\nconst utils = require('../utils/');\n\nconst snapSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n },\n\n setOffset: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.edges;\n\n if (!edges) { return; }\n\n arg.options = {\n relativePoints: [{\n x: edges.left? 0 : 1,\n y: edges.top ? 0 : 1,\n }],\n origin: { x: 0, y: 0 },\n offset: 'self',\n range: options.range,\n };\n\n const offsets = snap.setOffset(arg);\n arg.options = options;\n\n return offsets;\n },\n\n set: function (arg) {\n const { interaction, options, offset, pageCoords } = arg;\n const page = utils.extend({}, pageCoords);\n const relativeX = page.x - offset[0].x;\n const relativeY = page.y - offset[0].y;\n\n arg.options = utils.extend({}, options);\n arg.options.targets = [];\n\n for (const snapTarget of options.targets) {\n let target;\n\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n if ('width' in target && 'height' in target) {\n target.x = target.width;\n target.y = target.height;\n }\n\n arg.options.targets.push(target);\n }\n\n snap.set(arg);\n },\n\n modifyCoords: function (arg) {\n const { options } = arg;\n\n arg.options = utils.extend({}, options);\n arg.options.enabled = options.enabled;\n arg.options.relativePoints = [null];\n\n snap.modifyCoords(arg);\n },\n};\n\nmodifiers.snapSize = snapSize;\nmodifiers.names.push('snapSize');\n\ndefaultOptions.perAction.snapSize = snapSize.defaults;\nresize.defaults.snapSize = snapSize.defaults;\n\nmodule.exports = snapSize;\n","const pointerUtils = require('../utils/pointerUtils');\n\nmodule.exports = class PointerEvent {\n constructor (type, pointer, event, eventTarget, interaction) {\n pointerUtils.pointerExtend(this, event);\n\n if (event !== pointer) {\n pointerUtils.pointerExtend(this, pointer);\n }\n\n this.interaction = interaction;\n\n this.timeStamp = new Date().getTime();\n this.originalEvent = event;\n this.type = type;\n this.pointerId = pointerUtils.getPointerId(pointer);\n this.pointerType = pointerUtils.getPointerType(pointer);\n this.target = eventTarget;\n this.currentTarget = null;\n\n if (type === 'tap') {\n const pointerIndex = interaction.getPointerIndex(pointer);\n this.dt = this.timeStamp - interaction.downTimes[pointerIndex];\n\n const interval = this.timeStamp - interaction.tapTime;\n\n this.double = !!(interaction.prevTap\n && interaction.prevTap.type !== 'doubletap'\n && interaction.prevTap.target === this.target\n && interval < 500);\n }\n else if (type === 'doubletap') {\n this.dt = pointer.timeStamp - interaction.tapTime;\n }\n }\n\n subtractOrigin ({ x: originX, y: originY }) {\n this.pageX -= originX;\n this.pageY -= originY;\n this.clientX -= originX;\n this.clientY -= originY;\n\n return this;\n }\n\n addOrigin ({ x: originX, y: originY }) {\n this.pageX += originX;\n this.pageY += originY;\n this.clientX += originX;\n this.clientY += originY;\n\n return this;\n }\n\n preventDefault () {\n this.originalEvent.preventDefault();\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n};\n","const PointerEvent = require('./PointerEvent');\nconst Interaction = require('../Interaction');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst defaults = require('../defaultOptions');\nconst signals = require('../utils/Signals').new();\nconst { filter } = require('../utils/arr');\n\nconst simpleSignals = [ 'down', 'up', 'cancel' ];\nconst simpleEvents = [ 'down', 'up', 'cancel' ];\n\nconst pointerEvents = {\n PointerEvent,\n fire,\n collectEventTargets,\n signals,\n defaults: {\n holdDuration: 600,\n ignoreFrom : null,\n allowFrom : null,\n origin : { x: 0, y: 0 },\n },\n types: [\n 'down',\n 'move',\n 'up',\n 'cancel',\n 'tap',\n 'doubletap',\n 'hold',\n ],\n};\n\nfunction fire (arg) {\n const {\n interaction, pointer, event, eventTarget,\n type = arg.pointerEvent.type,\n targets = collectEventTargets(arg),\n pointerEvent = new PointerEvent(type, pointer, event, eventTarget, interaction),\n } = arg;\n\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n targets,\n type,\n pointerEvent,\n };\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n\n for (const prop in target.props || {}) {\n pointerEvent[prop] = target.props[prop];\n }\n\n const origin = utils.getOriginXY(target.eventable, target.element);\n\n pointerEvent.subtractOrigin(origin);\n pointerEvent.eventable = target.eventable;\n pointerEvent.currentTarget = target.element;\n\n target.eventable.fire(pointerEvent);\n\n pointerEvent.addOrigin(origin);\n\n if (pointerEvent.immediatePropagationStopped\n || (pointerEvent.propagationStopped\n && (i + 1) < targets.length && targets[i + 1].element !== pointerEvent.currentTarget)) {\n break;\n }\n }\n\n signals.fire('fired', signalArg);\n\n if (type === 'tap') {\n // if pointerEvent should make a double tap, create and fire a doubletap\n // PointerEvent and use that as the prevTap\n const prevTap = pointerEvent.double\n ? fire({\n interaction, pointer, event, eventTarget,\n type: 'doubletap',\n })\n : pointerEvent;\n\n interaction.prevTap = prevTap;\n interaction.tapTime = prevTap.timeStamp;\n }\n\n return pointerEvent;\n}\n\nfunction collectEventTargets ({ interaction, pointer, event, eventTarget, type }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n // do not fire a tap event if the pointer was moved before being lifted\n if (type === 'tap' && (interaction.pointerWasMoved\n // or if the pointerup target is different to the pointerdown target\n || !(interaction.downTargets[pointerIndex] && interaction.downTargets[pointerIndex] === eventTarget))) {\n return [];\n }\n\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n path,\n targets: [],\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (type === 'hold') {\n signalArg.targets = filter(signalArg.targets, target =>\n target.eventable.options.holdDuration === interaction.holdTimers[pointerIndex].duration);\n }\n\n return signalArg.targets;\n}\n\nInteraction.signals.on('update-pointer-down', function ({ interaction, pointerIndex }) {\n interaction.holdTimers[pointerIndex] = { duration: Infinity, timeout: null };\n});\n\nInteraction.signals.on('remove-pointer', function ({ interaction, pointerIndex }) {\n interaction.holdTimers.splice(pointerIndex, 1);\n});\n\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget, duplicateMove }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n if (!duplicateMove && (!interaction.pointerIsDown || interaction.pointerWasMoved)) {\n if (interaction.pointerIsDown) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n\n fire({\n interaction, pointer, event, eventTarget,\n type: 'move',\n });\n }\n});\n\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget, pointerIndex }) {\n // copy event to be used in timeout for IE8\n const eventCopy = browser.isIE8? utils.extend({}, event) : event;\n\n const timer = interaction.holdTimers[pointerIndex];\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'hold',\n targets: [],\n path,\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (!signalArg.targets.length) { return; }\n\n let minDuration = Infinity;\n\n for (let i = 0; i < signalArg.targets.length; i++) {\n const target = signalArg.targets[i];\n const holdDuration = target.eventable.options.holdDuration;\n\n if (holdDuration < minDuration) {\n minDuration = holdDuration;\n }\n }\n\n timer.duration = minDuration;\n timer.timeout = setTimeout(function () {\n fire({\n interaction,\n eventTarget,\n pointer: browser.isIE8? eventCopy : pointer,\n event: eventCopy,\n type: 'hold',\n });\n }, minDuration);\n});\n\nInteraction.signals.on('up', ({ interaction, pointer, event, eventTarget }) => {\n if (!interaction.pointerWasMoved) {\n fire({ interaction, eventTarget, pointer, event, type: 'tap' });\n }\n});\n\n['up', 'cancel'].forEach(function (signalName) {\n Interaction.signals.on(signalName, function ({ interaction, pointerIndex }) {\n if (interaction.holdTimers[pointerIndex]) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n });\n});\n\nfunction createSignalListener (type) {\n return function ({ interaction, pointer, event, eventTarget }) {\n fire({ interaction, eventTarget, pointer, event, type });\n };\n}\n\nfor (let i = 0; i < simpleSignals.length; i++) {\n Interaction.signals.on(simpleSignals[i], createSignalListener(simpleEvents[i]));\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.prevTap = null; // the most recent tap event on this interaction\n interaction.tapTime = 0; // time of the most recent tap event\n interaction.holdTimers = []; // [{ duration, timeout }]\n});\n\ndefaults.pointerEvents = pointerEvents.defaults;\nmodule.exports = pointerEvents;\n","const pointerEvents = require('./base');\nconst Interaction = require('../Interaction');\n\npointerEvents.signals.on('new', onNew);\npointerEvents.signals.on('fired', onFired);\n\nfor (const signal of ['move', 'up', 'cancel', 'endall']) {\n Interaction.signals.on(signal, endHoldRepeat);\n}\n\nfunction onNew ({ pointerEvent }) {\n if (pointerEvent.type !== 'hold') { return; }\n\n pointerEvent.count = (pointerEvent.count || 0) + 1;\n}\n\nfunction onFired ({ interaction, pointerEvent, eventTarget, targets }) {\n if (pointerEvent.type !== 'hold' || !targets.length) { return; }\n\n // get the repeat interval from the first eventable\n const interval = targets[0].eventable.options.holdRepeatInterval;\n\n // don't repeat if the interval is 0 or less\n if (interval <= 0) { return; }\n\n // set a timeout to fire the holdrepeat event\n interaction.holdIntervalHandle = setTimeout(function () {\n pointerEvents.fire({\n interaction,\n eventTarget,\n type: 'hold',\n pointer: pointerEvent,\n event: pointerEvent,\n });\n }, interval);\n}\n\nfunction endHoldRepeat ({ interaction }) {\n // set the interaction's holdStopTime property\n // to stop further holdRepeat events\n if (interaction.holdIntervalHandle) {\n clearInterval(interaction.holdIntervalHandle);\n interaction.holdIntervalHandle = null;\n }\n}\n\n// don't repeat by default\npointerEvents.defaults.holdRepeatInterval = 0;\npointerEvents.types.push('holdrepeat');\n\nmodule.exports = {\n onNew,\n onFired,\n endHoldRepeat,\n};\n","const pointerEvents = require('./base');\nconst Interactable = require('../Interactable');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\nconst scope = require('../scope');\nconst extend = require('../utils/extend');\nconst { merge } = require('../utils/arr');\n\npointerEvents.signals.on('collect-targets', function ({ targets, element, type, eventTarget }) {\n function collectSelectors (interactable, selector, context) {\n const els = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && is.element(element)\n && domUtils.matchesSelector(element, selector, els)\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n const interactable = scope.interactables.get(element);\n\n if (interactable) {\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n scope.interactables.forEachSelector(collectSelectors, element);\n});\n\nInteractable.signals.on('new', function ({ interactable }) {\n interactable.events.getRect = function (element) {\n return interactable.getRect(element);\n };\n});\n\nInteractable.signals.on('set', function ({ interactable, options }) {\n extend(interactable.events.options, pointerEvents.defaults);\n extend(interactable.events.options, options);\n});\n\nmerge(Interactable.eventTypes, pointerEvents.types);\n\nInteractable.prototype.pointerEvents = function (options) {\n extend(this.events.options, options);\n\n return this;\n};\n\nconst __backCompatOption = Interactable.prototype._backCompatOption;\n\nInteractable.prototype._backCompatOption = function (optionName, newValue) {\n const ret = __backCompatOption.call(this, optionName, newValue);\n\n if (ret === this) {\n this.events.options[optionName] = newValue;\n }\n\n return ret;\n};\n\nInteractable.settingsMethods.push('pointerEvents');\n","const utils = require('./utils');\nconst events = require('./utils/events');\nconst signals = require('./utils/Signals').new();\n\nconst scope = {\n signals,\n events,\n utils,\n\n // main document\n document: require('./utils/domObjects').document,\n // all documents being listened to\n documents: [],\n\n addDocument: function (doc, win) {\n // do nothing if document is already known\n if (utils.contains(scope.documents, doc)) { return false; }\n\n win = win || scope.getWindow(doc);\n\n scope.documents.push(doc);\n events.documents.push(doc);\n\n // don't add an unload event for the main document\n // so that the page may be cached in browser history\n if (doc !== scope.document) {\n events.add(win, 'unload', scope.onWindowUnload);\n }\n\n signals.fire('add-document', { doc, win });\n },\n\n removeDocument: function (doc, win) {\n const index = utils.indexOf(scope.documents, doc);\n\n win = win || scope.getWindow(doc);\n\n events.remove(win, 'unload', scope.onWindowUnload);\n\n scope.documents.splice(index, 1);\n events.documents.splice(index, 1);\n\n signals.fire('remove-document', { win, doc });\n },\n\n onWindowUnload: function () {\n scope.removeDocument(this.document, this);\n },\n};\n\nmodule.exports = scope;\n","const { indexOf } = require('./arr');\n\nclass Signals {\n constructor () {\n this.listeners = {\n // signalName: [listeners],\n };\n }\n\n on (name, listener) {\n if (!this.listeners[name]) {\n this.listeners[name] = [listener];\n return;\n }\n\n this.listeners[name].push(listener);\n }\n\n off (name, listener) {\n if (!this.listeners[name]) { return; }\n\n const index = indexOf(this.listeners[name], listener);\n\n if (index !== -1) {\n this.listeners[name].splice(index, 1);\n }\n }\n\n fire (name, arg) {\n const targetListeners = this.listeners[name];\n\n if (!targetListeners) { return; }\n\n for (let i = 0; i < targetListeners.length; i++) {\n if (targetListeners[i](arg, name) === false) {\n return;\n }\n }\n }\n}\n\nSignals.new = function () {\n return new Signals();\n};\n\nmodule.exports = Signals;\n","function indexOf (array, target) {\n for (let i = 0, len = array.length; i < len; i++) {\n if (array[i] === target) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction contains (array, target) {\n return indexOf(array, target) !== -1;\n}\n\nfunction merge (target, source) {\n for (let i = 0; i < source.length; i++) {\n target.push(source[i]);\n }\n\n return target;\n}\n\nfunction filter (array, test) {\n const result = [];\n\n for (let i = 0; i < array.length; i++) {\n if (test(array[i])) {\n result.push(array[i]);\n }\n }\n\n return result;\n}\n\nmodule.exports = {\n indexOf,\n contains,\n merge,\n filter,\n};\n","const { window } = require('./window');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst Element = domObjects.Element;\nconst navigator = window.navigator;\n\nconst browser = {\n // Does the browser support touch input?\n supportsTouch: !!(('ontouchstart' in window) || is.function(window.DocumentTouch)\n && domObjects.document instanceof window.DocumentTouch),\n\n // Does the browser support PointerEvents\n supportsPointerEvent: !!domObjects.PointerEvent,\n\n isIE8: ('attachEvent' in window) && !('addEventListener' in window),\n\n // Opera Mobile must be handled differently\n isOperaMobile: (navigator.appName === 'Opera'\n && browser.supportsTouch\n && navigator.userAgent.match('Presto')),\n\n // scrolling doesn't change the result of getClientRects on iOS 7\n isIOS7: (/iP(hone|od|ad)/.test(navigator.platform)\n && /OS 7[^\\d]/.test(navigator.appVersion)),\n\n isIe9OrOlder: /MSIE (8|9)/.test(navigator.userAgent),\n\n // prefix matchesSelector\n prefixedMatchesSelector: 'matches' in Element.prototype\n ? 'matches': 'webkitMatchesSelector' in Element.prototype\n ? 'webkitMatchesSelector': 'mozMatchesSelector' in Element.prototype\n ? 'mozMatchesSelector': 'oMatchesSelector' in Element.prototype\n ? 'oMatchesSelector': 'msMatchesSelector',\n\n useMatchesSelectorPolyfill: false,\n\n pEventTypes: (domObjects.PointerEvent\n ? (domObjects.PointerEvent === window.MSPointerEvent\n ? {\n up: 'MSPointerUp',\n down: 'MSPointerDown',\n over: 'mouseover',\n out: 'mouseout',\n move: 'MSPointerMove',\n cancel: 'MSPointerCancel',\n }\n : {\n up: 'pointerup',\n down: 'pointerdown',\n over: 'pointerover',\n out: 'pointerout',\n move: 'pointermove',\n cancel: 'pointercancel',\n })\n : null),\n\n // because Webkit and Opera still use 'mousewheel' event type\n wheelEvent: 'onmousewheel' in domObjects.document? 'mousewheel': 'wheel',\n\n};\n\nbrowser.useMatchesSelectorPolyfill = !is.function(Element.prototype[browser.prefixedMatchesSelector]);\n\nmodule.exports = browser;\n","const domObjects = {};\nconst win = require('./window').window;\n\nfunction blank () {}\n\ndomObjects.document = win.document;\ndomObjects.DocumentFragment = win.DocumentFragment || blank;\ndomObjects.SVGElement = win.SVGElement || blank;\ndomObjects.SVGSVGElement = win.SVGSVGElement || blank;\ndomObjects.SVGElementInstance = win.SVGElementInstance || blank;\ndomObjects.Element = win.Element || blank;\ndomObjects.HTMLElement = win.HTMLElement || domObjects.Element;\n\ndomObjects.Event = win.Event;\ndomObjects.Touch = win.Touch || blank;\ndomObjects.PointerEvent = (win.PointerEvent || win.MSPointerEvent);\n\nmodule.exports = domObjects;\n","const win = require('./window');\nconst browser = require('./browser');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst domUtils = {\n nodeContains: function (parent, child) {\n while (child) {\n if (child === parent) {\n return true;\n }\n\n child = child.parentNode;\n }\n\n return false;\n },\n\n closest: function (element, selector) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) { return element; }\n\n element = domUtils.parentNode(element);\n }\n\n return null;\n },\n\n parentNode: function (node) {\n let parent = node.parentNode;\n\n if (is.docFrag(parent)) {\n // skip past #shado-root fragments\n while ((parent = parent.host) && is.docFrag(parent)) {\n continue;\n }\n\n return parent;\n }\n\n return parent;\n },\n\n // taken from http://tanalin.com/en/blog/2012/12/matches-selector-ie8/ and modified\n matchesSelectorPolyfill: browser.useMatchesSelectorPolyfill\n ? function (element, selector, elems) {\n elems = elems || element.parentNode.querySelectorAll(selector);\n\n for (let i = 0, len = elems.length; i < len; i++) {\n if (elems[i] === element) {\n return true;\n }\n }\n\n return false;\n }\n : null,\n\n matchesSelector: function (element, selector, nodeList) {\n if (browser.useMatchesSelectorPolyfill) {\n return domUtils.matchesSelectorPolyfill(element, selector, nodeList);\n }\n\n // remove /deep/ from selectors if shadowDOM polyfill is used\n if (win.window !== win.realWindow) {\n selector = selector.replace(/\\/deep\\//g, ' ');\n }\n\n return element[browser.prefixedMatchesSelector](selector);\n },\n\n // Test for the element that's \"above\" all other qualifiers\n indexOfDeepestElement: function (elements) {\n let deepestZoneParents = [];\n let dropzoneParents = [];\n let dropzone;\n let deepestZone = elements[0];\n let index = deepestZone? 0: -1;\n let parent;\n let child;\n let i;\n let n;\n\n for (i = 1; i < elements.length; i++) {\n dropzone = elements[i];\n\n // an element might belong to multiple selector dropzones\n if (!dropzone || dropzone === deepestZone) {\n continue;\n }\n\n if (!deepestZone) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n // check if the deepest or current are document.documentElement or document.rootElement\n // - if the current dropzone is, do nothing and continue\n if (dropzone.parentNode === dropzone.ownerDocument) {\n continue;\n }\n // - if deepest is, update with the current dropzone and continue to next\n else if (deepestZone.parentNode === dropzone.ownerDocument) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n if (!deepestZoneParents.length) {\n parent = deepestZone;\n while (parent.parentNode && parent.parentNode !== parent.ownerDocument) {\n deepestZoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n }\n\n // if this element is an svg element and the current deepest is\n // an HTMLElement\n if (deepestZone instanceof domObjects.HTMLElement\n && dropzone instanceof domObjects.SVGElement\n && !(dropzone instanceof domObjects.SVGSVGElement)) {\n\n if (dropzone === deepestZone.parentNode) {\n continue;\n }\n\n parent = dropzone.ownerSVGElement;\n }\n else {\n parent = dropzone;\n }\n\n dropzoneParents = [];\n\n while (parent.parentNode !== parent.ownerDocument) {\n dropzoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n\n n = 0;\n\n // get (position of last common ancestor) + 1\n while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) {\n n++;\n }\n\n const parents = [\n dropzoneParents[n - 1],\n dropzoneParents[n],\n deepestZoneParents[n],\n ];\n\n child = parents[0].lastChild;\n\n while (child) {\n if (child === parents[1]) {\n deepestZone = dropzone;\n index = i;\n deepestZoneParents = [];\n\n break;\n }\n else if (child === parents[2]) {\n break;\n }\n\n child = child.previousSibling;\n }\n }\n\n return index;\n },\n\n matchesUpTo: function (element, selector, limit) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) {\n return true;\n }\n\n element = domUtils.parentNode(element);\n\n if (element === limit) {\n return domUtils.matchesSelector(element, selector);\n }\n }\n\n return false;\n },\n\n getActualElement: function (element) {\n return (element instanceof domObjects.SVGElementInstance\n ? element.correspondingUseElement\n : element);\n },\n\n getScrollXY: function (relevantWindow) {\n relevantWindow = relevantWindow || win.window;\n return {\n x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft,\n y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop,\n };\n },\n\n getElementClientRect: function (element) {\n const clientRect = (element instanceof domObjects.SVGElement\n ? element.getBoundingClientRect()\n : element.getClientRects()[0]);\n\n return clientRect && {\n left : clientRect.left,\n right : clientRect.right,\n top : clientRect.top,\n bottom: clientRect.bottom,\n width : clientRect.width || clientRect.right - clientRect.left,\n height: clientRect.height || clientRect.bottom - clientRect.top,\n };\n },\n\n getElementRect: function (element) {\n const clientRect = domUtils.getElementClientRect(element);\n\n if (!browser.isIOS7 && clientRect) {\n const scroll = domUtils.getScrollXY(win.getWindow(element));\n\n clientRect.left += scroll.x;\n clientRect.right += scroll.x;\n clientRect.top += scroll.y;\n clientRect.bottom += scroll.y;\n }\n\n return clientRect;\n },\n\n getPath: function (element) {\n const path = [];\n\n while (element) {\n path.push(element);\n element = domUtils.parentNode(element);\n }\n\n return path;\n },\n\n trySelector: value => {\n if (!is.string(value)) { return false; }\n\n // an exception will be raised if it is invalid\n domObjects.document.querySelector(value);\n return true;\n },\n};\n\nmodule.exports = domUtils;\n","const is = require('./is');\nconst domUtils = require('./domUtils');\nconst pExtend = require('./pointerExtend');\n\nconst { window, getWindow } = require('./window');\nconst { indexOf, contains } = require('./arr');\n\nconst useAttachEvent = ('attachEvent' in window) && !('addEventListener' in window);\nconst addEvent = useAttachEvent? 'attachEvent': 'addEventListener';\nconst removeEvent = useAttachEvent? 'detachEvent': 'removeEventListener';\nconst on = useAttachEvent? 'on': '';\n\nconst elements = [];\nconst targets = [];\nconst attachedListeners = [];\n\n// {\n// type: {\n// selectors: ['selector', ...],\n// contexts : [document, ...],\n// listeners: [[listener, capture, passive], ...]\n// }\n// }\nconst delegatedEvents = {};\n\nconst documents = [];\n\nconst supportsOptions = !useAttachEvent && (() => {\n let supported = false;\n\n window.document.createElement('div').addEventListener('test', null, {\n get capture () { supported = true; },\n });\n\n return supported;\n})();\n\nfunction add (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n let elementIndex = indexOf(elements, element);\n let target = targets[elementIndex];\n\n if (!target) {\n target = {\n events: {},\n typeCount: 0,\n };\n\n elementIndex = elements.push(element) - 1;\n targets.push(target);\n\n attachedListeners.push(useAttachEvent\n ? {\n supplied: [],\n wrapped : [],\n useCount: [],\n }\n : null);\n }\n\n if (!target.events[type]) {\n target.events[type] = [];\n target.typeCount++;\n }\n\n if (!contains(target.events[type], listener)) {\n let ret;\n\n if (useAttachEvent) {\n const { supplied, wrapped, useCount } = attachedListeners[elementIndex];\n const listenerIndex = indexOf(supplied, listener);\n\n const wrappedListener = wrapped[listenerIndex] || function (event) {\n if (!event.immediatePropagationStopped) {\n event.target = event.srcElement;\n event.currentTarget = element;\n\n event.preventDefault = event.preventDefault || preventDef;\n event.stopPropagation = event.stopPropagation || stopProp;\n event.stopImmediatePropagation = event.stopImmediatePropagation || stopImmProp;\n\n if (/mouse|click/.test(event.type)) {\n event.pageX = event.clientX + getWindow(element).document.documentElement.scrollLeft;\n event.pageY = event.clientY + getWindow(element).document.documentElement.scrollTop;\n }\n\n listener(event);\n }\n };\n\n ret = element[addEvent](on + type, wrappedListener, !!options.capture);\n\n if (listenerIndex === -1) {\n supplied.push(listener);\n wrapped.push(wrappedListener);\n useCount.push(1);\n }\n else {\n useCount[listenerIndex]++;\n }\n }\n else {\n ret = element[addEvent](type, listener, supportsOptions? options : !!options.capture);\n }\n target.events[type].push(listener);\n\n return ret;\n }\n}\n\nfunction remove (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const elementIndex = indexOf(elements, element);\n const target = targets[elementIndex];\n\n if (!target || !target.events) {\n return;\n }\n\n let wrappedListener = listener;\n let listeners;\n let listenerIndex;\n\n if (useAttachEvent) {\n listeners = attachedListeners[elementIndex];\n listenerIndex = indexOf(listeners.supplied, listener);\n wrappedListener = listeners.wrapped[listenerIndex];\n }\n\n if (type === 'all') {\n for (type in target.events) {\n if (target.events.hasOwnProperty(type)) {\n remove(element, type, 'all');\n }\n }\n return;\n }\n\n if (target.events[type]) {\n const len = target.events[type].length;\n\n if (listener === 'all') {\n for (let i = 0; i < len; i++) {\n remove(element, type, target.events[type][i], options);\n }\n return;\n }\n else {\n for (let i = 0; i < len; i++) {\n if (target.events[type][i] === listener) {\n element[removeEvent](on + type, wrappedListener, supportsOptions? options : !!options.capture);\n target.events[type].splice(i, 1);\n\n if (useAttachEvent && listeners) {\n listeners.useCount[listenerIndex]--;\n if (listeners.useCount[listenerIndex] === 0) {\n listeners.supplied.splice(listenerIndex, 1);\n listeners.wrapped.splice(listenerIndex, 1);\n listeners.useCount.splice(listenerIndex, 1);\n }\n }\n\n break;\n }\n }\n }\n\n if (target.events[type] && target.events[type].length === 0) {\n target.events[type] = null;\n target.typeCount--;\n }\n }\n\n if (!target.typeCount) {\n targets.splice(elementIndex, 1);\n elements.splice(elementIndex, 1);\n attachedListeners.splice(elementIndex, 1);\n }\n}\n\nfunction addDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n if (!delegatedEvents[type]) {\n delegatedEvents[type] = {\n selectors: [],\n contexts : [],\n listeners: [],\n };\n\n // add delegate listener functions\n for (let i = 0; i < documents.length; i++) {\n add(documents[i], type, delegateListener);\n add(documents[i], type, delegateUseCapture, true);\n }\n }\n\n const delegated = delegatedEvents[type];\n let index;\n\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n break;\n }\n }\n\n if (index === -1) {\n index = delegated.selectors.length;\n\n delegated.selectors.push(selector);\n delegated.contexts .push(context);\n delegated.listeners.push([]);\n }\n\n // keep listener and capture and passive flags\n delegated.listeners[index].push([listener, !!options.capture, options.passive]);\n}\n\nfunction removeDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const delegated = delegatedEvents[type];\n let matchFound = false;\n let index;\n\n if (!delegated) { return; }\n\n // count from last index of delegated to 0\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n // look for matching selector and context Node\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n\n const listeners = delegated.listeners[index];\n\n // each item of the listeners array is an array: [function, capture, passive]\n for (let i = listeners.length - 1; i >= 0; i--) {\n const [fn, capture, passive] = listeners[i];\n\n // check if the listener functions and capture and passive flags match\n if (fn === listener && capture === !!options.capture && passive === options.passive) {\n // remove the listener from the array of listeners\n listeners.splice(i, 1);\n\n // if all listeners for this interactable have been removed\n // remove the interactable from the delegated arrays\n if (!listeners.length) {\n delegated.selectors.splice(index, 1);\n delegated.contexts .splice(index, 1);\n delegated.listeners.splice(index, 1);\n\n // remove delegate function from context\n remove(context, type, delegateListener);\n remove(context, type, delegateUseCapture, true);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegatedEvents[type] = null;\n }\n }\n\n // only remove one listener\n matchFound = true;\n break;\n }\n }\n\n if (matchFound) { break; }\n }\n }\n}\n\n// bound to the interactable context when a DOM event\n// listener is added to a selector interactable\nfunction delegateListener (event, optionalArg) {\n const options = getOptions(optionalArg);\n const fakeEvent = {};\n const delegated = delegatedEvents[event.type];\n const eventTarget = (domUtils.getActualElement(event.path\n ? event.path[0]\n : event.target));\n let element = eventTarget;\n\n // duplicate the event so that currentTarget can be changed\n pExtend(fakeEvent, event);\n\n fakeEvent.originalEvent = event;\n fakeEvent.preventDefault = preventOriginalDefault;\n\n // climb up document tree looking for selector matches\n while (is.element(element)) {\n for (let i = 0; i < delegated.selectors.length; i++) {\n const selector = delegated.selectors[i];\n const context = delegated.contexts[i];\n\n if (domUtils.matchesSelector(element, selector)\n && domUtils.nodeContains(context, eventTarget)\n && domUtils.nodeContains(context, element)) {\n\n const listeners = delegated.listeners[i];\n\n fakeEvent.currentTarget = element;\n\n for (let j = 0; j < listeners.length; j++) {\n const [fn, capture, passive] = listeners[j];\n\n if (capture === !!options.capture && passive === options.passive) {\n fn(fakeEvent);\n }\n }\n }\n }\n\n element = domUtils.parentNode(element);\n }\n}\n\nfunction delegateUseCapture (event) {\n return delegateListener.call(this, event, true);\n}\n\nfunction preventDef () {\n this.returnValue = false;\n}\n\nfunction preventOriginalDefault () {\n this.originalEvent.preventDefault();\n}\n\nfunction stopProp () {\n this.cancelBubble = true;\n}\n\nfunction stopImmProp () {\n this.cancelBubble = true;\n this.immediatePropagationStopped = true;\n}\n\nfunction getOptions (param) {\n return is.object(param)? param : { capture: param };\n}\n\nmodule.exports = {\n add,\n remove,\n\n addDelegate,\n removeDelegate,\n\n delegateListener,\n delegateUseCapture,\n delegatedEvents,\n documents,\n\n useAttachEvent,\n supportsOptions,\n\n _elements: elements,\n _targets: targets,\n _attachedListeners: attachedListeners,\n};\n","module.exports = function extend (dest, source) {\n for (const prop in source) {\n dest[prop] = source[prop];\n }\n return dest;\n};\n","const {\n resolveRectLike,\n rectToXY,\n} = require('./rect');\n\nmodule.exports = function (target, element, action) {\n const actionOptions = target.options[action];\n const actionOrigin = actionOptions && actionOptions.origin;\n const origin = actionOrigin || target.options.origin;\n\n const originRect = resolveRectLike(origin, target, element, [target && element]);\n\n return rectToXY(originRect) || { x: 0, y: 0 };\n};\n","module.exports = (x, y) => Math.sqrt(x * x + y * y);\n","const extend = require('./extend');\nconst win = require('./window');\n\nconst utils = {\n warnOnce: function (method, message) {\n let warned = false;\n\n return function () {\n if (!warned) {\n win.window.console.warn(message);\n warned = true;\n }\n\n return method.apply(this, arguments);\n };\n },\n\n // http://stackoverflow.com/a/5634528/2280888\n _getQBezierValue: function (t, p1, p2, p3) {\n const iT = 1 - t;\n return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3;\n },\n\n getQuadraticCurvePoint: function (startX, startY, cpX, cpY, endX, endY, position) {\n return {\n x: utils._getQBezierValue(position, startX, cpX, endX),\n y: utils._getQBezierValue(position, startY, cpY, endY),\n };\n },\n\n // http://gizma.com/easing/\n easeOutQuad: function (t, b, c, d) {\n t /= d;\n return -c * t*(t-2) + b;\n },\n\n copyAction: function (dest, src) {\n dest.name = src.name;\n dest.axis = src.axis;\n dest.edges = src.edges;\n\n return dest;\n },\n\n is : require('./is'),\n extend : extend,\n hypot : require('./hypot'),\n getOriginXY: require('./getOriginXY'),\n};\n\nextend(utils, require('./arr'));\nextend(utils, require('./domUtils'));\nextend(utils, require('./pointerUtils'));\nextend(utils, require('./rect'));\n\nmodule.exports = utils;\n","const scope = require('../scope');\nconst utils = require('./index');\n\nconst finder = {\n methodOrder: [ 'simulationResume', 'mouseOrPen', 'hasPointer', 'idle' ],\n\n search: function (pointer, eventType, eventTarget) {\n const pointerType = utils.getPointerType(pointer);\n const pointerId = utils.getPointerId(pointer);\n const details = { pointer, pointerId, pointerType, eventType, eventTarget };\n\n for (const method of finder.methodOrder) {\n const interaction = finder[method](details);\n\n if (interaction) {\n return interaction;\n }\n }\n },\n\n // try to resume simulation with a new pointer\n simulationResume: function ({ pointerType, eventType, eventTarget }) {\n if (!/down|start/i.test(eventType)) {\n return null;\n }\n\n for (const interaction of scope.interactions) {\n let element = eventTarget;\n\n if (interaction.simulation && interaction.simulation.allowResume\n && (interaction.pointerType === pointerType)) {\n while (element) {\n // if the element is the interaction element\n if (element === interaction.element) {\n return interaction;\n }\n element = utils.parentNode(element);\n }\n }\n }\n\n return null;\n },\n\n // if it's a mouse or pen interaction\n mouseOrPen: function ({ pointerId, pointerType, eventType }) {\n if (pointerType !== 'mouse' && pointerType !== 'pen') {\n return null;\n }\n\n let firstNonActive;\n\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType) {\n // if it's a down event, skip interactions with running simulations\n if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; }\n\n // if the interaction is active, return it immediately\n if (interaction.interacting()) {\n return interaction;\n }\n // otherwise save it and look for another active interaction\n else if (!firstNonActive) {\n firstNonActive = interaction;\n }\n }\n }\n\n // if no active mouse interaction was found use the first inactive mouse\n // interaction\n if (firstNonActive) {\n return firstNonActive;\n }\n\n // find any mouse or pen interaction.\n // ignore the interaction if the eventType is a *down, and a simulation\n // is active\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType && !(/down/i.test(eventType) && interaction.simulation)) {\n return interaction;\n }\n }\n\n return null;\n },\n\n // get interaction that has this pointer\n hasPointer: function ({ pointerId }) {\n for (const interaction of scope.interactions) {\n if (utils.contains(interaction.pointerIds, pointerId)) {\n return interaction;\n }\n }\n },\n\n // get first idle interaction with a matching pointerType\n idle: function ({ pointerType }) {\n for (const interaction of scope.interactions) {\n // if there's already a pointer held down\n if (interaction.pointerIds.length === 1) {\n const target = interaction.target;\n // don't add this pointer if there is a target interactable and it\n // isn't gesturable\n if (target && !target.options.gesture.enabled) {\n continue;\n }\n }\n // maximum of 2 pointers per interaction\n else if (interaction.pointerIds.length >= 2) {\n continue;\n }\n\n if (!interaction.interacting() && (pointerType === interaction.pointerType)) {\n return interaction;\n }\n }\n\n return null;\n },\n};\n\nmodule.exports = finder;\n","const win = require('./window');\nconst isWindow = require('./isWindow');\n\nconst is = {\n array : () => {},\n\n window : thing => thing === win.window || isWindow(thing),\n\n docFrag : thing => is.object(thing) && thing.nodeType === 11,\n\n object : thing => !!thing && (typeof thing === 'object'),\n\n function: thing => typeof thing === 'function',\n\n number : thing => typeof thing === 'number' ,\n\n bool : thing => typeof thing === 'boolean' ,\n\n string : thing => typeof thing === 'string' ,\n\n element: thing => {\n if (!thing || (typeof thing !== 'object')) { return false; }\n\n const _window = win.getWindow(thing) || win.window;\n\n return (/object|function/.test(typeof _window.Element)\n ? thing instanceof _window.Element //DOM2\n : thing.nodeType === 1 && typeof thing.nodeName === 'string');\n },\n};\n\nis.array = thing => (is.object(thing)\n && (typeof thing.length !== 'undefined')\n && is.function(thing.splice));\n\nmodule.exports = is;\n","module.exports = (thing) => !!(thing && thing.Window) && (thing instanceof thing.Window);\n","function pointerExtend (dest, source) {\n for (const prop in source) {\n const prefixedPropREs = module.exports.prefixedPropREs;\n let deprecated = false;\n\n // skip deprecated prefixed properties\n for (const vendor in prefixedPropREs) {\n if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) {\n deprecated = true;\n break;\n }\n }\n\n if (!deprecated && typeof source[prop] !== 'function') {\n dest[prop] = source[prop];\n }\n }\n return dest;\n}\n\npointerExtend.prefixedPropREs = {\n webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/,\n};\n\nmodule.exports = pointerExtend;\n","const hypot = require('./hypot');\nconst browser = require('./browser');\nconst dom = require('./domObjects');\nconst domUtils = require('./domUtils');\nconst domObjects = require('./domObjects');\nconst is = require('./is');\nconst pointerExtend = require('./pointerExtend');\n\nconst pointerUtils = {\n copyCoords: function (dest, src) {\n dest.page = dest.page || {};\n dest.page.x = src.page.x;\n dest.page.y = src.page.y;\n\n dest.client = dest.client || {};\n dest.client.x = src.client.x;\n dest.client.y = src.client.y;\n\n dest.timeStamp = src.timeStamp;\n },\n\n setCoordDeltas: function (targetObj, prev, cur) {\n targetObj.page.x = cur.page.x - prev.page.x;\n targetObj.page.y = cur.page.y - prev.page.y;\n targetObj.client.x = cur.client.x - prev.client.x;\n targetObj.client.y = cur.client.y - prev.client.y;\n targetObj.timeStamp = cur.timeStamp - prev.timeStamp;\n\n // set pointer velocity\n const dt = Math.max(targetObj.timeStamp / 1000, 0.001);\n\n targetObj.page.speed = hypot(targetObj.page.x, targetObj.page.y) / dt;\n targetObj.page.vx = targetObj.page.x / dt;\n targetObj.page.vy = targetObj.page.y / dt;\n\n targetObj.client.speed = hypot(targetObj.client.x, targetObj.page.y) / dt;\n targetObj.client.vx = targetObj.client.x / dt;\n targetObj.client.vy = targetObj.client.y / dt;\n },\n\n isNativePointer: function (pointer) {\n return (pointer instanceof dom.Event || pointer instanceof dom.Touch);\n },\n\n // Get specified X/Y coords for mouse or event.touches[0]\n getXY: function (type, pointer, xy) {\n xy = xy || {};\n type = type || 'page';\n\n xy.x = pointer[type + 'X'];\n xy.y = pointer[type + 'Y'];\n\n return xy;\n },\n\n getPageXY: function (pointer, page) {\n page = page || {};\n\n // Opera Mobile handles the viewport and scrolling oddly\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n pointerUtils.getXY('screen', pointer, page);\n\n page.x += window.scrollX;\n page.y += window.scrollY;\n }\n else {\n pointerUtils.getXY('page', pointer, page);\n }\n\n return page;\n },\n\n getClientXY: function (pointer, client) {\n client = client || {};\n\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n // Opera Mobile handles the viewport and scrolling oddly\n pointerUtils.getXY('screen', pointer, client);\n }\n else {\n pointerUtils.getXY('client', pointer, client);\n }\n\n return client;\n },\n\n getPointerId: function (pointer) {\n return is.number(pointer.pointerId)? pointer.pointerId : pointer.identifier;\n },\n\n setCoords: function (targetObj, pointers, timeStamp) {\n const pointer = (pointers.length > 1\n ? pointerUtils.pointerAverage(pointers)\n : pointers[0]);\n\n const tmpXY = {};\n\n pointerUtils.getPageXY(pointer, tmpXY);\n targetObj.page.x = tmpXY.x;\n targetObj.page.y = tmpXY.y;\n\n pointerUtils.getClientXY(pointer, tmpXY);\n targetObj.client.x = tmpXY.x;\n targetObj.client.y = tmpXY.y;\n\n targetObj.timeStamp = is.number(timeStamp) ? timeStamp :new Date().getTime();\n },\n\n pointerExtend: pointerExtend,\n\n getTouchPair: function (event) {\n const touches = [];\n\n // array of touches is supplied\n if (is.array(event)) {\n touches[0] = event[0];\n touches[1] = event[1];\n }\n // an event\n else {\n if (event.type === 'touchend') {\n if (event.touches.length === 1) {\n touches[0] = event.touches[0];\n touches[1] = event.changedTouches[0];\n }\n else if (event.touches.length === 0) {\n touches[0] = event.changedTouches[0];\n touches[1] = event.changedTouches[1];\n }\n }\n else {\n touches[0] = event.touches[0];\n touches[1] = event.touches[1];\n }\n }\n\n return touches;\n },\n\n pointerAverage: function (pointers) {\n const average = {\n pageX : 0,\n pageY : 0,\n clientX: 0,\n clientY: 0,\n screenX: 0,\n screenY: 0,\n };\n\n for (const pointer of pointers) {\n for (const prop in average) {\n average[prop] += pointer[prop];\n }\n }\n for (const prop in average) {\n average[prop] /= pointers.length;\n }\n\n return average;\n },\n\n touchBBox: function (event) {\n if (!event.length && !(event.touches && event.touches.length > 1)) {\n return;\n }\n\n const touches = pointerUtils.getTouchPair(event);\n const minX = Math.min(touches[0].pageX, touches[1].pageX);\n const minY = Math.min(touches[0].pageY, touches[1].pageY);\n const maxX = Math.max(touches[0].pageX, touches[1].pageX);\n const maxY = Math.max(touches[0].pageY, touches[1].pageY);\n\n return {\n x: minX,\n y: minY,\n left: minX,\n top: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n },\n\n touchDistance: function (event, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n\n\n const dx = touches[0][sourceX] - touches[1][sourceX];\n const dy = touches[0][sourceY] - touches[1][sourceY];\n\n return hypot(dx, dy);\n },\n\n touchAngle: function (event, prevAngle, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n const dx = touches[1][sourceX] - touches[0][sourceX];\n const dy = touches[1][sourceY] - touches[0][sourceY];\n const angle = 180 * Math.atan2(dy , dx) / Math.PI;\n\n return angle;\n },\n\n getPointerType: function (pointer) {\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : is.number(pointer.pointerType)\n ? [undefined, undefined,'touch', 'pen', 'mouse'][pointer.pointerType]\n // if the PointerEvent API isn't available, then the \"pointer\" must\n // be either a MouseEvent, TouchEvent, or Touch object\n : /touch/.test(pointer.type) || pointer instanceof domObjects.Touch\n ? 'touch'\n : 'mouse';\n },\n\n // [ event.target, event.currentTarget ]\n getEventTargets: function (event) {\n return [\n domUtils.getActualElement(event.path ? event.path[0] : event.target),\n domUtils.getActualElement(event.currentTarget),\n ];\n },\n};\n\nmodule.exports = pointerUtils;\n","const { window } = require('./window');\n\nconst vendors = ['ms', 'moz', 'webkit', 'o'];\nlet lastTime = 0;\nlet request;\nlet cancel;\n\nfor (let x = 0; x < vendors.length && !window.requestAnimationFrame; x++) {\n request = window[vendors[x] + 'RequestAnimationFrame'];\n cancel = window[vendors[x] +'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n}\n\nif (!request) {\n request = function (callback) {\n const currTime = new Date().getTime();\n const timeToCall = Math.max(0, 16 - (currTime - lastTime));\n const id = setTimeout(function () { callback(currTime + timeToCall); },\n timeToCall);\n\n lastTime = currTime + timeToCall;\n return id;\n };\n}\n\nif (!cancel) {\n cancel = function (id) {\n clearTimeout(id);\n };\n}\n\nmodule.exports = {\n request,\n cancel,\n};\n","const extend = require('./extend');\nconst is = require('./is');\nconst {\n closest,\n parentNode,\n getElementRect,\n} = require('./domUtils');\n\nconst rectUtils = {\n getStringOptionResult: function (value, interactable, element) {\n if (!is.string(value)) {\n return null;\n }\n\n if (value === 'parent') {\n value = parentNode(element);\n }\n else if (value === 'self') {\n value = interactable.getRect(element);\n }\n else {\n value = closest(element, value);\n }\n\n return value;\n },\n\n resolveRectLike: function (value, interactable, element, functionArgs) {\n value = rectUtils.getStringOptionResult(value, interactable, element) || value;\n\n if (is.function(value)) {\n value = value.apply(null, functionArgs);\n }\n\n if (is.element(value)) {\n value = getElementRect(value);\n }\n\n return value;\n },\n\n rectToXY: function (rect) {\n return rect && {\n x: 'x' in rect ? rect.x : rect.left,\n y: 'y' in rect ? rect.y : rect.top,\n };\n },\n\n xywhToTlbr: function (rect) {\n if (rect && !('left' in rect && 'top' in rect)) {\n rect = extend({}, rect);\n\n rect.left = rect.x || 0;\n rect.top = rect.y || 0;\n rect.right = rect.right || (rect.left + rect.width);\n rect.bottom = rect.bottom || (rect.top + rect.height);\n }\n\n return rect;\n },\n\n tlbrToXywh: function (rect) {\n if (rect && !('x' in rect && 'y' in rect)) {\n rect = extend({}, rect);\n\n rect.x = rect.left || 0;\n rect.top = rect.top || 0;\n rect.width = rect.width || (rect.right - rect.x);\n rect.height = rect.height || (rect.bottom - rect.y);\n }\n\n return rect;\n },\n};\n\nmodule.exports = rectUtils;\n","const win = module.exports;\nconst isWindow = require('./isWindow');\n\nfunction init (window) {\n // get wrapped window if using Shadow DOM polyfill\n\n win.realWindow = window;\n\n // create a TextNode\n const el = window.document.createTextNode('');\n\n // check if it's wrapped by a polyfill\n if (el.ownerDocument !== window.document\n && typeof window.wrap === 'function'\n && window.wrap(el) === el) {\n // use wrapped window\n window = window.wrap(window);\n }\n\n win.window = window;\n}\n\nif (typeof window === 'undefined') {\n win.window = undefined;\n win.realWindow = undefined;\n}\nelse {\n init(window);\n}\n\nwin.getWindow = function getWindow (node) {\n if (isWindow(node)) {\n return node;\n }\n\n const rootNode = (node.ownerDocument || node);\n\n return rootNode.defaultView || rootNode.parentWindow || win.window;\n};\n\nwin.init = init;\n"]} \ No newline at end of file diff --git a/dist/interact.min.js b/dist/interact.min.js index c0bb2476c..2d1f0fb62 100644 --- a/dist/interact.min.js +++ b/dist/interact.min.js @@ -1,6 +1,6 @@ -/* interact.js v1.3.0-alpha.3+sha.9595c40 | https://raw.github.com/taye/interact.js/master/LICENSE */ -!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var t;t="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,t.interact=e()}}(function(){return function e(t,n,r){function i(s,a){if(!n[s]){if(!t[s]){var l="function"==typeof require&&require;if(!a&&l)return l(s,!0);if(o)return o(s,!0);var c=new Error("Cannot find module '"+s+"'");throw c.code="MODULE_NOT_FOUND",c}var p=n[s]={exports:{}};t[s][0].call(p.exports,function(e){var n=t[s][1][e];return i(n||e)},p,p.exports,e,t,n,r)}return n[s].exports}for(var o="function"==typeof require&&require,s=0;s6&&void 0!==arguments[6]&&arguments[6];r(this,e);var f=t.target,v=(f&&f.options||s).deltaSource,g=o(f,p,l),h="start"===c,m="end"===c,y=h?t.startCoords:t.curCoords,x=t.prevEvent;p=p||t.element;var b=i({},y.page),w=i({},y.client);b.x-=g.x,b.y-=g.y,w.x-=g.x,w.y-=g.y,this.ctrlKey=n.ctrlKey,this.altKey=n.altKey,this.shiftKey=n.shiftKey,this.metaKey=n.metaKey,this.button=n.button,this.buttons=n.buttons,this.target=p,this.currentTarget=p,this.relatedTarget=u||null,this.preEnd=d,this.type=l+(c||""),this.interaction=t,this.interactable=f,this.t0=h?t.downTimes[t.downTimes.length-1]:x.t0;var E={interaction:t,event:n,action:l,phase:c,element:p,related:u,page:b,client:w,coords:y,starting:h,ending:m,deltaSource:v,iEvent:this};a.fire("set-xy",E),m?(this.pageX=x.pageX,this.pageY=x.pageY,this.clientX=x.clientX,this.clientY=x.clientY):(this.pageX=b.x,this.pageY=b.y,this.clientX=w.x,this.clientY=w.y),this.x0=t.startCoords.page.x-g.x,this.y0=t.startCoords.page.y-g.y,this.clientX0=t.startCoords.client.x-g.x,this.clientY0=t.startCoords.client.y-g.y,a.fire("set-delta",E),this.timeStamp=y.timeStamp,this.dt=t.pointerDelta.timeStamp,this.duration=this.timeStamp-this.t0,this.speed=t.pointerDelta[v].speed,this.velocityX=t.pointerDelta[v].vx,this.velocityY=t.pointerDelta[v].vy,this.swipe=m||"inertiastart"===c?this.getSwipe():null,a.fire("new",E)}return e.prototype.getSwipe=function(){var e=this.interaction;if(e.prevEvent.speed<600||this.timeStamp-e.prevEvent.timeStamp>150)return null;var t=180*Math.atan2(e.prevEvent.velocityY,e.prevEvent.velocityX)/Math.PI;t<0&&(t+=360);var n=112.5<=t&&t<247.5,r=202.5<=t&&t<337.5,i=!n&&(292.5<=t||t<67.5);return{up:r,down:!r&&22.5<=t&&t<157.5,left:n,right:i,angle:t,speed:e.prevEvent.speed,velocity:{x:e.prevEvent.velocityX,y:e.prevEvent.velocityY}}},e.prototype.preventDefault=function(){},e.prototype.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},e.prototype.stopPropagation=function(){this.propagationStopped=!0},e}();a.on("set-delta",function(e){var t=e.iEvent,n=e.interaction,r=e.starting,i=e.deltaSource,o=r?t:n.prevEvent;"client"===i?(t.dx=t.clientX-o.clientX,t.dy=t.clientY-o.clientY):(t.dx=t.pageX-o.pageX,t.dy=t.pageY-o.pageY)}),l.signals=a,t.exports=l},{"./defaultOptions":18,"./utils/Signals":35,"./utils/extend":41,"./utils/getOriginXY":42}],4:[function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=e("./utils/is"),o=e("./utils/events"),s=e("./utils/extend"),a=e("./actions/base"),l=e("./scope"),c=e("./Eventable"),p=e("./defaultOptions"),u=e("./utils/Signals").new(),d=e("./utils/domUtils"),f=d.getElementRect,v=d.nodeContains,g=d.trySelector,h=e("./utils/window"),m=h.getWindow,y=e("./utils/arr"),x=y.indexOf,b=y.contains,w=e("./utils/browser"),E=w.wheelEvent;l.interactables=[];var S=function(){function e(t,n){r(this,e),n=n||{},this.target=t,this.events=new c,this._context=n.context||l.document,this._win=m(g(t)?this._context:t),this._doc=this._win.document,u.fire("new",{target:t,options:n,interactable:this,win:this._win}),l.addDocument(this._doc,this._win),l.interactables.push(this),this.set(n)}return e.prototype.setOnEvents=function(e,t){var n="on"+e;return i.function(t.onstart)&&(this.events[n+"start"]=t.onstart),i.function(t.onmove)&&(this.events[n+"move"]=t.onmove),i.function(t.onend)&&(this.events[n+"end"]=t.onend),i.function(t.oninertiastart)&&(this.events[n+"inertiastart"]=t.oninertiastart),this},e.prototype.setPerAction=function(e,t){for(var n in t)n in p[e]&&(i.object(t[n])?(this.options[e][n]=s(this.options[e][n]||{},t[n]),i.object(p.perAction[n])&&"enabled"in p.perAction[n]&&(this.options[e][n].enabled=!1!==t[n].enabled)):i.bool(t[n])&&i.object(p.perAction[n])?this.options[e][n].enabled=t[n]:void 0!==t[n]&&(this.options[e][n]=t[n]))},e.prototype.getRect=function(e){return e=e||this.target,i.string(this.target)&&!i.element(e)&&(e=this._context.querySelector(this.target)),f(e)},e.prototype.rectChecker=function(e){return i.function(e)?(this.getRect=e,this):null===e?(delete this.options.getRect,this):this.getRect},e.prototype._backCompatOption=function(e,t){if(g(t)||i.object(t)){this.options[e]=t;for(var n=a.names,r=Array.isArray(n),o=0,n=r?n:n[Symbol.iterator]();;){var s;if(r){if(o>=n.length)break;s=n[o++]}else{if(o=n.next(),o.done)break;s=o.value}var l=s;this.options[l][e]=t}return this}return this.options[e]},e.prototype.origin=function(e){return this._backCompatOption("origin",e)},e.prototype.deltaSource=function(e){return"page"===e||"client"===e?(this.options.deltaSource=e,this):this.options.deltaSource},e.prototype.context=function(){return this._context},e.prototype.inContext=function(e){return this._context===e.ownerDocument||v(this._context,e)},e.prototype.fire=function(e){return this.events.fire(e),this},e.prototype._onOffMultiple=function(e,t,n,r){if(i.string(t)&&-1!==t.search(" ")&&(t=t.trim().split(/ +/)),i.array(t)){for(var o=0;o=l.length)break;f=l[d++]}else{if(d=l.next(),d.done)break;f=d.value}var v=f;this.options[v]=p.base[v],v in t&&this[v](t[v])}return u.fire("set",{options:t,interactable:this}),this},e.prototype.unset=function(){if(o.remove(this.target,"all"),i.string(this.target))for(var e in o.delegatedEvents){var t=o.delegatedEvents[e];t.selectors[0]===this.target&&t.contexts[0]===this._context&&(t.selectors.splice(0,1),t.contexts.splice(0,1),t.listeners.splice(0,1),t.selectors.length||(t[e]=null)),o.remove(this._context,e,o.delegateListener),o.remove(this._context,e,o.delegateUseCapture,!0)}else o.remove(this,"all");u.fire("unset",{interactable:this}),l.interactables.splice(x(l.interactables,this),1);for(var n=l.interactions||[],r=Array.isArray(n),s=0,n=r?n:n[Symbol.iterator]();;){var a;if(r){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var c=a;c.target===this&&c.interacting()&&c.stop()}return l.interact},e}();l.interactables.indexOfElement=function(e,t){t=t||l.document;for(var n=0;n=y.length)break;w=y[b++]}else{if(b=y.next(),b.done)break;w=b.value}var E=w,S=E[0],T=E[1];T._updateEventTargets(r,i),T[e](S,t,r,i)}}}function o(e){for(var t=0;te.pointerMoveTolerance);var a={pointer:t,pointerIndex:this.getPointerIndex(t),event:n,eventTarget:r,dx:o,dy:s,duplicate:i,interaction:this,interactingBeforeMove:this.interacting()};i||l.setCoordDeltas(this.pointerDelta,this.prevCoords,this.curCoords),d.fire("move",a),i||(this.interacting()&&this.doMove(a),this.pointerWasMoved&&l.copyCoords(this.prevCoords,this.curCoords))},e.prototype.doMove=function(e){e=l.extend({pointer:this.pointers[0],event:this.prevEvent,eventTarget:this._eventTarget,interaction:this},e||{}),d.fire("before-action-move",e),this._dontFireMove||d.fire("action-move",e),this._dontFireMove=!1},e.prototype.pointerUp=function(e,t,n,r){var i=this.getPointerIndex(e);d.fire(/cancel$/i.test(t.type)?"cancel":"up",{pointer:e,pointerIndex:i,event:t,eventTarget:n,curEventTarget:r,interaction:this}),this.simulation||this.end(t),this.pointerIsDown=!1,this.removePointer(e,t)},e.prototype.end=function(e){e=e||this.prevEvent,this.interacting()&&d.fire("action-end",{event:e,interaction:this}),this.stop()},e.prototype.currentAction=function(){return this._interacting?this.prepared.name:null},e.prototype.interacting=function(){return this._interacting},e.prototype.stop=function(){d.fire("stop",{interaction:this}),this._interacting&&(d.fire("stop-active",{interaction:this}),d.fire("stop-"+this.prepared.name,{interaction:this})),this.target=this.element=null,this._interacting=!1,this.prepared.name=this.prevEvent=null},e.prototype.getPointerIndex=function(e){return l.indexOf(this.pointerIds,l.getPointerId(e))},e.prototype.updatePointer=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:t&&/(down|start)$/i.test(t.type),r=l.getPointerId(e),i=this.getPointerIndex(e);return-1===i&&(i=this.pointerIds.length,this.pointerIds[i]=r),n&&d.fire("update-pointer-down",{pointer:e,event:t,down:n,pointerId:r,pointerIndex:i,interaction:this}),this.pointers[i]=e,i},e.prototype.removePointer=function(e,t){var n=l.getPointerId(e),r=this.mouse?0:l.indexOf(this.pointerIds,n);-1!==r&&(d.fire("remove-pointer",{pointer:e,event:t,pointerIndex:r,interaction:this}),this.pointers.splice(r,1),this.pointerIds.splice(r,1),this.downTargets.splice(r,1),this.downTimes.splice(r,1))},e.prototype._updateEventTargets=function(e,t){this._eventTarget=e,this._curEventTarget=t},e}(),m=0,y=v.length;m=i.length)break;a=i[s++]}else{if(s=i.next(),s.done)break;a=s.value}var l=a;if(l.options.drop.enabled){var c=l.options.drop.accept;if(!(p.is.element(c)&&c!==t||p.is.string(c)&&!p.matchesSelector(t,c)))for(var d=p.is.string(l.target)?l._context.querySelectorAll(l.target):[l.target],f=0;fo.left&&c.xo.top&&c.y=o.left&&v<=o.right&&g>=o.top&&g<=o.bottom}if(f&&p.is.number(a)){s=Math.max(0,Math.min(o.right,f.right)-Math.max(o.left,f.left))*Math.max(0,Math.min(o.bottom,f.bottom)-Math.max(o.top,f.top))/(f.width*f.height)>=a}return this.options.drop.checker&&(s=this.options.drop.checker(e,t,s,this,i,n,r)),s},v.signals.on("unset",function(e){e.interactable.dropzone(!1)}),v.settingsMethods.push("dropChecker"),g.signals.on("new",function(e){e.dropTarget=null,e.dropElement=null,e.prevDropTarget=null,e.prevDropElement=null,e.dropEvents=null,e.activeDrops={dropzones:[],elements:[],rects:[]}}),g.signals.on("stop",function(e){var t=e.interaction;t.dropTarget=t.dropElement=t.prevDropTarget=t.prevDropElement=null}),d.dynamicDrop=function(e){return p.is.bool(e)?(y=e,d):y},p.merge(v.eventTypes,["dragenter","dragleave","dropactivate","dropdeactivate","dropmove","drop"]),c.methodDict.drop="dropzone",h.drop=m.defaults,t.exports=m},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../interact":21,"../scope":34,"../utils":44,"./base":6}],9:[function(e,t,n){"use strict";var r=e("./base"),i=e("../utils"),o=e("../InteractEvent"),s=e("../Interactable"),a=e("../Interaction"),l=e("../defaultOptions"),c={defaults:{enabled:!1,origin:null,restrict:null},checker:function(e,t,n,r,i){return i.pointerIds.length>=2?{name:"gesture"}:null},getCursor:function(){return""}};o.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;"gesturestart"===t.type&&(t.ds=0,n.gesture.startDistance=n.gesture.prevDistance=t.distance,n.gesture.startAngle=n.gesture.prevAngle=t.angle,n.gesture.scale=1)}),o.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;"gesturemove"===t.type&&(t.ds=t.scale-n.gesture.scale,n.target.fire(t),n.gesture.prevAngle=t.angle,n.gesture.prevDistance=t.distance,t.scale===1/0||null===t.scale||void 0===t.scale||isNaN(t.scale)||(n.gesture.scale=t.scale))}),s.prototype.gesturable=function(e){return i.is.object(e)?(this.options.gesture.enabled=!1!==e.enabled,this.setPerAction("gesture",e),this.setOnEvents("gesture",e),this):i.is.bool(e)?(this.options.gesture.enabled=e,e||(this.ongesturestart=this.ongesturestart=this.ongestureend=null),this):this.options.gesture},o.signals.on("set-delta",function(e){var t=e.interaction,n=e.iEvent,r=e.action,s=e.event,a=e.starting,l=e.ending,c=e.deltaSource;if("gesture"===r){var p=t.pointers;n.touches=[p[0],p[1]],a?(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=1,n.ds=0,n.angle=i.touchAngle(p,void 0,c),n.da=0):l||s instanceof o?(n.distance=t.prevEvent.distance,n.box=t.prevEvent.box,n.scale=t.prevEvent.scale,n.ds=n.scale-1,n.angle=t.prevEvent.angle,n.da=n.angle-t.gesture.startAngle):(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=n.distance/t.gesture.startDistance,n.angle=i.touchAngle(p,t.gesture.prevAngle,c),n.ds=n.scale-t.gesture.prevScale,n.da=n.angle-t.gesture.prevAngle)}}),a.signals.on("new",function(e){e.gesture={start:{x:0,y:0},startDistance:0,prevDistance:0,distance:0,scale:1,startAngle:0,prevAngle:0}}),r.gesture=c,r.names.push("gesture"),i.merge(s.eventTypes,["gesturestart","gesturemove","gestureend"]),r.methodDict.gesture="gesturable",l.gesture=c.defaults,t.exports=c},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"./base":6}],10:[function(e,t,n){"use strict";function r(e,t,n,r,i,s,a){if(!t)return!1;if(!0===t){var l=o.is.number(s.width)?s.width:s.right-s.left,c=o.is.number(s.height)?s.height:s.bottom-s.top;if(l<0&&("left"===e?e="right":"right"===e&&(e="left")),c<0&&("top"===e?e="bottom":"bottom"===e&&(e="top")),"left"===e)return n.x<(l>=0?s.left:s.right)+a;if("top"===e)return n.y<(c>=0?s.top:s.bottom)+a;if("right"===e)return n.x>(l>=0?s.right:s.left)-a;if("bottom"===e)return n.y>(c>=0?s.bottom:s.top)-a}return!!o.is.element(r)&&(o.is.element(t)?t===r:o.matchesUpTo(r,t,i))}var i=e("./base"),o=e("../utils"),s=e("../utils/browser"),a=e("../InteractEvent"),l=e("../Interactable"),c=e("../Interaction"),p=e("../defaultOptions"),u=s.supportsTouch||s.supportsPointerEvent?20:10,d={defaults:{enabled:!1,mouseButtons:null,origin:null,snap:null,restrict:null,inertia:null,autoScroll:null,square:!1,preserveAspectRatio:!1,axis:"xy",margin:NaN,edges:null,invert:"none"},checker:function(e,t,n,i,s,a){if(!a)return null;var l=o.extend({},s.curCoords.page),c=n.options;if(c.resize.enabled){var p=c.resize,d={left:!1,right:!1,top:!1,bottom:!1};if(o.is.object(p.edges)){for(var f in d)d[f]=r(f,p.edges[f],l,s._eventTarget,i,a,p.margin||u);if(d.left=d.left&&!d.right,d.top=d.top&&!d.bottom,d.left||d.right||d.top||d.bottom)return{name:"resize",edges:d}}else{var v="y"!==c.resize.axis&&l.x>a.right-u,g="x"!==c.resize.axis&&l.y>a.bottom-u;if(v||g)return{name:"resize",axes:(v?"x":"")+(g?"y":"")}}}return null},cursors:s.isIe9OrOlder?{x:"e-resize",y:"s-resize",xy:"se-resize",top:"n-resize",left:"w-resize",bottom:"s-resize",right:"e-resize",topleft:"se-resize",bottomright:"se-resize",topright:"ne-resize",bottomleft:"ne-resize"}:{x:"ew-resize",y:"ns-resize",xy:"nwse-resize",top:"ns-resize",left:"ew-resize",bottom:"ns-resize",right:"ew-resize",topleft:"nwse-resize",bottomright:"nwse-resize",topright:"nesw-resize",bottomleft:"nesw-resize"},getCursor:function(e){if(e.axis)return d.cursors[e.name+e.axis];if(e.edges){for(var t="",n=["top","bottom","left","right"],r=0;r<4;r++)e.edges[n[r]]&&(t+=n[r]);return d.cursors[t]}}};a.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;if("resizestart"===t.type&&n.prepared.edges){var r=n.target.getRect(n.element),i=n.target.options.resize;if(i.square||i.preserveAspectRatio){var s=o.extend({},n.prepared.edges);s.top=s.top||s.left&&!s.bottom,s.left=s.left||s.top&&!s.right,s.bottom=s.bottom||s.right&&!s.top,s.right=s.right||s.bottom&&!s.left,n.prepared._linkedEdges=s}else n.prepared._linkedEdges=null;i.preserveAspectRatio&&(n.resizeStartAspectRatio=r.width/r.height),n.resizeRects={start:r,current:o.extend({},r),inverted:o.extend({},r),previous:o.extend({},r),delta:{left:0,right:0,width:0,top:0,bottom:0,height:0}},t.rect=n.resizeRects.inverted,t.deltaRect=n.resizeRects.delta}}),a.signals.on("new",function(e){var t=e.iEvent,n=e.phase,r=e.interaction;if("move"===n&&r.prepared.edges){var i=r.target.options.resize,s=i.invert,a="reposition"===s||"negate"===s,l=r.prepared.edges,c=r.resizeRects.start,p=r.resizeRects.current,u=r.resizeRects.inverted,d=r.resizeRects.delta,f=o.extend(r.resizeRects.previous,u),v=l,g=t.dx,h=t.dy;if(i.preserveAspectRatio||i.square){var m=i.preserveAspectRatio?r.resizeStartAspectRatio:1;l=r.prepared._linkedEdges,v.left&&v.bottom||v.right&&v.top?h=-g/m:v.left||v.right?h=g/m:(v.top||v.bottom)&&(g=h*m)}if(l.top&&(p.top+=h),l.bottom&&(p.bottom+=h),l.left&&(p.left+=g),l.right&&(p.right+=g),a){if(o.extend(u,p),"reposition"===s){var y=void 0;u.top>u.bottom&&(y=u.top,u.top=u.bottom,u.bottom=y),u.left>u.right&&(y=u.left,u.left=u.right,u.right=y)}}else u.top=Math.min(p.top,c.bottom),u.bottom=Math.max(p.bottom,c.top),u.left=Math.min(p.left,c.right),u.right=Math.max(p.right,c.left);u.width=u.right-u.left,u.height=u.bottom-u.top;for(var x in u)d[x]=u[x]-f[x];t.edges=r.prepared.edges,t.rect=u,t.deltaRect=d}}),l.prototype.resizable=function(e){return o.is.object(e)?(this.options.resize.enabled=!1!==e.enabled,this.setPerAction("resize",e),this.setOnEvents("resize",e),/^x$|^y$|^xy$/.test(e.axis)?this.options.resize.axis=e.axis:null===e.axis&&(this.options.resize.axis=p.resize.axis),o.is.bool(e.preserveAspectRatio)?this.options.resize.preserveAspectRatio=e.preserveAspectRatio:o.is.bool(e.square)&&(this.options.resize.square=e.square),this):o.is.bool(e)?(this.options.resize.enabled=e,e||(this.onresizestart=this.onresizestart=this.onresizeend=null),this):this.options.resize},c.signals.on("new",function(e){ -e.resizeAxes="xy"}),a.signals.on("set-delta",function(e){var t=e.interaction,n=e.iEvent;"resize"===e.action&&t.resizeAxes&&(t.target.options.resize.square?("y"===t.resizeAxes?n.dx=n.dy:n.dy=n.dx,n.axes="xy"):(n.axes=t.resizeAxes,"x"===t.resizeAxes?n.dy=0:"y"===t.resizeAxes&&(n.dx=0)))}),i.resize=d,i.names.push("resize"),o.merge(l.eventTypes,["resizestart","resizemove","resizeinertiastart","resizeinertiaresume","resizeend"]),i.methodDict.resize="resizable",p.resize=d.defaults,t.exports=d},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"../utils/browser":37,"./base":6}],11:[function(e,t,n){"use strict";var r=e("./utils/raf"),i=e("./utils/window").getWindow,o=e("./utils/is"),s=e("./utils/domUtils"),a=e("./Interaction"),l=e("./defaultOptions"),c={defaults:{enabled:!1,container:null,margin:60,speed:300},interaction:null,i:null,x:0,y:0,isScrolling:!1,prevTime:0,start:function(e){c.isScrolling=!0,r.cancel(c.i),c.interaction=e,c.prevTime=(new Date).getTime(),c.i=r.request(c.scroll)},stop:function(){c.isScrolling=!1,r.cancel(c.i)},scroll:function(){var e=c.interaction.target.options[c.interaction.prepared.name].autoScroll,t=e.container||i(c.interaction.element),n=(new Date).getTime(),s=(n-c.prevTime)/1e3,a=e.speed*s;a>=1&&(o.window(t)?t.scrollBy(c.x*a,c.y*a):t&&(t.scrollLeft+=c.x*a,t.scrollTop+=c.y*a),c.prevTime=n),c.isScrolling&&(r.cancel(c.i),c.i=r.request(c.scroll))},check:function(e,t){var n=e.options;return n[t].autoScroll&&n[t].autoScroll.enabled},onInteractionMove:function(e){var t=e.interaction,n=e.pointer;if(t.interacting()&&c.check(t.target,t.prepared.name)){if(t.simulation)return void(c.x=c.y=0);var r=void 0,a=void 0,l=void 0,p=void 0,u=t.target.options[t.prepared.name].autoScroll,d=u.container||i(t.element);if(o.window(d))p=n.clientXd.innerWidth-c.margin,l=n.clientY>d.innerHeight-c.margin;else{var f=s.getElementClientRect(d);p=n.clientXf.right-c.margin,l=n.clientY>f.bottom-c.margin}c.x=a?1:p?-1:0,c.y=l?1:r?-1:0,c.isScrolling||(c.margin=u.margin,c.speed=u.speed,c.start(t))}}};a.signals.on("stop-active",function(){c.stop()}),a.signals.on("action-move",c.onInteractionMove),l.perAction.autoScroll=c.defaults,t.exports=c},{"./Interaction":5,"./defaultOptions":18,"./utils/domUtils":39,"./utils/is":46,"./utils/raf":50,"./utils/window":52}],12:[function(e,t,n){"use strict";var r=e("../Interactable"),i=e("../actions/base"),o=e("../utils/is"),s=e("../utils/domUtils");r.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},r.prototype.ignoreFrom=function(e){return this._backCompatOption("ignoreFrom",e)},r.prototype.allowFrom=function(e){return this._backCompatOption("allowFrom",e)},r.prototype.testIgnore=function(e,t,n){return!(!e||!o.element(n))&&(o.string(e)?s.matchesUpTo(n,e,t):!!o.element(e)&&s.nodeContains(e,n))},r.prototype.testAllow=function(e,t,n){return!e||!!o.element(n)&&(o.string(e)?s.matchesUpTo(n,e,t):!!o.element(e)&&s.nodeContains(e,n))},r.prototype.testIgnoreAllow=function(e,t,n){return!this.testIgnore(e.ignoreFrom,t,n)&&this.testAllow(e.allowFrom,t,n)},r.prototype.actionChecker=function(e){return o.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},r.prototype.styleCursor=function(e){return o.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},r.prototype.defaultActionChecker=function(e,t,n,r){for(var o=this.getRect(r),s=null,a=i.names,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var u=p;if((!n.pointerIsDown||!n.mouse||0!=(t.buttons&this.options[u].mouseButtons))&&(s=i[u].checker(e,t,this,r,n,o)))return s}}},{"../Interactable":4,"../actions/base":6,"../utils/domUtils":39,"../utils/is":46}],13:[function(e,t,n){"use strict";function r(e,t,n,r){return g.is.object(e)&&t.testIgnoreAllow(t.options[e.name],n,r)&&t.options[e.name].enabled&&a(t,n,e)?e:null}function i(e,t,n,i,o,s){for(var a=0,l=i.length;a=m.maxInteractions)return!1;if(u.target===e){if((a+=d===n.name|0)>=i)return!1;if(u.element===t&&(l++,d!==n.name||l>=o))return!1}}}return m.maxInteractions>0}}var l=e("../interact"),c=e("../Interactable"),p=e("../Interaction"),u=e("../actions/base"),d=e("../defaultOptions"),f=e("../utils/browser"),v=e("../scope"),g=e("../utils"),h=e("../utils/Signals").new();e("./InteractableMethods");var m={signals:h,withinInteractionLimit:a,maxInteractions:1/0,defaults:{perAction:{manualStart:!1,max:1/0,maxPerElement:1,allowFrom:null,ignoreFrom:null}},setActionDefaults:function(e){g.extend(e.defaults,m.defaults.perAction)}};p.signals.on("down",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;if(!t.interacting()){s(t,o(t,n,r,i))}}),p.signals.on("move",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;if(t.mouse&&!t.pointerIsDown&&!t.interacting()){s(t,o(t,n,r,i))}}),p.signals.on("move",function(e){var t=e.interaction,n=e.event;if(t.pointerIsDown&&!t.interacting()&&t.pointerWasMoved&&t.prepared.name){h.fire("before-start",e);var r=t.target;t.prepared.name&&r&&(r.options[t.prepared.name].manualStart||!a(r,t.element,t.prepared)?t.stop(n):t.start(t.prepared,r,t.element))}}),p.signals.on("stop",function(e){var t=e.interaction,n=t.target;n&&n.options.styleCursor&&(n._doc.documentElement.style.cursor="")}),c.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},c.prototype.actionChecker=function(e){return g.is.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},c.prototype.styleCursor=function(e){return g.is.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},c.prototype.defaultActionChecker=function(e,t,n,r){for(var i=this.getRect(r),o=t.buttons||{0:1,1:4,3:8,4:16}[t.button],s=null,a=u.names,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var d=p;if((!n.pointerIsDown||!n.mouse||0!=(o&this.options[d].mouseButtons))&&(s=u[d].checker(e,t,this,r,n,i)))return s}},l.maxInteractions=function(e){return g.is.number(e)?(m.maxInteractions=e,this):m.maxInteractions},c.settingsMethods.push("styleCursor"),c.settingsMethods.push("actionChecker"),c.settingsMethods.push("ignoreFrom"),c.settingsMethods.push("allowFrom"),d.base.actionChecker=null,d.base.styleCursor=!0,g.extend(d.perAction,m.defaults.perAction),t.exports=m},{"../Interactable":4,"../Interaction":5,"../actions/base":6,"../defaultOptions":18,"../interact":21,"../scope":34,"../utils":44,"../utils/Signals":35,"../utils/browser":37,"./InteractableMethods":12}],14:[function(e,t,n){"use strict";var r=e("./base"),i=e("../Interaction");i.signals.on("new",function(e){e.delayTimer=null}),r.signals.on("prepared",function(e){var t=e.interaction,n=t.prepared.name;if(n){var r=t.target.options[n].delay;r>0&&(t.delayTimer=setTimeout(function(){t.start(t.prepared,t.target,t.element)},r))}}),i.signals.on("move",function(e){var t=e.interaction,n=e.duplicate;t.pointerWasMoved&&!n&&clearTimeout(t.delayTimer)}),r.signals.on("before-start",function(e){var t=e.interaction,n=t.prepared.name;if(n){t.target.options[n].delay>0&&(t.prepared.name=null)}})},{"../Interaction":5,"./base":13}],15:[function(e,t,n){"use strict";function r(e,t){if(!t)return!1;var n=t.options.drag.startAxis;return"xy"===e||"xy"===n||n===e}var i=e("./base"),o=e("../scope"),s=e("../utils/browser"),a=e("../utils/is"),l=e("../utils/domUtils"),c=l.matchesSelector,p=l.parentNode;i.setActionDefaults(e("../actions/drag")),i.signals.on("before-start",function(e){var t=e.interaction,n=e.eventTarget,l=e.dx,u=e.dy;if("drag"===t.prepared.name){var d=Math.abs(l),f=Math.abs(u),v=t.target.options.drag,g=v.startAxis,h=d>f?"x":dl.minSpeed&&g>l.endSpeed,b={interaction:t,pageCoords:v,statuses:f,preEnd:!0,requireEndOnly:!0};y&&!x&&(c.resetStatuses(f),m=c.setAll(b),m.shouldMove&&m.locked&&(h=!0)),(x||h)&&(p.copyCoords(i.upCoords,t.curCoords),t.pointers[0]=i.startEvent=new a(t,n,t.prepared.name,"inertiastart",t.element),i.t0=d,i.active=!0,i.allowResume=l.allowResume,t.simulation=i,o.fire(i.startEvent),x?(i.vx0=t.pointerDelta.client.vx,i.vy0=t.pointerDelta.client.vy,i.v0=g,r(t,i),p.extend(v,t.curCoords.page),v.x+=i.xe,v.y+=i.ye,c.resetStatuses(f),m=c.setAll(b),i.modifiedXe+=m.dx,i.modifiedYe+=m.dy,i.i=u.request(t.boundInertiaFrame)):(i.smoothEnd=!0,i.xe=m.dx,i.ye=m.dy,i.sx=i.sy=0,i.i=u.request(t.boundSmoothEndFrame)))}}),l.signals.on("stop-active",function(e){var t=e.interaction,n=t.inertiaStatus;n.active&&(u.cancel(n.i),n.active=!1,t.simulation=null)})},{"./InteractEvent":3,"./Interaction":5,"./modifiers":24,"./utils":44,"./utils/raf":50}],21:[function(e,t,n){"use strict";function r(e,t){var n=a.interactables.get(e,t);return n||(n=new l(e,t),n.events.global=p),n}var i=e("./utils/browser"),o=e("./utils/events"),s=e("./utils"),a=e("./scope"),l=e("./Interactable"),c=e("./Interaction"),p={};r.isSet=function(e,t){return-1!==a.interactables.indexOfElement(e,t&&t.context)},r.on=function(e,t,n){if(s.is.string(e)&&-1!==e.search(" ")&&(e=e.trim().split(/ +/)),s.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.on(f,t,n)}return r}if(s.is.object(e)){for(var v in e)r.on(v,e[v],t);return r}return s.contains(l.eventTypes,e)?p[e]?p[e].push(t):p[e]=[t]:o.add(a.document,e,t,{options:n}),r},r.off=function(e,t,n){if(s.is.string(e)&&-1!==e.search(" ")&&(e=e.trim().split(/ +/)),s.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.off(f,t,n)}return r}if(s.is.object(e)){for(var v in e)r.off(v,e[v],t);return r}if(s.contains(l.eventTypes,e)){var g=void 0;e in p&&-1!==(g=s.indexOf(p[e],t))&&p[e].splice(g,1)}else o.remove(a.document,e,t,n);return r},r.debug=function(){return a},r.getPointerAverage=s.pointerAverage,r.getTouchBBox=s.touchBBox,r.getTouchDistance=s.touchDistance,r.getTouchAngle=s.touchAngle,r.getElementRect=s.getElementRect,r.getElementClientRect=s.getElementClientRect,r.matchesSelector=s.matchesSelector,r.closest=s.closest,r.supportsTouch=function(){return i.supportsTouch},r.supportsPointerEvent=function(){return i.supportsPointerEvent},r.stop=function(e){for(var t=a.interactions.length-1;t>=0;t--)a.interactions[t].stop(e);return r},r.pointerMoveTolerance=function(e){return s.is.number(e)?(c.pointerMoveTolerance=e,this):c.pointerMoveTolerance},r.addDocument=a.addDocument,r.removeDocument=a.removeDocument,a.interact=r,t.exports=r},{"./Interactable":4,"./Interaction":5,"./scope":34,"./utils":44,"./utils/browser":37,"./utils/events":40}],22:[function(e,t,n){"use strict";function r(e){var t=e.interaction,n=e.event;t.target&&t.target.checkAndPreventDefault(n)}var i=e("./Interactable"),o=e("./Interaction"),s=e("./scope"),a=e("./utils/is"),l=e("./utils/events"),c=e("./utils/domUtils"),p=c.nodeContains,u=c.matchesSelector;i.prototype.preventDefault=function(e){return/^(always|never|auto)$/.test(e)?(this.options.preventDefault=e,this):a.bool(e)?(this.options.preventDefault=e?"always":"never",this):this.options.preventDefault},i.prototype.checkAndPreventDefault=function(e){var t=this.options.preventDefault;if("never"!==t)return"always"===t?void e.preventDefault():void(l.supportsOptions||/^(mouse|pointer|touch)*(down|start)/i.test(e.type)||a.element(e.target)&&u(e.target,"input,select,textarea,[contenteditable=true],[contenteditable=true] *")||e.preventDefault())};for(var d=["down","move","up","cancel"],f=0;f=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i;if(o.element&&(o.element===e.target||p(o.element,e.target)))return void o.target.checkAndPreventDefault(e)}}},{"./Interactable":4,"./Interaction":5,"./scope":34,"./utils/domUtils":39,"./utils/events":40,"./utils/is":46}],23:[function(e,t,n){"use strict";function r(e){var t=e.target,n=a.search(e,e.type,t);n&&n.prevTap&&e.clientX===n.prevTap.clientX&&e.clientY===n.prevTap.clientY&&t===n.prevTap.target&&(n.downTargets[0]=t,n.downTimes[0]=(new Date).getTime(),l.fire({interaction:n,event:e,eventTarget:t,pointer:e,type:"tap"}))}var i=e("./scope"),o=e("./utils/events"),s=e("./utils/browser"),a=e("./utils/interactionFinder"),l=e("./pointerEvents/base"),c=e("./utils/window"),p=c.window,u=Object.prototype.toString;if(p.Array.isArray||(p.Array.isArray=function(e){return"[object Array]"===u.call(e)}),String.prototype.trim||(String.prototype.trim=function(){return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")}),s.isIE8){var d=function(e){for(var t=i.interactions,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var o;if(n){if(r>=t.length)break;o=t[r++]}else{if(r=t.next(),r.done)break;o=r.value}var s=o;s.interacting()&&s.target.checkAndPreventDefault(e)}},f=function(e,t){var n=e.doc,i=(e.win,0===t.indexOf("listen")?o.add:o.remove);i(n,"selectstart",d),l&&i(n,"dblclick",r)};i.signals.on("add-document",f),i.signals.on("remove-document",f)}t.exports=null},{"./pointerEvents/base":31,"./scope":34,"./utils/browser":37,"./utils/events":40,"./utils/interactionFinder":45,"./utils/window":52}],24:[function(e,t,n){"use strict";function r(e,t,n){return e&&e.enabled&&(t||!e.endOnly)&&(!n||e.endOnly)}var i=e("../InteractEvent"),o=e("../Interaction"),s=e("../utils/extend"),a={names:[],setOffsets:function(e){var t=e.interaction,n=e.pageCoords,r=t.target,i=t.element,o=t.startOffset,s=r.getRect(i);s?(o.left=n.x-s.left,o.top=n.y-s.top,o.right=s.right-n.x,o.bottom=s.bottom-n.y,"width"in s||(s.width=s.right-s.left),"height"in s||(s.height=s.bottom-s.top)):o.left=o.top=o.right=o.bottom=0,e.rect=s,e.interactable=r,e.element=i;for(var l=0;l=p.length)break;f=p[d++]}else{if(d=p.next(),d.done)break;f=d.value}var v=f,g=a[v],h=t.target.options[t.prepared.name][v];r(h,i,o)&&(e.status=e.status=n[v],e.options=h,e.offset=e.interaction.modifierOffsets[v],g.set(e),e.status.locked&&(l.x+=e.status.dx,l.y+=e.status.dy,c.dx+=e.status.dx,c.dy+=e.status.dy,c.locked=!0))}return c.shouldMove=!e.status||!c.locked||e.status.changed,c},resetStatuses:function(e){for(var t=a.names,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var i;if(n){if(r>=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i,s=e[o]||{};s.dx=s.dy=0,s.modifiedX=s.modifiedY=NaN,s.locked=!1,s.changed=!0,e[o]=s}return e},start:function(e,t){var n=e.interaction,r={interaction:n,pageCoords:("action-resume"===t?n.curCoords:n.startCoords).page,startOffset:n.startOffset,statuses:n.modifierStatuses,preEnd:!1,requireEndOnly:!1};a.setOffsets(r),a.resetStatuses(r.statuses),r.pageCoords=s({},n.startCoords.page),n.modifierResult=a.setAll(r)}};o.signals.on("new",function(e){e.startOffset={left:0,right:0,top:0,bottom:0},e.modifierOffsets={},e.modifierStatuses=a.resetStatuses({}),e.modifierResult=null}),o.signals.on("action-start",a.start),o.signals.on("action-resume",a.start),o.signals.on("before-action-move",function(e){var t=e.interaction,n=e.preEnd,r=e.interactingBeforeMove,i=a.setAll({interaction:t,preEnd:n,pageCoords:t.curCoords.page,statuses:t.modifierStatuses,requireEndOnly:!1});!i.shouldMove&&r&&(t._dontFireMove=!0),t.modifierResult=i}),o.signals.on("action-end",function(e){for(var t=e.interaction,n=e.event,i=0;i=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}var m=h,y=m.x,x=m.y;l.push({x:s.left-i.width*y+u.x,y:s.top-i.height*x+u.y})}else l.push(u);return l},set:function(e){var t=e.interaction,n=e.pageCoords,r=e.status,i=e.options,s=e.offset,a=[],l=void 0,c=void 0,p=void 0;if(r.useStatusXY)c={x:r.x,y:r.y};else{var u=o.getOriginXY(t.target,t.element,t.prepared.name);c=o.extend({},n),c.x-=u.x,c.y-=u.y}r.realX=c.x,r.realY=c.y;for(var d=i.targets?i.targets.length:0,f=s,v=Array.isArray(f),g=0,f=v?f:f[Symbol.iterator]();;){var h;if(v){if(g>=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}for(var m=h,y=m.x,x=m.y,b=c.x-y,w=c.y-x,E=i.targets,S=Array.isArray(E),T=0,E=S?E:E[Symbol.iterator]();;){var C;if(S){if(T>=E.length)break;C=E[T++]}else{if(T=E.next(),T.done)break;C=T.value}var A=C;l=o.is.function(A)?A(b,w,t):A,l&&a.push({x:o.is.number(l.x)?l.x+y:b,y:o.is.number(l.y)?l.y+x:w,range:o.is.number(l.range)?l.range:i.range})}}var D={target:null,inRange:!1,distance:0,range:0,dx:0,dy:0};for(p=0,d=a.length;p=p.length)break;f=p[d++]}else{if(d=p.next(),d.done)break;f=d.value}var v=f,g=void 0;g=a.is.function(v)?v(l,c,t):v,g&&("width"in g&&"height"in g&&(g.x=g.width,g.y=g.height),e.options.targets.push(g))}i.set(e)},modifyCoords:function(e){var t=e.options;e.options=a.extend({},t), -e.options.enabled=t.enabled,e.options.relativePoints=[null],i.modifyCoords(e)}};r.snapSize=l,r.names.push("snapSize"),o.perAction.snapSize=l.defaults,s.defaults.snapSize=l.defaults,t.exports=l},{"../actions/resize":10,"../defaultOptions":18,"../utils/":44,"./index":24,"./snap":28}],30:[function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=e("../utils/pointerUtils");t.exports=function(){function e(t,n,o,s,a){if(r(this,e),i.pointerExtend(this,o),o!==n&&i.pointerExtend(this,n),this.interaction=a,this.timeStamp=(new Date).getTime(),this.originalEvent=o,this.type=t,this.pointerId=i.getPointerId(n),this.pointerType=i.getPointerType(n,a),this.target=s,this.currentTarget=null,"tap"===t){var l=a.getPointerIndex(n);this.dt=this.timeStamp-a.downTimes[l];var c=this.timeStamp-a.tapTime;this.double=!!(a.prevTap&&"doubletap"!==a.prevTap.type&&a.prevTap.target===this.target&&c<500)}else"doubletap"===t&&(this.dt=n.timeStamp-a.tapTime)}return e.prototype.subtractOrigin=function(e){var t=e.x,n=e.y;return this.pageX-=t,this.pageY-=n,this.clientX-=t,this.clientY-=n,this},e.prototype.addOrigin=function(e){var t=e.x,n=e.y;return this.pageX+=t,this.pageY+=n,this.clientX+=t,this.clientY+=n,this},e.prototype.preventDefault=function(){this.originalEvent.preventDefault()},e.prototype.stopPropagation=function(){this.propagationStopped=!0},e.prototype.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},e}()},{"../utils/pointerUtils":49}],31:[function(e,t,n){"use strict";function r(e){for(var t=e.interaction,n=e.pointer,s=e.event,l=e.eventTarget,c=e.type,u=void 0===c?e.pointerEvent.type:c,d=e.targets,f=void 0===d?i(e):d,v=e.pointerEvent,g=void 0===v?new o(u,n,s,l,t):v,h={interaction:t,pointer:n,event:s,eventTarget:l,targets:f,type:u,pointerEvent:g},m=0;m=u.length)break;g=u[v++]}else{if(v=u.next(),v.done)break;g=v.value}var h=g;c.element=h,p.fire("collect-targets",c)}return"hold"===o&&(c.targets=d(c.targets,function(e){return e.eventable.options.holdDuration===t.holdTimers[s].duration})),c.targets}var o=e("./PointerEvent"),s=e("../Interaction"),a=e("../utils"),l=e("../utils/browser"),c=e("../defaultOptions"),p=e("../utils/Signals").new(),u=e("../utils/arr"),d=u.filter,f=["down","up","cancel"],v=["down","up","cancel"],g={PointerEvent:o,fire:r,collectEventTargets:i,signals:p,defaults:{holdDuration:600,ignoreFrom:null,allowFrom:null,origin:{x:0,y:0}},types:["down","move","up","cancel","tap","doubletap","hold"]};s.signals.on("update-pointer-down",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers[n]={duration:1/0,timeout:null}}),s.signals.on("remove-pointer",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers.splice(n,1)}),s.signals.on("move",function(e){var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,s=e.duplicateMove,a=t.getPointerIndex(n);s||t.pointerIsDown&&!t.pointerWasMoved||(t.pointerIsDown&&clearTimeout(t.holdTimers[a].timeout),r({interaction:t,pointer:n,event:i,eventTarget:o,type:"move"}))}),s.signals.on("down",function(e){for(var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,s=e.pointerIndex,c=l.isIE8?a.extend({},i):i,u=t.holdTimers[s],d=a.getPath(o),f={interaction:t,pointer:n,event:i,eventTarget:o,type:"hold",targets:[],path:d,element:null},v=d,g=Array.isArray(v),h=0,v=g?v:v[Symbol.iterator]();;){var m;if(g){if(h>=v.length)break;m=v[h++]}else{if(h=v.next(),h.done)break;m=h.value}var y=m;f.element=y,p.fire("collect-targets",f)}if(f.targets.length){for(var x=1/0,b=0;b=0&&(p.selectors[u]!==e||p.contexts[u]!==t);u--);-1===u&&(u=p.selectors.length,p.selectors.push(e),p.contexts.push(t),p.listeners.push([])),p.listeners[u].push([i,!!s.capture,s.passive])}function s(e,t,n,r,o){var s=f(o),c=O[n],p=!1,u=void 0;if(c)for(u=c.selectors.length-1;u>=0;u--)if(c.selectors[u]===e&&c.contexts[u]===t){for(var d=c.listeners[u],v=d.length-1;v>=0;v--){var g=d[v],h=g[0],m=g[1],y=g[2];if(h===r&&m===!!s.capture&&y===s.passive){d.splice(v,1),d.length||(c.selectors.splice(u,1),c.contexts.splice(u,1),c.listeners.splice(u,1),i(t,n,a),i(t,n,l,!0),c.selectors.length||(O[n]=null)),p=!0;break}}if(p)break}}function a(e,t){var n=f(t),r={},i=O[e.type],o=g.getActualElement(e.path?e.path[0]:e.target),s=o;for(h(r,e),r.originalEvent=e,r.preventDefault=p;v.element(s);){for(var a=0;a=l.length)break;u=l[p++]}else{if(p=l.next(),p.done)break;u=p.value}var d=u,f=s[d](a);if(f)return f}},simulationResume:function(e){var t=e.mouseEvent,n=e.eventType,o=e.eventTarget;if(!/down|start/i.test(n))return null;for(var s=r.interactions,a=Array.isArray(s),l=0,s=a?s:s[Symbol.iterator]();;){var c;if(a){if(l>=s.length)break;c=s[l++]}else{if(l=s.next(),l.done)break;c=l.value}var p=c,u=o;if(p.simulation&&p.simulation.allowResume&&p.mouse===t)for(;u;){if(u===p.element)return p;u=i.parentNode(u)}}return null},mouse:function(e){var t=e.pointerId,n=e.mouseEvent,s=e.eventType;if(!n&&(o.supportsTouch||o.supportsPointerEvent))return null;for(var a=void 0,l=r.interactions,c=Array.isArray(l),p=0,l=c?l:l[Symbol.iterator]();;){var u;if(c){if(p>=l.length)break;u=l[p++]}else{if(p=l.next(),p.done)break;u=p.value}var d=u;if(d.mouse){if(d.simulation&&!i.contains(d.pointerIds,t))continue;if(d.interacting())return d;a||(a=d)}}if(a)return a;for(var f=r.interactions,v=Array.isArray(f),g=0,f=v?f:f[Symbol.iterator]();;){var h;if(v){if(g>=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}var m=h;if(m.mouse&&(!/down/.test(s)||!m.simulation))return m}return null},hasPointer:function(e){for(var t=e.pointerId,n=r.interactions,o=Array.isArray(n),s=0,n=o?n:n[Symbol.iterator]();;){var a;if(o){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var l=a;if(i.contains(l.pointerIds,t))return l}},idle:function(e){for(var t=e.mouseEvent,n=r.interactions,i=Array.isArray(n),o=0,n=i?n:n[Symbol.iterator]();;){var s;if(i){if(o>=n.length)break;s=n[o++]}else{if(o=n.next(),o.done)break;s=o.value}var a=s;if(1===a.pointerIds.length){var l=a.target;if(l&&!l.options.gesture.enabled)continue}else if(a.pointerIds.length>=2)continue;if(!a.interacting()&&t===a.mouse)return a}return null}};t.exports=s},{"../scope":34,"./browser":37,"./index":44}],46:[function(e,t,n){"use strict";var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},i=e("./window"),o=e("./isWindow"),s={array:function(){},window:function(e){return e===i.window||o(e)},docFrag:function(e){return s.object(e)&&11===e.nodeType},object:function(e){return!!e&&"object"===(void 0===e?"undefined":r(e))},function:function(e){return"function"==typeof e},number:function(e){return"number"==typeof e},bool:function(e){return"boolean"==typeof e},string:function(e){return"string"==typeof e},element:function(e){if(!e||"object"!==(void 0===e?"undefined":r(e)))return!1;var t=i.getWindow(e)||i.window;return/object|function/.test(r(t.Element))?e instanceof t.Element:1===e.nodeType&&"string"==typeof e.nodeName}};s.array=function(e){return s.object(e)&&void 0!==e.length&&s.function(e.splice)},t.exports=s},{"./isWindow":47,"./window":52}],47:[function(e,t,n){"use strict";t.exports=function(e){return!(!e||!e.Window)&&e instanceof e.Window}},{}],48:[function(e,t,n){"use strict";function r(e,n){for(var r in n){var i=t.exports.prefixedPropREs,o=!1;for(var s in i)if(0===r.indexOf(s)&&i[s].test(r)){o=!0;break}o||"function"==typeof n[r]||(e[r]=n[r])}return e}r.prefixedPropREs={webkit:/(Movement[XY]|Radius[XY]|RotationAngle|Force)$/},t.exports=r},{}],49:[function(e,t,n){"use strict";var r=e("./hypot"),i=e("./browser"),o=e("./domObjects"),s=e("./domUtils"),a=e("./is"),l=e("./pointerExtend"),c={copyCoords:function(e,t){e.page=e.page||{},e.page.x=t.page.x,e.page.y=t.page.y,e.client=e.client||{},e.client.x=t.client.x,e.client.y=t.client.y,e.timeStamp=t.timeStamp},setCoordDeltas:function(e,t,n){e.page.x=n.page.x-t.page.x,e.page.y=n.page.y-t.page.y,e.client.x=n.client.x-t.client.x,e.client.y=n.client.y-t.client.y,e.timeStamp=n.timeStamp-t.timeStamp;var i=Math.max(e.timeStamp/1e3,.001);e.page.speed=r(e.page.x,e.page.y)/i,e.page.vx=e.page.x/i,e.page.vy=e.page.y/i,e.client.speed=r(e.client.x,e.page.y)/i,e.client.vx=e.client.x/i,e.client.vy=e.client.y/i},isNativePointer:function(e){return e instanceof o.Event||e instanceof o.Touch},getXY:function(e,t,n){return n=n||{},e=e||"page",n.x=t[e+"X"],n.y=t[e+"Y"],n},getPageXY:function(e,t){return t=t||{},i.isOperaMobile&&c.isNativePointer(e)?(c.getXY("screen",e,t),t.x+=window.scrollX,t.y+=window.scrollY):c.getXY("page",e,t),t},getClientXY:function(e,t){return t=t||{},i.isOperaMobile&&c.isNativePointer(e)?c.getXY("screen",e,t):c.getXY("client",e,t),t},getPointerId:function(e){return a.number(e.pointerId)?e.pointerId:e.identifier},setCoords:function(e,t,n){var r=t.length>1?c.pointerAverage(t):t[0],i={};c.getPageXY(r,i),e.page.x=i.x,e.page.y=i.y,c.getClientXY(r,i),e.client.x=i.x,e.client.y=i.y,e.timeStamp=a.number(n)?n:(new Date).getTime()},pointerExtend:l,getTouchPair:function(e){var t=[];return a.array(e)?(t[0]=e[0],t[1]=e[1]):"touchend"===e.type?1===e.touches.length?(t[0]=e.touches[0],t[1]=e.changedTouches[0]):0===e.touches.length&&(t[0]=e.changedTouches[0],t[1]=e.changedTouches[1]):(t[0]=e.touches[0],t[1]=e.touches[1]),t},pointerAverage:function(e){for(var t={pageX:0,pageY:0,clientX:0,clientY:0,screenX:0,screenY:0},n=e,r=Array.isArray(n),i=0,n=r?n:n[Symbol.iterator]();;){var o;if(r){if(i>=n.length)break;o=n[i++]}else{if(i=n.next(),i.done)break;o=i.value}var s=o;for(var a in t)t[a]+=s[a]}for(var l in t)t[l]/=e.length;return t},touchBBox:function(e){if(e.length||e.touches&&e.touches.length>1){var t=c.getTouchPair(e),n=Math.min(t[0].pageX,t[1].pageX),r=Math.min(t[0].pageY,t[1].pageY);return{x:n,y:r,left:n,top:r,width:Math.max(t[0].pageX,t[1].pageX)-n,height:Math.max(t[0].pageY,t[1].pageY)-r}}},touchDistance:function(e,t){var n=t+"X",i=t+"Y",o=c.getTouchPair(e),s=o[0][n]-o[1][n],a=o[0][i]-o[1][i];return r(s,a)},touchAngle:function(e,t,n){var r=n+"X",i=n+"Y",o=c.getTouchPair(e),s=o[1][r]-o[0][r],a=o[1][i]-o[0][i];return 180*Math.atan2(a,s)/Math.PI},getPointerType:function(e,t){return t.mouse?"mouse":i.supportsPointerEvent?a.string(e.pointerType)?e.pointerType:[void 0,void 0,"touch","pen","mouse"][e.pointerType]:"touch"},getEventTargets:function(e){return[s.getActualElement(e.path?e.path[0]:e.target),s.getActualElement(e.currentTarget)]}};t.exports=c},{"./browser":37,"./domObjects":38,"./domUtils":39,"./hypot":43,"./is":46,"./pointerExtend":48}],50:[function(e,t,n){"use strict";for(var r=e("./window"),i=r.window,o=["ms","moz","webkit","o"],s=0,a=void 0,l=void 0,c=0;c6&&void 0!==arguments[6]&&arguments[6];r(this,e);var f=t.target,v=(f&&f.options||s).deltaSource,g=o(f,p,l),h="start"===c,m="end"===c,y=h?t.startCoords:t.curCoords,x=t.prevEvent;p=p||t.element;var b=i({},y.page),w=i({},y.client);b.x-=g.x,b.y-=g.y,w.x-=g.x,w.y-=g.y,this.ctrlKey=n.ctrlKey,this.altKey=n.altKey,this.shiftKey=n.shiftKey,this.metaKey=n.metaKey,this.button=n.button,this.buttons=n.buttons,this.target=p,this.currentTarget=p,this.relatedTarget=u||null,this.preEnd=d,this.type=l+(c||""),this.interaction=t,this.interactable=f,this.t0=h?t.downTimes[t.downTimes.length-1]:x.t0;var E={interaction:t,event:n,action:l,phase:c,element:p,related:u,page:b,client:w,coords:y,starting:h,ending:m,deltaSource:v,iEvent:this};a.fire("set-xy",E),m?(this.pageX=x.pageX,this.pageY=x.pageY,this.clientX=x.clientX,this.clientY=x.clientY):(this.pageX=b.x,this.pageY=b.y,this.clientX=w.x,this.clientY=w.y),this.x0=t.startCoords.page.x-g.x,this.y0=t.startCoords.page.y-g.y,this.clientX0=t.startCoords.client.x-g.x,this.clientY0=t.startCoords.client.y-g.y,a.fire("set-delta",E),this.timeStamp=y.timeStamp,this.dt=t.pointerDelta.timeStamp,this.duration=this.timeStamp-this.t0,this.speed=t.pointerDelta[v].speed,this.velocityX=t.pointerDelta[v].vx,this.velocityY=t.pointerDelta[v].vy,this.swipe=m||"inertiastart"===c?this.getSwipe():null,a.fire("new",E)}return e.prototype.getSwipe=function(){var e=this.interaction;if(e.prevEvent.speed<600||this.timeStamp-e.prevEvent.timeStamp>150)return null;var t=180*Math.atan2(e.prevEvent.velocityY,e.prevEvent.velocityX)/Math.PI;t<0&&(t+=360);var n=112.5<=t&&t<247.5,r=202.5<=t&&t<337.5,i=!n&&(292.5<=t||t<67.5);return{up:r,down:!r&&22.5<=t&&t<157.5,left:n,right:i,angle:t,speed:e.prevEvent.speed,velocity:{x:e.prevEvent.velocityX,y:e.prevEvent.velocityY}}},e.prototype.preventDefault=function(){},e.prototype.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},e.prototype.stopPropagation=function(){this.propagationStopped=!0},e}();a.on("set-delta",function(e){var t=e.iEvent,n=e.interaction,r=e.starting,i=e.deltaSource,o=r?t:n.prevEvent;"client"===i?(t.dx=t.clientX-o.clientX,t.dy=t.clientY-o.clientY):(t.dx=t.pageX-o.pageX,t.dy=t.pageY-o.pageY)}),l.signals=a,t.exports=l},{"./defaultOptions":18,"./utils/Signals":35,"./utils/extend":41,"./utils/getOriginXY":42}],4:[function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=e("./utils/is"),o=e("./utils/events"),s=e("./utils/extend"),a=e("./actions/base"),l=e("./scope"),c=e("./Eventable"),p=e("./defaultOptions"),u=e("./utils/Signals").new(),d=e("./utils/domUtils"),f=d.getElementRect,v=d.nodeContains,g=d.trySelector,h=e("./utils/window"),m=h.getWindow,y=e("./utils/arr"),x=y.indexOf,b=y.contains,w=e("./utils/browser"),E=w.wheelEvent;l.interactables=[];var S=function(){function e(t,n){r(this,e),n=n||{},this.target=t,this.events=new c,this._context=n.context||l.document,this._win=m(g(t)?this._context:t),this._doc=this._win.document,u.fire("new",{target:t,options:n,interactable:this,win:this._win}),l.addDocument(this._doc,this._win),l.interactables.push(this),this.set(n)}return e.prototype.setOnEvents=function(e,t){var n="on"+e;return i.function(t.onstart)&&(this.events[n+"start"]=t.onstart),i.function(t.onmove)&&(this.events[n+"move"]=t.onmove),i.function(t.onend)&&(this.events[n+"end"]=t.onend),i.function(t.oninertiastart)&&(this.events[n+"inertiastart"]=t.oninertiastart),this},e.prototype.setPerAction=function(e,t){for(var n in t)n in p[e]&&(i.object(t[n])?(this.options[e][n]=s(this.options[e][n]||{},t[n]),i.object(p.perAction[n])&&"enabled"in p.perAction[n]&&(this.options[e][n].enabled=!1!==t[n].enabled)):i.bool(t[n])&&i.object(p.perAction[n])?this.options[e][n].enabled=t[n]:void 0!==t[n]&&(this.options[e][n]=t[n]))},e.prototype.getRect=function(e){return e=e||this.target,i.string(this.target)&&!i.element(e)&&(e=this._context.querySelector(this.target)),f(e)},e.prototype.rectChecker=function(e){return i.function(e)?(this.getRect=e,this):null===e?(delete this.options.getRect,this):this.getRect},e.prototype._backCompatOption=function(e,t){if(g(t)||i.object(t)){this.options[e]=t;for(var n=a.names,r=Array.isArray(n),o=0,n=r?n:n[Symbol.iterator]();;){var s;if(r){if(o>=n.length)break;s=n[o++]}else{if(o=n.next(),o.done)break;s=o.value}var l=s;this.options[l][e]=t}return this}return this.options[e]},e.prototype.origin=function(e){return this._backCompatOption("origin",e)},e.prototype.deltaSource=function(e){return"page"===e||"client"===e?(this.options.deltaSource=e,this):this.options.deltaSource},e.prototype.context=function(){return this._context},e.prototype.inContext=function(e){return this._context===e.ownerDocument||v(this._context,e)},e.prototype.fire=function(e){return this.events.fire(e),this},e.prototype._onOffMultiple=function(e,t,n,r){if(i.string(t)&&-1!==t.search(" ")&&(t=t.trim().split(/ +/)),i.array(t)){for(var o=0;o=l.length)break;f=l[d++]}else{if(d=l.next(),d.done)break;f=d.value}var v=f;this.options[v]=p.base[v],v in t&&this[v](t[v])}return u.fire("set",{options:t,interactable:this}),this},e.prototype.unset=function(){if(o.remove(this.target,"all"),i.string(this.target))for(var e in o.delegatedEvents){var t=o.delegatedEvents[e];t.selectors[0]===this.target&&t.contexts[0]===this._context&&(t.selectors.splice(0,1),t.contexts.splice(0,1),t.listeners.splice(0,1),t.selectors.length||(t[e]=null)),o.remove(this._context,e,o.delegateListener),o.remove(this._context,e,o.delegateUseCapture,!0)}else o.remove(this,"all");u.fire("unset",{interactable:this}),l.interactables.splice(x(l.interactables,this),1);for(var n=l.interactions||[],r=Array.isArray(n),s=0,n=r?n:n[Symbol.iterator]();;){var a;if(r){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var c=a;c.target===this&&c.interacting()&&c.stop()}return l.interact},e}();l.interactables.indexOfElement=function(e,t){t=t||l.document;for(var n=0;n=x.length)break;E=x[w++]}else{if(w=x.next(),w.done)break;E=w.value}var S=E,T=S[0],C=S[1];C._updateEventTargets(i,o),C[e](T,t,i,o)}}}function o(e){for(var t=0;te.pointerMoveTolerance);var a={pointer:t,pointerIndex:this.getPointerIndex(t),event:n,eventTarget:r,dx:o,dy:s,duplicate:i,interaction:this,interactingBeforeMove:this.interacting()};i||l.setCoordDeltas(this.pointerDelta,this.prevCoords,this.curCoords),f.fire("move",a),i||(this.interacting()&&this.doMove(a),this.pointerWasMoved&&l.copyCoords(this.prevCoords,this.curCoords))},e.prototype.doMove=function(e){e=l.extend({pointer:this.pointers[0],event:this.prevEvent,eventTarget:this._eventTarget,interaction:this},e||{}),f.fire("before-action-move",e),this._dontFireMove||f.fire("action-move",e),this._dontFireMove=!1},e.prototype.pointerUp=function(e,t,n,r){var i=this.getPointerIndex(e);f.fire(/cancel$/i.test(t.type)?"cancel":"up",{pointer:e,pointerIndex:i,event:t,eventTarget:n,curEventTarget:r,interaction:this}),this.simulation||this.end(t),this.pointerIsDown=!1,this.removePointer(e,t)},e.prototype.end=function(e){e=e||this.prevEvent,this.interacting()&&f.fire("action-end",{event:e,interaction:this}),this.stop()},e.prototype.currentAction=function(){return this._interacting?this.prepared.name:null},e.prototype.interacting=function(){return this._interacting},e.prototype.stop=function(){f.fire("stop",{interaction:this}),this._interacting&&(f.fire("stop-active",{interaction:this}),f.fire("stop-"+this.prepared.name,{interaction:this})),this.target=this.element=null,this._interacting=!1,this.prepared.name=this.prevEvent=null},e.prototype.getPointerIndex=function(e){return"mouse"===this.pointerType||"pen"===this.pointerType?0:l.indexOf(this.pointerIds,l.getPointerId(e))},e.prototype.updatePointer=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:t&&/(down|start)$/i.test(t.type),r=l.getPointerId(e),i=this.getPointerIndex(e);return-1===i&&(i=this.pointerIds.length,this.pointerIds[i]=r),n&&f.fire("update-pointer-down",{pointer:e,event:t,down:n,pointerId:r,pointerIndex:i,interaction:this}),this.pointers[i]=e,i},e.prototype.removePointer=function(e,t){var n=this.getPointerIndex(e);-1!==n&&(f.fire("remove-pointer",{pointer:e,event:t,pointerIndex:n,interaction:this}),this.pointers.splice(n,1),this.pointerIds.splice(n,1),this.downTargets.splice(n,1),this.downTimes.splice(n,1))},e.prototype._updateEventTargets=function(e,t){this._eventTarget=e,this._curEventTarget=t},e}(),y=0,x=g.length;y=i.length)break;a=i[s++]}else{if(s=i.next(),s.done)break;a=s.value}var l=a;if(l.options.drop.enabled){var c=l.options.drop.accept;if(!(p.is.element(c)&&c!==t||p.is.string(c)&&!p.matchesSelector(t,c)))for(var d=p.is.string(l.target)?l._context.querySelectorAll(l.target):[l.target],f=0;fo.left&&c.xo.top&&c.y=o.left&&v<=o.right&&g>=o.top&&g<=o.bottom}if(f&&p.is.number(a)){s=Math.max(0,Math.min(o.right,f.right)-Math.max(o.left,f.left))*Math.max(0,Math.min(o.bottom,f.bottom)-Math.max(o.top,f.top))/(f.width*f.height)>=a}return this.options.drop.checker&&(s=this.options.drop.checker(e,t,s,this,i,n,r)),s},v.signals.on("unset",function(e){e.interactable.dropzone(!1)}),v.settingsMethods.push("dropChecker"),g.signals.on("new",function(e){e.dropTarget=null,e.dropElement=null,e.prevDropTarget=null,e.prevDropElement=null,e.dropEvents=null,e.activeDrops={dropzones:[],elements:[],rects:[]}}),g.signals.on("stop",function(e){var t=e.interaction;t.dropTarget=t.dropElement=t.prevDropTarget=t.prevDropElement=null}),d.dynamicDrop=function(e){return p.is.bool(e)?(y=e,d):y},p.merge(v.eventTypes,["dragenter","dragleave","dropactivate","dropdeactivate","dropmove","drop"]),c.methodDict.drop="dropzone",h.drop=m.defaults,t.exports=m},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../interact":21,"../scope":34,"../utils":44,"./base":6}],9:[function(e,t,n){"use strict";var r=e("./base"),i=e("../utils"),o=e("../InteractEvent"),s=e("../Interactable"),a=e("../Interaction"),l=e("../defaultOptions"),c={defaults:{enabled:!1,origin:null,restrict:null},checker:function(e,t,n,r,i){return i.pointerIds.length>=2?{name:"gesture"}:null},getCursor:function(){return""}};o.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;"gesturestart"===t.type&&(t.ds=0,n.gesture.startDistance=n.gesture.prevDistance=t.distance,n.gesture.startAngle=n.gesture.prevAngle=t.angle,n.gesture.scale=1)}),o.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;"gesturemove"===t.type&&(t.ds=t.scale-n.gesture.scale,n.target.fire(t),n.gesture.prevAngle=t.angle,n.gesture.prevDistance=t.distance,t.scale===1/0||null===t.scale||void 0===t.scale||isNaN(t.scale)||(n.gesture.scale=t.scale))}),s.prototype.gesturable=function(e){return i.is.object(e)?(this.options.gesture.enabled=!1!==e.enabled,this.setPerAction("gesture",e),this.setOnEvents("gesture",e),this):i.is.bool(e)?(this.options.gesture.enabled=e,e||(this.ongesturestart=this.ongesturestart=this.ongestureend=null),this):this.options.gesture},o.signals.on("set-delta",function(e){var t=e.interaction,n=e.iEvent,r=e.action,s=e.event,a=e.starting,l=e.ending,c=e.deltaSource;if("gesture"===r){var p=t.pointers;n.touches=[p[0],p[1]],a?(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=1,n.ds=0,n.angle=i.touchAngle(p,void 0,c),n.da=0):l||s instanceof o?(n.distance=t.prevEvent.distance,n.box=t.prevEvent.box,n.scale=t.prevEvent.scale,n.ds=n.scale-1,n.angle=t.prevEvent.angle,n.da=n.angle-t.gesture.startAngle):(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=n.distance/t.gesture.startDistance,n.angle=i.touchAngle(p,t.gesture.prevAngle,c),n.ds=n.scale-t.gesture.prevScale,n.da=n.angle-t.gesture.prevAngle)}}),a.signals.on("new",function(e){e.gesture={start:{x:0,y:0},startDistance:0,prevDistance:0,distance:0,scale:1,startAngle:0,prevAngle:0}}),r.gesture=c,r.names.push("gesture"),i.merge(s.eventTypes,["gesturestart","gesturemove","gestureend"]),r.methodDict.gesture="gesturable",l.gesture=c.defaults,t.exports=c},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"./base":6}],10:[function(e,t,n){"use strict";function r(e,t,n,r,i,s,a){if(!t)return!1;if(!0===t){var l=o.is.number(s.width)?s.width:s.right-s.left,c=o.is.number(s.height)?s.height:s.bottom-s.top;if(l<0&&("left"===e?e="right":"right"===e&&(e="left")),c<0&&("top"===e?e="bottom":"bottom"===e&&(e="top")),"left"===e)return n.x<(l>=0?s.left:s.right)+a;if("top"===e)return n.y<(c>=0?s.top:s.bottom)+a;if("right"===e)return n.x>(l>=0?s.right:s.left)-a;if("bottom"===e)return n.y>(c>=0?s.bottom:s.top)-a}return!!o.is.element(r)&&(o.is.element(t)?t===r:o.matchesUpTo(r,t,i))}var i=e("./base"),o=e("../utils"),s=e("../utils/browser"),a=e("../InteractEvent"),l=e("../Interactable"),c=e("../Interaction"),p=e("../defaultOptions"),u=s.supportsTouch||s.supportsPointerEvent?20:10,d={defaults:{enabled:!1,mouseButtons:null,origin:null,snap:null,restrict:null,inertia:null,autoScroll:null,square:!1,preserveAspectRatio:!1,axis:"xy",margin:NaN,edges:null,invert:"none"},checker:function(e,t,n,i,s,a){if(!a)return null;var l=o.extend({},s.curCoords.page),c=n.options;if(c.resize.enabled){var p=c.resize,d={left:!1,right:!1,top:!1,bottom:!1};if(o.is.object(p.edges)){for(var f in d)d[f]=r(f,p.edges[f],l,s._eventTarget,i,a,p.margin||u);if(d.left=d.left&&!d.right,d.top=d.top&&!d.bottom,d.left||d.right||d.top||d.bottom)return{name:"resize",edges:d}}else{var v="y"!==c.resize.axis&&l.x>a.right-u,g="x"!==c.resize.axis&&l.y>a.bottom-u;if(v||g)return{name:"resize",axes:(v?"x":"")+(g?"y":"")}}}return null},cursors:s.isIe9OrOlder?{x:"e-resize",y:"s-resize",xy:"se-resize",top:"n-resize",left:"w-resize",bottom:"s-resize",right:"e-resize",topleft:"se-resize",bottomright:"se-resize",topright:"ne-resize",bottomleft:"ne-resize"}:{x:"ew-resize",y:"ns-resize",xy:"nwse-resize",top:"ns-resize",left:"ew-resize",bottom:"ns-resize",right:"ew-resize",topleft:"nwse-resize",bottomright:"nwse-resize",topright:"nesw-resize",bottomleft:"nesw-resize"},getCursor:function(e){if(e.axis)return d.cursors[e.name+e.axis];if(e.edges){for(var t="",n=["top","bottom","left","right"],r=0;r<4;r++)e.edges[n[r]]&&(t+=n[r]);return d.cursors[t]}}};a.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;if("resizestart"===t.type&&n.prepared.edges){var r=n.target.getRect(n.element),i=n.target.options.resize;if(i.square||i.preserveAspectRatio){var s=o.extend({},n.prepared.edges);s.top=s.top||s.left&&!s.bottom,s.left=s.left||s.top&&!s.right,s.bottom=s.bottom||s.right&&!s.top,s.right=s.right||s.bottom&&!s.left,n.prepared._linkedEdges=s}else n.prepared._linkedEdges=null;i.preserveAspectRatio&&(n.resizeStartAspectRatio=r.width/r.height),n.resizeRects={start:r,current:o.extend({},r),inverted:o.extend({},r),previous:o.extend({},r),delta:{left:0,right:0,width:0,top:0,bottom:0,height:0}},t.rect=n.resizeRects.inverted,t.deltaRect=n.resizeRects.delta}}),a.signals.on("new",function(e){var t=e.iEvent,n=e.phase,r=e.interaction;if("move"===n&&r.prepared.edges){var i=r.target.options.resize,s=i.invert,a="reposition"===s||"negate"===s,l=r.prepared.edges,c=r.resizeRects.start,p=r.resizeRects.current,u=r.resizeRects.inverted,d=r.resizeRects.delta,f=o.extend(r.resizeRects.previous,u),v=l,g=t.dx,h=t.dy;if(i.preserveAspectRatio||i.square){var m=i.preserveAspectRatio?r.resizeStartAspectRatio:1;l=r.prepared._linkedEdges,v.left&&v.bottom||v.right&&v.top?h=-g/m:v.left||v.right?h=g/m:(v.top||v.bottom)&&(g=h*m)}if(l.top&&(p.top+=h),l.bottom&&(p.bottom+=h),l.left&&(p.left+=g),l.right&&(p.right+=g),a){if(o.extend(u,p),"reposition"===s){var y=void 0;u.top>u.bottom&&(y=u.top,u.top=u.bottom,u.bottom=y),u.left>u.right&&(y=u.left,u.left=u.right,u.right=y)}}else u.top=Math.min(p.top,c.bottom),u.bottom=Math.max(p.bottom,c.top),u.left=Math.min(p.left,c.right),u.right=Math.max(p.right,c.left);u.width=u.right-u.left,u.height=u.bottom-u.top;for(var x in u)d[x]=u[x]-f[x];t.edges=r.prepared.edges,t.rect=u,t.deltaRect=d}}),l.prototype.resizable=function(e){return o.is.object(e)?(this.options.resize.enabled=!1!==e.enabled,this.setPerAction("resize",e),this.setOnEvents("resize",e),/^x$|^y$|^xy$/.test(e.axis)?this.options.resize.axis=e.axis:null===e.axis&&(this.options.resize.axis=p.resize.axis),o.is.bool(e.preserveAspectRatio)?this.options.resize.preserveAspectRatio=e.preserveAspectRatio:o.is.bool(e.square)&&(this.options.resize.square=e.square),this):o.is.bool(e)?(this.options.resize.enabled=e, +e||(this.onresizestart=this.onresizestart=this.onresizeend=null),this):this.options.resize},c.signals.on("new",function(e){e.resizeAxes="xy"}),a.signals.on("set-delta",function(e){var t=e.interaction,n=e.iEvent;"resize"===e.action&&t.resizeAxes&&(t.target.options.resize.square?("y"===t.resizeAxes?n.dx=n.dy:n.dy=n.dx,n.axes="xy"):(n.axes=t.resizeAxes,"x"===t.resizeAxes?n.dy=0:"y"===t.resizeAxes&&(n.dx=0)))}),i.resize=d,i.names.push("resize"),o.merge(l.eventTypes,["resizestart","resizemove","resizeinertiastart","resizeinertiaresume","resizeend"]),i.methodDict.resize="resizable",p.resize=d.defaults,t.exports=d},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"../utils/browser":37,"./base":6}],11:[function(e,t,n){"use strict";var r=e("./utils/raf"),i=e("./utils/window").getWindow,o=e("./utils/is"),s=e("./utils/domUtils"),a=e("./Interaction"),l=e("./defaultOptions"),c={defaults:{enabled:!1,container:null,margin:60,speed:300},interaction:null,i:null,x:0,y:0,isScrolling:!1,prevTime:0,start:function(e){c.isScrolling=!0,r.cancel(c.i),c.interaction=e,c.prevTime=(new Date).getTime(),c.i=r.request(c.scroll)},stop:function(){c.isScrolling=!1,r.cancel(c.i)},scroll:function(){var e=c.interaction.target.options[c.interaction.prepared.name].autoScroll,t=e.container||i(c.interaction.element),n=(new Date).getTime(),s=(n-c.prevTime)/1e3,a=e.speed*s;a>=1&&(o.window(t)?t.scrollBy(c.x*a,c.y*a):t&&(t.scrollLeft+=c.x*a,t.scrollTop+=c.y*a),c.prevTime=n),c.isScrolling&&(r.cancel(c.i),c.i=r.request(c.scroll))},check:function(e,t){var n=e.options;return n[t].autoScroll&&n[t].autoScroll.enabled},onInteractionMove:function(e){var t=e.interaction,n=e.pointer;if(t.interacting()&&c.check(t.target,t.prepared.name)){if(t.simulation)return void(c.x=c.y=0);var r=void 0,a=void 0,l=void 0,p=void 0,u=t.target.options[t.prepared.name].autoScroll,d=u.container||i(t.element);if(o.window(d))p=n.clientXd.innerWidth-c.margin,l=n.clientY>d.innerHeight-c.margin;else{var f=s.getElementClientRect(d);p=n.clientXf.right-c.margin,l=n.clientY>f.bottom-c.margin}c.x=a?1:p?-1:0,c.y=l?1:r?-1:0,c.isScrolling||(c.margin=u.margin,c.speed=u.speed,c.start(t))}}};a.signals.on("stop-active",function(){c.stop()}),a.signals.on("action-move",c.onInteractionMove),l.perAction.autoScroll=c.defaults,t.exports=c},{"./Interaction":5,"./defaultOptions":18,"./utils/domUtils":39,"./utils/is":46,"./utils/raf":50,"./utils/window":52}],12:[function(e,t,n){"use strict";var r=e("../Interactable"),i=e("../actions/base"),o=e("../utils/is"),s=e("../utils/domUtils");r.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},r.prototype.ignoreFrom=function(e){return this._backCompatOption("ignoreFrom",e)},r.prototype.allowFrom=function(e){return this._backCompatOption("allowFrom",e)},r.prototype.testIgnore=function(e,t,n){return!(!e||!o.element(n))&&(o.string(e)?s.matchesUpTo(n,e,t):!!o.element(e)&&s.nodeContains(e,n))},r.prototype.testAllow=function(e,t,n){return!e||!!o.element(n)&&(o.string(e)?s.matchesUpTo(n,e,t):!!o.element(e)&&s.nodeContains(e,n))},r.prototype.testIgnoreAllow=function(e,t,n){return!this.testIgnore(e.ignoreFrom,t,n)&&this.testAllow(e.allowFrom,t,n)},r.prototype.actionChecker=function(e){return o.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},r.prototype.styleCursor=function(e){return o.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},r.prototype.defaultActionChecker=function(e,t,n,r){for(var o=this.getRect(r),s=null,a=i.names,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var u=p;if((!n.pointerIsDown||!n.mouse||0!=(t.buttons&this.options[u].mouseButtons))&&(s=i[u].checker(e,t,this,r,n,o)))return s}}},{"../Interactable":4,"../actions/base":6,"../utils/domUtils":39,"../utils/is":46}],13:[function(e,t,n){"use strict";function r(e,t,n,r){return g.is.object(e)&&t.testIgnoreAllow(t.options[e.name],n,r)&&t.options[e.name].enabled&&a(t,n,e)?e:null}function i(e,t,n,i,o,s){for(var a=0,l=i.length;a=m.maxInteractions)return!1;if(u.target===e){if((a+=d===n.name|0)>=i)return!1;if(u.element===t&&(l++,d!==n.name||l>=o))return!1}}}return m.maxInteractions>0}}var l=e("../interact"),c=e("../Interactable"),p=e("../Interaction"),u=e("../actions/base"),d=e("../defaultOptions"),f=e("../utils/browser"),v=e("../scope"),g=e("../utils"),h=e("../utils/Signals").new();e("./InteractableMethods");var m={signals:h,withinInteractionLimit:a,maxInteractions:1/0,defaults:{perAction:{manualStart:!1,max:1/0,maxPerElement:1,allowFrom:null,ignoreFrom:null}},setActionDefaults:function(e){g.extend(e.defaults,m.defaults.perAction)}};p.signals.on("down",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;if(!t.interacting()){s(t,o(t,n,r,i))}}),p.signals.on("move",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;if(t.mouse&&!t.pointerIsDown&&!t.interacting()){s(t,o(t,n,r,i))}}),p.signals.on("move",function(e){var t=e.interaction,n=e.event;if(t.pointerIsDown&&!t.interacting()&&t.pointerWasMoved&&t.prepared.name){h.fire("before-start",e);var r=t.target;t.prepared.name&&r&&(r.options[t.prepared.name].manualStart||!a(r,t.element,t.prepared)?t.stop(n):t.start(t.prepared,r,t.element))}}),p.signals.on("stop",function(e){var t=e.interaction,n=t.target;n&&n.options.styleCursor&&(n._doc.documentElement.style.cursor="")}),c.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},c.prototype.actionChecker=function(e){return g.is.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},c.prototype.styleCursor=function(e){return g.is.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},c.prototype.defaultActionChecker=function(e,t,n,r){for(var i=this.getRect(r),o=t.buttons||{0:1,1:4,3:8,4:16}[t.button],s=null,a=u.names,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var d=p;if((!n.pointerIsDown||!n.mouse||0!=(o&this.options[d].mouseButtons))&&(s=u[d].checker(e,t,this,r,n,i)))return s}},l.maxInteractions=function(e){return g.is.number(e)?(m.maxInteractions=e,this):m.maxInteractions},c.settingsMethods.push("styleCursor"),c.settingsMethods.push("actionChecker"),c.settingsMethods.push("ignoreFrom"),c.settingsMethods.push("allowFrom"),d.base.actionChecker=null,d.base.styleCursor=!0,g.extend(d.perAction,m.defaults.perAction),t.exports=m},{"../Interactable":4,"../Interaction":5,"../actions/base":6,"../defaultOptions":18,"../interact":21,"../scope":34,"../utils":44,"../utils/Signals":35,"../utils/browser":37,"./InteractableMethods":12}],14:[function(e,t,n){"use strict";var r=e("./base"),i=e("../Interaction");i.signals.on("new",function(e){e.delayTimer=null}),r.signals.on("prepared",function(e){var t=e.interaction,n=t.prepared.name;if(n){var r=t.target.options[n].delay;r>0&&(t.delayTimer=setTimeout(function(){t.start(t.prepared,t.target,t.element)},r))}}),i.signals.on("move",function(e){var t=e.interaction,n=e.duplicate;t.pointerWasMoved&&!n&&clearTimeout(t.delayTimer)}),r.signals.on("before-start",function(e){var t=e.interaction,n=t.prepared.name;if(n){t.target.options[n].delay>0&&(t.prepared.name=null)}})},{"../Interaction":5,"./base":13}],15:[function(e,t,n){"use strict";function r(e,t){if(!t)return!1;var n=t.options.drag.startAxis;return"xy"===e||"xy"===n||n===e}var i=e("./base"),o=e("../scope"),s=e("../utils/browser"),a=e("../utils/is"),l=e("../utils/domUtils"),c=l.matchesSelector,p=l.parentNode;i.setActionDefaults(e("../actions/drag")),i.signals.on("before-start",function(e){var t=e.interaction,n=e.eventTarget,l=e.dx,u=e.dy;if("drag"===t.prepared.name){var d=Math.abs(l),f=Math.abs(u),v=t.target.options.drag,g=v.startAxis,h=d>f?"x":dl.minSpeed&&g>l.endSpeed,b={interaction:t,pageCoords:v,statuses:f,preEnd:!0,requireEndOnly:!0};y&&!x&&(c.resetStatuses(f),m=c.setAll(b),m.shouldMove&&m.locked&&(h=!0)),(x||h)&&(p.copyCoords(i.upCoords,t.curCoords),t.pointers[0]=i.startEvent=new a(t,n,t.prepared.name,"inertiastart",t.element),i.t0=d,i.active=!0,i.allowResume=l.allowResume,t.simulation=i,o.fire(i.startEvent),x?(i.vx0=t.pointerDelta.client.vx,i.vy0=t.pointerDelta.client.vy,i.v0=g,r(t,i),p.extend(v,t.curCoords.page),v.x+=i.xe,v.y+=i.ye,c.resetStatuses(f),m=c.setAll(b),i.modifiedXe+=m.dx,i.modifiedYe+=m.dy,i.i=u.request(t.boundInertiaFrame)):(i.smoothEnd=!0,i.xe=m.dx,i.ye=m.dy,i.sx=i.sy=0,i.i=u.request(t.boundSmoothEndFrame)))}}),l.signals.on("stop-active",function(e){var t=e.interaction,n=t.inertiaStatus;n.active&&(u.cancel(n.i),n.active=!1,t.simulation=null)})},{"./InteractEvent":3,"./Interaction":5,"./modifiers":24,"./utils":44,"./utils/raf":50}],21:[function(e,t,n){"use strict";function r(e,t){var n=a.interactables.get(e,t);return n||(n=new l(e,t),n.events.global=p),n}var i=e("./utils/browser"),o=e("./utils/events"),s=e("./utils"),a=e("./scope"),l=e("./Interactable"),c=e("./Interaction"),p={};r.isSet=function(e,t){return-1!==a.interactables.indexOfElement(e,t&&t.context)},r.on=function(e,t,n){if(s.is.string(e)&&-1!==e.search(" ")&&(e=e.trim().split(/ +/)),s.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.on(f,t,n)}return r}if(s.is.object(e)){for(var v in e)r.on(v,e[v],t);return r}return s.contains(l.eventTypes,e)?p[e]?p[e].push(t):p[e]=[t]:o.add(a.document,e,t,{options:n}),r},r.off=function(e,t,n){if(s.is.string(e)&&-1!==e.search(" ")&&(e=e.trim().split(/ +/)),s.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.off(f,t,n)}return r}if(s.is.object(e)){for(var v in e)r.off(v,e[v],t);return r}if(s.contains(l.eventTypes,e)){var g=void 0;e in p&&-1!==(g=s.indexOf(p[e],t))&&p[e].splice(g,1)}else o.remove(a.document,e,t,n);return r},r.debug=function(){return a},r.getPointerAverage=s.pointerAverage,r.getTouchBBox=s.touchBBox,r.getTouchDistance=s.touchDistance,r.getTouchAngle=s.touchAngle,r.getElementRect=s.getElementRect,r.getElementClientRect=s.getElementClientRect,r.matchesSelector=s.matchesSelector,r.closest=s.closest,r.supportsTouch=function(){return i.supportsTouch},r.supportsPointerEvent=function(){return i.supportsPointerEvent},r.stop=function(e){for(var t=a.interactions.length-1;t>=0;t--)a.interactions[t].stop(e);return r},r.pointerMoveTolerance=function(e){return s.is.number(e)?(c.pointerMoveTolerance=e,this):c.pointerMoveTolerance},r.addDocument=a.addDocument,r.removeDocument=a.removeDocument,a.interact=r,t.exports=r},{"./Interactable":4,"./Interaction":5,"./scope":34,"./utils":44,"./utils/browser":37,"./utils/events":40}],22:[function(e,t,n){"use strict";function r(e){var t=e.interaction,n=e.event;t.target&&t.target.checkAndPreventDefault(n)}var i=e("./Interactable"),o=e("./Interaction"),s=e("./scope"),a=e("./utils/is"),l=e("./utils/events"),c=e("./utils/domUtils"),p=c.nodeContains,u=c.matchesSelector;i.prototype.preventDefault=function(e){return/^(always|never|auto)$/.test(e)?(this.options.preventDefault=e,this):a.bool(e)?(this.options.preventDefault=e?"always":"never",this):this.options.preventDefault},i.prototype.checkAndPreventDefault=function(e){var t=this.options.preventDefault;if("never"!==t)return"always"===t?void e.preventDefault():void(l.supportsOptions||/^(mouse|pointer|touch)*(down|start)/i.test(e.type)||a.element(e.target)&&u(e.target,"input,select,textarea,[contenteditable=true],[contenteditable=true] *")||e.preventDefault())};for(var d=["down","move","up","cancel"],f=0;f=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i;if(o.element&&(o.element===e.target||p(o.element,e.target)))return void o.target.checkAndPreventDefault(e)}}},{"./Interactable":4,"./Interaction":5,"./scope":34,"./utils/domUtils":39,"./utils/events":40,"./utils/is":46}],23:[function(e,t,n){"use strict";function r(e){var t=e.target,n=a.search(e,e.type,t);n&&n.prevTap&&e.clientX===n.prevTap.clientX&&e.clientY===n.prevTap.clientY&&t===n.prevTap.target&&(n.downTargets[0]=t,n.downTimes[0]=(new Date).getTime(),l.fire({interaction:n,event:e,eventTarget:t,pointer:e,type:"tap"}))}var i=e("./scope"),o=e("./utils/events"),s=e("./utils/browser"),a=e("./utils/interactionFinder"),l=e("./pointerEvents/base"),c=e("./utils/window"),p=c.window,u=Object.prototype.toString;if(p.Array.isArray||(p.Array.isArray=function(e){return"[object Array]"===u.call(e)}),String.prototype.trim||(String.prototype.trim=function(){return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")}),s.isIE8){var d=function(e){for(var t=i.interactions,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var o;if(n){if(r>=t.length)break;o=t[r++]}else{if(r=t.next(),r.done)break;o=r.value}var s=o;s.interacting()&&s.target.checkAndPreventDefault(e)}},f=function(e,t){var n=e.doc,i=(e.win,0===t.indexOf("listen")?o.add:o.remove);i(n,"selectstart",d),l&&i(n,"dblclick",r)};i.signals.on("add-document",f),i.signals.on("remove-document",f)}t.exports=null},{"./pointerEvents/base":31,"./scope":34,"./utils/browser":37,"./utils/events":40,"./utils/interactionFinder":45,"./utils/window":52}],24:[function(e,t,n){"use strict";function r(e,t,n){return e&&e.enabled&&(t||!e.endOnly)&&(!n||e.endOnly)}var i=e("../InteractEvent"),o=e("../Interaction"),s=e("../utils/extend"),a={names:[],setOffsets:function(e){var t=e.interaction,n=e.pageCoords,r=t.target,i=t.element,o=t.startOffset,s=r.getRect(i);s?(o.left=n.x-s.left,o.top=n.y-s.top,o.right=s.right-n.x,o.bottom=s.bottom-n.y,"width"in s||(s.width=s.right-s.left),"height"in s||(s.height=s.bottom-s.top)):o.left=o.top=o.right=o.bottom=0,e.rect=s,e.interactable=r,e.element=i;for(var l=0;l=p.length)break;f=p[d++]}else{if(d=p.next(),d.done)break;f=d.value}var v=f,g=a[v],h=t.target.options[t.prepared.name][v];r(h,i,o)&&(e.status=e.status=n[v],e.options=h,e.offset=e.interaction.modifierOffsets[v],g.set(e),e.status.locked&&(l.x+=e.status.dx,l.y+=e.status.dy,c.dx+=e.status.dx,c.dy+=e.status.dy,c.locked=!0))}return c.shouldMove=!e.status||!c.locked||e.status.changed,c},resetStatuses:function(e){for(var t=a.names,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var i;if(n){if(r>=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i,s=e[o]||{};s.dx=s.dy=0,s.modifiedX=s.modifiedY=NaN,s.locked=!1,s.changed=!0,e[o]=s}return e},start:function(e,t){var n=e.interaction,r={interaction:n,pageCoords:("action-resume"===t?n.curCoords:n.startCoords).page,startOffset:n.startOffset,statuses:n.modifierStatuses,preEnd:!1,requireEndOnly:!1};a.setOffsets(r),a.resetStatuses(r.statuses),r.pageCoords=s({},n.startCoords.page),n.modifierResult=a.setAll(r)}};o.signals.on("new",function(e){e.startOffset={left:0,right:0,top:0,bottom:0},e.modifierOffsets={},e.modifierStatuses=a.resetStatuses({}),e.modifierResult=null}),o.signals.on("action-start",a.start),o.signals.on("action-resume",a.start),o.signals.on("before-action-move",function(e){var t=e.interaction,n=e.preEnd,r=e.interactingBeforeMove,i=a.setAll({interaction:t,preEnd:n,pageCoords:t.curCoords.page,statuses:t.modifierStatuses,requireEndOnly:!1});!i.shouldMove&&r&&(t._dontFireMove=!0),t.modifierResult=i}),o.signals.on("action-end",function(e){for(var t=e.interaction,n=e.event,i=0;i=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}var m=h,y=m.x,x=m.y;l.push({x:s.left-i.width*y+u.x,y:s.top-i.height*x+u.y})}else l.push(u);return l},set:function(e){var t=e.interaction,n=e.pageCoords,r=e.status,i=e.options,s=e.offset,a=[],l=void 0,c=void 0,p=void 0;if(r.useStatusXY)c={x:r.x,y:r.y};else{var u=o.getOriginXY(t.target,t.element,t.prepared.name);c=o.extend({},n),c.x-=u.x,c.y-=u.y}r.realX=c.x,r.realY=c.y;for(var d=i.targets?i.targets.length:0,f=s,v=Array.isArray(f),g=0,f=v?f:f[Symbol.iterator]();;){var h;if(v){if(g>=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}for(var m=h,y=m.x,x=m.y,b=c.x-y,w=c.y-x,E=i.targets,S=Array.isArray(E),T=0,E=S?E:E[Symbol.iterator]();;){var C;if(S){if(T>=E.length)break;C=E[T++]}else{if(T=E.next(),T.done)break;C=T.value}var A=C;l=o.is.function(A)?A(b,w,t):A,l&&a.push({x:o.is.number(l.x)?l.x+y:b,y:o.is.number(l.y)?l.y+x:w,range:o.is.number(l.range)?l.range:i.range})}}var D={target:null,inRange:!1,distance:0,range:0,dx:0,dy:0};for(p=0,d=a.length;p=p.length)break;f=p[d++]}else{if(d=p.next(),d.done)break;f=d.value}var v=f,g=void 0;g=a.is.function(v)?v(l,c,t):v,g&&("width"in g&&"height"in g&&(g.x=g.width, +g.y=g.height),e.options.targets.push(g))}i.set(e)},modifyCoords:function(e){var t=e.options;e.options=a.extend({},t),e.options.enabled=t.enabled,e.options.relativePoints=[null],i.modifyCoords(e)}};r.snapSize=l,r.names.push("snapSize"),o.perAction.snapSize=l.defaults,s.defaults.snapSize=l.defaults,t.exports=l},{"../actions/resize":10,"../defaultOptions":18,"../utils/":44,"./index":24,"./snap":28}],30:[function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=e("../utils/pointerUtils");t.exports=function(){function e(t,n,o,s,a){if(r(this,e),i.pointerExtend(this,o),o!==n&&i.pointerExtend(this,n),this.interaction=a,this.timeStamp=(new Date).getTime(),this.originalEvent=o,this.type=t,this.pointerId=i.getPointerId(n),this.pointerType=i.getPointerType(n),this.target=s,this.currentTarget=null,"tap"===t){var l=a.getPointerIndex(n);this.dt=this.timeStamp-a.downTimes[l];var c=this.timeStamp-a.tapTime;this.double=!!(a.prevTap&&"doubletap"!==a.prevTap.type&&a.prevTap.target===this.target&&c<500)}else"doubletap"===t&&(this.dt=n.timeStamp-a.tapTime)}return e.prototype.subtractOrigin=function(e){var t=e.x,n=e.y;return this.pageX-=t,this.pageY-=n,this.clientX-=t,this.clientY-=n,this},e.prototype.addOrigin=function(e){var t=e.x,n=e.y;return this.pageX+=t,this.pageY+=n,this.clientX+=t,this.clientY+=n,this},e.prototype.preventDefault=function(){this.originalEvent.preventDefault()},e.prototype.stopPropagation=function(){this.propagationStopped=!0},e.prototype.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},e}()},{"../utils/pointerUtils":49}],31:[function(e,t,n){"use strict";function r(e){for(var t=e.interaction,n=e.pointer,s=e.event,l=e.eventTarget,c=e.type,u=void 0===c?e.pointerEvent.type:c,d=e.targets,f=void 0===d?i(e):d,v=e.pointerEvent,g=void 0===v?new o(u,n,s,l,t):v,h={interaction:t,pointer:n,event:s,eventTarget:l,targets:f,type:u,pointerEvent:g},m=0;m=u.length)break;g=u[v++]}else{if(v=u.next(),v.done)break;g=v.value}var h=g;c.element=h,p.fire("collect-targets",c)}return"hold"===o&&(c.targets=d(c.targets,function(e){return e.eventable.options.holdDuration===t.holdTimers[s].duration})),c.targets}var o=e("./PointerEvent"),s=e("../Interaction"),a=e("../utils"),l=e("../utils/browser"),c=e("../defaultOptions"),p=e("../utils/Signals").new(),u=e("../utils/arr"),d=u.filter,f=["down","up","cancel"],v=["down","up","cancel"],g={PointerEvent:o,fire:r,collectEventTargets:i,signals:p,defaults:{holdDuration:600,ignoreFrom:null,allowFrom:null,origin:{x:0,y:0}},types:["down","move","up","cancel","tap","doubletap","hold"]};s.signals.on("update-pointer-down",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers[n]={duration:1/0,timeout:null}}),s.signals.on("remove-pointer",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers.splice(n,1)}),s.signals.on("move",function(e){var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,s=e.duplicateMove,a=t.getPointerIndex(n);s||t.pointerIsDown&&!t.pointerWasMoved||(t.pointerIsDown&&clearTimeout(t.holdTimers[a].timeout),r({interaction:t,pointer:n,event:i,eventTarget:o,type:"move"}))}),s.signals.on("down",function(e){for(var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,s=e.pointerIndex,c=l.isIE8?a.extend({},i):i,u=t.holdTimers[s],d=a.getPath(o),f={interaction:t,pointer:n,event:i,eventTarget:o,type:"hold",targets:[],path:d,element:null},v=d,g=Array.isArray(v),h=0,v=g?v:v[Symbol.iterator]();;){var m;if(g){if(h>=v.length)break;m=v[h++]}else{if(h=v.next(),h.done)break;m=h.value}var y=m;f.element=y,p.fire("collect-targets",f)}if(f.targets.length){for(var x=1/0,b=0;b=0&&(p.selectors[u]!==e||p.contexts[u]!==t);u--);-1===u&&(u=p.selectors.length,p.selectors.push(e),p.contexts.push(t),p.listeners.push([])),p.listeners[u].push([i,!!s.capture,s.passive])}function s(e,t,n,r,o){var s=f(o),c=O[n],p=!1,u=void 0;if(c)for(u=c.selectors.length-1;u>=0;u--)if(c.selectors[u]===e&&c.contexts[u]===t){for(var d=c.listeners[u],v=d.length-1;v>=0;v--){var g=d[v],h=g[0],m=g[1],y=g[2];if(h===r&&m===!!s.capture&&y===s.passive){d.splice(v,1),d.length||(c.selectors.splice(u,1),c.contexts.splice(u,1),c.listeners.splice(u,1),i(t,n,a),i(t,n,l,!0),c.selectors.length||(O[n]=null)),p=!0;break}}if(p)break}}function a(e,t){var n=f(t),r={},i=O[e.type],o=g.getActualElement(e.path?e.path[0]:e.target),s=o;for(h(r,e),r.originalEvent=e,r.preventDefault=p;v.element(s);){for(var a=0;a=l.length)break;u=l[p++]}else{if(p=l.next(),p.done)break;u=p.value}var d=u,f=o[d](a);if(f)return f}},simulationResume:function(e){var t=e.pointerType,n=e.eventType,o=e.eventTarget;if(!/down|start/i.test(n))return null;for(var s=r.interactions,a=Array.isArray(s),l=0,s=a?s:s[Symbol.iterator]();;){var c;if(a){if(l>=s.length)break;c=s[l++]}else{if(l=s.next(),l.done)break;c=l.value}var p=c,u=o;if(p.simulation&&p.simulation.allowResume&&p.pointerType===t)for(;u;){if(u===p.element)return p;u=i.parentNode(u)}}return null},mouseOrPen:function(e){var t=e.pointerId,n=e.pointerType,o=e.eventType;if("mouse"!==n&&"pen"!==n)return null;for(var s=void 0,a=r.interactions,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var u=p;if(u.pointerType===n){if(u.simulation&&!i.contains(u.pointerIds,t))continue;if(u.interacting())return u;s||(s=u)}}if(s)return s;for(var d=r.interactions,f=Array.isArray(d),v=0,d=f?d:d[Symbol.iterator]();;){var g;if(f){if(v>=d.length)break;g=d[v++]}else{if(v=d.next(),v.done)break;g=v.value}var h=g;if(!(h.pointerType!==n||/down/i.test(o)&&h.simulation))return h}return null},hasPointer:function(e){for(var t=e.pointerId,n=r.interactions,o=Array.isArray(n),s=0,n=o?n:n[Symbol.iterator]();;){var a;if(o){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var l=a;if(i.contains(l.pointerIds,t))return l}},idle:function(e){for(var t=e.pointerType,n=r.interactions,i=Array.isArray(n),o=0,n=i?n:n[Symbol.iterator]();;){var s;if(i){if(o>=n.length)break;s=n[o++]}else{if(o=n.next(),o.done)break;s=o.value}var a=s;if(1===a.pointerIds.length){var l=a.target;if(l&&!l.options.gesture.enabled)continue}else if(a.pointerIds.length>=2)continue;if(!a.interacting()&&t===a.pointerType)return a}return null}};t.exports=o},{"../scope":34,"./index":44}],46:[function(e,t,n){"use strict";var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},i=e("./window"),o=e("./isWindow"),s={array:function(){},window:function(e){return e===i.window||o(e)},docFrag:function(e){return s.object(e)&&11===e.nodeType},object:function(e){return!!e&&"object"===(void 0===e?"undefined":r(e))},function:function(e){return"function"==typeof e},number:function(e){return"number"==typeof e},bool:function(e){return"boolean"==typeof e},string:function(e){return"string"==typeof e},element:function(e){if(!e||"object"!==(void 0===e?"undefined":r(e)))return!1;var t=i.getWindow(e)||i.window;return/object|function/.test(r(t.Element))?e instanceof t.Element:1===e.nodeType&&"string"==typeof e.nodeName}};s.array=function(e){return s.object(e)&&void 0!==e.length&&s.function(e.splice)},t.exports=s},{"./isWindow":47,"./window":52}],47:[function(e,t,n){"use strict";t.exports=function(e){return!(!e||!e.Window)&&e instanceof e.Window}},{}],48:[function(e,t,n){"use strict";function r(e,n){for(var r in n){var i=t.exports.prefixedPropREs,o=!1;for(var s in i)if(0===r.indexOf(s)&&i[s].test(r)){o=!0;break}o||"function"==typeof n[r]||(e[r]=n[r])}return e}r.prefixedPropREs={webkit:/(Movement[XY]|Radius[XY]|RotationAngle|Force)$/},t.exports=r},{}],49:[function(e,t,n){"use strict";var r=e("./hypot"),i=e("./browser"),o=e("./domObjects"),s=e("./domUtils"),a=e("./domObjects"),l=e("./is"),c=e("./pointerExtend"),p={copyCoords:function(e,t){e.page=e.page||{},e.page.x=t.page.x,e.page.y=t.page.y,e.client=e.client||{},e.client.x=t.client.x,e.client.y=t.client.y,e.timeStamp=t.timeStamp},setCoordDeltas:function(e,t,n){e.page.x=n.page.x-t.page.x,e.page.y=n.page.y-t.page.y,e.client.x=n.client.x-t.client.x,e.client.y=n.client.y-t.client.y,e.timeStamp=n.timeStamp-t.timeStamp;var i=Math.max(e.timeStamp/1e3,.001);e.page.speed=r(e.page.x,e.page.y)/i,e.page.vx=e.page.x/i,e.page.vy=e.page.y/i,e.client.speed=r(e.client.x,e.page.y)/i,e.client.vx=e.client.x/i,e.client.vy=e.client.y/i},isNativePointer:function(e){return e instanceof o.Event||e instanceof o.Touch},getXY:function(e,t,n){return n=n||{},e=e||"page",n.x=t[e+"X"],n.y=t[e+"Y"],n},getPageXY:function(e,t){return t=t||{},i.isOperaMobile&&p.isNativePointer(e)?(p.getXY("screen",e,t),t.x+=window.scrollX,t.y+=window.scrollY):p.getXY("page",e,t),t},getClientXY:function(e,t){return t=t||{},i.isOperaMobile&&p.isNativePointer(e)?p.getXY("screen",e,t):p.getXY("client",e,t),t},getPointerId:function(e){return l.number(e.pointerId)?e.pointerId:e.identifier},setCoords:function(e,t,n){var r=t.length>1?p.pointerAverage(t):t[0],i={};p.getPageXY(r,i),e.page.x=i.x,e.page.y=i.y,p.getClientXY(r,i),e.client.x=i.x,e.client.y=i.y,e.timeStamp=l.number(n)?n:(new Date).getTime()},pointerExtend:c,getTouchPair:function(e){var t=[];return l.array(e)?(t[0]=e[0],t[1]=e[1]):"touchend"===e.type?1===e.touches.length?(t[0]=e.touches[0],t[1]=e.changedTouches[0]):0===e.touches.length&&(t[0]=e.changedTouches[0],t[1]=e.changedTouches[1]):(t[0]=e.touches[0],t[1]=e.touches[1]),t},pointerAverage:function(e){for(var t={pageX:0,pageY:0,clientX:0,clientY:0,screenX:0,screenY:0},n=e,r=Array.isArray(n),i=0,n=r?n:n[Symbol.iterator]();;){var o;if(r){if(i>=n.length)break;o=n[i++]}else{if(i=n.next(),i.done)break;o=i.value}var s=o;for(var a in t)t[a]+=s[a]}for(var l in t)t[l]/=e.length;return t},touchBBox:function(e){if(e.length||e.touches&&e.touches.length>1){var t=p.getTouchPair(e),n=Math.min(t[0].pageX,t[1].pageX),r=Math.min(t[0].pageY,t[1].pageY);return{x:n,y:r,left:n,top:r,width:Math.max(t[0].pageX,t[1].pageX)-n,height:Math.max(t[0].pageY,t[1].pageY)-r}}},touchDistance:function(e,t){var n=t+"X",i=t+"Y",o=p.getTouchPair(e),s=o[0][n]-o[1][n],a=o[0][i]-o[1][i];return r(s,a)},touchAngle:function(e,t,n){var r=n+"X",i=n+"Y",o=p.getTouchPair(e),s=o[1][r]-o[0][r],a=o[1][i]-o[0][i];return 180*Math.atan2(a,s)/Math.PI},getPointerType:function(e){return l.string(e.pointerType)?e.pointerType:l.number(e.pointerType)?[void 0,void 0,"touch","pen","mouse"][e.pointerType]:/touch/.test(e.type)||e instanceof a.Touch?"touch":"mouse"},getEventTargets:function(e){return[s.getActualElement(e.path?e.path[0]:e.target),s.getActualElement(e.currentTarget)]}};t.exports=p},{"./browser":37,"./domObjects":38,"./domUtils":39,"./hypot":43,"./is":46,"./pointerExtend":48}],50:[function(e,t,n){"use strict";for(var r=e("./window"),i=r.window,o=["ms","moz","webkit","o"],s=0,a=void 0,l=void 0,c=0;c\n * Open source under the MIT License.\n * https://raw.github.com/taye/interact.js/master/LICENSE\n */\n","/*\n * In a (windowless) server environment this file exports a factory function\n * that takes the window to use.\n *\n * var interact = require('interact.js')(windowObject);\n *\n * See https://github.com/taye/interact.js/issues/187\n */\nif (typeof window === 'undefined') {\n module.exports = function (window) {\n require('./src/utils/window').init(window);\n\n return require('./src/index');\n };\n}\nelse {\n module.exports = require('./src/index');\n}\n","const { indexOf } = require('./utils/arr');\nconst extend = require('./utils/extend.js');\n\nfunction fireUntilImmediateStopped (event, listeners) {\n for (let i = 0, len = listeners.length; i < len && !event.immediatePropagationStopped; i++) {\n listeners[i](event);\n }\n}\n\nclass Eventable {\n\n constructor (options) {\n this.options = extend({}, options || {});\n }\n\n fire (event) {\n let listeners;\n const onEvent = 'on' + event.type;\n const global = this.global;\n\n // Interactable#on() listeners\n if ((listeners = this[event.type])) {\n fireUntilImmediateStopped(event, listeners);\n }\n\n // interactable.onevent listener\n if (this[onEvent]) {\n this[onEvent](event);\n }\n\n // interact.on() listeners\n if (!event.propagationStopped && global && (listeners = global[event.type])) {\n fireUntilImmediateStopped(event, listeners);\n }\n }\n\n on (eventType, listener) {\n // if this type of event was never bound\n if (this[eventType]) {\n this[eventType].push(listener);\n }\n else {\n this[eventType] = [listener];\n }\n }\n\n off (eventType, listener) {\n // if it is an action event type\n const eventList = this[eventType];\n const index = eventList? indexOf(eventList, listener) : -1;\n\n if (index !== -1) {\n eventList.splice(index, 1);\n }\n\n if (eventList && eventList.length === 0 || !listener) {\n this[eventType] = listener;\n }\n }\n}\n\nmodule.exports = Eventable;\n","const extend = require('./utils/extend');\nconst getOriginXY = require('./utils/getOriginXY');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nclass InteractEvent {\n constructor (interaction, event, action, phase, element, related, preEnd = false) {\n const target = interaction.target;\n const deltaSource = (target && target.options || defaults).deltaSource;\n const origin = getOriginXY(target, element, action);\n const starting = phase === 'start';\n const ending = phase === 'end';\n const coords = starting? interaction.startCoords : interaction.curCoords;\n const prevEvent = interaction.prevEvent;\n\n element = element || interaction.element;\n\n const page = extend({}, coords.page);\n const client = extend({}, coords.client);\n\n page.x -= origin.x;\n page.y -= origin.y;\n\n client.x -= origin.x;\n client.y -= origin.y;\n\n this.ctrlKey = event.ctrlKey;\n this.altKey = event.altKey;\n this.shiftKey = event.shiftKey;\n this.metaKey = event.metaKey;\n this.button = event.button;\n this.buttons = event.buttons;\n this.target = element;\n this.currentTarget = element;\n this.relatedTarget = related || null;\n this.preEnd = preEnd;\n this.type = action + (phase || '');\n this.interaction = interaction;\n this.interactable = target;\n\n this.t0 = starting ? interaction.downTimes[interaction.downTimes.length - 1]\n : prevEvent.t0;\n\n const signalArg = {\n interaction,\n event,\n action,\n phase,\n element,\n related,\n page,\n client,\n coords,\n starting,\n ending,\n deltaSource,\n iEvent: this,\n };\n\n signals.fire('set-xy', signalArg);\n\n if (ending) {\n // use previous coords when ending\n this.pageX = prevEvent.pageX;\n this.pageY = prevEvent.pageY;\n this.clientX = prevEvent.clientX;\n this.clientY = prevEvent.clientY;\n }\n else {\n this.pageX = page.x;\n this.pageY = page.y;\n this.clientX = client.x;\n this.clientY = client.y;\n }\n\n this.x0 = interaction.startCoords.page.x - origin.x;\n this.y0 = interaction.startCoords.page.y - origin.y;\n this.clientX0 = interaction.startCoords.client.x - origin.x;\n this.clientY0 = interaction.startCoords.client.y - origin.y;\n\n signals.fire('set-delta', signalArg);\n\n this.timeStamp = coords.timeStamp;\n this.dt = interaction.pointerDelta.timeStamp;\n this.duration = this.timeStamp - this.t0;\n\n // speed and velocity in pixels per second\n this.speed = interaction.pointerDelta[deltaSource].speed;\n this.velocityX = interaction.pointerDelta[deltaSource].vx;\n this.velocityY = interaction.pointerDelta[deltaSource].vy;\n\n this.swipe = (ending || phase === 'inertiastart')? this.getSwipe() : null;\n\n signals.fire('new', signalArg);\n }\n\n getSwipe () {\n const interaction = this.interaction;\n\n if (interaction.prevEvent.speed < 600\n || this.timeStamp - interaction.prevEvent.timeStamp > 150) {\n return null;\n }\n\n let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI;\n const overlap = 22.5;\n\n if (angle < 0) {\n angle += 360;\n }\n\n const left = 135 - overlap <= angle && angle < 225 + overlap;\n const up = 225 - overlap <= angle && angle < 315 + overlap;\n\n const right = !left && (315 - overlap <= angle || angle < 45 + overlap);\n const down = !up && 45 - overlap <= angle && angle < 135 + overlap;\n\n return {\n up,\n down,\n left,\n right,\n angle,\n speed: interaction.prevEvent.speed,\n velocity: {\n x: interaction.prevEvent.velocityX,\n y: interaction.prevEvent.velocityY,\n },\n };\n }\n\n preventDefault () {}\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n}\n\nsignals.on('set-delta', function ({ iEvent, interaction, starting, deltaSource }) {\n const prevEvent = starting? iEvent : interaction.prevEvent;\n\n if (deltaSource === 'client') {\n iEvent.dx = iEvent.clientX - prevEvent.clientX;\n iEvent.dy = iEvent.clientY - prevEvent.clientY;\n }\n else {\n iEvent.dx = iEvent.pageX - prevEvent.pageX;\n iEvent.dy = iEvent.pageY - prevEvent.pageY;\n }\n});\n\nInteractEvent.signals = signals;\n\nmodule.exports = InteractEvent;\n","const is = require('./utils/is');\nconst events = require('./utils/events');\nconst extend = require('./utils/extend');\nconst actions = require('./actions/base');\nconst scope = require('./scope');\nconst Eventable = require('./Eventable');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nconst {\n getElementRect,\n nodeContains,\n trySelector,\n} = require('./utils/domUtils');\nconst { getWindow } = require('./utils/window');\nconst { indexOf, contains } = require('./utils/arr');\nconst { wheelEvent } = require('./utils/browser');\n\n// all set interactables\nscope.interactables = [];\n\n/*\\\n * Interactable\n [ property ]\n **\n * Object type returned by @interact\n\\*/\nclass Interactable {\n constructor (target, options) {\n options = options || {};\n\n this.target = target;\n this.events = new Eventable();\n this._context = options.context || scope.document;\n this._win = getWindow(trySelector(target)? this._context : target);\n this._doc = this._win.document;\n\n signals.fire('new', {\n target,\n options,\n interactable: this,\n win: this._win,\n });\n\n scope.addDocument( this._doc, this._win );\n\n scope.interactables.push(this);\n\n this.set(options);\n }\n\n setOnEvents (action, phases) {\n const onAction = 'on' + action;\n\n if (is.function(phases.onstart) ) { this.events[onAction + 'start' ] = phases.onstart ; }\n if (is.function(phases.onmove) ) { this.events[onAction + 'move' ] = phases.onmove ; }\n if (is.function(phases.onend) ) { this.events[onAction + 'end' ] = phases.onend ; }\n if (is.function(phases.oninertiastart)) { this.events[onAction + 'inertiastart' ] = phases.oninertiastart ; }\n\n return this;\n }\n\n setPerAction (action, options) {\n // for all the default per-action options\n for (const option in options) {\n // if this option exists for this action\n if (option in defaults[action]) {\n // if the option in the options arg is an object value\n if (is.object(options[option])) {\n // duplicate the object\n this.options[action][option] = extend(this.options[action][option] || {}, options[option]);\n\n if (is.object(defaults.perAction[option]) && 'enabled' in defaults.perAction[option]) {\n this.options[action][option].enabled = options[option].enabled === false? false : true;\n }\n }\n else if (is.bool(options[option]) && is.object(defaults.perAction[option])) {\n this.options[action][option].enabled = options[option];\n }\n else if (options[option] !== undefined) {\n // or if it's not undefined, do a plain assignment\n this.options[action][option] = options[option];\n }\n }\n }\n }\n\n /*\\\n * Interactable.getRect\n [ method ]\n *\n * The default function to get an Interactables bounding rect. Can be\n * overridden using @Interactable.rectChecker.\n *\n - element (Element) #optional The element to measure.\n = (object) The object's bounding rectangle.\n o {\n o top : 0,\n o left : 0,\n o bottom: 0,\n o right : 0,\n o width : 0,\n o height: 0\n o }\n \\*/\n getRect (element) {\n element = element || this.target;\n\n if (is.string(this.target) && !(is.element(element))) {\n element = this._context.querySelector(this.target);\n }\n\n return getElementRect(element);\n }\n\n /*\\\n * Interactable.rectChecker\n [ method ]\n *\n * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n - checker (function) #optional A function which returns this Interactable's bounding rectangle. See @Interactable.getRect\n = (function | object) The checker function or this Interactable\n \\*/\n rectChecker (checker) {\n if (is.function(checker)) {\n this.getRect = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.getRect;\n\n return this;\n }\n\n return this.getRect;\n }\n\n _backCompatOption (optionName, newValue) {\n if (trySelector(newValue) || is.object(newValue)) {\n this.options[optionName] = newValue;\n\n for (const action of actions.names) {\n this.options[action][optionName] = newValue;\n }\n\n return this;\n }\n\n return this.options[optionName];\n }\n\n /*\\\n * Interactable.origin\n [ method ]\n *\n * Gets or sets the origin of the Interactable's element. The x and y\n * of the origin will be subtracted from action event coordinates.\n *\n - origin (object | string) #optional An object eg. { x: 0, y: 0 } or string 'parent', 'self' or any CSS selector\n * OR\n - origin (Element) #optional An HTML or SVG Element whose rect will be used\n **\n = (object) The current origin or this Interactable\n \\*/\n origin (newValue) {\n return this._backCompatOption('origin', newValue);\n }\n\n /*\\\n * Interactable.deltaSource\n [ method ]\n *\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n - newValue (string) #optional Use 'client' if you will be scrolling while interacting; Use 'page' if you want autoScroll to work\n = (string | object) The current deltaSource or this Interactable\n \\*/\n deltaSource (newValue) {\n if (newValue === 'page' || newValue === 'client') {\n this.options.deltaSource = newValue;\n\n return this;\n }\n\n return this.options.deltaSource;\n }\n\n /*\\\n * Interactable.context\n [ method ]\n *\n * Gets the selector context Node of the Interactable. The default is `window.document`.\n *\n = (Node) The context Node of this Interactable\n **\n \\*/\n context () {\n return this._context;\n }\n\n inContext (element) {\n return (this._context === element.ownerDocument\n || nodeContains(this._context, element));\n }\n\n /*\\\n * Interactable.fire\n [ method ]\n *\n * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n - iEvent (InteractEvent) The InteractEvent object to be fired on this Interactable\n = (Interactable) this Interactable\n \\*/\n fire (iEvent) {\n this.events.fire(iEvent);\n\n return this;\n }\n\n _onOffMultiple (method, eventType, listener, options) {\n if (is.string(eventType) && eventType.search(' ') !== -1) {\n eventType = eventType.trim().split(/ +/);\n }\n\n if (is.array(eventType)) {\n for (let i = 0; i < eventType.length; i++) {\n this[method](eventType[i], listener, options);\n }\n\n return true;\n }\n\n if (is.object(eventType)) {\n for (const prop in eventType) {\n this[method](prop, eventType[prop], listener);\n }\n\n return true;\n }\n }\n\n /*\\\n * Interactable.on\n [ method ]\n *\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n - eventType (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) This Interactable\n \\*/\n on (eventType, listener, options) {\n if (this._onOffMultiple('on', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.on(eventType, listener);\n }\n // delegated event for selector\n else if (is.string(this.target)) {\n events.addDelegate(this.target, this._context, eventType, listener, options);\n }\n else {\n events.add(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.off\n [ method ]\n *\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n - eventType (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) This Interactable\n \\*/\n off (eventType, listener, options) {\n if (this._onOffMultiple('off', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n // if it is an action event type\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.off(eventType, listener);\n }\n // delegated event\n else if (is.string(this.target)) {\n events.removeDelegate(this.target, this._context, eventType, listener, options);\n }\n // remove listener from this Interatable's element\n else {\n events.remove(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.set\n [ method ]\n *\n * Reset the options of this Interactable\n - options (object) The new settings to apply\n = (object) This Interactable\n \\*/\n set (options) {\n if (!is.object(options)) {\n options = {};\n }\n\n this.options = extend({}, defaults.base);\n\n const perActions = extend({}, defaults.perAction);\n\n for (const actionName in actions.methodDict) {\n const methodName = actions.methodDict[actionName];\n\n this.options[actionName] = extend({}, defaults[actionName]);\n\n this.setPerAction(actionName, perActions);\n\n this[methodName](options[actionName]);\n }\n\n for (const setting of Interactable.settingsMethods) {\n this.options[setting] = defaults.base[setting];\n\n if (setting in options) {\n this[setting](options[setting]);\n }\n }\n\n signals.fire('set', {\n options,\n interactable: this,\n });\n\n return this;\n }\n\n /*\\\n * Interactable.unset\n [ method ]\n *\n * Remove this interactable from the list of interactables and remove\n * it's action capabilities and event listeners\n *\n = (object) @interact\n \\*/\n unset () {\n events.remove(this.target, 'all');\n\n if (is.string(this.target)) {\n // remove delegated events\n for (const type in events.delegatedEvents) {\n const delegated = events.delegatedEvents[type];\n\n if (delegated.selectors[0] === this.target\n && delegated.contexts[0] === this._context) {\n\n delegated.selectors.splice(0, 1);\n delegated.contexts .splice(0, 1);\n delegated.listeners.splice(0, 1);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegated[type] = null;\n }\n }\n\n events.remove(this._context, type, events.delegateListener);\n events.remove(this._context, type, events.delegateUseCapture, true);\n }\n }\n else {\n events.remove(this, 'all');\n }\n\n signals.fire('unset', { interactable: this });\n\n scope.interactables.splice(indexOf(scope.interactables, this), 1);\n\n // Stop related interactions when an Interactable is unset\n for (const interaction of scope.interactions || []) {\n if (interaction.target === this && interaction.interacting()) {\n interaction.stop();\n }\n }\n\n return scope.interact;\n }\n}\n\nscope.interactables.indexOfElement = function indexOfElement (target, context) {\n context = context || scope.document;\n\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n if (interactable.target === target && interactable._context === context) {\n return i;\n }\n }\n return -1;\n};\n\nscope.interactables.get = function interactableGet (element, options, dontCheckInContext) {\n const ret = this[this.indexOfElement(element, options && options.context)];\n\n return ret && (is.string(element) || dontCheckInContext || ret.inContext(element))? ret : null;\n};\n\nscope.interactables.forEachSelector = function (callback, element) {\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n // skip non CSS selector targets and out of context elements\n if (!is.string(interactable.target)\n || (element && !interactable.inContext(element))) {\n continue;\n }\n\n const ret = callback(interactable, interactable.target, interactable._context, i, this);\n\n if (ret !== undefined) {\n return ret;\n }\n }\n};\n\n// all interact.js eventTypes\nInteractable.eventTypes = scope.eventTypes = [];\n\nInteractable.signals = signals;\n\nInteractable.settingsMethods = [ 'deltaSource', 'origin', 'preventDefault', 'rectChecker' ];\n\nmodule.exports = Interactable;\n","const scope = require('./scope');\nconst utils = require('./utils');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst finder = require('./utils/interactionFinder');\nconst signals = require('./utils/Signals').new();\n\nconst listeners = {};\nconst methodNames = [\n 'pointerDown', 'pointerMove', 'pointerUp',\n 'updatePointer', 'removePointer',\n];\n\n// for ignoring browser's simulated mouse events\nlet prevTouchTime = 0;\n\n// all active and idle interactions\nscope.interactions = [];\n\nclass Interaction {\n constructor () {\n this.target = null; // current interactable being interacted with\n this.element = null; // the target element of the interactable\n\n this.prepared = { // action that's ready to be fired on next move event\n name : null,\n axis : null,\n edges: null,\n };\n\n // keep track of added pointers\n this.pointers = [];\n this.pointerIds = [];\n this.downTargets = [];\n this.downTimes = [];\n\n // Previous native pointer move event coordinates\n this.prevCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n // current native pointer move event coordinates\n this.curCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Starting InteractEvent pointer coordinates\n this.startCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Change in coordinates and time of the pointer\n this.pointerDelta = {\n page : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n client : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n timeStamp: 0,\n };\n\n this.downEvent = null; // pointerdown/mousedown/touchstart event\n this.downPointer = {};\n\n this._eventTarget = null;\n this._curEventTarget = null;\n\n this.prevEvent = null; // previous action event\n\n this.pointerIsDown = false;\n this.pointerWasMoved = false;\n this._interacting = false;\n\n this.mouse = false;\n\n signals.fire('new', this);\n\n scope.interactions.push(this);\n }\n\n pointerDown (pointer, event, eventTarget) {\n const pointerIndex = this.updatePointer(pointer, event, true);\n\n signals.fire('down', {\n pointer,\n event,\n eventTarget,\n pointerIndex,\n interaction: this,\n });\n }\n\n /*\\\n * Interaction.start\n [ method ]\n *\n * Start an action with the given Interactable and Element as tartgets. The\n * action must be enabled for the target Interactable and an appropriate number\n * of pointers must be held down - 1 for drag/resize, 2 for gesture.\n *\n * Use it with `interactable.able({ manualStart: false })` to always\n * [start actions manually](https://github.com/taye/interact.js/issues/114)\n *\n - action (object) The action to be performed - drag, resize, etc.\n - target (Interactable) The Interactable to target\n - element (Element) The DOM Element to target\n = (object) interact\n **\n | interact(target)\n | .draggable({\n | // disable the default drag start by down->move\n | manualStart: true\n | })\n | // start dragging after the user holds the pointer down\n | .on('hold', function (event) {\n | var interaction = event.interaction;\n |\n | if (!interaction.interacting()) {\n | interaction.start({ name: 'drag' },\n | event.interactable,\n | event.currentTarget);\n | }\n | });\n \\*/\n start (action, target, element) {\n if (this.interacting()\n || !this.pointerIsDown\n || this.pointerIds.length < (action.name === 'gesture'? 2 : 1)) {\n return;\n }\n\n // if this interaction had been removed after stopping\n // add it back\n if (utils.indexOf(scope.interactions, this) === -1) {\n scope.interactions.push(this);\n }\n\n utils.copyAction(this.prepared, action);\n this.target = target;\n this.element = element;\n\n signals.fire('action-start', {\n interaction: this,\n event: this.downEvent,\n });\n }\n\n pointerMove (pointer, event, eventTarget) {\n if (!this.simulation) {\n this.updatePointer(pointer);\n utils.setCoords(this.curCoords, this.pointers);\n }\n\n const duplicateMove = (this.curCoords.page.x === this.prevCoords.page.x\n && this.curCoords.page.y === this.prevCoords.page.y\n && this.curCoords.client.x === this.prevCoords.client.x\n && this.curCoords.client.y === this.prevCoords.client.y);\n\n let dx;\n let dy;\n\n // register movement greater than pointerMoveTolerance\n if (this.pointerIsDown && !this.pointerWasMoved) {\n dx = this.curCoords.client.x - this.startCoords.client.x;\n dy = this.curCoords.client.y - this.startCoords.client.y;\n\n this.pointerWasMoved = utils.hypot(dx, dy) > Interaction.pointerMoveTolerance;\n }\n\n const signalArg = {\n pointer,\n pointerIndex: this.getPointerIndex(pointer),\n event,\n eventTarget,\n dx,\n dy,\n duplicate: duplicateMove,\n interaction: this,\n interactingBeforeMove: this.interacting(),\n };\n\n if (!duplicateMove) {\n // set pointer coordinate, time changes and speeds\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n }\n\n signals.fire('move', signalArg);\n\n if (!duplicateMove) {\n // if interacting, fire an 'action-move' signal etc\n if (this.interacting()) {\n this.doMove(signalArg);\n }\n\n if (this.pointerWasMoved) {\n utils.copyCoords(this.prevCoords, this.curCoords);\n }\n }\n }\n\n /*\\\n * Interaction.doMove\n [ method ]\n *\n * Force a move of the current action at the same coordinates. Useful if\n * snap/restrict has been changed and you want a movement with the new\n * settings.\n *\n **\n | interact(target)\n | .draggable(true)\n | .on('dragmove', function (event) {\n | if (someCondition) {\n | // change the snap settings\n | event.interactable.draggable({ snap: { targets: [] }});\n | // fire another move event with re-calculated snap\n | event.interaction.doMove();\n | }\n | });\n \\*/\n doMove (signalArg) {\n signalArg = utils.extend({\n pointer: this.pointers[0],\n event: this.prevEvent,\n eventTarget: this._eventTarget,\n interaction: this,\n }, signalArg || {});\n\n signals.fire('before-action-move', signalArg);\n\n if (!this._dontFireMove) {\n signals.fire('action-move', signalArg);\n }\n\n this._dontFireMove = false;\n }\n\n // End interact move events and stop auto-scroll unless simulation is running\n pointerUp (pointer, event, eventTarget, curEventTarget) {\n const pointerIndex = this.getPointerIndex(pointer);\n\n signals.fire(/cancel$/i.test(event.type)? 'cancel' : 'up', {\n pointer,\n pointerIndex,\n event,\n eventTarget,\n curEventTarget,\n interaction: this,\n });\n\n if (!this.simulation) {\n this.end(event);\n }\n\n this.pointerIsDown = false;\n this.removePointer(pointer, event);\n }\n\n /*\\\n * Interaction.end\n [ method ]\n *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n - event (PointerEvent) #optional\n **\n | interact(target)\n | .draggable(true)\n | .on('move', function (event) {\n | if (event.pageX > 1000) {\n | // end the current action\n | event.interaction.end();\n | // stop all further listeners from being called\n | event.stopImmediatePropagation();\n | }\n | });\n \\*/\n end (event) {\n event = event || this.prevEvent;\n\n if (this.interacting()) {\n signals.fire('action-end', {\n event,\n interaction: this,\n });\n }\n\n this.stop();\n }\n\n currentAction () {\n return this._interacting? this.prepared.name: null;\n }\n\n interacting () {\n return this._interacting;\n }\n\n stop () {\n signals.fire('stop', { interaction: this });\n\n if (this._interacting) {\n signals.fire('stop-active', { interaction: this });\n signals.fire('stop-' + this.prepared.name, { interaction: this });\n }\n\n this.target = this.element = null;\n\n this._interacting = false;\n this.prepared.name = this.prevEvent = null;\n }\n\n getPointerIndex (pointer) {\n return utils.indexOf(this.pointerIds, utils.getPointerId(pointer));\n }\n\n updatePointer (pointer, event, down = event && /(down|start)$/i.test(event.type)) {\n const id = utils.getPointerId(pointer);\n let index = this.getPointerIndex(pointer);\n\n if (index === -1) {\n index = this.pointerIds.length;\n this.pointerIds[index] = id;\n }\n\n if (down) {\n signals.fire('update-pointer-down', {\n pointer,\n event,\n down,\n pointerId: id,\n pointerIndex: index,\n interaction: this,\n });\n }\n\n this.pointers[index] = pointer;\n\n return index;\n }\n\n removePointer (pointer, event) {\n const id = utils.getPointerId(pointer);\n const index = this.mouse? 0 : utils.indexOf(this.pointerIds, id);\n\n if (index === -1) { return; }\n\n signals.fire('remove-pointer', {\n pointer,\n event,\n pointerIndex: index,\n interaction: this,\n });\n\n this.pointers .splice(index, 1);\n this.pointerIds .splice(index, 1);\n this.downTargets.splice(index, 1);\n this.downTimes .splice(index, 1);\n }\n\n _updateEventTargets (target, currentTarget) {\n this._eventTarget = target;\n this._curEventTarget = currentTarget;\n }\n}\n\nfor (let i = 0, len = methodNames.length; i < len; i++) {\n const method = methodNames[i];\n\n listeners[method] = doOnInteractions(method);\n}\n\nfunction doOnInteractions (method) {\n return (function (event) {\n const [eventTarget, curEventTarget] = utils.getEventTargets(event);\n const matches = []; // [ [pointer, interaction], ...]\n\n if (browser.supportsTouch && /touch/.test(event.type)) {\n prevTouchTime = new Date().getTime();\n\n for (let i = 0; i < event.changedTouches.length; i++) {\n const pointer = event.changedTouches[i];\n const interaction = finder.search(pointer, event.type, eventTarget);\n\n matches.push([pointer, interaction || new Interaction()]);\n }\n }\n else {\n let invalidPointer = false;\n\n if (!browser.supportsPointerEvent && /mouse/.test(event.type)) {\n // ignore mouse events while touch interactions are active\n for (let i = 0; i < scope.interactions.length && !invalidPointer; i++) {\n invalidPointer = !scope.interactions[i].mouse && scope.interactions[i].pointerIsDown;\n }\n\n // try to ignore mouse events that are simulated by the browser\n // after a touch event\n invalidPointer = invalidPointer\n || (new Date().getTime() - prevTouchTime < 500)\n // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated\n || event.timeStamp === 0;\n }\n\n if (!invalidPointer) {\n let interaction = finder.search(event, event.type, eventTarget);\n\n if (!interaction) {\n\n interaction = new Interaction();\n interaction.mouse = (/mouse/i.test(event.pointerType || event.type)\n // MSPointerEvent.MSPOINTER_TYPE_MOUSE\n || event.pointerType === 4\n || !event.pointerType);\n }\n\n matches.push([event, interaction]);\n }\n }\n\n for (const [pointer, interaction] of matches) {\n interaction._updateEventTargets(eventTarget, curEventTarget);\n interaction[method](pointer, event, eventTarget, curEventTarget);\n }\n });\n}\n\nfunction endAll (event) {\n for (let i = 0; i < scope.interactions.length; i++) {\n const interaction = scope.interactions[i];\n\n interaction.end(event);\n signals.fire('endall', { event, interaction });\n }\n}\n\nconst docEvents = { /* 'eventType': listenerFunc */ };\nconst pEventTypes = browser.pEventTypes;\n\nif (scope.PointerEvent) {\n docEvents[pEventTypes.down ] = listeners.pointerDown;\n docEvents[pEventTypes.move ] = listeners.pointerMove;\n docEvents[pEventTypes.up ] = listeners.pointerUp;\n docEvents[pEventTypes.cancel] = listeners.pointerUp;\n}\nelse {\n docEvents.mousedown = listeners.pointerDown;\n docEvents.mousemove = listeners.pointerMove;\n docEvents.mouseup = listeners.pointerUp;\n\n docEvents.touchstart = listeners.pointerDown;\n docEvents.touchmove = listeners.pointerMove;\n docEvents.touchend = listeners.pointerUp;\n docEvents.touchcancel = listeners.pointerUp;\n}\n\ndocEvents.blur = endAll;\n\nfunction onDocSignal ({ doc }, signalName) {\n const eventMethod = signalName.indexOf('add') === 0\n ? events.add : events.remove;\n\n // delegate event listener\n for (const eventType in scope.delegatedEvents) {\n eventMethod(doc, eventType, events.delegateListener);\n eventMethod(doc, eventType, events.delegateUseCapture, true);\n }\n\n for (const eventType in docEvents) {\n eventMethod(doc, eventType, docEvents[eventType]);\n }\n}\n\nsignals.on('update-pointer-down', ({ interaction, pointer, pointerId, pointerIndex, event, eventTarget, down }) => {\n interaction.pointerIds[pointerIndex] = pointerId;\n interaction.pointers[pointerIndex] = pointer;\n\n if (down) {\n interaction.pointerIsDown = true;\n }\n\n if (!interaction.interacting()) {\n utils.setCoords(interaction.startCoords, interaction.pointers);\n\n utils.copyCoords(interaction.curCoords , interaction.startCoords);\n utils.copyCoords(interaction.prevCoords, interaction.startCoords);\n\n interaction.downEvent = event;\n interaction.downTimes[pointerIndex] = interaction.curCoords.timeStamp;\n interaction.downTargets[pointerIndex] = eventTarget || event && utils.getEventTargets(event)[0];\n interaction.pointerWasMoved = false;\n\n utils.pointerExtend(interaction.downPointer, pointer);\n }\n});\n\nscope.signals.on('add-document' , onDocSignal);\nscope.signals.on('remove-document', onDocSignal);\n\nInteraction.pointerMoveTolerance = 1;\nInteraction.doOnInteractions = doOnInteractions;\nInteraction.endAll = endAll;\nInteraction.signals = signals;\nInteraction.docEvents = docEvents;\n\nscope.endAllInteractions = endAll;\n\nmodule.exports = Interaction;\n","const Interaction = require('../Interaction');\nconst InteractEvent = require('../InteractEvent');\n\nconst actions = {\n firePrepared,\n names: [],\n methodDict: {},\n};\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n interaction._interacting = true;\n firePrepared(interaction, event, 'start');\n});\n\nInteraction.signals.on('action-move', function ({ interaction, event, preEnd }) {\n firePrepared(interaction, event, 'move', preEnd);\n\n // if the action was ended in a listener\n if (!interaction.interacting()) { return false; }\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n firePrepared(interaction, event, 'end');\n});\n\nfunction firePrepared (interaction, event, phase, preEnd) {\n const actionName = interaction.prepared.name;\n\n const newEvent = new InteractEvent(interaction, event, actionName, phase, interaction.element, null, preEnd);\n\n interaction.target.fire(newEvent);\n interaction.prevEvent = newEvent;\n}\n\nmodule.exports = actions;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drag = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n startAxis : 'xy',\n lockAxis : 'xy',\n },\n\n checker: function (pointer, event, interactable) {\n const dragOptions = interactable.options.drag;\n\n return dragOptions.enabled\n ? { name: 'drag', axis: (dragOptions.lockAxis === 'start'\n ? dragOptions.startAxis\n : dragOptions.lockAxis)}\n : null;\n },\n\n getCursor: function () {\n return 'move';\n },\n};\n\nInteraction.signals.on('before-action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n interaction.curCoords.page.y = interaction.startCoords.page.y;\n interaction.curCoords.client.y = interaction.startCoords.client.y;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vx);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vx);\n interaction.pointerDelta.client.vy = 0;\n interaction.pointerDelta.page.vy = 0;\n }\n else if (axis === 'y') {\n interaction.curCoords.page.x = interaction.startCoords.page.x;\n interaction.curCoords.client.x = interaction.startCoords.client.x;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vy);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vy);\n interaction.pointerDelta.client.vx = 0;\n interaction.pointerDelta.page.vx = 0;\n }\n});\n\n// dragmove\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'dragmove') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n iEvent.pageY = interaction.startCoords.page.y;\n iEvent.clientY = interaction.startCoords.client.y;\n iEvent.dy = 0;\n }\n else if (axis === 'y') {\n iEvent.pageX = interaction.startCoords.page.x;\n iEvent.clientX = interaction.startCoords.client.x;\n iEvent.dx = 0;\n }\n});\n\n/*\\\n * Interactable.draggable\n [ method ]\n *\n * Gets or sets whether drag actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of drag events\n | var isDraggable = interact('ul li').draggable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on drag events (object makes the Interactable draggable)\n = (object) This Interactable\n | interact(element).draggable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // the axis in which the first movement must be\n | // for the drag sequence to start\n | // 'xy' by default - any direction\n | startAxis: 'x' || 'y' || 'xy',\n |\n | // 'xy' by default - don't restrict to one axis (move in any direction)\n | // 'x' or 'y' to restrict movement to either axis\n | // 'start' to restrict movement to the axis the drag started in\n | lockAxis: 'x' || 'y' || 'xy' || 'start',\n |\n | // max number of drags that can happen concurrently\n | // with elements of this Interactable. Infinity by default\n | max: Infinity,\n |\n | // max number of drags that can target the same element+Interactable\n | // 1 by default\n | maxPerElement: 2\n | });\n\\*/\nInteractable.prototype.draggable = function (options) {\n if (utils.is.object(options)) {\n this.options.drag.enabled = options.enabled === false? false: true;\n this.setPerAction('drag', options);\n this.setOnEvents('drag', options);\n\n if (/^(xy|x|y|start)$/.test(options.lockAxis)) {\n this.options.drag.lockAxis = options.lockAxis;\n }\n if (/^(xy|x|y)$/.test(options.startAxis)) {\n this.options.drag.startAxis = options.startAxis;\n }\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drag.enabled = options;\n\n if (!options) {\n this.ondragstart = this.ondragstart = this.ondragend = null;\n }\n\n return this;\n }\n\n return this.options.drag;\n};\n\nactions.drag = drag;\nactions.names.push('drag');\nutils.merge(Interactable.eventTypes, [\n 'dragstart',\n 'dragmove',\n 'draginertiastart',\n 'draginertiaresume',\n 'dragend',\n]);\nactions.methodDict.drag = 'draggable';\n\ndefaultOptions.drag = drag.defaults;\n\nmodule.exports = drag;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst scope = require('../scope');\nconst interact = require('../interact');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drop = {\n defaults: {\n enabled: false,\n accept : null,\n overlap: 'pointer',\n },\n};\n\nlet dynamicDrop = false;\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // reset active dropzones\n interaction.activeDrops.dropzones = [];\n interaction.activeDrops.elements = [];\n interaction.activeDrops.rects = [];\n\n interaction.dropEvents = null;\n\n if (!interaction.dynamicDrop) {\n setActiveDrops(interaction, interaction.element);\n }\n\n const dragEvent = interaction.prevEvent;\n const dropEvents = getDropEvents(interaction, event, dragEvent);\n\n if (dropEvents.activate) {\n fireActiveDrops(interaction, dropEvents.activate);\n }\n});\n\nInteractEvent.signals.on('new', function ({ interaction, iEvent, event }) {\n if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { return; }\n\n const draggableElement = interaction.element;\n const dragEvent = iEvent;\n const dropResult = getDrop(dragEvent, event, draggableElement);\n\n interaction.dropTarget = dropResult.dropzone;\n interaction.dropElement = dropResult.element;\n\n interaction.dropEvents = getDropEvents(interaction, event, dragEvent);\n});\n\nInteraction.signals.on('action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n fireDropEvents(interaction, interaction.dropEvents);\n});\n\nInteraction.signals.on('action-end', function ({ interaction }) {\n if (interaction.prepared.name === 'drag') {\n fireDropEvents(interaction, interaction.dropEvents);\n }\n});\n\nInteraction.signals.on('stop-drag', function ({ interaction }) {\n interaction.activeDrops.dropzones =\n interaction.activeDrops.elements =\n interaction.activeDrops.rects =\n interaction.dropEvents = null;\n});\n\nfunction collectDrops (interaction, element) {\n const drops = [];\n const elements = [];\n\n element = element || interaction.element;\n\n // collect all dropzones and their elements which qualify for a drop\n for (const current of scope.interactables) {\n if (!current.options.drop.enabled) { continue; }\n\n const accept = current.options.drop.accept;\n\n // test the draggable element against the dropzone's accept setting\n if ((utils.is.element(accept) && accept !== element)\n || (utils.is.string(accept)\n && !utils.matchesSelector(element, accept))) {\n\n continue;\n }\n\n // query for new elements if necessary\n const dropElements = utils.is.string(current.target)\n ? current._context.querySelectorAll(current.target)\n : [current.target];\n\n for (let i = 0; i < dropElements.length; i++) {\n const currentElement = dropElements[i];\n\n if (currentElement !== element) {\n drops.push(current);\n elements.push(currentElement);\n }\n }\n }\n\n return {\n elements,\n dropzones: drops,\n };\n}\n\nfunction fireActiveDrops (interaction, event) {\n let prevElement;\n\n // loop through all active dropzones and trigger event\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n const current = interaction.activeDrops.dropzones[i];\n const currentElement = interaction.activeDrops.elements [i];\n\n // prevent trigger of duplicate events on same element\n if (currentElement !== prevElement) {\n // set current element as event target\n event.target = currentElement;\n current.fire(event);\n }\n prevElement = currentElement;\n }\n}\n\n// Collect a new set of possible drops and save them in activeDrops.\n// setActiveDrops should always be called when a drag has just started or a\n// drag event happens while dynamicDrop is true\nfunction setActiveDrops (interaction, dragElement) {\n // get dropzones and their elements that could receive the draggable\n const possibleDrops = collectDrops(interaction, dragElement, true);\n\n interaction.activeDrops.dropzones = possibleDrops.dropzones;\n interaction.activeDrops.elements = possibleDrops.elements;\n interaction.activeDrops.rects = [];\n\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n interaction.activeDrops.rects[i] =\n interaction.activeDrops.dropzones[i].getRect(interaction.activeDrops.elements[i]);\n }\n}\n\nfunction getDrop (dragEvent, event, dragElement) {\n const interaction = dragEvent.interaction;\n const validDrops = [];\n\n if (dynamicDrop) {\n setActiveDrops(interaction, dragElement);\n }\n\n // collect all dropzones and their elements which qualify for a drop\n for (let j = 0; j < interaction.activeDrops.dropzones.length; j++) {\n const current = interaction.activeDrops.dropzones[j];\n const currentElement = interaction.activeDrops.elements [j];\n const rect = interaction.activeDrops.rects [j];\n\n validDrops.push(current.dropCheck(dragEvent, event, interaction.target, dragElement, currentElement, rect)\n ? currentElement\n : null);\n }\n\n // get the most appropriate dropzone based on DOM depth and order\n const dropIndex = utils.indexOfDeepestElement(validDrops);\n\n return {\n dropzone: interaction.activeDrops.dropzones[dropIndex] || null,\n element : interaction.activeDrops.elements [dropIndex] || null,\n };\n}\n\nfunction getDropEvents (interaction, pointerEvent, dragEvent) {\n const dropEvents = {\n enter : null,\n leave : null,\n activate : null,\n deactivate: null,\n move : null,\n drop : null,\n };\n\n const tmpl = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n };\n\n if (interaction.dropElement !== interaction.prevDropElement) {\n // if there was a prevDropTarget, create a dragleave event\n if (interaction.prevDropTarget) {\n dropEvents.leave = utils.extend({ type: 'dragleave' }, tmpl);\n\n dragEvent.dragLeave = dropEvents.leave.target = interaction.prevDropElement;\n dragEvent.prevDropzone = dropEvents.leave.dropzone = interaction.prevDropTarget;\n }\n // if the dropTarget is not null, create a dragenter event\n if (interaction.dropTarget) {\n dropEvents.enter = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n type : 'dragenter',\n };\n\n dragEvent.dragEnter = interaction.dropElement;\n dragEvent.dropzone = interaction.dropTarget;\n }\n }\n\n if (dragEvent.type === 'dragend' && interaction.dropTarget) {\n dropEvents.drop = utils.extend({ type: 'drop' }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n dragEvent.relatedTarget = interaction.dropElement;\n }\n if (dragEvent.type === 'dragstart') {\n dropEvents.activate = utils.extend({ type: 'dropactivate' }, tmpl);\n\n dropEvents.activate.target = null;\n dropEvents.activate.dropzone = null;\n }\n if (dragEvent.type === 'dragend') {\n dropEvents.deactivate = utils.extend({ type: 'dropdeactivate' }, tmpl);\n\n dropEvents.deactivate.target = null;\n dropEvents.deactivate.dropzone = null;\n }\n if (dragEvent.type === 'dragmove' && interaction.dropTarget) {\n dropEvents.move = utils.extend({\n dragmove : dragEvent,\n type : 'dropmove',\n }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n }\n\n return dropEvents;\n}\n\nfunction fireDropEvents (interaction, dropEvents) {\n if (dropEvents.leave) { interaction.prevDropTarget.fire(dropEvents.leave); }\n if (dropEvents.move ) { interaction.dropTarget.fire(dropEvents.move ); }\n if (dropEvents.enter) { interaction.dropTarget.fire(dropEvents.enter); }\n if (dropEvents.drop ) { interaction.dropTarget.fire(dropEvents.drop ); }\n if (dropEvents.deactivate) {\n fireActiveDrops(interaction, dropEvents.deactivate);\n }\n\n interaction.prevDropTarget = interaction.dropTarget;\n interaction.prevDropElement = interaction.dropElement;\n}\n\n/*\\\n * Interactable.dropzone\n [ method ]\n *\n * Returns or sets whether elements can be dropped onto this\n * Interactable to trigger drop events\n *\n * Dropzones can receive the following events:\n * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends\n * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone\n * - `dragmove` when a draggable that has entered the dropzone is moved\n * - `drop` when a draggable is dropped into this dropzone\n *\n * Use the `accept` option to allow only elements that match the given CSS\n * selector or element. The value can be:\n *\n * - **an Element** - only that element can be dropped into this dropzone.\n * - **a string**, - the element being dragged must match it as a CSS selector.\n * - **`null`** - accept options is cleared - it accepts any element.\n *\n * Use the `overlap` option to set how drops are checked for. The allowed\n * values are:\n *\n * - `'pointer'`, the pointer must be over the dropzone (default)\n * - `'center'`, the draggable element's center must be over the dropzone\n * - a number from 0-1 which is the `(intersection area) / (draggable area)`.\n * e.g. `0.5` for drop to happen when half of the area of the draggable is\n * over the dropzone\n *\n * Use the `checker` option to specify a function to check if a dragged\n * element is over this Interactable.\n *\n | interact(target)\n | .dropChecker(function(dragEvent, // related dragmove or dragend event\n | event, // TouchEvent/PointerEvent/MouseEvent\n | dropped, // bool result of the default checker\n | dropzone, // dropzone Interactable\n | dropElement, // dropzone elemnt\n | draggable, // draggable Interactable\n | draggableElement) {// draggable element\n |\n | return dropped && event.target.hasAttribute('allow-drop');\n | }\n *\n *\n - options (boolean | object | null) #optional The new value to be set.\n | interact('.drop').dropzone({\n | accept: '.can-drop' || document.getElementById('single-drop'),\n | overlap: 'pointer' || 'center' || zeroToOne\n | }\n = (boolean | object) The current setting or this Interactable\n\\*/\nInteractable.prototype.dropzone = function (options) {\n if (utils.is.object(options)) {\n this.options.drop.enabled = options.enabled === false? false: true;\n\n if (utils.is.function(options.ondrop) ) { this.events.ondrop = options.ondrop ; }\n if (utils.is.function(options.ondropactivate) ) { this.events.ondropactivate = options.ondropactivate ; }\n if (utils.is.function(options.ondropdeactivate)) { this.events.ondropdeactivate = options.ondropdeactivate; }\n if (utils.is.function(options.ondragenter) ) { this.events.ondragenter = options.ondragenter ; }\n if (utils.is.function(options.ondragleave) ) { this.events.ondragleave = options.ondragleave ; }\n if (utils.is.function(options.ondropmove) ) { this.events.ondropmove = options.ondropmove ; }\n\n if (/^(pointer|center)$/.test(options.overlap)) {\n this.options.drop.overlap = options.overlap;\n }\n else if (utils.is.number(options.overlap)) {\n this.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0);\n }\n if ('accept' in options) {\n this.options.drop.accept = options.accept;\n }\n if ('checker' in options) {\n this.options.drop.checker = options.checker;\n }\n\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drop.enabled = options;\n\n if (!options) {\n this.ondragenter = this.ondragleave = this.ondrop\n = this.ondropactivate = this.ondropdeactivate = null;\n }\n\n return this;\n }\n\n return this.options.drop;\n};\n\nInteractable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) {\n let dropped = false;\n\n // if the dropzone has no rect (eg. display: none)\n // call the custom dropChecker or just return false\n if (!(rect = rect || this.getRect(dropElement))) {\n return (this.options.drop.checker\n ? this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement)\n : false);\n }\n\n const dropOverlap = this.options.drop.overlap;\n\n if (dropOverlap === 'pointer') {\n const origin = utils.getOriginXY(draggable, draggableElement, 'drag');\n const page = utils.getPageXY(dragEvent);\n\n page.x += origin.x;\n page.y += origin.y;\n\n const horizontal = (page.x > rect.left) && (page.x < rect.right);\n const vertical = (page.y > rect.top ) && (page.y < rect.bottom);\n\n dropped = horizontal && vertical;\n }\n\n const dragRect = draggable.getRect(draggableElement);\n\n if (dragRect && dropOverlap === 'center') {\n const cx = dragRect.left + dragRect.width / 2;\n const cy = dragRect.top + dragRect.height / 2;\n\n dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom;\n }\n\n if (dragRect && utils.is.number(dropOverlap)) {\n const overlapArea = (Math.max(0, Math.min(rect.right , dragRect.right ) - Math.max(rect.left, dragRect.left))\n * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top , dragRect.top )));\n\n const overlapRatio = overlapArea / (dragRect.width * dragRect.height);\n\n dropped = overlapRatio >= dropOverlap;\n }\n\n if (this.options.drop.checker) {\n dropped = this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement);\n }\n\n return dropped;\n};\n\nInteractable.signals.on('unset', function ({ interactable }) {\n interactable.dropzone(false);\n});\n\nInteractable.settingsMethods.push('dropChecker');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.dropTarget = null; // the dropzone a drag target might be dropped into\n interaction.dropElement = null; // the element at the time of checking\n interaction.prevDropTarget = null; // the dropzone that was recently dragged away from\n interaction.prevDropElement = null; // the element at the time of checking\n interaction.dropEvents = null; // the dropEvents related to the current drag event\n\n interaction.activeDrops = {\n dropzones: [], // the dropzones that are mentioned below\n elements : [], // elements of dropzones that accept the target draggable\n rects : [], // the rects of the elements mentioned above\n };\n\n});\n\nInteraction.signals.on('stop', function ({ interaction }) {\n interaction.dropTarget = interaction.dropElement =\n interaction.prevDropTarget = interaction.prevDropElement = null;\n});\n\n/*\\\n * interact.dynamicDrop\n [ method ]\n *\n * Returns or sets whether the dimensions of dropzone elements are\n * calculated on every dragmove or only on dragstart for the default\n * dropChecker\n *\n - newValue (boolean) #optional True to check on each move. False to check only before start\n = (boolean | interact) The current setting or interact\n\\*/\ninteract.dynamicDrop = function (newValue) {\n if (utils.is.bool(newValue)) {\n //if (dragging && dynamicDrop !== newValue && !newValue) {\n //calcRects(dropzones);\n //}\n\n dynamicDrop = newValue;\n\n return interact;\n }\n return dynamicDrop;\n};\n\nutils.merge(Interactable.eventTypes, [\n 'dragenter',\n 'dragleave',\n 'dropactivate',\n 'dropdeactivate',\n 'dropmove',\n 'drop',\n]);\nactions.methodDict.drop = 'dropzone';\n\ndefaultOptions.drop = drop.defaults;\n\nmodule.exports = drop;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst gesture = {\n defaults: {\n enabled : false,\n origin : null,\n restrict: null,\n },\n\n checker: function (pointer, event, interactable, element, interaction) {\n if (interaction.pointerIds.length >= 2) {\n return { name: 'gesture' };\n }\n\n return null;\n },\n\n getCursor: function () {\n return '';\n },\n};\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturestart') { return; }\n iEvent.ds = 0;\n\n interaction.gesture.startDistance = interaction.gesture.prevDistance = iEvent.distance;\n interaction.gesture.startAngle = interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.scale = 1;\n});\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturemove') { return; }\n\n iEvent.ds = iEvent.scale - interaction.gesture.scale;\n\n interaction.target.fire(iEvent);\n\n interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.prevDistance = iEvent.distance;\n\n if (iEvent.scale !== Infinity\n && iEvent.scale !== null\n && iEvent.scale !== undefined\n && !isNaN(iEvent.scale)) {\n\n interaction.gesture.scale = iEvent.scale;\n }\n});\n\n/*\\\n * Interactable.gesturable\n [ method ]\n *\n * Gets or sets whether multitouch gestures can be performed on the\n * Interactable's element\n *\n = (boolean) Indicates if this can be the target of gesture events\n | var isGestureable = interact(element).gesturable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on gesture events (makes the Interactable gesturable)\n = (object) this Interactable\n | interact(element).gesturable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // limit multiple gestures.\n | // See the explanation in @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n\\*/\nInteractable.prototype.gesturable = function (options) {\n if (utils.is.object(options)) {\n this.options.gesture.enabled = options.enabled === false? false: true;\n this.setPerAction('gesture', options);\n this.setOnEvents('gesture', options);\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.gesture.enabled = options;\n\n if (!options) {\n this.ongesturestart = this.ongesturestart = this.ongestureend = null;\n }\n\n return this;\n }\n\n return this.options.gesture;\n};\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action, event, starting, ending, deltaSource }) {\n if (action !== 'gesture') { return; }\n\n const pointers = interaction.pointers;\n\n iEvent.touches = [pointers[0], pointers[1]];\n\n if (starting) {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = 1;\n iEvent.ds = 0;\n iEvent.angle = utils.touchAngle(pointers, undefined, deltaSource);\n iEvent.da = 0;\n }\n else if (ending || event instanceof InteractEvent) {\n iEvent.distance = interaction.prevEvent.distance;\n iEvent.box = interaction.prevEvent.box;\n iEvent.scale = interaction.prevEvent.scale;\n iEvent.ds = iEvent.scale - 1;\n iEvent.angle = interaction.prevEvent.angle;\n iEvent.da = iEvent.angle - interaction.gesture.startAngle;\n }\n else {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = iEvent.distance / interaction.gesture.startDistance;\n iEvent.angle = utils.touchAngle(pointers, interaction.gesture.prevAngle, deltaSource);\n\n iEvent.ds = iEvent.scale - interaction.gesture.prevScale;\n iEvent.da = iEvent.angle - interaction.gesture.prevAngle;\n }\n});\n\nInteraction.signals.on('new', function (interaction) {\n interaction.gesture = {\n start: { x: 0, y: 0 },\n\n startDistance: 0, // distance between two touches of touchStart\n prevDistance : 0,\n distance : 0,\n\n scale: 1, // gesture.distance / gesture.startDistance\n\n startAngle: 0, // angle of line joining two touches\n prevAngle : 0, // angle of the previous gesture event\n };\n});\n\nactions.gesture = gesture;\nactions.names.push('gesture');\nutils.merge(Interactable.eventTypes, [\n 'gesturestart',\n 'gesturemove',\n 'gestureend',\n]);\nactions.methodDict.gesture = 'gesturable';\n\ndefaultOptions.gesture = gesture.defaults;\n\nmodule.exports = gesture;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\n// Less Precision with touch input\nconst defaultMargin = browser.supportsTouch || browser.supportsPointerEvent? 20: 10;\n\nconst resize = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n square: false,\n preserveAspectRatio: false,\n axis: 'xy',\n\n // use default margin\n margin: NaN,\n\n // object with props left, right, top, bottom which are\n // true/false values to resize when the pointer is over that edge,\n // CSS selectors to match the handles for each direction\n // or the Elements for each handle\n edges: null,\n\n // a value of 'none' will limit the resize rect to a minimum of 0x0\n // 'negate' will alow the rect to have negative width/height\n // 'reposition' will keep the width/height positive by swapping\n // the top and bottom edges and/or swapping the left and right edges\n invert: 'none',\n },\n\n checker: function (pointer, event, interactable, element, interaction, rect) {\n if (!rect) { return null; }\n\n const page = utils.extend({}, interaction.curCoords.page);\n const options = interactable.options;\n\n if (options.resize.enabled) {\n const resizeOptions = options.resize;\n const resizeEdges = { left: false, right: false, top: false, bottom: false };\n\n // if using resize.edges\n if (utils.is.object(resizeOptions.edges)) {\n for (const edge in resizeEdges) {\n resizeEdges[edge] = checkResizeEdge(edge,\n resizeOptions.edges[edge],\n page,\n interaction._eventTarget,\n element,\n rect,\n resizeOptions.margin || defaultMargin);\n }\n\n resizeEdges.left = resizeEdges.left && !resizeEdges.right;\n resizeEdges.top = resizeEdges.top && !resizeEdges.bottom;\n\n if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) {\n return {\n name: 'resize',\n edges: resizeEdges,\n };\n }\n }\n else {\n const right = options.resize.axis !== 'y' && page.x > (rect.right - defaultMargin);\n const bottom = options.resize.axis !== 'x' && page.y > (rect.bottom - defaultMargin);\n\n if (right || bottom) {\n return {\n name: 'resize',\n axes: (right? 'x' : '') + (bottom? 'y' : ''),\n };\n }\n }\n }\n\n return null;\n },\n\n cursors: (browser.isIe9OrOlder ? {\n x : 'e-resize',\n y : 's-resize',\n xy: 'se-resize',\n\n top : 'n-resize',\n left : 'w-resize',\n bottom : 's-resize',\n right : 'e-resize',\n topleft : 'se-resize',\n bottomright: 'se-resize',\n topright : 'ne-resize',\n bottomleft : 'ne-resize',\n } : {\n x : 'ew-resize',\n y : 'ns-resize',\n xy: 'nwse-resize',\n\n top : 'ns-resize',\n left : 'ew-resize',\n bottom : 'ns-resize',\n right : 'ew-resize',\n topleft : 'nwse-resize',\n bottomright: 'nwse-resize',\n topright : 'nesw-resize',\n bottomleft : 'nesw-resize',\n }),\n\n getCursor: function (action) {\n if (action.axis) {\n return resize.cursors[action.name + action.axis];\n }\n else if (action.edges) {\n let cursorKey = '';\n const edgeNames = ['top', 'bottom', 'left', 'right'];\n\n for (let i = 0; i < 4; i++) {\n if (action.edges[edgeNames[i]]) {\n cursorKey += edgeNames[i];\n }\n }\n\n return resize.cursors[cursorKey];\n }\n },\n};\n\n// resizestart\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'resizestart' || !interaction.prepared.edges) {\n return;\n }\n\n const startRect = interaction.target.getRect(interaction.element);\n const resizeOptions = interaction.target.options.resize;\n\n /*\n * When using the `resizable.square` or `resizable.preserveAspectRatio` options, resizing from one edge\n * will affect another. E.g. with `resizable.square`, resizing to make the right edge larger will make\n * the bottom edge larger by the same amount. We call these 'linked' edges. Any linked edges will depend\n * on the active edges and the edge being interacted with.\n */\n if (resizeOptions.square || resizeOptions.preserveAspectRatio) {\n const linkedEdges = utils.extend({}, interaction.prepared.edges);\n\n linkedEdges.top = linkedEdges.top || (linkedEdges.left && !linkedEdges.bottom);\n linkedEdges.left = linkedEdges.left || (linkedEdges.top && !linkedEdges.right );\n linkedEdges.bottom = linkedEdges.bottom || (linkedEdges.right && !linkedEdges.top );\n linkedEdges.right = linkedEdges.right || (linkedEdges.bottom && !linkedEdges.left );\n\n interaction.prepared._linkedEdges = linkedEdges;\n }\n else {\n interaction.prepared._linkedEdges = null;\n }\n\n // if using `resizable.preserveAspectRatio` option, record aspect ratio at the start of the resize\n if (resizeOptions.preserveAspectRatio) {\n interaction.resizeStartAspectRatio = startRect.width / startRect.height;\n }\n\n interaction.resizeRects = {\n start : startRect,\n current : utils.extend({}, startRect),\n inverted : utils.extend({}, startRect),\n previous : utils.extend({}, startRect),\n delta : {\n left: 0, right : 0, width : 0,\n top : 0, bottom: 0, height: 0,\n },\n };\n\n iEvent.rect = interaction.resizeRects.inverted;\n iEvent.deltaRect = interaction.resizeRects.delta;\n});\n\n// resizemove\nInteractEvent.signals.on('new', function ({ iEvent, phase, interaction }) {\n if (phase !== 'move' || !interaction.prepared.edges) { return; }\n\n const resizeOptions = interaction.target.options.resize;\n const invert = resizeOptions.invert;\n const invertible = invert === 'reposition' || invert === 'negate';\n\n let edges = interaction.prepared.edges;\n\n const start = interaction.resizeRects.start;\n const current = interaction.resizeRects.current;\n const inverted = interaction.resizeRects.inverted;\n const delta = interaction.resizeRects.delta;\n const previous = utils.extend(interaction.resizeRects.previous, inverted);\n const originalEdges = edges;\n\n let dx = iEvent.dx;\n let dy = iEvent.dy;\n\n if (resizeOptions.preserveAspectRatio || resizeOptions.square) {\n // `resize.preserveAspectRatio` takes precedence over `resize.square`\n const startAspectRatio = resizeOptions.preserveAspectRatio\n ? interaction.resizeStartAspectRatio\n : 1;\n\n edges = interaction.prepared._linkedEdges;\n\n if ((originalEdges.left && originalEdges.bottom)\n || (originalEdges.right && originalEdges.top)) {\n dy = -dx / startAspectRatio;\n }\n else if (originalEdges.left || originalEdges.right ) { dy = dx / startAspectRatio; }\n else if (originalEdges.top || originalEdges.bottom) { dx = dy * startAspectRatio; }\n }\n\n // update the 'current' rect without modifications\n if (edges.top ) { current.top += dy; }\n if (edges.bottom) { current.bottom += dy; }\n if (edges.left ) { current.left += dx; }\n if (edges.right ) { current.right += dx; }\n\n if (invertible) {\n // if invertible, copy the current rect\n utils.extend(inverted, current);\n\n if (invert === 'reposition') {\n // swap edge values if necessary to keep width/height positive\n let swap;\n\n if (inverted.top > inverted.bottom) {\n swap = inverted.top;\n\n inverted.top = inverted.bottom;\n inverted.bottom = swap;\n }\n if (inverted.left > inverted.right) {\n swap = inverted.left;\n\n inverted.left = inverted.right;\n inverted.right = swap;\n }\n }\n }\n else {\n // if not invertible, restrict to minimum of 0x0 rect\n inverted.top = Math.min(current.top, start.bottom);\n inverted.bottom = Math.max(current.bottom, start.top);\n inverted.left = Math.min(current.left, start.right);\n inverted.right = Math.max(current.right, start.left);\n }\n\n inverted.width = inverted.right - inverted.left;\n inverted.height = inverted.bottom - inverted.top ;\n\n for (const edge in inverted) {\n delta[edge] = inverted[edge] - previous[edge];\n }\n\n iEvent.edges = interaction.prepared.edges;\n iEvent.rect = inverted;\n iEvent.deltaRect = delta;\n});\n\n/*\\\n * Interactable.resizable\n [ method ]\n *\n * Gets or sets whether resize actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of resize elements\n | var isResizeable = interact('input[type=text]').resizable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on resize events (object makes the Interactable resizable)\n = (object) This Interactable\n | interact(element).resizable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | edges: {\n | top : true, // Use pointer coords to check for resize.\n | left : false, // Disable resizing from left edge.\n | bottom: '.resize-s',// Resize if pointer target matches selector\n | right : handleEl // Resize if pointer target is the given Element\n | },\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height are adjusted at a 1:1 ratio.\n | square: false,\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height maintain the aspect ratio they had when resizing started.\n | preserveAspectRatio: false,\n |\n | // a value of 'none' will limit the resize rect to a minimum of 0x0\n | // 'negate' will allow the rect to have negative width/height\n | // 'reposition' will keep the width/height positive by swapping\n | // the top and bottom edges and/or swapping the left and right edges\n | invert: 'none' || 'negate' || 'reposition'\n |\n | // limit multiple resizes.\n | // See the explanation in the @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n \\*/\nInteractable.prototype.resizable = function (options) {\n if (utils.is.object(options)) {\n this.options.resize.enabled = options.enabled === false? false: true;\n this.setPerAction('resize', options);\n this.setOnEvents('resize', options);\n\n if (/^x$|^y$|^xy$/.test(options.axis)) {\n this.options.resize.axis = options.axis;\n }\n else if (options.axis === null) {\n this.options.resize.axis = defaultOptions.resize.axis;\n }\n\n if (utils.is.bool(options.preserveAspectRatio)) {\n this.options.resize.preserveAspectRatio = options.preserveAspectRatio;\n }\n else if (utils.is.bool(options.square)) {\n this.options.resize.square = options.square;\n }\n\n return this;\n }\n if (utils.is.bool(options)) {\n this.options.resize.enabled = options;\n\n if (!options) {\n this.onresizestart = this.onresizestart = this.onresizeend = null;\n }\n\n return this;\n }\n return this.options.resize;\n};\n\nfunction checkResizeEdge (name, value, page, element, interactableElement, rect, margin) {\n // false, '', undefined, null\n if (!value) { return false; }\n\n // true value, use pointer coords and element rect\n if (value === true) {\n // if dimensions are negative, \"switch\" edges\n const width = utils.is.number(rect.width )? rect.width : rect.right - rect.left;\n const height = utils.is.number(rect.height)? rect.height : rect.bottom - rect.top ;\n\n if (width < 0) {\n if (name === 'left' ) { name = 'right'; }\n else if (name === 'right') { name = 'left' ; }\n }\n if (height < 0) {\n if (name === 'top' ) { name = 'bottom'; }\n else if (name === 'bottom') { name = 'top' ; }\n }\n\n if (name === 'left' ) { return page.x < ((width >= 0? rect.left: rect.right ) + margin); }\n if (name === 'top' ) { return page.y < ((height >= 0? rect.top : rect.bottom) + margin); }\n\n if (name === 'right' ) { return page.x > ((width >= 0? rect.right : rect.left) - margin); }\n if (name === 'bottom') { return page.y > ((height >= 0? rect.bottom: rect.top ) - margin); }\n }\n\n // the remaining checks require an element\n if (!utils.is.element(element)) { return false; }\n\n return utils.is.element(value)\n // the value is an element to use as a resize handle\n ? value === element\n // otherwise check if element matches value as selector\n : utils.matchesUpTo(element, value, interactableElement);\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.resizeAxes = 'xy';\n});\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action }) {\n if (action !== 'resize' || !interaction.resizeAxes) { return; }\n\n const options = interaction.target.options;\n\n if (options.resize.square) {\n if (interaction.resizeAxes === 'y') {\n iEvent.dx = iEvent.dy;\n }\n else {\n iEvent.dy = iEvent.dx;\n }\n iEvent.axes = 'xy';\n }\n else {\n iEvent.axes = interaction.resizeAxes;\n\n if (interaction.resizeAxes === 'x') {\n iEvent.dy = 0;\n }\n else if (interaction.resizeAxes === 'y') {\n iEvent.dx = 0;\n }\n }\n});\n\nactions.resize = resize;\nactions.names.push('resize');\nutils.merge(Interactable.eventTypes, [\n 'resizestart',\n 'resizemove',\n 'resizeinertiastart',\n 'resizeinertiaresume',\n 'resizeend',\n]);\nactions.methodDict.resize = 'resizable';\n\ndefaultOptions.resize = resize.defaults;\n\nmodule.exports = resize;\n","const raf = require('./utils/raf');\nconst getWindow = require('./utils/window').getWindow;\nconst is = require('./utils/is');\nconst domUtils = require('./utils/domUtils');\nconst Interaction = require('./Interaction');\nconst defaultOptions = require('./defaultOptions');\n\nconst autoScroll = {\n defaults: {\n enabled : false,\n container: null, // the item that is scrolled (Window or HTMLElement)\n margin : 60,\n speed : 300, // the scroll speed in pixels per second\n },\n\n interaction: null,\n i: null, // the handle returned by window.setInterval\n x: 0, y: 0, // Direction each pulse is to scroll in\n\n isScrolling: false,\n prevTime: 0,\n\n start: function (interaction) {\n autoScroll.isScrolling = true;\n raf.cancel(autoScroll.i);\n\n autoScroll.interaction = interaction;\n autoScroll.prevTime = new Date().getTime();\n autoScroll.i = raf.request(autoScroll.scroll);\n },\n\n stop: function () {\n autoScroll.isScrolling = false;\n raf.cancel(autoScroll.i);\n },\n\n // scroll the window by the values in scroll.x/y\n scroll: function () {\n const options = autoScroll.interaction.target.options[autoScroll.interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(autoScroll.interaction.element);\n const now = new Date().getTime();\n // change in time in seconds\n const dt = (now - autoScroll.prevTime) / 1000;\n // displacement\n const s = options.speed * dt;\n\n if (s >= 1) {\n if (is.window(container)) {\n container.scrollBy(autoScroll.x * s, autoScroll.y * s);\n }\n else if (container) {\n container.scrollLeft += autoScroll.x * s;\n container.scrollTop += autoScroll.y * s;\n }\n\n autoScroll.prevTime = now;\n }\n\n if (autoScroll.isScrolling) {\n raf.cancel(autoScroll.i);\n autoScroll.i = raf.request(autoScroll.scroll);\n }\n },\n check: function (interactable, actionName) {\n const options = interactable.options;\n\n return options[actionName].autoScroll && options[actionName].autoScroll.enabled;\n },\n onInteractionMove: function ({ interaction, pointer }) {\n if (!(interaction.interacting()\n && autoScroll.check(interaction.target, interaction.prepared.name))) {\n return;\n }\n\n if (interaction.simulation) {\n autoScroll.x = autoScroll.y = 0;\n return;\n }\n\n let top;\n let right;\n let bottom;\n let left;\n\n const options = interaction.target.options[interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(interaction.element);\n\n if (is.window(container)) {\n left = pointer.clientX < autoScroll.margin;\n top = pointer.clientY < autoScroll.margin;\n right = pointer.clientX > container.innerWidth - autoScroll.margin;\n bottom = pointer.clientY > container.innerHeight - autoScroll.margin;\n }\n else {\n const rect = domUtils.getElementClientRect(container);\n\n left = pointer.clientX < rect.left + autoScroll.margin;\n top = pointer.clientY < rect.top + autoScroll.margin;\n right = pointer.clientX > rect.right - autoScroll.margin;\n bottom = pointer.clientY > rect.bottom - autoScroll.margin;\n }\n\n autoScroll.x = (right ? 1: left? -1: 0);\n autoScroll.y = (bottom? 1: top? -1: 0);\n\n if (!autoScroll.isScrolling) {\n // set the autoScroll properties to those of the target\n autoScroll.margin = options.margin;\n autoScroll.speed = options.speed;\n\n autoScroll.start(interaction);\n }\n },\n};\n\nInteraction.signals.on('stop-active', function () {\n autoScroll.stop();\n});\n\nInteraction.signals.on('action-move', autoScroll.onInteractionMove);\n\ndefaultOptions.perAction.autoScroll = autoScroll.defaults;\n\nmodule.exports = autoScroll;\n","const Interactable = require('../Interactable');\nconst actions = require('../actions/base');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.ignoreFrom\n [ method ]\n *\n * If the target of the `mousedown`, `pointerdown` or `touchstart`\n * event or any of it's parents match the given CSS selector or\n * Element, no drag/resize/gesture is started.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to not ignore any elements\n = (string | Element | object) The current ignoreFrom value or this Interactable\n **\n | interact(element, { ignoreFrom: document.getElementById('no-action') });\n | // or\n | interact(element).ignoreFrom('input, textarea, a');\n\\*/\nInteractable.prototype.ignoreFrom = function (newValue) {\n return this._backCompatOption('ignoreFrom', newValue);\n};\n\n/*\\\n * Interactable.allowFrom\n [ method ]\n *\n * A drag/resize/gesture is started only If the target of the\n * `mousedown`, `pointerdown` or `touchstart` event or any of it's\n * parents match the given CSS selector or Element.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to allow from any element\n = (string | Element | object) The current allowFrom value or this Interactable\n **\n | interact(element, { allowFrom: document.getElementById('drag-handle') });\n | // or\n | interact(element).allowFrom('.handle');\n\\*/\nInteractable.prototype.allowFrom = function (newValue) {\n return this._backCompatOption('allowFrom', newValue);\n};\n\nInteractable.prototype.testIgnore = function (ignoreFrom, interactableElement, element) {\n if (!ignoreFrom || !is.element(element)) { return false; }\n\n if (is.string(ignoreFrom)) {\n return domUtils.matchesUpTo(element, ignoreFrom, interactableElement);\n }\n else if (is.element(ignoreFrom)) {\n return domUtils.nodeContains(ignoreFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testAllow = function (allowFrom, interactableElement, element) {\n if (!allowFrom) { return true; }\n\n if (!is.element(element)) { return false; }\n\n if (is.string(allowFrom)) {\n return domUtils.matchesUpTo(element, allowFrom, interactableElement);\n }\n else if (is.element(allowFrom)) {\n return domUtils.nodeContains(allowFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testIgnoreAllow = function (options, interactableElement, eventTarget) {\n return (!this.testIgnore(options.ignoreFrom, interactableElement, eventTarget)\n && this.testAllow(options.allowFrom, interactableElement, eventTarget));\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (event.buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\n","const interact = require('../interact');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst actions = require('../actions/base');\nconst defaultOptions = require('../defaultOptions');\nconst browser = require('../utils/browser');\nconst scope = require('../scope');\nconst utils = require('../utils');\nconst signals = require('../utils/Signals').new();\n\nrequire('./InteractableMethods');\n\nconst autoStart = {\n signals,\n withinInteractionLimit,\n // Allow this many interactions to happen simultaneously\n maxInteractions: Infinity,\n defaults: {\n perAction: {\n manualStart: false,\n max: Infinity,\n maxPerElement: 1,\n allowFrom: null,\n ignoreFrom: null,\n },\n },\n setActionDefaults: function (action) {\n utils.extend(action.defaults, autoStart.defaults.perAction);\n },\n};\n\n// set cursor style on mousedown\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget }) {\n if (interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\n// set cursor style on mousemove\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget }) {\n if (!interaction.mouse\n || interaction.pointerIsDown\n || interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\nInteraction.signals.on('move', function (arg) {\n const { interaction, event } = arg;\n\n if (!interaction.pointerIsDown\n || interaction.interacting()\n || !interaction.pointerWasMoved\n || !interaction.prepared.name) {\n return;\n }\n\n signals.fire('before-start', arg);\n\n const target = interaction.target;\n\n if (interaction.prepared.name && target) {\n // check manualStart and interaction limit\n if (target.options[interaction.prepared.name].manualStart\n || !withinInteractionLimit(target, interaction.element, interaction.prepared)) {\n interaction.stop(event);\n }\n else {\n interaction.start(interaction.prepared, target, interaction.element);\n }\n }\n});\n\n// Check if the current target supports the action.\n// If so, return the validated action. Otherwise, return null\nfunction validateAction (action, interactable, element, eventTarget) {\n if (utils.is.object(action)\n && interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget)\n && interactable.options[action.name].enabled\n && withinInteractionLimit(interactable, element, action)) {\n return action;\n }\n\n return null;\n}\n\nfunction validateSelector (interaction, pointer, event, matches, matchElements, eventTarget) {\n for (let i = 0, len = matches.length; i < len; i++) {\n const match = matches[i];\n const matchElement = matchElements[i];\n const action = validateAction(match.getAction(pointer, event, interaction, matchElement),\n match,\n matchElement,\n eventTarget);\n\n if (action) {\n return {\n action,\n target: match,\n element: matchElement,\n };\n }\n }\n\n return {};\n}\n\nfunction getActionInfo (interaction, pointer, event, eventTarget) {\n let matches = [];\n let matchElements = [];\n\n let element = eventTarget;\n let action = null;\n\n function pushMatches (interactable, selector, context) {\n const elements = (browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined);\n\n if (utils.matchesSelector(element, selector, elements)) {\n\n matches.push(interactable);\n matchElements.push(element);\n }\n }\n\n while (utils.is.element(element)) {\n matches = [];\n matchElements = [];\n\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && (action = validateAction(elementInteractable.getAction(pointer, event, interaction, element, eventTarget),\n elementInteractable,\n element,\n eventTarget))\n && !elementInteractable.options[action.name].manualStart) {\n return {\n element,\n action,\n target: elementInteractable,\n };\n }\n else {\n scope.interactables.forEachSelector(pushMatches, element);\n\n const actionInfo = validateSelector(interaction, pointer, event, matches, matchElements, eventTarget);\n\n if (actionInfo.action\n && !actionInfo.target.options[actionInfo.action.name].manualStart) {\n return actionInfo;\n }\n }\n\n element = utils.parentNode(element);\n }\n\n return {};\n}\n\nfunction prepare (interaction, { action, target, element }) {\n action = action || {};\n\n if (interaction.target && interaction.target.options.styleCursor) {\n interaction.target._doc.documentElement.style.cursor = '';\n }\n\n interaction.target = target;\n interaction.element = element;\n utils.copyAction(interaction.prepared, action);\n\n if (target && target.options.styleCursor) {\n const cursor = action? actions[action.name].getCursor(action) : '';\n interaction.target._doc.documentElement.style.cursor = cursor;\n }\n\n signals.fire('prepared', { interaction: interaction });\n}\n\nInteraction.signals.on('stop', function ({ interaction }) {\n const target = interaction.target;\n\n if (target && target.options.styleCursor) {\n target._doc.documentElement.style.cursor = '';\n }\n});\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (utils.is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (utils.is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n const buttons = event.buttons || ({\n 0: 1,\n 1: 4,\n 3: 8,\n 4: 16,\n })[event.button];\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\nfunction withinInteractionLimit (interactable, element, action) {\n const options = interactable.options;\n const maxActions = options[action.name].max;\n const maxPerElement = options[action.name].maxPerElement;\n let activeInteractions = 0;\n let targetCount = 0;\n let targetElementCount = 0;\n\n // no actions if any of these values == 0\n if (!(maxActions && maxPerElement && autoStart.maxInteractions)) { return; }\n\n for (let i = 0, len = scope.interactions.length; i < len; i++) {\n const interaction = scope.interactions[i];\n const otherAction = interaction.prepared.name;\n\n if (!interaction.interacting()) { continue; }\n\n activeInteractions++;\n\n if (activeInteractions >= autoStart.maxInteractions) {\n return false;\n }\n\n if (interaction.target !== interactable) { continue; }\n\n targetCount += (otherAction === action.name)|0;\n\n if (targetCount >= maxActions) {\n return false;\n }\n\n if (interaction.element === element) {\n targetElementCount++;\n\n if (otherAction !== action.name || targetElementCount >= maxPerElement) {\n return false;\n }\n }\n }\n\n return autoStart.maxInteractions > 0;\n}\n\n/*\\\n * interact.maxInteractions\n [ method ]\n **\n * Returns or sets the maximum number of concurrent interactions allowed.\n * By default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables\n * and elements, you need to enable it in the draggable, resizable and\n * gesturable `'max'` and `'maxPerElement'` options.\n **\n - newValue (number) #optional Any number. newValue <= 0 means no interactions.\n\\*/\ninteract.maxInteractions = function (newValue) {\n if (utils.is.number(newValue)) {\n autoStart.maxInteractions = newValue;\n\n return this;\n }\n\n return autoStart.maxInteractions;\n};\n\nInteractable.settingsMethods.push('styleCursor');\nInteractable.settingsMethods.push('actionChecker');\nInteractable.settingsMethods.push('ignoreFrom');\nInteractable.settingsMethods.push('allowFrom');\n\ndefaultOptions.base.actionChecker = null;\ndefaultOptions.base.styleCursor = true;\n\nutils.extend(defaultOptions.perAction, autoStart.defaults.perAction);\n\nmodule.exports = autoStart;\n","const autoStart = require('./base');\nconst Interaction = require('../Interaction');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.delayTimer = null;\n});\n\nautoStart.signals.on('prepared', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.delayTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.target, interaction.element);\n }, delay);\n }\n});\n\nInteraction.signals.on('move', function ({ interaction, duplicate }) {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.delayTimer);\n }\n});\n\n// prevent regular down->move autoStart\nautoStart.signals.on('before-start', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.prepared.name = null;\n }\n});\n","const autoStart = require('./base');\nconst scope = require('../scope');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\n\nconst { matchesSelector, parentNode } = require('../utils/domUtils');\n\nautoStart.setActionDefaults(require('../actions/drag'));\n\nautoStart.signals.on('before-start', function ({ interaction, eventTarget, dx, dy }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // check if a drag is in the correct axis\n const absX = Math.abs(dx);\n const absY = Math.abs(dy);\n const options = interaction.target.options.drag;\n const startAxis = options.startAxis;\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy');\n\n interaction.prepared.axis = options.lockAxis === 'start'\n ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n : options.lockAxis;\n\n // if the movement isn't in the startAxis of the interactable\n if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) {\n // cancel the prepared action\n interaction.prepared.name = null;\n\n // then try to get a drag from another ineractable\n\n if (!interaction.prepared.name) {\n\n let element = eventTarget;\n\n const getDraggable = function (interactable, selector, context) {\n const elements = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n if (interactable === interaction.target) { return; }\n\n if (!options.manualStart\n && !interactable.testIgnoreAllow(options, element, eventTarget)\n && matchesSelector(element, selector, elements)) {\n\n const action = interactable.getAction(interaction.downPointer,\n interaction.downEvent,\n interaction,\n element);\n\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, interactable)\n && autoStart.validateAction(action, interactable, element, eventTarget)) {\n\n return interactable;\n }\n }\n };\n\n let action = null;\n\n // check all interactables\n while (is.element(element)) {\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && elementInteractable !== interaction.target\n && !elementInteractable.options.drag.manualStart) {\n\n action = elementInteractable.getAction(interaction.downPointer, interaction.downEvent, interaction, element);\n }\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, elementInteractable)) {\n\n interaction.prepared.name = 'drag';\n interaction.target = elementInteractable;\n interaction.element = element;\n break;\n }\n\n const selectorInteractable = scope.interactables.forEachSelector(getDraggable, element);\n\n if (selectorInteractable) {\n interaction.prepared.name = 'drag';\n interaction.target = selectorInteractable;\n interaction.element = element;\n break;\n }\n\n element = parentNode(element);\n }\n }\n }\n});\n\nfunction checkStartAxis (startAxis, interactable) {\n if (!interactable) { return false; }\n\n const thisAxis = interactable.options.drag.startAxis;\n\n return (startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis);\n}\n","require('./base').setActionDefaults(require('../actions/gesture'));\n","require('./base').setActionDefaults(require('../actions/resize'));\n","module.exports = {\n base: {\n accept : null,\n preventDefault: 'auto',\n deltaSource : 'page',\n },\n\n perAction: {\n origin: { x: 0, y: 0 },\n\n // only allow left button by default\n // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n mouseButtons: 1,\n\n inertia: {\n enabled : false,\n resistance : 10, // the lambda in exponential decay\n minSpeed : 100, // target speed must be above this for inertia to start\n endSpeed : 10, // the speed at which inertia is slow enough to stop\n allowResume : true, // allow resuming an action in inertia phase\n smoothEndDuration: 300, // animate to snap/restrict endOnly if there's no inertia\n },\n },\n};\n","/* browser entry point */\n\n// Legacy browser support\nrequire('./legacyBrowsers');\n\n// inertia\nrequire('./inertia');\n\n// modifiers\nrequire('./modifiers/snap');\nrequire('./modifiers/restrict');\n\n// pointerEvents\nrequire('./pointerEvents/base');\nrequire('./pointerEvents/holdRepeat');\nrequire('./pointerEvents/interactableTargets');\n\n// delay\nrequire('./autoStart/delay');\n\n// actions\nrequire('./actions/gesture');\nrequire('./actions/resize');\nrequire('./actions/drag');\nrequire('./actions/drop');\n\n// load these modifiers after resize is loaded\nrequire('./modifiers/snapSize');\nrequire('./modifiers/restrictEdges');\nrequire('./modifiers/restrictSize');\n\n// autoStart actions\nrequire('./autoStart/gesture');\nrequire('./autoStart/resize');\nrequire('./autoStart/drag');\n\n// Interactable preventDefault setting\nrequire('./interactablePreventDefault.js');\n\n// autoScroll\nrequire('./autoScroll');\n\n// export interact\nmodule.exports = require('./interact');\n","const InteractEvent = require('./InteractEvent');\nconst Interaction = require('./Interaction');\nconst modifiers = require('./modifiers');\nconst utils = require('./utils');\nconst animationFrame = require('./utils/raf');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.inertiaStatus = {\n active : false,\n smoothEnd : false,\n allowResume: false,\n\n startEvent: null,\n upCoords : {},\n\n xe: 0, ye: 0,\n sx: 0, sy: 0,\n\n t0: 0,\n vx0: 0, vys: 0,\n duration: 0,\n\n lambda_v0: 0,\n one_ve_v0: 0,\n i : null,\n };\n\n interaction.boundInertiaFrame = () => inertiaFrame .apply(interaction);\n interaction.boundSmoothEndFrame = () => smoothEndFrame.apply(interaction);\n});\n\nInteraction.signals.on('down', function ({ interaction, event, pointer, eventTarget }) {\n const status = interaction.inertiaStatus;\n\n // Check if the down event hits the current inertia target\n if (status.active) {\n let element = eventTarget;\n\n // climb up the DOM tree from the event target\n while (utils.is.element(element)) {\n\n // if interaction element is the current inertia target element\n if (element === interaction.element) {\n // stop inertia\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n\n // update pointers to the down event's coordinates\n interaction.updatePointer(pointer);\n utils.setCoords(interaction.curCoords, interaction.pointers);\n\n // fire appropriate signals\n const signalArg = { interaction };\n Interaction.signals.fire('before-action-move', signalArg);\n Interaction.signals.fire('action-resume' , signalArg);\n\n // fire a reume event\n const resumeEvent = new InteractEvent(interaction,\n event,\n interaction.prepared.name,\n 'inertiaresume',\n interaction.element);\n\n interaction.target.fire(resumeEvent);\n interaction.prevEvent = resumeEvent;\n modifiers.resetStatuses(interaction.modifierStatuses);\n\n utils.copyCoords(interaction.prevCoords, interaction.curCoords);\n break;\n }\n\n element = utils.parentNode(element);\n }\n }\n});\n\nInteraction.signals.on('up', function ({ interaction, event }) {\n const status = interaction.inertiaStatus;\n\n if (!interaction.interacting() || status.active) { return; }\n\n const target = interaction.target;\n const options = target && target.options;\n const inertiaOptions = options && interaction.prepared.name && options[interaction.prepared.name].inertia;\n\n const now = new Date().getTime();\n const statuses = {};\n const page = utils.extend({}, interaction.curCoords.page);\n const pointerSpeed = interaction.pointerDelta.client.speed;\n\n let smoothEnd = false;\n let modifierResult;\n\n // check if inertia should be started\n const inertiaPossible = (inertiaOptions && inertiaOptions.enabled\n && interaction.prepared.name !== 'gesture'\n && event !== status.startEvent);\n\n const inertia = (inertiaPossible\n && (now - interaction.curCoords.timeStamp) < 50\n && pointerSpeed > inertiaOptions.minSpeed\n && pointerSpeed > inertiaOptions.endSpeed);\n\n const modifierArg = {\n interaction,\n pageCoords: page,\n statuses,\n preEnd: true,\n requireEndOnly: true,\n };\n\n // smoothEnd\n if (inertiaPossible && !inertia) {\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n if (modifierResult.shouldMove && modifierResult.locked) {\n smoothEnd = true;\n }\n }\n\n if (!(inertia || smoothEnd)) { return; }\n\n utils.copyCoords(status.upCoords, interaction.curCoords);\n\n interaction.pointers[0] = status.startEvent =\n new InteractEvent(interaction, event, interaction.prepared.name, 'inertiastart', interaction.element);\n\n status.t0 = now;\n\n status.active = true;\n status.allowResume = inertiaOptions.allowResume;\n interaction.simulation = status;\n\n target.fire(status.startEvent);\n\n if (inertia) {\n status.vx0 = interaction.pointerDelta.client.vx;\n status.vy0 = interaction.pointerDelta.client.vy;\n status.v0 = pointerSpeed;\n\n calcInertia(interaction, status);\n\n utils.extend(page, interaction.curCoords.page);\n\n page.x += status.xe;\n page.y += status.ye;\n\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n status.modifiedXe += modifierResult.dx;\n status.modifiedYe += modifierResult.dy;\n\n status.i = animationFrame.request(interaction.boundInertiaFrame);\n }\n else {\n status.smoothEnd = true;\n status.xe = modifierResult.dx;\n status.ye = modifierResult.dy;\n\n status.sx = status.sy = 0;\n\n status.i = animationFrame.request(interaction.boundSmoothEndFrame);\n }\n});\n\nInteraction.signals.on('stop-active', function ({ interaction }) {\n const status = interaction.inertiaStatus;\n\n if (status.active) {\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n }\n});\n\nfunction calcInertia (interaction, status) {\n const inertiaOptions = interaction.target.options[interaction.prepared.name].inertia;\n const lambda = inertiaOptions.resistance;\n const inertiaDur = -Math.log(inertiaOptions.endSpeed / status.v0) / lambda;\n\n status.x0 = interaction.prevEvent.pageX;\n status.y0 = interaction.prevEvent.pageY;\n status.t0 = status.startEvent.timeStamp / 1000;\n status.sx = status.sy = 0;\n\n status.modifiedXe = status.xe = (status.vx0 - inertiaDur) / lambda;\n status.modifiedYe = status.ye = (status.vy0 - inertiaDur) / lambda;\n status.te = inertiaDur;\n\n status.lambda_v0 = lambda / status.v0;\n status.one_ve_v0 = 1 - inertiaOptions.endSpeed / status.v0;\n}\n\nfunction inertiaFrame () {\n updateInertiaCoords(this);\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n\n const status = this.inertiaStatus;\n const options = this.target.options[this.prepared.name].inertia;\n const lambda = options.resistance;\n const t = new Date().getTime() / 1000 - status.t0;\n\n if (t < status.te) {\n\n const progress = 1 - (Math.exp(-lambda * t) - status.lambda_v0) / status.one_ve_v0;\n\n if (status.modifiedXe === status.xe && status.modifiedYe === status.ye) {\n status.sx = status.xe * progress;\n status.sy = status.ye * progress;\n }\n else {\n const quadPoint = utils.getQuadraticCurvePoint(0, 0,\n status.xe,\n status.ye,\n status.modifiedXe,\n status.modifiedYe,\n progress);\n\n status.sx = quadPoint.x;\n status.sy = quadPoint.y;\n }\n\n this.doMove();\n\n status.i = animationFrame.request(this.boundInertiaFrame);\n }\n else {\n status.sx = status.modifiedXe;\n status.sy = status.modifiedYe;\n\n this.doMove();\n this.end(status.startEvent);\n status.active = false;\n this.simulation = null;\n }\n\n utils.copyCoords(this.prevCoords, this.curCoords);\n}\n\nfunction smoothEndFrame () {\n updateInertiaCoords(this);\n\n const status = this.inertiaStatus;\n const t = new Date().getTime() - status.t0;\n const duration = this.target.options[this.prepared.name].inertia.smoothEndDuration;\n\n if (t < duration) {\n status.sx = utils.easeOutQuad(t, 0, status.xe, duration);\n status.sy = utils.easeOutQuad(t, 0, status.ye, duration);\n\n this.pointerMove(status.startEvent, status.startEvent);\n\n status.i = animationFrame.request(this.boundSmoothEndFrame);\n }\n else {\n status.sx = status.xe;\n status.sy = status.ye;\n\n this.pointerMove(status.startEvent, status.startEvent);\n this.end(status.startEvent);\n\n status.smoothEnd =\n status.active = false;\n this.simulation = null;\n }\n}\n\nfunction updateInertiaCoords (interaction) {\n const status = interaction.inertiaStatus;\n\n // return if inertia isn't running\n if (!status.active) { return; }\n\n const pageUp = status.upCoords.page;\n const clientUp = status.upCoords.client;\n\n utils.setCoords(interaction.curCoords, [ {\n pageX : pageUp.x + status.sx,\n pageY : pageUp.y + status.sy,\n clientX: clientUp.x + status.sx,\n clientY: clientUp.y + status.sy,\n } ]);\n}\n","const browser = require('./utils/browser');\nconst events = require('./utils/events');\nconst utils = require('./utils');\nconst scope = require('./scope');\nconst Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\n\nconst globalEvents = {};\n\n/*\\\n * interact\n [ method ]\n *\n * The methods of this variable can be used to set elements as\n * interactables and also to change various default settings.\n *\n * Calling it as a function and passing an element or a valid CSS selector\n * string returns an Interactable object which has various methods to\n * configure it.\n *\n - element (Element | string) The HTML or SVG Element to interact with or CSS selector\n = (object) An @Interactable\n *\n > Usage\n | interact('#draggable').draggable(true);\n |\n | var rectables = interact('rect');\n | rectables\n | .gesturable(true)\n | .on('gesturemove', function (event) {\n | // ...\n | });\n\\*/\nfunction interact (element, options) {\n let interactable = scope.interactables.get(element, options);\n\n if (!interactable) {\n interactable = new Interactable(element, options);\n interactable.events.global = globalEvents;\n }\n\n return interactable;\n}\n\n/*\\\n * interact.isSet\n [ method ]\n *\n * Check if an element has been set\n - element (Element) The Element being searched for\n = (boolean) Indicates if the element or CSS selector was previously passed to interact\n\\*/\ninteract.isSet = function (element, options) {\n return scope.interactables.indexOfElement(element, options && options.context) !== -1;\n};\n\n/*\\\n * interact.on\n [ method ]\n *\n * Adds a global listener for an InteractEvent or adds a DOM event to\n * `document`\n *\n - type (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) interact\n\\*/\ninteract.on = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.on(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.on(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n // if it is an InteractEvent type, add listener to globalEvents\n if (utils.contains(Interactable.eventTypes, type)) {\n // if this type of event was never bound\n if (!globalEvents[type]) {\n globalEvents[type] = [listener];\n }\n else {\n globalEvents[type].push(listener);\n }\n }\n // If non InteractEvent type, addEventListener to document\n else {\n events.add(scope.document, type, listener, { options });\n }\n\n return interact;\n};\n\n/*\\\n * interact.off\n [ method ]\n *\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n - type (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) interact\n \\*/\ninteract.off = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.off(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.off(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n if (!utils.contains(Interactable.eventTypes, type)) {\n events.remove(scope.document, type, listener, options);\n }\n else {\n let index;\n\n if (type in globalEvents\n && (index = utils.indexOf(globalEvents[type], listener)) !== -1) {\n globalEvents[type].splice(index, 1);\n }\n }\n\n return interact;\n};\n\n/*\\\n * interact.debug\n [ method ]\n *\n * Returns an object which exposes internal data\n = (object) An object with properties that outline the current state and expose internal functions and variables\n\\*/\ninteract.debug = function () {\n return scope;\n};\n\n// expose the functions used to calculate multi-touch properties\ninteract.getPointerAverage = utils.pointerAverage;\ninteract.getTouchBBox = utils.touchBBox;\ninteract.getTouchDistance = utils.touchDistance;\ninteract.getTouchAngle = utils.touchAngle;\n\ninteract.getElementRect = utils.getElementRect;\ninteract.getElementClientRect = utils.getElementClientRect;\ninteract.matchesSelector = utils.matchesSelector;\ninteract.closest = utils.closest;\n\n/*\\\n * interact.supportsTouch\n [ method ]\n *\n = (boolean) Whether or not the browser supports touch input\n\\*/\ninteract.supportsTouch = function () {\n return browser.supportsTouch;\n};\n\n/*\\\n * interact.supportsPointerEvent\n [ method ]\n *\n = (boolean) Whether or not the browser supports PointerEvents\n\\*/\ninteract.supportsPointerEvent = function () {\n return browser.supportsPointerEvent;\n};\n\n/*\\\n * interact.stop\n [ method ]\n *\n * Cancels all interactions (end events are not fired)\n *\n - event (Event) An event on which to call preventDefault()\n = (object) interact\n\\*/\ninteract.stop = function (event) {\n for (let i = scope.interactions.length - 1; i >= 0; i--) {\n scope.interactions[i].stop(event);\n }\n\n return interact;\n};\n\n/*\\\n * interact.pointerMoveTolerance\n [ method ]\n * Returns or sets the distance the pointer must be moved before an action\n * sequence occurs. This also affects tolerance for tap events.\n *\n - newValue (number) #optional The movement from the start position must be greater than this value\n = (number | Interactable) The current setting or interact\n\\*/\ninteract.pointerMoveTolerance = function (newValue) {\n if (utils.is.number(newValue)) {\n Interaction.pointerMoveTolerance = newValue;\n\n return this;\n }\n\n return Interaction.pointerMoveTolerance;\n};\n\ninteract.addDocument = scope.addDocument;\ninteract.removeDocument = scope.removeDocument;\n\nscope.interact = interact;\n\nmodule.exports = interact;\n","const Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\nconst scope = require('./scope');\nconst is = require('./utils/is');\nconst events = require('./utils/events');\n\nconst { nodeContains, matchesSelector } = require('./utils/domUtils');\n\n/*\\\n * Interactable.preventDefault\n [ method ]\n *\n * Returns or sets whether to prevent the browser's default behaviour\n * in response to pointer events. Can be set to:\n * - `'always'` to always prevent\n * - `'never'` to never prevent\n * - `'auto'` to let interact.js try to determine what would be best\n *\n - newValue (string) #optional `true`, `false` or `'auto'`\n = (string | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.preventDefault = function (newValue) {\n if (/^(always|never|auto)$/.test(newValue)) {\n this.options.preventDefault = newValue;\n return this;\n }\n\n if (is.bool(newValue)) {\n this.options.preventDefault = newValue? 'always' : 'never';\n return this;\n }\n\n return this.options.preventDefault;\n};\n\nInteractable.prototype.checkAndPreventDefault = function (event) {\n const setting = this.options.preventDefault;\n\n if (setting === 'never') { return; }\n\n if (setting === 'always') {\n event.preventDefault();\n return;\n }\n\n // setting === 'auto'\n\n // don't preventDefault if the browser supports passiveEvents\n // CSS touch-action and user-selecct should be used instead\n if (events.supportsOptions) {\n return;\n }\n\n // don't preventDefault of pointerdown events\n if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) {\n return;\n }\n\n // don't preventDefault on editable elements\n if (is.element(event.target)\n && matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) {\n return;\n }\n\n event.preventDefault();\n};\n\nfunction onInteractionEvent ({ interaction, event }) {\n if (interaction.target) {\n interaction.target.checkAndPreventDefault(event);\n }\n}\n\nfor (const eventSignal of ['down', 'move', 'up', 'cancel']) {\n Interaction.signals.on(eventSignal, onInteractionEvent);\n}\n\n// prevent native HTML5 drag on interact.js target elements\nInteraction.docEvents.dragstart = function preventNativeDrag (event) {\n for (const interaction of scope.interactions) {\n\n if (interaction.element\n && (interaction.element === event.target\n || nodeContains(interaction.element, event.target))) {\n\n interaction.target.checkAndPreventDefault(event);\n return;\n }\n }\n};\n","const scope = require('./scope');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst iFinder = require('./utils/interactionFinder');\nconst pointerEvents = require('./pointerEvents/base');\n\nconst { window } = require('./utils/window');\n\nconst toString = Object.prototype.toString;\n\nif (!window.Array.isArray) {\n window.Array.isArray = function (obj) {\n return toString.call(obj) === '[object Array]';\n };\n}\n\nif (!String.prototype.trim) {\n String.prototype.trim = function () {\n return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n };\n}\n\n// http://www.quirksmode.org/dom/events/click.html\n// >Events leading to dblclick\n//\n// IE8 doesn't fire down event before dblclick.\n// This workaround tries to fire a tap and doubletap after dblclick\nfunction onIE8Dblclick (event) {\n const eventTarget = event.target;\n const interaction = iFinder.search(event, event.type, eventTarget);\n\n if (!interaction) { return; }\n\n if (interaction.prevTap\n && event.clientX === interaction.prevTap.clientX\n && event.clientY === interaction.prevTap.clientY\n && eventTarget === interaction.prevTap.target) {\n\n interaction.downTargets[0] = eventTarget;\n interaction.downTimes [0] = new Date().getTime();\n\n pointerEvents.fire({\n interaction,\n event,\n eventTarget,\n pointer: event,\n type: 'tap',\n });\n }\n}\n\nif (browser.isIE8) {\n const selectFix = function (event) {\n for (const interaction of scope.interactions) {\n if (interaction.interacting()) {\n interaction.target.checkAndPreventDefault(event);\n }\n }\n };\n\n const onDocIE8 = function onDocIE8 ({ doc, win }, signalName) {\n const eventMethod = signalName.indexOf('listen') === 0\n ? events.add : events.remove;\n\n // For IE's lack of Event#preventDefault\n eventMethod(doc, 'selectstart', selectFix);\n\n if (pointerEvents) {\n eventMethod(doc, 'dblclick', onIE8Dblclick);\n }\n };\n\n scope.signals.on('add-document' , onDocIE8);\n scope.signals.on('remove-document', onDocIE8);\n}\n\nmodule.exports = null;\n","const InteractEvent = require('../InteractEvent');\nconst Interaction = require('../Interaction');\nconst extend = require('../utils/extend');\n\nconst modifiers = {\n names: [],\n\n setOffsets: function (arg) {\n const { interaction, pageCoords: page } = arg;\n const { target, element, startOffset } = interaction;\n const rect = target.getRect(element);\n\n if (rect) {\n startOffset.left = page.x - rect.left;\n startOffset.top = page.y - rect.top;\n\n startOffset.right = rect.right - page.x;\n startOffset.bottom = rect.bottom - page.y;\n\n if (!('width' in rect)) { rect.width = rect.right - rect.left; }\n if (!('height' in rect)) { rect.height = rect.bottom - rect.top ; }\n }\n else {\n startOffset.left = startOffset.top = startOffset.right = startOffset.bottom = 0;\n }\n\n arg.rect = rect;\n arg.interactable = target;\n arg.element = element;\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n\n arg.options = target.options[interaction.prepared.name][modifierName];\n\n if (!arg.options) {\n continue;\n }\n\n interaction.modifierOffsets[modifierName] = modifiers[modifierName].setOffset(arg);\n }\n },\n\n setAll: function (arg) {\n const { interaction, statuses, preEnd, requireEndOnly } = arg;\n const coords = extend({}, arg.pageCoords);\n const result = {\n dx: 0,\n dy: 0,\n changed: false,\n locked: false,\n shouldMove: true,\n };\n\n for (const modifierName of modifiers.names) {\n const modifier = modifiers[modifierName];\n const options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!shouldDo(options, preEnd, requireEndOnly)) { continue; }\n\n arg.status = arg.status = statuses[modifierName];\n arg.options = options;\n arg.offset = arg.interaction.modifierOffsets[modifierName];\n\n modifier.set(arg);\n\n if (arg.status.locked) {\n coords.x += arg.status.dx;\n coords.y += arg.status.dy;\n\n result.dx += arg.status.dx;\n result.dy += arg.status.dy;\n\n result.locked = true;\n }\n }\n\n // a move should be fired if:\n // - there are no modifiers enabled,\n // - no modifiers are \"locked\" i.e. have changed the pointer's coordinates, or\n // - the locked coords have changed since the last pointer move\n result.shouldMove = !arg.status || !result.locked || arg.status.changed;\n\n return result;\n },\n\n resetStatuses: function (statuses) {\n for (const modifierName of modifiers.names) {\n const status = statuses[modifierName] || {};\n\n status.dx = status.dy = 0;\n status.modifiedX = status.modifiedY = NaN;\n status.locked = false;\n status.changed = true;\n\n statuses[modifierName] = status;\n }\n\n return statuses;\n },\n\n start: function ({ interaction }, signalName) {\n const arg = {\n interaction,\n pageCoords: (signalName === 'action-resume' ?\n interaction.curCoords : interaction.startCoords).page,\n startOffset: interaction.startOffset,\n statuses: interaction.modifierStatuses,\n preEnd: false,\n requireEndOnly: false,\n };\n\n modifiers.setOffsets(arg);\n modifiers.resetStatuses(arg.statuses);\n\n arg.pageCoords = extend({}, interaction.startCoords.page);\n interaction.modifierResult = modifiers.setAll(arg);\n },\n};\n\nInteraction.signals.on('new', function (interaction) {\n interaction.startOffset = { left: 0, right: 0, top: 0, bottom: 0 };\n interaction.modifierOffsets = {};\n interaction.modifierStatuses = modifiers.resetStatuses({});\n interaction.modifierResult = null;\n});\n\nInteraction.signals.on('action-start' , modifiers.start);\nInteraction.signals.on('action-resume', modifiers.start);\n\nInteraction.signals.on('before-action-move', function ({ interaction, preEnd, interactingBeforeMove }) {\n const modifierResult = modifiers.setAll({\n interaction,\n preEnd,\n pageCoords: interaction.curCoords.page,\n statuses: interaction.modifierStatuses,\n requireEndOnly: false,\n });\n\n // don't fire an action move if a modifier would keep the event in the same\n // cordinates as before\n if (!modifierResult.shouldMove && interactingBeforeMove) {\n interaction._dontFireMove = true;\n }\n\n interaction.modifierResult = modifierResult;\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n for (let i = 0; i < modifiers.names.length; i++) {\n const options = interaction.target.options[interaction.prepared.name][modifiers.names[i]];\n\n // if the endOnly option is true for any modifier\n if (shouldDo(options, true, true)) {\n // fire a move event at the modified coordinates\n interaction.doMove({ event, preEnd: true });\n break;\n }\n }\n});\n\nInteractEvent.signals.on('set-xy', function (arg) {\n const { iEvent, interaction } = arg;\n const modifierArg = extend({}, arg);\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n modifierArg.options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!modifierArg.options) {\n continue;\n }\n\n const modifier = modifiers[modifierName];\n\n modifierArg.status = interaction.modifierStatuses[modifierName];\n\n iEvent[modifierName] = modifier.modifyCoords(modifierArg);\n }\n});\n\nfunction shouldDo (options, preEnd, requireEndOnly) {\n return (options && options.enabled\n && (preEnd || !options.endOnly)\n && (!requireEndOnly || options.endOnly));\n}\n\nmodule.exports = modifiers;\n","const modifiers = require('./index');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst restrict = {\n defaults: {\n enabled : false,\n endOnly : false,\n restriction: null,\n elementRect: null,\n },\n\n setOffset: function ({ rect, startOffset, options }) {\n const elementRect = options && options.elementRect;\n const offset = {};\n\n if (rect && elementRect) {\n offset.left = startOffset.left - (rect.width * elementRect.left);\n offset.top = startOffset.top - (rect.height * elementRect.top);\n\n offset.right = startOffset.right - (rect.width * (1 - elementRect.right));\n offset.bottom = startOffset.bottom - (rect.height * (1 - elementRect.bottom));\n }\n else {\n offset.left = offset.top = offset.right = offset.bottom = 0;\n }\n\n return offset;\n },\n\n set: function ({ pageCoords, interaction, status, options }) {\n if (!options) { return status; }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n\n const restriction = getRestrictionRect(options.restriction, interaction, page);\n\n if (!restriction) { return status; }\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n const rect = restriction;\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n const offset = interaction.modifierOffsets.restrict;\n\n // object is assumed to have\n // x, y, width, height or\n // left, top, right, bottom\n if ('x' in restriction && 'y' in restriction) {\n modifiedX = Math.max(Math.min(rect.x + rect.width - offset.right , page.x), rect.x + offset.left);\n modifiedY = Math.max(Math.min(rect.y + rect.height - offset.bottom, page.y), rect.y + offset.top );\n }\n else {\n modifiedX = Math.max(Math.min(rect.right - offset.right , page.x), rect.left + offset.left);\n modifiedY = Math.max(Math.min(rect.bottom - offset.bottom, page.y), rect.top + offset.top );\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const elementRect = options && options.elementRect;\n\n if (options && options.enabled\n && !(phase === 'start' && elementRect && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n getRestrictionRect,\n};\n\nfunction getRestrictionRect (value, interaction, page) {\n if (utils.is.function(value)) {\n return utils.resolveRectLike(value, interaction.target, interaction.element, [page.x, page.y, interaction]);\n } else {\n return utils.resolveRectLike(value, interaction.target, interaction.element);\n }\n}\n\nmodifiers.restrict = restrict;\nmodifiers.names.push('restrict');\n\ndefaultOptions.perAction.restrict = restrict.defaults;\n\nmodule.exports = restrict;\n","// This module adds the options.resize.restrictEdges setting which sets min and\n// max for the top, left, bottom and right edges of the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictEdges: {\n// inner: { top: 200, left: 200, right: 400, bottom: 400 },\n// outer: { top: 0, left: 0, right: 600, bottom: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst { getRestrictionRect } = require('./restrict');\n\nconst noInner = { top: +Infinity, left: +Infinity, bottom: -Infinity, right: -Infinity };\nconst noOuter = { top: -Infinity, left: -Infinity, bottom: +Infinity, right: +Infinity };\n\nconst restrictEdges = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n offset: null,\n },\n\n setOffset: function ({ interaction, startOffset, options }) {\n if (!options) {\n return utils.extend({}, startOffset);\n }\n\n const offset = getRestrictionRect(options.offset, interaction, interaction.startCoords.page);\n\n if (offset) {\n return {\n top: startOffset.top + offset.y,\n left: startOffset.left + offset.x,\n bottom: startOffset.bottom + offset.y,\n right: startOffset.right + offset.x,\n };\n }\n\n return startOffset;\n },\n\n set: function ({ pageCoords, interaction, status, offset, options }) {\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n const inner = rectUtils.xywhToTlbr(getRestrictionRect(options.inner, interaction, page)) || noInner;\n const outer = rectUtils.xywhToTlbr(getRestrictionRect(options.outer, interaction, page)) || noOuter;\n\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n if (edges.top) {\n modifiedY = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top);\n }\n else if (edges.bottom) {\n modifiedY = Math.max(Math.min(outer.bottom - offset.bottom, page.y), inner.bottom - offset.bottom);\n }\n if (edges.left) {\n modifiedX = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left);\n }\n else if (edges.right) {\n modifiedX = Math.max(Math.min(outer.right - offset.right, page.x), inner.right - offset.right);\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n if (options && options.enabled\n && !(phase === 'start' && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n noInner,\n noOuter,\n getRestrictionRect,\n};\n\nmodifiers.restrictEdges = restrictEdges;\nmodifiers.names.push('restrictEdges');\n\ndefaultOptions.perAction.restrictEdges = restrictEdges.defaults;\nresize.defaults.restrictEdges = restrictEdges.defaults;\n\nmodule.exports = restrictEdges;\n","// This module adds the options.resize.restrictSize setting which sets min and\n// max width and height for the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictSize: {\n// min: { width: -600, height: -600 },\n// max: { width: 600, height: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst restrictEdges = require('./restrictEdges');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst noMin = { width: -Infinity, height: -Infinity };\nconst noMax = { width: +Infinity, height: +Infinity };\n\nconst restrictSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n },\n\n setOffset: function ({ interaction }) {\n return interaction.startOffset;\n },\n\n set: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const rect = rectUtils.xywhToTlbr(interaction.resizeRects.inverted);\n\n const minSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.min, interaction)) || noMin;\n const maxSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.max, interaction)) || noMax;\n\n arg.options = {\n enabled: options.enabled,\n endOnly: options.endOnly,\n inner: utils.extend({}, restrictEdges.noInner),\n outer: utils.extend({}, restrictEdges.noOuter),\n };\n\n if (edges.top) {\n arg.options.inner.top = rect.bottom - minSize.height;\n arg.options.outer.top = rect.bottom - maxSize.height;\n }\n else if (edges.bottom) {\n arg.options.inner.bottom = rect.top + minSize.height;\n arg.options.outer.bottom = rect.top + maxSize.height;\n }\n if (edges.left) {\n arg.options.inner.left = rect.right - minSize.width;\n arg.options.outer.left = rect.right - maxSize.width;\n }\n else if (edges.right) {\n arg.options.inner.right = rect.left + minSize.width;\n arg.options.outer.right = rect.left + maxSize.width;\n }\n\n restrictEdges.set(arg);\n },\n\n modifyCoords: restrictEdges.modifyCoords,\n};\n\nmodifiers.restrictSize = restrictSize;\nmodifiers.names.push('restrictSize');\n\ndefaultOptions.perAction.restrictSize = restrictSize.defaults;\nresize.defaults.restrictSize = restrictSize.defaults;\n\nmodule.exports = restrictSize;\n","const modifiers = require('./index');\nconst interact = require('../interact');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst snap = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n\n relativePoints: null,\n },\n\n setOffset: function ({ interaction, interactable, element, rect, startOffset, options }) {\n const offsets = [];\n const optionsOrigin = utils.rectToXY(utils.resolveRectLike(options.origin));\n const origin = optionsOrigin || utils.getOriginXY(interactable, element, interaction.prepared.name);\n options = options || interactable.options[interaction.prepared.name].snap || {};\n\n let snapOffset;\n\n if (options.offset === 'startCoords') {\n snapOffset = {\n x: interaction.startCoords.page.x - origin.x,\n y: interaction.startCoords.page.y - origin.y,\n };\n }\n else {\n const offsetRect = utils.resolveRectLike(options.offset, interactable, element, [interaction]);\n\n snapOffset = utils.rectToXY(offsetRect) || { x: 0, y: 0 };\n }\n\n if (rect && options.relativePoints && options.relativePoints.length) {\n for (const { x: relativeX, y: relativeY } of options.relativePoints) {\n offsets.push({\n x: startOffset.left - (rect.width * relativeX) + snapOffset.x,\n y: startOffset.top - (rect.height * relativeY) + snapOffset.y,\n });\n }\n }\n else {\n offsets.push(snapOffset);\n }\n\n return offsets;\n },\n\n set: function ({ interaction, pageCoords, status, options, offset: offsets }) {\n const targets = [];\n let target;\n let page;\n let i;\n\n if (status.useStatusXY) {\n page = { x: status.x, y: status.y };\n }\n else {\n const origin = utils.getOriginXY(interaction.target, interaction.element, interaction.prepared.name);\n\n page = utils.extend({}, pageCoords);\n\n page.x -= origin.x;\n page.y -= origin.y;\n }\n\n status.realX = page.x;\n status.realY = page.y;\n\n let len = options.targets? options.targets.length : 0;\n\n for (const { x: offsetX, y: offsetY } of offsets) {\n const relativeX = page.x - offsetX;\n const relativeY = page.y - offsetY;\n\n for (const snapTarget of options.targets) {\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n targets.push({\n x: utils.is.number(target.x) ? (target.x + offsetX) : relativeX,\n y: utils.is.number(target.y) ? (target.y + offsetY) : relativeY,\n\n range: utils.is.number(target.range)? target.range: options.range,\n });\n }\n }\n\n const closest = {\n target: null,\n inRange: false,\n distance: 0,\n range: 0,\n dx: 0,\n dy: 0,\n };\n\n for (i = 0, len = targets.length; i < len; i++) {\n target = targets[i];\n\n const range = target.range;\n const dx = target.x - page.x;\n const dy = target.y - page.y;\n const distance = utils.hypot(dx, dy);\n let inRange = distance <= range;\n\n // Infinite targets count as being out of range\n // compared to non infinite ones that are in range\n if (range === Infinity && closest.inRange && closest.range !== Infinity) {\n inRange = false;\n }\n\n if (!closest.target || (inRange\n // is the closest target in range?\n ? (closest.inRange && range !== Infinity\n // the pointer is relatively deeper in this target\n ? distance / range < closest.distance / closest.range\n // this target has Infinite range and the closest doesn't\n : (range === Infinity && closest.range !== Infinity)\n // OR this target is closer that the previous closest\n || distance < closest.distance)\n // The other is not in range and the pointer is closer to this target\n : (!closest.inRange && distance < closest.distance))) {\n\n closest.target = target;\n closest.distance = distance;\n closest.range = range;\n closest.inRange = inRange;\n closest.dx = dx;\n closest.dy = dy;\n\n status.range = range;\n }\n }\n\n let snapChanged;\n\n if (closest.target) {\n snapChanged = (status.modifiedX !== closest.target.x || status.modifiedY !== closest.target.y);\n\n status.modifiedX = closest.target.x;\n status.modifiedY = closest.target.y;\n }\n else {\n snapChanged = true;\n\n status.modifiedX = NaN;\n status.modifiedY = NaN;\n }\n\n status.dx = closest.dx;\n status.dy = closest.dy;\n\n status.changed = (snapChanged || (closest.inRange && !status.locked));\n status.locked = closest.inRange;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const relativePoints = options && options.relativePoints;\n\n if (options && options.enabled\n && !(phase === 'start' && relativePoints && relativePoints.length)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n }\n\n return {\n range : status.range,\n locked : status.locked,\n x : status.modifiedX,\n y : status.modifiedY,\n realX : status.realX,\n realY : status.realY,\n dx : status.dx,\n dy : status.dy,\n };\n }\n },\n};\n\ninteract.createSnapGrid = function (grid) {\n return function (x, y) {\n const limits = grid.limits || {\n left : -Infinity,\n right : Infinity,\n top : -Infinity,\n bottom: Infinity,\n };\n let offsetX = 0;\n let offsetY = 0;\n\n if (utils.is.object(grid.offset)) {\n offsetX = grid.offset.x;\n offsetY = grid.offset.y;\n }\n\n const gridx = Math.round((x - offsetX) / grid.x);\n const gridy = Math.round((y - offsetY) / grid.y);\n\n const newX = Math.max(limits.left, Math.min(limits.right , gridx * grid.x + offsetX));\n const newY = Math.max(limits.top , Math.min(limits.bottom, gridy * grid.y + offsetY));\n\n return {\n x: newX,\n y: newY,\n range: grid.range,\n };\n };\n};\n\nmodifiers.snap = snap;\nmodifiers.names.push('snap');\n\ndefaultOptions.perAction.snap = snap.defaults;\n\nmodule.exports = snap;\n","// This module allows snapping of the size of targets during resize\n// interactions.\n\nconst modifiers = require('./index');\nconst snap = require('./snap');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\nconst utils = require('../utils/');\n\nconst snapSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n },\n\n setOffset: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.edges;\n\n if (!edges) { return; }\n\n arg.options = {\n relativePoints: [{\n x: edges.left? 0 : 1,\n y: edges.top ? 0 : 1,\n }],\n origin: { x: 0, y: 0 },\n offset: 'self',\n range: options.range,\n };\n\n const offsets = snap.setOffset(arg);\n arg.options = options;\n\n return offsets;\n },\n\n set: function (arg) {\n const { interaction, options, offset, pageCoords } = arg;\n const page = utils.extend({}, pageCoords);\n const relativeX = page.x - offset[0].x;\n const relativeY = page.y - offset[0].y;\n\n arg.options = utils.extend({}, options);\n arg.options.targets = [];\n\n for (const snapTarget of options.targets) {\n let target;\n\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n if ('width' in target && 'height' in target) {\n target.x = target.width;\n target.y = target.height;\n }\n\n arg.options.targets.push(target);\n }\n\n snap.set(arg);\n },\n\n modifyCoords: function (arg) {\n const { options } = arg;\n\n arg.options = utils.extend({}, options);\n arg.options.enabled = options.enabled;\n arg.options.relativePoints = [null];\n\n snap.modifyCoords(arg);\n },\n};\n\nmodifiers.snapSize = snapSize;\nmodifiers.names.push('snapSize');\n\ndefaultOptions.perAction.snapSize = snapSize.defaults;\nresize.defaults.snapSize = snapSize.defaults;\n\nmodule.exports = snapSize;\n","const pointerUtils = require('../utils/pointerUtils');\n\nmodule.exports = class PointerEvent {\n constructor (type, pointer, event, eventTarget, interaction) {\n pointerUtils.pointerExtend(this, event);\n\n if (event !== pointer) {\n pointerUtils.pointerExtend(this, pointer);\n }\n\n this.interaction = interaction;\n\n this.timeStamp = new Date().getTime();\n this.originalEvent = event;\n this.type = type;\n this.pointerId = pointerUtils.getPointerId(pointer);\n this.pointerType = pointerUtils.getPointerType(pointer, interaction);\n this.target = eventTarget;\n this.currentTarget = null;\n\n if (type === 'tap') {\n const pointerIndex = interaction.getPointerIndex(pointer);\n this.dt = this.timeStamp - interaction.downTimes[pointerIndex];\n\n const interval = this.timeStamp - interaction.tapTime;\n\n this.double = !!(interaction.prevTap\n && interaction.prevTap.type !== 'doubletap'\n && interaction.prevTap.target === this.target\n && interval < 500);\n }\n else if (type === 'doubletap') {\n this.dt = pointer.timeStamp - interaction.tapTime;\n }\n }\n\n subtractOrigin ({ x: originX, y: originY }) {\n this.pageX -= originX;\n this.pageY -= originY;\n this.clientX -= originX;\n this.clientY -= originY;\n\n return this;\n }\n\n addOrigin ({ x: originX, y: originY }) {\n this.pageX += originX;\n this.pageY += originY;\n this.clientX += originX;\n this.clientY += originY;\n\n return this;\n }\n\n preventDefault () {\n this.originalEvent.preventDefault();\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n};\n","const PointerEvent = require('./PointerEvent');\nconst Interaction = require('../Interaction');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst defaults = require('../defaultOptions');\nconst signals = require('../utils/Signals').new();\nconst { filter } = require('../utils/arr');\n\nconst simpleSignals = [ 'down', 'up', 'cancel' ];\nconst simpleEvents = [ 'down', 'up', 'cancel' ];\n\nconst pointerEvents = {\n PointerEvent,\n fire,\n collectEventTargets,\n signals,\n defaults: {\n holdDuration: 600,\n ignoreFrom : null,\n allowFrom : null,\n origin : { x: 0, y: 0 },\n },\n types: [\n 'down',\n 'move',\n 'up',\n 'cancel',\n 'tap',\n 'doubletap',\n 'hold',\n ],\n};\n\nfunction fire (arg) {\n const {\n interaction, pointer, event, eventTarget,\n type = arg.pointerEvent.type,\n targets = collectEventTargets(arg),\n pointerEvent = new PointerEvent(type, pointer, event, eventTarget, interaction),\n } = arg;\n\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n targets,\n type,\n pointerEvent,\n };\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n\n for (const prop in target.props || {}) {\n pointerEvent[prop] = target.props[prop];\n }\n\n const origin = utils.getOriginXY(target.eventable, target.element);\n\n pointerEvent.subtractOrigin(origin);\n pointerEvent.eventable = target.eventable;\n pointerEvent.currentTarget = target.element;\n\n target.eventable.fire(pointerEvent);\n\n pointerEvent.addOrigin(origin);\n\n if (pointerEvent.immediatePropagationStopped\n || (pointerEvent.propagationStopped\n && (i + 1) < targets.length && targets[i + 1].element !== pointerEvent.currentTarget)) {\n break;\n }\n }\n\n signals.fire('fired', signalArg);\n\n if (type === 'tap') {\n // if pointerEvent should make a double tap, create and fire a doubletap\n // PointerEvent and use that as the prevTap\n const prevTap = pointerEvent.double\n ? fire({\n interaction, pointer, event, eventTarget,\n type: 'doubletap',\n })\n : pointerEvent;\n\n interaction.prevTap = prevTap;\n interaction.tapTime = prevTap.timeStamp;\n }\n\n return pointerEvent;\n}\n\nfunction collectEventTargets ({ interaction, pointer, event, eventTarget, type }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n // do not fire a tap event if the pointer was moved before being lifted\n if (type === 'tap' && (interaction.pointerWasMoved\n // or if the pointerup target is different to the pointerdown target\n || !(interaction.downTargets[pointerIndex] && interaction.downTargets[pointerIndex] === eventTarget))) {\n return [];\n }\n\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n path,\n targets: [],\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (type === 'hold') {\n signalArg.targets = filter(signalArg.targets, target =>\n target.eventable.options.holdDuration === interaction.holdTimers[pointerIndex].duration);\n }\n\n return signalArg.targets;\n}\n\nInteraction.signals.on('update-pointer-down', function ({ interaction, pointerIndex }) {\n interaction.holdTimers[pointerIndex] = { duration: Infinity, timeout: null };\n});\n\nInteraction.signals.on('remove-pointer', function ({ interaction, pointerIndex }) {\n interaction.holdTimers.splice(pointerIndex, 1);\n});\n\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget, duplicateMove }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n if (!duplicateMove && (!interaction.pointerIsDown || interaction.pointerWasMoved)) {\n if (interaction.pointerIsDown) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n\n fire({\n interaction, pointer, event, eventTarget,\n type: 'move',\n });\n }\n});\n\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget, pointerIndex }) {\n // copy event to be used in timeout for IE8\n const eventCopy = browser.isIE8? utils.extend({}, event) : event;\n\n const timer = interaction.holdTimers[pointerIndex];\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'hold',\n targets: [],\n path,\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (!signalArg.targets.length) { return; }\n\n let minDuration = Infinity;\n\n for (let i = 0; i < signalArg.targets.length; i++) {\n const target = signalArg.targets[i];\n const holdDuration = target.eventable.options.holdDuration;\n\n if (holdDuration < minDuration) {\n minDuration = holdDuration;\n }\n }\n\n timer.duration = minDuration;\n timer.timeout = setTimeout(function () {\n fire({\n interaction, eventCopy, eventTarget,\n pointer: browser.isIE8? eventCopy : pointer,\n type: 'hold',\n });\n }, minDuration);\n});\n\nInteraction.signals.on('up', ({ interaction, pointer, event, eventTarget }) => {\n if (!interaction.pointerWasMoved) {\n fire({ interaction, eventTarget, pointer, event, type: 'tap' });\n }\n});\n\n['up', 'cancel'].forEach(function (signalName) {\n Interaction.signals.on(signalName, function ({ interaction, pointerIndex }) {\n if (interaction.holdTimers[pointerIndex]) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n });\n});\n\nfunction createSignalListener (type) {\n return function ({ interaction, pointer, event, eventTarget }) {\n fire({ interaction, eventTarget, pointer, event, type });\n };\n}\n\nfor (let i = 0; i < simpleSignals.length; i++) {\n Interaction.signals.on(simpleSignals[i], createSignalListener(simpleEvents[i]));\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.prevTap = null; // the most recent tap event on this interaction\n interaction.tapTime = 0; // time of the most recent tap event\n interaction.holdTimers = []; // [{ duration, timeout }]\n});\n\ndefaults.pointerEvents = pointerEvents.defaults;\nmodule.exports = pointerEvents;\n","const pointerEvents = require('./base');\nconst Interaction = require('../Interaction');\n\npointerEvents.signals.on('new', onNew);\npointerEvents.signals.on('fired', onFired);\n\nfor (const signal of ['move', 'up', 'cancel', 'endall']) {\n Interaction.signals.on(signal, endHoldRepeat);\n}\n\nfunction onNew ({ pointerEvent }) {\n if (pointerEvent.type !== 'hold') { return; }\n\n pointerEvent.count = (pointerEvent.count || 0) + 1;\n}\n\nfunction onFired ({ interaction, pointerEvent, eventTarget, targets }) {\n if (pointerEvent.type !== 'hold' || !targets.length) { return; }\n\n // get the repeat interval from the first eventable\n const interval = targets[0].eventable.options.holdRepeatInterval;\n\n // don't repeat if the interval is 0 or less\n if (interval <= 0) { return; }\n\n // set a timeout to fire the holdrepeat event\n interaction.holdIntervalHandle = setTimeout(function () {\n pointerEvents.fire({\n interaction,\n eventTarget,\n type: 'hold',\n pointer: pointerEvent,\n event: pointerEvent,\n });\n }, interval);\n}\n\nfunction endHoldRepeat ({ interaction }) {\n // set the interaction's holdStopTime property\n // to stop further holdRepeat events\n if (interaction.holdIntervalHandle) {\n clearInterval(interaction.holdIntervalHandle);\n interaction.holdIntervalHandle = null;\n }\n}\n\n// don't repeat by default\npointerEvents.defaults.holdRepeatInterval = 0;\npointerEvents.types.push('holdrepeat');\n\nmodule.exports = {\n onNew,\n onFired,\n endHoldRepeat,\n};\n","const pointerEvents = require('./base');\nconst Interactable = require('../Interactable');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\nconst scope = require('../scope');\nconst extend = require('../utils/extend');\nconst { merge } = require('../utils/arr');\n\npointerEvents.signals.on('collect-targets', function ({ targets, element, type, eventTarget }) {\n function collectSelectors (interactable, selector, context) {\n const els = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && is.element(element)\n && domUtils.matchesSelector(element, selector, els)\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n const interactable = scope.interactables.get(element);\n\n if (interactable) {\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n scope.interactables.forEachSelector(collectSelectors, element);\n});\n\nInteractable.signals.on('new', function ({ interactable }) {\n interactable.events.getRect = function (element) {\n return interactable.getRect(element);\n };\n});\n\nInteractable.signals.on('set', function ({ interactable, options }) {\n extend(interactable.events.options, pointerEvents.defaults);\n extend(interactable.events.options, options);\n});\n\nmerge(Interactable.eventTypes, pointerEvents.types);\n\nInteractable.prototype.pointerEvents = function (options) {\n extend(this.events.options, options);\n\n return this;\n};\n\nconst __backCompatOption = Interactable.prototype._backCompatOption;\n\nInteractable.prototype._backCompatOption = function (optionName, newValue) {\n const ret = __backCompatOption.call(this, optionName, newValue);\n\n if (ret === this) {\n this.events.options[optionName] = newValue;\n }\n\n return ret;\n};\n\nInteractable.settingsMethods.push('pointerEvents');\n","const utils = require('./utils');\nconst events = require('./utils/events');\nconst signals = require('./utils/Signals').new();\n\nconst scope = {\n signals,\n events,\n utils,\n\n // main document\n document: require('./utils/domObjects').document,\n // all documents being listened to\n documents: [],\n\n addDocument: function (doc, win) {\n // do nothing if document is already known\n if (utils.contains(scope.documents, doc)) { return false; }\n\n win = win || scope.getWindow(doc);\n\n scope.documents.push(doc);\n events.documents.push(doc);\n\n // don't add an unload event for the main document\n // so that the page may be cached in browser history\n if (doc !== scope.document) {\n events.add(win, 'unload', scope.onWindowUnload);\n }\n\n signals.fire('add-document', { doc, win });\n },\n\n removeDocument: function (doc, win) {\n const index = utils.indexOf(scope.documents, doc);\n\n win = win || scope.getWindow(doc);\n\n events.remove(win, 'unload', scope.onWindowUnload);\n\n scope.documents.splice(index, 1);\n events.documents.splice(index, 1);\n\n signals.fire('remove-document', { win, doc });\n },\n\n onWindowUnload: function () {\n scope.removeDocument(this.document, this);\n },\n};\n\nmodule.exports = scope;\n","const { indexOf } = require('./arr');\n\nclass Signals {\n constructor () {\n this.listeners = {\n // signalName: [listeners],\n };\n }\n\n on (name, listener) {\n if (!this.listeners[name]) {\n this.listeners[name] = [listener];\n return;\n }\n\n this.listeners[name].push(listener);\n }\n\n off (name, listener) {\n if (!this.listeners[name]) { return; }\n\n const index = indexOf(this.listeners[name], listener);\n\n if (index !== -1) {\n this.listeners[name].splice(index, 1);\n }\n }\n\n fire (name, arg) {\n const targetListeners = this.listeners[name];\n\n if (!targetListeners) { return; }\n\n for (let i = 0; i < targetListeners.length; i++) {\n if (targetListeners[i](arg, name) === false) {\n return;\n }\n }\n }\n}\n\nSignals.new = function () {\n return new Signals();\n};\n\nmodule.exports = Signals;\n","function indexOf (array, target) {\n for (let i = 0, len = array.length; i < len; i++) {\n if (array[i] === target) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction contains (array, target) {\n return indexOf(array, target) !== -1;\n}\n\nfunction merge (target, source) {\n for (let i = 0; i < source.length; i++) {\n target.push(source[i]);\n }\n\n return target;\n}\n\nfunction filter (array, test) {\n const result = [];\n\n for (let i = 0; i < array.length; i++) {\n if (test(array[i])) {\n result.push(array[i]);\n }\n }\n\n return result;\n}\n\nmodule.exports = {\n indexOf,\n contains,\n merge,\n filter,\n};\n","const { window } = require('./window');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst Element = domObjects.Element;\nconst navigator = window.navigator;\n\nconst browser = {\n // Does the browser support touch input?\n supportsTouch: !!(('ontouchstart' in window) || is.function(window.DocumentTouch)\n && domObjects.document instanceof window.DocumentTouch),\n\n // Does the browser support PointerEvents\n supportsPointerEvent: !!domObjects.PointerEvent,\n\n isIE8: ('attachEvent' in window) && !('addEventListener' in window),\n\n // Opera Mobile must be handled differently\n isOperaMobile: (navigator.appName === 'Opera'\n && browser.supportsTouch\n && navigator.userAgent.match('Presto')),\n\n // scrolling doesn't change the result of getClientRects on iOS 7\n isIOS7: (/iP(hone|od|ad)/.test(navigator.platform)\n && /OS 7[^\\d]/.test(navigator.appVersion)),\n\n isIe9OrOlder: /MSIE (8|9)/.test(navigator.userAgent),\n\n // prefix matchesSelector\n prefixedMatchesSelector: 'matches' in Element.prototype\n ? 'matches': 'webkitMatchesSelector' in Element.prototype\n ? 'webkitMatchesSelector': 'mozMatchesSelector' in Element.prototype\n ? 'mozMatchesSelector': 'oMatchesSelector' in Element.prototype\n ? 'oMatchesSelector': 'msMatchesSelector',\n\n useMatchesSelectorPolyfill: false,\n\n pEventTypes: (domObjects.PointerEvent\n ? (domObjects.PointerEvent === window.MSPointerEvent\n ? {\n up: 'MSPointerUp',\n down: 'MSPointerDown',\n over: 'mouseover',\n out: 'mouseout',\n move: 'MSPointerMove',\n cancel: 'MSPointerCancel',\n }\n : {\n up: 'pointerup',\n down: 'pointerdown',\n over: 'pointerover',\n out: 'pointerout',\n move: 'pointermove',\n cancel: 'pointercancel',\n })\n : null),\n\n // because Webkit and Opera still use 'mousewheel' event type\n wheelEvent: 'onmousewheel' in domObjects.document? 'mousewheel': 'wheel',\n\n};\n\nbrowser.useMatchesSelectorPolyfill = !is.function(Element.prototype[browser.prefixedMatchesSelector]);\n\nmodule.exports = browser;\n","const domObjects = {};\nconst win = require('./window').window;\n\nfunction blank () {}\n\ndomObjects.document = win.document;\ndomObjects.DocumentFragment = win.DocumentFragment || blank;\ndomObjects.SVGElement = win.SVGElement || blank;\ndomObjects.SVGSVGElement = win.SVGSVGElement || blank;\ndomObjects.SVGElementInstance = win.SVGElementInstance || blank;\ndomObjects.Element = win.Element || blank;\ndomObjects.HTMLElement = win.HTMLElement || domObjects.Element;\n\ndomObjects.Event = win.Event;\ndomObjects.Touch = win.Touch || blank;\ndomObjects.PointerEvent = (win.PointerEvent || win.MSPointerEvent);\n\nmodule.exports = domObjects;\n","const win = require('./window');\nconst browser = require('./browser');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst domUtils = {\n nodeContains: function (parent, child) {\n while (child) {\n if (child === parent) {\n return true;\n }\n\n child = child.parentNode;\n }\n\n return false;\n },\n\n closest: function (element, selector) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) { return element; }\n\n element = domUtils.parentNode(element);\n }\n\n return null;\n },\n\n parentNode: function (node) {\n let parent = node.parentNode;\n\n if (is.docFrag(parent)) {\n // skip past #shado-root fragments\n while ((parent = parent.host) && is.docFrag(parent)) {\n continue;\n }\n\n return parent;\n }\n\n return parent;\n },\n\n // taken from http://tanalin.com/en/blog/2012/12/matches-selector-ie8/ and modified\n matchesSelectorPolyfill: browser.useMatchesSelectorPolyfill\n ? function (element, selector, elems) {\n elems = elems || element.parentNode.querySelectorAll(selector);\n\n for (let i = 0, len = elems.length; i < len; i++) {\n if (elems[i] === element) {\n return true;\n }\n }\n\n return false;\n }\n : null,\n\n matchesSelector: function (element, selector, nodeList) {\n if (browser.useMatchesSelectorPolyfill) {\n return domUtils.matchesSelectorPolyfill(element, selector, nodeList);\n }\n\n // remove /deep/ from selectors if shadowDOM polyfill is used\n if (win.window !== win.realWindow) {\n selector = selector.replace(/\\/deep\\//g, ' ');\n }\n\n return element[browser.prefixedMatchesSelector](selector);\n },\n\n // Test for the element that's \"above\" all other qualifiers\n indexOfDeepestElement: function (elements) {\n let deepestZoneParents = [];\n let dropzoneParents = [];\n let dropzone;\n let deepestZone = elements[0];\n let index = deepestZone? 0: -1;\n let parent;\n let child;\n let i;\n let n;\n\n for (i = 1; i < elements.length; i++) {\n dropzone = elements[i];\n\n // an element might belong to multiple selector dropzones\n if (!dropzone || dropzone === deepestZone) {\n continue;\n }\n\n if (!deepestZone) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n // check if the deepest or current are document.documentElement or document.rootElement\n // - if the current dropzone is, do nothing and continue\n if (dropzone.parentNode === dropzone.ownerDocument) {\n continue;\n }\n // - if deepest is, update with the current dropzone and continue to next\n else if (deepestZone.parentNode === dropzone.ownerDocument) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n if (!deepestZoneParents.length) {\n parent = deepestZone;\n while (parent.parentNode && parent.parentNode !== parent.ownerDocument) {\n deepestZoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n }\n\n // if this element is an svg element and the current deepest is\n // an HTMLElement\n if (deepestZone instanceof domObjects.HTMLElement\n && dropzone instanceof domObjects.SVGElement\n && !(dropzone instanceof domObjects.SVGSVGElement)) {\n\n if (dropzone === deepestZone.parentNode) {\n continue;\n }\n\n parent = dropzone.ownerSVGElement;\n }\n else {\n parent = dropzone;\n }\n\n dropzoneParents = [];\n\n while (parent.parentNode !== parent.ownerDocument) {\n dropzoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n\n n = 0;\n\n // get (position of last common ancestor) + 1\n while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) {\n n++;\n }\n\n const parents = [\n dropzoneParents[n - 1],\n dropzoneParents[n],\n deepestZoneParents[n],\n ];\n\n child = parents[0].lastChild;\n\n while (child) {\n if (child === parents[1]) {\n deepestZone = dropzone;\n index = i;\n deepestZoneParents = [];\n\n break;\n }\n else if (child === parents[2]) {\n break;\n }\n\n child = child.previousSibling;\n }\n }\n\n return index;\n },\n\n matchesUpTo: function (element, selector, limit) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) {\n return true;\n }\n\n element = domUtils.parentNode(element);\n\n if (element === limit) {\n return domUtils.matchesSelector(element, selector);\n }\n }\n\n return false;\n },\n\n getActualElement: function (element) {\n return (element instanceof domObjects.SVGElementInstance\n ? element.correspondingUseElement\n : element);\n },\n\n getScrollXY: function (relevantWindow) {\n relevantWindow = relevantWindow || win.window;\n return {\n x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft,\n y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop,\n };\n },\n\n getElementClientRect: function (element) {\n const clientRect = (element instanceof domObjects.SVGElement\n ? element.getBoundingClientRect()\n : element.getClientRects()[0]);\n\n return clientRect && {\n left : clientRect.left,\n right : clientRect.right,\n top : clientRect.top,\n bottom: clientRect.bottom,\n width : clientRect.width || clientRect.right - clientRect.left,\n height: clientRect.height || clientRect.bottom - clientRect.top,\n };\n },\n\n getElementRect: function (element) {\n const clientRect = domUtils.getElementClientRect(element);\n\n if (!browser.isIOS7 && clientRect) {\n const scroll = domUtils.getScrollXY(win.getWindow(element));\n\n clientRect.left += scroll.x;\n clientRect.right += scroll.x;\n clientRect.top += scroll.y;\n clientRect.bottom += scroll.y;\n }\n\n return clientRect;\n },\n\n getPath: function (element) {\n const path = [];\n\n while (element) {\n path.push(element);\n element = domUtils.parentNode(element);\n }\n\n return path;\n },\n\n trySelector: value => {\n if (!is.string(value)) { return false; }\n\n // an exception will be raised if it is invalid\n domObjects.document.querySelector(value);\n return true;\n },\n};\n\nmodule.exports = domUtils;\n","const is = require('./is');\nconst domUtils = require('./domUtils');\nconst pExtend = require('./pointerExtend');\n\nconst { window, getWindow } = require('./window');\nconst { indexOf, contains } = require('./arr');\n\nconst useAttachEvent = ('attachEvent' in window) && !('addEventListener' in window);\nconst addEvent = useAttachEvent? 'attachEvent': 'addEventListener';\nconst removeEvent = useAttachEvent? 'detachEvent': 'removeEventListener';\nconst on = useAttachEvent? 'on': '';\n\nconst elements = [];\nconst targets = [];\nconst attachedListeners = [];\n\n// {\n// type: {\n// selectors: ['selector', ...],\n// contexts : [document, ...],\n// listeners: [[listener, capture, passive], ...]\n// }\n// }\nconst delegatedEvents = {};\n\nconst documents = [];\n\nconst supportsOptions = !useAttachEvent && (() => {\n let supported = false;\n\n window.document.createElement('div').addEventListener('test', null, {\n get capture () { supported = true; },\n });\n\n return supported;\n})();\n\nfunction add (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n let elementIndex = indexOf(elements, element);\n let target = targets[elementIndex];\n\n if (!target) {\n target = {\n events: {},\n typeCount: 0,\n };\n\n elementIndex = elements.push(element) - 1;\n targets.push(target);\n\n attachedListeners.push(useAttachEvent\n ? {\n supplied: [],\n wrapped : [],\n useCount: [],\n }\n : null);\n }\n\n if (!target.events[type]) {\n target.events[type] = [];\n target.typeCount++;\n }\n\n if (!contains(target.events[type], listener)) {\n let ret;\n\n if (useAttachEvent) {\n const { supplied, wrapped, useCount } = attachedListeners[elementIndex];\n const listenerIndex = indexOf(supplied, listener);\n\n const wrappedListener = wrapped[listenerIndex] || function (event) {\n if (!event.immediatePropagationStopped) {\n event.target = event.srcElement;\n event.currentTarget = element;\n\n event.preventDefault = event.preventDefault || preventDef;\n event.stopPropagation = event.stopPropagation || stopProp;\n event.stopImmediatePropagation = event.stopImmediatePropagation || stopImmProp;\n\n if (/mouse|click/.test(event.type)) {\n event.pageX = event.clientX + getWindow(element).document.documentElement.scrollLeft;\n event.pageY = event.clientY + getWindow(element).document.documentElement.scrollTop;\n }\n\n listener(event);\n }\n };\n\n ret = element[addEvent](on + type, wrappedListener, !!options.capture);\n\n if (listenerIndex === -1) {\n supplied.push(listener);\n wrapped.push(wrappedListener);\n useCount.push(1);\n }\n else {\n useCount[listenerIndex]++;\n }\n }\n else {\n ret = element[addEvent](type, listener, supportsOptions? options : !!options.capture);\n }\n target.events[type].push(listener);\n\n return ret;\n }\n}\n\nfunction remove (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const elementIndex = indexOf(elements, element);\n const target = targets[elementIndex];\n\n if (!target || !target.events) {\n return;\n }\n\n let wrappedListener = listener;\n let listeners;\n let listenerIndex;\n\n if (useAttachEvent) {\n listeners = attachedListeners[elementIndex];\n listenerIndex = indexOf(listeners.supplied, listener);\n wrappedListener = listeners.wrapped[listenerIndex];\n }\n\n if (type === 'all') {\n for (type in target.events) {\n if (target.events.hasOwnProperty(type)) {\n remove(element, type, 'all');\n }\n }\n return;\n }\n\n if (target.events[type]) {\n const len = target.events[type].length;\n\n if (listener === 'all') {\n for (let i = 0; i < len; i++) {\n remove(element, type, target.events[type][i], options);\n }\n return;\n }\n else {\n for (let i = 0; i < len; i++) {\n if (target.events[type][i] === listener) {\n element[removeEvent](on + type, wrappedListener, supportsOptions? options : !!options.capture);\n target.events[type].splice(i, 1);\n\n if (useAttachEvent && listeners) {\n listeners.useCount[listenerIndex]--;\n if (listeners.useCount[listenerIndex] === 0) {\n listeners.supplied.splice(listenerIndex, 1);\n listeners.wrapped.splice(listenerIndex, 1);\n listeners.useCount.splice(listenerIndex, 1);\n }\n }\n\n break;\n }\n }\n }\n\n if (target.events[type] && target.events[type].length === 0) {\n target.events[type] = null;\n target.typeCount--;\n }\n }\n\n if (!target.typeCount) {\n targets.splice(elementIndex, 1);\n elements.splice(elementIndex, 1);\n attachedListeners.splice(elementIndex, 1);\n }\n}\n\nfunction addDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n if (!delegatedEvents[type]) {\n delegatedEvents[type] = {\n selectors: [],\n contexts : [],\n listeners: [],\n };\n\n // add delegate listener functions\n for (let i = 0; i < documents.length; i++) {\n add(documents[i], type, delegateListener);\n add(documents[i], type, delegateUseCapture, true);\n }\n }\n\n const delegated = delegatedEvents[type];\n let index;\n\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n break;\n }\n }\n\n if (index === -1) {\n index = delegated.selectors.length;\n\n delegated.selectors.push(selector);\n delegated.contexts .push(context);\n delegated.listeners.push([]);\n }\n\n // keep listener and capture and passive flags\n delegated.listeners[index].push([listener, !!options.capture, options.passive]);\n}\n\nfunction removeDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const delegated = delegatedEvents[type];\n let matchFound = false;\n let index;\n\n if (!delegated) { return; }\n\n // count from last index of delegated to 0\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n // look for matching selector and context Node\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n\n const listeners = delegated.listeners[index];\n\n // each item of the listeners array is an array: [function, capture, passive]\n for (let i = listeners.length - 1; i >= 0; i--) {\n const [fn, capture, passive] = listeners[i];\n\n // check if the listener functions and capture and passive flags match\n if (fn === listener && capture === !!options.capture && passive === options.passive) {\n // remove the listener from the array of listeners\n listeners.splice(i, 1);\n\n // if all listeners for this interactable have been removed\n // remove the interactable from the delegated arrays\n if (!listeners.length) {\n delegated.selectors.splice(index, 1);\n delegated.contexts .splice(index, 1);\n delegated.listeners.splice(index, 1);\n\n // remove delegate function from context\n remove(context, type, delegateListener);\n remove(context, type, delegateUseCapture, true);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegatedEvents[type] = null;\n }\n }\n\n // only remove one listener\n matchFound = true;\n break;\n }\n }\n\n if (matchFound) { break; }\n }\n }\n}\n\n// bound to the interactable context when a DOM event\n// listener is added to a selector interactable\nfunction delegateListener (event, optionalArg) {\n const options = getOptions(optionalArg);\n const fakeEvent = {};\n const delegated = delegatedEvents[event.type];\n const eventTarget = (domUtils.getActualElement(event.path\n ? event.path[0]\n : event.target));\n let element = eventTarget;\n\n // duplicate the event so that currentTarget can be changed\n pExtend(fakeEvent, event);\n\n fakeEvent.originalEvent = event;\n fakeEvent.preventDefault = preventOriginalDefault;\n\n // climb up document tree looking for selector matches\n while (is.element(element)) {\n for (let i = 0; i < delegated.selectors.length; i++) {\n const selector = delegated.selectors[i];\n const context = delegated.contexts[i];\n\n if (domUtils.matchesSelector(element, selector)\n && domUtils.nodeContains(context, eventTarget)\n && domUtils.nodeContains(context, element)) {\n\n const listeners = delegated.listeners[i];\n\n fakeEvent.currentTarget = element;\n\n for (let j = 0; j < listeners.length; j++) {\n const [fn, capture, passive] = listeners[j];\n\n if (capture === !!options.capture && passive === options.passive) {\n fn(fakeEvent);\n }\n }\n }\n }\n\n element = domUtils.parentNode(element);\n }\n}\n\nfunction delegateUseCapture (event) {\n return delegateListener.call(this, event, true);\n}\n\nfunction preventDef () {\n this.returnValue = false;\n}\n\nfunction preventOriginalDefault () {\n this.originalEvent.preventDefault();\n}\n\nfunction stopProp () {\n this.cancelBubble = true;\n}\n\nfunction stopImmProp () {\n this.cancelBubble = true;\n this.immediatePropagationStopped = true;\n}\n\nfunction getOptions (param) {\n return is.object(param)? param : { capture: param };\n}\n\nmodule.exports = {\n add,\n remove,\n\n addDelegate,\n removeDelegate,\n\n delegateListener,\n delegateUseCapture,\n delegatedEvents,\n documents,\n\n useAttachEvent,\n supportsOptions,\n\n _elements: elements,\n _targets: targets,\n _attachedListeners: attachedListeners,\n};\n","module.exports = function extend (dest, source) {\n for (const prop in source) {\n dest[prop] = source[prop];\n }\n return dest;\n};\n","const {\n resolveRectLike,\n rectToXY,\n} = require('./rect');\n\nmodule.exports = function (target, element, action) {\n const actionOptions = target.options[action];\n const actionOrigin = actionOptions && actionOptions.origin;\n const origin = actionOrigin || target.options.origin;\n\n const originRect = resolveRectLike(origin, target, element, [target && element]);\n\n return rectToXY(originRect) || { x: 0, y: 0 };\n};\n","module.exports = (x, y) => Math.sqrt(x * x + y * y);\n","const extend = require('./extend');\nconst win = require('./window');\n\nconst utils = {\n warnOnce: function (method, message) {\n let warned = false;\n\n return function () {\n if (!warned) {\n win.window.console.warn(message);\n warned = true;\n }\n\n return method.apply(this, arguments);\n };\n },\n\n // http://stackoverflow.com/a/5634528/2280888\n _getQBezierValue: function (t, p1, p2, p3) {\n const iT = 1 - t;\n return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3;\n },\n\n getQuadraticCurvePoint: function (startX, startY, cpX, cpY, endX, endY, position) {\n return {\n x: utils._getQBezierValue(position, startX, cpX, endX),\n y: utils._getQBezierValue(position, startY, cpY, endY),\n };\n },\n\n // http://gizma.com/easing/\n easeOutQuad: function (t, b, c, d) {\n t /= d;\n return -c * t*(t-2) + b;\n },\n\n copyAction: function (dest, src) {\n dest.name = src.name;\n dest.axis = src.axis;\n dest.edges = src.edges;\n\n return dest;\n },\n\n is : require('./is'),\n extend : extend,\n hypot : require('./hypot'),\n getOriginXY: require('./getOriginXY'),\n};\n\nextend(utils, require('./arr'));\nextend(utils, require('./domUtils'));\nextend(utils, require('./pointerUtils'));\nextend(utils, require('./rect'));\n\nmodule.exports = utils;\n","const scope = require('../scope');\nconst utils = require('./index');\nconst browser = require('./browser');\n\nconst finder = {\n methodOrder: [ 'simulationResume', 'mouse', 'hasPointer', 'idle' ],\n\n search: function (pointer, eventType, eventTarget) {\n const mouseEvent = (/mouse/i.test(pointer.pointerType || eventType)\n // MSPointerEvent.MSPOINTER_TYPE_MOUSE\n || pointer.pointerType === 4);\n const pointerId = utils.getPointerId(pointer);\n const details = { pointer, pointerId, mouseEvent, eventType, eventTarget };\n\n for (const method of finder.methodOrder) {\n const interaction = finder[method](details);\n\n if (interaction) {\n return interaction;\n }\n }\n },\n\n // try to resume simulation with a new pointer\n simulationResume: function ({ mouseEvent, eventType, eventTarget }) {\n if (!/down|start/i.test(eventType)) {\n return null;\n }\n\n for (const interaction of scope.interactions) {\n let element = eventTarget;\n\n if (interaction.simulation && interaction.simulation.allowResume\n && (interaction.mouse === mouseEvent)) {\n while (element) {\n // if the element is the interaction element\n if (element === interaction.element) {\n return interaction;\n }\n element = utils.parentNode(element);\n }\n }\n }\n\n return null;\n },\n\n // if it's a mouse interaction\n mouse: function ({ pointerId, mouseEvent, eventType }) {\n if (!mouseEvent && (browser.supportsTouch || browser.supportsPointerEvent)) {\n return null;\n }\n\n let firstNonActive;\n\n for (const interaction of scope.interactions) {\n if (interaction.mouse) {\n // if it's a down event, skip interactions with running simulations\n if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; }\n\n // if the interaction is active, return it immediately\n if (interaction.interacting()) {\n return interaction;\n }\n // otherwise save it and look for another active interaction\n else if (!firstNonActive) {\n firstNonActive = interaction;\n }\n }\n }\n\n // if no active mouse interaction was found use the first inactive mouse\n // interaction\n if (firstNonActive) {\n return firstNonActive;\n }\n\n // Find any interaction specifically for mouse.\n // ignore the interaction if the eventType is a mousedown, and a simulation\n // is active\n for (const interaction of scope.interactions) {\n if (interaction.mouse && !(/down/.test(eventType) && interaction.simulation)) {\n return interaction;\n }\n }\n\n return null;\n },\n\n // get interaction that has this pointer\n hasPointer: function ({ pointerId }) {\n for (const interaction of scope.interactions) {\n if (utils.contains(interaction.pointerIds, pointerId)) {\n return interaction;\n }\n }\n },\n\n // get first idle interaction\n idle: function ({ mouseEvent }) {\n for (const interaction of scope.interactions) {\n // if there's already a pointer held down\n if (interaction.pointerIds.length === 1) {\n const target = interaction.target;\n // don't add this pointer if there is a target interactable and it\n // isn't gesturable\n if (target && !target.options.gesture.enabled) {\n continue;\n }\n }\n // maximum of 2 pointers per interaction\n else if (interaction.pointerIds.length >= 2) {\n continue;\n }\n\n if (!interaction.interacting() && (mouseEvent === interaction.mouse)) {\n return interaction;\n }\n }\n\n return null;\n },\n};\n\nmodule.exports = finder;\n","const win = require('./window');\nconst isWindow = require('./isWindow');\n\nconst is = {\n array : () => {},\n\n window : thing => thing === win.window || isWindow(thing),\n\n docFrag : thing => is.object(thing) && thing.nodeType === 11,\n\n object : thing => !!thing && (typeof thing === 'object'),\n\n function: thing => typeof thing === 'function',\n\n number : thing => typeof thing === 'number' ,\n\n bool : thing => typeof thing === 'boolean' ,\n\n string : thing => typeof thing === 'string' ,\n\n element: thing => {\n if (!thing || (typeof thing !== 'object')) { return false; }\n\n const _window = win.getWindow(thing) || win.window;\n\n return (/object|function/.test(typeof _window.Element)\n ? thing instanceof _window.Element //DOM2\n : thing.nodeType === 1 && typeof thing.nodeName === 'string');\n },\n};\n\nis.array = thing => (is.object(thing)\n && (typeof thing.length !== 'undefined')\n && is.function(thing.splice));\n\nmodule.exports = is;\n","module.exports = (thing) => !!(thing && thing.Window) && (thing instanceof thing.Window);\n","function pointerExtend (dest, source) {\n for (const prop in source) {\n const prefixedPropREs = module.exports.prefixedPropREs;\n let deprecated = false;\n\n // skip deprecated prefixed properties\n for (const vendor in prefixedPropREs) {\n if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) {\n deprecated = true;\n break;\n }\n }\n\n if (!deprecated && typeof source[prop] !== 'function') {\n dest[prop] = source[prop];\n }\n }\n return dest;\n}\n\npointerExtend.prefixedPropREs = {\n webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/,\n};\n\nmodule.exports = pointerExtend;\n","const hypot = require('./hypot');\nconst browser = require('./browser');\nconst dom = require('./domObjects');\nconst domUtils = require('./domUtils');\nconst is = require('./is');\nconst pointerExtend = require('./pointerExtend');\n\nconst pointerUtils = {\n copyCoords: function (dest, src) {\n dest.page = dest.page || {};\n dest.page.x = src.page.x;\n dest.page.y = src.page.y;\n\n dest.client = dest.client || {};\n dest.client.x = src.client.x;\n dest.client.y = src.client.y;\n\n dest.timeStamp = src.timeStamp;\n },\n\n setCoordDeltas: function (targetObj, prev, cur) {\n targetObj.page.x = cur.page.x - prev.page.x;\n targetObj.page.y = cur.page.y - prev.page.y;\n targetObj.client.x = cur.client.x - prev.client.x;\n targetObj.client.y = cur.client.y - prev.client.y;\n targetObj.timeStamp = cur.timeStamp - prev.timeStamp;\n\n // set pointer velocity\n const dt = Math.max(targetObj.timeStamp / 1000, 0.001);\n\n targetObj.page.speed = hypot(targetObj.page.x, targetObj.page.y) / dt;\n targetObj.page.vx = targetObj.page.x / dt;\n targetObj.page.vy = targetObj.page.y / dt;\n\n targetObj.client.speed = hypot(targetObj.client.x, targetObj.page.y) / dt;\n targetObj.client.vx = targetObj.client.x / dt;\n targetObj.client.vy = targetObj.client.y / dt;\n },\n\n isNativePointer: function (pointer) {\n return (pointer instanceof dom.Event || pointer instanceof dom.Touch);\n },\n\n // Get specified X/Y coords for mouse or event.touches[0]\n getXY: function (type, pointer, xy) {\n xy = xy || {};\n type = type || 'page';\n\n xy.x = pointer[type + 'X'];\n xy.y = pointer[type + 'Y'];\n\n return xy;\n },\n\n getPageXY: function (pointer, page) {\n page = page || {};\n\n // Opera Mobile handles the viewport and scrolling oddly\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n pointerUtils.getXY('screen', pointer, page);\n\n page.x += window.scrollX;\n page.y += window.scrollY;\n }\n else {\n pointerUtils.getXY('page', pointer, page);\n }\n\n return page;\n },\n\n getClientXY: function (pointer, client) {\n client = client || {};\n\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n // Opera Mobile handles the viewport and scrolling oddly\n pointerUtils.getXY('screen', pointer, client);\n }\n else {\n pointerUtils.getXY('client', pointer, client);\n }\n\n return client;\n },\n\n getPointerId: function (pointer) {\n return is.number(pointer.pointerId)? pointer.pointerId : pointer.identifier;\n },\n\n setCoords: function (targetObj, pointers, timeStamp) {\n const pointer = (pointers.length > 1\n ? pointerUtils.pointerAverage(pointers)\n : pointers[0]);\n\n const tmpXY = {};\n\n pointerUtils.getPageXY(pointer, tmpXY);\n targetObj.page.x = tmpXY.x;\n targetObj.page.y = tmpXY.y;\n\n pointerUtils.getClientXY(pointer, tmpXY);\n targetObj.client.x = tmpXY.x;\n targetObj.client.y = tmpXY.y;\n\n targetObj.timeStamp = is.number(timeStamp) ? timeStamp :new Date().getTime();\n },\n\n pointerExtend: pointerExtend,\n\n getTouchPair: function (event) {\n const touches = [];\n\n // array of touches is supplied\n if (is.array(event)) {\n touches[0] = event[0];\n touches[1] = event[1];\n }\n // an event\n else {\n if (event.type === 'touchend') {\n if (event.touches.length === 1) {\n touches[0] = event.touches[0];\n touches[1] = event.changedTouches[0];\n }\n else if (event.touches.length === 0) {\n touches[0] = event.changedTouches[0];\n touches[1] = event.changedTouches[1];\n }\n }\n else {\n touches[0] = event.touches[0];\n touches[1] = event.touches[1];\n }\n }\n\n return touches;\n },\n\n pointerAverage: function (pointers) {\n const average = {\n pageX : 0,\n pageY : 0,\n clientX: 0,\n clientY: 0,\n screenX: 0,\n screenY: 0,\n };\n\n for (const pointer of pointers) {\n for (const prop in average) {\n average[prop] += pointer[prop];\n }\n }\n for (const prop in average) {\n average[prop] /= pointers.length;\n }\n\n return average;\n },\n\n touchBBox: function (event) {\n if (!event.length && !(event.touches && event.touches.length > 1)) {\n return;\n }\n\n const touches = pointerUtils.getTouchPair(event);\n const minX = Math.min(touches[0].pageX, touches[1].pageX);\n const minY = Math.min(touches[0].pageY, touches[1].pageY);\n const maxX = Math.max(touches[0].pageX, touches[1].pageX);\n const maxY = Math.max(touches[0].pageY, touches[1].pageY);\n\n return {\n x: minX,\n y: minY,\n left: minX,\n top: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n },\n\n touchDistance: function (event, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n\n\n const dx = touches[0][sourceX] - touches[1][sourceX];\n const dy = touches[0][sourceY] - touches[1][sourceY];\n\n return hypot(dx, dy);\n },\n\n touchAngle: function (event, prevAngle, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n const dx = touches[1][sourceX] - touches[0][sourceX];\n const dy = touches[1][sourceY] - touches[0][sourceY];\n const angle = 180 * Math.atan2(dy , dx) / Math.PI;\n\n return angle;\n },\n\n getPointerType: function (pointer, interaction) {\n // if the PointerEvent API isn't available, then the pointer must be ither\n // a MouseEvent or TouchEvent\n if (interaction.mouse) { return 'mouse'; }\n if (!browser.supportsPointerEvent) { return 'touch'; }\n\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : [undefined, undefined,'touch', 'pen', 'mouse'][pointer.pointerType];\n },\n\n // [ event.target, event.currentTarget ]\n getEventTargets: function (event) {\n return [\n domUtils.getActualElement(event.path ? event.path[0] : event.target),\n domUtils.getActualElement(event.currentTarget),\n ];\n },\n};\n\nmodule.exports = pointerUtils;\n","const { window } = require('./window');\n\nconst vendors = ['ms', 'moz', 'webkit', 'o'];\nlet lastTime = 0;\nlet request;\nlet cancel;\n\nfor (let x = 0; x < vendors.length && !window.requestAnimationFrame; x++) {\n request = window[vendors[x] + 'RequestAnimationFrame'];\n cancel = window[vendors[x] +'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n}\n\nif (!request) {\n request = function (callback) {\n const currTime = new Date().getTime();\n const timeToCall = Math.max(0, 16 - (currTime - lastTime));\n const id = setTimeout(function () { callback(currTime + timeToCall); },\n timeToCall);\n\n lastTime = currTime + timeToCall;\n return id;\n };\n}\n\nif (!cancel) {\n cancel = function (id) {\n clearTimeout(id);\n };\n}\n\nmodule.exports = {\n request,\n cancel,\n};\n","const extend = require('./extend');\nconst is = require('./is');\nconst {\n closest,\n parentNode,\n getElementRect,\n} = require('./domUtils');\n\nconst rectUtils = {\n getStringOptionResult: function (value, interactable, element) {\n if (!is.string(value)) {\n return null;\n }\n\n if (value === 'parent') {\n value = parentNode(element);\n }\n else if (value === 'self') {\n value = interactable.getRect(element);\n }\n else {\n value = closest(element, value);\n }\n\n return value;\n },\n\n resolveRectLike: function (value, interactable, element, functionArgs) {\n value = rectUtils.getStringOptionResult(value, interactable, element) || value;\n\n if (is.function(value)) {\n value = value.apply(null, functionArgs);\n }\n\n if (is.element(value)) {\n value = getElementRect(value);\n }\n\n return value;\n },\n\n rectToXY: function (rect) {\n return rect && {\n x: 'x' in rect ? rect.x : rect.left,\n y: 'y' in rect ? rect.y : rect.top,\n };\n },\n\n xywhToTlbr: function (rect) {\n if (rect && !('left' in rect && 'top' in rect)) {\n rect = extend({}, rect);\n\n rect.left = rect.x || 0;\n rect.top = rect.y || 0;\n rect.right = rect.right || (rect.left + rect.width);\n rect.bottom = rect.bottom || (rect.top + rect.height);\n }\n\n return rect;\n },\n\n tlbrToXywh: function (rect) {\n if (rect && !('x' in rect && 'y' in rect)) {\n rect = extend({}, rect);\n\n rect.x = rect.left || 0;\n rect.top = rect.top || 0;\n rect.width = rect.width || (rect.right - rect.x);\n rect.height = rect.height || (rect.bottom - rect.y);\n }\n\n return rect;\n },\n};\n\nmodule.exports = rectUtils;\n","const win = module.exports;\nconst isWindow = require('./isWindow');\n\nfunction init (window) {\n // get wrapped window if using Shadow DOM polyfill\n\n win.realWindow = window;\n\n // create a TextNode\n const el = window.document.createTextNode('');\n\n // check if it's wrapped by a polyfill\n if (el.ownerDocument !== window.document\n && typeof window.wrap === 'function'\n && window.wrap(el) === el) {\n // use wrapped window\n window = window.wrap(window);\n }\n\n win.window = window;\n}\n\nif (typeof window === 'undefined') {\n win.window = undefined;\n win.realWindow = undefined;\n}\nelse {\n init(window);\n}\n\nwin.getWindow = function getWindow (node) {\n if (isWindow(node)) {\n return node;\n }\n\n const rootNode = (node.ownerDocument || node);\n\n return rootNode.defaultView || rootNode.parentWindow || win.window;\n};\n\nwin.init = init;\n"]} \ No newline at end of file +{"version":3,"sources":["src/minHeader.js","src/header.js","index.js","src/Eventable.js","src/InteractEvent.js","src/Interactable.js","src/Interaction.js","src/actions/base.js","src/actions/drag.js","src/actions/drop.js","src/actions/gesture.js","src/actions/resize.js","src/autoScroll.js","src/autoStart/InteractableMethods.js","src/autoStart/base.js","src/autoStart/delay.js","src/autoStart/drag.js","src/autoStart/gesture.js","src/autoStart/resize.js","src/defaultOptions.js","src/index.js","src/inertia.js","src/interact.js","src/interactablePreventDefault.js","src/legacyBrowsers.js","src/modifiers/index.js","src/modifiers/restrict.js","src/modifiers/restrictEdges.js","src/modifiers/restrictSize.js","src/modifiers/snap.js","src/modifiers/snapSize.js","src/pointerEvents/PointerEvent.js","src/pointerEvents/base.js","src/pointerEvents/holdRepeat.js","src/pointerEvents/interactableTargets.js","src/scope.js","src/utils/Signals.js","src/utils/arr.js","src/utils/browser.js","src/utils/domObjects.js","src/utils/domUtils.js","src/utils/events.js","src/utils/extend.js","src/utils/getOriginXY.js","src/utils/hypot.js","src/utils/index.js","src/utils/interactionFinder.js","src/utils/is.js","src/utils/isWindow.js","src/utils/pointerExtend.js","src/utils/pointerUtils.js","src/utils/raf.js","src/utils/rect.js","src/utils/window.js"],"names":[],"mappings":"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","file":"interact.min.js","sourceRoot":"","sourcesContent":["/* interact.js v1.3.0-alpha.4+sha.7970416-dirty | https://raw.github.com/taye/interact.js/master/LICENSE */\n","/**\n * interact.js v1.3.0-alpha.4+sha.7970416-dirty\n *\n * Copyright (c) 2012-2017 Taye Adeyemi \n * Open source under the MIT License.\n * https://raw.github.com/taye/interact.js/master/LICENSE\n */\n","/*\n * In a (windowless) server environment this file exports a factory function\n * that takes the window to use.\n *\n * var interact = require('interact.js')(windowObject);\n *\n * See https://github.com/taye/interact.js/issues/187\n */\nif (typeof window === 'undefined') {\n module.exports = function (window) {\n require('./src/utils/window').init(window);\n\n return require('./src/index');\n };\n}\nelse {\n module.exports = require('./src/index');\n}\n","const { indexOf } = require('./utils/arr');\nconst extend = require('./utils/extend.js');\n\nfunction fireUntilImmediateStopped (event, listeners) {\n for (let i = 0, len = listeners.length; i < len && !event.immediatePropagationStopped; i++) {\n listeners[i](event);\n }\n}\n\nclass Eventable {\n\n constructor (options) {\n this.options = extend({}, options || {});\n }\n\n fire (event) {\n let listeners;\n const onEvent = 'on' + event.type;\n const global = this.global;\n\n // Interactable#on() listeners\n if ((listeners = this[event.type])) {\n fireUntilImmediateStopped(event, listeners);\n }\n\n // interactable.onevent listener\n if (this[onEvent]) {\n this[onEvent](event);\n }\n\n // interact.on() listeners\n if (!event.propagationStopped && global && (listeners = global[event.type])) {\n fireUntilImmediateStopped(event, listeners);\n }\n }\n\n on (eventType, listener) {\n // if this type of event was never bound\n if (this[eventType]) {\n this[eventType].push(listener);\n }\n else {\n this[eventType] = [listener];\n }\n }\n\n off (eventType, listener) {\n // if it is an action event type\n const eventList = this[eventType];\n const index = eventList? indexOf(eventList, listener) : -1;\n\n if (index !== -1) {\n eventList.splice(index, 1);\n }\n\n if (eventList && eventList.length === 0 || !listener) {\n this[eventType] = listener;\n }\n }\n}\n\nmodule.exports = Eventable;\n","const extend = require('./utils/extend');\nconst getOriginXY = require('./utils/getOriginXY');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nclass InteractEvent {\n constructor (interaction, event, action, phase, element, related, preEnd = false) {\n const target = interaction.target;\n const deltaSource = (target && target.options || defaults).deltaSource;\n const origin = getOriginXY(target, element, action);\n const starting = phase === 'start';\n const ending = phase === 'end';\n const coords = starting? interaction.startCoords : interaction.curCoords;\n const prevEvent = interaction.prevEvent;\n\n element = element || interaction.element;\n\n const page = extend({}, coords.page);\n const client = extend({}, coords.client);\n\n page.x -= origin.x;\n page.y -= origin.y;\n\n client.x -= origin.x;\n client.y -= origin.y;\n\n this.ctrlKey = event.ctrlKey;\n this.altKey = event.altKey;\n this.shiftKey = event.shiftKey;\n this.metaKey = event.metaKey;\n this.button = event.button;\n this.buttons = event.buttons;\n this.target = element;\n this.currentTarget = element;\n this.relatedTarget = related || null;\n this.preEnd = preEnd;\n this.type = action + (phase || '');\n this.interaction = interaction;\n this.interactable = target;\n\n this.t0 = starting ? interaction.downTimes[interaction.downTimes.length - 1]\n : prevEvent.t0;\n\n const signalArg = {\n interaction,\n event,\n action,\n phase,\n element,\n related,\n page,\n client,\n coords,\n starting,\n ending,\n deltaSource,\n iEvent: this,\n };\n\n signals.fire('set-xy', signalArg);\n\n if (ending) {\n // use previous coords when ending\n this.pageX = prevEvent.pageX;\n this.pageY = prevEvent.pageY;\n this.clientX = prevEvent.clientX;\n this.clientY = prevEvent.clientY;\n }\n else {\n this.pageX = page.x;\n this.pageY = page.y;\n this.clientX = client.x;\n this.clientY = client.y;\n }\n\n this.x0 = interaction.startCoords.page.x - origin.x;\n this.y0 = interaction.startCoords.page.y - origin.y;\n this.clientX0 = interaction.startCoords.client.x - origin.x;\n this.clientY0 = interaction.startCoords.client.y - origin.y;\n\n signals.fire('set-delta', signalArg);\n\n this.timeStamp = coords.timeStamp;\n this.dt = interaction.pointerDelta.timeStamp;\n this.duration = this.timeStamp - this.t0;\n\n // speed and velocity in pixels per second\n this.speed = interaction.pointerDelta[deltaSource].speed;\n this.velocityX = interaction.pointerDelta[deltaSource].vx;\n this.velocityY = interaction.pointerDelta[deltaSource].vy;\n\n this.swipe = (ending || phase === 'inertiastart')? this.getSwipe() : null;\n\n signals.fire('new', signalArg);\n }\n\n getSwipe () {\n const interaction = this.interaction;\n\n if (interaction.prevEvent.speed < 600\n || this.timeStamp - interaction.prevEvent.timeStamp > 150) {\n return null;\n }\n\n let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI;\n const overlap = 22.5;\n\n if (angle < 0) {\n angle += 360;\n }\n\n const left = 135 - overlap <= angle && angle < 225 + overlap;\n const up = 225 - overlap <= angle && angle < 315 + overlap;\n\n const right = !left && (315 - overlap <= angle || angle < 45 + overlap);\n const down = !up && 45 - overlap <= angle && angle < 135 + overlap;\n\n return {\n up,\n down,\n left,\n right,\n angle,\n speed: interaction.prevEvent.speed,\n velocity: {\n x: interaction.prevEvent.velocityX,\n y: interaction.prevEvent.velocityY,\n },\n };\n }\n\n preventDefault () {}\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n}\n\nsignals.on('set-delta', function ({ iEvent, interaction, starting, deltaSource }) {\n const prevEvent = starting? iEvent : interaction.prevEvent;\n\n if (deltaSource === 'client') {\n iEvent.dx = iEvent.clientX - prevEvent.clientX;\n iEvent.dy = iEvent.clientY - prevEvent.clientY;\n }\n else {\n iEvent.dx = iEvent.pageX - prevEvent.pageX;\n iEvent.dy = iEvent.pageY - prevEvent.pageY;\n }\n});\n\nInteractEvent.signals = signals;\n\nmodule.exports = InteractEvent;\n","const is = require('./utils/is');\nconst events = require('./utils/events');\nconst extend = require('./utils/extend');\nconst actions = require('./actions/base');\nconst scope = require('./scope');\nconst Eventable = require('./Eventable');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nconst {\n getElementRect,\n nodeContains,\n trySelector,\n} = require('./utils/domUtils');\nconst { getWindow } = require('./utils/window');\nconst { indexOf, contains } = require('./utils/arr');\nconst { wheelEvent } = require('./utils/browser');\n\n// all set interactables\nscope.interactables = [];\n\n/*\\\n * Interactable\n [ property ]\n **\n * Object type returned by @interact\n\\*/\nclass Interactable {\n constructor (target, options) {\n options = options || {};\n\n this.target = target;\n this.events = new Eventable();\n this._context = options.context || scope.document;\n this._win = getWindow(trySelector(target)? this._context : target);\n this._doc = this._win.document;\n\n signals.fire('new', {\n target,\n options,\n interactable: this,\n win: this._win,\n });\n\n scope.addDocument( this._doc, this._win );\n\n scope.interactables.push(this);\n\n this.set(options);\n }\n\n setOnEvents (action, phases) {\n const onAction = 'on' + action;\n\n if (is.function(phases.onstart) ) { this.events[onAction + 'start' ] = phases.onstart ; }\n if (is.function(phases.onmove) ) { this.events[onAction + 'move' ] = phases.onmove ; }\n if (is.function(phases.onend) ) { this.events[onAction + 'end' ] = phases.onend ; }\n if (is.function(phases.oninertiastart)) { this.events[onAction + 'inertiastart' ] = phases.oninertiastart ; }\n\n return this;\n }\n\n setPerAction (action, options) {\n // for all the default per-action options\n for (const option in options) {\n // if this option exists for this action\n if (option in defaults[action]) {\n // if the option in the options arg is an object value\n if (is.object(options[option])) {\n // duplicate the object\n this.options[action][option] = extend(this.options[action][option] || {}, options[option]);\n\n if (is.object(defaults.perAction[option]) && 'enabled' in defaults.perAction[option]) {\n this.options[action][option].enabled = options[option].enabled === false? false : true;\n }\n }\n else if (is.bool(options[option]) && is.object(defaults.perAction[option])) {\n this.options[action][option].enabled = options[option];\n }\n else if (options[option] !== undefined) {\n // or if it's not undefined, do a plain assignment\n this.options[action][option] = options[option];\n }\n }\n }\n }\n\n /*\\\n * Interactable.getRect\n [ method ]\n *\n * The default function to get an Interactables bounding rect. Can be\n * overridden using @Interactable.rectChecker.\n *\n - element (Element) #optional The element to measure.\n = (object) The object's bounding rectangle.\n o {\n o top : 0,\n o left : 0,\n o bottom: 0,\n o right : 0,\n o width : 0,\n o height: 0\n o }\n \\*/\n getRect (element) {\n element = element || this.target;\n\n if (is.string(this.target) && !(is.element(element))) {\n element = this._context.querySelector(this.target);\n }\n\n return getElementRect(element);\n }\n\n /*\\\n * Interactable.rectChecker\n [ method ]\n *\n * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n - checker (function) #optional A function which returns this Interactable's bounding rectangle. See @Interactable.getRect\n = (function | object) The checker function or this Interactable\n \\*/\n rectChecker (checker) {\n if (is.function(checker)) {\n this.getRect = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.getRect;\n\n return this;\n }\n\n return this.getRect;\n }\n\n _backCompatOption (optionName, newValue) {\n if (trySelector(newValue) || is.object(newValue)) {\n this.options[optionName] = newValue;\n\n for (const action of actions.names) {\n this.options[action][optionName] = newValue;\n }\n\n return this;\n }\n\n return this.options[optionName];\n }\n\n /*\\\n * Interactable.origin\n [ method ]\n *\n * Gets or sets the origin of the Interactable's element. The x and y\n * of the origin will be subtracted from action event coordinates.\n *\n - origin (object | string) #optional An object eg. { x: 0, y: 0 } or string 'parent', 'self' or any CSS selector\n * OR\n - origin (Element) #optional An HTML or SVG Element whose rect will be used\n **\n = (object) The current origin or this Interactable\n \\*/\n origin (newValue) {\n return this._backCompatOption('origin', newValue);\n }\n\n /*\\\n * Interactable.deltaSource\n [ method ]\n *\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n - newValue (string) #optional Use 'client' if you will be scrolling while interacting; Use 'page' if you want autoScroll to work\n = (string | object) The current deltaSource or this Interactable\n \\*/\n deltaSource (newValue) {\n if (newValue === 'page' || newValue === 'client') {\n this.options.deltaSource = newValue;\n\n return this;\n }\n\n return this.options.deltaSource;\n }\n\n /*\\\n * Interactable.context\n [ method ]\n *\n * Gets the selector context Node of the Interactable. The default is `window.document`.\n *\n = (Node) The context Node of this Interactable\n **\n \\*/\n context () {\n return this._context;\n }\n\n inContext (element) {\n return (this._context === element.ownerDocument\n || nodeContains(this._context, element));\n }\n\n /*\\\n * Interactable.fire\n [ method ]\n *\n * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n - iEvent (InteractEvent) The InteractEvent object to be fired on this Interactable\n = (Interactable) this Interactable\n \\*/\n fire (iEvent) {\n this.events.fire(iEvent);\n\n return this;\n }\n\n _onOffMultiple (method, eventType, listener, options) {\n if (is.string(eventType) && eventType.search(' ') !== -1) {\n eventType = eventType.trim().split(/ +/);\n }\n\n if (is.array(eventType)) {\n for (let i = 0; i < eventType.length; i++) {\n this[method](eventType[i], listener, options);\n }\n\n return true;\n }\n\n if (is.object(eventType)) {\n for (const prop in eventType) {\n this[method](prop, eventType[prop], listener);\n }\n\n return true;\n }\n }\n\n /*\\\n * Interactable.on\n [ method ]\n *\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n - eventType (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) This Interactable\n \\*/\n on (eventType, listener, options) {\n if (this._onOffMultiple('on', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.on(eventType, listener);\n }\n // delegated event for selector\n else if (is.string(this.target)) {\n events.addDelegate(this.target, this._context, eventType, listener, options);\n }\n else {\n events.add(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.off\n [ method ]\n *\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n - eventType (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) This Interactable\n \\*/\n off (eventType, listener, options) {\n if (this._onOffMultiple('off', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n // if it is an action event type\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.off(eventType, listener);\n }\n // delegated event\n else if (is.string(this.target)) {\n events.removeDelegate(this.target, this._context, eventType, listener, options);\n }\n // remove listener from this Interatable's element\n else {\n events.remove(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.set\n [ method ]\n *\n * Reset the options of this Interactable\n - options (object) The new settings to apply\n = (object) This Interactable\n \\*/\n set (options) {\n if (!is.object(options)) {\n options = {};\n }\n\n this.options = extend({}, defaults.base);\n\n const perActions = extend({}, defaults.perAction);\n\n for (const actionName in actions.methodDict) {\n const methodName = actions.methodDict[actionName];\n\n this.options[actionName] = extend({}, defaults[actionName]);\n\n this.setPerAction(actionName, perActions);\n\n this[methodName](options[actionName]);\n }\n\n for (const setting of Interactable.settingsMethods) {\n this.options[setting] = defaults.base[setting];\n\n if (setting in options) {\n this[setting](options[setting]);\n }\n }\n\n signals.fire('set', {\n options,\n interactable: this,\n });\n\n return this;\n }\n\n /*\\\n * Interactable.unset\n [ method ]\n *\n * Remove this interactable from the list of interactables and remove\n * it's action capabilities and event listeners\n *\n = (object) @interact\n \\*/\n unset () {\n events.remove(this.target, 'all');\n\n if (is.string(this.target)) {\n // remove delegated events\n for (const type in events.delegatedEvents) {\n const delegated = events.delegatedEvents[type];\n\n if (delegated.selectors[0] === this.target\n && delegated.contexts[0] === this._context) {\n\n delegated.selectors.splice(0, 1);\n delegated.contexts .splice(0, 1);\n delegated.listeners.splice(0, 1);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegated[type] = null;\n }\n }\n\n events.remove(this._context, type, events.delegateListener);\n events.remove(this._context, type, events.delegateUseCapture, true);\n }\n }\n else {\n events.remove(this, 'all');\n }\n\n signals.fire('unset', { interactable: this });\n\n scope.interactables.splice(indexOf(scope.interactables, this), 1);\n\n // Stop related interactions when an Interactable is unset\n for (const interaction of scope.interactions || []) {\n if (interaction.target === this && interaction.interacting()) {\n interaction.stop();\n }\n }\n\n return scope.interact;\n }\n}\n\nscope.interactables.indexOfElement = function indexOfElement (target, context) {\n context = context || scope.document;\n\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n if (interactable.target === target && interactable._context === context) {\n return i;\n }\n }\n return -1;\n};\n\nscope.interactables.get = function interactableGet (element, options, dontCheckInContext) {\n const ret = this[this.indexOfElement(element, options && options.context)];\n\n return ret && (is.string(element) || dontCheckInContext || ret.inContext(element))? ret : null;\n};\n\nscope.interactables.forEachSelector = function (callback, element) {\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n // skip non CSS selector targets and out of context elements\n if (!is.string(interactable.target)\n || (element && !interactable.inContext(element))) {\n continue;\n }\n\n const ret = callback(interactable, interactable.target, interactable._context, i, this);\n\n if (ret !== undefined) {\n return ret;\n }\n }\n};\n\n// all interact.js eventTypes\nInteractable.eventTypes = scope.eventTypes = [];\n\nInteractable.signals = signals;\n\nInteractable.settingsMethods = [ 'deltaSource', 'origin', 'preventDefault', 'rectChecker' ];\n\nmodule.exports = Interactable;\n","const scope = require('./scope');\nconst utils = require('./utils');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst domObjects = require('./utils/domObjects');\nconst finder = require('./utils/interactionFinder');\nconst signals = require('./utils/Signals').new();\n\nconst listeners = {};\nconst methodNames = [\n 'pointerDown', 'pointerMove', 'pointerUp',\n 'updatePointer', 'removePointer',\n];\n\n// for ignoring browser's simulated mouse events\nlet prevTouchTime = 0;\n\n// all active and idle interactions\nscope.interactions = [];\n\nclass Interaction {\n constructor ({ pointerType }) {\n this.target = null; // current interactable being interacted with\n this.element = null; // the target element of the interactable\n\n this.prepared = { // action that's ready to be fired on next move event\n name : null,\n axis : null,\n edges: null,\n };\n\n // keep track of added pointers\n this.pointers = [];\n this.pointerIds = [];\n this.downTargets = [];\n this.downTimes = [];\n\n // Previous native pointer move event coordinates\n this.prevCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n // current native pointer move event coordinates\n this.curCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Starting InteractEvent pointer coordinates\n this.startCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Change in coordinates and time of the pointer\n this.pointerDelta = {\n page : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n client : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n timeStamp: 0,\n };\n\n this.downEvent = null; // pointerdown/mousedown/touchstart event\n this.downPointer = {};\n\n this._eventTarget = null;\n this._curEventTarget = null;\n\n this.prevEvent = null; // previous action event\n\n this.pointerIsDown = false;\n this.pointerWasMoved = false;\n this._interacting = false;\n\n this.pointerType = pointerType;\n\n signals.fire('new', this);\n\n scope.interactions.push(this);\n }\n\n pointerDown (pointer, event, eventTarget) {\n const pointerIndex = this.updatePointer(pointer, event, true);\n\n signals.fire('down', {\n pointer,\n event,\n eventTarget,\n pointerIndex,\n interaction: this,\n });\n }\n\n /*\\\n * Interaction.start\n [ method ]\n *\n * Start an action with the given Interactable and Element as tartgets. The\n * action must be enabled for the target Interactable and an appropriate number\n * of pointers must be held down - 1 for drag/resize, 2 for gesture.\n *\n * Use it with `interactable.able({ manualStart: false })` to always\n * [start actions manually](https://github.com/taye/interact.js/issues/114)\n *\n - action (object) The action to be performed - drag, resize, etc.\n - target (Interactable) The Interactable to target\n - element (Element) The DOM Element to target\n = (object) interact\n **\n | interact(target)\n | .draggable({\n | // disable the default drag start by down->move\n | manualStart: true\n | })\n | // start dragging after the user holds the pointer down\n | .on('hold', function (event) {\n | var interaction = event.interaction;\n |\n | if (!interaction.interacting()) {\n | interaction.start({ name: 'drag' },\n | event.interactable,\n | event.currentTarget);\n | }\n | });\n \\*/\n start (action, target, element) {\n if (this.interacting()\n || !this.pointerIsDown\n || this.pointerIds.length < (action.name === 'gesture'? 2 : 1)) {\n return;\n }\n\n // if this interaction had been removed after stopping\n // add it back\n if (utils.indexOf(scope.interactions, this) === -1) {\n scope.interactions.push(this);\n }\n\n utils.copyAction(this.prepared, action);\n this.target = target;\n this.element = element;\n\n signals.fire('action-start', {\n interaction: this,\n event: this.downEvent,\n });\n }\n\n pointerMove (pointer, event, eventTarget) {\n if (!this.simulation) {\n this.updatePointer(pointer);\n utils.setCoords(this.curCoords, this.pointers);\n }\n\n const duplicateMove = (this.curCoords.page.x === this.prevCoords.page.x\n && this.curCoords.page.y === this.prevCoords.page.y\n && this.curCoords.client.x === this.prevCoords.client.x\n && this.curCoords.client.y === this.prevCoords.client.y);\n\n let dx;\n let dy;\n\n // register movement greater than pointerMoveTolerance\n if (this.pointerIsDown && !this.pointerWasMoved) {\n dx = this.curCoords.client.x - this.startCoords.client.x;\n dy = this.curCoords.client.y - this.startCoords.client.y;\n\n this.pointerWasMoved = utils.hypot(dx, dy) > Interaction.pointerMoveTolerance;\n }\n\n const signalArg = {\n pointer,\n pointerIndex: this.getPointerIndex(pointer),\n event,\n eventTarget,\n dx,\n dy,\n duplicate: duplicateMove,\n interaction: this,\n interactingBeforeMove: this.interacting(),\n };\n\n if (!duplicateMove) {\n // set pointer coordinate, time changes and speeds\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n }\n\n signals.fire('move', signalArg);\n\n if (!duplicateMove) {\n // if interacting, fire an 'action-move' signal etc\n if (this.interacting()) {\n this.doMove(signalArg);\n }\n\n if (this.pointerWasMoved) {\n utils.copyCoords(this.prevCoords, this.curCoords);\n }\n }\n }\n\n /*\\\n * Interaction.doMove\n [ method ]\n *\n * Force a move of the current action at the same coordinates. Useful if\n * snap/restrict has been changed and you want a movement with the new\n * settings.\n *\n **\n | interact(target)\n | .draggable(true)\n | .on('dragmove', function (event) {\n | if (someCondition) {\n | // change the snap settings\n | event.interactable.draggable({ snap: { targets: [] }});\n | // fire another move event with re-calculated snap\n | event.interaction.doMove();\n | }\n | });\n \\*/\n doMove (signalArg) {\n signalArg = utils.extend({\n pointer: this.pointers[0],\n event: this.prevEvent,\n eventTarget: this._eventTarget,\n interaction: this,\n }, signalArg || {});\n\n signals.fire('before-action-move', signalArg);\n\n if (!this._dontFireMove) {\n signals.fire('action-move', signalArg);\n }\n\n this._dontFireMove = false;\n }\n\n // End interact move events and stop auto-scroll unless simulation is running\n pointerUp (pointer, event, eventTarget, curEventTarget) {\n const pointerIndex = this.getPointerIndex(pointer);\n\n signals.fire(/cancel$/i.test(event.type)? 'cancel' : 'up', {\n pointer,\n pointerIndex,\n event,\n eventTarget,\n curEventTarget,\n interaction: this,\n });\n\n if (!this.simulation) {\n this.end(event);\n }\n\n this.pointerIsDown = false;\n this.removePointer(pointer, event);\n }\n\n /*\\\n * Interaction.end\n [ method ]\n *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n - event (PointerEvent) #optional\n **\n | interact(target)\n | .draggable(true)\n | .on('move', function (event) {\n | if (event.pageX > 1000) {\n | // end the current action\n | event.interaction.end();\n | // stop all further listeners from being called\n | event.stopImmediatePropagation();\n | }\n | });\n \\*/\n end (event) {\n event = event || this.prevEvent;\n\n if (this.interacting()) {\n signals.fire('action-end', {\n event,\n interaction: this,\n });\n }\n\n this.stop();\n }\n\n currentAction () {\n return this._interacting? this.prepared.name: null;\n }\n\n interacting () {\n return this._interacting;\n }\n\n stop () {\n signals.fire('stop', { interaction: this });\n\n if (this._interacting) {\n signals.fire('stop-active', { interaction: this });\n signals.fire('stop-' + this.prepared.name, { interaction: this });\n }\n\n this.target = this.element = null;\n\n this._interacting = false;\n this.prepared.name = this.prevEvent = null;\n }\n\n getPointerIndex (pointer) {\n // mouse and pen interactions may have only one pointer\n if (this.pointerType === 'mouse' || this.pointerType === 'pen') {\n return 0;\n }\n\n return utils.indexOf(this.pointerIds, utils.getPointerId(pointer));\n }\n\n updatePointer (pointer, event, down = event && /(down|start)$/i.test(event.type)) {\n const id = utils.getPointerId(pointer);\n let index = this.getPointerIndex(pointer);\n\n if (index === -1) {\n index = this.pointerIds.length;\n this.pointerIds[index] = id;\n }\n\n if (down) {\n signals.fire('update-pointer-down', {\n pointer,\n event,\n down,\n pointerId: id,\n pointerIndex: index,\n interaction: this,\n });\n }\n\n this.pointers[index] = pointer;\n\n return index;\n }\n\n removePointer (pointer, event) {\n const index = this.getPointerIndex(pointer);\n\n if (index === -1) { return; }\n\n signals.fire('remove-pointer', {\n pointer,\n event,\n pointerIndex: index,\n interaction: this,\n });\n\n this.pointers .splice(index, 1);\n this.pointerIds .splice(index, 1);\n this.downTargets.splice(index, 1);\n this.downTimes .splice(index, 1);\n }\n\n _updateEventTargets (target, currentTarget) {\n this._eventTarget = target;\n this._curEventTarget = currentTarget;\n }\n}\n\nfor (let i = 0, len = methodNames.length; i < len; i++) {\n const method = methodNames[i];\n\n listeners[method] = doOnInteractions(method);\n}\n\nfunction doOnInteractions (method) {\n return (function (event) {\n const pointerType = utils.getPointerType(event);\n const [eventTarget, curEventTarget] = utils.getEventTargets(event);\n const matches = []; // [ [pointer, interaction], ...]\n\n if (browser.supportsTouch && /touch/.test(event.type)) {\n prevTouchTime = new Date().getTime();\n\n for (let i = 0; i < event.changedTouches.length; i++) {\n const pointer = event.changedTouches[i];\n const interaction = finder.search(pointer, event.type, eventTarget);\n\n matches.push([pointer, interaction || new Interaction({ pointerType })]);\n }\n }\n else {\n let invalidPointer = false;\n\n if (!browser.supportsPointerEvent && /mouse/.test(event.type)) {\n // ignore mouse events while touch interactions are active\n for (let i = 0; i < scope.interactions.length && !invalidPointer; i++) {\n invalidPointer = scope.interactions[i].pointerType !== 'mouse' && scope.interactions[i].pointerIsDown;\n }\n\n // try to ignore mouse events that are simulated by the browser\n // after a touch event\n invalidPointer = invalidPointer\n || (new Date().getTime() - prevTouchTime < 500)\n // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated\n || event.timeStamp === 0;\n }\n\n if (!invalidPointer) {\n let interaction = finder.search(event, event.type, eventTarget);\n\n if (!interaction) {\n interaction = new Interaction({ pointerType });\n }\n\n matches.push([event, interaction]);\n }\n }\n\n for (const [pointer, interaction] of matches) {\n interaction._updateEventTargets(eventTarget, curEventTarget);\n interaction[method](pointer, event, eventTarget, curEventTarget);\n }\n });\n}\n\nfunction endAll (event) {\n for (let i = 0; i < scope.interactions.length; i++) {\n const interaction = scope.interactions[i];\n\n interaction.end(event);\n signals.fire('endall', { event, interaction });\n }\n}\n\nconst docEvents = { /* 'eventType': listenerFunc */ };\nconst pEventTypes = browser.pEventTypes;\n\nif (domObjects.PointerEvent) {\n docEvents[pEventTypes.down ] = listeners.pointerDown;\n docEvents[pEventTypes.move ] = listeners.pointerMove;\n docEvents[pEventTypes.up ] = listeners.pointerUp;\n docEvents[pEventTypes.cancel] = listeners.pointerUp;\n}\nelse {\n docEvents.mousedown = listeners.pointerDown;\n docEvents.mousemove = listeners.pointerMove;\n docEvents.mouseup = listeners.pointerUp;\n\n docEvents.touchstart = listeners.pointerDown;\n docEvents.touchmove = listeners.pointerMove;\n docEvents.touchend = listeners.pointerUp;\n docEvents.touchcancel = listeners.pointerUp;\n}\n\ndocEvents.blur = endAll;\n\nfunction onDocSignal ({ doc }, signalName) {\n const eventMethod = signalName.indexOf('add') === 0\n ? events.add : events.remove;\n\n // delegate event listener\n for (const eventType in scope.delegatedEvents) {\n eventMethod(doc, eventType, events.delegateListener);\n eventMethod(doc, eventType, events.delegateUseCapture, true);\n }\n\n for (const eventType in docEvents) {\n eventMethod(doc, eventType, docEvents[eventType]);\n }\n}\n\nsignals.on('update-pointer-down', ({ interaction, pointer, pointerId, pointerIndex, event, eventTarget, down }) => {\n interaction.pointerIds[pointerIndex] = pointerId;\n interaction.pointers[pointerIndex] = pointer;\n\n if (down) {\n interaction.pointerIsDown = true;\n }\n\n if (!interaction.interacting()) {\n utils.setCoords(interaction.startCoords, interaction.pointers);\n\n utils.copyCoords(interaction.curCoords , interaction.startCoords);\n utils.copyCoords(interaction.prevCoords, interaction.startCoords);\n\n interaction.downEvent = event;\n interaction.downTimes[pointerIndex] = interaction.curCoords.timeStamp;\n interaction.downTargets[pointerIndex] = eventTarget || event && utils.getEventTargets(event)[0];\n interaction.pointerWasMoved = false;\n\n utils.pointerExtend(interaction.downPointer, pointer);\n }\n});\n\nscope.signals.on('add-document' , onDocSignal);\nscope.signals.on('remove-document', onDocSignal);\n\nInteraction.pointerMoveTolerance = 1;\nInteraction.doOnInteractions = doOnInteractions;\nInteraction.endAll = endAll;\nInteraction.signals = signals;\nInteraction.docEvents = docEvents;\n\nscope.endAllInteractions = endAll;\n\nmodule.exports = Interaction;\n","const Interaction = require('../Interaction');\nconst InteractEvent = require('../InteractEvent');\n\nconst actions = {\n firePrepared,\n names: [],\n methodDict: {},\n};\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n interaction._interacting = true;\n firePrepared(interaction, event, 'start');\n});\n\nInteraction.signals.on('action-move', function ({ interaction, event, preEnd }) {\n firePrepared(interaction, event, 'move', preEnd);\n\n // if the action was ended in a listener\n if (!interaction.interacting()) { return false; }\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n firePrepared(interaction, event, 'end');\n});\n\nfunction firePrepared (interaction, event, phase, preEnd) {\n const actionName = interaction.prepared.name;\n\n const newEvent = new InteractEvent(interaction, event, actionName, phase, interaction.element, null, preEnd);\n\n interaction.target.fire(newEvent);\n interaction.prevEvent = newEvent;\n}\n\nmodule.exports = actions;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drag = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n startAxis : 'xy',\n lockAxis : 'xy',\n },\n\n checker: function (pointer, event, interactable) {\n const dragOptions = interactable.options.drag;\n\n return dragOptions.enabled\n ? { name: 'drag', axis: (dragOptions.lockAxis === 'start'\n ? dragOptions.startAxis\n : dragOptions.lockAxis)}\n : null;\n },\n\n getCursor: function () {\n return 'move';\n },\n};\n\nInteraction.signals.on('before-action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n interaction.curCoords.page.y = interaction.startCoords.page.y;\n interaction.curCoords.client.y = interaction.startCoords.client.y;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vx);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vx);\n interaction.pointerDelta.client.vy = 0;\n interaction.pointerDelta.page.vy = 0;\n }\n else if (axis === 'y') {\n interaction.curCoords.page.x = interaction.startCoords.page.x;\n interaction.curCoords.client.x = interaction.startCoords.client.x;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vy);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vy);\n interaction.pointerDelta.client.vx = 0;\n interaction.pointerDelta.page.vx = 0;\n }\n});\n\n// dragmove\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'dragmove') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n iEvent.pageY = interaction.startCoords.page.y;\n iEvent.clientY = interaction.startCoords.client.y;\n iEvent.dy = 0;\n }\n else if (axis === 'y') {\n iEvent.pageX = interaction.startCoords.page.x;\n iEvent.clientX = interaction.startCoords.client.x;\n iEvent.dx = 0;\n }\n});\n\n/*\\\n * Interactable.draggable\n [ method ]\n *\n * Gets or sets whether drag actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of drag events\n | var isDraggable = interact('ul li').draggable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on drag events (object makes the Interactable draggable)\n = (object) This Interactable\n | interact(element).draggable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // the axis in which the first movement must be\n | // for the drag sequence to start\n | // 'xy' by default - any direction\n | startAxis: 'x' || 'y' || 'xy',\n |\n | // 'xy' by default - don't restrict to one axis (move in any direction)\n | // 'x' or 'y' to restrict movement to either axis\n | // 'start' to restrict movement to the axis the drag started in\n | lockAxis: 'x' || 'y' || 'xy' || 'start',\n |\n | // max number of drags that can happen concurrently\n | // with elements of this Interactable. Infinity by default\n | max: Infinity,\n |\n | // max number of drags that can target the same element+Interactable\n | // 1 by default\n | maxPerElement: 2\n | });\n\\*/\nInteractable.prototype.draggable = function (options) {\n if (utils.is.object(options)) {\n this.options.drag.enabled = options.enabled === false? false: true;\n this.setPerAction('drag', options);\n this.setOnEvents('drag', options);\n\n if (/^(xy|x|y|start)$/.test(options.lockAxis)) {\n this.options.drag.lockAxis = options.lockAxis;\n }\n if (/^(xy|x|y)$/.test(options.startAxis)) {\n this.options.drag.startAxis = options.startAxis;\n }\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drag.enabled = options;\n\n if (!options) {\n this.ondragstart = this.ondragstart = this.ondragend = null;\n }\n\n return this;\n }\n\n return this.options.drag;\n};\n\nactions.drag = drag;\nactions.names.push('drag');\nutils.merge(Interactable.eventTypes, [\n 'dragstart',\n 'dragmove',\n 'draginertiastart',\n 'draginertiaresume',\n 'dragend',\n]);\nactions.methodDict.drag = 'draggable';\n\ndefaultOptions.drag = drag.defaults;\n\nmodule.exports = drag;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst scope = require('../scope');\nconst interact = require('../interact');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drop = {\n defaults: {\n enabled: false,\n accept : null,\n overlap: 'pointer',\n },\n};\n\nlet dynamicDrop = false;\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // reset active dropzones\n interaction.activeDrops.dropzones = [];\n interaction.activeDrops.elements = [];\n interaction.activeDrops.rects = [];\n\n interaction.dropEvents = null;\n\n if (!interaction.dynamicDrop) {\n setActiveDrops(interaction, interaction.element);\n }\n\n const dragEvent = interaction.prevEvent;\n const dropEvents = getDropEvents(interaction, event, dragEvent);\n\n if (dropEvents.activate) {\n fireActiveDrops(interaction, dropEvents.activate);\n }\n});\n\nInteractEvent.signals.on('new', function ({ interaction, iEvent, event }) {\n if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { return; }\n\n const draggableElement = interaction.element;\n const dragEvent = iEvent;\n const dropResult = getDrop(dragEvent, event, draggableElement);\n\n interaction.dropTarget = dropResult.dropzone;\n interaction.dropElement = dropResult.element;\n\n interaction.dropEvents = getDropEvents(interaction, event, dragEvent);\n});\n\nInteraction.signals.on('action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n fireDropEvents(interaction, interaction.dropEvents);\n});\n\nInteraction.signals.on('action-end', function ({ interaction }) {\n if (interaction.prepared.name === 'drag') {\n fireDropEvents(interaction, interaction.dropEvents);\n }\n});\n\nInteraction.signals.on('stop-drag', function ({ interaction }) {\n interaction.activeDrops.dropzones =\n interaction.activeDrops.elements =\n interaction.activeDrops.rects =\n interaction.dropEvents = null;\n});\n\nfunction collectDrops (interaction, element) {\n const drops = [];\n const elements = [];\n\n element = element || interaction.element;\n\n // collect all dropzones and their elements which qualify for a drop\n for (const current of scope.interactables) {\n if (!current.options.drop.enabled) { continue; }\n\n const accept = current.options.drop.accept;\n\n // test the draggable element against the dropzone's accept setting\n if ((utils.is.element(accept) && accept !== element)\n || (utils.is.string(accept)\n && !utils.matchesSelector(element, accept))) {\n\n continue;\n }\n\n // query for new elements if necessary\n const dropElements = utils.is.string(current.target)\n ? current._context.querySelectorAll(current.target)\n : [current.target];\n\n for (let i = 0; i < dropElements.length; i++) {\n const currentElement = dropElements[i];\n\n if (currentElement !== element) {\n drops.push(current);\n elements.push(currentElement);\n }\n }\n }\n\n return {\n elements,\n dropzones: drops,\n };\n}\n\nfunction fireActiveDrops (interaction, event) {\n let prevElement;\n\n // loop through all active dropzones and trigger event\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n const current = interaction.activeDrops.dropzones[i];\n const currentElement = interaction.activeDrops.elements [i];\n\n // prevent trigger of duplicate events on same element\n if (currentElement !== prevElement) {\n // set current element as event target\n event.target = currentElement;\n current.fire(event);\n }\n prevElement = currentElement;\n }\n}\n\n// Collect a new set of possible drops and save them in activeDrops.\n// setActiveDrops should always be called when a drag has just started or a\n// drag event happens while dynamicDrop is true\nfunction setActiveDrops (interaction, dragElement) {\n // get dropzones and their elements that could receive the draggable\n const possibleDrops = collectDrops(interaction, dragElement, true);\n\n interaction.activeDrops.dropzones = possibleDrops.dropzones;\n interaction.activeDrops.elements = possibleDrops.elements;\n interaction.activeDrops.rects = [];\n\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n interaction.activeDrops.rects[i] =\n interaction.activeDrops.dropzones[i].getRect(interaction.activeDrops.elements[i]);\n }\n}\n\nfunction getDrop (dragEvent, event, dragElement) {\n const interaction = dragEvent.interaction;\n const validDrops = [];\n\n if (dynamicDrop) {\n setActiveDrops(interaction, dragElement);\n }\n\n // collect all dropzones and their elements which qualify for a drop\n for (let j = 0; j < interaction.activeDrops.dropzones.length; j++) {\n const current = interaction.activeDrops.dropzones[j];\n const currentElement = interaction.activeDrops.elements [j];\n const rect = interaction.activeDrops.rects [j];\n\n validDrops.push(current.dropCheck(dragEvent, event, interaction.target, dragElement, currentElement, rect)\n ? currentElement\n : null);\n }\n\n // get the most appropriate dropzone based on DOM depth and order\n const dropIndex = utils.indexOfDeepestElement(validDrops);\n\n return {\n dropzone: interaction.activeDrops.dropzones[dropIndex] || null,\n element : interaction.activeDrops.elements [dropIndex] || null,\n };\n}\n\nfunction getDropEvents (interaction, pointerEvent, dragEvent) {\n const dropEvents = {\n enter : null,\n leave : null,\n activate : null,\n deactivate: null,\n move : null,\n drop : null,\n };\n\n const tmpl = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n };\n\n if (interaction.dropElement !== interaction.prevDropElement) {\n // if there was a prevDropTarget, create a dragleave event\n if (interaction.prevDropTarget) {\n dropEvents.leave = utils.extend({ type: 'dragleave' }, tmpl);\n\n dragEvent.dragLeave = dropEvents.leave.target = interaction.prevDropElement;\n dragEvent.prevDropzone = dropEvents.leave.dropzone = interaction.prevDropTarget;\n }\n // if the dropTarget is not null, create a dragenter event\n if (interaction.dropTarget) {\n dropEvents.enter = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n type : 'dragenter',\n };\n\n dragEvent.dragEnter = interaction.dropElement;\n dragEvent.dropzone = interaction.dropTarget;\n }\n }\n\n if (dragEvent.type === 'dragend' && interaction.dropTarget) {\n dropEvents.drop = utils.extend({ type: 'drop' }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n dragEvent.relatedTarget = interaction.dropElement;\n }\n if (dragEvent.type === 'dragstart') {\n dropEvents.activate = utils.extend({ type: 'dropactivate' }, tmpl);\n\n dropEvents.activate.target = null;\n dropEvents.activate.dropzone = null;\n }\n if (dragEvent.type === 'dragend') {\n dropEvents.deactivate = utils.extend({ type: 'dropdeactivate' }, tmpl);\n\n dropEvents.deactivate.target = null;\n dropEvents.deactivate.dropzone = null;\n }\n if (dragEvent.type === 'dragmove' && interaction.dropTarget) {\n dropEvents.move = utils.extend({\n dragmove : dragEvent,\n type : 'dropmove',\n }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n }\n\n return dropEvents;\n}\n\nfunction fireDropEvents (interaction, dropEvents) {\n if (dropEvents.leave) { interaction.prevDropTarget.fire(dropEvents.leave); }\n if (dropEvents.move ) { interaction.dropTarget.fire(dropEvents.move ); }\n if (dropEvents.enter) { interaction.dropTarget.fire(dropEvents.enter); }\n if (dropEvents.drop ) { interaction.dropTarget.fire(dropEvents.drop ); }\n if (dropEvents.deactivate) {\n fireActiveDrops(interaction, dropEvents.deactivate);\n }\n\n interaction.prevDropTarget = interaction.dropTarget;\n interaction.prevDropElement = interaction.dropElement;\n}\n\n/*\\\n * Interactable.dropzone\n [ method ]\n *\n * Returns or sets whether elements can be dropped onto this\n * Interactable to trigger drop events\n *\n * Dropzones can receive the following events:\n * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends\n * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone\n * - `dragmove` when a draggable that has entered the dropzone is moved\n * - `drop` when a draggable is dropped into this dropzone\n *\n * Use the `accept` option to allow only elements that match the given CSS\n * selector or element. The value can be:\n *\n * - **an Element** - only that element can be dropped into this dropzone.\n * - **a string**, - the element being dragged must match it as a CSS selector.\n * - **`null`** - accept options is cleared - it accepts any element.\n *\n * Use the `overlap` option to set how drops are checked for. The allowed\n * values are:\n *\n * - `'pointer'`, the pointer must be over the dropzone (default)\n * - `'center'`, the draggable element's center must be over the dropzone\n * - a number from 0-1 which is the `(intersection area) / (draggable area)`.\n * e.g. `0.5` for drop to happen when half of the area of the draggable is\n * over the dropzone\n *\n * Use the `checker` option to specify a function to check if a dragged\n * element is over this Interactable.\n *\n | interact(target)\n | .dropChecker(function(dragEvent, // related dragmove or dragend event\n | event, // TouchEvent/PointerEvent/MouseEvent\n | dropped, // bool result of the default checker\n | dropzone, // dropzone Interactable\n | dropElement, // dropzone elemnt\n | draggable, // draggable Interactable\n | draggableElement) {// draggable element\n |\n | return dropped && event.target.hasAttribute('allow-drop');\n | }\n *\n *\n - options (boolean | object | null) #optional The new value to be set.\n | interact('.drop').dropzone({\n | accept: '.can-drop' || document.getElementById('single-drop'),\n | overlap: 'pointer' || 'center' || zeroToOne\n | }\n = (boolean | object) The current setting or this Interactable\n\\*/\nInteractable.prototype.dropzone = function (options) {\n if (utils.is.object(options)) {\n this.options.drop.enabled = options.enabled === false? false: true;\n\n if (utils.is.function(options.ondrop) ) { this.events.ondrop = options.ondrop ; }\n if (utils.is.function(options.ondropactivate) ) { this.events.ondropactivate = options.ondropactivate ; }\n if (utils.is.function(options.ondropdeactivate)) { this.events.ondropdeactivate = options.ondropdeactivate; }\n if (utils.is.function(options.ondragenter) ) { this.events.ondragenter = options.ondragenter ; }\n if (utils.is.function(options.ondragleave) ) { this.events.ondragleave = options.ondragleave ; }\n if (utils.is.function(options.ondropmove) ) { this.events.ondropmove = options.ondropmove ; }\n\n if (/^(pointer|center)$/.test(options.overlap)) {\n this.options.drop.overlap = options.overlap;\n }\n else if (utils.is.number(options.overlap)) {\n this.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0);\n }\n if ('accept' in options) {\n this.options.drop.accept = options.accept;\n }\n if ('checker' in options) {\n this.options.drop.checker = options.checker;\n }\n\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drop.enabled = options;\n\n if (!options) {\n this.ondragenter = this.ondragleave = this.ondrop\n = this.ondropactivate = this.ondropdeactivate = null;\n }\n\n return this;\n }\n\n return this.options.drop;\n};\n\nInteractable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) {\n let dropped = false;\n\n // if the dropzone has no rect (eg. display: none)\n // call the custom dropChecker or just return false\n if (!(rect = rect || this.getRect(dropElement))) {\n return (this.options.drop.checker\n ? this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement)\n : false);\n }\n\n const dropOverlap = this.options.drop.overlap;\n\n if (dropOverlap === 'pointer') {\n const origin = utils.getOriginXY(draggable, draggableElement, 'drag');\n const page = utils.getPageXY(dragEvent);\n\n page.x += origin.x;\n page.y += origin.y;\n\n const horizontal = (page.x > rect.left) && (page.x < rect.right);\n const vertical = (page.y > rect.top ) && (page.y < rect.bottom);\n\n dropped = horizontal && vertical;\n }\n\n const dragRect = draggable.getRect(draggableElement);\n\n if (dragRect && dropOverlap === 'center') {\n const cx = dragRect.left + dragRect.width / 2;\n const cy = dragRect.top + dragRect.height / 2;\n\n dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom;\n }\n\n if (dragRect && utils.is.number(dropOverlap)) {\n const overlapArea = (Math.max(0, Math.min(rect.right , dragRect.right ) - Math.max(rect.left, dragRect.left))\n * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top , dragRect.top )));\n\n const overlapRatio = overlapArea / (dragRect.width * dragRect.height);\n\n dropped = overlapRatio >= dropOverlap;\n }\n\n if (this.options.drop.checker) {\n dropped = this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement);\n }\n\n return dropped;\n};\n\nInteractable.signals.on('unset', function ({ interactable }) {\n interactable.dropzone(false);\n});\n\nInteractable.settingsMethods.push('dropChecker');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.dropTarget = null; // the dropzone a drag target might be dropped into\n interaction.dropElement = null; // the element at the time of checking\n interaction.prevDropTarget = null; // the dropzone that was recently dragged away from\n interaction.prevDropElement = null; // the element at the time of checking\n interaction.dropEvents = null; // the dropEvents related to the current drag event\n\n interaction.activeDrops = {\n dropzones: [], // the dropzones that are mentioned below\n elements : [], // elements of dropzones that accept the target draggable\n rects : [], // the rects of the elements mentioned above\n };\n\n});\n\nInteraction.signals.on('stop', function ({ interaction }) {\n interaction.dropTarget = interaction.dropElement =\n interaction.prevDropTarget = interaction.prevDropElement = null;\n});\n\n/*\\\n * interact.dynamicDrop\n [ method ]\n *\n * Returns or sets whether the dimensions of dropzone elements are\n * calculated on every dragmove or only on dragstart for the default\n * dropChecker\n *\n - newValue (boolean) #optional True to check on each move. False to check only before start\n = (boolean | interact) The current setting or interact\n\\*/\ninteract.dynamicDrop = function (newValue) {\n if (utils.is.bool(newValue)) {\n //if (dragging && dynamicDrop !== newValue && !newValue) {\n //calcRects(dropzones);\n //}\n\n dynamicDrop = newValue;\n\n return interact;\n }\n return dynamicDrop;\n};\n\nutils.merge(Interactable.eventTypes, [\n 'dragenter',\n 'dragleave',\n 'dropactivate',\n 'dropdeactivate',\n 'dropmove',\n 'drop',\n]);\nactions.methodDict.drop = 'dropzone';\n\ndefaultOptions.drop = drop.defaults;\n\nmodule.exports = drop;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst gesture = {\n defaults: {\n enabled : false,\n origin : null,\n restrict: null,\n },\n\n checker: function (pointer, event, interactable, element, interaction) {\n if (interaction.pointerIds.length >= 2) {\n return { name: 'gesture' };\n }\n\n return null;\n },\n\n getCursor: function () {\n return '';\n },\n};\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturestart') { return; }\n iEvent.ds = 0;\n\n interaction.gesture.startDistance = interaction.gesture.prevDistance = iEvent.distance;\n interaction.gesture.startAngle = interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.scale = 1;\n});\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturemove') { return; }\n\n iEvent.ds = iEvent.scale - interaction.gesture.scale;\n\n interaction.target.fire(iEvent);\n\n interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.prevDistance = iEvent.distance;\n\n if (iEvent.scale !== Infinity\n && iEvent.scale !== null\n && iEvent.scale !== undefined\n && !isNaN(iEvent.scale)) {\n\n interaction.gesture.scale = iEvent.scale;\n }\n});\n\n/*\\\n * Interactable.gesturable\n [ method ]\n *\n * Gets or sets whether multitouch gestures can be performed on the\n * Interactable's element\n *\n = (boolean) Indicates if this can be the target of gesture events\n | var isGestureable = interact(element).gesturable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on gesture events (makes the Interactable gesturable)\n = (object) this Interactable\n | interact(element).gesturable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // limit multiple gestures.\n | // See the explanation in @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n\\*/\nInteractable.prototype.gesturable = function (options) {\n if (utils.is.object(options)) {\n this.options.gesture.enabled = options.enabled === false? false: true;\n this.setPerAction('gesture', options);\n this.setOnEvents('gesture', options);\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.gesture.enabled = options;\n\n if (!options) {\n this.ongesturestart = this.ongesturestart = this.ongestureend = null;\n }\n\n return this;\n }\n\n return this.options.gesture;\n};\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action, event, starting, ending, deltaSource }) {\n if (action !== 'gesture') { return; }\n\n const pointers = interaction.pointers;\n\n iEvent.touches = [pointers[0], pointers[1]];\n\n if (starting) {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = 1;\n iEvent.ds = 0;\n iEvent.angle = utils.touchAngle(pointers, undefined, deltaSource);\n iEvent.da = 0;\n }\n else if (ending || event instanceof InteractEvent) {\n iEvent.distance = interaction.prevEvent.distance;\n iEvent.box = interaction.prevEvent.box;\n iEvent.scale = interaction.prevEvent.scale;\n iEvent.ds = iEvent.scale - 1;\n iEvent.angle = interaction.prevEvent.angle;\n iEvent.da = iEvent.angle - interaction.gesture.startAngle;\n }\n else {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = iEvent.distance / interaction.gesture.startDistance;\n iEvent.angle = utils.touchAngle(pointers, interaction.gesture.prevAngle, deltaSource);\n\n iEvent.ds = iEvent.scale - interaction.gesture.prevScale;\n iEvent.da = iEvent.angle - interaction.gesture.prevAngle;\n }\n});\n\nInteraction.signals.on('new', function (interaction) {\n interaction.gesture = {\n start: { x: 0, y: 0 },\n\n startDistance: 0, // distance between two touches of touchStart\n prevDistance : 0,\n distance : 0,\n\n scale: 1, // gesture.distance / gesture.startDistance\n\n startAngle: 0, // angle of line joining two touches\n prevAngle : 0, // angle of the previous gesture event\n };\n});\n\nactions.gesture = gesture;\nactions.names.push('gesture');\nutils.merge(Interactable.eventTypes, [\n 'gesturestart',\n 'gesturemove',\n 'gestureend',\n]);\nactions.methodDict.gesture = 'gesturable';\n\ndefaultOptions.gesture = gesture.defaults;\n\nmodule.exports = gesture;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\n// Less Precision with touch input\nconst defaultMargin = browser.supportsTouch || browser.supportsPointerEvent? 20: 10;\n\nconst resize = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n square: false,\n preserveAspectRatio: false,\n axis: 'xy',\n\n // use default margin\n margin: NaN,\n\n // object with props left, right, top, bottom which are\n // true/false values to resize when the pointer is over that edge,\n // CSS selectors to match the handles for each direction\n // or the Elements for each handle\n edges: null,\n\n // a value of 'none' will limit the resize rect to a minimum of 0x0\n // 'negate' will alow the rect to have negative width/height\n // 'reposition' will keep the width/height positive by swapping\n // the top and bottom edges and/or swapping the left and right edges\n invert: 'none',\n },\n\n checker: function (pointer, event, interactable, element, interaction, rect) {\n if (!rect) { return null; }\n\n const page = utils.extend({}, interaction.curCoords.page);\n const options = interactable.options;\n\n if (options.resize.enabled) {\n const resizeOptions = options.resize;\n const resizeEdges = { left: false, right: false, top: false, bottom: false };\n\n // if using resize.edges\n if (utils.is.object(resizeOptions.edges)) {\n for (const edge in resizeEdges) {\n resizeEdges[edge] = checkResizeEdge(edge,\n resizeOptions.edges[edge],\n page,\n interaction._eventTarget,\n element,\n rect,\n resizeOptions.margin || defaultMargin);\n }\n\n resizeEdges.left = resizeEdges.left && !resizeEdges.right;\n resizeEdges.top = resizeEdges.top && !resizeEdges.bottom;\n\n if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) {\n return {\n name: 'resize',\n edges: resizeEdges,\n };\n }\n }\n else {\n const right = options.resize.axis !== 'y' && page.x > (rect.right - defaultMargin);\n const bottom = options.resize.axis !== 'x' && page.y > (rect.bottom - defaultMargin);\n\n if (right || bottom) {\n return {\n name: 'resize',\n axes: (right? 'x' : '') + (bottom? 'y' : ''),\n };\n }\n }\n }\n\n return null;\n },\n\n cursors: (browser.isIe9OrOlder ? {\n x : 'e-resize',\n y : 's-resize',\n xy: 'se-resize',\n\n top : 'n-resize',\n left : 'w-resize',\n bottom : 's-resize',\n right : 'e-resize',\n topleft : 'se-resize',\n bottomright: 'se-resize',\n topright : 'ne-resize',\n bottomleft : 'ne-resize',\n } : {\n x : 'ew-resize',\n y : 'ns-resize',\n xy: 'nwse-resize',\n\n top : 'ns-resize',\n left : 'ew-resize',\n bottom : 'ns-resize',\n right : 'ew-resize',\n topleft : 'nwse-resize',\n bottomright: 'nwse-resize',\n topright : 'nesw-resize',\n bottomleft : 'nesw-resize',\n }),\n\n getCursor: function (action) {\n if (action.axis) {\n return resize.cursors[action.name + action.axis];\n }\n else if (action.edges) {\n let cursorKey = '';\n const edgeNames = ['top', 'bottom', 'left', 'right'];\n\n for (let i = 0; i < 4; i++) {\n if (action.edges[edgeNames[i]]) {\n cursorKey += edgeNames[i];\n }\n }\n\n return resize.cursors[cursorKey];\n }\n },\n};\n\n// resizestart\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'resizestart' || !interaction.prepared.edges) {\n return;\n }\n\n const startRect = interaction.target.getRect(interaction.element);\n const resizeOptions = interaction.target.options.resize;\n\n /*\n * When using the `resizable.square` or `resizable.preserveAspectRatio` options, resizing from one edge\n * will affect another. E.g. with `resizable.square`, resizing to make the right edge larger will make\n * the bottom edge larger by the same amount. We call these 'linked' edges. Any linked edges will depend\n * on the active edges and the edge being interacted with.\n */\n if (resizeOptions.square || resizeOptions.preserveAspectRatio) {\n const linkedEdges = utils.extend({}, interaction.prepared.edges);\n\n linkedEdges.top = linkedEdges.top || (linkedEdges.left && !linkedEdges.bottom);\n linkedEdges.left = linkedEdges.left || (linkedEdges.top && !linkedEdges.right );\n linkedEdges.bottom = linkedEdges.bottom || (linkedEdges.right && !linkedEdges.top );\n linkedEdges.right = linkedEdges.right || (linkedEdges.bottom && !linkedEdges.left );\n\n interaction.prepared._linkedEdges = linkedEdges;\n }\n else {\n interaction.prepared._linkedEdges = null;\n }\n\n // if using `resizable.preserveAspectRatio` option, record aspect ratio at the start of the resize\n if (resizeOptions.preserveAspectRatio) {\n interaction.resizeStartAspectRatio = startRect.width / startRect.height;\n }\n\n interaction.resizeRects = {\n start : startRect,\n current : utils.extend({}, startRect),\n inverted : utils.extend({}, startRect),\n previous : utils.extend({}, startRect),\n delta : {\n left: 0, right : 0, width : 0,\n top : 0, bottom: 0, height: 0,\n },\n };\n\n iEvent.rect = interaction.resizeRects.inverted;\n iEvent.deltaRect = interaction.resizeRects.delta;\n});\n\n// resizemove\nInteractEvent.signals.on('new', function ({ iEvent, phase, interaction }) {\n if (phase !== 'move' || !interaction.prepared.edges) { return; }\n\n const resizeOptions = interaction.target.options.resize;\n const invert = resizeOptions.invert;\n const invertible = invert === 'reposition' || invert === 'negate';\n\n let edges = interaction.prepared.edges;\n\n const start = interaction.resizeRects.start;\n const current = interaction.resizeRects.current;\n const inverted = interaction.resizeRects.inverted;\n const delta = interaction.resizeRects.delta;\n const previous = utils.extend(interaction.resizeRects.previous, inverted);\n const originalEdges = edges;\n\n let dx = iEvent.dx;\n let dy = iEvent.dy;\n\n if (resizeOptions.preserveAspectRatio || resizeOptions.square) {\n // `resize.preserveAspectRatio` takes precedence over `resize.square`\n const startAspectRatio = resizeOptions.preserveAspectRatio\n ? interaction.resizeStartAspectRatio\n : 1;\n\n edges = interaction.prepared._linkedEdges;\n\n if ((originalEdges.left && originalEdges.bottom)\n || (originalEdges.right && originalEdges.top)) {\n dy = -dx / startAspectRatio;\n }\n else if (originalEdges.left || originalEdges.right ) { dy = dx / startAspectRatio; }\n else if (originalEdges.top || originalEdges.bottom) { dx = dy * startAspectRatio; }\n }\n\n // update the 'current' rect without modifications\n if (edges.top ) { current.top += dy; }\n if (edges.bottom) { current.bottom += dy; }\n if (edges.left ) { current.left += dx; }\n if (edges.right ) { current.right += dx; }\n\n if (invertible) {\n // if invertible, copy the current rect\n utils.extend(inverted, current);\n\n if (invert === 'reposition') {\n // swap edge values if necessary to keep width/height positive\n let swap;\n\n if (inverted.top > inverted.bottom) {\n swap = inverted.top;\n\n inverted.top = inverted.bottom;\n inverted.bottom = swap;\n }\n if (inverted.left > inverted.right) {\n swap = inverted.left;\n\n inverted.left = inverted.right;\n inverted.right = swap;\n }\n }\n }\n else {\n // if not invertible, restrict to minimum of 0x0 rect\n inverted.top = Math.min(current.top, start.bottom);\n inverted.bottom = Math.max(current.bottom, start.top);\n inverted.left = Math.min(current.left, start.right);\n inverted.right = Math.max(current.right, start.left);\n }\n\n inverted.width = inverted.right - inverted.left;\n inverted.height = inverted.bottom - inverted.top ;\n\n for (const edge in inverted) {\n delta[edge] = inverted[edge] - previous[edge];\n }\n\n iEvent.edges = interaction.prepared.edges;\n iEvent.rect = inverted;\n iEvent.deltaRect = delta;\n});\n\n/*\\\n * Interactable.resizable\n [ method ]\n *\n * Gets or sets whether resize actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of resize elements\n | var isResizeable = interact('input[type=text]').resizable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on resize events (object makes the Interactable resizable)\n = (object) This Interactable\n | interact(element).resizable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | edges: {\n | top : true, // Use pointer coords to check for resize.\n | left : false, // Disable resizing from left edge.\n | bottom: '.resize-s',// Resize if pointer target matches selector\n | right : handleEl // Resize if pointer target is the given Element\n | },\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height are adjusted at a 1:1 ratio.\n | square: false,\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height maintain the aspect ratio they had when resizing started.\n | preserveAspectRatio: false,\n |\n | // a value of 'none' will limit the resize rect to a minimum of 0x0\n | // 'negate' will allow the rect to have negative width/height\n | // 'reposition' will keep the width/height positive by swapping\n | // the top and bottom edges and/or swapping the left and right edges\n | invert: 'none' || 'negate' || 'reposition'\n |\n | // limit multiple resizes.\n | // See the explanation in the @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n \\*/\nInteractable.prototype.resizable = function (options) {\n if (utils.is.object(options)) {\n this.options.resize.enabled = options.enabled === false? false: true;\n this.setPerAction('resize', options);\n this.setOnEvents('resize', options);\n\n if (/^x$|^y$|^xy$/.test(options.axis)) {\n this.options.resize.axis = options.axis;\n }\n else if (options.axis === null) {\n this.options.resize.axis = defaultOptions.resize.axis;\n }\n\n if (utils.is.bool(options.preserveAspectRatio)) {\n this.options.resize.preserveAspectRatio = options.preserveAspectRatio;\n }\n else if (utils.is.bool(options.square)) {\n this.options.resize.square = options.square;\n }\n\n return this;\n }\n if (utils.is.bool(options)) {\n this.options.resize.enabled = options;\n\n if (!options) {\n this.onresizestart = this.onresizestart = this.onresizeend = null;\n }\n\n return this;\n }\n return this.options.resize;\n};\n\nfunction checkResizeEdge (name, value, page, element, interactableElement, rect, margin) {\n // false, '', undefined, null\n if (!value) { return false; }\n\n // true value, use pointer coords and element rect\n if (value === true) {\n // if dimensions are negative, \"switch\" edges\n const width = utils.is.number(rect.width )? rect.width : rect.right - rect.left;\n const height = utils.is.number(rect.height)? rect.height : rect.bottom - rect.top ;\n\n if (width < 0) {\n if (name === 'left' ) { name = 'right'; }\n else if (name === 'right') { name = 'left' ; }\n }\n if (height < 0) {\n if (name === 'top' ) { name = 'bottom'; }\n else if (name === 'bottom') { name = 'top' ; }\n }\n\n if (name === 'left' ) { return page.x < ((width >= 0? rect.left: rect.right ) + margin); }\n if (name === 'top' ) { return page.y < ((height >= 0? rect.top : rect.bottom) + margin); }\n\n if (name === 'right' ) { return page.x > ((width >= 0? rect.right : rect.left) - margin); }\n if (name === 'bottom') { return page.y > ((height >= 0? rect.bottom: rect.top ) - margin); }\n }\n\n // the remaining checks require an element\n if (!utils.is.element(element)) { return false; }\n\n return utils.is.element(value)\n // the value is an element to use as a resize handle\n ? value === element\n // otherwise check if element matches value as selector\n : utils.matchesUpTo(element, value, interactableElement);\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.resizeAxes = 'xy';\n});\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action }) {\n if (action !== 'resize' || !interaction.resizeAxes) { return; }\n\n const options = interaction.target.options;\n\n if (options.resize.square) {\n if (interaction.resizeAxes === 'y') {\n iEvent.dx = iEvent.dy;\n }\n else {\n iEvent.dy = iEvent.dx;\n }\n iEvent.axes = 'xy';\n }\n else {\n iEvent.axes = interaction.resizeAxes;\n\n if (interaction.resizeAxes === 'x') {\n iEvent.dy = 0;\n }\n else if (interaction.resizeAxes === 'y') {\n iEvent.dx = 0;\n }\n }\n});\n\nactions.resize = resize;\nactions.names.push('resize');\nutils.merge(Interactable.eventTypes, [\n 'resizestart',\n 'resizemove',\n 'resizeinertiastart',\n 'resizeinertiaresume',\n 'resizeend',\n]);\nactions.methodDict.resize = 'resizable';\n\ndefaultOptions.resize = resize.defaults;\n\nmodule.exports = resize;\n","const raf = require('./utils/raf');\nconst getWindow = require('./utils/window').getWindow;\nconst is = require('./utils/is');\nconst domUtils = require('./utils/domUtils');\nconst Interaction = require('./Interaction');\nconst defaultOptions = require('./defaultOptions');\n\nconst autoScroll = {\n defaults: {\n enabled : false,\n container: null, // the item that is scrolled (Window or HTMLElement)\n margin : 60,\n speed : 300, // the scroll speed in pixels per second\n },\n\n interaction: null,\n i: null, // the handle returned by window.setInterval\n x: 0, y: 0, // Direction each pulse is to scroll in\n\n isScrolling: false,\n prevTime: 0,\n\n start: function (interaction) {\n autoScroll.isScrolling = true;\n raf.cancel(autoScroll.i);\n\n autoScroll.interaction = interaction;\n autoScroll.prevTime = new Date().getTime();\n autoScroll.i = raf.request(autoScroll.scroll);\n },\n\n stop: function () {\n autoScroll.isScrolling = false;\n raf.cancel(autoScroll.i);\n },\n\n // scroll the window by the values in scroll.x/y\n scroll: function () {\n const options = autoScroll.interaction.target.options[autoScroll.interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(autoScroll.interaction.element);\n const now = new Date().getTime();\n // change in time in seconds\n const dt = (now - autoScroll.prevTime) / 1000;\n // displacement\n const s = options.speed * dt;\n\n if (s >= 1) {\n if (is.window(container)) {\n container.scrollBy(autoScroll.x * s, autoScroll.y * s);\n }\n else if (container) {\n container.scrollLeft += autoScroll.x * s;\n container.scrollTop += autoScroll.y * s;\n }\n\n autoScroll.prevTime = now;\n }\n\n if (autoScroll.isScrolling) {\n raf.cancel(autoScroll.i);\n autoScroll.i = raf.request(autoScroll.scroll);\n }\n },\n check: function (interactable, actionName) {\n const options = interactable.options;\n\n return options[actionName].autoScroll && options[actionName].autoScroll.enabled;\n },\n onInteractionMove: function ({ interaction, pointer }) {\n if (!(interaction.interacting()\n && autoScroll.check(interaction.target, interaction.prepared.name))) {\n return;\n }\n\n if (interaction.simulation) {\n autoScroll.x = autoScroll.y = 0;\n return;\n }\n\n let top;\n let right;\n let bottom;\n let left;\n\n const options = interaction.target.options[interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(interaction.element);\n\n if (is.window(container)) {\n left = pointer.clientX < autoScroll.margin;\n top = pointer.clientY < autoScroll.margin;\n right = pointer.clientX > container.innerWidth - autoScroll.margin;\n bottom = pointer.clientY > container.innerHeight - autoScroll.margin;\n }\n else {\n const rect = domUtils.getElementClientRect(container);\n\n left = pointer.clientX < rect.left + autoScroll.margin;\n top = pointer.clientY < rect.top + autoScroll.margin;\n right = pointer.clientX > rect.right - autoScroll.margin;\n bottom = pointer.clientY > rect.bottom - autoScroll.margin;\n }\n\n autoScroll.x = (right ? 1: left? -1: 0);\n autoScroll.y = (bottom? 1: top? -1: 0);\n\n if (!autoScroll.isScrolling) {\n // set the autoScroll properties to those of the target\n autoScroll.margin = options.margin;\n autoScroll.speed = options.speed;\n\n autoScroll.start(interaction);\n }\n },\n};\n\nInteraction.signals.on('stop-active', function () {\n autoScroll.stop();\n});\n\nInteraction.signals.on('action-move', autoScroll.onInteractionMove);\n\ndefaultOptions.perAction.autoScroll = autoScroll.defaults;\n\nmodule.exports = autoScroll;\n","const Interactable = require('../Interactable');\nconst actions = require('../actions/base');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.ignoreFrom\n [ method ]\n *\n * If the target of the `mousedown`, `pointerdown` or `touchstart`\n * event or any of it's parents match the given CSS selector or\n * Element, no drag/resize/gesture is started.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to not ignore any elements\n = (string | Element | object) The current ignoreFrom value or this Interactable\n **\n | interact(element, { ignoreFrom: document.getElementById('no-action') });\n | // or\n | interact(element).ignoreFrom('input, textarea, a');\n\\*/\nInteractable.prototype.ignoreFrom = function (newValue) {\n return this._backCompatOption('ignoreFrom', newValue);\n};\n\n/*\\\n * Interactable.allowFrom\n [ method ]\n *\n * A drag/resize/gesture is started only If the target of the\n * `mousedown`, `pointerdown` or `touchstart` event or any of it's\n * parents match the given CSS selector or Element.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to allow from any element\n = (string | Element | object) The current allowFrom value or this Interactable\n **\n | interact(element, { allowFrom: document.getElementById('drag-handle') });\n | // or\n | interact(element).allowFrom('.handle');\n\\*/\nInteractable.prototype.allowFrom = function (newValue) {\n return this._backCompatOption('allowFrom', newValue);\n};\n\nInteractable.prototype.testIgnore = function (ignoreFrom, interactableElement, element) {\n if (!ignoreFrom || !is.element(element)) { return false; }\n\n if (is.string(ignoreFrom)) {\n return domUtils.matchesUpTo(element, ignoreFrom, interactableElement);\n }\n else if (is.element(ignoreFrom)) {\n return domUtils.nodeContains(ignoreFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testAllow = function (allowFrom, interactableElement, element) {\n if (!allowFrom) { return true; }\n\n if (!is.element(element)) { return false; }\n\n if (is.string(allowFrom)) {\n return domUtils.matchesUpTo(element, allowFrom, interactableElement);\n }\n else if (is.element(allowFrom)) {\n return domUtils.nodeContains(allowFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testIgnoreAllow = function (options, interactableElement, eventTarget) {\n return (!this.testIgnore(options.ignoreFrom, interactableElement, eventTarget)\n && this.testAllow(options.allowFrom, interactableElement, eventTarget));\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (event.buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\n","const interact = require('../interact');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst actions = require('../actions/base');\nconst defaultOptions = require('../defaultOptions');\nconst browser = require('../utils/browser');\nconst scope = require('../scope');\nconst utils = require('../utils');\nconst signals = require('../utils/Signals').new();\n\nrequire('./InteractableMethods');\n\nconst autoStart = {\n signals,\n withinInteractionLimit,\n // Allow this many interactions to happen simultaneously\n maxInteractions: Infinity,\n defaults: {\n perAction: {\n manualStart: false,\n max: Infinity,\n maxPerElement: 1,\n allowFrom: null,\n ignoreFrom: null,\n },\n },\n setActionDefaults: function (action) {\n utils.extend(action.defaults, autoStart.defaults.perAction);\n },\n};\n\n// set cursor style on mousedown\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget }) {\n if (interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\n// set cursor style on mousemove\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget }) {\n if (!interaction.mouse\n || interaction.pointerIsDown\n || interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\nInteraction.signals.on('move', function (arg) {\n const { interaction, event } = arg;\n\n if (!interaction.pointerIsDown\n || interaction.interacting()\n || !interaction.pointerWasMoved\n || !interaction.prepared.name) {\n return;\n }\n\n signals.fire('before-start', arg);\n\n const target = interaction.target;\n\n if (interaction.prepared.name && target) {\n // check manualStart and interaction limit\n if (target.options[interaction.prepared.name].manualStart\n || !withinInteractionLimit(target, interaction.element, interaction.prepared)) {\n interaction.stop(event);\n }\n else {\n interaction.start(interaction.prepared, target, interaction.element);\n }\n }\n});\n\n// Check if the current target supports the action.\n// If so, return the validated action. Otherwise, return null\nfunction validateAction (action, interactable, element, eventTarget) {\n if (utils.is.object(action)\n && interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget)\n && interactable.options[action.name].enabled\n && withinInteractionLimit(interactable, element, action)) {\n return action;\n }\n\n return null;\n}\n\nfunction validateSelector (interaction, pointer, event, matches, matchElements, eventTarget) {\n for (let i = 0, len = matches.length; i < len; i++) {\n const match = matches[i];\n const matchElement = matchElements[i];\n const action = validateAction(match.getAction(pointer, event, interaction, matchElement),\n match,\n matchElement,\n eventTarget);\n\n if (action) {\n return {\n action,\n target: match,\n element: matchElement,\n };\n }\n }\n\n return {};\n}\n\nfunction getActionInfo (interaction, pointer, event, eventTarget) {\n let matches = [];\n let matchElements = [];\n\n let element = eventTarget;\n let action = null;\n\n function pushMatches (interactable, selector, context) {\n const elements = (browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined);\n\n if (utils.matchesSelector(element, selector, elements)) {\n\n matches.push(interactable);\n matchElements.push(element);\n }\n }\n\n while (utils.is.element(element)) {\n matches = [];\n matchElements = [];\n\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && (action = validateAction(elementInteractable.getAction(pointer, event, interaction, element, eventTarget),\n elementInteractable,\n element,\n eventTarget))\n && !elementInteractable.options[action.name].manualStart) {\n return {\n element,\n action,\n target: elementInteractable,\n };\n }\n else {\n scope.interactables.forEachSelector(pushMatches, element);\n\n const actionInfo = validateSelector(interaction, pointer, event, matches, matchElements, eventTarget);\n\n if (actionInfo.action\n && !actionInfo.target.options[actionInfo.action.name].manualStart) {\n return actionInfo;\n }\n }\n\n element = utils.parentNode(element);\n }\n\n return {};\n}\n\nfunction prepare (interaction, { action, target, element }) {\n action = action || {};\n\n if (interaction.target && interaction.target.options.styleCursor) {\n interaction.target._doc.documentElement.style.cursor = '';\n }\n\n interaction.target = target;\n interaction.element = element;\n utils.copyAction(interaction.prepared, action);\n\n if (target && target.options.styleCursor) {\n const cursor = action? actions[action.name].getCursor(action) : '';\n interaction.target._doc.documentElement.style.cursor = cursor;\n }\n\n signals.fire('prepared', { interaction: interaction });\n}\n\nInteraction.signals.on('stop', function ({ interaction }) {\n const target = interaction.target;\n\n if (target && target.options.styleCursor) {\n target._doc.documentElement.style.cursor = '';\n }\n});\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (utils.is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (utils.is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n const buttons = event.buttons || ({\n 0: 1,\n 1: 4,\n 3: 8,\n 4: 16,\n })[event.button];\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\nfunction withinInteractionLimit (interactable, element, action) {\n const options = interactable.options;\n const maxActions = options[action.name].max;\n const maxPerElement = options[action.name].maxPerElement;\n let activeInteractions = 0;\n let targetCount = 0;\n let targetElementCount = 0;\n\n // no actions if any of these values == 0\n if (!(maxActions && maxPerElement && autoStart.maxInteractions)) { return; }\n\n for (let i = 0, len = scope.interactions.length; i < len; i++) {\n const interaction = scope.interactions[i];\n const otherAction = interaction.prepared.name;\n\n if (!interaction.interacting()) { continue; }\n\n activeInteractions++;\n\n if (activeInteractions >= autoStart.maxInteractions) {\n return false;\n }\n\n if (interaction.target !== interactable) { continue; }\n\n targetCount += (otherAction === action.name)|0;\n\n if (targetCount >= maxActions) {\n return false;\n }\n\n if (interaction.element === element) {\n targetElementCount++;\n\n if (otherAction !== action.name || targetElementCount >= maxPerElement) {\n return false;\n }\n }\n }\n\n return autoStart.maxInteractions > 0;\n}\n\n/*\\\n * interact.maxInteractions\n [ method ]\n **\n * Returns or sets the maximum number of concurrent interactions allowed.\n * By default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables\n * and elements, you need to enable it in the draggable, resizable and\n * gesturable `'max'` and `'maxPerElement'` options.\n **\n - newValue (number) #optional Any number. newValue <= 0 means no interactions.\n\\*/\ninteract.maxInteractions = function (newValue) {\n if (utils.is.number(newValue)) {\n autoStart.maxInteractions = newValue;\n\n return this;\n }\n\n return autoStart.maxInteractions;\n};\n\nInteractable.settingsMethods.push('styleCursor');\nInteractable.settingsMethods.push('actionChecker');\nInteractable.settingsMethods.push('ignoreFrom');\nInteractable.settingsMethods.push('allowFrom');\n\ndefaultOptions.base.actionChecker = null;\ndefaultOptions.base.styleCursor = true;\n\nutils.extend(defaultOptions.perAction, autoStart.defaults.perAction);\n\nmodule.exports = autoStart;\n","const autoStart = require('./base');\nconst Interaction = require('../Interaction');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.delayTimer = null;\n});\n\nautoStart.signals.on('prepared', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.delayTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.target, interaction.element);\n }, delay);\n }\n});\n\nInteraction.signals.on('move', function ({ interaction, duplicate }) {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.delayTimer);\n }\n});\n\n// prevent regular down->move autoStart\nautoStart.signals.on('before-start', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.prepared.name = null;\n }\n});\n","const autoStart = require('./base');\nconst scope = require('../scope');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\n\nconst { matchesSelector, parentNode } = require('../utils/domUtils');\n\nautoStart.setActionDefaults(require('../actions/drag'));\n\nautoStart.signals.on('before-start', function ({ interaction, eventTarget, dx, dy }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // check if a drag is in the correct axis\n const absX = Math.abs(dx);\n const absY = Math.abs(dy);\n const options = interaction.target.options.drag;\n const startAxis = options.startAxis;\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy');\n\n interaction.prepared.axis = options.lockAxis === 'start'\n ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n : options.lockAxis;\n\n // if the movement isn't in the startAxis of the interactable\n if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) {\n // cancel the prepared action\n interaction.prepared.name = null;\n\n // then try to get a drag from another ineractable\n\n if (!interaction.prepared.name) {\n\n let element = eventTarget;\n\n const getDraggable = function (interactable, selector, context) {\n const elements = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n if (interactable === interaction.target) { return; }\n\n if (!options.manualStart\n && !interactable.testIgnoreAllow(options, element, eventTarget)\n && matchesSelector(element, selector, elements)) {\n\n const action = interactable.getAction(interaction.downPointer,\n interaction.downEvent,\n interaction,\n element);\n\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, interactable)\n && autoStart.validateAction(action, interactable, element, eventTarget)) {\n\n return interactable;\n }\n }\n };\n\n let action = null;\n\n // check all interactables\n while (is.element(element)) {\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && elementInteractable !== interaction.target\n && !elementInteractable.options.drag.manualStart) {\n\n action = elementInteractable.getAction(interaction.downPointer, interaction.downEvent, interaction, element);\n }\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, elementInteractable)) {\n\n interaction.prepared.name = 'drag';\n interaction.target = elementInteractable;\n interaction.element = element;\n break;\n }\n\n const selectorInteractable = scope.interactables.forEachSelector(getDraggable, element);\n\n if (selectorInteractable) {\n interaction.prepared.name = 'drag';\n interaction.target = selectorInteractable;\n interaction.element = element;\n break;\n }\n\n element = parentNode(element);\n }\n }\n }\n});\n\nfunction checkStartAxis (startAxis, interactable) {\n if (!interactable) { return false; }\n\n const thisAxis = interactable.options.drag.startAxis;\n\n return (startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis);\n}\n","require('./base').setActionDefaults(require('../actions/gesture'));\n","require('./base').setActionDefaults(require('../actions/resize'));\n","module.exports = {\n base: {\n accept : null,\n preventDefault: 'auto',\n deltaSource : 'page',\n },\n\n perAction: {\n origin: { x: 0, y: 0 },\n\n // only allow left button by default\n // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n mouseButtons: 1,\n\n inertia: {\n enabled : false,\n resistance : 10, // the lambda in exponential decay\n minSpeed : 100, // target speed must be above this for inertia to start\n endSpeed : 10, // the speed at which inertia is slow enough to stop\n allowResume : true, // allow resuming an action in inertia phase\n smoothEndDuration: 300, // animate to snap/restrict endOnly if there's no inertia\n },\n },\n};\n","/* browser entry point */\n\n// Legacy browser support\nrequire('./legacyBrowsers');\n\n// inertia\nrequire('./inertia');\n\n// modifiers\nrequire('./modifiers/snap');\nrequire('./modifiers/restrict');\n\n// pointerEvents\nrequire('./pointerEvents/base');\nrequire('./pointerEvents/holdRepeat');\nrequire('./pointerEvents/interactableTargets');\n\n// delay\nrequire('./autoStart/delay');\n\n// actions\nrequire('./actions/gesture');\nrequire('./actions/resize');\nrequire('./actions/drag');\nrequire('./actions/drop');\n\n// load these modifiers after resize is loaded\nrequire('./modifiers/snapSize');\nrequire('./modifiers/restrictEdges');\nrequire('./modifiers/restrictSize');\n\n// autoStart actions\nrequire('./autoStart/gesture');\nrequire('./autoStart/resize');\nrequire('./autoStart/drag');\n\n// Interactable preventDefault setting\nrequire('./interactablePreventDefault.js');\n\n// autoScroll\nrequire('./autoScroll');\n\n// export interact\nmodule.exports = require('./interact');\n","const InteractEvent = require('./InteractEvent');\nconst Interaction = require('./Interaction');\nconst modifiers = require('./modifiers');\nconst utils = require('./utils');\nconst animationFrame = require('./utils/raf');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.inertiaStatus = {\n active : false,\n smoothEnd : false,\n allowResume: false,\n\n startEvent: null,\n upCoords : {},\n\n xe: 0, ye: 0,\n sx: 0, sy: 0,\n\n t0: 0,\n vx0: 0, vys: 0,\n duration: 0,\n\n lambda_v0: 0,\n one_ve_v0: 0,\n i : null,\n };\n\n interaction.boundInertiaFrame = () => inertiaFrame .apply(interaction);\n interaction.boundSmoothEndFrame = () => smoothEndFrame.apply(interaction);\n});\n\nInteraction.signals.on('down', function ({ interaction, event, pointer, eventTarget }) {\n const status = interaction.inertiaStatus;\n\n // Check if the down event hits the current inertia target\n if (status.active) {\n let element = eventTarget;\n\n // climb up the DOM tree from the event target\n while (utils.is.element(element)) {\n\n // if interaction element is the current inertia target element\n if (element === interaction.element) {\n // stop inertia\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n\n // update pointers to the down event's coordinates\n interaction.updatePointer(pointer);\n utils.setCoords(interaction.curCoords, interaction.pointers);\n\n // fire appropriate signals\n const signalArg = { interaction };\n Interaction.signals.fire('before-action-move', signalArg);\n Interaction.signals.fire('action-resume' , signalArg);\n\n // fire a reume event\n const resumeEvent = new InteractEvent(interaction,\n event,\n interaction.prepared.name,\n 'inertiaresume',\n interaction.element);\n\n interaction.target.fire(resumeEvent);\n interaction.prevEvent = resumeEvent;\n modifiers.resetStatuses(interaction.modifierStatuses);\n\n utils.copyCoords(interaction.prevCoords, interaction.curCoords);\n break;\n }\n\n element = utils.parentNode(element);\n }\n }\n});\n\nInteraction.signals.on('up', function ({ interaction, event }) {\n const status = interaction.inertiaStatus;\n\n if (!interaction.interacting() || status.active) { return; }\n\n const target = interaction.target;\n const options = target && target.options;\n const inertiaOptions = options && interaction.prepared.name && options[interaction.prepared.name].inertia;\n\n const now = new Date().getTime();\n const statuses = {};\n const page = utils.extend({}, interaction.curCoords.page);\n const pointerSpeed = interaction.pointerDelta.client.speed;\n\n let smoothEnd = false;\n let modifierResult;\n\n // check if inertia should be started\n const inertiaPossible = (inertiaOptions && inertiaOptions.enabled\n && interaction.prepared.name !== 'gesture'\n && event !== status.startEvent);\n\n const inertia = (inertiaPossible\n && (now - interaction.curCoords.timeStamp) < 50\n && pointerSpeed > inertiaOptions.minSpeed\n && pointerSpeed > inertiaOptions.endSpeed);\n\n const modifierArg = {\n interaction,\n pageCoords: page,\n statuses,\n preEnd: true,\n requireEndOnly: true,\n };\n\n // smoothEnd\n if (inertiaPossible && !inertia) {\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n if (modifierResult.shouldMove && modifierResult.locked) {\n smoothEnd = true;\n }\n }\n\n if (!(inertia || smoothEnd)) { return; }\n\n utils.copyCoords(status.upCoords, interaction.curCoords);\n\n interaction.pointers[0] = status.startEvent =\n new InteractEvent(interaction, event, interaction.prepared.name, 'inertiastart', interaction.element);\n\n status.t0 = now;\n\n status.active = true;\n status.allowResume = inertiaOptions.allowResume;\n interaction.simulation = status;\n\n target.fire(status.startEvent);\n\n if (inertia) {\n status.vx0 = interaction.pointerDelta.client.vx;\n status.vy0 = interaction.pointerDelta.client.vy;\n status.v0 = pointerSpeed;\n\n calcInertia(interaction, status);\n\n utils.extend(page, interaction.curCoords.page);\n\n page.x += status.xe;\n page.y += status.ye;\n\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n status.modifiedXe += modifierResult.dx;\n status.modifiedYe += modifierResult.dy;\n\n status.i = animationFrame.request(interaction.boundInertiaFrame);\n }\n else {\n status.smoothEnd = true;\n status.xe = modifierResult.dx;\n status.ye = modifierResult.dy;\n\n status.sx = status.sy = 0;\n\n status.i = animationFrame.request(interaction.boundSmoothEndFrame);\n }\n});\n\nInteraction.signals.on('stop-active', function ({ interaction }) {\n const status = interaction.inertiaStatus;\n\n if (status.active) {\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n }\n});\n\nfunction calcInertia (interaction, status) {\n const inertiaOptions = interaction.target.options[interaction.prepared.name].inertia;\n const lambda = inertiaOptions.resistance;\n const inertiaDur = -Math.log(inertiaOptions.endSpeed / status.v0) / lambda;\n\n status.x0 = interaction.prevEvent.pageX;\n status.y0 = interaction.prevEvent.pageY;\n status.t0 = status.startEvent.timeStamp / 1000;\n status.sx = status.sy = 0;\n\n status.modifiedXe = status.xe = (status.vx0 - inertiaDur) / lambda;\n status.modifiedYe = status.ye = (status.vy0 - inertiaDur) / lambda;\n status.te = inertiaDur;\n\n status.lambda_v0 = lambda / status.v0;\n status.one_ve_v0 = 1 - inertiaOptions.endSpeed / status.v0;\n}\n\nfunction inertiaFrame () {\n updateInertiaCoords(this);\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n\n const status = this.inertiaStatus;\n const options = this.target.options[this.prepared.name].inertia;\n const lambda = options.resistance;\n const t = new Date().getTime() / 1000 - status.t0;\n\n if (t < status.te) {\n\n const progress = 1 - (Math.exp(-lambda * t) - status.lambda_v0) / status.one_ve_v0;\n\n if (status.modifiedXe === status.xe && status.modifiedYe === status.ye) {\n status.sx = status.xe * progress;\n status.sy = status.ye * progress;\n }\n else {\n const quadPoint = utils.getQuadraticCurvePoint(0, 0,\n status.xe,\n status.ye,\n status.modifiedXe,\n status.modifiedYe,\n progress);\n\n status.sx = quadPoint.x;\n status.sy = quadPoint.y;\n }\n\n this.doMove();\n\n status.i = animationFrame.request(this.boundInertiaFrame);\n }\n else {\n status.sx = status.modifiedXe;\n status.sy = status.modifiedYe;\n\n this.doMove();\n this.end(status.startEvent);\n status.active = false;\n this.simulation = null;\n }\n\n utils.copyCoords(this.prevCoords, this.curCoords);\n}\n\nfunction smoothEndFrame () {\n updateInertiaCoords(this);\n\n const status = this.inertiaStatus;\n const t = new Date().getTime() - status.t0;\n const duration = this.target.options[this.prepared.name].inertia.smoothEndDuration;\n\n if (t < duration) {\n status.sx = utils.easeOutQuad(t, 0, status.xe, duration);\n status.sy = utils.easeOutQuad(t, 0, status.ye, duration);\n\n this.pointerMove(status.startEvent, status.startEvent);\n\n status.i = animationFrame.request(this.boundSmoothEndFrame);\n }\n else {\n status.sx = status.xe;\n status.sy = status.ye;\n\n this.pointerMove(status.startEvent, status.startEvent);\n this.end(status.startEvent);\n\n status.smoothEnd =\n status.active = false;\n this.simulation = null;\n }\n}\n\nfunction updateInertiaCoords (interaction) {\n const status = interaction.inertiaStatus;\n\n // return if inertia isn't running\n if (!status.active) { return; }\n\n const pageUp = status.upCoords.page;\n const clientUp = status.upCoords.client;\n\n utils.setCoords(interaction.curCoords, [ {\n pageX : pageUp.x + status.sx,\n pageY : pageUp.y + status.sy,\n clientX: clientUp.x + status.sx,\n clientY: clientUp.y + status.sy,\n } ]);\n}\n","const browser = require('./utils/browser');\nconst events = require('./utils/events');\nconst utils = require('./utils');\nconst scope = require('./scope');\nconst Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\n\nconst globalEvents = {};\n\n/*\\\n * interact\n [ method ]\n *\n * The methods of this variable can be used to set elements as\n * interactables and also to change various default settings.\n *\n * Calling it as a function and passing an element or a valid CSS selector\n * string returns an Interactable object which has various methods to\n * configure it.\n *\n - element (Element | string) The HTML or SVG Element to interact with or CSS selector\n = (object) An @Interactable\n *\n > Usage\n | interact('#draggable').draggable(true);\n |\n | var rectables = interact('rect');\n | rectables\n | .gesturable(true)\n | .on('gesturemove', function (event) {\n | // ...\n | });\n\\*/\nfunction interact (element, options) {\n let interactable = scope.interactables.get(element, options);\n\n if (!interactable) {\n interactable = new Interactable(element, options);\n interactable.events.global = globalEvents;\n }\n\n return interactable;\n}\n\n/*\\\n * interact.isSet\n [ method ]\n *\n * Check if an element has been set\n - element (Element) The Element being searched for\n = (boolean) Indicates if the element or CSS selector was previously passed to interact\n\\*/\ninteract.isSet = function (element, options) {\n return scope.interactables.indexOfElement(element, options && options.context) !== -1;\n};\n\n/*\\\n * interact.on\n [ method ]\n *\n * Adds a global listener for an InteractEvent or adds a DOM event to\n * `document`\n *\n - type (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) interact\n\\*/\ninteract.on = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.on(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.on(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n // if it is an InteractEvent type, add listener to globalEvents\n if (utils.contains(Interactable.eventTypes, type)) {\n // if this type of event was never bound\n if (!globalEvents[type]) {\n globalEvents[type] = [listener];\n }\n else {\n globalEvents[type].push(listener);\n }\n }\n // If non InteractEvent type, addEventListener to document\n else {\n events.add(scope.document, type, listener, { options });\n }\n\n return interact;\n};\n\n/*\\\n * interact.off\n [ method ]\n *\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n - type (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) interact\n \\*/\ninteract.off = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.off(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.off(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n if (!utils.contains(Interactable.eventTypes, type)) {\n events.remove(scope.document, type, listener, options);\n }\n else {\n let index;\n\n if (type in globalEvents\n && (index = utils.indexOf(globalEvents[type], listener)) !== -1) {\n globalEvents[type].splice(index, 1);\n }\n }\n\n return interact;\n};\n\n/*\\\n * interact.debug\n [ method ]\n *\n * Returns an object which exposes internal data\n = (object) An object with properties that outline the current state and expose internal functions and variables\n\\*/\ninteract.debug = function () {\n return scope;\n};\n\n// expose the functions used to calculate multi-touch properties\ninteract.getPointerAverage = utils.pointerAverage;\ninteract.getTouchBBox = utils.touchBBox;\ninteract.getTouchDistance = utils.touchDistance;\ninteract.getTouchAngle = utils.touchAngle;\n\ninteract.getElementRect = utils.getElementRect;\ninteract.getElementClientRect = utils.getElementClientRect;\ninteract.matchesSelector = utils.matchesSelector;\ninteract.closest = utils.closest;\n\n/*\\\n * interact.supportsTouch\n [ method ]\n *\n = (boolean) Whether or not the browser supports touch input\n\\*/\ninteract.supportsTouch = function () {\n return browser.supportsTouch;\n};\n\n/*\\\n * interact.supportsPointerEvent\n [ method ]\n *\n = (boolean) Whether or not the browser supports PointerEvents\n\\*/\ninteract.supportsPointerEvent = function () {\n return browser.supportsPointerEvent;\n};\n\n/*\\\n * interact.stop\n [ method ]\n *\n * Cancels all interactions (end events are not fired)\n *\n - event (Event) An event on which to call preventDefault()\n = (object) interact\n\\*/\ninteract.stop = function (event) {\n for (let i = scope.interactions.length - 1; i >= 0; i--) {\n scope.interactions[i].stop(event);\n }\n\n return interact;\n};\n\n/*\\\n * interact.pointerMoveTolerance\n [ method ]\n * Returns or sets the distance the pointer must be moved before an action\n * sequence occurs. This also affects tolerance for tap events.\n *\n - newValue (number) #optional The movement from the start position must be greater than this value\n = (number | Interactable) The current setting or interact\n\\*/\ninteract.pointerMoveTolerance = function (newValue) {\n if (utils.is.number(newValue)) {\n Interaction.pointerMoveTolerance = newValue;\n\n return this;\n }\n\n return Interaction.pointerMoveTolerance;\n};\n\ninteract.addDocument = scope.addDocument;\ninteract.removeDocument = scope.removeDocument;\n\nscope.interact = interact;\n\nmodule.exports = interact;\n","const Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\nconst scope = require('./scope');\nconst is = require('./utils/is');\nconst events = require('./utils/events');\n\nconst { nodeContains, matchesSelector } = require('./utils/domUtils');\n\n/*\\\n * Interactable.preventDefault\n [ method ]\n *\n * Returns or sets whether to prevent the browser's default behaviour\n * in response to pointer events. Can be set to:\n * - `'always'` to always prevent\n * - `'never'` to never prevent\n * - `'auto'` to let interact.js try to determine what would be best\n *\n - newValue (string) #optional `true`, `false` or `'auto'`\n = (string | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.preventDefault = function (newValue) {\n if (/^(always|never|auto)$/.test(newValue)) {\n this.options.preventDefault = newValue;\n return this;\n }\n\n if (is.bool(newValue)) {\n this.options.preventDefault = newValue? 'always' : 'never';\n return this;\n }\n\n return this.options.preventDefault;\n};\n\nInteractable.prototype.checkAndPreventDefault = function (event) {\n const setting = this.options.preventDefault;\n\n if (setting === 'never') { return; }\n\n if (setting === 'always') {\n event.preventDefault();\n return;\n }\n\n // setting === 'auto'\n\n // don't preventDefault if the browser supports passiveEvents\n // CSS touch-action and user-selecct should be used instead\n if (events.supportsOptions) {\n return;\n }\n\n // don't preventDefault of pointerdown events\n if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) {\n return;\n }\n\n // don't preventDefault on editable elements\n if (is.element(event.target)\n && matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) {\n return;\n }\n\n event.preventDefault();\n};\n\nfunction onInteractionEvent ({ interaction, event }) {\n if (interaction.target) {\n interaction.target.checkAndPreventDefault(event);\n }\n}\n\nfor (const eventSignal of ['down', 'move', 'up', 'cancel']) {\n Interaction.signals.on(eventSignal, onInteractionEvent);\n}\n\n// prevent native HTML5 drag on interact.js target elements\nInteraction.docEvents.dragstart = function preventNativeDrag (event) {\n for (const interaction of scope.interactions) {\n\n if (interaction.element\n && (interaction.element === event.target\n || nodeContains(interaction.element, event.target))) {\n\n interaction.target.checkAndPreventDefault(event);\n return;\n }\n }\n};\n","const scope = require('./scope');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst iFinder = require('./utils/interactionFinder');\nconst pointerEvents = require('./pointerEvents/base');\n\nconst { window } = require('./utils/window');\n\nconst toString = Object.prototype.toString;\n\nif (!window.Array.isArray) {\n window.Array.isArray = function (obj) {\n return toString.call(obj) === '[object Array]';\n };\n}\n\nif (!String.prototype.trim) {\n String.prototype.trim = function () {\n return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n };\n}\n\n// http://www.quirksmode.org/dom/events/click.html\n// >Events leading to dblclick\n//\n// IE8 doesn't fire down event before dblclick.\n// This workaround tries to fire a tap and doubletap after dblclick\nfunction onIE8Dblclick (event) {\n const eventTarget = event.target;\n const interaction = iFinder.search(event, event.type, eventTarget);\n\n if (!interaction) { return; }\n\n if (interaction.prevTap\n && event.clientX === interaction.prevTap.clientX\n && event.clientY === interaction.prevTap.clientY\n && eventTarget === interaction.prevTap.target) {\n\n interaction.downTargets[0] = eventTarget;\n interaction.downTimes [0] = new Date().getTime();\n\n pointerEvents.fire({\n interaction,\n event,\n eventTarget,\n pointer: event,\n type: 'tap',\n });\n }\n}\n\nif (browser.isIE8) {\n const selectFix = function (event) {\n for (const interaction of scope.interactions) {\n if (interaction.interacting()) {\n interaction.target.checkAndPreventDefault(event);\n }\n }\n };\n\n const onDocIE8 = function onDocIE8 ({ doc, win }, signalName) {\n const eventMethod = signalName.indexOf('listen') === 0\n ? events.add : events.remove;\n\n // For IE's lack of Event#preventDefault\n eventMethod(doc, 'selectstart', selectFix);\n\n if (pointerEvents) {\n eventMethod(doc, 'dblclick', onIE8Dblclick);\n }\n };\n\n scope.signals.on('add-document' , onDocIE8);\n scope.signals.on('remove-document', onDocIE8);\n}\n\nmodule.exports = null;\n","const InteractEvent = require('../InteractEvent');\nconst Interaction = require('../Interaction');\nconst extend = require('../utils/extend');\n\nconst modifiers = {\n names: [],\n\n setOffsets: function (arg) {\n const { interaction, pageCoords: page } = arg;\n const { target, element, startOffset } = interaction;\n const rect = target.getRect(element);\n\n if (rect) {\n startOffset.left = page.x - rect.left;\n startOffset.top = page.y - rect.top;\n\n startOffset.right = rect.right - page.x;\n startOffset.bottom = rect.bottom - page.y;\n\n if (!('width' in rect)) { rect.width = rect.right - rect.left; }\n if (!('height' in rect)) { rect.height = rect.bottom - rect.top ; }\n }\n else {\n startOffset.left = startOffset.top = startOffset.right = startOffset.bottom = 0;\n }\n\n arg.rect = rect;\n arg.interactable = target;\n arg.element = element;\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n\n arg.options = target.options[interaction.prepared.name][modifierName];\n\n if (!arg.options) {\n continue;\n }\n\n interaction.modifierOffsets[modifierName] = modifiers[modifierName].setOffset(arg);\n }\n },\n\n setAll: function (arg) {\n const { interaction, statuses, preEnd, requireEndOnly } = arg;\n const coords = extend({}, arg.pageCoords);\n const result = {\n dx: 0,\n dy: 0,\n changed: false,\n locked: false,\n shouldMove: true,\n };\n\n for (const modifierName of modifiers.names) {\n const modifier = modifiers[modifierName];\n const options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!shouldDo(options, preEnd, requireEndOnly)) { continue; }\n\n arg.status = arg.status = statuses[modifierName];\n arg.options = options;\n arg.offset = arg.interaction.modifierOffsets[modifierName];\n\n modifier.set(arg);\n\n if (arg.status.locked) {\n coords.x += arg.status.dx;\n coords.y += arg.status.dy;\n\n result.dx += arg.status.dx;\n result.dy += arg.status.dy;\n\n result.locked = true;\n }\n }\n\n // a move should be fired if:\n // - there are no modifiers enabled,\n // - no modifiers are \"locked\" i.e. have changed the pointer's coordinates, or\n // - the locked coords have changed since the last pointer move\n result.shouldMove = !arg.status || !result.locked || arg.status.changed;\n\n return result;\n },\n\n resetStatuses: function (statuses) {\n for (const modifierName of modifiers.names) {\n const status = statuses[modifierName] || {};\n\n status.dx = status.dy = 0;\n status.modifiedX = status.modifiedY = NaN;\n status.locked = false;\n status.changed = true;\n\n statuses[modifierName] = status;\n }\n\n return statuses;\n },\n\n start: function ({ interaction }, signalName) {\n const arg = {\n interaction,\n pageCoords: (signalName === 'action-resume' ?\n interaction.curCoords : interaction.startCoords).page,\n startOffset: interaction.startOffset,\n statuses: interaction.modifierStatuses,\n preEnd: false,\n requireEndOnly: false,\n };\n\n modifiers.setOffsets(arg);\n modifiers.resetStatuses(arg.statuses);\n\n arg.pageCoords = extend({}, interaction.startCoords.page);\n interaction.modifierResult = modifiers.setAll(arg);\n },\n};\n\nInteraction.signals.on('new', function (interaction) {\n interaction.startOffset = { left: 0, right: 0, top: 0, bottom: 0 };\n interaction.modifierOffsets = {};\n interaction.modifierStatuses = modifiers.resetStatuses({});\n interaction.modifierResult = null;\n});\n\nInteraction.signals.on('action-start' , modifiers.start);\nInteraction.signals.on('action-resume', modifiers.start);\n\nInteraction.signals.on('before-action-move', function ({ interaction, preEnd, interactingBeforeMove }) {\n const modifierResult = modifiers.setAll({\n interaction,\n preEnd,\n pageCoords: interaction.curCoords.page,\n statuses: interaction.modifierStatuses,\n requireEndOnly: false,\n });\n\n // don't fire an action move if a modifier would keep the event in the same\n // cordinates as before\n if (!modifierResult.shouldMove && interactingBeforeMove) {\n interaction._dontFireMove = true;\n }\n\n interaction.modifierResult = modifierResult;\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n for (let i = 0; i < modifiers.names.length; i++) {\n const options = interaction.target.options[interaction.prepared.name][modifiers.names[i]];\n\n // if the endOnly option is true for any modifier\n if (shouldDo(options, true, true)) {\n // fire a move event at the modified coordinates\n interaction.doMove({ event, preEnd: true });\n break;\n }\n }\n});\n\nInteractEvent.signals.on('set-xy', function (arg) {\n const { iEvent, interaction } = arg;\n const modifierArg = extend({}, arg);\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n modifierArg.options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!modifierArg.options) {\n continue;\n }\n\n const modifier = modifiers[modifierName];\n\n modifierArg.status = interaction.modifierStatuses[modifierName];\n\n iEvent[modifierName] = modifier.modifyCoords(modifierArg);\n }\n});\n\nfunction shouldDo (options, preEnd, requireEndOnly) {\n return (options && options.enabled\n && (preEnd || !options.endOnly)\n && (!requireEndOnly || options.endOnly));\n}\n\nmodule.exports = modifiers;\n","const modifiers = require('./index');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst restrict = {\n defaults: {\n enabled : false,\n endOnly : false,\n restriction: null,\n elementRect: null,\n },\n\n setOffset: function ({ rect, startOffset, options }) {\n const elementRect = options && options.elementRect;\n const offset = {};\n\n if (rect && elementRect) {\n offset.left = startOffset.left - (rect.width * elementRect.left);\n offset.top = startOffset.top - (rect.height * elementRect.top);\n\n offset.right = startOffset.right - (rect.width * (1 - elementRect.right));\n offset.bottom = startOffset.bottom - (rect.height * (1 - elementRect.bottom));\n }\n else {\n offset.left = offset.top = offset.right = offset.bottom = 0;\n }\n\n return offset;\n },\n\n set: function ({ pageCoords, interaction, status, options }) {\n if (!options) { return status; }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n\n const restriction = getRestrictionRect(options.restriction, interaction, page);\n\n if (!restriction) { return status; }\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n const rect = restriction;\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n const offset = interaction.modifierOffsets.restrict;\n\n // object is assumed to have\n // x, y, width, height or\n // left, top, right, bottom\n if ('x' in restriction && 'y' in restriction) {\n modifiedX = Math.max(Math.min(rect.x + rect.width - offset.right , page.x), rect.x + offset.left);\n modifiedY = Math.max(Math.min(rect.y + rect.height - offset.bottom, page.y), rect.y + offset.top );\n }\n else {\n modifiedX = Math.max(Math.min(rect.right - offset.right , page.x), rect.left + offset.left);\n modifiedY = Math.max(Math.min(rect.bottom - offset.bottom, page.y), rect.top + offset.top );\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const elementRect = options && options.elementRect;\n\n if (options && options.enabled\n && !(phase === 'start' && elementRect && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n getRestrictionRect,\n};\n\nfunction getRestrictionRect (value, interaction, page) {\n if (utils.is.function(value)) {\n return utils.resolveRectLike(value, interaction.target, interaction.element, [page.x, page.y, interaction]);\n } else {\n return utils.resolveRectLike(value, interaction.target, interaction.element);\n }\n}\n\nmodifiers.restrict = restrict;\nmodifiers.names.push('restrict');\n\ndefaultOptions.perAction.restrict = restrict.defaults;\n\nmodule.exports = restrict;\n","// This module adds the options.resize.restrictEdges setting which sets min and\n// max for the top, left, bottom and right edges of the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictEdges: {\n// inner: { top: 200, left: 200, right: 400, bottom: 400 },\n// outer: { top: 0, left: 0, right: 600, bottom: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst { getRestrictionRect } = require('./restrict');\n\nconst noInner = { top: +Infinity, left: +Infinity, bottom: -Infinity, right: -Infinity };\nconst noOuter = { top: -Infinity, left: -Infinity, bottom: +Infinity, right: +Infinity };\n\nconst restrictEdges = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n offset: null,\n },\n\n setOffset: function ({ interaction, startOffset, options }) {\n if (!options) {\n return utils.extend({}, startOffset);\n }\n\n const offset = getRestrictionRect(options.offset, interaction, interaction.startCoords.page);\n\n if (offset) {\n return {\n top: startOffset.top + offset.y,\n left: startOffset.left + offset.x,\n bottom: startOffset.bottom + offset.y,\n right: startOffset.right + offset.x,\n };\n }\n\n return startOffset;\n },\n\n set: function ({ pageCoords, interaction, status, offset, options }) {\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n const inner = rectUtils.xywhToTlbr(getRestrictionRect(options.inner, interaction, page)) || noInner;\n const outer = rectUtils.xywhToTlbr(getRestrictionRect(options.outer, interaction, page)) || noOuter;\n\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n if (edges.top) {\n modifiedY = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top);\n }\n else if (edges.bottom) {\n modifiedY = Math.max(Math.min(outer.bottom - offset.bottom, page.y), inner.bottom - offset.bottom);\n }\n if (edges.left) {\n modifiedX = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left);\n }\n else if (edges.right) {\n modifiedX = Math.max(Math.min(outer.right - offset.right, page.x), inner.right - offset.right);\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n if (options && options.enabled\n && !(phase === 'start' && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n noInner,\n noOuter,\n getRestrictionRect,\n};\n\nmodifiers.restrictEdges = restrictEdges;\nmodifiers.names.push('restrictEdges');\n\ndefaultOptions.perAction.restrictEdges = restrictEdges.defaults;\nresize.defaults.restrictEdges = restrictEdges.defaults;\n\nmodule.exports = restrictEdges;\n","// This module adds the options.resize.restrictSize setting which sets min and\n// max width and height for the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictSize: {\n// min: { width: -600, height: -600 },\n// max: { width: 600, height: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst restrictEdges = require('./restrictEdges');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst noMin = { width: -Infinity, height: -Infinity };\nconst noMax = { width: +Infinity, height: +Infinity };\n\nconst restrictSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n },\n\n setOffset: function ({ interaction }) {\n return interaction.startOffset;\n },\n\n set: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const rect = rectUtils.xywhToTlbr(interaction.resizeRects.inverted);\n\n const minSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.min, interaction)) || noMin;\n const maxSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.max, interaction)) || noMax;\n\n arg.options = {\n enabled: options.enabled,\n endOnly: options.endOnly,\n inner: utils.extend({}, restrictEdges.noInner),\n outer: utils.extend({}, restrictEdges.noOuter),\n };\n\n if (edges.top) {\n arg.options.inner.top = rect.bottom - minSize.height;\n arg.options.outer.top = rect.bottom - maxSize.height;\n }\n else if (edges.bottom) {\n arg.options.inner.bottom = rect.top + minSize.height;\n arg.options.outer.bottom = rect.top + maxSize.height;\n }\n if (edges.left) {\n arg.options.inner.left = rect.right - minSize.width;\n arg.options.outer.left = rect.right - maxSize.width;\n }\n else if (edges.right) {\n arg.options.inner.right = rect.left + minSize.width;\n arg.options.outer.right = rect.left + maxSize.width;\n }\n\n restrictEdges.set(arg);\n },\n\n modifyCoords: restrictEdges.modifyCoords,\n};\n\nmodifiers.restrictSize = restrictSize;\nmodifiers.names.push('restrictSize');\n\ndefaultOptions.perAction.restrictSize = restrictSize.defaults;\nresize.defaults.restrictSize = restrictSize.defaults;\n\nmodule.exports = restrictSize;\n","const modifiers = require('./index');\nconst interact = require('../interact');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst snap = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n\n relativePoints: null,\n },\n\n setOffset: function ({ interaction, interactable, element, rect, startOffset, options }) {\n const offsets = [];\n const optionsOrigin = utils.rectToXY(utils.resolveRectLike(options.origin));\n const origin = optionsOrigin || utils.getOriginXY(interactable, element, interaction.prepared.name);\n options = options || interactable.options[interaction.prepared.name].snap || {};\n\n let snapOffset;\n\n if (options.offset === 'startCoords') {\n snapOffset = {\n x: interaction.startCoords.page.x - origin.x,\n y: interaction.startCoords.page.y - origin.y,\n };\n }\n else {\n const offsetRect = utils.resolveRectLike(options.offset, interactable, element, [interaction]);\n\n snapOffset = utils.rectToXY(offsetRect) || { x: 0, y: 0 };\n }\n\n if (rect && options.relativePoints && options.relativePoints.length) {\n for (const { x: relativeX, y: relativeY } of options.relativePoints) {\n offsets.push({\n x: startOffset.left - (rect.width * relativeX) + snapOffset.x,\n y: startOffset.top - (rect.height * relativeY) + snapOffset.y,\n });\n }\n }\n else {\n offsets.push(snapOffset);\n }\n\n return offsets;\n },\n\n set: function ({ interaction, pageCoords, status, options, offset: offsets }) {\n const targets = [];\n let target;\n let page;\n let i;\n\n if (status.useStatusXY) {\n page = { x: status.x, y: status.y };\n }\n else {\n const origin = utils.getOriginXY(interaction.target, interaction.element, interaction.prepared.name);\n\n page = utils.extend({}, pageCoords);\n\n page.x -= origin.x;\n page.y -= origin.y;\n }\n\n status.realX = page.x;\n status.realY = page.y;\n\n let len = options.targets? options.targets.length : 0;\n\n for (const { x: offsetX, y: offsetY } of offsets) {\n const relativeX = page.x - offsetX;\n const relativeY = page.y - offsetY;\n\n for (const snapTarget of options.targets) {\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n targets.push({\n x: utils.is.number(target.x) ? (target.x + offsetX) : relativeX,\n y: utils.is.number(target.y) ? (target.y + offsetY) : relativeY,\n\n range: utils.is.number(target.range)? target.range: options.range,\n });\n }\n }\n\n const closest = {\n target: null,\n inRange: false,\n distance: 0,\n range: 0,\n dx: 0,\n dy: 0,\n };\n\n for (i = 0, len = targets.length; i < len; i++) {\n target = targets[i];\n\n const range = target.range;\n const dx = target.x - page.x;\n const dy = target.y - page.y;\n const distance = utils.hypot(dx, dy);\n let inRange = distance <= range;\n\n // Infinite targets count as being out of range\n // compared to non infinite ones that are in range\n if (range === Infinity && closest.inRange && closest.range !== Infinity) {\n inRange = false;\n }\n\n if (!closest.target || (inRange\n // is the closest target in range?\n ? (closest.inRange && range !== Infinity\n // the pointer is relatively deeper in this target\n ? distance / range < closest.distance / closest.range\n // this target has Infinite range and the closest doesn't\n : (range === Infinity && closest.range !== Infinity)\n // OR this target is closer that the previous closest\n || distance < closest.distance)\n // The other is not in range and the pointer is closer to this target\n : (!closest.inRange && distance < closest.distance))) {\n\n closest.target = target;\n closest.distance = distance;\n closest.range = range;\n closest.inRange = inRange;\n closest.dx = dx;\n closest.dy = dy;\n\n status.range = range;\n }\n }\n\n let snapChanged;\n\n if (closest.target) {\n snapChanged = (status.modifiedX !== closest.target.x || status.modifiedY !== closest.target.y);\n\n status.modifiedX = closest.target.x;\n status.modifiedY = closest.target.y;\n }\n else {\n snapChanged = true;\n\n status.modifiedX = NaN;\n status.modifiedY = NaN;\n }\n\n status.dx = closest.dx;\n status.dy = closest.dy;\n\n status.changed = (snapChanged || (closest.inRange && !status.locked));\n status.locked = closest.inRange;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const relativePoints = options && options.relativePoints;\n\n if (options && options.enabled\n && !(phase === 'start' && relativePoints && relativePoints.length)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n }\n\n return {\n range : status.range,\n locked : status.locked,\n x : status.modifiedX,\n y : status.modifiedY,\n realX : status.realX,\n realY : status.realY,\n dx : status.dx,\n dy : status.dy,\n };\n }\n },\n};\n\ninteract.createSnapGrid = function (grid) {\n return function (x, y) {\n const limits = grid.limits || {\n left : -Infinity,\n right : Infinity,\n top : -Infinity,\n bottom: Infinity,\n };\n let offsetX = 0;\n let offsetY = 0;\n\n if (utils.is.object(grid.offset)) {\n offsetX = grid.offset.x;\n offsetY = grid.offset.y;\n }\n\n const gridx = Math.round((x - offsetX) / grid.x);\n const gridy = Math.round((y - offsetY) / grid.y);\n\n const newX = Math.max(limits.left, Math.min(limits.right , gridx * grid.x + offsetX));\n const newY = Math.max(limits.top , Math.min(limits.bottom, gridy * grid.y + offsetY));\n\n return {\n x: newX,\n y: newY,\n range: grid.range,\n };\n };\n};\n\nmodifiers.snap = snap;\nmodifiers.names.push('snap');\n\ndefaultOptions.perAction.snap = snap.defaults;\n\nmodule.exports = snap;\n","// This module allows snapping of the size of targets during resize\n// interactions.\n\nconst modifiers = require('./index');\nconst snap = require('./snap');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\nconst utils = require('../utils/');\n\nconst snapSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n },\n\n setOffset: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.edges;\n\n if (!edges) { return; }\n\n arg.options = {\n relativePoints: [{\n x: edges.left? 0 : 1,\n y: edges.top ? 0 : 1,\n }],\n origin: { x: 0, y: 0 },\n offset: 'self',\n range: options.range,\n };\n\n const offsets = snap.setOffset(arg);\n arg.options = options;\n\n return offsets;\n },\n\n set: function (arg) {\n const { interaction, options, offset, pageCoords } = arg;\n const page = utils.extend({}, pageCoords);\n const relativeX = page.x - offset[0].x;\n const relativeY = page.y - offset[0].y;\n\n arg.options = utils.extend({}, options);\n arg.options.targets = [];\n\n for (const snapTarget of options.targets) {\n let target;\n\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n if ('width' in target && 'height' in target) {\n target.x = target.width;\n target.y = target.height;\n }\n\n arg.options.targets.push(target);\n }\n\n snap.set(arg);\n },\n\n modifyCoords: function (arg) {\n const { options } = arg;\n\n arg.options = utils.extend({}, options);\n arg.options.enabled = options.enabled;\n arg.options.relativePoints = [null];\n\n snap.modifyCoords(arg);\n },\n};\n\nmodifiers.snapSize = snapSize;\nmodifiers.names.push('snapSize');\n\ndefaultOptions.perAction.snapSize = snapSize.defaults;\nresize.defaults.snapSize = snapSize.defaults;\n\nmodule.exports = snapSize;\n","const pointerUtils = require('../utils/pointerUtils');\n\nmodule.exports = class PointerEvent {\n constructor (type, pointer, event, eventTarget, interaction) {\n pointerUtils.pointerExtend(this, event);\n\n if (event !== pointer) {\n pointerUtils.pointerExtend(this, pointer);\n }\n\n this.interaction = interaction;\n\n this.timeStamp = new Date().getTime();\n this.originalEvent = event;\n this.type = type;\n this.pointerId = pointerUtils.getPointerId(pointer);\n this.pointerType = pointerUtils.getPointerType(pointer);\n this.target = eventTarget;\n this.currentTarget = null;\n\n if (type === 'tap') {\n const pointerIndex = interaction.getPointerIndex(pointer);\n this.dt = this.timeStamp - interaction.downTimes[pointerIndex];\n\n const interval = this.timeStamp - interaction.tapTime;\n\n this.double = !!(interaction.prevTap\n && interaction.prevTap.type !== 'doubletap'\n && interaction.prevTap.target === this.target\n && interval < 500);\n }\n else if (type === 'doubletap') {\n this.dt = pointer.timeStamp - interaction.tapTime;\n }\n }\n\n subtractOrigin ({ x: originX, y: originY }) {\n this.pageX -= originX;\n this.pageY -= originY;\n this.clientX -= originX;\n this.clientY -= originY;\n\n return this;\n }\n\n addOrigin ({ x: originX, y: originY }) {\n this.pageX += originX;\n this.pageY += originY;\n this.clientX += originX;\n this.clientY += originY;\n\n return this;\n }\n\n preventDefault () {\n this.originalEvent.preventDefault();\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n};\n","const PointerEvent = require('./PointerEvent');\nconst Interaction = require('../Interaction');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst defaults = require('../defaultOptions');\nconst signals = require('../utils/Signals').new();\nconst { filter } = require('../utils/arr');\n\nconst simpleSignals = [ 'down', 'up', 'cancel' ];\nconst simpleEvents = [ 'down', 'up', 'cancel' ];\n\nconst pointerEvents = {\n PointerEvent,\n fire,\n collectEventTargets,\n signals,\n defaults: {\n holdDuration: 600,\n ignoreFrom : null,\n allowFrom : null,\n origin : { x: 0, y: 0 },\n },\n types: [\n 'down',\n 'move',\n 'up',\n 'cancel',\n 'tap',\n 'doubletap',\n 'hold',\n ],\n};\n\nfunction fire (arg) {\n const {\n interaction, pointer, event, eventTarget,\n type = arg.pointerEvent.type,\n targets = collectEventTargets(arg),\n pointerEvent = new PointerEvent(type, pointer, event, eventTarget, interaction),\n } = arg;\n\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n targets,\n type,\n pointerEvent,\n };\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n\n for (const prop in target.props || {}) {\n pointerEvent[prop] = target.props[prop];\n }\n\n const origin = utils.getOriginXY(target.eventable, target.element);\n\n pointerEvent.subtractOrigin(origin);\n pointerEvent.eventable = target.eventable;\n pointerEvent.currentTarget = target.element;\n\n target.eventable.fire(pointerEvent);\n\n pointerEvent.addOrigin(origin);\n\n if (pointerEvent.immediatePropagationStopped\n || (pointerEvent.propagationStopped\n && (i + 1) < targets.length && targets[i + 1].element !== pointerEvent.currentTarget)) {\n break;\n }\n }\n\n signals.fire('fired', signalArg);\n\n if (type === 'tap') {\n // if pointerEvent should make a double tap, create and fire a doubletap\n // PointerEvent and use that as the prevTap\n const prevTap = pointerEvent.double\n ? fire({\n interaction, pointer, event, eventTarget,\n type: 'doubletap',\n })\n : pointerEvent;\n\n interaction.prevTap = prevTap;\n interaction.tapTime = prevTap.timeStamp;\n }\n\n return pointerEvent;\n}\n\nfunction collectEventTargets ({ interaction, pointer, event, eventTarget, type }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n // do not fire a tap event if the pointer was moved before being lifted\n if (type === 'tap' && (interaction.pointerWasMoved\n // or if the pointerup target is different to the pointerdown target\n || !(interaction.downTargets[pointerIndex] && interaction.downTargets[pointerIndex] === eventTarget))) {\n return [];\n }\n\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n path,\n targets: [],\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (type === 'hold') {\n signalArg.targets = filter(signalArg.targets, target =>\n target.eventable.options.holdDuration === interaction.holdTimers[pointerIndex].duration);\n }\n\n return signalArg.targets;\n}\n\nInteraction.signals.on('update-pointer-down', function ({ interaction, pointerIndex }) {\n interaction.holdTimers[pointerIndex] = { duration: Infinity, timeout: null };\n});\n\nInteraction.signals.on('remove-pointer', function ({ interaction, pointerIndex }) {\n interaction.holdTimers.splice(pointerIndex, 1);\n});\n\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget, duplicateMove }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n if (!duplicateMove && (!interaction.pointerIsDown || interaction.pointerWasMoved)) {\n if (interaction.pointerIsDown) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n\n fire({\n interaction, pointer, event, eventTarget,\n type: 'move',\n });\n }\n});\n\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget, pointerIndex }) {\n // copy event to be used in timeout for IE8\n const eventCopy = browser.isIE8? utils.extend({}, event) : event;\n\n const timer = interaction.holdTimers[pointerIndex];\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'hold',\n targets: [],\n path,\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (!signalArg.targets.length) { return; }\n\n let minDuration = Infinity;\n\n for (let i = 0; i < signalArg.targets.length; i++) {\n const target = signalArg.targets[i];\n const holdDuration = target.eventable.options.holdDuration;\n\n if (holdDuration < minDuration) {\n minDuration = holdDuration;\n }\n }\n\n timer.duration = minDuration;\n timer.timeout = setTimeout(function () {\n fire({\n interaction,\n eventTarget,\n pointer: browser.isIE8? eventCopy : pointer,\n event: eventCopy,\n type: 'hold',\n });\n }, minDuration);\n});\n\nInteraction.signals.on('up', ({ interaction, pointer, event, eventTarget }) => {\n if (!interaction.pointerWasMoved) {\n fire({ interaction, eventTarget, pointer, event, type: 'tap' });\n }\n});\n\n['up', 'cancel'].forEach(function (signalName) {\n Interaction.signals.on(signalName, function ({ interaction, pointerIndex }) {\n if (interaction.holdTimers[pointerIndex]) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n });\n});\n\nfunction createSignalListener (type) {\n return function ({ interaction, pointer, event, eventTarget }) {\n fire({ interaction, eventTarget, pointer, event, type });\n };\n}\n\nfor (let i = 0; i < simpleSignals.length; i++) {\n Interaction.signals.on(simpleSignals[i], createSignalListener(simpleEvents[i]));\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.prevTap = null; // the most recent tap event on this interaction\n interaction.tapTime = 0; // time of the most recent tap event\n interaction.holdTimers = []; // [{ duration, timeout }]\n});\n\ndefaults.pointerEvents = pointerEvents.defaults;\nmodule.exports = pointerEvents;\n","const pointerEvents = require('./base');\nconst Interaction = require('../Interaction');\n\npointerEvents.signals.on('new', onNew);\npointerEvents.signals.on('fired', onFired);\n\nfor (const signal of ['move', 'up', 'cancel', 'endall']) {\n Interaction.signals.on(signal, endHoldRepeat);\n}\n\nfunction onNew ({ pointerEvent }) {\n if (pointerEvent.type !== 'hold') { return; }\n\n pointerEvent.count = (pointerEvent.count || 0) + 1;\n}\n\nfunction onFired ({ interaction, pointerEvent, eventTarget, targets }) {\n if (pointerEvent.type !== 'hold' || !targets.length) { return; }\n\n // get the repeat interval from the first eventable\n const interval = targets[0].eventable.options.holdRepeatInterval;\n\n // don't repeat if the interval is 0 or less\n if (interval <= 0) { return; }\n\n // set a timeout to fire the holdrepeat event\n interaction.holdIntervalHandle = setTimeout(function () {\n pointerEvents.fire({\n interaction,\n eventTarget,\n type: 'hold',\n pointer: pointerEvent,\n event: pointerEvent,\n });\n }, interval);\n}\n\nfunction endHoldRepeat ({ interaction }) {\n // set the interaction's holdStopTime property\n // to stop further holdRepeat events\n if (interaction.holdIntervalHandle) {\n clearInterval(interaction.holdIntervalHandle);\n interaction.holdIntervalHandle = null;\n }\n}\n\n// don't repeat by default\npointerEvents.defaults.holdRepeatInterval = 0;\npointerEvents.types.push('holdrepeat');\n\nmodule.exports = {\n onNew,\n onFired,\n endHoldRepeat,\n};\n","const pointerEvents = require('./base');\nconst Interactable = require('../Interactable');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\nconst scope = require('../scope');\nconst extend = require('../utils/extend');\nconst { merge } = require('../utils/arr');\n\npointerEvents.signals.on('collect-targets', function ({ targets, element, type, eventTarget }) {\n function collectSelectors (interactable, selector, context) {\n const els = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && is.element(element)\n && domUtils.matchesSelector(element, selector, els)\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n const interactable = scope.interactables.get(element);\n\n if (interactable) {\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n scope.interactables.forEachSelector(collectSelectors, element);\n});\n\nInteractable.signals.on('new', function ({ interactable }) {\n interactable.events.getRect = function (element) {\n return interactable.getRect(element);\n };\n});\n\nInteractable.signals.on('set', function ({ interactable, options }) {\n extend(interactable.events.options, pointerEvents.defaults);\n extend(interactable.events.options, options);\n});\n\nmerge(Interactable.eventTypes, pointerEvents.types);\n\nInteractable.prototype.pointerEvents = function (options) {\n extend(this.events.options, options);\n\n return this;\n};\n\nconst __backCompatOption = Interactable.prototype._backCompatOption;\n\nInteractable.prototype._backCompatOption = function (optionName, newValue) {\n const ret = __backCompatOption.call(this, optionName, newValue);\n\n if (ret === this) {\n this.events.options[optionName] = newValue;\n }\n\n return ret;\n};\n\nInteractable.settingsMethods.push('pointerEvents');\n","const utils = require('./utils');\nconst events = require('./utils/events');\nconst signals = require('./utils/Signals').new();\n\nconst scope = {\n signals,\n events,\n utils,\n\n // main document\n document: require('./utils/domObjects').document,\n // all documents being listened to\n documents: [],\n\n addDocument: function (doc, win) {\n // do nothing if document is already known\n if (utils.contains(scope.documents, doc)) { return false; }\n\n win = win || scope.getWindow(doc);\n\n scope.documents.push(doc);\n events.documents.push(doc);\n\n // don't add an unload event for the main document\n // so that the page may be cached in browser history\n if (doc !== scope.document) {\n events.add(win, 'unload', scope.onWindowUnload);\n }\n\n signals.fire('add-document', { doc, win });\n },\n\n removeDocument: function (doc, win) {\n const index = utils.indexOf(scope.documents, doc);\n\n win = win || scope.getWindow(doc);\n\n events.remove(win, 'unload', scope.onWindowUnload);\n\n scope.documents.splice(index, 1);\n events.documents.splice(index, 1);\n\n signals.fire('remove-document', { win, doc });\n },\n\n onWindowUnload: function () {\n scope.removeDocument(this.document, this);\n },\n};\n\nmodule.exports = scope;\n","const { indexOf } = require('./arr');\n\nclass Signals {\n constructor () {\n this.listeners = {\n // signalName: [listeners],\n };\n }\n\n on (name, listener) {\n if (!this.listeners[name]) {\n this.listeners[name] = [listener];\n return;\n }\n\n this.listeners[name].push(listener);\n }\n\n off (name, listener) {\n if (!this.listeners[name]) { return; }\n\n const index = indexOf(this.listeners[name], listener);\n\n if (index !== -1) {\n this.listeners[name].splice(index, 1);\n }\n }\n\n fire (name, arg) {\n const targetListeners = this.listeners[name];\n\n if (!targetListeners) { return; }\n\n for (let i = 0; i < targetListeners.length; i++) {\n if (targetListeners[i](arg, name) === false) {\n return;\n }\n }\n }\n}\n\nSignals.new = function () {\n return new Signals();\n};\n\nmodule.exports = Signals;\n","function indexOf (array, target) {\n for (let i = 0, len = array.length; i < len; i++) {\n if (array[i] === target) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction contains (array, target) {\n return indexOf(array, target) !== -1;\n}\n\nfunction merge (target, source) {\n for (let i = 0; i < source.length; i++) {\n target.push(source[i]);\n }\n\n return target;\n}\n\nfunction filter (array, test) {\n const result = [];\n\n for (let i = 0; i < array.length; i++) {\n if (test(array[i])) {\n result.push(array[i]);\n }\n }\n\n return result;\n}\n\nmodule.exports = {\n indexOf,\n contains,\n merge,\n filter,\n};\n","const { window } = require('./window');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst Element = domObjects.Element;\nconst navigator = window.navigator;\n\nconst browser = {\n // Does the browser support touch input?\n supportsTouch: !!(('ontouchstart' in window) || is.function(window.DocumentTouch)\n && domObjects.document instanceof window.DocumentTouch),\n\n // Does the browser support PointerEvents\n supportsPointerEvent: !!domObjects.PointerEvent,\n\n isIE8: ('attachEvent' in window) && !('addEventListener' in window),\n\n // Opera Mobile must be handled differently\n isOperaMobile: (navigator.appName === 'Opera'\n && browser.supportsTouch\n && navigator.userAgent.match('Presto')),\n\n // scrolling doesn't change the result of getClientRects on iOS 7\n isIOS7: (/iP(hone|od|ad)/.test(navigator.platform)\n && /OS 7[^\\d]/.test(navigator.appVersion)),\n\n isIe9OrOlder: /MSIE (8|9)/.test(navigator.userAgent),\n\n // prefix matchesSelector\n prefixedMatchesSelector: 'matches' in Element.prototype\n ? 'matches': 'webkitMatchesSelector' in Element.prototype\n ? 'webkitMatchesSelector': 'mozMatchesSelector' in Element.prototype\n ? 'mozMatchesSelector': 'oMatchesSelector' in Element.prototype\n ? 'oMatchesSelector': 'msMatchesSelector',\n\n useMatchesSelectorPolyfill: false,\n\n pEventTypes: (domObjects.PointerEvent\n ? (domObjects.PointerEvent === window.MSPointerEvent\n ? {\n up: 'MSPointerUp',\n down: 'MSPointerDown',\n over: 'mouseover',\n out: 'mouseout',\n move: 'MSPointerMove',\n cancel: 'MSPointerCancel',\n }\n : {\n up: 'pointerup',\n down: 'pointerdown',\n over: 'pointerover',\n out: 'pointerout',\n move: 'pointermove',\n cancel: 'pointercancel',\n })\n : null),\n\n // because Webkit and Opera still use 'mousewheel' event type\n wheelEvent: 'onmousewheel' in domObjects.document? 'mousewheel': 'wheel',\n\n};\n\nbrowser.useMatchesSelectorPolyfill = !is.function(Element.prototype[browser.prefixedMatchesSelector]);\n\nmodule.exports = browser;\n","const domObjects = {};\nconst win = require('./window').window;\n\nfunction blank () {}\n\ndomObjects.document = win.document;\ndomObjects.DocumentFragment = win.DocumentFragment || blank;\ndomObjects.SVGElement = win.SVGElement || blank;\ndomObjects.SVGSVGElement = win.SVGSVGElement || blank;\ndomObjects.SVGElementInstance = win.SVGElementInstance || blank;\ndomObjects.Element = win.Element || blank;\ndomObjects.HTMLElement = win.HTMLElement || domObjects.Element;\n\ndomObjects.Event = win.Event;\ndomObjects.Touch = win.Touch || blank;\ndomObjects.PointerEvent = (win.PointerEvent || win.MSPointerEvent);\n\nmodule.exports = domObjects;\n","const win = require('./window');\nconst browser = require('./browser');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst domUtils = {\n nodeContains: function (parent, child) {\n while (child) {\n if (child === parent) {\n return true;\n }\n\n child = child.parentNode;\n }\n\n return false;\n },\n\n closest: function (element, selector) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) { return element; }\n\n element = domUtils.parentNode(element);\n }\n\n return null;\n },\n\n parentNode: function (node) {\n let parent = node.parentNode;\n\n if (is.docFrag(parent)) {\n // skip past #shado-root fragments\n while ((parent = parent.host) && is.docFrag(parent)) {\n continue;\n }\n\n return parent;\n }\n\n return parent;\n },\n\n // taken from http://tanalin.com/en/blog/2012/12/matches-selector-ie8/ and modified\n matchesSelectorPolyfill: browser.useMatchesSelectorPolyfill\n ? function (element, selector, elems) {\n elems = elems || element.parentNode.querySelectorAll(selector);\n\n for (let i = 0, len = elems.length; i < len; i++) {\n if (elems[i] === element) {\n return true;\n }\n }\n\n return false;\n }\n : null,\n\n matchesSelector: function (element, selector, nodeList) {\n if (browser.useMatchesSelectorPolyfill) {\n return domUtils.matchesSelectorPolyfill(element, selector, nodeList);\n }\n\n // remove /deep/ from selectors if shadowDOM polyfill is used\n if (win.window !== win.realWindow) {\n selector = selector.replace(/\\/deep\\//g, ' ');\n }\n\n return element[browser.prefixedMatchesSelector](selector);\n },\n\n // Test for the element that's \"above\" all other qualifiers\n indexOfDeepestElement: function (elements) {\n let deepestZoneParents = [];\n let dropzoneParents = [];\n let dropzone;\n let deepestZone = elements[0];\n let index = deepestZone? 0: -1;\n let parent;\n let child;\n let i;\n let n;\n\n for (i = 1; i < elements.length; i++) {\n dropzone = elements[i];\n\n // an element might belong to multiple selector dropzones\n if (!dropzone || dropzone === deepestZone) {\n continue;\n }\n\n if (!deepestZone) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n // check if the deepest or current are document.documentElement or document.rootElement\n // - if the current dropzone is, do nothing and continue\n if (dropzone.parentNode === dropzone.ownerDocument) {\n continue;\n }\n // - if deepest is, update with the current dropzone and continue to next\n else if (deepestZone.parentNode === dropzone.ownerDocument) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n if (!deepestZoneParents.length) {\n parent = deepestZone;\n while (parent.parentNode && parent.parentNode !== parent.ownerDocument) {\n deepestZoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n }\n\n // if this element is an svg element and the current deepest is\n // an HTMLElement\n if (deepestZone instanceof domObjects.HTMLElement\n && dropzone instanceof domObjects.SVGElement\n && !(dropzone instanceof domObjects.SVGSVGElement)) {\n\n if (dropzone === deepestZone.parentNode) {\n continue;\n }\n\n parent = dropzone.ownerSVGElement;\n }\n else {\n parent = dropzone;\n }\n\n dropzoneParents = [];\n\n while (parent.parentNode !== parent.ownerDocument) {\n dropzoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n\n n = 0;\n\n // get (position of last common ancestor) + 1\n while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) {\n n++;\n }\n\n const parents = [\n dropzoneParents[n - 1],\n dropzoneParents[n],\n deepestZoneParents[n],\n ];\n\n child = parents[0].lastChild;\n\n while (child) {\n if (child === parents[1]) {\n deepestZone = dropzone;\n index = i;\n deepestZoneParents = [];\n\n break;\n }\n else if (child === parents[2]) {\n break;\n }\n\n child = child.previousSibling;\n }\n }\n\n return index;\n },\n\n matchesUpTo: function (element, selector, limit) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) {\n return true;\n }\n\n element = domUtils.parentNode(element);\n\n if (element === limit) {\n return domUtils.matchesSelector(element, selector);\n }\n }\n\n return false;\n },\n\n getActualElement: function (element) {\n return (element instanceof domObjects.SVGElementInstance\n ? element.correspondingUseElement\n : element);\n },\n\n getScrollXY: function (relevantWindow) {\n relevantWindow = relevantWindow || win.window;\n return {\n x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft,\n y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop,\n };\n },\n\n getElementClientRect: function (element) {\n const clientRect = (element instanceof domObjects.SVGElement\n ? element.getBoundingClientRect()\n : element.getClientRects()[0]);\n\n return clientRect && {\n left : clientRect.left,\n right : clientRect.right,\n top : clientRect.top,\n bottom: clientRect.bottom,\n width : clientRect.width || clientRect.right - clientRect.left,\n height: clientRect.height || clientRect.bottom - clientRect.top,\n };\n },\n\n getElementRect: function (element) {\n const clientRect = domUtils.getElementClientRect(element);\n\n if (!browser.isIOS7 && clientRect) {\n const scroll = domUtils.getScrollXY(win.getWindow(element));\n\n clientRect.left += scroll.x;\n clientRect.right += scroll.x;\n clientRect.top += scroll.y;\n clientRect.bottom += scroll.y;\n }\n\n return clientRect;\n },\n\n getPath: function (element) {\n const path = [];\n\n while (element) {\n path.push(element);\n element = domUtils.parentNode(element);\n }\n\n return path;\n },\n\n trySelector: value => {\n if (!is.string(value)) { return false; }\n\n // an exception will be raised if it is invalid\n domObjects.document.querySelector(value);\n return true;\n },\n};\n\nmodule.exports = domUtils;\n","const is = require('./is');\nconst domUtils = require('./domUtils');\nconst pExtend = require('./pointerExtend');\n\nconst { window, getWindow } = require('./window');\nconst { indexOf, contains } = require('./arr');\n\nconst useAttachEvent = ('attachEvent' in window) && !('addEventListener' in window);\nconst addEvent = useAttachEvent? 'attachEvent': 'addEventListener';\nconst removeEvent = useAttachEvent? 'detachEvent': 'removeEventListener';\nconst on = useAttachEvent? 'on': '';\n\nconst elements = [];\nconst targets = [];\nconst attachedListeners = [];\n\n// {\n// type: {\n// selectors: ['selector', ...],\n// contexts : [document, ...],\n// listeners: [[listener, capture, passive], ...]\n// }\n// }\nconst delegatedEvents = {};\n\nconst documents = [];\n\nconst supportsOptions = !useAttachEvent && (() => {\n let supported = false;\n\n window.document.createElement('div').addEventListener('test', null, {\n get capture () { supported = true; },\n });\n\n return supported;\n})();\n\nfunction add (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n let elementIndex = indexOf(elements, element);\n let target = targets[elementIndex];\n\n if (!target) {\n target = {\n events: {},\n typeCount: 0,\n };\n\n elementIndex = elements.push(element) - 1;\n targets.push(target);\n\n attachedListeners.push(useAttachEvent\n ? {\n supplied: [],\n wrapped : [],\n useCount: [],\n }\n : null);\n }\n\n if (!target.events[type]) {\n target.events[type] = [];\n target.typeCount++;\n }\n\n if (!contains(target.events[type], listener)) {\n let ret;\n\n if (useAttachEvent) {\n const { supplied, wrapped, useCount } = attachedListeners[elementIndex];\n const listenerIndex = indexOf(supplied, listener);\n\n const wrappedListener = wrapped[listenerIndex] || function (event) {\n if (!event.immediatePropagationStopped) {\n event.target = event.srcElement;\n event.currentTarget = element;\n\n event.preventDefault = event.preventDefault || preventDef;\n event.stopPropagation = event.stopPropagation || stopProp;\n event.stopImmediatePropagation = event.stopImmediatePropagation || stopImmProp;\n\n if (/mouse|click/.test(event.type)) {\n event.pageX = event.clientX + getWindow(element).document.documentElement.scrollLeft;\n event.pageY = event.clientY + getWindow(element).document.documentElement.scrollTop;\n }\n\n listener(event);\n }\n };\n\n ret = element[addEvent](on + type, wrappedListener, !!options.capture);\n\n if (listenerIndex === -1) {\n supplied.push(listener);\n wrapped.push(wrappedListener);\n useCount.push(1);\n }\n else {\n useCount[listenerIndex]++;\n }\n }\n else {\n ret = element[addEvent](type, listener, supportsOptions? options : !!options.capture);\n }\n target.events[type].push(listener);\n\n return ret;\n }\n}\n\nfunction remove (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const elementIndex = indexOf(elements, element);\n const target = targets[elementIndex];\n\n if (!target || !target.events) {\n return;\n }\n\n let wrappedListener = listener;\n let listeners;\n let listenerIndex;\n\n if (useAttachEvent) {\n listeners = attachedListeners[elementIndex];\n listenerIndex = indexOf(listeners.supplied, listener);\n wrappedListener = listeners.wrapped[listenerIndex];\n }\n\n if (type === 'all') {\n for (type in target.events) {\n if (target.events.hasOwnProperty(type)) {\n remove(element, type, 'all');\n }\n }\n return;\n }\n\n if (target.events[type]) {\n const len = target.events[type].length;\n\n if (listener === 'all') {\n for (let i = 0; i < len; i++) {\n remove(element, type, target.events[type][i], options);\n }\n return;\n }\n else {\n for (let i = 0; i < len; i++) {\n if (target.events[type][i] === listener) {\n element[removeEvent](on + type, wrappedListener, supportsOptions? options : !!options.capture);\n target.events[type].splice(i, 1);\n\n if (useAttachEvent && listeners) {\n listeners.useCount[listenerIndex]--;\n if (listeners.useCount[listenerIndex] === 0) {\n listeners.supplied.splice(listenerIndex, 1);\n listeners.wrapped.splice(listenerIndex, 1);\n listeners.useCount.splice(listenerIndex, 1);\n }\n }\n\n break;\n }\n }\n }\n\n if (target.events[type] && target.events[type].length === 0) {\n target.events[type] = null;\n target.typeCount--;\n }\n }\n\n if (!target.typeCount) {\n targets.splice(elementIndex, 1);\n elements.splice(elementIndex, 1);\n attachedListeners.splice(elementIndex, 1);\n }\n}\n\nfunction addDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n if (!delegatedEvents[type]) {\n delegatedEvents[type] = {\n selectors: [],\n contexts : [],\n listeners: [],\n };\n\n // add delegate listener functions\n for (let i = 0; i < documents.length; i++) {\n add(documents[i], type, delegateListener);\n add(documents[i], type, delegateUseCapture, true);\n }\n }\n\n const delegated = delegatedEvents[type];\n let index;\n\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n break;\n }\n }\n\n if (index === -1) {\n index = delegated.selectors.length;\n\n delegated.selectors.push(selector);\n delegated.contexts .push(context);\n delegated.listeners.push([]);\n }\n\n // keep listener and capture and passive flags\n delegated.listeners[index].push([listener, !!options.capture, options.passive]);\n}\n\nfunction removeDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const delegated = delegatedEvents[type];\n let matchFound = false;\n let index;\n\n if (!delegated) { return; }\n\n // count from last index of delegated to 0\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n // look for matching selector and context Node\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n\n const listeners = delegated.listeners[index];\n\n // each item of the listeners array is an array: [function, capture, passive]\n for (let i = listeners.length - 1; i >= 0; i--) {\n const [fn, capture, passive] = listeners[i];\n\n // check if the listener functions and capture and passive flags match\n if (fn === listener && capture === !!options.capture && passive === options.passive) {\n // remove the listener from the array of listeners\n listeners.splice(i, 1);\n\n // if all listeners for this interactable have been removed\n // remove the interactable from the delegated arrays\n if (!listeners.length) {\n delegated.selectors.splice(index, 1);\n delegated.contexts .splice(index, 1);\n delegated.listeners.splice(index, 1);\n\n // remove delegate function from context\n remove(context, type, delegateListener);\n remove(context, type, delegateUseCapture, true);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegatedEvents[type] = null;\n }\n }\n\n // only remove one listener\n matchFound = true;\n break;\n }\n }\n\n if (matchFound) { break; }\n }\n }\n}\n\n// bound to the interactable context when a DOM event\n// listener is added to a selector interactable\nfunction delegateListener (event, optionalArg) {\n const options = getOptions(optionalArg);\n const fakeEvent = {};\n const delegated = delegatedEvents[event.type];\n const eventTarget = (domUtils.getActualElement(event.path\n ? event.path[0]\n : event.target));\n let element = eventTarget;\n\n // duplicate the event so that currentTarget can be changed\n pExtend(fakeEvent, event);\n\n fakeEvent.originalEvent = event;\n fakeEvent.preventDefault = preventOriginalDefault;\n\n // climb up document tree looking for selector matches\n while (is.element(element)) {\n for (let i = 0; i < delegated.selectors.length; i++) {\n const selector = delegated.selectors[i];\n const context = delegated.contexts[i];\n\n if (domUtils.matchesSelector(element, selector)\n && domUtils.nodeContains(context, eventTarget)\n && domUtils.nodeContains(context, element)) {\n\n const listeners = delegated.listeners[i];\n\n fakeEvent.currentTarget = element;\n\n for (let j = 0; j < listeners.length; j++) {\n const [fn, capture, passive] = listeners[j];\n\n if (capture === !!options.capture && passive === options.passive) {\n fn(fakeEvent);\n }\n }\n }\n }\n\n element = domUtils.parentNode(element);\n }\n}\n\nfunction delegateUseCapture (event) {\n return delegateListener.call(this, event, true);\n}\n\nfunction preventDef () {\n this.returnValue = false;\n}\n\nfunction preventOriginalDefault () {\n this.originalEvent.preventDefault();\n}\n\nfunction stopProp () {\n this.cancelBubble = true;\n}\n\nfunction stopImmProp () {\n this.cancelBubble = true;\n this.immediatePropagationStopped = true;\n}\n\nfunction getOptions (param) {\n return is.object(param)? param : { capture: param };\n}\n\nmodule.exports = {\n add,\n remove,\n\n addDelegate,\n removeDelegate,\n\n delegateListener,\n delegateUseCapture,\n delegatedEvents,\n documents,\n\n useAttachEvent,\n supportsOptions,\n\n _elements: elements,\n _targets: targets,\n _attachedListeners: attachedListeners,\n};\n","module.exports = function extend (dest, source) {\n for (const prop in source) {\n dest[prop] = source[prop];\n }\n return dest;\n};\n","const {\n resolveRectLike,\n rectToXY,\n} = require('./rect');\n\nmodule.exports = function (target, element, action) {\n const actionOptions = target.options[action];\n const actionOrigin = actionOptions && actionOptions.origin;\n const origin = actionOrigin || target.options.origin;\n\n const originRect = resolveRectLike(origin, target, element, [target && element]);\n\n return rectToXY(originRect) || { x: 0, y: 0 };\n};\n","module.exports = (x, y) => Math.sqrt(x * x + y * y);\n","const extend = require('./extend');\nconst win = require('./window');\n\nconst utils = {\n warnOnce: function (method, message) {\n let warned = false;\n\n return function () {\n if (!warned) {\n win.window.console.warn(message);\n warned = true;\n }\n\n return method.apply(this, arguments);\n };\n },\n\n // http://stackoverflow.com/a/5634528/2280888\n _getQBezierValue: function (t, p1, p2, p3) {\n const iT = 1 - t;\n return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3;\n },\n\n getQuadraticCurvePoint: function (startX, startY, cpX, cpY, endX, endY, position) {\n return {\n x: utils._getQBezierValue(position, startX, cpX, endX),\n y: utils._getQBezierValue(position, startY, cpY, endY),\n };\n },\n\n // http://gizma.com/easing/\n easeOutQuad: function (t, b, c, d) {\n t /= d;\n return -c * t*(t-2) + b;\n },\n\n copyAction: function (dest, src) {\n dest.name = src.name;\n dest.axis = src.axis;\n dest.edges = src.edges;\n\n return dest;\n },\n\n is : require('./is'),\n extend : extend,\n hypot : require('./hypot'),\n getOriginXY: require('./getOriginXY'),\n};\n\nextend(utils, require('./arr'));\nextend(utils, require('./domUtils'));\nextend(utils, require('./pointerUtils'));\nextend(utils, require('./rect'));\n\nmodule.exports = utils;\n","const scope = require('../scope');\nconst utils = require('./index');\n\nconst finder = {\n methodOrder: [ 'simulationResume', 'mouseOrPen', 'hasPointer', 'idle' ],\n\n search: function (pointer, eventType, eventTarget) {\n const pointerType = utils.getPointerType(pointer);\n const pointerId = utils.getPointerId(pointer);\n const details = { pointer, pointerId, pointerType, eventType, eventTarget };\n\n for (const method of finder.methodOrder) {\n const interaction = finder[method](details);\n\n if (interaction) {\n return interaction;\n }\n }\n },\n\n // try to resume simulation with a new pointer\n simulationResume: function ({ pointerType, eventType, eventTarget }) {\n if (!/down|start/i.test(eventType)) {\n return null;\n }\n\n for (const interaction of scope.interactions) {\n let element = eventTarget;\n\n if (interaction.simulation && interaction.simulation.allowResume\n && (interaction.pointerType === pointerType)) {\n while (element) {\n // if the element is the interaction element\n if (element === interaction.element) {\n return interaction;\n }\n element = utils.parentNode(element);\n }\n }\n }\n\n return null;\n },\n\n // if it's a mouse or pen interaction\n mouseOrPen: function ({ pointerId, pointerType, eventType }) {\n if (pointerType !== 'mouse' && pointerType !== 'pen') {\n return null;\n }\n\n let firstNonActive;\n\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType) {\n // if it's a down event, skip interactions with running simulations\n if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; }\n\n // if the interaction is active, return it immediately\n if (interaction.interacting()) {\n return interaction;\n }\n // otherwise save it and look for another active interaction\n else if (!firstNonActive) {\n firstNonActive = interaction;\n }\n }\n }\n\n // if no active mouse interaction was found use the first inactive mouse\n // interaction\n if (firstNonActive) {\n return firstNonActive;\n }\n\n // find any mouse or pen interaction.\n // ignore the interaction if the eventType is a *down, and a simulation\n // is active\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType && !(/down/i.test(eventType) && interaction.simulation)) {\n return interaction;\n }\n }\n\n return null;\n },\n\n // get interaction that has this pointer\n hasPointer: function ({ pointerId }) {\n for (const interaction of scope.interactions) {\n if (utils.contains(interaction.pointerIds, pointerId)) {\n return interaction;\n }\n }\n },\n\n // get first idle interaction with a matching pointerType\n idle: function ({ pointerType }) {\n for (const interaction of scope.interactions) {\n // if there's already a pointer held down\n if (interaction.pointerIds.length === 1) {\n const target = interaction.target;\n // don't add this pointer if there is a target interactable and it\n // isn't gesturable\n if (target && !target.options.gesture.enabled) {\n continue;\n }\n }\n // maximum of 2 pointers per interaction\n else if (interaction.pointerIds.length >= 2) {\n continue;\n }\n\n if (!interaction.interacting() && (pointerType === interaction.pointerType)) {\n return interaction;\n }\n }\n\n return null;\n },\n};\n\nmodule.exports = finder;\n","const win = require('./window');\nconst isWindow = require('./isWindow');\n\nconst is = {\n array : () => {},\n\n window : thing => thing === win.window || isWindow(thing),\n\n docFrag : thing => is.object(thing) && thing.nodeType === 11,\n\n object : thing => !!thing && (typeof thing === 'object'),\n\n function: thing => typeof thing === 'function',\n\n number : thing => typeof thing === 'number' ,\n\n bool : thing => typeof thing === 'boolean' ,\n\n string : thing => typeof thing === 'string' ,\n\n element: thing => {\n if (!thing || (typeof thing !== 'object')) { return false; }\n\n const _window = win.getWindow(thing) || win.window;\n\n return (/object|function/.test(typeof _window.Element)\n ? thing instanceof _window.Element //DOM2\n : thing.nodeType === 1 && typeof thing.nodeName === 'string');\n },\n};\n\nis.array = thing => (is.object(thing)\n && (typeof thing.length !== 'undefined')\n && is.function(thing.splice));\n\nmodule.exports = is;\n","module.exports = (thing) => !!(thing && thing.Window) && (thing instanceof thing.Window);\n","function pointerExtend (dest, source) {\n for (const prop in source) {\n const prefixedPropREs = module.exports.prefixedPropREs;\n let deprecated = false;\n\n // skip deprecated prefixed properties\n for (const vendor in prefixedPropREs) {\n if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) {\n deprecated = true;\n break;\n }\n }\n\n if (!deprecated && typeof source[prop] !== 'function') {\n dest[prop] = source[prop];\n }\n }\n return dest;\n}\n\npointerExtend.prefixedPropREs = {\n webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/,\n};\n\nmodule.exports = pointerExtend;\n","const hypot = require('./hypot');\nconst browser = require('./browser');\nconst dom = require('./domObjects');\nconst domUtils = require('./domUtils');\nconst domObjects = require('./domObjects');\nconst is = require('./is');\nconst pointerExtend = require('./pointerExtend');\n\nconst pointerUtils = {\n copyCoords: function (dest, src) {\n dest.page = dest.page || {};\n dest.page.x = src.page.x;\n dest.page.y = src.page.y;\n\n dest.client = dest.client || {};\n dest.client.x = src.client.x;\n dest.client.y = src.client.y;\n\n dest.timeStamp = src.timeStamp;\n },\n\n setCoordDeltas: function (targetObj, prev, cur) {\n targetObj.page.x = cur.page.x - prev.page.x;\n targetObj.page.y = cur.page.y - prev.page.y;\n targetObj.client.x = cur.client.x - prev.client.x;\n targetObj.client.y = cur.client.y - prev.client.y;\n targetObj.timeStamp = cur.timeStamp - prev.timeStamp;\n\n // set pointer velocity\n const dt = Math.max(targetObj.timeStamp / 1000, 0.001);\n\n targetObj.page.speed = hypot(targetObj.page.x, targetObj.page.y) / dt;\n targetObj.page.vx = targetObj.page.x / dt;\n targetObj.page.vy = targetObj.page.y / dt;\n\n targetObj.client.speed = hypot(targetObj.client.x, targetObj.page.y) / dt;\n targetObj.client.vx = targetObj.client.x / dt;\n targetObj.client.vy = targetObj.client.y / dt;\n },\n\n isNativePointer: function (pointer) {\n return (pointer instanceof dom.Event || pointer instanceof dom.Touch);\n },\n\n // Get specified X/Y coords for mouse or event.touches[0]\n getXY: function (type, pointer, xy) {\n xy = xy || {};\n type = type || 'page';\n\n xy.x = pointer[type + 'X'];\n xy.y = pointer[type + 'Y'];\n\n return xy;\n },\n\n getPageXY: function (pointer, page) {\n page = page || {};\n\n // Opera Mobile handles the viewport and scrolling oddly\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n pointerUtils.getXY('screen', pointer, page);\n\n page.x += window.scrollX;\n page.y += window.scrollY;\n }\n else {\n pointerUtils.getXY('page', pointer, page);\n }\n\n return page;\n },\n\n getClientXY: function (pointer, client) {\n client = client || {};\n\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n // Opera Mobile handles the viewport and scrolling oddly\n pointerUtils.getXY('screen', pointer, client);\n }\n else {\n pointerUtils.getXY('client', pointer, client);\n }\n\n return client;\n },\n\n getPointerId: function (pointer) {\n return is.number(pointer.pointerId)? pointer.pointerId : pointer.identifier;\n },\n\n setCoords: function (targetObj, pointers, timeStamp) {\n const pointer = (pointers.length > 1\n ? pointerUtils.pointerAverage(pointers)\n : pointers[0]);\n\n const tmpXY = {};\n\n pointerUtils.getPageXY(pointer, tmpXY);\n targetObj.page.x = tmpXY.x;\n targetObj.page.y = tmpXY.y;\n\n pointerUtils.getClientXY(pointer, tmpXY);\n targetObj.client.x = tmpXY.x;\n targetObj.client.y = tmpXY.y;\n\n targetObj.timeStamp = is.number(timeStamp) ? timeStamp :new Date().getTime();\n },\n\n pointerExtend: pointerExtend,\n\n getTouchPair: function (event) {\n const touches = [];\n\n // array of touches is supplied\n if (is.array(event)) {\n touches[0] = event[0];\n touches[1] = event[1];\n }\n // an event\n else {\n if (event.type === 'touchend') {\n if (event.touches.length === 1) {\n touches[0] = event.touches[0];\n touches[1] = event.changedTouches[0];\n }\n else if (event.touches.length === 0) {\n touches[0] = event.changedTouches[0];\n touches[1] = event.changedTouches[1];\n }\n }\n else {\n touches[0] = event.touches[0];\n touches[1] = event.touches[1];\n }\n }\n\n return touches;\n },\n\n pointerAverage: function (pointers) {\n const average = {\n pageX : 0,\n pageY : 0,\n clientX: 0,\n clientY: 0,\n screenX: 0,\n screenY: 0,\n };\n\n for (const pointer of pointers) {\n for (const prop in average) {\n average[prop] += pointer[prop];\n }\n }\n for (const prop in average) {\n average[prop] /= pointers.length;\n }\n\n return average;\n },\n\n touchBBox: function (event) {\n if (!event.length && !(event.touches && event.touches.length > 1)) {\n return;\n }\n\n const touches = pointerUtils.getTouchPair(event);\n const minX = Math.min(touches[0].pageX, touches[1].pageX);\n const minY = Math.min(touches[0].pageY, touches[1].pageY);\n const maxX = Math.max(touches[0].pageX, touches[1].pageX);\n const maxY = Math.max(touches[0].pageY, touches[1].pageY);\n\n return {\n x: minX,\n y: minY,\n left: minX,\n top: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n },\n\n touchDistance: function (event, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n\n\n const dx = touches[0][sourceX] - touches[1][sourceX];\n const dy = touches[0][sourceY] - touches[1][sourceY];\n\n return hypot(dx, dy);\n },\n\n touchAngle: function (event, prevAngle, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n const dx = touches[1][sourceX] - touches[0][sourceX];\n const dy = touches[1][sourceY] - touches[0][sourceY];\n const angle = 180 * Math.atan2(dy , dx) / Math.PI;\n\n return angle;\n },\n\n getPointerType: function (pointer) {\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : is.number(pointer.pointerType)\n ? [undefined, undefined,'touch', 'pen', 'mouse'][pointer.pointerType]\n // if the PointerEvent API isn't available, then the \"pointer\" must\n // be either a MouseEvent, TouchEvent, or Touch object\n : /touch/.test(pointer.type) || pointer instanceof domObjects.Touch\n ? 'touch'\n : 'mouse';\n },\n\n // [ event.target, event.currentTarget ]\n getEventTargets: function (event) {\n return [\n domUtils.getActualElement(event.path ? event.path[0] : event.target),\n domUtils.getActualElement(event.currentTarget),\n ];\n },\n};\n\nmodule.exports = pointerUtils;\n","const { window } = require('./window');\n\nconst vendors = ['ms', 'moz', 'webkit', 'o'];\nlet lastTime = 0;\nlet request;\nlet cancel;\n\nfor (let x = 0; x < vendors.length && !window.requestAnimationFrame; x++) {\n request = window[vendors[x] + 'RequestAnimationFrame'];\n cancel = window[vendors[x] +'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n}\n\nif (!request) {\n request = function (callback) {\n const currTime = new Date().getTime();\n const timeToCall = Math.max(0, 16 - (currTime - lastTime));\n const id = setTimeout(function () { callback(currTime + timeToCall); },\n timeToCall);\n\n lastTime = currTime + timeToCall;\n return id;\n };\n}\n\nif (!cancel) {\n cancel = function (id) {\n clearTimeout(id);\n };\n}\n\nmodule.exports = {\n request,\n cancel,\n};\n","const extend = require('./extend');\nconst is = require('./is');\nconst {\n closest,\n parentNode,\n getElementRect,\n} = require('./domUtils');\n\nconst rectUtils = {\n getStringOptionResult: function (value, interactable, element) {\n if (!is.string(value)) {\n return null;\n }\n\n if (value === 'parent') {\n value = parentNode(element);\n }\n else if (value === 'self') {\n value = interactable.getRect(element);\n }\n else {\n value = closest(element, value);\n }\n\n return value;\n },\n\n resolveRectLike: function (value, interactable, element, functionArgs) {\n value = rectUtils.getStringOptionResult(value, interactable, element) || value;\n\n if (is.function(value)) {\n value = value.apply(null, functionArgs);\n }\n\n if (is.element(value)) {\n value = getElementRect(value);\n }\n\n return value;\n },\n\n rectToXY: function (rect) {\n return rect && {\n x: 'x' in rect ? rect.x : rect.left,\n y: 'y' in rect ? rect.y : rect.top,\n };\n },\n\n xywhToTlbr: function (rect) {\n if (rect && !('left' in rect && 'top' in rect)) {\n rect = extend({}, rect);\n\n rect.left = rect.x || 0;\n rect.top = rect.y || 0;\n rect.right = rect.right || (rect.left + rect.width);\n rect.bottom = rect.bottom || (rect.top + rect.height);\n }\n\n return rect;\n },\n\n tlbrToXywh: function (rect) {\n if (rect && !('x' in rect && 'y' in rect)) {\n rect = extend({}, rect);\n\n rect.x = rect.left || 0;\n rect.top = rect.top || 0;\n rect.width = rect.width || (rect.right - rect.x);\n rect.height = rect.height || (rect.bottom - rect.y);\n }\n\n return rect;\n },\n};\n\nmodule.exports = rectUtils;\n","const win = module.exports;\nconst isWindow = require('./isWindow');\n\nfunction init (window) {\n // get wrapped window if using Shadow DOM polyfill\n\n win.realWindow = window;\n\n // create a TextNode\n const el = window.document.createTextNode('');\n\n // check if it's wrapped by a polyfill\n if (el.ownerDocument !== window.document\n && typeof window.wrap === 'function'\n && window.wrap(el) === el) {\n // use wrapped window\n window = window.wrap(window);\n }\n\n win.window = window;\n}\n\nif (typeof window === 'undefined') {\n win.window = undefined;\n win.realWindow = undefined;\n}\nelse {\n init(window);\n}\n\nwin.getWindow = function getWindow (node) {\n if (isWindow(node)) {\n return node;\n }\n\n const rootNode = (node.ownerDocument || node);\n\n return rootNode.defaultView || rootNode.parentWindow || win.window;\n};\n\nwin.init = init;\n"]} \ No newline at end of file diff --git a/package.json b/package.json index 76f3e9969..f39704e99 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "interactjs", - "version": "1.3.0-alpha.3+sha.9595c40", + "version": "1.3.0-alpha.4+sha.7970416", "repository": { "type": "git", "url": "https://github.com/taye/interact.js.git"
- Interaction.doMove()⚓➭ + Interaction.doMove()⚓➭ @@ -2403,7 +2403,7 @@ Interaction.doMove() - Interaction.end([event])⚓➭ + Interaction.end([event])⚓➭ diff --git a/dist/interact.js b/dist/interact.js index e8ae35c3b..c78a3c751 100644 --- a/dist/interact.js +++ b/dist/interact.js @@ -1,5 +1,5 @@ /** - * interact.js v1.3.0-alpha.3+sha.9595c40 + * interact.js v1.3.0-alpha.4+sha.7970416-dirty * * Copyright (c) 2012-2017 Taye Adeyemi * Open source under the MIT License. @@ -816,6 +816,7 @@ var scope = require('./scope'); var utils = require('./utils'); var events = require('./utils/events'); var browser = require('./utils/browser'); +var domObjects = require('./utils/domObjects'); var finder = require('./utils/interactionFinder'); var signals = require('./utils/Signals').new(); @@ -829,7 +830,9 @@ var prevTouchTime = 0; scope.interactions = []; var Interaction = function () { - function Interaction() { + function Interaction(_ref) { + var pointerType = _ref.pointerType; + _classCallCheck(this, Interaction); this.target = null; // current interactable being interacted with @@ -886,7 +889,7 @@ var Interaction = function () { this.pointerWasMoved = false; this._interacting = false; - this.mouse = false; + this.pointerType = pointerType; signals.fire('new', this); @@ -1130,6 +1133,11 @@ var Interaction = function () { }; Interaction.prototype.getPointerIndex = function getPointerIndex(pointer) { + // mouse and pen interactions may have only one pointer + if (this.pointerType === 'mouse' || this.pointerType === 'pen') { + return 0; + } + return utils.indexOf(this.pointerIds, utils.getPointerId(pointer)); }; @@ -1161,8 +1169,7 @@ var Interaction = function () { }; Interaction.prototype.removePointer = function removePointer(pointer, event) { - var id = utils.getPointerId(pointer); - var index = this.mouse ? 0 : utils.indexOf(this.pointerIds, id); + var index = this.getPointerIndex(pointer); if (index === -1) { return; @@ -1197,6 +1204,8 @@ for (var i = 0, len = methodNames.length; i < len; i++) { function doOnInteractions(method) { return function (event) { + var pointerType = utils.getPointerType(event); + var _utils$getEventTarget = utils.getEventTargets(event), eventTarget = _utils$getEventTarget[0], curEventTarget = _utils$getEventTarget[1]; @@ -1210,7 +1219,7 @@ function doOnInteractions(method) { var pointer = event.changedTouches[_i]; var interaction = finder.search(pointer, event.type, eventTarget); - matches.push([pointer, interaction || new Interaction()]); + matches.push([pointer, interaction || new Interaction({ pointerType: pointerType })]); } } else { var invalidPointer = false; @@ -1218,7 +1227,7 @@ function doOnInteractions(method) { if (!browser.supportsPointerEvent && /mouse/.test(event.type)) { // ignore mouse events while touch interactions are active for (var _i2 = 0; _i2 < scope.interactions.length && !invalidPointer; _i2++) { - invalidPointer = !scope.interactions[_i2].mouse && scope.interactions[_i2].pointerIsDown; + invalidPointer = scope.interactions[_i2].pointerType !== 'mouse' && scope.interactions[_i2].pointerIsDown; } // try to ignore mouse events that are simulated by the browser @@ -1232,11 +1241,7 @@ function doOnInteractions(method) { var _interaction = finder.search(event, event.type, eventTarget); if (!_interaction) { - - _interaction = new Interaction(); - _interaction.mouse = /mouse/i.test(event.pointerType || event.type) - // MSPointerEvent.MSPOINTER_TYPE_MOUSE - || event.pointerType === 4 || !event.pointerType; + _interaction = new Interaction({ pointerType: pointerType }); } matches.push([event, _interaction]); @@ -1244,20 +1249,20 @@ function doOnInteractions(method) { } for (var _iterator = matches, _isArray = Array.isArray(_iterator), _i3 = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { - var _ref; + var _ref2; if (_isArray) { if (_i3 >= _iterator.length) break; - _ref = _iterator[_i3++]; + _ref2 = _iterator[_i3++]; } else { _i3 = _iterator.next(); if (_i3.done) break; - _ref = _i3.value; + _ref2 = _i3.value; } - var _ref2 = _ref, - _pointer = _ref2[0], - _interaction2 = _ref2[1]; + var _ref3 = _ref2, + _pointer = _ref3[0], + _interaction2 = _ref3[1]; _interaction2._updateEventTargets(eventTarget, curEventTarget); _interaction2[method](_pointer, event, eventTarget, curEventTarget); @@ -1277,7 +1282,7 @@ function endAll(event) { var docEvents = {/* 'eventType': listenerFunc */}; var pEventTypes = browser.pEventTypes; -if (scope.PointerEvent) { +if (domObjects.PointerEvent) { docEvents[pEventTypes.down] = listeners.pointerDown; docEvents[pEventTypes.move] = listeners.pointerMove; docEvents[pEventTypes.up] = listeners.pointerUp; @@ -1295,8 +1300,8 @@ if (scope.PointerEvent) { docEvents.blur = endAll; -function onDocSignal(_ref3, signalName) { - var doc = _ref3.doc; +function onDocSignal(_ref4, signalName) { + var doc = _ref4.doc; var eventMethod = signalName.indexOf('add') === 0 ? events.add : events.remove; @@ -1311,14 +1316,14 @@ function onDocSignal(_ref3, signalName) { } } -signals.on('update-pointer-down', function (_ref4) { - var interaction = _ref4.interaction, - pointer = _ref4.pointer, - pointerId = _ref4.pointerId, - pointerIndex = _ref4.pointerIndex, - event = _ref4.event, - eventTarget = _ref4.eventTarget, - down = _ref4.down; +signals.on('update-pointer-down', function (_ref5) { + var interaction = _ref5.interaction, + pointer = _ref5.pointer, + pointerId = _ref5.pointerId, + pointerIndex = _ref5.pointerIndex, + event = _ref5.event, + eventTarget = _ref5.eventTarget, + down = _ref5.down; interaction.pointerIds[pointerIndex] = pointerId; interaction.pointers[pointerIndex] = pointer; @@ -1355,7 +1360,7 @@ scope.endAllInteractions = endAll; module.exports = Interaction; -},{"./scope":34,"./utils":44,"./utils/Signals":35,"./utils/browser":37,"./utils/events":40,"./utils/interactionFinder":45}],6:[function(require,module,exports){ +},{"./scope":34,"./utils":44,"./utils/Signals":35,"./utils/browser":37,"./utils/domObjects":38,"./utils/events":40,"./utils/interactionFinder":45}],6:[function(require,module,exports){ 'use strict'; var Interaction = require('../Interaction'); @@ -5460,7 +5465,7 @@ module.exports = function () { this.originalEvent = event; this.type = type; this.pointerId = pointerUtils.getPointerId(pointer); - this.pointerType = pointerUtils.getPointerType(pointer, interaction); + this.pointerType = pointerUtils.getPointerType(pointer); this.target = eventTarget; this.currentTarget = null; @@ -5758,8 +5763,10 @@ Interaction.signals.on('down', function (_ref6) { timer.duration = minDuration; timer.timeout = setTimeout(function () { fire({ - interaction: interaction, eventCopy: eventCopy, eventTarget: eventTarget, + interaction: interaction, + eventTarget: eventTarget, pointer: browser.isIE8 ? eventCopy : pointer, + event: eventCopy, type: 'hold' }); }, minDuration); @@ -6946,17 +6953,14 @@ module.exports = utils; var scope = require('../scope'); var utils = require('./index'); -var browser = require('./browser'); var finder = { - methodOrder: ['simulationResume', 'mouse', 'hasPointer', 'idle'], + methodOrder: ['simulationResume', 'mouseOrPen', 'hasPointer', 'idle'], search: function search(pointer, eventType, eventTarget) { - var mouseEvent = /mouse/i.test(pointer.pointerType || eventType) - // MSPointerEvent.MSPOINTER_TYPE_MOUSE - || pointer.pointerType === 4; + var pointerType = utils.getPointerType(pointer); var pointerId = utils.getPointerId(pointer); - var details = { pointer: pointer, pointerId: pointerId, mouseEvent: mouseEvent, eventType: eventType, eventTarget: eventTarget }; + var details = { pointer: pointer, pointerId: pointerId, pointerType: pointerType, eventType: eventType, eventTarget: eventTarget }; for (var _iterator = finder.methodOrder, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { var _ref; @@ -6982,7 +6986,7 @@ var finder = { // try to resume simulation with a new pointer simulationResume: function simulationResume(_ref2) { - var mouseEvent = _ref2.mouseEvent, + var pointerType = _ref2.pointerType, eventType = _ref2.eventType, eventTarget = _ref2.eventTarget; @@ -7006,7 +7010,7 @@ var finder = { var element = eventTarget; - if (interaction.simulation && interaction.simulation.allowResume && interaction.mouse === mouseEvent) { + if (interaction.simulation && interaction.simulation.allowResume && interaction.pointerType === pointerType) { while (element) { // if the element is the interaction element if (element === interaction.element) { @@ -7020,13 +7024,13 @@ var finder = { return null; }, - // if it's a mouse interaction - mouse: function mouse(_ref4) { + // if it's a mouse or pen interaction + mouseOrPen: function mouseOrPen(_ref4) { var pointerId = _ref4.pointerId, - mouseEvent = _ref4.mouseEvent, + pointerType = _ref4.pointerType, eventType = _ref4.eventType; - if (!mouseEvent && (browser.supportsTouch || browser.supportsPointerEvent)) { + if (pointerType !== 'mouse' && pointerType !== 'pen') { return null; } @@ -7046,7 +7050,7 @@ var finder = { var interaction = _ref5; - if (interaction.mouse) { + if (interaction.pointerType === pointerType) { // if it's a down event, skip interactions with running simulations if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; @@ -7069,8 +7073,8 @@ var finder = { return firstNonActive; } - // Find any interaction specifically for mouse. - // ignore the interaction if the eventType is a mousedown, and a simulation + // find any mouse or pen interaction. + // ignore the interaction if the eventType is a *down, and a simulation // is active for (var _iterator4 = scope.interactions, _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) { var _ref6; @@ -7086,7 +7090,7 @@ var finder = { var _interaction = _ref6; - if (_interaction.mouse && !(/down/.test(eventType) && _interaction.simulation)) { + if (_interaction.pointerType === pointerType && !(/down/i.test(eventType) && _interaction.simulation)) { return _interaction; } } @@ -7118,9 +7122,9 @@ var finder = { } }, - // get first idle interaction + // get first idle interaction with a matching pointerType idle: function idle(_ref9) { - var mouseEvent = _ref9.mouseEvent; + var pointerType = _ref9.pointerType; for (var _iterator6 = scope.interactions, _isArray6 = Array.isArray(_iterator6), _i6 = 0, _iterator6 = _isArray6 ? _iterator6 : _iterator6[Symbol.iterator]();;) { var _ref10; @@ -7150,7 +7154,7 @@ var finder = { continue; } - if (!interaction.interacting() && mouseEvent === interaction.mouse) { + if (!interaction.interacting() && pointerType === interaction.pointerType) { return interaction; } } @@ -7161,7 +7165,7 @@ var finder = { module.exports = finder; -},{"../scope":34,"./browser":37,"./index":44}],46:[function(require,module,exports){ +},{"../scope":34,"./index":44}],46:[function(require,module,exports){ 'use strict'; var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; @@ -7262,6 +7266,7 @@ var hypot = require('./hypot'); var browser = require('./browser'); var dom = require('./domObjects'); var domUtils = require('./domUtils'); +var domObjects = require('./domObjects'); var is = require('./is'); var pointerExtend = require('./pointerExtend'); @@ -7468,17 +7473,11 @@ var pointerUtils = { return angle; }, - getPointerType: function getPointerType(pointer, interaction) { - // if the PointerEvent API isn't available, then the pointer must be ither - // a MouseEvent or TouchEvent - if (interaction.mouse) { - return 'mouse'; - } - if (!browser.supportsPointerEvent) { - return 'touch'; - } - - return is.string(pointer.pointerType) ? pointer.pointerType : [undefined, undefined, 'touch', 'pen', 'mouse'][pointer.pointerType]; + getPointerType: function getPointerType(pointer) { + return is.string(pointer.pointerType) ? pointer.pointerType : is.number(pointer.pointerType) ? [undefined, undefined, 'touch', 'pen', 'mouse'][pointer.pointerType] + // if the PointerEvent API isn't available, then the "pointer" must + // be either a MouseEvent, TouchEvent, or Touch object + : /touch/.test(pointer.type) || pointer instanceof domObjects.Touch ? 'touch' : 'mouse'; }, // [ event.target, event.currentTarget ] diff --git a/dist/interact.js.map b/dist/interact.js.map index 60832b766..4f3a62ba8 100644 --- a/dist/interact.js.map +++ b/dist/interact.js.map @@ -1 +1 @@ -{"version":3,"sources":["src/header.js","node_modules/browser-pack/_prelude.js","index.js","src/Eventable.js","src/InteractEvent.js","src/Interactable.js","src/Interaction.js","src/actions/base.js","src/actions/drag.js","src/actions/drop.js","src/actions/gesture.js","src/actions/resize.js","src/autoScroll.js","src/autoStart/InteractableMethods.js","src/autoStart/base.js","src/autoStart/delay.js","src/autoStart/drag.js","src/autoStart/gesture.js","src/autoStart/resize.js","src/defaultOptions.js","src/index.js","src/inertia.js","src/interact.js","src/interactablePreventDefault.js","src/legacyBrowsers.js","src/modifiers/index.js","src/modifiers/restrict.js","src/modifiers/restrictEdges.js","src/modifiers/restrictSize.js","src/modifiers/snap.js","src/modifiers/snapSize.js","src/pointerEvents/PointerEvent.js","src/pointerEvents/base.js","src/pointerEvents/holdRepeat.js","src/pointerEvents/interactableTargets.js","src/scope.js","src/utils/Signals.js","src/utils/arr.js","src/utils/browser.js","src/utils/domObjects.js","src/utils/domUtils.js","src/utils/events.js","src/utils/extend.js","src/utils/getOriginXY.js","src/utils/hypot.js","src/utils/index.js","src/utils/interactionFinder.js","src/utils/is.js","src/utils/isWindow.js","src/utils/pointerExtend.js","src/utils/pointerUtils.js","src/utils/raf.js","src/utils/rect.js","src/utils/window.js"],"names":[],"mappings":"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","file":"interact.js","sourceRoot":"","sourcesContent":["/**\n * interact.js v1.3.0-alpha.3+sha.9595c40\n *\n * Copyright (c) 2012-2017 Taye Adeyemi \n * Open source under the MIT License.\n * https://raw.github.com/taye/interact.js/master/LICENSE\n */\n","(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o 150) {\n return null;\n }\n\n let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI;\n const overlap = 22.5;\n\n if (angle < 0) {\n angle += 360;\n }\n\n const left = 135 - overlap <= angle && angle < 225 + overlap;\n const up = 225 - overlap <= angle && angle < 315 + overlap;\n\n const right = !left && (315 - overlap <= angle || angle < 45 + overlap);\n const down = !up && 45 - overlap <= angle && angle < 135 + overlap;\n\n return {\n up,\n down,\n left,\n right,\n angle,\n speed: interaction.prevEvent.speed,\n velocity: {\n x: interaction.prevEvent.velocityX,\n y: interaction.prevEvent.velocityY,\n },\n };\n }\n\n preventDefault () {}\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n}\n\nsignals.on('set-delta', function ({ iEvent, interaction, starting, deltaSource }) {\n const prevEvent = starting? iEvent : interaction.prevEvent;\n\n if (deltaSource === 'client') {\n iEvent.dx = iEvent.clientX - prevEvent.clientX;\n iEvent.dy = iEvent.clientY - prevEvent.clientY;\n }\n else {\n iEvent.dx = iEvent.pageX - prevEvent.pageX;\n iEvent.dy = iEvent.pageY - prevEvent.pageY;\n }\n});\n\nInteractEvent.signals = signals;\n\nmodule.exports = InteractEvent;\n","const is = require('./utils/is');\nconst events = require('./utils/events');\nconst extend = require('./utils/extend');\nconst actions = require('./actions/base');\nconst scope = require('./scope');\nconst Eventable = require('./Eventable');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nconst {\n getElementRect,\n nodeContains,\n trySelector,\n} = require('./utils/domUtils');\nconst { getWindow } = require('./utils/window');\nconst { indexOf, contains } = require('./utils/arr');\nconst { wheelEvent } = require('./utils/browser');\n\n// all set interactables\nscope.interactables = [];\n\n/*\\\n * Interactable\n [ property ]\n **\n * Object type returned by @interact\n\\*/\nclass Interactable {\n constructor (target, options) {\n options = options || {};\n\n this.target = target;\n this.events = new Eventable();\n this._context = options.context || scope.document;\n this._win = getWindow(trySelector(target)? this._context : target);\n this._doc = this._win.document;\n\n signals.fire('new', {\n target,\n options,\n interactable: this,\n win: this._win,\n });\n\n scope.addDocument( this._doc, this._win );\n\n scope.interactables.push(this);\n\n this.set(options);\n }\n\n setOnEvents (action, phases) {\n const onAction = 'on' + action;\n\n if (is.function(phases.onstart) ) { this.events[onAction + 'start' ] = phases.onstart ; }\n if (is.function(phases.onmove) ) { this.events[onAction + 'move' ] = phases.onmove ; }\n if (is.function(phases.onend) ) { this.events[onAction + 'end' ] = phases.onend ; }\n if (is.function(phases.oninertiastart)) { this.events[onAction + 'inertiastart' ] = phases.oninertiastart ; }\n\n return this;\n }\n\n setPerAction (action, options) {\n // for all the default per-action options\n for (const option in options) {\n // if this option exists for this action\n if (option in defaults[action]) {\n // if the option in the options arg is an object value\n if (is.object(options[option])) {\n // duplicate the object\n this.options[action][option] = extend(this.options[action][option] || {}, options[option]);\n\n if (is.object(defaults.perAction[option]) && 'enabled' in defaults.perAction[option]) {\n this.options[action][option].enabled = options[option].enabled === false? false : true;\n }\n }\n else if (is.bool(options[option]) && is.object(defaults.perAction[option])) {\n this.options[action][option].enabled = options[option];\n }\n else if (options[option] !== undefined) {\n // or if it's not undefined, do a plain assignment\n this.options[action][option] = options[option];\n }\n }\n }\n }\n\n /*\\\n * Interactable.getRect\n [ method ]\n *\n * The default function to get an Interactables bounding rect. Can be\n * overridden using @Interactable.rectChecker.\n *\n - element (Element) #optional The element to measure.\n = (object) The object's bounding rectangle.\n o {\n o top : 0,\n o left : 0,\n o bottom: 0,\n o right : 0,\n o width : 0,\n o height: 0\n o }\n \\*/\n getRect (element) {\n element = element || this.target;\n\n if (is.string(this.target) && !(is.element(element))) {\n element = this._context.querySelector(this.target);\n }\n\n return getElementRect(element);\n }\n\n /*\\\n * Interactable.rectChecker\n [ method ]\n *\n * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n - checker (function) #optional A function which returns this Interactable's bounding rectangle. See @Interactable.getRect\n = (function | object) The checker function or this Interactable\n \\*/\n rectChecker (checker) {\n if (is.function(checker)) {\n this.getRect = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.getRect;\n\n return this;\n }\n\n return this.getRect;\n }\n\n _backCompatOption (optionName, newValue) {\n if (trySelector(newValue) || is.object(newValue)) {\n this.options[optionName] = newValue;\n\n for (const action of actions.names) {\n this.options[action][optionName] = newValue;\n }\n\n return this;\n }\n\n return this.options[optionName];\n }\n\n /*\\\n * Interactable.origin\n [ method ]\n *\n * Gets or sets the origin of the Interactable's element. The x and y\n * of the origin will be subtracted from action event coordinates.\n *\n - origin (object | string) #optional An object eg. { x: 0, y: 0 } or string 'parent', 'self' or any CSS selector\n * OR\n - origin (Element) #optional An HTML or SVG Element whose rect will be used\n **\n = (object) The current origin or this Interactable\n \\*/\n origin (newValue) {\n return this._backCompatOption('origin', newValue);\n }\n\n /*\\\n * Interactable.deltaSource\n [ method ]\n *\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n - newValue (string) #optional Use 'client' if you will be scrolling while interacting; Use 'page' if you want autoScroll to work\n = (string | object) The current deltaSource or this Interactable\n \\*/\n deltaSource (newValue) {\n if (newValue === 'page' || newValue === 'client') {\n this.options.deltaSource = newValue;\n\n return this;\n }\n\n return this.options.deltaSource;\n }\n\n /*\\\n * Interactable.context\n [ method ]\n *\n * Gets the selector context Node of the Interactable. The default is `window.document`.\n *\n = (Node) The context Node of this Interactable\n **\n \\*/\n context () {\n return this._context;\n }\n\n inContext (element) {\n return (this._context === element.ownerDocument\n || nodeContains(this._context, element));\n }\n\n /*\\\n * Interactable.fire\n [ method ]\n *\n * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n - iEvent (InteractEvent) The InteractEvent object to be fired on this Interactable\n = (Interactable) this Interactable\n \\*/\n fire (iEvent) {\n this.events.fire(iEvent);\n\n return this;\n }\n\n _onOffMultiple (method, eventType, listener, options) {\n if (is.string(eventType) && eventType.search(' ') !== -1) {\n eventType = eventType.trim().split(/ +/);\n }\n\n if (is.array(eventType)) {\n for (let i = 0; i < eventType.length; i++) {\n this[method](eventType[i], listener, options);\n }\n\n return true;\n }\n\n if (is.object(eventType)) {\n for (const prop in eventType) {\n this[method](prop, eventType[prop], listener);\n }\n\n return true;\n }\n }\n\n /*\\\n * Interactable.on\n [ method ]\n *\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n - eventType (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) This Interactable\n \\*/\n on (eventType, listener, options) {\n if (this._onOffMultiple('on', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.on(eventType, listener);\n }\n // delegated event for selector\n else if (is.string(this.target)) {\n events.addDelegate(this.target, this._context, eventType, listener, options);\n }\n else {\n events.add(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.off\n [ method ]\n *\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n - eventType (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) This Interactable\n \\*/\n off (eventType, listener, options) {\n if (this._onOffMultiple('off', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n // if it is an action event type\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.off(eventType, listener);\n }\n // delegated event\n else if (is.string(this.target)) {\n events.removeDelegate(this.target, this._context, eventType, listener, options);\n }\n // remove listener from this Interatable's element\n else {\n events.remove(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.set\n [ method ]\n *\n * Reset the options of this Interactable\n - options (object) The new settings to apply\n = (object) This Interactable\n \\*/\n set (options) {\n if (!is.object(options)) {\n options = {};\n }\n\n this.options = extend({}, defaults.base);\n\n const perActions = extend({}, defaults.perAction);\n\n for (const actionName in actions.methodDict) {\n const methodName = actions.methodDict[actionName];\n\n this.options[actionName] = extend({}, defaults[actionName]);\n\n this.setPerAction(actionName, perActions);\n\n this[methodName](options[actionName]);\n }\n\n for (const setting of Interactable.settingsMethods) {\n this.options[setting] = defaults.base[setting];\n\n if (setting in options) {\n this[setting](options[setting]);\n }\n }\n\n signals.fire('set', {\n options,\n interactable: this,\n });\n\n return this;\n }\n\n /*\\\n * Interactable.unset\n [ method ]\n *\n * Remove this interactable from the list of interactables and remove\n * it's action capabilities and event listeners\n *\n = (object) @interact\n \\*/\n unset () {\n events.remove(this.target, 'all');\n\n if (is.string(this.target)) {\n // remove delegated events\n for (const type in events.delegatedEvents) {\n const delegated = events.delegatedEvents[type];\n\n if (delegated.selectors[0] === this.target\n && delegated.contexts[0] === this._context) {\n\n delegated.selectors.splice(0, 1);\n delegated.contexts .splice(0, 1);\n delegated.listeners.splice(0, 1);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegated[type] = null;\n }\n }\n\n events.remove(this._context, type, events.delegateListener);\n events.remove(this._context, type, events.delegateUseCapture, true);\n }\n }\n else {\n events.remove(this, 'all');\n }\n\n signals.fire('unset', { interactable: this });\n\n scope.interactables.splice(indexOf(scope.interactables, this), 1);\n\n // Stop related interactions when an Interactable is unset\n for (const interaction of scope.interactions || []) {\n if (interaction.target === this && interaction.interacting()) {\n interaction.stop();\n }\n }\n\n return scope.interact;\n }\n}\n\nscope.interactables.indexOfElement = function indexOfElement (target, context) {\n context = context || scope.document;\n\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n if (interactable.target === target && interactable._context === context) {\n return i;\n }\n }\n return -1;\n};\n\nscope.interactables.get = function interactableGet (element, options, dontCheckInContext) {\n const ret = this[this.indexOfElement(element, options && options.context)];\n\n return ret && (is.string(element) || dontCheckInContext || ret.inContext(element))? ret : null;\n};\n\nscope.interactables.forEachSelector = function (callback, element) {\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n // skip non CSS selector targets and out of context elements\n if (!is.string(interactable.target)\n || (element && !interactable.inContext(element))) {\n continue;\n }\n\n const ret = callback(interactable, interactable.target, interactable._context, i, this);\n\n if (ret !== undefined) {\n return ret;\n }\n }\n};\n\n// all interact.js eventTypes\nInteractable.eventTypes = scope.eventTypes = [];\n\nInteractable.signals = signals;\n\nInteractable.settingsMethods = [ 'deltaSource', 'origin', 'preventDefault', 'rectChecker' ];\n\nmodule.exports = Interactable;\n","const scope = require('./scope');\nconst utils = require('./utils');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst finder = require('./utils/interactionFinder');\nconst signals = require('./utils/Signals').new();\n\nconst listeners = {};\nconst methodNames = [\n 'pointerDown', 'pointerMove', 'pointerUp',\n 'updatePointer', 'removePointer',\n];\n\n// for ignoring browser's simulated mouse events\nlet prevTouchTime = 0;\n\n// all active and idle interactions\nscope.interactions = [];\n\nclass Interaction {\n constructor () {\n this.target = null; // current interactable being interacted with\n this.element = null; // the target element of the interactable\n\n this.prepared = { // action that's ready to be fired on next move event\n name : null,\n axis : null,\n edges: null,\n };\n\n // keep track of added pointers\n this.pointers = [];\n this.pointerIds = [];\n this.downTargets = [];\n this.downTimes = [];\n\n // Previous native pointer move event coordinates\n this.prevCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n // current native pointer move event coordinates\n this.curCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Starting InteractEvent pointer coordinates\n this.startCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Change in coordinates and time of the pointer\n this.pointerDelta = {\n page : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n client : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n timeStamp: 0,\n };\n\n this.downEvent = null; // pointerdown/mousedown/touchstart event\n this.downPointer = {};\n\n this._eventTarget = null;\n this._curEventTarget = null;\n\n this.prevEvent = null; // previous action event\n\n this.pointerIsDown = false;\n this.pointerWasMoved = false;\n this._interacting = false;\n\n this.mouse = false;\n\n signals.fire('new', this);\n\n scope.interactions.push(this);\n }\n\n pointerDown (pointer, event, eventTarget) {\n const pointerIndex = this.updatePointer(pointer, event, true);\n\n signals.fire('down', {\n pointer,\n event,\n eventTarget,\n pointerIndex,\n interaction: this,\n });\n }\n\n /*\\\n * Interaction.start\n [ method ]\n *\n * Start an action with the given Interactable and Element as tartgets. The\n * action must be enabled for the target Interactable and an appropriate number\n * of pointers must be held down - 1 for drag/resize, 2 for gesture.\n *\n * Use it with `interactable.able({ manualStart: false })` to always\n * [start actions manually](https://github.com/taye/interact.js/issues/114)\n *\n - action (object) The action to be performed - drag, resize, etc.\n - target (Interactable) The Interactable to target\n - element (Element) The DOM Element to target\n = (object) interact\n **\n | interact(target)\n | .draggable({\n | // disable the default drag start by down->move\n | manualStart: true\n | })\n | // start dragging after the user holds the pointer down\n | .on('hold', function (event) {\n | var interaction = event.interaction;\n |\n | if (!interaction.interacting()) {\n | interaction.start({ name: 'drag' },\n | event.interactable,\n | event.currentTarget);\n | }\n | });\n \\*/\n start (action, target, element) {\n if (this.interacting()\n || !this.pointerIsDown\n || this.pointerIds.length < (action.name === 'gesture'? 2 : 1)) {\n return;\n }\n\n // if this interaction had been removed after stopping\n // add it back\n if (utils.indexOf(scope.interactions, this) === -1) {\n scope.interactions.push(this);\n }\n\n utils.copyAction(this.prepared, action);\n this.target = target;\n this.element = element;\n\n signals.fire('action-start', {\n interaction: this,\n event: this.downEvent,\n });\n }\n\n pointerMove (pointer, event, eventTarget) {\n if (!this.simulation) {\n this.updatePointer(pointer);\n utils.setCoords(this.curCoords, this.pointers);\n }\n\n const duplicateMove = (this.curCoords.page.x === this.prevCoords.page.x\n && this.curCoords.page.y === this.prevCoords.page.y\n && this.curCoords.client.x === this.prevCoords.client.x\n && this.curCoords.client.y === this.prevCoords.client.y);\n\n let dx;\n let dy;\n\n // register movement greater than pointerMoveTolerance\n if (this.pointerIsDown && !this.pointerWasMoved) {\n dx = this.curCoords.client.x - this.startCoords.client.x;\n dy = this.curCoords.client.y - this.startCoords.client.y;\n\n this.pointerWasMoved = utils.hypot(dx, dy) > Interaction.pointerMoveTolerance;\n }\n\n const signalArg = {\n pointer,\n pointerIndex: this.getPointerIndex(pointer),\n event,\n eventTarget,\n dx,\n dy,\n duplicate: duplicateMove,\n interaction: this,\n interactingBeforeMove: this.interacting(),\n };\n\n if (!duplicateMove) {\n // set pointer coordinate, time changes and speeds\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n }\n\n signals.fire('move', signalArg);\n\n if (!duplicateMove) {\n // if interacting, fire an 'action-move' signal etc\n if (this.interacting()) {\n this.doMove(signalArg);\n }\n\n if (this.pointerWasMoved) {\n utils.copyCoords(this.prevCoords, this.curCoords);\n }\n }\n }\n\n /*\\\n * Interaction.doMove\n [ method ]\n *\n * Force a move of the current action at the same coordinates. Useful if\n * snap/restrict has been changed and you want a movement with the new\n * settings.\n *\n **\n | interact(target)\n | .draggable(true)\n | .on('dragmove', function (event) {\n | if (someCondition) {\n | // change the snap settings\n | event.interactable.draggable({ snap: { targets: [] }});\n | // fire another move event with re-calculated snap\n | event.interaction.doMove();\n | }\n | });\n \\*/\n doMove (signalArg) {\n signalArg = utils.extend({\n pointer: this.pointers[0],\n event: this.prevEvent,\n eventTarget: this._eventTarget,\n interaction: this,\n }, signalArg || {});\n\n signals.fire('before-action-move', signalArg);\n\n if (!this._dontFireMove) {\n signals.fire('action-move', signalArg);\n }\n\n this._dontFireMove = false;\n }\n\n // End interact move events and stop auto-scroll unless simulation is running\n pointerUp (pointer, event, eventTarget, curEventTarget) {\n const pointerIndex = this.getPointerIndex(pointer);\n\n signals.fire(/cancel$/i.test(event.type)? 'cancel' : 'up', {\n pointer,\n pointerIndex,\n event,\n eventTarget,\n curEventTarget,\n interaction: this,\n });\n\n if (!this.simulation) {\n this.end(event);\n }\n\n this.pointerIsDown = false;\n this.removePointer(pointer, event);\n }\n\n /*\\\n * Interaction.end\n [ method ]\n *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n - event (PointerEvent) #optional\n **\n | interact(target)\n | .draggable(true)\n | .on('move', function (event) {\n | if (event.pageX > 1000) {\n | // end the current action\n | event.interaction.end();\n | // stop all further listeners from being called\n | event.stopImmediatePropagation();\n | }\n | });\n \\*/\n end (event) {\n event = event || this.prevEvent;\n\n if (this.interacting()) {\n signals.fire('action-end', {\n event,\n interaction: this,\n });\n }\n\n this.stop();\n }\n\n currentAction () {\n return this._interacting? this.prepared.name: null;\n }\n\n interacting () {\n return this._interacting;\n }\n\n stop () {\n signals.fire('stop', { interaction: this });\n\n if (this._interacting) {\n signals.fire('stop-active', { interaction: this });\n signals.fire('stop-' + this.prepared.name, { interaction: this });\n }\n\n this.target = this.element = null;\n\n this._interacting = false;\n this.prepared.name = this.prevEvent = null;\n }\n\n getPointerIndex (pointer) {\n return utils.indexOf(this.pointerIds, utils.getPointerId(pointer));\n }\n\n updatePointer (pointer, event, down = event && /(down|start)$/i.test(event.type)) {\n const id = utils.getPointerId(pointer);\n let index = this.getPointerIndex(pointer);\n\n if (index === -1) {\n index = this.pointerIds.length;\n this.pointerIds[index] = id;\n }\n\n if (down) {\n signals.fire('update-pointer-down', {\n pointer,\n event,\n down,\n pointerId: id,\n pointerIndex: index,\n interaction: this,\n });\n }\n\n this.pointers[index] = pointer;\n\n return index;\n }\n\n removePointer (pointer, event) {\n const id = utils.getPointerId(pointer);\n const index = this.mouse? 0 : utils.indexOf(this.pointerIds, id);\n\n if (index === -1) { return; }\n\n signals.fire('remove-pointer', {\n pointer,\n event,\n pointerIndex: index,\n interaction: this,\n });\n\n this.pointers .splice(index, 1);\n this.pointerIds .splice(index, 1);\n this.downTargets.splice(index, 1);\n this.downTimes .splice(index, 1);\n }\n\n _updateEventTargets (target, currentTarget) {\n this._eventTarget = target;\n this._curEventTarget = currentTarget;\n }\n}\n\nfor (let i = 0, len = methodNames.length; i < len; i++) {\n const method = methodNames[i];\n\n listeners[method] = doOnInteractions(method);\n}\n\nfunction doOnInteractions (method) {\n return (function (event) {\n const [eventTarget, curEventTarget] = utils.getEventTargets(event);\n const matches = []; // [ [pointer, interaction], ...]\n\n if (browser.supportsTouch && /touch/.test(event.type)) {\n prevTouchTime = new Date().getTime();\n\n for (let i = 0; i < event.changedTouches.length; i++) {\n const pointer = event.changedTouches[i];\n const interaction = finder.search(pointer, event.type, eventTarget);\n\n matches.push([pointer, interaction || new Interaction()]);\n }\n }\n else {\n let invalidPointer = false;\n\n if (!browser.supportsPointerEvent && /mouse/.test(event.type)) {\n // ignore mouse events while touch interactions are active\n for (let i = 0; i < scope.interactions.length && !invalidPointer; i++) {\n invalidPointer = !scope.interactions[i].mouse && scope.interactions[i].pointerIsDown;\n }\n\n // try to ignore mouse events that are simulated by the browser\n // after a touch event\n invalidPointer = invalidPointer\n || (new Date().getTime() - prevTouchTime < 500)\n // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated\n || event.timeStamp === 0;\n }\n\n if (!invalidPointer) {\n let interaction = finder.search(event, event.type, eventTarget);\n\n if (!interaction) {\n\n interaction = new Interaction();\n interaction.mouse = (/mouse/i.test(event.pointerType || event.type)\n // MSPointerEvent.MSPOINTER_TYPE_MOUSE\n || event.pointerType === 4\n || !event.pointerType);\n }\n\n matches.push([event, interaction]);\n }\n }\n\n for (const [pointer, interaction] of matches) {\n interaction._updateEventTargets(eventTarget, curEventTarget);\n interaction[method](pointer, event, eventTarget, curEventTarget);\n }\n });\n}\n\nfunction endAll (event) {\n for (let i = 0; i < scope.interactions.length; i++) {\n const interaction = scope.interactions[i];\n\n interaction.end(event);\n signals.fire('endall', { event, interaction });\n }\n}\n\nconst docEvents = { /* 'eventType': listenerFunc */ };\nconst pEventTypes = browser.pEventTypes;\n\nif (scope.PointerEvent) {\n docEvents[pEventTypes.down ] = listeners.pointerDown;\n docEvents[pEventTypes.move ] = listeners.pointerMove;\n docEvents[pEventTypes.up ] = listeners.pointerUp;\n docEvents[pEventTypes.cancel] = listeners.pointerUp;\n}\nelse {\n docEvents.mousedown = listeners.pointerDown;\n docEvents.mousemove = listeners.pointerMove;\n docEvents.mouseup = listeners.pointerUp;\n\n docEvents.touchstart = listeners.pointerDown;\n docEvents.touchmove = listeners.pointerMove;\n docEvents.touchend = listeners.pointerUp;\n docEvents.touchcancel = listeners.pointerUp;\n}\n\ndocEvents.blur = endAll;\n\nfunction onDocSignal ({ doc }, signalName) {\n const eventMethod = signalName.indexOf('add') === 0\n ? events.add : events.remove;\n\n // delegate event listener\n for (const eventType in scope.delegatedEvents) {\n eventMethod(doc, eventType, events.delegateListener);\n eventMethod(doc, eventType, events.delegateUseCapture, true);\n }\n\n for (const eventType in docEvents) {\n eventMethod(doc, eventType, docEvents[eventType]);\n }\n}\n\nsignals.on('update-pointer-down', ({ interaction, pointer, pointerId, pointerIndex, event, eventTarget, down }) => {\n interaction.pointerIds[pointerIndex] = pointerId;\n interaction.pointers[pointerIndex] = pointer;\n\n if (down) {\n interaction.pointerIsDown = true;\n }\n\n if (!interaction.interacting()) {\n utils.setCoords(interaction.startCoords, interaction.pointers);\n\n utils.copyCoords(interaction.curCoords , interaction.startCoords);\n utils.copyCoords(interaction.prevCoords, interaction.startCoords);\n\n interaction.downEvent = event;\n interaction.downTimes[pointerIndex] = interaction.curCoords.timeStamp;\n interaction.downTargets[pointerIndex] = eventTarget || event && utils.getEventTargets(event)[0];\n interaction.pointerWasMoved = false;\n\n utils.pointerExtend(interaction.downPointer, pointer);\n }\n});\n\nscope.signals.on('add-document' , onDocSignal);\nscope.signals.on('remove-document', onDocSignal);\n\nInteraction.pointerMoveTolerance = 1;\nInteraction.doOnInteractions = doOnInteractions;\nInteraction.endAll = endAll;\nInteraction.signals = signals;\nInteraction.docEvents = docEvents;\n\nscope.endAllInteractions = endAll;\n\nmodule.exports = Interaction;\n","const Interaction = require('../Interaction');\nconst InteractEvent = require('../InteractEvent');\n\nconst actions = {\n firePrepared,\n names: [],\n methodDict: {},\n};\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n interaction._interacting = true;\n firePrepared(interaction, event, 'start');\n});\n\nInteraction.signals.on('action-move', function ({ interaction, event, preEnd }) {\n firePrepared(interaction, event, 'move', preEnd);\n\n // if the action was ended in a listener\n if (!interaction.interacting()) { return false; }\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n firePrepared(interaction, event, 'end');\n});\n\nfunction firePrepared (interaction, event, phase, preEnd) {\n const actionName = interaction.prepared.name;\n\n const newEvent = new InteractEvent(interaction, event, actionName, phase, interaction.element, null, preEnd);\n\n interaction.target.fire(newEvent);\n interaction.prevEvent = newEvent;\n}\n\nmodule.exports = actions;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drag = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n startAxis : 'xy',\n lockAxis : 'xy',\n },\n\n checker: function (pointer, event, interactable) {\n const dragOptions = interactable.options.drag;\n\n return dragOptions.enabled\n ? { name: 'drag', axis: (dragOptions.lockAxis === 'start'\n ? dragOptions.startAxis\n : dragOptions.lockAxis)}\n : null;\n },\n\n getCursor: function () {\n return 'move';\n },\n};\n\nInteraction.signals.on('before-action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n interaction.curCoords.page.y = interaction.startCoords.page.y;\n interaction.curCoords.client.y = interaction.startCoords.client.y;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vx);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vx);\n interaction.pointerDelta.client.vy = 0;\n interaction.pointerDelta.page.vy = 0;\n }\n else if (axis === 'y') {\n interaction.curCoords.page.x = interaction.startCoords.page.x;\n interaction.curCoords.client.x = interaction.startCoords.client.x;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vy);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vy);\n interaction.pointerDelta.client.vx = 0;\n interaction.pointerDelta.page.vx = 0;\n }\n});\n\n// dragmove\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'dragmove') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n iEvent.pageY = interaction.startCoords.page.y;\n iEvent.clientY = interaction.startCoords.client.y;\n iEvent.dy = 0;\n }\n else if (axis === 'y') {\n iEvent.pageX = interaction.startCoords.page.x;\n iEvent.clientX = interaction.startCoords.client.x;\n iEvent.dx = 0;\n }\n});\n\n/*\\\n * Interactable.draggable\n [ method ]\n *\n * Gets or sets whether drag actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of drag events\n | var isDraggable = interact('ul li').draggable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on drag events (object makes the Interactable draggable)\n = (object) This Interactable\n | interact(element).draggable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // the axis in which the first movement must be\n | // for the drag sequence to start\n | // 'xy' by default - any direction\n | startAxis: 'x' || 'y' || 'xy',\n |\n | // 'xy' by default - don't restrict to one axis (move in any direction)\n | // 'x' or 'y' to restrict movement to either axis\n | // 'start' to restrict movement to the axis the drag started in\n | lockAxis: 'x' || 'y' || 'xy' || 'start',\n |\n | // max number of drags that can happen concurrently\n | // with elements of this Interactable. Infinity by default\n | max: Infinity,\n |\n | // max number of drags that can target the same element+Interactable\n | // 1 by default\n | maxPerElement: 2\n | });\n\\*/\nInteractable.prototype.draggable = function (options) {\n if (utils.is.object(options)) {\n this.options.drag.enabled = options.enabled === false? false: true;\n this.setPerAction('drag', options);\n this.setOnEvents('drag', options);\n\n if (/^(xy|x|y|start)$/.test(options.lockAxis)) {\n this.options.drag.lockAxis = options.lockAxis;\n }\n if (/^(xy|x|y)$/.test(options.startAxis)) {\n this.options.drag.startAxis = options.startAxis;\n }\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drag.enabled = options;\n\n if (!options) {\n this.ondragstart = this.ondragstart = this.ondragend = null;\n }\n\n return this;\n }\n\n return this.options.drag;\n};\n\nactions.drag = drag;\nactions.names.push('drag');\nutils.merge(Interactable.eventTypes, [\n 'dragstart',\n 'dragmove',\n 'draginertiastart',\n 'draginertiaresume',\n 'dragend',\n]);\nactions.methodDict.drag = 'draggable';\n\ndefaultOptions.drag = drag.defaults;\n\nmodule.exports = drag;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst scope = require('../scope');\nconst interact = require('../interact');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drop = {\n defaults: {\n enabled: false,\n accept : null,\n overlap: 'pointer',\n },\n};\n\nlet dynamicDrop = false;\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // reset active dropzones\n interaction.activeDrops.dropzones = [];\n interaction.activeDrops.elements = [];\n interaction.activeDrops.rects = [];\n\n interaction.dropEvents = null;\n\n if (!interaction.dynamicDrop) {\n setActiveDrops(interaction, interaction.element);\n }\n\n const dragEvent = interaction.prevEvent;\n const dropEvents = getDropEvents(interaction, event, dragEvent);\n\n if (dropEvents.activate) {\n fireActiveDrops(interaction, dropEvents.activate);\n }\n});\n\nInteractEvent.signals.on('new', function ({ interaction, iEvent, event }) {\n if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { return; }\n\n const draggableElement = interaction.element;\n const dragEvent = iEvent;\n const dropResult = getDrop(dragEvent, event, draggableElement);\n\n interaction.dropTarget = dropResult.dropzone;\n interaction.dropElement = dropResult.element;\n\n interaction.dropEvents = getDropEvents(interaction, event, dragEvent);\n});\n\nInteraction.signals.on('action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n fireDropEvents(interaction, interaction.dropEvents);\n});\n\nInteraction.signals.on('action-end', function ({ interaction }) {\n if (interaction.prepared.name === 'drag') {\n fireDropEvents(interaction, interaction.dropEvents);\n }\n});\n\nInteraction.signals.on('stop-drag', function ({ interaction }) {\n interaction.activeDrops.dropzones =\n interaction.activeDrops.elements =\n interaction.activeDrops.rects =\n interaction.dropEvents = null;\n});\n\nfunction collectDrops (interaction, element) {\n const drops = [];\n const elements = [];\n\n element = element || interaction.element;\n\n // collect all dropzones and their elements which qualify for a drop\n for (const current of scope.interactables) {\n if (!current.options.drop.enabled) { continue; }\n\n const accept = current.options.drop.accept;\n\n // test the draggable element against the dropzone's accept setting\n if ((utils.is.element(accept) && accept !== element)\n || (utils.is.string(accept)\n && !utils.matchesSelector(element, accept))) {\n\n continue;\n }\n\n // query for new elements if necessary\n const dropElements = utils.is.string(current.target)\n ? current._context.querySelectorAll(current.target)\n : [current.target];\n\n for (let i = 0; i < dropElements.length; i++) {\n const currentElement = dropElements[i];\n\n if (currentElement !== element) {\n drops.push(current);\n elements.push(currentElement);\n }\n }\n }\n\n return {\n elements,\n dropzones: drops,\n };\n}\n\nfunction fireActiveDrops (interaction, event) {\n let prevElement;\n\n // loop through all active dropzones and trigger event\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n const current = interaction.activeDrops.dropzones[i];\n const currentElement = interaction.activeDrops.elements [i];\n\n // prevent trigger of duplicate events on same element\n if (currentElement !== prevElement) {\n // set current element as event target\n event.target = currentElement;\n current.fire(event);\n }\n prevElement = currentElement;\n }\n}\n\n// Collect a new set of possible drops and save them in activeDrops.\n// setActiveDrops should always be called when a drag has just started or a\n// drag event happens while dynamicDrop is true\nfunction setActiveDrops (interaction, dragElement) {\n // get dropzones and their elements that could receive the draggable\n const possibleDrops = collectDrops(interaction, dragElement, true);\n\n interaction.activeDrops.dropzones = possibleDrops.dropzones;\n interaction.activeDrops.elements = possibleDrops.elements;\n interaction.activeDrops.rects = [];\n\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n interaction.activeDrops.rects[i] =\n interaction.activeDrops.dropzones[i].getRect(interaction.activeDrops.elements[i]);\n }\n}\n\nfunction getDrop (dragEvent, event, dragElement) {\n const interaction = dragEvent.interaction;\n const validDrops = [];\n\n if (dynamicDrop) {\n setActiveDrops(interaction, dragElement);\n }\n\n // collect all dropzones and their elements which qualify for a drop\n for (let j = 0; j < interaction.activeDrops.dropzones.length; j++) {\n const current = interaction.activeDrops.dropzones[j];\n const currentElement = interaction.activeDrops.elements [j];\n const rect = interaction.activeDrops.rects [j];\n\n validDrops.push(current.dropCheck(dragEvent, event, interaction.target, dragElement, currentElement, rect)\n ? currentElement\n : null);\n }\n\n // get the most appropriate dropzone based on DOM depth and order\n const dropIndex = utils.indexOfDeepestElement(validDrops);\n\n return {\n dropzone: interaction.activeDrops.dropzones[dropIndex] || null,\n element : interaction.activeDrops.elements [dropIndex] || null,\n };\n}\n\nfunction getDropEvents (interaction, pointerEvent, dragEvent) {\n const dropEvents = {\n enter : null,\n leave : null,\n activate : null,\n deactivate: null,\n move : null,\n drop : null,\n };\n\n const tmpl = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n };\n\n if (interaction.dropElement !== interaction.prevDropElement) {\n // if there was a prevDropTarget, create a dragleave event\n if (interaction.prevDropTarget) {\n dropEvents.leave = utils.extend({ type: 'dragleave' }, tmpl);\n\n dragEvent.dragLeave = dropEvents.leave.target = interaction.prevDropElement;\n dragEvent.prevDropzone = dropEvents.leave.dropzone = interaction.prevDropTarget;\n }\n // if the dropTarget is not null, create a dragenter event\n if (interaction.dropTarget) {\n dropEvents.enter = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n type : 'dragenter',\n };\n\n dragEvent.dragEnter = interaction.dropElement;\n dragEvent.dropzone = interaction.dropTarget;\n }\n }\n\n if (dragEvent.type === 'dragend' && interaction.dropTarget) {\n dropEvents.drop = utils.extend({ type: 'drop' }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n dragEvent.relatedTarget = interaction.dropElement;\n }\n if (dragEvent.type === 'dragstart') {\n dropEvents.activate = utils.extend({ type: 'dropactivate' }, tmpl);\n\n dropEvents.activate.target = null;\n dropEvents.activate.dropzone = null;\n }\n if (dragEvent.type === 'dragend') {\n dropEvents.deactivate = utils.extend({ type: 'dropdeactivate' }, tmpl);\n\n dropEvents.deactivate.target = null;\n dropEvents.deactivate.dropzone = null;\n }\n if (dragEvent.type === 'dragmove' && interaction.dropTarget) {\n dropEvents.move = utils.extend({\n dragmove : dragEvent,\n type : 'dropmove',\n }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n }\n\n return dropEvents;\n}\n\nfunction fireDropEvents (interaction, dropEvents) {\n if (dropEvents.leave) { interaction.prevDropTarget.fire(dropEvents.leave); }\n if (dropEvents.move ) { interaction.dropTarget.fire(dropEvents.move ); }\n if (dropEvents.enter) { interaction.dropTarget.fire(dropEvents.enter); }\n if (dropEvents.drop ) { interaction.dropTarget.fire(dropEvents.drop ); }\n if (dropEvents.deactivate) {\n fireActiveDrops(interaction, dropEvents.deactivate);\n }\n\n interaction.prevDropTarget = interaction.dropTarget;\n interaction.prevDropElement = interaction.dropElement;\n}\n\n/*\\\n * Interactable.dropzone\n [ method ]\n *\n * Returns or sets whether elements can be dropped onto this\n * Interactable to trigger drop events\n *\n * Dropzones can receive the following events:\n * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends\n * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone\n * - `dragmove` when a draggable that has entered the dropzone is moved\n * - `drop` when a draggable is dropped into this dropzone\n *\n * Use the `accept` option to allow only elements that match the given CSS\n * selector or element. The value can be:\n *\n * - **an Element** - only that element can be dropped into this dropzone.\n * - **a string**, - the element being dragged must match it as a CSS selector.\n * - **`null`** - accept options is cleared - it accepts any element.\n *\n * Use the `overlap` option to set how drops are checked for. The allowed\n * values are:\n *\n * - `'pointer'`, the pointer must be over the dropzone (default)\n * - `'center'`, the draggable element's center must be over the dropzone\n * - a number from 0-1 which is the `(intersection area) / (draggable area)`.\n * e.g. `0.5` for drop to happen when half of the area of the draggable is\n * over the dropzone\n *\n * Use the `checker` option to specify a function to check if a dragged\n * element is over this Interactable.\n *\n | interact(target)\n | .dropChecker(function(dragEvent, // related dragmove or dragend event\n | event, // TouchEvent/PointerEvent/MouseEvent\n | dropped, // bool result of the default checker\n | dropzone, // dropzone Interactable\n | dropElement, // dropzone elemnt\n | draggable, // draggable Interactable\n | draggableElement) {// draggable element\n |\n | return dropped && event.target.hasAttribute('allow-drop');\n | }\n *\n *\n - options (boolean | object | null) #optional The new value to be set.\n | interact('.drop').dropzone({\n | accept: '.can-drop' || document.getElementById('single-drop'),\n | overlap: 'pointer' || 'center' || zeroToOne\n | }\n = (boolean | object) The current setting or this Interactable\n\\*/\nInteractable.prototype.dropzone = function (options) {\n if (utils.is.object(options)) {\n this.options.drop.enabled = options.enabled === false? false: true;\n\n if (utils.is.function(options.ondrop) ) { this.events.ondrop = options.ondrop ; }\n if (utils.is.function(options.ondropactivate) ) { this.events.ondropactivate = options.ondropactivate ; }\n if (utils.is.function(options.ondropdeactivate)) { this.events.ondropdeactivate = options.ondropdeactivate; }\n if (utils.is.function(options.ondragenter) ) { this.events.ondragenter = options.ondragenter ; }\n if (utils.is.function(options.ondragleave) ) { this.events.ondragleave = options.ondragleave ; }\n if (utils.is.function(options.ondropmove) ) { this.events.ondropmove = options.ondropmove ; }\n\n if (/^(pointer|center)$/.test(options.overlap)) {\n this.options.drop.overlap = options.overlap;\n }\n else if (utils.is.number(options.overlap)) {\n this.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0);\n }\n if ('accept' in options) {\n this.options.drop.accept = options.accept;\n }\n if ('checker' in options) {\n this.options.drop.checker = options.checker;\n }\n\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drop.enabled = options;\n\n if (!options) {\n this.ondragenter = this.ondragleave = this.ondrop\n = this.ondropactivate = this.ondropdeactivate = null;\n }\n\n return this;\n }\n\n return this.options.drop;\n};\n\nInteractable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) {\n let dropped = false;\n\n // if the dropzone has no rect (eg. display: none)\n // call the custom dropChecker or just return false\n if (!(rect = rect || this.getRect(dropElement))) {\n return (this.options.drop.checker\n ? this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement)\n : false);\n }\n\n const dropOverlap = this.options.drop.overlap;\n\n if (dropOverlap === 'pointer') {\n const origin = utils.getOriginXY(draggable, draggableElement, 'drag');\n const page = utils.getPageXY(dragEvent);\n\n page.x += origin.x;\n page.y += origin.y;\n\n const horizontal = (page.x > rect.left) && (page.x < rect.right);\n const vertical = (page.y > rect.top ) && (page.y < rect.bottom);\n\n dropped = horizontal && vertical;\n }\n\n const dragRect = draggable.getRect(draggableElement);\n\n if (dragRect && dropOverlap === 'center') {\n const cx = dragRect.left + dragRect.width / 2;\n const cy = dragRect.top + dragRect.height / 2;\n\n dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom;\n }\n\n if (dragRect && utils.is.number(dropOverlap)) {\n const overlapArea = (Math.max(0, Math.min(rect.right , dragRect.right ) - Math.max(rect.left, dragRect.left))\n * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top , dragRect.top )));\n\n const overlapRatio = overlapArea / (dragRect.width * dragRect.height);\n\n dropped = overlapRatio >= dropOverlap;\n }\n\n if (this.options.drop.checker) {\n dropped = this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement);\n }\n\n return dropped;\n};\n\nInteractable.signals.on('unset', function ({ interactable }) {\n interactable.dropzone(false);\n});\n\nInteractable.settingsMethods.push('dropChecker');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.dropTarget = null; // the dropzone a drag target might be dropped into\n interaction.dropElement = null; // the element at the time of checking\n interaction.prevDropTarget = null; // the dropzone that was recently dragged away from\n interaction.prevDropElement = null; // the element at the time of checking\n interaction.dropEvents = null; // the dropEvents related to the current drag event\n\n interaction.activeDrops = {\n dropzones: [], // the dropzones that are mentioned below\n elements : [], // elements of dropzones that accept the target draggable\n rects : [], // the rects of the elements mentioned above\n };\n\n});\n\nInteraction.signals.on('stop', function ({ interaction }) {\n interaction.dropTarget = interaction.dropElement =\n interaction.prevDropTarget = interaction.prevDropElement = null;\n});\n\n/*\\\n * interact.dynamicDrop\n [ method ]\n *\n * Returns or sets whether the dimensions of dropzone elements are\n * calculated on every dragmove or only on dragstart for the default\n * dropChecker\n *\n - newValue (boolean) #optional True to check on each move. False to check only before start\n = (boolean | interact) The current setting or interact\n\\*/\ninteract.dynamicDrop = function (newValue) {\n if (utils.is.bool(newValue)) {\n //if (dragging && dynamicDrop !== newValue && !newValue) {\n //calcRects(dropzones);\n //}\n\n dynamicDrop = newValue;\n\n return interact;\n }\n return dynamicDrop;\n};\n\nutils.merge(Interactable.eventTypes, [\n 'dragenter',\n 'dragleave',\n 'dropactivate',\n 'dropdeactivate',\n 'dropmove',\n 'drop',\n]);\nactions.methodDict.drop = 'dropzone';\n\ndefaultOptions.drop = drop.defaults;\n\nmodule.exports = drop;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst gesture = {\n defaults: {\n enabled : false,\n origin : null,\n restrict: null,\n },\n\n checker: function (pointer, event, interactable, element, interaction) {\n if (interaction.pointerIds.length >= 2) {\n return { name: 'gesture' };\n }\n\n return null;\n },\n\n getCursor: function () {\n return '';\n },\n};\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturestart') { return; }\n iEvent.ds = 0;\n\n interaction.gesture.startDistance = interaction.gesture.prevDistance = iEvent.distance;\n interaction.gesture.startAngle = interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.scale = 1;\n});\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturemove') { return; }\n\n iEvent.ds = iEvent.scale - interaction.gesture.scale;\n\n interaction.target.fire(iEvent);\n\n interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.prevDistance = iEvent.distance;\n\n if (iEvent.scale !== Infinity\n && iEvent.scale !== null\n && iEvent.scale !== undefined\n && !isNaN(iEvent.scale)) {\n\n interaction.gesture.scale = iEvent.scale;\n }\n});\n\n/*\\\n * Interactable.gesturable\n [ method ]\n *\n * Gets or sets whether multitouch gestures can be performed on the\n * Interactable's element\n *\n = (boolean) Indicates if this can be the target of gesture events\n | var isGestureable = interact(element).gesturable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on gesture events (makes the Interactable gesturable)\n = (object) this Interactable\n | interact(element).gesturable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // limit multiple gestures.\n | // See the explanation in @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n\\*/\nInteractable.prototype.gesturable = function (options) {\n if (utils.is.object(options)) {\n this.options.gesture.enabled = options.enabled === false? false: true;\n this.setPerAction('gesture', options);\n this.setOnEvents('gesture', options);\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.gesture.enabled = options;\n\n if (!options) {\n this.ongesturestart = this.ongesturestart = this.ongestureend = null;\n }\n\n return this;\n }\n\n return this.options.gesture;\n};\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action, event, starting, ending, deltaSource }) {\n if (action !== 'gesture') { return; }\n\n const pointers = interaction.pointers;\n\n iEvent.touches = [pointers[0], pointers[1]];\n\n if (starting) {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = 1;\n iEvent.ds = 0;\n iEvent.angle = utils.touchAngle(pointers, undefined, deltaSource);\n iEvent.da = 0;\n }\n else if (ending || event instanceof InteractEvent) {\n iEvent.distance = interaction.prevEvent.distance;\n iEvent.box = interaction.prevEvent.box;\n iEvent.scale = interaction.prevEvent.scale;\n iEvent.ds = iEvent.scale - 1;\n iEvent.angle = interaction.prevEvent.angle;\n iEvent.da = iEvent.angle - interaction.gesture.startAngle;\n }\n else {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = iEvent.distance / interaction.gesture.startDistance;\n iEvent.angle = utils.touchAngle(pointers, interaction.gesture.prevAngle, deltaSource);\n\n iEvent.ds = iEvent.scale - interaction.gesture.prevScale;\n iEvent.da = iEvent.angle - interaction.gesture.prevAngle;\n }\n});\n\nInteraction.signals.on('new', function (interaction) {\n interaction.gesture = {\n start: { x: 0, y: 0 },\n\n startDistance: 0, // distance between two touches of touchStart\n prevDistance : 0,\n distance : 0,\n\n scale: 1, // gesture.distance / gesture.startDistance\n\n startAngle: 0, // angle of line joining two touches\n prevAngle : 0, // angle of the previous gesture event\n };\n});\n\nactions.gesture = gesture;\nactions.names.push('gesture');\nutils.merge(Interactable.eventTypes, [\n 'gesturestart',\n 'gesturemove',\n 'gestureend',\n]);\nactions.methodDict.gesture = 'gesturable';\n\ndefaultOptions.gesture = gesture.defaults;\n\nmodule.exports = gesture;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\n// Less Precision with touch input\nconst defaultMargin = browser.supportsTouch || browser.supportsPointerEvent? 20: 10;\n\nconst resize = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n square: false,\n preserveAspectRatio: false,\n axis: 'xy',\n\n // use default margin\n margin: NaN,\n\n // object with props left, right, top, bottom which are\n // true/false values to resize when the pointer is over that edge,\n // CSS selectors to match the handles for each direction\n // or the Elements for each handle\n edges: null,\n\n // a value of 'none' will limit the resize rect to a minimum of 0x0\n // 'negate' will alow the rect to have negative width/height\n // 'reposition' will keep the width/height positive by swapping\n // the top and bottom edges and/or swapping the left and right edges\n invert: 'none',\n },\n\n checker: function (pointer, event, interactable, element, interaction, rect) {\n if (!rect) { return null; }\n\n const page = utils.extend({}, interaction.curCoords.page);\n const options = interactable.options;\n\n if (options.resize.enabled) {\n const resizeOptions = options.resize;\n const resizeEdges = { left: false, right: false, top: false, bottom: false };\n\n // if using resize.edges\n if (utils.is.object(resizeOptions.edges)) {\n for (const edge in resizeEdges) {\n resizeEdges[edge] = checkResizeEdge(edge,\n resizeOptions.edges[edge],\n page,\n interaction._eventTarget,\n element,\n rect,\n resizeOptions.margin || defaultMargin);\n }\n\n resizeEdges.left = resizeEdges.left && !resizeEdges.right;\n resizeEdges.top = resizeEdges.top && !resizeEdges.bottom;\n\n if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) {\n return {\n name: 'resize',\n edges: resizeEdges,\n };\n }\n }\n else {\n const right = options.resize.axis !== 'y' && page.x > (rect.right - defaultMargin);\n const bottom = options.resize.axis !== 'x' && page.y > (rect.bottom - defaultMargin);\n\n if (right || bottom) {\n return {\n name: 'resize',\n axes: (right? 'x' : '') + (bottom? 'y' : ''),\n };\n }\n }\n }\n\n return null;\n },\n\n cursors: (browser.isIe9OrOlder ? {\n x : 'e-resize',\n y : 's-resize',\n xy: 'se-resize',\n\n top : 'n-resize',\n left : 'w-resize',\n bottom : 's-resize',\n right : 'e-resize',\n topleft : 'se-resize',\n bottomright: 'se-resize',\n topright : 'ne-resize',\n bottomleft : 'ne-resize',\n } : {\n x : 'ew-resize',\n y : 'ns-resize',\n xy: 'nwse-resize',\n\n top : 'ns-resize',\n left : 'ew-resize',\n bottom : 'ns-resize',\n right : 'ew-resize',\n topleft : 'nwse-resize',\n bottomright: 'nwse-resize',\n topright : 'nesw-resize',\n bottomleft : 'nesw-resize',\n }),\n\n getCursor: function (action) {\n if (action.axis) {\n return resize.cursors[action.name + action.axis];\n }\n else if (action.edges) {\n let cursorKey = '';\n const edgeNames = ['top', 'bottom', 'left', 'right'];\n\n for (let i = 0; i < 4; i++) {\n if (action.edges[edgeNames[i]]) {\n cursorKey += edgeNames[i];\n }\n }\n\n return resize.cursors[cursorKey];\n }\n },\n};\n\n// resizestart\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'resizestart' || !interaction.prepared.edges) {\n return;\n }\n\n const startRect = interaction.target.getRect(interaction.element);\n const resizeOptions = interaction.target.options.resize;\n\n /*\n * When using the `resizable.square` or `resizable.preserveAspectRatio` options, resizing from one edge\n * will affect another. E.g. with `resizable.square`, resizing to make the right edge larger will make\n * the bottom edge larger by the same amount. We call these 'linked' edges. Any linked edges will depend\n * on the active edges and the edge being interacted with.\n */\n if (resizeOptions.square || resizeOptions.preserveAspectRatio) {\n const linkedEdges = utils.extend({}, interaction.prepared.edges);\n\n linkedEdges.top = linkedEdges.top || (linkedEdges.left && !linkedEdges.bottom);\n linkedEdges.left = linkedEdges.left || (linkedEdges.top && !linkedEdges.right );\n linkedEdges.bottom = linkedEdges.bottom || (linkedEdges.right && !linkedEdges.top );\n linkedEdges.right = linkedEdges.right || (linkedEdges.bottom && !linkedEdges.left );\n\n interaction.prepared._linkedEdges = linkedEdges;\n }\n else {\n interaction.prepared._linkedEdges = null;\n }\n\n // if using `resizable.preserveAspectRatio` option, record aspect ratio at the start of the resize\n if (resizeOptions.preserveAspectRatio) {\n interaction.resizeStartAspectRatio = startRect.width / startRect.height;\n }\n\n interaction.resizeRects = {\n start : startRect,\n current : utils.extend({}, startRect),\n inverted : utils.extend({}, startRect),\n previous : utils.extend({}, startRect),\n delta : {\n left: 0, right : 0, width : 0,\n top : 0, bottom: 0, height: 0,\n },\n };\n\n iEvent.rect = interaction.resizeRects.inverted;\n iEvent.deltaRect = interaction.resizeRects.delta;\n});\n\n// resizemove\nInteractEvent.signals.on('new', function ({ iEvent, phase, interaction }) {\n if (phase !== 'move' || !interaction.prepared.edges) { return; }\n\n const resizeOptions = interaction.target.options.resize;\n const invert = resizeOptions.invert;\n const invertible = invert === 'reposition' || invert === 'negate';\n\n let edges = interaction.prepared.edges;\n\n const start = interaction.resizeRects.start;\n const current = interaction.resizeRects.current;\n const inverted = interaction.resizeRects.inverted;\n const delta = interaction.resizeRects.delta;\n const previous = utils.extend(interaction.resizeRects.previous, inverted);\n const originalEdges = edges;\n\n let dx = iEvent.dx;\n let dy = iEvent.dy;\n\n if (resizeOptions.preserveAspectRatio || resizeOptions.square) {\n // `resize.preserveAspectRatio` takes precedence over `resize.square`\n const startAspectRatio = resizeOptions.preserveAspectRatio\n ? interaction.resizeStartAspectRatio\n : 1;\n\n edges = interaction.prepared._linkedEdges;\n\n if ((originalEdges.left && originalEdges.bottom)\n || (originalEdges.right && originalEdges.top)) {\n dy = -dx / startAspectRatio;\n }\n else if (originalEdges.left || originalEdges.right ) { dy = dx / startAspectRatio; }\n else if (originalEdges.top || originalEdges.bottom) { dx = dy * startAspectRatio; }\n }\n\n // update the 'current' rect without modifications\n if (edges.top ) { current.top += dy; }\n if (edges.bottom) { current.bottom += dy; }\n if (edges.left ) { current.left += dx; }\n if (edges.right ) { current.right += dx; }\n\n if (invertible) {\n // if invertible, copy the current rect\n utils.extend(inverted, current);\n\n if (invert === 'reposition') {\n // swap edge values if necessary to keep width/height positive\n let swap;\n\n if (inverted.top > inverted.bottom) {\n swap = inverted.top;\n\n inverted.top = inverted.bottom;\n inverted.bottom = swap;\n }\n if (inverted.left > inverted.right) {\n swap = inverted.left;\n\n inverted.left = inverted.right;\n inverted.right = swap;\n }\n }\n }\n else {\n // if not invertible, restrict to minimum of 0x0 rect\n inverted.top = Math.min(current.top, start.bottom);\n inverted.bottom = Math.max(current.bottom, start.top);\n inverted.left = Math.min(current.left, start.right);\n inverted.right = Math.max(current.right, start.left);\n }\n\n inverted.width = inverted.right - inverted.left;\n inverted.height = inverted.bottom - inverted.top ;\n\n for (const edge in inverted) {\n delta[edge] = inverted[edge] - previous[edge];\n }\n\n iEvent.edges = interaction.prepared.edges;\n iEvent.rect = inverted;\n iEvent.deltaRect = delta;\n});\n\n/*\\\n * Interactable.resizable\n [ method ]\n *\n * Gets or sets whether resize actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of resize elements\n | var isResizeable = interact('input[type=text]').resizable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on resize events (object makes the Interactable resizable)\n = (object) This Interactable\n | interact(element).resizable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | edges: {\n | top : true, // Use pointer coords to check for resize.\n | left : false, // Disable resizing from left edge.\n | bottom: '.resize-s',// Resize if pointer target matches selector\n | right : handleEl // Resize if pointer target is the given Element\n | },\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height are adjusted at a 1:1 ratio.\n | square: false,\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height maintain the aspect ratio they had when resizing started.\n | preserveAspectRatio: false,\n |\n | // a value of 'none' will limit the resize rect to a minimum of 0x0\n | // 'negate' will allow the rect to have negative width/height\n | // 'reposition' will keep the width/height positive by swapping\n | // the top and bottom edges and/or swapping the left and right edges\n | invert: 'none' || 'negate' || 'reposition'\n |\n | // limit multiple resizes.\n | // See the explanation in the @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n \\*/\nInteractable.prototype.resizable = function (options) {\n if (utils.is.object(options)) {\n this.options.resize.enabled = options.enabled === false? false: true;\n this.setPerAction('resize', options);\n this.setOnEvents('resize', options);\n\n if (/^x$|^y$|^xy$/.test(options.axis)) {\n this.options.resize.axis = options.axis;\n }\n else if (options.axis === null) {\n this.options.resize.axis = defaultOptions.resize.axis;\n }\n\n if (utils.is.bool(options.preserveAspectRatio)) {\n this.options.resize.preserveAspectRatio = options.preserveAspectRatio;\n }\n else if (utils.is.bool(options.square)) {\n this.options.resize.square = options.square;\n }\n\n return this;\n }\n if (utils.is.bool(options)) {\n this.options.resize.enabled = options;\n\n if (!options) {\n this.onresizestart = this.onresizestart = this.onresizeend = null;\n }\n\n return this;\n }\n return this.options.resize;\n};\n\nfunction checkResizeEdge (name, value, page, element, interactableElement, rect, margin) {\n // false, '', undefined, null\n if (!value) { return false; }\n\n // true value, use pointer coords and element rect\n if (value === true) {\n // if dimensions are negative, \"switch\" edges\n const width = utils.is.number(rect.width )? rect.width : rect.right - rect.left;\n const height = utils.is.number(rect.height)? rect.height : rect.bottom - rect.top ;\n\n if (width < 0) {\n if (name === 'left' ) { name = 'right'; }\n else if (name === 'right') { name = 'left' ; }\n }\n if (height < 0) {\n if (name === 'top' ) { name = 'bottom'; }\n else if (name === 'bottom') { name = 'top' ; }\n }\n\n if (name === 'left' ) { return page.x < ((width >= 0? rect.left: rect.right ) + margin); }\n if (name === 'top' ) { return page.y < ((height >= 0? rect.top : rect.bottom) + margin); }\n\n if (name === 'right' ) { return page.x > ((width >= 0? rect.right : rect.left) - margin); }\n if (name === 'bottom') { return page.y > ((height >= 0? rect.bottom: rect.top ) - margin); }\n }\n\n // the remaining checks require an element\n if (!utils.is.element(element)) { return false; }\n\n return utils.is.element(value)\n // the value is an element to use as a resize handle\n ? value === element\n // otherwise check if element matches value as selector\n : utils.matchesUpTo(element, value, interactableElement);\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.resizeAxes = 'xy';\n});\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action }) {\n if (action !== 'resize' || !interaction.resizeAxes) { return; }\n\n const options = interaction.target.options;\n\n if (options.resize.square) {\n if (interaction.resizeAxes === 'y') {\n iEvent.dx = iEvent.dy;\n }\n else {\n iEvent.dy = iEvent.dx;\n }\n iEvent.axes = 'xy';\n }\n else {\n iEvent.axes = interaction.resizeAxes;\n\n if (interaction.resizeAxes === 'x') {\n iEvent.dy = 0;\n }\n else if (interaction.resizeAxes === 'y') {\n iEvent.dx = 0;\n }\n }\n});\n\nactions.resize = resize;\nactions.names.push('resize');\nutils.merge(Interactable.eventTypes, [\n 'resizestart',\n 'resizemove',\n 'resizeinertiastart',\n 'resizeinertiaresume',\n 'resizeend',\n]);\nactions.methodDict.resize = 'resizable';\n\ndefaultOptions.resize = resize.defaults;\n\nmodule.exports = resize;\n","const raf = require('./utils/raf');\nconst getWindow = require('./utils/window').getWindow;\nconst is = require('./utils/is');\nconst domUtils = require('./utils/domUtils');\nconst Interaction = require('./Interaction');\nconst defaultOptions = require('./defaultOptions');\n\nconst autoScroll = {\n defaults: {\n enabled : false,\n container: null, // the item that is scrolled (Window or HTMLElement)\n margin : 60,\n speed : 300, // the scroll speed in pixels per second\n },\n\n interaction: null,\n i: null, // the handle returned by window.setInterval\n x: 0, y: 0, // Direction each pulse is to scroll in\n\n isScrolling: false,\n prevTime: 0,\n\n start: function (interaction) {\n autoScroll.isScrolling = true;\n raf.cancel(autoScroll.i);\n\n autoScroll.interaction = interaction;\n autoScroll.prevTime = new Date().getTime();\n autoScroll.i = raf.request(autoScroll.scroll);\n },\n\n stop: function () {\n autoScroll.isScrolling = false;\n raf.cancel(autoScroll.i);\n },\n\n // scroll the window by the values in scroll.x/y\n scroll: function () {\n const options = autoScroll.interaction.target.options[autoScroll.interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(autoScroll.interaction.element);\n const now = new Date().getTime();\n // change in time in seconds\n const dt = (now - autoScroll.prevTime) / 1000;\n // displacement\n const s = options.speed * dt;\n\n if (s >= 1) {\n if (is.window(container)) {\n container.scrollBy(autoScroll.x * s, autoScroll.y * s);\n }\n else if (container) {\n container.scrollLeft += autoScroll.x * s;\n container.scrollTop += autoScroll.y * s;\n }\n\n autoScroll.prevTime = now;\n }\n\n if (autoScroll.isScrolling) {\n raf.cancel(autoScroll.i);\n autoScroll.i = raf.request(autoScroll.scroll);\n }\n },\n check: function (interactable, actionName) {\n const options = interactable.options;\n\n return options[actionName].autoScroll && options[actionName].autoScroll.enabled;\n },\n onInteractionMove: function ({ interaction, pointer }) {\n if (!(interaction.interacting()\n && autoScroll.check(interaction.target, interaction.prepared.name))) {\n return;\n }\n\n if (interaction.simulation) {\n autoScroll.x = autoScroll.y = 0;\n return;\n }\n\n let top;\n let right;\n let bottom;\n let left;\n\n const options = interaction.target.options[interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(interaction.element);\n\n if (is.window(container)) {\n left = pointer.clientX < autoScroll.margin;\n top = pointer.clientY < autoScroll.margin;\n right = pointer.clientX > container.innerWidth - autoScroll.margin;\n bottom = pointer.clientY > container.innerHeight - autoScroll.margin;\n }\n else {\n const rect = domUtils.getElementClientRect(container);\n\n left = pointer.clientX < rect.left + autoScroll.margin;\n top = pointer.clientY < rect.top + autoScroll.margin;\n right = pointer.clientX > rect.right - autoScroll.margin;\n bottom = pointer.clientY > rect.bottom - autoScroll.margin;\n }\n\n autoScroll.x = (right ? 1: left? -1: 0);\n autoScroll.y = (bottom? 1: top? -1: 0);\n\n if (!autoScroll.isScrolling) {\n // set the autoScroll properties to those of the target\n autoScroll.margin = options.margin;\n autoScroll.speed = options.speed;\n\n autoScroll.start(interaction);\n }\n },\n};\n\nInteraction.signals.on('stop-active', function () {\n autoScroll.stop();\n});\n\nInteraction.signals.on('action-move', autoScroll.onInteractionMove);\n\ndefaultOptions.perAction.autoScroll = autoScroll.defaults;\n\nmodule.exports = autoScroll;\n","const Interactable = require('../Interactable');\nconst actions = require('../actions/base');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.ignoreFrom\n [ method ]\n *\n * If the target of the `mousedown`, `pointerdown` or `touchstart`\n * event or any of it's parents match the given CSS selector or\n * Element, no drag/resize/gesture is started.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to not ignore any elements\n = (string | Element | object) The current ignoreFrom value or this Interactable\n **\n | interact(element, { ignoreFrom: document.getElementById('no-action') });\n | // or\n | interact(element).ignoreFrom('input, textarea, a');\n\\*/\nInteractable.prototype.ignoreFrom = function (newValue) {\n return this._backCompatOption('ignoreFrom', newValue);\n};\n\n/*\\\n * Interactable.allowFrom\n [ method ]\n *\n * A drag/resize/gesture is started only If the target of the\n * `mousedown`, `pointerdown` or `touchstart` event or any of it's\n * parents match the given CSS selector or Element.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to allow from any element\n = (string | Element | object) The current allowFrom value or this Interactable\n **\n | interact(element, { allowFrom: document.getElementById('drag-handle') });\n | // or\n | interact(element).allowFrom('.handle');\n\\*/\nInteractable.prototype.allowFrom = function (newValue) {\n return this._backCompatOption('allowFrom', newValue);\n};\n\nInteractable.prototype.testIgnore = function (ignoreFrom, interactableElement, element) {\n if (!ignoreFrom || !is.element(element)) { return false; }\n\n if (is.string(ignoreFrom)) {\n return domUtils.matchesUpTo(element, ignoreFrom, interactableElement);\n }\n else if (is.element(ignoreFrom)) {\n return domUtils.nodeContains(ignoreFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testAllow = function (allowFrom, interactableElement, element) {\n if (!allowFrom) { return true; }\n\n if (!is.element(element)) { return false; }\n\n if (is.string(allowFrom)) {\n return domUtils.matchesUpTo(element, allowFrom, interactableElement);\n }\n else if (is.element(allowFrom)) {\n return domUtils.nodeContains(allowFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testIgnoreAllow = function (options, interactableElement, eventTarget) {\n return (!this.testIgnore(options.ignoreFrom, interactableElement, eventTarget)\n && this.testAllow(options.allowFrom, interactableElement, eventTarget));\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (event.buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\n","const interact = require('../interact');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst actions = require('../actions/base');\nconst defaultOptions = require('../defaultOptions');\nconst browser = require('../utils/browser');\nconst scope = require('../scope');\nconst utils = require('../utils');\nconst signals = require('../utils/Signals').new();\n\nrequire('./InteractableMethods');\n\nconst autoStart = {\n signals,\n withinInteractionLimit,\n // Allow this many interactions to happen simultaneously\n maxInteractions: Infinity,\n defaults: {\n perAction: {\n manualStart: false,\n max: Infinity,\n maxPerElement: 1,\n allowFrom: null,\n ignoreFrom: null,\n },\n },\n setActionDefaults: function (action) {\n utils.extend(action.defaults, autoStart.defaults.perAction);\n },\n};\n\n// set cursor style on mousedown\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget }) {\n if (interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\n// set cursor style on mousemove\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget }) {\n if (!interaction.mouse\n || interaction.pointerIsDown\n || interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\nInteraction.signals.on('move', function (arg) {\n const { interaction, event } = arg;\n\n if (!interaction.pointerIsDown\n || interaction.interacting()\n || !interaction.pointerWasMoved\n || !interaction.prepared.name) {\n return;\n }\n\n signals.fire('before-start', arg);\n\n const target = interaction.target;\n\n if (interaction.prepared.name && target) {\n // check manualStart and interaction limit\n if (target.options[interaction.prepared.name].manualStart\n || !withinInteractionLimit(target, interaction.element, interaction.prepared)) {\n interaction.stop(event);\n }\n else {\n interaction.start(interaction.prepared, target, interaction.element);\n }\n }\n});\n\n// Check if the current target supports the action.\n// If so, return the validated action. Otherwise, return null\nfunction validateAction (action, interactable, element, eventTarget) {\n if (utils.is.object(action)\n && interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget)\n && interactable.options[action.name].enabled\n && withinInteractionLimit(interactable, element, action)) {\n return action;\n }\n\n return null;\n}\n\nfunction validateSelector (interaction, pointer, event, matches, matchElements, eventTarget) {\n for (let i = 0, len = matches.length; i < len; i++) {\n const match = matches[i];\n const matchElement = matchElements[i];\n const action = validateAction(match.getAction(pointer, event, interaction, matchElement),\n match,\n matchElement,\n eventTarget);\n\n if (action) {\n return {\n action,\n target: match,\n element: matchElement,\n };\n }\n }\n\n return {};\n}\n\nfunction getActionInfo (interaction, pointer, event, eventTarget) {\n let matches = [];\n let matchElements = [];\n\n let element = eventTarget;\n let action = null;\n\n function pushMatches (interactable, selector, context) {\n const elements = (browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined);\n\n if (utils.matchesSelector(element, selector, elements)) {\n\n matches.push(interactable);\n matchElements.push(element);\n }\n }\n\n while (utils.is.element(element)) {\n matches = [];\n matchElements = [];\n\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && (action = validateAction(elementInteractable.getAction(pointer, event, interaction, element, eventTarget),\n elementInteractable,\n element,\n eventTarget))\n && !elementInteractable.options[action.name].manualStart) {\n return {\n element,\n action,\n target: elementInteractable,\n };\n }\n else {\n scope.interactables.forEachSelector(pushMatches, element);\n\n const actionInfo = validateSelector(interaction, pointer, event, matches, matchElements, eventTarget);\n\n if (actionInfo.action\n && !actionInfo.target.options[actionInfo.action.name].manualStart) {\n return actionInfo;\n }\n }\n\n element = utils.parentNode(element);\n }\n\n return {};\n}\n\nfunction prepare (interaction, { action, target, element }) {\n action = action || {};\n\n if (interaction.target && interaction.target.options.styleCursor) {\n interaction.target._doc.documentElement.style.cursor = '';\n }\n\n interaction.target = target;\n interaction.element = element;\n utils.copyAction(interaction.prepared, action);\n\n if (target && target.options.styleCursor) {\n const cursor = action? actions[action.name].getCursor(action) : '';\n interaction.target._doc.documentElement.style.cursor = cursor;\n }\n\n signals.fire('prepared', { interaction: interaction });\n}\n\nInteraction.signals.on('stop', function ({ interaction }) {\n const target = interaction.target;\n\n if (target && target.options.styleCursor) {\n target._doc.documentElement.style.cursor = '';\n }\n});\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (utils.is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (utils.is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n const buttons = event.buttons || ({\n 0: 1,\n 1: 4,\n 3: 8,\n 4: 16,\n })[event.button];\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\nfunction withinInteractionLimit (interactable, element, action) {\n const options = interactable.options;\n const maxActions = options[action.name].max;\n const maxPerElement = options[action.name].maxPerElement;\n let activeInteractions = 0;\n let targetCount = 0;\n let targetElementCount = 0;\n\n // no actions if any of these values == 0\n if (!(maxActions && maxPerElement && autoStart.maxInteractions)) { return; }\n\n for (let i = 0, len = scope.interactions.length; i < len; i++) {\n const interaction = scope.interactions[i];\n const otherAction = interaction.prepared.name;\n\n if (!interaction.interacting()) { continue; }\n\n activeInteractions++;\n\n if (activeInteractions >= autoStart.maxInteractions) {\n return false;\n }\n\n if (interaction.target !== interactable) { continue; }\n\n targetCount += (otherAction === action.name)|0;\n\n if (targetCount >= maxActions) {\n return false;\n }\n\n if (interaction.element === element) {\n targetElementCount++;\n\n if (otherAction !== action.name || targetElementCount >= maxPerElement) {\n return false;\n }\n }\n }\n\n return autoStart.maxInteractions > 0;\n}\n\n/*\\\n * interact.maxInteractions\n [ method ]\n **\n * Returns or sets the maximum number of concurrent interactions allowed.\n * By default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables\n * and elements, you need to enable it in the draggable, resizable and\n * gesturable `'max'` and `'maxPerElement'` options.\n **\n - newValue (number) #optional Any number. newValue <= 0 means no interactions.\n\\*/\ninteract.maxInteractions = function (newValue) {\n if (utils.is.number(newValue)) {\n autoStart.maxInteractions = newValue;\n\n return this;\n }\n\n return autoStart.maxInteractions;\n};\n\nInteractable.settingsMethods.push('styleCursor');\nInteractable.settingsMethods.push('actionChecker');\nInteractable.settingsMethods.push('ignoreFrom');\nInteractable.settingsMethods.push('allowFrom');\n\ndefaultOptions.base.actionChecker = null;\ndefaultOptions.base.styleCursor = true;\n\nutils.extend(defaultOptions.perAction, autoStart.defaults.perAction);\n\nmodule.exports = autoStart;\n","const autoStart = require('./base');\nconst Interaction = require('../Interaction');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.delayTimer = null;\n});\n\nautoStart.signals.on('prepared', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.delayTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.target, interaction.element);\n }, delay);\n }\n});\n\nInteraction.signals.on('move', function ({ interaction, duplicate }) {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.delayTimer);\n }\n});\n\n// prevent regular down->move autoStart\nautoStart.signals.on('before-start', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.prepared.name = null;\n }\n});\n","const autoStart = require('./base');\nconst scope = require('../scope');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\n\nconst { matchesSelector, parentNode } = require('../utils/domUtils');\n\nautoStart.setActionDefaults(require('../actions/drag'));\n\nautoStart.signals.on('before-start', function ({ interaction, eventTarget, dx, dy }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // check if a drag is in the correct axis\n const absX = Math.abs(dx);\n const absY = Math.abs(dy);\n const options = interaction.target.options.drag;\n const startAxis = options.startAxis;\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy');\n\n interaction.prepared.axis = options.lockAxis === 'start'\n ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n : options.lockAxis;\n\n // if the movement isn't in the startAxis of the interactable\n if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) {\n // cancel the prepared action\n interaction.prepared.name = null;\n\n // then try to get a drag from another ineractable\n\n if (!interaction.prepared.name) {\n\n let element = eventTarget;\n\n const getDraggable = function (interactable, selector, context) {\n const elements = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n if (interactable === interaction.target) { return; }\n\n if (!options.manualStart\n && !interactable.testIgnoreAllow(options, element, eventTarget)\n && matchesSelector(element, selector, elements)) {\n\n const action = interactable.getAction(interaction.downPointer,\n interaction.downEvent,\n interaction,\n element);\n\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, interactable)\n && autoStart.validateAction(action, interactable, element, eventTarget)) {\n\n return interactable;\n }\n }\n };\n\n let action = null;\n\n // check all interactables\n while (is.element(element)) {\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && elementInteractable !== interaction.target\n && !elementInteractable.options.drag.manualStart) {\n\n action = elementInteractable.getAction(interaction.downPointer, interaction.downEvent, interaction, element);\n }\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, elementInteractable)) {\n\n interaction.prepared.name = 'drag';\n interaction.target = elementInteractable;\n interaction.element = element;\n break;\n }\n\n const selectorInteractable = scope.interactables.forEachSelector(getDraggable, element);\n\n if (selectorInteractable) {\n interaction.prepared.name = 'drag';\n interaction.target = selectorInteractable;\n interaction.element = element;\n break;\n }\n\n element = parentNode(element);\n }\n }\n }\n});\n\nfunction checkStartAxis (startAxis, interactable) {\n if (!interactable) { return false; }\n\n const thisAxis = interactable.options.drag.startAxis;\n\n return (startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis);\n}\n","require('./base').setActionDefaults(require('../actions/gesture'));\n","require('./base').setActionDefaults(require('../actions/resize'));\n","module.exports = {\n base: {\n accept : null,\n preventDefault: 'auto',\n deltaSource : 'page',\n },\n\n perAction: {\n origin: { x: 0, y: 0 },\n\n // only allow left button by default\n // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n mouseButtons: 1,\n\n inertia: {\n enabled : false,\n resistance : 10, // the lambda in exponential decay\n minSpeed : 100, // target speed must be above this for inertia to start\n endSpeed : 10, // the speed at which inertia is slow enough to stop\n allowResume : true, // allow resuming an action in inertia phase\n smoothEndDuration: 300, // animate to snap/restrict endOnly if there's no inertia\n },\n },\n};\n","/* browser entry point */\n\n// Legacy browser support\nrequire('./legacyBrowsers');\n\n// inertia\nrequire('./inertia');\n\n// modifiers\nrequire('./modifiers/snap');\nrequire('./modifiers/restrict');\n\n// pointerEvents\nrequire('./pointerEvents/base');\nrequire('./pointerEvents/holdRepeat');\nrequire('./pointerEvents/interactableTargets');\n\n// delay\nrequire('./autoStart/delay');\n\n// actions\nrequire('./actions/gesture');\nrequire('./actions/resize');\nrequire('./actions/drag');\nrequire('./actions/drop');\n\n// load these modifiers after resize is loaded\nrequire('./modifiers/snapSize');\nrequire('./modifiers/restrictEdges');\nrequire('./modifiers/restrictSize');\n\n// autoStart actions\nrequire('./autoStart/gesture');\nrequire('./autoStart/resize');\nrequire('./autoStart/drag');\n\n// Interactable preventDefault setting\nrequire('./interactablePreventDefault.js');\n\n// autoScroll\nrequire('./autoScroll');\n\n// export interact\nmodule.exports = require('./interact');\n","const InteractEvent = require('./InteractEvent');\nconst Interaction = require('./Interaction');\nconst modifiers = require('./modifiers');\nconst utils = require('./utils');\nconst animationFrame = require('./utils/raf');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.inertiaStatus = {\n active : false,\n smoothEnd : false,\n allowResume: false,\n\n startEvent: null,\n upCoords : {},\n\n xe: 0, ye: 0,\n sx: 0, sy: 0,\n\n t0: 0,\n vx0: 0, vys: 0,\n duration: 0,\n\n lambda_v0: 0,\n one_ve_v0: 0,\n i : null,\n };\n\n interaction.boundInertiaFrame = () => inertiaFrame .apply(interaction);\n interaction.boundSmoothEndFrame = () => smoothEndFrame.apply(interaction);\n});\n\nInteraction.signals.on('down', function ({ interaction, event, pointer, eventTarget }) {\n const status = interaction.inertiaStatus;\n\n // Check if the down event hits the current inertia target\n if (status.active) {\n let element = eventTarget;\n\n // climb up the DOM tree from the event target\n while (utils.is.element(element)) {\n\n // if interaction element is the current inertia target element\n if (element === interaction.element) {\n // stop inertia\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n\n // update pointers to the down event's coordinates\n interaction.updatePointer(pointer);\n utils.setCoords(interaction.curCoords, interaction.pointers);\n\n // fire appropriate signals\n const signalArg = { interaction };\n Interaction.signals.fire('before-action-move', signalArg);\n Interaction.signals.fire('action-resume' , signalArg);\n\n // fire a reume event\n const resumeEvent = new InteractEvent(interaction,\n event,\n interaction.prepared.name,\n 'inertiaresume',\n interaction.element);\n\n interaction.target.fire(resumeEvent);\n interaction.prevEvent = resumeEvent;\n modifiers.resetStatuses(interaction.modifierStatuses);\n\n utils.copyCoords(interaction.prevCoords, interaction.curCoords);\n break;\n }\n\n element = utils.parentNode(element);\n }\n }\n});\n\nInteraction.signals.on('up', function ({ interaction, event }) {\n const status = interaction.inertiaStatus;\n\n if (!interaction.interacting() || status.active) { return; }\n\n const target = interaction.target;\n const options = target && target.options;\n const inertiaOptions = options && interaction.prepared.name && options[interaction.prepared.name].inertia;\n\n const now = new Date().getTime();\n const statuses = {};\n const page = utils.extend({}, interaction.curCoords.page);\n const pointerSpeed = interaction.pointerDelta.client.speed;\n\n let smoothEnd = false;\n let modifierResult;\n\n // check if inertia should be started\n const inertiaPossible = (inertiaOptions && inertiaOptions.enabled\n && interaction.prepared.name !== 'gesture'\n && event !== status.startEvent);\n\n const inertia = (inertiaPossible\n && (now - interaction.curCoords.timeStamp) < 50\n && pointerSpeed > inertiaOptions.minSpeed\n && pointerSpeed > inertiaOptions.endSpeed);\n\n const modifierArg = {\n interaction,\n pageCoords: page,\n statuses,\n preEnd: true,\n requireEndOnly: true,\n };\n\n // smoothEnd\n if (inertiaPossible && !inertia) {\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n if (modifierResult.shouldMove && modifierResult.locked) {\n smoothEnd = true;\n }\n }\n\n if (!(inertia || smoothEnd)) { return; }\n\n utils.copyCoords(status.upCoords, interaction.curCoords);\n\n interaction.pointers[0] = status.startEvent =\n new InteractEvent(interaction, event, interaction.prepared.name, 'inertiastart', interaction.element);\n\n status.t0 = now;\n\n status.active = true;\n status.allowResume = inertiaOptions.allowResume;\n interaction.simulation = status;\n\n target.fire(status.startEvent);\n\n if (inertia) {\n status.vx0 = interaction.pointerDelta.client.vx;\n status.vy0 = interaction.pointerDelta.client.vy;\n status.v0 = pointerSpeed;\n\n calcInertia(interaction, status);\n\n utils.extend(page, interaction.curCoords.page);\n\n page.x += status.xe;\n page.y += status.ye;\n\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n status.modifiedXe += modifierResult.dx;\n status.modifiedYe += modifierResult.dy;\n\n status.i = animationFrame.request(interaction.boundInertiaFrame);\n }\n else {\n status.smoothEnd = true;\n status.xe = modifierResult.dx;\n status.ye = modifierResult.dy;\n\n status.sx = status.sy = 0;\n\n status.i = animationFrame.request(interaction.boundSmoothEndFrame);\n }\n});\n\nInteraction.signals.on('stop-active', function ({ interaction }) {\n const status = interaction.inertiaStatus;\n\n if (status.active) {\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n }\n});\n\nfunction calcInertia (interaction, status) {\n const inertiaOptions = interaction.target.options[interaction.prepared.name].inertia;\n const lambda = inertiaOptions.resistance;\n const inertiaDur = -Math.log(inertiaOptions.endSpeed / status.v0) / lambda;\n\n status.x0 = interaction.prevEvent.pageX;\n status.y0 = interaction.prevEvent.pageY;\n status.t0 = status.startEvent.timeStamp / 1000;\n status.sx = status.sy = 0;\n\n status.modifiedXe = status.xe = (status.vx0 - inertiaDur) / lambda;\n status.modifiedYe = status.ye = (status.vy0 - inertiaDur) / lambda;\n status.te = inertiaDur;\n\n status.lambda_v0 = lambda / status.v0;\n status.one_ve_v0 = 1 - inertiaOptions.endSpeed / status.v0;\n}\n\nfunction inertiaFrame () {\n updateInertiaCoords(this);\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n\n const status = this.inertiaStatus;\n const options = this.target.options[this.prepared.name].inertia;\n const lambda = options.resistance;\n const t = new Date().getTime() / 1000 - status.t0;\n\n if (t < status.te) {\n\n const progress = 1 - (Math.exp(-lambda * t) - status.lambda_v0) / status.one_ve_v0;\n\n if (status.modifiedXe === status.xe && status.modifiedYe === status.ye) {\n status.sx = status.xe * progress;\n status.sy = status.ye * progress;\n }\n else {\n const quadPoint = utils.getQuadraticCurvePoint(0, 0,\n status.xe,\n status.ye,\n status.modifiedXe,\n status.modifiedYe,\n progress);\n\n status.sx = quadPoint.x;\n status.sy = quadPoint.y;\n }\n\n this.doMove();\n\n status.i = animationFrame.request(this.boundInertiaFrame);\n }\n else {\n status.sx = status.modifiedXe;\n status.sy = status.modifiedYe;\n\n this.doMove();\n this.end(status.startEvent);\n status.active = false;\n this.simulation = null;\n }\n\n utils.copyCoords(this.prevCoords, this.curCoords);\n}\n\nfunction smoothEndFrame () {\n updateInertiaCoords(this);\n\n const status = this.inertiaStatus;\n const t = new Date().getTime() - status.t0;\n const duration = this.target.options[this.prepared.name].inertia.smoothEndDuration;\n\n if (t < duration) {\n status.sx = utils.easeOutQuad(t, 0, status.xe, duration);\n status.sy = utils.easeOutQuad(t, 0, status.ye, duration);\n\n this.pointerMove(status.startEvent, status.startEvent);\n\n status.i = animationFrame.request(this.boundSmoothEndFrame);\n }\n else {\n status.sx = status.xe;\n status.sy = status.ye;\n\n this.pointerMove(status.startEvent, status.startEvent);\n this.end(status.startEvent);\n\n status.smoothEnd =\n status.active = false;\n this.simulation = null;\n }\n}\n\nfunction updateInertiaCoords (interaction) {\n const status = interaction.inertiaStatus;\n\n // return if inertia isn't running\n if (!status.active) { return; }\n\n const pageUp = status.upCoords.page;\n const clientUp = status.upCoords.client;\n\n utils.setCoords(interaction.curCoords, [ {\n pageX : pageUp.x + status.sx,\n pageY : pageUp.y + status.sy,\n clientX: clientUp.x + status.sx,\n clientY: clientUp.y + status.sy,\n } ]);\n}\n","const browser = require('./utils/browser');\nconst events = require('./utils/events');\nconst utils = require('./utils');\nconst scope = require('./scope');\nconst Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\n\nconst globalEvents = {};\n\n/*\\\n * interact\n [ method ]\n *\n * The methods of this variable can be used to set elements as\n * interactables and also to change various default settings.\n *\n * Calling it as a function and passing an element or a valid CSS selector\n * string returns an Interactable object which has various methods to\n * configure it.\n *\n - element (Element | string) The HTML or SVG Element to interact with or CSS selector\n = (object) An @Interactable\n *\n > Usage\n | interact('#draggable').draggable(true);\n |\n | var rectables = interact('rect');\n | rectables\n | .gesturable(true)\n | .on('gesturemove', function (event) {\n | // ...\n | });\n\\*/\nfunction interact (element, options) {\n let interactable = scope.interactables.get(element, options);\n\n if (!interactable) {\n interactable = new Interactable(element, options);\n interactable.events.global = globalEvents;\n }\n\n return interactable;\n}\n\n/*\\\n * interact.isSet\n [ method ]\n *\n * Check if an element has been set\n - element (Element) The Element being searched for\n = (boolean) Indicates if the element or CSS selector was previously passed to interact\n\\*/\ninteract.isSet = function (element, options) {\n return scope.interactables.indexOfElement(element, options && options.context) !== -1;\n};\n\n/*\\\n * interact.on\n [ method ]\n *\n * Adds a global listener for an InteractEvent or adds a DOM event to\n * `document`\n *\n - type (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) interact\n\\*/\ninteract.on = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.on(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.on(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n // if it is an InteractEvent type, add listener to globalEvents\n if (utils.contains(Interactable.eventTypes, type)) {\n // if this type of event was never bound\n if (!globalEvents[type]) {\n globalEvents[type] = [listener];\n }\n else {\n globalEvents[type].push(listener);\n }\n }\n // If non InteractEvent type, addEventListener to document\n else {\n events.add(scope.document, type, listener, { options });\n }\n\n return interact;\n};\n\n/*\\\n * interact.off\n [ method ]\n *\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n - type (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) interact\n \\*/\ninteract.off = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.off(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.off(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n if (!utils.contains(Interactable.eventTypes, type)) {\n events.remove(scope.document, type, listener, options);\n }\n else {\n let index;\n\n if (type in globalEvents\n && (index = utils.indexOf(globalEvents[type], listener)) !== -1) {\n globalEvents[type].splice(index, 1);\n }\n }\n\n return interact;\n};\n\n/*\\\n * interact.debug\n [ method ]\n *\n * Returns an object which exposes internal data\n = (object) An object with properties that outline the current state and expose internal functions and variables\n\\*/\ninteract.debug = function () {\n return scope;\n};\n\n// expose the functions used to calculate multi-touch properties\ninteract.getPointerAverage = utils.pointerAverage;\ninteract.getTouchBBox = utils.touchBBox;\ninteract.getTouchDistance = utils.touchDistance;\ninteract.getTouchAngle = utils.touchAngle;\n\ninteract.getElementRect = utils.getElementRect;\ninteract.getElementClientRect = utils.getElementClientRect;\ninteract.matchesSelector = utils.matchesSelector;\ninteract.closest = utils.closest;\n\n/*\\\n * interact.supportsTouch\n [ method ]\n *\n = (boolean) Whether or not the browser supports touch input\n\\*/\ninteract.supportsTouch = function () {\n return browser.supportsTouch;\n};\n\n/*\\\n * interact.supportsPointerEvent\n [ method ]\n *\n = (boolean) Whether or not the browser supports PointerEvents\n\\*/\ninteract.supportsPointerEvent = function () {\n return browser.supportsPointerEvent;\n};\n\n/*\\\n * interact.stop\n [ method ]\n *\n * Cancels all interactions (end events are not fired)\n *\n - event (Event) An event on which to call preventDefault()\n = (object) interact\n\\*/\ninteract.stop = function (event) {\n for (let i = scope.interactions.length - 1; i >= 0; i--) {\n scope.interactions[i].stop(event);\n }\n\n return interact;\n};\n\n/*\\\n * interact.pointerMoveTolerance\n [ method ]\n * Returns or sets the distance the pointer must be moved before an action\n * sequence occurs. This also affects tolerance for tap events.\n *\n - newValue (number) #optional The movement from the start position must be greater than this value\n = (number | Interactable) The current setting or interact\n\\*/\ninteract.pointerMoveTolerance = function (newValue) {\n if (utils.is.number(newValue)) {\n Interaction.pointerMoveTolerance = newValue;\n\n return this;\n }\n\n return Interaction.pointerMoveTolerance;\n};\n\ninteract.addDocument = scope.addDocument;\ninteract.removeDocument = scope.removeDocument;\n\nscope.interact = interact;\n\nmodule.exports = interact;\n","const Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\nconst scope = require('./scope');\nconst is = require('./utils/is');\nconst events = require('./utils/events');\n\nconst { nodeContains, matchesSelector } = require('./utils/domUtils');\n\n/*\\\n * Interactable.preventDefault\n [ method ]\n *\n * Returns or sets whether to prevent the browser's default behaviour\n * in response to pointer events. Can be set to:\n * - `'always'` to always prevent\n * - `'never'` to never prevent\n * - `'auto'` to let interact.js try to determine what would be best\n *\n - newValue (string) #optional `true`, `false` or `'auto'`\n = (string | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.preventDefault = function (newValue) {\n if (/^(always|never|auto)$/.test(newValue)) {\n this.options.preventDefault = newValue;\n return this;\n }\n\n if (is.bool(newValue)) {\n this.options.preventDefault = newValue? 'always' : 'never';\n return this;\n }\n\n return this.options.preventDefault;\n};\n\nInteractable.prototype.checkAndPreventDefault = function (event) {\n const setting = this.options.preventDefault;\n\n if (setting === 'never') { return; }\n\n if (setting === 'always') {\n event.preventDefault();\n return;\n }\n\n // setting === 'auto'\n\n // don't preventDefault if the browser supports passiveEvents\n // CSS touch-action and user-selecct should be used instead\n if (events.supportsOptions) {\n return;\n }\n\n // don't preventDefault of pointerdown events\n if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) {\n return;\n }\n\n // don't preventDefault on editable elements\n if (is.element(event.target)\n && matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) {\n return;\n }\n\n event.preventDefault();\n};\n\nfunction onInteractionEvent ({ interaction, event }) {\n if (interaction.target) {\n interaction.target.checkAndPreventDefault(event);\n }\n}\n\nfor (const eventSignal of ['down', 'move', 'up', 'cancel']) {\n Interaction.signals.on(eventSignal, onInteractionEvent);\n}\n\n// prevent native HTML5 drag on interact.js target elements\nInteraction.docEvents.dragstart = function preventNativeDrag (event) {\n for (const interaction of scope.interactions) {\n\n if (interaction.element\n && (interaction.element === event.target\n || nodeContains(interaction.element, event.target))) {\n\n interaction.target.checkAndPreventDefault(event);\n return;\n }\n }\n};\n","const scope = require('./scope');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst iFinder = require('./utils/interactionFinder');\nconst pointerEvents = require('./pointerEvents/base');\n\nconst { window } = require('./utils/window');\n\nconst toString = Object.prototype.toString;\n\nif (!window.Array.isArray) {\n window.Array.isArray = function (obj) {\n return toString.call(obj) === '[object Array]';\n };\n}\n\nif (!String.prototype.trim) {\n String.prototype.trim = function () {\n return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n };\n}\n\n// http://www.quirksmode.org/dom/events/click.html\n// >Events leading to dblclick\n//\n// IE8 doesn't fire down event before dblclick.\n// This workaround tries to fire a tap and doubletap after dblclick\nfunction onIE8Dblclick (event) {\n const eventTarget = event.target;\n const interaction = iFinder.search(event, event.type, eventTarget);\n\n if (!interaction) { return; }\n\n if (interaction.prevTap\n && event.clientX === interaction.prevTap.clientX\n && event.clientY === interaction.prevTap.clientY\n && eventTarget === interaction.prevTap.target) {\n\n interaction.downTargets[0] = eventTarget;\n interaction.downTimes [0] = new Date().getTime();\n\n pointerEvents.fire({\n interaction,\n event,\n eventTarget,\n pointer: event,\n type: 'tap',\n });\n }\n}\n\nif (browser.isIE8) {\n const selectFix = function (event) {\n for (const interaction of scope.interactions) {\n if (interaction.interacting()) {\n interaction.target.checkAndPreventDefault(event);\n }\n }\n };\n\n const onDocIE8 = function onDocIE8 ({ doc, win }, signalName) {\n const eventMethod = signalName.indexOf('listen') === 0\n ? events.add : events.remove;\n\n // For IE's lack of Event#preventDefault\n eventMethod(doc, 'selectstart', selectFix);\n\n if (pointerEvents) {\n eventMethod(doc, 'dblclick', onIE8Dblclick);\n }\n };\n\n scope.signals.on('add-document' , onDocIE8);\n scope.signals.on('remove-document', onDocIE8);\n}\n\nmodule.exports = null;\n","const InteractEvent = require('../InteractEvent');\nconst Interaction = require('../Interaction');\nconst extend = require('../utils/extend');\n\nconst modifiers = {\n names: [],\n\n setOffsets: function (arg) {\n const { interaction, pageCoords: page } = arg;\n const { target, element, startOffset } = interaction;\n const rect = target.getRect(element);\n\n if (rect) {\n startOffset.left = page.x - rect.left;\n startOffset.top = page.y - rect.top;\n\n startOffset.right = rect.right - page.x;\n startOffset.bottom = rect.bottom - page.y;\n\n if (!('width' in rect)) { rect.width = rect.right - rect.left; }\n if (!('height' in rect)) { rect.height = rect.bottom - rect.top ; }\n }\n else {\n startOffset.left = startOffset.top = startOffset.right = startOffset.bottom = 0;\n }\n\n arg.rect = rect;\n arg.interactable = target;\n arg.element = element;\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n\n arg.options = target.options[interaction.prepared.name][modifierName];\n\n if (!arg.options) {\n continue;\n }\n\n interaction.modifierOffsets[modifierName] = modifiers[modifierName].setOffset(arg);\n }\n },\n\n setAll: function (arg) {\n const { interaction, statuses, preEnd, requireEndOnly } = arg;\n const coords = extend({}, arg.pageCoords);\n const result = {\n dx: 0,\n dy: 0,\n changed: false,\n locked: false,\n shouldMove: true,\n };\n\n for (const modifierName of modifiers.names) {\n const modifier = modifiers[modifierName];\n const options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!shouldDo(options, preEnd, requireEndOnly)) { continue; }\n\n arg.status = arg.status = statuses[modifierName];\n arg.options = options;\n arg.offset = arg.interaction.modifierOffsets[modifierName];\n\n modifier.set(arg);\n\n if (arg.status.locked) {\n coords.x += arg.status.dx;\n coords.y += arg.status.dy;\n\n result.dx += arg.status.dx;\n result.dy += arg.status.dy;\n\n result.locked = true;\n }\n }\n\n // a move should be fired if:\n // - there are no modifiers enabled,\n // - no modifiers are \"locked\" i.e. have changed the pointer's coordinates, or\n // - the locked coords have changed since the last pointer move\n result.shouldMove = !arg.status || !result.locked || arg.status.changed;\n\n return result;\n },\n\n resetStatuses: function (statuses) {\n for (const modifierName of modifiers.names) {\n const status = statuses[modifierName] || {};\n\n status.dx = status.dy = 0;\n status.modifiedX = status.modifiedY = NaN;\n status.locked = false;\n status.changed = true;\n\n statuses[modifierName] = status;\n }\n\n return statuses;\n },\n\n start: function ({ interaction }, signalName) {\n const arg = {\n interaction,\n pageCoords: (signalName === 'action-resume' ?\n interaction.curCoords : interaction.startCoords).page,\n startOffset: interaction.startOffset,\n statuses: interaction.modifierStatuses,\n preEnd: false,\n requireEndOnly: false,\n };\n\n modifiers.setOffsets(arg);\n modifiers.resetStatuses(arg.statuses);\n\n arg.pageCoords = extend({}, interaction.startCoords.page);\n interaction.modifierResult = modifiers.setAll(arg);\n },\n};\n\nInteraction.signals.on('new', function (interaction) {\n interaction.startOffset = { left: 0, right: 0, top: 0, bottom: 0 };\n interaction.modifierOffsets = {};\n interaction.modifierStatuses = modifiers.resetStatuses({});\n interaction.modifierResult = null;\n});\n\nInteraction.signals.on('action-start' , modifiers.start);\nInteraction.signals.on('action-resume', modifiers.start);\n\nInteraction.signals.on('before-action-move', function ({ interaction, preEnd, interactingBeforeMove }) {\n const modifierResult = modifiers.setAll({\n interaction,\n preEnd,\n pageCoords: interaction.curCoords.page,\n statuses: interaction.modifierStatuses,\n requireEndOnly: false,\n });\n\n // don't fire an action move if a modifier would keep the event in the same\n // cordinates as before\n if (!modifierResult.shouldMove && interactingBeforeMove) {\n interaction._dontFireMove = true;\n }\n\n interaction.modifierResult = modifierResult;\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n for (let i = 0; i < modifiers.names.length; i++) {\n const options = interaction.target.options[interaction.prepared.name][modifiers.names[i]];\n\n // if the endOnly option is true for any modifier\n if (shouldDo(options, true, true)) {\n // fire a move event at the modified coordinates\n interaction.doMove({ event, preEnd: true });\n break;\n }\n }\n});\n\nInteractEvent.signals.on('set-xy', function (arg) {\n const { iEvent, interaction } = arg;\n const modifierArg = extend({}, arg);\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n modifierArg.options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!modifierArg.options) {\n continue;\n }\n\n const modifier = modifiers[modifierName];\n\n modifierArg.status = interaction.modifierStatuses[modifierName];\n\n iEvent[modifierName] = modifier.modifyCoords(modifierArg);\n }\n});\n\nfunction shouldDo (options, preEnd, requireEndOnly) {\n return (options && options.enabled\n && (preEnd || !options.endOnly)\n && (!requireEndOnly || options.endOnly));\n}\n\nmodule.exports = modifiers;\n","const modifiers = require('./index');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst restrict = {\n defaults: {\n enabled : false,\n endOnly : false,\n restriction: null,\n elementRect: null,\n },\n\n setOffset: function ({ rect, startOffset, options }) {\n const elementRect = options && options.elementRect;\n const offset = {};\n\n if (rect && elementRect) {\n offset.left = startOffset.left - (rect.width * elementRect.left);\n offset.top = startOffset.top - (rect.height * elementRect.top);\n\n offset.right = startOffset.right - (rect.width * (1 - elementRect.right));\n offset.bottom = startOffset.bottom - (rect.height * (1 - elementRect.bottom));\n }\n else {\n offset.left = offset.top = offset.right = offset.bottom = 0;\n }\n\n return offset;\n },\n\n set: function ({ pageCoords, interaction, status, options }) {\n if (!options) { return status; }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n\n const restriction = getRestrictionRect(options.restriction, interaction, page);\n\n if (!restriction) { return status; }\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n const rect = restriction;\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n const offset = interaction.modifierOffsets.restrict;\n\n // object is assumed to have\n // x, y, width, height or\n // left, top, right, bottom\n if ('x' in restriction && 'y' in restriction) {\n modifiedX = Math.max(Math.min(rect.x + rect.width - offset.right , page.x), rect.x + offset.left);\n modifiedY = Math.max(Math.min(rect.y + rect.height - offset.bottom, page.y), rect.y + offset.top );\n }\n else {\n modifiedX = Math.max(Math.min(rect.right - offset.right , page.x), rect.left + offset.left);\n modifiedY = Math.max(Math.min(rect.bottom - offset.bottom, page.y), rect.top + offset.top );\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const elementRect = options && options.elementRect;\n\n if (options && options.enabled\n && !(phase === 'start' && elementRect && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n getRestrictionRect,\n};\n\nfunction getRestrictionRect (value, interaction, page) {\n if (utils.is.function(value)) {\n return utils.resolveRectLike(value, interaction.target, interaction.element, [page.x, page.y, interaction]);\n } else {\n return utils.resolveRectLike(value, interaction.target, interaction.element);\n }\n}\n\nmodifiers.restrict = restrict;\nmodifiers.names.push('restrict');\n\ndefaultOptions.perAction.restrict = restrict.defaults;\n\nmodule.exports = restrict;\n","// This module adds the options.resize.restrictEdges setting which sets min and\n// max for the top, left, bottom and right edges of the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictEdges: {\n// inner: { top: 200, left: 200, right: 400, bottom: 400 },\n// outer: { top: 0, left: 0, right: 600, bottom: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst { getRestrictionRect } = require('./restrict');\n\nconst noInner = { top: +Infinity, left: +Infinity, bottom: -Infinity, right: -Infinity };\nconst noOuter = { top: -Infinity, left: -Infinity, bottom: +Infinity, right: +Infinity };\n\nconst restrictEdges = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n offset: null,\n },\n\n setOffset: function ({ interaction, startOffset, options }) {\n if (!options) {\n return utils.extend({}, startOffset);\n }\n\n const offset = getRestrictionRect(options.offset, interaction, interaction.startCoords.page);\n\n if (offset) {\n return {\n top: startOffset.top + offset.y,\n left: startOffset.left + offset.x,\n bottom: startOffset.bottom + offset.y,\n right: startOffset.right + offset.x,\n };\n }\n\n return startOffset;\n },\n\n set: function ({ pageCoords, interaction, status, offset, options }) {\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n const inner = rectUtils.xywhToTlbr(getRestrictionRect(options.inner, interaction, page)) || noInner;\n const outer = rectUtils.xywhToTlbr(getRestrictionRect(options.outer, interaction, page)) || noOuter;\n\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n if (edges.top) {\n modifiedY = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top);\n }\n else if (edges.bottom) {\n modifiedY = Math.max(Math.min(outer.bottom - offset.bottom, page.y), inner.bottom - offset.bottom);\n }\n if (edges.left) {\n modifiedX = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left);\n }\n else if (edges.right) {\n modifiedX = Math.max(Math.min(outer.right - offset.right, page.x), inner.right - offset.right);\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n if (options && options.enabled\n && !(phase === 'start' && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n noInner,\n noOuter,\n getRestrictionRect,\n};\n\nmodifiers.restrictEdges = restrictEdges;\nmodifiers.names.push('restrictEdges');\n\ndefaultOptions.perAction.restrictEdges = restrictEdges.defaults;\nresize.defaults.restrictEdges = restrictEdges.defaults;\n\nmodule.exports = restrictEdges;\n","// This module adds the options.resize.restrictSize setting which sets min and\n// max width and height for the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictSize: {\n// min: { width: -600, height: -600 },\n// max: { width: 600, height: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst restrictEdges = require('./restrictEdges');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst noMin = { width: -Infinity, height: -Infinity };\nconst noMax = { width: +Infinity, height: +Infinity };\n\nconst restrictSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n },\n\n setOffset: function ({ interaction }) {\n return interaction.startOffset;\n },\n\n set: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const rect = rectUtils.xywhToTlbr(interaction.resizeRects.inverted);\n\n const minSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.min, interaction)) || noMin;\n const maxSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.max, interaction)) || noMax;\n\n arg.options = {\n enabled: options.enabled,\n endOnly: options.endOnly,\n inner: utils.extend({}, restrictEdges.noInner),\n outer: utils.extend({}, restrictEdges.noOuter),\n };\n\n if (edges.top) {\n arg.options.inner.top = rect.bottom - minSize.height;\n arg.options.outer.top = rect.bottom - maxSize.height;\n }\n else if (edges.bottom) {\n arg.options.inner.bottom = rect.top + minSize.height;\n arg.options.outer.bottom = rect.top + maxSize.height;\n }\n if (edges.left) {\n arg.options.inner.left = rect.right - minSize.width;\n arg.options.outer.left = rect.right - maxSize.width;\n }\n else if (edges.right) {\n arg.options.inner.right = rect.left + minSize.width;\n arg.options.outer.right = rect.left + maxSize.width;\n }\n\n restrictEdges.set(arg);\n },\n\n modifyCoords: restrictEdges.modifyCoords,\n};\n\nmodifiers.restrictSize = restrictSize;\nmodifiers.names.push('restrictSize');\n\ndefaultOptions.perAction.restrictSize = restrictSize.defaults;\nresize.defaults.restrictSize = restrictSize.defaults;\n\nmodule.exports = restrictSize;\n","const modifiers = require('./index');\nconst interact = require('../interact');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst snap = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n\n relativePoints: null,\n },\n\n setOffset: function ({ interaction, interactable, element, rect, startOffset, options }) {\n const offsets = [];\n const optionsOrigin = utils.rectToXY(utils.resolveRectLike(options.origin));\n const origin = optionsOrigin || utils.getOriginXY(interactable, element, interaction.prepared.name);\n options = options || interactable.options[interaction.prepared.name].snap || {};\n\n let snapOffset;\n\n if (options.offset === 'startCoords') {\n snapOffset = {\n x: interaction.startCoords.page.x - origin.x,\n y: interaction.startCoords.page.y - origin.y,\n };\n }\n else {\n const offsetRect = utils.resolveRectLike(options.offset, interactable, element, [interaction]);\n\n snapOffset = utils.rectToXY(offsetRect) || { x: 0, y: 0 };\n }\n\n if (rect && options.relativePoints && options.relativePoints.length) {\n for (const { x: relativeX, y: relativeY } of options.relativePoints) {\n offsets.push({\n x: startOffset.left - (rect.width * relativeX) + snapOffset.x,\n y: startOffset.top - (rect.height * relativeY) + snapOffset.y,\n });\n }\n }\n else {\n offsets.push(snapOffset);\n }\n\n return offsets;\n },\n\n set: function ({ interaction, pageCoords, status, options, offset: offsets }) {\n const targets = [];\n let target;\n let page;\n let i;\n\n if (status.useStatusXY) {\n page = { x: status.x, y: status.y };\n }\n else {\n const origin = utils.getOriginXY(interaction.target, interaction.element, interaction.prepared.name);\n\n page = utils.extend({}, pageCoords);\n\n page.x -= origin.x;\n page.y -= origin.y;\n }\n\n status.realX = page.x;\n status.realY = page.y;\n\n let len = options.targets? options.targets.length : 0;\n\n for (const { x: offsetX, y: offsetY } of offsets) {\n const relativeX = page.x - offsetX;\n const relativeY = page.y - offsetY;\n\n for (const snapTarget of options.targets) {\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n targets.push({\n x: utils.is.number(target.x) ? (target.x + offsetX) : relativeX,\n y: utils.is.number(target.y) ? (target.y + offsetY) : relativeY,\n\n range: utils.is.number(target.range)? target.range: options.range,\n });\n }\n }\n\n const closest = {\n target: null,\n inRange: false,\n distance: 0,\n range: 0,\n dx: 0,\n dy: 0,\n };\n\n for (i = 0, len = targets.length; i < len; i++) {\n target = targets[i];\n\n const range = target.range;\n const dx = target.x - page.x;\n const dy = target.y - page.y;\n const distance = utils.hypot(dx, dy);\n let inRange = distance <= range;\n\n // Infinite targets count as being out of range\n // compared to non infinite ones that are in range\n if (range === Infinity && closest.inRange && closest.range !== Infinity) {\n inRange = false;\n }\n\n if (!closest.target || (inRange\n // is the closest target in range?\n ? (closest.inRange && range !== Infinity\n // the pointer is relatively deeper in this target\n ? distance / range < closest.distance / closest.range\n // this target has Infinite range and the closest doesn't\n : (range === Infinity && closest.range !== Infinity)\n // OR this target is closer that the previous closest\n || distance < closest.distance)\n // The other is not in range and the pointer is closer to this target\n : (!closest.inRange && distance < closest.distance))) {\n\n closest.target = target;\n closest.distance = distance;\n closest.range = range;\n closest.inRange = inRange;\n closest.dx = dx;\n closest.dy = dy;\n\n status.range = range;\n }\n }\n\n let snapChanged;\n\n if (closest.target) {\n snapChanged = (status.modifiedX !== closest.target.x || status.modifiedY !== closest.target.y);\n\n status.modifiedX = closest.target.x;\n status.modifiedY = closest.target.y;\n }\n else {\n snapChanged = true;\n\n status.modifiedX = NaN;\n status.modifiedY = NaN;\n }\n\n status.dx = closest.dx;\n status.dy = closest.dy;\n\n status.changed = (snapChanged || (closest.inRange && !status.locked));\n status.locked = closest.inRange;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const relativePoints = options && options.relativePoints;\n\n if (options && options.enabled\n && !(phase === 'start' && relativePoints && relativePoints.length)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n }\n\n return {\n range : status.range,\n locked : status.locked,\n x : status.modifiedX,\n y : status.modifiedY,\n realX : status.realX,\n realY : status.realY,\n dx : status.dx,\n dy : status.dy,\n };\n }\n },\n};\n\ninteract.createSnapGrid = function (grid) {\n return function (x, y) {\n const limits = grid.limits || {\n left : -Infinity,\n right : Infinity,\n top : -Infinity,\n bottom: Infinity,\n };\n let offsetX = 0;\n let offsetY = 0;\n\n if (utils.is.object(grid.offset)) {\n offsetX = grid.offset.x;\n offsetY = grid.offset.y;\n }\n\n const gridx = Math.round((x - offsetX) / grid.x);\n const gridy = Math.round((y - offsetY) / grid.y);\n\n const newX = Math.max(limits.left, Math.min(limits.right , gridx * grid.x + offsetX));\n const newY = Math.max(limits.top , Math.min(limits.bottom, gridy * grid.y + offsetY));\n\n return {\n x: newX,\n y: newY,\n range: grid.range,\n };\n };\n};\n\nmodifiers.snap = snap;\nmodifiers.names.push('snap');\n\ndefaultOptions.perAction.snap = snap.defaults;\n\nmodule.exports = snap;\n","// This module allows snapping of the size of targets during resize\n// interactions.\n\nconst modifiers = require('./index');\nconst snap = require('./snap');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\nconst utils = require('../utils/');\n\nconst snapSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n },\n\n setOffset: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.edges;\n\n if (!edges) { return; }\n\n arg.options = {\n relativePoints: [{\n x: edges.left? 0 : 1,\n y: edges.top ? 0 : 1,\n }],\n origin: { x: 0, y: 0 },\n offset: 'self',\n range: options.range,\n };\n\n const offsets = snap.setOffset(arg);\n arg.options = options;\n\n return offsets;\n },\n\n set: function (arg) {\n const { interaction, options, offset, pageCoords } = arg;\n const page = utils.extend({}, pageCoords);\n const relativeX = page.x - offset[0].x;\n const relativeY = page.y - offset[0].y;\n\n arg.options = utils.extend({}, options);\n arg.options.targets = [];\n\n for (const snapTarget of options.targets) {\n let target;\n\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n if ('width' in target && 'height' in target) {\n target.x = target.width;\n target.y = target.height;\n }\n\n arg.options.targets.push(target);\n }\n\n snap.set(arg);\n },\n\n modifyCoords: function (arg) {\n const { options } = arg;\n\n arg.options = utils.extend({}, options);\n arg.options.enabled = options.enabled;\n arg.options.relativePoints = [null];\n\n snap.modifyCoords(arg);\n },\n};\n\nmodifiers.snapSize = snapSize;\nmodifiers.names.push('snapSize');\n\ndefaultOptions.perAction.snapSize = snapSize.defaults;\nresize.defaults.snapSize = snapSize.defaults;\n\nmodule.exports = snapSize;\n","const pointerUtils = require('../utils/pointerUtils');\n\nmodule.exports = class PointerEvent {\n constructor (type, pointer, event, eventTarget, interaction) {\n pointerUtils.pointerExtend(this, event);\n\n if (event !== pointer) {\n pointerUtils.pointerExtend(this, pointer);\n }\n\n this.interaction = interaction;\n\n this.timeStamp = new Date().getTime();\n this.originalEvent = event;\n this.type = type;\n this.pointerId = pointerUtils.getPointerId(pointer);\n this.pointerType = pointerUtils.getPointerType(pointer, interaction);\n this.target = eventTarget;\n this.currentTarget = null;\n\n if (type === 'tap') {\n const pointerIndex = interaction.getPointerIndex(pointer);\n this.dt = this.timeStamp - interaction.downTimes[pointerIndex];\n\n const interval = this.timeStamp - interaction.tapTime;\n\n this.double = !!(interaction.prevTap\n && interaction.prevTap.type !== 'doubletap'\n && interaction.prevTap.target === this.target\n && interval < 500);\n }\n else if (type === 'doubletap') {\n this.dt = pointer.timeStamp - interaction.tapTime;\n }\n }\n\n subtractOrigin ({ x: originX, y: originY }) {\n this.pageX -= originX;\n this.pageY -= originY;\n this.clientX -= originX;\n this.clientY -= originY;\n\n return this;\n }\n\n addOrigin ({ x: originX, y: originY }) {\n this.pageX += originX;\n this.pageY += originY;\n this.clientX += originX;\n this.clientY += originY;\n\n return this;\n }\n\n preventDefault () {\n this.originalEvent.preventDefault();\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n};\n","const PointerEvent = require('./PointerEvent');\nconst Interaction = require('../Interaction');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst defaults = require('../defaultOptions');\nconst signals = require('../utils/Signals').new();\nconst { filter } = require('../utils/arr');\n\nconst simpleSignals = [ 'down', 'up', 'cancel' ];\nconst simpleEvents = [ 'down', 'up', 'cancel' ];\n\nconst pointerEvents = {\n PointerEvent,\n fire,\n collectEventTargets,\n signals,\n defaults: {\n holdDuration: 600,\n ignoreFrom : null,\n allowFrom : null,\n origin : { x: 0, y: 0 },\n },\n types: [\n 'down',\n 'move',\n 'up',\n 'cancel',\n 'tap',\n 'doubletap',\n 'hold',\n ],\n};\n\nfunction fire (arg) {\n const {\n interaction, pointer, event, eventTarget,\n type = arg.pointerEvent.type,\n targets = collectEventTargets(arg),\n pointerEvent = new PointerEvent(type, pointer, event, eventTarget, interaction),\n } = arg;\n\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n targets,\n type,\n pointerEvent,\n };\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n\n for (const prop in target.props || {}) {\n pointerEvent[prop] = target.props[prop];\n }\n\n const origin = utils.getOriginXY(target.eventable, target.element);\n\n pointerEvent.subtractOrigin(origin);\n pointerEvent.eventable = target.eventable;\n pointerEvent.currentTarget = target.element;\n\n target.eventable.fire(pointerEvent);\n\n pointerEvent.addOrigin(origin);\n\n if (pointerEvent.immediatePropagationStopped\n || (pointerEvent.propagationStopped\n && (i + 1) < targets.length && targets[i + 1].element !== pointerEvent.currentTarget)) {\n break;\n }\n }\n\n signals.fire('fired', signalArg);\n\n if (type === 'tap') {\n // if pointerEvent should make a double tap, create and fire a doubletap\n // PointerEvent and use that as the prevTap\n const prevTap = pointerEvent.double\n ? fire({\n interaction, pointer, event, eventTarget,\n type: 'doubletap',\n })\n : pointerEvent;\n\n interaction.prevTap = prevTap;\n interaction.tapTime = prevTap.timeStamp;\n }\n\n return pointerEvent;\n}\n\nfunction collectEventTargets ({ interaction, pointer, event, eventTarget, type }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n // do not fire a tap event if the pointer was moved before being lifted\n if (type === 'tap' && (interaction.pointerWasMoved\n // or if the pointerup target is different to the pointerdown target\n || !(interaction.downTargets[pointerIndex] && interaction.downTargets[pointerIndex] === eventTarget))) {\n return [];\n }\n\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n path,\n targets: [],\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (type === 'hold') {\n signalArg.targets = filter(signalArg.targets, target =>\n target.eventable.options.holdDuration === interaction.holdTimers[pointerIndex].duration);\n }\n\n return signalArg.targets;\n}\n\nInteraction.signals.on('update-pointer-down', function ({ interaction, pointerIndex }) {\n interaction.holdTimers[pointerIndex] = { duration: Infinity, timeout: null };\n});\n\nInteraction.signals.on('remove-pointer', function ({ interaction, pointerIndex }) {\n interaction.holdTimers.splice(pointerIndex, 1);\n});\n\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget, duplicateMove }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n if (!duplicateMove && (!interaction.pointerIsDown || interaction.pointerWasMoved)) {\n if (interaction.pointerIsDown) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n\n fire({\n interaction, pointer, event, eventTarget,\n type: 'move',\n });\n }\n});\n\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget, pointerIndex }) {\n // copy event to be used in timeout for IE8\n const eventCopy = browser.isIE8? utils.extend({}, event) : event;\n\n const timer = interaction.holdTimers[pointerIndex];\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'hold',\n targets: [],\n path,\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (!signalArg.targets.length) { return; }\n\n let minDuration = Infinity;\n\n for (let i = 0; i < signalArg.targets.length; i++) {\n const target = signalArg.targets[i];\n const holdDuration = target.eventable.options.holdDuration;\n\n if (holdDuration < minDuration) {\n minDuration = holdDuration;\n }\n }\n\n timer.duration = minDuration;\n timer.timeout = setTimeout(function () {\n fire({\n interaction, eventCopy, eventTarget,\n pointer: browser.isIE8? eventCopy : pointer,\n type: 'hold',\n });\n }, minDuration);\n});\n\nInteraction.signals.on('up', ({ interaction, pointer, event, eventTarget }) => {\n if (!interaction.pointerWasMoved) {\n fire({ interaction, eventTarget, pointer, event, type: 'tap' });\n }\n});\n\n['up', 'cancel'].forEach(function (signalName) {\n Interaction.signals.on(signalName, function ({ interaction, pointerIndex }) {\n if (interaction.holdTimers[pointerIndex]) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n });\n});\n\nfunction createSignalListener (type) {\n return function ({ interaction, pointer, event, eventTarget }) {\n fire({ interaction, eventTarget, pointer, event, type });\n };\n}\n\nfor (let i = 0; i < simpleSignals.length; i++) {\n Interaction.signals.on(simpleSignals[i], createSignalListener(simpleEvents[i]));\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.prevTap = null; // the most recent tap event on this interaction\n interaction.tapTime = 0; // time of the most recent tap event\n interaction.holdTimers = []; // [{ duration, timeout }]\n});\n\ndefaults.pointerEvents = pointerEvents.defaults;\nmodule.exports = pointerEvents;\n","const pointerEvents = require('./base');\nconst Interaction = require('../Interaction');\n\npointerEvents.signals.on('new', onNew);\npointerEvents.signals.on('fired', onFired);\n\nfor (const signal of ['move', 'up', 'cancel', 'endall']) {\n Interaction.signals.on(signal, endHoldRepeat);\n}\n\nfunction onNew ({ pointerEvent }) {\n if (pointerEvent.type !== 'hold') { return; }\n\n pointerEvent.count = (pointerEvent.count || 0) + 1;\n}\n\nfunction onFired ({ interaction, pointerEvent, eventTarget, targets }) {\n if (pointerEvent.type !== 'hold' || !targets.length) { return; }\n\n // get the repeat interval from the first eventable\n const interval = targets[0].eventable.options.holdRepeatInterval;\n\n // don't repeat if the interval is 0 or less\n if (interval <= 0) { return; }\n\n // set a timeout to fire the holdrepeat event\n interaction.holdIntervalHandle = setTimeout(function () {\n pointerEvents.fire({\n interaction,\n eventTarget,\n type: 'hold',\n pointer: pointerEvent,\n event: pointerEvent,\n });\n }, interval);\n}\n\nfunction endHoldRepeat ({ interaction }) {\n // set the interaction's holdStopTime property\n // to stop further holdRepeat events\n if (interaction.holdIntervalHandle) {\n clearInterval(interaction.holdIntervalHandle);\n interaction.holdIntervalHandle = null;\n }\n}\n\n// don't repeat by default\npointerEvents.defaults.holdRepeatInterval = 0;\npointerEvents.types.push('holdrepeat');\n\nmodule.exports = {\n onNew,\n onFired,\n endHoldRepeat,\n};\n","const pointerEvents = require('./base');\nconst Interactable = require('../Interactable');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\nconst scope = require('../scope');\nconst extend = require('../utils/extend');\nconst { merge } = require('../utils/arr');\n\npointerEvents.signals.on('collect-targets', function ({ targets, element, type, eventTarget }) {\n function collectSelectors (interactable, selector, context) {\n const els = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && is.element(element)\n && domUtils.matchesSelector(element, selector, els)\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n const interactable = scope.interactables.get(element);\n\n if (interactable) {\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n scope.interactables.forEachSelector(collectSelectors, element);\n});\n\nInteractable.signals.on('new', function ({ interactable }) {\n interactable.events.getRect = function (element) {\n return interactable.getRect(element);\n };\n});\n\nInteractable.signals.on('set', function ({ interactable, options }) {\n extend(interactable.events.options, pointerEvents.defaults);\n extend(interactable.events.options, options);\n});\n\nmerge(Interactable.eventTypes, pointerEvents.types);\n\nInteractable.prototype.pointerEvents = function (options) {\n extend(this.events.options, options);\n\n return this;\n};\n\nconst __backCompatOption = Interactable.prototype._backCompatOption;\n\nInteractable.prototype._backCompatOption = function (optionName, newValue) {\n const ret = __backCompatOption.call(this, optionName, newValue);\n\n if (ret === this) {\n this.events.options[optionName] = newValue;\n }\n\n return ret;\n};\n\nInteractable.settingsMethods.push('pointerEvents');\n","const utils = require('./utils');\nconst events = require('./utils/events');\nconst signals = require('./utils/Signals').new();\n\nconst scope = {\n signals,\n events,\n utils,\n\n // main document\n document: require('./utils/domObjects').document,\n // all documents being listened to\n documents: [],\n\n addDocument: function (doc, win) {\n // do nothing if document is already known\n if (utils.contains(scope.documents, doc)) { return false; }\n\n win = win || scope.getWindow(doc);\n\n scope.documents.push(doc);\n events.documents.push(doc);\n\n // don't add an unload event for the main document\n // so that the page may be cached in browser history\n if (doc !== scope.document) {\n events.add(win, 'unload', scope.onWindowUnload);\n }\n\n signals.fire('add-document', { doc, win });\n },\n\n removeDocument: function (doc, win) {\n const index = utils.indexOf(scope.documents, doc);\n\n win = win || scope.getWindow(doc);\n\n events.remove(win, 'unload', scope.onWindowUnload);\n\n scope.documents.splice(index, 1);\n events.documents.splice(index, 1);\n\n signals.fire('remove-document', { win, doc });\n },\n\n onWindowUnload: function () {\n scope.removeDocument(this.document, this);\n },\n};\n\nmodule.exports = scope;\n","const { indexOf } = require('./arr');\n\nclass Signals {\n constructor () {\n this.listeners = {\n // signalName: [listeners],\n };\n }\n\n on (name, listener) {\n if (!this.listeners[name]) {\n this.listeners[name] = [listener];\n return;\n }\n\n this.listeners[name].push(listener);\n }\n\n off (name, listener) {\n if (!this.listeners[name]) { return; }\n\n const index = indexOf(this.listeners[name], listener);\n\n if (index !== -1) {\n this.listeners[name].splice(index, 1);\n }\n }\n\n fire (name, arg) {\n const targetListeners = this.listeners[name];\n\n if (!targetListeners) { return; }\n\n for (let i = 0; i < targetListeners.length; i++) {\n if (targetListeners[i](arg, name) === false) {\n return;\n }\n }\n }\n}\n\nSignals.new = function () {\n return new Signals();\n};\n\nmodule.exports = Signals;\n","function indexOf (array, target) {\n for (let i = 0, len = array.length; i < len; i++) {\n if (array[i] === target) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction contains (array, target) {\n return indexOf(array, target) !== -1;\n}\n\nfunction merge (target, source) {\n for (let i = 0; i < source.length; i++) {\n target.push(source[i]);\n }\n\n return target;\n}\n\nfunction filter (array, test) {\n const result = [];\n\n for (let i = 0; i < array.length; i++) {\n if (test(array[i])) {\n result.push(array[i]);\n }\n }\n\n return result;\n}\n\nmodule.exports = {\n indexOf,\n contains,\n merge,\n filter,\n};\n","const { window } = require('./window');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst Element = domObjects.Element;\nconst navigator = window.navigator;\n\nconst browser = {\n // Does the browser support touch input?\n supportsTouch: !!(('ontouchstart' in window) || is.function(window.DocumentTouch)\n && domObjects.document instanceof window.DocumentTouch),\n\n // Does the browser support PointerEvents\n supportsPointerEvent: !!domObjects.PointerEvent,\n\n isIE8: ('attachEvent' in window) && !('addEventListener' in window),\n\n // Opera Mobile must be handled differently\n isOperaMobile: (navigator.appName === 'Opera'\n && browser.supportsTouch\n && navigator.userAgent.match('Presto')),\n\n // scrolling doesn't change the result of getClientRects on iOS 7\n isIOS7: (/iP(hone|od|ad)/.test(navigator.platform)\n && /OS 7[^\\d]/.test(navigator.appVersion)),\n\n isIe9OrOlder: /MSIE (8|9)/.test(navigator.userAgent),\n\n // prefix matchesSelector\n prefixedMatchesSelector: 'matches' in Element.prototype\n ? 'matches': 'webkitMatchesSelector' in Element.prototype\n ? 'webkitMatchesSelector': 'mozMatchesSelector' in Element.prototype\n ? 'mozMatchesSelector': 'oMatchesSelector' in Element.prototype\n ? 'oMatchesSelector': 'msMatchesSelector',\n\n useMatchesSelectorPolyfill: false,\n\n pEventTypes: (domObjects.PointerEvent\n ? (domObjects.PointerEvent === window.MSPointerEvent\n ? {\n up: 'MSPointerUp',\n down: 'MSPointerDown',\n over: 'mouseover',\n out: 'mouseout',\n move: 'MSPointerMove',\n cancel: 'MSPointerCancel',\n }\n : {\n up: 'pointerup',\n down: 'pointerdown',\n over: 'pointerover',\n out: 'pointerout',\n move: 'pointermove',\n cancel: 'pointercancel',\n })\n : null),\n\n // because Webkit and Opera still use 'mousewheel' event type\n wheelEvent: 'onmousewheel' in domObjects.document? 'mousewheel': 'wheel',\n\n};\n\nbrowser.useMatchesSelectorPolyfill = !is.function(Element.prototype[browser.prefixedMatchesSelector]);\n\nmodule.exports = browser;\n","const domObjects = {};\nconst win = require('./window').window;\n\nfunction blank () {}\n\ndomObjects.document = win.document;\ndomObjects.DocumentFragment = win.DocumentFragment || blank;\ndomObjects.SVGElement = win.SVGElement || blank;\ndomObjects.SVGSVGElement = win.SVGSVGElement || blank;\ndomObjects.SVGElementInstance = win.SVGElementInstance || blank;\ndomObjects.Element = win.Element || blank;\ndomObjects.HTMLElement = win.HTMLElement || domObjects.Element;\n\ndomObjects.Event = win.Event;\ndomObjects.Touch = win.Touch || blank;\ndomObjects.PointerEvent = (win.PointerEvent || win.MSPointerEvent);\n\nmodule.exports = domObjects;\n","const win = require('./window');\nconst browser = require('./browser');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst domUtils = {\n nodeContains: function (parent, child) {\n while (child) {\n if (child === parent) {\n return true;\n }\n\n child = child.parentNode;\n }\n\n return false;\n },\n\n closest: function (element, selector) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) { return element; }\n\n element = domUtils.parentNode(element);\n }\n\n return null;\n },\n\n parentNode: function (node) {\n let parent = node.parentNode;\n\n if (is.docFrag(parent)) {\n // skip past #shado-root fragments\n while ((parent = parent.host) && is.docFrag(parent)) {\n continue;\n }\n\n return parent;\n }\n\n return parent;\n },\n\n // taken from http://tanalin.com/en/blog/2012/12/matches-selector-ie8/ and modified\n matchesSelectorPolyfill: browser.useMatchesSelectorPolyfill\n ? function (element, selector, elems) {\n elems = elems || element.parentNode.querySelectorAll(selector);\n\n for (let i = 0, len = elems.length; i < len; i++) {\n if (elems[i] === element) {\n return true;\n }\n }\n\n return false;\n }\n : null,\n\n matchesSelector: function (element, selector, nodeList) {\n if (browser.useMatchesSelectorPolyfill) {\n return domUtils.matchesSelectorPolyfill(element, selector, nodeList);\n }\n\n // remove /deep/ from selectors if shadowDOM polyfill is used\n if (win.window !== win.realWindow) {\n selector = selector.replace(/\\/deep\\//g, ' ');\n }\n\n return element[browser.prefixedMatchesSelector](selector);\n },\n\n // Test for the element that's \"above\" all other qualifiers\n indexOfDeepestElement: function (elements) {\n let deepestZoneParents = [];\n let dropzoneParents = [];\n let dropzone;\n let deepestZone = elements[0];\n let index = deepestZone? 0: -1;\n let parent;\n let child;\n let i;\n let n;\n\n for (i = 1; i < elements.length; i++) {\n dropzone = elements[i];\n\n // an element might belong to multiple selector dropzones\n if (!dropzone || dropzone === deepestZone) {\n continue;\n }\n\n if (!deepestZone) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n // check if the deepest or current are document.documentElement or document.rootElement\n // - if the current dropzone is, do nothing and continue\n if (dropzone.parentNode === dropzone.ownerDocument) {\n continue;\n }\n // - if deepest is, update with the current dropzone and continue to next\n else if (deepestZone.parentNode === dropzone.ownerDocument) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n if (!deepestZoneParents.length) {\n parent = deepestZone;\n while (parent.parentNode && parent.parentNode !== parent.ownerDocument) {\n deepestZoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n }\n\n // if this element is an svg element and the current deepest is\n // an HTMLElement\n if (deepestZone instanceof domObjects.HTMLElement\n && dropzone instanceof domObjects.SVGElement\n && !(dropzone instanceof domObjects.SVGSVGElement)) {\n\n if (dropzone === deepestZone.parentNode) {\n continue;\n }\n\n parent = dropzone.ownerSVGElement;\n }\n else {\n parent = dropzone;\n }\n\n dropzoneParents = [];\n\n while (parent.parentNode !== parent.ownerDocument) {\n dropzoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n\n n = 0;\n\n // get (position of last common ancestor) + 1\n while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) {\n n++;\n }\n\n const parents = [\n dropzoneParents[n - 1],\n dropzoneParents[n],\n deepestZoneParents[n],\n ];\n\n child = parents[0].lastChild;\n\n while (child) {\n if (child === parents[1]) {\n deepestZone = dropzone;\n index = i;\n deepestZoneParents = [];\n\n break;\n }\n else if (child === parents[2]) {\n break;\n }\n\n child = child.previousSibling;\n }\n }\n\n return index;\n },\n\n matchesUpTo: function (element, selector, limit) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) {\n return true;\n }\n\n element = domUtils.parentNode(element);\n\n if (element === limit) {\n return domUtils.matchesSelector(element, selector);\n }\n }\n\n return false;\n },\n\n getActualElement: function (element) {\n return (element instanceof domObjects.SVGElementInstance\n ? element.correspondingUseElement\n : element);\n },\n\n getScrollXY: function (relevantWindow) {\n relevantWindow = relevantWindow || win.window;\n return {\n x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft,\n y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop,\n };\n },\n\n getElementClientRect: function (element) {\n const clientRect = (element instanceof domObjects.SVGElement\n ? element.getBoundingClientRect()\n : element.getClientRects()[0]);\n\n return clientRect && {\n left : clientRect.left,\n right : clientRect.right,\n top : clientRect.top,\n bottom: clientRect.bottom,\n width : clientRect.width || clientRect.right - clientRect.left,\n height: clientRect.height || clientRect.bottom - clientRect.top,\n };\n },\n\n getElementRect: function (element) {\n const clientRect = domUtils.getElementClientRect(element);\n\n if (!browser.isIOS7 && clientRect) {\n const scroll = domUtils.getScrollXY(win.getWindow(element));\n\n clientRect.left += scroll.x;\n clientRect.right += scroll.x;\n clientRect.top += scroll.y;\n clientRect.bottom += scroll.y;\n }\n\n return clientRect;\n },\n\n getPath: function (element) {\n const path = [];\n\n while (element) {\n path.push(element);\n element = domUtils.parentNode(element);\n }\n\n return path;\n },\n\n trySelector: value => {\n if (!is.string(value)) { return false; }\n\n // an exception will be raised if it is invalid\n domObjects.document.querySelector(value);\n return true;\n },\n};\n\nmodule.exports = domUtils;\n","const is = require('./is');\nconst domUtils = require('./domUtils');\nconst pExtend = require('./pointerExtend');\n\nconst { window, getWindow } = require('./window');\nconst { indexOf, contains } = require('./arr');\n\nconst useAttachEvent = ('attachEvent' in window) && !('addEventListener' in window);\nconst addEvent = useAttachEvent? 'attachEvent': 'addEventListener';\nconst removeEvent = useAttachEvent? 'detachEvent': 'removeEventListener';\nconst on = useAttachEvent? 'on': '';\n\nconst elements = [];\nconst targets = [];\nconst attachedListeners = [];\n\n// {\n// type: {\n// selectors: ['selector', ...],\n// contexts : [document, ...],\n// listeners: [[listener, capture, passive], ...]\n// }\n// }\nconst delegatedEvents = {};\n\nconst documents = [];\n\nconst supportsOptions = !useAttachEvent && (() => {\n let supported = false;\n\n window.document.createElement('div').addEventListener('test', null, {\n get capture () { supported = true; },\n });\n\n return supported;\n})();\n\nfunction add (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n let elementIndex = indexOf(elements, element);\n let target = targets[elementIndex];\n\n if (!target) {\n target = {\n events: {},\n typeCount: 0,\n };\n\n elementIndex = elements.push(element) - 1;\n targets.push(target);\n\n attachedListeners.push(useAttachEvent\n ? {\n supplied: [],\n wrapped : [],\n useCount: [],\n }\n : null);\n }\n\n if (!target.events[type]) {\n target.events[type] = [];\n target.typeCount++;\n }\n\n if (!contains(target.events[type], listener)) {\n let ret;\n\n if (useAttachEvent) {\n const { supplied, wrapped, useCount } = attachedListeners[elementIndex];\n const listenerIndex = indexOf(supplied, listener);\n\n const wrappedListener = wrapped[listenerIndex] || function (event) {\n if (!event.immediatePropagationStopped) {\n event.target = event.srcElement;\n event.currentTarget = element;\n\n event.preventDefault = event.preventDefault || preventDef;\n event.stopPropagation = event.stopPropagation || stopProp;\n event.stopImmediatePropagation = event.stopImmediatePropagation || stopImmProp;\n\n if (/mouse|click/.test(event.type)) {\n event.pageX = event.clientX + getWindow(element).document.documentElement.scrollLeft;\n event.pageY = event.clientY + getWindow(element).document.documentElement.scrollTop;\n }\n\n listener(event);\n }\n };\n\n ret = element[addEvent](on + type, wrappedListener, !!options.capture);\n\n if (listenerIndex === -1) {\n supplied.push(listener);\n wrapped.push(wrappedListener);\n useCount.push(1);\n }\n else {\n useCount[listenerIndex]++;\n }\n }\n else {\n ret = element[addEvent](type, listener, supportsOptions? options : !!options.capture);\n }\n target.events[type].push(listener);\n\n return ret;\n }\n}\n\nfunction remove (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const elementIndex = indexOf(elements, element);\n const target = targets[elementIndex];\n\n if (!target || !target.events) {\n return;\n }\n\n let wrappedListener = listener;\n let listeners;\n let listenerIndex;\n\n if (useAttachEvent) {\n listeners = attachedListeners[elementIndex];\n listenerIndex = indexOf(listeners.supplied, listener);\n wrappedListener = listeners.wrapped[listenerIndex];\n }\n\n if (type === 'all') {\n for (type in target.events) {\n if (target.events.hasOwnProperty(type)) {\n remove(element, type, 'all');\n }\n }\n return;\n }\n\n if (target.events[type]) {\n const len = target.events[type].length;\n\n if (listener === 'all') {\n for (let i = 0; i < len; i++) {\n remove(element, type, target.events[type][i], options);\n }\n return;\n }\n else {\n for (let i = 0; i < len; i++) {\n if (target.events[type][i] === listener) {\n element[removeEvent](on + type, wrappedListener, supportsOptions? options : !!options.capture);\n target.events[type].splice(i, 1);\n\n if (useAttachEvent && listeners) {\n listeners.useCount[listenerIndex]--;\n if (listeners.useCount[listenerIndex] === 0) {\n listeners.supplied.splice(listenerIndex, 1);\n listeners.wrapped.splice(listenerIndex, 1);\n listeners.useCount.splice(listenerIndex, 1);\n }\n }\n\n break;\n }\n }\n }\n\n if (target.events[type] && target.events[type].length === 0) {\n target.events[type] = null;\n target.typeCount--;\n }\n }\n\n if (!target.typeCount) {\n targets.splice(elementIndex, 1);\n elements.splice(elementIndex, 1);\n attachedListeners.splice(elementIndex, 1);\n }\n}\n\nfunction addDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n if (!delegatedEvents[type]) {\n delegatedEvents[type] = {\n selectors: [],\n contexts : [],\n listeners: [],\n };\n\n // add delegate listener functions\n for (let i = 0; i < documents.length; i++) {\n add(documents[i], type, delegateListener);\n add(documents[i], type, delegateUseCapture, true);\n }\n }\n\n const delegated = delegatedEvents[type];\n let index;\n\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n break;\n }\n }\n\n if (index === -1) {\n index = delegated.selectors.length;\n\n delegated.selectors.push(selector);\n delegated.contexts .push(context);\n delegated.listeners.push([]);\n }\n\n // keep listener and capture and passive flags\n delegated.listeners[index].push([listener, !!options.capture, options.passive]);\n}\n\nfunction removeDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const delegated = delegatedEvents[type];\n let matchFound = false;\n let index;\n\n if (!delegated) { return; }\n\n // count from last index of delegated to 0\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n // look for matching selector and context Node\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n\n const listeners = delegated.listeners[index];\n\n // each item of the listeners array is an array: [function, capture, passive]\n for (let i = listeners.length - 1; i >= 0; i--) {\n const [fn, capture, passive] = listeners[i];\n\n // check if the listener functions and capture and passive flags match\n if (fn === listener && capture === !!options.capture && passive === options.passive) {\n // remove the listener from the array of listeners\n listeners.splice(i, 1);\n\n // if all listeners for this interactable have been removed\n // remove the interactable from the delegated arrays\n if (!listeners.length) {\n delegated.selectors.splice(index, 1);\n delegated.contexts .splice(index, 1);\n delegated.listeners.splice(index, 1);\n\n // remove delegate function from context\n remove(context, type, delegateListener);\n remove(context, type, delegateUseCapture, true);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegatedEvents[type] = null;\n }\n }\n\n // only remove one listener\n matchFound = true;\n break;\n }\n }\n\n if (matchFound) { break; }\n }\n }\n}\n\n// bound to the interactable context when a DOM event\n// listener is added to a selector interactable\nfunction delegateListener (event, optionalArg) {\n const options = getOptions(optionalArg);\n const fakeEvent = {};\n const delegated = delegatedEvents[event.type];\n const eventTarget = (domUtils.getActualElement(event.path\n ? event.path[0]\n : event.target));\n let element = eventTarget;\n\n // duplicate the event so that currentTarget can be changed\n pExtend(fakeEvent, event);\n\n fakeEvent.originalEvent = event;\n fakeEvent.preventDefault = preventOriginalDefault;\n\n // climb up document tree looking for selector matches\n while (is.element(element)) {\n for (let i = 0; i < delegated.selectors.length; i++) {\n const selector = delegated.selectors[i];\n const context = delegated.contexts[i];\n\n if (domUtils.matchesSelector(element, selector)\n && domUtils.nodeContains(context, eventTarget)\n && domUtils.nodeContains(context, element)) {\n\n const listeners = delegated.listeners[i];\n\n fakeEvent.currentTarget = element;\n\n for (let j = 0; j < listeners.length; j++) {\n const [fn, capture, passive] = listeners[j];\n\n if (capture === !!options.capture && passive === options.passive) {\n fn(fakeEvent);\n }\n }\n }\n }\n\n element = domUtils.parentNode(element);\n }\n}\n\nfunction delegateUseCapture (event) {\n return delegateListener.call(this, event, true);\n}\n\nfunction preventDef () {\n this.returnValue = false;\n}\n\nfunction preventOriginalDefault () {\n this.originalEvent.preventDefault();\n}\n\nfunction stopProp () {\n this.cancelBubble = true;\n}\n\nfunction stopImmProp () {\n this.cancelBubble = true;\n this.immediatePropagationStopped = true;\n}\n\nfunction getOptions (param) {\n return is.object(param)? param : { capture: param };\n}\n\nmodule.exports = {\n add,\n remove,\n\n addDelegate,\n removeDelegate,\n\n delegateListener,\n delegateUseCapture,\n delegatedEvents,\n documents,\n\n useAttachEvent,\n supportsOptions,\n\n _elements: elements,\n _targets: targets,\n _attachedListeners: attachedListeners,\n};\n","module.exports = function extend (dest, source) {\n for (const prop in source) {\n dest[prop] = source[prop];\n }\n return dest;\n};\n","const {\n resolveRectLike,\n rectToXY,\n} = require('./rect');\n\nmodule.exports = function (target, element, action) {\n const actionOptions = target.options[action];\n const actionOrigin = actionOptions && actionOptions.origin;\n const origin = actionOrigin || target.options.origin;\n\n const originRect = resolveRectLike(origin, target, element, [target && element]);\n\n return rectToXY(originRect) || { x: 0, y: 0 };\n};\n","module.exports = (x, y) => Math.sqrt(x * x + y * y);\n","const extend = require('./extend');\nconst win = require('./window');\n\nconst utils = {\n warnOnce: function (method, message) {\n let warned = false;\n\n return function () {\n if (!warned) {\n win.window.console.warn(message);\n warned = true;\n }\n\n return method.apply(this, arguments);\n };\n },\n\n // http://stackoverflow.com/a/5634528/2280888\n _getQBezierValue: function (t, p1, p2, p3) {\n const iT = 1 - t;\n return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3;\n },\n\n getQuadraticCurvePoint: function (startX, startY, cpX, cpY, endX, endY, position) {\n return {\n x: utils._getQBezierValue(position, startX, cpX, endX),\n y: utils._getQBezierValue(position, startY, cpY, endY),\n };\n },\n\n // http://gizma.com/easing/\n easeOutQuad: function (t, b, c, d) {\n t /= d;\n return -c * t*(t-2) + b;\n },\n\n copyAction: function (dest, src) {\n dest.name = src.name;\n dest.axis = src.axis;\n dest.edges = src.edges;\n\n return dest;\n },\n\n is : require('./is'),\n extend : extend,\n hypot : require('./hypot'),\n getOriginXY: require('./getOriginXY'),\n};\n\nextend(utils, require('./arr'));\nextend(utils, require('./domUtils'));\nextend(utils, require('./pointerUtils'));\nextend(utils, require('./rect'));\n\nmodule.exports = utils;\n","const scope = require('../scope');\nconst utils = require('./index');\nconst browser = require('./browser');\n\nconst finder = {\n methodOrder: [ 'simulationResume', 'mouse', 'hasPointer', 'idle' ],\n\n search: function (pointer, eventType, eventTarget) {\n const mouseEvent = (/mouse/i.test(pointer.pointerType || eventType)\n // MSPointerEvent.MSPOINTER_TYPE_MOUSE\n || pointer.pointerType === 4);\n const pointerId = utils.getPointerId(pointer);\n const details = { pointer, pointerId, mouseEvent, eventType, eventTarget };\n\n for (const method of finder.methodOrder) {\n const interaction = finder[method](details);\n\n if (interaction) {\n return interaction;\n }\n }\n },\n\n // try to resume simulation with a new pointer\n simulationResume: function ({ mouseEvent, eventType, eventTarget }) {\n if (!/down|start/i.test(eventType)) {\n return null;\n }\n\n for (const interaction of scope.interactions) {\n let element = eventTarget;\n\n if (interaction.simulation && interaction.simulation.allowResume\n && (interaction.mouse === mouseEvent)) {\n while (element) {\n // if the element is the interaction element\n if (element === interaction.element) {\n return interaction;\n }\n element = utils.parentNode(element);\n }\n }\n }\n\n return null;\n },\n\n // if it's a mouse interaction\n mouse: function ({ pointerId, mouseEvent, eventType }) {\n if (!mouseEvent && (browser.supportsTouch || browser.supportsPointerEvent)) {\n return null;\n }\n\n let firstNonActive;\n\n for (const interaction of scope.interactions) {\n if (interaction.mouse) {\n // if it's a down event, skip interactions with running simulations\n if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; }\n\n // if the interaction is active, return it immediately\n if (interaction.interacting()) {\n return interaction;\n }\n // otherwise save it and look for another active interaction\n else if (!firstNonActive) {\n firstNonActive = interaction;\n }\n }\n }\n\n // if no active mouse interaction was found use the first inactive mouse\n // interaction\n if (firstNonActive) {\n return firstNonActive;\n }\n\n // Find any interaction specifically for mouse.\n // ignore the interaction if the eventType is a mousedown, and a simulation\n // is active\n for (const interaction of scope.interactions) {\n if (interaction.mouse && !(/down/.test(eventType) && interaction.simulation)) {\n return interaction;\n }\n }\n\n return null;\n },\n\n // get interaction that has this pointer\n hasPointer: function ({ pointerId }) {\n for (const interaction of scope.interactions) {\n if (utils.contains(interaction.pointerIds, pointerId)) {\n return interaction;\n }\n }\n },\n\n // get first idle interaction\n idle: function ({ mouseEvent }) {\n for (const interaction of scope.interactions) {\n // if there's already a pointer held down\n if (interaction.pointerIds.length === 1) {\n const target = interaction.target;\n // don't add this pointer if there is a target interactable and it\n // isn't gesturable\n if (target && !target.options.gesture.enabled) {\n continue;\n }\n }\n // maximum of 2 pointers per interaction\n else if (interaction.pointerIds.length >= 2) {\n continue;\n }\n\n if (!interaction.interacting() && (mouseEvent === interaction.mouse)) {\n return interaction;\n }\n }\n\n return null;\n },\n};\n\nmodule.exports = finder;\n","const win = require('./window');\nconst isWindow = require('./isWindow');\n\nconst is = {\n array : () => {},\n\n window : thing => thing === win.window || isWindow(thing),\n\n docFrag : thing => is.object(thing) && thing.nodeType === 11,\n\n object : thing => !!thing && (typeof thing === 'object'),\n\n function: thing => typeof thing === 'function',\n\n number : thing => typeof thing === 'number' ,\n\n bool : thing => typeof thing === 'boolean' ,\n\n string : thing => typeof thing === 'string' ,\n\n element: thing => {\n if (!thing || (typeof thing !== 'object')) { return false; }\n\n const _window = win.getWindow(thing) || win.window;\n\n return (/object|function/.test(typeof _window.Element)\n ? thing instanceof _window.Element //DOM2\n : thing.nodeType === 1 && typeof thing.nodeName === 'string');\n },\n};\n\nis.array = thing => (is.object(thing)\n && (typeof thing.length !== 'undefined')\n && is.function(thing.splice));\n\nmodule.exports = is;\n","module.exports = (thing) => !!(thing && thing.Window) && (thing instanceof thing.Window);\n","function pointerExtend (dest, source) {\n for (const prop in source) {\n const prefixedPropREs = module.exports.prefixedPropREs;\n let deprecated = false;\n\n // skip deprecated prefixed properties\n for (const vendor in prefixedPropREs) {\n if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) {\n deprecated = true;\n break;\n }\n }\n\n if (!deprecated && typeof source[prop] !== 'function') {\n dest[prop] = source[prop];\n }\n }\n return dest;\n}\n\npointerExtend.prefixedPropREs = {\n webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/,\n};\n\nmodule.exports = pointerExtend;\n","const hypot = require('./hypot');\nconst browser = require('./browser');\nconst dom = require('./domObjects');\nconst domUtils = require('./domUtils');\nconst is = require('./is');\nconst pointerExtend = require('./pointerExtend');\n\nconst pointerUtils = {\n copyCoords: function (dest, src) {\n dest.page = dest.page || {};\n dest.page.x = src.page.x;\n dest.page.y = src.page.y;\n\n dest.client = dest.client || {};\n dest.client.x = src.client.x;\n dest.client.y = src.client.y;\n\n dest.timeStamp = src.timeStamp;\n },\n\n setCoordDeltas: function (targetObj, prev, cur) {\n targetObj.page.x = cur.page.x - prev.page.x;\n targetObj.page.y = cur.page.y - prev.page.y;\n targetObj.client.x = cur.client.x - prev.client.x;\n targetObj.client.y = cur.client.y - prev.client.y;\n targetObj.timeStamp = cur.timeStamp - prev.timeStamp;\n\n // set pointer velocity\n const dt = Math.max(targetObj.timeStamp / 1000, 0.001);\n\n targetObj.page.speed = hypot(targetObj.page.x, targetObj.page.y) / dt;\n targetObj.page.vx = targetObj.page.x / dt;\n targetObj.page.vy = targetObj.page.y / dt;\n\n targetObj.client.speed = hypot(targetObj.client.x, targetObj.page.y) / dt;\n targetObj.client.vx = targetObj.client.x / dt;\n targetObj.client.vy = targetObj.client.y / dt;\n },\n\n isNativePointer: function (pointer) {\n return (pointer instanceof dom.Event || pointer instanceof dom.Touch);\n },\n\n // Get specified X/Y coords for mouse or event.touches[0]\n getXY: function (type, pointer, xy) {\n xy = xy || {};\n type = type || 'page';\n\n xy.x = pointer[type + 'X'];\n xy.y = pointer[type + 'Y'];\n\n return xy;\n },\n\n getPageXY: function (pointer, page) {\n page = page || {};\n\n // Opera Mobile handles the viewport and scrolling oddly\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n pointerUtils.getXY('screen', pointer, page);\n\n page.x += window.scrollX;\n page.y += window.scrollY;\n }\n else {\n pointerUtils.getXY('page', pointer, page);\n }\n\n return page;\n },\n\n getClientXY: function (pointer, client) {\n client = client || {};\n\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n // Opera Mobile handles the viewport and scrolling oddly\n pointerUtils.getXY('screen', pointer, client);\n }\n else {\n pointerUtils.getXY('client', pointer, client);\n }\n\n return client;\n },\n\n getPointerId: function (pointer) {\n return is.number(pointer.pointerId)? pointer.pointerId : pointer.identifier;\n },\n\n setCoords: function (targetObj, pointers, timeStamp) {\n const pointer = (pointers.length > 1\n ? pointerUtils.pointerAverage(pointers)\n : pointers[0]);\n\n const tmpXY = {};\n\n pointerUtils.getPageXY(pointer, tmpXY);\n targetObj.page.x = tmpXY.x;\n targetObj.page.y = tmpXY.y;\n\n pointerUtils.getClientXY(pointer, tmpXY);\n targetObj.client.x = tmpXY.x;\n targetObj.client.y = tmpXY.y;\n\n targetObj.timeStamp = is.number(timeStamp) ? timeStamp :new Date().getTime();\n },\n\n pointerExtend: pointerExtend,\n\n getTouchPair: function (event) {\n const touches = [];\n\n // array of touches is supplied\n if (is.array(event)) {\n touches[0] = event[0];\n touches[1] = event[1];\n }\n // an event\n else {\n if (event.type === 'touchend') {\n if (event.touches.length === 1) {\n touches[0] = event.touches[0];\n touches[1] = event.changedTouches[0];\n }\n else if (event.touches.length === 0) {\n touches[0] = event.changedTouches[0];\n touches[1] = event.changedTouches[1];\n }\n }\n else {\n touches[0] = event.touches[0];\n touches[1] = event.touches[1];\n }\n }\n\n return touches;\n },\n\n pointerAverage: function (pointers) {\n const average = {\n pageX : 0,\n pageY : 0,\n clientX: 0,\n clientY: 0,\n screenX: 0,\n screenY: 0,\n };\n\n for (const pointer of pointers) {\n for (const prop in average) {\n average[prop] += pointer[prop];\n }\n }\n for (const prop in average) {\n average[prop] /= pointers.length;\n }\n\n return average;\n },\n\n touchBBox: function (event) {\n if (!event.length && !(event.touches && event.touches.length > 1)) {\n return;\n }\n\n const touches = pointerUtils.getTouchPair(event);\n const minX = Math.min(touches[0].pageX, touches[1].pageX);\n const minY = Math.min(touches[0].pageY, touches[1].pageY);\n const maxX = Math.max(touches[0].pageX, touches[1].pageX);\n const maxY = Math.max(touches[0].pageY, touches[1].pageY);\n\n return {\n x: minX,\n y: minY,\n left: minX,\n top: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n },\n\n touchDistance: function (event, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n\n\n const dx = touches[0][sourceX] - touches[1][sourceX];\n const dy = touches[0][sourceY] - touches[1][sourceY];\n\n return hypot(dx, dy);\n },\n\n touchAngle: function (event, prevAngle, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n const dx = touches[1][sourceX] - touches[0][sourceX];\n const dy = touches[1][sourceY] - touches[0][sourceY];\n const angle = 180 * Math.atan2(dy , dx) / Math.PI;\n\n return angle;\n },\n\n getPointerType: function (pointer, interaction) {\n // if the PointerEvent API isn't available, then the pointer must be ither\n // a MouseEvent or TouchEvent\n if (interaction.mouse) { return 'mouse'; }\n if (!browser.supportsPointerEvent) { return 'touch'; }\n\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : [undefined, undefined,'touch', 'pen', 'mouse'][pointer.pointerType];\n },\n\n // [ event.target, event.currentTarget ]\n getEventTargets: function (event) {\n return [\n domUtils.getActualElement(event.path ? event.path[0] : event.target),\n domUtils.getActualElement(event.currentTarget),\n ];\n },\n};\n\nmodule.exports = pointerUtils;\n","const { window } = require('./window');\n\nconst vendors = ['ms', 'moz', 'webkit', 'o'];\nlet lastTime = 0;\nlet request;\nlet cancel;\n\nfor (let x = 0; x < vendors.length && !window.requestAnimationFrame; x++) {\n request = window[vendors[x] + 'RequestAnimationFrame'];\n cancel = window[vendors[x] +'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n}\n\nif (!request) {\n request = function (callback) {\n const currTime = new Date().getTime();\n const timeToCall = Math.max(0, 16 - (currTime - lastTime));\n const id = setTimeout(function () { callback(currTime + timeToCall); },\n timeToCall);\n\n lastTime = currTime + timeToCall;\n return id;\n };\n}\n\nif (!cancel) {\n cancel = function (id) {\n clearTimeout(id);\n };\n}\n\nmodule.exports = {\n request,\n cancel,\n};\n","const extend = require('./extend');\nconst is = require('./is');\nconst {\n closest,\n parentNode,\n getElementRect,\n} = require('./domUtils');\n\nconst rectUtils = {\n getStringOptionResult: function (value, interactable, element) {\n if (!is.string(value)) {\n return null;\n }\n\n if (value === 'parent') {\n value = parentNode(element);\n }\n else if (value === 'self') {\n value = interactable.getRect(element);\n }\n else {\n value = closest(element, value);\n }\n\n return value;\n },\n\n resolveRectLike: function (value, interactable, element, functionArgs) {\n value = rectUtils.getStringOptionResult(value, interactable, element) || value;\n\n if (is.function(value)) {\n value = value.apply(null, functionArgs);\n }\n\n if (is.element(value)) {\n value = getElementRect(value);\n }\n\n return value;\n },\n\n rectToXY: function (rect) {\n return rect && {\n x: 'x' in rect ? rect.x : rect.left,\n y: 'y' in rect ? rect.y : rect.top,\n };\n },\n\n xywhToTlbr: function (rect) {\n if (rect && !('left' in rect && 'top' in rect)) {\n rect = extend({}, rect);\n\n rect.left = rect.x || 0;\n rect.top = rect.y || 0;\n rect.right = rect.right || (rect.left + rect.width);\n rect.bottom = rect.bottom || (rect.top + rect.height);\n }\n\n return rect;\n },\n\n tlbrToXywh: function (rect) {\n if (rect && !('x' in rect && 'y' in rect)) {\n rect = extend({}, rect);\n\n rect.x = rect.left || 0;\n rect.top = rect.top || 0;\n rect.width = rect.width || (rect.right - rect.x);\n rect.height = rect.height || (rect.bottom - rect.y);\n }\n\n return rect;\n },\n};\n\nmodule.exports = rectUtils;\n","const win = module.exports;\nconst isWindow = require('./isWindow');\n\nfunction init (window) {\n // get wrapped window if using Shadow DOM polyfill\n\n win.realWindow = window;\n\n // create a TextNode\n const el = window.document.createTextNode('');\n\n // check if it's wrapped by a polyfill\n if (el.ownerDocument !== window.document\n && typeof window.wrap === 'function'\n && window.wrap(el) === el) {\n // use wrapped window\n window = window.wrap(window);\n }\n\n win.window = window;\n}\n\nif (typeof window === 'undefined') {\n win.window = undefined;\n win.realWindow = undefined;\n}\nelse {\n init(window);\n}\n\nwin.getWindow = function getWindow (node) {\n if (isWindow(node)) {\n return node;\n }\n\n const rootNode = (node.ownerDocument || node);\n\n return rootNode.defaultView || rootNode.parentWindow || win.window;\n};\n\nwin.init = init;\n"]} \ No newline at end of file +{"version":3,"sources":["src/header.js","node_modules/browser-pack/_prelude.js","index.js","src/Eventable.js","src/InteractEvent.js","src/Interactable.js","src/Interaction.js","src/actions/base.js","src/actions/drag.js","src/actions/drop.js","src/actions/gesture.js","src/actions/resize.js","src/autoScroll.js","src/autoStart/InteractableMethods.js","src/autoStart/base.js","src/autoStart/delay.js","src/autoStart/drag.js","src/autoStart/gesture.js","src/autoStart/resize.js","src/defaultOptions.js","src/index.js","src/inertia.js","src/interact.js","src/interactablePreventDefault.js","src/legacyBrowsers.js","src/modifiers/index.js","src/modifiers/restrict.js","src/modifiers/restrictEdges.js","src/modifiers/restrictSize.js","src/modifiers/snap.js","src/modifiers/snapSize.js","src/pointerEvents/PointerEvent.js","src/pointerEvents/base.js","src/pointerEvents/holdRepeat.js","src/pointerEvents/interactableTargets.js","src/scope.js","src/utils/Signals.js","src/utils/arr.js","src/utils/browser.js","src/utils/domObjects.js","src/utils/domUtils.js","src/utils/events.js","src/utils/extend.js","src/utils/getOriginXY.js","src/utils/hypot.js","src/utils/index.js","src/utils/interactionFinder.js","src/utils/is.js","src/utils/isWindow.js","src/utils/pointerExtend.js","src/utils/pointerUtils.js","src/utils/raf.js","src/utils/rect.js","src/utils/window.js"],"names":[],"mappings":"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","file":"interact.js","sourceRoot":"","sourcesContent":["/**\n * interact.js v1.3.0-alpha.4+sha.7970416-dirty\n *\n * Copyright (c) 2012-2017 Taye Adeyemi \n * Open source under the MIT License.\n * https://raw.github.com/taye/interact.js/master/LICENSE\n */\n","(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o 150) {\n return null;\n }\n\n let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI;\n const overlap = 22.5;\n\n if (angle < 0) {\n angle += 360;\n }\n\n const left = 135 - overlap <= angle && angle < 225 + overlap;\n const up = 225 - overlap <= angle && angle < 315 + overlap;\n\n const right = !left && (315 - overlap <= angle || angle < 45 + overlap);\n const down = !up && 45 - overlap <= angle && angle < 135 + overlap;\n\n return {\n up,\n down,\n left,\n right,\n angle,\n speed: interaction.prevEvent.speed,\n velocity: {\n x: interaction.prevEvent.velocityX,\n y: interaction.prevEvent.velocityY,\n },\n };\n }\n\n preventDefault () {}\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n}\n\nsignals.on('set-delta', function ({ iEvent, interaction, starting, deltaSource }) {\n const prevEvent = starting? iEvent : interaction.prevEvent;\n\n if (deltaSource === 'client') {\n iEvent.dx = iEvent.clientX - prevEvent.clientX;\n iEvent.dy = iEvent.clientY - prevEvent.clientY;\n }\n else {\n iEvent.dx = iEvent.pageX - prevEvent.pageX;\n iEvent.dy = iEvent.pageY - prevEvent.pageY;\n }\n});\n\nInteractEvent.signals = signals;\n\nmodule.exports = InteractEvent;\n","const is = require('./utils/is');\nconst events = require('./utils/events');\nconst extend = require('./utils/extend');\nconst actions = require('./actions/base');\nconst scope = require('./scope');\nconst Eventable = require('./Eventable');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nconst {\n getElementRect,\n nodeContains,\n trySelector,\n} = require('./utils/domUtils');\nconst { getWindow } = require('./utils/window');\nconst { indexOf, contains } = require('./utils/arr');\nconst { wheelEvent } = require('./utils/browser');\n\n// all set interactables\nscope.interactables = [];\n\n/*\\\n * Interactable\n [ property ]\n **\n * Object type returned by @interact\n\\*/\nclass Interactable {\n constructor (target, options) {\n options = options || {};\n\n this.target = target;\n this.events = new Eventable();\n this._context = options.context || scope.document;\n this._win = getWindow(trySelector(target)? this._context : target);\n this._doc = this._win.document;\n\n signals.fire('new', {\n target,\n options,\n interactable: this,\n win: this._win,\n });\n\n scope.addDocument( this._doc, this._win );\n\n scope.interactables.push(this);\n\n this.set(options);\n }\n\n setOnEvents (action, phases) {\n const onAction = 'on' + action;\n\n if (is.function(phases.onstart) ) { this.events[onAction + 'start' ] = phases.onstart ; }\n if (is.function(phases.onmove) ) { this.events[onAction + 'move' ] = phases.onmove ; }\n if (is.function(phases.onend) ) { this.events[onAction + 'end' ] = phases.onend ; }\n if (is.function(phases.oninertiastart)) { this.events[onAction + 'inertiastart' ] = phases.oninertiastart ; }\n\n return this;\n }\n\n setPerAction (action, options) {\n // for all the default per-action options\n for (const option in options) {\n // if this option exists for this action\n if (option in defaults[action]) {\n // if the option in the options arg is an object value\n if (is.object(options[option])) {\n // duplicate the object\n this.options[action][option] = extend(this.options[action][option] || {}, options[option]);\n\n if (is.object(defaults.perAction[option]) && 'enabled' in defaults.perAction[option]) {\n this.options[action][option].enabled = options[option].enabled === false? false : true;\n }\n }\n else if (is.bool(options[option]) && is.object(defaults.perAction[option])) {\n this.options[action][option].enabled = options[option];\n }\n else if (options[option] !== undefined) {\n // or if it's not undefined, do a plain assignment\n this.options[action][option] = options[option];\n }\n }\n }\n }\n\n /*\\\n * Interactable.getRect\n [ method ]\n *\n * The default function to get an Interactables bounding rect. Can be\n * overridden using @Interactable.rectChecker.\n *\n - element (Element) #optional The element to measure.\n = (object) The object's bounding rectangle.\n o {\n o top : 0,\n o left : 0,\n o bottom: 0,\n o right : 0,\n o width : 0,\n o height: 0\n o }\n \\*/\n getRect (element) {\n element = element || this.target;\n\n if (is.string(this.target) && !(is.element(element))) {\n element = this._context.querySelector(this.target);\n }\n\n return getElementRect(element);\n }\n\n /*\\\n * Interactable.rectChecker\n [ method ]\n *\n * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n - checker (function) #optional A function which returns this Interactable's bounding rectangle. See @Interactable.getRect\n = (function | object) The checker function or this Interactable\n \\*/\n rectChecker (checker) {\n if (is.function(checker)) {\n this.getRect = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.getRect;\n\n return this;\n }\n\n return this.getRect;\n }\n\n _backCompatOption (optionName, newValue) {\n if (trySelector(newValue) || is.object(newValue)) {\n this.options[optionName] = newValue;\n\n for (const action of actions.names) {\n this.options[action][optionName] = newValue;\n }\n\n return this;\n }\n\n return this.options[optionName];\n }\n\n /*\\\n * Interactable.origin\n [ method ]\n *\n * Gets or sets the origin of the Interactable's element. The x and y\n * of the origin will be subtracted from action event coordinates.\n *\n - origin (object | string) #optional An object eg. { x: 0, y: 0 } or string 'parent', 'self' or any CSS selector\n * OR\n - origin (Element) #optional An HTML or SVG Element whose rect will be used\n **\n = (object) The current origin or this Interactable\n \\*/\n origin (newValue) {\n return this._backCompatOption('origin', newValue);\n }\n\n /*\\\n * Interactable.deltaSource\n [ method ]\n *\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n - newValue (string) #optional Use 'client' if you will be scrolling while interacting; Use 'page' if you want autoScroll to work\n = (string | object) The current deltaSource or this Interactable\n \\*/\n deltaSource (newValue) {\n if (newValue === 'page' || newValue === 'client') {\n this.options.deltaSource = newValue;\n\n return this;\n }\n\n return this.options.deltaSource;\n }\n\n /*\\\n * Interactable.context\n [ method ]\n *\n * Gets the selector context Node of the Interactable. The default is `window.document`.\n *\n = (Node) The context Node of this Interactable\n **\n \\*/\n context () {\n return this._context;\n }\n\n inContext (element) {\n return (this._context === element.ownerDocument\n || nodeContains(this._context, element));\n }\n\n /*\\\n * Interactable.fire\n [ method ]\n *\n * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n - iEvent (InteractEvent) The InteractEvent object to be fired on this Interactable\n = (Interactable) this Interactable\n \\*/\n fire (iEvent) {\n this.events.fire(iEvent);\n\n return this;\n }\n\n _onOffMultiple (method, eventType, listener, options) {\n if (is.string(eventType) && eventType.search(' ') !== -1) {\n eventType = eventType.trim().split(/ +/);\n }\n\n if (is.array(eventType)) {\n for (let i = 0; i < eventType.length; i++) {\n this[method](eventType[i], listener, options);\n }\n\n return true;\n }\n\n if (is.object(eventType)) {\n for (const prop in eventType) {\n this[method](prop, eventType[prop], listener);\n }\n\n return true;\n }\n }\n\n /*\\\n * Interactable.on\n [ method ]\n *\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n - eventType (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) This Interactable\n \\*/\n on (eventType, listener, options) {\n if (this._onOffMultiple('on', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.on(eventType, listener);\n }\n // delegated event for selector\n else if (is.string(this.target)) {\n events.addDelegate(this.target, this._context, eventType, listener, options);\n }\n else {\n events.add(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.off\n [ method ]\n *\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n - eventType (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) This Interactable\n \\*/\n off (eventType, listener, options) {\n if (this._onOffMultiple('off', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n // if it is an action event type\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.off(eventType, listener);\n }\n // delegated event\n else if (is.string(this.target)) {\n events.removeDelegate(this.target, this._context, eventType, listener, options);\n }\n // remove listener from this Interatable's element\n else {\n events.remove(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.set\n [ method ]\n *\n * Reset the options of this Interactable\n - options (object) The new settings to apply\n = (object) This Interactable\n \\*/\n set (options) {\n if (!is.object(options)) {\n options = {};\n }\n\n this.options = extend({}, defaults.base);\n\n const perActions = extend({}, defaults.perAction);\n\n for (const actionName in actions.methodDict) {\n const methodName = actions.methodDict[actionName];\n\n this.options[actionName] = extend({}, defaults[actionName]);\n\n this.setPerAction(actionName, perActions);\n\n this[methodName](options[actionName]);\n }\n\n for (const setting of Interactable.settingsMethods) {\n this.options[setting] = defaults.base[setting];\n\n if (setting in options) {\n this[setting](options[setting]);\n }\n }\n\n signals.fire('set', {\n options,\n interactable: this,\n });\n\n return this;\n }\n\n /*\\\n * Interactable.unset\n [ method ]\n *\n * Remove this interactable from the list of interactables and remove\n * it's action capabilities and event listeners\n *\n = (object) @interact\n \\*/\n unset () {\n events.remove(this.target, 'all');\n\n if (is.string(this.target)) {\n // remove delegated events\n for (const type in events.delegatedEvents) {\n const delegated = events.delegatedEvents[type];\n\n if (delegated.selectors[0] === this.target\n && delegated.contexts[0] === this._context) {\n\n delegated.selectors.splice(0, 1);\n delegated.contexts .splice(0, 1);\n delegated.listeners.splice(0, 1);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegated[type] = null;\n }\n }\n\n events.remove(this._context, type, events.delegateListener);\n events.remove(this._context, type, events.delegateUseCapture, true);\n }\n }\n else {\n events.remove(this, 'all');\n }\n\n signals.fire('unset', { interactable: this });\n\n scope.interactables.splice(indexOf(scope.interactables, this), 1);\n\n // Stop related interactions when an Interactable is unset\n for (const interaction of scope.interactions || []) {\n if (interaction.target === this && interaction.interacting()) {\n interaction.stop();\n }\n }\n\n return scope.interact;\n }\n}\n\nscope.interactables.indexOfElement = function indexOfElement (target, context) {\n context = context || scope.document;\n\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n if (interactable.target === target && interactable._context === context) {\n return i;\n }\n }\n return -1;\n};\n\nscope.interactables.get = function interactableGet (element, options, dontCheckInContext) {\n const ret = this[this.indexOfElement(element, options && options.context)];\n\n return ret && (is.string(element) || dontCheckInContext || ret.inContext(element))? ret : null;\n};\n\nscope.interactables.forEachSelector = function (callback, element) {\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n // skip non CSS selector targets and out of context elements\n if (!is.string(interactable.target)\n || (element && !interactable.inContext(element))) {\n continue;\n }\n\n const ret = callback(interactable, interactable.target, interactable._context, i, this);\n\n if (ret !== undefined) {\n return ret;\n }\n }\n};\n\n// all interact.js eventTypes\nInteractable.eventTypes = scope.eventTypes = [];\n\nInteractable.signals = signals;\n\nInteractable.settingsMethods = [ 'deltaSource', 'origin', 'preventDefault', 'rectChecker' ];\n\nmodule.exports = Interactable;\n","const scope = require('./scope');\nconst utils = require('./utils');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst domObjects = require('./utils/domObjects');\nconst finder = require('./utils/interactionFinder');\nconst signals = require('./utils/Signals').new();\n\nconst listeners = {};\nconst methodNames = [\n 'pointerDown', 'pointerMove', 'pointerUp',\n 'updatePointer', 'removePointer',\n];\n\n// for ignoring browser's simulated mouse events\nlet prevTouchTime = 0;\n\n// all active and idle interactions\nscope.interactions = [];\n\nclass Interaction {\n constructor ({ pointerType }) {\n this.target = null; // current interactable being interacted with\n this.element = null; // the target element of the interactable\n\n this.prepared = { // action that's ready to be fired on next move event\n name : null,\n axis : null,\n edges: null,\n };\n\n // keep track of added pointers\n this.pointers = [];\n this.pointerIds = [];\n this.downTargets = [];\n this.downTimes = [];\n\n // Previous native pointer move event coordinates\n this.prevCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n // current native pointer move event coordinates\n this.curCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Starting InteractEvent pointer coordinates\n this.startCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Change in coordinates and time of the pointer\n this.pointerDelta = {\n page : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n client : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n timeStamp: 0,\n };\n\n this.downEvent = null; // pointerdown/mousedown/touchstart event\n this.downPointer = {};\n\n this._eventTarget = null;\n this._curEventTarget = null;\n\n this.prevEvent = null; // previous action event\n\n this.pointerIsDown = false;\n this.pointerWasMoved = false;\n this._interacting = false;\n\n this.pointerType = pointerType;\n\n signals.fire('new', this);\n\n scope.interactions.push(this);\n }\n\n pointerDown (pointer, event, eventTarget) {\n const pointerIndex = this.updatePointer(pointer, event, true);\n\n signals.fire('down', {\n pointer,\n event,\n eventTarget,\n pointerIndex,\n interaction: this,\n });\n }\n\n /*\\\n * Interaction.start\n [ method ]\n *\n * Start an action with the given Interactable and Element as tartgets. The\n * action must be enabled for the target Interactable and an appropriate number\n * of pointers must be held down - 1 for drag/resize, 2 for gesture.\n *\n * Use it with `interactable.able({ manualStart: false })` to always\n * [start actions manually](https://github.com/taye/interact.js/issues/114)\n *\n - action (object) The action to be performed - drag, resize, etc.\n - target (Interactable) The Interactable to target\n - element (Element) The DOM Element to target\n = (object) interact\n **\n | interact(target)\n | .draggable({\n | // disable the default drag start by down->move\n | manualStart: true\n | })\n | // start dragging after the user holds the pointer down\n | .on('hold', function (event) {\n | var interaction = event.interaction;\n |\n | if (!interaction.interacting()) {\n | interaction.start({ name: 'drag' },\n | event.interactable,\n | event.currentTarget);\n | }\n | });\n \\*/\n start (action, target, element) {\n if (this.interacting()\n || !this.pointerIsDown\n || this.pointerIds.length < (action.name === 'gesture'? 2 : 1)) {\n return;\n }\n\n // if this interaction had been removed after stopping\n // add it back\n if (utils.indexOf(scope.interactions, this) === -1) {\n scope.interactions.push(this);\n }\n\n utils.copyAction(this.prepared, action);\n this.target = target;\n this.element = element;\n\n signals.fire('action-start', {\n interaction: this,\n event: this.downEvent,\n });\n }\n\n pointerMove (pointer, event, eventTarget) {\n if (!this.simulation) {\n this.updatePointer(pointer);\n utils.setCoords(this.curCoords, this.pointers);\n }\n\n const duplicateMove = (this.curCoords.page.x === this.prevCoords.page.x\n && this.curCoords.page.y === this.prevCoords.page.y\n && this.curCoords.client.x === this.prevCoords.client.x\n && this.curCoords.client.y === this.prevCoords.client.y);\n\n let dx;\n let dy;\n\n // register movement greater than pointerMoveTolerance\n if (this.pointerIsDown && !this.pointerWasMoved) {\n dx = this.curCoords.client.x - this.startCoords.client.x;\n dy = this.curCoords.client.y - this.startCoords.client.y;\n\n this.pointerWasMoved = utils.hypot(dx, dy) > Interaction.pointerMoveTolerance;\n }\n\n const signalArg = {\n pointer,\n pointerIndex: this.getPointerIndex(pointer),\n event,\n eventTarget,\n dx,\n dy,\n duplicate: duplicateMove,\n interaction: this,\n interactingBeforeMove: this.interacting(),\n };\n\n if (!duplicateMove) {\n // set pointer coordinate, time changes and speeds\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n }\n\n signals.fire('move', signalArg);\n\n if (!duplicateMove) {\n // if interacting, fire an 'action-move' signal etc\n if (this.interacting()) {\n this.doMove(signalArg);\n }\n\n if (this.pointerWasMoved) {\n utils.copyCoords(this.prevCoords, this.curCoords);\n }\n }\n }\n\n /*\\\n * Interaction.doMove\n [ method ]\n *\n * Force a move of the current action at the same coordinates. Useful if\n * snap/restrict has been changed and you want a movement with the new\n * settings.\n *\n **\n | interact(target)\n | .draggable(true)\n | .on('dragmove', function (event) {\n | if (someCondition) {\n | // change the snap settings\n | event.interactable.draggable({ snap: { targets: [] }});\n | // fire another move event with re-calculated snap\n | event.interaction.doMove();\n | }\n | });\n \\*/\n doMove (signalArg) {\n signalArg = utils.extend({\n pointer: this.pointers[0],\n event: this.prevEvent,\n eventTarget: this._eventTarget,\n interaction: this,\n }, signalArg || {});\n\n signals.fire('before-action-move', signalArg);\n\n if (!this._dontFireMove) {\n signals.fire('action-move', signalArg);\n }\n\n this._dontFireMove = false;\n }\n\n // End interact move events and stop auto-scroll unless simulation is running\n pointerUp (pointer, event, eventTarget, curEventTarget) {\n const pointerIndex = this.getPointerIndex(pointer);\n\n signals.fire(/cancel$/i.test(event.type)? 'cancel' : 'up', {\n pointer,\n pointerIndex,\n event,\n eventTarget,\n curEventTarget,\n interaction: this,\n });\n\n if (!this.simulation) {\n this.end(event);\n }\n\n this.pointerIsDown = false;\n this.removePointer(pointer, event);\n }\n\n /*\\\n * Interaction.end\n [ method ]\n *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n - event (PointerEvent) #optional\n **\n | interact(target)\n | .draggable(true)\n | .on('move', function (event) {\n | if (event.pageX > 1000) {\n | // end the current action\n | event.interaction.end();\n | // stop all further listeners from being called\n | event.stopImmediatePropagation();\n | }\n | });\n \\*/\n end (event) {\n event = event || this.prevEvent;\n\n if (this.interacting()) {\n signals.fire('action-end', {\n event,\n interaction: this,\n });\n }\n\n this.stop();\n }\n\n currentAction () {\n return this._interacting? this.prepared.name: null;\n }\n\n interacting () {\n return this._interacting;\n }\n\n stop () {\n signals.fire('stop', { interaction: this });\n\n if (this._interacting) {\n signals.fire('stop-active', { interaction: this });\n signals.fire('stop-' + this.prepared.name, { interaction: this });\n }\n\n this.target = this.element = null;\n\n this._interacting = false;\n this.prepared.name = this.prevEvent = null;\n }\n\n getPointerIndex (pointer) {\n // mouse and pen interactions may have only one pointer\n if (this.pointerType === 'mouse' || this.pointerType === 'pen') {\n return 0;\n }\n\n return utils.indexOf(this.pointerIds, utils.getPointerId(pointer));\n }\n\n updatePointer (pointer, event, down = event && /(down|start)$/i.test(event.type)) {\n const id = utils.getPointerId(pointer);\n let index = this.getPointerIndex(pointer);\n\n if (index === -1) {\n index = this.pointerIds.length;\n this.pointerIds[index] = id;\n }\n\n if (down) {\n signals.fire('update-pointer-down', {\n pointer,\n event,\n down,\n pointerId: id,\n pointerIndex: index,\n interaction: this,\n });\n }\n\n this.pointers[index] = pointer;\n\n return index;\n }\n\n removePointer (pointer, event) {\n const index = this.getPointerIndex(pointer);\n\n if (index === -1) { return; }\n\n signals.fire('remove-pointer', {\n pointer,\n event,\n pointerIndex: index,\n interaction: this,\n });\n\n this.pointers .splice(index, 1);\n this.pointerIds .splice(index, 1);\n this.downTargets.splice(index, 1);\n this.downTimes .splice(index, 1);\n }\n\n _updateEventTargets (target, currentTarget) {\n this._eventTarget = target;\n this._curEventTarget = currentTarget;\n }\n}\n\nfor (let i = 0, len = methodNames.length; i < len; i++) {\n const method = methodNames[i];\n\n listeners[method] = doOnInteractions(method);\n}\n\nfunction doOnInteractions (method) {\n return (function (event) {\n const pointerType = utils.getPointerType(event);\n const [eventTarget, curEventTarget] = utils.getEventTargets(event);\n const matches = []; // [ [pointer, interaction], ...]\n\n if (browser.supportsTouch && /touch/.test(event.type)) {\n prevTouchTime = new Date().getTime();\n\n for (let i = 0; i < event.changedTouches.length; i++) {\n const pointer = event.changedTouches[i];\n const interaction = finder.search(pointer, event.type, eventTarget);\n\n matches.push([pointer, interaction || new Interaction({ pointerType })]);\n }\n }\n else {\n let invalidPointer = false;\n\n if (!browser.supportsPointerEvent && /mouse/.test(event.type)) {\n // ignore mouse events while touch interactions are active\n for (let i = 0; i < scope.interactions.length && !invalidPointer; i++) {\n invalidPointer = scope.interactions[i].pointerType !== 'mouse' && scope.interactions[i].pointerIsDown;\n }\n\n // try to ignore mouse events that are simulated by the browser\n // after a touch event\n invalidPointer = invalidPointer\n || (new Date().getTime() - prevTouchTime < 500)\n // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated\n || event.timeStamp === 0;\n }\n\n if (!invalidPointer) {\n let interaction = finder.search(event, event.type, eventTarget);\n\n if (!interaction) {\n interaction = new Interaction({ pointerType });\n }\n\n matches.push([event, interaction]);\n }\n }\n\n for (const [pointer, interaction] of matches) {\n interaction._updateEventTargets(eventTarget, curEventTarget);\n interaction[method](pointer, event, eventTarget, curEventTarget);\n }\n });\n}\n\nfunction endAll (event) {\n for (let i = 0; i < scope.interactions.length; i++) {\n const interaction = scope.interactions[i];\n\n interaction.end(event);\n signals.fire('endall', { event, interaction });\n }\n}\n\nconst docEvents = { /* 'eventType': listenerFunc */ };\nconst pEventTypes = browser.pEventTypes;\n\nif (domObjects.PointerEvent) {\n docEvents[pEventTypes.down ] = listeners.pointerDown;\n docEvents[pEventTypes.move ] = listeners.pointerMove;\n docEvents[pEventTypes.up ] = listeners.pointerUp;\n docEvents[pEventTypes.cancel] = listeners.pointerUp;\n}\nelse {\n docEvents.mousedown = listeners.pointerDown;\n docEvents.mousemove = listeners.pointerMove;\n docEvents.mouseup = listeners.pointerUp;\n\n docEvents.touchstart = listeners.pointerDown;\n docEvents.touchmove = listeners.pointerMove;\n docEvents.touchend = listeners.pointerUp;\n docEvents.touchcancel = listeners.pointerUp;\n}\n\ndocEvents.blur = endAll;\n\nfunction onDocSignal ({ doc }, signalName) {\n const eventMethod = signalName.indexOf('add') === 0\n ? events.add : events.remove;\n\n // delegate event listener\n for (const eventType in scope.delegatedEvents) {\n eventMethod(doc, eventType, events.delegateListener);\n eventMethod(doc, eventType, events.delegateUseCapture, true);\n }\n\n for (const eventType in docEvents) {\n eventMethod(doc, eventType, docEvents[eventType]);\n }\n}\n\nsignals.on('update-pointer-down', ({ interaction, pointer, pointerId, pointerIndex, event, eventTarget, down }) => {\n interaction.pointerIds[pointerIndex] = pointerId;\n interaction.pointers[pointerIndex] = pointer;\n\n if (down) {\n interaction.pointerIsDown = true;\n }\n\n if (!interaction.interacting()) {\n utils.setCoords(interaction.startCoords, interaction.pointers);\n\n utils.copyCoords(interaction.curCoords , interaction.startCoords);\n utils.copyCoords(interaction.prevCoords, interaction.startCoords);\n\n interaction.downEvent = event;\n interaction.downTimes[pointerIndex] = interaction.curCoords.timeStamp;\n interaction.downTargets[pointerIndex] = eventTarget || event && utils.getEventTargets(event)[0];\n interaction.pointerWasMoved = false;\n\n utils.pointerExtend(interaction.downPointer, pointer);\n }\n});\n\nscope.signals.on('add-document' , onDocSignal);\nscope.signals.on('remove-document', onDocSignal);\n\nInteraction.pointerMoveTolerance = 1;\nInteraction.doOnInteractions = doOnInteractions;\nInteraction.endAll = endAll;\nInteraction.signals = signals;\nInteraction.docEvents = docEvents;\n\nscope.endAllInteractions = endAll;\n\nmodule.exports = Interaction;\n","const Interaction = require('../Interaction');\nconst InteractEvent = require('../InteractEvent');\n\nconst actions = {\n firePrepared,\n names: [],\n methodDict: {},\n};\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n interaction._interacting = true;\n firePrepared(interaction, event, 'start');\n});\n\nInteraction.signals.on('action-move', function ({ interaction, event, preEnd }) {\n firePrepared(interaction, event, 'move', preEnd);\n\n // if the action was ended in a listener\n if (!interaction.interacting()) { return false; }\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n firePrepared(interaction, event, 'end');\n});\n\nfunction firePrepared (interaction, event, phase, preEnd) {\n const actionName = interaction.prepared.name;\n\n const newEvent = new InteractEvent(interaction, event, actionName, phase, interaction.element, null, preEnd);\n\n interaction.target.fire(newEvent);\n interaction.prevEvent = newEvent;\n}\n\nmodule.exports = actions;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drag = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n startAxis : 'xy',\n lockAxis : 'xy',\n },\n\n checker: function (pointer, event, interactable) {\n const dragOptions = interactable.options.drag;\n\n return dragOptions.enabled\n ? { name: 'drag', axis: (dragOptions.lockAxis === 'start'\n ? dragOptions.startAxis\n : dragOptions.lockAxis)}\n : null;\n },\n\n getCursor: function () {\n return 'move';\n },\n};\n\nInteraction.signals.on('before-action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n interaction.curCoords.page.y = interaction.startCoords.page.y;\n interaction.curCoords.client.y = interaction.startCoords.client.y;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vx);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vx);\n interaction.pointerDelta.client.vy = 0;\n interaction.pointerDelta.page.vy = 0;\n }\n else if (axis === 'y') {\n interaction.curCoords.page.x = interaction.startCoords.page.x;\n interaction.curCoords.client.x = interaction.startCoords.client.x;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vy);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vy);\n interaction.pointerDelta.client.vx = 0;\n interaction.pointerDelta.page.vx = 0;\n }\n});\n\n// dragmove\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'dragmove') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n iEvent.pageY = interaction.startCoords.page.y;\n iEvent.clientY = interaction.startCoords.client.y;\n iEvent.dy = 0;\n }\n else if (axis === 'y') {\n iEvent.pageX = interaction.startCoords.page.x;\n iEvent.clientX = interaction.startCoords.client.x;\n iEvent.dx = 0;\n }\n});\n\n/*\\\n * Interactable.draggable\n [ method ]\n *\n * Gets or sets whether drag actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of drag events\n | var isDraggable = interact('ul li').draggable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on drag events (object makes the Interactable draggable)\n = (object) This Interactable\n | interact(element).draggable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // the axis in which the first movement must be\n | // for the drag sequence to start\n | // 'xy' by default - any direction\n | startAxis: 'x' || 'y' || 'xy',\n |\n | // 'xy' by default - don't restrict to one axis (move in any direction)\n | // 'x' or 'y' to restrict movement to either axis\n | // 'start' to restrict movement to the axis the drag started in\n | lockAxis: 'x' || 'y' || 'xy' || 'start',\n |\n | // max number of drags that can happen concurrently\n | // with elements of this Interactable. Infinity by default\n | max: Infinity,\n |\n | // max number of drags that can target the same element+Interactable\n | // 1 by default\n | maxPerElement: 2\n | });\n\\*/\nInteractable.prototype.draggable = function (options) {\n if (utils.is.object(options)) {\n this.options.drag.enabled = options.enabled === false? false: true;\n this.setPerAction('drag', options);\n this.setOnEvents('drag', options);\n\n if (/^(xy|x|y|start)$/.test(options.lockAxis)) {\n this.options.drag.lockAxis = options.lockAxis;\n }\n if (/^(xy|x|y)$/.test(options.startAxis)) {\n this.options.drag.startAxis = options.startAxis;\n }\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drag.enabled = options;\n\n if (!options) {\n this.ondragstart = this.ondragstart = this.ondragend = null;\n }\n\n return this;\n }\n\n return this.options.drag;\n};\n\nactions.drag = drag;\nactions.names.push('drag');\nutils.merge(Interactable.eventTypes, [\n 'dragstart',\n 'dragmove',\n 'draginertiastart',\n 'draginertiaresume',\n 'dragend',\n]);\nactions.methodDict.drag = 'draggable';\n\ndefaultOptions.drag = drag.defaults;\n\nmodule.exports = drag;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst scope = require('../scope');\nconst interact = require('../interact');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drop = {\n defaults: {\n enabled: false,\n accept : null,\n overlap: 'pointer',\n },\n};\n\nlet dynamicDrop = false;\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // reset active dropzones\n interaction.activeDrops.dropzones = [];\n interaction.activeDrops.elements = [];\n interaction.activeDrops.rects = [];\n\n interaction.dropEvents = null;\n\n if (!interaction.dynamicDrop) {\n setActiveDrops(interaction, interaction.element);\n }\n\n const dragEvent = interaction.prevEvent;\n const dropEvents = getDropEvents(interaction, event, dragEvent);\n\n if (dropEvents.activate) {\n fireActiveDrops(interaction, dropEvents.activate);\n }\n});\n\nInteractEvent.signals.on('new', function ({ interaction, iEvent, event }) {\n if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { return; }\n\n const draggableElement = interaction.element;\n const dragEvent = iEvent;\n const dropResult = getDrop(dragEvent, event, draggableElement);\n\n interaction.dropTarget = dropResult.dropzone;\n interaction.dropElement = dropResult.element;\n\n interaction.dropEvents = getDropEvents(interaction, event, dragEvent);\n});\n\nInteraction.signals.on('action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n fireDropEvents(interaction, interaction.dropEvents);\n});\n\nInteraction.signals.on('action-end', function ({ interaction }) {\n if (interaction.prepared.name === 'drag') {\n fireDropEvents(interaction, interaction.dropEvents);\n }\n});\n\nInteraction.signals.on('stop-drag', function ({ interaction }) {\n interaction.activeDrops.dropzones =\n interaction.activeDrops.elements =\n interaction.activeDrops.rects =\n interaction.dropEvents = null;\n});\n\nfunction collectDrops (interaction, element) {\n const drops = [];\n const elements = [];\n\n element = element || interaction.element;\n\n // collect all dropzones and their elements which qualify for a drop\n for (const current of scope.interactables) {\n if (!current.options.drop.enabled) { continue; }\n\n const accept = current.options.drop.accept;\n\n // test the draggable element against the dropzone's accept setting\n if ((utils.is.element(accept) && accept !== element)\n || (utils.is.string(accept)\n && !utils.matchesSelector(element, accept))) {\n\n continue;\n }\n\n // query for new elements if necessary\n const dropElements = utils.is.string(current.target)\n ? current._context.querySelectorAll(current.target)\n : [current.target];\n\n for (let i = 0; i < dropElements.length; i++) {\n const currentElement = dropElements[i];\n\n if (currentElement !== element) {\n drops.push(current);\n elements.push(currentElement);\n }\n }\n }\n\n return {\n elements,\n dropzones: drops,\n };\n}\n\nfunction fireActiveDrops (interaction, event) {\n let prevElement;\n\n // loop through all active dropzones and trigger event\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n const current = interaction.activeDrops.dropzones[i];\n const currentElement = interaction.activeDrops.elements [i];\n\n // prevent trigger of duplicate events on same element\n if (currentElement !== prevElement) {\n // set current element as event target\n event.target = currentElement;\n current.fire(event);\n }\n prevElement = currentElement;\n }\n}\n\n// Collect a new set of possible drops and save them in activeDrops.\n// setActiveDrops should always be called when a drag has just started or a\n// drag event happens while dynamicDrop is true\nfunction setActiveDrops (interaction, dragElement) {\n // get dropzones and their elements that could receive the draggable\n const possibleDrops = collectDrops(interaction, dragElement, true);\n\n interaction.activeDrops.dropzones = possibleDrops.dropzones;\n interaction.activeDrops.elements = possibleDrops.elements;\n interaction.activeDrops.rects = [];\n\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n interaction.activeDrops.rects[i] =\n interaction.activeDrops.dropzones[i].getRect(interaction.activeDrops.elements[i]);\n }\n}\n\nfunction getDrop (dragEvent, event, dragElement) {\n const interaction = dragEvent.interaction;\n const validDrops = [];\n\n if (dynamicDrop) {\n setActiveDrops(interaction, dragElement);\n }\n\n // collect all dropzones and their elements which qualify for a drop\n for (let j = 0; j < interaction.activeDrops.dropzones.length; j++) {\n const current = interaction.activeDrops.dropzones[j];\n const currentElement = interaction.activeDrops.elements [j];\n const rect = interaction.activeDrops.rects [j];\n\n validDrops.push(current.dropCheck(dragEvent, event, interaction.target, dragElement, currentElement, rect)\n ? currentElement\n : null);\n }\n\n // get the most appropriate dropzone based on DOM depth and order\n const dropIndex = utils.indexOfDeepestElement(validDrops);\n\n return {\n dropzone: interaction.activeDrops.dropzones[dropIndex] || null,\n element : interaction.activeDrops.elements [dropIndex] || null,\n };\n}\n\nfunction getDropEvents (interaction, pointerEvent, dragEvent) {\n const dropEvents = {\n enter : null,\n leave : null,\n activate : null,\n deactivate: null,\n move : null,\n drop : null,\n };\n\n const tmpl = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n };\n\n if (interaction.dropElement !== interaction.prevDropElement) {\n // if there was a prevDropTarget, create a dragleave event\n if (interaction.prevDropTarget) {\n dropEvents.leave = utils.extend({ type: 'dragleave' }, tmpl);\n\n dragEvent.dragLeave = dropEvents.leave.target = interaction.prevDropElement;\n dragEvent.prevDropzone = dropEvents.leave.dropzone = interaction.prevDropTarget;\n }\n // if the dropTarget is not null, create a dragenter event\n if (interaction.dropTarget) {\n dropEvents.enter = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n type : 'dragenter',\n };\n\n dragEvent.dragEnter = interaction.dropElement;\n dragEvent.dropzone = interaction.dropTarget;\n }\n }\n\n if (dragEvent.type === 'dragend' && interaction.dropTarget) {\n dropEvents.drop = utils.extend({ type: 'drop' }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n dragEvent.relatedTarget = interaction.dropElement;\n }\n if (dragEvent.type === 'dragstart') {\n dropEvents.activate = utils.extend({ type: 'dropactivate' }, tmpl);\n\n dropEvents.activate.target = null;\n dropEvents.activate.dropzone = null;\n }\n if (dragEvent.type === 'dragend') {\n dropEvents.deactivate = utils.extend({ type: 'dropdeactivate' }, tmpl);\n\n dropEvents.deactivate.target = null;\n dropEvents.deactivate.dropzone = null;\n }\n if (dragEvent.type === 'dragmove' && interaction.dropTarget) {\n dropEvents.move = utils.extend({\n dragmove : dragEvent,\n type : 'dropmove',\n }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n }\n\n return dropEvents;\n}\n\nfunction fireDropEvents (interaction, dropEvents) {\n if (dropEvents.leave) { interaction.prevDropTarget.fire(dropEvents.leave); }\n if (dropEvents.move ) { interaction.dropTarget.fire(dropEvents.move ); }\n if (dropEvents.enter) { interaction.dropTarget.fire(dropEvents.enter); }\n if (dropEvents.drop ) { interaction.dropTarget.fire(dropEvents.drop ); }\n if (dropEvents.deactivate) {\n fireActiveDrops(interaction, dropEvents.deactivate);\n }\n\n interaction.prevDropTarget = interaction.dropTarget;\n interaction.prevDropElement = interaction.dropElement;\n}\n\n/*\\\n * Interactable.dropzone\n [ method ]\n *\n * Returns or sets whether elements can be dropped onto this\n * Interactable to trigger drop events\n *\n * Dropzones can receive the following events:\n * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends\n * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone\n * - `dragmove` when a draggable that has entered the dropzone is moved\n * - `drop` when a draggable is dropped into this dropzone\n *\n * Use the `accept` option to allow only elements that match the given CSS\n * selector or element. The value can be:\n *\n * - **an Element** - only that element can be dropped into this dropzone.\n * - **a string**, - the element being dragged must match it as a CSS selector.\n * - **`null`** - accept options is cleared - it accepts any element.\n *\n * Use the `overlap` option to set how drops are checked for. The allowed\n * values are:\n *\n * - `'pointer'`, the pointer must be over the dropzone (default)\n * - `'center'`, the draggable element's center must be over the dropzone\n * - a number from 0-1 which is the `(intersection area) / (draggable area)`.\n * e.g. `0.5` for drop to happen when half of the area of the draggable is\n * over the dropzone\n *\n * Use the `checker` option to specify a function to check if a dragged\n * element is over this Interactable.\n *\n | interact(target)\n | .dropChecker(function(dragEvent, // related dragmove or dragend event\n | event, // TouchEvent/PointerEvent/MouseEvent\n | dropped, // bool result of the default checker\n | dropzone, // dropzone Interactable\n | dropElement, // dropzone elemnt\n | draggable, // draggable Interactable\n | draggableElement) {// draggable element\n |\n | return dropped && event.target.hasAttribute('allow-drop');\n | }\n *\n *\n - options (boolean | object | null) #optional The new value to be set.\n | interact('.drop').dropzone({\n | accept: '.can-drop' || document.getElementById('single-drop'),\n | overlap: 'pointer' || 'center' || zeroToOne\n | }\n = (boolean | object) The current setting or this Interactable\n\\*/\nInteractable.prototype.dropzone = function (options) {\n if (utils.is.object(options)) {\n this.options.drop.enabled = options.enabled === false? false: true;\n\n if (utils.is.function(options.ondrop) ) { this.events.ondrop = options.ondrop ; }\n if (utils.is.function(options.ondropactivate) ) { this.events.ondropactivate = options.ondropactivate ; }\n if (utils.is.function(options.ondropdeactivate)) { this.events.ondropdeactivate = options.ondropdeactivate; }\n if (utils.is.function(options.ondragenter) ) { this.events.ondragenter = options.ondragenter ; }\n if (utils.is.function(options.ondragleave) ) { this.events.ondragleave = options.ondragleave ; }\n if (utils.is.function(options.ondropmove) ) { this.events.ondropmove = options.ondropmove ; }\n\n if (/^(pointer|center)$/.test(options.overlap)) {\n this.options.drop.overlap = options.overlap;\n }\n else if (utils.is.number(options.overlap)) {\n this.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0);\n }\n if ('accept' in options) {\n this.options.drop.accept = options.accept;\n }\n if ('checker' in options) {\n this.options.drop.checker = options.checker;\n }\n\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drop.enabled = options;\n\n if (!options) {\n this.ondragenter = this.ondragleave = this.ondrop\n = this.ondropactivate = this.ondropdeactivate = null;\n }\n\n return this;\n }\n\n return this.options.drop;\n};\n\nInteractable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) {\n let dropped = false;\n\n // if the dropzone has no rect (eg. display: none)\n // call the custom dropChecker or just return false\n if (!(rect = rect || this.getRect(dropElement))) {\n return (this.options.drop.checker\n ? this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement)\n : false);\n }\n\n const dropOverlap = this.options.drop.overlap;\n\n if (dropOverlap === 'pointer') {\n const origin = utils.getOriginXY(draggable, draggableElement, 'drag');\n const page = utils.getPageXY(dragEvent);\n\n page.x += origin.x;\n page.y += origin.y;\n\n const horizontal = (page.x > rect.left) && (page.x < rect.right);\n const vertical = (page.y > rect.top ) && (page.y < rect.bottom);\n\n dropped = horizontal && vertical;\n }\n\n const dragRect = draggable.getRect(draggableElement);\n\n if (dragRect && dropOverlap === 'center') {\n const cx = dragRect.left + dragRect.width / 2;\n const cy = dragRect.top + dragRect.height / 2;\n\n dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom;\n }\n\n if (dragRect && utils.is.number(dropOverlap)) {\n const overlapArea = (Math.max(0, Math.min(rect.right , dragRect.right ) - Math.max(rect.left, dragRect.left))\n * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top , dragRect.top )));\n\n const overlapRatio = overlapArea / (dragRect.width * dragRect.height);\n\n dropped = overlapRatio >= dropOverlap;\n }\n\n if (this.options.drop.checker) {\n dropped = this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement);\n }\n\n return dropped;\n};\n\nInteractable.signals.on('unset', function ({ interactable }) {\n interactable.dropzone(false);\n});\n\nInteractable.settingsMethods.push('dropChecker');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.dropTarget = null; // the dropzone a drag target might be dropped into\n interaction.dropElement = null; // the element at the time of checking\n interaction.prevDropTarget = null; // the dropzone that was recently dragged away from\n interaction.prevDropElement = null; // the element at the time of checking\n interaction.dropEvents = null; // the dropEvents related to the current drag event\n\n interaction.activeDrops = {\n dropzones: [], // the dropzones that are mentioned below\n elements : [], // elements of dropzones that accept the target draggable\n rects : [], // the rects of the elements mentioned above\n };\n\n});\n\nInteraction.signals.on('stop', function ({ interaction }) {\n interaction.dropTarget = interaction.dropElement =\n interaction.prevDropTarget = interaction.prevDropElement = null;\n});\n\n/*\\\n * interact.dynamicDrop\n [ method ]\n *\n * Returns or sets whether the dimensions of dropzone elements are\n * calculated on every dragmove or only on dragstart for the default\n * dropChecker\n *\n - newValue (boolean) #optional True to check on each move. False to check only before start\n = (boolean | interact) The current setting or interact\n\\*/\ninteract.dynamicDrop = function (newValue) {\n if (utils.is.bool(newValue)) {\n //if (dragging && dynamicDrop !== newValue && !newValue) {\n //calcRects(dropzones);\n //}\n\n dynamicDrop = newValue;\n\n return interact;\n }\n return dynamicDrop;\n};\n\nutils.merge(Interactable.eventTypes, [\n 'dragenter',\n 'dragleave',\n 'dropactivate',\n 'dropdeactivate',\n 'dropmove',\n 'drop',\n]);\nactions.methodDict.drop = 'dropzone';\n\ndefaultOptions.drop = drop.defaults;\n\nmodule.exports = drop;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst gesture = {\n defaults: {\n enabled : false,\n origin : null,\n restrict: null,\n },\n\n checker: function (pointer, event, interactable, element, interaction) {\n if (interaction.pointerIds.length >= 2) {\n return { name: 'gesture' };\n }\n\n return null;\n },\n\n getCursor: function () {\n return '';\n },\n};\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturestart') { return; }\n iEvent.ds = 0;\n\n interaction.gesture.startDistance = interaction.gesture.prevDistance = iEvent.distance;\n interaction.gesture.startAngle = interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.scale = 1;\n});\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturemove') { return; }\n\n iEvent.ds = iEvent.scale - interaction.gesture.scale;\n\n interaction.target.fire(iEvent);\n\n interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.prevDistance = iEvent.distance;\n\n if (iEvent.scale !== Infinity\n && iEvent.scale !== null\n && iEvent.scale !== undefined\n && !isNaN(iEvent.scale)) {\n\n interaction.gesture.scale = iEvent.scale;\n }\n});\n\n/*\\\n * Interactable.gesturable\n [ method ]\n *\n * Gets or sets whether multitouch gestures can be performed on the\n * Interactable's element\n *\n = (boolean) Indicates if this can be the target of gesture events\n | var isGestureable = interact(element).gesturable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on gesture events (makes the Interactable gesturable)\n = (object) this Interactable\n | interact(element).gesturable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // limit multiple gestures.\n | // See the explanation in @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n\\*/\nInteractable.prototype.gesturable = function (options) {\n if (utils.is.object(options)) {\n this.options.gesture.enabled = options.enabled === false? false: true;\n this.setPerAction('gesture', options);\n this.setOnEvents('gesture', options);\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.gesture.enabled = options;\n\n if (!options) {\n this.ongesturestart = this.ongesturestart = this.ongestureend = null;\n }\n\n return this;\n }\n\n return this.options.gesture;\n};\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action, event, starting, ending, deltaSource }) {\n if (action !== 'gesture') { return; }\n\n const pointers = interaction.pointers;\n\n iEvent.touches = [pointers[0], pointers[1]];\n\n if (starting) {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = 1;\n iEvent.ds = 0;\n iEvent.angle = utils.touchAngle(pointers, undefined, deltaSource);\n iEvent.da = 0;\n }\n else if (ending || event instanceof InteractEvent) {\n iEvent.distance = interaction.prevEvent.distance;\n iEvent.box = interaction.prevEvent.box;\n iEvent.scale = interaction.prevEvent.scale;\n iEvent.ds = iEvent.scale - 1;\n iEvent.angle = interaction.prevEvent.angle;\n iEvent.da = iEvent.angle - interaction.gesture.startAngle;\n }\n else {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = iEvent.distance / interaction.gesture.startDistance;\n iEvent.angle = utils.touchAngle(pointers, interaction.gesture.prevAngle, deltaSource);\n\n iEvent.ds = iEvent.scale - interaction.gesture.prevScale;\n iEvent.da = iEvent.angle - interaction.gesture.prevAngle;\n }\n});\n\nInteraction.signals.on('new', function (interaction) {\n interaction.gesture = {\n start: { x: 0, y: 0 },\n\n startDistance: 0, // distance between two touches of touchStart\n prevDistance : 0,\n distance : 0,\n\n scale: 1, // gesture.distance / gesture.startDistance\n\n startAngle: 0, // angle of line joining two touches\n prevAngle : 0, // angle of the previous gesture event\n };\n});\n\nactions.gesture = gesture;\nactions.names.push('gesture');\nutils.merge(Interactable.eventTypes, [\n 'gesturestart',\n 'gesturemove',\n 'gestureend',\n]);\nactions.methodDict.gesture = 'gesturable';\n\ndefaultOptions.gesture = gesture.defaults;\n\nmodule.exports = gesture;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\n// Less Precision with touch input\nconst defaultMargin = browser.supportsTouch || browser.supportsPointerEvent? 20: 10;\n\nconst resize = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n square: false,\n preserveAspectRatio: false,\n axis: 'xy',\n\n // use default margin\n margin: NaN,\n\n // object with props left, right, top, bottom which are\n // true/false values to resize when the pointer is over that edge,\n // CSS selectors to match the handles for each direction\n // or the Elements for each handle\n edges: null,\n\n // a value of 'none' will limit the resize rect to a minimum of 0x0\n // 'negate' will alow the rect to have negative width/height\n // 'reposition' will keep the width/height positive by swapping\n // the top and bottom edges and/or swapping the left and right edges\n invert: 'none',\n },\n\n checker: function (pointer, event, interactable, element, interaction, rect) {\n if (!rect) { return null; }\n\n const page = utils.extend({}, interaction.curCoords.page);\n const options = interactable.options;\n\n if (options.resize.enabled) {\n const resizeOptions = options.resize;\n const resizeEdges = { left: false, right: false, top: false, bottom: false };\n\n // if using resize.edges\n if (utils.is.object(resizeOptions.edges)) {\n for (const edge in resizeEdges) {\n resizeEdges[edge] = checkResizeEdge(edge,\n resizeOptions.edges[edge],\n page,\n interaction._eventTarget,\n element,\n rect,\n resizeOptions.margin || defaultMargin);\n }\n\n resizeEdges.left = resizeEdges.left && !resizeEdges.right;\n resizeEdges.top = resizeEdges.top && !resizeEdges.bottom;\n\n if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) {\n return {\n name: 'resize',\n edges: resizeEdges,\n };\n }\n }\n else {\n const right = options.resize.axis !== 'y' && page.x > (rect.right - defaultMargin);\n const bottom = options.resize.axis !== 'x' && page.y > (rect.bottom - defaultMargin);\n\n if (right || bottom) {\n return {\n name: 'resize',\n axes: (right? 'x' : '') + (bottom? 'y' : ''),\n };\n }\n }\n }\n\n return null;\n },\n\n cursors: (browser.isIe9OrOlder ? {\n x : 'e-resize',\n y : 's-resize',\n xy: 'se-resize',\n\n top : 'n-resize',\n left : 'w-resize',\n bottom : 's-resize',\n right : 'e-resize',\n topleft : 'se-resize',\n bottomright: 'se-resize',\n topright : 'ne-resize',\n bottomleft : 'ne-resize',\n } : {\n x : 'ew-resize',\n y : 'ns-resize',\n xy: 'nwse-resize',\n\n top : 'ns-resize',\n left : 'ew-resize',\n bottom : 'ns-resize',\n right : 'ew-resize',\n topleft : 'nwse-resize',\n bottomright: 'nwse-resize',\n topright : 'nesw-resize',\n bottomleft : 'nesw-resize',\n }),\n\n getCursor: function (action) {\n if (action.axis) {\n return resize.cursors[action.name + action.axis];\n }\n else if (action.edges) {\n let cursorKey = '';\n const edgeNames = ['top', 'bottom', 'left', 'right'];\n\n for (let i = 0; i < 4; i++) {\n if (action.edges[edgeNames[i]]) {\n cursorKey += edgeNames[i];\n }\n }\n\n return resize.cursors[cursorKey];\n }\n },\n};\n\n// resizestart\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'resizestart' || !interaction.prepared.edges) {\n return;\n }\n\n const startRect = interaction.target.getRect(interaction.element);\n const resizeOptions = interaction.target.options.resize;\n\n /*\n * When using the `resizable.square` or `resizable.preserveAspectRatio` options, resizing from one edge\n * will affect another. E.g. with `resizable.square`, resizing to make the right edge larger will make\n * the bottom edge larger by the same amount. We call these 'linked' edges. Any linked edges will depend\n * on the active edges and the edge being interacted with.\n */\n if (resizeOptions.square || resizeOptions.preserveAspectRatio) {\n const linkedEdges = utils.extend({}, interaction.prepared.edges);\n\n linkedEdges.top = linkedEdges.top || (linkedEdges.left && !linkedEdges.bottom);\n linkedEdges.left = linkedEdges.left || (linkedEdges.top && !linkedEdges.right );\n linkedEdges.bottom = linkedEdges.bottom || (linkedEdges.right && !linkedEdges.top );\n linkedEdges.right = linkedEdges.right || (linkedEdges.bottom && !linkedEdges.left );\n\n interaction.prepared._linkedEdges = linkedEdges;\n }\n else {\n interaction.prepared._linkedEdges = null;\n }\n\n // if using `resizable.preserveAspectRatio` option, record aspect ratio at the start of the resize\n if (resizeOptions.preserveAspectRatio) {\n interaction.resizeStartAspectRatio = startRect.width / startRect.height;\n }\n\n interaction.resizeRects = {\n start : startRect,\n current : utils.extend({}, startRect),\n inverted : utils.extend({}, startRect),\n previous : utils.extend({}, startRect),\n delta : {\n left: 0, right : 0, width : 0,\n top : 0, bottom: 0, height: 0,\n },\n };\n\n iEvent.rect = interaction.resizeRects.inverted;\n iEvent.deltaRect = interaction.resizeRects.delta;\n});\n\n// resizemove\nInteractEvent.signals.on('new', function ({ iEvent, phase, interaction }) {\n if (phase !== 'move' || !interaction.prepared.edges) { return; }\n\n const resizeOptions = interaction.target.options.resize;\n const invert = resizeOptions.invert;\n const invertible = invert === 'reposition' || invert === 'negate';\n\n let edges = interaction.prepared.edges;\n\n const start = interaction.resizeRects.start;\n const current = interaction.resizeRects.current;\n const inverted = interaction.resizeRects.inverted;\n const delta = interaction.resizeRects.delta;\n const previous = utils.extend(interaction.resizeRects.previous, inverted);\n const originalEdges = edges;\n\n let dx = iEvent.dx;\n let dy = iEvent.dy;\n\n if (resizeOptions.preserveAspectRatio || resizeOptions.square) {\n // `resize.preserveAspectRatio` takes precedence over `resize.square`\n const startAspectRatio = resizeOptions.preserveAspectRatio\n ? interaction.resizeStartAspectRatio\n : 1;\n\n edges = interaction.prepared._linkedEdges;\n\n if ((originalEdges.left && originalEdges.bottom)\n || (originalEdges.right && originalEdges.top)) {\n dy = -dx / startAspectRatio;\n }\n else if (originalEdges.left || originalEdges.right ) { dy = dx / startAspectRatio; }\n else if (originalEdges.top || originalEdges.bottom) { dx = dy * startAspectRatio; }\n }\n\n // update the 'current' rect without modifications\n if (edges.top ) { current.top += dy; }\n if (edges.bottom) { current.bottom += dy; }\n if (edges.left ) { current.left += dx; }\n if (edges.right ) { current.right += dx; }\n\n if (invertible) {\n // if invertible, copy the current rect\n utils.extend(inverted, current);\n\n if (invert === 'reposition') {\n // swap edge values if necessary to keep width/height positive\n let swap;\n\n if (inverted.top > inverted.bottom) {\n swap = inverted.top;\n\n inverted.top = inverted.bottom;\n inverted.bottom = swap;\n }\n if (inverted.left > inverted.right) {\n swap = inverted.left;\n\n inverted.left = inverted.right;\n inverted.right = swap;\n }\n }\n }\n else {\n // if not invertible, restrict to minimum of 0x0 rect\n inverted.top = Math.min(current.top, start.bottom);\n inverted.bottom = Math.max(current.bottom, start.top);\n inverted.left = Math.min(current.left, start.right);\n inverted.right = Math.max(current.right, start.left);\n }\n\n inverted.width = inverted.right - inverted.left;\n inverted.height = inverted.bottom - inverted.top ;\n\n for (const edge in inverted) {\n delta[edge] = inverted[edge] - previous[edge];\n }\n\n iEvent.edges = interaction.prepared.edges;\n iEvent.rect = inverted;\n iEvent.deltaRect = delta;\n});\n\n/*\\\n * Interactable.resizable\n [ method ]\n *\n * Gets or sets whether resize actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of resize elements\n | var isResizeable = interact('input[type=text]').resizable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on resize events (object makes the Interactable resizable)\n = (object) This Interactable\n | interact(element).resizable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | edges: {\n | top : true, // Use pointer coords to check for resize.\n | left : false, // Disable resizing from left edge.\n | bottom: '.resize-s',// Resize if pointer target matches selector\n | right : handleEl // Resize if pointer target is the given Element\n | },\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height are adjusted at a 1:1 ratio.\n | square: false,\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height maintain the aspect ratio they had when resizing started.\n | preserveAspectRatio: false,\n |\n | // a value of 'none' will limit the resize rect to a minimum of 0x0\n | // 'negate' will allow the rect to have negative width/height\n | // 'reposition' will keep the width/height positive by swapping\n | // the top and bottom edges and/or swapping the left and right edges\n | invert: 'none' || 'negate' || 'reposition'\n |\n | // limit multiple resizes.\n | // See the explanation in the @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n \\*/\nInteractable.prototype.resizable = function (options) {\n if (utils.is.object(options)) {\n this.options.resize.enabled = options.enabled === false? false: true;\n this.setPerAction('resize', options);\n this.setOnEvents('resize', options);\n\n if (/^x$|^y$|^xy$/.test(options.axis)) {\n this.options.resize.axis = options.axis;\n }\n else if (options.axis === null) {\n this.options.resize.axis = defaultOptions.resize.axis;\n }\n\n if (utils.is.bool(options.preserveAspectRatio)) {\n this.options.resize.preserveAspectRatio = options.preserveAspectRatio;\n }\n else if (utils.is.bool(options.square)) {\n this.options.resize.square = options.square;\n }\n\n return this;\n }\n if (utils.is.bool(options)) {\n this.options.resize.enabled = options;\n\n if (!options) {\n this.onresizestart = this.onresizestart = this.onresizeend = null;\n }\n\n return this;\n }\n return this.options.resize;\n};\n\nfunction checkResizeEdge (name, value, page, element, interactableElement, rect, margin) {\n // false, '', undefined, null\n if (!value) { return false; }\n\n // true value, use pointer coords and element rect\n if (value === true) {\n // if dimensions are negative, \"switch\" edges\n const width = utils.is.number(rect.width )? rect.width : rect.right - rect.left;\n const height = utils.is.number(rect.height)? rect.height : rect.bottom - rect.top ;\n\n if (width < 0) {\n if (name === 'left' ) { name = 'right'; }\n else if (name === 'right') { name = 'left' ; }\n }\n if (height < 0) {\n if (name === 'top' ) { name = 'bottom'; }\n else if (name === 'bottom') { name = 'top' ; }\n }\n\n if (name === 'left' ) { return page.x < ((width >= 0? rect.left: rect.right ) + margin); }\n if (name === 'top' ) { return page.y < ((height >= 0? rect.top : rect.bottom) + margin); }\n\n if (name === 'right' ) { return page.x > ((width >= 0? rect.right : rect.left) - margin); }\n if (name === 'bottom') { return page.y > ((height >= 0? rect.bottom: rect.top ) - margin); }\n }\n\n // the remaining checks require an element\n if (!utils.is.element(element)) { return false; }\n\n return utils.is.element(value)\n // the value is an element to use as a resize handle\n ? value === element\n // otherwise check if element matches value as selector\n : utils.matchesUpTo(element, value, interactableElement);\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.resizeAxes = 'xy';\n});\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action }) {\n if (action !== 'resize' || !interaction.resizeAxes) { return; }\n\n const options = interaction.target.options;\n\n if (options.resize.square) {\n if (interaction.resizeAxes === 'y') {\n iEvent.dx = iEvent.dy;\n }\n else {\n iEvent.dy = iEvent.dx;\n }\n iEvent.axes = 'xy';\n }\n else {\n iEvent.axes = interaction.resizeAxes;\n\n if (interaction.resizeAxes === 'x') {\n iEvent.dy = 0;\n }\n else if (interaction.resizeAxes === 'y') {\n iEvent.dx = 0;\n }\n }\n});\n\nactions.resize = resize;\nactions.names.push('resize');\nutils.merge(Interactable.eventTypes, [\n 'resizestart',\n 'resizemove',\n 'resizeinertiastart',\n 'resizeinertiaresume',\n 'resizeend',\n]);\nactions.methodDict.resize = 'resizable';\n\ndefaultOptions.resize = resize.defaults;\n\nmodule.exports = resize;\n","const raf = require('./utils/raf');\nconst getWindow = require('./utils/window').getWindow;\nconst is = require('./utils/is');\nconst domUtils = require('./utils/domUtils');\nconst Interaction = require('./Interaction');\nconst defaultOptions = require('./defaultOptions');\n\nconst autoScroll = {\n defaults: {\n enabled : false,\n container: null, // the item that is scrolled (Window or HTMLElement)\n margin : 60,\n speed : 300, // the scroll speed in pixels per second\n },\n\n interaction: null,\n i: null, // the handle returned by window.setInterval\n x: 0, y: 0, // Direction each pulse is to scroll in\n\n isScrolling: false,\n prevTime: 0,\n\n start: function (interaction) {\n autoScroll.isScrolling = true;\n raf.cancel(autoScroll.i);\n\n autoScroll.interaction = interaction;\n autoScroll.prevTime = new Date().getTime();\n autoScroll.i = raf.request(autoScroll.scroll);\n },\n\n stop: function () {\n autoScroll.isScrolling = false;\n raf.cancel(autoScroll.i);\n },\n\n // scroll the window by the values in scroll.x/y\n scroll: function () {\n const options = autoScroll.interaction.target.options[autoScroll.interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(autoScroll.interaction.element);\n const now = new Date().getTime();\n // change in time in seconds\n const dt = (now - autoScroll.prevTime) / 1000;\n // displacement\n const s = options.speed * dt;\n\n if (s >= 1) {\n if (is.window(container)) {\n container.scrollBy(autoScroll.x * s, autoScroll.y * s);\n }\n else if (container) {\n container.scrollLeft += autoScroll.x * s;\n container.scrollTop += autoScroll.y * s;\n }\n\n autoScroll.prevTime = now;\n }\n\n if (autoScroll.isScrolling) {\n raf.cancel(autoScroll.i);\n autoScroll.i = raf.request(autoScroll.scroll);\n }\n },\n check: function (interactable, actionName) {\n const options = interactable.options;\n\n return options[actionName].autoScroll && options[actionName].autoScroll.enabled;\n },\n onInteractionMove: function ({ interaction, pointer }) {\n if (!(interaction.interacting()\n && autoScroll.check(interaction.target, interaction.prepared.name))) {\n return;\n }\n\n if (interaction.simulation) {\n autoScroll.x = autoScroll.y = 0;\n return;\n }\n\n let top;\n let right;\n let bottom;\n let left;\n\n const options = interaction.target.options[interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(interaction.element);\n\n if (is.window(container)) {\n left = pointer.clientX < autoScroll.margin;\n top = pointer.clientY < autoScroll.margin;\n right = pointer.clientX > container.innerWidth - autoScroll.margin;\n bottom = pointer.clientY > container.innerHeight - autoScroll.margin;\n }\n else {\n const rect = domUtils.getElementClientRect(container);\n\n left = pointer.clientX < rect.left + autoScroll.margin;\n top = pointer.clientY < rect.top + autoScroll.margin;\n right = pointer.clientX > rect.right - autoScroll.margin;\n bottom = pointer.clientY > rect.bottom - autoScroll.margin;\n }\n\n autoScroll.x = (right ? 1: left? -1: 0);\n autoScroll.y = (bottom? 1: top? -1: 0);\n\n if (!autoScroll.isScrolling) {\n // set the autoScroll properties to those of the target\n autoScroll.margin = options.margin;\n autoScroll.speed = options.speed;\n\n autoScroll.start(interaction);\n }\n },\n};\n\nInteraction.signals.on('stop-active', function () {\n autoScroll.stop();\n});\n\nInteraction.signals.on('action-move', autoScroll.onInteractionMove);\n\ndefaultOptions.perAction.autoScroll = autoScroll.defaults;\n\nmodule.exports = autoScroll;\n","const Interactable = require('../Interactable');\nconst actions = require('../actions/base');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.ignoreFrom\n [ method ]\n *\n * If the target of the `mousedown`, `pointerdown` or `touchstart`\n * event or any of it's parents match the given CSS selector or\n * Element, no drag/resize/gesture is started.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to not ignore any elements\n = (string | Element | object) The current ignoreFrom value or this Interactable\n **\n | interact(element, { ignoreFrom: document.getElementById('no-action') });\n | // or\n | interact(element).ignoreFrom('input, textarea, a');\n\\*/\nInteractable.prototype.ignoreFrom = function (newValue) {\n return this._backCompatOption('ignoreFrom', newValue);\n};\n\n/*\\\n * Interactable.allowFrom\n [ method ]\n *\n * A drag/resize/gesture is started only If the target of the\n * `mousedown`, `pointerdown` or `touchstart` event or any of it's\n * parents match the given CSS selector or Element.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to allow from any element\n = (string | Element | object) The current allowFrom value or this Interactable\n **\n | interact(element, { allowFrom: document.getElementById('drag-handle') });\n | // or\n | interact(element).allowFrom('.handle');\n\\*/\nInteractable.prototype.allowFrom = function (newValue) {\n return this._backCompatOption('allowFrom', newValue);\n};\n\nInteractable.prototype.testIgnore = function (ignoreFrom, interactableElement, element) {\n if (!ignoreFrom || !is.element(element)) { return false; }\n\n if (is.string(ignoreFrom)) {\n return domUtils.matchesUpTo(element, ignoreFrom, interactableElement);\n }\n else if (is.element(ignoreFrom)) {\n return domUtils.nodeContains(ignoreFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testAllow = function (allowFrom, interactableElement, element) {\n if (!allowFrom) { return true; }\n\n if (!is.element(element)) { return false; }\n\n if (is.string(allowFrom)) {\n return domUtils.matchesUpTo(element, allowFrom, interactableElement);\n }\n else if (is.element(allowFrom)) {\n return domUtils.nodeContains(allowFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testIgnoreAllow = function (options, interactableElement, eventTarget) {\n return (!this.testIgnore(options.ignoreFrom, interactableElement, eventTarget)\n && this.testAllow(options.allowFrom, interactableElement, eventTarget));\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (event.buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\n","const interact = require('../interact');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst actions = require('../actions/base');\nconst defaultOptions = require('../defaultOptions');\nconst browser = require('../utils/browser');\nconst scope = require('../scope');\nconst utils = require('../utils');\nconst signals = require('../utils/Signals').new();\n\nrequire('./InteractableMethods');\n\nconst autoStart = {\n signals,\n withinInteractionLimit,\n // Allow this many interactions to happen simultaneously\n maxInteractions: Infinity,\n defaults: {\n perAction: {\n manualStart: false,\n max: Infinity,\n maxPerElement: 1,\n allowFrom: null,\n ignoreFrom: null,\n },\n },\n setActionDefaults: function (action) {\n utils.extend(action.defaults, autoStart.defaults.perAction);\n },\n};\n\n// set cursor style on mousedown\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget }) {\n if (interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\n// set cursor style on mousemove\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget }) {\n if (!interaction.mouse\n || interaction.pointerIsDown\n || interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\nInteraction.signals.on('move', function (arg) {\n const { interaction, event } = arg;\n\n if (!interaction.pointerIsDown\n || interaction.interacting()\n || !interaction.pointerWasMoved\n || !interaction.prepared.name) {\n return;\n }\n\n signals.fire('before-start', arg);\n\n const target = interaction.target;\n\n if (interaction.prepared.name && target) {\n // check manualStart and interaction limit\n if (target.options[interaction.prepared.name].manualStart\n || !withinInteractionLimit(target, interaction.element, interaction.prepared)) {\n interaction.stop(event);\n }\n else {\n interaction.start(interaction.prepared, target, interaction.element);\n }\n }\n});\n\n// Check if the current target supports the action.\n// If so, return the validated action. Otherwise, return null\nfunction validateAction (action, interactable, element, eventTarget) {\n if (utils.is.object(action)\n && interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget)\n && interactable.options[action.name].enabled\n && withinInteractionLimit(interactable, element, action)) {\n return action;\n }\n\n return null;\n}\n\nfunction validateSelector (interaction, pointer, event, matches, matchElements, eventTarget) {\n for (let i = 0, len = matches.length; i < len; i++) {\n const match = matches[i];\n const matchElement = matchElements[i];\n const action = validateAction(match.getAction(pointer, event, interaction, matchElement),\n match,\n matchElement,\n eventTarget);\n\n if (action) {\n return {\n action,\n target: match,\n element: matchElement,\n };\n }\n }\n\n return {};\n}\n\nfunction getActionInfo (interaction, pointer, event, eventTarget) {\n let matches = [];\n let matchElements = [];\n\n let element = eventTarget;\n let action = null;\n\n function pushMatches (interactable, selector, context) {\n const elements = (browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined);\n\n if (utils.matchesSelector(element, selector, elements)) {\n\n matches.push(interactable);\n matchElements.push(element);\n }\n }\n\n while (utils.is.element(element)) {\n matches = [];\n matchElements = [];\n\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && (action = validateAction(elementInteractable.getAction(pointer, event, interaction, element, eventTarget),\n elementInteractable,\n element,\n eventTarget))\n && !elementInteractable.options[action.name].manualStart) {\n return {\n element,\n action,\n target: elementInteractable,\n };\n }\n else {\n scope.interactables.forEachSelector(pushMatches, element);\n\n const actionInfo = validateSelector(interaction, pointer, event, matches, matchElements, eventTarget);\n\n if (actionInfo.action\n && !actionInfo.target.options[actionInfo.action.name].manualStart) {\n return actionInfo;\n }\n }\n\n element = utils.parentNode(element);\n }\n\n return {};\n}\n\nfunction prepare (interaction, { action, target, element }) {\n action = action || {};\n\n if (interaction.target && interaction.target.options.styleCursor) {\n interaction.target._doc.documentElement.style.cursor = '';\n }\n\n interaction.target = target;\n interaction.element = element;\n utils.copyAction(interaction.prepared, action);\n\n if (target && target.options.styleCursor) {\n const cursor = action? actions[action.name].getCursor(action) : '';\n interaction.target._doc.documentElement.style.cursor = cursor;\n }\n\n signals.fire('prepared', { interaction: interaction });\n}\n\nInteraction.signals.on('stop', function ({ interaction }) {\n const target = interaction.target;\n\n if (target && target.options.styleCursor) {\n target._doc.documentElement.style.cursor = '';\n }\n});\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (utils.is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (utils.is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n const buttons = event.buttons || ({\n 0: 1,\n 1: 4,\n 3: 8,\n 4: 16,\n })[event.button];\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\nfunction withinInteractionLimit (interactable, element, action) {\n const options = interactable.options;\n const maxActions = options[action.name].max;\n const maxPerElement = options[action.name].maxPerElement;\n let activeInteractions = 0;\n let targetCount = 0;\n let targetElementCount = 0;\n\n // no actions if any of these values == 0\n if (!(maxActions && maxPerElement && autoStart.maxInteractions)) { return; }\n\n for (let i = 0, len = scope.interactions.length; i < len; i++) {\n const interaction = scope.interactions[i];\n const otherAction = interaction.prepared.name;\n\n if (!interaction.interacting()) { continue; }\n\n activeInteractions++;\n\n if (activeInteractions >= autoStart.maxInteractions) {\n return false;\n }\n\n if (interaction.target !== interactable) { continue; }\n\n targetCount += (otherAction === action.name)|0;\n\n if (targetCount >= maxActions) {\n return false;\n }\n\n if (interaction.element === element) {\n targetElementCount++;\n\n if (otherAction !== action.name || targetElementCount >= maxPerElement) {\n return false;\n }\n }\n }\n\n return autoStart.maxInteractions > 0;\n}\n\n/*\\\n * interact.maxInteractions\n [ method ]\n **\n * Returns or sets the maximum number of concurrent interactions allowed.\n * By default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables\n * and elements, you need to enable it in the draggable, resizable and\n * gesturable `'max'` and `'maxPerElement'` options.\n **\n - newValue (number) #optional Any number. newValue <= 0 means no interactions.\n\\*/\ninteract.maxInteractions = function (newValue) {\n if (utils.is.number(newValue)) {\n autoStart.maxInteractions = newValue;\n\n return this;\n }\n\n return autoStart.maxInteractions;\n};\n\nInteractable.settingsMethods.push('styleCursor');\nInteractable.settingsMethods.push('actionChecker');\nInteractable.settingsMethods.push('ignoreFrom');\nInteractable.settingsMethods.push('allowFrom');\n\ndefaultOptions.base.actionChecker = null;\ndefaultOptions.base.styleCursor = true;\n\nutils.extend(defaultOptions.perAction, autoStart.defaults.perAction);\n\nmodule.exports = autoStart;\n","const autoStart = require('./base');\nconst Interaction = require('../Interaction');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.delayTimer = null;\n});\n\nautoStart.signals.on('prepared', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.delayTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.target, interaction.element);\n }, delay);\n }\n});\n\nInteraction.signals.on('move', function ({ interaction, duplicate }) {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.delayTimer);\n }\n});\n\n// prevent regular down->move autoStart\nautoStart.signals.on('before-start', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.prepared.name = null;\n }\n});\n","const autoStart = require('./base');\nconst scope = require('../scope');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\n\nconst { matchesSelector, parentNode } = require('../utils/domUtils');\n\nautoStart.setActionDefaults(require('../actions/drag'));\n\nautoStart.signals.on('before-start', function ({ interaction, eventTarget, dx, dy }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // check if a drag is in the correct axis\n const absX = Math.abs(dx);\n const absY = Math.abs(dy);\n const options = interaction.target.options.drag;\n const startAxis = options.startAxis;\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy');\n\n interaction.prepared.axis = options.lockAxis === 'start'\n ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n : options.lockAxis;\n\n // if the movement isn't in the startAxis of the interactable\n if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) {\n // cancel the prepared action\n interaction.prepared.name = null;\n\n // then try to get a drag from another ineractable\n\n if (!interaction.prepared.name) {\n\n let element = eventTarget;\n\n const getDraggable = function (interactable, selector, context) {\n const elements = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n if (interactable === interaction.target) { return; }\n\n if (!options.manualStart\n && !interactable.testIgnoreAllow(options, element, eventTarget)\n && matchesSelector(element, selector, elements)) {\n\n const action = interactable.getAction(interaction.downPointer,\n interaction.downEvent,\n interaction,\n element);\n\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, interactable)\n && autoStart.validateAction(action, interactable, element, eventTarget)) {\n\n return interactable;\n }\n }\n };\n\n let action = null;\n\n // check all interactables\n while (is.element(element)) {\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && elementInteractable !== interaction.target\n && !elementInteractable.options.drag.manualStart) {\n\n action = elementInteractable.getAction(interaction.downPointer, interaction.downEvent, interaction, element);\n }\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, elementInteractable)) {\n\n interaction.prepared.name = 'drag';\n interaction.target = elementInteractable;\n interaction.element = element;\n break;\n }\n\n const selectorInteractable = scope.interactables.forEachSelector(getDraggable, element);\n\n if (selectorInteractable) {\n interaction.prepared.name = 'drag';\n interaction.target = selectorInteractable;\n interaction.element = element;\n break;\n }\n\n element = parentNode(element);\n }\n }\n }\n});\n\nfunction checkStartAxis (startAxis, interactable) {\n if (!interactable) { return false; }\n\n const thisAxis = interactable.options.drag.startAxis;\n\n return (startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis);\n}\n","require('./base').setActionDefaults(require('../actions/gesture'));\n","require('./base').setActionDefaults(require('../actions/resize'));\n","module.exports = {\n base: {\n accept : null,\n preventDefault: 'auto',\n deltaSource : 'page',\n },\n\n perAction: {\n origin: { x: 0, y: 0 },\n\n // only allow left button by default\n // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n mouseButtons: 1,\n\n inertia: {\n enabled : false,\n resistance : 10, // the lambda in exponential decay\n minSpeed : 100, // target speed must be above this for inertia to start\n endSpeed : 10, // the speed at which inertia is slow enough to stop\n allowResume : true, // allow resuming an action in inertia phase\n smoothEndDuration: 300, // animate to snap/restrict endOnly if there's no inertia\n },\n },\n};\n","/* browser entry point */\n\n// Legacy browser support\nrequire('./legacyBrowsers');\n\n// inertia\nrequire('./inertia');\n\n// modifiers\nrequire('./modifiers/snap');\nrequire('./modifiers/restrict');\n\n// pointerEvents\nrequire('./pointerEvents/base');\nrequire('./pointerEvents/holdRepeat');\nrequire('./pointerEvents/interactableTargets');\n\n// delay\nrequire('./autoStart/delay');\n\n// actions\nrequire('./actions/gesture');\nrequire('./actions/resize');\nrequire('./actions/drag');\nrequire('./actions/drop');\n\n// load these modifiers after resize is loaded\nrequire('./modifiers/snapSize');\nrequire('./modifiers/restrictEdges');\nrequire('./modifiers/restrictSize');\n\n// autoStart actions\nrequire('./autoStart/gesture');\nrequire('./autoStart/resize');\nrequire('./autoStart/drag');\n\n// Interactable preventDefault setting\nrequire('./interactablePreventDefault.js');\n\n// autoScroll\nrequire('./autoScroll');\n\n// export interact\nmodule.exports = require('./interact');\n","const InteractEvent = require('./InteractEvent');\nconst Interaction = require('./Interaction');\nconst modifiers = require('./modifiers');\nconst utils = require('./utils');\nconst animationFrame = require('./utils/raf');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.inertiaStatus = {\n active : false,\n smoothEnd : false,\n allowResume: false,\n\n startEvent: null,\n upCoords : {},\n\n xe: 0, ye: 0,\n sx: 0, sy: 0,\n\n t0: 0,\n vx0: 0, vys: 0,\n duration: 0,\n\n lambda_v0: 0,\n one_ve_v0: 0,\n i : null,\n };\n\n interaction.boundInertiaFrame = () => inertiaFrame .apply(interaction);\n interaction.boundSmoothEndFrame = () => smoothEndFrame.apply(interaction);\n});\n\nInteraction.signals.on('down', function ({ interaction, event, pointer, eventTarget }) {\n const status = interaction.inertiaStatus;\n\n // Check if the down event hits the current inertia target\n if (status.active) {\n let element = eventTarget;\n\n // climb up the DOM tree from the event target\n while (utils.is.element(element)) {\n\n // if interaction element is the current inertia target element\n if (element === interaction.element) {\n // stop inertia\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n\n // update pointers to the down event's coordinates\n interaction.updatePointer(pointer);\n utils.setCoords(interaction.curCoords, interaction.pointers);\n\n // fire appropriate signals\n const signalArg = { interaction };\n Interaction.signals.fire('before-action-move', signalArg);\n Interaction.signals.fire('action-resume' , signalArg);\n\n // fire a reume event\n const resumeEvent = new InteractEvent(interaction,\n event,\n interaction.prepared.name,\n 'inertiaresume',\n interaction.element);\n\n interaction.target.fire(resumeEvent);\n interaction.prevEvent = resumeEvent;\n modifiers.resetStatuses(interaction.modifierStatuses);\n\n utils.copyCoords(interaction.prevCoords, interaction.curCoords);\n break;\n }\n\n element = utils.parentNode(element);\n }\n }\n});\n\nInteraction.signals.on('up', function ({ interaction, event }) {\n const status = interaction.inertiaStatus;\n\n if (!interaction.interacting() || status.active) { return; }\n\n const target = interaction.target;\n const options = target && target.options;\n const inertiaOptions = options && interaction.prepared.name && options[interaction.prepared.name].inertia;\n\n const now = new Date().getTime();\n const statuses = {};\n const page = utils.extend({}, interaction.curCoords.page);\n const pointerSpeed = interaction.pointerDelta.client.speed;\n\n let smoothEnd = false;\n let modifierResult;\n\n // check if inertia should be started\n const inertiaPossible = (inertiaOptions && inertiaOptions.enabled\n && interaction.prepared.name !== 'gesture'\n && event !== status.startEvent);\n\n const inertia = (inertiaPossible\n && (now - interaction.curCoords.timeStamp) < 50\n && pointerSpeed > inertiaOptions.minSpeed\n && pointerSpeed > inertiaOptions.endSpeed);\n\n const modifierArg = {\n interaction,\n pageCoords: page,\n statuses,\n preEnd: true,\n requireEndOnly: true,\n };\n\n // smoothEnd\n if (inertiaPossible && !inertia) {\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n if (modifierResult.shouldMove && modifierResult.locked) {\n smoothEnd = true;\n }\n }\n\n if (!(inertia || smoothEnd)) { return; }\n\n utils.copyCoords(status.upCoords, interaction.curCoords);\n\n interaction.pointers[0] = status.startEvent =\n new InteractEvent(interaction, event, interaction.prepared.name, 'inertiastart', interaction.element);\n\n status.t0 = now;\n\n status.active = true;\n status.allowResume = inertiaOptions.allowResume;\n interaction.simulation = status;\n\n target.fire(status.startEvent);\n\n if (inertia) {\n status.vx0 = interaction.pointerDelta.client.vx;\n status.vy0 = interaction.pointerDelta.client.vy;\n status.v0 = pointerSpeed;\n\n calcInertia(interaction, status);\n\n utils.extend(page, interaction.curCoords.page);\n\n page.x += status.xe;\n page.y += status.ye;\n\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n status.modifiedXe += modifierResult.dx;\n status.modifiedYe += modifierResult.dy;\n\n status.i = animationFrame.request(interaction.boundInertiaFrame);\n }\n else {\n status.smoothEnd = true;\n status.xe = modifierResult.dx;\n status.ye = modifierResult.dy;\n\n status.sx = status.sy = 0;\n\n status.i = animationFrame.request(interaction.boundSmoothEndFrame);\n }\n});\n\nInteraction.signals.on('stop-active', function ({ interaction }) {\n const status = interaction.inertiaStatus;\n\n if (status.active) {\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n }\n});\n\nfunction calcInertia (interaction, status) {\n const inertiaOptions = interaction.target.options[interaction.prepared.name].inertia;\n const lambda = inertiaOptions.resistance;\n const inertiaDur = -Math.log(inertiaOptions.endSpeed / status.v0) / lambda;\n\n status.x0 = interaction.prevEvent.pageX;\n status.y0 = interaction.prevEvent.pageY;\n status.t0 = status.startEvent.timeStamp / 1000;\n status.sx = status.sy = 0;\n\n status.modifiedXe = status.xe = (status.vx0 - inertiaDur) / lambda;\n status.modifiedYe = status.ye = (status.vy0 - inertiaDur) / lambda;\n status.te = inertiaDur;\n\n status.lambda_v0 = lambda / status.v0;\n status.one_ve_v0 = 1 - inertiaOptions.endSpeed / status.v0;\n}\n\nfunction inertiaFrame () {\n updateInertiaCoords(this);\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n\n const status = this.inertiaStatus;\n const options = this.target.options[this.prepared.name].inertia;\n const lambda = options.resistance;\n const t = new Date().getTime() / 1000 - status.t0;\n\n if (t < status.te) {\n\n const progress = 1 - (Math.exp(-lambda * t) - status.lambda_v0) / status.one_ve_v0;\n\n if (status.modifiedXe === status.xe && status.modifiedYe === status.ye) {\n status.sx = status.xe * progress;\n status.sy = status.ye * progress;\n }\n else {\n const quadPoint = utils.getQuadraticCurvePoint(0, 0,\n status.xe,\n status.ye,\n status.modifiedXe,\n status.modifiedYe,\n progress);\n\n status.sx = quadPoint.x;\n status.sy = quadPoint.y;\n }\n\n this.doMove();\n\n status.i = animationFrame.request(this.boundInertiaFrame);\n }\n else {\n status.sx = status.modifiedXe;\n status.sy = status.modifiedYe;\n\n this.doMove();\n this.end(status.startEvent);\n status.active = false;\n this.simulation = null;\n }\n\n utils.copyCoords(this.prevCoords, this.curCoords);\n}\n\nfunction smoothEndFrame () {\n updateInertiaCoords(this);\n\n const status = this.inertiaStatus;\n const t = new Date().getTime() - status.t0;\n const duration = this.target.options[this.prepared.name].inertia.smoothEndDuration;\n\n if (t < duration) {\n status.sx = utils.easeOutQuad(t, 0, status.xe, duration);\n status.sy = utils.easeOutQuad(t, 0, status.ye, duration);\n\n this.pointerMove(status.startEvent, status.startEvent);\n\n status.i = animationFrame.request(this.boundSmoothEndFrame);\n }\n else {\n status.sx = status.xe;\n status.sy = status.ye;\n\n this.pointerMove(status.startEvent, status.startEvent);\n this.end(status.startEvent);\n\n status.smoothEnd =\n status.active = false;\n this.simulation = null;\n }\n}\n\nfunction updateInertiaCoords (interaction) {\n const status = interaction.inertiaStatus;\n\n // return if inertia isn't running\n if (!status.active) { return; }\n\n const pageUp = status.upCoords.page;\n const clientUp = status.upCoords.client;\n\n utils.setCoords(interaction.curCoords, [ {\n pageX : pageUp.x + status.sx,\n pageY : pageUp.y + status.sy,\n clientX: clientUp.x + status.sx,\n clientY: clientUp.y + status.sy,\n } ]);\n}\n","const browser = require('./utils/browser');\nconst events = require('./utils/events');\nconst utils = require('./utils');\nconst scope = require('./scope');\nconst Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\n\nconst globalEvents = {};\n\n/*\\\n * interact\n [ method ]\n *\n * The methods of this variable can be used to set elements as\n * interactables and also to change various default settings.\n *\n * Calling it as a function and passing an element or a valid CSS selector\n * string returns an Interactable object which has various methods to\n * configure it.\n *\n - element (Element | string) The HTML or SVG Element to interact with or CSS selector\n = (object) An @Interactable\n *\n > Usage\n | interact('#draggable').draggable(true);\n |\n | var rectables = interact('rect');\n | rectables\n | .gesturable(true)\n | .on('gesturemove', function (event) {\n | // ...\n | });\n\\*/\nfunction interact (element, options) {\n let interactable = scope.interactables.get(element, options);\n\n if (!interactable) {\n interactable = new Interactable(element, options);\n interactable.events.global = globalEvents;\n }\n\n return interactable;\n}\n\n/*\\\n * interact.isSet\n [ method ]\n *\n * Check if an element has been set\n - element (Element) The Element being searched for\n = (boolean) Indicates if the element or CSS selector was previously passed to interact\n\\*/\ninteract.isSet = function (element, options) {\n return scope.interactables.indexOfElement(element, options && options.context) !== -1;\n};\n\n/*\\\n * interact.on\n [ method ]\n *\n * Adds a global listener for an InteractEvent or adds a DOM event to\n * `document`\n *\n - type (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) interact\n\\*/\ninteract.on = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.on(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.on(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n // if it is an InteractEvent type, add listener to globalEvents\n if (utils.contains(Interactable.eventTypes, type)) {\n // if this type of event was never bound\n if (!globalEvents[type]) {\n globalEvents[type] = [listener];\n }\n else {\n globalEvents[type].push(listener);\n }\n }\n // If non InteractEvent type, addEventListener to document\n else {\n events.add(scope.document, type, listener, { options });\n }\n\n return interact;\n};\n\n/*\\\n * interact.off\n [ method ]\n *\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n - type (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) interact\n \\*/\ninteract.off = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.off(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.off(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n if (!utils.contains(Interactable.eventTypes, type)) {\n events.remove(scope.document, type, listener, options);\n }\n else {\n let index;\n\n if (type in globalEvents\n && (index = utils.indexOf(globalEvents[type], listener)) !== -1) {\n globalEvents[type].splice(index, 1);\n }\n }\n\n return interact;\n};\n\n/*\\\n * interact.debug\n [ method ]\n *\n * Returns an object which exposes internal data\n = (object) An object with properties that outline the current state and expose internal functions and variables\n\\*/\ninteract.debug = function () {\n return scope;\n};\n\n// expose the functions used to calculate multi-touch properties\ninteract.getPointerAverage = utils.pointerAverage;\ninteract.getTouchBBox = utils.touchBBox;\ninteract.getTouchDistance = utils.touchDistance;\ninteract.getTouchAngle = utils.touchAngle;\n\ninteract.getElementRect = utils.getElementRect;\ninteract.getElementClientRect = utils.getElementClientRect;\ninteract.matchesSelector = utils.matchesSelector;\ninteract.closest = utils.closest;\n\n/*\\\n * interact.supportsTouch\n [ method ]\n *\n = (boolean) Whether or not the browser supports touch input\n\\*/\ninteract.supportsTouch = function () {\n return browser.supportsTouch;\n};\n\n/*\\\n * interact.supportsPointerEvent\n [ method ]\n *\n = (boolean) Whether or not the browser supports PointerEvents\n\\*/\ninteract.supportsPointerEvent = function () {\n return browser.supportsPointerEvent;\n};\n\n/*\\\n * interact.stop\n [ method ]\n *\n * Cancels all interactions (end events are not fired)\n *\n - event (Event) An event on which to call preventDefault()\n = (object) interact\n\\*/\ninteract.stop = function (event) {\n for (let i = scope.interactions.length - 1; i >= 0; i--) {\n scope.interactions[i].stop(event);\n }\n\n return interact;\n};\n\n/*\\\n * interact.pointerMoveTolerance\n [ method ]\n * Returns or sets the distance the pointer must be moved before an action\n * sequence occurs. This also affects tolerance for tap events.\n *\n - newValue (number) #optional The movement from the start position must be greater than this value\n = (number | Interactable) The current setting or interact\n\\*/\ninteract.pointerMoveTolerance = function (newValue) {\n if (utils.is.number(newValue)) {\n Interaction.pointerMoveTolerance = newValue;\n\n return this;\n }\n\n return Interaction.pointerMoveTolerance;\n};\n\ninteract.addDocument = scope.addDocument;\ninteract.removeDocument = scope.removeDocument;\n\nscope.interact = interact;\n\nmodule.exports = interact;\n","const Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\nconst scope = require('./scope');\nconst is = require('./utils/is');\nconst events = require('./utils/events');\n\nconst { nodeContains, matchesSelector } = require('./utils/domUtils');\n\n/*\\\n * Interactable.preventDefault\n [ method ]\n *\n * Returns or sets whether to prevent the browser's default behaviour\n * in response to pointer events. Can be set to:\n * - `'always'` to always prevent\n * - `'never'` to never prevent\n * - `'auto'` to let interact.js try to determine what would be best\n *\n - newValue (string) #optional `true`, `false` or `'auto'`\n = (string | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.preventDefault = function (newValue) {\n if (/^(always|never|auto)$/.test(newValue)) {\n this.options.preventDefault = newValue;\n return this;\n }\n\n if (is.bool(newValue)) {\n this.options.preventDefault = newValue? 'always' : 'never';\n return this;\n }\n\n return this.options.preventDefault;\n};\n\nInteractable.prototype.checkAndPreventDefault = function (event) {\n const setting = this.options.preventDefault;\n\n if (setting === 'never') { return; }\n\n if (setting === 'always') {\n event.preventDefault();\n return;\n }\n\n // setting === 'auto'\n\n // don't preventDefault if the browser supports passiveEvents\n // CSS touch-action and user-selecct should be used instead\n if (events.supportsOptions) {\n return;\n }\n\n // don't preventDefault of pointerdown events\n if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) {\n return;\n }\n\n // don't preventDefault on editable elements\n if (is.element(event.target)\n && matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) {\n return;\n }\n\n event.preventDefault();\n};\n\nfunction onInteractionEvent ({ interaction, event }) {\n if (interaction.target) {\n interaction.target.checkAndPreventDefault(event);\n }\n}\n\nfor (const eventSignal of ['down', 'move', 'up', 'cancel']) {\n Interaction.signals.on(eventSignal, onInteractionEvent);\n}\n\n// prevent native HTML5 drag on interact.js target elements\nInteraction.docEvents.dragstart = function preventNativeDrag (event) {\n for (const interaction of scope.interactions) {\n\n if (interaction.element\n && (interaction.element === event.target\n || nodeContains(interaction.element, event.target))) {\n\n interaction.target.checkAndPreventDefault(event);\n return;\n }\n }\n};\n","const scope = require('./scope');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst iFinder = require('./utils/interactionFinder');\nconst pointerEvents = require('./pointerEvents/base');\n\nconst { window } = require('./utils/window');\n\nconst toString = Object.prototype.toString;\n\nif (!window.Array.isArray) {\n window.Array.isArray = function (obj) {\n return toString.call(obj) === '[object Array]';\n };\n}\n\nif (!String.prototype.trim) {\n String.prototype.trim = function () {\n return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n };\n}\n\n// http://www.quirksmode.org/dom/events/click.html\n// >Events leading to dblclick\n//\n// IE8 doesn't fire down event before dblclick.\n// This workaround tries to fire a tap and doubletap after dblclick\nfunction onIE8Dblclick (event) {\n const eventTarget = event.target;\n const interaction = iFinder.search(event, event.type, eventTarget);\n\n if (!interaction) { return; }\n\n if (interaction.prevTap\n && event.clientX === interaction.prevTap.clientX\n && event.clientY === interaction.prevTap.clientY\n && eventTarget === interaction.prevTap.target) {\n\n interaction.downTargets[0] = eventTarget;\n interaction.downTimes [0] = new Date().getTime();\n\n pointerEvents.fire({\n interaction,\n event,\n eventTarget,\n pointer: event,\n type: 'tap',\n });\n }\n}\n\nif (browser.isIE8) {\n const selectFix = function (event) {\n for (const interaction of scope.interactions) {\n if (interaction.interacting()) {\n interaction.target.checkAndPreventDefault(event);\n }\n }\n };\n\n const onDocIE8 = function onDocIE8 ({ doc, win }, signalName) {\n const eventMethod = signalName.indexOf('listen') === 0\n ? events.add : events.remove;\n\n // For IE's lack of Event#preventDefault\n eventMethod(doc, 'selectstart', selectFix);\n\n if (pointerEvents) {\n eventMethod(doc, 'dblclick', onIE8Dblclick);\n }\n };\n\n scope.signals.on('add-document' , onDocIE8);\n scope.signals.on('remove-document', onDocIE8);\n}\n\nmodule.exports = null;\n","const InteractEvent = require('../InteractEvent');\nconst Interaction = require('../Interaction');\nconst extend = require('../utils/extend');\n\nconst modifiers = {\n names: [],\n\n setOffsets: function (arg) {\n const { interaction, pageCoords: page } = arg;\n const { target, element, startOffset } = interaction;\n const rect = target.getRect(element);\n\n if (rect) {\n startOffset.left = page.x - rect.left;\n startOffset.top = page.y - rect.top;\n\n startOffset.right = rect.right - page.x;\n startOffset.bottom = rect.bottom - page.y;\n\n if (!('width' in rect)) { rect.width = rect.right - rect.left; }\n if (!('height' in rect)) { rect.height = rect.bottom - rect.top ; }\n }\n else {\n startOffset.left = startOffset.top = startOffset.right = startOffset.bottom = 0;\n }\n\n arg.rect = rect;\n arg.interactable = target;\n arg.element = element;\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n\n arg.options = target.options[interaction.prepared.name][modifierName];\n\n if (!arg.options) {\n continue;\n }\n\n interaction.modifierOffsets[modifierName] = modifiers[modifierName].setOffset(arg);\n }\n },\n\n setAll: function (arg) {\n const { interaction, statuses, preEnd, requireEndOnly } = arg;\n const coords = extend({}, arg.pageCoords);\n const result = {\n dx: 0,\n dy: 0,\n changed: false,\n locked: false,\n shouldMove: true,\n };\n\n for (const modifierName of modifiers.names) {\n const modifier = modifiers[modifierName];\n const options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!shouldDo(options, preEnd, requireEndOnly)) { continue; }\n\n arg.status = arg.status = statuses[modifierName];\n arg.options = options;\n arg.offset = arg.interaction.modifierOffsets[modifierName];\n\n modifier.set(arg);\n\n if (arg.status.locked) {\n coords.x += arg.status.dx;\n coords.y += arg.status.dy;\n\n result.dx += arg.status.dx;\n result.dy += arg.status.dy;\n\n result.locked = true;\n }\n }\n\n // a move should be fired if:\n // - there are no modifiers enabled,\n // - no modifiers are \"locked\" i.e. have changed the pointer's coordinates, or\n // - the locked coords have changed since the last pointer move\n result.shouldMove = !arg.status || !result.locked || arg.status.changed;\n\n return result;\n },\n\n resetStatuses: function (statuses) {\n for (const modifierName of modifiers.names) {\n const status = statuses[modifierName] || {};\n\n status.dx = status.dy = 0;\n status.modifiedX = status.modifiedY = NaN;\n status.locked = false;\n status.changed = true;\n\n statuses[modifierName] = status;\n }\n\n return statuses;\n },\n\n start: function ({ interaction }, signalName) {\n const arg = {\n interaction,\n pageCoords: (signalName === 'action-resume' ?\n interaction.curCoords : interaction.startCoords).page,\n startOffset: interaction.startOffset,\n statuses: interaction.modifierStatuses,\n preEnd: false,\n requireEndOnly: false,\n };\n\n modifiers.setOffsets(arg);\n modifiers.resetStatuses(arg.statuses);\n\n arg.pageCoords = extend({}, interaction.startCoords.page);\n interaction.modifierResult = modifiers.setAll(arg);\n },\n};\n\nInteraction.signals.on('new', function (interaction) {\n interaction.startOffset = { left: 0, right: 0, top: 0, bottom: 0 };\n interaction.modifierOffsets = {};\n interaction.modifierStatuses = modifiers.resetStatuses({});\n interaction.modifierResult = null;\n});\n\nInteraction.signals.on('action-start' , modifiers.start);\nInteraction.signals.on('action-resume', modifiers.start);\n\nInteraction.signals.on('before-action-move', function ({ interaction, preEnd, interactingBeforeMove }) {\n const modifierResult = modifiers.setAll({\n interaction,\n preEnd,\n pageCoords: interaction.curCoords.page,\n statuses: interaction.modifierStatuses,\n requireEndOnly: false,\n });\n\n // don't fire an action move if a modifier would keep the event in the same\n // cordinates as before\n if (!modifierResult.shouldMove && interactingBeforeMove) {\n interaction._dontFireMove = true;\n }\n\n interaction.modifierResult = modifierResult;\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n for (let i = 0; i < modifiers.names.length; i++) {\n const options = interaction.target.options[interaction.prepared.name][modifiers.names[i]];\n\n // if the endOnly option is true for any modifier\n if (shouldDo(options, true, true)) {\n // fire a move event at the modified coordinates\n interaction.doMove({ event, preEnd: true });\n break;\n }\n }\n});\n\nInteractEvent.signals.on('set-xy', function (arg) {\n const { iEvent, interaction } = arg;\n const modifierArg = extend({}, arg);\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n modifierArg.options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!modifierArg.options) {\n continue;\n }\n\n const modifier = modifiers[modifierName];\n\n modifierArg.status = interaction.modifierStatuses[modifierName];\n\n iEvent[modifierName] = modifier.modifyCoords(modifierArg);\n }\n});\n\nfunction shouldDo (options, preEnd, requireEndOnly) {\n return (options && options.enabled\n && (preEnd || !options.endOnly)\n && (!requireEndOnly || options.endOnly));\n}\n\nmodule.exports = modifiers;\n","const modifiers = require('./index');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst restrict = {\n defaults: {\n enabled : false,\n endOnly : false,\n restriction: null,\n elementRect: null,\n },\n\n setOffset: function ({ rect, startOffset, options }) {\n const elementRect = options && options.elementRect;\n const offset = {};\n\n if (rect && elementRect) {\n offset.left = startOffset.left - (rect.width * elementRect.left);\n offset.top = startOffset.top - (rect.height * elementRect.top);\n\n offset.right = startOffset.right - (rect.width * (1 - elementRect.right));\n offset.bottom = startOffset.bottom - (rect.height * (1 - elementRect.bottom));\n }\n else {\n offset.left = offset.top = offset.right = offset.bottom = 0;\n }\n\n return offset;\n },\n\n set: function ({ pageCoords, interaction, status, options }) {\n if (!options) { return status; }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n\n const restriction = getRestrictionRect(options.restriction, interaction, page);\n\n if (!restriction) { return status; }\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n const rect = restriction;\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n const offset = interaction.modifierOffsets.restrict;\n\n // object is assumed to have\n // x, y, width, height or\n // left, top, right, bottom\n if ('x' in restriction && 'y' in restriction) {\n modifiedX = Math.max(Math.min(rect.x + rect.width - offset.right , page.x), rect.x + offset.left);\n modifiedY = Math.max(Math.min(rect.y + rect.height - offset.bottom, page.y), rect.y + offset.top );\n }\n else {\n modifiedX = Math.max(Math.min(rect.right - offset.right , page.x), rect.left + offset.left);\n modifiedY = Math.max(Math.min(rect.bottom - offset.bottom, page.y), rect.top + offset.top );\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const elementRect = options && options.elementRect;\n\n if (options && options.enabled\n && !(phase === 'start' && elementRect && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n getRestrictionRect,\n};\n\nfunction getRestrictionRect (value, interaction, page) {\n if (utils.is.function(value)) {\n return utils.resolveRectLike(value, interaction.target, interaction.element, [page.x, page.y, interaction]);\n } else {\n return utils.resolveRectLike(value, interaction.target, interaction.element);\n }\n}\n\nmodifiers.restrict = restrict;\nmodifiers.names.push('restrict');\n\ndefaultOptions.perAction.restrict = restrict.defaults;\n\nmodule.exports = restrict;\n","// This module adds the options.resize.restrictEdges setting which sets min and\n// max for the top, left, bottom and right edges of the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictEdges: {\n// inner: { top: 200, left: 200, right: 400, bottom: 400 },\n// outer: { top: 0, left: 0, right: 600, bottom: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst { getRestrictionRect } = require('./restrict');\n\nconst noInner = { top: +Infinity, left: +Infinity, bottom: -Infinity, right: -Infinity };\nconst noOuter = { top: -Infinity, left: -Infinity, bottom: +Infinity, right: +Infinity };\n\nconst restrictEdges = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n offset: null,\n },\n\n setOffset: function ({ interaction, startOffset, options }) {\n if (!options) {\n return utils.extend({}, startOffset);\n }\n\n const offset = getRestrictionRect(options.offset, interaction, interaction.startCoords.page);\n\n if (offset) {\n return {\n top: startOffset.top + offset.y,\n left: startOffset.left + offset.x,\n bottom: startOffset.bottom + offset.y,\n right: startOffset.right + offset.x,\n };\n }\n\n return startOffset;\n },\n\n set: function ({ pageCoords, interaction, status, offset, options }) {\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n const inner = rectUtils.xywhToTlbr(getRestrictionRect(options.inner, interaction, page)) || noInner;\n const outer = rectUtils.xywhToTlbr(getRestrictionRect(options.outer, interaction, page)) || noOuter;\n\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n if (edges.top) {\n modifiedY = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top);\n }\n else if (edges.bottom) {\n modifiedY = Math.max(Math.min(outer.bottom - offset.bottom, page.y), inner.bottom - offset.bottom);\n }\n if (edges.left) {\n modifiedX = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left);\n }\n else if (edges.right) {\n modifiedX = Math.max(Math.min(outer.right - offset.right, page.x), inner.right - offset.right);\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n if (options && options.enabled\n && !(phase === 'start' && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n noInner,\n noOuter,\n getRestrictionRect,\n};\n\nmodifiers.restrictEdges = restrictEdges;\nmodifiers.names.push('restrictEdges');\n\ndefaultOptions.perAction.restrictEdges = restrictEdges.defaults;\nresize.defaults.restrictEdges = restrictEdges.defaults;\n\nmodule.exports = restrictEdges;\n","// This module adds the options.resize.restrictSize setting which sets min and\n// max width and height for the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictSize: {\n// min: { width: -600, height: -600 },\n// max: { width: 600, height: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst restrictEdges = require('./restrictEdges');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst noMin = { width: -Infinity, height: -Infinity };\nconst noMax = { width: +Infinity, height: +Infinity };\n\nconst restrictSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n },\n\n setOffset: function ({ interaction }) {\n return interaction.startOffset;\n },\n\n set: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const rect = rectUtils.xywhToTlbr(interaction.resizeRects.inverted);\n\n const minSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.min, interaction)) || noMin;\n const maxSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.max, interaction)) || noMax;\n\n arg.options = {\n enabled: options.enabled,\n endOnly: options.endOnly,\n inner: utils.extend({}, restrictEdges.noInner),\n outer: utils.extend({}, restrictEdges.noOuter),\n };\n\n if (edges.top) {\n arg.options.inner.top = rect.bottom - minSize.height;\n arg.options.outer.top = rect.bottom - maxSize.height;\n }\n else if (edges.bottom) {\n arg.options.inner.bottom = rect.top + minSize.height;\n arg.options.outer.bottom = rect.top + maxSize.height;\n }\n if (edges.left) {\n arg.options.inner.left = rect.right - minSize.width;\n arg.options.outer.left = rect.right - maxSize.width;\n }\n else if (edges.right) {\n arg.options.inner.right = rect.left + minSize.width;\n arg.options.outer.right = rect.left + maxSize.width;\n }\n\n restrictEdges.set(arg);\n },\n\n modifyCoords: restrictEdges.modifyCoords,\n};\n\nmodifiers.restrictSize = restrictSize;\nmodifiers.names.push('restrictSize');\n\ndefaultOptions.perAction.restrictSize = restrictSize.defaults;\nresize.defaults.restrictSize = restrictSize.defaults;\n\nmodule.exports = restrictSize;\n","const modifiers = require('./index');\nconst interact = require('../interact');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst snap = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n\n relativePoints: null,\n },\n\n setOffset: function ({ interaction, interactable, element, rect, startOffset, options }) {\n const offsets = [];\n const optionsOrigin = utils.rectToXY(utils.resolveRectLike(options.origin));\n const origin = optionsOrigin || utils.getOriginXY(interactable, element, interaction.prepared.name);\n options = options || interactable.options[interaction.prepared.name].snap || {};\n\n let snapOffset;\n\n if (options.offset === 'startCoords') {\n snapOffset = {\n x: interaction.startCoords.page.x - origin.x,\n y: interaction.startCoords.page.y - origin.y,\n };\n }\n else {\n const offsetRect = utils.resolveRectLike(options.offset, interactable, element, [interaction]);\n\n snapOffset = utils.rectToXY(offsetRect) || { x: 0, y: 0 };\n }\n\n if (rect && options.relativePoints && options.relativePoints.length) {\n for (const { x: relativeX, y: relativeY } of options.relativePoints) {\n offsets.push({\n x: startOffset.left - (rect.width * relativeX) + snapOffset.x,\n y: startOffset.top - (rect.height * relativeY) + snapOffset.y,\n });\n }\n }\n else {\n offsets.push(snapOffset);\n }\n\n return offsets;\n },\n\n set: function ({ interaction, pageCoords, status, options, offset: offsets }) {\n const targets = [];\n let target;\n let page;\n let i;\n\n if (status.useStatusXY) {\n page = { x: status.x, y: status.y };\n }\n else {\n const origin = utils.getOriginXY(interaction.target, interaction.element, interaction.prepared.name);\n\n page = utils.extend({}, pageCoords);\n\n page.x -= origin.x;\n page.y -= origin.y;\n }\n\n status.realX = page.x;\n status.realY = page.y;\n\n let len = options.targets? options.targets.length : 0;\n\n for (const { x: offsetX, y: offsetY } of offsets) {\n const relativeX = page.x - offsetX;\n const relativeY = page.y - offsetY;\n\n for (const snapTarget of options.targets) {\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n targets.push({\n x: utils.is.number(target.x) ? (target.x + offsetX) : relativeX,\n y: utils.is.number(target.y) ? (target.y + offsetY) : relativeY,\n\n range: utils.is.number(target.range)? target.range: options.range,\n });\n }\n }\n\n const closest = {\n target: null,\n inRange: false,\n distance: 0,\n range: 0,\n dx: 0,\n dy: 0,\n };\n\n for (i = 0, len = targets.length; i < len; i++) {\n target = targets[i];\n\n const range = target.range;\n const dx = target.x - page.x;\n const dy = target.y - page.y;\n const distance = utils.hypot(dx, dy);\n let inRange = distance <= range;\n\n // Infinite targets count as being out of range\n // compared to non infinite ones that are in range\n if (range === Infinity && closest.inRange && closest.range !== Infinity) {\n inRange = false;\n }\n\n if (!closest.target || (inRange\n // is the closest target in range?\n ? (closest.inRange && range !== Infinity\n // the pointer is relatively deeper in this target\n ? distance / range < closest.distance / closest.range\n // this target has Infinite range and the closest doesn't\n : (range === Infinity && closest.range !== Infinity)\n // OR this target is closer that the previous closest\n || distance < closest.distance)\n // The other is not in range and the pointer is closer to this target\n : (!closest.inRange && distance < closest.distance))) {\n\n closest.target = target;\n closest.distance = distance;\n closest.range = range;\n closest.inRange = inRange;\n closest.dx = dx;\n closest.dy = dy;\n\n status.range = range;\n }\n }\n\n let snapChanged;\n\n if (closest.target) {\n snapChanged = (status.modifiedX !== closest.target.x || status.modifiedY !== closest.target.y);\n\n status.modifiedX = closest.target.x;\n status.modifiedY = closest.target.y;\n }\n else {\n snapChanged = true;\n\n status.modifiedX = NaN;\n status.modifiedY = NaN;\n }\n\n status.dx = closest.dx;\n status.dy = closest.dy;\n\n status.changed = (snapChanged || (closest.inRange && !status.locked));\n status.locked = closest.inRange;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const relativePoints = options && options.relativePoints;\n\n if (options && options.enabled\n && !(phase === 'start' && relativePoints && relativePoints.length)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n }\n\n return {\n range : status.range,\n locked : status.locked,\n x : status.modifiedX,\n y : status.modifiedY,\n realX : status.realX,\n realY : status.realY,\n dx : status.dx,\n dy : status.dy,\n };\n }\n },\n};\n\ninteract.createSnapGrid = function (grid) {\n return function (x, y) {\n const limits = grid.limits || {\n left : -Infinity,\n right : Infinity,\n top : -Infinity,\n bottom: Infinity,\n };\n let offsetX = 0;\n let offsetY = 0;\n\n if (utils.is.object(grid.offset)) {\n offsetX = grid.offset.x;\n offsetY = grid.offset.y;\n }\n\n const gridx = Math.round((x - offsetX) / grid.x);\n const gridy = Math.round((y - offsetY) / grid.y);\n\n const newX = Math.max(limits.left, Math.min(limits.right , gridx * grid.x + offsetX));\n const newY = Math.max(limits.top , Math.min(limits.bottom, gridy * grid.y + offsetY));\n\n return {\n x: newX,\n y: newY,\n range: grid.range,\n };\n };\n};\n\nmodifiers.snap = snap;\nmodifiers.names.push('snap');\n\ndefaultOptions.perAction.snap = snap.defaults;\n\nmodule.exports = snap;\n","// This module allows snapping of the size of targets during resize\n// interactions.\n\nconst modifiers = require('./index');\nconst snap = require('./snap');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\nconst utils = require('../utils/');\n\nconst snapSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n },\n\n setOffset: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.edges;\n\n if (!edges) { return; }\n\n arg.options = {\n relativePoints: [{\n x: edges.left? 0 : 1,\n y: edges.top ? 0 : 1,\n }],\n origin: { x: 0, y: 0 },\n offset: 'self',\n range: options.range,\n };\n\n const offsets = snap.setOffset(arg);\n arg.options = options;\n\n return offsets;\n },\n\n set: function (arg) {\n const { interaction, options, offset, pageCoords } = arg;\n const page = utils.extend({}, pageCoords);\n const relativeX = page.x - offset[0].x;\n const relativeY = page.y - offset[0].y;\n\n arg.options = utils.extend({}, options);\n arg.options.targets = [];\n\n for (const snapTarget of options.targets) {\n let target;\n\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n if ('width' in target && 'height' in target) {\n target.x = target.width;\n target.y = target.height;\n }\n\n arg.options.targets.push(target);\n }\n\n snap.set(arg);\n },\n\n modifyCoords: function (arg) {\n const { options } = arg;\n\n arg.options = utils.extend({}, options);\n arg.options.enabled = options.enabled;\n arg.options.relativePoints = [null];\n\n snap.modifyCoords(arg);\n },\n};\n\nmodifiers.snapSize = snapSize;\nmodifiers.names.push('snapSize');\n\ndefaultOptions.perAction.snapSize = snapSize.defaults;\nresize.defaults.snapSize = snapSize.defaults;\n\nmodule.exports = snapSize;\n","const pointerUtils = require('../utils/pointerUtils');\n\nmodule.exports = class PointerEvent {\n constructor (type, pointer, event, eventTarget, interaction) {\n pointerUtils.pointerExtend(this, event);\n\n if (event !== pointer) {\n pointerUtils.pointerExtend(this, pointer);\n }\n\n this.interaction = interaction;\n\n this.timeStamp = new Date().getTime();\n this.originalEvent = event;\n this.type = type;\n this.pointerId = pointerUtils.getPointerId(pointer);\n this.pointerType = pointerUtils.getPointerType(pointer);\n this.target = eventTarget;\n this.currentTarget = null;\n\n if (type === 'tap') {\n const pointerIndex = interaction.getPointerIndex(pointer);\n this.dt = this.timeStamp - interaction.downTimes[pointerIndex];\n\n const interval = this.timeStamp - interaction.tapTime;\n\n this.double = !!(interaction.prevTap\n && interaction.prevTap.type !== 'doubletap'\n && interaction.prevTap.target === this.target\n && interval < 500);\n }\n else if (type === 'doubletap') {\n this.dt = pointer.timeStamp - interaction.tapTime;\n }\n }\n\n subtractOrigin ({ x: originX, y: originY }) {\n this.pageX -= originX;\n this.pageY -= originY;\n this.clientX -= originX;\n this.clientY -= originY;\n\n return this;\n }\n\n addOrigin ({ x: originX, y: originY }) {\n this.pageX += originX;\n this.pageY += originY;\n this.clientX += originX;\n this.clientY += originY;\n\n return this;\n }\n\n preventDefault () {\n this.originalEvent.preventDefault();\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n};\n","const PointerEvent = require('./PointerEvent');\nconst Interaction = require('../Interaction');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst defaults = require('../defaultOptions');\nconst signals = require('../utils/Signals').new();\nconst { filter } = require('../utils/arr');\n\nconst simpleSignals = [ 'down', 'up', 'cancel' ];\nconst simpleEvents = [ 'down', 'up', 'cancel' ];\n\nconst pointerEvents = {\n PointerEvent,\n fire,\n collectEventTargets,\n signals,\n defaults: {\n holdDuration: 600,\n ignoreFrom : null,\n allowFrom : null,\n origin : { x: 0, y: 0 },\n },\n types: [\n 'down',\n 'move',\n 'up',\n 'cancel',\n 'tap',\n 'doubletap',\n 'hold',\n ],\n};\n\nfunction fire (arg) {\n const {\n interaction, pointer, event, eventTarget,\n type = arg.pointerEvent.type,\n targets = collectEventTargets(arg),\n pointerEvent = new PointerEvent(type, pointer, event, eventTarget, interaction),\n } = arg;\n\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n targets,\n type,\n pointerEvent,\n };\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n\n for (const prop in target.props || {}) {\n pointerEvent[prop] = target.props[prop];\n }\n\n const origin = utils.getOriginXY(target.eventable, target.element);\n\n pointerEvent.subtractOrigin(origin);\n pointerEvent.eventable = target.eventable;\n pointerEvent.currentTarget = target.element;\n\n target.eventable.fire(pointerEvent);\n\n pointerEvent.addOrigin(origin);\n\n if (pointerEvent.immediatePropagationStopped\n || (pointerEvent.propagationStopped\n && (i + 1) < targets.length && targets[i + 1].element !== pointerEvent.currentTarget)) {\n break;\n }\n }\n\n signals.fire('fired', signalArg);\n\n if (type === 'tap') {\n // if pointerEvent should make a double tap, create and fire a doubletap\n // PointerEvent and use that as the prevTap\n const prevTap = pointerEvent.double\n ? fire({\n interaction, pointer, event, eventTarget,\n type: 'doubletap',\n })\n : pointerEvent;\n\n interaction.prevTap = prevTap;\n interaction.tapTime = prevTap.timeStamp;\n }\n\n return pointerEvent;\n}\n\nfunction collectEventTargets ({ interaction, pointer, event, eventTarget, type }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n // do not fire a tap event if the pointer was moved before being lifted\n if (type === 'tap' && (interaction.pointerWasMoved\n // or if the pointerup target is different to the pointerdown target\n || !(interaction.downTargets[pointerIndex] && interaction.downTargets[pointerIndex] === eventTarget))) {\n return [];\n }\n\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n path,\n targets: [],\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (type === 'hold') {\n signalArg.targets = filter(signalArg.targets, target =>\n target.eventable.options.holdDuration === interaction.holdTimers[pointerIndex].duration);\n }\n\n return signalArg.targets;\n}\n\nInteraction.signals.on('update-pointer-down', function ({ interaction, pointerIndex }) {\n interaction.holdTimers[pointerIndex] = { duration: Infinity, timeout: null };\n});\n\nInteraction.signals.on('remove-pointer', function ({ interaction, pointerIndex }) {\n interaction.holdTimers.splice(pointerIndex, 1);\n});\n\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget, duplicateMove }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n if (!duplicateMove && (!interaction.pointerIsDown || interaction.pointerWasMoved)) {\n if (interaction.pointerIsDown) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n\n fire({\n interaction, pointer, event, eventTarget,\n type: 'move',\n });\n }\n});\n\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget, pointerIndex }) {\n // copy event to be used in timeout for IE8\n const eventCopy = browser.isIE8? utils.extend({}, event) : event;\n\n const timer = interaction.holdTimers[pointerIndex];\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'hold',\n targets: [],\n path,\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (!signalArg.targets.length) { return; }\n\n let minDuration = Infinity;\n\n for (let i = 0; i < signalArg.targets.length; i++) {\n const target = signalArg.targets[i];\n const holdDuration = target.eventable.options.holdDuration;\n\n if (holdDuration < minDuration) {\n minDuration = holdDuration;\n }\n }\n\n timer.duration = minDuration;\n timer.timeout = setTimeout(function () {\n fire({\n interaction,\n eventTarget,\n pointer: browser.isIE8? eventCopy : pointer,\n event: eventCopy,\n type: 'hold',\n });\n }, minDuration);\n});\n\nInteraction.signals.on('up', ({ interaction, pointer, event, eventTarget }) => {\n if (!interaction.pointerWasMoved) {\n fire({ interaction, eventTarget, pointer, event, type: 'tap' });\n }\n});\n\n['up', 'cancel'].forEach(function (signalName) {\n Interaction.signals.on(signalName, function ({ interaction, pointerIndex }) {\n if (interaction.holdTimers[pointerIndex]) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n });\n});\n\nfunction createSignalListener (type) {\n return function ({ interaction, pointer, event, eventTarget }) {\n fire({ interaction, eventTarget, pointer, event, type });\n };\n}\n\nfor (let i = 0; i < simpleSignals.length; i++) {\n Interaction.signals.on(simpleSignals[i], createSignalListener(simpleEvents[i]));\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.prevTap = null; // the most recent tap event on this interaction\n interaction.tapTime = 0; // time of the most recent tap event\n interaction.holdTimers = []; // [{ duration, timeout }]\n});\n\ndefaults.pointerEvents = pointerEvents.defaults;\nmodule.exports = pointerEvents;\n","const pointerEvents = require('./base');\nconst Interaction = require('../Interaction');\n\npointerEvents.signals.on('new', onNew);\npointerEvents.signals.on('fired', onFired);\n\nfor (const signal of ['move', 'up', 'cancel', 'endall']) {\n Interaction.signals.on(signal, endHoldRepeat);\n}\n\nfunction onNew ({ pointerEvent }) {\n if (pointerEvent.type !== 'hold') { return; }\n\n pointerEvent.count = (pointerEvent.count || 0) + 1;\n}\n\nfunction onFired ({ interaction, pointerEvent, eventTarget, targets }) {\n if (pointerEvent.type !== 'hold' || !targets.length) { return; }\n\n // get the repeat interval from the first eventable\n const interval = targets[0].eventable.options.holdRepeatInterval;\n\n // don't repeat if the interval is 0 or less\n if (interval <= 0) { return; }\n\n // set a timeout to fire the holdrepeat event\n interaction.holdIntervalHandle = setTimeout(function () {\n pointerEvents.fire({\n interaction,\n eventTarget,\n type: 'hold',\n pointer: pointerEvent,\n event: pointerEvent,\n });\n }, interval);\n}\n\nfunction endHoldRepeat ({ interaction }) {\n // set the interaction's holdStopTime property\n // to stop further holdRepeat events\n if (interaction.holdIntervalHandle) {\n clearInterval(interaction.holdIntervalHandle);\n interaction.holdIntervalHandle = null;\n }\n}\n\n// don't repeat by default\npointerEvents.defaults.holdRepeatInterval = 0;\npointerEvents.types.push('holdrepeat');\n\nmodule.exports = {\n onNew,\n onFired,\n endHoldRepeat,\n};\n","const pointerEvents = require('./base');\nconst Interactable = require('../Interactable');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\nconst scope = require('../scope');\nconst extend = require('../utils/extend');\nconst { merge } = require('../utils/arr');\n\npointerEvents.signals.on('collect-targets', function ({ targets, element, type, eventTarget }) {\n function collectSelectors (interactable, selector, context) {\n const els = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && is.element(element)\n && domUtils.matchesSelector(element, selector, els)\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n const interactable = scope.interactables.get(element);\n\n if (interactable) {\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n scope.interactables.forEachSelector(collectSelectors, element);\n});\n\nInteractable.signals.on('new', function ({ interactable }) {\n interactable.events.getRect = function (element) {\n return interactable.getRect(element);\n };\n});\n\nInteractable.signals.on('set', function ({ interactable, options }) {\n extend(interactable.events.options, pointerEvents.defaults);\n extend(interactable.events.options, options);\n});\n\nmerge(Interactable.eventTypes, pointerEvents.types);\n\nInteractable.prototype.pointerEvents = function (options) {\n extend(this.events.options, options);\n\n return this;\n};\n\nconst __backCompatOption = Interactable.prototype._backCompatOption;\n\nInteractable.prototype._backCompatOption = function (optionName, newValue) {\n const ret = __backCompatOption.call(this, optionName, newValue);\n\n if (ret === this) {\n this.events.options[optionName] = newValue;\n }\n\n return ret;\n};\n\nInteractable.settingsMethods.push('pointerEvents');\n","const utils = require('./utils');\nconst events = require('./utils/events');\nconst signals = require('./utils/Signals').new();\n\nconst scope = {\n signals,\n events,\n utils,\n\n // main document\n document: require('./utils/domObjects').document,\n // all documents being listened to\n documents: [],\n\n addDocument: function (doc, win) {\n // do nothing if document is already known\n if (utils.contains(scope.documents, doc)) { return false; }\n\n win = win || scope.getWindow(doc);\n\n scope.documents.push(doc);\n events.documents.push(doc);\n\n // don't add an unload event for the main document\n // so that the page may be cached in browser history\n if (doc !== scope.document) {\n events.add(win, 'unload', scope.onWindowUnload);\n }\n\n signals.fire('add-document', { doc, win });\n },\n\n removeDocument: function (doc, win) {\n const index = utils.indexOf(scope.documents, doc);\n\n win = win || scope.getWindow(doc);\n\n events.remove(win, 'unload', scope.onWindowUnload);\n\n scope.documents.splice(index, 1);\n events.documents.splice(index, 1);\n\n signals.fire('remove-document', { win, doc });\n },\n\n onWindowUnload: function () {\n scope.removeDocument(this.document, this);\n },\n};\n\nmodule.exports = scope;\n","const { indexOf } = require('./arr');\n\nclass Signals {\n constructor () {\n this.listeners = {\n // signalName: [listeners],\n };\n }\n\n on (name, listener) {\n if (!this.listeners[name]) {\n this.listeners[name] = [listener];\n return;\n }\n\n this.listeners[name].push(listener);\n }\n\n off (name, listener) {\n if (!this.listeners[name]) { return; }\n\n const index = indexOf(this.listeners[name], listener);\n\n if (index !== -1) {\n this.listeners[name].splice(index, 1);\n }\n }\n\n fire (name, arg) {\n const targetListeners = this.listeners[name];\n\n if (!targetListeners) { return; }\n\n for (let i = 0; i < targetListeners.length; i++) {\n if (targetListeners[i](arg, name) === false) {\n return;\n }\n }\n }\n}\n\nSignals.new = function () {\n return new Signals();\n};\n\nmodule.exports = Signals;\n","function indexOf (array, target) {\n for (let i = 0, len = array.length; i < len; i++) {\n if (array[i] === target) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction contains (array, target) {\n return indexOf(array, target) !== -1;\n}\n\nfunction merge (target, source) {\n for (let i = 0; i < source.length; i++) {\n target.push(source[i]);\n }\n\n return target;\n}\n\nfunction filter (array, test) {\n const result = [];\n\n for (let i = 0; i < array.length; i++) {\n if (test(array[i])) {\n result.push(array[i]);\n }\n }\n\n return result;\n}\n\nmodule.exports = {\n indexOf,\n contains,\n merge,\n filter,\n};\n","const { window } = require('./window');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst Element = domObjects.Element;\nconst navigator = window.navigator;\n\nconst browser = {\n // Does the browser support touch input?\n supportsTouch: !!(('ontouchstart' in window) || is.function(window.DocumentTouch)\n && domObjects.document instanceof window.DocumentTouch),\n\n // Does the browser support PointerEvents\n supportsPointerEvent: !!domObjects.PointerEvent,\n\n isIE8: ('attachEvent' in window) && !('addEventListener' in window),\n\n // Opera Mobile must be handled differently\n isOperaMobile: (navigator.appName === 'Opera'\n && browser.supportsTouch\n && navigator.userAgent.match('Presto')),\n\n // scrolling doesn't change the result of getClientRects on iOS 7\n isIOS7: (/iP(hone|od|ad)/.test(navigator.platform)\n && /OS 7[^\\d]/.test(navigator.appVersion)),\n\n isIe9OrOlder: /MSIE (8|9)/.test(navigator.userAgent),\n\n // prefix matchesSelector\n prefixedMatchesSelector: 'matches' in Element.prototype\n ? 'matches': 'webkitMatchesSelector' in Element.prototype\n ? 'webkitMatchesSelector': 'mozMatchesSelector' in Element.prototype\n ? 'mozMatchesSelector': 'oMatchesSelector' in Element.prototype\n ? 'oMatchesSelector': 'msMatchesSelector',\n\n useMatchesSelectorPolyfill: false,\n\n pEventTypes: (domObjects.PointerEvent\n ? (domObjects.PointerEvent === window.MSPointerEvent\n ? {\n up: 'MSPointerUp',\n down: 'MSPointerDown',\n over: 'mouseover',\n out: 'mouseout',\n move: 'MSPointerMove',\n cancel: 'MSPointerCancel',\n }\n : {\n up: 'pointerup',\n down: 'pointerdown',\n over: 'pointerover',\n out: 'pointerout',\n move: 'pointermove',\n cancel: 'pointercancel',\n })\n : null),\n\n // because Webkit and Opera still use 'mousewheel' event type\n wheelEvent: 'onmousewheel' in domObjects.document? 'mousewheel': 'wheel',\n\n};\n\nbrowser.useMatchesSelectorPolyfill = !is.function(Element.prototype[browser.prefixedMatchesSelector]);\n\nmodule.exports = browser;\n","const domObjects = {};\nconst win = require('./window').window;\n\nfunction blank () {}\n\ndomObjects.document = win.document;\ndomObjects.DocumentFragment = win.DocumentFragment || blank;\ndomObjects.SVGElement = win.SVGElement || blank;\ndomObjects.SVGSVGElement = win.SVGSVGElement || blank;\ndomObjects.SVGElementInstance = win.SVGElementInstance || blank;\ndomObjects.Element = win.Element || blank;\ndomObjects.HTMLElement = win.HTMLElement || domObjects.Element;\n\ndomObjects.Event = win.Event;\ndomObjects.Touch = win.Touch || blank;\ndomObjects.PointerEvent = (win.PointerEvent || win.MSPointerEvent);\n\nmodule.exports = domObjects;\n","const win = require('./window');\nconst browser = require('./browser');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst domUtils = {\n nodeContains: function (parent, child) {\n while (child) {\n if (child === parent) {\n return true;\n }\n\n child = child.parentNode;\n }\n\n return false;\n },\n\n closest: function (element, selector) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) { return element; }\n\n element = domUtils.parentNode(element);\n }\n\n return null;\n },\n\n parentNode: function (node) {\n let parent = node.parentNode;\n\n if (is.docFrag(parent)) {\n // skip past #shado-root fragments\n while ((parent = parent.host) && is.docFrag(parent)) {\n continue;\n }\n\n return parent;\n }\n\n return parent;\n },\n\n // taken from http://tanalin.com/en/blog/2012/12/matches-selector-ie8/ and modified\n matchesSelectorPolyfill: browser.useMatchesSelectorPolyfill\n ? function (element, selector, elems) {\n elems = elems || element.parentNode.querySelectorAll(selector);\n\n for (let i = 0, len = elems.length; i < len; i++) {\n if (elems[i] === element) {\n return true;\n }\n }\n\n return false;\n }\n : null,\n\n matchesSelector: function (element, selector, nodeList) {\n if (browser.useMatchesSelectorPolyfill) {\n return domUtils.matchesSelectorPolyfill(element, selector, nodeList);\n }\n\n // remove /deep/ from selectors if shadowDOM polyfill is used\n if (win.window !== win.realWindow) {\n selector = selector.replace(/\\/deep\\//g, ' ');\n }\n\n return element[browser.prefixedMatchesSelector](selector);\n },\n\n // Test for the element that's \"above\" all other qualifiers\n indexOfDeepestElement: function (elements) {\n let deepestZoneParents = [];\n let dropzoneParents = [];\n let dropzone;\n let deepestZone = elements[0];\n let index = deepestZone? 0: -1;\n let parent;\n let child;\n let i;\n let n;\n\n for (i = 1; i < elements.length; i++) {\n dropzone = elements[i];\n\n // an element might belong to multiple selector dropzones\n if (!dropzone || dropzone === deepestZone) {\n continue;\n }\n\n if (!deepestZone) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n // check if the deepest or current are document.documentElement or document.rootElement\n // - if the current dropzone is, do nothing and continue\n if (dropzone.parentNode === dropzone.ownerDocument) {\n continue;\n }\n // - if deepest is, update with the current dropzone and continue to next\n else if (deepestZone.parentNode === dropzone.ownerDocument) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n if (!deepestZoneParents.length) {\n parent = deepestZone;\n while (parent.parentNode && parent.parentNode !== parent.ownerDocument) {\n deepestZoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n }\n\n // if this element is an svg element and the current deepest is\n // an HTMLElement\n if (deepestZone instanceof domObjects.HTMLElement\n && dropzone instanceof domObjects.SVGElement\n && !(dropzone instanceof domObjects.SVGSVGElement)) {\n\n if (dropzone === deepestZone.parentNode) {\n continue;\n }\n\n parent = dropzone.ownerSVGElement;\n }\n else {\n parent = dropzone;\n }\n\n dropzoneParents = [];\n\n while (parent.parentNode !== parent.ownerDocument) {\n dropzoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n\n n = 0;\n\n // get (position of last common ancestor) + 1\n while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) {\n n++;\n }\n\n const parents = [\n dropzoneParents[n - 1],\n dropzoneParents[n],\n deepestZoneParents[n],\n ];\n\n child = parents[0].lastChild;\n\n while (child) {\n if (child === parents[1]) {\n deepestZone = dropzone;\n index = i;\n deepestZoneParents = [];\n\n break;\n }\n else if (child === parents[2]) {\n break;\n }\n\n child = child.previousSibling;\n }\n }\n\n return index;\n },\n\n matchesUpTo: function (element, selector, limit) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) {\n return true;\n }\n\n element = domUtils.parentNode(element);\n\n if (element === limit) {\n return domUtils.matchesSelector(element, selector);\n }\n }\n\n return false;\n },\n\n getActualElement: function (element) {\n return (element instanceof domObjects.SVGElementInstance\n ? element.correspondingUseElement\n : element);\n },\n\n getScrollXY: function (relevantWindow) {\n relevantWindow = relevantWindow || win.window;\n return {\n x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft,\n y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop,\n };\n },\n\n getElementClientRect: function (element) {\n const clientRect = (element instanceof domObjects.SVGElement\n ? element.getBoundingClientRect()\n : element.getClientRects()[0]);\n\n return clientRect && {\n left : clientRect.left,\n right : clientRect.right,\n top : clientRect.top,\n bottom: clientRect.bottom,\n width : clientRect.width || clientRect.right - clientRect.left,\n height: clientRect.height || clientRect.bottom - clientRect.top,\n };\n },\n\n getElementRect: function (element) {\n const clientRect = domUtils.getElementClientRect(element);\n\n if (!browser.isIOS7 && clientRect) {\n const scroll = domUtils.getScrollXY(win.getWindow(element));\n\n clientRect.left += scroll.x;\n clientRect.right += scroll.x;\n clientRect.top += scroll.y;\n clientRect.bottom += scroll.y;\n }\n\n return clientRect;\n },\n\n getPath: function (element) {\n const path = [];\n\n while (element) {\n path.push(element);\n element = domUtils.parentNode(element);\n }\n\n return path;\n },\n\n trySelector: value => {\n if (!is.string(value)) { return false; }\n\n // an exception will be raised if it is invalid\n domObjects.document.querySelector(value);\n return true;\n },\n};\n\nmodule.exports = domUtils;\n","const is = require('./is');\nconst domUtils = require('./domUtils');\nconst pExtend = require('./pointerExtend');\n\nconst { window, getWindow } = require('./window');\nconst { indexOf, contains } = require('./arr');\n\nconst useAttachEvent = ('attachEvent' in window) && !('addEventListener' in window);\nconst addEvent = useAttachEvent? 'attachEvent': 'addEventListener';\nconst removeEvent = useAttachEvent? 'detachEvent': 'removeEventListener';\nconst on = useAttachEvent? 'on': '';\n\nconst elements = [];\nconst targets = [];\nconst attachedListeners = [];\n\n// {\n// type: {\n// selectors: ['selector', ...],\n// contexts : [document, ...],\n// listeners: [[listener, capture, passive], ...]\n// }\n// }\nconst delegatedEvents = {};\n\nconst documents = [];\n\nconst supportsOptions = !useAttachEvent && (() => {\n let supported = false;\n\n window.document.createElement('div').addEventListener('test', null, {\n get capture () { supported = true; },\n });\n\n return supported;\n})();\n\nfunction add (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n let elementIndex = indexOf(elements, element);\n let target = targets[elementIndex];\n\n if (!target) {\n target = {\n events: {},\n typeCount: 0,\n };\n\n elementIndex = elements.push(element) - 1;\n targets.push(target);\n\n attachedListeners.push(useAttachEvent\n ? {\n supplied: [],\n wrapped : [],\n useCount: [],\n }\n : null);\n }\n\n if (!target.events[type]) {\n target.events[type] = [];\n target.typeCount++;\n }\n\n if (!contains(target.events[type], listener)) {\n let ret;\n\n if (useAttachEvent) {\n const { supplied, wrapped, useCount } = attachedListeners[elementIndex];\n const listenerIndex = indexOf(supplied, listener);\n\n const wrappedListener = wrapped[listenerIndex] || function (event) {\n if (!event.immediatePropagationStopped) {\n event.target = event.srcElement;\n event.currentTarget = element;\n\n event.preventDefault = event.preventDefault || preventDef;\n event.stopPropagation = event.stopPropagation || stopProp;\n event.stopImmediatePropagation = event.stopImmediatePropagation || stopImmProp;\n\n if (/mouse|click/.test(event.type)) {\n event.pageX = event.clientX + getWindow(element).document.documentElement.scrollLeft;\n event.pageY = event.clientY + getWindow(element).document.documentElement.scrollTop;\n }\n\n listener(event);\n }\n };\n\n ret = element[addEvent](on + type, wrappedListener, !!options.capture);\n\n if (listenerIndex === -1) {\n supplied.push(listener);\n wrapped.push(wrappedListener);\n useCount.push(1);\n }\n else {\n useCount[listenerIndex]++;\n }\n }\n else {\n ret = element[addEvent](type, listener, supportsOptions? options : !!options.capture);\n }\n target.events[type].push(listener);\n\n return ret;\n }\n}\n\nfunction remove (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const elementIndex = indexOf(elements, element);\n const target = targets[elementIndex];\n\n if (!target || !target.events) {\n return;\n }\n\n let wrappedListener = listener;\n let listeners;\n let listenerIndex;\n\n if (useAttachEvent) {\n listeners = attachedListeners[elementIndex];\n listenerIndex = indexOf(listeners.supplied, listener);\n wrappedListener = listeners.wrapped[listenerIndex];\n }\n\n if (type === 'all') {\n for (type in target.events) {\n if (target.events.hasOwnProperty(type)) {\n remove(element, type, 'all');\n }\n }\n return;\n }\n\n if (target.events[type]) {\n const len = target.events[type].length;\n\n if (listener === 'all') {\n for (let i = 0; i < len; i++) {\n remove(element, type, target.events[type][i], options);\n }\n return;\n }\n else {\n for (let i = 0; i < len; i++) {\n if (target.events[type][i] === listener) {\n element[removeEvent](on + type, wrappedListener, supportsOptions? options : !!options.capture);\n target.events[type].splice(i, 1);\n\n if (useAttachEvent && listeners) {\n listeners.useCount[listenerIndex]--;\n if (listeners.useCount[listenerIndex] === 0) {\n listeners.supplied.splice(listenerIndex, 1);\n listeners.wrapped.splice(listenerIndex, 1);\n listeners.useCount.splice(listenerIndex, 1);\n }\n }\n\n break;\n }\n }\n }\n\n if (target.events[type] && target.events[type].length === 0) {\n target.events[type] = null;\n target.typeCount--;\n }\n }\n\n if (!target.typeCount) {\n targets.splice(elementIndex, 1);\n elements.splice(elementIndex, 1);\n attachedListeners.splice(elementIndex, 1);\n }\n}\n\nfunction addDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n if (!delegatedEvents[type]) {\n delegatedEvents[type] = {\n selectors: [],\n contexts : [],\n listeners: [],\n };\n\n // add delegate listener functions\n for (let i = 0; i < documents.length; i++) {\n add(documents[i], type, delegateListener);\n add(documents[i], type, delegateUseCapture, true);\n }\n }\n\n const delegated = delegatedEvents[type];\n let index;\n\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n break;\n }\n }\n\n if (index === -1) {\n index = delegated.selectors.length;\n\n delegated.selectors.push(selector);\n delegated.contexts .push(context);\n delegated.listeners.push([]);\n }\n\n // keep listener and capture and passive flags\n delegated.listeners[index].push([listener, !!options.capture, options.passive]);\n}\n\nfunction removeDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const delegated = delegatedEvents[type];\n let matchFound = false;\n let index;\n\n if (!delegated) { return; }\n\n // count from last index of delegated to 0\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n // look for matching selector and context Node\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n\n const listeners = delegated.listeners[index];\n\n // each item of the listeners array is an array: [function, capture, passive]\n for (let i = listeners.length - 1; i >= 0; i--) {\n const [fn, capture, passive] = listeners[i];\n\n // check if the listener functions and capture and passive flags match\n if (fn === listener && capture === !!options.capture && passive === options.passive) {\n // remove the listener from the array of listeners\n listeners.splice(i, 1);\n\n // if all listeners for this interactable have been removed\n // remove the interactable from the delegated arrays\n if (!listeners.length) {\n delegated.selectors.splice(index, 1);\n delegated.contexts .splice(index, 1);\n delegated.listeners.splice(index, 1);\n\n // remove delegate function from context\n remove(context, type, delegateListener);\n remove(context, type, delegateUseCapture, true);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegatedEvents[type] = null;\n }\n }\n\n // only remove one listener\n matchFound = true;\n break;\n }\n }\n\n if (matchFound) { break; }\n }\n }\n}\n\n// bound to the interactable context when a DOM event\n// listener is added to a selector interactable\nfunction delegateListener (event, optionalArg) {\n const options = getOptions(optionalArg);\n const fakeEvent = {};\n const delegated = delegatedEvents[event.type];\n const eventTarget = (domUtils.getActualElement(event.path\n ? event.path[0]\n : event.target));\n let element = eventTarget;\n\n // duplicate the event so that currentTarget can be changed\n pExtend(fakeEvent, event);\n\n fakeEvent.originalEvent = event;\n fakeEvent.preventDefault = preventOriginalDefault;\n\n // climb up document tree looking for selector matches\n while (is.element(element)) {\n for (let i = 0; i < delegated.selectors.length; i++) {\n const selector = delegated.selectors[i];\n const context = delegated.contexts[i];\n\n if (domUtils.matchesSelector(element, selector)\n && domUtils.nodeContains(context, eventTarget)\n && domUtils.nodeContains(context, element)) {\n\n const listeners = delegated.listeners[i];\n\n fakeEvent.currentTarget = element;\n\n for (let j = 0; j < listeners.length; j++) {\n const [fn, capture, passive] = listeners[j];\n\n if (capture === !!options.capture && passive === options.passive) {\n fn(fakeEvent);\n }\n }\n }\n }\n\n element = domUtils.parentNode(element);\n }\n}\n\nfunction delegateUseCapture (event) {\n return delegateListener.call(this, event, true);\n}\n\nfunction preventDef () {\n this.returnValue = false;\n}\n\nfunction preventOriginalDefault () {\n this.originalEvent.preventDefault();\n}\n\nfunction stopProp () {\n this.cancelBubble = true;\n}\n\nfunction stopImmProp () {\n this.cancelBubble = true;\n this.immediatePropagationStopped = true;\n}\n\nfunction getOptions (param) {\n return is.object(param)? param : { capture: param };\n}\n\nmodule.exports = {\n add,\n remove,\n\n addDelegate,\n removeDelegate,\n\n delegateListener,\n delegateUseCapture,\n delegatedEvents,\n documents,\n\n useAttachEvent,\n supportsOptions,\n\n _elements: elements,\n _targets: targets,\n _attachedListeners: attachedListeners,\n};\n","module.exports = function extend (dest, source) {\n for (const prop in source) {\n dest[prop] = source[prop];\n }\n return dest;\n};\n","const {\n resolveRectLike,\n rectToXY,\n} = require('./rect');\n\nmodule.exports = function (target, element, action) {\n const actionOptions = target.options[action];\n const actionOrigin = actionOptions && actionOptions.origin;\n const origin = actionOrigin || target.options.origin;\n\n const originRect = resolveRectLike(origin, target, element, [target && element]);\n\n return rectToXY(originRect) || { x: 0, y: 0 };\n};\n","module.exports = (x, y) => Math.sqrt(x * x + y * y);\n","const extend = require('./extend');\nconst win = require('./window');\n\nconst utils = {\n warnOnce: function (method, message) {\n let warned = false;\n\n return function () {\n if (!warned) {\n win.window.console.warn(message);\n warned = true;\n }\n\n return method.apply(this, arguments);\n };\n },\n\n // http://stackoverflow.com/a/5634528/2280888\n _getQBezierValue: function (t, p1, p2, p3) {\n const iT = 1 - t;\n return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3;\n },\n\n getQuadraticCurvePoint: function (startX, startY, cpX, cpY, endX, endY, position) {\n return {\n x: utils._getQBezierValue(position, startX, cpX, endX),\n y: utils._getQBezierValue(position, startY, cpY, endY),\n };\n },\n\n // http://gizma.com/easing/\n easeOutQuad: function (t, b, c, d) {\n t /= d;\n return -c * t*(t-2) + b;\n },\n\n copyAction: function (dest, src) {\n dest.name = src.name;\n dest.axis = src.axis;\n dest.edges = src.edges;\n\n return dest;\n },\n\n is : require('./is'),\n extend : extend,\n hypot : require('./hypot'),\n getOriginXY: require('./getOriginXY'),\n};\n\nextend(utils, require('./arr'));\nextend(utils, require('./domUtils'));\nextend(utils, require('./pointerUtils'));\nextend(utils, require('./rect'));\n\nmodule.exports = utils;\n","const scope = require('../scope');\nconst utils = require('./index');\n\nconst finder = {\n methodOrder: [ 'simulationResume', 'mouseOrPen', 'hasPointer', 'idle' ],\n\n search: function (pointer, eventType, eventTarget) {\n const pointerType = utils.getPointerType(pointer);\n const pointerId = utils.getPointerId(pointer);\n const details = { pointer, pointerId, pointerType, eventType, eventTarget };\n\n for (const method of finder.methodOrder) {\n const interaction = finder[method](details);\n\n if (interaction) {\n return interaction;\n }\n }\n },\n\n // try to resume simulation with a new pointer\n simulationResume: function ({ pointerType, eventType, eventTarget }) {\n if (!/down|start/i.test(eventType)) {\n return null;\n }\n\n for (const interaction of scope.interactions) {\n let element = eventTarget;\n\n if (interaction.simulation && interaction.simulation.allowResume\n && (interaction.pointerType === pointerType)) {\n while (element) {\n // if the element is the interaction element\n if (element === interaction.element) {\n return interaction;\n }\n element = utils.parentNode(element);\n }\n }\n }\n\n return null;\n },\n\n // if it's a mouse or pen interaction\n mouseOrPen: function ({ pointerId, pointerType, eventType }) {\n if (pointerType !== 'mouse' && pointerType !== 'pen') {\n return null;\n }\n\n let firstNonActive;\n\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType) {\n // if it's a down event, skip interactions with running simulations\n if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; }\n\n // if the interaction is active, return it immediately\n if (interaction.interacting()) {\n return interaction;\n }\n // otherwise save it and look for another active interaction\n else if (!firstNonActive) {\n firstNonActive = interaction;\n }\n }\n }\n\n // if no active mouse interaction was found use the first inactive mouse\n // interaction\n if (firstNonActive) {\n return firstNonActive;\n }\n\n // find any mouse or pen interaction.\n // ignore the interaction if the eventType is a *down, and a simulation\n // is active\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType && !(/down/i.test(eventType) && interaction.simulation)) {\n return interaction;\n }\n }\n\n return null;\n },\n\n // get interaction that has this pointer\n hasPointer: function ({ pointerId }) {\n for (const interaction of scope.interactions) {\n if (utils.contains(interaction.pointerIds, pointerId)) {\n return interaction;\n }\n }\n },\n\n // get first idle interaction with a matching pointerType\n idle: function ({ pointerType }) {\n for (const interaction of scope.interactions) {\n // if there's already a pointer held down\n if (interaction.pointerIds.length === 1) {\n const target = interaction.target;\n // don't add this pointer if there is a target interactable and it\n // isn't gesturable\n if (target && !target.options.gesture.enabled) {\n continue;\n }\n }\n // maximum of 2 pointers per interaction\n else if (interaction.pointerIds.length >= 2) {\n continue;\n }\n\n if (!interaction.interacting() && (pointerType === interaction.pointerType)) {\n return interaction;\n }\n }\n\n return null;\n },\n};\n\nmodule.exports = finder;\n","const win = require('./window');\nconst isWindow = require('./isWindow');\n\nconst is = {\n array : () => {},\n\n window : thing => thing === win.window || isWindow(thing),\n\n docFrag : thing => is.object(thing) && thing.nodeType === 11,\n\n object : thing => !!thing && (typeof thing === 'object'),\n\n function: thing => typeof thing === 'function',\n\n number : thing => typeof thing === 'number' ,\n\n bool : thing => typeof thing === 'boolean' ,\n\n string : thing => typeof thing === 'string' ,\n\n element: thing => {\n if (!thing || (typeof thing !== 'object')) { return false; }\n\n const _window = win.getWindow(thing) || win.window;\n\n return (/object|function/.test(typeof _window.Element)\n ? thing instanceof _window.Element //DOM2\n : thing.nodeType === 1 && typeof thing.nodeName === 'string');\n },\n};\n\nis.array = thing => (is.object(thing)\n && (typeof thing.length !== 'undefined')\n && is.function(thing.splice));\n\nmodule.exports = is;\n","module.exports = (thing) => !!(thing && thing.Window) && (thing instanceof thing.Window);\n","function pointerExtend (dest, source) {\n for (const prop in source) {\n const prefixedPropREs = module.exports.prefixedPropREs;\n let deprecated = false;\n\n // skip deprecated prefixed properties\n for (const vendor in prefixedPropREs) {\n if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) {\n deprecated = true;\n break;\n }\n }\n\n if (!deprecated && typeof source[prop] !== 'function') {\n dest[prop] = source[prop];\n }\n }\n return dest;\n}\n\npointerExtend.prefixedPropREs = {\n webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/,\n};\n\nmodule.exports = pointerExtend;\n","const hypot = require('./hypot');\nconst browser = require('./browser');\nconst dom = require('./domObjects');\nconst domUtils = require('./domUtils');\nconst domObjects = require('./domObjects');\nconst is = require('./is');\nconst pointerExtend = require('./pointerExtend');\n\nconst pointerUtils = {\n copyCoords: function (dest, src) {\n dest.page = dest.page || {};\n dest.page.x = src.page.x;\n dest.page.y = src.page.y;\n\n dest.client = dest.client || {};\n dest.client.x = src.client.x;\n dest.client.y = src.client.y;\n\n dest.timeStamp = src.timeStamp;\n },\n\n setCoordDeltas: function (targetObj, prev, cur) {\n targetObj.page.x = cur.page.x - prev.page.x;\n targetObj.page.y = cur.page.y - prev.page.y;\n targetObj.client.x = cur.client.x - prev.client.x;\n targetObj.client.y = cur.client.y - prev.client.y;\n targetObj.timeStamp = cur.timeStamp - prev.timeStamp;\n\n // set pointer velocity\n const dt = Math.max(targetObj.timeStamp / 1000, 0.001);\n\n targetObj.page.speed = hypot(targetObj.page.x, targetObj.page.y) / dt;\n targetObj.page.vx = targetObj.page.x / dt;\n targetObj.page.vy = targetObj.page.y / dt;\n\n targetObj.client.speed = hypot(targetObj.client.x, targetObj.page.y) / dt;\n targetObj.client.vx = targetObj.client.x / dt;\n targetObj.client.vy = targetObj.client.y / dt;\n },\n\n isNativePointer: function (pointer) {\n return (pointer instanceof dom.Event || pointer instanceof dom.Touch);\n },\n\n // Get specified X/Y coords for mouse or event.touches[0]\n getXY: function (type, pointer, xy) {\n xy = xy || {};\n type = type || 'page';\n\n xy.x = pointer[type + 'X'];\n xy.y = pointer[type + 'Y'];\n\n return xy;\n },\n\n getPageXY: function (pointer, page) {\n page = page || {};\n\n // Opera Mobile handles the viewport and scrolling oddly\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n pointerUtils.getXY('screen', pointer, page);\n\n page.x += window.scrollX;\n page.y += window.scrollY;\n }\n else {\n pointerUtils.getXY('page', pointer, page);\n }\n\n return page;\n },\n\n getClientXY: function (pointer, client) {\n client = client || {};\n\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n // Opera Mobile handles the viewport and scrolling oddly\n pointerUtils.getXY('screen', pointer, client);\n }\n else {\n pointerUtils.getXY('client', pointer, client);\n }\n\n return client;\n },\n\n getPointerId: function (pointer) {\n return is.number(pointer.pointerId)? pointer.pointerId : pointer.identifier;\n },\n\n setCoords: function (targetObj, pointers, timeStamp) {\n const pointer = (pointers.length > 1\n ? pointerUtils.pointerAverage(pointers)\n : pointers[0]);\n\n const tmpXY = {};\n\n pointerUtils.getPageXY(pointer, tmpXY);\n targetObj.page.x = tmpXY.x;\n targetObj.page.y = tmpXY.y;\n\n pointerUtils.getClientXY(pointer, tmpXY);\n targetObj.client.x = tmpXY.x;\n targetObj.client.y = tmpXY.y;\n\n targetObj.timeStamp = is.number(timeStamp) ? timeStamp :new Date().getTime();\n },\n\n pointerExtend: pointerExtend,\n\n getTouchPair: function (event) {\n const touches = [];\n\n // array of touches is supplied\n if (is.array(event)) {\n touches[0] = event[0];\n touches[1] = event[1];\n }\n // an event\n else {\n if (event.type === 'touchend') {\n if (event.touches.length === 1) {\n touches[0] = event.touches[0];\n touches[1] = event.changedTouches[0];\n }\n else if (event.touches.length === 0) {\n touches[0] = event.changedTouches[0];\n touches[1] = event.changedTouches[1];\n }\n }\n else {\n touches[0] = event.touches[0];\n touches[1] = event.touches[1];\n }\n }\n\n return touches;\n },\n\n pointerAverage: function (pointers) {\n const average = {\n pageX : 0,\n pageY : 0,\n clientX: 0,\n clientY: 0,\n screenX: 0,\n screenY: 0,\n };\n\n for (const pointer of pointers) {\n for (const prop in average) {\n average[prop] += pointer[prop];\n }\n }\n for (const prop in average) {\n average[prop] /= pointers.length;\n }\n\n return average;\n },\n\n touchBBox: function (event) {\n if (!event.length && !(event.touches && event.touches.length > 1)) {\n return;\n }\n\n const touches = pointerUtils.getTouchPair(event);\n const minX = Math.min(touches[0].pageX, touches[1].pageX);\n const minY = Math.min(touches[0].pageY, touches[1].pageY);\n const maxX = Math.max(touches[0].pageX, touches[1].pageX);\n const maxY = Math.max(touches[0].pageY, touches[1].pageY);\n\n return {\n x: minX,\n y: minY,\n left: minX,\n top: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n },\n\n touchDistance: function (event, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n\n\n const dx = touches[0][sourceX] - touches[1][sourceX];\n const dy = touches[0][sourceY] - touches[1][sourceY];\n\n return hypot(dx, dy);\n },\n\n touchAngle: function (event, prevAngle, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n const dx = touches[1][sourceX] - touches[0][sourceX];\n const dy = touches[1][sourceY] - touches[0][sourceY];\n const angle = 180 * Math.atan2(dy , dx) / Math.PI;\n\n return angle;\n },\n\n getPointerType: function (pointer) {\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : is.number(pointer.pointerType)\n ? [undefined, undefined,'touch', 'pen', 'mouse'][pointer.pointerType]\n // if the PointerEvent API isn't available, then the \"pointer\" must\n // be either a MouseEvent, TouchEvent, or Touch object\n : /touch/.test(pointer.type) || pointer instanceof domObjects.Touch\n ? 'touch'\n : 'mouse';\n },\n\n // [ event.target, event.currentTarget ]\n getEventTargets: function (event) {\n return [\n domUtils.getActualElement(event.path ? event.path[0] : event.target),\n domUtils.getActualElement(event.currentTarget),\n ];\n },\n};\n\nmodule.exports = pointerUtils;\n","const { window } = require('./window');\n\nconst vendors = ['ms', 'moz', 'webkit', 'o'];\nlet lastTime = 0;\nlet request;\nlet cancel;\n\nfor (let x = 0; x < vendors.length && !window.requestAnimationFrame; x++) {\n request = window[vendors[x] + 'RequestAnimationFrame'];\n cancel = window[vendors[x] +'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n}\n\nif (!request) {\n request = function (callback) {\n const currTime = new Date().getTime();\n const timeToCall = Math.max(0, 16 - (currTime - lastTime));\n const id = setTimeout(function () { callback(currTime + timeToCall); },\n timeToCall);\n\n lastTime = currTime + timeToCall;\n return id;\n };\n}\n\nif (!cancel) {\n cancel = function (id) {\n clearTimeout(id);\n };\n}\n\nmodule.exports = {\n request,\n cancel,\n};\n","const extend = require('./extend');\nconst is = require('./is');\nconst {\n closest,\n parentNode,\n getElementRect,\n} = require('./domUtils');\n\nconst rectUtils = {\n getStringOptionResult: function (value, interactable, element) {\n if (!is.string(value)) {\n return null;\n }\n\n if (value === 'parent') {\n value = parentNode(element);\n }\n else if (value === 'self') {\n value = interactable.getRect(element);\n }\n else {\n value = closest(element, value);\n }\n\n return value;\n },\n\n resolveRectLike: function (value, interactable, element, functionArgs) {\n value = rectUtils.getStringOptionResult(value, interactable, element) || value;\n\n if (is.function(value)) {\n value = value.apply(null, functionArgs);\n }\n\n if (is.element(value)) {\n value = getElementRect(value);\n }\n\n return value;\n },\n\n rectToXY: function (rect) {\n return rect && {\n x: 'x' in rect ? rect.x : rect.left,\n y: 'y' in rect ? rect.y : rect.top,\n };\n },\n\n xywhToTlbr: function (rect) {\n if (rect && !('left' in rect && 'top' in rect)) {\n rect = extend({}, rect);\n\n rect.left = rect.x || 0;\n rect.top = rect.y || 0;\n rect.right = rect.right || (rect.left + rect.width);\n rect.bottom = rect.bottom || (rect.top + rect.height);\n }\n\n return rect;\n },\n\n tlbrToXywh: function (rect) {\n if (rect && !('x' in rect && 'y' in rect)) {\n rect = extend({}, rect);\n\n rect.x = rect.left || 0;\n rect.top = rect.top || 0;\n rect.width = rect.width || (rect.right - rect.x);\n rect.height = rect.height || (rect.bottom - rect.y);\n }\n\n return rect;\n },\n};\n\nmodule.exports = rectUtils;\n","const win = module.exports;\nconst isWindow = require('./isWindow');\n\nfunction init (window) {\n // get wrapped window if using Shadow DOM polyfill\n\n win.realWindow = window;\n\n // create a TextNode\n const el = window.document.createTextNode('');\n\n // check if it's wrapped by a polyfill\n if (el.ownerDocument !== window.document\n && typeof window.wrap === 'function'\n && window.wrap(el) === el) {\n // use wrapped window\n window = window.wrap(window);\n }\n\n win.window = window;\n}\n\nif (typeof window === 'undefined') {\n win.window = undefined;\n win.realWindow = undefined;\n}\nelse {\n init(window);\n}\n\nwin.getWindow = function getWindow (node) {\n if (isWindow(node)) {\n return node;\n }\n\n const rootNode = (node.ownerDocument || node);\n\n return rootNode.defaultView || rootNode.parentWindow || win.window;\n};\n\nwin.init = init;\n"]} \ No newline at end of file diff --git a/dist/interact.min.js b/dist/interact.min.js index c0bb2476c..2d1f0fb62 100644 --- a/dist/interact.min.js +++ b/dist/interact.min.js @@ -1,6 +1,6 @@ -/* interact.js v1.3.0-alpha.3+sha.9595c40 | https://raw.github.com/taye/interact.js/master/LICENSE */ -!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var t;t="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,t.interact=e()}}(function(){return function e(t,n,r){function i(s,a){if(!n[s]){if(!t[s]){var l="function"==typeof require&&require;if(!a&&l)return l(s,!0);if(o)return o(s,!0);var c=new Error("Cannot find module '"+s+"'");throw c.code="MODULE_NOT_FOUND",c}var p=n[s]={exports:{}};t[s][0].call(p.exports,function(e){var n=t[s][1][e];return i(n||e)},p,p.exports,e,t,n,r)}return n[s].exports}for(var o="function"==typeof require&&require,s=0;s6&&void 0!==arguments[6]&&arguments[6];r(this,e);var f=t.target,v=(f&&f.options||s).deltaSource,g=o(f,p,l),h="start"===c,m="end"===c,y=h?t.startCoords:t.curCoords,x=t.prevEvent;p=p||t.element;var b=i({},y.page),w=i({},y.client);b.x-=g.x,b.y-=g.y,w.x-=g.x,w.y-=g.y,this.ctrlKey=n.ctrlKey,this.altKey=n.altKey,this.shiftKey=n.shiftKey,this.metaKey=n.metaKey,this.button=n.button,this.buttons=n.buttons,this.target=p,this.currentTarget=p,this.relatedTarget=u||null,this.preEnd=d,this.type=l+(c||""),this.interaction=t,this.interactable=f,this.t0=h?t.downTimes[t.downTimes.length-1]:x.t0;var E={interaction:t,event:n,action:l,phase:c,element:p,related:u,page:b,client:w,coords:y,starting:h,ending:m,deltaSource:v,iEvent:this};a.fire("set-xy",E),m?(this.pageX=x.pageX,this.pageY=x.pageY,this.clientX=x.clientX,this.clientY=x.clientY):(this.pageX=b.x,this.pageY=b.y,this.clientX=w.x,this.clientY=w.y),this.x0=t.startCoords.page.x-g.x,this.y0=t.startCoords.page.y-g.y,this.clientX0=t.startCoords.client.x-g.x,this.clientY0=t.startCoords.client.y-g.y,a.fire("set-delta",E),this.timeStamp=y.timeStamp,this.dt=t.pointerDelta.timeStamp,this.duration=this.timeStamp-this.t0,this.speed=t.pointerDelta[v].speed,this.velocityX=t.pointerDelta[v].vx,this.velocityY=t.pointerDelta[v].vy,this.swipe=m||"inertiastart"===c?this.getSwipe():null,a.fire("new",E)}return e.prototype.getSwipe=function(){var e=this.interaction;if(e.prevEvent.speed<600||this.timeStamp-e.prevEvent.timeStamp>150)return null;var t=180*Math.atan2(e.prevEvent.velocityY,e.prevEvent.velocityX)/Math.PI;t<0&&(t+=360);var n=112.5<=t&&t<247.5,r=202.5<=t&&t<337.5,i=!n&&(292.5<=t||t<67.5);return{up:r,down:!r&&22.5<=t&&t<157.5,left:n,right:i,angle:t,speed:e.prevEvent.speed,velocity:{x:e.prevEvent.velocityX,y:e.prevEvent.velocityY}}},e.prototype.preventDefault=function(){},e.prototype.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},e.prototype.stopPropagation=function(){this.propagationStopped=!0},e}();a.on("set-delta",function(e){var t=e.iEvent,n=e.interaction,r=e.starting,i=e.deltaSource,o=r?t:n.prevEvent;"client"===i?(t.dx=t.clientX-o.clientX,t.dy=t.clientY-o.clientY):(t.dx=t.pageX-o.pageX,t.dy=t.pageY-o.pageY)}),l.signals=a,t.exports=l},{"./defaultOptions":18,"./utils/Signals":35,"./utils/extend":41,"./utils/getOriginXY":42}],4:[function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=e("./utils/is"),o=e("./utils/events"),s=e("./utils/extend"),a=e("./actions/base"),l=e("./scope"),c=e("./Eventable"),p=e("./defaultOptions"),u=e("./utils/Signals").new(),d=e("./utils/domUtils"),f=d.getElementRect,v=d.nodeContains,g=d.trySelector,h=e("./utils/window"),m=h.getWindow,y=e("./utils/arr"),x=y.indexOf,b=y.contains,w=e("./utils/browser"),E=w.wheelEvent;l.interactables=[];var S=function(){function e(t,n){r(this,e),n=n||{},this.target=t,this.events=new c,this._context=n.context||l.document,this._win=m(g(t)?this._context:t),this._doc=this._win.document,u.fire("new",{target:t,options:n,interactable:this,win:this._win}),l.addDocument(this._doc,this._win),l.interactables.push(this),this.set(n)}return e.prototype.setOnEvents=function(e,t){var n="on"+e;return i.function(t.onstart)&&(this.events[n+"start"]=t.onstart),i.function(t.onmove)&&(this.events[n+"move"]=t.onmove),i.function(t.onend)&&(this.events[n+"end"]=t.onend),i.function(t.oninertiastart)&&(this.events[n+"inertiastart"]=t.oninertiastart),this},e.prototype.setPerAction=function(e,t){for(var n in t)n in p[e]&&(i.object(t[n])?(this.options[e][n]=s(this.options[e][n]||{},t[n]),i.object(p.perAction[n])&&"enabled"in p.perAction[n]&&(this.options[e][n].enabled=!1!==t[n].enabled)):i.bool(t[n])&&i.object(p.perAction[n])?this.options[e][n].enabled=t[n]:void 0!==t[n]&&(this.options[e][n]=t[n]))},e.prototype.getRect=function(e){return e=e||this.target,i.string(this.target)&&!i.element(e)&&(e=this._context.querySelector(this.target)),f(e)},e.prototype.rectChecker=function(e){return i.function(e)?(this.getRect=e,this):null===e?(delete this.options.getRect,this):this.getRect},e.prototype._backCompatOption=function(e,t){if(g(t)||i.object(t)){this.options[e]=t;for(var n=a.names,r=Array.isArray(n),o=0,n=r?n:n[Symbol.iterator]();;){var s;if(r){if(o>=n.length)break;s=n[o++]}else{if(o=n.next(),o.done)break;s=o.value}var l=s;this.options[l][e]=t}return this}return this.options[e]},e.prototype.origin=function(e){return this._backCompatOption("origin",e)},e.prototype.deltaSource=function(e){return"page"===e||"client"===e?(this.options.deltaSource=e,this):this.options.deltaSource},e.prototype.context=function(){return this._context},e.prototype.inContext=function(e){return this._context===e.ownerDocument||v(this._context,e)},e.prototype.fire=function(e){return this.events.fire(e),this},e.prototype._onOffMultiple=function(e,t,n,r){if(i.string(t)&&-1!==t.search(" ")&&(t=t.trim().split(/ +/)),i.array(t)){for(var o=0;o=l.length)break;f=l[d++]}else{if(d=l.next(),d.done)break;f=d.value}var v=f;this.options[v]=p.base[v],v in t&&this[v](t[v])}return u.fire("set",{options:t,interactable:this}),this},e.prototype.unset=function(){if(o.remove(this.target,"all"),i.string(this.target))for(var e in o.delegatedEvents){var t=o.delegatedEvents[e];t.selectors[0]===this.target&&t.contexts[0]===this._context&&(t.selectors.splice(0,1),t.contexts.splice(0,1),t.listeners.splice(0,1),t.selectors.length||(t[e]=null)),o.remove(this._context,e,o.delegateListener),o.remove(this._context,e,o.delegateUseCapture,!0)}else o.remove(this,"all");u.fire("unset",{interactable:this}),l.interactables.splice(x(l.interactables,this),1);for(var n=l.interactions||[],r=Array.isArray(n),s=0,n=r?n:n[Symbol.iterator]();;){var a;if(r){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var c=a;c.target===this&&c.interacting()&&c.stop()}return l.interact},e}();l.interactables.indexOfElement=function(e,t){t=t||l.document;for(var n=0;n=y.length)break;w=y[b++]}else{if(b=y.next(),b.done)break;w=b.value}var E=w,S=E[0],T=E[1];T._updateEventTargets(r,i),T[e](S,t,r,i)}}}function o(e){for(var t=0;te.pointerMoveTolerance);var a={pointer:t,pointerIndex:this.getPointerIndex(t),event:n,eventTarget:r,dx:o,dy:s,duplicate:i,interaction:this,interactingBeforeMove:this.interacting()};i||l.setCoordDeltas(this.pointerDelta,this.prevCoords,this.curCoords),d.fire("move",a),i||(this.interacting()&&this.doMove(a),this.pointerWasMoved&&l.copyCoords(this.prevCoords,this.curCoords))},e.prototype.doMove=function(e){e=l.extend({pointer:this.pointers[0],event:this.prevEvent,eventTarget:this._eventTarget,interaction:this},e||{}),d.fire("before-action-move",e),this._dontFireMove||d.fire("action-move",e),this._dontFireMove=!1},e.prototype.pointerUp=function(e,t,n,r){var i=this.getPointerIndex(e);d.fire(/cancel$/i.test(t.type)?"cancel":"up",{pointer:e,pointerIndex:i,event:t,eventTarget:n,curEventTarget:r,interaction:this}),this.simulation||this.end(t),this.pointerIsDown=!1,this.removePointer(e,t)},e.prototype.end=function(e){e=e||this.prevEvent,this.interacting()&&d.fire("action-end",{event:e,interaction:this}),this.stop()},e.prototype.currentAction=function(){return this._interacting?this.prepared.name:null},e.prototype.interacting=function(){return this._interacting},e.prototype.stop=function(){d.fire("stop",{interaction:this}),this._interacting&&(d.fire("stop-active",{interaction:this}),d.fire("stop-"+this.prepared.name,{interaction:this})),this.target=this.element=null,this._interacting=!1,this.prepared.name=this.prevEvent=null},e.prototype.getPointerIndex=function(e){return l.indexOf(this.pointerIds,l.getPointerId(e))},e.prototype.updatePointer=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:t&&/(down|start)$/i.test(t.type),r=l.getPointerId(e),i=this.getPointerIndex(e);return-1===i&&(i=this.pointerIds.length,this.pointerIds[i]=r),n&&d.fire("update-pointer-down",{pointer:e,event:t,down:n,pointerId:r,pointerIndex:i,interaction:this}),this.pointers[i]=e,i},e.prototype.removePointer=function(e,t){var n=l.getPointerId(e),r=this.mouse?0:l.indexOf(this.pointerIds,n);-1!==r&&(d.fire("remove-pointer",{pointer:e,event:t,pointerIndex:r,interaction:this}),this.pointers.splice(r,1),this.pointerIds.splice(r,1),this.downTargets.splice(r,1),this.downTimes.splice(r,1))},e.prototype._updateEventTargets=function(e,t){this._eventTarget=e,this._curEventTarget=t},e}(),m=0,y=v.length;m=i.length)break;a=i[s++]}else{if(s=i.next(),s.done)break;a=s.value}var l=a;if(l.options.drop.enabled){var c=l.options.drop.accept;if(!(p.is.element(c)&&c!==t||p.is.string(c)&&!p.matchesSelector(t,c)))for(var d=p.is.string(l.target)?l._context.querySelectorAll(l.target):[l.target],f=0;fo.left&&c.xo.top&&c.y=o.left&&v<=o.right&&g>=o.top&&g<=o.bottom}if(f&&p.is.number(a)){s=Math.max(0,Math.min(o.right,f.right)-Math.max(o.left,f.left))*Math.max(0,Math.min(o.bottom,f.bottom)-Math.max(o.top,f.top))/(f.width*f.height)>=a}return this.options.drop.checker&&(s=this.options.drop.checker(e,t,s,this,i,n,r)),s},v.signals.on("unset",function(e){e.interactable.dropzone(!1)}),v.settingsMethods.push("dropChecker"),g.signals.on("new",function(e){e.dropTarget=null,e.dropElement=null,e.prevDropTarget=null,e.prevDropElement=null,e.dropEvents=null,e.activeDrops={dropzones:[],elements:[],rects:[]}}),g.signals.on("stop",function(e){var t=e.interaction;t.dropTarget=t.dropElement=t.prevDropTarget=t.prevDropElement=null}),d.dynamicDrop=function(e){return p.is.bool(e)?(y=e,d):y},p.merge(v.eventTypes,["dragenter","dragleave","dropactivate","dropdeactivate","dropmove","drop"]),c.methodDict.drop="dropzone",h.drop=m.defaults,t.exports=m},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../interact":21,"../scope":34,"../utils":44,"./base":6}],9:[function(e,t,n){"use strict";var r=e("./base"),i=e("../utils"),o=e("../InteractEvent"),s=e("../Interactable"),a=e("../Interaction"),l=e("../defaultOptions"),c={defaults:{enabled:!1,origin:null,restrict:null},checker:function(e,t,n,r,i){return i.pointerIds.length>=2?{name:"gesture"}:null},getCursor:function(){return""}};o.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;"gesturestart"===t.type&&(t.ds=0,n.gesture.startDistance=n.gesture.prevDistance=t.distance,n.gesture.startAngle=n.gesture.prevAngle=t.angle,n.gesture.scale=1)}),o.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;"gesturemove"===t.type&&(t.ds=t.scale-n.gesture.scale,n.target.fire(t),n.gesture.prevAngle=t.angle,n.gesture.prevDistance=t.distance,t.scale===1/0||null===t.scale||void 0===t.scale||isNaN(t.scale)||(n.gesture.scale=t.scale))}),s.prototype.gesturable=function(e){return i.is.object(e)?(this.options.gesture.enabled=!1!==e.enabled,this.setPerAction("gesture",e),this.setOnEvents("gesture",e),this):i.is.bool(e)?(this.options.gesture.enabled=e,e||(this.ongesturestart=this.ongesturestart=this.ongestureend=null),this):this.options.gesture},o.signals.on("set-delta",function(e){var t=e.interaction,n=e.iEvent,r=e.action,s=e.event,a=e.starting,l=e.ending,c=e.deltaSource;if("gesture"===r){var p=t.pointers;n.touches=[p[0],p[1]],a?(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=1,n.ds=0,n.angle=i.touchAngle(p,void 0,c),n.da=0):l||s instanceof o?(n.distance=t.prevEvent.distance,n.box=t.prevEvent.box,n.scale=t.prevEvent.scale,n.ds=n.scale-1,n.angle=t.prevEvent.angle,n.da=n.angle-t.gesture.startAngle):(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=n.distance/t.gesture.startDistance,n.angle=i.touchAngle(p,t.gesture.prevAngle,c),n.ds=n.scale-t.gesture.prevScale,n.da=n.angle-t.gesture.prevAngle)}}),a.signals.on("new",function(e){e.gesture={start:{x:0,y:0},startDistance:0,prevDistance:0,distance:0,scale:1,startAngle:0,prevAngle:0}}),r.gesture=c,r.names.push("gesture"),i.merge(s.eventTypes,["gesturestart","gesturemove","gestureend"]),r.methodDict.gesture="gesturable",l.gesture=c.defaults,t.exports=c},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"./base":6}],10:[function(e,t,n){"use strict";function r(e,t,n,r,i,s,a){if(!t)return!1;if(!0===t){var l=o.is.number(s.width)?s.width:s.right-s.left,c=o.is.number(s.height)?s.height:s.bottom-s.top;if(l<0&&("left"===e?e="right":"right"===e&&(e="left")),c<0&&("top"===e?e="bottom":"bottom"===e&&(e="top")),"left"===e)return n.x<(l>=0?s.left:s.right)+a;if("top"===e)return n.y<(c>=0?s.top:s.bottom)+a;if("right"===e)return n.x>(l>=0?s.right:s.left)-a;if("bottom"===e)return n.y>(c>=0?s.bottom:s.top)-a}return!!o.is.element(r)&&(o.is.element(t)?t===r:o.matchesUpTo(r,t,i))}var i=e("./base"),o=e("../utils"),s=e("../utils/browser"),a=e("../InteractEvent"),l=e("../Interactable"),c=e("../Interaction"),p=e("../defaultOptions"),u=s.supportsTouch||s.supportsPointerEvent?20:10,d={defaults:{enabled:!1,mouseButtons:null,origin:null,snap:null,restrict:null,inertia:null,autoScroll:null,square:!1,preserveAspectRatio:!1,axis:"xy",margin:NaN,edges:null,invert:"none"},checker:function(e,t,n,i,s,a){if(!a)return null;var l=o.extend({},s.curCoords.page),c=n.options;if(c.resize.enabled){var p=c.resize,d={left:!1,right:!1,top:!1,bottom:!1};if(o.is.object(p.edges)){for(var f in d)d[f]=r(f,p.edges[f],l,s._eventTarget,i,a,p.margin||u);if(d.left=d.left&&!d.right,d.top=d.top&&!d.bottom,d.left||d.right||d.top||d.bottom)return{name:"resize",edges:d}}else{var v="y"!==c.resize.axis&&l.x>a.right-u,g="x"!==c.resize.axis&&l.y>a.bottom-u;if(v||g)return{name:"resize",axes:(v?"x":"")+(g?"y":"")}}}return null},cursors:s.isIe9OrOlder?{x:"e-resize",y:"s-resize",xy:"se-resize",top:"n-resize",left:"w-resize",bottom:"s-resize",right:"e-resize",topleft:"se-resize",bottomright:"se-resize",topright:"ne-resize",bottomleft:"ne-resize"}:{x:"ew-resize",y:"ns-resize",xy:"nwse-resize",top:"ns-resize",left:"ew-resize",bottom:"ns-resize",right:"ew-resize",topleft:"nwse-resize",bottomright:"nwse-resize",topright:"nesw-resize",bottomleft:"nesw-resize"},getCursor:function(e){if(e.axis)return d.cursors[e.name+e.axis];if(e.edges){for(var t="",n=["top","bottom","left","right"],r=0;r<4;r++)e.edges[n[r]]&&(t+=n[r]);return d.cursors[t]}}};a.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;if("resizestart"===t.type&&n.prepared.edges){var r=n.target.getRect(n.element),i=n.target.options.resize;if(i.square||i.preserveAspectRatio){var s=o.extend({},n.prepared.edges);s.top=s.top||s.left&&!s.bottom,s.left=s.left||s.top&&!s.right,s.bottom=s.bottom||s.right&&!s.top,s.right=s.right||s.bottom&&!s.left,n.prepared._linkedEdges=s}else n.prepared._linkedEdges=null;i.preserveAspectRatio&&(n.resizeStartAspectRatio=r.width/r.height),n.resizeRects={start:r,current:o.extend({},r),inverted:o.extend({},r),previous:o.extend({},r),delta:{left:0,right:0,width:0,top:0,bottom:0,height:0}},t.rect=n.resizeRects.inverted,t.deltaRect=n.resizeRects.delta}}),a.signals.on("new",function(e){var t=e.iEvent,n=e.phase,r=e.interaction;if("move"===n&&r.prepared.edges){var i=r.target.options.resize,s=i.invert,a="reposition"===s||"negate"===s,l=r.prepared.edges,c=r.resizeRects.start,p=r.resizeRects.current,u=r.resizeRects.inverted,d=r.resizeRects.delta,f=o.extend(r.resizeRects.previous,u),v=l,g=t.dx,h=t.dy;if(i.preserveAspectRatio||i.square){var m=i.preserveAspectRatio?r.resizeStartAspectRatio:1;l=r.prepared._linkedEdges,v.left&&v.bottom||v.right&&v.top?h=-g/m:v.left||v.right?h=g/m:(v.top||v.bottom)&&(g=h*m)}if(l.top&&(p.top+=h),l.bottom&&(p.bottom+=h),l.left&&(p.left+=g),l.right&&(p.right+=g),a){if(o.extend(u,p),"reposition"===s){var y=void 0;u.top>u.bottom&&(y=u.top,u.top=u.bottom,u.bottom=y),u.left>u.right&&(y=u.left,u.left=u.right,u.right=y)}}else u.top=Math.min(p.top,c.bottom),u.bottom=Math.max(p.bottom,c.top),u.left=Math.min(p.left,c.right),u.right=Math.max(p.right,c.left);u.width=u.right-u.left,u.height=u.bottom-u.top;for(var x in u)d[x]=u[x]-f[x];t.edges=r.prepared.edges,t.rect=u,t.deltaRect=d}}),l.prototype.resizable=function(e){return o.is.object(e)?(this.options.resize.enabled=!1!==e.enabled,this.setPerAction("resize",e),this.setOnEvents("resize",e),/^x$|^y$|^xy$/.test(e.axis)?this.options.resize.axis=e.axis:null===e.axis&&(this.options.resize.axis=p.resize.axis),o.is.bool(e.preserveAspectRatio)?this.options.resize.preserveAspectRatio=e.preserveAspectRatio:o.is.bool(e.square)&&(this.options.resize.square=e.square),this):o.is.bool(e)?(this.options.resize.enabled=e,e||(this.onresizestart=this.onresizestart=this.onresizeend=null),this):this.options.resize},c.signals.on("new",function(e){ -e.resizeAxes="xy"}),a.signals.on("set-delta",function(e){var t=e.interaction,n=e.iEvent;"resize"===e.action&&t.resizeAxes&&(t.target.options.resize.square?("y"===t.resizeAxes?n.dx=n.dy:n.dy=n.dx,n.axes="xy"):(n.axes=t.resizeAxes,"x"===t.resizeAxes?n.dy=0:"y"===t.resizeAxes&&(n.dx=0)))}),i.resize=d,i.names.push("resize"),o.merge(l.eventTypes,["resizestart","resizemove","resizeinertiastart","resizeinertiaresume","resizeend"]),i.methodDict.resize="resizable",p.resize=d.defaults,t.exports=d},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"../utils/browser":37,"./base":6}],11:[function(e,t,n){"use strict";var r=e("./utils/raf"),i=e("./utils/window").getWindow,o=e("./utils/is"),s=e("./utils/domUtils"),a=e("./Interaction"),l=e("./defaultOptions"),c={defaults:{enabled:!1,container:null,margin:60,speed:300},interaction:null,i:null,x:0,y:0,isScrolling:!1,prevTime:0,start:function(e){c.isScrolling=!0,r.cancel(c.i),c.interaction=e,c.prevTime=(new Date).getTime(),c.i=r.request(c.scroll)},stop:function(){c.isScrolling=!1,r.cancel(c.i)},scroll:function(){var e=c.interaction.target.options[c.interaction.prepared.name].autoScroll,t=e.container||i(c.interaction.element),n=(new Date).getTime(),s=(n-c.prevTime)/1e3,a=e.speed*s;a>=1&&(o.window(t)?t.scrollBy(c.x*a,c.y*a):t&&(t.scrollLeft+=c.x*a,t.scrollTop+=c.y*a),c.prevTime=n),c.isScrolling&&(r.cancel(c.i),c.i=r.request(c.scroll))},check:function(e,t){var n=e.options;return n[t].autoScroll&&n[t].autoScroll.enabled},onInteractionMove:function(e){var t=e.interaction,n=e.pointer;if(t.interacting()&&c.check(t.target,t.prepared.name)){if(t.simulation)return void(c.x=c.y=0);var r=void 0,a=void 0,l=void 0,p=void 0,u=t.target.options[t.prepared.name].autoScroll,d=u.container||i(t.element);if(o.window(d))p=n.clientXd.innerWidth-c.margin,l=n.clientY>d.innerHeight-c.margin;else{var f=s.getElementClientRect(d);p=n.clientXf.right-c.margin,l=n.clientY>f.bottom-c.margin}c.x=a?1:p?-1:0,c.y=l?1:r?-1:0,c.isScrolling||(c.margin=u.margin,c.speed=u.speed,c.start(t))}}};a.signals.on("stop-active",function(){c.stop()}),a.signals.on("action-move",c.onInteractionMove),l.perAction.autoScroll=c.defaults,t.exports=c},{"./Interaction":5,"./defaultOptions":18,"./utils/domUtils":39,"./utils/is":46,"./utils/raf":50,"./utils/window":52}],12:[function(e,t,n){"use strict";var r=e("../Interactable"),i=e("../actions/base"),o=e("../utils/is"),s=e("../utils/domUtils");r.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},r.prototype.ignoreFrom=function(e){return this._backCompatOption("ignoreFrom",e)},r.prototype.allowFrom=function(e){return this._backCompatOption("allowFrom",e)},r.prototype.testIgnore=function(e,t,n){return!(!e||!o.element(n))&&(o.string(e)?s.matchesUpTo(n,e,t):!!o.element(e)&&s.nodeContains(e,n))},r.prototype.testAllow=function(e,t,n){return!e||!!o.element(n)&&(o.string(e)?s.matchesUpTo(n,e,t):!!o.element(e)&&s.nodeContains(e,n))},r.prototype.testIgnoreAllow=function(e,t,n){return!this.testIgnore(e.ignoreFrom,t,n)&&this.testAllow(e.allowFrom,t,n)},r.prototype.actionChecker=function(e){return o.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},r.prototype.styleCursor=function(e){return o.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},r.prototype.defaultActionChecker=function(e,t,n,r){for(var o=this.getRect(r),s=null,a=i.names,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var u=p;if((!n.pointerIsDown||!n.mouse||0!=(t.buttons&this.options[u].mouseButtons))&&(s=i[u].checker(e,t,this,r,n,o)))return s}}},{"../Interactable":4,"../actions/base":6,"../utils/domUtils":39,"../utils/is":46}],13:[function(e,t,n){"use strict";function r(e,t,n,r){return g.is.object(e)&&t.testIgnoreAllow(t.options[e.name],n,r)&&t.options[e.name].enabled&&a(t,n,e)?e:null}function i(e,t,n,i,o,s){for(var a=0,l=i.length;a=m.maxInteractions)return!1;if(u.target===e){if((a+=d===n.name|0)>=i)return!1;if(u.element===t&&(l++,d!==n.name||l>=o))return!1}}}return m.maxInteractions>0}}var l=e("../interact"),c=e("../Interactable"),p=e("../Interaction"),u=e("../actions/base"),d=e("../defaultOptions"),f=e("../utils/browser"),v=e("../scope"),g=e("../utils"),h=e("../utils/Signals").new();e("./InteractableMethods");var m={signals:h,withinInteractionLimit:a,maxInteractions:1/0,defaults:{perAction:{manualStart:!1,max:1/0,maxPerElement:1,allowFrom:null,ignoreFrom:null}},setActionDefaults:function(e){g.extend(e.defaults,m.defaults.perAction)}};p.signals.on("down",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;if(!t.interacting()){s(t,o(t,n,r,i))}}),p.signals.on("move",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;if(t.mouse&&!t.pointerIsDown&&!t.interacting()){s(t,o(t,n,r,i))}}),p.signals.on("move",function(e){var t=e.interaction,n=e.event;if(t.pointerIsDown&&!t.interacting()&&t.pointerWasMoved&&t.prepared.name){h.fire("before-start",e);var r=t.target;t.prepared.name&&r&&(r.options[t.prepared.name].manualStart||!a(r,t.element,t.prepared)?t.stop(n):t.start(t.prepared,r,t.element))}}),p.signals.on("stop",function(e){var t=e.interaction,n=t.target;n&&n.options.styleCursor&&(n._doc.documentElement.style.cursor="")}),c.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},c.prototype.actionChecker=function(e){return g.is.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},c.prototype.styleCursor=function(e){return g.is.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},c.prototype.defaultActionChecker=function(e,t,n,r){for(var i=this.getRect(r),o=t.buttons||{0:1,1:4,3:8,4:16}[t.button],s=null,a=u.names,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var d=p;if((!n.pointerIsDown||!n.mouse||0!=(o&this.options[d].mouseButtons))&&(s=u[d].checker(e,t,this,r,n,i)))return s}},l.maxInteractions=function(e){return g.is.number(e)?(m.maxInteractions=e,this):m.maxInteractions},c.settingsMethods.push("styleCursor"),c.settingsMethods.push("actionChecker"),c.settingsMethods.push("ignoreFrom"),c.settingsMethods.push("allowFrom"),d.base.actionChecker=null,d.base.styleCursor=!0,g.extend(d.perAction,m.defaults.perAction),t.exports=m},{"../Interactable":4,"../Interaction":5,"../actions/base":6,"../defaultOptions":18,"../interact":21,"../scope":34,"../utils":44,"../utils/Signals":35,"../utils/browser":37,"./InteractableMethods":12}],14:[function(e,t,n){"use strict";var r=e("./base"),i=e("../Interaction");i.signals.on("new",function(e){e.delayTimer=null}),r.signals.on("prepared",function(e){var t=e.interaction,n=t.prepared.name;if(n){var r=t.target.options[n].delay;r>0&&(t.delayTimer=setTimeout(function(){t.start(t.prepared,t.target,t.element)},r))}}),i.signals.on("move",function(e){var t=e.interaction,n=e.duplicate;t.pointerWasMoved&&!n&&clearTimeout(t.delayTimer)}),r.signals.on("before-start",function(e){var t=e.interaction,n=t.prepared.name;if(n){t.target.options[n].delay>0&&(t.prepared.name=null)}})},{"../Interaction":5,"./base":13}],15:[function(e,t,n){"use strict";function r(e,t){if(!t)return!1;var n=t.options.drag.startAxis;return"xy"===e||"xy"===n||n===e}var i=e("./base"),o=e("../scope"),s=e("../utils/browser"),a=e("../utils/is"),l=e("../utils/domUtils"),c=l.matchesSelector,p=l.parentNode;i.setActionDefaults(e("../actions/drag")),i.signals.on("before-start",function(e){var t=e.interaction,n=e.eventTarget,l=e.dx,u=e.dy;if("drag"===t.prepared.name){var d=Math.abs(l),f=Math.abs(u),v=t.target.options.drag,g=v.startAxis,h=d>f?"x":dl.minSpeed&&g>l.endSpeed,b={interaction:t,pageCoords:v,statuses:f,preEnd:!0,requireEndOnly:!0};y&&!x&&(c.resetStatuses(f),m=c.setAll(b),m.shouldMove&&m.locked&&(h=!0)),(x||h)&&(p.copyCoords(i.upCoords,t.curCoords),t.pointers[0]=i.startEvent=new a(t,n,t.prepared.name,"inertiastart",t.element),i.t0=d,i.active=!0,i.allowResume=l.allowResume,t.simulation=i,o.fire(i.startEvent),x?(i.vx0=t.pointerDelta.client.vx,i.vy0=t.pointerDelta.client.vy,i.v0=g,r(t,i),p.extend(v,t.curCoords.page),v.x+=i.xe,v.y+=i.ye,c.resetStatuses(f),m=c.setAll(b),i.modifiedXe+=m.dx,i.modifiedYe+=m.dy,i.i=u.request(t.boundInertiaFrame)):(i.smoothEnd=!0,i.xe=m.dx,i.ye=m.dy,i.sx=i.sy=0,i.i=u.request(t.boundSmoothEndFrame)))}}),l.signals.on("stop-active",function(e){var t=e.interaction,n=t.inertiaStatus;n.active&&(u.cancel(n.i),n.active=!1,t.simulation=null)})},{"./InteractEvent":3,"./Interaction":5,"./modifiers":24,"./utils":44,"./utils/raf":50}],21:[function(e,t,n){"use strict";function r(e,t){var n=a.interactables.get(e,t);return n||(n=new l(e,t),n.events.global=p),n}var i=e("./utils/browser"),o=e("./utils/events"),s=e("./utils"),a=e("./scope"),l=e("./Interactable"),c=e("./Interaction"),p={};r.isSet=function(e,t){return-1!==a.interactables.indexOfElement(e,t&&t.context)},r.on=function(e,t,n){if(s.is.string(e)&&-1!==e.search(" ")&&(e=e.trim().split(/ +/)),s.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.on(f,t,n)}return r}if(s.is.object(e)){for(var v in e)r.on(v,e[v],t);return r}return s.contains(l.eventTypes,e)?p[e]?p[e].push(t):p[e]=[t]:o.add(a.document,e,t,{options:n}),r},r.off=function(e,t,n){if(s.is.string(e)&&-1!==e.search(" ")&&(e=e.trim().split(/ +/)),s.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.off(f,t,n)}return r}if(s.is.object(e)){for(var v in e)r.off(v,e[v],t);return r}if(s.contains(l.eventTypes,e)){var g=void 0;e in p&&-1!==(g=s.indexOf(p[e],t))&&p[e].splice(g,1)}else o.remove(a.document,e,t,n);return r},r.debug=function(){return a},r.getPointerAverage=s.pointerAverage,r.getTouchBBox=s.touchBBox,r.getTouchDistance=s.touchDistance,r.getTouchAngle=s.touchAngle,r.getElementRect=s.getElementRect,r.getElementClientRect=s.getElementClientRect,r.matchesSelector=s.matchesSelector,r.closest=s.closest,r.supportsTouch=function(){return i.supportsTouch},r.supportsPointerEvent=function(){return i.supportsPointerEvent},r.stop=function(e){for(var t=a.interactions.length-1;t>=0;t--)a.interactions[t].stop(e);return r},r.pointerMoveTolerance=function(e){return s.is.number(e)?(c.pointerMoveTolerance=e,this):c.pointerMoveTolerance},r.addDocument=a.addDocument,r.removeDocument=a.removeDocument,a.interact=r,t.exports=r},{"./Interactable":4,"./Interaction":5,"./scope":34,"./utils":44,"./utils/browser":37,"./utils/events":40}],22:[function(e,t,n){"use strict";function r(e){var t=e.interaction,n=e.event;t.target&&t.target.checkAndPreventDefault(n)}var i=e("./Interactable"),o=e("./Interaction"),s=e("./scope"),a=e("./utils/is"),l=e("./utils/events"),c=e("./utils/domUtils"),p=c.nodeContains,u=c.matchesSelector;i.prototype.preventDefault=function(e){return/^(always|never|auto)$/.test(e)?(this.options.preventDefault=e,this):a.bool(e)?(this.options.preventDefault=e?"always":"never",this):this.options.preventDefault},i.prototype.checkAndPreventDefault=function(e){var t=this.options.preventDefault;if("never"!==t)return"always"===t?void e.preventDefault():void(l.supportsOptions||/^(mouse|pointer|touch)*(down|start)/i.test(e.type)||a.element(e.target)&&u(e.target,"input,select,textarea,[contenteditable=true],[contenteditable=true] *")||e.preventDefault())};for(var d=["down","move","up","cancel"],f=0;f=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i;if(o.element&&(o.element===e.target||p(o.element,e.target)))return void o.target.checkAndPreventDefault(e)}}},{"./Interactable":4,"./Interaction":5,"./scope":34,"./utils/domUtils":39,"./utils/events":40,"./utils/is":46}],23:[function(e,t,n){"use strict";function r(e){var t=e.target,n=a.search(e,e.type,t);n&&n.prevTap&&e.clientX===n.prevTap.clientX&&e.clientY===n.prevTap.clientY&&t===n.prevTap.target&&(n.downTargets[0]=t,n.downTimes[0]=(new Date).getTime(),l.fire({interaction:n,event:e,eventTarget:t,pointer:e,type:"tap"}))}var i=e("./scope"),o=e("./utils/events"),s=e("./utils/browser"),a=e("./utils/interactionFinder"),l=e("./pointerEvents/base"),c=e("./utils/window"),p=c.window,u=Object.prototype.toString;if(p.Array.isArray||(p.Array.isArray=function(e){return"[object Array]"===u.call(e)}),String.prototype.trim||(String.prototype.trim=function(){return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")}),s.isIE8){var d=function(e){for(var t=i.interactions,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var o;if(n){if(r>=t.length)break;o=t[r++]}else{if(r=t.next(),r.done)break;o=r.value}var s=o;s.interacting()&&s.target.checkAndPreventDefault(e)}},f=function(e,t){var n=e.doc,i=(e.win,0===t.indexOf("listen")?o.add:o.remove);i(n,"selectstart",d),l&&i(n,"dblclick",r)};i.signals.on("add-document",f),i.signals.on("remove-document",f)}t.exports=null},{"./pointerEvents/base":31,"./scope":34,"./utils/browser":37,"./utils/events":40,"./utils/interactionFinder":45,"./utils/window":52}],24:[function(e,t,n){"use strict";function r(e,t,n){return e&&e.enabled&&(t||!e.endOnly)&&(!n||e.endOnly)}var i=e("../InteractEvent"),o=e("../Interaction"),s=e("../utils/extend"),a={names:[],setOffsets:function(e){var t=e.interaction,n=e.pageCoords,r=t.target,i=t.element,o=t.startOffset,s=r.getRect(i);s?(o.left=n.x-s.left,o.top=n.y-s.top,o.right=s.right-n.x,o.bottom=s.bottom-n.y,"width"in s||(s.width=s.right-s.left),"height"in s||(s.height=s.bottom-s.top)):o.left=o.top=o.right=o.bottom=0,e.rect=s,e.interactable=r,e.element=i;for(var l=0;l=p.length)break;f=p[d++]}else{if(d=p.next(),d.done)break;f=d.value}var v=f,g=a[v],h=t.target.options[t.prepared.name][v];r(h,i,o)&&(e.status=e.status=n[v],e.options=h,e.offset=e.interaction.modifierOffsets[v],g.set(e),e.status.locked&&(l.x+=e.status.dx,l.y+=e.status.dy,c.dx+=e.status.dx,c.dy+=e.status.dy,c.locked=!0))}return c.shouldMove=!e.status||!c.locked||e.status.changed,c},resetStatuses:function(e){for(var t=a.names,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var i;if(n){if(r>=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i,s=e[o]||{};s.dx=s.dy=0,s.modifiedX=s.modifiedY=NaN,s.locked=!1,s.changed=!0,e[o]=s}return e},start:function(e,t){var n=e.interaction,r={interaction:n,pageCoords:("action-resume"===t?n.curCoords:n.startCoords).page,startOffset:n.startOffset,statuses:n.modifierStatuses,preEnd:!1,requireEndOnly:!1};a.setOffsets(r),a.resetStatuses(r.statuses),r.pageCoords=s({},n.startCoords.page),n.modifierResult=a.setAll(r)}};o.signals.on("new",function(e){e.startOffset={left:0,right:0,top:0,bottom:0},e.modifierOffsets={},e.modifierStatuses=a.resetStatuses({}),e.modifierResult=null}),o.signals.on("action-start",a.start),o.signals.on("action-resume",a.start),o.signals.on("before-action-move",function(e){var t=e.interaction,n=e.preEnd,r=e.interactingBeforeMove,i=a.setAll({interaction:t,preEnd:n,pageCoords:t.curCoords.page,statuses:t.modifierStatuses,requireEndOnly:!1});!i.shouldMove&&r&&(t._dontFireMove=!0),t.modifierResult=i}),o.signals.on("action-end",function(e){for(var t=e.interaction,n=e.event,i=0;i=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}var m=h,y=m.x,x=m.y;l.push({x:s.left-i.width*y+u.x,y:s.top-i.height*x+u.y})}else l.push(u);return l},set:function(e){var t=e.interaction,n=e.pageCoords,r=e.status,i=e.options,s=e.offset,a=[],l=void 0,c=void 0,p=void 0;if(r.useStatusXY)c={x:r.x,y:r.y};else{var u=o.getOriginXY(t.target,t.element,t.prepared.name);c=o.extend({},n),c.x-=u.x,c.y-=u.y}r.realX=c.x,r.realY=c.y;for(var d=i.targets?i.targets.length:0,f=s,v=Array.isArray(f),g=0,f=v?f:f[Symbol.iterator]();;){var h;if(v){if(g>=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}for(var m=h,y=m.x,x=m.y,b=c.x-y,w=c.y-x,E=i.targets,S=Array.isArray(E),T=0,E=S?E:E[Symbol.iterator]();;){var C;if(S){if(T>=E.length)break;C=E[T++]}else{if(T=E.next(),T.done)break;C=T.value}var A=C;l=o.is.function(A)?A(b,w,t):A,l&&a.push({x:o.is.number(l.x)?l.x+y:b,y:o.is.number(l.y)?l.y+x:w,range:o.is.number(l.range)?l.range:i.range})}}var D={target:null,inRange:!1,distance:0,range:0,dx:0,dy:0};for(p=0,d=a.length;p=p.length)break;f=p[d++]}else{if(d=p.next(),d.done)break;f=d.value}var v=f,g=void 0;g=a.is.function(v)?v(l,c,t):v,g&&("width"in g&&"height"in g&&(g.x=g.width,g.y=g.height),e.options.targets.push(g))}i.set(e)},modifyCoords:function(e){var t=e.options;e.options=a.extend({},t), -e.options.enabled=t.enabled,e.options.relativePoints=[null],i.modifyCoords(e)}};r.snapSize=l,r.names.push("snapSize"),o.perAction.snapSize=l.defaults,s.defaults.snapSize=l.defaults,t.exports=l},{"../actions/resize":10,"../defaultOptions":18,"../utils/":44,"./index":24,"./snap":28}],30:[function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=e("../utils/pointerUtils");t.exports=function(){function e(t,n,o,s,a){if(r(this,e),i.pointerExtend(this,o),o!==n&&i.pointerExtend(this,n),this.interaction=a,this.timeStamp=(new Date).getTime(),this.originalEvent=o,this.type=t,this.pointerId=i.getPointerId(n),this.pointerType=i.getPointerType(n,a),this.target=s,this.currentTarget=null,"tap"===t){var l=a.getPointerIndex(n);this.dt=this.timeStamp-a.downTimes[l];var c=this.timeStamp-a.tapTime;this.double=!!(a.prevTap&&"doubletap"!==a.prevTap.type&&a.prevTap.target===this.target&&c<500)}else"doubletap"===t&&(this.dt=n.timeStamp-a.tapTime)}return e.prototype.subtractOrigin=function(e){var t=e.x,n=e.y;return this.pageX-=t,this.pageY-=n,this.clientX-=t,this.clientY-=n,this},e.prototype.addOrigin=function(e){var t=e.x,n=e.y;return this.pageX+=t,this.pageY+=n,this.clientX+=t,this.clientY+=n,this},e.prototype.preventDefault=function(){this.originalEvent.preventDefault()},e.prototype.stopPropagation=function(){this.propagationStopped=!0},e.prototype.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},e}()},{"../utils/pointerUtils":49}],31:[function(e,t,n){"use strict";function r(e){for(var t=e.interaction,n=e.pointer,s=e.event,l=e.eventTarget,c=e.type,u=void 0===c?e.pointerEvent.type:c,d=e.targets,f=void 0===d?i(e):d,v=e.pointerEvent,g=void 0===v?new o(u,n,s,l,t):v,h={interaction:t,pointer:n,event:s,eventTarget:l,targets:f,type:u,pointerEvent:g},m=0;m=u.length)break;g=u[v++]}else{if(v=u.next(),v.done)break;g=v.value}var h=g;c.element=h,p.fire("collect-targets",c)}return"hold"===o&&(c.targets=d(c.targets,function(e){return e.eventable.options.holdDuration===t.holdTimers[s].duration})),c.targets}var o=e("./PointerEvent"),s=e("../Interaction"),a=e("../utils"),l=e("../utils/browser"),c=e("../defaultOptions"),p=e("../utils/Signals").new(),u=e("../utils/arr"),d=u.filter,f=["down","up","cancel"],v=["down","up","cancel"],g={PointerEvent:o,fire:r,collectEventTargets:i,signals:p,defaults:{holdDuration:600,ignoreFrom:null,allowFrom:null,origin:{x:0,y:0}},types:["down","move","up","cancel","tap","doubletap","hold"]};s.signals.on("update-pointer-down",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers[n]={duration:1/0,timeout:null}}),s.signals.on("remove-pointer",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers.splice(n,1)}),s.signals.on("move",function(e){var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,s=e.duplicateMove,a=t.getPointerIndex(n);s||t.pointerIsDown&&!t.pointerWasMoved||(t.pointerIsDown&&clearTimeout(t.holdTimers[a].timeout),r({interaction:t,pointer:n,event:i,eventTarget:o,type:"move"}))}),s.signals.on("down",function(e){for(var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,s=e.pointerIndex,c=l.isIE8?a.extend({},i):i,u=t.holdTimers[s],d=a.getPath(o),f={interaction:t,pointer:n,event:i,eventTarget:o,type:"hold",targets:[],path:d,element:null},v=d,g=Array.isArray(v),h=0,v=g?v:v[Symbol.iterator]();;){var m;if(g){if(h>=v.length)break;m=v[h++]}else{if(h=v.next(),h.done)break;m=h.value}var y=m;f.element=y,p.fire("collect-targets",f)}if(f.targets.length){for(var x=1/0,b=0;b=0&&(p.selectors[u]!==e||p.contexts[u]!==t);u--);-1===u&&(u=p.selectors.length,p.selectors.push(e),p.contexts.push(t),p.listeners.push([])),p.listeners[u].push([i,!!s.capture,s.passive])}function s(e,t,n,r,o){var s=f(o),c=O[n],p=!1,u=void 0;if(c)for(u=c.selectors.length-1;u>=0;u--)if(c.selectors[u]===e&&c.contexts[u]===t){for(var d=c.listeners[u],v=d.length-1;v>=0;v--){var g=d[v],h=g[0],m=g[1],y=g[2];if(h===r&&m===!!s.capture&&y===s.passive){d.splice(v,1),d.length||(c.selectors.splice(u,1),c.contexts.splice(u,1),c.listeners.splice(u,1),i(t,n,a),i(t,n,l,!0),c.selectors.length||(O[n]=null)),p=!0;break}}if(p)break}}function a(e,t){var n=f(t),r={},i=O[e.type],o=g.getActualElement(e.path?e.path[0]:e.target),s=o;for(h(r,e),r.originalEvent=e,r.preventDefault=p;v.element(s);){for(var a=0;a=l.length)break;u=l[p++]}else{if(p=l.next(),p.done)break;u=p.value}var d=u,f=s[d](a);if(f)return f}},simulationResume:function(e){var t=e.mouseEvent,n=e.eventType,o=e.eventTarget;if(!/down|start/i.test(n))return null;for(var s=r.interactions,a=Array.isArray(s),l=0,s=a?s:s[Symbol.iterator]();;){var c;if(a){if(l>=s.length)break;c=s[l++]}else{if(l=s.next(),l.done)break;c=l.value}var p=c,u=o;if(p.simulation&&p.simulation.allowResume&&p.mouse===t)for(;u;){if(u===p.element)return p;u=i.parentNode(u)}}return null},mouse:function(e){var t=e.pointerId,n=e.mouseEvent,s=e.eventType;if(!n&&(o.supportsTouch||o.supportsPointerEvent))return null;for(var a=void 0,l=r.interactions,c=Array.isArray(l),p=0,l=c?l:l[Symbol.iterator]();;){var u;if(c){if(p>=l.length)break;u=l[p++]}else{if(p=l.next(),p.done)break;u=p.value}var d=u;if(d.mouse){if(d.simulation&&!i.contains(d.pointerIds,t))continue;if(d.interacting())return d;a||(a=d)}}if(a)return a;for(var f=r.interactions,v=Array.isArray(f),g=0,f=v?f:f[Symbol.iterator]();;){var h;if(v){if(g>=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}var m=h;if(m.mouse&&(!/down/.test(s)||!m.simulation))return m}return null},hasPointer:function(e){for(var t=e.pointerId,n=r.interactions,o=Array.isArray(n),s=0,n=o?n:n[Symbol.iterator]();;){var a;if(o){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var l=a;if(i.contains(l.pointerIds,t))return l}},idle:function(e){for(var t=e.mouseEvent,n=r.interactions,i=Array.isArray(n),o=0,n=i?n:n[Symbol.iterator]();;){var s;if(i){if(o>=n.length)break;s=n[o++]}else{if(o=n.next(),o.done)break;s=o.value}var a=s;if(1===a.pointerIds.length){var l=a.target;if(l&&!l.options.gesture.enabled)continue}else if(a.pointerIds.length>=2)continue;if(!a.interacting()&&t===a.mouse)return a}return null}};t.exports=s},{"../scope":34,"./browser":37,"./index":44}],46:[function(e,t,n){"use strict";var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},i=e("./window"),o=e("./isWindow"),s={array:function(){},window:function(e){return e===i.window||o(e)},docFrag:function(e){return s.object(e)&&11===e.nodeType},object:function(e){return!!e&&"object"===(void 0===e?"undefined":r(e))},function:function(e){return"function"==typeof e},number:function(e){return"number"==typeof e},bool:function(e){return"boolean"==typeof e},string:function(e){return"string"==typeof e},element:function(e){if(!e||"object"!==(void 0===e?"undefined":r(e)))return!1;var t=i.getWindow(e)||i.window;return/object|function/.test(r(t.Element))?e instanceof t.Element:1===e.nodeType&&"string"==typeof e.nodeName}};s.array=function(e){return s.object(e)&&void 0!==e.length&&s.function(e.splice)},t.exports=s},{"./isWindow":47,"./window":52}],47:[function(e,t,n){"use strict";t.exports=function(e){return!(!e||!e.Window)&&e instanceof e.Window}},{}],48:[function(e,t,n){"use strict";function r(e,n){for(var r in n){var i=t.exports.prefixedPropREs,o=!1;for(var s in i)if(0===r.indexOf(s)&&i[s].test(r)){o=!0;break}o||"function"==typeof n[r]||(e[r]=n[r])}return e}r.prefixedPropREs={webkit:/(Movement[XY]|Radius[XY]|RotationAngle|Force)$/},t.exports=r},{}],49:[function(e,t,n){"use strict";var r=e("./hypot"),i=e("./browser"),o=e("./domObjects"),s=e("./domUtils"),a=e("./is"),l=e("./pointerExtend"),c={copyCoords:function(e,t){e.page=e.page||{},e.page.x=t.page.x,e.page.y=t.page.y,e.client=e.client||{},e.client.x=t.client.x,e.client.y=t.client.y,e.timeStamp=t.timeStamp},setCoordDeltas:function(e,t,n){e.page.x=n.page.x-t.page.x,e.page.y=n.page.y-t.page.y,e.client.x=n.client.x-t.client.x,e.client.y=n.client.y-t.client.y,e.timeStamp=n.timeStamp-t.timeStamp;var i=Math.max(e.timeStamp/1e3,.001);e.page.speed=r(e.page.x,e.page.y)/i,e.page.vx=e.page.x/i,e.page.vy=e.page.y/i,e.client.speed=r(e.client.x,e.page.y)/i,e.client.vx=e.client.x/i,e.client.vy=e.client.y/i},isNativePointer:function(e){return e instanceof o.Event||e instanceof o.Touch},getXY:function(e,t,n){return n=n||{},e=e||"page",n.x=t[e+"X"],n.y=t[e+"Y"],n},getPageXY:function(e,t){return t=t||{},i.isOperaMobile&&c.isNativePointer(e)?(c.getXY("screen",e,t),t.x+=window.scrollX,t.y+=window.scrollY):c.getXY("page",e,t),t},getClientXY:function(e,t){return t=t||{},i.isOperaMobile&&c.isNativePointer(e)?c.getXY("screen",e,t):c.getXY("client",e,t),t},getPointerId:function(e){return a.number(e.pointerId)?e.pointerId:e.identifier},setCoords:function(e,t,n){var r=t.length>1?c.pointerAverage(t):t[0],i={};c.getPageXY(r,i),e.page.x=i.x,e.page.y=i.y,c.getClientXY(r,i),e.client.x=i.x,e.client.y=i.y,e.timeStamp=a.number(n)?n:(new Date).getTime()},pointerExtend:l,getTouchPair:function(e){var t=[];return a.array(e)?(t[0]=e[0],t[1]=e[1]):"touchend"===e.type?1===e.touches.length?(t[0]=e.touches[0],t[1]=e.changedTouches[0]):0===e.touches.length&&(t[0]=e.changedTouches[0],t[1]=e.changedTouches[1]):(t[0]=e.touches[0],t[1]=e.touches[1]),t},pointerAverage:function(e){for(var t={pageX:0,pageY:0,clientX:0,clientY:0,screenX:0,screenY:0},n=e,r=Array.isArray(n),i=0,n=r?n:n[Symbol.iterator]();;){var o;if(r){if(i>=n.length)break;o=n[i++]}else{if(i=n.next(),i.done)break;o=i.value}var s=o;for(var a in t)t[a]+=s[a]}for(var l in t)t[l]/=e.length;return t},touchBBox:function(e){if(e.length||e.touches&&e.touches.length>1){var t=c.getTouchPair(e),n=Math.min(t[0].pageX,t[1].pageX),r=Math.min(t[0].pageY,t[1].pageY);return{x:n,y:r,left:n,top:r,width:Math.max(t[0].pageX,t[1].pageX)-n,height:Math.max(t[0].pageY,t[1].pageY)-r}}},touchDistance:function(e,t){var n=t+"X",i=t+"Y",o=c.getTouchPair(e),s=o[0][n]-o[1][n],a=o[0][i]-o[1][i];return r(s,a)},touchAngle:function(e,t,n){var r=n+"X",i=n+"Y",o=c.getTouchPair(e),s=o[1][r]-o[0][r],a=o[1][i]-o[0][i];return 180*Math.atan2(a,s)/Math.PI},getPointerType:function(e,t){return t.mouse?"mouse":i.supportsPointerEvent?a.string(e.pointerType)?e.pointerType:[void 0,void 0,"touch","pen","mouse"][e.pointerType]:"touch"},getEventTargets:function(e){return[s.getActualElement(e.path?e.path[0]:e.target),s.getActualElement(e.currentTarget)]}};t.exports=c},{"./browser":37,"./domObjects":38,"./domUtils":39,"./hypot":43,"./is":46,"./pointerExtend":48}],50:[function(e,t,n){"use strict";for(var r=e("./window"),i=r.window,o=["ms","moz","webkit","o"],s=0,a=void 0,l=void 0,c=0;c6&&void 0!==arguments[6]&&arguments[6];r(this,e);var f=t.target,v=(f&&f.options||s).deltaSource,g=o(f,p,l),h="start"===c,m="end"===c,y=h?t.startCoords:t.curCoords,x=t.prevEvent;p=p||t.element;var b=i({},y.page),w=i({},y.client);b.x-=g.x,b.y-=g.y,w.x-=g.x,w.y-=g.y,this.ctrlKey=n.ctrlKey,this.altKey=n.altKey,this.shiftKey=n.shiftKey,this.metaKey=n.metaKey,this.button=n.button,this.buttons=n.buttons,this.target=p,this.currentTarget=p,this.relatedTarget=u||null,this.preEnd=d,this.type=l+(c||""),this.interaction=t,this.interactable=f,this.t0=h?t.downTimes[t.downTimes.length-1]:x.t0;var E={interaction:t,event:n,action:l,phase:c,element:p,related:u,page:b,client:w,coords:y,starting:h,ending:m,deltaSource:v,iEvent:this};a.fire("set-xy",E),m?(this.pageX=x.pageX,this.pageY=x.pageY,this.clientX=x.clientX,this.clientY=x.clientY):(this.pageX=b.x,this.pageY=b.y,this.clientX=w.x,this.clientY=w.y),this.x0=t.startCoords.page.x-g.x,this.y0=t.startCoords.page.y-g.y,this.clientX0=t.startCoords.client.x-g.x,this.clientY0=t.startCoords.client.y-g.y,a.fire("set-delta",E),this.timeStamp=y.timeStamp,this.dt=t.pointerDelta.timeStamp,this.duration=this.timeStamp-this.t0,this.speed=t.pointerDelta[v].speed,this.velocityX=t.pointerDelta[v].vx,this.velocityY=t.pointerDelta[v].vy,this.swipe=m||"inertiastart"===c?this.getSwipe():null,a.fire("new",E)}return e.prototype.getSwipe=function(){var e=this.interaction;if(e.prevEvent.speed<600||this.timeStamp-e.prevEvent.timeStamp>150)return null;var t=180*Math.atan2(e.prevEvent.velocityY,e.prevEvent.velocityX)/Math.PI;t<0&&(t+=360);var n=112.5<=t&&t<247.5,r=202.5<=t&&t<337.5,i=!n&&(292.5<=t||t<67.5);return{up:r,down:!r&&22.5<=t&&t<157.5,left:n,right:i,angle:t,speed:e.prevEvent.speed,velocity:{x:e.prevEvent.velocityX,y:e.prevEvent.velocityY}}},e.prototype.preventDefault=function(){},e.prototype.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},e.prototype.stopPropagation=function(){this.propagationStopped=!0},e}();a.on("set-delta",function(e){var t=e.iEvent,n=e.interaction,r=e.starting,i=e.deltaSource,o=r?t:n.prevEvent;"client"===i?(t.dx=t.clientX-o.clientX,t.dy=t.clientY-o.clientY):(t.dx=t.pageX-o.pageX,t.dy=t.pageY-o.pageY)}),l.signals=a,t.exports=l},{"./defaultOptions":18,"./utils/Signals":35,"./utils/extend":41,"./utils/getOriginXY":42}],4:[function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=e("./utils/is"),o=e("./utils/events"),s=e("./utils/extend"),a=e("./actions/base"),l=e("./scope"),c=e("./Eventable"),p=e("./defaultOptions"),u=e("./utils/Signals").new(),d=e("./utils/domUtils"),f=d.getElementRect,v=d.nodeContains,g=d.trySelector,h=e("./utils/window"),m=h.getWindow,y=e("./utils/arr"),x=y.indexOf,b=y.contains,w=e("./utils/browser"),E=w.wheelEvent;l.interactables=[];var S=function(){function e(t,n){r(this,e),n=n||{},this.target=t,this.events=new c,this._context=n.context||l.document,this._win=m(g(t)?this._context:t),this._doc=this._win.document,u.fire("new",{target:t,options:n,interactable:this,win:this._win}),l.addDocument(this._doc,this._win),l.interactables.push(this),this.set(n)}return e.prototype.setOnEvents=function(e,t){var n="on"+e;return i.function(t.onstart)&&(this.events[n+"start"]=t.onstart),i.function(t.onmove)&&(this.events[n+"move"]=t.onmove),i.function(t.onend)&&(this.events[n+"end"]=t.onend),i.function(t.oninertiastart)&&(this.events[n+"inertiastart"]=t.oninertiastart),this},e.prototype.setPerAction=function(e,t){for(var n in t)n in p[e]&&(i.object(t[n])?(this.options[e][n]=s(this.options[e][n]||{},t[n]),i.object(p.perAction[n])&&"enabled"in p.perAction[n]&&(this.options[e][n].enabled=!1!==t[n].enabled)):i.bool(t[n])&&i.object(p.perAction[n])?this.options[e][n].enabled=t[n]:void 0!==t[n]&&(this.options[e][n]=t[n]))},e.prototype.getRect=function(e){return e=e||this.target,i.string(this.target)&&!i.element(e)&&(e=this._context.querySelector(this.target)),f(e)},e.prototype.rectChecker=function(e){return i.function(e)?(this.getRect=e,this):null===e?(delete this.options.getRect,this):this.getRect},e.prototype._backCompatOption=function(e,t){if(g(t)||i.object(t)){this.options[e]=t;for(var n=a.names,r=Array.isArray(n),o=0,n=r?n:n[Symbol.iterator]();;){var s;if(r){if(o>=n.length)break;s=n[o++]}else{if(o=n.next(),o.done)break;s=o.value}var l=s;this.options[l][e]=t}return this}return this.options[e]},e.prototype.origin=function(e){return this._backCompatOption("origin",e)},e.prototype.deltaSource=function(e){return"page"===e||"client"===e?(this.options.deltaSource=e,this):this.options.deltaSource},e.prototype.context=function(){return this._context},e.prototype.inContext=function(e){return this._context===e.ownerDocument||v(this._context,e)},e.prototype.fire=function(e){return this.events.fire(e),this},e.prototype._onOffMultiple=function(e,t,n,r){if(i.string(t)&&-1!==t.search(" ")&&(t=t.trim().split(/ +/)),i.array(t)){for(var o=0;o=l.length)break;f=l[d++]}else{if(d=l.next(),d.done)break;f=d.value}var v=f;this.options[v]=p.base[v],v in t&&this[v](t[v])}return u.fire("set",{options:t,interactable:this}),this},e.prototype.unset=function(){if(o.remove(this.target,"all"),i.string(this.target))for(var e in o.delegatedEvents){var t=o.delegatedEvents[e];t.selectors[0]===this.target&&t.contexts[0]===this._context&&(t.selectors.splice(0,1),t.contexts.splice(0,1),t.listeners.splice(0,1),t.selectors.length||(t[e]=null)),o.remove(this._context,e,o.delegateListener),o.remove(this._context,e,o.delegateUseCapture,!0)}else o.remove(this,"all");u.fire("unset",{interactable:this}),l.interactables.splice(x(l.interactables,this),1);for(var n=l.interactions||[],r=Array.isArray(n),s=0,n=r?n:n[Symbol.iterator]();;){var a;if(r){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var c=a;c.target===this&&c.interacting()&&c.stop()}return l.interact},e}();l.interactables.indexOfElement=function(e,t){t=t||l.document;for(var n=0;n=x.length)break;E=x[w++]}else{if(w=x.next(),w.done)break;E=w.value}var S=E,T=S[0],C=S[1];C._updateEventTargets(i,o),C[e](T,t,i,o)}}}function o(e){for(var t=0;te.pointerMoveTolerance);var a={pointer:t,pointerIndex:this.getPointerIndex(t),event:n,eventTarget:r,dx:o,dy:s,duplicate:i,interaction:this,interactingBeforeMove:this.interacting()};i||l.setCoordDeltas(this.pointerDelta,this.prevCoords,this.curCoords),f.fire("move",a),i||(this.interacting()&&this.doMove(a),this.pointerWasMoved&&l.copyCoords(this.prevCoords,this.curCoords))},e.prototype.doMove=function(e){e=l.extend({pointer:this.pointers[0],event:this.prevEvent,eventTarget:this._eventTarget,interaction:this},e||{}),f.fire("before-action-move",e),this._dontFireMove||f.fire("action-move",e),this._dontFireMove=!1},e.prototype.pointerUp=function(e,t,n,r){var i=this.getPointerIndex(e);f.fire(/cancel$/i.test(t.type)?"cancel":"up",{pointer:e,pointerIndex:i,event:t,eventTarget:n,curEventTarget:r,interaction:this}),this.simulation||this.end(t),this.pointerIsDown=!1,this.removePointer(e,t)},e.prototype.end=function(e){e=e||this.prevEvent,this.interacting()&&f.fire("action-end",{event:e,interaction:this}),this.stop()},e.prototype.currentAction=function(){return this._interacting?this.prepared.name:null},e.prototype.interacting=function(){return this._interacting},e.prototype.stop=function(){f.fire("stop",{interaction:this}),this._interacting&&(f.fire("stop-active",{interaction:this}),f.fire("stop-"+this.prepared.name,{interaction:this})),this.target=this.element=null,this._interacting=!1,this.prepared.name=this.prevEvent=null},e.prototype.getPointerIndex=function(e){return"mouse"===this.pointerType||"pen"===this.pointerType?0:l.indexOf(this.pointerIds,l.getPointerId(e))},e.prototype.updatePointer=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:t&&/(down|start)$/i.test(t.type),r=l.getPointerId(e),i=this.getPointerIndex(e);return-1===i&&(i=this.pointerIds.length,this.pointerIds[i]=r),n&&f.fire("update-pointer-down",{pointer:e,event:t,down:n,pointerId:r,pointerIndex:i,interaction:this}),this.pointers[i]=e,i},e.prototype.removePointer=function(e,t){var n=this.getPointerIndex(e);-1!==n&&(f.fire("remove-pointer",{pointer:e,event:t,pointerIndex:n,interaction:this}),this.pointers.splice(n,1),this.pointerIds.splice(n,1),this.downTargets.splice(n,1),this.downTimes.splice(n,1))},e.prototype._updateEventTargets=function(e,t){this._eventTarget=e,this._curEventTarget=t},e}(),y=0,x=g.length;y=i.length)break;a=i[s++]}else{if(s=i.next(),s.done)break;a=s.value}var l=a;if(l.options.drop.enabled){var c=l.options.drop.accept;if(!(p.is.element(c)&&c!==t||p.is.string(c)&&!p.matchesSelector(t,c)))for(var d=p.is.string(l.target)?l._context.querySelectorAll(l.target):[l.target],f=0;fo.left&&c.xo.top&&c.y=o.left&&v<=o.right&&g>=o.top&&g<=o.bottom}if(f&&p.is.number(a)){s=Math.max(0,Math.min(o.right,f.right)-Math.max(o.left,f.left))*Math.max(0,Math.min(o.bottom,f.bottom)-Math.max(o.top,f.top))/(f.width*f.height)>=a}return this.options.drop.checker&&(s=this.options.drop.checker(e,t,s,this,i,n,r)),s},v.signals.on("unset",function(e){e.interactable.dropzone(!1)}),v.settingsMethods.push("dropChecker"),g.signals.on("new",function(e){e.dropTarget=null,e.dropElement=null,e.prevDropTarget=null,e.prevDropElement=null,e.dropEvents=null,e.activeDrops={dropzones:[],elements:[],rects:[]}}),g.signals.on("stop",function(e){var t=e.interaction;t.dropTarget=t.dropElement=t.prevDropTarget=t.prevDropElement=null}),d.dynamicDrop=function(e){return p.is.bool(e)?(y=e,d):y},p.merge(v.eventTypes,["dragenter","dragleave","dropactivate","dropdeactivate","dropmove","drop"]),c.methodDict.drop="dropzone",h.drop=m.defaults,t.exports=m},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../interact":21,"../scope":34,"../utils":44,"./base":6}],9:[function(e,t,n){"use strict";var r=e("./base"),i=e("../utils"),o=e("../InteractEvent"),s=e("../Interactable"),a=e("../Interaction"),l=e("../defaultOptions"),c={defaults:{enabled:!1,origin:null,restrict:null},checker:function(e,t,n,r,i){return i.pointerIds.length>=2?{name:"gesture"}:null},getCursor:function(){return""}};o.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;"gesturestart"===t.type&&(t.ds=0,n.gesture.startDistance=n.gesture.prevDistance=t.distance,n.gesture.startAngle=n.gesture.prevAngle=t.angle,n.gesture.scale=1)}),o.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;"gesturemove"===t.type&&(t.ds=t.scale-n.gesture.scale,n.target.fire(t),n.gesture.prevAngle=t.angle,n.gesture.prevDistance=t.distance,t.scale===1/0||null===t.scale||void 0===t.scale||isNaN(t.scale)||(n.gesture.scale=t.scale))}),s.prototype.gesturable=function(e){return i.is.object(e)?(this.options.gesture.enabled=!1!==e.enabled,this.setPerAction("gesture",e),this.setOnEvents("gesture",e),this):i.is.bool(e)?(this.options.gesture.enabled=e,e||(this.ongesturestart=this.ongesturestart=this.ongestureend=null),this):this.options.gesture},o.signals.on("set-delta",function(e){var t=e.interaction,n=e.iEvent,r=e.action,s=e.event,a=e.starting,l=e.ending,c=e.deltaSource;if("gesture"===r){var p=t.pointers;n.touches=[p[0],p[1]],a?(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=1,n.ds=0,n.angle=i.touchAngle(p,void 0,c),n.da=0):l||s instanceof o?(n.distance=t.prevEvent.distance,n.box=t.prevEvent.box,n.scale=t.prevEvent.scale,n.ds=n.scale-1,n.angle=t.prevEvent.angle,n.da=n.angle-t.gesture.startAngle):(n.distance=i.touchDistance(p,c),n.box=i.touchBBox(p),n.scale=n.distance/t.gesture.startDistance,n.angle=i.touchAngle(p,t.gesture.prevAngle,c),n.ds=n.scale-t.gesture.prevScale,n.da=n.angle-t.gesture.prevAngle)}}),a.signals.on("new",function(e){e.gesture={start:{x:0,y:0},startDistance:0,prevDistance:0,distance:0,scale:1,startAngle:0,prevAngle:0}}),r.gesture=c,r.names.push("gesture"),i.merge(s.eventTypes,["gesturestart","gesturemove","gestureend"]),r.methodDict.gesture="gesturable",l.gesture=c.defaults,t.exports=c},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"./base":6}],10:[function(e,t,n){"use strict";function r(e,t,n,r,i,s,a){if(!t)return!1;if(!0===t){var l=o.is.number(s.width)?s.width:s.right-s.left,c=o.is.number(s.height)?s.height:s.bottom-s.top;if(l<0&&("left"===e?e="right":"right"===e&&(e="left")),c<0&&("top"===e?e="bottom":"bottom"===e&&(e="top")),"left"===e)return n.x<(l>=0?s.left:s.right)+a;if("top"===e)return n.y<(c>=0?s.top:s.bottom)+a;if("right"===e)return n.x>(l>=0?s.right:s.left)-a;if("bottom"===e)return n.y>(c>=0?s.bottom:s.top)-a}return!!o.is.element(r)&&(o.is.element(t)?t===r:o.matchesUpTo(r,t,i))}var i=e("./base"),o=e("../utils"),s=e("../utils/browser"),a=e("../InteractEvent"),l=e("../Interactable"),c=e("../Interaction"),p=e("../defaultOptions"),u=s.supportsTouch||s.supportsPointerEvent?20:10,d={defaults:{enabled:!1,mouseButtons:null,origin:null,snap:null,restrict:null,inertia:null,autoScroll:null,square:!1,preserveAspectRatio:!1,axis:"xy",margin:NaN,edges:null,invert:"none"},checker:function(e,t,n,i,s,a){if(!a)return null;var l=o.extend({},s.curCoords.page),c=n.options;if(c.resize.enabled){var p=c.resize,d={left:!1,right:!1,top:!1,bottom:!1};if(o.is.object(p.edges)){for(var f in d)d[f]=r(f,p.edges[f],l,s._eventTarget,i,a,p.margin||u);if(d.left=d.left&&!d.right,d.top=d.top&&!d.bottom,d.left||d.right||d.top||d.bottom)return{name:"resize",edges:d}}else{var v="y"!==c.resize.axis&&l.x>a.right-u,g="x"!==c.resize.axis&&l.y>a.bottom-u;if(v||g)return{name:"resize",axes:(v?"x":"")+(g?"y":"")}}}return null},cursors:s.isIe9OrOlder?{x:"e-resize",y:"s-resize",xy:"se-resize",top:"n-resize",left:"w-resize",bottom:"s-resize",right:"e-resize",topleft:"se-resize",bottomright:"se-resize",topright:"ne-resize",bottomleft:"ne-resize"}:{x:"ew-resize",y:"ns-resize",xy:"nwse-resize",top:"ns-resize",left:"ew-resize",bottom:"ns-resize",right:"ew-resize",topleft:"nwse-resize",bottomright:"nwse-resize",topright:"nesw-resize",bottomleft:"nesw-resize"},getCursor:function(e){if(e.axis)return d.cursors[e.name+e.axis];if(e.edges){for(var t="",n=["top","bottom","left","right"],r=0;r<4;r++)e.edges[n[r]]&&(t+=n[r]);return d.cursors[t]}}};a.signals.on("new",function(e){var t=e.iEvent,n=e.interaction;if("resizestart"===t.type&&n.prepared.edges){var r=n.target.getRect(n.element),i=n.target.options.resize;if(i.square||i.preserveAspectRatio){var s=o.extend({},n.prepared.edges);s.top=s.top||s.left&&!s.bottom,s.left=s.left||s.top&&!s.right,s.bottom=s.bottom||s.right&&!s.top,s.right=s.right||s.bottom&&!s.left,n.prepared._linkedEdges=s}else n.prepared._linkedEdges=null;i.preserveAspectRatio&&(n.resizeStartAspectRatio=r.width/r.height),n.resizeRects={start:r,current:o.extend({},r),inverted:o.extend({},r),previous:o.extend({},r),delta:{left:0,right:0,width:0,top:0,bottom:0,height:0}},t.rect=n.resizeRects.inverted,t.deltaRect=n.resizeRects.delta}}),a.signals.on("new",function(e){var t=e.iEvent,n=e.phase,r=e.interaction;if("move"===n&&r.prepared.edges){var i=r.target.options.resize,s=i.invert,a="reposition"===s||"negate"===s,l=r.prepared.edges,c=r.resizeRects.start,p=r.resizeRects.current,u=r.resizeRects.inverted,d=r.resizeRects.delta,f=o.extend(r.resizeRects.previous,u),v=l,g=t.dx,h=t.dy;if(i.preserveAspectRatio||i.square){var m=i.preserveAspectRatio?r.resizeStartAspectRatio:1;l=r.prepared._linkedEdges,v.left&&v.bottom||v.right&&v.top?h=-g/m:v.left||v.right?h=g/m:(v.top||v.bottom)&&(g=h*m)}if(l.top&&(p.top+=h),l.bottom&&(p.bottom+=h),l.left&&(p.left+=g),l.right&&(p.right+=g),a){if(o.extend(u,p),"reposition"===s){var y=void 0;u.top>u.bottom&&(y=u.top,u.top=u.bottom,u.bottom=y),u.left>u.right&&(y=u.left,u.left=u.right,u.right=y)}}else u.top=Math.min(p.top,c.bottom),u.bottom=Math.max(p.bottom,c.top),u.left=Math.min(p.left,c.right),u.right=Math.max(p.right,c.left);u.width=u.right-u.left,u.height=u.bottom-u.top;for(var x in u)d[x]=u[x]-f[x];t.edges=r.prepared.edges,t.rect=u,t.deltaRect=d}}),l.prototype.resizable=function(e){return o.is.object(e)?(this.options.resize.enabled=!1!==e.enabled,this.setPerAction("resize",e),this.setOnEvents("resize",e),/^x$|^y$|^xy$/.test(e.axis)?this.options.resize.axis=e.axis:null===e.axis&&(this.options.resize.axis=p.resize.axis),o.is.bool(e.preserveAspectRatio)?this.options.resize.preserveAspectRatio=e.preserveAspectRatio:o.is.bool(e.square)&&(this.options.resize.square=e.square),this):o.is.bool(e)?(this.options.resize.enabled=e, +e||(this.onresizestart=this.onresizestart=this.onresizeend=null),this):this.options.resize},c.signals.on("new",function(e){e.resizeAxes="xy"}),a.signals.on("set-delta",function(e){var t=e.interaction,n=e.iEvent;"resize"===e.action&&t.resizeAxes&&(t.target.options.resize.square?("y"===t.resizeAxes?n.dx=n.dy:n.dy=n.dx,n.axes="xy"):(n.axes=t.resizeAxes,"x"===t.resizeAxes?n.dy=0:"y"===t.resizeAxes&&(n.dx=0)))}),i.resize=d,i.names.push("resize"),o.merge(l.eventTypes,["resizestart","resizemove","resizeinertiastart","resizeinertiaresume","resizeend"]),i.methodDict.resize="resizable",p.resize=d.defaults,t.exports=d},{"../InteractEvent":3,"../Interactable":4,"../Interaction":5,"../defaultOptions":18,"../utils":44,"../utils/browser":37,"./base":6}],11:[function(e,t,n){"use strict";var r=e("./utils/raf"),i=e("./utils/window").getWindow,o=e("./utils/is"),s=e("./utils/domUtils"),a=e("./Interaction"),l=e("./defaultOptions"),c={defaults:{enabled:!1,container:null,margin:60,speed:300},interaction:null,i:null,x:0,y:0,isScrolling:!1,prevTime:0,start:function(e){c.isScrolling=!0,r.cancel(c.i),c.interaction=e,c.prevTime=(new Date).getTime(),c.i=r.request(c.scroll)},stop:function(){c.isScrolling=!1,r.cancel(c.i)},scroll:function(){var e=c.interaction.target.options[c.interaction.prepared.name].autoScroll,t=e.container||i(c.interaction.element),n=(new Date).getTime(),s=(n-c.prevTime)/1e3,a=e.speed*s;a>=1&&(o.window(t)?t.scrollBy(c.x*a,c.y*a):t&&(t.scrollLeft+=c.x*a,t.scrollTop+=c.y*a),c.prevTime=n),c.isScrolling&&(r.cancel(c.i),c.i=r.request(c.scroll))},check:function(e,t){var n=e.options;return n[t].autoScroll&&n[t].autoScroll.enabled},onInteractionMove:function(e){var t=e.interaction,n=e.pointer;if(t.interacting()&&c.check(t.target,t.prepared.name)){if(t.simulation)return void(c.x=c.y=0);var r=void 0,a=void 0,l=void 0,p=void 0,u=t.target.options[t.prepared.name].autoScroll,d=u.container||i(t.element);if(o.window(d))p=n.clientXd.innerWidth-c.margin,l=n.clientY>d.innerHeight-c.margin;else{var f=s.getElementClientRect(d);p=n.clientXf.right-c.margin,l=n.clientY>f.bottom-c.margin}c.x=a?1:p?-1:0,c.y=l?1:r?-1:0,c.isScrolling||(c.margin=u.margin,c.speed=u.speed,c.start(t))}}};a.signals.on("stop-active",function(){c.stop()}),a.signals.on("action-move",c.onInteractionMove),l.perAction.autoScroll=c.defaults,t.exports=c},{"./Interaction":5,"./defaultOptions":18,"./utils/domUtils":39,"./utils/is":46,"./utils/raf":50,"./utils/window":52}],12:[function(e,t,n){"use strict";var r=e("../Interactable"),i=e("../actions/base"),o=e("../utils/is"),s=e("../utils/domUtils");r.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},r.prototype.ignoreFrom=function(e){return this._backCompatOption("ignoreFrom",e)},r.prototype.allowFrom=function(e){return this._backCompatOption("allowFrom",e)},r.prototype.testIgnore=function(e,t,n){return!(!e||!o.element(n))&&(o.string(e)?s.matchesUpTo(n,e,t):!!o.element(e)&&s.nodeContains(e,n))},r.prototype.testAllow=function(e,t,n){return!e||!!o.element(n)&&(o.string(e)?s.matchesUpTo(n,e,t):!!o.element(e)&&s.nodeContains(e,n))},r.prototype.testIgnoreAllow=function(e,t,n){return!this.testIgnore(e.ignoreFrom,t,n)&&this.testAllow(e.allowFrom,t,n)},r.prototype.actionChecker=function(e){return o.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},r.prototype.styleCursor=function(e){return o.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},r.prototype.defaultActionChecker=function(e,t,n,r){for(var o=this.getRect(r),s=null,a=i.names,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var u=p;if((!n.pointerIsDown||!n.mouse||0!=(t.buttons&this.options[u].mouseButtons))&&(s=i[u].checker(e,t,this,r,n,o)))return s}}},{"../Interactable":4,"../actions/base":6,"../utils/domUtils":39,"../utils/is":46}],13:[function(e,t,n){"use strict";function r(e,t,n,r){return g.is.object(e)&&t.testIgnoreAllow(t.options[e.name],n,r)&&t.options[e.name].enabled&&a(t,n,e)?e:null}function i(e,t,n,i,o,s){for(var a=0,l=i.length;a=m.maxInteractions)return!1;if(u.target===e){if((a+=d===n.name|0)>=i)return!1;if(u.element===t&&(l++,d!==n.name||l>=o))return!1}}}return m.maxInteractions>0}}var l=e("../interact"),c=e("../Interactable"),p=e("../Interaction"),u=e("../actions/base"),d=e("../defaultOptions"),f=e("../utils/browser"),v=e("../scope"),g=e("../utils"),h=e("../utils/Signals").new();e("./InteractableMethods");var m={signals:h,withinInteractionLimit:a,maxInteractions:1/0,defaults:{perAction:{manualStart:!1,max:1/0,maxPerElement:1,allowFrom:null,ignoreFrom:null}},setActionDefaults:function(e){g.extend(e.defaults,m.defaults.perAction)}};p.signals.on("down",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;if(!t.interacting()){s(t,o(t,n,r,i))}}),p.signals.on("move",function(e){var t=e.interaction,n=e.pointer,r=e.event,i=e.eventTarget;if(t.mouse&&!t.pointerIsDown&&!t.interacting()){s(t,o(t,n,r,i))}}),p.signals.on("move",function(e){var t=e.interaction,n=e.event;if(t.pointerIsDown&&!t.interacting()&&t.pointerWasMoved&&t.prepared.name){h.fire("before-start",e);var r=t.target;t.prepared.name&&r&&(r.options[t.prepared.name].manualStart||!a(r,t.element,t.prepared)?t.stop(n):t.start(t.prepared,r,t.element))}}),p.signals.on("stop",function(e){var t=e.interaction,n=t.target;n&&n.options.styleCursor&&(n._doc.documentElement.style.cursor="")}),c.prototype.getAction=function(e,t,n,r){var i=this.defaultActionChecker(e,t,n,r);return this.options.actionChecker?this.options.actionChecker(e,t,i,this,r,n):i},c.prototype.actionChecker=function(e){return g.is.function(e)?(this.options.actionChecker=e,this):null===e?(delete this.options.actionChecker,this):this.options.actionChecker},c.prototype.styleCursor=function(e){return g.is.bool(e)?(this.options.styleCursor=e,this):null===e?(delete this.options.styleCursor,this):this.options.styleCursor},c.prototype.defaultActionChecker=function(e,t,n,r){for(var i=this.getRect(r),o=t.buttons||{0:1,1:4,3:8,4:16}[t.button],s=null,a=u.names,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var d=p;if((!n.pointerIsDown||!n.mouse||0!=(o&this.options[d].mouseButtons))&&(s=u[d].checker(e,t,this,r,n,i)))return s}},l.maxInteractions=function(e){return g.is.number(e)?(m.maxInteractions=e,this):m.maxInteractions},c.settingsMethods.push("styleCursor"),c.settingsMethods.push("actionChecker"),c.settingsMethods.push("ignoreFrom"),c.settingsMethods.push("allowFrom"),d.base.actionChecker=null,d.base.styleCursor=!0,g.extend(d.perAction,m.defaults.perAction),t.exports=m},{"../Interactable":4,"../Interaction":5,"../actions/base":6,"../defaultOptions":18,"../interact":21,"../scope":34,"../utils":44,"../utils/Signals":35,"../utils/browser":37,"./InteractableMethods":12}],14:[function(e,t,n){"use strict";var r=e("./base"),i=e("../Interaction");i.signals.on("new",function(e){e.delayTimer=null}),r.signals.on("prepared",function(e){var t=e.interaction,n=t.prepared.name;if(n){var r=t.target.options[n].delay;r>0&&(t.delayTimer=setTimeout(function(){t.start(t.prepared,t.target,t.element)},r))}}),i.signals.on("move",function(e){var t=e.interaction,n=e.duplicate;t.pointerWasMoved&&!n&&clearTimeout(t.delayTimer)}),r.signals.on("before-start",function(e){var t=e.interaction,n=t.prepared.name;if(n){t.target.options[n].delay>0&&(t.prepared.name=null)}})},{"../Interaction":5,"./base":13}],15:[function(e,t,n){"use strict";function r(e,t){if(!t)return!1;var n=t.options.drag.startAxis;return"xy"===e||"xy"===n||n===e}var i=e("./base"),o=e("../scope"),s=e("../utils/browser"),a=e("../utils/is"),l=e("../utils/domUtils"),c=l.matchesSelector,p=l.parentNode;i.setActionDefaults(e("../actions/drag")),i.signals.on("before-start",function(e){var t=e.interaction,n=e.eventTarget,l=e.dx,u=e.dy;if("drag"===t.prepared.name){var d=Math.abs(l),f=Math.abs(u),v=t.target.options.drag,g=v.startAxis,h=d>f?"x":dl.minSpeed&&g>l.endSpeed,b={interaction:t,pageCoords:v,statuses:f,preEnd:!0,requireEndOnly:!0};y&&!x&&(c.resetStatuses(f),m=c.setAll(b),m.shouldMove&&m.locked&&(h=!0)),(x||h)&&(p.copyCoords(i.upCoords,t.curCoords),t.pointers[0]=i.startEvent=new a(t,n,t.prepared.name,"inertiastart",t.element),i.t0=d,i.active=!0,i.allowResume=l.allowResume,t.simulation=i,o.fire(i.startEvent),x?(i.vx0=t.pointerDelta.client.vx,i.vy0=t.pointerDelta.client.vy,i.v0=g,r(t,i),p.extend(v,t.curCoords.page),v.x+=i.xe,v.y+=i.ye,c.resetStatuses(f),m=c.setAll(b),i.modifiedXe+=m.dx,i.modifiedYe+=m.dy,i.i=u.request(t.boundInertiaFrame)):(i.smoothEnd=!0,i.xe=m.dx,i.ye=m.dy,i.sx=i.sy=0,i.i=u.request(t.boundSmoothEndFrame)))}}),l.signals.on("stop-active",function(e){var t=e.interaction,n=t.inertiaStatus;n.active&&(u.cancel(n.i),n.active=!1,t.simulation=null)})},{"./InteractEvent":3,"./Interaction":5,"./modifiers":24,"./utils":44,"./utils/raf":50}],21:[function(e,t,n){"use strict";function r(e,t){var n=a.interactables.get(e,t);return n||(n=new l(e,t),n.events.global=p),n}var i=e("./utils/browser"),o=e("./utils/events"),s=e("./utils"),a=e("./scope"),l=e("./Interactable"),c=e("./Interaction"),p={};r.isSet=function(e,t){return-1!==a.interactables.indexOfElement(e,t&&t.context)},r.on=function(e,t,n){if(s.is.string(e)&&-1!==e.search(" ")&&(e=e.trim().split(/ +/)),s.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.on(f,t,n)}return r}if(s.is.object(e)){for(var v in e)r.on(v,e[v],t);return r}return s.contains(l.eventTypes,e)?p[e]?p[e].push(t):p[e]=[t]:o.add(a.document,e,t,{options:n}),r},r.off=function(e,t,n){if(s.is.string(e)&&-1!==e.search(" ")&&(e=e.trim().split(/ +/)),s.is.array(e)){for(var i=e,c=Array.isArray(i),u=0,i=c?i:i[Symbol.iterator]();;){var d;if(c){if(u>=i.length)break;d=i[u++]}else{if(u=i.next(),u.done)break;d=u.value}var f=d;r.off(f,t,n)}return r}if(s.is.object(e)){for(var v in e)r.off(v,e[v],t);return r}if(s.contains(l.eventTypes,e)){var g=void 0;e in p&&-1!==(g=s.indexOf(p[e],t))&&p[e].splice(g,1)}else o.remove(a.document,e,t,n);return r},r.debug=function(){return a},r.getPointerAverage=s.pointerAverage,r.getTouchBBox=s.touchBBox,r.getTouchDistance=s.touchDistance,r.getTouchAngle=s.touchAngle,r.getElementRect=s.getElementRect,r.getElementClientRect=s.getElementClientRect,r.matchesSelector=s.matchesSelector,r.closest=s.closest,r.supportsTouch=function(){return i.supportsTouch},r.supportsPointerEvent=function(){return i.supportsPointerEvent},r.stop=function(e){for(var t=a.interactions.length-1;t>=0;t--)a.interactions[t].stop(e);return r},r.pointerMoveTolerance=function(e){return s.is.number(e)?(c.pointerMoveTolerance=e,this):c.pointerMoveTolerance},r.addDocument=a.addDocument,r.removeDocument=a.removeDocument,a.interact=r,t.exports=r},{"./Interactable":4,"./Interaction":5,"./scope":34,"./utils":44,"./utils/browser":37,"./utils/events":40}],22:[function(e,t,n){"use strict";function r(e){var t=e.interaction,n=e.event;t.target&&t.target.checkAndPreventDefault(n)}var i=e("./Interactable"),o=e("./Interaction"),s=e("./scope"),a=e("./utils/is"),l=e("./utils/events"),c=e("./utils/domUtils"),p=c.nodeContains,u=c.matchesSelector;i.prototype.preventDefault=function(e){return/^(always|never|auto)$/.test(e)?(this.options.preventDefault=e,this):a.bool(e)?(this.options.preventDefault=e?"always":"never",this):this.options.preventDefault},i.prototype.checkAndPreventDefault=function(e){var t=this.options.preventDefault;if("never"!==t)return"always"===t?void e.preventDefault():void(l.supportsOptions||/^(mouse|pointer|touch)*(down|start)/i.test(e.type)||a.element(e.target)&&u(e.target,"input,select,textarea,[contenteditable=true],[contenteditable=true] *")||e.preventDefault())};for(var d=["down","move","up","cancel"],f=0;f=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i;if(o.element&&(o.element===e.target||p(o.element,e.target)))return void o.target.checkAndPreventDefault(e)}}},{"./Interactable":4,"./Interaction":5,"./scope":34,"./utils/domUtils":39,"./utils/events":40,"./utils/is":46}],23:[function(e,t,n){"use strict";function r(e){var t=e.target,n=a.search(e,e.type,t);n&&n.prevTap&&e.clientX===n.prevTap.clientX&&e.clientY===n.prevTap.clientY&&t===n.prevTap.target&&(n.downTargets[0]=t,n.downTimes[0]=(new Date).getTime(),l.fire({interaction:n,event:e,eventTarget:t,pointer:e,type:"tap"}))}var i=e("./scope"),o=e("./utils/events"),s=e("./utils/browser"),a=e("./utils/interactionFinder"),l=e("./pointerEvents/base"),c=e("./utils/window"),p=c.window,u=Object.prototype.toString;if(p.Array.isArray||(p.Array.isArray=function(e){return"[object Array]"===u.call(e)}),String.prototype.trim||(String.prototype.trim=function(){return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")}),s.isIE8){var d=function(e){for(var t=i.interactions,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var o;if(n){if(r>=t.length)break;o=t[r++]}else{if(r=t.next(),r.done)break;o=r.value}var s=o;s.interacting()&&s.target.checkAndPreventDefault(e)}},f=function(e,t){var n=e.doc,i=(e.win,0===t.indexOf("listen")?o.add:o.remove);i(n,"selectstart",d),l&&i(n,"dblclick",r)};i.signals.on("add-document",f),i.signals.on("remove-document",f)}t.exports=null},{"./pointerEvents/base":31,"./scope":34,"./utils/browser":37,"./utils/events":40,"./utils/interactionFinder":45,"./utils/window":52}],24:[function(e,t,n){"use strict";function r(e,t,n){return e&&e.enabled&&(t||!e.endOnly)&&(!n||e.endOnly)}var i=e("../InteractEvent"),o=e("../Interaction"),s=e("../utils/extend"),a={names:[],setOffsets:function(e){var t=e.interaction,n=e.pageCoords,r=t.target,i=t.element,o=t.startOffset,s=r.getRect(i);s?(o.left=n.x-s.left,o.top=n.y-s.top,o.right=s.right-n.x,o.bottom=s.bottom-n.y,"width"in s||(s.width=s.right-s.left),"height"in s||(s.height=s.bottom-s.top)):o.left=o.top=o.right=o.bottom=0,e.rect=s,e.interactable=r,e.element=i;for(var l=0;l=p.length)break;f=p[d++]}else{if(d=p.next(),d.done)break;f=d.value}var v=f,g=a[v],h=t.target.options[t.prepared.name][v];r(h,i,o)&&(e.status=e.status=n[v],e.options=h,e.offset=e.interaction.modifierOffsets[v],g.set(e),e.status.locked&&(l.x+=e.status.dx,l.y+=e.status.dy,c.dx+=e.status.dx,c.dy+=e.status.dy,c.locked=!0))}return c.shouldMove=!e.status||!c.locked||e.status.changed,c},resetStatuses:function(e){for(var t=a.names,n=Array.isArray(t),r=0,t=n?t:t[Symbol.iterator]();;){var i;if(n){if(r>=t.length)break;i=t[r++]}else{if(r=t.next(),r.done)break;i=r.value}var o=i,s=e[o]||{};s.dx=s.dy=0,s.modifiedX=s.modifiedY=NaN,s.locked=!1,s.changed=!0,e[o]=s}return e},start:function(e,t){var n=e.interaction,r={interaction:n,pageCoords:("action-resume"===t?n.curCoords:n.startCoords).page,startOffset:n.startOffset,statuses:n.modifierStatuses,preEnd:!1,requireEndOnly:!1};a.setOffsets(r),a.resetStatuses(r.statuses),r.pageCoords=s({},n.startCoords.page),n.modifierResult=a.setAll(r)}};o.signals.on("new",function(e){e.startOffset={left:0,right:0,top:0,bottom:0},e.modifierOffsets={},e.modifierStatuses=a.resetStatuses({}),e.modifierResult=null}),o.signals.on("action-start",a.start),o.signals.on("action-resume",a.start),o.signals.on("before-action-move",function(e){var t=e.interaction,n=e.preEnd,r=e.interactingBeforeMove,i=a.setAll({interaction:t,preEnd:n,pageCoords:t.curCoords.page,statuses:t.modifierStatuses,requireEndOnly:!1});!i.shouldMove&&r&&(t._dontFireMove=!0),t.modifierResult=i}),o.signals.on("action-end",function(e){for(var t=e.interaction,n=e.event,i=0;i=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}var m=h,y=m.x,x=m.y;l.push({x:s.left-i.width*y+u.x,y:s.top-i.height*x+u.y})}else l.push(u);return l},set:function(e){var t=e.interaction,n=e.pageCoords,r=e.status,i=e.options,s=e.offset,a=[],l=void 0,c=void 0,p=void 0;if(r.useStatusXY)c={x:r.x,y:r.y};else{var u=o.getOriginXY(t.target,t.element,t.prepared.name);c=o.extend({},n),c.x-=u.x,c.y-=u.y}r.realX=c.x,r.realY=c.y;for(var d=i.targets?i.targets.length:0,f=s,v=Array.isArray(f),g=0,f=v?f:f[Symbol.iterator]();;){var h;if(v){if(g>=f.length)break;h=f[g++]}else{if(g=f.next(),g.done)break;h=g.value}for(var m=h,y=m.x,x=m.y,b=c.x-y,w=c.y-x,E=i.targets,S=Array.isArray(E),T=0,E=S?E:E[Symbol.iterator]();;){var C;if(S){if(T>=E.length)break;C=E[T++]}else{if(T=E.next(),T.done)break;C=T.value}var A=C;l=o.is.function(A)?A(b,w,t):A,l&&a.push({x:o.is.number(l.x)?l.x+y:b,y:o.is.number(l.y)?l.y+x:w,range:o.is.number(l.range)?l.range:i.range})}}var D={target:null,inRange:!1,distance:0,range:0,dx:0,dy:0};for(p=0,d=a.length;p=p.length)break;f=p[d++]}else{if(d=p.next(),d.done)break;f=d.value}var v=f,g=void 0;g=a.is.function(v)?v(l,c,t):v,g&&("width"in g&&"height"in g&&(g.x=g.width, +g.y=g.height),e.options.targets.push(g))}i.set(e)},modifyCoords:function(e){var t=e.options;e.options=a.extend({},t),e.options.enabled=t.enabled,e.options.relativePoints=[null],i.modifyCoords(e)}};r.snapSize=l,r.names.push("snapSize"),o.perAction.snapSize=l.defaults,s.defaults.snapSize=l.defaults,t.exports=l},{"../actions/resize":10,"../defaultOptions":18,"../utils/":44,"./index":24,"./snap":28}],30:[function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=e("../utils/pointerUtils");t.exports=function(){function e(t,n,o,s,a){if(r(this,e),i.pointerExtend(this,o),o!==n&&i.pointerExtend(this,n),this.interaction=a,this.timeStamp=(new Date).getTime(),this.originalEvent=o,this.type=t,this.pointerId=i.getPointerId(n),this.pointerType=i.getPointerType(n),this.target=s,this.currentTarget=null,"tap"===t){var l=a.getPointerIndex(n);this.dt=this.timeStamp-a.downTimes[l];var c=this.timeStamp-a.tapTime;this.double=!!(a.prevTap&&"doubletap"!==a.prevTap.type&&a.prevTap.target===this.target&&c<500)}else"doubletap"===t&&(this.dt=n.timeStamp-a.tapTime)}return e.prototype.subtractOrigin=function(e){var t=e.x,n=e.y;return this.pageX-=t,this.pageY-=n,this.clientX-=t,this.clientY-=n,this},e.prototype.addOrigin=function(e){var t=e.x,n=e.y;return this.pageX+=t,this.pageY+=n,this.clientX+=t,this.clientY+=n,this},e.prototype.preventDefault=function(){this.originalEvent.preventDefault()},e.prototype.stopPropagation=function(){this.propagationStopped=!0},e.prototype.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},e}()},{"../utils/pointerUtils":49}],31:[function(e,t,n){"use strict";function r(e){for(var t=e.interaction,n=e.pointer,s=e.event,l=e.eventTarget,c=e.type,u=void 0===c?e.pointerEvent.type:c,d=e.targets,f=void 0===d?i(e):d,v=e.pointerEvent,g=void 0===v?new o(u,n,s,l,t):v,h={interaction:t,pointer:n,event:s,eventTarget:l,targets:f,type:u,pointerEvent:g},m=0;m=u.length)break;g=u[v++]}else{if(v=u.next(),v.done)break;g=v.value}var h=g;c.element=h,p.fire("collect-targets",c)}return"hold"===o&&(c.targets=d(c.targets,function(e){return e.eventable.options.holdDuration===t.holdTimers[s].duration})),c.targets}var o=e("./PointerEvent"),s=e("../Interaction"),a=e("../utils"),l=e("../utils/browser"),c=e("../defaultOptions"),p=e("../utils/Signals").new(),u=e("../utils/arr"),d=u.filter,f=["down","up","cancel"],v=["down","up","cancel"],g={PointerEvent:o,fire:r,collectEventTargets:i,signals:p,defaults:{holdDuration:600,ignoreFrom:null,allowFrom:null,origin:{x:0,y:0}},types:["down","move","up","cancel","tap","doubletap","hold"]};s.signals.on("update-pointer-down",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers[n]={duration:1/0,timeout:null}}),s.signals.on("remove-pointer",function(e){var t=e.interaction,n=e.pointerIndex;t.holdTimers.splice(n,1)}),s.signals.on("move",function(e){var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,s=e.duplicateMove,a=t.getPointerIndex(n);s||t.pointerIsDown&&!t.pointerWasMoved||(t.pointerIsDown&&clearTimeout(t.holdTimers[a].timeout),r({interaction:t,pointer:n,event:i,eventTarget:o,type:"move"}))}),s.signals.on("down",function(e){for(var t=e.interaction,n=e.pointer,i=e.event,o=e.eventTarget,s=e.pointerIndex,c=l.isIE8?a.extend({},i):i,u=t.holdTimers[s],d=a.getPath(o),f={interaction:t,pointer:n,event:i,eventTarget:o,type:"hold",targets:[],path:d,element:null},v=d,g=Array.isArray(v),h=0,v=g?v:v[Symbol.iterator]();;){var m;if(g){if(h>=v.length)break;m=v[h++]}else{if(h=v.next(),h.done)break;m=h.value}var y=m;f.element=y,p.fire("collect-targets",f)}if(f.targets.length){for(var x=1/0,b=0;b=0&&(p.selectors[u]!==e||p.contexts[u]!==t);u--);-1===u&&(u=p.selectors.length,p.selectors.push(e),p.contexts.push(t),p.listeners.push([])),p.listeners[u].push([i,!!s.capture,s.passive])}function s(e,t,n,r,o){var s=f(o),c=O[n],p=!1,u=void 0;if(c)for(u=c.selectors.length-1;u>=0;u--)if(c.selectors[u]===e&&c.contexts[u]===t){for(var d=c.listeners[u],v=d.length-1;v>=0;v--){var g=d[v],h=g[0],m=g[1],y=g[2];if(h===r&&m===!!s.capture&&y===s.passive){d.splice(v,1),d.length||(c.selectors.splice(u,1),c.contexts.splice(u,1),c.listeners.splice(u,1),i(t,n,a),i(t,n,l,!0),c.selectors.length||(O[n]=null)),p=!0;break}}if(p)break}}function a(e,t){var n=f(t),r={},i=O[e.type],o=g.getActualElement(e.path?e.path[0]:e.target),s=o;for(h(r,e),r.originalEvent=e,r.preventDefault=p;v.element(s);){for(var a=0;a=l.length)break;u=l[p++]}else{if(p=l.next(),p.done)break;u=p.value}var d=u,f=o[d](a);if(f)return f}},simulationResume:function(e){var t=e.pointerType,n=e.eventType,o=e.eventTarget;if(!/down|start/i.test(n))return null;for(var s=r.interactions,a=Array.isArray(s),l=0,s=a?s:s[Symbol.iterator]();;){var c;if(a){if(l>=s.length)break;c=s[l++]}else{if(l=s.next(),l.done)break;c=l.value}var p=c,u=o;if(p.simulation&&p.simulation.allowResume&&p.pointerType===t)for(;u;){if(u===p.element)return p;u=i.parentNode(u)}}return null},mouseOrPen:function(e){var t=e.pointerId,n=e.pointerType,o=e.eventType;if("mouse"!==n&&"pen"!==n)return null;for(var s=void 0,a=r.interactions,l=Array.isArray(a),c=0,a=l?a:a[Symbol.iterator]();;){var p;if(l){if(c>=a.length)break;p=a[c++]}else{if(c=a.next(),c.done)break;p=c.value}var u=p;if(u.pointerType===n){if(u.simulation&&!i.contains(u.pointerIds,t))continue;if(u.interacting())return u;s||(s=u)}}if(s)return s;for(var d=r.interactions,f=Array.isArray(d),v=0,d=f?d:d[Symbol.iterator]();;){var g;if(f){if(v>=d.length)break;g=d[v++]}else{if(v=d.next(),v.done)break;g=v.value}var h=g;if(!(h.pointerType!==n||/down/i.test(o)&&h.simulation))return h}return null},hasPointer:function(e){for(var t=e.pointerId,n=r.interactions,o=Array.isArray(n),s=0,n=o?n:n[Symbol.iterator]();;){var a;if(o){if(s>=n.length)break;a=n[s++]}else{if(s=n.next(),s.done)break;a=s.value}var l=a;if(i.contains(l.pointerIds,t))return l}},idle:function(e){for(var t=e.pointerType,n=r.interactions,i=Array.isArray(n),o=0,n=i?n:n[Symbol.iterator]();;){var s;if(i){if(o>=n.length)break;s=n[o++]}else{if(o=n.next(),o.done)break;s=o.value}var a=s;if(1===a.pointerIds.length){var l=a.target;if(l&&!l.options.gesture.enabled)continue}else if(a.pointerIds.length>=2)continue;if(!a.interacting()&&t===a.pointerType)return a}return null}};t.exports=o},{"../scope":34,"./index":44}],46:[function(e,t,n){"use strict";var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},i=e("./window"),o=e("./isWindow"),s={array:function(){},window:function(e){return e===i.window||o(e)},docFrag:function(e){return s.object(e)&&11===e.nodeType},object:function(e){return!!e&&"object"===(void 0===e?"undefined":r(e))},function:function(e){return"function"==typeof e},number:function(e){return"number"==typeof e},bool:function(e){return"boolean"==typeof e},string:function(e){return"string"==typeof e},element:function(e){if(!e||"object"!==(void 0===e?"undefined":r(e)))return!1;var t=i.getWindow(e)||i.window;return/object|function/.test(r(t.Element))?e instanceof t.Element:1===e.nodeType&&"string"==typeof e.nodeName}};s.array=function(e){return s.object(e)&&void 0!==e.length&&s.function(e.splice)},t.exports=s},{"./isWindow":47,"./window":52}],47:[function(e,t,n){"use strict";t.exports=function(e){return!(!e||!e.Window)&&e instanceof e.Window}},{}],48:[function(e,t,n){"use strict";function r(e,n){for(var r in n){var i=t.exports.prefixedPropREs,o=!1;for(var s in i)if(0===r.indexOf(s)&&i[s].test(r)){o=!0;break}o||"function"==typeof n[r]||(e[r]=n[r])}return e}r.prefixedPropREs={webkit:/(Movement[XY]|Radius[XY]|RotationAngle|Force)$/},t.exports=r},{}],49:[function(e,t,n){"use strict";var r=e("./hypot"),i=e("./browser"),o=e("./domObjects"),s=e("./domUtils"),a=e("./domObjects"),l=e("./is"),c=e("./pointerExtend"),p={copyCoords:function(e,t){e.page=e.page||{},e.page.x=t.page.x,e.page.y=t.page.y,e.client=e.client||{},e.client.x=t.client.x,e.client.y=t.client.y,e.timeStamp=t.timeStamp},setCoordDeltas:function(e,t,n){e.page.x=n.page.x-t.page.x,e.page.y=n.page.y-t.page.y,e.client.x=n.client.x-t.client.x,e.client.y=n.client.y-t.client.y,e.timeStamp=n.timeStamp-t.timeStamp;var i=Math.max(e.timeStamp/1e3,.001);e.page.speed=r(e.page.x,e.page.y)/i,e.page.vx=e.page.x/i,e.page.vy=e.page.y/i,e.client.speed=r(e.client.x,e.page.y)/i,e.client.vx=e.client.x/i,e.client.vy=e.client.y/i},isNativePointer:function(e){return e instanceof o.Event||e instanceof o.Touch},getXY:function(e,t,n){return n=n||{},e=e||"page",n.x=t[e+"X"],n.y=t[e+"Y"],n},getPageXY:function(e,t){return t=t||{},i.isOperaMobile&&p.isNativePointer(e)?(p.getXY("screen",e,t),t.x+=window.scrollX,t.y+=window.scrollY):p.getXY("page",e,t),t},getClientXY:function(e,t){return t=t||{},i.isOperaMobile&&p.isNativePointer(e)?p.getXY("screen",e,t):p.getXY("client",e,t),t},getPointerId:function(e){return l.number(e.pointerId)?e.pointerId:e.identifier},setCoords:function(e,t,n){var r=t.length>1?p.pointerAverage(t):t[0],i={};p.getPageXY(r,i),e.page.x=i.x,e.page.y=i.y,p.getClientXY(r,i),e.client.x=i.x,e.client.y=i.y,e.timeStamp=l.number(n)?n:(new Date).getTime()},pointerExtend:c,getTouchPair:function(e){var t=[];return l.array(e)?(t[0]=e[0],t[1]=e[1]):"touchend"===e.type?1===e.touches.length?(t[0]=e.touches[0],t[1]=e.changedTouches[0]):0===e.touches.length&&(t[0]=e.changedTouches[0],t[1]=e.changedTouches[1]):(t[0]=e.touches[0],t[1]=e.touches[1]),t},pointerAverage:function(e){for(var t={pageX:0,pageY:0,clientX:0,clientY:0,screenX:0,screenY:0},n=e,r=Array.isArray(n),i=0,n=r?n:n[Symbol.iterator]();;){var o;if(r){if(i>=n.length)break;o=n[i++]}else{if(i=n.next(),i.done)break;o=i.value}var s=o;for(var a in t)t[a]+=s[a]}for(var l in t)t[l]/=e.length;return t},touchBBox:function(e){if(e.length||e.touches&&e.touches.length>1){var t=p.getTouchPair(e),n=Math.min(t[0].pageX,t[1].pageX),r=Math.min(t[0].pageY,t[1].pageY);return{x:n,y:r,left:n,top:r,width:Math.max(t[0].pageX,t[1].pageX)-n,height:Math.max(t[0].pageY,t[1].pageY)-r}}},touchDistance:function(e,t){var n=t+"X",i=t+"Y",o=p.getTouchPair(e),s=o[0][n]-o[1][n],a=o[0][i]-o[1][i];return r(s,a)},touchAngle:function(e,t,n){var r=n+"X",i=n+"Y",o=p.getTouchPair(e),s=o[1][r]-o[0][r],a=o[1][i]-o[0][i];return 180*Math.atan2(a,s)/Math.PI},getPointerType:function(e){return l.string(e.pointerType)?e.pointerType:l.number(e.pointerType)?[void 0,void 0,"touch","pen","mouse"][e.pointerType]:/touch/.test(e.type)||e instanceof a.Touch?"touch":"mouse"},getEventTargets:function(e){return[s.getActualElement(e.path?e.path[0]:e.target),s.getActualElement(e.currentTarget)]}};t.exports=p},{"./browser":37,"./domObjects":38,"./domUtils":39,"./hypot":43,"./is":46,"./pointerExtend":48}],50:[function(e,t,n){"use strict";for(var r=e("./window"),i=r.window,o=["ms","moz","webkit","o"],s=0,a=void 0,l=void 0,c=0;c\n * Open source under the MIT License.\n * https://raw.github.com/taye/interact.js/master/LICENSE\n */\n","/*\n * In a (windowless) server environment this file exports a factory function\n * that takes the window to use.\n *\n * var interact = require('interact.js')(windowObject);\n *\n * See https://github.com/taye/interact.js/issues/187\n */\nif (typeof window === 'undefined') {\n module.exports = function (window) {\n require('./src/utils/window').init(window);\n\n return require('./src/index');\n };\n}\nelse {\n module.exports = require('./src/index');\n}\n","const { indexOf } = require('./utils/arr');\nconst extend = require('./utils/extend.js');\n\nfunction fireUntilImmediateStopped (event, listeners) {\n for (let i = 0, len = listeners.length; i < len && !event.immediatePropagationStopped; i++) {\n listeners[i](event);\n }\n}\n\nclass Eventable {\n\n constructor (options) {\n this.options = extend({}, options || {});\n }\n\n fire (event) {\n let listeners;\n const onEvent = 'on' + event.type;\n const global = this.global;\n\n // Interactable#on() listeners\n if ((listeners = this[event.type])) {\n fireUntilImmediateStopped(event, listeners);\n }\n\n // interactable.onevent listener\n if (this[onEvent]) {\n this[onEvent](event);\n }\n\n // interact.on() listeners\n if (!event.propagationStopped && global && (listeners = global[event.type])) {\n fireUntilImmediateStopped(event, listeners);\n }\n }\n\n on (eventType, listener) {\n // if this type of event was never bound\n if (this[eventType]) {\n this[eventType].push(listener);\n }\n else {\n this[eventType] = [listener];\n }\n }\n\n off (eventType, listener) {\n // if it is an action event type\n const eventList = this[eventType];\n const index = eventList? indexOf(eventList, listener) : -1;\n\n if (index !== -1) {\n eventList.splice(index, 1);\n }\n\n if (eventList && eventList.length === 0 || !listener) {\n this[eventType] = listener;\n }\n }\n}\n\nmodule.exports = Eventable;\n","const extend = require('./utils/extend');\nconst getOriginXY = require('./utils/getOriginXY');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nclass InteractEvent {\n constructor (interaction, event, action, phase, element, related, preEnd = false) {\n const target = interaction.target;\n const deltaSource = (target && target.options || defaults).deltaSource;\n const origin = getOriginXY(target, element, action);\n const starting = phase === 'start';\n const ending = phase === 'end';\n const coords = starting? interaction.startCoords : interaction.curCoords;\n const prevEvent = interaction.prevEvent;\n\n element = element || interaction.element;\n\n const page = extend({}, coords.page);\n const client = extend({}, coords.client);\n\n page.x -= origin.x;\n page.y -= origin.y;\n\n client.x -= origin.x;\n client.y -= origin.y;\n\n this.ctrlKey = event.ctrlKey;\n this.altKey = event.altKey;\n this.shiftKey = event.shiftKey;\n this.metaKey = event.metaKey;\n this.button = event.button;\n this.buttons = event.buttons;\n this.target = element;\n this.currentTarget = element;\n this.relatedTarget = related || null;\n this.preEnd = preEnd;\n this.type = action + (phase || '');\n this.interaction = interaction;\n this.interactable = target;\n\n this.t0 = starting ? interaction.downTimes[interaction.downTimes.length - 1]\n : prevEvent.t0;\n\n const signalArg = {\n interaction,\n event,\n action,\n phase,\n element,\n related,\n page,\n client,\n coords,\n starting,\n ending,\n deltaSource,\n iEvent: this,\n };\n\n signals.fire('set-xy', signalArg);\n\n if (ending) {\n // use previous coords when ending\n this.pageX = prevEvent.pageX;\n this.pageY = prevEvent.pageY;\n this.clientX = prevEvent.clientX;\n this.clientY = prevEvent.clientY;\n }\n else {\n this.pageX = page.x;\n this.pageY = page.y;\n this.clientX = client.x;\n this.clientY = client.y;\n }\n\n this.x0 = interaction.startCoords.page.x - origin.x;\n this.y0 = interaction.startCoords.page.y - origin.y;\n this.clientX0 = interaction.startCoords.client.x - origin.x;\n this.clientY0 = interaction.startCoords.client.y - origin.y;\n\n signals.fire('set-delta', signalArg);\n\n this.timeStamp = coords.timeStamp;\n this.dt = interaction.pointerDelta.timeStamp;\n this.duration = this.timeStamp - this.t0;\n\n // speed and velocity in pixels per second\n this.speed = interaction.pointerDelta[deltaSource].speed;\n this.velocityX = interaction.pointerDelta[deltaSource].vx;\n this.velocityY = interaction.pointerDelta[deltaSource].vy;\n\n this.swipe = (ending || phase === 'inertiastart')? this.getSwipe() : null;\n\n signals.fire('new', signalArg);\n }\n\n getSwipe () {\n const interaction = this.interaction;\n\n if (interaction.prevEvent.speed < 600\n || this.timeStamp - interaction.prevEvent.timeStamp > 150) {\n return null;\n }\n\n let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI;\n const overlap = 22.5;\n\n if (angle < 0) {\n angle += 360;\n }\n\n const left = 135 - overlap <= angle && angle < 225 + overlap;\n const up = 225 - overlap <= angle && angle < 315 + overlap;\n\n const right = !left && (315 - overlap <= angle || angle < 45 + overlap);\n const down = !up && 45 - overlap <= angle && angle < 135 + overlap;\n\n return {\n up,\n down,\n left,\n right,\n angle,\n speed: interaction.prevEvent.speed,\n velocity: {\n x: interaction.prevEvent.velocityX,\n y: interaction.prevEvent.velocityY,\n },\n };\n }\n\n preventDefault () {}\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n}\n\nsignals.on('set-delta', function ({ iEvent, interaction, starting, deltaSource }) {\n const prevEvent = starting? iEvent : interaction.prevEvent;\n\n if (deltaSource === 'client') {\n iEvent.dx = iEvent.clientX - prevEvent.clientX;\n iEvent.dy = iEvent.clientY - prevEvent.clientY;\n }\n else {\n iEvent.dx = iEvent.pageX - prevEvent.pageX;\n iEvent.dy = iEvent.pageY - prevEvent.pageY;\n }\n});\n\nInteractEvent.signals = signals;\n\nmodule.exports = InteractEvent;\n","const is = require('./utils/is');\nconst events = require('./utils/events');\nconst extend = require('./utils/extend');\nconst actions = require('./actions/base');\nconst scope = require('./scope');\nconst Eventable = require('./Eventable');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nconst {\n getElementRect,\n nodeContains,\n trySelector,\n} = require('./utils/domUtils');\nconst { getWindow } = require('./utils/window');\nconst { indexOf, contains } = require('./utils/arr');\nconst { wheelEvent } = require('./utils/browser');\n\n// all set interactables\nscope.interactables = [];\n\n/*\\\n * Interactable\n [ property ]\n **\n * Object type returned by @interact\n\\*/\nclass Interactable {\n constructor (target, options) {\n options = options || {};\n\n this.target = target;\n this.events = new Eventable();\n this._context = options.context || scope.document;\n this._win = getWindow(trySelector(target)? this._context : target);\n this._doc = this._win.document;\n\n signals.fire('new', {\n target,\n options,\n interactable: this,\n win: this._win,\n });\n\n scope.addDocument( this._doc, this._win );\n\n scope.interactables.push(this);\n\n this.set(options);\n }\n\n setOnEvents (action, phases) {\n const onAction = 'on' + action;\n\n if (is.function(phases.onstart) ) { this.events[onAction + 'start' ] = phases.onstart ; }\n if (is.function(phases.onmove) ) { this.events[onAction + 'move' ] = phases.onmove ; }\n if (is.function(phases.onend) ) { this.events[onAction + 'end' ] = phases.onend ; }\n if (is.function(phases.oninertiastart)) { this.events[onAction + 'inertiastart' ] = phases.oninertiastart ; }\n\n return this;\n }\n\n setPerAction (action, options) {\n // for all the default per-action options\n for (const option in options) {\n // if this option exists for this action\n if (option in defaults[action]) {\n // if the option in the options arg is an object value\n if (is.object(options[option])) {\n // duplicate the object\n this.options[action][option] = extend(this.options[action][option] || {}, options[option]);\n\n if (is.object(defaults.perAction[option]) && 'enabled' in defaults.perAction[option]) {\n this.options[action][option].enabled = options[option].enabled === false? false : true;\n }\n }\n else if (is.bool(options[option]) && is.object(defaults.perAction[option])) {\n this.options[action][option].enabled = options[option];\n }\n else if (options[option] !== undefined) {\n // or if it's not undefined, do a plain assignment\n this.options[action][option] = options[option];\n }\n }\n }\n }\n\n /*\\\n * Interactable.getRect\n [ method ]\n *\n * The default function to get an Interactables bounding rect. Can be\n * overridden using @Interactable.rectChecker.\n *\n - element (Element) #optional The element to measure.\n = (object) The object's bounding rectangle.\n o {\n o top : 0,\n o left : 0,\n o bottom: 0,\n o right : 0,\n o width : 0,\n o height: 0\n o }\n \\*/\n getRect (element) {\n element = element || this.target;\n\n if (is.string(this.target) && !(is.element(element))) {\n element = this._context.querySelector(this.target);\n }\n\n return getElementRect(element);\n }\n\n /*\\\n * Interactable.rectChecker\n [ method ]\n *\n * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n - checker (function) #optional A function which returns this Interactable's bounding rectangle. See @Interactable.getRect\n = (function | object) The checker function or this Interactable\n \\*/\n rectChecker (checker) {\n if (is.function(checker)) {\n this.getRect = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.getRect;\n\n return this;\n }\n\n return this.getRect;\n }\n\n _backCompatOption (optionName, newValue) {\n if (trySelector(newValue) || is.object(newValue)) {\n this.options[optionName] = newValue;\n\n for (const action of actions.names) {\n this.options[action][optionName] = newValue;\n }\n\n return this;\n }\n\n return this.options[optionName];\n }\n\n /*\\\n * Interactable.origin\n [ method ]\n *\n * Gets or sets the origin of the Interactable's element. The x and y\n * of the origin will be subtracted from action event coordinates.\n *\n - origin (object | string) #optional An object eg. { x: 0, y: 0 } or string 'parent', 'self' or any CSS selector\n * OR\n - origin (Element) #optional An HTML or SVG Element whose rect will be used\n **\n = (object) The current origin or this Interactable\n \\*/\n origin (newValue) {\n return this._backCompatOption('origin', newValue);\n }\n\n /*\\\n * Interactable.deltaSource\n [ method ]\n *\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n - newValue (string) #optional Use 'client' if you will be scrolling while interacting; Use 'page' if you want autoScroll to work\n = (string | object) The current deltaSource or this Interactable\n \\*/\n deltaSource (newValue) {\n if (newValue === 'page' || newValue === 'client') {\n this.options.deltaSource = newValue;\n\n return this;\n }\n\n return this.options.deltaSource;\n }\n\n /*\\\n * Interactable.context\n [ method ]\n *\n * Gets the selector context Node of the Interactable. The default is `window.document`.\n *\n = (Node) The context Node of this Interactable\n **\n \\*/\n context () {\n return this._context;\n }\n\n inContext (element) {\n return (this._context === element.ownerDocument\n || nodeContains(this._context, element));\n }\n\n /*\\\n * Interactable.fire\n [ method ]\n *\n * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n - iEvent (InteractEvent) The InteractEvent object to be fired on this Interactable\n = (Interactable) this Interactable\n \\*/\n fire (iEvent) {\n this.events.fire(iEvent);\n\n return this;\n }\n\n _onOffMultiple (method, eventType, listener, options) {\n if (is.string(eventType) && eventType.search(' ') !== -1) {\n eventType = eventType.trim().split(/ +/);\n }\n\n if (is.array(eventType)) {\n for (let i = 0; i < eventType.length; i++) {\n this[method](eventType[i], listener, options);\n }\n\n return true;\n }\n\n if (is.object(eventType)) {\n for (const prop in eventType) {\n this[method](prop, eventType[prop], listener);\n }\n\n return true;\n }\n }\n\n /*\\\n * Interactable.on\n [ method ]\n *\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n - eventType (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) This Interactable\n \\*/\n on (eventType, listener, options) {\n if (this._onOffMultiple('on', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.on(eventType, listener);\n }\n // delegated event for selector\n else if (is.string(this.target)) {\n events.addDelegate(this.target, this._context, eventType, listener, options);\n }\n else {\n events.add(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.off\n [ method ]\n *\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n - eventType (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) This Interactable\n \\*/\n off (eventType, listener, options) {\n if (this._onOffMultiple('off', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n // if it is an action event type\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.off(eventType, listener);\n }\n // delegated event\n else if (is.string(this.target)) {\n events.removeDelegate(this.target, this._context, eventType, listener, options);\n }\n // remove listener from this Interatable's element\n else {\n events.remove(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.set\n [ method ]\n *\n * Reset the options of this Interactable\n - options (object) The new settings to apply\n = (object) This Interactable\n \\*/\n set (options) {\n if (!is.object(options)) {\n options = {};\n }\n\n this.options = extend({}, defaults.base);\n\n const perActions = extend({}, defaults.perAction);\n\n for (const actionName in actions.methodDict) {\n const methodName = actions.methodDict[actionName];\n\n this.options[actionName] = extend({}, defaults[actionName]);\n\n this.setPerAction(actionName, perActions);\n\n this[methodName](options[actionName]);\n }\n\n for (const setting of Interactable.settingsMethods) {\n this.options[setting] = defaults.base[setting];\n\n if (setting in options) {\n this[setting](options[setting]);\n }\n }\n\n signals.fire('set', {\n options,\n interactable: this,\n });\n\n return this;\n }\n\n /*\\\n * Interactable.unset\n [ method ]\n *\n * Remove this interactable from the list of interactables and remove\n * it's action capabilities and event listeners\n *\n = (object) @interact\n \\*/\n unset () {\n events.remove(this.target, 'all');\n\n if (is.string(this.target)) {\n // remove delegated events\n for (const type in events.delegatedEvents) {\n const delegated = events.delegatedEvents[type];\n\n if (delegated.selectors[0] === this.target\n && delegated.contexts[0] === this._context) {\n\n delegated.selectors.splice(0, 1);\n delegated.contexts .splice(0, 1);\n delegated.listeners.splice(0, 1);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegated[type] = null;\n }\n }\n\n events.remove(this._context, type, events.delegateListener);\n events.remove(this._context, type, events.delegateUseCapture, true);\n }\n }\n else {\n events.remove(this, 'all');\n }\n\n signals.fire('unset', { interactable: this });\n\n scope.interactables.splice(indexOf(scope.interactables, this), 1);\n\n // Stop related interactions when an Interactable is unset\n for (const interaction of scope.interactions || []) {\n if (interaction.target === this && interaction.interacting()) {\n interaction.stop();\n }\n }\n\n return scope.interact;\n }\n}\n\nscope.interactables.indexOfElement = function indexOfElement (target, context) {\n context = context || scope.document;\n\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n if (interactable.target === target && interactable._context === context) {\n return i;\n }\n }\n return -1;\n};\n\nscope.interactables.get = function interactableGet (element, options, dontCheckInContext) {\n const ret = this[this.indexOfElement(element, options && options.context)];\n\n return ret && (is.string(element) || dontCheckInContext || ret.inContext(element))? ret : null;\n};\n\nscope.interactables.forEachSelector = function (callback, element) {\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n // skip non CSS selector targets and out of context elements\n if (!is.string(interactable.target)\n || (element && !interactable.inContext(element))) {\n continue;\n }\n\n const ret = callback(interactable, interactable.target, interactable._context, i, this);\n\n if (ret !== undefined) {\n return ret;\n }\n }\n};\n\n// all interact.js eventTypes\nInteractable.eventTypes = scope.eventTypes = [];\n\nInteractable.signals = signals;\n\nInteractable.settingsMethods = [ 'deltaSource', 'origin', 'preventDefault', 'rectChecker' ];\n\nmodule.exports = Interactable;\n","const scope = require('./scope');\nconst utils = require('./utils');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst finder = require('./utils/interactionFinder');\nconst signals = require('./utils/Signals').new();\n\nconst listeners = {};\nconst methodNames = [\n 'pointerDown', 'pointerMove', 'pointerUp',\n 'updatePointer', 'removePointer',\n];\n\n// for ignoring browser's simulated mouse events\nlet prevTouchTime = 0;\n\n// all active and idle interactions\nscope.interactions = [];\n\nclass Interaction {\n constructor () {\n this.target = null; // current interactable being interacted with\n this.element = null; // the target element of the interactable\n\n this.prepared = { // action that's ready to be fired on next move event\n name : null,\n axis : null,\n edges: null,\n };\n\n // keep track of added pointers\n this.pointers = [];\n this.pointerIds = [];\n this.downTargets = [];\n this.downTimes = [];\n\n // Previous native pointer move event coordinates\n this.prevCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n // current native pointer move event coordinates\n this.curCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Starting InteractEvent pointer coordinates\n this.startCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Change in coordinates and time of the pointer\n this.pointerDelta = {\n page : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n client : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n timeStamp: 0,\n };\n\n this.downEvent = null; // pointerdown/mousedown/touchstart event\n this.downPointer = {};\n\n this._eventTarget = null;\n this._curEventTarget = null;\n\n this.prevEvent = null; // previous action event\n\n this.pointerIsDown = false;\n this.pointerWasMoved = false;\n this._interacting = false;\n\n this.mouse = false;\n\n signals.fire('new', this);\n\n scope.interactions.push(this);\n }\n\n pointerDown (pointer, event, eventTarget) {\n const pointerIndex = this.updatePointer(pointer, event, true);\n\n signals.fire('down', {\n pointer,\n event,\n eventTarget,\n pointerIndex,\n interaction: this,\n });\n }\n\n /*\\\n * Interaction.start\n [ method ]\n *\n * Start an action with the given Interactable and Element as tartgets. The\n * action must be enabled for the target Interactable and an appropriate number\n * of pointers must be held down - 1 for drag/resize, 2 for gesture.\n *\n * Use it with `interactable.able({ manualStart: false })` to always\n * [start actions manually](https://github.com/taye/interact.js/issues/114)\n *\n - action (object) The action to be performed - drag, resize, etc.\n - target (Interactable) The Interactable to target\n - element (Element) The DOM Element to target\n = (object) interact\n **\n | interact(target)\n | .draggable({\n | // disable the default drag start by down->move\n | manualStart: true\n | })\n | // start dragging after the user holds the pointer down\n | .on('hold', function (event) {\n | var interaction = event.interaction;\n |\n | if (!interaction.interacting()) {\n | interaction.start({ name: 'drag' },\n | event.interactable,\n | event.currentTarget);\n | }\n | });\n \\*/\n start (action, target, element) {\n if (this.interacting()\n || !this.pointerIsDown\n || this.pointerIds.length < (action.name === 'gesture'? 2 : 1)) {\n return;\n }\n\n // if this interaction had been removed after stopping\n // add it back\n if (utils.indexOf(scope.interactions, this) === -1) {\n scope.interactions.push(this);\n }\n\n utils.copyAction(this.prepared, action);\n this.target = target;\n this.element = element;\n\n signals.fire('action-start', {\n interaction: this,\n event: this.downEvent,\n });\n }\n\n pointerMove (pointer, event, eventTarget) {\n if (!this.simulation) {\n this.updatePointer(pointer);\n utils.setCoords(this.curCoords, this.pointers);\n }\n\n const duplicateMove = (this.curCoords.page.x === this.prevCoords.page.x\n && this.curCoords.page.y === this.prevCoords.page.y\n && this.curCoords.client.x === this.prevCoords.client.x\n && this.curCoords.client.y === this.prevCoords.client.y);\n\n let dx;\n let dy;\n\n // register movement greater than pointerMoveTolerance\n if (this.pointerIsDown && !this.pointerWasMoved) {\n dx = this.curCoords.client.x - this.startCoords.client.x;\n dy = this.curCoords.client.y - this.startCoords.client.y;\n\n this.pointerWasMoved = utils.hypot(dx, dy) > Interaction.pointerMoveTolerance;\n }\n\n const signalArg = {\n pointer,\n pointerIndex: this.getPointerIndex(pointer),\n event,\n eventTarget,\n dx,\n dy,\n duplicate: duplicateMove,\n interaction: this,\n interactingBeforeMove: this.interacting(),\n };\n\n if (!duplicateMove) {\n // set pointer coordinate, time changes and speeds\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n }\n\n signals.fire('move', signalArg);\n\n if (!duplicateMove) {\n // if interacting, fire an 'action-move' signal etc\n if (this.interacting()) {\n this.doMove(signalArg);\n }\n\n if (this.pointerWasMoved) {\n utils.copyCoords(this.prevCoords, this.curCoords);\n }\n }\n }\n\n /*\\\n * Interaction.doMove\n [ method ]\n *\n * Force a move of the current action at the same coordinates. Useful if\n * snap/restrict has been changed and you want a movement with the new\n * settings.\n *\n **\n | interact(target)\n | .draggable(true)\n | .on('dragmove', function (event) {\n | if (someCondition) {\n | // change the snap settings\n | event.interactable.draggable({ snap: { targets: [] }});\n | // fire another move event with re-calculated snap\n | event.interaction.doMove();\n | }\n | });\n \\*/\n doMove (signalArg) {\n signalArg = utils.extend({\n pointer: this.pointers[0],\n event: this.prevEvent,\n eventTarget: this._eventTarget,\n interaction: this,\n }, signalArg || {});\n\n signals.fire('before-action-move', signalArg);\n\n if (!this._dontFireMove) {\n signals.fire('action-move', signalArg);\n }\n\n this._dontFireMove = false;\n }\n\n // End interact move events and stop auto-scroll unless simulation is running\n pointerUp (pointer, event, eventTarget, curEventTarget) {\n const pointerIndex = this.getPointerIndex(pointer);\n\n signals.fire(/cancel$/i.test(event.type)? 'cancel' : 'up', {\n pointer,\n pointerIndex,\n event,\n eventTarget,\n curEventTarget,\n interaction: this,\n });\n\n if (!this.simulation) {\n this.end(event);\n }\n\n this.pointerIsDown = false;\n this.removePointer(pointer, event);\n }\n\n /*\\\n * Interaction.end\n [ method ]\n *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n - event (PointerEvent) #optional\n **\n | interact(target)\n | .draggable(true)\n | .on('move', function (event) {\n | if (event.pageX > 1000) {\n | // end the current action\n | event.interaction.end();\n | // stop all further listeners from being called\n | event.stopImmediatePropagation();\n | }\n | });\n \\*/\n end (event) {\n event = event || this.prevEvent;\n\n if (this.interacting()) {\n signals.fire('action-end', {\n event,\n interaction: this,\n });\n }\n\n this.stop();\n }\n\n currentAction () {\n return this._interacting? this.prepared.name: null;\n }\n\n interacting () {\n return this._interacting;\n }\n\n stop () {\n signals.fire('stop', { interaction: this });\n\n if (this._interacting) {\n signals.fire('stop-active', { interaction: this });\n signals.fire('stop-' + this.prepared.name, { interaction: this });\n }\n\n this.target = this.element = null;\n\n this._interacting = false;\n this.prepared.name = this.prevEvent = null;\n }\n\n getPointerIndex (pointer) {\n return utils.indexOf(this.pointerIds, utils.getPointerId(pointer));\n }\n\n updatePointer (pointer, event, down = event && /(down|start)$/i.test(event.type)) {\n const id = utils.getPointerId(pointer);\n let index = this.getPointerIndex(pointer);\n\n if (index === -1) {\n index = this.pointerIds.length;\n this.pointerIds[index] = id;\n }\n\n if (down) {\n signals.fire('update-pointer-down', {\n pointer,\n event,\n down,\n pointerId: id,\n pointerIndex: index,\n interaction: this,\n });\n }\n\n this.pointers[index] = pointer;\n\n return index;\n }\n\n removePointer (pointer, event) {\n const id = utils.getPointerId(pointer);\n const index = this.mouse? 0 : utils.indexOf(this.pointerIds, id);\n\n if (index === -1) { return; }\n\n signals.fire('remove-pointer', {\n pointer,\n event,\n pointerIndex: index,\n interaction: this,\n });\n\n this.pointers .splice(index, 1);\n this.pointerIds .splice(index, 1);\n this.downTargets.splice(index, 1);\n this.downTimes .splice(index, 1);\n }\n\n _updateEventTargets (target, currentTarget) {\n this._eventTarget = target;\n this._curEventTarget = currentTarget;\n }\n}\n\nfor (let i = 0, len = methodNames.length; i < len; i++) {\n const method = methodNames[i];\n\n listeners[method] = doOnInteractions(method);\n}\n\nfunction doOnInteractions (method) {\n return (function (event) {\n const [eventTarget, curEventTarget] = utils.getEventTargets(event);\n const matches = []; // [ [pointer, interaction], ...]\n\n if (browser.supportsTouch && /touch/.test(event.type)) {\n prevTouchTime = new Date().getTime();\n\n for (let i = 0; i < event.changedTouches.length; i++) {\n const pointer = event.changedTouches[i];\n const interaction = finder.search(pointer, event.type, eventTarget);\n\n matches.push([pointer, interaction || new Interaction()]);\n }\n }\n else {\n let invalidPointer = false;\n\n if (!browser.supportsPointerEvent && /mouse/.test(event.type)) {\n // ignore mouse events while touch interactions are active\n for (let i = 0; i < scope.interactions.length && !invalidPointer; i++) {\n invalidPointer = !scope.interactions[i].mouse && scope.interactions[i].pointerIsDown;\n }\n\n // try to ignore mouse events that are simulated by the browser\n // after a touch event\n invalidPointer = invalidPointer\n || (new Date().getTime() - prevTouchTime < 500)\n // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated\n || event.timeStamp === 0;\n }\n\n if (!invalidPointer) {\n let interaction = finder.search(event, event.type, eventTarget);\n\n if (!interaction) {\n\n interaction = new Interaction();\n interaction.mouse = (/mouse/i.test(event.pointerType || event.type)\n // MSPointerEvent.MSPOINTER_TYPE_MOUSE\n || event.pointerType === 4\n || !event.pointerType);\n }\n\n matches.push([event, interaction]);\n }\n }\n\n for (const [pointer, interaction] of matches) {\n interaction._updateEventTargets(eventTarget, curEventTarget);\n interaction[method](pointer, event, eventTarget, curEventTarget);\n }\n });\n}\n\nfunction endAll (event) {\n for (let i = 0; i < scope.interactions.length; i++) {\n const interaction = scope.interactions[i];\n\n interaction.end(event);\n signals.fire('endall', { event, interaction });\n }\n}\n\nconst docEvents = { /* 'eventType': listenerFunc */ };\nconst pEventTypes = browser.pEventTypes;\n\nif (scope.PointerEvent) {\n docEvents[pEventTypes.down ] = listeners.pointerDown;\n docEvents[pEventTypes.move ] = listeners.pointerMove;\n docEvents[pEventTypes.up ] = listeners.pointerUp;\n docEvents[pEventTypes.cancel] = listeners.pointerUp;\n}\nelse {\n docEvents.mousedown = listeners.pointerDown;\n docEvents.mousemove = listeners.pointerMove;\n docEvents.mouseup = listeners.pointerUp;\n\n docEvents.touchstart = listeners.pointerDown;\n docEvents.touchmove = listeners.pointerMove;\n docEvents.touchend = listeners.pointerUp;\n docEvents.touchcancel = listeners.pointerUp;\n}\n\ndocEvents.blur = endAll;\n\nfunction onDocSignal ({ doc }, signalName) {\n const eventMethod = signalName.indexOf('add') === 0\n ? events.add : events.remove;\n\n // delegate event listener\n for (const eventType in scope.delegatedEvents) {\n eventMethod(doc, eventType, events.delegateListener);\n eventMethod(doc, eventType, events.delegateUseCapture, true);\n }\n\n for (const eventType in docEvents) {\n eventMethod(doc, eventType, docEvents[eventType]);\n }\n}\n\nsignals.on('update-pointer-down', ({ interaction, pointer, pointerId, pointerIndex, event, eventTarget, down }) => {\n interaction.pointerIds[pointerIndex] = pointerId;\n interaction.pointers[pointerIndex] = pointer;\n\n if (down) {\n interaction.pointerIsDown = true;\n }\n\n if (!interaction.interacting()) {\n utils.setCoords(interaction.startCoords, interaction.pointers);\n\n utils.copyCoords(interaction.curCoords , interaction.startCoords);\n utils.copyCoords(interaction.prevCoords, interaction.startCoords);\n\n interaction.downEvent = event;\n interaction.downTimes[pointerIndex] = interaction.curCoords.timeStamp;\n interaction.downTargets[pointerIndex] = eventTarget || event && utils.getEventTargets(event)[0];\n interaction.pointerWasMoved = false;\n\n utils.pointerExtend(interaction.downPointer, pointer);\n }\n});\n\nscope.signals.on('add-document' , onDocSignal);\nscope.signals.on('remove-document', onDocSignal);\n\nInteraction.pointerMoveTolerance = 1;\nInteraction.doOnInteractions = doOnInteractions;\nInteraction.endAll = endAll;\nInteraction.signals = signals;\nInteraction.docEvents = docEvents;\n\nscope.endAllInteractions = endAll;\n\nmodule.exports = Interaction;\n","const Interaction = require('../Interaction');\nconst InteractEvent = require('../InteractEvent');\n\nconst actions = {\n firePrepared,\n names: [],\n methodDict: {},\n};\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n interaction._interacting = true;\n firePrepared(interaction, event, 'start');\n});\n\nInteraction.signals.on('action-move', function ({ interaction, event, preEnd }) {\n firePrepared(interaction, event, 'move', preEnd);\n\n // if the action was ended in a listener\n if (!interaction.interacting()) { return false; }\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n firePrepared(interaction, event, 'end');\n});\n\nfunction firePrepared (interaction, event, phase, preEnd) {\n const actionName = interaction.prepared.name;\n\n const newEvent = new InteractEvent(interaction, event, actionName, phase, interaction.element, null, preEnd);\n\n interaction.target.fire(newEvent);\n interaction.prevEvent = newEvent;\n}\n\nmodule.exports = actions;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drag = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n startAxis : 'xy',\n lockAxis : 'xy',\n },\n\n checker: function (pointer, event, interactable) {\n const dragOptions = interactable.options.drag;\n\n return dragOptions.enabled\n ? { name: 'drag', axis: (dragOptions.lockAxis === 'start'\n ? dragOptions.startAxis\n : dragOptions.lockAxis)}\n : null;\n },\n\n getCursor: function () {\n return 'move';\n },\n};\n\nInteraction.signals.on('before-action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n interaction.curCoords.page.y = interaction.startCoords.page.y;\n interaction.curCoords.client.y = interaction.startCoords.client.y;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vx);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vx);\n interaction.pointerDelta.client.vy = 0;\n interaction.pointerDelta.page.vy = 0;\n }\n else if (axis === 'y') {\n interaction.curCoords.page.x = interaction.startCoords.page.x;\n interaction.curCoords.client.x = interaction.startCoords.client.x;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vy);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vy);\n interaction.pointerDelta.client.vx = 0;\n interaction.pointerDelta.page.vx = 0;\n }\n});\n\n// dragmove\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'dragmove') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n iEvent.pageY = interaction.startCoords.page.y;\n iEvent.clientY = interaction.startCoords.client.y;\n iEvent.dy = 0;\n }\n else if (axis === 'y') {\n iEvent.pageX = interaction.startCoords.page.x;\n iEvent.clientX = interaction.startCoords.client.x;\n iEvent.dx = 0;\n }\n});\n\n/*\\\n * Interactable.draggable\n [ method ]\n *\n * Gets or sets whether drag actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of drag events\n | var isDraggable = interact('ul li').draggable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on drag events (object makes the Interactable draggable)\n = (object) This Interactable\n | interact(element).draggable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // the axis in which the first movement must be\n | // for the drag sequence to start\n | // 'xy' by default - any direction\n | startAxis: 'x' || 'y' || 'xy',\n |\n | // 'xy' by default - don't restrict to one axis (move in any direction)\n | // 'x' or 'y' to restrict movement to either axis\n | // 'start' to restrict movement to the axis the drag started in\n | lockAxis: 'x' || 'y' || 'xy' || 'start',\n |\n | // max number of drags that can happen concurrently\n | // with elements of this Interactable. Infinity by default\n | max: Infinity,\n |\n | // max number of drags that can target the same element+Interactable\n | // 1 by default\n | maxPerElement: 2\n | });\n\\*/\nInteractable.prototype.draggable = function (options) {\n if (utils.is.object(options)) {\n this.options.drag.enabled = options.enabled === false? false: true;\n this.setPerAction('drag', options);\n this.setOnEvents('drag', options);\n\n if (/^(xy|x|y|start)$/.test(options.lockAxis)) {\n this.options.drag.lockAxis = options.lockAxis;\n }\n if (/^(xy|x|y)$/.test(options.startAxis)) {\n this.options.drag.startAxis = options.startAxis;\n }\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drag.enabled = options;\n\n if (!options) {\n this.ondragstart = this.ondragstart = this.ondragend = null;\n }\n\n return this;\n }\n\n return this.options.drag;\n};\n\nactions.drag = drag;\nactions.names.push('drag');\nutils.merge(Interactable.eventTypes, [\n 'dragstart',\n 'dragmove',\n 'draginertiastart',\n 'draginertiaresume',\n 'dragend',\n]);\nactions.methodDict.drag = 'draggable';\n\ndefaultOptions.drag = drag.defaults;\n\nmodule.exports = drag;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst scope = require('../scope');\nconst interact = require('../interact');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drop = {\n defaults: {\n enabled: false,\n accept : null,\n overlap: 'pointer',\n },\n};\n\nlet dynamicDrop = false;\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // reset active dropzones\n interaction.activeDrops.dropzones = [];\n interaction.activeDrops.elements = [];\n interaction.activeDrops.rects = [];\n\n interaction.dropEvents = null;\n\n if (!interaction.dynamicDrop) {\n setActiveDrops(interaction, interaction.element);\n }\n\n const dragEvent = interaction.prevEvent;\n const dropEvents = getDropEvents(interaction, event, dragEvent);\n\n if (dropEvents.activate) {\n fireActiveDrops(interaction, dropEvents.activate);\n }\n});\n\nInteractEvent.signals.on('new', function ({ interaction, iEvent, event }) {\n if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { return; }\n\n const draggableElement = interaction.element;\n const dragEvent = iEvent;\n const dropResult = getDrop(dragEvent, event, draggableElement);\n\n interaction.dropTarget = dropResult.dropzone;\n interaction.dropElement = dropResult.element;\n\n interaction.dropEvents = getDropEvents(interaction, event, dragEvent);\n});\n\nInteraction.signals.on('action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n fireDropEvents(interaction, interaction.dropEvents);\n});\n\nInteraction.signals.on('action-end', function ({ interaction }) {\n if (interaction.prepared.name === 'drag') {\n fireDropEvents(interaction, interaction.dropEvents);\n }\n});\n\nInteraction.signals.on('stop-drag', function ({ interaction }) {\n interaction.activeDrops.dropzones =\n interaction.activeDrops.elements =\n interaction.activeDrops.rects =\n interaction.dropEvents = null;\n});\n\nfunction collectDrops (interaction, element) {\n const drops = [];\n const elements = [];\n\n element = element || interaction.element;\n\n // collect all dropzones and their elements which qualify for a drop\n for (const current of scope.interactables) {\n if (!current.options.drop.enabled) { continue; }\n\n const accept = current.options.drop.accept;\n\n // test the draggable element against the dropzone's accept setting\n if ((utils.is.element(accept) && accept !== element)\n || (utils.is.string(accept)\n && !utils.matchesSelector(element, accept))) {\n\n continue;\n }\n\n // query for new elements if necessary\n const dropElements = utils.is.string(current.target)\n ? current._context.querySelectorAll(current.target)\n : [current.target];\n\n for (let i = 0; i < dropElements.length; i++) {\n const currentElement = dropElements[i];\n\n if (currentElement !== element) {\n drops.push(current);\n elements.push(currentElement);\n }\n }\n }\n\n return {\n elements,\n dropzones: drops,\n };\n}\n\nfunction fireActiveDrops (interaction, event) {\n let prevElement;\n\n // loop through all active dropzones and trigger event\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n const current = interaction.activeDrops.dropzones[i];\n const currentElement = interaction.activeDrops.elements [i];\n\n // prevent trigger of duplicate events on same element\n if (currentElement !== prevElement) {\n // set current element as event target\n event.target = currentElement;\n current.fire(event);\n }\n prevElement = currentElement;\n }\n}\n\n// Collect a new set of possible drops and save them in activeDrops.\n// setActiveDrops should always be called when a drag has just started or a\n// drag event happens while dynamicDrop is true\nfunction setActiveDrops (interaction, dragElement) {\n // get dropzones and their elements that could receive the draggable\n const possibleDrops = collectDrops(interaction, dragElement, true);\n\n interaction.activeDrops.dropzones = possibleDrops.dropzones;\n interaction.activeDrops.elements = possibleDrops.elements;\n interaction.activeDrops.rects = [];\n\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n interaction.activeDrops.rects[i] =\n interaction.activeDrops.dropzones[i].getRect(interaction.activeDrops.elements[i]);\n }\n}\n\nfunction getDrop (dragEvent, event, dragElement) {\n const interaction = dragEvent.interaction;\n const validDrops = [];\n\n if (dynamicDrop) {\n setActiveDrops(interaction, dragElement);\n }\n\n // collect all dropzones and their elements which qualify for a drop\n for (let j = 0; j < interaction.activeDrops.dropzones.length; j++) {\n const current = interaction.activeDrops.dropzones[j];\n const currentElement = interaction.activeDrops.elements [j];\n const rect = interaction.activeDrops.rects [j];\n\n validDrops.push(current.dropCheck(dragEvent, event, interaction.target, dragElement, currentElement, rect)\n ? currentElement\n : null);\n }\n\n // get the most appropriate dropzone based on DOM depth and order\n const dropIndex = utils.indexOfDeepestElement(validDrops);\n\n return {\n dropzone: interaction.activeDrops.dropzones[dropIndex] || null,\n element : interaction.activeDrops.elements [dropIndex] || null,\n };\n}\n\nfunction getDropEvents (interaction, pointerEvent, dragEvent) {\n const dropEvents = {\n enter : null,\n leave : null,\n activate : null,\n deactivate: null,\n move : null,\n drop : null,\n };\n\n const tmpl = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n };\n\n if (interaction.dropElement !== interaction.prevDropElement) {\n // if there was a prevDropTarget, create a dragleave event\n if (interaction.prevDropTarget) {\n dropEvents.leave = utils.extend({ type: 'dragleave' }, tmpl);\n\n dragEvent.dragLeave = dropEvents.leave.target = interaction.prevDropElement;\n dragEvent.prevDropzone = dropEvents.leave.dropzone = interaction.prevDropTarget;\n }\n // if the dropTarget is not null, create a dragenter event\n if (interaction.dropTarget) {\n dropEvents.enter = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n type : 'dragenter',\n };\n\n dragEvent.dragEnter = interaction.dropElement;\n dragEvent.dropzone = interaction.dropTarget;\n }\n }\n\n if (dragEvent.type === 'dragend' && interaction.dropTarget) {\n dropEvents.drop = utils.extend({ type: 'drop' }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n dragEvent.relatedTarget = interaction.dropElement;\n }\n if (dragEvent.type === 'dragstart') {\n dropEvents.activate = utils.extend({ type: 'dropactivate' }, tmpl);\n\n dropEvents.activate.target = null;\n dropEvents.activate.dropzone = null;\n }\n if (dragEvent.type === 'dragend') {\n dropEvents.deactivate = utils.extend({ type: 'dropdeactivate' }, tmpl);\n\n dropEvents.deactivate.target = null;\n dropEvents.deactivate.dropzone = null;\n }\n if (dragEvent.type === 'dragmove' && interaction.dropTarget) {\n dropEvents.move = utils.extend({\n dragmove : dragEvent,\n type : 'dropmove',\n }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n }\n\n return dropEvents;\n}\n\nfunction fireDropEvents (interaction, dropEvents) {\n if (dropEvents.leave) { interaction.prevDropTarget.fire(dropEvents.leave); }\n if (dropEvents.move ) { interaction.dropTarget.fire(dropEvents.move ); }\n if (dropEvents.enter) { interaction.dropTarget.fire(dropEvents.enter); }\n if (dropEvents.drop ) { interaction.dropTarget.fire(dropEvents.drop ); }\n if (dropEvents.deactivate) {\n fireActiveDrops(interaction, dropEvents.deactivate);\n }\n\n interaction.prevDropTarget = interaction.dropTarget;\n interaction.prevDropElement = interaction.dropElement;\n}\n\n/*\\\n * Interactable.dropzone\n [ method ]\n *\n * Returns or sets whether elements can be dropped onto this\n * Interactable to trigger drop events\n *\n * Dropzones can receive the following events:\n * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends\n * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone\n * - `dragmove` when a draggable that has entered the dropzone is moved\n * - `drop` when a draggable is dropped into this dropzone\n *\n * Use the `accept` option to allow only elements that match the given CSS\n * selector or element. The value can be:\n *\n * - **an Element** - only that element can be dropped into this dropzone.\n * - **a string**, - the element being dragged must match it as a CSS selector.\n * - **`null`** - accept options is cleared - it accepts any element.\n *\n * Use the `overlap` option to set how drops are checked for. The allowed\n * values are:\n *\n * - `'pointer'`, the pointer must be over the dropzone (default)\n * - `'center'`, the draggable element's center must be over the dropzone\n * - a number from 0-1 which is the `(intersection area) / (draggable area)`.\n * e.g. `0.5` for drop to happen when half of the area of the draggable is\n * over the dropzone\n *\n * Use the `checker` option to specify a function to check if a dragged\n * element is over this Interactable.\n *\n | interact(target)\n | .dropChecker(function(dragEvent, // related dragmove or dragend event\n | event, // TouchEvent/PointerEvent/MouseEvent\n | dropped, // bool result of the default checker\n | dropzone, // dropzone Interactable\n | dropElement, // dropzone elemnt\n | draggable, // draggable Interactable\n | draggableElement) {// draggable element\n |\n | return dropped && event.target.hasAttribute('allow-drop');\n | }\n *\n *\n - options (boolean | object | null) #optional The new value to be set.\n | interact('.drop').dropzone({\n | accept: '.can-drop' || document.getElementById('single-drop'),\n | overlap: 'pointer' || 'center' || zeroToOne\n | }\n = (boolean | object) The current setting or this Interactable\n\\*/\nInteractable.prototype.dropzone = function (options) {\n if (utils.is.object(options)) {\n this.options.drop.enabled = options.enabled === false? false: true;\n\n if (utils.is.function(options.ondrop) ) { this.events.ondrop = options.ondrop ; }\n if (utils.is.function(options.ondropactivate) ) { this.events.ondropactivate = options.ondropactivate ; }\n if (utils.is.function(options.ondropdeactivate)) { this.events.ondropdeactivate = options.ondropdeactivate; }\n if (utils.is.function(options.ondragenter) ) { this.events.ondragenter = options.ondragenter ; }\n if (utils.is.function(options.ondragleave) ) { this.events.ondragleave = options.ondragleave ; }\n if (utils.is.function(options.ondropmove) ) { this.events.ondropmove = options.ondropmove ; }\n\n if (/^(pointer|center)$/.test(options.overlap)) {\n this.options.drop.overlap = options.overlap;\n }\n else if (utils.is.number(options.overlap)) {\n this.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0);\n }\n if ('accept' in options) {\n this.options.drop.accept = options.accept;\n }\n if ('checker' in options) {\n this.options.drop.checker = options.checker;\n }\n\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drop.enabled = options;\n\n if (!options) {\n this.ondragenter = this.ondragleave = this.ondrop\n = this.ondropactivate = this.ondropdeactivate = null;\n }\n\n return this;\n }\n\n return this.options.drop;\n};\n\nInteractable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) {\n let dropped = false;\n\n // if the dropzone has no rect (eg. display: none)\n // call the custom dropChecker or just return false\n if (!(rect = rect || this.getRect(dropElement))) {\n return (this.options.drop.checker\n ? this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement)\n : false);\n }\n\n const dropOverlap = this.options.drop.overlap;\n\n if (dropOverlap === 'pointer') {\n const origin = utils.getOriginXY(draggable, draggableElement, 'drag');\n const page = utils.getPageXY(dragEvent);\n\n page.x += origin.x;\n page.y += origin.y;\n\n const horizontal = (page.x > rect.left) && (page.x < rect.right);\n const vertical = (page.y > rect.top ) && (page.y < rect.bottom);\n\n dropped = horizontal && vertical;\n }\n\n const dragRect = draggable.getRect(draggableElement);\n\n if (dragRect && dropOverlap === 'center') {\n const cx = dragRect.left + dragRect.width / 2;\n const cy = dragRect.top + dragRect.height / 2;\n\n dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom;\n }\n\n if (dragRect && utils.is.number(dropOverlap)) {\n const overlapArea = (Math.max(0, Math.min(rect.right , dragRect.right ) - Math.max(rect.left, dragRect.left))\n * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top , dragRect.top )));\n\n const overlapRatio = overlapArea / (dragRect.width * dragRect.height);\n\n dropped = overlapRatio >= dropOverlap;\n }\n\n if (this.options.drop.checker) {\n dropped = this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement);\n }\n\n return dropped;\n};\n\nInteractable.signals.on('unset', function ({ interactable }) {\n interactable.dropzone(false);\n});\n\nInteractable.settingsMethods.push('dropChecker');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.dropTarget = null; // the dropzone a drag target might be dropped into\n interaction.dropElement = null; // the element at the time of checking\n interaction.prevDropTarget = null; // the dropzone that was recently dragged away from\n interaction.prevDropElement = null; // the element at the time of checking\n interaction.dropEvents = null; // the dropEvents related to the current drag event\n\n interaction.activeDrops = {\n dropzones: [], // the dropzones that are mentioned below\n elements : [], // elements of dropzones that accept the target draggable\n rects : [], // the rects of the elements mentioned above\n };\n\n});\n\nInteraction.signals.on('stop', function ({ interaction }) {\n interaction.dropTarget = interaction.dropElement =\n interaction.prevDropTarget = interaction.prevDropElement = null;\n});\n\n/*\\\n * interact.dynamicDrop\n [ method ]\n *\n * Returns or sets whether the dimensions of dropzone elements are\n * calculated on every dragmove or only on dragstart for the default\n * dropChecker\n *\n - newValue (boolean) #optional True to check on each move. False to check only before start\n = (boolean | interact) The current setting or interact\n\\*/\ninteract.dynamicDrop = function (newValue) {\n if (utils.is.bool(newValue)) {\n //if (dragging && dynamicDrop !== newValue && !newValue) {\n //calcRects(dropzones);\n //}\n\n dynamicDrop = newValue;\n\n return interact;\n }\n return dynamicDrop;\n};\n\nutils.merge(Interactable.eventTypes, [\n 'dragenter',\n 'dragleave',\n 'dropactivate',\n 'dropdeactivate',\n 'dropmove',\n 'drop',\n]);\nactions.methodDict.drop = 'dropzone';\n\ndefaultOptions.drop = drop.defaults;\n\nmodule.exports = drop;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst gesture = {\n defaults: {\n enabled : false,\n origin : null,\n restrict: null,\n },\n\n checker: function (pointer, event, interactable, element, interaction) {\n if (interaction.pointerIds.length >= 2) {\n return { name: 'gesture' };\n }\n\n return null;\n },\n\n getCursor: function () {\n return '';\n },\n};\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturestart') { return; }\n iEvent.ds = 0;\n\n interaction.gesture.startDistance = interaction.gesture.prevDistance = iEvent.distance;\n interaction.gesture.startAngle = interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.scale = 1;\n});\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturemove') { return; }\n\n iEvent.ds = iEvent.scale - interaction.gesture.scale;\n\n interaction.target.fire(iEvent);\n\n interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.prevDistance = iEvent.distance;\n\n if (iEvent.scale !== Infinity\n && iEvent.scale !== null\n && iEvent.scale !== undefined\n && !isNaN(iEvent.scale)) {\n\n interaction.gesture.scale = iEvent.scale;\n }\n});\n\n/*\\\n * Interactable.gesturable\n [ method ]\n *\n * Gets or sets whether multitouch gestures can be performed on the\n * Interactable's element\n *\n = (boolean) Indicates if this can be the target of gesture events\n | var isGestureable = interact(element).gesturable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on gesture events (makes the Interactable gesturable)\n = (object) this Interactable\n | interact(element).gesturable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // limit multiple gestures.\n | // See the explanation in @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n\\*/\nInteractable.prototype.gesturable = function (options) {\n if (utils.is.object(options)) {\n this.options.gesture.enabled = options.enabled === false? false: true;\n this.setPerAction('gesture', options);\n this.setOnEvents('gesture', options);\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.gesture.enabled = options;\n\n if (!options) {\n this.ongesturestart = this.ongesturestart = this.ongestureend = null;\n }\n\n return this;\n }\n\n return this.options.gesture;\n};\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action, event, starting, ending, deltaSource }) {\n if (action !== 'gesture') { return; }\n\n const pointers = interaction.pointers;\n\n iEvent.touches = [pointers[0], pointers[1]];\n\n if (starting) {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = 1;\n iEvent.ds = 0;\n iEvent.angle = utils.touchAngle(pointers, undefined, deltaSource);\n iEvent.da = 0;\n }\n else if (ending || event instanceof InteractEvent) {\n iEvent.distance = interaction.prevEvent.distance;\n iEvent.box = interaction.prevEvent.box;\n iEvent.scale = interaction.prevEvent.scale;\n iEvent.ds = iEvent.scale - 1;\n iEvent.angle = interaction.prevEvent.angle;\n iEvent.da = iEvent.angle - interaction.gesture.startAngle;\n }\n else {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = iEvent.distance / interaction.gesture.startDistance;\n iEvent.angle = utils.touchAngle(pointers, interaction.gesture.prevAngle, deltaSource);\n\n iEvent.ds = iEvent.scale - interaction.gesture.prevScale;\n iEvent.da = iEvent.angle - interaction.gesture.prevAngle;\n }\n});\n\nInteraction.signals.on('new', function (interaction) {\n interaction.gesture = {\n start: { x: 0, y: 0 },\n\n startDistance: 0, // distance between two touches of touchStart\n prevDistance : 0,\n distance : 0,\n\n scale: 1, // gesture.distance / gesture.startDistance\n\n startAngle: 0, // angle of line joining two touches\n prevAngle : 0, // angle of the previous gesture event\n };\n});\n\nactions.gesture = gesture;\nactions.names.push('gesture');\nutils.merge(Interactable.eventTypes, [\n 'gesturestart',\n 'gesturemove',\n 'gestureend',\n]);\nactions.methodDict.gesture = 'gesturable';\n\ndefaultOptions.gesture = gesture.defaults;\n\nmodule.exports = gesture;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\n// Less Precision with touch input\nconst defaultMargin = browser.supportsTouch || browser.supportsPointerEvent? 20: 10;\n\nconst resize = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n square: false,\n preserveAspectRatio: false,\n axis: 'xy',\n\n // use default margin\n margin: NaN,\n\n // object with props left, right, top, bottom which are\n // true/false values to resize when the pointer is over that edge,\n // CSS selectors to match the handles for each direction\n // or the Elements for each handle\n edges: null,\n\n // a value of 'none' will limit the resize rect to a minimum of 0x0\n // 'negate' will alow the rect to have negative width/height\n // 'reposition' will keep the width/height positive by swapping\n // the top and bottom edges and/or swapping the left and right edges\n invert: 'none',\n },\n\n checker: function (pointer, event, interactable, element, interaction, rect) {\n if (!rect) { return null; }\n\n const page = utils.extend({}, interaction.curCoords.page);\n const options = interactable.options;\n\n if (options.resize.enabled) {\n const resizeOptions = options.resize;\n const resizeEdges = { left: false, right: false, top: false, bottom: false };\n\n // if using resize.edges\n if (utils.is.object(resizeOptions.edges)) {\n for (const edge in resizeEdges) {\n resizeEdges[edge] = checkResizeEdge(edge,\n resizeOptions.edges[edge],\n page,\n interaction._eventTarget,\n element,\n rect,\n resizeOptions.margin || defaultMargin);\n }\n\n resizeEdges.left = resizeEdges.left && !resizeEdges.right;\n resizeEdges.top = resizeEdges.top && !resizeEdges.bottom;\n\n if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) {\n return {\n name: 'resize',\n edges: resizeEdges,\n };\n }\n }\n else {\n const right = options.resize.axis !== 'y' && page.x > (rect.right - defaultMargin);\n const bottom = options.resize.axis !== 'x' && page.y > (rect.bottom - defaultMargin);\n\n if (right || bottom) {\n return {\n name: 'resize',\n axes: (right? 'x' : '') + (bottom? 'y' : ''),\n };\n }\n }\n }\n\n return null;\n },\n\n cursors: (browser.isIe9OrOlder ? {\n x : 'e-resize',\n y : 's-resize',\n xy: 'se-resize',\n\n top : 'n-resize',\n left : 'w-resize',\n bottom : 's-resize',\n right : 'e-resize',\n topleft : 'se-resize',\n bottomright: 'se-resize',\n topright : 'ne-resize',\n bottomleft : 'ne-resize',\n } : {\n x : 'ew-resize',\n y : 'ns-resize',\n xy: 'nwse-resize',\n\n top : 'ns-resize',\n left : 'ew-resize',\n bottom : 'ns-resize',\n right : 'ew-resize',\n topleft : 'nwse-resize',\n bottomright: 'nwse-resize',\n topright : 'nesw-resize',\n bottomleft : 'nesw-resize',\n }),\n\n getCursor: function (action) {\n if (action.axis) {\n return resize.cursors[action.name + action.axis];\n }\n else if (action.edges) {\n let cursorKey = '';\n const edgeNames = ['top', 'bottom', 'left', 'right'];\n\n for (let i = 0; i < 4; i++) {\n if (action.edges[edgeNames[i]]) {\n cursorKey += edgeNames[i];\n }\n }\n\n return resize.cursors[cursorKey];\n }\n },\n};\n\n// resizestart\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'resizestart' || !interaction.prepared.edges) {\n return;\n }\n\n const startRect = interaction.target.getRect(interaction.element);\n const resizeOptions = interaction.target.options.resize;\n\n /*\n * When using the `resizable.square` or `resizable.preserveAspectRatio` options, resizing from one edge\n * will affect another. E.g. with `resizable.square`, resizing to make the right edge larger will make\n * the bottom edge larger by the same amount. We call these 'linked' edges. Any linked edges will depend\n * on the active edges and the edge being interacted with.\n */\n if (resizeOptions.square || resizeOptions.preserveAspectRatio) {\n const linkedEdges = utils.extend({}, interaction.prepared.edges);\n\n linkedEdges.top = linkedEdges.top || (linkedEdges.left && !linkedEdges.bottom);\n linkedEdges.left = linkedEdges.left || (linkedEdges.top && !linkedEdges.right );\n linkedEdges.bottom = linkedEdges.bottom || (linkedEdges.right && !linkedEdges.top );\n linkedEdges.right = linkedEdges.right || (linkedEdges.bottom && !linkedEdges.left );\n\n interaction.prepared._linkedEdges = linkedEdges;\n }\n else {\n interaction.prepared._linkedEdges = null;\n }\n\n // if using `resizable.preserveAspectRatio` option, record aspect ratio at the start of the resize\n if (resizeOptions.preserveAspectRatio) {\n interaction.resizeStartAspectRatio = startRect.width / startRect.height;\n }\n\n interaction.resizeRects = {\n start : startRect,\n current : utils.extend({}, startRect),\n inverted : utils.extend({}, startRect),\n previous : utils.extend({}, startRect),\n delta : {\n left: 0, right : 0, width : 0,\n top : 0, bottom: 0, height: 0,\n },\n };\n\n iEvent.rect = interaction.resizeRects.inverted;\n iEvent.deltaRect = interaction.resizeRects.delta;\n});\n\n// resizemove\nInteractEvent.signals.on('new', function ({ iEvent, phase, interaction }) {\n if (phase !== 'move' || !interaction.prepared.edges) { return; }\n\n const resizeOptions = interaction.target.options.resize;\n const invert = resizeOptions.invert;\n const invertible = invert === 'reposition' || invert === 'negate';\n\n let edges = interaction.prepared.edges;\n\n const start = interaction.resizeRects.start;\n const current = interaction.resizeRects.current;\n const inverted = interaction.resizeRects.inverted;\n const delta = interaction.resizeRects.delta;\n const previous = utils.extend(interaction.resizeRects.previous, inverted);\n const originalEdges = edges;\n\n let dx = iEvent.dx;\n let dy = iEvent.dy;\n\n if (resizeOptions.preserveAspectRatio || resizeOptions.square) {\n // `resize.preserveAspectRatio` takes precedence over `resize.square`\n const startAspectRatio = resizeOptions.preserveAspectRatio\n ? interaction.resizeStartAspectRatio\n : 1;\n\n edges = interaction.prepared._linkedEdges;\n\n if ((originalEdges.left && originalEdges.bottom)\n || (originalEdges.right && originalEdges.top)) {\n dy = -dx / startAspectRatio;\n }\n else if (originalEdges.left || originalEdges.right ) { dy = dx / startAspectRatio; }\n else if (originalEdges.top || originalEdges.bottom) { dx = dy * startAspectRatio; }\n }\n\n // update the 'current' rect without modifications\n if (edges.top ) { current.top += dy; }\n if (edges.bottom) { current.bottom += dy; }\n if (edges.left ) { current.left += dx; }\n if (edges.right ) { current.right += dx; }\n\n if (invertible) {\n // if invertible, copy the current rect\n utils.extend(inverted, current);\n\n if (invert === 'reposition') {\n // swap edge values if necessary to keep width/height positive\n let swap;\n\n if (inverted.top > inverted.bottom) {\n swap = inverted.top;\n\n inverted.top = inverted.bottom;\n inverted.bottom = swap;\n }\n if (inverted.left > inverted.right) {\n swap = inverted.left;\n\n inverted.left = inverted.right;\n inverted.right = swap;\n }\n }\n }\n else {\n // if not invertible, restrict to minimum of 0x0 rect\n inverted.top = Math.min(current.top, start.bottom);\n inverted.bottom = Math.max(current.bottom, start.top);\n inverted.left = Math.min(current.left, start.right);\n inverted.right = Math.max(current.right, start.left);\n }\n\n inverted.width = inverted.right - inverted.left;\n inverted.height = inverted.bottom - inverted.top ;\n\n for (const edge in inverted) {\n delta[edge] = inverted[edge] - previous[edge];\n }\n\n iEvent.edges = interaction.prepared.edges;\n iEvent.rect = inverted;\n iEvent.deltaRect = delta;\n});\n\n/*\\\n * Interactable.resizable\n [ method ]\n *\n * Gets or sets whether resize actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of resize elements\n | var isResizeable = interact('input[type=text]').resizable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on resize events (object makes the Interactable resizable)\n = (object) This Interactable\n | interact(element).resizable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | edges: {\n | top : true, // Use pointer coords to check for resize.\n | left : false, // Disable resizing from left edge.\n | bottom: '.resize-s',// Resize if pointer target matches selector\n | right : handleEl // Resize if pointer target is the given Element\n | },\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height are adjusted at a 1:1 ratio.\n | square: false,\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height maintain the aspect ratio they had when resizing started.\n | preserveAspectRatio: false,\n |\n | // a value of 'none' will limit the resize rect to a minimum of 0x0\n | // 'negate' will allow the rect to have negative width/height\n | // 'reposition' will keep the width/height positive by swapping\n | // the top and bottom edges and/or swapping the left and right edges\n | invert: 'none' || 'negate' || 'reposition'\n |\n | // limit multiple resizes.\n | // See the explanation in the @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n \\*/\nInteractable.prototype.resizable = function (options) {\n if (utils.is.object(options)) {\n this.options.resize.enabled = options.enabled === false? false: true;\n this.setPerAction('resize', options);\n this.setOnEvents('resize', options);\n\n if (/^x$|^y$|^xy$/.test(options.axis)) {\n this.options.resize.axis = options.axis;\n }\n else if (options.axis === null) {\n this.options.resize.axis = defaultOptions.resize.axis;\n }\n\n if (utils.is.bool(options.preserveAspectRatio)) {\n this.options.resize.preserveAspectRatio = options.preserveAspectRatio;\n }\n else if (utils.is.bool(options.square)) {\n this.options.resize.square = options.square;\n }\n\n return this;\n }\n if (utils.is.bool(options)) {\n this.options.resize.enabled = options;\n\n if (!options) {\n this.onresizestart = this.onresizestart = this.onresizeend = null;\n }\n\n return this;\n }\n return this.options.resize;\n};\n\nfunction checkResizeEdge (name, value, page, element, interactableElement, rect, margin) {\n // false, '', undefined, null\n if (!value) { return false; }\n\n // true value, use pointer coords and element rect\n if (value === true) {\n // if dimensions are negative, \"switch\" edges\n const width = utils.is.number(rect.width )? rect.width : rect.right - rect.left;\n const height = utils.is.number(rect.height)? rect.height : rect.bottom - rect.top ;\n\n if (width < 0) {\n if (name === 'left' ) { name = 'right'; }\n else if (name === 'right') { name = 'left' ; }\n }\n if (height < 0) {\n if (name === 'top' ) { name = 'bottom'; }\n else if (name === 'bottom') { name = 'top' ; }\n }\n\n if (name === 'left' ) { return page.x < ((width >= 0? rect.left: rect.right ) + margin); }\n if (name === 'top' ) { return page.y < ((height >= 0? rect.top : rect.bottom) + margin); }\n\n if (name === 'right' ) { return page.x > ((width >= 0? rect.right : rect.left) - margin); }\n if (name === 'bottom') { return page.y > ((height >= 0? rect.bottom: rect.top ) - margin); }\n }\n\n // the remaining checks require an element\n if (!utils.is.element(element)) { return false; }\n\n return utils.is.element(value)\n // the value is an element to use as a resize handle\n ? value === element\n // otherwise check if element matches value as selector\n : utils.matchesUpTo(element, value, interactableElement);\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.resizeAxes = 'xy';\n});\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action }) {\n if (action !== 'resize' || !interaction.resizeAxes) { return; }\n\n const options = interaction.target.options;\n\n if (options.resize.square) {\n if (interaction.resizeAxes === 'y') {\n iEvent.dx = iEvent.dy;\n }\n else {\n iEvent.dy = iEvent.dx;\n }\n iEvent.axes = 'xy';\n }\n else {\n iEvent.axes = interaction.resizeAxes;\n\n if (interaction.resizeAxes === 'x') {\n iEvent.dy = 0;\n }\n else if (interaction.resizeAxes === 'y') {\n iEvent.dx = 0;\n }\n }\n});\n\nactions.resize = resize;\nactions.names.push('resize');\nutils.merge(Interactable.eventTypes, [\n 'resizestart',\n 'resizemove',\n 'resizeinertiastart',\n 'resizeinertiaresume',\n 'resizeend',\n]);\nactions.methodDict.resize = 'resizable';\n\ndefaultOptions.resize = resize.defaults;\n\nmodule.exports = resize;\n","const raf = require('./utils/raf');\nconst getWindow = require('./utils/window').getWindow;\nconst is = require('./utils/is');\nconst domUtils = require('./utils/domUtils');\nconst Interaction = require('./Interaction');\nconst defaultOptions = require('./defaultOptions');\n\nconst autoScroll = {\n defaults: {\n enabled : false,\n container: null, // the item that is scrolled (Window or HTMLElement)\n margin : 60,\n speed : 300, // the scroll speed in pixels per second\n },\n\n interaction: null,\n i: null, // the handle returned by window.setInterval\n x: 0, y: 0, // Direction each pulse is to scroll in\n\n isScrolling: false,\n prevTime: 0,\n\n start: function (interaction) {\n autoScroll.isScrolling = true;\n raf.cancel(autoScroll.i);\n\n autoScroll.interaction = interaction;\n autoScroll.prevTime = new Date().getTime();\n autoScroll.i = raf.request(autoScroll.scroll);\n },\n\n stop: function () {\n autoScroll.isScrolling = false;\n raf.cancel(autoScroll.i);\n },\n\n // scroll the window by the values in scroll.x/y\n scroll: function () {\n const options = autoScroll.interaction.target.options[autoScroll.interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(autoScroll.interaction.element);\n const now = new Date().getTime();\n // change in time in seconds\n const dt = (now - autoScroll.prevTime) / 1000;\n // displacement\n const s = options.speed * dt;\n\n if (s >= 1) {\n if (is.window(container)) {\n container.scrollBy(autoScroll.x * s, autoScroll.y * s);\n }\n else if (container) {\n container.scrollLeft += autoScroll.x * s;\n container.scrollTop += autoScroll.y * s;\n }\n\n autoScroll.prevTime = now;\n }\n\n if (autoScroll.isScrolling) {\n raf.cancel(autoScroll.i);\n autoScroll.i = raf.request(autoScroll.scroll);\n }\n },\n check: function (interactable, actionName) {\n const options = interactable.options;\n\n return options[actionName].autoScroll && options[actionName].autoScroll.enabled;\n },\n onInteractionMove: function ({ interaction, pointer }) {\n if (!(interaction.interacting()\n && autoScroll.check(interaction.target, interaction.prepared.name))) {\n return;\n }\n\n if (interaction.simulation) {\n autoScroll.x = autoScroll.y = 0;\n return;\n }\n\n let top;\n let right;\n let bottom;\n let left;\n\n const options = interaction.target.options[interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(interaction.element);\n\n if (is.window(container)) {\n left = pointer.clientX < autoScroll.margin;\n top = pointer.clientY < autoScroll.margin;\n right = pointer.clientX > container.innerWidth - autoScroll.margin;\n bottom = pointer.clientY > container.innerHeight - autoScroll.margin;\n }\n else {\n const rect = domUtils.getElementClientRect(container);\n\n left = pointer.clientX < rect.left + autoScroll.margin;\n top = pointer.clientY < rect.top + autoScroll.margin;\n right = pointer.clientX > rect.right - autoScroll.margin;\n bottom = pointer.clientY > rect.bottom - autoScroll.margin;\n }\n\n autoScroll.x = (right ? 1: left? -1: 0);\n autoScroll.y = (bottom? 1: top? -1: 0);\n\n if (!autoScroll.isScrolling) {\n // set the autoScroll properties to those of the target\n autoScroll.margin = options.margin;\n autoScroll.speed = options.speed;\n\n autoScroll.start(interaction);\n }\n },\n};\n\nInteraction.signals.on('stop-active', function () {\n autoScroll.stop();\n});\n\nInteraction.signals.on('action-move', autoScroll.onInteractionMove);\n\ndefaultOptions.perAction.autoScroll = autoScroll.defaults;\n\nmodule.exports = autoScroll;\n","const Interactable = require('../Interactable');\nconst actions = require('../actions/base');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.ignoreFrom\n [ method ]\n *\n * If the target of the `mousedown`, `pointerdown` or `touchstart`\n * event or any of it's parents match the given CSS selector or\n * Element, no drag/resize/gesture is started.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to not ignore any elements\n = (string | Element | object) The current ignoreFrom value or this Interactable\n **\n | interact(element, { ignoreFrom: document.getElementById('no-action') });\n | // or\n | interact(element).ignoreFrom('input, textarea, a');\n\\*/\nInteractable.prototype.ignoreFrom = function (newValue) {\n return this._backCompatOption('ignoreFrom', newValue);\n};\n\n/*\\\n * Interactable.allowFrom\n [ method ]\n *\n * A drag/resize/gesture is started only If the target of the\n * `mousedown`, `pointerdown` or `touchstart` event or any of it's\n * parents match the given CSS selector or Element.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to allow from any element\n = (string | Element | object) The current allowFrom value or this Interactable\n **\n | interact(element, { allowFrom: document.getElementById('drag-handle') });\n | // or\n | interact(element).allowFrom('.handle');\n\\*/\nInteractable.prototype.allowFrom = function (newValue) {\n return this._backCompatOption('allowFrom', newValue);\n};\n\nInteractable.prototype.testIgnore = function (ignoreFrom, interactableElement, element) {\n if (!ignoreFrom || !is.element(element)) { return false; }\n\n if (is.string(ignoreFrom)) {\n return domUtils.matchesUpTo(element, ignoreFrom, interactableElement);\n }\n else if (is.element(ignoreFrom)) {\n return domUtils.nodeContains(ignoreFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testAllow = function (allowFrom, interactableElement, element) {\n if (!allowFrom) { return true; }\n\n if (!is.element(element)) { return false; }\n\n if (is.string(allowFrom)) {\n return domUtils.matchesUpTo(element, allowFrom, interactableElement);\n }\n else if (is.element(allowFrom)) {\n return domUtils.nodeContains(allowFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testIgnoreAllow = function (options, interactableElement, eventTarget) {\n return (!this.testIgnore(options.ignoreFrom, interactableElement, eventTarget)\n && this.testAllow(options.allowFrom, interactableElement, eventTarget));\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (event.buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\n","const interact = require('../interact');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst actions = require('../actions/base');\nconst defaultOptions = require('../defaultOptions');\nconst browser = require('../utils/browser');\nconst scope = require('../scope');\nconst utils = require('../utils');\nconst signals = require('../utils/Signals').new();\n\nrequire('./InteractableMethods');\n\nconst autoStart = {\n signals,\n withinInteractionLimit,\n // Allow this many interactions to happen simultaneously\n maxInteractions: Infinity,\n defaults: {\n perAction: {\n manualStart: false,\n max: Infinity,\n maxPerElement: 1,\n allowFrom: null,\n ignoreFrom: null,\n },\n },\n setActionDefaults: function (action) {\n utils.extend(action.defaults, autoStart.defaults.perAction);\n },\n};\n\n// set cursor style on mousedown\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget }) {\n if (interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\n// set cursor style on mousemove\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget }) {\n if (!interaction.mouse\n || interaction.pointerIsDown\n || interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\nInteraction.signals.on('move', function (arg) {\n const { interaction, event } = arg;\n\n if (!interaction.pointerIsDown\n || interaction.interacting()\n || !interaction.pointerWasMoved\n || !interaction.prepared.name) {\n return;\n }\n\n signals.fire('before-start', arg);\n\n const target = interaction.target;\n\n if (interaction.prepared.name && target) {\n // check manualStart and interaction limit\n if (target.options[interaction.prepared.name].manualStart\n || !withinInteractionLimit(target, interaction.element, interaction.prepared)) {\n interaction.stop(event);\n }\n else {\n interaction.start(interaction.prepared, target, interaction.element);\n }\n }\n});\n\n// Check if the current target supports the action.\n// If so, return the validated action. Otherwise, return null\nfunction validateAction (action, interactable, element, eventTarget) {\n if (utils.is.object(action)\n && interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget)\n && interactable.options[action.name].enabled\n && withinInteractionLimit(interactable, element, action)) {\n return action;\n }\n\n return null;\n}\n\nfunction validateSelector (interaction, pointer, event, matches, matchElements, eventTarget) {\n for (let i = 0, len = matches.length; i < len; i++) {\n const match = matches[i];\n const matchElement = matchElements[i];\n const action = validateAction(match.getAction(pointer, event, interaction, matchElement),\n match,\n matchElement,\n eventTarget);\n\n if (action) {\n return {\n action,\n target: match,\n element: matchElement,\n };\n }\n }\n\n return {};\n}\n\nfunction getActionInfo (interaction, pointer, event, eventTarget) {\n let matches = [];\n let matchElements = [];\n\n let element = eventTarget;\n let action = null;\n\n function pushMatches (interactable, selector, context) {\n const elements = (browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined);\n\n if (utils.matchesSelector(element, selector, elements)) {\n\n matches.push(interactable);\n matchElements.push(element);\n }\n }\n\n while (utils.is.element(element)) {\n matches = [];\n matchElements = [];\n\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && (action = validateAction(elementInteractable.getAction(pointer, event, interaction, element, eventTarget),\n elementInteractable,\n element,\n eventTarget))\n && !elementInteractable.options[action.name].manualStart) {\n return {\n element,\n action,\n target: elementInteractable,\n };\n }\n else {\n scope.interactables.forEachSelector(pushMatches, element);\n\n const actionInfo = validateSelector(interaction, pointer, event, matches, matchElements, eventTarget);\n\n if (actionInfo.action\n && !actionInfo.target.options[actionInfo.action.name].manualStart) {\n return actionInfo;\n }\n }\n\n element = utils.parentNode(element);\n }\n\n return {};\n}\n\nfunction prepare (interaction, { action, target, element }) {\n action = action || {};\n\n if (interaction.target && interaction.target.options.styleCursor) {\n interaction.target._doc.documentElement.style.cursor = '';\n }\n\n interaction.target = target;\n interaction.element = element;\n utils.copyAction(interaction.prepared, action);\n\n if (target && target.options.styleCursor) {\n const cursor = action? actions[action.name].getCursor(action) : '';\n interaction.target._doc.documentElement.style.cursor = cursor;\n }\n\n signals.fire('prepared', { interaction: interaction });\n}\n\nInteraction.signals.on('stop', function ({ interaction }) {\n const target = interaction.target;\n\n if (target && target.options.styleCursor) {\n target._doc.documentElement.style.cursor = '';\n }\n});\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (utils.is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (utils.is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n const buttons = event.buttons || ({\n 0: 1,\n 1: 4,\n 3: 8,\n 4: 16,\n })[event.button];\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\nfunction withinInteractionLimit (interactable, element, action) {\n const options = interactable.options;\n const maxActions = options[action.name].max;\n const maxPerElement = options[action.name].maxPerElement;\n let activeInteractions = 0;\n let targetCount = 0;\n let targetElementCount = 0;\n\n // no actions if any of these values == 0\n if (!(maxActions && maxPerElement && autoStart.maxInteractions)) { return; }\n\n for (let i = 0, len = scope.interactions.length; i < len; i++) {\n const interaction = scope.interactions[i];\n const otherAction = interaction.prepared.name;\n\n if (!interaction.interacting()) { continue; }\n\n activeInteractions++;\n\n if (activeInteractions >= autoStart.maxInteractions) {\n return false;\n }\n\n if (interaction.target !== interactable) { continue; }\n\n targetCount += (otherAction === action.name)|0;\n\n if (targetCount >= maxActions) {\n return false;\n }\n\n if (interaction.element === element) {\n targetElementCount++;\n\n if (otherAction !== action.name || targetElementCount >= maxPerElement) {\n return false;\n }\n }\n }\n\n return autoStart.maxInteractions > 0;\n}\n\n/*\\\n * interact.maxInteractions\n [ method ]\n **\n * Returns or sets the maximum number of concurrent interactions allowed.\n * By default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables\n * and elements, you need to enable it in the draggable, resizable and\n * gesturable `'max'` and `'maxPerElement'` options.\n **\n - newValue (number) #optional Any number. newValue <= 0 means no interactions.\n\\*/\ninteract.maxInteractions = function (newValue) {\n if (utils.is.number(newValue)) {\n autoStart.maxInteractions = newValue;\n\n return this;\n }\n\n return autoStart.maxInteractions;\n};\n\nInteractable.settingsMethods.push('styleCursor');\nInteractable.settingsMethods.push('actionChecker');\nInteractable.settingsMethods.push('ignoreFrom');\nInteractable.settingsMethods.push('allowFrom');\n\ndefaultOptions.base.actionChecker = null;\ndefaultOptions.base.styleCursor = true;\n\nutils.extend(defaultOptions.perAction, autoStart.defaults.perAction);\n\nmodule.exports = autoStart;\n","const autoStart = require('./base');\nconst Interaction = require('../Interaction');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.delayTimer = null;\n});\n\nautoStart.signals.on('prepared', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.delayTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.target, interaction.element);\n }, delay);\n }\n});\n\nInteraction.signals.on('move', function ({ interaction, duplicate }) {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.delayTimer);\n }\n});\n\n// prevent regular down->move autoStart\nautoStart.signals.on('before-start', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.prepared.name = null;\n }\n});\n","const autoStart = require('./base');\nconst scope = require('../scope');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\n\nconst { matchesSelector, parentNode } = require('../utils/domUtils');\n\nautoStart.setActionDefaults(require('../actions/drag'));\n\nautoStart.signals.on('before-start', function ({ interaction, eventTarget, dx, dy }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // check if a drag is in the correct axis\n const absX = Math.abs(dx);\n const absY = Math.abs(dy);\n const options = interaction.target.options.drag;\n const startAxis = options.startAxis;\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy');\n\n interaction.prepared.axis = options.lockAxis === 'start'\n ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n : options.lockAxis;\n\n // if the movement isn't in the startAxis of the interactable\n if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) {\n // cancel the prepared action\n interaction.prepared.name = null;\n\n // then try to get a drag from another ineractable\n\n if (!interaction.prepared.name) {\n\n let element = eventTarget;\n\n const getDraggable = function (interactable, selector, context) {\n const elements = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n if (interactable === interaction.target) { return; }\n\n if (!options.manualStart\n && !interactable.testIgnoreAllow(options, element, eventTarget)\n && matchesSelector(element, selector, elements)) {\n\n const action = interactable.getAction(interaction.downPointer,\n interaction.downEvent,\n interaction,\n element);\n\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, interactable)\n && autoStart.validateAction(action, interactable, element, eventTarget)) {\n\n return interactable;\n }\n }\n };\n\n let action = null;\n\n // check all interactables\n while (is.element(element)) {\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && elementInteractable !== interaction.target\n && !elementInteractable.options.drag.manualStart) {\n\n action = elementInteractable.getAction(interaction.downPointer, interaction.downEvent, interaction, element);\n }\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, elementInteractable)) {\n\n interaction.prepared.name = 'drag';\n interaction.target = elementInteractable;\n interaction.element = element;\n break;\n }\n\n const selectorInteractable = scope.interactables.forEachSelector(getDraggable, element);\n\n if (selectorInteractable) {\n interaction.prepared.name = 'drag';\n interaction.target = selectorInteractable;\n interaction.element = element;\n break;\n }\n\n element = parentNode(element);\n }\n }\n }\n});\n\nfunction checkStartAxis (startAxis, interactable) {\n if (!interactable) { return false; }\n\n const thisAxis = interactable.options.drag.startAxis;\n\n return (startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis);\n}\n","require('./base').setActionDefaults(require('../actions/gesture'));\n","require('./base').setActionDefaults(require('../actions/resize'));\n","module.exports = {\n base: {\n accept : null,\n preventDefault: 'auto',\n deltaSource : 'page',\n },\n\n perAction: {\n origin: { x: 0, y: 0 },\n\n // only allow left button by default\n // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n mouseButtons: 1,\n\n inertia: {\n enabled : false,\n resistance : 10, // the lambda in exponential decay\n minSpeed : 100, // target speed must be above this for inertia to start\n endSpeed : 10, // the speed at which inertia is slow enough to stop\n allowResume : true, // allow resuming an action in inertia phase\n smoothEndDuration: 300, // animate to snap/restrict endOnly if there's no inertia\n },\n },\n};\n","/* browser entry point */\n\n// Legacy browser support\nrequire('./legacyBrowsers');\n\n// inertia\nrequire('./inertia');\n\n// modifiers\nrequire('./modifiers/snap');\nrequire('./modifiers/restrict');\n\n// pointerEvents\nrequire('./pointerEvents/base');\nrequire('./pointerEvents/holdRepeat');\nrequire('./pointerEvents/interactableTargets');\n\n// delay\nrequire('./autoStart/delay');\n\n// actions\nrequire('./actions/gesture');\nrequire('./actions/resize');\nrequire('./actions/drag');\nrequire('./actions/drop');\n\n// load these modifiers after resize is loaded\nrequire('./modifiers/snapSize');\nrequire('./modifiers/restrictEdges');\nrequire('./modifiers/restrictSize');\n\n// autoStart actions\nrequire('./autoStart/gesture');\nrequire('./autoStart/resize');\nrequire('./autoStart/drag');\n\n// Interactable preventDefault setting\nrequire('./interactablePreventDefault.js');\n\n// autoScroll\nrequire('./autoScroll');\n\n// export interact\nmodule.exports = require('./interact');\n","const InteractEvent = require('./InteractEvent');\nconst Interaction = require('./Interaction');\nconst modifiers = require('./modifiers');\nconst utils = require('./utils');\nconst animationFrame = require('./utils/raf');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.inertiaStatus = {\n active : false,\n smoothEnd : false,\n allowResume: false,\n\n startEvent: null,\n upCoords : {},\n\n xe: 0, ye: 0,\n sx: 0, sy: 0,\n\n t0: 0,\n vx0: 0, vys: 0,\n duration: 0,\n\n lambda_v0: 0,\n one_ve_v0: 0,\n i : null,\n };\n\n interaction.boundInertiaFrame = () => inertiaFrame .apply(interaction);\n interaction.boundSmoothEndFrame = () => smoothEndFrame.apply(interaction);\n});\n\nInteraction.signals.on('down', function ({ interaction, event, pointer, eventTarget }) {\n const status = interaction.inertiaStatus;\n\n // Check if the down event hits the current inertia target\n if (status.active) {\n let element = eventTarget;\n\n // climb up the DOM tree from the event target\n while (utils.is.element(element)) {\n\n // if interaction element is the current inertia target element\n if (element === interaction.element) {\n // stop inertia\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n\n // update pointers to the down event's coordinates\n interaction.updatePointer(pointer);\n utils.setCoords(interaction.curCoords, interaction.pointers);\n\n // fire appropriate signals\n const signalArg = { interaction };\n Interaction.signals.fire('before-action-move', signalArg);\n Interaction.signals.fire('action-resume' , signalArg);\n\n // fire a reume event\n const resumeEvent = new InteractEvent(interaction,\n event,\n interaction.prepared.name,\n 'inertiaresume',\n interaction.element);\n\n interaction.target.fire(resumeEvent);\n interaction.prevEvent = resumeEvent;\n modifiers.resetStatuses(interaction.modifierStatuses);\n\n utils.copyCoords(interaction.prevCoords, interaction.curCoords);\n break;\n }\n\n element = utils.parentNode(element);\n }\n }\n});\n\nInteraction.signals.on('up', function ({ interaction, event }) {\n const status = interaction.inertiaStatus;\n\n if (!interaction.interacting() || status.active) { return; }\n\n const target = interaction.target;\n const options = target && target.options;\n const inertiaOptions = options && interaction.prepared.name && options[interaction.prepared.name].inertia;\n\n const now = new Date().getTime();\n const statuses = {};\n const page = utils.extend({}, interaction.curCoords.page);\n const pointerSpeed = interaction.pointerDelta.client.speed;\n\n let smoothEnd = false;\n let modifierResult;\n\n // check if inertia should be started\n const inertiaPossible = (inertiaOptions && inertiaOptions.enabled\n && interaction.prepared.name !== 'gesture'\n && event !== status.startEvent);\n\n const inertia = (inertiaPossible\n && (now - interaction.curCoords.timeStamp) < 50\n && pointerSpeed > inertiaOptions.minSpeed\n && pointerSpeed > inertiaOptions.endSpeed);\n\n const modifierArg = {\n interaction,\n pageCoords: page,\n statuses,\n preEnd: true,\n requireEndOnly: true,\n };\n\n // smoothEnd\n if (inertiaPossible && !inertia) {\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n if (modifierResult.shouldMove && modifierResult.locked) {\n smoothEnd = true;\n }\n }\n\n if (!(inertia || smoothEnd)) { return; }\n\n utils.copyCoords(status.upCoords, interaction.curCoords);\n\n interaction.pointers[0] = status.startEvent =\n new InteractEvent(interaction, event, interaction.prepared.name, 'inertiastart', interaction.element);\n\n status.t0 = now;\n\n status.active = true;\n status.allowResume = inertiaOptions.allowResume;\n interaction.simulation = status;\n\n target.fire(status.startEvent);\n\n if (inertia) {\n status.vx0 = interaction.pointerDelta.client.vx;\n status.vy0 = interaction.pointerDelta.client.vy;\n status.v0 = pointerSpeed;\n\n calcInertia(interaction, status);\n\n utils.extend(page, interaction.curCoords.page);\n\n page.x += status.xe;\n page.y += status.ye;\n\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n status.modifiedXe += modifierResult.dx;\n status.modifiedYe += modifierResult.dy;\n\n status.i = animationFrame.request(interaction.boundInertiaFrame);\n }\n else {\n status.smoothEnd = true;\n status.xe = modifierResult.dx;\n status.ye = modifierResult.dy;\n\n status.sx = status.sy = 0;\n\n status.i = animationFrame.request(interaction.boundSmoothEndFrame);\n }\n});\n\nInteraction.signals.on('stop-active', function ({ interaction }) {\n const status = interaction.inertiaStatus;\n\n if (status.active) {\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n }\n});\n\nfunction calcInertia (interaction, status) {\n const inertiaOptions = interaction.target.options[interaction.prepared.name].inertia;\n const lambda = inertiaOptions.resistance;\n const inertiaDur = -Math.log(inertiaOptions.endSpeed / status.v0) / lambda;\n\n status.x0 = interaction.prevEvent.pageX;\n status.y0 = interaction.prevEvent.pageY;\n status.t0 = status.startEvent.timeStamp / 1000;\n status.sx = status.sy = 0;\n\n status.modifiedXe = status.xe = (status.vx0 - inertiaDur) / lambda;\n status.modifiedYe = status.ye = (status.vy0 - inertiaDur) / lambda;\n status.te = inertiaDur;\n\n status.lambda_v0 = lambda / status.v0;\n status.one_ve_v0 = 1 - inertiaOptions.endSpeed / status.v0;\n}\n\nfunction inertiaFrame () {\n updateInertiaCoords(this);\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n\n const status = this.inertiaStatus;\n const options = this.target.options[this.prepared.name].inertia;\n const lambda = options.resistance;\n const t = new Date().getTime() / 1000 - status.t0;\n\n if (t < status.te) {\n\n const progress = 1 - (Math.exp(-lambda * t) - status.lambda_v0) / status.one_ve_v0;\n\n if (status.modifiedXe === status.xe && status.modifiedYe === status.ye) {\n status.sx = status.xe * progress;\n status.sy = status.ye * progress;\n }\n else {\n const quadPoint = utils.getQuadraticCurvePoint(0, 0,\n status.xe,\n status.ye,\n status.modifiedXe,\n status.modifiedYe,\n progress);\n\n status.sx = quadPoint.x;\n status.sy = quadPoint.y;\n }\n\n this.doMove();\n\n status.i = animationFrame.request(this.boundInertiaFrame);\n }\n else {\n status.sx = status.modifiedXe;\n status.sy = status.modifiedYe;\n\n this.doMove();\n this.end(status.startEvent);\n status.active = false;\n this.simulation = null;\n }\n\n utils.copyCoords(this.prevCoords, this.curCoords);\n}\n\nfunction smoothEndFrame () {\n updateInertiaCoords(this);\n\n const status = this.inertiaStatus;\n const t = new Date().getTime() - status.t0;\n const duration = this.target.options[this.prepared.name].inertia.smoothEndDuration;\n\n if (t < duration) {\n status.sx = utils.easeOutQuad(t, 0, status.xe, duration);\n status.sy = utils.easeOutQuad(t, 0, status.ye, duration);\n\n this.pointerMove(status.startEvent, status.startEvent);\n\n status.i = animationFrame.request(this.boundSmoothEndFrame);\n }\n else {\n status.sx = status.xe;\n status.sy = status.ye;\n\n this.pointerMove(status.startEvent, status.startEvent);\n this.end(status.startEvent);\n\n status.smoothEnd =\n status.active = false;\n this.simulation = null;\n }\n}\n\nfunction updateInertiaCoords (interaction) {\n const status = interaction.inertiaStatus;\n\n // return if inertia isn't running\n if (!status.active) { return; }\n\n const pageUp = status.upCoords.page;\n const clientUp = status.upCoords.client;\n\n utils.setCoords(interaction.curCoords, [ {\n pageX : pageUp.x + status.sx,\n pageY : pageUp.y + status.sy,\n clientX: clientUp.x + status.sx,\n clientY: clientUp.y + status.sy,\n } ]);\n}\n","const browser = require('./utils/browser');\nconst events = require('./utils/events');\nconst utils = require('./utils');\nconst scope = require('./scope');\nconst Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\n\nconst globalEvents = {};\n\n/*\\\n * interact\n [ method ]\n *\n * The methods of this variable can be used to set elements as\n * interactables and also to change various default settings.\n *\n * Calling it as a function and passing an element or a valid CSS selector\n * string returns an Interactable object which has various methods to\n * configure it.\n *\n - element (Element | string) The HTML or SVG Element to interact with or CSS selector\n = (object) An @Interactable\n *\n > Usage\n | interact('#draggable').draggable(true);\n |\n | var rectables = interact('rect');\n | rectables\n | .gesturable(true)\n | .on('gesturemove', function (event) {\n | // ...\n | });\n\\*/\nfunction interact (element, options) {\n let interactable = scope.interactables.get(element, options);\n\n if (!interactable) {\n interactable = new Interactable(element, options);\n interactable.events.global = globalEvents;\n }\n\n return interactable;\n}\n\n/*\\\n * interact.isSet\n [ method ]\n *\n * Check if an element has been set\n - element (Element) The Element being searched for\n = (boolean) Indicates if the element or CSS selector was previously passed to interact\n\\*/\ninteract.isSet = function (element, options) {\n return scope.interactables.indexOfElement(element, options && options.context) !== -1;\n};\n\n/*\\\n * interact.on\n [ method ]\n *\n * Adds a global listener for an InteractEvent or adds a DOM event to\n * `document`\n *\n - type (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) interact\n\\*/\ninteract.on = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.on(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.on(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n // if it is an InteractEvent type, add listener to globalEvents\n if (utils.contains(Interactable.eventTypes, type)) {\n // if this type of event was never bound\n if (!globalEvents[type]) {\n globalEvents[type] = [listener];\n }\n else {\n globalEvents[type].push(listener);\n }\n }\n // If non InteractEvent type, addEventListener to document\n else {\n events.add(scope.document, type, listener, { options });\n }\n\n return interact;\n};\n\n/*\\\n * interact.off\n [ method ]\n *\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n - type (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) interact\n \\*/\ninteract.off = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.off(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.off(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n if (!utils.contains(Interactable.eventTypes, type)) {\n events.remove(scope.document, type, listener, options);\n }\n else {\n let index;\n\n if (type in globalEvents\n && (index = utils.indexOf(globalEvents[type], listener)) !== -1) {\n globalEvents[type].splice(index, 1);\n }\n }\n\n return interact;\n};\n\n/*\\\n * interact.debug\n [ method ]\n *\n * Returns an object which exposes internal data\n = (object) An object with properties that outline the current state and expose internal functions and variables\n\\*/\ninteract.debug = function () {\n return scope;\n};\n\n// expose the functions used to calculate multi-touch properties\ninteract.getPointerAverage = utils.pointerAverage;\ninteract.getTouchBBox = utils.touchBBox;\ninteract.getTouchDistance = utils.touchDistance;\ninteract.getTouchAngle = utils.touchAngle;\n\ninteract.getElementRect = utils.getElementRect;\ninteract.getElementClientRect = utils.getElementClientRect;\ninteract.matchesSelector = utils.matchesSelector;\ninteract.closest = utils.closest;\n\n/*\\\n * interact.supportsTouch\n [ method ]\n *\n = (boolean) Whether or not the browser supports touch input\n\\*/\ninteract.supportsTouch = function () {\n return browser.supportsTouch;\n};\n\n/*\\\n * interact.supportsPointerEvent\n [ method ]\n *\n = (boolean) Whether or not the browser supports PointerEvents\n\\*/\ninteract.supportsPointerEvent = function () {\n return browser.supportsPointerEvent;\n};\n\n/*\\\n * interact.stop\n [ method ]\n *\n * Cancels all interactions (end events are not fired)\n *\n - event (Event) An event on which to call preventDefault()\n = (object) interact\n\\*/\ninteract.stop = function (event) {\n for (let i = scope.interactions.length - 1; i >= 0; i--) {\n scope.interactions[i].stop(event);\n }\n\n return interact;\n};\n\n/*\\\n * interact.pointerMoveTolerance\n [ method ]\n * Returns or sets the distance the pointer must be moved before an action\n * sequence occurs. This also affects tolerance for tap events.\n *\n - newValue (number) #optional The movement from the start position must be greater than this value\n = (number | Interactable) The current setting or interact\n\\*/\ninteract.pointerMoveTolerance = function (newValue) {\n if (utils.is.number(newValue)) {\n Interaction.pointerMoveTolerance = newValue;\n\n return this;\n }\n\n return Interaction.pointerMoveTolerance;\n};\n\ninteract.addDocument = scope.addDocument;\ninteract.removeDocument = scope.removeDocument;\n\nscope.interact = interact;\n\nmodule.exports = interact;\n","const Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\nconst scope = require('./scope');\nconst is = require('./utils/is');\nconst events = require('./utils/events');\n\nconst { nodeContains, matchesSelector } = require('./utils/domUtils');\n\n/*\\\n * Interactable.preventDefault\n [ method ]\n *\n * Returns or sets whether to prevent the browser's default behaviour\n * in response to pointer events. Can be set to:\n * - `'always'` to always prevent\n * - `'never'` to never prevent\n * - `'auto'` to let interact.js try to determine what would be best\n *\n - newValue (string) #optional `true`, `false` or `'auto'`\n = (string | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.preventDefault = function (newValue) {\n if (/^(always|never|auto)$/.test(newValue)) {\n this.options.preventDefault = newValue;\n return this;\n }\n\n if (is.bool(newValue)) {\n this.options.preventDefault = newValue? 'always' : 'never';\n return this;\n }\n\n return this.options.preventDefault;\n};\n\nInteractable.prototype.checkAndPreventDefault = function (event) {\n const setting = this.options.preventDefault;\n\n if (setting === 'never') { return; }\n\n if (setting === 'always') {\n event.preventDefault();\n return;\n }\n\n // setting === 'auto'\n\n // don't preventDefault if the browser supports passiveEvents\n // CSS touch-action and user-selecct should be used instead\n if (events.supportsOptions) {\n return;\n }\n\n // don't preventDefault of pointerdown events\n if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) {\n return;\n }\n\n // don't preventDefault on editable elements\n if (is.element(event.target)\n && matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) {\n return;\n }\n\n event.preventDefault();\n};\n\nfunction onInteractionEvent ({ interaction, event }) {\n if (interaction.target) {\n interaction.target.checkAndPreventDefault(event);\n }\n}\n\nfor (const eventSignal of ['down', 'move', 'up', 'cancel']) {\n Interaction.signals.on(eventSignal, onInteractionEvent);\n}\n\n// prevent native HTML5 drag on interact.js target elements\nInteraction.docEvents.dragstart = function preventNativeDrag (event) {\n for (const interaction of scope.interactions) {\n\n if (interaction.element\n && (interaction.element === event.target\n || nodeContains(interaction.element, event.target))) {\n\n interaction.target.checkAndPreventDefault(event);\n return;\n }\n }\n};\n","const scope = require('./scope');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst iFinder = require('./utils/interactionFinder');\nconst pointerEvents = require('./pointerEvents/base');\n\nconst { window } = require('./utils/window');\n\nconst toString = Object.prototype.toString;\n\nif (!window.Array.isArray) {\n window.Array.isArray = function (obj) {\n return toString.call(obj) === '[object Array]';\n };\n}\n\nif (!String.prototype.trim) {\n String.prototype.trim = function () {\n return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n };\n}\n\n// http://www.quirksmode.org/dom/events/click.html\n// >Events leading to dblclick\n//\n// IE8 doesn't fire down event before dblclick.\n// This workaround tries to fire a tap and doubletap after dblclick\nfunction onIE8Dblclick (event) {\n const eventTarget = event.target;\n const interaction = iFinder.search(event, event.type, eventTarget);\n\n if (!interaction) { return; }\n\n if (interaction.prevTap\n && event.clientX === interaction.prevTap.clientX\n && event.clientY === interaction.prevTap.clientY\n && eventTarget === interaction.prevTap.target) {\n\n interaction.downTargets[0] = eventTarget;\n interaction.downTimes [0] = new Date().getTime();\n\n pointerEvents.fire({\n interaction,\n event,\n eventTarget,\n pointer: event,\n type: 'tap',\n });\n }\n}\n\nif (browser.isIE8) {\n const selectFix = function (event) {\n for (const interaction of scope.interactions) {\n if (interaction.interacting()) {\n interaction.target.checkAndPreventDefault(event);\n }\n }\n };\n\n const onDocIE8 = function onDocIE8 ({ doc, win }, signalName) {\n const eventMethod = signalName.indexOf('listen') === 0\n ? events.add : events.remove;\n\n // For IE's lack of Event#preventDefault\n eventMethod(doc, 'selectstart', selectFix);\n\n if (pointerEvents) {\n eventMethod(doc, 'dblclick', onIE8Dblclick);\n }\n };\n\n scope.signals.on('add-document' , onDocIE8);\n scope.signals.on('remove-document', onDocIE8);\n}\n\nmodule.exports = null;\n","const InteractEvent = require('../InteractEvent');\nconst Interaction = require('../Interaction');\nconst extend = require('../utils/extend');\n\nconst modifiers = {\n names: [],\n\n setOffsets: function (arg) {\n const { interaction, pageCoords: page } = arg;\n const { target, element, startOffset } = interaction;\n const rect = target.getRect(element);\n\n if (rect) {\n startOffset.left = page.x - rect.left;\n startOffset.top = page.y - rect.top;\n\n startOffset.right = rect.right - page.x;\n startOffset.bottom = rect.bottom - page.y;\n\n if (!('width' in rect)) { rect.width = rect.right - rect.left; }\n if (!('height' in rect)) { rect.height = rect.bottom - rect.top ; }\n }\n else {\n startOffset.left = startOffset.top = startOffset.right = startOffset.bottom = 0;\n }\n\n arg.rect = rect;\n arg.interactable = target;\n arg.element = element;\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n\n arg.options = target.options[interaction.prepared.name][modifierName];\n\n if (!arg.options) {\n continue;\n }\n\n interaction.modifierOffsets[modifierName] = modifiers[modifierName].setOffset(arg);\n }\n },\n\n setAll: function (arg) {\n const { interaction, statuses, preEnd, requireEndOnly } = arg;\n const coords = extend({}, arg.pageCoords);\n const result = {\n dx: 0,\n dy: 0,\n changed: false,\n locked: false,\n shouldMove: true,\n };\n\n for (const modifierName of modifiers.names) {\n const modifier = modifiers[modifierName];\n const options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!shouldDo(options, preEnd, requireEndOnly)) { continue; }\n\n arg.status = arg.status = statuses[modifierName];\n arg.options = options;\n arg.offset = arg.interaction.modifierOffsets[modifierName];\n\n modifier.set(arg);\n\n if (arg.status.locked) {\n coords.x += arg.status.dx;\n coords.y += arg.status.dy;\n\n result.dx += arg.status.dx;\n result.dy += arg.status.dy;\n\n result.locked = true;\n }\n }\n\n // a move should be fired if:\n // - there are no modifiers enabled,\n // - no modifiers are \"locked\" i.e. have changed the pointer's coordinates, or\n // - the locked coords have changed since the last pointer move\n result.shouldMove = !arg.status || !result.locked || arg.status.changed;\n\n return result;\n },\n\n resetStatuses: function (statuses) {\n for (const modifierName of modifiers.names) {\n const status = statuses[modifierName] || {};\n\n status.dx = status.dy = 0;\n status.modifiedX = status.modifiedY = NaN;\n status.locked = false;\n status.changed = true;\n\n statuses[modifierName] = status;\n }\n\n return statuses;\n },\n\n start: function ({ interaction }, signalName) {\n const arg = {\n interaction,\n pageCoords: (signalName === 'action-resume' ?\n interaction.curCoords : interaction.startCoords).page,\n startOffset: interaction.startOffset,\n statuses: interaction.modifierStatuses,\n preEnd: false,\n requireEndOnly: false,\n };\n\n modifiers.setOffsets(arg);\n modifiers.resetStatuses(arg.statuses);\n\n arg.pageCoords = extend({}, interaction.startCoords.page);\n interaction.modifierResult = modifiers.setAll(arg);\n },\n};\n\nInteraction.signals.on('new', function (interaction) {\n interaction.startOffset = { left: 0, right: 0, top: 0, bottom: 0 };\n interaction.modifierOffsets = {};\n interaction.modifierStatuses = modifiers.resetStatuses({});\n interaction.modifierResult = null;\n});\n\nInteraction.signals.on('action-start' , modifiers.start);\nInteraction.signals.on('action-resume', modifiers.start);\n\nInteraction.signals.on('before-action-move', function ({ interaction, preEnd, interactingBeforeMove }) {\n const modifierResult = modifiers.setAll({\n interaction,\n preEnd,\n pageCoords: interaction.curCoords.page,\n statuses: interaction.modifierStatuses,\n requireEndOnly: false,\n });\n\n // don't fire an action move if a modifier would keep the event in the same\n // cordinates as before\n if (!modifierResult.shouldMove && interactingBeforeMove) {\n interaction._dontFireMove = true;\n }\n\n interaction.modifierResult = modifierResult;\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n for (let i = 0; i < modifiers.names.length; i++) {\n const options = interaction.target.options[interaction.prepared.name][modifiers.names[i]];\n\n // if the endOnly option is true for any modifier\n if (shouldDo(options, true, true)) {\n // fire a move event at the modified coordinates\n interaction.doMove({ event, preEnd: true });\n break;\n }\n }\n});\n\nInteractEvent.signals.on('set-xy', function (arg) {\n const { iEvent, interaction } = arg;\n const modifierArg = extend({}, arg);\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n modifierArg.options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!modifierArg.options) {\n continue;\n }\n\n const modifier = modifiers[modifierName];\n\n modifierArg.status = interaction.modifierStatuses[modifierName];\n\n iEvent[modifierName] = modifier.modifyCoords(modifierArg);\n }\n});\n\nfunction shouldDo (options, preEnd, requireEndOnly) {\n return (options && options.enabled\n && (preEnd || !options.endOnly)\n && (!requireEndOnly || options.endOnly));\n}\n\nmodule.exports = modifiers;\n","const modifiers = require('./index');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst restrict = {\n defaults: {\n enabled : false,\n endOnly : false,\n restriction: null,\n elementRect: null,\n },\n\n setOffset: function ({ rect, startOffset, options }) {\n const elementRect = options && options.elementRect;\n const offset = {};\n\n if (rect && elementRect) {\n offset.left = startOffset.left - (rect.width * elementRect.left);\n offset.top = startOffset.top - (rect.height * elementRect.top);\n\n offset.right = startOffset.right - (rect.width * (1 - elementRect.right));\n offset.bottom = startOffset.bottom - (rect.height * (1 - elementRect.bottom));\n }\n else {\n offset.left = offset.top = offset.right = offset.bottom = 0;\n }\n\n return offset;\n },\n\n set: function ({ pageCoords, interaction, status, options }) {\n if (!options) { return status; }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n\n const restriction = getRestrictionRect(options.restriction, interaction, page);\n\n if (!restriction) { return status; }\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n const rect = restriction;\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n const offset = interaction.modifierOffsets.restrict;\n\n // object is assumed to have\n // x, y, width, height or\n // left, top, right, bottom\n if ('x' in restriction && 'y' in restriction) {\n modifiedX = Math.max(Math.min(rect.x + rect.width - offset.right , page.x), rect.x + offset.left);\n modifiedY = Math.max(Math.min(rect.y + rect.height - offset.bottom, page.y), rect.y + offset.top );\n }\n else {\n modifiedX = Math.max(Math.min(rect.right - offset.right , page.x), rect.left + offset.left);\n modifiedY = Math.max(Math.min(rect.bottom - offset.bottom, page.y), rect.top + offset.top );\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const elementRect = options && options.elementRect;\n\n if (options && options.enabled\n && !(phase === 'start' && elementRect && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n getRestrictionRect,\n};\n\nfunction getRestrictionRect (value, interaction, page) {\n if (utils.is.function(value)) {\n return utils.resolveRectLike(value, interaction.target, interaction.element, [page.x, page.y, interaction]);\n } else {\n return utils.resolveRectLike(value, interaction.target, interaction.element);\n }\n}\n\nmodifiers.restrict = restrict;\nmodifiers.names.push('restrict');\n\ndefaultOptions.perAction.restrict = restrict.defaults;\n\nmodule.exports = restrict;\n","// This module adds the options.resize.restrictEdges setting which sets min and\n// max for the top, left, bottom and right edges of the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictEdges: {\n// inner: { top: 200, left: 200, right: 400, bottom: 400 },\n// outer: { top: 0, left: 0, right: 600, bottom: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst { getRestrictionRect } = require('./restrict');\n\nconst noInner = { top: +Infinity, left: +Infinity, bottom: -Infinity, right: -Infinity };\nconst noOuter = { top: -Infinity, left: -Infinity, bottom: +Infinity, right: +Infinity };\n\nconst restrictEdges = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n offset: null,\n },\n\n setOffset: function ({ interaction, startOffset, options }) {\n if (!options) {\n return utils.extend({}, startOffset);\n }\n\n const offset = getRestrictionRect(options.offset, interaction, interaction.startCoords.page);\n\n if (offset) {\n return {\n top: startOffset.top + offset.y,\n left: startOffset.left + offset.x,\n bottom: startOffset.bottom + offset.y,\n right: startOffset.right + offset.x,\n };\n }\n\n return startOffset;\n },\n\n set: function ({ pageCoords, interaction, status, offset, options }) {\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n const inner = rectUtils.xywhToTlbr(getRestrictionRect(options.inner, interaction, page)) || noInner;\n const outer = rectUtils.xywhToTlbr(getRestrictionRect(options.outer, interaction, page)) || noOuter;\n\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n if (edges.top) {\n modifiedY = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top);\n }\n else if (edges.bottom) {\n modifiedY = Math.max(Math.min(outer.bottom - offset.bottom, page.y), inner.bottom - offset.bottom);\n }\n if (edges.left) {\n modifiedX = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left);\n }\n else if (edges.right) {\n modifiedX = Math.max(Math.min(outer.right - offset.right, page.x), inner.right - offset.right);\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n if (options && options.enabled\n && !(phase === 'start' && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n noInner,\n noOuter,\n getRestrictionRect,\n};\n\nmodifiers.restrictEdges = restrictEdges;\nmodifiers.names.push('restrictEdges');\n\ndefaultOptions.perAction.restrictEdges = restrictEdges.defaults;\nresize.defaults.restrictEdges = restrictEdges.defaults;\n\nmodule.exports = restrictEdges;\n","// This module adds the options.resize.restrictSize setting which sets min and\n// max width and height for the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictSize: {\n// min: { width: -600, height: -600 },\n// max: { width: 600, height: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst restrictEdges = require('./restrictEdges');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst noMin = { width: -Infinity, height: -Infinity };\nconst noMax = { width: +Infinity, height: +Infinity };\n\nconst restrictSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n },\n\n setOffset: function ({ interaction }) {\n return interaction.startOffset;\n },\n\n set: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const rect = rectUtils.xywhToTlbr(interaction.resizeRects.inverted);\n\n const minSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.min, interaction)) || noMin;\n const maxSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.max, interaction)) || noMax;\n\n arg.options = {\n enabled: options.enabled,\n endOnly: options.endOnly,\n inner: utils.extend({}, restrictEdges.noInner),\n outer: utils.extend({}, restrictEdges.noOuter),\n };\n\n if (edges.top) {\n arg.options.inner.top = rect.bottom - minSize.height;\n arg.options.outer.top = rect.bottom - maxSize.height;\n }\n else if (edges.bottom) {\n arg.options.inner.bottom = rect.top + minSize.height;\n arg.options.outer.bottom = rect.top + maxSize.height;\n }\n if (edges.left) {\n arg.options.inner.left = rect.right - minSize.width;\n arg.options.outer.left = rect.right - maxSize.width;\n }\n else if (edges.right) {\n arg.options.inner.right = rect.left + minSize.width;\n arg.options.outer.right = rect.left + maxSize.width;\n }\n\n restrictEdges.set(arg);\n },\n\n modifyCoords: restrictEdges.modifyCoords,\n};\n\nmodifiers.restrictSize = restrictSize;\nmodifiers.names.push('restrictSize');\n\ndefaultOptions.perAction.restrictSize = restrictSize.defaults;\nresize.defaults.restrictSize = restrictSize.defaults;\n\nmodule.exports = restrictSize;\n","const modifiers = require('./index');\nconst interact = require('../interact');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst snap = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n\n relativePoints: null,\n },\n\n setOffset: function ({ interaction, interactable, element, rect, startOffset, options }) {\n const offsets = [];\n const optionsOrigin = utils.rectToXY(utils.resolveRectLike(options.origin));\n const origin = optionsOrigin || utils.getOriginXY(interactable, element, interaction.prepared.name);\n options = options || interactable.options[interaction.prepared.name].snap || {};\n\n let snapOffset;\n\n if (options.offset === 'startCoords') {\n snapOffset = {\n x: interaction.startCoords.page.x - origin.x,\n y: interaction.startCoords.page.y - origin.y,\n };\n }\n else {\n const offsetRect = utils.resolveRectLike(options.offset, interactable, element, [interaction]);\n\n snapOffset = utils.rectToXY(offsetRect) || { x: 0, y: 0 };\n }\n\n if (rect && options.relativePoints && options.relativePoints.length) {\n for (const { x: relativeX, y: relativeY } of options.relativePoints) {\n offsets.push({\n x: startOffset.left - (rect.width * relativeX) + snapOffset.x,\n y: startOffset.top - (rect.height * relativeY) + snapOffset.y,\n });\n }\n }\n else {\n offsets.push(snapOffset);\n }\n\n return offsets;\n },\n\n set: function ({ interaction, pageCoords, status, options, offset: offsets }) {\n const targets = [];\n let target;\n let page;\n let i;\n\n if (status.useStatusXY) {\n page = { x: status.x, y: status.y };\n }\n else {\n const origin = utils.getOriginXY(interaction.target, interaction.element, interaction.prepared.name);\n\n page = utils.extend({}, pageCoords);\n\n page.x -= origin.x;\n page.y -= origin.y;\n }\n\n status.realX = page.x;\n status.realY = page.y;\n\n let len = options.targets? options.targets.length : 0;\n\n for (const { x: offsetX, y: offsetY } of offsets) {\n const relativeX = page.x - offsetX;\n const relativeY = page.y - offsetY;\n\n for (const snapTarget of options.targets) {\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n targets.push({\n x: utils.is.number(target.x) ? (target.x + offsetX) : relativeX,\n y: utils.is.number(target.y) ? (target.y + offsetY) : relativeY,\n\n range: utils.is.number(target.range)? target.range: options.range,\n });\n }\n }\n\n const closest = {\n target: null,\n inRange: false,\n distance: 0,\n range: 0,\n dx: 0,\n dy: 0,\n };\n\n for (i = 0, len = targets.length; i < len; i++) {\n target = targets[i];\n\n const range = target.range;\n const dx = target.x - page.x;\n const dy = target.y - page.y;\n const distance = utils.hypot(dx, dy);\n let inRange = distance <= range;\n\n // Infinite targets count as being out of range\n // compared to non infinite ones that are in range\n if (range === Infinity && closest.inRange && closest.range !== Infinity) {\n inRange = false;\n }\n\n if (!closest.target || (inRange\n // is the closest target in range?\n ? (closest.inRange && range !== Infinity\n // the pointer is relatively deeper in this target\n ? distance / range < closest.distance / closest.range\n // this target has Infinite range and the closest doesn't\n : (range === Infinity && closest.range !== Infinity)\n // OR this target is closer that the previous closest\n || distance < closest.distance)\n // The other is not in range and the pointer is closer to this target\n : (!closest.inRange && distance < closest.distance))) {\n\n closest.target = target;\n closest.distance = distance;\n closest.range = range;\n closest.inRange = inRange;\n closest.dx = dx;\n closest.dy = dy;\n\n status.range = range;\n }\n }\n\n let snapChanged;\n\n if (closest.target) {\n snapChanged = (status.modifiedX !== closest.target.x || status.modifiedY !== closest.target.y);\n\n status.modifiedX = closest.target.x;\n status.modifiedY = closest.target.y;\n }\n else {\n snapChanged = true;\n\n status.modifiedX = NaN;\n status.modifiedY = NaN;\n }\n\n status.dx = closest.dx;\n status.dy = closest.dy;\n\n status.changed = (snapChanged || (closest.inRange && !status.locked));\n status.locked = closest.inRange;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const relativePoints = options && options.relativePoints;\n\n if (options && options.enabled\n && !(phase === 'start' && relativePoints && relativePoints.length)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n }\n\n return {\n range : status.range,\n locked : status.locked,\n x : status.modifiedX,\n y : status.modifiedY,\n realX : status.realX,\n realY : status.realY,\n dx : status.dx,\n dy : status.dy,\n };\n }\n },\n};\n\ninteract.createSnapGrid = function (grid) {\n return function (x, y) {\n const limits = grid.limits || {\n left : -Infinity,\n right : Infinity,\n top : -Infinity,\n bottom: Infinity,\n };\n let offsetX = 0;\n let offsetY = 0;\n\n if (utils.is.object(grid.offset)) {\n offsetX = grid.offset.x;\n offsetY = grid.offset.y;\n }\n\n const gridx = Math.round((x - offsetX) / grid.x);\n const gridy = Math.round((y - offsetY) / grid.y);\n\n const newX = Math.max(limits.left, Math.min(limits.right , gridx * grid.x + offsetX));\n const newY = Math.max(limits.top , Math.min(limits.bottom, gridy * grid.y + offsetY));\n\n return {\n x: newX,\n y: newY,\n range: grid.range,\n };\n };\n};\n\nmodifiers.snap = snap;\nmodifiers.names.push('snap');\n\ndefaultOptions.perAction.snap = snap.defaults;\n\nmodule.exports = snap;\n","// This module allows snapping of the size of targets during resize\n// interactions.\n\nconst modifiers = require('./index');\nconst snap = require('./snap');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\nconst utils = require('../utils/');\n\nconst snapSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n },\n\n setOffset: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.edges;\n\n if (!edges) { return; }\n\n arg.options = {\n relativePoints: [{\n x: edges.left? 0 : 1,\n y: edges.top ? 0 : 1,\n }],\n origin: { x: 0, y: 0 },\n offset: 'self',\n range: options.range,\n };\n\n const offsets = snap.setOffset(arg);\n arg.options = options;\n\n return offsets;\n },\n\n set: function (arg) {\n const { interaction, options, offset, pageCoords } = arg;\n const page = utils.extend({}, pageCoords);\n const relativeX = page.x - offset[0].x;\n const relativeY = page.y - offset[0].y;\n\n arg.options = utils.extend({}, options);\n arg.options.targets = [];\n\n for (const snapTarget of options.targets) {\n let target;\n\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n if ('width' in target && 'height' in target) {\n target.x = target.width;\n target.y = target.height;\n }\n\n arg.options.targets.push(target);\n }\n\n snap.set(arg);\n },\n\n modifyCoords: function (arg) {\n const { options } = arg;\n\n arg.options = utils.extend({}, options);\n arg.options.enabled = options.enabled;\n arg.options.relativePoints = [null];\n\n snap.modifyCoords(arg);\n },\n};\n\nmodifiers.snapSize = snapSize;\nmodifiers.names.push('snapSize');\n\ndefaultOptions.perAction.snapSize = snapSize.defaults;\nresize.defaults.snapSize = snapSize.defaults;\n\nmodule.exports = snapSize;\n","const pointerUtils = require('../utils/pointerUtils');\n\nmodule.exports = class PointerEvent {\n constructor (type, pointer, event, eventTarget, interaction) {\n pointerUtils.pointerExtend(this, event);\n\n if (event !== pointer) {\n pointerUtils.pointerExtend(this, pointer);\n }\n\n this.interaction = interaction;\n\n this.timeStamp = new Date().getTime();\n this.originalEvent = event;\n this.type = type;\n this.pointerId = pointerUtils.getPointerId(pointer);\n this.pointerType = pointerUtils.getPointerType(pointer, interaction);\n this.target = eventTarget;\n this.currentTarget = null;\n\n if (type === 'tap') {\n const pointerIndex = interaction.getPointerIndex(pointer);\n this.dt = this.timeStamp - interaction.downTimes[pointerIndex];\n\n const interval = this.timeStamp - interaction.tapTime;\n\n this.double = !!(interaction.prevTap\n && interaction.prevTap.type !== 'doubletap'\n && interaction.prevTap.target === this.target\n && interval < 500);\n }\n else if (type === 'doubletap') {\n this.dt = pointer.timeStamp - interaction.tapTime;\n }\n }\n\n subtractOrigin ({ x: originX, y: originY }) {\n this.pageX -= originX;\n this.pageY -= originY;\n this.clientX -= originX;\n this.clientY -= originY;\n\n return this;\n }\n\n addOrigin ({ x: originX, y: originY }) {\n this.pageX += originX;\n this.pageY += originY;\n this.clientX += originX;\n this.clientY += originY;\n\n return this;\n }\n\n preventDefault () {\n this.originalEvent.preventDefault();\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n};\n","const PointerEvent = require('./PointerEvent');\nconst Interaction = require('../Interaction');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst defaults = require('../defaultOptions');\nconst signals = require('../utils/Signals').new();\nconst { filter } = require('../utils/arr');\n\nconst simpleSignals = [ 'down', 'up', 'cancel' ];\nconst simpleEvents = [ 'down', 'up', 'cancel' ];\n\nconst pointerEvents = {\n PointerEvent,\n fire,\n collectEventTargets,\n signals,\n defaults: {\n holdDuration: 600,\n ignoreFrom : null,\n allowFrom : null,\n origin : { x: 0, y: 0 },\n },\n types: [\n 'down',\n 'move',\n 'up',\n 'cancel',\n 'tap',\n 'doubletap',\n 'hold',\n ],\n};\n\nfunction fire (arg) {\n const {\n interaction, pointer, event, eventTarget,\n type = arg.pointerEvent.type,\n targets = collectEventTargets(arg),\n pointerEvent = new PointerEvent(type, pointer, event, eventTarget, interaction),\n } = arg;\n\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n targets,\n type,\n pointerEvent,\n };\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n\n for (const prop in target.props || {}) {\n pointerEvent[prop] = target.props[prop];\n }\n\n const origin = utils.getOriginXY(target.eventable, target.element);\n\n pointerEvent.subtractOrigin(origin);\n pointerEvent.eventable = target.eventable;\n pointerEvent.currentTarget = target.element;\n\n target.eventable.fire(pointerEvent);\n\n pointerEvent.addOrigin(origin);\n\n if (pointerEvent.immediatePropagationStopped\n || (pointerEvent.propagationStopped\n && (i + 1) < targets.length && targets[i + 1].element !== pointerEvent.currentTarget)) {\n break;\n }\n }\n\n signals.fire('fired', signalArg);\n\n if (type === 'tap') {\n // if pointerEvent should make a double tap, create and fire a doubletap\n // PointerEvent and use that as the prevTap\n const prevTap = pointerEvent.double\n ? fire({\n interaction, pointer, event, eventTarget,\n type: 'doubletap',\n })\n : pointerEvent;\n\n interaction.prevTap = prevTap;\n interaction.tapTime = prevTap.timeStamp;\n }\n\n return pointerEvent;\n}\n\nfunction collectEventTargets ({ interaction, pointer, event, eventTarget, type }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n // do not fire a tap event if the pointer was moved before being lifted\n if (type === 'tap' && (interaction.pointerWasMoved\n // or if the pointerup target is different to the pointerdown target\n || !(interaction.downTargets[pointerIndex] && interaction.downTargets[pointerIndex] === eventTarget))) {\n return [];\n }\n\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n path,\n targets: [],\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (type === 'hold') {\n signalArg.targets = filter(signalArg.targets, target =>\n target.eventable.options.holdDuration === interaction.holdTimers[pointerIndex].duration);\n }\n\n return signalArg.targets;\n}\n\nInteraction.signals.on('update-pointer-down', function ({ interaction, pointerIndex }) {\n interaction.holdTimers[pointerIndex] = { duration: Infinity, timeout: null };\n});\n\nInteraction.signals.on('remove-pointer', function ({ interaction, pointerIndex }) {\n interaction.holdTimers.splice(pointerIndex, 1);\n});\n\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget, duplicateMove }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n if (!duplicateMove && (!interaction.pointerIsDown || interaction.pointerWasMoved)) {\n if (interaction.pointerIsDown) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n\n fire({\n interaction, pointer, event, eventTarget,\n type: 'move',\n });\n }\n});\n\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget, pointerIndex }) {\n // copy event to be used in timeout for IE8\n const eventCopy = browser.isIE8? utils.extend({}, event) : event;\n\n const timer = interaction.holdTimers[pointerIndex];\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'hold',\n targets: [],\n path,\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (!signalArg.targets.length) { return; }\n\n let minDuration = Infinity;\n\n for (let i = 0; i < signalArg.targets.length; i++) {\n const target = signalArg.targets[i];\n const holdDuration = target.eventable.options.holdDuration;\n\n if (holdDuration < minDuration) {\n minDuration = holdDuration;\n }\n }\n\n timer.duration = minDuration;\n timer.timeout = setTimeout(function () {\n fire({\n interaction, eventCopy, eventTarget,\n pointer: browser.isIE8? eventCopy : pointer,\n type: 'hold',\n });\n }, minDuration);\n});\n\nInteraction.signals.on('up', ({ interaction, pointer, event, eventTarget }) => {\n if (!interaction.pointerWasMoved) {\n fire({ interaction, eventTarget, pointer, event, type: 'tap' });\n }\n});\n\n['up', 'cancel'].forEach(function (signalName) {\n Interaction.signals.on(signalName, function ({ interaction, pointerIndex }) {\n if (interaction.holdTimers[pointerIndex]) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n });\n});\n\nfunction createSignalListener (type) {\n return function ({ interaction, pointer, event, eventTarget }) {\n fire({ interaction, eventTarget, pointer, event, type });\n };\n}\n\nfor (let i = 0; i < simpleSignals.length; i++) {\n Interaction.signals.on(simpleSignals[i], createSignalListener(simpleEvents[i]));\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.prevTap = null; // the most recent tap event on this interaction\n interaction.tapTime = 0; // time of the most recent tap event\n interaction.holdTimers = []; // [{ duration, timeout }]\n});\n\ndefaults.pointerEvents = pointerEvents.defaults;\nmodule.exports = pointerEvents;\n","const pointerEvents = require('./base');\nconst Interaction = require('../Interaction');\n\npointerEvents.signals.on('new', onNew);\npointerEvents.signals.on('fired', onFired);\n\nfor (const signal of ['move', 'up', 'cancel', 'endall']) {\n Interaction.signals.on(signal, endHoldRepeat);\n}\n\nfunction onNew ({ pointerEvent }) {\n if (pointerEvent.type !== 'hold') { return; }\n\n pointerEvent.count = (pointerEvent.count || 0) + 1;\n}\n\nfunction onFired ({ interaction, pointerEvent, eventTarget, targets }) {\n if (pointerEvent.type !== 'hold' || !targets.length) { return; }\n\n // get the repeat interval from the first eventable\n const interval = targets[0].eventable.options.holdRepeatInterval;\n\n // don't repeat if the interval is 0 or less\n if (interval <= 0) { return; }\n\n // set a timeout to fire the holdrepeat event\n interaction.holdIntervalHandle = setTimeout(function () {\n pointerEvents.fire({\n interaction,\n eventTarget,\n type: 'hold',\n pointer: pointerEvent,\n event: pointerEvent,\n });\n }, interval);\n}\n\nfunction endHoldRepeat ({ interaction }) {\n // set the interaction's holdStopTime property\n // to stop further holdRepeat events\n if (interaction.holdIntervalHandle) {\n clearInterval(interaction.holdIntervalHandle);\n interaction.holdIntervalHandle = null;\n }\n}\n\n// don't repeat by default\npointerEvents.defaults.holdRepeatInterval = 0;\npointerEvents.types.push('holdrepeat');\n\nmodule.exports = {\n onNew,\n onFired,\n endHoldRepeat,\n};\n","const pointerEvents = require('./base');\nconst Interactable = require('../Interactable');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\nconst scope = require('../scope');\nconst extend = require('../utils/extend');\nconst { merge } = require('../utils/arr');\n\npointerEvents.signals.on('collect-targets', function ({ targets, element, type, eventTarget }) {\n function collectSelectors (interactable, selector, context) {\n const els = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && is.element(element)\n && domUtils.matchesSelector(element, selector, els)\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n const interactable = scope.interactables.get(element);\n\n if (interactable) {\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n scope.interactables.forEachSelector(collectSelectors, element);\n});\n\nInteractable.signals.on('new', function ({ interactable }) {\n interactable.events.getRect = function (element) {\n return interactable.getRect(element);\n };\n});\n\nInteractable.signals.on('set', function ({ interactable, options }) {\n extend(interactable.events.options, pointerEvents.defaults);\n extend(interactable.events.options, options);\n});\n\nmerge(Interactable.eventTypes, pointerEvents.types);\n\nInteractable.prototype.pointerEvents = function (options) {\n extend(this.events.options, options);\n\n return this;\n};\n\nconst __backCompatOption = Interactable.prototype._backCompatOption;\n\nInteractable.prototype._backCompatOption = function (optionName, newValue) {\n const ret = __backCompatOption.call(this, optionName, newValue);\n\n if (ret === this) {\n this.events.options[optionName] = newValue;\n }\n\n return ret;\n};\n\nInteractable.settingsMethods.push('pointerEvents');\n","const utils = require('./utils');\nconst events = require('./utils/events');\nconst signals = require('./utils/Signals').new();\n\nconst scope = {\n signals,\n events,\n utils,\n\n // main document\n document: require('./utils/domObjects').document,\n // all documents being listened to\n documents: [],\n\n addDocument: function (doc, win) {\n // do nothing if document is already known\n if (utils.contains(scope.documents, doc)) { return false; }\n\n win = win || scope.getWindow(doc);\n\n scope.documents.push(doc);\n events.documents.push(doc);\n\n // don't add an unload event for the main document\n // so that the page may be cached in browser history\n if (doc !== scope.document) {\n events.add(win, 'unload', scope.onWindowUnload);\n }\n\n signals.fire('add-document', { doc, win });\n },\n\n removeDocument: function (doc, win) {\n const index = utils.indexOf(scope.documents, doc);\n\n win = win || scope.getWindow(doc);\n\n events.remove(win, 'unload', scope.onWindowUnload);\n\n scope.documents.splice(index, 1);\n events.documents.splice(index, 1);\n\n signals.fire('remove-document', { win, doc });\n },\n\n onWindowUnload: function () {\n scope.removeDocument(this.document, this);\n },\n};\n\nmodule.exports = scope;\n","const { indexOf } = require('./arr');\n\nclass Signals {\n constructor () {\n this.listeners = {\n // signalName: [listeners],\n };\n }\n\n on (name, listener) {\n if (!this.listeners[name]) {\n this.listeners[name] = [listener];\n return;\n }\n\n this.listeners[name].push(listener);\n }\n\n off (name, listener) {\n if (!this.listeners[name]) { return; }\n\n const index = indexOf(this.listeners[name], listener);\n\n if (index !== -1) {\n this.listeners[name].splice(index, 1);\n }\n }\n\n fire (name, arg) {\n const targetListeners = this.listeners[name];\n\n if (!targetListeners) { return; }\n\n for (let i = 0; i < targetListeners.length; i++) {\n if (targetListeners[i](arg, name) === false) {\n return;\n }\n }\n }\n}\n\nSignals.new = function () {\n return new Signals();\n};\n\nmodule.exports = Signals;\n","function indexOf (array, target) {\n for (let i = 0, len = array.length; i < len; i++) {\n if (array[i] === target) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction contains (array, target) {\n return indexOf(array, target) !== -1;\n}\n\nfunction merge (target, source) {\n for (let i = 0; i < source.length; i++) {\n target.push(source[i]);\n }\n\n return target;\n}\n\nfunction filter (array, test) {\n const result = [];\n\n for (let i = 0; i < array.length; i++) {\n if (test(array[i])) {\n result.push(array[i]);\n }\n }\n\n return result;\n}\n\nmodule.exports = {\n indexOf,\n contains,\n merge,\n filter,\n};\n","const { window } = require('./window');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst Element = domObjects.Element;\nconst navigator = window.navigator;\n\nconst browser = {\n // Does the browser support touch input?\n supportsTouch: !!(('ontouchstart' in window) || is.function(window.DocumentTouch)\n && domObjects.document instanceof window.DocumentTouch),\n\n // Does the browser support PointerEvents\n supportsPointerEvent: !!domObjects.PointerEvent,\n\n isIE8: ('attachEvent' in window) && !('addEventListener' in window),\n\n // Opera Mobile must be handled differently\n isOperaMobile: (navigator.appName === 'Opera'\n && browser.supportsTouch\n && navigator.userAgent.match('Presto')),\n\n // scrolling doesn't change the result of getClientRects on iOS 7\n isIOS7: (/iP(hone|od|ad)/.test(navigator.platform)\n && /OS 7[^\\d]/.test(navigator.appVersion)),\n\n isIe9OrOlder: /MSIE (8|9)/.test(navigator.userAgent),\n\n // prefix matchesSelector\n prefixedMatchesSelector: 'matches' in Element.prototype\n ? 'matches': 'webkitMatchesSelector' in Element.prototype\n ? 'webkitMatchesSelector': 'mozMatchesSelector' in Element.prototype\n ? 'mozMatchesSelector': 'oMatchesSelector' in Element.prototype\n ? 'oMatchesSelector': 'msMatchesSelector',\n\n useMatchesSelectorPolyfill: false,\n\n pEventTypes: (domObjects.PointerEvent\n ? (domObjects.PointerEvent === window.MSPointerEvent\n ? {\n up: 'MSPointerUp',\n down: 'MSPointerDown',\n over: 'mouseover',\n out: 'mouseout',\n move: 'MSPointerMove',\n cancel: 'MSPointerCancel',\n }\n : {\n up: 'pointerup',\n down: 'pointerdown',\n over: 'pointerover',\n out: 'pointerout',\n move: 'pointermove',\n cancel: 'pointercancel',\n })\n : null),\n\n // because Webkit and Opera still use 'mousewheel' event type\n wheelEvent: 'onmousewheel' in domObjects.document? 'mousewheel': 'wheel',\n\n};\n\nbrowser.useMatchesSelectorPolyfill = !is.function(Element.prototype[browser.prefixedMatchesSelector]);\n\nmodule.exports = browser;\n","const domObjects = {};\nconst win = require('./window').window;\n\nfunction blank () {}\n\ndomObjects.document = win.document;\ndomObjects.DocumentFragment = win.DocumentFragment || blank;\ndomObjects.SVGElement = win.SVGElement || blank;\ndomObjects.SVGSVGElement = win.SVGSVGElement || blank;\ndomObjects.SVGElementInstance = win.SVGElementInstance || blank;\ndomObjects.Element = win.Element || blank;\ndomObjects.HTMLElement = win.HTMLElement || domObjects.Element;\n\ndomObjects.Event = win.Event;\ndomObjects.Touch = win.Touch || blank;\ndomObjects.PointerEvent = (win.PointerEvent || win.MSPointerEvent);\n\nmodule.exports = domObjects;\n","const win = require('./window');\nconst browser = require('./browser');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst domUtils = {\n nodeContains: function (parent, child) {\n while (child) {\n if (child === parent) {\n return true;\n }\n\n child = child.parentNode;\n }\n\n return false;\n },\n\n closest: function (element, selector) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) { return element; }\n\n element = domUtils.parentNode(element);\n }\n\n return null;\n },\n\n parentNode: function (node) {\n let parent = node.parentNode;\n\n if (is.docFrag(parent)) {\n // skip past #shado-root fragments\n while ((parent = parent.host) && is.docFrag(parent)) {\n continue;\n }\n\n return parent;\n }\n\n return parent;\n },\n\n // taken from http://tanalin.com/en/blog/2012/12/matches-selector-ie8/ and modified\n matchesSelectorPolyfill: browser.useMatchesSelectorPolyfill\n ? function (element, selector, elems) {\n elems = elems || element.parentNode.querySelectorAll(selector);\n\n for (let i = 0, len = elems.length; i < len; i++) {\n if (elems[i] === element) {\n return true;\n }\n }\n\n return false;\n }\n : null,\n\n matchesSelector: function (element, selector, nodeList) {\n if (browser.useMatchesSelectorPolyfill) {\n return domUtils.matchesSelectorPolyfill(element, selector, nodeList);\n }\n\n // remove /deep/ from selectors if shadowDOM polyfill is used\n if (win.window !== win.realWindow) {\n selector = selector.replace(/\\/deep\\//g, ' ');\n }\n\n return element[browser.prefixedMatchesSelector](selector);\n },\n\n // Test for the element that's \"above\" all other qualifiers\n indexOfDeepestElement: function (elements) {\n let deepestZoneParents = [];\n let dropzoneParents = [];\n let dropzone;\n let deepestZone = elements[0];\n let index = deepestZone? 0: -1;\n let parent;\n let child;\n let i;\n let n;\n\n for (i = 1; i < elements.length; i++) {\n dropzone = elements[i];\n\n // an element might belong to multiple selector dropzones\n if (!dropzone || dropzone === deepestZone) {\n continue;\n }\n\n if (!deepestZone) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n // check if the deepest or current are document.documentElement or document.rootElement\n // - if the current dropzone is, do nothing and continue\n if (dropzone.parentNode === dropzone.ownerDocument) {\n continue;\n }\n // - if deepest is, update with the current dropzone and continue to next\n else if (deepestZone.parentNode === dropzone.ownerDocument) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n if (!deepestZoneParents.length) {\n parent = deepestZone;\n while (parent.parentNode && parent.parentNode !== parent.ownerDocument) {\n deepestZoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n }\n\n // if this element is an svg element and the current deepest is\n // an HTMLElement\n if (deepestZone instanceof domObjects.HTMLElement\n && dropzone instanceof domObjects.SVGElement\n && !(dropzone instanceof domObjects.SVGSVGElement)) {\n\n if (dropzone === deepestZone.parentNode) {\n continue;\n }\n\n parent = dropzone.ownerSVGElement;\n }\n else {\n parent = dropzone;\n }\n\n dropzoneParents = [];\n\n while (parent.parentNode !== parent.ownerDocument) {\n dropzoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n\n n = 0;\n\n // get (position of last common ancestor) + 1\n while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) {\n n++;\n }\n\n const parents = [\n dropzoneParents[n - 1],\n dropzoneParents[n],\n deepestZoneParents[n],\n ];\n\n child = parents[0].lastChild;\n\n while (child) {\n if (child === parents[1]) {\n deepestZone = dropzone;\n index = i;\n deepestZoneParents = [];\n\n break;\n }\n else if (child === parents[2]) {\n break;\n }\n\n child = child.previousSibling;\n }\n }\n\n return index;\n },\n\n matchesUpTo: function (element, selector, limit) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) {\n return true;\n }\n\n element = domUtils.parentNode(element);\n\n if (element === limit) {\n return domUtils.matchesSelector(element, selector);\n }\n }\n\n return false;\n },\n\n getActualElement: function (element) {\n return (element instanceof domObjects.SVGElementInstance\n ? element.correspondingUseElement\n : element);\n },\n\n getScrollXY: function (relevantWindow) {\n relevantWindow = relevantWindow || win.window;\n return {\n x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft,\n y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop,\n };\n },\n\n getElementClientRect: function (element) {\n const clientRect = (element instanceof domObjects.SVGElement\n ? element.getBoundingClientRect()\n : element.getClientRects()[0]);\n\n return clientRect && {\n left : clientRect.left,\n right : clientRect.right,\n top : clientRect.top,\n bottom: clientRect.bottom,\n width : clientRect.width || clientRect.right - clientRect.left,\n height: clientRect.height || clientRect.bottom - clientRect.top,\n };\n },\n\n getElementRect: function (element) {\n const clientRect = domUtils.getElementClientRect(element);\n\n if (!browser.isIOS7 && clientRect) {\n const scroll = domUtils.getScrollXY(win.getWindow(element));\n\n clientRect.left += scroll.x;\n clientRect.right += scroll.x;\n clientRect.top += scroll.y;\n clientRect.bottom += scroll.y;\n }\n\n return clientRect;\n },\n\n getPath: function (element) {\n const path = [];\n\n while (element) {\n path.push(element);\n element = domUtils.parentNode(element);\n }\n\n return path;\n },\n\n trySelector: value => {\n if (!is.string(value)) { return false; }\n\n // an exception will be raised if it is invalid\n domObjects.document.querySelector(value);\n return true;\n },\n};\n\nmodule.exports = domUtils;\n","const is = require('./is');\nconst domUtils = require('./domUtils');\nconst pExtend = require('./pointerExtend');\n\nconst { window, getWindow } = require('./window');\nconst { indexOf, contains } = require('./arr');\n\nconst useAttachEvent = ('attachEvent' in window) && !('addEventListener' in window);\nconst addEvent = useAttachEvent? 'attachEvent': 'addEventListener';\nconst removeEvent = useAttachEvent? 'detachEvent': 'removeEventListener';\nconst on = useAttachEvent? 'on': '';\n\nconst elements = [];\nconst targets = [];\nconst attachedListeners = [];\n\n// {\n// type: {\n// selectors: ['selector', ...],\n// contexts : [document, ...],\n// listeners: [[listener, capture, passive], ...]\n// }\n// }\nconst delegatedEvents = {};\n\nconst documents = [];\n\nconst supportsOptions = !useAttachEvent && (() => {\n let supported = false;\n\n window.document.createElement('div').addEventListener('test', null, {\n get capture () { supported = true; },\n });\n\n return supported;\n})();\n\nfunction add (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n let elementIndex = indexOf(elements, element);\n let target = targets[elementIndex];\n\n if (!target) {\n target = {\n events: {},\n typeCount: 0,\n };\n\n elementIndex = elements.push(element) - 1;\n targets.push(target);\n\n attachedListeners.push(useAttachEvent\n ? {\n supplied: [],\n wrapped : [],\n useCount: [],\n }\n : null);\n }\n\n if (!target.events[type]) {\n target.events[type] = [];\n target.typeCount++;\n }\n\n if (!contains(target.events[type], listener)) {\n let ret;\n\n if (useAttachEvent) {\n const { supplied, wrapped, useCount } = attachedListeners[elementIndex];\n const listenerIndex = indexOf(supplied, listener);\n\n const wrappedListener = wrapped[listenerIndex] || function (event) {\n if (!event.immediatePropagationStopped) {\n event.target = event.srcElement;\n event.currentTarget = element;\n\n event.preventDefault = event.preventDefault || preventDef;\n event.stopPropagation = event.stopPropagation || stopProp;\n event.stopImmediatePropagation = event.stopImmediatePropagation || stopImmProp;\n\n if (/mouse|click/.test(event.type)) {\n event.pageX = event.clientX + getWindow(element).document.documentElement.scrollLeft;\n event.pageY = event.clientY + getWindow(element).document.documentElement.scrollTop;\n }\n\n listener(event);\n }\n };\n\n ret = element[addEvent](on + type, wrappedListener, !!options.capture);\n\n if (listenerIndex === -1) {\n supplied.push(listener);\n wrapped.push(wrappedListener);\n useCount.push(1);\n }\n else {\n useCount[listenerIndex]++;\n }\n }\n else {\n ret = element[addEvent](type, listener, supportsOptions? options : !!options.capture);\n }\n target.events[type].push(listener);\n\n return ret;\n }\n}\n\nfunction remove (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const elementIndex = indexOf(elements, element);\n const target = targets[elementIndex];\n\n if (!target || !target.events) {\n return;\n }\n\n let wrappedListener = listener;\n let listeners;\n let listenerIndex;\n\n if (useAttachEvent) {\n listeners = attachedListeners[elementIndex];\n listenerIndex = indexOf(listeners.supplied, listener);\n wrappedListener = listeners.wrapped[listenerIndex];\n }\n\n if (type === 'all') {\n for (type in target.events) {\n if (target.events.hasOwnProperty(type)) {\n remove(element, type, 'all');\n }\n }\n return;\n }\n\n if (target.events[type]) {\n const len = target.events[type].length;\n\n if (listener === 'all') {\n for (let i = 0; i < len; i++) {\n remove(element, type, target.events[type][i], options);\n }\n return;\n }\n else {\n for (let i = 0; i < len; i++) {\n if (target.events[type][i] === listener) {\n element[removeEvent](on + type, wrappedListener, supportsOptions? options : !!options.capture);\n target.events[type].splice(i, 1);\n\n if (useAttachEvent && listeners) {\n listeners.useCount[listenerIndex]--;\n if (listeners.useCount[listenerIndex] === 0) {\n listeners.supplied.splice(listenerIndex, 1);\n listeners.wrapped.splice(listenerIndex, 1);\n listeners.useCount.splice(listenerIndex, 1);\n }\n }\n\n break;\n }\n }\n }\n\n if (target.events[type] && target.events[type].length === 0) {\n target.events[type] = null;\n target.typeCount--;\n }\n }\n\n if (!target.typeCount) {\n targets.splice(elementIndex, 1);\n elements.splice(elementIndex, 1);\n attachedListeners.splice(elementIndex, 1);\n }\n}\n\nfunction addDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n if (!delegatedEvents[type]) {\n delegatedEvents[type] = {\n selectors: [],\n contexts : [],\n listeners: [],\n };\n\n // add delegate listener functions\n for (let i = 0; i < documents.length; i++) {\n add(documents[i], type, delegateListener);\n add(documents[i], type, delegateUseCapture, true);\n }\n }\n\n const delegated = delegatedEvents[type];\n let index;\n\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n break;\n }\n }\n\n if (index === -1) {\n index = delegated.selectors.length;\n\n delegated.selectors.push(selector);\n delegated.contexts .push(context);\n delegated.listeners.push([]);\n }\n\n // keep listener and capture and passive flags\n delegated.listeners[index].push([listener, !!options.capture, options.passive]);\n}\n\nfunction removeDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const delegated = delegatedEvents[type];\n let matchFound = false;\n let index;\n\n if (!delegated) { return; }\n\n // count from last index of delegated to 0\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n // look for matching selector and context Node\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n\n const listeners = delegated.listeners[index];\n\n // each item of the listeners array is an array: [function, capture, passive]\n for (let i = listeners.length - 1; i >= 0; i--) {\n const [fn, capture, passive] = listeners[i];\n\n // check if the listener functions and capture and passive flags match\n if (fn === listener && capture === !!options.capture && passive === options.passive) {\n // remove the listener from the array of listeners\n listeners.splice(i, 1);\n\n // if all listeners for this interactable have been removed\n // remove the interactable from the delegated arrays\n if (!listeners.length) {\n delegated.selectors.splice(index, 1);\n delegated.contexts .splice(index, 1);\n delegated.listeners.splice(index, 1);\n\n // remove delegate function from context\n remove(context, type, delegateListener);\n remove(context, type, delegateUseCapture, true);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegatedEvents[type] = null;\n }\n }\n\n // only remove one listener\n matchFound = true;\n break;\n }\n }\n\n if (matchFound) { break; }\n }\n }\n}\n\n// bound to the interactable context when a DOM event\n// listener is added to a selector interactable\nfunction delegateListener (event, optionalArg) {\n const options = getOptions(optionalArg);\n const fakeEvent = {};\n const delegated = delegatedEvents[event.type];\n const eventTarget = (domUtils.getActualElement(event.path\n ? event.path[0]\n : event.target));\n let element = eventTarget;\n\n // duplicate the event so that currentTarget can be changed\n pExtend(fakeEvent, event);\n\n fakeEvent.originalEvent = event;\n fakeEvent.preventDefault = preventOriginalDefault;\n\n // climb up document tree looking for selector matches\n while (is.element(element)) {\n for (let i = 0; i < delegated.selectors.length; i++) {\n const selector = delegated.selectors[i];\n const context = delegated.contexts[i];\n\n if (domUtils.matchesSelector(element, selector)\n && domUtils.nodeContains(context, eventTarget)\n && domUtils.nodeContains(context, element)) {\n\n const listeners = delegated.listeners[i];\n\n fakeEvent.currentTarget = element;\n\n for (let j = 0; j < listeners.length; j++) {\n const [fn, capture, passive] = listeners[j];\n\n if (capture === !!options.capture && passive === options.passive) {\n fn(fakeEvent);\n }\n }\n }\n }\n\n element = domUtils.parentNode(element);\n }\n}\n\nfunction delegateUseCapture (event) {\n return delegateListener.call(this, event, true);\n}\n\nfunction preventDef () {\n this.returnValue = false;\n}\n\nfunction preventOriginalDefault () {\n this.originalEvent.preventDefault();\n}\n\nfunction stopProp () {\n this.cancelBubble = true;\n}\n\nfunction stopImmProp () {\n this.cancelBubble = true;\n this.immediatePropagationStopped = true;\n}\n\nfunction getOptions (param) {\n return is.object(param)? param : { capture: param };\n}\n\nmodule.exports = {\n add,\n remove,\n\n addDelegate,\n removeDelegate,\n\n delegateListener,\n delegateUseCapture,\n delegatedEvents,\n documents,\n\n useAttachEvent,\n supportsOptions,\n\n _elements: elements,\n _targets: targets,\n _attachedListeners: attachedListeners,\n};\n","module.exports = function extend (dest, source) {\n for (const prop in source) {\n dest[prop] = source[prop];\n }\n return dest;\n};\n","const {\n resolveRectLike,\n rectToXY,\n} = require('./rect');\n\nmodule.exports = function (target, element, action) {\n const actionOptions = target.options[action];\n const actionOrigin = actionOptions && actionOptions.origin;\n const origin = actionOrigin || target.options.origin;\n\n const originRect = resolveRectLike(origin, target, element, [target && element]);\n\n return rectToXY(originRect) || { x: 0, y: 0 };\n};\n","module.exports = (x, y) => Math.sqrt(x * x + y * y);\n","const extend = require('./extend');\nconst win = require('./window');\n\nconst utils = {\n warnOnce: function (method, message) {\n let warned = false;\n\n return function () {\n if (!warned) {\n win.window.console.warn(message);\n warned = true;\n }\n\n return method.apply(this, arguments);\n };\n },\n\n // http://stackoverflow.com/a/5634528/2280888\n _getQBezierValue: function (t, p1, p2, p3) {\n const iT = 1 - t;\n return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3;\n },\n\n getQuadraticCurvePoint: function (startX, startY, cpX, cpY, endX, endY, position) {\n return {\n x: utils._getQBezierValue(position, startX, cpX, endX),\n y: utils._getQBezierValue(position, startY, cpY, endY),\n };\n },\n\n // http://gizma.com/easing/\n easeOutQuad: function (t, b, c, d) {\n t /= d;\n return -c * t*(t-2) + b;\n },\n\n copyAction: function (dest, src) {\n dest.name = src.name;\n dest.axis = src.axis;\n dest.edges = src.edges;\n\n return dest;\n },\n\n is : require('./is'),\n extend : extend,\n hypot : require('./hypot'),\n getOriginXY: require('./getOriginXY'),\n};\n\nextend(utils, require('./arr'));\nextend(utils, require('./domUtils'));\nextend(utils, require('./pointerUtils'));\nextend(utils, require('./rect'));\n\nmodule.exports = utils;\n","const scope = require('../scope');\nconst utils = require('./index');\nconst browser = require('./browser');\n\nconst finder = {\n methodOrder: [ 'simulationResume', 'mouse', 'hasPointer', 'idle' ],\n\n search: function (pointer, eventType, eventTarget) {\n const mouseEvent = (/mouse/i.test(pointer.pointerType || eventType)\n // MSPointerEvent.MSPOINTER_TYPE_MOUSE\n || pointer.pointerType === 4);\n const pointerId = utils.getPointerId(pointer);\n const details = { pointer, pointerId, mouseEvent, eventType, eventTarget };\n\n for (const method of finder.methodOrder) {\n const interaction = finder[method](details);\n\n if (interaction) {\n return interaction;\n }\n }\n },\n\n // try to resume simulation with a new pointer\n simulationResume: function ({ mouseEvent, eventType, eventTarget }) {\n if (!/down|start/i.test(eventType)) {\n return null;\n }\n\n for (const interaction of scope.interactions) {\n let element = eventTarget;\n\n if (interaction.simulation && interaction.simulation.allowResume\n && (interaction.mouse === mouseEvent)) {\n while (element) {\n // if the element is the interaction element\n if (element === interaction.element) {\n return interaction;\n }\n element = utils.parentNode(element);\n }\n }\n }\n\n return null;\n },\n\n // if it's a mouse interaction\n mouse: function ({ pointerId, mouseEvent, eventType }) {\n if (!mouseEvent && (browser.supportsTouch || browser.supportsPointerEvent)) {\n return null;\n }\n\n let firstNonActive;\n\n for (const interaction of scope.interactions) {\n if (interaction.mouse) {\n // if it's a down event, skip interactions with running simulations\n if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; }\n\n // if the interaction is active, return it immediately\n if (interaction.interacting()) {\n return interaction;\n }\n // otherwise save it and look for another active interaction\n else if (!firstNonActive) {\n firstNonActive = interaction;\n }\n }\n }\n\n // if no active mouse interaction was found use the first inactive mouse\n // interaction\n if (firstNonActive) {\n return firstNonActive;\n }\n\n // Find any interaction specifically for mouse.\n // ignore the interaction if the eventType is a mousedown, and a simulation\n // is active\n for (const interaction of scope.interactions) {\n if (interaction.mouse && !(/down/.test(eventType) && interaction.simulation)) {\n return interaction;\n }\n }\n\n return null;\n },\n\n // get interaction that has this pointer\n hasPointer: function ({ pointerId }) {\n for (const interaction of scope.interactions) {\n if (utils.contains(interaction.pointerIds, pointerId)) {\n return interaction;\n }\n }\n },\n\n // get first idle interaction\n idle: function ({ mouseEvent }) {\n for (const interaction of scope.interactions) {\n // if there's already a pointer held down\n if (interaction.pointerIds.length === 1) {\n const target = interaction.target;\n // don't add this pointer if there is a target interactable and it\n // isn't gesturable\n if (target && !target.options.gesture.enabled) {\n continue;\n }\n }\n // maximum of 2 pointers per interaction\n else if (interaction.pointerIds.length >= 2) {\n continue;\n }\n\n if (!interaction.interacting() && (mouseEvent === interaction.mouse)) {\n return interaction;\n }\n }\n\n return null;\n },\n};\n\nmodule.exports = finder;\n","const win = require('./window');\nconst isWindow = require('./isWindow');\n\nconst is = {\n array : () => {},\n\n window : thing => thing === win.window || isWindow(thing),\n\n docFrag : thing => is.object(thing) && thing.nodeType === 11,\n\n object : thing => !!thing && (typeof thing === 'object'),\n\n function: thing => typeof thing === 'function',\n\n number : thing => typeof thing === 'number' ,\n\n bool : thing => typeof thing === 'boolean' ,\n\n string : thing => typeof thing === 'string' ,\n\n element: thing => {\n if (!thing || (typeof thing !== 'object')) { return false; }\n\n const _window = win.getWindow(thing) || win.window;\n\n return (/object|function/.test(typeof _window.Element)\n ? thing instanceof _window.Element //DOM2\n : thing.nodeType === 1 && typeof thing.nodeName === 'string');\n },\n};\n\nis.array = thing => (is.object(thing)\n && (typeof thing.length !== 'undefined')\n && is.function(thing.splice));\n\nmodule.exports = is;\n","module.exports = (thing) => !!(thing && thing.Window) && (thing instanceof thing.Window);\n","function pointerExtend (dest, source) {\n for (const prop in source) {\n const prefixedPropREs = module.exports.prefixedPropREs;\n let deprecated = false;\n\n // skip deprecated prefixed properties\n for (const vendor in prefixedPropREs) {\n if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) {\n deprecated = true;\n break;\n }\n }\n\n if (!deprecated && typeof source[prop] !== 'function') {\n dest[prop] = source[prop];\n }\n }\n return dest;\n}\n\npointerExtend.prefixedPropREs = {\n webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/,\n};\n\nmodule.exports = pointerExtend;\n","const hypot = require('./hypot');\nconst browser = require('./browser');\nconst dom = require('./domObjects');\nconst domUtils = require('./domUtils');\nconst is = require('./is');\nconst pointerExtend = require('./pointerExtend');\n\nconst pointerUtils = {\n copyCoords: function (dest, src) {\n dest.page = dest.page || {};\n dest.page.x = src.page.x;\n dest.page.y = src.page.y;\n\n dest.client = dest.client || {};\n dest.client.x = src.client.x;\n dest.client.y = src.client.y;\n\n dest.timeStamp = src.timeStamp;\n },\n\n setCoordDeltas: function (targetObj, prev, cur) {\n targetObj.page.x = cur.page.x - prev.page.x;\n targetObj.page.y = cur.page.y - prev.page.y;\n targetObj.client.x = cur.client.x - prev.client.x;\n targetObj.client.y = cur.client.y - prev.client.y;\n targetObj.timeStamp = cur.timeStamp - prev.timeStamp;\n\n // set pointer velocity\n const dt = Math.max(targetObj.timeStamp / 1000, 0.001);\n\n targetObj.page.speed = hypot(targetObj.page.x, targetObj.page.y) / dt;\n targetObj.page.vx = targetObj.page.x / dt;\n targetObj.page.vy = targetObj.page.y / dt;\n\n targetObj.client.speed = hypot(targetObj.client.x, targetObj.page.y) / dt;\n targetObj.client.vx = targetObj.client.x / dt;\n targetObj.client.vy = targetObj.client.y / dt;\n },\n\n isNativePointer: function (pointer) {\n return (pointer instanceof dom.Event || pointer instanceof dom.Touch);\n },\n\n // Get specified X/Y coords for mouse or event.touches[0]\n getXY: function (type, pointer, xy) {\n xy = xy || {};\n type = type || 'page';\n\n xy.x = pointer[type + 'X'];\n xy.y = pointer[type + 'Y'];\n\n return xy;\n },\n\n getPageXY: function (pointer, page) {\n page = page || {};\n\n // Opera Mobile handles the viewport and scrolling oddly\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n pointerUtils.getXY('screen', pointer, page);\n\n page.x += window.scrollX;\n page.y += window.scrollY;\n }\n else {\n pointerUtils.getXY('page', pointer, page);\n }\n\n return page;\n },\n\n getClientXY: function (pointer, client) {\n client = client || {};\n\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n // Opera Mobile handles the viewport and scrolling oddly\n pointerUtils.getXY('screen', pointer, client);\n }\n else {\n pointerUtils.getXY('client', pointer, client);\n }\n\n return client;\n },\n\n getPointerId: function (pointer) {\n return is.number(pointer.pointerId)? pointer.pointerId : pointer.identifier;\n },\n\n setCoords: function (targetObj, pointers, timeStamp) {\n const pointer = (pointers.length > 1\n ? pointerUtils.pointerAverage(pointers)\n : pointers[0]);\n\n const tmpXY = {};\n\n pointerUtils.getPageXY(pointer, tmpXY);\n targetObj.page.x = tmpXY.x;\n targetObj.page.y = tmpXY.y;\n\n pointerUtils.getClientXY(pointer, tmpXY);\n targetObj.client.x = tmpXY.x;\n targetObj.client.y = tmpXY.y;\n\n targetObj.timeStamp = is.number(timeStamp) ? timeStamp :new Date().getTime();\n },\n\n pointerExtend: pointerExtend,\n\n getTouchPair: function (event) {\n const touches = [];\n\n // array of touches is supplied\n if (is.array(event)) {\n touches[0] = event[0];\n touches[1] = event[1];\n }\n // an event\n else {\n if (event.type === 'touchend') {\n if (event.touches.length === 1) {\n touches[0] = event.touches[0];\n touches[1] = event.changedTouches[0];\n }\n else if (event.touches.length === 0) {\n touches[0] = event.changedTouches[0];\n touches[1] = event.changedTouches[1];\n }\n }\n else {\n touches[0] = event.touches[0];\n touches[1] = event.touches[1];\n }\n }\n\n return touches;\n },\n\n pointerAverage: function (pointers) {\n const average = {\n pageX : 0,\n pageY : 0,\n clientX: 0,\n clientY: 0,\n screenX: 0,\n screenY: 0,\n };\n\n for (const pointer of pointers) {\n for (const prop in average) {\n average[prop] += pointer[prop];\n }\n }\n for (const prop in average) {\n average[prop] /= pointers.length;\n }\n\n return average;\n },\n\n touchBBox: function (event) {\n if (!event.length && !(event.touches && event.touches.length > 1)) {\n return;\n }\n\n const touches = pointerUtils.getTouchPair(event);\n const minX = Math.min(touches[0].pageX, touches[1].pageX);\n const minY = Math.min(touches[0].pageY, touches[1].pageY);\n const maxX = Math.max(touches[0].pageX, touches[1].pageX);\n const maxY = Math.max(touches[0].pageY, touches[1].pageY);\n\n return {\n x: minX,\n y: minY,\n left: minX,\n top: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n },\n\n touchDistance: function (event, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n\n\n const dx = touches[0][sourceX] - touches[1][sourceX];\n const dy = touches[0][sourceY] - touches[1][sourceY];\n\n return hypot(dx, dy);\n },\n\n touchAngle: function (event, prevAngle, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n const dx = touches[1][sourceX] - touches[0][sourceX];\n const dy = touches[1][sourceY] - touches[0][sourceY];\n const angle = 180 * Math.atan2(dy , dx) / Math.PI;\n\n return angle;\n },\n\n getPointerType: function (pointer, interaction) {\n // if the PointerEvent API isn't available, then the pointer must be ither\n // a MouseEvent or TouchEvent\n if (interaction.mouse) { return 'mouse'; }\n if (!browser.supportsPointerEvent) { return 'touch'; }\n\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : [undefined, undefined,'touch', 'pen', 'mouse'][pointer.pointerType];\n },\n\n // [ event.target, event.currentTarget ]\n getEventTargets: function (event) {\n return [\n domUtils.getActualElement(event.path ? event.path[0] : event.target),\n domUtils.getActualElement(event.currentTarget),\n ];\n },\n};\n\nmodule.exports = pointerUtils;\n","const { window } = require('./window');\n\nconst vendors = ['ms', 'moz', 'webkit', 'o'];\nlet lastTime = 0;\nlet request;\nlet cancel;\n\nfor (let x = 0; x < vendors.length && !window.requestAnimationFrame; x++) {\n request = window[vendors[x] + 'RequestAnimationFrame'];\n cancel = window[vendors[x] +'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n}\n\nif (!request) {\n request = function (callback) {\n const currTime = new Date().getTime();\n const timeToCall = Math.max(0, 16 - (currTime - lastTime));\n const id = setTimeout(function () { callback(currTime + timeToCall); },\n timeToCall);\n\n lastTime = currTime + timeToCall;\n return id;\n };\n}\n\nif (!cancel) {\n cancel = function (id) {\n clearTimeout(id);\n };\n}\n\nmodule.exports = {\n request,\n cancel,\n};\n","const extend = require('./extend');\nconst is = require('./is');\nconst {\n closest,\n parentNode,\n getElementRect,\n} = require('./domUtils');\n\nconst rectUtils = {\n getStringOptionResult: function (value, interactable, element) {\n if (!is.string(value)) {\n return null;\n }\n\n if (value === 'parent') {\n value = parentNode(element);\n }\n else if (value === 'self') {\n value = interactable.getRect(element);\n }\n else {\n value = closest(element, value);\n }\n\n return value;\n },\n\n resolveRectLike: function (value, interactable, element, functionArgs) {\n value = rectUtils.getStringOptionResult(value, interactable, element) || value;\n\n if (is.function(value)) {\n value = value.apply(null, functionArgs);\n }\n\n if (is.element(value)) {\n value = getElementRect(value);\n }\n\n return value;\n },\n\n rectToXY: function (rect) {\n return rect && {\n x: 'x' in rect ? rect.x : rect.left,\n y: 'y' in rect ? rect.y : rect.top,\n };\n },\n\n xywhToTlbr: function (rect) {\n if (rect && !('left' in rect && 'top' in rect)) {\n rect = extend({}, rect);\n\n rect.left = rect.x || 0;\n rect.top = rect.y || 0;\n rect.right = rect.right || (rect.left + rect.width);\n rect.bottom = rect.bottom || (rect.top + rect.height);\n }\n\n return rect;\n },\n\n tlbrToXywh: function (rect) {\n if (rect && !('x' in rect && 'y' in rect)) {\n rect = extend({}, rect);\n\n rect.x = rect.left || 0;\n rect.top = rect.top || 0;\n rect.width = rect.width || (rect.right - rect.x);\n rect.height = rect.height || (rect.bottom - rect.y);\n }\n\n return rect;\n },\n};\n\nmodule.exports = rectUtils;\n","const win = module.exports;\nconst isWindow = require('./isWindow');\n\nfunction init (window) {\n // get wrapped window if using Shadow DOM polyfill\n\n win.realWindow = window;\n\n // create a TextNode\n const el = window.document.createTextNode('');\n\n // check if it's wrapped by a polyfill\n if (el.ownerDocument !== window.document\n && typeof window.wrap === 'function'\n && window.wrap(el) === el) {\n // use wrapped window\n window = window.wrap(window);\n }\n\n win.window = window;\n}\n\nif (typeof window === 'undefined') {\n win.window = undefined;\n win.realWindow = undefined;\n}\nelse {\n init(window);\n}\n\nwin.getWindow = function getWindow (node) {\n if (isWindow(node)) {\n return node;\n }\n\n const rootNode = (node.ownerDocument || node);\n\n return rootNode.defaultView || rootNode.parentWindow || win.window;\n};\n\nwin.init = init;\n"]} \ No newline at end of file +{"version":3,"sources":["src/minHeader.js","src/header.js","index.js","src/Eventable.js","src/InteractEvent.js","src/Interactable.js","src/Interaction.js","src/actions/base.js","src/actions/drag.js","src/actions/drop.js","src/actions/gesture.js","src/actions/resize.js","src/autoScroll.js","src/autoStart/InteractableMethods.js","src/autoStart/base.js","src/autoStart/delay.js","src/autoStart/drag.js","src/autoStart/gesture.js","src/autoStart/resize.js","src/defaultOptions.js","src/index.js","src/inertia.js","src/interact.js","src/interactablePreventDefault.js","src/legacyBrowsers.js","src/modifiers/index.js","src/modifiers/restrict.js","src/modifiers/restrictEdges.js","src/modifiers/restrictSize.js","src/modifiers/snap.js","src/modifiers/snapSize.js","src/pointerEvents/PointerEvent.js","src/pointerEvents/base.js","src/pointerEvents/holdRepeat.js","src/pointerEvents/interactableTargets.js","src/scope.js","src/utils/Signals.js","src/utils/arr.js","src/utils/browser.js","src/utils/domObjects.js","src/utils/domUtils.js","src/utils/events.js","src/utils/extend.js","src/utils/getOriginXY.js","src/utils/hypot.js","src/utils/index.js","src/utils/interactionFinder.js","src/utils/is.js","src/utils/isWindow.js","src/utils/pointerExtend.js","src/utils/pointerUtils.js","src/utils/raf.js","src/utils/rect.js","src/utils/window.js"],"names":[],"mappings":"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","file":"interact.min.js","sourceRoot":"","sourcesContent":["/* interact.js v1.3.0-alpha.4+sha.7970416-dirty | https://raw.github.com/taye/interact.js/master/LICENSE */\n","/**\n * interact.js v1.3.0-alpha.4+sha.7970416-dirty\n *\n * Copyright (c) 2012-2017 Taye Adeyemi \n * Open source under the MIT License.\n * https://raw.github.com/taye/interact.js/master/LICENSE\n */\n","/*\n * In a (windowless) server environment this file exports a factory function\n * that takes the window to use.\n *\n * var interact = require('interact.js')(windowObject);\n *\n * See https://github.com/taye/interact.js/issues/187\n */\nif (typeof window === 'undefined') {\n module.exports = function (window) {\n require('./src/utils/window').init(window);\n\n return require('./src/index');\n };\n}\nelse {\n module.exports = require('./src/index');\n}\n","const { indexOf } = require('./utils/arr');\nconst extend = require('./utils/extend.js');\n\nfunction fireUntilImmediateStopped (event, listeners) {\n for (let i = 0, len = listeners.length; i < len && !event.immediatePropagationStopped; i++) {\n listeners[i](event);\n }\n}\n\nclass Eventable {\n\n constructor (options) {\n this.options = extend({}, options || {});\n }\n\n fire (event) {\n let listeners;\n const onEvent = 'on' + event.type;\n const global = this.global;\n\n // Interactable#on() listeners\n if ((listeners = this[event.type])) {\n fireUntilImmediateStopped(event, listeners);\n }\n\n // interactable.onevent listener\n if (this[onEvent]) {\n this[onEvent](event);\n }\n\n // interact.on() listeners\n if (!event.propagationStopped && global && (listeners = global[event.type])) {\n fireUntilImmediateStopped(event, listeners);\n }\n }\n\n on (eventType, listener) {\n // if this type of event was never bound\n if (this[eventType]) {\n this[eventType].push(listener);\n }\n else {\n this[eventType] = [listener];\n }\n }\n\n off (eventType, listener) {\n // if it is an action event type\n const eventList = this[eventType];\n const index = eventList? indexOf(eventList, listener) : -1;\n\n if (index !== -1) {\n eventList.splice(index, 1);\n }\n\n if (eventList && eventList.length === 0 || !listener) {\n this[eventType] = listener;\n }\n }\n}\n\nmodule.exports = Eventable;\n","const extend = require('./utils/extend');\nconst getOriginXY = require('./utils/getOriginXY');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nclass InteractEvent {\n constructor (interaction, event, action, phase, element, related, preEnd = false) {\n const target = interaction.target;\n const deltaSource = (target && target.options || defaults).deltaSource;\n const origin = getOriginXY(target, element, action);\n const starting = phase === 'start';\n const ending = phase === 'end';\n const coords = starting? interaction.startCoords : interaction.curCoords;\n const prevEvent = interaction.prevEvent;\n\n element = element || interaction.element;\n\n const page = extend({}, coords.page);\n const client = extend({}, coords.client);\n\n page.x -= origin.x;\n page.y -= origin.y;\n\n client.x -= origin.x;\n client.y -= origin.y;\n\n this.ctrlKey = event.ctrlKey;\n this.altKey = event.altKey;\n this.shiftKey = event.shiftKey;\n this.metaKey = event.metaKey;\n this.button = event.button;\n this.buttons = event.buttons;\n this.target = element;\n this.currentTarget = element;\n this.relatedTarget = related || null;\n this.preEnd = preEnd;\n this.type = action + (phase || '');\n this.interaction = interaction;\n this.interactable = target;\n\n this.t0 = starting ? interaction.downTimes[interaction.downTimes.length - 1]\n : prevEvent.t0;\n\n const signalArg = {\n interaction,\n event,\n action,\n phase,\n element,\n related,\n page,\n client,\n coords,\n starting,\n ending,\n deltaSource,\n iEvent: this,\n };\n\n signals.fire('set-xy', signalArg);\n\n if (ending) {\n // use previous coords when ending\n this.pageX = prevEvent.pageX;\n this.pageY = prevEvent.pageY;\n this.clientX = prevEvent.clientX;\n this.clientY = prevEvent.clientY;\n }\n else {\n this.pageX = page.x;\n this.pageY = page.y;\n this.clientX = client.x;\n this.clientY = client.y;\n }\n\n this.x0 = interaction.startCoords.page.x - origin.x;\n this.y0 = interaction.startCoords.page.y - origin.y;\n this.clientX0 = interaction.startCoords.client.x - origin.x;\n this.clientY0 = interaction.startCoords.client.y - origin.y;\n\n signals.fire('set-delta', signalArg);\n\n this.timeStamp = coords.timeStamp;\n this.dt = interaction.pointerDelta.timeStamp;\n this.duration = this.timeStamp - this.t0;\n\n // speed and velocity in pixels per second\n this.speed = interaction.pointerDelta[deltaSource].speed;\n this.velocityX = interaction.pointerDelta[deltaSource].vx;\n this.velocityY = interaction.pointerDelta[deltaSource].vy;\n\n this.swipe = (ending || phase === 'inertiastart')? this.getSwipe() : null;\n\n signals.fire('new', signalArg);\n }\n\n getSwipe () {\n const interaction = this.interaction;\n\n if (interaction.prevEvent.speed < 600\n || this.timeStamp - interaction.prevEvent.timeStamp > 150) {\n return null;\n }\n\n let angle = 180 * Math.atan2(interaction.prevEvent.velocityY, interaction.prevEvent.velocityX) / Math.PI;\n const overlap = 22.5;\n\n if (angle < 0) {\n angle += 360;\n }\n\n const left = 135 - overlap <= angle && angle < 225 + overlap;\n const up = 225 - overlap <= angle && angle < 315 + overlap;\n\n const right = !left && (315 - overlap <= angle || angle < 45 + overlap);\n const down = !up && 45 - overlap <= angle && angle < 135 + overlap;\n\n return {\n up,\n down,\n left,\n right,\n angle,\n speed: interaction.prevEvent.speed,\n velocity: {\n x: interaction.prevEvent.velocityX,\n y: interaction.prevEvent.velocityY,\n },\n };\n }\n\n preventDefault () {}\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n}\n\nsignals.on('set-delta', function ({ iEvent, interaction, starting, deltaSource }) {\n const prevEvent = starting? iEvent : interaction.prevEvent;\n\n if (deltaSource === 'client') {\n iEvent.dx = iEvent.clientX - prevEvent.clientX;\n iEvent.dy = iEvent.clientY - prevEvent.clientY;\n }\n else {\n iEvent.dx = iEvent.pageX - prevEvent.pageX;\n iEvent.dy = iEvent.pageY - prevEvent.pageY;\n }\n});\n\nInteractEvent.signals = signals;\n\nmodule.exports = InteractEvent;\n","const is = require('./utils/is');\nconst events = require('./utils/events');\nconst extend = require('./utils/extend');\nconst actions = require('./actions/base');\nconst scope = require('./scope');\nconst Eventable = require('./Eventable');\nconst defaults = require('./defaultOptions');\nconst signals = require('./utils/Signals').new();\n\nconst {\n getElementRect,\n nodeContains,\n trySelector,\n} = require('./utils/domUtils');\nconst { getWindow } = require('./utils/window');\nconst { indexOf, contains } = require('./utils/arr');\nconst { wheelEvent } = require('./utils/browser');\n\n// all set interactables\nscope.interactables = [];\n\n/*\\\n * Interactable\n [ property ]\n **\n * Object type returned by @interact\n\\*/\nclass Interactable {\n constructor (target, options) {\n options = options || {};\n\n this.target = target;\n this.events = new Eventable();\n this._context = options.context || scope.document;\n this._win = getWindow(trySelector(target)? this._context : target);\n this._doc = this._win.document;\n\n signals.fire('new', {\n target,\n options,\n interactable: this,\n win: this._win,\n });\n\n scope.addDocument( this._doc, this._win );\n\n scope.interactables.push(this);\n\n this.set(options);\n }\n\n setOnEvents (action, phases) {\n const onAction = 'on' + action;\n\n if (is.function(phases.onstart) ) { this.events[onAction + 'start' ] = phases.onstart ; }\n if (is.function(phases.onmove) ) { this.events[onAction + 'move' ] = phases.onmove ; }\n if (is.function(phases.onend) ) { this.events[onAction + 'end' ] = phases.onend ; }\n if (is.function(phases.oninertiastart)) { this.events[onAction + 'inertiastart' ] = phases.oninertiastart ; }\n\n return this;\n }\n\n setPerAction (action, options) {\n // for all the default per-action options\n for (const option in options) {\n // if this option exists for this action\n if (option in defaults[action]) {\n // if the option in the options arg is an object value\n if (is.object(options[option])) {\n // duplicate the object\n this.options[action][option] = extend(this.options[action][option] || {}, options[option]);\n\n if (is.object(defaults.perAction[option]) && 'enabled' in defaults.perAction[option]) {\n this.options[action][option].enabled = options[option].enabled === false? false : true;\n }\n }\n else if (is.bool(options[option]) && is.object(defaults.perAction[option])) {\n this.options[action][option].enabled = options[option];\n }\n else if (options[option] !== undefined) {\n // or if it's not undefined, do a plain assignment\n this.options[action][option] = options[option];\n }\n }\n }\n }\n\n /*\\\n * Interactable.getRect\n [ method ]\n *\n * The default function to get an Interactables bounding rect. Can be\n * overridden using @Interactable.rectChecker.\n *\n - element (Element) #optional The element to measure.\n = (object) The object's bounding rectangle.\n o {\n o top : 0,\n o left : 0,\n o bottom: 0,\n o right : 0,\n o width : 0,\n o height: 0\n o }\n \\*/\n getRect (element) {\n element = element || this.target;\n\n if (is.string(this.target) && !(is.element(element))) {\n element = this._context.querySelector(this.target);\n }\n\n return getElementRect(element);\n }\n\n /*\\\n * Interactable.rectChecker\n [ method ]\n *\n * Returns or sets the function used to calculate the interactable's\n * element's rectangle\n *\n - checker (function) #optional A function which returns this Interactable's bounding rectangle. See @Interactable.getRect\n = (function | object) The checker function or this Interactable\n \\*/\n rectChecker (checker) {\n if (is.function(checker)) {\n this.getRect = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.getRect;\n\n return this;\n }\n\n return this.getRect;\n }\n\n _backCompatOption (optionName, newValue) {\n if (trySelector(newValue) || is.object(newValue)) {\n this.options[optionName] = newValue;\n\n for (const action of actions.names) {\n this.options[action][optionName] = newValue;\n }\n\n return this;\n }\n\n return this.options[optionName];\n }\n\n /*\\\n * Interactable.origin\n [ method ]\n *\n * Gets or sets the origin of the Interactable's element. The x and y\n * of the origin will be subtracted from action event coordinates.\n *\n - origin (object | string) #optional An object eg. { x: 0, y: 0 } or string 'parent', 'self' or any CSS selector\n * OR\n - origin (Element) #optional An HTML or SVG Element whose rect will be used\n **\n = (object) The current origin or this Interactable\n \\*/\n origin (newValue) {\n return this._backCompatOption('origin', newValue);\n }\n\n /*\\\n * Interactable.deltaSource\n [ method ]\n *\n * Returns or sets the mouse coordinate types used to calculate the\n * movement of the pointer.\n *\n - newValue (string) #optional Use 'client' if you will be scrolling while interacting; Use 'page' if you want autoScroll to work\n = (string | object) The current deltaSource or this Interactable\n \\*/\n deltaSource (newValue) {\n if (newValue === 'page' || newValue === 'client') {\n this.options.deltaSource = newValue;\n\n return this;\n }\n\n return this.options.deltaSource;\n }\n\n /*\\\n * Interactable.context\n [ method ]\n *\n * Gets the selector context Node of the Interactable. The default is `window.document`.\n *\n = (Node) The context Node of this Interactable\n **\n \\*/\n context () {\n return this._context;\n }\n\n inContext (element) {\n return (this._context === element.ownerDocument\n || nodeContains(this._context, element));\n }\n\n /*\\\n * Interactable.fire\n [ method ]\n *\n * Calls listeners for the given InteractEvent type bound globally\n * and directly to this Interactable\n *\n - iEvent (InteractEvent) The InteractEvent object to be fired on this Interactable\n = (Interactable) this Interactable\n \\*/\n fire (iEvent) {\n this.events.fire(iEvent);\n\n return this;\n }\n\n _onOffMultiple (method, eventType, listener, options) {\n if (is.string(eventType) && eventType.search(' ') !== -1) {\n eventType = eventType.trim().split(/ +/);\n }\n\n if (is.array(eventType)) {\n for (let i = 0; i < eventType.length; i++) {\n this[method](eventType[i], listener, options);\n }\n\n return true;\n }\n\n if (is.object(eventType)) {\n for (const prop in eventType) {\n this[method](prop, eventType[prop], listener);\n }\n\n return true;\n }\n }\n\n /*\\\n * Interactable.on\n [ method ]\n *\n * Binds a listener for an InteractEvent, pointerEvent or DOM event.\n *\n - eventType (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) This Interactable\n \\*/\n on (eventType, listener, options) {\n if (this._onOffMultiple('on', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.on(eventType, listener);\n }\n // delegated event for selector\n else if (is.string(this.target)) {\n events.addDelegate(this.target, this._context, eventType, listener, options);\n }\n else {\n events.add(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.off\n [ method ]\n *\n * Removes an InteractEvent, pointerEvent or DOM event listener\n *\n - eventType (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) This Interactable\n \\*/\n off (eventType, listener, options) {\n if (this._onOffMultiple('off', eventType, listener, options)) {\n return this;\n }\n\n if (eventType === 'wheel') { eventType = wheelEvent; }\n\n // if it is an action event type\n if (contains(Interactable.eventTypes, eventType)) {\n this.events.off(eventType, listener);\n }\n // delegated event\n else if (is.string(this.target)) {\n events.removeDelegate(this.target, this._context, eventType, listener, options);\n }\n // remove listener from this Interatable's element\n else {\n events.remove(this.target, eventType, listener, options);\n }\n\n return this;\n }\n\n /*\\\n * Interactable.set\n [ method ]\n *\n * Reset the options of this Interactable\n - options (object) The new settings to apply\n = (object) This Interactable\n \\*/\n set (options) {\n if (!is.object(options)) {\n options = {};\n }\n\n this.options = extend({}, defaults.base);\n\n const perActions = extend({}, defaults.perAction);\n\n for (const actionName in actions.methodDict) {\n const methodName = actions.methodDict[actionName];\n\n this.options[actionName] = extend({}, defaults[actionName]);\n\n this.setPerAction(actionName, perActions);\n\n this[methodName](options[actionName]);\n }\n\n for (const setting of Interactable.settingsMethods) {\n this.options[setting] = defaults.base[setting];\n\n if (setting in options) {\n this[setting](options[setting]);\n }\n }\n\n signals.fire('set', {\n options,\n interactable: this,\n });\n\n return this;\n }\n\n /*\\\n * Interactable.unset\n [ method ]\n *\n * Remove this interactable from the list of interactables and remove\n * it's action capabilities and event listeners\n *\n = (object) @interact\n \\*/\n unset () {\n events.remove(this.target, 'all');\n\n if (is.string(this.target)) {\n // remove delegated events\n for (const type in events.delegatedEvents) {\n const delegated = events.delegatedEvents[type];\n\n if (delegated.selectors[0] === this.target\n && delegated.contexts[0] === this._context) {\n\n delegated.selectors.splice(0, 1);\n delegated.contexts .splice(0, 1);\n delegated.listeners.splice(0, 1);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegated[type] = null;\n }\n }\n\n events.remove(this._context, type, events.delegateListener);\n events.remove(this._context, type, events.delegateUseCapture, true);\n }\n }\n else {\n events.remove(this, 'all');\n }\n\n signals.fire('unset', { interactable: this });\n\n scope.interactables.splice(indexOf(scope.interactables, this), 1);\n\n // Stop related interactions when an Interactable is unset\n for (const interaction of scope.interactions || []) {\n if (interaction.target === this && interaction.interacting()) {\n interaction.stop();\n }\n }\n\n return scope.interact;\n }\n}\n\nscope.interactables.indexOfElement = function indexOfElement (target, context) {\n context = context || scope.document;\n\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n if (interactable.target === target && interactable._context === context) {\n return i;\n }\n }\n return -1;\n};\n\nscope.interactables.get = function interactableGet (element, options, dontCheckInContext) {\n const ret = this[this.indexOfElement(element, options && options.context)];\n\n return ret && (is.string(element) || dontCheckInContext || ret.inContext(element))? ret : null;\n};\n\nscope.interactables.forEachSelector = function (callback, element) {\n for (let i = 0; i < this.length; i++) {\n const interactable = this[i];\n\n // skip non CSS selector targets and out of context elements\n if (!is.string(interactable.target)\n || (element && !interactable.inContext(element))) {\n continue;\n }\n\n const ret = callback(interactable, interactable.target, interactable._context, i, this);\n\n if (ret !== undefined) {\n return ret;\n }\n }\n};\n\n// all interact.js eventTypes\nInteractable.eventTypes = scope.eventTypes = [];\n\nInteractable.signals = signals;\n\nInteractable.settingsMethods = [ 'deltaSource', 'origin', 'preventDefault', 'rectChecker' ];\n\nmodule.exports = Interactable;\n","const scope = require('./scope');\nconst utils = require('./utils');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst domObjects = require('./utils/domObjects');\nconst finder = require('./utils/interactionFinder');\nconst signals = require('./utils/Signals').new();\n\nconst listeners = {};\nconst methodNames = [\n 'pointerDown', 'pointerMove', 'pointerUp',\n 'updatePointer', 'removePointer',\n];\n\n// for ignoring browser's simulated mouse events\nlet prevTouchTime = 0;\n\n// all active and idle interactions\nscope.interactions = [];\n\nclass Interaction {\n constructor ({ pointerType }) {\n this.target = null; // current interactable being interacted with\n this.element = null; // the target element of the interactable\n\n this.prepared = { // action that's ready to be fired on next move event\n name : null,\n axis : null,\n edges: null,\n };\n\n // keep track of added pointers\n this.pointers = [];\n this.pointerIds = [];\n this.downTargets = [];\n this.downTimes = [];\n\n // Previous native pointer move event coordinates\n this.prevCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n // current native pointer move event coordinates\n this.curCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Starting InteractEvent pointer coordinates\n this.startCoords = {\n page : { x: 0, y: 0 },\n client : { x: 0, y: 0 },\n timeStamp: 0,\n };\n\n // Change in coordinates and time of the pointer\n this.pointerDelta = {\n page : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n client : { x: 0, y: 0, vx: 0, vy: 0, speed: 0 },\n timeStamp: 0,\n };\n\n this.downEvent = null; // pointerdown/mousedown/touchstart event\n this.downPointer = {};\n\n this._eventTarget = null;\n this._curEventTarget = null;\n\n this.prevEvent = null; // previous action event\n\n this.pointerIsDown = false;\n this.pointerWasMoved = false;\n this._interacting = false;\n\n this.pointerType = pointerType;\n\n signals.fire('new', this);\n\n scope.interactions.push(this);\n }\n\n pointerDown (pointer, event, eventTarget) {\n const pointerIndex = this.updatePointer(pointer, event, true);\n\n signals.fire('down', {\n pointer,\n event,\n eventTarget,\n pointerIndex,\n interaction: this,\n });\n }\n\n /*\\\n * Interaction.start\n [ method ]\n *\n * Start an action with the given Interactable and Element as tartgets. The\n * action must be enabled for the target Interactable and an appropriate number\n * of pointers must be held down - 1 for drag/resize, 2 for gesture.\n *\n * Use it with `interactable.able({ manualStart: false })` to always\n * [start actions manually](https://github.com/taye/interact.js/issues/114)\n *\n - action (object) The action to be performed - drag, resize, etc.\n - target (Interactable) The Interactable to target\n - element (Element) The DOM Element to target\n = (object) interact\n **\n | interact(target)\n | .draggable({\n | // disable the default drag start by down->move\n | manualStart: true\n | })\n | // start dragging after the user holds the pointer down\n | .on('hold', function (event) {\n | var interaction = event.interaction;\n |\n | if (!interaction.interacting()) {\n | interaction.start({ name: 'drag' },\n | event.interactable,\n | event.currentTarget);\n | }\n | });\n \\*/\n start (action, target, element) {\n if (this.interacting()\n || !this.pointerIsDown\n || this.pointerIds.length < (action.name === 'gesture'? 2 : 1)) {\n return;\n }\n\n // if this interaction had been removed after stopping\n // add it back\n if (utils.indexOf(scope.interactions, this) === -1) {\n scope.interactions.push(this);\n }\n\n utils.copyAction(this.prepared, action);\n this.target = target;\n this.element = element;\n\n signals.fire('action-start', {\n interaction: this,\n event: this.downEvent,\n });\n }\n\n pointerMove (pointer, event, eventTarget) {\n if (!this.simulation) {\n this.updatePointer(pointer);\n utils.setCoords(this.curCoords, this.pointers);\n }\n\n const duplicateMove = (this.curCoords.page.x === this.prevCoords.page.x\n && this.curCoords.page.y === this.prevCoords.page.y\n && this.curCoords.client.x === this.prevCoords.client.x\n && this.curCoords.client.y === this.prevCoords.client.y);\n\n let dx;\n let dy;\n\n // register movement greater than pointerMoveTolerance\n if (this.pointerIsDown && !this.pointerWasMoved) {\n dx = this.curCoords.client.x - this.startCoords.client.x;\n dy = this.curCoords.client.y - this.startCoords.client.y;\n\n this.pointerWasMoved = utils.hypot(dx, dy) > Interaction.pointerMoveTolerance;\n }\n\n const signalArg = {\n pointer,\n pointerIndex: this.getPointerIndex(pointer),\n event,\n eventTarget,\n dx,\n dy,\n duplicate: duplicateMove,\n interaction: this,\n interactingBeforeMove: this.interacting(),\n };\n\n if (!duplicateMove) {\n // set pointer coordinate, time changes and speeds\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n }\n\n signals.fire('move', signalArg);\n\n if (!duplicateMove) {\n // if interacting, fire an 'action-move' signal etc\n if (this.interacting()) {\n this.doMove(signalArg);\n }\n\n if (this.pointerWasMoved) {\n utils.copyCoords(this.prevCoords, this.curCoords);\n }\n }\n }\n\n /*\\\n * Interaction.doMove\n [ method ]\n *\n * Force a move of the current action at the same coordinates. Useful if\n * snap/restrict has been changed and you want a movement with the new\n * settings.\n *\n **\n | interact(target)\n | .draggable(true)\n | .on('dragmove', function (event) {\n | if (someCondition) {\n | // change the snap settings\n | event.interactable.draggable({ snap: { targets: [] }});\n | // fire another move event with re-calculated snap\n | event.interaction.doMove();\n | }\n | });\n \\*/\n doMove (signalArg) {\n signalArg = utils.extend({\n pointer: this.pointers[0],\n event: this.prevEvent,\n eventTarget: this._eventTarget,\n interaction: this,\n }, signalArg || {});\n\n signals.fire('before-action-move', signalArg);\n\n if (!this._dontFireMove) {\n signals.fire('action-move', signalArg);\n }\n\n this._dontFireMove = false;\n }\n\n // End interact move events and stop auto-scroll unless simulation is running\n pointerUp (pointer, event, eventTarget, curEventTarget) {\n const pointerIndex = this.getPointerIndex(pointer);\n\n signals.fire(/cancel$/i.test(event.type)? 'cancel' : 'up', {\n pointer,\n pointerIndex,\n event,\n eventTarget,\n curEventTarget,\n interaction: this,\n });\n\n if (!this.simulation) {\n this.end(event);\n }\n\n this.pointerIsDown = false;\n this.removePointer(pointer, event);\n }\n\n /*\\\n * Interaction.end\n [ method ]\n *\n * Stop the current action and fire an end event. Inertial movement does\n * not happen.\n *\n - event (PointerEvent) #optional\n **\n | interact(target)\n | .draggable(true)\n | .on('move', function (event) {\n | if (event.pageX > 1000) {\n | // end the current action\n | event.interaction.end();\n | // stop all further listeners from being called\n | event.stopImmediatePropagation();\n | }\n | });\n \\*/\n end (event) {\n event = event || this.prevEvent;\n\n if (this.interacting()) {\n signals.fire('action-end', {\n event,\n interaction: this,\n });\n }\n\n this.stop();\n }\n\n currentAction () {\n return this._interacting? this.prepared.name: null;\n }\n\n interacting () {\n return this._interacting;\n }\n\n stop () {\n signals.fire('stop', { interaction: this });\n\n if (this._interacting) {\n signals.fire('stop-active', { interaction: this });\n signals.fire('stop-' + this.prepared.name, { interaction: this });\n }\n\n this.target = this.element = null;\n\n this._interacting = false;\n this.prepared.name = this.prevEvent = null;\n }\n\n getPointerIndex (pointer) {\n // mouse and pen interactions may have only one pointer\n if (this.pointerType === 'mouse' || this.pointerType === 'pen') {\n return 0;\n }\n\n return utils.indexOf(this.pointerIds, utils.getPointerId(pointer));\n }\n\n updatePointer (pointer, event, down = event && /(down|start)$/i.test(event.type)) {\n const id = utils.getPointerId(pointer);\n let index = this.getPointerIndex(pointer);\n\n if (index === -1) {\n index = this.pointerIds.length;\n this.pointerIds[index] = id;\n }\n\n if (down) {\n signals.fire('update-pointer-down', {\n pointer,\n event,\n down,\n pointerId: id,\n pointerIndex: index,\n interaction: this,\n });\n }\n\n this.pointers[index] = pointer;\n\n return index;\n }\n\n removePointer (pointer, event) {\n const index = this.getPointerIndex(pointer);\n\n if (index === -1) { return; }\n\n signals.fire('remove-pointer', {\n pointer,\n event,\n pointerIndex: index,\n interaction: this,\n });\n\n this.pointers .splice(index, 1);\n this.pointerIds .splice(index, 1);\n this.downTargets.splice(index, 1);\n this.downTimes .splice(index, 1);\n }\n\n _updateEventTargets (target, currentTarget) {\n this._eventTarget = target;\n this._curEventTarget = currentTarget;\n }\n}\n\nfor (let i = 0, len = methodNames.length; i < len; i++) {\n const method = methodNames[i];\n\n listeners[method] = doOnInteractions(method);\n}\n\nfunction doOnInteractions (method) {\n return (function (event) {\n const pointerType = utils.getPointerType(event);\n const [eventTarget, curEventTarget] = utils.getEventTargets(event);\n const matches = []; // [ [pointer, interaction], ...]\n\n if (browser.supportsTouch && /touch/.test(event.type)) {\n prevTouchTime = new Date().getTime();\n\n for (let i = 0; i < event.changedTouches.length; i++) {\n const pointer = event.changedTouches[i];\n const interaction = finder.search(pointer, event.type, eventTarget);\n\n matches.push([pointer, interaction || new Interaction({ pointerType })]);\n }\n }\n else {\n let invalidPointer = false;\n\n if (!browser.supportsPointerEvent && /mouse/.test(event.type)) {\n // ignore mouse events while touch interactions are active\n for (let i = 0; i < scope.interactions.length && !invalidPointer; i++) {\n invalidPointer = scope.interactions[i].pointerType !== 'mouse' && scope.interactions[i].pointerIsDown;\n }\n\n // try to ignore mouse events that are simulated by the browser\n // after a touch event\n invalidPointer = invalidPointer\n || (new Date().getTime() - prevTouchTime < 500)\n // on iOS and Firefox Mobile, MouseEvent.timeStamp is zero if simulated\n || event.timeStamp === 0;\n }\n\n if (!invalidPointer) {\n let interaction = finder.search(event, event.type, eventTarget);\n\n if (!interaction) {\n interaction = new Interaction({ pointerType });\n }\n\n matches.push([event, interaction]);\n }\n }\n\n for (const [pointer, interaction] of matches) {\n interaction._updateEventTargets(eventTarget, curEventTarget);\n interaction[method](pointer, event, eventTarget, curEventTarget);\n }\n });\n}\n\nfunction endAll (event) {\n for (let i = 0; i < scope.interactions.length; i++) {\n const interaction = scope.interactions[i];\n\n interaction.end(event);\n signals.fire('endall', { event, interaction });\n }\n}\n\nconst docEvents = { /* 'eventType': listenerFunc */ };\nconst pEventTypes = browser.pEventTypes;\n\nif (domObjects.PointerEvent) {\n docEvents[pEventTypes.down ] = listeners.pointerDown;\n docEvents[pEventTypes.move ] = listeners.pointerMove;\n docEvents[pEventTypes.up ] = listeners.pointerUp;\n docEvents[pEventTypes.cancel] = listeners.pointerUp;\n}\nelse {\n docEvents.mousedown = listeners.pointerDown;\n docEvents.mousemove = listeners.pointerMove;\n docEvents.mouseup = listeners.pointerUp;\n\n docEvents.touchstart = listeners.pointerDown;\n docEvents.touchmove = listeners.pointerMove;\n docEvents.touchend = listeners.pointerUp;\n docEvents.touchcancel = listeners.pointerUp;\n}\n\ndocEvents.blur = endAll;\n\nfunction onDocSignal ({ doc }, signalName) {\n const eventMethod = signalName.indexOf('add') === 0\n ? events.add : events.remove;\n\n // delegate event listener\n for (const eventType in scope.delegatedEvents) {\n eventMethod(doc, eventType, events.delegateListener);\n eventMethod(doc, eventType, events.delegateUseCapture, true);\n }\n\n for (const eventType in docEvents) {\n eventMethod(doc, eventType, docEvents[eventType]);\n }\n}\n\nsignals.on('update-pointer-down', ({ interaction, pointer, pointerId, pointerIndex, event, eventTarget, down }) => {\n interaction.pointerIds[pointerIndex] = pointerId;\n interaction.pointers[pointerIndex] = pointer;\n\n if (down) {\n interaction.pointerIsDown = true;\n }\n\n if (!interaction.interacting()) {\n utils.setCoords(interaction.startCoords, interaction.pointers);\n\n utils.copyCoords(interaction.curCoords , interaction.startCoords);\n utils.copyCoords(interaction.prevCoords, interaction.startCoords);\n\n interaction.downEvent = event;\n interaction.downTimes[pointerIndex] = interaction.curCoords.timeStamp;\n interaction.downTargets[pointerIndex] = eventTarget || event && utils.getEventTargets(event)[0];\n interaction.pointerWasMoved = false;\n\n utils.pointerExtend(interaction.downPointer, pointer);\n }\n});\n\nscope.signals.on('add-document' , onDocSignal);\nscope.signals.on('remove-document', onDocSignal);\n\nInteraction.pointerMoveTolerance = 1;\nInteraction.doOnInteractions = doOnInteractions;\nInteraction.endAll = endAll;\nInteraction.signals = signals;\nInteraction.docEvents = docEvents;\n\nscope.endAllInteractions = endAll;\n\nmodule.exports = Interaction;\n","const Interaction = require('../Interaction');\nconst InteractEvent = require('../InteractEvent');\n\nconst actions = {\n firePrepared,\n names: [],\n methodDict: {},\n};\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n interaction._interacting = true;\n firePrepared(interaction, event, 'start');\n});\n\nInteraction.signals.on('action-move', function ({ interaction, event, preEnd }) {\n firePrepared(interaction, event, 'move', preEnd);\n\n // if the action was ended in a listener\n if (!interaction.interacting()) { return false; }\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n firePrepared(interaction, event, 'end');\n});\n\nfunction firePrepared (interaction, event, phase, preEnd) {\n const actionName = interaction.prepared.name;\n\n const newEvent = new InteractEvent(interaction, event, actionName, phase, interaction.element, null, preEnd);\n\n interaction.target.fire(newEvent);\n interaction.prevEvent = newEvent;\n}\n\nmodule.exports = actions;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drag = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n startAxis : 'xy',\n lockAxis : 'xy',\n },\n\n checker: function (pointer, event, interactable) {\n const dragOptions = interactable.options.drag;\n\n return dragOptions.enabled\n ? { name: 'drag', axis: (dragOptions.lockAxis === 'start'\n ? dragOptions.startAxis\n : dragOptions.lockAxis)}\n : null;\n },\n\n getCursor: function () {\n return 'move';\n },\n};\n\nInteraction.signals.on('before-action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n interaction.curCoords.page.y = interaction.startCoords.page.y;\n interaction.curCoords.client.y = interaction.startCoords.client.y;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vx);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vx);\n interaction.pointerDelta.client.vy = 0;\n interaction.pointerDelta.page.vy = 0;\n }\n else if (axis === 'y') {\n interaction.curCoords.page.x = interaction.startCoords.page.x;\n interaction.curCoords.client.x = interaction.startCoords.client.x;\n\n interaction.pointerDelta.page.speed = Math.abs(interaction.pointerDelta.page.vy);\n interaction.pointerDelta.client.speed = Math.abs(interaction.pointerDelta.client.vy);\n interaction.pointerDelta.client.vx = 0;\n interaction.pointerDelta.page.vx = 0;\n }\n});\n\n// dragmove\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'dragmove') { return; }\n\n const axis = interaction.prepared.axis;\n\n if (axis === 'x') {\n iEvent.pageY = interaction.startCoords.page.y;\n iEvent.clientY = interaction.startCoords.client.y;\n iEvent.dy = 0;\n }\n else if (axis === 'y') {\n iEvent.pageX = interaction.startCoords.page.x;\n iEvent.clientX = interaction.startCoords.client.x;\n iEvent.dx = 0;\n }\n});\n\n/*\\\n * Interactable.draggable\n [ method ]\n *\n * Gets or sets whether drag actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of drag events\n | var isDraggable = interact('ul li').draggable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on drag events (object makes the Interactable draggable)\n = (object) This Interactable\n | interact(element).draggable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // the axis in which the first movement must be\n | // for the drag sequence to start\n | // 'xy' by default - any direction\n | startAxis: 'x' || 'y' || 'xy',\n |\n | // 'xy' by default - don't restrict to one axis (move in any direction)\n | // 'x' or 'y' to restrict movement to either axis\n | // 'start' to restrict movement to the axis the drag started in\n | lockAxis: 'x' || 'y' || 'xy' || 'start',\n |\n | // max number of drags that can happen concurrently\n | // with elements of this Interactable. Infinity by default\n | max: Infinity,\n |\n | // max number of drags that can target the same element+Interactable\n | // 1 by default\n | maxPerElement: 2\n | });\n\\*/\nInteractable.prototype.draggable = function (options) {\n if (utils.is.object(options)) {\n this.options.drag.enabled = options.enabled === false? false: true;\n this.setPerAction('drag', options);\n this.setOnEvents('drag', options);\n\n if (/^(xy|x|y|start)$/.test(options.lockAxis)) {\n this.options.drag.lockAxis = options.lockAxis;\n }\n if (/^(xy|x|y)$/.test(options.startAxis)) {\n this.options.drag.startAxis = options.startAxis;\n }\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drag.enabled = options;\n\n if (!options) {\n this.ondragstart = this.ondragstart = this.ondragend = null;\n }\n\n return this;\n }\n\n return this.options.drag;\n};\n\nactions.drag = drag;\nactions.names.push('drag');\nutils.merge(Interactable.eventTypes, [\n 'dragstart',\n 'dragmove',\n 'draginertiastart',\n 'draginertiaresume',\n 'dragend',\n]);\nactions.methodDict.drag = 'draggable';\n\ndefaultOptions.drag = drag.defaults;\n\nmodule.exports = drag;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst scope = require('../scope');\nconst interact = require('../interact');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst drop = {\n defaults: {\n enabled: false,\n accept : null,\n overlap: 'pointer',\n },\n};\n\nlet dynamicDrop = false;\n\nInteraction.signals.on('action-start', function ({ interaction, event }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // reset active dropzones\n interaction.activeDrops.dropzones = [];\n interaction.activeDrops.elements = [];\n interaction.activeDrops.rects = [];\n\n interaction.dropEvents = null;\n\n if (!interaction.dynamicDrop) {\n setActiveDrops(interaction, interaction.element);\n }\n\n const dragEvent = interaction.prevEvent;\n const dropEvents = getDropEvents(interaction, event, dragEvent);\n\n if (dropEvents.activate) {\n fireActiveDrops(interaction, dropEvents.activate);\n }\n});\n\nInteractEvent.signals.on('new', function ({ interaction, iEvent, event }) {\n if (iEvent.type !== 'dragmove' && iEvent.type !== 'dragend') { return; }\n\n const draggableElement = interaction.element;\n const dragEvent = iEvent;\n const dropResult = getDrop(dragEvent, event, draggableElement);\n\n interaction.dropTarget = dropResult.dropzone;\n interaction.dropElement = dropResult.element;\n\n interaction.dropEvents = getDropEvents(interaction, event, dragEvent);\n});\n\nInteraction.signals.on('action-move', function ({ interaction }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n fireDropEvents(interaction, interaction.dropEvents);\n});\n\nInteraction.signals.on('action-end', function ({ interaction }) {\n if (interaction.prepared.name === 'drag') {\n fireDropEvents(interaction, interaction.dropEvents);\n }\n});\n\nInteraction.signals.on('stop-drag', function ({ interaction }) {\n interaction.activeDrops.dropzones =\n interaction.activeDrops.elements =\n interaction.activeDrops.rects =\n interaction.dropEvents = null;\n});\n\nfunction collectDrops (interaction, element) {\n const drops = [];\n const elements = [];\n\n element = element || interaction.element;\n\n // collect all dropzones and their elements which qualify for a drop\n for (const current of scope.interactables) {\n if (!current.options.drop.enabled) { continue; }\n\n const accept = current.options.drop.accept;\n\n // test the draggable element against the dropzone's accept setting\n if ((utils.is.element(accept) && accept !== element)\n || (utils.is.string(accept)\n && !utils.matchesSelector(element, accept))) {\n\n continue;\n }\n\n // query for new elements if necessary\n const dropElements = utils.is.string(current.target)\n ? current._context.querySelectorAll(current.target)\n : [current.target];\n\n for (let i = 0; i < dropElements.length; i++) {\n const currentElement = dropElements[i];\n\n if (currentElement !== element) {\n drops.push(current);\n elements.push(currentElement);\n }\n }\n }\n\n return {\n elements,\n dropzones: drops,\n };\n}\n\nfunction fireActiveDrops (interaction, event) {\n let prevElement;\n\n // loop through all active dropzones and trigger event\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n const current = interaction.activeDrops.dropzones[i];\n const currentElement = interaction.activeDrops.elements [i];\n\n // prevent trigger of duplicate events on same element\n if (currentElement !== prevElement) {\n // set current element as event target\n event.target = currentElement;\n current.fire(event);\n }\n prevElement = currentElement;\n }\n}\n\n// Collect a new set of possible drops and save them in activeDrops.\n// setActiveDrops should always be called when a drag has just started or a\n// drag event happens while dynamicDrop is true\nfunction setActiveDrops (interaction, dragElement) {\n // get dropzones and their elements that could receive the draggable\n const possibleDrops = collectDrops(interaction, dragElement, true);\n\n interaction.activeDrops.dropzones = possibleDrops.dropzones;\n interaction.activeDrops.elements = possibleDrops.elements;\n interaction.activeDrops.rects = [];\n\n for (let i = 0; i < interaction.activeDrops.dropzones.length; i++) {\n interaction.activeDrops.rects[i] =\n interaction.activeDrops.dropzones[i].getRect(interaction.activeDrops.elements[i]);\n }\n}\n\nfunction getDrop (dragEvent, event, dragElement) {\n const interaction = dragEvent.interaction;\n const validDrops = [];\n\n if (dynamicDrop) {\n setActiveDrops(interaction, dragElement);\n }\n\n // collect all dropzones and their elements which qualify for a drop\n for (let j = 0; j < interaction.activeDrops.dropzones.length; j++) {\n const current = interaction.activeDrops.dropzones[j];\n const currentElement = interaction.activeDrops.elements [j];\n const rect = interaction.activeDrops.rects [j];\n\n validDrops.push(current.dropCheck(dragEvent, event, interaction.target, dragElement, currentElement, rect)\n ? currentElement\n : null);\n }\n\n // get the most appropriate dropzone based on DOM depth and order\n const dropIndex = utils.indexOfDeepestElement(validDrops);\n\n return {\n dropzone: interaction.activeDrops.dropzones[dropIndex] || null,\n element : interaction.activeDrops.elements [dropIndex] || null,\n };\n}\n\nfunction getDropEvents (interaction, pointerEvent, dragEvent) {\n const dropEvents = {\n enter : null,\n leave : null,\n activate : null,\n deactivate: null,\n move : null,\n drop : null,\n };\n\n const tmpl = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n };\n\n if (interaction.dropElement !== interaction.prevDropElement) {\n // if there was a prevDropTarget, create a dragleave event\n if (interaction.prevDropTarget) {\n dropEvents.leave = utils.extend({ type: 'dragleave' }, tmpl);\n\n dragEvent.dragLeave = dropEvents.leave.target = interaction.prevDropElement;\n dragEvent.prevDropzone = dropEvents.leave.dropzone = interaction.prevDropTarget;\n }\n // if the dropTarget is not null, create a dragenter event\n if (interaction.dropTarget) {\n dropEvents.enter = {\n dragEvent,\n interaction,\n target : interaction.dropElement,\n dropzone : interaction.dropTarget,\n relatedTarget: dragEvent.target,\n draggable : dragEvent.interactable,\n timeStamp : dragEvent.timeStamp,\n type : 'dragenter',\n };\n\n dragEvent.dragEnter = interaction.dropElement;\n dragEvent.dropzone = interaction.dropTarget;\n }\n }\n\n if (dragEvent.type === 'dragend' && interaction.dropTarget) {\n dropEvents.drop = utils.extend({ type: 'drop' }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n dragEvent.relatedTarget = interaction.dropElement;\n }\n if (dragEvent.type === 'dragstart') {\n dropEvents.activate = utils.extend({ type: 'dropactivate' }, tmpl);\n\n dropEvents.activate.target = null;\n dropEvents.activate.dropzone = null;\n }\n if (dragEvent.type === 'dragend') {\n dropEvents.deactivate = utils.extend({ type: 'dropdeactivate' }, tmpl);\n\n dropEvents.deactivate.target = null;\n dropEvents.deactivate.dropzone = null;\n }\n if (dragEvent.type === 'dragmove' && interaction.dropTarget) {\n dropEvents.move = utils.extend({\n dragmove : dragEvent,\n type : 'dropmove',\n }, tmpl);\n\n dragEvent.dropzone = interaction.dropTarget;\n }\n\n return dropEvents;\n}\n\nfunction fireDropEvents (interaction, dropEvents) {\n if (dropEvents.leave) { interaction.prevDropTarget.fire(dropEvents.leave); }\n if (dropEvents.move ) { interaction.dropTarget.fire(dropEvents.move ); }\n if (dropEvents.enter) { interaction.dropTarget.fire(dropEvents.enter); }\n if (dropEvents.drop ) { interaction.dropTarget.fire(dropEvents.drop ); }\n if (dropEvents.deactivate) {\n fireActiveDrops(interaction, dropEvents.deactivate);\n }\n\n interaction.prevDropTarget = interaction.dropTarget;\n interaction.prevDropElement = interaction.dropElement;\n}\n\n/*\\\n * Interactable.dropzone\n [ method ]\n *\n * Returns or sets whether elements can be dropped onto this\n * Interactable to trigger drop events\n *\n * Dropzones can receive the following events:\n * - `dropactivate` and `dropdeactivate` when an acceptable drag starts and ends\n * - `dragenter` and `dragleave` when a draggable enters and leaves the dropzone\n * - `dragmove` when a draggable that has entered the dropzone is moved\n * - `drop` when a draggable is dropped into this dropzone\n *\n * Use the `accept` option to allow only elements that match the given CSS\n * selector or element. The value can be:\n *\n * - **an Element** - only that element can be dropped into this dropzone.\n * - **a string**, - the element being dragged must match it as a CSS selector.\n * - **`null`** - accept options is cleared - it accepts any element.\n *\n * Use the `overlap` option to set how drops are checked for. The allowed\n * values are:\n *\n * - `'pointer'`, the pointer must be over the dropzone (default)\n * - `'center'`, the draggable element's center must be over the dropzone\n * - a number from 0-1 which is the `(intersection area) / (draggable area)`.\n * e.g. `0.5` for drop to happen when half of the area of the draggable is\n * over the dropzone\n *\n * Use the `checker` option to specify a function to check if a dragged\n * element is over this Interactable.\n *\n | interact(target)\n | .dropChecker(function(dragEvent, // related dragmove or dragend event\n | event, // TouchEvent/PointerEvent/MouseEvent\n | dropped, // bool result of the default checker\n | dropzone, // dropzone Interactable\n | dropElement, // dropzone elemnt\n | draggable, // draggable Interactable\n | draggableElement) {// draggable element\n |\n | return dropped && event.target.hasAttribute('allow-drop');\n | }\n *\n *\n - options (boolean | object | null) #optional The new value to be set.\n | interact('.drop').dropzone({\n | accept: '.can-drop' || document.getElementById('single-drop'),\n | overlap: 'pointer' || 'center' || zeroToOne\n | }\n = (boolean | object) The current setting or this Interactable\n\\*/\nInteractable.prototype.dropzone = function (options) {\n if (utils.is.object(options)) {\n this.options.drop.enabled = options.enabled === false? false: true;\n\n if (utils.is.function(options.ondrop) ) { this.events.ondrop = options.ondrop ; }\n if (utils.is.function(options.ondropactivate) ) { this.events.ondropactivate = options.ondropactivate ; }\n if (utils.is.function(options.ondropdeactivate)) { this.events.ondropdeactivate = options.ondropdeactivate; }\n if (utils.is.function(options.ondragenter) ) { this.events.ondragenter = options.ondragenter ; }\n if (utils.is.function(options.ondragleave) ) { this.events.ondragleave = options.ondragleave ; }\n if (utils.is.function(options.ondropmove) ) { this.events.ondropmove = options.ondropmove ; }\n\n if (/^(pointer|center)$/.test(options.overlap)) {\n this.options.drop.overlap = options.overlap;\n }\n else if (utils.is.number(options.overlap)) {\n this.options.drop.overlap = Math.max(Math.min(1, options.overlap), 0);\n }\n if ('accept' in options) {\n this.options.drop.accept = options.accept;\n }\n if ('checker' in options) {\n this.options.drop.checker = options.checker;\n }\n\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.drop.enabled = options;\n\n if (!options) {\n this.ondragenter = this.ondragleave = this.ondrop\n = this.ondropactivate = this.ondropdeactivate = null;\n }\n\n return this;\n }\n\n return this.options.drop;\n};\n\nInteractable.prototype.dropCheck = function (dragEvent, event, draggable, draggableElement, dropElement, rect) {\n let dropped = false;\n\n // if the dropzone has no rect (eg. display: none)\n // call the custom dropChecker or just return false\n if (!(rect = rect || this.getRect(dropElement))) {\n return (this.options.drop.checker\n ? this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement)\n : false);\n }\n\n const dropOverlap = this.options.drop.overlap;\n\n if (dropOverlap === 'pointer') {\n const origin = utils.getOriginXY(draggable, draggableElement, 'drag');\n const page = utils.getPageXY(dragEvent);\n\n page.x += origin.x;\n page.y += origin.y;\n\n const horizontal = (page.x > rect.left) && (page.x < rect.right);\n const vertical = (page.y > rect.top ) && (page.y < rect.bottom);\n\n dropped = horizontal && vertical;\n }\n\n const dragRect = draggable.getRect(draggableElement);\n\n if (dragRect && dropOverlap === 'center') {\n const cx = dragRect.left + dragRect.width / 2;\n const cy = dragRect.top + dragRect.height / 2;\n\n dropped = cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom;\n }\n\n if (dragRect && utils.is.number(dropOverlap)) {\n const overlapArea = (Math.max(0, Math.min(rect.right , dragRect.right ) - Math.max(rect.left, dragRect.left))\n * Math.max(0, Math.min(rect.bottom, dragRect.bottom) - Math.max(rect.top , dragRect.top )));\n\n const overlapRatio = overlapArea / (dragRect.width * dragRect.height);\n\n dropped = overlapRatio >= dropOverlap;\n }\n\n if (this.options.drop.checker) {\n dropped = this.options.drop.checker(dragEvent, event, dropped, this, dropElement, draggable, draggableElement);\n }\n\n return dropped;\n};\n\nInteractable.signals.on('unset', function ({ interactable }) {\n interactable.dropzone(false);\n});\n\nInteractable.settingsMethods.push('dropChecker');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.dropTarget = null; // the dropzone a drag target might be dropped into\n interaction.dropElement = null; // the element at the time of checking\n interaction.prevDropTarget = null; // the dropzone that was recently dragged away from\n interaction.prevDropElement = null; // the element at the time of checking\n interaction.dropEvents = null; // the dropEvents related to the current drag event\n\n interaction.activeDrops = {\n dropzones: [], // the dropzones that are mentioned below\n elements : [], // elements of dropzones that accept the target draggable\n rects : [], // the rects of the elements mentioned above\n };\n\n});\n\nInteraction.signals.on('stop', function ({ interaction }) {\n interaction.dropTarget = interaction.dropElement =\n interaction.prevDropTarget = interaction.prevDropElement = null;\n});\n\n/*\\\n * interact.dynamicDrop\n [ method ]\n *\n * Returns or sets whether the dimensions of dropzone elements are\n * calculated on every dragmove or only on dragstart for the default\n * dropChecker\n *\n - newValue (boolean) #optional True to check on each move. False to check only before start\n = (boolean | interact) The current setting or interact\n\\*/\ninteract.dynamicDrop = function (newValue) {\n if (utils.is.bool(newValue)) {\n //if (dragging && dynamicDrop !== newValue && !newValue) {\n //calcRects(dropzones);\n //}\n\n dynamicDrop = newValue;\n\n return interact;\n }\n return dynamicDrop;\n};\n\nutils.merge(Interactable.eventTypes, [\n 'dragenter',\n 'dragleave',\n 'dropactivate',\n 'dropdeactivate',\n 'dropmove',\n 'drop',\n]);\nactions.methodDict.drop = 'dropzone';\n\ndefaultOptions.drop = drop.defaults;\n\nmodule.exports = drop;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\nconst gesture = {\n defaults: {\n enabled : false,\n origin : null,\n restrict: null,\n },\n\n checker: function (pointer, event, interactable, element, interaction) {\n if (interaction.pointerIds.length >= 2) {\n return { name: 'gesture' };\n }\n\n return null;\n },\n\n getCursor: function () {\n return '';\n },\n};\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturestart') { return; }\n iEvent.ds = 0;\n\n interaction.gesture.startDistance = interaction.gesture.prevDistance = iEvent.distance;\n interaction.gesture.startAngle = interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.scale = 1;\n});\n\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'gesturemove') { return; }\n\n iEvent.ds = iEvent.scale - interaction.gesture.scale;\n\n interaction.target.fire(iEvent);\n\n interaction.gesture.prevAngle = iEvent.angle;\n interaction.gesture.prevDistance = iEvent.distance;\n\n if (iEvent.scale !== Infinity\n && iEvent.scale !== null\n && iEvent.scale !== undefined\n && !isNaN(iEvent.scale)) {\n\n interaction.gesture.scale = iEvent.scale;\n }\n});\n\n/*\\\n * Interactable.gesturable\n [ method ]\n *\n * Gets or sets whether multitouch gestures can be performed on the\n * Interactable's element\n *\n = (boolean) Indicates if this can be the target of gesture events\n | var isGestureable = interact(element).gesturable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on gesture events (makes the Interactable gesturable)\n = (object) this Interactable\n | interact(element).gesturable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | // limit multiple gestures.\n | // See the explanation in @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n\\*/\nInteractable.prototype.gesturable = function (options) {\n if (utils.is.object(options)) {\n this.options.gesture.enabled = options.enabled === false? false: true;\n this.setPerAction('gesture', options);\n this.setOnEvents('gesture', options);\n\n return this;\n }\n\n if (utils.is.bool(options)) {\n this.options.gesture.enabled = options;\n\n if (!options) {\n this.ongesturestart = this.ongesturestart = this.ongestureend = null;\n }\n\n return this;\n }\n\n return this.options.gesture;\n};\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action, event, starting, ending, deltaSource }) {\n if (action !== 'gesture') { return; }\n\n const pointers = interaction.pointers;\n\n iEvent.touches = [pointers[0], pointers[1]];\n\n if (starting) {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = 1;\n iEvent.ds = 0;\n iEvent.angle = utils.touchAngle(pointers, undefined, deltaSource);\n iEvent.da = 0;\n }\n else if (ending || event instanceof InteractEvent) {\n iEvent.distance = interaction.prevEvent.distance;\n iEvent.box = interaction.prevEvent.box;\n iEvent.scale = interaction.prevEvent.scale;\n iEvent.ds = iEvent.scale - 1;\n iEvent.angle = interaction.prevEvent.angle;\n iEvent.da = iEvent.angle - interaction.gesture.startAngle;\n }\n else {\n iEvent.distance = utils.touchDistance(pointers, deltaSource);\n iEvent.box = utils.touchBBox(pointers);\n iEvent.scale = iEvent.distance / interaction.gesture.startDistance;\n iEvent.angle = utils.touchAngle(pointers, interaction.gesture.prevAngle, deltaSource);\n\n iEvent.ds = iEvent.scale - interaction.gesture.prevScale;\n iEvent.da = iEvent.angle - interaction.gesture.prevAngle;\n }\n});\n\nInteraction.signals.on('new', function (interaction) {\n interaction.gesture = {\n start: { x: 0, y: 0 },\n\n startDistance: 0, // distance between two touches of touchStart\n prevDistance : 0,\n distance : 0,\n\n scale: 1, // gesture.distance / gesture.startDistance\n\n startAngle: 0, // angle of line joining two touches\n prevAngle : 0, // angle of the previous gesture event\n };\n});\n\nactions.gesture = gesture;\nactions.names.push('gesture');\nutils.merge(Interactable.eventTypes, [\n 'gesturestart',\n 'gesturemove',\n 'gestureend',\n]);\nactions.methodDict.gesture = 'gesturable';\n\ndefaultOptions.gesture = gesture.defaults;\n\nmodule.exports = gesture;\n","const actions = require('./base');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst InteractEvent = require('../InteractEvent');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst defaultOptions = require('../defaultOptions');\n\n// Less Precision with touch input\nconst defaultMargin = browser.supportsTouch || browser.supportsPointerEvent? 20: 10;\n\nconst resize = {\n defaults: {\n enabled : false,\n mouseButtons: null,\n\n origin : null,\n snap : null,\n restrict : null,\n inertia : null,\n autoScroll: null,\n\n square: false,\n preserveAspectRatio: false,\n axis: 'xy',\n\n // use default margin\n margin: NaN,\n\n // object with props left, right, top, bottom which are\n // true/false values to resize when the pointer is over that edge,\n // CSS selectors to match the handles for each direction\n // or the Elements for each handle\n edges: null,\n\n // a value of 'none' will limit the resize rect to a minimum of 0x0\n // 'negate' will alow the rect to have negative width/height\n // 'reposition' will keep the width/height positive by swapping\n // the top and bottom edges and/or swapping the left and right edges\n invert: 'none',\n },\n\n checker: function (pointer, event, interactable, element, interaction, rect) {\n if (!rect) { return null; }\n\n const page = utils.extend({}, interaction.curCoords.page);\n const options = interactable.options;\n\n if (options.resize.enabled) {\n const resizeOptions = options.resize;\n const resizeEdges = { left: false, right: false, top: false, bottom: false };\n\n // if using resize.edges\n if (utils.is.object(resizeOptions.edges)) {\n for (const edge in resizeEdges) {\n resizeEdges[edge] = checkResizeEdge(edge,\n resizeOptions.edges[edge],\n page,\n interaction._eventTarget,\n element,\n rect,\n resizeOptions.margin || defaultMargin);\n }\n\n resizeEdges.left = resizeEdges.left && !resizeEdges.right;\n resizeEdges.top = resizeEdges.top && !resizeEdges.bottom;\n\n if (resizeEdges.left || resizeEdges.right || resizeEdges.top || resizeEdges.bottom) {\n return {\n name: 'resize',\n edges: resizeEdges,\n };\n }\n }\n else {\n const right = options.resize.axis !== 'y' && page.x > (rect.right - defaultMargin);\n const bottom = options.resize.axis !== 'x' && page.y > (rect.bottom - defaultMargin);\n\n if (right || bottom) {\n return {\n name: 'resize',\n axes: (right? 'x' : '') + (bottom? 'y' : ''),\n };\n }\n }\n }\n\n return null;\n },\n\n cursors: (browser.isIe9OrOlder ? {\n x : 'e-resize',\n y : 's-resize',\n xy: 'se-resize',\n\n top : 'n-resize',\n left : 'w-resize',\n bottom : 's-resize',\n right : 'e-resize',\n topleft : 'se-resize',\n bottomright: 'se-resize',\n topright : 'ne-resize',\n bottomleft : 'ne-resize',\n } : {\n x : 'ew-resize',\n y : 'ns-resize',\n xy: 'nwse-resize',\n\n top : 'ns-resize',\n left : 'ew-resize',\n bottom : 'ns-resize',\n right : 'ew-resize',\n topleft : 'nwse-resize',\n bottomright: 'nwse-resize',\n topright : 'nesw-resize',\n bottomleft : 'nesw-resize',\n }),\n\n getCursor: function (action) {\n if (action.axis) {\n return resize.cursors[action.name + action.axis];\n }\n else if (action.edges) {\n let cursorKey = '';\n const edgeNames = ['top', 'bottom', 'left', 'right'];\n\n for (let i = 0; i < 4; i++) {\n if (action.edges[edgeNames[i]]) {\n cursorKey += edgeNames[i];\n }\n }\n\n return resize.cursors[cursorKey];\n }\n },\n};\n\n// resizestart\nInteractEvent.signals.on('new', function ({ iEvent, interaction }) {\n if (iEvent.type !== 'resizestart' || !interaction.prepared.edges) {\n return;\n }\n\n const startRect = interaction.target.getRect(interaction.element);\n const resizeOptions = interaction.target.options.resize;\n\n /*\n * When using the `resizable.square` or `resizable.preserveAspectRatio` options, resizing from one edge\n * will affect another. E.g. with `resizable.square`, resizing to make the right edge larger will make\n * the bottom edge larger by the same amount. We call these 'linked' edges. Any linked edges will depend\n * on the active edges and the edge being interacted with.\n */\n if (resizeOptions.square || resizeOptions.preserveAspectRatio) {\n const linkedEdges = utils.extend({}, interaction.prepared.edges);\n\n linkedEdges.top = linkedEdges.top || (linkedEdges.left && !linkedEdges.bottom);\n linkedEdges.left = linkedEdges.left || (linkedEdges.top && !linkedEdges.right );\n linkedEdges.bottom = linkedEdges.bottom || (linkedEdges.right && !linkedEdges.top );\n linkedEdges.right = linkedEdges.right || (linkedEdges.bottom && !linkedEdges.left );\n\n interaction.prepared._linkedEdges = linkedEdges;\n }\n else {\n interaction.prepared._linkedEdges = null;\n }\n\n // if using `resizable.preserveAspectRatio` option, record aspect ratio at the start of the resize\n if (resizeOptions.preserveAspectRatio) {\n interaction.resizeStartAspectRatio = startRect.width / startRect.height;\n }\n\n interaction.resizeRects = {\n start : startRect,\n current : utils.extend({}, startRect),\n inverted : utils.extend({}, startRect),\n previous : utils.extend({}, startRect),\n delta : {\n left: 0, right : 0, width : 0,\n top : 0, bottom: 0, height: 0,\n },\n };\n\n iEvent.rect = interaction.resizeRects.inverted;\n iEvent.deltaRect = interaction.resizeRects.delta;\n});\n\n// resizemove\nInteractEvent.signals.on('new', function ({ iEvent, phase, interaction }) {\n if (phase !== 'move' || !interaction.prepared.edges) { return; }\n\n const resizeOptions = interaction.target.options.resize;\n const invert = resizeOptions.invert;\n const invertible = invert === 'reposition' || invert === 'negate';\n\n let edges = interaction.prepared.edges;\n\n const start = interaction.resizeRects.start;\n const current = interaction.resizeRects.current;\n const inverted = interaction.resizeRects.inverted;\n const delta = interaction.resizeRects.delta;\n const previous = utils.extend(interaction.resizeRects.previous, inverted);\n const originalEdges = edges;\n\n let dx = iEvent.dx;\n let dy = iEvent.dy;\n\n if (resizeOptions.preserveAspectRatio || resizeOptions.square) {\n // `resize.preserveAspectRatio` takes precedence over `resize.square`\n const startAspectRatio = resizeOptions.preserveAspectRatio\n ? interaction.resizeStartAspectRatio\n : 1;\n\n edges = interaction.prepared._linkedEdges;\n\n if ((originalEdges.left && originalEdges.bottom)\n || (originalEdges.right && originalEdges.top)) {\n dy = -dx / startAspectRatio;\n }\n else if (originalEdges.left || originalEdges.right ) { dy = dx / startAspectRatio; }\n else if (originalEdges.top || originalEdges.bottom) { dx = dy * startAspectRatio; }\n }\n\n // update the 'current' rect without modifications\n if (edges.top ) { current.top += dy; }\n if (edges.bottom) { current.bottom += dy; }\n if (edges.left ) { current.left += dx; }\n if (edges.right ) { current.right += dx; }\n\n if (invertible) {\n // if invertible, copy the current rect\n utils.extend(inverted, current);\n\n if (invert === 'reposition') {\n // swap edge values if necessary to keep width/height positive\n let swap;\n\n if (inverted.top > inverted.bottom) {\n swap = inverted.top;\n\n inverted.top = inverted.bottom;\n inverted.bottom = swap;\n }\n if (inverted.left > inverted.right) {\n swap = inverted.left;\n\n inverted.left = inverted.right;\n inverted.right = swap;\n }\n }\n }\n else {\n // if not invertible, restrict to minimum of 0x0 rect\n inverted.top = Math.min(current.top, start.bottom);\n inverted.bottom = Math.max(current.bottom, start.top);\n inverted.left = Math.min(current.left, start.right);\n inverted.right = Math.max(current.right, start.left);\n }\n\n inverted.width = inverted.right - inverted.left;\n inverted.height = inverted.bottom - inverted.top ;\n\n for (const edge in inverted) {\n delta[edge] = inverted[edge] - previous[edge];\n }\n\n iEvent.edges = interaction.prepared.edges;\n iEvent.rect = inverted;\n iEvent.deltaRect = delta;\n});\n\n/*\\\n * Interactable.resizable\n [ method ]\n *\n * Gets or sets whether resize actions can be performed on the\n * Interactable\n *\n = (boolean) Indicates if this can be the target of resize elements\n | var isResizeable = interact('input[type=text]').resizable();\n * or\n - options (boolean | object) #optional true/false or An object with event listeners to be fired on resize events (object makes the Interactable resizable)\n = (object) This Interactable\n | interact(element).resizable({\n | onstart: function (event) {},\n | onmove : function (event) {},\n | onend : function (event) {},\n |\n | edges: {\n | top : true, // Use pointer coords to check for resize.\n | left : false, // Disable resizing from left edge.\n | bottom: '.resize-s',// Resize if pointer target matches selector\n | right : handleEl // Resize if pointer target is the given Element\n | },\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height are adjusted at a 1:1 ratio.\n | square: false,\n |\n | // Width and height can be adjusted independently. When `true`, width and\n | // height maintain the aspect ratio they had when resizing started.\n | preserveAspectRatio: false,\n |\n | // a value of 'none' will limit the resize rect to a minimum of 0x0\n | // 'negate' will allow the rect to have negative width/height\n | // 'reposition' will keep the width/height positive by swapping\n | // the top and bottom edges and/or swapping the left and right edges\n | invert: 'none' || 'negate' || 'reposition'\n |\n | // limit multiple resizes.\n | // See the explanation in the @Interactable.draggable example\n | max: Infinity,\n | maxPerElement: 1,\n | });\n \\*/\nInteractable.prototype.resizable = function (options) {\n if (utils.is.object(options)) {\n this.options.resize.enabled = options.enabled === false? false: true;\n this.setPerAction('resize', options);\n this.setOnEvents('resize', options);\n\n if (/^x$|^y$|^xy$/.test(options.axis)) {\n this.options.resize.axis = options.axis;\n }\n else if (options.axis === null) {\n this.options.resize.axis = defaultOptions.resize.axis;\n }\n\n if (utils.is.bool(options.preserveAspectRatio)) {\n this.options.resize.preserveAspectRatio = options.preserveAspectRatio;\n }\n else if (utils.is.bool(options.square)) {\n this.options.resize.square = options.square;\n }\n\n return this;\n }\n if (utils.is.bool(options)) {\n this.options.resize.enabled = options;\n\n if (!options) {\n this.onresizestart = this.onresizestart = this.onresizeend = null;\n }\n\n return this;\n }\n return this.options.resize;\n};\n\nfunction checkResizeEdge (name, value, page, element, interactableElement, rect, margin) {\n // false, '', undefined, null\n if (!value) { return false; }\n\n // true value, use pointer coords and element rect\n if (value === true) {\n // if dimensions are negative, \"switch\" edges\n const width = utils.is.number(rect.width )? rect.width : rect.right - rect.left;\n const height = utils.is.number(rect.height)? rect.height : rect.bottom - rect.top ;\n\n if (width < 0) {\n if (name === 'left' ) { name = 'right'; }\n else if (name === 'right') { name = 'left' ; }\n }\n if (height < 0) {\n if (name === 'top' ) { name = 'bottom'; }\n else if (name === 'bottom') { name = 'top' ; }\n }\n\n if (name === 'left' ) { return page.x < ((width >= 0? rect.left: rect.right ) + margin); }\n if (name === 'top' ) { return page.y < ((height >= 0? rect.top : rect.bottom) + margin); }\n\n if (name === 'right' ) { return page.x > ((width >= 0? rect.right : rect.left) - margin); }\n if (name === 'bottom') { return page.y > ((height >= 0? rect.bottom: rect.top ) - margin); }\n }\n\n // the remaining checks require an element\n if (!utils.is.element(element)) { return false; }\n\n return utils.is.element(value)\n // the value is an element to use as a resize handle\n ? value === element\n // otherwise check if element matches value as selector\n : utils.matchesUpTo(element, value, interactableElement);\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.resizeAxes = 'xy';\n});\n\nInteractEvent.signals.on('set-delta', function ({ interaction, iEvent, action }) {\n if (action !== 'resize' || !interaction.resizeAxes) { return; }\n\n const options = interaction.target.options;\n\n if (options.resize.square) {\n if (interaction.resizeAxes === 'y') {\n iEvent.dx = iEvent.dy;\n }\n else {\n iEvent.dy = iEvent.dx;\n }\n iEvent.axes = 'xy';\n }\n else {\n iEvent.axes = interaction.resizeAxes;\n\n if (interaction.resizeAxes === 'x') {\n iEvent.dy = 0;\n }\n else if (interaction.resizeAxes === 'y') {\n iEvent.dx = 0;\n }\n }\n});\n\nactions.resize = resize;\nactions.names.push('resize');\nutils.merge(Interactable.eventTypes, [\n 'resizestart',\n 'resizemove',\n 'resizeinertiastart',\n 'resizeinertiaresume',\n 'resizeend',\n]);\nactions.methodDict.resize = 'resizable';\n\ndefaultOptions.resize = resize.defaults;\n\nmodule.exports = resize;\n","const raf = require('./utils/raf');\nconst getWindow = require('./utils/window').getWindow;\nconst is = require('./utils/is');\nconst domUtils = require('./utils/domUtils');\nconst Interaction = require('./Interaction');\nconst defaultOptions = require('./defaultOptions');\n\nconst autoScroll = {\n defaults: {\n enabled : false,\n container: null, // the item that is scrolled (Window or HTMLElement)\n margin : 60,\n speed : 300, // the scroll speed in pixels per second\n },\n\n interaction: null,\n i: null, // the handle returned by window.setInterval\n x: 0, y: 0, // Direction each pulse is to scroll in\n\n isScrolling: false,\n prevTime: 0,\n\n start: function (interaction) {\n autoScroll.isScrolling = true;\n raf.cancel(autoScroll.i);\n\n autoScroll.interaction = interaction;\n autoScroll.prevTime = new Date().getTime();\n autoScroll.i = raf.request(autoScroll.scroll);\n },\n\n stop: function () {\n autoScroll.isScrolling = false;\n raf.cancel(autoScroll.i);\n },\n\n // scroll the window by the values in scroll.x/y\n scroll: function () {\n const options = autoScroll.interaction.target.options[autoScroll.interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(autoScroll.interaction.element);\n const now = new Date().getTime();\n // change in time in seconds\n const dt = (now - autoScroll.prevTime) / 1000;\n // displacement\n const s = options.speed * dt;\n\n if (s >= 1) {\n if (is.window(container)) {\n container.scrollBy(autoScroll.x * s, autoScroll.y * s);\n }\n else if (container) {\n container.scrollLeft += autoScroll.x * s;\n container.scrollTop += autoScroll.y * s;\n }\n\n autoScroll.prevTime = now;\n }\n\n if (autoScroll.isScrolling) {\n raf.cancel(autoScroll.i);\n autoScroll.i = raf.request(autoScroll.scroll);\n }\n },\n check: function (interactable, actionName) {\n const options = interactable.options;\n\n return options[actionName].autoScroll && options[actionName].autoScroll.enabled;\n },\n onInteractionMove: function ({ interaction, pointer }) {\n if (!(interaction.interacting()\n && autoScroll.check(interaction.target, interaction.prepared.name))) {\n return;\n }\n\n if (interaction.simulation) {\n autoScroll.x = autoScroll.y = 0;\n return;\n }\n\n let top;\n let right;\n let bottom;\n let left;\n\n const options = interaction.target.options[interaction.prepared.name].autoScroll;\n const container = options.container || getWindow(interaction.element);\n\n if (is.window(container)) {\n left = pointer.clientX < autoScroll.margin;\n top = pointer.clientY < autoScroll.margin;\n right = pointer.clientX > container.innerWidth - autoScroll.margin;\n bottom = pointer.clientY > container.innerHeight - autoScroll.margin;\n }\n else {\n const rect = domUtils.getElementClientRect(container);\n\n left = pointer.clientX < rect.left + autoScroll.margin;\n top = pointer.clientY < rect.top + autoScroll.margin;\n right = pointer.clientX > rect.right - autoScroll.margin;\n bottom = pointer.clientY > rect.bottom - autoScroll.margin;\n }\n\n autoScroll.x = (right ? 1: left? -1: 0);\n autoScroll.y = (bottom? 1: top? -1: 0);\n\n if (!autoScroll.isScrolling) {\n // set the autoScroll properties to those of the target\n autoScroll.margin = options.margin;\n autoScroll.speed = options.speed;\n\n autoScroll.start(interaction);\n }\n },\n};\n\nInteraction.signals.on('stop-active', function () {\n autoScroll.stop();\n});\n\nInteraction.signals.on('action-move', autoScroll.onInteractionMove);\n\ndefaultOptions.perAction.autoScroll = autoScroll.defaults;\n\nmodule.exports = autoScroll;\n","const Interactable = require('../Interactable');\nconst actions = require('../actions/base');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.ignoreFrom\n [ method ]\n *\n * If the target of the `mousedown`, `pointerdown` or `touchstart`\n * event or any of it's parents match the given CSS selector or\n * Element, no drag/resize/gesture is started.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to not ignore any elements\n = (string | Element | object) The current ignoreFrom value or this Interactable\n **\n | interact(element, { ignoreFrom: document.getElementById('no-action') });\n | // or\n | interact(element).ignoreFrom('input, textarea, a');\n\\*/\nInteractable.prototype.ignoreFrom = function (newValue) {\n return this._backCompatOption('ignoreFrom', newValue);\n};\n\n/*\\\n * Interactable.allowFrom\n [ method ]\n *\n * A drag/resize/gesture is started only If the target of the\n * `mousedown`, `pointerdown` or `touchstart` event or any of it's\n * parents match the given CSS selector or Element.\n *\n - newValue (string | Element | null) #optional a CSS selector string, an Element or `null` to allow from any element\n = (string | Element | object) The current allowFrom value or this Interactable\n **\n | interact(element, { allowFrom: document.getElementById('drag-handle') });\n | // or\n | interact(element).allowFrom('.handle');\n\\*/\nInteractable.prototype.allowFrom = function (newValue) {\n return this._backCompatOption('allowFrom', newValue);\n};\n\nInteractable.prototype.testIgnore = function (ignoreFrom, interactableElement, element) {\n if (!ignoreFrom || !is.element(element)) { return false; }\n\n if (is.string(ignoreFrom)) {\n return domUtils.matchesUpTo(element, ignoreFrom, interactableElement);\n }\n else if (is.element(ignoreFrom)) {\n return domUtils.nodeContains(ignoreFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testAllow = function (allowFrom, interactableElement, element) {\n if (!allowFrom) { return true; }\n\n if (!is.element(element)) { return false; }\n\n if (is.string(allowFrom)) {\n return domUtils.matchesUpTo(element, allowFrom, interactableElement);\n }\n else if (is.element(allowFrom)) {\n return domUtils.nodeContains(allowFrom, element);\n }\n\n return false;\n};\n\nInteractable.prototype.testIgnoreAllow = function (options, interactableElement, eventTarget) {\n return (!this.testIgnore(options.ignoreFrom, interactableElement, eventTarget)\n && this.testAllow(options.allowFrom, interactableElement, eventTarget));\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (event.buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\n","const interact = require('../interact');\nconst Interactable = require('../Interactable');\nconst Interaction = require('../Interaction');\nconst actions = require('../actions/base');\nconst defaultOptions = require('../defaultOptions');\nconst browser = require('../utils/browser');\nconst scope = require('../scope');\nconst utils = require('../utils');\nconst signals = require('../utils/Signals').new();\n\nrequire('./InteractableMethods');\n\nconst autoStart = {\n signals,\n withinInteractionLimit,\n // Allow this many interactions to happen simultaneously\n maxInteractions: Infinity,\n defaults: {\n perAction: {\n manualStart: false,\n max: Infinity,\n maxPerElement: 1,\n allowFrom: null,\n ignoreFrom: null,\n },\n },\n setActionDefaults: function (action) {\n utils.extend(action.defaults, autoStart.defaults.perAction);\n },\n};\n\n// set cursor style on mousedown\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget }) {\n if (interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\n// set cursor style on mousemove\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget }) {\n if (!interaction.mouse\n || interaction.pointerIsDown\n || interaction.interacting()) { return; }\n\n const actionInfo = getActionInfo(interaction, pointer, event, eventTarget);\n prepare(interaction, actionInfo);\n});\n\nInteraction.signals.on('move', function (arg) {\n const { interaction, event } = arg;\n\n if (!interaction.pointerIsDown\n || interaction.interacting()\n || !interaction.pointerWasMoved\n || !interaction.prepared.name) {\n return;\n }\n\n signals.fire('before-start', arg);\n\n const target = interaction.target;\n\n if (interaction.prepared.name && target) {\n // check manualStart and interaction limit\n if (target.options[interaction.prepared.name].manualStart\n || !withinInteractionLimit(target, interaction.element, interaction.prepared)) {\n interaction.stop(event);\n }\n else {\n interaction.start(interaction.prepared, target, interaction.element);\n }\n }\n});\n\n// Check if the current target supports the action.\n// If so, return the validated action. Otherwise, return null\nfunction validateAction (action, interactable, element, eventTarget) {\n if (utils.is.object(action)\n && interactable.testIgnoreAllow(interactable.options[action.name], element, eventTarget)\n && interactable.options[action.name].enabled\n && withinInteractionLimit(interactable, element, action)) {\n return action;\n }\n\n return null;\n}\n\nfunction validateSelector (interaction, pointer, event, matches, matchElements, eventTarget) {\n for (let i = 0, len = matches.length; i < len; i++) {\n const match = matches[i];\n const matchElement = matchElements[i];\n const action = validateAction(match.getAction(pointer, event, interaction, matchElement),\n match,\n matchElement,\n eventTarget);\n\n if (action) {\n return {\n action,\n target: match,\n element: matchElement,\n };\n }\n }\n\n return {};\n}\n\nfunction getActionInfo (interaction, pointer, event, eventTarget) {\n let matches = [];\n let matchElements = [];\n\n let element = eventTarget;\n let action = null;\n\n function pushMatches (interactable, selector, context) {\n const elements = (browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined);\n\n if (utils.matchesSelector(element, selector, elements)) {\n\n matches.push(interactable);\n matchElements.push(element);\n }\n }\n\n while (utils.is.element(element)) {\n matches = [];\n matchElements = [];\n\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && (action = validateAction(elementInteractable.getAction(pointer, event, interaction, element, eventTarget),\n elementInteractable,\n element,\n eventTarget))\n && !elementInteractable.options[action.name].manualStart) {\n return {\n element,\n action,\n target: elementInteractable,\n };\n }\n else {\n scope.interactables.forEachSelector(pushMatches, element);\n\n const actionInfo = validateSelector(interaction, pointer, event, matches, matchElements, eventTarget);\n\n if (actionInfo.action\n && !actionInfo.target.options[actionInfo.action.name].manualStart) {\n return actionInfo;\n }\n }\n\n element = utils.parentNode(element);\n }\n\n return {};\n}\n\nfunction prepare (interaction, { action, target, element }) {\n action = action || {};\n\n if (interaction.target && interaction.target.options.styleCursor) {\n interaction.target._doc.documentElement.style.cursor = '';\n }\n\n interaction.target = target;\n interaction.element = element;\n utils.copyAction(interaction.prepared, action);\n\n if (target && target.options.styleCursor) {\n const cursor = action? actions[action.name].getCursor(action) : '';\n interaction.target._doc.documentElement.style.cursor = cursor;\n }\n\n signals.fire('prepared', { interaction: interaction });\n}\n\nInteraction.signals.on('stop', function ({ interaction }) {\n const target = interaction.target;\n\n if (target && target.options.styleCursor) {\n target._doc.documentElement.style.cursor = '';\n }\n});\n\nInteractable.prototype.getAction = function (pointer, event, interaction, element) {\n const action = this.defaultActionChecker(pointer, event, interaction, element);\n\n if (this.options.actionChecker) {\n return this.options.actionChecker(pointer, event, action, this, element, interaction);\n }\n\n return action;\n};\n\n/*\\\n * Interactable.actionChecker\n [ method ]\n *\n * Gets or sets the function used to check action to be performed on\n * pointerDown\n *\n - checker (function | null) #optional A function which takes a pointer event, defaultAction string, interactable, element and interaction as parameters and returns an object with name property 'drag' 'resize' or 'gesture' and optionally an `edges` object with boolean 'top', 'left', 'bottom' and right props.\n = (Function | Interactable) The checker function or this Interactable\n *\n | interact('.resize-drag')\n | .resizable(true)\n | .draggable(true)\n | .actionChecker(function (pointer, event, action, interactable, element, interaction) {\n |\n | if (interact.matchesSelector(event.target, '.drag-handle') {\n | // force drag with handle target\n | action.name = drag;\n | }\n | else {\n | // resize from the top and right edges\n | action.name = 'resize';\n | action.edges = { top: true, right: true };\n | }\n |\n | return action;\n | });\n\\*/\nInteractable.prototype.actionChecker = function (checker) {\n if (utils.is.function(checker)) {\n this.options.actionChecker = checker;\n\n return this;\n }\n\n if (checker === null) {\n delete this.options.actionChecker;\n\n return this;\n }\n\n return this.options.actionChecker;\n};\n\n/*\\\n * Interactable.styleCursor\n [ method ]\n *\n * Returns or sets whether the the cursor should be changed depending on the\n * action that would be performed if the mouse were pressed and dragged.\n *\n - newValue (boolean) #optional\n = (boolean | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.styleCursor = function (newValue) {\n if (utils.is.bool(newValue)) {\n this.options.styleCursor = newValue;\n\n return this;\n }\n\n if (newValue === null) {\n delete this.options.styleCursor;\n\n return this;\n }\n\n return this.options.styleCursor;\n};\n\nInteractable.prototype.defaultActionChecker = function (pointer, event, interaction, element) {\n const rect = this.getRect(element);\n const buttons = event.buttons || ({\n 0: 1,\n 1: 4,\n 3: 8,\n 4: 16,\n })[event.button];\n let action = null;\n\n for (const actionName of actions.names) {\n // check mouseButton setting if the pointer is down\n if (interaction.pointerIsDown\n && interaction.mouse\n && (buttons & this.options[actionName].mouseButtons) === 0) {\n continue;\n }\n\n action = actions[actionName].checker(pointer, event, this, element, interaction, rect);\n\n if (action) {\n return action;\n }\n }\n};\n\nfunction withinInteractionLimit (interactable, element, action) {\n const options = interactable.options;\n const maxActions = options[action.name].max;\n const maxPerElement = options[action.name].maxPerElement;\n let activeInteractions = 0;\n let targetCount = 0;\n let targetElementCount = 0;\n\n // no actions if any of these values == 0\n if (!(maxActions && maxPerElement && autoStart.maxInteractions)) { return; }\n\n for (let i = 0, len = scope.interactions.length; i < len; i++) {\n const interaction = scope.interactions[i];\n const otherAction = interaction.prepared.name;\n\n if (!interaction.interacting()) { continue; }\n\n activeInteractions++;\n\n if (activeInteractions >= autoStart.maxInteractions) {\n return false;\n }\n\n if (interaction.target !== interactable) { continue; }\n\n targetCount += (otherAction === action.name)|0;\n\n if (targetCount >= maxActions) {\n return false;\n }\n\n if (interaction.element === element) {\n targetElementCount++;\n\n if (otherAction !== action.name || targetElementCount >= maxPerElement) {\n return false;\n }\n }\n }\n\n return autoStart.maxInteractions > 0;\n}\n\n/*\\\n * interact.maxInteractions\n [ method ]\n **\n * Returns or sets the maximum number of concurrent interactions allowed.\n * By default only 1 interaction is allowed at a time (for backwards\n * compatibility). To allow multiple interactions on the same Interactables\n * and elements, you need to enable it in the draggable, resizable and\n * gesturable `'max'` and `'maxPerElement'` options.\n **\n - newValue (number) #optional Any number. newValue <= 0 means no interactions.\n\\*/\ninteract.maxInteractions = function (newValue) {\n if (utils.is.number(newValue)) {\n autoStart.maxInteractions = newValue;\n\n return this;\n }\n\n return autoStart.maxInteractions;\n};\n\nInteractable.settingsMethods.push('styleCursor');\nInteractable.settingsMethods.push('actionChecker');\nInteractable.settingsMethods.push('ignoreFrom');\nInteractable.settingsMethods.push('allowFrom');\n\ndefaultOptions.base.actionChecker = null;\ndefaultOptions.base.styleCursor = true;\n\nutils.extend(defaultOptions.perAction, autoStart.defaults.perAction);\n\nmodule.exports = autoStart;\n","const autoStart = require('./base');\nconst Interaction = require('../Interaction');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.delayTimer = null;\n});\n\nautoStart.signals.on('prepared', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.delayTimer = setTimeout(() => {\n interaction.start(interaction.prepared, interaction.target, interaction.element);\n }, delay);\n }\n});\n\nInteraction.signals.on('move', function ({ interaction, duplicate }) {\n if (interaction.pointerWasMoved && !duplicate) {\n clearTimeout(interaction.delayTimer);\n }\n});\n\n// prevent regular down->move autoStart\nautoStart.signals.on('before-start', function ({ interaction }) {\n const actionName = interaction.prepared.name;\n\n if (!actionName) { return; }\n\n const delay = interaction.target.options[actionName].delay;\n\n if (delay > 0) {\n interaction.prepared.name = null;\n }\n});\n","const autoStart = require('./base');\nconst scope = require('../scope');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\n\nconst { matchesSelector, parentNode } = require('../utils/domUtils');\n\nautoStart.setActionDefaults(require('../actions/drag'));\n\nautoStart.signals.on('before-start', function ({ interaction, eventTarget, dx, dy }) {\n if (interaction.prepared.name !== 'drag') { return; }\n\n // check if a drag is in the correct axis\n const absX = Math.abs(dx);\n const absY = Math.abs(dy);\n const options = interaction.target.options.drag;\n const startAxis = options.startAxis;\n const currentAxis = (absX > absY ? 'x' : absX < absY ? 'y' : 'xy');\n\n interaction.prepared.axis = options.lockAxis === 'start'\n ? currentAxis[0] // always lock to one axis even if currentAxis === 'xy'\n : options.lockAxis;\n\n // if the movement isn't in the startAxis of the interactable\n if (currentAxis !== 'xy' && startAxis !== 'xy' && startAxis !== currentAxis) {\n // cancel the prepared action\n interaction.prepared.name = null;\n\n // then try to get a drag from another ineractable\n\n if (!interaction.prepared.name) {\n\n let element = eventTarget;\n\n const getDraggable = function (interactable, selector, context) {\n const elements = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n if (interactable === interaction.target) { return; }\n\n if (!options.manualStart\n && !interactable.testIgnoreAllow(options, element, eventTarget)\n && matchesSelector(element, selector, elements)) {\n\n const action = interactable.getAction(interaction.downPointer,\n interaction.downEvent,\n interaction,\n element);\n\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, interactable)\n && autoStart.validateAction(action, interactable, element, eventTarget)) {\n\n return interactable;\n }\n }\n };\n\n let action = null;\n\n // check all interactables\n while (is.element(element)) {\n const elementInteractable = scope.interactables.get(element);\n\n if (elementInteractable\n && elementInteractable !== interaction.target\n && !elementInteractable.options.drag.manualStart) {\n\n action = elementInteractable.getAction(interaction.downPointer, interaction.downEvent, interaction, element);\n }\n if (action\n && action.name === 'drag'\n && checkStartAxis(currentAxis, elementInteractable)) {\n\n interaction.prepared.name = 'drag';\n interaction.target = elementInteractable;\n interaction.element = element;\n break;\n }\n\n const selectorInteractable = scope.interactables.forEachSelector(getDraggable, element);\n\n if (selectorInteractable) {\n interaction.prepared.name = 'drag';\n interaction.target = selectorInteractable;\n interaction.element = element;\n break;\n }\n\n element = parentNode(element);\n }\n }\n }\n});\n\nfunction checkStartAxis (startAxis, interactable) {\n if (!interactable) { return false; }\n\n const thisAxis = interactable.options.drag.startAxis;\n\n return (startAxis === 'xy' || thisAxis === 'xy' || thisAxis === startAxis);\n}\n","require('./base').setActionDefaults(require('../actions/gesture'));\n","require('./base').setActionDefaults(require('../actions/resize'));\n","module.exports = {\n base: {\n accept : null,\n preventDefault: 'auto',\n deltaSource : 'page',\n },\n\n perAction: {\n origin: { x: 0, y: 0 },\n\n // only allow left button by default\n // see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons#Return_value\n mouseButtons: 1,\n\n inertia: {\n enabled : false,\n resistance : 10, // the lambda in exponential decay\n minSpeed : 100, // target speed must be above this for inertia to start\n endSpeed : 10, // the speed at which inertia is slow enough to stop\n allowResume : true, // allow resuming an action in inertia phase\n smoothEndDuration: 300, // animate to snap/restrict endOnly if there's no inertia\n },\n },\n};\n","/* browser entry point */\n\n// Legacy browser support\nrequire('./legacyBrowsers');\n\n// inertia\nrequire('./inertia');\n\n// modifiers\nrequire('./modifiers/snap');\nrequire('./modifiers/restrict');\n\n// pointerEvents\nrequire('./pointerEvents/base');\nrequire('./pointerEvents/holdRepeat');\nrequire('./pointerEvents/interactableTargets');\n\n// delay\nrequire('./autoStart/delay');\n\n// actions\nrequire('./actions/gesture');\nrequire('./actions/resize');\nrequire('./actions/drag');\nrequire('./actions/drop');\n\n// load these modifiers after resize is loaded\nrequire('./modifiers/snapSize');\nrequire('./modifiers/restrictEdges');\nrequire('./modifiers/restrictSize');\n\n// autoStart actions\nrequire('./autoStart/gesture');\nrequire('./autoStart/resize');\nrequire('./autoStart/drag');\n\n// Interactable preventDefault setting\nrequire('./interactablePreventDefault.js');\n\n// autoScroll\nrequire('./autoScroll');\n\n// export interact\nmodule.exports = require('./interact');\n","const InteractEvent = require('./InteractEvent');\nconst Interaction = require('./Interaction');\nconst modifiers = require('./modifiers');\nconst utils = require('./utils');\nconst animationFrame = require('./utils/raf');\n\nInteraction.signals.on('new', function (interaction) {\n interaction.inertiaStatus = {\n active : false,\n smoothEnd : false,\n allowResume: false,\n\n startEvent: null,\n upCoords : {},\n\n xe: 0, ye: 0,\n sx: 0, sy: 0,\n\n t0: 0,\n vx0: 0, vys: 0,\n duration: 0,\n\n lambda_v0: 0,\n one_ve_v0: 0,\n i : null,\n };\n\n interaction.boundInertiaFrame = () => inertiaFrame .apply(interaction);\n interaction.boundSmoothEndFrame = () => smoothEndFrame.apply(interaction);\n});\n\nInteraction.signals.on('down', function ({ interaction, event, pointer, eventTarget }) {\n const status = interaction.inertiaStatus;\n\n // Check if the down event hits the current inertia target\n if (status.active) {\n let element = eventTarget;\n\n // climb up the DOM tree from the event target\n while (utils.is.element(element)) {\n\n // if interaction element is the current inertia target element\n if (element === interaction.element) {\n // stop inertia\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n\n // update pointers to the down event's coordinates\n interaction.updatePointer(pointer);\n utils.setCoords(interaction.curCoords, interaction.pointers);\n\n // fire appropriate signals\n const signalArg = { interaction };\n Interaction.signals.fire('before-action-move', signalArg);\n Interaction.signals.fire('action-resume' , signalArg);\n\n // fire a reume event\n const resumeEvent = new InteractEvent(interaction,\n event,\n interaction.prepared.name,\n 'inertiaresume',\n interaction.element);\n\n interaction.target.fire(resumeEvent);\n interaction.prevEvent = resumeEvent;\n modifiers.resetStatuses(interaction.modifierStatuses);\n\n utils.copyCoords(interaction.prevCoords, interaction.curCoords);\n break;\n }\n\n element = utils.parentNode(element);\n }\n }\n});\n\nInteraction.signals.on('up', function ({ interaction, event }) {\n const status = interaction.inertiaStatus;\n\n if (!interaction.interacting() || status.active) { return; }\n\n const target = interaction.target;\n const options = target && target.options;\n const inertiaOptions = options && interaction.prepared.name && options[interaction.prepared.name].inertia;\n\n const now = new Date().getTime();\n const statuses = {};\n const page = utils.extend({}, interaction.curCoords.page);\n const pointerSpeed = interaction.pointerDelta.client.speed;\n\n let smoothEnd = false;\n let modifierResult;\n\n // check if inertia should be started\n const inertiaPossible = (inertiaOptions && inertiaOptions.enabled\n && interaction.prepared.name !== 'gesture'\n && event !== status.startEvent);\n\n const inertia = (inertiaPossible\n && (now - interaction.curCoords.timeStamp) < 50\n && pointerSpeed > inertiaOptions.minSpeed\n && pointerSpeed > inertiaOptions.endSpeed);\n\n const modifierArg = {\n interaction,\n pageCoords: page,\n statuses,\n preEnd: true,\n requireEndOnly: true,\n };\n\n // smoothEnd\n if (inertiaPossible && !inertia) {\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n if (modifierResult.shouldMove && modifierResult.locked) {\n smoothEnd = true;\n }\n }\n\n if (!(inertia || smoothEnd)) { return; }\n\n utils.copyCoords(status.upCoords, interaction.curCoords);\n\n interaction.pointers[0] = status.startEvent =\n new InteractEvent(interaction, event, interaction.prepared.name, 'inertiastart', interaction.element);\n\n status.t0 = now;\n\n status.active = true;\n status.allowResume = inertiaOptions.allowResume;\n interaction.simulation = status;\n\n target.fire(status.startEvent);\n\n if (inertia) {\n status.vx0 = interaction.pointerDelta.client.vx;\n status.vy0 = interaction.pointerDelta.client.vy;\n status.v0 = pointerSpeed;\n\n calcInertia(interaction, status);\n\n utils.extend(page, interaction.curCoords.page);\n\n page.x += status.xe;\n page.y += status.ye;\n\n modifiers.resetStatuses(statuses);\n\n modifierResult = modifiers.setAll(modifierArg);\n\n status.modifiedXe += modifierResult.dx;\n status.modifiedYe += modifierResult.dy;\n\n status.i = animationFrame.request(interaction.boundInertiaFrame);\n }\n else {\n status.smoothEnd = true;\n status.xe = modifierResult.dx;\n status.ye = modifierResult.dy;\n\n status.sx = status.sy = 0;\n\n status.i = animationFrame.request(interaction.boundSmoothEndFrame);\n }\n});\n\nInteraction.signals.on('stop-active', function ({ interaction }) {\n const status = interaction.inertiaStatus;\n\n if (status.active) {\n animationFrame.cancel(status.i);\n status.active = false;\n interaction.simulation = null;\n }\n});\n\nfunction calcInertia (interaction, status) {\n const inertiaOptions = interaction.target.options[interaction.prepared.name].inertia;\n const lambda = inertiaOptions.resistance;\n const inertiaDur = -Math.log(inertiaOptions.endSpeed / status.v0) / lambda;\n\n status.x0 = interaction.prevEvent.pageX;\n status.y0 = interaction.prevEvent.pageY;\n status.t0 = status.startEvent.timeStamp / 1000;\n status.sx = status.sy = 0;\n\n status.modifiedXe = status.xe = (status.vx0 - inertiaDur) / lambda;\n status.modifiedYe = status.ye = (status.vy0 - inertiaDur) / lambda;\n status.te = inertiaDur;\n\n status.lambda_v0 = lambda / status.v0;\n status.one_ve_v0 = 1 - inertiaOptions.endSpeed / status.v0;\n}\n\nfunction inertiaFrame () {\n updateInertiaCoords(this);\n utils.setCoordDeltas(this.pointerDelta, this.prevCoords, this.curCoords);\n\n const status = this.inertiaStatus;\n const options = this.target.options[this.prepared.name].inertia;\n const lambda = options.resistance;\n const t = new Date().getTime() / 1000 - status.t0;\n\n if (t < status.te) {\n\n const progress = 1 - (Math.exp(-lambda * t) - status.lambda_v0) / status.one_ve_v0;\n\n if (status.modifiedXe === status.xe && status.modifiedYe === status.ye) {\n status.sx = status.xe * progress;\n status.sy = status.ye * progress;\n }\n else {\n const quadPoint = utils.getQuadraticCurvePoint(0, 0,\n status.xe,\n status.ye,\n status.modifiedXe,\n status.modifiedYe,\n progress);\n\n status.sx = quadPoint.x;\n status.sy = quadPoint.y;\n }\n\n this.doMove();\n\n status.i = animationFrame.request(this.boundInertiaFrame);\n }\n else {\n status.sx = status.modifiedXe;\n status.sy = status.modifiedYe;\n\n this.doMove();\n this.end(status.startEvent);\n status.active = false;\n this.simulation = null;\n }\n\n utils.copyCoords(this.prevCoords, this.curCoords);\n}\n\nfunction smoothEndFrame () {\n updateInertiaCoords(this);\n\n const status = this.inertiaStatus;\n const t = new Date().getTime() - status.t0;\n const duration = this.target.options[this.prepared.name].inertia.smoothEndDuration;\n\n if (t < duration) {\n status.sx = utils.easeOutQuad(t, 0, status.xe, duration);\n status.sy = utils.easeOutQuad(t, 0, status.ye, duration);\n\n this.pointerMove(status.startEvent, status.startEvent);\n\n status.i = animationFrame.request(this.boundSmoothEndFrame);\n }\n else {\n status.sx = status.xe;\n status.sy = status.ye;\n\n this.pointerMove(status.startEvent, status.startEvent);\n this.end(status.startEvent);\n\n status.smoothEnd =\n status.active = false;\n this.simulation = null;\n }\n}\n\nfunction updateInertiaCoords (interaction) {\n const status = interaction.inertiaStatus;\n\n // return if inertia isn't running\n if (!status.active) { return; }\n\n const pageUp = status.upCoords.page;\n const clientUp = status.upCoords.client;\n\n utils.setCoords(interaction.curCoords, [ {\n pageX : pageUp.x + status.sx,\n pageY : pageUp.y + status.sy,\n clientX: clientUp.x + status.sx,\n clientY: clientUp.y + status.sy,\n } ]);\n}\n","const browser = require('./utils/browser');\nconst events = require('./utils/events');\nconst utils = require('./utils');\nconst scope = require('./scope');\nconst Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\n\nconst globalEvents = {};\n\n/*\\\n * interact\n [ method ]\n *\n * The methods of this variable can be used to set elements as\n * interactables and also to change various default settings.\n *\n * Calling it as a function and passing an element or a valid CSS selector\n * string returns an Interactable object which has various methods to\n * configure it.\n *\n - element (Element | string) The HTML or SVG Element to interact with or CSS selector\n = (object) An @Interactable\n *\n > Usage\n | interact('#draggable').draggable(true);\n |\n | var rectables = interact('rect');\n | rectables\n | .gesturable(true)\n | .on('gesturemove', function (event) {\n | // ...\n | });\n\\*/\nfunction interact (element, options) {\n let interactable = scope.interactables.get(element, options);\n\n if (!interactable) {\n interactable = new Interactable(element, options);\n interactable.events.global = globalEvents;\n }\n\n return interactable;\n}\n\n/*\\\n * interact.isSet\n [ method ]\n *\n * Check if an element has been set\n - element (Element) The Element being searched for\n = (boolean) Indicates if the element or CSS selector was previously passed to interact\n\\*/\ninteract.isSet = function (element, options) {\n return scope.interactables.indexOfElement(element, options && options.context) !== -1;\n};\n\n/*\\\n * interact.on\n [ method ]\n *\n * Adds a global listener for an InteractEvent or adds a DOM event to\n * `document`\n *\n - type (string | array | object) The types of events to listen for\n - listener (function) The function event (s)\n - options (object | boolean) #optional options object or useCapture flag for addEventListener\n = (object) interact\n\\*/\ninteract.on = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.on(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.on(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n // if it is an InteractEvent type, add listener to globalEvents\n if (utils.contains(Interactable.eventTypes, type)) {\n // if this type of event was never bound\n if (!globalEvents[type]) {\n globalEvents[type] = [listener];\n }\n else {\n globalEvents[type].push(listener);\n }\n }\n // If non InteractEvent type, addEventListener to document\n else {\n events.add(scope.document, type, listener, { options });\n }\n\n return interact;\n};\n\n/*\\\n * interact.off\n [ method ]\n *\n * Removes a global InteractEvent listener or DOM event from `document`\n *\n - type (string | array | object) The types of events that were listened for\n - listener (function) The listener function to be removed\n - options (object | boolean) #optional options object or useCapture flag for removeEventListener\n = (object) interact\n \\*/\ninteract.off = function (type, listener, options) {\n if (utils.is.string(type) && type.search(' ') !== -1) {\n type = type.trim().split(/ +/);\n }\n\n if (utils.is.array(type)) {\n for (const eventType of type) {\n interact.off(eventType, listener, options);\n }\n\n return interact;\n }\n\n if (utils.is.object(type)) {\n for (const prop in type) {\n interact.off(prop, type[prop], listener);\n }\n\n return interact;\n }\n\n if (!utils.contains(Interactable.eventTypes, type)) {\n events.remove(scope.document, type, listener, options);\n }\n else {\n let index;\n\n if (type in globalEvents\n && (index = utils.indexOf(globalEvents[type], listener)) !== -1) {\n globalEvents[type].splice(index, 1);\n }\n }\n\n return interact;\n};\n\n/*\\\n * interact.debug\n [ method ]\n *\n * Returns an object which exposes internal data\n = (object) An object with properties that outline the current state and expose internal functions and variables\n\\*/\ninteract.debug = function () {\n return scope;\n};\n\n// expose the functions used to calculate multi-touch properties\ninteract.getPointerAverage = utils.pointerAverage;\ninteract.getTouchBBox = utils.touchBBox;\ninteract.getTouchDistance = utils.touchDistance;\ninteract.getTouchAngle = utils.touchAngle;\n\ninteract.getElementRect = utils.getElementRect;\ninteract.getElementClientRect = utils.getElementClientRect;\ninteract.matchesSelector = utils.matchesSelector;\ninteract.closest = utils.closest;\n\n/*\\\n * interact.supportsTouch\n [ method ]\n *\n = (boolean) Whether or not the browser supports touch input\n\\*/\ninteract.supportsTouch = function () {\n return browser.supportsTouch;\n};\n\n/*\\\n * interact.supportsPointerEvent\n [ method ]\n *\n = (boolean) Whether or not the browser supports PointerEvents\n\\*/\ninteract.supportsPointerEvent = function () {\n return browser.supportsPointerEvent;\n};\n\n/*\\\n * interact.stop\n [ method ]\n *\n * Cancels all interactions (end events are not fired)\n *\n - event (Event) An event on which to call preventDefault()\n = (object) interact\n\\*/\ninteract.stop = function (event) {\n for (let i = scope.interactions.length - 1; i >= 0; i--) {\n scope.interactions[i].stop(event);\n }\n\n return interact;\n};\n\n/*\\\n * interact.pointerMoveTolerance\n [ method ]\n * Returns or sets the distance the pointer must be moved before an action\n * sequence occurs. This also affects tolerance for tap events.\n *\n - newValue (number) #optional The movement from the start position must be greater than this value\n = (number | Interactable) The current setting or interact\n\\*/\ninteract.pointerMoveTolerance = function (newValue) {\n if (utils.is.number(newValue)) {\n Interaction.pointerMoveTolerance = newValue;\n\n return this;\n }\n\n return Interaction.pointerMoveTolerance;\n};\n\ninteract.addDocument = scope.addDocument;\ninteract.removeDocument = scope.removeDocument;\n\nscope.interact = interact;\n\nmodule.exports = interact;\n","const Interactable = require('./Interactable');\nconst Interaction = require('./Interaction');\nconst scope = require('./scope');\nconst is = require('./utils/is');\nconst events = require('./utils/events');\n\nconst { nodeContains, matchesSelector } = require('./utils/domUtils');\n\n/*\\\n * Interactable.preventDefault\n [ method ]\n *\n * Returns or sets whether to prevent the browser's default behaviour\n * in response to pointer events. Can be set to:\n * - `'always'` to always prevent\n * - `'never'` to never prevent\n * - `'auto'` to let interact.js try to determine what would be best\n *\n - newValue (string) #optional `true`, `false` or `'auto'`\n = (string | Interactable) The current setting or this Interactable\n\\*/\nInteractable.prototype.preventDefault = function (newValue) {\n if (/^(always|never|auto)$/.test(newValue)) {\n this.options.preventDefault = newValue;\n return this;\n }\n\n if (is.bool(newValue)) {\n this.options.preventDefault = newValue? 'always' : 'never';\n return this;\n }\n\n return this.options.preventDefault;\n};\n\nInteractable.prototype.checkAndPreventDefault = function (event) {\n const setting = this.options.preventDefault;\n\n if (setting === 'never') { return; }\n\n if (setting === 'always') {\n event.preventDefault();\n return;\n }\n\n // setting === 'auto'\n\n // don't preventDefault if the browser supports passiveEvents\n // CSS touch-action and user-selecct should be used instead\n if (events.supportsOptions) {\n return;\n }\n\n // don't preventDefault of pointerdown events\n if (/^(mouse|pointer|touch)*(down|start)/i.test(event.type)) {\n return;\n }\n\n // don't preventDefault on editable elements\n if (is.element(event.target)\n && matchesSelector(event.target, 'input,select,textarea,[contenteditable=true],[contenteditable=true] *')) {\n return;\n }\n\n event.preventDefault();\n};\n\nfunction onInteractionEvent ({ interaction, event }) {\n if (interaction.target) {\n interaction.target.checkAndPreventDefault(event);\n }\n}\n\nfor (const eventSignal of ['down', 'move', 'up', 'cancel']) {\n Interaction.signals.on(eventSignal, onInteractionEvent);\n}\n\n// prevent native HTML5 drag on interact.js target elements\nInteraction.docEvents.dragstart = function preventNativeDrag (event) {\n for (const interaction of scope.interactions) {\n\n if (interaction.element\n && (interaction.element === event.target\n || nodeContains(interaction.element, event.target))) {\n\n interaction.target.checkAndPreventDefault(event);\n return;\n }\n }\n};\n","const scope = require('./scope');\nconst events = require('./utils/events');\nconst browser = require('./utils/browser');\nconst iFinder = require('./utils/interactionFinder');\nconst pointerEvents = require('./pointerEvents/base');\n\nconst { window } = require('./utils/window');\n\nconst toString = Object.prototype.toString;\n\nif (!window.Array.isArray) {\n window.Array.isArray = function (obj) {\n return toString.call(obj) === '[object Array]';\n };\n}\n\nif (!String.prototype.trim) {\n String.prototype.trim = function () {\n return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n };\n}\n\n// http://www.quirksmode.org/dom/events/click.html\n// >Events leading to dblclick\n//\n// IE8 doesn't fire down event before dblclick.\n// This workaround tries to fire a tap and doubletap after dblclick\nfunction onIE8Dblclick (event) {\n const eventTarget = event.target;\n const interaction = iFinder.search(event, event.type, eventTarget);\n\n if (!interaction) { return; }\n\n if (interaction.prevTap\n && event.clientX === interaction.prevTap.clientX\n && event.clientY === interaction.prevTap.clientY\n && eventTarget === interaction.prevTap.target) {\n\n interaction.downTargets[0] = eventTarget;\n interaction.downTimes [0] = new Date().getTime();\n\n pointerEvents.fire({\n interaction,\n event,\n eventTarget,\n pointer: event,\n type: 'tap',\n });\n }\n}\n\nif (browser.isIE8) {\n const selectFix = function (event) {\n for (const interaction of scope.interactions) {\n if (interaction.interacting()) {\n interaction.target.checkAndPreventDefault(event);\n }\n }\n };\n\n const onDocIE8 = function onDocIE8 ({ doc, win }, signalName) {\n const eventMethod = signalName.indexOf('listen') === 0\n ? events.add : events.remove;\n\n // For IE's lack of Event#preventDefault\n eventMethod(doc, 'selectstart', selectFix);\n\n if (pointerEvents) {\n eventMethod(doc, 'dblclick', onIE8Dblclick);\n }\n };\n\n scope.signals.on('add-document' , onDocIE8);\n scope.signals.on('remove-document', onDocIE8);\n}\n\nmodule.exports = null;\n","const InteractEvent = require('../InteractEvent');\nconst Interaction = require('../Interaction');\nconst extend = require('../utils/extend');\n\nconst modifiers = {\n names: [],\n\n setOffsets: function (arg) {\n const { interaction, pageCoords: page } = arg;\n const { target, element, startOffset } = interaction;\n const rect = target.getRect(element);\n\n if (rect) {\n startOffset.left = page.x - rect.left;\n startOffset.top = page.y - rect.top;\n\n startOffset.right = rect.right - page.x;\n startOffset.bottom = rect.bottom - page.y;\n\n if (!('width' in rect)) { rect.width = rect.right - rect.left; }\n if (!('height' in rect)) { rect.height = rect.bottom - rect.top ; }\n }\n else {\n startOffset.left = startOffset.top = startOffset.right = startOffset.bottom = 0;\n }\n\n arg.rect = rect;\n arg.interactable = target;\n arg.element = element;\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n\n arg.options = target.options[interaction.prepared.name][modifierName];\n\n if (!arg.options) {\n continue;\n }\n\n interaction.modifierOffsets[modifierName] = modifiers[modifierName].setOffset(arg);\n }\n },\n\n setAll: function (arg) {\n const { interaction, statuses, preEnd, requireEndOnly } = arg;\n const coords = extend({}, arg.pageCoords);\n const result = {\n dx: 0,\n dy: 0,\n changed: false,\n locked: false,\n shouldMove: true,\n };\n\n for (const modifierName of modifiers.names) {\n const modifier = modifiers[modifierName];\n const options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!shouldDo(options, preEnd, requireEndOnly)) { continue; }\n\n arg.status = arg.status = statuses[modifierName];\n arg.options = options;\n arg.offset = arg.interaction.modifierOffsets[modifierName];\n\n modifier.set(arg);\n\n if (arg.status.locked) {\n coords.x += arg.status.dx;\n coords.y += arg.status.dy;\n\n result.dx += arg.status.dx;\n result.dy += arg.status.dy;\n\n result.locked = true;\n }\n }\n\n // a move should be fired if:\n // - there are no modifiers enabled,\n // - no modifiers are \"locked\" i.e. have changed the pointer's coordinates, or\n // - the locked coords have changed since the last pointer move\n result.shouldMove = !arg.status || !result.locked || arg.status.changed;\n\n return result;\n },\n\n resetStatuses: function (statuses) {\n for (const modifierName of modifiers.names) {\n const status = statuses[modifierName] || {};\n\n status.dx = status.dy = 0;\n status.modifiedX = status.modifiedY = NaN;\n status.locked = false;\n status.changed = true;\n\n statuses[modifierName] = status;\n }\n\n return statuses;\n },\n\n start: function ({ interaction }, signalName) {\n const arg = {\n interaction,\n pageCoords: (signalName === 'action-resume' ?\n interaction.curCoords : interaction.startCoords).page,\n startOffset: interaction.startOffset,\n statuses: interaction.modifierStatuses,\n preEnd: false,\n requireEndOnly: false,\n };\n\n modifiers.setOffsets(arg);\n modifiers.resetStatuses(arg.statuses);\n\n arg.pageCoords = extend({}, interaction.startCoords.page);\n interaction.modifierResult = modifiers.setAll(arg);\n },\n};\n\nInteraction.signals.on('new', function (interaction) {\n interaction.startOffset = { left: 0, right: 0, top: 0, bottom: 0 };\n interaction.modifierOffsets = {};\n interaction.modifierStatuses = modifiers.resetStatuses({});\n interaction.modifierResult = null;\n});\n\nInteraction.signals.on('action-start' , modifiers.start);\nInteraction.signals.on('action-resume', modifiers.start);\n\nInteraction.signals.on('before-action-move', function ({ interaction, preEnd, interactingBeforeMove }) {\n const modifierResult = modifiers.setAll({\n interaction,\n preEnd,\n pageCoords: interaction.curCoords.page,\n statuses: interaction.modifierStatuses,\n requireEndOnly: false,\n });\n\n // don't fire an action move if a modifier would keep the event in the same\n // cordinates as before\n if (!modifierResult.shouldMove && interactingBeforeMove) {\n interaction._dontFireMove = true;\n }\n\n interaction.modifierResult = modifierResult;\n});\n\nInteraction.signals.on('action-end', function ({ interaction, event }) {\n for (let i = 0; i < modifiers.names.length; i++) {\n const options = interaction.target.options[interaction.prepared.name][modifiers.names[i]];\n\n // if the endOnly option is true for any modifier\n if (shouldDo(options, true, true)) {\n // fire a move event at the modified coordinates\n interaction.doMove({ event, preEnd: true });\n break;\n }\n }\n});\n\nInteractEvent.signals.on('set-xy', function (arg) {\n const { iEvent, interaction } = arg;\n const modifierArg = extend({}, arg);\n\n for (let i = 0; i < modifiers.names.length; i++) {\n const modifierName = modifiers.names[i];\n modifierArg.options = interaction.target.options[interaction.prepared.name][modifierName];\n\n if (!modifierArg.options) {\n continue;\n }\n\n const modifier = modifiers[modifierName];\n\n modifierArg.status = interaction.modifierStatuses[modifierName];\n\n iEvent[modifierName] = modifier.modifyCoords(modifierArg);\n }\n});\n\nfunction shouldDo (options, preEnd, requireEndOnly) {\n return (options && options.enabled\n && (preEnd || !options.endOnly)\n && (!requireEndOnly || options.endOnly));\n}\n\nmodule.exports = modifiers;\n","const modifiers = require('./index');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst restrict = {\n defaults: {\n enabled : false,\n endOnly : false,\n restriction: null,\n elementRect: null,\n },\n\n setOffset: function ({ rect, startOffset, options }) {\n const elementRect = options && options.elementRect;\n const offset = {};\n\n if (rect && elementRect) {\n offset.left = startOffset.left - (rect.width * elementRect.left);\n offset.top = startOffset.top - (rect.height * elementRect.top);\n\n offset.right = startOffset.right - (rect.width * (1 - elementRect.right));\n offset.bottom = startOffset.bottom - (rect.height * (1 - elementRect.bottom));\n }\n else {\n offset.left = offset.top = offset.right = offset.bottom = 0;\n }\n\n return offset;\n },\n\n set: function ({ pageCoords, interaction, status, options }) {\n if (!options) { return status; }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n\n const restriction = getRestrictionRect(options.restriction, interaction, page);\n\n if (!restriction) { return status; }\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n const rect = restriction;\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n const offset = interaction.modifierOffsets.restrict;\n\n // object is assumed to have\n // x, y, width, height or\n // left, top, right, bottom\n if ('x' in restriction && 'y' in restriction) {\n modifiedX = Math.max(Math.min(rect.x + rect.width - offset.right , page.x), rect.x + offset.left);\n modifiedY = Math.max(Math.min(rect.y + rect.height - offset.bottom, page.y), rect.y + offset.top );\n }\n else {\n modifiedX = Math.max(Math.min(rect.right - offset.right , page.x), rect.left + offset.left);\n modifiedY = Math.max(Math.min(rect.bottom - offset.bottom, page.y), rect.top + offset.top );\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const elementRect = options && options.elementRect;\n\n if (options && options.enabled\n && !(phase === 'start' && elementRect && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n getRestrictionRect,\n};\n\nfunction getRestrictionRect (value, interaction, page) {\n if (utils.is.function(value)) {\n return utils.resolveRectLike(value, interaction.target, interaction.element, [page.x, page.y, interaction]);\n } else {\n return utils.resolveRectLike(value, interaction.target, interaction.element);\n }\n}\n\nmodifiers.restrict = restrict;\nmodifiers.names.push('restrict');\n\ndefaultOptions.perAction.restrict = restrict.defaults;\n\nmodule.exports = restrict;\n","// This module adds the options.resize.restrictEdges setting which sets min and\n// max for the top, left, bottom and right edges of the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictEdges: {\n// inner: { top: 200, left: 200, right: 400, bottom: 400 },\n// outer: { top: 0, left: 0, right: 600, bottom: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst { getRestrictionRect } = require('./restrict');\n\nconst noInner = { top: +Infinity, left: +Infinity, bottom: -Infinity, right: -Infinity };\nconst noOuter = { top: -Infinity, left: -Infinity, bottom: +Infinity, right: +Infinity };\n\nconst restrictEdges = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n offset: null,\n },\n\n setOffset: function ({ interaction, startOffset, options }) {\n if (!options) {\n return utils.extend({}, startOffset);\n }\n\n const offset = getRestrictionRect(options.offset, interaction, interaction.startCoords.page);\n\n if (offset) {\n return {\n top: startOffset.top + offset.y,\n left: startOffset.left + offset.x,\n bottom: startOffset.bottom + offset.y,\n right: startOffset.right + offset.x,\n };\n }\n\n return startOffset;\n },\n\n set: function ({ pageCoords, interaction, status, offset, options }) {\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const page = status.useStatusXY\n ? { x: status.x, y: status.y }\n : utils.extend({}, pageCoords);\n const inner = rectUtils.xywhToTlbr(getRestrictionRect(options.inner, interaction, page)) || noInner;\n const outer = rectUtils.xywhToTlbr(getRestrictionRect(options.outer, interaction, page)) || noOuter;\n\n let modifiedX = page.x;\n let modifiedY = page.y;\n\n status.dx = 0;\n status.dy = 0;\n status.locked = false;\n\n if (edges.top) {\n modifiedY = Math.min(Math.max(outer.top + offset.top, page.y), inner.top + offset.top);\n }\n else if (edges.bottom) {\n modifiedY = Math.max(Math.min(outer.bottom - offset.bottom, page.y), inner.bottom - offset.bottom);\n }\n if (edges.left) {\n modifiedX = Math.min(Math.max(outer.left + offset.left, page.x), inner.left + offset.left);\n }\n else if (edges.right) {\n modifiedX = Math.max(Math.min(outer.right - offset.right, page.x), inner.right - offset.right);\n }\n\n status.dx = modifiedX - page.x;\n status.dy = modifiedY - page.y;\n\n status.changed = status.modifiedX !== modifiedX || status.modifiedY !== modifiedY;\n status.locked = !!(status.dx || status.dy);\n\n status.modifiedX = modifiedX;\n status.modifiedY = modifiedY;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n if (options && options.enabled\n && !(phase === 'start' && status.locked)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n\n return {\n dx: status.dx,\n dy: status.dy,\n };\n }\n }\n },\n\n noInner,\n noOuter,\n getRestrictionRect,\n};\n\nmodifiers.restrictEdges = restrictEdges;\nmodifiers.names.push('restrictEdges');\n\ndefaultOptions.perAction.restrictEdges = restrictEdges.defaults;\nresize.defaults.restrictEdges = restrictEdges.defaults;\n\nmodule.exports = restrictEdges;\n","// This module adds the options.resize.restrictSize setting which sets min and\n// max width and height for the target being resized.\n//\n// interact(target).resize({\n// edges: { top: true, left: true },\n// restrictSize: {\n// min: { width: -600, height: -600 },\n// max: { width: 600, height: 600 },\n// },\n// });\n\nconst modifiers = require('./index');\nconst restrictEdges = require('./restrictEdges');\nconst utils = require('../utils');\nconst rectUtils = require('../utils/rect');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\n\nconst noMin = { width: -Infinity, height: -Infinity };\nconst noMax = { width: +Infinity, height: +Infinity };\n\nconst restrictSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n min: null,\n max: null,\n },\n\n setOffset: function ({ interaction }) {\n return interaction.startOffset;\n },\n\n set: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.linkedEdges || interaction.prepared.edges;\n\n if (!interaction.interacting() || !edges) {\n return;\n }\n\n const rect = rectUtils.xywhToTlbr(interaction.resizeRects.inverted);\n\n const minSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.min, interaction)) || noMin;\n const maxSize = rectUtils.tlbrToXywh(restrictEdges.getRestrictionRect(options.max, interaction)) || noMax;\n\n arg.options = {\n enabled: options.enabled,\n endOnly: options.endOnly,\n inner: utils.extend({}, restrictEdges.noInner),\n outer: utils.extend({}, restrictEdges.noOuter),\n };\n\n if (edges.top) {\n arg.options.inner.top = rect.bottom - minSize.height;\n arg.options.outer.top = rect.bottom - maxSize.height;\n }\n else if (edges.bottom) {\n arg.options.inner.bottom = rect.top + minSize.height;\n arg.options.outer.bottom = rect.top + maxSize.height;\n }\n if (edges.left) {\n arg.options.inner.left = rect.right - minSize.width;\n arg.options.outer.left = rect.right - maxSize.width;\n }\n else if (edges.right) {\n arg.options.inner.right = rect.left + minSize.width;\n arg.options.outer.right = rect.left + maxSize.width;\n }\n\n restrictEdges.set(arg);\n },\n\n modifyCoords: restrictEdges.modifyCoords,\n};\n\nmodifiers.restrictSize = restrictSize;\nmodifiers.names.push('restrictSize');\n\ndefaultOptions.perAction.restrictSize = restrictSize.defaults;\nresize.defaults.restrictSize = restrictSize.defaults;\n\nmodule.exports = restrictSize;\n","const modifiers = require('./index');\nconst interact = require('../interact');\nconst utils = require('../utils');\nconst defaultOptions = require('../defaultOptions');\n\nconst snap = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n\n relativePoints: null,\n },\n\n setOffset: function ({ interaction, interactable, element, rect, startOffset, options }) {\n const offsets = [];\n const optionsOrigin = utils.rectToXY(utils.resolveRectLike(options.origin));\n const origin = optionsOrigin || utils.getOriginXY(interactable, element, interaction.prepared.name);\n options = options || interactable.options[interaction.prepared.name].snap || {};\n\n let snapOffset;\n\n if (options.offset === 'startCoords') {\n snapOffset = {\n x: interaction.startCoords.page.x - origin.x,\n y: interaction.startCoords.page.y - origin.y,\n };\n }\n else {\n const offsetRect = utils.resolveRectLike(options.offset, interactable, element, [interaction]);\n\n snapOffset = utils.rectToXY(offsetRect) || { x: 0, y: 0 };\n }\n\n if (rect && options.relativePoints && options.relativePoints.length) {\n for (const { x: relativeX, y: relativeY } of options.relativePoints) {\n offsets.push({\n x: startOffset.left - (rect.width * relativeX) + snapOffset.x,\n y: startOffset.top - (rect.height * relativeY) + snapOffset.y,\n });\n }\n }\n else {\n offsets.push(snapOffset);\n }\n\n return offsets;\n },\n\n set: function ({ interaction, pageCoords, status, options, offset: offsets }) {\n const targets = [];\n let target;\n let page;\n let i;\n\n if (status.useStatusXY) {\n page = { x: status.x, y: status.y };\n }\n else {\n const origin = utils.getOriginXY(interaction.target, interaction.element, interaction.prepared.name);\n\n page = utils.extend({}, pageCoords);\n\n page.x -= origin.x;\n page.y -= origin.y;\n }\n\n status.realX = page.x;\n status.realY = page.y;\n\n let len = options.targets? options.targets.length : 0;\n\n for (const { x: offsetX, y: offsetY } of offsets) {\n const relativeX = page.x - offsetX;\n const relativeY = page.y - offsetY;\n\n for (const snapTarget of options.targets) {\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n targets.push({\n x: utils.is.number(target.x) ? (target.x + offsetX) : relativeX,\n y: utils.is.number(target.y) ? (target.y + offsetY) : relativeY,\n\n range: utils.is.number(target.range)? target.range: options.range,\n });\n }\n }\n\n const closest = {\n target: null,\n inRange: false,\n distance: 0,\n range: 0,\n dx: 0,\n dy: 0,\n };\n\n for (i = 0, len = targets.length; i < len; i++) {\n target = targets[i];\n\n const range = target.range;\n const dx = target.x - page.x;\n const dy = target.y - page.y;\n const distance = utils.hypot(dx, dy);\n let inRange = distance <= range;\n\n // Infinite targets count as being out of range\n // compared to non infinite ones that are in range\n if (range === Infinity && closest.inRange && closest.range !== Infinity) {\n inRange = false;\n }\n\n if (!closest.target || (inRange\n // is the closest target in range?\n ? (closest.inRange && range !== Infinity\n // the pointer is relatively deeper in this target\n ? distance / range < closest.distance / closest.range\n // this target has Infinite range and the closest doesn't\n : (range === Infinity && closest.range !== Infinity)\n // OR this target is closer that the previous closest\n || distance < closest.distance)\n // The other is not in range and the pointer is closer to this target\n : (!closest.inRange && distance < closest.distance))) {\n\n closest.target = target;\n closest.distance = distance;\n closest.range = range;\n closest.inRange = inRange;\n closest.dx = dx;\n closest.dy = dy;\n\n status.range = range;\n }\n }\n\n let snapChanged;\n\n if (closest.target) {\n snapChanged = (status.modifiedX !== closest.target.x || status.modifiedY !== closest.target.y);\n\n status.modifiedX = closest.target.x;\n status.modifiedY = closest.target.y;\n }\n else {\n snapChanged = true;\n\n status.modifiedX = NaN;\n status.modifiedY = NaN;\n }\n\n status.dx = closest.dx;\n status.dy = closest.dy;\n\n status.changed = (snapChanged || (closest.inRange && !status.locked));\n status.locked = closest.inRange;\n },\n\n modifyCoords: function ({ page, client, status, phase, options }) {\n const relativePoints = options && options.relativePoints;\n\n if (options && options.enabled\n && !(phase === 'start' && relativePoints && relativePoints.length)) {\n\n if (status.locked) {\n page.x += status.dx;\n page.y += status.dy;\n client.x += status.dx;\n client.y += status.dy;\n }\n\n return {\n range : status.range,\n locked : status.locked,\n x : status.modifiedX,\n y : status.modifiedY,\n realX : status.realX,\n realY : status.realY,\n dx : status.dx,\n dy : status.dy,\n };\n }\n },\n};\n\ninteract.createSnapGrid = function (grid) {\n return function (x, y) {\n const limits = grid.limits || {\n left : -Infinity,\n right : Infinity,\n top : -Infinity,\n bottom: Infinity,\n };\n let offsetX = 0;\n let offsetY = 0;\n\n if (utils.is.object(grid.offset)) {\n offsetX = grid.offset.x;\n offsetY = grid.offset.y;\n }\n\n const gridx = Math.round((x - offsetX) / grid.x);\n const gridy = Math.round((y - offsetY) / grid.y);\n\n const newX = Math.max(limits.left, Math.min(limits.right , gridx * grid.x + offsetX));\n const newY = Math.max(limits.top , Math.min(limits.bottom, gridy * grid.y + offsetY));\n\n return {\n x: newX,\n y: newY,\n range: grid.range,\n };\n };\n};\n\nmodifiers.snap = snap;\nmodifiers.names.push('snap');\n\ndefaultOptions.perAction.snap = snap.defaults;\n\nmodule.exports = snap;\n","// This module allows snapping of the size of targets during resize\n// interactions.\n\nconst modifiers = require('./index');\nconst snap = require('./snap');\nconst defaultOptions = require('../defaultOptions');\nconst resize = require('../actions/resize');\nconst utils = require('../utils/');\n\nconst snapSize = {\n defaults: {\n enabled: false,\n endOnly: false,\n range : Infinity,\n targets: null,\n offsets: null,\n },\n\n setOffset: function (arg) {\n const { interaction, options } = arg;\n const edges = interaction.prepared.edges;\n\n if (!edges) { return; }\n\n arg.options = {\n relativePoints: [{\n x: edges.left? 0 : 1,\n y: edges.top ? 0 : 1,\n }],\n origin: { x: 0, y: 0 },\n offset: 'self',\n range: options.range,\n };\n\n const offsets = snap.setOffset(arg);\n arg.options = options;\n\n return offsets;\n },\n\n set: function (arg) {\n const { interaction, options, offset, pageCoords } = arg;\n const page = utils.extend({}, pageCoords);\n const relativeX = page.x - offset[0].x;\n const relativeY = page.y - offset[0].y;\n\n arg.options = utils.extend({}, options);\n arg.options.targets = [];\n\n for (const snapTarget of options.targets) {\n let target;\n\n if (utils.is.function(snapTarget)) {\n target = snapTarget(relativeX, relativeY, interaction);\n }\n else {\n target = snapTarget;\n }\n\n if (!target) { continue; }\n\n if ('width' in target && 'height' in target) {\n target.x = target.width;\n target.y = target.height;\n }\n\n arg.options.targets.push(target);\n }\n\n snap.set(arg);\n },\n\n modifyCoords: function (arg) {\n const { options } = arg;\n\n arg.options = utils.extend({}, options);\n arg.options.enabled = options.enabled;\n arg.options.relativePoints = [null];\n\n snap.modifyCoords(arg);\n },\n};\n\nmodifiers.snapSize = snapSize;\nmodifiers.names.push('snapSize');\n\ndefaultOptions.perAction.snapSize = snapSize.defaults;\nresize.defaults.snapSize = snapSize.defaults;\n\nmodule.exports = snapSize;\n","const pointerUtils = require('../utils/pointerUtils');\n\nmodule.exports = class PointerEvent {\n constructor (type, pointer, event, eventTarget, interaction) {\n pointerUtils.pointerExtend(this, event);\n\n if (event !== pointer) {\n pointerUtils.pointerExtend(this, pointer);\n }\n\n this.interaction = interaction;\n\n this.timeStamp = new Date().getTime();\n this.originalEvent = event;\n this.type = type;\n this.pointerId = pointerUtils.getPointerId(pointer);\n this.pointerType = pointerUtils.getPointerType(pointer);\n this.target = eventTarget;\n this.currentTarget = null;\n\n if (type === 'tap') {\n const pointerIndex = interaction.getPointerIndex(pointer);\n this.dt = this.timeStamp - interaction.downTimes[pointerIndex];\n\n const interval = this.timeStamp - interaction.tapTime;\n\n this.double = !!(interaction.prevTap\n && interaction.prevTap.type !== 'doubletap'\n && interaction.prevTap.target === this.target\n && interval < 500);\n }\n else if (type === 'doubletap') {\n this.dt = pointer.timeStamp - interaction.tapTime;\n }\n }\n\n subtractOrigin ({ x: originX, y: originY }) {\n this.pageX -= originX;\n this.pageY -= originY;\n this.clientX -= originX;\n this.clientY -= originY;\n\n return this;\n }\n\n addOrigin ({ x: originX, y: originY }) {\n this.pageX += originX;\n this.pageY += originY;\n this.clientX += originX;\n this.clientY += originY;\n\n return this;\n }\n\n preventDefault () {\n this.originalEvent.preventDefault();\n }\n\n stopPropagation () {\n this.propagationStopped = true;\n }\n\n stopImmediatePropagation () {\n this.immediatePropagationStopped = this.propagationStopped = true;\n }\n};\n","const PointerEvent = require('./PointerEvent');\nconst Interaction = require('../Interaction');\nconst utils = require('../utils');\nconst browser = require('../utils/browser');\nconst defaults = require('../defaultOptions');\nconst signals = require('../utils/Signals').new();\nconst { filter } = require('../utils/arr');\n\nconst simpleSignals = [ 'down', 'up', 'cancel' ];\nconst simpleEvents = [ 'down', 'up', 'cancel' ];\n\nconst pointerEvents = {\n PointerEvent,\n fire,\n collectEventTargets,\n signals,\n defaults: {\n holdDuration: 600,\n ignoreFrom : null,\n allowFrom : null,\n origin : { x: 0, y: 0 },\n },\n types: [\n 'down',\n 'move',\n 'up',\n 'cancel',\n 'tap',\n 'doubletap',\n 'hold',\n ],\n};\n\nfunction fire (arg) {\n const {\n interaction, pointer, event, eventTarget,\n type = arg.pointerEvent.type,\n targets = collectEventTargets(arg),\n pointerEvent = new PointerEvent(type, pointer, event, eventTarget, interaction),\n } = arg;\n\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n targets,\n type,\n pointerEvent,\n };\n\n for (let i = 0; i < targets.length; i++) {\n const target = targets[i];\n\n for (const prop in target.props || {}) {\n pointerEvent[prop] = target.props[prop];\n }\n\n const origin = utils.getOriginXY(target.eventable, target.element);\n\n pointerEvent.subtractOrigin(origin);\n pointerEvent.eventable = target.eventable;\n pointerEvent.currentTarget = target.element;\n\n target.eventable.fire(pointerEvent);\n\n pointerEvent.addOrigin(origin);\n\n if (pointerEvent.immediatePropagationStopped\n || (pointerEvent.propagationStopped\n && (i + 1) < targets.length && targets[i + 1].element !== pointerEvent.currentTarget)) {\n break;\n }\n }\n\n signals.fire('fired', signalArg);\n\n if (type === 'tap') {\n // if pointerEvent should make a double tap, create and fire a doubletap\n // PointerEvent and use that as the prevTap\n const prevTap = pointerEvent.double\n ? fire({\n interaction, pointer, event, eventTarget,\n type: 'doubletap',\n })\n : pointerEvent;\n\n interaction.prevTap = prevTap;\n interaction.tapTime = prevTap.timeStamp;\n }\n\n return pointerEvent;\n}\n\nfunction collectEventTargets ({ interaction, pointer, event, eventTarget, type }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n // do not fire a tap event if the pointer was moved before being lifted\n if (type === 'tap' && (interaction.pointerWasMoved\n // or if the pointerup target is different to the pointerdown target\n || !(interaction.downTargets[pointerIndex] && interaction.downTargets[pointerIndex] === eventTarget))) {\n return [];\n }\n\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type,\n path,\n targets: [],\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (type === 'hold') {\n signalArg.targets = filter(signalArg.targets, target =>\n target.eventable.options.holdDuration === interaction.holdTimers[pointerIndex].duration);\n }\n\n return signalArg.targets;\n}\n\nInteraction.signals.on('update-pointer-down', function ({ interaction, pointerIndex }) {\n interaction.holdTimers[pointerIndex] = { duration: Infinity, timeout: null };\n});\n\nInteraction.signals.on('remove-pointer', function ({ interaction, pointerIndex }) {\n interaction.holdTimers.splice(pointerIndex, 1);\n});\n\nInteraction.signals.on('move', function ({ interaction, pointer, event, eventTarget, duplicateMove }) {\n const pointerIndex = interaction.getPointerIndex(pointer);\n\n if (!duplicateMove && (!interaction.pointerIsDown || interaction.pointerWasMoved)) {\n if (interaction.pointerIsDown) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n\n fire({\n interaction, pointer, event, eventTarget,\n type: 'move',\n });\n }\n});\n\nInteraction.signals.on('down', function ({ interaction, pointer, event, eventTarget, pointerIndex }) {\n // copy event to be used in timeout for IE8\n const eventCopy = browser.isIE8? utils.extend({}, event) : event;\n\n const timer = interaction.holdTimers[pointerIndex];\n const path = utils.getPath(eventTarget);\n const signalArg = {\n interaction,\n pointer,\n event,\n eventTarget,\n type: 'hold',\n targets: [],\n path,\n element: null,\n };\n\n for (const element of path) {\n signalArg.element = element;\n\n signals.fire('collect-targets', signalArg);\n }\n\n if (!signalArg.targets.length) { return; }\n\n let minDuration = Infinity;\n\n for (let i = 0; i < signalArg.targets.length; i++) {\n const target = signalArg.targets[i];\n const holdDuration = target.eventable.options.holdDuration;\n\n if (holdDuration < minDuration) {\n minDuration = holdDuration;\n }\n }\n\n timer.duration = minDuration;\n timer.timeout = setTimeout(function () {\n fire({\n interaction,\n eventTarget,\n pointer: browser.isIE8? eventCopy : pointer,\n event: eventCopy,\n type: 'hold',\n });\n }, minDuration);\n});\n\nInteraction.signals.on('up', ({ interaction, pointer, event, eventTarget }) => {\n if (!interaction.pointerWasMoved) {\n fire({ interaction, eventTarget, pointer, event, type: 'tap' });\n }\n});\n\n['up', 'cancel'].forEach(function (signalName) {\n Interaction.signals.on(signalName, function ({ interaction, pointerIndex }) {\n if (interaction.holdTimers[pointerIndex]) {\n clearTimeout(interaction.holdTimers[pointerIndex].timeout);\n }\n });\n});\n\nfunction createSignalListener (type) {\n return function ({ interaction, pointer, event, eventTarget }) {\n fire({ interaction, eventTarget, pointer, event, type });\n };\n}\n\nfor (let i = 0; i < simpleSignals.length; i++) {\n Interaction.signals.on(simpleSignals[i], createSignalListener(simpleEvents[i]));\n}\n\nInteraction.signals.on('new', function (interaction) {\n interaction.prevTap = null; // the most recent tap event on this interaction\n interaction.tapTime = 0; // time of the most recent tap event\n interaction.holdTimers = []; // [{ duration, timeout }]\n});\n\ndefaults.pointerEvents = pointerEvents.defaults;\nmodule.exports = pointerEvents;\n","const pointerEvents = require('./base');\nconst Interaction = require('../Interaction');\n\npointerEvents.signals.on('new', onNew);\npointerEvents.signals.on('fired', onFired);\n\nfor (const signal of ['move', 'up', 'cancel', 'endall']) {\n Interaction.signals.on(signal, endHoldRepeat);\n}\n\nfunction onNew ({ pointerEvent }) {\n if (pointerEvent.type !== 'hold') { return; }\n\n pointerEvent.count = (pointerEvent.count || 0) + 1;\n}\n\nfunction onFired ({ interaction, pointerEvent, eventTarget, targets }) {\n if (pointerEvent.type !== 'hold' || !targets.length) { return; }\n\n // get the repeat interval from the first eventable\n const interval = targets[0].eventable.options.holdRepeatInterval;\n\n // don't repeat if the interval is 0 or less\n if (interval <= 0) { return; }\n\n // set a timeout to fire the holdrepeat event\n interaction.holdIntervalHandle = setTimeout(function () {\n pointerEvents.fire({\n interaction,\n eventTarget,\n type: 'hold',\n pointer: pointerEvent,\n event: pointerEvent,\n });\n }, interval);\n}\n\nfunction endHoldRepeat ({ interaction }) {\n // set the interaction's holdStopTime property\n // to stop further holdRepeat events\n if (interaction.holdIntervalHandle) {\n clearInterval(interaction.holdIntervalHandle);\n interaction.holdIntervalHandle = null;\n }\n}\n\n// don't repeat by default\npointerEvents.defaults.holdRepeatInterval = 0;\npointerEvents.types.push('holdrepeat');\n\nmodule.exports = {\n onNew,\n onFired,\n endHoldRepeat,\n};\n","const pointerEvents = require('./base');\nconst Interactable = require('../Interactable');\nconst browser = require('../utils/browser');\nconst is = require('../utils/is');\nconst domUtils = require('../utils/domUtils');\nconst scope = require('../scope');\nconst extend = require('../utils/extend');\nconst { merge } = require('../utils/arr');\n\npointerEvents.signals.on('collect-targets', function ({ targets, element, type, eventTarget }) {\n function collectSelectors (interactable, selector, context) {\n const els = browser.useMatchesSelectorPolyfill\n ? context.querySelectorAll(selector)\n : undefined;\n\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && is.element(element)\n && domUtils.matchesSelector(element, selector, els)\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n const interactable = scope.interactables.get(element);\n\n if (interactable) {\n const eventable = interactable.events;\n const options = eventable.options;\n\n if (eventable[type]\n && interactable.testIgnoreAllow(options, element, eventTarget)) {\n targets.push({\n element,\n eventable,\n props: { interactable },\n });\n }\n }\n\n scope.interactables.forEachSelector(collectSelectors, element);\n});\n\nInteractable.signals.on('new', function ({ interactable }) {\n interactable.events.getRect = function (element) {\n return interactable.getRect(element);\n };\n});\n\nInteractable.signals.on('set', function ({ interactable, options }) {\n extend(interactable.events.options, pointerEvents.defaults);\n extend(interactable.events.options, options);\n});\n\nmerge(Interactable.eventTypes, pointerEvents.types);\n\nInteractable.prototype.pointerEvents = function (options) {\n extend(this.events.options, options);\n\n return this;\n};\n\nconst __backCompatOption = Interactable.prototype._backCompatOption;\n\nInteractable.prototype._backCompatOption = function (optionName, newValue) {\n const ret = __backCompatOption.call(this, optionName, newValue);\n\n if (ret === this) {\n this.events.options[optionName] = newValue;\n }\n\n return ret;\n};\n\nInteractable.settingsMethods.push('pointerEvents');\n","const utils = require('./utils');\nconst events = require('./utils/events');\nconst signals = require('./utils/Signals').new();\n\nconst scope = {\n signals,\n events,\n utils,\n\n // main document\n document: require('./utils/domObjects').document,\n // all documents being listened to\n documents: [],\n\n addDocument: function (doc, win) {\n // do nothing if document is already known\n if (utils.contains(scope.documents, doc)) { return false; }\n\n win = win || scope.getWindow(doc);\n\n scope.documents.push(doc);\n events.documents.push(doc);\n\n // don't add an unload event for the main document\n // so that the page may be cached in browser history\n if (doc !== scope.document) {\n events.add(win, 'unload', scope.onWindowUnload);\n }\n\n signals.fire('add-document', { doc, win });\n },\n\n removeDocument: function (doc, win) {\n const index = utils.indexOf(scope.documents, doc);\n\n win = win || scope.getWindow(doc);\n\n events.remove(win, 'unload', scope.onWindowUnload);\n\n scope.documents.splice(index, 1);\n events.documents.splice(index, 1);\n\n signals.fire('remove-document', { win, doc });\n },\n\n onWindowUnload: function () {\n scope.removeDocument(this.document, this);\n },\n};\n\nmodule.exports = scope;\n","const { indexOf } = require('./arr');\n\nclass Signals {\n constructor () {\n this.listeners = {\n // signalName: [listeners],\n };\n }\n\n on (name, listener) {\n if (!this.listeners[name]) {\n this.listeners[name] = [listener];\n return;\n }\n\n this.listeners[name].push(listener);\n }\n\n off (name, listener) {\n if (!this.listeners[name]) { return; }\n\n const index = indexOf(this.listeners[name], listener);\n\n if (index !== -1) {\n this.listeners[name].splice(index, 1);\n }\n }\n\n fire (name, arg) {\n const targetListeners = this.listeners[name];\n\n if (!targetListeners) { return; }\n\n for (let i = 0; i < targetListeners.length; i++) {\n if (targetListeners[i](arg, name) === false) {\n return;\n }\n }\n }\n}\n\nSignals.new = function () {\n return new Signals();\n};\n\nmodule.exports = Signals;\n","function indexOf (array, target) {\n for (let i = 0, len = array.length; i < len; i++) {\n if (array[i] === target) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction contains (array, target) {\n return indexOf(array, target) !== -1;\n}\n\nfunction merge (target, source) {\n for (let i = 0; i < source.length; i++) {\n target.push(source[i]);\n }\n\n return target;\n}\n\nfunction filter (array, test) {\n const result = [];\n\n for (let i = 0; i < array.length; i++) {\n if (test(array[i])) {\n result.push(array[i]);\n }\n }\n\n return result;\n}\n\nmodule.exports = {\n indexOf,\n contains,\n merge,\n filter,\n};\n","const { window } = require('./window');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst Element = domObjects.Element;\nconst navigator = window.navigator;\n\nconst browser = {\n // Does the browser support touch input?\n supportsTouch: !!(('ontouchstart' in window) || is.function(window.DocumentTouch)\n && domObjects.document instanceof window.DocumentTouch),\n\n // Does the browser support PointerEvents\n supportsPointerEvent: !!domObjects.PointerEvent,\n\n isIE8: ('attachEvent' in window) && !('addEventListener' in window),\n\n // Opera Mobile must be handled differently\n isOperaMobile: (navigator.appName === 'Opera'\n && browser.supportsTouch\n && navigator.userAgent.match('Presto')),\n\n // scrolling doesn't change the result of getClientRects on iOS 7\n isIOS7: (/iP(hone|od|ad)/.test(navigator.platform)\n && /OS 7[^\\d]/.test(navigator.appVersion)),\n\n isIe9OrOlder: /MSIE (8|9)/.test(navigator.userAgent),\n\n // prefix matchesSelector\n prefixedMatchesSelector: 'matches' in Element.prototype\n ? 'matches': 'webkitMatchesSelector' in Element.prototype\n ? 'webkitMatchesSelector': 'mozMatchesSelector' in Element.prototype\n ? 'mozMatchesSelector': 'oMatchesSelector' in Element.prototype\n ? 'oMatchesSelector': 'msMatchesSelector',\n\n useMatchesSelectorPolyfill: false,\n\n pEventTypes: (domObjects.PointerEvent\n ? (domObjects.PointerEvent === window.MSPointerEvent\n ? {\n up: 'MSPointerUp',\n down: 'MSPointerDown',\n over: 'mouseover',\n out: 'mouseout',\n move: 'MSPointerMove',\n cancel: 'MSPointerCancel',\n }\n : {\n up: 'pointerup',\n down: 'pointerdown',\n over: 'pointerover',\n out: 'pointerout',\n move: 'pointermove',\n cancel: 'pointercancel',\n })\n : null),\n\n // because Webkit and Opera still use 'mousewheel' event type\n wheelEvent: 'onmousewheel' in domObjects.document? 'mousewheel': 'wheel',\n\n};\n\nbrowser.useMatchesSelectorPolyfill = !is.function(Element.prototype[browser.prefixedMatchesSelector]);\n\nmodule.exports = browser;\n","const domObjects = {};\nconst win = require('./window').window;\n\nfunction blank () {}\n\ndomObjects.document = win.document;\ndomObjects.DocumentFragment = win.DocumentFragment || blank;\ndomObjects.SVGElement = win.SVGElement || blank;\ndomObjects.SVGSVGElement = win.SVGSVGElement || blank;\ndomObjects.SVGElementInstance = win.SVGElementInstance || blank;\ndomObjects.Element = win.Element || blank;\ndomObjects.HTMLElement = win.HTMLElement || domObjects.Element;\n\ndomObjects.Event = win.Event;\ndomObjects.Touch = win.Touch || blank;\ndomObjects.PointerEvent = (win.PointerEvent || win.MSPointerEvent);\n\nmodule.exports = domObjects;\n","const win = require('./window');\nconst browser = require('./browser');\nconst is = require('./is');\nconst domObjects = require('./domObjects');\n\nconst domUtils = {\n nodeContains: function (parent, child) {\n while (child) {\n if (child === parent) {\n return true;\n }\n\n child = child.parentNode;\n }\n\n return false;\n },\n\n closest: function (element, selector) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) { return element; }\n\n element = domUtils.parentNode(element);\n }\n\n return null;\n },\n\n parentNode: function (node) {\n let parent = node.parentNode;\n\n if (is.docFrag(parent)) {\n // skip past #shado-root fragments\n while ((parent = parent.host) && is.docFrag(parent)) {\n continue;\n }\n\n return parent;\n }\n\n return parent;\n },\n\n // taken from http://tanalin.com/en/blog/2012/12/matches-selector-ie8/ and modified\n matchesSelectorPolyfill: browser.useMatchesSelectorPolyfill\n ? function (element, selector, elems) {\n elems = elems || element.parentNode.querySelectorAll(selector);\n\n for (let i = 0, len = elems.length; i < len; i++) {\n if (elems[i] === element) {\n return true;\n }\n }\n\n return false;\n }\n : null,\n\n matchesSelector: function (element, selector, nodeList) {\n if (browser.useMatchesSelectorPolyfill) {\n return domUtils.matchesSelectorPolyfill(element, selector, nodeList);\n }\n\n // remove /deep/ from selectors if shadowDOM polyfill is used\n if (win.window !== win.realWindow) {\n selector = selector.replace(/\\/deep\\//g, ' ');\n }\n\n return element[browser.prefixedMatchesSelector](selector);\n },\n\n // Test for the element that's \"above\" all other qualifiers\n indexOfDeepestElement: function (elements) {\n let deepestZoneParents = [];\n let dropzoneParents = [];\n let dropzone;\n let deepestZone = elements[0];\n let index = deepestZone? 0: -1;\n let parent;\n let child;\n let i;\n let n;\n\n for (i = 1; i < elements.length; i++) {\n dropzone = elements[i];\n\n // an element might belong to multiple selector dropzones\n if (!dropzone || dropzone === deepestZone) {\n continue;\n }\n\n if (!deepestZone) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n // check if the deepest or current are document.documentElement or document.rootElement\n // - if the current dropzone is, do nothing and continue\n if (dropzone.parentNode === dropzone.ownerDocument) {\n continue;\n }\n // - if deepest is, update with the current dropzone and continue to next\n else if (deepestZone.parentNode === dropzone.ownerDocument) {\n deepestZone = dropzone;\n index = i;\n continue;\n }\n\n if (!deepestZoneParents.length) {\n parent = deepestZone;\n while (parent.parentNode && parent.parentNode !== parent.ownerDocument) {\n deepestZoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n }\n\n // if this element is an svg element and the current deepest is\n // an HTMLElement\n if (deepestZone instanceof domObjects.HTMLElement\n && dropzone instanceof domObjects.SVGElement\n && !(dropzone instanceof domObjects.SVGSVGElement)) {\n\n if (dropzone === deepestZone.parentNode) {\n continue;\n }\n\n parent = dropzone.ownerSVGElement;\n }\n else {\n parent = dropzone;\n }\n\n dropzoneParents = [];\n\n while (parent.parentNode !== parent.ownerDocument) {\n dropzoneParents.unshift(parent);\n parent = parent.parentNode;\n }\n\n n = 0;\n\n // get (position of last common ancestor) + 1\n while (dropzoneParents[n] && dropzoneParents[n] === deepestZoneParents[n]) {\n n++;\n }\n\n const parents = [\n dropzoneParents[n - 1],\n dropzoneParents[n],\n deepestZoneParents[n],\n ];\n\n child = parents[0].lastChild;\n\n while (child) {\n if (child === parents[1]) {\n deepestZone = dropzone;\n index = i;\n deepestZoneParents = [];\n\n break;\n }\n else if (child === parents[2]) {\n break;\n }\n\n child = child.previousSibling;\n }\n }\n\n return index;\n },\n\n matchesUpTo: function (element, selector, limit) {\n while (is.element(element)) {\n if (domUtils.matchesSelector(element, selector)) {\n return true;\n }\n\n element = domUtils.parentNode(element);\n\n if (element === limit) {\n return domUtils.matchesSelector(element, selector);\n }\n }\n\n return false;\n },\n\n getActualElement: function (element) {\n return (element instanceof domObjects.SVGElementInstance\n ? element.correspondingUseElement\n : element);\n },\n\n getScrollXY: function (relevantWindow) {\n relevantWindow = relevantWindow || win.window;\n return {\n x: relevantWindow.scrollX || relevantWindow.document.documentElement.scrollLeft,\n y: relevantWindow.scrollY || relevantWindow.document.documentElement.scrollTop,\n };\n },\n\n getElementClientRect: function (element) {\n const clientRect = (element instanceof domObjects.SVGElement\n ? element.getBoundingClientRect()\n : element.getClientRects()[0]);\n\n return clientRect && {\n left : clientRect.left,\n right : clientRect.right,\n top : clientRect.top,\n bottom: clientRect.bottom,\n width : clientRect.width || clientRect.right - clientRect.left,\n height: clientRect.height || clientRect.bottom - clientRect.top,\n };\n },\n\n getElementRect: function (element) {\n const clientRect = domUtils.getElementClientRect(element);\n\n if (!browser.isIOS7 && clientRect) {\n const scroll = domUtils.getScrollXY(win.getWindow(element));\n\n clientRect.left += scroll.x;\n clientRect.right += scroll.x;\n clientRect.top += scroll.y;\n clientRect.bottom += scroll.y;\n }\n\n return clientRect;\n },\n\n getPath: function (element) {\n const path = [];\n\n while (element) {\n path.push(element);\n element = domUtils.parentNode(element);\n }\n\n return path;\n },\n\n trySelector: value => {\n if (!is.string(value)) { return false; }\n\n // an exception will be raised if it is invalid\n domObjects.document.querySelector(value);\n return true;\n },\n};\n\nmodule.exports = domUtils;\n","const is = require('./is');\nconst domUtils = require('./domUtils');\nconst pExtend = require('./pointerExtend');\n\nconst { window, getWindow } = require('./window');\nconst { indexOf, contains } = require('./arr');\n\nconst useAttachEvent = ('attachEvent' in window) && !('addEventListener' in window);\nconst addEvent = useAttachEvent? 'attachEvent': 'addEventListener';\nconst removeEvent = useAttachEvent? 'detachEvent': 'removeEventListener';\nconst on = useAttachEvent? 'on': '';\n\nconst elements = [];\nconst targets = [];\nconst attachedListeners = [];\n\n// {\n// type: {\n// selectors: ['selector', ...],\n// contexts : [document, ...],\n// listeners: [[listener, capture, passive], ...]\n// }\n// }\nconst delegatedEvents = {};\n\nconst documents = [];\n\nconst supportsOptions = !useAttachEvent && (() => {\n let supported = false;\n\n window.document.createElement('div').addEventListener('test', null, {\n get capture () { supported = true; },\n });\n\n return supported;\n})();\n\nfunction add (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n let elementIndex = indexOf(elements, element);\n let target = targets[elementIndex];\n\n if (!target) {\n target = {\n events: {},\n typeCount: 0,\n };\n\n elementIndex = elements.push(element) - 1;\n targets.push(target);\n\n attachedListeners.push(useAttachEvent\n ? {\n supplied: [],\n wrapped : [],\n useCount: [],\n }\n : null);\n }\n\n if (!target.events[type]) {\n target.events[type] = [];\n target.typeCount++;\n }\n\n if (!contains(target.events[type], listener)) {\n let ret;\n\n if (useAttachEvent) {\n const { supplied, wrapped, useCount } = attachedListeners[elementIndex];\n const listenerIndex = indexOf(supplied, listener);\n\n const wrappedListener = wrapped[listenerIndex] || function (event) {\n if (!event.immediatePropagationStopped) {\n event.target = event.srcElement;\n event.currentTarget = element;\n\n event.preventDefault = event.preventDefault || preventDef;\n event.stopPropagation = event.stopPropagation || stopProp;\n event.stopImmediatePropagation = event.stopImmediatePropagation || stopImmProp;\n\n if (/mouse|click/.test(event.type)) {\n event.pageX = event.clientX + getWindow(element).document.documentElement.scrollLeft;\n event.pageY = event.clientY + getWindow(element).document.documentElement.scrollTop;\n }\n\n listener(event);\n }\n };\n\n ret = element[addEvent](on + type, wrappedListener, !!options.capture);\n\n if (listenerIndex === -1) {\n supplied.push(listener);\n wrapped.push(wrappedListener);\n useCount.push(1);\n }\n else {\n useCount[listenerIndex]++;\n }\n }\n else {\n ret = element[addEvent](type, listener, supportsOptions? options : !!options.capture);\n }\n target.events[type].push(listener);\n\n return ret;\n }\n}\n\nfunction remove (element, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const elementIndex = indexOf(elements, element);\n const target = targets[elementIndex];\n\n if (!target || !target.events) {\n return;\n }\n\n let wrappedListener = listener;\n let listeners;\n let listenerIndex;\n\n if (useAttachEvent) {\n listeners = attachedListeners[elementIndex];\n listenerIndex = indexOf(listeners.supplied, listener);\n wrappedListener = listeners.wrapped[listenerIndex];\n }\n\n if (type === 'all') {\n for (type in target.events) {\n if (target.events.hasOwnProperty(type)) {\n remove(element, type, 'all');\n }\n }\n return;\n }\n\n if (target.events[type]) {\n const len = target.events[type].length;\n\n if (listener === 'all') {\n for (let i = 0; i < len; i++) {\n remove(element, type, target.events[type][i], options);\n }\n return;\n }\n else {\n for (let i = 0; i < len; i++) {\n if (target.events[type][i] === listener) {\n element[removeEvent](on + type, wrappedListener, supportsOptions? options : !!options.capture);\n target.events[type].splice(i, 1);\n\n if (useAttachEvent && listeners) {\n listeners.useCount[listenerIndex]--;\n if (listeners.useCount[listenerIndex] === 0) {\n listeners.supplied.splice(listenerIndex, 1);\n listeners.wrapped.splice(listenerIndex, 1);\n listeners.useCount.splice(listenerIndex, 1);\n }\n }\n\n break;\n }\n }\n }\n\n if (target.events[type] && target.events[type].length === 0) {\n target.events[type] = null;\n target.typeCount--;\n }\n }\n\n if (!target.typeCount) {\n targets.splice(elementIndex, 1);\n elements.splice(elementIndex, 1);\n attachedListeners.splice(elementIndex, 1);\n }\n}\n\nfunction addDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n if (!delegatedEvents[type]) {\n delegatedEvents[type] = {\n selectors: [],\n contexts : [],\n listeners: [],\n };\n\n // add delegate listener functions\n for (let i = 0; i < documents.length; i++) {\n add(documents[i], type, delegateListener);\n add(documents[i], type, delegateUseCapture, true);\n }\n }\n\n const delegated = delegatedEvents[type];\n let index;\n\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n break;\n }\n }\n\n if (index === -1) {\n index = delegated.selectors.length;\n\n delegated.selectors.push(selector);\n delegated.contexts .push(context);\n delegated.listeners.push([]);\n }\n\n // keep listener and capture and passive flags\n delegated.listeners[index].push([listener, !!options.capture, options.passive]);\n}\n\nfunction removeDelegate (selector, context, type, listener, optionalArg) {\n const options = getOptions(optionalArg);\n const delegated = delegatedEvents[type];\n let matchFound = false;\n let index;\n\n if (!delegated) { return; }\n\n // count from last index of delegated to 0\n for (index = delegated.selectors.length - 1; index >= 0; index--) {\n // look for matching selector and context Node\n if (delegated.selectors[index] === selector\n && delegated.contexts[index] === context) {\n\n const listeners = delegated.listeners[index];\n\n // each item of the listeners array is an array: [function, capture, passive]\n for (let i = listeners.length - 1; i >= 0; i--) {\n const [fn, capture, passive] = listeners[i];\n\n // check if the listener functions and capture and passive flags match\n if (fn === listener && capture === !!options.capture && passive === options.passive) {\n // remove the listener from the array of listeners\n listeners.splice(i, 1);\n\n // if all listeners for this interactable have been removed\n // remove the interactable from the delegated arrays\n if (!listeners.length) {\n delegated.selectors.splice(index, 1);\n delegated.contexts .splice(index, 1);\n delegated.listeners.splice(index, 1);\n\n // remove delegate function from context\n remove(context, type, delegateListener);\n remove(context, type, delegateUseCapture, true);\n\n // remove the arrays if they are empty\n if (!delegated.selectors.length) {\n delegatedEvents[type] = null;\n }\n }\n\n // only remove one listener\n matchFound = true;\n break;\n }\n }\n\n if (matchFound) { break; }\n }\n }\n}\n\n// bound to the interactable context when a DOM event\n// listener is added to a selector interactable\nfunction delegateListener (event, optionalArg) {\n const options = getOptions(optionalArg);\n const fakeEvent = {};\n const delegated = delegatedEvents[event.type];\n const eventTarget = (domUtils.getActualElement(event.path\n ? event.path[0]\n : event.target));\n let element = eventTarget;\n\n // duplicate the event so that currentTarget can be changed\n pExtend(fakeEvent, event);\n\n fakeEvent.originalEvent = event;\n fakeEvent.preventDefault = preventOriginalDefault;\n\n // climb up document tree looking for selector matches\n while (is.element(element)) {\n for (let i = 0; i < delegated.selectors.length; i++) {\n const selector = delegated.selectors[i];\n const context = delegated.contexts[i];\n\n if (domUtils.matchesSelector(element, selector)\n && domUtils.nodeContains(context, eventTarget)\n && domUtils.nodeContains(context, element)) {\n\n const listeners = delegated.listeners[i];\n\n fakeEvent.currentTarget = element;\n\n for (let j = 0; j < listeners.length; j++) {\n const [fn, capture, passive] = listeners[j];\n\n if (capture === !!options.capture && passive === options.passive) {\n fn(fakeEvent);\n }\n }\n }\n }\n\n element = domUtils.parentNode(element);\n }\n}\n\nfunction delegateUseCapture (event) {\n return delegateListener.call(this, event, true);\n}\n\nfunction preventDef () {\n this.returnValue = false;\n}\n\nfunction preventOriginalDefault () {\n this.originalEvent.preventDefault();\n}\n\nfunction stopProp () {\n this.cancelBubble = true;\n}\n\nfunction stopImmProp () {\n this.cancelBubble = true;\n this.immediatePropagationStopped = true;\n}\n\nfunction getOptions (param) {\n return is.object(param)? param : { capture: param };\n}\n\nmodule.exports = {\n add,\n remove,\n\n addDelegate,\n removeDelegate,\n\n delegateListener,\n delegateUseCapture,\n delegatedEvents,\n documents,\n\n useAttachEvent,\n supportsOptions,\n\n _elements: elements,\n _targets: targets,\n _attachedListeners: attachedListeners,\n};\n","module.exports = function extend (dest, source) {\n for (const prop in source) {\n dest[prop] = source[prop];\n }\n return dest;\n};\n","const {\n resolveRectLike,\n rectToXY,\n} = require('./rect');\n\nmodule.exports = function (target, element, action) {\n const actionOptions = target.options[action];\n const actionOrigin = actionOptions && actionOptions.origin;\n const origin = actionOrigin || target.options.origin;\n\n const originRect = resolveRectLike(origin, target, element, [target && element]);\n\n return rectToXY(originRect) || { x: 0, y: 0 };\n};\n","module.exports = (x, y) => Math.sqrt(x * x + y * y);\n","const extend = require('./extend');\nconst win = require('./window');\n\nconst utils = {\n warnOnce: function (method, message) {\n let warned = false;\n\n return function () {\n if (!warned) {\n win.window.console.warn(message);\n warned = true;\n }\n\n return method.apply(this, arguments);\n };\n },\n\n // http://stackoverflow.com/a/5634528/2280888\n _getQBezierValue: function (t, p1, p2, p3) {\n const iT = 1 - t;\n return iT * iT * p1 + 2 * iT * t * p2 + t * t * p3;\n },\n\n getQuadraticCurvePoint: function (startX, startY, cpX, cpY, endX, endY, position) {\n return {\n x: utils._getQBezierValue(position, startX, cpX, endX),\n y: utils._getQBezierValue(position, startY, cpY, endY),\n };\n },\n\n // http://gizma.com/easing/\n easeOutQuad: function (t, b, c, d) {\n t /= d;\n return -c * t*(t-2) + b;\n },\n\n copyAction: function (dest, src) {\n dest.name = src.name;\n dest.axis = src.axis;\n dest.edges = src.edges;\n\n return dest;\n },\n\n is : require('./is'),\n extend : extend,\n hypot : require('./hypot'),\n getOriginXY: require('./getOriginXY'),\n};\n\nextend(utils, require('./arr'));\nextend(utils, require('./domUtils'));\nextend(utils, require('./pointerUtils'));\nextend(utils, require('./rect'));\n\nmodule.exports = utils;\n","const scope = require('../scope');\nconst utils = require('./index');\n\nconst finder = {\n methodOrder: [ 'simulationResume', 'mouseOrPen', 'hasPointer', 'idle' ],\n\n search: function (pointer, eventType, eventTarget) {\n const pointerType = utils.getPointerType(pointer);\n const pointerId = utils.getPointerId(pointer);\n const details = { pointer, pointerId, pointerType, eventType, eventTarget };\n\n for (const method of finder.methodOrder) {\n const interaction = finder[method](details);\n\n if (interaction) {\n return interaction;\n }\n }\n },\n\n // try to resume simulation with a new pointer\n simulationResume: function ({ pointerType, eventType, eventTarget }) {\n if (!/down|start/i.test(eventType)) {\n return null;\n }\n\n for (const interaction of scope.interactions) {\n let element = eventTarget;\n\n if (interaction.simulation && interaction.simulation.allowResume\n && (interaction.pointerType === pointerType)) {\n while (element) {\n // if the element is the interaction element\n if (element === interaction.element) {\n return interaction;\n }\n element = utils.parentNode(element);\n }\n }\n }\n\n return null;\n },\n\n // if it's a mouse or pen interaction\n mouseOrPen: function ({ pointerId, pointerType, eventType }) {\n if (pointerType !== 'mouse' && pointerType !== 'pen') {\n return null;\n }\n\n let firstNonActive;\n\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType) {\n // if it's a down event, skip interactions with running simulations\n if (interaction.simulation && !utils.contains(interaction.pointerIds, pointerId)) { continue; }\n\n // if the interaction is active, return it immediately\n if (interaction.interacting()) {\n return interaction;\n }\n // otherwise save it and look for another active interaction\n else if (!firstNonActive) {\n firstNonActive = interaction;\n }\n }\n }\n\n // if no active mouse interaction was found use the first inactive mouse\n // interaction\n if (firstNonActive) {\n return firstNonActive;\n }\n\n // find any mouse or pen interaction.\n // ignore the interaction if the eventType is a *down, and a simulation\n // is active\n for (const interaction of scope.interactions) {\n if (interaction.pointerType === pointerType && !(/down/i.test(eventType) && interaction.simulation)) {\n return interaction;\n }\n }\n\n return null;\n },\n\n // get interaction that has this pointer\n hasPointer: function ({ pointerId }) {\n for (const interaction of scope.interactions) {\n if (utils.contains(interaction.pointerIds, pointerId)) {\n return interaction;\n }\n }\n },\n\n // get first idle interaction with a matching pointerType\n idle: function ({ pointerType }) {\n for (const interaction of scope.interactions) {\n // if there's already a pointer held down\n if (interaction.pointerIds.length === 1) {\n const target = interaction.target;\n // don't add this pointer if there is a target interactable and it\n // isn't gesturable\n if (target && !target.options.gesture.enabled) {\n continue;\n }\n }\n // maximum of 2 pointers per interaction\n else if (interaction.pointerIds.length >= 2) {\n continue;\n }\n\n if (!interaction.interacting() && (pointerType === interaction.pointerType)) {\n return interaction;\n }\n }\n\n return null;\n },\n};\n\nmodule.exports = finder;\n","const win = require('./window');\nconst isWindow = require('./isWindow');\n\nconst is = {\n array : () => {},\n\n window : thing => thing === win.window || isWindow(thing),\n\n docFrag : thing => is.object(thing) && thing.nodeType === 11,\n\n object : thing => !!thing && (typeof thing === 'object'),\n\n function: thing => typeof thing === 'function',\n\n number : thing => typeof thing === 'number' ,\n\n bool : thing => typeof thing === 'boolean' ,\n\n string : thing => typeof thing === 'string' ,\n\n element: thing => {\n if (!thing || (typeof thing !== 'object')) { return false; }\n\n const _window = win.getWindow(thing) || win.window;\n\n return (/object|function/.test(typeof _window.Element)\n ? thing instanceof _window.Element //DOM2\n : thing.nodeType === 1 && typeof thing.nodeName === 'string');\n },\n};\n\nis.array = thing => (is.object(thing)\n && (typeof thing.length !== 'undefined')\n && is.function(thing.splice));\n\nmodule.exports = is;\n","module.exports = (thing) => !!(thing && thing.Window) && (thing instanceof thing.Window);\n","function pointerExtend (dest, source) {\n for (const prop in source) {\n const prefixedPropREs = module.exports.prefixedPropREs;\n let deprecated = false;\n\n // skip deprecated prefixed properties\n for (const vendor in prefixedPropREs) {\n if (prop.indexOf(vendor) === 0 && prefixedPropREs[vendor].test(prop)) {\n deprecated = true;\n break;\n }\n }\n\n if (!deprecated && typeof source[prop] !== 'function') {\n dest[prop] = source[prop];\n }\n }\n return dest;\n}\n\npointerExtend.prefixedPropREs = {\n webkit: /(Movement[XY]|Radius[XY]|RotationAngle|Force)$/,\n};\n\nmodule.exports = pointerExtend;\n","const hypot = require('./hypot');\nconst browser = require('./browser');\nconst dom = require('./domObjects');\nconst domUtils = require('./domUtils');\nconst domObjects = require('./domObjects');\nconst is = require('./is');\nconst pointerExtend = require('./pointerExtend');\n\nconst pointerUtils = {\n copyCoords: function (dest, src) {\n dest.page = dest.page || {};\n dest.page.x = src.page.x;\n dest.page.y = src.page.y;\n\n dest.client = dest.client || {};\n dest.client.x = src.client.x;\n dest.client.y = src.client.y;\n\n dest.timeStamp = src.timeStamp;\n },\n\n setCoordDeltas: function (targetObj, prev, cur) {\n targetObj.page.x = cur.page.x - prev.page.x;\n targetObj.page.y = cur.page.y - prev.page.y;\n targetObj.client.x = cur.client.x - prev.client.x;\n targetObj.client.y = cur.client.y - prev.client.y;\n targetObj.timeStamp = cur.timeStamp - prev.timeStamp;\n\n // set pointer velocity\n const dt = Math.max(targetObj.timeStamp / 1000, 0.001);\n\n targetObj.page.speed = hypot(targetObj.page.x, targetObj.page.y) / dt;\n targetObj.page.vx = targetObj.page.x / dt;\n targetObj.page.vy = targetObj.page.y / dt;\n\n targetObj.client.speed = hypot(targetObj.client.x, targetObj.page.y) / dt;\n targetObj.client.vx = targetObj.client.x / dt;\n targetObj.client.vy = targetObj.client.y / dt;\n },\n\n isNativePointer: function (pointer) {\n return (pointer instanceof dom.Event || pointer instanceof dom.Touch);\n },\n\n // Get specified X/Y coords for mouse or event.touches[0]\n getXY: function (type, pointer, xy) {\n xy = xy || {};\n type = type || 'page';\n\n xy.x = pointer[type + 'X'];\n xy.y = pointer[type + 'Y'];\n\n return xy;\n },\n\n getPageXY: function (pointer, page) {\n page = page || {};\n\n // Opera Mobile handles the viewport and scrolling oddly\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n pointerUtils.getXY('screen', pointer, page);\n\n page.x += window.scrollX;\n page.y += window.scrollY;\n }\n else {\n pointerUtils.getXY('page', pointer, page);\n }\n\n return page;\n },\n\n getClientXY: function (pointer, client) {\n client = client || {};\n\n if (browser.isOperaMobile && pointerUtils.isNativePointer(pointer)) {\n // Opera Mobile handles the viewport and scrolling oddly\n pointerUtils.getXY('screen', pointer, client);\n }\n else {\n pointerUtils.getXY('client', pointer, client);\n }\n\n return client;\n },\n\n getPointerId: function (pointer) {\n return is.number(pointer.pointerId)? pointer.pointerId : pointer.identifier;\n },\n\n setCoords: function (targetObj, pointers, timeStamp) {\n const pointer = (pointers.length > 1\n ? pointerUtils.pointerAverage(pointers)\n : pointers[0]);\n\n const tmpXY = {};\n\n pointerUtils.getPageXY(pointer, tmpXY);\n targetObj.page.x = tmpXY.x;\n targetObj.page.y = tmpXY.y;\n\n pointerUtils.getClientXY(pointer, tmpXY);\n targetObj.client.x = tmpXY.x;\n targetObj.client.y = tmpXY.y;\n\n targetObj.timeStamp = is.number(timeStamp) ? timeStamp :new Date().getTime();\n },\n\n pointerExtend: pointerExtend,\n\n getTouchPair: function (event) {\n const touches = [];\n\n // array of touches is supplied\n if (is.array(event)) {\n touches[0] = event[0];\n touches[1] = event[1];\n }\n // an event\n else {\n if (event.type === 'touchend') {\n if (event.touches.length === 1) {\n touches[0] = event.touches[0];\n touches[1] = event.changedTouches[0];\n }\n else if (event.touches.length === 0) {\n touches[0] = event.changedTouches[0];\n touches[1] = event.changedTouches[1];\n }\n }\n else {\n touches[0] = event.touches[0];\n touches[1] = event.touches[1];\n }\n }\n\n return touches;\n },\n\n pointerAverage: function (pointers) {\n const average = {\n pageX : 0,\n pageY : 0,\n clientX: 0,\n clientY: 0,\n screenX: 0,\n screenY: 0,\n };\n\n for (const pointer of pointers) {\n for (const prop in average) {\n average[prop] += pointer[prop];\n }\n }\n for (const prop in average) {\n average[prop] /= pointers.length;\n }\n\n return average;\n },\n\n touchBBox: function (event) {\n if (!event.length && !(event.touches && event.touches.length > 1)) {\n return;\n }\n\n const touches = pointerUtils.getTouchPair(event);\n const minX = Math.min(touches[0].pageX, touches[1].pageX);\n const minY = Math.min(touches[0].pageY, touches[1].pageY);\n const maxX = Math.max(touches[0].pageX, touches[1].pageX);\n const maxY = Math.max(touches[0].pageY, touches[1].pageY);\n\n return {\n x: minX,\n y: minY,\n left: minX,\n top: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n },\n\n touchDistance: function (event, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n\n\n const dx = touches[0][sourceX] - touches[1][sourceX];\n const dy = touches[0][sourceY] - touches[1][sourceY];\n\n return hypot(dx, dy);\n },\n\n touchAngle: function (event, prevAngle, deltaSource) {\n const sourceX = deltaSource + 'X';\n const sourceY = deltaSource + 'Y';\n const touches = pointerUtils.getTouchPair(event);\n const dx = touches[1][sourceX] - touches[0][sourceX];\n const dy = touches[1][sourceY] - touches[0][sourceY];\n const angle = 180 * Math.atan2(dy , dx) / Math.PI;\n\n return angle;\n },\n\n getPointerType: function (pointer) {\n return is.string(pointer.pointerType)\n ? pointer.pointerType\n : is.number(pointer.pointerType)\n ? [undefined, undefined,'touch', 'pen', 'mouse'][pointer.pointerType]\n // if the PointerEvent API isn't available, then the \"pointer\" must\n // be either a MouseEvent, TouchEvent, or Touch object\n : /touch/.test(pointer.type) || pointer instanceof domObjects.Touch\n ? 'touch'\n : 'mouse';\n },\n\n // [ event.target, event.currentTarget ]\n getEventTargets: function (event) {\n return [\n domUtils.getActualElement(event.path ? event.path[0] : event.target),\n domUtils.getActualElement(event.currentTarget),\n ];\n },\n};\n\nmodule.exports = pointerUtils;\n","const { window } = require('./window');\n\nconst vendors = ['ms', 'moz', 'webkit', 'o'];\nlet lastTime = 0;\nlet request;\nlet cancel;\n\nfor (let x = 0; x < vendors.length && !window.requestAnimationFrame; x++) {\n request = window[vendors[x] + 'RequestAnimationFrame'];\n cancel = window[vendors[x] +'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n}\n\nif (!request) {\n request = function (callback) {\n const currTime = new Date().getTime();\n const timeToCall = Math.max(0, 16 - (currTime - lastTime));\n const id = setTimeout(function () { callback(currTime + timeToCall); },\n timeToCall);\n\n lastTime = currTime + timeToCall;\n return id;\n };\n}\n\nif (!cancel) {\n cancel = function (id) {\n clearTimeout(id);\n };\n}\n\nmodule.exports = {\n request,\n cancel,\n};\n","const extend = require('./extend');\nconst is = require('./is');\nconst {\n closest,\n parentNode,\n getElementRect,\n} = require('./domUtils');\n\nconst rectUtils = {\n getStringOptionResult: function (value, interactable, element) {\n if (!is.string(value)) {\n return null;\n }\n\n if (value === 'parent') {\n value = parentNode(element);\n }\n else if (value === 'self') {\n value = interactable.getRect(element);\n }\n else {\n value = closest(element, value);\n }\n\n return value;\n },\n\n resolveRectLike: function (value, interactable, element, functionArgs) {\n value = rectUtils.getStringOptionResult(value, interactable, element) || value;\n\n if (is.function(value)) {\n value = value.apply(null, functionArgs);\n }\n\n if (is.element(value)) {\n value = getElementRect(value);\n }\n\n return value;\n },\n\n rectToXY: function (rect) {\n return rect && {\n x: 'x' in rect ? rect.x : rect.left,\n y: 'y' in rect ? rect.y : rect.top,\n };\n },\n\n xywhToTlbr: function (rect) {\n if (rect && !('left' in rect && 'top' in rect)) {\n rect = extend({}, rect);\n\n rect.left = rect.x || 0;\n rect.top = rect.y || 0;\n rect.right = rect.right || (rect.left + rect.width);\n rect.bottom = rect.bottom || (rect.top + rect.height);\n }\n\n return rect;\n },\n\n tlbrToXywh: function (rect) {\n if (rect && !('x' in rect && 'y' in rect)) {\n rect = extend({}, rect);\n\n rect.x = rect.left || 0;\n rect.top = rect.top || 0;\n rect.width = rect.width || (rect.right - rect.x);\n rect.height = rect.height || (rect.bottom - rect.y);\n }\n\n return rect;\n },\n};\n\nmodule.exports = rectUtils;\n","const win = module.exports;\nconst isWindow = require('./isWindow');\n\nfunction init (window) {\n // get wrapped window if using Shadow DOM polyfill\n\n win.realWindow = window;\n\n // create a TextNode\n const el = window.document.createTextNode('');\n\n // check if it's wrapped by a polyfill\n if (el.ownerDocument !== window.document\n && typeof window.wrap === 'function'\n && window.wrap(el) === el) {\n // use wrapped window\n window = window.wrap(window);\n }\n\n win.window = window;\n}\n\nif (typeof window === 'undefined') {\n win.window = undefined;\n win.realWindow = undefined;\n}\nelse {\n init(window);\n}\n\nwin.getWindow = function getWindow (node) {\n if (isWindow(node)) {\n return node;\n }\n\n const rootNode = (node.ownerDocument || node);\n\n return rootNode.defaultView || rootNode.parentWindow || win.window;\n};\n\nwin.init = init;\n"]} \ No newline at end of file diff --git a/package.json b/package.json index 76f3e9969..f39704e99 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "interactjs", - "version": "1.3.0-alpha.3+sha.9595c40", + "version": "1.3.0-alpha.4+sha.7970416", "repository": { "type": "git", "url": "https://github.com/taye/interact.js.git"